   X" T" N" {"files":{".env":{"size":481,"integrity":{"algorithm":"SHA256","hash":"588dbbba77ac3155c2b0f416e73ec217cea08d252d7a154c432160a29b565805","blockSize":4194304,"blocks":["588dbbba77ac3155c2b0f416e73ec217cea08d252d7a154c432160a29b565805"]},"offset":"0"},".env.example":{"size":464,"integrity":{"algorithm":"SHA256","hash":"b07d65e4495dc972a3da7898d075bc85a0a8cadd23e95f8aca5aba3e73975892","blockSize":4194304,"blocks":["b07d65e4495dc972a3da7898d075bc85a0a8cadd23e95f8aca5aba3e73975892"]},"offset":"481"},"package.json":{"size":1112,"integrity":{"algorithm":"SHA256","hash":"fdf260c8b83e7ccf8bee6b393c013a013467cf1344e3134b6da042dab1f9d353","blockSize":4194304,"blocks":["fdf260c8b83e7ccf8bee6b393c013a013467cf1344e3134b6da042dab1f9d353"]},"offset":"945"},"public":{"files":{"Main-logo-full-color.png":{"size":108409,"integrity":{"algorithm":"SHA256","hash":"1fc91447c2f2329f8a1fbfaa1a058d689b09d53a82c9863d85889afc1e25138c","blockSize":4194304,"blocks":["1fc91447c2f2329f8a1fbfaa1a058d689b09d53a82c9863d85889afc1e25138c"]},"offset":"2057"},"env.js":{"size":541,"integrity":{"algorithm":"SHA256","hash":"e45b87899f47d146c18044a757a017066541bdd092ad514092cd78ab9e560857","blockSize":4194304,"blocks":["e45b87899f47d146c18044a757a017066541bdd092ad514092cd78ab9e560857"]},"offset":"110466"},"icon.icns":{"size":120031,"integrity":{"algorithm":"SHA256","hash":"93c8c36eb698794d242e011523d5690b14a5bd263936f66ecba38610d9a1f147","blockSize":4194304,"blocks":["93c8c36eb698794d242e011523d5690b14a5bd263936f66ecba38610d9a1f147"]},"offset":"111007"},"icon.ico":{"size":361102,"integrity":{"algorithm":"SHA256","hash":"f0851b89a7dcc3a7742e8bb78b4526013d526945977daa30105dfc649fa36cc7","blockSize":4194304,"blocks":["f0851b89a7dcc3a7742e8bb78b4526013d526945977daa30105dfc649fa36cc7"]},"offset":"231038"},"icon.png":{"size":72820,"integrity":{"algorithm":"SHA256","hash":"2b53bb37a064f4629f4a8b51d79a53e8de18e683ab39a8e6af80cb3f4d25da64","blockSize":4194304,"blocks":["2b53bb37a064f4629f4a8b51d79a53e8de18e683ab39a8e6af80cb3f4d25da64"]},"offset":"592140"},"index.html":{"size":2430,"integrity":{"algorithm":"SHA256","hash":"7c29840a742633c7239df2dcd26364dd296b1191834fc43173c3c3f8036ed0a5","blockSize":4194304,"blocks":["7c29840a742633c7239df2dcd26364dd296b1191834fc43173c3c3f8036ed0a5"]},"offset":"664960"},"manifest.json":{"size":486,"integrity":{"algorithm":"SHA256","hash":"bde4d57781d504e2b77d1b5accb2232a21f082d5b301cf233775eec5e2d50181","blockSize":4194304,"blocks":["bde4d57781d504e2b77d1b5accb2232a21f082d5b301cf233775eec5e2d50181"]},"offset":"667390"},"pattern.svg":{"size":5148,"integrity":{"algorithm":"SHA256","hash":"8bef3564af12961e65353116fda8d1031532547f6530d5052ce3bc3c7b70950f","blockSize":4194304,"blocks":["8bef3564af12961e65353116fda8d1031532547f6530d5052ce3bc3c7b70950f"]},"offset":"667876"},"robots.txt":{"size":70,"integrity":{"algorithm":"SHA256","hash":"e5ab0d231eeb01b4a982d1c79a6729cac9797ad15a69247e4f28ba6afc149b4c","blockSize":4194304,"blocks":["e5ab0d231eeb01b4a982d1c79a6729cac9797ad15a69247e4f28ba6afc149b4c"]},"offset":"673024"}}},"build-electron":{"files":{"api.js":{"size":463984,"integrity":{"algorithm":"SHA256","hash":"da0d10b466cca08f04f3e3f04dc5a163143a9f40dddd956e1175e41850d39be7","blockSize":4194304,"blocks":["da0d10b466cca08f04f3e3f04dc5a163143a9f40dddd956e1175e41850d39be7"]},"offset":"673094"},"main.js":{"size":44584,"integrity":{"algorithm":"SHA256","hash":"9de8ec71037452c86de73784a011e582b03d1c28783164daad490e6c05b00794","blockSize":4194304,"blocks":["9de8ec71037452c86de73784a011e582b03d1c28783164daad490e6c05b00794"]},"offset":"1137078"},"preload.js":{"size":622,"integrity":{"algorithm":"SHA256","hash":"9c0629a8f28074a4d1b0071558964d678cac43faf1222f8ff5fb95d8d2ccc5d9","blockSize":4194304,"blocks":["9c0629a8f28074a4d1b0071558964d678cac43faf1222f8ff5fb95d8d2ccc5d9"]},"offset":"1181662"},"prompt.js":{"size":419085,"integrity":{"algorithm":"SHA256","hash":"800e951e5a4cb8a8cd5cc8f770c8464783fcde41430100aebc32373d1ab56ffa","blockSize":4194304,"blocks":["800e951e5a4cb8a8cd5cc8f770c8464783fcde41430100aebc32373d1ab56ffa"]},"offset":"1182284"},"pull.js":{"size":433490,"integrity":{"algorithm":"SHA256","hash":"ff716f9fd5d63be9f0ac6a7c6da918cb0a0285fd961f79d29819883f3ba661e5","blockSize":4194304,"blocks":["ff716f9fd5d63be9f0ac6a7c6da918cb0a0285fd961f79d29819883f3ba661e5"]},"offset":"1601369"},"push.js":{"size":436055,"integrity":{"algorithm":"SHA256","hash":"0850ce4c79f96cdc1c941156bd888672c6f321ecf6601c3ff3eaa16d570db042","blockSize":4194304,"blocks":["0850ce4c79f96cdc1c941156bd888672c6f321ecf6601c3ff3eaa16d570db042"]},"offset":"2034859"}}},"build":{"files":{"Main-logo-full-color.png":{"size":108409,"integrity":{"algorithm":"SHA256","hash":"1fc91447c2f2329f8a1fbfaa1a058d689b09d53a82c9863d85889afc1e25138c","blockSize":4194304,"blocks":["1fc91447c2f2329f8a1fbfaa1a058d689b09d53a82c9863d85889afc1e25138c"]},"offset":"2470914"},"asset-manifest.json":{"size":371,"integrity":{"algorithm":"SHA256","hash":"9d1b7a020a70ec47a958f37ce7d5f2fced6172d2b645eff2db91dd1e7f3ba19b","blockSize":4194304,"blocks":["9d1b7a020a70ec47a958f37ce7d5f2fced6172d2b645eff2db91dd1e7f3ba19b"]},"offset":"2579323"},"env.js":{"size":541,"integrity":{"algorithm":"SHA256","hash":"e45b87899f47d146c18044a757a017066541bdd092ad514092cd78ab9e560857","blockSize":4194304,"blocks":["e45b87899f47d146c18044a757a017066541bdd092ad514092cd78ab9e560857"]},"offset":"2579694"},"icon.icns":{"size":120031,"integrity":{"algorithm":"SHA256","hash":"93c8c36eb698794d242e011523d5690b14a5bd263936f66ecba38610d9a1f147","blockSize":4194304,"blocks":["93c8c36eb698794d242e011523d5690b14a5bd263936f66ecba38610d9a1f147"]},"offset":"2580235"},"icon.ico":{"size":361102,"integrity":{"algorithm":"SHA256","hash":"f0851b89a7dcc3a7742e8bb78b4526013d526945977daa30105dfc649fa36cc7","blockSize":4194304,"blocks":["f0851b89a7dcc3a7742e8bb78b4526013d526945977daa30105dfc649fa36cc7"]},"offset":"2700266"},"icon.png":{"size":72820,"integrity":{"algorithm":"SHA256","hash":"2b53bb37a064f4629f4a8b51d79a53e8de18e683ab39a8e6af80cb3f4d25da64","blockSize":4194304,"blocks":["2b53bb37a064f4629f4a8b51d79a53e8de18e683ab39a8e6af80cb3f4d25da64"]},"offset":"3061368"},"index.html":{"size":970,"integrity":{"algorithm":"SHA256","hash":"c9a4cedba6b8f2d093b8b3abc1383efb9d7ef771cdf0f162c92e2192d2393a71","blockSize":4194304,"blocks":["c9a4cedba6b8f2d093b8b3abc1383efb9d7ef771cdf0f162c92e2192d2393a71"]},"offset":"3134188"},"manifest.json":{"size":486,"integrity":{"algorithm":"SHA256","hash":"bde4d57781d504e2b77d1b5accb2232a21f082d5b301cf233775eec5e2d50181","blockSize":4194304,"blocks":["bde4d57781d504e2b77d1b5accb2232a21f082d5b301cf233775eec5e2d50181"]},"offset":"3135158"},"pattern.svg":{"size":5148,"integrity":{"algorithm":"SHA256","hash":"8bef3564af12961e65353116fda8d1031532547f6530d5052ce3bc3c7b70950f","blockSize":4194304,"blocks":["8bef3564af12961e65353116fda8d1031532547f6530d5052ce3bc3c7b70950f"]},"offset":"3135644"},"robots.txt":{"size":70,"integrity":{"algorithm":"SHA256","hash":"e5ab0d231eeb01b4a982d1c79a6729cac9797ad15a69247e4f28ba6afc149b4c","blockSize":4194304,"blocks":["e5ab0d231eeb01b4a982d1c79a6729cac9797ad15a69247e4f28ba6afc149b4c"]},"offset":"3140792"},"static":{"files":{"js":{"files":{"787.6fe45b4d.chunk.js":{"size":4601,"integrity":{"algorithm":"SHA256","hash":"b92e98d4fbbbdf922c5841235bb932afc4ba9450a9d9bf0a4c9b9a9d29c601aa","blockSize":4194304,"blocks":["b92e98d4fbbbdf922c5841235bb932afc4ba9450a9d9bf0a4c9b9a9d29c601aa"]},"offset":"3140862"},"main.ff19a20a.js":{"size":916536,"integrity":{"algorithm":"SHA256","hash":"4fe0375d8b038fb4b2bb15e405bb3090feb649fcbd5d47856b443a091e64c422","blockSize":4194304,"blocks":["4fe0375d8b038fb4b2bb15e405bb3090feb649fcbd5d47856b443a091e64c422"]},"offset":"3145463"},"main.ff19a20a.js.LICENSE.txt":{"size":2732,"integrity":{"algorithm":"SHA256","hash":"1075bf7cdd7ef5e819311138feefc60661180f76fe985ce00c6dd1a1b60bcc0c","blockSize":4194304,"blocks":["1075bf7cdd7ef5e819311138feefc60661180f76fe985ce00c6dd1a1b60bcc0c"]},"offset":"4061999"}}}}}}},"node_modules":{"files":{"@azure":{"files":{"abort-controller":{"files":{"LICENSE":{"size":1076,"integrity":{"algorithm":"SHA256","hash":"1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef","blockSize":4194304,"blocks":["1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef"]},"offset":"4064731"},"package.json":{"size":1742,"integrity":{"algorithm":"SHA256","hash":"86987ef2d8a89a256a0f9dfee366ef90cbc3485b01b954834b4a571cb7865288","blockSize":4194304,"blocks":["86987ef2d8a89a256a0f9dfee366ef90cbc3485b01b954834b4a571cb7865288"]},"offset":"4065807"},"types":{"files":{"src":{"files":{"tsdoc-metadata.json":{"size":341,"integrity":{"algorithm":"SHA256","hash":"ba744d25ad2d4b689ab5542fa53f02a2791732fb1638ffec466eb3d91aa7664a","blockSize":4194304,"blocks":["ba744d25ad2d4b689ab5542fa53f02a2791732fb1638ffec466eb3d91aa7664a"]},"offset":"4067549"}}}}},"dist-esm":{"files":{"src":{"files":{"AbortController.js":{"size":3728,"integrity":{"algorithm":"SHA256","hash":"aaa59f178a15d3d2006d12d5557eec98111a0a70a98b8c47a5edd6b9ead4cf49","blockSize":4194304,"blocks":["aaa59f178a15d3d2006d12d5557eec98111a0a70a98b8c47a5edd6b9ead4cf49"]},"offset":"4067890"},"AbortSignal.js":{"size":3588,"integrity":{"algorithm":"SHA256","hash":"632f9c74f1db9f2346e90aef7ce381fee01818b990cb68657f4b4c69fe3419c6","blockSize":4194304,"blocks":["632f9c74f1db9f2346e90aef7ce381fee01818b990cb68657f4b4c69fe3419c6"]},"offset":"4071618"},"index.js":{"size":630,"integrity":{"algorithm":"SHA256","hash":"87f6759341738b41210bd87148a361aa27c5b69656b1fdafdf76dee2b75d4669","blockSize":4194304,"blocks":["87f6759341738b41210bd87148a361aa27c5b69656b1fdafdf76dee2b75d4669"]},"offset":"4075206"}}}}},"dist":{"files":{"index.js":{"size":7339,"integrity":{"algorithm":"SHA256","hash":"0daa81578cc378366af0d5dff329d39e54b9cc06f9c69f3b72da6d41a6e011ac","blockSize":4194304,"blocks":["0daa81578cc378366af0d5dff329d39e54b9cc06f9c69f3b72da6d41a6e011ac"]},"offset":"4075836"}}}}},"core-auth":{"files":{"LICENSE":{"size":1076,"integrity":{"algorithm":"SHA256","hash":"1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef","blockSize":4194304,"blocks":["1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef"]},"offset":"4083175"},"package.json":{"size":1736,"integrity":{"algorithm":"SHA256","hash":"793196ccc00bae3c826f254d98048802c7997f6d62af1b528892b30dc874e03f","blockSize":4194304,"blocks":["793196ccc00bae3c826f254d98048802c7997f6d62af1b528892b30dc874e03f"]},"offset":"4084251"},"dist-esm":{"files":{"src":{"files":{"azureKeyCredential.js":{"size":968,"integrity":{"algorithm":"SHA256","hash":"9a2b9c2ceead81aa35bdd4de196b6bd72b19511af385282c8abd89834932b29a","blockSize":4194304,"blocks":["9a2b9c2ceead81aa35bdd4de196b6bd72b19511af385282c8abd89834932b29a"]},"offset":"4085987"},"azureNamedKeyCredential.js":{"size":1897,"integrity":{"algorithm":"SHA256","hash":"7b260e8ed19a190689f6d253bc6ebb638790ba962ff90d8f9363be68e96b2bf8","blockSize":4194304,"blocks":["7b260e8ed19a190689f6d253bc6ebb638790ba962ff90d8f9363be68e96b2bf8"]},"offset":"4086955"},"azureSASCredential.js":{"size":1614,"integrity":{"algorithm":"SHA256","hash":"00c096bead1373294d4e1015fbc53eb49b2647ff6b72e4fb36bc3ceefb96dbd3","blockSize":4194304,"blocks":["00c096bead1373294d4e1015fbc53eb49b2647ff6b72e4fb36bc3ceefb96dbd3"]},"offset":"4088852"},"index.js":{"size":389,"integrity":{"algorithm":"SHA256","hash":"86edc92600303b9319901e9b372f2aa2ba38e8d119a575a57d4c38c118c84561","blockSize":4194304,"blocks":["86edc92600303b9319901e9b372f2aa2ba38e8d119a575a57d4c38c118c84561"]},"offset":"4090466"},"tokenCredential.js":{"size":881,"integrity":{"algorithm":"SHA256","hash":"5f3597e2a23e4275d58b451f372b647c0ab061ff08b0ef1f3ecfb015dec7b927","blockSize":4194304,"blocks":["5f3597e2a23e4275d58b451f372b647c0ab061ff08b0ef1f3ecfb015dec7b927"]},"offset":"4090855"},"tracing.js":{"size":121,"integrity":{"algorithm":"SHA256","hash":"e82253bf389ec687aa383bd8ffa6b38d6ba89e500d53433f93b34eedf5c359d8","blockSize":4194304,"blocks":["e82253bf389ec687aa383bd8ffa6b38d6ba89e500d53433f93b34eedf5c359d8"]},"offset":"4091736"},"typeguards.js":{"size":1242,"integrity":{"algorithm":"SHA256","hash":"6bf11b967f660076773c8436b03fc89b47d5ddec2e9ff3f3acec549c5ab34ed4","blockSize":4194304,"blocks":["6bf11b967f660076773c8436b03fc89b47d5ddec2e9ff3f3acec549c5ab34ed4"]},"offset":"4091857"}}}}},"dist":{"files":{"index.js":{"size":6567,"integrity":{"algorithm":"SHA256","hash":"7a7733f652e380d3cb18ee64d49158eb3d3f08062ee6a0d01d9c25736c711410","blockSize":4194304,"blocks":["7a7733f652e380d3cb18ee64d49158eb3d3f08062ee6a0d01d9c25736c711410"]},"offset":"4093099"}}}}},"core-client":{"files":{"LICENSE":{"size":1076,"integrity":{"algorithm":"SHA256","hash":"1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef","blockSize":4194304,"blocks":["1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef"]},"offset":"4099666"},"package.json":{"size":2312,"integrity":{"algorithm":"SHA256","hash":"1bc082159ba8acfbcb502e0761fcdb45fd514f9e44102935c7a02ba3f5538f74","blockSize":4194304,"blocks":["1bc082159ba8acfbcb502e0761fcdb45fd514f9e44102935c7a02ba3f5538f74"]},"offset":"4100742"},"dist-esm":{"files":{"src":{"files":{"authorizeRequestOnClaimChallenge.js":{"size":3282,"integrity":{"algorithm":"SHA256","hash":"b55cccd99583273f4e8bd57ea632267b0ebf98c44dc4210826e7626e365bf5d1","blockSize":4194304,"blocks":["b55cccd99583273f4e8bd57ea632267b0ebf98c44dc4210826e7626e365bf5d1"]},"offset":"4103054"},"authorizeRequestOnTenantChallenge.js":{"size":3691,"integrity":{"algorithm":"SHA256","hash":"03b14b50409eb38616d711e64811b05eb10842139f2e72a78176fe4480487073","blockSize":4194304,"blocks":["03b14b50409eb38616d711e64811b05eb10842139f2e72a78176fe4480487073"]},"offset":"4106336"},"base64.browser.js":{"size":1048,"integrity":{"algorithm":"SHA256","hash":"16d9cd3fe0b864774b026127fd711f1087e63e484320fd368b6c72b4df61b5ad","blockSize":4194304,"blocks":["16d9cd3fe0b864774b026127fd711f1087e63e484320fd368b6c72b4df61b5ad"]},"offset":"4110027"},"base64.js":{"size":1183,"integrity":{"algorithm":"SHA256","hash":"3a54e2073521f45fe24b03ed98a9956c00c9aa7bd89dc21aae056f5d16baf596","blockSize":4194304,"blocks":["3a54e2073521f45fe24b03ed98a9956c00c9aa7bd89dc21aae056f5d16baf596"]},"offset":"4111075"},"deserializationPolicy.js":{"size":11394,"integrity":{"algorithm":"SHA256","hash":"d81f7348a9bfb5bbcaa6403fe342fdd8e94586cdfe37025aabca3ee4264e9483","blockSize":4194304,"blocks":["d81f7348a9bfb5bbcaa6403fe342fdd8e94586cdfe37025aabca3ee4264e9483"]},"offset":"4112258"},"httpClientCache.js":{"size":376,"integrity":{"algorithm":"SHA256","hash":"23af4d23480446be686b7f0acc8627a48d5efef73965c0647554d8148c6062d0","blockSize":4194304,"blocks":["23af4d23480446be686b7f0acc8627a48d5efef73965c0647554d8148c6062d0"]},"offset":"4123652"},"index.js":{"size":688,"integrity":{"algorithm":"SHA256","hash":"b4f62cb71ca74c90f7429b71250e9b49d71ca86d6946b9d76aa27491a6c245bc","blockSize":4194304,"blocks":["b4f62cb71ca74c90f7429b71250e9b49d71ca86d6946b9d76aa27491a6c245bc"]},"offset":"4124028"},"interfaceHelpers.js":{"size":1271,"integrity":{"algorithm":"SHA256","hash":"1add9c8d1047c7a6e929e3519be5b59f0486f0899290495773e70d2c90856ffc","blockSize":4194304,"blocks":["1add9c8d1047c7a6e929e3519be5b59f0486f0899290495773e70d2c90856ffc"]},"offset":"4124716"},"interfaces.js":{"size":296,"integrity":{"algorithm":"SHA256","hash":"1c0b9dc51f81f9fc8369c8140b63a697d87dcd5e17e382c8802be88a672e29ce","blockSize":4194304,"blocks":["1c0b9dc51f81f9fc8369c8140b63a697d87dcd5e17e382c8802be88a672e29ce"]},"offset":"4125987"},"log.js":{"size":215,"integrity":{"algorithm":"SHA256","hash":"cd6a2ed817677179622854762475a7afe16b39e4fc45e3bfb85bc0ec362a5d37","blockSize":4194304,"blocks":["cd6a2ed817677179622854762475a7afe16b39e4fc45e3bfb85bc0ec362a5d37"]},"offset":"4126283"},"operationHelpers.js":{"size":3330,"integrity":{"algorithm":"SHA256","hash":"7a83fc6f9e1d6c932f247e98074002ede283dd152bf4a887674f16d271430777","blockSize":4194304,"blocks":["7a83fc6f9e1d6c932f247e98074002ede283dd152bf4a887674f16d271430777"]},"offset":"4126498"},"pipeline.js":{"size":1231,"integrity":{"algorithm":"SHA256","hash":"2af12fb107e3c65d578f71f634c4f0963d1006426eed2336bdc1bcb096545ae7","blockSize":4194304,"blocks":["2af12fb107e3c65d578f71f634c4f0963d1006426eed2336bdc1bcb096545ae7"]},"offset":"4129828"},"serializationPolicy.js":{"size":8292,"integrity":{"algorithm":"SHA256","hash":"1111ccd7a82fc241bef935059d3d0210e0800af2df59899b9d56ebd8397b33ae","blockSize":4194304,"blocks":["1111ccd7a82fc241bef935059d3d0210e0800af2df59899b9d56ebd8397b33ae"]},"offset":"4131059"},"serializer.js":{"size":40115,"integrity":{"algorithm":"SHA256","hash":"371144fcdceb03cbae9737079063ae8485a2393585a3a0a70415c15ebd2676c1","blockSize":4194304,"blocks":["371144fcdceb03cbae9737079063ae8485a2393585a3a0a70415c15ebd2676c1"]},"offset":"4139351"},"serviceClient.js":{"size":7232,"integrity":{"algorithm":"SHA256","hash":"b5f8319aa8487f43210d3d756e2e16c24b72f646baf13c4637c6035995e174c6","blockSize":4194304,"blocks":["b5f8319aa8487f43210d3d756e2e16c24b72f646baf13c4637c6035995e174c6"]},"offset":"4179466"},"urlHelpers.js":{"size":9940,"integrity":{"algorithm":"SHA256","hash":"4f94b2156be2e18a75fe56c74b93941585748ab03de086f116b53e799c36b581","blockSize":4194304,"blocks":["4f94b2156be2e18a75fe56c74b93941585748ab03de086f116b53e799c36b581"]},"offset":"4186698"},"utils.js":{"size":5059,"integrity":{"algorithm":"SHA256","hash":"dde5663eed4ee022129f207d2f11b37c3073ba470a96639cb53b7a3de7e74907","blockSize":4194304,"blocks":["dde5663eed4ee022129f207d2f11b37c3073ba470a96639cb53b7a3de7e74907"]},"offset":"4196638"}}}}},"dist":{"files":{"index.js":{"size":94756,"integrity":{"algorithm":"SHA256","hash":"b3fc8ee2554ff84a0413614f015cbbe9f08591e29d5d2ec463c205bde5968a73","blockSize":4194304,"blocks":["b3fc8ee2554ff84a0413614f015cbbe9f08591e29d5d2ec463c205bde5968a73"]},"offset":"4201697"}}}}},"core-http":{"files":{"LICENSE":{"size":1076,"integrity":{"algorithm":"SHA256","hash":"1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef","blockSize":4194304,"blocks":["1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef"]},"offset":"4296453"},"package.json":{"size":3711,"integrity":{"algorithm":"SHA256","hash":"2dce7b22c06d6f20b7907b36f874e83936370fd14aa7a50318e0f948fe9267df","blockSize":4194304,"blocks":["2dce7b22c06d6f20b7907b36f874e83936370fd14aa7a50318e0f948fe9267df"]},"offset":"4297529"},"dist-esm":{"files":{"src":{"files":{"coreHttp.js":{"size":3013,"integrity":{"algorithm":"SHA256","hash":"eae59da65d95d019bf05aded9941bf7c4e8970021d524be63b01dc17051a7a0f","blockSize":4194304,"blocks":["eae59da65d95d019bf05aded9941bf7c4e8970021d524be63b01dc17051a7a0f"]},"offset":"4301240"},"createSpanLegacy.js":{"size":878,"integrity":{"algorithm":"SHA256","hash":"041fb2dbf038364ae4045370c6e2e1a679a01cb8457ca71346f3f0a4d2688f67","blockSize":4194304,"blocks":["041fb2dbf038364ae4045370c6e2e1a679a01cb8457ca71346f3f0a4d2688f67"]},"offset":"4304253"},"defaultHttpClient.browser.js":{"size":198,"integrity":{"algorithm":"SHA256","hash":"34cb115e9aeaf27871ca94d91742747acb0b2a99c30f0fd940236e4821462931","blockSize":4194304,"blocks":["34cb115e9aeaf27871ca94d91742747acb0b2a99c30f0fd940236e4821462931"]},"offset":"4305131"},"defaultHttpClient.js":{"size":202,"integrity":{"algorithm":"SHA256","hash":"eef125d76f68681f90ba8c973e80ff6e04b87dcd82160c856847e85b1f9b740e","blockSize":4194304,"blocks":["eef125d76f68681f90ba8c973e80ff6e04b87dcd82160c856847e85b1f9b740e"]},"offset":"4305329"},"httpClient.js":{"size":124,"integrity":{"algorithm":"SHA256","hash":"d94e4238cb04eee3884fc1db70c18e3e462d58c61f42556aad14b55a326ad8a7","blockSize":4194304,"blocks":["d94e4238cb04eee3884fc1db70c18e3e462d58c61f42556aad14b55a326ad8a7"]},"offset":"4305531"},"httpClientCache.js":{"size":362,"integrity":{"algorithm":"SHA256","hash":"354c42d29bb7c89a308f8ec17ecec93793a8b11ee2c93ba8e5475209abb2ff48","blockSize":4194304,"blocks":["354c42d29bb7c89a308f8ec17ecec93793a8b11ee2c93ba8e5475209abb2ff48"]},"offset":"4305655"},"httpHeaders.js":{"size":4998,"integrity":{"algorithm":"SHA256","hash":"ef42cff3a574feb24ded28fc0d8d7095c62b1a5e76a541b7f6e7a337b3959b55","blockSize":4194304,"blocks":["ef42cff3a574feb24ded28fc0d8d7095c62b1a5e76a541b7f6e7a337b3959b55"]},"offset":"4306017"},"httpOperationResponse.js":{"size":135,"integrity":{"algorithm":"SHA256","hash":"3d798b649ac051faafcefb4c444ccc7cc08860e4109dd9c3e8f6ff4709d75e38","blockSize":4194304,"blocks":["3d798b649ac051faafcefb4c444ccc7cc08860e4109dd9c3e8f6ff4709d75e38"]},"offset":"4311015"},"httpPipelineLogLevel.js":{"size":813,"integrity":{"algorithm":"SHA256","hash":"7fec92e4c20fbdf0d206e05b36e7142401fa4c2d6d748e11f8008bb6e9075578","blockSize":4194304,"blocks":["7fec92e4c20fbdf0d206e05b36e7142401fa4c2d6d748e11f8008bb6e9075578"]},"offset":"4311150"},"httpPipelineLogger.js":{"size":1188,"integrity":{"algorithm":"SHA256","hash":"fbb40ccd7cb22bf710157621bd9a57ba598ddfc494788f754955dfbe53de41a3","blockSize":4194304,"blocks":["fbb40ccd7cb22bf710157621bd9a57ba598ddfc494788f754955dfbe53de41a3"]},"offset":"4311963"},"log.js":{"size":213,"integrity":{"algorithm":"SHA256","hash":"ca4cd446e91275ea6de32c44d360c4bef877224d779747ead4c0ec89222dc778","blockSize":4194304,"blocks":["ca4cd446e91275ea6de32c44d360c4bef877224d779747ead4c0ec89222dc778"]},"offset":"4313151"},"nodeFetchHttpClient.js":{"size":13071,"integrity":{"algorithm":"SHA256","hash":"22c3cc6e73d9bcbf49e79acb5899079c014d2ff9fdcd9cecc1eb4d3e2aee3b69","blockSize":4194304,"blocks":["22c3cc6e73d9bcbf49e79acb5899079c014d2ff9fdcd9cecc1eb4d3e2aee3b69"]},"offset":"4313364"},"operationArguments.js":{"size":132,"integrity":{"algorithm":"SHA256","hash":"9361c9c148884fd996f4f5eb678fec0bc9ed5536374a60e7675f06482655983e","blockSize":4194304,"blocks":["9361c9c148884fd996f4f5eb678fec0bc9ed5536374a60e7675f06482655983e"]},"offset":"4326435"},"operationOptions.js":{"size":994,"integrity":{"algorithm":"SHA256","hash":"1f5843cb3e00ca3a865ca2bc92f456a6acd6b5883ec1a1c1c64ff6c1cc36f2c4","blockSize":4194304,"blocks":["1f5843cb3e00ca3a865ca2bc92f456a6acd6b5883ec1a1c1c64ff6c1cc36f2c4"]},"offset":"4326567"},"operationParameter.js":{"size":816,"integrity":{"algorithm":"SHA256","hash":"ea4aa327b3a8bb8fd30c0fe65e1139672ead7574b9cba753cf6a061ca35dfdb2","blockSize":4194304,"blocks":["ea4aa327b3a8bb8fd30c0fe65e1139672ead7574b9cba753cf6a061ca35dfdb2"]},"offset":"4327561"},"operationResponse.js":{"size":131,"integrity":{"algorithm":"SHA256","hash":"170da1e3708ad19d421a0e0d43119f97878aaae39bd8b4da155c5cc8c45f3857","blockSize":4194304,"blocks":["170da1e3708ad19d421a0e0d43119f97878aaae39bd8b4da155c5cc8c45f3857"]},"offset":"4328377"},"operationSpec.js":{"size":658,"integrity":{"algorithm":"SHA256","hash":"d5574919decf7516eeb7b314eaa701c54fe3f6d86f9bdffc1876feca6119722a","blockSize":4194304,"blocks":["d5574919decf7516eeb7b314eaa701c54fe3f6d86f9bdffc1876feca6119722a"]},"offset":"4328508"},"pipelineOptions.js":{"size":129,"integrity":{"algorithm":"SHA256","hash":"4776648063e549aff7419802f37bab168afabd4a036b8fe3294994297fb625c2","blockSize":4194304,"blocks":["4776648063e549aff7419802f37bab168afabd4a036b8fe3294994297fb625c2"]},"offset":"4329166"},"proxyAgent.js":{"size":2160,"integrity":{"algorithm":"SHA256","hash":"5a603e2436792be8c61f63480a64eaf0b6723f4206018ad2cb7794afd2124e2f","blockSize":4194304,"blocks":["5a603e2436792be8c61f63480a64eaf0b6723f4206018ad2cb7794afd2124e2f"]},"offset":"4329295"},"queryCollectionFormat.js":{"size":1067,"integrity":{"algorithm":"SHA256","hash":"dd84270357f7c82469ed271d0cf0d865d040e10e8fe45caef41f2f477bc9f5eb","blockSize":4194304,"blocks":["dd84270357f7c82469ed271d0cf0d865d040e10e8fe45caef41f2f477bc9f5eb"]},"offset":"4331455"},"restError.js":{"size":1323,"integrity":{"algorithm":"SHA256","hash":"c3442e0df956efabfcf2be5d835de6455fd44e3f8122d39b62c511533f84b7eb","blockSize":4194304,"blocks":["c3442e0df956efabfcf2be5d835de6455fd44e3f8122d39b62c511533f84b7eb"]},"offset":"4332522"},"serializer.js":{"size":40473,"integrity":{"algorithm":"SHA256","hash":"dd1c7dfc480f367338a6346d8aa34f5de6398bd989939b83d6cd05e69e7275b8","blockSize":4194304,"blocks":["dd1c7dfc480f367338a6346d8aa34f5de6398bd989939b83d6cd05e69e7275b8"]},"offset":"4333845"},"serviceClient.js":{"size":33634,"integrity":{"algorithm":"SHA256","hash":"1eae3c059aed149b6b13b9eabd0e0ed3c288d951b01e1b322008999c7ff31542","blockSize":4194304,"blocks":["1eae3c059aed149b6b13b9eabd0e0ed3c288d951b01e1b322008999c7ff31542"]},"offset":"4374318"},"url.js":{"size":19590,"integrity":{"algorithm":"SHA256","hash":"40447f791fbb1ff4bdda2de1158972f7cae863b0ca03f749224c558945fccbba","blockSize":4194304,"blocks":["40447f791fbb1ff4bdda2de1158972f7cae863b0ca03f749224c558945fccbba"]},"offset":"4407952"},"webResource.js":{"size":13191,"integrity":{"algorithm":"SHA256","hash":"a9c5f0e77f9cd1f30e760b557d21874314e693f8df53e1e7b8edca115197e3f0","blockSize":4194304,"blocks":["a9c5f0e77f9cd1f30e760b557d21874314e693f8df53e1e7b8edca115197e3f0"]},"offset":"4427542"},"xhrHttpClient.js":{"size":7459,"integrity":{"algorithm":"SHA256","hash":"558c349d7b24c9ba9b35bd33144ec7dcc7a829353d382510e07daa3960246111","blockSize":4194304,"blocks":["558c349d7b24c9ba9b35bd33144ec7dcc7a829353d382510e07daa3960246111"]},"offset":"4440733"},"util":{"files":{"base64.browser.js":{"size":880,"integrity":{"algorithm":"SHA256","hash":"d1040c2d1dc535d11a20488b55fc66870a0a726c6f5f080d33c4aeacce8b5e1d","blockSize":4194304,"blocks":["d1040c2d1dc535d11a20488b55fc66870a0a726c6f5f080d33c4aeacce8b5e1d"]},"offset":"4448192"},"base64.js":{"size":935,"integrity":{"algorithm":"SHA256","hash":"8c95b27f7fd4b1c11eeac49845ecc53f41b3d41c477135816b0bef80e71c30a6","blockSize":4194304,"blocks":["8c95b27f7fd4b1c11eeac49845ecc53f41b3d41c477135816b0bef80e71c30a6"]},"offset":"4449072"},"constants.js":{"size":1731,"integrity":{"algorithm":"SHA256","hash":"3e8f2459327da2647e08fd72f7cad97a3b58cb18cd146c014d4d41eb8e6bbccb","blockSize":4194304,"blocks":["3e8f2459327da2647e08fd72f7cad97a3b58cb18cd146c014d4d41eb8e6bbccb"]},"offset":"4450007"},"delay.js":{"size":2091,"integrity":{"algorithm":"SHA256","hash":"1318a1642016408c54305049069c757fd4b0ddb2ca1a81e5767e48d1fcfc9fce","blockSize":4194304,"blocks":["1318a1642016408c54305049069c757fd4b0ddb2ca1a81e5767e48d1fcfc9fce"]},"offset":"4451738"},"exponentialBackoffStrategy.js":{"size":1930,"integrity":{"algorithm":"SHA256","hash":"1ae794754b57df076953c963df8b49387a7374a5b497e21cf656516f250b17f9","blockSize":4194304,"blocks":["1ae794754b57df076953c963df8b49387a7374a5b497e21cf656516f250b17f9"]},"offset":"4453829"},"inspect.browser.js":{"size":144,"integrity":{"algorithm":"SHA256","hash":"d48a597c28b1c63d43382a9b82b4ce1c606786a9a44813cf4bbea375c1d7a394","blockSize":4194304,"blocks":["d48a597c28b1c63d43382a9b82b4ce1c606786a9a44813cf4bbea375c1d7a394"]},"offset":"4455759"},"inspect.js":{"size":180,"integrity":{"algorithm":"SHA256","hash":"837e76867937ee639229b70afd6e5816a2d07f714885d66006494abe59b2b7e7","blockSize":4194304,"blocks":["837e76867937ee639229b70afd6e5816a2d07f714885d66006494abe59b2b7e7"]},"offset":"4455903"},"sanitizer.js":{"size":4673,"integrity":{"algorithm":"SHA256","hash":"c5bb2ef0934c250059ada77a51a8466a9e0e8997733a1bcd5977bc8e803e14cd","blockSize":4194304,"blocks":["c5bb2ef0934c250059ada77a51a8466a9e0e8997733a1bcd5977bc8e803e14cd"]},"offset":"4456083"},"serializer.common.js":{"size":303,"integrity":{"algorithm":"SHA256","hash":"a8f9ca20e0429b20f601ac3a8e025430770ef101c93c8365177e968a99fcc1b3","blockSize":4194304,"blocks":["a8f9ca20e0429b20f601ac3a8e025430770ef101c93c8365177e968a99fcc1b3"]},"offset":"4460756"},"throttlingRetryStrategy.js":{"size":244,"integrity":{"algorithm":"SHA256","hash":"5371df1face64bfe6b82e9e27cbacfc3ecdd4dbe1f7903f96535bfda1ddf1d2d","blockSize":4194304,"blocks":["5371df1face64bfe6b82e9e27cbacfc3ecdd4dbe1f7903f96535bfda1ddf1d2d"]},"offset":"4461059"},"typeguards.js":{"size":328,"integrity":{"algorithm":"SHA256","hash":"158e20fdcf8ed07eab312d6500126d7a994e453d256bd07b638cbe71b21f9021","blockSize":4194304,"blocks":["158e20fdcf8ed07eab312d6500126d7a994e453d256bd07b638cbe71b21f9021"]},"offset":"4461303"},"utils.js":{"size":7532,"integrity":{"algorithm":"SHA256","hash":"bf42b2c0ce0adb78b8d2de55c8459fe8297162f05327fcb86ee74f85a2d196ee","blockSize":4194304,"blocks":["bf42b2c0ce0adb78b8d2de55c8459fe8297162f05327fcb86ee74f85a2d196ee"]},"offset":"4461631"},"xml.browser.js":{"size":6976,"integrity":{"algorithm":"SHA256","hash":"b03b52e92806de22e9d25a8d281925ee353be742941a88fba0ae6bef2d6b79bc","blockSize":4194304,"blocks":["b03b52e92806de22e9d25a8d281925ee353be742941a88fba0ae6bef2d6b79bc"]},"offset":"4469163"},"xml.js":{"size":3323,"integrity":{"algorithm":"SHA256","hash":"347e11404c813031248b05c544a5f0375bce107cf8264630284d444d99a16406","blockSize":4194304,"blocks":["347e11404c813031248b05c544a5f0375bce107cf8264630284d444d99a16406"]},"offset":"4476139"}}},"policies":{"files":{"bearerTokenAuthenticationPolicy.js":{"size":7370,"integrity":{"algorithm":"SHA256","hash":"d2cd24c3ae9dde8a01c9d77b8c0e9c8b70e1bc9030777254b6b3e9b600049c2b","blockSize":4194304,"blocks":["d2cd24c3ae9dde8a01c9d77b8c0e9c8b70e1bc9030777254b6b3e9b600049c2b"]},"offset":"4479462"},"deserializationPolicy.js":{"size":11687,"integrity":{"algorithm":"SHA256","hash":"b454d7b78b9ba1145c1f89006073811b32c587372272e42c65557f4eba994351","blockSize":4194304,"blocks":["b454d7b78b9ba1145c1f89006073811b32c587372272e42c65557f4eba994351"]},"offset":"4486832"},"disableResponseDecompressionPolicy.browser.js":{"size":1106,"integrity":{"algorithm":"SHA256","hash":"4c40914b4156cbd7e6933abc2cdf3a19074764b08afc7d9544a2ba3aa07989f5","blockSize":4194304,"blocks":["4c40914b4156cbd7e6933abc2cdf3a19074764b08afc7d9544a2ba3aa07989f5"]},"offset":"4498519"},"disableResponseDecompressionPolicy.js":{"size":1348,"integrity":{"algorithm":"SHA256","hash":"13778b19356c8701d202076f18a7ec97335af37c46fb62f0b31d7d93cc7c132d","blockSize":4194304,"blocks":["13778b19356c8701d202076f18a7ec97335af37c46fb62f0b31d7d93cc7c132d"]},"offset":"4499625"},"exponentialRetryPolicy.js":{"size":4811,"integrity":{"algorithm":"SHA256","hash":"76dffa15a4a9bc54d3665491c8f6fcfec9889e137352fa61f5f08e9138836ff3","blockSize":4194304,"blocks":["76dffa15a4a9bc54d3665491c8f6fcfec9889e137352fa61f5f08e9138836ff3"]},"offset":"4500973"},"generateClientRequestIdPolicy.js":{"size":1122,"integrity":{"algorithm":"SHA256","hash":"4d6131071bdb45fb555f8c737eaca22694387d5f10dc34ad176a8921a4b99511","blockSize":4194304,"blocks":["4d6131071bdb45fb555f8c737eaca22694387d5f10dc34ad176a8921a4b99511"]},"offset":"4505784"},"keepAlivePolicy.js":{"size":1511,"integrity":{"algorithm":"SHA256","hash":"357752e1bcda5e44a7a301fcfe38f81ab09e92d1faa17fa1a4da46dc975a83f6","blockSize":4194304,"blocks":["357752e1bcda5e44a7a301fcfe38f81ab09e92d1faa17fa1a4da46dc975a83f6"]},"offset":"4506906"},"logPolicy.js":{"size":3244,"integrity":{"algorithm":"SHA256","hash":"3fd2aa1aac1a887e23d57747eddd013e4d71d97c2fc8e9b180c6e886a1c2700e","blockSize":4194304,"blocks":["3fd2aa1aac1a887e23d57747eddd013e4d71d97c2fc8e9b180c6e886a1c2700e"]},"offset":"4508417"},"msRestUserAgentPolicy.browser.js":{"size":431,"integrity":{"algorithm":"SHA256","hash":"3a13c6da908de325ba9dfb1c2dc3c6961a0963e1d94d7b7c89cbf2cccea02217","blockSize":4194304,"blocks":["3a13c6da908de325ba9dfb1c2dc3c6961a0963e1d94d7b7c89cbf2cccea02217"]},"offset":"4511661"},"msRestUserAgentPolicy.js":{"size":566,"integrity":{"algorithm":"SHA256","hash":"f4055e14cf9d3d523ada516de3d7c645a867d764ce6d888da5a34a79c0931b0b","blockSize":4194304,"blocks":["f4055e14cf9d3d523ada516de3d7c645a867d764ce6d888da5a34a79c0931b0b"]},"offset":"4512092"},"msRestUserAgentPolicy.native.js":{"size":709,"integrity":{"algorithm":"SHA256","hash":"d8b9fec05cd4c15d3e0bb67c6ee1ddafc03fc7baf33a4a68afe4f878303db467","blockSize":4194304,"blocks":["d8b9fec05cd4c15d3e0bb67c6ee1ddafc03fc7baf33a4a68afe4f878303db467"]},"offset":"4512658"},"ndJsonPolicy.js":{"size":1203,"integrity":{"algorithm":"SHA256","hash":"3d91275be01024995f5d87fb1d90cbb1d36301b85f95e7709e131e2028d4d411","blockSize":4194304,"blocks":["3d91275be01024995f5d87fb1d90cbb1d36301b85f95e7709e131e2028d4d411"]},"offset":"4513367"},"proxyPolicy.browser.js":{"size":778,"integrity":{"algorithm":"SHA256","hash":"0c38f390c0372c586692138eb1a3bb66a5dd172e91e5fc53c08fe43b4dee6664","blockSize":4194304,"blocks":["0c38f390c0372c586692138eb1a3bb66a5dd172e91e5fc53c08fe43b4dee6664"]},"offset":"4514570"},"proxyPolicy.js":{"size":5679,"integrity":{"algorithm":"SHA256","hash":"3f550c60a2aeb6dd62f1fc4032bf8505ce218402c9f56b6c626661642b04d17e","blockSize":4194304,"blocks":["3f550c60a2aeb6dd62f1fc4032bf8505ce218402c9f56b6c626661642b04d17e"]},"offset":"4515348"},"redirectPolicy.js":{"size":2541,"integrity":{"algorithm":"SHA256","hash":"d6cbaf29dd37598d9b51f0e69aa73df996bd53eb7f97de9adf2e03f0bb3dc22b","blockSize":4194304,"blocks":["d6cbaf29dd37598d9b51f0e69aa73df996bd53eb7f97de9adf2e03f0bb3dc22b"]},"offset":"4521027"},"requestPolicy.js":{"size":2517,"integrity":{"algorithm":"SHA256","hash":"36798518f526a0673bec9e7d4e8b5e23a5307ab70abe3927c44ea65bdb096cfd","blockSize":4194304,"blocks":["36798518f526a0673bec9e7d4e8b5e23a5307ab70abe3927c44ea65bdb096cfd"]},"offset":"4523568"},"rpRegistrationPolicy.js":{"size":6643,"integrity":{"algorithm":"SHA256","hash":"b87ed7e805801cabd919830f1b76c350791cf3d7d6f8da261761d788a7fcc627","blockSize":4194304,"blocks":["b87ed7e805801cabd919830f1b76c350791cf3d7d6f8da261761d788a7fcc627"]},"offset":"4526085"},"signingPolicy.js":{"size":1223,"integrity":{"algorithm":"SHA256","hash":"95360a555fbbe8a30a31d353757a6319d92f3f47e9c76ecac2ae789978a9e420","blockSize":4194304,"blocks":["95360a555fbbe8a30a31d353757a6319d92f3f47e9c76ecac2ae789978a9e420"]},"offset":"4532728"},"systemErrorRetryPolicy.js":{"size":3748,"integrity":{"algorithm":"SHA256","hash":"624aee838a98dee46cff46e23d66ddea747aed775fe1c10f0a3068294300209d","blockSize":4194304,"blocks":["624aee838a98dee46cff46e23d66ddea747aed775fe1c10f0a3068294300209d"]},"offset":"4533951"},"throttlingRetryPolicy.js":{"size":4266,"integrity":{"algorithm":"SHA256","hash":"de14a7df667924cd6db9db53004aaa361b1f2e2fb02bcd7c4a70f8d3131a4bed","blockSize":4194304,"blocks":["de14a7df667924cd6db9db53004aaa361b1f2e2fb02bcd7c4a70f8d3131a4bed"]},"offset":"4537699"},"tracingPolicy.js":{"size":4902,"integrity":{"algorithm":"SHA256","hash":"0b72fbffa30850927e6653bfc034561bb10e568d3b4bbe3d6ebe05c51882a322","blockSize":4194304,"blocks":["0b72fbffa30850927e6653bfc034561bb10e568d3b4bbe3d6ebe05c51882a322"]},"offset":"4541965"},"userAgentPolicy.js":{"size":2943,"integrity":{"algorithm":"SHA256","hash":"6d3bd88ab8877af65fe81fdc33a71bc37bca243368c3f7ea283fa34244a49d2b","blockSize":4194304,"blocks":["6d3bd88ab8877af65fe81fdc33a71bc37bca243368c3f7ea283fa34244a49d2b"]},"offset":"4546867"}}},"credentials":{"files":{"accessTokenCache.js":{"size":1408,"integrity":{"algorithm":"SHA256","hash":"a34eae33ec69901ff33da13d0cf5c441556efe29a6787d532f9d5e15a8b3182f","blockSize":4194304,"blocks":["a34eae33ec69901ff33da13d0cf5c441556efe29a6787d532f9d5e15a8b3182f"]},"offset":"4549810"},"accessTokenRefresher.js":{"size":1732,"integrity":{"algorithm":"SHA256","hash":"cfeb32fc8e1871af037053bb33f7530115c8e1bb404721932d2da1b2dd40ca01","blockSize":4194304,"blocks":["cfeb32fc8e1871af037053bb33f7530115c8e1bb404721932d2da1b2dd40ca01"]},"offset":"4551218"},"apiKeyCredentials.js":{"size":2028,"integrity":{"algorithm":"SHA256","hash":"75435137302d0f4911641214ad47ec09eea9df528a23419b48b4d8aa4bcb6542","blockSize":4194304,"blocks":["75435137302d0f4911641214ad47ec09eea9df528a23419b48b4d8aa4bcb6542"]},"offset":"4552950"},"basicAuthenticationCredentials.js":{"size":2271,"integrity":{"algorithm":"SHA256","hash":"db64acfef372ea9dcf776941b604886b4a65b84244e62ec5ac1e21b8032dd894","blockSize":4194304,"blocks":["db64acfef372ea9dcf776941b604886b4a65b84244e62ec5ac1e21b8032dd894"]},"offset":"4554978"},"credentials.js":{"size":125,"integrity":{"algorithm":"SHA256","hash":"0ca7660160936cd395be20925fde1832e2d4d171fe98d5f7e93b965e2c3b0278","blockSize":4194304,"blocks":["0ca7660160936cd395be20925fde1832e2d4d171fe98d5f7e93b965e2c3b0278"]},"offset":"4557249"},"serviceClientCredentials.js":{"size":138,"integrity":{"algorithm":"SHA256","hash":"441a06731414ad13bd890ee3913800a0ee830dbde15ccc8d602342539494e722","blockSize":4194304,"blocks":["441a06731414ad13bd890ee3913800a0ee830dbde15ccc8d602342539494e722"]},"offset":"4557374"},"topicCredentials.js":{"size":789,"integrity":{"algorithm":"SHA256","hash":"fbb5abbe9187bceff1fb7e5b168f184191150464c4e4fbbd7e293c451ae6b84c","blockSize":4194304,"blocks":["fbb5abbe9187bceff1fb7e5b168f184191150464c4e4fbbd7e293c451ae6b84c"]},"offset":"4557512"}}}}}}},"dist":{"files":{"index.js":{"size":225786,"integrity":{"algorithm":"SHA256","hash":"c510bfc0d4b8f8bbeb940b150aedfdb1a1fcc824895246867bde5d8580eafb91","blockSize":4194304,"blocks":["c510bfc0d4b8f8bbeb940b150aedfdb1a1fcc824895246867bde5d8580eafb91"]},"offset":"4558301"}}},"node_modules":{"files":{"@azure":{"files":{"core-tracing":{"files":{"LICENSE":{"size":1076,"integrity":{"algorithm":"SHA256","hash":"1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef","blockSize":4194304,"blocks":["1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef"]},"offset":"45977481"},"package.json":{"size":1930,"integrity":{"algorithm":"SHA256","hash":"e417a629a49e896880cc13cf26973189f4b84a21c5701c09c27d2779b172712a","blockSize":4194304,"blocks":["e417a629a49e896880cc13cf26973189f4b84a21c5701c09c27d2779b172712a"]},"offset":"45978557"},"dist-esm":{"files":{"src":{"files":{"createSpan.js":{"size":2846,"integrity":{"algorithm":"SHA256","hash":"c62c133f01f1f32992d0d159c9572638b3121abfd0f35573984420173d96aed8","blockSize":4194304,"blocks":["c62c133f01f1f32992d0d159c9572638b3121abfd0f35573984420173d96aed8"]},"offset":"45980487"},"index.js":{"size":471,"integrity":{"algorithm":"SHA256","hash":"f64294bc31861aa522039f7778981aad1c9432bfe64d86354e7cf664a8d89bbb","blockSize":4194304,"blocks":["f64294bc31861aa522039f7778981aad1c9432bfe64d86354e7cf664a8d89bbb"]},"offset":"45983333"},"interfaces.js":{"size":3288,"integrity":{"algorithm":"SHA256","hash":"7e741acb0fdeaac2d7672df819845a61e61a6098fc22eebac4014f0e8beee141","blockSize":4194304,"blocks":["7e741acb0fdeaac2d7672df819845a61e61a6098fc22eebac4014f0e8beee141"]},"offset":"45983804"},"utils":{"files":{"traceParentHeader.js":{"size":1641,"integrity":{"algorithm":"SHA256","hash":"fd95aa681ca4fc0566db6ec841618204a5c761c5ad818588819a27490f47360d","blockSize":4194304,"blocks":["fd95aa681ca4fc0566db6ec841618204a5c761c5ad818588819a27490f47360d"]},"offset":"45987092"}}}}}}},"dist":{"files":{"index.js":{"size":7836,"integrity":{"algorithm":"SHA256","hash":"be0c1ec7e781ab2295f0ef166cea869353f190613d11a6743f1b5dd81f1af79e","blockSize":4194304,"blocks":["be0c1ec7e781ab2295f0ef166cea869353f190613d11a6743f1b5dd81f1af79e"]},"offset":"45988733"}}}}}}},"form-data":{"files":{"License":{"size":1118,"integrity":{"algorithm":"SHA256","hash":"e5b780d4f38d1d3328e3e53186c4e62d3fa149ea6f2bacd5de5ad0c30ac85343","blockSize":4194304,"blocks":["e5b780d4f38d1d3328e3e53186c4e62d3fa149ea6f2bacd5de5ad0c30ac85343"]},"offset":"45996569"},"README.md.bak":{"size":12070,"integrity":{"algorithm":"SHA256","hash":"c582a1729e728332fc30b1f9d5a87c52c47e107cc2797a8c93055ea87b1e9fe9","blockSize":4194304,"blocks":["c582a1729e728332fc30b1f9d5a87c52c47e107cc2797a8c93055ea87b1e9fe9"]},"offset":"45997687"},"package.json":{"size":1268,"integrity":{"algorithm":"SHA256","hash":"c2523c5dd90f778f0751d11632c567e8db5ee76003bf4f42f069005471b4226c","blockSize":4194304,"blocks":["c2523c5dd90f778f0751d11632c567e8db5ee76003bf4f42f069005471b4226c"]},"offset":"46009757"},"lib":{"files":{"browser.js":{"size":101,"integrity":{"algorithm":"SHA256","hash":"cf5b0957442886388f424790b303b5b855d7ef227f68163114aae79f6b212f37","blockSize":4194304,"blocks":["cf5b0957442886388f424790b303b5b855d7ef227f68163114aae79f6b212f37"]},"offset":"46011025"},"form_data.js":{"size":13715,"integrity":{"algorithm":"SHA256","hash":"65f1e9a852f2c1dc42db54e8b2a13dc4b65a2e26c8076cf19116ac93fa091bd6","blockSize":4194304,"blocks":["65f1e9a852f2c1dc42db54e8b2a13dc4b65a2e26c8076cf19116ac93fa091bd6"]},"offset":"46011126"},"populate.js":{"size":177,"integrity":{"algorithm":"SHA256","hash":"0a273800c22bc3600522aa951135210817eaf3e059d3cf1fbd7a5ba0dc5cb576","blockSize":4194304,"blocks":["0a273800c22bc3600522aa951135210817eaf3e059d3cf1fbd7a5ba0dc5cb576"]},"offset":"46024841"}}}}},"uuid":{"files":{"CONTRIBUTING.md":{"size":513,"integrity":{"algorithm":"SHA256","hash":"99b5cc0a56af12be90a669fdffc9f5a721236d2ede0d92e1171bb7097dd9fdd7","blockSize":4194304,"blocks":["99b5cc0a56af12be90a669fdffc9f5a721236d2ede0d92e1171bb7097dd9fdd7"]},"offset":"46025018"},"LICENSE.md":{"size":1109,"integrity":{"algorithm":"SHA256","hash":"beaa6b04fb82e41dd2ad679e19e27953afb5999b1abbb455b6564e78ebfeb332","blockSize":4194304,"blocks":["beaa6b04fb82e41dd2ad679e19e27953afb5999b1abbb455b6564e78ebfeb332"]},"offset":"46025531"},"package.json":{"size":2601,"integrity":{"algorithm":"SHA256","hash":"c33d17ad3546ea553db5df68edb1ac9a794e2e57fc99f838a9d78434ae009abc","blockSize":4194304,"blocks":["c33d17ad3546ea553db5df68edb1ac9a794e2e57fc99f838a9d78434ae009abc"]},"offset":"46026640"},"wrapper.mjs":{"size":323,"integrity":{"algorithm":"SHA256","hash":"f6835608d7c4b422bb11ab4689bcf91e166ecbbd63aa3fa2b83c448835cd80a5","blockSize":4194304,"blocks":["f6835608d7c4b422bb11ab4689bcf91e166ecbbd63aa3fa2b83c448835cd80a5"]},"offset":"46029241"},"dist":{"files":{"index.js":{"size":1765,"integrity":{"algorithm":"SHA256","hash":"069a2230d395723583c8e45a7c0fee2622af2fbd08dc35f81e4d57836122e59f","blockSize":4194304,"blocks":["069a2230d395723583c8e45a7c0fee2622af2fbd08dc35f81e4d57836122e59f"]},"offset":"46029564"},"md5-browser.js":{"size":7015,"integrity":{"algorithm":"SHA256","hash":"21a4e167b7ae498e8f3778bac8d7330929099006afca6adfe76b626e0e41d795","blockSize":4194304,"blocks":["21a4e167b7ae498e8f3778bac8d7330929099006afca6adfe76b626e0e41d795"]},"offset":"46031329"},"md5.js":{"size":550,"integrity":{"algorithm":"SHA256","hash":"6ca6276ff35f19ea462bb8c9d6d290994fa9980fc775deb741811ef947196ced","blockSize":4194304,"blocks":["6ca6276ff35f19ea462bb8c9d6d290994fa9980fc775deb741811ef947196ced"]},"offset":"46038344"},"nil.js":{"size":188,"integrity":{"algorithm":"SHA256","hash":"7395bd919bd1309bcbced245a59dfc6b077f97992a482af2537343e558795b1f","blockSize":4194304,"blocks":["7395bd919bd1309bcbced245a59dfc6b077f97992a482af2537343e558795b1f"]},"offset":"46038894"},"parse.js":{"size":1380,"integrity":{"algorithm":"SHA256","hash":"1a87ed6a6bb0a3edbe266ca55aaf1c5af8e963ee9486f74b59cfd615280b21b4","blockSize":4194304,"blocks":["1a87ed6a6bb0a3edbe266ca55aaf1c5af8e963ee9486f74b59cfd615280b21b4"]},"offset":"46039082"},"regex.js":{"size":267,"integrity":{"algorithm":"SHA256","hash":"acc4c54d987f100093097f4f156ff245394c39d1332eb2114d7e40db00bd6ddd","blockSize":4194304,"blocks":["acc4c54d987f100093097f4f156ff245394c39d1332eb2114d7e40db00bd6ddd"]},"offset":"46040462"},"rng-browser.js":{"size":1131,"integrity":{"algorithm":"SHA256","hash":"4c88edf4fd7fae3bf84bad34750a55f706c8e522a924af6c6ad22839e3718dd6","blockSize":4194304,"blocks":["4c88edf4fd7fae3bf84bad34750a55f706c8e522a924af6c6ad22839e3718dd6"]},"offset":"46040729"},"rng.js":{"size":549,"integrity":{"algorithm":"SHA256","hash":"fdde4350fc69c07bfed4178eedf6121a56264744207d9f5c8f3e5b1b913dbb06","blockSize":4194304,"blocks":["fdde4350fc69c07bfed4178eedf6121a56264744207d9f5c8f3e5b1b913dbb06"]},"offset":"46041860"},"sha1-browser.js":{"size":2609,"integrity":{"algorithm":"SHA256","hash":"32982388b377b06298f59db97c98077f06e6b4f29fe284d427195a358a72f19e","blockSize":4194304,"blocks":["32982388b377b06298f59db97c98077f06e6b4f29fe284d427195a358a72f19e"]},"offset":"46042409"},"sha1.js":{"size":553,"integrity":{"algorithm":"SHA256","hash":"a9eda407444a3f68a0a4db0373346df18f583abbde2c4bf2b3fbc6d73be2c75e","blockSize":4194304,"blocks":["a9eda407444a3f68a0a4db0373346df18f583abbde2c4bf2b3fbc6d73be2c75e"]},"offset":"46045018"},"stringify.js":{"size":1667,"integrity":{"algorithm":"SHA256","hash":"85a70b8982f37ddb434816dcda7628b0319e5a90d46ac6bc9b08d4d15d6a7650","blockSize":4194304,"blocks":["85a70b8982f37ddb434816dcda7628b0319e5a90d46ac6bc9b08d4d15d6a7650"]},"offset":"46045571"},"uuid-bin.js":{"size":2030,"integrity":{"algorithm":"SHA256","hash":"7c60635cf5a963da72e35292bcbfa7f7221b08374d69d75103fa82da9d950102","blockSize":4194304,"blocks":["7c60635cf5a963da72e35292bcbfa7f7221b08374d69d75103fa82da9d950102"]},"offset":"46047238"},"v1.js":{"size":3618,"integrity":{"algorithm":"SHA256","hash":"6dad9c2e6565ad6b478fba7b2ace95350df56a15a72920e72ac64c3a2691d665","blockSize":4194304,"blocks":["6dad9c2e6565ad6b478fba7b2ace95350df56a15a72920e72ac64c3a2691d665"]},"offset":"46049268"},"v3.js":{"size":414,"integrity":{"algorithm":"SHA256","hash":"95e0c6fa204355c6ef7dbac5720a3ef5239454ed6820674dfcc143a55ea6c459","blockSize":4194304,"blocks":["95e0c6fa204355c6ef7dbac5720a3ef5239454ed6820674dfcc143a55ea6c459"]},"offset":"46052886"},"v35.js":{"size":2008,"integrity":{"algorithm":"SHA256","hash":"ababd96e6f8b1fca9bb58f43220473f7bd59fbc81b3acb212df924813544283f","blockSize":4194304,"blocks":["ababd96e6f8b1fca9bb58f43220473f7bd59fbc81b3acb212df924813544283f"]},"offset":"46053300"},"v4.js":{"size":860,"integrity":{"algorithm":"SHA256","hash":"a9e30e8692dde9dec39a3ef716ef8e650e321813fa9d137f16d27666b9ad96ef","blockSize":4194304,"blocks":["a9e30e8692dde9dec39a3ef716ef8e650e321813fa9d137f16d27666b9ad96ef"]},"offset":"46055308"},"v5.js":{"size":417,"integrity":{"algorithm":"SHA256","hash":"d15c31975f31b9abf6a195e70a3dca0843a9257cb51b49214cf7a9f4ed30fc5a","blockSize":4194304,"blocks":["d15c31975f31b9abf6a195e70a3dca0843a9257cb51b49214cf7a9f4ed30fc5a"]},"offset":"46056168"},"validate.js":{"size":410,"integrity":{"algorithm":"SHA256","hash":"5497d9adffd73474cf379d3e1b76b28698e408124a0726d54e88282500378502","blockSize":4194304,"blocks":["5497d9adffd73474cf379d3e1b76b28698e408124a0726d54e88282500378502"]},"offset":"46056585"},"version.js":{"size":474,"integrity":{"algorithm":"SHA256","hash":"cad5f0ecd518983e310856cafd54d4d0de0b9db3c8e3bd97ec8e773ef63de6e8","blockSize":4194304,"blocks":["cad5f0ecd518983e310856cafd54d4d0de0b9db3c8e3bd97ec8e773ef63de6e8"]},"offset":"46056995"},"umd":{"files":{"uuid.min.js":{"size":8160,"integrity":{"algorithm":"SHA256","hash":"c5df6d9704bdada96df0770523058f395192ee9d1fe13880eb1d57dfe6417533","blockSize":4194304,"blocks":["c5df6d9704bdada96df0770523058f395192ee9d1fe13880eb1d57dfe6417533"]},"offset":"46057469"},"uuidNIL.min.js":{"size":280,"integrity":{"algorithm":"SHA256","hash":"18c98395b8a11f83924c22af88573b8bbe3a5cf4fe7864364e6902e49ac3d7fd","blockSize":4194304,"blocks":["18c98395b8a11f83924c22af88573b8bbe3a5cf4fe7864364e6902e49ac3d7fd"]},"offset":"46065629"},"uuidParse.min.js":{"size":883,"integrity":{"algorithm":"SHA256","hash":"555a6f1b1f49532a96c4235ab4de7c1e5fec9b8724bcf1a1247ba4eb33116af2","blockSize":4194304,"blocks":["555a6f1b1f49532a96c4235ab4de7c1e5fec9b8724bcf1a1247ba4eb33116af2"]},"offset":"46065909"},"uuidStringify.min.js":{"size":829,"integrity":{"algorithm":"SHA256","hash":"9b6db819fecb2f40d9fa5ac8c892218004b3a633a1ec29d7a873801a7eade28f","blockSize":4194304,"blocks":["9b6db819fecb2f40d9fa5ac8c892218004b3a633a1ec29d7a873801a7eade28f"]},"offset":"46066792"},"uuidValidate.min.js":{"size":420,"integrity":{"algorithm":"SHA256","hash":"45a1c7d7618c149522c8f8085675e6707381f6106ca414c294b3e6169065cf21","blockSize":4194304,"blocks":["45a1c7d7618c149522c8f8085675e6707381f6106ca414c294b3e6169065cf21"]},"offset":"46067621"},"uuidVersion.min.js":{"size":506,"integrity":{"algorithm":"SHA256","hash":"c0a99b310a43528b5e4f59c87dcc489732bf8c4dd3a367c34cf882a88a3cecca","blockSize":4194304,"blocks":["c0a99b310a43528b5e4f59c87dcc489732bf8c4dd3a367c34cf882a88a3cecca"]},"offset":"46068041"},"uuidv1.min.js":{"size":2020,"integrity":{"algorithm":"SHA256","hash":"9963a427c7b05e1ea3c923cfed992cfea294e980e42d754ba593cec66d285a07","blockSize":4194304,"blocks":["9963a427c7b05e1ea3c923cfed992cfea294e980e42d754ba593cec66d285a07"]},"offset":"46068547"},"uuidv3.min.js":{"size":5145,"integrity":{"algorithm":"SHA256","hash":"2d31a5a7ef824371df6f91ad677cd137ca9b51a529be40873f9b60009c550932","blockSize":4194304,"blocks":["2d31a5a7ef824371df6f91ad677cd137ca9b51a529be40873f9b60009c550932"]},"offset":"46070567"},"uuidv4.min.js":{"size":1366,"integrity":{"algorithm":"SHA256","hash":"4bbb806e743e21bc9f97b62fc0564e0889b7f31ee9d48c3f2b85d4e00fe629cc","blockSize":4194304,"blocks":["4bbb806e743e21bc9f97b62fc0564e0889b7f31ee9d48c3f2b85d4e00fe629cc"]},"offset":"46075712"},"uuidv5.min.js":{"size":3267,"integrity":{"algorithm":"SHA256","hash":"1a444d14f3a6f8952bfc827be5c52dc7367c99e5bf30a5e5102f0b4ad420df76","blockSize":4194304,"blocks":["1a444d14f3a6f8952bfc827be5c52dc7367c99e5bf30a5e5102f0b4ad420df76"]},"offset":"46077078"}}},"esm-node":{"files":{"index.js":{"size":412,"integrity":{"algorithm":"SHA256","hash":"3efb8df8c64379c5acbaf0b70ce1a1906375f4b53901b7e90a26863ead50fc30","blockSize":4194304,"blocks":["3efb8df8c64379c5acbaf0b70ce1a1906375f4b53901b7e90a26863ead50fc30"]},"offset":"46080345"},"md5.js":{"size":281,"integrity":{"algorithm":"SHA256","hash":"2313329bf3ada8cd17046afeefa761bd7daa3821e140fc55d8c2b94ee7760ed4","blockSize":4194304,"blocks":["2313329bf3ada8cd17046afeefa761bd7daa3821e140fc55d8c2b94ee7760ed4"]},"offset":"46080757"},"nil.js":{"size":54,"integrity":{"algorithm":"SHA256","hash":"40036d4ffe78154827eedb9c1b3f59f660722907389725842bbc178ba28d2241","blockSize":4194304,"blocks":["40036d4ffe78154827eedb9c1b3f59f660722907389725842bbc178ba28d2241"]},"offset":"46081038"},"parse.js":{"size":1106,"integrity":{"algorithm":"SHA256","hash":"2743e5b696fb15df389cf3b1a242e56780f7941bbefc23465529d30e851b80f5","blockSize":4194304,"blocks":["2743e5b696fb15df389cf3b1a242e56780f7941bbefc23465529d30e851b80f5"]},"offset":"46081092"},"regex.js":{"size":133,"integrity":{"algorithm":"SHA256","hash":"9a546763c108d7eeb7283ce26c7a6845a44bd67132005eb32fd1feeca49d1b3f","blockSize":4194304,"blocks":["9a546763c108d7eeb7283ce26c7a6845a44bd67132005eb32fd1feeca49d1b3f"]},"offset":"46082198"},"rng.js":{"size":323,"integrity":{"algorithm":"SHA256","hash":"ff667aff9367a48cc713d36764cea05bd30e8ba05392430571c54734fc9fde03","blockSize":4194304,"blocks":["ff667aff9367a48cc713d36764cea05bd30e8ba05392430571c54734fc9fde03"]},"offset":"46082331"},"sha1.js":{"size":284,"integrity":{"algorithm":"SHA256","hash":"6094b056716c8a37b9f2da365d6c8a17f754543d966411d01dfebd762c94547e","blockSize":4194304,"blocks":["6094b056716c8a37b9f2da365d6c8a17f754543d966411d01dfebd762c94547e"]},"offset":"46082654"},"stringify.js":{"size":1393,"integrity":{"algorithm":"SHA256","hash":"224279f45e9b30fca5de4fcf8620aa00ac3c8bef89fc073bfb36b83272bd1556","blockSize":4194304,"blocks":["224279f45e9b30fca5de4fcf8620aa00ac3c8bef89fc073bfb36b83272bd1556"]},"offset":"46082938"},"v1.js":{"size":3306,"integrity":{"algorithm":"SHA256","hash":"4cbdb6e889c57896cc8dd35f299aa05a00ff7a43b875a187f87c95e7bb2c3f0f","blockSize":4194304,"blocks":["4cbdb6e889c57896cc8dd35f299aa05a00ff7a43b875a187f87c95e7bb2c3f0f"]},"offset":"46084331"},"v3.js":{"size":107,"integrity":{"algorithm":"SHA256","hash":"65b963f24922d433fdc592aa4e2764d10fad59351015bbe5fce0830fe389794a","blockSize":4194304,"blocks":["65b963f24922d433fdc592aa4e2764d10fad59351015bbe5fce0830fe389794a"]},"offset":"46087637"},"v35.js":{"size":1663,"integrity":{"algorithm":"SHA256","hash":"56a358587ded91ef272d54a4937e6f59193cd11b51710503859083feb8d6f20f","blockSize":4194304,"blocks":["56a358587ded91ef272d54a4937e6f59193cd11b51710503859083feb8d6f20f"]},"offset":"46087744"},"v4.js":{"size":546,"integrity":{"algorithm":"SHA256","hash":"44d2fedb301801c7c60e45934eaa13435614e3d65aedf8759775890de75bed69","blockSize":4194304,"blocks":["44d2fedb301801c7c60e45934eaa13435614e3d65aedf8759775890de75bed69"]},"offset":"46089407"},"v5.js":{"size":110,"integrity":{"algorithm":"SHA256","hash":"e9e8d82440c23fc3de56f8acd5a15b1ca2daad6bf6d2e7c4a4b39d04384206d3","blockSize":4194304,"blocks":["e9e8d82440c23fc3de56f8acd5a15b1ca2daad6bf6d2e7c4a4b39d04384206d3"]},"offset":"46089953"},"validate.js":{"size":141,"integrity":{"algorithm":"SHA256","hash":"4a782f41298704c0029c245203430b3e4511365bf05a3addacdbae59d9c664fa","blockSize":4194304,"blocks":["4a782f41298704c0029c245203430b3e4511365bf05a3addacdbae59d9c664fa"]},"offset":"46090063"},"version.js":{"size":200,"integrity":{"algorithm":"SHA256","hash":"84d1c2f759c39dbf8b26a359b0d68ba9fcc68bf8c3612b8b1bb0df31dfb2e693","blockSize":4194304,"blocks":["84d1c2f759c39dbf8b26a359b0d68ba9fcc68bf8c3612b8b1bb0df31dfb2e693"]},"offset":"46090204"}}},"esm-browser":{"files":{"index.js":{"size":412,"integrity":{"algorithm":"SHA256","hash":"3efb8df8c64379c5acbaf0b70ce1a1906375f4b53901b7e90a26863ead50fc30","blockSize":4194304,"blocks":["3efb8df8c64379c5acbaf0b70ce1a1906375f4b53901b7e90a26863ead50fc30"]},"offset":"46090404"},"md5.js":{"size":6852,"integrity":{"algorithm":"SHA256","hash":"705eb0feeda58a88a5b887cf580e38bb9979dec642dd663b63c9dc485e956728","blockSize":4194304,"blocks":["705eb0feeda58a88a5b887cf580e38bb9979dec642dd663b63c9dc485e956728"]},"offset":"46090816"},"nil.js":{"size":54,"integrity":{"algorithm":"SHA256","hash":"40036d4ffe78154827eedb9c1b3f59f660722907389725842bbc178ba28d2241","blockSize":4194304,"blocks":["40036d4ffe78154827eedb9c1b3f59f660722907389725842bbc178ba28d2241"]},"offset":"46097668"},"parse.js":{"size":1104,"integrity":{"algorithm":"SHA256","hash":"1efd0e1dd5d7d205a3405f5aee39029ea60bece8a893b2bf742a16c6a51246a6","blockSize":4194304,"blocks":["1efd0e1dd5d7d205a3405f5aee39029ea60bece8a893b2bf742a16c6a51246a6"]},"offset":"46097722"},"regex.js":{"size":133,"integrity":{"algorithm":"SHA256","hash":"9a546763c108d7eeb7283ce26c7a6845a44bd67132005eb32fd1feeca49d1b3f","blockSize":4194304,"blocks":["9a546763c108d7eeb7283ce26c7a6845a44bd67132005eb32fd1feeca49d1b3f"]},"offset":"46098826"},"rng.js":{"size":1040,"integrity":{"algorithm":"SHA256","hash":"0e1abdc73fa79ff64006ec6675b06a193f55eac039595cc3867e6567e46f2dd7","blockSize":4194304,"blocks":["0e1abdc73fa79ff64006ec6675b06a193f55eac039595cc3867e6567e46f2dd7"]},"offset":"46098959"},"sha1.js":{"size":2488,"integrity":{"algorithm":"SHA256","hash":"0b777c8796a7e0954a47bc5b7d612f89d7cd9218106881a9b4931f8f882fd056","blockSize":4194304,"blocks":["0b777c8796a7e0954a47bc5b7d612f89d7cd9218106881a9b4931f8f882fd056"]},"offset":"46099999"},"stringify.js":{"size":1463,"integrity":{"algorithm":"SHA256","hash":"b3e05d40408725c571660f7f1bfdb1b20fde769c5142f23273a95815b2ca5d01","blockSize":4194304,"blocks":["b3e05d40408725c571660f7f1bfdb1b20fde769c5142f23273a95815b2ca5d01"]},"offset":"46102487"},"v1.js":{"size":3296,"integrity":{"algorithm":"SHA256","hash":"746184938af3d1e32fb432711c135d95305f839d94a5e90dd23438435a8342b6","blockSize":4194304,"blocks":["746184938af3d1e32fb432711c135d95305f839d94a5e90dd23438435a8342b6"]},"offset":"46103950"},"v3.js":{"size":105,"integrity":{"algorithm":"SHA256","hash":"337d2b9ef80229c44c240e4218aa324b129d792701432061946ee4154e30080a","blockSize":4194304,"blocks":["337d2b9ef80229c44c240e4218aa324b129d792701432061946ee4154e30080a"]},"offset":"46107246"},"v35.js":{"size":1657,"integrity":{"algorithm":"SHA256","hash":"c418ede8cd4d61f12ae553adac55b1afa2cbd8c8659c31dd657c1decbb36314b","blockSize":4194304,"blocks":["c418ede8cd4d61f12ae553adac55b1afa2cbd8c8659c31dd657c1decbb36314b"]},"offset":"46107351"},"v4.js":{"size":544,"integrity":{"algorithm":"SHA256","hash":"971f818a59ef77ee2c213dfea32dc4494823f9b8bd45be19fd81cf49b09f44e5","blockSize":4194304,"blocks":["971f818a59ef77ee2c213dfea32dc4494823f9b8bd45be19fd81cf49b09f44e5"]},"offset":"46109008"},"v5.js":{"size":108,"integrity":{"algorithm":"SHA256","hash":"07e6d11989b44edbe92ccb697febb65225ebad32fb2f9c91c5b571a6f5a3c4df","blockSize":4194304,"blocks":["07e6d11989b44edbe92ccb697febb65225ebad32fb2f9c91c5b571a6f5a3c4df"]},"offset":"46109552"},"validate.js":{"size":141,"integrity":{"algorithm":"SHA256","hash":"4a782f41298704c0029c245203430b3e4511365bf05a3addacdbae59d9c664fa","blockSize":4194304,"blocks":["4a782f41298704c0029c245203430b3e4511365bf05a3addacdbae59d9c664fa"]},"offset":"46109660"},"version.js":{"size":200,"integrity":{"algorithm":"SHA256","hash":"84d1c2f759c39dbf8b26a359b0d68ba9fcc68bf8c3612b8b1bb0df31dfb2e693","blockSize":4194304,"blocks":["84d1c2f759c39dbf8b26a359b0d68ba9fcc68bf8c3612b8b1bb0df31dfb2e693"]},"offset":"46109801"}}},"bin":{"files":{"uuid":{"size":44,"integrity":{"algorithm":"SHA256","hash":"30b5422b6c95ccdc402effd7d3354ca6a6bce621cf21d0379749ddf1f96c1ad7","blockSize":4194304,"blocks":["30b5422b6c95ccdc402effd7d3354ca6a6bce621cf21d0379749ddf1f96c1ad7"]},"offset":"46110001"}}}}}}}}}}},"core-lro":{"files":{"LICENSE":{"size":1076,"integrity":{"algorithm":"SHA256","hash":"1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef","blockSize":4194304,"blocks":["1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef"]},"offset":"4784087"},"package.json":{"size":2026,"integrity":{"algorithm":"SHA256","hash":"7962c2bbc0b106ea904984b12f0e3c9b075b84868c45a8af7da89fc381ab9a05","blockSize":4194304,"blocks":["7962c2bbc0b106ea904984b12f0e3c9b075b84868c45a8af7da89fc381ab9a05"]},"offset":"4785163"},"dist-esm":{"files":{"src":{"files":{"index.js":{"size":196,"integrity":{"algorithm":"SHA256","hash":"8582af58e0231f090c01c30016b37d8896433f7e1eb6dcece821e671b5ea2c38","blockSize":4194304,"blocks":["8582af58e0231f090c01c30016b37d8896433f7e1eb6dcece821e671b5ea2c38"]},"offset":"4787189"},"pollOperation.js":{"size":127,"integrity":{"algorithm":"SHA256","hash":"e5eae199e8f010a92a06e6ec0fc1f454b431d87d88382eeaf98d450b021e901e","blockSize":4194304,"blocks":["e5eae199e8f010a92a06e6ec0fc1f454b431d87d88382eeaf98d450b021e901e"]},"offset":"4787385"},"poller.js":{"size":14545,"integrity":{"algorithm":"SHA256","hash":"94fe626d5293c0e4bdb7d44f3f7cf5f9e992387bd1096f6a8084227f8cadd8cc","blockSize":4194304,"blocks":["94fe626d5293c0e4bdb7d44f3f7cf5f9e992387bd1096f6a8084227f8cadd8cc"]},"offset":"4787512"},"lroEngine":{"files":{"bodyPolling.js":{"size":1301,"integrity":{"algorithm":"SHA256","hash":"5cba77e3913d4bbed48dd703cc9308f5318dd1b503719228a371b909034c14de","blockSize":4194304,"blocks":["5cba77e3913d4bbed48dd703cc9308f5318dd1b503719228a371b909034c14de"]},"offset":"4802057"},"index.js":{"size":149,"integrity":{"algorithm":"SHA256","hash":"71640adf0227b75f21bd73ed1dca399bd7fb01abf37690e90e55e9caa38cc901","blockSize":4194304,"blocks":["71640adf0227b75f21bd73ed1dca399bd7fb01abf37690e90e55e9caa38cc901"]},"offset":"4803358"},"locationPolling.js":{"size":2214,"integrity":{"algorithm":"SHA256","hash":"302f3e21fb6e98e76686d06e27812591c6754fe65e7401551e66fb8943b3a545","blockSize":4194304,"blocks":["302f3e21fb6e98e76686d06e27812591c6754fe65e7401551e66fb8943b3a545"]},"offset":"4803507"},"logger.js":{"size":291,"integrity":{"algorithm":"SHA256","hash":"07f56684e6ae3cdaca2d95e827166ae96a326015ed9c4ec0900c53c326e5a6cc","blockSize":4194304,"blocks":["07f56684e6ae3cdaca2d95e827166ae96a326015ed9c4ec0900c53c326e5a6cc"]},"offset":"4805721"},"lroEngine.js":{"size":1428,"integrity":{"algorithm":"SHA256","hash":"2effb4fd508852ae875c3122e93ac2c403ef007fc9f5f5a6133cc385cbc603da","blockSize":4194304,"blocks":["2effb4fd508852ae875c3122e93ac2c403ef007fc9f5f5a6133cc385cbc603da"]},"offset":"4806012"},"models.js":{"size":352,"integrity":{"algorithm":"SHA256","hash":"af457f6250e17308330d867fe3133adc0d6049277c7d62a04fb39a794b733075","blockSize":4194304,"blocks":["af457f6250e17308330d867fe3133adc0d6049277c7d62a04fb39a794b733075"]},"offset":"4807440"},"operation.js":{"size":4526,"integrity":{"algorithm":"SHA256","hash":"b3c37a3d72e7062e55c8e00fc6a9068736f32ec420c158ff4c952d4979e96e36","blockSize":4194304,"blocks":["b3c37a3d72e7062e55c8e00fc6a9068736f32ec420c158ff4c952d4979e96e36"]},"offset":"4807792"},"passthrough.js":{"size":249,"integrity":{"algorithm":"SHA256","hash":"00a6ce85bd858179bbefda307e276630994261b983813550095cf91d80702e22","blockSize":4194304,"blocks":["00a6ce85bd858179bbefda307e276630994261b983813550095cf91d80702e22"]},"offset":"4812318"},"requestUtils.js":{"size":2886,"integrity":{"algorithm":"SHA256","hash":"9bc3f0596659d6ce4be8cb8a357306ad3905c9f88ed56d3131fb4620fd1c8894","blockSize":4194304,"blocks":["9bc3f0596659d6ce4be8cb8a357306ad3905c9f88ed56d3131fb4620fd1c8894"]},"offset":"4812567"},"stateMachine.js":{"size":3281,"integrity":{"algorithm":"SHA256","hash":"db5aaaa8335d98f17870721990c20f6f4c2f662898ab91af7fbd61e49d0157a1","blockSize":4194304,"blocks":["db5aaaa8335d98f17870721990c20f6f4c2f662898ab91af7fbd61e49d0157a1"]},"offset":"4815453"}}}}}}},"dist":{"files":{"index.js":{"size":29624,"integrity":{"algorithm":"SHA256","hash":"8c7fd5b1cb0fbe6516533ad7b417362a75082a8c6c546719e4e1e784dea36283","blockSize":4194304,"blocks":["8c7fd5b1cb0fbe6516533ad7b417362a75082a8c6c546719e4e1e784dea36283"]},"offset":"4818734"}}},"node_modules":{"files":{"@azure":{"files":{"core-tracing":{"files":{"LICENSE":{"size":1076,"integrity":{"algorithm":"SHA256","hash":"1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef","blockSize":4194304,"blocks":["1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef"]},"offset":"46110045"},"package.json":{"size":1930,"integrity":{"algorithm":"SHA256","hash":"e417a629a49e896880cc13cf26973189f4b84a21c5701c09c27d2779b172712a","blockSize":4194304,"blocks":["e417a629a49e896880cc13cf26973189f4b84a21c5701c09c27d2779b172712a"]},"offset":"46111121"},"dist-esm":{"files":{"src":{"files":{"createSpan.js":{"size":2846,"integrity":{"algorithm":"SHA256","hash":"c62c133f01f1f32992d0d159c9572638b3121abfd0f35573984420173d96aed8","blockSize":4194304,"blocks":["c62c133f01f1f32992d0d159c9572638b3121abfd0f35573984420173d96aed8"]},"offset":"46113051"},"index.js":{"size":471,"integrity":{"algorithm":"SHA256","hash":"f64294bc31861aa522039f7778981aad1c9432bfe64d86354e7cf664a8d89bbb","blockSize":4194304,"blocks":["f64294bc31861aa522039f7778981aad1c9432bfe64d86354e7cf664a8d89bbb"]},"offset":"46115897"},"interfaces.js":{"size":3288,"integrity":{"algorithm":"SHA256","hash":"7e741acb0fdeaac2d7672df819845a61e61a6098fc22eebac4014f0e8beee141","blockSize":4194304,"blocks":["7e741acb0fdeaac2d7672df819845a61e61a6098fc22eebac4014f0e8beee141"]},"offset":"46116368"},"utils":{"files":{"traceParentHeader.js":{"size":1641,"integrity":{"algorithm":"SHA256","hash":"fd95aa681ca4fc0566db6ec841618204a5c761c5ad818588819a27490f47360d","blockSize":4194304,"blocks":["fd95aa681ca4fc0566db6ec841618204a5c761c5ad818588819a27490f47360d"]},"offset":"46119656"}}}}}}},"dist":{"files":{"index.js":{"size":7836,"integrity":{"algorithm":"SHA256","hash":"be0c1ec7e781ab2295f0ef166cea869353f190613d11a6743f1b5dd81f1af79e","blockSize":4194304,"blocks":["be0c1ec7e781ab2295f0ef166cea869353f190613d11a6743f1b5dd81f1af79e"]},"offset":"46121297"}}}}}}}}}}},"core-paging":{"files":{"LICENSE":{"size":1076,"integrity":{"algorithm":"SHA256","hash":"1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef","blockSize":4194304,"blocks":["1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef"]},"offset":"4848358"},"package.json":{"size":1847,"integrity":{"algorithm":"SHA256","hash":"9a9d3a765028ddcc3c823bf487dc788da2ca4e587c4bc9f3c61c131fb468a7d2","blockSize":4194304,"blocks":["9a9d3a765028ddcc3c823bf487dc788da2ca4e587c4bc9f3c61c131fb468a7d2"]},"offset":"4849434"},"dist-esm":{"files":{"src":{"files":{"getPagedAsyncIterator.js":{"size":3309,"integrity":{"algorithm":"SHA256","hash":"f5cf00db97cb6df01fcf585086e732e427d6c093c9ed839958223ffbeaff4e56","blockSize":4194304,"blocks":["f5cf00db97cb6df01fcf585086e732e427d6c093c9ed839958223ffbeaff4e56"]},"offset":"4851281"},"index.js":{"size":175,"integrity":{"algorithm":"SHA256","hash":"174fcac126ccf82047629e51f37d40223be2540cc41120fb1e4edfa9989c935a","blockSize":4194304,"blocks":["174fcac126ccf82047629e51f37d40223be2540cc41120fb1e4edfa9989c935a"]},"offset":"4854590"},"models.js":{"size":120,"integrity":{"algorithm":"SHA256","hash":"10ae7a10254a0999424c7ef5aba85fae4b2f323d47f6ecb014568f4f807620be","blockSize":4194304,"blocks":["10ae7a10254a0999424c7ef5aba85fae4b2f323d47f6ecb014568f4f807620be"]},"offset":"4854765"}}}}},"dist":{"files":{"index.js":{"size":3454,"integrity":{"algorithm":"SHA256","hash":"a78abab64b91c625752c6270efa59e12fee2de59ef9d17c5ebbbcda2fee24a3c","blockSize":4194304,"blocks":["a78abab64b91c625752c6270efa59e12fee2de59ef9d17c5ebbbcda2fee24a3c"]},"offset":"4854885"}}}}},"core-rest-pipeline":{"files":{"LICENSE":{"size":1076,"integrity":{"algorithm":"SHA256","hash":"1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef","blockSize":4194304,"blocks":["1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef"]},"offset":"4858339"},"package.json":{"size":3701,"integrity":{"algorithm":"SHA256","hash":"8b00912b79f304938952a49ce01158922fd4ba7a5647331e6c7082943dd12d12","blockSize":4194304,"blocks":["8b00912b79f304938952a49ce01158922fd4ba7a5647331e6c7082943dd12d12"]},"offset":"4859415"},"dist-esm":{"files":{"src":{"files":{"accessTokenCache.js":{"size":1022,"integrity":{"algorithm":"SHA256","hash":"2dd03072e487e895fe29677dada3386fca01295eeaf7d9ef6e4ab66e1a15f84a","blockSize":4194304,"blocks":["2dd03072e487e895fe29677dada3386fca01295eeaf7d9ef6e4ab66e1a15f84a"]},"offset":"4863116"},"constants.js":{"size":193,"integrity":{"algorithm":"SHA256","hash":"3c70ee77f1383c4a6170490ee72337774d809d11b8de243581bdd3f3ef0fd38f","blockSize":4194304,"blocks":["3c70ee77f1383c4a6170490ee72337774d809d11b8de243581bdd3f3ef0fd38f"]},"offset":"4864138"},"createPipelineFromOptions.js":{"size":2021,"integrity":{"algorithm":"SHA256","hash":"264a295ed249e4ed0fe15663ce82b1c86cfa42cddae3ddb8888dd476886f17b2","blockSize":4194304,"blocks":["264a295ed249e4ed0fe15663ce82b1c86cfa42cddae3ddb8888dd476886f17b2"]},"offset":"4864331"},"defaultHttpClient.browser.js":{"size":339,"integrity":{"algorithm":"SHA256","hash":"7fdbae522c5b8a3014b93eb22ca1e82dc9e8b95ee2ef3596f25a191f28a155f0","blockSize":4194304,"blocks":["7fdbae522c5b8a3014b93eb22ca1e82dc9e8b95ee2ef3596f25a191f28a155f0"]},"offset":"4866352"},"defaultHttpClient.js":{"size":328,"integrity":{"algorithm":"SHA256","hash":"426b25778ff0b11a80cd7d743cdf23c90d0c8cf603038b4474dec83e0f365504","blockSize":4194304,"blocks":["426b25778ff0b11a80cd7d743cdf23c90d0c8cf603038b4474dec83e0f365504"]},"offset":"4866691"},"defaultHttpClient.native.js":{"size":332,"integrity":{"algorithm":"SHA256","hash":"0a8251ad3734a14c87e8a94475da483ce3fc689ae15b39eaabe7140d484f7ca4","blockSize":4194304,"blocks":["0a8251ad3734a14c87e8a94475da483ce3fc689ae15b39eaabe7140d484f7ca4"]},"offset":"4867019"},"fetchHttpClient.js":{"size":8463,"integrity":{"algorithm":"SHA256","hash":"11969fda290428b6410bf5eebf2d9a77814e0946cb1dab66c0268786dec928f7","blockSize":4194304,"blocks":["11969fda290428b6410bf5eebf2d9a77814e0946cb1dab66c0268786dec928f7"]},"offset":"4867351"},"httpHeaders.js":{"size":2895,"integrity":{"algorithm":"SHA256","hash":"7fe52284168189b390f128b7b01894d5a127d4a7c9524c4881f92e49bd70fb2d","blockSize":4194304,"blocks":["7fe52284168189b390f128b7b01894d5a127d4a7c9524c4881f92e49bd70fb2d"]},"offset":"4875814"},"index.js":{"size":1870,"integrity":{"algorithm":"SHA256","hash":"6032765d6e14e24e44996dc2125b7c2bbc6a0e75b75db4adc7bd8a26bf5d1be0","blockSize":4194304,"blocks":["6032765d6e14e24e44996dc2125b7c2bbc6a0e75b75db4adc7bd8a26bf5d1be0"]},"offset":"4878709"},"interfaces.js":{"size":124,"integrity":{"algorithm":"SHA256","hash":"78281090d6e9a9751c17e2685b604b6f18643b657c15b10fc7e8aa61117c4193","blockSize":4194304,"blocks":["78281090d6e9a9751c17e2685b604b6f18643b657c15b10fc7e8aa61117c4193"]},"offset":"4880579"},"log.js":{"size":222,"integrity":{"algorithm":"SHA256","hash":"68faef5971e11a84b985a67352432dd94b0a690498edb04905203ef516de7f2c","blockSize":4194304,"blocks":["68faef5971e11a84b985a67352432dd94b0a690498edb04905203ef516de7f2c"]},"offset":"4880703"},"nodeHttpClient.js":{"size":12651,"integrity":{"algorithm":"SHA256","hash":"8134152908d99c121877cf1a7639dd4cff9557a67e30192d9f48be1031ac3e50","blockSize":4194304,"blocks":["8134152908d99c121877cf1a7639dd4cff9557a67e30192d9f48be1031ac3e50"]},"offset":"4880925"},"pipeline.js":{"size":10125,"integrity":{"algorithm":"SHA256","hash":"628ff7713c75a8bff779f8c2b6c1dc04168b12e6a49e180e24ff69c62ed141d8","blockSize":4194304,"blocks":["628ff7713c75a8bff779f8c2b6c1dc04168b12e6a49e180e24ff69c62ed141d8"]},"offset":"4893576"},"pipelineRequest.js":{"size":1844,"integrity":{"algorithm":"SHA256","hash":"85f07d2ed8cba9812607dd53b2d06b25d1b6bfe88757fa00be35adfac856ec34","blockSize":4194304,"blocks":["85f07d2ed8cba9812607dd53b2d06b25d1b6bfe88757fa00be35adfac856ec34"]},"offset":"4903701"},"restError.js":{"size":1468,"integrity":{"algorithm":"SHA256","hash":"be25a97a12dee516d161dafd9ca2c5f4d3b96c7756ad32f6321b5d9dae0e81b6","blockSize":4194304,"blocks":["be25a97a12dee516d161dafd9ca2c5f4d3b96c7756ad32f6321b5d9dae0e81b6"]},"offset":"4905545"},"xhrHttpClient.js":{"size":7004,"integrity":{"algorithm":"SHA256","hash":"56484e9f7f4d2d6775db6294ec4f757d26c88199d611345b950a62203fb0bd41","blockSize":4194304,"blocks":["56484e9f7f4d2d6775db6294ec4f757d26c88199d611345b950a62203fb0bd41"]},"offset":"4907013"},"util":{"files":{"helpers.js":{"size":2415,"integrity":{"algorithm":"SHA256","hash":"89784ca549dd5244f8c002a79728d0e7f6e30f83c9a4d1df709b23dcff13869f","blockSize":4194304,"blocks":["89784ca549dd5244f8c002a79728d0e7f6e30f83c9a4d1df709b23dcff13869f"]},"offset":"4914017"},"inspect.browser.js":{"size":144,"integrity":{"algorithm":"SHA256","hash":"d48a597c28b1c63d43382a9b82b4ce1c606786a9a44813cf4bbea375c1d7a394","blockSize":4194304,"blocks":["d48a597c28b1c63d43382a9b82b4ce1c606786a9a44813cf4bbea375c1d7a394"]},"offset":"4916432"},"inspect.js":{"size":180,"integrity":{"algorithm":"SHA256","hash":"837e76867937ee639229b70afd6e5816a2d07f714885d66006494abe59b2b7e7","blockSize":4194304,"blocks":["837e76867937ee639229b70afd6e5816a2d07f714885d66006494abe59b2b7e7"]},"offset":"4916576"},"sanitizer.js":{"size":4556,"integrity":{"algorithm":"SHA256","hash":"d881a0c28c0d67f8a1e1ad24e0d3bf71cb8e399f0517785ee1f32d5f53f879cb","blockSize":4194304,"blocks":["d881a0c28c0d67f8a1e1ad24e0d3bf71cb8e399f0517785ee1f32d5f53f879cb"]},"offset":"4916756"},"tokenCycler.js":{"size":6032,"integrity":{"algorithm":"SHA256","hash":"d2147a8345acb238de16a9a9e338a008d4330c1c5a4cfa6e162b5efdd2b9a7f0","blockSize":4194304,"blocks":["d2147a8345acb238de16a9a9e338a008d4330c1c5a4cfa6e162b5efdd2b9a7f0"]},"offset":"4921312"},"userAgent.js":{"size":926,"integrity":{"algorithm":"SHA256","hash":"548c46aff06b754fe69f603d8ea8822fd51a25502abad248643a53d99135854a","blockSize":4194304,"blocks":["548c46aff06b754fe69f603d8ea8822fd51a25502abad248643a53d99135854a"]},"offset":"4927344"},"userAgentPlatform.browser.js":{"size":487,"integrity":{"algorithm":"SHA256","hash":"c23b19e1ba5e8dfcdd18725d049db59db171c17a48ded0b45feece27e582cc85","blockSize":4194304,"blocks":["c23b19e1ba5e8dfcdd18725d049db59db171c17a48ded0b45feece27e582cc85"]},"offset":"4928270"},"userAgentPlatform.js":{"size":402,"integrity":{"algorithm":"SHA256","hash":"705c13fd15623bf053b7b25004ea2e0c0bd392714f9346a1379b75f52d4eec2a","blockSize":4194304,"blocks":["705c13fd15623bf053b7b25004ea2e0c0bd392714f9346a1379b75f52d4eec2a"]},"offset":"4928757"},"userAgentPlatform.native.js":{"size":709,"integrity":{"algorithm":"SHA256","hash":"95a2aa178d935b239e4982b6f6b22a4d15d4c1a3c459d9e96fad5bb029ec801f","blockSize":4194304,"blocks":["95a2aa178d935b239e4982b6f6b22a4d15d4c1a3c459d9e96fad5bb029ec801f"]},"offset":"4929159"},"uuid.js":{"size":296,"integrity":{"algorithm":"SHA256","hash":"dd41816a4fe778adc654418f7ce4b2b0bf130ec76220c971e9d154a1eb407e2e","blockSize":4194304,"blocks":["dd41816a4fe778adc654418f7ce4b2b0bf130ec76220c971e9d154a1eb407e2e"]},"offset":"4929868"}}},"retryStrategies":{"files":{"exponentialRetryStrategy.js":{"size":3296,"integrity":{"algorithm":"SHA256","hash":"7f5e3dc7fdd69be8c5130df4050aea8d180cc4aec77730b7d84c8f849e582d63","blockSize":4194304,"blocks":["7f5e3dc7fdd69be8c5130df4050aea8d180cc4aec77730b7d84c8f849e582d63"]},"offset":"4930164"},"retryStrategy.js":{"size":127,"integrity":{"algorithm":"SHA256","hash":"142decf67c1181f136cae9bbc40082d0bf08ff2ec0abe956fb108a42c4351c1e","blockSize":4194304,"blocks":["142decf67c1181f136cae9bbc40082d0bf08ff2ec0abe956fb108a42c4351c1e"]},"offset":"4933460"},"throttlingRetryStrategy.js":{"size":3092,"integrity":{"algorithm":"SHA256","hash":"bf4c23a9f289d8d6250efd0b7ac01ac644dc1e476e292a258e0c154bcbfaa8d8","blockSize":4194304,"blocks":["bf4c23a9f289d8d6250efd0b7ac01ac644dc1e476e292a258e0c154bcbfaa8d8"]},"offset":"4933587"}}},"policies":{"files":{"bearerTokenAuthenticationPolicy.js":{"size":4722,"integrity":{"algorithm":"SHA256","hash":"e58f3d7c7f141c141690957b16d2f3828e254848f4ec1c69cd9924325cfb9f13","blockSize":4194304,"blocks":["e58f3d7c7f141c141690957b16d2f3828e254848f4ec1c69cd9924325cfb9f13"]},"offset":"4936679"},"decompressResponsePolicy.browser.js":{"size":582,"integrity":{"algorithm":"SHA256","hash":"395670f75943d0967c1ce02bd71b8d492300dac0aee3bbc42c3ee7fcf55fdea9","blockSize":4194304,"blocks":["395670f75943d0967c1ce02bd71b8d492300dac0aee3bbc42c3ee7fcf55fdea9"]},"offset":"4941401"},"decompressResponsePolicy.js":{"size":809,"integrity":{"algorithm":"SHA256","hash":"ed49a3371ae655fe32f9fb1c22f5c21ea980e7a18c2869887dee5aa99a188df7","blockSize":4194304,"blocks":["ed49a3371ae655fe32f9fb1c22f5c21ea980e7a18c2869887dee5aa99a188df7"]},"offset":"4941983"},"defaultRetryPolicy.js":{"size":1191,"integrity":{"algorithm":"SHA256","hash":"da8ad399d597357f12db47a63307216568150caa9f810f24d2fef05105596e23","blockSize":4194304,"blocks":["da8ad399d597357f12db47a63307216568150caa9f810f24d2fef05105596e23"]},"offset":"4942792"},"exponentialRetryPolicy.js":{"size":941,"integrity":{"algorithm":"SHA256","hash":"af923da8e8ec868ec77e2f44cb8c6c18a64811f88b1f530091ef0c9f6808fa15","blockSize":4194304,"blocks":["af923da8e8ec868ec77e2f44cb8c6c18a64811f88b1f530091ef0c9f6808fa15"]},"offset":"4943983"},"formDataPolicy.browser.js":{"size":1742,"integrity":{"algorithm":"SHA256","hash":"82396e192f72257d92d270450532c373447cbf4490d422da2666c5134a3f47c7","blockSize":4194304,"blocks":["82396e192f72257d92d270450532c373447cbf4490d422da2666c5134a3f47c7"]},"offset":"4944924"},"formDataPolicy.js":{"size":2649,"integrity":{"algorithm":"SHA256","hash":"00005dcb153deeede0f89e1433e05e7a78fff08f1a7fd5af0f0cfd3f0ca14a4a","blockSize":4194304,"blocks":["00005dcb153deeede0f89e1433e05e7a78fff08f1a7fd5af0f0cfd3f0ca14a4a"]},"offset":"4946666"},"logPolicy.js":{"size":1236,"integrity":{"algorithm":"SHA256","hash":"7b7ef738b343841ff6de8cd05fe9b03aecb758b9102bed714b4512a3c08bd26d","blockSize":4194304,"blocks":["7b7ef738b343841ff6de8cd05fe9b03aecb758b9102bed714b4512a3c08bd26d"]},"offset":"4949315"},"ndJsonPolicy.js":{"size":869,"integrity":{"algorithm":"SHA256","hash":"331560c6f1480d204572a4c026a1db7015c1c97e6afb08c7c83cd04d9cef9456","blockSize":4194304,"blocks":["331560c6f1480d204572a4c026a1db7015c1c97e6afb08c7c83cd04d9cef9456"]},"offset":"4950551"},"proxyPolicy.browser.js":{"size":802,"integrity":{"algorithm":"SHA256","hash":"01cebb1e83d4aa1e592ffceb374e085ff5ebece687c3275fcedf20152328dc1d","blockSize":4194304,"blocks":["01cebb1e83d4aa1e592ffceb374e085ff5ebece687c3275fcedf20152328dc1d"]},"offset":"4951420"},"proxyPolicy.js":{"size":7075,"integrity":{"algorithm":"SHA256","hash":"a7e21fe7f4787cf9a7f9501a69570a7f4a20125f801f43d41aad2d77b7c458a5","blockSize":4194304,"blocks":["a7e21fe7f4787cf9a7f9501a69570a7f4a20125f801f43d41aad2d77b7c458a5"]},"offset":"4952222"},"redirectPolicy.js":{"size":1993,"integrity":{"algorithm":"SHA256","hash":"98d9f149b7252be116145a1bb45872770298ef629e0472b84703685a34f16094","blockSize":4194304,"blocks":["98d9f149b7252be116145a1bb45872770298ef629e0472b84703685a34f16094"]},"offset":"4959297"},"retryPolicy.js":{"size":5471,"integrity":{"algorithm":"SHA256","hash":"50a84c9428da356bce307365ef84eca10b5d69d678b5d6233b912965fcbbfdea","blockSize":4194304,"blocks":["50a84c9428da356bce307365ef84eca10b5d69d678b5d6233b912965fcbbfdea"]},"offset":"4961290"},"setClientRequestIdPolicy.js":{"size":919,"integrity":{"algorithm":"SHA256","hash":"ed9ba538149a7bfe6722509f655f2e5c2e17fe4bff5e0a8b81a651edf6fb9a0c","blockSize":4194304,"blocks":["ed9ba538149a7bfe6722509f655f2e5c2e17fe4bff5e0a8b81a651edf6fb9a0c"]},"offset":"4966761"},"systemErrorRetryPolicy.js":{"size":1114,"integrity":{"algorithm":"SHA256","hash":"423bad56dcfd6ebee94178b716a07d165aa8a21a3f9ba174c210fe127d725cd7","blockSize":4194304,"blocks":["423bad56dcfd6ebee94178b716a07d165aa8a21a3f9ba174c210fe127d725cd7"]},"offset":"4967680"},"throttlingRetryPolicy.js":{"size":1241,"integrity":{"algorithm":"SHA256","hash":"fbe7daa7f783a3b145c84fff488f1a7235d6a7ccd19d7920d29238dafaaa871d","blockSize":4194304,"blocks":["fbe7daa7f783a3b145c84fff488f1a7235d6a7ccd19d7920d29238dafaaa871d"]},"offset":"4968794"},"tlsPolicy.js":{"size":666,"integrity":{"algorithm":"SHA256","hash":"79c2f626451e02b1ccb59eeaffe49490c1e1cfca11aeabe8e79d0218a4c3d2df","blockSize":4194304,"blocks":["79c2f626451e02b1ccb59eeaffe49490c1e1cfca11aeabe8e79d0218a4c3d2df"]},"offset":"4970035"},"tracingPolicy.js":{"size":4444,"integrity":{"algorithm":"SHA256","hash":"1f4c8b0e76cb32b2aaccba3d48d77688f792ad2405158035aab9a7c67f4f2e63","blockSize":4194304,"blocks":["1f4c8b0e76cb32b2aaccba3d48d77688f792ad2405158035aab9a7c67f4f2e63"]},"offset":"4970701"},"userAgentPolicy.js":{"size":947,"integrity":{"algorithm":"SHA256","hash":"10513a46dd0ecfebfb8a4bbdb55f1f8cca439cd9988b8afa5cdfc8aff9f9b1c6","blockSize":4194304,"blocks":["10513a46dd0ecfebfb8a4bbdb55f1f8cca439cd9988b8afa5cdfc8aff9f9b1c6"]},"offset":"4975145"}}}}}}},"dist":{"files":{"index.js":{"size":86706,"integrity":{"algorithm":"SHA256","hash":"eefdffaba461cc2a0c5f5617adc8a077c096c7b20ec5b06fc553f733b715619b","blockSize":4194304,"blocks":["eefdffaba461cc2a0c5f5617adc8a077c096c7b20ec5b06fc553f733b715619b"]},"offset":"4976092"}}},"node_modules":{"files":{"form-data":{"files":{"License":{"size":1118,"integrity":{"algorithm":"SHA256","hash":"e5b780d4f38d1d3328e3e53186c4e62d3fa149ea6f2bacd5de5ad0c30ac85343","blockSize":4194304,"blocks":["e5b780d4f38d1d3328e3e53186c4e62d3fa149ea6f2bacd5de5ad0c30ac85343"]},"offset":"46129133"},"README.md.bak":{"size":12070,"integrity":{"algorithm":"SHA256","hash":"c582a1729e728332fc30b1f9d5a87c52c47e107cc2797a8c93055ea87b1e9fe9","blockSize":4194304,"blocks":["c582a1729e728332fc30b1f9d5a87c52c47e107cc2797a8c93055ea87b1e9fe9"]},"offset":"46130251"},"package.json":{"size":1268,"integrity":{"algorithm":"SHA256","hash":"c2523c5dd90f778f0751d11632c567e8db5ee76003bf4f42f069005471b4226c","blockSize":4194304,"blocks":["c2523c5dd90f778f0751d11632c567e8db5ee76003bf4f42f069005471b4226c"]},"offset":"46142321"},"lib":{"files":{"browser.js":{"size":101,"integrity":{"algorithm":"SHA256","hash":"cf5b0957442886388f424790b303b5b855d7ef227f68163114aae79f6b212f37","blockSize":4194304,"blocks":["cf5b0957442886388f424790b303b5b855d7ef227f68163114aae79f6b212f37"]},"offset":"46143589"},"form_data.js":{"size":13715,"integrity":{"algorithm":"SHA256","hash":"65f1e9a852f2c1dc42db54e8b2a13dc4b65a2e26c8076cf19116ac93fa091bd6","blockSize":4194304,"blocks":["65f1e9a852f2c1dc42db54e8b2a13dc4b65a2e26c8076cf19116ac93fa091bd6"]},"offset":"46143690"},"populate.js":{"size":177,"integrity":{"algorithm":"SHA256","hash":"0a273800c22bc3600522aa951135210817eaf3e059d3cf1fbd7a5ba0dc5cb576","blockSize":4194304,"blocks":["0a273800c22bc3600522aa951135210817eaf3e059d3cf1fbd7a5ba0dc5cb576"]},"offset":"46157405"}}}}},"uuid":{"files":{"CONTRIBUTING.md":{"size":513,"integrity":{"algorithm":"SHA256","hash":"99b5cc0a56af12be90a669fdffc9f5a721236d2ede0d92e1171bb7097dd9fdd7","blockSize":4194304,"blocks":["99b5cc0a56af12be90a669fdffc9f5a721236d2ede0d92e1171bb7097dd9fdd7"]},"offset":"46157582"},"LICENSE.md":{"size":1109,"integrity":{"algorithm":"SHA256","hash":"beaa6b04fb82e41dd2ad679e19e27953afb5999b1abbb455b6564e78ebfeb332","blockSize":4194304,"blocks":["beaa6b04fb82e41dd2ad679e19e27953afb5999b1abbb455b6564e78ebfeb332"]},"offset":"46158095"},"package.json":{"size":2601,"integrity":{"algorithm":"SHA256","hash":"c33d17ad3546ea553db5df68edb1ac9a794e2e57fc99f838a9d78434ae009abc","blockSize":4194304,"blocks":["c33d17ad3546ea553db5df68edb1ac9a794e2e57fc99f838a9d78434ae009abc"]},"offset":"46159204"},"wrapper.mjs":{"size":323,"integrity":{"algorithm":"SHA256","hash":"f6835608d7c4b422bb11ab4689bcf91e166ecbbd63aa3fa2b83c448835cd80a5","blockSize":4194304,"blocks":["f6835608d7c4b422bb11ab4689bcf91e166ecbbd63aa3fa2b83c448835cd80a5"]},"offset":"46161805"},"dist":{"files":{"index.js":{"size":1765,"integrity":{"algorithm":"SHA256","hash":"069a2230d395723583c8e45a7c0fee2622af2fbd08dc35f81e4d57836122e59f","blockSize":4194304,"blocks":["069a2230d395723583c8e45a7c0fee2622af2fbd08dc35f81e4d57836122e59f"]},"offset":"46162128"},"md5-browser.js":{"size":7015,"integrity":{"algorithm":"SHA256","hash":"21a4e167b7ae498e8f3778bac8d7330929099006afca6adfe76b626e0e41d795","blockSize":4194304,"blocks":["21a4e167b7ae498e8f3778bac8d7330929099006afca6adfe76b626e0e41d795"]},"offset":"46163893"},"md5.js":{"size":550,"integrity":{"algorithm":"SHA256","hash":"6ca6276ff35f19ea462bb8c9d6d290994fa9980fc775deb741811ef947196ced","blockSize":4194304,"blocks":["6ca6276ff35f19ea462bb8c9d6d290994fa9980fc775deb741811ef947196ced"]},"offset":"46170908"},"nil.js":{"size":188,"integrity":{"algorithm":"SHA256","hash":"7395bd919bd1309bcbced245a59dfc6b077f97992a482af2537343e558795b1f","blockSize":4194304,"blocks":["7395bd919bd1309bcbced245a59dfc6b077f97992a482af2537343e558795b1f"]},"offset":"46171458"},"parse.js":{"size":1380,"integrity":{"algorithm":"SHA256","hash":"1a87ed6a6bb0a3edbe266ca55aaf1c5af8e963ee9486f74b59cfd615280b21b4","blockSize":4194304,"blocks":["1a87ed6a6bb0a3edbe266ca55aaf1c5af8e963ee9486f74b59cfd615280b21b4"]},"offset":"46171646"},"regex.js":{"size":267,"integrity":{"algorithm":"SHA256","hash":"acc4c54d987f100093097f4f156ff245394c39d1332eb2114d7e40db00bd6ddd","blockSize":4194304,"blocks":["acc4c54d987f100093097f4f156ff245394c39d1332eb2114d7e40db00bd6ddd"]},"offset":"46173026"},"rng-browser.js":{"size":1131,"integrity":{"algorithm":"SHA256","hash":"4c88edf4fd7fae3bf84bad34750a55f706c8e522a924af6c6ad22839e3718dd6","blockSize":4194304,"blocks":["4c88edf4fd7fae3bf84bad34750a55f706c8e522a924af6c6ad22839e3718dd6"]},"offset":"46173293"},"rng.js":{"size":549,"integrity":{"algorithm":"SHA256","hash":"fdde4350fc69c07bfed4178eedf6121a56264744207d9f5c8f3e5b1b913dbb06","blockSize":4194304,"blocks":["fdde4350fc69c07bfed4178eedf6121a56264744207d9f5c8f3e5b1b913dbb06"]},"offset":"46174424"},"sha1-browser.js":{"size":2609,"integrity":{"algorithm":"SHA256","hash":"32982388b377b06298f59db97c98077f06e6b4f29fe284d427195a358a72f19e","blockSize":4194304,"blocks":["32982388b377b06298f59db97c98077f06e6b4f29fe284d427195a358a72f19e"]},"offset":"46174973"},"sha1.js":{"size":553,"integrity":{"algorithm":"SHA256","hash":"a9eda407444a3f68a0a4db0373346df18f583abbde2c4bf2b3fbc6d73be2c75e","blockSize":4194304,"blocks":["a9eda407444a3f68a0a4db0373346df18f583abbde2c4bf2b3fbc6d73be2c75e"]},"offset":"46177582"},"stringify.js":{"size":1667,"integrity":{"algorithm":"SHA256","hash":"85a70b8982f37ddb434816dcda7628b0319e5a90d46ac6bc9b08d4d15d6a7650","blockSize":4194304,"blocks":["85a70b8982f37ddb434816dcda7628b0319e5a90d46ac6bc9b08d4d15d6a7650"]},"offset":"46178135"},"uuid-bin.js":{"size":2030,"integrity":{"algorithm":"SHA256","hash":"7c60635cf5a963da72e35292bcbfa7f7221b08374d69d75103fa82da9d950102","blockSize":4194304,"blocks":["7c60635cf5a963da72e35292bcbfa7f7221b08374d69d75103fa82da9d950102"]},"offset":"46179802"},"v1.js":{"size":3618,"integrity":{"algorithm":"SHA256","hash":"6dad9c2e6565ad6b478fba7b2ace95350df56a15a72920e72ac64c3a2691d665","blockSize":4194304,"blocks":["6dad9c2e6565ad6b478fba7b2ace95350df56a15a72920e72ac64c3a2691d665"]},"offset":"46181832"},"v3.js":{"size":414,"integrity":{"algorithm":"SHA256","hash":"95e0c6fa204355c6ef7dbac5720a3ef5239454ed6820674dfcc143a55ea6c459","blockSize":4194304,"blocks":["95e0c6fa204355c6ef7dbac5720a3ef5239454ed6820674dfcc143a55ea6c459"]},"offset":"46185450"},"v35.js":{"size":2008,"integrity":{"algorithm":"SHA256","hash":"ababd96e6f8b1fca9bb58f43220473f7bd59fbc81b3acb212df924813544283f","blockSize":4194304,"blocks":["ababd96e6f8b1fca9bb58f43220473f7bd59fbc81b3acb212df924813544283f"]},"offset":"46185864"},"v4.js":{"size":860,"integrity":{"algorithm":"SHA256","hash":"a9e30e8692dde9dec39a3ef716ef8e650e321813fa9d137f16d27666b9ad96ef","blockSize":4194304,"blocks":["a9e30e8692dde9dec39a3ef716ef8e650e321813fa9d137f16d27666b9ad96ef"]},"offset":"46187872"},"v5.js":{"size":417,"integrity":{"algorithm":"SHA256","hash":"d15c31975f31b9abf6a195e70a3dca0843a9257cb51b49214cf7a9f4ed30fc5a","blockSize":4194304,"blocks":["d15c31975f31b9abf6a195e70a3dca0843a9257cb51b49214cf7a9f4ed30fc5a"]},"offset":"46188732"},"validate.js":{"size":410,"integrity":{"algorithm":"SHA256","hash":"5497d9adffd73474cf379d3e1b76b28698e408124a0726d54e88282500378502","blockSize":4194304,"blocks":["5497d9adffd73474cf379d3e1b76b28698e408124a0726d54e88282500378502"]},"offset":"46189149"},"version.js":{"size":474,"integrity":{"algorithm":"SHA256","hash":"cad5f0ecd518983e310856cafd54d4d0de0b9db3c8e3bd97ec8e773ef63de6e8","blockSize":4194304,"blocks":["cad5f0ecd518983e310856cafd54d4d0de0b9db3c8e3bd97ec8e773ef63de6e8"]},"offset":"46189559"},"umd":{"files":{"uuid.min.js":{"size":8160,"integrity":{"algorithm":"SHA256","hash":"c5df6d9704bdada96df0770523058f395192ee9d1fe13880eb1d57dfe6417533","blockSize":4194304,"blocks":["c5df6d9704bdada96df0770523058f395192ee9d1fe13880eb1d57dfe6417533"]},"offset":"46190033"},"uuidNIL.min.js":{"size":280,"integrity":{"algorithm":"SHA256","hash":"18c98395b8a11f83924c22af88573b8bbe3a5cf4fe7864364e6902e49ac3d7fd","blockSize":4194304,"blocks":["18c98395b8a11f83924c22af88573b8bbe3a5cf4fe7864364e6902e49ac3d7fd"]},"offset":"46198193"},"uuidParse.min.js":{"size":883,"integrity":{"algorithm":"SHA256","hash":"555a6f1b1f49532a96c4235ab4de7c1e5fec9b8724bcf1a1247ba4eb33116af2","blockSize":4194304,"blocks":["555a6f1b1f49532a96c4235ab4de7c1e5fec9b8724bcf1a1247ba4eb33116af2"]},"offset":"46198473"},"uuidStringify.min.js":{"size":829,"integrity":{"algorithm":"SHA256","hash":"9b6db819fecb2f40d9fa5ac8c892218004b3a633a1ec29d7a873801a7eade28f","blockSize":4194304,"blocks":["9b6db819fecb2f40d9fa5ac8c892218004b3a633a1ec29d7a873801a7eade28f"]},"offset":"46199356"},"uuidValidate.min.js":{"size":420,"integrity":{"algorithm":"SHA256","hash":"45a1c7d7618c149522c8f8085675e6707381f6106ca414c294b3e6169065cf21","blockSize":4194304,"blocks":["45a1c7d7618c149522c8f8085675e6707381f6106ca414c294b3e6169065cf21"]},"offset":"46200185"},"uuidVersion.min.js":{"size":506,"integrity":{"algorithm":"SHA256","hash":"c0a99b310a43528b5e4f59c87dcc489732bf8c4dd3a367c34cf882a88a3cecca","blockSize":4194304,"blocks":["c0a99b310a43528b5e4f59c87dcc489732bf8c4dd3a367c34cf882a88a3cecca"]},"offset":"46200605"},"uuidv1.min.js":{"size":2020,"integrity":{"algorithm":"SHA256","hash":"9963a427c7b05e1ea3c923cfed992cfea294e980e42d754ba593cec66d285a07","blockSize":4194304,"blocks":["9963a427c7b05e1ea3c923cfed992cfea294e980e42d754ba593cec66d285a07"]},"offset":"46201111"},"uuidv3.min.js":{"size":5145,"integrity":{"algorithm":"SHA256","hash":"2d31a5a7ef824371df6f91ad677cd137ca9b51a529be40873f9b60009c550932","blockSize":4194304,"blocks":["2d31a5a7ef824371df6f91ad677cd137ca9b51a529be40873f9b60009c550932"]},"offset":"46203131"},"uuidv4.min.js":{"size":1366,"integrity":{"algorithm":"SHA256","hash":"4bbb806e743e21bc9f97b62fc0564e0889b7f31ee9d48c3f2b85d4e00fe629cc","blockSize":4194304,"blocks":["4bbb806e743e21bc9f97b62fc0564e0889b7f31ee9d48c3f2b85d4e00fe629cc"]},"offset":"46208276"},"uuidv5.min.js":{"size":3267,"integrity":{"algorithm":"SHA256","hash":"1a444d14f3a6f8952bfc827be5c52dc7367c99e5bf30a5e5102f0b4ad420df76","blockSize":4194304,"blocks":["1a444d14f3a6f8952bfc827be5c52dc7367c99e5bf30a5e5102f0b4ad420df76"]},"offset":"46209642"}}},"esm-node":{"files":{"index.js":{"size":412,"integrity":{"algorithm":"SHA256","hash":"3efb8df8c64379c5acbaf0b70ce1a1906375f4b53901b7e90a26863ead50fc30","blockSize":4194304,"blocks":["3efb8df8c64379c5acbaf0b70ce1a1906375f4b53901b7e90a26863ead50fc30"]},"offset":"46212909"},"md5.js":{"size":281,"integrity":{"algorithm":"SHA256","hash":"2313329bf3ada8cd17046afeefa761bd7daa3821e140fc55d8c2b94ee7760ed4","blockSize":4194304,"blocks":["2313329bf3ada8cd17046afeefa761bd7daa3821e140fc55d8c2b94ee7760ed4"]},"offset":"46213321"},"nil.js":{"size":54,"integrity":{"algorithm":"SHA256","hash":"40036d4ffe78154827eedb9c1b3f59f660722907389725842bbc178ba28d2241","blockSize":4194304,"blocks":["40036d4ffe78154827eedb9c1b3f59f660722907389725842bbc178ba28d2241"]},"offset":"46213602"},"parse.js":{"size":1106,"integrity":{"algorithm":"SHA256","hash":"2743e5b696fb15df389cf3b1a242e56780f7941bbefc23465529d30e851b80f5","blockSize":4194304,"blocks":["2743e5b696fb15df389cf3b1a242e56780f7941bbefc23465529d30e851b80f5"]},"offset":"46213656"},"regex.js":{"size":133,"integrity":{"algorithm":"SHA256","hash":"9a546763c108d7eeb7283ce26c7a6845a44bd67132005eb32fd1feeca49d1b3f","blockSize":4194304,"blocks":["9a546763c108d7eeb7283ce26c7a6845a44bd67132005eb32fd1feeca49d1b3f"]},"offset":"46214762"},"rng.js":{"size":323,"integrity":{"algorithm":"SHA256","hash":"ff667aff9367a48cc713d36764cea05bd30e8ba05392430571c54734fc9fde03","blockSize":4194304,"blocks":["ff667aff9367a48cc713d36764cea05bd30e8ba05392430571c54734fc9fde03"]},"offset":"46214895"},"sha1.js":{"size":284,"integrity":{"algorithm":"SHA256","hash":"6094b056716c8a37b9f2da365d6c8a17f754543d966411d01dfebd762c94547e","blockSize":4194304,"blocks":["6094b056716c8a37b9f2da365d6c8a17f754543d966411d01dfebd762c94547e"]},"offset":"46215218"},"stringify.js":{"size":1393,"integrity":{"algorithm":"SHA256","hash":"224279f45e9b30fca5de4fcf8620aa00ac3c8bef89fc073bfb36b83272bd1556","blockSize":4194304,"blocks":["224279f45e9b30fca5de4fcf8620aa00ac3c8bef89fc073bfb36b83272bd1556"]},"offset":"46215502"},"v1.js":{"size":3306,"integrity":{"algorithm":"SHA256","hash":"4cbdb6e889c57896cc8dd35f299aa05a00ff7a43b875a187f87c95e7bb2c3f0f","blockSize":4194304,"blocks":["4cbdb6e889c57896cc8dd35f299aa05a00ff7a43b875a187f87c95e7bb2c3f0f"]},"offset":"46216895"},"v3.js":{"size":107,"integrity":{"algorithm":"SHA256","hash":"65b963f24922d433fdc592aa4e2764d10fad59351015bbe5fce0830fe389794a","blockSize":4194304,"blocks":["65b963f24922d433fdc592aa4e2764d10fad59351015bbe5fce0830fe389794a"]},"offset":"46220201"},"v35.js":{"size":1663,"integrity":{"algorithm":"SHA256","hash":"56a358587ded91ef272d54a4937e6f59193cd11b51710503859083feb8d6f20f","blockSize":4194304,"blocks":["56a358587ded91ef272d54a4937e6f59193cd11b51710503859083feb8d6f20f"]},"offset":"46220308"},"v4.js":{"size":546,"integrity":{"algorithm":"SHA256","hash":"44d2fedb301801c7c60e45934eaa13435614e3d65aedf8759775890de75bed69","blockSize":4194304,"blocks":["44d2fedb301801c7c60e45934eaa13435614e3d65aedf8759775890de75bed69"]},"offset":"46221971"},"v5.js":{"size":110,"integrity":{"algorithm":"SHA256","hash":"e9e8d82440c23fc3de56f8acd5a15b1ca2daad6bf6d2e7c4a4b39d04384206d3","blockSize":4194304,"blocks":["e9e8d82440c23fc3de56f8acd5a15b1ca2daad6bf6d2e7c4a4b39d04384206d3"]},"offset":"46222517"},"validate.js":{"size":141,"integrity":{"algorithm":"SHA256","hash":"4a782f41298704c0029c245203430b3e4511365bf05a3addacdbae59d9c664fa","blockSize":4194304,"blocks":["4a782f41298704c0029c245203430b3e4511365bf05a3addacdbae59d9c664fa"]},"offset":"46222627"},"version.js":{"size":200,"integrity":{"algorithm":"SHA256","hash":"84d1c2f759c39dbf8b26a359b0d68ba9fcc68bf8c3612b8b1bb0df31dfb2e693","blockSize":4194304,"blocks":["84d1c2f759c39dbf8b26a359b0d68ba9fcc68bf8c3612b8b1bb0df31dfb2e693"]},"offset":"46222768"}}},"esm-browser":{"files":{"index.js":{"size":412,"integrity":{"algorithm":"SHA256","hash":"3efb8df8c64379c5acbaf0b70ce1a1906375f4b53901b7e90a26863ead50fc30","blockSize":4194304,"blocks":["3efb8df8c64379c5acbaf0b70ce1a1906375f4b53901b7e90a26863ead50fc30"]},"offset":"46222968"},"md5.js":{"size":6852,"integrity":{"algorithm":"SHA256","hash":"705eb0feeda58a88a5b887cf580e38bb9979dec642dd663b63c9dc485e956728","blockSize":4194304,"blocks":["705eb0feeda58a88a5b887cf580e38bb9979dec642dd663b63c9dc485e956728"]},"offset":"46223380"},"nil.js":{"size":54,"integrity":{"algorithm":"SHA256","hash":"40036d4ffe78154827eedb9c1b3f59f660722907389725842bbc178ba28d2241","blockSize":4194304,"blocks":["40036d4ffe78154827eedb9c1b3f59f660722907389725842bbc178ba28d2241"]},"offset":"46230232"},"parse.js":{"size":1104,"integrity":{"algorithm":"SHA256","hash":"1efd0e1dd5d7d205a3405f5aee39029ea60bece8a893b2bf742a16c6a51246a6","blockSize":4194304,"blocks":["1efd0e1dd5d7d205a3405f5aee39029ea60bece8a893b2bf742a16c6a51246a6"]},"offset":"46230286"},"regex.js":{"size":133,"integrity":{"algorithm":"SHA256","hash":"9a546763c108d7eeb7283ce26c7a6845a44bd67132005eb32fd1feeca49d1b3f","blockSize":4194304,"blocks":["9a546763c108d7eeb7283ce26c7a6845a44bd67132005eb32fd1feeca49d1b3f"]},"offset":"46231390"},"rng.js":{"size":1040,"integrity":{"algorithm":"SHA256","hash":"0e1abdc73fa79ff64006ec6675b06a193f55eac039595cc3867e6567e46f2dd7","blockSize":4194304,"blocks":["0e1abdc73fa79ff64006ec6675b06a193f55eac039595cc3867e6567e46f2dd7"]},"offset":"46231523"},"sha1.js":{"size":2488,"integrity":{"algorithm":"SHA256","hash":"0b777c8796a7e0954a47bc5b7d612f89d7cd9218106881a9b4931f8f882fd056","blockSize":4194304,"blocks":["0b777c8796a7e0954a47bc5b7d612f89d7cd9218106881a9b4931f8f882fd056"]},"offset":"46232563"},"stringify.js":{"size":1463,"integrity":{"algorithm":"SHA256","hash":"b3e05d40408725c571660f7f1bfdb1b20fde769c5142f23273a95815b2ca5d01","blockSize":4194304,"blocks":["b3e05d40408725c571660f7f1bfdb1b20fde769c5142f23273a95815b2ca5d01"]},"offset":"46235051"},"v1.js":{"size":3296,"integrity":{"algorithm":"SHA256","hash":"746184938af3d1e32fb432711c135d95305f839d94a5e90dd23438435a8342b6","blockSize":4194304,"blocks":["746184938af3d1e32fb432711c135d95305f839d94a5e90dd23438435a8342b6"]},"offset":"46236514"},"v3.js":{"size":105,"integrity":{"algorithm":"SHA256","hash":"337d2b9ef80229c44c240e4218aa324b129d792701432061946ee4154e30080a","blockSize":4194304,"blocks":["337d2b9ef80229c44c240e4218aa324b129d792701432061946ee4154e30080a"]},"offset":"46239810"},"v35.js":{"size":1657,"integrity":{"algorithm":"SHA256","hash":"c418ede8cd4d61f12ae553adac55b1afa2cbd8c8659c31dd657c1decbb36314b","blockSize":4194304,"blocks":["c418ede8cd4d61f12ae553adac55b1afa2cbd8c8659c31dd657c1decbb36314b"]},"offset":"46239915"},"v4.js":{"size":544,"integrity":{"algorithm":"SHA256","hash":"971f818a59ef77ee2c213dfea32dc4494823f9b8bd45be19fd81cf49b09f44e5","blockSize":4194304,"blocks":["971f818a59ef77ee2c213dfea32dc4494823f9b8bd45be19fd81cf49b09f44e5"]},"offset":"46241572"},"v5.js":{"size":108,"integrity":{"algorithm":"SHA256","hash":"07e6d11989b44edbe92ccb697febb65225ebad32fb2f9c91c5b571a6f5a3c4df","blockSize":4194304,"blocks":["07e6d11989b44edbe92ccb697febb65225ebad32fb2f9c91c5b571a6f5a3c4df"]},"offset":"46242116"},"validate.js":{"size":141,"integrity":{"algorithm":"SHA256","hash":"4a782f41298704c0029c245203430b3e4511365bf05a3addacdbae59d9c664fa","blockSize":4194304,"blocks":["4a782f41298704c0029c245203430b3e4511365bf05a3addacdbae59d9c664fa"]},"offset":"46242224"},"version.js":{"size":200,"integrity":{"algorithm":"SHA256","hash":"84d1c2f759c39dbf8b26a359b0d68ba9fcc68bf8c3612b8b1bb0df31dfb2e693","blockSize":4194304,"blocks":["84d1c2f759c39dbf8b26a359b0d68ba9fcc68bf8c3612b8b1bb0df31dfb2e693"]},"offset":"46242365"}}},"bin":{"files":{"uuid":{"size":44,"integrity":{"algorithm":"SHA256","hash":"30b5422b6c95ccdc402effd7d3354ca6a6bce621cf21d0379749ddf1f96c1ad7","blockSize":4194304,"blocks":["30b5422b6c95ccdc402effd7d3354ca6a6bce621cf21d0379749ddf1f96c1ad7"]},"offset":"46242565"}}}}}}}}}}},"core-tracing":{"files":{"LICENSE":{"size":1076,"integrity":{"algorithm":"SHA256","hash":"1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef","blockSize":4194304,"blocks":["1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef"]},"offset":"5062798"},"package.json":{"size":1923,"integrity":{"algorithm":"SHA256","hash":"95316a07c2bfcbaa1dd31b1d56795117c0920a1878b9f273da56d9527c927998","blockSize":4194304,"blocks":["95316a07c2bfcbaa1dd31b1d56795117c0920a1878b9f273da56d9527c927998"]},"offset":"5063874"},"dist-esm":{"files":{"src":{"files":{"index.js":{"size":213,"integrity":{"algorithm":"SHA256","hash":"be3ab8136786e94c41630c53900f1e70ab392df06d0fb3241dcfd651b3d4a00a","blockSize":4194304,"blocks":["be3ab8136786e94c41630c53900f1e70ab392df06d0fb3241dcfd651b3d4a00a"]},"offset":"5065797"},"instrumenter.js":{"size":1704,"integrity":{"algorithm":"SHA256","hash":"df641e4b22bfe9e57986d1ce891198a81c8765c03f3261635f2854d3651f7129","blockSize":4194304,"blocks":["df641e4b22bfe9e57986d1ce891198a81c8765c03f3261635f2854d3651f7129"]},"offset":"5066010"},"interfaces.js":{"size":124,"integrity":{"algorithm":"SHA256","hash":"78281090d6e9a9751c17e2685b604b6f18643b657c15b10fc7e8aa61117c4193","blockSize":4194304,"blocks":["78281090d6e9a9751c17e2685b604b6f18643b657c15b10fc7e8aa61117c4193"]},"offset":"5067714"},"tracingClient.js":{"size":3256,"integrity":{"algorithm":"SHA256","hash":"27b52c01c55999a03c2ff5c9a530ab20eeff7e50d9cc09a230cd04445e9cdb4a","blockSize":4194304,"blocks":["27b52c01c55999a03c2ff5c9a530ab20eeff7e50d9cc09a230cd04445e9cdb4a"]},"offset":"5067838"},"tracingContext.js":{"size":1517,"integrity":{"algorithm":"SHA256","hash":"802f4a54b1c32dc840406d54b84cc0e37e5c64178bda22a2b25e469c48f700ec","blockSize":4194304,"blocks":["802f4a54b1c32dc840406d54b84cc0e37e5c64178bda22a2b25e469c48f700ec"]},"offset":"5071094"}}}}},"dist":{"files":{"index.js":{"size":6278,"integrity":{"algorithm":"SHA256","hash":"1fd9d493b1c0114cd2a01c121ff24d5f2cce544437abff61f7ced027b969c3eb","blockSize":4194304,"blocks":["1fd9d493b1c0114cd2a01c121ff24d5f2cce544437abff61f7ced027b969c3eb"]},"offset":"5072611"}}}}},"core-util":{"files":{"LICENSE":{"size":1076,"integrity":{"algorithm":"SHA256","hash":"1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef","blockSize":4194304,"blocks":["1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef"]},"offset":"5078889"},"package.json":{"size":2073,"integrity":{"algorithm":"SHA256","hash":"32f3a91c0167549edce91a89c3695a0ba8a21979522fcc3f8c7ce249987b0e37","blockSize":4194304,"blocks":["32f3a91c0167549edce91a89c3695a0ba8a21979522fcc3f8c7ce249987b0e37"]},"offset":"5079965"},"dist-esm":{"files":{"src":{"files":{"base64.browser.js":{"size":1060,"integrity":{"algorithm":"SHA256","hash":"f0d71cb90008d22e90f9b39d782fbabdf7ab0da2496fb786e330db328ca22af6","blockSize":4194304,"blocks":["f0d71cb90008d22e90f9b39d782fbabdf7ab0da2496fb786e330db328ca22af6"]},"offset":"5082038"},"delay.js":{"size":424,"integrity":{"algorithm":"SHA256","hash":"f05b598293c2a563eefc2e7161b8121f5506b81d8a56167b23561ea92f1d9f77","blockSize":4194304,"blocks":["f05b598293c2a563eefc2e7161b8121f5506b81d8a56167b23561ea92f1d9f77"]},"offset":"5083098"},"error.js":{"size":1234,"integrity":{"algorithm":"SHA256","hash":"754b856ff8f5cf17d0d7785576bc23b45a4d95b839871f42aa0a0c58e071ae50","blockSize":4194304,"blocks":["754b856ff8f5cf17d0d7785576bc23b45a4d95b839871f42aa0a0c58e071ae50"]},"offset":"5083522"},"hex.js":{"size":591,"integrity":{"algorithm":"SHA256","hash":"8a96aba3526974465da3f517af545e492deea71a5dd9d08ecddf01a75414653f","blockSize":4194304,"blocks":["8a96aba3526974465da3f517af545e492deea71a5dd9d08ecddf01a75414653f"]},"offset":"5084756"},"index.js":{"size":384,"integrity":{"algorithm":"SHA256","hash":"66d26159d3140694d0c2c014e6e9260f50a6c5cb3b7aeeeca447941c6a14c20f","blockSize":4194304,"blocks":["66d26159d3140694d0c2c014e6e9260f50a6c5cb3b7aeeeca447941c6a14c20f"]},"offset":"5085347"},"isNode.browser.js":{"size":239,"integrity":{"algorithm":"SHA256","hash":"51a20ace70b46b45f851828f406fbea800d308c6e6dd1f17410e5b4bb13bc243","blockSize":4194304,"blocks":["51a20ace70b46b45f851828f406fbea800d308c6e6dd1f17410e5b4bb13bc243"]},"offset":"5085731"},"isNode.js":{"size":373,"integrity":{"algorithm":"SHA256","hash":"cf7a254dcf4d1dacc60ca023ce026a4837adcdc6f97a12c0fca025fa3b8ff497","blockSize":4194304,"blocks":["cf7a254dcf4d1dacc60ca023ce026a4837adcdc6f97a12c0fca025fa3b8ff497"]},"offset":"5085970"},"object.js":{"size":475,"integrity":{"algorithm":"SHA256","hash":"2a087b7f61c47799038de03ed361b1d49c6fae187f6083d42dbf6670a714849e","blockSize":4194304,"blocks":["2a087b7f61c47799038de03ed361b1d49c6fae187f6083d42dbf6670a714849e"]},"offset":"5086343"},"random.js":{"size":924,"integrity":{"algorithm":"SHA256","hash":"bee6db19e1fc86016e4361868d73bd94061db228942ca106ff78f129a2857e17","blockSize":4194304,"blocks":["bee6db19e1fc86016e4361868d73bd94061db228942ca106ff78f129a2857e17"]},"offset":"5086818"},"sha256.browser.js":{"size":2108,"integrity":{"algorithm":"SHA256","hash":"2857d7a7ad0b20b435304e82c08834f7603119f2f70d15e417e5b1512a730539","blockSize":4194304,"blocks":["2857d7a7ad0b20b435304e82c08834f7603119f2f70d15e417e5b1512a730539"]},"offset":"5087742"},"sha256.js":{"size":941,"integrity":{"algorithm":"SHA256","hash":"9da0ca62db46e047e1119af5b3d200995825eb5d9aaa3a1c6852a19180d5ba29","blockSize":4194304,"blocks":["9da0ca62db46e047e1119af5b3d200995825eb5d9aaa3a1c6852a19180d5ba29"]},"offset":"5089850"},"utf8.browser.js":{"size":645,"integrity":{"algorithm":"SHA256","hash":"114731a19ec3f710ad75126d6968ec9f680e14eea1bf4d5eecf135322a80ed7e","blockSize":4194304,"blocks":["114731a19ec3f710ad75126d6968ec9f680e14eea1bf4d5eecf135322a80ed7e"]},"offset":"5090791"}}}}},"dist":{"files":{"index.js":{"size":4427,"integrity":{"algorithm":"SHA256","hash":"e325ae20bd5fa23a5a384a2fd1795b05a34971d7997cd87074761dfe19ca7358","blockSize":4194304,"blocks":["e325ae20bd5fa23a5a384a2fd1795b05a34971d7997cd87074761dfe19ca7358"]},"offset":"5091436"}}}}},"identity":{"files":{"LICENSE":{"size":1076,"integrity":{"algorithm":"SHA256","hash":"1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef","blockSize":4194304,"blocks":["1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef"]},"offset":"5095863"},"package.json":{"size":5477,"integrity":{"algorithm":"SHA256","hash":"921a3dbb4e561f6d6df224e7da65c445c8ee3d5d7ebfa3193058d3999d24a048","blockSize":4194304,"blocks":["921a3dbb4e561f6d6df224e7da65c445c8ee3d5d7ebfa3193058d3999d24a048"]},"offset":"5096939"},"dist-esm":{"files":{"src":{"files":{"constants.js":{"size":1510,"integrity":{"algorithm":"SHA256","hash":"4b229a1d2d242d59943aaed055a1a7ca1fcd9801a5fef8dbe217181ef17d147c","blockSize":4194304,"blocks":["4b229a1d2d242d59943aaed055a1a7ca1fcd9801a5fef8dbe217181ef17d147c"]},"offset":"5102416"},"errors.js":{"size":4614,"integrity":{"algorithm":"SHA256","hash":"5ec7015e2ae506cedf2a925778ca8cffa48efab264c5d8a681e2d83dbe2a8737","blockSize":4194304,"blocks":["5ec7015e2ae506cedf2a925778ca8cffa48efab264c5d8a681e2d83dbe2a8737"]},"offset":"5103926"},"index.js":{"size":2037,"integrity":{"algorithm":"SHA256","hash":"af693a193508d64387f91b86c1d1a545595dc97fad0a76b2881059d16d372226","blockSize":4194304,"blocks":["af693a193508d64387f91b86c1d1a545595dc97fad0a76b2881059d16d372226"]},"offset":"5108540"},"regionalAuthority.js":{"size":7630,"integrity":{"algorithm":"SHA256","hash":"725d721fdb0091d1aaad5d619236b2f80f92d0158e61ade45da0af064f8e21a2","blockSize":4194304,"blocks":["725d721fdb0091d1aaad5d619236b2f80f92d0158e61ade45da0af064f8e21a2"]},"offset":"5110577"},"tokenCredentialOptions.js":{"size":136,"integrity":{"algorithm":"SHA256","hash":"58ce1f713b9944e1656876187447746678aabb38da2f4a773443b4ced1372aa9","blockSize":4194304,"blocks":["58ce1f713b9944e1656876187447746678aabb38da2f4a773443b4ced1372aa9"]},"offset":"5118207"},"util":{"files":{"authHostEnv.browser.js":{"size":316,"integrity":{"algorithm":"SHA256","hash":"7540c0bf8e9b3cfe0d394066769ee78e0032ca654b72b138918c26861826bdce","blockSize":4194304,"blocks":["7540c0bf8e9b3cfe0d394066769ee78e0032ca654b72b138918c26861826bdce"]},"offset":"5118343"},"checkTenantId.js":{"size":542,"integrity":{"algorithm":"SHA256","hash":"43e2624d3d19a7460156121f9bb7d4c618656a6e050974c0b78f500aef0038d7","blockSize":4194304,"blocks":["43e2624d3d19a7460156121f9bb7d4c618656a6e050974c0b78f500aef0038d7"]},"offset":"5118659"},"identityTokenEndpoint.js":{"size":306,"integrity":{"algorithm":"SHA256","hash":"5164dce75cee7a2e5f9250bc765a3ddd095fd6ed6ca5b09d5e79451cc5c1c39d","blockSize":4194304,"blocks":["5164dce75cee7a2e5f9250bc765a3ddd095fd6ed6ca5b09d5e79451cc5c1c39d"]},"offset":"5119201"},"logging.js":{"size":3145,"integrity":{"algorithm":"SHA256","hash":"29e1062660b96f17cffd4930f0f8146123c3ff69ddb103dd70c64676ed29583d","blockSize":4194304,"blocks":["29e1062660b96f17cffd4930f0f8146123c3ff69ddb103dd70c64676ed29583d"]},"offset":"5119507"},"processUtils.js":{"size":973,"integrity":{"algorithm":"SHA256","hash":"21912afe8de84a36ff45ce5b214261b73419b63bb933bec5c196a5129deff09e","blockSize":4194304,"blocks":["21912afe8de84a36ff45ce5b214261b73419b63bb933bec5c196a5129deff09e"]},"offset":"5122652"},"resolveTenantId.js":{"size":557,"integrity":{"algorithm":"SHA256","hash":"34eac87a7d633c4ce468f0d93ae9e7234469993249e36fc3097c3b36eaa8703c","blockSize":4194304,"blocks":["34eac87a7d633c4ce468f0d93ae9e7234469993249e36fc3097c3b36eaa8703c"]},"offset":"5123625"},"scopeUtils.js":{"size":647,"integrity":{"algorithm":"SHA256","hash":"e37f35ee3cbe09e0cee6983d24fc5d489f229c1a64e9e361fcee90dde604d688","blockSize":4194304,"blocks":["e37f35ee3cbe09e0cee6983d24fc5d489f229c1a64e9e361fcee90dde604d688"]},"offset":"5124182"},"tracing.js":{"size":433,"integrity":{"algorithm":"SHA256","hash":"bb6752d4c1e324813bf87b4d137bad2053af29c0b28d7b2f87d13c95281695c3","blockSize":4194304,"blocks":["bb6752d4c1e324813bf87b4d137bad2053af29c0b28d7b2f87d13c95281695c3"]},"offset":"5124829"},"validateMultiTenant.browser.js":{"size":1044,"integrity":{"algorithm":"SHA256","hash":"c56cab2abc68b23e59079275294ed6207467d421a1422fc1ceaf023f6fb3b187","blockSize":4194304,"blocks":["c56cab2abc68b23e59079275294ed6207467d421a1422fc1ceaf023f6fb3b187"]},"offset":"5125262"},"validateMultiTenant.js":{"size":1476,"integrity":{"algorithm":"SHA256","hash":"4accd096bdbac841d52c0795f3e5b3cbf8d6e7c2ccc15372b3fe3405810c8f53","blockSize":4194304,"blocks":["4accd096bdbac841d52c0795f3e5b3cbf8d6e7c2ccc15372b3fe3405810c8f53"]},"offset":"5126306"}}},"plugins":{"files":{"consumer.browser.js":{"size":314,"integrity":{"algorithm":"SHA256","hash":"a1fcf50d7dabff4265fe419b07b8768d83e4506ff338e7efc398583f66bc50d8","blockSize":4194304,"blocks":["a1fcf50d7dabff4265fe419b07b8768d83e4506ff338e7efc398583f66bc50d8"]},"offset":"5127782"},"consumer.js":{"size":1494,"integrity":{"algorithm":"SHA256","hash":"d98bca9a45bccbf6f3441618a5aae9324a28826aa35cc32468e750bf1535b21f","blockSize":4194304,"blocks":["d98bca9a45bccbf6f3441618a5aae9324a28826aa35cc32468e750bf1535b21f"]},"offset":"5128096"},"provider.js":{"size":122,"integrity":{"algorithm":"SHA256","hash":"1ea383def607191892dbfbd8c57dfd78714701cdc01fc53d87fdd94ec1298725","blockSize":4194304,"blocks":["1ea383def607191892dbfbd8c57dfd78714701cdc01fc53d87fdd94ec1298725"]},"offset":"5129590"}}},"msal":{"files":{"credentials.js":{"size":125,"integrity":{"algorithm":"SHA256","hash":"0ca7660160936cd395be20925fde1832e2d4d171fe98d5f7e93b965e2c3b0278","blockSize":4194304,"blocks":["0ca7660160936cd395be20925fde1832e2d4d171fe98d5f7e93b965e2c3b0278"]},"offset":"5129712"},"flows.js":{"size":119,"integrity":{"algorithm":"SHA256","hash":"a7e65176f0b51e6776a91281ea4bd7735531fc4f46c4cd693cbae9590121d09c","blockSize":4194304,"blocks":["a7e65176f0b51e6776a91281ea4bd7735531fc4f46c4cd693cbae9590121d09c"]},"offset":"5129837"},"types.js":{"size":119,"integrity":{"algorithm":"SHA256","hash":"2287e51ac9733eec351185eff95e1bceaaa728a5461cb8716526e47246d53d2b","blockSize":4194304,"blocks":["2287e51ac9733eec351185eff95e1bceaaa728a5461cb8716526e47246d53d2b"]},"offset":"5129956"},"utils.js":{"size":7709,"integrity":{"algorithm":"SHA256","hash":"64a2f8b4ba3ed0a1406bd11d806437697670501acfe597dd210f9b830c0c4934","blockSize":4194304,"blocks":["64a2f8b4ba3ed0a1406bd11d806437697670501acfe597dd210f9b830c0c4934"]},"offset":"5130075"},"nodeFlows":{"files":{"msalAuthorizationCode.js":{"size":2089,"integrity":{"algorithm":"SHA256","hash":"804af581288684dc2fff9a30fffd860d9373cf0770982339aa082194578216b1","blockSize":4194304,"blocks":["804af581288684dc2fff9a30fffd860d9373cf0770982339aa082194578216b1"]},"offset":"5137784"},"msalClientAssertion.js":{"size":1656,"integrity":{"algorithm":"SHA256","hash":"a57952971ea3abda6287c3512ab99d6ccfc159cb8bed440047af01459fdf50d9","blockSize":4194304,"blocks":["a57952971ea3abda6287c3512ab99d6ccfc159cb8bed440047af01459fdf50d9"]},"offset":"5139873"},"msalClientCertificate.js":{"size":3938,"integrity":{"algorithm":"SHA256","hash":"697d88b7f96bcf03f77f94097a545290d4fa58a649ae94ef9f0588d43ad15647","blockSize":4194304,"blocks":["697d88b7f96bcf03f77f94097a545290d4fa58a649ae94ef9f0588d43ad15647"]},"offset":"5141529"},"msalClientSecret.js":{"size":1266,"integrity":{"algorithm":"SHA256","hash":"95cbfe51e7525d07c62f15bbee8e63e87a2a3bc22331fbc7ab66a7f6ce108c64","blockSize":4194304,"blocks":["95cbfe51e7525d07c62f15bbee8e63e87a2a3bc22331fbc7ab66a7f6ce108c64"]},"offset":"5145467"},"msalDeviceCode.js":{"size":1478,"integrity":{"algorithm":"SHA256","hash":"872fc6f40b8c4c92194a79235d170d7144d662189b93d31ab8ceaa2e1e7a7e13","blockSize":4194304,"blocks":["872fc6f40b8c4c92194a79235d170d7144d662189b93d31ab8ceaa2e1e7a7e13"]},"offset":"5146733"},"msalNodeCommon.js":{"size":11184,"integrity":{"algorithm":"SHA256","hash":"80f3e3930fa150964ca0fbd10f83e74c456846e22d58cd56aefb0d1a1c4a84d0","blockSize":4194304,"blocks":["80f3e3930fa150964ca0fbd10f83e74c456846e22d58cd56aefb0d1a1c4a84d0"]},"offset":"5148211"},"msalOnBehalfOf.js":{"size":2186,"integrity":{"algorithm":"SHA256","hash":"85520fb73ab86c9103c486895c6cf92a25a50630d83455365634bdf131c66d0c","blockSize":4194304,"blocks":["85520fb73ab86c9103c486895c6cf92a25a50630d83455365634bdf131c66d0c"]},"offset":"5159395"},"msalOpenBrowser.js":{"size":8146,"integrity":{"algorithm":"SHA256","hash":"22f4214b574948652979e2effa0563151323cac1a012178ebe97b508741cf57a","blockSize":4194304,"blocks":["22f4214b574948652979e2effa0563151323cac1a012178ebe97b508741cf57a"]},"offset":"5161581"},"msalUsernamePassword.js":{"size":1308,"integrity":{"algorithm":"SHA256","hash":"62859bf8120665e7bc2c25ffd099f40cc848f2d5b1e4fb749ae070c3e7a32198","blockSize":4194304,"blocks":["62859bf8120665e7bc2c25ffd099f40cc848f2d5b1e4fb749ae070c3e7a32198"]},"offset":"5169727"},"tokenCachePersistenceOptions.js":{"size":142,"integrity":{"algorithm":"SHA256","hash":"8d9d92f681c35016f78dd525fe4e77ee9e1631b04ea9d864e5d7a9489038010a","blockSize":4194304,"blocks":["8d9d92f681c35016f78dd525fe4e77ee9e1631b04ea9d864e5d7a9489038010a"]},"offset":"5171035"}}},"browserFlows":{"files":{"msalAuthCode.js":{"size":8305,"integrity":{"algorithm":"SHA256","hash":"134a576715bfc23ce78d6c129eeec4ae67e23451f31f3cb404ad862e5ffe2122","blockSize":4194304,"blocks":["134a576715bfc23ce78d6c129eeec4ae67e23451f31f3cb404ad862e5ffe2122"]},"offset":"5171177"},"msalBrowserCommon.js":{"size":3911,"integrity":{"algorithm":"SHA256","hash":"d008576172643c85a0ac1798c3e1da808ba52a799870825751b90701a961956d","blockSize":4194304,"blocks":["d008576172643c85a0ac1798c3e1da808ba52a799870825751b90701a961956d"]},"offset":"5179482"}}}}},"credentials":{"files":{"authorizationCodeCredential.browser.js":{"size":754,"integrity":{"algorithm":"SHA256","hash":"209e78a296e3c269a3c3d0c23a5f569dc1c01a31000e97701532ce2523fb079a","blockSize":4194304,"blocks":["209e78a296e3c269a3c3d0c23a5f569dc1c01a31000e97701532ce2523fb079a"]},"offset":"5183393"},"authorizationCodeCredential.js":{"size":2793,"integrity":{"algorithm":"SHA256","hash":"5964bfe3f41f2cd7b5719715e05952e038f46bad5ab2fefe509ed3ce6b344572","blockSize":4194304,"blocks":["5964bfe3f41f2cd7b5719715e05952e038f46bad5ab2fefe509ed3ce6b344572"]},"offset":"5184147"},"azureApplicationCredential.browser.js":{"size":1406,"integrity":{"algorithm":"SHA256","hash":"a89b1ac47452d6fdfee4107803fa3ced97b542369bfbcf3c43a110a776680060","blockSize":4194304,"blocks":["a89b1ac47452d6fdfee4107803fa3ced97b542369bfbcf3c43a110a776680060"]},"offset":"5186940"},"azureApplicationCredential.js":{"size":1636,"integrity":{"algorithm":"SHA256","hash":"5cd8d2b75f112ac30789ec8934017004c4673c0980091285fff38cfed3275693","blockSize":4194304,"blocks":["5cd8d2b75f112ac30789ec8934017004c4673c0980091285fff38cfed3275693"]},"offset":"5188346"},"azureCliCredential.browser.js":{"size":828,"integrity":{"algorithm":"SHA256","hash":"c21587927cbd41205cd2ef58fbd30c392e863ab1b51c3d0e3f9fa8af92b84c71","blockSize":4194304,"blocks":["c21587927cbd41205cd2ef58fbd30c392e863ab1b51c3d0e3f9fa8af92b84c71"]},"offset":"5189982"},"azureCliCredential.js":{"size":6215,"integrity":{"algorithm":"SHA256","hash":"d17eb407abcbb447f693d8e98149940b6ebe2ee2c06e378ebf776d6a4053c163","blockSize":4194304,"blocks":["d17eb407abcbb447f693d8e98149940b6ebe2ee2c06e378ebf776d6a4053c163"]},"offset":"5190810"},"azureCliCredentialOptions.js":{"size":139,"integrity":{"algorithm":"SHA256","hash":"f7a8c051bebce78415c2ff310748f3e7e77ace9a1e260d3fbb8e6648a6f281ef","blockSize":4194304,"blocks":["f7a8c051bebce78415c2ff310748f3e7e77ace9a1e260d3fbb8e6648a6f281ef"]},"offset":"5197025"},"azurePowerShellCredential.browser.js":{"size":857,"integrity":{"algorithm":"SHA256","hash":"36e77a2a0412b1ba07cd4556d1d8e2ccb51083ba402d804ba6cadefdcf2f5d45","blockSize":4194304,"blocks":["36e77a2a0412b1ba07cd4556d1d8e2ccb51083ba402d804ba6cadefdcf2f5d45"]},"offset":"5197164"},"azurePowerShellCredential.js":{"size":7301,"integrity":{"algorithm":"SHA256","hash":"681fcb131b050a4a8b76d4f85215c0e1d0866bb5aed1270ef5f8d10964f88b56","blockSize":4194304,"blocks":["681fcb131b050a4a8b76d4f85215c0e1d0866bb5aed1270ef5f8d10964f88b56"]},"offset":"5198021"},"azurePowerShellCredentialOptions.js":{"size":146,"integrity":{"algorithm":"SHA256","hash":"f38ddff8609721a101760dba0c5c33abd291eb0e38623ff485a611ae32c9ae53","blockSize":4194304,"blocks":["f38ddff8609721a101760dba0c5c33abd291eb0e38623ff485a611ae32c9ae53"]},"offset":"5205322"},"chainedTokenCredential.js":{"size":3689,"integrity":{"algorithm":"SHA256","hash":"968afc47fb287865aa1855bfb383d1a89e59902be7d9ba1e7080c0f4abfded5c","blockSize":4194304,"blocks":["968afc47fb287865aa1855bfb383d1a89e59902be7d9ba1e7080c0f4abfded5c"]},"offset":"5205468"},"clientAssertionCredential.browser.js":{"size":794,"integrity":{"algorithm":"SHA256","hash":"2c10563739d9f84182a6faf55569e93c944cac3e597f3f271f5f8aadbdd58993","blockSize":4194304,"blocks":["2c10563739d9f84182a6faf55569e93c944cac3e597f3f271f5f8aadbdd58993"]},"offset":"5209157"},"clientAssertionCredential.js":{"size":2432,"integrity":{"algorithm":"SHA256","hash":"19abbc88f7bd3b8870a2f8c35e8dd17e132e7c8520ee00af5d6805244582a996","blockSize":4194304,"blocks":["19abbc88f7bd3b8870a2f8c35e8dd17e132e7c8520ee00af5d6805244582a996"]},"offset":"5209951"},"clientCertificateCredential.browser.js":{"size":871,"integrity":{"algorithm":"SHA256","hash":"16a1cea6544fbf88283f5ccde732bf892151fe941e95b71879fef0c20dd0bcc2","blockSize":4194304,"blocks":["16a1cea6544fbf88283f5ccde732bf892151fe941e95b71879fef0c20dd0bcc2"]},"offset":"5212383"},"clientCertificateCredential.js":{"size":3127,"integrity":{"algorithm":"SHA256","hash":"7b3962e1c53c2a860ad0aa0867fb57aa43095eb4c47b792f9e8f94e116a7b21e","blockSize":4194304,"blocks":["7b3962e1c53c2a860ad0aa0867fb57aa43095eb4c47b792f9e8f94e116a7b21e"]},"offset":"5213254"},"clientCertificateCredentialOptions.js":{"size":148,"integrity":{"algorithm":"SHA256","hash":"b52eba41c02119502b55f5d2dab00aabbfb410b1288460f58304060cb8308512","blockSize":4194304,"blocks":["b52eba41c02119502b55f5d2dab00aabbfb410b1288460f58304060cb8308512"]},"offset":"5216381"},"clientSecretCredential.browser.js":{"size":4112,"integrity":{"algorithm":"SHA256","hash":"016578b56b02eae8b074616470e8503c5f1163d4b77e1476388fed6b166de2dd","blockSize":4194304,"blocks":["016578b56b02eae8b074616470e8503c5f1163d4b77e1476388fed6b166de2dd"]},"offset":"5216529"},"clientSecretCredential.js":{"size":2617,"integrity":{"algorithm":"SHA256","hash":"83f988da4d4f389bb52d6e94ec5994728d3719696ceedef5e5c42cdecd2cf464","blockSize":4194304,"blocks":["83f988da4d4f389bb52d6e94ec5994728d3719696ceedef5e5c42cdecd2cf464"]},"offset":"5220641"},"clientSecretCredentialOptions.js":{"size":143,"integrity":{"algorithm":"SHA256","hash":"95272537495eca8078fdda0395a285ac02d71f925febc72cefb2fd1d2212e977","blockSize":4194304,"blocks":["95272537495eca8078fdda0395a285ac02d71f925febc72cefb2fd1d2212e977"]},"offset":"5223258"},"credentialPersistenceOptions.js":{"size":142,"integrity":{"algorithm":"SHA256","hash":"cea09d40c98f0224517673f40ae212ebf4328d50f42781ece8ba0b36c94d9ff7","blockSize":4194304,"blocks":["cea09d40c98f0224517673f40ae212ebf4328d50f42781ece8ba0b36c94d9ff7"]},"offset":"5223401"},"defaultAzureCredential.browser.js":{"size":1192,"integrity":{"algorithm":"SHA256","hash":"5cf66b25fa77d03d4167d0ce3116a748f415af4733176e20f73b9b7d82b0e2ea","blockSize":4194304,"blocks":["5cf66b25fa77d03d4167d0ce3116a748f415af4733176e20f73b9b7d82b0e2ea"]},"offset":"5223543"},"defaultAzureCredential.js":{"size":2657,"integrity":{"algorithm":"SHA256","hash":"95a64110e1a61cb9e3df9957296f8011dc62ae491809463864b3332b80c5f6a0","blockSize":4194304,"blocks":["95a64110e1a61cb9e3df9957296f8011dc62ae491809463864b3332b80c5f6a0"]},"offset":"5224735"},"deviceCodeCredential.browser.js":{"size":854,"integrity":{"algorithm":"SHA256","hash":"5156579fe8474de900c40d042d56b8ce6c6fa57adf11330b04d1708112b84547","blockSize":4194304,"blocks":["5156579fe8474de900c40d042d56b8ce6c6fa57adf11330b04d1708112b84547"]},"offset":"5227392"},"deviceCodeCredential.js":{"size":4055,"integrity":{"algorithm":"SHA256","hash":"d5bb1edfcb296374c0457ab91d3ba2aada8bcac8cd488d77df826ce86d869618","blockSize":4194304,"blocks":["d5bb1edfcb296374c0457ab91d3ba2aada8bcac8cd488d77df826ce86d869618"]},"offset":"5228246"},"deviceCodeCredentialOptions.js":{"size":141,"integrity":{"algorithm":"SHA256","hash":"8d585dcfc1297c10f7cfe6b6bee8462df399b4301a6ea5de619c6e19a4f61c39","blockSize":4194304,"blocks":["8d585dcfc1297c10f7cfe6b6bee8462df399b4301a6ea5de619c6e19a4f61c39"]},"offset":"5232301"},"environmentCredential.browser.js":{"size":838,"integrity":{"algorithm":"SHA256","hash":"90d8bcb4f39fefda958655808fd89978a6736fcfb225854087e9aa66205a004d","blockSize":4194304,"blocks":["90d8bcb4f39fefda958655808fd89978a6736fcfb225854087e9aa66205a004d"]},"offset":"5232442"},"environmentCredential.js":{"size":5765,"integrity":{"algorithm":"SHA256","hash":"d2525d8baa73a363e25b1d1f65e0b94caae36b5a1e2b7a79afa2993743d815ce","blockSize":4194304,"blocks":["d2525d8baa73a363e25b1d1f65e0b94caae36b5a1e2b7a79afa2993743d815ce"]},"offset":"5233280"},"interactiveBrowserCredential.browser.js":{"size":4903,"integrity":{"algorithm":"SHA256","hash":"5d2cd4f63a7082446a5111860e22f9dbfa71a7bfeffcfa3b16921e5448927013","blockSize":4194304,"blocks":["5d2cd4f63a7082446a5111860e22f9dbfa71a7bfeffcfa3b16921e5448927013"]},"offset":"5239045"},"interactiveBrowserCredential.js":{"size":4442,"integrity":{"algorithm":"SHA256","hash":"3c4161e98b05ef1e57e152248829488bb26ffdbad4e67f47c8350489cda4dad4","blockSize":4194304,"blocks":["3c4161e98b05ef1e57e152248829488bb26ffdbad4e67f47c8350489cda4dad4"]},"offset":"5243948"},"interactiveBrowserCredentialOptions.js":{"size":149,"integrity":{"algorithm":"SHA256","hash":"074ba6c203882cc2bf7594e07aa3b2bea2009ea40df7e1061d537a2e8dea2732","blockSize":4194304,"blocks":["074ba6c203882cc2bf7594e07aa3b2bea2009ea40df7e1061d537a2e8dea2732"]},"offset":"5248390"},"interactiveCredentialOptions.js":{"size":142,"integrity":{"algorithm":"SHA256","hash":"0d5864fb217e990f594933ada1920c3e6c372f49dd71e98b1a76bfe213149060","blockSize":4194304,"blocks":["0d5864fb217e990f594933ada1920c3e6c372f49dd71e98b1a76bfe213149060"]},"offset":"5248539"},"onBehalfOfCredential.browser.js":{"size":919,"integrity":{"algorithm":"SHA256","hash":"f50bc58ef22cc731f5b1a23388c26edd5f4f152c892ce04fbc830f4de101f819","blockSize":4194304,"blocks":["f50bc58ef22cc731f5b1a23388c26edd5f4f152c892ce04fbc830f4de101f819"]},"offset":"5248681"},"onBehalfOfCredential.js":{"size":1931,"integrity":{"algorithm":"SHA256","hash":"74170cd79c2a9ca1c4eb2365a5c2ffe50c83efd312549e26daa0491857a1aaa9","blockSize":4194304,"blocks":["74170cd79c2a9ca1c4eb2365a5c2ffe50c83efd312549e26daa0491857a1aaa9"]},"offset":"5249600"},"onBehalfOfCredentialOptions.js":{"size":141,"integrity":{"algorithm":"SHA256","hash":"19760b9d53a125d7501529e3c6ac5303a2cfe629719dfa6d1bacad2d837cf6a6","blockSize":4194304,"blocks":["19760b9d53a125d7501529e3c6ac5303a2cfe629719dfa6d1bacad2d837cf6a6"]},"offset":"5251531"},"usernamePasswordCredential.browser.js":{"size":4034,"integrity":{"algorithm":"SHA256","hash":"d0ab7a76b3c06920442851791ae8815ce941d0484299ad2021ddd9fb876d7e82","blockSize":4194304,"blocks":["d0ab7a76b3c06920442851791ae8815ce941d0484299ad2021ddd9fb876d7e82"]},"offset":"5251672"},"usernamePasswordCredential.js":{"size":2830,"integrity":{"algorithm":"SHA256","hash":"b4e16f75c087b01ddf1e7b47ad32db0b34541fd70f917d5839365f695f43619e","blockSize":4194304,"blocks":["b4e16f75c087b01ddf1e7b47ad32db0b34541fd70f917d5839365f695f43619e"]},"offset":"5255706"},"usernamePasswordCredentialOptions.js":{"size":147,"integrity":{"algorithm":"SHA256","hash":"8cad8b1b5069919fb54b85c948cb530ccc85cb9d46477e55d825b7ce6b6d9dab","blockSize":4194304,"blocks":["8cad8b1b5069919fb54b85c948cb530ccc85cb9d46477e55d825b7ce6b6d9dab"]},"offset":"5258536"},"visualStudioCodeCredential.browser.js":{"size":1100,"integrity":{"algorithm":"SHA256","hash":"79799a00987af6ac4726225d415af9585cae4f7998b2cf0d8efa452271b1a81c","blockSize":4194304,"blocks":["79799a00987af6ac4726225d415af9585cae4f7998b2cf0d8efa452271b1a81c"]},"offset":"5258683"},"visualStudioCodeCredential.js":{"size":8380,"integrity":{"algorithm":"SHA256","hash":"f3f3ce5b546b0f18ca81dd8c924f29a41fb152b43cfd85413b41473bfb3439a3","blockSize":4194304,"blocks":["f3f3ce5b546b0f18ca81dd8c924f29a41fb152b43cfd85413b41473bfb3439a3"]},"offset":"5259783"},"visualStudioCodeCredentialPlugin.js":{"size":146,"integrity":{"algorithm":"SHA256","hash":"e34168d5dc7444e05ce1536c2dbec7d72d7fcd3a2e052685b452e429491bb2db","blockSize":4194304,"blocks":["e34168d5dc7444e05ce1536c2dbec7d72d7fcd3a2e052685b452e429491bb2db"]},"offset":"5268163"},"managedIdentityCredential":{"files":{"appServiceMsi2017.js":{"size":3528,"integrity":{"algorithm":"SHA256","hash":"a01a12883acdf307349f190f373360aed16df6217c08702a78338ede1deec6df","blockSize":4194304,"blocks":["a01a12883acdf307349f190f373360aed16df6217c08702a78338ede1deec6df"]},"offset":"5268309"},"appServiceMsi2019.js":{"size":3525,"integrity":{"algorithm":"SHA256","hash":"21a5c37e3b1780b7f6385d4f9fd72504551913f2462020c31a3ca359d7e6835f","blockSize":4194304,"blocks":["21a5c37e3b1780b7f6385d4f9fd72504551913f2462020c31a3ca359d7e6835f"]},"offset":"5271837"},"arcMsi.js":{"size":5226,"integrity":{"algorithm":"SHA256","hash":"ef61688dc8911f4238368828b168f883f4e63cbe5722791c168e51e95dcb3404","blockSize":4194304,"blocks":["ef61688dc8911f4238368828b168f883f4e63cbe5722791c168e51e95dcb3404"]},"offset":"5275362"},"cloudShellMsi.js":{"size":3423,"integrity":{"algorithm":"SHA256","hash":"2d4834ec44e7171836096c69080b5f25ee58cf6d32ecaa0dfacfa341abf659e5","blockSize":4194304,"blocks":["2d4834ec44e7171836096c69080b5f25ee58cf6d32ecaa0dfacfa341abf659e5"]},"offset":"5280588"},"constants.js":{"size":424,"integrity":{"algorithm":"SHA256","hash":"c630bbae994fc161499ca9dec6080dd84ff2d34b4a7f9f23eca3898f6afd26fb","blockSize":4194304,"blocks":["c630bbae994fc161499ca9dec6080dd84ff2d34b4a7f9f23eca3898f6afd26fb"]},"offset":"5284011"},"fabricMsi.js":{"size":4483,"integrity":{"algorithm":"SHA256","hash":"7dcb9b7b2654c573ee878fbd52a728845e370f22c549e7473279bab8c9aa6109","blockSize":4194304,"blocks":["7dcb9b7b2654c573ee878fbd52a728845e370f22c549e7473279bab8c9aa6109"]},"offset":"5284435"},"imdsMsi.js":{"size":7783,"integrity":{"algorithm":"SHA256","hash":"ba94638126a0d8b0dbfe31e2133510f624e754ec64eb17b753934d6286245e98","blockSize":4194304,"blocks":["ba94638126a0d8b0dbfe31e2133510f624e754ec64eb17b753934d6286245e98"]},"offset":"5288918"},"index.browser.js":{"size":667,"integrity":{"algorithm":"SHA256","hash":"db69bc4d272184b356d245154ad3a85c39c41d816de204b9bb06cb97be85f334","blockSize":4194304,"blocks":["db69bc4d272184b356d245154ad3a85c39c41d816de204b9bb06cb97be85f334"]},"offset":"5296701"},"index.js":{"size":9663,"integrity":{"algorithm":"SHA256","hash":"8d6f6a84f44aed19f2fef1e18b70ad2ecd222949dea0f2ccc5280a4b3eeb3aaa","blockSize":4194304,"blocks":["8d6f6a84f44aed19f2fef1e18b70ad2ecd222949dea0f2ccc5280a4b3eeb3aaa"]},"offset":"5297368"},"models.js":{"size":120,"integrity":{"algorithm":"SHA256","hash":"10ae7a10254a0999424c7ef5aba85fae4b2f323d47f6ecb014568f4f807620be","blockSize":4194304,"blocks":["10ae7a10254a0999424c7ef5aba85fae4b2f323d47f6ecb014568f4f807620be"]},"offset":"5307031"},"tokenExchangeMsi.js":{"size":4196,"integrity":{"algorithm":"SHA256","hash":"175d99af317bdde81926c7d7605d5aa11aaf5eca791c1a645087931ce44af030","blockSize":4194304,"blocks":["175d99af317bdde81926c7d7605d5aa11aaf5eca791c1a645087931ce44af030"]},"offset":"5307151"},"utils.js":{"size":1169,"integrity":{"algorithm":"SHA256","hash":"cc08616892d2c382e08032e636283c224203ef88cfe6c6d93d302bde4c07879b","blockSize":4194304,"blocks":["cc08616892d2c382e08032e636283c224203ef88cfe6c6d93d302bde4c07879b"]},"offset":"5311347"}}}}},"client":{"files":{"identityClient.js":{"size":11469,"integrity":{"algorithm":"SHA256","hash":"5bf9b121988214bdb5710109cd446d815772993ea2f96e74563429b146618fda","blockSize":4194304,"blocks":["5bf9b121988214bdb5710109cd446d815772993ea2f96e74563429b146618fda"]},"offset":"5312516"}}}}}}},"dist":{"files":{"index.js":{"size":168621,"integrity":{"algorithm":"SHA256","hash":"50fdd1b4d438d5e2ea485d3218651c0cfcc2639fb19eef92acb9abfa0c3a45fc","blockSize":4194304,"blocks":["50fdd1b4d438d5e2ea485d3218651c0cfcc2639fb19eef92acb9abfa0c3a45fc"]},"offset":"5323985"}}},"node_modules":{"files":{"uuid":{"files":{"CONTRIBUTING.md":{"size":513,"integrity":{"algorithm":"SHA256","hash":"99b5cc0a56af12be90a669fdffc9f5a721236d2ede0d92e1171bb7097dd9fdd7","blockSize":4194304,"blocks":["99b5cc0a56af12be90a669fdffc9f5a721236d2ede0d92e1171bb7097dd9fdd7"]},"offset":"46242609"},"LICENSE.md":{"size":1109,"integrity":{"algorithm":"SHA256","hash":"beaa6b04fb82e41dd2ad679e19e27953afb5999b1abbb455b6564e78ebfeb332","blockSize":4194304,"blocks":["beaa6b04fb82e41dd2ad679e19e27953afb5999b1abbb455b6564e78ebfeb332"]},"offset":"46243122"},"package.json":{"size":2601,"integrity":{"algorithm":"SHA256","hash":"c33d17ad3546ea553db5df68edb1ac9a794e2e57fc99f838a9d78434ae009abc","blockSize":4194304,"blocks":["c33d17ad3546ea553db5df68edb1ac9a794e2e57fc99f838a9d78434ae009abc"]},"offset":"46244231"},"wrapper.mjs":{"size":323,"integrity":{"algorithm":"SHA256","hash":"f6835608d7c4b422bb11ab4689bcf91e166ecbbd63aa3fa2b83c448835cd80a5","blockSize":4194304,"blocks":["f6835608d7c4b422bb11ab4689bcf91e166ecbbd63aa3fa2b83c448835cd80a5"]},"offset":"46246832"},"dist":{"files":{"index.js":{"size":1765,"integrity":{"algorithm":"SHA256","hash":"069a2230d395723583c8e45a7c0fee2622af2fbd08dc35f81e4d57836122e59f","blockSize":4194304,"blocks":["069a2230d395723583c8e45a7c0fee2622af2fbd08dc35f81e4d57836122e59f"]},"offset":"46247155"},"md5-browser.js":{"size":7015,"integrity":{"algorithm":"SHA256","hash":"21a4e167b7ae498e8f3778bac8d7330929099006afca6adfe76b626e0e41d795","blockSize":4194304,"blocks":["21a4e167b7ae498e8f3778bac8d7330929099006afca6adfe76b626e0e41d795"]},"offset":"46248920"},"md5.js":{"size":550,"integrity":{"algorithm":"SHA256","hash":"6ca6276ff35f19ea462bb8c9d6d290994fa9980fc775deb741811ef947196ced","blockSize":4194304,"blocks":["6ca6276ff35f19ea462bb8c9d6d290994fa9980fc775deb741811ef947196ced"]},"offset":"46255935"},"nil.js":{"size":188,"integrity":{"algorithm":"SHA256","hash":"7395bd919bd1309bcbced245a59dfc6b077f97992a482af2537343e558795b1f","blockSize":4194304,"blocks":["7395bd919bd1309bcbced245a59dfc6b077f97992a482af2537343e558795b1f"]},"offset":"46256485"},"parse.js":{"size":1380,"integrity":{"algorithm":"SHA256","hash":"1a87ed6a6bb0a3edbe266ca55aaf1c5af8e963ee9486f74b59cfd615280b21b4","blockSize":4194304,"blocks":["1a87ed6a6bb0a3edbe266ca55aaf1c5af8e963ee9486f74b59cfd615280b21b4"]},"offset":"46256673"},"regex.js":{"size":267,"integrity":{"algorithm":"SHA256","hash":"acc4c54d987f100093097f4f156ff245394c39d1332eb2114d7e40db00bd6ddd","blockSize":4194304,"blocks":["acc4c54d987f100093097f4f156ff245394c39d1332eb2114d7e40db00bd6ddd"]},"offset":"46258053"},"rng-browser.js":{"size":1131,"integrity":{"algorithm":"SHA256","hash":"4c88edf4fd7fae3bf84bad34750a55f706c8e522a924af6c6ad22839e3718dd6","blockSize":4194304,"blocks":["4c88edf4fd7fae3bf84bad34750a55f706c8e522a924af6c6ad22839e3718dd6"]},"offset":"46258320"},"rng.js":{"size":549,"integrity":{"algorithm":"SHA256","hash":"fdde4350fc69c07bfed4178eedf6121a56264744207d9f5c8f3e5b1b913dbb06","blockSize":4194304,"blocks":["fdde4350fc69c07bfed4178eedf6121a56264744207d9f5c8f3e5b1b913dbb06"]},"offset":"46259451"},"sha1-browser.js":{"size":2609,"integrity":{"algorithm":"SHA256","hash":"32982388b377b06298f59db97c98077f06e6b4f29fe284d427195a358a72f19e","blockSize":4194304,"blocks":["32982388b377b06298f59db97c98077f06e6b4f29fe284d427195a358a72f19e"]},"offset":"46260000"},"sha1.js":{"size":553,"integrity":{"algorithm":"SHA256","hash":"a9eda407444a3f68a0a4db0373346df18f583abbde2c4bf2b3fbc6d73be2c75e","blockSize":4194304,"blocks":["a9eda407444a3f68a0a4db0373346df18f583abbde2c4bf2b3fbc6d73be2c75e"]},"offset":"46262609"},"stringify.js":{"size":1667,"integrity":{"algorithm":"SHA256","hash":"85a70b8982f37ddb434816dcda7628b0319e5a90d46ac6bc9b08d4d15d6a7650","blockSize":4194304,"blocks":["85a70b8982f37ddb434816dcda7628b0319e5a90d46ac6bc9b08d4d15d6a7650"]},"offset":"46263162"},"uuid-bin.js":{"size":2030,"integrity":{"algorithm":"SHA256","hash":"7c60635cf5a963da72e35292bcbfa7f7221b08374d69d75103fa82da9d950102","blockSize":4194304,"blocks":["7c60635cf5a963da72e35292bcbfa7f7221b08374d69d75103fa82da9d950102"]},"offset":"46264829"},"v1.js":{"size":3618,"integrity":{"algorithm":"SHA256","hash":"6dad9c2e6565ad6b478fba7b2ace95350df56a15a72920e72ac64c3a2691d665","blockSize":4194304,"blocks":["6dad9c2e6565ad6b478fba7b2ace95350df56a15a72920e72ac64c3a2691d665"]},"offset":"46266859"},"v3.js":{"size":414,"integrity":{"algorithm":"SHA256","hash":"95e0c6fa204355c6ef7dbac5720a3ef5239454ed6820674dfcc143a55ea6c459","blockSize":4194304,"blocks":["95e0c6fa204355c6ef7dbac5720a3ef5239454ed6820674dfcc143a55ea6c459"]},"offset":"46270477"},"v35.js":{"size":2008,"integrity":{"algorithm":"SHA256","hash":"ababd96e6f8b1fca9bb58f43220473f7bd59fbc81b3acb212df924813544283f","blockSize":4194304,"blocks":["ababd96e6f8b1fca9bb58f43220473f7bd59fbc81b3acb212df924813544283f"]},"offset":"46270891"},"v4.js":{"size":860,"integrity":{"algorithm":"SHA256","hash":"a9e30e8692dde9dec39a3ef716ef8e650e321813fa9d137f16d27666b9ad96ef","blockSize":4194304,"blocks":["a9e30e8692dde9dec39a3ef716ef8e650e321813fa9d137f16d27666b9ad96ef"]},"offset":"46272899"},"v5.js":{"size":417,"integrity":{"algorithm":"SHA256","hash":"d15c31975f31b9abf6a195e70a3dca0843a9257cb51b49214cf7a9f4ed30fc5a","blockSize":4194304,"blocks":["d15c31975f31b9abf6a195e70a3dca0843a9257cb51b49214cf7a9f4ed30fc5a"]},"offset":"46273759"},"validate.js":{"size":410,"integrity":{"algorithm":"SHA256","hash":"5497d9adffd73474cf379d3e1b76b28698e408124a0726d54e88282500378502","blockSize":4194304,"blocks":["5497d9adffd73474cf379d3e1b76b28698e408124a0726d54e88282500378502"]},"offset":"46274176"},"version.js":{"size":474,"integrity":{"algorithm":"SHA256","hash":"cad5f0ecd518983e310856cafd54d4d0de0b9db3c8e3bd97ec8e773ef63de6e8","blockSize":4194304,"blocks":["cad5f0ecd518983e310856cafd54d4d0de0b9db3c8e3bd97ec8e773ef63de6e8"]},"offset":"46274586"},"umd":{"files":{"uuid.min.js":{"size":8160,"integrity":{"algorithm":"SHA256","hash":"c5df6d9704bdada96df0770523058f395192ee9d1fe13880eb1d57dfe6417533","blockSize":4194304,"blocks":["c5df6d9704bdada96df0770523058f395192ee9d1fe13880eb1d57dfe6417533"]},"offset":"46275060"},"uuidNIL.min.js":{"size":280,"integrity":{"algorithm":"SHA256","hash":"18c98395b8a11f83924c22af88573b8bbe3a5cf4fe7864364e6902e49ac3d7fd","blockSize":4194304,"blocks":["18c98395b8a11f83924c22af88573b8bbe3a5cf4fe7864364e6902e49ac3d7fd"]},"offset":"46283220"},"uuidParse.min.js":{"size":883,"integrity":{"algorithm":"SHA256","hash":"555a6f1b1f49532a96c4235ab4de7c1e5fec9b8724bcf1a1247ba4eb33116af2","blockSize":4194304,"blocks":["555a6f1b1f49532a96c4235ab4de7c1e5fec9b8724bcf1a1247ba4eb33116af2"]},"offset":"46283500"},"uuidStringify.min.js":{"size":829,"integrity":{"algorithm":"SHA256","hash":"9b6db819fecb2f40d9fa5ac8c892218004b3a633a1ec29d7a873801a7eade28f","blockSize":4194304,"blocks":["9b6db819fecb2f40d9fa5ac8c892218004b3a633a1ec29d7a873801a7eade28f"]},"offset":"46284383"},"uuidValidate.min.js":{"size":420,"integrity":{"algorithm":"SHA256","hash":"45a1c7d7618c149522c8f8085675e6707381f6106ca414c294b3e6169065cf21","blockSize":4194304,"blocks":["45a1c7d7618c149522c8f8085675e6707381f6106ca414c294b3e6169065cf21"]},"offset":"46285212"},"uuidVersion.min.js":{"size":506,"integrity":{"algorithm":"SHA256","hash":"c0a99b310a43528b5e4f59c87dcc489732bf8c4dd3a367c34cf882a88a3cecca","blockSize":4194304,"blocks":["c0a99b310a43528b5e4f59c87dcc489732bf8c4dd3a367c34cf882a88a3cecca"]},"offset":"46285632"},"uuidv1.min.js":{"size":2020,"integrity":{"algorithm":"SHA256","hash":"9963a427c7b05e1ea3c923cfed992cfea294e980e42d754ba593cec66d285a07","blockSize":4194304,"blocks":["9963a427c7b05e1ea3c923cfed992cfea294e980e42d754ba593cec66d285a07"]},"offset":"46286138"},"uuidv3.min.js":{"size":5145,"integrity":{"algorithm":"SHA256","hash":"2d31a5a7ef824371df6f91ad677cd137ca9b51a529be40873f9b60009c550932","blockSize":4194304,"blocks":["2d31a5a7ef824371df6f91ad677cd137ca9b51a529be40873f9b60009c550932"]},"offset":"46288158"},"uuidv4.min.js":{"size":1366,"integrity":{"algorithm":"SHA256","hash":"4bbb806e743e21bc9f97b62fc0564e0889b7f31ee9d48c3f2b85d4e00fe629cc","blockSize":4194304,"blocks":["4bbb806e743e21bc9f97b62fc0564e0889b7f31ee9d48c3f2b85d4e00fe629cc"]},"offset":"46293303"},"uuidv5.min.js":{"size":3267,"integrity":{"algorithm":"SHA256","hash":"1a444d14f3a6f8952bfc827be5c52dc7367c99e5bf30a5e5102f0b4ad420df76","blockSize":4194304,"blocks":["1a444d14f3a6f8952bfc827be5c52dc7367c99e5bf30a5e5102f0b4ad420df76"]},"offset":"46294669"}}},"esm-node":{"files":{"index.js":{"size":412,"integrity":{"algorithm":"SHA256","hash":"3efb8df8c64379c5acbaf0b70ce1a1906375f4b53901b7e90a26863ead50fc30","blockSize":4194304,"blocks":["3efb8df8c64379c5acbaf0b70ce1a1906375f4b53901b7e90a26863ead50fc30"]},"offset":"46297936"},"md5.js":{"size":281,"integrity":{"algorithm":"SHA256","hash":"2313329bf3ada8cd17046afeefa761bd7daa3821e140fc55d8c2b94ee7760ed4","blockSize":4194304,"blocks":["2313329bf3ada8cd17046afeefa761bd7daa3821e140fc55d8c2b94ee7760ed4"]},"offset":"46298348"},"nil.js":{"size":54,"integrity":{"algorithm":"SHA256","hash":"40036d4ffe78154827eedb9c1b3f59f660722907389725842bbc178ba28d2241","blockSize":4194304,"blocks":["40036d4ffe78154827eedb9c1b3f59f660722907389725842bbc178ba28d2241"]},"offset":"46298629"},"parse.js":{"size":1106,"integrity":{"algorithm":"SHA256","hash":"2743e5b696fb15df389cf3b1a242e56780f7941bbefc23465529d30e851b80f5","blockSize":4194304,"blocks":["2743e5b696fb15df389cf3b1a242e56780f7941bbefc23465529d30e851b80f5"]},"offset":"46298683"},"regex.js":{"size":133,"integrity":{"algorithm":"SHA256","hash":"9a546763c108d7eeb7283ce26c7a6845a44bd67132005eb32fd1feeca49d1b3f","blockSize":4194304,"blocks":["9a546763c108d7eeb7283ce26c7a6845a44bd67132005eb32fd1feeca49d1b3f"]},"offset":"46299789"},"rng.js":{"size":323,"integrity":{"algorithm":"SHA256","hash":"ff667aff9367a48cc713d36764cea05bd30e8ba05392430571c54734fc9fde03","blockSize":4194304,"blocks":["ff667aff9367a48cc713d36764cea05bd30e8ba05392430571c54734fc9fde03"]},"offset":"46299922"},"sha1.js":{"size":284,"integrity":{"algorithm":"SHA256","hash":"6094b056716c8a37b9f2da365d6c8a17f754543d966411d01dfebd762c94547e","blockSize":4194304,"blocks":["6094b056716c8a37b9f2da365d6c8a17f754543d966411d01dfebd762c94547e"]},"offset":"46300245"},"stringify.js":{"size":1393,"integrity":{"algorithm":"SHA256","hash":"224279f45e9b30fca5de4fcf8620aa00ac3c8bef89fc073bfb36b83272bd1556","blockSize":4194304,"blocks":["224279f45e9b30fca5de4fcf8620aa00ac3c8bef89fc073bfb36b83272bd1556"]},"offset":"46300529"},"v1.js":{"size":3306,"integrity":{"algorithm":"SHA256","hash":"4cbdb6e889c57896cc8dd35f299aa05a00ff7a43b875a187f87c95e7bb2c3f0f","blockSize":4194304,"blocks":["4cbdb6e889c57896cc8dd35f299aa05a00ff7a43b875a187f87c95e7bb2c3f0f"]},"offset":"46301922"},"v3.js":{"size":107,"integrity":{"algorithm":"SHA256","hash":"65b963f24922d433fdc592aa4e2764d10fad59351015bbe5fce0830fe389794a","blockSize":4194304,"blocks":["65b963f24922d433fdc592aa4e2764d10fad59351015bbe5fce0830fe389794a"]},"offset":"46305228"},"v35.js":{"size":1663,"integrity":{"algorithm":"SHA256","hash":"56a358587ded91ef272d54a4937e6f59193cd11b51710503859083feb8d6f20f","blockSize":4194304,"blocks":["56a358587ded91ef272d54a4937e6f59193cd11b51710503859083feb8d6f20f"]},"offset":"46305335"},"v4.js":{"size":546,"integrity":{"algorithm":"SHA256","hash":"44d2fedb301801c7c60e45934eaa13435614e3d65aedf8759775890de75bed69","blockSize":4194304,"blocks":["44d2fedb301801c7c60e45934eaa13435614e3d65aedf8759775890de75bed69"]},"offset":"46306998"},"v5.js":{"size":110,"integrity":{"algorithm":"SHA256","hash":"e9e8d82440c23fc3de56f8acd5a15b1ca2daad6bf6d2e7c4a4b39d04384206d3","blockSize":4194304,"blocks":["e9e8d82440c23fc3de56f8acd5a15b1ca2daad6bf6d2e7c4a4b39d04384206d3"]},"offset":"46307544"},"validate.js":{"size":141,"integrity":{"algorithm":"SHA256","hash":"4a782f41298704c0029c245203430b3e4511365bf05a3addacdbae59d9c664fa","blockSize":4194304,"blocks":["4a782f41298704c0029c245203430b3e4511365bf05a3addacdbae59d9c664fa"]},"offset":"46307654"},"version.js":{"size":200,"integrity":{"algorithm":"SHA256","hash":"84d1c2f759c39dbf8b26a359b0d68ba9fcc68bf8c3612b8b1bb0df31dfb2e693","blockSize":4194304,"blocks":["84d1c2f759c39dbf8b26a359b0d68ba9fcc68bf8c3612b8b1bb0df31dfb2e693"]},"offset":"46307795"}}},"esm-browser":{"files":{"index.js":{"size":412,"integrity":{"algorithm":"SHA256","hash":"3efb8df8c64379c5acbaf0b70ce1a1906375f4b53901b7e90a26863ead50fc30","blockSize":4194304,"blocks":["3efb8df8c64379c5acbaf0b70ce1a1906375f4b53901b7e90a26863ead50fc30"]},"offset":"46307995"},"md5.js":{"size":6852,"integrity":{"algorithm":"SHA256","hash":"705eb0feeda58a88a5b887cf580e38bb9979dec642dd663b63c9dc485e956728","blockSize":4194304,"blocks":["705eb0feeda58a88a5b887cf580e38bb9979dec642dd663b63c9dc485e956728"]},"offset":"46308407"},"nil.js":{"size":54,"integrity":{"algorithm":"SHA256","hash":"40036d4ffe78154827eedb9c1b3f59f660722907389725842bbc178ba28d2241","blockSize":4194304,"blocks":["40036d4ffe78154827eedb9c1b3f59f660722907389725842bbc178ba28d2241"]},"offset":"46315259"},"parse.js":{"size":1104,"integrity":{"algorithm":"SHA256","hash":"1efd0e1dd5d7d205a3405f5aee39029ea60bece8a893b2bf742a16c6a51246a6","blockSize":4194304,"blocks":["1efd0e1dd5d7d205a3405f5aee39029ea60bece8a893b2bf742a16c6a51246a6"]},"offset":"46315313"},"regex.js":{"size":133,"integrity":{"algorithm":"SHA256","hash":"9a546763c108d7eeb7283ce26c7a6845a44bd67132005eb32fd1feeca49d1b3f","blockSize":4194304,"blocks":["9a546763c108d7eeb7283ce26c7a6845a44bd67132005eb32fd1feeca49d1b3f"]},"offset":"46316417"},"rng.js":{"size":1040,"integrity":{"algorithm":"SHA256","hash":"0e1abdc73fa79ff64006ec6675b06a193f55eac039595cc3867e6567e46f2dd7","blockSize":4194304,"blocks":["0e1abdc73fa79ff64006ec6675b06a193f55eac039595cc3867e6567e46f2dd7"]},"offset":"46316550"},"sha1.js":{"size":2488,"integrity":{"algorithm":"SHA256","hash":"0b777c8796a7e0954a47bc5b7d612f89d7cd9218106881a9b4931f8f882fd056","blockSize":4194304,"blocks":["0b777c8796a7e0954a47bc5b7d612f89d7cd9218106881a9b4931f8f882fd056"]},"offset":"46317590"},"stringify.js":{"size":1463,"integrity":{"algorithm":"SHA256","hash":"b3e05d40408725c571660f7f1bfdb1b20fde769c5142f23273a95815b2ca5d01","blockSize":4194304,"blocks":["b3e05d40408725c571660f7f1bfdb1b20fde769c5142f23273a95815b2ca5d01"]},"offset":"46320078"},"v1.js":{"size":3296,"integrity":{"algorithm":"SHA256","hash":"746184938af3d1e32fb432711c135d95305f839d94a5e90dd23438435a8342b6","blockSize":4194304,"blocks":["746184938af3d1e32fb432711c135d95305f839d94a5e90dd23438435a8342b6"]},"offset":"46321541"},"v3.js":{"size":105,"integrity":{"algorithm":"SHA256","hash":"337d2b9ef80229c44c240e4218aa324b129d792701432061946ee4154e30080a","blockSize":4194304,"blocks":["337d2b9ef80229c44c240e4218aa324b129d792701432061946ee4154e30080a"]},"offset":"46324837"},"v35.js":{"size":1657,"integrity":{"algorithm":"SHA256","hash":"c418ede8cd4d61f12ae553adac55b1afa2cbd8c8659c31dd657c1decbb36314b","blockSize":4194304,"blocks":["c418ede8cd4d61f12ae553adac55b1afa2cbd8c8659c31dd657c1decbb36314b"]},"offset":"46324942"},"v4.js":{"size":544,"integrity":{"algorithm":"SHA256","hash":"971f818a59ef77ee2c213dfea32dc4494823f9b8bd45be19fd81cf49b09f44e5","blockSize":4194304,"blocks":["971f818a59ef77ee2c213dfea32dc4494823f9b8bd45be19fd81cf49b09f44e5"]},"offset":"46326599"},"v5.js":{"size":108,"integrity":{"algorithm":"SHA256","hash":"07e6d11989b44edbe92ccb697febb65225ebad32fb2f9c91c5b571a6f5a3c4df","blockSize":4194304,"blocks":["07e6d11989b44edbe92ccb697febb65225ebad32fb2f9c91c5b571a6f5a3c4df"]},"offset":"46327143"},"validate.js":{"size":141,"integrity":{"algorithm":"SHA256","hash":"4a782f41298704c0029c245203430b3e4511365bf05a3addacdbae59d9c664fa","blockSize":4194304,"blocks":["4a782f41298704c0029c245203430b3e4511365bf05a3addacdbae59d9c664fa"]},"offset":"46327251"},"version.js":{"size":200,"integrity":{"algorithm":"SHA256","hash":"84d1c2f759c39dbf8b26a359b0d68ba9fcc68bf8c3612b8b1bb0df31dfb2e693","blockSize":4194304,"blocks":["84d1c2f759c39dbf8b26a359b0d68ba9fcc68bf8c3612b8b1bb0df31dfb2e693"]},"offset":"46327392"}}},"bin":{"files":{"uuid":{"size":44,"integrity":{"algorithm":"SHA256","hash":"30b5422b6c95ccdc402effd7d3354ca6a6bce621cf21d0379749ddf1f96c1ad7","blockSize":4194304,"blocks":["30b5422b6c95ccdc402effd7d3354ca6a6bce621cf21d0379749ddf1f96c1ad7"]},"offset":"46327592"}}}}}}}}}}},"keyvault-keys":{"files":{"LICENSE":{"size":1076,"integrity":{"algorithm":"SHA256","hash":"1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef","blockSize":4194304,"blocks":["1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef"]},"offset":"5492606"},"package.json":{"size":3518,"integrity":{"algorithm":"SHA256","hash":"7c94ffcce8344117b36bcfd2f12d3c739f18142fe0a0d2bb5d27d3dbc49a2a4b","blockSize":4194304,"blocks":["7c94ffcce8344117b36bcfd2f12d3c739f18142fe0a0d2bb5d27d3dbc49a2a4b"]},"offset":"5493682"},"dist-esm":{"files":{"keyvault-keys":{"files":{"src":{"files":{"constants.js":{"size":148,"integrity":{"algorithm":"SHA256","hash":"a11e8d638ed7be20969bcbec906123f2a0bd26309d85865484e77731a8e4b66b","blockSize":4194304,"blocks":["a11e8d638ed7be20969bcbec906123f2a0bd26309d85865484e77731a8e4b66b"]},"offset":"5497200"},"cryptographyClient.js":{"size":16548,"integrity":{"algorithm":"SHA256","hash":"703c997346afd1ec25ceb76a5d9b1692dc58c7bf7a50610a8281fef6f5e360d2","blockSize":4194304,"blocks":["703c997346afd1ec25ceb76a5d9b1692dc58c7bf7a50610a8281fef6f5e360d2"]},"offset":"5497348"},"cryptographyClientModels.js":{"size":2025,"integrity":{"algorithm":"SHA256","hash":"60660776479188f232c67c9bb79a6c76ee0d2f739502d132f4bacd8ba1a1cf8e","blockSize":4194304,"blocks":["60660776479188f232c67c9bb79a6c76ee0d2f739502d132f4bacd8ba1a1cf8e"]},"offset":"5513896"},"identifier.js":{"size":886,"integrity":{"algorithm":"SHA256","hash":"f9feb8c1a3d6e486836ef775c506122cd4dcc52f8e34af1270c73d3088a1e5da","blockSize":4194304,"blocks":["f9feb8c1a3d6e486836ef775c506122cd4dcc52f8e34af1270c73d3088a1e5da"]},"offset":"5515921"},"index.js":{"size":35174,"integrity":{"algorithm":"SHA256","hash":"3c2a2e0593436ce847fe1e8c0db78ea62b987aff08b19af9520f918e88641020","blockSize":4194304,"blocks":["3c2a2e0593436ce847fe1e8c0db78ea62b987aff08b19af9520f918e88641020"]},"offset":"5516807"},"keysModels.js":{"size":1777,"integrity":{"algorithm":"SHA256","hash":"0737a5fa2439d6faf44ff101e9d9fa3b327041b1a7610361b14fdf4966803846","blockSize":4194304,"blocks":["0737a5fa2439d6faf44ff101e9d9fa3b327041b1a7610361b14fdf4966803846"]},"offset":"5551981"},"log.js":{"size":279,"integrity":{"algorithm":"SHA256","hash":"1ce2b027120247d046e14486b438f72993bc5a8be886251c2be49e810940e475","blockSize":4194304,"blocks":["1ce2b027120247d046e14486b438f72993bc5a8be886251c2be49e810940e475"]},"offset":"5553758"},"transformations.js":{"size":5372,"integrity":{"algorithm":"SHA256","hash":"93988900f2d691655de5149e73b71be4b8f13b5052f39d3a2a86f35a9e4aff7a","blockSize":4194304,"blocks":["93988900f2d691655de5149e73b71be4b8f13b5052f39d3a2a86f35a9e4aff7a"]},"offset":"5554037"},"lro":{"files":{"keyVaultKeyPoller.js":{"size":1524,"integrity":{"algorithm":"SHA256","hash":"2481cf753322c4a0d18a004d63a97650c11e710a441f5232b89ee0f0067c78be","blockSize":4194304,"blocks":["2481cf753322c4a0d18a004d63a97650c11e710a441f5232b89ee0f0067c78be"]},"offset":"5559409"},"recover":{"files":{"operation.js":{"size":3361,"integrity":{"algorithm":"SHA256","hash":"c248a81c7d1c6f85609c202852ac45eae1bea0d7ae88be6e3c037281bb081e8d","blockSize":4194304,"blocks":["c248a81c7d1c6f85609c202852ac45eae1bea0d7ae88be6e3c037281bb081e8d"]},"offset":"5560933"},"poller.js":{"size":839,"integrity":{"algorithm":"SHA256","hash":"efa60158f75ee605c3c6c9bf310b21840d086710576825fd2dfa79d0381aeb5f","blockSize":4194304,"blocks":["efa60158f75ee605c3c6c9bf310b21840d086710576825fd2dfa79d0381aeb5f"]},"offset":"5564294"}}},"delete":{"files":{"operation.js":{"size":3000,"integrity":{"algorithm":"SHA256","hash":"d4ec7538ea235456713e732279c14aaed36d66ed12cd55db11bf277c8ef2bf6d","blockSize":4194304,"blocks":["d4ec7538ea235456713e732279c14aaed36d66ed12cd55db11bf277c8ef2bf6d"]},"offset":"5565133"},"poller.js":{"size":816,"integrity":{"algorithm":"SHA256","hash":"29c9c80f174c1ab5f608851dc0f40c462a7b89f090c21dbbdf63d37afb135313","blockSize":4194304,"blocks":["29c9c80f174c1ab5f608851dc0f40c462a7b89f090c21dbbdf63d37afb135313"]},"offset":"5568133"}}}}},"generated":{"files":{"index.js":{"size":405,"integrity":{"algorithm":"SHA256","hash":"2bc05aaa7fe27579a326d494ab3a23b3496f88aa991bafd1f5cd3ad6b17d72d0","blockSize":4194304,"blocks":["2bc05aaa7fe27579a326d494ab3a23b3496f88aa991bafd1f5cd3ad6b17d72d0"]},"offset":"5568949"},"keyVaultClient.js":{"size":43638,"integrity":{"algorithm":"SHA256","hash":"d976872aa2ceda1a4bdc3baf65d235fa104c3aaa5966ca521338f3df934e4086","blockSize":4194304,"blocks":["d976872aa2ceda1a4bdc3baf65d235fa104c3aaa5966ca521338f3df934e4086"]},"offset":"5569354"},"keyVaultClientContext.js":{"size":1454,"integrity":{"algorithm":"SHA256","hash":"056716b9ca55d73321033198ffd76a74ffbe27e51519c2f32fe1465e68a8b5e2","blockSize":4194304,"blocks":["056716b9ca55d73321033198ffd76a74ffbe27e51519c2f32fe1465e68a8b5e2"]},"offset":"5612992"},"models":{"files":{"index.js":{"size":9581,"integrity":{"algorithm":"SHA256","hash":"834122ea97fc41c5f75d6beda74724e8df6a54ec63b72e39be4e8ef7d34ca6a8","blockSize":4194304,"blocks":["834122ea97fc41c5f75d6beda74724e8df6a54ec63b72e39be4e8ef7d34ca6a8"]},"offset":"5614446"},"mappers.js":{"size":26929,"integrity":{"algorithm":"SHA256","hash":"4e6e53b8a7700747e6099143dd77f332783aa7131578059494c89f6b4e604f47","blockSize":4194304,"blocks":["4e6e53b8a7700747e6099143dd77f332783aa7131578059494c89f6b4e604f47"]},"offset":"5624027"},"parameters.js":{"size":6505,"integrity":{"algorithm":"SHA256","hash":"c779f9cc4b15e721bab9fc7536853f0729d9386444ab5b16183d31453268c50c","blockSize":4194304,"blocks":["c779f9cc4b15e721bab9fc7536853f0729d9386444ab5b16183d31453268c50c"]},"offset":"5650956"}}}}},"cryptography":{"files":{"aesCryptographyProvider.browser.js":{"size":1716,"integrity":{"algorithm":"SHA256","hash":"2e1cd6e0d8177786a2a0af7b526114f7b4af3e87be9ed5a7853a24968c672693","blockSize":4194304,"blocks":["2e1cd6e0d8177786a2a0af7b526114f7b4af3e87be9ed5a7853a24968c672693"]},"offset":"5657461"},"aesCryptographyProvider.js":{"size":4462,"integrity":{"algorithm":"SHA256","hash":"505e57fe07c79e7f1e723ef45dab81f92ab0ace6abc4e72540b132771e8016be","blockSize":4194304,"blocks":["505e57fe07c79e7f1e723ef45dab81f92ab0ace6abc4e72540b132771e8016be"]},"offset":"5659177"},"conversions.js":{"size":3273,"integrity":{"algorithm":"SHA256","hash":"b32a21ca4a6ac70c1f311bee96fdeee1081af0cfc6ff71d2cdcf9bb8c9026611","blockSize":4194304,"blocks":["b32a21ca4a6ac70c1f311bee96fdeee1081af0cfc6ff71d2cdcf9bb8c9026611"]},"offset":"5663639"},"crypto.browser.js":{"size":855,"integrity":{"algorithm":"SHA256","hash":"d226f805c6ba79421c437a2ce69b363710c7ef7f2d0e757219a03b4c7b019bd2","blockSize":4194304,"blocks":["d226f805c6ba79421c437a2ce69b363710c7ef7f2d0e757219a03b4c7b019bd2"]},"offset":"5666912"},"crypto.js":{"size":1792,"integrity":{"algorithm":"SHA256","hash":"aea4af49b278d655b34c2c1b5866457a44cd4a66e835a5b3bdbea1594b3ffc32","blockSize":4194304,"blocks":["aea4af49b278d655b34c2c1b5866457a44cd4a66e835a5b3bdbea1594b3ffc32"]},"offset":"5667767"},"models.js":{"size":174,"integrity":{"algorithm":"SHA256","hash":"bd6539bccdf95f56abaaad863dc40b7e7548e9935c8c77dceb93f007003445b6","blockSize":4194304,"blocks":["bd6539bccdf95f56abaaad863dc40b7e7548e9935c8c77dceb93f007003445b6"]},"offset":"5669559"},"remoteCryptographyProvider.js":{"size":8553,"integrity":{"algorithm":"SHA256","hash":"77a0ee6220693d561c9d4da1742ad0aa34bc6f892af1064d1991ce347aa9993b","blockSize":4194304,"blocks":["77a0ee6220693d561c9d4da1742ad0aa34bc6f892af1064d1991ce347aa9993b"]},"offset":"5669733"},"rsaCryptographyProvider.browser.js":{"size":1716,"integrity":{"algorithm":"SHA256","hash":"857e3232caf6e10195a76e6df8d1881bd7445df2cf4f97aa8da3922f09b8cde8","blockSize":4194304,"blocks":["857e3232caf6e10195a76e6df8d1881bd7445df2cf4f97aa8da3922f09b8cde8"]},"offset":"5678286"},"rsaCryptographyProvider.js":{"size":4071,"integrity":{"algorithm":"SHA256","hash":"475ec65b3db265fe82c1c9ac9a37b044175f390a967859b9ed0888e89675060b","blockSize":4194304,"blocks":["475ec65b3db265fe82c1c9ac9a37b044175f390a967859b9ed0888e89675060b"]},"offset":"5680002"}}}}}}},"keyvault-common":{"files":{"src":{"files":{"challengeBasedAuthenticationPolicy.js":{"size":7878,"integrity":{"algorithm":"SHA256","hash":"2cccc9271adf7aeb8146eb51fdad6b09ef18aa302b1cdd46c022eda6c43f1816","blockSize":4194304,"blocks":["2cccc9271adf7aeb8146eb51fdad6b09ef18aa302b1cdd46c022eda6c43f1816"]},"offset":"5684073"},"index.js":{"size":279,"integrity":{"algorithm":"SHA256","hash":"44a66246c87771329bbf19d67f32118a804ff5d00aae7dd50b196edbecaa8fe9","blockSize":4194304,"blocks":["44a66246c87771329bbf19d67f32118a804ff5d00aae7dd50b196edbecaa8fe9"]},"offset":"5691951"},"parseKeyvaultIdentifier.js":{"size":1415,"integrity":{"algorithm":"SHA256","hash":"fe67f81174900b568f22e3bf0170c97bd4fdc2db7d0ed634b72f8af26d23da89","blockSize":4194304,"blocks":["fe67f81174900b568f22e3bf0170c97bd4fdc2db7d0ed634b72f8af26d23da89"]},"offset":"5692230"},"parseWWWAuthenticate.js":{"size":1860,"integrity":{"algorithm":"SHA256","hash":"4ecec9479a6ebe4be3b79bd47ea01cf45ad521dfd5aafa40bd21927ad884bf59","blockSize":4194304,"blocks":["4ecec9479a6ebe4be3b79bd47ea01cf45ad521dfd5aafa40bd21927ad884bf59"]},"offset":"5693645"},"tracingHelpers.js":{"size":1434,"integrity":{"algorithm":"SHA256","hash":"7eda4db2ed74afc7b1bc5a1f7a59daa929aa755239daf40cf1996c341ca2f905","blockSize":4194304,"blocks":["7eda4db2ed74afc7b1bc5a1f7a59daa929aa755239daf40cf1996c341ca2f905"]},"offset":"5695505"}}}}}}},"dist":{"files":{"index.js":{"size":185246,"integrity":{"algorithm":"SHA256","hash":"064013cb92682cd86279219e21d65205b7a3cf3915bfc39d21b942cbcb704a9a","blockSize":4194304,"blocks":["064013cb92682cd86279219e21d65205b7a3cf3915bfc39d21b942cbcb704a9a"]},"offset":"5696939"}}},"node_modules":{"files":{"@azure":{"files":{"core-tracing":{"files":{"LICENSE":{"size":1076,"integrity":{"algorithm":"SHA256","hash":"1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef","blockSize":4194304,"blocks":["1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef"]},"offset":"46327636"},"package.json":{"size":1930,"integrity":{"algorithm":"SHA256","hash":"e417a629a49e896880cc13cf26973189f4b84a21c5701c09c27d2779b172712a","blockSize":4194304,"blocks":["e417a629a49e896880cc13cf26973189f4b84a21c5701c09c27d2779b172712a"]},"offset":"46328712"},"dist-esm":{"files":{"src":{"files":{"createSpan.js":{"size":2846,"integrity":{"algorithm":"SHA256","hash":"c62c133f01f1f32992d0d159c9572638b3121abfd0f35573984420173d96aed8","blockSize":4194304,"blocks":["c62c133f01f1f32992d0d159c9572638b3121abfd0f35573984420173d96aed8"]},"offset":"46330642"},"index.js":{"size":471,"integrity":{"algorithm":"SHA256","hash":"f64294bc31861aa522039f7778981aad1c9432bfe64d86354e7cf664a8d89bbb","blockSize":4194304,"blocks":["f64294bc31861aa522039f7778981aad1c9432bfe64d86354e7cf664a8d89bbb"]},"offset":"46333488"},"interfaces.js":{"size":3288,"integrity":{"algorithm":"SHA256","hash":"7e741acb0fdeaac2d7672df819845a61e61a6098fc22eebac4014f0e8beee141","blockSize":4194304,"blocks":["7e741acb0fdeaac2d7672df819845a61e61a6098fc22eebac4014f0e8beee141"]},"offset":"46333959"},"utils":{"files":{"traceParentHeader.js":{"size":1641,"integrity":{"algorithm":"SHA256","hash":"fd95aa681ca4fc0566db6ec841618204a5c761c5ad818588819a27490f47360d","blockSize":4194304,"blocks":["fd95aa681ca4fc0566db6ec841618204a5c761c5ad818588819a27490f47360d"]},"offset":"46337247"}}}}}}},"dist":{"files":{"index.js":{"size":7836,"integrity":{"algorithm":"SHA256","hash":"be0c1ec7e781ab2295f0ef166cea869353f190613d11a6743f1b5dd81f1af79e","blockSize":4194304,"blocks":["be0c1ec7e781ab2295f0ef166cea869353f190613d11a6743f1b5dd81f1af79e"]},"offset":"46338888"}}}}}}}}}}},"logger":{"files":{"LICENSE":{"size":1076,"integrity":{"algorithm":"SHA256","hash":"1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef","blockSize":4194304,"blocks":["1f83c934f29383a9b4ccb7a25eea6907da6f2b7675905fbb82f8f97f278b83ef"]},"offset":"5882185"},"package.json":{"size":1912,"integrity":{"algorithm":"SHA256","hash":"fbdbd1bb66ab67d3712a124f84495e0942034e1ba1d8aac5b3904c4d46424627","blockSize":4194304,"blocks":["fbdbd1bb66ab67d3712a124f84495e0942034e1ba1d8aac5b3904c4d46424627"]},"offset":"5883261"},"dist-esm":{"files":{"src":{"files":{"debug.js":{"size":2457,"integrity":{"algorithm":"SHA256","hash":"d4ad97e12cc7daeffadf64708cf796546615f21d6e81b70d6f4ead69b8be7a89","blockSize":4194304,"blocks":["d4ad97e12cc7daeffadf64708cf796546615f21d6e81b70d6f4ead69b8be7a89"]},"offset":"5885173"},"index.js":{"size":3244,"integrity":{"algorithm":"SHA256","hash":"520a4ad81fac68ddf53a28826bdb2c0751e710adca0cfd32c6edb1d359216899","blockSize":4194304,"blocks":["520a4ad81fac68ddf53a28826bdb2c0751e710adca0cfd32c6edb1d359216899"]},"offset":"5887630"},"log.browser.js":{"size":655,"integrity":{"algorithm":"SHA256","hash":"5f0ceb76f6013ee84cb245b51c578d9c1994a35aca553b5ba963811950351b4d","blockSize":4194304,"blocks":["5f0ceb76f6013ee84cb245b51c578d9c1994a35aca553b5ba963811950351b4d"]},"offset":"5890874"},"log.js":{"size":267,"integrity":{"algorithm":"SHA256","hash":"43c1b0cd50b9c0b4c61029f8a68034742a210a921dc4dc498a01b742788f032d","blockSize":4194304,"blocks":["43c1b0cd50b9c0b4c61029f8a68034742a210a921dc4dc498a01b742788f032d"]},"offset":"5891529"}}}}},"dist":{"files":{"index.js":{"size":6071,"integrity":{"algorithm":"SHA256","hash":"6d9786d9a9fcd5033df77f8fd1fda374e75c2b95fb720a3c04c75ce505d24fc7","blockSize":4194304,"blocks":["6d9786d9a9fcd5033df77f8fd1fda374e75c2b95fb720a3c04c75ce505d24fc7"]},"offset":"5891796"}}}}},"msal-browser":{"files":{"LICENSE":{"size":1094,"integrity":{"algorithm":"SHA256","hash":"c544adf8f0d43453d9fdf6c11da19605d12d89806a7870653169b8cc97f5bb53","blockSize":4194304,"blocks":["c544adf8f0d43453d9fdf6c11da19605d12d89806a7870653169b8cc97f5bb53"]},"offset":"5897867"},"package.json":{"size":1692,"integrity":{"algorithm":"SHA256","hash":"5fe373a8210cc756c05cb0d74a6818d4c3a1385dbb9ee44e608c2f8c26e0ea70","blockSize":4194304,"blocks":["5fe373a8210cc756c05cb0d74a6818d4c3a1385dbb9ee44e608c2f8c26e0ea70"]},"offset":"5898961"},"lib":{"files":{"msal-browser.js":{"size":877278,"integrity":{"algorithm":"SHA256","hash":"34f1c874b90d688d69a82fac2f05a620d43e2bc03aa9f07cd2b3186b7a4b3e24","blockSize":4194304,"blocks":["34f1c874b90d688d69a82fac2f05a620d43e2bc03aa9f07cd2b3186b7a4b3e24"]},"offset":"5900653"},"msal-browser.min.js":{"size":316610,"integrity":{"algorithm":"SHA256","hash":"8abca187b2fcc1757baa196f296f3156ace7627c06bdfca029076d134749163b","blockSize":4194304,"blocks":["8abca187b2fcc1757baa196f296f3156ace7627c06bdfca029076d134749163b"]},"offset":"6777931"}}},"dist":{"files":{"index.cjs.js":{"size":812607,"integrity":{"algorithm":"SHA256","hash":"0d3aa5ad5bf0213761d264a3de08c96d2e148309326bdf29f489af095fd7e851","blockSize":4194304,"blocks":["0d3aa5ad5bf0213761d264a3de08c96d2e148309326bdf29f489af095fd7e851"]},"offset":"7094541"},"index.js":{"size":1510,"integrity":{"algorithm":"SHA256","hash":"ff35bfc47cfd2b2b37177b02984cd95e8412040a1e8754b7a05a176bd8e35182","blockSize":4194304,"blocks":["ff35bfc47cfd2b2b37177b02984cd95e8412040a1e8754b7a05a176bd8e35182"]},"offset":"7907148"},"internals.js":{"size":1055,"integrity":{"algorithm":"SHA256","hash":"841eb280caa7570ce7413fbc91dfed99b742700ba5bb47f12eaef1523e725196","blockSize":4194304,"blocks":["841eb280caa7570ce7413fbc91dfed99b742700ba5bb47f12eaef1523e725196"]},"offset":"7908658"},"packageMetadata.js":{"size":226,"integrity":{"algorithm":"SHA256","hash":"763ea839b4f3c658049e0d7fd44de78e686b9f864308a4b10791a8dcdb9b5fa8","blockSize":4194304,"blocks":["763ea839b4f3c658049e0d7fd44de78e686b9f864308a4b10791a8dcdb9b5fa8"]},"offset":"7909713"},"utils":{"files":{"BrowserConstants.js":{"size":6485,"integrity":{"algorithm":"SHA256","hash":"e68c41862114c8a3c5b187ab8a9e85836a0c5a197a780c60188a71a89535b214","blockSize":4194304,"blocks":["e68c41862114c8a3c5b187ab8a9e85836a0c5a197a780c60188a71a89535b214"]},"offset":"7909939"},"BrowserProtocolUtils.js":{"size":1472,"integrity":{"algorithm":"SHA256","hash":"96aa1ef9370565ceaa5e0bcf2408f1387b22b693802c2a49d0defb536f889812","blockSize":4194304,"blocks":["96aa1ef9370565ceaa5e0bcf2408f1387b22b693802c2a49d0defb536f889812"]},"offset":"7916424"},"BrowserStringUtils.js":{"size":5212,"integrity":{"algorithm":"SHA256","hash":"b8c83c98c1a5ea11532100eabeee903255f0fa59d80706a0982dbe28ac00895e","blockSize":4194304,"blocks":["b8c83c98c1a5ea11532100eabeee903255f0fa59d80706a0982dbe28ac00895e"]},"offset":"7917896"},"BrowserUtils.js":{"size":5963,"integrity":{"algorithm":"SHA256","hash":"2362372b0706959cd714fccc975408f6eb23312744edf15d8f171bdb86fe478f","blockSize":4194304,"blocks":["2362372b0706959cd714fccc975408f6eb23312744edf15d8f171bdb86fe478f"]},"offset":"7923108"},"MathUtils.js":{"size":662,"integrity":{"algorithm":"SHA256","hash":"85d084028f6b35276164079ea8fa6f1d9d5a2a06394011f16dbee1fa74170919","blockSize":4194304,"blocks":["85d084028f6b35276164079ea8fa6f1d9d5a2a06394011f16dbee1fa74170919"]},"offset":"7929071"}}},"telemetry":{"files":{"BrowserPerformanceClient.js":{"size":2733,"integrity":{"algorithm":"SHA256","hash":"37d6ce0cd2b6acd90fe1d6e669444661af0afae873228b54d313a3d89d993c8f","blockSize":4194304,"blocks":["37d6ce0cd2b6acd90fe1d6e669444661af0afae873228b54d313a3d89d993c8f"]},"offset":"7929733"},"BrowserPerformanceMeasurement.js":{"size":2851,"integrity":{"algorithm":"SHA256","hash":"0fd347c1d3ec4d5d97707e5dd859f0614d19bf59ca39daa6718e2cb1ff8167aa","blockSize":4194304,"blocks":["0fd347c1d3ec4d5d97707e5dd859f0614d19bf59ca39daa6718e2cb1ff8167aa"]},"offset":"7932466"}}},"network":{"files":{"FetchClient.js":{"size":5573,"integrity":{"algorithm":"SHA256","hash":"55781b23bbb3a1e9013bb906e46ab5f33b82b42bfc8d84327a7d365408d53e88","blockSize":4194304,"blocks":["55781b23bbb3a1e9013bb906e46ab5f33b82b42bfc8d84327a7d365408d53e88"]},"offset":"7935317"},"XhrClient.js":{"size":5212,"integrity":{"algorithm":"SHA256","hash":"9f641695cd3c5172715bc311df5954719114ce2f93da6508e17941fc01b748f7","blockSize":4194304,"blocks":["9f641695cd3c5172715bc311df5954719114ce2f93da6508e17941fc01b748f7"]},"offset":"7940890"}}},"navigation":{"files":{"NavigationClient.js":{"size":1508,"integrity":{"algorithm":"SHA256","hash":"959644da3f37f73922133446404fc1eec1b47c8d55b65c4810b5aa67f3d12e36","blockSize":4194304,"blocks":["959644da3f37f73922133446404fc1eec1b47c8d55b65c4810b5aa67f3d12e36"]},"offset":"7946102"}}},"interaction_handler":{"files":{"InteractionHandler.js":{"size":7661,"integrity":{"algorithm":"SHA256","hash":"4ad4cc7222bc961f3ff9d8b27c13965ceb7613a7de66a2dc769f1e750844aaf3","blockSize":4194304,"blocks":["4ad4cc7222bc961f3ff9d8b27c13965ceb7613a7de66a2dc769f1e750844aaf3"]},"offset":"7947610"},"RedirectHandler.js":{"size":8504,"integrity":{"algorithm":"SHA256","hash":"95896a3730c794fc1785384b043a318fba6aacf82e18db3793d6f67f0a52a010","blockSize":4194304,"blocks":["95896a3730c794fc1785384b043a318fba6aacf82e18db3793d6f67f0a52a010"]},"offset":"7955271"},"SilentHandler.js":{"size":6815,"integrity":{"algorithm":"SHA256","hash":"e2c04a3e271d41b85e77ceeb37ed6da8c1196c391ce068cecd3efb08db3edf79","blockSize":4194304,"blocks":["e2c04a3e271d41b85e77ceeb37ed6da8c1196c391ce068cecd3efb08db3edf79"]},"offset":"7963775"}}},"interaction_client":{"files":{"BaseInteractionClient.js":{"size":9641,"integrity":{"algorithm":"SHA256","hash":"f9d08ab40b1345bc742f08b9207ef37126b9b4e322cc9be11e3468ae9f1af302","blockSize":4194304,"blocks":["f9d08ab40b1345bc742f08b9207ef37126b9b4e322cc9be11e3468ae9f1af302"]},"offset":"7970590"},"HybridSpaAuthorizationCodeClient.js":{"size":782,"integrity":{"algorithm":"SHA256","hash":"5882faa523d4f73fd3bb69f9e9c3cd3881eb09eecabad14f118e9d07b281ce04","blockSize":4194304,"blocks":["5882faa523d4f73fd3bb69f9e9c3cd3881eb09eecabad14f118e9d07b281ce04"]},"offset":"7980231"},"NativeInteractionClient.js":{"size":26926,"integrity":{"algorithm":"SHA256","hash":"ae1455dee95884b52f5bfc30a5c873aedb1f2a816375fa2919f6fb0935eb27fa","blockSize":4194304,"blocks":["ae1455dee95884b52f5bfc30a5c873aedb1f2a816375fa2919f6fb0935eb27fa"]},"offset":"7981013"},"PopupClient.js":{"size":28325,"integrity":{"algorithm":"SHA256","hash":"4442494257da0382c217ec9177fec77f153b69f3e1aeedca9ca3cc290abbc93d","blockSize":4194304,"blocks":["4442494257da0382c217ec9177fec77f153b69f3e1aeedca9ca3cc290abbc93d"]},"offset":"8007939"},"RedirectClient.js":{"size":22399,"integrity":{"algorithm":"SHA256","hash":"47394a748e0cc62c65794d28f13ad39e1104df5dc378f57f10472113afcfc1fc","blockSize":4194304,"blocks":["47394a748e0cc62c65794d28f13ad39e1104df5dc378f57f10472113afcfc1fc"]},"offset":"8036264"},"SilentAuthCodeClient.js":{"size":4769,"integrity":{"algorithm":"SHA256","hash":"d6707d7d5f3e62539d5a924a783f1cea506ea30c76667bc8e2974a48517385bb","blockSize":4194304,"blocks":["d6707d7d5f3e62539d5a924a783f1cea506ea30c76667bc8e2974a48517385bb"]},"offset":"8058663"},"SilentCacheClient.js":{"size":5255,"integrity":{"algorithm":"SHA256","hash":"5e8be2a8ce196fd8427f4142884f91525587140439c7aea61c664acd3af7cef1","blockSize":4194304,"blocks":["5e8be2a8ce196fd8427f4142884f91525587140439c7aea61c664acd3af7cef1"]},"offset":"8063432"},"SilentIframeClient.js":{"size":9156,"integrity":{"algorithm":"SHA256","hash":"bfb2668f9ba5a26e5c5db3c0e5e8d97cbbd6de62d7d9a8765ee61ca582179959","blockSize":4194304,"blocks":["bfb2668f9ba5a26e5c5db3c0e5e8d97cbbd6de62d7d9a8765ee61ca582179959"]},"offset":"8068687"},"SilentRefreshClient.js":{"size":4697,"integrity":{"algorithm":"SHA256","hash":"25cfdfe04d129e02a31c7bec089f733f3fdd799d5a8fc8baec23e74e1258ec03","blockSize":4194304,"blocks":["25cfdfe04d129e02a31c7bec089f733f3fdd799d5a8fc8baec23e74e1258ec03"]},"offset":"8077843"},"StandardInteractionClient.js":{"size":16767,"integrity":{"algorithm":"SHA256","hash":"ed7fe2acfa6271776b793b1c7f9d6e507de3b18e62d40938f3831ebc12d07ce6","blockSize":4194304,"blocks":["ed7fe2acfa6271776b793b1c7f9d6e507de3b18e62d40938f3831ebc12d07ce6"]},"offset":"8082540"}}},"event":{"files":{"EventHandler.js":{"size":5068,"integrity":{"algorithm":"SHA256","hash":"7450a22896a1609f96025649541a63c630aedbf73f01baf889d7f8c2a2aaba2c","blockSize":4194304,"blocks":["7450a22896a1609f96025649541a63c630aedbf73f01baf889d7f8c2a2aaba2c"]},"offset":"8099307"},"EventMessage.js":{"size":3178,"integrity":{"algorithm":"SHA256","hash":"7892910c3d738c5b1efc7f2306a1bc2e408e5d76639e0fbd93caaf4f9f4bbe68","blockSize":4194304,"blocks":["7892910c3d738c5b1efc7f2306a1bc2e408e5d76639e0fbd93caaf4f9f4bbe68"]},"offset":"8104375"},"EventType.js":{"size":1829,"integrity":{"algorithm":"SHA256","hash":"c78b057208b5b971d2e78dcf305e6b4d2921366221b763bf66eeab8f53578d20","blockSize":4194304,"blocks":["c78b057208b5b971d2e78dcf305e6b4d2921366221b763bf66eeab8f53578d20"]},"offset":"8107553"}}},"error":{"files":{"BrowserAuthError.js":{"size":25103,"integrity":{"algorithm":"SHA256","hash":"7da0afe1070197532e7f49ac07242d906623cd64c3219e087accf878415bb3a6","blockSize":4194304,"blocks":["7da0afe1070197532e7f49ac07242d906623cd64c3219e087accf878415bb3a6"]},"offset":"8109382"},"BrowserConfigurationAuthError.js":{"size":5312,"integrity":{"algorithm":"SHA256","hash":"34cc3692b542488647eaed19a350d8a7baaabe56c83289a1610af3af8c8e4b0b","blockSize":4194304,"blocks":["34cc3692b542488647eaed19a350d8a7baaabe56c83289a1610af3af8c8e4b0b"]},"offset":"8134485"},"NativeAuthError.js":{"size":4184,"integrity":{"algorithm":"SHA256","hash":"230d7ccecb147d4ec8098706d4ab8c4492ffd6b2a291165da9fc6f62f6da276f","blockSize":4194304,"blocks":["230d7ccecb147d4ec8098706d4ab8c4492ffd6b2a291165da9fc6f62f6da276f"]},"offset":"8139797"}}},"encode":{"files":{"Base64Decode.js":{"size":3134,"integrity":{"algorithm":"SHA256","hash":"be44a68c8a631c1a862359304376c1d641b40ea6ee83c9b073fce4a2c0b727f3","blockSize":4194304,"blocks":["be44a68c8a631c1a862359304376c1d641b40ea6ee83c9b073fce4a2c0b727f3"]},"offset":"8143981"},"Base64Encode.js":{"size":3351,"integrity":{"algorithm":"SHA256","hash":"7ca721f9a3e0458daf0d004a7f523e4e9622b4e4741b5b810bb4c6a07631ade2","blockSize":4194304,"blocks":["7ca721f9a3e0458daf0d004a7f523e4e9622b4e4741b5b810bb4c6a07631ade2"]},"offset":"8147115"}}},"crypto":{"files":{"BrowserCrypto.js":{"size":11730,"integrity":{"algorithm":"SHA256","hash":"34dbb5466cf9132d685f47de099eb0d60ee61d0ce3085b6e842113b2dc1ff3a0","blockSize":4194304,"blocks":["34dbb5466cf9132d685f47de099eb0d60ee61d0ce3085b6e842113b2dc1ff3a0"]},"offset":"8150466"},"CryptoOps.js":{"size":12424,"integrity":{"algorithm":"SHA256","hash":"a2b1a263471440bfebd120c3d5383492bad008ea0659f724aa5ca1e94b7d7a09","blockSize":4194304,"blocks":["a2b1a263471440bfebd120c3d5383492bad008ea0659f724aa5ca1e94b7d7a09"]},"offset":"8162196"},"GuidGenerator.js":{"size":4712,"integrity":{"algorithm":"SHA256","hash":"f3b925bac418e43438d1c6b3eb40f27e7dbda8ae056a3dddd8cb6a8b104e13af","blockSize":4194304,"blocks":["f3b925bac418e43438d1c6b3eb40f27e7dbda8ae056a3dddd8cb6a8b104e13af"]},"offset":"8174620"},"PkceGenerator.js":{"size":3504,"integrity":{"algorithm":"SHA256","hash":"a8dd05044530f90f5dfacd6aeb2ccd6718abaf093a794618315fd5af152e448c","blockSize":4194304,"blocks":["a8dd05044530f90f5dfacd6aeb2ccd6718abaf093a794618315fd5af152e448c"]},"offset":"8179332"},"SignedHttpRequest.js":{"size":3131,"integrity":{"algorithm":"SHA256","hash":"94380dadec28227b566b0bcf3b151826f03360279af859b9db226aa6849576e4","blockSize":4194304,"blocks":["94380dadec28227b566b0bcf3b151826f03360279af859b9db226aa6849576e4"]},"offset":"8182836"}}},"config":{"files":{"Configuration.js":{"size":4290,"integrity":{"algorithm":"SHA256","hash":"c068297a2ce65a1708ffd3eb44617e79a316fc46836081c1ed59ae19785d0759","blockSize":4194304,"blocks":["c068297a2ce65a1708ffd3eb44617e79a316fc46836081c1ed59ae19785d0759"]},"offset":"8185967"}}},"cache":{"files":{"AsyncMemoryStorage.js":{"size":9137,"integrity":{"algorithm":"SHA256","hash":"d84a2fe9a8234a907a32de65c288326268a0249751073a9f339c5c0f61ee0c38","blockSize":4194304,"blocks":["d84a2fe9a8234a907a32de65c288326268a0249751073a9f339c5c0f61ee0c38"]},"offset":"8190257"},"BrowserCacheManager.js":{"size":44899,"integrity":{"algorithm":"SHA256","hash":"2a7e341f31268b48783e9f80236e0c573fc651d7f4ffcb36881545650c1c8cd8","blockSize":4194304,"blocks":["2a7e341f31268b48783e9f80236e0c573fc651d7f4ffcb36881545650c1c8cd8"]},"offset":"8199394"},"BrowserStorage.js":{"size":1745,"integrity":{"algorithm":"SHA256","hash":"1cd336fe22e935016837ac66c70cd437aed332aae9e61e8ce6bb9210f78d0a0d","blockSize":4194304,"blocks":["1cd336fe22e935016837ac66c70cd437aed332aae9e61e8ce6bb9210f78d0a0d"]},"offset":"8244293"},"DatabaseStorage.js":{"size":13001,"integrity":{"algorithm":"SHA256","hash":"3e790f19232d5345c907d7ad64070b7113beb8da7e174563f92c18c65d811b47","blockSize":4194304,"blocks":["3e790f19232d5345c907d7ad64070b7113beb8da7e174563f92c18c65d811b47"]},"offset":"8246038"},"MemoryStorage.js":{"size":1117,"integrity":{"algorithm":"SHA256","hash":"d36594aeda5e93428852026416aa07f1f1f035dc74c1c4b57413cdb0d039a0f1","blockSize":4194304,"blocks":["d36594aeda5e93428852026416aa07f1f1f035dc74c1c4b57413cdb0d039a0f1"]},"offset":"8259039"},"TokenCache.js":{"size":6533,"integrity":{"algorithm":"SHA256","hash":"2836ec652ff3500d29a6bb8a0d4262aae5c6d10ff194a818fdfbfd5abb22b1bf","blockSize":4194304,"blocks":["2836ec652ff3500d29a6bb8a0d4262aae5c6d10ff194a818fdfbfd5abb22b1bf"]},"offset":"8260156"}}},"broker":{"files":{"nativeBroker":{"files":{"NativeMessageHandler.js":{"size":12469,"integrity":{"algorithm":"SHA256","hash":"dd61e8de3cfec507477a70da5ed8f96bd4982004f37f079301955403267d7ce9","blockSize":4194304,"blocks":["dd61e8de3cfec507477a70da5ed8f96bd4982004f37f079301955403267d7ce9"]},"offset":"8266689"}}}}},"app":{"files":{"ClientApplication.js":{"size":55186,"integrity":{"algorithm":"SHA256","hash":"0a8bbf94e6bb9487c14cd33df8fba9ee8a5b9fadf95e479f42ac158d49401aaa","blockSize":4194304,"blocks":["0a8bbf94e6bb9487c14cd33df8fba9ee8a5b9fadf95e479f42ac158d49401aaa"]},"offset":"8279158"},"IPublicClientApplication.js":{"size":3474,"integrity":{"algorithm":"SHA256","hash":"e58a41dc01e31f6d0b9c8c52648579eea3d583aab01bcda0ccf36ae4752bd469","blockSize":4194304,"blocks":["e58a41dc01e31f6d0b9c8c52648579eea3d583aab01bcda0ccf36ae4752bd469"]},"offset":"8334344"},"PublicClientApplication.js":{"size":14102,"integrity":{"algorithm":"SHA256","hash":"72f0740e8659d06ac2090b01302f694f99a9dbbe273ea71c91e168daa99d94d1","blockSize":4194304,"blocks":["72f0740e8659d06ac2090b01302f694f99a9dbbe273ea71c91e168daa99d94d1"]},"offset":"8337818"}}},"_virtual":{"files":{"_tslib.js":{"size":5437,"integrity":{"algorithm":"SHA256","hash":"a9ebe7329ee5d8a57a78c79cee2acfd3c22d061e68694a5d811c748c7e7f5e93","blockSize":4194304,"blocks":["a9ebe7329ee5d8a57a78c79cee2acfd3c22d061e68694a5d811c748c7e7f5e93"]},"offset":"8351920"}}}}}}},"msal-common":{"files":{"LICENSE":{"size":1094,"integrity":{"algorithm":"SHA256","hash":"c544adf8f0d43453d9fdf6c11da19605d12d89806a7870653169b8cc97f5bb53","blockSize":4194304,"blocks":["c544adf8f0d43453d9fdf6c11da19605d12d89806a7870653169b8cc97f5bb53"]},"offset":"8357357"},"package.json":{"size":1327,"integrity":{"algorithm":"SHA256","hash":"8b57464c31169830ad6ba5d365a8f7dcdd10a415b51e6be978a2cb748dda4a57","blockSize":4194304,"blocks":["8b57464c31169830ad6ba5d365a8f7dcdd10a415b51e6be978a2cb748dda4a57"]},"offset":"8358451"},"dist":{"files":{"index.cjs.js":{"size":424465,"integrity":{"algorithm":"SHA256","hash":"b994498f6c59449265e7135f4f8727c582a263ce69404a564892067d317e83a4","blockSize":4194304,"blocks":["b994498f6c59449265e7135f4f8727c582a263ce69404a564892067d317e83a4"]},"offset":"8359778"},"index.js":{"size":3792,"integrity":{"algorithm":"SHA256","hash":"74b12f420cee6dd3a778e78006db8b1e4f1326c8c86c46dc1625ea2fcdabddac","blockSize":4194304,"blocks":["74b12f420cee6dd3a778e78006db8b1e4f1326c8c86c46dc1625ea2fcdabddac"]},"offset":"8784243"},"packageMetadata.js":{"size":222,"integrity":{"algorithm":"SHA256","hash":"3b7d5abe7b7ae70b668e2f89473c3731f611f544b761e687ac82b9d64e28d40e","blockSize":4194304,"blocks":["3b7d5abe7b7ae70b668e2f89473c3731f611f544b761e687ac82b9d64e28d40e"]},"offset":"8788035"},"utils":{"files":{"Constants.js":{"size":15755,"integrity":{"algorithm":"SHA256","hash":"d86da728643b8033ae84b19317b695edee0db916ea7b29329aee57d1c0106644","blockSize":4194304,"blocks":["d86da728643b8033ae84b19317b695edee0db916ea7b29329aee57d1c0106644"]},"offset":"8788257"},"ProtocolUtils.js":{"size":3060,"integrity":{"algorithm":"SHA256","hash":"37dcfa09033fef0c565e8b227d77ace42ab3e41219d90c4dc228c896ac58f668","blockSize":4194304,"blocks":["37dcfa09033fef0c565e8b227d77ace42ab3e41219d90c4dc228c896ac58f668"]},"offset":"8804012"},"StringUtils.js":{"size":4171,"integrity":{"algorithm":"SHA256","hash":"b848ff696421de57c749a2e78df97c9f4641cb759f1492420a1601dc707cf302","blockSize":4194304,"blocks":["b848ff696421de57c749a2e78df97c9f4641cb759f1492420a1601dc707cf302"]},"offset":"8807072"},"TimeUtils.js":{"size":1858,"integrity":{"algorithm":"SHA256","hash":"3c71a91935ad6addd1a025f1653507ddbe286d3da785582af392028d7e014b16","blockSize":4194304,"blocks":["3c71a91935ad6addd1a025f1653507ddbe286d3da785582af392028d7e014b16"]},"offset":"8811243"}}},"url":{"files":{"UrlString.js":{"size":8430,"integrity":{"algorithm":"SHA256","hash":"fc0f90322fc327f1aaa8df64e779f7ac861e36cc912328e3f0030aff0e10dabb","blockSize":4194304,"blocks":["fc0f90322fc327f1aaa8df64e779f7ac861e36cc912328e3f0030aff0e10dabb"]},"offset":"8813101"}}},"telemetry":{"files":{"server":{"files":{"ServerTelemetryManager.js":{"size":8576,"integrity":{"algorithm":"SHA256","hash":"1755c652c8036bebee1adf20f87c0e34cc804e58833ccae48ccc6e3aff3aab1e","blockSize":4194304,"blocks":["1755c652c8036bebee1adf20f87c0e34cc804e58833ccae48ccc6e3aff3aab1e"]},"offset":"8821531"}}},"performance":{"files":{"PerformanceClient.js":{"size":14209,"integrity":{"algorithm":"SHA256","hash":"7852a1b00f7959be58997578b84ee80f1b3035e3b891eb85e0d17042bdb96f54","blockSize":4194304,"blocks":["7852a1b00f7959be58997578b84ee80f1b3035e3b891eb85e0d17042bdb96f54"]},"offset":"8830107"},"PerformanceEvent.js":{"size":5355,"integrity":{"algorithm":"SHA256","hash":"465cb0c5faab6e4d9a85d99c57113f25766744199d0489c52f2250ef35a79eb8","blockSize":4194304,"blocks":["465cb0c5faab6e4d9a85d99c57113f25766744199d0489c52f2250ef35a79eb8"]},"offset":"8844316"},"StubPerformanceClient.js":{"size":1493,"integrity":{"algorithm":"SHA256","hash":"e47c3deec625b618790e2ee0fd8a5bf5673c5228d94b38761df0562ee6b9fa5d","blockSize":4194304,"blocks":["e47c3deec625b618790e2ee0fd8a5bf5673c5228d94b38761df0562ee6b9fa5d"]},"offset":"8849671"}}}}},"response":{"files":{"ResponseHandler.js":{"size":19503,"integrity":{"algorithm":"SHA256","hash":"318067dde719f967ce1a6ea1a5bbdab77113d5b1932e7ce7e8c7ee3ab6447a6e","blockSize":4194304,"blocks":["318067dde719f967ce1a6ea1a5bbdab77113d5b1932e7ce7e8c7ee3ab6447a6e"]},"offset":"8851164"}}},"request":{"files":{"AuthenticationHeaderParser.js":{"size":3038,"integrity":{"algorithm":"SHA256","hash":"4780be7a9c03b1e43996fd93ead80be6d33b150f3568cd673ebdc9c964681f39","blockSize":4194304,"blocks":["4780be7a9c03b1e43996fd93ead80be6d33b150f3568cd673ebdc9c964681f39"]},"offset":"8870667"},"RequestParameterBuilder.js":{"size":16002,"integrity":{"algorithm":"SHA256","hash":"c11cdd177d24168b477ce2d40e478eae749b2500dffd029196266d70c9b6a35e","blockSize":4194304,"blocks":["c11cdd177d24168b477ce2d40e478eae749b2500dffd029196266d70c9b6a35e"]},"offset":"8873705"},"RequestValidator.js":{"size":3198,"integrity":{"algorithm":"SHA256","hash":"224c0468748478a253361440df4a68a040400d24ce02d2ee355631df4a07de3f","blockSize":4194304,"blocks":["224c0468748478a253361440df4a68a040400d24ce02d2ee355631df4a07de3f"]},"offset":"8889707"},"ScopeSet.js":{"size":7622,"integrity":{"algorithm":"SHA256","hash":"3dd394dd5995dc15152946e2da5f5b21ff117779a8bcfc763fa196c7262df7eb","blockSize":4194304,"blocks":["3dd394dd5995dc15152946e2da5f5b21ff117779a8bcfc763fa196c7262df7eb"]},"offset":"8892905"}}},"network":{"files":{"INetworkModule.js":{"size":824,"integrity":{"algorithm":"SHA256","hash":"25cee01b79a03df9fe13e69fa51216f1105e96a50cd29dc68c09a26467beddbd","blockSize":4194304,"blocks":["25cee01b79a03df9fe13e69fa51216f1105e96a50cd29dc68c09a26467beddbd"]},"offset":"8900527"},"NetworkManager.js":{"size":2224,"integrity":{"algorithm":"SHA256","hash":"073cb4e7d9c4063280fcb0e60125c8c193827a015a6932a51c2fbac207109542","blockSize":4194304,"blocks":["073cb4e7d9c4063280fcb0e60125c8c193827a015a6932a51c2fbac207109542"]},"offset":"8901351"},"ThrottlingUtils.js":{"size":4409,"integrity":{"algorithm":"SHA256","hash":"6b183c3ed072aabafd58e2f6b0ba063b20e7107bcf899bd137b0fafdc86d769c","blockSize":4194304,"blocks":["6b183c3ed072aabafd58e2f6b0ba063b20e7107bcf899bd137b0fafdc86d769c"]},"offset":"8903575"}}},"logger":{"files":{"Logger.js":{"size":6816,"integrity":{"algorithm":"SHA256","hash":"d0485c56105723f587c9bca1903abfba3ff1ce279747263b952acc296ced16cf","blockSize":4194304,"blocks":["d0485c56105723f587c9bca1903abfba3ff1ce279747263b952acc296ced16cf"]},"offset":"8907984"}}},"error":{"files":{"AuthError.js":{"size":2315,"integrity":{"algorithm":"SHA256","hash":"0a13cb232326288c39ae9bd6c385d1a1387ff59d31faaf2b5cdcfe17626d46a1","blockSize":4194304,"blocks":["0a13cb232326288c39ae9bd6c385d1a1387ff59d31faaf2b5cdcfe17626d46a1"]},"offset":"8914800"},"ClientAuthError.js":{"size":23002,"integrity":{"algorithm":"SHA256","hash":"8fc91607a0e13ac664be43c2918b32bb8f381043be704e2d17ab60cf7c1278e9","blockSize":4194304,"blocks":["8fc91607a0e13ac664be43c2918b32bb8f381043be704e2d17ab60cf7c1278e9"]},"offset":"8917115"},"ClientConfigurationError.js":{"size":13828,"integrity":{"algorithm":"SHA256","hash":"92f59194272a343a4deabdd8c954e53c5ee23dc35c2a2e34b7e2080a9aee5c8f","blockSize":4194304,"blocks":["92f59194272a343a4deabdd8c954e53c5ee23dc35c2a2e34b7e2080a9aee5c8f"]},"offset":"8940117"},"InteractionRequiredAuthError.js":{"size":3763,"integrity":{"algorithm":"SHA256","hash":"bd215dbd695a3da3ffc80b746a71ec7630140bdf67b4d24b8d640500d0f43f25","blockSize":4194304,"blocks":["bd215dbd695a3da3ffc80b746a71ec7630140bdf67b4d24b8d640500d0f43f25"]},"offset":"8953945"},"JoseHeaderError.js":{"size":2036,"integrity":{"algorithm":"SHA256","hash":"215582214f3812960193b9ac1087b0f70b93287789aa93290c28851fab528f6c","blockSize":4194304,"blocks":["215582214f3812960193b9ac1087b0f70b93287789aa93290c28851fab528f6c"]},"offset":"8957708"},"ServerError.js":{"size":833,"integrity":{"algorithm":"SHA256","hash":"efdda7be8b76a8483710728396abd2730c1aab1da535c747fdc7d5275ed90784","blockSize":4194304,"blocks":["efdda7be8b76a8483710728396abd2730c1aab1da535c747fdc7d5275ed90784"]},"offset":"8959744"}}},"crypto":{"files":{"ICrypto.js":{"size":3262,"integrity":{"algorithm":"SHA256","hash":"f4b63eee9197423b23b136e9bc2478f2db52dcfa64645feda772911cfa6868a9","blockSize":4194304,"blocks":["f4b63eee9197423b23b136e9bc2478f2db52dcfa64645feda772911cfa6868a9"]},"offset":"8960577"},"JoseHeader.js":{"size":1653,"integrity":{"algorithm":"SHA256","hash":"999cba495897ba71e46ac63c0088866cbf7f014eac42c2c9270ec44b74e6f5f0","blockSize":4194304,"blocks":["999cba495897ba71e46ac63c0088866cbf7f014eac42c2c9270ec44b74e6f5f0"]},"offset":"8963839"},"PopTokenGenerator.js":{"size":5169,"integrity":{"algorithm":"SHA256","hash":"8e4a9bfd88b1940fcef58c16056dc87aae4d0050745640e8cbda3287a9e6b638","blockSize":4194304,"blocks":["8e4a9bfd88b1940fcef58c16056dc87aae4d0050745640e8cbda3287a9e6b638"]},"offset":"8965492"}}},"config":{"files":{"ClientConfiguration.js":{"size":4605,"integrity":{"algorithm":"SHA256","hash":"0c4431fb5867ac5e0e2d3f03e69bb9abd547b5c4cb0134e76c01297261b84460","blockSize":4194304,"blocks":["0c4431fb5867ac5e0e2d3f03e69bb9abd547b5c4cb0134e76c01297261b84460"]},"offset":"8970661"}}},"client":{"files":{"AuthorizationCodeClient.js":{"size":27864,"integrity":{"algorithm":"SHA256","hash":"fb98b41aaac59490138555a44e4e4f8dcb931ea65878ff8b73c2d4bcb5608bf5","blockSize":4194304,"blocks":["fb98b41aaac59490138555a44e4e4f8dcb931ea65878ff8b73c2d4bcb5608bf5"]},"offset":"8975266"},"BaseClient.js":{"size":4750,"integrity":{"algorithm":"SHA256","hash":"6c604641f39af832a774a2feb8bee20e70ba00088083608cbea379eb7b00ba76","blockSize":4194304,"blocks":["6c604641f39af832a774a2feb8bee20e70ba00088083608cbea379eb7b00ba76"]},"offset":"9003130"},"ClientCredentialClient.js":{"size":10927,"integrity":{"algorithm":"SHA256","hash":"a313ad2b74279db58af358fadb7fcd8659e13ee369a9024516cda2094a01cc4e","blockSize":4194304,"blocks":["a313ad2b74279db58af358fadb7fcd8659e13ee369a9024516cda2094a01cc4e"]},"offset":"9007880"},"DeviceCodeClient.js":{"size":12874,"integrity":{"algorithm":"SHA256","hash":"ec98f1b59d7ef14a50037f793c8d9d4304789a72d7c85a87d852d39c2d684fe1","blockSize":4194304,"blocks":["ec98f1b59d7ef14a50037f793c8d9d4304789a72d7c85a87d852d39c2d684fe1"]},"offset":"9018807"},"OnBehalfOfClient.js":{"size":13802,"integrity":{"algorithm":"SHA256","hash":"b91c40d4725c4a1c20591129902960055173ab4bbdaafb54fceb57cfab05ca01","blockSize":4194304,"blocks":["b91c40d4725c4a1c20591129902960055173ab4bbdaafb54fceb57cfab05ca01"]},"offset":"9031681"},"RefreshTokenClient.js":{"size":15284,"integrity":{"algorithm":"SHA256","hash":"ba2df4509ead1a9fec50726f2279b02b760103a8cbdf99368e1fd4e5b68c0638","blockSize":4194304,"blocks":["ba2df4509ead1a9fec50726f2279b02b760103a8cbdf99368e1fd4e5b68c0638"]},"offset":"9045483"},"SilentFlowClient.js":{"size":7515,"integrity":{"algorithm":"SHA256","hash":"d4a3adc885f23fbd848cf5f215bb9b5bbf1a07184686d329125f501dad8fc2e4","blockSize":4194304,"blocks":["d4a3adc885f23fbd848cf5f215bb9b5bbf1a07184686d329125f501dad8fc2e4"]},"offset":"9060767"},"UsernamePasswordClient.js":{"size":6157,"integrity":{"algorithm":"SHA256","hash":"9962728f4433cd289be9fa2b8c4fc91cdc9e18e33a38b4ae4a999c44eb3e295c","blockSize":4194304,"blocks":["9962728f4433cd289be9fa2b8c4fc91cdc9e18e33a38b4ae4a999c44eb3e295c"]},"offset":"9068282"}}},"cache":{"files":{"CacheManager.js":{"size":39921,"integrity":{"algorithm":"SHA256","hash":"757b1023f7e672a29cdc78a8de8074c6741371720e1068fc2a5a39783eebc273","blockSize":4194304,"blocks":["757b1023f7e672a29cdc78a8de8074c6741371720e1068fc2a5a39783eebc273"]},"offset":"9074439"},"persistence":{"files":{"TokenCacheContext.js":{"size":1195,"integrity":{"algorithm":"SHA256","hash":"f2a75dee4af0dcf5ec56dec52b1399ac8908b04a25795fee976d1a9107e140d1","blockSize":4194304,"blocks":["f2a75dee4af0dcf5ec56dec52b1399ac8908b04a25795fee976d1a9107e140d1"]},"offset":"9114360"}}},"entities":{"files":{"AccessTokenEntity.js":{"size":5912,"integrity":{"algorithm":"SHA256","hash":"6762e69bd82a5960751b348eff38500373af9720fc9f80cff25e2e310b0c5a4d","blockSize":4194304,"blocks":["6762e69bd82a5960751b348eff38500373af9720fc9f80cff25e2e310b0c5a4d"]},"offset":"9115555"},"AccountEntity.js":{"size":11946,"integrity":{"algorithm":"SHA256","hash":"3af0389e96377d30d9aad0954db120b35d831d96410691161e585514c1428373","blockSize":4194304,"blocks":["3af0389e96377d30d9aad0954db120b35d831d96410691161e585514c1428373"]},"offset":"9121467"},"AppMetadataEntity.js":{"size":2315,"integrity":{"algorithm":"SHA256","hash":"9e2486969929c095294d89e734f9f6b999ccc911c6ff006d981b8cf5e7876a40","blockSize":4194304,"blocks":["9e2486969929c095294d89e734f9f6b999ccc911c6ff006d981b8cf5e7876a40"]},"offset":"9133413"},"AuthorityMetadataEntity.js":{"size":3311,"integrity":{"algorithm":"SHA256","hash":"a218abfd7052f27613a09c5b02f611bf51d96dd95583da3ebdabd4dd88d00c41","blockSize":4194304,"blocks":["a218abfd7052f27613a09c5b02f611bf51d96dd95583da3ebdabd4dd88d00c41"]},"offset":"9135728"},"CacheRecord.js":{"size":693,"integrity":{"algorithm":"SHA256","hash":"2255e931e53b1bd55a58eed8faba831fa2d53b56b668a22cc82937a0795c959b","blockSize":4194304,"blocks":["2255e931e53b1bd55a58eed8faba831fa2d53b56b668a22cc82937a0795c959b"]},"offset":"9139039"},"CredentialEntity.js":{"size":7452,"integrity":{"algorithm":"SHA256","hash":"76b841201da62246ed93f96139a24ea0aa8014b9e8c2c808b3602174e9b5254d","blockSize":4194304,"blocks":["76b841201da62246ed93f96139a24ea0aa8014b9e8c2c808b3602174e9b5254d"]},"offset":"9139732"},"IdTokenEntity.js":{"size":2588,"integrity":{"algorithm":"SHA256","hash":"a20962d148c32fbdb48bf5cc83510b58038b003fc908c22899e2b4a7f761d0cd","blockSize":4194304,"blocks":["a20962d148c32fbdb48bf5cc83510b58038b003fc908c22899e2b4a7f761d0cd"]},"offset":"9147184"},"RefreshTokenEntity.js":{"size":2861,"integrity":{"algorithm":"SHA256","hash":"1f4db1ab6bedda9594a4be7cb305c70b9f2241f43850b04e5d463118a108a2f8","blockSize":4194304,"blocks":["1f4db1ab6bedda9594a4be7cb305c70b9f2241f43850b04e5d463118a108a2f8"]},"offset":"9149772"},"ServerTelemetryEntity.js":{"size":1176,"integrity":{"algorithm":"SHA256","hash":"03e111737c37707800e7b8ae8925d96932ba146ccc7da549f7cf03eb54f40bdc","blockSize":4194304,"blocks":["03e111737c37707800e7b8ae8925d96932ba146ccc7da549f7cf03eb54f40bdc"]},"offset":"9152633"},"ThrottlingEntity.js":{"size":984,"integrity":{"algorithm":"SHA256","hash":"34818f8708c5b6b8ed53cca1e8ac88be630fc05d401ea6d3c8c59d1597652901","blockSize":4194304,"blocks":["34818f8708c5b6b8ed53cca1e8ac88be630fc05d401ea6d3c8c59d1597652901"]},"offset":"9153809"}}}}},"authority":{"files":{"Authority.js":{"size":32158,"integrity":{"algorithm":"SHA256","hash":"0c8e7e4a244836c78532a5fbbb69e9439b9b6d8082a644b61cb4b0432b6f23c5","blockSize":4194304,"blocks":["0c8e7e4a244836c78532a5fbbb69e9439b9b6d8082a644b61cb4b0432b6f23c5"]},"offset":"9154793"},"AuthorityFactory.js":{"size":2937,"integrity":{"algorithm":"SHA256","hash":"b93abeaa1a03d759343ca7a009b476ad2c660a174f6e1799275be7bc0a8535f0","blockSize":4194304,"blocks":["b93abeaa1a03d759343ca7a009b476ad2c660a174f6e1799275be7bc0a8535f0"]},"offset":"9186951"},"AuthorityMetadata.js":{"size":25353,"integrity":{"algorithm":"SHA256","hash":"fc53ef4388003262c71b943aa260b6080383767489a58a813834fa3be485e3d0","blockSize":4194304,"blocks":["fc53ef4388003262c71b943aa260b6080383767489a58a813834fa3be485e3d0"]},"offset":"9189888"},"AuthorityOptions.js":{"size":1034,"integrity":{"algorithm":"SHA256","hash":"4ffdbd5935ed159f9f420e629ee7c16e04138e3fbe6ac7d0027e7f690b751b60","blockSize":4194304,"blocks":["4ffdbd5935ed159f9f420e629ee7c16e04138e3fbe6ac7d0027e7f690b751b60"]},"offset":"9215241"},"AuthorityType.js":{"size":493,"integrity":{"algorithm":"SHA256","hash":"f5ac6dd937b38bc1cf5f204ec8be72793de1baaf7aa53fcf81068e21ad7a8726","blockSize":4194304,"blocks":["f5ac6dd937b38bc1cf5f204ec8be72793de1baaf7aa53fcf81068e21ad7a8726"]},"offset":"9216275"},"CloudInstanceDiscoveryResponse.js":{"size":443,"integrity":{"algorithm":"SHA256","hash":"2494e55638123f717a76e996f768dc7460631217050e84701d987f07bda7f112","blockSize":4194304,"blocks":["2494e55638123f717a76e996f768dc7460631217050e84701d987f07bda7f112"]},"offset":"9216768"},"OpenIdConfigResponse.js":{"size":510,"integrity":{"algorithm":"SHA256","hash":"f8020938ca229763bb9b1c15d45938a44ac68910bb30ca950d54ca6f53503269","blockSize":4194304,"blocks":["f8020938ca229763bb9b1c15d45938a44ac68910bb30ca950d54ca6f53503269"]},"offset":"9217211"},"ProtocolMode.js":{"size":438,"integrity":{"algorithm":"SHA256","hash":"497f5b56ad3a3b1b09570eb2f89d61a331a3d9efe7ad0e21118c72fd6e3af32a","blockSize":4194304,"blocks":["497f5b56ad3a3b1b09570eb2f89d61a331a3d9efe7ad0e21118c72fd6e3af32a"]},"offset":"9217721"},"RegionDiscovery.js":{"size":6342,"integrity":{"algorithm":"SHA256","hash":"3d74850a3df92e55ba53c04d233fd4cc750d3d3865c6f45ea71a851f89ad96fa","blockSize":4194304,"blocks":["3d74850a3df92e55ba53c04d233fd4cc750d3d3865c6f45ea71a851f89ad96fa"]},"offset":"9218159"}}},"account":{"files":{"AuthToken.js":{"size":1490,"integrity":{"algorithm":"SHA256","hash":"e15d683883475873510e68877aeec32b3cc55729c9631d861d15411da1b33c6f","blockSize":4194304,"blocks":["e15d683883475873510e68877aeec32b3cc55729c9631d861d15411da1b33c6f"]},"offset":"9224501"},"CcsCredential.js":{"size":448,"integrity":{"algorithm":"SHA256","hash":"7de3ef8ebb587f931933ff6829a0cfedd0ff5ab3c4d251d8be2c1c80e4829589","blockSize":4194304,"blocks":["7de3ef8ebb587f931933ff6829a0cfedd0ff5ab3c4d251d8be2c1c80e4829589"]},"offset":"9225991"},"ClientInfo.js":{"size":1515,"integrity":{"algorithm":"SHA256","hash":"1e70a9015de3a590d129c4a0abdfb436739dbc412e399cbd13323ffb7895cf1d","blockSize":4194304,"blocks":["1e70a9015de3a590d129c4a0abdfb436739dbc412e399cbd13323ffb7895cf1d"]},"offset":"9226439"}}},"_virtual":{"files":{"_tslib.js":{"size":4627,"integrity":{"algorithm":"SHA256","hash":"42ee7c2b0a9011e3c5d1fa938a2f712341a1afc3f65adff8ea22fc2a95be5465","blockSize":4194304,"blocks":["42ee7c2b0a9011e3c5d1fa938a2f712341a1afc3f65adff8ea22fc2a95be5465"]},"offset":"9227954"}}}}}}},"msal-node":{"files":{"LICENSE":{"size":1066,"integrity":{"algorithm":"SHA256","hash":"17474e386e0b9e1a700cc3d06b2b0882a2c376d9c6b49c7f8274409b8f8d2352","blockSize":4194304,"blocks":["17474e386e0b9e1a700cc3d06b2b0882a2c376d9c6b49c7f8274409b8f8d2352"]},"offset":"9232581"},"package.json":{"size":1073,"integrity":{"algorithm":"SHA256","hash":"d6737ab73a8df382c8ba1b7cbcc42d519945072c8901bac18fe33176445f2a06","blockSize":4194304,"blocks":["d6737ab73a8df382c8ba1b7cbcc42d519945072c8901bac18fe33176445f2a06"]},"offset":"9233647"},"dist":{"files":{"index.js":{"size":196,"integrity":{"algorithm":"SHA256","hash":"f72e20b1cada534afe4b99bf19b982ebdbc7a4e7da0c833968cfb5207823760b","blockSize":4194304,"blocks":["f72e20b1cada534afe4b99bf19b982ebdbc7a4e7da0c833968cfb5207823760b"]},"offset":"9234720"},"msal-node.cjs.development.js":{"size":83108,"integrity":{"algorithm":"SHA256","hash":"5a6aec92cb34e50877471b25fccf04eb5c99d826b94dae5fa6f8a943d7bfb923","blockSize":4194304,"blocks":["5a6aec92cb34e50877471b25fccf04eb5c99d826b94dae5fa6f8a943d7bfb923"]},"offset":"9234916"},"msal-node.cjs.production.min.js":{"size":30120,"integrity":{"algorithm":"SHA256","hash":"513290fc246e913fe088c9f78777586539cc1e9496fd1b69bbdd779c0e243e23","blockSize":4194304,"blocks":["513290fc246e913fe088c9f78777586539cc1e9496fd1b69bbdd779c0e243e23"]},"offset":"9318024"},"msal-node.esm.js":{"size":80012,"integrity":{"algorithm":"SHA256","hash":"08494bf8a957745e61ed1c3b298dce170a288cc835739cfffdb69a036529d059","blockSize":4194304,"blocks":["08494bf8a957745e61ed1c3b298dce170a288cc835739cfffdb69a036529d059"]},"offset":"9348144"}}},"node_modules":{"files":{"uuid":{"files":{"CONTRIBUTING.md":{"size":513,"integrity":{"algorithm":"SHA256","hash":"99b5cc0a56af12be90a669fdffc9f5a721236d2ede0d92e1171bb7097dd9fdd7","blockSize":4194304,"blocks":["99b5cc0a56af12be90a669fdffc9f5a721236d2ede0d92e1171bb7097dd9fdd7"]},"offset":"46346724"},"LICENSE.md":{"size":1109,"integrity":{"algorithm":"SHA256","hash":"beaa6b04fb82e41dd2ad679e19e27953afb5999b1abbb455b6564e78ebfeb332","blockSize":4194304,"blocks":["beaa6b04fb82e41dd2ad679e19e27953afb5999b1abbb455b6564e78ebfeb332"]},"offset":"46347237"},"package.json":{"size":2601,"integrity":{"algorithm":"SHA256","hash":"c33d17ad3546ea553db5df68edb1ac9a794e2e57fc99f838a9d78434ae009abc","blockSize":4194304,"blocks":["c33d17ad3546ea553db5df68edb1ac9a794e2e57fc99f838a9d78434ae009abc"]},"offset":"46348346"},"wrapper.mjs":{"size":323,"integrity":{"algorithm":"SHA256","hash":"f6835608d7c4b422bb11ab4689bcf91e166ecbbd63aa3fa2b83c448835cd80a5","blockSize":4194304,"blocks":["f6835608d7c4b422bb11ab4689bcf91e166ecbbd63aa3fa2b83c448835cd80a5"]},"offset":"46350947"},"dist":{"files":{"index.js":{"size":1765,"integrity":{"algorithm":"SHA256","hash":"069a2230d395723583c8e45a7c0fee2622af2fbd08dc35f81e4d57836122e59f","blockSize":4194304,"blocks":["069a2230d395723583c8e45a7c0fee2622af2fbd08dc35f81e4d57836122e59f"]},"offset":"46351270"},"md5-browser.js":{"size":7015,"integrity":{"algorithm":"SHA256","hash":"21a4e167b7ae498e8f3778bac8d7330929099006afca6adfe76b626e0e41d795","blockSize":4194304,"blocks":["21a4e167b7ae498e8f3778bac8d7330929099006afca6adfe76b626e0e41d795"]},"offset":"46353035"},"md5.js":{"size":550,"integrity":{"algorithm":"SHA256","hash":"6ca6276ff35f19ea462bb8c9d6d290994fa9980fc775deb741811ef947196ced","blockSize":4194304,"blocks":["6ca6276ff35f19ea462bb8c9d6d290994fa9980fc775deb741811ef947196ced"]},"offset":"46360050"},"nil.js":{"size":188,"integrity":{"algorithm":"SHA256","hash":"7395bd919bd1309bcbced245a59dfc6b077f97992a482af2537343e558795b1f","blockSize":4194304,"blocks":["7395bd919bd1309bcbced245a59dfc6b077f97992a482af2537343e558795b1f"]},"offset":"46360600"},"parse.js":{"size":1380,"integrity":{"algorithm":"SHA256","hash":"1a87ed6a6bb0a3edbe266ca55aaf1c5af8e963ee9486f74b59cfd615280b21b4","blockSize":4194304,"blocks":["1a87ed6a6bb0a3edbe266ca55aaf1c5af8e963ee9486f74b59cfd615280b21b4"]},"offset":"46360788"},"regex.js":{"size":267,"integrity":{"algorithm":"SHA256","hash":"acc4c54d987f100093097f4f156ff245394c39d1332eb2114d7e40db00bd6ddd","blockSize":4194304,"blocks":["acc4c54d987f100093097f4f156ff245394c39d1332eb2114d7e40db00bd6ddd"]},"offset":"46362168"},"rng-browser.js":{"size":1131,"integrity":{"algorithm":"SHA256","hash":"4c88edf4fd7fae3bf84bad34750a55f706c8e522a924af6c6ad22839e3718dd6","blockSize":4194304,"blocks":["4c88edf4fd7fae3bf84bad34750a55f706c8e522a924af6c6ad22839e3718dd6"]},"offset":"46362435"},"rng.js":{"size":549,"integrity":{"algorithm":"SHA256","hash":"fdde4350fc69c07bfed4178eedf6121a56264744207d9f5c8f3e5b1b913dbb06","blockSize":4194304,"blocks":["fdde4350fc69c07bfed4178eedf6121a56264744207d9f5c8f3e5b1b913dbb06"]},"offset":"46363566"},"sha1-browser.js":{"size":2609,"integrity":{"algorithm":"SHA256","hash":"32982388b377b06298f59db97c98077f06e6b4f29fe284d427195a358a72f19e","blockSize":4194304,"blocks":["32982388b377b06298f59db97c98077f06e6b4f29fe284d427195a358a72f19e"]},"offset":"46364115"},"sha1.js":{"size":553,"integrity":{"algorithm":"SHA256","hash":"a9eda407444a3f68a0a4db0373346df18f583abbde2c4bf2b3fbc6d73be2c75e","blockSize":4194304,"blocks":["a9eda407444a3f68a0a4db0373346df18f583abbde2c4bf2b3fbc6d73be2c75e"]},"offset":"46366724"},"stringify.js":{"size":1667,"integrity":{"algorithm":"SHA256","hash":"85a70b8982f37ddb434816dcda7628b0319e5a90d46ac6bc9b08d4d15d6a7650","blockSize":4194304,"blocks":["85a70b8982f37ddb434816dcda7628b0319e5a90d46ac6bc9b08d4d15d6a7650"]},"offset":"46367277"},"uuid-bin.js":{"size":2030,"integrity":{"algorithm":"SHA256","hash":"7c60635cf5a963da72e35292bcbfa7f7221b08374d69d75103fa82da9d950102","blockSize":4194304,"blocks":["7c60635cf5a963da72e35292bcbfa7f7221b08374d69d75103fa82da9d950102"]},"offset":"46368944"},"v1.js":{"size":3618,"integrity":{"algorithm":"SHA256","hash":"6dad9c2e6565ad6b478fba7b2ace95350df56a15a72920e72ac64c3a2691d665","blockSize":4194304,"blocks":["6dad9c2e6565ad6b478fba7b2ace95350df56a15a72920e72ac64c3a2691d665"]},"offset":"46370974"},"v3.js":{"size":414,"integrity":{"algorithm":"SHA256","hash":"95e0c6fa204355c6ef7dbac5720a3ef5239454ed6820674dfcc143a55ea6c459","blockSize":4194304,"blocks":["95e0c6fa204355c6ef7dbac5720a3ef5239454ed6820674dfcc143a55ea6c459"]},"offset":"46374592"},"v35.js":{"size":2008,"integrity":{"algorithm":"SHA256","hash":"ababd96e6f8b1fca9bb58f43220473f7bd59fbc81b3acb212df924813544283f","blockSize":4194304,"blocks":["ababd96e6f8b1fca9bb58f43220473f7bd59fbc81b3acb212df924813544283f"]},"offset":"46375006"},"v4.js":{"size":860,"integrity":{"algorithm":"SHA256","hash":"a9e30e8692dde9dec39a3ef716ef8e650e321813fa9d137f16d27666b9ad96ef","blockSize":4194304,"blocks":["a9e30e8692dde9dec39a3ef716ef8e650e321813fa9d137f16d27666b9ad96ef"]},"offset":"46377014"},"v5.js":{"size":417,"integrity":{"algorithm":"SHA256","hash":"d15c31975f31b9abf6a195e70a3dca0843a9257cb51b49214cf7a9f4ed30fc5a","blockSize":4194304,"blocks":["d15c31975f31b9abf6a195e70a3dca0843a9257cb51b49214cf7a9f4ed30fc5a"]},"offset":"46377874"},"validate.js":{"size":410,"integrity":{"algorithm":"SHA256","hash":"5497d9adffd73474cf379d3e1b76b28698e408124a0726d54e88282500378502","blockSize":4194304,"blocks":["5497d9adffd73474cf379d3e1b76b28698e408124a0726d54e88282500378502"]},"offset":"46378291"},"version.js":{"size":474,"integrity":{"algorithm":"SHA256","hash":"cad5f0ecd518983e310856cafd54d4d0de0b9db3c8e3bd97ec8e773ef63de6e8","blockSize":4194304,"blocks":["cad5f0ecd518983e310856cafd54d4d0de0b9db3c8e3bd97ec8e773ef63de6e8"]},"offset":"46378701"},"umd":{"files":{"uuid.min.js":{"size":8160,"integrity":{"algorithm":"SHA256","hash":"c5df6d9704bdada96df0770523058f395192ee9d1fe13880eb1d57dfe6417533","blockSize":4194304,"blocks":["c5df6d9704bdada96df0770523058f395192ee9d1fe13880eb1d57dfe6417533"]},"offset":"46379175"},"uuidNIL.min.js":{"size":280,"integrity":{"algorithm":"SHA256","hash":"18c98395b8a11f83924c22af88573b8bbe3a5cf4fe7864364e6902e49ac3d7fd","blockSize":4194304,"blocks":["18c98395b8a11f83924c22af88573b8bbe3a5cf4fe7864364e6902e49ac3d7fd"]},"offset":"46387335"},"uuidParse.min.js":{"size":883,"integrity":{"algorithm":"SHA256","hash":"555a6f1b1f49532a96c4235ab4de7c1e5fec9b8724bcf1a1247ba4eb33116af2","blockSize":4194304,"blocks":["555a6f1b1f49532a96c4235ab4de7c1e5fec9b8724bcf1a1247ba4eb33116af2"]},"offset":"46387615"},"uuidStringify.min.js":{"size":829,"integrity":{"algorithm":"SHA256","hash":"9b6db819fecb2f40d9fa5ac8c892218004b3a633a1ec29d7a873801a7eade28f","blockSize":4194304,"blocks":["9b6db819fecb2f40d9fa5ac8c892218004b3a633a1ec29d7a873801a7eade28f"]},"offset":"46388498"},"uuidValidate.min.js":{"size":420,"integrity":{"algorithm":"SHA256","hash":"45a1c7d7618c149522c8f8085675e6707381f6106ca414c294b3e6169065cf21","blockSize":4194304,"blocks":["45a1c7d7618c149522c8f8085675e6707381f6106ca414c294b3e6169065cf21"]},"offset":"46389327"},"uuidVersion.min.js":{"size":506,"integrity":{"algorithm":"SHA256","hash":"c0a99b310a43528b5e4f59c87dcc489732bf8c4dd3a367c34cf882a88a3cecca","blockSize":4194304,"blocks":["c0a99b310a43528b5e4f59c87dcc489732bf8c4dd3a367c34cf882a88a3cecca"]},"offset":"46389747"},"uuidv1.min.js":{"size":2020,"integrity":{"algorithm":"SHA256","hash":"9963a427c7b05e1ea3c923cfed992cfea294e980e42d754ba593cec66d285a07","blockSize":4194304,"blocks":["9963a427c7b05e1ea3c923cfed992cfea294e980e42d754ba593cec66d285a07"]},"offset":"46390253"},"uuidv3.min.js":{"size":5145,"integrity":{"algorithm":"SHA256","hash":"2d31a5a7ef824371df6f91ad677cd137ca9b51a529be40873f9b60009c550932","blockSize":4194304,"blocks":["2d31a5a7ef824371df6f91ad677cd137ca9b51a529be40873f9b60009c550932"]},"offset":"46392273"},"uuidv4.min.js":{"size":1366,"integrity":{"algorithm":"SHA256","hash":"4bbb806e743e21bc9f97b62fc0564e0889b7f31ee9d48c3f2b85d4e00fe629cc","blockSize":4194304,"blocks":["4bbb806e743e21bc9f97b62fc0564e0889b7f31ee9d48c3f2b85d4e00fe629cc"]},"offset":"46397418"},"uuidv5.min.js":{"size":3267,"integrity":{"algorithm":"SHA256","hash":"1a444d14f3a6f8952bfc827be5c52dc7367c99e5bf30a5e5102f0b4ad420df76","blockSize":4194304,"blocks":["1a444d14f3a6f8952bfc827be5c52dc7367c99e5bf30a5e5102f0b4ad420df76"]},"offset":"46398784"}}},"esm-node":{"files":{"index.js":{"size":412,"integrity":{"algorithm":"SHA256","hash":"3efb8df8c64379c5acbaf0b70ce1a1906375f4b53901b7e90a26863ead50fc30","blockSize":4194304,"blocks":["3efb8df8c64379c5acbaf0b70ce1a1906375f4b53901b7e90a26863ead50fc30"]},"offset":"46402051"},"md5.js":{"size":281,"integrity":{"algorithm":"SHA256","hash":"2313329bf3ada8cd17046afeefa761bd7daa3821e140fc55d8c2b94ee7760ed4","blockSize":4194304,"blocks":["2313329bf3ada8cd17046afeefa761bd7daa3821e140fc55d8c2b94ee7760ed4"]},"offset":"46402463"},"nil.js":{"size":54,"integrity":{"algorithm":"SHA256","hash":"40036d4ffe78154827eedb9c1b3f59f660722907389725842bbc178ba28d2241","blockSize":4194304,"blocks":["40036d4ffe78154827eedb9c1b3f59f660722907389725842bbc178ba28d2241"]},"offset":"46402744"},"parse.js":{"size":1106,"integrity":{"algorithm":"SHA256","hash":"2743e5b696fb15df389cf3b1a242e56780f7941bbefc23465529d30e851b80f5","blockSize":4194304,"blocks":["2743e5b696fb15df389cf3b1a242e56780f7941bbefc23465529d30e851b80f5"]},"offset":"46402798"},"regex.js":{"size":133,"integrity":{"algorithm":"SHA256","hash":"9a546763c108d7eeb7283ce26c7a6845a44bd67132005eb32fd1feeca49d1b3f","blockSize":4194304,"blocks":["9a546763c108d7eeb7283ce26c7a6845a44bd67132005eb32fd1feeca49d1b3f"]},"offset":"46403904"},"rng.js":{"size":323,"integrity":{"algorithm":"SHA256","hash":"ff667aff9367a48cc713d36764cea05bd30e8ba05392430571c54734fc9fde03","blockSize":4194304,"blocks":["ff667aff9367a48cc713d36764cea05bd30e8ba05392430571c54734fc9fde03"]},"offset":"46404037"},"sha1.js":{"size":284,"integrity":{"algorithm":"SHA256","hash":"6094b056716c8a37b9f2da365d6c8a17f754543d966411d01dfebd762c94547e","blockSize":4194304,"blocks":["6094b056716c8a37b9f2da365d6c8a17f754543d966411d01dfebd762c94547e"]},"offset":"46404360"},"stringify.js":{"size":1393,"integrity":{"algorithm":"SHA256","hash":"224279f45e9b30fca5de4fcf8620aa00ac3c8bef89fc073bfb36b83272bd1556","blockSize":4194304,"blocks":["224279f45e9b30fca5de4fcf8620aa00ac3c8bef89fc073bfb36b83272bd1556"]},"offset":"46404644"},"v1.js":{"size":3306,"integrity":{"algorithm":"SHA256","hash":"4cbdb6e889c57896cc8dd35f299aa05a00ff7a43b875a187f87c95e7bb2c3f0f","blockSize":4194304,"blocks":["4cbdb6e889c57896cc8dd35f299aa05a00ff7a43b875a187f87c95e7bb2c3f0f"]},"offset":"46406037"},"v3.js":{"size":107,"integrity":{"algorithm":"SHA256","hash":"65b963f24922d433fdc592aa4e2764d10fad59351015bbe5fce0830fe389794a","blockSize":4194304,"blocks":["65b963f24922d433fdc592aa4e2764d10fad59351015bbe5fce0830fe389794a"]},"offset":"46409343"},"v35.js":{"size":1663,"integrity":{"algorithm":"SHA256","hash":"56a358587ded91ef272d54a4937e6f59193cd11b51710503859083feb8d6f20f","blockSize":4194304,"blocks":["56a358587ded91ef272d54a4937e6f59193cd11b51710503859083feb8d6f20f"]},"offset":"46409450"},"v4.js":{"size":546,"integrity":{"algorithm":"SHA256","hash":"44d2fedb301801c7c60e45934eaa13435614e3d65aedf8759775890de75bed69","blockSize":4194304,"blocks":["44d2fedb301801c7c60e45934eaa13435614e3d65aedf8759775890de75bed69"]},"offset":"46411113"},"v5.js":{"size":110,"integrity":{"algorithm":"SHA256","hash":"e9e8d82440c23fc3de56f8acd5a15b1ca2daad6bf6d2e7c4a4b39d04384206d3","blockSize":4194304,"blocks":["e9e8d82440c23fc3de56f8acd5a15b1ca2daad6bf6d2e7c4a4b39d04384206d3"]},"offset":"46411659"},"validate.js":{"size":141,"integrity":{"algorithm":"SHA256","hash":"4a782f41298704c0029c245203430b3e4511365bf05a3addacdbae59d9c664fa","blockSize":4194304,"blocks":["4a782f41298704c0029c245203430b3e4511365bf05a3addacdbae59d9c664fa"]},"offset":"46411769"},"version.js":{"size":200,"integrity":{"algorithm":"SHA256","hash":"84d1c2f759c39dbf8b26a359b0d68ba9fcc68bf8c3612b8b1bb0df31dfb2e693","blockSize":4194304,"blocks":["84d1c2f759c39dbf8b26a359b0d68ba9fcc68bf8c3612b8b1bb0df31dfb2e693"]},"offset":"46411910"}}},"esm-browser":{"files":{"index.js":{"size":412,"integrity":{"algorithm":"SHA256","hash":"3efb8df8c64379c5acbaf0b70ce1a1906375f4b53901b7e90a26863ead50fc30","blockSize":4194304,"blocks":["3efb8df8c64379c5acbaf0b70ce1a1906375f4b53901b7e90a26863ead50fc30"]},"offset":"46412110"},"md5.js":{"size":6852,"integrity":{"algorithm":"SHA256","hash":"705eb0feeda58a88a5b887cf580e38bb9979dec642dd663b63c9dc485e956728","blockSize":4194304,"blocks":["705eb0feeda58a88a5b887cf580e38bb9979dec642dd663b63c9dc485e956728"]},"offset":"46412522"},"nil.js":{"size":54,"integrity":{"algorithm":"SHA256","hash":"40036d4ffe78154827eedb9c1b3f59f660722907389725842bbc178ba28d2241","blockSize":4194304,"blocks":["40036d4ffe78154827eedb9c1b3f59f660722907389725842bbc178ba28d2241"]},"offset":"46419374"},"parse.js":{"size":1104,"integrity":{"algorithm":"SHA256","hash":"1efd0e1dd5d7d205a3405f5aee39029ea60bece8a893b2bf742a16c6a51246a6","blockSize":4194304,"blocks":["1efd0e1dd5d7d205a3405f5aee39029ea60bece8a893b2bf742a16c6a51246a6"]},"offset":"46419428"},"regex.js":{"size":133,"integrity":{"algorithm":"SHA256","hash":"9a546763c108d7eeb7283ce26c7a6845a44bd67132005eb32fd1feeca49d1b3f","blockSize":4194304,"blocks":["9a546763c108d7eeb7283ce26c7a6845a44bd67132005eb32fd1feeca49d1b3f"]},"offset":"46420532"},"rng.js":{"size":1040,"integrity":{"algorithm":"SHA256","hash":"0e1abdc73fa79ff64006ec6675b06a193f55eac039595cc3867e6567e46f2dd7","blockSize":4194304,"blocks":["0e1abdc73fa79ff64006ec6675b06a193f55eac039595cc3867e6567e46f2dd7"]},"offset":"46420665"},"sha1.js":{"size":2488,"integrity":{"algorithm":"SHA256","hash":"0b777c8796a7e0954a47bc5b7d612f89d7cd9218106881a9b4931f8f882fd056","blockSize":4194304,"blocks":["0b777c8796a7e0954a47bc5b7d612f89d7cd9218106881a9b4931f8f882fd056"]},"offset":"46421705"},"stringify.js":{"size":1463,"integrity":{"algorithm":"SHA256","hash":"b3e05d40408725c571660f7f1bfdb1b20fde769c5142f23273a95815b2ca5d01","blockSize":4194304,"blocks":["b3e05d40408725c571660f7f1bfdb1b20fde769c5142f23273a95815b2ca5d01"]},"offset":"46424193"},"v1.js":{"size":3296,"integrity":{"algorithm":"SHA256","hash":"746184938af3d1e32fb432711c135d95305f839d94a5e90dd23438435a8342b6","blockSize":4194304,"blocks":["746184938af3d1e32fb432711c135d95305f839d94a5e90dd23438435a8342b6"]},"offset":"46425656"},"v3.js":{"size":105,"integrity":{"algorithm":"SHA256","hash":"337d2b9ef80229c44c240e4218aa324b129d792701432061946ee4154e30080a","blockSize":4194304,"blocks":["337d2b9ef80229c44c240e4218aa324b129d792701432061946ee4154e30080a"]},"offset":"46428952"},"v35.js":{"size":1657,"integrity":{"algorithm":"SHA256","hash":"c418ede8cd4d61f12ae553adac55b1afa2cbd8c8659c31dd657c1decbb36314b","blockSize":4194304,"blocks":["c418ede8cd4d61f12ae553adac55b1afa2cbd8c8659c31dd657c1decbb36314b"]},"offset":"46429057"},"v4.js":{"size":544,"integrity":{"algorithm":"SHA256","hash":"971f818a59ef77ee2c213dfea32dc4494823f9b8bd45be19fd81cf49b09f44e5","blockSize":4194304,"blocks":["971f818a59ef77ee2c213dfea32dc4494823f9b8bd45be19fd81cf49b09f44e5"]},"offset":"46430714"},"v5.js":{"size":108,"integrity":{"algorithm":"SHA256","hash":"07e6d11989b44edbe92ccb697febb65225ebad32fb2f9c91c5b571a6f5a3c4df","blockSize":4194304,"blocks":["07e6d11989b44edbe92ccb697febb65225ebad32fb2f9c91c5b571a6f5a3c4df"]},"offset":"46431258"},"validate.js":{"size":141,"integrity":{"algorithm":"SHA256","hash":"4a782f41298704c0029c245203430b3e4511365bf05a3addacdbae59d9c664fa","blockSize":4194304,"blocks":["4a782f41298704c0029c245203430b3e4511365bf05a3addacdbae59d9c664fa"]},"offset":"46431366"},"version.js":{"size":200,"integrity":{"algorithm":"SHA256","hash":"84d1c2f759c39dbf8b26a359b0d68ba9fcc68bf8c3612b8b1bb0df31dfb2e693","blockSize":4194304,"blocks":["84d1c2f759c39dbf8b26a359b0d68ba9fcc68bf8c3612b8b1bb0df31dfb2e693"]},"offset":"46431507"}}},"bin":{"files":{"uuid":{"size":44,"integrity":{"algorithm":"SHA256","hash":"30b5422b6c95ccdc402effd7d3354ca6a6bce621cf21d0379749ddf1f96c1ad7","blockSize":4194304,"blocks":["30b5422b6c95ccdc402effd7d3354ca6a6bce621cf21d0379749ddf1f96c1ad7"]},"offset":"46431707"}}}}}}}}}}}}},"@elife":{"files":{"pm2":{"files":{"DESIGN.md":{"size":5378,"integrity":{"algorithm":"SHA256","hash":"de696b55d408c529cf9465ac64b80a3843cc2958b5b359a33e67c5ce09a46919","blockSize":4194304,"blocks":["de696b55d408c529cf9465ac64b80a3843cc2958b5b359a33e67c5ce09a46919"]},"offset":"9428156"},"crash.png":{"size":14406,"integrity":{"algorithm":"SHA256","hash":"975006545cc27d280b5566c061a90a8af04f4afa0c57be583ef1190392057daf","blockSize":4194304,"blocks":["975006545cc27d280b5566c061a90a8af04f4afa0c57be583ef1190392057daf"]},"offset":"9433534"},"index.js":{"size":12385,"integrity":{"algorithm":"SHA256","hash":"eed3521b95044a4d3d54d8a6636636378ea8bede22fd763a7a948f5f40fb92c1","blockSize":4194304,"blocks":["eed3521b95044a4d3d54d8a6636636378ea8bede22fd763a7a948f5f40fb92c1"]},"offset":"9447940"},"package.json":{"size":420,"integrity":{"algorithm":"SHA256","hash":"b1852b795f955b637981028a2c94d167ebd1ea86f603387ec4280f8cc97940f9","blockSize":4194304,"blocks":["b1852b795f955b637981028a2c94d167ebd1ea86f603387ec4280f8cc97940f9"]},"offset":"9460325"},"process-info.js":{"size":161,"integrity":{"algorithm":"SHA256","hash":"47fd58c1f64b12b16e1eed986c856e2d792eff326c43d1abc16b45293292e3cf","blockSize":4194304,"blocks":["47fd58c1f64b12b16e1eed986c856e2d792eff326c43d1abc16b45293292e3cf"]},"offset":"9460745"},"process-manager.png":{"size":16962,"integrity":{"algorithm":"SHA256","hash":"89f4fea5df8ac019dd44f3f63b6b586d73d68846558ec347aca2064ba60e3e00","blockSize":4194304,"blocks":["89f4fea5df8ac019dd44f3f63b6b586d73d68846558ec347aca2064ba60e3e00"]},"offset":"9460906"},"tester":{"files":{"run.sh":{"size":911,"integrity":{"algorithm":"SHA256","hash":"722aaf3239ee12a4e295d1277408b0830353e553c28304e27f0b6e74d0b5d4c3","blockSize":4194304,"blocks":["722aaf3239ee12a4e295d1277408b0830353e553c28304e27f0b6e74d0b5d4c3"]},"offset":"9477868"},"with-pm2":{"files":{"index.html":{"size":426,"integrity":{"algorithm":"SHA256","hash":"88580888dbc066f198428afd394da065b111c0f69cb2456c0d201b95998d5734","blockSize":4194304,"blocks":["88580888dbc066f198428afd394da065b111c0f69cb2456c0d201b95998d5734"]},"offset":"9478779"},"package.json":{"size":345,"integrity":{"algorithm":"SHA256","hash":"d2de67b66e436bed74e39d878431abbc59fd772af426190dd3fa5dd2d2f040bd","blockSize":4194304,"blocks":["d2de67b66e436bed74e39d878431abbc59fd772af426190dd3fa5dd2d2f040bd"]},"offset":"9479205"},"renderer.js":{"size":113,"integrity":{"algorithm":"SHA256","hash":"6c66d2c30c371e1b1e8cc77ec4bbc0795ae1bcc6e56e52aa5d5a88c9a291fbc1","blockSize":4194304,"blocks":["6c66d2c30c371e1b1e8cc77ec4bbc0795ae1bcc6e56e52aa5d5a88c9a291fbc1"]},"offset":"9479550"},"run.sh":{"size":119,"integrity":{"algorithm":"SHA256","hash":"c7864f3d306b7ce4c409f9f933b13861224658963625a269a841120d61335cb7","blockSize":4194304,"blocks":["c7864f3d306b7ce4c409f9f933b13861224658963625a269a841120d61335cb7"]},"offset":"9479663"},"tester.js":{"size":2008,"integrity":{"algorithm":"SHA256","hash":"7d9c6106c533cbec3b011746d9f76df63c870fa4d128e84f296ba553a0f496fa","blockSize":4194304,"blocks":["7d9c6106c533cbec3b011746d9f76df63c870fa4d128e84f296ba553a0f496fa"]},"offset":"9479782"},"process1":{"files":{"index.js":{"size":353,"integrity":{"algorithm":"SHA256","hash":"e92a6da5a6c6d6d0cea177232c4711a6e4a8a3d6d8c3b22542766c5d22e042af","blockSize":4194304,"blocks":["e92a6da5a6c6d6d0cea177232c4711a6e4a8a3d6d8c3b22542766c5d22e042af"]},"offset":"9481790"}}}}},"with-new":{"files":{"exec.js":{"size":2447,"integrity":{"algorithm":"SHA256","hash":"c43dd4c6013e804bddc59ccfbb127e289cacc8b08c41adf0f7060fac1f1982c1","blockSize":4194304,"blocks":["c43dd4c6013e804bddc59ccfbb127e289cacc8b08c41adf0f7060fac1f1982c1"]},"offset":"9482143"},"exec2.js":{"size":2376,"integrity":{"algorithm":"SHA256","hash":"4f8eb914aa818646e8b7e500a563ff5eaeb49211628761b9fc3b5c410fcc4d9f","blockSize":4194304,"blocks":["4f8eb914aa818646e8b7e500a563ff5eaeb49211628761b9fc3b5c410fcc4d9f"]},"offset":"9484590"},"index.html":{"size":426,"integrity":{"algorithm":"SHA256","hash":"88580888dbc066f198428afd394da065b111c0f69cb2456c0d201b95998d5734","blockSize":4194304,"blocks":["88580888dbc066f198428afd394da065b111c0f69cb2456c0d201b95998d5734"]},"offset":"9486966"},"package.json":{"size":300,"integrity":{"algorithm":"SHA256","hash":"37817a1153d4d26ecd92b210b8ef6b20d731e828c54d38ab2b2817daa8765138","blockSize":4194304,"blocks":["37817a1153d4d26ecd92b210b8ef6b20d731e828c54d38ab2b2817daa8765138"]},"offset":"9487392"},"renderer.js":{"size":113,"integrity":{"algorithm":"SHA256","hash":"6c66d2c30c371e1b1e8cc77ec4bbc0795ae1bcc6e56e52aa5d5a88c9a291fbc1","blockSize":4194304,"blocks":["6c66d2c30c371e1b1e8cc77ec4bbc0795ae1bcc6e56e52aa5d5a88c9a291fbc1"]},"offset":"9487692"},"tester.js":{"size":2146,"integrity":{"algorithm":"SHA256","hash":"71b50c59024957cb95bb3a81343919ac7abc139ce144963e8c98d2b5a53d98aa","blockSize":4194304,"blocks":["71b50c59024957cb95bb3a81343919ac7abc139ce144963e8c98d2b5a53d98aa"]},"offset":"9487805"},"process2":{"files":{"env.js":{"size":171,"integrity":{"algorithm":"SHA256","hash":"a7192bb8185bedd28dceb3388927a664e2bbc52310d35923b2771d800d5c2679","blockSize":4194304,"blocks":["a7192bb8185bedd28dceb3388927a664e2bbc52310d35923b2771d800d5c2679"]},"offset":"9489951"},"env.py":{"size":206,"integrity":{"algorithm":"SHA256","hash":"f43fa86c32f6a915825174e0148823b8bee634297a0d73f884da0395f2c34b91","blockSize":4194304,"blocks":["f43fa86c32f6a915825174e0148823b8bee634297a0d73f884da0395f2c34b91"]},"offset":"9490122"}}},"process1":{"files":{"index.js":{"size":456,"integrity":{"algorithm":"SHA256","hash":"c59feb02b8009155ac311b08a791bdd22aed756ddc32f1835cbca93f066d1ccf","blockSize":4194304,"blocks":["c59feb02b8009155ac311b08a791bdd22aed756ddc32f1835cbca93f066d1ccf"]},"offset":"9490328"},"package.json":{"size":154,"integrity":{"algorithm":"SHA256","hash":"1f8d557b8fd03dd2456dadcde2b9daaf3697f86fcd59eb64ee12d91c28294719","blockSize":4194304,"blocks":["1f8d557b8fd03dd2456dadcde2b9daaf3697f86fcd59eb64ee12d91c28294719"]},"offset":"9490784"},"process2":{"files":{"serve.py":{"size":326,"integrity":{"algorithm":"SHA256","hash":"615f7a76dd10a2367590c9292ecb773f1b1288805792811bf0ce1b85c50c7119","blockSize":4194304,"blocks":["615f7a76dd10a2367590c9292ecb773f1b1288805792811bf0ce1b85c50c7119"]},"offset":"9490938"}}}}}}}}}}}}},"@gar":{"files":{"promisify":{"files":{"LICENSE.md":{"size":1094,"integrity":{"algorithm":"SHA256","hash":"ef7d10c21fe01e47a90973abda734e9be75162e5f561a84e95c5dcb9adbb89ea","blockSize":4194304,"blocks":["ef7d10c21fe01e47a90973abda734e9be75162e5f561a84e95c5dcb9adbb89ea"]},"offset":"9491264"},"index.js":{"size":967,"integrity":{"algorithm":"SHA256","hash":"a4fe100eb176ab95328881fe9490ac91e72d3d2992ac7fb2b9562d264156a8a3","blockSize":4194304,"blocks":["a4fe100eb176ab95328881fe9490ac91e72d3d2992ac7fb2b9562d264156a8a3"]},"offset":"9492358"},"package.json":{"size":440,"integrity":{"algorithm":"SHA256","hash":"8012d0cdd159557951b1cb6e25177feb5e6f01d007f09adacf897335db41be99","blockSize":4194304,"blocks":["8012d0cdd159557951b1cb6e25177feb5e6f01d007f09adacf897335db41be99"]},"offset":"9493325"}}}}},"@js-joda":{"files":{"core":{"files":{"LICENSE":{"size":1554,"integrity":{"algorithm":"SHA256","hash":"3475a7cd7ad52f4b3b9fd63633273f8032070a70b94ec46fd4b96497baae1a4e","blockSize":4194304,"blocks":["3475a7cd7ad52f4b3b9fd63633273f8032070a70b94ec46fd4b96497baae1a4e"]},"offset":"9493765"},"package.json":{"size":498,"integrity":{"algorithm":"SHA256","hash":"3681288233402e9dacb061b39d564376f46b7f1d75e1c6fac02730cf60dc2167","blockSize":4194304,"blocks":["3681288233402e9dacb061b39d564376f46b7f1d75e1c6fac02730cf60dc2167"]},"offset":"9495319"},"typings":{"files":{"js-joda.flow.js":{"size":38272,"integrity":{"algorithm":"SHA256","hash":"b6bc1710cfb5fc93f4f45e1c58fd6d8837bd429de48d1f59bbabdab7be3aac41","blockSize":4194304,"blocks":["b6bc1710cfb5fc93f4f45e1c58fd6d8837bd429de48d1f59bbabdab7be3aac41"]},"offset":"9495817"}}},"src":{"files":{"Clock.js":{"size":10151,"integrity":{"algorithm":"SHA256","hash":"94bd315ed08033bf869a976dc3e19f49a5bb730c413a8980b8eedbe05b6f709a","blockSize":4194304,"blocks":["94bd315ed08033bf869a976dc3e19f49a5bb730c413a8980b8eedbe05b6f709a"]},"offset":"9534089"},"DayOfWeek.js":{"size":17075,"integrity":{"algorithm":"SHA256","hash":"90890a2bde8a519316a30bebc5aa175f144d541626a452332dc2bbbefaeea6ac","blockSize":4194304,"blocks":["90890a2bde8a519316a30bebc5aa175f144d541626a452332dc2bbbefaeea6ac"]},"offset":"9544240"},"Duration.js":{"size":51879,"integrity":{"algorithm":"SHA256","hash":"b221f7fb518023de83407f5cb29a9dd9998811d01f3051cca6c308d5f3ea9b9f","blockSize":4194304,"blocks":["b221f7fb518023de83407f5cb29a9dd9998811d01f3051cca6c308d5f3ea9b9f"]},"offset":"9561315"},"Enum.js":{"size":550,"integrity":{"algorithm":"SHA256","hash":"cce1c239a339e9d43885b238a9b25dc90dbd0d80c26d8c9734e912984c49863a","blockSize":4194304,"blocks":["cce1c239a339e9d43885b238a9b25dc90dbd0d80c26d8c9734e912984c49863a"]},"offset":"9613194"},"Instant.js":{"size":44769,"integrity":{"algorithm":"SHA256","hash":"721f9eb3b7c812ffbb63d180280d6245a6e7729a5fd03aef454463f89bf54183","blockSize":4194304,"blocks":["721f9eb3b7c812ffbb63d180280d6245a6e7729a5fd03aef454463f89bf54183"]},"offset":"9613744"},"LocalDate.js":{"size":72402,"integrity":{"algorithm":"SHA256","hash":"d3a3bf9a8bf1bcff3b65708e30039e6d332d65ca348ed337e9896cd0dab1623d","blockSize":4194304,"blocks":["d3a3bf9a8bf1bcff3b65708e30039e6d332d65ca348ed337e9896cd0dab1623d"]},"offset":"9658513"},"LocalDateTime.js":{"size":74311,"integrity":{"algorithm":"SHA256","hash":"811dc3ad617af6b045733b287c571a193f3c67c62e106ce6b831deeee4f9c307","blockSize":4194304,"blocks":["811dc3ad617af6b045733b287c571a193f3c67c62e106ce6b831deeee4f9c307"]},"offset":"9730915"},"LocalTime.js":{"size":58713,"integrity":{"algorithm":"SHA256","hash":"5ca0a674124021e743b69e3dc6ab14d9f05d0aa46d60b3ce28c5f3f515d4ff54","blockSize":4194304,"blocks":["5ca0a674124021e743b69e3dc6ab14d9f05d0aa46d60b3ce28c5f3f515d4ff54"]},"offset":"9805226"},"MathUtil.js":{"size":5744,"integrity":{"algorithm":"SHA256","hash":"dc608df586c5837b1c7e86cb69019a79e41209f4db13af96eda32b909e38ae59","blockSize":4194304,"blocks":["dc608df586c5837b1c7e86cb69019a79e41209f4db13af96eda32b909e38ae59"]},"offset":"9863939"},"Month.js":{"size":21434,"integrity":{"algorithm":"SHA256","hash":"8d1355760aefeeab8051e73dcd6c19c5895ed3eae4dfafd93617b4442460a172","blockSize":4194304,"blocks":["8d1355760aefeeab8051e73dcd6c19c5895ed3eae4dfafd93617b4442460a172"]},"offset":"9869683"},"MonthDay.js":{"size":30072,"integrity":{"algorithm":"SHA256","hash":"ebae1351dba9b458471481761df96b26b67a4491702608125c266452666097ed","blockSize":4194304,"blocks":["ebae1351dba9b458471481761df96b26b67a4491702608125c266452666097ed"]},"offset":"9891117"},"OffsetDateTime.js":{"size":22016,"integrity":{"algorithm":"SHA256","hash":"7a0405f885ff9da84d4e4fc446496e67569b761187b1af8c9f038926a0999594","blockSize":4194304,"blocks":["7a0405f885ff9da84d4e4fc446496e67569b761187b1af8c9f038926a0999594"]},"offset":"9921189"},"OffsetTime.js":{"size":19438,"integrity":{"algorithm":"SHA256","hash":"0b6143e77cb0e06a805696318cbc6aa25bfe0130656e745b5af6871672a63dd4","blockSize":4194304,"blocks":["0b6143e77cb0e06a805696318cbc6aa25bfe0130656e745b5af6871672a63dd4"]},"offset":"9943205"},"Period.js":{"size":36046,"integrity":{"algorithm":"SHA256","hash":"9986534d26ae63d15df20d3782980913fa3a6c23f55da4f55d5441e38350bd1d","blockSize":4194304,"blocks":["9986534d26ae63d15df20d3782980913fa3a6c23f55da4f55d5441e38350bd1d"]},"offset":"9962643"},"StringUtil.js":{"size":889,"integrity":{"algorithm":"SHA256","hash":"38eccfc497fc4beda620bdb193a9edcb812db427779de2fef88c80665516f2b8","blockSize":4194304,"blocks":["38eccfc497fc4beda620bdb193a9edcb812db427779de2fef88c80665516f2b8"]},"offset":"9998689"},"Year.js":{"size":39067,"integrity":{"algorithm":"SHA256","hash":"52d91ea8aa7ee0f9edf4ad2f3e16363c619ad137311fb7673799db932a778aaa","blockSize":4194304,"blocks":["52d91ea8aa7ee0f9edf4ad2f3e16363c619ad137311fb7673799db932a778aaa"]},"offset":"9999578"},"YearConstants.js":{"size":589,"integrity":{"algorithm":"SHA256","hash":"cc0e36441b64b03038580cc4d9f2118e736299e7d8bfb6f50d70ba720345fe45","blockSize":4194304,"blocks":["cc0e36441b64b03038580cc4d9f2118e736299e7d8bfb6f50d70ba720345fe45"]},"offset":"10038645"},"YearMonth.js":{"size":42436,"integrity":{"algorithm":"SHA256","hash":"b22b932614e8f4823f581f9e0d461405141ff3d5ce969011000bdfa22ed5896e","blockSize":4194304,"blocks":["b22b932614e8f4823f581f9e0d461405141ff3d5ce969011000bdfa22ed5896e"]},"offset":"10039234"},"ZoneId.js":{"size":9419,"integrity":{"algorithm":"SHA256","hash":"8cb227d877a48ba14afcd4ab8011ac2a11c9404276c4c540d7ee2b389d63a473","blockSize":4194304,"blocks":["8cb227d877a48ba14afcd4ab8011ac2a11c9404276c4c540d7ee2b389d63a473"]},"offset":"10081670"},"ZoneIdFactory.js":{"size":8716,"integrity":{"algorithm":"SHA256","hash":"d1596b151d515ea54f5d9cf8dfda2ee00c4797c70501d8c8aa5360b9670ca9d2","blockSize":4194304,"blocks":["d1596b151d515ea54f5d9cf8dfda2ee00c4797c70501d8c8aa5360b9670ca9d2"]},"offset":"10091089"},"ZoneOffset.js":{"size":17608,"integrity":{"algorithm":"SHA256","hash":"79ee2a8a916ff9666ce4e5a2bc0a6cac4a65c8a301f1165a1d7a984271cb5b0a","blockSize":4194304,"blocks":["79ee2a8a916ff9666ce4e5a2bc0a6cac4a65c8a301f1165a1d7a984271cb5b0a"]},"offset":"10099805"},"ZoneRegion.js":{"size":2109,"integrity":{"algorithm":"SHA256","hash":"f3cc77b7ef72483feeacb2d4cc2584c812ac3473cb2e56b627a8816ebf851628","blockSize":4194304,"blocks":["f3cc77b7ef72483feeacb2d4cc2584c812ac3473cb2e56b627a8816ebf851628"]},"offset":"10117413"},"ZonedDateTime.js":{"size":90510,"integrity":{"algorithm":"SHA256","hash":"d7d5fddf6bf4d14447b8bf743452d9b2ce174e0713fb8396edc9666f71a334a4","blockSize":4194304,"blocks":["d7d5fddf6bf4d14447b8bf743452d9b2ce174e0713fb8396edc9666f71a334a4"]},"offset":"10119522"},"_init.js":{"size":2246,"integrity":{"algorithm":"SHA256","hash":"9983e87520863952b4d1b0737ee491b0f2d7787e8edc95683a1dc4c600a81dfd","blockSize":4194304,"blocks":["9983e87520863952b4d1b0737ee491b0f2d7787e8edc95683a1dc4c600a81dfd"]},"offset":"10210032"},"assert.js":{"size":1385,"integrity":{"algorithm":"SHA256","hash":"31500e716c3f032404793db16d740f9e8ffb0d865b08e6b7ecdb3d86124f00b6","blockSize":4194304,"blocks":["31500e716c3f032404793db16d740f9e8ffb0d865b08e6b7ecdb3d86124f00b6"]},"offset":"10212278"},"convert.js":{"size":2975,"integrity":{"algorithm":"SHA256","hash":"12d4d75d138aa2e7ef6a99bec5e24bcbc132155c99b19269aa0ad38bf3f3ef9a","blockSize":4194304,"blocks":["12d4d75d138aa2e7ef6a99bec5e24bcbc132155c99b19269aa0ad38bf3f3ef9a"]},"offset":"10213663"},"errors.js":{"size":2148,"integrity":{"algorithm":"SHA256","hash":"bf9868d7f09c034122f4f349a7580ab64b5657e90efb730fe7863dfe8fab5041","blockSize":4194304,"blocks":["bf9868d7f09c034122f4f349a7580ab64b5657e90efb730fe7863dfe8fab5041"]},"offset":"10216638"},"js-joda.js":{"size":5646,"integrity":{"algorithm":"SHA256","hash":"e88b5b50e63605c0bd094346a2abc5551b1382d82d2cb7df1604253e0f9eadc8","blockSize":4194304,"blocks":["e88b5b50e63605c0bd094346a2abc5551b1382d82d2cb7df1604253e0f9eadc8"]},"offset":"10218786"},"use.js":{"size":485,"integrity":{"algorithm":"SHA256","hash":"4c81f02d93e4f2ed94621f83a6d97a878c5d9b7e26e5a5ec72b9f3abff128f34","blockSize":4194304,"blocks":["4c81f02d93e4f2ed94621f83a6d97a878c5d9b7e26e5a5ec72b9f3abff128f34"]},"offset":"10224432"},"zone":{"files":{"SystemDefaultZoneId.js":{"size":606,"integrity":{"algorithm":"SHA256","hash":"6da906f88d50b4bb5049766d78dea9cd502de073418c31a91f588e1e7321574e","blockSize":4194304,"blocks":["6da906f88d50b4bb5049766d78dea9cd502de073418c31a91f588e1e7321574e"]},"offset":"10224917"},"SystemDefaultZoneRules.js":{"size":4076,"integrity":{"algorithm":"SHA256","hash":"c771b58e24724dd8ebeb643f7bf4e8a902cf4ec0f60ad53a34485db36dc0e00b","blockSize":4194304,"blocks":["c771b58e24724dd8ebeb643f7bf4e8a902cf4ec0f60ad53a34485db36dc0e00b"]},"offset":"10225523"},"ZoneOffsetTransition.js":{"size":10989,"integrity":{"algorithm":"SHA256","hash":"abcae50643ed1dfb9c03ec427e7da003f5209525e25b18336280bb18aa83bb81","blockSize":4194304,"blocks":["abcae50643ed1dfb9c03ec427e7da003f5209525e25b18336280bb18aa83bb81"]},"offset":"10229599"},"ZoneRules.js":{"size":17889,"integrity":{"algorithm":"SHA256","hash":"ded0d14cc5813d2a96c6d19eefbec9d96d9e5a855ca331f7fdae45b8f00c0f2b","blockSize":4194304,"blocks":["ded0d14cc5813d2a96c6d19eefbec9d96d9e5a855ca331f7fdae45b8f00c0f2b"]},"offset":"10240588"},"ZoneRulesProvider.js":{"size":981,"integrity":{"algorithm":"SHA256","hash":"1c57c80d57b4a458681fe4af6c911f2df14e0d286c10a1cb757655e3fc1d03a2","blockSize":4194304,"blocks":["1c57c80d57b4a458681fe4af6c911f2df14e0d286c10a1cb757655e3fc1d03a2"]},"offset":"10258477"}}},"temporal":{"files":{"ChronoField.js":{"size":21540,"integrity":{"algorithm":"SHA256","hash":"9a0391f1a38faed9e29ac8110a0c7570d93baf647ee86ed8f0cfa4119d4c61f7","blockSize":4194304,"blocks":["9a0391f1a38faed9e29ac8110a0c7570d93baf647ee86ed8f0cfa4119d4c61f7"]},"offset":"10259458"},"ChronoUnit.js":{"size":12900,"integrity":{"algorithm":"SHA256","hash":"9a6d5a919a3fe71b6931868fe6829d84377c5d80f2acfb3e7d73fa7e4d9bffca","blockSize":4194304,"blocks":["9a6d5a919a3fe71b6931868fe6829d84377c5d80f2acfb3e7d73fa7e4d9bffca"]},"offset":"10280998"},"IsoFields.js":{"size":24604,"integrity":{"algorithm":"SHA256","hash":"42ad83c368a3f65383d0f61847afdc79a8c052edc3beeeb0df1f32203fbb85f6","blockSize":4194304,"blocks":["42ad83c368a3f65383d0f61847afdc79a8c052edc3beeeb0df1f32203fbb85f6"]},"offset":"10293898"},"NativeJsTemporal.js":{"size":3450,"integrity":{"algorithm":"SHA256","hash":"852c39132677e9b37cc5473fd24907c8b5cce3ea28ee2dde3fa14b40601f1029","blockSize":4194304,"blocks":["852c39132677e9b37cc5473fd24907c8b5cce3ea28ee2dde3fa14b40601f1029"]},"offset":"10318502"},"Temporal.js":{"size":21188,"integrity":{"algorithm":"SHA256","hash":"17fa57953c7575292c2ee963f166109d19ee93eb0a5b76da9bbf3edc163074ef","blockSize":4194304,"blocks":["17fa57953c7575292c2ee963f166109d19ee93eb0a5b76da9bbf3edc163074ef"]},"offset":"10321952"},"TemporalAccessor.js":{"size":5718,"integrity":{"algorithm":"SHA256","hash":"449f94efc5a2e8ab91d3fe0143cdb6a18998d0e8e01758f6897707f3f279c9d7","blockSize":4194304,"blocks":["449f94efc5a2e8ab91d3fe0143cdb6a18998d0e8e01758f6897707f3f279c9d7"]},"offset":"10343140"},"TemporalAdjuster.js":{"size":3844,"integrity":{"algorithm":"SHA256","hash":"bff2fb69359065f826b6e675f2477f1114d90f613c312943c4c9fd55278dd47b","blockSize":4194304,"blocks":["bff2fb69359065f826b6e675f2477f1114d90f613c312943c4c9fd55278dd47b"]},"offset":"10348858"},"TemporalAdjusters.js":{"size":18329,"integrity":{"algorithm":"SHA256","hash":"39c5dee4f119b750a280560e10d0cac305cddd014ca2d17908430c4ec0089e50","blockSize":4194304,"blocks":["39c5dee4f119b750a280560e10d0cac305cddd014ca2d17908430c4ec0089e50"]},"offset":"10352702"},"TemporalAmount.js":{"size":8034,"integrity":{"algorithm":"SHA256","hash":"f57cf4734b702d5c4799f7da9b39e8fac7aaf9c393ff1c33d431629cfc0b9502","blockSize":4194304,"blocks":["f57cf4734b702d5c4799f7da9b39e8fac7aaf9c393ff1c33d431629cfc0b9502"]},"offset":"10371031"},"TemporalField.js":{"size":9901,"integrity":{"algorithm":"SHA256","hash":"82bc410cde2c068df25f613579ad2315d63267e4a15608c7c6fd44a6c84e4ea4","blockSize":4194304,"blocks":["82bc410cde2c068df25f613579ad2315d63267e4a15608c7c6fd44a6c84e4ea4"]},"offset":"10379065"},"TemporalQueries.js":{"size":9753,"integrity":{"algorithm":"SHA256","hash":"8fd1ae1079f44c4d8ab1ba721d90b50ef1af2a887bd7f273951150c4656e6ba6","blockSize":4194304,"blocks":["8fd1ae1079f44c4d8ab1ba721d90b50ef1af2a887bd7f273951150c4656e6ba6"]},"offset":"10388966"},"TemporalQueriesFactory.js":{"size":2684,"integrity":{"algorithm":"SHA256","hash":"9e45149f378036924aed62490f8b56d595659124fd1f9da1808226096f8dfb7d","blockSize":4194304,"blocks":["9e45149f378036924aed62490f8b56d595659124fd1f9da1808226096f8dfb7d"]},"offset":"10398719"},"TemporalQuery.js":{"size":4435,"integrity":{"algorithm":"SHA256","hash":"2c31761852b0f6d965d9002352de023c94887df77bcf3296f954160a3f8f7e93","blockSize":4194304,"blocks":["2c31761852b0f6d965d9002352de023c94887df77bcf3296f954160a3f8f7e93"]},"offset":"10401403"},"TemporalUnit.js":{"size":7747,"integrity":{"algorithm":"SHA256","hash":"35edbf70b3ea5f246b630bc33b76239b7852f2bcf13de8a46053ef204d80e1bf","blockSize":4194304,"blocks":["35edbf70b3ea5f246b630bc33b76239b7852f2bcf13de8a46053ef204d80e1bf"]},"offset":"10405838"},"ValueRange.js":{"size":9037,"integrity":{"algorithm":"SHA256","hash":"777c9895187316049baf0246814473896bcb51565fdcaba340cc10401c614509","blockSize":4194304,"blocks":["777c9895187316049baf0246814473896bcb51565fdcaba340cc10401c614509"]},"offset":"10413585"}}},"format":{"files":{"DateTimeBuilder.js":{"size":22689,"integrity":{"algorithm":"SHA256","hash":"0606000ae8f9cdcdb5fcffd51be46e3544dcb527957bd8535e49bc38d432805a","blockSize":4194304,"blocks":["0606000ae8f9cdcdb5fcffd51be46e3544dcb527957bd8535e49bc38d432805a"]},"offset":"10422622"},"DateTimeFormatter.js":{"size":34059,"integrity":{"algorithm":"SHA256","hash":"258d93038de174193e67a9a8f98775b072bcc279f3ec8665216dab1fae36ce23","blockSize":4194304,"blocks":["258d93038de174193e67a9a8f98775b072bcc279f3ec8665216dab1fae36ce23"]},"offset":"10445311"},"DateTimeFormatterBuilder.js":{"size":72553,"integrity":{"algorithm":"SHA256","hash":"a4c31ea7e775372fc24f5e8c3197fbb560a0db600d48e874d24e333f661b87b8","blockSize":4194304,"blocks":["a4c31ea7e775372fc24f5e8c3197fbb560a0db600d48e874d24e333f661b87b8"]},"offset":"10479370"},"DateTimeParseContext.js":{"size":8084,"integrity":{"algorithm":"SHA256","hash":"c321d823352e857fdd23ec6998b45d2e8d3bcb3479ffc7f4c42929cfcd798899","blockSize":4194304,"blocks":["c321d823352e857fdd23ec6998b45d2e8d3bcb3479ffc7f4c42929cfcd798899"]},"offset":"10551923"},"DateTimePrintContext.js":{"size":3741,"integrity":{"algorithm":"SHA256","hash":"54ee69ea224c3e8e223650b4141372b22dd3fa570bd81dda508f8f1e5847cf7b","blockSize":4194304,"blocks":["54ee69ea224c3e8e223650b4141372b22dd3fa570bd81dda508f8f1e5847cf7b"]},"offset":"10560007"},"DecimalStyle.js":{"size":3376,"integrity":{"algorithm":"SHA256","hash":"b8814dad7995bff6a7aac17a3a66c4916147eb05e4c957bb9184e04cea4682d4","blockSize":4194304,"blocks":["b8814dad7995bff6a7aac17a3a66c4916147eb05e4c957bb9184e04cea4682d4"]},"offset":"10563748"},"EnumMap.js":{"size":1514,"integrity":{"algorithm":"SHA256","hash":"1b7f9eee5c770cf69dde665c1941525fc4285f95f048d0102339df1de1930247","blockSize":4194304,"blocks":["1b7f9eee5c770cf69dde665c1941525fc4285f95f048d0102339df1de1930247"]},"offset":"10567124"},"ParsePosition.js":{"size":620,"integrity":{"algorithm":"SHA256","hash":"99fba1b61ef4bb77bfa04f4709146cdaab8a7c09580b25c5961cd1c662575266","blockSize":4194304,"blocks":["99fba1b61ef4bb77bfa04f4709146cdaab8a7c09580b25c5961cd1c662575266"]},"offset":"10568638"},"ResolverStyle.js":{"size":3765,"integrity":{"algorithm":"SHA256","hash":"bf6da7040592b6f1241b600e60e9e2ed985ab15309b533bf7063aa5ac6859df6","blockSize":4194304,"blocks":["bf6da7040592b6f1241b600e60e9e2ed985ab15309b533bf7063aa5ac6859df6"]},"offset":"10569258"},"SignStyle.js":{"size":1300,"integrity":{"algorithm":"SHA256","hash":"4842a21f5108aeabe81b2a42e68b8e3e227aa84df9dce23c7e6d3a90e30801b3","blockSize":4194304,"blocks":["4842a21f5108aeabe81b2a42e68b8e3e227aa84df9dce23c7e6d3a90e30801b3"]},"offset":"10573023"},"StringBuilder.js":{"size":873,"integrity":{"algorithm":"SHA256","hash":"68122266254680f702aa73d2873e2168998f1d5ebaabecf921d912303640650f","blockSize":4194304,"blocks":["68122266254680f702aa73d2873e2168998f1d5ebaabecf921d912303640650f"]},"offset":"10574323"},"TextStyle.js":{"size":3846,"integrity":{"algorithm":"SHA256","hash":"8788998d2121f55aa74a15afebd20d2b08b6bf1ba4ac34ad9746d6b1dc57f42c","blockSize":4194304,"blocks":["8788998d2121f55aa74a15afebd20d2b08b6bf1ba4ac34ad9746d6b1dc57f42c"]},"offset":"10575196"},"parser":{"files":{"CharLiteralPrinterParser.js":{"size":1163,"integrity":{"algorithm":"SHA256","hash":"72d3b6e3ae97b66b164b4b0efc2116ac40cd63dfdc07aeb8ccf5d171611098e1","blockSize":4194304,"blocks":["72d3b6e3ae97b66b164b4b0efc2116ac40cd63dfdc07aeb8ccf5d171611098e1"]},"offset":"10579042"},"CompositePrinterParser.js":{"size":2717,"integrity":{"algorithm":"SHA256","hash":"168f973bd3b008535e95f98900644028a92d33a43348aa70b8dcebd3204f377e","blockSize":4194304,"blocks":["168f973bd3b008535e95f98900644028a92d33a43348aa70b8dcebd3204f377e"]},"offset":"10580205"},"FractionPrinterParser.js":{"size":6284,"integrity":{"algorithm":"SHA256","hash":"0f2dead18917b15f7b4782a4ebae18e4e3487517eae678d10d6388ec52b61101","blockSize":4194304,"blocks":["0f2dead18917b15f7b4782a4ebae18e4e3487517eae678d10d6388ec52b61101"]},"offset":"10582922"},"NumberPrinterParser.js":{"size":13272,"integrity":{"algorithm":"SHA256","hash":"82fdbc13d9881491ac153eeb4b05d0ef86a0bc01555bb916fbafccf4a785956a","blockSize":4194304,"blocks":["82fdbc13d9881491ac153eeb4b05d0ef86a0bc01555bb916fbafccf4a785956a"]},"offset":"10589206"},"OffsetIdPrinterParser.js":{"size":6628,"integrity":{"algorithm":"SHA256","hash":"47c489e4001ce641e082f32285a54dd4d4b5a3c44796d8a39fb8a46282f9d81b","blockSize":4194304,"blocks":["47c489e4001ce641e082f32285a54dd4d4b5a3c44796d8a39fb8a46282f9d81b"]},"offset":"10602478"},"PadPrinterParserDecorator.js":{"size":2684,"integrity":{"algorithm":"SHA256","hash":"540c5f6e1b26d458985b2c8f6701f103060fc90b017be8f07fff9ec514136cf5","blockSize":4194304,"blocks":["540c5f6e1b26d458985b2c8f6701f103060fc90b017be8f07fff9ec514136cf5"]},"offset":"10609106"},"SettingsParser.js":{"size":1570,"integrity":{"algorithm":"SHA256","hash":"186c331ea59c3e3f45970b0ec912d240c1a81fb6e0239cf71f12dd3147f14e58","blockSize":4194304,"blocks":["186c331ea59c3e3f45970b0ec912d240c1a81fb6e0239cf71f12dd3147f14e58"]},"offset":"10611790"},"StringLiteralPrinterParser.js":{"size":979,"integrity":{"algorithm":"SHA256","hash":"6439b94036b7ceeb96e618b42d24e1cdb4524d0e10cdb50765ac0623d2118ff1","blockSize":4194304,"blocks":["6439b94036b7ceeb96e618b42d24e1cdb4524d0e10cdb50765ac0623d2118ff1"]},"offset":"10613360"},"ZoneIdPrinterParser.js":{"size":7326,"integrity":{"algorithm":"SHA256","hash":"5f189159331a93ea37310dc3a59033a2fdd4a98679f5d94651fae58b3c85ab41","blockSize":4194304,"blocks":["5f189159331a93ea37310dc3a59033a2fdd4a98679f5d94651fae58b3c85ab41"]},"offset":"10614339"}}}}},"chrono":{"files":{"ChronoLocalDate.js":{"size":11976,"integrity":{"algorithm":"SHA256","hash":"043dedc5e8f57fe05a917bd9cf15fc4a2758d93213612d52a289051a98ed5165","blockSize":4194304,"blocks":["043dedc5e8f57fe05a917bd9cf15fc4a2758d93213612d52a289051a98ed5165"]},"offset":"10621665"},"ChronoLocalDateTime.js":{"size":5249,"integrity":{"algorithm":"SHA256","hash":"73b98230d10f8ec6b4f1e414e574feb15fe61258544bb12c8a9e5f9651b4701f","blockSize":4194304,"blocks":["73b98230d10f8ec6b4f1e414e574feb15fe61258544bb12c8a9e5f9651b4701f"]},"offset":"10633641"},"ChronoZonedDateTime.js":{"size":7802,"integrity":{"algorithm":"SHA256","hash":"98259deab127883d10e6d47ed45280ba0c789f705bd864cb8d9ec22f1ec70798","blockSize":4194304,"blocks":["98259deab127883d10e6d47ed45280ba0c789f705bd864cb8d9ec22f1ec70798"]},"offset":"10638890"},"IsoChronology.js":{"size":13422,"integrity":{"algorithm":"SHA256","hash":"7282a4860b848213de9ccb5061abb987cb1368779106630666ef284c3e34f914","blockSize":4194304,"blocks":["7282a4860b848213de9ccb5061abb987cb1368779106630666ef284c3e34f914"]},"offset":"10646692"}}}}},"dist":{"files":{"js-joda.cjs.js":{"size":401204,"integrity":{"algorithm":"SHA256","hash":"3bbb4c5037d8aecdc22c435899f712db42ea6bea8f8583b6d7ed1ab7df204d15","blockSize":4194304,"blocks":["3bbb4c5037d8aecdc22c435899f712db42ea6bea8f8583b6d7ed1ab7df204d15"]},"offset":"10660114"},"js-joda.esm.js":{"size":399818,"integrity":{"algorithm":"SHA256","hash":"10d60a27c4b61ef5938fb0f57f31df8c2649fe3dbcb89f79100096614fe51779","blockSize":4194304,"blocks":["10d60a27c4b61ef5938fb0f57f31df8c2649fe3dbcb89f79100096614fe51779"]},"offset":"11061318"},"js-joda.js":{"size":443426,"integrity":{"algorithm":"SHA256","hash":"5ac4ec6984b53e1aa0386443831235f72656ea198c7dddb380ae692c3925a4c9","blockSize":4194304,"blocks":["5ac4ec6984b53e1aa0386443831235f72656ea198c7dddb380ae692c3925a4c9"]},"offset":"11461136"},"js-joda.min.js":{"size":194814,"integrity":{"algorithm":"SHA256","hash":"fcf08bbf8c5b9f448e273e9599bfb5a3a70ba18f209f763294824bd5d5818456","blockSize":4194304,"blocks":["fcf08bbf8c5b9f448e273e9599bfb5a3a70ba18f209f763294824bd5d5818456"]},"offset":"11904562"}}}}}}},"@mapbox":{"files":{"node-pre-gyp":{"files":{"LICENSE":{"size":1501,"integrity":{"algorithm":"SHA256","hash":"5e3b2b8138f20dbf2e7558d81b8bcad48d0f45b731eb276fa4de21b94f4447bd","blockSize":4194304,"blocks":["5e3b2b8138f20dbf2e7558d81b8bcad48d0f45b731eb276fa4de21b94f4447bd"]},"offset":"12099376"},"contributing.md":{"size":288,"integrity":{"algorithm":"SHA256","hash":"ef825e69acf0164be6830970534c60e91abd15afba75676f3778fed1211eaa98","blockSize":4194304,"blocks":["ef825e69acf0164be6830970534c60e91abd15afba75676f3778fed1211eaa98"]},"offset":"12100877"},"package.json":{"size":996,"integrity":{"algorithm":"SHA256","hash":"1dfd40426917a0f36d2ff5d8c2c9e5f22f38815a8699f2c2314960d790b0cb9c","blockSize":4194304,"blocks":["1dfd40426917a0f36d2ff5d8c2c9e5f22f38815a8699f2c2314960d790b0cb9c"]},"offset":"12101165"},"lib":{"files":{"build.js":{"size":1736,"integrity":{"algorithm":"SHA256","hash":"92ceaa8a2e8194b328777d7aaff1be483efacc61d4cc2957fb26e566c5be9f77","blockSize":4194304,"blocks":["92ceaa8a2e8194b328777d7aaff1be483efacc61d4cc2957fb26e566c5be9f77"]},"offset":"12102161"},"clean.js":{"size":1135,"integrity":{"algorithm":"SHA256","hash":"1ca85c8f8cb83c26a0aa3b8cf53ceecd462ebdcda3a3a15a046d46f08ee11c70","blockSize":4194304,"blocks":["1ca85c8f8cb83c26a0aa3b8cf53ceecd462ebdcda3a3a15a046d46f08ee11c70"]},"offset":"12103897"},"configure.js":{"size":1879,"integrity":{"algorithm":"SHA256","hash":"7f00f81ee1038aa6ad6ae4c88e4ef9f18cb3b0d46c97a67405abe0c98248c74a","blockSize":4194304,"blocks":["7f00f81ee1038aa6ad6ae4c88e4ef9f18cb3b0d46c97a67405abe0c98248c74a"]},"offset":"12105032"},"info.js":{"size":1217,"integrity":{"algorithm":"SHA256","hash":"375694fdd6e96bab5972a1ab3b3621f2982d2e585b634ab6a4580d20c99e1909","blockSize":4194304,"blocks":["375694fdd6e96bab5972a1ab3b3621f2982d2e585b634ab6a4580d20c99e1909"]},"offset":"12106911"},"install.js":{"size":7891,"integrity":{"algorithm":"SHA256","hash":"746054228a47eb0b8cdaa1feac1b1bbde26f3b591a809d88c2213a19b70792dc","blockSize":4194304,"blocks":["746054228a47eb0b8cdaa1feac1b1bbde26f3b591a809d88c2213a19b70792dc"]},"offset":"12108128"},"main.js":{"size":3187,"integrity":{"algorithm":"SHA256","hash":"e60fca1c7778356ebf5a0f369325cd03915e847d58cf399fbb8f148d61f95f15","blockSize":4194304,"blocks":["e60fca1c7778356ebf5a0f369325cd03915e847d58cf399fbb8f148d61f95f15"]},"offset":"12116019"},"node-pre-gyp.js":{"size":8844,"integrity":{"algorithm":"SHA256","hash":"cbe370c0f1d6e08a01525369288eb5c08e0fafb8067232b445d024d5c54eabb5","blockSize":4194304,"blocks":["cbe370c0f1d6e08a01525369288eb5c08e0fafb8067232b445d024d5c54eabb5"]},"offset":"12119206"},"package.js":{"size":2308,"integrity":{"algorithm":"SHA256","hash":"2bba2be22c574d84de2a0677f69cdeeaacc38d53eb1619e8e51d98a668362b23","blockSize":4194304,"blocks":["2bba2be22c574d84de2a0677f69cdeeaacc38d53eb1619e8e51d98a668362b23"]},"offset":"12128050"},"pre-binding.js":{"size":1178,"integrity":{"algorithm":"SHA256","hash":"383b56ef9af25f98208672cf71e0829a1ec833c203d6a46efd2eb93ff4372ebd","blockSize":4194304,"blocks":["383b56ef9af25f98208672cf71e0829a1ec833c203d6a46efd2eb93ff4372ebd"]},"offset":"12130358"},"publish.js":{"size":3165,"integrity":{"algorithm":"SHA256","hash":"5f0230681b9bc5d4fe8208e3971fe8d6979aa345c536b0951da7e9b21235fa3c","blockSize":4194304,"blocks":["5f0230681b9bc5d4fe8208e3971fe8d6979aa345c536b0951da7e9b21235fa3c"]},"offset":"12131536"},"rebuild.js":{"size":517,"integrity":{"algorithm":"SHA256","hash":"278bddb9c354f51922c48751d063b372f6190e1b793a1c0303fa18a896b56740","blockSize":4194304,"blocks":["278bddb9c354f51922c48751d063b372f6190e1b793a1c0303fa18a896b56740"]},"offset":"12134701"},"reinstall.js":{"size":565,"integrity":{"algorithm":"SHA256","hash":"7ec11bf9fd1ef911f572009b130abcbaffff96556d79c5452c12704aa30b13e0","blockSize":4194304,"blocks":["7ec11bf9fd1ef911f572009b130abcbaffff96556d79c5452c12704aa30b13e0"]},"offset":"12135218"},"reveal.js":{"size":1020,"integrity":{"algorithm":"SHA256","hash":"de02f2e84c0b646a14e3d6e2bdc11916449e318806ce70c924590e36bcb49ee7","blockSize":4194304,"blocks":["de02f2e84c0b646a14e3d6e2bdc11916449e318806ce70c924590e36bcb49ee7"]},"offset":"12135783"},"testbinary.js":{"size":2903,"integrity":{"algorithm":"SHA256","hash":"af2aead47f32d1e4c6454c0d5ac80de8b401c0c73ee7d2e5f6059313477f5cdd","blockSize":4194304,"blocks":["af2aead47f32d1e4c6454c0d5ac80de8b401c0c73ee7d2e5f6059313477f5cdd"]},"offset":"12136803"},"testpackage.js":{"size":1571,"integrity":{"algorithm":"SHA256","hash":"e86a437efc298c308ccb5873c4f87c42c63e8095cca6f674640f011fcde8c6a0","blockSize":4194304,"blocks":["e86a437efc298c308ccb5873c4f87c42c63e8095cca6f674640f011fcde8c6a0"]},"offset":"12139706"},"unpublish.js":{"size":1455,"integrity":{"algorithm":"SHA256","hash":"c73f57b2dbf3ff448e7c1d0b1b3c1240f9f0a117b38a623da9786e6f973d50fa","blockSize":4194304,"blocks":["c73f57b2dbf3ff448e7c1d0b1b3c1240f9f0a117b38a623da9786e6f973d50fa"]},"offset":"12141277"},"util":{"files":{"abi_crosswalk.json":{"size":35785,"integrity":{"algorithm":"SHA256","hash":"0750c19f9c244a02a173cd73ca1026ab7377aca7c716be3f288a64aa755f77b0","blockSize":4194304,"blocks":["0750c19f9c244a02a173cd73ca1026ab7377aca7c716be3f288a64aa755f77b0"]},"offset":"12142732"},"compile.js":{"size":2779,"integrity":{"algorithm":"SHA256","hash":"0f6075ac028a646c2134bcfa6845b7524b6f3dcdd568ee60a3d27d69bc45c38f","blockSize":4194304,"blocks":["0f6075ac028a646c2134bcfa6845b7524b6f3dcdd568ee60a3d27d69bc45c38f"]},"offset":"12178517"},"handle_gyp_opts.js":{"size":3447,"integrity":{"algorithm":"SHA256","hash":"9eea95397ee0f3c3dea8ef74754f519753feda2f4a4a1123d75dd2b6a34f3e15","blockSize":4194304,"blocks":["9eea95397ee0f3c3dea8ef74754f519753feda2f4a4a1123d75dd2b6a34f3e15"]},"offset":"12181296"},"napi.js":{"size":8098,"integrity":{"algorithm":"SHA256","hash":"6ec596a5dd9ddad0cd72c19185f3a302edf1ba01d4e882851287ad7713f2cf7c","blockSize":4194304,"blocks":["6ec596a5dd9ddad0cd72c19185f3a302edf1ba01d4e882851287ad7713f2cf7c"]},"offset":"12184743"},"s3_setup.js":{"size":4581,"integrity":{"algorithm":"SHA256","hash":"f1edffaf36f1cb8228b7f9d988f8695dba478c8b72b5502cf8c7ffb2e27a6483","blockSize":4194304,"blocks":["f1edffaf36f1cb8228b7f9d988f8695dba478c8b72b5502cf8c7ffb2e27a6483"]},"offset":"12192841"},"versioning.js":{"size":14514,"integrity":{"algorithm":"SHA256","hash":"de4f805e002ee0f748dafc268821fb631a42820847fb24d491684002fa8608df","blockSize":4194304,"blocks":["de4f805e002ee0f748dafc268821fb631a42820847fb24d491684002fa8608df"]},"offset":"12197422"},"nw-pre-gyp":{"files":{"index.html":{"size":542,"integrity":{"algorithm":"SHA256","hash":"6592e3287756949923f881ca7a61270448221146ef1fb5d26db4c50d9aff4977","blockSize":4194304,"blocks":["6592e3287756949923f881ca7a61270448221146ef1fb5d26db4c50d9aff4977"]},"offset":"12211936"},"package.json":{"size":160,"integrity":{"algorithm":"SHA256","hash":"49144a24c7d686ca276850e6ffdd97147148c10acf3fe94317c96aa07de6a6ed","blockSize":4194304,"blocks":["49144a24c7d686ca276850e6ffdd97147148c10acf3fe94317c96aa07de6a6ed"]},"offset":"12212478"}}}}}}},"bin":{"files":{"node-pre-gyp":{"size":59,"integrity":{"algorithm":"SHA256","hash":"a33b7dcabd82cf54e932cdc439510d4bbbad841bc8204cc6536faef9f537eff5","blockSize":4194304,"blocks":["a33b7dcabd82cf54e932cdc439510d4bbbad841bc8204cc6536faef9f537eff5"]},"offset":"12212638"},"node-pre-gyp.cmd":{"size":40,"integrity":{"algorithm":"SHA256","hash":"674572fb4b9a5697baedd47384c06ab13be6995652be590783a2967d135f1b8e","blockSize":4194304,"blocks":["674572fb4b9a5697baedd47384c06ab13be6995652be590783a2967d135f1b8e"]},"offset":"12212697"}}},"node_modules":{"files":{"are-we-there-yet":{"files":{"LICENSE.md":{"size":717,"integrity":{"algorithm":"SHA256","hash":"7f75bb21103e77b7acfcf88a6ad0286741a18b5d13c4326160346e8cf7e356ad","blockSize":4194304,"blocks":["7f75bb21103e77b7acfcf88a6ad0286741a18b5d13c4326160346e8cf7e356ad"]},"offset":"46431751"},"package.json":{"size":843,"integrity":{"algorithm":"SHA256","hash":"04201f4b0c2d9f37f39fc6663541c19ba7967dc3c4b2d5446009887d1230e5e8","blockSize":4194304,"blocks":["04201f4b0c2d9f37f39fc6663541c19ba7967dc3c4b2d5446009887d1230e5e8"]},"offset":"46432468"},"lib":{"files":{"index.js":{"size":163,"integrity":{"algorithm":"SHA256","hash":"7a427679a9b245f02d66bb09aeaa5337bdff29375d05f3f34e7133b61001bb69","blockSize":4194304,"blocks":["7a427679a9b245f02d66bb09aeaa5337bdff29375d05f3f34e7133b61001bb69"]},"offset":"46433311"},"tracker-base.js":{"size":274,"integrity":{"algorithm":"SHA256","hash":"733f287bde0281daa16a3ee8e006266c37d7aa81a5750c2e2379535fea265977","blockSize":4194304,"blocks":["733f287bde0281daa16a3ee8e006266c37d7aa81a5750c2e2379535fea265977"]},"offset":"46433474"},"tracker-group.js":{"size":3281,"integrity":{"algorithm":"SHA256","hash":"d2dccbb7a16d164bdb8ae188e3ab55cf17bbb2e5d5796538dc4ffa2509848253","blockSize":4194304,"blocks":["d2dccbb7a16d164bdb8ae188e3ab55cf17bbb2e5d5796538dc4ffa2509848253"]},"offset":"46433748"},"tracker-stream.js":{"size":963,"integrity":{"algorithm":"SHA256","hash":"e550b2d2ee5720b7b140a73b625d1cef6550152b1edbd7264488c3bd54611b6f","blockSize":4194304,"blocks":["e550b2d2ee5720b7b140a73b625d1cef6550152b1edbd7264488c3bd54611b6f"]},"offset":"46437029"},"tracker.js":{"size":836,"integrity":{"algorithm":"SHA256","hash":"74999377a441331aeaa61a1b3565b38daa66db786ef96f51f1c9bde8ee523ad3","blockSize":4194304,"blocks":["74999377a441331aeaa61a1b3565b38daa66db786ef96f51f1c9bde8ee523ad3"]},"offset":"46437992"}}}}},"gauge":{"files":{"LICENSE":{"size":751,"integrity":{"algorithm":"SHA256","hash":"af83b3ce4e592e87b4ecfa8c8cb45bc4ec26d0b3fb8f34f3687088f6928f705f","blockSize":4194304,"blocks":["af83b3ce4e592e87b4ecfa8c8cb45bc4ec26d0b3fb8f34f3687088f6928f705f"]},"offset":"46438828"},"base-theme.js":{"size":395,"integrity":{"algorithm":"SHA256","hash":"ad22f4a05d105265611188e123e4a7ee07be6d28dc5ef39c98b4f686e7a902a7","blockSize":4194304,"blocks":["ad22f4a05d105265611188e123e4a7ee07be6d28dc5ef39c98b4f686e7a902a7"]},"offset":"46439579"},"error.js":{"size":616,"integrity":{"algorithm":"SHA256","hash":"2957dc2045a462606df224526d880fcc7a472bc992a74b0db9b23bf1984a9b20","blockSize":4194304,"blocks":["2957dc2045a462606df224526d880fcc7a472bc992a74b0db9b23bf1984a9b20"]},"offset":"46439974"},"has-color.js":{"size":99,"integrity":{"algorithm":"SHA256","hash":"bc77cc5732b948d7fe113b31ff78972d6ea336f8d15e8547542007657d41dc30","blockSize":4194304,"blocks":["bc77cc5732b948d7fe113b31ff78972d6ea336f8d15e8547542007657d41dc30"]},"offset":"46440590"},"index.js":{"size":6998,"integrity":{"algorithm":"SHA256","hash":"fc4c02532df6a0d666dcc54c2a1820639244e10fc8f86d5fc59526c707ea6a49","blockSize":4194304,"blocks":["fc4c02532df6a0d666dcc54c2a1820639244e10fc8f86d5fc59526c707ea6a49"]},"offset":"46440689"},"package.json":{"size":1225,"integrity":{"algorithm":"SHA256","hash":"ee3293848134ead1c9f22096154ecaffe53eb44ab548885f9d1f7f29390ecac3","blockSize":4194304,"blocks":["ee3293848134ead1c9f22096154ecaffe53eb44ab548885f9d1f7f29390ecac3"]},"offset":"46447687"},"plumbing.js":{"size":1269,"integrity":{"algorithm":"SHA256","hash":"0db8c804e8d5b02a1f7eff072d3d7701f2cc5db341074bbe1e4bdd6ca8e3aa95","blockSize":4194304,"blocks":["0db8c804e8d5b02a1f7eff072d3d7701f2cc5db341074bbe1e4bdd6ca8e3aa95"]},"offset":"46448912"},"process.js":{"size":89,"integrity":{"algorithm":"SHA256","hash":"742bd2d12a7786e595955c8a846dbefe88591df39c2659491bddadbb8ed7dae6","blockSize":4194304,"blocks":["742bd2d12a7786e595955c8a846dbefe88591df39c2659491bddadbb8ed7dae6"]},"offset":"46450181"},"progress-bar.js":{"size":1000,"integrity":{"algorithm":"SHA256","hash":"153e12a74533253a784b0707094471e4b1ce6252e51a0fb9ddc165b899f81f9f","blockSize":4194304,"blocks":["153e12a74533253a784b0707094471e4b1ce6252e51a0fb9ddc165b899f81f9f"]},"offset":"46450270"},"render-template.js":{"size":5646,"integrity":{"algorithm":"SHA256","hash":"29b410ae7b169f680ab2ad67fea1299282d055bce90ef0b0c5b43878dc8a6af4","blockSize":4194304,"blocks":["29b410ae7b169f680ab2ad67fea1299282d055bce90ef0b0c5b43878dc8a6af4"]},"offset":"46451270"},"set-immediate.js":{"size":139,"integrity":{"algorithm":"SHA256","hash":"90dbb2e127d9b971731b2094b2516a463243e4074367dd4129fe2849ef598514","blockSize":4194304,"blocks":["90dbb2e127d9b971731b2094b2516a463243e4074367dd4129fe2849ef598514"]},"offset":"46456916"},"set-interval.js":{"size":93,"integrity":{"algorithm":"SHA256","hash":"19d2fa52118a39a7810efeb7bce45418f3e55ee7b445c85811d07a2f73b7bbb7","blockSize":4194304,"blocks":["19d2fa52118a39a7810efeb7bce45418f3e55ee7b445c85811d07a2f73b7bbb7"]},"offset":"46457055"},"spin.js":{"size":105,"integrity":{"algorithm":"SHA256","hash":"4ddb202944fd4e556edc68107b1a1f33dd25f1910876d2bf04eb5a58ae060c9d","blockSize":4194304,"blocks":["4ddb202944fd4e556edc68107b1a1f33dd25f1910876d2bf04eb5a58ae060c9d"]},"offset":"46457148"},"template-item.js":{"size":1903,"integrity":{"algorithm":"SHA256","hash":"40f44b2a921be2bf83c15d158850a027dc2ccad355b4f2fd977f24552ec831d5","blockSize":4194304,"blocks":["40f44b2a921be2bf83c15d158850a027dc2ccad355b4f2fd977f24552ec831d5"]},"offset":"46457253"},"theme-set.js":{"size":3692,"integrity":{"algorithm":"SHA256","hash":"a396bd54cb0b997ad6bfc441cf2e2ffbc901ce084accf8be5f957595a8df3167","blockSize":4194304,"blocks":["a396bd54cb0b997ad6bfc441cf2e2ffbc901ce084accf8be5f957595a8df3167"]},"offset":"46459156"},"themes.js":{"size":1653,"integrity":{"algorithm":"SHA256","hash":"01f30725f546a4997e02c3479c238b2df962773ff1d27ab8545da6afea79b0ec","blockSize":4194304,"blocks":["01f30725f546a4997e02c3479c238b2df962773ff1d27ab8545da6afea79b0ec"]},"offset":"46462848"},"wide-truncate.js":{"size":828,"integrity":{"algorithm":"SHA256","hash":"9cda29fe56643215b87710e4d99df6a2a78101927d99047ee69dfb114017138d","blockSize":4194304,"blocks":["9cda29fe56643215b87710e4d99df6a2a78101927d99047ee69dfb114017138d"]},"offset":"46464501"}}},"nopt":{"files":{"LICENSE":{"size":765,"integrity":{"algorithm":"SHA256","hash":"4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b","blockSize":4194304,"blocks":["4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b"]},"offset":"46465329"},"package.json":{"size":546,"integrity":{"algorithm":"SHA256","hash":"502654e44ec76ab9ada227578bd77ab7ec315d9cce04c29d629f4f086d88313a","blockSize":4194304,"blocks":["502654e44ec76ab9ada227578bd77ab7ec315d9cce04c29d629f4f086d88313a"]},"offset":"46466094"},"lib":{"files":{"nopt.js":{"size":12220,"integrity":{"algorithm":"SHA256","hash":"aa765390d86b5b9242f0dc2114fd7e2a0c473b854f2ccc85af51a2d800826785","blockSize":4194304,"blocks":["aa765390d86b5b9242f0dc2114fd7e2a0c473b854f2ccc85af51a2d800826785"]},"offset":"46466640"}}},"bin":{"files":{"nopt.js":{"size":1549,"integrity":{"algorithm":"SHA256","hash":"419fd0c250623dcf67bb4993817881331c17096960907ee34adc85af9e74da31","blockSize":4194304,"blocks":["419fd0c250623dcf67bb4993817881331c17096960907ee34adc85af9e74da31"]},"offset":"46478860"}}}}},"npmlog":{"files":{"LICENSE":{"size":765,"integrity":{"algorithm":"SHA256","hash":"4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b","blockSize":4194304,"blocks":["4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b"]},"offset":"46480409"},"log.js":{"size":9007,"integrity":{"algorithm":"SHA256","hash":"eb28eefc98d9edbb1aa6383ede8f835f14c23110962a317d656718b0679842a7","blockSize":4194304,"blocks":["eb28eefc98d9edbb1aa6383ede8f835f14c23110962a317d656718b0679842a7"]},"offset":"46481174"},"package.json":{"size":537,"integrity":{"algorithm":"SHA256","hash":"1e898fb7897a7ff88278932ed868f57019351e1be5eca31536d9e853f7b3cd49","blockSize":4194304,"blocks":["1e898fb7897a7ff88278932ed868f57019351e1be5eca31536d9e853f7b3cd49"]},"offset":"46490181"}}}}}}}}},"@opentelemetry":{"files":{"api":{"files":{"LICENSE":{"size":11357,"integrity":{"algorithm":"SHA256","hash":"c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4","blockSize":4194304,"blocks":["c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4"]},"offset":"12212737"},"package.json":{"size":1804,"integrity":{"algorithm":"SHA256","hash":"e615897f6b979a3d8c9956f853c1ef488e217883cbe070152f0e9ed28e459ba0","blockSize":4194304,"blocks":["e615897f6b979a3d8c9956f853c1ef488e217883cbe070152f0e9ed28e459ba0"]},"offset":"12224094"},"build":{"files":{"src":{"files":{"index.js":{"size":5067,"integrity":{"algorithm":"SHA256","hash":"a8dcdb94e12522b832be45c6f138e36cf0c37dd4fe18a21879c587c5291ed2d7","blockSize":4194304,"blocks":["a8dcdb94e12522b832be45c6f138e36cf0c37dd4fe18a21879c587c5291ed2d7"]},"offset":"12225898"},"version.js":{"size":832,"integrity":{"algorithm":"SHA256","hash":"772f71b9cdea42964caa336d87552e708de17d0df0c2d0cde4285178952cdf83","blockSize":4194304,"blocks":["772f71b9cdea42964caa336d87552e708de17d0df0c2d0cde4285178952cdf83"]},"offset":"12230965"},"trace":{"files":{"NonRecordingSpan.js":{"size":2463,"integrity":{"algorithm":"SHA256","hash":"bbcfcf5faad6acbb30863471a40f0c52dd5cc7412c5f34e97f99f8e9c1758464","blockSize":4194304,"blocks":["bbcfcf5faad6acbb30863471a40f0c52dd5cc7412c5f34e97f99f8e9c1758464"]},"offset":"12231797"},"NoopTracer.js":{"size":2913,"integrity":{"algorithm":"SHA256","hash":"009ef63c6676623ca6dd4ae3742b92c0725a5d2cbde191317cd6d2af8cb00fc5","blockSize":4194304,"blocks":["009ef63c6676623ca6dd4ae3742b92c0725a5d2cbde191317cd6d2af8cb00fc5"]},"offset":"12234260"},"NoopTracerProvider.js":{"size":1286,"integrity":{"algorithm":"SHA256","hash":"79d0c64276420fd10de98734e966c2557d0057944ac797dfd697d2559ede1bc0","blockSize":4194304,"blocks":["79d0c64276420fd10de98734e966c2557d0057944ac797dfd697d2559ede1bc0"]},"offset":"12237173"},"ProxyTracer.js":{"size":2078,"integrity":{"algorithm":"SHA256","hash":"14cc1dc426d64604f22f0891057dd29fb440edfd2dc210a3f419868c3e85e5c0","blockSize":4194304,"blocks":["14cc1dc426d64604f22f0891057dd29fb440edfd2dc210a3f419868c3e85e5c0"]},"offset":"12238459"},"ProxyTracerProvider.js":{"size":2366,"integrity":{"algorithm":"SHA256","hash":"b44b7f604cb23372bd01e10399476f31ae51a1623f6d9a914b1ada3b2b9875ad","blockSize":4194304,"blocks":["b44b7f604cb23372bd01e10399476f31ae51a1623f6d9a914b1ada3b2b9875ad"]},"offset":"12240537"},"Sampler.js":{"size":718,"integrity":{"algorithm":"SHA256","hash":"b939863122ac58c19ff31bf9869706e7af46760d346e9ffff98c7634b20cf89c","blockSize":4194304,"blocks":["b939863122ac58c19ff31bf9869706e7af46760d346e9ffff98c7634b20cf89c"]},"offset":"12242903"},"SamplingResult.js":{"size":1593,"integrity":{"algorithm":"SHA256","hash":"13f9385ceac982cfa0105eef4f6a3c2ec0af7c06034a6e62c78ca778a288262a","blockSize":4194304,"blocks":["13f9385ceac982cfa0105eef4f6a3c2ec0af7c06034a6e62c78ca778a288262a"]},"offset":"12243621"},"SpanOptions.js":{"size":722,"integrity":{"algorithm":"SHA256","hash":"94c79e7a52cb76f5be01e6c1893aef8a9255adaf0d6e56daad04ca6ca21e2a5d","blockSize":4194304,"blocks":["94c79e7a52cb76f5be01e6c1893aef8a9255adaf0d6e56daad04ca6ca21e2a5d"]},"offset":"12245214"},"attributes.js":{"size":721,"integrity":{"algorithm":"SHA256","hash":"9963a560bfc91476273df1baa7a44b65a8798f900f65b56515613ce68430050f","blockSize":4194304,"blocks":["9963a560bfc91476273df1baa7a44b65a8798f900f65b56515613ce68430050f"]},"offset":"12245936"},"context-utils.js":{"size":2309,"integrity":{"algorithm":"SHA256","hash":"00d9132fa1e9dfff2be71d9c8078a5b8dfb9e8db4dc0fcead5ca85e077683ab4","blockSize":4194304,"blocks":["00d9132fa1e9dfff2be71d9c8078a5b8dfb9e8db4dc0fcead5ca85e077683ab4"]},"offset":"12246657"},"invalid-span-constants.js":{"size":1133,"integrity":{"algorithm":"SHA256","hash":"bdd0be5944ba3cdaa2423b69a59c5e3123e52d5a27ca9b79656fe295b8e37881","blockSize":4194304,"blocks":["bdd0be5944ba3cdaa2423b69a59c5e3123e52d5a27ca9b79656fe295b8e37881"]},"offset":"12248966"},"link.js":{"size":715,"integrity":{"algorithm":"SHA256","hash":"b0bf23b43c813ae28d41bb20724adc2364e3f5d917105f4c6e25900d29d96074","blockSize":4194304,"blocks":["b0bf23b43c813ae28d41bb20724adc2364e3f5d917105f4c6e25900d29d96074"]},"offset":"12250099"},"span.js":{"size":715,"integrity":{"algorithm":"SHA256","hash":"0064bc6dce4f68fbc485743567891a09164cc89a6989048c1c593780997aff31","blockSize":4194304,"blocks":["0064bc6dce4f68fbc485743567891a09164cc89a6989048c1c593780997aff31"]},"offset":"12250814"},"span_context.js":{"size":723,"integrity":{"algorithm":"SHA256","hash":"d8b550a03936dff4608b33a9be31e7d15df3e35cde80a2c9842af08752eb889c","blockSize":4194304,"blocks":["d8b550a03936dff4608b33a9be31e7d15df3e35cde80a2c9842af08752eb889c"]},"offset":"12251529"},"span_kind.js":{"size":1872,"integrity":{"algorithm":"SHA256","hash":"4a308dc470a75540cdec5ccfd89828093f532f42f99b1c131468777e3e20dce4","blockSize":4194304,"blocks":["4a308dc470a75540cdec5ccfd89828093f532f42f99b1c131468777e3e20dce4"]},"offset":"12252252"},"spancontext-utils.js":{"size":2059,"integrity":{"algorithm":"SHA256","hash":"ad4d1c9234b0a78afb6d7b0012296f34b8e17dbb38627a84b2a4e47b909fa969","blockSize":4194304,"blocks":["ad4d1c9234b0a78afb6d7b0012296f34b8e17dbb38627a84b2a4e47b909fa969"]},"offset":"12254124"},"status.js":{"size":719,"integrity":{"algorithm":"SHA256","hash":"65db2afde03838db470762c5915760176c72071727a0b4fa26ba250b7eaa45b7","blockSize":4194304,"blocks":["65db2afde03838db470762c5915760176c72071727a0b4fa26ba250b7eaa45b7"]},"offset":"12256183"},"trace_flags.js":{"size":1066,"integrity":{"algorithm":"SHA256","hash":"9db31c2c73ae9382801951163e999aefc85ee20fa111178cce85368f246f4f99","blockSize":4194304,"blocks":["9db31c2c73ae9382801951163e999aefc85ee20fa111178cce85368f246f4f99"]},"offset":"12256902"},"trace_state.js":{"size":722,"integrity":{"algorithm":"SHA256","hash":"7370557a3438ceed1e0040d75ed275c3a9b60d1e2634e2a4481bdf74e61165cf","blockSize":4194304,"blocks":["7370557a3438ceed1e0040d75ed275c3a9b60d1e2634e2a4481bdf74e61165cf"]},"offset":"12257968"},"tracer.js":{"size":717,"integrity":{"algorithm":"SHA256","hash":"8f4fd19e26db805c1b75228e3e6404086640ac00393d4fbfab6b412b93f123f8","blockSize":4194304,"blocks":["8f4fd19e26db805c1b75228e3e6404086640ac00393d4fbfab6b412b93f123f8"]},"offset":"12258690"},"tracer_options.js":{"size":725,"integrity":{"algorithm":"SHA256","hash":"032c45d1f3a3be929130ef18e5aae014918201b94e052ae48f2536bd2afcb32c","blockSize":4194304,"blocks":["032c45d1f3a3be929130ef18e5aae014918201b94e052ae48f2536bd2afcb32c"]},"offset":"12259407"},"tracer_provider.js":{"size":726,"integrity":{"algorithm":"SHA256","hash":"bf631e565e7ed95910cd38cf164ac932b8d2b225f2457883fa1e22054a37f1f2","blockSize":4194304,"blocks":["bf631e565e7ed95910cd38cf164ac932b8d2b225f2457883fa1e22054a37f1f2"]},"offset":"12260132"},"internal":{"files":{"tracestate-impl.js":{"size":4321,"integrity":{"algorithm":"SHA256","hash":"444160ff7fc1dd0f86b265afc8511769616544fdf4f78ec59d47bab99b28f631","blockSize":4194304,"blocks":["444160ff7fc1dd0f86b265afc8511769616544fdf4f78ec59d47bab99b28f631"]},"offset":"12260858"},"tracestate-validators.js":{"size":2040,"integrity":{"algorithm":"SHA256","hash":"3b726bdb11b0e13d0884d4dcde635e76919b8f007d2ab0dac00619296766bf87","blockSize":4194304,"blocks":["3b726bdb11b0e13d0884d4dcde635e76919b8f007d2ab0dac00619296766bf87"]},"offset":"12265179"},"utils.js":{"size":959,"integrity":{"algorithm":"SHA256","hash":"17eca606af167f1bcc004465d684bcac23c51c8a951d68a4078eb3dc8c737705","blockSize":4194304,"blocks":["17eca606af167f1bcc004465d684bcac23c51c8a951d68a4078eb3dc8c737705"]},"offset":"12267219"}}}}},"propagation":{"files":{"NoopTextMapPropagator.js":{"size":1426,"integrity":{"algorithm":"SHA256","hash":"b12b3fb00bc0582fcfdfd53930c5bddc4831e2193f46a436ff98ae2b474c3811","blockSize":4194304,"blocks":["b12b3fb00bc0582fcfdfd53930c5bddc4831e2193f46a436ff98ae2b474c3811"]},"offset":"12268178"},"TextMapPropagator.js":{"size":1291,"integrity":{"algorithm":"SHA256","hash":"0b845b5b5b590ebb10707e06f56b6b95e2369580b43d50e7d2700988c3f510fd","blockSize":4194304,"blocks":["0b845b5b5b590ebb10707e06f56b6b95e2369580b43d50e7d2700988c3f510fd"]},"offset":"12269604"}}},"platform":{"files":{"index.js":{"size":1270,"integrity":{"algorithm":"SHA256","hash":"36f3ce2a51c241c60338df64df0264d8fa31d51312b017190a1ac4af13f6c250","blockSize":4194304,"blocks":["36f3ce2a51c241c60338df64df0264d8fa31d51312b017190a1ac4af13f6c250"]},"offset":"12270895"},"node":{"files":{"globalThis.js":{"size":961,"integrity":{"algorithm":"SHA256","hash":"38b0e0c784bf051f6208bd69013054c53594a820e5c49a78e64b897dd6dce779","blockSize":4194304,"blocks":["38b0e0c784bf051f6208bd69013054c53594a820e5c49a78e64b897dd6dce779"]},"offset":"12272165"},"index.js":{"size":1276,"integrity":{"algorithm":"SHA256","hash":"c417d9c63ea24ed0852bf32c5cc97f575af8a50b72f6278a159076f1331accc0","blockSize":4194304,"blocks":["c417d9c63ea24ed0852bf32c5cc97f575af8a50b72f6278a159076f1331accc0"]},"offset":"12273126"}}},"browser":{"files":{"globalThis.js":{"size":1472,"integrity":{"algorithm":"SHA256","hash":"53215d090732c3d722040b28833753a31f0f0534404dae71e1fffa01f398a5c4","blockSize":4194304,"blocks":["53215d090732c3d722040b28833753a31f0f0534404dae71e1fffa01f398a5c4"]},"offset":"12274402"},"index.js":{"size":1276,"integrity":{"algorithm":"SHA256","hash":"c417d9c63ea24ed0852bf32c5cc97f575af8a50b72f6278a159076f1331accc0","blockSize":4194304,"blocks":["c417d9c63ea24ed0852bf32c5cc97f575af8a50b72f6278a159076f1331accc0"]},"offset":"12275874"}}}}},"internal":{"files":{"global-utils.js":{"size":2810,"integrity":{"algorithm":"SHA256","hash":"096b953c7c1e5594e32f843d77032d373d16f45bd164bde52f07d9e5a41d6eff","blockSize":4194304,"blocks":["096b953c7c1e5594e32f843d77032d373d16f45bd164bde52f07d9e5a41d6eff"]},"offset":"12277150"},"semver.js":{"size":5209,"integrity":{"algorithm":"SHA256","hash":"e4e724c6c6bdeacf0aecdb1365fd474bb1ccb5ee03773023415adb098c9207a4","blockSize":4194304,"blocks":["e4e724c6c6bdeacf0aecdb1365fd474bb1ccb5ee03773023415adb098c9207a4"]},"offset":"12279960"}}},"diag":{"files":{"ComponentLogger.js":{"size":2975,"integrity":{"algorithm":"SHA256","hash":"011cf2a3f4479ba4aa4da7ba6505321b45c71cdfc54804cbbad05a2e6f5803c0","blockSize":4194304,"blocks":["011cf2a3f4479ba4aa4da7ba6505321b45c71cdfc54804cbbad05a2e6f5803c0"]},"offset":"12285169"},"consoleLogger.js":{"size":2443,"integrity":{"algorithm":"SHA256","hash":"82e365251f4f8538499c179367f8b9c7c8c3f1bf25fc730bdab595d3b7254c6a","blockSize":4194304,"blocks":["82e365251f4f8538499c179367f8b9c7c8c3f1bf25fc730bdab595d3b7254c6a"]},"offset":"12288144"},"index.js":{"size":1322,"integrity":{"algorithm":"SHA256","hash":"7c33193a415ac5606cc8df4585539d4b559a246a9f8cdb157436aac545cdc378","blockSize":4194304,"blocks":["7c33193a415ac5606cc8df4585539d4b559a246a9f8cdb157436aac545cdc378"]},"offset":"12290587"},"types.js":{"size":2002,"integrity":{"algorithm":"SHA256","hash":"df00d0e6fba534385b34a48554a217e92f75e974c078118a9597c9daa951ea6f","blockSize":4194304,"blocks":["df00d0e6fba534385b34a48554a217e92f75e974c078118a9597c9daa951ea6f"]},"offset":"12291909"},"internal":{"files":{"logLevelLogger.js":{"size":1787,"integrity":{"algorithm":"SHA256","hash":"8dd1fe35b60a93c6cb8dc0780919b16e913c4ff46734ca9d70e450620d879d2f","blockSize":4194304,"blocks":["8dd1fe35b60a93c6cb8dc0780919b16e913c4ff46734ca9d70e450620d879d2f"]},"offset":"12293911"},"noopLogger.js":{"size":1195,"integrity":{"algorithm":"SHA256","hash":"204390838d8c90fb46fbef5d18e1585639c903ab74372b00e56b349945bdd391","blockSize":4194304,"blocks":["204390838d8c90fb46fbef5d18e1585639c903ab74372b00e56b349945bdd391"]},"offset":"12295698"}}}}},"context":{"files":{"NoopContextManager.js":{"size":1824,"integrity":{"algorithm":"SHA256","hash":"bff07dc006bf50a34cbf0ff1e3ff121c653e7e8bc6228a0e71ed317c8982efa3","blockSize":4194304,"blocks":["bff07dc006bf50a34cbf0ff1e3ff121c653e7e8bc6228a0e71ed317c8982efa3"]},"offset":"12296893"},"context.js":{"size":2393,"integrity":{"algorithm":"SHA256","hash":"c4bffb792f4d2835a8dfece938c08326d39a445dfda96f9055b621335f160d14","blockSize":4194304,"blocks":["c4bffb792f4d2835a8dfece938c08326d39a445dfda96f9055b621335f160d14"]},"offset":"12298717"},"types.js":{"size":716,"integrity":{"algorithm":"SHA256","hash":"ee614d6b416c290cc43948a91658e935363e73ef0db9718b03889e3b99498069","blockSize":4194304,"blocks":["ee614d6b416c290cc43948a91658e935363e73ef0db9718b03889e3b99498069"]},"offset":"12301110"}}},"common":{"files":{"Attributes.js":{"size":721,"integrity":{"algorithm":"SHA256","hash":"f88dfac578effa23799302cfe4902e7c7c6c87242b9302acef3f69bcd02e2cbf","blockSize":4194304,"blocks":["f88dfac578effa23799302cfe4902e7c7c6c87242b9302acef3f69bcd02e2cbf"]},"offset":"12301826"},"Exception.js":{"size":720,"integrity":{"algorithm":"SHA256","hash":"59fb4d19dd7dc0e7bfa3acb645c172e9cd34e04fac31321818010a9cfa6301aa","blockSize":4194304,"blocks":["59fb4d19dd7dc0e7bfa3acb645c172e9cd34e04fac31321818010a9cfa6301aa"]},"offset":"12302547"},"Time.js":{"size":109,"integrity":{"algorithm":"SHA256","hash":"e2157896fecba1e46d93d9a5f48381895fda563ee6ef3fc02d74ef1f06eb4d2b","blockSize":4194304,"blocks":["e2157896fecba1e46d93d9a5f48381895fda563ee6ef3fc02d74ef1f06eb4d2b"]},"offset":"12303267"}}},"baggage":{"files":{"context-helpers.js":{"size":1791,"integrity":{"algorithm":"SHA256","hash":"1671aeabe1b40f6947c02f78fb7a2bfe5736f05d49c88d2b1c84d301a27a001e","blockSize":4194304,"blocks":["1671aeabe1b40f6947c02f78fb7a2bfe5736f05d49c88d2b1c84d301a27a001e"]},"offset":"12303376"},"types.js":{"size":716,"integrity":{"algorithm":"SHA256","hash":"ee614d6b416c290cc43948a91658e935363e73ef0db9718b03889e3b99498069","blockSize":4194304,"blocks":["ee614d6b416c290cc43948a91658e935363e73ef0db9718b03889e3b99498069"]},"offset":"12305167"},"utils.js":{"size":1893,"integrity":{"algorithm":"SHA256","hash":"1451951640e0189254552ee580f760c90ca883e11f5ef8aba4766c943f66988e","blockSize":4194304,"blocks":["1451951640e0189254552ee580f760c90ca883e11f5ef8aba4766c943f66988e"]},"offset":"12305883"},"internal":{"files":{"baggage-impl.js":{"size":2296,"integrity":{"algorithm":"SHA256","hash":"23463191b1d59bfed3bcd1d9bdf66d074f6bbbc240622107d9f0efecd93fdaff","blockSize":4194304,"blocks":["23463191b1d59bfed3bcd1d9bdf66d074f6bbbc240622107d9f0efecd93fdaff"]},"offset":"12307776"},"symbol.js":{"size":898,"integrity":{"algorithm":"SHA256","hash":"f6905f24a01f83fa2da782a93a3373552e9afb6b160ca8bf34e2b0e0b863a944","blockSize":4194304,"blocks":["f6905f24a01f83fa2da782a93a3373552e9afb6b160ca8bf34e2b0e0b863a944"]},"offset":"12310072"}}}}},"api":{"files":{"context.js":{"size":3651,"integrity":{"algorithm":"SHA256","hash":"3ff0e62e5ed14289f80c4b39a61634a56da6d11e56e877545c20797c793e51a8","blockSize":4194304,"blocks":["3ff0e62e5ed14289f80c4b39a61634a56da6d11e56e877545c20797c793e51a8"]},"offset":"12310970"},"diag.js":{"size":4019,"integrity":{"algorithm":"SHA256","hash":"e1bffa35c7882a333f4b3f2bc5c8a9049c7473a990768553b5c162a45dd4f83c","blockSize":4194304,"blocks":["e1bffa35c7882a333f4b3f2bc5c8a9049c7473a990768553b5c162a45dd4f83c"]},"offset":"12314621"},"propagation.js":{"size":3907,"integrity":{"algorithm":"SHA256","hash":"2002b280314e75138e10c4cc241982b0218a05d5285c9a3fd61023f4213ca27a","blockSize":4194304,"blocks":["2002b280314e75138e10c4cc241982b0218a05d5285c9a3fd61023f4213ca27a"]},"offset":"12318640"},"trace.js":{"size":3226,"integrity":{"algorithm":"SHA256","hash":"e47538697d98149be0ed50d7057e2f53b527d1ecb0523dd7370a36b3b00d6107","blockSize":4194304,"blocks":["e47538697d98149be0ed50d7057e2f53b527d1ecb0523dd7370a36b3b00d6107"]},"offset":"12322547"}}}}},"esm":{"files":{"index.js":{"size":2639,"integrity":{"algorithm":"SHA256","hash":"0b6741bdda18f18b29e4bc89fe588ae8f3a8dfc51169093592fca1fb26b2ebba","blockSize":4194304,"blocks":["0b6741bdda18f18b29e4bc89fe588ae8f3a8dfc51169093592fca1fb26b2ebba"]},"offset":"12325773"},"version.js":{"size":732,"integrity":{"algorithm":"SHA256","hash":"29e4826f2aa25c8af0d48ee8e1da44e07da576502c12117c261e31e17b455185","blockSize":4194304,"blocks":["29e4826f2aa25c8af0d48ee8e1da44e07da576502c12117c261e31e17b455185"]},"offset":"12328412"},"trace":{"files":{"NonRecordingSpan.js":{"size":2307,"integrity":{"algorithm":"SHA256","hash":"ada5d8cc896bb85326eb4a77471d014c2be116f2a82e3c6be0949a6a259b28bf","blockSize":4194304,"blocks":["ada5d8cc896bb85326eb4a77471d014c2be116f2a82e3c6be0949a6a259b28bf"]},"offset":"12329144"},"NoopTracer.js":{"size":2688,"integrity":{"algorithm":"SHA256","hash":"e1c58ed641901b5dd2381a977b1bd5fd4b79f05765326c52a85c99175c215004","blockSize":4194304,"blocks":["e1c58ed641901b5dd2381a977b1bd5fd4b79f05765326c52a85c99175c215004"]},"offset":"12331451"},"NoopTracerProvider.js":{"size":1140,"integrity":{"algorithm":"SHA256","hash":"4cda8cb44ae55f9bf92f7b48b57ab5968ff9511016ce06c0788546d4478807ba","blockSize":4194304,"blocks":["4cda8cb44ae55f9bf92f7b48b57ab5968ff9511016ce06c0788546d4478807ba"]},"offset":"12334139"},"ProxyTracer.js":{"size":1946,"integrity":{"algorithm":"SHA256","hash":"0fc47b17289d37ef1db28e096ba2462a1dedcbe5273312770363fb625fe7cd5e","blockSize":4194304,"blocks":["0fc47b17289d37ef1db28e096ba2462a1dedcbe5273312770363fb625fe7cd5e"]},"offset":"12335279"},"ProxyTracerProvider.js":{"size":2195,"integrity":{"algorithm":"SHA256","hash":"e0a6fdee077b66f17acda3d81ce689f9843d5ba7febcc240ed3a1bd6a5ddbb6e","blockSize":4194304,"blocks":["e0a6fdee077b66f17acda3d81ce689f9843d5ba7febcc240ed3a1bd6a5ddbb6e"]},"offset":"12337225"},"Sampler.js":{"size":652,"integrity":{"algorithm":"SHA256","hash":"10e6484e4acd8e0044f45c93da13b0c78da4eef4a13f542e6be356750da4a1de","blockSize":4194304,"blocks":["10e6484e4acd8e0044f45c93da13b0c78da4eef4a13f542e6be356750da4a1de"]},"offset":"12339420"},"SamplingResult.js":{"size":1453,"integrity":{"algorithm":"SHA256","hash":"f4e4801e760e65bc8e41947257b807ca7596e2dc0fcd25f0eac4739604cc784c","blockSize":4194304,"blocks":["f4e4801e760e65bc8e41947257b807ca7596e2dc0fcd25f0eac4739604cc784c"]},"offset":"12340072"},"SpanOptions.js":{"size":656,"integrity":{"algorithm":"SHA256","hash":"d2100971f22b66a9c7cacc878817438091cd911b841ac737968851033f15cbc4","blockSize":4194304,"blocks":["d2100971f22b66a9c7cacc878817438091cd911b841ac737968851033f15cbc4"]},"offset":"12341525"},"attributes.js":{"size":655,"integrity":{"algorithm":"SHA256","hash":"4c676279b1566f2b5a2dd6a1b3ccf3df7a862ede942744b70d316df7d89df61b","blockSize":4194304,"blocks":["4c676279b1566f2b5a2dd6a1b3ccf3df7a862ede942744b70d316df7d89df61b"]},"offset":"12342181"},"context-utils.js":{"size":1961,"integrity":{"algorithm":"SHA256","hash":"4aae31abda48083b909655f1a927b6a9b90589bc1da9b08cda19eb78ac73be42","blockSize":4194304,"blocks":["4aae31abda48083b909655f1a927b6a9b90589bc1da9b08cda19eb78ac73be42"]},"offset":"12342836"},"invalid-span-constants.js":{"size":943,"integrity":{"algorithm":"SHA256","hash":"087fdeb366e4d0aab0494883604d845e72741958c8502bffb949edd1ef6d417f","blockSize":4194304,"blocks":["087fdeb366e4d0aab0494883604d845e72741958c8502bffb949edd1ef6d417f"]},"offset":"12344797"},"link.js":{"size":649,"integrity":{"algorithm":"SHA256","hash":"119d8314dd75d0ec398f293f06e853fb0c596d3607e753e91b981ca483970e3e","blockSize":4194304,"blocks":["119d8314dd75d0ec398f293f06e853fb0c596d3607e753e91b981ca483970e3e"]},"offset":"12345740"},"span.js":{"size":649,"integrity":{"algorithm":"SHA256","hash":"857deb465bf2eeb10e3f7fae6093051be15b666b58c6a0638fc987bf72c159d5","blockSize":4194304,"blocks":["857deb465bf2eeb10e3f7fae6093051be15b666b58c6a0638fc987bf72c159d5"]},"offset":"12346389"},"span_context.js":{"size":657,"integrity":{"algorithm":"SHA256","hash":"b65f178bf620e373c72d4588eed78866591dd85c18092bd40c38d3cb9d340ef5","blockSize":4194304,"blocks":["b65f178bf620e373c72d4588eed78866591dd85c18092bd40c38d3cb9d340ef5"]},"offset":"12347038"},"span_kind.js":{"size":1748,"integrity":{"algorithm":"SHA256","hash":"47c31acd49aaa39ed13c86d256edd2cf7caedfd6e5c17ae09d2dd14048a17191","blockSize":4194304,"blocks":["47c31acd49aaa39ed13c86d256edd2cf7caedfd6e5c17ae09d2dd14048a17191"]},"offset":"12347695"},"spancontext-utils.js":{"size":1664,"integrity":{"algorithm":"SHA256","hash":"cb55af41c044e226e0a3fbe2098946e29315c9773f7b55c136abce0445667c62","blockSize":4194304,"blocks":["cb55af41c044e226e0a3fbe2098946e29315c9773f7b55c136abce0445667c62"]},"offset":"12349443"},"status.js":{"size":583,"integrity":{"algorithm":"SHA256","hash":"c371b220c3eea0025d36ae781612c25b80bed537d1931ddc5588479b7e260bd3","blockSize":4194304,"blocks":["c371b220c3eea0025d36ae781612c25b80bed537d1931ddc5588479b7e260bd3"]},"offset":"12351107"},"trace_flags.js":{"size":938,"integrity":{"algorithm":"SHA256","hash":"16f1dac75d404f90d5b8ae7636c50bdf4adc52ee251b11211197f1d275605ca5","blockSize":4194304,"blocks":["16f1dac75d404f90d5b8ae7636c50bdf4adc52ee251b11211197f1d275605ca5"]},"offset":"12351690"},"trace_state.js":{"size":656,"integrity":{"algorithm":"SHA256","hash":"62206dc6f030396ac4446a4da0f7f18694273781fc9598b3192af7eb8ee42ab8","blockSize":4194304,"blocks":["62206dc6f030396ac4446a4da0f7f18694273781fc9598b3192af7eb8ee42ab8"]},"offset":"12352628"},"tracer.js":{"size":651,"integrity":{"algorithm":"SHA256","hash":"1374a1ec603cd57b3733310eb4792550a453b32e42b29390bc55465af4793f34","blockSize":4194304,"blocks":["1374a1ec603cd57b3733310eb4792550a453b32e42b29390bc55465af4793f34"]},"offset":"12353284"},"tracer_options.js":{"size":659,"integrity":{"algorithm":"SHA256","hash":"5306dc635ca30b0ebc2afada134eacc9dda79efb3b89b0512762b19860ae0389","blockSize":4194304,"blocks":["5306dc635ca30b0ebc2afada134eacc9dda79efb3b89b0512762b19860ae0389"]},"offset":"12353935"},"tracer_provider.js":{"size":660,"integrity":{"algorithm":"SHA256","hash":"1389fb62df8c0edf487147346829fca91d8f1237f9add29e6bac5c1c2d4260a8","blockSize":4194304,"blocks":["1389fb62df8c0edf487147346829fca91d8f1237f9add29e6bac5c1c2d4260a8"]},"offset":"12354594"},"internal":{"files":{"tracestate-impl.js":{"size":4153,"integrity":{"algorithm":"SHA256","hash":"e51bd1ed863d584d37087fd8b096ea8658dd916ccd9e5c9bdfb669ac0a267fb3","blockSize":4194304,"blocks":["e51bd1ed863d584d37087fd8b096ea8658dd916ccd9e5c9bdfb669ac0a267fb3"]},"offset":"12355254"},"tracestate-validators.js":{"size":1849,"integrity":{"algorithm":"SHA256","hash":"df058faec64fdb53b0b5cdbb433859575ee8795418b6c8bb693a6659e202a4de","blockSize":4194304,"blocks":["df058faec64fdb53b0b5cdbb433859575ee8795418b6c8bb693a6659e202a4de"]},"offset":"12359407"},"utils.js":{"size":789,"integrity":{"algorithm":"SHA256","hash":"2b60bde7752cad81a78d64a5e94f92a1b0cf823b5c927c8daa8b1d84d7779f5c","blockSize":4194304,"blocks":["2b60bde7752cad81a78d64a5e94f92a1b0cf823b5c927c8daa8b1d84d7779f5c"]},"offset":"12361256"}}}}},"propagation":{"files":{"NoopTextMapPropagator.js":{"size":1288,"integrity":{"algorithm":"SHA256","hash":"b2289118bb5f96ab6c3f6d6a7296b7f7a31b9652dde678558e7cecc6cd1a045f","blockSize":4194304,"blocks":["b2289118bb5f96ab6c3f6d6a7296b7f7a31b9652dde678558e7cecc6cd1a045f"]},"offset":"12362045"},"TextMapPropagator.js":{"size":1150,"integrity":{"algorithm":"SHA256","hash":"bf03e6977be1023a1bfb627110519970425efadc39ee2611b26c54f6d8dad745","blockSize":4194304,"blocks":["bf03e6977be1023a1bfb627110519970425efadc39ee2611b26c54f6d8dad745"]},"offset":"12363333"}}},"platform":{"files":{"index.js":{"size":663,"integrity":{"algorithm":"SHA256","hash":"267c0bf48356e8014cb453a8a086a857dc1340f78fa1160cb1daf35db0f9ad80","blockSize":4194304,"blocks":["267c0bf48356e8014cb453a8a086a857dc1340f78fa1160cb1daf35db0f9ad80"]},"offset":"12364483"},"node":{"files":{"globalThis.js":{"size":857,"integrity":{"algorithm":"SHA256","hash":"cf39f67e96753617891aa8d03ae15877dea433ea913fbe075b3314f99e7c14fc","blockSize":4194304,"blocks":["cf39f67e96753617891aa8d03ae15877dea433ea913fbe075b3314f99e7c14fc"]},"offset":"12365146"},"index.js":{"size":669,"integrity":{"algorithm":"SHA256","hash":"aad2cc309fa73ecf321664b15c1589879e8a3784561607facaca7ee2154e2411","blockSize":4194304,"blocks":["aad2cc309fa73ecf321664b15c1589879e8a3784561607facaca7ee2154e2411"]},"offset":"12366003"}}},"browser":{"files":{"globalThis.js":{"size":1368,"integrity":{"algorithm":"SHA256","hash":"49011f8bce6f1e82cb9c85c7de3f0350b5fa5d5b4526943aaf053fefebde7c08","blockSize":4194304,"blocks":["49011f8bce6f1e82cb9c85c7de3f0350b5fa5d5b4526943aaf053fefebde7c08"]},"offset":"12366672"},"index.js":{"size":669,"integrity":{"algorithm":"SHA256","hash":"aad2cc309fa73ecf321664b15c1589879e8a3784561607facaca7ee2154e2411","blockSize":4194304,"blocks":["aad2cc309fa73ecf321664b15c1589879e8a3784561607facaca7ee2154e2411"]},"offset":"12368040"}}}}},"internal":{"files":{"global-utils.js":{"size":2493,"integrity":{"algorithm":"SHA256","hash":"8bd7d05cca6be7dddd067ca2e65bd1104b2b3324e88f38a4af50ea3c790e0031","blockSize":4194304,"blocks":["8bd7d05cca6be7dddd067ca2e65bd1104b2b3324e88f38a4af50ea3c790e0031"]},"offset":"12368709"},"semver.js":{"size":5007,"integrity":{"algorithm":"SHA256","hash":"eaecf7120a7b9be0dec2e45c8263e045382e240e56a9d35f373a1f498b9f6105","blockSize":4194304,"blocks":["eaecf7120a7b9be0dec2e45c8263e045382e240e56a9d35f373a1f498b9f6105"]},"offset":"12371202"}}},"diag":{"files":{"ComponentLogger.js":{"size":2822,"integrity":{"algorithm":"SHA256","hash":"edb0f961602704a68fe0cbe396cdcb93760e82a2f6da15da2518452306b01ad1","blockSize":4194304,"blocks":["edb0f961602704a68fe0cbe396cdcb93760e82a2f6da15da2518452306b01ad1"]},"offset":"12376209"},"consoleLogger.js":{"size":2313,"integrity":{"algorithm":"SHA256","hash":"b7f2c77fc8320a62ff6f1a17baccbf80fa8393c198850dc4153f1f873f44a65d","blockSize":4194304,"blocks":["b7f2c77fc8320a62ff6f1a17baccbf80fa8393c198850dc4153f1f873f44a65d"]},"offset":"12379031"},"index.js":{"size":697,"integrity":{"algorithm":"SHA256","hash":"9ab064fafb899c2ad60a721788ab859063507f3f459de55246fc39cccd3ba9d6","blockSize":4194304,"blocks":["9ab064fafb899c2ad60a721788ab859063507f3f459de55246fc39cccd3ba9d6"]},"offset":"12381344"},"types.js":{"size":1870,"integrity":{"algorithm":"SHA256","hash":"b0fa07b774602b020c46d2cefad9883fbcda6586e6b4a625e6fd85e61694f85a","blockSize":4194304,"blocks":["b0fa07b774602b020c46d2cefad9883fbcda6586e6b4a625e6fd85e61694f85a"]},"offset":"12382041"},"internal":{"files":{"logLevelLogger.js":{"size":1547,"integrity":{"algorithm":"SHA256","hash":"d6fbfb24cd7c2f3b7586188a35b1238fac74ee8b12483f201e1876e1a6af77b2","blockSize":4194304,"blocks":["d6fbfb24cd7c2f3b7586188a35b1238fac74ee8b12483f201e1876e1a6af77b2"]},"offset":"12383911"},"noopLogger.js":{"size":1033,"integrity":{"algorithm":"SHA256","hash":"400db350874886c0aef450262515157e32e0eecf0677616af6992f90a29693e7","blockSize":4194304,"blocks":["400db350874886c0aef450262515157e32e0eecf0677616af6992f90a29693e7"]},"offset":"12385458"}}}}},"context":{"files":{"NoopContextManager.js":{"size":1686,"integrity":{"algorithm":"SHA256","hash":"1524a706d181b07a5d9a1c241ec73a6e0cd9484ea768c6c03be7e65daf4dbd7d","blockSize":4194304,"blocks":["1524a706d181b07a5d9a1c241ec73a6e0cd9484ea768c6c03be7e65daf4dbd7d"]},"offset":"12386491"},"context.js":{"size":2223,"integrity":{"algorithm":"SHA256","hash":"5f9bfac959cdc05f99268ec18b69908e2e53fe8b91242b7bda55890b82f3f154","blockSize":4194304,"blocks":["5f9bfac959cdc05f99268ec18b69908e2e53fe8b91242b7bda55890b82f3f154"]},"offset":"12388177"},"types.js":{"size":650,"integrity":{"algorithm":"SHA256","hash":"6e4e11aed3fcaeaa5206afa222a1d42e6625487ab43ee99d44a56f0e40899a2c","blockSize":4194304,"blocks":["6e4e11aed3fcaeaa5206afa222a1d42e6625487ab43ee99d44a56f0e40899a2c"]},"offset":"12390400"}}},"common":{"files":{"Attributes.js":{"size":655,"integrity":{"algorithm":"SHA256","hash":"14ced781eb7eec482d58300b6d5ce938a02dc5a8dc284512bd4c68795e47855f","blockSize":4194304,"blocks":["14ced781eb7eec482d58300b6d5ce938a02dc5a8dc284512bd4c68795e47855f"]},"offset":"12391050"},"Exception.js":{"size":654,"integrity":{"algorithm":"SHA256","hash":"fe9300942a7ec42137c2adbe145520f3a6473e035bed78dd1741dc931879bdc5","blockSize":4194304,"blocks":["fe9300942a7ec42137c2adbe145520f3a6473e035bed78dd1741dc931879bdc5"]},"offset":"12391705"},"Time.js":{"size":43,"integrity":{"algorithm":"SHA256","hash":"cf6b3999833aaf5ad913dfdfd40ce411bd60ccf86bc164af6d71fa2ed4c1c9c7","blockSize":4194304,"blocks":["cf6b3999833aaf5ad913dfdfd40ce411bd60ccf86bc164af6d71fa2ed4c1c9c7"]},"offset":"12392359"}}},"baggage":{"files":{"context-helpers.js":{"size":1554,"integrity":{"algorithm":"SHA256","hash":"64f782e9f5ca1c2b881215465959907ccbf96f6176f5a0d532ca44aaa6394b31","blockSize":4194304,"blocks":["64f782e9f5ca1c2b881215465959907ccbf96f6176f5a0d532ca44aaa6394b31"]},"offset":"12392402"},"types.js":{"size":650,"integrity":{"algorithm":"SHA256","hash":"6e4e11aed3fcaeaa5206afa222a1d42e6625487ab43ee99d44a56f0e40899a2c","blockSize":4194304,"blocks":["6e4e11aed3fcaeaa5206afa222a1d42e6625487ab43ee99d44a56f0e40899a2c"]},"offset":"12393956"},"utils.js":{"size":1633,"integrity":{"algorithm":"SHA256","hash":"ed25696431e16186ab82dff1e6989f2082828df4a9f4edf4a73fbae760d865fe","blockSize":4194304,"blocks":["ed25696431e16186ab82dff1e6989f2082828df4a9f4edf4a73fbae760d865fe"]},"offset":"12394606"},"internal":{"files":{"baggage-impl.js":{"size":2178,"integrity":{"algorithm":"SHA256","hash":"6ff40d661258f29df0b3a038609268f986b5fd1f56db0d4b3dd3d1e6b7449983","blockSize":4194304,"blocks":["6ff40d661258f29df0b3a038609268f986b5fd1f56db0d4b3dd3d1e6b7449983"]},"offset":"12396239"},"symbol.js":{"size":779,"integrity":{"algorithm":"SHA256","hash":"e96f26787ef4eecdc80afed3d52c6180a73ac7aa15a90a87e56e8fbf8bc9c839","blockSize":4194304,"blocks":["e96f26787ef4eecdc80afed3d52c6180a73ac7aa15a90a87e56e8fbf8bc9c839"]},"offset":"12398417"}}}}},"api":{"files":{"context.js":{"size":3487,"integrity":{"algorithm":"SHA256","hash":"c1cc34e08e1f4863121041684a820bce0e3a716765d2370fd3c0e430f30fa96f","blockSize":4194304,"blocks":["c1cc34e08e1f4863121041684a820bce0e3a716765d2370fd3c0e430f30fa96f"]},"offset":"12399196"},"diag.js":{"size":3856,"integrity":{"algorithm":"SHA256","hash":"080480fbe728a518ae80dadd38fe532e2c47fcccd4867c72373a3f020d28b9c5","blockSize":4194304,"blocks":["080480fbe728a518ae80dadd38fe532e2c47fcccd4867c72373a3f020d28b9c5"]},"offset":"12402683"},"propagation.js":{"size":3684,"integrity":{"algorithm":"SHA256","hash":"00767b9a00df1867568a692675d009b4a758d0e94e9685403b772edd6e59d35c","blockSize":4194304,"blocks":["00767b9a00df1867568a692675d009b4a758d0e94e9685403b772edd6e59d35c"]},"offset":"12406539"},"trace.js":{"size":2988,"integrity":{"algorithm":"SHA256","hash":"54aa8203a2d2ce70d245d1316e96ba66c2887cc6089cb5805d88eb843d77600f","blockSize":4194304,"blocks":["54aa8203a2d2ce70d245d1316e96ba66c2887cc6089cb5805d88eb843d77600f"]},"offset":"12410223"}}}}}}}}}}},"@rushstack":{"files":{"ts-command-line":{"files":{"LICENSE":{"size":1122,"integrity":{"algorithm":"SHA256","hash":"12c0be55654d17aad92e4a2b6074f6eb0bf141b441e21bdbc16f72a17613188d","blockSize":4194304,"blocks":["12c0be55654d17aad92e4a2b6074f6eb0bf141b441e21bdbc16f72a17613188d"]},"offset":"12413211"},"package.json":{"size":714,"integrity":{"algorithm":"SHA256","hash":"fea6e466967e0c778a54c559b0108e3cfda01973405aa27182cb09339cca57c4","blockSize":4194304,"blocks":["fea6e466967e0c778a54c559b0108e3cfda01973405aa27182cb09339cca57c4"]},"offset":"12414333"},"lib":{"files":{"CommandLineHelper.js":{"size":746,"integrity":{"algorithm":"SHA256","hash":"add449090dae374025020a173e0e73d489ac719689c4bcb0cba1e500b6385f81","blockSize":4194304,"blocks":["add449090dae374025020a173e0e73d489ac719689c4bcb0cba1e500b6385f81"]},"offset":"12415047"},"Constants.js":{"size":362,"integrity":{"algorithm":"SHA256","hash":"7e12eee0e30659b8dee55d6aadf83f41f3ed85295705fa6ae739e2137361e8db","blockSize":4194304,"blocks":["7e12eee0e30659b8dee55d6aadf83f41f3ed85295705fa6ae739e2137361e8db"]},"offset":"12415793"},"index.js":{"size":5238,"integrity":{"algorithm":"SHA256","hash":"b913045ad825c24778ee31d8b4084420319d265b6c9922cf3af92930817a7501","blockSize":4194304,"blocks":["b913045ad825c24778ee31d8b4084420319d265b6c9922cf3af92930817a7501"]},"offset":"12416155"},"providers":{"files":{"CommandLineAction.js":{"size":2833,"integrity":{"algorithm":"SHA256","hash":"10943586e0e642a87b10a787f5b72ae50633a1935ffeb21e7aab7ac928d375c1","blockSize":4194304,"blocks":["10943586e0e642a87b10a787f5b72ae50633a1935ffeb21e7aab7ac928d375c1"]},"offset":"12421393"},"CommandLineParameterProvider.js":{"size":21058,"integrity":{"algorithm":"SHA256","hash":"e4dd79e27d53d239fa89693e2d0e963b962e888b140c7170d4918e1dbac0ff4e","blockSize":4194304,"blocks":["e4dd79e27d53d239fa89693e2d0e963b962e888b140c7170d4918e1dbac0ff4e"]},"offset":"12424226"},"CommandLineParser.js":{"size":9060,"integrity":{"algorithm":"SHA256","hash":"8e04e2ea5c8945f34e211a52beae9016739a429bf4d4ae46138c40e02811d07f","blockSize":4194304,"blocks":["8e04e2ea5c8945f34e211a52beae9016739a429bf4d4ae46138c40e02811d07f"]},"offset":"12445284"},"CommandLineParserExitError.js":{"size":2617,"integrity":{"algorithm":"SHA256","hash":"00f3a54eacd2a46b3837371b72e901f7002dc3083e4c4bd8df64a5eb373123ac","blockSize":4194304,"blocks":["00f3a54eacd2a46b3837371b72e901f7002dc3083e4c4bd8df64a5eb373123ac"]},"offset":"12454344"},"DynamicCommandLineAction.js":{"size":638,"integrity":{"algorithm":"SHA256","hash":"87de849f1d13fcf4acf9c67c81d388ea69e802648fe9b3bd8bc730784b743d25","blockSize":4194304,"blocks":["87de849f1d13fcf4acf9c67c81d388ea69e802648fe9b3bd8bc730784b743d25"]},"offset":"12456961"},"DynamicCommandLineParser.js":{"size":546,"integrity":{"algorithm":"SHA256","hash":"9879d7ae21514b8bcf41bf6400b9b47f91771fe8780124be3112139a1a0ee229","blockSize":4194304,"blocks":["9879d7ae21514b8bcf41bf6400b9b47f91771fe8780124be3112139a1a0ee229"]},"offset":"12457599"},"ScopedCommandLineAction.js":{"size":8424,"integrity":{"algorithm":"SHA256","hash":"5ec10bf62bc41192012dc1a5393eb31ad86ef0370d024108cff65913d6284199","blockSize":4194304,"blocks":["5ec10bf62bc41192012dc1a5393eb31ad86ef0370d024108cff65913d6284199"]},"offset":"12458145"},"TabCompletionAction.js":{"size":11337,"integrity":{"algorithm":"SHA256","hash":"8888da1217453e6a3f890699811c8cc42ed79b3e40f10341553f7f760ff180d6","blockSize":4194304,"blocks":["8888da1217453e6a3f890699811c8cc42ed79b3e40f10341553f7f760ff180d6"]},"offset":"12466569"}}},"parameters":{"files":{"BaseClasses.js":{"size":8645,"integrity":{"algorithm":"SHA256","hash":"3a1f3471f690e826968b197c7dcd49addba867d074531b5827301064f6830db1","blockSize":4194304,"blocks":["3a1f3471f690e826968b197c7dcd49addba867d074531b5827301064f6830db1"]},"offset":"12477906"},"CommandLineChoiceListParameter.js":{"size":3329,"integrity":{"algorithm":"SHA256","hash":"48e67db67e1efa8d4541d59b11ad15f2ff372c9cad21ceb648ccf1421130e95c","blockSize":4194304,"blocks":["48e67db67e1efa8d4541d59b11ad15f2ff372c9cad21ceb648ccf1421130e95c"]},"offset":"12486551"},"CommandLineChoiceParameter.js":{"size":3819,"integrity":{"algorithm":"SHA256","hash":"0b0ce69e6456e80e886e0cac98c8de7d6dcbd75ac53647c5500d0cea6422218d","blockSize":4194304,"blocks":["0b0ce69e6456e80e886e0cac98c8de7d6dcbd75ac53647c5500d0cea6422218d"]},"offset":"12489880"},"CommandLineDefinition.js":{"size":279,"integrity":{"algorithm":"SHA256","hash":"f20db5c3a2e64ea07df0a5b3d1e738cf5810e0e89b57d7cd7a97fc7e923074fc","blockSize":4194304,"blocks":["f20db5c3a2e64ea07df0a5b3d1e738cf5810e0e89b57d7cd7a97fc7e923074fc"]},"offset":"12493699"},"CommandLineFlagParameter.js":{"size":2809,"integrity":{"algorithm":"SHA256","hash":"bf0ecbcad84808d044d3c52c45eced30dd9c67b68022f7e6f530a829aa3f26d4","blockSize":4194304,"blocks":["bf0ecbcad84808d044d3c52c45eced30dd9c67b68022f7e6f530a829aa3f26d4"]},"offset":"12493978"},"CommandLineIntegerListParameter.js":{"size":3218,"integrity":{"algorithm":"SHA256","hash":"872e3d100b2cecd4d0ea57d3abaa67488204fbbfb2c58de9ff0177a88fdf306b","blockSize":4194304,"blocks":["872e3d100b2cecd4d0ea57d3abaa67488204fbbfb2c58de9ff0177a88fdf306b"]},"offset":"12496787"},"CommandLineIntegerParameter.js":{"size":3237,"integrity":{"algorithm":"SHA256","hash":"7d42b6cfab2634f19e640bbd829d4363af31baae7f2713b57354a6fa9a2e2f71","blockSize":4194304,"blocks":["7d42b6cfab2634f19e640bbd829d4363af31baae7f2713b57354a6fa9a2e2f71"]},"offset":"12500005"},"CommandLineRemainder.js":{"size":1621,"integrity":{"algorithm":"SHA256","hash":"642aa7a824b20e29bbcfcf7efd8a2a7303c1dcd7fc8e20515109df7dcde9814f","blockSize":4194304,"blocks":["642aa7a824b20e29bbcfcf7efd8a2a7303c1dcd7fc8e20515109df7dcde9814f"]},"offset":"12503242"},"CommandLineStringListParameter.js":{"size":2702,"integrity":{"algorithm":"SHA256","hash":"51244556173d24a7e4ca60e942666754eea39693ee64243966d302684e1f2004","blockSize":4194304,"blocks":["51244556173d24a7e4ca60e942666754eea39693ee64243966d302684e1f2004"]},"offset":"12504863"},"CommandLineStringParameter.js":{"size":3126,"integrity":{"algorithm":"SHA256","hash":"ef68dc9b80805a3318b961b3faee7b733660091d552147ef18b7c4b57efdfc88","blockSize":4194304,"blocks":["ef68dc9b80805a3318b961b3faee7b733660091d552147ef18b7c4b57efdfc88"]},"offset":"12507565"},"EnvironmentVariableParser.js":{"size":2868,"integrity":{"algorithm":"SHA256","hash":"9dbe54d50be6c5ca800ea8ae105f10b6a393a9b41f360e3ffb458997e6eb6e40","blockSize":4194304,"blocks":["9dbe54d50be6c5ca800ea8ae105f10b6a393a9b41f360e3ffb458997e6eb6e40"]},"offset":"12510691"}}}}},"dist":{"files":{"tsdoc-metadata.json":{"size":340,"integrity":{"algorithm":"SHA256","hash":"7465be23937ea1e718ad16a47f535fde731938f253db3a78b0e3a62cc3d23a44","blockSize":4194304,"blocks":["7465be23937ea1e718ad16a47f535fde731938f253db3a78b0e3a62cc3d23a44"]},"offset":"12513559"}}},"node_modules":{"files":{"colors":{"files":{"LICENSE":{"size":1187,"integrity":{"algorithm":"SHA256","hash":"77ffe84006509949525fd57df06f4a6a80ad862c5314b66ab5bb6ac4cee6280b","blockSize":4194304,"blocks":["77ffe84006509949525fd57df06f4a6a80ad862c5314b66ab5bb6ac4cee6280b"]},"offset":"46490718"},"package.json":{"size":575,"integrity":{"algorithm":"SHA256","hash":"8af7355293beafc05e03492dece83010a9c0c530826c2c84382e69a5438ae666","blockSize":4194304,"blocks":["8af7355293beafc05e03492dece83010a9c0c530826c2c84382e69a5438ae666"]},"offset":"46491905"},"safe.js":{"size":248,"integrity":{"algorithm":"SHA256","hash":"672cc883942925ce2e36076ccaf2d3caf7deb7c50ffe65601b40de54281cd1c9","blockSize":4194304,"blocks":["672cc883942925ce2e36076ccaf2d3caf7deb7c50ffe65601b40de54281cd1c9"]},"offset":"46492480"},"themes":{"files":{"generic-logging.js":{"size":199,"integrity":{"algorithm":"SHA256","hash":"20a79c0ecf57fe4736d6f04f808a772a64a3700c1db9dad4ccb37269eb761223","blockSize":4194304,"blocks":["20a79c0ecf57fe4736d6f04f808a772a64a3700c1db9dad4ccb37269eb761223"]},"offset":"46492728"}}},"lib":{"files":{"colors.js":{"size":5463,"integrity":{"algorithm":"SHA256","hash":"e453160503abbdababea4207a4f04aa87862d770ca6f8e4445bbb5e0afeb5096","blockSize":4194304,"blocks":["e453160503abbdababea4207a4f04aa87862d770ca6f8e4445bbb5e0afeb5096"]},"offset":"46492927"},"extendStringPrototype.js":{"size":2875,"integrity":{"algorithm":"SHA256","hash":"9b4788b059db58b7388fbf0a74706ae7a55d629e30a1e54ce1bbcc3658389a68","blockSize":4194304,"blocks":["9b4788b059db58b7388fbf0a74706ae7a55d629e30a1e54ce1bbcc3658389a68"]},"offset":"46498390"},"index.js":{"size":369,"integrity":{"algorithm":"SHA256","hash":"1465f31dbe9e763bfc246f3ae66f78f8b3e3229ecadaf58135d12a7e2596d4ec","blockSize":4194304,"blocks":["1465f31dbe9e763bfc246f3ae66f78f8b3e3229ecadaf58135d12a7e2596d4ec"]},"offset":"46501265"},"styles.js":{"size":2100,"integrity":{"algorithm":"SHA256","hash":"a4b2f35ab4aefee49fd8ac4b4fe9a23c5ee6f71ddbd079af14affed2fad57649","blockSize":4194304,"blocks":["a4b2f35ab4aefee49fd8ac4b4fe9a23c5ee6f71ddbd079af14affed2fad57649"]},"offset":"46501634"},"system":{"files":{"has-flag.js":{"size":1415,"integrity":{"algorithm":"SHA256","hash":"cbbe0081cc62a0e54ed201dc0c1503a507daa076b7bdbaa40eccfaa5fd9d1d07","blockSize":4194304,"blocks":["cbbe0081cc62a0e54ed201dc0c1503a507daa076b7bdbaa40eccfaa5fd9d1d07"]},"offset":"46503734"},"supports-colors.js":{"size":4049,"integrity":{"algorithm":"SHA256","hash":"8ed006395e84e32cf3ad027c789817360d3553e66cc01a63d66e0dfea9f42a00","blockSize":4194304,"blocks":["8ed006395e84e32cf3ad027c789817360d3553e66cc01a63d66e0dfea9f42a00"]},"offset":"46505149"}}},"maps":{"files":{"america.js":{"size":312,"integrity":{"algorithm":"SHA256","hash":"d4e23c2901cdd46c706ae2e95e05609a4bb7bddadffdcaf506f237b0c0f4e264","blockSize":4194304,"blocks":["d4e23c2901cdd46c706ae2e95e05609a4bb7bddadffdcaf506f237b0c0f4e264"]},"offset":"46509198"},"rainbow.js":{"size":345,"integrity":{"algorithm":"SHA256","hash":"5792d720a0f35a9c08c035f1b49d81d5fa99174f2c57552515d394fb3d78cf29","blockSize":4194304,"blocks":["5792d720a0f35a9c08c035f1b49d81d5fa99174f2c57552515d394fb3d78cf29"]},"offset":"46509510"},"random.js":{"size":378,"integrity":{"algorithm":"SHA256","hash":"38cdfb7af138d8ff70e16319496bb9ca4b86a4077d537bd8d0417c5d44527afa","blockSize":4194304,"blocks":["38cdfb7af138d8ff70e16319496bb9ca4b86a4077d537bd8d0417c5d44527afa"]},"offset":"46509855"},"zebra.js":{"size":147,"integrity":{"algorithm":"SHA256","hash":"2d21f47e5a0e77344fac4ede70e0f1d6a8b3a9e9ae1f2dfa35013a88aaf97961","blockSize":4194304,"blocks":["2d21f47e5a0e77344fac4ede70e0f1d6a8b3a9e9ae1f2dfa35013a88aaf97961"]},"offset":"46510233"}}},"custom":{"files":{"trap.js":{"size":1683,"integrity":{"algorithm":"SHA256","hash":"010bedd8be2ae6883a57f8b61b2c389a51c6a618011e0519303b82fa9e3daee6","blockSize":4194304,"blocks":["010bedd8be2ae6883a57f8b61b2c389a51c6a618011e0519303b82fa9e3daee6"]},"offset":"46510380"},"zalgo.js":{"size":2860,"integrity":{"algorithm":"SHA256","hash":"9d9fb5bab34dd7a06c67ad0b8a157b86f4390844ae9de663ce6f688e843a7977","blockSize":4194304,"blocks":["9d9fb5bab34dd7a06c67ad0b8a157b86f4390844ae9de663ce6f688e843a7977"]},"offset":"46512063"}}}}}}}}}}}}},"@tediousjs":{"files":{"connection-string":{"files":{"LICENSE":{"size":1070,"integrity":{"algorithm":"SHA256","hash":"39c28a0969417cac509053c6ba7dbc4259972f965762849df90057a6d6d4c971","blockSize":4194304,"blocks":["39c28a0969417cac509053c6ba7dbc4259972f965762849df90057a6d6d4c971"]},"offset":"12513899"},"package.json":{"size":941,"integrity":{"algorithm":"SHA256","hash":"4a53f4cd18ed56f6989294c0ee499c53862d1ec08dccae99f623b433b353b014","blockSize":4194304,"blocks":["4a53f4cd18ed56f6989294c0ee499c53862d1ec08dccae99f623b433b353b014"]},"offset":"12514969"},"lib":{"files":{"index.js":{"size":639,"integrity":{"algorithm":"SHA256","hash":"22054e043806997a81269a73e973b585146ba0cd990a3e85c4c7c849fe09c28d","blockSize":4194304,"blocks":["22054e043806997a81269a73e973b585146ba0cd990a3e85c4c7c849fe09c28d"]},"offset":"12515910"},"parser":{"files":{"connection-string.js":{"size":4020,"integrity":{"algorithm":"SHA256","hash":"890e79d0e3603eb67e977d0512c3c615dcd927e84c21bcf2c99d69f1f421bff0","blockSize":4194304,"blocks":["890e79d0e3603eb67e977d0512c3c615dcd927e84c21bcf2c99d69f1f421bff0"]},"offset":"12516549"},"sql-connection-string.js":{"size":9131,"integrity":{"algorithm":"SHA256","hash":"c44254cd216b632b75240e79338d7c14f86649bd89cb998fa437ace407001718","blockSize":4194304,"blocks":["c44254cd216b632b75240e79338d7c14f86649bd89cb998fa437ace407001718"]},"offset":"12520569"}}}}}}}}},"@tootallnate":{"files":{"once":{"files":{"package.json":{"size":926,"integrity":{"algorithm":"SHA256","hash":"d548706742a7c8d92d68a9c5832a4059df5854cc87cb6cfba1fab494f6713112","blockSize":4194304,"blocks":["d548706742a7c8d92d68a9c5832a4059df5854cc87cb6cfba1fab494f6713112"]},"offset":"12529700"},"dist":{"files":{"index.js":{"size":1096,"integrity":{"algorithm":"SHA256","hash":"b9d3770080970a3e2923463bd5f5dc4e5f15493cc4d4d762eb60b7cd3eaeca14","blockSize":4194304,"blocks":["b9d3770080970a3e2923463bd5f5dc4e5f15493cc4d4d762eb60b7cd3eaeca14"]},"offset":"12530626"}}}}}}},"abbrev":{"files":{"LICENSE":{"size":2011,"integrity":{"algorithm":"SHA256","hash":"9e0d5c7989f7e9f07d7c4b158aceff270f235eb7464ace41c5e7b200834a43e0","blockSize":4194304,"blocks":["9e0d5c7989f7e9f07d7c4b158aceff270f235eb7464ace41c5e7b200834a43e0"]},"offset":"12531722"},"abbrev.js":{"size":1763,"integrity":{"algorithm":"SHA256","hash":"77e68ed8bb552a11a5ece29800e0afe34bcc098d14a1b88dd44273f68be43943","blockSize":4194304,"blocks":["77e68ed8bb552a11a5ece29800e0afe34bcc098d14a1b88dd44273f68be43943"]},"offset":"12533733"},"package.json":{"size":324,"integrity":{"algorithm":"SHA256","hash":"f8fbeffa5c4347ccd0d27b5939699bd41b96f8be1ee0f473f87eecbe7ef3ffb8","blockSize":4194304,"blocks":["f8fbeffa5c4347ccd0d27b5939699bd41b96f8be1ee0f473f87eecbe7ef3ffb8"]},"offset":"12535496"}}},"accepts":{"files":{"HISTORY.md":{"size":5096,"integrity":{"algorithm":"SHA256","hash":"ef66fe7e96fee5760f153fc5059124effa5310895b336585e3a80a93c9f2d9be","blockSize":4194304,"blocks":["ef66fe7e96fee5760f153fc5059124effa5310895b336585e3a80a93c9f2d9be"]},"offset":"12535820"},"LICENSE":{"size":1167,"integrity":{"algorithm":"SHA256","hash":"71f83c4c0621102a56d9853812777b85751bce7e9726f686f5b056c1f8a4b0e6","blockSize":4194304,"blocks":["71f83c4c0621102a56d9853812777b85751bce7e9726f686f5b056c1f8a4b0e6"]},"offset":"12540916"},"index.js":{"size":5252,"integrity":{"algorithm":"SHA256","hash":"be2decbd50610e8f995c1e312ee4dd6d7c1244cfdf03ee4c4a3da68e572dada1","blockSize":4194304,"blocks":["be2decbd50610e8f995c1e312ee4dd6d7c1244cfdf03ee4c4a3da68e572dada1"]},"offset":"12542083"},"package.json":{"size":690,"integrity":{"algorithm":"SHA256","hash":"2322f81dd2d758915806721d35db67eacce0aaa1674f0c62637ded84427d6644","blockSize":4194304,"blocks":["2322f81dd2d758915806721d35db67eacce0aaa1674f0c62637ded84427d6644"]},"offset":"12547335"}}},"agent-base":{"files":{"package.json":{"size":1198,"integrity":{"algorithm":"SHA256","hash":"1c22afa50ae7fedb6d51d34394cccb31fc4ed27163271d3060355b044a5b5777","blockSize":4194304,"blocks":["1c22afa50ae7fedb6d51d34394cccb31fc4ed27163271d3060355b044a5b5777"]},"offset":"12548025"},"src":{"files":{"index.ts":{"size":9018,"integrity":{"algorithm":"SHA256","hash":"63b9c52366354393361bbbd40158a3051d39a6e2db4ce564418e01e4ecd1bc64","blockSize":4194304,"blocks":["63b9c52366354393361bbbd40158a3051d39a6e2db4ce564418e01e4ecd1bc64"]},"offset":"12549223"},"promisify.ts":{"size":649,"integrity":{"algorithm":"SHA256","hash":"b199581471074102ec7b2c89dbbff48249b3c9c9f9261d9fe32a110d76f7a526","blockSize":4194304,"blocks":["b199581471074102ec7b2c89dbbff48249b3c9c9f9261d9fe32a110d76f7a526"]},"offset":"12558241"}}},"dist":{"files":{"src":{"files":{"index.js":{"size":7910,"integrity":{"algorithm":"SHA256","hash":"13b6d658b492796461358e19fe1de30665ab2efb04c726b82530352cd364d4ac","blockSize":4194304,"blocks":["13b6d658b492796461358e19fe1de30665ab2efb04c726b82530352cd364d4ac"]},"offset":"12558890"},"promisify.js":{"size":495,"integrity":{"algorithm":"SHA256","hash":"7db1e28ac19b38be8cf3edecac66c7084bb00b65f6755a83309bcf10564b5771","blockSize":4194304,"blocks":["7db1e28ac19b38be8cf3edecac66c7084bb00b65f6755a83309bcf10564b5771"]},"offset":"12566800"}}}}}}},"agentkeepalive":{"files":{"History.md":{"size":8994,"integrity":{"algorithm":"SHA256","hash":"64eec72e5bfbd5f4704aea2af61296ec5543c38c32cbbe823a23ff6199d118aa","blockSize":4194304,"blocks":["64eec72e5bfbd5f4704aea2af61296ec5543c38c32cbbe823a23ff6199d118aa"]},"offset":"12567295"},"LICENSE":{"size":1144,"integrity":{"algorithm":"SHA256","hash":"1069803cb5c8700c35bda7de55532d6fd50faa0b583c698a6f8d232bd4c248f7","blockSize":4194304,"blocks":["1069803cb5c8700c35bda7de55532d6fd50faa0b583c698a6f8d232bd4c248f7"]},"offset":"12576289"},"browser.js":{"size":144,"integrity":{"algorithm":"SHA256","hash":"5c282aacf9e9e5da7ca3f4e35d8f174d65c7d97b71c07df3c5a50b491139b876","blockSize":4194304,"blocks":["5c282aacf9e9e5da7ca3f4e35d8f174d65c7d97b71c07df3c5a50b491139b876"]},"offset":"12577433"},"index.js":{"size":169,"integrity":{"algorithm":"SHA256","hash":"a5ee80e811a9fa4878911c1b3a212432dcbb7745b14292e92ba6d444df95772f","blockSize":4194304,"blocks":["a5ee80e811a9fa4878911c1b3a212432dcbb7745b14292e92ba6d444df95772f"]},"offset":"12577577"},"package.json":{"size":958,"integrity":{"algorithm":"SHA256","hash":"778d95943070b03ab2095a8c3bba490a9826d324cb248dc09413cf2029ce1f28","blockSize":4194304,"blocks":["778d95943070b03ab2095a8c3bba490a9826d324cb248dc09413cf2029ce1f28"]},"offset":"12577746"},"lib":{"files":{"agent.js":{"size":15228,"integrity":{"algorithm":"SHA256","hash":"860fc53f799c5c108f1a4d2dbdca56f8c1ac11d7760e84f0d0d7892d0b6ae3bc","blockSize":4194304,"blocks":["860fc53f799c5c108f1a4d2dbdca56f8c1ac11d7760e84f0d0d7892d0b6ae3bc"]},"offset":"12578704"},"constants.js":{"size":559,"integrity":{"algorithm":"SHA256","hash":"4f12e321cc734af3cb53389861245b2b1960cdcdb570704048905c9eb88bb0d3","blockSize":4194304,"blocks":["4f12e321cc734af3cb53389861245b2b1960cdcdb570704048905c9eb88bb0d3"]},"offset":"12593932"},"https_agent.js":{"size":1244,"integrity":{"algorithm":"SHA256","hash":"f967ed2eb1e1aa096fec300c0806947fa831238c73b49ddfd62c9ee8f960f58c","blockSize":4194304,"blocks":["f967ed2eb1e1aa096fec300c0806947fa831238c73b49ddfd62c9ee8f960f58c"]},"offset":"12594491"}}},"node_modules":{"files":{"depd":{"files":{"History.md":{"size":2060,"integrity":{"algorithm":"SHA256","hash":"246dfedef218cd2daed303651ffce659beeb0da7a92b469deee5c940fc836a18","blockSize":4194304,"blocks":["246dfedef218cd2daed303651ffce659beeb0da7a92b469deee5c940fc836a18"]},"offset":"41495723"},"LICENSE":{"size":1094,"integrity":{"algorithm":"SHA256","hash":"bd47ce7b88c7759630d1e2b9fcfa170a0f1fde522be09e13fb1581a79d090400","blockSize":4194304,"blocks":["bd47ce7b88c7759630d1e2b9fcfa170a0f1fde522be09e13fb1581a79d090400"]},"offset":"41497783"},"index.js":{"size":10669,"integrity":{"algorithm":"SHA256","hash":"244dbbca14b8aa9c9b6be04912283ab704b92f11dcb9b23beb2ba81402fecc99","blockSize":4194304,"blocks":["244dbbca14b8aa9c9b6be04912283ab704b92f11dcb9b23beb2ba81402fecc99"]},"offset":"41498877"},"package.json":{"size":712,"integrity":{"algorithm":"SHA256","hash":"a620b841d1a3b3ad28fc71ad9f7380525f515ebbce975b5f18705146266cd2f6","blockSize":4194304,"blocks":["a620b841d1a3b3ad28fc71ad9f7380525f515ebbce975b5f18705146266cd2f6"]},"offset":"41509546"},"lib":{"files":{"compat":{"files":{"callsite-tostring.js":{"size":2229,"integrity":{"algorithm":"SHA256","hash":"702ab02dc767bd351fca5f9faa659327f22f4cfd2684e0a33b23447838f5773b","blockSize":4194304,"blocks":["702ab02dc767bd351fca5f9faa659327f22f4cfd2684e0a33b23447838f5773b"]},"offset":"41510258"},"event-listener-count.js":{"size":338,"integrity":{"algorithm":"SHA256","hash":"5dc8bef6d7641158ccd485fece7fcf46566fe95b42e40a48ded7ea43366f0968","blockSize":4194304,"blocks":["5dc8bef6d7641158ccd485fece7fcf46566fe95b42e40a48ded7ea43366f0968"]},"offset":"41512487"},"index.js":{"size":1421,"integrity":{"algorithm":"SHA256","hash":"76baf83317ac81045cefb9fcc8ec0d8e47dd0cfcbadd592f480349412e161861","blockSize":4194304,"blocks":["76baf83317ac81045cefb9fcc8ec0d8e47dd0cfcbadd592f480349412e161861"]},"offset":"41512825"}}},"browser":{"files":{"index.js":{"size":1512,"integrity":{"algorithm":"SHA256","hash":"10b4d4a4e9d14e9e6a5ab7ced64405ef90e6bec94d479a8e223cbba88828ad79","blockSize":4194304,"blocks":["10b4d4a4e9d14e9e6a5ab7ced64405ef90e6bec94d479a8e223cbba88828ad79"]},"offset":"41514246"}}}}}}}}}}},"aggregate-error":{"files":{"index.js":{"size":1252,"integrity":{"algorithm":"SHA256","hash":"84c72b3601fccebd43285959f9085ad3e4af0d5683613dd125ce8e56b7aa8185","blockSize":4194304,"blocks":["84c72b3601fccebd43285959f9085ad3e4af0d5683613dd125ce8e56b7aa8185"]},"offset":"12595735"},"license":{"size":1109,"integrity":{"algorithm":"SHA256","hash":"48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0","blockSize":4194304,"blocks":["48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0"]},"offset":"12596987"},"package.json":{"size":558,"integrity":{"algorithm":"SHA256","hash":"6537ad957da2b03c82499f6df6174f81df3b5c83f9fac3a2c818a6e99a9ba737","blockSize":4194304,"blocks":["6537ad957da2b03c82499f6df6174f81df3b5c83f9fac3a2c818a6e99a9ba737"]},"offset":"12598096"}}},"ansi-regex":{"files":{"index.js":{"size":350,"integrity":{"algorithm":"SHA256","hash":"c92312790eb1f246b7c4c1fe9c1247b15441bbca3c6cb64d167beefc45302753","blockSize":4194304,"blocks":["c92312790eb1f246b7c4c1fe9c1247b15441bbca3c6cb64d167beefc45302753"]},"offset":"12598654"},"license":{"size":1109,"integrity":{"algorithm":"SHA256","hash":"48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0","blockSize":4194304,"blocks":["48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0"]},"offset":"12599004"},"package.json":{"size":470,"integrity":{"algorithm":"SHA256","hash":"93fcfd1b014b9bd7f31b3f35b24a5a479839b6f141c95f62b73a1829bf112ad2","blockSize":4194304,"blocks":["93fcfd1b014b9bd7f31b3f35b24a5a479839b6f141c95f62b73a1829bf112ad2"]},"offset":"12600113"}}},"aproba":{"files":{"LICENSE":{"size":752,"integrity":{"algorithm":"SHA256","hash":"0cef05dfff8b6aa7f35596984f5709f0d17c2582924a751efa471a76de7cdc11","blockSize":4194304,"blocks":["0cef05dfff8b6aa7f35596984f5709f0d17c2582924a751efa471a76de7cdc11"]},"offset":"12600583"},"index.js":{"size":3644,"integrity":{"algorithm":"SHA256","hash":"17c1b40011c39799e42ff4b4ae403f8109ba381aa2975fedc9eb155b922026f2","blockSize":4194304,"blocks":["17c1b40011c39799e42ff4b4ae403f8109ba381aa2975fedc9eb155b922026f2"]},"offset":"12601335"},"package.json":{"size":534,"integrity":{"algorithm":"SHA256","hash":"a14a9a5a7b2617553e4077a53c4a29ebd66ecebfe4badbe753872f7ea477cb75","blockSize":4194304,"blocks":["a14a9a5a7b2617553e4077a53c4a29ebd66ecebfe4badbe753872f7ea477cb75"]},"offset":"12604979"}}},"are-we-there-yet":{"files":{"LICENSE.md":{"size":717,"integrity":{"algorithm":"SHA256","hash":"7f75bb21103e77b7acfcf88a6ad0286741a18b5d13c4326160346e8cf7e356ad","blockSize":4194304,"blocks":["7f75bb21103e77b7acfcf88a6ad0286741a18b5d13c4326160346e8cf7e356ad"]},"offset":"12605513"},"package.json":{"size":942,"integrity":{"algorithm":"SHA256","hash":"1de152fb733af3875c3cf40973036bc3460ef987a840642f8c4e6b45820da9e4","blockSize":4194304,"blocks":["1de152fb733af3875c3cf40973036bc3460ef987a840642f8c4e6b45820da9e4"]},"offset":"12606230"},"lib":{"files":{"index.js":{"size":163,"integrity":{"algorithm":"SHA256","hash":"7a427679a9b245f02d66bb09aeaa5337bdff29375d05f3f34e7133b61001bb69","blockSize":4194304,"blocks":["7a427679a9b245f02d66bb09aeaa5337bdff29375d05f3f34e7133b61001bb69"]},"offset":"12607172"},"tracker-base.js":{"size":274,"integrity":{"algorithm":"SHA256","hash":"733f287bde0281daa16a3ee8e006266c37d7aa81a5750c2e2379535fea265977","blockSize":4194304,"blocks":["733f287bde0281daa16a3ee8e006266c37d7aa81a5750c2e2379535fea265977"]},"offset":"12607335"},"tracker-group.js":{"size":3280,"integrity":{"algorithm":"SHA256","hash":"6923033ffb76dba88296abacd04ec802baab214eeac425443b62ba16f9170d21","blockSize":4194304,"blocks":["6923033ffb76dba88296abacd04ec802baab214eeac425443b62ba16f9170d21"]},"offset":"12607609"},"tracker-stream.js":{"size":963,"integrity":{"algorithm":"SHA256","hash":"e550b2d2ee5720b7b140a73b625d1cef6550152b1edbd7264488c3bd54611b6f","blockSize":4194304,"blocks":["e550b2d2ee5720b7b140a73b625d1cef6550152b1edbd7264488c3bd54611b6f"]},"offset":"12610889"},"tracker.js":{"size":836,"integrity":{"algorithm":"SHA256","hash":"74999377a441331aeaa61a1b3565b38daa66db786ef96f51f1c9bde8ee523ad3","blockSize":4194304,"blocks":["74999377a441331aeaa61a1b3565b38daa66db786ef96f51f1c9bde8ee523ad3"]},"offset":"12611852"}}}}},"argparse":{"files":{"LICENSE":{"size":1079,"integrity":{"algorithm":"SHA256","hash":"c8442419dc614089ea022b3da6bfc089b41a58fb7b9030d1e651f2f36189dce2","blockSize":4194304,"blocks":["c8442419dc614089ea022b3da6bfc089b41a58fb7b9030d1e651f2f36189dce2"]},"offset":"12612688"},"index.js":{"size":59,"integrity":{"algorithm":"SHA256","hash":"190d2c0b07376e8dd3bbf2001b20d27b8929245b0b731d79e222edb0944f58f5","blockSize":4194304,"blocks":["190d2c0b07376e8dd3bbf2001b20d27b8929245b0b731d79e222edb0944f58f5"]},"offset":"12613767"},"package.json":{"size":437,"integrity":{"algorithm":"SHA256","hash":"cf6b765bc7775b606fbd69967aae1808be7bd86837233adcc570a7bf17a9a66e","blockSize":4194304,"blocks":["cf6b765bc7775b606fbd69967aae1808be7bd86837233adcc570a7bf17a9a66e"]},"offset":"12613826"},"lib":{"files":{"action.js":{"size":4659,"integrity":{"algorithm":"SHA256","hash":"773b4e9300210321067744f4023cde58d299de00fb87e9e55ddbcd78978a525c","blockSize":4194304,"blocks":["773b4e9300210321067744f4023cde58d299de00fb87e9e55ddbcd78978a525c"]},"offset":"12614263"},"action_container.js":{"size":15055,"integrity":{"algorithm":"SHA256","hash":"4d594dd87587d58d3cada83e0d3bc105fbc9f48cab72daf72d8c77632bc5b9ab","blockSize":4194304,"blocks":["4d594dd87587d58d3cada83e0d3bc105fbc9f48cab72daf72d8c77632bc5b9ab"]},"offset":"12618922"},"argparse.js":{"size":618,"integrity":{"algorithm":"SHA256","hash":"33c1269d0e69f0bb3f5cc54dded402d0e1abcd2b7ff39ef6956234bd29de0757","blockSize":4194304,"blocks":["33c1269d0e69f0bb3f5cc54dded402d0e1abcd2b7ff39ef6956234bd29de0757"]},"offset":"12633977"},"argument_parser.js":{"size":35223,"integrity":{"algorithm":"SHA256","hash":"e9158c6cc41fd1b8525cd061362f4df7f175bc7767db6e589a1d17daf3ced276","blockSize":4194304,"blocks":["e9158c6cc41fd1b8525cd061362f4df7f175bc7767db6e589a1d17daf3ced276"]},"offset":"12634595"},"const.js":{"size":340,"integrity":{"algorithm":"SHA256","hash":"719d122368d1ead2b1027e54bae88920f2334b552ebc72054698630a87e24c0a","blockSize":4194304,"blocks":["719d122368d1ead2b1027e54bae88920f2334b552ebc72054698630a87e24c0a"]},"offset":"12669818"},"namespace.js":{"size":1824,"integrity":{"algorithm":"SHA256","hash":"b8a67a6abf6043d22a2a7976d1ff8476af62ee413349eb330e4798de8d798afc","blockSize":4194304,"blocks":["b8a67a6abf6043d22a2a7976d1ff8476af62ee413349eb330e4798de8d798afc"]},"offset":"12670158"},"utils.js":{"size":1281,"integrity":{"algorithm":"SHA256","hash":"4a1146a5ae0694946b7063779c1522c95439050e41bafdd2a703c785625fe0c8","blockSize":4194304,"blocks":["4a1146a5ae0694946b7063779c1522c95439050e41bafdd2a703c785625fe0c8"]},"offset":"12671982"},"help":{"files":{"added_formatters.js":{"size":2647,"integrity":{"algorithm":"SHA256","hash":"204100289ecc4ecfe0d61cd98839e39698d9b2b0347db7d91dbcf3485649aeb5","blockSize":4194304,"blocks":["204100289ecc4ecfe0d61cd98839e39698d9b2b0347db7d91dbcf3485649aeb5"]},"offset":"12673263"},"formatter.js":{"size":22025,"integrity":{"algorithm":"SHA256","hash":"dbe0569259647ae9b8a8fe7db70b542219027ec7d7b7a80e6edd973fd01ee19a","blockSize":4194304,"blocks":["dbe0569259647ae9b8a8fe7db70b542219027ec7d7b7a80e6edd973fd01ee19a"]},"offset":"12675910"}}},"argument":{"files":{"error.js":{"size":1183,"integrity":{"algorithm":"SHA256","hash":"2af0d562361cc46b5958d87edef28f23661903674e2484f7347057d3d45fa251","blockSize":4194304,"blocks":["2af0d562361cc46b5958d87edef28f23661903674e2484f7347057d3d45fa251"]},"offset":"12697935"},"exclusive.js":{"size":1589,"integrity":{"algorithm":"SHA256","hash":"cd81ce86f7e98ad6699a4d3ee86abdbdd762db25b03c4a7ad8521a64bd5fc5b2","blockSize":4194304,"blocks":["cd81ce86f7e98ad6699a4d3ee86abdbdd762db25b03c4a7ad8521a64bd5fc5b2"]},"offset":"12699118"},"group.js":{"size":2330,"integrity":{"algorithm":"SHA256","hash":"4cab0c3ee28ac94fe0a37c4cffb6cb27c675b8dd7f266268d5107083141425ec","blockSize":4194304,"blocks":["4cab0c3ee28ac94fe0a37c4cffb6cb27c675b8dd7f266268d5107083141425ec"]},"offset":"12700707"}}},"action":{"files":{"append.js":{"size":1565,"integrity":{"algorithm":"SHA256","hash":"f5750834298717715d5e7b9e3f32cbe81d6d7a33ef74dad82915c53d7c0e13f0","blockSize":4194304,"blocks":["f5750834298717715d5e7b9e3f32cbe81d6d7a33ef74dad82915c53d7c0e13f0"]},"offset":"12703037"},"count.js":{"size":1036,"integrity":{"algorithm":"SHA256","hash":"3f9c9c87f0d880101e7957436eb876a2b9352f40d0f9b19b34bf597ba90b6128","blockSize":4194304,"blocks":["3f9c9c87f0d880101e7957436eb876a2b9352f40d0f9b19b34bf597ba90b6128"]},"offset":"12704602"},"help.js":{"size":1120,"integrity":{"algorithm":"SHA256","hash":"4a802a6b28e77c44af2ca359370b4674e19ab36eac8b512785c6867971c11da9","blockSize":4194304,"blocks":["4a802a6b28e77c44af2ca359370b4674e19ab36eac8b512785c6867971c11da9"]},"offset":"12705638"},"store.js":{"size":1350,"integrity":{"algorithm":"SHA256","hash":"3ed24a4d6d56e50d972e82b866ade25192e004d08d55cb4d5a17bf3a7c239b1a","blockSize":4194304,"blocks":["3ed24a4d6d56e50d972e82b866ade25192e004d08d55cb4d5a17bf3a7c239b1a"]},"offset":"12706758"},"subparsers.js":{"size":3590,"integrity":{"algorithm":"SHA256","hash":"6c3f8933c4e526f2cab647a77f222e282f8fd72c6da774e5ae6e1fb9cea666f1","blockSize":4194304,"blocks":["6c3f8933c4e526f2cab647a77f222e282f8fd72c6da774e5ae6e1fb9cea666f1"]},"offset":"12708108"},"version.js":{"size":1244,"integrity":{"algorithm":"SHA256","hash":"02ef8cd757582d809cf163251f16e3915f548f1d3b8e97c3aa9f206751627c27","blockSize":4194304,"blocks":["02ef8cd757582d809cf163251f16e3915f548f1d3b8e97c3aa9f206751627c27"]},"offset":"12711698"},"store":{"files":{"constant.js":{"size":1332,"integrity":{"algorithm":"SHA256","hash":"260804d0d1019d89910ca2f861af4f21c41d132ffec692fef40052db28efa827","blockSize":4194304,"blocks":["260804d0d1019d89910ca2f861af4f21c41d132ffec692fef40052db28efa827"]},"offset":"12712942"},"false.js":{"size":704,"integrity":{"algorithm":"SHA256","hash":"92aed2410134bf56b27f29250cbc85a4617a956539ece74ce1c579e9830587ef","blockSize":4194304,"blocks":["92aed2410134bf56b27f29250cbc85a4617a956539ece74ce1c579e9830587ef"]},"offset":"12714274"},"true.js":{"size":693,"integrity":{"algorithm":"SHA256","hash":"abc51942ffc474caaa5a8c7f2bfd7363963955b131e0574657e012d14818c2b9","blockSize":4194304,"blocks":["abc51942ffc474caaa5a8c7f2bfd7363963955b131e0574657e012d14818c2b9"]},"offset":"12714978"}}},"append":{"files":{"constant.js":{"size":1430,"integrity":{"algorithm":"SHA256","hash":"5f8f444bdd4acd75659eeeaadf6b14bd60b33c7d6f7c19797c4bf8c87a742c71","blockSize":4194304,"blocks":["5f8f444bdd4acd75659eeeaadf6b14bd60b33c7d6f7c19797c4bf8c87a742c71"]},"offset":"12715671"}}}}}}}}},"asynckit":{"files":{"LICENSE":{"size":1078,"integrity":{"algorithm":"SHA256","hash":"1953150d5d4b10c7542cee6f6e0c613b2682545233f069d75cfff1936386ce10","blockSize":4194304,"blocks":["1953150d5d4b10c7542cee6f6e0c613b2682545233f069d75cfff1936386ce10"]},"offset":"12717101"},"bench.js":{"size":1256,"integrity":{"algorithm":"SHA256","hash":"b6c4a058c4fd03900f3786ef216322d57553ec83998e19b6d557dc39acfd2f9f","blockSize":4194304,"blocks":["b6c4a058c4fd03900f3786ef216322d57553ec83998e19b6d557dc39acfd2f9f"]},"offset":"12718179"},"index.js":{"size":156,"integrity":{"algorithm":"SHA256","hash":"397441fd78b69d7bdaaa48a0f354c8d07086a24414655b0601ab4f0c26e15f2f","blockSize":4194304,"blocks":["397441fd78b69d7bdaaa48a0f354c8d07086a24414655b0601ab4f0c26e15f2f"]},"offset":"12719435"},"package.json":{"size":882,"integrity":{"algorithm":"SHA256","hash":"c29adb10ce50d5962c687cc872b50df300eec9d658a0f5e218cde379882e7e3d","blockSize":4194304,"blocks":["c29adb10ce50d5962c687cc872b50df300eec9d658a0f5e218cde379882e7e3d"]},"offset":"12719591"},"parallel.js":{"size":1017,"integrity":{"algorithm":"SHA256","hash":"5296e5c3581ad9dc1f04aedaf1132df9736c580a326970e3975856f73aebfaea","blockSize":4194304,"blocks":["5296e5c3581ad9dc1f04aedaf1132df9736c580a326970e3975856f73aebfaea"]},"offset":"12720473"},"serial.js":{"size":501,"integrity":{"algorithm":"SHA256","hash":"b9bd1e776ab9c386ad2a832e0c02db980cdfc1276ca9969697845c7e45b7795f","blockSize":4194304,"blocks":["b9bd1e776ab9c386ad2a832e0c02db980cdfc1276ca9969697845c7e45b7795f"]},"offset":"12721490"},"serialOrdered.js":{"size":1751,"integrity":{"algorithm":"SHA256","hash":"6ee8b4c5e8ded944d0afc55eba298c2bad1c621db1af56b427e96117cf63e41b","blockSize":4194304,"blocks":["6ee8b4c5e8ded944d0afc55eba298c2bad1c621db1af56b427e96117cf63e41b"]},"offset":"12721991"},"stream.js":{"size":703,"integrity":{"algorithm":"SHA256","hash":"7d3986c8b5a0902da235697dcd2b080617a148ac505ae959e7a23156a204f9af","blockSize":4194304,"blocks":["7d3986c8b5a0902da235697dcd2b080617a148ac505ae959e7a23156a204f9af"]},"offset":"12723742"},"lib":{"files":{"abort.js":{"size":497,"integrity":{"algorithm":"SHA256","hash":"2c64e26dbd17f4c5ee9e017a098cda40e5eb2234a89cfeb46287f6378b74a66a","blockSize":4194304,"blocks":["2c64e26dbd17f4c5ee9e017a098cda40e5eb2234a89cfeb46287f6378b74a66a"]},"offset":"12724445"},"async.js":{"size":599,"integrity":{"algorithm":"SHA256","hash":"cc91aca5b66788252bb01207ec797419eb4add90b88740395e818d12fc77bf87","blockSize":4194304,"blocks":["cc91aca5b66788252bb01207ec797419eb4add90b88740395e818d12fc77bf87"]},"offset":"12724942"},"defer.js":{"size":441,"integrity":{"algorithm":"SHA256","hash":"91e4ffb114b4d60af8da177eb388d507a13dc9bc449f68e2d4912083cbc2b1f7","blockSize":4194304,"blocks":["91e4ffb114b4d60af8da177eb388d507a13dc9bc449f68e2d4912083cbc2b1f7"]},"offset":"12725541"},"iterate.js":{"size":1794,"integrity":{"algorithm":"SHA256","hash":"1ed503336dc4f4b252852c45f8ea0b3b8eb9eab90dfa11189d9d00de888010ba","blockSize":4194304,"blocks":["1ed503336dc4f4b252852c45f8ea0b3b8eb9eab90dfa11189d9d00de888010ba"]},"offset":"12725982"},"readable_asynckit.js":{"size":1611,"integrity":{"algorithm":"SHA256","hash":"a23c413a059f4422ce03f22cd2a373b2fa6930ac47cc103a0e7e26a6ee6d0602","blockSize":4194304,"blocks":["a23c413a059f4422ce03f22cd2a373b2fa6930ac47cc103a0e7e26a6ee6d0602"]},"offset":"12727776"},"readable_parallel.js":{"size":673,"integrity":{"algorithm":"SHA256","hash":"d254fc0dc21eb4608336a462592b44cbbcab954d3b6904a26a4766e03dcce202","blockSize":4194304,"blocks":["d254fc0dc21eb4608336a462592b44cbbcab954d3b6904a26a4766e03dcce202"]},"offset":"12729387"},"readable_serial.js":{"size":655,"integrity":{"algorithm":"SHA256","hash":"b79637514db671ef3dcecde523017542c19e63f8eb93c5a5ab42b2f05bcc9a9d","blockSize":4194304,"blocks":["b79637514db671ef3dcecde523017542c19e63f8eb93c5a5ab42b2f05bcc9a9d"]},"offset":"12730060"},"readable_serial_ordered.js":{"size":941,"integrity":{"algorithm":"SHA256","hash":"9ddda7cb6c54a672d8a7e8cdd029d44e35335f7fa6e6102daf0c9f60137b59af","blockSize":4194304,"blocks":["9ddda7cb6c54a672d8a7e8cdd029d44e35335f7fa6e6102daf0c9f60137b59af"]},"offset":"12730715"},"state.js":{"size":941,"integrity":{"algorithm":"SHA256","hash":"9c3fe921ce1c205c62ce1cca97e1eb9335f3ddf066626a36c9a44bd59bd7a2db","blockSize":4194304,"blocks":["9c3fe921ce1c205c62ce1cca97e1eb9335f3ddf066626a36c9a44bd59bd7a2db"]},"offset":"12731656"},"streamify.js":{"size":2964,"integrity":{"algorithm":"SHA256","hash":"6112cce2460f0fda4b284d893329fa6a814a86dd4614f782babc2f7de9e7ac0a","blockSize":4194304,"blocks":["6112cce2460f0fda4b284d893329fa6a814a86dd4614f782babc2f7de9e7ac0a"]},"offset":"12732597"},"terminator.js":{"size":533,"integrity":{"algorithm":"SHA256","hash":"aeecf0a3c9e141ba3f7711426438de2172521a92b37ec3157b04e1a38e337bd0","blockSize":4194304,"blocks":["aeecf0a3c9e141ba3f7711426438de2172521a92b37ec3157b04e1a38e337bd0"]},"offset":"12735561"}}}}},"axios":{"files":{"LICENSE":{"size":1066,"integrity":{"algorithm":"SHA256","hash":"2b9b7b65d90de57cb7be31a9b996a2526a63dda8359a864278e5568b2b598937","blockSize":4194304,"blocks":["2b9b7b65d90de57cb7be31a9b996a2526a63dda8359a864278e5568b2b598937"]},"offset":"12736094"},"SECURITY.md":{"size":105,"integrity":{"algorithm":"SHA256","hash":"dcd77631ce5f8d447b84c80520802b9248fcf60ee973dc7fe6dcb19855d7e8d3","blockSize":4194304,"blocks":["dcd77631ce5f8d447b84c80520802b9248fcf60ee973dc7fe6dcb19855d7e8d3"]},"offset":"12737160"},"UPGRADE_GUIDE.md":{"size":4969,"integrity":{"algorithm":"SHA256","hash":"a8eee64d0b3e2c51a16b6b95333691ae560e2ad467333d8acdf2070bc9375093","blockSize":4194304,"blocks":["a8eee64d0b3e2c51a16b6b95333691ae560e2ad467333d8acdf2070bc9375093"]},"offset":"12737265"},"index.js":{"size":40,"integrity":{"algorithm":"SHA256","hash":"8b785b48db6ae7996d6cefc4bf461e1c35eb893b20c3acfd0a17d9888cfa0663","blockSize":4194304,"blocks":["8b785b48db6ae7996d6cefc4bf461e1c35eb893b20c3acfd0a17d9888cfa0663"]},"offset":"12742234"},"package.json":{"size":1915,"integrity":{"algorithm":"SHA256","hash":"c0ed6c7f2b55513485bf72885552102d06dd1dda18098f641895c901db2d5068","blockSize":4194304,"blocks":["c0ed6c7f2b55513485bf72885552102d06dd1dda18098f641895c901db2d5068"]},"offset":"12742274"},"tsconfig.json":{"size":236,"integrity":{"algorithm":"SHA256","hash":"8534af818f900bf92c79e620cc28c6e751eee5fd88e68f45e4df5325fea19f73","blockSize":4194304,"blocks":["8534af818f900bf92c79e620cc28c6e751eee5fd88e68f45e4df5325fea19f73"]},"offset":"12744189"},"tslint.json":{"size":96,"integrity":{"algorithm":"SHA256","hash":"b6f3921469506e0bbd7558cf5ee918f8e85085533dc36bb508ba790bad881659","blockSize":4194304,"blocks":["b6f3921469506e0bbd7558cf5ee918f8e85085533dc36bb508ba790bad881659"]},"offset":"12744425"},"lib":{"files":{"axios.js":{"size":1799,"integrity":{"algorithm":"SHA256","hash":"a0baad73630bfd2dafa54ca03959002e3ece22722cc338b2cd398553c92e62d6","blockSize":4194304,"blocks":["a0baad73630bfd2dafa54ca03959002e3ece22722cc338b2cd398553c92e62d6"]},"offset":"12744521"},"utils.js":{"size":11991,"integrity":{"algorithm":"SHA256","hash":"6e947c1fac89f04384f500115878bd8dc7bd3783354150cb9d836be3e4587c45","blockSize":4194304,"blocks":["6e947c1fac89f04384f500115878bd8dc7bd3783354150cb9d836be3e4587c45"]},"offset":"12746320"},"helpers":{"files":{"README.md":{"size":351,"integrity":{"algorithm":"SHA256","hash":"b8fe226abed5bdd9fc5eed1d9b906f4eff742f838685b5ab4fd08e41fe57c193","blockSize":4194304,"blocks":["b8fe226abed5bdd9fc5eed1d9b906f4eff742f838685b5ab4fd08e41fe57c193"]},"offset":"12758311"},"bind.js":{"size":256,"integrity":{"algorithm":"SHA256","hash":"eeacfadec59cfdabe0ba8299a7f4e3e24df4776ef8667e5bc90c4a5c8d67b12e","blockSize":4194304,"blocks":["eeacfadec59cfdabe0ba8299a7f4e3e24df4776ef8667e5bc90c4a5c8d67b12e"]},"offset":"12758662"},"buildURL.js":{"size":1644,"integrity":{"algorithm":"SHA256","hash":"8d9552a2965dd0c29214e4bfc1765bfb8186e2f67d84c718d26e0f481a1bfd83","blockSize":4194304,"blocks":["8d9552a2965dd0c29214e4bfc1765bfb8186e2f67d84c718d26e0f481a1bfd83"]},"offset":"12758918"},"combineURLs.js":{"size":380,"integrity":{"algorithm":"SHA256","hash":"0993a77790c955a9d536f10682d3a6943f1ecfb715cf78d6747ce8d5592a5518","blockSize":4194304,"blocks":["0993a77790c955a9d536f10682d3a6943f1ecfb715cf78d6747ce8d5592a5518"]},"offset":"12760562"},"cookies.js":{"size":1435,"integrity":{"algorithm":"SHA256","hash":"a8cea4cf13b48254ee77a7fef59b1b030dd40262a9adecb52d3a8583cca0f41c","blockSize":4194304,"blocks":["a8cea4cf13b48254ee77a7fef59b1b030dd40262a9adecb52d3a8583cca0f41c"]},"offset":"12760942"},"deprecatedMethod.js":{"size":727,"integrity":{"algorithm":"SHA256","hash":"12e9a9bb1931c31811d1a6f21a81b7a230a61beb8d5bc286cc23727f03c01dc5","blockSize":4194304,"blocks":["12e9a9bb1931c31811d1a6f21a81b7a230a61beb8d5bc286cc23727f03c01dc5"]},"offset":"12762377"},"isAbsoluteURL.js":{"size":561,"integrity":{"algorithm":"SHA256","hash":"ac0012f9bca951480bb6840f67b2be295817050666287e250f167aae87aa3e7a","blockSize":4194304,"blocks":["ac0012f9bca951480bb6840f67b2be295817050666287e250f167aae87aa3e7a"]},"offset":"12763104"},"isAxiosError.js":{"size":373,"integrity":{"algorithm":"SHA256","hash":"58c8375ecec13b841bd077a8b59f26a6af7d4b50182f7f52d856b12fc0dff8a6","blockSize":4194304,"blocks":["58c8375ecec13b841bd077a8b59f26a6af7d4b50182f7f52d856b12fc0dff8a6"]},"offset":"12763665"},"isURLSameOrigin.js":{"size":2305,"integrity":{"algorithm":"SHA256","hash":"9ee48fcc923e1d2dfd1b013575c6e1779dac2cde8bb44a6f552470b0af9718e7","blockSize":4194304,"blocks":["9ee48fcc923e1d2dfd1b013575c6e1779dac2cde8bb44a6f552470b0af9718e7"]},"offset":"12764038"},"normalizeHeaderName.js":{"size":357,"integrity":{"algorithm":"SHA256","hash":"64e9c46d4438800ab23965ccfcc2730fbd0cc49fad3f9caa1df1459a08a0b63e","blockSize":4194304,"blocks":["64e9c46d4438800ab23965ccfcc2730fbd0cc49fad3f9caa1df1459a08a0b63e"]},"offset":"12766343"},"null.js":{"size":58,"integrity":{"algorithm":"SHA256","hash":"e162cb2439abf6c4e37893d7df9585c145b23f1a8b8bb80c9dd11b0f29105199","blockSize":4194304,"blocks":["e162cb2439abf6c4e37893d7df9585c145b23f1a8b8bb80c9dd11b0f29105199"]},"offset":"12766700"},"parseHeaders.js":{"size":1393,"integrity":{"algorithm":"SHA256","hash":"6350505d1fb8d550707baa7cae667fd395d8dedf17edb303b05892d855b13c64","blockSize":4194304,"blocks":["6350505d1fb8d550707baa7cae667fd395d8dedf17edb303b05892d855b13c64"]},"offset":"12766758"},"parseProtocol.js":{"size":152,"integrity":{"algorithm":"SHA256","hash":"3586f095dc23121c5ba44f8a9d0136976e88d53d07038cbc7a01e58215f55423","blockSize":4194304,"blocks":["3586f095dc23121c5ba44f8a9d0136976e88d53d07038cbc7a01e58215f55423"]},"offset":"12768151"},"spread.js":{"size":564,"integrity":{"algorithm":"SHA256","hash":"b5198dc9dcf0a51dbe7fdef1393d917e871994ae08c192d7de8f1960f6a6aee2","blockSize":4194304,"blocks":["b5198dc9dcf0a51dbe7fdef1393d917e871994ae08c192d7de8f1960f6a6aee2"]},"offset":"12768303"},"toFormData.js":{"size":1784,"integrity":{"algorithm":"SHA256","hash":"4e6e9531fb98119defb1bd1bb3259b68d1d6d69a75262645f2c8e68ce51518d2","blockSize":4194304,"blocks":["4e6e9531fb98119defb1bd1bb3259b68d1d6d69a75262645f2c8e68ce51518d2"]},"offset":"12768867"},"validator.js":{"size":2555,"integrity":{"algorithm":"SHA256","hash":"22224aad7904e2d8f36e58174b1aed90ef802cd8fab900859c5d6d1d03487264","blockSize":4194304,"blocks":["22224aad7904e2d8f36e58174b1aed90ef802cd8fab900859c5d6d1d03487264"]},"offset":"12770651"}}},"env":{"files":{"README.md":{"size":131,"integrity":{"algorithm":"SHA256","hash":"9edc67c3c914a8eb30a6d8ccc12d6ccf21937af25bbd05b6176647dbbec13b50","blockSize":4194304,"blocks":["9edc67c3c914a8eb30a6d8ccc12d6ccf21937af25bbd05b6176647dbbec13b50"]},"offset":"12773206"},"data.js":{"size":43,"integrity":{"algorithm":"SHA256","hash":"20d0ece3c8da63e8af41289da66692b16d162a58993440f29eee22572a0ab3cf","blockSize":4194304,"blocks":["20d0ece3c8da63e8af41289da66692b16d162a58993440f29eee22572a0ab3cf"]},"offset":"12773337"}}},"defaults":{"files":{"index.js":{"size":4071,"integrity":{"algorithm":"SHA256","hash":"4b61373fae078a4944f66114dbbad94debbfabc3eb33d8c83c2e561ddcd1ecfa","blockSize":4194304,"blocks":["4b61373fae078a4944f66114dbbad94debbfabc3eb33d8c83c2e561ddcd1ecfa"]},"offset":"12773380"},"transitional.js":{"size":120,"integrity":{"algorithm":"SHA256","hash":"e2c9e049f59d9e47680b572ee3e60e1df8e965c10514fb6d9c0e2cb3418e797e","blockSize":4194304,"blocks":["e2c9e049f59d9e47680b572ee3e60e1df8e965c10514fb6d9c0e2cb3418e797e"]},"offset":"12777451"},"env":{"files":{"FormData.js":{"size":74,"integrity":{"algorithm":"SHA256","hash":"66724b8b3995af4b9c1cc7e6bcbb3ff0b90654c0359d5c8250383f681d4639a7","blockSize":4194304,"blocks":["66724b8b3995af4b9c1cc7e6bcbb3ff0b90654c0359d5c8250383f681d4639a7"]},"offset":"12777571"}}}}},"core":{"files":{"Axios.js":{"size":4582,"integrity":{"algorithm":"SHA256","hash":"41108fa2000c76e8ab03c34da5576acf350918de83719f6f249a3ef4783d69ef","blockSize":4194304,"blocks":["41108fa2000c76e8ab03c34da5576acf350918de83719f6f249a3ef4783d69ef"]},"offset":"12777645"},"AxiosError.js":{"size":2254,"integrity":{"algorithm":"SHA256","hash":"ee199a6641ab8261e3c434ac5b95552b27f8c7b371e23fd3fd063eedad1942bf","blockSize":4194304,"blocks":["ee199a6641ab8261e3c434ac5b95552b27f8c7b371e23fd3fd063eedad1942bf"]},"offset":"12782227"},"InterceptorManager.js":{"size":1363,"integrity":{"algorithm":"SHA256","hash":"db8154428c6365e4c6a84d6098c12be35794218034dc251a6407c7d550981257","blockSize":4194304,"blocks":["db8154428c6365e4c6a84d6098c12be35794218034dc251a6407c7d550981257"]},"offset":"12784481"},"README.md":{"size":399,"integrity":{"algorithm":"SHA256","hash":"6982a869f4da4405a7b74e182ca2eea0da2ade583edd606d182bfc49aee4cd2a","blockSize":4194304,"blocks":["6982a869f4da4405a7b74e182ca2eea0da2ade583edd606d182bfc49aee4cd2a"]},"offset":"12785844"},"buildFullPath.js":{"size":695,"integrity":{"algorithm":"SHA256","hash":"0638de5fcbc775b6f5201831791fb9ecfb89a2b690b3fe814c8e3de80bf2affb","blockSize":4194304,"blocks":["0638de5fcbc775b6f5201831791fb9ecfb89a2b690b3fe814c8e3de80bf2affb"]},"offset":"12786243"},"dispatchRequest.js":{"size":2140,"integrity":{"algorithm":"SHA256","hash":"5802d8c24c1a1eea165059991ffb30d0fd7d62fb9af9af6654d213bb734d400d","blockSize":4194304,"blocks":["5802d8c24c1a1eea165059991ffb30d0fd7d62fb9af9af6654d213bb734d400d"]},"offset":"12786938"},"mergeConfig.js":{"size":3235,"integrity":{"algorithm":"SHA256","hash":"cd47ea0de85b3677bc70902084bc0feb3e23f3aaae1ff8d04c3f0a2991f2f4ab","blockSize":4194304,"blocks":["cd47ea0de85b3677bc70902084bc0feb3e23f3aaae1ff8d04c3f0a2991f2f4ab"]},"offset":"12789078"},"settle.js":{"size":799,"integrity":{"algorithm":"SHA256","hash":"15b2f8e1cfd844cfed0d472ff0d549da8850b77f5414e872fa0657a67f8ac2a6","blockSize":4194304,"blocks":["15b2f8e1cfd844cfed0d472ff0d549da8850b77f5414e872fa0657a67f8ac2a6"]},"offset":"12792313"},"transformData.js":{"size":637,"integrity":{"algorithm":"SHA256","hash":"8067e2fb0ee33676096ee19d558f9625381c6b839523d5d7a42753b4276a243a","blockSize":4194304,"blocks":["8067e2fb0ee33676096ee19d558f9625381c6b839523d5d7a42753b4276a243a"]},"offset":"12793112"}}},"cancel":{"files":{"CancelToken.js":{"size":2497,"integrity":{"algorithm":"SHA256","hash":"d1f2acbbb7fe5d22e0f1983866eb462146d0f9d9a8966fc84ef9b591eace1ef2","blockSize":4194304,"blocks":["d1f2acbbb7fe5d22e0f1983866eb462146d0f9d9a8966fc84ef9b591eace1ef2"]},"offset":"12793749"},"CanceledError.js":{"size":545,"integrity":{"algorithm":"SHA256","hash":"20aa1215c8c94cd70c040f75659161c44d31aca875b262c4b96e89aa4d35b163","blockSize":4194304,"blocks":["20aa1215c8c94cd70c040f75659161c44d31aca875b262c4b96e89aa4d35b163"]},"offset":"12796246"},"isCancel.js":{"size":102,"integrity":{"algorithm":"SHA256","hash":"2357b93dae3ead850f3f61ce960a90dc6275f67b339a68da6f50348149081222","blockSize":4194304,"blocks":["2357b93dae3ead850f3f61ce960a90dc6275f67b339a68da6f50348149081222"]},"offset":"12796791"}}},"adapters":{"files":{"README.md":{"size":915,"integrity":{"algorithm":"SHA256","hash":"9b5964e5282869527662da5236c9136098456f71e1cb29ff3e14363acc9b6b22","blockSize":4194304,"blocks":["9b5964e5282869527662da5236c9136098456f71e1cb29ff3e14363acc9b6b22"]},"offset":"12796893"},"http.js":{"size":14145,"integrity":{"algorithm":"SHA256","hash":"5447dd85f650b53a32c0744f9c45952a8bf07a0f4bbc555242a43cc8d2173085","blockSize":4194304,"blocks":["5447dd85f650b53a32c0744f9c45952a8bf07a0f4bbc555242a43cc8d2173085"]},"offset":"12797808"},"xhr.js":{"size":7391,"integrity":{"algorithm":"SHA256","hash":"8110a6e12c41b4dfc54fd07ff56add609c6422156b8808db103fbb1d1a321f99","blockSize":4194304,"blocks":["8110a6e12c41b4dfc54fd07ff56add609c6422156b8808db103fbb1d1a321f99"]},"offset":"12811953"}}}}},"dist":{"files":{"axios.js":{"size":73004,"integrity":{"algorithm":"SHA256","hash":"20c84668927c5f6be980a88ef11dfe69836256c3598da239190cbe8fb1587f10","blockSize":4194304,"blocks":["20c84668927c5f6be980a88ef11dfe69836256c3598da239190cbe8fb1587f10"]},"offset":"12819344"},"axios.min.js":{"size":20763,"integrity":{"algorithm":"SHA256","hash":"e373b70a5167485c73a265421bcfcd1fdddbae49c9c51605e6d2918a3de4ae0d","blockSize":4194304,"blocks":["e373b70a5167485c73a265421bcfcd1fdddbae49c9c51605e6d2918a3de4ae0d"]},"offset":"12892348"}}},"node_modules":{"files":{"form-data":{"files":{"License":{"size":1118,"integrity":{"algorithm":"SHA256","hash":"e5b780d4f38d1d3328e3e53186c4e62d3fa149ea6f2bacd5de5ad0c30ac85343","blockSize":4194304,"blocks":["e5b780d4f38d1d3328e3e53186c4e62d3fa149ea6f2bacd5de5ad0c30ac85343"]},"offset":"41515758"},"README.md.bak":{"size":12070,"integrity":{"algorithm":"SHA256","hash":"c582a1729e728332fc30b1f9d5a87c52c47e107cc2797a8c93055ea87b1e9fe9","blockSize":4194304,"blocks":["c582a1729e728332fc30b1f9d5a87c52c47e107cc2797a8c93055ea87b1e9fe9"]},"offset":"41516876"},"package.json":{"size":1268,"integrity":{"algorithm":"SHA256","hash":"c2523c5dd90f778f0751d11632c567e8db5ee76003bf4f42f069005471b4226c","blockSize":4194304,"blocks":["c2523c5dd90f778f0751d11632c567e8db5ee76003bf4f42f069005471b4226c"]},"offset":"41528946"},"lib":{"files":{"browser.js":{"size":101,"integrity":{"algorithm":"SHA256","hash":"cf5b0957442886388f424790b303b5b855d7ef227f68163114aae79f6b212f37","blockSize":4194304,"blocks":["cf5b0957442886388f424790b303b5b855d7ef227f68163114aae79f6b212f37"]},"offset":"41530214"},"form_data.js":{"size":13715,"integrity":{"algorithm":"SHA256","hash":"65f1e9a852f2c1dc42db54e8b2a13dc4b65a2e26c8076cf19116ac93fa091bd6","blockSize":4194304,"blocks":["65f1e9a852f2c1dc42db54e8b2a13dc4b65a2e26c8076cf19116ac93fa091bd6"]},"offset":"41530315"},"populate.js":{"size":177,"integrity":{"algorithm":"SHA256","hash":"0a273800c22bc3600522aa951135210817eaf3e059d3cf1fbd7a5ba0dc5cb576","blockSize":4194304,"blocks":["0a273800c22bc3600522aa951135210817eaf3e059d3cf1fbd7a5ba0dc5cb576"]},"offset":"41544030"}}}}}}}}},"balanced-match":{"files":{"LICENSE.md":{"size":1096,"integrity":{"algorithm":"SHA256","hash":"a1bd5deadb6a06dd74efa852c1b8b23f63b67f2214fbe9c8bd591da51da69268","blockSize":4194304,"blocks":["a1bd5deadb6a06dd74efa852c1b8b23f63b67f2214fbe9c8bd591da51da69268"]},"offset":"12913111"},"index.js":{"size":1219,"integrity":{"algorithm":"SHA256","hash":"06e4d0037715251cb3be2b2db063662f555b3538d9e30a9c517a54374d941cbc","blockSize":4194304,"blocks":["06e4d0037715251cb3be2b2db063662f555b3538d9e30a9c517a54374d941cbc"]},"offset":"12914207"},"package.json":{"size":891,"integrity":{"algorithm":"SHA256","hash":"b4cfa3b375d23e8e979227e68db4d4ea1e810328458c78390886f2fd1df5740e","blockSize":4194304,"blocks":["b4cfa3b375d23e8e979227e68db4d4ea1e810328458c78390886f2fd1df5740e"]},"offset":"12915426"},".github":{"files":{"FUNDING.yml":{"size":53,"integrity":{"algorithm":"SHA256","hash":"dda068232e4c62c70475945b843a5e1158cb6f1dd0cf64262db6b9e5a14b74cc","blockSize":4194304,"blocks":["dda068232e4c62c70475945b843a5e1158cb6f1dd0cf64262db6b9e5a14b74cc"]},"offset":"12916317"}}}}},"base64-js":{"files":{"LICENSE":{"size":1081,"integrity":{"algorithm":"SHA256","hash":"5b37224c080cdcc97c871ada971c224e9926370fe74f11b539aa1cf9f3b1aca1","blockSize":4194304,"blocks":["5b37224c080cdcc97c871ada971c224e9926370fe74f11b539aa1cf9f3b1aca1"]},"offset":"12916370"},"base64js.min.js":{"size":2192,"integrity":{"algorithm":"SHA256","hash":"d2e82495607abf54f16e21de04d90ba9ce1605451667d88425babece988f148b","blockSize":4194304,"blocks":["d2e82495607abf54f16e21de04d90ba9ce1605451667d88425babece988f148b"]},"offset":"12917451"},"index.js":{"size":3932,"integrity":{"algorithm":"SHA256","hash":"829eadd8a1a441d25be0cb93b00e16a0d0c20fd294db95d8f2ed87e6954b7182","blockSize":4194304,"blocks":["829eadd8a1a441d25be0cb93b00e16a0d0c20fd294db95d8f2ed87e6954b7182"]},"offset":"12919643"},"package.json":{"size":814,"integrity":{"algorithm":"SHA256","hash":"99dbc783b6b6ad7c38ad7734fce408f359ecb280f14fef106d20e7ea3dc9d697","blockSize":4194304,"blocks":["99dbc783b6b6ad7c38ad7734fce408f359ecb280f14fef106d20e7ea3dc9d697"]},"offset":"12923575"}}},"bl":{"files":{"BufferList.js":{"size":9524,"integrity":{"algorithm":"SHA256","hash":"cb21ad5d2dd255e2195460ecd5a0bdd65cff0adee2a9fd6c860951c22c9fd4b8","blockSize":4194304,"blocks":["cb21ad5d2dd255e2195460ecd5a0bdd65cff0adee2a9fd6c860951c22c9fd4b8"]},"offset":"12924389"},"LICENSE.md":{"size":1216,"integrity":{"algorithm":"SHA256","hash":"9377db95383c8befacf05c6e465d969d756edf178487ca1344fdf3ba147c596f","blockSize":4194304,"blocks":["9377db95383c8befacf05c6e465d969d756edf178487ca1344fdf3ba147c596f"]},"offset":"12933913"},"bl.js":{"size":2043,"integrity":{"algorithm":"SHA256","hash":"71e59aeed4af10ad4268bb35e4c51fe89c640ea9a3f1a9cb597594b02376e249","blockSize":4194304,"blocks":["71e59aeed4af10ad4268bb35e4c51fe89c640ea9a3f1a9cb597594b02376e249"]},"offset":"12935129"},"package.json":{"size":763,"integrity":{"algorithm":"SHA256","hash":"82e1f45afd7dfb0b29edcd0cca1f3569fe9dc219ce84234b1046ec36b73ea750","blockSize":4194304,"blocks":["82e1f45afd7dfb0b29edcd0cca1f3569fe9dc219ce84234b1046ec36b73ea750"]},"offset":"12937172"}}},"bluebird":{"files":{"LICENSE":{"size":1086,"integrity":{"algorithm":"SHA256","hash":"87092fe7ffd1e92eba5d1dd39b73a73fdb4fdd4df3474beacc3d9f6b08ece82c","blockSize":4194304,"blocks":["87092fe7ffd1e92eba5d1dd39b73a73fdb4fdd4df3474beacc3d9f6b08ece82c"]},"offset":"12937935"},"package.json":{"size":1344,"integrity":{"algorithm":"SHA256","hash":"928a84268fb3c9e44741ae82faf15d33a6d1d3e0b6fa468ec6ba95069b4751b3","blockSize":4194304,"blocks":["928a84268fb3c9e44741ae82faf15d33a6d1d3e0b6fa468ec6ba95069b4751b3"]},"offset":"12939021"},"js":{"files":{"release":{"files":{"any.js":{"size":421,"integrity":{"algorithm":"SHA256","hash":"bbfe88f1a68351302da229bf667fbee8b264c0fd034ac4990507d4482e713161","blockSize":4194304,"blocks":["bbfe88f1a68351302da229bf667fbee8b264c0fd034ac4990507d4482e713161"]},"offset":"12940365"},"assert.js":{"size":1653,"integrity":{"algorithm":"SHA256","hash":"c5a78e45513f173c7ee9e0beab46307ee0059d4d0098ba015ea2279f17a33dde","blockSize":4194304,"blocks":["c5a78e45513f173c7ee9e0beab46307ee0059d4d0098ba015ea2279f17a33dde"]},"offset":"12940786"},"async.js":{"size":2876,"integrity":{"algorithm":"SHA256","hash":"2bd6c88aec3118d1803e85d2df99de5a7218a96a01f094d52c988265422fcf4f","blockSize":4194304,"blocks":["2bd6c88aec3118d1803e85d2df99de5a7218a96a01f094d52c988265422fcf4f"]},"offset":"12942439"},"bind.js":{"size":1970,"integrity":{"algorithm":"SHA256","hash":"027add87d1c0065356c6342a2d13b16379fedc72c8a6c418681be3a6a8b46638","blockSize":4194304,"blocks":["027add87d1c0065356c6342a2d13b16379fedc72c8a6c418681be3a6a8b46638"]},"offset":"12945315"},"bluebird.js":{"size":291,"integrity":{"algorithm":"SHA256","hash":"f1bd09cb349c59ace5126a4997b35d4e67785cf35886fe6a7112ac7142e526c4","blockSize":4194304,"blocks":["f1bd09cb349c59ace5126a4997b35d4e67785cf35886fe6a7112ac7142e526c4"]},"offset":"12947285"},"call_get.js":{"size":4355,"integrity":{"algorithm":"SHA256","hash":"4235f9f702503faf32903d2fa0d454279ab01c27497e4d7469720e33df6990a9","blockSize":4194304,"blocks":["4235f9f702503faf32903d2fa0d454279ab01c27497e4d7469720e33df6990a9"]},"offset":"12947576"},"cancel.js":{"size":3707,"integrity":{"algorithm":"SHA256","hash":"ec055832b95e24e25411386a789a4c0f93e7623a118e451e30d1ee5843c689b2","blockSize":4194304,"blocks":["ec055832b95e24e25411386a789a4c0f93e7623a118e451e30d1ee5843c689b2"]},"offset":"12951931"},"catch_filter.js":{"size":1426,"integrity":{"algorithm":"SHA256","hash":"11da610579c2289aa0b5e59fd772ac8b30d24d748a0092a20753db6d703bb9e0","blockSize":4194304,"blocks":["11da610579c2289aa0b5e59fd772ac8b30d24d748a0092a20753db6d703bb9e0"]},"offset":"12955638"},"context.js":{"size":2382,"integrity":{"algorithm":"SHA256","hash":"5d8d6bc5941153a0756f61a807e84b1ddf60eb2b9d57227263d12fbca1b70a5e","blockSize":4194304,"blocks":["5d8d6bc5941153a0756f61a807e84b1ddf60eb2b9d57227263d12fbca1b70a5e"]},"offset":"12957064"},"debuggability.js":{"size":32170,"integrity":{"algorithm":"SHA256","hash":"4702ca8443b7989aec697e104c7c8be4a36388d443505e33e24ad5199b9a403c","blockSize":4194304,"blocks":["4702ca8443b7989aec697e104c7c8be4a36388d443505e33e24ad5199b9a403c"]},"offset":"12959446"},"direct_resolve.js":{"size":1395,"integrity":{"algorithm":"SHA256","hash":"7dd03025ad5580294f5b8f062f7141ca60fd84817ffa58367ddca53aad185afb","blockSize":4194304,"blocks":["7dd03025ad5580294f5b8f062f7141ca60fd84817ffa58367ddca53aad185afb"]},"offset":"12991616"},"each.js":{"size":789,"integrity":{"algorithm":"SHA256","hash":"e5a9bf63cf9e9a81525ee2ae015bed8d66e081c4fceceb60d1791fdcf38a1b14","blockSize":4194304,"blocks":["e5a9bf63cf9e9a81525ee2ae015bed8d66e081c4fceceb60d1791fdcf38a1b14"]},"offset":"12993011"},"errors.js":{"size":3717,"integrity":{"algorithm":"SHA256","hash":"f1537f1b41673a75a0b9c60a0647c628561eaed4f2fae3d8188bb24abf333edc","blockSize":4194304,"blocks":["f1537f1b41673a75a0b9c60a0647c628561eaed4f2fae3d8188bb24abf333edc"]},"offset":"12993800"},"es5.js":{"size":1978,"integrity":{"algorithm":"SHA256","hash":"c510d8dab4de97c1f460d54ea79014c283841625148dc50073981300005dd42d","blockSize":4194304,"blocks":["c510d8dab4de97c1f460d54ea79014c283841625148dc50073981300005dd42d"]},"offset":"12997517"},"filter.js":{"size":314,"integrity":{"algorithm":"SHA256","hash":"5b52d1f2e402abca8e1e203687a3157f4b2c2a2ed1a9bee69b6c51c1b44e4992","blockSize":4194304,"blocks":["5b52d1f2e402abca8e1e203687a3157f4b2c2a2ed1a9bee69b6c51c1b44e4992"]},"offset":"12999495"},"finally.js":{"size":4613,"integrity":{"algorithm":"SHA256","hash":"0e4fc9127e68b0b9d942bef674a0352f73f0874c6f66f3402d05a7a11db67b98","blockSize":4194304,"blocks":["0e4fc9127e68b0b9d942bef674a0352f73f0874c6f66f3402d05a7a11db67b98"]},"offset":"12999809"},"generators.js":{"size":7761,"integrity":{"algorithm":"SHA256","hash":"ec685635bd9420319eac3959b8f44657f66545fb350d1be402c48c955a57032f","blockSize":4194304,"blocks":["ec685635bd9420319eac3959b8f44657f66545fb350d1be402c48c955a57032f"]},"offset":"13004422"},"join.js":{"size":8136,"integrity":{"algorithm":"SHA256","hash":"4052ccd7ee41d565b3a8944f5f95f0f473c866e649a981804c1cb7f3055b4980","blockSize":4194304,"blocks":["4052ccd7ee41d565b3a8944f5f95f0f473c866e649a981804c1cb7f3055b4980"]},"offset":"13012183"},"map.js":{"size":5602,"integrity":{"algorithm":"SHA256","hash":"9e332673acc9c81d82e75147b8c2f90134c9e59b3dc4d1bb538249751c087ea5","blockSize":4194304,"blocks":["9e332673acc9c81d82e75147b8c2f90134c9e59b3dc4d1bb538249751c087ea5"]},"offset":"13020319"},"method.js":{"size":1768,"integrity":{"algorithm":"SHA256","hash":"f115e74eac654538838eb7fb971bf39d2548b28ae90e25b758c67f16450484f6","blockSize":4194304,"blocks":["f115e74eac654538838eb7fb971bf39d2548b28ae90e25b758c67f16450484f6"]},"offset":"13025921"},"nodeback.js":{"size":1560,"integrity":{"algorithm":"SHA256","hash":"4888e4fe1fd7d1e1eeb7552e5158bec0f7b7ec538180780941289a55aa1172b5","blockSize":4194304,"blocks":["4888e4fe1fd7d1e1eeb7552e5158bec0f7b7ec538180780941289a55aa1172b5"]},"offset":"13027689"},"nodeify.js":{"size":1647,"integrity":{"algorithm":"SHA256","hash":"045087125fdb791c743850f717a2f64091577cdd658cf89d169921c65fcb1f82","blockSize":4194304,"blocks":["045087125fdb791c743850f717a2f64091577cdd658cf89d169921c65fcb1f82"]},"offset":"13029249"},"promise.js":{"size":26986,"integrity":{"algorithm":"SHA256","hash":"22641fab9aa4c7f2962f21aa652b685ded8a9ec88b0f0915b524948bfa644415","blockSize":4194304,"blocks":["22641fab9aa4c7f2962f21aa652b685ded8a9ec88b0f0915b524948bfa644415"]},"offset":"13030896"},"promise_array.js":{"size":5252,"integrity":{"algorithm":"SHA256","hash":"e7440944ec46fb2efcea9fe0a7d7e11d1fc1612e56d5169aebe8d5aa6e77d858","blockSize":4194304,"blocks":["e7440944ec46fb2efcea9fe0a7d7e11d1fc1612e56d5169aebe8d5aa6e77d858"]},"offset":"13057882"},"promisify.js":{"size":12182,"integrity":{"algorithm":"SHA256","hash":"26e51d82eb41aaaafef54ca34b350bd00a4e2bd6648417371386e7bc0614895e","blockSize":4194304,"blocks":["26e51d82eb41aaaafef54ca34b350bd00a4e2bd6648417371386e7bc0614895e"]},"offset":"13063134"},"props.js":{"size":3117,"integrity":{"algorithm":"SHA256","hash":"041f70b6ea4793666240c3e1943e698280ae14bf4ee4145929f426897e2aa1e5","blockSize":4194304,"blocks":["041f70b6ea4793666240c3e1943e698280ae14bf4ee4145929f426897e2aa1e5"]},"offset":"13075316"},"queue.js":{"size":1873,"integrity":{"algorithm":"SHA256","hash":"683aab2037414e069b2a5f48d39fb4ee5e1ab808c97b2b218ec12c2520b10c82","blockSize":4194304,"blocks":["683aab2037414e069b2a5f48d39fb4ee5e1ab808c97b2b218ec12c2520b10c82"]},"offset":"13078433"},"race.js":{"size":1250,"integrity":{"algorithm":"SHA256","hash":"524ac44ed8e2f7f767d7ab197296dbb99e99c0497e99b22a296e36e881563168","blockSize":4194304,"blocks":["524ac44ed8e2f7f767d7ab197296dbb99e99c0497e99b22a296e36e881563168"]},"offset":"13080306"},"reduce.js":{"size":5372,"integrity":{"algorithm":"SHA256","hash":"ea786fef0636a22d8936bdde491befb2bcedc61c233ca5c5cde765a44336e24e","blockSize":4194304,"blocks":["ea786fef0636a22d8936bdde491befb2bcedc61c233ca5c5cde765a44336e24e"]},"offset":"13081556"},"schedule.js":{"size":2148,"integrity":{"algorithm":"SHA256","hash":"a3eb3623c5859a27ccf24706b5210c1107dc65aab572a202513bba9a1ebec906","blockSize":4194304,"blocks":["a3eb3623c5859a27ccf24706b5210c1107dc65aab572a202513bba9a1ebec906"]},"offset":"13086928"},"settle.js":{"size":1366,"integrity":{"algorithm":"SHA256","hash":"dd417954d705db69eac3045f6dfb55e26af071d8dbe5392a7f36cee86f2404d9","blockSize":4194304,"blocks":["dd417954d705db69eac3045f6dfb55e26af071d8dbe5392a7f36cee86f2404d9"]},"offset":"13089076"},"some.js":{"size":3959,"integrity":{"algorithm":"SHA256","hash":"b098cf5e52f0351dae1c99f60a40c601dee9e28bfde356af1b5454e1f2c36c7d","blockSize":4194304,"blocks":["b098cf5e52f0351dae1c99f60a40c601dee9e28bfde356af1b5454e1f2c36c7d"]},"offset":"13090442"},"synchronous_inspection.js":{"size":2813,"integrity":{"algorithm":"SHA256","hash":"b26a61e1dfe74d2118dbd230071fcd7877b63f987639e00daea43c8a5fdfc50a","blockSize":4194304,"blocks":["b26a61e1dfe74d2118dbd230071fcd7877b63f987639e00daea43c8a5fdfc50a"]},"offset":"13094401"},"thenables.js":{"size":2131,"integrity":{"algorithm":"SHA256","hash":"dbe1c7d0731e45596e20684a0e0ab0309c3cb29f57089169f3a375079affda6d","blockSize":4194304,"blocks":["dbe1c7d0731e45596e20684a0e0ab0309c3cb29f57089169f3a375079affda6d"]},"offset":"13097214"},"timers.js":{"size":2395,"integrity":{"algorithm":"SHA256","hash":"d75e79fa2a4be7887178ee21462a37bc609ee40105ab2150f48436ece4c2d8af","blockSize":4194304,"blocks":["d75e79fa2a4be7887178ee21462a37bc609ee40105ab2150f48436ece4c2d8af"]},"offset":"13099345"},"using.js":{"size":7525,"integrity":{"algorithm":"SHA256","hash":"f36839cef0b9fd56d9a1a2908b475511c4c821e33fff7937ab5704a83f2632eb","blockSize":4194304,"blocks":["f36839cef0b9fd56d9a1a2908b475511c4c821e33fff7937ab5704a83f2632eb"]},"offset":"13101740"},"util.js":{"size":11379,"integrity":{"algorithm":"SHA256","hash":"dfd00225b097b2731d9091749be37c18c418e2da59045e54e11d4df80b3ccae5","blockSize":4194304,"blocks":["dfd00225b097b2731d9091749be37c18c418e2da59045e54e11d4df80b3ccae5"]},"offset":"13109265"}}},"browser":{"files":{"bluebird.core.js":{"size":123379,"integrity":{"algorithm":"SHA256","hash":"76a26146580122f106508e66d178c25c589e7f1a7ecfc096f9a9bd7c8a8cae09","blockSize":4194304,"blocks":["76a26146580122f106508e66d178c25c589e7f1a7ecfc096f9a9bd7c8a8cae09"]},"offset":"13120644"},"bluebird.core.min.js":{"size":57355,"integrity":{"algorithm":"SHA256","hash":"7b2e1cea02fda77d2d30a3c676a3fad4d008f62b7ae4adc77563e94b6e74c3d3","blockSize":4194304,"blocks":["7b2e1cea02fda77d2d30a3c676a3fad4d008f62b7ae4adc77563e94b6e74c3d3"]},"offset":"13244023"},"bluebird.js":{"size":183390,"integrity":{"algorithm":"SHA256","hash":"2584e7871b3d869fcba965cf8f1f30e962d60019931a0b88cc474fd99f80822f","blockSize":4194304,"blocks":["2584e7871b3d869fcba965cf8f1f30e962d60019931a0b88cc474fd99f80822f"]},"offset":"13301378"},"bluebird.min.js":{"size":81530,"integrity":{"algorithm":"SHA256","hash":"bd5da4364c94b11a9e56f0d0388439082ef6d3b29c15255ac17bad40abe0c248","blockSize":4194304,"blocks":["bd5da4364c94b11a9e56f0d0388439082ef6d3b29c15255ac17bad40abe0c248"]},"offset":"13484768"}}}}}}},"body-parser":{"files":{"HISTORY.md":{"size":16192,"integrity":{"algorithm":"SHA256","hash":"a6eadfdd326bbaaccb2f0596d6624d0bfe4e502c51e2dc723fd84e333676f8bc","blockSize":4194304,"blocks":["a6eadfdd326bbaaccb2f0596d6624d0bfe4e502c51e2dc723fd84e333676f8bc"]},"offset":"13566298"},"LICENSE":{"size":1172,"integrity":{"algorithm":"SHA256","hash":"23d466b1b134b415b66fa50c6526b4cf3e7b9258554da88d3abb371721e7ce68","blockSize":4194304,"blocks":["23d466b1b134b415b66fa50c6526b4cf3e7b9258554da88d3abb371721e7ce68"]},"offset":"13582490"},"SECURITY.md":{"size":1193,"integrity":{"algorithm":"SHA256","hash":"0448ff6c00a9d808b70c4adba9e6c6e1d81569bbb0abcb335e1dd6f453b83334","blockSize":4194304,"blocks":["0448ff6c00a9d808b70c4adba9e6c6e1d81569bbb0abcb335e1dd6f453b83334"]},"offset":"13583662"},"index.js":{"size":2656,"integrity":{"algorithm":"SHA256","hash":"d584d690e2a5ffa3b9e7f13db3939a344d34f7ca38dc09b45af7c2fa7fe454e4","blockSize":4194304,"blocks":["d584d690e2a5ffa3b9e7f13db3939a344d34f7ca38dc09b45af7c2fa7fe454e4"]},"offset":"13584855"},"package.json":{"size":1060,"integrity":{"algorithm":"SHA256","hash":"f7726d0378a778c22517ee0d0bd0c2bfcb4ffb4a1ecce2b7a527850bf49ed027","blockSize":4194304,"blocks":["f7726d0378a778c22517ee0d0bd0c2bfcb4ffb4a1ecce2b7a527850bf49ed027"]},"offset":"13587511"},"lib":{"files":{"read.js":{"size":4325,"integrity":{"algorithm":"SHA256","hash":"1e9e274755366c39ae70e8b9a7a42fc12219566e67efaf9b7ebc2a8b337f5b6b","blockSize":4194304,"blocks":["1e9e274755366c39ae70e8b9a7a42fc12219566e67efaf9b7ebc2a8b337f5b6b"]},"offset":"13588571"},"types":{"files":{"json.js":{"size":5012,"integrity":{"algorithm":"SHA256","hash":"fba069b0aa7b1789a03deaaa5f4f1bc238ced7299d174d2e6fe95d30dc02f865","blockSize":4194304,"blocks":["fba069b0aa7b1789a03deaaa5f4f1bc238ced7299d174d2e6fe95d30dc02f865"]},"offset":"13592896"},"raw.js":{"size":1884,"integrity":{"algorithm":"SHA256","hash":"4e9cc80a7ee8bd667c68c264b4c374b28e731246ddb6ec22c3968daf837e30a2","blockSize":4194304,"blocks":["4e9cc80a7ee8bd667c68c264b4c374b28e731246ddb6ec22c3968daf837e30a2"]},"offset":"13597908"},"text.js":{"size":2285,"integrity":{"algorithm":"SHA256","hash":"54a6e8ef720b06a300b21f6c60387805dec743a64154784a609dfe8c6860776a","blockSize":4194304,"blocks":["54a6e8ef720b06a300b21f6c60387805dec743a64154784a609dfe8c6860776a"]},"offset":"13599792"},"urlencoded.js":{"size":5797,"integrity":{"algorithm":"SHA256","hash":"752717d87aad57451638af2073b04eba964f348910c0bcf0070c43e732de5eb2","blockSize":4194304,"blocks":["752717d87aad57451638af2073b04eba964f348910c0bcf0070c43e732de5eb2"]},"offset":"13602077"}}}}},"node_modules":{"files":{"bytes":{"files":{"History.md":{"size":1775,"integrity":{"algorithm":"SHA256","hash":"b335e48648e33bd56c3bcadbdad4c5a8b419099e7369d3dc845c106ddb49fc1c","blockSize":4194304,"blocks":["b335e48648e33bd56c3bcadbdad4c5a8b419099e7369d3dc845c106ddb49fc1c"]},"offset":"41544207"},"LICENSE":{"size":1153,"integrity":{"algorithm":"SHA256","hash":"e3b44af066615de2ea48d18d852d0762f18c0b2efcea714fa48a6f729d405b85","blockSize":4194304,"blocks":["e3b44af066615de2ea48d18d852d0762f18c0b2efcea714fa48a6f729d405b85"]},"offset":"41545982"},"index.js":{"size":3613,"integrity":{"algorithm":"SHA256","hash":"893fcbbbe962dc00e40dc2e4b20e76e92d874dd257345003c6575d940e91a37f","blockSize":4194304,"blocks":["893fcbbbe962dc00e40dc2e4b20e76e92d874dd257345003c6575d940e91a37f"]},"offset":"41547135"},"package.json":{"size":514,"integrity":{"algorithm":"SHA256","hash":"8a7d291b5d45da5e6f045d601d0c7bd0af26c2b71463dcf34cee58144e5474a3","blockSize":4194304,"blocks":["8a7d291b5d45da5e6f045d601d0c7bd0af26c2b71463dcf34cee58144e5474a3"]},"offset":"41550748"}}},"debug":{"files":{"LICENSE":{"size":1107,"integrity":{"algorithm":"SHA256","hash":"98c970de440dcfc77471610aec2377c9d9b0db2b3be6d1add524a586e1d7f422","blockSize":4194304,"blocks":["98c970de440dcfc77471610aec2377c9d9b0db2b3be6d1add524a586e1d7f422"]},"offset":"41551262"},"Makefile":{"size":1059,"integrity":{"algorithm":"SHA256","hash":"f6466507e02c62f14e477af08e4a13ec883152b54d87feeffb8f0d6de6e9013b","blockSize":4194304,"blocks":["f6466507e02c62f14e477af08e4a13ec883152b54d87feeffb8f0d6de6e9013b"]},"offset":"41552369"},"component.json":{"size":321,"integrity":{"algorithm":"SHA256","hash":"2e5ab9ae90f41699e00d00fca16765024f437300a0568c2208669cc281ba7656","blockSize":4194304,"blocks":["2e5ab9ae90f41699e00d00fca16765024f437300a0568c2208669cc281ba7656"]},"offset":"41553428"},"node.js":{"size":40,"integrity":{"algorithm":"SHA256","hash":"996b381f353555cb172ebb2802bb2a7323442ff67b7b530cc26834058d7f31a2","blockSize":4194304,"blocks":["996b381f353555cb172ebb2802bb2a7323442ff67b7b530cc26834058d7f31a2"]},"offset":"41553749"},"package.json":{"size":947,"integrity":{"algorithm":"SHA256","hash":"9eaf6733d4c4fe3dd77abadf7ebafa6acafbfe9a9484e717c262ca8a0ee88e3a","blockSize":4194304,"blocks":["9eaf6733d4c4fe3dd77abadf7ebafa6acafbfe9a9484e717c262ca8a0ee88e3a"]},"offset":"41553789"},"src":{"files":{"browser.js":{"size":4734,"integrity":{"algorithm":"SHA256","hash":"0144ab6a52b9330c567de11a5c3a4aea35cdac47a4c106482aa24ae8054cdc6f","blockSize":4194304,"blocks":["0144ab6a52b9330c567de11a5c3a4aea35cdac47a4c106482aa24ae8054cdc6f"]},"offset":"41554736"},"debug.js":{"size":4394,"integrity":{"algorithm":"SHA256","hash":"d8d1c1d6c387ab67c3f28d78fd0b20b9becd69442db9d3efe110ca464b509c8a","blockSize":4194304,"blocks":["d8d1c1d6c387ab67c3f28d78fd0b20b9becd69442db9d3efe110ca464b509c8a"]},"offset":"41559470"},"index.js":{"size":263,"integrity":{"algorithm":"SHA256","hash":"9a34fedeb2d269c46ed94e6f13039eb0d16d866dd460ec66fa3acd78122fa9fe","blockSize":4194304,"blocks":["9a34fedeb2d269c46ed94e6f13039eb0d16d866dd460ec66fa3acd78122fa9fe"]},"offset":"41563864"},"inspector-log.js":{"size":373,"integrity":{"algorithm":"SHA256","hash":"949ae67ec1b655694f83dce57d47d9d77234f9e7d698616932a90e69c7afee91","blockSize":4194304,"blocks":["949ae67ec1b655694f83dce57d47d9d77234f9e7d698616932a90e69c7afee91"]},"offset":"41564127"},"node.js":{"size":6015,"integrity":{"algorithm":"SHA256","hash":"a3e83594a4ce88997e2e4fc66bc942b17b9d736290ad62560c7f09d6d0989ad0","blockSize":4194304,"blocks":["a3e83594a4ce88997e2e4fc66bc942b17b9d736290ad62560c7f09d6d0989ad0"]},"offset":"41564500"}}}}},"iconv-lite":{"files":{"LICENSE":{"size":1064,"integrity":{"algorithm":"SHA256","hash":"ac779f7314c74f232ef847ea86e714abe25cf6eeb5cc97b69451b74e2af6492d","blockSize":4194304,"blocks":["ac779f7314c74f232ef847ea86e714abe25cf6eeb5cc97b69451b74e2af6492d"]},"offset":"41570515"},"package.json":{"size":782,"integrity":{"algorithm":"SHA256","hash":"1e36ea870ae39325c1e53e407b0a428254303f1a7033f80ae52095b5af4a7d6e","blockSize":4194304,"blocks":["1e36ea870ae39325c1e53e407b0a428254303f1a7033f80ae52095b5af4a7d6e"]},"offset":"41571579"},"lib":{"files":{"bom-handling.js":{"size":1109,"integrity":{"algorithm":"SHA256","hash":"c230d25d8e7fbb50960c634b636b71327c409e9a77e67fe9446b566bdcea362d","blockSize":4194304,"blocks":["c230d25d8e7fbb50960c634b636b71327c409e9a77e67fe9446b566bdcea362d"]},"offset":"41572361"},"extend-node.js":{"size":8701,"integrity":{"algorithm":"SHA256","hash":"7b86aebd7175d940c50f60eac1981490962855d9723bf971981ddd703ba6af43","blockSize":4194304,"blocks":["7b86aebd7175d940c50f60eac1981490962855d9723bf971981ddd703ba6af43"]},"offset":"41573470"},"index.js":{"size":5123,"integrity":{"algorithm":"SHA256","hash":"77d20e2fd5bcd9e324fb6cfdb909cd06fdaf6a91769adffcf4d7c4c066cce4c3","blockSize":4194304,"blocks":["77d20e2fd5bcd9e324fb6cfdb909cd06fdaf6a91769adffcf4d7c4c066cce4c3"]},"offset":"41582171"},"streams.js":{"size":3387,"integrity":{"algorithm":"SHA256","hash":"25a423eaf41f8dc6bc40cb28189a24e2d63b990ed72c824940bed55d0264ea6d","blockSize":4194304,"blocks":["25a423eaf41f8dc6bc40cb28189a24e2d63b990ed72c824940bed55d0264ea6d"]},"offset":"41587294"}}},"encodings":{"files":{"dbcs-codec.js":{"size":21415,"integrity":{"algorithm":"SHA256","hash":"d39bc17f93fc56af631b00e36542488923378cce5ad9e7db48252ce7a1e7b1ed","blockSize":4194304,"blocks":["d39bc17f93fc56af631b00e36542488923378cce5ad9e7db48252ce7a1e7b1ed"]},"offset":"41590681"},"dbcs-data.js":{"size":8291,"integrity":{"algorithm":"SHA256","hash":"e213f77e926605c30649ea48bcea851d1ec063bb17fa4c2ab6d3b64853b481ac","blockSize":4194304,"blocks":["e213f77e926605c30649ea48bcea851d1ec063bb17fa4c2ab6d3b64853b481ac"]},"offset":"41612096"},"index.js":{"size":710,"integrity":{"algorithm":"SHA256","hash":"69607a9ee51b63333d0e7ee20a38b52e1e96652a4bbc09c701d70835fbbfe10a","blockSize":4194304,"blocks":["69607a9ee51b63333d0e7ee20a38b52e1e96652a4bbc09c701d70835fbbfe10a"]},"offset":"41620387"},"internal.js":{"size":6115,"integrity":{"algorithm":"SHA256","hash":"39d9dd0568708a23c5999fcd6c417ec64f35ecbecd37205f91c7c6b59d14d773","blockSize":4194304,"blocks":["39d9dd0568708a23c5999fcd6c417ec64f35ecbecd37205f91c7c6b59d14d773"]},"offset":"41621097"},"sbcs-codec.js":{"size":2191,"integrity":{"algorithm":"SHA256","hash":"fb511c4c70a6cb0e2a06d03e67ca88dca9f4da6266b909c7338e453d2ecc9fdb","blockSize":4194304,"blocks":["fb511c4c70a6cb0e2a06d03e67ca88dca9f4da6266b909c7338e453d2ecc9fdb"]},"offset":"41627212"},"sbcs-data-generated.js":{"size":32034,"integrity":{"algorithm":"SHA256","hash":"2cf44b3f70c61c9cdd59fda7ec085bc3180809638f208c7239688ccb90a48866","blockSize":4194304,"blocks":["2cf44b3f70c61c9cdd59fda7ec085bc3180809638f208c7239688ccb90a48866"]},"offset":"41629403"},"sbcs-data.js":{"size":4686,"integrity":{"algorithm":"SHA256","hash":"3116c986bff5d0b3a0d9ee1700d97ac466965a7b30d353300d408b41622604c2","blockSize":4194304,"blocks":["3116c986bff5d0b3a0d9ee1700d97ac466965a7b30d353300d408b41622604c2"]},"offset":"41661437"},"utf16.js":{"size":5011,"integrity":{"algorithm":"SHA256","hash":"baf708be438edf0fef70a3e34619c6be94cd53d963acb9b2542419d5fc3bb8c8","blockSize":4194304,"blocks":["baf708be438edf0fef70a3e34619c6be94cd53d963acb9b2542419d5fc3bb8c8"]},"offset":"41666123"},"utf7.js":{"size":9215,"integrity":{"algorithm":"SHA256","hash":"c814ad268d19265ccafc9f7bba2e8dfcdd2afdea62698bb24b7284b3f2ea18a0","blockSize":4194304,"blocks":["c814ad268d19265ccafc9f7bba2e8dfcdd2afdea62698bb24b7284b3f2ea18a0"]},"offset":"41671134"},"tables":{"files":{"big5-added.json":{"size":17717,"integrity":{"algorithm":"SHA256","hash":"db94db5e5d3ab696ddb0025685cfa85da1864839a4a26aab2f8f86f6b8382288","blockSize":4194304,"blocks":["db94db5e5d3ab696ddb0025685cfa85da1864839a4a26aab2f8f86f6b8382288"]},"offset":"41680349"},"cp936.json":{"size":47320,"integrity":{"algorithm":"SHA256","hash":"8225bb693efd380279ed7280b8f8419fd069c5f018d20d5946bf187ad92c0cf7","blockSize":4194304,"blocks":["8225bb693efd380279ed7280b8f8419fd069c5f018d20d5946bf187ad92c0cf7"]},"offset":"41698066"},"cp949.json":{"size":38122,"integrity":{"algorithm":"SHA256","hash":"77a56ea83d0d94d1dc620042ad3c897f0e40814bb05c0085d3aeed0018e8a3e8","blockSize":4194304,"blocks":["77a56ea83d0d94d1dc620042ad3c897f0e40814bb05c0085d3aeed0018e8a3e8"]},"offset":"41745386"},"cp950.json":{"size":42356,"integrity":{"algorithm":"SHA256","hash":"99e2114dc4b39092617967c763f9eaeb4d8e70551afc5884baa3fb92827f3420","blockSize":4194304,"blocks":["99e2114dc4b39092617967c763f9eaeb4d8e70551afc5884baa3fb92827f3420"]},"offset":"41783508"},"eucjp.json":{"size":41064,"integrity":{"algorithm":"SHA256","hash":"7c4fe279000f7e99fc7cd59afb1da21725dcebdc1babd9e3b883253a77abb042","blockSize":4194304,"blocks":["7c4fe279000f7e99fc7cd59afb1da21725dcebdc1babd9e3b883253a77abb042"]},"offset":"41825864"},"gb18030-ranges.json":{"size":2216,"integrity":{"algorithm":"SHA256","hash":"5a3cc11e38f05a0908442acbf1c921d0b73f2a304fb6a9e4484e26eb1ca07d76","blockSize":4194304,"blocks":["5a3cc11e38f05a0908442acbf1c921d0b73f2a304fb6a9e4484e26eb1ca07d76"]},"offset":"41866928"},"gbk-added.json":{"size":1227,"integrity":{"algorithm":"SHA256","hash":"7e6e8c23d37d5819481909e4d972fbf0f35e120dda3498dd3a0cd6b5e4932fe6","blockSize":4194304,"blocks":["7e6e8c23d37d5819481909e4d972fbf0f35e120dda3498dd3a0cd6b5e4932fe6"]},"offset":"41869144"},"shiftjis.json":{"size":23782,"integrity":{"algorithm":"SHA256","hash":"02b0b120f697c48133e8b547e8dc594bc5b9f1c1799b50c2c5ff917298548558","blockSize":4194304,"blocks":["02b0b120f697c48133e8b547e8dc594bc5b9f1c1799b50c2c5ff917298548558"]},"offset":"41870371"}}}}}}},"ms":{"files":{"index.js":{"size":2764,"integrity":{"algorithm":"SHA256","hash":"4bd92209cb9dacf3e3773e725acb7aaec43ea9e78540324e4d0f73e5ce9adef7","blockSize":4194304,"blocks":["4bd92209cb9dacf3e3773e725acb7aaec43ea9e78540324e4d0f73e5ce9adef7"]},"offset":"41894153"},"license.md":{"size":1077,"integrity":{"algorithm":"SHA256","hash":"6652830c2607c722b66f1b57de15877ab8fc5dca406cc5b335afeb365d0f32c1","blockSize":4194304,"blocks":["6652830c2607c722b66f1b57de15877ab8fc5dca406cc5b335afeb365d0f32c1"]},"offset":"41896917"},"package.json":{"size":469,"integrity":{"algorithm":"SHA256","hash":"72a34b18a15caec1a2090e28951128f015f6e92d882e4211f08e8284c0f8c3d3","blockSize":4194304,"blocks":["72a34b18a15caec1a2090e28951128f015f6e92d882e4211f08e8284c0f8c3d3"]},"offset":"41897994"}}},"qs":{"files":{".editorconfig":{"size":540,"integrity":{"algorithm":"SHA256","hash":"a621812cd44b87b2876db2ed9d08981a69d99a397b1a9ce1defef81b8d184772","blockSize":4194304,"blocks":["a621812cd44b87b2876db2ed9d08981a69d99a397b1a9ce1defef81b8d184772"]},"offset":"41898463"},".nycrc":{"size":216,"integrity":{"algorithm":"SHA256","hash":"7e1e3a52df079fc764989d75b3aaf5228228c841978e0c9201d1f394c1fd2655","blockSize":4194304,"blocks":["7e1e3a52df079fc764989d75b3aaf5228228c841978e0c9201d1f394c1fd2655"]},"offset":"41899003"},"LICENSE.md":{"size":1600,"integrity":{"algorithm":"SHA256","hash":"e7dc37bf662d7f786efcb46c545615e70c1daf458a38385521c63cf6607cdfe1","blockSize":4194304,"blocks":["e7dc37bf662d7f786efcb46c545615e70c1daf458a38385521c63cf6607cdfe1"]},"offset":"41899219"},"package.json":{"size":1062,"integrity":{"algorithm":"SHA256","hash":"37d9374d016149cba4c1b80e557808d66d740d10a0a1073e6ae2ba1dbb1a27b5","blockSize":4194304,"blocks":["37d9374d016149cba4c1b80e557808d66d740d10a0a1073e6ae2ba1dbb1a27b5"]},"offset":"41900819"},"lib":{"files":{"formats.js":{"size":476,"integrity":{"algorithm":"SHA256","hash":"d4e3de8b5a4c94865d8acd6f1c7538144732d466769661160bc0bf6ec9db3f4f","blockSize":4194304,"blocks":["d4e3de8b5a4c94865d8acd6f1c7538144732d466769661160bc0bf6ec9db3f4f"]},"offset":"41901881"},"index.js":{"size":211,"integrity":{"algorithm":"SHA256","hash":"8f4e02eef6ccc43f2b7448c18ae209281c8e9af9807cad491df67450e3817a95","blockSize":4194304,"blocks":["8f4e02eef6ccc43f2b7448c18ae209281c8e9af9807cad491df67450e3817a95"]},"offset":"41902357"},"parse.js":{"size":9380,"integrity":{"algorithm":"SHA256","hash":"9611d65366166f5f826b647f6f2dc25ad94eb5d0259e9646bfd13784dfce907c","blockSize":4194304,"blocks":["9611d65366166f5f826b647f6f2dc25ad94eb5d0259e9646bfd13784dfce907c"]},"offset":"41902568"},"stringify.js":{"size":9819,"integrity":{"algorithm":"SHA256","hash":"d82a8da6078398bd7ce0f0a78ae53051fbbfc4560405034dd24edaace0a22a9c","blockSize":4194304,"blocks":["d82a8da6078398bd7ce0f0a78ae53051fbbfc4560405034dd24edaace0a22a9c"]},"offset":"41911948"},"utils.js":{"size":6823,"integrity":{"algorithm":"SHA256","hash":"1a360b096b61cb5d5260e6543ed032677d7dcadb0bcf9ba5c42833ca75622e9b","blockSize":4194304,"blocks":["1a360b096b61cb5d5260e6543ed032677d7dcadb0bcf9ba5c42833ca75622e9b"]},"offset":"41921767"}}},"dist":{"files":{"qs.js":{"size":68450,"integrity":{"algorithm":"SHA256","hash":"755291a36c25173d92d6d3565641ef109014c5479cecb90b01ac871de2e0ce3a","blockSize":4194304,"blocks":["755291a36c25173d92d6d3565641ef109014c5479cecb90b01ac871de2e0ce3a"]},"offset":"41928590"}}},".github":{"files":{"FUNDING.yml":{"size":548,"integrity":{"algorithm":"SHA256","hash":"367b5d545d7a66684895ee7efd987130e83018491a7b2f72f25c0b062157ad90","blockSize":4194304,"blocks":["367b5d545d7a66684895ee7efd987130e83018491a7b2f72f25c0b062157ad90"]},"offset":"41997040"}}}}}}}}},"bottleneck":{"files":{".babelrc.es5":{"size":52,"integrity":{"algorithm":"SHA256","hash":"213d5cc77f73c93bee9ec4b2a1922290f95ceb2585002eeae5aa709a23d8e274","blockSize":4194304,"blocks":["213d5cc77f73c93bee9ec4b2a1922290f95ceb2585002eeae5aa709a23d8e274"]},"offset":"13607874"},".babelrc.lib":{"size":106,"integrity":{"algorithm":"SHA256","hash":"506ebc8d581c06174886ee19b639efaffa4098a78c470c91fb5b70daadf0de1b","blockSize":4194304,"blocks":["506ebc8d581c06174886ee19b639efaffa4098a78c470c91fb5b70daadf0de1b"]},"offset":"13607926"},".env":{"size":37,"integrity":{"algorithm":"SHA256","hash":"9a71de52ef575866ca37dce0fe306c2571ed84f780ae2e8a263a6135fc42ac74","blockSize":4194304,"blocks":["9a71de52ef575866ca37dce0fe306c2571ed84f780ae2e8a263a6135fc42ac74"]},"offset":"13608032"},"LICENSE":{"size":1080,"integrity":{"algorithm":"SHA256","hash":"84a08edb16cc9ae161c31e76c9e593702f3d9192061abc6721398e0227bdb5e7","blockSize":4194304,"blocks":["84a08edb16cc9ae161c31e76c9e593702f3d9192061abc6721398e0227bdb5e7"]},"offset":"13608069"},"bottleneck.d.ts.ejs":{"size":25750,"integrity":{"algorithm":"SHA256","hash":"ae9ee74744fcc64e0f6affa8eb3c82aab42e1b65ac5ea55d19fe50d0fe821dd2","blockSize":4194304,"blocks":["ae9ee74744fcc64e0f6affa8eb3c82aab42e1b65ac5ea55d19fe50d0fe821dd2"]},"offset":"13609149"},"bower.json":{"size":537,"integrity":{"algorithm":"SHA256","hash":"8d36c80f6020b63ee3ecb808372d8170e6d2022cfe6474dac30f7c05e33caa9b","blockSize":4194304,"blocks":["8d36c80f6020b63ee3ecb808372d8170e6d2022cfe6474dac30f7c05e33caa9b"]},"offset":"13634899"},"es5.js":{"size":172002,"integrity":{"algorithm":"SHA256","hash":"b5c6a996db7855dfa54acaeca31be04195dc37335939c69f9797d6aff3dd306d","blockSize":4194304,"blocks":["b5c6a996db7855dfa54acaeca31be04195dc37335939c69f9797d6aff3dd306d"]},"offset":"13635436"},"light.js":{"size":43167,"integrity":{"algorithm":"SHA256","hash":"799b24dab220c150eb1c9e173518ea9b55f27d6946b500ea854c222c8bb4a524","blockSize":4194304,"blocks":["799b24dab220c150eb1c9e173518ea9b55f27d6946b500ea854c222c8bb4a524"]},"offset":"13807438"},"package.json":{"size":928,"integrity":{"algorithm":"SHA256","hash":"a0c8cedff11726d8c43a55ef03deb5c6739b2101efbb2d3bf503a65f67320b07","blockSize":4194304,"blocks":["a0c8cedff11726d8c43a55ef03deb5c6739b2101efbb2d3bf503a65f67320b07"]},"offset":"13850605"},"rollup.config.es5.js":{"size":997,"integrity":{"algorithm":"SHA256","hash":"f39bf0a4312211f80fa73d659302dd400bf048d042f40565d097066822d5f2d3","blockSize":4194304,"blocks":["f39bf0a4312211f80fa73d659302dd400bf048d042f40565d097066822d5f2d3"]},"offset":"13851533"},"rollup.config.light.js":{"size":1088,"integrity":{"algorithm":"SHA256","hash":"c0f71d8d3b6642dde7a39f9cf1406330aebb72e8bbcefb830c2ec5cb040004cc","blockSize":4194304,"blocks":["c0f71d8d3b6642dde7a39f9cf1406330aebb72e8bbcefb830c2ec5cb040004cc"]},"offset":"13852530"},"test.ts":{"size":7913,"integrity":{"algorithm":"SHA256","hash":"d35e612f1016c40a7c1db65d9d8b0b43ac196fa305e815266a839c3ed28b99c6","blockSize":4194304,"blocks":["d35e612f1016c40a7c1db65d9d8b0b43ac196fa305e815266a839c3ed28b99c6"]},"offset":"13853618"},"src":{"files":{"Batcher.coffee":{"size":792,"integrity":{"algorithm":"SHA256","hash":"90e81c80d60a619962e53e5b81967e829d47de6dd989cb253dd96fb7ad9ff87c","blockSize":4194304,"blocks":["90e81c80d60a619962e53e5b81967e829d47de6dd989cb253dd96fb7ad9ff87c"]},"offset":"13861531"},"Bottleneck.coffee":{"size":10255,"integrity":{"algorithm":"SHA256","hash":"1c943ef11db72d5b1e214701ddfba77141afcf6d4b950eb3782677d070e7834e","blockSize":4194304,"blocks":["1c943ef11db72d5b1e214701ddfba77141afcf6d4b950eb3782677d070e7834e"]},"offset":"13862323"},"BottleneckError.coffee":{"size":70,"integrity":{"algorithm":"SHA256","hash":"cfa4ac306bd5330ed19298914ed6e10a9298cd745b5556251617e4f204632766","blockSize":4194304,"blocks":["cfa4ac306bd5330ed19298914ed6e10a9298cd745b5556251617e4f204632766"]},"offset":"13872578"},"DLList.coffee":{"size":941,"integrity":{"algorithm":"SHA256","hash":"01d34691648b20d855b86b43391449298d05a24a840e4d9b29650a8e453a805b","blockSize":4194304,"blocks":["01d34691648b20d855b86b43391449298d05a24a840e4d9b29650a8e453a805b"]},"offset":"13872648"},"Events.coffee":{"size":1444,"integrity":{"algorithm":"SHA256","hash":"63ca975160f375fea8ea0ff277eba75cab90639c0a029e1e1fc7174592697315","blockSize":4194304,"blocks":["63ca975160f375fea8ea0ff277eba75cab90639c0a029e1e1fc7174592697315"]},"offset":"13873589"},"Group.coffee":{"size":2440,"integrity":{"algorithm":"SHA256","hash":"3e9ced1e7ee9b8734196360f8f1b3b2dbbff4737bf4100977e19a7db268c8f25","blockSize":4194304,"blocks":["3e9ced1e7ee9b8734196360f8f1b3b2dbbff4737bf4100977e19a7db268c8f25"]},"offset":"13875033"},"IORedisConnection.coffee":{"size":2719,"integrity":{"algorithm":"SHA256","hash":"317082008eaef290c1572aaec80cafa9298be6f7742238262f650c2d1c8e74c6","blockSize":4194304,"blocks":["317082008eaef290c1572aaec80cafa9298be6f7742238262f650c2d1c8e74c6"]},"offset":"13877473"},"Job.coffee":{"size":3425,"integrity":{"algorithm":"SHA256","hash":"1b3186d46f93c6fda9c1bb9299dd054b3ec853f645c26afa54971b3d9ff7da26","blockSize":4194304,"blocks":["1b3186d46f93c6fda9c1bb9299dd054b3ec853f645c26afa54971b3d9ff7da26"]},"offset":"13880192"},"LocalDatastore.coffee":{"size":4712,"integrity":{"algorithm":"SHA256","hash":"e4046734edd57d341ae52f709588a0d4881d3f6609e19002274109d8feba5e36","blockSize":4194304,"blocks":["e4046734edd57d341ae52f709588a0d4881d3f6609e19002274109d8feba5e36"]},"offset":"13883617"},"Queues.coffee":{"size":765,"integrity":{"algorithm":"SHA256","hash":"7c39b20599ee7b0dbc7096031bda02f4a8664e793717daa28265754c27013876","blockSize":4194304,"blocks":["7c39b20599ee7b0dbc7096031bda02f4a8664e793717daa28265754c27013876"]},"offset":"13888329"},"RedisConnection.coffee":{"size":2985,"integrity":{"algorithm":"SHA256","hash":"95d5a0fd6bf8112e956e36258a6bf168febbd6b9e32aa17d3e56fbca37f0e83a","blockSize":4194304,"blocks":["95d5a0fd6bf8112e956e36258a6bf168febbd6b9e32aa17d3e56fbca37f0e83a"]},"offset":"13889094"},"RedisDatastore.coffee":{"size":5934,"integrity":{"algorithm":"SHA256","hash":"35836cbf0610119dc6c3000e28916b07e733168fe4ed3ef3d1381dbd7ff116be","blockSize":4194304,"blocks":["35836cbf0610119dc6c3000e28916b07e733168fe4ed3ef3d1381dbd7ff116be"]},"offset":"13892079"},"Scripts.coffee":{"size":3674,"integrity":{"algorithm":"SHA256","hash":"b340d3b64de6f0f41c60a98ef441655c56eef00a9cd084a89a854fefa0235491","blockSize":4194304,"blocks":["b340d3b64de6f0f41c60a98ef441655c56eef00a9cd084a89a854fefa0235491"]},"offset":"13898013"},"States.coffee":{"size":985,"integrity":{"algorithm":"SHA256","hash":"aa69e18b7862d52080f6ba22839235d092cea05a26d85f77b8af00af7ba0c20a","blockSize":4194304,"blocks":["aa69e18b7862d52080f6ba22839235d092cea05a26d85f77b8af00af7ba0c20a"]},"offset":"13901687"},"Sync.coffee":{"size":725,"integrity":{"algorithm":"SHA256","hash":"98cfb09005d3408e4cfdd6ea3b8e4685d72bc9d7bb64c256a5ea75b3b0da25d9","blockSize":4194304,"blocks":["98cfb09005d3408e4cfdd6ea3b8e4685d72bc9d7bb64c256a5ea75b3b0da25d9"]},"offset":"13902672"},"es5.coffee":{"size":80,"integrity":{"algorithm":"SHA256","hash":"1706d47266a247cb96ba970366a4932966bf49d5751a9ad1e604fabdd428e00e","blockSize":4194304,"blocks":["1706d47266a247cb96ba970366a4932966bf49d5751a9ad1e604fabdd428e00e"]},"offset":"13903397"},"index.coffee":{"size":40,"integrity":{"algorithm":"SHA256","hash":"0b0ee124e226e607b3b351b58f0cf297b88742c47fecdaed8108727ac9f952af","blockSize":4194304,"blocks":["0b0ee124e226e607b3b351b58f0cf297b88742c47fecdaed8108727ac9f952af"]},"offset":"13903477"},"parser.coffee":{"size":242,"integrity":{"algorithm":"SHA256","hash":"48d819e18102cd633c5a55041410c20c784be20fad428dd92a2941e99a6a0d1b","blockSize":4194304,"blocks":["48d819e18102cd633c5a55041410c20c784be20fad428dd92a2941e99a6a0d1b"]},"offset":"13903517"},"redis":{"files":{"blacklist_client.lua":{"size":180,"integrity":{"algorithm":"SHA256","hash":"be6209a3453f727bc9d5212facd1a9f8fa403248e54a64c947c0f01381d3929f","blockSize":4194304,"blocks":["be6209a3453f727bc9d5212facd1a9f8fa403248e54a64c947c0f01381d3929f"]},"offset":"13903759"},"check.lua":{"size":254,"integrity":{"algorithm":"SHA256","hash":"eaf0ad4b31aff437a96c6144a6f8be39b86b526cd2e6fb5b5a970959967e74c3","blockSize":4194304,"blocks":["eaf0ad4b31aff437a96c6144a6f8be39b86b526cd2e6fb5b5a970959967e74c3"]},"offset":"13903939"},"conditions_check.lua":{"size":104,"integrity":{"algorithm":"SHA256","hash":"a8d122898ee28f08845567f376ab2402bed32444bfd6c91ed4adc9d54175a15d","blockSize":4194304,"blocks":["a8d122898ee28f08845567f376ab2402bed32444bfd6c91ed4adc9d54175a15d"]},"offset":"13904193"},"current_reservoir.lua":{"size":45,"integrity":{"algorithm":"SHA256","hash":"90a91600cebacfe0f4468a6fb55cb538e6ee632932d5463f80f59f2138024699","blockSize":4194304,"blocks":["90a91600cebacfe0f4468a6fb55cb538e6ee632932d5463f80f59f2138024699"]},"offset":"13904297"},"done.lua":{"size":84,"integrity":{"algorithm":"SHA256","hash":"f25fb4d8fa02ead17b0ca7e4344db6c07ca7c62ed0f775ecc5bcaf43d49d1d42","blockSize":4194304,"blocks":["f25fb4d8fa02ead17b0ca7e4344db6c07ca7c62ed0f775ecc5bcaf43d49d1d42"]},"offset":"13904342"},"free.lua":{"size":135,"integrity":{"algorithm":"SHA256","hash":"276cea2def8f1566db84368fa58edb214f2fa410bbd00acbd6e8c69f3a3631e2","blockSize":4194304,"blocks":["276cea2def8f1566db84368fa58edb214f2fa410bbd00acbd6e8c69f3a3631e2"]},"offset":"13904426"},"get_time.lua":{"size":150,"integrity":{"algorithm":"SHA256","hash":"5959c1a3a22bedd44f632cebb3033e187f7f2a5c4d6aac7fd322e20b8bcda001","blockSize":4194304,"blocks":["5959c1a3a22bedd44f632cebb3033e187f7f2a5c4d6aac7fd322e20b8bcda001"]},"offset":"13904561"},"group_check.lua":{"size":53,"integrity":{"algorithm":"SHA256","hash":"bd9797c8e0805accfe98913b2047a447206cd2b43e9c7b47aa9bce2bcaa9e010","blockSize":4194304,"blocks":["bd9797c8e0805accfe98913b2047a447206cd2b43e9c7b47aa9bce2bcaa9e010"]},"offset":"13904711"},"heartbeat.lua":{"size":24,"integrity":{"algorithm":"SHA256","hash":"62a13d39626d22d2d004588713a614bb74eee6946b246ea2256a356483832c3e","blockSize":4194304,"blocks":["62a13d39626d22d2d004588713a614bb74eee6946b246ea2256a356483832c3e"]},"offset":"13904764"},"increment_reservoir.lua":{"size":299,"integrity":{"algorithm":"SHA256","hash":"05315d727d80fab51d0c107bef5e23e64877962640d71aa009e597c6e884f5d1","blockSize":4194304,"blocks":["05315d727d80fab51d0c107bef5e23e64877962640d71aa009e597c6e884f5d1"]},"offset":"13904788"},"init.lua":{"size":3195,"integrity":{"algorithm":"SHA256","hash":"dd3e9a35d755e18f3c15ac7fc04087bb3d631953f3305b85d5879d97db797563","blockSize":4194304,"blocks":["dd3e9a35d755e18f3c15ac7fc04087bb3d631953f3305b85d5879d97db797563"]},"offset":"13905087"},"process_tick.lua":{"size":7575,"integrity":{"algorithm":"SHA256","hash":"d265934e7c26ea14aa7e128e330d2937432eab90630d5fc558ec766887467436","blockSize":4194304,"blocks":["d265934e7c26ea14aa7e128e330d2937432eab90630d5fc558ec766887467436"]},"offset":"13908282"},"queued.lua":{"size":373,"integrity":{"algorithm":"SHA256","hash":"fc961a351f5e5517db8cd6796cdbf444ba23c1be1b08e37e46663f64c2077a69","blockSize":4194304,"blocks":["fc961a351f5e5517db8cd6796cdbf444ba23c1be1b08e37e46663f64c2077a69"]},"offset":"13915857"},"refresh_expiration.lua":{"size":237,"integrity":{"algorithm":"SHA256","hash":"ee0ea1af9b540e622247dd433ef64fbea9dd9e0fb0cf8f4e8c732cf583099812","blockSize":4194304,"blocks":["ee0ea1af9b540e622247dd433ef64fbea9dd9e0fb0cf8f4e8c732cf583099812"]},"offset":"13916230"},"refs.lua":{"size":363,"integrity":{"algorithm":"SHA256","hash":"c925c57f4c84e05dccc1cce128ddd85cb5ef11f19ec12bcd8424fce4dedb5bfd","blockSize":4194304,"blocks":["c925c57f4c84e05dccc1cce128ddd85cb5ef11f19ec12bcd8424fce4dedb5bfd"]},"offset":"13916467"},"register.lua":{"size":1450,"integrity":{"algorithm":"SHA256","hash":"073aaf35f8473d1eabf6dd1a6c3e9867debd10339d3d46bb1710371c50757edd","blockSize":4194304,"blocks":["073aaf35f8473d1eabf6dd1a6c3e9867debd10339d3d46bb1710371c50757edd"]},"offset":"13916830"},"register_client.lua":{"size":403,"integrity":{"algorithm":"SHA256","hash":"04926a53c2a0c053874769828dd79adee6b95bad87736516d466046f4d47e65b","blockSize":4194304,"blocks":["04926a53c2a0c053874769828dd79adee6b95bad87736516d466046f4d47e65b"]},"offset":"13918280"},"running.lua":{"size":43,"integrity":{"algorithm":"SHA256","hash":"6b6171dea5497c699336614dca36b87e2c35b4aa014dc5d87a14743095aba5db","blockSize":4194304,"blocks":["6b6171dea5497c699336614dca36b87e2c35b4aa014dc5d87a14743095aba5db"]},"offset":"13918683"},"submit.lua":{"size":1979,"integrity":{"algorithm":"SHA256","hash":"451322a6d87125e092cb94d644d70362e3f67c12cafcc2d47f92d7d13aad8cb0","blockSize":4194304,"blocks":["451322a6d87125e092cb94d644d70362e3f67c12cafcc2d47f92d7d13aad8cb0"]},"offset":"13918726"},"update_settings.lua":{"size":292,"integrity":{"algorithm":"SHA256","hash":"d5fa05c090352d66687ead86a95353d01f962633c03b6df17afe07846062211b","blockSize":4194304,"blocks":["d5fa05c090352d66687ead86a95353d01f962633c03b6df17afe07846062211b"]},"offset":"13920705"},"validate_client.lua":{"size":167,"integrity":{"algorithm":"SHA256","hash":"e9d6299238867d62db3b5f3592403f64078a7ddb4e57bd8a0a1ca2628aa06e0c","blockSize":4194304,"blocks":["e9d6299238867d62db3b5f3592403f64078a7ddb4e57bd8a0a1ca2628aa06e0c"]},"offset":"13920997"},"validate_keys.lua":{"size":111,"integrity":{"algorithm":"SHA256","hash":"c9ed978619b1160598e1a8cd72bac0f71c829746d8749776022f60274f32ee2b","blockSize":4194304,"blocks":["c9ed978619b1160598e1a8cd72bac0f71c829746d8749776022f60274f32ee2b"]},"offset":"13921164"}}}}},"scripts":{"files":{"assemble_lua.js":{"size":571,"integrity":{"algorithm":"SHA256","hash":"9b605b334a92b1f7880d88698cf6bca74e94274a7c957be8192687fd517cd2d7","blockSize":4194304,"blocks":["9b605b334a92b1f7880d88698cf6bca74e94274a7c957be8192687fd517cd2d7"]},"offset":"13921275"},"build.sh":{"size":1421,"integrity":{"algorithm":"SHA256","hash":"31bcd3e92cf2d93a9bf0452c5872c9042d22d699f95753615be562ae169e7493","blockSize":4194304,"blocks":["31bcd3e92cf2d93a9bf0452c5872c9042d22d699f95753615be562ae169e7493"]},"offset":"13921846"},"test_all.sh":{"size":260,"integrity":{"algorithm":"SHA256","hash":"934ee3e990e1770f813f0a37b14f39510424c42ec87ba26a3b59c46dee8cc397","blockSize":4194304,"blocks":["934ee3e990e1770f813f0a37b14f39510424c42ec87ba26a3b59c46dee8cc397"]},"offset":"13923267"},"version.js":{"size":108,"integrity":{"algorithm":"SHA256","hash":"e8c578e7e13cc166804c1738745a5c5fb71429d226eded678d19f82d8a12671d","blockSize":4194304,"blocks":["e8c578e7e13cc166804c1738745a5c5fb71429d226eded678d19f82d8a12671d"]},"offset":"13923527"}}},"lib":{"files":{"Batcher.js":{"size":1282,"integrity":{"algorithm":"SHA256","hash":"d06937024cee7e2a87b23e39723154ea15ca3928651a7b9fd4214ff7c2a5b1c2","blockSize":4194304,"blocks":["d06937024cee7e2a87b23e39723154ea15ca3928651a7b9fd4214ff7c2a5b1c2"]},"offset":"13923635"},"Bottleneck.js":{"size":18041,"integrity":{"algorithm":"SHA256","hash":"de8237be93f5410e8519df631f10503d3be476625e1ddb66ee16d2424863b0fe","blockSize":4194304,"blocks":["de8237be93f5410e8519df631f10503d3be476625e1ddb66ee16d2424863b0fe"]},"offset":"13924917"},"BottleneckError.js":{"size":127,"integrity":{"algorithm":"SHA256","hash":"48c8bc02ce05737b05ace2642cf2ab21371d7753e10ffbaa5bc624d605f9f338","blockSize":4194304,"blocks":["48c8bc02ce05737b05ace2642cf2ab21371d7753e10ffbaa5bc624d605f9f338"]},"offset":"13942958"},"DLList.js":{"size":1775,"integrity":{"algorithm":"SHA256","hash":"d9299c21246c4e5fc2371943a83fb1c86d8b6c4ca144f87b3bad394a5fe327a2","blockSize":4194304,"blocks":["d9299c21246c4e5fc2371943a83fb1c86d8b6c4ca144f87b3bad394a5fe327a2"]},"offset":"13943085"},"Events.js":{"size":3471,"integrity":{"algorithm":"SHA256","hash":"0aa58ea73ad3cb06ba43c126f3f4d4f28298a1a4a3510a364bdff19183ab39f4","blockSize":4194304,"blocks":["0aa58ea73ad3cb06ba43c126f3f4d4f28298a1a4a3510a364bdff19183ab39f4"]},"offset":"13944860"},"Group.js":{"size":6132,"integrity":{"algorithm":"SHA256","hash":"909dacc587d7db4c2c5aae9f18a65761ba7f1453ac1e8d74892253aefbb54d37","blockSize":4194304,"blocks":["909dacc587d7db4c2c5aae9f18a65761ba7f1453ac1e8d74892253aefbb54d37"]},"offset":"13948331"},"IORedisConnection.js":{"size":6036,"integrity":{"algorithm":"SHA256","hash":"17a63fc67e7e2d83c6a640358c6d75e4e1449002beb34ecd487445a06b9bcd58","blockSize":4194304,"blocks":["17a63fc67e7e2d83c6a640358c6d75e4e1449002beb34ecd487445a06b9bcd58"]},"offset":"13954463"},"Job.js":{"size":5878,"integrity":{"algorithm":"SHA256","hash":"74551429dbb056fa8b4341ea16006cd8a2a475330c4bfdbde8549e46daf18681","blockSize":4194304,"blocks":["74551429dbb056fa8b4341ea16006cd8a2a475330c4bfdbde8549e46daf18681"]},"offset":"13960499"},"LocalDatastore.js":{"size":8422,"integrity":{"algorithm":"SHA256","hash":"20ede7b6b9e0fda828a7974364bbc99f3ec409463ee4567218c75dec1924c20d","blockSize":4194304,"blocks":["20ede7b6b9e0fda828a7974364bbc99f3ec409463ee4567218c75dec1924c20d"]},"offset":"13966377"},"Queues.js":{"size":1473,"integrity":{"algorithm":"SHA256","hash":"3658a22a7118d91a65b0c2060406bc465880259c0b1dc8a4adafe30763d7614f","blockSize":4194304,"blocks":["3658a22a7118d91a65b0c2060406bc465880259c0b1dc8a4adafe30763d7614f"]},"offset":"13974799"},"RedisConnection.js":{"size":5734,"integrity":{"algorithm":"SHA256","hash":"c817fb70b497ccb85a66a5b4cfffc4f7eb2fd7ea83cc6a26ad8fe085b58be270","blockSize":4194304,"blocks":["c817fb70b497ccb85a66a5b4cfffc4f7eb2fd7ea83cc6a26ad8fe085b58be270"]},"offset":"13976272"},"RedisDatastore.js":{"size":11377,"integrity":{"algorithm":"SHA256","hash":"7b7f80b53f526839b6c93ca45271a93bd1c8dbecce3554fbce25e49946780011","blockSize":4194304,"blocks":["7b7f80b53f526839b6c93ca45271a93bd1c8dbecce3554fbce25e49946780011"]},"offset":"13982006"},"Scripts.js":{"size":3943,"integrity":{"algorithm":"SHA256","hash":"84a1af0b00a02ce890dc22e23392f368a296008cd28a262ad5bc6fe450e301ca","blockSize":4194304,"blocks":["84a1af0b00a02ce890dc22e23392f368a296008cd28a262ad5bc6fe450e301ca"]},"offset":"13993383"},"States.js":{"size":1668,"integrity":{"algorithm":"SHA256","hash":"e8f971cdf3154fa3f1e7c7a7dde149f39bae1fb6e3ed6b79325615cc77fb162c","blockSize":4194304,"blocks":["e8f971cdf3154fa3f1e7c7a7dde149f39bae1fb6e3ed6b79325615cc77fb162c"]},"offset":"13997326"},"Sync.js":{"size":2282,"integrity":{"algorithm":"SHA256","hash":"b5566ba0e56b7d9ef8bad08239600ed2d1c14cbcc1a4ee4d7caea5bc1f74df9a","blockSize":4194304,"blocks":["b5566ba0e56b7d9ef8bad08239600ed2d1c14cbcc1a4ee4d7caea5bc1f74df9a"]},"offset":"13998994"},"es5.js":{"size":97,"integrity":{"algorithm":"SHA256","hash":"9291da273aa40fff9dad764e1cef6d794922b0578c5a914bb677c812ad693a9d","blockSize":4194304,"blocks":["9291da273aa40fff9dad764e1cef6d794922b0578c5a914bb677c812ad693a9d"]},"offset":"14001276"},"index.js":{"size":56,"integrity":{"algorithm":"SHA256","hash":"97aeb3f85b49d31792b83305d7275fed46e13ac38a1e4afb0dd80d3ca7160686","blockSize":4194304,"blocks":["97aeb3f85b49d31792b83305d7275fed46e13ac38a1e4afb0dd80d3ca7160686"]},"offset":"14001373"},"lua.json":{"size":18619,"integrity":{"algorithm":"SHA256","hash":"8a2986b7f9b403dc33769b4e75d507ed8b6ec550786e2c85bdfd041c92267d67","blockSize":4194304,"blocks":["8a2986b7f9b403dc33769b4e75d507ed8b6ec550786e2c85bdfd041c92267d67"]},"offset":"14001429"},"parser.js":{"size":416,"integrity":{"algorithm":"SHA256","hash":"78352ad0b8101ef43e6ba569627c7b0748466bc29af87838d0530d83e96a14f0","blockSize":4194304,"blocks":["78352ad0b8101ef43e6ba569627c7b0748466bc29af87838d0530d83e96a14f0"]},"offset":"14020048"},"version.json":{"size":21,"integrity":{"algorithm":"SHA256","hash":"4337454d9d16be306f59503c287cb9647362ef694460f5b1322a77e6ca247ba0","blockSize":4194304,"blocks":["4337454d9d16be306f59503c287cb9647362ef694460f5b1322a77e6ca247ba0"]},"offset":"14020464"}}}}},"brace-expansion":{"files":{"LICENSE":{"size":1096,"integrity":{"algorithm":"SHA256","hash":"68f12f6e2c33688699249c01d8f9623c534da20aa71989c57b061b7bc1676d14","blockSize":4194304,"blocks":["68f12f6e2c33688699249c01d8f9623c534da20aa71989c57b061b7bc1676d14"]},"offset":"14020485"},"index.js":{"size":4792,"integrity":{"algorithm":"SHA256","hash":"6bf9eee39229aa68ac3e6a71177c387c8321eff1f83242a35f3e7c35cb9eec1b","blockSize":4194304,"blocks":["6bf9eee39229aa68ac3e6a71177c387c8321eff1f83242a35f3e7c35cb9eec1b"]},"offset":"14021581"},"package.json":{"size":963,"integrity":{"algorithm":"SHA256","hash":"9620d66f383fc482264c487bc021d98e453980cc50b320da86375707f69d48ab","blockSize":4194304,"blocks":["9620d66f383fc482264c487bc021d98e453980cc50b320da86375707f69d48ab"]},"offset":"14026373"}}},"buffer":{"files":{"AUTHORS.md":{"size":2788,"integrity":{"algorithm":"SHA256","hash":"ca3d96437f69ceb38df1972db017fcd6303b02f57ea1f838ab9f9c3db3e789e0","blockSize":4194304,"blocks":["ca3d96437f69ceb38df1972db017fcd6303b02f57ea1f838ab9f9c3db3e789e0"]},"offset":"14027336"},"LICENSE":{"size":1106,"integrity":{"algorithm":"SHA256","hash":"06bafa45fdad2579ba0e43b0c9b2c6290287c99c4203c300254a462b38a307f6","blockSize":4194304,"blocks":["06bafa45fdad2579ba0e43b0c9b2c6290287c99c4203c300254a462b38a307f6"]},"offset":"14030124"},"index.js":{"size":58353,"integrity":{"algorithm":"SHA256","hash":"c25853fd31addfce188b01061fe85bfe667d5fb6c7a7bbb1c83d0ddfd8627acc","blockSize":4194304,"blocks":["c25853fd31addfce188b01061fe85bfe667d5fb6c7a7bbb1c83d0ddfd8627acc"]},"offset":"14031230"},"package.json":{"size":1255,"integrity":{"algorithm":"SHA256","hash":"8d7a9d1fdecf08d96a453ecf37f069ef761c667c3c622441b1501a83a8ff6d13","blockSize":4194304,"blocks":["8d7a9d1fdecf08d96a453ecf37f069ef761c667c3c622441b1501a83a8ff6d13"]},"offset":"14089583"}}},"buffer-equal-constant-time":{"files":{"LICENSE.txt":{"size":1518,"integrity":{"algorithm":"SHA256","hash":"751d0e80fb5c828f8c3de198cc760e1e05377e47c8263ab6ee2f10cdc19ba658","blockSize":4194304,"blocks":["751d0e80fb5c828f8c3de198cc760e1e05377e47c8263ab6ee2f10cdc19ba658"]},"offset":"14090838"},"index.js":{"size":1045,"integrity":{"algorithm":"SHA256","hash":"873c585bc4b4373d4e9d8d39bd475f9a0816fb7c8fce0f20335f6897090eb068","blockSize":4194304,"blocks":["873c585bc4b4373d4e9d8d39bd475f9a0816fb7c8fce0f20335f6897090eb068"]},"offset":"14092356"},"package.json":{"size":353,"integrity":{"algorithm":"SHA256","hash":"e50b486fc1a487f4eabb157d49737b1cd760a2441d33dc05b9c262b6a42e7632","blockSize":4194304,"blocks":["e50b486fc1a487f4eabb157d49737b1cd760a2441d33dc05b9c262b6a42e7632"]},"offset":"14093401"}}},"builder-util-runtime":{"files":{"LICENSE":{"size":1084,"integrity":{"algorithm":"SHA256","hash":"bed8d0ab3e6031817f775a641ff37313b0f5591bc8ba0ed79b978dafbd4231ce","blockSize":4194304,"blocks":["bed8d0ab3e6031817f775a641ff37313b0f5591bc8ba0ed79b978dafbd4231ce"]},"offset":"14093754"},"package.json":{"size":630,"integrity":{"algorithm":"SHA256","hash":"6680036731c9243b92ea460dde4c2a95735e607dfa0fb4acc02bf1574ef0064a","blockSize":4194304,"blocks":["6680036731c9243b92ea460dde4c2a95735e607dfa0fb4acc02bf1574ef0064a"]},"offset":"14094838"},"out":{"files":{"CancellationToken.js":{"size":3196,"integrity":{"algorithm":"SHA256","hash":"039f4c1473635256d06f3f2bfea8bf53e9e59a3a749e564ff7b473addcda24d1","blockSize":4194304,"blocks":["039f4c1473635256d06f3f2bfea8bf53e9e59a3a749e564ff7b473addcda24d1"]},"offset":"14095468"},"ProgressCallbackTransform.js":{"size":1949,"integrity":{"algorithm":"SHA256","hash":"35503895f7e7dd4329b94dd69eb48674ac55d9d6646d0ea42eada5378d433d32","blockSize":4194304,"blocks":["35503895f7e7dd4329b94dd69eb48674ac55d9d6646d0ea42eada5378d433d32"]},"offset":"14098664"},"blockMapApi.js":{"size":116,"integrity":{"algorithm":"SHA256","hash":"84e270ead20b81c2c527c7cea8c295819fd015c120f67fd686c29534e036c239","blockSize":4194304,"blocks":["84e270ead20b81c2c527c7cea8c295819fd015c120f67fd686c29534e036c239"]},"offset":"14100613"},"httpExecutor.js":{"size":18705,"integrity":{"algorithm":"SHA256","hash":"c4a93fad94386c5006332ebb0bb09b16a64577342c492022b8bb39e7a2717802","blockSize":4194304,"blocks":["c4a93fad94386c5006332ebb0bb09b16a64577342c492022b8bb39e7a2717802"]},"offset":"14100729"},"index.js":{"size":4080,"integrity":{"algorithm":"SHA256","hash":"7c67128fc6a3a87c942f08340b7e1e9c00481ab641f54d714e936ca9d26701ae","blockSize":4194304,"blocks":["7c67128fc6a3a87c942f08340b7e1e9c00481ab641f54d714e936ca9d26701ae"]},"offset":"14119434"},"publishOptions.js":{"size":2156,"integrity":{"algorithm":"SHA256","hash":"c0f04b8d831d9824534ece2f76b9940a4e2868269ed8cff04cc3ff2fc5073dfd","blockSize":4194304,"blocks":["c0f04b8d831d9824534ece2f76b9940a4e2868269ed8cff04cc3ff2fc5073dfd"]},"offset":"14123514"},"rfc2253Parser.js":{"size":2290,"integrity":{"algorithm":"SHA256","hash":"8b08015dc226aa67b45b2bfd590690333ab41f97428046b6029163df34b3f93e","blockSize":4194304,"blocks":["8b08015dc226aa67b45b2bfd590690333ab41f97428046b6029163df34b3f93e"]},"offset":"14125670"},"updateInfo.js":{"size":115,"integrity":{"algorithm":"SHA256","hash":"935693e55dcf8a1e0ad653bbee7d456594835fdee0b99c9f7559befe1387043a","blockSize":4194304,"blocks":["935693e55dcf8a1e0ad653bbee7d456594835fdee0b99c9f7559befe1387043a"]},"offset":"14127960"},"uuid.js":{"size":6373,"integrity":{"algorithm":"SHA256","hash":"ab1e0840d528ff5b3b08b470c11da9f86604d2b3bd0a993d59967d0ef147e92f","blockSize":4194304,"blocks":["ab1e0840d528ff5b3b08b470c11da9f86604d2b3bd0a993d59967d0ef147e92f"]},"offset":"14128075"},"xml.js":{"size":3548,"integrity":{"algorithm":"SHA256","hash":"ed18131346ffc4920a56c84c8f9b630dad466937d39b422c5ac1225464a65f65","blockSize":4194304,"blocks":["ed18131346ffc4920a56c84c8f9b630dad466937d39b422c5ac1225464a65f65"]},"offset":"14134448"}}}}},"call-bind":{"files":{".eslintignore":{"size":10,"integrity":{"algorithm":"SHA256","hash":"5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290","blockSize":4194304,"blocks":["5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290"]},"offset":"14137996"},".nycrc":{"size":216,"integrity":{"algorithm":"SHA256","hash":"948366fea3b423a46366326d0bb2e54b08abd1cf0b243678ba6625740c40da5a","blockSize":4194304,"blocks":["948366fea3b423a46366326d0bb2e54b08abd1cf0b243678ba6625740c40da5a"]},"offset":"14138006"},"LICENSE":{"size":1071,"integrity":{"algorithm":"SHA256","hash":"39c5ec504cf6bd5cd782a7c695828e09189df79f5d94840e4f08feb97b9fd416","blockSize":4194304,"blocks":["39c5ec504cf6bd5cd782a7c695828e09189df79f5d94840e4f08feb97b9fd416"]},"offset":"14138222"},"callBound.js":{"size":413,"integrity":{"algorithm":"SHA256","hash":"2b2fce7622fdd680256d28bcd59c30913546a825bf69d754d21a1d21ccc2928c","blockSize":4194304,"blocks":["2b2fce7622fdd680256d28bcd59c30913546a825bf69d754d21a1d21ccc2928c"]},"offset":"14139293"},"index.js":{"size":1306,"integrity":{"algorithm":"SHA256","hash":"51b2bc9d457a3fc35c7d0432adda3d9c3022d490e3c51d82bd2e6fbc00407930","blockSize":4194304,"blocks":["51b2bc9d457a3fc35c7d0432adda3d9c3022d490e3c51d82bd2e6fbc00407930"]},"offset":"14139706"},"package.json":{"size":1174,"integrity":{"algorithm":"SHA256","hash":"42758a6714223ffce39ca444cc509c85be0a59e608530ee42312f7a88d30a66d","blockSize":4194304,"blocks":["42758a6714223ffce39ca444cc509c85be0a59e608530ee42312f7a88d30a66d"]},"offset":"14141012"},".github":{"files":{"FUNDING.yml":{"size":580,"integrity":{"algorithm":"SHA256","hash":"a044e97e01de6eef53bde25cb024443a21a04a84f339ad118031443d3427b8db","blockSize":4194304,"blocks":["a044e97e01de6eef53bde25cb024443a21a04a84f339ad118031443d3427b8db"]},"offset":"14142186"}}}}},"chownr":{"files":{"LICENSE":{"size":765,"integrity":{"algorithm":"SHA256","hash":"4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b","blockSize":4194304,"blocks":["4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b"]},"offset":"14142766"},"chownr.js":{"size":4275,"integrity":{"algorithm":"SHA256","hash":"529b285703d29b8ab31ead64bd1f64146bac12147cc09ceb4b25f0db87a12c96","blockSize":4194304,"blocks":["529b285703d29b8ab31ead64bd1f64146bac12147cc09ceb4b25f0db87a12c96"]},"offset":"14143531"},"package.json":{"size":491,"integrity":{"algorithm":"SHA256","hash":"c634f65390441e979318f6b6febc335a636808c8eb654f608f548702606f4509","blockSize":4194304,"blocks":["c634f65390441e979318f6b6febc335a636808c8eb654f608f548702606f4509"]},"offset":"14147806"}}},"clean-stack":{"files":{"index.js":{"size":1055,"integrity":{"algorithm":"SHA256","hash":"e813cf7271df893727ba03028926b2b6c2b45e3357dc99d0688a0074a62f4cee","blockSize":4194304,"blocks":["e813cf7271df893727ba03028926b2b6c2b45e3357dc99d0688a0074a62f4cee"]},"offset":"14148297"},"license":{"size":1109,"integrity":{"algorithm":"SHA256","hash":"48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0","blockSize":4194304,"blocks":["48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0"]},"offset":"14149352"},"package.json":{"size":493,"integrity":{"algorithm":"SHA256","hash":"29074d617f8ab718255dc0e3ba2270b72296f779f27153d5a873dbb2f1b2961d","blockSize":4194304,"blocks":["29074d617f8ab718255dc0e3ba2270b72296f779f27153d5a873dbb2f1b2961d"]},"offset":"14150461"}}},"color-support":{"files":{"LICENSE":{"size":765,"integrity":{"algorithm":"SHA256","hash":"4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b","blockSize":4194304,"blocks":["4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b"]},"offset":"14150954"},"bin.js":{"size":127,"integrity":{"algorithm":"SHA256","hash":"a797f6fea8a46f7adf24fb22db2c880e8202587094bea0f83029c81c66fb7048","blockSize":4194304,"blocks":["a797f6fea8a46f7adf24fb22db2c880e8202587094bea0f83029c81c66fb7048"]},"offset":"14151719"},"browser.js":{"size":299,"integrity":{"algorithm":"SHA256","hash":"a0532d349b9b40bb943268e6739e627c5b38a1c8d8365aba531c7b037ecc5540","blockSize":4194304,"blocks":["a0532d349b9b40bb943268e6739e627c5b38a1c8d8365aba531c7b037ecc5540"]},"offset":"14151846"},"index.js":{"size":2644,"integrity":{"algorithm":"SHA256","hash":"a6f7ee23ba6076142570631a197faf48e749d21140d37da2b3b447da20476ed1","blockSize":4194304,"blocks":["a6f7ee23ba6076142570631a197faf48e749d21140d37da2b3b447da20476ed1"]},"offset":"14152145"},"package.json":{"size":521,"integrity":{"algorithm":"SHA256","hash":"8fb18c1a3a91facd14d2d1b147848d1e1faf8a5dbd6d1ca1fc22977335c19c93","blockSize":4194304,"blocks":["8fb18c1a3a91facd14d2d1b147848d1e1faf8a5dbd6d1ca1fc22977335c19c93"]},"offset":"14154789"}}},"combined-stream":{"files":{"License":{"size":1085,"integrity":{"algorithm":"SHA256","hash":"47eb8ca82c798246774946d1be0f9aa08f025fa8325ced0947aeeb4c05fe5547","blockSize":4194304,"blocks":["47eb8ca82c798246774946d1be0f9aa08f025fa8325ced0947aeeb4c05fe5547"]},"offset":"14155310"},"package.json":{"size":588,"integrity":{"algorithm":"SHA256","hash":"7485ada07ff419e2d23aaf3aa33d2385f2a3ffe9bfa0e3d70b94002c15cc2f84","blockSize":4194304,"blocks":["7485ada07ff419e2d23aaf3aa33d2385f2a3ffe9bfa0e3d70b94002c15cc2f84"]},"offset":"14156395"},"lib":{"files":{"combined_stream.js":{"size":4687,"integrity":{"algorithm":"SHA256","hash":"f3ef1f988ac4292df828cead080b96a2a97bdce1ab8f44f76345820c58ce7b59","blockSize":4194304,"blocks":["f3ef1f988ac4292df828cead080b96a2a97bdce1ab8f44f76345820c58ce7b59"]},"offset":"14156983"}}}}},"concat-map":{"files":{"LICENSE":{"size":1073,"integrity":{"algorithm":"SHA256","hash":"435a6722c786b0a56fbe7387028f1d9d3f3a2d0fb615bb8fee118727c3f59b7b","blockSize":4194304,"blocks":["435a6722c786b0a56fbe7387028f1d9d3f3a2d0fb615bb8fee118727c3f59b7b"]},"offset":"14161670"},"README.markdown":{"size":1165,"integrity":{"algorithm":"SHA256","hash":"2bc76dd6de6869fb5335e04c066edd5ab9d99a2cf7958a25e3c7c8c48768b5b4","blockSize":4194304,"blocks":["2bc76dd6de6869fb5335e04c066edd5ab9d99a2cf7958a25e3c7c8c48768b5b4"]},"offset":"14162743"},"index.js":{"size":345,"integrity":{"algorithm":"SHA256","hash":"091b65d778337599d0140b35d53c038603d1732d27c33bfe39e03871a96926b2","blockSize":4194304,"blocks":["091b65d778337599d0140b35d53c038603d1732d27c33bfe39e03871a96926b2"]},"offset":"14163908"},"package.json":{"size":791,"integrity":{"algorithm":"SHA256","hash":"dbcb8dbd0e1a9f16f63b686d3ece232494dd891708de821840deed5f3717f31f","blockSize":4194304,"blocks":["dbcb8dbd0e1a9f16f63b686d3ece232494dd891708de821840deed5f3717f31f"]},"offset":"14164253"}}},"console-control-strings":{"files":{"LICENSE":{"size":751,"integrity":{"algorithm":"SHA256","hash":"af83b3ce4e592e87b4ecfa8c8cb45bc4ec26d0b3fb8f34f3687088f6928f705f","blockSize":4194304,"blocks":["af83b3ce4e592e87b4ecfa8c8cb45bc4ec26d0b3fb8f34f3687088f6928f705f"]},"offset":"14165044"},"README.md~":{"size":4313,"integrity":{"algorithm":"SHA256","hash":"ac55520730ce4ac83a23048acba02e0c8e2db3a866b3bda404ce43508c0815a0","blockSize":4194304,"blocks":["ac55520730ce4ac83a23048acba02e0c8e2db3a866b3bda404ce43508c0815a0"]},"offset":"14165795"},"index.js":{"size":2339,"integrity":{"algorithm":"SHA256","hash":"fc557c23f6b2effebc75878c7185424b2dd436df2df137791fdc6816ceec0ff2","blockSize":4194304,"blocks":["fc557c23f6b2effebc75878c7185424b2dd436df2df137791fdc6816ceec0ff2"]},"offset":"14170108"},"package.json":{"size":712,"integrity":{"algorithm":"SHA256","hash":"cb551cc0bb208e033e51007d516227f484608b2e2b82991111849b91910e45c6","blockSize":4194304,"blocks":["cb551cc0bb208e033e51007d516227f484608b2e2b82991111849b91910e45c6"]},"offset":"14172447"}}},"content-disposition":{"files":{"HISTORY.md":{"size":1020,"integrity":{"algorithm":"SHA256","hash":"a4d8777eee00a49a897e8ed80b8deaee05915106d03a5b652e0ed1ca5bd605fd","blockSize":4194304,"blocks":["a4d8777eee00a49a897e8ed80b8deaee05915106d03a5b652e0ed1ca5bd605fd"]},"offset":"14173159"},"LICENSE":{"size":1094,"integrity":{"algorithm":"SHA256","hash":"bd47ce7b88c7759630d1e2b9fcfa170a0f1fde522be09e13fb1581a79d090400","blockSize":4194304,"blocks":["bd47ce7b88c7759630d1e2b9fcfa170a0f1fde522be09e13fb1581a79d090400"]},"offset":"14174179"},"index.js":{"size":10594,"integrity":{"algorithm":"SHA256","hash":"e86a88a5d1a9dd74faa753ca4e47a78e38ae930f3206e5e887cf6cb0ad70cbf8","blockSize":4194304,"blocks":["e86a88a5d1a9dd74faa753ca4e47a78e38ae930f3206e5e887cf6cb0ad70cbf8"]},"offset":"14175273"},"package.json":{"size":785,"integrity":{"algorithm":"SHA256","hash":"28fbd46dca76b414ff324c0d45273160eeff9bc0d2c64e2e29390d2e55fabb9c","blockSize":4194304,"blocks":["28fbd46dca76b414ff324c0d45273160eeff9bc0d2c64e2e29390d2e55fabb9c"]},"offset":"14185867"},"node_modules":{"files":{"safe-buffer":{"files":{"LICENSE":{"size":1081,"integrity":{"algorithm":"SHA256","hash":"c7cc929b57080f4b9d0c6cf57669f0463fc5b39906344dfc8d3bc43426b30eac","blockSize":4194304,"blocks":["c7cc929b57080f4b9d0c6cf57669f0463fc5b39906344dfc8d3bc43426b30eac"]},"offset":"41997588"},"index.js":{"size":1670,"integrity":{"algorithm":"SHA256","hash":"184d5c4a83512e3f49d4d5b52f7073f601f933bad11f1fbb3ad364ca5e6478e1","blockSize":4194304,"blocks":["184d5c4a83512e3f49d4d5b52f7073f601f933bad11f1fbb3ad364ca5e6478e1"]},"offset":"41998669"},"package.json":{"size":774,"integrity":{"algorithm":"SHA256","hash":"453bbe16b032826e5ab4f30af0c470f7c256706e0301e7bffbd6b49317c2124a","blockSize":4194304,"blocks":["453bbe16b032826e5ab4f30af0c470f7c256706e0301e7bffbd6b49317c2124a"]},"offset":"42000339"}}}}}}},"content-type":{"files":{"HISTORY.md":{"size":436,"integrity":{"algorithm":"SHA256","hash":"718e7c4b1385550a4563a036778ae75edd3e5bdd255b4f48fe2a1195636c367b","blockSize":4194304,"blocks":["718e7c4b1385550a4563a036778ae75edd3e5bdd255b4f48fe2a1195636c367b"]},"offset":"14186652"},"LICENSE":{"size":1089,"integrity":{"algorithm":"SHA256","hash":"257aed98914108e91a337912727b6a802eef218248507f74b76faffaff517a38","blockSize":4194304,"blocks":["257aed98914108e91a337912727b6a802eef218248507f74b76faffaff517a38"]},"offset":"14187088"},"index.js":{"size":4809,"integrity":{"algorithm":"SHA256","hash":"85ffe59d050974725c044a0cead644db76f4bffe823753723670244b90629c5b","blockSize":4194304,"blocks":["85ffe59d050974725c044a0cead644db76f4bffe823753723670244b90629c5b"]},"offset":"14188177"},"package.json":{"size":651,"integrity":{"algorithm":"SHA256","hash":"e1ac3a1d1427b2021fb9448751315a60df00a40e49ff4de07231f5b298e64a1f","blockSize":4194304,"blocks":["e1ac3a1d1427b2021fb9448751315a60df00a40e49ff4de07231f5b298e64a1f"]},"offset":"14192986"}}},"cookie":{"files":{"HISTORY.md":{"size":3120,"integrity":{"algorithm":"SHA256","hash":"8615065adf2b32892823d484adb56422ae9520a8793cb106c721005d5d5057fb","blockSize":4194304,"blocks":["8615065adf2b32892823d484adb56422ae9520a8793cb106c721005d5d5057fb"]},"offset":"14193637"},"LICENSE":{"size":1175,"integrity":{"algorithm":"SHA256","hash":"c02110eedc16c7114f1a9bdc026c65626ce1d9c7e27fd51a8e0feee8a48a6858","blockSize":4194304,"blocks":["c02110eedc16c7114f1a9bdc026c65626ce1d9c7e27fd51a8e0feee8a48a6858"]},"offset":"14196757"},"SECURITY.md":{"size":1180,"integrity":{"algorithm":"SHA256","hash":"299f5e632ccb1ae2d74f95dac09db13d7ff46c482663b67032e3e72cbe376276","blockSize":4194304,"blocks":["299f5e632ccb1ae2d74f95dac09db13d7ff46c482663b67032e3e72cbe376276"]},"offset":"14197932"},"index.js":{"size":5224,"integrity":{"algorithm":"SHA256","hash":"e126db16fe09ecb82f362b937a8a92c0d9ac094354f9e7da1e14040df2951a3e","blockSize":4194304,"blocks":["e126db16fe09ecb82f362b937a8a92c0d9ac094354f9e7da1e14040df2951a3e"]},"offset":"14199112"},"package.json":{"size":605,"integrity":{"algorithm":"SHA256","hash":"ce4fae707d6a86f0c35fa7d37ccf5b9da45e6348184355ba53827f0c0636fb4f","blockSize":4194304,"blocks":["ce4fae707d6a86f0c35fa7d37ccf5b9da45e6348184355ba53827f0c0636fb4f"]},"offset":"14204336"}}},"cookie-signature":{"files":{"History.md":{"size":695,"integrity":{"algorithm":"SHA256","hash":"8bde8405601443bd5186594728b3dc538b50cb5b0f283e26d1de9b23d976abfa","blockSize":4194304,"blocks":["8bde8405601443bd5186594728b3dc538b50cb5b0f283e26d1de9b23d976abfa"]},"offset":"14204941"},"index.js":{"size":1230,"integrity":{"algorithm":"SHA256","hash":"8d762862020064468b4af17e561ee1ee29d9d55311a1c19d958c4ff2be912963","blockSize":4194304,"blocks":["8d762862020064468b4af17e561ee1ee29d9d55311a1c19d958c4ff2be912963"]},"offset":"14205636"},"package.json":{"size":385,"integrity":{"algorithm":"SHA256","hash":"c8eaddb05a3db32e47d2d30c23af1b5a01b10753e2d9655a0d69e3f8a5673cf7","blockSize":4194304,"blocks":["c8eaddb05a3db32e47d2d30c23af1b5a01b10753e2d9655a0d69e3f8a5673cf7"]},"offset":"14206866"}}},"debug":{"files":{"LICENSE":{"size":1139,"integrity":{"algorithm":"SHA256","hash":"3a61c6c96caf5c1d9b623fb9b04c822b783dfcb78aa7e49c76a3f643e6ed7f95","blockSize":4194304,"blocks":["3a61c6c96caf5c1d9b623fb9b04c822b783dfcb78aa7e49c76a3f643e6ed7f95"]},"offset":"14207251"},"package.json":{"size":913,"integrity":{"algorithm":"SHA256","hash":"ebf1a65a8ebf6363b6256e720b6d6e2214c91c2fdd9f3c73e3ba402faea04231","blockSize":4194304,"blocks":["ebf1a65a8ebf6363b6256e720b6d6e2214c91c2fdd9f3c73e3ba402faea04231"]},"offset":"14208390"},"src":{"files":{"browser.js":{"size":6010,"integrity":{"algorithm":"SHA256","hash":"4e3dc6d0e1db58a0d74206b443f35582d3b717be56a0f6d030c34af6c2ad9f62","blockSize":4194304,"blocks":["4e3dc6d0e1db58a0d74206b443f35582d3b717be56a0f6d030c34af6c2ad9f62"]},"offset":"14209303"},"common.js":{"size":6289,"integrity":{"algorithm":"SHA256","hash":"c65bff44c189188e0c45afdbd9b02c427ff5c6e54b94da53c102fbb7a53f0e37","blockSize":4194304,"blocks":["c65bff44c189188e0c45afdbd9b02c427ff5c6e54b94da53c102fbb7a53f0e37"]},"offset":"14215313"},"index.js":{"size":314,"integrity":{"algorithm":"SHA256","hash":"aa127ff1752b7d9c7415c5c7bb6994d9aa722b81bcbcab4bd48316b013d23bf3","blockSize":4194304,"blocks":["aa127ff1752b7d9c7415c5c7bb6994d9aa722b81bcbcab4bd48316b013d23bf3"]},"offset":"14221602"},"node.js":{"size":4685,"integrity":{"algorithm":"SHA256","hash":"f237adcb52849de7c128f57e0468b52353c529a6c8341810477c0e7144359559","blockSize":4194304,"blocks":["f237adcb52849de7c128f57e0468b52353c529a6c8341810477c0e7144359559"]},"offset":"14221916"}}}}},"deep-extend":{"files":{"LICENSE":{"size":1093,"integrity":{"algorithm":"SHA256","hash":"e17120ad3deff741c2ca5cbe511971ca33971a1ba6e49694c6498309bb2680b9","blockSize":4194304,"blocks":["e17120ad3deff741c2ca5cbe511971ca33971a1ba6e49694c6498309bb2680b9"]},"offset":"14226601"},"index.js":{"size":47,"integrity":{"algorithm":"SHA256","hash":"3589a8446276886aa54f8dda47d0d12be90fb167925559fab4a906ddfca6f91f","blockSize":4194304,"blocks":["3589a8446276886aa54f8dda47d0d12be90fb167925559fab4a906ddfca6f91f"]},"offset":"14227694"},"package.json":{"size":676,"integrity":{"algorithm":"SHA256","hash":"37e7d27966aff6ccc3ca6dee7cf8234226180705fd771bde8cbbc45cdeb30726","blockSize":4194304,"blocks":["37e7d27966aff6ccc3ca6dee7cf8234226180705fd771bde8cbbc45cdeb30726"]},"offset":"14227741"},"lib":{"files":{"deep-extend.js":{"size":4293,"integrity":{"algorithm":"SHA256","hash":"87aadac5b3cc8081b570a243c17c575c195c4ae642e98834495291fa626ed9d6","blockSize":4194304,"blocks":["87aadac5b3cc8081b570a243c17c575c195c4ae642e98834495291fa626ed9d6"]},"offset":"14228417"}}}}},"define-lazy-prop":{"files":{"index.js":{"size":404,"integrity":{"algorithm":"SHA256","hash":"42c01a7a4835ee610892e3456141d056f399132a391bb6b0b4bf86555131fddc","blockSize":4194304,"blocks":["42c01a7a4835ee610892e3456141d056f399132a391bb6b0b4bf86555131fddc"]},"offset":"14232710"},"license":{"size":1109,"integrity":{"algorithm":"SHA256","hash":"48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0","blockSize":4194304,"blocks":["48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0"]},"offset":"14233114"},"package.json":{"size":487,"integrity":{"algorithm":"SHA256","hash":"d60894026ab0e874e7394c62d148da6813b6fbd28fbcec6f3654a60a5f55d7f7","blockSize":4194304,"blocks":["d60894026ab0e874e7394c62d148da6813b6fbd28fbcec6f3654a60a5f55d7f7"]},"offset":"14234223"}}},"define-properties":{"files":{".editorconfig":{"size":276,"integrity":{"algorithm":"SHA256","hash":"ede54e8b6b96147c61efd0ddc56d3683508a26066a8baabd63673d2779a06f23","blockSize":4194304,"blocks":["ede54e8b6b96147c61efd0ddc56d3683508a26066a8baabd63673d2779a06f23"]},"offset":"14234710"},".nycrc":{"size":139,"integrity":{"algorithm":"SHA256","hash":"997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a","blockSize":4194304,"blocks":["997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a"]},"offset":"14234986"},"LICENSE":{"size":1080,"integrity":{"algorithm":"SHA256","hash":"00d402c2bbe7c67369bd01ce2c16b8ed46ccc949a1ee2d6bb8f9606afa8c7434","blockSize":4194304,"blocks":["00d402c2bbe7c67369bd01ce2c16b8ed46ccc949a1ee2d6bb8f9606afa8c7434"]},"offset":"14235125"},"index.js":{"size":1335,"integrity":{"algorithm":"SHA256","hash":"faab2a03ddbaf91dc7c251d0153a353a352e61ec013a2762d33b6bb661503ea2","blockSize":4194304,"blocks":["faab2a03ddbaf91dc7c251d0153a353a352e61ec013a2762d33b6bb661503ea2"]},"offset":"14236205"},"package.json":{"size":1234,"integrity":{"algorithm":"SHA256","hash":"0cbf58c1ee3074aac61e2971aee5e44ffb20dafcf364ba7855ab4c9cac2f12da","blockSize":4194304,"blocks":["0cbf58c1ee3074aac61e2971aee5e44ffb20dafcf364ba7855ab4c9cac2f12da"]},"offset":"14237540"},".github":{"files":{"FUNDING.yml":{"size":588,"integrity":{"algorithm":"SHA256","hash":"f569ace05f62d6d711bc5ca55b8acaedd9cd075e5ad8b7357450a1b6dc6bf67e","blockSize":4194304,"blocks":["f569ace05f62d6d711bc5ca55b8acaedd9cd075e5ad8b7357450a1b6dc6bf67e"]},"offset":"14238774"}}}}},"delayed-stream":{"files":{"License":{"size":1085,"integrity":{"algorithm":"SHA256","hash":"47eb8ca82c798246774946d1be0f9aa08f025fa8325ced0947aeeb4c05fe5547","blockSize":4194304,"blocks":["47eb8ca82c798246774946d1be0f9aa08f025fa8325ced0947aeeb4c05fe5547"]},"offset":"14239362"},"Makefile":{"size":57,"integrity":{"algorithm":"SHA256","hash":"90e1ae0474085186499fe5a5c1d6ae31726175fa4e1a2158c9914be4bfc5bae6","blockSize":4194304,"blocks":["90e1ae0474085186499fe5a5c1d6ae31726175fa4e1a2158c9914be4bfc5bae6"]},"offset":"14240447"},"package.json":{"size":574,"integrity":{"algorithm":"SHA256","hash":"b92d136b7eb2c73d86eff7181da37de00eb1e7bf0b103d9925f2925abaec3956","blockSize":4194304,"blocks":["b92d136b7eb2c73d86eff7181da37de00eb1e7bf0b103d9925f2925abaec3956"]},"offset":"14240504"},"lib":{"files":{"delayed_stream.js":{"size":2319,"integrity":{"algorithm":"SHA256","hash":"05f147c24e59e1c538329711b6e4a389fbbf321290fe176cda18750298d77c72","blockSize":4194304,"blocks":["05f147c24e59e1c538329711b6e4a389fbbf321290fe176cda18750298d77c72"]},"offset":"14241078"}}}}},"delegates":{"files":{"History.md":{"size":336,"integrity":{"algorithm":"SHA256","hash":"f4686952cccf52b0cfdee52d5f2960dc5e8097a608987b22339aca0f18a82b89","blockSize":4194304,"blocks":["f4686952cccf52b0cfdee52d5f2960dc5e8097a608987b22339aca0f18a82b89"]},"offset":"14243397"},"License":{"size":1079,"integrity":{"algorithm":"SHA256","hash":"cb4e4296dfc59387f7c6ef71b670cde7050617313fcea7173995176fec0fcef2","blockSize":4194304,"blocks":["cb4e4296dfc59387f7c6ef71b670cde7050617313fcea7173995176fec0fcef2"]},"offset":"14243733"},"Makefile":{"size":100,"integrity":{"algorithm":"SHA256","hash":"6438415ebea1a06c38fb94429c95be38996b1e774f6515d9a48e5d48df20e9c9","blockSize":4194304,"blocks":["6438415ebea1a06c38fb94429c95be38996b1e774f6515d9a48e5d48df20e9c9"]},"offset":"14244812"},"index.js":{"size":2065,"integrity":{"algorithm":"SHA256","hash":"db3ee6ab2fdabdffc19d5df0cf9461488329379cbb0640eb73203a35197960aa","blockSize":4194304,"blocks":["db3ee6ab2fdabdffc19d5df0cf9461488329379cbb0640eb73203a35197960aa"]},"offset":"14244912"},"package.json":{"size":270,"integrity":{"algorithm":"SHA256","hash":"80f90640979f3af7f3f9c6d590815a4cb26b47902b1266da86b0b0d6c71a1239","blockSize":4194304,"blocks":["80f90640979f3af7f3f9c6d590815a4cb26b47902b1266da86b0b0d6c71a1239"]},"offset":"14246977"}}},"depd":{"files":{"History.md":{"size":2256,"integrity":{"algorithm":"SHA256","hash":"b6e94899b155a3f707694b8ced212e1b01f43d0953d89e1c5b718b3e5fb896fa","blockSize":4194304,"blocks":["b6e94899b155a3f707694b8ced212e1b01f43d0953d89e1c5b718b3e5fb896fa"]},"offset":"14247247"},"LICENSE":{"size":1094,"integrity":{"algorithm":"SHA256","hash":"bd134b41da59e452fb5a1d366b660886f741c87c2bf9428e93764c419fbc40f5","blockSize":4194304,"blocks":["bd134b41da59e452fb5a1d366b660886f741c87c2bf9428e93764c419fbc40f5"]},"offset":"14249503"},"index.js":{"size":10932,"integrity":{"algorithm":"SHA256","hash":"4d587a5662e20a7bb9bfe6555afe5987e1b80303a819b447394f37a93297ee91","blockSize":4194304,"blocks":["4d587a5662e20a7bb9bfe6555afe5987e1b80303a819b447394f37a93297ee91"]},"offset":"14250597"},"package.json":{"size":836,"integrity":{"algorithm":"SHA256","hash":"ca296e22f562adb157dc70410e4f30e05a0001e306fac121a89dc60e32935dbb","blockSize":4194304,"blocks":["ca296e22f562adb157dc70410e4f30e05a0001e306fac121a89dc60e32935dbb"]},"offset":"14261529"},"lib":{"files":{"browser":{"files":{"index.js":{"size":1512,"integrity":{"algorithm":"SHA256","hash":"10b4d4a4e9d14e9e6a5ab7ced64405ef90e6bec94d479a8e223cbba88828ad79","blockSize":4194304,"blocks":["10b4d4a4e9d14e9e6a5ab7ced64405ef90e6bec94d479a8e223cbba88828ad79"]},"offset":"14262365"}}}}}}},"destroy":{"files":{"LICENSE":{"size":1173,"integrity":{"algorithm":"SHA256","hash":"ffe370c8785b0b688d954977ce8dc52e19e5f17962cc5f80009c85eba4925d56","blockSize":4194304,"blocks":["ffe370c8785b0b688d954977ce8dc52e19e5f17962cc5f80009c85eba4925d56"]},"offset":"14263877"},"index.js":{"size":4258,"integrity":{"algorithm":"SHA256","hash":"b54f50db059987726ce2bdadca5d66a1e3ceef183aa5f43ce61aa53f05c36cb7","blockSize":4194304,"blocks":["b54f50db059987726ce2bdadca5d66a1e3ceef183aa5f43ce61aa53f05c36cb7"]},"offset":"14265050"},"package.json":{"size":732,"integrity":{"algorithm":"SHA256","hash":"889d0b0e798958702be6b537e2756a90adb012e6a31f0f6fdae48162ff7f8111","blockSize":4194304,"blocks":["889d0b0e798958702be6b537e2756a90adb012e6a31f0f6fdae48162ff7f8111"]},"offset":"14269308"}}},"detect-libc":{"files":{"LICENSE":{"size":11357,"integrity":{"algorithm":"SHA256","hash":"b40930bbcf80744c86c46a12bc9da056641d722716c378f5659b9e555ef833e1","blockSize":4194304,"blocks":["b40930bbcf80744c86c46a12bc9da056641d722716c378f5659b9e555ef833e1"]},"offset":"14270040"},"package.json":{"size":569,"integrity":{"algorithm":"SHA256","hash":"a0367181f6c2a353568edecf7c16bf18405b6bd33b848095ec1f745db45b5fe3","blockSize":4194304,"blocks":["a0367181f6c2a353568edecf7c16bf18405b6bd33b848095ec1f745db45b5fe3"]},"offset":"14281397"},"lib":{"files":{"detect-libc.js":{"size":3916,"integrity":{"algorithm":"SHA256","hash":"afd3a9b2a9f830a825c21bc873c62ba59bba66bd5a05f6832c44ad1fd2ddcf10","blockSize":4194304,"blocks":["afd3a9b2a9f830a825c21bc873c62ba59bba66bd5a05f6832c44ad1fd2ddcf10"]},"offset":"14281966"},"process.js":{"size":315,"integrity":{"algorithm":"SHA256","hash":"1ec1f857057920bfb319136ad3f2660560b1786a280089d1b8d4a4e72666e3b3","blockSize":4194304,"blocks":["1ec1f857057920bfb319136ad3f2660560b1786a280089d1b8d4a4e72666e3b3"]},"offset":"14285882"}}}}},"dotenv":{"files":{"LICENSE":{"size":1294,"integrity":{"algorithm":"SHA256","hash":"74b629b24865e1e83c5277ee84590b7937644d6fd959d0c7bdce758676cd2ced","blockSize":4194304,"blocks":["74b629b24865e1e83c5277ee84590b7937644d6fd959d0c7bdce758676cd2ced"]},"offset":"14286197"},"config.js":{"size":176,"integrity":{"algorithm":"SHA256","hash":"cd401a4aeb31f30ee55c295b0b65fccb6f1a0e3b7dfd2def4f69dd2a13a8fef2","blockSize":4194304,"blocks":["cd401a4aeb31f30ee55c295b0b65fccb6f1a0e3b7dfd2def4f69dd2a13a8fef2"]},"offset":"14287491"},"package.json":{"size":1098,"integrity":{"algorithm":"SHA256","hash":"b587d7002576279a234bd1039b05f6b8426e24e4263b3215cec1966d5cd3c715","blockSize":4194304,"blocks":["b587d7002576279a234bd1039b05f6b8426e24e4263b3215cec1966d5cd3c715"]},"offset":"14287667"},"lib":{"files":{"cli-options.js":{"size":278,"integrity":{"algorithm":"SHA256","hash":"f4e250a747260c64c7c7b66f3047de8d1b7df45d1267370aaaa2b66bb8fa7691","blockSize":4194304,"blocks":["f4e250a747260c64c7c7b66f3047de8d1b7df45d1267370aaaa2b66bb8fa7691"]},"offset":"14288765"},"env-options.js":{"size":518,"integrity":{"algorithm":"SHA256","hash":"f2717b9049742daee88b280b48c73df758ccd706553941b592865cb89d40b0ec","blockSize":4194304,"blocks":["f2717b9049742daee88b280b48c73df758ccd706553941b592865cb89d40b0ec"]},"offset":"14289043"},"main.js":{"size":2784,"integrity":{"algorithm":"SHA256","hash":"cd766b32605208c9541eb13582c16aaf807476084fc873655ac298916c7d50e0","blockSize":4194304,"blocks":["cd766b32605208c9541eb13582c16aaf807476084fc873655ac298916c7d50e0"]},"offset":"14289561"}}}}},"dottie":{"files":{"LICENSE":{"size":1098,"integrity":{"algorithm":"SHA256","hash":"df9a813292308b7079f490b7f6c3e41dffc4f48ca3960664475824666387df93","blockSize":4194304,"blocks":["df9a813292308b7079f490b7f6c3e41dffc4f48ca3960664475824666387df93"]},"offset":"14292345"},"dottie.js":{"size":6202,"integrity":{"algorithm":"SHA256","hash":"f7d4a45ca96413072cf177af01d1bfe02079b8aa15ccf466ab57b42b2fd3b835","blockSize":4194304,"blocks":["f7d4a45ca96413072cf177af01d1bfe02079b8aa15ccf466ab57b42b2fd3b835"]},"offset":"14293443"},"package.json":{"size":422,"integrity":{"algorithm":"SHA256","hash":"3d2c483e8fad4bc4fd83fb778b99a49bdd1ab975eb5f559f0804b92ca42efa49","blockSize":4194304,"blocks":["3d2c483e8fad4bc4fd83fb778b99a49bdd1ab975eb5f559f0804b92ca42efa49"]},"offset":"14299645"}}},"ecdsa-sig-formatter":{"files":{"CODEOWNERS":{"size":11,"integrity":{"algorithm":"SHA256","hash":"a4cc581ea5553d0cec140293fba981ec4d137bee809a4e32ed4419e8e36f68ce","blockSize":4194304,"blocks":["a4cc581ea5553d0cec140293fba981ec4d137bee809a4e32ed4419e8e36f68ce"]},"offset":"14300067"},"LICENSE":{"size":11312,"integrity":{"algorithm":"SHA256","hash":"50a6b24f8defc31a078aa9799a91d776f83948071574854f12473362aee74d0d","blockSize":4194304,"blocks":["50a6b24f8defc31a078aa9799a91d776f83948071574854f12473362aee74d0d"]},"offset":"14300078"},"package.json":{"size":827,"integrity":{"algorithm":"SHA256","hash":"590203533654a45a540e11acab67a2b142704508a3d1288761043036eb91816b","blockSize":4194304,"blocks":["590203533654a45a540e11acab67a2b142704508a3d1288761043036eb91816b"]},"offset":"14311390"},"src":{"files":{"ecdsa-sig-formatter.js":{"size":5009,"integrity":{"algorithm":"SHA256","hash":"9c7330949ada946a3c89be79ba66597616342c643ef5ab13a646c72147c11666","blockSize":4194304,"blocks":["9c7330949ada946a3c89be79ba66597616342c643ef5ab13a646c72147c11666"]},"offset":"14312217"},"param-bytes-for-alg.js":{"size":456,"integrity":{"algorithm":"SHA256","hash":"4352fe33309e8085148db1fabc91748137089d830a85498d4e50a17c813ea1fc","blockSize":4194304,"blocks":["4352fe33309e8085148db1fabc91748137089d830a85498d4e50a17c813ea1fc"]},"offset":"14317226"}}}}},"ee-first":{"files":{"LICENSE":{"size":1099,"integrity":{"algorithm":"SHA256","hash":"965ef284f7f4c176842ec2e87fa13e79feed777d56d7a21a5a3b38f1bb6dc288","blockSize":4194304,"blocks":["965ef284f7f4c176842ec2e87fa13e79feed777d56d7a21a5a3b38f1bb6dc288"]},"offset":"14317682"},"index.js":{"size":1684,"integrity":{"algorithm":"SHA256","hash":"29d3cccddc7148f48715bfc94eb6f7b9f9132a5ecb704b9d4b713de87e7603dd","blockSize":4194304,"blocks":["29d3cccddc7148f48715bfc94eb6f7b9f9132a5ecb704b9d4b713de87e7603dd"]},"offset":"14318781"},"package.json":{"size":466,"integrity":{"algorithm":"SHA256","hash":"417d3634c0f12bf7fae3aca0c8b295f93a206e027f5b60c1442576051f8332f5","blockSize":4194304,"blocks":["417d3634c0f12bf7fae3aca0c8b295f93a206e027f5b60c1442576051f8332f5"]},"offset":"14320465"}}},"electron-log":{"files":{"LICENSE":{"size":1082,"integrity":{"algorithm":"SHA256","hash":"8a7030a9df0eac3ba1948991278d847d3e4c8dc4908a777b5868692c975ccfa8","blockSize":4194304,"blocks":["8a7030a9df0eac3ba1948991278d847d3e4c8dc4908a777b5868692c975ccfa8"]},"offset":"14320931"},"package.json":{"size":715,"integrity":{"algorithm":"SHA256","hash":"5f4634406598709a2e381e5be44960d1af5e88f5e6b2c6542aad77e5bd20ae6c","blockSize":4194304,"blocks":["5f4634406598709a2e381e5be44960d1af5e88f5e6b2c6542aad77e5bd20ae6c"]},"offset":"14322013"},"src":{"files":{"catchErrors.js":{"size":2428,"integrity":{"algorithm":"SHA256","hash":"d0b5bb236b4ae604bec8faf53f819bf8f087bc54e2c0b2f9a2fb71af677663c9","blockSize":4194304,"blocks":["d0b5bb236b4ae604bec8faf53f819bf8f087bc54e2c0b2f9a2fb71af677663c9"]},"offset":"14322728"},"electronApi.js":{"size":4807,"integrity":{"algorithm":"SHA256","hash":"c5bbb65812103944ac7261f07534ac4d537094e3adb00249fe604675010dc0c4","blockSize":4194304,"blocks":["c5bbb65812103944ac7261f07534ac4d537094e3adb00249fe604675010dc0c4"]},"offset":"14325156"},"index.js":{"size":2212,"integrity":{"algorithm":"SHA256","hash":"28c11d063800e9ddfaf1bbf2f33542463cf2b704b7f45208055f6414855c5be9","blockSize":4194304,"blocks":["28c11d063800e9ddfaf1bbf2f33542463cf2b704b7f45208055f6414855c5be9"]},"offset":"14329963"},"log.js":{"size":1576,"integrity":{"algorithm":"SHA256","hash":"a30767af0475c7d81d9e13405b86443ad4f7c6f08e2027398a6505469e8cf13a","blockSize":4194304,"blocks":["a30767af0475c7d81d9e13405b86443ad4f7c6f08e2027398a6505469e8cf13a"]},"offset":"14332175"},"scope.js":{"size":1302,"integrity":{"algorithm":"SHA256","hash":"2b5acf7e6d22daee042679754690d02f495a667758a9a61cc463b62ca52568e9","blockSize":4194304,"blocks":["2b5acf7e6d22daee042679754690d02f495a667758a9a61cc463b62ca52568e9"]},"offset":"14333751"},"transports":{"files":{"console.js":{"size":3034,"integrity":{"algorithm":"SHA256","hash":"be3b503cdf49c5f1315c80b6a3211fe9015f28512f6b3353e7f1d8695d1499ce","blockSize":4194304,"blocks":["be3b503cdf49c5f1315c80b6a3211fe9015f28512f6b3353e7f1d8695d1499ce"]},"offset":"14335053"},"ipc.js":{"size":1098,"integrity":{"algorithm":"SHA256","hash":"9cf486306cc0f7cb2323bdcfa86b8d9c71126082d4e865c80eb49c1b06180630","blockSize":4194304,"blocks":["9cf486306cc0f7cb2323bdcfa86b8d9c71126082d4e865c80eb49c1b06180630"]},"offset":"14338087"},"remote.js":{"size":2172,"integrity":{"algorithm":"SHA256","hash":"4dfaf775b7016ad653e133255b5f75e18fb278f37e0ed432cba7c4b5c9e70242","blockSize":4194304,"blocks":["4dfaf775b7016ad653e133255b5f75e18fb278f37e0ed432cba7c4b5c9e70242"]},"offset":"14339185"},"file":{"files":{"file.js":{"size":6821,"integrity":{"algorithm":"SHA256","hash":"8928298483d9aae07e709876302c32502e2b18a5c877ea3a05f069cebe459dad","blockSize":4194304,"blocks":["8928298483d9aae07e709876302c32502e2b18a5c877ea3a05f069cebe459dad"]},"offset":"14341357"},"index.js":{"size":5298,"integrity":{"algorithm":"SHA256","hash":"3655056b631fb976a002dd5a066ed69b5895acefde73c2d64f8a78b02df2bc5f","blockSize":4194304,"blocks":["3655056b631fb976a002dd5a066ed69b5895acefde73c2d64f8a78b02df2bc5f"]},"offset":"14348178"},"packageJson.js":{"size":2242,"integrity":{"algorithm":"SHA256","hash":"3f514a67e84787db1d6ad79f1b229c627d0fac940c8bef1ec05e1c98c38d9e5c","blockSize":4194304,"blocks":["3f514a67e84787db1d6ad79f1b229c627d0fac940c8bef1ec05e1c98c38d9e5c"]},"offset":"14353476"},"variables.js":{"size":2793,"integrity":{"algorithm":"SHA256","hash":"6b21789dfe8c3b760981d81347dee4bc85b5bdd028c62865509134a254100f49","blockSize":4194304,"blocks":["6b21789dfe8c3b760981d81347dee4bc85b5bdd028c62865509134a254100f49"]},"offset":"14355718"},"__specs__":{"files":{"file.spec.js":{"size":5129,"integrity":{"algorithm":"SHA256","hash":"a780005be8ac9b798a1746b7ab0e94b14615bc9634b6d8c5752b11fa7026a97f","blockSize":4194304,"blocks":["a780005be8ac9b798a1746b7ab0e94b14615bc9634b6d8c5752b11fa7026a97f"]},"offset":"14358511"},"index.spec.js":{"size":4660,"integrity":{"algorithm":"SHA256","hash":"aea8b94e7e17c0b17b6d181777f497f214d674097d1c18c67c06f1130fdb2a74","blockSize":4194304,"blocks":["aea8b94e7e17c0b17b6d181777f497f214d674097d1c18c67c06f1130fdb2a74"]},"offset":"14363640"},"makeTmpDir.js":{"size":546,"integrity":{"algorithm":"SHA256","hash":"b80492acb635cccc47e4ad2e649d8c3a19928e8df0bc7a01c759eec6dccbc378","blockSize":4194304,"blocks":["b80492acb635cccc47e4ad2e649d8c3a19928e8df0bc7a01c759eec6dccbc378"]},"offset":"14368300"},"packageJson.spec.js":{"size":871,"integrity":{"algorithm":"SHA256","hash":"294e1fce19d5644992fa5c76614187e2de6a03a2cb18ba52b86a2795e10b4921","blockSize":4194304,"blocks":["294e1fce19d5644992fa5c76614187e2de6a03a2cb18ba52b86a2795e10b4921"]},"offset":"14368846"},"variables.spec.js":{"size":4530,"integrity":{"algorithm":"SHA256","hash":"e4374004d53c9800628a2e87a977424fa1ca0b5903bb079071fb220f9526ecd5","blockSize":4194304,"blocks":["e4374004d53c9800628a2e87a977424fa1ca0b5903bb079071fb220f9526ecd5"]},"offset":"14369717"}}}}},"__specs__":{"files":{"console.spec.js":{"size":5347,"integrity":{"algorithm":"SHA256","hash":"476d0a042ab27208790995f825bd7427521e659441acfc38934b9809227b7eba","blockSize":4194304,"blocks":["476d0a042ab27208790995f825bd7427521e659441acfc38934b9809227b7eba"]},"offset":"14374247"}}}}},"transform":{"files":{"index.js":{"size":1544,"integrity":{"algorithm":"SHA256","hash":"5090938d0760b8511d20baae9367ff6d292a09fae0ebabbc39390054ffb1e026","blockSize":4194304,"blocks":["5090938d0760b8511d20baae9367ff6d292a09fae0ebabbc39390054ffb1e026"]},"offset":"14379594"},"object.js":{"size":3479,"integrity":{"algorithm":"SHA256","hash":"367fd05b4718300880e37b83f2e6b83190bb363fdefc4c4324b5345ebe7d0d0a","blockSize":4194304,"blocks":["367fd05b4718300880e37b83f2e6b83190bb363fdefc4c4324b5345ebe7d0d0a"]},"offset":"14381138"},"style.js":{"size":1600,"integrity":{"algorithm":"SHA256","hash":"5fcde50e9349f81838a7238d385bbfd722d13aafc62926664ebb972c49d84035","blockSize":4194304,"blocks":["5fcde50e9349f81838a7238d385bbfd722d13aafc62926664ebb972c49d84035"]},"offset":"14384617"},"template.js":{"size":3998,"integrity":{"algorithm":"SHA256","hash":"d9a88eadc2b85c3440fda09587e5724c5529ce2c30cec13dbaba3ea2e107e0c6","blockSize":4194304,"blocks":["d9a88eadc2b85c3440fda09587e5724c5529ce2c30cec13dbaba3ea2e107e0c6"]},"offset":"14386217"},"__specs__":{"files":{"index.spec.js":{"size":951,"integrity":{"algorithm":"SHA256","hash":"b4dc8c310db2d0fdd97228ecbbc08a92602f3adebac6d2d7078ed2bfd5054dc6","blockSize":4194304,"blocks":["b4dc8c310db2d0fdd97228ecbbc08a92602f3adebac6d2d7078ed2bfd5054dc6"]},"offset":"14390215"},"object.spec.js":{"size":2112,"integrity":{"algorithm":"SHA256","hash":"c46409fc51d4a0b08c22cf43eade968e69a8717bb1dc7c49071a7f64b1b32bb5","blockSize":4194304,"blocks":["c46409fc51d4a0b08c22cf43eade968e69a8717bb1dc7c49071a7f64b1b32bb5"]},"offset":"14391166"},"style.spec.js":{"size":1111,"integrity":{"algorithm":"SHA256","hash":"26fcb46920f273d694e5cf7af11fb1c91cfaca8f75ceed2cbec7661a66d3fe77","blockSize":4194304,"blocks":["26fcb46920f273d694e5cf7af11fb1c91cfaca8f75ceed2cbec7661a66d3fe77"]},"offset":"14393278"},"template.spec.js":{"size":2992,"integrity":{"algorithm":"SHA256","hash":"98599211f2d38dcfd4aeca14bebf148b273ca216711341389f521fdf4038310b","blockSize":4194304,"blocks":["98599211f2d38dcfd4aeca14bebf148b273ca216711341389f521fdf4038310b"]},"offset":"14394389"}}}}},"__specs__":{"files":{"catchErrors.spec.js":{"size":1050,"integrity":{"algorithm":"SHA256","hash":"83df8604ec48799b7e7b76e9987f4c7e08339d67d8a47f59ca4eaf66164c67a0","blockSize":4194304,"blocks":["83df8604ec48799b7e7b76e9987f4c7e08339d67d8a47f59ca4eaf66164c67a0"]},"offset":"14397381"},"index.d.test.ts":{"size":285,"integrity":{"algorithm":"SHA256","hash":"7429a6c55b50bd7d954be77f77a53aed8c21e14fcf2da1ae2a3cb08da9050fe2","blockSize":4194304,"blocks":["7429a6c55b50bd7d954be77f77a53aed8c21e14fcf2da1ae2a3cb08da9050fe2"]},"offset":"14398431"},"index.spec.js":{"size":1068,"integrity":{"algorithm":"SHA256","hash":"06e75026968bf81d05f9bf8711fb47c928375f7e451e0207c834b3fc243bd9ed","blockSize":4194304,"blocks":["06e75026968bf81d05f9bf8711fb47c928375f7e451e0207c834b3fc243bd9ed"]},"offset":"14398716"},"log.spec.js":{"size":3272,"integrity":{"algorithm":"SHA256","hash":"847fcbd2046894cc2deaaa0ab5fe705b08fc37090d8098373aaee00f5c7f9d3d","blockSize":4194304,"blocks":["847fcbd2046894cc2deaaa0ab5fe705b08fc37090d8098373aaee00f5c7f9d3d"]},"offset":"14399784"},"scope.spec.js":{"size":1462,"integrity":{"algorithm":"SHA256","hash":"52a1ee7b37f5dae7af53d8ee06f7b048e67a668b0adf74ba545deabff4932ed0","blockSize":4194304,"blocks":["52a1ee7b37f5dae7af53d8ee06f7b048e67a668b0adf74ba545deabff4932ed0"]},"offset":"14403056"},"utils":{"files":{"TestLogReader.js":{"size":2589,"integrity":{"algorithm":"SHA256","hash":"355b129d7a074b70a54d370b1f0f966d5c71342ccbec70759cf5c93b7140815d","blockSize":4194304,"blocks":["355b129d7a074b70a54d370b1f0f966d5c71342ccbec70759cf5c93b7140815d"]},"offset":"14404518"},"fsHelpers.js":{"size":552,"integrity":{"algorithm":"SHA256","hash":"443be2dc7c70f5782baf170f04913cdd979c1029212860fdf7b894b79afb731a","blockSize":4194304,"blocks":["443be2dc7c70f5782baf170f04913cdd979c1029212860fdf7b894b79afb731a"]},"offset":"14407107"}}}}}}}}},"electron-updater":{"files":{"LICENSE":{"size":1084,"integrity":{"algorithm":"SHA256","hash":"bed8d0ab3e6031817f775a641ff37313b0f5591bc8ba0ed79b978dafbd4231ce","blockSize":4194304,"blocks":["bed8d0ab3e6031817f775a641ff37313b0f5591bc8ba0ed79b978dafbd4231ce"]},"offset":"14407659"},"package.json":{"size":1007,"integrity":{"algorithm":"SHA256","hash":"156fc53b44c6e2eb9f9a0726098b8abad4c2aee7188356abceab16f1fdf2374a","blockSize":4194304,"blocks":["156fc53b44c6e2eb9f9a0726098b8abad4c2aee7188356abceab16f1fdf2374a"]},"offset":"14408743"},"out":{"files":{"AppAdapter.js":{"size":791,"integrity":{"algorithm":"SHA256","hash":"c4246799185c241e36c78f107120a0838bd0bfb07cabfc85b692ad2c321f26f7","blockSize":4194304,"blocks":["c4246799185c241e36c78f107120a0838bd0bfb07cabfc85b692ad2c321f26f7"]},"offset":"14409750"},"AppImageUpdater.js":{"size":5125,"integrity":{"algorithm":"SHA256","hash":"e06e0246e717b5587bccec924cb7858dc7812d601cebd4f5140ad257dccfa83d","blockSize":4194304,"blocks":["e06e0246e717b5587bccec924cb7858dc7812d601cebd4f5140ad257dccfa83d"]},"offset":"14410541"},"AppUpdater.js":{"size":24109,"integrity":{"algorithm":"SHA256","hash":"60aded2c6fe646578a14b0d268bbc8861e78425663aff8bed8176f184e14dd25","blockSize":4194304,"blocks":["60aded2c6fe646578a14b0d268bbc8861e78425663aff8bed8176f184e14dd25"]},"offset":"14415666"},"BaseUpdater.js":{"size":3518,"integrity":{"algorithm":"SHA256","hash":"48da6062ceef5a8e43d1d40bac73139fee719fe731fb802787d8b52f85ea2d9b","blockSize":4194304,"blocks":["48da6062ceef5a8e43d1d40bac73139fee719fe731fb802787d8b52f85ea2d9b"]},"offset":"14439775"},"DownloadedUpdateHelper.js":{"size":6954,"integrity":{"algorithm":"SHA256","hash":"c1db2af92ca378d1a92a9088cc4560e3b95c871875caadd782d42d16226894d4","blockSize":4194304,"blocks":["c1db2af92ca378d1a92a9088cc4560e3b95c871875caadd782d42d16226894d4"]},"offset":"14443293"},"ElectronAppAdapter.js":{"size":1123,"integrity":{"algorithm":"SHA256","hash":"55e12978b3750369d97f9d65fed8c6f67035ac6edf3d9820f750d29ead431a2e","blockSize":4194304,"blocks":["55e12978b3750369d97f9d65fed8c6f67035ac6edf3d9820f750d29ead431a2e"]},"offset":"14450247"},"MacUpdater.js":{"size":10429,"integrity":{"algorithm":"SHA256","hash":"4db60d5c91a138911874f8eb8f97faa51a0d037d9a931ca316c0ddcf13688f5d","blockSize":4194304,"blocks":["4db60d5c91a138911874f8eb8f97faa51a0d037d9a931ca316c0ddcf13688f5d"]},"offset":"14451370"},"NsisUpdater.js":{"size":11384,"integrity":{"algorithm":"SHA256","hash":"d43909665ba9a5ae556d06a3049cc0e94151317f903868c411df6fbff91300f7","blockSize":4194304,"blocks":["d43909665ba9a5ae556d06a3049cc0e94151317f903868c411df6fbff91300f7"]},"offset":"14461799"},"electronHttpExecutor.js":{"size":3272,"integrity":{"algorithm":"SHA256","hash":"ec9a54dfc223b13272c393d6704319575e0d06516c8506629fde9812cce1b156","blockSize":4194304,"blocks":["ec9a54dfc223b13272c393d6704319575e0d06516c8506629fde9812cce1b156"]},"offset":"14473183"},"main.js":{"size":3288,"integrity":{"algorithm":"SHA256","hash":"15af6f8c4afb5ae96823116afaa9f367176e6eda40de6c37a699bc2f9334fe13","blockSize":4194304,"blocks":["15af6f8c4afb5ae96823116afaa9f367176e6eda40de6c37a699bc2f9334fe13"]},"offset":"14476455"},"providerFactory.js":{"size":3249,"integrity":{"algorithm":"SHA256","hash":"f30083ebe54929792b3732c966f44540ea9261c81fdc130d2463de14aeeb94f8","blockSize":4194304,"blocks":["f30083ebe54929792b3732c966f44540ea9261c81fdc130d2463de14aeeb94f8"]},"offset":"14479743"},"util.js":{"size":1827,"integrity":{"algorithm":"SHA256","hash":"1a3fd42d0e1b0c55c923a048735f9bbdc8ec2c2d0a2959445848d64a647890ff","blockSize":4194304,"blocks":["1a3fd42d0e1b0c55c923a048735f9bbdc8ec2c2d0a2959445848d64a647890ff"]},"offset":"14482992"},"windowsExecutableCodeSignatureVerifier.js":{"size":6096,"integrity":{"algorithm":"SHA256","hash":"3067d66591dc5cd4f60ff5d2c6a26e0246f5466c19aa3e0cbd5b02d73d748c46","blockSize":4194304,"blocks":["3067d66591dc5cd4f60ff5d2c6a26e0246f5466c19aa3e0cbd5b02d73d748c46"]},"offset":"14484819"},"providers":{"files":{"BitbucketProvider.js":{"size":1939,"integrity":{"algorithm":"SHA256","hash":"0ecca83b82e6dd187500420f1d7610b958713f3cb59e7c9ba06ca435aced9ba7","blockSize":4194304,"blocks":["0ecca83b82e6dd187500420f1d7610b958713f3cb59e7c9ba06ca435aced9ba7"]},"offset":"14490915"},"GenericProvider.js":{"size":2222,"integrity":{"algorithm":"SHA256","hash":"b197afea3371dae9b511fd54529f4b54c689065b5aeb9de4b70c32911d4c2f14","blockSize":4194304,"blocks":["b197afea3371dae9b511fd54529f4b54c689065b5aeb9de4b70c32911d4c2f14"]},"offset":"14492854"},"GitHubProvider.js":{"size":9525,"integrity":{"algorithm":"SHA256","hash":"d56b6793add1f567115b5799574db8dd1c61521ff256f9f6d4926242a0ed65d6","blockSize":4194304,"blocks":["d56b6793add1f567115b5799574db8dd1c61521ff256f9f6d4926242a0ed65d6"]},"offset":"14495076"},"KeygenProvider.js":{"size":2063,"integrity":{"algorithm":"SHA256","hash":"ed3abe7391c67f60617add6a9d7d68b2eeffc9ddee8076f21eed7903e4686a7e","blockSize":4194304,"blocks":["ed3abe7391c67f60617add6a9d7d68b2eeffc9ddee8076f21eed7903e4686a7e"]},"offset":"14504601"},"PrivateGitHubProvider.js":{"size":4193,"integrity":{"algorithm":"SHA256","hash":"c13547d2de69256b523e235e5306146fad99a5034aa982da030d24febb6b364b","blockSize":4194304,"blocks":["c13547d2de69256b523e235e5306146fad99a5034aa982da030d24febb6b364b"]},"offset":"14506664"},"Provider.js":{"size":5078,"integrity":{"algorithm":"SHA256","hash":"6f65a7ed0ab584c9393dfb148f6048394d77128de953e5204b738acf5acf4596","blockSize":4194304,"blocks":["6f65a7ed0ab584c9393dfb148f6048394d77128de953e5204b738acf5acf4596"]},"offset":"14510857"}}},"differentialDownloader":{"files":{"DataSplitter.js":{"size":7975,"integrity":{"algorithm":"SHA256","hash":"1f01f2f61145de1fa80fa8460d52a18988952349fce646b9836690eaa343de5d","blockSize":4194304,"blocks":["1f01f2f61145de1fa80fa8460d52a18988952349fce646b9836690eaa343de5d"]},"offset":"14515935"},"DifferentialDownloader.js":{"size":12136,"integrity":{"algorithm":"SHA256","hash":"f9f4a7cf4eb00f3d4a2bc53c40f6ae61b4af5a69a5d78af41532f399c83aea60","blockSize":4194304,"blocks":["f9f4a7cf4eb00f3d4a2bc53c40f6ae61b4af5a69a5d78af41532f399c83aea60"]},"offset":"14523910"},"FileWithEmbeddedBlockMapDifferentialDownloader.js":{"size":1826,"integrity":{"algorithm":"SHA256","hash":"f27ad5fbe1379d4c33c668cdaccbf80e3693ee52cd55be748d2382ef4864a0c1","blockSize":4194304,"blocks":["f27ad5fbe1379d4c33c668cdaccbf80e3693ee52cd55be748d2382ef4864a0c1"]},"offset":"14536046"},"GenericDifferentialDownloader.js":{"size":524,"integrity":{"algorithm":"SHA256","hash":"62ca9a1d3ca12deca41ad902a24d8fec34ec150cdc194478d5b4fc987a66921b","blockSize":4194304,"blocks":["62ca9a1d3ca12deca41ad902a24d8fec34ec150cdc194478d5b4fc987a66921b"]},"offset":"14537872"},"ProgressDifferentialDownloadCallbackTransform.js":{"size":3824,"integrity":{"algorithm":"SHA256","hash":"d4b62c2f8eec10bb8edcc0227cde609734ef344bd3e727a48cdb806ea3608ef4","blockSize":4194304,"blocks":["d4b62c2f8eec10bb8edcc0227cde609734ef344bd3e727a48cdb806ea3608ef4"]},"offset":"14538396"},"downloadPlanBuilder.js":{"size":5630,"integrity":{"algorithm":"SHA256","hash":"18d0bedba6787f8a9e3158a5997805400312fcbf88c7e79728b9cb6230b38966","blockSize":4194304,"blocks":["18d0bedba6787f8a9e3158a5997805400312fcbf88c7e79728b9cb6230b38966"]},"offset":"14542220"},"multipleRangeDownloader.js":{"size":4942,"integrity":{"algorithm":"SHA256","hash":"6d1829aded9904915f1c33300178372963b8645232ea8d5befe9ede43a56871a","blockSize":4194304,"blocks":["6d1829aded9904915f1c33300178372963b8645232ea8d5befe9ede43a56871a"]},"offset":"14547850"}}}}},"node_modules":{"files":{"argparse":{"files":{"LICENSE":{"size":12775,"integrity":{"algorithm":"SHA256","hash":"de4d1f2d2ad5ad0cfd1657a106476b31cb5db5ef9d1ff842b237c0c81f0c8a23","blockSize":4194304,"blocks":["de4d1f2d2ad5ad0cfd1657a106476b31cb5db5ef9d1ff842b237c0c81f0c8a23"]},"offset":"42001113"},"argparse.js":{"size":129714,"integrity":{"algorithm":"SHA256","hash":"2e73e7a3167ba840dbcf41feeafc3544a3e2b39220b5e997133c519861febf16","blockSize":4194304,"blocks":["2e73e7a3167ba840dbcf41feeafc3544a3e2b39220b5e997133c519861febf16"]},"offset":"42013888"},"package.json":{"size":448,"integrity":{"algorithm":"SHA256","hash":"800e809f5cdb0a7dec1834e1d2c0a165b1b63c2d6d7b2a97034b8c668de24a8f","blockSize":4194304,"blocks":["800e809f5cdb0a7dec1834e1d2c0a165b1b63c2d6d7b2a97034b8c668de24a8f"]},"offset":"42143602"},"lib":{"files":{"sub.js":{"size":2252,"integrity":{"algorithm":"SHA256","hash":"2bc4ef9e87c47f1a4e0cfcb3706d886e0d73edce88149e300d2364066f396ed6","blockSize":4194304,"blocks":["2bc4ef9e87c47f1a4e0cfcb3706d886e0d73edce88149e300d2364066f396ed6"]},"offset":"42144050"},"textwrap.js":{"size":17391,"integrity":{"algorithm":"SHA256","hash":"2550466c9a0425fa583a70e25bb93e190fe09b61f7de4861ea8ec54b7b899db0","blockSize":4194304,"blocks":["2550466c9a0425fa583a70e25bb93e190fe09b61f7de4861ea8ec54b7b899db0"]},"offset":"42146302"}}}}},"js-yaml":{"files":{"LICENSE":{"size":1084,"integrity":{"algorithm":"SHA256","hash":"a07bc24468b9654ce76a547d47a2db282d07733b715db4c73a98bd63961f9550","blockSize":4194304,"blocks":["a07bc24468b9654ce76a547d47a2db282d07733b715db4c73a98bd63961f9550"]},"offset":"42163693"},"index.js":{"size":1793,"integrity":{"algorithm":"SHA256","hash":"7d1ebc0d9929b9124997b439d1a1fd9aff8feb6bb0a1b59e977ea638944f34ba","blockSize":4194304,"blocks":["7d1ebc0d9929b9124997b439d1a1fd9aff8feb6bb0a1b59e977ea638944f34ba"]},"offset":"42164777"},"package.json":{"size":1075,"integrity":{"algorithm":"SHA256","hash":"85aba0e672f9202b2fc0571326c721c67bc22d1cadcb358d9ab103d29e836242","blockSize":4194304,"blocks":["85aba0e672f9202b2fc0571326c721c67bc22d1cadcb358d9ab103d29e836242"]},"offset":"42166570"},"lib":{"files":{"common.js":{"size":1177,"integrity":{"algorithm":"SHA256","hash":"9211491f8e0058a419a4664e36bb4ec6509655aabe6bd537eddf941fdf34e734","blockSize":4194304,"blocks":["9211491f8e0058a419a4664e36bb4ec6509655aabe6bd537eddf941fdf34e734"]},"offset":"42167645"},"dumper.js":{"size":31893,"integrity":{"algorithm":"SHA256","hash":"1a0c7fc01df0e950caf526c2a96b1e9fbac1dbc5dc125e83657f7b723a505ca3","blockSize":4194304,"blocks":["1a0c7fc01df0e950caf526c2a96b1e9fbac1dbc5dc125e83657f7b723a505ca3"]},"offset":"42168822"},"exception.js":{"size":1299,"integrity":{"algorithm":"SHA256","hash":"3dcd70e20270a93b8769204174a1949a133a41afbc8f1a74a9c6ab73fd60a179","blockSize":4194304,"blocks":["3dcd70e20270a93b8769204174a1949a133a41afbc8f1a74a9c6ab73fd60a179"]},"offset":"42200715"},"loader.js":{"size":47142,"integrity":{"algorithm":"SHA256","hash":"dd1053d4a607cc29dd2020ac77afa283002c8fd1d9b0d7042a7fc763c883f794","blockSize":4194304,"blocks":["dd1053d4a607cc29dd2020ac77afa283002c8fd1d9b0d7042a7fc763c883f794"]},"offset":"42202014"},"schema.js":{"size":3384,"integrity":{"algorithm":"SHA256","hash":"be14297ea2917dcb9ee11a7deb5b3a871f57ad978e5368c62407c83cd4dd18bf","blockSize":4194304,"blocks":["be14297ea2917dcb9ee11a7deb5b3a871f57ad978e5368c62407c83cd4dd18bf"]},"offset":"42249156"},"snippet.js":{"size":3088,"integrity":{"algorithm":"SHA256","hash":"1658b8ec688ebdd2e2dffc93fffc9cba0e9a93ad2a9a1d39b08ed5a1df5afade","blockSize":4194304,"blocks":["1658b8ec688ebdd2e2dffc93fffc9cba0e9a93ad2a9a1d39b08ed5a1df5afade"]},"offset":"42252540"},"type.js":{"size":1849,"integrity":{"algorithm":"SHA256","hash":"11d7ff8e46ecc9ef8b5334aa491973ee95a5f43841afa27e14a0594cca464170","blockSize":4194304,"blocks":["11d7ff8e46ecc9ef8b5334aa491973ee95a5f43841afa27e14a0594cca464170"]},"offset":"42255628"},"type":{"files":{"binary.js":{"size":2912,"integrity":{"algorithm":"SHA256","hash":"245745c866e306704407d6738e1a77776ce41e79e4cc3b2f418ae475bd00c3c9","blockSize":4194304,"blocks":["245745c866e306704407d6738e1a77776ce41e79e4cc3b2f418ae475bd00c3c9"]},"offset":"42257477"},"bool.js":{"size":971,"integrity":{"algorithm":"SHA256","hash":"634b7821ceb0877b5320a17b3b0fc3fb60ac3092b86c9d069722f18e2421c1db","blockSize":4194304,"blocks":["634b7821ceb0877b5320a17b3b0fc3fb60ac3092b86c9d069722f18e2421c1db"]},"offset":"42260389"},"float.js":{"size":2467,"integrity":{"algorithm":"SHA256","hash":"2d762d35ad3e06d96f512fb5ece8f7172e2543bb19c551f64c5e4005a66bbca2","blockSize":4194304,"blocks":["2d762d35ad3e06d96f512fb5ece8f7172e2543bb19c551f64c5e4005a66bbca2"]},"offset":"42261360"},"int.js":{"size":3691,"integrity":{"algorithm":"SHA256","hash":"0dac842d32923113f2a6a153a280f6120f6ccc2da9024ba01fd4d99065d29fcf","blockSize":4194304,"blocks":["0dac842d32923113f2a6a153a280f6120f6ccc2da9024ba01fd4d99065d29fcf"]},"offset":"42263827"},"map.js":{"size":190,"integrity":{"algorithm":"SHA256","hash":"b9bf146012164a0a59ea8c5f6576052706d330a1e41ab8092e11a67d6b9ccf2c","blockSize":4194304,"blocks":["b9bf146012164a0a59ea8c5f6576052706d330a1e41ab8092e11a67d6b9ccf2c"]},"offset":"42267518"},"merge.js":{"size":230,"integrity":{"algorithm":"SHA256","hash":"bf34d9da7bb1158c5bdd8ae4474d11645c824440f68de79813c384cd77c4791b","blockSize":4194304,"blocks":["bf34d9da7bb1158c5bdd8ae4474d11645c824440f68de79813c384cd77c4791b"]},"offset":"42267708"},"null.js":{"size":808,"integrity":{"algorithm":"SHA256","hash":"8f3abf27966dfc51e80ea72b363ca74b6d3bca0b15695f61e93bfee2858531f1","blockSize":4194304,"blocks":["8f3abf27966dfc51e80ea72b363ca74b6d3bca0b15695f61e93bfee2858531f1"]},"offset":"42267938"},"omap.js":{"size":1023,"integrity":{"algorithm":"SHA256","hash":"a4fa54ca0343665eb199503d772a4fe4aab792e4e08bee682e70c0d4a5ada043","blockSize":4194304,"blocks":["a4fa54ca0343665eb199503d772a4fe4aab792e4e08bee682e70c0d4a5ada043"]},"offset":"42268746"},"pairs.js":{"size":1084,"integrity":{"algorithm":"SHA256","hash":"faebb6d8a9d1b0cd755f92113e49464711d87060f17d1e807695924866f89a4a","blockSize":4194304,"blocks":["faebb6d8a9d1b0cd755f92113e49464711d87060f17d1e807695924866f89a4a"]},"offset":"42269769"},"seq.js":{"size":191,"integrity":{"algorithm":"SHA256","hash":"f3d76a1db2a6772a51ac32059dcc18b6666ae9c5a60a649467b5853a2fbaf425","blockSize":4194304,"blocks":["f3d76a1db2a6772a51ac32059dcc18b6666ae9c5a60a649467b5853a2fbaf425"]},"offset":"42270853"},"set.js":{"size":547,"integrity":{"algorithm":"SHA256","hash":"60d13edc50b58b037a6ef561d2f751c601826e455c011acf48c830baa1412107","blockSize":4194304,"blocks":["60d13edc50b58b037a6ef561d2f751c601826e455c011acf48c830baa1412107"]},"offset":"42271044"},"str.js":{"size":189,"integrity":{"algorithm":"SHA256","hash":"41e56af5fad426839bfe41c9a3f489de6efec71447490124a69f8f4785c46ab9","blockSize":4194304,"blocks":["41e56af5fad426839bfe41c9a3f489de6efec71447490124a69f8f4785c46ab9"]},"offset":"42271591"},"timestamp.js":{"size":2571,"integrity":{"algorithm":"SHA256","hash":"9e4f77c8d504a3a8319108343d6d6b2b6ed95ba6e96f4fe9b204208d04cfd691","blockSize":4194304,"blocks":["9e4f77c8d504a3a8319108343d6d6b2b6ed95ba6e96f4fe9b204208d04cfd691"]},"offset":"42271780"}}},"schema":{"files":{"core.js":{"size":288,"integrity":{"algorithm":"SHA256","hash":"d736e58b5a947a5b86056bf4b881c8002314b6534ab1a697a67cc47e1b2dc2a0","blockSize":4194304,"blocks":["d736e58b5a947a5b86056bf4b881c8002314b6534ab1a697a67cc47e1b2dc2a0"]},"offset":"42274351"},"default.js":{"size":538,"integrity":{"algorithm":"SHA256","hash":"aa09d88b4be7c51d8b6cb0b533c51ae17f534deed476c576b8d4cd3ce1bf165a","blockSize":4194304,"blocks":["aa09d88b4be7c51d8b6cb0b533c51ae17f534deed476c576b8d4cd3ce1bf165a"]},"offset":"42274639"},"failsafe.js":{"size":278,"integrity":{"algorithm":"SHA256","hash":"96d4b5b129b966f49d8028fc752a54cb9ca0c80cc4d076240766b946a2b329c5","blockSize":4194304,"blocks":["96d4b5b129b966f49d8028fc752a54cb9ca0c80cc4d076240766b946a2b329c5"]},"offset":"42275177"},"json.js":{"size":523,"integrity":{"algorithm":"SHA256","hash":"aa53e414f077035b4d477d19095ac01e60d9df73af716a188fd2772314041f92","blockSize":4194304,"blocks":["aa53e414f077035b4d477d19095ac01e60d9df73af716a188fd2772314041f92"]},"offset":"42275455"}}}}},"dist":{"files":{"js-yaml.js":{"size":114359,"integrity":{"algorithm":"SHA256","hash":"c738b0020702aa631abd8de23a902a3079d99d3060e44166955cb51f570881c4","blockSize":4194304,"blocks":["c738b0020702aa631abd8de23a902a3079d99d3060e44166955cb51f570881c4"]},"offset":"42275978"},"js-yaml.min.js":{"size":39430,"integrity":{"algorithm":"SHA256","hash":"45dc3dd03dc07a06705a2c2989b8c7f709013f04bd5386e3279d4e447f07ebd7","blockSize":4194304,"blocks":["45dc3dd03dc07a06705a2c2989b8c7f709013f04bd5386e3279d4e447f07ebd7"]},"offset":"42390337"},"js-yaml.mjs":{"size":107533,"integrity":{"algorithm":"SHA256","hash":"16f210b939b359b6ec8dde581eb62c157185711dc7b719b33779c43db5c31a91","blockSize":4194304,"blocks":["16f210b939b359b6ec8dde581eb62c157185711dc7b719b33779c43db5c31a91"]},"offset":"42429767"}}},"bin":{"files":{"js-yaml.js":{"size":2736,"integrity":{"algorithm":"SHA256","hash":"6d7749dfd8019095970f4366cd09ec3abef9deaa3f870709dffecb027e58902d","blockSize":4194304,"blocks":["6d7749dfd8019095970f4366cd09ec3abef9deaa3f870709dffecb027e58902d"]},"offset":"42537300"}}}}}}}}},"encodeurl":{"files":{"HISTORY.md":{"size":238,"integrity":{"algorithm":"SHA256","hash":"862eb81868522938d0c3b042ac31faa983bcb64509ea05504640053e4f70c759","blockSize":4194304,"blocks":["862eb81868522938d0c3b042ac31faa983bcb64509ea05504640053e4f70c759"]},"offset":"14552792"},"LICENSE":{"size":1089,"integrity":{"algorithm":"SHA256","hash":"7585ea7bba616ccbbe43cb54ecb67956688c3c5641bb84f3099a652a73193afe","blockSize":4194304,"blocks":["7585ea7bba616ccbbe43cb54ecb67956688c3c5641bb84f3099a652a73193afe"]},"offset":"14553030"},"index.js":{"size":1586,"integrity":{"algorithm":"SHA256","hash":"1d0a4e941c1504dcd9bc6cfbb77f7b44d93e56a29cba6f2ccebd78d501a51c16","blockSize":4194304,"blocks":["1d0a4e941c1504dcd9bc6cfbb77f7b44d93e56a29cba6f2ccebd78d501a51c16"]},"offset":"14554119"},"package.json":{"size":612,"integrity":{"algorithm":"SHA256","hash":"36c06d587e33c6d3cf2008bd8a3d08d45a7c57323058181e63e99552b3a3e562","blockSize":4194304,"blocks":["36c06d587e33c6d3cf2008bd8a3d08d45a7c57323058181e63e99552b3a3e562"]},"offset":"14555705"}}},"encoding":{"files":{".prettierrc.js":{"size":156,"integrity":{"algorithm":"SHA256","hash":"f5a1a1e54071e6c49804161a86d4315d32eb47cbb155794379abe16aeeb07074","blockSize":4194304,"blocks":["f5a1a1e54071e6c49804161a86d4315d32eb47cbb155794379abe16aeeb07074"]},"offset":"14556317"},"LICENSE":{"size":935,"integrity":{"algorithm":"SHA256","hash":"2453d3b90aa23715eec80b25fcda1bebf71052ad41a6694d58a9aa867d103c81","blockSize":4194304,"blocks":["2453d3b90aa23715eec80b25fcda1bebf71052ad41a6694d58a9aa867d103c81"]},"offset":"14556473"},"package.json":{"size":345,"integrity":{"algorithm":"SHA256","hash":"49f1877c33a5bd996ce34abd9acf2693dd71efaa6bcc8245a64e97bfaaf2616f","blockSize":4194304,"blocks":["49f1877c33a5bd996ce34abd9acf2693dd71efaa6bcc8245a64e97bfaaf2616f"]},"offset":"14557408"},"lib":{"files":{"encoding.js":{"size":2116,"integrity":{"algorithm":"SHA256","hash":"9d4bb3d5942dd1c97da48470dbc3775fad31387e8aea997f20b07cb16ec1439d","blockSize":4194304,"blocks":["9d4bb3d5942dd1c97da48470dbc3775fad31387e8aea997f20b07cb16ec1439d"]},"offset":"14557753"}}}}},"end-of-stream":{"files":{"LICENSE":{"size":1078,"integrity":{"algorithm":"SHA256","hash":"3fe8d55a98dbf260eace67c00cf9bc53edb46234e840098a0b93df3096b97fb6","blockSize":4194304,"blocks":["3fe8d55a98dbf260eace67c00cf9bc53edb46234e840098a0b93df3096b97fb6"]},"offset":"14559869"},"index.js":{"size":2678,"integrity":{"algorithm":"SHA256","hash":"3e912df226ee90ee3edc5ff69cd3e8313fa1da13795e10fb0b0f05727bdabb58","blockSize":4194304,"blocks":["3e912df226ee90ee3edc5ff69cd3e8313fa1da13795e10fb0b0f05727bdabb58"]},"offset":"14560947"},"package.json":{"size":534,"integrity":{"algorithm":"SHA256","hash":"83eb327749859615cd6bb5d16f07ff5f93e0ac16e03d2ea1122a97b1ff5fa2f2","blockSize":4194304,"blocks":["83eb327749859615cd6bb5d16f07ff5f93e0ac16e03d2ea1122a97b1ff5fa2f2"]},"offset":"14563625"}}},"env-paths":{"files":{"index.js":{"size":2155,"integrity":{"algorithm":"SHA256","hash":"84351667051b005f9856319267407b06affad12888355462c7c8740f22ca3999","blockSize":4194304,"blocks":["84351667051b005f9856319267407b06affad12888355462c7c8740f22ca3999"]},"offset":"14564159"},"license":{"size":1109,"integrity":{"algorithm":"SHA256","hash":"48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0","blockSize":4194304,"blocks":["48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0"]},"offset":"14566314"},"package.json":{"size":484,"integrity":{"algorithm":"SHA256","hash":"de9602e1b482b8748b5550711f10f24fcc73d916806e1db497876fb2842ae6ba","blockSize":4194304,"blocks":["de9602e1b482b8748b5550711f10f24fcc73d916806e1db497876fb2842ae6ba"]},"offset":"14567423"}}},"err-code":{"files":{".editorconfig":{"size":179,"integrity":{"algorithm":"SHA256","hash":"11d51d79c3c77de54d65b5d8bb3aef11dcc44ba7346379bf4d6e2b1dea7512cf","blockSize":4194304,"blocks":["11d51d79c3c77de54d65b5d8bb3aef11dcc44ba7346379bf4d6e2b1dea7512cf"]},"offset":"14567907"},".eslintrc.json":{"size":127,"integrity":{"algorithm":"SHA256","hash":"40a49a05cd0651e460fbad5728dcc2268ec93add68266efc045d1df5f18eead1","blockSize":4194304,"blocks":["40a49a05cd0651e460fbad5728dcc2268ec93add68266efc045d1df5f18eead1"]},"offset":"14568086"},"bower.json":{"size":589,"integrity":{"algorithm":"SHA256","hash":"df976fe4bf93ac8ff560126417996ebb67c60fb31e1b1ce38ed83ede7b859978","blockSize":4194304,"blocks":["df976fe4bf93ac8ff560126417996ebb67c60fb31e1b1ce38ed83ede7b859978"]},"offset":"14568213"},"index.js":{"size":933,"integrity":{"algorithm":"SHA256","hash":"d523ab544dd4e8d0b4b48e7d47c37addd2d53d28a98fe799ed63862ae1efb6db","blockSize":4194304,"blocks":["d523ab544dd4e8d0b4b48e7d47c37addd2d53d28a98fe799ed63862ae1efb6db"]},"offset":"14568802"},"index.umd.js":{"size":1821,"integrity":{"algorithm":"SHA256","hash":"b21b9af33fceb86a5a2bbcccb9f97a0c6319448f74acf4a3993804ea56097980","blockSize":4194304,"blocks":["b21b9af33fceb86a5a2bbcccb9f97a0c6319448f74acf4a3993804ea56097980"]},"offset":"14569735"},"package.json":{"size":486,"integrity":{"algorithm":"SHA256","hash":"efee77bccfa2e8fe023289c00873c92471401d876fd8ddf09faafda3ccf18464","blockSize":4194304,"blocks":["efee77bccfa2e8fe023289c00873c92471401d876fd8ddf09faafda3ccf18464"]},"offset":"14571556"}}},"es-abstract":{"files":{"5":{"files":{"AbstractEqualityComparison.js":{"size":1083,"integrity":{"algorithm":"SHA256","hash":"3b2112b9796c5fa6b6587557adc8eb7e149919d25a516d33f0d2d0242be3e4f9","blockSize":4194304,"blocks":["3b2112b9796c5fa6b6587557adc8eb7e149919d25a516d33f0d2d0242be3e4f9"]},"offset":"14936286"},"AbstractRelationalComparison.js":{"size":1590,"integrity":{"algorithm":"SHA256","hash":"0246b938fe11124d2c1f58f39636646b85f5415edf3f25aaf24e1b35abbd6ef5","blockSize":4194304,"blocks":["0246b938fe11124d2c1f58f39636646b85f5415edf3f25aaf24e1b35abbd6ef5"]},"offset":"14937369"},"CheckObjectCoercible.js":{"size":345,"integrity":{"algorithm":"SHA256","hash":"822d27275048ec50b679bd8b51facb0d5ed2b1027bbb7c3de4d9e9d50961acf9","blockSize":4194304,"blocks":["822d27275048ec50b679bd8b51facb0d5ed2b1027bbb7c3de4d9e9d50961acf9"]},"offset":"14938959"},"DateFromTime.js":{"size":1036,"integrity":{"algorithm":"SHA256","hash":"ae437cb5ee92b162e18b6f47b9dd66b66f627547e098a0670d60c2572f04b1ed","blockSize":4194304,"blocks":["ae437cb5ee92b162e18b6f47b9dd66b66f627547e098a0670d60c2572f04b1ed"]},"offset":"14939304"},"Day.js":{"size":234,"integrity":{"algorithm":"SHA256","hash":"ff3875a46c34886cff3808ab1c4de6d3b45a61e9638b32edd22f41277c153ea5","blockSize":4194304,"blocks":["ff3875a46c34886cff3808ab1c4de6d3b45a61e9638b32edd22f41277c153ea5"]},"offset":"14940340"},"DayFromYear.js":{"size":256,"integrity":{"algorithm":"SHA256","hash":"378eb638143e86cfa3061177986dcfdb6bdec76e8b799b95cf3b9cafc5e9af68","blockSize":4194304,"blocks":["378eb638143e86cfa3061177986dcfdb6bdec76e8b799b95cf3b9cafc5e9af68"]},"offset":"14940574"},"DayWithinYear.js":{"size":286,"integrity":{"algorithm":"SHA256","hash":"b1ac5824fb1ced3e9d2dae99db5bd3890b4ef25dc45e50a4f927384bb5be618e","blockSize":4194304,"blocks":["b1ac5824fb1ced3e9d2dae99db5bd3890b4ef25dc45e50a4f927384bb5be618e"]},"offset":"14940830"},"DaysInYear.js":{"size":301,"integrity":{"algorithm":"SHA256","hash":"3f5955b3d1831ed2d008ae052a802b12c22bf1ba6d8fd286e0cb7a6a77144aec","blockSize":4194304,"blocks":["3f5955b3d1831ed2d008ae052a802b12c22bf1ba6d8fd286e0cb7a6a77144aec"]},"offset":"14941116"},"FromPropertyDescriptor.js":{"size":1042,"integrity":{"algorithm":"SHA256","hash":"cfe423199fb627d9cb7f68dc2ab70fccb358abb41bc342b457e6eef92552752e","blockSize":4194304,"blocks":["cfe423199fb627d9cb7f68dc2ab70fccb358abb41bc342b457e6eef92552752e"]},"offset":"14941417"},"HourFromTime.js":{"size":382,"integrity":{"algorithm":"SHA256","hash":"338503d8b54967fb22e0659243cab7fc283f023561a8a3316df8b4de588bddf9","blockSize":4194304,"blocks":["338503d8b54967fb22e0659243cab7fc283f023561a8a3316df8b4de588bddf9"]},"offset":"14942459"},"InLeapYear.js":{"size":510,"integrity":{"algorithm":"SHA256","hash":"d9abbf0c4b80df1fd7cb31830f222eb4b6bbe638dcfa3461809905158f2ce0a6","blockSize":4194304,"blocks":["d9abbf0c4b80df1fd7cb31830f222eb4b6bbe638dcfa3461809905158f2ce0a6"]},"offset":"14942841"},"IsAccessorDescriptor.js":{"size":446,"integrity":{"algorithm":"SHA256","hash":"e44b935f83a0e9d562e9d7ad82cfa4e7da334b34642aaae2aa0b130cdafccacf","blockSize":4194304,"blocks":["e44b935f83a0e9d562e9d7ad82cfa4e7da334b34642aaae2aa0b130cdafccacf"]},"offset":"14943351"},"IsCallable.js":{"size":108,"integrity":{"algorithm":"SHA256","hash":"789ba0a1f176c56862f16b2ff7bc3eeaaa02676f75be073a46c92c5e8af21170","blockSize":4194304,"blocks":["789ba0a1f176c56862f16b2ff7bc3eeaaa02676f75be073a46c92c5e8af21170"]},"offset":"14943797"},"IsDataDescriptor.js":{"size":449,"integrity":{"algorithm":"SHA256","hash":"7d6a11e523564386a80ed687568a7ea72411d8e26a372161152a643c8f9f81b5","blockSize":4194304,"blocks":["7d6a11e523564386a80ed687568a7ea72411d8e26a372161152a643c8f9f81b5"]},"offset":"14943905"},"IsGenericDescriptor.js":{"size":542,"integrity":{"algorithm":"SHA256","hash":"e1542bbe56fc8d471557ce8b108dcf85ed8fceca8308bef5322a6d41dfe90f37","blockSize":4194304,"blocks":["e1542bbe56fc8d471557ce8b108dcf85ed8fceca8308bef5322a6d41dfe90f37"]},"offset":"14944354"},"IsPropertyDescriptor.js":{"size":554,"integrity":{"algorithm":"SHA256","hash":"3caa7b0fa1648606559ae342c40c084209c34d7bc43416cc58256689f3ddcc55","blockSize":4194304,"blocks":["3caa7b0fa1648606559ae342c40c084209c34d7bc43416cc58256689f3ddcc55"]},"offset":"14944896"},"MakeDate.js":{"size":328,"integrity":{"algorithm":"SHA256","hash":"41a9b9da3ede4effd12c43e1c25851b5005623f5eb6dee707252cbe373b32ef0","blockSize":4194304,"blocks":["41a9b9da3ede4effd12c43e1c25851b5005623f5eb6dee707252cbe373b32ef0"]},"offset":"14945450"},"MakeDay.js":{"size":917,"integrity":{"algorithm":"SHA256","hash":"83e8e606e0e1ed2ad5b864a20459f8ce10aac6a653af26c12cd6cbc087da53e9","blockSize":4194304,"blocks":["83e8e606e0e1ed2ad5b864a20459f8ce10aac6a653af26c12cd6cbc087da53e9"]},"offset":"14945778"},"MakeTime.js":{"size":698,"integrity":{"algorithm":"SHA256","hash":"f91ad37ec6587e1debbe2be4f1bb86f4936df8e4649af2e33fe14023ed9f6da7","blockSize":4194304,"blocks":["f91ad37ec6587e1debbe2be4f1bb86f4936df8e4649af2e33fe14023ed9f6da7"]},"offset":"14946695"},"MinFromTime.js":{"size":396,"integrity":{"algorithm":"SHA256","hash":"88e77ac8a1b1aae30fe064057ed6699c3c3b176ec1ab0533893be6d1c7ba856a","blockSize":4194304,"blocks":["88e77ac8a1b1aae30fe064057ed6699c3c3b176ec1ab0533893be6d1c7ba856a"]},"offset":"14947393"},"MonthFromTime.js":{"size":1014,"integrity":{"algorithm":"SHA256","hash":"f7acafe967a838eb85739ec2afa8dcdc9e5c0734219559259338761a09131909","blockSize":4194304,"blocks":["f7acafe967a838eb85739ec2afa8dcdc9e5c0734219559259338761a09131909"]},"offset":"14947789"},"SameValue.js":{"size":307,"integrity":{"algorithm":"SHA256","hash":"e6d99ed6b4a479bed51f697cbc4693a2ff8da0d1e07b5ebf11e74b5404af2ab1","blockSize":4194304,"blocks":["e6d99ed6b4a479bed51f697cbc4693a2ff8da0d1e07b5ebf11e74b5404af2ab1"]},"offset":"14948803"},"SecFromTime.js":{"size":402,"integrity":{"algorithm":"SHA256","hash":"6263c6176eafa22eadeb7bc054169fd764a3e3aab0cf637110d86110367c8a36","blockSize":4194304,"blocks":["6263c6176eafa22eadeb7bc054169fd764a3e3aab0cf637110d86110367c8a36"]},"offset":"14949110"},"StrictEqualityComparison.js":{"size":361,"integrity":{"algorithm":"SHA256","hash":"33928172f049f2f5fd7559470bb12647b7c6012b1da230e5a7e5fd8ffc1dd30e","blockSize":4194304,"blocks":["33928172f049f2f5fd7559470bb12647b7c6012b1da230e5a7e5fd8ffc1dd30e"]},"offset":"14949512"},"TimeClip.js":{"size":468,"integrity":{"algorithm":"SHA256","hash":"bf1f153b35126ac0ebd122717e6349c97e932e3665ff1947f5f4a7da4895cb48","blockSize":4194304,"blocks":["bf1f153b35126ac0ebd122717e6349c97e932e3665ff1947f5f4a7da4895cb48"]},"offset":"14949873"},"TimeFromYear.js":{"size":261,"integrity":{"algorithm":"SHA256","hash":"07bd801ef44bcc4c5458937d6b3c09b1ba6f30d24fbb06ca9b4818c0699c330b","blockSize":4194304,"blocks":["07bd801ef44bcc4c5458937d6b3c09b1ba6f30d24fbb06ca9b4818c0699c330b"]},"offset":"14950341"},"TimeWithinDay.js":{"size":247,"integrity":{"algorithm":"SHA256","hash":"c83b563c9849ca65fb1ed7235f72f42a019fde9e67aad81d1bd0699ed28f43f8","blockSize":4194304,"blocks":["c83b563c9849ca65fb1ed7235f72f42a019fde9e67aad81d1bd0699ed28f43f8"]},"offset":"14950602"},"ToBoolean.js":{"size":130,"integrity":{"algorithm":"SHA256","hash":"36a4823341bd4ec68dd6f4b32afbbc939330a48bf7042108c9be89eaaab5bbc6","blockSize":4194304,"blocks":["36a4823341bd4ec68dd6f4b32afbbc939330a48bf7042108c9be89eaaab5bbc6"]},"offset":"14950849"},"ToInt32.js":{"size":173,"integrity":{"algorithm":"SHA256","hash":"e0c77696079335a016ce39e9992f11939ad25c1b322d119eedbec24a989a50a6","blockSize":4194304,"blocks":["e0c77696079335a016ce39e9992f11939ad25c1b322d119eedbec24a989a50a6"]},"offset":"14950979"},"ToInteger.js":{"size":514,"integrity":{"algorithm":"SHA256","hash":"481fdda2f00b4dd70f05c31fcda883fd4bc1a650f109c1eee47dee179aae9c21","blockSize":4194304,"blocks":["481fdda2f00b4dd70f05c31fcda883fd4bc1a650f109c1eee47dee179aae9c21"]},"offset":"14951152"},"ToNumber.js":{"size":783,"integrity":{"algorithm":"SHA256","hash":"def7282b0b6df4d58294393cb50d8782b647f7d487a12b4d988d4b12874ff05b","blockSize":4194304,"blocks":["def7282b0b6df4d58294393cb50d8782b647f7d487a12b4d988d4b12874ff05b"]},"offset":"14951666"},"ToObject.js":{"size":317,"integrity":{"algorithm":"SHA256","hash":"2c2d7fe8105aeeb9ac2dc03a0f62efb697814f4d1f748e3a5bd67578f99c18d2","blockSize":4194304,"blocks":["2c2d7fe8105aeeb9ac2dc03a0f62efb697814f4d1f748e3a5bd67578f99c18d2"]},"offset":"14952449"},"ToPrimitive.js":{"size":115,"integrity":{"algorithm":"SHA256","hash":"ef06aa5d35bf80c0271ecac0a5ed16b7dfeb66ae3c8f20f7ab3e6f6122b33a07","blockSize":4194304,"blocks":["ef06aa5d35bf80c0271ecac0a5ed16b7dfeb66ae3c8f20f7ab3e6f6122b33a07"]},"offset":"14952766"},"ToPropertyDescriptor.js":{"size":1452,"integrity":{"algorithm":"SHA256","hash":"78b5dfba0830bc47aa55c1b33f2be8fd973ff5ccc87a599abadda676d3596c49","blockSize":4194304,"blocks":["78b5dfba0830bc47aa55c1b33f2be8fd973ff5ccc87a599abadda676d3596c49"]},"offset":"14952881"},"ToString.js":{"size":225,"integrity":{"algorithm":"SHA256","hash":"beab2c4fad315e9c4f70813614487f8e8a97b97154a39f4fc3af13703bf232bc","blockSize":4194304,"blocks":["beab2c4fad315e9c4f70813614487f8e8a97b97154a39f4fc3af13703bf232bc"]},"offset":"14954333"},"ToUint16.js":{"size":564,"integrity":{"algorithm":"SHA256","hash":"5775f0384586a383c5dd6c359e37d4b218c8ddf069d7a2906f7e4752ab66a20d","blockSize":4194304,"blocks":["5775f0384586a383c5dd6c359e37d4b218c8ddf069d7a2906f7e4752ab66a20d"]},"offset":"14954558"},"ToUint32.js":{"size":175,"integrity":{"algorithm":"SHA256","hash":"b68209f8fb9d1e978fe3d162251bba47f056c43ec7028cbd99b485800bd62315","blockSize":4194304,"blocks":["b68209f8fb9d1e978fe3d162251bba47f056c43ec7028cbd99b485800bd62315"]},"offset":"14955122"},"Type.js":{"size":438,"integrity":{"algorithm":"SHA256","hash":"d238e26ef38018635faa649db9a83c346c004e26779e04545d07562e326147c3","blockSize":4194304,"blocks":["d238e26ef38018635faa649db9a83c346c004e26779e04545d07562e326147c3"]},"offset":"14955297"},"WeekDay.js":{"size":208,"integrity":{"algorithm":"SHA256","hash":"f7cc798c72dcc484295681d29d535e64215a9ec303f4f6e6456ea63e83ce0246","blockSize":4194304,"blocks":["f7cc798c72dcc484295681d29d535e64215a9ec303f4f6e6456ea63e83ce0246"]},"offset":"14955735"},"YearFromTime.js":{"size":407,"integrity":{"algorithm":"SHA256","hash":"5562b7fd6be438187a1187a331f0d310e631e9747df14521accc7a797e2a2aa7","blockSize":4194304,"blocks":["5562b7fd6be438187a1187a331f0d310e631e9747df14521accc7a797e2a2aa7"]},"offset":"14955943"},"abs.js":{"size":207,"integrity":{"algorithm":"SHA256","hash":"a50e248c29238747c3c278a4edf2c0643f1295d1c065d9dff8524def17f0427f","blockSize":4194304,"blocks":["a50e248c29238747c3c278a4edf2c0643f1295d1c065d9dff8524def17f0427f"]},"offset":"14956350"},"floor.js":{"size":217,"integrity":{"algorithm":"SHA256","hash":"90c20830ae8762224c83fb0ed36a288a7d567f57d3b5acb469590cc2d5e13f55","blockSize":4194304,"blocks":["90c20830ae8762224c83fb0ed36a288a7d567f57d3b5acb469590cc2d5e13f55"]},"offset":"14956557"},"modulo.js":{"size":168,"integrity":{"algorithm":"SHA256","hash":"84923b64427edcc840ee9a305dca213f4bf1e04ed8f88f6bfd7bfa9e655d7c98","blockSize":4194304,"blocks":["84923b64427edcc840ee9a305dca213f4bf1e04ed8f88f6bfd7bfa9e655d7c98"]},"offset":"14956774"},"msFromTime.js":{"size":253,"integrity":{"algorithm":"SHA256","hash":"ef13a7e7721d695f125a7e772f8037ed34aa3c97aaa3692da900c6796cd270da","blockSize":4194304,"blocks":["ef13a7e7721d695f125a7e772f8037ed34aa3c97aaa3692da900c6796cd270da"]},"offset":"14956942"}}},"2015":{"files":{"AbstractEqualityComparison.js":{"size":1154,"integrity":{"algorithm":"SHA256","hash":"b95b9c6c6a99532fe37e1d0fa948bbe700ecc013b045034afb1a5db6a39026db","blockSize":4194304,"blocks":["b95b9c6c6a99532fe37e1d0fa948bbe700ecc013b045034afb1a5db6a39026db"]},"offset":"15855012"},"AbstractRelationalComparison.js":{"size":1590,"integrity":{"algorithm":"SHA256","hash":"0246b938fe11124d2c1f58f39636646b85f5415edf3f25aaf24e1b35abbd6ef5","blockSize":4194304,"blocks":["0246b938fe11124d2c1f58f39636646b85f5415edf3f25aaf24e1b35abbd6ef5"]},"offset":"15856166"},"AdvanceStringIndex.js":{"size":1305,"integrity":{"algorithm":"SHA256","hash":"021f64d34615e95873eab825aa0353ee281db9bb6d1d7436fb77a45f9cd9a296","blockSize":4194304,"blocks":["021f64d34615e95873eab825aa0353ee281db9bb6d1d7436fb77a45f9cd9a296"]},"offset":"15857756"},"ArrayCreate.js":{"size":1650,"integrity":{"algorithm":"SHA256","hash":"6cde465e8db30b2ba485412ac2912f04a6212b3effdd37d0f3a9894af999ba9b","blockSize":4194304,"blocks":["6cde465e8db30b2ba485412ac2912f04a6212b3effdd37d0f3a9894af999ba9b"]},"offset":"15859061"},"ArraySetLength.js":{"size":2665,"integrity":{"algorithm":"SHA256","hash":"4b07de7693377557e2f05bf21ea871ff235ce1121e0e95846f5639fa5cc3ebb1","blockSize":4194304,"blocks":["4b07de7693377557e2f05bf21ea871ff235ce1121e0e95846f5639fa5cc3ebb1"]},"offset":"15860711"},"ArraySpeciesCreate.js":{"size":1348,"integrity":{"algorithm":"SHA256","hash":"246aed3dfe50be7dcbd5b25934dd6c74bff25b66de39dcc70335e6d668cc480b","blockSize":4194304,"blocks":["246aed3dfe50be7dcbd5b25934dd6c74bff25b66de39dcc70335e6d668cc480b"]},"offset":"15863376"},"Call.js":{"size":623,"integrity":{"algorithm":"SHA256","hash":"b092006d05bceeccee48bdf3fde9d83ee54a156eb2841bf5cacdca9f157b4571","blockSize":4194304,"blocks":["b092006d05bceeccee48bdf3fde9d83ee54a156eb2841bf5cacdca9f157b4571"]},"offset":"15864724"},"CanonicalNumericIndexString.js":{"size":654,"integrity":{"algorithm":"SHA256","hash":"c850cc1637b82f4fc238d2ae1a45229e8d44bc5c9b85205c0f27a1e0e9bb9d2b","blockSize":4194304,"blocks":["c850cc1637b82f4fc238d2ae1a45229e8d44bc5c9b85205c0f27a1e0e9bb9d2b"]},"offset":"15865347"},"CharacterRange.js":{"size":782,"integrity":{"algorithm":"SHA256","hash":"49612101e544a9b707f116ac8fe2be0d2c559c1d3b4f94ba47f36832913ea11f","blockSize":4194304,"blocks":["49612101e544a9b707f116ac8fe2be0d2c559c1d3b4f94ba47f36832913ea11f"]},"offset":"15866001"},"CompletePropertyDescriptor.js":{"size":989,"integrity":{"algorithm":"SHA256","hash":"17825d14da6797c52aa699d7b089bc2370d5a899cb7af7e3485f948fde50fca2","blockSize":4194304,"blocks":["17825d14da6797c52aa699d7b089bc2370d5a899cb7af7e3485f948fde50fca2"]},"offset":"15866783"},"CreateDataProperty.js":{"size":1279,"integrity":{"algorithm":"SHA256","hash":"5006509a3f5567f81cb7f730448a0a492c64c7f06406627c58d0334dde5e44f9","blockSize":4194304,"blocks":["5006509a3f5567f81cb7f730448a0a492c64c7f06406627c58d0334dde5e44f9"]},"offset":"15867772"},"CreateDataPropertyOrThrow.js":{"size":734,"integrity":{"algorithm":"SHA256","hash":"50c61c792c27d661346cfb29fe5b7603a2713d7acb1dc5b3b35fe71ece8fd18e","blockSize":4194304,"blocks":["50c61c792c27d661346cfb29fe5b7603a2713d7acb1dc5b3b35fe71ece8fd18e"]},"offset":"15869051"},"CreateHTML.js":{"size":927,"integrity":{"algorithm":"SHA256","hash":"5b9cf63f6b4bc50077e333c2b310cbd4c85a97891b2e1d28a93aeeb4370c2930","blockSize":4194304,"blocks":["5b9cf63f6b4bc50077e333c2b310cbd4c85a97891b2e1d28a93aeeb4370c2930"]},"offset":"15869785"},"CreateIterResultObject.js":{"size":432,"integrity":{"algorithm":"SHA256","hash":"289a26996866dba6f6292ba0931e643c7a5851f21003d41e5a004862a03a2035","blockSize":4194304,"blocks":["289a26996866dba6f6292ba0931e643c7a5851f21003d41e5a004862a03a2035"]},"offset":"15870712"},"CreateListFromArrayLike.js":{"size":1354,"integrity":{"algorithm":"SHA256","hash":"59bff81b54528dca9de105511851d1af4ee78c476453991e93ddde3b29e0a0ff","blockSize":4194304,"blocks":["59bff81b54528dca9de105511851d1af4ee78c476453991e93ddde3b29e0a0ff"]},"offset":"15871144"},"CreateMethodProperty.js":{"size":979,"integrity":{"algorithm":"SHA256","hash":"117c68b2fa6825c31e8d6f4970973fddf09fd74506447ca22ed3cfc2ed8b04e8","blockSize":4194304,"blocks":["117c68b2fa6825c31e8d6f4970973fddf09fd74506447ca22ed3cfc2ed8b04e8"]},"offset":"15872498"},"DateFromTime.js":{"size":1036,"integrity":{"algorithm":"SHA256","hash":"ae437cb5ee92b162e18b6f47b9dd66b66f627547e098a0670d60c2572f04b1ed","blockSize":4194304,"blocks":["ae437cb5ee92b162e18b6f47b9dd66b66f627547e098a0670d60c2572f04b1ed"]},"offset":"15873477"},"Day.js":{"size":234,"integrity":{"algorithm":"SHA256","hash":"ff3875a46c34886cff3808ab1c4de6d3b45a61e9638b32edd22f41277c153ea5","blockSize":4194304,"blocks":["ff3875a46c34886cff3808ab1c4de6d3b45a61e9638b32edd22f41277c153ea5"]},"offset":"15874513"},"DayFromYear.js":{"size":256,"integrity":{"algorithm":"SHA256","hash":"378eb638143e86cfa3061177986dcfdb6bdec76e8b799b95cf3b9cafc5e9af68","blockSize":4194304,"blocks":["378eb638143e86cfa3061177986dcfdb6bdec76e8b799b95cf3b9cafc5e9af68"]},"offset":"15874747"},"DayWithinYear.js":{"size":286,"integrity":{"algorithm":"SHA256","hash":"b1ac5824fb1ced3e9d2dae99db5bd3890b4ef25dc45e50a4f927384bb5be618e","blockSize":4194304,"blocks":["b1ac5824fb1ced3e9d2dae99db5bd3890b4ef25dc45e50a4f927384bb5be618e"]},"offset":"15875003"},"DaysInYear.js":{"size":301,"integrity":{"algorithm":"SHA256","hash":"3f5955b3d1831ed2d008ae052a802b12c22bf1ba6d8fd286e0cb7a6a77144aec","blockSize":4194304,"blocks":["3f5955b3d1831ed2d008ae052a802b12c22bf1ba6d8fd286e0cb7a6a77144aec"]},"offset":"15875289"},"DefinePropertyOrThrow.js":{"size":1466,"integrity":{"algorithm":"SHA256","hash":"1964ecd5b9e64b3ddb203ac7da3410e09a2b1d0ab9b1f06733af8ea15ae954a4","blockSize":4194304,"blocks":["1964ecd5b9e64b3ddb203ac7da3410e09a2b1d0ab9b1f06733af8ea15ae954a4"]},"offset":"15875590"},"DeletePropertyOrThrow.js":{"size":699,"integrity":{"algorithm":"SHA256","hash":"3c1ac659ec4eb7ad97e99c2c3d08c2058624eec2ac0bcca0583660a0fe69f1c5","blockSize":4194304,"blocks":["3c1ac659ec4eb7ad97e99c2c3d08c2058624eec2ac0bcca0583660a0fe69f1c5"]},"offset":"15877056"},"EnumerableOwnNames.js":{"size":417,"integrity":{"algorithm":"SHA256","hash":"0a5f72276f63231cd8aa656b70e6dc6480d2a93a70f3f2a8e6dbd56505814ab1","blockSize":4194304,"blocks":["0a5f72276f63231cd8aa656b70e6dc6480d2a93a70f3f2a8e6dbd56505814ab1"]},"offset":"15877755"},"FromPropertyDescriptor.js":{"size":450,"integrity":{"algorithm":"SHA256","hash":"a16798c55be7b402fc2b27d4d422f322c40639b7403d47cb897b576fcc1ddd49","blockSize":4194304,"blocks":["a16798c55be7b402fc2b27d4d422f322c40639b7403d47cb897b576fcc1ddd49"]},"offset":"15878172"},"Get.js":{"size":602,"integrity":{"algorithm":"SHA256","hash":"ef9a4a39b94f3287d0c9ed27b9a5f1cb71164d2184d6aaf2fc5900fd44016ff9","blockSize":4194304,"blocks":["ef9a4a39b94f3287d0c9ed27b9a5f1cb71164d2184d6aaf2fc5900fd44016ff9"]},"offset":"15878622"},"GetIterator.js":{"size":856,"integrity":{"algorithm":"SHA256","hash":"6fd952f51c6137a0ef8aab1074a42011584da628da9360176b107dcf91979355","blockSize":4194304,"blocks":["6fd952f51c6137a0ef8aab1074a42011584da628da9360176b107dcf91979355"]},"offset":"15879224"},"GetMethod.js":{"size":663,"integrity":{"algorithm":"SHA256","hash":"87f8829531af6b2019ed31d44f2efcf89e8bf345c158ad6bd790f8e14028d325","blockSize":4194304,"blocks":["87f8829531af6b2019ed31d44f2efcf89e8bf345c158ad6bd790f8e14028d325"]},"offset":"15880080"},"GetOwnPropertyKeys.js":{"size":829,"integrity":{"algorithm":"SHA256","hash":"7ad04a3a175ede6b7d15611717a20c2bc6a09bef382f8b4f7d985e5b2e1e7120","blockSize":4194304,"blocks":["7ad04a3a175ede6b7d15611717a20c2bc6a09bef382f8b4f7d985e5b2e1e7120"]},"offset":"15880743"},"GetPrototypeFromConstructor.js":{"size":921,"integrity":{"algorithm":"SHA256","hash":"da1c30c8d5b331e72618af4ccc18b5f3ed89b36e9be117c74a4ee9266141ba56","blockSize":4194304,"blocks":["da1c30c8d5b331e72618af4ccc18b5f3ed89b36e9be117c74a4ee9266141ba56"]},"offset":"15881572"},"GetSubstitution.js":{"size":3523,"integrity":{"algorithm":"SHA256","hash":"550b5f32a640bf6a8e30b3729e21a25c6cbfd62ee4d8d90abf671ad20c7a368a","blockSize":4194304,"blocks":["550b5f32a640bf6a8e30b3729e21a25c6cbfd62ee4d8d90abf671ad20c7a368a"]},"offset":"15882493"},"GetV.js":{"size":474,"integrity":{"algorithm":"SHA256","hash":"66909f7192a6bddc6fb77163f6182164ebef641f0f4c595835485eda6cfd3443","blockSize":4194304,"blocks":["66909f7192a6bddc6fb77163f6182164ebef641f0f4c595835485eda6cfd3443"]},"offset":"15886016"},"HasOwnProperty.js":{"size":553,"integrity":{"algorithm":"SHA256","hash":"b099b2f9829fe64e25740771abc3d3c4e1c801ce0cd2ccecf6041ad08d59364d","blockSize":4194304,"blocks":["b099b2f9829fe64e25740771abc3d3c4e1c801ce0cd2ccecf6041ad08d59364d"]},"offset":"15886490"},"HasProperty.js":{"size":517,"integrity":{"algorithm":"SHA256","hash":"7889a3e2b191509b3d6c0bfcabbad2a915919a2caa275b696a12eab4ebd9cdac","blockSize":4194304,"blocks":["7889a3e2b191509b3d6c0bfcabbad2a915919a2caa275b696a12eab4ebd9cdac"]},"offset":"15887043"},"HourFromTime.js":{"size":382,"integrity":{"algorithm":"SHA256","hash":"338503d8b54967fb22e0659243cab7fc283f023561a8a3316df8b4de588bddf9","blockSize":4194304,"blocks":["338503d8b54967fb22e0659243cab7fc283f023561a8a3316df8b4de588bddf9"]},"offset":"15887560"},"InLeapYear.js":{"size":510,"integrity":{"algorithm":"SHA256","hash":"d9abbf0c4b80df1fd7cb31830f222eb4b6bbe638dcfa3461809905158f2ce0a6","blockSize":4194304,"blocks":["d9abbf0c4b80df1fd7cb31830f222eb4b6bbe638dcfa3461809905158f2ce0a6"]},"offset":"15887942"},"InstanceofOperator.js":{"size":918,"integrity":{"algorithm":"SHA256","hash":"af702715d893f635ff66441f9638a4dc977789c505a50ae17f7e02b05b2549d6","blockSize":4194304,"blocks":["af702715d893f635ff66441f9638a4dc977789c505a50ae17f7e02b05b2549d6"]},"offset":"15888452"},"Invoke.js":{"size":715,"integrity":{"algorithm":"SHA256","hash":"ff016550d8adf9608b2f4ab258017c1582ce717a2e2b3bd2b7a94440f7f19f8f","blockSize":4194304,"blocks":["ff016550d8adf9608b2f4ab258017c1582ce717a2e2b3bd2b7a94440f7f19f8f"]},"offset":"15889370"},"IsAccessorDescriptor.js":{"size":465,"integrity":{"algorithm":"SHA256","hash":"425c74a892b6bb2d1dc6c56e7a6e77e40b9c4d4390480fafe4c804cea53a80ad","blockSize":4194304,"blocks":["425c74a892b6bb2d1dc6c56e7a6e77e40b9c4d4390480fafe4c804cea53a80ad"]},"offset":"15890085"},"IsArray.js":{"size":123,"integrity":{"algorithm":"SHA256","hash":"a8f01a797e05a74501ceb9293408f72bded2a08013c6a075f582737003b443f4","blockSize":4194304,"blocks":["a8f01a797e05a74501ceb9293408f72bded2a08013c6a075f582737003b443f4"]},"offset":"15890550"},"IsCallable.js":{"size":108,"integrity":{"algorithm":"SHA256","hash":"789ba0a1f176c56862f16b2ff7bc3eeaaa02676f75be073a46c92c5e8af21170","blockSize":4194304,"blocks":["789ba0a1f176c56862f16b2ff7bc3eeaaa02676f75be073a46c92c5e8af21170"]},"offset":"15890673"},"IsCompatiblePropertyDescriptor.js":{"size":367,"integrity":{"algorithm":"SHA256","hash":"f9736fde486f1f27112126908c39423b2b3b946a96d5e2a4d762b3139da17543","blockSize":4194304,"blocks":["f9736fde486f1f27112126908c39423b2b3b946a96d5e2a4d762b3139da17543"]},"offset":"15890781"},"IsConcatSpreadable.js":{"size":626,"integrity":{"algorithm":"SHA256","hash":"7a4c3cae4f5de1b8cbc5694ac320cfaaf30f4ecbe2754e2ffb3f72fb42763a8a","blockSize":4194304,"blocks":["7a4c3cae4f5de1b8cbc5694ac320cfaaf30f4ecbe2754e2ffb3f72fb42763a8a"]},"offset":"15891148"},"IsConstructor.js":{"size":1149,"integrity":{"algorithm":"SHA256","hash":"1a58d54e8aec9ecbfaf3e75d9b38ef06c8a3c948e337cca159a17a102ee41929","blockSize":4194304,"blocks":["1a58d54e8aec9ecbfaf3e75d9b38ef06c8a3c948e337cca159a17a102ee41929"]},"offset":"15891774"},"IsDataDescriptor.js":{"size":464,"integrity":{"algorithm":"SHA256","hash":"35a0862d76e9d765d5fa4154250ed5ac440f4238432a773f22c288da3886e1ce","blockSize":4194304,"blocks":["35a0862d76e9d765d5fa4154250ed5ac440f4238432a773f22c288da3886e1ce"]},"offset":"15892923"},"IsExtensible.js":{"size":509,"integrity":{"algorithm":"SHA256","hash":"e28d0530ae66f0dfb8fa90c492fd6242a44ea7eff298d1ed4c10eac9fdfc8efb","blockSize":4194304,"blocks":["e28d0530ae66f0dfb8fa90c492fd6242a44ea7eff298d1ed4c10eac9fdfc8efb"]},"offset":"15893387"},"IsGenericDescriptor.js":{"size":560,"integrity":{"algorithm":"SHA256","hash":"b9d31ec0ad5beaea6a7d9f1180d67ef8f45b164234deeee14c362c8eb2e135cc","blockSize":4194304,"blocks":["b9d31ec0ad5beaea6a7d9f1180d67ef8f45b164234deeee14c362c8eb2e135cc"]},"offset":"15893896"},"IsInteger.js":{"size":450,"integrity":{"algorithm":"SHA256","hash":"84893768eabe51d4073d48aeb5cf43cfdba3a1c6223da13b0a73f802033ff6e2","blockSize":4194304,"blocks":["84893768eabe51d4073d48aeb5cf43cfdba3a1c6223da13b0a73f802033ff6e2"]},"offset":"15894456"},"IsPromise.js":{"size":485,"integrity":{"algorithm":"SHA256","hash":"9f4e5aef10bca5119fab546b4834e48b776d14a775f55524cd3512c4321a1e7c","blockSize":4194304,"blocks":["9f4e5aef10bca5119fab546b4834e48b776d14a775f55524cd3512c4321a1e7c"]},"offset":"15894906"},"IsPropertyDescriptor.js":{"size":554,"integrity":{"algorithm":"SHA256","hash":"3caa7b0fa1648606559ae342c40c084209c34d7bc43416cc58256689f3ddcc55","blockSize":4194304,"blocks":["3caa7b0fa1648606559ae342c40c084209c34d7bc43416cc58256689f3ddcc55"]},"offset":"15895391"},"IsPropertyKey.js":{"size":207,"integrity":{"algorithm":"SHA256","hash":"577d849187a0e8ef526a6368eb6757f6a128db792cf9ade6dfc6c82a75d155c3","blockSize":4194304,"blocks":["577d849187a0e8ef526a6368eb6757f6a128db792cf9ade6dfc6c82a75d155c3"]},"offset":"15895945"},"IsRegExp.js":{"size":545,"integrity":{"algorithm":"SHA256","hash":"1183cff5c42c2cf9a0b3fbb62d4a7f842b56c1141209c683f0116715bcf03c15","blockSize":4194304,"blocks":["1183cff5c42c2cf9a0b3fbb62d4a7f842b56c1141209c683f0116715bcf03c15"]},"offset":"15896152"},"IteratorClose.js":{"size":1481,"integrity":{"algorithm":"SHA256","hash":"52b100a8cc0ecb7b5d5c7346e20d23c7503c832525650b3269f40f6b98948cae","blockSize":4194304,"blocks":["52b100a8cc0ecb7b5d5c7346e20d23c7503c832525650b3269f40f6b98948cae"]},"offset":"15896697"},"IteratorComplete.js":{"size":498,"integrity":{"algorithm":"SHA256","hash":"41ad3ddb0114bfd56e3e67508633496d4ae672eeb47767f12ae0dacdd91d39b5","blockSize":4194304,"blocks":["41ad3ddb0114bfd56e3e67508633496d4ae672eeb47767f12ae0dacdd91d39b5"]},"offset":"15898178"},"IteratorNext.js":{"size":493,"integrity":{"algorithm":"SHA256","hash":"a6ee567a6387448b0140aceffae4ad1ccdd427537d6926716c3f686367098d30","blockSize":4194304,"blocks":["a6ee567a6387448b0140aceffae4ad1ccdd427537d6926716c3f686367098d30"]},"offset":"15898676"},"IteratorStep.js":{"size":353,"integrity":{"algorithm":"SHA256","hash":"22dbe3c1e07083538804e0bc79a4615d97ae6b49978623594f81e9ffd0ad0594","blockSize":4194304,"blocks":["22dbe3c1e07083538804e0bc79a4615d97ae6b49978623594f81e9ffd0ad0594"]},"offset":"15899169"},"IteratorValue.js":{"size":443,"integrity":{"algorithm":"SHA256","hash":"674abbe8978a08b6d6d6ae53a7c3aca04395c6a3e5d97807204fcfaf81fafd68","blockSize":4194304,"blocks":["674abbe8978a08b6d6d6ae53a7c3aca04395c6a3e5d97807204fcfaf81fafd68"]},"offset":"15899522"},"MakeDate.js":{"size":328,"integrity":{"algorithm":"SHA256","hash":"41a9b9da3ede4effd12c43e1c25851b5005623f5eb6dee707252cbe373b32ef0","blockSize":4194304,"blocks":["41a9b9da3ede4effd12c43e1c25851b5005623f5eb6dee707252cbe373b32ef0"]},"offset":"15899965"},"MakeDay.js":{"size":917,"integrity":{"algorithm":"SHA256","hash":"83e8e606e0e1ed2ad5b864a20459f8ce10aac6a653af26c12cd6cbc087da53e9","blockSize":4194304,"blocks":["83e8e606e0e1ed2ad5b864a20459f8ce10aac6a653af26c12cd6cbc087da53e9"]},"offset":"15900293"},"MakeTime.js":{"size":698,"integrity":{"algorithm":"SHA256","hash":"f91ad37ec6587e1debbe2be4f1bb86f4936df8e4649af2e33fe14023ed9f6da7","blockSize":4194304,"blocks":["f91ad37ec6587e1debbe2be4f1bb86f4936df8e4649af2e33fe14023ed9f6da7"]},"offset":"15901210"},"MinFromTime.js":{"size":396,"integrity":{"algorithm":"SHA256","hash":"88e77ac8a1b1aae30fe064057ed6699c3c3b176ec1ab0533893be6d1c7ba856a","blockSize":4194304,"blocks":["88e77ac8a1b1aae30fe064057ed6699c3c3b176ec1ab0533893be6d1c7ba856a"]},"offset":"15901908"},"MonthFromTime.js":{"size":1014,"integrity":{"algorithm":"SHA256","hash":"f7acafe967a838eb85739ec2afa8dcdc9e5c0734219559259338761a09131909","blockSize":4194304,"blocks":["f7acafe967a838eb85739ec2afa8dcdc9e5c0734219559259338761a09131909"]},"offset":"15902304"},"ObjectCreate.js":{"size":1033,"integrity":{"algorithm":"SHA256","hash":"3428357b1183afa802a5aa60b482291d6212cbb99ec01eafd7af91107e1ab4d5","blockSize":4194304,"blocks":["3428357b1183afa802a5aa60b482291d6212cbb99ec01eafd7af91107e1ab4d5"]},"offset":"15903318"},"ObjectDefineProperties.js":{"size":1508,"integrity":{"algorithm":"SHA256","hash":"672b0bda371a4710bf8e7c99cfc41eca1920c10fad584755be76cd5ac1136fa5","blockSize":4194304,"blocks":["672b0bda371a4710bf8e7c99cfc41eca1920c10fad584755be76cd5ac1136fa5"]},"offset":"15904351"},"OrdinaryCreateFromConstructor.js":{"size":808,"integrity":{"algorithm":"SHA256","hash":"0f46555a69c89ffefd354541724966d6351a0b910102aa8acc0d1c1ee7dec67a","blockSize":4194304,"blocks":["0f46555a69c89ffefd354541724966d6351a0b910102aa8acc0d1c1ee7dec67a"]},"offset":"15905859"},"OrdinaryDefineOwnProperty.js":{"size":2390,"integrity":{"algorithm":"SHA256","hash":"5aa87d94193a2cc6a19e5ef3e44a4b1e12f99ff6a0cd1755faf0f0338b0e07fd","blockSize":4194304,"blocks":["5aa87d94193a2cc6a19e5ef3e44a4b1e12f99ff6a0cd1755faf0f0338b0e07fd"]},"offset":"15906667"},"OrdinaryGetOwnProperty.js":{"size":1257,"integrity":{"algorithm":"SHA256","hash":"d4ef741d1e026235ef46accf3a1538b3510a81e35eff00e0643e0431f3c71ba8","blockSize":4194304,"blocks":["d4ef741d1e026235ef46accf3a1538b3510a81e35eff00e0643e0431f3c71ba8"]},"offset":"15909057"},"OrdinaryHasInstance.js":{"size":627,"integrity":{"algorithm":"SHA256","hash":"d36943f8261941e336b58a6d698291eef06aa4d7d44ab5fdffb7d073d50a771c","blockSize":4194304,"blocks":["d36943f8261941e336b58a6d698291eef06aa4d7d44ab5fdffb7d073d50a771c"]},"offset":"15910314"},"OrdinaryHasProperty.js":{"size":531,"integrity":{"algorithm":"SHA256","hash":"cbcf61dec7dc22444d36e89a62324453f98ccff4141e8284e5621b1fd0fbd07b","blockSize":4194304,"blocks":["cbcf61dec7dc22444d36e89a62324453f98ccff4141e8284e5621b1fd0fbd07b"]},"offset":"15910941"},"QuoteJSONString.js":{"size":1422,"integrity":{"algorithm":"SHA256","hash":"b8eb77f91a4edf4aa6841bdeab7ba2b2f748cd6548fd384759e6bee5bdf69225","blockSize":4194304,"blocks":["b8eb77f91a4edf4aa6841bdeab7ba2b2f748cd6548fd384759e6bee5bdf69225"]},"offset":"15911472"},"RegExpCreate.js":{"size":643,"integrity":{"algorithm":"SHA256","hash":"49da22ccbe85efb7620bfeb7877f2ef8678f1882ade81fcdc3f54567add7ab6b","blockSize":4194304,"blocks":["49da22ccbe85efb7620bfeb7877f2ef8678f1882ade81fcdc3f54567add7ab6b"]},"offset":"15912894"},"RegExpExec.js":{"size":887,"integrity":{"algorithm":"SHA256","hash":"32fbe5fc604aa31efc738c2b617a512114367daffa37a031a3257fe5be493bb9","blockSize":4194304,"blocks":["32fbe5fc604aa31efc738c2b617a512114367daffa37a031a3257fe5be493bb9"]},"offset":"15913537"},"RequireObjectCoercible.js":{"size":70,"integrity":{"algorithm":"SHA256","hash":"25d49a24f231f606c6d8be4760f3795c12f61bda0ac95ad8e452205f97c8e612","blockSize":4194304,"blocks":["25d49a24f231f606c6d8be4760f3795c12f61bda0ac95ad8e452205f97c8e612"]},"offset":"15914424"},"SameValue.js":{"size":307,"integrity":{"algorithm":"SHA256","hash":"e6d99ed6b4a479bed51f697cbc4693a2ff8da0d1e07b5ebf11e74b5404af2ab1","blockSize":4194304,"blocks":["e6d99ed6b4a479bed51f697cbc4693a2ff8da0d1e07b5ebf11e74b5404af2ab1"]},"offset":"15914494"},"SameValueZero.js":{"size":223,"integrity":{"algorithm":"SHA256","hash":"269684a69605b1f7ad04dfccc1519d7905271fd6ae05601a832a2ab8fb7272fc","blockSize":4194304,"blocks":["269684a69605b1f7ad04dfccc1519d7905271fd6ae05601a832a2ab8fb7272fc"]},"offset":"15914801"},"SecFromTime.js":{"size":402,"integrity":{"algorithm":"SHA256","hash":"6263c6176eafa22eadeb7bc054169fd764a3e3aab0cf637110d86110367c8a36","blockSize":4194304,"blocks":["6263c6176eafa22eadeb7bc054169fd764a3e3aab0cf637110d86110367c8a36"]},"offset":"15915024"},"Set.js":{"size":1255,"integrity":{"algorithm":"SHA256","hash":"88389d458aaae848468091535f5e8be59993020e744e998ca3058b59c1943ce8","blockSize":4194304,"blocks":["88389d458aaae848468091535f5e8be59993020e744e998ca3058b59c1943ce8"]},"offset":"15915426"},"SetFunctionName.js":{"size":1381,"integrity":{"algorithm":"SHA256","hash":"dabffc283c552e871c8bfd4a4d419e9453056b2b51a23f80f2ff6050c30b09c9","blockSize":4194304,"blocks":["dabffc283c552e871c8bfd4a4d419e9453056b2b51a23f80f2ff6050c30b09c9"]},"offset":"15916681"},"SetIntegrityLevel.js":{"size":1862,"integrity":{"algorithm":"SHA256","hash":"3c04bdc423a594ffec10244025e37e466b5878c4255a53655d445f51584b7d5e","blockSize":4194304,"blocks":["3c04bdc423a594ffec10244025e37e466b5878c4255a53655d445f51584b7d5e"]},"offset":"15918062"},"SpeciesConstructor.js":{"size":844,"integrity":{"algorithm":"SHA256","hash":"826eccbe073d3e7b806cd67e4d4ae09ede6d5ae6125480705b7bf81c2486f175","blockSize":4194304,"blocks":["826eccbe073d3e7b806cd67e4d4ae09ede6d5ae6125480705b7bf81c2486f175"]},"offset":"15919924"},"SplitMatch.js":{"size":874,"integrity":{"algorithm":"SHA256","hash":"316ced53a4420b95079c1160d67c81e52e91173360784bb3a517397420cb6d84","blockSize":4194304,"blocks":["316ced53a4420b95079c1160d67c81e52e91173360784bb3a517397420cb6d84"]},"offset":"15920768"},"StrictEqualityComparison.js":{"size":361,"integrity":{"algorithm":"SHA256","hash":"33928172f049f2f5fd7559470bb12647b7c6012b1da230e5a7e5fd8ffc1dd30e","blockSize":4194304,"blocks":["33928172f049f2f5fd7559470bb12647b7c6012b1da230e5a7e5fd8ffc1dd30e"]},"offset":"15921642"},"StringCreate.js":{"size":1117,"integrity":{"algorithm":"SHA256","hash":"18a70a9279026ea03b811f95a797cde8caf8d77a010880506e0f0b4532a1181d","blockSize":4194304,"blocks":["18a70a9279026ea03b811f95a797cde8caf8d77a010880506e0f0b4532a1181d"]},"offset":"15922003"},"StringGetIndexProperty.js":{"size":1373,"integrity":{"algorithm":"SHA256","hash":"74aefac852eaa7afa81c8abf8c29b888290df705c55fc65f7757a1ff263f8288","blockSize":4194304,"blocks":["74aefac852eaa7afa81c8abf8c29b888290df705c55fc65f7757a1ff263f8288"]},"offset":"15923120"},"SymbolDescriptiveString.js":{"size":526,"integrity":{"algorithm":"SHA256","hash":"d5a4e603be41ed5dff7123a6a0ba29efae0812f4d076a78387520b36b416a37d","blockSize":4194304,"blocks":["d5a4e603be41ed5dff7123a6a0ba29efae0812f4d076a78387520b36b416a37d"]},"offset":"15924493"},"TestIntegrityLevel.js":{"size":1285,"integrity":{"algorithm":"SHA256","hash":"8a0161ac60421c4762bc9e442224da95614cdb3e9865bcd79ad29d2310dd35c6","blockSize":4194304,"blocks":["8a0161ac60421c4762bc9e442224da95614cdb3e9865bcd79ad29d2310dd35c6"]},"offset":"15925019"},"TimeClip.js":{"size":468,"integrity":{"algorithm":"SHA256","hash":"bf1f153b35126ac0ebd122717e6349c97e932e3665ff1947f5f4a7da4895cb48","blockSize":4194304,"blocks":["bf1f153b35126ac0ebd122717e6349c97e932e3665ff1947f5f4a7da4895cb48"]},"offset":"15926304"},"TimeFromYear.js":{"size":261,"integrity":{"algorithm":"SHA256","hash":"07bd801ef44bcc4c5458937d6b3c09b1ba6f30d24fbb06ca9b4818c0699c330b","blockSize":4194304,"blocks":["07bd801ef44bcc4c5458937d6b3c09b1ba6f30d24fbb06ca9b4818c0699c330b"]},"offset":"15926772"},"TimeWithinDay.js":{"size":247,"integrity":{"algorithm":"SHA256","hash":"c83b563c9849ca65fb1ed7235f72f42a019fde9e67aad81d1bd0699ed28f43f8","blockSize":4194304,"blocks":["c83b563c9849ca65fb1ed7235f72f42a019fde9e67aad81d1bd0699ed28f43f8"]},"offset":"15927033"},"ToBoolean.js":{"size":130,"integrity":{"algorithm":"SHA256","hash":"36a4823341bd4ec68dd6f4b32afbbc939330a48bf7042108c9be89eaaab5bbc6","blockSize":4194304,"blocks":["36a4823341bd4ec68dd6f4b32afbbc939330a48bf7042108c9be89eaaab5bbc6"]},"offset":"15927280"},"ToDateString.js":{"size":498,"integrity":{"algorithm":"SHA256","hash":"57a5e2f02146ccfa64217595a7b5024fd7a74d9847a5d7df98f6cdaa04335612","blockSize":4194304,"blocks":["57a5e2f02146ccfa64217595a7b5024fd7a74d9847a5d7df98f6cdaa04335612"]},"offset":"15927410"},"ToInt16.js":{"size":260,"integrity":{"algorithm":"SHA256","hash":"ad0dcb3339d64526564c10379cc026a2f595f9ed7642199104eb0c0ffebccc35","blockSize":4194304,"blocks":["ad0dcb3339d64526564c10379cc026a2f595f9ed7642199104eb0c0ffebccc35"]},"offset":"15927908"},"ToInt32.js":{"size":173,"integrity":{"algorithm":"SHA256","hash":"e0c77696079335a016ce39e9992f11939ad25c1b322d119eedbec24a989a50a6","blockSize":4194304,"blocks":["e0c77696079335a016ce39e9992f11939ad25c1b322d119eedbec24a989a50a6"]},"offset":"15928168"},"ToInt8.js":{"size":247,"integrity":{"algorithm":"SHA256","hash":"0f844398064a22ca49a1c263a564e15449de26b5114281211d3de3535d914336","blockSize":4194304,"blocks":["0f844398064a22ca49a1c263a564e15449de26b5114281211d3de3535d914336"]},"offset":"15928341"},"ToInteger.js":{"size":273,"integrity":{"algorithm":"SHA256","hash":"b07f58c5193a820640f1169bdf1a38dee1c1eb863d5874294d9afa5438bdb274","blockSize":4194304,"blocks":["b07f58c5193a820640f1169bdf1a38dee1c1eb863d5874294d9afa5438bdb274"]},"offset":"15928588"},"ToLength.js":{"size":332,"integrity":{"algorithm":"SHA256","hash":"b4faf0dcbfc133417e965670ef8bf4071f0c323400c32f5cc528a3bc957e8fe5","blockSize":4194304,"blocks":["b4faf0dcbfc133417e965670ef8bf4071f0c323400c32f5cc528a3bc957e8fe5"]},"offset":"15928861"},"ToNumber.js":{"size":2015,"integrity":{"algorithm":"SHA256","hash":"e0eac78353a093abb2717666f27ebebc1a9e48caa98950b7fb4cf9dadde4ab7c","blockSize":4194304,"blocks":["e0eac78353a093abb2717666f27ebebc1a9e48caa98950b7fb4cf9dadde4ab7c"]},"offset":"15929193"},"ToObject.js":{"size":334,"integrity":{"algorithm":"SHA256","hash":"2c382673870deb89e3b19511d8f08fa9554d103fa9d143e5a57b79d85a093725","blockSize":4194304,"blocks":["2c382673870deb89e3b19511d8f08fa9554d103fa9d143e5a57b79d85a093725"]},"offset":"15931208"},"ToPrimitive.js":{"size":287,"integrity":{"algorithm":"SHA256","hash":"fe27d95fe99afd38d780e7d88f349e1dc1a68841b845e118abb8c80c4ab9aa53","blockSize":4194304,"blocks":["fe27d95fe99afd38d780e7d88f349e1dc1a68841b845e118abb8c80c4ab9aa53"]},"offset":"15931542"},"ToPropertyDescriptor.js":{"size":1452,"integrity":{"algorithm":"SHA256","hash":"78b5dfba0830bc47aa55c1b33f2be8fd973ff5ccc87a599abadda676d3596c49","blockSize":4194304,"blocks":["78b5dfba0830bc47aa55c1b33f2be8fd973ff5ccc87a599abadda676d3596c49"]},"offset":"15931829"},"ToPropertyKey.js":{"size":405,"integrity":{"algorithm":"SHA256","hash":"58d4355f4509a456b237e1d72169200edb1810d1efa9ee167ac26faa7904edd3","blockSize":4194304,"blocks":["58d4355f4509a456b237e1d72169200edb1810d1efa9ee167ac26faa7904edd3"]},"offset":"15933281"},"ToString.js":{"size":396,"integrity":{"algorithm":"SHA256","hash":"79c26e024582b6ac70a965063b757c70ceea15fa8da17a78ebbf77b40ccaece3","blockSize":4194304,"blocks":["79c26e024582b6ac70a965063b757c70ceea15fa8da17a78ebbf77b40ccaece3"]},"offset":"15933686"},"ToUint16.js":{"size":564,"integrity":{"algorithm":"SHA256","hash":"5775f0384586a383c5dd6c359e37d4b218c8ddf069d7a2906f7e4752ab66a20d","blockSize":4194304,"blocks":["5775f0384586a383c5dd6c359e37d4b218c8ddf069d7a2906f7e4752ab66a20d"]},"offset":"15934082"},"ToUint32.js":{"size":175,"integrity":{"algorithm":"SHA256","hash":"b68209f8fb9d1e978fe3d162251bba47f056c43ec7028cbd99b485800bd62315","blockSize":4194304,"blocks":["b68209f8fb9d1e978fe3d162251bba47f056c43ec7028cbd99b485800bd62315"]},"offset":"15934646"},"ToUint8.js":{"size":578,"integrity":{"algorithm":"SHA256","hash":"94fa392bda40d5d6c1125b662b304a372b135660d3740eebae7ade568bdd52a9","blockSize":4194304,"blocks":["94fa392bda40d5d6c1125b662b304a372b135660d3740eebae7ade568bdd52a9"]},"offset":"15934821"},"ToUint8Clamp.js":{"size":522,"integrity":{"algorithm":"SHA256","hash":"30dd3065a73ef4ff1f0a018ce80bd550673e5ee29c732e6fc8cade4661f80d56","blockSize":4194304,"blocks":["30dd3065a73ef4ff1f0a018ce80bd550673e5ee29c732e6fc8cade4661f80d56"]},"offset":"15935399"},"Type.js":{"size":249,"integrity":{"algorithm":"SHA256","hash":"a9812c431dc51253d8d3bd637842b22534f87a1f1006d2266c824488d068305d","blockSize":4194304,"blocks":["a9812c431dc51253d8d3bd637842b22534f87a1f1006d2266c824488d068305d"]},"offset":"15935921"},"ValidateAndApplyPropertyDescriptor.js":{"size":5243,"integrity":{"algorithm":"SHA256","hash":"588f81f21e07a8d2255bc0aed34c94052aa74d5b558edc4435d0acee12c90554","blockSize":4194304,"blocks":["588f81f21e07a8d2255bc0aed34c94052aa74d5b558edc4435d0acee12c90554"]},"offset":"15936170"},"WeekDay.js":{"size":208,"integrity":{"algorithm":"SHA256","hash":"f7cc798c72dcc484295681d29d535e64215a9ec303f4f6e6456ea63e83ce0246","blockSize":4194304,"blocks":["f7cc798c72dcc484295681d29d535e64215a9ec303f4f6e6456ea63e83ce0246"]},"offset":"15941413"},"YearFromTime.js":{"size":407,"integrity":{"algorithm":"SHA256","hash":"5562b7fd6be438187a1187a331f0d310e631e9747df14521accc7a797e2a2aa7","blockSize":4194304,"blocks":["5562b7fd6be438187a1187a331f0d310e631e9747df14521accc7a797e2a2aa7"]},"offset":"15941621"},"abs.js":{"size":207,"integrity":{"algorithm":"SHA256","hash":"a50e248c29238747c3c278a4edf2c0643f1295d1c065d9dff8524def17f0427f","blockSize":4194304,"blocks":["a50e248c29238747c3c278a4edf2c0643f1295d1c065d9dff8524def17f0427f"]},"offset":"15942028"},"floor.js":{"size":217,"integrity":{"algorithm":"SHA256","hash":"90c20830ae8762224c83fb0ed36a288a7d567f57d3b5acb469590cc2d5e13f55","blockSize":4194304,"blocks":["90c20830ae8762224c83fb0ed36a288a7d567f57d3b5acb469590cc2d5e13f55"]},"offset":"15942235"},"modulo.js":{"size":168,"integrity":{"algorithm":"SHA256","hash":"84923b64427edcc840ee9a305dca213f4bf1e04ed8f88f6bfd7bfa9e655d7c98","blockSize":4194304,"blocks":["84923b64427edcc840ee9a305dca213f4bf1e04ed8f88f6bfd7bfa9e655d7c98"]},"offset":"15942452"},"msFromTime.js":{"size":253,"integrity":{"algorithm":"SHA256","hash":"ef13a7e7721d695f125a7e772f8037ed34aa3c97aaa3692da900c6796cd270da","blockSize":4194304,"blocks":["ef13a7e7721d695f125a7e772f8037ed34aa3c97aaa3692da900c6796cd270da"]},"offset":"15942620"},"thisBooleanValue.js":{"size":367,"integrity":{"algorithm":"SHA256","hash":"171bd884e07701d9e37bece81b05a95fd7d822ff7eaaba5c112d6e3a352ad498","blockSize":4194304,"blocks":["171bd884e07701d9e37bece81b05a95fd7d822ff7eaaba5c112d6e3a352ad498"]},"offset":"15942873"},"thisNumberValue.js":{"size":390,"integrity":{"algorithm":"SHA256","hash":"a3bb9eb733e74de8a50f49e4425e57fd01bebbf66df4f9967da3d9edee589455","blockSize":4194304,"blocks":["a3bb9eb733e74de8a50f49e4425e57fd01bebbf66df4f9967da3d9edee589455"]},"offset":"15943240"},"thisStringValue.js":{"size":361,"integrity":{"algorithm":"SHA256","hash":"47305af763f963ab1c547011b6be408827678d61540009de579bf996d0810ff5","blockSize":4194304,"blocks":["47305af763f963ab1c547011b6be408827678d61540009de579bf996d0810ff5"]},"offset":"15943630"},"thisTimeValue.js":{"size":267,"integrity":{"algorithm":"SHA256","hash":"4530f2d9e41738da88d10de84862a02fa1b34d5a704206d8deb5a151f26a87b8","blockSize":4194304,"blocks":["4530f2d9e41738da88d10de84862a02fa1b34d5a704206d8deb5a151f26a87b8"]},"offset":"15943991"}}},"2016":{"files":{"AbstractEqualityComparison.js":{"size":1154,"integrity":{"algorithm":"SHA256","hash":"b95b9c6c6a99532fe37e1d0fa948bbe700ecc013b045034afb1a5db6a39026db","blockSize":4194304,"blocks":["b95b9c6c6a99532fe37e1d0fa948bbe700ecc013b045034afb1a5db6a39026db"]},"offset":"15762480"},"AbstractRelationalComparison.js":{"size":1590,"integrity":{"algorithm":"SHA256","hash":"0246b938fe11124d2c1f58f39636646b85f5415edf3f25aaf24e1b35abbd6ef5","blockSize":4194304,"blocks":["0246b938fe11124d2c1f58f39636646b85f5415edf3f25aaf24e1b35abbd6ef5"]},"offset":"15763634"},"AdvanceStringIndex.js":{"size":1305,"integrity":{"algorithm":"SHA256","hash":"021f64d34615e95873eab825aa0353ee281db9bb6d1d7436fb77a45f9cd9a296","blockSize":4194304,"blocks":["021f64d34615e95873eab825aa0353ee281db9bb6d1d7436fb77a45f9cd9a296"]},"offset":"15765224"},"ArrayCreate.js":{"size":1650,"integrity":{"algorithm":"SHA256","hash":"6cde465e8db30b2ba485412ac2912f04a6212b3effdd37d0f3a9894af999ba9b","blockSize":4194304,"blocks":["6cde465e8db30b2ba485412ac2912f04a6212b3effdd37d0f3a9894af999ba9b"]},"offset":"15766529"},"ArraySetLength.js":{"size":2665,"integrity":{"algorithm":"SHA256","hash":"4b07de7693377557e2f05bf21ea871ff235ce1121e0e95846f5639fa5cc3ebb1","blockSize":4194304,"blocks":["4b07de7693377557e2f05bf21ea871ff235ce1121e0e95846f5639fa5cc3ebb1"]},"offset":"15768179"},"ArraySpeciesCreate.js":{"size":1348,"integrity":{"algorithm":"SHA256","hash":"246aed3dfe50be7dcbd5b25934dd6c74bff25b66de39dcc70335e6d668cc480b","blockSize":4194304,"blocks":["246aed3dfe50be7dcbd5b25934dd6c74bff25b66de39dcc70335e6d668cc480b"]},"offset":"15770844"},"Call.js":{"size":623,"integrity":{"algorithm":"SHA256","hash":"b092006d05bceeccee48bdf3fde9d83ee54a156eb2841bf5cacdca9f157b4571","blockSize":4194304,"blocks":["b092006d05bceeccee48bdf3fde9d83ee54a156eb2841bf5cacdca9f157b4571"]},"offset":"15772192"},"CanonicalNumericIndexString.js":{"size":654,"integrity":{"algorithm":"SHA256","hash":"c850cc1637b82f4fc238d2ae1a45229e8d44bc5c9b85205c0f27a1e0e9bb9d2b","blockSize":4194304,"blocks":["c850cc1637b82f4fc238d2ae1a45229e8d44bc5c9b85205c0f27a1e0e9bb9d2b"]},"offset":"15772815"},"CharacterRange.js":{"size":782,"integrity":{"algorithm":"SHA256","hash":"49612101e544a9b707f116ac8fe2be0d2c559c1d3b4f94ba47f36832913ea11f","blockSize":4194304,"blocks":["49612101e544a9b707f116ac8fe2be0d2c559c1d3b4f94ba47f36832913ea11f"]},"offset":"15773469"},"CompletePropertyDescriptor.js":{"size":989,"integrity":{"algorithm":"SHA256","hash":"17825d14da6797c52aa699d7b089bc2370d5a899cb7af7e3485f948fde50fca2","blockSize":4194304,"blocks":["17825d14da6797c52aa699d7b089bc2370d5a899cb7af7e3485f948fde50fca2"]},"offset":"15774251"},"CreateDataProperty.js":{"size":1279,"integrity":{"algorithm":"SHA256","hash":"5006509a3f5567f81cb7f730448a0a492c64c7f06406627c58d0334dde5e44f9","blockSize":4194304,"blocks":["5006509a3f5567f81cb7f730448a0a492c64c7f06406627c58d0334dde5e44f9"]},"offset":"15775240"},"CreateDataPropertyOrThrow.js":{"size":734,"integrity":{"algorithm":"SHA256","hash":"50c61c792c27d661346cfb29fe5b7603a2713d7acb1dc5b3b35fe71ece8fd18e","blockSize":4194304,"blocks":["50c61c792c27d661346cfb29fe5b7603a2713d7acb1dc5b3b35fe71ece8fd18e"]},"offset":"15776519"},"CreateHTML.js":{"size":927,"integrity":{"algorithm":"SHA256","hash":"5b9cf63f6b4bc50077e333c2b310cbd4c85a97891b2e1d28a93aeeb4370c2930","blockSize":4194304,"blocks":["5b9cf63f6b4bc50077e333c2b310cbd4c85a97891b2e1d28a93aeeb4370c2930"]},"offset":"15777253"},"CreateIterResultObject.js":{"size":432,"integrity":{"algorithm":"SHA256","hash":"289a26996866dba6f6292ba0931e643c7a5851f21003d41e5a004862a03a2035","blockSize":4194304,"blocks":["289a26996866dba6f6292ba0931e643c7a5851f21003d41e5a004862a03a2035"]},"offset":"15778180"},"CreateListFromArrayLike.js":{"size":1354,"integrity":{"algorithm":"SHA256","hash":"59bff81b54528dca9de105511851d1af4ee78c476453991e93ddde3b29e0a0ff","blockSize":4194304,"blocks":["59bff81b54528dca9de105511851d1af4ee78c476453991e93ddde3b29e0a0ff"]},"offset":"15778612"},"CreateMethodProperty.js":{"size":979,"integrity":{"algorithm":"SHA256","hash":"117c68b2fa6825c31e8d6f4970973fddf09fd74506447ca22ed3cfc2ed8b04e8","blockSize":4194304,"blocks":["117c68b2fa6825c31e8d6f4970973fddf09fd74506447ca22ed3cfc2ed8b04e8"]},"offset":"15779966"},"DateFromTime.js":{"size":1036,"integrity":{"algorithm":"SHA256","hash":"ae437cb5ee92b162e18b6f47b9dd66b66f627547e098a0670d60c2572f04b1ed","blockSize":4194304,"blocks":["ae437cb5ee92b162e18b6f47b9dd66b66f627547e098a0670d60c2572f04b1ed"]},"offset":"15780945"},"Day.js":{"size":234,"integrity":{"algorithm":"SHA256","hash":"ff3875a46c34886cff3808ab1c4de6d3b45a61e9638b32edd22f41277c153ea5","blockSize":4194304,"blocks":["ff3875a46c34886cff3808ab1c4de6d3b45a61e9638b32edd22f41277c153ea5"]},"offset":"15781981"},"DayFromYear.js":{"size":256,"integrity":{"algorithm":"SHA256","hash":"378eb638143e86cfa3061177986dcfdb6bdec76e8b799b95cf3b9cafc5e9af68","blockSize":4194304,"blocks":["378eb638143e86cfa3061177986dcfdb6bdec76e8b799b95cf3b9cafc5e9af68"]},"offset":"15782215"},"DayWithinYear.js":{"size":286,"integrity":{"algorithm":"SHA256","hash":"b1ac5824fb1ced3e9d2dae99db5bd3890b4ef25dc45e50a4f927384bb5be618e","blockSize":4194304,"blocks":["b1ac5824fb1ced3e9d2dae99db5bd3890b4ef25dc45e50a4f927384bb5be618e"]},"offset":"15782471"},"DaysInYear.js":{"size":301,"integrity":{"algorithm":"SHA256","hash":"3f5955b3d1831ed2d008ae052a802b12c22bf1ba6d8fd286e0cb7a6a77144aec","blockSize":4194304,"blocks":["3f5955b3d1831ed2d008ae052a802b12c22bf1ba6d8fd286e0cb7a6a77144aec"]},"offset":"15782757"},"DefinePropertyOrThrow.js":{"size":1466,"integrity":{"algorithm":"SHA256","hash":"1964ecd5b9e64b3ddb203ac7da3410e09a2b1d0ab9b1f06733af8ea15ae954a4","blockSize":4194304,"blocks":["1964ecd5b9e64b3ddb203ac7da3410e09a2b1d0ab9b1f06733af8ea15ae954a4"]},"offset":"15783058"},"DeletePropertyOrThrow.js":{"size":699,"integrity":{"algorithm":"SHA256","hash":"3c1ac659ec4eb7ad97e99c2c3d08c2058624eec2ac0bcca0583660a0fe69f1c5","blockSize":4194304,"blocks":["3c1ac659ec4eb7ad97e99c2c3d08c2058624eec2ac0bcca0583660a0fe69f1c5"]},"offset":"15784524"},"EnumerableOwnNames.js":{"size":417,"integrity":{"algorithm":"SHA256","hash":"0a5f72276f63231cd8aa656b70e6dc6480d2a93a70f3f2a8e6dbd56505814ab1","blockSize":4194304,"blocks":["0a5f72276f63231cd8aa656b70e6dc6480d2a93a70f3f2a8e6dbd56505814ab1"]},"offset":"15785223"},"FromPropertyDescriptor.js":{"size":450,"integrity":{"algorithm":"SHA256","hash":"a16798c55be7b402fc2b27d4d422f322c40639b7403d47cb897b576fcc1ddd49","blockSize":4194304,"blocks":["a16798c55be7b402fc2b27d4d422f322c40639b7403d47cb897b576fcc1ddd49"]},"offset":"15785640"},"Get.js":{"size":602,"integrity":{"algorithm":"SHA256","hash":"ef9a4a39b94f3287d0c9ed27b9a5f1cb71164d2184d6aaf2fc5900fd44016ff9","blockSize":4194304,"blocks":["ef9a4a39b94f3287d0c9ed27b9a5f1cb71164d2184d6aaf2fc5900fd44016ff9"]},"offset":"15786090"},"GetIterator.js":{"size":856,"integrity":{"algorithm":"SHA256","hash":"6fd952f51c6137a0ef8aab1074a42011584da628da9360176b107dcf91979355","blockSize":4194304,"blocks":["6fd952f51c6137a0ef8aab1074a42011584da628da9360176b107dcf91979355"]},"offset":"15786692"},"GetMethod.js":{"size":663,"integrity":{"algorithm":"SHA256","hash":"87f8829531af6b2019ed31d44f2efcf89e8bf345c158ad6bd790f8e14028d325","blockSize":4194304,"blocks":["87f8829531af6b2019ed31d44f2efcf89e8bf345c158ad6bd790f8e14028d325"]},"offset":"15787548"},"GetOwnPropertyKeys.js":{"size":829,"integrity":{"algorithm":"SHA256","hash":"7ad04a3a175ede6b7d15611717a20c2bc6a09bef382f8b4f7d985e5b2e1e7120","blockSize":4194304,"blocks":["7ad04a3a175ede6b7d15611717a20c2bc6a09bef382f8b4f7d985e5b2e1e7120"]},"offset":"15788211"},"GetPrototypeFromConstructor.js":{"size":921,"integrity":{"algorithm":"SHA256","hash":"da1c30c8d5b331e72618af4ccc18b5f3ed89b36e9be117c74a4ee9266141ba56","blockSize":4194304,"blocks":["da1c30c8d5b331e72618af4ccc18b5f3ed89b36e9be117c74a4ee9266141ba56"]},"offset":"15789040"},"GetSubstitution.js":{"size":3523,"integrity":{"algorithm":"SHA256","hash":"550b5f32a640bf6a8e30b3729e21a25c6cbfd62ee4d8d90abf671ad20c7a368a","blockSize":4194304,"blocks":["550b5f32a640bf6a8e30b3729e21a25c6cbfd62ee4d8d90abf671ad20c7a368a"]},"offset":"15789961"},"GetV.js":{"size":474,"integrity":{"algorithm":"SHA256","hash":"66909f7192a6bddc6fb77163f6182164ebef641f0f4c595835485eda6cfd3443","blockSize":4194304,"blocks":["66909f7192a6bddc6fb77163f6182164ebef641f0f4c595835485eda6cfd3443"]},"offset":"15793484"},"HasOwnProperty.js":{"size":553,"integrity":{"algorithm":"SHA256","hash":"b099b2f9829fe64e25740771abc3d3c4e1c801ce0cd2ccecf6041ad08d59364d","blockSize":4194304,"blocks":["b099b2f9829fe64e25740771abc3d3c4e1c801ce0cd2ccecf6041ad08d59364d"]},"offset":"15793958"},"HasProperty.js":{"size":517,"integrity":{"algorithm":"SHA256","hash":"7889a3e2b191509b3d6c0bfcabbad2a915919a2caa275b696a12eab4ebd9cdac","blockSize":4194304,"blocks":["7889a3e2b191509b3d6c0bfcabbad2a915919a2caa275b696a12eab4ebd9cdac"]},"offset":"15794511"},"HourFromTime.js":{"size":382,"integrity":{"algorithm":"SHA256","hash":"338503d8b54967fb22e0659243cab7fc283f023561a8a3316df8b4de588bddf9","blockSize":4194304,"blocks":["338503d8b54967fb22e0659243cab7fc283f023561a8a3316df8b4de588bddf9"]},"offset":"15795028"},"InLeapYear.js":{"size":510,"integrity":{"algorithm":"SHA256","hash":"d9abbf0c4b80df1fd7cb31830f222eb4b6bbe638dcfa3461809905158f2ce0a6","blockSize":4194304,"blocks":["d9abbf0c4b80df1fd7cb31830f222eb4b6bbe638dcfa3461809905158f2ce0a6"]},"offset":"15795410"},"InstanceofOperator.js":{"size":918,"integrity":{"algorithm":"SHA256","hash":"af702715d893f635ff66441f9638a4dc977789c505a50ae17f7e02b05b2549d6","blockSize":4194304,"blocks":["af702715d893f635ff66441f9638a4dc977789c505a50ae17f7e02b05b2549d6"]},"offset":"15795920"},"Invoke.js":{"size":715,"integrity":{"algorithm":"SHA256","hash":"ff016550d8adf9608b2f4ab258017c1582ce717a2e2b3bd2b7a94440f7f19f8f","blockSize":4194304,"blocks":["ff016550d8adf9608b2f4ab258017c1582ce717a2e2b3bd2b7a94440f7f19f8f"]},"offset":"15796838"},"IsAccessorDescriptor.js":{"size":465,"integrity":{"algorithm":"SHA256","hash":"425c74a892b6bb2d1dc6c56e7a6e77e40b9c4d4390480fafe4c804cea53a80ad","blockSize":4194304,"blocks":["425c74a892b6bb2d1dc6c56e7a6e77e40b9c4d4390480fafe4c804cea53a80ad"]},"offset":"15797553"},"IsArray.js":{"size":123,"integrity":{"algorithm":"SHA256","hash":"a8f01a797e05a74501ceb9293408f72bded2a08013c6a075f582737003b443f4","blockSize":4194304,"blocks":["a8f01a797e05a74501ceb9293408f72bded2a08013c6a075f582737003b443f4"]},"offset":"15798018"},"IsCallable.js":{"size":108,"integrity":{"algorithm":"SHA256","hash":"789ba0a1f176c56862f16b2ff7bc3eeaaa02676f75be073a46c92c5e8af21170","blockSize":4194304,"blocks":["789ba0a1f176c56862f16b2ff7bc3eeaaa02676f75be073a46c92c5e8af21170"]},"offset":"15798141"},"IsCompatiblePropertyDescriptor.js":{"size":367,"integrity":{"algorithm":"SHA256","hash":"f9736fde486f1f27112126908c39423b2b3b946a96d5e2a4d762b3139da17543","blockSize":4194304,"blocks":["f9736fde486f1f27112126908c39423b2b3b946a96d5e2a4d762b3139da17543"]},"offset":"15798249"},"IsConcatSpreadable.js":{"size":626,"integrity":{"algorithm":"SHA256","hash":"7a4c3cae4f5de1b8cbc5694ac320cfaaf30f4ecbe2754e2ffb3f72fb42763a8a","blockSize":4194304,"blocks":["7a4c3cae4f5de1b8cbc5694ac320cfaaf30f4ecbe2754e2ffb3f72fb42763a8a"]},"offset":"15798616"},"IsConstructor.js":{"size":1149,"integrity":{"algorithm":"SHA256","hash":"1a58d54e8aec9ecbfaf3e75d9b38ef06c8a3c948e337cca159a17a102ee41929","blockSize":4194304,"blocks":["1a58d54e8aec9ecbfaf3e75d9b38ef06c8a3c948e337cca159a17a102ee41929"]},"offset":"15799242"},"IsDataDescriptor.js":{"size":464,"integrity":{"algorithm":"SHA256","hash":"35a0862d76e9d765d5fa4154250ed5ac440f4238432a773f22c288da3886e1ce","blockSize":4194304,"blocks":["35a0862d76e9d765d5fa4154250ed5ac440f4238432a773f22c288da3886e1ce"]},"offset":"15800391"},"IsExtensible.js":{"size":509,"integrity":{"algorithm":"SHA256","hash":"e28d0530ae66f0dfb8fa90c492fd6242a44ea7eff298d1ed4c10eac9fdfc8efb","blockSize":4194304,"blocks":["e28d0530ae66f0dfb8fa90c492fd6242a44ea7eff298d1ed4c10eac9fdfc8efb"]},"offset":"15800855"},"IsGenericDescriptor.js":{"size":560,"integrity":{"algorithm":"SHA256","hash":"b9d31ec0ad5beaea6a7d9f1180d67ef8f45b164234deeee14c362c8eb2e135cc","blockSize":4194304,"blocks":["b9d31ec0ad5beaea6a7d9f1180d67ef8f45b164234deeee14c362c8eb2e135cc"]},"offset":"15801364"},"IsInteger.js":{"size":450,"integrity":{"algorithm":"SHA256","hash":"84893768eabe51d4073d48aeb5cf43cfdba3a1c6223da13b0a73f802033ff6e2","blockSize":4194304,"blocks":["84893768eabe51d4073d48aeb5cf43cfdba3a1c6223da13b0a73f802033ff6e2"]},"offset":"15801924"},"IsPromise.js":{"size":485,"integrity":{"algorithm":"SHA256","hash":"9f4e5aef10bca5119fab546b4834e48b776d14a775f55524cd3512c4321a1e7c","blockSize":4194304,"blocks":["9f4e5aef10bca5119fab546b4834e48b776d14a775f55524cd3512c4321a1e7c"]},"offset":"15802374"},"IsPropertyDescriptor.js":{"size":554,"integrity":{"algorithm":"SHA256","hash":"3caa7b0fa1648606559ae342c40c084209c34d7bc43416cc58256689f3ddcc55","blockSize":4194304,"blocks":["3caa7b0fa1648606559ae342c40c084209c34d7bc43416cc58256689f3ddcc55"]},"offset":"15802859"},"IsPropertyKey.js":{"size":207,"integrity":{"algorithm":"SHA256","hash":"577d849187a0e8ef526a6368eb6757f6a128db792cf9ade6dfc6c82a75d155c3","blockSize":4194304,"blocks":["577d849187a0e8ef526a6368eb6757f6a128db792cf9ade6dfc6c82a75d155c3"]},"offset":"15803413"},"IsRegExp.js":{"size":545,"integrity":{"algorithm":"SHA256","hash":"1183cff5c42c2cf9a0b3fbb62d4a7f842b56c1141209c683f0116715bcf03c15","blockSize":4194304,"blocks":["1183cff5c42c2cf9a0b3fbb62d4a7f842b56c1141209c683f0116715bcf03c15"]},"offset":"15803620"},"IterableToArrayLike.js":{"size":1097,"integrity":{"algorithm":"SHA256","hash":"ff66fb29f10145d04a3a70ecb8f3718abb157ca3fb8f210ed6dae8124f2ac84a","blockSize":4194304,"blocks":["ff66fb29f10145d04a3a70ecb8f3718abb157ca3fb8f210ed6dae8124f2ac84a"]},"offset":"15804165"},"IteratorClose.js":{"size":1481,"integrity":{"algorithm":"SHA256","hash":"52b100a8cc0ecb7b5d5c7346e20d23c7503c832525650b3269f40f6b98948cae","blockSize":4194304,"blocks":["52b100a8cc0ecb7b5d5c7346e20d23c7503c832525650b3269f40f6b98948cae"]},"offset":"15805262"},"IteratorComplete.js":{"size":498,"integrity":{"algorithm":"SHA256","hash":"41ad3ddb0114bfd56e3e67508633496d4ae672eeb47767f12ae0dacdd91d39b5","blockSize":4194304,"blocks":["41ad3ddb0114bfd56e3e67508633496d4ae672eeb47767f12ae0dacdd91d39b5"]},"offset":"15806743"},"IteratorNext.js":{"size":493,"integrity":{"algorithm":"SHA256","hash":"a6ee567a6387448b0140aceffae4ad1ccdd427537d6926716c3f686367098d30","blockSize":4194304,"blocks":["a6ee567a6387448b0140aceffae4ad1ccdd427537d6926716c3f686367098d30"]},"offset":"15807241"},"IteratorStep.js":{"size":353,"integrity":{"algorithm":"SHA256","hash":"22dbe3c1e07083538804e0bc79a4615d97ae6b49978623594f81e9ffd0ad0594","blockSize":4194304,"blocks":["22dbe3c1e07083538804e0bc79a4615d97ae6b49978623594f81e9ffd0ad0594"]},"offset":"15807734"},"IteratorValue.js":{"size":443,"integrity":{"algorithm":"SHA256","hash":"674abbe8978a08b6d6d6ae53a7c3aca04395c6a3e5d97807204fcfaf81fafd68","blockSize":4194304,"blocks":["674abbe8978a08b6d6d6ae53a7c3aca04395c6a3e5d97807204fcfaf81fafd68"]},"offset":"15808087"},"MakeDate.js":{"size":328,"integrity":{"algorithm":"SHA256","hash":"41a9b9da3ede4effd12c43e1c25851b5005623f5eb6dee707252cbe373b32ef0","blockSize":4194304,"blocks":["41a9b9da3ede4effd12c43e1c25851b5005623f5eb6dee707252cbe373b32ef0"]},"offset":"15808530"},"MakeDay.js":{"size":917,"integrity":{"algorithm":"SHA256","hash":"83e8e606e0e1ed2ad5b864a20459f8ce10aac6a653af26c12cd6cbc087da53e9","blockSize":4194304,"blocks":["83e8e606e0e1ed2ad5b864a20459f8ce10aac6a653af26c12cd6cbc087da53e9"]},"offset":"15808858"},"MakeTime.js":{"size":698,"integrity":{"algorithm":"SHA256","hash":"f91ad37ec6587e1debbe2be4f1bb86f4936df8e4649af2e33fe14023ed9f6da7","blockSize":4194304,"blocks":["f91ad37ec6587e1debbe2be4f1bb86f4936df8e4649af2e33fe14023ed9f6da7"]},"offset":"15809775"},"MinFromTime.js":{"size":396,"integrity":{"algorithm":"SHA256","hash":"88e77ac8a1b1aae30fe064057ed6699c3c3b176ec1ab0533893be6d1c7ba856a","blockSize":4194304,"blocks":["88e77ac8a1b1aae30fe064057ed6699c3c3b176ec1ab0533893be6d1c7ba856a"]},"offset":"15810473"},"MonthFromTime.js":{"size":1014,"integrity":{"algorithm":"SHA256","hash":"f7acafe967a838eb85739ec2afa8dcdc9e5c0734219559259338761a09131909","blockSize":4194304,"blocks":["f7acafe967a838eb85739ec2afa8dcdc9e5c0734219559259338761a09131909"]},"offset":"15810869"},"ObjectCreate.js":{"size":1033,"integrity":{"algorithm":"SHA256","hash":"3428357b1183afa802a5aa60b482291d6212cbb99ec01eafd7af91107e1ab4d5","blockSize":4194304,"blocks":["3428357b1183afa802a5aa60b482291d6212cbb99ec01eafd7af91107e1ab4d5"]},"offset":"15811883"},"ObjectDefineProperties.js":{"size":1508,"integrity":{"algorithm":"SHA256","hash":"672b0bda371a4710bf8e7c99cfc41eca1920c10fad584755be76cd5ac1136fa5","blockSize":4194304,"blocks":["672b0bda371a4710bf8e7c99cfc41eca1920c10fad584755be76cd5ac1136fa5"]},"offset":"15812916"},"OrdinaryCreateFromConstructor.js":{"size":808,"integrity":{"algorithm":"SHA256","hash":"0f46555a69c89ffefd354541724966d6351a0b910102aa8acc0d1c1ee7dec67a","blockSize":4194304,"blocks":["0f46555a69c89ffefd354541724966d6351a0b910102aa8acc0d1c1ee7dec67a"]},"offset":"15814424"},"OrdinaryDefineOwnProperty.js":{"size":2390,"integrity":{"algorithm":"SHA256","hash":"5aa87d94193a2cc6a19e5ef3e44a4b1e12f99ff6a0cd1755faf0f0338b0e07fd","blockSize":4194304,"blocks":["5aa87d94193a2cc6a19e5ef3e44a4b1e12f99ff6a0cd1755faf0f0338b0e07fd"]},"offset":"15815232"},"OrdinaryGetOwnProperty.js":{"size":1257,"integrity":{"algorithm":"SHA256","hash":"d4ef741d1e026235ef46accf3a1538b3510a81e35eff00e0643e0431f3c71ba8","blockSize":4194304,"blocks":["d4ef741d1e026235ef46accf3a1538b3510a81e35eff00e0643e0431f3c71ba8"]},"offset":"15817622"},"OrdinaryGetPrototypeOf.js":{"size":539,"integrity":{"algorithm":"SHA256","hash":"bf546da8b6ac3f982c55919169b2f07320b7934868dfb3b82c13f38c72b95a0d","blockSize":4194304,"blocks":["bf546da8b6ac3f982c55919169b2f07320b7934868dfb3b82c13f38c72b95a0d"]},"offset":"15818879"},"OrdinaryHasInstance.js":{"size":627,"integrity":{"algorithm":"SHA256","hash":"d36943f8261941e336b58a6d698291eef06aa4d7d44ab5fdffb7d073d50a771c","blockSize":4194304,"blocks":["d36943f8261941e336b58a6d698291eef06aa4d7d44ab5fdffb7d073d50a771c"]},"offset":"15819418"},"OrdinaryHasProperty.js":{"size":531,"integrity":{"algorithm":"SHA256","hash":"cbcf61dec7dc22444d36e89a62324453f98ccff4141e8284e5621b1fd0fbd07b","blockSize":4194304,"blocks":["cbcf61dec7dc22444d36e89a62324453f98ccff4141e8284e5621b1fd0fbd07b"]},"offset":"15820045"},"OrdinarySetPrototypeOf.js":{"size":1050,"integrity":{"algorithm":"SHA256","hash":"9f33c9e0fba4b5605ca95af4f267ed266cfe5a7ec0c5a739353a37d4b5eee5f3","blockSize":4194304,"blocks":["9f33c9e0fba4b5605ca95af4f267ed266cfe5a7ec0c5a739353a37d4b5eee5f3"]},"offset":"15820576"},"QuoteJSONString.js":{"size":1422,"integrity":{"algorithm":"SHA256","hash":"b8eb77f91a4edf4aa6841bdeab7ba2b2f748cd6548fd384759e6bee5bdf69225","blockSize":4194304,"blocks":["b8eb77f91a4edf4aa6841bdeab7ba2b2f748cd6548fd384759e6bee5bdf69225"]},"offset":"15821626"},"RegExpCreate.js":{"size":643,"integrity":{"algorithm":"SHA256","hash":"49da22ccbe85efb7620bfeb7877f2ef8678f1882ade81fcdc3f54567add7ab6b","blockSize":4194304,"blocks":["49da22ccbe85efb7620bfeb7877f2ef8678f1882ade81fcdc3f54567add7ab6b"]},"offset":"15823048"},"RegExpExec.js":{"size":887,"integrity":{"algorithm":"SHA256","hash":"32fbe5fc604aa31efc738c2b617a512114367daffa37a031a3257fe5be493bb9","blockSize":4194304,"blocks":["32fbe5fc604aa31efc738c2b617a512114367daffa37a031a3257fe5be493bb9"]},"offset":"15823691"},"RequireObjectCoercible.js":{"size":70,"integrity":{"algorithm":"SHA256","hash":"25d49a24f231f606c6d8be4760f3795c12f61bda0ac95ad8e452205f97c8e612","blockSize":4194304,"blocks":["25d49a24f231f606c6d8be4760f3795c12f61bda0ac95ad8e452205f97c8e612"]},"offset":"15824578"},"SameValue.js":{"size":307,"integrity":{"algorithm":"SHA256","hash":"e6d99ed6b4a479bed51f697cbc4693a2ff8da0d1e07b5ebf11e74b5404af2ab1","blockSize":4194304,"blocks":["e6d99ed6b4a479bed51f697cbc4693a2ff8da0d1e07b5ebf11e74b5404af2ab1"]},"offset":"15824648"},"SameValueNonNumber.js":{"size":450,"integrity":{"algorithm":"SHA256","hash":"17364939fc9a94d3215beba321f6499a30cf879af8f7bf2f42bdf54c9d7b30a6","blockSize":4194304,"blocks":["17364939fc9a94d3215beba321f6499a30cf879af8f7bf2f42bdf54c9d7b30a6"]},"offset":"15824955"},"SameValueZero.js":{"size":223,"integrity":{"algorithm":"SHA256","hash":"269684a69605b1f7ad04dfccc1519d7905271fd6ae05601a832a2ab8fb7272fc","blockSize":4194304,"blocks":["269684a69605b1f7ad04dfccc1519d7905271fd6ae05601a832a2ab8fb7272fc"]},"offset":"15825405"},"SecFromTime.js":{"size":402,"integrity":{"algorithm":"SHA256","hash":"6263c6176eafa22eadeb7bc054169fd764a3e3aab0cf637110d86110367c8a36","blockSize":4194304,"blocks":["6263c6176eafa22eadeb7bc054169fd764a3e3aab0cf637110d86110367c8a36"]},"offset":"15825628"},"Set.js":{"size":1255,"integrity":{"algorithm":"SHA256","hash":"88389d458aaae848468091535f5e8be59993020e744e998ca3058b59c1943ce8","blockSize":4194304,"blocks":["88389d458aaae848468091535f5e8be59993020e744e998ca3058b59c1943ce8"]},"offset":"15826030"},"SetFunctionName.js":{"size":1381,"integrity":{"algorithm":"SHA256","hash":"dabffc283c552e871c8bfd4a4d419e9453056b2b51a23f80f2ff6050c30b09c9","blockSize":4194304,"blocks":["dabffc283c552e871c8bfd4a4d419e9453056b2b51a23f80f2ff6050c30b09c9"]},"offset":"15827285"},"SetIntegrityLevel.js":{"size":1862,"integrity":{"algorithm":"SHA256","hash":"3c04bdc423a594ffec10244025e37e466b5878c4255a53655d445f51584b7d5e","blockSize":4194304,"blocks":["3c04bdc423a594ffec10244025e37e466b5878c4255a53655d445f51584b7d5e"]},"offset":"15828666"},"SpeciesConstructor.js":{"size":844,"integrity":{"algorithm":"SHA256","hash":"826eccbe073d3e7b806cd67e4d4ae09ede6d5ae6125480705b7bf81c2486f175","blockSize":4194304,"blocks":["826eccbe073d3e7b806cd67e4d4ae09ede6d5ae6125480705b7bf81c2486f175"]},"offset":"15830528"},"SplitMatch.js":{"size":874,"integrity":{"algorithm":"SHA256","hash":"316ced53a4420b95079c1160d67c81e52e91173360784bb3a517397420cb6d84","blockSize":4194304,"blocks":["316ced53a4420b95079c1160d67c81e52e91173360784bb3a517397420cb6d84"]},"offset":"15831372"},"StrictEqualityComparison.js":{"size":361,"integrity":{"algorithm":"SHA256","hash":"33928172f049f2f5fd7559470bb12647b7c6012b1da230e5a7e5fd8ffc1dd30e","blockSize":4194304,"blocks":["33928172f049f2f5fd7559470bb12647b7c6012b1da230e5a7e5fd8ffc1dd30e"]},"offset":"15832246"},"StringCreate.js":{"size":1117,"integrity":{"algorithm":"SHA256","hash":"18a70a9279026ea03b811f95a797cde8caf8d77a010880506e0f0b4532a1181d","blockSize":4194304,"blocks":["18a70a9279026ea03b811f95a797cde8caf8d77a010880506e0f0b4532a1181d"]},"offset":"15832607"},"SymbolDescriptiveString.js":{"size":526,"integrity":{"algorithm":"SHA256","hash":"d5a4e603be41ed5dff7123a6a0ba29efae0812f4d076a78387520b36b416a37d","blockSize":4194304,"blocks":["d5a4e603be41ed5dff7123a6a0ba29efae0812f4d076a78387520b36b416a37d"]},"offset":"15833724"},"TestIntegrityLevel.js":{"size":1285,"integrity":{"algorithm":"SHA256","hash":"8a0161ac60421c4762bc9e442224da95614cdb3e9865bcd79ad29d2310dd35c6","blockSize":4194304,"blocks":["8a0161ac60421c4762bc9e442224da95614cdb3e9865bcd79ad29d2310dd35c6"]},"offset":"15834250"},"TimeClip.js":{"size":468,"integrity":{"algorithm":"SHA256","hash":"bf1f153b35126ac0ebd122717e6349c97e932e3665ff1947f5f4a7da4895cb48","blockSize":4194304,"blocks":["bf1f153b35126ac0ebd122717e6349c97e932e3665ff1947f5f4a7da4895cb48"]},"offset":"15835535"},"TimeFromYear.js":{"size":261,"integrity":{"algorithm":"SHA256","hash":"07bd801ef44bcc4c5458937d6b3c09b1ba6f30d24fbb06ca9b4818c0699c330b","blockSize":4194304,"blocks":["07bd801ef44bcc4c5458937d6b3c09b1ba6f30d24fbb06ca9b4818c0699c330b"]},"offset":"15836003"},"TimeWithinDay.js":{"size":247,"integrity":{"algorithm":"SHA256","hash":"c83b563c9849ca65fb1ed7235f72f42a019fde9e67aad81d1bd0699ed28f43f8","blockSize":4194304,"blocks":["c83b563c9849ca65fb1ed7235f72f42a019fde9e67aad81d1bd0699ed28f43f8"]},"offset":"15836264"},"ToBoolean.js":{"size":130,"integrity":{"algorithm":"SHA256","hash":"36a4823341bd4ec68dd6f4b32afbbc939330a48bf7042108c9be89eaaab5bbc6","blockSize":4194304,"blocks":["36a4823341bd4ec68dd6f4b32afbbc939330a48bf7042108c9be89eaaab5bbc6"]},"offset":"15836511"},"ToDateString.js":{"size":498,"integrity":{"algorithm":"SHA256","hash":"57a5e2f02146ccfa64217595a7b5024fd7a74d9847a5d7df98f6cdaa04335612","blockSize":4194304,"blocks":["57a5e2f02146ccfa64217595a7b5024fd7a74d9847a5d7df98f6cdaa04335612"]},"offset":"15836641"},"ToInt16.js":{"size":260,"integrity":{"algorithm":"SHA256","hash":"ad0dcb3339d64526564c10379cc026a2f595f9ed7642199104eb0c0ffebccc35","blockSize":4194304,"blocks":["ad0dcb3339d64526564c10379cc026a2f595f9ed7642199104eb0c0ffebccc35"]},"offset":"15837139"},"ToInt32.js":{"size":173,"integrity":{"algorithm":"SHA256","hash":"e0c77696079335a016ce39e9992f11939ad25c1b322d119eedbec24a989a50a6","blockSize":4194304,"blocks":["e0c77696079335a016ce39e9992f11939ad25c1b322d119eedbec24a989a50a6"]},"offset":"15837399"},"ToInt8.js":{"size":247,"integrity":{"algorithm":"SHA256","hash":"0f844398064a22ca49a1c263a564e15449de26b5114281211d3de3535d914336","blockSize":4194304,"blocks":["0f844398064a22ca49a1c263a564e15449de26b5114281211d3de3535d914336"]},"offset":"15837572"},"ToInteger.js":{"size":273,"integrity":{"algorithm":"SHA256","hash":"b07f58c5193a820640f1169bdf1a38dee1c1eb863d5874294d9afa5438bdb274","blockSize":4194304,"blocks":["b07f58c5193a820640f1169bdf1a38dee1c1eb863d5874294d9afa5438bdb274"]},"offset":"15837819"},"ToLength.js":{"size":332,"integrity":{"algorithm":"SHA256","hash":"b4faf0dcbfc133417e965670ef8bf4071f0c323400c32f5cc528a3bc957e8fe5","blockSize":4194304,"blocks":["b4faf0dcbfc133417e965670ef8bf4071f0c323400c32f5cc528a3bc957e8fe5"]},"offset":"15838092"},"ToNumber.js":{"size":2015,"integrity":{"algorithm":"SHA256","hash":"e0eac78353a093abb2717666f27ebebc1a9e48caa98950b7fb4cf9dadde4ab7c","blockSize":4194304,"blocks":["e0eac78353a093abb2717666f27ebebc1a9e48caa98950b7fb4cf9dadde4ab7c"]},"offset":"15838424"},"ToObject.js":{"size":334,"integrity":{"algorithm":"SHA256","hash":"2c382673870deb89e3b19511d8f08fa9554d103fa9d143e5a57b79d85a093725","blockSize":4194304,"blocks":["2c382673870deb89e3b19511d8f08fa9554d103fa9d143e5a57b79d85a093725"]},"offset":"15840439"},"ToPrimitive.js":{"size":287,"integrity":{"algorithm":"SHA256","hash":"fe27d95fe99afd38d780e7d88f349e1dc1a68841b845e118abb8c80c4ab9aa53","blockSize":4194304,"blocks":["fe27d95fe99afd38d780e7d88f349e1dc1a68841b845e118abb8c80c4ab9aa53"]},"offset":"15840773"},"ToPropertyDescriptor.js":{"size":1452,"integrity":{"algorithm":"SHA256","hash":"78b5dfba0830bc47aa55c1b33f2be8fd973ff5ccc87a599abadda676d3596c49","blockSize":4194304,"blocks":["78b5dfba0830bc47aa55c1b33f2be8fd973ff5ccc87a599abadda676d3596c49"]},"offset":"15841060"},"ToPropertyKey.js":{"size":405,"integrity":{"algorithm":"SHA256","hash":"58d4355f4509a456b237e1d72169200edb1810d1efa9ee167ac26faa7904edd3","blockSize":4194304,"blocks":["58d4355f4509a456b237e1d72169200edb1810d1efa9ee167ac26faa7904edd3"]},"offset":"15842512"},"ToString.js":{"size":396,"integrity":{"algorithm":"SHA256","hash":"79c26e024582b6ac70a965063b757c70ceea15fa8da17a78ebbf77b40ccaece3","blockSize":4194304,"blocks":["79c26e024582b6ac70a965063b757c70ceea15fa8da17a78ebbf77b40ccaece3"]},"offset":"15842917"},"ToUint16.js":{"size":564,"integrity":{"algorithm":"SHA256","hash":"5775f0384586a383c5dd6c359e37d4b218c8ddf069d7a2906f7e4752ab66a20d","blockSize":4194304,"blocks":["5775f0384586a383c5dd6c359e37d4b218c8ddf069d7a2906f7e4752ab66a20d"]},"offset":"15843313"},"ToUint32.js":{"size":175,"integrity":{"algorithm":"SHA256","hash":"b68209f8fb9d1e978fe3d162251bba47f056c43ec7028cbd99b485800bd62315","blockSize":4194304,"blocks":["b68209f8fb9d1e978fe3d162251bba47f056c43ec7028cbd99b485800bd62315"]},"offset":"15843877"},"ToUint8.js":{"size":578,"integrity":{"algorithm":"SHA256","hash":"94fa392bda40d5d6c1125b662b304a372b135660d3740eebae7ade568bdd52a9","blockSize":4194304,"blocks":["94fa392bda40d5d6c1125b662b304a372b135660d3740eebae7ade568bdd52a9"]},"offset":"15844052"},"ToUint8Clamp.js":{"size":522,"integrity":{"algorithm":"SHA256","hash":"30dd3065a73ef4ff1f0a018ce80bd550673e5ee29c732e6fc8cade4661f80d56","blockSize":4194304,"blocks":["30dd3065a73ef4ff1f0a018ce80bd550673e5ee29c732e6fc8cade4661f80d56"]},"offset":"15844630"},"Type.js":{"size":249,"integrity":{"algorithm":"SHA256","hash":"a9812c431dc51253d8d3bd637842b22534f87a1f1006d2266c824488d068305d","blockSize":4194304,"blocks":["a9812c431dc51253d8d3bd637842b22534f87a1f1006d2266c824488d068305d"]},"offset":"15845152"},"UTF16Decode.js":{"size":823,"integrity":{"algorithm":"SHA256","hash":"66b054809f1121de679d732a62bfa5c258806147b7fa6ed473a4ce5f56b70e61","blockSize":4194304,"blocks":["66b054809f1121de679d732a62bfa5c258806147b7fa6ed473a4ce5f56b70e61"]},"offset":"15845401"},"UTF16Encoding.js":{"size":700,"integrity":{"algorithm":"SHA256","hash":"4a84fe0de13660a11bc7f0e2ccdb5611e6767e0f40b20a16c335db7316cf369f","blockSize":4194304,"blocks":["4a84fe0de13660a11bc7f0e2ccdb5611e6767e0f40b20a16c335db7316cf369f"]},"offset":"15846224"},"ValidateAndApplyPropertyDescriptor.js":{"size":5243,"integrity":{"algorithm":"SHA256","hash":"588f81f21e07a8d2255bc0aed34c94052aa74d5b558edc4435d0acee12c90554","blockSize":4194304,"blocks":["588f81f21e07a8d2255bc0aed34c94052aa74d5b558edc4435d0acee12c90554"]},"offset":"15846924"},"WeekDay.js":{"size":208,"integrity":{"algorithm":"SHA256","hash":"f7cc798c72dcc484295681d29d535e64215a9ec303f4f6e6456ea63e83ce0246","blockSize":4194304,"blocks":["f7cc798c72dcc484295681d29d535e64215a9ec303f4f6e6456ea63e83ce0246"]},"offset":"15852167"},"YearFromTime.js":{"size":407,"integrity":{"algorithm":"SHA256","hash":"5562b7fd6be438187a1187a331f0d310e631e9747df14521accc7a797e2a2aa7","blockSize":4194304,"blocks":["5562b7fd6be438187a1187a331f0d310e631e9747df14521accc7a797e2a2aa7"]},"offset":"15852375"},"abs.js":{"size":207,"integrity":{"algorithm":"SHA256","hash":"a50e248c29238747c3c278a4edf2c0643f1295d1c065d9dff8524def17f0427f","blockSize":4194304,"blocks":["a50e248c29238747c3c278a4edf2c0643f1295d1c065d9dff8524def17f0427f"]},"offset":"15852782"},"floor.js":{"size":217,"integrity":{"algorithm":"SHA256","hash":"90c20830ae8762224c83fb0ed36a288a7d567f57d3b5acb469590cc2d5e13f55","blockSize":4194304,"blocks":["90c20830ae8762224c83fb0ed36a288a7d567f57d3b5acb469590cc2d5e13f55"]},"offset":"15852989"},"modulo.js":{"size":168,"integrity":{"algorithm":"SHA256","hash":"84923b64427edcc840ee9a305dca213f4bf1e04ed8f88f6bfd7bfa9e655d7c98","blockSize":4194304,"blocks":["84923b64427edcc840ee9a305dca213f4bf1e04ed8f88f6bfd7bfa9e655d7c98"]},"offset":"15853206"},"msFromTime.js":{"size":253,"integrity":{"algorithm":"SHA256","hash":"ef13a7e7721d695f125a7e772f8037ed34aa3c97aaa3692da900c6796cd270da","blockSize":4194304,"blocks":["ef13a7e7721d695f125a7e772f8037ed34aa3c97aaa3692da900c6796cd270da"]},"offset":"15853374"},"thisBooleanValue.js":{"size":367,"integrity":{"algorithm":"SHA256","hash":"171bd884e07701d9e37bece81b05a95fd7d822ff7eaaba5c112d6e3a352ad498","blockSize":4194304,"blocks":["171bd884e07701d9e37bece81b05a95fd7d822ff7eaaba5c112d6e3a352ad498"]},"offset":"15853627"},"thisNumberValue.js":{"size":390,"integrity":{"algorithm":"SHA256","hash":"a3bb9eb733e74de8a50f49e4425e57fd01bebbf66df4f9967da3d9edee589455","blockSize":4194304,"blocks":["a3bb9eb733e74de8a50f49e4425e57fd01bebbf66df4f9967da3d9edee589455"]},"offset":"15853994"},"thisStringValue.js":{"size":361,"integrity":{"algorithm":"SHA256","hash":"47305af763f963ab1c547011b6be408827678d61540009de579bf996d0810ff5","blockSize":4194304,"blocks":["47305af763f963ab1c547011b6be408827678d61540009de579bf996d0810ff5"]},"offset":"15854384"},"thisTimeValue.js":{"size":267,"integrity":{"algorithm":"SHA256","hash":"4530f2d9e41738da88d10de84862a02fa1b34d5a704206d8deb5a151f26a87b8","blockSize":4194304,"blocks":["4530f2d9e41738da88d10de84862a02fa1b34d5a704206d8deb5a151f26a87b8"]},"offset":"15854745"}}},"2017":{"files":{"AbstractEqualityComparison.js":{"size":1154,"integrity":{"algorithm":"SHA256","hash":"b95b9c6c6a99532fe37e1d0fa948bbe700ecc013b045034afb1a5db6a39026db","blockSize":4194304,"blocks":["b95b9c6c6a99532fe37e1d0fa948bbe700ecc013b045034afb1a5db6a39026db"]},"offset":"15666158"},"AbstractRelationalComparison.js":{"size":1590,"integrity":{"algorithm":"SHA256","hash":"0246b938fe11124d2c1f58f39636646b85f5415edf3f25aaf24e1b35abbd6ef5","blockSize":4194304,"blocks":["0246b938fe11124d2c1f58f39636646b85f5415edf3f25aaf24e1b35abbd6ef5"]},"offset":"15667312"},"AdvanceStringIndex.js":{"size":1305,"integrity":{"algorithm":"SHA256","hash":"021f64d34615e95873eab825aa0353ee281db9bb6d1d7436fb77a45f9cd9a296","blockSize":4194304,"blocks":["021f64d34615e95873eab825aa0353ee281db9bb6d1d7436fb77a45f9cd9a296"]},"offset":"15668902"},"ArrayCreate.js":{"size":1650,"integrity":{"algorithm":"SHA256","hash":"6cde465e8db30b2ba485412ac2912f04a6212b3effdd37d0f3a9894af999ba9b","blockSize":4194304,"blocks":["6cde465e8db30b2ba485412ac2912f04a6212b3effdd37d0f3a9894af999ba9b"]},"offset":"15670207"},"ArraySetLength.js":{"size":2665,"integrity":{"algorithm":"SHA256","hash":"4b07de7693377557e2f05bf21ea871ff235ce1121e0e95846f5639fa5cc3ebb1","blockSize":4194304,"blocks":["4b07de7693377557e2f05bf21ea871ff235ce1121e0e95846f5639fa5cc3ebb1"]},"offset":"15671857"},"ArraySpeciesCreate.js":{"size":1348,"integrity":{"algorithm":"SHA256","hash":"246aed3dfe50be7dcbd5b25934dd6c74bff25b66de39dcc70335e6d668cc480b","blockSize":4194304,"blocks":["246aed3dfe50be7dcbd5b25934dd6c74bff25b66de39dcc70335e6d668cc480b"]},"offset":"15674522"},"Call.js":{"size":623,"integrity":{"algorithm":"SHA256","hash":"b092006d05bceeccee48bdf3fde9d83ee54a156eb2841bf5cacdca9f157b4571","blockSize":4194304,"blocks":["b092006d05bceeccee48bdf3fde9d83ee54a156eb2841bf5cacdca9f157b4571"]},"offset":"15675870"},"CanonicalNumericIndexString.js":{"size":654,"integrity":{"algorithm":"SHA256","hash":"c850cc1637b82f4fc238d2ae1a45229e8d44bc5c9b85205c0f27a1e0e9bb9d2b","blockSize":4194304,"blocks":["c850cc1637b82f4fc238d2ae1a45229e8d44bc5c9b85205c0f27a1e0e9bb9d2b"]},"offset":"15676493"},"CharacterRange.js":{"size":782,"integrity":{"algorithm":"SHA256","hash":"49612101e544a9b707f116ac8fe2be0d2c559c1d3b4f94ba47f36832913ea11f","blockSize":4194304,"blocks":["49612101e544a9b707f116ac8fe2be0d2c559c1d3b4f94ba47f36832913ea11f"]},"offset":"15677147"},"CompletePropertyDescriptor.js":{"size":989,"integrity":{"algorithm":"SHA256","hash":"17825d14da6797c52aa699d7b089bc2370d5a899cb7af7e3485f948fde50fca2","blockSize":4194304,"blocks":["17825d14da6797c52aa699d7b089bc2370d5a899cb7af7e3485f948fde50fca2"]},"offset":"15677929"},"CreateDataProperty.js":{"size":1279,"integrity":{"algorithm":"SHA256","hash":"5006509a3f5567f81cb7f730448a0a492c64c7f06406627c58d0334dde5e44f9","blockSize":4194304,"blocks":["5006509a3f5567f81cb7f730448a0a492c64c7f06406627c58d0334dde5e44f9"]},"offset":"15678918"},"CreateDataPropertyOrThrow.js":{"size":734,"integrity":{"algorithm":"SHA256","hash":"50c61c792c27d661346cfb29fe5b7603a2713d7acb1dc5b3b35fe71ece8fd18e","blockSize":4194304,"blocks":["50c61c792c27d661346cfb29fe5b7603a2713d7acb1dc5b3b35fe71ece8fd18e"]},"offset":"15680197"},"CreateHTML.js":{"size":927,"integrity":{"algorithm":"SHA256","hash":"5b9cf63f6b4bc50077e333c2b310cbd4c85a97891b2e1d28a93aeeb4370c2930","blockSize":4194304,"blocks":["5b9cf63f6b4bc50077e333c2b310cbd4c85a97891b2e1d28a93aeeb4370c2930"]},"offset":"15680931"},"CreateIterResultObject.js":{"size":432,"integrity":{"algorithm":"SHA256","hash":"289a26996866dba6f6292ba0931e643c7a5851f21003d41e5a004862a03a2035","blockSize":4194304,"blocks":["289a26996866dba6f6292ba0931e643c7a5851f21003d41e5a004862a03a2035"]},"offset":"15681858"},"CreateListFromArrayLike.js":{"size":1354,"integrity":{"algorithm":"SHA256","hash":"59bff81b54528dca9de105511851d1af4ee78c476453991e93ddde3b29e0a0ff","blockSize":4194304,"blocks":["59bff81b54528dca9de105511851d1af4ee78c476453991e93ddde3b29e0a0ff"]},"offset":"15682290"},"CreateMethodProperty.js":{"size":979,"integrity":{"algorithm":"SHA256","hash":"117c68b2fa6825c31e8d6f4970973fddf09fd74506447ca22ed3cfc2ed8b04e8","blockSize":4194304,"blocks":["117c68b2fa6825c31e8d6f4970973fddf09fd74506447ca22ed3cfc2ed8b04e8"]},"offset":"15683644"},"DateFromTime.js":{"size":1036,"integrity":{"algorithm":"SHA256","hash":"ae437cb5ee92b162e18b6f47b9dd66b66f627547e098a0670d60c2572f04b1ed","blockSize":4194304,"blocks":["ae437cb5ee92b162e18b6f47b9dd66b66f627547e098a0670d60c2572f04b1ed"]},"offset":"15684623"},"Day.js":{"size":234,"integrity":{"algorithm":"SHA256","hash":"ff3875a46c34886cff3808ab1c4de6d3b45a61e9638b32edd22f41277c153ea5","blockSize":4194304,"blocks":["ff3875a46c34886cff3808ab1c4de6d3b45a61e9638b32edd22f41277c153ea5"]},"offset":"15685659"},"DayFromYear.js":{"size":256,"integrity":{"algorithm":"SHA256","hash":"378eb638143e86cfa3061177986dcfdb6bdec76e8b799b95cf3b9cafc5e9af68","blockSize":4194304,"blocks":["378eb638143e86cfa3061177986dcfdb6bdec76e8b799b95cf3b9cafc5e9af68"]},"offset":"15685893"},"DayWithinYear.js":{"size":286,"integrity":{"algorithm":"SHA256","hash":"b1ac5824fb1ced3e9d2dae99db5bd3890b4ef25dc45e50a4f927384bb5be618e","blockSize":4194304,"blocks":["b1ac5824fb1ced3e9d2dae99db5bd3890b4ef25dc45e50a4f927384bb5be618e"]},"offset":"15686149"},"DaysInYear.js":{"size":301,"integrity":{"algorithm":"SHA256","hash":"3f5955b3d1831ed2d008ae052a802b12c22bf1ba6d8fd286e0cb7a6a77144aec","blockSize":4194304,"blocks":["3f5955b3d1831ed2d008ae052a802b12c22bf1ba6d8fd286e0cb7a6a77144aec"]},"offset":"15686435"},"DefinePropertyOrThrow.js":{"size":1466,"integrity":{"algorithm":"SHA256","hash":"1964ecd5b9e64b3ddb203ac7da3410e09a2b1d0ab9b1f06733af8ea15ae954a4","blockSize":4194304,"blocks":["1964ecd5b9e64b3ddb203ac7da3410e09a2b1d0ab9b1f06733af8ea15ae954a4"]},"offset":"15686736"},"DeletePropertyOrThrow.js":{"size":699,"integrity":{"algorithm":"SHA256","hash":"3c1ac659ec4eb7ad97e99c2c3d08c2058624eec2ac0bcca0583660a0fe69f1c5","blockSize":4194304,"blocks":["3c1ac659ec4eb7ad97e99c2c3d08c2058624eec2ac0bcca0583660a0fe69f1c5"]},"offset":"15688202"},"EnumerableOwnProperties.js":{"size":1109,"integrity":{"algorithm":"SHA256","hash":"228832a58121375bf3eb58ad348dae278ab64405f4af5a218c4c2b0d96b69e39","blockSize":4194304,"blocks":["228832a58121375bf3eb58ad348dae278ab64405f4af5a218c4c2b0d96b69e39"]},"offset":"15688901"},"FromPropertyDescriptor.js":{"size":450,"integrity":{"algorithm":"SHA256","hash":"a16798c55be7b402fc2b27d4d422f322c40639b7403d47cb897b576fcc1ddd49","blockSize":4194304,"blocks":["a16798c55be7b402fc2b27d4d422f322c40639b7403d47cb897b576fcc1ddd49"]},"offset":"15690010"},"Get.js":{"size":602,"integrity":{"algorithm":"SHA256","hash":"ef9a4a39b94f3287d0c9ed27b9a5f1cb71164d2184d6aaf2fc5900fd44016ff9","blockSize":4194304,"blocks":["ef9a4a39b94f3287d0c9ed27b9a5f1cb71164d2184d6aaf2fc5900fd44016ff9"]},"offset":"15690460"},"GetIterator.js":{"size":856,"integrity":{"algorithm":"SHA256","hash":"6fd952f51c6137a0ef8aab1074a42011584da628da9360176b107dcf91979355","blockSize":4194304,"blocks":["6fd952f51c6137a0ef8aab1074a42011584da628da9360176b107dcf91979355"]},"offset":"15691062"},"GetMethod.js":{"size":663,"integrity":{"algorithm":"SHA256","hash":"87f8829531af6b2019ed31d44f2efcf89e8bf345c158ad6bd790f8e14028d325","blockSize":4194304,"blocks":["87f8829531af6b2019ed31d44f2efcf89e8bf345c158ad6bd790f8e14028d325"]},"offset":"15691918"},"GetOwnPropertyKeys.js":{"size":829,"integrity":{"algorithm":"SHA256","hash":"7ad04a3a175ede6b7d15611717a20c2bc6a09bef382f8b4f7d985e5b2e1e7120","blockSize":4194304,"blocks":["7ad04a3a175ede6b7d15611717a20c2bc6a09bef382f8b4f7d985e5b2e1e7120"]},"offset":"15692581"},"GetPrototypeFromConstructor.js":{"size":921,"integrity":{"algorithm":"SHA256","hash":"da1c30c8d5b331e72618af4ccc18b5f3ed89b36e9be117c74a4ee9266141ba56","blockSize":4194304,"blocks":["da1c30c8d5b331e72618af4ccc18b5f3ed89b36e9be117c74a4ee9266141ba56"]},"offset":"15693410"},"GetSubstitution.js":{"size":3523,"integrity":{"algorithm":"SHA256","hash":"550b5f32a640bf6a8e30b3729e21a25c6cbfd62ee4d8d90abf671ad20c7a368a","blockSize":4194304,"blocks":["550b5f32a640bf6a8e30b3729e21a25c6cbfd62ee4d8d90abf671ad20c7a368a"]},"offset":"15694331"},"GetV.js":{"size":474,"integrity":{"algorithm":"SHA256","hash":"66909f7192a6bddc6fb77163f6182164ebef641f0f4c595835485eda6cfd3443","blockSize":4194304,"blocks":["66909f7192a6bddc6fb77163f6182164ebef641f0f4c595835485eda6cfd3443"]},"offset":"15697854"},"HasOwnProperty.js":{"size":553,"integrity":{"algorithm":"SHA256","hash":"b099b2f9829fe64e25740771abc3d3c4e1c801ce0cd2ccecf6041ad08d59364d","blockSize":4194304,"blocks":["b099b2f9829fe64e25740771abc3d3c4e1c801ce0cd2ccecf6041ad08d59364d"]},"offset":"15698328"},"HasProperty.js":{"size":517,"integrity":{"algorithm":"SHA256","hash":"7889a3e2b191509b3d6c0bfcabbad2a915919a2caa275b696a12eab4ebd9cdac","blockSize":4194304,"blocks":["7889a3e2b191509b3d6c0bfcabbad2a915919a2caa275b696a12eab4ebd9cdac"]},"offset":"15698881"},"HourFromTime.js":{"size":382,"integrity":{"algorithm":"SHA256","hash":"338503d8b54967fb22e0659243cab7fc283f023561a8a3316df8b4de588bddf9","blockSize":4194304,"blocks":["338503d8b54967fb22e0659243cab7fc283f023561a8a3316df8b4de588bddf9"]},"offset":"15699398"},"InLeapYear.js":{"size":510,"integrity":{"algorithm":"SHA256","hash":"d9abbf0c4b80df1fd7cb31830f222eb4b6bbe638dcfa3461809905158f2ce0a6","blockSize":4194304,"blocks":["d9abbf0c4b80df1fd7cb31830f222eb4b6bbe638dcfa3461809905158f2ce0a6"]},"offset":"15699780"},"InstanceofOperator.js":{"size":918,"integrity":{"algorithm":"SHA256","hash":"af702715d893f635ff66441f9638a4dc977789c505a50ae17f7e02b05b2549d6","blockSize":4194304,"blocks":["af702715d893f635ff66441f9638a4dc977789c505a50ae17f7e02b05b2549d6"]},"offset":"15700290"},"Invoke.js":{"size":715,"integrity":{"algorithm":"SHA256","hash":"ff016550d8adf9608b2f4ab258017c1582ce717a2e2b3bd2b7a94440f7f19f8f","blockSize":4194304,"blocks":["ff016550d8adf9608b2f4ab258017c1582ce717a2e2b3bd2b7a94440f7f19f8f"]},"offset":"15701208"},"IsAccessorDescriptor.js":{"size":465,"integrity":{"algorithm":"SHA256","hash":"425c74a892b6bb2d1dc6c56e7a6e77e40b9c4d4390480fafe4c804cea53a80ad","blockSize":4194304,"blocks":["425c74a892b6bb2d1dc6c56e7a6e77e40b9c4d4390480fafe4c804cea53a80ad"]},"offset":"15701923"},"IsArray.js":{"size":123,"integrity":{"algorithm":"SHA256","hash":"a8f01a797e05a74501ceb9293408f72bded2a08013c6a075f582737003b443f4","blockSize":4194304,"blocks":["a8f01a797e05a74501ceb9293408f72bded2a08013c6a075f582737003b443f4"]},"offset":"15702388"},"IsCallable.js":{"size":108,"integrity":{"algorithm":"SHA256","hash":"789ba0a1f176c56862f16b2ff7bc3eeaaa02676f75be073a46c92c5e8af21170","blockSize":4194304,"blocks":["789ba0a1f176c56862f16b2ff7bc3eeaaa02676f75be073a46c92c5e8af21170"]},"offset":"15702511"},"IsCompatiblePropertyDescriptor.js":{"size":367,"integrity":{"algorithm":"SHA256","hash":"f9736fde486f1f27112126908c39423b2b3b946a96d5e2a4d762b3139da17543","blockSize":4194304,"blocks":["f9736fde486f1f27112126908c39423b2b3b946a96d5e2a4d762b3139da17543"]},"offset":"15702619"},"IsConcatSpreadable.js":{"size":626,"integrity":{"algorithm":"SHA256","hash":"7a4c3cae4f5de1b8cbc5694ac320cfaaf30f4ecbe2754e2ffb3f72fb42763a8a","blockSize":4194304,"blocks":["7a4c3cae4f5de1b8cbc5694ac320cfaaf30f4ecbe2754e2ffb3f72fb42763a8a"]},"offset":"15702986"},"IsConstructor.js":{"size":1149,"integrity":{"algorithm":"SHA256","hash":"1a58d54e8aec9ecbfaf3e75d9b38ef06c8a3c948e337cca159a17a102ee41929","blockSize":4194304,"blocks":["1a58d54e8aec9ecbfaf3e75d9b38ef06c8a3c948e337cca159a17a102ee41929"]},"offset":"15703612"},"IsDataDescriptor.js":{"size":464,"integrity":{"algorithm":"SHA256","hash":"35a0862d76e9d765d5fa4154250ed5ac440f4238432a773f22c288da3886e1ce","blockSize":4194304,"blocks":["35a0862d76e9d765d5fa4154250ed5ac440f4238432a773f22c288da3886e1ce"]},"offset":"15704761"},"IsExtensible.js":{"size":509,"integrity":{"algorithm":"SHA256","hash":"e28d0530ae66f0dfb8fa90c492fd6242a44ea7eff298d1ed4c10eac9fdfc8efb","blockSize":4194304,"blocks":["e28d0530ae66f0dfb8fa90c492fd6242a44ea7eff298d1ed4c10eac9fdfc8efb"]},"offset":"15705225"},"IsGenericDescriptor.js":{"size":560,"integrity":{"algorithm":"SHA256","hash":"b9d31ec0ad5beaea6a7d9f1180d67ef8f45b164234deeee14c362c8eb2e135cc","blockSize":4194304,"blocks":["b9d31ec0ad5beaea6a7d9f1180d67ef8f45b164234deeee14c362c8eb2e135cc"]},"offset":"15705734"},"IsInteger.js":{"size":450,"integrity":{"algorithm":"SHA256","hash":"84893768eabe51d4073d48aeb5cf43cfdba3a1c6223da13b0a73f802033ff6e2","blockSize":4194304,"blocks":["84893768eabe51d4073d48aeb5cf43cfdba3a1c6223da13b0a73f802033ff6e2"]},"offset":"15706294"},"IsPromise.js":{"size":485,"integrity":{"algorithm":"SHA256","hash":"9f4e5aef10bca5119fab546b4834e48b776d14a775f55524cd3512c4321a1e7c","blockSize":4194304,"blocks":["9f4e5aef10bca5119fab546b4834e48b776d14a775f55524cd3512c4321a1e7c"]},"offset":"15706744"},"IsPropertyDescriptor.js":{"size":554,"integrity":{"algorithm":"SHA256","hash":"3caa7b0fa1648606559ae342c40c084209c34d7bc43416cc58256689f3ddcc55","blockSize":4194304,"blocks":["3caa7b0fa1648606559ae342c40c084209c34d7bc43416cc58256689f3ddcc55"]},"offset":"15707229"},"IsPropertyKey.js":{"size":207,"integrity":{"algorithm":"SHA256","hash":"577d849187a0e8ef526a6368eb6757f6a128db792cf9ade6dfc6c82a75d155c3","blockSize":4194304,"blocks":["577d849187a0e8ef526a6368eb6757f6a128db792cf9ade6dfc6c82a75d155c3"]},"offset":"15707783"},"IsRegExp.js":{"size":545,"integrity":{"algorithm":"SHA256","hash":"1183cff5c42c2cf9a0b3fbb62d4a7f842b56c1141209c683f0116715bcf03c15","blockSize":4194304,"blocks":["1183cff5c42c2cf9a0b3fbb62d4a7f842b56c1141209c683f0116715bcf03c15"]},"offset":"15707990"},"IsSharedArrayBuffer.js":{"size":461,"integrity":{"algorithm":"SHA256","hash":"9451dbf3ee8a39a73e3e2315f48495288b29521576f0539d18c56fc4b6d85012","blockSize":4194304,"blocks":["9451dbf3ee8a39a73e3e2315f48495288b29521576f0539d18c56fc4b6d85012"]},"offset":"15708535"},"IterableToList.js":{"size":619,"integrity":{"algorithm":"SHA256","hash":"f422d72db0996e2cb6f6845736ea1ea2198d8a9111d79393c12d89bcb50b1876","blockSize":4194304,"blocks":["f422d72db0996e2cb6f6845736ea1ea2198d8a9111d79393c12d89bcb50b1876"]},"offset":"15708996"},"IteratorClose.js":{"size":1481,"integrity":{"algorithm":"SHA256","hash":"52b100a8cc0ecb7b5d5c7346e20d23c7503c832525650b3269f40f6b98948cae","blockSize":4194304,"blocks":["52b100a8cc0ecb7b5d5c7346e20d23c7503c832525650b3269f40f6b98948cae"]},"offset":"15709615"},"IteratorComplete.js":{"size":498,"integrity":{"algorithm":"SHA256","hash":"41ad3ddb0114bfd56e3e67508633496d4ae672eeb47767f12ae0dacdd91d39b5","blockSize":4194304,"blocks":["41ad3ddb0114bfd56e3e67508633496d4ae672eeb47767f12ae0dacdd91d39b5"]},"offset":"15711096"},"IteratorNext.js":{"size":493,"integrity":{"algorithm":"SHA256","hash":"a6ee567a6387448b0140aceffae4ad1ccdd427537d6926716c3f686367098d30","blockSize":4194304,"blocks":["a6ee567a6387448b0140aceffae4ad1ccdd427537d6926716c3f686367098d30"]},"offset":"15711594"},"IteratorStep.js":{"size":353,"integrity":{"algorithm":"SHA256","hash":"22dbe3c1e07083538804e0bc79a4615d97ae6b49978623594f81e9ffd0ad0594","blockSize":4194304,"blocks":["22dbe3c1e07083538804e0bc79a4615d97ae6b49978623594f81e9ffd0ad0594"]},"offset":"15712087"},"IteratorValue.js":{"size":443,"integrity":{"algorithm":"SHA256","hash":"674abbe8978a08b6d6d6ae53a7c3aca04395c6a3e5d97807204fcfaf81fafd68","blockSize":4194304,"blocks":["674abbe8978a08b6d6d6ae53a7c3aca04395c6a3e5d97807204fcfaf81fafd68"]},"offset":"15712440"},"MakeDate.js":{"size":328,"integrity":{"algorithm":"SHA256","hash":"41a9b9da3ede4effd12c43e1c25851b5005623f5eb6dee707252cbe373b32ef0","blockSize":4194304,"blocks":["41a9b9da3ede4effd12c43e1c25851b5005623f5eb6dee707252cbe373b32ef0"]},"offset":"15712883"},"MakeDay.js":{"size":917,"integrity":{"algorithm":"SHA256","hash":"83e8e606e0e1ed2ad5b864a20459f8ce10aac6a653af26c12cd6cbc087da53e9","blockSize":4194304,"blocks":["83e8e606e0e1ed2ad5b864a20459f8ce10aac6a653af26c12cd6cbc087da53e9"]},"offset":"15713211"},"MakeTime.js":{"size":698,"integrity":{"algorithm":"SHA256","hash":"f91ad37ec6587e1debbe2be4f1bb86f4936df8e4649af2e33fe14023ed9f6da7","blockSize":4194304,"blocks":["f91ad37ec6587e1debbe2be4f1bb86f4936df8e4649af2e33fe14023ed9f6da7"]},"offset":"15714128"},"MinFromTime.js":{"size":396,"integrity":{"algorithm":"SHA256","hash":"88e77ac8a1b1aae30fe064057ed6699c3c3b176ec1ab0533893be6d1c7ba856a","blockSize":4194304,"blocks":["88e77ac8a1b1aae30fe064057ed6699c3c3b176ec1ab0533893be6d1c7ba856a"]},"offset":"15714826"},"MonthFromTime.js":{"size":1014,"integrity":{"algorithm":"SHA256","hash":"f7acafe967a838eb85739ec2afa8dcdc9e5c0734219559259338761a09131909","blockSize":4194304,"blocks":["f7acafe967a838eb85739ec2afa8dcdc9e5c0734219559259338761a09131909"]},"offset":"15715222"},"ObjectCreate.js":{"size":1033,"integrity":{"algorithm":"SHA256","hash":"3428357b1183afa802a5aa60b482291d6212cbb99ec01eafd7af91107e1ab4d5","blockSize":4194304,"blocks":["3428357b1183afa802a5aa60b482291d6212cbb99ec01eafd7af91107e1ab4d5"]},"offset":"15716236"},"ObjectDefineProperties.js":{"size":1508,"integrity":{"algorithm":"SHA256","hash":"672b0bda371a4710bf8e7c99cfc41eca1920c10fad584755be76cd5ac1136fa5","blockSize":4194304,"blocks":["672b0bda371a4710bf8e7c99cfc41eca1920c10fad584755be76cd5ac1136fa5"]},"offset":"15717269"},"OrdinaryCreateFromConstructor.js":{"size":808,"integrity":{"algorithm":"SHA256","hash":"0f46555a69c89ffefd354541724966d6351a0b910102aa8acc0d1c1ee7dec67a","blockSize":4194304,"blocks":["0f46555a69c89ffefd354541724966d6351a0b910102aa8acc0d1c1ee7dec67a"]},"offset":"15718777"},"OrdinaryDefineOwnProperty.js":{"size":2390,"integrity":{"algorithm":"SHA256","hash":"5aa87d94193a2cc6a19e5ef3e44a4b1e12f99ff6a0cd1755faf0f0338b0e07fd","blockSize":4194304,"blocks":["5aa87d94193a2cc6a19e5ef3e44a4b1e12f99ff6a0cd1755faf0f0338b0e07fd"]},"offset":"15719585"},"OrdinaryGetOwnProperty.js":{"size":1257,"integrity":{"algorithm":"SHA256","hash":"d4ef741d1e026235ef46accf3a1538b3510a81e35eff00e0643e0431f3c71ba8","blockSize":4194304,"blocks":["d4ef741d1e026235ef46accf3a1538b3510a81e35eff00e0643e0431f3c71ba8"]},"offset":"15721975"},"OrdinaryGetPrototypeOf.js":{"size":539,"integrity":{"algorithm":"SHA256","hash":"bf546da8b6ac3f982c55919169b2f07320b7934868dfb3b82c13f38c72b95a0d","blockSize":4194304,"blocks":["bf546da8b6ac3f982c55919169b2f07320b7934868dfb3b82c13f38c72b95a0d"]},"offset":"15723232"},"OrdinaryHasInstance.js":{"size":627,"integrity":{"algorithm":"SHA256","hash":"d36943f8261941e336b58a6d698291eef06aa4d7d44ab5fdffb7d073d50a771c","blockSize":4194304,"blocks":["d36943f8261941e336b58a6d698291eef06aa4d7d44ab5fdffb7d073d50a771c"]},"offset":"15723771"},"OrdinaryHasProperty.js":{"size":531,"integrity":{"algorithm":"SHA256","hash":"cbcf61dec7dc22444d36e89a62324453f98ccff4141e8284e5621b1fd0fbd07b","blockSize":4194304,"blocks":["cbcf61dec7dc22444d36e89a62324453f98ccff4141e8284e5621b1fd0fbd07b"]},"offset":"15724398"},"OrdinarySetPrototypeOf.js":{"size":1050,"integrity":{"algorithm":"SHA256","hash":"9f33c9e0fba4b5605ca95af4f267ed266cfe5a7ec0c5a739353a37d4b5eee5f3","blockSize":4194304,"blocks":["9f33c9e0fba4b5605ca95af4f267ed266cfe5a7ec0c5a739353a37d4b5eee5f3"]},"offset":"15724929"},"OrdinaryToPrimitive.js":{"size":1065,"integrity":{"algorithm":"SHA256","hash":"5f186778e48dd0375388468783d8a0a68bc08a4ff8f190f33bda9d1b4a73e6a8","blockSize":4194304,"blocks":["5f186778e48dd0375388468783d8a0a68bc08a4ff8f190f33bda9d1b4a73e6a8"]},"offset":"15725979"},"QuoteJSONString.js":{"size":1422,"integrity":{"algorithm":"SHA256","hash":"b8eb77f91a4edf4aa6841bdeab7ba2b2f748cd6548fd384759e6bee5bdf69225","blockSize":4194304,"blocks":["b8eb77f91a4edf4aa6841bdeab7ba2b2f748cd6548fd384759e6bee5bdf69225"]},"offset":"15727044"},"RegExpCreate.js":{"size":643,"integrity":{"algorithm":"SHA256","hash":"49da22ccbe85efb7620bfeb7877f2ef8678f1882ade81fcdc3f54567add7ab6b","blockSize":4194304,"blocks":["49da22ccbe85efb7620bfeb7877f2ef8678f1882ade81fcdc3f54567add7ab6b"]},"offset":"15728466"},"RegExpExec.js":{"size":887,"integrity":{"algorithm":"SHA256","hash":"32fbe5fc604aa31efc738c2b617a512114367daffa37a031a3257fe5be493bb9","blockSize":4194304,"blocks":["32fbe5fc604aa31efc738c2b617a512114367daffa37a031a3257fe5be493bb9"]},"offset":"15729109"},"RequireObjectCoercible.js":{"size":70,"integrity":{"algorithm":"SHA256","hash":"25d49a24f231f606c6d8be4760f3795c12f61bda0ac95ad8e452205f97c8e612","blockSize":4194304,"blocks":["25d49a24f231f606c6d8be4760f3795c12f61bda0ac95ad8e452205f97c8e612"]},"offset":"15729996"},"SameValue.js":{"size":307,"integrity":{"algorithm":"SHA256","hash":"e6d99ed6b4a479bed51f697cbc4693a2ff8da0d1e07b5ebf11e74b5404af2ab1","blockSize":4194304,"blocks":["e6d99ed6b4a479bed51f697cbc4693a2ff8da0d1e07b5ebf11e74b5404af2ab1"]},"offset":"15730066"},"SameValueNonNumber.js":{"size":450,"integrity":{"algorithm":"SHA256","hash":"17364939fc9a94d3215beba321f6499a30cf879af8f7bf2f42bdf54c9d7b30a6","blockSize":4194304,"blocks":["17364939fc9a94d3215beba321f6499a30cf879af8f7bf2f42bdf54c9d7b30a6"]},"offset":"15730373"},"SameValueZero.js":{"size":223,"integrity":{"algorithm":"SHA256","hash":"269684a69605b1f7ad04dfccc1519d7905271fd6ae05601a832a2ab8fb7272fc","blockSize":4194304,"blocks":["269684a69605b1f7ad04dfccc1519d7905271fd6ae05601a832a2ab8fb7272fc"]},"offset":"15730823"},"SecFromTime.js":{"size":402,"integrity":{"algorithm":"SHA256","hash":"6263c6176eafa22eadeb7bc054169fd764a3e3aab0cf637110d86110367c8a36","blockSize":4194304,"blocks":["6263c6176eafa22eadeb7bc054169fd764a3e3aab0cf637110d86110367c8a36"]},"offset":"15731046"},"Set.js":{"size":1255,"integrity":{"algorithm":"SHA256","hash":"88389d458aaae848468091535f5e8be59993020e744e998ca3058b59c1943ce8","blockSize":4194304,"blocks":["88389d458aaae848468091535f5e8be59993020e744e998ca3058b59c1943ce8"]},"offset":"15731448"},"SetFunctionName.js":{"size":1381,"integrity":{"algorithm":"SHA256","hash":"dabffc283c552e871c8bfd4a4d419e9453056b2b51a23f80f2ff6050c30b09c9","blockSize":4194304,"blocks":["dabffc283c552e871c8bfd4a4d419e9453056b2b51a23f80f2ff6050c30b09c9"]},"offset":"15732703"},"SetIntegrityLevel.js":{"size":1862,"integrity":{"algorithm":"SHA256","hash":"3c04bdc423a594ffec10244025e37e466b5878c4255a53655d445f51584b7d5e","blockSize":4194304,"blocks":["3c04bdc423a594ffec10244025e37e466b5878c4255a53655d445f51584b7d5e"]},"offset":"15734084"},"SpeciesConstructor.js":{"size":844,"integrity":{"algorithm":"SHA256","hash":"826eccbe073d3e7b806cd67e4d4ae09ede6d5ae6125480705b7bf81c2486f175","blockSize":4194304,"blocks":["826eccbe073d3e7b806cd67e4d4ae09ede6d5ae6125480705b7bf81c2486f175"]},"offset":"15735946"},"SplitMatch.js":{"size":874,"integrity":{"algorithm":"SHA256","hash":"316ced53a4420b95079c1160d67c81e52e91173360784bb3a517397420cb6d84","blockSize":4194304,"blocks":["316ced53a4420b95079c1160d67c81e52e91173360784bb3a517397420cb6d84"]},"offset":"15736790"},"StrictEqualityComparison.js":{"size":361,"integrity":{"algorithm":"SHA256","hash":"33928172f049f2f5fd7559470bb12647b7c6012b1da230e5a7e5fd8ffc1dd30e","blockSize":4194304,"blocks":["33928172f049f2f5fd7559470bb12647b7c6012b1da230e5a7e5fd8ffc1dd30e"]},"offset":"15737664"},"StringCreate.js":{"size":1117,"integrity":{"algorithm":"SHA256","hash":"18a70a9279026ea03b811f95a797cde8caf8d77a010880506e0f0b4532a1181d","blockSize":4194304,"blocks":["18a70a9279026ea03b811f95a797cde8caf8d77a010880506e0f0b4532a1181d"]},"offset":"15738025"},"StringGetOwnProperty.js":{"size":1382,"integrity":{"algorithm":"SHA256","hash":"084af8ee1c3326c443d0dcf86199c6deedc61057b08bd870c3e9415a12df78a4","blockSize":4194304,"blocks":["084af8ee1c3326c443d0dcf86199c6deedc61057b08bd870c3e9415a12df78a4"]},"offset":"15739142"},"SymbolDescriptiveString.js":{"size":526,"integrity":{"algorithm":"SHA256","hash":"d5a4e603be41ed5dff7123a6a0ba29efae0812f4d076a78387520b36b416a37d","blockSize":4194304,"blocks":["d5a4e603be41ed5dff7123a6a0ba29efae0812f4d076a78387520b36b416a37d"]},"offset":"15740524"},"TestIntegrityLevel.js":{"size":1285,"integrity":{"algorithm":"SHA256","hash":"8a0161ac60421c4762bc9e442224da95614cdb3e9865bcd79ad29d2310dd35c6","blockSize":4194304,"blocks":["8a0161ac60421c4762bc9e442224da95614cdb3e9865bcd79ad29d2310dd35c6"]},"offset":"15741050"},"TimeClip.js":{"size":468,"integrity":{"algorithm":"SHA256","hash":"bf1f153b35126ac0ebd122717e6349c97e932e3665ff1947f5f4a7da4895cb48","blockSize":4194304,"blocks":["bf1f153b35126ac0ebd122717e6349c97e932e3665ff1947f5f4a7da4895cb48"]},"offset":"15742335"},"TimeFromYear.js":{"size":261,"integrity":{"algorithm":"SHA256","hash":"07bd801ef44bcc4c5458937d6b3c09b1ba6f30d24fbb06ca9b4818c0699c330b","blockSize":4194304,"blocks":["07bd801ef44bcc4c5458937d6b3c09b1ba6f30d24fbb06ca9b4818c0699c330b"]},"offset":"15742803"},"TimeWithinDay.js":{"size":247,"integrity":{"algorithm":"SHA256","hash":"c83b563c9849ca65fb1ed7235f72f42a019fde9e67aad81d1bd0699ed28f43f8","blockSize":4194304,"blocks":["c83b563c9849ca65fb1ed7235f72f42a019fde9e67aad81d1bd0699ed28f43f8"]},"offset":"15743064"},"ToBoolean.js":{"size":130,"integrity":{"algorithm":"SHA256","hash":"36a4823341bd4ec68dd6f4b32afbbc939330a48bf7042108c9be89eaaab5bbc6","blockSize":4194304,"blocks":["36a4823341bd4ec68dd6f4b32afbbc939330a48bf7042108c9be89eaaab5bbc6"]},"offset":"15743311"},"ToDateString.js":{"size":498,"integrity":{"algorithm":"SHA256","hash":"57a5e2f02146ccfa64217595a7b5024fd7a74d9847a5d7df98f6cdaa04335612","blockSize":4194304,"blocks":["57a5e2f02146ccfa64217595a7b5024fd7a74d9847a5d7df98f6cdaa04335612"]},"offset":"15743441"},"ToIndex.js":{"size":668,"integrity":{"algorithm":"SHA256","hash":"27febefdf3eaa534bcbc8c12aac9b73241ba4872e611f8665f962c8d83ff3797","blockSize":4194304,"blocks":["27febefdf3eaa534bcbc8c12aac9b73241ba4872e611f8665f962c8d83ff3797"]},"offset":"15743939"},"ToInt16.js":{"size":260,"integrity":{"algorithm":"SHA256","hash":"ad0dcb3339d64526564c10379cc026a2f595f9ed7642199104eb0c0ffebccc35","blockSize":4194304,"blocks":["ad0dcb3339d64526564c10379cc026a2f595f9ed7642199104eb0c0ffebccc35"]},"offset":"15744607"},"ToInt32.js":{"size":173,"integrity":{"algorithm":"SHA256","hash":"e0c77696079335a016ce39e9992f11939ad25c1b322d119eedbec24a989a50a6","blockSize":4194304,"blocks":["e0c77696079335a016ce39e9992f11939ad25c1b322d119eedbec24a989a50a6"]},"offset":"15744867"},"ToInt8.js":{"size":247,"integrity":{"algorithm":"SHA256","hash":"0f844398064a22ca49a1c263a564e15449de26b5114281211d3de3535d914336","blockSize":4194304,"blocks":["0f844398064a22ca49a1c263a564e15449de26b5114281211d3de3535d914336"]},"offset":"15745040"},"ToInteger.js":{"size":273,"integrity":{"algorithm":"SHA256","hash":"b07f58c5193a820640f1169bdf1a38dee1c1eb863d5874294d9afa5438bdb274","blockSize":4194304,"blocks":["b07f58c5193a820640f1169bdf1a38dee1c1eb863d5874294d9afa5438bdb274"]},"offset":"15745287"},"ToLength.js":{"size":332,"integrity":{"algorithm":"SHA256","hash":"b4faf0dcbfc133417e965670ef8bf4071f0c323400c32f5cc528a3bc957e8fe5","blockSize":4194304,"blocks":["b4faf0dcbfc133417e965670ef8bf4071f0c323400c32f5cc528a3bc957e8fe5"]},"offset":"15745560"},"ToNumber.js":{"size":2015,"integrity":{"algorithm":"SHA256","hash":"e0eac78353a093abb2717666f27ebebc1a9e48caa98950b7fb4cf9dadde4ab7c","blockSize":4194304,"blocks":["e0eac78353a093abb2717666f27ebebc1a9e48caa98950b7fb4cf9dadde4ab7c"]},"offset":"15745892"},"ToObject.js":{"size":334,"integrity":{"algorithm":"SHA256","hash":"2c382673870deb89e3b19511d8f08fa9554d103fa9d143e5a57b79d85a093725","blockSize":4194304,"blocks":["2c382673870deb89e3b19511d8f08fa9554d103fa9d143e5a57b79d85a093725"]},"offset":"15747907"},"ToPrimitive.js":{"size":287,"integrity":{"algorithm":"SHA256","hash":"fe27d95fe99afd38d780e7d88f349e1dc1a68841b845e118abb8c80c4ab9aa53","blockSize":4194304,"blocks":["fe27d95fe99afd38d780e7d88f349e1dc1a68841b845e118abb8c80c4ab9aa53"]},"offset":"15748241"},"ToPropertyDescriptor.js":{"size":1452,"integrity":{"algorithm":"SHA256","hash":"78b5dfba0830bc47aa55c1b33f2be8fd973ff5ccc87a599abadda676d3596c49","blockSize":4194304,"blocks":["78b5dfba0830bc47aa55c1b33f2be8fd973ff5ccc87a599abadda676d3596c49"]},"offset":"15748528"},"ToPropertyKey.js":{"size":405,"integrity":{"algorithm":"SHA256","hash":"58d4355f4509a456b237e1d72169200edb1810d1efa9ee167ac26faa7904edd3","blockSize":4194304,"blocks":["58d4355f4509a456b237e1d72169200edb1810d1efa9ee167ac26faa7904edd3"]},"offset":"15749980"},"ToString.js":{"size":396,"integrity":{"algorithm":"SHA256","hash":"79c26e024582b6ac70a965063b757c70ceea15fa8da17a78ebbf77b40ccaece3","blockSize":4194304,"blocks":["79c26e024582b6ac70a965063b757c70ceea15fa8da17a78ebbf77b40ccaece3"]},"offset":"15750385"},"ToUint16.js":{"size":564,"integrity":{"algorithm":"SHA256","hash":"5775f0384586a383c5dd6c359e37d4b218c8ddf069d7a2906f7e4752ab66a20d","blockSize":4194304,"blocks":["5775f0384586a383c5dd6c359e37d4b218c8ddf069d7a2906f7e4752ab66a20d"]},"offset":"15750781"},"ToUint32.js":{"size":175,"integrity":{"algorithm":"SHA256","hash":"b68209f8fb9d1e978fe3d162251bba47f056c43ec7028cbd99b485800bd62315","blockSize":4194304,"blocks":["b68209f8fb9d1e978fe3d162251bba47f056c43ec7028cbd99b485800bd62315"]},"offset":"15751345"},"ToUint8.js":{"size":578,"integrity":{"algorithm":"SHA256","hash":"94fa392bda40d5d6c1125b662b304a372b135660d3740eebae7ade568bdd52a9","blockSize":4194304,"blocks":["94fa392bda40d5d6c1125b662b304a372b135660d3740eebae7ade568bdd52a9"]},"offset":"15751520"},"ToUint8Clamp.js":{"size":522,"integrity":{"algorithm":"SHA256","hash":"30dd3065a73ef4ff1f0a018ce80bd550673e5ee29c732e6fc8cade4661f80d56","blockSize":4194304,"blocks":["30dd3065a73ef4ff1f0a018ce80bd550673e5ee29c732e6fc8cade4661f80d56"]},"offset":"15752098"},"Type.js":{"size":249,"integrity":{"algorithm":"SHA256","hash":"a9812c431dc51253d8d3bd637842b22534f87a1f1006d2266c824488d068305d","blockSize":4194304,"blocks":["a9812c431dc51253d8d3bd637842b22534f87a1f1006d2266c824488d068305d"]},"offset":"15752620"},"UTF16Decode.js":{"size":823,"integrity":{"algorithm":"SHA256","hash":"66b054809f1121de679d732a62bfa5c258806147b7fa6ed473a4ce5f56b70e61","blockSize":4194304,"blocks":["66b054809f1121de679d732a62bfa5c258806147b7fa6ed473a4ce5f56b70e61"]},"offset":"15752869"},"UTF16Encoding.js":{"size":700,"integrity":{"algorithm":"SHA256","hash":"4a84fe0de13660a11bc7f0e2ccdb5611e6767e0f40b20a16c335db7316cf369f","blockSize":4194304,"blocks":["4a84fe0de13660a11bc7f0e2ccdb5611e6767e0f40b20a16c335db7316cf369f"]},"offset":"15753692"},"ValidateAndApplyPropertyDescriptor.js":{"size":5243,"integrity":{"algorithm":"SHA256","hash":"588f81f21e07a8d2255bc0aed34c94052aa74d5b558edc4435d0acee12c90554","blockSize":4194304,"blocks":["588f81f21e07a8d2255bc0aed34c94052aa74d5b558edc4435d0acee12c90554"]},"offset":"15754392"},"WeekDay.js":{"size":208,"integrity":{"algorithm":"SHA256","hash":"f7cc798c72dcc484295681d29d535e64215a9ec303f4f6e6456ea63e83ce0246","blockSize":4194304,"blocks":["f7cc798c72dcc484295681d29d535e64215a9ec303f4f6e6456ea63e83ce0246"]},"offset":"15759635"},"YearFromTime.js":{"size":407,"integrity":{"algorithm":"SHA256","hash":"5562b7fd6be438187a1187a331f0d310e631e9747df14521accc7a797e2a2aa7","blockSize":4194304,"blocks":["5562b7fd6be438187a1187a331f0d310e631e9747df14521accc7a797e2a2aa7"]},"offset":"15759843"},"abs.js":{"size":207,"integrity":{"algorithm":"SHA256","hash":"a50e248c29238747c3c278a4edf2c0643f1295d1c065d9dff8524def17f0427f","blockSize":4194304,"blocks":["a50e248c29238747c3c278a4edf2c0643f1295d1c065d9dff8524def17f0427f"]},"offset":"15760250"},"floor.js":{"size":217,"integrity":{"algorithm":"SHA256","hash":"90c20830ae8762224c83fb0ed36a288a7d567f57d3b5acb469590cc2d5e13f55","blockSize":4194304,"blocks":["90c20830ae8762224c83fb0ed36a288a7d567f57d3b5acb469590cc2d5e13f55"]},"offset":"15760457"},"modulo.js":{"size":168,"integrity":{"algorithm":"SHA256","hash":"84923b64427edcc840ee9a305dca213f4bf1e04ed8f88f6bfd7bfa9e655d7c98","blockSize":4194304,"blocks":["84923b64427edcc840ee9a305dca213f4bf1e04ed8f88f6bfd7bfa9e655d7c98"]},"offset":"15760674"},"msFromTime.js":{"size":253,"integrity":{"algorithm":"SHA256","hash":"ef13a7e7721d695f125a7e772f8037ed34aa3c97aaa3692da900c6796cd270da","blockSize":4194304,"blocks":["ef13a7e7721d695f125a7e772f8037ed34aa3c97aaa3692da900c6796cd270da"]},"offset":"15760842"},"thisBooleanValue.js":{"size":367,"integrity":{"algorithm":"SHA256","hash":"171bd884e07701d9e37bece81b05a95fd7d822ff7eaaba5c112d6e3a352ad498","blockSize":4194304,"blocks":["171bd884e07701d9e37bece81b05a95fd7d822ff7eaaba5c112d6e3a352ad498"]},"offset":"15761095"},"thisNumberValue.js":{"size":390,"integrity":{"algorithm":"SHA256","hash":"a3bb9eb733e74de8a50f49e4425e57fd01bebbf66df4f9967da3d9edee589455","blockSize":4194304,"blocks":["a3bb9eb733e74de8a50f49e4425e57fd01bebbf66df4f9967da3d9edee589455"]},"offset":"15761462"},"thisStringValue.js":{"size":361,"integrity":{"algorithm":"SHA256","hash":"47305af763f963ab1c547011b6be408827678d61540009de579bf996d0810ff5","blockSize":4194304,"blocks":["47305af763f963ab1c547011b6be408827678d61540009de579bf996d0810ff5"]},"offset":"15761852"},"thisTimeValue.js":{"size":267,"integrity":{"algorithm":"SHA256","hash":"4530f2d9e41738da88d10de84862a02fa1b34d5a704206d8deb5a151f26a87b8","blockSize":4194304,"blocks":["4530f2d9e41738da88d10de84862a02fa1b34d5a704206d8deb5a151f26a87b8"]},"offset":"15762213"}}},"2018":{"files":{"AbstractEqualityComparison.js":{"size":1154,"integrity":{"algorithm":"SHA256","hash":"b95b9c6c6a99532fe37e1d0fa948bbe700ecc013b045034afb1a5db6a39026db","blockSize":4194304,"blocks":["b95b9c6c6a99532fe37e1d0fa948bbe700ecc013b045034afb1a5db6a39026db"]},"offset":"15561806"},"AbstractRelationalComparison.js":{"size":1533,"integrity":{"algorithm":"SHA256","hash":"c10e5bb769369bfa15f2444c3ee1397589050ed4402b8c6be50c203fae67cba3","blockSize":4194304,"blocks":["c10e5bb769369bfa15f2444c3ee1397589050ed4402b8c6be50c203fae67cba3"]},"offset":"15562960"},"AdvanceStringIndex.js":{"size":1305,"integrity":{"algorithm":"SHA256","hash":"021f64d34615e95873eab825aa0353ee281db9bb6d1d7436fb77a45f9cd9a296","blockSize":4194304,"blocks":["021f64d34615e95873eab825aa0353ee281db9bb6d1d7436fb77a45f9cd9a296"]},"offset":"15564493"},"ArrayCreate.js":{"size":1650,"integrity":{"algorithm":"SHA256","hash":"6cde465e8db30b2ba485412ac2912f04a6212b3effdd37d0f3a9894af999ba9b","blockSize":4194304,"blocks":["6cde465e8db30b2ba485412ac2912f04a6212b3effdd37d0f3a9894af999ba9b"]},"offset":"15565798"},"ArraySetLength.js":{"size":2665,"integrity":{"algorithm":"SHA256","hash":"4b07de7693377557e2f05bf21ea871ff235ce1121e0e95846f5639fa5cc3ebb1","blockSize":4194304,"blocks":["4b07de7693377557e2f05bf21ea871ff235ce1121e0e95846f5639fa5cc3ebb1"]},"offset":"15567448"},"ArraySpeciesCreate.js":{"size":1348,"integrity":{"algorithm":"SHA256","hash":"246aed3dfe50be7dcbd5b25934dd6c74bff25b66de39dcc70335e6d668cc480b","blockSize":4194304,"blocks":["246aed3dfe50be7dcbd5b25934dd6c74bff25b66de39dcc70335e6d668cc480b"]},"offset":"15570113"},"Call.js":{"size":623,"integrity":{"algorithm":"SHA256","hash":"b092006d05bceeccee48bdf3fde9d83ee54a156eb2841bf5cacdca9f157b4571","blockSize":4194304,"blocks":["b092006d05bceeccee48bdf3fde9d83ee54a156eb2841bf5cacdca9f157b4571"]},"offset":"15571461"},"CanonicalNumericIndexString.js":{"size":654,"integrity":{"algorithm":"SHA256","hash":"c850cc1637b82f4fc238d2ae1a45229e8d44bc5c9b85205c0f27a1e0e9bb9d2b","blockSize":4194304,"blocks":["c850cc1637b82f4fc238d2ae1a45229e8d44bc5c9b85205c0f27a1e0e9bb9d2b"]},"offset":"15572084"},"CharacterRange.js":{"size":782,"integrity":{"algorithm":"SHA256","hash":"49612101e544a9b707f116ac8fe2be0d2c559c1d3b4f94ba47f36832913ea11f","blockSize":4194304,"blocks":["49612101e544a9b707f116ac8fe2be0d2c559c1d3b4f94ba47f36832913ea11f"]},"offset":"15572738"},"CompletePropertyDescriptor.js":{"size":989,"integrity":{"algorithm":"SHA256","hash":"17825d14da6797c52aa699d7b089bc2370d5a899cb7af7e3485f948fde50fca2","blockSize":4194304,"blocks":["17825d14da6797c52aa699d7b089bc2370d5a899cb7af7e3485f948fde50fca2"]},"offset":"15573520"},"CopyDataProperties.js":{"size":1992,"integrity":{"algorithm":"SHA256","hash":"fa2bcc3169a61cdc29d99edcf9ff209e206a695b47d478e8b90daff5e6ceb84e","blockSize":4194304,"blocks":["fa2bcc3169a61cdc29d99edcf9ff209e206a695b47d478e8b90daff5e6ceb84e"]},"offset":"15574509"},"CreateDataProperty.js":{"size":1279,"integrity":{"algorithm":"SHA256","hash":"5006509a3f5567f81cb7f730448a0a492c64c7f06406627c58d0334dde5e44f9","blockSize":4194304,"blocks":["5006509a3f5567f81cb7f730448a0a492c64c7f06406627c58d0334dde5e44f9"]},"offset":"15576501"},"CreateDataPropertyOrThrow.js":{"size":734,"integrity":{"algorithm":"SHA256","hash":"50c61c792c27d661346cfb29fe5b7603a2713d7acb1dc5b3b35fe71ece8fd18e","blockSize":4194304,"blocks":["50c61c792c27d661346cfb29fe5b7603a2713d7acb1dc5b3b35fe71ece8fd18e"]},"offset":"15577780"},"CreateHTML.js":{"size":927,"integrity":{"algorithm":"SHA256","hash":"5b9cf63f6b4bc50077e333c2b310cbd4c85a97891b2e1d28a93aeeb4370c2930","blockSize":4194304,"blocks":["5b9cf63f6b4bc50077e333c2b310cbd4c85a97891b2e1d28a93aeeb4370c2930"]},"offset":"15578514"},"CreateIterResultObject.js":{"size":432,"integrity":{"algorithm":"SHA256","hash":"289a26996866dba6f6292ba0931e643c7a5851f21003d41e5a004862a03a2035","blockSize":4194304,"blocks":["289a26996866dba6f6292ba0931e643c7a5851f21003d41e5a004862a03a2035"]},"offset":"15579441"},"CreateListFromArrayLike.js":{"size":1354,"integrity":{"algorithm":"SHA256","hash":"59bff81b54528dca9de105511851d1af4ee78c476453991e93ddde3b29e0a0ff","blockSize":4194304,"blocks":["59bff81b54528dca9de105511851d1af4ee78c476453991e93ddde3b29e0a0ff"]},"offset":"15579873"},"CreateMethodProperty.js":{"size":979,"integrity":{"algorithm":"SHA256","hash":"117c68b2fa6825c31e8d6f4970973fddf09fd74506447ca22ed3cfc2ed8b04e8","blockSize":4194304,"blocks":["117c68b2fa6825c31e8d6f4970973fddf09fd74506447ca22ed3cfc2ed8b04e8"]},"offset":"15581227"},"DateFromTime.js":{"size":1036,"integrity":{"algorithm":"SHA256","hash":"ae437cb5ee92b162e18b6f47b9dd66b66f627547e098a0670d60c2572f04b1ed","blockSize":4194304,"blocks":["ae437cb5ee92b162e18b6f47b9dd66b66f627547e098a0670d60c2572f04b1ed"]},"offset":"15582206"},"DateString.js":{"size":1055,"integrity":{"algorithm":"SHA256","hash":"9dde544576a4c552c56ee5f102459d4e3ca28bb800ccba833b53bd159d1e864a","blockSize":4194304,"blocks":["9dde544576a4c552c56ee5f102459d4e3ca28bb800ccba833b53bd159d1e864a"]},"offset":"15583242"},"Day.js":{"size":234,"integrity":{"algorithm":"SHA256","hash":"ff3875a46c34886cff3808ab1c4de6d3b45a61e9638b32edd22f41277c153ea5","blockSize":4194304,"blocks":["ff3875a46c34886cff3808ab1c4de6d3b45a61e9638b32edd22f41277c153ea5"]},"offset":"15584297"},"DayFromYear.js":{"size":256,"integrity":{"algorithm":"SHA256","hash":"378eb638143e86cfa3061177986dcfdb6bdec76e8b799b95cf3b9cafc5e9af68","blockSize":4194304,"blocks":["378eb638143e86cfa3061177986dcfdb6bdec76e8b799b95cf3b9cafc5e9af68"]},"offset":"15584531"},"DayWithinYear.js":{"size":286,"integrity":{"algorithm":"SHA256","hash":"b1ac5824fb1ced3e9d2dae99db5bd3890b4ef25dc45e50a4f927384bb5be618e","blockSize":4194304,"blocks":["b1ac5824fb1ced3e9d2dae99db5bd3890b4ef25dc45e50a4f927384bb5be618e"]},"offset":"15584787"},"DaysInYear.js":{"size":301,"integrity":{"algorithm":"SHA256","hash":"3f5955b3d1831ed2d008ae052a802b12c22bf1ba6d8fd286e0cb7a6a77144aec","blockSize":4194304,"blocks":["3f5955b3d1831ed2d008ae052a802b12c22bf1ba6d8fd286e0cb7a6a77144aec"]},"offset":"15585073"},"DefinePropertyOrThrow.js":{"size":1466,"integrity":{"algorithm":"SHA256","hash":"1964ecd5b9e64b3ddb203ac7da3410e09a2b1d0ab9b1f06733af8ea15ae954a4","blockSize":4194304,"blocks":["1964ecd5b9e64b3ddb203ac7da3410e09a2b1d0ab9b1f06733af8ea15ae954a4"]},"offset":"15585374"},"DeletePropertyOrThrow.js":{"size":699,"integrity":{"algorithm":"SHA256","hash":"3c1ac659ec4eb7ad97e99c2c3d08c2058624eec2ac0bcca0583660a0fe69f1c5","blockSize":4194304,"blocks":["3c1ac659ec4eb7ad97e99c2c3d08c2058624eec2ac0bcca0583660a0fe69f1c5"]},"offset":"15586840"},"EnumerableOwnPropertyNames.js":{"size":1112,"integrity":{"algorithm":"SHA256","hash":"d389393a016c32c0b737581f924aad9edb42291b1f869bb514f5521f31a4a198","blockSize":4194304,"blocks":["d389393a016c32c0b737581f924aad9edb42291b1f869bb514f5521f31a4a198"]},"offset":"15587539"},"FromPropertyDescriptor.js":{"size":450,"integrity":{"algorithm":"SHA256","hash":"a16798c55be7b402fc2b27d4d422f322c40639b7403d47cb897b576fcc1ddd49","blockSize":4194304,"blocks":["a16798c55be7b402fc2b27d4d422f322c40639b7403d47cb897b576fcc1ddd49"]},"offset":"15588651"},"Get.js":{"size":602,"integrity":{"algorithm":"SHA256","hash":"ef9a4a39b94f3287d0c9ed27b9a5f1cb71164d2184d6aaf2fc5900fd44016ff9","blockSize":4194304,"blocks":["ef9a4a39b94f3287d0c9ed27b9a5f1cb71164d2184d6aaf2fc5900fd44016ff9"]},"offset":"15589101"},"GetIterator.js":{"size":856,"integrity":{"algorithm":"SHA256","hash":"6fd952f51c6137a0ef8aab1074a42011584da628da9360176b107dcf91979355","blockSize":4194304,"blocks":["6fd952f51c6137a0ef8aab1074a42011584da628da9360176b107dcf91979355"]},"offset":"15589703"},"GetMethod.js":{"size":663,"integrity":{"algorithm":"SHA256","hash":"87f8829531af6b2019ed31d44f2efcf89e8bf345c158ad6bd790f8e14028d325","blockSize":4194304,"blocks":["87f8829531af6b2019ed31d44f2efcf89e8bf345c158ad6bd790f8e14028d325"]},"offset":"15590559"},"GetOwnPropertyKeys.js":{"size":829,"integrity":{"algorithm":"SHA256","hash":"7ad04a3a175ede6b7d15611717a20c2bc6a09bef382f8b4f7d985e5b2e1e7120","blockSize":4194304,"blocks":["7ad04a3a175ede6b7d15611717a20c2bc6a09bef382f8b4f7d985e5b2e1e7120"]},"offset":"15591222"},"GetPrototypeFromConstructor.js":{"size":921,"integrity":{"algorithm":"SHA256","hash":"da1c30c8d5b331e72618af4ccc18b5f3ed89b36e9be117c74a4ee9266141ba56","blockSize":4194304,"blocks":["da1c30c8d5b331e72618af4ccc18b5f3ed89b36e9be117c74a4ee9266141ba56"]},"offset":"15592051"},"GetSubstitution.js":{"size":4417,"integrity":{"algorithm":"SHA256","hash":"680e2598750e34c1fa62e010a01503f52c3b8a58c7f790985d91ef2a0dc35d60","blockSize":4194304,"blocks":["680e2598750e34c1fa62e010a01503f52c3b8a58c7f790985d91ef2a0dc35d60"]},"offset":"15592972"},"GetV.js":{"size":474,"integrity":{"algorithm":"SHA256","hash":"66909f7192a6bddc6fb77163f6182164ebef641f0f4c595835485eda6cfd3443","blockSize":4194304,"blocks":["66909f7192a6bddc6fb77163f6182164ebef641f0f4c595835485eda6cfd3443"]},"offset":"15597389"},"HasOwnProperty.js":{"size":553,"integrity":{"algorithm":"SHA256","hash":"b099b2f9829fe64e25740771abc3d3c4e1c801ce0cd2ccecf6041ad08d59364d","blockSize":4194304,"blocks":["b099b2f9829fe64e25740771abc3d3c4e1c801ce0cd2ccecf6041ad08d59364d"]},"offset":"15597863"},"HasProperty.js":{"size":517,"integrity":{"algorithm":"SHA256","hash":"7889a3e2b191509b3d6c0bfcabbad2a915919a2caa275b696a12eab4ebd9cdac","blockSize":4194304,"blocks":["7889a3e2b191509b3d6c0bfcabbad2a915919a2caa275b696a12eab4ebd9cdac"]},"offset":"15598416"},"HourFromTime.js":{"size":382,"integrity":{"algorithm":"SHA256","hash":"338503d8b54967fb22e0659243cab7fc283f023561a8a3316df8b4de588bddf9","blockSize":4194304,"blocks":["338503d8b54967fb22e0659243cab7fc283f023561a8a3316df8b4de588bddf9"]},"offset":"15598933"},"InLeapYear.js":{"size":510,"integrity":{"algorithm":"SHA256","hash":"d9abbf0c4b80df1fd7cb31830f222eb4b6bbe638dcfa3461809905158f2ce0a6","blockSize":4194304,"blocks":["d9abbf0c4b80df1fd7cb31830f222eb4b6bbe638dcfa3461809905158f2ce0a6"]},"offset":"15599315"},"InstanceofOperator.js":{"size":918,"integrity":{"algorithm":"SHA256","hash":"af702715d893f635ff66441f9638a4dc977789c505a50ae17f7e02b05b2549d6","blockSize":4194304,"blocks":["af702715d893f635ff66441f9638a4dc977789c505a50ae17f7e02b05b2549d6"]},"offset":"15599825"},"Invoke.js":{"size":715,"integrity":{"algorithm":"SHA256","hash":"ff016550d8adf9608b2f4ab258017c1582ce717a2e2b3bd2b7a94440f7f19f8f","blockSize":4194304,"blocks":["ff016550d8adf9608b2f4ab258017c1582ce717a2e2b3bd2b7a94440f7f19f8f"]},"offset":"15600743"},"IsAccessorDescriptor.js":{"size":465,"integrity":{"algorithm":"SHA256","hash":"425c74a892b6bb2d1dc6c56e7a6e77e40b9c4d4390480fafe4c804cea53a80ad","blockSize":4194304,"blocks":["425c74a892b6bb2d1dc6c56e7a6e77e40b9c4d4390480fafe4c804cea53a80ad"]},"offset":"15601458"},"IsArray.js":{"size":123,"integrity":{"algorithm":"SHA256","hash":"a8f01a797e05a74501ceb9293408f72bded2a08013c6a075f582737003b443f4","blockSize":4194304,"blocks":["a8f01a797e05a74501ceb9293408f72bded2a08013c6a075f582737003b443f4"]},"offset":"15601923"},"IsCallable.js":{"size":108,"integrity":{"algorithm":"SHA256","hash":"789ba0a1f176c56862f16b2ff7bc3eeaaa02676f75be073a46c92c5e8af21170","blockSize":4194304,"blocks":["789ba0a1f176c56862f16b2ff7bc3eeaaa02676f75be073a46c92c5e8af21170"]},"offset":"15602046"},"IsCompatiblePropertyDescriptor.js":{"size":367,"integrity":{"algorithm":"SHA256","hash":"f9736fde486f1f27112126908c39423b2b3b946a96d5e2a4d762b3139da17543","blockSize":4194304,"blocks":["f9736fde486f1f27112126908c39423b2b3b946a96d5e2a4d762b3139da17543"]},"offset":"15602154"},"IsConcatSpreadable.js":{"size":626,"integrity":{"algorithm":"SHA256","hash":"7a4c3cae4f5de1b8cbc5694ac320cfaaf30f4ecbe2754e2ffb3f72fb42763a8a","blockSize":4194304,"blocks":["7a4c3cae4f5de1b8cbc5694ac320cfaaf30f4ecbe2754e2ffb3f72fb42763a8a"]},"offset":"15602521"},"IsConstructor.js":{"size":1149,"integrity":{"algorithm":"SHA256","hash":"1a58d54e8aec9ecbfaf3e75d9b38ef06c8a3c948e337cca159a17a102ee41929","blockSize":4194304,"blocks":["1a58d54e8aec9ecbfaf3e75d9b38ef06c8a3c948e337cca159a17a102ee41929"]},"offset":"15603147"},"IsDataDescriptor.js":{"size":464,"integrity":{"algorithm":"SHA256","hash":"35a0862d76e9d765d5fa4154250ed5ac440f4238432a773f22c288da3886e1ce","blockSize":4194304,"blocks":["35a0862d76e9d765d5fa4154250ed5ac440f4238432a773f22c288da3886e1ce"]},"offset":"15604296"},"IsExtensible.js":{"size":509,"integrity":{"algorithm":"SHA256","hash":"e28d0530ae66f0dfb8fa90c492fd6242a44ea7eff298d1ed4c10eac9fdfc8efb","blockSize":4194304,"blocks":["e28d0530ae66f0dfb8fa90c492fd6242a44ea7eff298d1ed4c10eac9fdfc8efb"]},"offset":"15604760"},"IsGenericDescriptor.js":{"size":560,"integrity":{"algorithm":"SHA256","hash":"b9d31ec0ad5beaea6a7d9f1180d67ef8f45b164234deeee14c362c8eb2e135cc","blockSize":4194304,"blocks":["b9d31ec0ad5beaea6a7d9f1180d67ef8f45b164234deeee14c362c8eb2e135cc"]},"offset":"15605269"},"IsInteger.js":{"size":450,"integrity":{"algorithm":"SHA256","hash":"84893768eabe51d4073d48aeb5cf43cfdba3a1c6223da13b0a73f802033ff6e2","blockSize":4194304,"blocks":["84893768eabe51d4073d48aeb5cf43cfdba3a1c6223da13b0a73f802033ff6e2"]},"offset":"15605829"},"IsPromise.js":{"size":485,"integrity":{"algorithm":"SHA256","hash":"9f4e5aef10bca5119fab546b4834e48b776d14a775f55524cd3512c4321a1e7c","blockSize":4194304,"blocks":["9f4e5aef10bca5119fab546b4834e48b776d14a775f55524cd3512c4321a1e7c"]},"offset":"15606279"},"IsPropertyKey.js":{"size":207,"integrity":{"algorithm":"SHA256","hash":"577d849187a0e8ef526a6368eb6757f6a128db792cf9ade6dfc6c82a75d155c3","blockSize":4194304,"blocks":["577d849187a0e8ef526a6368eb6757f6a128db792cf9ade6dfc6c82a75d155c3"]},"offset":"15606764"},"IsRegExp.js":{"size":545,"integrity":{"algorithm":"SHA256","hash":"1183cff5c42c2cf9a0b3fbb62d4a7f842b56c1141209c683f0116715bcf03c15","blockSize":4194304,"blocks":["1183cff5c42c2cf9a0b3fbb62d4a7f842b56c1141209c683f0116715bcf03c15"]},"offset":"15606971"},"IsSharedArrayBuffer.js":{"size":461,"integrity":{"algorithm":"SHA256","hash":"9451dbf3ee8a39a73e3e2315f48495288b29521576f0539d18c56fc4b6d85012","blockSize":4194304,"blocks":["9451dbf3ee8a39a73e3e2315f48495288b29521576f0539d18c56fc4b6d85012"]},"offset":"15607516"},"IsStringPrefix.js":{"size":940,"integrity":{"algorithm":"SHA256","hash":"9eb0f4ccb63d074f4ff299f92db9a4b4b821d69d865784956e0a0ddc627aa5fa","blockSize":4194304,"blocks":["9eb0f4ccb63d074f4ff299f92db9a4b4b821d69d865784956e0a0ddc627aa5fa"]},"offset":"15607977"},"IterableToList.js":{"size":619,"integrity":{"algorithm":"SHA256","hash":"f422d72db0996e2cb6f6845736ea1ea2198d8a9111d79393c12d89bcb50b1876","blockSize":4194304,"blocks":["f422d72db0996e2cb6f6845736ea1ea2198d8a9111d79393c12d89bcb50b1876"]},"offset":"15608917"},"IteratorClose.js":{"size":1481,"integrity":{"algorithm":"SHA256","hash":"52b100a8cc0ecb7b5d5c7346e20d23c7503c832525650b3269f40f6b98948cae","blockSize":4194304,"blocks":["52b100a8cc0ecb7b5d5c7346e20d23c7503c832525650b3269f40f6b98948cae"]},"offset":"15609536"},"IteratorComplete.js":{"size":498,"integrity":{"algorithm":"SHA256","hash":"41ad3ddb0114bfd56e3e67508633496d4ae672eeb47767f12ae0dacdd91d39b5","blockSize":4194304,"blocks":["41ad3ddb0114bfd56e3e67508633496d4ae672eeb47767f12ae0dacdd91d39b5"]},"offset":"15611017"},"IteratorNext.js":{"size":493,"integrity":{"algorithm":"SHA256","hash":"a6ee567a6387448b0140aceffae4ad1ccdd427537d6926716c3f686367098d30","blockSize":4194304,"blocks":["a6ee567a6387448b0140aceffae4ad1ccdd427537d6926716c3f686367098d30"]},"offset":"15611515"},"IteratorStep.js":{"size":353,"integrity":{"algorithm":"SHA256","hash":"22dbe3c1e07083538804e0bc79a4615d97ae6b49978623594f81e9ffd0ad0594","blockSize":4194304,"blocks":["22dbe3c1e07083538804e0bc79a4615d97ae6b49978623594f81e9ffd0ad0594"]},"offset":"15612008"},"IteratorValue.js":{"size":443,"integrity":{"algorithm":"SHA256","hash":"674abbe8978a08b6d6d6ae53a7c3aca04395c6a3e5d97807204fcfaf81fafd68","blockSize":4194304,"blocks":["674abbe8978a08b6d6d6ae53a7c3aca04395c6a3e5d97807204fcfaf81fafd68"]},"offset":"15612361"},"MakeDate.js":{"size":328,"integrity":{"algorithm":"SHA256","hash":"41a9b9da3ede4effd12c43e1c25851b5005623f5eb6dee707252cbe373b32ef0","blockSize":4194304,"blocks":["41a9b9da3ede4effd12c43e1c25851b5005623f5eb6dee707252cbe373b32ef0"]},"offset":"15612804"},"MakeDay.js":{"size":917,"integrity":{"algorithm":"SHA256","hash":"83e8e606e0e1ed2ad5b864a20459f8ce10aac6a653af26c12cd6cbc087da53e9","blockSize":4194304,"blocks":["83e8e606e0e1ed2ad5b864a20459f8ce10aac6a653af26c12cd6cbc087da53e9"]},"offset":"15613132"},"MakeTime.js":{"size":698,"integrity":{"algorithm":"SHA256","hash":"f91ad37ec6587e1debbe2be4f1bb86f4936df8e4649af2e33fe14023ed9f6da7","blockSize":4194304,"blocks":["f91ad37ec6587e1debbe2be4f1bb86f4936df8e4649af2e33fe14023ed9f6da7"]},"offset":"15614049"},"MinFromTime.js":{"size":396,"integrity":{"algorithm":"SHA256","hash":"88e77ac8a1b1aae30fe064057ed6699c3c3b176ec1ab0533893be6d1c7ba856a","blockSize":4194304,"blocks":["88e77ac8a1b1aae30fe064057ed6699c3c3b176ec1ab0533893be6d1c7ba856a"]},"offset":"15614747"},"MonthFromTime.js":{"size":1014,"integrity":{"algorithm":"SHA256","hash":"f7acafe967a838eb85739ec2afa8dcdc9e5c0734219559259338761a09131909","blockSize":4194304,"blocks":["f7acafe967a838eb85739ec2afa8dcdc9e5c0734219559259338761a09131909"]},"offset":"15615143"},"NumberToString.js":{"size":432,"integrity":{"algorithm":"SHA256","hash":"c8ebca402104dc1e893e1c3416d4a6b46983e36526a70e1993f4572e6d827130","blockSize":4194304,"blocks":["c8ebca402104dc1e893e1c3416d4a6b46983e36526a70e1993f4572e6d827130"]},"offset":"15616157"},"ObjectCreate.js":{"size":1033,"integrity":{"algorithm":"SHA256","hash":"3428357b1183afa802a5aa60b482291d6212cbb99ec01eafd7af91107e1ab4d5","blockSize":4194304,"blocks":["3428357b1183afa802a5aa60b482291d6212cbb99ec01eafd7af91107e1ab4d5"]},"offset":"15616589"},"ObjectDefineProperties.js":{"size":1508,"integrity":{"algorithm":"SHA256","hash":"672b0bda371a4710bf8e7c99cfc41eca1920c10fad584755be76cd5ac1136fa5","blockSize":4194304,"blocks":["672b0bda371a4710bf8e7c99cfc41eca1920c10fad584755be76cd5ac1136fa5"]},"offset":"15617622"},"OrdinaryCreateFromConstructor.js":{"size":808,"integrity":{"algorithm":"SHA256","hash":"0f46555a69c89ffefd354541724966d6351a0b910102aa8acc0d1c1ee7dec67a","blockSize":4194304,"blocks":["0f46555a69c89ffefd354541724966d6351a0b910102aa8acc0d1c1ee7dec67a"]},"offset":"15619130"},"OrdinaryDefineOwnProperty.js":{"size":2390,"integrity":{"algorithm":"SHA256","hash":"5aa87d94193a2cc6a19e5ef3e44a4b1e12f99ff6a0cd1755faf0f0338b0e07fd","blockSize":4194304,"blocks":["5aa87d94193a2cc6a19e5ef3e44a4b1e12f99ff6a0cd1755faf0f0338b0e07fd"]},"offset":"15619938"},"OrdinaryGetOwnProperty.js":{"size":1257,"integrity":{"algorithm":"SHA256","hash":"d4ef741d1e026235ef46accf3a1538b3510a81e35eff00e0643e0431f3c71ba8","blockSize":4194304,"blocks":["d4ef741d1e026235ef46accf3a1538b3510a81e35eff00e0643e0431f3c71ba8"]},"offset":"15622328"},"OrdinaryGetPrototypeOf.js":{"size":539,"integrity":{"algorithm":"SHA256","hash":"bf546da8b6ac3f982c55919169b2f07320b7934868dfb3b82c13f38c72b95a0d","blockSize":4194304,"blocks":["bf546da8b6ac3f982c55919169b2f07320b7934868dfb3b82c13f38c72b95a0d"]},"offset":"15623585"},"OrdinaryHasInstance.js":{"size":627,"integrity":{"algorithm":"SHA256","hash":"d36943f8261941e336b58a6d698291eef06aa4d7d44ab5fdffb7d073d50a771c","blockSize":4194304,"blocks":["d36943f8261941e336b58a6d698291eef06aa4d7d44ab5fdffb7d073d50a771c"]},"offset":"15624124"},"OrdinaryHasProperty.js":{"size":531,"integrity":{"algorithm":"SHA256","hash":"cbcf61dec7dc22444d36e89a62324453f98ccff4141e8284e5621b1fd0fbd07b","blockSize":4194304,"blocks":["cbcf61dec7dc22444d36e89a62324453f98ccff4141e8284e5621b1fd0fbd07b"]},"offset":"15624751"},"OrdinarySetPrototypeOf.js":{"size":1050,"integrity":{"algorithm":"SHA256","hash":"9f33c9e0fba4b5605ca95af4f267ed266cfe5a7ec0c5a739353a37d4b5eee5f3","blockSize":4194304,"blocks":["9f33c9e0fba4b5605ca95af4f267ed266cfe5a7ec0c5a739353a37d4b5eee5f3"]},"offset":"15625282"},"OrdinaryToPrimitive.js":{"size":1065,"integrity":{"algorithm":"SHA256","hash":"5f186778e48dd0375388468783d8a0a68bc08a4ff8f190f33bda9d1b4a73e6a8","blockSize":4194304,"blocks":["5f186778e48dd0375388468783d8a0a68bc08a4ff8f190f33bda9d1b4a73e6a8"]},"offset":"15626332"},"PromiseResolve.js":{"size":457,"integrity":{"algorithm":"SHA256","hash":"6914c2768bee4288d16b384871f81aa098119c14fc9fde2977654905ba227d4c","blockSize":4194304,"blocks":["6914c2768bee4288d16b384871f81aa098119c14fc9fde2977654905ba227d4c"]},"offset":"15627397"},"QuoteJSONString.js":{"size":1075,"integrity":{"algorithm":"SHA256","hash":"329b86b45a96a2169447f1467bf8ea1aaef7befb33d06922e47b20893dccd4ce","blockSize":4194304,"blocks":["329b86b45a96a2169447f1467bf8ea1aaef7befb33d06922e47b20893dccd4ce"]},"offset":"15627854"},"RegExpCreate.js":{"size":643,"integrity":{"algorithm":"SHA256","hash":"49da22ccbe85efb7620bfeb7877f2ef8678f1882ade81fcdc3f54567add7ab6b","blockSize":4194304,"blocks":["49da22ccbe85efb7620bfeb7877f2ef8678f1882ade81fcdc3f54567add7ab6b"]},"offset":"15628929"},"RegExpExec.js":{"size":887,"integrity":{"algorithm":"SHA256","hash":"32fbe5fc604aa31efc738c2b617a512114367daffa37a031a3257fe5be493bb9","blockSize":4194304,"blocks":["32fbe5fc604aa31efc738c2b617a512114367daffa37a031a3257fe5be493bb9"]},"offset":"15629572"},"RequireObjectCoercible.js":{"size":70,"integrity":{"algorithm":"SHA256","hash":"25d49a24f231f606c6d8be4760f3795c12f61bda0ac95ad8e452205f97c8e612","blockSize":4194304,"blocks":["25d49a24f231f606c6d8be4760f3795c12f61bda0ac95ad8e452205f97c8e612"]},"offset":"15630459"},"SameValue.js":{"size":307,"integrity":{"algorithm":"SHA256","hash":"e6d99ed6b4a479bed51f697cbc4693a2ff8da0d1e07b5ebf11e74b5404af2ab1","blockSize":4194304,"blocks":["e6d99ed6b4a479bed51f697cbc4693a2ff8da0d1e07b5ebf11e74b5404af2ab1"]},"offset":"15630529"},"SameValueNonNumber.js":{"size":450,"integrity":{"algorithm":"SHA256","hash":"17364939fc9a94d3215beba321f6499a30cf879af8f7bf2f42bdf54c9d7b30a6","blockSize":4194304,"blocks":["17364939fc9a94d3215beba321f6499a30cf879af8f7bf2f42bdf54c9d7b30a6"]},"offset":"15630836"},"SameValueZero.js":{"size":223,"integrity":{"algorithm":"SHA256","hash":"269684a69605b1f7ad04dfccc1519d7905271fd6ae05601a832a2ab8fb7272fc","blockSize":4194304,"blocks":["269684a69605b1f7ad04dfccc1519d7905271fd6ae05601a832a2ab8fb7272fc"]},"offset":"15631286"},"SecFromTime.js":{"size":402,"integrity":{"algorithm":"SHA256","hash":"6263c6176eafa22eadeb7bc054169fd764a3e3aab0cf637110d86110367c8a36","blockSize":4194304,"blocks":["6263c6176eafa22eadeb7bc054169fd764a3e3aab0cf637110d86110367c8a36"]},"offset":"15631509"},"Set.js":{"size":1255,"integrity":{"algorithm":"SHA256","hash":"88389d458aaae848468091535f5e8be59993020e744e998ca3058b59c1943ce8","blockSize":4194304,"blocks":["88389d458aaae848468091535f5e8be59993020e744e998ca3058b59c1943ce8"]},"offset":"15631911"},"SetFunctionLength.js":{"size":1047,"integrity":{"algorithm":"SHA256","hash":"4ce80a1363c6f8b6d873c7d15dc4ea33a0b5120a76ee3a9ac838ab748ca44677","blockSize":4194304,"blocks":["4ce80a1363c6f8b6d873c7d15dc4ea33a0b5120a76ee3a9ac838ab748ca44677"]},"offset":"15633166"},"SetFunctionName.js":{"size":1381,"integrity":{"algorithm":"SHA256","hash":"dabffc283c552e871c8bfd4a4d419e9453056b2b51a23f80f2ff6050c30b09c9","blockSize":4194304,"blocks":["dabffc283c552e871c8bfd4a4d419e9453056b2b51a23f80f2ff6050c30b09c9"]},"offset":"15634213"},"SetIntegrityLevel.js":{"size":1862,"integrity":{"algorithm":"SHA256","hash":"3c04bdc423a594ffec10244025e37e466b5878c4255a53655d445f51584b7d5e","blockSize":4194304,"blocks":["3c04bdc423a594ffec10244025e37e466b5878c4255a53655d445f51584b7d5e"]},"offset":"15635594"},"SpeciesConstructor.js":{"size":844,"integrity":{"algorithm":"SHA256","hash":"826eccbe073d3e7b806cd67e4d4ae09ede6d5ae6125480705b7bf81c2486f175","blockSize":4194304,"blocks":["826eccbe073d3e7b806cd67e4d4ae09ede6d5ae6125480705b7bf81c2486f175"]},"offset":"15637456"},"SplitMatch.js":{"size":874,"integrity":{"algorithm":"SHA256","hash":"316ced53a4420b95079c1160d67c81e52e91173360784bb3a517397420cb6d84","blockSize":4194304,"blocks":["316ced53a4420b95079c1160d67c81e52e91173360784bb3a517397420cb6d84"]},"offset":"15638300"},"StrictEqualityComparison.js":{"size":361,"integrity":{"algorithm":"SHA256","hash":"33928172f049f2f5fd7559470bb12647b7c6012b1da230e5a7e5fd8ffc1dd30e","blockSize":4194304,"blocks":["33928172f049f2f5fd7559470bb12647b7c6012b1da230e5a7e5fd8ffc1dd30e"]},"offset":"15639174"},"StringCreate.js":{"size":1117,"integrity":{"algorithm":"SHA256","hash":"18a70a9279026ea03b811f95a797cde8caf8d77a010880506e0f0b4532a1181d","blockSize":4194304,"blocks":["18a70a9279026ea03b811f95a797cde8caf8d77a010880506e0f0b4532a1181d"]},"offset":"15639535"},"StringGetOwnProperty.js":{"size":1382,"integrity":{"algorithm":"SHA256","hash":"084af8ee1c3326c443d0dcf86199c6deedc61057b08bd870c3e9415a12df78a4","blockSize":4194304,"blocks":["084af8ee1c3326c443d0dcf86199c6deedc61057b08bd870c3e9415a12df78a4"]},"offset":"15640652"},"SymbolDescriptiveString.js":{"size":526,"integrity":{"algorithm":"SHA256","hash":"d5a4e603be41ed5dff7123a6a0ba29efae0812f4d076a78387520b36b416a37d","blockSize":4194304,"blocks":["d5a4e603be41ed5dff7123a6a0ba29efae0812f4d076a78387520b36b416a37d"]},"offset":"15642034"},"TestIntegrityLevel.js":{"size":1285,"integrity":{"algorithm":"SHA256","hash":"8a0161ac60421c4762bc9e442224da95614cdb3e9865bcd79ad29d2310dd35c6","blockSize":4194304,"blocks":["8a0161ac60421c4762bc9e442224da95614cdb3e9865bcd79ad29d2310dd35c6"]},"offset":"15642560"},"TimeClip.js":{"size":468,"integrity":{"algorithm":"SHA256","hash":"bf1f153b35126ac0ebd122717e6349c97e932e3665ff1947f5f4a7da4895cb48","blockSize":4194304,"blocks":["bf1f153b35126ac0ebd122717e6349c97e932e3665ff1947f5f4a7da4895cb48"]},"offset":"15643845"},"TimeFromYear.js":{"size":261,"integrity":{"algorithm":"SHA256","hash":"07bd801ef44bcc4c5458937d6b3c09b1ba6f30d24fbb06ca9b4818c0699c330b","blockSize":4194304,"blocks":["07bd801ef44bcc4c5458937d6b3c09b1ba6f30d24fbb06ca9b4818c0699c330b"]},"offset":"15644313"},"TimeString.js":{"size":808,"integrity":{"algorithm":"SHA256","hash":"92304742e99d2785a471fbb7d92daed5d1e379fdcbbc34f7fe2e8f7f624288ea","blockSize":4194304,"blocks":["92304742e99d2785a471fbb7d92daed5d1e379fdcbbc34f7fe2e8f7f624288ea"]},"offset":"15644574"},"TimeWithinDay.js":{"size":247,"integrity":{"algorithm":"SHA256","hash":"c83b563c9849ca65fb1ed7235f72f42a019fde9e67aad81d1bd0699ed28f43f8","blockSize":4194304,"blocks":["c83b563c9849ca65fb1ed7235f72f42a019fde9e67aad81d1bd0699ed28f43f8"]},"offset":"15645382"},"ToBoolean.js":{"size":130,"integrity":{"algorithm":"SHA256","hash":"36a4823341bd4ec68dd6f4b32afbbc939330a48bf7042108c9be89eaaab5bbc6","blockSize":4194304,"blocks":["36a4823341bd4ec68dd6f4b32afbbc939330a48bf7042108c9be89eaaab5bbc6"]},"offset":"15645629"},"ToDateString.js":{"size":498,"integrity":{"algorithm":"SHA256","hash":"57a5e2f02146ccfa64217595a7b5024fd7a74d9847a5d7df98f6cdaa04335612","blockSize":4194304,"blocks":["57a5e2f02146ccfa64217595a7b5024fd7a74d9847a5d7df98f6cdaa04335612"]},"offset":"15645759"},"ToIndex.js":{"size":668,"integrity":{"algorithm":"SHA256","hash":"27febefdf3eaa534bcbc8c12aac9b73241ba4872e611f8665f962c8d83ff3797","blockSize":4194304,"blocks":["27febefdf3eaa534bcbc8c12aac9b73241ba4872e611f8665f962c8d83ff3797"]},"offset":"15646257"},"ToInt16.js":{"size":260,"integrity":{"algorithm":"SHA256","hash":"ad0dcb3339d64526564c10379cc026a2f595f9ed7642199104eb0c0ffebccc35","blockSize":4194304,"blocks":["ad0dcb3339d64526564c10379cc026a2f595f9ed7642199104eb0c0ffebccc35"]},"offset":"15646925"},"ToInt32.js":{"size":173,"integrity":{"algorithm":"SHA256","hash":"e0c77696079335a016ce39e9992f11939ad25c1b322d119eedbec24a989a50a6","blockSize":4194304,"blocks":["e0c77696079335a016ce39e9992f11939ad25c1b322d119eedbec24a989a50a6"]},"offset":"15647185"},"ToInt8.js":{"size":247,"integrity":{"algorithm":"SHA256","hash":"0f844398064a22ca49a1c263a564e15449de26b5114281211d3de3535d914336","blockSize":4194304,"blocks":["0f844398064a22ca49a1c263a564e15449de26b5114281211d3de3535d914336"]},"offset":"15647358"},"ToInteger.js":{"size":273,"integrity":{"algorithm":"SHA256","hash":"b07f58c5193a820640f1169bdf1a38dee1c1eb863d5874294d9afa5438bdb274","blockSize":4194304,"blocks":["b07f58c5193a820640f1169bdf1a38dee1c1eb863d5874294d9afa5438bdb274"]},"offset":"15647605"},"ToLength.js":{"size":332,"integrity":{"algorithm":"SHA256","hash":"b4faf0dcbfc133417e965670ef8bf4071f0c323400c32f5cc528a3bc957e8fe5","blockSize":4194304,"blocks":["b4faf0dcbfc133417e965670ef8bf4071f0c323400c32f5cc528a3bc957e8fe5"]},"offset":"15647878"},"ToNumber.js":{"size":2015,"integrity":{"algorithm":"SHA256","hash":"e0eac78353a093abb2717666f27ebebc1a9e48caa98950b7fb4cf9dadde4ab7c","blockSize":4194304,"blocks":["e0eac78353a093abb2717666f27ebebc1a9e48caa98950b7fb4cf9dadde4ab7c"]},"offset":"15648210"},"ToObject.js":{"size":334,"integrity":{"algorithm":"SHA256","hash":"2c382673870deb89e3b19511d8f08fa9554d103fa9d143e5a57b79d85a093725","blockSize":4194304,"blocks":["2c382673870deb89e3b19511d8f08fa9554d103fa9d143e5a57b79d85a093725"]},"offset":"15650225"},"ToPrimitive.js":{"size":287,"integrity":{"algorithm":"SHA256","hash":"fe27d95fe99afd38d780e7d88f349e1dc1a68841b845e118abb8c80c4ab9aa53","blockSize":4194304,"blocks":["fe27d95fe99afd38d780e7d88f349e1dc1a68841b845e118abb8c80c4ab9aa53"]},"offset":"15650559"},"ToPropertyDescriptor.js":{"size":1452,"integrity":{"algorithm":"SHA256","hash":"78b5dfba0830bc47aa55c1b33f2be8fd973ff5ccc87a599abadda676d3596c49","blockSize":4194304,"blocks":["78b5dfba0830bc47aa55c1b33f2be8fd973ff5ccc87a599abadda676d3596c49"]},"offset":"15650846"},"ToPropertyKey.js":{"size":405,"integrity":{"algorithm":"SHA256","hash":"58d4355f4509a456b237e1d72169200edb1810d1efa9ee167ac26faa7904edd3","blockSize":4194304,"blocks":["58d4355f4509a456b237e1d72169200edb1810d1efa9ee167ac26faa7904edd3"]},"offset":"15652298"},"ToString.js":{"size":396,"integrity":{"algorithm":"SHA256","hash":"79c26e024582b6ac70a965063b757c70ceea15fa8da17a78ebbf77b40ccaece3","blockSize":4194304,"blocks":["79c26e024582b6ac70a965063b757c70ceea15fa8da17a78ebbf77b40ccaece3"]},"offset":"15652703"},"ToUint16.js":{"size":564,"integrity":{"algorithm":"SHA256","hash":"5775f0384586a383c5dd6c359e37d4b218c8ddf069d7a2906f7e4752ab66a20d","blockSize":4194304,"blocks":["5775f0384586a383c5dd6c359e37d4b218c8ddf069d7a2906f7e4752ab66a20d"]},"offset":"15653099"},"ToUint32.js":{"size":175,"integrity":{"algorithm":"SHA256","hash":"b68209f8fb9d1e978fe3d162251bba47f056c43ec7028cbd99b485800bd62315","blockSize":4194304,"blocks":["b68209f8fb9d1e978fe3d162251bba47f056c43ec7028cbd99b485800bd62315"]},"offset":"15653663"},"ToUint8.js":{"size":578,"integrity":{"algorithm":"SHA256","hash":"94fa392bda40d5d6c1125b662b304a372b135660d3740eebae7ade568bdd52a9","blockSize":4194304,"blocks":["94fa392bda40d5d6c1125b662b304a372b135660d3740eebae7ade568bdd52a9"]},"offset":"15653838"},"ToUint8Clamp.js":{"size":522,"integrity":{"algorithm":"SHA256","hash":"30dd3065a73ef4ff1f0a018ce80bd550673e5ee29c732e6fc8cade4661f80d56","blockSize":4194304,"blocks":["30dd3065a73ef4ff1f0a018ce80bd550673e5ee29c732e6fc8cade4661f80d56"]},"offset":"15654416"},"Type.js":{"size":249,"integrity":{"algorithm":"SHA256","hash":"a9812c431dc51253d8d3bd637842b22534f87a1f1006d2266c824488d068305d","blockSize":4194304,"blocks":["a9812c431dc51253d8d3bd637842b22534f87a1f1006d2266c824488d068305d"]},"offset":"15654938"},"UTF16Decode.js":{"size":823,"integrity":{"algorithm":"SHA256","hash":"66b054809f1121de679d732a62bfa5c258806147b7fa6ed473a4ce5f56b70e61","blockSize":4194304,"blocks":["66b054809f1121de679d732a62bfa5c258806147b7fa6ed473a4ce5f56b70e61"]},"offset":"15655187"},"UTF16Encoding.js":{"size":700,"integrity":{"algorithm":"SHA256","hash":"4a84fe0de13660a11bc7f0e2ccdb5611e6767e0f40b20a16c335db7316cf369f","blockSize":4194304,"blocks":["4a84fe0de13660a11bc7f0e2ccdb5611e6767e0f40b20a16c335db7316cf369f"]},"offset":"15656010"},"UnicodeEscape.js":{"size":846,"integrity":{"algorithm":"SHA256","hash":"b9143323e7790683229c6ce9a1f93fbd5b17e22b966679f602b066d9371fe813","blockSize":4194304,"blocks":["b9143323e7790683229c6ce9a1f93fbd5b17e22b966679f602b066d9371fe813"]},"offset":"15656710"},"ValidateAndApplyPropertyDescriptor.js":{"size":5243,"integrity":{"algorithm":"SHA256","hash":"588f81f21e07a8d2255bc0aed34c94052aa74d5b558edc4435d0acee12c90554","blockSize":4194304,"blocks":["588f81f21e07a8d2255bc0aed34c94052aa74d5b558edc4435d0acee12c90554"]},"offset":"15657556"},"WeekDay.js":{"size":208,"integrity":{"algorithm":"SHA256","hash":"f7cc798c72dcc484295681d29d535e64215a9ec303f4f6e6456ea63e83ce0246","blockSize":4194304,"blocks":["f7cc798c72dcc484295681d29d535e64215a9ec303f4f6e6456ea63e83ce0246"]},"offset":"15662799"},"YearFromTime.js":{"size":407,"integrity":{"algorithm":"SHA256","hash":"5562b7fd6be438187a1187a331f0d310e631e9747df14521accc7a797e2a2aa7","blockSize":4194304,"blocks":["5562b7fd6be438187a1187a331f0d310e631e9747df14521accc7a797e2a2aa7"]},"offset":"15663007"},"abs.js":{"size":207,"integrity":{"algorithm":"SHA256","hash":"a50e248c29238747c3c278a4edf2c0643f1295d1c065d9dff8524def17f0427f","blockSize":4194304,"blocks":["a50e248c29238747c3c278a4edf2c0643f1295d1c065d9dff8524def17f0427f"]},"offset":"15663414"},"floor.js":{"size":217,"integrity":{"algorithm":"SHA256","hash":"90c20830ae8762224c83fb0ed36a288a7d567f57d3b5acb469590cc2d5e13f55","blockSize":4194304,"blocks":["90c20830ae8762224c83fb0ed36a288a7d567f57d3b5acb469590cc2d5e13f55"]},"offset":"15663621"},"modulo.js":{"size":168,"integrity":{"algorithm":"SHA256","hash":"84923b64427edcc840ee9a305dca213f4bf1e04ed8f88f6bfd7bfa9e655d7c98","blockSize":4194304,"blocks":["84923b64427edcc840ee9a305dca213f4bf1e04ed8f88f6bfd7bfa9e655d7c98"]},"offset":"15663838"},"msFromTime.js":{"size":253,"integrity":{"algorithm":"SHA256","hash":"ef13a7e7721d695f125a7e772f8037ed34aa3c97aaa3692da900c6796cd270da","blockSize":4194304,"blocks":["ef13a7e7721d695f125a7e772f8037ed34aa3c97aaa3692da900c6796cd270da"]},"offset":"15664006"},"thisBooleanValue.js":{"size":367,"integrity":{"algorithm":"SHA256","hash":"171bd884e07701d9e37bece81b05a95fd7d822ff7eaaba5c112d6e3a352ad498","blockSize":4194304,"blocks":["171bd884e07701d9e37bece81b05a95fd7d822ff7eaaba5c112d6e3a352ad498"]},"offset":"15664259"},"thisNumberValue.js":{"size":390,"integrity":{"algorithm":"SHA256","hash":"a3bb9eb733e74de8a50f49e4425e57fd01bebbf66df4f9967da3d9edee589455","blockSize":4194304,"blocks":["a3bb9eb733e74de8a50f49e4425e57fd01bebbf66df4f9967da3d9edee589455"]},"offset":"15664626"},"thisStringValue.js":{"size":361,"integrity":{"algorithm":"SHA256","hash":"47305af763f963ab1c547011b6be408827678d61540009de579bf996d0810ff5","blockSize":4194304,"blocks":["47305af763f963ab1c547011b6be408827678d61540009de579bf996d0810ff5"]},"offset":"15665016"},"thisSymbolValue.js":{"size":514,"integrity":{"algorithm":"SHA256","hash":"27b446ef7c0dcc60f576357f187bb9af1a86d6557ab82a144d2390e793dc94db","blockSize":4194304,"blocks":["27b446ef7c0dcc60f576357f187bb9af1a86d6557ab82a144d2390e793dc94db"]},"offset":"15665377"},"thisTimeValue.js":{"size":267,"integrity":{"algorithm":"SHA256","hash":"4530f2d9e41738da88d10de84862a02fa1b34d5a704206d8deb5a151f26a87b8","blockSize":4194304,"blocks":["4530f2d9e41738da88d10de84862a02fa1b34d5a704206d8deb5a151f26a87b8"]},"offset":"15665891"}}},"2019":{"files":{"AbstractEqualityComparison.js":{"size":1154,"integrity":{"algorithm":"SHA256","hash":"b95b9c6c6a99532fe37e1d0fa948bbe700ecc013b045034afb1a5db6a39026db","blockSize":4194304,"blocks":["b95b9c6c6a99532fe37e1d0fa948bbe700ecc013b045034afb1a5db6a39026db"]},"offset":"15453287"},"AbstractRelationalComparison.js":{"size":1533,"integrity":{"algorithm":"SHA256","hash":"c10e5bb769369bfa15f2444c3ee1397589050ed4402b8c6be50c203fae67cba3","blockSize":4194304,"blocks":["c10e5bb769369bfa15f2444c3ee1397589050ed4402b8c6be50c203fae67cba3"]},"offset":"15454441"},"AddEntriesFromIterable.js":{"size":1519,"integrity":{"algorithm":"SHA256","hash":"a2a37224988c05e3ab0b313d3e2cba70be3ff20e71b6df11edc71fd7b6040192","blockSize":4194304,"blocks":["a2a37224988c05e3ab0b313d3e2cba70be3ff20e71b6df11edc71fd7b6040192"]},"offset":"15455974"},"AdvanceStringIndex.js":{"size":1305,"integrity":{"algorithm":"SHA256","hash":"021f64d34615e95873eab825aa0353ee281db9bb6d1d7436fb77a45f9cd9a296","blockSize":4194304,"blocks":["021f64d34615e95873eab825aa0353ee281db9bb6d1d7436fb77a45f9cd9a296"]},"offset":"15457493"},"ArrayCreate.js":{"size":1650,"integrity":{"algorithm":"SHA256","hash":"6cde465e8db30b2ba485412ac2912f04a6212b3effdd37d0f3a9894af999ba9b","blockSize":4194304,"blocks":["6cde465e8db30b2ba485412ac2912f04a6212b3effdd37d0f3a9894af999ba9b"]},"offset":"15458798"},"ArraySetLength.js":{"size":2665,"integrity":{"algorithm":"SHA256","hash":"4b07de7693377557e2f05bf21ea871ff235ce1121e0e95846f5639fa5cc3ebb1","blockSize":4194304,"blocks":["4b07de7693377557e2f05bf21ea871ff235ce1121e0e95846f5639fa5cc3ebb1"]},"offset":"15460448"},"ArraySpeciesCreate.js":{"size":1348,"integrity":{"algorithm":"SHA256","hash":"246aed3dfe50be7dcbd5b25934dd6c74bff25b66de39dcc70335e6d668cc480b","blockSize":4194304,"blocks":["246aed3dfe50be7dcbd5b25934dd6c74bff25b66de39dcc70335e6d668cc480b"]},"offset":"15463113"},"Call.js":{"size":623,"integrity":{"algorithm":"SHA256","hash":"b092006d05bceeccee48bdf3fde9d83ee54a156eb2841bf5cacdca9f157b4571","blockSize":4194304,"blocks":["b092006d05bceeccee48bdf3fde9d83ee54a156eb2841bf5cacdca9f157b4571"]},"offset":"15464461"},"CanonicalNumericIndexString.js":{"size":654,"integrity":{"algorithm":"SHA256","hash":"c850cc1637b82f4fc238d2ae1a45229e8d44bc5c9b85205c0f27a1e0e9bb9d2b","blockSize":4194304,"blocks":["c850cc1637b82f4fc238d2ae1a45229e8d44bc5c9b85205c0f27a1e0e9bb9d2b"]},"offset":"15465084"},"CharacterRange.js":{"size":782,"integrity":{"algorithm":"SHA256","hash":"49612101e544a9b707f116ac8fe2be0d2c559c1d3b4f94ba47f36832913ea11f","blockSize":4194304,"blocks":["49612101e544a9b707f116ac8fe2be0d2c559c1d3b4f94ba47f36832913ea11f"]},"offset":"15465738"},"CompletePropertyDescriptor.js":{"size":989,"integrity":{"algorithm":"SHA256","hash":"17825d14da6797c52aa699d7b089bc2370d5a899cb7af7e3485f948fde50fca2","blockSize":4194304,"blocks":["17825d14da6797c52aa699d7b089bc2370d5a899cb7af7e3485f948fde50fca2"]},"offset":"15466520"},"CopyDataProperties.js":{"size":1992,"integrity":{"algorithm":"SHA256","hash":"fa2bcc3169a61cdc29d99edcf9ff209e206a695b47d478e8b90daff5e6ceb84e","blockSize":4194304,"blocks":["fa2bcc3169a61cdc29d99edcf9ff209e206a695b47d478e8b90daff5e6ceb84e"]},"offset":"15467509"},"CreateDataProperty.js":{"size":1279,"integrity":{"algorithm":"SHA256","hash":"5006509a3f5567f81cb7f730448a0a492c64c7f06406627c58d0334dde5e44f9","blockSize":4194304,"blocks":["5006509a3f5567f81cb7f730448a0a492c64c7f06406627c58d0334dde5e44f9"]},"offset":"15469501"},"CreateDataPropertyOrThrow.js":{"size":734,"integrity":{"algorithm":"SHA256","hash":"50c61c792c27d661346cfb29fe5b7603a2713d7acb1dc5b3b35fe71ece8fd18e","blockSize":4194304,"blocks":["50c61c792c27d661346cfb29fe5b7603a2713d7acb1dc5b3b35fe71ece8fd18e"]},"offset":"15470780"},"CreateHTML.js":{"size":927,"integrity":{"algorithm":"SHA256","hash":"5b9cf63f6b4bc50077e333c2b310cbd4c85a97891b2e1d28a93aeeb4370c2930","blockSize":4194304,"blocks":["5b9cf63f6b4bc50077e333c2b310cbd4c85a97891b2e1d28a93aeeb4370c2930"]},"offset":"15471514"},"CreateIterResultObject.js":{"size":432,"integrity":{"algorithm":"SHA256","hash":"289a26996866dba6f6292ba0931e643c7a5851f21003d41e5a004862a03a2035","blockSize":4194304,"blocks":["289a26996866dba6f6292ba0931e643c7a5851f21003d41e5a004862a03a2035"]},"offset":"15472441"},"CreateListFromArrayLike.js":{"size":1354,"integrity":{"algorithm":"SHA256","hash":"59bff81b54528dca9de105511851d1af4ee78c476453991e93ddde3b29e0a0ff","blockSize":4194304,"blocks":["59bff81b54528dca9de105511851d1af4ee78c476453991e93ddde3b29e0a0ff"]},"offset":"15472873"},"CreateMethodProperty.js":{"size":979,"integrity":{"algorithm":"SHA256","hash":"117c68b2fa6825c31e8d6f4970973fddf09fd74506447ca22ed3cfc2ed8b04e8","blockSize":4194304,"blocks":["117c68b2fa6825c31e8d6f4970973fddf09fd74506447ca22ed3cfc2ed8b04e8"]},"offset":"15474227"},"DateFromTime.js":{"size":1036,"integrity":{"algorithm":"SHA256","hash":"ae437cb5ee92b162e18b6f47b9dd66b66f627547e098a0670d60c2572f04b1ed","blockSize":4194304,"blocks":["ae437cb5ee92b162e18b6f47b9dd66b66f627547e098a0670d60c2572f04b1ed"]},"offset":"15475206"},"DateString.js":{"size":1055,"integrity":{"algorithm":"SHA256","hash":"9dde544576a4c552c56ee5f102459d4e3ca28bb800ccba833b53bd159d1e864a","blockSize":4194304,"blocks":["9dde544576a4c552c56ee5f102459d4e3ca28bb800ccba833b53bd159d1e864a"]},"offset":"15476242"},"Day.js":{"size":234,"integrity":{"algorithm":"SHA256","hash":"ff3875a46c34886cff3808ab1c4de6d3b45a61e9638b32edd22f41277c153ea5","blockSize":4194304,"blocks":["ff3875a46c34886cff3808ab1c4de6d3b45a61e9638b32edd22f41277c153ea5"]},"offset":"15477297"},"DayFromYear.js":{"size":256,"integrity":{"algorithm":"SHA256","hash":"378eb638143e86cfa3061177986dcfdb6bdec76e8b799b95cf3b9cafc5e9af68","blockSize":4194304,"blocks":["378eb638143e86cfa3061177986dcfdb6bdec76e8b799b95cf3b9cafc5e9af68"]},"offset":"15477531"},"DayWithinYear.js":{"size":286,"integrity":{"algorithm":"SHA256","hash":"b1ac5824fb1ced3e9d2dae99db5bd3890b4ef25dc45e50a4f927384bb5be618e","blockSize":4194304,"blocks":["b1ac5824fb1ced3e9d2dae99db5bd3890b4ef25dc45e50a4f927384bb5be618e"]},"offset":"15477787"},"DaysInYear.js":{"size":301,"integrity":{"algorithm":"SHA256","hash":"3f5955b3d1831ed2d008ae052a802b12c22bf1ba6d8fd286e0cb7a6a77144aec","blockSize":4194304,"blocks":["3f5955b3d1831ed2d008ae052a802b12c22bf1ba6d8fd286e0cb7a6a77144aec"]},"offset":"15478073"},"DefinePropertyOrThrow.js":{"size":1466,"integrity":{"algorithm":"SHA256","hash":"1964ecd5b9e64b3ddb203ac7da3410e09a2b1d0ab9b1f06733af8ea15ae954a4","blockSize":4194304,"blocks":["1964ecd5b9e64b3ddb203ac7da3410e09a2b1d0ab9b1f06733af8ea15ae954a4"]},"offset":"15478374"},"DeletePropertyOrThrow.js":{"size":699,"integrity":{"algorithm":"SHA256","hash":"3c1ac659ec4eb7ad97e99c2c3d08c2058624eec2ac0bcca0583660a0fe69f1c5","blockSize":4194304,"blocks":["3c1ac659ec4eb7ad97e99c2c3d08c2058624eec2ac0bcca0583660a0fe69f1c5"]},"offset":"15479840"},"EnumerableOwnPropertyNames.js":{"size":1112,"integrity":{"algorithm":"SHA256","hash":"d389393a016c32c0b737581f924aad9edb42291b1f869bb514f5521f31a4a198","blockSize":4194304,"blocks":["d389393a016c32c0b737581f924aad9edb42291b1f869bb514f5521f31a4a198"]},"offset":"15480539"},"FlattenIntoArray.js":{"size":1740,"integrity":{"algorithm":"SHA256","hash":"55feaff99a8c7f2421300bbc1c00ad350748f45217f8de70059a58154be0f648","blockSize":4194304,"blocks":["55feaff99a8c7f2421300bbc1c00ad350748f45217f8de70059a58154be0f648"]},"offset":"15481651"},"FromPropertyDescriptor.js":{"size":450,"integrity":{"algorithm":"SHA256","hash":"a16798c55be7b402fc2b27d4d422f322c40639b7403d47cb897b576fcc1ddd49","blockSize":4194304,"blocks":["a16798c55be7b402fc2b27d4d422f322c40639b7403d47cb897b576fcc1ddd49"]},"offset":"15483391"},"Get.js":{"size":602,"integrity":{"algorithm":"SHA256","hash":"ef9a4a39b94f3287d0c9ed27b9a5f1cb71164d2184d6aaf2fc5900fd44016ff9","blockSize":4194304,"blocks":["ef9a4a39b94f3287d0c9ed27b9a5f1cb71164d2184d6aaf2fc5900fd44016ff9"]},"offset":"15483841"},"GetIterator.js":{"size":856,"integrity":{"algorithm":"SHA256","hash":"6fd952f51c6137a0ef8aab1074a42011584da628da9360176b107dcf91979355","blockSize":4194304,"blocks":["6fd952f51c6137a0ef8aab1074a42011584da628da9360176b107dcf91979355"]},"offset":"15484443"},"GetMethod.js":{"size":663,"integrity":{"algorithm":"SHA256","hash":"87f8829531af6b2019ed31d44f2efcf89e8bf345c158ad6bd790f8e14028d325","blockSize":4194304,"blocks":["87f8829531af6b2019ed31d44f2efcf89e8bf345c158ad6bd790f8e14028d325"]},"offset":"15485299"},"GetOwnPropertyKeys.js":{"size":829,"integrity":{"algorithm":"SHA256","hash":"7ad04a3a175ede6b7d15611717a20c2bc6a09bef382f8b4f7d985e5b2e1e7120","blockSize":4194304,"blocks":["7ad04a3a175ede6b7d15611717a20c2bc6a09bef382f8b4f7d985e5b2e1e7120"]},"offset":"15485962"},"GetPrototypeFromConstructor.js":{"size":921,"integrity":{"algorithm":"SHA256","hash":"da1c30c8d5b331e72618af4ccc18b5f3ed89b36e9be117c74a4ee9266141ba56","blockSize":4194304,"blocks":["da1c30c8d5b331e72618af4ccc18b5f3ed89b36e9be117c74a4ee9266141ba56"]},"offset":"15486791"},"GetSubstitution.js":{"size":4417,"integrity":{"algorithm":"SHA256","hash":"680e2598750e34c1fa62e010a01503f52c3b8a58c7f790985d91ef2a0dc35d60","blockSize":4194304,"blocks":["680e2598750e34c1fa62e010a01503f52c3b8a58c7f790985d91ef2a0dc35d60"]},"offset":"15487712"},"GetV.js":{"size":474,"integrity":{"algorithm":"SHA256","hash":"66909f7192a6bddc6fb77163f6182164ebef641f0f4c595835485eda6cfd3443","blockSize":4194304,"blocks":["66909f7192a6bddc6fb77163f6182164ebef641f0f4c595835485eda6cfd3443"]},"offset":"15492129"},"HasOwnProperty.js":{"size":553,"integrity":{"algorithm":"SHA256","hash":"b099b2f9829fe64e25740771abc3d3c4e1c801ce0cd2ccecf6041ad08d59364d","blockSize":4194304,"blocks":["b099b2f9829fe64e25740771abc3d3c4e1c801ce0cd2ccecf6041ad08d59364d"]},"offset":"15492603"},"HasProperty.js":{"size":517,"integrity":{"algorithm":"SHA256","hash":"7889a3e2b191509b3d6c0bfcabbad2a915919a2caa275b696a12eab4ebd9cdac","blockSize":4194304,"blocks":["7889a3e2b191509b3d6c0bfcabbad2a915919a2caa275b696a12eab4ebd9cdac"]},"offset":"15493156"},"HourFromTime.js":{"size":382,"integrity":{"algorithm":"SHA256","hash":"338503d8b54967fb22e0659243cab7fc283f023561a8a3316df8b4de588bddf9","blockSize":4194304,"blocks":["338503d8b54967fb22e0659243cab7fc283f023561a8a3316df8b4de588bddf9"]},"offset":"15493673"},"InLeapYear.js":{"size":510,"integrity":{"algorithm":"SHA256","hash":"d9abbf0c4b80df1fd7cb31830f222eb4b6bbe638dcfa3461809905158f2ce0a6","blockSize":4194304,"blocks":["d9abbf0c4b80df1fd7cb31830f222eb4b6bbe638dcfa3461809905158f2ce0a6"]},"offset":"15494055"},"InstanceofOperator.js":{"size":918,"integrity":{"algorithm":"SHA256","hash":"af702715d893f635ff66441f9638a4dc977789c505a50ae17f7e02b05b2549d6","blockSize":4194304,"blocks":["af702715d893f635ff66441f9638a4dc977789c505a50ae17f7e02b05b2549d6"]},"offset":"15494565"},"Invoke.js":{"size":715,"integrity":{"algorithm":"SHA256","hash":"ff016550d8adf9608b2f4ab258017c1582ce717a2e2b3bd2b7a94440f7f19f8f","blockSize":4194304,"blocks":["ff016550d8adf9608b2f4ab258017c1582ce717a2e2b3bd2b7a94440f7f19f8f"]},"offset":"15495483"},"IsAccessorDescriptor.js":{"size":465,"integrity":{"algorithm":"SHA256","hash":"425c74a892b6bb2d1dc6c56e7a6e77e40b9c4d4390480fafe4c804cea53a80ad","blockSize":4194304,"blocks":["425c74a892b6bb2d1dc6c56e7a6e77e40b9c4d4390480fafe4c804cea53a80ad"]},"offset":"15496198"},"IsArray.js":{"size":123,"integrity":{"algorithm":"SHA256","hash":"a8f01a797e05a74501ceb9293408f72bded2a08013c6a075f582737003b443f4","blockSize":4194304,"blocks":["a8f01a797e05a74501ceb9293408f72bded2a08013c6a075f582737003b443f4"]},"offset":"15496663"},"IsCallable.js":{"size":108,"integrity":{"algorithm":"SHA256","hash":"789ba0a1f176c56862f16b2ff7bc3eeaaa02676f75be073a46c92c5e8af21170","blockSize":4194304,"blocks":["789ba0a1f176c56862f16b2ff7bc3eeaaa02676f75be073a46c92c5e8af21170"]},"offset":"15496786"},"IsCompatiblePropertyDescriptor.js":{"size":367,"integrity":{"algorithm":"SHA256","hash":"f9736fde486f1f27112126908c39423b2b3b946a96d5e2a4d762b3139da17543","blockSize":4194304,"blocks":["f9736fde486f1f27112126908c39423b2b3b946a96d5e2a4d762b3139da17543"]},"offset":"15496894"},"IsConcatSpreadable.js":{"size":626,"integrity":{"algorithm":"SHA256","hash":"7a4c3cae4f5de1b8cbc5694ac320cfaaf30f4ecbe2754e2ffb3f72fb42763a8a","blockSize":4194304,"blocks":["7a4c3cae4f5de1b8cbc5694ac320cfaaf30f4ecbe2754e2ffb3f72fb42763a8a"]},"offset":"15497261"},"IsConstructor.js":{"size":1149,"integrity":{"algorithm":"SHA256","hash":"1a58d54e8aec9ecbfaf3e75d9b38ef06c8a3c948e337cca159a17a102ee41929","blockSize":4194304,"blocks":["1a58d54e8aec9ecbfaf3e75d9b38ef06c8a3c948e337cca159a17a102ee41929"]},"offset":"15497887"},"IsDataDescriptor.js":{"size":464,"integrity":{"algorithm":"SHA256","hash":"35a0862d76e9d765d5fa4154250ed5ac440f4238432a773f22c288da3886e1ce","blockSize":4194304,"blocks":["35a0862d76e9d765d5fa4154250ed5ac440f4238432a773f22c288da3886e1ce"]},"offset":"15499036"},"IsExtensible.js":{"size":509,"integrity":{"algorithm":"SHA256","hash":"e28d0530ae66f0dfb8fa90c492fd6242a44ea7eff298d1ed4c10eac9fdfc8efb","blockSize":4194304,"blocks":["e28d0530ae66f0dfb8fa90c492fd6242a44ea7eff298d1ed4c10eac9fdfc8efb"]},"offset":"15499500"},"IsGenericDescriptor.js":{"size":560,"integrity":{"algorithm":"SHA256","hash":"b9d31ec0ad5beaea6a7d9f1180d67ef8f45b164234deeee14c362c8eb2e135cc","blockSize":4194304,"blocks":["b9d31ec0ad5beaea6a7d9f1180d67ef8f45b164234deeee14c362c8eb2e135cc"]},"offset":"15500009"},"IsInteger.js":{"size":450,"integrity":{"algorithm":"SHA256","hash":"84893768eabe51d4073d48aeb5cf43cfdba3a1c6223da13b0a73f802033ff6e2","blockSize":4194304,"blocks":["84893768eabe51d4073d48aeb5cf43cfdba3a1c6223da13b0a73f802033ff6e2"]},"offset":"15500569"},"IsPromise.js":{"size":485,"integrity":{"algorithm":"SHA256","hash":"9f4e5aef10bca5119fab546b4834e48b776d14a775f55524cd3512c4321a1e7c","blockSize":4194304,"blocks":["9f4e5aef10bca5119fab546b4834e48b776d14a775f55524cd3512c4321a1e7c"]},"offset":"15501019"},"IsPropertyKey.js":{"size":207,"integrity":{"algorithm":"SHA256","hash":"577d849187a0e8ef526a6368eb6757f6a128db792cf9ade6dfc6c82a75d155c3","blockSize":4194304,"blocks":["577d849187a0e8ef526a6368eb6757f6a128db792cf9ade6dfc6c82a75d155c3"]},"offset":"15501504"},"IsRegExp.js":{"size":545,"integrity":{"algorithm":"SHA256","hash":"1183cff5c42c2cf9a0b3fbb62d4a7f842b56c1141209c683f0116715bcf03c15","blockSize":4194304,"blocks":["1183cff5c42c2cf9a0b3fbb62d4a7f842b56c1141209c683f0116715bcf03c15"]},"offset":"15501711"},"IsSharedArrayBuffer.js":{"size":461,"integrity":{"algorithm":"SHA256","hash":"9451dbf3ee8a39a73e3e2315f48495288b29521576f0539d18c56fc4b6d85012","blockSize":4194304,"blocks":["9451dbf3ee8a39a73e3e2315f48495288b29521576f0539d18c56fc4b6d85012"]},"offset":"15502256"},"IsStringPrefix.js":{"size":940,"integrity":{"algorithm":"SHA256","hash":"9eb0f4ccb63d074f4ff299f92db9a4b4b821d69d865784956e0a0ddc627aa5fa","blockSize":4194304,"blocks":["9eb0f4ccb63d074f4ff299f92db9a4b4b821d69d865784956e0a0ddc627aa5fa"]},"offset":"15502717"},"IterableToList.js":{"size":619,"integrity":{"algorithm":"SHA256","hash":"f422d72db0996e2cb6f6845736ea1ea2198d8a9111d79393c12d89bcb50b1876","blockSize":4194304,"blocks":["f422d72db0996e2cb6f6845736ea1ea2198d8a9111d79393c12d89bcb50b1876"]},"offset":"15503657"},"IteratorClose.js":{"size":1481,"integrity":{"algorithm":"SHA256","hash":"52b100a8cc0ecb7b5d5c7346e20d23c7503c832525650b3269f40f6b98948cae","blockSize":4194304,"blocks":["52b100a8cc0ecb7b5d5c7346e20d23c7503c832525650b3269f40f6b98948cae"]},"offset":"15504276"},"IteratorComplete.js":{"size":498,"integrity":{"algorithm":"SHA256","hash":"41ad3ddb0114bfd56e3e67508633496d4ae672eeb47767f12ae0dacdd91d39b5","blockSize":4194304,"blocks":["41ad3ddb0114bfd56e3e67508633496d4ae672eeb47767f12ae0dacdd91d39b5"]},"offset":"15505757"},"IteratorNext.js":{"size":493,"integrity":{"algorithm":"SHA256","hash":"a6ee567a6387448b0140aceffae4ad1ccdd427537d6926716c3f686367098d30","blockSize":4194304,"blocks":["a6ee567a6387448b0140aceffae4ad1ccdd427537d6926716c3f686367098d30"]},"offset":"15506255"},"IteratorStep.js":{"size":353,"integrity":{"algorithm":"SHA256","hash":"22dbe3c1e07083538804e0bc79a4615d97ae6b49978623594f81e9ffd0ad0594","blockSize":4194304,"blocks":["22dbe3c1e07083538804e0bc79a4615d97ae6b49978623594f81e9ffd0ad0594"]},"offset":"15506748"},"IteratorValue.js":{"size":443,"integrity":{"algorithm":"SHA256","hash":"674abbe8978a08b6d6d6ae53a7c3aca04395c6a3e5d97807204fcfaf81fafd68","blockSize":4194304,"blocks":["674abbe8978a08b6d6d6ae53a7c3aca04395c6a3e5d97807204fcfaf81fafd68"]},"offset":"15507101"},"MakeDate.js":{"size":328,"integrity":{"algorithm":"SHA256","hash":"41a9b9da3ede4effd12c43e1c25851b5005623f5eb6dee707252cbe373b32ef0","blockSize":4194304,"blocks":["41a9b9da3ede4effd12c43e1c25851b5005623f5eb6dee707252cbe373b32ef0"]},"offset":"15507544"},"MakeDay.js":{"size":917,"integrity":{"algorithm":"SHA256","hash":"83e8e606e0e1ed2ad5b864a20459f8ce10aac6a653af26c12cd6cbc087da53e9","blockSize":4194304,"blocks":["83e8e606e0e1ed2ad5b864a20459f8ce10aac6a653af26c12cd6cbc087da53e9"]},"offset":"15507872"},"MakeTime.js":{"size":698,"integrity":{"algorithm":"SHA256","hash":"f91ad37ec6587e1debbe2be4f1bb86f4936df8e4649af2e33fe14023ed9f6da7","blockSize":4194304,"blocks":["f91ad37ec6587e1debbe2be4f1bb86f4936df8e4649af2e33fe14023ed9f6da7"]},"offset":"15508789"},"MinFromTime.js":{"size":396,"integrity":{"algorithm":"SHA256","hash":"88e77ac8a1b1aae30fe064057ed6699c3c3b176ec1ab0533893be6d1c7ba856a","blockSize":4194304,"blocks":["88e77ac8a1b1aae30fe064057ed6699c3c3b176ec1ab0533893be6d1c7ba856a"]},"offset":"15509487"},"MonthFromTime.js":{"size":1014,"integrity":{"algorithm":"SHA256","hash":"f7acafe967a838eb85739ec2afa8dcdc9e5c0734219559259338761a09131909","blockSize":4194304,"blocks":["f7acafe967a838eb85739ec2afa8dcdc9e5c0734219559259338761a09131909"]},"offset":"15509883"},"NumberToString.js":{"size":432,"integrity":{"algorithm":"SHA256","hash":"c8ebca402104dc1e893e1c3416d4a6b46983e36526a70e1993f4572e6d827130","blockSize":4194304,"blocks":["c8ebca402104dc1e893e1c3416d4a6b46983e36526a70e1993f4572e6d827130"]},"offset":"15510897"},"ObjectCreate.js":{"size":1033,"integrity":{"algorithm":"SHA256","hash":"3428357b1183afa802a5aa60b482291d6212cbb99ec01eafd7af91107e1ab4d5","blockSize":4194304,"blocks":["3428357b1183afa802a5aa60b482291d6212cbb99ec01eafd7af91107e1ab4d5"]},"offset":"15511329"},"ObjectDefineProperties.js":{"size":1508,"integrity":{"algorithm":"SHA256","hash":"672b0bda371a4710bf8e7c99cfc41eca1920c10fad584755be76cd5ac1136fa5","blockSize":4194304,"blocks":["672b0bda371a4710bf8e7c99cfc41eca1920c10fad584755be76cd5ac1136fa5"]},"offset":"15512362"},"OrdinaryCreateFromConstructor.js":{"size":808,"integrity":{"algorithm":"SHA256","hash":"0f46555a69c89ffefd354541724966d6351a0b910102aa8acc0d1c1ee7dec67a","blockSize":4194304,"blocks":["0f46555a69c89ffefd354541724966d6351a0b910102aa8acc0d1c1ee7dec67a"]},"offset":"15513870"},"OrdinaryDefineOwnProperty.js":{"size":2390,"integrity":{"algorithm":"SHA256","hash":"5aa87d94193a2cc6a19e5ef3e44a4b1e12f99ff6a0cd1755faf0f0338b0e07fd","blockSize":4194304,"blocks":["5aa87d94193a2cc6a19e5ef3e44a4b1e12f99ff6a0cd1755faf0f0338b0e07fd"]},"offset":"15514678"},"OrdinaryGetOwnProperty.js":{"size":1257,"integrity":{"algorithm":"SHA256","hash":"d4ef741d1e026235ef46accf3a1538b3510a81e35eff00e0643e0431f3c71ba8","blockSize":4194304,"blocks":["d4ef741d1e026235ef46accf3a1538b3510a81e35eff00e0643e0431f3c71ba8"]},"offset":"15517068"},"OrdinaryGetPrototypeOf.js":{"size":539,"integrity":{"algorithm":"SHA256","hash":"bf546da8b6ac3f982c55919169b2f07320b7934868dfb3b82c13f38c72b95a0d","blockSize":4194304,"blocks":["bf546da8b6ac3f982c55919169b2f07320b7934868dfb3b82c13f38c72b95a0d"]},"offset":"15518325"},"OrdinaryHasInstance.js":{"size":627,"integrity":{"algorithm":"SHA256","hash":"d36943f8261941e336b58a6d698291eef06aa4d7d44ab5fdffb7d073d50a771c","blockSize":4194304,"blocks":["d36943f8261941e336b58a6d698291eef06aa4d7d44ab5fdffb7d073d50a771c"]},"offset":"15518864"},"OrdinaryHasProperty.js":{"size":531,"integrity":{"algorithm":"SHA256","hash":"cbcf61dec7dc22444d36e89a62324453f98ccff4141e8284e5621b1fd0fbd07b","blockSize":4194304,"blocks":["cbcf61dec7dc22444d36e89a62324453f98ccff4141e8284e5621b1fd0fbd07b"]},"offset":"15519491"},"OrdinarySetPrototypeOf.js":{"size":1050,"integrity":{"algorithm":"SHA256","hash":"9f33c9e0fba4b5605ca95af4f267ed266cfe5a7ec0c5a739353a37d4b5eee5f3","blockSize":4194304,"blocks":["9f33c9e0fba4b5605ca95af4f267ed266cfe5a7ec0c5a739353a37d4b5eee5f3"]},"offset":"15520022"},"OrdinaryToPrimitive.js":{"size":1065,"integrity":{"algorithm":"SHA256","hash":"5f186778e48dd0375388468783d8a0a68bc08a4ff8f190f33bda9d1b4a73e6a8","blockSize":4194304,"blocks":["5f186778e48dd0375388468783d8a0a68bc08a4ff8f190f33bda9d1b4a73e6a8"]},"offset":"15521072"},"PromiseResolve.js":{"size":457,"integrity":{"algorithm":"SHA256","hash":"6914c2768bee4288d16b384871f81aa098119c14fc9fde2977654905ba227d4c","blockSize":4194304,"blocks":["6914c2768bee4288d16b384871f81aa098119c14fc9fde2977654905ba227d4c"]},"offset":"15522137"},"QuoteJSONString.js":{"size":1380,"integrity":{"algorithm":"SHA256","hash":"ffdd0c2ed878be592401278d0ba442c54b5320b133a483a87797abb5bb93d7ee","blockSize":4194304,"blocks":["ffdd0c2ed878be592401278d0ba442c54b5320b133a483a87797abb5bb93d7ee"]},"offset":"15522594"},"RegExpCreate.js":{"size":643,"integrity":{"algorithm":"SHA256","hash":"49da22ccbe85efb7620bfeb7877f2ef8678f1882ade81fcdc3f54567add7ab6b","blockSize":4194304,"blocks":["49da22ccbe85efb7620bfeb7877f2ef8678f1882ade81fcdc3f54567add7ab6b"]},"offset":"15523974"},"RegExpExec.js":{"size":887,"integrity":{"algorithm":"SHA256","hash":"32fbe5fc604aa31efc738c2b617a512114367daffa37a031a3257fe5be493bb9","blockSize":4194304,"blocks":["32fbe5fc604aa31efc738c2b617a512114367daffa37a031a3257fe5be493bb9"]},"offset":"15524617"},"RequireObjectCoercible.js":{"size":70,"integrity":{"algorithm":"SHA256","hash":"25d49a24f231f606c6d8be4760f3795c12f61bda0ac95ad8e452205f97c8e612","blockSize":4194304,"blocks":["25d49a24f231f606c6d8be4760f3795c12f61bda0ac95ad8e452205f97c8e612"]},"offset":"15525504"},"SameValue.js":{"size":307,"integrity":{"algorithm":"SHA256","hash":"e6d99ed6b4a479bed51f697cbc4693a2ff8da0d1e07b5ebf11e74b5404af2ab1","blockSize":4194304,"blocks":["e6d99ed6b4a479bed51f697cbc4693a2ff8da0d1e07b5ebf11e74b5404af2ab1"]},"offset":"15525574"},"SameValueNonNumber.js":{"size":450,"integrity":{"algorithm":"SHA256","hash":"17364939fc9a94d3215beba321f6499a30cf879af8f7bf2f42bdf54c9d7b30a6","blockSize":4194304,"blocks":["17364939fc9a94d3215beba321f6499a30cf879af8f7bf2f42bdf54c9d7b30a6"]},"offset":"15525881"},"SameValueZero.js":{"size":223,"integrity":{"algorithm":"SHA256","hash":"269684a69605b1f7ad04dfccc1519d7905271fd6ae05601a832a2ab8fb7272fc","blockSize":4194304,"blocks":["269684a69605b1f7ad04dfccc1519d7905271fd6ae05601a832a2ab8fb7272fc"]},"offset":"15526331"},"SecFromTime.js":{"size":402,"integrity":{"algorithm":"SHA256","hash":"6263c6176eafa22eadeb7bc054169fd764a3e3aab0cf637110d86110367c8a36","blockSize":4194304,"blocks":["6263c6176eafa22eadeb7bc054169fd764a3e3aab0cf637110d86110367c8a36"]},"offset":"15526554"},"Set.js":{"size":1255,"integrity":{"algorithm":"SHA256","hash":"88389d458aaae848468091535f5e8be59993020e744e998ca3058b59c1943ce8","blockSize":4194304,"blocks":["88389d458aaae848468091535f5e8be59993020e744e998ca3058b59c1943ce8"]},"offset":"15526956"},"SetFunctionLength.js":{"size":1047,"integrity":{"algorithm":"SHA256","hash":"4ce80a1363c6f8b6d873c7d15dc4ea33a0b5120a76ee3a9ac838ab748ca44677","blockSize":4194304,"blocks":["4ce80a1363c6f8b6d873c7d15dc4ea33a0b5120a76ee3a9ac838ab748ca44677"]},"offset":"15528211"},"SetFunctionName.js":{"size":1381,"integrity":{"algorithm":"SHA256","hash":"dabffc283c552e871c8bfd4a4d419e9453056b2b51a23f80f2ff6050c30b09c9","blockSize":4194304,"blocks":["dabffc283c552e871c8bfd4a4d419e9453056b2b51a23f80f2ff6050c30b09c9"]},"offset":"15529258"},"SetIntegrityLevel.js":{"size":1862,"integrity":{"algorithm":"SHA256","hash":"3c04bdc423a594ffec10244025e37e466b5878c4255a53655d445f51584b7d5e","blockSize":4194304,"blocks":["3c04bdc423a594ffec10244025e37e466b5878c4255a53655d445f51584b7d5e"]},"offset":"15530639"},"SpeciesConstructor.js":{"size":844,"integrity":{"algorithm":"SHA256","hash":"826eccbe073d3e7b806cd67e4d4ae09ede6d5ae6125480705b7bf81c2486f175","blockSize":4194304,"blocks":["826eccbe073d3e7b806cd67e4d4ae09ede6d5ae6125480705b7bf81c2486f175"]},"offset":"15532501"},"SplitMatch.js":{"size":874,"integrity":{"algorithm":"SHA256","hash":"316ced53a4420b95079c1160d67c81e52e91173360784bb3a517397420cb6d84","blockSize":4194304,"blocks":["316ced53a4420b95079c1160d67c81e52e91173360784bb3a517397420cb6d84"]},"offset":"15533345"},"StrictEqualityComparison.js":{"size":361,"integrity":{"algorithm":"SHA256","hash":"33928172f049f2f5fd7559470bb12647b7c6012b1da230e5a7e5fd8ffc1dd30e","blockSize":4194304,"blocks":["33928172f049f2f5fd7559470bb12647b7c6012b1da230e5a7e5fd8ffc1dd30e"]},"offset":"15534219"},"StringCreate.js":{"size":1117,"integrity":{"algorithm":"SHA256","hash":"18a70a9279026ea03b811f95a797cde8caf8d77a010880506e0f0b4532a1181d","blockSize":4194304,"blocks":["18a70a9279026ea03b811f95a797cde8caf8d77a010880506e0f0b4532a1181d"]},"offset":"15534580"},"StringGetOwnProperty.js":{"size":1382,"integrity":{"algorithm":"SHA256","hash":"084af8ee1c3326c443d0dcf86199c6deedc61057b08bd870c3e9415a12df78a4","blockSize":4194304,"blocks":["084af8ee1c3326c443d0dcf86199c6deedc61057b08bd870c3e9415a12df78a4"]},"offset":"15535697"},"SymbolDescriptiveString.js":{"size":526,"integrity":{"algorithm":"SHA256","hash":"d5a4e603be41ed5dff7123a6a0ba29efae0812f4d076a78387520b36b416a37d","blockSize":4194304,"blocks":["d5a4e603be41ed5dff7123a6a0ba29efae0812f4d076a78387520b36b416a37d"]},"offset":"15537079"},"TestIntegrityLevel.js":{"size":1285,"integrity":{"algorithm":"SHA256","hash":"8a0161ac60421c4762bc9e442224da95614cdb3e9865bcd79ad29d2310dd35c6","blockSize":4194304,"blocks":["8a0161ac60421c4762bc9e442224da95614cdb3e9865bcd79ad29d2310dd35c6"]},"offset":"15537605"},"TimeClip.js":{"size":468,"integrity":{"algorithm":"SHA256","hash":"bf1f153b35126ac0ebd122717e6349c97e932e3665ff1947f5f4a7da4895cb48","blockSize":4194304,"blocks":["bf1f153b35126ac0ebd122717e6349c97e932e3665ff1947f5f4a7da4895cb48"]},"offset":"15538890"},"TimeFromYear.js":{"size":261,"integrity":{"algorithm":"SHA256","hash":"07bd801ef44bcc4c5458937d6b3c09b1ba6f30d24fbb06ca9b4818c0699c330b","blockSize":4194304,"blocks":["07bd801ef44bcc4c5458937d6b3c09b1ba6f30d24fbb06ca9b4818c0699c330b"]},"offset":"15539358"},"TimeString.js":{"size":808,"integrity":{"algorithm":"SHA256","hash":"92304742e99d2785a471fbb7d92daed5d1e379fdcbbc34f7fe2e8f7f624288ea","blockSize":4194304,"blocks":["92304742e99d2785a471fbb7d92daed5d1e379fdcbbc34f7fe2e8f7f624288ea"]},"offset":"15539619"},"TimeWithinDay.js":{"size":247,"integrity":{"algorithm":"SHA256","hash":"c83b563c9849ca65fb1ed7235f72f42a019fde9e67aad81d1bd0699ed28f43f8","blockSize":4194304,"blocks":["c83b563c9849ca65fb1ed7235f72f42a019fde9e67aad81d1bd0699ed28f43f8"]},"offset":"15540427"},"ToBoolean.js":{"size":130,"integrity":{"algorithm":"SHA256","hash":"36a4823341bd4ec68dd6f4b32afbbc939330a48bf7042108c9be89eaaab5bbc6","blockSize":4194304,"blocks":["36a4823341bd4ec68dd6f4b32afbbc939330a48bf7042108c9be89eaaab5bbc6"]},"offset":"15540674"},"ToDateString.js":{"size":498,"integrity":{"algorithm":"SHA256","hash":"57a5e2f02146ccfa64217595a7b5024fd7a74d9847a5d7df98f6cdaa04335612","blockSize":4194304,"blocks":["57a5e2f02146ccfa64217595a7b5024fd7a74d9847a5d7df98f6cdaa04335612"]},"offset":"15540804"},"ToIndex.js":{"size":668,"integrity":{"algorithm":"SHA256","hash":"27febefdf3eaa534bcbc8c12aac9b73241ba4872e611f8665f962c8d83ff3797","blockSize":4194304,"blocks":["27febefdf3eaa534bcbc8c12aac9b73241ba4872e611f8665f962c8d83ff3797"]},"offset":"15541302"},"ToInt16.js":{"size":260,"integrity":{"algorithm":"SHA256","hash":"ad0dcb3339d64526564c10379cc026a2f595f9ed7642199104eb0c0ffebccc35","blockSize":4194304,"blocks":["ad0dcb3339d64526564c10379cc026a2f595f9ed7642199104eb0c0ffebccc35"]},"offset":"15541970"},"ToInt32.js":{"size":173,"integrity":{"algorithm":"SHA256","hash":"e0c77696079335a016ce39e9992f11939ad25c1b322d119eedbec24a989a50a6","blockSize":4194304,"blocks":["e0c77696079335a016ce39e9992f11939ad25c1b322d119eedbec24a989a50a6"]},"offset":"15542230"},"ToInt8.js":{"size":247,"integrity":{"algorithm":"SHA256","hash":"0f844398064a22ca49a1c263a564e15449de26b5114281211d3de3535d914336","blockSize":4194304,"blocks":["0f844398064a22ca49a1c263a564e15449de26b5114281211d3de3535d914336"]},"offset":"15542403"},"ToInteger.js":{"size":273,"integrity":{"algorithm":"SHA256","hash":"b07f58c5193a820640f1169bdf1a38dee1c1eb863d5874294d9afa5438bdb274","blockSize":4194304,"blocks":["b07f58c5193a820640f1169bdf1a38dee1c1eb863d5874294d9afa5438bdb274"]},"offset":"15542650"},"ToLength.js":{"size":332,"integrity":{"algorithm":"SHA256","hash":"b4faf0dcbfc133417e965670ef8bf4071f0c323400c32f5cc528a3bc957e8fe5","blockSize":4194304,"blocks":["b4faf0dcbfc133417e965670ef8bf4071f0c323400c32f5cc528a3bc957e8fe5"]},"offset":"15542923"},"ToNumber.js":{"size":2015,"integrity":{"algorithm":"SHA256","hash":"e0eac78353a093abb2717666f27ebebc1a9e48caa98950b7fb4cf9dadde4ab7c","blockSize":4194304,"blocks":["e0eac78353a093abb2717666f27ebebc1a9e48caa98950b7fb4cf9dadde4ab7c"]},"offset":"15543255"},"ToObject.js":{"size":334,"integrity":{"algorithm":"SHA256","hash":"2c382673870deb89e3b19511d8f08fa9554d103fa9d143e5a57b79d85a093725","blockSize":4194304,"blocks":["2c382673870deb89e3b19511d8f08fa9554d103fa9d143e5a57b79d85a093725"]},"offset":"15545270"},"ToPrimitive.js":{"size":287,"integrity":{"algorithm":"SHA256","hash":"fe27d95fe99afd38d780e7d88f349e1dc1a68841b845e118abb8c80c4ab9aa53","blockSize":4194304,"blocks":["fe27d95fe99afd38d780e7d88f349e1dc1a68841b845e118abb8c80c4ab9aa53"]},"offset":"15545604"},"ToPropertyDescriptor.js":{"size":1452,"integrity":{"algorithm":"SHA256","hash":"78b5dfba0830bc47aa55c1b33f2be8fd973ff5ccc87a599abadda676d3596c49","blockSize":4194304,"blocks":["78b5dfba0830bc47aa55c1b33f2be8fd973ff5ccc87a599abadda676d3596c49"]},"offset":"15545891"},"ToPropertyKey.js":{"size":405,"integrity":{"algorithm":"SHA256","hash":"58d4355f4509a456b237e1d72169200edb1810d1efa9ee167ac26faa7904edd3","blockSize":4194304,"blocks":["58d4355f4509a456b237e1d72169200edb1810d1efa9ee167ac26faa7904edd3"]},"offset":"15547343"},"ToString.js":{"size":396,"integrity":{"algorithm":"SHA256","hash":"79c26e024582b6ac70a965063b757c70ceea15fa8da17a78ebbf77b40ccaece3","blockSize":4194304,"blocks":["79c26e024582b6ac70a965063b757c70ceea15fa8da17a78ebbf77b40ccaece3"]},"offset":"15547748"},"ToUint16.js":{"size":564,"integrity":{"algorithm":"SHA256","hash":"5775f0384586a383c5dd6c359e37d4b218c8ddf069d7a2906f7e4752ab66a20d","blockSize":4194304,"blocks":["5775f0384586a383c5dd6c359e37d4b218c8ddf069d7a2906f7e4752ab66a20d"]},"offset":"15548144"},"ToUint32.js":{"size":175,"integrity":{"algorithm":"SHA256","hash":"b68209f8fb9d1e978fe3d162251bba47f056c43ec7028cbd99b485800bd62315","blockSize":4194304,"blocks":["b68209f8fb9d1e978fe3d162251bba47f056c43ec7028cbd99b485800bd62315"]},"offset":"15548708"},"ToUint8.js":{"size":578,"integrity":{"algorithm":"SHA256","hash":"94fa392bda40d5d6c1125b662b304a372b135660d3740eebae7ade568bdd52a9","blockSize":4194304,"blocks":["94fa392bda40d5d6c1125b662b304a372b135660d3740eebae7ade568bdd52a9"]},"offset":"15548883"},"ToUint8Clamp.js":{"size":522,"integrity":{"algorithm":"SHA256","hash":"30dd3065a73ef4ff1f0a018ce80bd550673e5ee29c732e6fc8cade4661f80d56","blockSize":4194304,"blocks":["30dd3065a73ef4ff1f0a018ce80bd550673e5ee29c732e6fc8cade4661f80d56"]},"offset":"15549461"},"TrimString.js":{"size":804,"integrity":{"algorithm":"SHA256","hash":"497ddda1a6981ecb64a4c5ea120100f61569ad519055b30741ad77d0aae3d458","blockSize":4194304,"blocks":["497ddda1a6981ecb64a4c5ea120100f61569ad519055b30741ad77d0aae3d458"]},"offset":"15549983"},"Type.js":{"size":249,"integrity":{"algorithm":"SHA256","hash":"a9812c431dc51253d8d3bd637842b22534f87a1f1006d2266c824488d068305d","blockSize":4194304,"blocks":["a9812c431dc51253d8d3bd637842b22534f87a1f1006d2266c824488d068305d"]},"offset":"15550787"},"UTF16Decode.js":{"size":823,"integrity":{"algorithm":"SHA256","hash":"66b054809f1121de679d732a62bfa5c258806147b7fa6ed473a4ce5f56b70e61","blockSize":4194304,"blocks":["66b054809f1121de679d732a62bfa5c258806147b7fa6ed473a4ce5f56b70e61"]},"offset":"15551036"},"UTF16Encoding.js":{"size":700,"integrity":{"algorithm":"SHA256","hash":"4a84fe0de13660a11bc7f0e2ccdb5611e6767e0f40b20a16c335db7316cf369f","blockSize":4194304,"blocks":["4a84fe0de13660a11bc7f0e2ccdb5611e6767e0f40b20a16c335db7316cf369f"]},"offset":"15551859"},"UnicodeEscape.js":{"size":846,"integrity":{"algorithm":"SHA256","hash":"b9143323e7790683229c6ce9a1f93fbd5b17e22b966679f602b066d9371fe813","blockSize":4194304,"blocks":["b9143323e7790683229c6ce9a1f93fbd5b17e22b966679f602b066d9371fe813"]},"offset":"15552559"},"ValidateAndApplyPropertyDescriptor.js":{"size":5243,"integrity":{"algorithm":"SHA256","hash":"588f81f21e07a8d2255bc0aed34c94052aa74d5b558edc4435d0acee12c90554","blockSize":4194304,"blocks":["588f81f21e07a8d2255bc0aed34c94052aa74d5b558edc4435d0acee12c90554"]},"offset":"15553405"},"WeekDay.js":{"size":208,"integrity":{"algorithm":"SHA256","hash":"f7cc798c72dcc484295681d29d535e64215a9ec303f4f6e6456ea63e83ce0246","blockSize":4194304,"blocks":["f7cc798c72dcc484295681d29d535e64215a9ec303f4f6e6456ea63e83ce0246"]},"offset":"15558648"},"YearFromTime.js":{"size":407,"integrity":{"algorithm":"SHA256","hash":"5562b7fd6be438187a1187a331f0d310e631e9747df14521accc7a797e2a2aa7","blockSize":4194304,"blocks":["5562b7fd6be438187a1187a331f0d310e631e9747df14521accc7a797e2a2aa7"]},"offset":"15558856"},"abs.js":{"size":207,"integrity":{"algorithm":"SHA256","hash":"a50e248c29238747c3c278a4edf2c0643f1295d1c065d9dff8524def17f0427f","blockSize":4194304,"blocks":["a50e248c29238747c3c278a4edf2c0643f1295d1c065d9dff8524def17f0427f"]},"offset":"15559263"},"floor.js":{"size":217,"integrity":{"algorithm":"SHA256","hash":"90c20830ae8762224c83fb0ed36a288a7d567f57d3b5acb469590cc2d5e13f55","blockSize":4194304,"blocks":["90c20830ae8762224c83fb0ed36a288a7d567f57d3b5acb469590cc2d5e13f55"]},"offset":"15559470"},"modulo.js":{"size":168,"integrity":{"algorithm":"SHA256","hash":"84923b64427edcc840ee9a305dca213f4bf1e04ed8f88f6bfd7bfa9e655d7c98","blockSize":4194304,"blocks":["84923b64427edcc840ee9a305dca213f4bf1e04ed8f88f6bfd7bfa9e655d7c98"]},"offset":"15559687"},"msFromTime.js":{"size":253,"integrity":{"algorithm":"SHA256","hash":"ef13a7e7721d695f125a7e772f8037ed34aa3c97aaa3692da900c6796cd270da","blockSize":4194304,"blocks":["ef13a7e7721d695f125a7e772f8037ed34aa3c97aaa3692da900c6796cd270da"]},"offset":"15559855"},"thisBooleanValue.js":{"size":367,"integrity":{"algorithm":"SHA256","hash":"171bd884e07701d9e37bece81b05a95fd7d822ff7eaaba5c112d6e3a352ad498","blockSize":4194304,"blocks":["171bd884e07701d9e37bece81b05a95fd7d822ff7eaaba5c112d6e3a352ad498"]},"offset":"15560108"},"thisNumberValue.js":{"size":390,"integrity":{"algorithm":"SHA256","hash":"a3bb9eb733e74de8a50f49e4425e57fd01bebbf66df4f9967da3d9edee589455","blockSize":4194304,"blocks":["a3bb9eb733e74de8a50f49e4425e57fd01bebbf66df4f9967da3d9edee589455"]},"offset":"15560475"},"thisStringValue.js":{"size":361,"integrity":{"algorithm":"SHA256","hash":"47305af763f963ab1c547011b6be408827678d61540009de579bf996d0810ff5","blockSize":4194304,"blocks":["47305af763f963ab1c547011b6be408827678d61540009de579bf996d0810ff5"]},"offset":"15560865"},"thisSymbolValue.js":{"size":514,"integrity":{"algorithm":"SHA256","hash":"27b446ef7c0dcc60f576357f187bb9af1a86d6557ab82a144d2390e793dc94db","blockSize":4194304,"blocks":["27b446ef7c0dcc60f576357f187bb9af1a86d6557ab82a144d2390e793dc94db"]},"offset":"15561226"},"thisTimeValue.js":{"size":66,"integrity":{"algorithm":"SHA256","hash":"e4edc25cb1edf0faea5b4a9c844ce72636b702a033b075ee0f7ffbedc14e442a","blockSize":4194304,"blocks":["e4edc25cb1edf0faea5b4a9c844ce72636b702a033b075ee0f7ffbedc14e442a"]},"offset":"15561740"}}},"2020":{"files":{"AbstractEqualityComparison.js":{"size":1873,"integrity":{"algorithm":"SHA256","hash":"83dd5215f6114b08ebd495a30d0568d05440f8cf9bc1cbf4ff0e450dcea74096","blockSize":4194304,"blocks":["83dd5215f6114b08ebd495a30d0568d05440f8cf9bc1cbf4ff0e450dcea74096"]},"offset":"15299502"},"AbstractRelationalComparison.js":{"size":2121,"integrity":{"algorithm":"SHA256","hash":"19f29e9e33468564be30bc77c6cb3676d6385c3d996f12973565bcc0d334e472","blockSize":4194304,"blocks":["19f29e9e33468564be30bc77c6cb3676d6385c3d996f12973565bcc0d334e472"]},"offset":"15301375"},"AddEntriesFromIterable.js":{"size":1519,"integrity":{"algorithm":"SHA256","hash":"a2a37224988c05e3ab0b313d3e2cba70be3ff20e71b6df11edc71fd7b6040192","blockSize":4194304,"blocks":["a2a37224988c05e3ab0b313d3e2cba70be3ff20e71b6df11edc71fd7b6040192"]},"offset":"15303496"},"AdvanceStringIndex.js":{"size":983,"integrity":{"algorithm":"SHA256","hash":"7a63be1dfe729b603c8624883d13cc96a2fd1b16bf94ffb206b39d53c4f4a144","blockSize":4194304,"blocks":["7a63be1dfe729b603c8624883d13cc96a2fd1b16bf94ffb206b39d53c4f4a144"]},"offset":"15305015"},"ArrayCreate.js":{"size":1650,"integrity":{"algorithm":"SHA256","hash":"6cde465e8db30b2ba485412ac2912f04a6212b3effdd37d0f3a9894af999ba9b","blockSize":4194304,"blocks":["6cde465e8db30b2ba485412ac2912f04a6212b3effdd37d0f3a9894af999ba9b"]},"offset":"15305998"},"ArraySetLength.js":{"size":2665,"integrity":{"algorithm":"SHA256","hash":"4b07de7693377557e2f05bf21ea871ff235ce1121e0e95846f5639fa5cc3ebb1","blockSize":4194304,"blocks":["4b07de7693377557e2f05bf21ea871ff235ce1121e0e95846f5639fa5cc3ebb1"]},"offset":"15307648"},"ArraySpeciesCreate.js":{"size":1348,"integrity":{"algorithm":"SHA256","hash":"246aed3dfe50be7dcbd5b25934dd6c74bff25b66de39dcc70335e6d668cc480b","blockSize":4194304,"blocks":["246aed3dfe50be7dcbd5b25934dd6c74bff25b66de39dcc70335e6d668cc480b"]},"offset":"15310313"},"BigIntBitwiseOp.js":{"size":1735,"integrity":{"algorithm":"SHA256","hash":"407178e5d611fcdfcd1af1dd2f5c16804c048b53656d23e26f63700a3fcd4153","blockSize":4194304,"blocks":["407178e5d611fcdfcd1af1dd2f5c16804c048b53656d23e26f63700a3fcd4153"]},"offset":"15311661"},"BinaryAnd.js":{"size":364,"integrity":{"algorithm":"SHA256","hash":"38c2e690ef1ebb7332d98d27095de8931e2ae9516b5ff5fa102d73c5093d4408","blockSize":4194304,"blocks":["38c2e690ef1ebb7332d98d27095de8931e2ae9516b5ff5fa102d73c5093d4408"]},"offset":"15313396"},"BinaryOr.js":{"size":362,"integrity":{"algorithm":"SHA256","hash":"5c95b7bca8afa7f8e0ee93f1047e344fa9ebec555d926aee3a6290a625504b84","blockSize":4194304,"blocks":["5c95b7bca8afa7f8e0ee93f1047e344fa9ebec555d926aee3a6290a625504b84"]},"offset":"15313760"},"BinaryXor.js":{"size":364,"integrity":{"algorithm":"SHA256","hash":"35dfdf32b56aae2408cb3a336fdc3172b1389c8de0fad05ebb62226cd7016a8f","blockSize":4194304,"blocks":["35dfdf32b56aae2408cb3a336fdc3172b1389c8de0fad05ebb62226cd7016a8f"]},"offset":"15314122"},"Call.js":{"size":623,"integrity":{"algorithm":"SHA256","hash":"b092006d05bceeccee48bdf3fde9d83ee54a156eb2841bf5cacdca9f157b4571","blockSize":4194304,"blocks":["b092006d05bceeccee48bdf3fde9d83ee54a156eb2841bf5cacdca9f157b4571"]},"offset":"15314486"},"CanonicalNumericIndexString.js":{"size":654,"integrity":{"algorithm":"SHA256","hash":"c850cc1637b82f4fc238d2ae1a45229e8d44bc5c9b85205c0f27a1e0e9bb9d2b","blockSize":4194304,"blocks":["c850cc1637b82f4fc238d2ae1a45229e8d44bc5c9b85205c0f27a1e0e9bb9d2b"]},"offset":"15315109"},"CharacterRange.js":{"size":782,"integrity":{"algorithm":"SHA256","hash":"49612101e544a9b707f116ac8fe2be0d2c559c1d3b4f94ba47f36832913ea11f","blockSize":4194304,"blocks":["49612101e544a9b707f116ac8fe2be0d2c559c1d3b4f94ba47f36832913ea11f"]},"offset":"15315763"},"CodePointAt.js":{"size":1720,"integrity":{"algorithm":"SHA256","hash":"14350bc53c55373911291fb9dd3a0a88cdc36da8fe1a602963c16810df26d904","blockSize":4194304,"blocks":["14350bc53c55373911291fb9dd3a0a88cdc36da8fe1a602963c16810df26d904"]},"offset":"15316545"},"CompletePropertyDescriptor.js":{"size":989,"integrity":{"algorithm":"SHA256","hash":"17825d14da6797c52aa699d7b089bc2370d5a899cb7af7e3485f948fde50fca2","blockSize":4194304,"blocks":["17825d14da6797c52aa699d7b089bc2370d5a899cb7af7e3485f948fde50fca2"]},"offset":"15318265"},"CopyDataProperties.js":{"size":1887,"integrity":{"algorithm":"SHA256","hash":"1b5847f0a8b291e07a384e784ad909b2b5cfcdd4b8f4e4dcf82f502d11c1b0d1","blockSize":4194304,"blocks":["1b5847f0a8b291e07a384e784ad909b2b5cfcdd4b8f4e4dcf82f502d11c1b0d1"]},"offset":"15319254"},"CreateDataProperty.js":{"size":1279,"integrity":{"algorithm":"SHA256","hash":"5006509a3f5567f81cb7f730448a0a492c64c7f06406627c58d0334dde5e44f9","blockSize":4194304,"blocks":["5006509a3f5567f81cb7f730448a0a492c64c7f06406627c58d0334dde5e44f9"]},"offset":"15321141"},"CreateDataPropertyOrThrow.js":{"size":734,"integrity":{"algorithm":"SHA256","hash":"50c61c792c27d661346cfb29fe5b7603a2713d7acb1dc5b3b35fe71ece8fd18e","blockSize":4194304,"blocks":["50c61c792c27d661346cfb29fe5b7603a2713d7acb1dc5b3b35fe71ece8fd18e"]},"offset":"15322420"},"CreateHTML.js":{"size":927,"integrity":{"algorithm":"SHA256","hash":"5b9cf63f6b4bc50077e333c2b310cbd4c85a97891b2e1d28a93aeeb4370c2930","blockSize":4194304,"blocks":["5b9cf63f6b4bc50077e333c2b310cbd4c85a97891b2e1d28a93aeeb4370c2930"]},"offset":"15323154"},"CreateIterResultObject.js":{"size":432,"integrity":{"algorithm":"SHA256","hash":"289a26996866dba6f6292ba0931e643c7a5851f21003d41e5a004862a03a2035","blockSize":4194304,"blocks":["289a26996866dba6f6292ba0931e643c7a5851f21003d41e5a004862a03a2035"]},"offset":"15324081"},"CreateListFromArrayLike.js":{"size":1363,"integrity":{"algorithm":"SHA256","hash":"6be740d47f24bafd1ffa0710a7f94e86e34042b1fb0d2a40a1ea3c70dc331738","blockSize":4194304,"blocks":["6be740d47f24bafd1ffa0710a7f94e86e34042b1fb0d2a40a1ea3c70dc331738"]},"offset":"15324513"},"CreateMethodProperty.js":{"size":979,"integrity":{"algorithm":"SHA256","hash":"117c68b2fa6825c31e8d6f4970973fddf09fd74506447ca22ed3cfc2ed8b04e8","blockSize":4194304,"blocks":["117c68b2fa6825c31e8d6f4970973fddf09fd74506447ca22ed3cfc2ed8b04e8"]},"offset":"15325876"},"CreateRegExpStringIterator.js":{"size":3708,"integrity":{"algorithm":"SHA256","hash":"317ed938151dfef9b0bfccf08cf6ca31d3465ef38ab9be62edd036ea046f49b6","blockSize":4194304,"blocks":["317ed938151dfef9b0bfccf08cf6ca31d3465ef38ab9be62edd036ea046f49b6"]},"offset":"15326855"},"DateFromTime.js":{"size":1036,"integrity":{"algorithm":"SHA256","hash":"ae437cb5ee92b162e18b6f47b9dd66b66f627547e098a0670d60c2572f04b1ed","blockSize":4194304,"blocks":["ae437cb5ee92b162e18b6f47b9dd66b66f627547e098a0670d60c2572f04b1ed"]},"offset":"15330563"},"DateString.js":{"size":1055,"integrity":{"algorithm":"SHA256","hash":"9dde544576a4c552c56ee5f102459d4e3ca28bb800ccba833b53bd159d1e864a","blockSize":4194304,"blocks":["9dde544576a4c552c56ee5f102459d4e3ca28bb800ccba833b53bd159d1e864a"]},"offset":"15331599"},"Day.js":{"size":234,"integrity":{"algorithm":"SHA256","hash":"ff3875a46c34886cff3808ab1c4de6d3b45a61e9638b32edd22f41277c153ea5","blockSize":4194304,"blocks":["ff3875a46c34886cff3808ab1c4de6d3b45a61e9638b32edd22f41277c153ea5"]},"offset":"15332654"},"DayFromYear.js":{"size":256,"integrity":{"algorithm":"SHA256","hash":"378eb638143e86cfa3061177986dcfdb6bdec76e8b799b95cf3b9cafc5e9af68","blockSize":4194304,"blocks":["378eb638143e86cfa3061177986dcfdb6bdec76e8b799b95cf3b9cafc5e9af68"]},"offset":"15332888"},"DayWithinYear.js":{"size":286,"integrity":{"algorithm":"SHA256","hash":"b1ac5824fb1ced3e9d2dae99db5bd3890b4ef25dc45e50a4f927384bb5be618e","blockSize":4194304,"blocks":["b1ac5824fb1ced3e9d2dae99db5bd3890b4ef25dc45e50a4f927384bb5be618e"]},"offset":"15333144"},"DaysInYear.js":{"size":301,"integrity":{"algorithm":"SHA256","hash":"3f5955b3d1831ed2d008ae052a802b12c22bf1ba6d8fd286e0cb7a6a77144aec","blockSize":4194304,"blocks":["3f5955b3d1831ed2d008ae052a802b12c22bf1ba6d8fd286e0cb7a6a77144aec"]},"offset":"15333430"},"DefinePropertyOrThrow.js":{"size":1466,"integrity":{"algorithm":"SHA256","hash":"1964ecd5b9e64b3ddb203ac7da3410e09a2b1d0ab9b1f06733af8ea15ae954a4","blockSize":4194304,"blocks":["1964ecd5b9e64b3ddb203ac7da3410e09a2b1d0ab9b1f06733af8ea15ae954a4"]},"offset":"15333731"},"DeletePropertyOrThrow.js":{"size":699,"integrity":{"algorithm":"SHA256","hash":"3c1ac659ec4eb7ad97e99c2c3d08c2058624eec2ac0bcca0583660a0fe69f1c5","blockSize":4194304,"blocks":["3c1ac659ec4eb7ad97e99c2c3d08c2058624eec2ac0bcca0583660a0fe69f1c5"]},"offset":"15335197"},"EnumerableOwnPropertyNames.js":{"size":1112,"integrity":{"algorithm":"SHA256","hash":"d389393a016c32c0b737581f924aad9edb42291b1f869bb514f5521f31a4a198","blockSize":4194304,"blocks":["d389393a016c32c0b737581f924aad9edb42291b1f869bb514f5521f31a4a198"]},"offset":"15335896"},"FlattenIntoArray.js":{"size":1752,"integrity":{"algorithm":"SHA256","hash":"005084af0dadcac75646c5db3744c8ced48a4ca4ba8c50949355c8770ea108f7","blockSize":4194304,"blocks":["005084af0dadcac75646c5db3744c8ced48a4ca4ba8c50949355c8770ea108f7"]},"offset":"15337008"},"FromPropertyDescriptor.js":{"size":450,"integrity":{"algorithm":"SHA256","hash":"a16798c55be7b402fc2b27d4d422f322c40639b7403d47cb897b576fcc1ddd49","blockSize":4194304,"blocks":["a16798c55be7b402fc2b27d4d422f322c40639b7403d47cb897b576fcc1ddd49"]},"offset":"15338760"},"Get.js":{"size":602,"integrity":{"algorithm":"SHA256","hash":"ef9a4a39b94f3287d0c9ed27b9a5f1cb71164d2184d6aaf2fc5900fd44016ff9","blockSize":4194304,"blocks":["ef9a4a39b94f3287d0c9ed27b9a5f1cb71164d2184d6aaf2fc5900fd44016ff9"]},"offset":"15339210"},"GetIterator.js":{"size":1720,"integrity":{"algorithm":"SHA256","hash":"bd462e2f956ac2c90ec0c3365da5c7b76816e16cf01a8e66aa32ee03342e7950","blockSize":4194304,"blocks":["bd462e2f956ac2c90ec0c3365da5c7b76816e16cf01a8e66aa32ee03342e7950"]},"offset":"15339812"},"GetMethod.js":{"size":663,"integrity":{"algorithm":"SHA256","hash":"87f8829531af6b2019ed31d44f2efcf89e8bf345c158ad6bd790f8e14028d325","blockSize":4194304,"blocks":["87f8829531af6b2019ed31d44f2efcf89e8bf345c158ad6bd790f8e14028d325"]},"offset":"15341532"},"GetOwnPropertyKeys.js":{"size":829,"integrity":{"algorithm":"SHA256","hash":"7ad04a3a175ede6b7d15611717a20c2bc6a09bef382f8b4f7d985e5b2e1e7120","blockSize":4194304,"blocks":["7ad04a3a175ede6b7d15611717a20c2bc6a09bef382f8b4f7d985e5b2e1e7120"]},"offset":"15342195"},"GetPrototypeFromConstructor.js":{"size":921,"integrity":{"algorithm":"SHA256","hash":"da1c30c8d5b331e72618af4ccc18b5f3ed89b36e9be117c74a4ee9266141ba56","blockSize":4194304,"blocks":["da1c30c8d5b331e72618af4ccc18b5f3ed89b36e9be117c74a4ee9266141ba56"]},"offset":"15343024"},"GetSubstitution.js":{"size":4417,"integrity":{"algorithm":"SHA256","hash":"680e2598750e34c1fa62e010a01503f52c3b8a58c7f790985d91ef2a0dc35d60","blockSize":4194304,"blocks":["680e2598750e34c1fa62e010a01503f52c3b8a58c7f790985d91ef2a0dc35d60"]},"offset":"15343945"},"GetV.js":{"size":474,"integrity":{"algorithm":"SHA256","hash":"66909f7192a6bddc6fb77163f6182164ebef641f0f4c595835485eda6cfd3443","blockSize":4194304,"blocks":["66909f7192a6bddc6fb77163f6182164ebef641f0f4c595835485eda6cfd3443"]},"offset":"15348362"},"HasOwnProperty.js":{"size":553,"integrity":{"algorithm":"SHA256","hash":"b099b2f9829fe64e25740771abc3d3c4e1c801ce0cd2ccecf6041ad08d59364d","blockSize":4194304,"blocks":["b099b2f9829fe64e25740771abc3d3c4e1c801ce0cd2ccecf6041ad08d59364d"]},"offset":"15348836"},"HasProperty.js":{"size":517,"integrity":{"algorithm":"SHA256","hash":"7889a3e2b191509b3d6c0bfcabbad2a915919a2caa275b696a12eab4ebd9cdac","blockSize":4194304,"blocks":["7889a3e2b191509b3d6c0bfcabbad2a915919a2caa275b696a12eab4ebd9cdac"]},"offset":"15349389"},"HourFromTime.js":{"size":382,"integrity":{"algorithm":"SHA256","hash":"338503d8b54967fb22e0659243cab7fc283f023561a8a3316df8b4de588bddf9","blockSize":4194304,"blocks":["338503d8b54967fb22e0659243cab7fc283f023561a8a3316df8b4de588bddf9"]},"offset":"15349906"},"InLeapYear.js":{"size":510,"integrity":{"algorithm":"SHA256","hash":"d9abbf0c4b80df1fd7cb31830f222eb4b6bbe638dcfa3461809905158f2ce0a6","blockSize":4194304,"blocks":["d9abbf0c4b80df1fd7cb31830f222eb4b6bbe638dcfa3461809905158f2ce0a6"]},"offset":"15350288"},"InstanceofOperator.js":{"size":918,"integrity":{"algorithm":"SHA256","hash":"af702715d893f635ff66441f9638a4dc977789c505a50ae17f7e02b05b2549d6","blockSize":4194304,"blocks":["af702715d893f635ff66441f9638a4dc977789c505a50ae17f7e02b05b2549d6"]},"offset":"15350798"},"Invoke.js":{"size":715,"integrity":{"algorithm":"SHA256","hash":"ff016550d8adf9608b2f4ab258017c1582ce717a2e2b3bd2b7a94440f7f19f8f","blockSize":4194304,"blocks":["ff016550d8adf9608b2f4ab258017c1582ce717a2e2b3bd2b7a94440f7f19f8f"]},"offset":"15351716"},"IsAccessorDescriptor.js":{"size":465,"integrity":{"algorithm":"SHA256","hash":"425c74a892b6bb2d1dc6c56e7a6e77e40b9c4d4390480fafe4c804cea53a80ad","blockSize":4194304,"blocks":["425c74a892b6bb2d1dc6c56e7a6e77e40b9c4d4390480fafe4c804cea53a80ad"]},"offset":"15352431"},"IsArray.js":{"size":123,"integrity":{"algorithm":"SHA256","hash":"a8f01a797e05a74501ceb9293408f72bded2a08013c6a075f582737003b443f4","blockSize":4194304,"blocks":["a8f01a797e05a74501ceb9293408f72bded2a08013c6a075f582737003b443f4"]},"offset":"15352896"},"IsBigIntElementType.js":{"size":194,"integrity":{"algorithm":"SHA256","hash":"8fc2140ce6165463b7ba7bb773bf691592364f65c0806edcccd2e97ea3e4f963","blockSize":4194304,"blocks":["8fc2140ce6165463b7ba7bb773bf691592364f65c0806edcccd2e97ea3e4f963"]},"offset":"15353019"},"IsCallable.js":{"size":108,"integrity":{"algorithm":"SHA256","hash":"789ba0a1f176c56862f16b2ff7bc3eeaaa02676f75be073a46c92c5e8af21170","blockSize":4194304,"blocks":["789ba0a1f176c56862f16b2ff7bc3eeaaa02676f75be073a46c92c5e8af21170"]},"offset":"15353213"},"IsCompatiblePropertyDescriptor.js":{"size":367,"integrity":{"algorithm":"SHA256","hash":"f9736fde486f1f27112126908c39423b2b3b946a96d5e2a4d762b3139da17543","blockSize":4194304,"blocks":["f9736fde486f1f27112126908c39423b2b3b946a96d5e2a4d762b3139da17543"]},"offset":"15353321"},"IsConcatSpreadable.js":{"size":626,"integrity":{"algorithm":"SHA256","hash":"7a4c3cae4f5de1b8cbc5694ac320cfaaf30f4ecbe2754e2ffb3f72fb42763a8a","blockSize":4194304,"blocks":["7a4c3cae4f5de1b8cbc5694ac320cfaaf30f4ecbe2754e2ffb3f72fb42763a8a"]},"offset":"15353688"},"IsConstructor.js":{"size":1149,"integrity":{"algorithm":"SHA256","hash":"1a58d54e8aec9ecbfaf3e75d9b38ef06c8a3c948e337cca159a17a102ee41929","blockSize":4194304,"blocks":["1a58d54e8aec9ecbfaf3e75d9b38ef06c8a3c948e337cca159a17a102ee41929"]},"offset":"15354314"},"IsDataDescriptor.js":{"size":464,"integrity":{"algorithm":"SHA256","hash":"35a0862d76e9d765d5fa4154250ed5ac440f4238432a773f22c288da3886e1ce","blockSize":4194304,"blocks":["35a0862d76e9d765d5fa4154250ed5ac440f4238432a773f22c288da3886e1ce"]},"offset":"15355463"},"IsExtensible.js":{"size":509,"integrity":{"algorithm":"SHA256","hash":"e28d0530ae66f0dfb8fa90c492fd6242a44ea7eff298d1ed4c10eac9fdfc8efb","blockSize":4194304,"blocks":["e28d0530ae66f0dfb8fa90c492fd6242a44ea7eff298d1ed4c10eac9fdfc8efb"]},"offset":"15355927"},"IsGenericDescriptor.js":{"size":560,"integrity":{"algorithm":"SHA256","hash":"b9d31ec0ad5beaea6a7d9f1180d67ef8f45b164234deeee14c362c8eb2e135cc","blockSize":4194304,"blocks":["b9d31ec0ad5beaea6a7d9f1180d67ef8f45b164234deeee14c362c8eb2e135cc"]},"offset":"15356436"},"IsInteger.js":{"size":450,"integrity":{"algorithm":"SHA256","hash":"84893768eabe51d4073d48aeb5cf43cfdba3a1c6223da13b0a73f802033ff6e2","blockSize":4194304,"blocks":["84893768eabe51d4073d48aeb5cf43cfdba3a1c6223da13b0a73f802033ff6e2"]},"offset":"15356996"},"IsNoTearConfiguration.js":{"size":467,"integrity":{"algorithm":"SHA256","hash":"0e2f942e0932969b609de49c1769557553fd72d1d4e3b7940627c192427a7138","blockSize":4194304,"blocks":["0e2f942e0932969b609de49c1769557553fd72d1d4e3b7940627c192427a7138"]},"offset":"15357446"},"IsNonNegativeInteger.js":{"size":236,"integrity":{"algorithm":"SHA256","hash":"29ccac8faec969a29df238f2a2d6e8622565515ef47c9d7627db462967f3ea4e","blockSize":4194304,"blocks":["29ccac8faec969a29df238f2a2d6e8622565515ef47c9d7627db462967f3ea4e"]},"offset":"15357913"},"IsPromise.js":{"size":485,"integrity":{"algorithm":"SHA256","hash":"9f4e5aef10bca5119fab546b4834e48b776d14a775f55524cd3512c4321a1e7c","blockSize":4194304,"blocks":["9f4e5aef10bca5119fab546b4834e48b776d14a775f55524cd3512c4321a1e7c"]},"offset":"15358149"},"IsPropertyKey.js":{"size":207,"integrity":{"algorithm":"SHA256","hash":"577d849187a0e8ef526a6368eb6757f6a128db792cf9ade6dfc6c82a75d155c3","blockSize":4194304,"blocks":["577d849187a0e8ef526a6368eb6757f6a128db792cf9ade6dfc6c82a75d155c3"]},"offset":"15358634"},"IsRegExp.js":{"size":545,"integrity":{"algorithm":"SHA256","hash":"1183cff5c42c2cf9a0b3fbb62d4a7f842b56c1141209c683f0116715bcf03c15","blockSize":4194304,"blocks":["1183cff5c42c2cf9a0b3fbb62d4a7f842b56c1141209c683f0116715bcf03c15"]},"offset":"15358841"},"IsSharedArrayBuffer.js":{"size":461,"integrity":{"algorithm":"SHA256","hash":"9451dbf3ee8a39a73e3e2315f48495288b29521576f0539d18c56fc4b6d85012","blockSize":4194304,"blocks":["9451dbf3ee8a39a73e3e2315f48495288b29521576f0539d18c56fc4b6d85012"]},"offset":"15359386"},"IsStringPrefix.js":{"size":940,"integrity":{"algorithm":"SHA256","hash":"9eb0f4ccb63d074f4ff299f92db9a4b4b821d69d865784956e0a0ddc627aa5fa","blockSize":4194304,"blocks":["9eb0f4ccb63d074f4ff299f92db9a4b4b821d69d865784956e0a0ddc627aa5fa"]},"offset":"15359847"},"IsUnclampedIntegerElementType.js":{"size":298,"integrity":{"algorithm":"SHA256","hash":"8f1f1d7b8ebb15b5b82d66e07078c3001988b807bdc3323e8a17cc246c444c34","blockSize":4194304,"blocks":["8f1f1d7b8ebb15b5b82d66e07078c3001988b807bdc3323e8a17cc246c444c34"]},"offset":"15360787"},"IsUnsignedElementType.js":{"size":266,"integrity":{"algorithm":"SHA256","hash":"ce9973faeaa330b09173245337ff899b86a63b895f5de7106f5f28a8fba9e7f2","blockSize":4194304,"blocks":["ce9973faeaa330b09173245337ff899b86a63b895f5de7106f5f28a8fba9e7f2"]},"offset":"15361085"},"IterableToList.js":{"size":627,"integrity":{"algorithm":"SHA256","hash":"f68bf2284681095f169746779d6d79067f4cdb3439e931cb9358fb4ff57378db","blockSize":4194304,"blocks":["f68bf2284681095f169746779d6d79067f4cdb3439e931cb9358fb4ff57378db"]},"offset":"15361351"},"IteratorClose.js":{"size":1481,"integrity":{"algorithm":"SHA256","hash":"52b100a8cc0ecb7b5d5c7346e20d23c7503c832525650b3269f40f6b98948cae","blockSize":4194304,"blocks":["52b100a8cc0ecb7b5d5c7346e20d23c7503c832525650b3269f40f6b98948cae"]},"offset":"15361978"},"IteratorComplete.js":{"size":498,"integrity":{"algorithm":"SHA256","hash":"41ad3ddb0114bfd56e3e67508633496d4ae672eeb47767f12ae0dacdd91d39b5","blockSize":4194304,"blocks":["41ad3ddb0114bfd56e3e67508633496d4ae672eeb47767f12ae0dacdd91d39b5"]},"offset":"15363459"},"IteratorNext.js":{"size":493,"integrity":{"algorithm":"SHA256","hash":"a6ee567a6387448b0140aceffae4ad1ccdd427537d6926716c3f686367098d30","blockSize":4194304,"blocks":["a6ee567a6387448b0140aceffae4ad1ccdd427537d6926716c3f686367098d30"]},"offset":"15363957"},"IteratorStep.js":{"size":353,"integrity":{"algorithm":"SHA256","hash":"22dbe3c1e07083538804e0bc79a4615d97ae6b49978623594f81e9ffd0ad0594","blockSize":4194304,"blocks":["22dbe3c1e07083538804e0bc79a4615d97ae6b49978623594f81e9ffd0ad0594"]},"offset":"15364450"},"IteratorValue.js":{"size":443,"integrity":{"algorithm":"SHA256","hash":"674abbe8978a08b6d6d6ae53a7c3aca04395c6a3e5d97807204fcfaf81fafd68","blockSize":4194304,"blocks":["674abbe8978a08b6d6d6ae53a7c3aca04395c6a3e5d97807204fcfaf81fafd68"]},"offset":"15364803"},"LengthOfArrayLike.js":{"size":495,"integrity":{"algorithm":"SHA256","hash":"57dde851cceec9f755c926949296097a22c26f3fb88b44ee3a143bc6771cd661","blockSize":4194304,"blocks":["57dde851cceec9f755c926949296097a22c26f3fb88b44ee3a143bc6771cd661"]},"offset":"15365246"},"MakeDate.js":{"size":328,"integrity":{"algorithm":"SHA256","hash":"41a9b9da3ede4effd12c43e1c25851b5005623f5eb6dee707252cbe373b32ef0","blockSize":4194304,"blocks":["41a9b9da3ede4effd12c43e1c25851b5005623f5eb6dee707252cbe373b32ef0"]},"offset":"15365741"},"MakeDay.js":{"size":917,"integrity":{"algorithm":"SHA256","hash":"83e8e606e0e1ed2ad5b864a20459f8ce10aac6a653af26c12cd6cbc087da53e9","blockSize":4194304,"blocks":["83e8e606e0e1ed2ad5b864a20459f8ce10aac6a653af26c12cd6cbc087da53e9"]},"offset":"15366069"},"MakeTime.js":{"size":698,"integrity":{"algorithm":"SHA256","hash":"f91ad37ec6587e1debbe2be4f1bb86f4936df8e4649af2e33fe14023ed9f6da7","blockSize":4194304,"blocks":["f91ad37ec6587e1debbe2be4f1bb86f4936df8e4649af2e33fe14023ed9f6da7"]},"offset":"15366986"},"MinFromTime.js":{"size":396,"integrity":{"algorithm":"SHA256","hash":"88e77ac8a1b1aae30fe064057ed6699c3c3b176ec1ab0533893be6d1c7ba856a","blockSize":4194304,"blocks":["88e77ac8a1b1aae30fe064057ed6699c3c3b176ec1ab0533893be6d1c7ba856a"]},"offset":"15367684"},"MonthFromTime.js":{"size":1014,"integrity":{"algorithm":"SHA256","hash":"f7acafe967a838eb85739ec2afa8dcdc9e5c0734219559259338761a09131909","blockSize":4194304,"blocks":["f7acafe967a838eb85739ec2afa8dcdc9e5c0734219559259338761a09131909"]},"offset":"15368080"},"NumberBitwiseOp.js":{"size":757,"integrity":{"algorithm":"SHA256","hash":"0aa5b6fd1cb50c290090d0fd6d21889908148a70f31f73edf99f937d55b12e59","blockSize":4194304,"blocks":["0aa5b6fd1cb50c290090d0fd6d21889908148a70f31f73edf99f937d55b12e59"]},"offset":"15369094"},"NumberToBigInt.js":{"size":814,"integrity":{"algorithm":"SHA256","hash":"ee0bbe8b4e8b0283339656c21783b6d0d483ad1ad9569aa407e98b9eecfbb8c8","blockSize":4194304,"blocks":["ee0bbe8b4e8b0283339656c21783b6d0d483ad1ad9569aa407e98b9eecfbb8c8"]},"offset":"15369851"},"ObjectDefineProperties.js":{"size":1508,"integrity":{"algorithm":"SHA256","hash":"672b0bda371a4710bf8e7c99cfc41eca1920c10fad584755be76cd5ac1136fa5","blockSize":4194304,"blocks":["672b0bda371a4710bf8e7c99cfc41eca1920c10fad584755be76cd5ac1136fa5"]},"offset":"15370665"},"OrdinaryCreateFromConstructor.js":{"size":827,"integrity":{"algorithm":"SHA256","hash":"0e9404db2c868e18c5895340e06e66f4fd8505fc466f21dc533c025f57cfcddb","blockSize":4194304,"blocks":["0e9404db2c868e18c5895340e06e66f4fd8505fc466f21dc533c025f57cfcddb"]},"offset":"15372173"},"OrdinaryDefineOwnProperty.js":{"size":2390,"integrity":{"algorithm":"SHA256","hash":"5aa87d94193a2cc6a19e5ef3e44a4b1e12f99ff6a0cd1755faf0f0338b0e07fd","blockSize":4194304,"blocks":["5aa87d94193a2cc6a19e5ef3e44a4b1e12f99ff6a0cd1755faf0f0338b0e07fd"]},"offset":"15373000"},"OrdinaryGetOwnProperty.js":{"size":1257,"integrity":{"algorithm":"SHA256","hash":"d4ef741d1e026235ef46accf3a1538b3510a81e35eff00e0643e0431f3c71ba8","blockSize":4194304,"blocks":["d4ef741d1e026235ef46accf3a1538b3510a81e35eff00e0643e0431f3c71ba8"]},"offset":"15375390"},"OrdinaryGetPrototypeOf.js":{"size":539,"integrity":{"algorithm":"SHA256","hash":"bf546da8b6ac3f982c55919169b2f07320b7934868dfb3b82c13f38c72b95a0d","blockSize":4194304,"blocks":["bf546da8b6ac3f982c55919169b2f07320b7934868dfb3b82c13f38c72b95a0d"]},"offset":"15376647"},"OrdinaryHasInstance.js":{"size":627,"integrity":{"algorithm":"SHA256","hash":"d36943f8261941e336b58a6d698291eef06aa4d7d44ab5fdffb7d073d50a771c","blockSize":4194304,"blocks":["d36943f8261941e336b58a6d698291eef06aa4d7d44ab5fdffb7d073d50a771c"]},"offset":"15377186"},"OrdinaryHasProperty.js":{"size":531,"integrity":{"algorithm":"SHA256","hash":"cbcf61dec7dc22444d36e89a62324453f98ccff4141e8284e5621b1fd0fbd07b","blockSize":4194304,"blocks":["cbcf61dec7dc22444d36e89a62324453f98ccff4141e8284e5621b1fd0fbd07b"]},"offset":"15377813"},"OrdinaryObjectCreate.js":{"size":1445,"integrity":{"algorithm":"SHA256","hash":"fb9e554f0cf613456fe6912e1ebc9aaa5380a044ed7a1461b5521bd7f534f7ca","blockSize":4194304,"blocks":["fb9e554f0cf613456fe6912e1ebc9aaa5380a044ed7a1461b5521bd7f534f7ca"]},"offset":"15378344"},"OrdinarySetPrototypeOf.js":{"size":1050,"integrity":{"algorithm":"SHA256","hash":"9f33c9e0fba4b5605ca95af4f267ed266cfe5a7ec0c5a739353a37d4b5eee5f3","blockSize":4194304,"blocks":["9f33c9e0fba4b5605ca95af4f267ed266cfe5a7ec0c5a739353a37d4b5eee5f3"]},"offset":"15379789"},"OrdinaryToPrimitive.js":{"size":1065,"integrity":{"algorithm":"SHA256","hash":"5f186778e48dd0375388468783d8a0a68bc08a4ff8f190f33bda9d1b4a73e6a8","blockSize":4194304,"blocks":["5f186778e48dd0375388468783d8a0a68bc08a4ff8f190f33bda9d1b4a73e6a8"]},"offset":"15380839"},"PromiseResolve.js":{"size":457,"integrity":{"algorithm":"SHA256","hash":"6914c2768bee4288d16b384871f81aa098119c14fc9fde2977654905ba227d4c","blockSize":4194304,"blocks":["6914c2768bee4288d16b384871f81aa098119c14fc9fde2977654905ba227d4c"]},"offset":"15381904"},"QuoteJSONString.js":{"size":1391,"integrity":{"algorithm":"SHA256","hash":"6693571a4ad709c9f1f1b91104b022c500d14fecf946c565baa741e08ea0d611","blockSize":4194304,"blocks":["6693571a4ad709c9f1f1b91104b022c500d14fecf946c565baa741e08ea0d611"]},"offset":"15382361"},"RegExpCreate.js":{"size":643,"integrity":{"algorithm":"SHA256","hash":"49da22ccbe85efb7620bfeb7877f2ef8678f1882ade81fcdc3f54567add7ab6b","blockSize":4194304,"blocks":["49da22ccbe85efb7620bfeb7877f2ef8678f1882ade81fcdc3f54567add7ab6b"]},"offset":"15383752"},"RegExpExec.js":{"size":887,"integrity":{"algorithm":"SHA256","hash":"32fbe5fc604aa31efc738c2b617a512114367daffa37a031a3257fe5be493bb9","blockSize":4194304,"blocks":["32fbe5fc604aa31efc738c2b617a512114367daffa37a031a3257fe5be493bb9"]},"offset":"15384395"},"RequireObjectCoercible.js":{"size":70,"integrity":{"algorithm":"SHA256","hash":"25d49a24f231f606c6d8be4760f3795c12f61bda0ac95ad8e452205f97c8e612","blockSize":4194304,"blocks":["25d49a24f231f606c6d8be4760f3795c12f61bda0ac95ad8e452205f97c8e612"]},"offset":"15385282"},"SameValue.js":{"size":307,"integrity":{"algorithm":"SHA256","hash":"e6d99ed6b4a479bed51f697cbc4693a2ff8da0d1e07b5ebf11e74b5404af2ab1","blockSize":4194304,"blocks":["e6d99ed6b4a479bed51f697cbc4693a2ff8da0d1e07b5ebf11e74b5404af2ab1"]},"offset":"15385352"},"SameValueNonNumeric.js":{"size":635,"integrity":{"algorithm":"SHA256","hash":"1f99017f243b767fbbf3cb7486093bbac2c505c0302da6046f225cda3b5df57d","blockSize":4194304,"blocks":["1f99017f243b767fbbf3cb7486093bbac2c505c0302da6046f225cda3b5df57d"]},"offset":"15385659"},"SameValueZero.js":{"size":223,"integrity":{"algorithm":"SHA256","hash":"269684a69605b1f7ad04dfccc1519d7905271fd6ae05601a832a2ab8fb7272fc","blockSize":4194304,"blocks":["269684a69605b1f7ad04dfccc1519d7905271fd6ae05601a832a2ab8fb7272fc"]},"offset":"15386294"},"SecFromTime.js":{"size":402,"integrity":{"algorithm":"SHA256","hash":"6263c6176eafa22eadeb7bc054169fd764a3e3aab0cf637110d86110367c8a36","blockSize":4194304,"blocks":["6263c6176eafa22eadeb7bc054169fd764a3e3aab0cf637110d86110367c8a36"]},"offset":"15386517"},"Set.js":{"size":1255,"integrity":{"algorithm":"SHA256","hash":"88389d458aaae848468091535f5e8be59993020e744e998ca3058b59c1943ce8","blockSize":4194304,"blocks":["88389d458aaae848468091535f5e8be59993020e744e998ca3058b59c1943ce8"]},"offset":"15386919"},"SetFunctionLength.js":{"size":1067,"integrity":{"algorithm":"SHA256","hash":"73671ad9a10103c7a975a4cee4f4400662c4f2cfd92fa5f4a9ceae658e8c0ceb","blockSize":4194304,"blocks":["73671ad9a10103c7a975a4cee4f4400662c4f2cfd92fa5f4a9ceae658e8c0ceb"]},"offset":"15388174"},"SetFunctionName.js":{"size":1381,"integrity":{"algorithm":"SHA256","hash":"dabffc283c552e871c8bfd4a4d419e9453056b2b51a23f80f2ff6050c30b09c9","blockSize":4194304,"blocks":["dabffc283c552e871c8bfd4a4d419e9453056b2b51a23f80f2ff6050c30b09c9"]},"offset":"15389241"},"SetIntegrityLevel.js":{"size":1862,"integrity":{"algorithm":"SHA256","hash":"3c04bdc423a594ffec10244025e37e466b5878c4255a53655d445f51584b7d5e","blockSize":4194304,"blocks":["3c04bdc423a594ffec10244025e37e466b5878c4255a53655d445f51584b7d5e"]},"offset":"15390622"},"SpeciesConstructor.js":{"size":844,"integrity":{"algorithm":"SHA256","hash":"826eccbe073d3e7b806cd67e4d4ae09ede6d5ae6125480705b7bf81c2486f175","blockSize":4194304,"blocks":["826eccbe073d3e7b806cd67e4d4ae09ede6d5ae6125480705b7bf81c2486f175"]},"offset":"15392484"},"SplitMatch.js":{"size":874,"integrity":{"algorithm":"SHA256","hash":"316ced53a4420b95079c1160d67c81e52e91173360784bb3a517397420cb6d84","blockSize":4194304,"blocks":["316ced53a4420b95079c1160d67c81e52e91173360784bb3a517397420cb6d84"]},"offset":"15393328"},"StrictEqualityComparison.js":{"size":361,"integrity":{"algorithm":"SHA256","hash":"33928172f049f2f5fd7559470bb12647b7c6012b1da230e5a7e5fd8ffc1dd30e","blockSize":4194304,"blocks":["33928172f049f2f5fd7559470bb12647b7c6012b1da230e5a7e5fd8ffc1dd30e"]},"offset":"15394202"},"StringCreate.js":{"size":1117,"integrity":{"algorithm":"SHA256","hash":"18a70a9279026ea03b811f95a797cde8caf8d77a010880506e0f0b4532a1181d","blockSize":4194304,"blocks":["18a70a9279026ea03b811f95a797cde8caf8d77a010880506e0f0b4532a1181d"]},"offset":"15394563"},"StringGetOwnProperty.js":{"size":1382,"integrity":{"algorithm":"SHA256","hash":"084af8ee1c3326c443d0dcf86199c6deedc61057b08bd870c3e9415a12df78a4","blockSize":4194304,"blocks":["084af8ee1c3326c443d0dcf86199c6deedc61057b08bd870c3e9415a12df78a4"]},"offset":"15395680"},"StringPad.js":{"size":1263,"integrity":{"algorithm":"SHA256","hash":"dde7bd7c65aff1f92ba34d30a7b4ff101ebaffe29bba166a55db8468666d5167","blockSize":4194304,"blocks":["dde7bd7c65aff1f92ba34d30a7b4ff101ebaffe29bba166a55db8468666d5167"]},"offset":"15397062"},"StringToBigInt.js":{"size":581,"integrity":{"algorithm":"SHA256","hash":"b70e6ec493c91687edeb4059a4da64268405fba163ed262a46bfbfb4796c096c","blockSize":4194304,"blocks":["b70e6ec493c91687edeb4059a4da64268405fba163ed262a46bfbfb4796c096c"]},"offset":"15398325"},"SymbolDescriptiveString.js":{"size":526,"integrity":{"algorithm":"SHA256","hash":"d5a4e603be41ed5dff7123a6a0ba29efae0812f4d076a78387520b36b416a37d","blockSize":4194304,"blocks":["d5a4e603be41ed5dff7123a6a0ba29efae0812f4d076a78387520b36b416a37d"]},"offset":"15398906"},"TestIntegrityLevel.js":{"size":1285,"integrity":{"algorithm":"SHA256","hash":"8a0161ac60421c4762bc9e442224da95614cdb3e9865bcd79ad29d2310dd35c6","blockSize":4194304,"blocks":["8a0161ac60421c4762bc9e442224da95614cdb3e9865bcd79ad29d2310dd35c6"]},"offset":"15399432"},"TimeClip.js":{"size":468,"integrity":{"algorithm":"SHA256","hash":"bf1f153b35126ac0ebd122717e6349c97e932e3665ff1947f5f4a7da4895cb48","blockSize":4194304,"blocks":["bf1f153b35126ac0ebd122717e6349c97e932e3665ff1947f5f4a7da4895cb48"]},"offset":"15400717"},"TimeFromYear.js":{"size":261,"integrity":{"algorithm":"SHA256","hash":"07bd801ef44bcc4c5458937d6b3c09b1ba6f30d24fbb06ca9b4818c0699c330b","blockSize":4194304,"blocks":["07bd801ef44bcc4c5458937d6b3c09b1ba6f30d24fbb06ca9b4818c0699c330b"]},"offset":"15401185"},"TimeString.js":{"size":808,"integrity":{"algorithm":"SHA256","hash":"92304742e99d2785a471fbb7d92daed5d1e379fdcbbc34f7fe2e8f7f624288ea","blockSize":4194304,"blocks":["92304742e99d2785a471fbb7d92daed5d1e379fdcbbc34f7fe2e8f7f624288ea"]},"offset":"15401446"},"TimeWithinDay.js":{"size":247,"integrity":{"algorithm":"SHA256","hash":"c83b563c9849ca65fb1ed7235f72f42a019fde9e67aad81d1bd0699ed28f43f8","blockSize":4194304,"blocks":["c83b563c9849ca65fb1ed7235f72f42a019fde9e67aad81d1bd0699ed28f43f8"]},"offset":"15402254"},"ToBigInt.js":{"size":631,"integrity":{"algorithm":"SHA256","hash":"a74c2afb6aa83b8f29cb2996ad29c36834e8d5f11a3d65e74c75942ed115fa45","blockSize":4194304,"blocks":["a74c2afb6aa83b8f29cb2996ad29c36834e8d5f11a3d65e74c75942ed115fa45"]},"offset":"15402501"},"ToBigInt64.js":{"size":948,"integrity":{"algorithm":"SHA256","hash":"e8a2eb194795575175e044dd78406ba726f88609a70f69dc9cfbbdd66e3c4207","blockSize":4194304,"blocks":["e8a2eb194795575175e044dd78406ba726f88609a70f69dc9cfbbdd66e3c4207"]},"offset":"15403132"},"ToBigUint64.js":{"size":703,"integrity":{"algorithm":"SHA256","hash":"33065755daa1ea7d6906e3366e65042712b6457a576ff4d8259607fa6456b081","blockSize":4194304,"blocks":["33065755daa1ea7d6906e3366e65042712b6457a576ff4d8259607fa6456b081"]},"offset":"15404080"},"ToBoolean.js":{"size":130,"integrity":{"algorithm":"SHA256","hash":"36a4823341bd4ec68dd6f4b32afbbc939330a48bf7042108c9be89eaaab5bbc6","blockSize":4194304,"blocks":["36a4823341bd4ec68dd6f4b32afbbc939330a48bf7042108c9be89eaaab5bbc6"]},"offset":"15404783"},"ToDateString.js":{"size":498,"integrity":{"algorithm":"SHA256","hash":"57a5e2f02146ccfa64217595a7b5024fd7a74d9847a5d7df98f6cdaa04335612","blockSize":4194304,"blocks":["57a5e2f02146ccfa64217595a7b5024fd7a74d9847a5d7df98f6cdaa04335612"]},"offset":"15404913"},"ToIndex.js":{"size":657,"integrity":{"algorithm":"SHA256","hash":"bc51a0a3d0831fb3ee64b767dd2a5bc1303284101dd79f668e13089cee2addcb","blockSize":4194304,"blocks":["bc51a0a3d0831fb3ee64b767dd2a5bc1303284101dd79f668e13089cee2addcb"]},"offset":"15405411"},"ToInt16.js":{"size":260,"integrity":{"algorithm":"SHA256","hash":"ad0dcb3339d64526564c10379cc026a2f595f9ed7642199104eb0c0ffebccc35","blockSize":4194304,"blocks":["ad0dcb3339d64526564c10379cc026a2f595f9ed7642199104eb0c0ffebccc35"]},"offset":"15406068"},"ToInt32.js":{"size":173,"integrity":{"algorithm":"SHA256","hash":"e0c77696079335a016ce39e9992f11939ad25c1b322d119eedbec24a989a50a6","blockSize":4194304,"blocks":["e0c77696079335a016ce39e9992f11939ad25c1b322d119eedbec24a989a50a6"]},"offset":"15406328"},"ToInt8.js":{"size":247,"integrity":{"algorithm":"SHA256","hash":"0f844398064a22ca49a1c263a564e15449de26b5114281211d3de3535d914336","blockSize":4194304,"blocks":["0f844398064a22ca49a1c263a564e15449de26b5114281211d3de3535d914336"]},"offset":"15406501"},"ToInteger.js":{"size":331,"integrity":{"algorithm":"SHA256","hash":"92886c6e4e987d990a76bbce9f836834813897a198c89d700c8650920943e92a","blockSize":4194304,"blocks":["92886c6e4e987d990a76bbce9f836834813897a198c89d700c8650920943e92a"]},"offset":"15406748"},"ToLength.js":{"size":332,"integrity":{"algorithm":"SHA256","hash":"b4faf0dcbfc133417e965670ef8bf4071f0c323400c32f5cc528a3bc957e8fe5","blockSize":4194304,"blocks":["b4faf0dcbfc133417e965670ef8bf4071f0c323400c32f5cc528a3bc957e8fe5"]},"offset":"15407079"},"ToNumber.js":{"size":2136,"integrity":{"algorithm":"SHA256","hash":"a43038af4702ea51f083a1c6ab153acf77f4c175fe60d5522737d086e6c52302","blockSize":4194304,"blocks":["a43038af4702ea51f083a1c6ab153acf77f4c175fe60d5522737d086e6c52302"]},"offset":"15407411"},"ToNumeric.js":{"size":550,"integrity":{"algorithm":"SHA256","hash":"27ca877b991e5b6ffbd658cb86b67b5d5eaa90f730455d685e09649c03f7997d","blockSize":4194304,"blocks":["27ca877b991e5b6ffbd658cb86b67b5d5eaa90f730455d685e09649c03f7997d"]},"offset":"15409547"},"ToObject.js":{"size":334,"integrity":{"algorithm":"SHA256","hash":"2c382673870deb89e3b19511d8f08fa9554d103fa9d143e5a57b79d85a093725","blockSize":4194304,"blocks":["2c382673870deb89e3b19511d8f08fa9554d103fa9d143e5a57b79d85a093725"]},"offset":"15410097"},"ToPrimitive.js":{"size":287,"integrity":{"algorithm":"SHA256","hash":"fe27d95fe99afd38d780e7d88f349e1dc1a68841b845e118abb8c80c4ab9aa53","blockSize":4194304,"blocks":["fe27d95fe99afd38d780e7d88f349e1dc1a68841b845e118abb8c80c4ab9aa53"]},"offset":"15410431"},"ToPropertyDescriptor.js":{"size":1452,"integrity":{"algorithm":"SHA256","hash":"78b5dfba0830bc47aa55c1b33f2be8fd973ff5ccc87a599abadda676d3596c49","blockSize":4194304,"blocks":["78b5dfba0830bc47aa55c1b33f2be8fd973ff5ccc87a599abadda676d3596c49"]},"offset":"15410718"},"ToPropertyKey.js":{"size":405,"integrity":{"algorithm":"SHA256","hash":"58d4355f4509a456b237e1d72169200edb1810d1efa9ee167ac26faa7904edd3","blockSize":4194304,"blocks":["58d4355f4509a456b237e1d72169200edb1810d1efa9ee167ac26faa7904edd3"]},"offset":"15412170"},"ToString.js":{"size":396,"integrity":{"algorithm":"SHA256","hash":"79c26e024582b6ac70a965063b757c70ceea15fa8da17a78ebbf77b40ccaece3","blockSize":4194304,"blocks":["79c26e024582b6ac70a965063b757c70ceea15fa8da17a78ebbf77b40ccaece3"]},"offset":"15412575"},"ToUint16.js":{"size":564,"integrity":{"algorithm":"SHA256","hash":"5775f0384586a383c5dd6c359e37d4b218c8ddf069d7a2906f7e4752ab66a20d","blockSize":4194304,"blocks":["5775f0384586a383c5dd6c359e37d4b218c8ddf069d7a2906f7e4752ab66a20d"]},"offset":"15412971"},"ToUint32.js":{"size":175,"integrity":{"algorithm":"SHA256","hash":"b68209f8fb9d1e978fe3d162251bba47f056c43ec7028cbd99b485800bd62315","blockSize":4194304,"blocks":["b68209f8fb9d1e978fe3d162251bba47f056c43ec7028cbd99b485800bd62315"]},"offset":"15413535"},"ToUint8.js":{"size":578,"integrity":{"algorithm":"SHA256","hash":"94fa392bda40d5d6c1125b662b304a372b135660d3740eebae7ade568bdd52a9","blockSize":4194304,"blocks":["94fa392bda40d5d6c1125b662b304a372b135660d3740eebae7ade568bdd52a9"]},"offset":"15413710"},"ToUint8Clamp.js":{"size":522,"integrity":{"algorithm":"SHA256","hash":"30dd3065a73ef4ff1f0a018ce80bd550673e5ee29c732e6fc8cade4661f80d56","blockSize":4194304,"blocks":["30dd3065a73ef4ff1f0a018ce80bd550673e5ee29c732e6fc8cade4661f80d56"]},"offset":"15414288"},"TrimString.js":{"size":804,"integrity":{"algorithm":"SHA256","hash":"497ddda1a6981ecb64a4c5ea120100f61569ad519055b30741ad77d0aae3d458","blockSize":4194304,"blocks":["497ddda1a6981ecb64a4c5ea120100f61569ad519055b30741ad77d0aae3d458"]},"offset":"15414810"},"Type.js":{"size":297,"integrity":{"algorithm":"SHA256","hash":"bc73cb870d9593233f65bd1384e359bef23c86fc178ad9b655b03bfc93a9ccf4","blockSize":4194304,"blocks":["bc73cb870d9593233f65bd1384e359bef23c86fc178ad9b655b03bfc93a9ccf4"]},"offset":"15415614"},"UTF16DecodeString.js":{"size":753,"integrity":{"algorithm":"SHA256","hash":"b66d82d68466c1c273417f4887ea249e9d80b63e6744ec975f597b89ff935344","blockSize":4194304,"blocks":["b66d82d68466c1c273417f4887ea249e9d80b63e6744ec975f597b89ff935344"]},"offset":"15415911"},"UTF16DecodeSurrogatePair.js":{"size":776,"integrity":{"algorithm":"SHA256","hash":"8e666052891a17a409fed549fdb20b6ccfc2a7f281042aaafc0a37045a392d0c","blockSize":4194304,"blocks":["8e666052891a17a409fed549fdb20b6ccfc2a7f281042aaafc0a37045a392d0c"]},"offset":"15416664"},"UTF16Encoding.js":{"size":700,"integrity":{"algorithm":"SHA256","hash":"4a84fe0de13660a11bc7f0e2ccdb5611e6767e0f40b20a16c335db7316cf369f","blockSize":4194304,"blocks":["4a84fe0de13660a11bc7f0e2ccdb5611e6767e0f40b20a16c335db7316cf369f"]},"offset":"15417440"},"UnicodeEscape.js":{"size":839,"integrity":{"algorithm":"SHA256","hash":"8080d2e44eba21ab06abd3b7d03dd18fe93033737ace10a1d963222335960413","blockSize":4194304,"blocks":["8080d2e44eba21ab06abd3b7d03dd18fe93033737ace10a1d963222335960413"]},"offset":"15418140"},"ValidateAndApplyPropertyDescriptor.js":{"size":5243,"integrity":{"algorithm":"SHA256","hash":"588f81f21e07a8d2255bc0aed34c94052aa74d5b558edc4435d0acee12c90554","blockSize":4194304,"blocks":["588f81f21e07a8d2255bc0aed34c94052aa74d5b558edc4435d0acee12c90554"]},"offset":"15418979"},"WeekDay.js":{"size":208,"integrity":{"algorithm":"SHA256","hash":"f7cc798c72dcc484295681d29d535e64215a9ec303f4f6e6456ea63e83ce0246","blockSize":4194304,"blocks":["f7cc798c72dcc484295681d29d535e64215a9ec303f4f6e6456ea63e83ce0246"]},"offset":"15424222"},"YearFromTime.js":{"size":407,"integrity":{"algorithm":"SHA256","hash":"5562b7fd6be438187a1187a331f0d310e631e9747df14521accc7a797e2a2aa7","blockSize":4194304,"blocks":["5562b7fd6be438187a1187a331f0d310e631e9747df14521accc7a797e2a2aa7"]},"offset":"15424430"},"abs.js":{"size":207,"integrity":{"algorithm":"SHA256","hash":"a50e248c29238747c3c278a4edf2c0643f1295d1c065d9dff8524def17f0427f","blockSize":4194304,"blocks":["a50e248c29238747c3c278a4edf2c0643f1295d1c065d9dff8524def17f0427f"]},"offset":"15424837"},"floor.js":{"size":217,"integrity":{"algorithm":"SHA256","hash":"90c20830ae8762224c83fb0ed36a288a7d567f57d3b5acb469590cc2d5e13f55","blockSize":4194304,"blocks":["90c20830ae8762224c83fb0ed36a288a7d567f57d3b5acb469590cc2d5e13f55"]},"offset":"15425044"},"modulo.js":{"size":168,"integrity":{"algorithm":"SHA256","hash":"84923b64427edcc840ee9a305dca213f4bf1e04ed8f88f6bfd7bfa9e655d7c98","blockSize":4194304,"blocks":["84923b64427edcc840ee9a305dca213f4bf1e04ed8f88f6bfd7bfa9e655d7c98"]},"offset":"15425261"},"msFromTime.js":{"size":253,"integrity":{"algorithm":"SHA256","hash":"ef13a7e7721d695f125a7e772f8037ed34aa3c97aaa3692da900c6796cd270da","blockSize":4194304,"blocks":["ef13a7e7721d695f125a7e772f8037ed34aa3c97aaa3692da900c6796cd270da"]},"offset":"15425429"},"thisBigIntValue.js":{"size":551,"integrity":{"algorithm":"SHA256","hash":"5fec6c678aa3d69d9861a2ccd5e7a5e093db79a1a208cd68bd0534b7dcec60f9","blockSize":4194304,"blocks":["5fec6c678aa3d69d9861a2ccd5e7a5e093db79a1a208cd68bd0534b7dcec60f9"]},"offset":"15425682"},"thisBooleanValue.js":{"size":367,"integrity":{"algorithm":"SHA256","hash":"171bd884e07701d9e37bece81b05a95fd7d822ff7eaaba5c112d6e3a352ad498","blockSize":4194304,"blocks":["171bd884e07701d9e37bece81b05a95fd7d822ff7eaaba5c112d6e3a352ad498"]},"offset":"15426233"},"thisNumberValue.js":{"size":390,"integrity":{"algorithm":"SHA256","hash":"a3bb9eb733e74de8a50f49e4425e57fd01bebbf66df4f9967da3d9edee589455","blockSize":4194304,"blocks":["a3bb9eb733e74de8a50f49e4425e57fd01bebbf66df4f9967da3d9edee589455"]},"offset":"15426600"},"thisStringValue.js":{"size":361,"integrity":{"algorithm":"SHA256","hash":"47305af763f963ab1c547011b6be408827678d61540009de579bf996d0810ff5","blockSize":4194304,"blocks":["47305af763f963ab1c547011b6be408827678d61540009de579bf996d0810ff5"]},"offset":"15426990"},"thisSymbolValue.js":{"size":514,"integrity":{"algorithm":"SHA256","hash":"27b446ef7c0dcc60f576357f187bb9af1a86d6557ab82a144d2390e793dc94db","blockSize":4194304,"blocks":["27b446ef7c0dcc60f576357f187bb9af1a86d6557ab82a144d2390e793dc94db"]},"offset":"15427351"},"thisTimeValue.js":{"size":66,"integrity":{"algorithm":"SHA256","hash":"e4edc25cb1edf0faea5b4a9c844ce72636b702a033b075ee0f7ffbedc14e442a","blockSize":4194304,"blocks":["e4edc25cb1edf0faea5b4a9c844ce72636b702a033b075ee0f7ffbedc14e442a"]},"offset":"15427865"},"Number":{"files":{"add.js":{"size":960,"integrity":{"algorithm":"SHA256","hash":"5321ff6aafdb4d4f93863ba8f8e1264c03d298b56357d171e60fc5caa39af507","blockSize":4194304,"blocks":["5321ff6aafdb4d4f93863ba8f8e1264c03d298b56357d171e60fc5caa39af507"]},"offset":"15427931"},"bitwiseAND.js":{"size":503,"integrity":{"algorithm":"SHA256","hash":"bb6bbbd3e4a97dd371148c9871393bd846ba4e42086e1115e5b87bc3ae75797f","blockSize":4194304,"blocks":["bb6bbbd3e4a97dd371148c9871393bd846ba4e42086e1115e5b87bc3ae75797f"]},"offset":"15428891"},"bitwiseNOT.js":{"size":578,"integrity":{"algorithm":"SHA256","hash":"40ac9295ed27001ba228b4b9eac45bbced235f121989a7f320128dcf32199c2e","blockSize":4194304,"blocks":["40ac9295ed27001ba228b4b9eac45bbced235f121989a7f320128dcf32199c2e"]},"offset":"15429394"},"bitwiseOR.js":{"size":501,"integrity":{"algorithm":"SHA256","hash":"8cb3f9e18fd1e61a9c2839e5a80471ee1c26e0e08283d5c42245cfb6b5e12007","blockSize":4194304,"blocks":["8cb3f9e18fd1e61a9c2839e5a80471ee1c26e0e08283d5c42245cfb6b5e12007"]},"offset":"15429972"},"bitwiseXOR.js":{"size":503,"integrity":{"algorithm":"SHA256","hash":"39fc03cc383e0c4b5d7cb7046da98cc9da9e7452a112fde02cccca096ad7573c","blockSize":4194304,"blocks":["39fc03cc383e0c4b5d7cb7046da98cc9da9e7452a112fde02cccca096ad7573c"]},"offset":"15430473"},"divide.js":{"size":638,"integrity":{"algorithm":"SHA256","hash":"275664feaad88de432888432d00e07d412173d40eca1ebc0dc11c2a9ab08ee9c","blockSize":4194304,"blocks":["275664feaad88de432888432d00e07d412173d40eca1ebc0dc11c2a9ab08ee9c"]},"offset":"15430976"},"equal.js":{"size":556,"integrity":{"algorithm":"SHA256","hash":"26bf0a7b691fc9541b9d5c2e59ffb9e47480029ae5872b4463da733bd79ffc86","blockSize":4194304,"blocks":["26bf0a7b691fc9541b9d5c2e59ffb9e47480029ae5872b4463da733bd79ffc86"]},"offset":"15431614"},"exponentiate.js":{"size":1780,"integrity":{"algorithm":"SHA256","hash":"ade7c349d8d69d43e975ac9fa47326e6b40125e480eedbef20e6151e76d3d37b","blockSize":4194304,"blocks":["ade7c349d8d69d43e975ac9fa47326e6b40125e480eedbef20e6151e76d3d37b"]},"offset":"15432170"},"index.js":{"size":1274,"integrity":{"algorithm":"SHA256","hash":"00f330b5363f68d5bdb0f15ad7adef0002730eaa4ac2de69af6b34f624585f21","blockSize":4194304,"blocks":["00f330b5363f68d5bdb0f15ad7adef0002730eaa4ac2de69af6b34f624585f21"]},"offset":"15433950"},"leftShift.js":{"size":599,"integrity":{"algorithm":"SHA256","hash":"713125181b6ded4bf51336abbd9da2a9210285d6e61668fa53f6cca91406424e","blockSize":4194304,"blocks":["713125181b6ded4bf51336abbd9da2a9210285d6e61668fa53f6cca91406424e"]},"offset":"15435224"},"lessThan.js":{"size":642,"integrity":{"algorithm":"SHA256","hash":"a076216bc2e2bbfb83a35db95fea5fa34a759ad27dc8691996e7109e991bfa7d","blockSize":4194304,"blocks":["a076216bc2e2bbfb83a35db95fea5fa34a759ad27dc8691996e7109e991bfa7d"]},"offset":"15435823"},"multiply.js":{"size":848,"integrity":{"algorithm":"SHA256","hash":"9c70611502810d74b71a7087cda1badbd7e62bed63b93eff8e529eaecc48ad05","blockSize":4194304,"blocks":["9c70611502810d74b71a7087cda1badbd7e62bed63b93eff8e529eaecc48ad05"]},"offset":"15436465"},"remainder.js":{"size":1040,"integrity":{"algorithm":"SHA256","hash":"9076c645d8cb0a35d45b908c2e2fcd9fb5b67206e1268ac55de9c627b7d28749","blockSize":4194304,"blocks":["9076c645d8cb0a35d45b908c2e2fcd9fb5b67206e1268ac55de9c627b7d28749"]},"offset":"15437313"},"sameValue.js":{"size":632,"integrity":{"algorithm":"SHA256","hash":"397208a584900e79ba3bb5b90317119e9116ccf6e84ba64f02c88d15d7813fa0","blockSize":4194304,"blocks":["397208a584900e79ba3bb5b90317119e9116ccf6e84ba64f02c88d15d7813fa0"]},"offset":"15438353"},"sameValueZero.js":{"size":575,"integrity":{"algorithm":"SHA256","hash":"6a3d4872356b651b03d296d09d3692b9116100da0b330302b0f812a47dcd54dc","blockSize":4194304,"blocks":["6a3d4872356b651b03d296d09d3692b9116100da0b330302b0f812a47dcd54dc"]},"offset":"15438985"},"signedRightShift.js":{"size":613,"integrity":{"algorithm":"SHA256","hash":"08dfd7a081f88ecda0023620853f25ca9f19ea900f3e161cde010e795be71206","blockSize":4194304,"blocks":["08dfd7a081f88ecda0023620853f25ca9f19ea900f3e161cde010e795be71206"]},"offset":"15439560"},"subtract.js":{"size":425,"integrity":{"algorithm":"SHA256","hash":"287991f34026bb7a3674bfd4b3b2bfd9c1b50187dbee2067fae8aa73f109fc62","blockSize":4194304,"blocks":["287991f34026bb7a3674bfd4b3b2bfd9c1b50187dbee2067fae8aa73f109fc62"]},"offset":"15440173"},"toString.js":{"size":427,"integrity":{"algorithm":"SHA256","hash":"0c8d3e2501cabc643dd5d94ac992812e94353be181a66078808a396f8b6b7921","blockSize":4194304,"blocks":["0c8d3e2501cabc643dd5d94ac992812e94353be181a66078808a396f8b6b7921"]},"offset":"15440598"},"unaryMinus.js":{"size":470,"integrity":{"algorithm":"SHA256","hash":"59e344d056276d927fd9e54d42ab5e18e757585c247b11af8dc1d7e426a399c2","blockSize":4194304,"blocks":["59e344d056276d927fd9e54d42ab5e18e757585c247b11af8dc1d7e426a399c2"]},"offset":"15441025"},"unsignedRightShift.js":{"size":618,"integrity":{"algorithm":"SHA256","hash":"7b0adb99247e4c17f48da89e4f9d1b10f836cd73d80eb06251d108fa75fce170","blockSize":4194304,"blocks":["7b0adb99247e4c17f48da89e4f9d1b10f836cd73d80eb06251d108fa75fce170"]},"offset":"15441495"}}},"BigInt":{"files":{"add.js":{"size":459,"integrity":{"algorithm":"SHA256","hash":"d55ebd3a472b86f1db4d5eb8cc684e367820371e6cddb207688f8122b3f237f5","blockSize":4194304,"blocks":["d55ebd3a472b86f1db4d5eb8cc684e367820371e6cddb207688f8122b3f237f5"]},"offset":"15442113"},"bitwiseAND.js":{"size":503,"integrity":{"algorithm":"SHA256","hash":"86f26a63dcd4663d5fd7b820775b47a509665e157b5799074cbf38d12fee91b4","blockSize":4194304,"blocks":["86f26a63dcd4663d5fd7b820775b47a509665e157b5799074cbf38d12fee91b4"]},"offset":"15442572"},"bitwiseNOT.js":{"size":450,"integrity":{"algorithm":"SHA256","hash":"23dc36c4b12eeef514fffff7a2b1e8ca67266c196b822f7fe4ae7dd5b1a7e294","blockSize":4194304,"blocks":["23dc36c4b12eeef514fffff7a2b1e8ca67266c196b822f7fe4ae7dd5b1a7e294"]},"offset":"15443075"},"bitwiseOR.js":{"size":501,"integrity":{"algorithm":"SHA256","hash":"95138fb96a65244d6271b4e0faf02020d6c8660c80e7b5c6ade8399cc7798f68","blockSize":4194304,"blocks":["95138fb96a65244d6271b4e0faf02020d6c8660c80e7b5c6ade8399cc7798f68"]},"offset":"15443525"},"bitwiseXOR.js":{"size":503,"integrity":{"algorithm":"SHA256","hash":"9fdd0d05db13029c45453cc521279d497352f74cfb3f50c93a3f8c32b6af774c","blockSize":4194304,"blocks":["9fdd0d05db13029c45453cc521279d497352f74cfb3f50c93a3f8c32b6af774c"]},"offset":"15444026"},"divide.js":{"size":631,"integrity":{"algorithm":"SHA256","hash":"9fb2dc83404b068c916c9f8fbb503d96a3db1bf47081e15543ee2ef16077edc3","blockSize":4194304,"blocks":["9fb2dc83404b068c916c9f8fbb503d96a3db1bf47081e15543ee2ef16077edc3"]},"offset":"15444529"},"equal.js":{"size":464,"integrity":{"algorithm":"SHA256","hash":"63c672cb74f047e1ceeed875f3854bfc4b830615244b66dd3008eec0c8894bdf","blockSize":4194304,"blocks":["63c672cb74f047e1ceeed875f3854bfc4b830615244b66dd3008eec0c8894bdf"]},"offset":"15445160"},"exponentiate.js":{"size":887,"integrity":{"algorithm":"SHA256","hash":"cda6fd636de63bbd6f1341aa870543d3984655dcb499ca601258740019ee6180","blockSize":4194304,"blocks":["cda6fd636de63bbd6f1341aa870543d3984655dcb499ca601258740019ee6180"]},"offset":"15445624"},"index.js":{"size":1274,"integrity":{"algorithm":"SHA256","hash":"00f330b5363f68d5bdb0f15ad7adef0002730eaa4ac2de69af6b34f624585f21","blockSize":4194304,"blocks":["00f330b5363f68d5bdb0f15ad7adef0002730eaa4ac2de69af6b34f624585f21"]},"offset":"15446511"},"leftShift.js":{"size":472,"integrity":{"algorithm":"SHA256","hash":"7960fc0f19a25dc570d50eeb3987c52bfab0c427fe4ce7caf878d1948c6545a5","blockSize":4194304,"blocks":["7960fc0f19a25dc570d50eeb3987c52bfab0c427fe4ce7caf878d1948c6545a5"]},"offset":"15447785"},"lessThan.js":{"size":469,"integrity":{"algorithm":"SHA256","hash":"2a409f36dfec778087b65dbb7e3bde4af1242faf445c1188e293bf5e81625ac7","blockSize":4194304,"blocks":["2a409f36dfec778087b65dbb7e3bde4af1242faf445c1188e293bf5e81625ac7"]},"offset":"15448257"},"multiply.js":{"size":469,"integrity":{"algorithm":"SHA256","hash":"2c98615507b3d321486186eb7e31ff256c56cf1defd591ebd687f88617f8b1f8","blockSize":4194304,"blocks":["2c98615507b3d321486186eb7e31ff256c56cf1defd591ebd687f88617f8b1f8"]},"offset":"15448726"},"remainder.js":{"size":706,"integrity":{"algorithm":"SHA256","hash":"5376f57802b67b74f2f0c2649e30c8f12a4ffb2930ff1fda6d8e977d1ecf4339","blockSize":4194304,"blocks":["5376f57802b67b74f2f0c2649e30c8f12a4ffb2930ff1fda6d8e977d1ecf4339"]},"offset":"15449195"},"sameValue.js":{"size":478,"integrity":{"algorithm":"SHA256","hash":"3298de79d5f2445230c0ada00aad7aaf397f9cedbafca4e883eb14ed728969a9","blockSize":4194304,"blocks":["3298de79d5f2445230c0ada00aad7aaf397f9cedbafca4e883eb14ed728969a9"]},"offset":"15449901"},"sameValueZero.js":{"size":486,"integrity":{"algorithm":"SHA256","hash":"ca2826c7fad717651658a2b4c1e5c1ac6ea8c2ec672e07a9b776ae94cbfb5072","blockSize":4194304,"blocks":["ca2826c7fad717651658a2b4c1e5c1ac6ea8c2ec672e07a9b776ae94cbfb5072"]},"offset":"15450379"},"signedRightShift.js":{"size":505,"integrity":{"algorithm":"SHA256","hash":"c2e81957b638d1b70a7a2b7da8862c7d1209cea6504b0bcdaa2cd48fbd5f91da","blockSize":4194304,"blocks":["c2e81957b638d1b70a7a2b7da8862c7d1209cea6504b0bcdaa2cd48fbd5f91da"]},"offset":"15450865"},"subtract.js":{"size":469,"integrity":{"algorithm":"SHA256","hash":"4e53c777ed8780ad5389ab7a5e702092dfc5c7a5fbf572a85990d3c9d4a6f7dd","blockSize":4194304,"blocks":["4e53c777ed8780ad5389ab7a5e702092dfc5c7a5fbf572a85990d3c9d4a6f7dd"]},"offset":"15451370"},"toString.js":{"size":427,"integrity":{"algorithm":"SHA256","hash":"b3b5235fd84cd1f64a6c4f580a44a5aab99a0ca72be9446fc457299beea6fac0","blockSize":4194304,"blocks":["b3b5235fd84cd1f64a6c4f580a44a5aab99a0ca72be9446fc457299beea6fac0"]},"offset":"15451839"},"unaryMinus.js":{"size":511,"integrity":{"algorithm":"SHA256","hash":"daaf42db7cafafe67bc4bd73931f958393a1a0cdfbb259390e59e883928d7258","blockSize":4194304,"blocks":["daaf42db7cafafe67bc4bd73931f958393a1a0cdfbb259390e59e883928d7258"]},"offset":"15452266"},"unsignedRightShift.js":{"size":510,"integrity":{"algorithm":"SHA256","hash":"593eccf481aec7fc53840d274d75aa3827c9f08107a60c579c2953e0ed0ab846","blockSize":4194304,"blocks":["593eccf481aec7fc53840d274d75aa3827c9f08107a60c579c2953e0ed0ab846"]},"offset":"15452777"}}}}},"2021":{"files":{"AbstractEqualityComparison.js":{"size":1873,"integrity":{"algorithm":"SHA256","hash":"83dd5215f6114b08ebd495a30d0568d05440f8cf9bc1cbf4ff0e450dcea74096","blockSize":4194304,"blocks":["83dd5215f6114b08ebd495a30d0568d05440f8cf9bc1cbf4ff0e450dcea74096"]},"offset":"15134046"},"AbstractRelationalComparison.js":{"size":2121,"integrity":{"algorithm":"SHA256","hash":"19f29e9e33468564be30bc77c6cb3676d6385c3d996f12973565bcc0d334e472","blockSize":4194304,"blocks":["19f29e9e33468564be30bc77c6cb3676d6385c3d996f12973565bcc0d334e472"]},"offset":"15135919"},"AddEntriesFromIterable.js":{"size":1519,"integrity":{"algorithm":"SHA256","hash":"a2a37224988c05e3ab0b313d3e2cba70be3ff20e71b6df11edc71fd7b6040192","blockSize":4194304,"blocks":["a2a37224988c05e3ab0b313d3e2cba70be3ff20e71b6df11edc71fd7b6040192"]},"offset":"15138040"},"AddToKeptObjects.js":{"size":645,"integrity":{"algorithm":"SHA256","hash":"4ec6c3fc7ca0668126681940c8500fbf7c3b64dda1f2a4e9d48f9c02e4975a27","blockSize":4194304,"blocks":["4ec6c3fc7ca0668126681940c8500fbf7c3b64dda1f2a4e9d48f9c02e4975a27"]},"offset":"15139559"},"AdvanceStringIndex.js":{"size":1010,"integrity":{"algorithm":"SHA256","hash":"a37f26cd2cd0e612360c0d2296f2b7a3c8109654383ba72ea0d764b63aae69d5","blockSize":4194304,"blocks":["a37f26cd2cd0e612360c0d2296f2b7a3c8109654383ba72ea0d764b63aae69d5"]},"offset":"15140204"},"ApplyStringOrNumericBinaryOperator.js":{"size":3187,"integrity":{"algorithm":"SHA256","hash":"d1439502c727461cc2423ab28f037be9921092799a13c4873db3bddd1794c244","blockSize":4194304,"blocks":["d1439502c727461cc2423ab28f037be9921092799a13c4873db3bddd1794c244"]},"offset":"15141214"},"ArrayCreate.js":{"size":1667,"integrity":{"algorithm":"SHA256","hash":"57c944ded8a32ef497f3a8c1ab8ea121c128839f9721df7666479593532c9c75","blockSize":4194304,"blocks":["57c944ded8a32ef497f3a8c1ab8ea121c128839f9721df7666479593532c9c75"]},"offset":"15144401"},"ArraySetLength.js":{"size":2665,"integrity":{"algorithm":"SHA256","hash":"4b07de7693377557e2f05bf21ea871ff235ce1121e0e95846f5639fa5cc3ebb1","blockSize":4194304,"blocks":["4b07de7693377557e2f05bf21ea871ff235ce1121e0e95846f5639fa5cc3ebb1"]},"offset":"15146068"},"ArraySpeciesCreate.js":{"size":1370,"integrity":{"algorithm":"SHA256","hash":"5f48d84fcd0e44c8ff2a177aa346de4ac8a138cccd80752fe0041d01421f587d","blockSize":4194304,"blocks":["5f48d84fcd0e44c8ff2a177aa346de4ac8a138cccd80752fe0041d01421f587d"]},"offset":"15148733"},"BigIntBitwiseOp.js":{"size":1735,"integrity":{"algorithm":"SHA256","hash":"407178e5d611fcdfcd1af1dd2f5c16804c048b53656d23e26f63700a3fcd4153","blockSize":4194304,"blocks":["407178e5d611fcdfcd1af1dd2f5c16804c048b53656d23e26f63700a3fcd4153"]},"offset":"15150103"},"BinaryAnd.js":{"size":364,"integrity":{"algorithm":"SHA256","hash":"38c2e690ef1ebb7332d98d27095de8931e2ae9516b5ff5fa102d73c5093d4408","blockSize":4194304,"blocks":["38c2e690ef1ebb7332d98d27095de8931e2ae9516b5ff5fa102d73c5093d4408"]},"offset":"15151838"},"BinaryOr.js":{"size":362,"integrity":{"algorithm":"SHA256","hash":"5c95b7bca8afa7f8e0ee93f1047e344fa9ebec555d926aee3a6290a625504b84","blockSize":4194304,"blocks":["5c95b7bca8afa7f8e0ee93f1047e344fa9ebec555d926aee3a6290a625504b84"]},"offset":"15152202"},"BinaryXor.js":{"size":364,"integrity":{"algorithm":"SHA256","hash":"35dfdf32b56aae2408cb3a336fdc3172b1389c8de0fad05ebb62226cd7016a8f","blockSize":4194304,"blocks":["35dfdf32b56aae2408cb3a336fdc3172b1389c8de0fad05ebb62226cd7016a8f"]},"offset":"15152564"},"ByteListBitwiseOp.js":{"size":1323,"integrity":{"algorithm":"SHA256","hash":"9b3671d8ed8627796e8e383600b048927b4fb1350fd2bac73ab73e5d6a3075cf","blockSize":4194304,"blocks":["9b3671d8ed8627796e8e383600b048927b4fb1350fd2bac73ab73e5d6a3075cf"]},"offset":"15152928"},"ByteListEqual.js":{"size":913,"integrity":{"algorithm":"SHA256","hash":"91f13d3e38714c5077e445752c165091bb6db0a5833a6602c6d585ee1f6c784a","blockSize":4194304,"blocks":["91f13d3e38714c5077e445752c165091bb6db0a5833a6602c6d585ee1f6c784a"]},"offset":"15154251"},"Call.js":{"size":623,"integrity":{"algorithm":"SHA256","hash":"b092006d05bceeccee48bdf3fde9d83ee54a156eb2841bf5cacdca9f157b4571","blockSize":4194304,"blocks":["b092006d05bceeccee48bdf3fde9d83ee54a156eb2841bf5cacdca9f157b4571"]},"offset":"15155164"},"CanonicalNumericIndexString.js":{"size":654,"integrity":{"algorithm":"SHA256","hash":"c850cc1637b82f4fc238d2ae1a45229e8d44bc5c9b85205c0f27a1e0e9bb9d2b","blockSize":4194304,"blocks":["c850cc1637b82f4fc238d2ae1a45229e8d44bc5c9b85205c0f27a1e0e9bb9d2b"]},"offset":"15155787"},"CharacterRange.js":{"size":782,"integrity":{"algorithm":"SHA256","hash":"49612101e544a9b707f116ac8fe2be0d2c559c1d3b4f94ba47f36832913ea11f","blockSize":4194304,"blocks":["49612101e544a9b707f116ac8fe2be0d2c559c1d3b4f94ba47f36832913ea11f"]},"offset":"15156441"},"ClearKeptObjects.js":{"size":302,"integrity":{"algorithm":"SHA256","hash":"607fd49d35a0db529605b8ea50cd5526ce9c35ac0caa200a6beb2da4aab04c35","blockSize":4194304,"blocks":["607fd49d35a0db529605b8ea50cd5526ce9c35ac0caa200a6beb2da4aab04c35"]},"offset":"15157223"},"CodePointAt.js":{"size":1740,"integrity":{"algorithm":"SHA256","hash":"e1fea9e57767a094f7a01cbfb90259a1b4fc945f3676693d861e4a3e3784e59a","blockSize":4194304,"blocks":["e1fea9e57767a094f7a01cbfb90259a1b4fc945f3676693d861e4a3e3784e59a"]},"offset":"15157525"},"CodePointsToString.js":{"size":788,"integrity":{"algorithm":"SHA256","hash":"9686c83f1cfbbcb66eba167db410c3d538cb7070416cce8411892576cd922a1b","blockSize":4194304,"blocks":["9686c83f1cfbbcb66eba167db410c3d538cb7070416cce8411892576cd922a1b"]},"offset":"15159265"},"CompletePropertyDescriptor.js":{"size":989,"integrity":{"algorithm":"SHA256","hash":"17825d14da6797c52aa699d7b089bc2370d5a899cb7af7e3485f948fde50fca2","blockSize":4194304,"blocks":["17825d14da6797c52aa699d7b089bc2370d5a899cb7af7e3485f948fde50fca2"]},"offset":"15160053"},"CopyDataProperties.js":{"size":2054,"integrity":{"algorithm":"SHA256","hash":"521745b80516fd30edd241cb6ec7cc0dc60af43c0047f4b70fa0005ed21b46a5","blockSize":4194304,"blocks":["521745b80516fd30edd241cb6ec7cc0dc60af43c0047f4b70fa0005ed21b46a5"]},"offset":"15161042"},"CreateDataProperty.js":{"size":1279,"integrity":{"algorithm":"SHA256","hash":"5006509a3f5567f81cb7f730448a0a492c64c7f06406627c58d0334dde5e44f9","blockSize":4194304,"blocks":["5006509a3f5567f81cb7f730448a0a492c64c7f06406627c58d0334dde5e44f9"]},"offset":"15163096"},"CreateDataPropertyOrThrow.js":{"size":734,"integrity":{"algorithm":"SHA256","hash":"50c61c792c27d661346cfb29fe5b7603a2713d7acb1dc5b3b35fe71ece8fd18e","blockSize":4194304,"blocks":["50c61c792c27d661346cfb29fe5b7603a2713d7acb1dc5b3b35fe71ece8fd18e"]},"offset":"15164375"},"CreateHTML.js":{"size":927,"integrity":{"algorithm":"SHA256","hash":"5b9cf63f6b4bc50077e333c2b310cbd4c85a97891b2e1d28a93aeeb4370c2930","blockSize":4194304,"blocks":["5b9cf63f6b4bc50077e333c2b310cbd4c85a97891b2e1d28a93aeeb4370c2930"]},"offset":"15165109"},"CreateIterResultObject.js":{"size":432,"integrity":{"algorithm":"SHA256","hash":"289a26996866dba6f6292ba0931e643c7a5851f21003d41e5a004862a03a2035","blockSize":4194304,"blocks":["289a26996866dba6f6292ba0931e643c7a5851f21003d41e5a004862a03a2035"]},"offset":"15166036"},"CreateListFromArrayLike.js":{"size":1363,"integrity":{"algorithm":"SHA256","hash":"6be740d47f24bafd1ffa0710a7f94e86e34042b1fb0d2a40a1ea3c70dc331738","blockSize":4194304,"blocks":["6be740d47f24bafd1ffa0710a7f94e86e34042b1fb0d2a40a1ea3c70dc331738"]},"offset":"15166468"},"CreateMethodProperty.js":{"size":979,"integrity":{"algorithm":"SHA256","hash":"117c68b2fa6825c31e8d6f4970973fddf09fd74506447ca22ed3cfc2ed8b04e8","blockSize":4194304,"blocks":["117c68b2fa6825c31e8d6f4970973fddf09fd74506447ca22ed3cfc2ed8b04e8"]},"offset":"15167831"},"CreateRegExpStringIterator.js":{"size":3708,"integrity":{"algorithm":"SHA256","hash":"317ed938151dfef9b0bfccf08cf6ca31d3465ef38ab9be62edd036ea046f49b6","blockSize":4194304,"blocks":["317ed938151dfef9b0bfccf08cf6ca31d3465ef38ab9be62edd036ea046f49b6"]},"offset":"15168810"},"DateFromTime.js":{"size":1036,"integrity":{"algorithm":"SHA256","hash":"ae437cb5ee92b162e18b6f47b9dd66b66f627547e098a0670d60c2572f04b1ed","blockSize":4194304,"blocks":["ae437cb5ee92b162e18b6f47b9dd66b66f627547e098a0670d60c2572f04b1ed"]},"offset":"15172518"},"DateString.js":{"size":1055,"integrity":{"algorithm":"SHA256","hash":"9dde544576a4c552c56ee5f102459d4e3ca28bb800ccba833b53bd159d1e864a","blockSize":4194304,"blocks":["9dde544576a4c552c56ee5f102459d4e3ca28bb800ccba833b53bd159d1e864a"]},"offset":"15173554"},"Day.js":{"size":234,"integrity":{"algorithm":"SHA256","hash":"ff3875a46c34886cff3808ab1c4de6d3b45a61e9638b32edd22f41277c153ea5","blockSize":4194304,"blocks":["ff3875a46c34886cff3808ab1c4de6d3b45a61e9638b32edd22f41277c153ea5"]},"offset":"15174609"},"DayFromYear.js":{"size":256,"integrity":{"algorithm":"SHA256","hash":"378eb638143e86cfa3061177986dcfdb6bdec76e8b799b95cf3b9cafc5e9af68","blockSize":4194304,"blocks":["378eb638143e86cfa3061177986dcfdb6bdec76e8b799b95cf3b9cafc5e9af68"]},"offset":"15174843"},"DayWithinYear.js":{"size":286,"integrity":{"algorithm":"SHA256","hash":"b1ac5824fb1ced3e9d2dae99db5bd3890b4ef25dc45e50a4f927384bb5be618e","blockSize":4194304,"blocks":["b1ac5824fb1ced3e9d2dae99db5bd3890b4ef25dc45e50a4f927384bb5be618e"]},"offset":"15175099"},"DaysInYear.js":{"size":301,"integrity":{"algorithm":"SHA256","hash":"3f5955b3d1831ed2d008ae052a802b12c22bf1ba6d8fd286e0cb7a6a77144aec","blockSize":4194304,"blocks":["3f5955b3d1831ed2d008ae052a802b12c22bf1ba6d8fd286e0cb7a6a77144aec"]},"offset":"15175385"},"DefinePropertyOrThrow.js":{"size":1466,"integrity":{"algorithm":"SHA256","hash":"1964ecd5b9e64b3ddb203ac7da3410e09a2b1d0ab9b1f06733af8ea15ae954a4","blockSize":4194304,"blocks":["1964ecd5b9e64b3ddb203ac7da3410e09a2b1d0ab9b1f06733af8ea15ae954a4"]},"offset":"15175686"},"DeletePropertyOrThrow.js":{"size":699,"integrity":{"algorithm":"SHA256","hash":"3c1ac659ec4eb7ad97e99c2c3d08c2058624eec2ac0bcca0583660a0fe69f1c5","blockSize":4194304,"blocks":["3c1ac659ec4eb7ad97e99c2c3d08c2058624eec2ac0bcca0583660a0fe69f1c5"]},"offset":"15177152"},"EnumerableOwnPropertyNames.js":{"size":1112,"integrity":{"algorithm":"SHA256","hash":"d389393a016c32c0b737581f924aad9edb42291b1f869bb514f5521f31a4a198","blockSize":4194304,"blocks":["d389393a016c32c0b737581f924aad9edb42291b1f869bb514f5521f31a4a198"]},"offset":"15177851"},"FlattenIntoArray.js":{"size":1752,"integrity":{"algorithm":"SHA256","hash":"005084af0dadcac75646c5db3744c8ced48a4ca4ba8c50949355c8770ea108f7","blockSize":4194304,"blocks":["005084af0dadcac75646c5db3744c8ced48a4ca4ba8c50949355c8770ea108f7"]},"offset":"15178963"},"FromPropertyDescriptor.js":{"size":450,"integrity":{"algorithm":"SHA256","hash":"a16798c55be7b402fc2b27d4d422f322c40639b7403d47cb897b576fcc1ddd49","blockSize":4194304,"blocks":["a16798c55be7b402fc2b27d4d422f322c40639b7403d47cb897b576fcc1ddd49"]},"offset":"15180715"},"Get.js":{"size":602,"integrity":{"algorithm":"SHA256","hash":"ef9a4a39b94f3287d0c9ed27b9a5f1cb71164d2184d6aaf2fc5900fd44016ff9","blockSize":4194304,"blocks":["ef9a4a39b94f3287d0c9ed27b9a5f1cb71164d2184d6aaf2fc5900fd44016ff9"]},"offset":"15181165"},"GetIterator.js":{"size":1720,"integrity":{"algorithm":"SHA256","hash":"bd462e2f956ac2c90ec0c3365da5c7b76816e16cf01a8e66aa32ee03342e7950","blockSize":4194304,"blocks":["bd462e2f956ac2c90ec0c3365da5c7b76816e16cf01a8e66aa32ee03342e7950"]},"offset":"15181767"},"GetMethod.js":{"size":663,"integrity":{"algorithm":"SHA256","hash":"87f8829531af6b2019ed31d44f2efcf89e8bf345c158ad6bd790f8e14028d325","blockSize":4194304,"blocks":["87f8829531af6b2019ed31d44f2efcf89e8bf345c158ad6bd790f8e14028d325"]},"offset":"15183487"},"GetOwnPropertyKeys.js":{"size":829,"integrity":{"algorithm":"SHA256","hash":"7ad04a3a175ede6b7d15611717a20c2bc6a09bef382f8b4f7d985e5b2e1e7120","blockSize":4194304,"blocks":["7ad04a3a175ede6b7d15611717a20c2bc6a09bef382f8b4f7d985e5b2e1e7120"]},"offset":"15184150"},"GetPromiseResolve.js":{"size":692,"integrity":{"algorithm":"SHA256","hash":"b34e42fea73d140b4169f6b3a74c9122923e26dc9cac1bb545f0d5e03f5d7412","blockSize":4194304,"blocks":["b34e42fea73d140b4169f6b3a74c9122923e26dc9cac1bb545f0d5e03f5d7412"]},"offset":"15184979"},"GetPrototypeFromConstructor.js":{"size":921,"integrity":{"algorithm":"SHA256","hash":"da1c30c8d5b331e72618af4ccc18b5f3ed89b36e9be117c74a4ee9266141ba56","blockSize":4194304,"blocks":["da1c30c8d5b331e72618af4ccc18b5f3ed89b36e9be117c74a4ee9266141ba56"]},"offset":"15185671"},"GetSubstitution.js":{"size":4463,"integrity":{"algorithm":"SHA256","hash":"f221f4b993dab85205f7e21214df01f260c19d27faf3159c874a4960a7afa416","blockSize":4194304,"blocks":["f221f4b993dab85205f7e21214df01f260c19d27faf3159c874a4960a7afa416"]},"offset":"15186592"},"GetV.js":{"size":474,"integrity":{"algorithm":"SHA256","hash":"66909f7192a6bddc6fb77163f6182164ebef641f0f4c595835485eda6cfd3443","blockSize":4194304,"blocks":["66909f7192a6bddc6fb77163f6182164ebef641f0f4c595835485eda6cfd3443"]},"offset":"15191055"},"HasOwnProperty.js":{"size":553,"integrity":{"algorithm":"SHA256","hash":"b099b2f9829fe64e25740771abc3d3c4e1c801ce0cd2ccecf6041ad08d59364d","blockSize":4194304,"blocks":["b099b2f9829fe64e25740771abc3d3c4e1c801ce0cd2ccecf6041ad08d59364d"]},"offset":"15191529"},"HasProperty.js":{"size":517,"integrity":{"algorithm":"SHA256","hash":"7889a3e2b191509b3d6c0bfcabbad2a915919a2caa275b696a12eab4ebd9cdac","blockSize":4194304,"blocks":["7889a3e2b191509b3d6c0bfcabbad2a915919a2caa275b696a12eab4ebd9cdac"]},"offset":"15192082"},"HourFromTime.js":{"size":382,"integrity":{"algorithm":"SHA256","hash":"338503d8b54967fb22e0659243cab7fc283f023561a8a3316df8b4de588bddf9","blockSize":4194304,"blocks":["338503d8b54967fb22e0659243cab7fc283f023561a8a3316df8b4de588bddf9"]},"offset":"15192599"},"InLeapYear.js":{"size":510,"integrity":{"algorithm":"SHA256","hash":"d9abbf0c4b80df1fd7cb31830f222eb4b6bbe638dcfa3461809905158f2ce0a6","blockSize":4194304,"blocks":["d9abbf0c4b80df1fd7cb31830f222eb4b6bbe638dcfa3461809905158f2ce0a6"]},"offset":"15192981"},"InstanceofOperator.js":{"size":918,"integrity":{"algorithm":"SHA256","hash":"af702715d893f635ff66441f9638a4dc977789c505a50ae17f7e02b05b2549d6","blockSize":4194304,"blocks":["af702715d893f635ff66441f9638a4dc977789c505a50ae17f7e02b05b2549d6"]},"offset":"15193491"},"Invoke.js":{"size":715,"integrity":{"algorithm":"SHA256","hash":"ff016550d8adf9608b2f4ab258017c1582ce717a2e2b3bd2b7a94440f7f19f8f","blockSize":4194304,"blocks":["ff016550d8adf9608b2f4ab258017c1582ce717a2e2b3bd2b7a94440f7f19f8f"]},"offset":"15194409"},"IsAccessorDescriptor.js":{"size":465,"integrity":{"algorithm":"SHA256","hash":"425c74a892b6bb2d1dc6c56e7a6e77e40b9c4d4390480fafe4c804cea53a80ad","blockSize":4194304,"blocks":["425c74a892b6bb2d1dc6c56e7a6e77e40b9c4d4390480fafe4c804cea53a80ad"]},"offset":"15195124"},"IsArray.js":{"size":123,"integrity":{"algorithm":"SHA256","hash":"a8f01a797e05a74501ceb9293408f72bded2a08013c6a075f582737003b443f4","blockSize":4194304,"blocks":["a8f01a797e05a74501ceb9293408f72bded2a08013c6a075f582737003b443f4"]},"offset":"15195589"},"IsBigIntElementType.js":{"size":194,"integrity":{"algorithm":"SHA256","hash":"8fc2140ce6165463b7ba7bb773bf691592364f65c0806edcccd2e97ea3e4f963","blockSize":4194304,"blocks":["8fc2140ce6165463b7ba7bb773bf691592364f65c0806edcccd2e97ea3e4f963"]},"offset":"15195712"},"IsCallable.js":{"size":108,"integrity":{"algorithm":"SHA256","hash":"789ba0a1f176c56862f16b2ff7bc3eeaaa02676f75be073a46c92c5e8af21170","blockSize":4194304,"blocks":["789ba0a1f176c56862f16b2ff7bc3eeaaa02676f75be073a46c92c5e8af21170"]},"offset":"15195906"},"IsCompatiblePropertyDescriptor.js":{"size":367,"integrity":{"algorithm":"SHA256","hash":"f9736fde486f1f27112126908c39423b2b3b946a96d5e2a4d762b3139da17543","blockSize":4194304,"blocks":["f9736fde486f1f27112126908c39423b2b3b946a96d5e2a4d762b3139da17543"]},"offset":"15196014"},"IsConcatSpreadable.js":{"size":626,"integrity":{"algorithm":"SHA256","hash":"7a4c3cae4f5de1b8cbc5694ac320cfaaf30f4ecbe2754e2ffb3f72fb42763a8a","blockSize":4194304,"blocks":["7a4c3cae4f5de1b8cbc5694ac320cfaaf30f4ecbe2754e2ffb3f72fb42763a8a"]},"offset":"15196381"},"IsConstructor.js":{"size":1149,"integrity":{"algorithm":"SHA256","hash":"1a58d54e8aec9ecbfaf3e75d9b38ef06c8a3c948e337cca159a17a102ee41929","blockSize":4194304,"blocks":["1a58d54e8aec9ecbfaf3e75d9b38ef06c8a3c948e337cca159a17a102ee41929"]},"offset":"15197007"},"IsDataDescriptor.js":{"size":464,"integrity":{"algorithm":"SHA256","hash":"35a0862d76e9d765d5fa4154250ed5ac440f4238432a773f22c288da3886e1ce","blockSize":4194304,"blocks":["35a0862d76e9d765d5fa4154250ed5ac440f4238432a773f22c288da3886e1ce"]},"offset":"15198156"},"IsExtensible.js":{"size":509,"integrity":{"algorithm":"SHA256","hash":"e28d0530ae66f0dfb8fa90c492fd6242a44ea7eff298d1ed4c10eac9fdfc8efb","blockSize":4194304,"blocks":["e28d0530ae66f0dfb8fa90c492fd6242a44ea7eff298d1ed4c10eac9fdfc8efb"]},"offset":"15198620"},"IsGenericDescriptor.js":{"size":560,"integrity":{"algorithm":"SHA256","hash":"b9d31ec0ad5beaea6a7d9f1180d67ef8f45b164234deeee14c362c8eb2e135cc","blockSize":4194304,"blocks":["b9d31ec0ad5beaea6a7d9f1180d67ef8f45b164234deeee14c362c8eb2e135cc"]},"offset":"15199129"},"IsIntegralNumber.js":{"size":473,"integrity":{"algorithm":"SHA256","hash":"d9f2f512d7c82b081f1afc5535a9d7c3beb272ec78197631ccbb355f47e52ca3","blockSize":4194304,"blocks":["d9f2f512d7c82b081f1afc5535a9d7c3beb272ec78197631ccbb355f47e52ca3"]},"offset":"15199689"},"IsNoTearConfiguration.js":{"size":467,"integrity":{"algorithm":"SHA256","hash":"0e2f942e0932969b609de49c1769557553fd72d1d4e3b7940627c192427a7138","blockSize":4194304,"blocks":["0e2f942e0932969b609de49c1769557553fd72d1d4e3b7940627c192427a7138"]},"offset":"15200162"},"IsPromise.js":{"size":485,"integrity":{"algorithm":"SHA256","hash":"9f4e5aef10bca5119fab546b4834e48b776d14a775f55524cd3512c4321a1e7c","blockSize":4194304,"blocks":["9f4e5aef10bca5119fab546b4834e48b776d14a775f55524cd3512c4321a1e7c"]},"offset":"15200629"},"IsPropertyKey.js":{"size":207,"integrity":{"algorithm":"SHA256","hash":"577d849187a0e8ef526a6368eb6757f6a128db792cf9ade6dfc6c82a75d155c3","blockSize":4194304,"blocks":["577d849187a0e8ef526a6368eb6757f6a128db792cf9ade6dfc6c82a75d155c3"]},"offset":"15201114"},"IsRegExp.js":{"size":545,"integrity":{"algorithm":"SHA256","hash":"1183cff5c42c2cf9a0b3fbb62d4a7f842b56c1141209c683f0116715bcf03c15","blockSize":4194304,"blocks":["1183cff5c42c2cf9a0b3fbb62d4a7f842b56c1141209c683f0116715bcf03c15"]},"offset":"15201321"},"IsSharedArrayBuffer.js":{"size":461,"integrity":{"algorithm":"SHA256","hash":"9451dbf3ee8a39a73e3e2315f48495288b29521576f0539d18c56fc4b6d85012","blockSize":4194304,"blocks":["9451dbf3ee8a39a73e3e2315f48495288b29521576f0539d18c56fc4b6d85012"]},"offset":"15201866"},"IsStringPrefix.js":{"size":940,"integrity":{"algorithm":"SHA256","hash":"9eb0f4ccb63d074f4ff299f92db9a4b4b821d69d865784956e0a0ddc627aa5fa","blockSize":4194304,"blocks":["9eb0f4ccb63d074f4ff299f92db9a4b4b821d69d865784956e0a0ddc627aa5fa"]},"offset":"15202327"},"IsUnclampedIntegerElementType.js":{"size":298,"integrity":{"algorithm":"SHA256","hash":"8f1f1d7b8ebb15b5b82d66e07078c3001988b807bdc3323e8a17cc246c444c34","blockSize":4194304,"blocks":["8f1f1d7b8ebb15b5b82d66e07078c3001988b807bdc3323e8a17cc246c444c34"]},"offset":"15203267"},"IsUnsignedElementType.js":{"size":266,"integrity":{"algorithm":"SHA256","hash":"ce9973faeaa330b09173245337ff899b86a63b895f5de7106f5f28a8fba9e7f2","blockSize":4194304,"blocks":["ce9973faeaa330b09173245337ff899b86a63b895f5de7106f5f28a8fba9e7f2"]},"offset":"15203565"},"IterableToList.js":{"size":721,"integrity":{"algorithm":"SHA256","hash":"63cff4e4ace6f84a82b2d665b4808a4d10ad44c19b574d431f86296d17247d9f","blockSize":4194304,"blocks":["63cff4e4ace6f84a82b2d665b4808a4d10ad44c19b574d431f86296d17247d9f"]},"offset":"15203831"},"IteratorClose.js":{"size":1481,"integrity":{"algorithm":"SHA256","hash":"52b100a8cc0ecb7b5d5c7346e20d23c7503c832525650b3269f40f6b98948cae","blockSize":4194304,"blocks":["52b100a8cc0ecb7b5d5c7346e20d23c7503c832525650b3269f40f6b98948cae"]},"offset":"15204552"},"IteratorComplete.js":{"size":498,"integrity":{"algorithm":"SHA256","hash":"41ad3ddb0114bfd56e3e67508633496d4ae672eeb47767f12ae0dacdd91d39b5","blockSize":4194304,"blocks":["41ad3ddb0114bfd56e3e67508633496d4ae672eeb47767f12ae0dacdd91d39b5"]},"offset":"15206033"},"IteratorNext.js":{"size":493,"integrity":{"algorithm":"SHA256","hash":"a6ee567a6387448b0140aceffae4ad1ccdd427537d6926716c3f686367098d30","blockSize":4194304,"blocks":["a6ee567a6387448b0140aceffae4ad1ccdd427537d6926716c3f686367098d30"]},"offset":"15206531"},"IteratorStep.js":{"size":353,"integrity":{"algorithm":"SHA256","hash":"22dbe3c1e07083538804e0bc79a4615d97ae6b49978623594f81e9ffd0ad0594","blockSize":4194304,"blocks":["22dbe3c1e07083538804e0bc79a4615d97ae6b49978623594f81e9ffd0ad0594"]},"offset":"15207024"},"IteratorValue.js":{"size":443,"integrity":{"algorithm":"SHA256","hash":"674abbe8978a08b6d6d6ae53a7c3aca04395c6a3e5d97807204fcfaf81fafd68","blockSize":4194304,"blocks":["674abbe8978a08b6d6d6ae53a7c3aca04395c6a3e5d97807204fcfaf81fafd68"]},"offset":"15207377"},"LengthOfArrayLike.js":{"size":495,"integrity":{"algorithm":"SHA256","hash":"57dde851cceec9f755c926949296097a22c26f3fb88b44ee3a143bc6771cd661","blockSize":4194304,"blocks":["57dde851cceec9f755c926949296097a22c26f3fb88b44ee3a143bc6771cd661"]},"offset":"15207820"},"MakeDate.js":{"size":328,"integrity":{"algorithm":"SHA256","hash":"41a9b9da3ede4effd12c43e1c25851b5005623f5eb6dee707252cbe373b32ef0","blockSize":4194304,"blocks":["41a9b9da3ede4effd12c43e1c25851b5005623f5eb6dee707252cbe373b32ef0"]},"offset":"15208315"},"MakeDay.js":{"size":1012,"integrity":{"algorithm":"SHA256","hash":"47e59f248f63087a5bc71792d2a50197852d7adfee336a2dbb7a899a90cfe8c0","blockSize":4194304,"blocks":["47e59f248f63087a5bc71792d2a50197852d7adfee336a2dbb7a899a90cfe8c0"]},"offset":"15208643"},"MakeTime.js":{"size":763,"integrity":{"algorithm":"SHA256","hash":"e2273ea0a905940ae9ce87da482f3d704162b475153dd85a5b990566dcf368ed","blockSize":4194304,"blocks":["e2273ea0a905940ae9ce87da482f3d704162b475153dd85a5b990566dcf368ed"]},"offset":"15209655"},"MinFromTime.js":{"size":396,"integrity":{"algorithm":"SHA256","hash":"88e77ac8a1b1aae30fe064057ed6699c3c3b176ec1ab0533893be6d1c7ba856a","blockSize":4194304,"blocks":["88e77ac8a1b1aae30fe064057ed6699c3c3b176ec1ab0533893be6d1c7ba856a"]},"offset":"15210418"},"MonthFromTime.js":{"size":1014,"integrity":{"algorithm":"SHA256","hash":"f7acafe967a838eb85739ec2afa8dcdc9e5c0734219559259338761a09131909","blockSize":4194304,"blocks":["f7acafe967a838eb85739ec2afa8dcdc9e5c0734219559259338761a09131909"]},"offset":"15210814"},"NumberBitwiseOp.js":{"size":757,"integrity":{"algorithm":"SHA256","hash":"0aa5b6fd1cb50c290090d0fd6d21889908148a70f31f73edf99f937d55b12e59","blockSize":4194304,"blocks":["0aa5b6fd1cb50c290090d0fd6d21889908148a70f31f73edf99f937d55b12e59"]},"offset":"15211828"},"NumberToBigInt.js":{"size":690,"integrity":{"algorithm":"SHA256","hash":"e9731e4dd779ef16185af2e7162ca753787ac75de0a5e40bb46ac430d0305411","blockSize":4194304,"blocks":["e9731e4dd779ef16185af2e7162ca753787ac75de0a5e40bb46ac430d0305411"]},"offset":"15212585"},"ObjectDefineProperties.js":{"size":1508,"integrity":{"algorithm":"SHA256","hash":"672b0bda371a4710bf8e7c99cfc41eca1920c10fad584755be76cd5ac1136fa5","blockSize":4194304,"blocks":["672b0bda371a4710bf8e7c99cfc41eca1920c10fad584755be76cd5ac1136fa5"]},"offset":"15213275"},"OrdinaryCreateFromConstructor.js":{"size":827,"integrity":{"algorithm":"SHA256","hash":"0e9404db2c868e18c5895340e06e66f4fd8505fc466f21dc533c025f57cfcddb","blockSize":4194304,"blocks":["0e9404db2c868e18c5895340e06e66f4fd8505fc466f21dc533c025f57cfcddb"]},"offset":"15214783"},"OrdinaryDefineOwnProperty.js":{"size":2390,"integrity":{"algorithm":"SHA256","hash":"5aa87d94193a2cc6a19e5ef3e44a4b1e12f99ff6a0cd1755faf0f0338b0e07fd","blockSize":4194304,"blocks":["5aa87d94193a2cc6a19e5ef3e44a4b1e12f99ff6a0cd1755faf0f0338b0e07fd"]},"offset":"15215610"},"OrdinaryGetOwnProperty.js":{"size":1257,"integrity":{"algorithm":"SHA256","hash":"d4ef741d1e026235ef46accf3a1538b3510a81e35eff00e0643e0431f3c71ba8","blockSize":4194304,"blocks":["d4ef741d1e026235ef46accf3a1538b3510a81e35eff00e0643e0431f3c71ba8"]},"offset":"15218000"},"OrdinaryGetPrototypeOf.js":{"size":539,"integrity":{"algorithm":"SHA256","hash":"bf546da8b6ac3f982c55919169b2f07320b7934868dfb3b82c13f38c72b95a0d","blockSize":4194304,"blocks":["bf546da8b6ac3f982c55919169b2f07320b7934868dfb3b82c13f38c72b95a0d"]},"offset":"15219257"},"OrdinaryHasInstance.js":{"size":627,"integrity":{"algorithm":"SHA256","hash":"d36943f8261941e336b58a6d698291eef06aa4d7d44ab5fdffb7d073d50a771c","blockSize":4194304,"blocks":["d36943f8261941e336b58a6d698291eef06aa4d7d44ab5fdffb7d073d50a771c"]},"offset":"15219796"},"OrdinaryHasProperty.js":{"size":531,"integrity":{"algorithm":"SHA256","hash":"cbcf61dec7dc22444d36e89a62324453f98ccff4141e8284e5621b1fd0fbd07b","blockSize":4194304,"blocks":["cbcf61dec7dc22444d36e89a62324453f98ccff4141e8284e5621b1fd0fbd07b"]},"offset":"15220423"},"OrdinaryObjectCreate.js":{"size":1445,"integrity":{"algorithm":"SHA256","hash":"fb9e554f0cf613456fe6912e1ebc9aaa5380a044ed7a1461b5521bd7f534f7ca","blockSize":4194304,"blocks":["fb9e554f0cf613456fe6912e1ebc9aaa5380a044ed7a1461b5521bd7f534f7ca"]},"offset":"15220954"},"OrdinarySetPrototypeOf.js":{"size":1050,"integrity":{"algorithm":"SHA256","hash":"9f33c9e0fba4b5605ca95af4f267ed266cfe5a7ec0c5a739353a37d4b5eee5f3","blockSize":4194304,"blocks":["9f33c9e0fba4b5605ca95af4f267ed266cfe5a7ec0c5a739353a37d4b5eee5f3"]},"offset":"15222399"},"OrdinaryToPrimitive.js":{"size":1065,"integrity":{"algorithm":"SHA256","hash":"5f186778e48dd0375388468783d8a0a68bc08a4ff8f190f33bda9d1b4a73e6a8","blockSize":4194304,"blocks":["5f186778e48dd0375388468783d8a0a68bc08a4ff8f190f33bda9d1b4a73e6a8"]},"offset":"15223449"},"PromiseResolve.js":{"size":457,"integrity":{"algorithm":"SHA256","hash":"6914c2768bee4288d16b384871f81aa098119c14fc9fde2977654905ba227d4c","blockSize":4194304,"blocks":["6914c2768bee4288d16b384871f81aa098119c14fc9fde2977654905ba227d4c"]},"offset":"15224514"},"QuoteJSONString.js":{"size":1420,"integrity":{"algorithm":"SHA256","hash":"46725a5289dc63bbbcf8b14cc674f46a466924fead5172121d605d769c655346","blockSize":4194304,"blocks":["46725a5289dc63bbbcf8b14cc674f46a466924fead5172121d605d769c655346"]},"offset":"15224971"},"RegExpCreate.js":{"size":643,"integrity":{"algorithm":"SHA256","hash":"49da22ccbe85efb7620bfeb7877f2ef8678f1882ade81fcdc3f54567add7ab6b","blockSize":4194304,"blocks":["49da22ccbe85efb7620bfeb7877f2ef8678f1882ade81fcdc3f54567add7ab6b"]},"offset":"15226391"},"RegExpExec.js":{"size":887,"integrity":{"algorithm":"SHA256","hash":"32fbe5fc604aa31efc738c2b617a512114367daffa37a031a3257fe5be493bb9","blockSize":4194304,"blocks":["32fbe5fc604aa31efc738c2b617a512114367daffa37a031a3257fe5be493bb9"]},"offset":"15227034"},"RequireObjectCoercible.js":{"size":70,"integrity":{"algorithm":"SHA256","hash":"25d49a24f231f606c6d8be4760f3795c12f61bda0ac95ad8e452205f97c8e612","blockSize":4194304,"blocks":["25d49a24f231f606c6d8be4760f3795c12f61bda0ac95ad8e452205f97c8e612"]},"offset":"15227921"},"SameValue.js":{"size":307,"integrity":{"algorithm":"SHA256","hash":"e6d99ed6b4a479bed51f697cbc4693a2ff8da0d1e07b5ebf11e74b5404af2ab1","blockSize":4194304,"blocks":["e6d99ed6b4a479bed51f697cbc4693a2ff8da0d1e07b5ebf11e74b5404af2ab1"]},"offset":"15227991"},"SameValueNonNumeric.js":{"size":635,"integrity":{"algorithm":"SHA256","hash":"1f99017f243b767fbbf3cb7486093bbac2c505c0302da6046f225cda3b5df57d","blockSize":4194304,"blocks":["1f99017f243b767fbbf3cb7486093bbac2c505c0302da6046f225cda3b5df57d"]},"offset":"15228298"},"SameValueZero.js":{"size":223,"integrity":{"algorithm":"SHA256","hash":"269684a69605b1f7ad04dfccc1519d7905271fd6ae05601a832a2ab8fb7272fc","blockSize":4194304,"blocks":["269684a69605b1f7ad04dfccc1519d7905271fd6ae05601a832a2ab8fb7272fc"]},"offset":"15228933"},"SecFromTime.js":{"size":402,"integrity":{"algorithm":"SHA256","hash":"6263c6176eafa22eadeb7bc054169fd764a3e3aab0cf637110d86110367c8a36","blockSize":4194304,"blocks":["6263c6176eafa22eadeb7bc054169fd764a3e3aab0cf637110d86110367c8a36"]},"offset":"15229156"},"Set.js":{"size":1255,"integrity":{"algorithm":"SHA256","hash":"88389d458aaae848468091535f5e8be59993020e744e998ca3058b59c1943ce8","blockSize":4194304,"blocks":["88389d458aaae848468091535f5e8be59993020e744e998ca3058b59c1943ce8"]},"offset":"15229558"},"SetFunctionLength.js":{"size":1107,"integrity":{"algorithm":"SHA256","hash":"717f73302d1954ace7b01a94b36998aa1a33f1cf0b94ba99cc9a79bbb08aa80d","blockSize":4194304,"blocks":["717f73302d1954ace7b01a94b36998aa1a33f1cf0b94ba99cc9a79bbb08aa80d"]},"offset":"15230813"},"SetFunctionName.js":{"size":1381,"integrity":{"algorithm":"SHA256","hash":"dabffc283c552e871c8bfd4a4d419e9453056b2b51a23f80f2ff6050c30b09c9","blockSize":4194304,"blocks":["dabffc283c552e871c8bfd4a4d419e9453056b2b51a23f80f2ff6050c30b09c9"]},"offset":"15231920"},"SetIntegrityLevel.js":{"size":1862,"integrity":{"algorithm":"SHA256","hash":"3c04bdc423a594ffec10244025e37e466b5878c4255a53655d445f51584b7d5e","blockSize":4194304,"blocks":["3c04bdc423a594ffec10244025e37e466b5878c4255a53655d445f51584b7d5e"]},"offset":"15233301"},"SpeciesConstructor.js":{"size":844,"integrity":{"algorithm":"SHA256","hash":"826eccbe073d3e7b806cd67e4d4ae09ede6d5ae6125480705b7bf81c2486f175","blockSize":4194304,"blocks":["826eccbe073d3e7b806cd67e4d4ae09ede6d5ae6125480705b7bf81c2486f175"]},"offset":"15235163"},"SplitMatch.js":{"size":895,"integrity":{"algorithm":"SHA256","hash":"ed6f0c1f9cf607165dbfe4e043b58cf390ad7560cff43a74b9b3582dd41837f0","blockSize":4194304,"blocks":["ed6f0c1f9cf607165dbfe4e043b58cf390ad7560cff43a74b9b3582dd41837f0"]},"offset":"15236007"},"StrictEqualityComparison.js":{"size":361,"integrity":{"algorithm":"SHA256","hash":"33928172f049f2f5fd7559470bb12647b7c6012b1da230e5a7e5fd8ffc1dd30e","blockSize":4194304,"blocks":["33928172f049f2f5fd7559470bb12647b7c6012b1da230e5a7e5fd8ffc1dd30e"]},"offset":"15236902"},"StringCreate.js":{"size":1117,"integrity":{"algorithm":"SHA256","hash":"18a70a9279026ea03b811f95a797cde8caf8d77a010880506e0f0b4532a1181d","blockSize":4194304,"blocks":["18a70a9279026ea03b811f95a797cde8caf8d77a010880506e0f0b4532a1181d"]},"offset":"15237263"},"StringGetOwnProperty.js":{"size":1409,"integrity":{"algorithm":"SHA256","hash":"0eeb790e57a8488ab961d30501027d14a11daa11fdc03ddb6557766d606ef7aa","blockSize":4194304,"blocks":["0eeb790e57a8488ab961d30501027d14a11daa11fdc03ddb6557766d606ef7aa"]},"offset":"15238380"},"StringIndexOf.js":{"size":1121,"integrity":{"algorithm":"SHA256","hash":"6274088dae351dfc333956bd1f7ed66f05ddc7ec82b92cd69143bff6bc59cb2e","blockSize":4194304,"blocks":["6274088dae351dfc333956bd1f7ed66f05ddc7ec82b92cd69143bff6bc59cb2e"]},"offset":"15239789"},"StringPad.js":{"size":1263,"integrity":{"algorithm":"SHA256","hash":"dde7bd7c65aff1f92ba34d30a7b4ff101ebaffe29bba166a55db8468666d5167","blockSize":4194304,"blocks":["dde7bd7c65aff1f92ba34d30a7b4ff101ebaffe29bba166a55db8468666d5167"]},"offset":"15240910"},"StringToBigInt.js":{"size":581,"integrity":{"algorithm":"SHA256","hash":"b70e6ec493c91687edeb4059a4da64268405fba163ed262a46bfbfb4796c096c","blockSize":4194304,"blocks":["b70e6ec493c91687edeb4059a4da64268405fba163ed262a46bfbfb4796c096c"]},"offset":"15242173"},"StringToCodePoints.js":{"size":760,"integrity":{"algorithm":"SHA256","hash":"648f0c0b200da0dbd35a9631a2dc1f8143c709d3c917f77df933d0f7103aa79e","blockSize":4194304,"blocks":["648f0c0b200da0dbd35a9631a2dc1f8143c709d3c917f77df933d0f7103aa79e"]},"offset":"15242754"},"SymbolDescriptiveString.js":{"size":526,"integrity":{"algorithm":"SHA256","hash":"d5a4e603be41ed5dff7123a6a0ba29efae0812f4d076a78387520b36b416a37d","blockSize":4194304,"blocks":["d5a4e603be41ed5dff7123a6a0ba29efae0812f4d076a78387520b36b416a37d"]},"offset":"15243514"},"TestIntegrityLevel.js":{"size":1285,"integrity":{"algorithm":"SHA256","hash":"8a0161ac60421c4762bc9e442224da95614cdb3e9865bcd79ad29d2310dd35c6","blockSize":4194304,"blocks":["8a0161ac60421c4762bc9e442224da95614cdb3e9865bcd79ad29d2310dd35c6"]},"offset":"15244040"},"TimeClip.js":{"size":468,"integrity":{"algorithm":"SHA256","hash":"bf1f153b35126ac0ebd122717e6349c97e932e3665ff1947f5f4a7da4895cb48","blockSize":4194304,"blocks":["bf1f153b35126ac0ebd122717e6349c97e932e3665ff1947f5f4a7da4895cb48"]},"offset":"15245325"},"TimeFromYear.js":{"size":261,"integrity":{"algorithm":"SHA256","hash":"07bd801ef44bcc4c5458937d6b3c09b1ba6f30d24fbb06ca9b4818c0699c330b","blockSize":4194304,"blocks":["07bd801ef44bcc4c5458937d6b3c09b1ba6f30d24fbb06ca9b4818c0699c330b"]},"offset":"15245793"},"TimeString.js":{"size":808,"integrity":{"algorithm":"SHA256","hash":"92304742e99d2785a471fbb7d92daed5d1e379fdcbbc34f7fe2e8f7f624288ea","blockSize":4194304,"blocks":["92304742e99d2785a471fbb7d92daed5d1e379fdcbbc34f7fe2e8f7f624288ea"]},"offset":"15246054"},"TimeWithinDay.js":{"size":247,"integrity":{"algorithm":"SHA256","hash":"c83b563c9849ca65fb1ed7235f72f42a019fde9e67aad81d1bd0699ed28f43f8","blockSize":4194304,"blocks":["c83b563c9849ca65fb1ed7235f72f42a019fde9e67aad81d1bd0699ed28f43f8"]},"offset":"15246862"},"ToBigInt.js":{"size":631,"integrity":{"algorithm":"SHA256","hash":"a74c2afb6aa83b8f29cb2996ad29c36834e8d5f11a3d65e74c75942ed115fa45","blockSize":4194304,"blocks":["a74c2afb6aa83b8f29cb2996ad29c36834e8d5f11a3d65e74c75942ed115fa45"]},"offset":"15247109"},"ToBigInt64.js":{"size":948,"integrity":{"algorithm":"SHA256","hash":"e8a2eb194795575175e044dd78406ba726f88609a70f69dc9cfbbdd66e3c4207","blockSize":4194304,"blocks":["e8a2eb194795575175e044dd78406ba726f88609a70f69dc9cfbbdd66e3c4207"]},"offset":"15247740"},"ToBigUint64.js":{"size":703,"integrity":{"algorithm":"SHA256","hash":"33065755daa1ea7d6906e3366e65042712b6457a576ff4d8259607fa6456b081","blockSize":4194304,"blocks":["33065755daa1ea7d6906e3366e65042712b6457a576ff4d8259607fa6456b081"]},"offset":"15248688"},"ToBoolean.js":{"size":130,"integrity":{"algorithm":"SHA256","hash":"36a4823341bd4ec68dd6f4b32afbbc939330a48bf7042108c9be89eaaab5bbc6","blockSize":4194304,"blocks":["36a4823341bd4ec68dd6f4b32afbbc939330a48bf7042108c9be89eaaab5bbc6"]},"offset":"15249391"},"ToDateString.js":{"size":498,"integrity":{"algorithm":"SHA256","hash":"57a5e2f02146ccfa64217595a7b5024fd7a74d9847a5d7df98f6cdaa04335612","blockSize":4194304,"blocks":["57a5e2f02146ccfa64217595a7b5024fd7a74d9847a5d7df98f6cdaa04335612"]},"offset":"15249521"},"ToIndex.js":{"size":695,"integrity":{"algorithm":"SHA256","hash":"ed1d9b6dda1fadc03b79d7735a8bc62160d2b55fddba4fb149b04f08476d725f","blockSize":4194304,"blocks":["ed1d9b6dda1fadc03b79d7735a8bc62160d2b55fddba4fb149b04f08476d725f"]},"offset":"15250019"},"ToInt16.js":{"size":260,"integrity":{"algorithm":"SHA256","hash":"ad0dcb3339d64526564c10379cc026a2f595f9ed7642199104eb0c0ffebccc35","blockSize":4194304,"blocks":["ad0dcb3339d64526564c10379cc026a2f595f9ed7642199104eb0c0ffebccc35"]},"offset":"15250714"},"ToInt32.js":{"size":173,"integrity":{"algorithm":"SHA256","hash":"e0c77696079335a016ce39e9992f11939ad25c1b322d119eedbec24a989a50a6","blockSize":4194304,"blocks":["e0c77696079335a016ce39e9992f11939ad25c1b322d119eedbec24a989a50a6"]},"offset":"15250974"},"ToInt8.js":{"size":247,"integrity":{"algorithm":"SHA256","hash":"0f844398064a22ca49a1c263a564e15449de26b5114281211d3de3535d914336","blockSize":4194304,"blocks":["0f844398064a22ca49a1c263a564e15449de26b5114281211d3de3535d914336"]},"offset":"15251147"},"ToIntegerOrInfinity.js":{"size":542,"integrity":{"algorithm":"SHA256","hash":"cb08af4b28217f4cba255792955a6835f6500212036aee56981ec48a7a221257","blockSize":4194304,"blocks":["cb08af4b28217f4cba255792955a6835f6500212036aee56981ec48a7a221257"]},"offset":"15251394"},"ToLength.js":{"size":362,"integrity":{"algorithm":"SHA256","hash":"271aa4ed80a195f0fd8ae9e46f6f307b59b9be8d29f33fe65635ec85e2e1b6cd","blockSize":4194304,"blocks":["271aa4ed80a195f0fd8ae9e46f6f307b59b9be8d29f33fe65635ec85e2e1b6cd"]},"offset":"15251936"},"ToNumber.js":{"size":2136,"integrity":{"algorithm":"SHA256","hash":"a43038af4702ea51f083a1c6ab153acf77f4c175fe60d5522737d086e6c52302","blockSize":4194304,"blocks":["a43038af4702ea51f083a1c6ab153acf77f4c175fe60d5522737d086e6c52302"]},"offset":"15252298"},"ToNumeric.js":{"size":550,"integrity":{"algorithm":"SHA256","hash":"27ca877b991e5b6ffbd658cb86b67b5d5eaa90f730455d685e09649c03f7997d","blockSize":4194304,"blocks":["27ca877b991e5b6ffbd658cb86b67b5d5eaa90f730455d685e09649c03f7997d"]},"offset":"15254434"},"ToObject.js":{"size":334,"integrity":{"algorithm":"SHA256","hash":"2c382673870deb89e3b19511d8f08fa9554d103fa9d143e5a57b79d85a093725","blockSize":4194304,"blocks":["2c382673870deb89e3b19511d8f08fa9554d103fa9d143e5a57b79d85a093725"]},"offset":"15254984"},"ToPrimitive.js":{"size":287,"integrity":{"algorithm":"SHA256","hash":"fe27d95fe99afd38d780e7d88f349e1dc1a68841b845e118abb8c80c4ab9aa53","blockSize":4194304,"blocks":["fe27d95fe99afd38d780e7d88f349e1dc1a68841b845e118abb8c80c4ab9aa53"]},"offset":"15255318"},"ToPropertyDescriptor.js":{"size":1452,"integrity":{"algorithm":"SHA256","hash":"78b5dfba0830bc47aa55c1b33f2be8fd973ff5ccc87a599abadda676d3596c49","blockSize":4194304,"blocks":["78b5dfba0830bc47aa55c1b33f2be8fd973ff5ccc87a599abadda676d3596c49"]},"offset":"15255605"},"ToPropertyKey.js":{"size":405,"integrity":{"algorithm":"SHA256","hash":"58d4355f4509a456b237e1d72169200edb1810d1efa9ee167ac26faa7904edd3","blockSize":4194304,"blocks":["58d4355f4509a456b237e1d72169200edb1810d1efa9ee167ac26faa7904edd3"]},"offset":"15257057"},"ToString.js":{"size":396,"integrity":{"algorithm":"SHA256","hash":"79c26e024582b6ac70a965063b757c70ceea15fa8da17a78ebbf77b40ccaece3","blockSize":4194304,"blocks":["79c26e024582b6ac70a965063b757c70ceea15fa8da17a78ebbf77b40ccaece3"]},"offset":"15257462"},"ToUint16.js":{"size":564,"integrity":{"algorithm":"SHA256","hash":"5775f0384586a383c5dd6c359e37d4b218c8ddf069d7a2906f7e4752ab66a20d","blockSize":4194304,"blocks":["5775f0384586a383c5dd6c359e37d4b218c8ddf069d7a2906f7e4752ab66a20d"]},"offset":"15257858"},"ToUint32.js":{"size":175,"integrity":{"algorithm":"SHA256","hash":"b68209f8fb9d1e978fe3d162251bba47f056c43ec7028cbd99b485800bd62315","blockSize":4194304,"blocks":["b68209f8fb9d1e978fe3d162251bba47f056c43ec7028cbd99b485800bd62315"]},"offset":"15258422"},"ToUint8.js":{"size":578,"integrity":{"algorithm":"SHA256","hash":"94fa392bda40d5d6c1125b662b304a372b135660d3740eebae7ade568bdd52a9","blockSize":4194304,"blocks":["94fa392bda40d5d6c1125b662b304a372b135660d3740eebae7ade568bdd52a9"]},"offset":"15258597"},"ToUint8Clamp.js":{"size":522,"integrity":{"algorithm":"SHA256","hash":"30dd3065a73ef4ff1f0a018ce80bd550673e5ee29c732e6fc8cade4661f80d56","blockSize":4194304,"blocks":["30dd3065a73ef4ff1f0a018ce80bd550673e5ee29c732e6fc8cade4661f80d56"]},"offset":"15259175"},"TrimString.js":{"size":804,"integrity":{"algorithm":"SHA256","hash":"497ddda1a6981ecb64a4c5ea120100f61569ad519055b30741ad77d0aae3d458","blockSize":4194304,"blocks":["497ddda1a6981ecb64a4c5ea120100f61569ad519055b30741ad77d0aae3d458"]},"offset":"15259697"},"Type.js":{"size":297,"integrity":{"algorithm":"SHA256","hash":"bc73cb870d9593233f65bd1384e359bef23c86fc178ad9b655b03bfc93a9ccf4","blockSize":4194304,"blocks":["bc73cb870d9593233f65bd1384e359bef23c86fc178ad9b655b03bfc93a9ccf4"]},"offset":"15260501"},"UTF16EncodeCodePoint.js":{"size":713,"integrity":{"algorithm":"SHA256","hash":"19c0fec3bb1f8c3167112bdcfcc3257c20a3b17b67e86a33a78260c6c81090e0","blockSize":4194304,"blocks":["19c0fec3bb1f8c3167112bdcfcc3257c20a3b17b67e86a33a78260c6c81090e0"]},"offset":"15260798"},"UTF16SurrogatePairToCodePoint.js":{"size":770,"integrity":{"algorithm":"SHA256","hash":"fa80c034e02e99557889d455e56163779ac08c814988a118c632dccce95dd90c","blockSize":4194304,"blocks":["fa80c034e02e99557889d455e56163779ac08c814988a118c632dccce95dd90c"]},"offset":"15261511"},"UnicodeEscape.js":{"size":839,"integrity":{"algorithm":"SHA256","hash":"8080d2e44eba21ab06abd3b7d03dd18fe93033737ace10a1d963222335960413","blockSize":4194304,"blocks":["8080d2e44eba21ab06abd3b7d03dd18fe93033737ace10a1d963222335960413"]},"offset":"15262281"},"ValidateAndApplyPropertyDescriptor.js":{"size":5243,"integrity":{"algorithm":"SHA256","hash":"588f81f21e07a8d2255bc0aed34c94052aa74d5b558edc4435d0acee12c90554","blockSize":4194304,"blocks":["588f81f21e07a8d2255bc0aed34c94052aa74d5b558edc4435d0acee12c90554"]},"offset":"15263120"},"WeakRefDeref.js":{"size":625,"integrity":{"algorithm":"SHA256","hash":"ca4ef9ab50a2119c7981348bc2229beb22553d340c0e04d23c6b15260d5991d7","blockSize":4194304,"blocks":["ca4ef9ab50a2119c7981348bc2229beb22553d340c0e04d23c6b15260d5991d7"]},"offset":"15268363"},"WeekDay.js":{"size":208,"integrity":{"algorithm":"SHA256","hash":"f7cc798c72dcc484295681d29d535e64215a9ec303f4f6e6456ea63e83ce0246","blockSize":4194304,"blocks":["f7cc798c72dcc484295681d29d535e64215a9ec303f4f6e6456ea63e83ce0246"]},"offset":"15268988"},"YearFromTime.js":{"size":407,"integrity":{"algorithm":"SHA256","hash":"5562b7fd6be438187a1187a331f0d310e631e9747df14521accc7a797e2a2aa7","blockSize":4194304,"blocks":["5562b7fd6be438187a1187a331f0d310e631e9747df14521accc7a797e2a2aa7"]},"offset":"15269196"},"abs.js":{"size":207,"integrity":{"algorithm":"SHA256","hash":"a50e248c29238747c3c278a4edf2c0643f1295d1c065d9dff8524def17f0427f","blockSize":4194304,"blocks":["a50e248c29238747c3c278a4edf2c0643f1295d1c065d9dff8524def17f0427f"]},"offset":"15269603"},"clamp.js":{"size":576,"integrity":{"algorithm":"SHA256","hash":"70e43374dfd7bd06023f7e19c1c9847c0a0d6a2c609896aabcabf860785ff738","blockSize":4194304,"blocks":["70e43374dfd7bd06023f7e19c1c9847c0a0d6a2c609896aabcabf860785ff738"]},"offset":"15269810"},"floor.js":{"size":217,"integrity":{"algorithm":"SHA256","hash":"90c20830ae8762224c83fb0ed36a288a7d567f57d3b5acb469590cc2d5e13f55","blockSize":4194304,"blocks":["90c20830ae8762224c83fb0ed36a288a7d567f57d3b5acb469590cc2d5e13f55"]},"offset":"15270386"},"modulo.js":{"size":168,"integrity":{"algorithm":"SHA256","hash":"84923b64427edcc840ee9a305dca213f4bf1e04ed8f88f6bfd7bfa9e655d7c98","blockSize":4194304,"blocks":["84923b64427edcc840ee9a305dca213f4bf1e04ed8f88f6bfd7bfa9e655d7c98"]},"offset":"15270603"},"msFromTime.js":{"size":253,"integrity":{"algorithm":"SHA256","hash":"ef13a7e7721d695f125a7e772f8037ed34aa3c97aaa3692da900c6796cd270da","blockSize":4194304,"blocks":["ef13a7e7721d695f125a7e772f8037ed34aa3c97aaa3692da900c6796cd270da"]},"offset":"15270771"},"substring.js":{"size":740,"integrity":{"algorithm":"SHA256","hash":"283a578321715346627c61d75abf7cccb87898aeee94c714e70eaad8c6db76bb","blockSize":4194304,"blocks":["283a578321715346627c61d75abf7cccb87898aeee94c714e70eaad8c6db76bb"]},"offset":"15271024"},"thisBigIntValue.js":{"size":551,"integrity":{"algorithm":"SHA256","hash":"5fec6c678aa3d69d9861a2ccd5e7a5e093db79a1a208cd68bd0534b7dcec60f9","blockSize":4194304,"blocks":["5fec6c678aa3d69d9861a2ccd5e7a5e093db79a1a208cd68bd0534b7dcec60f9"]},"offset":"15271764"},"thisBooleanValue.js":{"size":367,"integrity":{"algorithm":"SHA256","hash":"171bd884e07701d9e37bece81b05a95fd7d822ff7eaaba5c112d6e3a352ad498","blockSize":4194304,"blocks":["171bd884e07701d9e37bece81b05a95fd7d822ff7eaaba5c112d6e3a352ad498"]},"offset":"15272315"},"thisNumberValue.js":{"size":390,"integrity":{"algorithm":"SHA256","hash":"a3bb9eb733e74de8a50f49e4425e57fd01bebbf66df4f9967da3d9edee589455","blockSize":4194304,"blocks":["a3bb9eb733e74de8a50f49e4425e57fd01bebbf66df4f9967da3d9edee589455"]},"offset":"15272682"},"thisStringValue.js":{"size":361,"integrity":{"algorithm":"SHA256","hash":"47305af763f963ab1c547011b6be408827678d61540009de579bf996d0810ff5","blockSize":4194304,"blocks":["47305af763f963ab1c547011b6be408827678d61540009de579bf996d0810ff5"]},"offset":"15273072"},"thisSymbolValue.js":{"size":514,"integrity":{"algorithm":"SHA256","hash":"27b446ef7c0dcc60f576357f187bb9af1a86d6557ab82a144d2390e793dc94db","blockSize":4194304,"blocks":["27b446ef7c0dcc60f576357f187bb9af1a86d6557ab82a144d2390e793dc94db"]},"offset":"15273433"},"thisTimeValue.js":{"size":66,"integrity":{"algorithm":"SHA256","hash":"e4edc25cb1edf0faea5b4a9c844ce72636b702a033b075ee0f7ffbedc14e442a","blockSize":4194304,"blocks":["e4edc25cb1edf0faea5b4a9c844ce72636b702a033b075ee0f7ffbedc14e442a"]},"offset":"15273947"},"Number":{"files":{"add.js":{"size":875,"integrity":{"algorithm":"SHA256","hash":"47a1b1cf321ae7b7a1b930de9144e65d81c40c31a0058a3aa7a23b59ff90537f","blockSize":4194304,"blocks":["47a1b1cf321ae7b7a1b930de9144e65d81c40c31a0058a3aa7a23b59ff90537f"]},"offset":"15274013"},"bitwiseAND.js":{"size":503,"integrity":{"algorithm":"SHA256","hash":"bb6bbbd3e4a97dd371148c9871393bd846ba4e42086e1115e5b87bc3ae75797f","blockSize":4194304,"blocks":["bb6bbbd3e4a97dd371148c9871393bd846ba4e42086e1115e5b87bc3ae75797f"]},"offset":"15274888"},"bitwiseNOT.js":{"size":578,"integrity":{"algorithm":"SHA256","hash":"40ac9295ed27001ba228b4b9eac45bbced235f121989a7f320128dcf32199c2e","blockSize":4194304,"blocks":["40ac9295ed27001ba228b4b9eac45bbced235f121989a7f320128dcf32199c2e"]},"offset":"15275391"},"bitwiseOR.js":{"size":501,"integrity":{"algorithm":"SHA256","hash":"8cb3f9e18fd1e61a9c2839e5a80471ee1c26e0e08283d5c42245cfb6b5e12007","blockSize":4194304,"blocks":["8cb3f9e18fd1e61a9c2839e5a80471ee1c26e0e08283d5c42245cfb6b5e12007"]},"offset":"15275969"},"bitwiseXOR.js":{"size":503,"integrity":{"algorithm":"SHA256","hash":"39fc03cc383e0c4b5d7cb7046da98cc9da9e7452a112fde02cccca096ad7573c","blockSize":4194304,"blocks":["39fc03cc383e0c4b5d7cb7046da98cc9da9e7452a112fde02cccca096ad7573c"]},"offset":"15276470"},"divide.js":{"size":638,"integrity":{"algorithm":"SHA256","hash":"275664feaad88de432888432d00e07d412173d40eca1ebc0dc11c2a9ab08ee9c","blockSize":4194304,"blocks":["275664feaad88de432888432d00e07d412173d40eca1ebc0dc11c2a9ab08ee9c"]},"offset":"15276973"},"equal.js":{"size":556,"integrity":{"algorithm":"SHA256","hash":"26bf0a7b691fc9541b9d5c2e59ffb9e47480029ae5872b4463da733bd79ffc86","blockSize":4194304,"blocks":["26bf0a7b691fc9541b9d5c2e59ffb9e47480029ae5872b4463da733bd79ffc86"]},"offset":"15277611"},"exponentiate.js":{"size":1780,"integrity":{"algorithm":"SHA256","hash":"ade7c349d8d69d43e975ac9fa47326e6b40125e480eedbef20e6151e76d3d37b","blockSize":4194304,"blocks":["ade7c349d8d69d43e975ac9fa47326e6b40125e480eedbef20e6151e76d3d37b"]},"offset":"15278167"},"index.js":{"size":1274,"integrity":{"algorithm":"SHA256","hash":"00f330b5363f68d5bdb0f15ad7adef0002730eaa4ac2de69af6b34f624585f21","blockSize":4194304,"blocks":["00f330b5363f68d5bdb0f15ad7adef0002730eaa4ac2de69af6b34f624585f21"]},"offset":"15279947"},"leftShift.js":{"size":639,"integrity":{"algorithm":"SHA256","hash":"7bbfff6cf1c14f12dd8ae2f69096bad246460187cecfc967a452eda538618909","blockSize":4194304,"blocks":["7bbfff6cf1c14f12dd8ae2f69096bad246460187cecfc967a452eda538618909"]},"offset":"15281221"},"lessThan.js":{"size":642,"integrity":{"algorithm":"SHA256","hash":"a076216bc2e2bbfb83a35db95fea5fa34a759ad27dc8691996e7109e991bfa7d","blockSize":4194304,"blocks":["a076216bc2e2bbfb83a35db95fea5fa34a759ad27dc8691996e7109e991bfa7d"]},"offset":"15281860"},"multiply.js":{"size":848,"integrity":{"algorithm":"SHA256","hash":"9c70611502810d74b71a7087cda1badbd7e62bed63b93eff8e529eaecc48ad05","blockSize":4194304,"blocks":["9c70611502810d74b71a7087cda1badbd7e62bed63b93eff8e529eaecc48ad05"]},"offset":"15282502"},"remainder.js":{"size":1027,"integrity":{"algorithm":"SHA256","hash":"1a75e0c19112e3f260302af3fdca201767a89dbf170c459f32134a750d698eab","blockSize":4194304,"blocks":["1a75e0c19112e3f260302af3fdca201767a89dbf170c459f32134a750d698eab"]},"offset":"15283350"},"sameValue.js":{"size":632,"integrity":{"algorithm":"SHA256","hash":"397208a584900e79ba3bb5b90317119e9116ccf6e84ba64f02c88d15d7813fa0","blockSize":4194304,"blocks":["397208a584900e79ba3bb5b90317119e9116ccf6e84ba64f02c88d15d7813fa0"]},"offset":"15284377"},"sameValueZero.js":{"size":575,"integrity":{"algorithm":"SHA256","hash":"6a3d4872356b651b03d296d09d3692b9116100da0b330302b0f812a47dcd54dc","blockSize":4194304,"blocks":["6a3d4872356b651b03d296d09d3692b9116100da0b330302b0f812a47dcd54dc"]},"offset":"15285009"},"signedRightShift.js":{"size":653,"integrity":{"algorithm":"SHA256","hash":"d2c07c5c7d3f57116b19569c6ea28a0090153438c168d56eac8ac33a01e41724","blockSize":4194304,"blocks":["d2c07c5c7d3f57116b19569c6ea28a0090153438c168d56eac8ac33a01e41724"]},"offset":"15285584"},"subtract.js":{"size":536,"integrity":{"algorithm":"SHA256","hash":"536024e9adacad8774c865c8de2449275c99ef6f0db44c372a8a645b9117c2dd","blockSize":4194304,"blocks":["536024e9adacad8774c865c8de2449275c99ef6f0db44c372a8a645b9117c2dd"]},"offset":"15286237"},"toString.js":{"size":427,"integrity":{"algorithm":"SHA256","hash":"0c8d3e2501cabc643dd5d94ac992812e94353be181a66078808a396f8b6b7921","blockSize":4194304,"blocks":["0c8d3e2501cabc643dd5d94ac992812e94353be181a66078808a396f8b6b7921"]},"offset":"15286773"},"unaryMinus.js":{"size":470,"integrity":{"algorithm":"SHA256","hash":"59e344d056276d927fd9e54d42ab5e18e757585c247b11af8dc1d7e426a399c2","blockSize":4194304,"blocks":["59e344d056276d927fd9e54d42ab5e18e757585c247b11af8dc1d7e426a399c2"]},"offset":"15287200"},"unsignedRightShift.js":{"size":658,"integrity":{"algorithm":"SHA256","hash":"7c19f44f65c837d23df00ec54d05ee2b5f874f4cd37daa4d647fa426f9e94ea0","blockSize":4194304,"blocks":["7c19f44f65c837d23df00ec54d05ee2b5f874f4cd37daa4d647fa426f9e94ea0"]},"offset":"15287670"}}},"BigInt":{"files":{"add.js":{"size":459,"integrity":{"algorithm":"SHA256","hash":"d55ebd3a472b86f1db4d5eb8cc684e367820371e6cddb207688f8122b3f237f5","blockSize":4194304,"blocks":["d55ebd3a472b86f1db4d5eb8cc684e367820371e6cddb207688f8122b3f237f5"]},"offset":"15288328"},"bitwiseAND.js":{"size":503,"integrity":{"algorithm":"SHA256","hash":"86f26a63dcd4663d5fd7b820775b47a509665e157b5799074cbf38d12fee91b4","blockSize":4194304,"blocks":["86f26a63dcd4663d5fd7b820775b47a509665e157b5799074cbf38d12fee91b4"]},"offset":"15288787"},"bitwiseNOT.js":{"size":450,"integrity":{"algorithm":"SHA256","hash":"23dc36c4b12eeef514fffff7a2b1e8ca67266c196b822f7fe4ae7dd5b1a7e294","blockSize":4194304,"blocks":["23dc36c4b12eeef514fffff7a2b1e8ca67266c196b822f7fe4ae7dd5b1a7e294"]},"offset":"15289290"},"bitwiseOR.js":{"size":501,"integrity":{"algorithm":"SHA256","hash":"95138fb96a65244d6271b4e0faf02020d6c8660c80e7b5c6ade8399cc7798f68","blockSize":4194304,"blocks":["95138fb96a65244d6271b4e0faf02020d6c8660c80e7b5c6ade8399cc7798f68"]},"offset":"15289740"},"bitwiseXOR.js":{"size":503,"integrity":{"algorithm":"SHA256","hash":"9fdd0d05db13029c45453cc521279d497352f74cfb3f50c93a3f8c32b6af774c","blockSize":4194304,"blocks":["9fdd0d05db13029c45453cc521279d497352f74cfb3f50c93a3f8c32b6af774c"]},"offset":"15290241"},"divide.js":{"size":631,"integrity":{"algorithm":"SHA256","hash":"9fb2dc83404b068c916c9f8fbb503d96a3db1bf47081e15543ee2ef16077edc3","blockSize":4194304,"blocks":["9fb2dc83404b068c916c9f8fbb503d96a3db1bf47081e15543ee2ef16077edc3"]},"offset":"15290744"},"equal.js":{"size":464,"integrity":{"algorithm":"SHA256","hash":"63c672cb74f047e1ceeed875f3854bfc4b830615244b66dd3008eec0c8894bdf","blockSize":4194304,"blocks":["63c672cb74f047e1ceeed875f3854bfc4b830615244b66dd3008eec0c8894bdf"]},"offset":"15291375"},"exponentiate.js":{"size":887,"integrity":{"algorithm":"SHA256","hash":"cda6fd636de63bbd6f1341aa870543d3984655dcb499ca601258740019ee6180","blockSize":4194304,"blocks":["cda6fd636de63bbd6f1341aa870543d3984655dcb499ca601258740019ee6180"]},"offset":"15291839"},"index.js":{"size":1274,"integrity":{"algorithm":"SHA256","hash":"00f330b5363f68d5bdb0f15ad7adef0002730eaa4ac2de69af6b34f624585f21","blockSize":4194304,"blocks":["00f330b5363f68d5bdb0f15ad7adef0002730eaa4ac2de69af6b34f624585f21"]},"offset":"15292726"},"leftShift.js":{"size":472,"integrity":{"algorithm":"SHA256","hash":"7960fc0f19a25dc570d50eeb3987c52bfab0c427fe4ce7caf878d1948c6545a5","blockSize":4194304,"blocks":["7960fc0f19a25dc570d50eeb3987c52bfab0c427fe4ce7caf878d1948c6545a5"]},"offset":"15294000"},"lessThan.js":{"size":469,"integrity":{"algorithm":"SHA256","hash":"2a409f36dfec778087b65dbb7e3bde4af1242faf445c1188e293bf5e81625ac7","blockSize":4194304,"blocks":["2a409f36dfec778087b65dbb7e3bde4af1242faf445c1188e293bf5e81625ac7"]},"offset":"15294472"},"multiply.js":{"size":469,"integrity":{"algorithm":"SHA256","hash":"2c98615507b3d321486186eb7e31ff256c56cf1defd591ebd687f88617f8b1f8","blockSize":4194304,"blocks":["2c98615507b3d321486186eb7e31ff256c56cf1defd591ebd687f88617f8b1f8"]},"offset":"15294941"},"remainder.js":{"size":706,"integrity":{"algorithm":"SHA256","hash":"5376f57802b67b74f2f0c2649e30c8f12a4ffb2930ff1fda6d8e977d1ecf4339","blockSize":4194304,"blocks":["5376f57802b67b74f2f0c2649e30c8f12a4ffb2930ff1fda6d8e977d1ecf4339"]},"offset":"15295410"},"sameValue.js":{"size":478,"integrity":{"algorithm":"SHA256","hash":"3298de79d5f2445230c0ada00aad7aaf397f9cedbafca4e883eb14ed728969a9","blockSize":4194304,"blocks":["3298de79d5f2445230c0ada00aad7aaf397f9cedbafca4e883eb14ed728969a9"]},"offset":"15296116"},"sameValueZero.js":{"size":486,"integrity":{"algorithm":"SHA256","hash":"ca2826c7fad717651658a2b4c1e5c1ac6ea8c2ec672e07a9b776ae94cbfb5072","blockSize":4194304,"blocks":["ca2826c7fad717651658a2b4c1e5c1ac6ea8c2ec672e07a9b776ae94cbfb5072"]},"offset":"15296594"},"signedRightShift.js":{"size":505,"integrity":{"algorithm":"SHA256","hash":"c2e81957b638d1b70a7a2b7da8862c7d1209cea6504b0bcdaa2cd48fbd5f91da","blockSize":4194304,"blocks":["c2e81957b638d1b70a7a2b7da8862c7d1209cea6504b0bcdaa2cd48fbd5f91da"]},"offset":"15297080"},"subtract.js":{"size":469,"integrity":{"algorithm":"SHA256","hash":"4e53c777ed8780ad5389ab7a5e702092dfc5c7a5fbf572a85990d3c9d4a6f7dd","blockSize":4194304,"blocks":["4e53c777ed8780ad5389ab7a5e702092dfc5c7a5fbf572a85990d3c9d4a6f7dd"]},"offset":"15297585"},"toString.js":{"size":427,"integrity":{"algorithm":"SHA256","hash":"b3b5235fd84cd1f64a6c4f580a44a5aab99a0ca72be9446fc457299beea6fac0","blockSize":4194304,"blocks":["b3b5235fd84cd1f64a6c4f580a44a5aab99a0ca72be9446fc457299beea6fac0"]},"offset":"15298054"},"unaryMinus.js":{"size":511,"integrity":{"algorithm":"SHA256","hash":"daaf42db7cafafe67bc4bd73931f958393a1a0cdfbb259390e59e883928d7258","blockSize":4194304,"blocks":["daaf42db7cafafe67bc4bd73931f958393a1a0cdfbb259390e59e883928d7258"]},"offset":"15298481"},"unsignedRightShift.js":{"size":510,"integrity":{"algorithm":"SHA256","hash":"593eccf481aec7fc53840d274d75aa3827c9f08107a60c579c2953e0ed0ab846","blockSize":4194304,"blocks":["593eccf481aec7fc53840d274d75aa3827c9f08107a60c579c2953e0ed0ab846"]},"offset":"15298992"}}}}},"2022":{"files":{"AddEntriesFromIterable.js":{"size":1519,"integrity":{"algorithm":"SHA256","hash":"a2a37224988c05e3ab0b313d3e2cba70be3ff20e71b6df11edc71fd7b6040192","blockSize":4194304,"blocks":["a2a37224988c05e3ab0b313d3e2cba70be3ff20e71b6df11edc71fd7b6040192"]},"offset":"14957195"},"AddToKeptObjects.js":{"size":645,"integrity":{"algorithm":"SHA256","hash":"4ec6c3fc7ca0668126681940c8500fbf7c3b64dda1f2a4e9d48f9c02e4975a27","blockSize":4194304,"blocks":["4ec6c3fc7ca0668126681940c8500fbf7c3b64dda1f2a4e9d48f9c02e4975a27"]},"offset":"14958714"},"AdvanceStringIndex.js":{"size":1010,"integrity":{"algorithm":"SHA256","hash":"a37f26cd2cd0e612360c0d2296f2b7a3c8109654383ba72ea0d764b63aae69d5","blockSize":4194304,"blocks":["a37f26cd2cd0e612360c0d2296f2b7a3c8109654383ba72ea0d764b63aae69d5"]},"offset":"14959359"},"ApplyStringOrNumericBinaryOperator.js":{"size":3187,"integrity":{"algorithm":"SHA256","hash":"d1439502c727461cc2423ab28f037be9921092799a13c4873db3bddd1794c244","blockSize":4194304,"blocks":["d1439502c727461cc2423ab28f037be9921092799a13c4873db3bddd1794c244"]},"offset":"14960369"},"ArrayCreate.js":{"size":1667,"integrity":{"algorithm":"SHA256","hash":"57c944ded8a32ef497f3a8c1ab8ea121c128839f9721df7666479593532c9c75","blockSize":4194304,"blocks":["57c944ded8a32ef497f3a8c1ab8ea121c128839f9721df7666479593532c9c75"]},"offset":"14963556"},"ArraySetLength.js":{"size":2665,"integrity":{"algorithm":"SHA256","hash":"4b07de7693377557e2f05bf21ea871ff235ce1121e0e95846f5639fa5cc3ebb1","blockSize":4194304,"blocks":["4b07de7693377557e2f05bf21ea871ff235ce1121e0e95846f5639fa5cc3ebb1"]},"offset":"14965223"},"ArraySpeciesCreate.js":{"size":1370,"integrity":{"algorithm":"SHA256","hash":"5f48d84fcd0e44c8ff2a177aa346de4ac8a138cccd80752fe0041d01421f587d","blockSize":4194304,"blocks":["5f48d84fcd0e44c8ff2a177aa346de4ac8a138cccd80752fe0041d01421f587d"]},"offset":"14967888"},"BigIntBitwiseOp.js":{"size":1735,"integrity":{"algorithm":"SHA256","hash":"407178e5d611fcdfcd1af1dd2f5c16804c048b53656d23e26f63700a3fcd4153","blockSize":4194304,"blocks":["407178e5d611fcdfcd1af1dd2f5c16804c048b53656d23e26f63700a3fcd4153"]},"offset":"14969258"},"BinaryAnd.js":{"size":364,"integrity":{"algorithm":"SHA256","hash":"38c2e690ef1ebb7332d98d27095de8931e2ae9516b5ff5fa102d73c5093d4408","blockSize":4194304,"blocks":["38c2e690ef1ebb7332d98d27095de8931e2ae9516b5ff5fa102d73c5093d4408"]},"offset":"14970993"},"BinaryOr.js":{"size":362,"integrity":{"algorithm":"SHA256","hash":"5c95b7bca8afa7f8e0ee93f1047e344fa9ebec555d926aee3a6290a625504b84","blockSize":4194304,"blocks":["5c95b7bca8afa7f8e0ee93f1047e344fa9ebec555d926aee3a6290a625504b84"]},"offset":"14971357"},"BinaryXor.js":{"size":364,"integrity":{"algorithm":"SHA256","hash":"35dfdf32b56aae2408cb3a336fdc3172b1389c8de0fad05ebb62226cd7016a8f","blockSize":4194304,"blocks":["35dfdf32b56aae2408cb3a336fdc3172b1389c8de0fad05ebb62226cd7016a8f"]},"offset":"14971719"},"ByteListBitwiseOp.js":{"size":1323,"integrity":{"algorithm":"SHA256","hash":"9b3671d8ed8627796e8e383600b048927b4fb1350fd2bac73ab73e5d6a3075cf","blockSize":4194304,"blocks":["9b3671d8ed8627796e8e383600b048927b4fb1350fd2bac73ab73e5d6a3075cf"]},"offset":"14972083"},"ByteListEqual.js":{"size":913,"integrity":{"algorithm":"SHA256","hash":"91f13d3e38714c5077e445752c165091bb6db0a5833a6602c6d585ee1f6c784a","blockSize":4194304,"blocks":["91f13d3e38714c5077e445752c165091bb6db0a5833a6602c6d585ee1f6c784a"]},"offset":"14973406"},"Call.js":{"size":623,"integrity":{"algorithm":"SHA256","hash":"b092006d05bceeccee48bdf3fde9d83ee54a156eb2841bf5cacdca9f157b4571","blockSize":4194304,"blocks":["b092006d05bceeccee48bdf3fde9d83ee54a156eb2841bf5cacdca9f157b4571"]},"offset":"14974319"},"CanonicalNumericIndexString.js":{"size":654,"integrity":{"algorithm":"SHA256","hash":"c850cc1637b82f4fc238d2ae1a45229e8d44bc5c9b85205c0f27a1e0e9bb9d2b","blockSize":4194304,"blocks":["c850cc1637b82f4fc238d2ae1a45229e8d44bc5c9b85205c0f27a1e0e9bb9d2b"]},"offset":"14974942"},"CharacterRange.js":{"size":782,"integrity":{"algorithm":"SHA256","hash":"49612101e544a9b707f116ac8fe2be0d2c559c1d3b4f94ba47f36832913ea11f","blockSize":4194304,"blocks":["49612101e544a9b707f116ac8fe2be0d2c559c1d3b4f94ba47f36832913ea11f"]},"offset":"14975596"},"ClearKeptObjects.js":{"size":302,"integrity":{"algorithm":"SHA256","hash":"607fd49d35a0db529605b8ea50cd5526ce9c35ac0caa200a6beb2da4aab04c35","blockSize":4194304,"blocks":["607fd49d35a0db529605b8ea50cd5526ce9c35ac0caa200a6beb2da4aab04c35"]},"offset":"14976378"},"CodePointAt.js":{"size":1740,"integrity":{"algorithm":"SHA256","hash":"e1fea9e57767a094f7a01cbfb90259a1b4fc945f3676693d861e4a3e3784e59a","blockSize":4194304,"blocks":["e1fea9e57767a094f7a01cbfb90259a1b4fc945f3676693d861e4a3e3784e59a"]},"offset":"14976680"},"CodePointsToString.js":{"size":788,"integrity":{"algorithm":"SHA256","hash":"9686c83f1cfbbcb66eba167db410c3d538cb7070416cce8411892576cd922a1b","blockSize":4194304,"blocks":["9686c83f1cfbbcb66eba167db410c3d538cb7070416cce8411892576cd922a1b"]},"offset":"14978420"},"CompletePropertyDescriptor.js":{"size":989,"integrity":{"algorithm":"SHA256","hash":"17825d14da6797c52aa699d7b089bc2370d5a899cb7af7e3485f948fde50fca2","blockSize":4194304,"blocks":["17825d14da6797c52aa699d7b089bc2370d5a899cb7af7e3485f948fde50fca2"]},"offset":"14979208"},"CopyDataProperties.js":{"size":2054,"integrity":{"algorithm":"SHA256","hash":"521745b80516fd30edd241cb6ec7cc0dc60af43c0047f4b70fa0005ed21b46a5","blockSize":4194304,"blocks":["521745b80516fd30edd241cb6ec7cc0dc60af43c0047f4b70fa0005ed21b46a5"]},"offset":"14980197"},"CreateDataProperty.js":{"size":1279,"integrity":{"algorithm":"SHA256","hash":"5006509a3f5567f81cb7f730448a0a492c64c7f06406627c58d0334dde5e44f9","blockSize":4194304,"blocks":["5006509a3f5567f81cb7f730448a0a492c64c7f06406627c58d0334dde5e44f9"]},"offset":"14982251"},"CreateDataPropertyOrThrow.js":{"size":734,"integrity":{"algorithm":"SHA256","hash":"50c61c792c27d661346cfb29fe5b7603a2713d7acb1dc5b3b35fe71ece8fd18e","blockSize":4194304,"blocks":["50c61c792c27d661346cfb29fe5b7603a2713d7acb1dc5b3b35fe71ece8fd18e"]},"offset":"14983530"},"CreateHTML.js":{"size":927,"integrity":{"algorithm":"SHA256","hash":"5b9cf63f6b4bc50077e333c2b310cbd4c85a97891b2e1d28a93aeeb4370c2930","blockSize":4194304,"blocks":["5b9cf63f6b4bc50077e333c2b310cbd4c85a97891b2e1d28a93aeeb4370c2930"]},"offset":"14984264"},"CreateIterResultObject.js":{"size":432,"integrity":{"algorithm":"SHA256","hash":"289a26996866dba6f6292ba0931e643c7a5851f21003d41e5a004862a03a2035","blockSize":4194304,"blocks":["289a26996866dba6f6292ba0931e643c7a5851f21003d41e5a004862a03a2035"]},"offset":"14985191"},"CreateListFromArrayLike.js":{"size":1363,"integrity":{"algorithm":"SHA256","hash":"6be740d47f24bafd1ffa0710a7f94e86e34042b1fb0d2a40a1ea3c70dc331738","blockSize":4194304,"blocks":["6be740d47f24bafd1ffa0710a7f94e86e34042b1fb0d2a40a1ea3c70dc331738"]},"offset":"14985623"},"CreateMethodProperty.js":{"size":979,"integrity":{"algorithm":"SHA256","hash":"117c68b2fa6825c31e8d6f4970973fddf09fd74506447ca22ed3cfc2ed8b04e8","blockSize":4194304,"blocks":["117c68b2fa6825c31e8d6f4970973fddf09fd74506447ca22ed3cfc2ed8b04e8"]},"offset":"14986986"},"CreateNonEnumerableDataPropertyOrThrow.js":{"size":785,"integrity":{"algorithm":"SHA256","hash":"242e067b294642e0240ab3905f9e7fc13a937bb9a7f6168773129968b42b4c87","blockSize":4194304,"blocks":["242e067b294642e0240ab3905f9e7fc13a937bb9a7f6168773129968b42b4c87"]},"offset":"14987965"},"CreateRegExpStringIterator.js":{"size":3708,"integrity":{"algorithm":"SHA256","hash":"317ed938151dfef9b0bfccf08cf6ca31d3465ef38ab9be62edd036ea046f49b6","blockSize":4194304,"blocks":["317ed938151dfef9b0bfccf08cf6ca31d3465ef38ab9be62edd036ea046f49b6"]},"offset":"14988750"},"DateFromTime.js":{"size":1036,"integrity":{"algorithm":"SHA256","hash":"ae437cb5ee92b162e18b6f47b9dd66b66f627547e098a0670d60c2572f04b1ed","blockSize":4194304,"blocks":["ae437cb5ee92b162e18b6f47b9dd66b66f627547e098a0670d60c2572f04b1ed"]},"offset":"14992458"},"DateString.js":{"size":1055,"integrity":{"algorithm":"SHA256","hash":"9dde544576a4c552c56ee5f102459d4e3ca28bb800ccba833b53bd159d1e864a","blockSize":4194304,"blocks":["9dde544576a4c552c56ee5f102459d4e3ca28bb800ccba833b53bd159d1e864a"]},"offset":"14993494"},"Day.js":{"size":234,"integrity":{"algorithm":"SHA256","hash":"ff3875a46c34886cff3808ab1c4de6d3b45a61e9638b32edd22f41277c153ea5","blockSize":4194304,"blocks":["ff3875a46c34886cff3808ab1c4de6d3b45a61e9638b32edd22f41277c153ea5"]},"offset":"14994549"},"DayFromYear.js":{"size":256,"integrity":{"algorithm":"SHA256","hash":"378eb638143e86cfa3061177986dcfdb6bdec76e8b799b95cf3b9cafc5e9af68","blockSize":4194304,"blocks":["378eb638143e86cfa3061177986dcfdb6bdec76e8b799b95cf3b9cafc5e9af68"]},"offset":"14994783"},"DayWithinYear.js":{"size":286,"integrity":{"algorithm":"SHA256","hash":"b1ac5824fb1ced3e9d2dae99db5bd3890b4ef25dc45e50a4f927384bb5be618e","blockSize":4194304,"blocks":["b1ac5824fb1ced3e9d2dae99db5bd3890b4ef25dc45e50a4f927384bb5be618e"]},"offset":"14995039"},"DaysInYear.js":{"size":301,"integrity":{"algorithm":"SHA256","hash":"3f5955b3d1831ed2d008ae052a802b12c22bf1ba6d8fd286e0cb7a6a77144aec","blockSize":4194304,"blocks":["3f5955b3d1831ed2d008ae052a802b12c22bf1ba6d8fd286e0cb7a6a77144aec"]},"offset":"14995325"},"DefinePropertyOrThrow.js":{"size":1466,"integrity":{"algorithm":"SHA256","hash":"1964ecd5b9e64b3ddb203ac7da3410e09a2b1d0ab9b1f06733af8ea15ae954a4","blockSize":4194304,"blocks":["1964ecd5b9e64b3ddb203ac7da3410e09a2b1d0ab9b1f06733af8ea15ae954a4"]},"offset":"14995626"},"DeletePropertyOrThrow.js":{"size":699,"integrity":{"algorithm":"SHA256","hash":"3c1ac659ec4eb7ad97e99c2c3d08c2058624eec2ac0bcca0583660a0fe69f1c5","blockSize":4194304,"blocks":["3c1ac659ec4eb7ad97e99c2c3d08c2058624eec2ac0bcca0583660a0fe69f1c5"]},"offset":"14997092"},"EnumerableOwnPropertyNames.js":{"size":1112,"integrity":{"algorithm":"SHA256","hash":"d389393a016c32c0b737581f924aad9edb42291b1f869bb514f5521f31a4a198","blockSize":4194304,"blocks":["d389393a016c32c0b737581f924aad9edb42291b1f869bb514f5521f31a4a198"]},"offset":"14997791"},"FlattenIntoArray.js":{"size":1752,"integrity":{"algorithm":"SHA256","hash":"005084af0dadcac75646c5db3744c8ced48a4ca4ba8c50949355c8770ea108f7","blockSize":4194304,"blocks":["005084af0dadcac75646c5db3744c8ced48a4ca4ba8c50949355c8770ea108f7"]},"offset":"14998903"},"FromPropertyDescriptor.js":{"size":450,"integrity":{"algorithm":"SHA256","hash":"a16798c55be7b402fc2b27d4d422f322c40639b7403d47cb897b576fcc1ddd49","blockSize":4194304,"blocks":["a16798c55be7b402fc2b27d4d422f322c40639b7403d47cb897b576fcc1ddd49"]},"offset":"15000655"},"Get.js":{"size":602,"integrity":{"algorithm":"SHA256","hash":"ef9a4a39b94f3287d0c9ed27b9a5f1cb71164d2184d6aaf2fc5900fd44016ff9","blockSize":4194304,"blocks":["ef9a4a39b94f3287d0c9ed27b9a5f1cb71164d2184d6aaf2fc5900fd44016ff9"]},"offset":"15001105"},"GetIterator.js":{"size":1720,"integrity":{"algorithm":"SHA256","hash":"bd462e2f956ac2c90ec0c3365da5c7b76816e16cf01a8e66aa32ee03342e7950","blockSize":4194304,"blocks":["bd462e2f956ac2c90ec0c3365da5c7b76816e16cf01a8e66aa32ee03342e7950"]},"offset":"15001707"},"GetMatchIndexPair.js":{"size":855,"integrity":{"algorithm":"SHA256","hash":"8b8de1a0734625414cce684e65fb4df8fa39957f2c97d1cc49a8470d9b5ef301","blockSize":4194304,"blocks":["8b8de1a0734625414cce684e65fb4df8fa39957f2c97d1cc49a8470d9b5ef301"]},"offset":"15003427"},"GetMatchString.js":{"size":901,"integrity":{"algorithm":"SHA256","hash":"4d8bb40659fcefc065556b2e5f8b3e6b32ae14605ad59585353dfc5a647a7336","blockSize":4194304,"blocks":["4d8bb40659fcefc065556b2e5f8b3e6b32ae14605ad59585353dfc5a647a7336"]},"offset":"15004282"},"GetMethod.js":{"size":663,"integrity":{"algorithm":"SHA256","hash":"87f8829531af6b2019ed31d44f2efcf89e8bf345c158ad6bd790f8e14028d325","blockSize":4194304,"blocks":["87f8829531af6b2019ed31d44f2efcf89e8bf345c158ad6bd790f8e14028d325"]},"offset":"15005183"},"GetOwnPropertyKeys.js":{"size":829,"integrity":{"algorithm":"SHA256","hash":"7ad04a3a175ede6b7d15611717a20c2bc6a09bef382f8b4f7d985e5b2e1e7120","blockSize":4194304,"blocks":["7ad04a3a175ede6b7d15611717a20c2bc6a09bef382f8b4f7d985e5b2e1e7120"]},"offset":"15005846"},"GetPromiseResolve.js":{"size":692,"integrity":{"algorithm":"SHA256","hash":"b34e42fea73d140b4169f6b3a74c9122923e26dc9cac1bb545f0d5e03f5d7412","blockSize":4194304,"blocks":["b34e42fea73d140b4169f6b3a74c9122923e26dc9cac1bb545f0d5e03f5d7412"]},"offset":"15006675"},"GetPrototypeFromConstructor.js":{"size":921,"integrity":{"algorithm":"SHA256","hash":"da1c30c8d5b331e72618af4ccc18b5f3ed89b36e9be117c74a4ee9266141ba56","blockSize":4194304,"blocks":["da1c30c8d5b331e72618af4ccc18b5f3ed89b36e9be117c74a4ee9266141ba56"]},"offset":"15007367"},"GetStringIndex.js":{"size":858,"integrity":{"algorithm":"SHA256","hash":"450259242c894bf4d0202b4567523b18cca659dca71e7f3c72c01861144fc597","blockSize":4194304,"blocks":["450259242c894bf4d0202b4567523b18cca659dca71e7f3c72c01861144fc597"]},"offset":"15008288"},"GetSubstitution.js":{"size":4463,"integrity":{"algorithm":"SHA256","hash":"f221f4b993dab85205f7e21214df01f260c19d27faf3159c874a4960a7afa416","blockSize":4194304,"blocks":["f221f4b993dab85205f7e21214df01f260c19d27faf3159c874a4960a7afa416"]},"offset":"15009146"},"GetV.js":{"size":474,"integrity":{"algorithm":"SHA256","hash":"66909f7192a6bddc6fb77163f6182164ebef641f0f4c595835485eda6cfd3443","blockSize":4194304,"blocks":["66909f7192a6bddc6fb77163f6182164ebef641f0f4c595835485eda6cfd3443"]},"offset":"15013609"},"HasOwnProperty.js":{"size":553,"integrity":{"algorithm":"SHA256","hash":"b099b2f9829fe64e25740771abc3d3c4e1c801ce0cd2ccecf6041ad08d59364d","blockSize":4194304,"blocks":["b099b2f9829fe64e25740771abc3d3c4e1c801ce0cd2ccecf6041ad08d59364d"]},"offset":"15014083"},"HasProperty.js":{"size":517,"integrity":{"algorithm":"SHA256","hash":"7889a3e2b191509b3d6c0bfcabbad2a915919a2caa275b696a12eab4ebd9cdac","blockSize":4194304,"blocks":["7889a3e2b191509b3d6c0bfcabbad2a915919a2caa275b696a12eab4ebd9cdac"]},"offset":"15014636"},"HourFromTime.js":{"size":382,"integrity":{"algorithm":"SHA256","hash":"338503d8b54967fb22e0659243cab7fc283f023561a8a3316df8b4de588bddf9","blockSize":4194304,"blocks":["338503d8b54967fb22e0659243cab7fc283f023561a8a3316df8b4de588bddf9"]},"offset":"15015153"},"InLeapYear.js":{"size":510,"integrity":{"algorithm":"SHA256","hash":"d9abbf0c4b80df1fd7cb31830f222eb4b6bbe638dcfa3461809905158f2ce0a6","blockSize":4194304,"blocks":["d9abbf0c4b80df1fd7cb31830f222eb4b6bbe638dcfa3461809905158f2ce0a6"]},"offset":"15015535"},"InstallErrorCause.js":{"size":706,"integrity":{"algorithm":"SHA256","hash":"a2ae6db13bf8f3cabc20d91ed1a7b122d74182ce07c5ebd233d9329ea26bdd1e","blockSize":4194304,"blocks":["a2ae6db13bf8f3cabc20d91ed1a7b122d74182ce07c5ebd233d9329ea26bdd1e"]},"offset":"15016045"},"InstanceofOperator.js":{"size":918,"integrity":{"algorithm":"SHA256","hash":"af702715d893f635ff66441f9638a4dc977789c505a50ae17f7e02b05b2549d6","blockSize":4194304,"blocks":["af702715d893f635ff66441f9638a4dc977789c505a50ae17f7e02b05b2549d6"]},"offset":"15016751"},"Invoke.js":{"size":715,"integrity":{"algorithm":"SHA256","hash":"ff016550d8adf9608b2f4ab258017c1582ce717a2e2b3bd2b7a94440f7f19f8f","blockSize":4194304,"blocks":["ff016550d8adf9608b2f4ab258017c1582ce717a2e2b3bd2b7a94440f7f19f8f"]},"offset":"15017669"},"IsAccessorDescriptor.js":{"size":465,"integrity":{"algorithm":"SHA256","hash":"425c74a892b6bb2d1dc6c56e7a6e77e40b9c4d4390480fafe4c804cea53a80ad","blockSize":4194304,"blocks":["425c74a892b6bb2d1dc6c56e7a6e77e40b9c4d4390480fafe4c804cea53a80ad"]},"offset":"15018384"},"IsArray.js":{"size":123,"integrity":{"algorithm":"SHA256","hash":"a8f01a797e05a74501ceb9293408f72bded2a08013c6a075f582737003b443f4","blockSize":4194304,"blocks":["a8f01a797e05a74501ceb9293408f72bded2a08013c6a075f582737003b443f4"]},"offset":"15018849"},"IsBigIntElementType.js":{"size":194,"integrity":{"algorithm":"SHA256","hash":"8fc2140ce6165463b7ba7bb773bf691592364f65c0806edcccd2e97ea3e4f963","blockSize":4194304,"blocks":["8fc2140ce6165463b7ba7bb773bf691592364f65c0806edcccd2e97ea3e4f963"]},"offset":"15018972"},"IsCallable.js":{"size":108,"integrity":{"algorithm":"SHA256","hash":"789ba0a1f176c56862f16b2ff7bc3eeaaa02676f75be073a46c92c5e8af21170","blockSize":4194304,"blocks":["789ba0a1f176c56862f16b2ff7bc3eeaaa02676f75be073a46c92c5e8af21170"]},"offset":"15019166"},"IsCompatiblePropertyDescriptor.js":{"size":361,"integrity":{"algorithm":"SHA256","hash":"5941c4720931fec0cb02a818344ba7d422561198bb8b52ad565232e6cdbaa611","blockSize":4194304,"blocks":["5941c4720931fec0cb02a818344ba7d422561198bb8b52ad565232e6cdbaa611"]},"offset":"15019274"},"IsConcatSpreadable.js":{"size":626,"integrity":{"algorithm":"SHA256","hash":"7a4c3cae4f5de1b8cbc5694ac320cfaaf30f4ecbe2754e2ffb3f72fb42763a8a","blockSize":4194304,"blocks":["7a4c3cae4f5de1b8cbc5694ac320cfaaf30f4ecbe2754e2ffb3f72fb42763a8a"]},"offset":"15019635"},"IsConstructor.js":{"size":1149,"integrity":{"algorithm":"SHA256","hash":"1a58d54e8aec9ecbfaf3e75d9b38ef06c8a3c948e337cca159a17a102ee41929","blockSize":4194304,"blocks":["1a58d54e8aec9ecbfaf3e75d9b38ef06c8a3c948e337cca159a17a102ee41929"]},"offset":"15020261"},"IsDataDescriptor.js":{"size":464,"integrity":{"algorithm":"SHA256","hash":"35a0862d76e9d765d5fa4154250ed5ac440f4238432a773f22c288da3886e1ce","blockSize":4194304,"blocks":["35a0862d76e9d765d5fa4154250ed5ac440f4238432a773f22c288da3886e1ce"]},"offset":"15021410"},"IsExtensible.js":{"size":509,"integrity":{"algorithm":"SHA256","hash":"e28d0530ae66f0dfb8fa90c492fd6242a44ea7eff298d1ed4c10eac9fdfc8efb","blockSize":4194304,"blocks":["e28d0530ae66f0dfb8fa90c492fd6242a44ea7eff298d1ed4c10eac9fdfc8efb"]},"offset":"15021874"},"IsGenericDescriptor.js":{"size":560,"integrity":{"algorithm":"SHA256","hash":"b9d31ec0ad5beaea6a7d9f1180d67ef8f45b164234deeee14c362c8eb2e135cc","blockSize":4194304,"blocks":["b9d31ec0ad5beaea6a7d9f1180d67ef8f45b164234deeee14c362c8eb2e135cc"]},"offset":"15022383"},"IsIntegralNumber.js":{"size":473,"integrity":{"algorithm":"SHA256","hash":"d9f2f512d7c82b081f1afc5535a9d7c3beb272ec78197631ccbb355f47e52ca3","blockSize":4194304,"blocks":["d9f2f512d7c82b081f1afc5535a9d7c3beb272ec78197631ccbb355f47e52ca3"]},"offset":"15022943"},"IsLessThan.js":{"size":2545,"integrity":{"algorithm":"SHA256","hash":"a51d07a7e923ceb4d9c5f725d70afb72fa29ad6d481990e31d460b5d9bc409f0","blockSize":4194304,"blocks":["a51d07a7e923ceb4d9c5f725d70afb72fa29ad6d481990e31d460b5d9bc409f0"]},"offset":"15023416"},"IsLooselyEqual.js":{"size":1734,"integrity":{"algorithm":"SHA256","hash":"efc46039af8cc2f84628b0492be5cd927626ef6e0660cdc542b1f0e254a4a5de","blockSize":4194304,"blocks":["efc46039af8cc2f84628b0492be5cd927626ef6e0660cdc542b1f0e254a4a5de"]},"offset":"15025961"},"IsNoTearConfiguration.js":{"size":467,"integrity":{"algorithm":"SHA256","hash":"0e2f942e0932969b609de49c1769557553fd72d1d4e3b7940627c192427a7138","blockSize":4194304,"blocks":["0e2f942e0932969b609de49c1769557553fd72d1d4e3b7940627c192427a7138"]},"offset":"15027695"},"IsPromise.js":{"size":485,"integrity":{"algorithm":"SHA256","hash":"9f4e5aef10bca5119fab546b4834e48b776d14a775f55524cd3512c4321a1e7c","blockSize":4194304,"blocks":["9f4e5aef10bca5119fab546b4834e48b776d14a775f55524cd3512c4321a1e7c"]},"offset":"15028162"},"IsPropertyKey.js":{"size":207,"integrity":{"algorithm":"SHA256","hash":"577d849187a0e8ef526a6368eb6757f6a128db792cf9ade6dfc6c82a75d155c3","blockSize":4194304,"blocks":["577d849187a0e8ef526a6368eb6757f6a128db792cf9ade6dfc6c82a75d155c3"]},"offset":"15028647"},"IsRegExp.js":{"size":545,"integrity":{"algorithm":"SHA256","hash":"1183cff5c42c2cf9a0b3fbb62d4a7f842b56c1141209c683f0116715bcf03c15","blockSize":4194304,"blocks":["1183cff5c42c2cf9a0b3fbb62d4a7f842b56c1141209c683f0116715bcf03c15"]},"offset":"15028854"},"IsSharedArrayBuffer.js":{"size":461,"integrity":{"algorithm":"SHA256","hash":"9451dbf3ee8a39a73e3e2315f48495288b29521576f0539d18c56fc4b6d85012","blockSize":4194304,"blocks":["9451dbf3ee8a39a73e3e2315f48495288b29521576f0539d18c56fc4b6d85012"]},"offset":"15029399"},"IsStrictlyEqual.js":{"size":557,"integrity":{"algorithm":"SHA256","hash":"dc37d18c106ca0f054ad8b02f2e46368361a4007d6cf3807e95332578a17ae2a","blockSize":4194304,"blocks":["dc37d18c106ca0f054ad8b02f2e46368361a4007d6cf3807e95332578a17ae2a"]},"offset":"15029860"},"IsStringPrefix.js":{"size":539,"integrity":{"algorithm":"SHA256","hash":"a353cce73be1c19b877bc03552486f9a72a2e5efc7b3b5478685f7fa4d1c7d0c","blockSize":4194304,"blocks":["a353cce73be1c19b877bc03552486f9a72a2e5efc7b3b5478685f7fa4d1c7d0c"]},"offset":"15030417"},"IsStringWellFormedUnicode.js":{"size":716,"integrity":{"algorithm":"SHA256","hash":"789fe255e70648d702fc64c875da1c8650733d6d5396386abd2b3984ddbcae14","blockSize":4194304,"blocks":["789fe255e70648d702fc64c875da1c8650733d6d5396386abd2b3984ddbcae14"]},"offset":"15030956"},"IsUnclampedIntegerElementType.js":{"size":298,"integrity":{"algorithm":"SHA256","hash":"8f1f1d7b8ebb15b5b82d66e07078c3001988b807bdc3323e8a17cc246c444c34","blockSize":4194304,"blocks":["8f1f1d7b8ebb15b5b82d66e07078c3001988b807bdc3323e8a17cc246c444c34"]},"offset":"15031672"},"IsUnsignedElementType.js":{"size":266,"integrity":{"algorithm":"SHA256","hash":"ce9973faeaa330b09173245337ff899b86a63b895f5de7106f5f28a8fba9e7f2","blockSize":4194304,"blocks":["ce9973faeaa330b09173245337ff899b86a63b895f5de7106f5f28a8fba9e7f2"]},"offset":"15031970"},"IterableToList.js":{"size":721,"integrity":{"algorithm":"SHA256","hash":"63cff4e4ace6f84a82b2d665b4808a4d10ad44c19b574d431f86296d17247d9f","blockSize":4194304,"blocks":["63cff4e4ace6f84a82b2d665b4808a4d10ad44c19b574d431f86296d17247d9f"]},"offset":"15032236"},"IteratorClose.js":{"size":1481,"integrity":{"algorithm":"SHA256","hash":"52b100a8cc0ecb7b5d5c7346e20d23c7503c832525650b3269f40f6b98948cae","blockSize":4194304,"blocks":["52b100a8cc0ecb7b5d5c7346e20d23c7503c832525650b3269f40f6b98948cae"]},"offset":"15032957"},"IteratorComplete.js":{"size":498,"integrity":{"algorithm":"SHA256","hash":"41ad3ddb0114bfd56e3e67508633496d4ae672eeb47767f12ae0dacdd91d39b5","blockSize":4194304,"blocks":["41ad3ddb0114bfd56e3e67508633496d4ae672eeb47767f12ae0dacdd91d39b5"]},"offset":"15034438"},"IteratorNext.js":{"size":493,"integrity":{"algorithm":"SHA256","hash":"a6ee567a6387448b0140aceffae4ad1ccdd427537d6926716c3f686367098d30","blockSize":4194304,"blocks":["a6ee567a6387448b0140aceffae4ad1ccdd427537d6926716c3f686367098d30"]},"offset":"15034936"},"IteratorStep.js":{"size":353,"integrity":{"algorithm":"SHA256","hash":"22dbe3c1e07083538804e0bc79a4615d97ae6b49978623594f81e9ffd0ad0594","blockSize":4194304,"blocks":["22dbe3c1e07083538804e0bc79a4615d97ae6b49978623594f81e9ffd0ad0594"]},"offset":"15035429"},"IteratorValue.js":{"size":443,"integrity":{"algorithm":"SHA256","hash":"674abbe8978a08b6d6d6ae53a7c3aca04395c6a3e5d97807204fcfaf81fafd68","blockSize":4194304,"blocks":["674abbe8978a08b6d6d6ae53a7c3aca04395c6a3e5d97807204fcfaf81fafd68"]},"offset":"15035782"},"LengthOfArrayLike.js":{"size":495,"integrity":{"algorithm":"SHA256","hash":"57dde851cceec9f755c926949296097a22c26f3fb88b44ee3a143bc6771cd661","blockSize":4194304,"blocks":["57dde851cceec9f755c926949296097a22c26f3fb88b44ee3a143bc6771cd661"]},"offset":"15036225"},"MakeDate.js":{"size":328,"integrity":{"algorithm":"SHA256","hash":"41a9b9da3ede4effd12c43e1c25851b5005623f5eb6dee707252cbe373b32ef0","blockSize":4194304,"blocks":["41a9b9da3ede4effd12c43e1c25851b5005623f5eb6dee707252cbe373b32ef0"]},"offset":"15036720"},"MakeDay.js":{"size":1012,"integrity":{"algorithm":"SHA256","hash":"47e59f248f63087a5bc71792d2a50197852d7adfee336a2dbb7a899a90cfe8c0","blockSize":4194304,"blocks":["47e59f248f63087a5bc71792d2a50197852d7adfee336a2dbb7a899a90cfe8c0"]},"offset":"15037048"},"MakeMatchIndicesIndexPairArray.js":{"size":2752,"integrity":{"algorithm":"SHA256","hash":"2ebbf04db36dd1f7a795931ecce9449b43c8c8e6503ab1dede561e26bdd69a7a","blockSize":4194304,"blocks":["2ebbf04db36dd1f7a795931ecce9449b43c8c8e6503ab1dede561e26bdd69a7a"]},"offset":"15038060"},"MakeTime.js":{"size":763,"integrity":{"algorithm":"SHA256","hash":"e2273ea0a905940ae9ce87da482f3d704162b475153dd85a5b990566dcf368ed","blockSize":4194304,"blocks":["e2273ea0a905940ae9ce87da482f3d704162b475153dd85a5b990566dcf368ed"]},"offset":"15040812"},"MinFromTime.js":{"size":396,"integrity":{"algorithm":"SHA256","hash":"88e77ac8a1b1aae30fe064057ed6699c3c3b176ec1ab0533893be6d1c7ba856a","blockSize":4194304,"blocks":["88e77ac8a1b1aae30fe064057ed6699c3c3b176ec1ab0533893be6d1c7ba856a"]},"offset":"15041575"},"MonthFromTime.js":{"size":1014,"integrity":{"algorithm":"SHA256","hash":"f7acafe967a838eb85739ec2afa8dcdc9e5c0734219559259338761a09131909","blockSize":4194304,"blocks":["f7acafe967a838eb85739ec2afa8dcdc9e5c0734219559259338761a09131909"]},"offset":"15041971"},"NumberBitwiseOp.js":{"size":757,"integrity":{"algorithm":"SHA256","hash":"0aa5b6fd1cb50c290090d0fd6d21889908148a70f31f73edf99f937d55b12e59","blockSize":4194304,"blocks":["0aa5b6fd1cb50c290090d0fd6d21889908148a70f31f73edf99f937d55b12e59"]},"offset":"15042985"},"NumberToBigInt.js":{"size":690,"integrity":{"algorithm":"SHA256","hash":"e9731e4dd779ef16185af2e7162ca753787ac75de0a5e40bb46ac430d0305411","blockSize":4194304,"blocks":["e9731e4dd779ef16185af2e7162ca753787ac75de0a5e40bb46ac430d0305411"]},"offset":"15043742"},"ObjectDefineProperties.js":{"size":1508,"integrity":{"algorithm":"SHA256","hash":"672b0bda371a4710bf8e7c99cfc41eca1920c10fad584755be76cd5ac1136fa5","blockSize":4194304,"blocks":["672b0bda371a4710bf8e7c99cfc41eca1920c10fad584755be76cd5ac1136fa5"]},"offset":"15044432"},"OrdinaryCreateFromConstructor.js":{"size":827,"integrity":{"algorithm":"SHA256","hash":"0e9404db2c868e18c5895340e06e66f4fd8505fc466f21dc533c025f57cfcddb","blockSize":4194304,"blocks":["0e9404db2c868e18c5895340e06e66f4fd8505fc466f21dc533c025f57cfcddb"]},"offset":"15045940"},"OrdinaryDefineOwnProperty.js":{"size":2390,"integrity":{"algorithm":"SHA256","hash":"5aa87d94193a2cc6a19e5ef3e44a4b1e12f99ff6a0cd1755faf0f0338b0e07fd","blockSize":4194304,"blocks":["5aa87d94193a2cc6a19e5ef3e44a4b1e12f99ff6a0cd1755faf0f0338b0e07fd"]},"offset":"15046767"},"OrdinaryGetOwnProperty.js":{"size":1257,"integrity":{"algorithm":"SHA256","hash":"d4ef741d1e026235ef46accf3a1538b3510a81e35eff00e0643e0431f3c71ba8","blockSize":4194304,"blocks":["d4ef741d1e026235ef46accf3a1538b3510a81e35eff00e0643e0431f3c71ba8"]},"offset":"15049157"},"OrdinaryGetPrototypeOf.js":{"size":539,"integrity":{"algorithm":"SHA256","hash":"bf546da8b6ac3f982c55919169b2f07320b7934868dfb3b82c13f38c72b95a0d","blockSize":4194304,"blocks":["bf546da8b6ac3f982c55919169b2f07320b7934868dfb3b82c13f38c72b95a0d"]},"offset":"15050414"},"OrdinaryHasInstance.js":{"size":627,"integrity":{"algorithm":"SHA256","hash":"d36943f8261941e336b58a6d698291eef06aa4d7d44ab5fdffb7d073d50a771c","blockSize":4194304,"blocks":["d36943f8261941e336b58a6d698291eef06aa4d7d44ab5fdffb7d073d50a771c"]},"offset":"15050953"},"OrdinaryHasProperty.js":{"size":531,"integrity":{"algorithm":"SHA256","hash":"cbcf61dec7dc22444d36e89a62324453f98ccff4141e8284e5621b1fd0fbd07b","blockSize":4194304,"blocks":["cbcf61dec7dc22444d36e89a62324453f98ccff4141e8284e5621b1fd0fbd07b"]},"offset":"15051580"},"OrdinaryObjectCreate.js":{"size":1445,"integrity":{"algorithm":"SHA256","hash":"fb9e554f0cf613456fe6912e1ebc9aaa5380a044ed7a1461b5521bd7f534f7ca","blockSize":4194304,"blocks":["fb9e554f0cf613456fe6912e1ebc9aaa5380a044ed7a1461b5521bd7f534f7ca"]},"offset":"15052111"},"OrdinarySetPrototypeOf.js":{"size":1050,"integrity":{"algorithm":"SHA256","hash":"9f33c9e0fba4b5605ca95af4f267ed266cfe5a7ec0c5a739353a37d4b5eee5f3","blockSize":4194304,"blocks":["9f33c9e0fba4b5605ca95af4f267ed266cfe5a7ec0c5a739353a37d4b5eee5f3"]},"offset":"15053556"},"OrdinaryToPrimitive.js":{"size":1065,"integrity":{"algorithm":"SHA256","hash":"5f186778e48dd0375388468783d8a0a68bc08a4ff8f190f33bda9d1b4a73e6a8","blockSize":4194304,"blocks":["5f186778e48dd0375388468783d8a0a68bc08a4ff8f190f33bda9d1b4a73e6a8"]},"offset":"15054606"},"PromiseResolve.js":{"size":457,"integrity":{"algorithm":"SHA256","hash":"6914c2768bee4288d16b384871f81aa098119c14fc9fde2977654905ba227d4c","blockSize":4194304,"blocks":["6914c2768bee4288d16b384871f81aa098119c14fc9fde2977654905ba227d4c"]},"offset":"15055671"},"QuoteJSONString.js":{"size":1420,"integrity":{"algorithm":"SHA256","hash":"46725a5289dc63bbbcf8b14cc674f46a466924fead5172121d605d769c655346","blockSize":4194304,"blocks":["46725a5289dc63bbbcf8b14cc674f46a466924fead5172121d605d769c655346"]},"offset":"15056128"},"RegExpCreate.js":{"size":643,"integrity":{"algorithm":"SHA256","hash":"49da22ccbe85efb7620bfeb7877f2ef8678f1882ade81fcdc3f54567add7ab6b","blockSize":4194304,"blocks":["49da22ccbe85efb7620bfeb7877f2ef8678f1882ade81fcdc3f54567add7ab6b"]},"offset":"15057548"},"RegExpExec.js":{"size":887,"integrity":{"algorithm":"SHA256","hash":"32fbe5fc604aa31efc738c2b617a512114367daffa37a031a3257fe5be493bb9","blockSize":4194304,"blocks":["32fbe5fc604aa31efc738c2b617a512114367daffa37a031a3257fe5be493bb9"]},"offset":"15058191"},"RegExpHasFlag.js":{"size":1101,"integrity":{"algorithm":"SHA256","hash":"f2f1d56d67b40a04c7adc772c7c534a0f5dedb38fab0cdbcde58f8ea162b1cc0","blockSize":4194304,"blocks":["f2f1d56d67b40a04c7adc772c7c534a0f5dedb38fab0cdbcde58f8ea162b1cc0"]},"offset":"15059078"},"RequireObjectCoercible.js":{"size":70,"integrity":{"algorithm":"SHA256","hash":"25d49a24f231f606c6d8be4760f3795c12f61bda0ac95ad8e452205f97c8e612","blockSize":4194304,"blocks":["25d49a24f231f606c6d8be4760f3795c12f61bda0ac95ad8e452205f97c8e612"]},"offset":"15060179"},"SameValue.js":{"size":307,"integrity":{"algorithm":"SHA256","hash":"e6d99ed6b4a479bed51f697cbc4693a2ff8da0d1e07b5ebf11e74b5404af2ab1","blockSize":4194304,"blocks":["e6d99ed6b4a479bed51f697cbc4693a2ff8da0d1e07b5ebf11e74b5404af2ab1"]},"offset":"15060249"},"SameValueNonNumeric.js":{"size":635,"integrity":{"algorithm":"SHA256","hash":"1f99017f243b767fbbf3cb7486093bbac2c505c0302da6046f225cda3b5df57d","blockSize":4194304,"blocks":["1f99017f243b767fbbf3cb7486093bbac2c505c0302da6046f225cda3b5df57d"]},"offset":"15060556"},"SameValueZero.js":{"size":223,"integrity":{"algorithm":"SHA256","hash":"269684a69605b1f7ad04dfccc1519d7905271fd6ae05601a832a2ab8fb7272fc","blockSize":4194304,"blocks":["269684a69605b1f7ad04dfccc1519d7905271fd6ae05601a832a2ab8fb7272fc"]},"offset":"15061191"},"SecFromTime.js":{"size":402,"integrity":{"algorithm":"SHA256","hash":"6263c6176eafa22eadeb7bc054169fd764a3e3aab0cf637110d86110367c8a36","blockSize":4194304,"blocks":["6263c6176eafa22eadeb7bc054169fd764a3e3aab0cf637110d86110367c8a36"]},"offset":"15061414"},"Set.js":{"size":1255,"integrity":{"algorithm":"SHA256","hash":"88389d458aaae848468091535f5e8be59993020e744e998ca3058b59c1943ce8","blockSize":4194304,"blocks":["88389d458aaae848468091535f5e8be59993020e744e998ca3058b59c1943ce8"]},"offset":"15061816"},"SetFunctionLength.js":{"size":1107,"integrity":{"algorithm":"SHA256","hash":"717f73302d1954ace7b01a94b36998aa1a33f1cf0b94ba99cc9a79bbb08aa80d","blockSize":4194304,"blocks":["717f73302d1954ace7b01a94b36998aa1a33f1cf0b94ba99cc9a79bbb08aa80d"]},"offset":"15063071"},"SetFunctionName.js":{"size":1381,"integrity":{"algorithm":"SHA256","hash":"dabffc283c552e871c8bfd4a4d419e9453056b2b51a23f80f2ff6050c30b09c9","blockSize":4194304,"blocks":["dabffc283c552e871c8bfd4a4d419e9453056b2b51a23f80f2ff6050c30b09c9"]},"offset":"15064178"},"SetIntegrityLevel.js":{"size":1862,"integrity":{"algorithm":"SHA256","hash":"3c04bdc423a594ffec10244025e37e466b5878c4255a53655d445f51584b7d5e","blockSize":4194304,"blocks":["3c04bdc423a594ffec10244025e37e466b5878c4255a53655d445f51584b7d5e"]},"offset":"15065559"},"SortIndexedProperties.js":{"size":1693,"integrity":{"algorithm":"SHA256","hash":"e46af48b61d420aa8a98506ab0bafbce28e23fae743977e9312d3736211805f1","blockSize":4194304,"blocks":["e46af48b61d420aa8a98506ab0bafbce28e23fae743977e9312d3736211805f1"]},"offset":"15067421"},"SpeciesConstructor.js":{"size":844,"integrity":{"algorithm":"SHA256","hash":"826eccbe073d3e7b806cd67e4d4ae09ede6d5ae6125480705b7bf81c2486f175","blockSize":4194304,"blocks":["826eccbe073d3e7b806cd67e4d4ae09ede6d5ae6125480705b7bf81c2486f175"]},"offset":"15069114"},"StringCreate.js":{"size":1117,"integrity":{"algorithm":"SHA256","hash":"18a70a9279026ea03b811f95a797cde8caf8d77a010880506e0f0b4532a1181d","blockSize":4194304,"blocks":["18a70a9279026ea03b811f95a797cde8caf8d77a010880506e0f0b4532a1181d"]},"offset":"15069958"},"StringGetOwnProperty.js":{"size":1409,"integrity":{"algorithm":"SHA256","hash":"0eeb790e57a8488ab961d30501027d14a11daa11fdc03ddb6557766d606ef7aa","blockSize":4194304,"blocks":["0eeb790e57a8488ab961d30501027d14a11daa11fdc03ddb6557766d606ef7aa"]},"offset":"15071075"},"StringIndexOf.js":{"size":1121,"integrity":{"algorithm":"SHA256","hash":"6274088dae351dfc333956bd1f7ed66f05ddc7ec82b92cd69143bff6bc59cb2e","blockSize":4194304,"blocks":["6274088dae351dfc333956bd1f7ed66f05ddc7ec82b92cd69143bff6bc59cb2e"]},"offset":"15072484"},"StringPad.js":{"size":1263,"integrity":{"algorithm":"SHA256","hash":"dde7bd7c65aff1f92ba34d30a7b4ff101ebaffe29bba166a55db8468666d5167","blockSize":4194304,"blocks":["dde7bd7c65aff1f92ba34d30a7b4ff101ebaffe29bba166a55db8468666d5167"]},"offset":"15073605"},"StringToBigInt.js":{"size":581,"integrity":{"algorithm":"SHA256","hash":"b70e6ec493c91687edeb4059a4da64268405fba163ed262a46bfbfb4796c096c","blockSize":4194304,"blocks":["b70e6ec493c91687edeb4059a4da64268405fba163ed262a46bfbfb4796c096c"]},"offset":"15074868"},"StringToCodePoints.js":{"size":760,"integrity":{"algorithm":"SHA256","hash":"648f0c0b200da0dbd35a9631a2dc1f8143c709d3c917f77df933d0f7103aa79e","blockSize":4194304,"blocks":["648f0c0b200da0dbd35a9631a2dc1f8143c709d3c917f77df933d0f7103aa79e"]},"offset":"15075449"},"StringToNumber.js":{"size":1872,"integrity":{"algorithm":"SHA256","hash":"7ffb34161956587c224ffa0ff9ea52ba7118578439640d816ea3db2d7b81437f","blockSize":4194304,"blocks":["7ffb34161956587c224ffa0ff9ea52ba7118578439640d816ea3db2d7b81437f"]},"offset":"15076209"},"SymbolDescriptiveString.js":{"size":526,"integrity":{"algorithm":"SHA256","hash":"d5a4e603be41ed5dff7123a6a0ba29efae0812f4d076a78387520b36b416a37d","blockSize":4194304,"blocks":["d5a4e603be41ed5dff7123a6a0ba29efae0812f4d076a78387520b36b416a37d"]},"offset":"15078081"},"TestIntegrityLevel.js":{"size":1285,"integrity":{"algorithm":"SHA256","hash":"8a0161ac60421c4762bc9e442224da95614cdb3e9865bcd79ad29d2310dd35c6","blockSize":4194304,"blocks":["8a0161ac60421c4762bc9e442224da95614cdb3e9865bcd79ad29d2310dd35c6"]},"offset":"15078607"},"TimeClip.js":{"size":468,"integrity":{"algorithm":"SHA256","hash":"bf1f153b35126ac0ebd122717e6349c97e932e3665ff1947f5f4a7da4895cb48","blockSize":4194304,"blocks":["bf1f153b35126ac0ebd122717e6349c97e932e3665ff1947f5f4a7da4895cb48"]},"offset":"15079892"},"TimeFromYear.js":{"size":261,"integrity":{"algorithm":"SHA256","hash":"07bd801ef44bcc4c5458937d6b3c09b1ba6f30d24fbb06ca9b4818c0699c330b","blockSize":4194304,"blocks":["07bd801ef44bcc4c5458937d6b3c09b1ba6f30d24fbb06ca9b4818c0699c330b"]},"offset":"15080360"},"TimeString.js":{"size":808,"integrity":{"algorithm":"SHA256","hash":"92304742e99d2785a471fbb7d92daed5d1e379fdcbbc34f7fe2e8f7f624288ea","blockSize":4194304,"blocks":["92304742e99d2785a471fbb7d92daed5d1e379fdcbbc34f7fe2e8f7f624288ea"]},"offset":"15080621"},"TimeWithinDay.js":{"size":247,"integrity":{"algorithm":"SHA256","hash":"c83b563c9849ca65fb1ed7235f72f42a019fde9e67aad81d1bd0699ed28f43f8","blockSize":4194304,"blocks":["c83b563c9849ca65fb1ed7235f72f42a019fde9e67aad81d1bd0699ed28f43f8"]},"offset":"15081429"},"ToBigInt.js":{"size":631,"integrity":{"algorithm":"SHA256","hash":"a74c2afb6aa83b8f29cb2996ad29c36834e8d5f11a3d65e74c75942ed115fa45","blockSize":4194304,"blocks":["a74c2afb6aa83b8f29cb2996ad29c36834e8d5f11a3d65e74c75942ed115fa45"]},"offset":"15081676"},"ToBigInt64.js":{"size":948,"integrity":{"algorithm":"SHA256","hash":"e8a2eb194795575175e044dd78406ba726f88609a70f69dc9cfbbdd66e3c4207","blockSize":4194304,"blocks":["e8a2eb194795575175e044dd78406ba726f88609a70f69dc9cfbbdd66e3c4207"]},"offset":"15082307"},"ToBigUint64.js":{"size":703,"integrity":{"algorithm":"SHA256","hash":"33065755daa1ea7d6906e3366e65042712b6457a576ff4d8259607fa6456b081","blockSize":4194304,"blocks":["33065755daa1ea7d6906e3366e65042712b6457a576ff4d8259607fa6456b081"]},"offset":"15083255"},"ToBoolean.js":{"size":130,"integrity":{"algorithm":"SHA256","hash":"36a4823341bd4ec68dd6f4b32afbbc939330a48bf7042108c9be89eaaab5bbc6","blockSize":4194304,"blocks":["36a4823341bd4ec68dd6f4b32afbbc939330a48bf7042108c9be89eaaab5bbc6"]},"offset":"15083958"},"ToDateString.js":{"size":498,"integrity":{"algorithm":"SHA256","hash":"57a5e2f02146ccfa64217595a7b5024fd7a74d9847a5d7df98f6cdaa04335612","blockSize":4194304,"blocks":["57a5e2f02146ccfa64217595a7b5024fd7a74d9847a5d7df98f6cdaa04335612"]},"offset":"15084088"},"ToIndex.js":{"size":695,"integrity":{"algorithm":"SHA256","hash":"ed1d9b6dda1fadc03b79d7735a8bc62160d2b55fddba4fb149b04f08476d725f","blockSize":4194304,"blocks":["ed1d9b6dda1fadc03b79d7735a8bc62160d2b55fddba4fb149b04f08476d725f"]},"offset":"15084586"},"ToInt16.js":{"size":260,"integrity":{"algorithm":"SHA256","hash":"ad0dcb3339d64526564c10379cc026a2f595f9ed7642199104eb0c0ffebccc35","blockSize":4194304,"blocks":["ad0dcb3339d64526564c10379cc026a2f595f9ed7642199104eb0c0ffebccc35"]},"offset":"15085281"},"ToInt32.js":{"size":173,"integrity":{"algorithm":"SHA256","hash":"e0c77696079335a016ce39e9992f11939ad25c1b322d119eedbec24a989a50a6","blockSize":4194304,"blocks":["e0c77696079335a016ce39e9992f11939ad25c1b322d119eedbec24a989a50a6"]},"offset":"15085541"},"ToInt8.js":{"size":247,"integrity":{"algorithm":"SHA256","hash":"0f844398064a22ca49a1c263a564e15449de26b5114281211d3de3535d914336","blockSize":4194304,"blocks":["0f844398064a22ca49a1c263a564e15449de26b5114281211d3de3535d914336"]},"offset":"15085714"},"ToIntegerOrInfinity.js":{"size":542,"integrity":{"algorithm":"SHA256","hash":"cb08af4b28217f4cba255792955a6835f6500212036aee56981ec48a7a221257","blockSize":4194304,"blocks":["cb08af4b28217f4cba255792955a6835f6500212036aee56981ec48a7a221257"]},"offset":"15085961"},"ToLength.js":{"size":362,"integrity":{"algorithm":"SHA256","hash":"271aa4ed80a195f0fd8ae9e46f6f307b59b9be8d29f33fe65635ec85e2e1b6cd","blockSize":4194304,"blocks":["271aa4ed80a195f0fd8ae9e46f6f307b59b9be8d29f33fe65635ec85e2e1b6cd"]},"offset":"15086503"},"ToNumber.js":{"size":809,"integrity":{"algorithm":"SHA256","hash":"0d3e6a6d5f4c7c8e69b3f99d5084bd17f12b833af6498281cb3b71c930e1ac90","blockSize":4194304,"blocks":["0d3e6a6d5f4c7c8e69b3f99d5084bd17f12b833af6498281cb3b71c930e1ac90"]},"offset":"15086865"},"ToNumeric.js":{"size":550,"integrity":{"algorithm":"SHA256","hash":"27ca877b991e5b6ffbd658cb86b67b5d5eaa90f730455d685e09649c03f7997d","blockSize":4194304,"blocks":["27ca877b991e5b6ffbd658cb86b67b5d5eaa90f730455d685e09649c03f7997d"]},"offset":"15087674"},"ToObject.js":{"size":334,"integrity":{"algorithm":"SHA256","hash":"2c382673870deb89e3b19511d8f08fa9554d103fa9d143e5a57b79d85a093725","blockSize":4194304,"blocks":["2c382673870deb89e3b19511d8f08fa9554d103fa9d143e5a57b79d85a093725"]},"offset":"15088224"},"ToPrimitive.js":{"size":287,"integrity":{"algorithm":"SHA256","hash":"fe27d95fe99afd38d780e7d88f349e1dc1a68841b845e118abb8c80c4ab9aa53","blockSize":4194304,"blocks":["fe27d95fe99afd38d780e7d88f349e1dc1a68841b845e118abb8c80c4ab9aa53"]},"offset":"15088558"},"ToPropertyDescriptor.js":{"size":1452,"integrity":{"algorithm":"SHA256","hash":"78b5dfba0830bc47aa55c1b33f2be8fd973ff5ccc87a599abadda676d3596c49","blockSize":4194304,"blocks":["78b5dfba0830bc47aa55c1b33f2be8fd973ff5ccc87a599abadda676d3596c49"]},"offset":"15088845"},"ToPropertyKey.js":{"size":405,"integrity":{"algorithm":"SHA256","hash":"58d4355f4509a456b237e1d72169200edb1810d1efa9ee167ac26faa7904edd3","blockSize":4194304,"blocks":["58d4355f4509a456b237e1d72169200edb1810d1efa9ee167ac26faa7904edd3"]},"offset":"15090297"},"ToString.js":{"size":396,"integrity":{"algorithm":"SHA256","hash":"79c26e024582b6ac70a965063b757c70ceea15fa8da17a78ebbf77b40ccaece3","blockSize":4194304,"blocks":["79c26e024582b6ac70a965063b757c70ceea15fa8da17a78ebbf77b40ccaece3"]},"offset":"15090702"},"ToUint16.js":{"size":564,"integrity":{"algorithm":"SHA256","hash":"5775f0384586a383c5dd6c359e37d4b218c8ddf069d7a2906f7e4752ab66a20d","blockSize":4194304,"blocks":["5775f0384586a383c5dd6c359e37d4b218c8ddf069d7a2906f7e4752ab66a20d"]},"offset":"15091098"},"ToUint32.js":{"size":175,"integrity":{"algorithm":"SHA256","hash":"b68209f8fb9d1e978fe3d162251bba47f056c43ec7028cbd99b485800bd62315","blockSize":4194304,"blocks":["b68209f8fb9d1e978fe3d162251bba47f056c43ec7028cbd99b485800bd62315"]},"offset":"15091662"},"ToUint8.js":{"size":578,"integrity":{"algorithm":"SHA256","hash":"94fa392bda40d5d6c1125b662b304a372b135660d3740eebae7ade568bdd52a9","blockSize":4194304,"blocks":["94fa392bda40d5d6c1125b662b304a372b135660d3740eebae7ade568bdd52a9"]},"offset":"15091837"},"ToUint8Clamp.js":{"size":522,"integrity":{"algorithm":"SHA256","hash":"30dd3065a73ef4ff1f0a018ce80bd550673e5ee29c732e6fc8cade4661f80d56","blockSize":4194304,"blocks":["30dd3065a73ef4ff1f0a018ce80bd550673e5ee29c732e6fc8cade4661f80d56"]},"offset":"15092415"},"ToZeroPaddedDecimalString.js":{"size":586,"integrity":{"algorithm":"SHA256","hash":"977f656eb0574721f8183974f79df916bc8b621234ab800fa2ae1b3a62353b5b","blockSize":4194304,"blocks":["977f656eb0574721f8183974f79df916bc8b621234ab800fa2ae1b3a62353b5b"]},"offset":"15092937"},"TrimString.js":{"size":804,"integrity":{"algorithm":"SHA256","hash":"497ddda1a6981ecb64a4c5ea120100f61569ad519055b30741ad77d0aae3d458","blockSize":4194304,"blocks":["497ddda1a6981ecb64a4c5ea120100f61569ad519055b30741ad77d0aae3d458"]},"offset":"15093523"},"Type.js":{"size":297,"integrity":{"algorithm":"SHA256","hash":"bc73cb870d9593233f65bd1384e359bef23c86fc178ad9b655b03bfc93a9ccf4","blockSize":4194304,"blocks":["bc73cb870d9593233f65bd1384e359bef23c86fc178ad9b655b03bfc93a9ccf4"]},"offset":"15094327"},"UTF16EncodeCodePoint.js":{"size":713,"integrity":{"algorithm":"SHA256","hash":"19c0fec3bb1f8c3167112bdcfcc3257c20a3b17b67e86a33a78260c6c81090e0","blockSize":4194304,"blocks":["19c0fec3bb1f8c3167112bdcfcc3257c20a3b17b67e86a33a78260c6c81090e0"]},"offset":"15094624"},"UTF16SurrogatePairToCodePoint.js":{"size":770,"integrity":{"algorithm":"SHA256","hash":"fa80c034e02e99557889d455e56163779ac08c814988a118c632dccce95dd90c","blockSize":4194304,"blocks":["fa80c034e02e99557889d455e56163779ac08c814988a118c632dccce95dd90c"]},"offset":"15095337"},"UnicodeEscape.js":{"size":839,"integrity":{"algorithm":"SHA256","hash":"8080d2e44eba21ab06abd3b7d03dd18fe93033737ace10a1d963222335960413","blockSize":4194304,"blocks":["8080d2e44eba21ab06abd3b7d03dd18fe93033737ace10a1d963222335960413"]},"offset":"15096107"},"ValidateAndApplyPropertyDescriptor.js":{"size":5961,"integrity":{"algorithm":"SHA256","hash":"4b077023aefc2de0d6b34caa469d9e16428b7336b1be56b180ff4fe0d5cd90f6","blockSize":4194304,"blocks":["4b077023aefc2de0d6b34caa469d9e16428b7336b1be56b180ff4fe0d5cd90f6"]},"offset":"15096946"},"WeakRefDeref.js":{"size":625,"integrity":{"algorithm":"SHA256","hash":"ca4ef9ab50a2119c7981348bc2229beb22553d340c0e04d23c6b15260d5991d7","blockSize":4194304,"blocks":["ca4ef9ab50a2119c7981348bc2229beb22553d340c0e04d23c6b15260d5991d7"]},"offset":"15102907"},"WeekDay.js":{"size":208,"integrity":{"algorithm":"SHA256","hash":"f7cc798c72dcc484295681d29d535e64215a9ec303f4f6e6456ea63e83ce0246","blockSize":4194304,"blocks":["f7cc798c72dcc484295681d29d535e64215a9ec303f4f6e6456ea63e83ce0246"]},"offset":"15103532"},"YearFromTime.js":{"size":407,"integrity":{"algorithm":"SHA256","hash":"5562b7fd6be438187a1187a331f0d310e631e9747df14521accc7a797e2a2aa7","blockSize":4194304,"blocks":["5562b7fd6be438187a1187a331f0d310e631e9747df14521accc7a797e2a2aa7"]},"offset":"15103740"},"abs.js":{"size":207,"integrity":{"algorithm":"SHA256","hash":"a50e248c29238747c3c278a4edf2c0643f1295d1c065d9dff8524def17f0427f","blockSize":4194304,"blocks":["a50e248c29238747c3c278a4edf2c0643f1295d1c065d9dff8524def17f0427f"]},"offset":"15104147"},"clamp.js":{"size":576,"integrity":{"algorithm":"SHA256","hash":"70e43374dfd7bd06023f7e19c1c9847c0a0d6a2c609896aabcabf860785ff738","blockSize":4194304,"blocks":["70e43374dfd7bd06023f7e19c1c9847c0a0d6a2c609896aabcabf860785ff738"]},"offset":"15104354"},"floor.js":{"size":217,"integrity":{"algorithm":"SHA256","hash":"90c20830ae8762224c83fb0ed36a288a7d567f57d3b5acb469590cc2d5e13f55","blockSize":4194304,"blocks":["90c20830ae8762224c83fb0ed36a288a7d567f57d3b5acb469590cc2d5e13f55"]},"offset":"15104930"},"modulo.js":{"size":168,"integrity":{"algorithm":"SHA256","hash":"84923b64427edcc840ee9a305dca213f4bf1e04ed8f88f6bfd7bfa9e655d7c98","blockSize":4194304,"blocks":["84923b64427edcc840ee9a305dca213f4bf1e04ed8f88f6bfd7bfa9e655d7c98"]},"offset":"15105147"},"msFromTime.js":{"size":253,"integrity":{"algorithm":"SHA256","hash":"ef13a7e7721d695f125a7e772f8037ed34aa3c97aaa3692da900c6796cd270da","blockSize":4194304,"blocks":["ef13a7e7721d695f125a7e772f8037ed34aa3c97aaa3692da900c6796cd270da"]},"offset":"15105315"},"substring.js":{"size":740,"integrity":{"algorithm":"SHA256","hash":"283a578321715346627c61d75abf7cccb87898aeee94c714e70eaad8c6db76bb","blockSize":4194304,"blocks":["283a578321715346627c61d75abf7cccb87898aeee94c714e70eaad8c6db76bb"]},"offset":"15105568"},"thisBigIntValue.js":{"size":551,"integrity":{"algorithm":"SHA256","hash":"5fec6c678aa3d69d9861a2ccd5e7a5e093db79a1a208cd68bd0534b7dcec60f9","blockSize":4194304,"blocks":["5fec6c678aa3d69d9861a2ccd5e7a5e093db79a1a208cd68bd0534b7dcec60f9"]},"offset":"15106308"},"thisBooleanValue.js":{"size":367,"integrity":{"algorithm":"SHA256","hash":"171bd884e07701d9e37bece81b05a95fd7d822ff7eaaba5c112d6e3a352ad498","blockSize":4194304,"blocks":["171bd884e07701d9e37bece81b05a95fd7d822ff7eaaba5c112d6e3a352ad498"]},"offset":"15106859"},"thisNumberValue.js":{"size":390,"integrity":{"algorithm":"SHA256","hash":"a3bb9eb733e74de8a50f49e4425e57fd01bebbf66df4f9967da3d9edee589455","blockSize":4194304,"blocks":["a3bb9eb733e74de8a50f49e4425e57fd01bebbf66df4f9967da3d9edee589455"]},"offset":"15107226"},"thisStringValue.js":{"size":361,"integrity":{"algorithm":"SHA256","hash":"47305af763f963ab1c547011b6be408827678d61540009de579bf996d0810ff5","blockSize":4194304,"blocks":["47305af763f963ab1c547011b6be408827678d61540009de579bf996d0810ff5"]},"offset":"15107616"},"thisSymbolValue.js":{"size":514,"integrity":{"algorithm":"SHA256","hash":"27b446ef7c0dcc60f576357f187bb9af1a86d6557ab82a144d2390e793dc94db","blockSize":4194304,"blocks":["27b446ef7c0dcc60f576357f187bb9af1a86d6557ab82a144d2390e793dc94db"]},"offset":"15107977"},"thisTimeValue.js":{"size":66,"integrity":{"algorithm":"SHA256","hash":"e4edc25cb1edf0faea5b4a9c844ce72636b702a033b075ee0f7ffbedc14e442a","blockSize":4194304,"blocks":["e4edc25cb1edf0faea5b4a9c844ce72636b702a033b075ee0f7ffbedc14e442a"]},"offset":"15108491"},"Number":{"files":{"add.js":{"size":875,"integrity":{"algorithm":"SHA256","hash":"47a1b1cf321ae7b7a1b930de9144e65d81c40c31a0058a3aa7a23b59ff90537f","blockSize":4194304,"blocks":["47a1b1cf321ae7b7a1b930de9144e65d81c40c31a0058a3aa7a23b59ff90537f"]},"offset":"15108557"},"bitwiseAND.js":{"size":503,"integrity":{"algorithm":"SHA256","hash":"bb6bbbd3e4a97dd371148c9871393bd846ba4e42086e1115e5b87bc3ae75797f","blockSize":4194304,"blocks":["bb6bbbd3e4a97dd371148c9871393bd846ba4e42086e1115e5b87bc3ae75797f"]},"offset":"15109432"},"bitwiseNOT.js":{"size":578,"integrity":{"algorithm":"SHA256","hash":"40ac9295ed27001ba228b4b9eac45bbced235f121989a7f320128dcf32199c2e","blockSize":4194304,"blocks":["40ac9295ed27001ba228b4b9eac45bbced235f121989a7f320128dcf32199c2e"]},"offset":"15109935"},"bitwiseOR.js":{"size":501,"integrity":{"algorithm":"SHA256","hash":"8cb3f9e18fd1e61a9c2839e5a80471ee1c26e0e08283d5c42245cfb6b5e12007","blockSize":4194304,"blocks":["8cb3f9e18fd1e61a9c2839e5a80471ee1c26e0e08283d5c42245cfb6b5e12007"]},"offset":"15110513"},"bitwiseXOR.js":{"size":503,"integrity":{"algorithm":"SHA256","hash":"39fc03cc383e0c4b5d7cb7046da98cc9da9e7452a112fde02cccca096ad7573c","blockSize":4194304,"blocks":["39fc03cc383e0c4b5d7cb7046da98cc9da9e7452a112fde02cccca096ad7573c"]},"offset":"15111014"},"divide.js":{"size":638,"integrity":{"algorithm":"SHA256","hash":"275664feaad88de432888432d00e07d412173d40eca1ebc0dc11c2a9ab08ee9c","blockSize":4194304,"blocks":["275664feaad88de432888432d00e07d412173d40eca1ebc0dc11c2a9ab08ee9c"]},"offset":"15111517"},"equal.js":{"size":556,"integrity":{"algorithm":"SHA256","hash":"26bf0a7b691fc9541b9d5c2e59ffb9e47480029ae5872b4463da733bd79ffc86","blockSize":4194304,"blocks":["26bf0a7b691fc9541b9d5c2e59ffb9e47480029ae5872b4463da733bd79ffc86"]},"offset":"15112155"},"exponentiate.js":{"size":1780,"integrity":{"algorithm":"SHA256","hash":"ade7c349d8d69d43e975ac9fa47326e6b40125e480eedbef20e6151e76d3d37b","blockSize":4194304,"blocks":["ade7c349d8d69d43e975ac9fa47326e6b40125e480eedbef20e6151e76d3d37b"]},"offset":"15112711"},"index.js":{"size":1274,"integrity":{"algorithm":"SHA256","hash":"00f330b5363f68d5bdb0f15ad7adef0002730eaa4ac2de69af6b34f624585f21","blockSize":4194304,"blocks":["00f330b5363f68d5bdb0f15ad7adef0002730eaa4ac2de69af6b34f624585f21"]},"offset":"15114491"},"leftShift.js":{"size":639,"integrity":{"algorithm":"SHA256","hash":"7bbfff6cf1c14f12dd8ae2f69096bad246460187cecfc967a452eda538618909","blockSize":4194304,"blocks":["7bbfff6cf1c14f12dd8ae2f69096bad246460187cecfc967a452eda538618909"]},"offset":"15115765"},"lessThan.js":{"size":642,"integrity":{"algorithm":"SHA256","hash":"a076216bc2e2bbfb83a35db95fea5fa34a759ad27dc8691996e7109e991bfa7d","blockSize":4194304,"blocks":["a076216bc2e2bbfb83a35db95fea5fa34a759ad27dc8691996e7109e991bfa7d"]},"offset":"15116404"},"multiply.js":{"size":848,"integrity":{"algorithm":"SHA256","hash":"9c70611502810d74b71a7087cda1badbd7e62bed63b93eff8e529eaecc48ad05","blockSize":4194304,"blocks":["9c70611502810d74b71a7087cda1badbd7e62bed63b93eff8e529eaecc48ad05"]},"offset":"15117046"},"remainder.js":{"size":1027,"integrity":{"algorithm":"SHA256","hash":"1a75e0c19112e3f260302af3fdca201767a89dbf170c459f32134a750d698eab","blockSize":4194304,"blocks":["1a75e0c19112e3f260302af3fdca201767a89dbf170c459f32134a750d698eab"]},"offset":"15117894"},"sameValue.js":{"size":632,"integrity":{"algorithm":"SHA256","hash":"397208a584900e79ba3bb5b90317119e9116ccf6e84ba64f02c88d15d7813fa0","blockSize":4194304,"blocks":["397208a584900e79ba3bb5b90317119e9116ccf6e84ba64f02c88d15d7813fa0"]},"offset":"15118921"},"sameValueZero.js":{"size":575,"integrity":{"algorithm":"SHA256","hash":"6a3d4872356b651b03d296d09d3692b9116100da0b330302b0f812a47dcd54dc","blockSize":4194304,"blocks":["6a3d4872356b651b03d296d09d3692b9116100da0b330302b0f812a47dcd54dc"]},"offset":"15119553"},"signedRightShift.js":{"size":653,"integrity":{"algorithm":"SHA256","hash":"d2c07c5c7d3f57116b19569c6ea28a0090153438c168d56eac8ac33a01e41724","blockSize":4194304,"blocks":["d2c07c5c7d3f57116b19569c6ea28a0090153438c168d56eac8ac33a01e41724"]},"offset":"15120128"},"subtract.js":{"size":536,"integrity":{"algorithm":"SHA256","hash":"536024e9adacad8774c865c8de2449275c99ef6f0db44c372a8a645b9117c2dd","blockSize":4194304,"blocks":["536024e9adacad8774c865c8de2449275c99ef6f0db44c372a8a645b9117c2dd"]},"offset":"15120781"},"toString.js":{"size":427,"integrity":{"algorithm":"SHA256","hash":"0c8d3e2501cabc643dd5d94ac992812e94353be181a66078808a396f8b6b7921","blockSize":4194304,"blocks":["0c8d3e2501cabc643dd5d94ac992812e94353be181a66078808a396f8b6b7921"]},"offset":"15121317"},"unaryMinus.js":{"size":470,"integrity":{"algorithm":"SHA256","hash":"59e344d056276d927fd9e54d42ab5e18e757585c247b11af8dc1d7e426a399c2","blockSize":4194304,"blocks":["59e344d056276d927fd9e54d42ab5e18e757585c247b11af8dc1d7e426a399c2"]},"offset":"15121744"},"unsignedRightShift.js":{"size":658,"integrity":{"algorithm":"SHA256","hash":"7c19f44f65c837d23df00ec54d05ee2b5f874f4cd37daa4d647fa426f9e94ea0","blockSize":4194304,"blocks":["7c19f44f65c837d23df00ec54d05ee2b5f874f4cd37daa4d647fa426f9e94ea0"]},"offset":"15122214"}}},"BigInt":{"files":{"add.js":{"size":459,"integrity":{"algorithm":"SHA256","hash":"d55ebd3a472b86f1db4d5eb8cc684e367820371e6cddb207688f8122b3f237f5","blockSize":4194304,"blocks":["d55ebd3a472b86f1db4d5eb8cc684e367820371e6cddb207688f8122b3f237f5"]},"offset":"15122872"},"bitwiseAND.js":{"size":503,"integrity":{"algorithm":"SHA256","hash":"86f26a63dcd4663d5fd7b820775b47a509665e157b5799074cbf38d12fee91b4","blockSize":4194304,"blocks":["86f26a63dcd4663d5fd7b820775b47a509665e157b5799074cbf38d12fee91b4"]},"offset":"15123331"},"bitwiseNOT.js":{"size":450,"integrity":{"algorithm":"SHA256","hash":"23dc36c4b12eeef514fffff7a2b1e8ca67266c196b822f7fe4ae7dd5b1a7e294","blockSize":4194304,"blocks":["23dc36c4b12eeef514fffff7a2b1e8ca67266c196b822f7fe4ae7dd5b1a7e294"]},"offset":"15123834"},"bitwiseOR.js":{"size":501,"integrity":{"algorithm":"SHA256","hash":"95138fb96a65244d6271b4e0faf02020d6c8660c80e7b5c6ade8399cc7798f68","blockSize":4194304,"blocks":["95138fb96a65244d6271b4e0faf02020d6c8660c80e7b5c6ade8399cc7798f68"]},"offset":"15124284"},"bitwiseXOR.js":{"size":503,"integrity":{"algorithm":"SHA256","hash":"9fdd0d05db13029c45453cc521279d497352f74cfb3f50c93a3f8c32b6af774c","blockSize":4194304,"blocks":["9fdd0d05db13029c45453cc521279d497352f74cfb3f50c93a3f8c32b6af774c"]},"offset":"15124785"},"divide.js":{"size":631,"integrity":{"algorithm":"SHA256","hash":"9fb2dc83404b068c916c9f8fbb503d96a3db1bf47081e15543ee2ef16077edc3","blockSize":4194304,"blocks":["9fb2dc83404b068c916c9f8fbb503d96a3db1bf47081e15543ee2ef16077edc3"]},"offset":"15125288"},"equal.js":{"size":464,"integrity":{"algorithm":"SHA256","hash":"63c672cb74f047e1ceeed875f3854bfc4b830615244b66dd3008eec0c8894bdf","blockSize":4194304,"blocks":["63c672cb74f047e1ceeed875f3854bfc4b830615244b66dd3008eec0c8894bdf"]},"offset":"15125919"},"exponentiate.js":{"size":887,"integrity":{"algorithm":"SHA256","hash":"cda6fd636de63bbd6f1341aa870543d3984655dcb499ca601258740019ee6180","blockSize":4194304,"blocks":["cda6fd636de63bbd6f1341aa870543d3984655dcb499ca601258740019ee6180"]},"offset":"15126383"},"index.js":{"size":1274,"integrity":{"algorithm":"SHA256","hash":"00f330b5363f68d5bdb0f15ad7adef0002730eaa4ac2de69af6b34f624585f21","blockSize":4194304,"blocks":["00f330b5363f68d5bdb0f15ad7adef0002730eaa4ac2de69af6b34f624585f21"]},"offset":"15127270"},"leftShift.js":{"size":472,"integrity":{"algorithm":"SHA256","hash":"7960fc0f19a25dc570d50eeb3987c52bfab0c427fe4ce7caf878d1948c6545a5","blockSize":4194304,"blocks":["7960fc0f19a25dc570d50eeb3987c52bfab0c427fe4ce7caf878d1948c6545a5"]},"offset":"15128544"},"lessThan.js":{"size":469,"integrity":{"algorithm":"SHA256","hash":"2a409f36dfec778087b65dbb7e3bde4af1242faf445c1188e293bf5e81625ac7","blockSize":4194304,"blocks":["2a409f36dfec778087b65dbb7e3bde4af1242faf445c1188e293bf5e81625ac7"]},"offset":"15129016"},"multiply.js":{"size":469,"integrity":{"algorithm":"SHA256","hash":"2c98615507b3d321486186eb7e31ff256c56cf1defd591ebd687f88617f8b1f8","blockSize":4194304,"blocks":["2c98615507b3d321486186eb7e31ff256c56cf1defd591ebd687f88617f8b1f8"]},"offset":"15129485"},"remainder.js":{"size":706,"integrity":{"algorithm":"SHA256","hash":"5376f57802b67b74f2f0c2649e30c8f12a4ffb2930ff1fda6d8e977d1ecf4339","blockSize":4194304,"blocks":["5376f57802b67b74f2f0c2649e30c8f12a4ffb2930ff1fda6d8e977d1ecf4339"]},"offset":"15129954"},"sameValue.js":{"size":478,"integrity":{"algorithm":"SHA256","hash":"3298de79d5f2445230c0ada00aad7aaf397f9cedbafca4e883eb14ed728969a9","blockSize":4194304,"blocks":["3298de79d5f2445230c0ada00aad7aaf397f9cedbafca4e883eb14ed728969a9"]},"offset":"15130660"},"sameValueZero.js":{"size":486,"integrity":{"algorithm":"SHA256","hash":"ca2826c7fad717651658a2b4c1e5c1ac6ea8c2ec672e07a9b776ae94cbfb5072","blockSize":4194304,"blocks":["ca2826c7fad717651658a2b4c1e5c1ac6ea8c2ec672e07a9b776ae94cbfb5072"]},"offset":"15131138"},"signedRightShift.js":{"size":505,"integrity":{"algorithm":"SHA256","hash":"c2e81957b638d1b70a7a2b7da8862c7d1209cea6504b0bcdaa2cd48fbd5f91da","blockSize":4194304,"blocks":["c2e81957b638d1b70a7a2b7da8862c7d1209cea6504b0bcdaa2cd48fbd5f91da"]},"offset":"15131624"},"subtract.js":{"size":469,"integrity":{"algorithm":"SHA256","hash":"4e53c777ed8780ad5389ab7a5e702092dfc5c7a5fbf572a85990d3c9d4a6f7dd","blockSize":4194304,"blocks":["4e53c777ed8780ad5389ab7a5e702092dfc5c7a5fbf572a85990d3c9d4a6f7dd"]},"offset":"15132129"},"toString.js":{"size":427,"integrity":{"algorithm":"SHA256","hash":"b3b5235fd84cd1f64a6c4f580a44a5aab99a0ca72be9446fc457299beea6fac0","blockSize":4194304,"blocks":["b3b5235fd84cd1f64a6c4f580a44a5aab99a0ca72be9446fc457299beea6fac0"]},"offset":"15132598"},"unaryMinus.js":{"size":511,"integrity":{"algorithm":"SHA256","hash":"daaf42db7cafafe67bc4bd73931f958393a1a0cdfbb259390e59e883928d7258","blockSize":4194304,"blocks":["daaf42db7cafafe67bc4bd73931f958393a1a0cdfbb259390e59e883928d7258"]},"offset":"15133025"},"unsignedRightShift.js":{"size":510,"integrity":{"algorithm":"SHA256","hash":"593eccf481aec7fc53840d274d75aa3827c9f08107a60c579c2953e0ed0ab846","blockSize":4194304,"blocks":["593eccf481aec7fc53840d274d75aa3827c9f08107a60c579c2953e0ed0ab846"]},"offset":"15133536"}}}}},".editorconfig":{"size":312,"integrity":{"algorithm":"SHA256","hash":"39b819cc6bff2c7dee98d7950b3c74cf534817740ab4f13fda90a067f8fee491","blockSize":4194304,"blocks":["39b819cc6bff2c7dee98d7950b3c74cf534817740ab4f13fda90a067f8fee491"]},"offset":"14572042"},".nycrc":{"size":155,"integrity":{"algorithm":"SHA256","hash":"3616a58a5c2515ce8f1881e38c389e8aff76d156fb7faf6402a305944cd4a2aa","blockSize":4194304,"blocks":["3616a58a5c2515ce8f1881e38c389e8aff76d156fb7faf6402a305944cd4a2aa"]},"offset":"14572354"},"GetIntrinsic.js":{"size":89,"integrity":{"algorithm":"SHA256","hash":"4013aaceef3399f1013ddda849c9c943950bd034806af80164d8fe4ef5255186","blockSize":4194304,"blocks":["4013aaceef3399f1013ddda849c9c943950bd034806af80164d8fe4ef5255186"]},"offset":"14572509"},"LICENSE":{"size":1081,"integrity":{"algorithm":"SHA256","hash":"210549bd75abec340599f291e5ecd95b9acd0d8a713543838ab42f6f462b16bc","blockSize":4194304,"blocks":["210549bd75abec340599f291e5ecd95b9acd0d8a713543838ab42f6f462b16bc"]},"offset":"14572598"},"es2015.js":{"size":6173,"integrity":{"algorithm":"SHA256","hash":"25a32bcacc5ba0510be789be21e9b1ba0abaaf1463f8347fdded0389473b4354","blockSize":4194304,"blocks":["25a32bcacc5ba0510be789be21e9b1ba0abaaf1463f8347fdded0389473b4354"]},"offset":"14573679"},"es2016.js":{"size":6455,"integrity":{"algorithm":"SHA256","hash":"ffdd017d186e8efe499a0c49bc2399b20475b1855742d1bf5c08ce2cf128a3dc","blockSize":4194304,"blocks":["ffdd017d186e8efe499a0c49bc2399b20475b1855742d1bf5c08ce2cf128a3dc"]},"offset":"14579852"},"es2017.js":{"size":6677,"integrity":{"algorithm":"SHA256","hash":"73931f986a688048f6eae14e489569ccb9cc2c86fcfb305c1f1b31cb4d33cf74","blockSize":4194304,"blocks":["73931f986a688048f6eae14e489569ccb9cc2c86fcfb305c1f1b31cb4d33cf74"]},"offset":"14586307"},"es2018.js":{"size":7077,"integrity":{"algorithm":"SHA256","hash":"6eb79162bf775b991a56d3af00bf49c868ed9d0d61f117c2b28007dc10250f47","blockSize":4194304,"blocks":["6eb79162bf775b991a56d3af00bf49c868ed9d0d61f117c2b28007dc10250f47"]},"offset":"14592984"},"es2019.js":{"size":7243,"integrity":{"algorithm":"SHA256","hash":"e3d4e6be5ae8e35ccfaa9acc894194bd732780d953392683d426e6926241e189","blockSize":4194304,"blocks":["e3d4e6be5ae8e35ccfaa9acc894194bd732780d953392683d426e6926241e189"]},"offset":"14600061"},"es2020.js":{"size":8471,"integrity":{"algorithm":"SHA256","hash":"bacadf4ed9edd9c7f2b815cd7bcd74858876c04657e73e2e4d941c0d1b2883a2","blockSize":4194304,"blocks":["bacadf4ed9edd9c7f2b815cd7bcd74858876c04657e73e2e4d941c0d1b2883a2"]},"offset":"14607304"},"es2021.js":{"size":9065,"integrity":{"algorithm":"SHA256","hash":"ec75d6df6aa8e3f4118122eb67e9adf7964d9bf0b6043cbecb3e4cf2679e3f8a","blockSize":4194304,"blocks":["ec75d6df6aa8e3f4118122eb67e9adf7964d9bf0b6043cbecb3e4cf2679e3f8a"]},"offset":"14615775"},"es2022.js":{"size":9641,"integrity":{"algorithm":"SHA256","hash":"ea5707edf3dcdfcea5bec1f1a9fd4279de99b23eba3692cb00f6c5d54c8b1e9e","blockSize":4194304,"blocks":["ea5707edf3dcdfcea5bec1f1a9fd4279de99b23eba3692cb00f6c5d54c8b1e9e"]},"offset":"14624840"},"es5.js":{"size":2027,"integrity":{"algorithm":"SHA256","hash":"c5fac3d65e23dc9b5c3d9aef26469f3b0436c7245cf2753ce64992fc9c0bdcd4","blockSize":4194304,"blocks":["c5fac3d65e23dc9b5c3d9aef26469f3b0436c7245cf2753ce64992fc9c0bdcd4"]},"offset":"14634481"},"es6.js":{"size":53,"integrity":{"algorithm":"SHA256","hash":"32a234b9c21e8c567388a546965b71a8a07b3419dabe9406514b7630f6440a08","blockSize":4194304,"blocks":["32a234b9c21e8c567388a546965b71a8a07b3419dabe9406514b7630f6440a08"]},"offset":"14636508"},"es7.js":{"size":53,"integrity":{"algorithm":"SHA256","hash":"47ac651b68b57b50794704d4dcd33e06eaa518326df90c138c7010264fb73e46","blockSize":4194304,"blocks":["47ac651b68b57b50794704d4dcd33e06eaa518326df90c138c7010264fb73e46"]},"offset":"14636561"},"index.js":{"size":682,"integrity":{"algorithm":"SHA256","hash":"7a92ac00dc6f160b0e5285033249ff128988be9c73b0e8937cd1d13da0805cc1","blockSize":4194304,"blocks":["7a92ac00dc6f160b0e5285033249ff128988be9c73b0e8937cd1d13da0805cc1"]},"offset":"14636614"},"package.json":{"size":2788,"integrity":{"algorithm":"SHA256","hash":"b090d3c228ace080143d9472f6c4d0a2ec9a66f08499c9021bbe8a841979a932","blockSize":4194304,"blocks":["b090d3c228ace080143d9472f6c4d0a2ec9a66f08499c9021bbe8a841979a932"]},"offset":"14637296"},"operations":{"files":{"2015.js":{"size":23915,"integrity":{"algorithm":"SHA256","hash":"2ac77c3d88b2b8478cd24721968e3ad87254fd9fba6423f9251734b13f056343","blockSize":4194304,"blocks":["2ac77c3d88b2b8478cd24721968e3ad87254fd9fba6423f9251734b13f056343"]},"offset":"14640084"},"2016.js":{"size":26759,"integrity":{"algorithm":"SHA256","hash":"2638d9bf65060da8e5ce9660fa8b8ce2f70a644c5acae712d5cb0fb7da08e784","blockSize":4194304,"blocks":["2638d9bf65060da8e5ce9660fa8b8ce2f70a644c5acae712d5cb0fb7da08e784"]},"offset":"14663999"},"2017.js":{"size":31232,"integrity":{"algorithm":"SHA256","hash":"7cac5621348fab087a78b8db5c4ba92eba9848086cbc493255213d1e4892a03e","blockSize":4194304,"blocks":["7cac5621348fab087a78b8db5c4ba92eba9848086cbc493255213d1e4892a03e"]},"offset":"14690758"},"2018.js":{"size":33824,"integrity":{"algorithm":"SHA256","hash":"19c84bfeafe3f01706d77366fd5d4a4ee7e24d3d006d1e68ad28d5ec2bb19ed6","blockSize":4194304,"blocks":["19c84bfeafe3f01706d77366fd5d4a4ee7e24d3d006d1e68ad28d5ec2bb19ed6"]},"offset":"14721990"},"2019.js":{"size":34723,"integrity":{"algorithm":"SHA256","hash":"5d0feeea7c41e20fa06fa658e04037f552bce9a61d6cca5d9e595168c55ca1b2","blockSize":4194304,"blocks":["5d0feeea7c41e20fa06fa658e04037f552bce9a61d6cca5d9e595168c55ca1b2"]},"offset":"14755814"},"2020.js":{"size":41557,"integrity":{"algorithm":"SHA256","hash":"6c4b676cc591fba932461f2a35df9742735a137f47ea493aa27abfcb9433d66e","blockSize":4194304,"blocks":["6c4b676cc591fba932461f2a35df9742735a137f47ea493aa27abfcb9433d66e"]},"offset":"14790537"},"2021.js":{"size":43909,"integrity":{"algorithm":"SHA256","hash":"46179b6ce0d7a37da0cbe574b2a9c4732e74a4e91fd025ccbe2db4e753dc149d","blockSize":4194304,"blocks":["46179b6ce0d7a37da0cbe574b2a9c4732e74a4e91fd025ccbe2db4e753dc149d"]},"offset":"14832094"},"2022.js":{"size":46962,"integrity":{"algorithm":"SHA256","hash":"bc241e459e70715f125b5ea0cddc81fafe1d6ff155050ae588f6cbd81facc7a9","blockSize":4194304,"blocks":["bc241e459e70715f125b5ea0cddc81fafe1d6ff155050ae588f6cbd81facc7a9"]},"offset":"14876003"}}},"helpers":{"files":{"DefineOwnProperty.js":{"size":1591,"integrity":{"algorithm":"SHA256","hash":"13d6bc0bb4e11c638962dace9dea09d82c16b8a63016e967fc56f5be435fe902","blockSize":4194304,"blocks":["13d6bc0bb4e11c638962dace9dea09d82c16b8a63016e967fc56f5be435fe902"]},"offset":"14922965"},"IsArray.js":{"size":349,"integrity":{"algorithm":"SHA256","hash":"9c59d2836448a248a053b5684beb675a1c0b53d890e4f09a7642540c4ba05cbe","blockSize":4194304,"blocks":["9c59d2836448a248a053b5684beb675a1c0b53d890e4f09a7642540c4ba05cbe"]},"offset":"14924556"},"OwnPropertyKeys.js":{"size":706,"integrity":{"algorithm":"SHA256","hash":"542620dc5d01414c591f49c3f5832956eac8dbcf0f15c604bcd81ffee76dce9c","blockSize":4194304,"blocks":["542620dc5d01414c591f49c3f5832956eac8dbcf0f15c604bcd81ffee76dce9c"]},"offset":"14924905"},"assertRecord.js":{"size":1392,"integrity":{"algorithm":"SHA256","hash":"020a196fbfb268bec4c7b97c7819254d6ee25f53b9cf0ae70d4f956b382d8a06","blockSize":4194304,"blocks":["020a196fbfb268bec4c7b97c7819254d6ee25f53b9cf0ae70d4f956b382d8a06"]},"offset":"14925611"},"assign.js":{"size":449,"integrity":{"algorithm":"SHA256","hash":"ce4630cbe65b5d89acfbcaf794812ceb1f222afb9f6af8c13bfbf6fcc01e0c36","blockSize":4194304,"blocks":["ce4630cbe65b5d89acfbcaf794812ceb1f222afb9f6af8c13bfbf6fcc01e0c36"]},"offset":"14927003"},"callBind.js":{"size":85,"integrity":{"algorithm":"SHA256","hash":"5de5b5161e7048c7025b06b67687a81624166c78a577c664a2295fe4bd1a47d3","blockSize":4194304,"blocks":["5de5b5161e7048c7025b06b67687a81624166c78a577c664a2295fe4bd1a47d3"]},"offset":"14927452"},"callBound.js":{"size":95,"integrity":{"algorithm":"SHA256","hash":"b2c5b91efc106b8c561c98fe00393c71c27e8e04decc83534c784084eec3891d","blockSize":4194304,"blocks":["b2c5b91efc106b8c561c98fe00393c71c27e8e04decc83534c784084eec3891d"]},"offset":"14927537"},"every.js":{"size":193,"integrity":{"algorithm":"SHA256","hash":"569e4d5e3f0291b1a5307b60c74ff478bd8e280886fd839fc6bac90bae793e5e","blockSize":4194304,"blocks":["569e4d5e3f0291b1a5307b60c74ff478bd8e280886fd839fc6bac90bae793e5e"]},"offset":"14927632"},"forEach.js":{"size":190,"integrity":{"algorithm":"SHA256","hash":"3857a33a84b229769a68b64648a3e6c5d04bc7c10a43398247a5f71834024817","blockSize":4194304,"blocks":["3857a33a84b229769a68b64648a3e6c5d04bc7c10a43398247a5f71834024817"]},"offset":"14927825"},"fromPropertyDescriptor.js":{"size":580,"integrity":{"algorithm":"SHA256","hash":"fb8de8ca91b31db7ef9bf186da7dee0e27b62f69217349d59595ff02a8454446","blockSize":4194304,"blocks":["fb8de8ca91b31db7ef9bf186da7dee0e27b62f69217349d59595ff02a8454446"]},"offset":"14928015"},"getInferredName.js":{"size":113,"integrity":{"algorithm":"SHA256","hash":"17eb27e186589ec74d77934f6b0a07a97ce9bb6f6201a51a34f77af8922a2826","blockSize":4194304,"blocks":["17eb27e186589ec74d77934f6b0a07a97ce9bb6f6201a51a34f77af8922a2826"]},"offset":"14928595"},"getIteratorMethod.js":{"size":1170,"integrity":{"algorithm":"SHA256","hash":"b790969f89050c1b7d5f94b37b5996cd174a583ae6690b1976f0f67563054a30","blockSize":4194304,"blocks":["b790969f89050c1b7d5f94b37b5996cd174a583ae6690b1976f0f67563054a30"]},"offset":"14928708"},"getOwnPropertyDescriptor.js":{"size":262,"integrity":{"algorithm":"SHA256","hash":"59528b9deed68f83216d719d496708d31906ec794eb6c9062cc29070c1831c55","blockSize":4194304,"blocks":["59528b9deed68f83216d719d496708d31906ec794eb6c9062cc29070c1831c55"]},"offset":"14929878"},"getProto.js":{"size":382,"integrity":{"algorithm":"SHA256","hash":"4c2f155839472a222b9442c97036325072ffb2e20833bbae5115df6542032c1d","blockSize":4194304,"blocks":["4c2f155839472a222b9442c97036325072ffb2e20833bbae5115df6542032c1d"]},"offset":"14930140"},"getSymbolDescription.js":{"size":97,"integrity":{"algorithm":"SHA256","hash":"56975893e0ed0717d041a4129a31f62beba90bb1b25e8a2609b054538bd33755","blockSize":4194304,"blocks":["56975893e0ed0717d041a4129a31f62beba90bb1b25e8a2609b054538bd33755"]},"offset":"14930522"},"isAbstractClosure.js":{"size":244,"integrity":{"algorithm":"SHA256","hash":"9f2f1e3c0b09f80f62ca318e6a1e65391125a2a9aa95ac3eb78455863717647d","blockSize":4194304,"blocks":["9f2f1e3c0b09f80f62ca318e6a1e65391125a2a9aa95ac3eb78455863717647d"]},"offset":"14930619"},"isByteValue.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"be4b5177551e1a3d92d838f173bf1f36274ff08865c61db8d8b8d48b97ade9d6","blockSize":4194304,"blocks":["be4b5177551e1a3d92d838f173bf1f36274ff08865c61db8d8b8d48b97ade9d6"]},"offset":"14930863"},"isCodePoint.js":{"size":142,"integrity":{"algorithm":"SHA256","hash":"09552c58c04039b13f1a7ba6675ddb24d2d1d375e39f7b32797dbd7fcee53848","blockSize":4194304,"blocks":["09552c58c04039b13f1a7ba6675ddb24d2d1d375e39f7b32797dbd7fcee53848"]},"offset":"14931018"},"isFinite.js":{"size":214,"integrity":{"algorithm":"SHA256","hash":"480d3ac32fb4c1bf8045c6e47d6aaf76e33f02be3cd06e1aa346f595261f2d8c","blockSize":4194304,"blocks":["480d3ac32fb4c1bf8045c6e47d6aaf76e33f02be3cd06e1aa346f595261f2d8c"]},"offset":"14931160"},"isFullyPopulatedPropertyDescriptor.js":{"size":223,"integrity":{"algorithm":"SHA256","hash":"96d974cceb7fd8fb27ce8644f5a0de37a8c8a37e27254f0d9987397f25fa4b07","blockSize":4194304,"blocks":["96d974cceb7fd8fb27ce8644f5a0de37a8c8a37e27254f0d9987397f25fa4b07"]},"offset":"14931374"},"isLeadingSurrogate.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"4f8e2fd8a7d9bc2da1630445aaae9e81ebb61b963db96024a9f8b86809e78e8b","blockSize":4194304,"blocks":["4f8e2fd8a7d9bc2da1630445aaae9e81ebb61b963db96024a9f8b86809e78e8b"]},"offset":"14931597"},"isMatchRecord.js":{"size":532,"integrity":{"algorithm":"SHA256","hash":"7b21d5b640097b15ff2b13cab2dc5cf03d385476bccef94dc3d8616a337c6d32","blockSize":4194304,"blocks":["7b21d5b640097b15ff2b13cab2dc5cf03d385476bccef94dc3d8616a337c6d32"]},"offset":"14931754"},"isNaN.js":{"size":88,"integrity":{"algorithm":"SHA256","hash":"bfd42c4dd1f4d1c33053146f041c4ac3f0da588c7b6a175c012ba5359daaf76b","blockSize":4194304,"blocks":["bfd42c4dd1f4d1c33053146f041c4ac3f0da588c7b6a175c012ba5359daaf76b"]},"offset":"14932286"},"isPrefixOf.js":{"size":305,"integrity":{"algorithm":"SHA256","hash":"9b76f2fe97f50d5ddcc8b23df9c05d8149881ed92dbbfa3ed6c4e22b43b74e15","blockSize":4194304,"blocks":["9b76f2fe97f50d5ddcc8b23df9c05d8149881ed92dbbfa3ed6c4e22b43b74e15"]},"offset":"14932374"},"isPrimitive.js":{"size":151,"integrity":{"algorithm":"SHA256","hash":"5b61e504279a3d5ba515e676b73f19a9cc92b9a7e6c84322b3a247b6c14d1490","blockSize":4194304,"blocks":["5b61e504279a3d5ba515e676b73f19a9cc92b9a7e6c84322b3a247b6c14d1490"]},"offset":"14932679"},"isPropertyDescriptor.js":{"size":721,"integrity":{"algorithm":"SHA256","hash":"3dce31d3559e8220acbb24b605a879c53c99f508f7b1e33f5bc17a241ad92949","blockSize":4194304,"blocks":["3dce31d3559e8220acbb24b605a879c53c99f508f7b1e33f5bc17a241ad92949"]},"offset":"14932830"},"isSamePropertyDescriptor.js":{"size":389,"integrity":{"algorithm":"SHA256","hash":"7bdd03f8d47724aed38a75e6e856382593a456a69723113c3d251b7dc4990c2b","blockSize":4194304,"blocks":["7bdd03f8d47724aed38a75e6e856382593a456a69723113c3d251b7dc4990c2b"]},"offset":"14933551"},"isTrailingSurrogate.js":{"size":158,"integrity":{"algorithm":"SHA256","hash":"636e9a0b7cdbbaa4ad8585ba5391fee6aadc0d803dccc2eb24abbe915b2e4ae0","blockSize":4194304,"blocks":["636e9a0b7cdbbaa4ad8585ba5391fee6aadc0d803dccc2eb24abbe915b2e4ae0"]},"offset":"14933940"},"maxSafeInteger.js":{"size":205,"integrity":{"algorithm":"SHA256","hash":"0b68abc1d2a4a0efad0ebc0768e5add5c8f8876bfe906841a411790cfb77c6bd","blockSize":4194304,"blocks":["0b68abc1d2a4a0efad0ebc0768e5add5c8f8876bfe906841a411790cfb77c6bd"]},"offset":"14934098"},"mod.js":{"size":179,"integrity":{"algorithm":"SHA256","hash":"ed7d2e6586e71052353cdcce21dfd620e549ee24c1dcdaa2c360887da1956143","blockSize":4194304,"blocks":["ed7d2e6586e71052353cdcce21dfd620e549ee24c1dcdaa2c360887da1956143"]},"offset":"14934303"},"modBigInt.js":{"size":184,"integrity":{"algorithm":"SHA256","hash":"24f3999d8fc0f50bd335178879052e10141a3f8bf865a193f405d052b2d11edd","blockSize":4194304,"blocks":["24f3999d8fc0f50bd335178879052e10141a3f8bf865a193f405d052b2d11edd"]},"offset":"14934482"},"padTimeComponent.js":{"size":220,"integrity":{"algorithm":"SHA256","hash":"adb63c011f4e6e6b9a797c58402931005126c58feeb24bff63a6426d2865f6e4","blockSize":4194304,"blocks":["adb63c011f4e6e6b9a797c58402931005126c58feeb24bff63a6426d2865f6e4"]},"offset":"14934666"},"regexTester.js":{"size":226,"integrity":{"algorithm":"SHA256","hash":"fd268c7e205f53a320c133582dd0aaa546744a181cbbdda2c6a436376cf671de","blockSize":4194304,"blocks":["fd268c7e205f53a320c133582dd0aaa546744a181cbbdda2c6a436376cf671de"]},"offset":"14934886"},"setProto.js":{"size":444,"integrity":{"algorithm":"SHA256","hash":"7afff4fbc68978b6d14ca7b7a99a8a6f1b0fb10ac9775be5d7c384967ba7fdd3","blockSize":4194304,"blocks":["7afff4fbc68978b6d14ca7b7a99a8a6f1b0fb10ac9775be5d7c384967ba7fdd3"]},"offset":"14935112"},"sign.js":{"size":89,"integrity":{"algorithm":"SHA256","hash":"5339e9f5959899cfbeae78b90c56978ee82c5d4f5d4616ed5d57f0752dd4082b","blockSize":4194304,"blocks":["5339e9f5959899cfbeae78b90c56978ee82c5d4f5d4616ed5d57f0752dd4082b"]},"offset":"14935556"},"some.js":{"size":191,"integrity":{"algorithm":"SHA256","hash":"0481eec9e71dbf00acf521c4d0d824df442bb4bcaf2f13e6d6e175c7a23d46c3","blockSize":4194304,"blocks":["0481eec9e71dbf00acf521c4d0d824df442bb4bcaf2f13e6d6e175c7a23d46c3"]},"offset":"14935645"},"timeConstants.js":{"size":450,"integrity":{"algorithm":"SHA256","hash":"1c45f4be0a0612b7ea3b2f5701a0e3bf109e81c62da962bcde85b7d5b8cf775f","blockSize":4194304,"blocks":["1c45f4be0a0612b7ea3b2f5701a0e3bf109e81c62da962bcde85b7d5b8cf775f"]},"offset":"14935836"}}}}},"es-aggregate-error":{"files":{".nycrc":{"size":216,"integrity":{"algorithm":"SHA256","hash":"948366fea3b423a46366326d0bb2e54b08abd1cf0b243678ba6625740c40da5a","blockSize":4194304,"blocks":["948366fea3b423a46366326d0bb2e54b08abd1cf0b243678ba6625740c40da5a"]},"offset":"15944258"},"LICENSE":{"size":1071,"integrity":{"algorithm":"SHA256","hash":"cfc3f455254c0af0655cc3ff46a41ed644b67599f6043346169d285bf2b3cf3b","blockSize":4194304,"blocks":["cfc3f455254c0af0655cc3ff46a41ed644b67599f6043346169d285bf2b3cf3b"]},"offset":"15944474"},"auto.js":{"size":36,"integrity":{"algorithm":"SHA256","hash":"8a28142fdc864763727d7cfe6a19b5dbcdf5e1861207bd2c122082336a6c3221","blockSize":4194304,"blocks":["8a28142fdc864763727d7cfe6a19b5dbcdf5e1861207bd2c122082336a6c3221"]},"offset":"15945545"},"implementation.js":{"size":1775,"integrity":{"algorithm":"SHA256","hash":"98121ca5206b8a72442797a85a8680c108045ab41bea798f65e185f8fec15d4f","blockSize":4194304,"blocks":["98121ca5206b8a72442797a85a8680c108045ab41bea798f65e185f8fec15d4f"]},"offset":"15945581"},"index.js":{"size":716,"integrity":{"algorithm":"SHA256","hash":"fdb65d309d8df148170003304586a284184c0026c16b7d12000ba9e304bb3efe","blockSize":4194304,"blocks":["fdb65d309d8df148170003304586a284184c0026c16b7d12000ba9e304bb3efe"]},"offset":"15947356"},"package.json":{"size":1505,"integrity":{"algorithm":"SHA256","hash":"6df6817faf10f9d577a917c8e5a6a6e9cc7cf29128290bf023860f2443053f59","blockSize":4194304,"blocks":["6df6817faf10f9d577a917c8e5a6a6e9cc7cf29128290bf023860f2443053f59"]},"offset":"15948072"},"polyfill.js":{"size":191,"integrity":{"algorithm":"SHA256","hash":"cb83f165f4a35e059378bab60843c242cd3eb925f25319cfe7beab8e76252356","blockSize":4194304,"blocks":["cb83f165f4a35e059378bab60843c242cd3eb925f25319cfe7beab8e76252356"]},"offset":"15949577"},"shim.js":{"size":417,"integrity":{"algorithm":"SHA256","hash":"36d966fd4d276c3952cd494a54aadac65b836726c241c03387e6c6dc61e5aa9b","blockSize":4194304,"blocks":["36d966fd4d276c3952cd494a54aadac65b836726c241c03387e6c6dc61e5aa9b"]},"offset":"15949768"}}},"es-to-primitive":{"files":{"LICENSE":{"size":1082,"integrity":{"algorithm":"SHA256","hash":"c61652db3d2808f667b48af0a358f0d85fd07ad4a0d0b1a50882dec3b764c522","blockSize":4194304,"blocks":["c61652db3d2808f667b48af0a358f0d85fd07ad4a0d0b1a50882dec3b764c522"]},"offset":"15950185"},"Makefile":{"size":3834,"integrity":{"algorithm":"SHA256","hash":"36971d7ea812d3f3974fa1ec9c50c0dd8f779da8321e8cfb36ffe15aeace6f41","blockSize":4194304,"blocks":["36971d7ea812d3f3974fa1ec9c50c0dd8f779da8321e8cfb36ffe15aeace6f41"]},"offset":"15951267"},"es2015.js":{"size":2139,"integrity":{"algorithm":"SHA256","hash":"428ed55f12940c282f30dc005f3ab5080cefad8d27f2aec95e04836d80a896b8","blockSize":4194304,"blocks":["428ed55f12940c282f30dc005f3ab5080cefad8d27f2aec95e04836d80a896b8"]},"offset":"15955101"},"es5.js":{"size":1199,"integrity":{"algorithm":"SHA256","hash":"aea32a87ac880508c760dc66ca104364b92551bf3af4379aa4586dd1d4a828c5","blockSize":4194304,"blocks":["aea32a87ac880508c760dc66ca104364b92551bf3af4379aa4586dd1d4a828c5"]},"offset":"15957240"},"es6.js":{"size":53,"integrity":{"algorithm":"SHA256","hash":"32a234b9c21e8c567388a546965b71a8a07b3419dabe9406514b7630f6440a08","blockSize":4194304,"blocks":["32a234b9c21e8c567388a546965b71a8a07b3419dabe9406514b7630f6440a08"]},"offset":"15958439"},"index.js":{"size":454,"integrity":{"algorithm":"SHA256","hash":"7d2eab82377a0f5e06315d8570e508d79c85ca520c28ee98886a29ed1df339c5","blockSize":4194304,"blocks":["7d2eab82377a0f5e06315d8570e508d79c85ca520c28ee98886a29ed1df339c5"]},"offset":"15958492"},"package.json":{"size":1312,"integrity":{"algorithm":"SHA256","hash":"1d17fa4a834eeffb4699836cdf4ce919db551e4ae593694ef4e29d6ac30184e2","blockSize":4194304,"blocks":["1d17fa4a834eeffb4699836cdf4ce919db551e4ae593694ef4e29d6ac30184e2"]},"offset":"15958946"},"helpers":{"files":{"isPrimitive.js":{"size":151,"integrity":{"algorithm":"SHA256","hash":"5b61e504279a3d5ba515e676b73f19a9cc92b9a7e6c84322b3a247b6c14d1490","blockSize":4194304,"blocks":["5b61e504279a3d5ba515e676b73f19a9cc92b9a7e6c84322b3a247b6c14d1490"]},"offset":"15960258"}}},".github":{"files":{"FUNDING.yml":{"size":586,"integrity":{"algorithm":"SHA256","hash":"4c14f23c44d9bb7aeefdb44af7bda24eabb01321446d9ff3ac61bad4f667766f","blockSize":4194304,"blocks":["4c14f23c44d9bb7aeefdb44af7bda24eabb01321446d9ff3ac61bad4f667766f"]},"offset":"15960409"}}}}},"escape-html":{"files":{"LICENSE":{"size":1157,"integrity":{"algorithm":"SHA256","hash":"255aa557a1f55224ce522f311629c0bf20854740a67955cefd798fbd1d3d1ded","blockSize":4194304,"blocks":["255aa557a1f55224ce522f311629c0bf20854740a67955cefd798fbd1d3d1ded"]},"offset":"15960995"},"index.js":{"size":1362,"integrity":{"algorithm":"SHA256","hash":"42a7f91883d0c5ce9292dda4e017e1f8664d34b09276d89fb6f3859c29d1ca9b","blockSize":4194304,"blocks":["42a7f91883d0c5ce9292dda4e017e1f8664d34b09276d89fb6f3859c29d1ca9b"]},"offset":"15962152"},"package.json":{"size":313,"integrity":{"algorithm":"SHA256","hash":"fdf773dcc64040ac2176a724c7ca66537cb49084038b690577854eb27ada225b","blockSize":4194304,"blocks":["fdf773dcc64040ac2176a724c7ca66537cb49084038b690577854eb27ada225b"]},"offset":"15963514"}}},"etag":{"files":{"HISTORY.md":{"size":1732,"integrity":{"algorithm":"SHA256","hash":"a6311c59a3ea30af617c8526eb2aa086b835260bf05490c81fa8e696e24ce7cd","blockSize":4194304,"blocks":["a6311c59a3ea30af617c8526eb2aa086b835260bf05490c81fa8e696e24ce7cd"]},"offset":"15963827"},"LICENSE":{"size":1094,"integrity":{"algorithm":"SHA256","hash":"a7996721249a136fbcfc1c201bcb5f414f38a701d4a24f28abe65e16cfcce813","blockSize":4194304,"blocks":["a7996721249a136fbcfc1c201bcb5f414f38a701d4a24f28abe65e16cfcce813"]},"offset":"15965559"},"index.js":{"size":2479,"integrity":{"algorithm":"SHA256","hash":"a95a23b9a60726a4522b768c88ad73a7ea2c539d220068227f5510a8ee2008ae","blockSize":4194304,"blocks":["a95a23b9a60726a4522b768c88ad73a7ea2c539d220068227f5510a8ee2008ae"]},"offset":"15966653"},"package.json":{"size":712,"integrity":{"algorithm":"SHA256","hash":"c160dfb28adc20a7446e2a656d5e600461ccd83370a39b339a61f57c05c96451","blockSize":4194304,"blocks":["c160dfb28adc20a7446e2a656d5e600461ccd83370a39b339a61f57c05c96451"]},"offset":"15969132"}}},"events":{"files":{".airtap.yml":{"size":289,"integrity":{"algorithm":"SHA256","hash":"d01a03fa317aeaa58b1320b04d4f8f4da05e7fac0dfd1e5ec8aaf0917a7bb835","blockSize":4194304,"blocks":["d01a03fa317aeaa58b1320b04d4f8f4da05e7fac0dfd1e5ec8aaf0917a7bb835"]},"offset":"15969844"},"History.md":{"size":3253,"integrity":{"algorithm":"SHA256","hash":"10735f184ed358cf45254c9a1959026720d234c3dfb242ba064c53bc1706052a","blockSize":4194304,"blocks":["10735f184ed358cf45254c9a1959026720d234c3dfb242ba064c53bc1706052a"]},"offset":"15970133"},"LICENSE":{"size":1081,"integrity":{"algorithm":"SHA256","hash":"631987b7616a325a5b97566c232418481ddf7dbb5ecadefb991e791876cc2599","blockSize":4194304,"blocks":["631987b7616a325a5b97566c232418481ddf7dbb5ecadefb991e791876cc2599"]},"offset":"15973386"},"events.js":{"size":14890,"integrity":{"algorithm":"SHA256","hash":"b6d7d26a2395a94dd1b9dc0d06e699bb50b4ec664589fd477ce7cc344e20e172","blockSize":4194304,"blocks":["b6d7d26a2395a94dd1b9dc0d06e699bb50b4ec664589fd477ce7cc344e20e172"]},"offset":"15974467"},"package.json":{"size":591,"integrity":{"algorithm":"SHA256","hash":"b42ae1c320968bc6a5077fff14943b301e248eeac1137b9a9bae4d8e4c430ed6","blockSize":4194304,"blocks":["b42ae1c320968bc6a5077fff14943b301e248eeac1137b9a9bae4d8e4c430ed6"]},"offset":"15989357"},"security.md":{"size":294,"integrity":{"algorithm":"SHA256","hash":"612dfd309edc618a1c6e5fd0657b9dc902f70252234e0b19f160805bc5ae9767","blockSize":4194304,"blocks":["612dfd309edc618a1c6e5fd0657b9dc902f70252234e0b19f160805bc5ae9767"]},"offset":"15989948"},".github":{"files":{"FUNDING.yml":{"size":646,"integrity":{"algorithm":"SHA256","hash":"d58171950381e5b7762b6bc87fe1b39a0a0d8d61778f620bb43bdc8fe0faa0d4","blockSize":4194304,"blocks":["d58171950381e5b7762b6bc87fe1b39a0a0d8d61778f620bb43bdc8fe0faa0d4"]},"offset":"15990242"}}}}},"expand-template":{"files":{"LICENSE":{"size":1082,"integrity":{"algorithm":"SHA256","hash":"0967624813244bf47da346449804af853437433cbdeb8c977f1e0d4bd14e0a3b","blockSize":4194304,"blocks":["0967624813244bf47da346449804af853437433cbdeb8c977f1e0d4bd14e0a3b"]},"offset":"15990888"},"index.js":{"size":672,"integrity":{"algorithm":"SHA256","hash":"2f3bbc7d7e54e16d91683936a7fa70db16e2cf1b4c8c72451f3d3a6a40e0f701","blockSize":4194304,"blocks":["2f3bbc7d7e54e16d91683936a7fa70db16e2cf1b4c8c72451f3d3a6a40e0f701"]},"offset":"15991970"},"package.json":{"size":522,"integrity":{"algorithm":"SHA256","hash":"41c8457217a8d56c52a718e1a59728aaca45c124940a9ee3d1f4fd36a4c1d83c","blockSize":4194304,"blocks":["41c8457217a8d56c52a718e1a59728aaca45c124940a9ee3d1f4fd36a4c1d83c"]},"offset":"15992642"}}},"express":{"files":{"History.md":{"size":112891,"integrity":{"algorithm":"SHA256","hash":"f222d78da87b5d3d1e7c4767b95ab9b5caddff1775fb9e54bf6eccb31b9786f1","blockSize":4194304,"blocks":["f222d78da87b5d3d1e7c4767b95ab9b5caddff1775fb9e54bf6eccb31b9786f1"]},"offset":"15993164"},"LICENSE":{"size":1249,"integrity":{"algorithm":"SHA256","hash":"95a5762890e5c1c9808921cef095661fc482c5e1f0bba31446ac85595df6237c","blockSize":4194304,"blocks":["95a5762890e5c1c9808921cef095661fc482c5e1f0bba31446ac85595df6237c"]},"offset":"16106055"},"index.js":{"size":224,"integrity":{"algorithm":"SHA256","hash":"4d2f5afc192178c5b0dc418d2da5826d52a8b6998771b011aede7fdba9118140","blockSize":4194304,"blocks":["4d2f5afc192178c5b0dc418d2da5826d52a8b6998771b011aede7fdba9118140"]},"offset":"16107304"},"package.json":{"size":1729,"integrity":{"algorithm":"SHA256","hash":"32313e211822829c94bc11e6341a83d8afb4c6f18422e0f3361c8504d0423c9a","blockSize":4194304,"blocks":["32313e211822829c94bc11e6341a83d8afb4c6f18422e0f3361c8504d0423c9a"]},"offset":"16107528"},"lib":{"files":{"application.js":{"size":14593,"integrity":{"algorithm":"SHA256","hash":"5901b32f609ba349351bf7406dbdc0c4c57b77ce6f7215ea67ccca5ac2a28e88","blockSize":4194304,"blocks":["5901b32f609ba349351bf7406dbdc0c4c57b77ce6f7215ea67ccca5ac2a28e88"]},"offset":"16109257"},"express.js":{"size":2409,"integrity":{"algorithm":"SHA256","hash":"2f25585c03c3050779c8f5f00597f8653f4fb8a97448ef8ef8cb21e65ba4d15d","blockSize":4194304,"blocks":["2f25585c03c3050779c8f5f00597f8653f4fb8a97448ef8ef8cb21e65ba4d15d"]},"offset":"16123850"},"request.js":{"size":12505,"integrity":{"algorithm":"SHA256","hash":"64ac10752c0516d789cb0698bb433586d4ce3b46f7f06ee3cb2880762b8bda40","blockSize":4194304,"blocks":["64ac10752c0516d789cb0698bb433586d4ce3b46f7f06ee3cb2880762b8bda40"]},"offset":"16126259"},"response.js":{"size":28014,"integrity":{"algorithm":"SHA256","hash":"7fdb8547558f9ea42606888eed597a30d84ac67d66b487244a417cd1c3d8a97e","blockSize":4194304,"blocks":["7fdb8547558f9ea42606888eed597a30d84ac67d66b487244a417cd1c3d8a97e"]},"offset":"16138764"},"utils.js":{"size":5955,"integrity":{"algorithm":"SHA256","hash":"7103eac6a640e1d6dcc77b070f90753d270bf398cb5b5482973509d17c77d0bc","blockSize":4194304,"blocks":["7103eac6a640e1d6dcc77b070f90753d270bf398cb5b5482973509d17c77d0bc"]},"offset":"16166778"},"view.js":{"size":3325,"integrity":{"algorithm":"SHA256","hash":"ec627880c1b43aee5887164ac2e9c58f01e4ee8086e23a829eddf1af3858c021","blockSize":4194304,"blocks":["ec627880c1b43aee5887164ac2e9c58f01e4ee8086e23a829eddf1af3858c021"]},"offset":"16172733"},"router":{"files":{"index.js":{"size":15124,"integrity":{"algorithm":"SHA256","hash":"0d46aeeba5aa3a6c8065995d188322a98d9167b362016a16dc86ba680dcfefd4","blockSize":4194304,"blocks":["0d46aeeba5aa3a6c8065995d188322a98d9167b362016a16dc86ba680dcfefd4"]},"offset":"16176058"},"layer.js":{"size":3296,"integrity":{"algorithm":"SHA256","hash":"c90709dcba8d9a6cfd1f2b4ef6d7a22d833e317f0c876d884342cee5a96f8a02","blockSize":4194304,"blocks":["c90709dcba8d9a6cfd1f2b4ef6d7a22d833e317f0c876d884342cee5a96f8a02"]},"offset":"16191182"},"route.js":{"size":4269,"integrity":{"algorithm":"SHA256","hash":"70cdae94240af01df97a99fe15dba37fd3ad7bfe2e6c625cf50c6a989a27aaff","blockSize":4194304,"blocks":["70cdae94240af01df97a99fe15dba37fd3ad7bfe2e6c625cf50c6a989a27aaff"]},"offset":"16194478"}}},"middleware":{"files":{"init.js":{"size":853,"integrity":{"algorithm":"SHA256","hash":"48c1d12f1494b20377fcdeec9056272eff84ed8c081e1e56dc2aea395f77d19c","blockSize":4194304,"blocks":["48c1d12f1494b20377fcdeec9056272eff84ed8c081e1e56dc2aea395f77d19c"]},"offset":"16198747"},"query.js":{"size":885,"integrity":{"algorithm":"SHA256","hash":"6edce3963588b42e41942900b24218e665b97df0c0b1c74090b2b934fa68ca08","blockSize":4194304,"blocks":["6edce3963588b42e41942900b24218e665b97df0c0b1c74090b2b934fa68ca08"]},"offset":"16199600"}}}}},"node_modules":{"files":{"array-flatten":{"files":{"LICENSE":{"size":1103,"integrity":{"algorithm":"SHA256","hash":"4eeb3271453a891df609e5a9f4ee79a68307f730c13417a3bfeffa604ac8cf25","blockSize":4194304,"blocks":["4eeb3271453a891df609e5a9f4ee79a68307f730c13417a3bfeffa604ac8cf25"]},"offset":"42540036"},"array-flatten.js":{"size":1195,"integrity":{"algorithm":"SHA256","hash":"766ca145b6d25e3d60f352a716e8fa1876bcdf362c0767c360cf24f335bc281e","blockSize":4194304,"blocks":["766ca145b6d25e3d60f352a716e8fa1876bcdf362c0767c360cf24f335bc281e"]},"offset":"42541139"},"package.json":{"size":651,"integrity":{"algorithm":"SHA256","hash":"4d3ab08217073212518573ab643d3f76333e4c766a3f92c75ff8c0eff88cd13f","blockSize":4194304,"blocks":["4d3ab08217073212518573ab643d3f76333e4c766a3f92c75ff8c0eff88cd13f"]},"offset":"42542334"}}},"debug":{"files":{"LICENSE":{"size":1107,"integrity":{"algorithm":"SHA256","hash":"98c970de440dcfc77471610aec2377c9d9b0db2b3be6d1add524a586e1d7f422","blockSize":4194304,"blocks":["98c970de440dcfc77471610aec2377c9d9b0db2b3be6d1add524a586e1d7f422"]},"offset":"42542985"},"Makefile":{"size":1059,"integrity":{"algorithm":"SHA256","hash":"f6466507e02c62f14e477af08e4a13ec883152b54d87feeffb8f0d6de6e9013b","blockSize":4194304,"blocks":["f6466507e02c62f14e477af08e4a13ec883152b54d87feeffb8f0d6de6e9013b"]},"offset":"42544092"},"component.json":{"size":321,"integrity":{"algorithm":"SHA256","hash":"2e5ab9ae90f41699e00d00fca16765024f437300a0568c2208669cc281ba7656","blockSize":4194304,"blocks":["2e5ab9ae90f41699e00d00fca16765024f437300a0568c2208669cc281ba7656"]},"offset":"42545151"},"node.js":{"size":40,"integrity":{"algorithm":"SHA256","hash":"996b381f353555cb172ebb2802bb2a7323442ff67b7b530cc26834058d7f31a2","blockSize":4194304,"blocks":["996b381f353555cb172ebb2802bb2a7323442ff67b7b530cc26834058d7f31a2"]},"offset":"42545472"},"package.json":{"size":947,"integrity":{"algorithm":"SHA256","hash":"9eaf6733d4c4fe3dd77abadf7ebafa6acafbfe9a9484e717c262ca8a0ee88e3a","blockSize":4194304,"blocks":["9eaf6733d4c4fe3dd77abadf7ebafa6acafbfe9a9484e717c262ca8a0ee88e3a"]},"offset":"42545512"},"src":{"files":{"browser.js":{"size":4734,"integrity":{"algorithm":"SHA256","hash":"0144ab6a52b9330c567de11a5c3a4aea35cdac47a4c106482aa24ae8054cdc6f","blockSize":4194304,"blocks":["0144ab6a52b9330c567de11a5c3a4aea35cdac47a4c106482aa24ae8054cdc6f"]},"offset":"42546459"},"debug.js":{"size":4394,"integrity":{"algorithm":"SHA256","hash":"d8d1c1d6c387ab67c3f28d78fd0b20b9becd69442db9d3efe110ca464b509c8a","blockSize":4194304,"blocks":["d8d1c1d6c387ab67c3f28d78fd0b20b9becd69442db9d3efe110ca464b509c8a"]},"offset":"42551193"},"index.js":{"size":263,"integrity":{"algorithm":"SHA256","hash":"9a34fedeb2d269c46ed94e6f13039eb0d16d866dd460ec66fa3acd78122fa9fe","blockSize":4194304,"blocks":["9a34fedeb2d269c46ed94e6f13039eb0d16d866dd460ec66fa3acd78122fa9fe"]},"offset":"42555587"},"inspector-log.js":{"size":373,"integrity":{"algorithm":"SHA256","hash":"949ae67ec1b655694f83dce57d47d9d77234f9e7d698616932a90e69c7afee91","blockSize":4194304,"blocks":["949ae67ec1b655694f83dce57d47d9d77234f9e7d698616932a90e69c7afee91"]},"offset":"42555850"},"node.js":{"size":6015,"integrity":{"algorithm":"SHA256","hash":"a3e83594a4ce88997e2e4fc66bc942b17b9d736290ad62560c7f09d6d0989ad0","blockSize":4194304,"blocks":["a3e83594a4ce88997e2e4fc66bc942b17b9d736290ad62560c7f09d6d0989ad0"]},"offset":"42556223"}}}}},"ms":{"files":{"index.js":{"size":2764,"integrity":{"algorithm":"SHA256","hash":"4bd92209cb9dacf3e3773e725acb7aaec43ea9e78540324e4d0f73e5ce9adef7","blockSize":4194304,"blocks":["4bd92209cb9dacf3e3773e725acb7aaec43ea9e78540324e4d0f73e5ce9adef7"]},"offset":"42562238"},"license.md":{"size":1077,"integrity":{"algorithm":"SHA256","hash":"6652830c2607c722b66f1b57de15877ab8fc5dca406cc5b335afeb365d0f32c1","blockSize":4194304,"blocks":["6652830c2607c722b66f1b57de15877ab8fc5dca406cc5b335afeb365d0f32c1"]},"offset":"42565002"},"package.json":{"size":469,"integrity":{"algorithm":"SHA256","hash":"72a34b18a15caec1a2090e28951128f015f6e92d882e4211f08e8284c0f8c3d3","blockSize":4194304,"blocks":["72a34b18a15caec1a2090e28951128f015f6e92d882e4211f08e8284c0f8c3d3"]},"offset":"42566079"}}},"qs":{"files":{".editorconfig":{"size":540,"integrity":{"algorithm":"SHA256","hash":"a621812cd44b87b2876db2ed9d08981a69d99a397b1a9ce1defef81b8d184772","blockSize":4194304,"blocks":["a621812cd44b87b2876db2ed9d08981a69d99a397b1a9ce1defef81b8d184772"]},"offset":"42566548"},".nycrc":{"size":216,"integrity":{"algorithm":"SHA256","hash":"7e1e3a52df079fc764989d75b3aaf5228228c841978e0c9201d1f394c1fd2655","blockSize":4194304,"blocks":["7e1e3a52df079fc764989d75b3aaf5228228c841978e0c9201d1f394c1fd2655"]},"offset":"42567088"},"LICENSE.md":{"size":1600,"integrity":{"algorithm":"SHA256","hash":"e7dc37bf662d7f786efcb46c545615e70c1daf458a38385521c63cf6607cdfe1","blockSize":4194304,"blocks":["e7dc37bf662d7f786efcb46c545615e70c1daf458a38385521c63cf6607cdfe1"]},"offset":"42567304"},"package.json":{"size":1062,"integrity":{"algorithm":"SHA256","hash":"37d9374d016149cba4c1b80e557808d66d740d10a0a1073e6ae2ba1dbb1a27b5","blockSize":4194304,"blocks":["37d9374d016149cba4c1b80e557808d66d740d10a0a1073e6ae2ba1dbb1a27b5"]},"offset":"42568904"},"lib":{"files":{"formats.js":{"size":476,"integrity":{"algorithm":"SHA256","hash":"d4e3de8b5a4c94865d8acd6f1c7538144732d466769661160bc0bf6ec9db3f4f","blockSize":4194304,"blocks":["d4e3de8b5a4c94865d8acd6f1c7538144732d466769661160bc0bf6ec9db3f4f"]},"offset":"42569966"},"index.js":{"size":211,"integrity":{"algorithm":"SHA256","hash":"8f4e02eef6ccc43f2b7448c18ae209281c8e9af9807cad491df67450e3817a95","blockSize":4194304,"blocks":["8f4e02eef6ccc43f2b7448c18ae209281c8e9af9807cad491df67450e3817a95"]},"offset":"42570442"},"parse.js":{"size":9380,"integrity":{"algorithm":"SHA256","hash":"9611d65366166f5f826b647f6f2dc25ad94eb5d0259e9646bfd13784dfce907c","blockSize":4194304,"blocks":["9611d65366166f5f826b647f6f2dc25ad94eb5d0259e9646bfd13784dfce907c"]},"offset":"42570653"},"stringify.js":{"size":9819,"integrity":{"algorithm":"SHA256","hash":"d82a8da6078398bd7ce0f0a78ae53051fbbfc4560405034dd24edaace0a22a9c","blockSize":4194304,"blocks":["d82a8da6078398bd7ce0f0a78ae53051fbbfc4560405034dd24edaace0a22a9c"]},"offset":"42580033"},"utils.js":{"size":6823,"integrity":{"algorithm":"SHA256","hash":"1a360b096b61cb5d5260e6543ed032677d7dcadb0bcf9ba5c42833ca75622e9b","blockSize":4194304,"blocks":["1a360b096b61cb5d5260e6543ed032677d7dcadb0bcf9ba5c42833ca75622e9b"]},"offset":"42589852"}}},"dist":{"files":{"qs.js":{"size":68450,"integrity":{"algorithm":"SHA256","hash":"755291a36c25173d92d6d3565641ef109014c5479cecb90b01ac871de2e0ce3a","blockSize":4194304,"blocks":["755291a36c25173d92d6d3565641ef109014c5479cecb90b01ac871de2e0ce3a"]},"offset":"42596675"}}},".github":{"files":{"FUNDING.yml":{"size":548,"integrity":{"algorithm":"SHA256","hash":"367b5d545d7a66684895ee7efd987130e83018491a7b2f72f25c0b062157ad90","blockSize":4194304,"blocks":["367b5d545d7a66684895ee7efd987130e83018491a7b2f72f25c0b062157ad90"]},"offset":"42665125"}}}}},"safe-buffer":{"files":{"LICENSE":{"size":1081,"integrity":{"algorithm":"SHA256","hash":"c7cc929b57080f4b9d0c6cf57669f0463fc5b39906344dfc8d3bc43426b30eac","blockSize":4194304,"blocks":["c7cc929b57080f4b9d0c6cf57669f0463fc5b39906344dfc8d3bc43426b30eac"]},"offset":"42665673"},"index.js":{"size":1670,"integrity":{"algorithm":"SHA256","hash":"184d5c4a83512e3f49d4d5b52f7073f601f933bad11f1fbb3ad364ca5e6478e1","blockSize":4194304,"blocks":["184d5c4a83512e3f49d4d5b52f7073f601f933bad11f1fbb3ad364ca5e6478e1"]},"offset":"42666754"},"package.json":{"size":774,"integrity":{"algorithm":"SHA256","hash":"453bbe16b032826e5ab4f30af0c470f7c256706e0301e7bffbd6b49317c2124a","blockSize":4194304,"blocks":["453bbe16b032826e5ab4f30af0c470f7c256706e0301e7bffbd6b49317c2124a"]},"offset":"42668424"}}}}}}},"finalhandler":{"files":{"HISTORY.md":{"size":4292,"integrity":{"algorithm":"SHA256","hash":"5c7065d29a2710c69516308350a51a140dedd0e4527f27578405087010cd4b7f","blockSize":4194304,"blocks":["5c7065d29a2710c69516308350a51a140dedd0e4527f27578405087010cd4b7f"]},"offset":"16200485"},"LICENSE":{"size":1119,"integrity":{"algorithm":"SHA256","hash":"47dcccf62bf40469d23849b0b1dc8df9fc91bce219b880c638d4dc4596e6b5cf","blockSize":4194304,"blocks":["47dcccf62bf40469d23849b0b1dc8df9fc91bce219b880c638d4dc4596e6b5cf"]},"offset":"16204777"},"SECURITY.md":{"size":1202,"integrity":{"algorithm":"SHA256","hash":"d0366646babeb58ff9cb81d794063822b86bd3f3c12e96133c9f55a0812891cd","blockSize":4194304,"blocks":["d0366646babeb58ff9cb81d794063822b86bd3f3c12e96133c9f55a0812891cd"]},"offset":"16205896"},"index.js":{"size":6689,"integrity":{"algorithm":"SHA256","hash":"96900b458b12085ea16f228151439d9a7bae6b5d45248e355ad617f4dc213540","blockSize":4194304,"blocks":["96900b458b12085ea16f228151439d9a7bae6b5d45248e355ad617f4dc213540"]},"offset":"16207098"},"package.json":{"size":968,"integrity":{"algorithm":"SHA256","hash":"7642560eca25269595017eb34d7106b0fb3f52360743b1a3e1aad3e6f1819e74","blockSize":4194304,"blocks":["7642560eca25269595017eb34d7106b0fb3f52360743b1a3e1aad3e6f1819e74"]},"offset":"16213787"},"node_modules":{"files":{"debug":{"files":{"LICENSE":{"size":1107,"integrity":{"algorithm":"SHA256","hash":"98c970de440dcfc77471610aec2377c9d9b0db2b3be6d1add524a586e1d7f422","blockSize":4194304,"blocks":["98c970de440dcfc77471610aec2377c9d9b0db2b3be6d1add524a586e1d7f422"]},"offset":"42669198"},"Makefile":{"size":1059,"integrity":{"algorithm":"SHA256","hash":"f6466507e02c62f14e477af08e4a13ec883152b54d87feeffb8f0d6de6e9013b","blockSize":4194304,"blocks":["f6466507e02c62f14e477af08e4a13ec883152b54d87feeffb8f0d6de6e9013b"]},"offset":"42670305"},"component.json":{"size":321,"integrity":{"algorithm":"SHA256","hash":"2e5ab9ae90f41699e00d00fca16765024f437300a0568c2208669cc281ba7656","blockSize":4194304,"blocks":["2e5ab9ae90f41699e00d00fca16765024f437300a0568c2208669cc281ba7656"]},"offset":"42671364"},"node.js":{"size":40,"integrity":{"algorithm":"SHA256","hash":"996b381f353555cb172ebb2802bb2a7323442ff67b7b530cc26834058d7f31a2","blockSize":4194304,"blocks":["996b381f353555cb172ebb2802bb2a7323442ff67b7b530cc26834058d7f31a2"]},"offset":"42671685"},"package.json":{"size":947,"integrity":{"algorithm":"SHA256","hash":"9eaf6733d4c4fe3dd77abadf7ebafa6acafbfe9a9484e717c262ca8a0ee88e3a","blockSize":4194304,"blocks":["9eaf6733d4c4fe3dd77abadf7ebafa6acafbfe9a9484e717c262ca8a0ee88e3a"]},"offset":"42671725"},"src":{"files":{"browser.js":{"size":4734,"integrity":{"algorithm":"SHA256","hash":"0144ab6a52b9330c567de11a5c3a4aea35cdac47a4c106482aa24ae8054cdc6f","blockSize":4194304,"blocks":["0144ab6a52b9330c567de11a5c3a4aea35cdac47a4c106482aa24ae8054cdc6f"]},"offset":"42672672"},"debug.js":{"size":4394,"integrity":{"algorithm":"SHA256","hash":"d8d1c1d6c387ab67c3f28d78fd0b20b9becd69442db9d3efe110ca464b509c8a","blockSize":4194304,"blocks":["d8d1c1d6c387ab67c3f28d78fd0b20b9becd69442db9d3efe110ca464b509c8a"]},"offset":"42677406"},"index.js":{"size":263,"integrity":{"algorithm":"SHA256","hash":"9a34fedeb2d269c46ed94e6f13039eb0d16d866dd460ec66fa3acd78122fa9fe","blockSize":4194304,"blocks":["9a34fedeb2d269c46ed94e6f13039eb0d16d866dd460ec66fa3acd78122fa9fe"]},"offset":"42681800"},"inspector-log.js":{"size":373,"integrity":{"algorithm":"SHA256","hash":"949ae67ec1b655694f83dce57d47d9d77234f9e7d698616932a90e69c7afee91","blockSize":4194304,"blocks":["949ae67ec1b655694f83dce57d47d9d77234f9e7d698616932a90e69c7afee91"]},"offset":"42682063"},"node.js":{"size":6015,"integrity":{"algorithm":"SHA256","hash":"a3e83594a4ce88997e2e4fc66bc942b17b9d736290ad62560c7f09d6d0989ad0","blockSize":4194304,"blocks":["a3e83594a4ce88997e2e4fc66bc942b17b9d736290ad62560c7f09d6d0989ad0"]},"offset":"42682436"}}}}},"ms":{"files":{"index.js":{"size":2764,"integrity":{"algorithm":"SHA256","hash":"4bd92209cb9dacf3e3773e725acb7aaec43ea9e78540324e4d0f73e5ce9adef7","blockSize":4194304,"blocks":["4bd92209cb9dacf3e3773e725acb7aaec43ea9e78540324e4d0f73e5ce9adef7"]},"offset":"42688451"},"license.md":{"size":1077,"integrity":{"algorithm":"SHA256","hash":"6652830c2607c722b66f1b57de15877ab8fc5dca406cc5b335afeb365d0f32c1","blockSize":4194304,"blocks":["6652830c2607c722b66f1b57de15877ab8fc5dca406cc5b335afeb365d0f32c1"]},"offset":"42691215"},"package.json":{"size":469,"integrity":{"algorithm":"SHA256","hash":"72a34b18a15caec1a2090e28951128f015f6e92d882e4211f08e8284c0f8c3d3","blockSize":4194304,"blocks":["72a34b18a15caec1a2090e28951128f015f6e92d882e4211f08e8284c0f8c3d3"]},"offset":"42692292"}}}}}}},"follow-redirects":{"files":{"LICENSE":{"size":1136,"integrity":{"algorithm":"SHA256","hash":"bfa8a54bb952ccda79f0f1889721d108f5b605babbb2b8a3705ffb52f4132eb7","blockSize":4194304,"blocks":["bfa8a54bb952ccda79f0f1889721d108f5b605babbb2b8a3705ffb52f4132eb7"]},"offset":"16214755"},"debug.js":{"size":315,"integrity":{"algorithm":"SHA256","hash":"8dbf7e71a9292be180e3469a6b7a164171d3c39dec79e5dbc4aa1c9f09509faf","blockSize":4194304,"blocks":["8dbf7e71a9292be180e3469a6b7a164171d3c39dec79e5dbc4aa1c9f09509faf"]},"offset":"16215891"},"http.js":{"size":37,"integrity":{"algorithm":"SHA256","hash":"754c0078c57625db7b55b4c3fb30ff5c207fc49284a5022742e81d0c595403c5","blockSize":4194304,"blocks":["754c0078c57625db7b55b4c3fb30ff5c207fc49284a5022742e81d0c595403c5"]},"offset":"16216206"},"https.js":{"size":38,"integrity":{"algorithm":"SHA256","hash":"7a28e323ffd91094e083a8954fe027839c06d948603d7f2719ed17c446885272","blockSize":4194304,"blocks":["7a28e323ffd91094e083a8954fe027839c06d948603d7f2719ed17c446885272"]},"offset":"16216243"},"index.js":{"size":18418,"integrity":{"algorithm":"SHA256","hash":"818de9a2eb818ac7d9b8bcae15c5273be57c08cf45ab64d2d1d1e73de16a01ac","blockSize":4194304,"blocks":["818de9a2eb818ac7d9b8bcae15c5273be57c08cf45ab64d2d1d1e73de16a01ac"]},"offset":"16216281"},"package.json":{"size":862,"integrity":{"algorithm":"SHA256","hash":"02fcabe72d2d9d8c6c92d17ef08ab948c868dcc216d958e350ada6e748c3841a","blockSize":4194304,"blocks":["02fcabe72d2d9d8c6c92d17ef08ab948c868dcc216d958e350ada6e748c3841a"]},"offset":"16234699"}}},"forwarded":{"files":{"HISTORY.md":{"size":400,"integrity":{"algorithm":"SHA256","hash":"16a998adf118889eee706826b2d3bc50b0d6ef228d81eb94a64b47b72d95a398","blockSize":4194304,"blocks":["16a998adf118889eee706826b2d3bc50b0d6ef228d81eb94a64b47b72d95a398"]},"offset":"16235561"},"LICENSE":{"size":1094,"integrity":{"algorithm":"SHA256","hash":"bd47ce7b88c7759630d1e2b9fcfa170a0f1fde522be09e13fb1581a79d090400","blockSize":4194304,"blocks":["bd47ce7b88c7759630d1e2b9fcfa170a0f1fde522be09e13fb1581a79d090400"]},"offset":"16235961"},"index.js":{"size":1578,"integrity":{"algorithm":"SHA256","hash":"4ca8df355d325042545f4a522017926ec460fcb836f10174f2c80bbc4d47aa69","blockSize":4194304,"blocks":["4ca8df355d325042545f4a522017926ec460fcb836f10174f2c80bbc4d47aa69"]},"offset":"16237055"},"package.json":{"size":654,"integrity":{"algorithm":"SHA256","hash":"42c9b910eeb6881553461b4fd0c087f148f78cadcb5b75066d1122a0ab13eec9","blockSize":4194304,"blocks":["42c9b910eeb6881553461b4fd0c087f148f78cadcb5b75066d1122a0ab13eec9"]},"offset":"16238633"}}},"fresh":{"files":{"HISTORY.md":{"size":1500,"integrity":{"algorithm":"SHA256","hash":"c2d714eaf4558de25ab7ea991f52899610cd566fec897838ad24306fa2f8f409","blockSize":4194304,"blocks":["c2d714eaf4558de25ab7ea991f52899610cd566fec897838ad24306fa2f8f409"]},"offset":"16239287"},"LICENSE":{"size":1174,"integrity":{"algorithm":"SHA256","hash":"a0ec0dab16b3666f24950f86d257930ac2ad475557b4bfe245620e0817d8a45d","blockSize":4194304,"blocks":["a0ec0dab16b3666f24950f86d257930ac2ad475557b4bfe245620e0817d8a45d"]},"offset":"16240787"},"index.js":{"size":2711,"integrity":{"algorithm":"SHA256","hash":"85b46ce10c4fba71fb41666586572277f626bbc698266026372941b5267bfb60","blockSize":4194304,"blocks":["85b46ce10c4fba71fb41666586572277f626bbc698266026372941b5267bfb60"]},"offset":"16241961"},"package.json":{"size":727,"integrity":{"algorithm":"SHA256","hash":"bc48cb3a4ce071eb7c0daa9b26d2d06702a260eddf88a4af2948d3dbfd569c4a","blockSize":4194304,"blocks":["bc48cb3a4ce071eb7c0daa9b26d2d06702a260eddf88a4af2948d3dbfd569c4a"]},"offset":"16244672"}}},"fs-constants":{"files":{"LICENSE":{"size":1079,"integrity":{"algorithm":"SHA256","hash":"2281f2db407bdbb54f069eec38128b2dee2c0c952f52b786ef1faecb81767b3c","blockSize":4194304,"blocks":["2281f2db407bdbb54f069eec38128b2dee2c0c952f52b786ef1faecb81767b3c"]},"offset":"16245399"},"browser.js":{"size":38,"integrity":{"algorithm":"SHA256","hash":"b575b19b26a6c95048bbb9372440d1a37178a2d4e9ea98115f27121fa804d7ce","blockSize":4194304,"blocks":["b575b19b26a6c95048bbb9372440d1a37178a2d4e9ea98115f27121fa804d7ce"]},"offset":"16246478"},"index.js":{"size":65,"integrity":{"algorithm":"SHA256","hash":"0018c44a4f4577ed7e94b66d768eab3a822bc96fda9131cfb7e4dea99eb1b9b0","blockSize":4194304,"blocks":["0018c44a4f4577ed7e94b66d768eab3a822bc96fda9131cfb7e4dea99eb1b9b0"]},"offset":"16246516"},"package.json":{"size":433,"integrity":{"algorithm":"SHA256","hash":"246f3d6743381ee1838e55295556e0bf48c8841c9b841324870699745d524c09","blockSize":4194304,"blocks":["246f3d6743381ee1838e55295556e0bf48c8841c9b841324870699745d524c09"]},"offset":"16246581"}}},"fs-extra":{"files":{"LICENSE":{"size":1084,"integrity":{"algorithm":"SHA256","hash":"1e76029602ae9b21cc4e612db2496d92febed882ba13ba745f8b3309e85f9d39","blockSize":4194304,"blocks":["1e76029602ae9b21cc4e612db2496d92febed882ba13ba745f8b3309e85f9d39"]},"offset":"16247014"},"package.json":{"size":950,"integrity":{"algorithm":"SHA256","hash":"8625f8d6674f3dacbdd5ed9fc553d9583234a6403ef90b1612f786b8fad17711","blockSize":4194304,"blocks":["8625f8d6674f3dacbdd5ed9fc553d9583234a6403ef90b1612f786b8fad17711"]},"offset":"16248098"},"lib":{"files":{"index.js":{"size":358,"integrity":{"algorithm":"SHA256","hash":"4967e903b3dc290f2b401b81bfcad8b2d94fd68c1bf4563df63ac082af0e1dae","blockSize":4194304,"blocks":["4967e903b3dc290f2b401b81bfcad8b2d94fd68c1bf4563df63ac082af0e1dae"]},"offset":"16249048"},"util":{"files":{"stat.js":{"size":5226,"integrity":{"algorithm":"SHA256","hash":"fe33d6c739866764c937e8aaeb518bbda7a36b0f3c006855b26c5bdd846081c3","blockSize":4194304,"blocks":["fe33d6c739866764c937e8aaeb518bbda7a36b0f3c006855b26c5bdd846081c3"]},"offset":"16249406"},"utimes.js":{"size":615,"integrity":{"algorithm":"SHA256","hash":"4a049bcd580984957b8690fb05f7a6bf5c7e59bfc78d6817882945c35f3a44d4","blockSize":4194304,"blocks":["4a049bcd580984957b8690fb05f7a6bf5c7e59bfc78d6817882945c35f3a44d4"]},"offset":"16254632"}}},"remove":{"files":{"index.js":{"size":489,"integrity":{"algorithm":"SHA256","hash":"ad79431e3d1cae731565d3e7403f619aee21f3b276d3541fe794ec7fd59ab0da","blockSize":4194304,"blocks":["ad79431e3d1cae731565d3e7403f619aee21f3b276d3541fe794ec7fd59ab0da"]},"offset":"16255247"},"rimraf.js":{"size":7443,"integrity":{"algorithm":"SHA256","hash":"931cd85d1564a59db583841196cf2773940e7eee30830514b448d2d4919cc534","blockSize":4194304,"blocks":["931cd85d1564a59db583841196cf2773940e7eee30830514b448d2d4919cc534"]},"offset":"16255736"}}},"path-exists":{"files":{"index.js":{"size":263,"integrity":{"algorithm":"SHA256","hash":"5ce096c95daec0259817248921b39a9e0df4d342db171138ccb62440cc7a0cbe","blockSize":4194304,"blocks":["5ce096c95daec0259817248921b39a9e0df4d342db171138ccb62440cc7a0cbe"]},"offset":"16263179"}}},"output-file":{"files":{"index.js":{"size":947,"integrity":{"algorithm":"SHA256","hash":"a27d1a72ed1ecddffc57e70187a4b72467ed0dd34092b7e3d2817b9f4359ab5d","blockSize":4194304,"blocks":["a27d1a72ed1ecddffc57e70187a4b72467ed0dd34092b7e3d2817b9f4359ab5d"]},"offset":"16263442"}}},"move":{"files":{"index.js":{"size":147,"integrity":{"algorithm":"SHA256","hash":"274f9fd31ac65cdc7dd9a6c568fb1163c2b043f6d5fcad30d5177961e9e3e240","blockSize":4194304,"blocks":["274f9fd31ac65cdc7dd9a6c568fb1163c2b043f6d5fcad30d5177961e9e3e240"]},"offset":"16264389"},"move-sync.js":{"size":1485,"integrity":{"algorithm":"SHA256","hash":"10c9f85215adcbc49661e5629d81ab4a5dbae552dd59032836d28cb2836d1cce","blockSize":4194304,"blocks":["10c9f85215adcbc49661e5629d81ab4a5dbae552dd59032836d28cb2836d1cce"]},"offset":"16264536"},"move.js":{"size":2010,"integrity":{"algorithm":"SHA256","hash":"5487cd460cb8af3e0b2ed0055d61185e56bea35d08c01972b7f1a87e0433aabe","blockSize":4194304,"blocks":["5487cd460cb8af3e0b2ed0055d61185e56bea35d08c01972b7f1a87e0433aabe"]},"offset":"16266021"}}},"mkdirs":{"files":{"index.js":{"size":328,"integrity":{"algorithm":"SHA256","hash":"adcd576e2e3868b94adb1bad6d1e3cf2312ffdfa71e49a57fe6247e116e75ecf","blockSize":4194304,"blocks":["adcd576e2e3868b94adb1bad6d1e3cf2312ffdfa71e49a57fe6247e116e75ecf"]},"offset":"16268031"},"make-dir.js":{"size":545,"integrity":{"algorithm":"SHA256","hash":"23c7ce8a3d6b39d1c7cf5d16ba6447c1690a6fdaa8c5f41e6b76526b7afe96f3","blockSize":4194304,"blocks":["23c7ce8a3d6b39d1c7cf5d16ba6447c1690a6fdaa8c5f41e6b76526b7afe96f3"]},"offset":"16268359"},"utils.js":{"size":1655,"integrity":{"algorithm":"SHA256","hash":"5372a36f4b2c5023788c23dbc6639155cb016a1b111e8fc1d6bf97cbaf11b1f8","blockSize":4194304,"blocks":["5372a36f4b2c5023788c23dbc6639155cb016a1b111e8fc1d6bf97cbaf11b1f8"]},"offset":"16268904"}}},"json":{"files":{"index.js":{"size":508,"integrity":{"algorithm":"SHA256","hash":"c5ac6a8005308e5bb36619fed225c987872300d356fa95d0d56878029ebbdc45","blockSize":4194304,"blocks":["c5ac6a8005308e5bb36619fed225c987872300d356fa95d0d56878029ebbdc45"]},"offset":"16270559"},"jsonfile.js":{"size":238,"integrity":{"algorithm":"SHA256","hash":"a986ad3c13166f3bf8f30b18140bfc8ea1754760ab3802aa7c8c3780d54f07ba","blockSize":4194304,"blocks":["a986ad3c13166f3bf8f30b18140bfc8ea1754760ab3802aa7c8c3780d54f07ba"]},"offset":"16271067"},"output-json-sync.js":{"size":276,"integrity":{"algorithm":"SHA256","hash":"a68fde22ad1a194755de03e90861805248f883342e05bd685258e76a90e7a6ab","blockSize":4194304,"blocks":["a68fde22ad1a194755de03e90861805248f883342e05bd685258e76a90e7a6ab"]},"offset":"16271305"},"output-json.js":{"size":277,"integrity":{"algorithm":"SHA256","hash":"b738aaf8ff9aae265b0512cb2554e1f8ce8605d21dc6230189a9be6980079fc8","blockSize":4194304,"blocks":["b738aaf8ff9aae265b0512cb2554e1f8ce8605d21dc6230189a9be6980079fc8"]},"offset":"16271581"}}},"fs":{"files":{"index.js":{"size":3373,"integrity":{"algorithm":"SHA256","hash":"620b6e703880fd6718c354c5359a5c37a2379054c037269dbcf7afd2503e4a6f","blockSize":4194304,"blocks":["620b6e703880fd6718c354c5359a5c37a2379054c037269dbcf7afd2503e4a6f"]},"offset":"16271858"}}},"ensure":{"files":{"file.js":{"size":1709,"integrity":{"algorithm":"SHA256","hash":"a104ff42c9aefd0e34556b9df2e4b5c9cd15315b0b0f70b07938901428b3c608","blockSize":4194304,"blocks":["a104ff42c9aefd0e34556b9df2e4b5c9cd15315b0b0f70b07938901428b3c608"]},"offset":"16275231"},"index.js":{"size":542,"integrity":{"algorithm":"SHA256","hash":"77ccb9b4d1eab607ce7ba8d3d5bed59b0cb9cc4748d02aa896a2413b71dbfe60","blockSize":4194304,"blocks":["77ccb9b4d1eab607ce7ba8d3d5bed59b0cb9cc4748d02aa896a2413b71dbfe60"]},"offset":"16276940"},"link.js":{"size":1652,"integrity":{"algorithm":"SHA256","hash":"339ce737e858367c65f79c0960bc6d1d617638aae07d396ac8ae5c8670b500c3","blockSize":4194304,"blocks":["339ce737e858367c65f79c0960bc6d1d617638aae07d396ac8ae5c8670b500c3"]},"offset":"16277482"},"symlink-paths.js":{"size":3374,"integrity":{"algorithm":"SHA256","hash":"5595b764059fb90ce4a13f5cdf43988da97e636521d3c599ce5260681d75bdfc","blockSize":4194304,"blocks":["5595b764059fb90ce4a13f5cdf43988da97e636521d3c599ce5260681d75bdfc"]},"offset":"16279134"},"symlink-type.js":{"size":694,"integrity":{"algorithm":"SHA256","hash":"17abe9590176305dd04316b2ac5c972dcf54cea32d279f955fbcf25098743dc8","blockSize":4194304,"blocks":["17abe9590176305dd04316b2ac5c972dcf54cea32d279f955fbcf25098743dc8"]},"offset":"16282508"},"symlink.js":{"size":2522,"integrity":{"algorithm":"SHA256","hash":"8b1fa73e5b5554380b710ccfbb4fe23764e53f0e5ce046689741310a82a19e21","blockSize":4194304,"blocks":["8b1fa73e5b5554380b710ccfbb4fe23764e53f0e5ce046689741310a82a19e21"]},"offset":"16283202"}}},"empty":{"files":{"index.js":{"size":747,"integrity":{"algorithm":"SHA256","hash":"1096edcb5ec0ed015b36914beff0826f6cd5d7ce2645ee9dee60c0b272e57856","blockSize":4194304,"blocks":["1096edcb5ec0ed015b36914beff0826f6cd5d7ce2645ee9dee60c0b272e57856"]},"offset":"16285724"}}},"copy":{"files":{"copy-sync.js":{"size":5776,"integrity":{"algorithm":"SHA256","hash":"a50856fe7fab3d1d22e8fbf5f32543d46342257cad5e31df8f2a7409fdf19c97","blockSize":4194304,"blocks":["a50856fe7fab3d1d22e8fbf5f32543d46342257cad5e31df8f2a7409fdf19c97"]},"offset":"16286471"},"copy.js":{"size":7756,"integrity":{"algorithm":"SHA256","hash":"b1ef00cadd368ea903c9a86927e40636cd832d8fa64344637c96e0e223faf876","blockSize":4194304,"blocks":["b1ef00cadd368ea903c9a86927e40636cd832d8fa64344637c96e0e223faf876"]},"offset":"16292247"},"index.js":{"size":147,"integrity":{"algorithm":"SHA256","hash":"f94ad0b8c5f5131a682be2d0427189c260e49fa748fb6f6bcc1f78678354e5d2","blockSize":4194304,"blocks":["f94ad0b8c5f5131a682be2d0427189c260e49fa748fb6f6bcc1f78678354e5d2"]},"offset":"16300003"}}}}}}},"fs-jetpack":{"files":{"LICENSE":{"size":1084,"integrity":{"algorithm":"SHA256","hash":"b5219afd4310bc1fce567e1dc2bea6facd4f3a28f9d55b990e5b4908739132a5","blockSize":4194304,"blocks":["b5219afd4310bc1fce567e1dc2bea6facd4f3a28f9d55b990e5b4908739132a5"]},"offset":"16300150"},"main.js":{"size":86,"integrity":{"algorithm":"SHA256","hash":"673a3801fc7963a692a2f83a67988429a99facf8baa0f8bfc1250a14d2453d0a","blockSize":4194304,"blocks":["673a3801fc7963a692a2f83a67988429a99facf8baa0f8bfc1250a14d2453d0a"]},"offset":"16301234"},"package.json":{"size":1106,"integrity":{"algorithm":"SHA256","hash":"0dc6f8dfa2fb9a08da68bc1f235d4703317f7890596e2b53d3d1ebcf6e1c91b4","blockSize":4194304,"blocks":["0dc6f8dfa2fb9a08da68bc1f235d4703317f7890596e2b53d3d1ebcf6e1c91b4"]},"offset":"16301320"},"lib":{"files":{"append.js":{"size":1814,"integrity":{"algorithm":"SHA256","hash":"1280887d5094fd27441b46206039e1fc776fd9c0eb2e75d3aa0f860e1ff3750b","blockSize":4194304,"blocks":["1280887d5094fd27441b46206039e1fc776fd9c0eb2e75d3aa0f860e1ff3750b"]},"offset":"16302426"},"copy.js":{"size":9988,"integrity":{"algorithm":"SHA256","hash":"78f6937da347f95d823c1982b50ff1419a23f6b9549e2f61cd7c5f1d57e152bd","blockSize":4194304,"blocks":["78f6937da347f95d823c1982b50ff1419a23f6b9549e2f61cd7c5f1d57e152bd"]},"offset":"16304240"},"dir.js":{"size":6558,"integrity":{"algorithm":"SHA256","hash":"a232727a8ee74573479a228d7b2023559cf5d6facf40eae8ba11650afc88f151","blockSize":4194304,"blocks":["a232727a8ee74573479a228d7b2023559cf5d6facf40eae8ba11650afc88f151"]},"offset":"16314228"},"exists.js":{"size":1504,"integrity":{"algorithm":"SHA256","hash":"35637857a59e481b5d09fd76a9f18a8f637727a4a30a61d869e97d4fb87e41fc","blockSize":4194304,"blocks":["35637857a59e481b5d09fd76a9f18a8f637727a4a30a61d869e97d4fb87e41fc"]},"offset":"16320786"},"file.js":{"size":4968,"integrity":{"algorithm":"SHA256","hash":"d506acdc64fe55277baa7fe1ea1b1f6434f97ea428a9161cb8c2b651d5db1568","blockSize":4194304,"blocks":["d506acdc64fe55277baa7fe1ea1b1f6434f97ea428a9161cb8c2b651d5db1568"]},"offset":"16322290"},"find.js":{"size":5977,"integrity":{"algorithm":"SHA256","hash":"1eb8ba696fcc14b83a0a4c1f36e29c838521c27d7119e510cf7859a3f24d4ca4","blockSize":4194304,"blocks":["1eb8ba696fcc14b83a0a4c1f36e29c838521c27d7119e510cf7859a3f24d4ca4"]},"offset":"16327258"},"inspect.js":{"size":4980,"integrity":{"algorithm":"SHA256","hash":"6d0390c4508e0cb363fe97f25d41869843d7d678ef53377b17306b7cc9753046","blockSize":4194304,"blocks":["6d0390c4508e0cb363fe97f25d41869843d7d678ef53377b17306b7cc9753046"]},"offset":"16333235"},"inspect_tree.js":{"size":5080,"integrity":{"algorithm":"SHA256","hash":"51c3cf8d5e2de887c1a745c27362ba15a5c525409ef52e68595176bf4e6e910c","blockSize":4194304,"blocks":["51c3cf8d5e2de887c1a745c27362ba15a5c525409ef52e68595176bf4e6e910c"]},"offset":"16338215"},"jetpack.js":{"size":8719,"integrity":{"algorithm":"SHA256","hash":"eda79d4af11bfe7409ead68bf4f983ec8985e66d9b9140a9733924a10f22c122","blockSize":4194304,"blocks":["eda79d4af11bfe7409ead68bf4f983ec8985e66d9b9140a9733924a10f22c122"]},"offset":"16343295"},"list.js":{"size":1362,"integrity":{"algorithm":"SHA256","hash":"d3796f6f51f1131e5d4a50a0bb2301f733851fd44b9dd9c893ed78bb01b56c9c","blockSize":4194304,"blocks":["d3796f6f51f1131e5d4a50a0bb2301f733851fd44b9dd9c893ed78bb01b56c9c"]},"offset":"16352014"},"move.js":{"size":5537,"integrity":{"algorithm":"SHA256","hash":"1e57213254d595252e84b43b9ab4ada3fcd6930473dec24fd75541e5a353f998","blockSize":4194304,"blocks":["1e57213254d595252e84b43b9ab4ada3fcd6930473dec24fd75541e5a353f998"]},"offset":"16353376"},"read.js":{"size":3339,"integrity":{"algorithm":"SHA256","hash":"a5fc363bf4c88c13fa771f98196ce67e991946dbefc19da0251693e35e0bbdc9","blockSize":4194304,"blocks":["a5fc363bf4c88c13fa771f98196ce67e991946dbefc19da0251693e35e0bbdc9"]},"offset":"16358913"},"remove.js":{"size":1023,"integrity":{"algorithm":"SHA256","hash":"a39e5c464be4fa7cc25bc76c248d42f8e1c36aabcb7e3d74b9b717570c5a21e4","blockSize":4194304,"blocks":["a39e5c464be4fa7cc25bc76c248d42f8e1c36aabcb7e3d74b9b717570c5a21e4"]},"offset":"16362252"},"rename.js":{"size":1492,"integrity":{"algorithm":"SHA256","hash":"d7d58bd33b2a5397eeadc554b7b4be3e5d1db20d9738e39056819564335afaa0","blockSize":4194304,"blocks":["d7d58bd33b2a5397eeadc554b7b4be3e5d1db20d9738e39056819564335afaa0"]},"offset":"16363275"},"streams.js":{"size":140,"integrity":{"algorithm":"SHA256","hash":"cfbf298805c20a633f9490820a91eec85ff7770faa51770b026d078bf45cdf1f","blockSize":4194304,"blocks":["cfbf298805c20a633f9490820a91eec85ff7770faa51770b026d078bf45cdf1f"]},"offset":"16364767"},"symlink.js":{"size":1809,"integrity":{"algorithm":"SHA256","hash":"9550991e8566db437a383d4c5710ae6472051229df063bffcb9b9777ff04e1a0","blockSize":4194304,"blocks":["9550991e8566db437a383d4c5710ae6472051229df063bffcb9b9777ff04e1a0"]},"offset":"16364907"},"tmp_dir.js":{"size":3029,"integrity":{"algorithm":"SHA256","hash":"4a85f08d2967257105a77efb5ed80c91c6fcaef676971f0c8db3cbf6d8ddb4e0","blockSize":4194304,"blocks":["4a85f08d2967257105a77efb5ed80c91c6fcaef676971f0c8db3cbf6d8ddb4e0"]},"offset":"16366716"},"write.js":{"size":4066,"integrity":{"algorithm":"SHA256","hash":"d1066ea62ffd42b9fb2e8a50baadab38155aaa0d70e57518c16a7b5717019983","blockSize":4194304,"blocks":["d1066ea62ffd42b9fb2e8a50baadab38155aaa0d70e57518c16a7b5717019983"]},"offset":"16369745"},"utils":{"files":{"fs.js":{"size":1037,"integrity":{"algorithm":"SHA256","hash":"3bd9af1bb1200991ac9cbee55cca07fae577cdef0b0cda053c13613a82c5b8ac","blockSize":4194304,"blocks":["3bd9af1bb1200991ac9cbee55cca07fae577cdef0b0cda053c13613a82c5b8ac"]},"offset":"16373811"},"matcher.js":{"size":2330,"integrity":{"algorithm":"SHA256","hash":"07766f616978f5edf693ec7941e4fda43896452aad8c4de881aed06f838edea1","blockSize":4194304,"blocks":["07766f616978f5edf693ec7941e4fda43896452aad8c4de881aed06f838edea1"]},"offset":"16374848"},"mode.js":{"size":332,"integrity":{"algorithm":"SHA256","hash":"afc118f5597e045294d8f3fc4756d53cfd4030a4662d01745decc1ba411085a2","blockSize":4194304,"blocks":["afc118f5597e045294d8f3fc4756d53cfd4030a4662d01745decc1ba411085a2"]},"offset":"16377178"},"promisify.js":{"size":443,"integrity":{"algorithm":"SHA256","hash":"9e557eed14f6f12afc4d0c8e83064d65feeac12e271905552916b025ddcc4cd6","blockSize":4194304,"blocks":["9e557eed14f6f12afc4d0c8e83064d65feeac12e271905552916b025ddcc4cd6"]},"offset":"16377510"},"tree_walker.js":{"size":7723,"integrity":{"algorithm":"SHA256","hash":"15d853d9f276de77dd192c1008264ee67a1c8df73e1ed110a46881cdd88e836f","blockSize":4194304,"blocks":["15d853d9f276de77dd192c1008264ee67a1c8df73e1ed110a46881cdd88e836f"]},"offset":"16377953"},"validate.js":{"size":3074,"integrity":{"algorithm":"SHA256","hash":"074585c766238661ffc68e8e90ab84806a37b8b3b9c15370cfabbfa877a9b196","blockSize":4194304,"blocks":["074585c766238661ffc68e8e90ab84806a37b8b3b9c15370cfabbfa877a9b196"]},"offset":"16385676"}}}}},"node_modules":{"files":{"glob":{"files":{"LICENSE":{"size":976,"integrity":{"algorithm":"SHA256","hash":"6236fa0b88a4a0cce3dda0367979491b2052b3c8d6b1c10b3668de083e86a7f0","blockSize":4194304,"blocks":["6236fa0b88a4a0cce3dda0367979491b2052b3c8d6b1c10b3668de083e86a7f0"]},"offset":"42692761"},"common.js":{"size":6149,"integrity":{"algorithm":"SHA256","hash":"b867e089ab5d4ab19a83e5b34da3dd7f4018fdf255fcacc681aab87d41dc77e8","blockSize":4194304,"blocks":["b867e089ab5d4ab19a83e5b34da3dd7f4018fdf255fcacc681aab87d41dc77e8"]},"offset":"42693737"},"glob.js":{"size":19445,"integrity":{"algorithm":"SHA256","hash":"b8f35657ca927593d0f9e1aae3a8cfe9c33c697bf3c5733c2f6727f25ae25be1","blockSize":4194304,"blocks":["b8f35657ca927593d0f9e1aae3a8cfe9c33c697bf3c5733c2f6727f25ae25be1"]},"offset":"42699886"},"package.json":{"size":915,"integrity":{"algorithm":"SHA256","hash":"1f1d7bffc62d38e63d0a40fd879030357214c409ee2decb35e3882d8ec0aa9a7","blockSize":4194304,"blocks":["1f1d7bffc62d38e63d0a40fd879030357214c409ee2decb35e3882d8ec0aa9a7"]},"offset":"42719331"},"sync.js":{"size":12020,"integrity":{"algorithm":"SHA256","hash":"0f61227f4b55297f1ad16798c53e6a6dd55d633856f153133716413b7c5f61ad","blockSize":4194304,"blocks":["0f61227f4b55297f1ad16798c53e6a6dd55d633856f153133716413b7c5f61ad"]},"offset":"42720246"}}},"rimraf":{"files":{"LICENSE":{"size":765,"integrity":{"algorithm":"SHA256","hash":"4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b","blockSize":4194304,"blocks":["4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b"]},"offset":"42732266"},"bin.js":{"size":1196,"integrity":{"algorithm":"SHA256","hash":"6557bc0e1bebd5eedcf1cc7df314c016b6593bcdbf323941c9c5b9ea57e7eedf","blockSize":4194304,"blocks":["6557bc0e1bebd5eedcf1cc7df314c016b6593bcdbf323941c9c5b9ea57e7eedf"]},"offset":"42733031"},"package.json":{"size":496,"integrity":{"algorithm":"SHA256","hash":"c581a226e656922dab91c757a2c07481a0725e45b826a04343208ed142ebb223","blockSize":4194304,"blocks":["c581a226e656922dab91c757a2c07481a0725e45b826a04343208ed142ebb223"]},"offset":"42734227"},"rimraf.js":{"size":9225,"integrity":{"algorithm":"SHA256","hash":"39b8a308a9d3fecc1b80fb0284b1c9574cc2d9a9a02b18f0961e323d1d5cb72c","blockSize":4194304,"blocks":["39b8a308a9d3fecc1b80fb0284b1c9574cc2d9a9a02b18f0961e323d1d5cb72c"]},"offset":"42734723"}}}}}}},"fs-minipass":{"files":{"LICENSE":{"size":765,"integrity":{"algorithm":"SHA256","hash":"4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b","blockSize":4194304,"blocks":["4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b"]},"offset":"16388750"},"index.js":{"size":9990,"integrity":{"algorithm":"SHA256","hash":"4699431200b93f8fced125ce1c102a17c7b3d7ba6aaa17678d73c60da438755f","blockSize":4194304,"blocks":["4699431200b93f8fced125ce1c102a17c7b3d7ba6aaa17678d73c60da438755f"]},"offset":"16389515"},"package.json":{"size":620,"integrity":{"algorithm":"SHA256","hash":"3f0ad1252fb9c8d36ed69c691a65f40a730ece3c5edfb94f3e61513c15651e00","blockSize":4194304,"blocks":["3f0ad1252fb9c8d36ed69c691a65f40a730ece3c5edfb94f3e61513c15651e00"]},"offset":"16399505"}}},"fs.realpath":{"files":{"LICENSE":{"size":2125,"integrity":{"algorithm":"SHA256","hash":"8465b04b67f473341171b5c9c8b2c741a4a395b3f6ed58339b3a4f4db3db7472","blockSize":4194304,"blocks":["8465b04b67f473341171b5c9c8b2c741a4a395b3f6ed58339b3a4f4db3db7472"]},"offset":"16400125"},"index.js":{"size":1308,"integrity":{"algorithm":"SHA256","hash":"2e334ba43cd4852f7a3ed68159029167c05d7fa6af536e6ef177eb868ccd1bb8","blockSize":4194304,"blocks":["2e334ba43cd4852f7a3ed68159029167c05d7fa6af536e6ef177eb868ccd1bb8"]},"offset":"16402250"},"old.js":{"size":8542,"integrity":{"algorithm":"SHA256","hash":"07245a82717f9bfa2a63b9784284a1b7fc43ff5fcb4af2a94bce5f83611d4a2f","blockSize":4194304,"blocks":["07245a82717f9bfa2a63b9784284a1b7fc43ff5fcb4af2a94bce5f83611d4a2f"]},"offset":"16403558"},"package.json":{"size":460,"integrity":{"algorithm":"SHA256","hash":"2b978f9b3f8dc8d1bb3eb75ee93431cab107e1df550fe033f103a45a734becb2","blockSize":4194304,"blocks":["2b978f9b3f8dc8d1bb3eb75ee93431cab107e1df550fe033f103a45a734becb2"]},"offset":"16412100"}}},"function-bind":{"files":{".editorconfig":{"size":286,"integrity":{"algorithm":"SHA256","hash":"aa897018d852d9779a9006be21c269d556d1af2d3da23762da46a11580bd9cd1","blockSize":4194304,"blocks":["aa897018d852d9779a9006be21c269d556d1af2d3da23762da46a11580bd9cd1"]},"offset":"16412560"},".jscs.json":{"size":4140,"integrity":{"algorithm":"SHA256","hash":"bd000124a92f90f030966643efec9bc587879e3a8c19b09034167a42d304648d","blockSize":4194304,"blocks":["bd000124a92f90f030966643efec9bc587879e3a8c19b09034167a42d304648d"]},"offset":"16412846"},"LICENSE":{"size":1052,"integrity":{"algorithm":"SHA256","hash":"773e131a7684726005a7e4688a80b4620033bc08499bc1404dd1a1eb3bca725e","blockSize":4194304,"blocks":["773e131a7684726005a7e4688a80b4620033bc08499bc1404dd1a1eb3bca725e"]},"offset":"16416986"},"implementation.js":{"size":1463,"integrity":{"algorithm":"SHA256","hash":"8752a57f05844ec002c9b603529b65b35070169448adaba681150f7c97f7689d","blockSize":4194304,"blocks":["8752a57f05844ec002c9b603529b65b35070169448adaba681150f7c97f7689d"]},"offset":"16418038"},"index.js":{"size":126,"integrity":{"algorithm":"SHA256","hash":"12fa1b92429db25599f6fe118cbbb877f7f62b83cb9bfe2fc896b2d6a8110647","blockSize":4194304,"blocks":["12fa1b92429db25599f6fe118cbbb877f7f62b83cb9bfe2fc896b2d6a8110647"]},"offset":"16419501"},"package.json":{"size":857,"integrity":{"algorithm":"SHA256","hash":"ead9a4220c52568a25b998944977290a3328bb96fdbd8bb6bf4153dc64ea070f","blockSize":4194304,"blocks":["ead9a4220c52568a25b998944977290a3328bb96fdbd8bb6bf4153dc64ea070f"]},"offset":"16419627"}}},"function.prototype.name":{"files":{".editorconfig":{"size":286,"integrity":{"algorithm":"SHA256","hash":"0a73be687a86b6f0e5494b1be555fcfbb886108794948837170c28f18820aae2","blockSize":4194304,"blocks":["0a73be687a86b6f0e5494b1be555fcfbb886108794948837170c28f18820aae2"]},"offset":"16420484"},".eslintignore":{"size":10,"integrity":{"algorithm":"SHA256","hash":"5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290","blockSize":4194304,"blocks":["5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290"]},"offset":"16420770"},".nycrc":{"size":139,"integrity":{"algorithm":"SHA256","hash":"997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a","blockSize":4194304,"blocks":["997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a"]},"offset":"16420780"},"LICENSE":{"size":1081,"integrity":{"algorithm":"SHA256","hash":"acfaf437865d82f0fa9b9cdcae8b550bed8d011adaa5b42d973191caf99f62a8","blockSize":4194304,"blocks":["acfaf437865d82f0fa9b9cdcae8b550bed8d011adaa5b42d973191caf99f62a8"]},"offset":"16420919"},"auto.js":{"size":36,"integrity":{"algorithm":"SHA256","hash":"8a28142fdc864763727d7cfe6a19b5dbcdf5e1861207bd2c122082336a6c3221","blockSize":4194304,"blocks":["8a28142fdc864763727d7cfe6a19b5dbcdf5e1861207bd2c122082336a6c3221"]},"offset":"16422000"},"implementation.js":{"size":1071,"integrity":{"algorithm":"SHA256","hash":"980ad30bbacfbe61c0c2df4bbcea887a320f39062711d805e3967a9d713593a9","blockSize":4194304,"blocks":["980ad30bbacfbe61c0c2df4bbcea887a320f39062711d805e3967a9d713593a9"]},"offset":"16422036"},"index.js":{"size":374,"integrity":{"algorithm":"SHA256","hash":"91604a7dc26711c20426ca29689d0582932924284f5e7f44dbef3a4e1aee4bec","blockSize":4194304,"blocks":["91604a7dc26711c20426ca29689d0582932924284f5e7f44dbef3a4e1aee4bec"]},"offset":"16423107"},"package.json":{"size":1478,"integrity":{"algorithm":"SHA256","hash":"ce227c1b5e831818fc34b822b2f4414f6aec2e6177d23e10c58df16e1eb2db05","blockSize":4194304,"blocks":["ce227c1b5e831818fc34b822b2f4414f6aec2e6177d23e10c58df16e1eb2db05"]},"offset":"16423481"},"polyfill.js":{"size":135,"integrity":{"algorithm":"SHA256","hash":"541c1b505d279b2eb1e6f19ebfb47399afe7811473081feed02f2c7a967616ea","blockSize":4194304,"blocks":["541c1b505d279b2eb1e6f19ebfb47399afe7811473081feed02f2c7a967616ea"]},"offset":"16424959"},"shim.js":{"size":916,"integrity":{"algorithm":"SHA256","hash":"6b2cc0e1d379bded0238167030f9fb15b5cb2bc13cdfe33b3ada32277d1f371f","blockSize":4194304,"blocks":["6b2cc0e1d379bded0238167030f9fb15b5cb2bc13cdfe33b3ada32277d1f371f"]},"offset":"16425094"},"helpers":{"files":{"functionsHaveNames.js":{"size":98,"integrity":{"algorithm":"SHA256","hash":"16c587dbe6ec877cb1f92039171d9b55373d3e869b312bf433aff65572319506","blockSize":4194304,"blocks":["16c587dbe6ec877cb1f92039171d9b55373d3e869b312bf433aff65572319506"]},"offset":"16426010"}}},".github":{"files":{"FUNDING.yml":{"size":594,"integrity":{"algorithm":"SHA256","hash":"3739f090ddff499e7a2b749196afc00051caba45e4060b459892bac7b5e03822","blockSize":4194304,"blocks":["3739f090ddff499e7a2b749196afc00051caba45e4060b459892bac7b5e03822"]},"offset":"16426108"}}}}},"functions-have-names":{"files":{".editorconfig":{"size":286,"integrity":{"algorithm":"SHA256","hash":"0a73be687a86b6f0e5494b1be555fcfbb886108794948837170c28f18820aae2","blockSize":4194304,"blocks":["0a73be687a86b6f0e5494b1be555fcfbb886108794948837170c28f18820aae2"]},"offset":"16426702"},".nycrc":{"size":139,"integrity":{"algorithm":"SHA256","hash":"997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a","blockSize":4194304,"blocks":["997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a"]},"offset":"16426988"},"LICENSE":{"size":1071,"integrity":{"algorithm":"SHA256","hash":"cfc3f455254c0af0655cc3ff46a41ed644b67599f6043346169d285bf2b3cf3b","blockSize":4194304,"blocks":["cfc3f455254c0af0655cc3ff46a41ed644b67599f6043346169d285bf2b3cf3b"]},"offset":"16427127"},"index.js":{"size":774,"integrity":{"algorithm":"SHA256","hash":"0c1ab55e5265d28997a37bd9c202a7aebe2dfaa370b96e4d95a974ceb3b878af","blockSize":4194304,"blocks":["0c1ab55e5265d28997a37bd9c202a7aebe2dfaa370b96e4d95a974ceb3b878af"]},"offset":"16428198"},"package.json":{"size":911,"integrity":{"algorithm":"SHA256","hash":"7f257508d49202ce8d79064bd49a7ee22e928c754c7a64d98ad2d4451bfa3213","blockSize":4194304,"blocks":["7f257508d49202ce8d79064bd49a7ee22e928c754c7a64d98ad2d4451bfa3213"]},"offset":"16428972"},".github":{"files":{"FUNDING.yml":{"size":591,"integrity":{"algorithm":"SHA256","hash":"dd66f0410b561890e8689a67cfc7b82a02140917a0d27a65f8e66416d8815320","blockSize":4194304,"blocks":["dd66f0410b561890e8689a67cfc7b82a02140917a0d27a65f8e66416d8815320"]},"offset":"16429883"}}}}},"gauge":{"files":{"LICENSE.md":{"size":798,"integrity":{"algorithm":"SHA256","hash":"27d998b503b18cdb16c49e93da04069a99ba8a1d7e18d67146de8e242f9a6d21","blockSize":4194304,"blocks":["27d998b503b18cdb16c49e93da04069a99ba8a1d7e18d67146de8e242f9a6d21"]},"offset":"16430474"},"package.json":{"size":1092,"integrity":{"algorithm":"SHA256","hash":"aa81819648cc21a612ad3d8931febc5b9ffb0ab1578621cb8b4e2d5a59d75a09","blockSize":4194304,"blocks":["aa81819648cc21a612ad3d8931febc5b9ffb0ab1578621cb8b4e2d5a59d75a09"]},"offset":"16431272"},"lib":{"files":{"base-theme.js":{"size":424,"integrity":{"algorithm":"SHA256","hash":"7a6f7058c9f54eb3ee04ed5b3e4afad0f3abfd0b658a040e85ae8f4a455b1d5d","blockSize":4194304,"blocks":["7a6f7058c9f54eb3ee04ed5b3e4afad0f3abfd0b658a040e85ae8f4a455b1d5d"]},"offset":"16432364"},"error.js":{"size":616,"integrity":{"algorithm":"SHA256","hash":"2957dc2045a462606df224526d880fcc7a472bc992a74b0db9b23bf1984a9b20","blockSize":4194304,"blocks":["2957dc2045a462606df224526d880fcc7a472bc992a74b0db9b23bf1984a9b20"]},"offset":"16432788"},"has-color.js":{"size":99,"integrity":{"algorithm":"SHA256","hash":"bc77cc5732b948d7fe113b31ff78972d6ea336f8d15e8547542007657d41dc30","blockSize":4194304,"blocks":["bc77cc5732b948d7fe113b31ff78972d6ea336f8d15e8547542007657d41dc30"]},"offset":"16433404"},"index.js":{"size":7288,"integrity":{"algorithm":"SHA256","hash":"48deb8af788193ac8e9d6e120046be2e0a8edaaec20dc5f46572c0171aeac0fa","blockSize":4194304,"blocks":["48deb8af788193ac8e9d6e120046be2e0a8edaaec20dc5f46572c0171aeac0fa"]},"offset":"16433503"},"plumbing.js":{"size":1279,"integrity":{"algorithm":"SHA256","hash":"1e7982a4080950347c5c4a33c6a4e7e6e5a6c0ae0e0fb87301e62b48fc3a75f1","blockSize":4194304,"blocks":["1e7982a4080950347c5c4a33c6a4e7e6e5a6c0ae0e0fb87301e62b48fc3a75f1"]},"offset":"16440791"},"process.js":{"size":89,"integrity":{"algorithm":"SHA256","hash":"742bd2d12a7786e595955c8a846dbefe88591df39c2659491bddadbb8ed7dae6","blockSize":4194304,"blocks":["742bd2d12a7786e595955c8a846dbefe88591df39c2659491bddadbb8ed7dae6"]},"offset":"16442070"},"progress-bar.js":{"size":1035,"integrity":{"algorithm":"SHA256","hash":"e0bf26e14228cb79c8c763e345f0fd5b6da71e4564e1229ad2b8c40124e1d16b","blockSize":4194304,"blocks":["e0bf26e14228cb79c8c763e345f0fd5b6da71e4564e1229ad2b8c40124e1d16b"]},"offset":"16442159"},"render-template.js":{"size":5950,"integrity":{"algorithm":"SHA256","hash":"24b1e5d87bee1b0334c6b7e92c9883f8c818568c88dd3f009792d76daf5f4d65","blockSize":4194304,"blocks":["24b1e5d87bee1b0334c6b7e92c9883f8c818568c88dd3f009792d76daf5f4d65"]},"offset":"16443194"},"set-immediate.js":{"size":139,"integrity":{"algorithm":"SHA256","hash":"90dbb2e127d9b971731b2094b2516a463243e4074367dd4129fe2849ef598514","blockSize":4194304,"blocks":["90dbb2e127d9b971731b2094b2516a463243e4074367dd4129fe2849ef598514"]},"offset":"16449144"},"set-interval.js":{"size":93,"integrity":{"algorithm":"SHA256","hash":"19d2fa52118a39a7810efeb7bce45418f3e55ee7b445c85811d07a2f73b7bbb7","blockSize":4194304,"blocks":["19d2fa52118a39a7810efeb7bce45418f3e55ee7b445c85811d07a2f73b7bbb7"]},"offset":"16449283"},"spin.js":{"size":105,"integrity":{"algorithm":"SHA256","hash":"4ddb202944fd4e556edc68107b1a1f33dd25f1910876d2bf04eb5a58ae060c9d","blockSize":4194304,"blocks":["4ddb202944fd4e556edc68107b1a1f33dd25f1910876d2bf04eb5a58ae060c9d"]},"offset":"16449376"},"template-item.js":{"size":1977,"integrity":{"algorithm":"SHA256","hash":"de035282bf53b20e4a2b79a734ad9088e10d0b34bbf0d40571b138d0e144ca55","blockSize":4194304,"blocks":["de035282bf53b20e4a2b79a734ad9088e10d0b34bbf0d40571b138d0e144ca55"]},"offset":"16449481"},"theme-set.js":{"size":3720,"integrity":{"algorithm":"SHA256","hash":"f7b13a94bbc5e1796f407f6951c452192a7084663b467e735f2c9f9957292409","blockSize":4194304,"blocks":["f7b13a94bbc5e1796f407f6951c452192a7084663b467e735f2c9f9957292409"]},"offset":"16451458"},"themes.js":{"size":1667,"integrity":{"algorithm":"SHA256","hash":"6a2da219cfc714ffaacde2afb26a5dc3025baa9f984fb1191e69a2e0e0c502d8","blockSize":4194304,"blocks":["6a2da219cfc714ffaacde2afb26a5dc3025baa9f984fb1191e69a2e0e0c502d8"]},"offset":"16455178"},"wide-truncate.js":{"size":858,"integrity":{"algorithm":"SHA256","hash":"0c313fa1c5e3ac4f064993e88ce4c074106bbd4154d90f291e4c0c42d7147004","blockSize":4194304,"blocks":["0c313fa1c5e3ac4f064993e88ce4c074106bbd4154d90f291e4c0c42d7147004"]},"offset":"16456845"}}}}},"get-intrinsic":{"files":{".nycrc":{"size":139,"integrity":{"algorithm":"SHA256","hash":"997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a","blockSize":4194304,"blocks":["997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a"]},"offset":"16457703"},"LICENSE":{"size":1071,"integrity":{"algorithm":"SHA256","hash":"39c5ec504cf6bd5cd782a7c695828e09189df79f5d94840e4f08feb97b9fd416","blockSize":4194304,"blocks":["39c5ec504cf6bd5cd782a7c695828e09189df79f5d94840e4f08feb97b9fd416"]},"offset":"16457842"},"index.js":{"size":12720,"integrity":{"algorithm":"SHA256","hash":"81f6e78debe5717fd24c7fdf20be3a3d1228d3d65fd282ca567243950e3ff6f4","blockSize":4194304,"blocks":["81f6e78debe5717fd24c7fdf20be3a3d1228d3d65fd282ca567243950e3ff6f4"]},"offset":"16458913"},"package.json":{"size":1576,"integrity":{"algorithm":"SHA256","hash":"2b32de331cf61447b5ff2e85824a8b708143f6d8757e9d59ce3253cdbbaf5834","blockSize":4194304,"blocks":["2b32de331cf61447b5ff2e85824a8b708143f6d8757e9d59ce3253cdbbaf5834"]},"offset":"16471633"},".github":{"files":{"FUNDING.yml":{"size":584,"integrity":{"algorithm":"SHA256","hash":"24cafae83831c946115236f57f58e0d4797a3e7f6bcc8ad87b88a69d15a520c6","blockSize":4194304,"blocks":["24cafae83831c946115236f57f58e0d4797a3e7f6bcc8ad87b88a69d15a520c6"]},"offset":"16473209"}}}}},"get-symbol-description":{"files":{".eslintignore":{"size":10,"integrity":{"algorithm":"SHA256","hash":"5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290","blockSize":4194304,"blocks":["5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290"]},"offset":"16473793"},".nycrc":{"size":139,"integrity":{"algorithm":"SHA256","hash":"997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a","blockSize":4194304,"blocks":["997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a"]},"offset":"16473803"},"LICENSE":{"size":1067,"integrity":{"algorithm":"SHA256","hash":"e2560e002e13281578c75c850061d9255c33d16d732939e8c2db64c2506642fa","blockSize":4194304,"blocks":["e2560e002e13281578c75c850061d9255c33d16d732939e8c2db64c2506642fa"]},"offset":"16473942"},"getInferredName.js":{"size":287,"integrity":{"algorithm":"SHA256","hash":"6e287beda46279dae7c48d0cae6cb4391c843392606a172ac11e3243394dd15c","blockSize":4194304,"blocks":["6e287beda46279dae7c48d0cae6cb4391c843392606a172ac11e3243394dd15c"]},"offset":"16475009"},"index.js":{"size":1193,"integrity":{"algorithm":"SHA256","hash":"f17814667a0ed784ab795b3183486b6daef81ff1b9d2cb3b5e2516e023fd8fbc","blockSize":4194304,"blocks":["f17814667a0ed784ab795b3183486b6daef81ff1b9d2cb3b5e2516e023fd8fbc"]},"offset":"16475296"},"package.json":{"size":1337,"integrity":{"algorithm":"SHA256","hash":"494d6dcfd4100311485c79c333bcd622365ec76eeb8d95b6905236ea65d016bb","blockSize":4194304,"blocks":["494d6dcfd4100311485c79c333bcd622365ec76eeb8d95b6905236ea65d016bb"]},"offset":"16476489"},".github":{"files":{"FUNDING.yml":{"size":589,"integrity":{"algorithm":"SHA256","hash":"ce83f7650930b1cfa9591ec594dd915384f8fc8605c1aee6c41848e204ec8c60","blockSize":4194304,"blocks":["ce83f7650930b1cfa9591ec594dd915384f8fc8605c1aee6c41848e204ec8c60"]},"offset":"16477826"}}}}},"github-from-package":{"files":{"LICENSE":{"size":1073,"integrity":{"algorithm":"SHA256","hash":"435a6722c786b0a56fbe7387028f1d9d3f3a2d0fb615bb8fee118727c3f59b7b","blockSize":4194304,"blocks":["435a6722c786b0a56fbe7387028f1d9d3f3a2d0fb615bb8fee118727c3f59b7b"]},"offset":"16478415"},"index.js":{"size":406,"integrity":{"algorithm":"SHA256","hash":"b0ff829d7fd3310f3fa12a28f91d14d20cd1492758c0ee6db0ab3f068bff5806","blockSize":4194304,"blocks":["b0ff829d7fd3310f3fa12a28f91d14d20cd1492758c0ee6db0ab3f068bff5806"]},"offset":"16479488"},"package.json":{"size":522,"integrity":{"algorithm":"SHA256","hash":"3f106dde28ffc16bf1f13c2515770f44f7db11c5211b412e8c61f5892f159dfe","blockSize":4194304,"blocks":["3f106dde28ffc16bf1f13c2515770f44f7db11c5211b412e8c61f5892f159dfe"]},"offset":"16479894"}}},"glob":{"files":{"LICENSE":{"size":775,"integrity":{"algorithm":"SHA256","hash":"dedc5ba48845093da9bbe6f2bb0b3cc87d9829c7d49d55c2dfe661671364d821","blockSize":4194304,"blocks":["dedc5ba48845093da9bbe6f2bb0b3cc87d9829c7d49d55c2dfe661671364d821"]},"offset":"16480416"},"common.js":{"size":6176,"integrity":{"algorithm":"SHA256","hash":"10320f4253c0f68b017721efa5d14adaec23ee377552a9e6bc411b11a603adae","blockSize":4194304,"blocks":["10320f4253c0f68b017721efa5d14adaec23ee377552a9e6bc411b11a603adae"]},"offset":"16481191"},"glob.js":{"size":19444,"integrity":{"algorithm":"SHA256","hash":"bd2784a474bde9f782753c79c821a20b11a448df4b50f32b5ebcaf92f8f02d4d","blockSize":4194304,"blocks":["bd2784a474bde9f782753c79c821a20b11a448df4b50f32b5ebcaf92f8f02d4d"]},"offset":"16487367"},"package.json":{"size":915,"integrity":{"algorithm":"SHA256","hash":"03da49919aedf22aa811106a028701fa7a7bb45e6d5c8667d1dd3fd49f0ed0eb","blockSize":4194304,"blocks":["03da49919aedf22aa811106a028701fa7a7bb45e6d5c8667d1dd3fd49f0ed0eb"]},"offset":"16506811"},"sync.js":{"size":12019,"integrity":{"algorithm":"SHA256","hash":"b1e2a092e21d73699e51d6f3c0c1cda90d75d1601757be158a85d01872578138","blockSize":4194304,"blocks":["b1e2a092e21d73699e51d6f3c0c1cda90d75d1601757be158a85d01872578138"]},"offset":"16507726"},"node_modules":{"files":{"brace-expansion":{"files":{"LICENSE":{"size":1096,"integrity":{"algorithm":"SHA256","hash":"68f12f6e2c33688699249c01d8f9623c534da20aa71989c57b061b7bc1676d14","blockSize":4194304,"blocks":["68f12f6e2c33688699249c01d8f9623c534da20aa71989c57b061b7bc1676d14"]},"offset":"42743948"},"index.js":{"size":4992,"integrity":{"algorithm":"SHA256","hash":"6f6a12f42623bf53b6561d46c5e37c0f26b6471ba53e83c3b933fb2c2f139742","blockSize":4194304,"blocks":["6f6a12f42623bf53b6561d46c5e37c0f26b6471ba53e83c3b933fb2c2f139742"]},"offset":"42745044"},"package.json":{"size":942,"integrity":{"algorithm":"SHA256","hash":"001274c8d31ee495bd9445f14d13232ea9b1d48785e7cc6248d6226c254cf35c","blockSize":4194304,"blocks":["001274c8d31ee495bd9445f14d13232ea9b1d48785e7cc6248d6226c254cf35c"]},"offset":"42750036"},".github":{"files":{"FUNDING.yml":{"size":54,"integrity":{"algorithm":"SHA256","hash":"8ee36ea6d63567ca62e3edb1323a49d4f865852811758ac42bfe26a96745a66f","blockSize":4194304,"blocks":["8ee36ea6d63567ca62e3edb1323a49d4f865852811758ac42bfe26a96745a66f"]},"offset":"42750978"}}}}},"minimatch":{"files":{"LICENSE":{"size":775,"integrity":{"algorithm":"SHA256","hash":"7dfb824b6e6c78f9a795ba41a373d36fdff0e70b86b2a14412c7905dca025ea7","blockSize":4194304,"blocks":["7dfb824b6e6c78f9a795ba41a373d36fdff0e70b86b2a14412c7905dca025ea7"]},"offset":"42751032"},"minimatch.js":{"size":27422,"integrity":{"algorithm":"SHA256","hash":"f9422b0cd964c364b245ddb691779c36f7e907d73b1e3212f72c716ac297ea7c","blockSize":4194304,"blocks":["f9422b0cd964c364b245ddb691779c36f7e907d73b1e3212f72c716ac297ea7c"]},"offset":"42751807"},"package.json":{"size":494,"integrity":{"algorithm":"SHA256","hash":"a4765328c3299907cc2cc9dc69ab8bf7e895174e43942d2af8802ffc919f6752","blockSize":4194304,"blocks":["a4765328c3299907cc2cc9dc69ab8bf7e895174e43942d2af8802ffc919f6752"]},"offset":"42779229"},"lib":{"files":{"path.js":{"size":151,"integrity":{"algorithm":"SHA256","hash":"ac5d377288c45e5c5ea8b2deb593a5083a71d672099b52a9bf4a75d35de69e54","blockSize":4194304,"blocks":["ac5d377288c45e5c5ea8b2deb593a5083a71d672099b52a9bf4a75d35de69e54"]},"offset":"42779723"}}}}}}}}},"globalthis":{"files":{".nycrc":{"size":149,"integrity":{"algorithm":"SHA256","hash":"a9f4d73a4f71c06a47fa07bf652938d90f174968f134d252fffd85dc0da60575","blockSize":4194304,"blocks":["a9f4d73a4f71c06a47fa07bf652938d90f174968f134d252fffd85dc0da60575"]},"offset":"16519745"},"LICENSE":{"size":1081,"integrity":{"algorithm":"SHA256","hash":"acfaf437865d82f0fa9b9cdcae8b550bed8d011adaa5b42d973191caf99f62a8","blockSize":4194304,"blocks":["acfaf437865d82f0fa9b9cdcae8b550bed8d011adaa5b42d973191caf99f62a8"]},"offset":"16519894"},"auto.js":{"size":36,"integrity":{"algorithm":"SHA256","hash":"8a28142fdc864763727d7cfe6a19b5dbcdf5e1861207bd2c122082336a6c3221","blockSize":4194304,"blocks":["8a28142fdc864763727d7cfe6a19b5dbcdf5e1861207bd2c122082336a6c3221"]},"offset":"16520975"},"implementation.browser.js":{"size":254,"integrity":{"algorithm":"SHA256","hash":"7549e9f274d96f25bc20cbd098417124d87224bbc8cf47c431d018d3fec81c42","blockSize":4194304,"blocks":["7549e9f274d96f25bc20cbd098417124d87224bbc8cf47c431d018d3fec81c42"]},"offset":"16521011"},"implementation.js":{"size":40,"integrity":{"algorithm":"SHA256","hash":"d8c28da71c97b9076a28c3a7afe277d85e36b73dc4ee65eadf34f7761855530d","blockSize":4194304,"blocks":["d8c28da71c97b9076a28c3a7afe277d85e36b73dc4ee65eadf34f7761855530d"]},"offset":"16521265"},"index.js":{"size":408,"integrity":{"algorithm":"SHA256","hash":"2fd9161dbac0c3c51417bf7b4efd33507d33c6be827a9f7104e03360957bce19","blockSize":4194304,"blocks":["2fd9161dbac0c3c51417bf7b4efd33507d33c6be827a9f7104e03360957bce19"]},"offset":"16521305"},"package.json":{"size":1627,"integrity":{"algorithm":"SHA256","hash":"5472a199d853863bfb5a161e89de04cc278b1057c221941dafa8c8309eb2f0e1","blockSize":4194304,"blocks":["5472a199d853863bfb5a161e89de04cc278b1057c221941dafa8c8309eb2f0e1"]},"offset":"16521713"},"polyfill.js":{"size":251,"integrity":{"algorithm":"SHA256","hash":"5ee48a1156ad2b2e8e84def305aae470bf211becb4afff96d5a289484a7a0446","blockSize":4194304,"blocks":["5ee48a1156ad2b2e8e84def305aae470bf211becb4afff96d5a289484a7a0446"]},"offset":"16523340"},"shim.js":{"size":722,"integrity":{"algorithm":"SHA256","hash":"1d08e9d93eca82edeaf7ad9881317b880a0bd103a89c9ac6cdb6b8da4f54647b","blockSize":4194304,"blocks":["1d08e9d93eca82edeaf7ad9881317b880a0bd103a89c9ac6cdb6b8da4f54647b"]},"offset":"16523591"}}},"graceful-fs":{"files":{"LICENSE":{"size":791,"integrity":{"algorithm":"SHA256","hash":"f65c5d9f22a317b2a10803bd1868461ce6499c2ed7217bc80c0cc772a748789c","blockSize":4194304,"blocks":["f65c5d9f22a317b2a10803bd1868461ce6499c2ed7217bc80c0cc772a748789c"]},"offset":"16524313"},"clone.js":{"size":496,"integrity":{"algorithm":"SHA256","hash":"7258eca52e65d69845759503f9fdd66c252f40e5eafb76db5d481172e31ac9ed","blockSize":4194304,"blocks":["7258eca52e65d69845759503f9fdd66c252f40e5eafb76db5d481172e31ac9ed"]},"offset":"16525104"},"graceful-fs.js":{"size":12680,"integrity":{"algorithm":"SHA256","hash":"7da35669b6b6b0e4aafee31674c033f2cebb0c8f9ae010f709dcc185d3f17786","blockSize":4194304,"blocks":["7da35669b6b6b0e4aafee31674c033f2cebb0c8f9ae010f709dcc185d3f17786"]},"offset":"16525600"},"legacy-streams.js":{"size":2655,"integrity":{"algorithm":"SHA256","hash":"60a6a7ecf7c3e55a3ffaae13433b6cff388b7205bba6daf393c863f77a949e36","blockSize":4194304,"blocks":["60a6a7ecf7c3e55a3ffaae13433b6cff388b7205bba6daf393c863f77a949e36"]},"offset":"16538280"},"package.json":{"size":558,"integrity":{"algorithm":"SHA256","hash":"27e5aa99c279321afdaa8af303f8087f6e9626ae71d7e9640b0fbc544ac3bcea","blockSize":4194304,"blocks":["27e5aa99c279321afdaa8af303f8087f6e9626ae71d7e9640b0fbc544ac3bcea"]},"offset":"16540935"},"polyfills.js":{"size":10118,"integrity":{"algorithm":"SHA256","hash":"45e9c6ccf0bf3813ec401538b47b70998563b249b0c7b71ba637c687b180cfed","blockSize":4194304,"blocks":["45e9c6ccf0bf3813ec401538b47b70998563b249b0c7b71ba637c687b180cfed"]},"offset":"16541493"}}},"has":{"files":{"LICENSE-MIT":{"size":1060,"integrity":{"algorithm":"SHA256","hash":"4fe5fd7b3318def0b74f8bf8c9276403f01da628fa8888822661519d80f237d3","blockSize":4194304,"blocks":["4fe5fd7b3318def0b74f8bf8c9276403f01da628fa8888822661519d80f237d3"]},"offset":"16551611"},"package.json":{"size":705,"integrity":{"algorithm":"SHA256","hash":"5d32931493cc4a0c385307281863fefc2f3e89fb5c00165e1435bd21600349e1","blockSize":4194304,"blocks":["5d32931493cc4a0c385307281863fefc2f3e89fb5c00165e1435bd21600349e1"]},"offset":"16552671"},"src":{"files":{"index.js":{"size":129,"integrity":{"algorithm":"SHA256","hash":"d4fa3ffe19a4722028a3d34982b75eae4d6d2c45d737e7967ffba9ce13515c4c","blockSize":4194304,"blocks":["d4fa3ffe19a4722028a3d34982b75eae4d6d2c45d737e7967ffba9ce13515c4c"]},"offset":"16553376"}}}}},"has-bigints":{"files":{".nycrc":{"size":139,"integrity":{"algorithm":"SHA256","hash":"997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a","blockSize":4194304,"blocks":["997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a"]},"offset":"16553505"},"LICENSE":{"size":1071,"integrity":{"algorithm":"SHA256","hash":"cfc3f455254c0af0655cc3ff46a41ed644b67599f6043346169d285bf2b3cf3b","blockSize":4194304,"blocks":["cfc3f455254c0af0655cc3ff46a41ed644b67599f6043346169d285bf2b3cf3b"]},"offset":"16553644"},"index.js":{"size":347,"integrity":{"algorithm":"SHA256","hash":"33a14ef8c6ed3714ad1ba730db55b1cc57533659ae7ba0d1e170b201a070c865","blockSize":4194304,"blocks":["33a14ef8c6ed3714ad1ba730db55b1cc57533659ae7ba0d1e170b201a070c865"]},"offset":"16554715"},"package.json":{"size":889,"integrity":{"algorithm":"SHA256","hash":"823bb400a2d4936e8ebdec68cf5856d83606b3fb08276e337e18106e4457cacf","blockSize":4194304,"blocks":["823bb400a2d4936e8ebdec68cf5856d83606b3fb08276e337e18106e4457cacf"]},"offset":"16555062"},".github":{"files":{"FUNDING.yml":{"size":582,"integrity":{"algorithm":"SHA256","hash":"1093cb6a97c6d2ad2529a700a26908619a3b06816afc2ad3d6646c90b696b5b0","blockSize":4194304,"blocks":["1093cb6a97c6d2ad2529a700a26908619a3b06816afc2ad3d6646c90b696b5b0"]},"offset":"16555951"}}}}},"has-property-descriptors":{"files":{".nycrc":{"size":139,"integrity":{"algorithm":"SHA256","hash":"997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a","blockSize":4194304,"blocks":["997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a"]},"offset":"16556533"},"LICENSE":{"size":1067,"integrity":{"algorithm":"SHA256","hash":"0f0ca96f50793990031ebc488a38f7292ff70bce8ab6a8e5eeda674abc32ccdf","blockSize":4194304,"blocks":["0f0ca96f50793990031ebc488a38f7292ff70bce8ab6a8e5eeda674abc32ccdf"]},"offset":"16556672"},"index.js":{"size":817,"integrity":{"algorithm":"SHA256","hash":"e01a60e8962305cdf917e315e2d00b4ac5a2faf63f251b493b5d411fde2f0649","blockSize":4194304,"blocks":["e01a60e8962305cdf917e315e2d00b4ac5a2faf63f251b493b5d411fde2f0649"]},"offset":"16557739"},"package.json":{"size":1223,"integrity":{"algorithm":"SHA256","hash":"b642b088c101987f6295c6626e881a1eade281382fec8ad7284198d88e541088","blockSize":4194304,"blocks":["b642b088c101987f6295c6626e881a1eade281382fec8ad7284198d88e541088"]},"offset":"16558556"},".github":{"files":{"FUNDING.yml":{"size":595,"integrity":{"algorithm":"SHA256","hash":"aac113d18c37526f0d5d92f28d9be805d85037520e9d4b822a20cfe71d9acd40","blockSize":4194304,"blocks":["aac113d18c37526f0d5d92f28d9be805d85037520e9d4b822a20cfe71d9acd40"]},"offset":"16559779"}}}}},"has-symbols":{"files":{".nycrc":{"size":139,"integrity":{"algorithm":"SHA256","hash":"997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a","blockSize":4194304,"blocks":["997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a"]},"offset":"16560374"},"LICENSE":{"size":1071,"integrity":{"algorithm":"SHA256","hash":"206c1adcf206dc0031b11232f5b054ec5f1662407ab1ca415247921cab2068ab","blockSize":4194304,"blocks":["206c1adcf206dc0031b11232f5b054ec5f1662407ab1ca415247921cab2068ab"]},"offset":"16560513"},"index.js":{"size":420,"integrity":{"algorithm":"SHA256","hash":"2874f6cf003018e7b47626144b9f7cb2264a8519c71aaab88562815b2416d3d2","blockSize":4194304,"blocks":["2874f6cf003018e7b47626144b9f7cb2264a8519c71aaab88562815b2416d3d2"]},"offset":"16561584"},"package.json":{"size":1543,"integrity":{"algorithm":"SHA256","hash":"ddbe532b9df797ebce3e17cd76ff530a738639f13f54476e64f18abcd33af1d1","blockSize":4194304,"blocks":["ddbe532b9df797ebce3e17cd76ff530a738639f13f54476e64f18abcd33af1d1"]},"offset":"16562004"},"shams.js":{"size":1761,"integrity":{"algorithm":"SHA256","hash":"5ba1a47350dce55be2c198c791df52fa013bac2ad8d7dcd7d67726c08a4231f1","blockSize":4194304,"blocks":["5ba1a47350dce55be2c198c791df52fa013bac2ad8d7dcd7d67726c08a4231f1"]},"offset":"16563547"},".github":{"files":{"FUNDING.yml":{"size":582,"integrity":{"algorithm":"SHA256","hash":"e777d06bafdcd1d459abcbdc03ac52357b59c248614dc6143d8d02ebfb4aef15","blockSize":4194304,"blocks":["e777d06bafdcd1d459abcbdc03ac52357b59c248614dc6143d8d02ebfb4aef15"]},"offset":"16565308"}}}}},"has-tostringtag":{"files":{"LICENSE":{"size":1067,"integrity":{"algorithm":"SHA256","hash":"e2560e002e13281578c75c850061d9255c33d16d732939e8c2db64c2506642fa","blockSize":4194304,"blocks":["e2560e002e13281578c75c850061d9255c33d16d732939e8c2db64c2506642fa"]},"offset":"16565890"},"index.js":{"size":169,"integrity":{"algorithm":"SHA256","hash":"4780e93025debf8a7c2533cfccef7cc716d0deedcdf66b36d8321c0f1edb5d46","blockSize":4194304,"blocks":["4780e93025debf8a7c2533cfccef7cc716d0deedcdf66b36d8321c0f1edb5d46"]},"offset":"16566957"},"package.json":{"size":1260,"integrity":{"algorithm":"SHA256","hash":"780125f0427ee38a2f3db4939de12372dd80f067199bf42f326310d6e32b3bee","blockSize":4194304,"blocks":["780125f0427ee38a2f3db4939de12372dd80f067199bf42f326310d6e32b3bee"]},"offset":"16567126"},"shams.js":{"size":162,"integrity":{"algorithm":"SHA256","hash":"2dc4bacca03e685cecf26f212048d7d82c219b4966da348f99691a682239b847","blockSize":4194304,"blocks":["2dc4bacca03e685cecf26f212048d7d82c219b4966da348f99691a682239b847"]},"offset":"16568386"},".github":{"files":{"FUNDING.yml":{"size":586,"integrity":{"algorithm":"SHA256","hash":"5af2fc8a34665542659d4ce1520f5df2054affc3754edc49001e65d0c200e2e5","blockSize":4194304,"blocks":["5af2fc8a34665542659d4ce1520f5df2054affc3754edc49001e65d0c200e2e5"]},"offset":"16568548"}}}}},"has-unicode":{"files":{"LICENSE":{"size":752,"integrity":{"algorithm":"SHA256","hash":"7c9c21c620f09fa0897060a50ae3b02da7677338c72cbe399dbe417d74899974","blockSize":4194304,"blocks":["7c9c21c620f09fa0897060a50ae3b02da7677338c72cbe399dbe417d74899974"]},"offset":"16569134"},"index.js":{"size":657,"integrity":{"algorithm":"SHA256","hash":"f7055f40138c028925ca76b74ea5a4041b4d67d2fa4dae2f78c2ec326ebc2bf3","blockSize":4194304,"blocks":["f7055f40138c028925ca76b74ea5a4041b4d67d2fa4dae2f78c2ec326ebc2bf3"]},"offset":"16569886"},"package.json":{"size":465,"integrity":{"algorithm":"SHA256","hash":"19c92edb67a7b3d085f97b084dd5a36541d8160c0dab6821331202f0f35d524f","blockSize":4194304,"blocks":["19c92edb67a7b3d085f97b084dd5a36541d8160c0dab6821331202f0f35d524f"]},"offset":"16570543"}}},"hostname-patcher":{"files":{"LICENSE":{"size":1075,"integrity":{"algorithm":"SHA256","hash":"7f5b14a890fc05b278075f83944a89798f72df4756b29de289b17fef3f191703","blockSize":4194304,"blocks":["7f5b14a890fc05b278075f83944a89798f72df4756b29de289b17fef3f191703"]},"offset":"16571008"},"package.json":{"size":507,"integrity":{"algorithm":"SHA256","hash":"35f7d5b38478d13f55f0f53bc1acaccb8bb2e357beefdfe6f38c4d128f5f6c6b","blockSize":4194304,"blocks":["35f7d5b38478d13f55f0f53bc1acaccb8bb2e357beefdfe6f38c4d128f5f6c6b"]},"offset":"16572083"},"publish.js":{"size":345,"integrity":{"algorithm":"SHA256","hash":"d0003982bb289862fdf3b81c74f52dc433766466058332e91e6efae07b96dcc2","blockSize":4194304,"blocks":["d0003982bb289862fdf3b81c74f52dc433766466058332e91e6efae07b96dcc2"]},"offset":"16572590"},"lib":{"files":{"index.js":{"size":346,"integrity":{"algorithm":"SHA256","hash":"9a337a58020adf6dd4871c5c5854068e733b5deaa7348f5055f04b358d4fb285","blockSize":4194304,"blocks":["9a337a58020adf6dd4871c5c5854068e733b5deaa7348f5055f04b358d4fb285"]},"offset":"16572935"},"utils.js":{"size":679,"integrity":{"algorithm":"SHA256","hash":"5ef922f52e94e082ba0bd766ffe5039ad4b8d0ecac83af8cabeb9a60254d160d","blockSize":4194304,"blocks":["5ef922f52e94e082ba0bd766ffe5039ad4b8d0ecac83af8cabeb9a60254d160d"]},"offset":"16573281"}}},".github":{"files":{"workflows":{"files":{"publish.yml":{"size":474,"integrity":{"algorithm":"SHA256","hash":"e525bb57f0e67e2de81a22ef6c38ac717860fca61814b8ddbcd936114f68dbcd","blockSize":4194304,"blocks":["e525bb57f0e67e2de81a22ef6c38ac717860fca61814b8ddbcd936114f68dbcd"]},"offset":"16573960"}}}}}}},"http-cache-semantics":{"files":{"LICENSE":{"size":1274,"integrity":{"algorithm":"SHA256","hash":"ab868ad5a2ef5068560d9cd3b2180ec63c140bb4c5cae1ba779d300a0ac74fa3","blockSize":4194304,"blocks":["ab868ad5a2ef5068560d9cd3b2180ec63c140bb4c5cae1ba779d300a0ac74fa3"]},"offset":"16574434"},"index.js":{"size":23786,"integrity":{"algorithm":"SHA256","hash":"e7d167742a107d01ef06b1d392f759a7a655345608c5d9fb0dfffd90c590abb8","blockSize":4194304,"blocks":["e7d167742a107d01ef06b1d392f759a7a655345608c5d9fb0dfffd90c590abb8"]},"offset":"16575708"},"package.json":{"size":630,"integrity":{"algorithm":"SHA256","hash":"3fa071d3b8ff8d52775b1ee8f6ec124578be30b3f8986382b3f1b7e36e364af5","blockSize":4194304,"blocks":["3fa071d3b8ff8d52775b1ee8f6ec124578be30b3f8986382b3f1b7e36e364af5"]},"offset":"16599494"}}},"http-errors":{"files":{"HISTORY.md":{"size":3973,"integrity":{"algorithm":"SHA256","hash":"990ff24ab4cd1ebf895f185934fc5e15c093aad29db8e1f0db6cb678422edaeb","blockSize":4194304,"blocks":["990ff24ab4cd1ebf895f185934fc5e15c093aad29db8e1f0db6cb678422edaeb"]},"offset":"16600124"},"LICENSE":{"size":1168,"integrity":{"algorithm":"SHA256","hash":"dcb94ff9b1e037a847bc20589dc81a1066d041fd4c16deb18b0fa968c66cf395","blockSize":4194304,"blocks":["dcb94ff9b1e037a847bc20589dc81a1066d041fd4c16deb18b0fa968c66cf395"]},"offset":"16604097"},"index.js":{"size":6391,"integrity":{"algorithm":"SHA256","hash":"0f484a62f0587e00002f3fd194b1aca9bcdd1881fcb3250e98b5ac17df7dd1fd","blockSize":4194304,"blocks":["0f484a62f0587e00002f3fd194b1aca9bcdd1881fcb3250e98b5ac17df7dd1fd"]},"offset":"16605265"},"package.json":{"size":830,"integrity":{"algorithm":"SHA256","hash":"ffe2707bc816bd40510dfd344d409eb6480edfb072a506633acef4daecadb5a2","blockSize":4194304,"blocks":["ffe2707bc816bd40510dfd344d409eb6480edfb072a506633acef4daecadb5a2"]},"offset":"16611656"}}},"http-proxy-agent":{"files":{"package.json":{"size":1086,"integrity":{"algorithm":"SHA256","hash":"a455edd173ad42e77fd6d0843b8d7784ffa0e7b78b544191890609a9eaa42051","blockSize":4194304,"blocks":["a455edd173ad42e77fd6d0843b8d7784ffa0e7b78b544191890609a9eaa42051"]},"offset":"16612486"},"dist":{"files":{"agent.js":{"size":6600,"integrity":{"algorithm":"SHA256","hash":"bf15503401b556d1b17c1ee2d94351b112a755a99eaf1891068923a549ccaca7","blockSize":4194304,"blocks":["bf15503401b556d1b17c1ee2d94351b112a755a99eaf1891068923a549ccaca7"]},"offset":"16613572"},"index.js":{"size":571,"integrity":{"algorithm":"SHA256","hash":"37c871632157431d22c0667a1688d54644e5d8172400cf21c747dd2f46cc4f47","blockSize":4194304,"blocks":["37c871632157431d22c0667a1688d54644e5d8172400cf21c747dd2f46cc4f47"]},"offset":"16620172"}}}}},"https-proxy-agent":{"files":{"package.json":{"size":1047,"integrity":{"algorithm":"SHA256","hash":"5cb594f8198cff9c055f9fd0be3564d1230b4df27a40fe5279772dfdc4da874f","blockSize":4194304,"blocks":["5cb594f8198cff9c055f9fd0be3564d1230b4df27a40fe5279772dfdc4da874f"]},"offset":"16620743"},"dist":{"files":{"agent.js":{"size":7841,"integrity":{"algorithm":"SHA256","hash":"cdf5601776256dee031a1275186c409578ddba5aa441e66c0bea785f81e185e6","blockSize":4194304,"blocks":["cdf5601776256dee031a1275186c409578ddba5aa441e66c0bea785f81e185e6"]},"offset":"16621790"},"index.js":{"size":579,"integrity":{"algorithm":"SHA256","hash":"7f18e187a92bf3691b1728523ad5863f08ace4d25599535e1471f1f81e90f2cd","blockSize":4194304,"blocks":["7f18e187a92bf3691b1728523ad5863f08ace4d25599535e1471f1f81e90f2cd"]},"offset":"16629631"},"parse-proxy-response.js":{"size":2460,"integrity":{"algorithm":"SHA256","hash":"24c1737b73db4c109a4cb184ca768b4e85f6cc6cfcc74ed3836388a995b3e557","blockSize":4194304,"blocks":["24c1737b73db4c109a4cb184ca768b4e85f6cc6cfcc74ed3836388a995b3e557"]},"offset":"16630210"}}}}},"humanize-ms":{"files":{"History.md":{"size":368,"integrity":{"algorithm":"SHA256","hash":"73e3eba013710960595a6a2e4c578b01499a619006987a76fb0e29ad40f31fe6","blockSize":4194304,"blocks":["73e3eba013710960595a6a2e4c578b01499a619006987a76fb0e29ad40f31fe6"]},"offset":"16632670"},"LICENSE":{"size":1023,"integrity":{"algorithm":"SHA256","hash":"89807acf2309bd285f033404ee78581602f3cd9b819a16ac2f0e5f60ff4a473e","blockSize":4194304,"blocks":["89807acf2309bd285f033404ee78581602f3cd9b819a16ac2f0e5f60ff4a473e"]},"offset":"16633038"},"index.js":{"size":442,"integrity":{"algorithm":"SHA256","hash":"6bd41ec8e67091cca5753ed4edecc8da219c28e006857544f629a1861226006d","blockSize":4194304,"blocks":["6bd41ec8e67091cca5753ed4edecc8da219c28e006857544f629a1861226006d"]},"offset":"16634061"},"package.json":{"size":595,"integrity":{"algorithm":"SHA256","hash":"3e5388cb56010557a8ef7ed4259feb69f3f49c5a1022a5c2d99b61b5dccbdc0c","blockSize":4194304,"blocks":["3e5388cb56010557a8ef7ed4259feb69f3f49c5a1022a5c2d99b61b5dccbdc0c"]},"offset":"16634503"}}},"iconv-lite":{"files":{"LICENSE":{"size":1064,"integrity":{"algorithm":"SHA256","hash":"ac779f7314c74f232ef847ea86e714abe25cf6eeb5cc97b69451b74e2af6492d","blockSize":4194304,"blocks":["ac779f7314c74f232ef847ea86e714abe25cf6eeb5cc97b69451b74e2af6492d"]},"offset":"16635098"},"package.json":{"size":770,"integrity":{"algorithm":"SHA256","hash":"669fa9ded7d349c628b3de248aae9f0360dfc88b9ee989e23d21258ca5d57803","blockSize":4194304,"blocks":["669fa9ded7d349c628b3de248aae9f0360dfc88b9ee989e23d21258ca5d57803"]},"offset":"16636162"},"lib":{"files":{"bom-handling.js":{"size":1109,"integrity":{"algorithm":"SHA256","hash":"c230d25d8e7fbb50960c634b636b71327c409e9a77e67fe9446b566bdcea362d","blockSize":4194304,"blocks":["c230d25d8e7fbb50960c634b636b71327c409e9a77e67fe9446b566bdcea362d"]},"offset":"16636932"},"index.js":{"size":6321,"integrity":{"algorithm":"SHA256","hash":"0cb1506e70126aa00bc5bdf12f2200db89db032e8dabf23dcdd6a92b37d0f2af","blockSize":4194304,"blocks":["0cb1506e70126aa00bc5bdf12f2200db89db032e8dabf23dcdd6a92b37d0f2af"]},"offset":"16638041"},"streams.js":{"size":3380,"integrity":{"algorithm":"SHA256","hash":"368596cfa80b9b9c6b93f2fde73615f10e89d650e6a1c92d3c07d56c34e4e393","blockSize":4194304,"blocks":["368596cfa80b9b9c6b93f2fde73615f10e89d650e6a1c92d3c07d56c34e4e393"]},"offset":"16644362"}}},"encodings":{"files":{"dbcs-codec.js":{"size":23065,"integrity":{"algorithm":"SHA256","hash":"709d9d2e467540b9414ae53f72e43780f9a49fbf648d9a81983eacd34f501e25","blockSize":4194304,"blocks":["709d9d2e467540b9414ae53f72e43780f9a49fbf648d9a81983eacd34f501e25"]},"offset":"16647742"},"dbcs-data.js":{"size":9389,"integrity":{"algorithm":"SHA256","hash":"9d02b706a5f5411e2cf52b5191971b93f6b05b19d7529d829ebd17a1e060e158","blockSize":4194304,"blocks":["9d02b706a5f5411e2cf52b5191971b93f6b05b19d7529d829ebd17a1e060e158"]},"offset":"16670807"},"index.js":{"size":733,"integrity":{"algorithm":"SHA256","hash":"ee406729fdea34f4c77eea5afad5025ea374bc41089fafb6fa0f7336e1216713","blockSize":4194304,"blocks":["ee406729fdea34f4c77eea5afad5025ea374bc41089fafb6fa0f7336e1216713"]},"offset":"16680196"},"internal.js":{"size":6309,"integrity":{"algorithm":"SHA256","hash":"78b012b90e43a9d4648d0526f46e26bf07c572bbd3ae5eaedacb244e343609c5","blockSize":4194304,"blocks":["78b012b90e43a9d4648d0526f46e26bf07c572bbd3ae5eaedacb244e343609c5"]},"offset":"16680929"},"sbcs-codec.js":{"size":2191,"integrity":{"algorithm":"SHA256","hash":"fb511c4c70a6cb0e2a06d03e67ca88dca9f4da6266b909c7338e453d2ecc9fdb","blockSize":4194304,"blocks":["fb511c4c70a6cb0e2a06d03e67ca88dca9f4da6266b909c7338e453d2ecc9fdb"]},"offset":"16687238"},"sbcs-data-generated.js":{"size":32034,"integrity":{"algorithm":"SHA256","hash":"2cf44b3f70c61c9cdd59fda7ec085bc3180809638f208c7239688ccb90a48866","blockSize":4194304,"blocks":["2cf44b3f70c61c9cdd59fda7ec085bc3180809638f208c7239688ccb90a48866"]},"offset":"16689429"},"sbcs-data.js":{"size":5116,"integrity":{"algorithm":"SHA256","hash":"ecd0497db604060a3bf432ea4e2bde76a427dcb6afcedc05c24567773eb0d25c","blockSize":4194304,"blocks":["ecd0497db604060a3bf432ea4e2bde76a427dcb6afcedc05c24567773eb0d25c"]},"offset":"16721463"},"utf16.js":{"size":5502,"integrity":{"algorithm":"SHA256","hash":"506eabee3546c0551f78e6adb3102f4e73e7312b4c709117d0da016b0f5b3d80","blockSize":4194304,"blocks":["506eabee3546c0551f78e6adb3102f4e73e7312b4c709117d0da016b0f5b3d80"]},"offset":"16726579"},"utf32.js":{"size":9982,"integrity":{"algorithm":"SHA256","hash":"3a762514744c1edcaf5262f77df105f89581c1292b8321b6f96ad49e9244d95a","blockSize":4194304,"blocks":["3a762514744c1edcaf5262f77df105f89581c1292b8321b6f96ad49e9244d95a"]},"offset":"16732081"},"utf7.js":{"size":9283,"integrity":{"algorithm":"SHA256","hash":"289da5c0c44b1ec4a502e2862ee9e46d9b1758420904385fed0abae41f138a6c","blockSize":4194304,"blocks":["289da5c0c44b1ec4a502e2862ee9e46d9b1758420904385fed0abae41f138a6c"]},"offset":"16742063"},"tables":{"files":{"big5-added.json":{"size":17717,"integrity":{"algorithm":"SHA256","hash":"db94db5e5d3ab696ddb0025685cfa85da1864839a4a26aab2f8f86f6b8382288","blockSize":4194304,"blocks":["db94db5e5d3ab696ddb0025685cfa85da1864839a4a26aab2f8f86f6b8382288"]},"offset":"16751346"},"cp936.json":{"size":47320,"integrity":{"algorithm":"SHA256","hash":"8225bb693efd380279ed7280b8f8419fd069c5f018d20d5946bf187ad92c0cf7","blockSize":4194304,"blocks":["8225bb693efd380279ed7280b8f8419fd069c5f018d20d5946bf187ad92c0cf7"]},"offset":"16769063"},"cp949.json":{"size":38122,"integrity":{"algorithm":"SHA256","hash":"77a56ea83d0d94d1dc620042ad3c897f0e40814bb05c0085d3aeed0018e8a3e8","blockSize":4194304,"blocks":["77a56ea83d0d94d1dc620042ad3c897f0e40814bb05c0085d3aeed0018e8a3e8"]},"offset":"16816383"},"cp950.json":{"size":42356,"integrity":{"algorithm":"SHA256","hash":"99e2114dc4b39092617967c763f9eaeb4d8e70551afc5884baa3fb92827f3420","blockSize":4194304,"blocks":["99e2114dc4b39092617967c763f9eaeb4d8e70551afc5884baa3fb92827f3420"]},"offset":"16854505"},"eucjp.json":{"size":41064,"integrity":{"algorithm":"SHA256","hash":"7c4fe279000f7e99fc7cd59afb1da21725dcebdc1babd9e3b883253a77abb042","blockSize":4194304,"blocks":["7c4fe279000f7e99fc7cd59afb1da21725dcebdc1babd9e3b883253a77abb042"]},"offset":"16896861"},"gb18030-ranges.json":{"size":2216,"integrity":{"algorithm":"SHA256","hash":"5a3cc11e38f05a0908442acbf1c921d0b73f2a304fb6a9e4484e26eb1ca07d76","blockSize":4194304,"blocks":["5a3cc11e38f05a0908442acbf1c921d0b73f2a304fb6a9e4484e26eb1ca07d76"]},"offset":"16937925"},"gbk-added.json":{"size":1247,"integrity":{"algorithm":"SHA256","hash":"10cbb08708f3a431977271887b2663f734390a22cedf90875fac9fdbd4bb5317","blockSize":4194304,"blocks":["10cbb08708f3a431977271887b2663f734390a22cedf90875fac9fdbd4bb5317"]},"offset":"16940141"},"shiftjis.json":{"size":23782,"integrity":{"algorithm":"SHA256","hash":"02b0b120f697c48133e8b547e8dc594bc5b9f1c1799b50c2c5ff917298548558","blockSize":4194304,"blocks":["02b0b120f697c48133e8b547e8dc594bc5b9f1c1799b50c2c5ff917298548558"]},"offset":"16941388"}}}}},".github":{"files":{"dependabot.yml":{"size":321,"integrity":{"algorithm":"SHA256","hash":"c5fcf6e10e93d44501521f1926df5bd30197bc311bcb76fb731198d0deb090ab","blockSize":4194304,"blocks":["c5fcf6e10e93d44501521f1926df5bd30197bc311bcb76fb731198d0deb090ab"]},"offset":"16965170"}}}}},"ieee754":{"files":{"LICENSE":{"size":1465,"integrity":{"algorithm":"SHA256","hash":"18d45466ba3253deae04667e267a91ea8de8548f18c1125264d1c9db28194cc1","blockSize":4194304,"blocks":["18d45466ba3253deae04667e267a91ea8de8548f18c1125264d1c9db28194cc1"]},"offset":"16965491"},"index.js":{"size":2154,"integrity":{"algorithm":"SHA256","hash":"fe3e2b20c1ebb57c3b390c8f685ad1e04e6f493517fa7e432f4351bb77a1a4d0","blockSize":4194304,"blocks":["fe3e2b20c1ebb57c3b390c8f685ad1e04e6f493517fa7e432f4351bb77a1a4d0"]},"offset":"16966956"},"package.json":{"size":799,"integrity":{"algorithm":"SHA256","hash":"64e599b24b161bb1ac005f901da2f04b7e250bd8831e194ee402c1e72bff7888","blockSize":4194304,"blocks":["64e599b24b161bb1ac005f901da2f04b7e250bd8831e194ee402c1e72bff7888"]},"offset":"16969110"}}},"imurmurhash":{"files":{"imurmurhash.js":{"size":4412,"integrity":{"algorithm":"SHA256","hash":"45368bfe11080c4504b7804602015d93873303c5b13d5710af6c42e9abc35b4a","blockSize":4194304,"blocks":["45368bfe11080c4504b7804602015d93873303c5b13d5710af6c42e9abc35b4a"]},"offset":"16969909"},"imurmurhash.min.js":{"size":1894,"integrity":{"algorithm":"SHA256","hash":"ea8490563a229b89f2b779217938f9eb2bcf93dd89de9f7fc5c035632f0934b5","blockSize":4194304,"blocks":["ea8490563a229b89f2b779217938f9eb2bcf93dd89de9f7fc5c035632f0934b5"]},"offset":"16974321"},"package.json":{"size":631,"integrity":{"algorithm":"SHA256","hash":"7f671bcaed915fd07376b220dba299427dbc15c92ada20a87dd42b65eea41bd1","blockSize":4194304,"blocks":["7f671bcaed915fd07376b220dba299427dbc15c92ada20a87dd42b65eea41bd1"]},"offset":"16976215"}}},"indent-string":{"files":{"index.js":{"size":743,"integrity":{"algorithm":"SHA256","hash":"06fc10fb7018bd156b34b1443d67d0e1ff1986e534878b493ef6095d675ebf33","blockSize":4194304,"blocks":["06fc10fb7018bd156b34b1443d67d0e1ff1986e534878b493ef6095d675ebf33"]},"offset":"16976846"},"license":{"size":1109,"integrity":{"algorithm":"SHA256","hash":"48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0","blockSize":4194304,"blocks":["48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0"]},"offset":"16977589"},"package.json":{"size":462,"integrity":{"algorithm":"SHA256","hash":"731a6648754f0aeb9b9077fab25fe99e9944bc03536439295b47f415330f342d","blockSize":4194304,"blocks":["731a6648754f0aeb9b9077fab25fe99e9944bc03536439295b47f415330f342d"]},"offset":"16978698"}}},"infer-owner":{"files":{"LICENSE":{"size":756,"integrity":{"algorithm":"SHA256","hash":"ec361617c0473d39347b020eaa6dceedaebab43879fa1cd8b8f0f97a8e80a475","blockSize":4194304,"blocks":["ec361617c0473d39347b020eaa6dceedaebab43879fa1cd8b8f0f97a8e80a475"]},"offset":"16979160"},"index.js":{"size":1729,"integrity":{"algorithm":"SHA256","hash":"e2f2252542b31b61634b9ce896b58840e1839f023392c962ab834d1447ee93ce","blockSize":4194304,"blocks":["e2f2252542b31b61634b9ce896b58840e1839f023392c962ab834d1447ee93ce"]},"offset":"16979916"},"package.json":{"size":461,"integrity":{"algorithm":"SHA256","hash":"19fe25b74d85e5c797a668719f07b1b788dfb92798db4538e156e228ab507ab9","blockSize":4194304,"blocks":["19fe25b74d85e5c797a668719f07b1b788dfb92798db4538e156e228ab507ab9"]},"offset":"16981645"}}},"inflection":{"files":{"LICENSE":{"size":1068,"integrity":{"algorithm":"SHA256","hash":"f0fc32aca9af78ca79157a5fff6e166f5a232db55522c0dd70a9decf18278ab3","blockSize":4194304,"blocks":["f0fc32aca9af78ca79157a5fff6e166f5a232db55522c0dd70a9decf18278ab3"]},"offset":"16982106"},"package.json":{"size":459,"integrity":{"algorithm":"SHA256","hash":"9f4b481ff52fc73f9795ffe4c2be95559459ae7cbbd0822f8173d64637aea978","blockSize":4194304,"blocks":["9f4b481ff52fc73f9795ffe4c2be95559459ae7cbbd0822f8173d64637aea978"]},"offset":"16983174"},"lib":{"files":{"inflection.js":{"size":31264,"integrity":{"algorithm":"SHA256","hash":"37397956b4e2634aa2b456eb31af8d432ee4297d157df77979f7d7f9b62fbb66","blockSize":4194304,"blocks":["37397956b4e2634aa2b456eb31af8d432ee4297d157df77979f7d7f9b62fbb66"]},"offset":"16983633"}}},".vscode":{"files":{"settings.json":{"size":36,"integrity":{"algorithm":"SHA256","hash":"3c65e50d4db1bda9e2e6352c8ecafc25cc66889df4c8b6959f80bf324b00d496","blockSize":4194304,"blocks":["3c65e50d4db1bda9e2e6352c8ecafc25cc66889df4c8b6959f80bf324b00d496"]},"offset":"17014897"}}}}},"inflight":{"files":{"LICENSE":{"size":748,"integrity":{"algorithm":"SHA256","hash":"05dc4d785ac3a488676d3ed10e901b75ad89dafcc63f8e66610fd4a39cc5c7e8","blockSize":4194304,"blocks":["05dc4d785ac3a488676d3ed10e901b75ad89dafcc63f8e66610fd4a39cc5c7e8"]},"offset":"17014933"},"inflight.js":{"size":1365,"integrity":{"algorithm":"SHA256","hash":"e33ea098a91d2c41be886fbbcecacb9799fe183d8a446f138a4786cb3d809802","blockSize":4194304,"blocks":["e33ea098a91d2c41be886fbbcecacb9799fe183d8a446f138a4786cb3d809802"]},"offset":"17015681"},"package.json":{"size":533,"integrity":{"algorithm":"SHA256","hash":"ba37fd69b7a4c58ef5c6ad3cc32b3717adda6fb7f12a0dfdf2e5eb6421c6052b","blockSize":4194304,"blocks":["ba37fd69b7a4c58ef5c6ad3cc32b3717adda6fb7f12a0dfdf2e5eb6421c6052b"]},"offset":"17017046"}}},"inherits":{"files":{"LICENSE":{"size":749,"integrity":{"algorithm":"SHA256","hash":"5ffe28e7ade7d8f10d85d5337a73fd793dac5c462fb9a28fbf8c5046c7fbca3b","blockSize":4194304,"blocks":["5ffe28e7ade7d8f10d85d5337a73fd793dac5c462fb9a28fbf8c5046c7fbca3b"]},"offset":"17017579"},"inherits.js":{"size":250,"integrity":{"algorithm":"SHA256","hash":"bb380f32bef5feb18678f0f45f88073fed5d7a0069a309132cb2080cd553d5c7","blockSize":4194304,"blocks":["bb380f32bef5feb18678f0f45f88073fed5d7a0069a309132cb2080cd553d5c7"]},"offset":"17018328"},"inherits_browser.js":{"size":753,"integrity":{"algorithm":"SHA256","hash":"ad322a7b1dec60f3d2ebda2091816469efb55b567d241cf3cf0fa4c5a4afe500","blockSize":4194304,"blocks":["ad322a7b1dec60f3d2ebda2091816469efb55b567d241cf3cf0fa4c5a4afe500"]},"offset":"17018578"},"package.json":{"size":394,"integrity":{"algorithm":"SHA256","hash":"8bde8d8aeedbe677961a91d01b8f6df07253d95b0e03c178e748e44969a8885d","blockSize":4194304,"blocks":["8bde8d8aeedbe677961a91d01b8f6df07253d95b0e03c178e748e44969a8885d"]},"offset":"17019331"}}},"ini":{"files":{"LICENSE":{"size":765,"integrity":{"algorithm":"SHA256","hash":"4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b","blockSize":4194304,"blocks":["4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b"]},"offset":"17019725"},"ini.js":{"size":4976,"integrity":{"algorithm":"SHA256","hash":"54ab2a07998e9efc1f79667ee52650479f22e6d6f2bd3bb9c629b1426f5b1906","blockSize":4194304,"blocks":["54ab2a07998e9efc1f79667ee52650479f22e6d6f2bd3bb9c629b1426f5b1906"]},"offset":"17020490"},"package.json":{"size":541,"integrity":{"algorithm":"SHA256","hash":"d33d61b913908231b567e6de358fb53fe5f22bb71a6bf8e80f597c17870f8c92","blockSize":4194304,"blocks":["d33d61b913908231b567e6de358fb53fe5f22bb71a6bf8e80f597c17870f8c92"]},"offset":"17025466"}}},"internal-slot":{"files":{".editorconfig":{"size":286,"integrity":{"algorithm":"SHA256","hash":"0a73be687a86b6f0e5494b1be555fcfbb886108794948837170c28f18820aae2","blockSize":4194304,"blocks":["0a73be687a86b6f0e5494b1be555fcfbb886108794948837170c28f18820aae2"]},"offset":"17026007"},".eslintignore":{"size":10,"integrity":{"algorithm":"SHA256","hash":"5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290","blockSize":4194304,"blocks":["5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290"]},"offset":"17026293"},".nycrc":{"size":216,"integrity":{"algorithm":"SHA256","hash":"948366fea3b423a46366326d0bb2e54b08abd1cf0b243678ba6625740c40da5a","blockSize":4194304,"blocks":["948366fea3b423a46366326d0bb2e54b08abd1cf0b243678ba6625740c40da5a"]},"offset":"17026303"},"LICENSE":{"size":1071,"integrity":{"algorithm":"SHA256","hash":"cfc3f455254c0af0655cc3ff46a41ed644b67599f6043346169d285bf2b3cf3b","blockSize":4194304,"blocks":["cfc3f455254c0af0655cc3ff46a41ed644b67599f6043346169d285bf2b3cf3b"]},"offset":"17026519"},"index.js":{"size":1504,"integrity":{"algorithm":"SHA256","hash":"6229e6375cf7ad2c7d5334fd80c05c6a5080804c555ac9da5aaa24e32b14fdf5","blockSize":4194304,"blocks":["6229e6375cf7ad2c7d5334fd80c05c6a5080804c555ac9da5aaa24e32b14fdf5"]},"offset":"17027590"},"package.json":{"size":922,"integrity":{"algorithm":"SHA256","hash":"20d3af90967b9854e0cb0ba4ce0b2528ce86b3b808ba0c2711d49da8a71e99a8","blockSize":4194304,"blocks":["20d3af90967b9854e0cb0ba4ce0b2528ce86b3b808ba0c2711d49da8a71e99a8"]},"offset":"17029094"},".github":{"files":{"FUNDING.yml":{"size":559,"integrity":{"algorithm":"SHA256","hash":"cfdc971eb0b0fd57e18af8f11bf23a9ee0c833520924ed0bdef7b36dbcbdf376","blockSize":4194304,"blocks":["cfdc971eb0b0fd57e18af8f11bf23a9ee0c833520924ed0bdef7b36dbcbdf376"]},"offset":"17030016"}}}}},"ip":{"files":{"package.json":{"size":395,"integrity":{"algorithm":"SHA256","hash":"c5fc7951dbb89ba83f252c720dbb6552a3e049314fc729443d1a9812d261ffa6","blockSize":4194304,"blocks":["c5fc7951dbb89ba83f252c720dbb6552a3e049314fc729443d1a9812d261ffa6"]},"offset":"17030575"},"lib":{"files":{"ip.js":{"size":10251,"integrity":{"algorithm":"SHA256","hash":"a7a6d13fb2d9ff0a2de7a3bd4df56023f43deacde318e75c11e293d568c67f0c","blockSize":4194304,"blocks":["a7a6d13fb2d9ff0a2de7a3bd4df56023f43deacde318e75c11e293d568c67f0c"]},"offset":"17030970"}}}}},"is-bigint":{"files":{".eslintignore":{"size":10,"integrity":{"algorithm":"SHA256","hash":"5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290","blockSize":4194304,"blocks":["5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290"]},"offset":"17041221"},".nycrc":{"size":139,"integrity":{"algorithm":"SHA256","hash":"997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a","blockSize":4194304,"blocks":["997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a"]},"offset":"17041231"},"LICENSE":{"size":1071,"integrity":{"algorithm":"SHA256","hash":"971e376febf7afbcceab6857e243f2ccb3ea88f520b68c324af15a28171f5de3","blockSize":4194304,"blocks":["971e376febf7afbcceab6857e243f2ccb3ea88f520b68c324af15a28171f5de3"]},"offset":"17041370"},"index.js":{"size":737,"integrity":{"algorithm":"SHA256","hash":"ef7eb60ae434579576a678f7ef29b21b65d3f2ddda5f006c6681728a5064add7","blockSize":4194304,"blocks":["ef7eb60ae434579576a678f7ef29b21b65d3f2ddda5f006c6681728a5064add7"]},"offset":"17042441"},"package.json":{"size":955,"integrity":{"algorithm":"SHA256","hash":"8fedac85eb06fb45c8e6d99d4e48687b9fee8e0e010e990d9859e3d5ece393f4","blockSize":4194304,"blocks":["8fedac85eb06fb45c8e6d99d4e48687b9fee8e0e010e990d9859e3d5ece393f4"]},"offset":"17043178"},".github":{"files":{"FUNDING.yml":{"size":580,"integrity":{"algorithm":"SHA256","hash":"6bdaf7a7ed0fc2759e9c34ff8020cb532531edf44f66acb40bfde889bbda7f18","blockSize":4194304,"blocks":["6bdaf7a7ed0fc2759e9c34ff8020cb532531edf44f66acb40bfde889bbda7f18"]},"offset":"17044133"}}}}},"is-boolean-object":{"files":{".editorconfig":{"size":353,"integrity":{"algorithm":"SHA256","hash":"9287e3cfa5fc7c284c93b6a952972436088c024162749e7374bd5d1ec76a04fd","blockSize":4194304,"blocks":["9287e3cfa5fc7c284c93b6a952972436088c024162749e7374bd5d1ec76a04fd"]},"offset":"17044713"},".eslintignore":{"size":10,"integrity":{"algorithm":"SHA256","hash":"5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290","blockSize":4194304,"blocks":["5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290"]},"offset":"17045066"},".nycrc":{"size":159,"integrity":{"algorithm":"SHA256","hash":"a4766e182e1ce45be9f6f1658281846c3abc8684c1cf90d6c7ae1940c5dfe8bc","blockSize":4194304,"blocks":["a4766e182e1ce45be9f6f1658281846c3abc8684c1cf90d6c7ae1940c5dfe8bc"]},"offset":"17045076"},"LICENSE":{"size":1082,"integrity":{"algorithm":"SHA256","hash":"c61652db3d2808f667b48af0a358f0d85fd07ad4a0d0b1a50882dec3b764c522","blockSize":4194304,"blocks":["c61652db3d2808f667b48af0a358f0d85fd07ad4a0d0b1a50882dec3b764c522"]},"offset":"17045235"},"index.js":{"size":697,"integrity":{"algorithm":"SHA256","hash":"919b8e00d341529f7c70fe0222992e196388b8d2fa4f77a38f0f7a8a1b801d0b","blockSize":4194304,"blocks":["919b8e00d341529f7c70fe0222992e196388b8d2fa4f77a38f0f7a8a1b801d0b"]},"offset":"17046317"},"package.json":{"size":1516,"integrity":{"algorithm":"SHA256","hash":"bba812f0a49b7cc4b8c265f020549415b5712b852d15670775e8a571d374e89e","blockSize":4194304,"blocks":["bba812f0a49b7cc4b8c265f020549415b5712b852d15670775e8a571d374e89e"]},"offset":"17047014"},".github":{"files":{"FUNDING.yml":{"size":588,"integrity":{"algorithm":"SHA256","hash":"40881373207f62a2689e11d03075e03766901fe9168324a4936fdb67ab163358","blockSize":4194304,"blocks":["40881373207f62a2689e11d03075e03766901fe9168324a4936fdb67ab163358"]},"offset":"17048530"}}}}},"is-callable":{"files":{".editorconfig":{"size":385,"integrity":{"algorithm":"SHA256","hash":"8469c3d2c3057526413d06227855ddba7f417e81a27f936cd5a7bcc40068abc6","blockSize":4194304,"blocks":["8469c3d2c3057526413d06227855ddba7f417e81a27f936cd5a7bcc40068abc6"]},"offset":"17049118"},".eslintignore":{"size":10,"integrity":{"algorithm":"SHA256","hash":"5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290","blockSize":4194304,"blocks":["5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290"]},"offset":"17049503"},".istanbul.yml":{"size":993,"integrity":{"algorithm":"SHA256","hash":"5ed4bf02143a49c1603599faf93bdafb37ffb273f66f2e758471f4e29ece19b9","blockSize":4194304,"blocks":["5ed4bf02143a49c1603599faf93bdafb37ffb273f66f2e758471f4e29ece19b9"]},"offset":"17049513"},".nycrc":{"size":139,"integrity":{"algorithm":"SHA256","hash":"997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a","blockSize":4194304,"blocks":["997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a"]},"offset":"17050506"},"LICENSE":{"size":1082,"integrity":{"algorithm":"SHA256","hash":"c61652db3d2808f667b48af0a358f0d85fd07ad4a0d0b1a50882dec3b764c522","blockSize":4194304,"blocks":["c61652db3d2808f667b48af0a358f0d85fd07ad4a0d0b1a50882dec3b764c522"]},"offset":"17050645"},"index.js":{"size":2376,"integrity":{"algorithm":"SHA256","hash":"6d30bee6798be1a81628960c9f6346d7b9689eb6df107b42f173594929b7f0d5","blockSize":4194304,"blocks":["6d30bee6798be1a81628960c9f6346d7b9689eb6df107b42f173594929b7f0d5"]},"offset":"17051727"},"package.json":{"size":1540,"integrity":{"algorithm":"SHA256","hash":"19a3cb96125c8e336c321640b0351e9db20f557440f75a05ee4d14dc1b578e14","blockSize":4194304,"blocks":["19a3cb96125c8e336c321640b0351e9db20f557440f75a05ee4d14dc1b578e14"]},"offset":"17054103"},".github":{"files":{"FUNDING.yml":{"size":582,"integrity":{"algorithm":"SHA256","hash":"ac97f78583380657d2414f4c053982206b48b86e42c7f3edfbbbc497f7a53580","blockSize":4194304,"blocks":["ac97f78583380657d2414f4c053982206b48b86e42c7f3edfbbbc497f7a53580"]},"offset":"17055643"}}}}},"is-date-object":{"files":{".editorconfig":{"size":286,"integrity":{"algorithm":"SHA256","hash":"0a73be687a86b6f0e5494b1be555fcfbb886108794948837170c28f18820aae2","blockSize":4194304,"blocks":["0a73be687a86b6f0e5494b1be555fcfbb886108794948837170c28f18820aae2"]},"offset":"17056225"},".eslintignore":{"size":10,"integrity":{"algorithm":"SHA256","hash":"5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290","blockSize":4194304,"blocks":["5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290"]},"offset":"17056511"},".nycrc":{"size":159,"integrity":{"algorithm":"SHA256","hash":"a4766e182e1ce45be9f6f1658281846c3abc8684c1cf90d6c7ae1940c5dfe8bc","blockSize":4194304,"blocks":["a4766e182e1ce45be9f6f1658281846c3abc8684c1cf90d6c7ae1940c5dfe8bc"]},"offset":"17056521"},"LICENSE":{"size":1082,"integrity":{"algorithm":"SHA256","hash":"c61652db3d2808f667b48af0a358f0d85fd07ad4a0d0b1a50882dec3b764c522","blockSize":4194304,"blocks":["c61652db3d2808f667b48af0a358f0d85fd07ad4a0d0b1a50882dec3b764c522"]},"offset":"17056680"},"index.js":{"size":522,"integrity":{"algorithm":"SHA256","hash":"24e424f16352c319975af1eaea53f6ebb15d2875f1cbeb3ee9ee57fd0dba76ff","blockSize":4194304,"blocks":["24e424f16352c319975af1eaea53f6ebb15d2875f1cbeb3ee9ee57fd0dba76ff"]},"offset":"17057762"},"package.json":{"size":1450,"integrity":{"algorithm":"SHA256","hash":"bfec57610b9ca74b1be4e5b6e587e5405f5e8417bd92908bbabbee0bf98cf836","blockSize":4194304,"blocks":["bfec57610b9ca74b1be4e5b6e587e5405f5e8417bd92908bbabbee0bf98cf836"]},"offset":"17058284"},".github":{"files":{"FUNDING.yml":{"size":585,"integrity":{"algorithm":"SHA256","hash":"4f8b60d4b4e85ebfc9a5148d8555eb5eaa21fd6c9dae4fa80b9b70812d3088a4","blockSize":4194304,"blocks":["4f8b60d4b4e85ebfc9a5148d8555eb5eaa21fd6c9dae4fa80b9b70812d3088a4"]},"offset":"17059734"}}}}},"is-docker":{"files":{"cli.js":{"size":105,"integrity":{"algorithm":"SHA256","hash":"52fe3d02e29c8b60cb0bc487eb73b98fd9a5299ce2b20c6d14fc2a62a14aebff","blockSize":4194304,"blocks":["52fe3d02e29c8b60cb0bc487eb73b98fd9a5299ce2b20c6d14fc2a62a14aebff"]},"offset":"17060319"},"index.js":{"size":449,"integrity":{"algorithm":"SHA256","hash":"d739e3d2bc8d3fad2e185fadefe57b65a49f7a336846cd2498d164b142293ead","blockSize":4194304,"blocks":["d739e3d2bc8d3fad2e185fadefe57b65a49f7a336846cd2498d164b142293ead"]},"offset":"17060424"},"license":{"size":1117,"integrity":{"algorithm":"SHA256","hash":"5c932d88256b4ab958f64a856fa48e8bd1f55bc1d96b8149c65689e0c61789d3","blockSize":4194304,"blocks":["5c932d88256b4ab958f64a856fa48e8bd1f55bc1d96b8149c65689e0c61789d3"]},"offset":"17060873"},"package.json":{"size":604,"integrity":{"algorithm":"SHA256","hash":"d6960320efa3f14f8912e51e28c73d722787d4883d67a2011781ada9246b80aa","blockSize":4194304,"blocks":["d6960320efa3f14f8912e51e28c73d722787d4883d67a2011781ada9246b80aa"]},"offset":"17061990"}}},"is-fullwidth-code-point":{"files":{"index.js":{"size":1756,"integrity":{"algorithm":"SHA256","hash":"7db24c9c5d58273ba32eee1bec3dfebd393fdeddd0b5879ef01dc595476e6979","blockSize":4194304,"blocks":["7db24c9c5d58273ba32eee1bec3dfebd393fdeddd0b5879ef01dc595476e6979"]},"offset":"17062594"},"license":{"size":1109,"integrity":{"algorithm":"SHA256","hash":"48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0","blockSize":4194304,"blocks":["48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0"]},"offset":"17064350"},"package.json":{"size":537,"integrity":{"algorithm":"SHA256","hash":"a7b8154029328dcbfc790816357fde1a03f48f43854c7aabc5992853374a767e","blockSize":4194304,"blocks":["a7b8154029328dcbfc790816357fde1a03f48f43854c7aabc5992853374a767e"]},"offset":"17065459"}}},"is-lambda":{"files":{"LICENSE":{"size":1091,"integrity":{"algorithm":"SHA256","hash":"4736df0aa50d339e32c2364b5fafeb923075e8f92ea4cc2ac5c9ca926783ffc5","blockSize":4194304,"blocks":["4736df0aa50d339e32c2364b5fafeb923075e8f92ea4cc2ac5c9ca926783ffc5"]},"offset":"17065996"},"index.js":{"size":114,"integrity":{"algorithm":"SHA256","hash":"b08397c5985a5ac96c365472c92a83d5d72e8577eef3925dc969b1893bc9f509","blockSize":4194304,"blocks":["b08397c5985a5ac96c365472c92a83d5d72e8577eef3925dc969b1893bc9f509"]},"offset":"17067087"},"package.json":{"size":552,"integrity":{"algorithm":"SHA256","hash":"eae4ec9a0c68e3c7ebc30d9d4a295dcce40c78ab88d313c2a0dd318cca572300","blockSize":4194304,"blocks":["eae4ec9a0c68e3c7ebc30d9d4a295dcce40c78ab88d313c2a0dd318cca572300"]},"offset":"17067201"}}},"is-negative-zero":{"files":{".editorconfig":{"size":129,"integrity":{"algorithm":"SHA256","hash":"9b9cb090619b4e9fd497c536ff8c90da0aa9e4384ab21f446008137abbaa1ff5","blockSize":4194304,"blocks":["9b9cb090619b4e9fd497c536ff8c90da0aa9e4384ab21f446008137abbaa1ff5"]},"offset":"17067753"},".eslintignore":{"size":10,"integrity":{"algorithm":"SHA256","hash":"5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290","blockSize":4194304,"blocks":["5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290"]},"offset":"17067882"},".nycrc":{"size":139,"integrity":{"algorithm":"SHA256","hash":"997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a","blockSize":4194304,"blocks":["997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a"]},"offset":"17067892"},"LICENSE":{"size":1081,"integrity":{"algorithm":"SHA256","hash":"dc0fe5a22d9336f345ee984f9bf56f11f22877a3aa5fd16a1db9a8ca0e23a5d1","blockSize":4194304,"blocks":["dc0fe5a22d9336f345ee984f9bf56f11f22877a3aa5fd16a1db9a8ca0e23a5d1"]},"offset":"17068031"},"index.js":{"size":122,"integrity":{"algorithm":"SHA256","hash":"d8f2f0b532117ff388d1c9756ac4c2d0b30f623538a8a7b6edfa8c13435e1198","blockSize":4194304,"blocks":["d8f2f0b532117ff388d1c9756ac4c2d0b30f623538a8a7b6edfa8c13435e1198"]},"offset":"17069112"},"package.json":{"size":1357,"integrity":{"algorithm":"SHA256","hash":"a04f1b06061e2cb58f6135a78effb37d66c5473e0d69cbb3537cb5f047fd825e","blockSize":4194304,"blocks":["a04f1b06061e2cb58f6135a78effb37d66c5473e0d69cbb3537cb5f047fd825e"]},"offset":"17069234"},".github":{"files":{"FUNDING.yml":{"size":585,"integrity":{"algorithm":"SHA256","hash":"62dd0f25318a10370e2b30749892cc90fe5c1532fdfb272a99dbbca8c9e6b9aa","blockSize":4194304,"blocks":["62dd0f25318a10370e2b30749892cc90fe5c1532fdfb272a99dbbca8c9e6b9aa"]},"offset":"17070591"}}}}},"is-number-object":{"files":{".editorconfig":{"size":324,"integrity":{"algorithm":"SHA256","hash":"b3293a2fa59d5b3c2f8fd0c3f4aa3ab9846a4cb9e8431554e5526e99f568fa3a","blockSize":4194304,"blocks":["b3293a2fa59d5b3c2f8fd0c3f4aa3ab9846a4cb9e8431554e5526e99f568fa3a"]},"offset":"17071176"},".nycrc":{"size":159,"integrity":{"algorithm":"SHA256","hash":"a4766e182e1ce45be9f6f1658281846c3abc8684c1cf90d6c7ae1940c5dfe8bc","blockSize":4194304,"blocks":["a4766e182e1ce45be9f6f1658281846c3abc8684c1cf90d6c7ae1940c5dfe8bc"]},"offset":"17071500"},"LICENSE":{"size":1082,"integrity":{"algorithm":"SHA256","hash":"c61652db3d2808f667b48af0a358f0d85fd07ad4a0d0b1a50882dec3b764c522","blockSize":4194304,"blocks":["c61652db3d2808f667b48af0a358f0d85fd07ad4a0d0b1a50882dec3b764c522"]},"offset":"17071659"},"index.js":{"size":567,"integrity":{"algorithm":"SHA256","hash":"1927490d3b1e407352be9d4c528f9ad9a03ed97eacfa52360d1d99a6492c4316","blockSize":4194304,"blocks":["1927490d3b1e407352be9d4c528f9ad9a03ed97eacfa52360d1d99a6492c4316"]},"offset":"17072741"},"package.json":{"size":1569,"integrity":{"algorithm":"SHA256","hash":"b069b159ad4b33d827faf322f3fbed1122d87c484d18cf136d01d1517c38c8ad","blockSize":4194304,"blocks":["b069b159ad4b33d827faf322f3fbed1122d87c484d18cf136d01d1517c38c8ad"]},"offset":"17073308"},".github":{"files":{"FUNDING.yml":{"size":587,"integrity":{"algorithm":"SHA256","hash":"768e8e58ef077c015614154d5985c987498c3f1061ee4233a5db2f5d6544cb3e","blockSize":4194304,"blocks":["768e8e58ef077c015614154d5985c987498c3f1061ee4233a5db2f5d6544cb3e"]},"offset":"17074877"}}}}},"is-regex":{"files":{".editorconfig":{"size":286,"integrity":{"algorithm":"SHA256","hash":"0a73be687a86b6f0e5494b1be555fcfbb886108794948837170c28f18820aae2","blockSize":4194304,"blocks":["0a73be687a86b6f0e5494b1be555fcfbb886108794948837170c28f18820aae2"]},"offset":"17075464"},".eslintignore":{"size":10,"integrity":{"algorithm":"SHA256","hash":"5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290","blockSize":4194304,"blocks":["5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290"]},"offset":"17075750"},".nycrc":{"size":159,"integrity":{"algorithm":"SHA256","hash":"a4766e182e1ce45be9f6f1658281846c3abc8684c1cf90d6c7ae1940c5dfe8bc","blockSize":4194304,"blocks":["a4766e182e1ce45be9f6f1658281846c3abc8684c1cf90d6c7ae1940c5dfe8bc"]},"offset":"17075760"},"LICENSE":{"size":1081,"integrity":{"algorithm":"SHA256","hash":"dc0fe5a22d9336f345ee984f9bf56f11f22877a3aa5fd16a1db9a8ca0e23a5d1","blockSize":4194304,"blocks":["dc0fe5a22d9336f345ee984f9bf56f11f22877a3aa5fd16a1db9a8ca0e23a5d1"]},"offset":"17075919"},"index.js":{"size":1405,"integrity":{"algorithm":"SHA256","hash":"10c5e8398a189adf8c781858c54637a9e4dc4d659163647569e69cff90d82fd6","blockSize":4194304,"blocks":["10c5e8398a189adf8c781858c54637a9e4dc4d659163647569e69cff90d82fd6"]},"offset":"17077000"},"package.json":{"size":1500,"integrity":{"algorithm":"SHA256","hash":"543610e705a8f9967b27f937cfe1d7afb3efcbc2f686a3c5f46e1e275585e6f6","blockSize":4194304,"blocks":["543610e705a8f9967b27f937cfe1d7afb3efcbc2f686a3c5f46e1e275585e6f6"]},"offset":"17078405"}}},"is-shared-array-buffer":{"files":{".eslintignore":{"size":10,"integrity":{"algorithm":"SHA256","hash":"5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290","blockSize":4194304,"blocks":["5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290"]},"offset":"17079905"},".nycrc":{"size":139,"integrity":{"algorithm":"SHA256","hash":"997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a","blockSize":4194304,"blocks":["997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a"]},"offset":"17079915"},"LICENSE":{"size":1067,"integrity":{"algorithm":"SHA256","hash":"e2560e002e13281578c75c850061d9255c33d16d732939e8c2db64c2506642fa","blockSize":4194304,"blocks":["e2560e002e13281578c75c850061d9255c33d16d732939e8c2db64c2506642fa"]},"offset":"17080054"},"index.js":{"size":454,"integrity":{"algorithm":"SHA256","hash":"1466f5487c4a9dbf29560233736283c72643eb5b34c13e158499f2fc9be8ba6f","blockSize":4194304,"blocks":["1466f5487c4a9dbf29560233736283c72643eb5b34c13e158499f2fc9be8ba6f"]},"offset":"17081121"},"package.json":{"size":1181,"integrity":{"algorithm":"SHA256","hash":"d00e86df4f70ca1b6727faacc5c20b6e51b69a8a502495996757c010eb03662f","blockSize":4194304,"blocks":["d00e86df4f70ca1b6727faacc5c20b6e51b69a8a502495996757c010eb03662f"]},"offset":"17081575"},".github":{"files":{"FUNDING.yml":{"size":593,"integrity":{"algorithm":"SHA256","hash":"d033cf262d3aabbf0fc75bad89a9c84447035d364077bc848fea916d5e8b4670","blockSize":4194304,"blocks":["d033cf262d3aabbf0fc75bad89a9c84447035d364077bc848fea916d5e8b4670"]},"offset":"17082756"}}}}},"is-string":{"files":{".eslintignore":{"size":10,"integrity":{"algorithm":"SHA256","hash":"5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290","blockSize":4194304,"blocks":["5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290"]},"offset":"17083349"},".nycrc":{"size":159,"integrity":{"algorithm":"SHA256","hash":"a4766e182e1ce45be9f6f1658281846c3abc8684c1cf90d6c7ae1940c5dfe8bc","blockSize":4194304,"blocks":["a4766e182e1ce45be9f6f1658281846c3abc8684c1cf90d6c7ae1940c5dfe8bc"]},"offset":"17083359"},"LICENSE":{"size":1082,"integrity":{"algorithm":"SHA256","hash":"c61652db3d2808f667b48af0a358f0d85fd07ad4a0d0b1a50882dec3b764c522","blockSize":4194304,"blocks":["c61652db3d2808f667b48af0a358f0d85fd07ad4a0d0b1a50882dec3b764c522"]},"offset":"17083518"},"index.js":{"size":560,"integrity":{"algorithm":"SHA256","hash":"f29ee020b9134afd484319fa7651d72318df891f114b4183b889b543a291f51a","blockSize":4194304,"blocks":["f29ee020b9134afd484319fa7651d72318df891f114b4183b889b543a291f51a"]},"offset":"17084600"},"package.json":{"size":1470,"integrity":{"algorithm":"SHA256","hash":"792cf5a2fb74f49826e123d2d31a4290715f28692a6afcc3a686bec4ff690761","blockSize":4194304,"blocks":["792cf5a2fb74f49826e123d2d31a4290715f28692a6afcc3a686bec4ff690761"]},"offset":"17085160"},".github":{"files":{"FUNDING.yml":{"size":580,"integrity":{"algorithm":"SHA256","hash":"0d779a8864bbb01c35283ea1289c8a161cab19296f46715e737befc7d7890b1b","blockSize":4194304,"blocks":["0d779a8864bbb01c35283ea1289c8a161cab19296f46715e737befc7d7890b1b"]},"offset":"17086630"}}}}},"is-symbol":{"files":{".editorconfig":{"size":276,"integrity":{"algorithm":"SHA256","hash":"ede54e8b6b96147c61efd0ddc56d3683508a26066a8baabd63673d2779a06f23","blockSize":4194304,"blocks":["ede54e8b6b96147c61efd0ddc56d3683508a26066a8baabd63673d2779a06f23"]},"offset":"17087210"},".eslintignore":{"size":10,"integrity":{"algorithm":"SHA256","hash":"5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290","blockSize":4194304,"blocks":["5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290"]},"offset":"17087486"},".nycrc":{"size":139,"integrity":{"algorithm":"SHA256","hash":"997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a","blockSize":4194304,"blocks":["997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a"]},"offset":"17087496"},"LICENSE":{"size":1082,"integrity":{"algorithm":"SHA256","hash":"c61652db3d2808f667b48af0a358f0d85fd07ad4a0d0b1a50882dec3b764c522","blockSize":4194304,"blocks":["c61652db3d2808f667b48af0a358f0d85fd07ad4a0d0b1a50882dec3b764c522"]},"offset":"17087635"},"index.js":{"size":767,"integrity":{"algorithm":"SHA256","hash":"e1aba1cb8b651173d3adc757a5f577c46ddf64d78e734c6028eb38990b56a571","blockSize":4194304,"blocks":["e1aba1cb8b651173d3adc757a5f577c46ddf64d78e734c6028eb38990b56a571"]},"offset":"17088717"},"package.json":{"size":1337,"integrity":{"algorithm":"SHA256","hash":"ab670391421a9316f1ed05b008ac8736b0bfeeaa89e6c86933ace9b979fe117d","blockSize":4194304,"blocks":["ab670391421a9316f1ed05b008ac8736b0bfeeaa89e6c86933ace9b979fe117d"]},"offset":"17089484"},".github":{"files":{"FUNDING.yml":{"size":580,"integrity":{"algorithm":"SHA256","hash":"2bb129d1f71c69043f33545d8feba5e9723f988ce6a6458fd0f2c358a2f53539","blockSize":4194304,"blocks":["2bb129d1f71c69043f33545d8feba5e9723f988ce6a6458fd0f2c358a2f53539"]},"offset":"17090821"}}}}},"is-weakref":{"files":{".eslintignore":{"size":10,"integrity":{"algorithm":"SHA256","hash":"5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290","blockSize":4194304,"blocks":["5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290"]},"offset":"17091401"},".nycrc":{"size":139,"integrity":{"algorithm":"SHA256","hash":"997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a","blockSize":4194304,"blocks":["997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a"]},"offset":"17091411"},"LICENSE":{"size":1067,"integrity":{"algorithm":"SHA256","hash":"6d0917530cf3b3dca12c1ab7798e4d38ad0a6798ecc1bd27849a3048ba91d265","blockSize":4194304,"blocks":["6d0917530cf3b3dca12c1ab7798e4d38ad0a6798ecc1bd27849a3048ba91d265"]},"offset":"17091550"},"index.js":{"size":438,"integrity":{"algorithm":"SHA256","hash":"21dd2b385ab7976c5816d457c571dc504bff7b1b94eea6fb1b9600f8a01bcb0b","blockSize":4194304,"blocks":["21dd2b385ab7976c5816d457c571dc504bff7b1b94eea6fb1b9600f8a01bcb0b"]},"offset":"17092617"},"package.json":{"size":1103,"integrity":{"algorithm":"SHA256","hash":"f243fad834cbc4c851214792650a81357ebf504835a80202906aba561385a7f8","blockSize":4194304,"blocks":["f243fad834cbc4c851214792650a81357ebf504835a80202906aba561385a7f8"]},"offset":"17093055"},".github":{"files":{"FUNDING.yml":{"size":581,"integrity":{"algorithm":"SHA256","hash":"c2a8c9a4121545c46eac5a3efbafc18f9d355a8dfc119a59d03c9c8b2c320818","blockSize":4194304,"blocks":["c2a8c9a4121545c46eac5a3efbafc18f9d355a8dfc119a59d03c9c8b2c320818"]},"offset":"17094158"}}}}},"is-wsl":{"files":{"index.js":{"size":558,"integrity":{"algorithm":"SHA256","hash":"ad8b02493e3c5bc619ffe9de753bb41d8757c46dd7024e73a3d22eb66f9f902e","blockSize":4194304,"blocks":["ad8b02493e3c5bc619ffe9de753bb41d8757c46dd7024e73a3d22eb66f9f902e"]},"offset":"17094739"},"license":{"size":1109,"integrity":{"algorithm":"SHA256","hash":"48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0","blockSize":4194304,"blocks":["48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0"]},"offset":"17095297"},"package.json":{"size":613,"integrity":{"algorithm":"SHA256","hash":"319cd0be646c6ef259f07815bad6b976f766d2ef05f62ac706c7dd53cbc45441","blockSize":4194304,"blocks":["319cd0be646c6ef259f07815bad6b976f766d2ef05f62ac706c7dd53cbc45441"]},"offset":"17096406"}}},"isexe":{"files":{"LICENSE":{"size":765,"integrity":{"algorithm":"SHA256","hash":"4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b","blockSize":4194304,"blocks":["4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b"]},"offset":"17097019"},"index.js":{"size":1192,"integrity":{"algorithm":"SHA256","hash":"7af7a68708317ab2b8743b44591d98ca6f5ca787e89e7c289154471fd2f67331","blockSize":4194304,"blocks":["7af7a68708317ab2b8743b44591d98ca6f5ca787e89e7c289154471fd2f67331"]},"offset":"17097784"},"mode.js":{"size":909,"integrity":{"algorithm":"SHA256","hash":"0381513485dd6d0799b160a5c0bf7b4a79d1ece5c32182de44aa73f756a7ac54","blockSize":4194304,"blocks":["0381513485dd6d0799b160a5c0bf7b4a79d1ece5c32182de44aa73f756a7ac54"]},"offset":"17098976"},"package.json":{"size":512,"integrity":{"algorithm":"SHA256","hash":"8a4bbdcc3391ffc88bdbba977ebdae17eedc5dbb0a176a66c30da6d6fa14daba","blockSize":4194304,"blocks":["8a4bbdcc3391ffc88bdbba977ebdae17eedc5dbb0a176a66c30da6d6fa14daba"]},"offset":"17099885"},"windows.js":{"size":890,"integrity":{"algorithm":"SHA256","hash":"b422b8fbb7815542dfbd1b3adaec5700249a1934c44a1d994654329c06fc1018","blockSize":4194304,"blocks":["b422b8fbb7815542dfbd1b3adaec5700249a1934c44a1d994654329c06fc1018"]},"offset":"17100397"}}},"js-md4":{"files":{".covignore":{"size":25,"integrity":{"algorithm":"SHA256","hash":"98c2a0ee449fbf13e4754e4e36fc1c477a05946b3d9f2783284957b81bdf45ac","blockSize":4194304,"blocks":["98c2a0ee449fbf13e4754e4e36fc1c477a05946b3d9f2783284957b81bdf45ac"]},"offset":"17101287"},"LICENSE.txt":{"size":1078,"integrity":{"algorithm":"SHA256","hash":"c0980ec312d90c1a79ffa1a3e95a8f610975f7da8cae635fbcfc56f3c8aa4509","blockSize":4194304,"blocks":["c0980ec312d90c1a79ffa1a3e95a8f610975f7da8cae635fbcfc56f3c8aa4509"]},"offset":"17101312"},"bower.json":{"size":126,"integrity":{"algorithm":"SHA256","hash":"da09dda19f678d1c91c4828f84909899e935f3152a432e5fbffbe6cadbdbf2a1","blockSize":4194304,"blocks":["da09dda19f678d1c91c4828f84909899e935f3152a432e5fbffbe6cadbdbf2a1"]},"offset":"17102390"},"package.json":{"size":521,"integrity":{"algorithm":"SHA256","hash":"e10f9ddca114c50ae92d4a612917f44c9999534ae28887b1f2558241bd9a1262","blockSize":4194304,"blocks":["e10f9ddca114c50ae92d4a612917f44c9999534ae28887b1f2558241bd9a1262"]},"offset":"17102516"},"src":{"files":{"md4.js":{"size":19256,"integrity":{"algorithm":"SHA256","hash":"0a07d1b0704caea7dc92eff1fc24394d119e8bb5a092237b693525137833c327","blockSize":4194304,"blocks":["0a07d1b0704caea7dc92eff1fc24394d119e8bb5a092237b693525137833c327"]},"offset":"17103037"}}},"doc":{"files":{"Md4_.html":{"size":10497,"integrity":{"algorithm":"SHA256","hash":"c94df6ae0d0b084e19a1ce8c09000bcd268f807159819eb53d626b003bcb3ad5","blockSize":4194304,"blocks":["c94df6ae0d0b084e19a1ce8c09000bcd268f807159819eb53d626b003bcb3ad5"]},"offset":"17122293"},"global.html":{"size":3678,"integrity":{"algorithm":"SHA256","hash":"99ceb1cc2a204b41cf77f30c93100f828dd9f5d90a8576745aabe893525cf141","blockSize":4194304,"blocks":["99ceb1cc2a204b41cf77f30c93100f828dd9f5d90a8576745aabe893525cf141"]},"offset":"17132790"},"index.html":{"size":4254,"integrity":{"algorithm":"SHA256","hash":"306709a827712896ac5e4d159860813e0ec377f32aa686889d19fab2598f5eba","blockSize":4194304,"blocks":["306709a827712896ac5e4d159860813e0ec377f32aa686889d19fab2598f5eba"]},"offset":"17136468"},"md4.html":{"size":12116,"integrity":{"algorithm":"SHA256","hash":"a10cc0e250528214dea3d22e8d988f61874be559a8fede33d43c46584295f067","blockSize":4194304,"blocks":["a10cc0e250528214dea3d22e8d988f61874be559a8fede33d43c46584295f067"]},"offset":"17140722"},"md4.js.html":{"size":21712,"integrity":{"algorithm":"SHA256","hash":"d611f5d2ea3a840b48b1a6040e47cb7683eb3e3eba938c798a3856cd0b75b0ea","blockSize":4194304,"blocks":["d611f5d2ea3a840b48b1a6040e47cb7683eb3e3eba938c798a3856cd0b75b0ea"]},"offset":"17152838"},"styles":{"files":{"jsdoc-default.css":{"size":5914,"integrity":{"algorithm":"SHA256","hash":"636158baeafe955c04ff96187128cda8bee6553e5cd587cbc930d03c37b7cb04","blockSize":4194304,"blocks":["636158baeafe955c04ff96187128cda8bee6553e5cd587cbc930d03c37b7cb04"]},"offset":"17174550"},"prettify-jsdoc.css":{"size":1535,"integrity":{"algorithm":"SHA256","hash":"bca3215630ba8c2438924b78cd97f1cf7bd85b34521f684792804e07c74e966c","blockSize":4194304,"blocks":["bca3215630ba8c2438924b78cd97f1cf7bd85b34521f684792804e07c74e966c"]},"offset":"17180464"},"prettify-tomorrow.css":{"size":2026,"integrity":{"algorithm":"SHA256","hash":"cc89c4a9a3301cf1355d13d3aa730fdae64e104605436ce371ab00bf64759d78","blockSize":4194304,"blocks":["cc89c4a9a3301cf1355d13d3aa730fdae64e104605436ce371ab00bf64759d78"]},"offset":"17181999"}}},"scripts":{"files":{"linenumber.js":{"size":674,"integrity":{"algorithm":"SHA256","hash":"bcc1057a550d0865cd8fcebc0e7531b76226d25d42ebdfa8cabc11f2314c3787","blockSize":4194304,"blocks":["bcc1057a550d0865cd8fcebc0e7531b76226d25d42ebdfa8cabc11f2314c3787"]},"offset":"17184025"},"prettify":{"files":{"Apache-License-2.0.txt":{"size":11358,"integrity":{"algorithm":"SHA256","hash":"cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30","blockSize":4194304,"blocks":["cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30"]},"offset":"17184699"},"lang-css.js":{"size":861,"integrity":{"algorithm":"SHA256","hash":"9b6ac483033b02572714eb4d37ee199185c41008eb2b3f46a00ab0ebce6a20c5","blockSize":4194304,"blocks":["9b6ac483033b02572714eb4d37ee199185c41008eb2b3f46a00ab0ebce6a20c5"]},"offset":"17196057"},"prettify.js":{"size":13632,"integrity":{"algorithm":"SHA256","hash":"e2e576e3bc607cd179ff511947010f645d3441a35313aec0dbd06c4437f83b77","blockSize":4194304,"blocks":["e2e576e3bc607cd179ff511947010f645d3441a35313aec0dbd06c4437f83b77"]},"offset":"17196918"}}}}},"fonts":{"files":{"OpenSans-Bold-webfont.eot":{"size":19544,"integrity":{"algorithm":"SHA256","hash":"5753780fe4ed044cfb98144f0bd6f8da560e00e485573ee038acf26b26a849b2","blockSize":4194304,"blocks":["5753780fe4ed044cfb98144f0bd6f8da560e00e485573ee038acf26b26a849b2"]},"offset":"17210550"},"OpenSans-Bold-webfont.svg":{"size":118259,"integrity":{"algorithm":"SHA256","hash":"c2ed48332ad6c7760c53dfa2a191a7ac7d943f66d3e8c304f7aa87623818a9e9","blockSize":4194304,"blocks":["c2ed48332ad6c7760c53dfa2a191a7ac7d943f66d3e8c304f7aa87623818a9e9"]},"offset":"17230094"},"OpenSans-Bold-webfont.woff":{"size":22432,"integrity":{"algorithm":"SHA256","hash":"a0357cb694b5284870c77c0dbcaf33f238004800419288afde313317b0dbd0b7","blockSize":4194304,"blocks":["a0357cb694b5284870c77c0dbcaf33f238004800419288afde313317b0dbd0b7"]},"offset":"17348353"},"OpenSans-BoldItalic-webfont.eot":{"size":20133,"integrity":{"algorithm":"SHA256","hash":"4b19a030678b683e03bea77934eb9e8322fa707c6647510fe960dbbfc7173d43","blockSize":4194304,"blocks":["4b19a030678b683e03bea77934eb9e8322fa707c6647510fe960dbbfc7173d43"]},"offset":"17370785"},"OpenSans-BoldItalic-webfont.svg":{"size":121112,"integrity":{"algorithm":"SHA256","hash":"96b0b1e218e7edff8edd5d47a9f6946252b257be013515992eb37d9e4d18ee16","blockSize":4194304,"blocks":["96b0b1e218e7edff8edd5d47a9f6946252b257be013515992eb37d9e4d18ee16"]},"offset":"17390918"},"OpenSans-BoldItalic-webfont.woff":{"size":23048,"integrity":{"algorithm":"SHA256","hash":"d3cd72b3406363d94d62d7ae9305bdad3654ffb99dd041d574524077a2c0972f","blockSize":4194304,"blocks":["d3cd72b3406363d94d62d7ae9305bdad3654ffb99dd041d574524077a2c0972f"]},"offset":"17512030"},"OpenSans-Italic-webfont.eot":{"size":20265,"integrity":{"algorithm":"SHA256","hash":"99e6e0467bb7563740c6bb641144f3dac0faf2837775adc073e71abbdd73b92f","blockSize":4194304,"blocks":["99e6e0467bb7563740c6bb641144f3dac0faf2837775adc073e71abbdd73b92f"]},"offset":"17535078"},"OpenSans-Italic-webfont.svg":{"size":122495,"integrity":{"algorithm":"SHA256","hash":"acfff465cdd737f5e493632b802e642c861bd3787087eac0e3fec2eec31e419a","blockSize":4194304,"blocks":["acfff465cdd737f5e493632b802e642c861bd3787087eac0e3fec2eec31e419a"]},"offset":"17555343"},"OpenSans-Italic-webfont.woff":{"size":23188,"integrity":{"algorithm":"SHA256","hash":"1e2916c514af4531e75fc3b6ab19dced7708cd47a7702cb1c91c1d53416c6a2c","blockSize":4194304,"blocks":["1e2916c514af4531e75fc3b6ab19dced7708cd47a7702cb1c91c1d53416c6a2c"]},"offset":"17677838"},"OpenSans-Light-webfont.eot":{"size":19514,"integrity":{"algorithm":"SHA256","hash":"83a5c3512b7e56bef9b0d5451adf664b070eb3cf6278e69e2cf4fa0b2d2ef379","blockSize":4194304,"blocks":["83a5c3512b7e56bef9b0d5451adf664b070eb3cf6278e69e2cf4fa0b2d2ef379"]},"offset":"17701026"},"OpenSans-Light-webfont.svg":{"size":117270,"integrity":{"algorithm":"SHA256","hash":"3527f01b330c2a9eb7fadb347da4e485e5ad7e1a1a30832c73f6442d4f44abeb","blockSize":4194304,"blocks":["3527f01b330c2a9eb7fadb347da4e485e5ad7e1a1a30832c73f6442d4f44abeb"]},"offset":"17720540"},"OpenSans-Light-webfont.woff":{"size":22248,"integrity":{"algorithm":"SHA256","hash":"a1cb81c9f07f1f399db66ec188c02a1c74bc382df9a8550ab8091aac93dff8a2","blockSize":4194304,"blocks":["a1cb81c9f07f1f399db66ec188c02a1c74bc382df9a8550ab8091aac93dff8a2"]},"offset":"17837810"},"OpenSans-LightItalic-webfont.eot":{"size":20535,"integrity":{"algorithm":"SHA256","hash":"fbabc5a719bc6c152b2871a552939ad8b0bc3e26e71ef8c68279cd96fc34a077","blockSize":4194304,"blocks":["fbabc5a719bc6c152b2871a552939ad8b0bc3e26e71ef8c68279cd96fc34a077"]},"offset":"17860058"},"OpenSans-LightItalic-webfont.svg":{"size":122968,"integrity":{"algorithm":"SHA256","hash":"05ec48e6d45659eac6a2c9b9a40eb0a476d22f0b866d5713ce4179b9e2a6e76d","blockSize":4194304,"blocks":["05ec48e6d45659eac6a2c9b9a40eb0a476d22f0b866d5713ce4179b9e2a6e76d"]},"offset":"17880593"},"OpenSans-LightItalic-webfont.woff":{"size":23400,"integrity":{"algorithm":"SHA256","hash":"641673bef88ac6746fb4bb5cc05efa040d03603aea985ab84e44ecc9fc51cb26","blockSize":4194304,"blocks":["641673bef88ac6746fb4bb5cc05efa040d03603aea985ab84e44ecc9fc51cb26"]},"offset":"18003561"},"OpenSans-Regular-webfont.eot":{"size":19836,"integrity":{"algorithm":"SHA256","hash":"25f7c6430e4b537dfa6bbe5554d4641c0fbdbf3f9351aab6cd91d43d11738528","blockSize":4194304,"blocks":["25f7c6430e4b537dfa6bbe5554d4641c0fbdbf3f9351aab6cd91d43d11738528"]},"offset":"18026961"},"OpenSans-Regular-webfont.svg":{"size":119399,"integrity":{"algorithm":"SHA256","hash":"9ecb8504258d8576dadbe37b75bb434cc95a0dde24225ebfea9c8aea99df8ea9","blockSize":4194304,"blocks":["9ecb8504258d8576dadbe37b75bb434cc95a0dde24225ebfea9c8aea99df8ea9"]},"offset":"18046797"},"OpenSans-Regular-webfont.woff":{"size":22660,"integrity":{"algorithm":"SHA256","hash":"22e7a1b10c110072f5a0bfd16e2197a76b279ec879bcce8978fada1dc9ee5d40","blockSize":4194304,"blocks":["22e7a1b10c110072f5a0bfd16e2197a76b279ec879bcce8978fada1dc9ee5d40"]},"offset":"18166196"}}}}},"build":{"files":{"md4.min.js":{"size":6890,"integrity":{"algorithm":"SHA256","hash":"77a5996327a38dd8eaeba6b536cb17f9593e7cf0bcab71e5bb0b74649cda4b77","blockSize":4194304,"blocks":["77a5996327a38dd8eaeba6b536cb17f9593e7cf0bcab71e5bb0b74649cda4b77"]},"offset":"18188856"}}}}},"jsbi":{"files":{"LICENSE":{"size":10174,"integrity":{"algorithm":"SHA256","hash":"9568a2b155e66ac3e0ba1fd80b52b827b9460e6cf6f233125e7cbca8e206ddc3","blockSize":4194304,"blocks":["9568a2b155e66ac3e0ba1fd80b52b827b9460e6cf6f233125e7cbca8e206ddc3"]},"offset":"18195746"},"package.json":{"size":626,"integrity":{"algorithm":"SHA256","hash":"03228e6faf78f113520a324ef002f8a5ed11baab186f92be58b1958fdb5c9467","blockSize":4194304,"blocks":["03228e6faf78f113520a324ef002f8a5ed11baab186f92be58b1958fdb5c9467"]},"offset":"18205920"},"dist":{"files":{"jsbi-cjs.js":{"size":28789,"integrity":{"algorithm":"SHA256","hash":"8f81afe519423fccdd0f28b1ab55839a1d05b7ccce16d89795e0b66aca5f4708","blockSize":4194304,"blocks":["8f81afe519423fccdd0f28b1ab55839a1d05b7ccce16d89795e0b66aca5f4708"]},"offset":"18206546"},"jsbi-umd.js":{"size":34389,"integrity":{"algorithm":"SHA256","hash":"c4a0d1c062590c067beb801cbd2dc8bc3a139861f9ba2a465b3958548e7dc13c","blockSize":4194304,"blocks":["c4a0d1c062590c067beb801cbd2dc8bc3a139861f9ba2a465b3958548e7dc13c"]},"offset":"18235335"},"jsbi.mjs":{"size":28773,"integrity":{"algorithm":"SHA256","hash":"010bfe4de6c8c7aa1d91f46a198fac51545ccea12afbe135329ef6924aae00a6","blockSize":4194304,"blocks":["010bfe4de6c8c7aa1d91f46a198fac51545ccea12afbe135329ef6924aae00a6"]},"offset":"18269724"}}}}},"jsonfile":{"files":{"LICENSE":{"size":1110,"integrity":{"algorithm":"SHA256","hash":"a9801fb52ba22ef808682a094da8a7a480584b7ed0dfd0d888ab543616335031","blockSize":4194304,"blocks":["a9801fb52ba22ef808682a094da8a7a480584b7ed0dfd0d888ab543616335031"]},"offset":"18298497"},"index.js":{"size":1900,"integrity":{"algorithm":"SHA256","hash":"2cdf22ffb5a170ad2cf10cbdf647e2a9366b6afa11e9b4c2370d0cf5b1f700b1","blockSize":4194304,"blocks":["2cdf22ffb5a170ad2cf10cbdf647e2a9366b6afa11e9b4c2370d0cf5b1f700b1"]},"offset":"18299607"},"package.json":{"size":558,"integrity":{"algorithm":"SHA256","hash":"97dd73da7fecf4b16cf7bb766cbfee7d55de9c7e2b864b982a0936247310eac8","blockSize":4194304,"blocks":["97dd73da7fecf4b16cf7bb766cbfee7d55de9c7e2b864b982a0936247310eac8"]},"offset":"18301507"},"utils.js":{"size":498,"integrity":{"algorithm":"SHA256","hash":"b0c188696676561411f3c5784d7de61bf21927f9c334e0cfb9136a8b7c82be5d","blockSize":4194304,"blocks":["b0c188696676561411f3c5784d7de61bf21927f9c334e0cfb9136a8b7c82be5d"]},"offset":"18302065"}}},"jsonwebtoken":{"files":{"LICENSE":{"size":1121,"integrity":{"algorithm":"SHA256","hash":"2144eb6894cb440fde6b2b3aaae3b617c8f1dc9bb19813079dcf62ec6c517042","blockSize":4194304,"blocks":["2144eb6894cb440fde6b2b3aaae3b617c8f1dc9bb19813079dcf62ec6c517042"]},"offset":"18302563"},"decode.js":{"size":767,"integrity":{"algorithm":"SHA256","hash":"32fa49ba4da4e2eb75f91a84385d8718660fe5b51192ed317c6161b5d72a4a89","blockSize":4194304,"blocks":["32fa49ba4da4e2eb75f91a84385d8718660fe5b51192ed317c6161b5d72a4a89"]},"offset":"18303684"},"index.js":{"size":276,"integrity":{"algorithm":"SHA256","hash":"aae460b3f08f3f8b1cb229ee226fb084540fec04b6ddc8fc01463068ebf4b7de","blockSize":4194304,"blocks":["aae460b3f08f3f8b1cb229ee226fb084540fec04b6ddc8fc01463068ebf4b7de"]},"offset":"18304451"},"package.json":{"size":1007,"integrity":{"algorithm":"SHA256","hash":"a75562f64b08e733960c2901f3ff950cd15f0ee4e4aa622ec5b8ba40fd4df380","blockSize":4194304,"blocks":["a75562f64b08e733960c2901f3ff950cd15f0ee4e4aa622ec5b8ba40fd4df380"]},"offset":"18304727"},"sign.js":{"size":6823,"integrity":{"algorithm":"SHA256","hash":"39372668c0a9d453800a43bebf4b6abc2bb2b0e7b67589b33f2aa0d39312ed7d","blockSize":4194304,"blocks":["39372668c0a9d453800a43bebf4b6abc2bb2b0e7b67589b33f2aa0d39312ed7d"]},"offset":"18305734"},"verify.js":{"size":6939,"integrity":{"algorithm":"SHA256","hash":"04850d947ea1764285dfd0945e604151cd8335fe5ed1461db944b64be2524f34","blockSize":4194304,"blocks":["04850d947ea1764285dfd0945e604151cd8335fe5ed1461db944b64be2524f34"]},"offset":"18312557"},"lib":{"files":{"JsonWebTokenError.js":{"size":428,"integrity":{"algorithm":"SHA256","hash":"35fdb68dea632779c5fa58f225fd02d65a6d8e15a004928a18b48724da423428","blockSize":4194304,"blocks":["35fdb68dea632779c5fa58f225fd02d65a6d8e15a004928a18b48724da423428"]},"offset":"18319496"},"NotBeforeError.js":{"size":362,"integrity":{"algorithm":"SHA256","hash":"7e7de14d16fc9c308c53d4303309e4f924116d470ffec8e91436064382df95ca","blockSize":4194304,"blocks":["7e7de14d16fc9c308c53d4303309e4f924116d470ffec8e91436064382df95ca"]},"offset":"18319924"},"TokenExpiredError.js":{"size":395,"integrity":{"algorithm":"SHA256","hash":"ba5ac1133bbd1db3ebc297f04657b256294771f1688a42588abebdef172f5c70","blockSize":4194304,"blocks":["ba5ac1133bbd1db3ebc297f04657b256294771f1688a42588abebdef172f5c70"]},"offset":"18320286"},"psSupported.js":{"size":107,"integrity":{"algorithm":"SHA256","hash":"422fd617085929da78d1c4b2d4618af81bec231bffc635301056b4bd09a11b21","blockSize":4194304,"blocks":["422fd617085929da78d1c4b2d4618af81bec231bffc635301056b4bd09a11b21"]},"offset":"18320681"},"timespan.js":{"size":412,"integrity":{"algorithm":"SHA256","hash":"328f90a9a030c4d63159c75123e679c80e851ea9ea732d7f3345db7f4cd519d7","blockSize":4194304,"blocks":["328f90a9a030c4d63159c75123e679c80e851ea9ea732d7f3345db7f4cd519d7"]},"offset":"18320788"}}},"node_modules":{"files":{"jwa":{"files":{"LICENSE":{"size":1068,"integrity":{"algorithm":"SHA256","hash":"3320319f8a5f42bc4254e65471eca7a5ea4dc8c883c4c24b4868e36b14890bcf","blockSize":4194304,"blocks":["3320319f8a5f42bc4254e65471eca7a5ea4dc8c883c4c24b4868e36b14890bcf"]},"offset":"42779874"},"index.js":{"size":6501,"integrity":{"algorithm":"SHA256","hash":"151f080eb7ed3a69edf2713338fe50618abc4abdbfdc956e08f9c4dee6670d54","blockSize":4194304,"blocks":["151f080eb7ed3a69edf2713338fe50618abc4abdbfdc956e08f9c4dee6670d54"]},"offset":"42780942"},"package.json":{"size":614,"integrity":{"algorithm":"SHA256","hash":"f5bf2fb5e7b1759f227a46e3355a749369d9e102cb7c4b9d655ae1647156eda7","blockSize":4194304,"blocks":["f5bf2fb5e7b1759f227a46e3355a749369d9e102cb7c4b9d655ae1647156eda7"]},"offset":"42787443"}}},"jws":{"files":{"LICENSE":{"size":1068,"integrity":{"algorithm":"SHA256","hash":"3320319f8a5f42bc4254e65471eca7a5ea4dc8c883c4c24b4868e36b14890bcf","blockSize":4194304,"blocks":["3320319f8a5f42bc4254e65471eca7a5ea4dc8c883c4c24b4868e36b14890bcf"]},"offset":"42788057"},"index.js":{"size":609,"integrity":{"algorithm":"SHA256","hash":"52b3ac7e9675ed8ef5a1ca48679f0d0da7e1f4639e297a503c9b541846704c52","blockSize":4194304,"blocks":["52b3ac7e9675ed8ef5a1ca48679f0d0da7e1f4639e297a503c9b541846704c52"]},"offset":"42789125"},"package.json":{"size":497,"integrity":{"algorithm":"SHA256","hash":"70e2b61f1c3b3996be4e14ff89c2e1c7e98c538d39f9e056d1e526ea87b53aac","blockSize":4194304,"blocks":["70e2b61f1c3b3996be4e14ff89c2e1c7e98c538d39f9e056d1e526ea87b53aac"]},"offset":"42789734"},"lib":{"files":{"data-stream.js":{"size":1242,"integrity":{"algorithm":"SHA256","hash":"21b28bf70f771856223b8f48c563ac6f7f0158eefe7ca5955dedc122f901fa20","blockSize":4194304,"blocks":["21b28bf70f771856223b8f48c563ac6f7f0158eefe7ca5955dedc122f901fa20"]},"offset":"42790231"},"sign-stream.js":{"size":2197,"integrity":{"algorithm":"SHA256","hash":"7bc82040d98cb865d1a986ce2c6adde5e9651e0551a9ab16583aa171224475b8","blockSize":4194304,"blocks":["7bc82040d98cb865d1a986ce2c6adde5e9651e0551a9ab16583aa171224475b8"]},"offset":"42791473"},"tostring.js":{"size":262,"integrity":{"algorithm":"SHA256","hash":"f564b878221935e72e05caf3fbc483d44550f10958144d00fb2665beae771bfc","blockSize":4194304,"blocks":["f564b878221935e72e05caf3fbc483d44550f10958144d00fb2665beae771bfc"]},"offset":"42793670"},"verify-stream.js":{"size":3226,"integrity":{"algorithm":"SHA256","hash":"ef10ee616c5cc89286781a7e880b4d98f0ce975d54ad1d52fff3868a4437475a","blockSize":4194304,"blocks":["ef10ee616c5cc89286781a7e880b4d98f0ce975d54ad1d52fff3868a4437475a"]},"offset":"42793932"}}}}},"semver":{"files":{"LICENSE":{"size":765,"integrity":{"algorithm":"SHA256","hash":"4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b","blockSize":4194304,"blocks":["4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b"]},"offset":"42797158"},"package.json":{"size":407,"integrity":{"algorithm":"SHA256","hash":"08815523007e8322d813b188b8a1fd9721a29599304004d8ec2c8f854251bf11","blockSize":4194304,"blocks":["08815523007e8322d813b188b8a1fd9721a29599304004d8ec2c8f854251bf11"]},"offset":"42797923"},"range.bnf":{"size":619,"integrity":{"algorithm":"SHA256","hash":"ed628fdaff64be366d07f6cc4559eae4de109826f743ea7f5e1588c370bca49a","blockSize":4194304,"blocks":["ed628fdaff64be366d07f6cc4559eae4de109826f743ea7f5e1588c370bca49a"]},"offset":"42798330"},"semver.js":{"size":38803,"integrity":{"algorithm":"SHA256","hash":"161e134793e0789620e9c3257ea47b28049b977f08e817dcfa9e2e30cca8bdf4","blockSize":4194304,"blocks":["161e134793e0789620e9c3257ea47b28049b977f08e817dcfa9e2e30cca8bdf4"]},"offset":"42798949"},"bin":{"files":{"semver":{"size":4418,"integrity":{"algorithm":"SHA256","hash":"03f83d135afd4855683ff95d708f671593af782471daf4794ba9079178aa1b03","blockSize":4194304,"blocks":["03f83d135afd4855683ff95d708f671593af782471daf4794ba9079178aa1b03"]},"offset":"42837752"}}}}}}}}},"jwa":{"files":{"LICENSE":{"size":1068,"integrity":{"algorithm":"SHA256","hash":"3320319f8a5f42bc4254e65471eca7a5ea4dc8c883c4c24b4868e36b14890bcf","blockSize":4194304,"blocks":["3320319f8a5f42bc4254e65471eca7a5ea4dc8c883c4c24b4868e36b14890bcf"]},"offset":"18321200"},"index.js":{"size":6500,"integrity":{"algorithm":"SHA256","hash":"dcb27af3b9613879d0076ba3ac3b4bc300153b9a3aa36b87989735aa768ddbf7","blockSize":4194304,"blocks":["dcb27af3b9613879d0076ba3ac3b4bc300153b9a3aa36b87989735aa768ddbf7"]},"offset":"18322268"},"package.json":{"size":614,"integrity":{"algorithm":"SHA256","hash":"975c417dda4f291b8535a085bb72dbf6e9348d6571715f2ccf2a838f9fafdc29","blockSize":4194304,"blocks":["975c417dda4f291b8535a085bb72dbf6e9348d6571715f2ccf2a838f9fafdc29"]},"offset":"18328768"}}},"jws":{"files":{"LICENSE":{"size":1068,"integrity":{"algorithm":"SHA256","hash":"3320319f8a5f42bc4254e65471eca7a5ea4dc8c883c4c24b4868e36b14890bcf","blockSize":4194304,"blocks":["3320319f8a5f42bc4254e65471eca7a5ea4dc8c883c4c24b4868e36b14890bcf"]},"offset":"18329382"},"index.js":{"size":609,"integrity":{"algorithm":"SHA256","hash":"52b3ac7e9675ed8ef5a1ca48679f0d0da7e1f4639e297a503c9b541846704c52","blockSize":4194304,"blocks":["52b3ac7e9675ed8ef5a1ca48679f0d0da7e1f4639e297a503c9b541846704c52"]},"offset":"18330450"},"package.json":{"size":497,"integrity":{"algorithm":"SHA256","hash":"eaaa11c0dae4c18141e56aa863c01b5fbcb5001a48ab4a102f096a5ba56b85bc","blockSize":4194304,"blocks":["eaaa11c0dae4c18141e56aa863c01b5fbcb5001a48ab4a102f096a5ba56b85bc"]},"offset":"18331059"},"lib":{"files":{"data-stream.js":{"size":1242,"integrity":{"algorithm":"SHA256","hash":"21b28bf70f771856223b8f48c563ac6f7f0158eefe7ca5955dedc122f901fa20","blockSize":4194304,"blocks":["21b28bf70f771856223b8f48c563ac6f7f0158eefe7ca5955dedc122f901fa20"]},"offset":"18331556"},"sign-stream.js":{"size":2197,"integrity":{"algorithm":"SHA256","hash":"7bc82040d98cb865d1a986ce2c6adde5e9651e0551a9ab16583aa171224475b8","blockSize":4194304,"blocks":["7bc82040d98cb865d1a986ce2c6adde5e9651e0551a9ab16583aa171224475b8"]},"offset":"18332798"},"tostring.js":{"size":262,"integrity":{"algorithm":"SHA256","hash":"f564b878221935e72e05caf3fbc483d44550f10958144d00fb2665beae771bfc","blockSize":4194304,"blocks":["f564b878221935e72e05caf3fbc483d44550f10958144d00fb2665beae771bfc"]},"offset":"18334995"},"verify-stream.js":{"size":3226,"integrity":{"algorithm":"SHA256","hash":"ef10ee616c5cc89286781a7e880b4d98f0ce975d54ad1d52fff3868a4437475a","blockSize":4194304,"blocks":["ef10ee616c5cc89286781a7e880b4d98f0ce975d54ad1d52fff3868a4437475a"]},"offset":"18335257"}}}}},"lazy-val":{"files":{"package.json":{"size":330,"integrity":{"algorithm":"SHA256","hash":"a6f4140d0187f32d95545835aca38684e18d0fcfbecb51709b0aaa54decd3c0b","blockSize":4194304,"blocks":["a6f4140d0187f32d95545835aca38684e18d0fcfbecb51709b0aaa54decd3c0b"]},"offset":"18338483"},"out":{"files":{"main.js":{"size":605,"integrity":{"algorithm":"SHA256","hash":"358fa8cba70c9140edafa85c0b7b25c7261939480186167e6b3440905f5b47da","blockSize":4194304,"blocks":["358fa8cba70c9140edafa85c0b7b25c7261939480186167e6b3440905f5b47da"]},"offset":"18338813"}}}}},"lodash":{"files":{"LICENSE":{"size":1952,"integrity":{"algorithm":"SHA256","hash":"f71e8ed126b46346494aad5486874cd8f0aafe95092ed67d2e3cb6110f939abc","blockSize":4194304,"blocks":["f71e8ed126b46346494aad5486874cd8f0aafe95092ed67d2e3cb6110f939abc"]},"offset":"18339418"},"_DataView.js":{"size":210,"integrity":{"algorithm":"SHA256","hash":"37b8d46c9ca5e53bac157a23154bb3701759fb616ee7e2dc04aa2a7a2715c0bb","blockSize":4194304,"blocks":["37b8d46c9ca5e53bac157a23154bb3701759fb616ee7e2dc04aa2a7a2715c0bb"]},"offset":"18341370"},"_Hash.js":{"size":747,"integrity":{"algorithm":"SHA256","hash":"853c8a1c5c0b0e14fc873804db3943d3a4ba6378da6ee3793d44a12ace5871c5","blockSize":4194304,"blocks":["853c8a1c5c0b0e14fc873804db3943d3a4ba6378da6ee3793d44a12ace5871c5"]},"offset":"18341580"},"_LazyWrapper.js":{"size":773,"integrity":{"algorithm":"SHA256","hash":"82ab7999bba741c5ad424a6c3da55177a799e53f0a18c3d726d9d7f7e58783ee","blockSize":4194304,"blocks":["82ab7999bba741c5ad424a6c3da55177a799e53f0a18c3d726d9d7f7e58783ee"]},"offset":"18342327"},"_ListCache.js":{"size":869,"integrity":{"algorithm":"SHA256","hash":"2b10bf68a2e572e392f8f5b1d47c8fbd3f759d1fc80482bf57bc768596ec862c","blockSize":4194304,"blocks":["2b10bf68a2e572e392f8f5b1d47c8fbd3f759d1fc80482bf57bc768596ec862c"]},"offset":"18343100"},"_LodashWrapper.js":{"size":611,"integrity":{"algorithm":"SHA256","hash":"48b34858ac0dcc49bbf4e62a863a6bdd0dad39d238a50de389ac2cd938667e6e","blockSize":4194304,"blocks":["48b34858ac0dcc49bbf4e62a863a6bdd0dad39d238a50de389ac2cd938667e6e"]},"offset":"18343969"},"_Map.js":{"size":195,"integrity":{"algorithm":"SHA256","hash":"69ecf277dfdd5d1e16993fdc264e011927c1174fd9610648a16ca32d4a275200","blockSize":4194304,"blocks":["69ecf277dfdd5d1e16993fdc264e011927c1174fd9610648a16ca32d4a275200"]},"offset":"18344580"},"_MapCache.js":{"size":869,"integrity":{"algorithm":"SHA256","hash":"5db84bcbca26aec6bceed93b1ab05c496ac2be3e1623d226ca46f39d367cc265","blockSize":4194304,"blocks":["5db84bcbca26aec6bceed93b1ab05c496ac2be3e1623d226ca46f39d367cc265"]},"offset":"18344775"},"_Promise.js":{"size":207,"integrity":{"algorithm":"SHA256","hash":"4f8391d51b7100e4d8c82f71ac8d77ac0a9ec05d327afd5fdc1855d2a997040d","blockSize":4194304,"blocks":["4f8391d51b7100e4d8c82f71ac8d77ac0a9ec05d327afd5fdc1855d2a997040d"]},"offset":"18345644"},"_Set.js":{"size":195,"integrity":{"algorithm":"SHA256","hash":"0517203198c611581586fe06691eaa5f7b242e362ee1d231b7e5874b639371cf","blockSize":4194304,"blocks":["0517203198c611581586fe06691eaa5f7b242e362ee1d231b7e5874b639371cf"]},"offset":"18345851"},"_SetCache.js":{"size":632,"integrity":{"algorithm":"SHA256","hash":"0ca727d1533e9ea06dbb15067772529018b90e106be4a58ed769185e45c19222","blockSize":4194304,"blocks":["0ca727d1533e9ea06dbb15067772529018b90e106be4a58ed769185e45c19222"]},"offset":"18346046"},"_Stack.js":{"size":734,"integrity":{"algorithm":"SHA256","hash":"ff0cad8911657e083892b17d433e9af1427c23c647e9276b654d957c9300663f","blockSize":4194304,"blocks":["ff0cad8911657e083892b17d433e9af1427c23c647e9276b654d957c9300663f"]},"offset":"18346678"},"_Symbol.js":{"size":118,"integrity":{"algorithm":"SHA256","hash":"23becdb07e69dcf4555a924eb4ddfee1ce7c64ed369784fdbe01cc89de7b547e","blockSize":4194304,"blocks":["23becdb07e69dcf4555a924eb4ddfee1ce7c64ed369784fdbe01cc89de7b547e"]},"offset":"18347412"},"_Uint8Array.js":{"size":130,"integrity":{"algorithm":"SHA256","hash":"65cebe8429a19d773463a02c99c92772be5ceea26240aae7e8c4ab830085e1cd","blockSize":4194304,"blocks":["65cebe8429a19d773463a02c99c92772be5ceea26240aae7e8c4ab830085e1cd"]},"offset":"18347530"},"_WeakMap.js":{"size":207,"integrity":{"algorithm":"SHA256","hash":"8ae352037d0bb071ff875d2936c43ae70b586ca53af14de98eed592ab084b63b","blockSize":4194304,"blocks":["8ae352037d0bb071ff875d2936c43ae70b586ca53af14de98eed592ab084b63b"]},"offset":"18347660"},"_apply.js":{"size":714,"integrity":{"algorithm":"SHA256","hash":"5ca933653821ae52ba593356d8c761624ed66f0b40860c7648a3acf278f0596a","blockSize":4194304,"blocks":["5ca933653821ae52ba593356d8c761624ed66f0b40860c7648a3acf278f0596a"]},"offset":"18347867"},"_arrayAggregator.js":{"size":684,"integrity":{"algorithm":"SHA256","hash":"fbd5a9f515a50712b4f145f74ea236f7a5f11ffbc851f900a0a9b6c80ce29c6d","blockSize":4194304,"blocks":["fbd5a9f515a50712b4f145f74ea236f7a5f11ffbc851f900a0a9b6c80ce29c6d"]},"offset":"18348581"},"_arrayEach.js":{"size":537,"integrity":{"algorithm":"SHA256","hash":"6fd506ed7d2e0a3b216ec2969f391e7b8d2c7c123a0bb49bbeccea55da740cb5","blockSize":4194304,"blocks":["6fd506ed7d2e0a3b216ec2969f391e7b8d2c7c123a0bb49bbeccea55da740cb5"]},"offset":"18349265"},"_arrayEachRight.js":{"size":528,"integrity":{"algorithm":"SHA256","hash":"3410df94969c310f7e3146d694e40d7d2ea20ed85f508057a8398bb870906f7d","blockSize":4194304,"blocks":["3410df94969c310f7e3146d694e40d7d2ea20ed85f508057a8398bb870906f7d"]},"offset":"18349802"},"_arrayEvery.js":{"size":597,"integrity":{"algorithm":"SHA256","hash":"c9de9f02349af14ef1c23f0579c1b24f0756c0776260a3942f9705eec284960c","blockSize":4194304,"blocks":["c9de9f02349af14ef1c23f0579c1b24f0756c0776260a3942f9705eec284960c"]},"offset":"18350330"},"_arrayFilter.js":{"size":632,"integrity":{"algorithm":"SHA256","hash":"12fd6cb97760b1bcb96425c29119ac39c747c6c6b24a4e2398cdc8d859a3e574","blockSize":4194304,"blocks":["12fd6cb97760b1bcb96425c29119ac39c747c6c6b24a4e2398cdc8d859a3e574"]},"offset":"18350927"},"_arrayIncludes.js":{"size":526,"integrity":{"algorithm":"SHA256","hash":"7f4bc35c7982e2df9b1c3fc1f1dae297327ab45a1b942b5beee9814bc061daae","blockSize":4194304,"blocks":["7f4bc35c7982e2df9b1c3fc1f1dae297327ab45a1b942b5beee9814bc061daae"]},"offset":"18351559"},"_arrayIncludesWith.js":{"size":615,"integrity":{"algorithm":"SHA256","hash":"a1310b2b3abe1a6733791f803bad85ea25147bf84512cfe4380ef8afc738b81b","blockSize":4194304,"blocks":["a1310b2b3abe1a6733791f803bad85ea25147bf84512cfe4380ef8afc738b81b"]},"offset":"18352085"},"_arrayLikeKeys.js":{"size":1778,"integrity":{"algorithm":"SHA256","hash":"456bbf153f5601f6835cfa2e72e88390319ec40333b8a94dfa4e11f7cea98acd","blockSize":4194304,"blocks":["456bbf153f5601f6835cfa2e72e88390319ec40333b8a94dfa4e11f7cea98acd"]},"offset":"18352700"},"_arrayMap.js":{"size":556,"integrity":{"algorithm":"SHA256","hash":"5917472b5772ba66ed65019e35da11c7a2a45737e25bc0d7e5635e3af73383bd","blockSize":4194304,"blocks":["5917472b5772ba66ed65019e35da11c7a2a45737e25bc0d7e5635e3af73383bd"]},"offset":"18354478"},"_arrayPush.js":{"size":437,"integrity":{"algorithm":"SHA256","hash":"fc4429d7cd9b2b241877d0f28c746a7475341126077c4c165cfe78806a266d2f","blockSize":4194304,"blocks":["fc4429d7cd9b2b241877d0f28c746a7475341126077c4c165cfe78806a266d2f"]},"offset":"18355034"},"_arrayReduce.js":{"size":787,"integrity":{"algorithm":"SHA256","hash":"3b8b443455becd548f91970799bb8dd0942284cb6b131464075076cd6c3911c3","blockSize":4194304,"blocks":["3b8b443455becd548f91970799bb8dd0942284cb6b131464075076cd6c3911c3"]},"offset":"18355471"},"_arrayReduceRight.js":{"size":777,"integrity":{"algorithm":"SHA256","hash":"0978dabc488477a5a3e79624d403c85308df229c688048d5b440483f08e9b019","blockSize":4194304,"blocks":["0978dabc488477a5a3e79624d403c85308df229c688048d5b440483f08e9b019"]},"offset":"18356258"},"_arraySample.js":{"size":363,"integrity":{"algorithm":"SHA256","hash":"92bf156e5a398c8a1156b88c6c7c083defd509b4aca807d9e2e9bd2d2e742927","blockSize":4194304,"blocks":["92bf156e5a398c8a1156b88c6c7c083defd509b4aca807d9e2e9bd2d2e742927"]},"offset":"18357035"},"_arraySampleSize.js":{"size":500,"integrity":{"algorithm":"SHA256","hash":"0e54c15d9a074cc85e5b6a0eb93c5c69706ad5cb6daa99dfe03cbf3095ae1015","blockSize":4194304,"blocks":["0e54c15d9a074cc85e5b6a0eb93c5c69706ad5cb6daa99dfe03cbf3095ae1015"]},"offset":"18357398"},"_arrayShuffle.js":{"size":365,"integrity":{"algorithm":"SHA256","hash":"09e353d332e22f6d553b5aa90ab1cf8e1a03c190cacc4867b260ff5e63bab91d","blockSize":4194304,"blocks":["09e353d332e22f6d553b5aa90ab1cf8e1a03c190cacc4867b260ff5e63bab91d"]},"offset":"18357898"},"_arraySome.js":{"size":594,"integrity":{"algorithm":"SHA256","hash":"e8cc6994df67b7f02600d1f58674da807ec59db9964aaba2d9834f04b6f0baf1","blockSize":4194304,"blocks":["e8cc6994df67b7f02600d1f58674da807ec59db9964aaba2d9834f04b6f0baf1"]},"offset":"18358263"},"_asciiSize.js":{"size":271,"integrity":{"algorithm":"SHA256","hash":"150568c62dd6f77ee9bfb45416b8f8609dfe1759ede9d9bdf0e072140bdce5f3","blockSize":4194304,"blocks":["150568c62dd6f77ee9bfb45416b8f8609dfe1759ede9d9bdf0e072140bdce5f3"]},"offset":"18358857"},"_asciiToArray.js":{"size":257,"integrity":{"algorithm":"SHA256","hash":"202817d7cec0944807fb2ae3a85cdf6103943cd23a4afdd256177c83eacf1296","blockSize":4194304,"blocks":["202817d7cec0944807fb2ae3a85cdf6103943cd23a4afdd256177c83eacf1296"]},"offset":"18359128"},"_asciiWords.js":{"size":404,"integrity":{"algorithm":"SHA256","hash":"1874564a9feb8b4c34f11f991a2d12d80bf650bad7fc589854c188c86d0f9c5d","blockSize":4194304,"blocks":["1874564a9feb8b4c34f11f991a2d12d80bf650bad7fc589854c188c86d0f9c5d"]},"offset":"18359385"},"_assignMergeValue.js":{"size":582,"integrity":{"algorithm":"SHA256","hash":"350c1dd6528b73a15f3ce3082064fbf23c0819f5c2d06b4ab24ef6b61ab863d6","blockSize":4194304,"blocks":["350c1dd6528b73a15f3ce3082064fbf23c0819f5c2d06b4ab24ef6b61ab863d6"]},"offset":"18359789"},"_assignValue.js":{"size":899,"integrity":{"algorithm":"SHA256","hash":"86658dd4d24a55b19ed938416c179d57a729bac601133c237ee9f900dd21027d","blockSize":4194304,"blocks":["86658dd4d24a55b19ed938416c179d57a729bac601133c237ee9f900dd21027d"]},"offset":"18360371"},"_assocIndexOf.js":{"size":487,"integrity":{"algorithm":"SHA256","hash":"f98b725ea04a2979f0ad29afff6794ec83ec420342bae041934a829244dacb96","blockSize":4194304,"blocks":["f98b725ea04a2979f0ad29afff6794ec83ec420342bae041934a829244dacb96"]},"offset":"18361270"},"_baseAggregator.js":{"size":746,"integrity":{"algorithm":"SHA256","hash":"b3bf7b463fba23ff5b27d9cceb3ad8ea237db796723447ce90ac02b227cce29a","blockSize":4194304,"blocks":["b3bf7b463fba23ff5b27d9cceb3ad8ea237db796723447ce90ac02b227cce29a"]},"offset":"18361757"},"_baseAssign.js":{"size":470,"integrity":{"algorithm":"SHA256","hash":"88c05474e3ee06e4d3e3531f4df2403718c47447827bfc3d5d735344b60db968","blockSize":4194304,"blocks":["88c05474e3ee06e4d3e3531f4df2403718c47447827bfc3d5d735344b60db968"]},"offset":"18362503"},"_baseAssignIn.js":{"size":482,"integrity":{"algorithm":"SHA256","hash":"d1bfee9cde1e5e1bafdb114ec78ecdcb5ffc2468df53f3fc57949e7033ce41f3","blockSize":4194304,"blocks":["d1bfee9cde1e5e1bafdb114ec78ecdcb5ffc2468df53f3fc57949e7033ce41f3"]},"offset":"18362973"},"_baseAssignValue.js":{"size":625,"integrity":{"algorithm":"SHA256","hash":"51498c7a9eb90edf2626bbb90dfd1119acb2ee9779c916ab3fb7b7285ba6c746","blockSize":4194304,"blocks":["51498c7a9eb90edf2626bbb90dfd1119acb2ee9779c916ab3fb7b7285ba6c746"]},"offset":"18363455"},"_baseAt.js":{"size":569,"integrity":{"algorithm":"SHA256","hash":"a42262b20c444d25150f2d3132b9b66437b5c024e767ef1474bfc96b80cc5733","blockSize":4194304,"blocks":["a42262b20c444d25150f2d3132b9b66437b5c024e767ef1474bfc96b80cc5733"]},"offset":"18364080"},"_baseClamp.js":{"size":571,"integrity":{"algorithm":"SHA256","hash":"cf85272f27502a0c808e3d5b79713214018b893e7ddd02a4bc55fd137c0546c7","blockSize":4194304,"blocks":["cf85272f27502a0c808e3d5b79713214018b893e7ddd02a4bc55fd137c0546c7"]},"offset":"18364649"},"_baseClone.js":{"size":5609,"integrity":{"algorithm":"SHA256","hash":"3ca40d0ae6c428eb8509a98017d9330c27616075c9d257198ae5e0d0b36ed79b","blockSize":4194304,"blocks":["3ca40d0ae6c428eb8509a98017d9330c27616075c9d257198ae5e0d0b36ed79b"]},"offset":"18365220"},"_baseConforms.js":{"size":484,"integrity":{"algorithm":"SHA256","hash":"ef6ccf2c230ac284d2be5512e131190eb5ed65e36b75da6c111cdf191860b632","blockSize":4194304,"blocks":["ef6ccf2c230ac284d2be5512e131190eb5ed65e36b75da6c111cdf191860b632"]},"offset":"18370829"},"_baseConformsTo.js":{"size":718,"integrity":{"algorithm":"SHA256","hash":"60883381e30134c7d87dc7e0fe2fcaacfe5469af143a68ca1baed185baff0f4f","blockSize":4194304,"blocks":["60883381e30134c7d87dc7e0fe2fcaacfe5469af143a68ca1baed185baff0f4f"]},"offset":"18371313"},"_baseCreate.js":{"size":686,"integrity":{"algorithm":"SHA256","hash":"5d1669e013628e0891352720d6a56b6bf628404e13d27298d6e5473bd4ce87e4","blockSize":4194304,"blocks":["5d1669e013628e0891352720d6a56b6bf628404e13d27298d6e5473bd4ce87e4"]},"offset":"18372031"},"_baseDelay.js":{"size":672,"integrity":{"algorithm":"SHA256","hash":"a19afb2bce50e8cdda0304df029d3b7085014b3189c08cd11867522a0715069d","blockSize":4194304,"blocks":["a19afb2bce50e8cdda0304df029d3b7085014b3189c08cd11867522a0715069d"]},"offset":"18372717"},"_baseDifference.js":{"size":1917,"integrity":{"algorithm":"SHA256","hash":"21bf6502bd0fd64f2bbe11eedd9b17e2e93440220f4a044e80b20fc507221812","blockSize":4194304,"blocks":["21bf6502bd0fd64f2bbe11eedd9b17e2e93440220f4a044e80b20fc507221812"]},"offset":"18373389"},"_baseEach.js":{"size":455,"integrity":{"algorithm":"SHA256","hash":"d5e014823a4dd111149247d9f5921c172247c460cfa19db3c257926537ad1e00","blockSize":4194304,"blocks":["d5e014823a4dd111149247d9f5921c172247c460cfa19db3c257926537ad1e00"]},"offset":"18375306"},"_baseEachRight.js":{"size":491,"integrity":{"algorithm":"SHA256","hash":"2465f3b6221fbbe10ca2efd02c3240a2824174f6c2bc2aadbf05c168c6d659da","blockSize":4194304,"blocks":["2465f3b6221fbbe10ca2efd02c3240a2824174f6c2bc2aadbf05c168c6d659da"]},"offset":"18375761"},"_baseEvery.js":{"size":625,"integrity":{"algorithm":"SHA256","hash":"04509d8663294896a7215426ff97e7b6626c02027e351439e39c68ebf18e8adc","blockSize":4194304,"blocks":["04509d8663294896a7215426ff97e7b6626c02027e351439e39c68ebf18e8adc"]},"offset":"18376252"},"_baseExtremum.js":{"size":897,"integrity":{"algorithm":"SHA256","hash":"b768c0721157f9e925141837698c459edd2c1dbdd43a821cc14d3b1f97751b3a","blockSize":4194304,"blocks":["b768c0721157f9e925141837698c459edd2c1dbdd43a821cc14d3b1f97751b3a"]},"offset":"18376877"},"_baseFill.js":{"size":843,"integrity":{"algorithm":"SHA256","hash":"4e364f2b0ac343212c92f0e03a6268baa042db0e6800e5c0c6590651ed4e605b","blockSize":4194304,"blocks":["4e364f2b0ac343212c92f0e03a6268baa042db0e6800e5c0c6590651ed4e605b"]},"offset":"18377774"},"_baseFilter.js":{"size":590,"integrity":{"algorithm":"SHA256","hash":"cc817c4fce14c09a765f6ee71e790930d1fac5a44b7ade7604e11b97976e8f73","blockSize":4194304,"blocks":["cc817c4fce14c09a765f6ee71e790930d1fac5a44b7ade7604e11b97976e8f73"]},"offset":"18378617"},"_baseFindIndex.js":{"size":766,"integrity":{"algorithm":"SHA256","hash":"07e9942a47eeb723eb9fa1bc0f7240f93ad9f52d702c0f37d7163670000350c1","blockSize":4194304,"blocks":["07e9942a47eeb723eb9fa1bc0f7240f93ad9f52d702c0f37d7163670000350c1"]},"offset":"18379207"},"_baseFindKey.js":{"size":747,"integrity":{"algorithm":"SHA256","hash":"a9958db300649f6f91cd8d35608b2234168a388702754bc6715c7966205a1c02","blockSize":4194304,"blocks":["a9958db300649f6f91cd8d35608b2234168a388702754bc6715c7966205a1c02"]},"offset":"18379973"},"_baseFlatten.js":{"size":1201,"integrity":{"algorithm":"SHA256","hash":"2410fc4a7f9e866d23e642ad2b93e599d792d89c95715b76993e3da98a86ac1f","blockSize":4194304,"blocks":["2410fc4a7f9e866d23e642ad2b93e599d792d89c95715b76993e3da98a86ac1f"]},"offset":"18380720"},"_baseFor.js":{"size":593,"integrity":{"algorithm":"SHA256","hash":"683469bfd62c7770343faf2426bc0d83fb4a2dd7808ebd17464c1abbe5d1ec28","blockSize":4194304,"blocks":["683469bfd62c7770343faf2426bc0d83fb4a2dd7808ebd17464c1abbe5d1ec28"]},"offset":"18381921"},"_baseForOwn.js":{"size":456,"integrity":{"algorithm":"SHA256","hash":"c2c0e68131f8bf3ddd3d9d2e72880b4652c0ed2553dc3e726714169210d355ee","blockSize":4194304,"blocks":["c2c0e68131f8bf3ddd3d9d2e72880b4652c0ed2553dc3e726714169210d355ee"]},"offset":"18382514"},"_baseForOwnRight.js":{"size":486,"integrity":{"algorithm":"SHA256","hash":"6962bd437841b3c730c4186743aa6ea10473099e8d4295ab3dd832b94427f78d","blockSize":4194304,"blocks":["6962bd437841b3c730c4186743aa6ea10473099e8d4295ab3dd832b94427f78d"]},"offset":"18382970"},"_baseForRight.js":{"size":477,"integrity":{"algorithm":"SHA256","hash":"91d763dd743e35f45ecfde013f18f66a037aca534dc51d3412fd34d276ae89dd","blockSize":4194304,"blocks":["91d763dd743e35f45ecfde013f18f66a037aca534dc51d3412fd34d276ae89dd"]},"offset":"18383456"},"_baseFunctions.js":{"size":552,"integrity":{"algorithm":"SHA256","hash":"98e1c1fb5206aa2d25292d33f375b6ab7979e1bb0b9b65728e2c130db00702da","blockSize":4194304,"blocks":["98e1c1fb5206aa2d25292d33f375b6ab7979e1bb0b9b65728e2c130db00702da"]},"offset":"18383933"},"_baseGet.js":{"size":616,"integrity":{"algorithm":"SHA256","hash":"11058a13c346613291e77147a6a5ba47e9fce3cd81c8acaf224eafc466bdc02d","blockSize":4194304,"blocks":["11058a13c346613291e77147a6a5ba47e9fce3cd81c8acaf224eafc466bdc02d"]},"offset":"18384485"},"_baseGetAllKeys.js":{"size":739,"integrity":{"algorithm":"SHA256","hash":"1bfc82f79df4fda867fdd82baec9530c59189994c17fc1011733aba2de51d0fe","blockSize":4194304,"blocks":["1bfc82f79df4fda867fdd82baec9530c59189994c17fc1011733aba2de51d0fe"]},"offset":"18385101"},"_baseGetTag.js":{"size":792,"integrity":{"algorithm":"SHA256","hash":"c9d3dbb76eeafd3007bceca376afc743370ab0c5487d78b5c6e097a4b0f6dd9b","blockSize":4194304,"blocks":["c9d3dbb76eeafd3007bceca376afc743370ab0c5487d78b5c6e097a4b0f6dd9b"]},"offset":"18385840"},"_baseGt.js":{"size":357,"integrity":{"algorithm":"SHA256","hash":"99beb83e23bf1aff5a1bbbf8fd03f5b3cb4a9be6c21b8b659d601c0af364ea5b","blockSize":4194304,"blocks":["99beb83e23bf1aff5a1bbbf8fd03f5b3cb4a9be6c21b8b659d601c0af364ea5b"]},"offset":"18386632"},"_baseHas.js":{"size":559,"integrity":{"algorithm":"SHA256","hash":"d17d0cb51e14b025dcad24b02da060f7f6cbf8c117220759b89d71f0ef0ad4e8","blockSize":4194304,"blocks":["d17d0cb51e14b025dcad24b02da060f7f6cbf8c117220759b89d71f0ef0ad4e8"]},"offset":"18386989"},"_baseHasIn.js":{"size":374,"integrity":{"algorithm":"SHA256","hash":"fbb01dee1a06fb79300c788cd2d367da659c0ed34a81dbc3195790cccc0c947c","blockSize":4194304,"blocks":["fbb01dee1a06fb79300c788cd2d367da659c0ed34a81dbc3195790cccc0c947c"]},"offset":"18387548"},"_baseInRange.js":{"size":612,"integrity":{"algorithm":"SHA256","hash":"b63df24ac4a8708b494862d0ba416dadf7383e81cf4e86e83b86cbb7f94bd259","blockSize":4194304,"blocks":["b63df24ac4a8708b494862d0ba416dadf7383e81cf4e86e83b86cbb7f94bd259"]},"offset":"18387922"},"_baseIndexOf.js":{"size":659,"integrity":{"algorithm":"SHA256","hash":"160cc40dde0bf0e97b14530df56bc46c7bcc6b9aaf63629647b21e480a795baa","blockSize":4194304,"blocks":["160cc40dde0bf0e97b14530df56bc46c7bcc6b9aaf63629647b21e480a795baa"]},"offset":"18388534"},"_baseIndexOfWith.js":{"size":660,"integrity":{"algorithm":"SHA256","hash":"01448f1f44e625d3b4876f6f07c432bab5a7c7eec5b89ebb3c643b700be25fab","blockSize":4194304,"blocks":["01448f1f44e625d3b4876f6f07c432bab5a7c7eec5b89ebb3c643b700be25fab"]},"offset":"18389193"},"_baseIntersection.js":{"size":2262,"integrity":{"algorithm":"SHA256","hash":"2af90dce65989b33fa203e3f859eb11ce9e8399ce163b248c1d60dcf1388a42d","blockSize":4194304,"blocks":["2af90dce65989b33fa203e3f859eb11ce9e8399ce163b248c1d60dcf1388a42d"]},"offset":"18389853"},"_baseInverter.js":{"size":736,"integrity":{"algorithm":"SHA256","hash":"fd69c5bba6a7b7f42427c4e148a283fb0a95ee2dbe224199aa944136eca23ede","blockSize":4194304,"blocks":["fd69c5bba6a7b7f42427c4e148a283fb0a95ee2dbe224199aa944136eca23ede"]},"offset":"18392115"},"_baseInvoke.js":{"size":789,"integrity":{"algorithm":"SHA256","hash":"c84423133be6432565b8a64496b372ffd237fe12cc9b6b82e311c9af8ebaf3cc","blockSize":4194304,"blocks":["c84423133be6432565b8a64496b372ffd237fe12cc9b6b82e311c9af8ebaf3cc"]},"offset":"18392851"},"_baseIsArguments.js":{"size":488,"integrity":{"algorithm":"SHA256","hash":"71a59dc09c35dedcbee7ed71f5eae03e8a9b0251516ed098f28cdb6e28d0b816","blockSize":4194304,"blocks":["71a59dc09c35dedcbee7ed71f5eae03e8a9b0251516ed098f28cdb6e28d0b816"]},"offset":"18393640"},"_baseIsArrayBuffer.js":{"size":504,"integrity":{"algorithm":"SHA256","hash":"c526bfb1ea2d63d05e03e8694789ca6855319f2ad19501cff235392f8b738311","blockSize":4194304,"blocks":["c526bfb1ea2d63d05e03e8694789ca6855319f2ad19501cff235392f8b738311"]},"offset":"18394128"},"_baseIsDate.js":{"size":504,"integrity":{"algorithm":"SHA256","hash":"1ce47b8310f9000ea4aa9fad1c847fb728b289e51a794de0d9a6ea0fac49eff6","blockSize":4194304,"blocks":["1ce47b8310f9000ea4aa9fad1c847fb728b289e51a794de0d9a6ea0fac49eff6"]},"offset":"18394632"},"_baseIsEqual.js":{"size":1019,"integrity":{"algorithm":"SHA256","hash":"21f0fd8de670d92e39facd016752f770a7c2760ce60a5a5d12e0a1a05e53ce19","blockSize":4194304,"blocks":["21f0fd8de670d92e39facd016752f770a7c2760ce60a5a5d12e0a1a05e53ce19"]},"offset":"18395136"},"_baseIsEqualDeep.js":{"size":3010,"integrity":{"algorithm":"SHA256","hash":"6b9423fb4d815a8e7df793686defafa04a722878d09b48dff6e5ce52402f3ddd","blockSize":4194304,"blocks":["6b9423fb4d815a8e7df793686defafa04a722878d09b48dff6e5ce52402f3ddd"]},"offset":"18396155"},"_baseIsMap.js":{"size":478,"integrity":{"algorithm":"SHA256","hash":"90ec23bcd6b80fbe357b5121648df3a40c67cd3ff8f9c6ee5731a3952a7491c5","blockSize":4194304,"blocks":["90ec23bcd6b80fbe357b5121648df3a40c67cd3ff8f9c6ee5731a3952a7491c5"]},"offset":"18399165"},"_baseIsMatch.js":{"size":1765,"integrity":{"algorithm":"SHA256","hash":"cab17bf58d85e518955c73d983384a130c48cd0e233f38e4498123239325ee4b","blockSize":4194304,"blocks":["cab17bf58d85e518955c73d983384a130c48cd0e233f38e4498123239325ee4b"]},"offset":"18399643"},"_baseIsNaN.js":{"size":296,"integrity":{"algorithm":"SHA256","hash":"9e61fb70f5bcdea9f5ce53949ea2c467f9bf11aceb85c3da8e9d21bd1f74786e","blockSize":4194304,"blocks":["9e61fb70f5bcdea9f5ce53949ea2c467f9bf11aceb85c3da8e9d21bd1f74786e"]},"offset":"18401408"},"_baseIsNative.js":{"size":1417,"integrity":{"algorithm":"SHA256","hash":"1e99406998d0b3d47f6cd1b65d5d1a46dc339adef0d58cd15d98a6e795fcc040","blockSize":4194304,"blocks":["1e99406998d0b3d47f6cd1b65d5d1a46dc339adef0d58cd15d98a6e795fcc040"]},"offset":"18401704"},"_baseIsRegExp.js":{"size":511,"integrity":{"algorithm":"SHA256","hash":"bb93beb83a70615199e0ddb41fb89e570e109e5b78d222e27f26c142b5c104e0","blockSize":4194304,"blocks":["bb93beb83a70615199e0ddb41fb89e570e109e5b78d222e27f26c142b5c104e0"]},"offset":"18403121"},"_baseIsSet.js":{"size":478,"integrity":{"algorithm":"SHA256","hash":"2f5f1df7f711b04baa32d874e11fd8a193d83e311f5c32d512142f6a4cb864be","blockSize":4194304,"blocks":["2f5f1df7f711b04baa32d874e11fd8a193d83e311f5c32d512142f6a4cb864be"]},"offset":"18403632"},"_baseIsTypedArray.js":{"size":2222,"integrity":{"algorithm":"SHA256","hash":"70f974187f6d9140a971e515ea00246ac3a36b647d5960e2b95510ae73d56de6","blockSize":4194304,"blocks":["70f974187f6d9140a971e515ea00246ac3a36b647d5960e2b95510ae73d56de6"]},"offset":"18404110"},"_baseIteratee.js":{"size":895,"integrity":{"algorithm":"SHA256","hash":"94575a6628739b81cd429d95e81a6fbb3509e324183ddedee614437ec27291a2","blockSize":4194304,"blocks":["94575a6628739b81cd429d95e81a6fbb3509e324183ddedee614437ec27291a2"]},"offset":"18406332"},"_baseKeys.js":{"size":776,"integrity":{"algorithm":"SHA256","hash":"92683af4e78a9e10b38d5d56306cee637556938a2bead6c214dac14f1d769d33","blockSize":4194304,"blocks":["92683af4e78a9e10b38d5d56306cee637556938a2bead6c214dac14f1d769d33"]},"offset":"18407227"},"_baseKeysIn.js":{"size":870,"integrity":{"algorithm":"SHA256","hash":"89ca96a614e59b757ac3aa72c0b9ca454c015ed8de2e38264a2b9daa49b55e09","blockSize":4194304,"blocks":["89ca96a614e59b757ac3aa72c0b9ca454c015ed8de2e38264a2b9daa49b55e09"]},"offset":"18408003"},"_baseLodash.js":{"size":178,"integrity":{"algorithm":"SHA256","hash":"a53c8b4383d2fc7564db703c83cce4a462da10eac356fdd5a77a0f82b4133e50","blockSize":4194304,"blocks":["a53c8b4383d2fc7564db703c83cce4a462da10eac356fdd5a77a0f82b4133e50"]},"offset":"18408873"},"_baseLt.js":{"size":354,"integrity":{"algorithm":"SHA256","hash":"66854d33e10ee86969f206173cb0d37f2c67f2f8566c7d48dce17f400c53ec90","blockSize":4194304,"blocks":["66854d33e10ee86969f206173cb0d37f2c67f2f8566c7d48dce17f400c53ec90"]},"offset":"18409051"},"_baseMap.js":{"size":668,"integrity":{"algorithm":"SHA256","hash":"7787722e7cd97155c5cf3e6d09ce7c2599fab924424d527b0b4705306ff04dae","blockSize":4194304,"blocks":["7787722e7cd97155c5cf3e6d09ce7c2599fab924424d527b0b4705306ff04dae"]},"offset":"18409405"},"_baseMatches.js":{"size":710,"integrity":{"algorithm":"SHA256","hash":"78ce86cd7f9815f492bd652eb75456d1b5bef696e70b845df5d2747b3b5bf1ea","blockSize":4194304,"blocks":["78ce86cd7f9815f492bd652eb75456d1b5bef696e70b845df5d2747b3b5bf1ea"]},"offset":"18410073"},"_baseMatchesProperty.js":{"size":1129,"integrity":{"algorithm":"SHA256","hash":"2544a0ffe23adc5be309104c5831bcdc7c29d3e4211b6990cfbef28cc9e7ad9c","blockSize":4194304,"blocks":["2544a0ffe23adc5be309104c5831bcdc7c29d3e4211b6990cfbef28cc9e7ad9c"]},"offset":"18410783"},"_baseMean.js":{"size":568,"integrity":{"algorithm":"SHA256","hash":"08de6692935e8ef6c3ac35f2231d0c19dbadecf92177e912096e65871c0ca512","blockSize":4194304,"blocks":["08de6692935e8ef6c3ac35f2231d0c19dbadecf92177e912096e65871c0ca512"]},"offset":"18411912"},"_baseMerge.js":{"size":1328,"integrity":{"algorithm":"SHA256","hash":"142a0add697e0ebc9698368d1bb28fba98b2e3188d36159a3bf16f9e2a33761d","blockSize":4194304,"blocks":["142a0add697e0ebc9698368d1bb28fba98b2e3188d36159a3bf16f9e2a33761d"]},"offset":"18412480"},"_baseMergeDeep.js":{"size":3069,"integrity":{"algorithm":"SHA256","hash":"5a3f178cccdab4ee9f3adb1ce1fef7794c60db8f7b2a0e221d38a15ee87aa7a9","blockSize":4194304,"blocks":["5a3f178cccdab4ee9f3adb1ce1fef7794c60db8f7b2a0e221d38a15ee87aa7a9"]},"offset":"18413808"},"_baseNth.js":{"size":483,"integrity":{"algorithm":"SHA256","hash":"f18816d81835e27b700c2a03814a7478d8e5d7e4169d87a666b2b7e9f350fbe0","blockSize":4194304,"blocks":["f18816d81835e27b700c2a03814a7478d8e5d7e4169d87a666b2b7e9f350fbe0"]},"offset":"18416877"},"_baseOrderBy.js":{"size":1558,"integrity":{"algorithm":"SHA256","hash":"36b05eeea5d10c43aa3c0c68ea2e18f0a38c643e7ff07c8464086e1d65ba3e32","blockSize":4194304,"blocks":["36b05eeea5d10c43aa3c0c68ea2e18f0a38c643e7ff07c8464086e1d65ba3e32"]},"offset":"18417360"},"_basePick.js":{"size":501,"integrity":{"algorithm":"SHA256","hash":"6ab2e82a534e80f3aef3bb6e83d1415e9c7529d0216a2c5734a42203520b737f","blockSize":4194304,"blocks":["6ab2e82a534e80f3aef3bb6e83d1415e9c7529d0216a2c5734a42203520b737f"]},"offset":"18418918"},"_basePickBy.js":{"size":791,"integrity":{"algorithm":"SHA256","hash":"83f341d6be6b36e1231682cdb914ba116beb9a60a0630895f56a95f5d563d2c2","blockSize":4194304,"blocks":["83f341d6be6b36e1231682cdb914ba116beb9a60a0630895f56a95f5d563d2c2"]},"offset":"18419419"},"_baseProperty.js":{"size":360,"integrity":{"algorithm":"SHA256","hash":"9168de234c552d79a2fd00fdb8c49a4050b47e28fe89886cbbb57d4753ee3b3f","blockSize":4194304,"blocks":["9168de234c552d79a2fd00fdb8c49a4050b47e28fe89886cbbb57d4753ee3b3f"]},"offset":"18420210"},"_basePropertyDeep.js":{"size":391,"integrity":{"algorithm":"SHA256","hash":"65fae1f40433d51cb6c8fbb6a41caf7febd1189ba2b1296af34bc7e4bafa22c2","blockSize":4194304,"blocks":["65fae1f40433d51cb6c8fbb6a41caf7febd1189ba2b1296af34bc7e4bafa22c2"]},"offset":"18420570"},"_basePropertyOf.js":{"size":358,"integrity":{"algorithm":"SHA256","hash":"c7eb2d3492b419cd85b585615e2b1618300891b13fb750e52ab473616e8e7efa","blockSize":4194304,"blocks":["c7eb2d3492b419cd85b585615e2b1618300891b13fb750e52ab473616e8e7efa"]},"offset":"18420961"},"_basePullAll.js":{"size":1459,"integrity":{"algorithm":"SHA256","hash":"bba30e5ff749bb138fb61863f96df81b4f086fa982e49ff30d395568d7a0c409","blockSize":4194304,"blocks":["bba30e5ff749bb138fb61863f96df81b4f086fa982e49ff30d395568d7a0c409"]},"offset":"18421319"},"_basePullAt.js":{"size":939,"integrity":{"algorithm":"SHA256","hash":"4edd40dac0897bc73302f2104663d475b186f26ca6443997a34c80a19fb14a0c","blockSize":4194304,"blocks":["4edd40dac0897bc73302f2104663d475b186f26ca6443997a34c80a19fb14a0c"]},"offset":"18422778"},"_baseRandom.js":{"size":541,"integrity":{"algorithm":"SHA256","hash":"39bece02108b5787e902970ea62319b179a8982c3b41176a78b961201756713d","blockSize":4194304,"blocks":["39bece02108b5787e902970ea62319b179a8982c3b41176a78b961201756713d"]},"offset":"18423717"},"_baseRange.js":{"size":850,"integrity":{"algorithm":"SHA256","hash":"134600a369e098c5f6a5892d2020ce6ad7c51da158b4fec85b80926edee48372","blockSize":4194304,"blocks":["134600a369e098c5f6a5892d2020ce6ad7c51da158b4fec85b80926edee48372"]},"offset":"18424258"},"_baseReduce.js":{"size":909,"integrity":{"algorithm":"SHA256","hash":"8df7676809cbc9424be921801554cb99a5cc31cbb7513d1e891ec986fe07106f","blockSize":4194304,"blocks":["8df7676809cbc9424be921801554cb99a5cc31cbb7513d1e891ec986fe07106f"]},"offset":"18425108"},"_baseRepeat.js":{"size":952,"integrity":{"algorithm":"SHA256","hash":"81f68d89a4e906997ed62b210341999c6e2f61c4aaf6e1404e661a87ba79d61a","blockSize":4194304,"blocks":["81f68d89a4e906997ed62b210341999c6e2f61c4aaf6e1404e661a87ba79d61a"]},"offset":"18426017"},"_baseRest.js":{"size":559,"integrity":{"algorithm":"SHA256","hash":"4945f6523dc4a6b9af9a470772863f5b0ab917c28d33b99530c736e0cf6e09ef","blockSize":4194304,"blocks":["4945f6523dc4a6b9af9a470772863f5b0ab917c28d33b99530c736e0cf6e09ef"]},"offset":"18426969"},"_baseSample.js":{"size":359,"integrity":{"algorithm":"SHA256","hash":"c34db7ce1be5d26a2d06eb8fcf4983e01187d71601030d4f142db9dc5e1b35da","blockSize":4194304,"blocks":["c34db7ce1be5d26a2d06eb8fcf4983e01187d71601030d4f142db9dc5e1b35da"]},"offset":"18427528"},"_baseSampleSize.js":{"size":548,"integrity":{"algorithm":"SHA256","hash":"fddbed1714457a56bf4da3fddfeccbde039cae8cc06621b82ce2518b38625cee","blockSize":4194304,"blocks":["fddbed1714457a56bf4da3fddfeccbde039cae8cc06621b82ce2518b38625cee"]},"offset":"18427887"},"_baseSet.js":{"size":1385,"integrity":{"algorithm":"SHA256","hash":"a07beb6817764c5f7e3e7a345c8218238e93c895ce80f2b822663441d832e4ef","blockSize":4194304,"blocks":["a07beb6817764c5f7e3e7a345c8218238e93c895ce80f2b822663441d832e4ef"]},"offset":"18428435"},"_baseSetData.js":{"size":456,"integrity":{"algorithm":"SHA256","hash":"b2a2251c265920e355cf5542ac81d3535947c87db99fb329eb9addfee85515b4","blockSize":4194304,"blocks":["b2a2251c265920e355cf5542ac81d3535947c87db99fb329eb9addfee85515b4"]},"offset":"18429820"},"_baseSetToString.js":{"size":641,"integrity":{"algorithm":"SHA256","hash":"88bc4bdb5f6ccfd8823ab3c9cfcd9ae4c52ac62c9e9c3c8d8d34323f838b42ea","blockSize":4194304,"blocks":["88bc4bdb5f6ccfd8823ab3c9cfcd9ae4c52ac62c9e9c3c8d8d34323f838b42ea"]},"offset":"18430276"},"_baseShuffle.js":{"size":371,"integrity":{"algorithm":"SHA256","hash":"47152f92f55df85e1723b4748cc995a727450efa4e13d773573b711ad3677bf9","blockSize":4194304,"blocks":["47152f92f55df85e1723b4748cc995a727450efa4e13d773573b711ad3677bf9"]},"offset":"18430917"},"_baseSlice.js":{"size":756,"integrity":{"algorithm":"SHA256","hash":"5df69d6963ecb7c6319a26005341dcae0d94daf86b822be3cfb4cc29cd3f029d","blockSize":4194304,"blocks":["5df69d6963ecb7c6319a26005341dcae0d94daf86b822be3cfb4cc29cd3f029d"]},"offset":"18431288"},"_baseSome.js":{"size":619,"integrity":{"algorithm":"SHA256","hash":"fdfc7ec17738f062aef67828fc6ed1ac933c194471214924eb4fa7df2657b5d3","blockSize":4194304,"blocks":["fdfc7ec17738f062aef67828fc6ed1ac933c194471214924eb4fa7df2657b5d3"]},"offset":"18432044"},"_baseSortBy.js":{"size":543,"integrity":{"algorithm":"SHA256","hash":"5cb138975dd23c1edee76417b442a011776310ba98e7bfc0192dafa18c4687ce","blockSize":4194304,"blocks":["5cb138975dd23c1edee76417b442a011776310ba98e7bfc0192dafa18c4687ce"]},"offset":"18432663"},"_baseSortedIndex.js":{"size":1429,"integrity":{"algorithm":"SHA256","hash":"ae9ad3a007da156f796188f9745c226fe98006204ae29a797ba7c3ccff35cb08","blockSize":4194304,"blocks":["ae9ad3a007da156f796188f9745c226fe98006204ae29a797ba7c3ccff35cb08"]},"offset":"18433206"},"_baseSortedIndexBy.js":{"size":2259,"integrity":{"algorithm":"SHA256","hash":"6eb38e6a9462189bbe19f507f67d0035d55e3f0fd034e8aa3ddafb7119ec0333","blockSize":4194304,"blocks":["6eb38e6a9462189bbe19f507f67d0035d55e3f0fd034e8aa3ddafb7119ec0333"]},"offset":"18434635"},"_baseSortedUniq.js":{"size":758,"integrity":{"algorithm":"SHA256","hash":"5009c2932320106ac433b7567e2e35e6b502f973dafa4d7ed93b457fb0f63edb","blockSize":4194304,"blocks":["5009c2932320106ac433b7567e2e35e6b502f973dafa4d7ed93b457fb0f63edb"]},"offset":"18436894"},"_baseSum.js":{"size":600,"integrity":{"algorithm":"SHA256","hash":"7f39b622a6b544cc9619752799b2db854d67c0b77a3f34a9162fa69ffc9228b8","blockSize":4194304,"blocks":["7f39b622a6b544cc9619752799b2db854d67c0b77a3f34a9162fa69ffc9228b8"]},"offset":"18437652"},"_baseTimes.js":{"size":504,"integrity":{"algorithm":"SHA256","hash":"bd054701039e1090817e5d8f6fb4871966cd3abdc2c283efd98a0c1683707886","blockSize":4194304,"blocks":["bd054701039e1090817e5d8f6fb4871966cd3abdc2c283efd98a0c1683707886"]},"offset":"18438252"},"_baseToNumber.js":{"size":539,"integrity":{"algorithm":"SHA256","hash":"48470af278354e767e87281c02e5f7792a99281d1345885d3e282dae0322c5c6","blockSize":4194304,"blocks":["48470af278354e767e87281c02e5f7792a99281d1345885d3e282dae0322c5c6"]},"offset":"18438756"},"_baseToPairs.js":{"size":537,"integrity":{"algorithm":"SHA256","hash":"78bc3c33291a79f9a06be05c51b8cadbcb4d843d390a0e56dac402f9212c9a22","blockSize":4194304,"blocks":["78bc3c33291a79f9a06be05c51b8cadbcb4d843d390a0e56dac402f9212c9a22"]},"offset":"18439295"},"_baseToString.js":{"size":1154,"integrity":{"algorithm":"SHA256","hash":"02703516b1d594c96987c84f7d016411d0ed7825bec23280fb974e86db178fc8","blockSize":4194304,"blocks":["02703516b1d594c96987c84f7d016411d0ed7825bec23280fb974e86db178fc8"]},"offset":"18439832"},"_baseTrim.js":{"size":444,"integrity":{"algorithm":"SHA256","hash":"8aa33808ed188e825125d8fb0abaf638b5eacc4e312ea068e2d05cc37321b52b","blockSize":4194304,"blocks":["8aa33808ed188e825125d8fb0abaf638b5eacc4e312ea068e2d05cc37321b52b"]},"offset":"18440986"},"_baseUnary.js":{"size":332,"integrity":{"algorithm":"SHA256","hash":"70c60c7f965c08178b59b2bd4d0988ea73a9c52522f53390d108b3c5f7ffa188","blockSize":4194304,"blocks":["70c60c7f965c08178b59b2bd4d0988ea73a9c52522f53390d108b3c5f7ffa188"]},"offset":"18441430"},"_baseUniq.js":{"size":1909,"integrity":{"algorithm":"SHA256","hash":"0441219faeeb60c196f99f8258a92b48bf87189d4cb04379d51dcecb003ffa18","blockSize":4194304,"blocks":["0441219faeeb60c196f99f8258a92b48bf87189d4cb04379d51dcecb003ffa18"]},"offset":"18441762"},"_baseUnset.js":{"size":580,"integrity":{"algorithm":"SHA256","hash":"b246cdf2a6d701349ee331fcaf6db235def81702abaccb3193da2d91e560eccc","blockSize":4194304,"blocks":["b246cdf2a6d701349ee331fcaf6db235def81702abaccb3193da2d91e560eccc"]},"offset":"18443671"},"_baseUpdate.js":{"size":605,"integrity":{"algorithm":"SHA256","hash":"66de044bd9356189a3d9e438748585dd0b4a7e4120448ac6f6cd898a21b068f5","blockSize":4194304,"blocks":["66de044bd9356189a3d9e438748585dd0b4a7e4120448ac6f6cd898a21b068f5"]},"offset":"18444251"},"_baseValues.js":{"size":534,"integrity":{"algorithm":"SHA256","hash":"979a132abe06044e924d9d857f974bdd1be4107d390ef8ba31640e0917b7f9ce","blockSize":4194304,"blocks":["979a132abe06044e924d9d857f974bdd1be4107d390ef8ba31640e0917b7f9ce"]},"offset":"18444856"},"_baseWhile.js":{"size":933,"integrity":{"algorithm":"SHA256","hash":"8d25d09663040086d16864b180ed9b04fa02c0d19b6a0d9ff97cd49a8d8be818","blockSize":4194304,"blocks":["8d25d09663040086d16864b180ed9b04fa02c0d19b6a0d9ff97cd49a8d8be818"]},"offset":"18445390"},"_baseWrapperValue.js":{"size":857,"integrity":{"algorithm":"SHA256","hash":"bf1e26e0b6474f3ad67e1145fea232b3e5436a069947bc46a199222ad56b3a61","blockSize":4194304,"blocks":["bf1e26e0b6474f3ad67e1145fea232b3e5436a069947bc46a199222ad56b3a61"]},"offset":"18446323"},"_baseXor.js":{"size":1099,"integrity":{"algorithm":"SHA256","hash":"671b23dd36dbd57a7c18d9efef2627def32173a0446cc689bc8726115a65bfbf","blockSize":4194304,"blocks":["671b23dd36dbd57a7c18d9efef2627def32173a0446cc689bc8726115a65bfbf"]},"offset":"18447180"},"_baseZipObject.js":{"size":660,"integrity":{"algorithm":"SHA256","hash":"61731c67cde5f3cc5998335e8436968e3e09ec196e9d9ab4f1aa083d9a8ca947","blockSize":4194304,"blocks":["61731c67cde5f3cc5998335e8436968e3e09ec196e9d9ab4f1aa083d9a8ca947"]},"offset":"18448279"},"_cacheHas.js":{"size":337,"integrity":{"algorithm":"SHA256","hash":"cf025a5fb7e480701d61e4ed60ed869fa835e0d0aed126daf0c62ba9b4d348ae","blockSize":4194304,"blocks":["cf025a5fb7e480701d61e4ed60ed869fa835e0d0aed126daf0c62ba9b4d348ae"]},"offset":"18448939"},"_castArrayLikeObject.js":{"size":381,"integrity":{"algorithm":"SHA256","hash":"3a6f533812e836bb88bf2a656ca51860fa0af543461d97c135814c01652f7bb6","blockSize":4194304,"blocks":["3a6f533812e836bb88bf2a656ca51860fa0af543461d97c135814c01652f7bb6"]},"offset":"18449276"},"_castFunction.js":{"size":326,"integrity":{"algorithm":"SHA256","hash":"d7b164a9bfc94ce4df4c26d318fbec98320fc8c26a0d9dabd011efde368048f1","blockSize":4194304,"blocks":["d7b164a9bfc94ce4df4c26d318fbec98320fc8c26a0d9dabd011efde368048f1"]},"offset":"18449657"},"_castPath.js":{"size":569,"integrity":{"algorithm":"SHA256","hash":"1a0281926af5b014526f5c9def6a891e090adba86afff99fcc3a08184b90f023","blockSize":4194304,"blocks":["1a0281926af5b014526f5c9def6a891e090adba86afff99fcc3a08184b90f023"]},"offset":"18449983"},"_castRest.js":{"size":348,"integrity":{"algorithm":"SHA256","hash":"7d5dab849a479da5624b1b3fe9cd372f2bcf8c6cb17e5b8ec8c71bf0c50f4d02","blockSize":4194304,"blocks":["7d5dab849a479da5624b1b3fe9cd372f2bcf8c6cb17e5b8ec8c71bf0c50f4d02"]},"offset":"18450552"},"_castSlice.js":{"size":517,"integrity":{"algorithm":"SHA256","hash":"b5397cf5ac2791636e00a380ce3d3c591b0de0aa45bc4cd0942a378c92218e71","blockSize":4194304,"blocks":["b5397cf5ac2791636e00a380ce3d3c591b0de0aa45bc4cd0942a378c92218e71"]},"offset":"18450900"},"_charsEndIndex.js":{"size":600,"integrity":{"algorithm":"SHA256","hash":"f5600b654adf18830a72edc7795cfd90e44a63cc30a5ee99b3d38b6824f44717","blockSize":4194304,"blocks":["f5600b654adf18830a72edc7795cfd90e44a63cc30a5ee99b3d38b6824f44717"]},"offset":"18451417"},"_charsStartIndex.js":{"size":636,"integrity":{"algorithm":"SHA256","hash":"33ee500387c9d29e2ec9ab5f7c7e1d66891b7f531b403afff0e282c123a25acb","blockSize":4194304,"blocks":["33ee500387c9d29e2ec9ab5f7c7e1d66891b7f531b403afff0e282c123a25acb"]},"offset":"18452017"},"_cloneArrayBuffer.js":{"size":449,"integrity":{"algorithm":"SHA256","hash":"04d0e9fb36e4c8612a9ae693a2b10f74a3687a9fdc9dcb22f00855eeca57a37b","blockSize":4194304,"blocks":["04d0e9fb36e4c8612a9ae693a2b10f74a3687a9fdc9dcb22f00855eeca57a37b"]},"offset":"18452653"},"_cloneBuffer.js":{"size":1056,"integrity":{"algorithm":"SHA256","hash":"550ed5b37392bd96493b0c38212a5bf8779890b7ba964d2ac4049c41e80f774a","blockSize":4194304,"blocks":["550ed5b37392bd96493b0c38212a5bf8779890b7ba964d2ac4049c41e80f774a"]},"offset":"18453102"},"_cloneDataView.js":{"size":507,"integrity":{"algorithm":"SHA256","hash":"135cb42922b80e96fbf921cc4e6262bcf9f35e23cb5b592f3c91ae11d2c4ee94","blockSize":4194304,"blocks":["135cb42922b80e96fbf921cc4e6262bcf9f35e23cb5b592f3c91ae11d2c4ee94"]},"offset":"18454158"},"_cloneRegExp.js":{"size":439,"integrity":{"algorithm":"SHA256","hash":"eea40d65b8981196ddfd6bb07b259ed35bc1387cf827b922ecf344a88693c6c6","blockSize":4194304,"blocks":["eea40d65b8981196ddfd6bb07b259ed35bc1387cf827b922ecf344a88693c6c6"]},"offset":"18454665"},"_cloneSymbol.js":{"size":524,"integrity":{"algorithm":"SHA256","hash":"ae5f8ddeecd67e4ab2f539ca4cbdbac72d73bd86ea84956535316dc14a8d62d4","blockSize":4194304,"blocks":["ae5f8ddeecd67e4ab2f539ca4cbdbac72d73bd86ea84956535316dc14a8d62d4"]},"offset":"18455104"},"_cloneTypedArray.js":{"size":527,"integrity":{"algorithm":"SHA256","hash":"e4a07e9bc192acec93c967f52426333e3209e861b6591d7f122256db573d9288","blockSize":4194304,"blocks":["e4a07e9bc192acec93c967f52426333e3209e861b6591d7f122256db573d9288"]},"offset":"18455628"},"_compareAscending.js":{"size":1343,"integrity":{"algorithm":"SHA256","hash":"437f05eed3eea4f1617208098dd090e28238a18fc1dfe6e29bbcf21d30917ebf","blockSize":4194304,"blocks":["437f05eed3eea4f1617208098dd090e28238a18fc1dfe6e29bbcf21d30917ebf"]},"offset":"18456155"},"_compareMultiple.js":{"size":1599,"integrity":{"algorithm":"SHA256","hash":"b04aff9f4e4b74672a0031202b66dc9b1116c7817e103bcb56954e284ab00765","blockSize":4194304,"blocks":["b04aff9f4e4b74672a0031202b66dc9b1116c7817e103bcb56954e284ab00765"]},"offset":"18457498"},"_composeArgs.js":{"size":1323,"integrity":{"algorithm":"SHA256","hash":"28808649a653c40a4983ea61110e3e1ba70d638bba05c92d4b2513544402f9eb","blockSize":4194304,"blocks":["28808649a653c40a4983ea61110e3e1ba70d638bba05c92d4b2513544402f9eb"]},"offset":"18459097"},"_composeArgsRight.js":{"size":1388,"integrity":{"algorithm":"SHA256","hash":"ace319b9262515267ee22b7274549a3bfa37979644ca8206e64e368d9c928d26","blockSize":4194304,"blocks":["ace319b9262515267ee22b7274549a3bfa37979644ca8206e64e368d9c928d26"]},"offset":"18460420"},"_copyArray.js":{"size":454,"integrity":{"algorithm":"SHA256","hash":"4a828cecfb989f5ec5dfb5627c98a49e90ff7d1249c4910ef2de74cd8c677a85","blockSize":4194304,"blocks":["4a828cecfb989f5ec5dfb5627c98a49e90ff7d1249c4910ef2de74cd8c677a85"]},"offset":"18461808"},"_copyObject.js":{"size":1044,"integrity":{"algorithm":"SHA256","hash":"540cc88da53fd6db2c8faeeb5a37ffd5ee3dbd291a4d9a6233d779ff03f162dc","blockSize":4194304,"blocks":["540cc88da53fd6db2c8faeeb5a37ffd5ee3dbd291a4d9a6233d779ff03f162dc"]},"offset":"18462262"},"_copySymbols.js":{"size":446,"integrity":{"algorithm":"SHA256","hash":"cd82623cd5c4454026e3afe1b1a11054b7ab4d8115436394f23209183b6df00d","blockSize":4194304,"blocks":["cd82623cd5c4454026e3afe1b1a11054b7ab4d8115436394f23209183b6df00d"]},"offset":"18463306"},"_copySymbolsIn.js":{"size":470,"integrity":{"algorithm":"SHA256","hash":"bc2c0518d3708d754814b5657c90bbaa0d1494d06f32d21af0af01853f06a045","blockSize":4194304,"blocks":["bc2c0518d3708d754814b5657c90bbaa0d1494d06f32d21af0af01853f06a045"]},"offset":"18463752"},"_coreJsData.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"9960c73f0dced1bc32511551e31cfece7fc2c3373b62f5e934eab7291796a8e0","blockSize":4194304,"blocks":["9960c73f0dced1bc32511551e31cfece7fc2c3373b62f5e934eab7291796a8e0"]},"offset":"18464222"},"_countHolders.js":{"size":469,"integrity":{"algorithm":"SHA256","hash":"dca76f5213ffeddd57a87db1babf85b64e4295710d2c64b9a15830f07ae846b8","blockSize":4194304,"blocks":["dca76f5213ffeddd57a87db1babf85b64e4295710d2c64b9a15830f07ae846b8"]},"offset":"18464379"},"_createAggregator.js":{"size":789,"integrity":{"algorithm":"SHA256","hash":"23d62e008e8c578443e4a55f56e6582a8b04e68650b18e78931bb423935d525d","blockSize":4194304,"blocks":["23d62e008e8c578443e4a55f56e6582a8b04e68650b18e78931bb423935d525d"]},"offset":"18464848"},"_createAssigner.js":{"size":1042,"integrity":{"algorithm":"SHA256","hash":"244a92bbbc71a52c87e34638189f95fd69f671fb39a1a32729511f054548ffa4","blockSize":4194304,"blocks":["244a92bbbc71a52c87e34638189f95fd69f671fb39a1a32729511f054548ffa4"]},"offset":"18465637"},"_createBaseEach.js":{"size":886,"integrity":{"algorithm":"SHA256","hash":"8fde6568230f3a01ec34320a3ddb29ba4e9608725bf27c634bdc363ddde2ff08","blockSize":4194304,"blocks":["8fde6568230f3a01ec34320a3ddb29ba4e9608725bf27c634bdc363ddde2ff08"]},"offset":"18466679"},"_createBaseFor.js":{"size":648,"integrity":{"algorithm":"SHA256","hash":"39e0842e9dfb572b59b8237a5edafece23ca372cc20e768ce8e5e27fc9b52996","blockSize":4194304,"blocks":["39e0842e9dfb572b59b8237a5edafece23ca372cc20e768ce8e5e27fc9b52996"]},"offset":"18467565"},"_createBind.js":{"size":853,"integrity":{"algorithm":"SHA256","hash":"5fbbec0d516e93505ae43dd9277e0980aed3d98c27d741321b7a3f8373fefa6e","blockSize":4194304,"blocks":["5fbbec0d516e93505ae43dd9277e0980aed3d98c27d741321b7a3f8373fefa6e"]},"offset":"18468213"},"_createCaseFirst.js":{"size":811,"integrity":{"algorithm":"SHA256","hash":"c7e18c887a1871cd4fbc21cc79ce0976e180cd2c3b96dd8832aff658c07bb210","blockSize":4194304,"blocks":["c7e18c887a1871cd4fbc21cc79ce0976e180cd2c3b96dd8832aff658c07bb210"]},"offset":"18469066"},"_createCompounder.js":{"size":635,"integrity":{"algorithm":"SHA256","hash":"43758b67806c676c6d9a38ebbb4263147cfeaa036cb8dc56d136b36fad262a51","blockSize":4194304,"blocks":["43758b67806c676c6d9a38ebbb4263147cfeaa036cb8dc56d136b36fad262a51"]},"offset":"18469877"},"_createCtor.js":{"size":1482,"integrity":{"algorithm":"SHA256","hash":"40ffde082a93d3733672aa387ddb4a02b20501705cd93143f998cb01f583f8b7","blockSize":4194304,"blocks":["40ffde082a93d3733672aa387ddb4a02b20501705cd93143f998cb01f583f8b7"]},"offset":"18470512"},"_createCurry.js":{"size":1447,"integrity":{"algorithm":"SHA256","hash":"e4f4ea0b7c6c2e23d679d8b1f05d8c9cef3236c44746cf5f2d59bf86fe45a3b8","blockSize":4194304,"blocks":["e4f4ea0b7c6c2e23d679d8b1f05d8c9cef3236c44746cf5f2d59bf86fe45a3b8"]},"offset":"18471994"},"_createFind.js":{"size":853,"integrity":{"algorithm":"SHA256","hash":"6a15236257a0c09dbb7084c5ae795721a24df5bd5ad9c5ac5fe54c0b6f4c6e32","blockSize":4194304,"blocks":["6a15236257a0c09dbb7084c5ae795721a24df5bd5ad9c5ac5fe54c0b6f4c6e32"]},"offset":"18473441"},"_createFlow.js":{"size":2249,"integrity":{"algorithm":"SHA256","hash":"a65305d3ff738e6c9692a0396a16c226a92b88f9caa6be9a76ca520036190ddb","blockSize":4194304,"blocks":["a65305d3ff738e6c9692a0396a16c226a92b88f9caa6be9a76ca520036190ddb"]},"offset":"18474294"},"_createHybrid.js":{"size":3252,"integrity":{"algorithm":"SHA256","hash":"d6773f5ea7f7a580879a32300583de93c886f1f98343ca181f63096cfd3eb345","blockSize":4194304,"blocks":["d6773f5ea7f7a580879a32300583de93c886f1f98343ca181f63096cfd3eb345"]},"offset":"18476543"},"_createInverter.js":{"size":497,"integrity":{"algorithm":"SHA256","hash":"b9618d906573bc74fe3b34c5cfd6b86f30ff72e1292d4fcc26025d71b8e130cb","blockSize":4194304,"blocks":["b9618d906573bc74fe3b34c5cfd6b86f30ff72e1292d4fcc26025d71b8e130cb"]},"offset":"18479795"},"_createMathOperation.js":{"size":1104,"integrity":{"algorithm":"SHA256","hash":"335738807b39951fd64cb6469bba3a94764786fe3d926938f2275420df34f86c","blockSize":4194304,"blocks":["335738807b39951fd64cb6469bba3a94764786fe3d926938f2275420df34f86c"]},"offset":"18480292"},"_createOver.js":{"size":780,"integrity":{"algorithm":"SHA256","hash":"ee23c96ff637259512dfcd11eca50f081abf43d505aa7c18f4b933074da048a7","blockSize":4194304,"blocks":["ee23c96ff637259512dfcd11eca50f081abf43d505aa7c18f4b933074da048a7"]},"offset":"18481396"},"_createPadding.js":{"size":1153,"integrity":{"algorithm":"SHA256","hash":"242d9d729f1044522cb20637602f0ed56f3e1ac26eb58f4d17751ef04caa4d31","blockSize":4194304,"blocks":["242d9d729f1044522cb20637602f0ed56f3e1ac26eb58f4d17751ef04caa4d31"]},"offset":"18482176"},"_createPartial.js":{"size":1382,"integrity":{"algorithm":"SHA256","hash":"229faccb2beb1c287454a5c6f825c63393840d72bba5f7d80c29aa2f604abfb6","blockSize":4194304,"blocks":["229faccb2beb1c287454a5c6f825c63393840d72bba5f7d80c29aa2f604abfb6"]},"offset":"18483329"},"_createRange.js":{"size":864,"integrity":{"algorithm":"SHA256","hash":"d93dabb51867e8eaea8e01be8cf115e4714a462da42a0745aefeb66ec8607983","blockSize":4194304,"blocks":["d93dabb51867e8eaea8e01be8cf115e4714a462da42a0745aefeb66ec8607983"]},"offset":"18484711"},"_createRecurry.js":{"size":2117,"integrity":{"algorithm":"SHA256","hash":"2c7f5b97c8dcd065f333fa98dfc629698eec88a4fb1f15b56eb95e47effbedaa","blockSize":4194304,"blocks":["2c7f5b97c8dcd065f333fa98dfc629698eec88a4fb1f15b56eb95e47effbedaa"]},"offset":"18485575"},"_createRelationalOperation.js":{"size":578,"integrity":{"algorithm":"SHA256","hash":"c178b152e9291dff5e8a67df8a1d28013fcfbe576ab1b0af3a85651b8d6f9c0a","blockSize":4194304,"blocks":["c178b152e9291dff5e8a67df8a1d28013fcfbe576ab1b0af3a85651b8d6f9c0a"]},"offset":"18487692"},"_createRound.js":{"size":1193,"integrity":{"algorithm":"SHA256","hash":"09b84d1712b210ec6408eebb5d2f3a72f728c5e9ce7c9f86f621ad81a5d02bd1","blockSize":4194304,"blocks":["09b84d1712b210ec6408eebb5d2f3a72f728c5e9ce7c9f86f621ad81a5d02bd1"]},"offset":"18488270"},"_createSet.js":{"size":501,"integrity":{"algorithm":"SHA256","hash":"1c0337ba289802bd751f6584bacf1f4e71c13124d219927a6fbed13fee06a68e","blockSize":4194304,"blocks":["1c0337ba289802bd751f6584bacf1f4e71c13124d219927a6fbed13fee06a68e"]},"offset":"18489463"},"_createToPairs.js":{"size":789,"integrity":{"algorithm":"SHA256","hash":"0e91375d171c8075f70d5daaaf604f03a5210c6a2a3a4f7777330b384c45664d","blockSize":4194304,"blocks":["0e91375d171c8075f70d5daaaf604f03a5210c6a2a3a4f7777330b384c45664d"]},"offset":"18489964"},"_createWrap.js":{"size":3714,"integrity":{"algorithm":"SHA256","hash":"256b82e8c7e06f8c8d96448629113046232ef4904717d93f8543b29c5b6f96e5","blockSize":4194304,"blocks":["256b82e8c7e06f8c8d96448629113046232ef4904717d93f8543b29c5b6f96e5"]},"offset":"18490753"},"_customDefaultsAssignIn.js":{"size":934,"integrity":{"algorithm":"SHA256","hash":"ab79963aa13e9c8ec3621998637839d6376d14a9b4f64646b2bcd3349b4cdc80","blockSize":4194304,"blocks":["ab79963aa13e9c8ec3621998637839d6376d14a9b4f64646b2bcd3349b4cdc80"]},"offset":"18494467"},"_customDefaultsMerge.js":{"size":1049,"integrity":{"algorithm":"SHA256","hash":"28533a8709810d366c1792ae88799e8ef77165daf2c730d8e354c4905b4b1976","blockSize":4194304,"blocks":["28533a8709810d366c1792ae88799e8ef77165daf2c730d8e354c4905b4b1976"]},"offset":"18495401"},"_customOmitClone.js":{"size":475,"integrity":{"algorithm":"SHA256","hash":"c3635eb6c74a9b523cebd93c46f3e8c816ffafb613aa9774cce2714b60aca630","blockSize":4194304,"blocks":["c3635eb6c74a9b523cebd93c46f3e8c816ffafb613aa9774cce2714b60aca630"]},"offset":"18496450"},"_deburrLetter.js":{"size":3411,"integrity":{"algorithm":"SHA256","hash":"e06612542bac3757e781d4afa5f03ce59be787cc15b518c8f462c39b0c8a4c59","blockSize":4194304,"blocks":["e06612542bac3757e781d4afa5f03ce59be787cc15b518c8f462c39b0c8a4c59"]},"offset":"18496925"},"_defineProperty.js":{"size":233,"integrity":{"algorithm":"SHA256","hash":"d026cc53aafed14ab5822904f68340e19fa7009f48f055dc4ebb092d6b89921d","blockSize":4194304,"blocks":["d026cc53aafed14ab5822904f68340e19fa7009f48f055dc4ebb092d6b89921d"]},"offset":"18500336"},"_equalArrays.js":{"size":2662,"integrity":{"algorithm":"SHA256","hash":"a576f374229485f9235ad45f9d731166aa5f909481267d6c127f529d6e572c82","blockSize":4194304,"blocks":["a576f374229485f9235ad45f9d731166aa5f909481267d6c127f529d6e572c82"]},"offset":"18500569"},"_equalByTag.js":{"size":3746,"integrity":{"algorithm":"SHA256","hash":"e6c76c206c821ac85bb92a08c685dad03d3edf097c122ed8a22aa0449170c672","blockSize":4194304,"blocks":["e6c76c206c821ac85bb92a08c685dad03d3edf097c122ed8a22aa0449170c672"]},"offset":"18503231"},"_equalObjects.js":{"size":2971,"integrity":{"algorithm":"SHA256","hash":"ba4f279d6263aa41101bda461def6c10bf188feead52461af199011d48294343","blockSize":4194304,"blocks":["ba4f279d6263aa41101bda461def6c10bf188feead52461af199011d48294343"]},"offset":"18506977"},"_escapeHtmlChar.js":{"size":479,"integrity":{"algorithm":"SHA256","hash":"8794b39eb350adb7277e1ee6403673ee5e85363405d3611d239c3cf670d7ad84","blockSize":4194304,"blocks":["8794b39eb350adb7277e1ee6403673ee5e85363405d3611d239c3cf670d7ad84"]},"offset":"18509948"},"_escapeStringChar.js":{"size":521,"integrity":{"algorithm":"SHA256","hash":"21b46fca2d2fbda7b708949587456fc5d2a833819a486628ab9fd39104894022","blockSize":4194304,"blocks":["21b46fca2d2fbda7b708949587456fc5d2a833819a486628ab9fd39104894022"]},"offset":"18510427"},"_flatRest.js":{"size":457,"integrity":{"algorithm":"SHA256","hash":"e3a9f736f99fb31cf6f30b601aa833cf8773503ff2444f3c09d09df16bb07b6e","blockSize":4194304,"blocks":["e3a9f736f99fb31cf6f30b601aa833cf8773503ff2444f3c09d09df16bb07b6e"]},"offset":"18510948"},"_freeGlobal.js":{"size":173,"integrity":{"algorithm":"SHA256","hash":"7931bf414180bc20cf56337b5a33e6767501b6c7f537e9bb9e79f0f6e24ca515","blockSize":4194304,"blocks":["7931bf414180bc20cf56337b5a33e6767501b6c7f537e9bb9e79f0f6e24ca515"]},"offset":"18511405"},"_getAllKeys.js":{"size":455,"integrity":{"algorithm":"SHA256","hash":"dc961385c7416bac45b8c2c424071f22aeb196906c37e455eefa618b12313453","blockSize":4194304,"blocks":["dc961385c7416bac45b8c2c424071f22aeb196906c37e455eefa618b12313453"]},"offset":"18511578"},"_getAllKeysIn.js":{"size":488,"integrity":{"algorithm":"SHA256","hash":"70d86c863fd3916c6a9ad06fd2e79d223ffdc14a9774b45a9a53fbf91bd2a2f2","blockSize":4194304,"blocks":["70d86c863fd3916c6a9ad06fd2e79d223ffdc14a9774b45a9a53fbf91bd2a2f2"]},"offset":"18512033"},"_getData.js":{"size":325,"integrity":{"algorithm":"SHA256","hash":"2e22b4a76a67c842b440b11b16c660d44072f04a60aff321bb13137099d73027","blockSize":4194304,"blocks":["2e22b4a76a67c842b440b11b16c660d44072f04a60aff321bb13137099d73027"]},"offset":"18512521"},"_getFuncName.js":{"size":756,"integrity":{"algorithm":"SHA256","hash":"4d2f7fa3a9b1065f3ae97f9754c9734dab0355a075ba5e9d77ced870981cb666","blockSize":4194304,"blocks":["4d2f7fa3a9b1065f3ae97f9754c9734dab0355a075ba5e9d77ced870981cb666"]},"offset":"18512846"},"_getHolder.js":{"size":280,"integrity":{"algorithm":"SHA256","hash":"7d951bdcd4db2dc26b915883df44ef62377b069f8583959778e6fa08d2455db3","blockSize":4194304,"blocks":["7d951bdcd4db2dc26b915883df44ef62377b069f8583959778e6fa08d2455db3"]},"offset":"18513602"},"_getMapData.js":{"size":400,"integrity":{"algorithm":"SHA256","hash":"65d78bb9d058f742fae2416c00840b3f40e87a6b2155d4b2ab83b8d1c48c296a","blockSize":4194304,"blocks":["65d78bb9d058f742fae2416c00840b3f40e87a6b2155d4b2ab83b8d1c48c296a"]},"offset":"18513882"},"_getMatchData.js":{"size":573,"integrity":{"algorithm":"SHA256","hash":"4333bb2857a95fd4b676a9db2aa82d05ccf5f6f50f9d44b104886ea137700286","blockSize":4194304,"blocks":["4333bb2857a95fd4b676a9db2aa82d05ccf5f6f50f9d44b104886ea137700286"]},"offset":"18514282"},"_getNative.js":{"size":483,"integrity":{"algorithm":"SHA256","hash":"7392e38f4cb3cd6e1d3e3f89a26619cf89968382e0ed72a45d52e527aec0b1d9","blockSize":4194304,"blocks":["7392e38f4cb3cd6e1d3e3f89a26619cf89968382e0ed72a45d52e527aec0b1d9"]},"offset":"18514855"},"_getPrototype.js":{"size":163,"integrity":{"algorithm":"SHA256","hash":"8beda7e5198f970fd49f0e0b1bd5256e13af516f45c190ea45104bcd3c4b1517","blockSize":4194304,"blocks":["8beda7e5198f970fd49f0e0b1bd5256e13af516f45c190ea45104bcd3c4b1517"]},"offset":"18515338"},"_getRawTag.js":{"size":1139,"integrity":{"algorithm":"SHA256","hash":"3142fd97f89816f65a1b5bd17931f70c12fd9714d455c28cac4b91491901c713","blockSize":4194304,"blocks":["3142fd97f89816f65a1b5bd17931f70c12fd9714d455c28cac4b91491901c713"]},"offset":"18515501"},"_getSymbols.js":{"size":886,"integrity":{"algorithm":"SHA256","hash":"3e850bf36c7ce747eef141dfcd98f0942b030215cb94c0be7a6a08c98a958e5e","blockSize":4194304,"blocks":["3e850bf36c7ce747eef141dfcd98f0942b030215cb94c0be7a6a08c98a958e5e"]},"offset":"18516640"},"_getSymbolsIn.js":{"size":754,"integrity":{"algorithm":"SHA256","hash":"35cede8008aa104552d51e6bb96874b32f792fde7b2364661662173095bf3720","blockSize":4194304,"blocks":["35cede8008aa104552d51e6bb96874b32f792fde7b2364661662173095bf3720"]},"offset":"18517526"},"_getTag.js":{"size":1838,"integrity":{"algorithm":"SHA256","hash":"ad94aaa26724c5e331f0810ae9d4069929d5ee7c7b18e51a5e7e0f629bd3ffd3","blockSize":4194304,"blocks":["ad94aaa26724c5e331f0810ae9d4069929d5ee7c7b18e51a5e7e0f629bd3ffd3"]},"offset":"18518280"},"_getValue.js":{"size":325,"integrity":{"algorithm":"SHA256","hash":"102bb7520adda0718b3953d6af99838244d97aa1697a36f50fc4ab0070350f41","blockSize":4194304,"blocks":["102bb7520adda0718b3953d6af99838244d97aa1697a36f50fc4ab0070350f41"]},"offset":"18520118"},"_getView.js":{"size":1024,"integrity":{"algorithm":"SHA256","hash":"3f978b51e597e9e78149bf5df230052d60f2125dbae544dc7b1e28a098cd7aa0","blockSize":4194304,"blocks":["3f978b51e597e9e78149bf5df230052d60f2125dbae544dc7b1e28a098cd7aa0"]},"offset":"18520443"},"_getWrapDetails.js":{"size":479,"integrity":{"algorithm":"SHA256","hash":"37093d5f135f01cc58d4f28fe79fea791f72906e8c61ba674d84a858d8d5a67b","blockSize":4194304,"blocks":["37093d5f135f01cc58d4f28fe79fea791f72906e8c61ba674d84a858d8d5a67b"]},"offset":"18521467"},"_hasPath.js":{"size":1085,"integrity":{"algorithm":"SHA256","hash":"1fd75d39690b3d1b8562af1fc1312fd2cfd1673a62668e9797c0c1057b406432","blockSize":4194304,"blocks":["1fd75d39690b3d1b8562af1fc1312fd2cfd1673a62668e9797c0c1057b406432"]},"offset":"18521946"},"_hasUnicode.js":{"size":949,"integrity":{"algorithm":"SHA256","hash":"a2ed37159b293c0a543cd0ad35f3b7154039f0f004b1e3ea505a0e1515e208d3","blockSize":4194304,"blocks":["a2ed37159b293c0a543cd0ad35f3b7154039f0f004b1e3ea505a0e1515e208d3"]},"offset":"18523031"},"_hasUnicodeWord.js":{"size":491,"integrity":{"algorithm":"SHA256","hash":"89ed9fac3f97e188633a2c63a5528282ef73028fef5fc3e6e9a9e9e1cc6cc3a1","blockSize":4194304,"blocks":["89ed9fac3f97e188633a2c63a5528282ef73028fef5fc3e6e9a9e9e1cc6cc3a1"]},"offset":"18523980"},"_hashClear.js":{"size":281,"integrity":{"algorithm":"SHA256","hash":"d9f799f614605335bc0e3c3426ba84ec50bc188ddbac97fcf5ed810325c537f9","blockSize":4194304,"blocks":["d9f799f614605335bc0e3c3426ba84ec50bc188ddbac97fcf5ed810325c537f9"]},"offset":"18524471"},"_hashDelete.js":{"size":445,"integrity":{"algorithm":"SHA256","hash":"0a65708c8770e0e34e81f53289a31394a77b2789e3ca7586a425223a24c0b3b4","blockSize":4194304,"blocks":["0a65708c8770e0e34e81f53289a31394a77b2789e3ca7586a425223a24c0b3b4"]},"offset":"18524752"},"_hashGet.js":{"size":772,"integrity":{"algorithm":"SHA256","hash":"75cd024791ae12ec88871c24c82c23ca80505dd8370958ddc022e0d9efaedcae","blockSize":4194304,"blocks":["75cd024791ae12ec88871c24c82c23ca80505dd8370958ddc022e0d9efaedcae"]},"offset":"18525197"},"_hashHas.js":{"size":626,"integrity":{"algorithm":"SHA256","hash":"7ebef49fb1f8bca1c1710a045c4a4e52d0c34cbe547a95a18e2c02e7cfddebdd","blockSize":4194304,"blocks":["7ebef49fb1f8bca1c1710a045c4a4e52d0c34cbe547a95a18e2c02e7cfddebdd"]},"offset":"18525969"},"_hashSet.js":{"size":598,"integrity":{"algorithm":"SHA256","hash":"180372f66c983a5f424145fa1e2fb0d7d3ad9cc4249e2489c203cadc0e0456cc","blockSize":4194304,"blocks":["180372f66c983a5f424145fa1e2fb0d7d3ad9cc4249e2489c203cadc0e0456cc"]},"offset":"18526595"},"_initCloneArray.js":{"size":692,"integrity":{"algorithm":"SHA256","hash":"73ba23f0f5b13e152415d5bd3a1855a686e4c57424bbdfe1dd8189d5d19877a5","blockSize":4194304,"blocks":["73ba23f0f5b13e152415d5bd3a1855a686e4c57424bbdfe1dd8189d5d19877a5"]},"offset":"18527193"},"_initCloneByTag.js":{"size":2261,"integrity":{"algorithm":"SHA256","hash":"2552b396fa46955713dde74e78d1711b582d82d0c6f044590443d88ce9218465","blockSize":4194304,"blocks":["2552b396fa46955713dde74e78d1711b582d82d0c6f044590443d88ce9218465"]},"offset":"18527885"},"_initCloneObject.js":{"size":486,"integrity":{"algorithm":"SHA256","hash":"23aca4a78a9e5ce2eb17fb7ac1b12f57621f1156cee06fc28f9e2ac2d5fd1681","blockSize":4194304,"blocks":["23aca4a78a9e5ce2eb17fb7ac1b12f57621f1156cee06fc28f9e2ac2d5fd1681"]},"offset":"18530146"},"_insertWrapDetails.js":{"size":748,"integrity":{"algorithm":"SHA256","hash":"35f6152473a61cf36f99d584e8d83647e37f286edd29ee21e939ed0a4366c64b","blockSize":4194304,"blocks":["35f6152473a61cf36f99d584e8d83647e37f286edd29ee21e939ed0a4366c64b"]},"offset":"18530632"},"_isFlattenable.js":{"size":608,"integrity":{"algorithm":"SHA256","hash":"ec51b977a31a76fe787e46e5ec8dbb757dc0026ea7af82320ae1f1e27da40895","blockSize":4194304,"blocks":["ec51b977a31a76fe787e46e5ec8dbb757dc0026ea7af82320ae1f1e27da40895"]},"offset":"18531380"},"_isIndex.js":{"size":759,"integrity":{"algorithm":"SHA256","hash":"2baf7a241dfa17458e7274d568625c5e95e85cd57341c11c6a9f95531d2b49cd","blockSize":4194304,"blocks":["2baf7a241dfa17458e7274d568625c5e95e85cd57341c11c6a9f95531d2b49cd"]},"offset":"18531988"},"_isIterateeCall.js":{"size":877,"integrity":{"algorithm":"SHA256","hash":"43a63fe192e33cdda10f4c77eb45042381b3a5712e33daabb2fcbf8f1cebfddb","blockSize":4194304,"blocks":["43a63fe192e33cdda10f4c77eb45042381b3a5712e33daabb2fcbf8f1cebfddb"]},"offset":"18532747"},"_isKey.js":{"size":880,"integrity":{"algorithm":"SHA256","hash":"0f5dce93adc9aa4b43003c2669e06e2eda1455e4167a12aa703324f578ecbfe1","blockSize":4194304,"blocks":["0f5dce93adc9aa4b43003c2669e06e2eda1455e4167a12aa703324f578ecbfe1"]},"offset":"18533624"},"_isKeyable.js":{"size":430,"integrity":{"algorithm":"SHA256","hash":"350b0af6255491303512c1cf75a2b57cb62efcc392d9a280435dfaa04aed06cf","blockSize":4194304,"blocks":["350b0af6255491303512c1cf75a2b57cb62efcc392d9a280435dfaa04aed06cf"]},"offset":"18534504"},"_isLaziable.js":{"size":712,"integrity":{"algorithm":"SHA256","hash":"6863f63c866527fb17eba2b8abd81f04cdde2057c76201f3ac190494d319bd33","blockSize":4194304,"blocks":["6863f63c866527fb17eba2b8abd81f04cdde2057c76201f3ac190494d319bd33"]},"offset":"18534934"},"_isMaskable.js":{"size":395,"integrity":{"algorithm":"SHA256","hash":"7fca667defefe5906ecaa58bfc85337197465d7df8ac8dcf06961d0de4a05fba","blockSize":4194304,"blocks":["7fca667defefe5906ecaa58bfc85337197465d7df8ac8dcf06961d0de4a05fba"]},"offset":"18535646"},"_isMasked.js":{"size":564,"integrity":{"algorithm":"SHA256","hash":"bc22cc820f6dfa6a16303d9e0b2430defb8d78328a2f56a0fbf0d919c6128757","blockSize":4194304,"blocks":["bc22cc820f6dfa6a16303d9e0b2430defb8d78328a2f56a0fbf0d919c6128757"]},"offset":"18536041"},"_isPrototype.js":{"size":480,"integrity":{"algorithm":"SHA256","hash":"cfb95e7cf139dcc5fbf79e4b13f7fa9f30fedf3c7d73093ca8c5ee44d7d4aaaa","blockSize":4194304,"blocks":["cfb95e7cf139dcc5fbf79e4b13f7fa9f30fedf3c7d73093ca8c5ee44d7d4aaaa"]},"offset":"18536605"},"_isStrictComparable.js":{"size":414,"integrity":{"algorithm":"SHA256","hash":"adb0b07c7c84a54ae3e19f7c92aa915a0ae8e0a26ff3c3fa8aacb4d63b8dfbe4","blockSize":4194304,"blocks":["adb0b07c7c84a54ae3e19f7c92aa915a0ae8e0a26ff3c3fa8aacb4d63b8dfbe4"]},"offset":"18537085"},"_iteratorToArray.js":{"size":360,"integrity":{"algorithm":"SHA256","hash":"32f28cd367d0fd3426bb1b53fa648dba07245a0d837b4e31e2bdddb13ce25107","blockSize":4194304,"blocks":["32f28cd367d0fd3426bb1b53fa648dba07245a0d837b4e31e2bdddb13ce25107"]},"offset":"18537499"},"_lazyClone.js":{"size":657,"integrity":{"algorithm":"SHA256","hash":"a7c29e1b48490be0e4114ec696cfb9078efb2c84b515b2fb22d090de4adeac40","blockSize":4194304,"blocks":["a7c29e1b48490be0e4114ec696cfb9078efb2c84b515b2fb22d090de4adeac40"]},"offset":"18537859"},"_lazyReverse.js":{"size":491,"integrity":{"algorithm":"SHA256","hash":"03b1c25da23e238ceb276999e02685a7d188e95a11309cf48de424e69529dc18","blockSize":4194304,"blocks":["03b1c25da23e238ceb276999e02685a7d188e95a11309cf48de424e69529dc18"]},"offset":"18538516"},"_lazyValue.js":{"size":1790,"integrity":{"algorithm":"SHA256","hash":"84d51a53ea72e167bf00a4dfd7487d1af3c9907da9c81973d27a334d44730d40","blockSize":4194304,"blocks":["84d51a53ea72e167bf00a4dfd7487d1af3c9907da9c81973d27a334d44730d40"]},"offset":"18539007"},"_listCacheClear.js":{"size":218,"integrity":{"algorithm":"SHA256","hash":"0872c1fc38da972860c5d7e9b029d60556a1132343e9c151b9446002cf5f3c35","blockSize":4194304,"blocks":["0872c1fc38da972860c5d7e9b029d60556a1132343e9c151b9446002cf5f3c35"]},"offset":"18540797"},"_listCacheDelete.js":{"size":775,"integrity":{"algorithm":"SHA256","hash":"a3760383a9251969424b63e0cd9cbed3e376e94b18dfe462c2a5bdbd0281568d","blockSize":4194304,"blocks":["a3760383a9251969424b63e0cd9cbed3e376e94b18dfe462c2a5bdbd0281568d"]},"offset":"18541015"},"_listCacheGet.js":{"size":420,"integrity":{"algorithm":"SHA256","hash":"499002dd4ffe04bb2c270f5629b85b8c1578ace90f18b8f6ddc62fdc75a9c018","blockSize":4194304,"blocks":["499002dd4ffe04bb2c270f5629b85b8c1578ace90f18b8f6ddc62fdc75a9c018"]},"offset":"18541790"},"_listCacheHas.js":{"size":403,"integrity":{"algorithm":"SHA256","hash":"dadbb626a3f14d58da266fd66de1b0b1d7fef13e9d6e2d1802e908f26f6a6882","blockSize":4194304,"blocks":["dadbb626a3f14d58da266fd66de1b0b1d7fef13e9d6e2d1802e908f26f6a6882"]},"offset":"18542210"},"_listCacheSet.js":{"size":553,"integrity":{"algorithm":"SHA256","hash":"7557307601cff2f4071cf9d7fa9aa5316064c8974f8cf30404acb5897d5ba242","blockSize":4194304,"blocks":["7557307601cff2f4071cf9d7fa9aa5316064c8974f8cf30404acb5897d5ba242"]},"offset":"18542613"},"_mapCacheClear.js":{"size":393,"integrity":{"algorithm":"SHA256","hash":"e83e7e069f743cda3397d56bf30bb6863046b3729730b932f67fd8cb1479b24a","blockSize":4194304,"blocks":["e83e7e069f743cda3397d56bf30bb6863046b3729730b932f67fd8cb1479b24a"]},"offset":"18543166"},"_mapCacheDelete.js":{"size":450,"integrity":{"algorithm":"SHA256","hash":"63644bb7c346b74226f5cf6e5d7712a91414dc9cbd28d0733817e72f121b2f3a","blockSize":4194304,"blocks":["63644bb7c346b74226f5cf6e5d7712a91414dc9cbd28d0733817e72f121b2f3a"]},"offset":"18543559"},"_mapCacheGet.js":{"size":330,"integrity":{"algorithm":"SHA256","hash":"76095488d813ea6627dff4cb3aa3033722ccec642aa4c9a596c571e509c84b9c","blockSize":4194304,"blocks":["76095488d813ea6627dff4cb3aa3033722ccec642aa4c9a596c571e509c84b9c"]},"offset":"18544009"},"_mapCacheHas.js":{"size":382,"integrity":{"algorithm":"SHA256","hash":"4b41ddbc15713b24902083119ad7f45e710a26358b871a700a857b3ecd85be81","blockSize":4194304,"blocks":["4b41ddbc15713b24902083119ad7f45e710a26358b871a700a857b3ecd85be81"]},"offset":"18544339"},"_mapCacheSet.js":{"size":489,"integrity":{"algorithm":"SHA256","hash":"464f027fa65e25a396cccd9b5e2103259f51f7fc646b72f64907a89106697bd6","blockSize":4194304,"blocks":["464f027fa65e25a396cccd9b5e2103259f51f7fc646b72f64907a89106697bd6"]},"offset":"18544721"},"_mapToArray.js":{"size":363,"integrity":{"algorithm":"SHA256","hash":"5d44139746a75599d76943ab9b10fbfc0865ca07272265eb94ea218fa591eaf4","blockSize":4194304,"blocks":["5d44139746a75599d76943ab9b10fbfc0865ca07272265eb94ea218fa591eaf4"]},"offset":"18545210"},"_matchesStrictComparable.js":{"size":574,"integrity":{"algorithm":"SHA256","hash":"f8eaac0f6f8af658933221834f7638f6d2967dbfb21d87b8e77d4feaaf4ca7e3","blockSize":4194304,"blocks":["f8eaac0f6f8af658933221834f7638f6d2967dbfb21d87b8e77d4feaaf4ca7e3"]},"offset":"18545573"},"_memoizeCapped.js":{"size":633,"integrity":{"algorithm":"SHA256","hash":"1da7277242b79f0e2fb5261b5fb8bfe1363b6a167e1c196ffe34c7f01cc71a5e","blockSize":4194304,"blocks":["1da7277242b79f0e2fb5261b5fb8bfe1363b6a167e1c196ffe34c7f01cc71a5e"]},"offset":"18546147"},"_mergeData.js":{"size":3135,"integrity":{"algorithm":"SHA256","hash":"1b2c0b0be33a07225ba79cb66601d7f78e09ac5f896d53fcd060011d0fd66491","blockSize":4194304,"blocks":["1b2c0b0be33a07225ba79cb66601d7f78e09ac5f896d53fcd060011d0fd66491"]},"offset":"18546780"},"_metaMap.js":{"size":143,"integrity":{"algorithm":"SHA256","hash":"1d7b3626ce926fdfa1b014c725aaae932f04628bc5ee7b36b3632f715590676c","blockSize":4194304,"blocks":["1d7b3626ce926fdfa1b014c725aaae932f04628bc5ee7b36b3632f715590676c"]},"offset":"18549915"},"_nativeCreate.js":{"size":187,"integrity":{"algorithm":"SHA256","hash":"4271167f1b155aa72b4112e5e716837175380b3f797c4763ca102c6b48bdb69f","blockSize":4194304,"blocks":["4271167f1b155aa72b4112e5e716837175380b3f797c4763ca102c6b48bdb69f"]},"offset":"18550058"},"_nativeKeys.js":{"size":204,"integrity":{"algorithm":"SHA256","hash":"2aca1ae1ff39e05d3f36082c4b46211668313e7ef1a08754043d80fe8e35c0b5","blockSize":4194304,"blocks":["2aca1ae1ff39e05d3f36082c4b46211668313e7ef1a08754043d80fe8e35c0b5"]},"offset":"18550245"},"_nativeKeysIn.js":{"size":490,"integrity":{"algorithm":"SHA256","hash":"c1970a10bedf2fc57f0306b8469c2d7c4cf12df3eb0f1e6538a929a4bbbe0849","blockSize":4194304,"blocks":["c1970a10bedf2fc57f0306b8469c2d7c4cf12df3eb0f1e6538a929a4bbbe0849"]},"offset":"18550449"},"_nodeUtil.js":{"size":995,"integrity":{"algorithm":"SHA256","hash":"537b6e42a7aa1200af9fb5079f05b12d3e3c00f1f0665d67ef17e80dd0949b65","blockSize":4194304,"blocks":["537b6e42a7aa1200af9fb5079f05b12d3e3c00f1f0665d67ef17e80dd0949b65"]},"offset":"18550939"},"_objectToString.js":{"size":565,"integrity":{"algorithm":"SHA256","hash":"81c0b42d3076882d603659f81f75883fb5ccda995f323e2423ecff8648d6e231","blockSize":4194304,"blocks":["81c0b42d3076882d603659f81f75883fb5ccda995f323e2423ecff8648d6e231"]},"offset":"18551934"},"_overArg.js":{"size":382,"integrity":{"algorithm":"SHA256","hash":"0eb5681b004c2bccb0b5480924c589dda6702b3bb53eb384a0c22956312a3ae2","blockSize":4194304,"blocks":["0eb5681b004c2bccb0b5480924c589dda6702b3bb53eb384a0c22956312a3ae2"]},"offset":"18552499"},"_overRest.js":{"size":1096,"integrity":{"algorithm":"SHA256","hash":"8833534359cb66fde3c020f57e1280f9626c806088e6b9eaf51953b3c849ce36","blockSize":4194304,"blocks":["8833534359cb66fde3c020f57e1280f9626c806088e6b9eaf51953b3c849ce36"]},"offset":"18552881"},"_parent.js":{"size":436,"integrity":{"algorithm":"SHA256","hash":"b1a85d2cbbd4bea3b76e2b74d60cce492bc0d91c4a25656aab5017a13119a6ea","blockSize":4194304,"blocks":["b1a85d2cbbd4bea3b76e2b74d60cce492bc0d91c4a25656aab5017a13119a6ea"]},"offset":"18553977"},"_reEscape.js":{"size":105,"integrity":{"algorithm":"SHA256","hash":"19273f353ee560f281aa74c9179a2e977400c08de8ec8af65ebcb32f5fb2a527","blockSize":4194304,"blocks":["19273f353ee560f281aa74c9179a2e977400c08de8ec8af65ebcb32f5fb2a527"]},"offset":"18554413"},"_reEvaluate.js":{"size":108,"integrity":{"algorithm":"SHA256","hash":"d6a2f29eb24646e67b31f8b026234ff57a78e2cca8af3da9d43f173e51949ebe","blockSize":4194304,"blocks":["d6a2f29eb24646e67b31f8b026234ff57a78e2cca8af3da9d43f173e51949ebe"]},"offset":"18554518"},"_reInterpolate.js":{"size":115,"integrity":{"algorithm":"SHA256","hash":"ece8e61ced08270d0e529e847511543f99ae2eb67c5fe3a4e1cb43572500e36a","blockSize":4194304,"blocks":["ece8e61ced08270d0e529e847511543f99ae2eb67c5fe3a4e1cb43572500e36a"]},"offset":"18554626"},"_realNames.js":{"size":98,"integrity":{"algorithm":"SHA256","hash":"214c59771323560484af0420a002b02ae8efba8fa875047275927d1a4f1c1f0c","blockSize":4194304,"blocks":["214c59771323560484af0420a002b02ae8efba8fa875047275927d1a4f1c1f0c"]},"offset":"18554741"},"_reorder.js":{"size":900,"integrity":{"algorithm":"SHA256","hash":"495710ae274abce5b6e71a9879c735ef340210b3795a91059f51c55a0f9d4b27","blockSize":4194304,"blocks":["495710ae274abce5b6e71a9879c735ef340210b3795a91059f51c55a0f9d4b27"]},"offset":"18554839"},"_replaceHolders.js":{"size":785,"integrity":{"algorithm":"SHA256","hash":"670f940008f7bb3ef54b5254d61ecc441e819da2eef53597048ea4ebb7225363","blockSize":4194304,"blocks":["670f940008f7bb3ef54b5254d61ecc441e819da2eef53597048ea4ebb7225363"]},"offset":"18555739"},"_root.js":{"size":300,"integrity":{"algorithm":"SHA256","hash":"32ea714f25057679fdd3099c2693cb6be437252e78eea3a5a7882a1282078348","blockSize":4194304,"blocks":["32ea714f25057679fdd3099c2693cb6be437252e78eea3a5a7882a1282078348"]},"offset":"18556524"},"_safeGet.js":{"size":456,"integrity":{"algorithm":"SHA256","hash":"266166a787c864ba2c6306f40f4c135c3614546aea06492fa7103e3af5a4b724","blockSize":4194304,"blocks":["266166a787c864ba2c6306f40f4c135c3614546aea06492fa7103e3af5a4b724"]},"offset":"18556824"},"_setCacheAdd.js":{"size":424,"integrity":{"algorithm":"SHA256","hash":"c946c72eb39ef2e5a04836b610e9877200e4269490930b21e64c29b1573624ed","blockSize":4194304,"blocks":["c946c72eb39ef2e5a04836b610e9877200e4269490930b21e64c29b1573624ed"]},"offset":"18557280"},"_setCacheHas.js":{"size":316,"integrity":{"algorithm":"SHA256","hash":"6928afa62c51aba995e2b617915ced865627a6399dfd18c864191accfead3233","blockSize":4194304,"blocks":["6928afa62c51aba995e2b617915ced865627a6399dfd18c864191accfead3233"]},"offset":"18557704"},"_setData.js":{"size":645,"integrity":{"algorithm":"SHA256","hash":"1fedd970934b9090fc8bc52e4e10d81e5319ec1909cbe08a0868d4e25ae1e79e","blockSize":4194304,"blocks":["1fedd970934b9090fc8bc52e4e10d81e5319ec1909cbe08a0868d4e25ae1e79e"]},"offset":"18558020"},"_setToArray.js":{"size":345,"integrity":{"algorithm":"SHA256","hash":"814c80519a194b7bff82784e06c2d6c69ec9e64e03b515932dd5bba81c60fd49","blockSize":4194304,"blocks":["814c80519a194b7bff82784e06c2d6c69ec9e64e03b515932dd5bba81c60fd49"]},"offset":"18558665"},"_setToPairs.js":{"size":364,"integrity":{"algorithm":"SHA256","hash":"7e9e3e26490ddc2ddb0f86ba88dffd19c3ba543e473035547e9d1c7a28f746f4","blockSize":4194304,"blocks":["7e9e3e26490ddc2ddb0f86ba88dffd19c3ba543e473035547e9d1c7a28f746f4"]},"offset":"18559010"},"_setToString.js":{"size":392,"integrity":{"algorithm":"SHA256","hash":"86eee99d2a2d984255dd6c7d3ac25ab918808e9777311acf7fbc3adbd45879e7","blockSize":4194304,"blocks":["86eee99d2a2d984255dd6c7d3ac25ab918808e9777311acf7fbc3adbd45879e7"]},"offset":"18559374"},"_setWrapToString.js":{"size":847,"integrity":{"algorithm":"SHA256","hash":"cecf7bcaf5a4b8f7ca83d3bf57a27c3874d2f18742ed7f18452beca3eb64d6af","blockSize":4194304,"blocks":["cecf7bcaf5a4b8f7ca83d3bf57a27c3874d2f18742ed7f18452beca3eb64d6af"]},"offset":"18559766"},"_shortOut.js":{"size":941,"integrity":{"algorithm":"SHA256","hash":"22851e1eb10e731a812bdf627957cabc535cc320e00e44170b692fc210c0aaad","blockSize":4194304,"blocks":["22851e1eb10e731a812bdf627957cabc535cc320e00e44170b692fc210c0aaad"]},"offset":"18560613"},"_shuffleSelf.js":{"size":689,"integrity":{"algorithm":"SHA256","hash":"62043164438968ce5b8c7277d87777cb965bc97add797f314c464bd60ca4cd3a","blockSize":4194304,"blocks":["62043164438968ce5b8c7277d87777cb965bc97add797f314c464bd60ca4cd3a"]},"offset":"18561554"},"_stackClear.js":{"size":254,"integrity":{"algorithm":"SHA256","hash":"89b580cfc2b47c5aba05bd124b807b82d007fa106ee3a7c9e61205c72cf654d0","blockSize":4194304,"blocks":["89b580cfc2b47c5aba05bd124b807b82d007fa106ee3a7c9e61205c72cf654d0"]},"offset":"18562243"},"_stackDelete.js":{"size":405,"integrity":{"algorithm":"SHA256","hash":"2d769f2390c318fd300f07e9c3cfd4e0d1f2d9857316b03aa416ed2b14636f88","blockSize":4194304,"blocks":["2d769f2390c318fd300f07e9c3cfd4e0d1f2d9857316b03aa416ed2b14636f88"]},"offset":"18562497"},"_stackGet.js":{"size":271,"integrity":{"algorithm":"SHA256","hash":"0681d6e2e14cb4d0fb1a2f893dd25fff38fcbdfc6f2cc12989d8c946e7055973","blockSize":4194304,"blocks":["0681d6e2e14cb4d0fb1a2f893dd25fff38fcbdfc6f2cc12989d8c946e7055973"]},"offset":"18562902"},"_stackHas.js":{"size":323,"integrity":{"algorithm":"SHA256","hash":"b61639cbc8c10a724c7de827483fd5e0e92db13f8b8e1ef81cbca8bc242bb4f8","blockSize":4194304,"blocks":["b61639cbc8c10a724c7de827483fd5e0e92db13f8b8e1ef81cbca8bc242bb4f8"]},"offset":"18563173"},"_stackSet.js":{"size":853,"integrity":{"algorithm":"SHA256","hash":"ac5abfcc087211a21f7d3087e3919febed9c1780dbc74cce3a007886ba5fc86a","blockSize":4194304,"blocks":["ac5abfcc087211a21f7d3087e3919febed9c1780dbc74cce3a007886ba5fc86a"]},"offset":"18563496"},"_strictIndexOf.js":{"size":600,"integrity":{"algorithm":"SHA256","hash":"394592bfc902ec6451478cee5e466052e8358d0ffbee50d31419d26d8d14ff00","blockSize":4194304,"blocks":["394592bfc902ec6451478cee5e466052e8358d0ffbee50d31419d26d8d14ff00"]},"offset":"18564349"},"_strictLastIndexOf.js":{"size":576,"integrity":{"algorithm":"SHA256","hash":"5b153f6bcf9bdfce038bbab5253ff345a1383386d8aa296a96f4dfe1edb52f77","blockSize":4194304,"blocks":["5b153f6bcf9bdfce038bbab5253ff345a1383386d8aa296a96f4dfe1edb52f77"]},"offset":"18564949"},"_stringSize.js":{"size":432,"integrity":{"algorithm":"SHA256","hash":"45a57e04488b34752ef93b02fbcf4fc62f8b0823d9ba0096f8bdc470110f5df7","blockSize":4194304,"blocks":["45a57e04488b34752ef93b02fbcf4fc62f8b0823d9ba0096f8bdc470110f5df7"]},"offset":"18565525"},"_stringToArray.js":{"size":450,"integrity":{"algorithm":"SHA256","hash":"df8f719c2232705da60cfe935227c5dc7edd6990016319ab842d3c03c15d07e8","blockSize":4194304,"blocks":["df8f719c2232705da60cfe935227c5dc7edd6990016319ab842d3c03c15d07e8"]},"offset":"18565957"},"_stringToPath.js":{"size":840,"integrity":{"algorithm":"SHA256","hash":"59db820071a2b05418f75fd3a41a6b519a10e25fd1257355bca7240a21690ca1","blockSize":4194304,"blocks":["59db820071a2b05418f75fd3a41a6b519a10e25fd1257355bca7240a21690ca1"]},"offset":"18566407"},"_toKey.js":{"size":523,"integrity":{"algorithm":"SHA256","hash":"16f6bb9f50ab65818dca375f29bb77f72e6c073bd06a804856dcc476ed224eec","blockSize":4194304,"blocks":["16f6bb9f50ab65818dca375f29bb77f72e6c073bd06a804856dcc476ed224eec"]},"offset":"18567247"},"_toSource.js":{"size":556,"integrity":{"algorithm":"SHA256","hash":"aa142c3fcb0dab692297bf7acb158e174c0667984561a02beec890f6c3c7cc2b","blockSize":4194304,"blocks":["aa142c3fcb0dab692297bf7acb158e174c0667984561a02beec890f6c3c7cc2b"]},"offset":"18567770"},"_trimmedEndIndex.js":{"size":515,"integrity":{"algorithm":"SHA256","hash":"edd88c7e95d5a3d2aaaa1656fc7e231583108ea358685eb113239d95a4e47433","blockSize":4194304,"blocks":["edd88c7e95d5a3d2aaaa1656fc7e231583108ea358685eb113239d95a4e47433"]},"offset":"18568326"},"_unescapeHtmlChar.js":{"size":493,"integrity":{"algorithm":"SHA256","hash":"39f416c25d42f786694256f99d466d239c6386f72d1837723f3b5cac585fe90c","blockSize":4194304,"blocks":["39f416c25d42f786694256f99d466d239c6386f72d1837723f3b5cac585fe90c"]},"offset":"18568841"},"_unicodeSize.js":{"size":1642,"integrity":{"algorithm":"SHA256","hash":"afd590da7f18e94393e8e744e1bf58bb6c619b5d56c9919650314cc78b93d45a","blockSize":4194304,"blocks":["afd590da7f18e94393e8e744e1bf58bb6c619b5d56c9919650314cc78b93d45a"]},"offset":"18569334"},"_unicodeToArray.js":{"size":1588,"integrity":{"algorithm":"SHA256","hash":"79eaf1570bb18732be65875ef7fd233b8aac09402d1b905b75bfeed06478a843","blockSize":4194304,"blocks":["79eaf1570bb18732be65875ef7fd233b8aac09402d1b905b75bfeed06478a843"]},"offset":"18570976"},"_unicodeWords.js":{"size":3060,"integrity":{"algorithm":"SHA256","hash":"22d133a81bafe13cc6260cdc7a4f16085c1fb5353d8e334a5e66b6321909bb42","blockSize":4194304,"blocks":["22d133a81bafe13cc6260cdc7a4f16085c1fb5353d8e334a5e66b6321909bb42"]},"offset":"18572564"},"_updateWrapDetails.js":{"size":1310,"integrity":{"algorithm":"SHA256","hash":"bdbd4703c6576d9891ad2f03f4ed93a79f48a2b95951376f565485a6fa0a1ec4","blockSize":4194304,"blocks":["bdbd4703c6576d9891ad2f03f4ed93a79f48a2b95951376f565485a6fa0a1ec4"]},"offset":"18575624"},"_wrapperClone.js":{"size":658,"integrity":{"algorithm":"SHA256","hash":"222b8e99ac3dda61e98e8d31994e45a4603720b6c1e6b453c2c14ec096bd81ba","blockSize":4194304,"blocks":["222b8e99ac3dda61e98e8d31994e45a4603720b6c1e6b453c2c14ec096bd81ba"]},"offset":"18576934"},"add.js":{"size":469,"integrity":{"algorithm":"SHA256","hash":"62192fb471bfa09a28cad119585b74a8dba2d6bbebb6ce2ca65c535a608e318a","blockSize":4194304,"blocks":["62192fb471bfa09a28cad119585b74a8dba2d6bbebb6ce2ca65c535a608e318a"]},"offset":"18577592"},"after.js":{"size":1060,"integrity":{"algorithm":"SHA256","hash":"ca045b1ae9e085d50cb03af9568f0523470138cef8b83246182f3fb81fa9f095","blockSize":4194304,"blocks":["ca045b1ae9e085d50cb03af9568f0523470138cef8b83246182f3fb81fa9f095"]},"offset":"18578061"},"array.js":{"size":2490,"integrity":{"algorithm":"SHA256","hash":"a0e766e2abd0bb23e983dde91294c2e8e1f3943f17cb64ac1547c35d8a028a98","blockSize":4194304,"blocks":["a0e766e2abd0bb23e983dde91294c2e8e1f3943f17cb64ac1547c35d8a028a98"]},"offset":"18579121"},"ary.js":{"size":857,"integrity":{"algorithm":"SHA256","hash":"486703ebdd06044d5aa5e845607a49f529db9aa916b2f64b23fb7ab19e9cb3c2","blockSize":4194304,"blocks":["486703ebdd06044d5aa5e845607a49f529db9aa916b2f64b23fb7ab19e9cb3c2"]},"offset":"18581611"},"assign.js":{"size":1566,"integrity":{"algorithm":"SHA256","hash":"e97ed43f77aac5c8faa3689ab3620360ba3c51e422f419bf04093385caedef2d","blockSize":4194304,"blocks":["e97ed43f77aac5c8faa3689ab3620360ba3c51e422f419bf04093385caedef2d"]},"offset":"18582468"},"assignIn.js":{"size":906,"integrity":{"algorithm":"SHA256","hash":"d7e63836248cb9894fb3730304a24c22f5f88f9242fc8f2ebf3b3d067bc07aff","blockSize":4194304,"blocks":["d7e63836248cb9894fb3730304a24c22f5f88f9242fc8f2ebf3b3d067bc07aff"]},"offset":"18584034"},"assignInWith.js":{"size":1256,"integrity":{"algorithm":"SHA256","hash":"c25cad1ab42a7d95a90abd2379afe558d8e0b301c1d4e0c38df2ab2624cd7eb9","blockSize":4194304,"blocks":["c25cad1ab42a7d95a90abd2379afe558d8e0b301c1d4e0c38df2ab2624cd7eb9"]},"offset":"18584940"},"assignWith.js":{"size":1223,"integrity":{"algorithm":"SHA256","hash":"d50ddf93b7ab950fe08af9e2fc297f6e459d1b007580edbb62ed77b8604bfd7c","blockSize":4194304,"blocks":["d50ddf93b7ab950fe08af9e2fc297f6e459d1b007580edbb62ed77b8604bfd7c"]},"offset":"18586196"},"at.js":{"size":559,"integrity":{"algorithm":"SHA256","hash":"4cbc888f95de895af4c7ded54753637ae8217068f1fb9465225fed759dd15c20","blockSize":4194304,"blocks":["4cbc888f95de895af4c7ded54753637ae8217068f1fb9465225fed759dd15c20"]},"offset":"18587419"},"attempt.js":{"size":931,"integrity":{"algorithm":"SHA256","hash":"0931ef61bd9f9ddae6a46067732ee747fe694c5f690c5dc5189588cdef251197","blockSize":4194304,"blocks":["0931ef61bd9f9ddae6a46067732ee747fe694c5f690c5dc5189588cdef251197"]},"offset":"18587978"},"before.js":{"size":1090,"integrity":{"algorithm":"SHA256","hash":"0cc79ed65583090e486d4840ba33088f80db5f81ffd00a55956cae909facda1e","blockSize":4194304,"blocks":["0cc79ed65583090e486d4840ba33088f80db5f81ffd00a55956cae909facda1e"]},"offset":"18588909"},"bind.js":{"size":1694,"integrity":{"algorithm":"SHA256","hash":"c0a9d31fa28c7b583a52e4d6d77cd012cbc400cf811b156fbae8b390efc5532b","blockSize":4194304,"blocks":["c0a9d31fa28c7b583a52e4d6d77cd012cbc400cf811b156fbae8b390efc5532b"]},"offset":"18589999"},"bindAll.js":{"size":1125,"integrity":{"algorithm":"SHA256","hash":"bd995daba5ea5981970c265e76e2beba26e27008fab1dbd13692e6e234edbe84","blockSize":4194304,"blocks":["bd995daba5ea5981970c265e76e2beba26e27008fab1dbd13692e6e234edbe84"]},"offset":"18591693"},"bindKey.js":{"size":2071,"integrity":{"algorithm":"SHA256","hash":"a4a911fab102c792b8352ba5d8b6663db806f27f58c29836cbfcfa5f53478121","blockSize":4194304,"blocks":["a4a911fab102c792b8352ba5d8b6663db806f27f58c29836cbfcfa5f53478121"]},"offset":"18592818"},"camelCase.js":{"size":701,"integrity":{"algorithm":"SHA256","hash":"d30eeadd294319a31ba4cd361e4a902adfd978f5b079f70ff48dd9add39caf79","blockSize":4194304,"blocks":["d30eeadd294319a31ba4cd361e4a902adfd978f5b079f70ff48dd9add39caf79"]},"offset":"18594889"},"capitalize.js":{"size":529,"integrity":{"algorithm":"SHA256","hash":"a732a2da22230884bbd70c9b35620721212f65b8d84afdbc2e5bb0a2af1881db","blockSize":4194304,"blocks":["a732a2da22230884bbd70c9b35620721212f65b8d84afdbc2e5bb0a2af1881db"]},"offset":"18595590"},"castArray.js":{"size":768,"integrity":{"algorithm":"SHA256","hash":"30f012884b6f1056dbad98343de77f9c7cde538a7ac376da97ffdf771984217c","blockSize":4194304,"blocks":["30f012884b6f1056dbad98343de77f9c7cde538a7ac376da97ffdf771984217c"]},"offset":"18596119"},"ceil.js":{"size":507,"integrity":{"algorithm":"SHA256","hash":"5104952e29650bd9fb199d402ed7da457da6c24f436bf039d7d2039da3edccd9","blockSize":4194304,"blocks":["5104952e29650bd9fb199d402ed7da457da6c24f436bf039d7d2039da3edccd9"]},"offset":"18596887"},"chain.js":{"size":851,"integrity":{"algorithm":"SHA256","hash":"17124af887adcb2fd74f1493ba4b19d0fd71f61f1a4bd5218ddc0fd092470fdf","blockSize":4194304,"blocks":["17124af887adcb2fd74f1493ba4b19d0fd71f61f1a4bd5218ddc0fd092470fdf"]},"offset":"18597394"},"chunk.js":{"size":1411,"integrity":{"algorithm":"SHA256","hash":"6ca2ee6761ed1ab6a0eb2cddffb78988e889b38f83db7c63b50c058219bd4eca","blockSize":4194304,"blocks":["6ca2ee6761ed1ab6a0eb2cddffb78988e889b38f83db7c63b50c058219bd4eca"]},"offset":"18598245"},"clamp.js":{"size":890,"integrity":{"algorithm":"SHA256","hash":"9f0074b089c0de70fe3e80ccbb6ac8e108c51b0e7447ce5e820d8220443d1d18","blockSize":4194304,"blocks":["9f0074b089c0de70fe3e80ccbb6ac8e108c51b0e7447ce5e820d8220443d1d18"]},"offset":"18599656"},"clone.js":{"size":1065,"integrity":{"algorithm":"SHA256","hash":"5ff3e92c3d5a5c820f81c8066d6ea8063504c004355f8169d6264bec7296df8e","blockSize":4194304,"blocks":["5ff3e92c3d5a5c820f81c8066d6ea8063504c004355f8169d6264bec7296df8e"]},"offset":"18600546"},"cloneDeep.js":{"size":679,"integrity":{"algorithm":"SHA256","hash":"4fbad9cd21ccac1d56090dad772aeb6ee665d2e5bedfcfe23040b0ee2f56ebfc","blockSize":4194304,"blocks":["4fbad9cd21ccac1d56090dad772aeb6ee665d2e5bedfcfe23040b0ee2f56ebfc"]},"offset":"18601611"},"cloneDeepWith.js":{"size":1046,"integrity":{"algorithm":"SHA256","hash":"5d6b64289ea9139b11d76f2e5f015afddbdb0ba5e2a56964190c757b1c41f32c","blockSize":4194304,"blocks":["5d6b64289ea9139b11d76f2e5f015afddbdb0ba5e2a56964190c757b1c41f32c"]},"offset":"18602290"},"cloneWith.js":{"size":1194,"integrity":{"algorithm":"SHA256","hash":"0ec8d7c82c7883cec0004e150dd23ce5f523bb379ecaf051b65e1b89ddaf6da1","blockSize":4194304,"blocks":["0ec8d7c82c7883cec0004e150dd23ce5f523bb379ecaf051b65e1b89ddaf6da1"]},"offset":"18603336"},"collection.js":{"size":1009,"integrity":{"algorithm":"SHA256","hash":"4b1fd79028384c35e82a9bb5c326f1ba7854f8a22e1b033b801d33952355657e","blockSize":4194304,"blocks":["4b1fd79028384c35e82a9bb5c326f1ba7854f8a22e1b033b801d33952355657e"]},"offset":"18604530"},"commit.js":{"size":641,"integrity":{"algorithm":"SHA256","hash":"7bbd908d349da44cc676ad0cf93b016fd49a98604c92cd125b9d3a3e02bb1c62","blockSize":4194304,"blocks":["7bbd908d349da44cc676ad0cf93b016fd49a98604c92cd125b9d3a3e02bb1c62"]},"offset":"18605539"},"compact.js":{"size":681,"integrity":{"algorithm":"SHA256","hash":"2258c9e49eadab63fdcf7d0348bd07b32e9743952f229c6b37861e1bca0cd50b","blockSize":4194304,"blocks":["2258c9e49eadab63fdcf7d0348bd07b32e9743952f229c6b37861e1bca0cd50b"]},"offset":"18606180"},"concat.js":{"size":1007,"integrity":{"algorithm":"SHA256","hash":"31c891f3d0a25c99a75fff28305825a9bde7cad5b6631625c741ba29bd19bd5e","blockSize":4194304,"blocks":["31c891f3d0a25c99a75fff28305825a9bde7cad5b6631625c741ba29bd19bd5e"]},"offset":"18606861"},"cond.js":{"size":1613,"integrity":{"algorithm":"SHA256","hash":"6381d31f1fe767a1eb4498b58149984dbdf54bc500bd41e5024184b8dc6fd428","blockSize":4194304,"blocks":["6381d31f1fe767a1eb4498b58149984dbdf54bc500bd41e5024184b8dc6fd428"]},"offset":"18607868"},"conforms.js":{"size":978,"integrity":{"algorithm":"SHA256","hash":"a5fc9c90d12996d67bbe8ddb4b4fa0f063581790ba82c6c62169cc13f3f0324e","blockSize":4194304,"blocks":["a5fc9c90d12996d67bbe8ddb4b4fa0f063581790ba82c6c62169cc13f3f0324e"]},"offset":"18609481"},"conformsTo.js":{"size":954,"integrity":{"algorithm":"SHA256","hash":"01d43bb81ddb6728c8d93a479d0a7f349ee8100b74ad39b85fa696a74420de07","blockSize":4194304,"blocks":["01d43bb81ddb6728c8d93a479d0a7f349ee8100b74ad39b85fa696a74420de07"]},"offset":"18610459"},"constant.js":{"size":528,"integrity":{"algorithm":"SHA256","hash":"13f0f4ed40b5861f35c3647afe29e7d880556a46b7781992edd9739e77baeb00","blockSize":4194304,"blocks":["13f0f4ed40b5861f35c3647afe29e7d880556a46b7781992edd9739e77baeb00"]},"offset":"18611413"},"core.js":{"size":115957,"integrity":{"algorithm":"SHA256","hash":"e7ace8c713f76cf458b9f90fb4735f52225cc8c69a0e7b319bd9b78764307add","blockSize":4194304,"blocks":["e7ace8c713f76cf458b9f90fb4735f52225cc8c69a0e7b319bd9b78764307add"]},"offset":"18611941"},"core.min.js":{"size":12684,"integrity":{"algorithm":"SHA256","hash":"de1fac0ad3a03174f4e49969f48d2e499d19afcd076db19431d7b1cd707832fa","blockSize":4194304,"blocks":["de1fac0ad3a03174f4e49969f48d2e499d19afcd076db19431d7b1cd707832fa"]},"offset":"18727898"},"countBy.js":{"size":1262,"integrity":{"algorithm":"SHA256","hash":"e576f93b0189b3a33121c043d1fe675f6c7cb20729cd2e7527a40e07559d3a18","blockSize":4194304,"blocks":["e576f93b0189b3a33121c043d1fe675f6c7cb20729cd2e7527a40e07559d3a18"]},"offset":"18740582"},"create.js":{"size":1032,"integrity":{"algorithm":"SHA256","hash":"ede2714570c0d3f34bd177fb11dbc0667c5d2ca968d4380d3dcbf4c24a6f5bd6","blockSize":4194304,"blocks":["ede2714570c0d3f34bd177fb11dbc0667c5d2ca968d4380d3dcbf4c24a6f5bd6"]},"offset":"18741844"},"curry.js":{"size":1644,"integrity":{"algorithm":"SHA256","hash":"c07cc80afbbecd5c33c68ee4d9614bc060994c1956cb5754c46c282ef7f37561","blockSize":4194304,"blocks":["c07cc80afbbecd5c33c68ee4d9614bc060994c1956cb5754c46c282ef7f37561"]},"offset":"18742876"},"curryRight.js":{"size":1499,"integrity":{"algorithm":"SHA256","hash":"7d550bb9e63e95df9a3e337b3b0bd44438794d90ef8473d242fb81a5074f9c76","blockSize":4194304,"blocks":["7d550bb9e63e95df9a3e337b3b0bd44438794d90ef8473d242fb81a5074f9c76"]},"offset":"18744520"},"date.js":{"size":48,"integrity":{"algorithm":"SHA256","hash":"a4aaaeea3665850d84aee769724601faaa8f187b86ed3862c19d1dbb436588d1","blockSize":4194304,"blocks":["a4aaaeea3665850d84aee769724601faaa8f187b86ed3862c19d1dbb436588d1"]},"offset":"18746019"},"debounce.js":{"size":6100,"integrity":{"algorithm":"SHA256","hash":"65b7974b78d520ad5efa5035489336f92c3304d82f1c68ae8ddb4da9229500fc","blockSize":4194304,"blocks":["65b7974b78d520ad5efa5035489336f92c3304d82f1c68ae8ddb4da9229500fc"]},"offset":"18746067"},"deburr.js":{"size":1617,"integrity":{"algorithm":"SHA256","hash":"9a9dc25a8c6e45a8c689c8e4b0610fcf616a934f9e15523050f269f4621c6e4f","blockSize":4194304,"blocks":["9a9dc25a8c6e45a8c689c8e4b0610fcf616a934f9e15523050f269f4621c6e4f"]},"offset":"18752167"},"defaultTo.js":{"size":608,"integrity":{"algorithm":"SHA256","hash":"61b8a0cacdd9f69b3583b1f48200ba4fd612df6a083ecb7a50c9ae2d80881e95","blockSize":4194304,"blocks":["61b8a0cacdd9f69b3583b1f48200ba4fd612df6a083ecb7a50c9ae2d80881e95"]},"offset":"18753784"},"defaults.js":{"size":1754,"integrity":{"algorithm":"SHA256","hash":"8404d7524bdda84422c7d9c5df4570f2d98d9caf21bf5ea29b00acf54bc97e50","blockSize":4194304,"blocks":["8404d7524bdda84422c7d9c5df4570f2d98d9caf21bf5ea29b00acf54bc97e50"]},"offset":"18754392"},"defaultsDeep.js":{"size":839,"integrity":{"algorithm":"SHA256","hash":"dbc0950a1c6287ccf43b60402b7660ae4ffb2ebf8fab006ce4fd7766ca0f939c","blockSize":4194304,"blocks":["dbc0950a1c6287ccf43b60402b7660ae4ffb2ebf8fab006ce4fd7766ca0f939c"]},"offset":"18756146"},"defer.js":{"size":693,"integrity":{"algorithm":"SHA256","hash":"f03bed34b82fad0f64a118d7af538f20614e984b7b4cd93df4ecf0ed81123cb3","blockSize":4194304,"blocks":["f03bed34b82fad0f64a118d7af538f20614e984b7b4cd93df4ecf0ed81123cb3"]},"offset":"18756985"},"delay.js":{"size":795,"integrity":{"algorithm":"SHA256","hash":"be9eb42d2e072277012e62756da1ebbf2ba5f6ce6577e8a56784fcd37589632b","blockSize":4194304,"blocks":["be9eb42d2e072277012e62756da1ebbf2ba5f6ce6577e8a56784fcd37589632b"]},"offset":"18757678"},"difference.js":{"size":1063,"integrity":{"algorithm":"SHA256","hash":"35f8f2e8d83e1af1a18fa6043dd64387246ebf8886c446afb9a9edf5cb8316e4","blockSize":4194304,"blocks":["35f8f2e8d83e1af1a18fa6043dd64387246ebf8886c446afb9a9edf5cb8316e4"]},"offset":"18758473"},"differenceBy.js":{"size":1527,"integrity":{"algorithm":"SHA256","hash":"ea889f0c332826661e8dde262a02d1149f6b8d9471dd68f7aa951087c8189eb9","blockSize":4194304,"blocks":["ea889f0c332826661e8dde262a02d1149f6b8d9471dd68f7aa951087c8189eb9"]},"offset":"18759536"},"differenceWith.js":{"size":1395,"integrity":{"algorithm":"SHA256","hash":"3963f2e27bad30274bf94a54a9a3b1d27122d5e92a2ef22a52b8b906b9ac975c","blockSize":4194304,"blocks":["3963f2e27bad30274bf94a54a9a3b1d27122d5e92a2ef22a52b8b906b9ac975c"]},"offset":"18761063"},"divide.js":{"size":491,"integrity":{"algorithm":"SHA256","hash":"ce24730eba575f2afb7dca7b70b8c30827c3bd90901cb9c9352a4083794787ff","blockSize":4194304,"blocks":["ce24730eba575f2afb7dca7b70b8c30827c3bd90901cb9c9352a4083794787ff"]},"offset":"18762458"},"drop.js":{"size":890,"integrity":{"algorithm":"SHA256","hash":"cab31a9c9774b18c693c7b3094ee71ecdd3a554d9af47e967310fc17bbbe664c","blockSize":4194304,"blocks":["cab31a9c9774b18c693c7b3094ee71ecdd3a554d9af47e967310fc17bbbe664c"]},"offset":"18762949"},"dropRight.js":{"size":927,"integrity":{"algorithm":"SHA256","hash":"147b573a323bc6163676c364575cdbbd785f26670a2a153aa5216e03ec4a7da0","blockSize":4194304,"blocks":["147b573a323bc6163676c364575cdbbd785f26670a2a153aa5216e03ec4a7da0"]},"offset":"18763839"},"dropRightWhile.js":{"size":1412,"integrity":{"algorithm":"SHA256","hash":"f5afc0452542566f343cbf655d26f5f428b3666914beaf4307a53059da1a0b50","blockSize":4194304,"blocks":["f5afc0452542566f343cbf655d26f5f428b3666914beaf4307a53059da1a0b50"]},"offset":"18764766"},"dropWhile.js":{"size":1384,"integrity":{"algorithm":"SHA256","hash":"8477a1cb88c7f34dbd4cb6496cdc5853815a9232b71fc81b2c924a381e311cc0","blockSize":4194304,"blocks":["8477a1cb88c7f34dbd4cb6496cdc5853815a9232b71fc81b2c924a381e311cc0"]},"offset":"18766178"},"each.js":{"size":39,"integrity":{"algorithm":"SHA256","hash":"4d10bb01d04d58517504ecce768fce382a54fd93f5b04e6f649448af7978ee42","blockSize":4194304,"blocks":["4d10bb01d04d58517504ecce768fce382a54fd93f5b04e6f649448af7978ee42"]},"offset":"18767562"},"eachRight.js":{"size":44,"integrity":{"algorithm":"SHA256","hash":"b231b46d2a636cd4e876773316d1bf20fb252ecbffb9a5032c22cbdb2dad822d","blockSize":4194304,"blocks":["b231b46d2a636cd4e876773316d1bf20fb252ecbffb9a5032c22cbdb2dad822d"]},"offset":"18767601"},"endsWith.js":{"size":1098,"integrity":{"algorithm":"SHA256","hash":"e7b9b316913e7080015e81258958856f6e7b72ed83b50169ecadfff203ca6f94","blockSize":4194304,"blocks":["e7b9b316913e7080015e81258958856f6e7b72ed83b50169ecadfff203ca6f94"]},"offset":"18767645"},"entries.js":{"size":39,"integrity":{"algorithm":"SHA256","hash":"613eb0b14a3fdf90ad901dc8860aa7f77d752efc8d887a8df246be91501945da","blockSize":4194304,"blocks":["613eb0b14a3fdf90ad901dc8860aa7f77d752efc8d887a8df246be91501945da"]},"offset":"18768743"},"entriesIn.js":{"size":41,"integrity":{"algorithm":"SHA256","hash":"963f4202340184bf129c8111fd1958b1ce3a535a760aaff2929347d2774a7ccf","blockSize":4194304,"blocks":["963f4202340184bf129c8111fd1958b1ce3a535a760aaff2929347d2774a7ccf"]},"offset":"18768782"},"eq.js":{"size":799,"integrity":{"algorithm":"SHA256","hash":"05eddf24818a442d922f08fde9d9a9ac1edcc2e613ddfd0dc1aea5f99d40e3b8","blockSize":4194304,"blocks":["05eddf24818a442d922f08fde9d9a9ac1edcc2e613ddfd0dc1aea5f99d40e3b8"]},"offset":"18768823"},"escape.js":{"size":1444,"integrity":{"algorithm":"SHA256","hash":"aee6c381b9303b6ec91e5303feecc62a6a190919996e3838832681916dacbe99","blockSize":4194304,"blocks":["aee6c381b9303b6ec91e5303feecc62a6a190919996e3838832681916dacbe99"]},"offset":"18769622"},"escapeRegExp.js":{"size":871,"integrity":{"algorithm":"SHA256","hash":"b4fbd68d3aeb8081412cdaa28e6ae218b5d014db61fdf12199942d953c578d4f","blockSize":4194304,"blocks":["b4fbd68d3aeb8081412cdaa28e6ae218b5d014db61fdf12199942d953c578d4f"]},"offset":"18771066"},"every.js":{"size":1869,"integrity":{"algorithm":"SHA256","hash":"e5b00d5a2d1ac2b2616f38ce1e7a0d3adda3fc74d24194468443816abd9fcaef","blockSize":4194304,"blocks":["e5b00d5a2d1ac2b2616f38ce1e7a0d3adda3fc74d24194468443816abd9fcaef"]},"offset":"18771937"},"extend.js":{"size":40,"integrity":{"algorithm":"SHA256","hash":"32a68951279d8b57c741ab487b5eef543394c802e30f95b0f68d44e366db8aef","blockSize":4194304,"blocks":["32a68951279d8b57c741ab487b5eef543394c802e30f95b0f68d44e366db8aef"]},"offset":"18773806"},"extendWith.js":{"size":44,"integrity":{"algorithm":"SHA256","hash":"1b2704465ff3abb01d67ae8a2315c3bbaf0c386863886c03343c219bb02cc5a8","blockSize":4194304,"blocks":["1b2704465ff3abb01d67ae8a2315c3bbaf0c386863886c03343c219bb02cc5a8"]},"offset":"18773846"},"fill.js":{"size":1081,"integrity":{"algorithm":"SHA256","hash":"0066052b2f2b92b1e99825750740cab607ff55ea2d70c5a2541b26d414d92623","blockSize":4194304,"blocks":["0066052b2f2b92b1e99825750740cab607ff55ea2d70c5a2541b26d414d92623"]},"offset":"18773890"},"filter.js":{"size":1683,"integrity":{"algorithm":"SHA256","hash":"de07d8b962757208ca41d71e64c90200851cede9c134c70a30323fe077466d2f","blockSize":4194304,"blocks":["de07d8b962757208ca41d71e64c90200851cede9c134c70a30323fe077466d2f"]},"offset":"18774971"},"find.js":{"size":1304,"integrity":{"algorithm":"SHA256","hash":"4a81b134f9f15d7e16f86ed4759917b9acb49b192436e7d85c1b716ab65734ed","blockSize":4194304,"blocks":["4a81b134f9f15d7e16f86ed4759917b9acb49b192436e7d85c1b716ab65734ed"]},"offset":"18776654"},"findIndex.js":{"size":1654,"integrity":{"algorithm":"SHA256","hash":"561b38700412783a579bdcdfab83708ab863708d2f900c38f5e92bb2855a418a","blockSize":4194304,"blocks":["561b38700412783a579bdcdfab83708ab863708d2f900c38f5e92bb2855a418a"]},"offset":"18777958"},"findKey.js":{"size":1329,"integrity":{"algorithm":"SHA256","hash":"d81a2beaedb98e5761d23a6c64227f459050ef6ce1cf33290bd1776bf23036f3","blockSize":4194304,"blocks":["d81a2beaedb98e5761d23a6c64227f459050ef6ce1cf33290bd1776bf23036f3"]},"offset":"18779612"},"findLast.js":{"size":730,"integrity":{"algorithm":"SHA256","hash":"3b3c99679e09b1320b35a0992aa12092cf028b2d4939c4a198002b71da38945f","blockSize":4194304,"blocks":["3b3c99679e09b1320b35a0992aa12092cf028b2d4939c4a198002b71da38945f"]},"offset":"18780941"},"findLastIndex.js":{"size":1761,"integrity":{"algorithm":"SHA256","hash":"894101f1606411eeaa9be481ffda69c14ea8bff68811efd62db2dacd96dc31fb","blockSize":4194304,"blocks":["894101f1606411eeaa9be481ffda69c14ea8bff68811efd62db2dacd96dc31fb"]},"offset":"18781671"},"findLastKey.js":{"size":1346,"integrity":{"algorithm":"SHA256","hash":"890b86acc3c01b67fe798f7fdde8f63f51530db598ba264d6347040843d610ad","blockSize":4194304,"blocks":["890b86acc3c01b67fe798f7fdde8f63f51530db598ba264d6347040843d610ad"]},"offset":"18783432"},"first.js":{"size":36,"integrity":{"algorithm":"SHA256","hash":"96a23a435507782b9ee4cbc1d3312f9f2617a40e9bd1b7af838185f40feef657","blockSize":4194304,"blocks":["96a23a435507782b9ee4cbc1d3312f9f2617a40e9bd1b7af838185f40feef657"]},"offset":"18784778"},"flake.lock":{"size":963,"integrity":{"algorithm":"SHA256","hash":"fbc1669c041ff39c13aa7322b7fabaa35ff1a5c1521314d6bd546d634989d483","blockSize":4194304,"blocks":["fbc1669c041ff39c13aa7322b7fabaa35ff1a5c1521314d6bd546d634989d483"]},"offset":"18784814"},"flake.nix":{"size":459,"integrity":{"algorithm":"SHA256","hash":"10b63ef23424514d38304248e133436889e3aec1595779c368b47c02a3c93005","blockSize":4194304,"blocks":["10b63ef23424514d38304248e133436889e3aec1595779c368b47c02a3c93005"]},"offset":"18785777"},"flatMap.js":{"size":812,"integrity":{"algorithm":"SHA256","hash":"e3f1e3f60e4b7747042248c97275a6393407f809644649e12375bfb63d8f88c7","blockSize":4194304,"blocks":["e3f1e3f60e4b7747042248c97275a6393407f809644649e12375bfb63d8f88c7"]},"offset":"18786236"},"flatMapDeep.js":{"size":796,"integrity":{"algorithm":"SHA256","hash":"f06dc199275a0ee546009b9f846ef9911acb24f412eb926bbd30e21dae0525bc","blockSize":4194304,"blocks":["f06dc199275a0ee546009b9f846ef9911acb24f412eb926bbd30e21dae0525bc"]},"offset":"18787048"},"flatMapDepth.js":{"size":901,"integrity":{"algorithm":"SHA256","hash":"67baec1baad99f492f68c85f0223f329dd8ca9575799003c1b319859aa985452","blockSize":4194304,"blocks":["67baec1baad99f492f68c85f0223f329dd8ca9575799003c1b319859aa985452"]},"offset":"18787844"},"flatten.js":{"size":489,"integrity":{"algorithm":"SHA256","hash":"e3f17c26f6b972607555f4b3a2f0c292b409a0bd0362079de3b9cb5ba6a83500","blockSize":4194304,"blocks":["e3f17c26f6b972607555f4b3a2f0c292b409a0bd0362079de3b9cb5ba6a83500"]},"offset":"18788745"},"flattenDeep.js":{"size":577,"integrity":{"algorithm":"SHA256","hash":"c245f405061e1150f378ff297530e932970ba853dfc1bb230a5f8af919ffb036","blockSize":4194304,"blocks":["c245f405061e1150f378ff297530e932970ba853dfc1bb230a5f8af919ffb036"]},"offset":"18789234"},"flattenDepth.js":{"size":787,"integrity":{"algorithm":"SHA256","hash":"bcd693ccb65618e40330553c678cbfa6adca25b1a7825f31cf6ba029dcaf450e","blockSize":4194304,"blocks":["bcd693ccb65618e40330553c678cbfa6adca25b1a7825f31cf6ba029dcaf450e"]},"offset":"18789811"},"flip.js":{"size":636,"integrity":{"algorithm":"SHA256","hash":"f41bd8994ca7be04b9fa0e70b96e5edeccb5a6fbd26741fded5f614feb6bae87","blockSize":4194304,"blocks":["f41bd8994ca7be04b9fa0e70b96e5edeccb5a6fbd26741fded5f614feb6bae87"]},"offset":"18790598"},"floor.js":{"size":521,"integrity":{"algorithm":"SHA256","hash":"f9ed8f38f70561e986ba3fde9d63f4623794978f09346db46868625c17e30626","blockSize":4194304,"blocks":["f9ed8f38f70561e986ba3fde9d63f4623794978f09346db46868625c17e30626"]},"offset":"18791234"},"flow.js":{"size":666,"integrity":{"algorithm":"SHA256","hash":"4071cbfa443d584991451c35d303ae7fde4dc1a782050fbd9d89899d7ceab539","blockSize":4194304,"blocks":["4071cbfa443d584991451c35d303ae7fde4dc1a782050fbd9d89899d7ceab539"]},"offset":"18791755"},"flowRight.js":{"size":590,"integrity":{"algorithm":"SHA256","hash":"0e5047539f63271816f1604f61dd3424daa16ba357576515edea3e8a52eafdff","blockSize":4194304,"blocks":["0e5047539f63271816f1604f61dd3424daa16ba357576515edea3e8a52eafdff"]},"offset":"18792421"},"forEach.js":{"size":1355,"integrity":{"algorithm":"SHA256","hash":"8c804ff21ceb97f4c02e64c62337e916dbd651c2da581ab117653f963b2cf635","blockSize":4194304,"blocks":["8c804ff21ceb97f4c02e64c62337e916dbd651c2da581ab117653f963b2cf635"]},"offset":"18793011"},"forEachRight.js":{"size":924,"integrity":{"algorithm":"SHA256","hash":"96fe1c6e4e2191a491e29f9a65276eed9fc28add0679623d9b81c7b0d4acb423","blockSize":4194304,"blocks":["96fe1c6e4e2191a491e29f9a65276eed9fc28add0679623d9b81c7b0d4acb423"]},"offset":"18794366"},"forIn.js":{"size":1065,"integrity":{"algorithm":"SHA256","hash":"cd364a5f3a84e01efe8b11358416d2709118aeb9bfde01f7e8672fbae13a6abf","blockSize":4194304,"blocks":["cd364a5f3a84e01efe8b11358416d2709118aeb9bfde01f7e8672fbae13a6abf"]},"offset":"18795290"},"forInRight.js":{"size":929,"integrity":{"algorithm":"SHA256","hash":"3b2d6539f99fa23f957cd16eaed54b2f46202e45872c9d26c41bc0a30c612449","blockSize":4194304,"blocks":["3b2d6539f99fa23f957cd16eaed54b2f46202e45872c9d26c41bc0a30c612449"]},"offset":"18796355"},"forOwn.js":{"size":992,"integrity":{"algorithm":"SHA256","hash":"3e1c6cdf140b67a797a7357036c0fe0ee7d265def7c4997fb7db2e0b779bb17a","blockSize":4194304,"blocks":["3e1c6cdf140b67a797a7357036c0fe0ee7d265def7c4997fb7db2e0b779bb17a"]},"offset":"18797284"},"forOwnRight.js":{"size":866,"integrity":{"algorithm":"SHA256","hash":"3525a6fb0dc96ff7d8cac1f15bf86277729fb9b92e44ee5e3651753d58fa3765","blockSize":4194304,"blocks":["3525a6fb0dc96ff7d8cac1f15bf86277729fb9b92e44ee5e3651753d58fa3765"]},"offset":"18798276"},"fp.js":{"size":101,"integrity":{"algorithm":"SHA256","hash":"7ab815f00b2b3a77fe6b0d1099d3ee9ec8c6f4dc167f14703f4430a55cebd13e","blockSize":4194304,"blocks":["7ab815f00b2b3a77fe6b0d1099d3ee9ec8c6f4dc167f14703f4430a55cebd13e"]},"offset":"18799142"},"fromPairs.js":{"size":596,"integrity":{"algorithm":"SHA256","hash":"7c648e8b1d8896f490eb54f1aa6dbcf41e7346ec58b5c4dce704a183e1f1848f","blockSize":4194304,"blocks":["7c648e8b1d8896f490eb54f1aa6dbcf41e7346ec58b5c4dce704a183e1f1848f"]},"offset":"18799243"},"function.js":{"size":780,"integrity":{"algorithm":"SHA256","hash":"6bc64dc47fb41b25e04bbe8f459d45f925f1537b1ff1a65f6855ac0990761131","blockSize":4194304,"blocks":["6bc64dc47fb41b25e04bbe8f459d45f925f1537b1ff1a65f6855ac0990761131"]},"offset":"18799839"},"functions.js":{"size":685,"integrity":{"algorithm":"SHA256","hash":"ebf41d0fdb6dd89618af1bc56574accc4f368c2ca0100401f02ab90866e21e4e","blockSize":4194304,"blocks":["ebf41d0fdb6dd89618af1bc56574accc4f368c2ca0100401f02ab90866e21e4e"]},"offset":"18800619"},"functionsIn.js":{"size":714,"integrity":{"algorithm":"SHA256","hash":"067f5a2844b0be3f84b3778cb9ff92f78e6178ef10fc6d558e679808f34b589b","blockSize":4194304,"blocks":["067f5a2844b0be3f84b3778cb9ff92f78e6178ef10fc6d558e679808f34b589b"]},"offset":"18801304"},"get.js":{"size":884,"integrity":{"algorithm":"SHA256","hash":"97c5e6d3e75bad40d57c3d0e56c28797c81aa1db5963531a7c64c0e56fb6b110","blockSize":4194304,"blocks":["97c5e6d3e75bad40d57c3d0e56c28797c81aa1db5963531a7c64c0e56fb6b110"]},"offset":"18802018"},"groupBy.js":{"size":1399,"integrity":{"algorithm":"SHA256","hash":"63fed6feb1e2de4de72d460621fe4cd9b47dcaff0ce1769023798634f07a0f1e","blockSize":4194304,"blocks":["63fed6feb1e2de4de72d460621fe4cd9b47dcaff0ce1769023798634f07a0f1e"]},"offset":"18802902"},"gt.js":{"size":596,"integrity":{"algorithm":"SHA256","hash":"46d68fdf1aca955142d894478899638b98ff32b818d6b57553fad7c638070976","blockSize":4194304,"blocks":["46d68fdf1aca955142d894478899638b98ff32b818d6b57553fad7c638070976"]},"offset":"18804301"},"gte.js":{"size":635,"integrity":{"algorithm":"SHA256","hash":"9fe2d7bfbc8c125a89709d23a6db699e7984b1ceff904a0022dab989f00cdbfc","blockSize":4194304,"blocks":["9fe2d7bfbc8c125a89709d23a6db699e7984b1ceff904a0022dab989f00cdbfc"]},"offset":"18804897"},"has.js":{"size":757,"integrity":{"algorithm":"SHA256","hash":"200fba1ae4605f47c15fd28314c1fb651b33845976df18f56779b5df9a053a15","blockSize":4194304,"blocks":["200fba1ae4605f47c15fd28314c1fb651b33845976df18f56779b5df9a053a15"]},"offset":"18805532"},"hasIn.js":{"size":753,"integrity":{"algorithm":"SHA256","hash":"a3a8fb830aee0fba8a35b80c51ed23a95405261990679b8570a1d7adb0b9108b","blockSize":4194304,"blocks":["a3a8fb830aee0fba8a35b80c51ed23a95405261990679b8570a1d7adb0b9108b"]},"offset":"18806289"},"head.js":{"size":415,"integrity":{"algorithm":"SHA256","hash":"e3d0d744f11ebcd7eba5f7c675aa995162e8b228c9e216da0496eda74b026ef6","blockSize":4194304,"blocks":["e3d0d744f11ebcd7eba5f7c675aa995162e8b228c9e216da0496eda74b026ef6"]},"offset":"18807042"},"identity.js":{"size":370,"integrity":{"algorithm":"SHA256","hash":"b356675eecf6085c57d8c5c9c9bec57235513e42cad616477a1205a488f3d9d5","blockSize":4194304,"blocks":["b356675eecf6085c57d8c5c9c9bec57235513e42cad616477a1205a488f3d9d5"]},"offset":"18807457"},"inRange.js":{"size":1245,"integrity":{"algorithm":"SHA256","hash":"72483dd199939b063097198b572261b71241eda9e7d7c03beb646a239c75d8f8","blockSize":4194304,"blocks":["72483dd199939b063097198b572261b71241eda9e7d7c03beb646a239c75d8f8"]},"offset":"18807827"},"includes.js":{"size":1772,"integrity":{"algorithm":"SHA256","hash":"bce785094893c31352f823105409eb43214fbfe27fd14c52d8608b37d6153d4f","blockSize":4194304,"blocks":["bce785094893c31352f823105409eb43214fbfe27fd14c52d8608b37d6153d4f"]},"offset":"18809072"},"index.js":{"size":37,"integrity":{"algorithm":"SHA256","hash":"ff1c66bce74e39e290c8922991d5e5f22edf31164a8a073cc3a3d808a7986561","blockSize":4194304,"blocks":["ff1c66bce74e39e290c8922991d5e5f22edf31164a8a073cc3a3d808a7986561"]},"offset":"18810844"},"indexOf.js":{"size":1240,"integrity":{"algorithm":"SHA256","hash":"d76c65fa0ed067399108758fcb0975636e192f7e608b079696be541465c5ed77","blockSize":4194304,"blocks":["d76c65fa0ed067399108758fcb0975636e192f7e608b079696be541465c5ed77"]},"offset":"18810881"},"initial.js":{"size":461,"integrity":{"algorithm":"SHA256","hash":"df49656bf3f98a87fc305107c75661d75e2fbfbccab416939bdca8954a48a85e","blockSize":4194304,"blocks":["df49656bf3f98a87fc305107c75661d75e2fbfbccab416939bdca8954a48a85e"]},"offset":"18812121"},"intersection.js":{"size":953,"integrity":{"algorithm":"SHA256","hash":"747eb6bdc5f20d8307823e7a4bce3c786632fdfd8e443de771697b80e744e89c","blockSize":4194304,"blocks":["747eb6bdc5f20d8307823e7a4bce3c786632fdfd8e443de771697b80e744e89c"]},"offset":"18812582"},"intersectionBy.js":{"size":1467,"integrity":{"algorithm":"SHA256","hash":"b133dbc9111a17d373a7a31b7df5510cc086e97b7c8d94c5469bac6a2694157d","blockSize":4194304,"blocks":["b133dbc9111a17d373a7a31b7df5510cc086e97b7c8d94c5469bac6a2694157d"]},"offset":"18813535"},"intersectionWith.js":{"size":1388,"integrity":{"algorithm":"SHA256","hash":"275ff3f34e50a0d8328b811e519bebd4b706ab67f9f82593802f3a083a8fe129","blockSize":4194304,"blocks":["275ff3f34e50a0d8328b811e519bebd4b706ab67f9f82593802f3a083a8fe129"]},"offset":"18815002"},"invert.js":{"size":1128,"integrity":{"algorithm":"SHA256","hash":"8fb9d43290025ff2ed2c6bec15bbe70d908644b4ca954fecec1299295a3dc957","blockSize":4194304,"blocks":["8fb9d43290025ff2ed2c6bec15bbe70d908644b4ca954fecec1299295a3dc957"]},"offset":"18816390"},"invertBy.js":{"size":1651,"integrity":{"algorithm":"SHA256","hash":"2cb1bcacc9b2b3421fec36463bb0d1c1475488c6f878e4927d799d76234ad868","blockSize":4194304,"blocks":["2cb1bcacc9b2b3421fec36463bb0d1c1475488c6f878e4927d799d76234ad868"]},"offset":"18817518"},"invoke.js":{"size":634,"integrity":{"algorithm":"SHA256","hash":"f2389f6a59dd1ad801529e66de31bf67b19b002adf6a42eadab8cd2c47e4abe7","blockSize":4194304,"blocks":["f2389f6a59dd1ad801529e66de31bf67b19b002adf6a42eadab8cd2c47e4abe7"]},"offset":"18819169"},"invokeMap.js":{"size":1440,"integrity":{"algorithm":"SHA256","hash":"426c1e48d43c871ccf1eb7553f22b6991aacfe1468d2e9951cc1987a0fa92c03","blockSize":4194304,"blocks":["426c1e48d43c871ccf1eb7553f22b6991aacfe1468d2e9951cc1987a0fa92c03"]},"offset":"18819803"},"isArguments.js":{"size":1026,"integrity":{"algorithm":"SHA256","hash":"88921b43b9dbe2af82d6b88f323fdb9ce4a989abc6aef72871cb7954f8d4f19f","blockSize":4194304,"blocks":["88921b43b9dbe2af82d6b88f323fdb9ce4a989abc6aef72871cb7954f8d4f19f"]},"offset":"18821243"},"isArray.js":{"size":488,"integrity":{"algorithm":"SHA256","hash":"69a51a3435d6152559e524eb881a6350c76892b4d1ba83055333690533d6b4d6","blockSize":4194304,"blocks":["69a51a3435d6152559e524eb881a6350c76892b4d1ba83055333690533d6b4d6"]},"offset":"18822269"},"isArrayBuffer.js":{"size":732,"integrity":{"algorithm":"SHA256","hash":"7212673936b2f6cf29b03fe2a8242240006625a43d73e47e1c48d1ebe6f376c4","blockSize":4194304,"blocks":["7212673936b2f6cf29b03fe2a8242240006625a43d73e47e1c48d1ebe6f376c4"]},"offset":"18822757"},"isArrayLike.js":{"size":830,"integrity":{"algorithm":"SHA256","hash":"fce08522204e2bce2c30b5ba4e28b37aa5f7ec7640c794f0c3abb21179716623","blockSize":4194304,"blocks":["fce08522204e2bce2c30b5ba4e28b37aa5f7ec7640c794f0c3abb21179716623"]},"offset":"18823489"},"isArrayLikeObject.js":{"size":742,"integrity":{"algorithm":"SHA256","hash":"29fac39136e67b4e38c7bc2adf0702b6e2ef6be7f70e0e6c67980a1c24899ab7","blockSize":4194304,"blocks":["29fac39136e67b4e38c7bc2adf0702b6e2ef6be7f70e0e6c67980a1c24899ab7"]},"offset":"18824319"},"isBoolean.js":{"size":681,"integrity":{"algorithm":"SHA256","hash":"53387c8077307940f8d05f45f598b5df42994afb62e4f79a467d14f170c4c21a","blockSize":4194304,"blocks":["53387c8077307940f8d05f45f598b5df42994afb62e4f79a467d14f170c4c21a"]},"offset":"18825061"},"isBuffer.js":{"size":1114,"integrity":{"algorithm":"SHA256","hash":"533866d6336d5b57f9e46b33db8fbc3ac7aedc4fd2761afa556364c51f77c4e5","blockSize":4194304,"blocks":["533866d6336d5b57f9e46b33db8fbc3ac7aedc4fd2761afa556364c51f77c4e5"]},"offset":"18825742"},"isDate.js":{"size":642,"integrity":{"algorithm":"SHA256","hash":"71624bcc52d42460aa378125fe585bff54adde760f0e725486aca51a98c19c47","blockSize":4194304,"blocks":["71624bcc52d42460aa378125fe585bff54adde760f0e725486aca51a98c19c47"]},"offset":"18826856"},"isElement.js":{"size":574,"integrity":{"algorithm":"SHA256","hash":"8066a249004ee1087bd0e2d907f8c6facce77568bb8d79beadf157a418807a31","blockSize":4194304,"blocks":["8066a249004ee1087bd0e2d907f8c6facce77568bb8d79beadf157a418807a31"]},"offset":"18827498"},"isEmpty.js":{"size":2000,"integrity":{"algorithm":"SHA256","hash":"ff8b9029e34108a24af2322c1bda2d2139e89464d25f436b0d18fa6e613a237e","blockSize":4194304,"blocks":["ff8b9029e34108a24af2322c1bda2d2139e89464d25f436b0d18fa6e613a237e"]},"offset":"18828072"},"isEqual.js":{"size":986,"integrity":{"algorithm":"SHA256","hash":"f4ccb5d296b05b36d3d149f8dea50b69109c25d06fffffb1663b24e8fe0d9206","blockSize":4194304,"blocks":["f4ccb5d296b05b36d3d149f8dea50b69109c25d06fffffb1663b24e8fe0d9206"]},"offset":"18830072"},"isEqualWith.js":{"size":1352,"integrity":{"algorithm":"SHA256","hash":"77907836dce7f496cb9eff1a00ad78991c6e3d372b4b0a60f2a508b268b1f56f","blockSize":4194304,"blocks":["77907836dce7f496cb9eff1a00ad78991c6e3d372b4b0a60f2a508b268b1f56f"]},"offset":"18831058"},"isError.js":{"size":961,"integrity":{"algorithm":"SHA256","hash":"ca6dbefa9e146e737f93782b1e65e8d57f27bcc766f6bb0fb449309e04e6e1be","blockSize":4194304,"blocks":["ca6dbefa9e146e737f93782b1e65e8d57f27bcc766f6bb0fb449309e04e6e1be"]},"offset":"18832410"},"isFinite.js":{"size":793,"integrity":{"algorithm":"SHA256","hash":"ba1b1ca522941d939ba96af43f4566aeead815e026cf769f9f96b271773cbc92","blockSize":4194304,"blocks":["ba1b1ca522941d939ba96af43f4566aeead815e026cf769f9f96b271773cbc92"]},"offset":"18833371"},"isFunction.js":{"size":993,"integrity":{"algorithm":"SHA256","hash":"d20cac0bead37199613d60f4e00361d782fb7a0803050b274de0587e892417bd","blockSize":4194304,"blocks":["d20cac0bead37199613d60f4e00361d782fb7a0803050b274de0587e892417bd"]},"offset":"18834164"},"isInteger.js":{"size":669,"integrity":{"algorithm":"SHA256","hash":"d2048e129af96538a5821eb7048e5b9084eb447d32af8d623a4fd1ad478fa29a","blockSize":4194304,"blocks":["d2048e129af96538a5821eb7048e5b9084eb447d32af8d623a4fd1ad478fa29a"]},"offset":"18835157"},"isLength.js":{"size":802,"integrity":{"algorithm":"SHA256","hash":"6f0491c5ca5c4d7fc26cca3097ea9aa257e30e006d4c3251c0df1e7a1cfe0f66","blockSize":4194304,"blocks":["6f0491c5ca5c4d7fc26cca3097ea9aa257e30e006d4c3251c0df1e7a1cfe0f66"]},"offset":"18835826"},"isMap.js":{"size":613,"integrity":{"algorithm":"SHA256","hash":"9864060f8af5243606e992fae709d9e458a563fe9fc0ba6645548ec3e13bc343","blockSize":4194304,"blocks":["9864060f8af5243606e992fae709d9e458a563fe9fc0ba6645548ec3e13bc343"]},"offset":"18836628"},"isMatch.js":{"size":1078,"integrity":{"algorithm":"SHA256","hash":"6cd0a3cae2265ead716ad4a957c07db1c0b546e362ef36fa1779a1a068cde894","blockSize":4194304,"blocks":["6cd0a3cae2265ead716ad4a957c07db1c0b546e362ef36fa1779a1a068cde894"]},"offset":"18837241"},"isMatchWith.js":{"size":1329,"integrity":{"algorithm":"SHA256","hash":"67c8e0de8c0c3209fbc506831bc09fc4330266d468f90bbc2ceb5d3c92bd93c8","blockSize":4194304,"blocks":["67c8e0de8c0c3209fbc506831bc09fc4330266d468f90bbc2ceb5d3c92bd93c8"]},"offset":"18838319"},"isNaN.js":{"size":911,"integrity":{"algorithm":"SHA256","hash":"6975629ece825de22effa57ad7f0647c1629e4590fa11ab1526587af5fb3adfb","blockSize":4194304,"blocks":["6975629ece825de22effa57ad7f0647c1629e4590fa11ab1526587af5fb3adfb"]},"offset":"18839648"},"isNative.js":{"size":1221,"integrity":{"algorithm":"SHA256","hash":"bba65dcf5a4d123a0cab34e0f06eabd1936c5d228899664d54fcc5daa4cefd09","blockSize":4194304,"blocks":["bba65dcf5a4d123a0cab34e0f06eabd1936c5d228899664d54fcc5daa4cefd09"]},"offset":"18840559"},"isNil.js":{"size":426,"integrity":{"algorithm":"SHA256","hash":"c3f62f38f567d28d480379c9cc3098a163c0a0772ffbac0cd69ea06ed325e49e","blockSize":4194304,"blocks":["c3f62f38f567d28d480379c9cc3098a163c0a0772ffbac0cd69ea06ed325e49e"]},"offset":"18841780"},"isNull.js":{"size":381,"integrity":{"algorithm":"SHA256","hash":"fc2e58d8c2a95553ea21d9248668b9161d76306dfe56d0c4be6a6176c0d2d3d0","blockSize":4194304,"blocks":["fc2e58d8c2a95553ea21d9248668b9161d76306dfe56d0c4be6a6176c0d2d3d0"]},"offset":"18842206"},"isNumber.js":{"size":886,"integrity":{"algorithm":"SHA256","hash":"98f3368a9e9cefa6247b7429682558ec2dd3adb2a930f859b77ca4743516f76d","blockSize":4194304,"blocks":["98f3368a9e9cefa6247b7429682558ec2dd3adb2a930f859b77ca4743516f76d"]},"offset":"18842587"},"isObject.js":{"size":733,"integrity":{"algorithm":"SHA256","hash":"1f433726569c027f308b96ff487e8906068ef78b96b4e545884e6e3468ad8d8c","blockSize":4194304,"blocks":["1f433726569c027f308b96ff487e8906068ef78b96b4e545884e6e3468ad8d8c"]},"offset":"18843473"},"isObjectLike.js":{"size":614,"integrity":{"algorithm":"SHA256","hash":"a913b5adff90b0c6eefe68ca6e58d9c73e318e12986299607bb129b898d7e6f1","blockSize":4194304,"blocks":["a913b5adff90b0c6eefe68ca6e58d9c73e318e12986299607bb129b898d7e6f1"]},"offset":"18844206"},"isPlainObject.js":{"size":1650,"integrity":{"algorithm":"SHA256","hash":"994b111bc6f2b384d4e58e7fe6204337db4c8bbbb8a54eff4955f3cad8cbe9c5","blockSize":4194304,"blocks":["994b111bc6f2b384d4e58e7fe6204337db4c8bbbb8a54eff4955f3cad8cbe9c5"]},"offset":"18844820"},"isRegExp.js":{"size":646,"integrity":{"algorithm":"SHA256","hash":"2415501d0d08ace19d9ab5b2efd0776a1f91a339dea8b2f22d386e4666ae56e9","blockSize":4194304,"blocks":["2415501d0d08ace19d9ab5b2efd0776a1f91a339dea8b2f22d386e4666ae56e9"]},"offset":"18846470"},"isSafeInteger.js":{"size":949,"integrity":{"algorithm":"SHA256","hash":"8134b2b422b72dc8d3d2cab72d37612d2662d73a7a8596a9a20e6e01d823b526","blockSize":4194304,"blocks":["8134b2b422b72dc8d3d2cab72d37612d2662d73a7a8596a9a20e6e01d823b526"]},"offset":"18847116"},"isSet.js":{"size":613,"integrity":{"algorithm":"SHA256","hash":"49846dc7e51dbcc002fe911df132f6202451dd344d189a13763553201e74231b","blockSize":4194304,"blocks":["49846dc7e51dbcc002fe911df132f6202451dd344d189a13763553201e74231b"]},"offset":"18848065"},"isString.js":{"size":723,"integrity":{"algorithm":"SHA256","hash":"ed06f9541fd0dd9023899f732c12b2d2e038f181bf10b1349ca973b378e6eb8b","blockSize":4194304,"blocks":["ed06f9541fd0dd9023899f732c12b2d2e038f181bf10b1349ca973b378e6eb8b"]},"offset":"18848678"},"isSymbol.js":{"size":682,"integrity":{"algorithm":"SHA256","hash":"b882116f17d051769da22a027b9f8d013ed2212449793dcc88f33f3f18a204ad","blockSize":4194304,"blocks":["b882116f17d051769da22a027b9f8d013ed2212449793dcc88f33f3f18a204ad"]},"offset":"18849401"},"isTypedArray.js":{"size":695,"integrity":{"algorithm":"SHA256","hash":"a4d2273a797fda92a1d1fd600f3393ca1981c549f2988e82f47b7ed15d4014a7","blockSize":4194304,"blocks":["a4d2273a797fda92a1d1fd600f3393ca1981c549f2988e82f47b7ed15d4014a7"]},"offset":"18850083"},"isUndefined.js":{"size":416,"integrity":{"algorithm":"SHA256","hash":"75427a0591a0c34e852d42197ddf8d2dc121a705799bce05f31363b0bbf4f427","blockSize":4194304,"blocks":["75427a0591a0c34e852d42197ddf8d2dc121a705799bce05f31363b0bbf4f427"]},"offset":"18850778"},"isWeakMap.js":{"size":631,"integrity":{"algorithm":"SHA256","hash":"d13935b891ef87f095cdd4b3c7210dcd3b4ad4f658899d9279ed6d9489bbc45e","blockSize":4194304,"blocks":["d13935b891ef87f095cdd4b3c7210dcd3b4ad4f658899d9279ed6d9489bbc45e"]},"offset":"18851194"},"isWeakSet.js":{"size":643,"integrity":{"algorithm":"SHA256","hash":"ffd6bed10a91ca6c0b408f3f5bc0f45fa247e4f0bf6f9eb4c0f83f45c730b7d9","blockSize":4194304,"blocks":["ffd6bed10a91ca6c0b408f3f5bc0f45fa247e4f0bf6f9eb4c0f83f45c730b7d9"]},"offset":"18851825"},"iteratee.js":{"size":1700,"integrity":{"algorithm":"SHA256","hash":"0c7d7ddb8045b91f24c0da6627cd8767f4e03ada69fc1c7a9d854e6c4e7b57e4","blockSize":4194304,"blocks":["0c7d7ddb8045b91f24c0da6627cd8767f4e03ada69fc1c7a9d854e6c4e7b57e4"]},"offset":"18852468"},"join.js":{"size":693,"integrity":{"algorithm":"SHA256","hash":"cb239942f1edce736134cda6bfa017980f8875f0128f53dce90153a250d697cd","blockSize":4194304,"blocks":["cb239942f1edce736134cda6bfa017980f8875f0128f53dce90153a250d697cd"]},"offset":"18854168"},"kebabCase.js":{"size":659,"integrity":{"algorithm":"SHA256","hash":"7e093bd5a03b0c906607441750dcca616c1e40ff7315c8f399e79df6cbbdbe95","blockSize":4194304,"blocks":["7e093bd5a03b0c906607441750dcca616c1e40ff7315c8f399e79df6cbbdbe95"]},"offset":"18854861"},"keyBy.js":{"size":1194,"integrity":{"algorithm":"SHA256","hash":"d7aaad9128ee20729e7310358d6006b002d5a629488e7f86015783744fb3ab93","blockSize":4194304,"blocks":["d7aaad9128ee20729e7310358d6006b002d5a629488e7f86015783744fb3ab93"]},"offset":"18855520"},"keys.js":{"size":884,"integrity":{"algorithm":"SHA256","hash":"033c04884f93e90aef951b54dd9e70af87c3d8c284d99e21328a89dbe610a51f","blockSize":4194304,"blocks":["033c04884f93e90aef951b54dd9e70af87c3d8c284d99e21328a89dbe610a51f"]},"offset":"18856714"},"keysIn.js":{"size":778,"integrity":{"algorithm":"SHA256","hash":"da2c8ddc0b77cf749f9058d067e58a4e308ca0cc2e6a07f1673a1c991bbf3489","blockSize":4194304,"blocks":["da2c8ddc0b77cf749f9058d067e58a4e308ca0cc2e6a07f1673a1c991bbf3489"]},"offset":"18857598"},"lang.js":{"size":2137,"integrity":{"algorithm":"SHA256","hash":"7cbac7758d93e87726f50abf053bc7e1db68b13831e4c658b79ab70aff1c0d84","blockSize":4194304,"blocks":["7cbac7758d93e87726f50abf053bc7e1db68b13831e4c658b79ab70aff1c0d84"]},"offset":"18858376"},"last.js":{"size":401,"integrity":{"algorithm":"SHA256","hash":"15a736545db5a522ff57bdaa4053294b2da705063ba5324d7e7d46e0587e2cac","blockSize":4194304,"blocks":["15a736545db5a522ff57bdaa4053294b2da705063ba5324d7e7d46e0587e2cac"]},"offset":"18860513"},"lastIndexOf.js":{"size":1358,"integrity":{"algorithm":"SHA256","hash":"b30c3b00d7e36a885d33bb8367b0a1c91fa205f5e0064784fc5f10cb000bff15","blockSize":4194304,"blocks":["b30c3b00d7e36a885d33bb8367b0a1c91fa205f5e0064784fc5f10cb000bff15"]},"offset":"18860914"},"lodash.js":{"size":544098,"integrity":{"algorithm":"SHA256","hash":"4c04561befdf653aef017a42ac5addf68ea943cdfca6bdee5ce04e04e8139f54","blockSize":4194304,"blocks":["4c04561befdf653aef017a42ac5addf68ea943cdfca6bdee5ce04e04e8139f54"]},"offset":"18862272"},"lodash.min.js":{"size":73015,"integrity":{"algorithm":"SHA256","hash":"a9705dfc47c0763380d851ab1801be6f76019f6b67e40e9b873f8b4a0603f7a9","blockSize":4194304,"blocks":["a9705dfc47c0763380d851ab1801be6f76019f6b67e40e9b873f8b4a0603f7a9"]},"offset":"19406370"},"lowerCase.js":{"size":622,"integrity":{"algorithm":"SHA256","hash":"adb0f92803183e4019fb0019a1bafd72ffbd0d9ddd34c77f85a2f9a80a692f95","blockSize":4194304,"blocks":["adb0f92803183e4019fb0019a1bafd72ffbd0d9ddd34c77f85a2f9a80a692f95"]},"offset":"19479385"},"lowerFirst.js":{"size":470,"integrity":{"algorithm":"SHA256","hash":"bc619dd7b3483218c5f8dc45717ecd7f9e02af4bd1f00e4f59f99b2bea5a15cb","blockSize":4194304,"blocks":["bc619dd7b3483218c5f8dc45717ecd7f9e02af4bd1f00e4f59f99b2bea5a15cb"]},"offset":"19480007"},"lt.js":{"size":590,"integrity":{"algorithm":"SHA256","hash":"aeae52a66355a31e12139d2f6cb021cf57de125b37241053bede084a506b3d27","blockSize":4194304,"blocks":["aeae52a66355a31e12139d2f6cb021cf57de125b37241053bede084a506b3d27"]},"offset":"19480477"},"lte.js":{"size":629,"integrity":{"algorithm":"SHA256","hash":"32e7f67e212b764dd16ac6da9cec60f1b743ea29be48b658d34f43fa5ea9e8f6","blockSize":4194304,"blocks":["32e7f67e212b764dd16ac6da9cec60f1b743ea29be48b658d34f43fa5ea9e8f6"]},"offset":"19481067"},"map.js":{"size":1621,"integrity":{"algorithm":"SHA256","hash":"1aaff5a76f1fe340335ae5ae68d66bcde6596c12371554b7d3929e31bd31e3d0","blockSize":4194304,"blocks":["1aaff5a76f1fe340335ae5ae68d66bcde6596c12371554b7d3929e31bd31e3d0"]},"offset":"19481696"},"mapKeys.js":{"size":1097,"integrity":{"algorithm":"SHA256","hash":"dc9c86de1128f2a0e204cf30d720e900a1d4db54ef6af364ff20d832805a6369","blockSize":4194304,"blocks":["dc9c86de1128f2a0e204cf30d720e900a1d4db54ef6af364ff20d832805a6369"]},"offset":"19483317"},"mapValues.js":{"size":1338,"integrity":{"algorithm":"SHA256","hash":"c06cd887bace9a7af935b35fdf55e1ff9305d55e6fbc72c16b21548c54d38fc7","blockSize":4194304,"blocks":["c06cd887bace9a7af935b35fdf55e1ff9305d55e6fbc72c16b21548c54d38fc7"]},"offset":"19484414"},"matches.js":{"size":1441,"integrity":{"algorithm":"SHA256","hash":"8301a22054860637c738c889bb561bc37dfba9a8acdfbb179f20a36c7ae48230","blockSize":4194304,"blocks":["8301a22054860637c738c889bb561bc37dfba9a8acdfbb179f20a36c7ae48230"]},"offset":"19485752"},"matchesProperty.js":{"size":1454,"integrity":{"algorithm":"SHA256","hash":"000877d1b0f3d96fa96340eacd5e83109ed2166e0698a934c1ed2bd2a5d78e51","blockSize":4194304,"blocks":["000877d1b0f3d96fa96340eacd5e83109ed2166e0698a934c1ed2bd2a5d78e51"]},"offset":"19487193"},"math.js":{"size":482,"integrity":{"algorithm":"SHA256","hash":"a2f3c4cae2674e60102ea1b03bf91c29172838723bbd2e668b0612243e9b2ecf","blockSize":4194304,"blocks":["a2f3c4cae2674e60102ea1b03bf91c29172838723bbd2e668b0612243e9b2ecf"]},"offset":"19488647"},"max.js":{"size":614,"integrity":{"algorithm":"SHA256","hash":"c13073885738dd475d2dc16796b4d12746574b807ad173838dc3bc02c26498f8","blockSize":4194304,"blocks":["c13073885738dd475d2dc16796b4d12746574b807ad173838dc3bc02c26498f8"]},"offset":"19489129"},"maxBy.js":{"size":991,"integrity":{"algorithm":"SHA256","hash":"83013470e39f512f7c510078bf572aa621ce07eb8fee584bc10618002089b7a2","blockSize":4194304,"blocks":["83013470e39f512f7c510078bf572aa621ce07eb8fee584bc10618002089b7a2"]},"offset":"19489743"},"mean.js":{"size":422,"integrity":{"algorithm":"SHA256","hash":"dd24b4299489cf0c625fb1b6698ae72126f3fdb1e3d162182f356f6d3be29da5","blockSize":4194304,"blocks":["dd24b4299489cf0c625fb1b6698ae72126f3fdb1e3d162182f356f6d3be29da5"]},"offset":"19490734"},"meanBy.js":{"size":879,"integrity":{"algorithm":"SHA256","hash":"12cd765887dd356f6f61669f64deefc353b465770add03226c29afcc3780c634","blockSize":4194304,"blocks":["12cd765887dd356f6f61669f64deefc353b465770add03226c29afcc3780c634"]},"offset":"19491156"},"memoize.js":{"size":2224,"integrity":{"algorithm":"SHA256","hash":"6af4e4de786496fcaf4b12cd894c1da8306752b9703d72d1e4f26ba5911a6bd6","blockSize":4194304,"blocks":["6af4e4de786496fcaf4b12cd894c1da8306752b9703d72d1e4f26ba5911a6bd6"]},"offset":"19492035"},"merge.js":{"size":1220,"integrity":{"algorithm":"SHA256","hash":"ef4315ccc54f92d79c85e4a38d3a5c869bace124444c3f0c0d6f03e722e5a5ce","blockSize":4194304,"blocks":["ef4315ccc54f92d79c85e4a38d3a5c869bace124444c3f0c0d6f03e722e5a5ce"]},"offset":"19494259"},"mergeWith.js":{"size":1247,"integrity":{"algorithm":"SHA256","hash":"9b6b57a95baa3f93bb1853594d51ef64d20327de4b8bf58e9c7d1a68d6d7e564","blockSize":4194304,"blocks":["9b6b57a95baa3f93bb1853594d51ef64d20327de4b8bf58e9c7d1a68d6d7e564"]},"offset":"19495479"},"method.js":{"size":860,"integrity":{"algorithm":"SHA256","hash":"e79016298f394b54126ecea31581cf921f00043ae9ac9896bd98daa64afaa0cc","blockSize":4194304,"blocks":["e79016298f394b54126ecea31581cf921f00043ae9ac9896bd98daa64afaa0cc"]},"offset":"19496726"},"methodOf.js":{"size":912,"integrity":{"algorithm":"SHA256","hash":"e8f0a121e046ea54577951025d2bff430b12db1ae3de19bce5a41ace8ab2b21a","blockSize":4194304,"blocks":["e8f0a121e046ea54577951025d2bff430b12db1ae3de19bce5a41ace8ab2b21a"]},"offset":"19497586"},"min.js":{"size":614,"integrity":{"algorithm":"SHA256","hash":"1f4ab3cde3a13dd942073c3356ddec332980261f95e6250a15e9ebe8343472bb","blockSize":4194304,"blocks":["1f4ab3cde3a13dd942073c3356ddec332980261f95e6250a15e9ebe8343472bb"]},"offset":"19498498"},"minBy.js":{"size":991,"integrity":{"algorithm":"SHA256","hash":"e7675bc6c35b3f0a5e1dc1b6588dc002dcf58b3a00c75ba9b1a6891b5ddf54c2","blockSize":4194304,"blocks":["e7675bc6c35b3f0a5e1dc1b6588dc002dcf58b3a00c75ba9b1a6891b5ddf54c2"]},"offset":"19499112"},"mixin.js":{"size":2236,"integrity":{"algorithm":"SHA256","hash":"eae8a9934d32432b5b41380d597911a1c88aeb5e51592ab27e9a1df4948502be","blockSize":4194304,"blocks":["eae8a9934d32432b5b41380d597911a1c88aeb5e51592ab27e9a1df4948502be"]},"offset":"19500103"},"multiply.js":{"size":530,"integrity":{"algorithm":"SHA256","hash":"0d4009bb72441268d9fce8b2ba11ab5a933dd7e0bb79996a9c4df72aa7327e99","blockSize":4194304,"blocks":["0d4009bb72441268d9fce8b2ba11ab5a933dd7e0bb79996a9c4df72aa7327e99"]},"offset":"19502339"},"negate.js":{"size":1079,"integrity":{"algorithm":"SHA256","hash":"e234ddf39ad6ddffe5bcaea254f1ebd2b672114ffe5f3fc96dbb2abdc5214fc1","blockSize":4194304,"blocks":["e234ddf39ad6ddffe5bcaea254f1ebd2b672114ffe5f3fc96dbb2abdc5214fc1"]},"offset":"19502869"},"next.js":{"size":836,"integrity":{"algorithm":"SHA256","hash":"b733c8b62de5f90d3ad09fd8f65ea1ead0cd2858f0af2ba210b51d789ecb8baf","blockSize":4194304,"blocks":["b733c8b62de5f90d3ad09fd8f65ea1ead0cd2858f0af2ba210b51d789ecb8baf"]},"offset":"19503948"},"noop.js":{"size":250,"integrity":{"algorithm":"SHA256","hash":"38a62a2c9c6f2ad54bc6a49c38dcb43dcf1907e8bdbb63b4f2129267eac82953","blockSize":4194304,"blocks":["38a62a2c9c6f2ad54bc6a49c38dcb43dcf1907e8bdbb63b4f2129267eac82953"]},"offset":"19504784"},"now.js":{"size":520,"integrity":{"algorithm":"SHA256","hash":"0fa7d3abe4c87475532e995366408a373eae9b82b49590a0a6f3d87dbdc08759","blockSize":4194304,"blocks":["0fa7d3abe4c87475532e995366408a373eae9b82b49590a0a6f3d87dbdc08759"]},"offset":"19505034"},"nth.js":{"size":671,"integrity":{"algorithm":"SHA256","hash":"667858f0346927588f8a09469b8999e74e236c7569c4d8f46e772ed7d391ab8d","blockSize":4194304,"blocks":["667858f0346927588f8a09469b8999e74e236c7569c4d8f46e772ed7d391ab8d"]},"offset":"19505554"},"nthArg.js":{"size":730,"integrity":{"algorithm":"SHA256","hash":"01b64f63f3aba6ba003fd2ece4af4b65ccb06a4f64f872cbb5a16385c1c813a6","blockSize":4194304,"blocks":["01b64f63f3aba6ba003fd2ece4af4b65ccb06a4f64f872cbb5a16385c1c813a6"]},"offset":"19506225"},"number.js":{"size":120,"integrity":{"algorithm":"SHA256","hash":"bd31ee4764fcb88bb64b6c7d6f76fe5f9a28917cab99af905e8baf89f72e58c3","blockSize":4194304,"blocks":["bd31ee4764fcb88bb64b6c7d6f76fe5f9a28917cab99af905e8baf89f72e58c3"]},"offset":"19506955"},"object.js":{"size":1674,"integrity":{"algorithm":"SHA256","hash":"9bb1f3297bcce8b2154af10bdd94fe317016c97645c9c732927a26851e599c5b","blockSize":4194304,"blocks":["9bb1f3297bcce8b2154af10bdd94fe317016c97645c9c732927a26851e599c5b"]},"offset":"19507075"},"omit.js":{"size":1629,"integrity":{"algorithm":"SHA256","hash":"111f0b5aff4899bd17d7087b6fe73b14ac2ecc078bb47dc98a9a77316bfbc8ab","blockSize":4194304,"blocks":["111f0b5aff4899bd17d7087b6fe73b14ac2ecc078bb47dc98a9a77316bfbc8ab"]},"offset":"19508749"},"omitBy.js":{"size":854,"integrity":{"algorithm":"SHA256","hash":"21562397eee9288f5a388f22104ab01bb67c6603ec2a65a4f19a91aad244be70","blockSize":4194304,"blocks":["21562397eee9288f5a388f22104ab01bb67c6603ec2a65a4f19a91aad244be70"]},"offset":"19510378"},"once.js":{"size":665,"integrity":{"algorithm":"SHA256","hash":"fb43a280b25abd87bfe71a49e89fc93aa04f3aaf5aef5bb6b5496f969c3b7e3e","blockSize":4194304,"blocks":["fb43a280b25abd87bfe71a49e89fc93aa04f3aaf5aef5bb6b5496f969c3b7e3e"]},"offset":"19511232"},"orderBy.js":{"size":1620,"integrity":{"algorithm":"SHA256","hash":"0d2d6dd259a70e40b806f82f6b82c5defcc7b5a7b21810d4a483ae8f61b52962","blockSize":4194304,"blocks":["0d2d6dd259a70e40b806f82f6b82c5defcc7b5a7b21810d4a483ae8f61b52962"]},"offset":"19511897"},"over.js":{"size":558,"integrity":{"algorithm":"SHA256","hash":"b5f9bac716ff835fc8cd72641e1403c9a2035e3447033bf406b019c5a90b0311","blockSize":4194304,"blocks":["b5f9bac716ff835fc8cd72641e1403c9a2035e3447033bf406b019c5a90b0311"]},"offset":"19513517"},"overArgs.js":{"size":1620,"integrity":{"algorithm":"SHA256","hash":"c0a23b3547dba9c60a5957310f6194756ac525cf472c384383c76af786cced74","blockSize":4194304,"blocks":["c0a23b3547dba9c60a5957310f6194756ac525cf472c384383c76af786cced74"]},"offset":"19514075"},"overEvery.js":{"size":920,"integrity":{"algorithm":"SHA256","hash":"d21d782cad2c1cfa1015d4d3d6a58944f1d3f6e86a9a03d87ec85859b9e7f039","blockSize":4194304,"blocks":["d21d782cad2c1cfa1015d4d3d6a58944f1d3f6e86a9a03d87ec85859b9e7f039"]},"offset":"19515695"},"overSome.js":{"size":1036,"integrity":{"algorithm":"SHA256","hash":"9381b722d9066d3337b7e4fe7fd88f2ce856463610af6935a2a4bdcaada908bc","blockSize":4194304,"blocks":["9381b722d9066d3337b7e4fe7fd88f2ce856463610af6935a2a4bdcaada908bc"]},"offset":"19516615"},"package.json":{"size":309,"integrity":{"algorithm":"SHA256","hash":"e161f6b7a638b53a45bd32be5bf632fdba77df2339b11b3c0422df27af855fe4","blockSize":4194304,"blocks":["e161f6b7a638b53a45bd32be5bf632fdba77df2339b11b3c0422df27af855fe4"]},"offset":"19517651"},"pad.js":{"size":1289,"integrity":{"algorithm":"SHA256","hash":"cf3211fb74dcaa480d3e3926bc9b83183cb6445a9012036c058d2213d282fcf9","blockSize":4194304,"blocks":["cf3211fb74dcaa480d3e3926bc9b83183cb6445a9012036c058d2213d282fcf9"]},"offset":"19517960"},"padEnd.js":{"size":1017,"integrity":{"algorithm":"SHA256","hash":"f1176d0c0a8081cd291ca698f969a15b3a218712070d034ae0095309fe062af9","blockSize":4194304,"blocks":["f1176d0c0a8081cd291ca698f969a15b3a218712070d034ae0095309fe062af9"]},"offset":"19519249"},"padStart.js":{"size":1026,"integrity":{"algorithm":"SHA256","hash":"31d4ae76fc00b58c632e9cd7fa888acf9c4b94d09ad77837b682d33fee57e8b2","blockSize":4194304,"blocks":["31d4ae76fc00b58c632e9cd7fa888acf9c4b94d09ad77837b682d33fee57e8b2"]},"offset":"19520266"},"parseInt.js":{"size":1256,"integrity":{"algorithm":"SHA256","hash":"947eae4b5773c2df1900ade13faea9f1e0ca1a034377c60535599b31bdd28e82","blockSize":4194304,"blocks":["947eae4b5773c2df1900ade13faea9f1e0ca1a034377c60535599b31bdd28e82"]},"offset":"19521292"},"partial.js":{"size":1566,"integrity":{"algorithm":"SHA256","hash":"fcb93b458dd2ccca965bb9097b82f98e773a32854aab9a1b0707951fb579ea28","blockSize":4194304,"blocks":["fcb93b458dd2ccca965bb9097b82f98e773a32854aab9a1b0707951fb579ea28"]},"offset":"19522548"},"partialRight.js":{"size":1552,"integrity":{"algorithm":"SHA256","hash":"991efe2459c0484db4ab4243d978be7ce464756a3ceb680702ec37107688d014","blockSize":4194304,"blocks":["991efe2459c0484db4ab4243d978be7ce464756a3ceb680702ec37107688d014"]},"offset":"19524114"},"partition.js":{"size":1518,"integrity":{"algorithm":"SHA256","hash":"25e2fa2769d0c1f46f462aa42cd4e19684cfea908dfc5e14071cae6871d2e879","blockSize":4194304,"blocks":["25e2fa2769d0c1f46f462aa42cd4e19684cfea908dfc5e14071cae6871d2e879"]},"offset":"19525666"},"pick.js":{"size":629,"integrity":{"algorithm":"SHA256","hash":"4cbba29a3f7b8c0eeeff73492436cd887137c61d86a534dd6ab0ed1d074eb32d","blockSize":4194304,"blocks":["4cbba29a3f7b8c0eeeff73492436cd887137c61d86a534dd6ab0ed1d074eb32d"]},"offset":"19527184"},"pickBy.js":{"size":1032,"integrity":{"algorithm":"SHA256","hash":"bc1e0e1d9a64274fb842f1c8535947a4854d76c75d46c05614b6fb4d9b8b3c52","blockSize":4194304,"blocks":["bc1e0e1d9a64274fb842f1c8535947a4854d76c75d46c05614b6fb4d9b8b3c52"]},"offset":"19527813"},"plant.js":{"size":1016,"integrity":{"algorithm":"SHA256","hash":"deff3ef01920380262562edb16762044e5bb9d871a06c44c9d5a856e37d73936","blockSize":4194304,"blocks":["deff3ef01920380262562edb16762044e5bb9d871a06c44c9d5a856e37d73936"]},"offset":"19528845"},"property.js":{"size":793,"integrity":{"algorithm":"SHA256","hash":"da125f69db505ccfd4dcd6d6a7319144fb8b51641c6ee05482e6d8cb6ac6f4b6","blockSize":4194304,"blocks":["da125f69db505ccfd4dcd6d6a7319144fb8b51641c6ee05482e6d8cb6ac6f4b6"]},"offset":"19529861"},"propertyOf.js":{"size":732,"integrity":{"algorithm":"SHA256","hash":"0b7a5a0e2670d0f96c40994e4cfd50a524deb9c3ca5d7484c644643bebe52b4a","blockSize":4194304,"blocks":["0b7a5a0e2670d0f96c40994e4cfd50a524deb9c3ca5d7484c644643bebe52b4a"]},"offset":"19530654"},"pull.js":{"size":758,"integrity":{"algorithm":"SHA256","hash":"c8301fc8781d06564c6b581257b1d37fef2ef72f5fde278ca7600812bdfc6c9d","blockSize":4194304,"blocks":["c8301fc8781d06564c6b581257b1d37fef2ef72f5fde278ca7600812bdfc6c9d"]},"offset":"19531386"},"pullAll.js":{"size":710,"integrity":{"algorithm":"SHA256","hash":"f8a32f19d1d7f18e1d435f0d19b22ca2dfa540d155879983a12adaf64d654948","blockSize":4194304,"blocks":["f8a32f19d1d7f18e1d435f0d19b22ca2dfa540d155879983a12adaf64d654948"]},"offset":"19532144"},"pullAllBy.js":{"size":1071,"integrity":{"algorithm":"SHA256","hash":"07ce2a0cb52532b7b24d6174295735a6f91140e888268e5d3628144bcb2842bf","blockSize":4194304,"blocks":["07ce2a0cb52532b7b24d6174295735a6f91140e888268e5d3628144bcb2842bf"]},"offset":"19532854"},"pullAllWith.js":{"size":1029,"integrity":{"algorithm":"SHA256","hash":"6c67efa1da58a9da803b77ea276ec10e1ba9cbdb74794b0905aae7e431d0fec2","blockSize":4194304,"blocks":["6c67efa1da58a9da803b77ea276ec10e1ba9cbdb74794b0905aae7e431d0fec2"]},"offset":"19533925"},"pullAt.js":{"size":1182,"integrity":{"algorithm":"SHA256","hash":"bee596c05053f069c9bf52a6764051185c87a72b9843a8e19ec96639942e884b","blockSize":4194304,"blocks":["bee596c05053f069c9bf52a6764051185c87a72b9843a8e19ec96639942e884b"]},"offset":"19534954"},"random.js":{"size":2371,"integrity":{"algorithm":"SHA256","hash":"94d723f1fe64d7ff6e8e830122eea5ce33bed70378aa9a26bd8e47fea48a7965","blockSize":4194304,"blocks":["94d723f1fe64d7ff6e8e830122eea5ce33bed70378aa9a26bd8e47fea48a7965"]},"offset":"19536136"},"range.js":{"size":1151,"integrity":{"algorithm":"SHA256","hash":"5f4525258aa1cf817a982f7bcd47f5444d339e42460e225d238f59e276db6e02","blockSize":4194304,"blocks":["5f4525258aa1cf817a982f7bcd47f5444d339e42460e225d238f59e276db6e02"]},"offset":"19538507"},"rangeRight.js":{"size":862,"integrity":{"algorithm":"SHA256","hash":"d369e69ebbf5a8c3c76995810cfb0ff158375646519544df218e155f4475139f","blockSize":4194304,"blocks":["d369e69ebbf5a8c3c76995810cfb0ff158375646519544df218e155f4475139f"]},"offset":"19539658"},"rearg.js":{"size":1023,"integrity":{"algorithm":"SHA256","hash":"79b9c1b5811ea1d6be75314cc99f5bfb1791548e10d3d01a7e0163c34423140d","blockSize":4194304,"blocks":["79b9c1b5811ea1d6be75314cc99f5bfb1791548e10d3d01a7e0163c34423140d"]},"offset":"19540520"},"reduce.js":{"size":1806,"integrity":{"algorithm":"SHA256","hash":"c1167b4759d69ccd38eb80c8913c883417398ebd0006ea0db5e0ba347fb9c9fb","blockSize":4194304,"blocks":["c1167b4759d69ccd38eb80c8913c883417398ebd0006ea0db5e0ba347fb9c9fb"]},"offset":"19541543"},"reduceRight.js":{"size":1156,"integrity":{"algorithm":"SHA256","hash":"d05f636c91bc618e4fd973c28b42bd4973bd462ac527edb3bc906bc5181b91da","blockSize":4194304,"blocks":["d05f636c91bc618e4fd973c28b42bd4973bd462ac527edb3bc906bc5181b91da"]},"offset":"19543349"},"reject.js":{"size":1417,"integrity":{"algorithm":"SHA256","hash":"e56b30e3aea9f9c23df5e9836909e2a3fd03536a13915f325796aee34240087d","blockSize":4194304,"blocks":["e56b30e3aea9f9c23df5e9836909e2a3fd03536a13915f325796aee34240087d"]},"offset":"19544505"},"release.md":{"size":2035,"integrity":{"algorithm":"SHA256","hash":"e1e25b114bed9c23cdbc35f3bd626e11e55205c1cbda3be29cd495d5f68eec36","blockSize":4194304,"blocks":["e1e25b114bed9c23cdbc35f3bd626e11e55205c1cbda3be29cd495d5f68eec36"]},"offset":"19545922"},"remove.js":{"size":1332,"integrity":{"algorithm":"SHA256","hash":"2435d4d1f044454c267ae81c9022b558f5715e7948e47ecff8f3aed7a25fe06d","blockSize":4194304,"blocks":["2435d4d1f044454c267ae81c9022b558f5715e7948e47ecff8f3aed7a25fe06d"]},"offset":"19547957"},"repeat.js":{"size":893,"integrity":{"algorithm":"SHA256","hash":"ee99cd2c68eb39e317dd639e2ed9b823fa23e0df6da76bfe1c1b197b426e65ca","blockSize":4194304,"blocks":["ee99cd2c68eb39e317dd639e2ed9b823fa23e0df6da76bfe1c1b197b426e65ca"]},"offset":"19549289"},"replace.js":{"size":754,"integrity":{"algorithm":"SHA256","hash":"008cf42308400e8ef434dba25c1803d5611b887948e4664ef986cdc7d7e481ad","blockSize":4194304,"blocks":["008cf42308400e8ef434dba25c1803d5611b887948e4664ef986cdc7d7e481ad"]},"offset":"19550182"},"rest.js":{"size":1182,"integrity":{"algorithm":"SHA256","hash":"79ca7e2ca5e995494427ea9eeaee425fc00aadf22010458f97c5ef045a0d6db2","blockSize":4194304,"blocks":["79ca7e2ca5e995494427ea9eeaee425fc00aadf22010458f97c5ef045a0d6db2"]},"offset":"19550936"},"result.js":{"size":1464,"integrity":{"algorithm":"SHA256","hash":"a74a0012595ae8f8436133e014c0a88996bcce9daf9c05a8073bb83018229987","blockSize":4194304,"blocks":["a74a0012595ae8f8436133e014c0a88996bcce9daf9c05a8073bb83018229987"]},"offset":"19552118"},"reverse.js":{"size":844,"integrity":{"algorithm":"SHA256","hash":"74932b47ecbb57a169957934b3e60b0d2674dc7c7c3d47724d2fc718c7cc8835","blockSize":4194304,"blocks":["74932b47ecbb57a169957934b3e60b0d2674dc7c7c3d47724d2fc718c7cc8835"]},"offset":"19553582"},"round.js":{"size":501,"integrity":{"algorithm":"SHA256","hash":"e2a1fdb818cc95091e07eb7ab39e6d4225da060a8835434a405fa0b71ac6a6a5","blockSize":4194304,"blocks":["e2a1fdb818cc95091e07eb7ab39e6d4225da060a8835434a405fa0b71ac6a6a5"]},"offset":"19554426"},"sample.js":{"size":551,"integrity":{"algorithm":"SHA256","hash":"c18724427d723e8ce6f8b30842f319dd888e00ce3abafa4269f2c2426d1235ee","blockSize":4194304,"blocks":["c18724427d723e8ce6f8b30842f319dd888e00ce3abafa4269f2c2426d1235ee"]},"offset":"19554927"},"sampleSize.js":{"size":1068,"integrity":{"algorithm":"SHA256","hash":"4ef5c7d375489169be1a95d136e8149a2a064e1c08be3c6ec8c80e486a385f6d","blockSize":4194304,"blocks":["4ef5c7d375489169be1a95d136e8149a2a064e1c08be3c6ec8c80e486a385f6d"]},"offset":"19555478"},"seq.js":{"size":507,"integrity":{"algorithm":"SHA256","hash":"dab0db546b218008352e4887d5669995b8484ea197e358a7edd233df34562c81","blockSize":4194304,"blocks":["dab0db546b218008352e4887d5669995b8484ea197e358a7edd233df34562c81"]},"offset":"19556546"},"set.js":{"size":960,"integrity":{"algorithm":"SHA256","hash":"7d360792369713f3b681afefb072820e8f65ff6a33b54be5f54eca09877c60a7","blockSize":4194304,"blocks":["7d360792369713f3b681afefb072820e8f65ff6a33b54be5f54eca09877c60a7"]},"offset":"19557053"},"setWith.js":{"size":1055,"integrity":{"algorithm":"SHA256","hash":"67b49eecee29813be6f16a9662ad3d6bd8f1ffed0e06e1a1647b6c1d259fcbcd","blockSize":4194304,"blocks":["67b49eecee29813be6f16a9662ad3d6bd8f1ffed0e06e1a1647b6c1d259fcbcd"]},"offset":"19558013"},"shuffle.js":{"size":678,"integrity":{"algorithm":"SHA256","hash":"9404bfe3f70e2efd6a0c1f126d15a2b49f0d6afc26a9a3dd953f451c3cb2334d","blockSize":4194304,"blocks":["9404bfe3f70e2efd6a0c1f126d15a2b49f0d6afc26a9a3dd953f451c3cb2334d"]},"offset":"19559068"},"size.js":{"size":1137,"integrity":{"algorithm":"SHA256","hash":"f364a213efbd423be9914f35913e4d9a4b19b35a6a63f2e8043ba99b2dbd447d","blockSize":4194304,"blocks":["f364a213efbd423be9914f35913e4d9a4b19b35a6a63f2e8043ba99b2dbd447d"]},"offset":"19559746"},"slice.js":{"size":1032,"integrity":{"algorithm":"SHA256","hash":"63af5e62744d8ba612c34f6a63135db37084aa8a8cd24ae3d5c9b359b6d9a709","blockSize":4194304,"blocks":["63af5e62744d8ba612c34f6a63135db37084aa8a8cd24ae3d5c9b359b6d9a709"]},"offset":"19560883"},"snakeCase.js":{"size":638,"integrity":{"algorithm":"SHA256","hash":"eb1c8f66dfcadca552e957e9dfce3bf40a8d3ee06a0fd33873f4109374aae87c","blockSize":4194304,"blocks":["eb1c8f66dfcadca552e957e9dfce3bf40a8d3ee06a0fd33873f4109374aae87c"]},"offset":"19561915"},"some.js":{"size":1608,"integrity":{"algorithm":"SHA256","hash":"a394760d37b72f47d6b41ca817a34a8e9db46051d9edc45ea6af499f94ba4b7b","blockSize":4194304,"blocks":["a394760d37b72f47d6b41ca817a34a8e9db46051d9edc45ea6af499f94ba4b7b"]},"offset":"19562553"},"sortBy.js":{"size":1668,"integrity":{"algorithm":"SHA256","hash":"5a8cbdda6b42431dfdb9c3601937826452a74aad5525a952ff0e04ac420ec26f","blockSize":4194304,"blocks":["5a8cbdda6b42431dfdb9c3601937826452a74aad5525a952ff0e04ac420ec26f"]},"offset":"19564161"},"sortedIndex.js":{"size":626,"integrity":{"algorithm":"SHA256","hash":"981d37d31ba52cac8ee891ad979708574fe53fd7acec38820f66b82916986cfc","blockSize":4194304,"blocks":["981d37d31ba52cac8ee891ad979708574fe53fd7acec38820f66b82916986cfc"]},"offset":"19565829"},"sortedIndexBy.js":{"size":1060,"integrity":{"algorithm":"SHA256","hash":"ba3e1b9a9962fa01a81c38a0990f3ac24fa35bdbc7e0ee14fcda3bb0107c3ab9","blockSize":4194304,"blocks":["ba3e1b9a9962fa01a81c38a0990f3ac24fa35bdbc7e0ee14fcda3bb0107c3ab9"]},"offset":"19566455"},"sortedIndexOf.js":{"size":762,"integrity":{"algorithm":"SHA256","hash":"691b81b8a5c61d8b3675e5974fc46fad3791369e638ebf0ba735f4193ed9055a","blockSize":4194304,"blocks":["691b81b8a5c61d8b3675e5974fc46fad3791369e638ebf0ba735f4193ed9055a"]},"offset":"19567515"},"sortedLastIndex.js":{"size":679,"integrity":{"algorithm":"SHA256","hash":"31a10902c20e65ab63869587d18ffa300a3f4f3ddf46051ec6f9df82ffeafa0f","blockSize":4194304,"blocks":["31a10902c20e65ab63869587d18ffa300a3f4f3ddf46051ec6f9df82ffeafa0f"]},"offset":"19568277"},"sortedLastIndexBy.js":{"size":1086,"integrity":{"algorithm":"SHA256","hash":"a4023ca1c6ea8042e34844fdbb823d3748c22a56271cfe08717265293c75b040","blockSize":4194304,"blocks":["a4023ca1c6ea8042e34844fdbb823d3748c22a56271cfe08717265293c75b040"]},"offset":"19568956"},"sortedLastIndexOf.js":{"size":770,"integrity":{"algorithm":"SHA256","hash":"bf039101776c42209d49dc4d6aa71766f6379b649570cbe1820a8665bbd2697f","blockSize":4194304,"blocks":["bf039101776c42209d49dc4d6aa71766f6379b649570cbe1820a8665bbd2697f"]},"offset":"19570042"},"sortedUniq.js":{"size":513,"integrity":{"algorithm":"SHA256","hash":"7703c411b9007aadde4b059ed06a62c9c0ea8c0ce2727f355a9c50070b4ebd33","blockSize":4194304,"blocks":["7703c411b9007aadde4b059ed06a62c9c0ea8c0ce2727f355a9c50070b4ebd33"]},"offset":"19570812"},"sortedUniqBy.js":{"size":698,"integrity":{"algorithm":"SHA256","hash":"8d531a82e2bd8150e5e50b7e2237fcef5163fd4ee63919ec3b1aca73b2420d9e","blockSize":4194304,"blocks":["8d531a82e2bd8150e5e50b7e2237fcef5163fd4ee63919ec3b1aca73b2420d9e"]},"offset":"19571325"},"split.js":{"size":1550,"integrity":{"algorithm":"SHA256","hash":"9ddd17c2b6f10fcae28e91b8e8448ec8e5a8d97e3b4c8c005fc6d684060b8926","blockSize":4194304,"blocks":["9ddd17c2b6f10fcae28e91b8e8448ec8e5a8d97e3b4c8c005fc6d684060b8926"]},"offset":"19572023"},"spread.js":{"size":1734,"integrity":{"algorithm":"SHA256","hash":"73d5b51a697642c4a8a855d06d337473ad15be8f2039287587ccdf760628531d","blockSize":4194304,"blocks":["73d5b51a697642c4a8a855d06d337473ad15be8f2039287587ccdf760628531d"]},"offset":"19573573"},"startCase.js":{"size":714,"integrity":{"algorithm":"SHA256","hash":"108cd495196f72d90a5fd94044456cf5a2761f0516923bdeb76740d00db42d22","blockSize":4194304,"blocks":["108cd495196f72d90a5fd94044456cf5a2761f0516923bdeb76740d00db42d22"]},"offset":"19575307"},"startsWith.js":{"size":1017,"integrity":{"algorithm":"SHA256","hash":"5d9a4b6bb06a1720fa1e97eb9e59a942e52ec2201da91f0ff24c5a68276face0","blockSize":4194304,"blocks":["5d9a4b6bb06a1720fa1e97eb9e59a942e52ec2201da91f0ff24c5a68276face0"]},"offset":"19576021"},"string.js":{"size":1168,"integrity":{"algorithm":"SHA256","hash":"636bf39182438c55ffff385e677cc705cdef460199b4c509fc9b9acaa56c4925","blockSize":4194304,"blocks":["636bf39182438c55ffff385e677cc705cdef460199b4c509fc9b9acaa56c4925"]},"offset":"19577038"},"stubArray.js":{"size":390,"integrity":{"algorithm":"SHA256","hash":"86957766d1bc7426012c406dd17a928f542c6dc761d49abfb166c476e00ba32f","blockSize":4194304,"blocks":["86957766d1bc7426012c406dd17a928f542c6dc761d49abfb166c476e00ba32f"]},"offset":"19578206"},"stubFalse.js":{"size":280,"integrity":{"algorithm":"SHA256","hash":"6ec347f5c68c5ebecf76df2bb8526dcbbbae3f61ea08349687264ce930a518c1","blockSize":4194304,"blocks":["6ec347f5c68c5ebecf76df2bb8526dcbbbae3f61ea08349687264ce930a518c1"]},"offset":"19578596"},"stubObject.js":{"size":400,"integrity":{"algorithm":"SHA256","hash":"4362303459fd4a044cae04bc4db25225e3f17010b5bddd7f5e9b387b52671072","blockSize":4194304,"blocks":["4362303459fd4a044cae04bc4db25225e3f17010b5bddd7f5e9b387b52671072"]},"offset":"19578876"},"stubString.js":{"size":290,"integrity":{"algorithm":"SHA256","hash":"8282be93d33c10a1472c029c96bf15fefbe4b20bc7056e871f43808079356f0e","blockSize":4194304,"blocks":["8282be93d33c10a1472c029c96bf15fefbe4b20bc7056e871f43808079356f0e"]},"offset":"19579276"},"stubTrue.js":{"size":272,"integrity":{"algorithm":"SHA256","hash":"91ae183af950f90b7cca8482ba7cb6c3bebd3d544d98440da1c6a74de7a209ce","blockSize":4194304,"blocks":["91ae183af950f90b7cca8482ba7cb6c3bebd3d544d98440da1c6a74de7a209ce"]},"offset":"19579566"},"subtract.js":{"size":511,"integrity":{"algorithm":"SHA256","hash":"c323ae7cfd52cbc647839d393b69b8ebb7a040e0563270520056d0504b9f0ca1","blockSize":4194304,"blocks":["c323ae7cfd52cbc647839d393b69b8ebb7a040e0563270520056d0504b9f0ca1"]},"offset":"19579838"},"sum.js":{"size":453,"integrity":{"algorithm":"SHA256","hash":"6fe92f7eb7e0213305122ecf35e2e8ffdf0e7aa8e77a5ab2119323d16396da02","blockSize":4194304,"blocks":["6fe92f7eb7e0213305122ecf35e2e8ffdf0e7aa8e77a5ab2119323d16396da02"]},"offset":"19580349"},"sumBy.js":{"size":908,"integrity":{"algorithm":"SHA256","hash":"2737e36d3fe6bfb8005bdf4ab6a110ede4e893f2f4436cbd05238207cb281fed","blockSize":4194304,"blocks":["2737e36d3fe6bfb8005bdf4ab6a110ede4e893f2f4436cbd05238207cb281fed"]},"offset":"19580802"},"tail.js":{"size":457,"integrity":{"algorithm":"SHA256","hash":"47aa7bdfe769f6c51d1345eaf5be9767805717d3c53e6bd28fc6311b2c5aacc9","blockSize":4194304,"blocks":["47aa7bdfe769f6c51d1345eaf5be9767805717d3c53e6bd28fc6311b2c5aacc9"]},"offset":"19581710"},"take.js":{"size":851,"integrity":{"algorithm":"SHA256","hash":"36a865b57bdf76fa019b17befbb168d142cb4845a1e112dd8b7378f3100d68a4","blockSize":4194304,"blocks":["36a865b57bdf76fa019b17befbb168d142cb4845a1e112dd8b7378f3100d68a4"]},"offset":"19582167"},"takeRight.js":{"size":930,"integrity":{"algorithm":"SHA256","hash":"e82c0b9b868d9cd082f8a4af0c3c7b94de3bcbbda83f7aa333972018bf7f9589","blockSize":4194304,"blocks":["e82c0b9b868d9cd082f8a4af0c3c7b94de3bcbbda83f7aa333972018bf7f9589"]},"offset":"19583018"},"takeRightWhile.js":{"size":1376,"integrity":{"algorithm":"SHA256","hash":"26588a91112800e0ea1f64da8403997be219631c230149859f654e29f8e1819a","blockSize":4194304,"blocks":["26588a91112800e0ea1f64da8403997be219631c230149859f654e29f8e1819a"]},"offset":"19583948"},"takeWhile.js":{"size":1335,"integrity":{"algorithm":"SHA256","hash":"3d2f50d3988a18345b8b369ba73c15c10a4fab70d1875ad5d8d8e4b38a634435","blockSize":4194304,"blocks":["3d2f50d3988a18345b8b369ba73c15c10a4fab70d1875ad5d8d8e4b38a634435"]},"offset":"19585324"},"tap.js":{"size":703,"integrity":{"algorithm":"SHA256","hash":"aa820de8409133b7653431dfbbcadbca04269cfae8af8df6c0da82a3d556deec","blockSize":4194304,"blocks":["aa820de8409133b7653431dfbbcadbca04269cfae8af8df6c0da82a3d556deec"]},"offset":"19586659"},"template.js":{"size":10441,"integrity":{"algorithm":"SHA256","hash":"edbf787035abfd38c36f32d078f02e1323cbb2a4c27e4bebef78563d05d178de","blockSize":4194304,"blocks":["edbf787035abfd38c36f32d078f02e1323cbb2a4c27e4bebef78563d05d178de"]},"offset":"19587362"},"templateSettings.js":{"size":1411,"integrity":{"algorithm":"SHA256","hash":"fa78884650cf0b222f215c1d8cc9caf4d871c2c84daa496521f6ed9cb103213b","blockSize":4194304,"blocks":["fa78884650cf0b222f215c1d8cc9caf4d871c2c84daa496521f6ed9cb103213b"]},"offset":"19597803"},"throttle.js":{"size":2709,"integrity":{"algorithm":"SHA256","hash":"8e7dea8e64d60711dbe02ccd5b6836ddda9befd58b6c5afe8e781aad1a9c999f","blockSize":4194304,"blocks":["8e7dea8e64d60711dbe02ccd5b6836ddda9befd58b6c5afe8e781aad1a9c999f"]},"offset":"19599214"},"thru.js":{"size":674,"integrity":{"algorithm":"SHA256","hash":"479ae3e185f7daceee159faa1d786cbca09d07c376e11c3547f498029ea92c05","blockSize":4194304,"blocks":["479ae3e185f7daceee159faa1d786cbca09d07c376e11c3547f498029ea92c05"]},"offset":"19601923"},"times.js":{"size":1367,"integrity":{"algorithm":"SHA256","hash":"7e689f391f3c044251f47962524e5c5aa9c5571ee386c2a361d8f4fe8423639a","blockSize":4194304,"blocks":["7e689f391f3c044251f47962524e5c5aa9c5571ee386c2a361d8f4fe8423639a"]},"offset":"19602597"},"toArray.js":{"size":1406,"integrity":{"algorithm":"SHA256","hash":"fc48c33556d90668af1c08d97160af98b72496835722ed1cd59e92b65043908d","blockSize":4194304,"blocks":["fc48c33556d90668af1c08d97160af98b72496835722ed1cd59e92b65043908d"]},"offset":"19603964"},"toFinite.js":{"size":868,"integrity":{"algorithm":"SHA256","hash":"a3a9eec40b0e823be3e0b77dc43a4e9f9bf9e17417af7bfaed05ee8edb81ca17","blockSize":4194304,"blocks":["a3a9eec40b0e823be3e0b77dc43a4e9f9bf9e17417af7bfaed05ee8edb81ca17"]},"offset":"19605370"},"toInteger.js":{"size":760,"integrity":{"algorithm":"SHA256","hash":"da79a1f3d3be300e26a6fda4a45a67adc91411525645f527fea622b2d4ac56e4","blockSize":4194304,"blocks":["da79a1f3d3be300e26a6fda4a45a67adc91411525645f527fea622b2d4ac56e4"]},"offset":"19606238"},"toIterator.js":{"size":403,"integrity":{"algorithm":"SHA256","hash":"28ffca1413353335451c4188cf5189439501e861f4b33a311f34dd87f47275e6","blockSize":4194304,"blocks":["28ffca1413353335451c4188cf5189439501e861f4b33a311f34dd87f47275e6"]},"offset":"19606998"},"toJSON.js":{"size":44,"integrity":{"algorithm":"SHA256","hash":"469f0f647beaf4eeca8d316133bcd0a0b3f5e55a4c1a391da1f10baba824ca9d","blockSize":4194304,"blocks":["469f0f647beaf4eeca8d316133bcd0a0b3f5e55a4c1a391da1f10baba824ca9d"]},"offset":"19607401"},"toLength.js":{"size":868,"integrity":{"algorithm":"SHA256","hash":"059994a6c98eb0e9ee6a565d00667e2068c0728bf2bf89994e06fcb13593f3d0","blockSize":4194304,"blocks":["059994a6c98eb0e9ee6a565d00667e2068c0728bf2bf89994e06fcb13593f3d0"]},"offset":"19607445"},"toLower.js":{"size":592,"integrity":{"algorithm":"SHA256","hash":"f6e45b8be13b609296579855e785ec4544505a7da395f70774c10f9bb6998717","blockSize":4194304,"blocks":["f6e45b8be13b609296579855e785ec4544505a7da395f70774c10f9bb6998717"]},"offset":"19608313"},"toNumber.js":{"size":1519,"integrity":{"algorithm":"SHA256","hash":"1dceb1da4f87066299be510852a9106b73240df14258385b2ae13255d23c665a","blockSize":4194304,"blocks":["1dceb1da4f87066299be510852a9106b73240df14258385b2ae13255d23c665a"]},"offset":"19608905"},"toPairs.js":{"size":699,"integrity":{"algorithm":"SHA256","hash":"67971d14cd7cd08e44c4bdf71de888d2352457d4bb911399cd76b5781aa20e10","blockSize":4194304,"blocks":["67971d14cd7cd08e44c4bdf71de888d2352457d4bb911399cd76b5781aa20e10"]},"offset":"19610424"},"toPairsIn.js":{"size":737,"integrity":{"algorithm":"SHA256","hash":"41be305859dc6caa8be52619f7547ee0753eaa5c5ebb1915a04939bc10f941b6","blockSize":4194304,"blocks":["41be305859dc6caa8be52619f7547ee0753eaa5c5ebb1915a04939bc10f941b6"]},"offset":"19611123"},"toPath.js":{"size":804,"integrity":{"algorithm":"SHA256","hash":"90edd92b5e23f14f88910f4277ba72c0a4b2b32edfeb6fb71974d0877e5ab90d","blockSize":4194304,"blocks":["90edd92b5e23f14f88910f4277ba72c0a4b2b32edfeb6fb71974d0877e5ab90d"]},"offset":"19611860"},"toPlainObject.js":{"size":744,"integrity":{"algorithm":"SHA256","hash":"f25cb210adc84f80ceb07dc3b4d13563b60883459c11b069bf92f1c3315fb36c","blockSize":4194304,"blocks":["f25cb210adc84f80ceb07dc3b4d13563b60883459c11b069bf92f1c3315fb36c"]},"offset":"19612664"},"toSafeInteger.js":{"size":836,"integrity":{"algorithm":"SHA256","hash":"d2ff274d756cd7869491ed12c1f4b9d6e4d54a75a648bba08b5c277de0a8b900","blockSize":4194304,"blocks":["d2ff274d756cd7869491ed12c1f4b9d6e4d54a75a648bba08b5c277de0a8b900"]},"offset":"19613408"},"toString.js":{"size":580,"integrity":{"algorithm":"SHA256","hash":"bba94dbb89a34154ce6afb46e07a6bbcfc4928053f46300ba4a9dfd7ab2a94fc","blockSize":4194304,"blocks":["bba94dbb89a34154ce6afb46e07a6bbcfc4928053f46300ba4a9dfd7ab2a94fc"]},"offset":"19614244"},"toUpper.js":{"size":592,"integrity":{"algorithm":"SHA256","hash":"e31fee226eadaff21bc4612ec1701a7cb39ffc8d7a59eeefdf6a2ebae9e77a56","blockSize":4194304,"blocks":["e31fee226eadaff21bc4612ec1701a7cb39ffc8d7a59eeefdf6a2ebae9e77a56"]},"offset":"19614824"},"transform.js":{"size":2280,"integrity":{"algorithm":"SHA256","hash":"6aef56cab3ed694b5ffd3e3573171327017ad4621c7addfc88058ac521dcbf81","blockSize":4194304,"blocks":["6aef56cab3ed694b5ffd3e3573171327017ad4621c7addfc88058ac521dcbf81"]},"offset":"19615416"},"trim.js":{"size":1381,"integrity":{"algorithm":"SHA256","hash":"2581b16b0f17b70307ae6f4c479a5392ce625e67e2acad95f24c971732bd423f","blockSize":4194304,"blocks":["2581b16b0f17b70307ae6f4c479a5392ce625e67e2acad95f24c971732bd423f"]},"offset":"19617696"},"trimEnd.js":{"size":1216,"integrity":{"algorithm":"SHA256","hash":"b35e41e442395a9a98d4aa79e3105c54494bc3ad667d84ea46007dbe65c41f7d","blockSize":4194304,"blocks":["b35e41e442395a9a98d4aa79e3105c54494bc3ad667d84ea46007dbe65c41f7d"]},"offset":"19619077"},"trimStart.js":{"size":1228,"integrity":{"algorithm":"SHA256","hash":"570ca220de5e5202e964cefbd8f50c1f5431979aa8c713f65274f55613bd65d8","blockSize":4194304,"blocks":["570ca220de5e5202e964cefbd8f50c1f5431979aa8c713f65274f55613bd65d8"]},"offset":"19620293"},"truncate.js":{"size":3357,"integrity":{"algorithm":"SHA256","hash":"44ac616ac0042b55a20dfa8705d6fff0d9a4b44b1915660298671ff3600dbfbd","blockSize":4194304,"blocks":["44ac616ac0042b55a20dfa8705d6fff0d9a4b44b1915660298671ff3600dbfbd"]},"offset":"19621521"},"unary.js":{"size":469,"integrity":{"algorithm":"SHA256","hash":"72239e4f3d3b659d32698c13f279d9dcf8298c690ccd0eca164996768437cef7","blockSize":4194304,"blocks":["72239e4f3d3b659d32698c13f279d9dcf8298c690ccd0eca164996768437cef7"]},"offset":"19624878"},"unescape.js":{"size":1056,"integrity":{"algorithm":"SHA256","hash":"96e61d530c8f298fc615ffe5742dfc166ddab5bd89e0ccc5f9e5518b944f0f0c","blockSize":4194304,"blocks":["96e61d530c8f298fc615ffe5742dfc166ddab5bd89e0ccc5f9e5518b944f0f0c"]},"offset":"19625347"},"union.js":{"size":749,"integrity":{"algorithm":"SHA256","hash":"4368c727c7607f90fe5d61ccd22898745f1331d71780deeddb7b7c3345c1571e","blockSize":4194304,"blocks":["4368c727c7607f90fe5d61ccd22898745f1331d71780deeddb7b7c3345c1571e"]},"offset":"19626403"},"unionBy.js":{"size":1320,"integrity":{"algorithm":"SHA256","hash":"3f179990db852233f2cdd65a4aad975c99e3a8838bb75d94934d3c734aaec953","blockSize":4194304,"blocks":["3f179990db852233f2cdd65a4aad975c99e3a8838bb75d94934d3c734aaec953"]},"offset":"19627152"},"unionWith.js":{"size":1255,"integrity":{"algorithm":"SHA256","hash":"bdc498eebed2852915801f8905c42a7acb61d40ef057ed4eeec74707563db4c2","blockSize":4194304,"blocks":["bdc498eebed2852915801f8905c42a7acb61d40ef057ed4eeec74707563db4c2"]},"offset":"19628472"},"uniq.js":{"size":688,"integrity":{"algorithm":"SHA256","hash":"baceb9385e442be370276ec74cdc498be480ae7f7dff881259f4ed5d5a8a099c","blockSize":4194304,"blocks":["baceb9385e442be370276ec74cdc498be480ae7f7dff881259f4ed5d5a8a099c"]},"offset":"19629727"},"uniqBy.js":{"size":1013,"integrity":{"algorithm":"SHA256","hash":"674640e6cd6e098f233d6dc067239c66483cb3b24900b13ee718a35f8a86688c","blockSize":4194304,"blocks":["674640e6cd6e098f233d6dc067239c66483cb3b24900b13ee718a35f8a86688c"]},"offset":"19630415"},"uniqWith.js":{"size":958,"integrity":{"algorithm":"SHA256","hash":"db9b1221ea9fb52789e574390fc51dcad76fa2a87465153bee4be25cde0a263a","blockSize":4194304,"blocks":["db9b1221ea9fb52789e574390fc51dcad76fa2a87465153bee4be25cde0a263a"]},"offset":"19631428"},"uniqueId.js":{"size":562,"integrity":{"algorithm":"SHA256","hash":"5526b1388b92c2ac6d80da02d1602e20023644b61eb5d09a84ce9fad464ad328","blockSize":4194304,"blocks":["5526b1388b92c2ac6d80da02d1602e20023644b61eb5d09a84ce9fad464ad328"]},"offset":"19632386"},"unset.js":{"size":804,"integrity":{"algorithm":"SHA256","hash":"74d4c2b1a3a8371c8cbd73ccd90be05130a49489302b450edfd4f145ecec2a88","blockSize":4194304,"blocks":["74d4c2b1a3a8371c8cbd73ccd90be05130a49489302b450edfd4f145ecec2a88"]},"offset":"19632948"},"unzip.js":{"size":1282,"integrity":{"algorithm":"SHA256","hash":"21f9ebd1100e9559ac578cf1d4530e8cf3ca9898dda43a58ba8820da2d62b9f5","blockSize":4194304,"blocks":["21f9ebd1100e9559ac578cf1d4530e8cf3ca9898dda43a58ba8820da2d62b9f5"]},"offset":"19633752"},"unzipWith.js":{"size":1049,"integrity":{"algorithm":"SHA256","hash":"7c9ca06948ac1a3c45e489eb577a20a5845f5bb7323458c540abe94d0e560821","blockSize":4194304,"blocks":["7c9ca06948ac1a3c45e489eb577a20a5845f5bb7323458c540abe94d0e560821"]},"offset":"19635034"},"update.js":{"size":1076,"integrity":{"algorithm":"SHA256","hash":"e4a0faeda8f2e830fdbfaf9179286e62dc0863e0c6a9759c04a062ccab6f4382","blockSize":4194304,"blocks":["e4a0faeda8f2e830fdbfaf9179286e62dc0863e0c6a9759c04a062ccab6f4382"]},"offset":"19636083"},"updateWith.js":{"size":1187,"integrity":{"algorithm":"SHA256","hash":"686f7e67fc02344b760b85528ac13d7e85ac93fc700a9fc786b98c37002f0b20","blockSize":4194304,"blocks":["686f7e67fc02344b760b85528ac13d7e85ac93fc700a9fc786b98c37002f0b20"]},"offset":"19637159"},"upperCase.js":{"size":620,"integrity":{"algorithm":"SHA256","hash":"9b627b718944776e62e95ae307a80f03c9c32560c58435904dcf519431447002","blockSize":4194304,"blocks":["9b627b718944776e62e95ae307a80f03c9c32560c58435904dcf519431447002"]},"offset":"19638346"},"upperFirst.js":{"size":470,"integrity":{"algorithm":"SHA256","hash":"4b161930648589f87db7960ab4fbd3996cd32dbcb29e1aaca0d23cda943c81bf","blockSize":4194304,"blocks":["4b161930648589f87db7960ab4fbd3996cd32dbcb29e1aaca0d23cda943c81bf"]},"offset":"19638966"},"util.js":{"size":1177,"integrity":{"algorithm":"SHA256","hash":"5bad3574e58dce630b79a23ca85df8c86a6a507a019412f055e061ccfab0c341","blockSize":4194304,"blocks":["5bad3574e58dce630b79a23ca85df8c86a6a507a019412f055e061ccfab0c341"]},"offset":"19639436"},"value.js":{"size":44,"integrity":{"algorithm":"SHA256","hash":"469f0f647beaf4eeca8d316133bcd0a0b3f5e55a4c1a391da1f10baba824ca9d","blockSize":4194304,"blocks":["469f0f647beaf4eeca8d316133bcd0a0b3f5e55a4c1a391da1f10baba824ca9d"]},"offset":"19640613"},"valueOf.js":{"size":44,"integrity":{"algorithm":"SHA256","hash":"469f0f647beaf4eeca8d316133bcd0a0b3f5e55a4c1a391da1f10baba824ca9d","blockSize":4194304,"blocks":["469f0f647beaf4eeca8d316133bcd0a0b3f5e55a4c1a391da1f10baba824ca9d"]},"offset":"19640657"},"values.js":{"size":733,"integrity":{"algorithm":"SHA256","hash":"2d40fdc1a33e1cb3452294ed2d3c975efea197890282e7f32d1873e2a206b3b8","blockSize":4194304,"blocks":["2d40fdc1a33e1cb3452294ed2d3c975efea197890282e7f32d1873e2a206b3b8"]},"offset":"19640701"},"valuesIn.js":{"size":723,"integrity":{"algorithm":"SHA256","hash":"75dfeab75daa444fd41fbbe0bd032f01a0d6a5a77b1cefd5fb0b7a4a85ea4031","blockSize":4194304,"blocks":["75dfeab75daa444fd41fbbe0bd032f01a0d6a5a77b1cefd5fb0b7a4a85ea4031"]},"offset":"19641434"},"without.js":{"size":858,"integrity":{"algorithm":"SHA256","hash":"53395074deb2a710c1de202e9fb00e3c110a9444dd35546f5fa231e459580a62","blockSize":4194304,"blocks":["53395074deb2a710c1de202e9fb00e3c110a9444dd35546f5fa231e459580a62"]},"offset":"19642157"},"words.js":{"size":1031,"integrity":{"algorithm":"SHA256","hash":"031f8b92aa66c9349f3c680e7a0299c579460a64ef6ca1e6619b42ada3e0c75e","blockSize":4194304,"blocks":["031f8b92aa66c9349f3c680e7a0299c579460a64ef6ca1e6619b42ada3e0c75e"]},"offset":"19643015"},"wrap.js":{"size":871,"integrity":{"algorithm":"SHA256","hash":"dcfebf623523363f0c24faf07c6763fa004883d8bc2e5f2c0e1a1244ed8fdcaf","blockSize":4194304,"blocks":["dcfebf623523363f0c24faf07c6763fa004883d8bc2e5f2c0e1a1244ed8fdcaf"]},"offset":"19644046"},"wrapperAt.js":{"size":1341,"integrity":{"algorithm":"SHA256","hash":"e2bfb9a9b4a1dd501a8028c7abae2b38cc0eb2eb871641449f1d2e9fa25256eb","blockSize":4194304,"blocks":["e2bfb9a9b4a1dd501a8028c7abae2b38cc0eb2eb871641449f1d2e9fa25256eb"]},"offset":"19644917"},"wrapperChain.js":{"size":706,"integrity":{"algorithm":"SHA256","hash":"008f513acad5b08f04ab4c2115edd168c6337da85409cccd3034111d2f4973bb","blockSize":4194304,"blocks":["008f513acad5b08f04ab4c2115edd168c6337da85409cccd3034111d2f4973bb"]},"offset":"19646258"},"wrapperLodash.js":{"size":6942,"integrity":{"algorithm":"SHA256","hash":"f222456449139eea3935c6ca92652bb1315fa2f7948de0684fda300d519d429a","blockSize":4194304,"blocks":["f222456449139eea3935c6ca92652bb1315fa2f7948de0684fda300d519d429a"]},"offset":"19646964"},"wrapperReverse.js":{"size":1019,"integrity":{"algorithm":"SHA256","hash":"c803206c4600839eec340ce698c1e6c44809240a33ab108df4c1ca4dc398d9d5","blockSize":4194304,"blocks":["c803206c4600839eec340ce698c1e6c44809240a33ab108df4c1ca4dc398d9d5"]},"offset":"19653906"},"wrapperValue.js":{"size":455,"integrity":{"algorithm":"SHA256","hash":"d29bc014314edc459fef32c467fa48951ee5e80adda0485142195b22834b761a","blockSize":4194304,"blocks":["d29bc014314edc459fef32c467fa48951ee5e80adda0485142195b22834b761a"]},"offset":"19654925"},"xor.js":{"size":811,"integrity":{"algorithm":"SHA256","hash":"8f8deb349ef4d8404e576da4b8fafe24962a08717aa6cb53352406b612e2aeb4","blockSize":4194304,"blocks":["8f8deb349ef4d8404e576da4b8fafe24962a08717aa6cb53352406b612e2aeb4"]},"offset":"19655380"},"xorBy.js":{"size":1301,"integrity":{"algorithm":"SHA256","hash":"5e7d02fb443662313db1f626ce285196b304aa84cbf1c3aab4234e614e95eab7","blockSize":4194304,"blocks":["5e7d02fb443662313db1f626ce285196b304aa84cbf1c3aab4234e614e95eab7"]},"offset":"19656191"},"xorWith.js":{"size":1222,"integrity":{"algorithm":"SHA256","hash":"4617fb7d53b1982e8286e08841b94c879395c995774570e2c06d06ca3976b2c3","blockSize":4194304,"blocks":["4617fb7d53b1982e8286e08841b94c879395c995774570e2c06d06ca3976b2c3"]},"offset":"19657492"},"zip.js":{"size":609,"integrity":{"algorithm":"SHA256","hash":"0ccb99e1fed07dbe5bec9f9d75a9aaf4591fb6ae3d719f94bc3bb6e8f5f2bff3","blockSize":4194304,"blocks":["0ccb99e1fed07dbe5bec9f9d75a9aaf4591fb6ae3d719f94bc3bb6e8f5f2bff3"]},"offset":"19658714"},"zipObject.js":{"size":664,"integrity":{"algorithm":"SHA256","hash":"8b3b705599aa43b6358ba4261b3c7d48ba55da40a74082b08844e0df2fda231e","blockSize":4194304,"blocks":["8b3b705599aa43b6358ba4261b3c7d48ba55da40a74082b08844e0df2fda231e"]},"offset":"19659323"},"zipObjectDeep.js":{"size":643,"integrity":{"algorithm":"SHA256","hash":"7bffde7f20305ed72b183108c764cb936163c67bb09b307b702e6449c3af3e4f","blockSize":4194304,"blocks":["7bffde7f20305ed72b183108c764cb936163c67bb09b307b702e6449c3af3e4f"]},"offset":"19659987"},"zipWith.js":{"size":960,"integrity":{"algorithm":"SHA256","hash":"39e21527d4083b4d20930927308be07b7421796fff9df2d13ddd49271957abb8","blockSize":4194304,"blocks":["39e21527d4083b4d20930927308be07b7421796fff9df2d13ddd49271957abb8"]},"offset":"19660630"},"fp":{"files":{"F.js":{"size":41,"integrity":{"algorithm":"SHA256","hash":"49443aafae0d95656f2982f538f1e4f6501fc2e0feeec000c7fcfca4787c59d1","blockSize":4194304,"blocks":["49443aafae0d95656f2982f538f1e4f6501fc2e0feeec000c7fcfca4787c59d1"]},"offset":"19661590"},"T.js":{"size":40,"integrity":{"algorithm":"SHA256","hash":"46da2a184b61b5875b44ea61f4004d12bb0981bd0c03ddf7707ac41e7892d50a","blockSize":4194304,"blocks":["46da2a184b61b5875b44ea61f4004d12bb0981bd0c03ddf7707ac41e7892d50a"]},"offset":"19661631"},"__.js":{"size":43,"integrity":{"algorithm":"SHA256","hash":"94a509ebbf362c7344212c3eb78b97d61c87d53099c9ee1285838c20082185e8","blockSize":4194304,"blocks":["94a509ebbf362c7344212c3eb78b97d61c87d53099c9ee1285838c20082185e8"]},"offset":"19661671"},"_baseConvert.js":{"size":16414,"integrity":{"algorithm":"SHA256","hash":"a46928425b69427e597931716103a793c156a7eef2c9e510b72cdd657978f270","blockSize":4194304,"blocks":["a46928425b69427e597931716103a793c156a7eef2c9e510b72cdd657978f270"]},"offset":"19661714"},"_convertBrowser.js":{"size":615,"integrity":{"algorithm":"SHA256","hash":"95ca01b0535de617fc0ba0f5b5b6a804e2c21fd762ff93d73cf2753101f83caf","blockSize":4194304,"blocks":["95ca01b0535de617fc0ba0f5b5b6a804e2c21fd762ff93d73cf2753101f83caf"]},"offset":"19678128"},"_falseOptions.js":{"size":113,"integrity":{"algorithm":"SHA256","hash":"f2415d2f5c437694bc55d31132cb866abc0b5aae349e0673dfd6924ff281d9a7","blockSize":4194304,"blocks":["f2415d2f5c437694bc55d31132cb866abc0b5aae349e0673dfd6924ff281d9a7"]},"offset":"19678743"},"_mapping.js":{"size":9955,"integrity":{"algorithm":"SHA256","hash":"474a0de8f3624a02218a6092e07f51e8315514d73d40dfa3c8f6820419460aed","blockSize":4194304,"blocks":["474a0de8f3624a02218a6092e07f51e8315514d73d40dfa3c8f6820419460aed"]},"offset":"19678856"},"_util.js":{"size":524,"integrity":{"algorithm":"SHA256","hash":"01f3918232f19d495715e676df3e6aa0e9d85e966de3f28fc78f3f52e69d99c7","blockSize":4194304,"blocks":["01f3918232f19d495715e676df3e6aa0e9d85e966de3f28fc78f3f52e69d99c7"]},"offset":"19688811"},"add.js":{"size":151,"integrity":{"algorithm":"SHA256","hash":"3c8763bbf119306791d3c708a37cb246bd4c7ccfc1170bf2fbcacd54f0cb7c5e","blockSize":4194304,"blocks":["3c8763bbf119306791d3c708a37cb246bd4c7ccfc1170bf2fbcacd54f0cb7c5e"]},"offset":"19689335"},"after.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"5945862af679efbdd90af501d700e42a938ad87d3c30ff70f69c7312aefd7f4d","blockSize":4194304,"blocks":["5945862af679efbdd90af501d700e42a938ad87d3c30ff70f69c7312aefd7f4d"]},"offset":"19689486"},"all.js":{"size":37,"integrity":{"algorithm":"SHA256","hash":"7070c50b50b2d18208c13553a57f3a4f1110daf8c75ed0f574a8521d8403dc35","blockSize":4194304,"blocks":["7070c50b50b2d18208c13553a57f3a4f1110daf8c75ed0f574a8521d8403dc35"]},"offset":"19689641"},"allPass.js":{"size":41,"integrity":{"algorithm":"SHA256","hash":"e9c7408f1a61f16effa30e053eec3d716c3a4f96f8a76d4652f8c0f339fd2e47","blockSize":4194304,"blocks":["e9c7408f1a61f16effa30e053eec3d716c3a4f96f8a76d4652f8c0f339fd2e47"]},"offset":"19689678"},"always.js":{"size":40,"integrity":{"algorithm":"SHA256","hash":"1049a38323bf3acb6690deeb6b33370f29e1eade6cec6af43115266105ffb9b8","blockSize":4194304,"blocks":["1049a38323bf3acb6690deeb6b33370f29e1eade6cec6af43115266105ffb9b8"]},"offset":"19689719"},"any.js":{"size":36,"integrity":{"algorithm":"SHA256","hash":"c405ffe3fe586265285960be258de77459bc9821b28d337ea72d1cc08042f01e","blockSize":4194304,"blocks":["c405ffe3fe586265285960be258de77459bc9821b28d337ea72d1cc08042f01e"]},"offset":"19689759"},"anyPass.js":{"size":40,"integrity":{"algorithm":"SHA256","hash":"68a7c4d963e6b9cb5e0c6a8485343eb3cd2433c3bbd59d37bc5899c0968532cd","blockSize":4194304,"blocks":["68a7c4d963e6b9cb5e0c6a8485343eb3cd2433c3bbd59d37bc5899c0968532cd"]},"offset":"19689795"},"apply.js":{"size":38,"integrity":{"algorithm":"SHA256","hash":"33d3614711caecd95281b1d7db378ce9c4397d6b746c382486c1c07ed8833d60","blockSize":4194304,"blocks":["33d3614711caecd95281b1d7db378ce9c4397d6b746c382486c1c07ed8833d60"]},"offset":"19689835"},"array.js":{"size":83,"integrity":{"algorithm":"SHA256","hash":"99fac7be4b9ebb1c24038d41fc1a48f08e7bb048792063a0dbcdbd496bf6aa4b","blockSize":4194304,"blocks":["99fac7be4b9ebb1c24038d41fc1a48f08e7bb048792063a0dbcdbd496bf6aa4b"]},"offset":"19689873"},"ary.js":{"size":151,"integrity":{"algorithm":"SHA256","hash":"a2576c7bd76dfd6ccf7068d5ff390da141930ffd1b9ded5a51ee09bac9e0ebd8","blockSize":4194304,"blocks":["a2576c7bd76dfd6ccf7068d5ff390da141930ffd1b9ded5a51ee09bac9e0ebd8"]},"offset":"19689956"},"assign.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"f25379754527aabe4d72eb9272d437db669cc141d390019a1e928887c0b5d5e0","blockSize":4194304,"blocks":["f25379754527aabe4d72eb9272d437db669cc141d390019a1e928887c0b5d5e0"]},"offset":"19690107"},"assignAll.js":{"size":160,"integrity":{"algorithm":"SHA256","hash":"c6ab29943f2f58f9e00014e6d097be50d8e501f198a744b9fd5ff19e782c6b71","blockSize":4194304,"blocks":["c6ab29943f2f58f9e00014e6d097be50d8e501f198a744b9fd5ff19e782c6b71"]},"offset":"19690264"},"assignAllWith.js":{"size":168,"integrity":{"algorithm":"SHA256","hash":"303fd675b28fdc9845d077f710f5f44b05198f3ab85b0eb4249852bfe188e5e5","blockSize":4194304,"blocks":["303fd675b28fdc9845d077f710f5f44b05198f3ab85b0eb4249852bfe188e5e5"]},"offset":"19690424"},"assignIn.js":{"size":161,"integrity":{"algorithm":"SHA256","hash":"ae37059583928bfda9d0902546453f0dc9e832297f5d598449c8c7358fa72125","blockSize":4194304,"blocks":["ae37059583928bfda9d0902546453f0dc9e832297f5d598449c8c7358fa72125"]},"offset":"19690592"},"assignInAll.js":{"size":164,"integrity":{"algorithm":"SHA256","hash":"a6d67eae2daec3cac8225f51a4d247ab080c14c6bb7e56ee81dbb265c40c1030","blockSize":4194304,"blocks":["a6d67eae2daec3cac8225f51a4d247ab080c14c6bb7e56ee81dbb265c40c1030"]},"offset":"19690753"},"assignInAllWith.js":{"size":172,"integrity":{"algorithm":"SHA256","hash":"906e71db3e57c7a658cc0568d82a8ca1fbdf0ea41229fc71a1295055932091f8","blockSize":4194304,"blocks":["906e71db3e57c7a658cc0568d82a8ca1fbdf0ea41229fc71a1295055932091f8"]},"offset":"19690917"},"assignInWith.js":{"size":169,"integrity":{"algorithm":"SHA256","hash":"34dfcd3f73ca44c3a922da895873edbb772ea799b406548f5a847e3a26f618b6","blockSize":4194304,"blocks":["34dfcd3f73ca44c3a922da895873edbb772ea799b406548f5a847e3a26f618b6"]},"offset":"19691089"},"assignWith.js":{"size":165,"integrity":{"algorithm":"SHA256","hash":"6279bdb94bcc7b3e86035bd9e4b03bf9ab1edc662d53a77ccc7c6bbb6bdc571c","blockSize":4194304,"blocks":["6279bdb94bcc7b3e86035bd9e4b03bf9ab1edc662d53a77ccc7c6bbb6bdc571c"]},"offset":"19691258"},"assoc.js":{"size":35,"integrity":{"algorithm":"SHA256","hash":"b9b1a205d5bd933a2bc29506931ee397b48c87fa3368f98acad8b1f97595a91d","blockSize":4194304,"blocks":["b9b1a205d5bd933a2bc29506931ee397b48c87fa3368f98acad8b1f97595a91d"]},"offset":"19691423"},"assocPath.js":{"size":35,"integrity":{"algorithm":"SHA256","hash":"b9b1a205d5bd933a2bc29506931ee397b48c87fa3368f98acad8b1f97595a91d","blockSize":4194304,"blocks":["b9b1a205d5bd933a2bc29506931ee397b48c87fa3368f98acad8b1f97595a91d"]},"offset":"19691458"},"at.js":{"size":149,"integrity":{"algorithm":"SHA256","hash":"b1e28dccdcbb369bcd1d6ad21f8c653926cb0463641dedde8079933b7fd28a43","blockSize":4194304,"blocks":["b1e28dccdcbb369bcd1d6ad21f8c653926cb0463641dedde8079933b7fd28a43"]},"offset":"19691493"},"attempt.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"d3c96bad5be8079fa56c5745c17f2a5644580d1fe5727c86a08e5d3092cb25fa","blockSize":4194304,"blocks":["d3c96bad5be8079fa56c5745c17f2a5644580d1fe5727c86a08e5d3092cb25fa"]},"offset":"19691642"},"before.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"13bea9443a35be234951244c086b038be91fa742fddc6482143cf9d545b143a7","blockSize":4194304,"blocks":["13bea9443a35be234951244c086b038be91fa742fddc6482143cf9d545b143a7"]},"offset":"19691801"},"bind.js":{"size":153,"integrity":{"algorithm":"SHA256","hash":"a2f8615ea2a044ca8bef0434c13a96fd39ae05a3204a39e1797eb06740a0dea4","blockSize":4194304,"blocks":["a2f8615ea2a044ca8bef0434c13a96fd39ae05a3204a39e1797eb06740a0dea4"]},"offset":"19691958"},"bindAll.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"d74ed0198d4ad5bebe9f7d69cca50e80b703d39df6edb5b7a998abfea484ff69","blockSize":4194304,"blocks":["d74ed0198d4ad5bebe9f7d69cca50e80b703d39df6edb5b7a998abfea484ff69"]},"offset":"19692111"},"bindKey.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"d0fd01b641a3067225eae8306959c60278b1bd9df8be9e67df684ae9464fedaa","blockSize":4194304,"blocks":["d0fd01b641a3067225eae8306959c60278b1bd9df8be9e67df684ae9464fedaa"]},"offset":"19692270"},"camelCase.js":{"size":191,"integrity":{"algorithm":"SHA256","hash":"5df85c992ad127721c571314c433703e821ce3ada68da0c164b28162f9be12a3","blockSize":4194304,"blocks":["5df85c992ad127721c571314c433703e821ce3ada68da0c164b28162f9be12a3"]},"offset":"19692429"},"capitalize.js":{"size":193,"integrity":{"algorithm":"SHA256","hash":"eafc4ccb8081802ec1e3f1776eab6241bb2098c540a023f8b6fef8a829314432","blockSize":4194304,"blocks":["eafc4ccb8081802ec1e3f1776eab6241bb2098c540a023f8b6fef8a829314432"]},"offset":"19692620"},"castArray.js":{"size":163,"integrity":{"algorithm":"SHA256","hash":"08392d5c41ead50c1e43d1030cfddec55594ccf72448e8ed2417eed2a096b901","blockSize":4194304,"blocks":["08392d5c41ead50c1e43d1030cfddec55594ccf72448e8ed2417eed2a096b901"]},"offset":"19692813"},"ceil.js":{"size":153,"integrity":{"algorithm":"SHA256","hash":"6a235932994629e072410d67abfbd8dcb65db92cbf7a94ba036c244af3b886cd","blockSize":4194304,"blocks":["6a235932994629e072410d67abfbd8dcb65db92cbf7a94ba036c244af3b886cd"]},"offset":"19692976"},"chain.js":{"size":183,"integrity":{"algorithm":"SHA256","hash":"a8ae5e6678a28c2c4f3ab83bcef8c2c3f138cd09ab52c91b0f02182400d8ecb8","blockSize":4194304,"blocks":["a8ae5e6678a28c2c4f3ab83bcef8c2c3f138cd09ab52c91b0f02182400d8ecb8"]},"offset":"19693129"},"chunk.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"da58bd57de733e7c82b5b94ceab91f9d0f64baee02c570e1d6c16e594dafb54d","blockSize":4194304,"blocks":["da58bd57de733e7c82b5b94ceab91f9d0f64baee02c570e1d6c16e594dafb54d"]},"offset":"19693312"},"clamp.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"8a5e6e9acca2ba8970d9d9d84da835fee9bd671e2a699f707d2e24aaf5b42c2f","blockSize":4194304,"blocks":["8a5e6e9acca2ba8970d9d9d84da835fee9bd671e2a699f707d2e24aaf5b42c2f"]},"offset":"19693467"},"clone.js":{"size":183,"integrity":{"algorithm":"SHA256","hash":"a60e4088e3715016783f1e96b909f5e3f57bfc226563d6fe2304dfa2144b0804","blockSize":4194304,"blocks":["a60e4088e3715016783f1e96b909f5e3f57bfc226563d6fe2304dfa2144b0804"]},"offset":"19693622"},"cloneDeep.js":{"size":191,"integrity":{"algorithm":"SHA256","hash":"9a8aa3f9398214f470d0a34eda7c9b21d2170cc2af092420428ad8b0de3d81b1","blockSize":4194304,"blocks":["9a8aa3f9398214f470d0a34eda7c9b21d2170cc2af092420428ad8b0de3d81b1"]},"offset":"19693805"},"cloneDeepWith.js":{"size":171,"integrity":{"algorithm":"SHA256","hash":"ad05d4631dd799e4ebda877b5f54c6d004105e0b4271d6bf4f78e0ac1501c782","blockSize":4194304,"blocks":["ad05d4631dd799e4ebda877b5f54c6d004105e0b4271d6bf4f78e0ac1501c782"]},"offset":"19693996"},"cloneWith.js":{"size":163,"integrity":{"algorithm":"SHA256","hash":"0f4cba49e00d6cfee004da886194411b6b6ff690f53eff40fe99f7ab6314f561","blockSize":4194304,"blocks":["0f4cba49e00d6cfee004da886194411b6b6ff690f53eff40fe99f7ab6314f561"]},"offset":"19694167"},"collection.js":{"size":88,"integrity":{"algorithm":"SHA256","hash":"de3dd2c7102210f1ebf861c0ecc5ed80856b366381e6dc2747b94610981f6c15","blockSize":4194304,"blocks":["de3dd2c7102210f1ebf861c0ecc5ed80856b366381e6dc2747b94610981f6c15"]},"offset":"19694330"},"commit.js":{"size":185,"integrity":{"algorithm":"SHA256","hash":"b8f2c972edb423146bd1223e4c06d4052e1e7da6d4aa6d72aa8bb0d52e807a57","blockSize":4194304,"blocks":["b8f2c972edb423146bd1223e4c06d4052e1e7da6d4aa6d72aa8bb0d52e807a57"]},"offset":"19694418"},"compact.js":{"size":187,"integrity":{"algorithm":"SHA256","hash":"b17e00bc5a112f5b8d159abcc36ef23023ee6441599e9596ba7ff02f4f3e28dd","blockSize":4194304,"blocks":["b17e00bc5a112f5b8d159abcc36ef23023ee6441599e9596ba7ff02f4f3e28dd"]},"offset":"19694603"},"complement.js":{"size":38,"integrity":{"algorithm":"SHA256","hash":"36ae65e644cfe57c1ea79aa9249365326bdb55a98924fa041d78c5809c26f488","blockSize":4194304,"blocks":["36ae65e644cfe57c1ea79aa9249365326bdb55a98924fa041d78c5809c26f488"]},"offset":"19694790"},"compose.js":{"size":41,"integrity":{"algorithm":"SHA256","hash":"beb7a22c367f2870171d29f3d6d012bcb1ee1c95cf70c241ffcc9a45fec7f650","blockSize":4194304,"blocks":["beb7a22c367f2870171d29f3d6d012bcb1ee1c95cf70c241ffcc9a45fec7f650"]},"offset":"19694828"},"concat.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"028ea6983438214b6d30942e47ee29d75868872ad885b3b112f3e3f6f879eae1","blockSize":4194304,"blocks":["028ea6983438214b6d30942e47ee29d75868872ad885b3b112f3e3f6f879eae1"]},"offset":"19694869"},"cond.js":{"size":181,"integrity":{"algorithm":"SHA256","hash":"79733550186c66688b70e3b15f2d9b903f9c80639dcad742f5a74ce407092793","blockSize":4194304,"blocks":["79733550186c66688b70e3b15f2d9b903f9c80639dcad742f5a74ce407092793"]},"offset":"19695026"},"conforms.js":{"size":42,"integrity":{"algorithm":"SHA256","hash":"335495baefaf23607518544bc875a1ef48507d2c5e6bf0f0c1a225fd0e304f46","blockSize":4194304,"blocks":["335495baefaf23607518544bc875a1ef48507d2c5e6bf0f0c1a225fd0e304f46"]},"offset":"19695207"},"conformsTo.js":{"size":165,"integrity":{"algorithm":"SHA256","hash":"74a5c01ca96e8906099cd3a914e1afe1a02d5af8d6ddfcee97e93c0720d4ece8","blockSize":4194304,"blocks":["74a5c01ca96e8906099cd3a914e1afe1a02d5af8d6ddfcee97e93c0720d4ece8"]},"offset":"19695249"},"constant.js":{"size":189,"integrity":{"algorithm":"SHA256","hash":"3cea5392090c8d9f6120261f97f6de0cb2b57423f2e5b7dd8ca38784af7cad0e","blockSize":4194304,"blocks":["3cea5392090c8d9f6120261f97f6de0cb2b57423f2e5b7dd8ca38784af7cad0e"]},"offset":"19695414"},"contains.js":{"size":40,"integrity":{"algorithm":"SHA256","hash":"bb4e283bb701c033f9590b927765fff80c93a4f549f57196c797e33f45cc8e65","blockSize":4194304,"blocks":["bb4e283bb701c033f9590b927765fff80c93a4f549f57196c797e33f45cc8e65"]},"offset":"19695603"},"convert.js":{"size":657,"integrity":{"algorithm":"SHA256","hash":"b3d25cc61f10d0d9d27f26312d6d4cbd21f16e2446a5cdddcc4374a3313c8fbc","blockSize":4194304,"blocks":["b3d25cc61f10d0d9d27f26312d6d4cbd21f16e2446a5cdddcc4374a3313c8fbc"]},"offset":"19695643"},"countBy.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"7a4658a5a7e702a4e24496ad419a327f29f886f66e48a1eb4b3fac17a84002fd","blockSize":4194304,"blocks":["7a4658a5a7e702a4e24496ad419a327f29f886f66e48a1eb4b3fac17a84002fd"]},"offset":"19696300"},"create.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"cf3e62f02f95c0738afbe040cecb9fefe8e9861a077f79eb75096f9b8f6a2bd7","blockSize":4194304,"blocks":["cf3e62f02f95c0738afbe040cecb9fefe8e9861a077f79eb75096f9b8f6a2bd7"]},"offset":"19696459"},"curry.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"ca770e5e7ddacbbb620fe4866afaa14c43c030c8e4d9fdbdcbe0f573a7b0e8a4","blockSize":4194304,"blocks":["ca770e5e7ddacbbb620fe4866afaa14c43c030c8e4d9fdbdcbe0f573a7b0e8a4"]},"offset":"19696616"},"curryN.js":{"size":156,"integrity":{"algorithm":"SHA256","hash":"664920b694b26ad818f4bee1d9cf0af0113d3fd8c91265df851a223944db0eaa","blockSize":4194304,"blocks":["664920b694b26ad818f4bee1d9cf0af0113d3fd8c91265df851a223944db0eaa"]},"offset":"19696771"},"curryRight.js":{"size":165,"integrity":{"algorithm":"SHA256","hash":"ce153c776611314c7cdca859cdc50e401f390ba0e131df77fa575197fc8b69fd","blockSize":4194304,"blocks":["ce153c776611314c7cdca859cdc50e401f390ba0e131df77fa575197fc8b69fd"]},"offset":"19696927"},"curryRightN.js":{"size":166,"integrity":{"algorithm":"SHA256","hash":"044d68b3a1ace478c8b51796b4333e67368b6f0614ed1b540b84ba6c24800435","blockSize":4194304,"blocks":["044d68b3a1ace478c8b51796b4333e67368b6f0614ed1b540b84ba6c24800435"]},"offset":"19697092"},"date.js":{"size":82,"integrity":{"algorithm":"SHA256","hash":"81b69c9d67ea9c603ae4dc33336b50db3828afedd478d4e3bdbc4489418ac838","blockSize":4194304,"blocks":["81b69c9d67ea9c603ae4dc33336b50db3828afedd478d4e3bdbc4489418ac838"]},"offset":"19697258"},"debounce.js":{"size":161,"integrity":{"algorithm":"SHA256","hash":"bf63158fb60eda49efbf82dc61cda018b292caeac9345cfeb9a5551cc42feb01","blockSize":4194304,"blocks":["bf63158fb60eda49efbf82dc61cda018b292caeac9345cfeb9a5551cc42feb01"]},"offset":"19697340"},"deburr.js":{"size":185,"integrity":{"algorithm":"SHA256","hash":"76c495bdd9fa0050492f13c07acdba0949ac98225cbf5f66e4f7f2d21e4a2135","blockSize":4194304,"blocks":["76c495bdd9fa0050492f13c07acdba0949ac98225cbf5f66e4f7f2d21e4a2135"]},"offset":"19697501"},"defaultTo.js":{"size":163,"integrity":{"algorithm":"SHA256","hash":"08e6643048098f7dd36d9ba55b42ebc988a9d5947aea800c8985b6a5218ea74a","blockSize":4194304,"blocks":["08e6643048098f7dd36d9ba55b42ebc988a9d5947aea800c8985b6a5218ea74a"]},"offset":"19697686"},"defaults.js":{"size":161,"integrity":{"algorithm":"SHA256","hash":"eaf38c43268c18e70e72d8add1b88d777eca6602dca45aa9385919f37a076882","blockSize":4194304,"blocks":["eaf38c43268c18e70e72d8add1b88d777eca6602dca45aa9385919f37a076882"]},"offset":"19697849"},"defaultsAll.js":{"size":164,"integrity":{"algorithm":"SHA256","hash":"770444d5d05b34449b7c6b369b225c4f1602ca9ab8f3ae7a9630a306c0c12663","blockSize":4194304,"blocks":["770444d5d05b34449b7c6b369b225c4f1602ca9ab8f3ae7a9630a306c0c12663"]},"offset":"19698010"},"defaultsDeep.js":{"size":169,"integrity":{"algorithm":"SHA256","hash":"88689cb3cce8b6f17acabd6996a44c7e06fd4eef8e28b3ab84c9e2d752924c7f","blockSize":4194304,"blocks":["88689cb3cce8b6f17acabd6996a44c7e06fd4eef8e28b3ab84c9e2d752924c7f"]},"offset":"19698174"},"defaultsDeepAll.js":{"size":172,"integrity":{"algorithm":"SHA256","hash":"372abc16eacec39a632a174b82dfae24b06d524cee30fad6a1040ce8e17ee4c1","blockSize":4194304,"blocks":["372abc16eacec39a632a174b82dfae24b06d524cee30fad6a1040ce8e17ee4c1"]},"offset":"19698343"},"defer.js":{"size":183,"integrity":{"algorithm":"SHA256","hash":"4e3168061b8d828e3f3d7ab57aa95e27921842e100a03c765d3e7efd214cdd31","blockSize":4194304,"blocks":["4e3168061b8d828e3f3d7ab57aa95e27921842e100a03c765d3e7efd214cdd31"]},"offset":"19698515"},"delay.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"49e90452caab8b79c153f909f744f00476f288516a1b5930337617f95db24fd5","blockSize":4194304,"blocks":["49e90452caab8b79c153f909f744f00476f288516a1b5930337617f95db24fd5"]},"offset":"19698698"},"difference.js":{"size":165,"integrity":{"algorithm":"SHA256","hash":"7f30fec45697a7061992e561f72b84615e7f9e392973252a8e5261863ca2788b","blockSize":4194304,"blocks":["7f30fec45697a7061992e561f72b84615e7f9e392973252a8e5261863ca2788b"]},"offset":"19698853"},"differenceBy.js":{"size":169,"integrity":{"algorithm":"SHA256","hash":"eccf3d651be78bf3ae2172802d193c5bc1e28a52133c3494e7ee904c24f5059c","blockSize":4194304,"blocks":["eccf3d651be78bf3ae2172802d193c5bc1e28a52133c3494e7ee904c24f5059c"]},"offset":"19699018"},"differenceWith.js":{"size":173,"integrity":{"algorithm":"SHA256","hash":"92e0654e0e7257a40642809e12923092077dd746bad27dd3d790313ba052f8a5","blockSize":4194304,"blocks":["92e0654e0e7257a40642809e12923092077dd746bad27dd3d790313ba052f8a5"]},"offset":"19699187"},"dissoc.js":{"size":37,"integrity":{"algorithm":"SHA256","hash":"bf6c3eee53c310992b79f75bade2a125748ca76f7bc1dbe9d642be277fb81e2e","blockSize":4194304,"blocks":["bf6c3eee53c310992b79f75bade2a125748ca76f7bc1dbe9d642be277fb81e2e"]},"offset":"19699360"},"dissocPath.js":{"size":37,"integrity":{"algorithm":"SHA256","hash":"bf6c3eee53c310992b79f75bade2a125748ca76f7bc1dbe9d642be277fb81e2e","blockSize":4194304,"blocks":["bf6c3eee53c310992b79f75bade2a125748ca76f7bc1dbe9d642be277fb81e2e"]},"offset":"19699397"},"divide.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"5fa3fecf96ef96145ee0c5fe1d52e601de4b6255b1e122ca545ed4747297f698","blockSize":4194304,"blocks":["5fa3fecf96ef96145ee0c5fe1d52e601de4b6255b1e122ca545ed4747297f698"]},"offset":"19699434"},"drop.js":{"size":153,"integrity":{"algorithm":"SHA256","hash":"6d1cd4b4cdb19f922615ed2b93bfae015a1e28cf3f6c2ef8a0c1ca6a7c789c1a","blockSize":4194304,"blocks":["6d1cd4b4cdb19f922615ed2b93bfae015a1e28cf3f6c2ef8a0c1ca6a7c789c1a"]},"offset":"19699591"},"dropLast.js":{"size":41,"integrity":{"algorithm":"SHA256","hash":"ddbc9ff9032a3f2d4dc7acdad90556192faed016c8c7643e681dae25b214f1ac","blockSize":4194304,"blocks":["ddbc9ff9032a3f2d4dc7acdad90556192faed016c8c7643e681dae25b214f1ac"]},"offset":"19699744"},"dropLastWhile.js":{"size":46,"integrity":{"algorithm":"SHA256","hash":"f14137831acb9ab26f55795a3ef0f597e6da6c17f8f65e09efbc7341a5d3b8ab","blockSize":4194304,"blocks":["f14137831acb9ab26f55795a3ef0f597e6da6c17f8f65e09efbc7341a5d3b8ab"]},"offset":"19699785"},"dropRight.js":{"size":163,"integrity":{"algorithm":"SHA256","hash":"aae1becd1f4910b2a351c67cd85a3d4c4ba0c04e9edd110d1e502ad569a0278f","blockSize":4194304,"blocks":["aae1becd1f4910b2a351c67cd85a3d4c4ba0c04e9edd110d1e502ad569a0278f"]},"offset":"19699831"},"dropRightWhile.js":{"size":173,"integrity":{"algorithm":"SHA256","hash":"b136159cde098f7a33458a71e1d74a4ee8f2d8db41ed1cdafd95f098d502fc62","blockSize":4194304,"blocks":["b136159cde098f7a33458a71e1d74a4ee8f2d8db41ed1cdafd95f098d502fc62"]},"offset":"19699994"},"dropWhile.js":{"size":163,"integrity":{"algorithm":"SHA256","hash":"18efda66ef552f065e35cb78506d74a3fb46b5dee7578918dadba8b40521c838","blockSize":4194304,"blocks":["18efda66ef552f065e35cb78506d74a3fb46b5dee7578918dadba8b40521c838"]},"offset":"19700167"},"each.js":{"size":39,"integrity":{"algorithm":"SHA256","hash":"4d10bb01d04d58517504ecce768fce382a54fd93f5b04e6f649448af7978ee42","blockSize":4194304,"blocks":["4d10bb01d04d58517504ecce768fce382a54fd93f5b04e6f649448af7978ee42"]},"offset":"19700330"},"eachRight.js":{"size":44,"integrity":{"algorithm":"SHA256","hash":"b231b46d2a636cd4e876773316d1bf20fb252ecbffb9a5032c22cbdb2dad822d","blockSize":4194304,"blocks":["b231b46d2a636cd4e876773316d1bf20fb252ecbffb9a5032c22cbdb2dad822d"]},"offset":"19700369"},"endsWith.js":{"size":161,"integrity":{"algorithm":"SHA256","hash":"626510e077c799d7382c7efa6fb8cfbc8b0829b6d309f6a704f677aa45329c5f","blockSize":4194304,"blocks":["626510e077c799d7382c7efa6fb8cfbc8b0829b6d309f6a704f677aa45329c5f"]},"offset":"19700413"},"entries.js":{"size":39,"integrity":{"algorithm":"SHA256","hash":"613eb0b14a3fdf90ad901dc8860aa7f77d752efc8d887a8df246be91501945da","blockSize":4194304,"blocks":["613eb0b14a3fdf90ad901dc8860aa7f77d752efc8d887a8df246be91501945da"]},"offset":"19700574"},"entriesIn.js":{"size":41,"integrity":{"algorithm":"SHA256","hash":"963f4202340184bf129c8111fd1958b1ce3a535a760aaff2929347d2774a7ccf","blockSize":4194304,"blocks":["963f4202340184bf129c8111fd1958b1ce3a535a760aaff2929347d2774a7ccf"]},"offset":"19700613"},"eq.js":{"size":149,"integrity":{"algorithm":"SHA256","hash":"09b050419f48e59eb294edc9d4cd2ea084b897559da7b338d5072376a4721f41","blockSize":4194304,"blocks":["09b050419f48e59eb294edc9d4cd2ea084b897559da7b338d5072376a4721f41"]},"offset":"19700654"},"equals.js":{"size":39,"integrity":{"algorithm":"SHA256","hash":"459e8cff66cdfd0674fc01b10380bf43790a5faddb503977e32ec6ccb5f3b4b9","blockSize":4194304,"blocks":["459e8cff66cdfd0674fc01b10380bf43790a5faddb503977e32ec6ccb5f3b4b9"]},"offset":"19700803"},"escape.js":{"size":185,"integrity":{"algorithm":"SHA256","hash":"b527e7a4bb66081b3c5ec02b8ead2791783841c75a9ac2b804c4eff08291557c","blockSize":4194304,"blocks":["b527e7a4bb66081b3c5ec02b8ead2791783841c75a9ac2b804c4eff08291557c"]},"offset":"19700842"},"escapeRegExp.js":{"size":197,"integrity":{"algorithm":"SHA256","hash":"a2f2abcfc549830052ec8c9feb542afdd66183f2c840a7ece0314575993f0673","blockSize":4194304,"blocks":["a2f2abcfc549830052ec8c9feb542afdd66183f2c840a7ece0314575993f0673"]},"offset":"19701027"},"every.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"4be27ebd258ab25e6be6d0afbe81bde71ce8c1d0a298481eb37e466210ac6951","blockSize":4194304,"blocks":["4be27ebd258ab25e6be6d0afbe81bde71ce8c1d0a298481eb37e466210ac6951"]},"offset":"19701224"},"extend.js":{"size":40,"integrity":{"algorithm":"SHA256","hash":"32a68951279d8b57c741ab487b5eef543394c802e30f95b0f68d44e366db8aef","blockSize":4194304,"blocks":["32a68951279d8b57c741ab487b5eef543394c802e30f95b0f68d44e366db8aef"]},"offset":"19701379"},"extendAll.js":{"size":43,"integrity":{"algorithm":"SHA256","hash":"0a6f41c2dc6e849deebfdef96fd3cbef54d5407d6a2c5984dc0a7be8a4c8b7df","blockSize":4194304,"blocks":["0a6f41c2dc6e849deebfdef96fd3cbef54d5407d6a2c5984dc0a7be8a4c8b7df"]},"offset":"19701419"},"extendAllWith.js":{"size":47,"integrity":{"algorithm":"SHA256","hash":"c52793a010ef4a0740578c3034a05f85bd4eb7f2cabe7ecd0df6381c2e2c07d9","blockSize":4194304,"blocks":["c52793a010ef4a0740578c3034a05f85bd4eb7f2cabe7ecd0df6381c2e2c07d9"]},"offset":"19701462"},"extendWith.js":{"size":44,"integrity":{"algorithm":"SHA256","hash":"1b2704465ff3abb01d67ae8a2315c3bbaf0c386863886c03343c219bb02cc5a8","blockSize":4194304,"blocks":["1b2704465ff3abb01d67ae8a2315c3bbaf0c386863886c03343c219bb02cc5a8"]},"offset":"19701509"},"fill.js":{"size":153,"integrity":{"algorithm":"SHA256","hash":"d2a2c3f1079c65b7e24929c9cb56ff082c652657f88499bd4b15c2d93b1302fe","blockSize":4194304,"blocks":["d2a2c3f1079c65b7e24929c9cb56ff082c652657f88499bd4b15c2d93b1302fe"]},"offset":"19701553"},"filter.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"b9d6d6593908448f97a3329ca851aae760dbccf1a7fb037e800aa14129835db1","blockSize":4194304,"blocks":["b9d6d6593908448f97a3329ca851aae760dbccf1a7fb037e800aa14129835db1"]},"offset":"19701706"},"find.js":{"size":153,"integrity":{"algorithm":"SHA256","hash":"8a1f76bee162c12db677b0d985443a15895f172662ff58c721cdcb6ec75d2188","blockSize":4194304,"blocks":["8a1f76bee162c12db677b0d985443a15895f172662ff58c721cdcb6ec75d2188"]},"offset":"19701863"},"findFrom.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"df9f36dd443ce00791a49d16d450b3e85f3e36cc965942a028be700d43f60c4f","blockSize":4194304,"blocks":["df9f36dd443ce00791a49d16d450b3e85f3e36cc965942a028be700d43f60c4f"]},"offset":"19702016"},"findIndex.js":{"size":163,"integrity":{"algorithm":"SHA256","hash":"17adb306471f2db5a159722e002bdd95705400272ee1e0ab6d0af5900a87b0c9","blockSize":4194304,"blocks":["17adb306471f2db5a159722e002bdd95705400272ee1e0ab6d0af5900a87b0c9"]},"offset":"19702173"},"findIndexFrom.js":{"size":167,"integrity":{"algorithm":"SHA256","hash":"d175d9a7f616dca106c6a9dd52f3ef527b652c07a5ba004b926de133a50ea901","blockSize":4194304,"blocks":["d175d9a7f616dca106c6a9dd52f3ef527b652c07a5ba004b926de133a50ea901"]},"offset":"19702336"},"findKey.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"f33efae4ce7cbf889df52bd460771230f25dc861ba567e4bf21819e3c42c8011","blockSize":4194304,"blocks":["f33efae4ce7cbf889df52bd460771230f25dc861ba567e4bf21819e3c42c8011"]},"offset":"19702503"},"findLast.js":{"size":161,"integrity":{"algorithm":"SHA256","hash":"51b4f7733659d7c48a03f91d329de7dbe5070ef3a49b12e898b708d21bdef27c","blockSize":4194304,"blocks":["51b4f7733659d7c48a03f91d329de7dbe5070ef3a49b12e898b708d21bdef27c"]},"offset":"19702662"},"findLastFrom.js":{"size":165,"integrity":{"algorithm":"SHA256","hash":"76e952a6eeaaf1f1a49c17ecf2d32477a860ab81457750df5be0d20e18d29384","blockSize":4194304,"blocks":["76e952a6eeaaf1f1a49c17ecf2d32477a860ab81457750df5be0d20e18d29384"]},"offset":"19702823"},"findLastIndex.js":{"size":171,"integrity":{"algorithm":"SHA256","hash":"203df015697c5bc93fa108dd73cfb8870ce11cf8341ea102bb7b3b7e877fd955","blockSize":4194304,"blocks":["203df015697c5bc93fa108dd73cfb8870ce11cf8341ea102bb7b3b7e877fd955"]},"offset":"19702988"},"findLastIndexFrom.js":{"size":175,"integrity":{"algorithm":"SHA256","hash":"e00a3ac404ee4fc61917ba907abfcb32cae08cdce13831e202e63d90dc04aa8c","blockSize":4194304,"blocks":["e00a3ac404ee4fc61917ba907abfcb32cae08cdce13831e202e63d90dc04aa8c"]},"offset":"19703159"},"findLastKey.js":{"size":167,"integrity":{"algorithm":"SHA256","hash":"f5c703ee9eab5479f46482adc9b0ba51e926a1aa492edddef3c0acba46cb5484","blockSize":4194304,"blocks":["f5c703ee9eab5479f46482adc9b0ba51e926a1aa492edddef3c0acba46cb5484"]},"offset":"19703334"},"first.js":{"size":36,"integrity":{"algorithm":"SHA256","hash":"96a23a435507782b9ee4cbc1d3312f9f2617a40e9bd1b7af838185f40feef657","blockSize":4194304,"blocks":["96a23a435507782b9ee4cbc1d3312f9f2617a40e9bd1b7af838185f40feef657"]},"offset":"19703501"},"flatMap.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"908ce3c654d6249af03c795cf037c9b8901159084eb043242464786efbaccfe9","blockSize":4194304,"blocks":["908ce3c654d6249af03c795cf037c9b8901159084eb043242464786efbaccfe9"]},"offset":"19703537"},"flatMapDeep.js":{"size":167,"integrity":{"algorithm":"SHA256","hash":"7cf85bbe9249be63139f5a97f14daec0a489ffc5ee420afbc561f246f737da2d","blockSize":4194304,"blocks":["7cf85bbe9249be63139f5a97f14daec0a489ffc5ee420afbc561f246f737da2d"]},"offset":"19703696"},"flatMapDepth.js":{"size":169,"integrity":{"algorithm":"SHA256","hash":"49be55e2c877b5bd6ee90357b05ac5ebfa21f731e8db74644491051c52225dc3","blockSize":4194304,"blocks":["49be55e2c877b5bd6ee90357b05ac5ebfa21f731e8db74644491051c52225dc3"]},"offset":"19703863"},"flatten.js":{"size":187,"integrity":{"algorithm":"SHA256","hash":"7ddaebb042a17fc47e5339d2ee46757bb49c7da016eb164414b687fd5aba5450","blockSize":4194304,"blocks":["7ddaebb042a17fc47e5339d2ee46757bb49c7da016eb164414b687fd5aba5450"]},"offset":"19704032"},"flattenDeep.js":{"size":195,"integrity":{"algorithm":"SHA256","hash":"74a11dd4962aae026fc14d93117dee82d8c22319b1b1b2aeaf286288e7f9b865","blockSize":4194304,"blocks":["74a11dd4962aae026fc14d93117dee82d8c22319b1b1b2aeaf286288e7f9b865"]},"offset":"19704219"},"flattenDepth.js":{"size":169,"integrity":{"algorithm":"SHA256","hash":"b77d8dc285660b6c5afa5182bb9ffa8b95e5a6ac6dbbbf39bd0d57722a5aa896","blockSize":4194304,"blocks":["b77d8dc285660b6c5afa5182bb9ffa8b95e5a6ac6dbbbf39bd0d57722a5aa896"]},"offset":"19704414"},"flip.js":{"size":181,"integrity":{"algorithm":"SHA256","hash":"62a880389bafa6562a4e256acd1c9a8779dfaf7e13f7284468dd040ec6835f61","blockSize":4194304,"blocks":["62a880389bafa6562a4e256acd1c9a8779dfaf7e13f7284468dd040ec6835f61"]},"offset":"19704583"},"floor.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"2aeea71d6e7d83c1c8012a163add17755fb9e79ce1e8b96f965f95d482bf0a71","blockSize":4194304,"blocks":["2aeea71d6e7d83c1c8012a163add17755fb9e79ce1e8b96f965f95d482bf0a71"]},"offset":"19704764"},"flow.js":{"size":153,"integrity":{"algorithm":"SHA256","hash":"51ff8f71dff294f16ae459fd57c166795036696c76074bdfe5e9f852777be6eb","blockSize":4194304,"blocks":["51ff8f71dff294f16ae459fd57c166795036696c76074bdfe5e9f852777be6eb"]},"offset":"19704919"},"flowRight.js":{"size":163,"integrity":{"algorithm":"SHA256","hash":"3f1988a89d1a865d0c42d0c846c1802e67f016b431552212795cd9c3aab1977a","blockSize":4194304,"blocks":["3f1988a89d1a865d0c42d0c846c1802e67f016b431552212795cd9c3aab1977a"]},"offset":"19705072"},"forEach.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"1a9972ed328472f45e990cb2b4346d664f3326218bf1e8c0ce1708f4cfe4253d","blockSize":4194304,"blocks":["1a9972ed328472f45e990cb2b4346d664f3326218bf1e8c0ce1708f4cfe4253d"]},"offset":"19705235"},"forEachRight.js":{"size":169,"integrity":{"algorithm":"SHA256","hash":"d7fb9626e5576a8b4b9809d49fb3046891505b23d67f734a3b877f860ec9e2cb","blockSize":4194304,"blocks":["d7fb9626e5576a8b4b9809d49fb3046891505b23d67f734a3b877f860ec9e2cb"]},"offset":"19705394"},"forIn.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"f1a2a643a79a755ee4037ab11c8e79546f5e4c873dcc6466136d692357e9d033","blockSize":4194304,"blocks":["f1a2a643a79a755ee4037ab11c8e79546f5e4c873dcc6466136d692357e9d033"]},"offset":"19705563"},"forInRight.js":{"size":165,"integrity":{"algorithm":"SHA256","hash":"36909b67f0ca0e23ad692a9fa7803268e7a65178a26093780a753e8555dcfbfb","blockSize":4194304,"blocks":["36909b67f0ca0e23ad692a9fa7803268e7a65178a26093780a753e8555dcfbfb"]},"offset":"19705718"},"forOwn.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"1a52947c8056c2db4dd67a65c17ec471288317a3fa9c30e44d446e823d602fd2","blockSize":4194304,"blocks":["1a52947c8056c2db4dd67a65c17ec471288317a3fa9c30e44d446e823d602fd2"]},"offset":"19705883"},"forOwnRight.js":{"size":167,"integrity":{"algorithm":"SHA256","hash":"16c4b1531c14385c60b4c3c0d8d5a1b1616e565981875ff4a9d5cabfbda4f197","blockSize":4194304,"blocks":["16c4b1531c14385c60b4c3c0d8d5a1b1616e565981875ff4a9d5cabfbda4f197"]},"offset":"19706040"},"fromPairs.js":{"size":163,"integrity":{"algorithm":"SHA256","hash":"e705307e3fb6f3bf342323e64b8f6c721206a0612d3e4ffe42790f8e92d66a37","blockSize":4194304,"blocks":["e705307e3fb6f3bf342323e64b8f6c721206a0612d3e4ffe42790f8e92d66a37"]},"offset":"19706207"},"function.js":{"size":86,"integrity":{"algorithm":"SHA256","hash":"bf846ce6eaf001344d155d1977e95b02574e732af396dd6427edd90ddee90f51","blockSize":4194304,"blocks":["bf846ce6eaf001344d155d1977e95b02574e732af396dd6427edd90ddee90f51"]},"offset":"19706370"},"functions.js":{"size":191,"integrity":{"algorithm":"SHA256","hash":"3d05e73466020396cc66b747635858316a99e37a8b6bc89313d3a34db1030e1a","blockSize":4194304,"blocks":["3d05e73466020396cc66b747635858316a99e37a8b6bc89313d3a34db1030e1a"]},"offset":"19706456"},"functionsIn.js":{"size":195,"integrity":{"algorithm":"SHA256","hash":"8ddca62cda22513347991c5bfb5e26a362999cbc964ab6eba0da2e9f59ade0eb","blockSize":4194304,"blocks":["8ddca62cda22513347991c5bfb5e26a362999cbc964ab6eba0da2e9f59ade0eb"]},"offset":"19706647"},"get.js":{"size":151,"integrity":{"algorithm":"SHA256","hash":"8c76482ff0b4e7021bcb55abe467cd206ef385fd53bd6cd64240b4acb29fa5db","blockSize":4194304,"blocks":["8c76482ff0b4e7021bcb55abe467cd206ef385fd53bd6cd64240b4acb29fa5db"]},"offset":"19706842"},"getOr.js":{"size":153,"integrity":{"algorithm":"SHA256","hash":"a52df81dc858fc65d9b6ba7ee8244a8abf2436060e6a84f0ed9b539f58b1f055","blockSize":4194304,"blocks":["a52df81dc858fc65d9b6ba7ee8244a8abf2436060e6a84f0ed9b539f58b1f055"]},"offset":"19706993"},"groupBy.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"a72fd681abc6037675cd84cdada641301baf46354df008e4381288e6f9d01fd6","blockSize":4194304,"blocks":["a72fd681abc6037675cd84cdada641301baf46354df008e4381288e6f9d01fd6"]},"offset":"19707146"},"gt.js":{"size":149,"integrity":{"algorithm":"SHA256","hash":"178f4031b2533d7ed0ed099939566e3a1d7e1cb4b35b35d72a9d3bf7f9f1e61f","blockSize":4194304,"blocks":["178f4031b2533d7ed0ed099939566e3a1d7e1cb4b35b35d72a9d3bf7f9f1e61f"]},"offset":"19707305"},"gte.js":{"size":151,"integrity":{"algorithm":"SHA256","hash":"b5d145f13a3540a7b8ee82e5a24144f4110100c4e1ce776067fe6855a6fc7323","blockSize":4194304,"blocks":["b5d145f13a3540a7b8ee82e5a24144f4110100c4e1ce776067fe6855a6fc7323"]},"offset":"19707454"},"has.js":{"size":151,"integrity":{"algorithm":"SHA256","hash":"50733a4c36840a3acd55abc9cf81f162e7bf4d472e55100f63584887391a8604","blockSize":4194304,"blocks":["50733a4c36840a3acd55abc9cf81f162e7bf4d472e55100f63584887391a8604"]},"offset":"19707605"},"hasIn.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"52a3f58bd2b75ebafdbdd8fa0a7d5d06ae70fb4983b81542bef4631f1c4c749a","blockSize":4194304,"blocks":["52a3f58bd2b75ebafdbdd8fa0a7d5d06ae70fb4983b81542bef4631f1c4c749a"]},"offset":"19707756"},"head.js":{"size":181,"integrity":{"algorithm":"SHA256","hash":"560347db509835ed8c857be54a86c62e2a6b059ffcfe0715902d5a5c1c53798f","blockSize":4194304,"blocks":["560347db509835ed8c857be54a86c62e2a6b059ffcfe0715902d5a5c1c53798f"]},"offset":"19707911"},"identical.js":{"size":34,"integrity":{"algorithm":"SHA256","hash":"e74967099de92c10dc080e2d4546bd15fa5181fb8abc10c76ef80666e4867254","blockSize":4194304,"blocks":["e74967099de92c10dc080e2d4546bd15fa5181fb8abc10c76ef80666e4867254"]},"offset":"19708092"},"identity.js":{"size":189,"integrity":{"algorithm":"SHA256","hash":"f4589424964159bc9e22129ccf6677607d8de2e4c87665a3dbe6cc55a9b915e9","blockSize":4194304,"blocks":["f4589424964159bc9e22129ccf6677607d8de2e4c87665a3dbe6cc55a9b915e9"]},"offset":"19708126"},"inRange.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"9ff2447831272b36c7b5c1f4e4089442f663bbc5c40a4946a00f1702cea1bb25","blockSize":4194304,"blocks":["9ff2447831272b36c7b5c1f4e4089442f663bbc5c40a4946a00f1702cea1bb25"]},"offset":"19708315"},"includes.js":{"size":161,"integrity":{"algorithm":"SHA256","hash":"b9d0f380d0a0833f1e8d7db446fc2a47310402805537b530e19fd00b55bf687f","blockSize":4194304,"blocks":["b9d0f380d0a0833f1e8d7db446fc2a47310402805537b530e19fd00b55bf687f"]},"offset":"19708474"},"includesFrom.js":{"size":165,"integrity":{"algorithm":"SHA256","hash":"13b36c0d96553e3063b6f823a36d7bc5012b47d8317127f7f2516183b4aa165c","blockSize":4194304,"blocks":["13b36c0d96553e3063b6f823a36d7bc5012b47d8317127f7f2516183b4aa165c"]},"offset":"19708635"},"indexBy.js":{"size":37,"integrity":{"algorithm":"SHA256","hash":"f0e704ef2654ab460e6dc41d6aefcdbe3410ba2d6a026d898ef7b2fe9dfac9e7","blockSize":4194304,"blocks":["f0e704ef2654ab460e6dc41d6aefcdbe3410ba2d6a026d898ef7b2fe9dfac9e7"]},"offset":"19708800"},"indexOf.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"82a32593a87fef26207272693e91ac50b55c6e54d6f91185549df78151d10982","blockSize":4194304,"blocks":["82a32593a87fef26207272693e91ac50b55c6e54d6f91185549df78151d10982"]},"offset":"19708837"},"indexOfFrom.js":{"size":163,"integrity":{"algorithm":"SHA256","hash":"56bbbd5bdb4d183891625f8b5ba65ecb13a084656daf282dfda883cc92c39b92","blockSize":4194304,"blocks":["56bbbd5bdb4d183891625f8b5ba65ecb13a084656daf282dfda883cc92c39b92"]},"offset":"19708996"},"init.js":{"size":39,"integrity":{"algorithm":"SHA256","hash":"2f36883180bcf405ec646cb9a62cd21d03b059b762fa06f6460f4f3fb6f65ba4","blockSize":4194304,"blocks":["2f36883180bcf405ec646cb9a62cd21d03b059b762fa06f6460f4f3fb6f65ba4"]},"offset":"19709159"},"initial.js":{"size":187,"integrity":{"algorithm":"SHA256","hash":"f1bf90da3ca04bd624478f3fff13c85e10ed80aea64c0dedb12f79ce6b9e48f4","blockSize":4194304,"blocks":["f1bf90da3ca04bd624478f3fff13c85e10ed80aea64c0dedb12f79ce6b9e48f4"]},"offset":"19709198"},"intersection.js":{"size":169,"integrity":{"algorithm":"SHA256","hash":"9c2c2cb961158c22e77ed1fd7569f3d5d8b28f4581e93e7c94b10c5e004c044a","blockSize":4194304,"blocks":["9c2c2cb961158c22e77ed1fd7569f3d5d8b28f4581e93e7c94b10c5e004c044a"]},"offset":"19709385"},"intersectionBy.js":{"size":173,"integrity":{"algorithm":"SHA256","hash":"3891ed02f79ecf3677369b59aa3b9f5b5f27be42c16e71c85d2b028f733ddbfc","blockSize":4194304,"blocks":["3891ed02f79ecf3677369b59aa3b9f5b5f27be42c16e71c85d2b028f733ddbfc"]},"offset":"19709554"},"intersectionWith.js":{"size":177,"integrity":{"algorithm":"SHA256","hash":"9c9116e9d7a559065ab1f1c70772f58daf21ab01693a658563abecd3969f18aa","blockSize":4194304,"blocks":["9c9116e9d7a559065ab1f1c70772f58daf21ab01693a658563abecd3969f18aa"]},"offset":"19709727"},"invert.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"21c16af0fc0fead90ba187903f91204c487a437b2d03ee1d0e15e1da24c9348d","blockSize":4194304,"blocks":["21c16af0fc0fead90ba187903f91204c487a437b2d03ee1d0e15e1da24c9348d"]},"offset":"19709904"},"invertBy.js":{"size":161,"integrity":{"algorithm":"SHA256","hash":"cb224c37537fbbde9f9f2ba300aa85e5ddf94416a8a88bf54177de997e46cf64","blockSize":4194304,"blocks":["cb224c37537fbbde9f9f2ba300aa85e5ddf94416a8a88bf54177de997e46cf64"]},"offset":"19710061"},"invertObj.js":{"size":38,"integrity":{"algorithm":"SHA256","hash":"488ae0a4672612b06075443374e1e70704bc8ff8fed8c67746a03b7c48a20f68","blockSize":4194304,"blocks":["488ae0a4672612b06075443374e1e70704bc8ff8fed8c67746a03b7c48a20f68"]},"offset":"19710222"},"invoke.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"6ec88e3564475e7a6cca5b3e00e66754c076cdba270750b6af0959631df9da7d","blockSize":4194304,"blocks":["6ec88e3564475e7a6cca5b3e00e66754c076cdba270750b6af0959631df9da7d"]},"offset":"19710260"},"invokeArgs.js":{"size":161,"integrity":{"algorithm":"SHA256","hash":"b97fa28fe710fca8447e9a2e97f547617fcdd3e32fd4bdbb377e0e9fc85f428a","blockSize":4194304,"blocks":["b97fa28fe710fca8447e9a2e97f547617fcdd3e32fd4bdbb377e0e9fc85f428a"]},"offset":"19710417"},"invokeArgsMap.js":{"size":167,"integrity":{"algorithm":"SHA256","hash":"b380fd53d981d80b17cd7998b9d75d9780f1209dabd5dcf444f56391da6a5ebf","blockSize":4194304,"blocks":["b380fd53d981d80b17cd7998b9d75d9780f1209dabd5dcf444f56391da6a5ebf"]},"offset":"19710578"},"invokeMap.js":{"size":163,"integrity":{"algorithm":"SHA256","hash":"1ba3b295c861334cd7ce2467cdb212a3c2ee0a0589b67d092c6e19f984ec12f1","blockSize":4194304,"blocks":["1ba3b295c861334cd7ce2467cdb212a3c2ee0a0589b67d092c6e19f984ec12f1"]},"offset":"19710745"},"isArguments.js":{"size":195,"integrity":{"algorithm":"SHA256","hash":"8fb015f1e1e8bf853ae819f365f514d5d8fc00782dbee1a6db7ed62d9129ab28","blockSize":4194304,"blocks":["8fb015f1e1e8bf853ae819f365f514d5d8fc00782dbee1a6db7ed62d9129ab28"]},"offset":"19710908"},"isArray.js":{"size":187,"integrity":{"algorithm":"SHA256","hash":"9f78a004273d57468131fc7e7d4e2933c1676452c54fbce9767addaac71c1b16","blockSize":4194304,"blocks":["9f78a004273d57468131fc7e7d4e2933c1676452c54fbce9767addaac71c1b16"]},"offset":"19711103"},"isArrayBuffer.js":{"size":199,"integrity":{"algorithm":"SHA256","hash":"4d44a222bc4de22493cd34f05f1e43baf5946f9ae5b5fbd65a04a04544f84e91","blockSize":4194304,"blocks":["4d44a222bc4de22493cd34f05f1e43baf5946f9ae5b5fbd65a04a04544f84e91"]},"offset":"19711290"},"isArrayLike.js":{"size":195,"integrity":{"algorithm":"SHA256","hash":"1089895b13d838724a1b5beafb4892717ada15aa4813a248ecf564ee27334381","blockSize":4194304,"blocks":["1089895b13d838724a1b5beafb4892717ada15aa4813a248ecf564ee27334381"]},"offset":"19711489"},"isArrayLikeObject.js":{"size":207,"integrity":{"algorithm":"SHA256","hash":"1a8cd88fd9ce6767f8fd5e71ff4debb7f9472216d47d473eb322908a332bd30b","blockSize":4194304,"blocks":["1a8cd88fd9ce6767f8fd5e71ff4debb7f9472216d47d473eb322908a332bd30b"]},"offset":"19711684"},"isBoolean.js":{"size":191,"integrity":{"algorithm":"SHA256","hash":"52424314dce154e1615690d63cbaa259928ca36e16867db4125818f67340f460","blockSize":4194304,"blocks":["52424314dce154e1615690d63cbaa259928ca36e16867db4125818f67340f460"]},"offset":"19711891"},"isBuffer.js":{"size":189,"integrity":{"algorithm":"SHA256","hash":"98967f6b807df630b111919ac50c0df7acda7c355d6287221051bb88ccc8e1f6","blockSize":4194304,"blocks":["98967f6b807df630b111919ac50c0df7acda7c355d6287221051bb88ccc8e1f6"]},"offset":"19712082"},"isDate.js":{"size":185,"integrity":{"algorithm":"SHA256","hash":"257a78156f5be6e3f7c3cf97ea985b7442492b5559209118667b84954d63be51","blockSize":4194304,"blocks":["257a78156f5be6e3f7c3cf97ea985b7442492b5559209118667b84954d63be51"]},"offset":"19712271"},"isElement.js":{"size":191,"integrity":{"algorithm":"SHA256","hash":"791b6ec38da7be05e8b667a8b8ce26f0c438dd6c1d73e75ce51578f010c57271","blockSize":4194304,"blocks":["791b6ec38da7be05e8b667a8b8ce26f0c438dd6c1d73e75ce51578f010c57271"]},"offset":"19712456"},"isEmpty.js":{"size":187,"integrity":{"algorithm":"SHA256","hash":"d7fb0461b2c4b1bf6c03c2fe0e4f9da23278a9668da8e6c011079a7710ec6ff0","blockSize":4194304,"blocks":["d7fb0461b2c4b1bf6c03c2fe0e4f9da23278a9668da8e6c011079a7710ec6ff0"]},"offset":"19712647"},"isEqual.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"668454d1d39ebad5a2e6f5b395e012883d54ed67eb936058a7cac40b117d6f42","blockSize":4194304,"blocks":["668454d1d39ebad5a2e6f5b395e012883d54ed67eb936058a7cac40b117d6f42"]},"offset":"19712834"},"isEqualWith.js":{"size":167,"integrity":{"algorithm":"SHA256","hash":"4d3324a8644520a0d658f5894b20cf9e78db196cc37e4ab437e238641079e542","blockSize":4194304,"blocks":["4d3324a8644520a0d658f5894b20cf9e78db196cc37e4ab437e238641079e542"]},"offset":"19712993"},"isError.js":{"size":187,"integrity":{"algorithm":"SHA256","hash":"220777663a82b362054b93fcc87232b006e8e67cb1ed4debbb61e75c7f09fed2","blockSize":4194304,"blocks":["220777663a82b362054b93fcc87232b006e8e67cb1ed4debbb61e75c7f09fed2"]},"offset":"19713160"},"isFinite.js":{"size":189,"integrity":{"algorithm":"SHA256","hash":"0098a0eae5747e07538a461c94c0f334038fe468988dcd05b62fcd01a86fb064","blockSize":4194304,"blocks":["0098a0eae5747e07538a461c94c0f334038fe468988dcd05b62fcd01a86fb064"]},"offset":"19713347"},"isFunction.js":{"size":193,"integrity":{"algorithm":"SHA256","hash":"f2ebb795a59289a6de4972199a92da4efa3cfcf46509f6c52f432f5f9b95a7fe","blockSize":4194304,"blocks":["f2ebb795a59289a6de4972199a92da4efa3cfcf46509f6c52f432f5f9b95a7fe"]},"offset":"19713536"},"isInteger.js":{"size":191,"integrity":{"algorithm":"SHA256","hash":"45f072ab8b1984d33ce0873bac1baecd63fc2ec7718755da47df95aabd5de2b3","blockSize":4194304,"blocks":["45f072ab8b1984d33ce0873bac1baecd63fc2ec7718755da47df95aabd5de2b3"]},"offset":"19713729"},"isLength.js":{"size":189,"integrity":{"algorithm":"SHA256","hash":"f0b917e8f336d541a3f7659448557b351800608ebd038a5f77c898deb7b1d7f7","blockSize":4194304,"blocks":["f0b917e8f336d541a3f7659448557b351800608ebd038a5f77c898deb7b1d7f7"]},"offset":"19713920"},"isMap.js":{"size":183,"integrity":{"algorithm":"SHA256","hash":"ed963aa3d7feb5e06d0a45a4191a87a1c6f4393f1cfc55e7703b815cb593a502","blockSize":4194304,"blocks":["ed963aa3d7feb5e06d0a45a4191a87a1c6f4393f1cfc55e7703b815cb593a502"]},"offset":"19714109"},"isMatch.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"3ba262cb81d099cf6a1b5e6763cedbdca784d891191bd7e75d8ae5010338ce67","blockSize":4194304,"blocks":["3ba262cb81d099cf6a1b5e6763cedbdca784d891191bd7e75d8ae5010338ce67"]},"offset":"19714292"},"isMatchWith.js":{"size":167,"integrity":{"algorithm":"SHA256","hash":"2d143bffbd74768e6a9a11bde625ea497b57c2a5fe057f0df1f0b8a6450da20d","blockSize":4194304,"blocks":["2d143bffbd74768e6a9a11bde625ea497b57c2a5fe057f0df1f0b8a6450da20d"]},"offset":"19714451"},"isNaN.js":{"size":183,"integrity":{"algorithm":"SHA256","hash":"d88fb07773c4f9cac7e2ad02b9ba58b48343360c2587ff15793800065087c9ac","blockSize":4194304,"blocks":["d88fb07773c4f9cac7e2ad02b9ba58b48343360c2587ff15793800065087c9ac"]},"offset":"19714618"},"isNative.js":{"size":189,"integrity":{"algorithm":"SHA256","hash":"3d139b7ab45d81773ed74460b91a05cc0dc0762cd1aa3b41a79b7cae5346da48","blockSize":4194304,"blocks":["3d139b7ab45d81773ed74460b91a05cc0dc0762cd1aa3b41a79b7cae5346da48"]},"offset":"19714801"},"isNil.js":{"size":183,"integrity":{"algorithm":"SHA256","hash":"78d233a82248be68ae2eab8e64194ae453292ef7c03a98ec03d5b38c392305f2","blockSize":4194304,"blocks":["78d233a82248be68ae2eab8e64194ae453292ef7c03a98ec03d5b38c392305f2"]},"offset":"19714990"},"isNull.js":{"size":185,"integrity":{"algorithm":"SHA256","hash":"a79b315b284a789e62ac2f20de5130442d1dc82a830b693155194e0a1e65a1b8","blockSize":4194304,"blocks":["a79b315b284a789e62ac2f20de5130442d1dc82a830b693155194e0a1e65a1b8"]},"offset":"19715173"},"isNumber.js":{"size":189,"integrity":{"algorithm":"SHA256","hash":"d5ccc471595509d01e2e72f82f9b07539472b39b7a984bc077d5a7d0f0df355b","blockSize":4194304,"blocks":["d5ccc471595509d01e2e72f82f9b07539472b39b7a984bc077d5a7d0f0df355b"]},"offset":"19715358"},"isObject.js":{"size":189,"integrity":{"algorithm":"SHA256","hash":"2c020d0d6d9c6f92ef9ab81cc4f91ffb90e3dc9951d64b9a3fad3a9890104db7","blockSize":4194304,"blocks":["2c020d0d6d9c6f92ef9ab81cc4f91ffb90e3dc9951d64b9a3fad3a9890104db7"]},"offset":"19715547"},"isObjectLike.js":{"size":197,"integrity":{"algorithm":"SHA256","hash":"30c0702f4a1f479af27c2f94afd1ae502480fb665ed5cdf17abe0deb33c01457","blockSize":4194304,"blocks":["30c0702f4a1f479af27c2f94afd1ae502480fb665ed5cdf17abe0deb33c01457"]},"offset":"19715736"},"isPlainObject.js":{"size":199,"integrity":{"algorithm":"SHA256","hash":"737f412806a406308971b1453ac365190440fc08981feecbcc5b353db66695fc","blockSize":4194304,"blocks":["737f412806a406308971b1453ac365190440fc08981feecbcc5b353db66695fc"]},"offset":"19715933"},"isRegExp.js":{"size":189,"integrity":{"algorithm":"SHA256","hash":"d33e7c437fccc6770a1e4a7ec6c5e0eb952696ae27e710d77ea98123af491768","blockSize":4194304,"blocks":["d33e7c437fccc6770a1e4a7ec6c5e0eb952696ae27e710d77ea98123af491768"]},"offset":"19716132"},"isSafeInteger.js":{"size":199,"integrity":{"algorithm":"SHA256","hash":"4897a70f497abf7608452f8ce52e7db2491dde55488d02dfd8d8356e431d821e","blockSize":4194304,"blocks":["4897a70f497abf7608452f8ce52e7db2491dde55488d02dfd8d8356e431d821e"]},"offset":"19716321"},"isSet.js":{"size":183,"integrity":{"algorithm":"SHA256","hash":"5141cd3852d6067278106042eae42b1d49d58345815df6d0b4fbfbec7f9ca609","blockSize":4194304,"blocks":["5141cd3852d6067278106042eae42b1d49d58345815df6d0b4fbfbec7f9ca609"]},"offset":"19716520"},"isString.js":{"size":189,"integrity":{"algorithm":"SHA256","hash":"d733a33a3e009cfaca3cac3c1aeb33d4c7152021dc8dac8346709f4faf7c1cbd","blockSize":4194304,"blocks":["d733a33a3e009cfaca3cac3c1aeb33d4c7152021dc8dac8346709f4faf7c1cbd"]},"offset":"19716703"},"isSymbol.js":{"size":189,"integrity":{"algorithm":"SHA256","hash":"74d6d3f6bb0e5a510f0eab3750b27060dd51ab319ed56d1515eb3025caf64e54","blockSize":4194304,"blocks":["74d6d3f6bb0e5a510f0eab3750b27060dd51ab319ed56d1515eb3025caf64e54"]},"offset":"19716892"},"isTypedArray.js":{"size":197,"integrity":{"algorithm":"SHA256","hash":"6a33cdda203550e024bfe1330b2940eb25de924a387925b0a216d7f5f7233215","blockSize":4194304,"blocks":["6a33cdda203550e024bfe1330b2940eb25de924a387925b0a216d7f5f7233215"]},"offset":"19717081"},"isUndefined.js":{"size":195,"integrity":{"algorithm":"SHA256","hash":"94e6c10348ed9412b31e8d73b154201d5b1b15341241d252eead810a4071293c","blockSize":4194304,"blocks":["94e6c10348ed9412b31e8d73b154201d5b1b15341241d252eead810a4071293c"]},"offset":"19717278"},"isWeakMap.js":{"size":191,"integrity":{"algorithm":"SHA256","hash":"f2bf270d73f3674369c43e606add6fc34b11a7fdf7cc317c9e9d1aad8253bc45","blockSize":4194304,"blocks":["f2bf270d73f3674369c43e606add6fc34b11a7fdf7cc317c9e9d1aad8253bc45"]},"offset":"19717473"},"isWeakSet.js":{"size":191,"integrity":{"algorithm":"SHA256","hash":"b648e5a06f3e97d4b7bc9a29d53dfa428851b9817d9e492ee41020fe2005fed7","blockSize":4194304,"blocks":["b648e5a06f3e97d4b7bc9a29d53dfa428851b9817d9e492ee41020fe2005fed7"]},"offset":"19717664"},"iteratee.js":{"size":161,"integrity":{"algorithm":"SHA256","hash":"dfa7d1c5a8f2c517a7900ed31ffb92eace6044557eda9dc6e21c4f1e0a58bb19","blockSize":4194304,"blocks":["dfa7d1c5a8f2c517a7900ed31ffb92eace6044557eda9dc6e21c4f1e0a58bb19"]},"offset":"19717855"},"join.js":{"size":153,"integrity":{"algorithm":"SHA256","hash":"4e2d2124d8b9e7639c22a0e306a836403e5ba4a430321dda56011ea2be1d919e","blockSize":4194304,"blocks":["4e2d2124d8b9e7639c22a0e306a836403e5ba4a430321dda56011ea2be1d919e"]},"offset":"19718016"},"juxt.js":{"size":36,"integrity":{"algorithm":"SHA256","hash":"7930a9e0486c033831ad0c86f8f1ee10486d3970acee5d712c21141e7f8fd1c1","blockSize":4194304,"blocks":["7930a9e0486c033831ad0c86f8f1ee10486d3970acee5d712c21141e7f8fd1c1"]},"offset":"19718169"},"kebabCase.js":{"size":191,"integrity":{"algorithm":"SHA256","hash":"99b0709c4c2147b54d17e01c7f14e6355e61ae7112df9dbd7bc49963d5b93fff","blockSize":4194304,"blocks":["99b0709c4c2147b54d17e01c7f14e6355e61ae7112df9dbd7bc49963d5b93fff"]},"offset":"19718205"},"keyBy.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"89acb32368af06c3e7daf245d9649f808e9b7ea95d37c1462d98922094a55bbd","blockSize":4194304,"blocks":["89acb32368af06c3e7daf245d9649f808e9b7ea95d37c1462d98922094a55bbd"]},"offset":"19718396"},"keys.js":{"size":181,"integrity":{"algorithm":"SHA256","hash":"3680a10d7436e002a0014fb011c6aed82c3d81068ebb4722f145d8019beccafe","blockSize":4194304,"blocks":["3680a10d7436e002a0014fb011c6aed82c3d81068ebb4722f145d8019beccafe"]},"offset":"19718551"},"keysIn.js":{"size":185,"integrity":{"algorithm":"SHA256","hash":"22eb871424c95d9f33de0d606f92baef7742233980c8e6a36f57aab0be821c5e","blockSize":4194304,"blocks":["22eb871424c95d9f33de0d606f92baef7742233980c8e6a36f57aab0be821c5e"]},"offset":"19718732"},"lang.js":{"size":82,"integrity":{"algorithm":"SHA256","hash":"1420b2e4f75873a3082a2b278502b163876e59c1d877d733fe598c1c4fc702c9","blockSize":4194304,"blocks":["1420b2e4f75873a3082a2b278502b163876e59c1d877d733fe598c1c4fc702c9"]},"offset":"19718917"},"last.js":{"size":181,"integrity":{"algorithm":"SHA256","hash":"a92e6fb47ed90b27a863d486f2c50162917bb4b8e4837aedbd2a6597516cea2f","blockSize":4194304,"blocks":["a92e6fb47ed90b27a863d486f2c50162917bb4b8e4837aedbd2a6597516cea2f"]},"offset":"19718999"},"lastIndexOf.js":{"size":167,"integrity":{"algorithm":"SHA256","hash":"5cc5f373f6317b85e98b92f454175df1f16e73821120ab892e64c9d095ae0edd","blockSize":4194304,"blocks":["5cc5f373f6317b85e98b92f454175df1f16e73821120ab892e64c9d095ae0edd"]},"offset":"19719180"},"lastIndexOfFrom.js":{"size":171,"integrity":{"algorithm":"SHA256","hash":"3d5e3249aa1b985fdfb0fe3c3c4bcf3299ad926448087c64738cb5a76cc82f13","blockSize":4194304,"blocks":["3d5e3249aa1b985fdfb0fe3c3c4bcf3299ad926448087c64738cb5a76cc82f13"]},"offset":"19719347"},"lowerCase.js":{"size":191,"integrity":{"algorithm":"SHA256","hash":"0682bfdab9d314857ad56209acdcc49573fbb1f646bfd8a909147ee83d83bd53","blockSize":4194304,"blocks":["0682bfdab9d314857ad56209acdcc49573fbb1f646bfd8a909147ee83d83bd53"]},"offset":"19719518"},"lowerFirst.js":{"size":193,"integrity":{"algorithm":"SHA256","hash":"1d3fb88a75d26a0ed82e44a01845e4386d72208ac88253d5411c1ac03ed629f4","blockSize":4194304,"blocks":["1d3fb88a75d26a0ed82e44a01845e4386d72208ac88253d5411c1ac03ed629f4"]},"offset":"19719709"},"lt.js":{"size":149,"integrity":{"algorithm":"SHA256","hash":"38933af74c045b82cde125c6aff64f084b9e446683b11b12f5896a2ebad98152","blockSize":4194304,"blocks":["38933af74c045b82cde125c6aff64f084b9e446683b11b12f5896a2ebad98152"]},"offset":"19719902"},"lte.js":{"size":151,"integrity":{"algorithm":"SHA256","hash":"f8f754e9bad8026112c4f1f49b81d8d7ed7d510c2e142e13ce945af1dc6de302","blockSize":4194304,"blocks":["f8f754e9bad8026112c4f1f49b81d8d7ed7d510c2e142e13ce945af1dc6de302"]},"offset":"19720051"},"map.js":{"size":151,"integrity":{"algorithm":"SHA256","hash":"f8fa4e425b005aadd548a1bddb7ddf9a2804cf5f6133b617a38399d7139b921a","blockSize":4194304,"blocks":["f8fa4e425b005aadd548a1bddb7ddf9a2804cf5f6133b617a38399d7139b921a"]},"offset":"19720202"},"mapKeys.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"f04c9da9e2cd680401a38852e8615272429978c84ca00306c0a80547c892fc95","blockSize":4194304,"blocks":["f04c9da9e2cd680401a38852e8615272429978c84ca00306c0a80547c892fc95"]},"offset":"19720353"},"mapValues.js":{"size":163,"integrity":{"algorithm":"SHA256","hash":"8351e1ab568b29facb65230979d2e0ba4107df6aa8dba8ca2629e7fc471af93e","blockSize":4194304,"blocks":["8351e1ab568b29facb65230979d2e0ba4107df6aa8dba8ca2629e7fc471af93e"]},"offset":"19720512"},"matches.js":{"size":39,"integrity":{"algorithm":"SHA256","hash":"c148011a1334aad49cc4fa8700a5395794ca325cf2e0284c9853890311813ea0","blockSize":4194304,"blocks":["c148011a1334aad49cc4fa8700a5395794ca325cf2e0284c9853890311813ea0"]},"offset":"19720675"},"matchesProperty.js":{"size":175,"integrity":{"algorithm":"SHA256","hash":"5a36c1946ef23e1419c38cb1feb953bd80cbe04cce27581f459822ed728e2836","blockSize":4194304,"blocks":["5a36c1946ef23e1419c38cb1feb953bd80cbe04cce27581f459822ed728e2836"]},"offset":"19720714"},"math.js":{"size":82,"integrity":{"algorithm":"SHA256","hash":"77c6b066ff745c5433e347c90e3e4543b3a263373ead04b7b81b9d5ad221886f","blockSize":4194304,"blocks":["77c6b066ff745c5433e347c90e3e4543b3a263373ead04b7b81b9d5ad221886f"]},"offset":"19720889"},"max.js":{"size":179,"integrity":{"algorithm":"SHA256","hash":"17ec310091c1daed3477d7b515809231b0e347221e52b1e212b6688b40b155f3","blockSize":4194304,"blocks":["17ec310091c1daed3477d7b515809231b0e347221e52b1e212b6688b40b155f3"]},"offset":"19720971"},"maxBy.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"ab6aa422288be1f8b54bc55de4bc69b05a90f93683d82a3055a5b43d73e16461","blockSize":4194304,"blocks":["ab6aa422288be1f8b54bc55de4bc69b05a90f93683d82a3055a5b43d73e16461"]},"offset":"19721150"},"mean.js":{"size":181,"integrity":{"algorithm":"SHA256","hash":"b7e7d219af50932f91db708475c4e2cff820488aeee136b0a1fa130ef145f4e4","blockSize":4194304,"blocks":["b7e7d219af50932f91db708475c4e2cff820488aeee136b0a1fa130ef145f4e4"]},"offset":"19721305"},"meanBy.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"13e26dcec1f8ca909a317cdc2973f4b61ce3844929fbd28646bfa2cd6e1892fc","blockSize":4194304,"blocks":["13e26dcec1f8ca909a317cdc2973f4b61ce3844929fbd28646bfa2cd6e1892fc"]},"offset":"19721486"},"memoize.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"b044c71de1dd987d12b6b363dd4a1b3fc2d2529a3f5e71e70d4640f36dcbb4d1","blockSize":4194304,"blocks":["b044c71de1dd987d12b6b363dd4a1b3fc2d2529a3f5e71e70d4640f36dcbb4d1"]},"offset":"19721643"},"merge.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"2cdc105c7ec694c7cf6f51abd5807224d8479b9c7a5a83695e39ca3bc740c287","blockSize":4194304,"blocks":["2cdc105c7ec694c7cf6f51abd5807224d8479b9c7a5a83695e39ca3bc740c287"]},"offset":"19721802"},"mergeAll.js":{"size":158,"integrity":{"algorithm":"SHA256","hash":"59c3b8f860f8c570430d0f09ca7421d99f63465c9711627f0888aeb44f162406","blockSize":4194304,"blocks":["59c3b8f860f8c570430d0f09ca7421d99f63465c9711627f0888aeb44f162406"]},"offset":"19721957"},"mergeAllWith.js":{"size":166,"integrity":{"algorithm":"SHA256","hash":"2b2d97dfc35ad56745d358695ba53875bce96ce97b2c883aab4c1a01d57dfeac","blockSize":4194304,"blocks":["2b2d97dfc35ad56745d358695ba53875bce96ce97b2c883aab4c1a01d57dfeac"]},"offset":"19722115"},"mergeWith.js":{"size":163,"integrity":{"algorithm":"SHA256","hash":"0835541a64594d2230cbc7af416319cf920a400a152106c3a82cce806ba40027","blockSize":4194304,"blocks":["0835541a64594d2230cbc7af416319cf920a400a152106c3a82cce806ba40027"]},"offset":"19722281"},"method.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"76d2d34ffecda91cc3ba257d5e6e8cecb91cc4d25693bb17a288a914263cae66","blockSize":4194304,"blocks":["76d2d34ffecda91cc3ba257d5e6e8cecb91cc4d25693bb17a288a914263cae66"]},"offset":"19722444"},"methodOf.js":{"size":161,"integrity":{"algorithm":"SHA256","hash":"b8a0f1af8c8f413b389b9a4865435e9e561baf9814a8358fb0c40d0e2772c881","blockSize":4194304,"blocks":["b8a0f1af8c8f413b389b9a4865435e9e561baf9814a8358fb0c40d0e2772c881"]},"offset":"19722601"},"min.js":{"size":179,"integrity":{"algorithm":"SHA256","hash":"6612945fd3295b741376311618708f2efca748d08ed385b573bcff3ff073e00b","blockSize":4194304,"blocks":["6612945fd3295b741376311618708f2efca748d08ed385b573bcff3ff073e00b"]},"offset":"19722762"},"minBy.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"7730beb9a37031b534c256a9b7af3838efe38d1338a5dfa92fcbda46171ef2e6","blockSize":4194304,"blocks":["7730beb9a37031b534c256a9b7af3838efe38d1338a5dfa92fcbda46171ef2e6"]},"offset":"19722941"},"mixin.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"42b46b05c155ff9bbd9b80075fdd3b10d469f7114f0464f6c86ed3f01a9dd5c0","blockSize":4194304,"blocks":["42b46b05c155ff9bbd9b80075fdd3b10d469f7114f0464f6c86ed3f01a9dd5c0"]},"offset":"19723096"},"multiply.js":{"size":161,"integrity":{"algorithm":"SHA256","hash":"395c7861875d1a03d0f345870c489a40c1d1dcb6f15df3b2328beb14be1ef071","blockSize":4194304,"blocks":["395c7861875d1a03d0f345870c489a40c1d1dcb6f15df3b2328beb14be1ef071"]},"offset":"19723251"},"nAry.js":{"size":35,"integrity":{"algorithm":"SHA256","hash":"717c257827cf65e692aa347b09b29db1903d65709f5dd9e3627f9ad64aa4efef","blockSize":4194304,"blocks":["717c257827cf65e692aa347b09b29db1903d65709f5dd9e3627f9ad64aa4efef"]},"offset":"19723412"},"negate.js":{"size":185,"integrity":{"algorithm":"SHA256","hash":"1a3c40352afe846515cd47bae19ddd23b7cdefe1788d950109145a860e9fb813","blockSize":4194304,"blocks":["1a3c40352afe846515cd47bae19ddd23b7cdefe1788d950109145a860e9fb813"]},"offset":"19723447"},"next.js":{"size":181,"integrity":{"algorithm":"SHA256","hash":"370a6f2baa9e5f485774e4002d89279bb4f12b16536dcabae84f1ed399d379e5","blockSize":4194304,"blocks":["370a6f2baa9e5f485774e4002d89279bb4f12b16536dcabae84f1ed399d379e5"]},"offset":"19723632"},"noop.js":{"size":181,"integrity":{"algorithm":"SHA256","hash":"1d2e9b4da5a167d47885675bb97ccfe811d7024b944053c87189bba29fd55bfa","blockSize":4194304,"blocks":["1d2e9b4da5a167d47885675bb97ccfe811d7024b944053c87189bba29fd55bfa"]},"offset":"19723813"},"now.js":{"size":179,"integrity":{"algorithm":"SHA256","hash":"7c403755403fafa4890b8c714065fcc6e890ab9cff89e9517bb68184f845c6f4","blockSize":4194304,"blocks":["7c403755403fafa4890b8c714065fcc6e890ab9cff89e9517bb68184f845c6f4"]},"offset":"19723994"},"nth.js":{"size":151,"integrity":{"algorithm":"SHA256","hash":"29bef88aba7393256d7f37cc3ed286ddbbf6c661aad411318c55ff86608092a8","blockSize":4194304,"blocks":["29bef88aba7393256d7f37cc3ed286ddbbf6c661aad411318c55ff86608092a8"]},"offset":"19724173"},"nthArg.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"28786a3d7ca78c4ac3b2fbbb02995c009016b8a0bde3833953244d0f6897f9d8","blockSize":4194304,"blocks":["28786a3d7ca78c4ac3b2fbbb02995c009016b8a0bde3833953244d0f6897f9d8"]},"offset":"19724324"},"number.js":{"size":84,"integrity":{"algorithm":"SHA256","hash":"6de44356b7c01f0ebd6dda9f6bc6a2e867375886e080d43a35e9d60d800a2074","blockSize":4194304,"blocks":["6de44356b7c01f0ebd6dda9f6bc6a2e867375886e080d43a35e9d60d800a2074"]},"offset":"19724481"},"object.js":{"size":84,"integrity":{"algorithm":"SHA256","hash":"29ba9750d3ba53f2fe0ec2da71974d22d15441086ac6fd0bc0bb3d03b728c822","blockSize":4194304,"blocks":["29ba9750d3ba53f2fe0ec2da71974d22d15441086ac6fd0bc0bb3d03b728c822"]},"offset":"19724565"},"omit.js":{"size":153,"integrity":{"algorithm":"SHA256","hash":"29ba4a605143bc400a967cf81a45942ea844d17ac3739ccbfbeae51040634acd","blockSize":4194304,"blocks":["29ba4a605143bc400a967cf81a45942ea844d17ac3739ccbfbeae51040634acd"]},"offset":"19724649"},"omitAll.js":{"size":36,"integrity":{"algorithm":"SHA256","hash":"8278a6048152232e98f1cfa0c489ef7afae26cde11debdd0ec3860e04aa79cb3","blockSize":4194304,"blocks":["8278a6048152232e98f1cfa0c489ef7afae26cde11debdd0ec3860e04aa79cb3"]},"offset":"19724802"},"omitBy.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"cd946abd42e086ff3b42010aabe2543daf7c3bd2dc9294bc5aff4e05931931d7","blockSize":4194304,"blocks":["cd946abd42e086ff3b42010aabe2543daf7c3bd2dc9294bc5aff4e05931931d7"]},"offset":"19724838"},"once.js":{"size":181,"integrity":{"algorithm":"SHA256","hash":"6ec976664cc855113c9675f11c06dbcc56fe7c38264c735122ef98338f125897","blockSize":4194304,"blocks":["6ec976664cc855113c9675f11c06dbcc56fe7c38264c735122ef98338f125897"]},"offset":"19724995"},"orderBy.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"23d10df3a9877cd1b48e31132b396b09ae48ba6c0a99a902c42a1be2e3a771f0","blockSize":4194304,"blocks":["23d10df3a9877cd1b48e31132b396b09ae48ba6c0a99a902c42a1be2e3a771f0"]},"offset":"19725176"},"over.js":{"size":153,"integrity":{"algorithm":"SHA256","hash":"799f8baa58124b8d128384f202d3c5d73d92f120787a90855779ff39f8490c00","blockSize":4194304,"blocks":["799f8baa58124b8d128384f202d3c5d73d92f120787a90855779ff39f8490c00"]},"offset":"19725335"},"overArgs.js":{"size":161,"integrity":{"algorithm":"SHA256","hash":"b16632f7ad0c5293d35c1cae4734ae2ed4242c62e31286bb1514d359c698f95e","blockSize":4194304,"blocks":["b16632f7ad0c5293d35c1cae4734ae2ed4242c62e31286bb1514d359c698f95e"]},"offset":"19725488"},"overEvery.js":{"size":163,"integrity":{"algorithm":"SHA256","hash":"4c758a15411ac5a74fac9ff0bce7d59df4eb2103f069389d8eec17cfbc104672","blockSize":4194304,"blocks":["4c758a15411ac5a74fac9ff0bce7d59df4eb2103f069389d8eec17cfbc104672"]},"offset":"19725649"},"overSome.js":{"size":161,"integrity":{"algorithm":"SHA256","hash":"2d3add594fb7bb2eb717ae0b7bf2856233e2d06b7bd0e7f05b9cd04aeec45749","blockSize":4194304,"blocks":["2d3add594fb7bb2eb717ae0b7bf2856233e2d06b7bd0e7f05b9cd04aeec45749"]},"offset":"19725812"},"pad.js":{"size":151,"integrity":{"algorithm":"SHA256","hash":"3717864a100e5c0c4824e8898fb78aaff375fd43392624c6051d702db7066f93","blockSize":4194304,"blocks":["3717864a100e5c0c4824e8898fb78aaff375fd43392624c6051d702db7066f93"]},"offset":"19725973"},"padChars.js":{"size":156,"integrity":{"algorithm":"SHA256","hash":"864f03b60b63f0b4361829087b129b5323e02b101f34d80d2fc0a07a458b5c4e","blockSize":4194304,"blocks":["864f03b60b63f0b4361829087b129b5323e02b101f34d80d2fc0a07a458b5c4e"]},"offset":"19726124"},"padCharsEnd.js":{"size":162,"integrity":{"algorithm":"SHA256","hash":"c2f9664d212d91db41261ac3403b6a2f12d9a129bea368b1ee38e06659f4be0a","blockSize":4194304,"blocks":["c2f9664d212d91db41261ac3403b6a2f12d9a129bea368b1ee38e06659f4be0a"]},"offset":"19726280"},"padCharsStart.js":{"size":166,"integrity":{"algorithm":"SHA256","hash":"de9ca597ab7b3c04216125b532260f78be5991493a23f08b40f7a19d370ea95b","blockSize":4194304,"blocks":["de9ca597ab7b3c04216125b532260f78be5991493a23f08b40f7a19d370ea95b"]},"offset":"19726442"},"padEnd.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"37f0edbb019754ba8333e71efba0d1bd9f2995c315b7e268f3682dc2093da795","blockSize":4194304,"blocks":["37f0edbb019754ba8333e71efba0d1bd9f2995c315b7e268f3682dc2093da795"]},"offset":"19726608"},"padStart.js":{"size":161,"integrity":{"algorithm":"SHA256","hash":"5e56241d6ca92788742527759fac2cd7ed6a282e178a1bcad5db62e9fcbdfa97","blockSize":4194304,"blocks":["5e56241d6ca92788742527759fac2cd7ed6a282e178a1bcad5db62e9fcbdfa97"]},"offset":"19726765"},"parseInt.js":{"size":161,"integrity":{"algorithm":"SHA256","hash":"ab4f79db34f3a071053464b7a73be3a9c8ec5fcc61f1692d107ddcf21bc80390","blockSize":4194304,"blocks":["ab4f79db34f3a071053464b7a73be3a9c8ec5fcc61f1692d107ddcf21bc80390"]},"offset":"19726926"},"partial.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"d6a4d4b539ccb521cda94cb2f73d94c5bd75fc1460f15a5b4e98afdd0bdd5db0","blockSize":4194304,"blocks":["d6a4d4b539ccb521cda94cb2f73d94c5bd75fc1460f15a5b4e98afdd0bdd5db0"]},"offset":"19727087"},"partialRight.js":{"size":169,"integrity":{"algorithm":"SHA256","hash":"4c2ee47a61f7c3a26c6db7e9c82e0727009ca6ab11233cdf4d029d827b35b54d","blockSize":4194304,"blocks":["4c2ee47a61f7c3a26c6db7e9c82e0727009ca6ab11233cdf4d029d827b35b54d"]},"offset":"19727246"},"partition.js":{"size":163,"integrity":{"algorithm":"SHA256","hash":"49e1e7a75cb69ece95044c696dccdc9cf935a761312c35c179af74da91f118d3","blockSize":4194304,"blocks":["49e1e7a75cb69ece95044c696dccdc9cf935a761312c35c179af74da91f118d3"]},"offset":"19727415"},"path.js":{"size":35,"integrity":{"algorithm":"SHA256","hash":"af3533640c8af8f6804e9df53cabeac7767cddf1a619236e7226a784a2e9101a","blockSize":4194304,"blocks":["af3533640c8af8f6804e9df53cabeac7767cddf1a619236e7226a784a2e9101a"]},"offset":"19727578"},"pathEq.js":{"size":47,"integrity":{"algorithm":"SHA256","hash":"e0d5e4b02fdb3d324aa5e10b951acdd185efd13f0d2fefbe3517c480ac84193b","blockSize":4194304,"blocks":["e0d5e4b02fdb3d324aa5e10b951acdd185efd13f0d2fefbe3517c480ac84193b"]},"offset":"19727613"},"pathOr.js":{"size":37,"integrity":{"algorithm":"SHA256","hash":"632ce7415594470bd7e1b3af48c916401e4f5c2a486536974a60f4a7dc3a10a8","blockSize":4194304,"blocks":["632ce7415594470bd7e1b3af48c916401e4f5c2a486536974a60f4a7dc3a10a8"]},"offset":"19727660"},"paths.js":{"size":34,"integrity":{"algorithm":"SHA256","hash":"a29f24c260492e76ea238aa68ebcb18806e6b4da1378a1703072f882f632251d","blockSize":4194304,"blocks":["a29f24c260492e76ea238aa68ebcb18806e6b4da1378a1703072f882f632251d"]},"offset":"19727697"},"pick.js":{"size":153,"integrity":{"algorithm":"SHA256","hash":"9210072d0a7110c9b9a9e9aa4c5d6885c3bc62cf22eaf2059f2c3f4fbfa6cdb2","blockSize":4194304,"blocks":["9210072d0a7110c9b9a9e9aa4c5d6885c3bc62cf22eaf2059f2c3f4fbfa6cdb2"]},"offset":"19727731"},"pickAll.js":{"size":36,"integrity":{"algorithm":"SHA256","hash":"ea2d0c68226ae4ad2aa504cb23468a03d329f02dd3cfdc029c4f486d4e2287df","blockSize":4194304,"blocks":["ea2d0c68226ae4ad2aa504cb23468a03d329f02dd3cfdc029c4f486d4e2287df"]},"offset":"19727884"},"pickBy.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"e7b5e1f39fea903a19b83b66e7e954e9d5282408ede77507d305a375ee664b04","blockSize":4194304,"blocks":["e7b5e1f39fea903a19b83b66e7e954e9d5282408ede77507d305a375ee664b04"]},"offset":"19727920"},"pipe.js":{"size":36,"integrity":{"algorithm":"SHA256","hash":"a1420273debc2c3788b93e9405e4372e60f49a0b417e32ca9516b8d38a69bc8c","blockSize":4194304,"blocks":["a1420273debc2c3788b93e9405e4372e60f49a0b417e32ca9516b8d38a69bc8c"]},"offset":"19728077"},"placeholder.js":{"size":105,"integrity":{"algorithm":"SHA256","hash":"0686224e4e0d3eef51f382dd106c88d2ab9a791739c78a3478e364f0668a01ca","blockSize":4194304,"blocks":["0686224e4e0d3eef51f382dd106c88d2ab9a791739c78a3478e364f0668a01ca"]},"offset":"19728113"},"plant.js":{"size":183,"integrity":{"algorithm":"SHA256","hash":"e05ffa6e15cafac47d3fc456dd8c92e911403bab60f8e09042fd1bda428a4b9d","blockSize":4194304,"blocks":["e05ffa6e15cafac47d3fc456dd8c92e911403bab60f8e09042fd1bda428a4b9d"]},"offset":"19728218"},"pluck.js":{"size":35,"integrity":{"algorithm":"SHA256","hash":"bd5b90167743a78b557de2f53815094af1f9fe67703fade95c62dec43e47535e","blockSize":4194304,"blocks":["bd5b90167743a78b557de2f53815094af1f9fe67703fade95c62dec43e47535e"]},"offset":"19728401"},"prop.js":{"size":35,"integrity":{"algorithm":"SHA256","hash":"af3533640c8af8f6804e9df53cabeac7767cddf1a619236e7226a784a2e9101a","blockSize":4194304,"blocks":["af3533640c8af8f6804e9df53cabeac7767cddf1a619236e7226a784a2e9101a"]},"offset":"19728436"},"propEq.js":{"size":47,"integrity":{"algorithm":"SHA256","hash":"e0d5e4b02fdb3d324aa5e10b951acdd185efd13f0d2fefbe3517c480ac84193b","blockSize":4194304,"blocks":["e0d5e4b02fdb3d324aa5e10b951acdd185efd13f0d2fefbe3517c480ac84193b"]},"offset":"19728471"},"propOr.js":{"size":37,"integrity":{"algorithm":"SHA256","hash":"632ce7415594470bd7e1b3af48c916401e4f5c2a486536974a60f4a7dc3a10a8","blockSize":4194304,"blocks":["632ce7415594470bd7e1b3af48c916401e4f5c2a486536974a60f4a7dc3a10a8"]},"offset":"19728518"},"property.js":{"size":35,"integrity":{"algorithm":"SHA256","hash":"af3533640c8af8f6804e9df53cabeac7767cddf1a619236e7226a784a2e9101a","blockSize":4194304,"blocks":["af3533640c8af8f6804e9df53cabeac7767cddf1a619236e7226a784a2e9101a"]},"offset":"19728555"},"propertyOf.js":{"size":158,"integrity":{"algorithm":"SHA256","hash":"759a154bf5b8e67ad3274f15d12bac048079e055f62b9fa27538e366ef32ea43","blockSize":4194304,"blocks":["759a154bf5b8e67ad3274f15d12bac048079e055f62b9fa27538e366ef32ea43"]},"offset":"19728590"},"props.js":{"size":34,"integrity":{"algorithm":"SHA256","hash":"a29f24c260492e76ea238aa68ebcb18806e6b4da1378a1703072f882f632251d","blockSize":4194304,"blocks":["a29f24c260492e76ea238aa68ebcb18806e6b4da1378a1703072f882f632251d"]},"offset":"19728748"},"pull.js":{"size":153,"integrity":{"algorithm":"SHA256","hash":"2c4de689a3eb62ac2f6debbb1f8159d30e42079b9f72cf4dc35b2ea18defdf0b","blockSize":4194304,"blocks":["2c4de689a3eb62ac2f6debbb1f8159d30e42079b9f72cf4dc35b2ea18defdf0b"]},"offset":"19728782"},"pullAll.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"5ab74f365a631229abbb23377331b36b3b11fc1f64776bf5b2c18709cfccd4ea","blockSize":4194304,"blocks":["5ab74f365a631229abbb23377331b36b3b11fc1f64776bf5b2c18709cfccd4ea"]},"offset":"19728935"},"pullAllBy.js":{"size":163,"integrity":{"algorithm":"SHA256","hash":"dd5efdc3a98ca91a7b2e42b967080b23baad420607a2cd097a4d0da8d7049c82","blockSize":4194304,"blocks":["dd5efdc3a98ca91a7b2e42b967080b23baad420607a2cd097a4d0da8d7049c82"]},"offset":"19729094"},"pullAllWith.js":{"size":167,"integrity":{"algorithm":"SHA256","hash":"9da6025ff2d017e40bc9dd98ff48b6aa371b0072c4cd1b7b2301a9ca18a9fd26","blockSize":4194304,"blocks":["9da6025ff2d017e40bc9dd98ff48b6aa371b0072c4cd1b7b2301a9ca18a9fd26"]},"offset":"19729257"},"pullAt.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"126d20046cce500d3f60ab2fafeb7fc8aad62e051ad6a3d188ea86cd74812d6d","blockSize":4194304,"blocks":["126d20046cce500d3f60ab2fafeb7fc8aad62e051ad6a3d188ea86cd74812d6d"]},"offset":"19729424"},"random.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"aa57b43c65460457e18bf044a388ba41d5f265f11047d3623d1fb975b66527fc","blockSize":4194304,"blocks":["aa57b43c65460457e18bf044a388ba41d5f265f11047d3623d1fb975b66527fc"]},"offset":"19729581"},"range.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"c84496a7bbc218f1f3b8f00cb0574f499cab44ce15208719c2a6e12098538cc8","blockSize":4194304,"blocks":["c84496a7bbc218f1f3b8f00cb0574f499cab44ce15208719c2a6e12098538cc8"]},"offset":"19729738"},"rangeRight.js":{"size":165,"integrity":{"algorithm":"SHA256","hash":"e54606ca2fa64707341c956e43fc2e0926037a5621bc98442987ca2fd5bcf6aa","blockSize":4194304,"blocks":["e54606ca2fa64707341c956e43fc2e0926037a5621bc98442987ca2fd5bcf6aa"]},"offset":"19729893"},"rangeStep.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"ca31a6c83cc1398b0ae4526da6bab406d1ab74e1a5882221d1c3008ee10a26c3","blockSize":4194304,"blocks":["ca31a6c83cc1398b0ae4526da6bab406d1ab74e1a5882221d1c3008ee10a26c3"]},"offset":"19730058"},"rangeStepRight.js":{"size":169,"integrity":{"algorithm":"SHA256","hash":"17ed1b75a3895e5a8821f0eea7ac5f39c6a41e08db5f7e065b16d645cfb0fcbd","blockSize":4194304,"blocks":["17ed1b75a3895e5a8821f0eea7ac5f39c6a41e08db5f7e065b16d645cfb0fcbd"]},"offset":"19730217"},"rearg.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"612d9c40ad7c389e64308819b5683a03a00969a544a077a6c3d27430ec5b0075","blockSize":4194304,"blocks":["612d9c40ad7c389e64308819b5683a03a00969a544a077a6c3d27430ec5b0075"]},"offset":"19730386"},"reduce.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"4b8e868a48492f0055a354f3a8f00e1e658877e5f8fc877b86be292904ac4638","blockSize":4194304,"blocks":["4b8e868a48492f0055a354f3a8f00e1e658877e5f8fc877b86be292904ac4638"]},"offset":"19730541"},"reduceRight.js":{"size":167,"integrity":{"algorithm":"SHA256","hash":"b38c62161adf5fe38e303e967c50fab284638424efb13e75ba6c158cd2600c49","blockSize":4194304,"blocks":["b38c62161adf5fe38e303e967c50fab284638424efb13e75ba6c158cd2600c49"]},"offset":"19730698"},"reject.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"800ef615683579c2cd45ede51c598f2b82d64848bff48a98c9d703bb00f72d3c","blockSize":4194304,"blocks":["800ef615683579c2cd45ede51c598f2b82d64848bff48a98c9d703bb00f72d3c"]},"offset":"19730865"},"remove.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"3062374a284b8278ecd15c09a687f47ea23944fff933211bcafe20f58669e8bc","blockSize":4194304,"blocks":["3062374a284b8278ecd15c09a687f47ea23944fff933211bcafe20f58669e8bc"]},"offset":"19731022"},"repeat.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"bb5ac1b0e02ae3154064171eb99e1edfaaf8babe02a413cbd77f90332a296398","blockSize":4194304,"blocks":["bb5ac1b0e02ae3154064171eb99e1edfaaf8babe02a413cbd77f90332a296398"]},"offset":"19731179"},"replace.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"5034ff1bb5748e0504e86571f489d5ab375500f210e81f8a9f8a373713d92538","blockSize":4194304,"blocks":["5034ff1bb5748e0504e86571f489d5ab375500f210e81f8a9f8a373713d92538"]},"offset":"19731336"},"rest.js":{"size":153,"integrity":{"algorithm":"SHA256","hash":"11e6f137887aee82ba2928104119849b30043ffe65d51b4e9c8651b56645fa19","blockSize":4194304,"blocks":["11e6f137887aee82ba2928104119849b30043ffe65d51b4e9c8651b56645fa19"]},"offset":"19731495"},"restFrom.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"4413d96017359453b794a4f22445f49227ea6ff7f7bc4a926c8cd86e704cba61","blockSize":4194304,"blocks":["4413d96017359453b794a4f22445f49227ea6ff7f7bc4a926c8cd86e704cba61"]},"offset":"19731648"},"result.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"bc708695ad723228f8e0602afd7ab945e0b46963463e0e534031a191efc99a5d","blockSize":4194304,"blocks":["bc708695ad723228f8e0602afd7ab945e0b46963463e0e534031a191efc99a5d"]},"offset":"19731805"},"reverse.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"1a4b3d92f98d7daca76488ffb964294628e97881af44752514f0f3559b9de4d3","blockSize":4194304,"blocks":["1a4b3d92f98d7daca76488ffb964294628e97881af44752514f0f3559b9de4d3"]},"offset":"19731962"},"round.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"8b082141b57415f7c2ecc20acc0af1f6940f13486f3296c18ed0365846f9dd53","blockSize":4194304,"blocks":["8b082141b57415f7c2ecc20acc0af1f6940f13486f3296c18ed0365846f9dd53"]},"offset":"19732121"},"sample.js":{"size":185,"integrity":{"algorithm":"SHA256","hash":"409fe1789fb11e86f22037e77a42c4ca2b226dabd6202b05946310d2b7bdb1ee","blockSize":4194304,"blocks":["409fe1789fb11e86f22037e77a42c4ca2b226dabd6202b05946310d2b7bdb1ee"]},"offset":"19732276"},"sampleSize.js":{"size":165,"integrity":{"algorithm":"SHA256","hash":"a343dc90ae4c2965ea65eaf67dacc015f6331ec5aec2f0617e7d7c00d14bb162","blockSize":4194304,"blocks":["a343dc90ae4c2965ea65eaf67dacc015f6331ec5aec2f0617e7d7c00d14bb162"]},"offset":"19732461"},"seq.js":{"size":81,"integrity":{"algorithm":"SHA256","hash":"1459db677d74ce8a55a8c84786384ee9d808990d88e1cc91932829abc9849d08","blockSize":4194304,"blocks":["1459db677d74ce8a55a8c84786384ee9d808990d88e1cc91932829abc9849d08"]},"offset":"19732626"},"set.js":{"size":151,"integrity":{"algorithm":"SHA256","hash":"e8b50ac79553763824fbca927c7f74817351b10521cac43715334da06246ed42","blockSize":4194304,"blocks":["e8b50ac79553763824fbca927c7f74817351b10521cac43715334da06246ed42"]},"offset":"19732707"},"setWith.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"b934610624c050f52604d7599b558bd4de4da3a9dbdbd1c6c0f57b2ffad91fb0","blockSize":4194304,"blocks":["b934610624c050f52604d7599b558bd4de4da3a9dbdbd1c6c0f57b2ffad91fb0"]},"offset":"19732858"},"shuffle.js":{"size":187,"integrity":{"algorithm":"SHA256","hash":"2bf2680e3fb93464aa8471bb897837453776196e23f3f8d755f42b20e330f68e","blockSize":4194304,"blocks":["2bf2680e3fb93464aa8471bb897837453776196e23f3f8d755f42b20e330f68e"]},"offset":"19733017"},"size.js":{"size":181,"integrity":{"algorithm":"SHA256","hash":"2779dff1dffb0e5a954234fe1e991d7f21e88de0f0603b48c68b933da407dcfc","blockSize":4194304,"blocks":["2779dff1dffb0e5a954234fe1e991d7f21e88de0f0603b48c68b933da407dcfc"]},"offset":"19733204"},"slice.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"35d674cf524295012acf221a0b08f3d74e5c1c9ac351d17457100f64df466dca","blockSize":4194304,"blocks":["35d674cf524295012acf221a0b08f3d74e5c1c9ac351d17457100f64df466dca"]},"offset":"19733385"},"snakeCase.js":{"size":191,"integrity":{"algorithm":"SHA256","hash":"b5a7ba201da4a53bf2c6a79abc3e611fc966286bdaade7525dc1d5714d4d860c","blockSize":4194304,"blocks":["b5a7ba201da4a53bf2c6a79abc3e611fc966286bdaade7525dc1d5714d4d860c"]},"offset":"19733540"},"some.js":{"size":153,"integrity":{"algorithm":"SHA256","hash":"03a8175c1521ab8872f54182938144c59059544f7d94b5501070d624620e9bdc","blockSize":4194304,"blocks":["03a8175c1521ab8872f54182938144c59059544f7d94b5501070d624620e9bdc"]},"offset":"19733731"},"sortBy.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"f537781271ebbe8249740dd9f25cee2766212ad46733c581564aa5cf574efb63","blockSize":4194304,"blocks":["f537781271ebbe8249740dd9f25cee2766212ad46733c581564aa5cf574efb63"]},"offset":"19733884"},"sortedIndex.js":{"size":167,"integrity":{"algorithm":"SHA256","hash":"bf51789895d394ee09dcd71ab81b91a7cc9c8189ddcfc0dd8a51f19df9d19aec","blockSize":4194304,"blocks":["bf51789895d394ee09dcd71ab81b91a7cc9c8189ddcfc0dd8a51f19df9d19aec"]},"offset":"19734041"},"sortedIndexBy.js":{"size":171,"integrity":{"algorithm":"SHA256","hash":"b23f7c5812efb9bdcd7147b2b0ff1d86584101e8bcf5a22299f5ba6c33572b64","blockSize":4194304,"blocks":["b23f7c5812efb9bdcd7147b2b0ff1d86584101e8bcf5a22299f5ba6c33572b64"]},"offset":"19734208"},"sortedIndexOf.js":{"size":171,"integrity":{"algorithm":"SHA256","hash":"76a8a69a00b3a942c1dc51619d1d1f3b046d34a408f785a78ba9269cf123503c","blockSize":4194304,"blocks":["76a8a69a00b3a942c1dc51619d1d1f3b046d34a408f785a78ba9269cf123503c"]},"offset":"19734379"},"sortedLastIndex.js":{"size":175,"integrity":{"algorithm":"SHA256","hash":"9c4489d6266ac9878c0fdb2d52556289d0e8fb6f54ba4490f1e13f240630191b","blockSize":4194304,"blocks":["9c4489d6266ac9878c0fdb2d52556289d0e8fb6f54ba4490f1e13f240630191b"]},"offset":"19734550"},"sortedLastIndexBy.js":{"size":179,"integrity":{"algorithm":"SHA256","hash":"2217c2af99bc94488b15d23d5de41143ef212c4aeba1d71bf98fa88b04f98ba0","blockSize":4194304,"blocks":["2217c2af99bc94488b15d23d5de41143ef212c4aeba1d71bf98fa88b04f98ba0"]},"offset":"19734725"},"sortedLastIndexOf.js":{"size":179,"integrity":{"algorithm":"SHA256","hash":"19a9d4dad22a977b3ec1d4d456cf7fac8a8f730aae14f1e3122b25e196e810ea","blockSize":4194304,"blocks":["19a9d4dad22a977b3ec1d4d456cf7fac8a8f730aae14f1e3122b25e196e810ea"]},"offset":"19734904"},"sortedUniq.js":{"size":193,"integrity":{"algorithm":"SHA256","hash":"adc2f20aa4bf71a061e958b77cabb82e91594900680735e6a6b61b63daede1c3","blockSize":4194304,"blocks":["adc2f20aa4bf71a061e958b77cabb82e91594900680735e6a6b61b63daede1c3"]},"offset":"19735083"},"sortedUniqBy.js":{"size":169,"integrity":{"algorithm":"SHA256","hash":"950e1853e050467e5b05f86f88413d7521f153ff8b2641d62ffabc05d1e11b48","blockSize":4194304,"blocks":["950e1853e050467e5b05f86f88413d7521f153ff8b2641d62ffabc05d1e11b48"]},"offset":"19735276"},"split.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"1360a39c7683f0eeb3077247323f13480def6ba0a9adc7630e9d869ccc12020c","blockSize":4194304,"blocks":["1360a39c7683f0eeb3077247323f13480def6ba0a9adc7630e9d869ccc12020c"]},"offset":"19735445"},"spread.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"6b0b48b7d36acdc94303fb3aa0396a72f9fc73ecbe1da14326ffb6566ef39b1f","blockSize":4194304,"blocks":["6b0b48b7d36acdc94303fb3aa0396a72f9fc73ecbe1da14326ffb6566ef39b1f"]},"offset":"19735600"},"spreadFrom.js":{"size":161,"integrity":{"algorithm":"SHA256","hash":"14814da1422c50b105ac1bbcb1212cefa495d47137eff1277fe28b73b1cb811b","blockSize":4194304,"blocks":["14814da1422c50b105ac1bbcb1212cefa495d47137eff1277fe28b73b1cb811b"]},"offset":"19735757"},"startCase.js":{"size":191,"integrity":{"algorithm":"SHA256","hash":"3c695a0d48b5a274ad3712c88823c78940a5d47cc28d57736b2ed1e8b159f275","blockSize":4194304,"blocks":["3c695a0d48b5a274ad3712c88823c78940a5d47cc28d57736b2ed1e8b159f275"]},"offset":"19735918"},"startsWith.js":{"size":165,"integrity":{"algorithm":"SHA256","hash":"ffd58c9f8b88d628660f2286859cb72337976b3b73fe24239e096f7730c5d0f3","blockSize":4194304,"blocks":["ffd58c9f8b88d628660f2286859cb72337976b3b73fe24239e096f7730c5d0f3"]},"offset":"19736109"},"string.js":{"size":84,"integrity":{"algorithm":"SHA256","hash":"0ada451742ba38268127188ce2e99199a67b7216630b526d37db6ad05498a69f","blockSize":4194304,"blocks":["0ada451742ba38268127188ce2e99199a67b7216630b526d37db6ad05498a69f"]},"offset":"19736274"},"stubArray.js":{"size":191,"integrity":{"algorithm":"SHA256","hash":"a0b59e15162519115317352d2e334617283c86ba5c24aacd6e5bdb60f59fd38e","blockSize":4194304,"blocks":["a0b59e15162519115317352d2e334617283c86ba5c24aacd6e5bdb60f59fd38e"]},"offset":"19736358"},"stubFalse.js":{"size":191,"integrity":{"algorithm":"SHA256","hash":"8347388895d251f5cdf9b6e6c51d42c6f8f941359bd43e25324020811b807967","blockSize":4194304,"blocks":["8347388895d251f5cdf9b6e6c51d42c6f8f941359bd43e25324020811b807967"]},"offset":"19736549"},"stubObject.js":{"size":193,"integrity":{"algorithm":"SHA256","hash":"15e339d8b8d92549fc8bc83a6deeb1cc8c6861d78edf9b07f96c6d54b9587c3f","blockSize":4194304,"blocks":["15e339d8b8d92549fc8bc83a6deeb1cc8c6861d78edf9b07f96c6d54b9587c3f"]},"offset":"19736740"},"stubString.js":{"size":193,"integrity":{"algorithm":"SHA256","hash":"718f6510df936089163354a759c68f3b8729dc8e3c3bcc3ed7d4fad6556266f1","blockSize":4194304,"blocks":["718f6510df936089163354a759c68f3b8729dc8e3c3bcc3ed7d4fad6556266f1"]},"offset":"19736933"},"stubTrue.js":{"size":189,"integrity":{"algorithm":"SHA256","hash":"6d066bab6606981d4e700c2b8760b0320f2d613d24cdf5cda762e99e19cc08d0","blockSize":4194304,"blocks":["6d066bab6606981d4e700c2b8760b0320f2d613d24cdf5cda762e99e19cc08d0"]},"offset":"19737126"},"subtract.js":{"size":161,"integrity":{"algorithm":"SHA256","hash":"5c6f2ad6b4faf766927b5e6c6c30b282561be98ef8fd4c0ee7ff4559a8b3550b","blockSize":4194304,"blocks":["5c6f2ad6b4faf766927b5e6c6c30b282561be98ef8fd4c0ee7ff4559a8b3550b"]},"offset":"19737315"},"sum.js":{"size":179,"integrity":{"algorithm":"SHA256","hash":"a3b8e7dc0c62bc147fecae2e7c0bd44c380ae3f1e04259e922fb081d042c202b","blockSize":4194304,"blocks":["a3b8e7dc0c62bc147fecae2e7c0bd44c380ae3f1e04259e922fb081d042c202b"]},"offset":"19737476"},"sumBy.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"06a5cc8fa1fb3aad1fb17e0bc15399a7ad93296c21de6902cdd3b878abba2e5c","blockSize":4194304,"blocks":["06a5cc8fa1fb3aad1fb17e0bc15399a7ad93296c21de6902cdd3b878abba2e5c"]},"offset":"19737655"},"symmetricDifference.js":{"size":35,"integrity":{"algorithm":"SHA256","hash":"38fd9ee5c3e11e5c3cfec5f822fee3cbe302136c44ae28eae23962f644d91759","blockSize":4194304,"blocks":["38fd9ee5c3e11e5c3cfec5f822fee3cbe302136c44ae28eae23962f644d91759"]},"offset":"19737810"},"symmetricDifferenceBy.js":{"size":37,"integrity":{"algorithm":"SHA256","hash":"1285be5dfe80916bbd44ce623227f5b67f93ee91fa31e3379a657f45a0c85d5e","blockSize":4194304,"blocks":["1285be5dfe80916bbd44ce623227f5b67f93ee91fa31e3379a657f45a0c85d5e"]},"offset":"19737845"},"symmetricDifferenceWith.js":{"size":39,"integrity":{"algorithm":"SHA256","hash":"f8363e90a48f9bba90f7052c2cebc4856572fc64be3117c8417c24dbcc184b4b","blockSize":4194304,"blocks":["f8363e90a48f9bba90f7052c2cebc4856572fc64be3117c8417c24dbcc184b4b"]},"offset":"19737882"},"tail.js":{"size":181,"integrity":{"algorithm":"SHA256","hash":"774379829c01dab999fbb361a2714592bb5b58093125e08aa9a5a0f7c9d37eef","blockSize":4194304,"blocks":["774379829c01dab999fbb361a2714592bb5b58093125e08aa9a5a0f7c9d37eef"]},"offset":"19737921"},"take.js":{"size":153,"integrity":{"algorithm":"SHA256","hash":"871e7b440d865b07222109271832a5e69b4b88d336352e7fc569974938eeb493","blockSize":4194304,"blocks":["871e7b440d865b07222109271832a5e69b4b88d336352e7fc569974938eeb493"]},"offset":"19738102"},"takeLast.js":{"size":41,"integrity":{"algorithm":"SHA256","hash":"68a48b91a03f43202d6d933f2e0f283165524d2b4e48431680e8f54cb9aff6cf","blockSize":4194304,"blocks":["68a48b91a03f43202d6d933f2e0f283165524d2b4e48431680e8f54cb9aff6cf"]},"offset":"19738255"},"takeLastWhile.js":{"size":46,"integrity":{"algorithm":"SHA256","hash":"3467f18a2d3609eea77e90cd206eb4d8bb4ca3db332a6a3cf898ebbe965243fc","blockSize":4194304,"blocks":["3467f18a2d3609eea77e90cd206eb4d8bb4ca3db332a6a3cf898ebbe965243fc"]},"offset":"19738296"},"takeRight.js":{"size":163,"integrity":{"algorithm":"SHA256","hash":"895a9e38bd7dc06df082c9ee2ba3a8bb11251b94d22325479cddea2a4ce63634","blockSize":4194304,"blocks":["895a9e38bd7dc06df082c9ee2ba3a8bb11251b94d22325479cddea2a4ce63634"]},"offset":"19738342"},"takeRightWhile.js":{"size":173,"integrity":{"algorithm":"SHA256","hash":"7416128557b730a948a9806dd63de6c0c69b60a75cfc26ffe4ee5eb17eefe030","blockSize":4194304,"blocks":["7416128557b730a948a9806dd63de6c0c69b60a75cfc26ffe4ee5eb17eefe030"]},"offset":"19738505"},"takeWhile.js":{"size":163,"integrity":{"algorithm":"SHA256","hash":"4ca594620f4994ef9b7eb709661234b36c3f1f096a8c5e4db8ce9e525e7e73ac","blockSize":4194304,"blocks":["4ca594620f4994ef9b7eb709661234b36c3f1f096a8c5e4db8ce9e525e7e73ac"]},"offset":"19738678"},"tap.js":{"size":151,"integrity":{"algorithm":"SHA256","hash":"19470349d24a4f49a7dcd8dc50bea5c8298ef9a789393b009703e14181fece8d","blockSize":4194304,"blocks":["19470349d24a4f49a7dcd8dc50bea5c8298ef9a789393b009703e14181fece8d"]},"offset":"19738841"},"template.js":{"size":161,"integrity":{"algorithm":"SHA256","hash":"646929fe89ac9177dc53d3d324799dd75a5c4185cee5cd976d66812965e3fec9","blockSize":4194304,"blocks":["646929fe89ac9177dc53d3d324799dd75a5c4185cee5cd976d66812965e3fec9"]},"offset":"19738992"},"templateSettings.js":{"size":205,"integrity":{"algorithm":"SHA256","hash":"02b2f8b94fc428bc866cb02095369cdff25161ceba24452a5b441440a630cbbc","blockSize":4194304,"blocks":["02b2f8b94fc428bc866cb02095369cdff25161ceba24452a5b441440a630cbbc"]},"offset":"19739153"},"throttle.js":{"size":161,"integrity":{"algorithm":"SHA256","hash":"0888c0e6fd637390c61c61c0ec53ea5cbbef4133886d38fbdf7f16d516a6ef81","blockSize":4194304,"blocks":["0888c0e6fd637390c61c61c0ec53ea5cbbef4133886d38fbdf7f16d516a6ef81"]},"offset":"19739358"},"thru.js":{"size":153,"integrity":{"algorithm":"SHA256","hash":"65e6c8e59f21e799d815b0fdbea59b55beceace4d114af9b8ae0e363da9417c3","blockSize":4194304,"blocks":["65e6c8e59f21e799d815b0fdbea59b55beceace4d114af9b8ae0e363da9417c3"]},"offset":"19739519"},"times.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"52352ace9df7f446bf5e035d03b8b6246fb653a3ca4471d7f2ace5c332e87eb0","blockSize":4194304,"blocks":["52352ace9df7f446bf5e035d03b8b6246fb653a3ca4471d7f2ace5c332e87eb0"]},"offset":"19739672"},"toArray.js":{"size":187,"integrity":{"algorithm":"SHA256","hash":"4dfef85157759961fb31a8936bd41c4bf6da6e031e6ca2bc3ae003da90844367","blockSize":4194304,"blocks":["4dfef85157759961fb31a8936bd41c4bf6da6e031e6ca2bc3ae003da90844367"]},"offset":"19739827"},"toFinite.js":{"size":189,"integrity":{"algorithm":"SHA256","hash":"07b4cc6ad49eaf7228ab5a5d6d25a72be95f4af25b61a036035cb8666daaf8c1","blockSize":4194304,"blocks":["07b4cc6ad49eaf7228ab5a5d6d25a72be95f4af25b61a036035cb8666daaf8c1"]},"offset":"19740014"},"toInteger.js":{"size":191,"integrity":{"algorithm":"SHA256","hash":"2a0e674d664a7acf37d0af1384f01a5e46223e3acfa0e94e87e019d9043e6356","blockSize":4194304,"blocks":["2a0e674d664a7acf37d0af1384f01a5e46223e3acfa0e94e87e019d9043e6356"]},"offset":"19740203"},"toIterator.js":{"size":193,"integrity":{"algorithm":"SHA256","hash":"15df0e6f920972cc95ff14c22261d75d02b212755df2bf1410d1128e02d3a752","blockSize":4194304,"blocks":["15df0e6f920972cc95ff14c22261d75d02b212755df2bf1410d1128e02d3a752"]},"offset":"19740394"},"toJSON.js":{"size":185,"integrity":{"algorithm":"SHA256","hash":"a42e07af2604cd9dd5cc5484d8fdb3dedc36811a7cd85d00b2280a0c36773597","blockSize":4194304,"blocks":["a42e07af2604cd9dd5cc5484d8fdb3dedc36811a7cd85d00b2280a0c36773597"]},"offset":"19740587"},"toLength.js":{"size":189,"integrity":{"algorithm":"SHA256","hash":"39e9d9ff3245baf518f0ce02f411cb8df4d4fc75a482da419dada1062df3f7ba","blockSize":4194304,"blocks":["39e9d9ff3245baf518f0ce02f411cb8df4d4fc75a482da419dada1062df3f7ba"]},"offset":"19740772"},"toLower.js":{"size":187,"integrity":{"algorithm":"SHA256","hash":"c266802c41f676cc178d093c4646a370ef6f29ee92c1266684e64ac0aa01a09d","blockSize":4194304,"blocks":["c266802c41f676cc178d093c4646a370ef6f29ee92c1266684e64ac0aa01a09d"]},"offset":"19740961"},"toNumber.js":{"size":189,"integrity":{"algorithm":"SHA256","hash":"49b1b720dfc6c20f6d5cd8ef28fc45eb02373331743271a191ff79d7da8c7dcf","blockSize":4194304,"blocks":["49b1b720dfc6c20f6d5cd8ef28fc45eb02373331743271a191ff79d7da8c7dcf"]},"offset":"19741148"},"toPairs.js":{"size":187,"integrity":{"algorithm":"SHA256","hash":"1156943713645734bc65078854f4904fa151c13b4f560eece28256a701910345","blockSize":4194304,"blocks":["1156943713645734bc65078854f4904fa151c13b4f560eece28256a701910345"]},"offset":"19741337"},"toPairsIn.js":{"size":191,"integrity":{"algorithm":"SHA256","hash":"5221317adfa381feb5221510daa830239c90d92c1700e2a7bedb4b97465e465b","blockSize":4194304,"blocks":["5221317adfa381feb5221510daa830239c90d92c1700e2a7bedb4b97465e465b"]},"offset":"19741524"},"toPath.js":{"size":185,"integrity":{"algorithm":"SHA256","hash":"39e560dc24774991ef8542af4729a6cb25ff8ee7048ae9a15326e745fb393d9b","blockSize":4194304,"blocks":["39e560dc24774991ef8542af4729a6cb25ff8ee7048ae9a15326e745fb393d9b"]},"offset":"19741715"},"toPlainObject.js":{"size":199,"integrity":{"algorithm":"SHA256","hash":"f480c02668f36db4ee798cebaa8453c7abc7a721b7624140f9be163e50426168","blockSize":4194304,"blocks":["f480c02668f36db4ee798cebaa8453c7abc7a721b7624140f9be163e50426168"]},"offset":"19741900"},"toSafeInteger.js":{"size":199,"integrity":{"algorithm":"SHA256","hash":"90f1604762ef1804580c71d21f3dd2a2c88813b1af7bd2c5ae937d542df3371d","blockSize":4194304,"blocks":["90f1604762ef1804580c71d21f3dd2a2c88813b1af7bd2c5ae937d542df3371d"]},"offset":"19742099"},"toString.js":{"size":189,"integrity":{"algorithm":"SHA256","hash":"ea20e2092d6d038d1ad50e99fca11c18f7951b67d73d7171f6f27a657d7b3fd1","blockSize":4194304,"blocks":["ea20e2092d6d038d1ad50e99fca11c18f7951b67d73d7171f6f27a657d7b3fd1"]},"offset":"19742298"},"toUpper.js":{"size":187,"integrity":{"algorithm":"SHA256","hash":"e9a6c8ea099cc85372e116a9953842816bdaa497e058cb59206a2db18c8ec6a4","blockSize":4194304,"blocks":["e9a6c8ea099cc85372e116a9953842816bdaa497e058cb59206a2db18c8ec6a4"]},"offset":"19742487"},"transform.js":{"size":163,"integrity":{"algorithm":"SHA256","hash":"7b727fc62e82ffd89868a9e16fbb55b31869627692f611f53fdee7473fd12797","blockSize":4194304,"blocks":["7b727fc62e82ffd89868a9e16fbb55b31869627692f611f53fdee7473fd12797"]},"offset":"19742674"},"trim.js":{"size":153,"integrity":{"algorithm":"SHA256","hash":"2789cd4d60b1e972fe3bcb5047fd78bc65733b7dd95a75a7fe8c888f4bd094bf","blockSize":4194304,"blocks":["2789cd4d60b1e972fe3bcb5047fd78bc65733b7dd95a75a7fe8c888f4bd094bf"]},"offset":"19742837"},"trimChars.js":{"size":158,"integrity":{"algorithm":"SHA256","hash":"69c4110da69a7cf94f822cf9bcce35c3b1bfbce32443dea67ae7f0e0fa935585","blockSize":4194304,"blocks":["69c4110da69a7cf94f822cf9bcce35c3b1bfbce32443dea67ae7f0e0fa935585"]},"offset":"19742990"},"trimCharsEnd.js":{"size":164,"integrity":{"algorithm":"SHA256","hash":"9434b1ccbaa504d32d08d2856de9b5a70d6cb9e6328219efa278f3e30b1756f3","blockSize":4194304,"blocks":["9434b1ccbaa504d32d08d2856de9b5a70d6cb9e6328219efa278f3e30b1756f3"]},"offset":"19743148"},"trimCharsStart.js":{"size":168,"integrity":{"algorithm":"SHA256","hash":"2dbbd5f2ea516d8f59e6b3e890efa6d81857dd34d92d2eaa01e6d39868f8847f","blockSize":4194304,"blocks":["2dbbd5f2ea516d8f59e6b3e890efa6d81857dd34d92d2eaa01e6d39868f8847f"]},"offset":"19743312"},"trimEnd.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"b63b2210f1454fe415cf8a42da65dee553879e971485b3cde07aa400d2206a4c","blockSize":4194304,"blocks":["b63b2210f1454fe415cf8a42da65dee553879e971485b3cde07aa400d2206a4c"]},"offset":"19743480"},"trimStart.js":{"size":163,"integrity":{"algorithm":"SHA256","hash":"89451b09cd9b996051c23baa97dd61f55d2ed63bf5aca753e8b5c06b61ddf6fc","blockSize":4194304,"blocks":["89451b09cd9b996051c23baa97dd61f55d2ed63bf5aca753e8b5c06b61ddf6fc"]},"offset":"19743639"},"truncate.js":{"size":161,"integrity":{"algorithm":"SHA256","hash":"533868b756d17cd5d14597cb1d0bc2c54ca1cef7ba08dbb4ee0427c7ed941d7a","blockSize":4194304,"blocks":["533868b756d17cd5d14597cb1d0bc2c54ca1cef7ba08dbb4ee0427c7ed941d7a"]},"offset":"19743802"},"unapply.js":{"size":36,"integrity":{"algorithm":"SHA256","hash":"0da29d56781c33e96d9bc6947c4657c4452151abe30159ceca7fc0dbd823c103","blockSize":4194304,"blocks":["0da29d56781c33e96d9bc6947c4657c4452151abe30159ceca7fc0dbd823c103"]},"offset":"19743963"},"unary.js":{"size":183,"integrity":{"algorithm":"SHA256","hash":"b5296db9383b9ae750dcbe135c47b73c469bb0139ca49088f8f6a34bb680301f","blockSize":4194304,"blocks":["b5296db9383b9ae750dcbe135c47b73c469bb0139ca49088f8f6a34bb680301f"]},"offset":"19743999"},"unescape.js":{"size":189,"integrity":{"algorithm":"SHA256","hash":"e93154ba14fb133e0f4e1292ee334288e8e858783e4855ac726fff463a32d0e4","blockSize":4194304,"blocks":["e93154ba14fb133e0f4e1292ee334288e8e858783e4855ac726fff463a32d0e4"]},"offset":"19744182"},"union.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"0eb65ecea3bb4ef6c19e6d3a809bf703b9831807a7bbdc114d2a2dd21f7b20c1","blockSize":4194304,"blocks":["0eb65ecea3bb4ef6c19e6d3a809bf703b9831807a7bbdc114d2a2dd21f7b20c1"]},"offset":"19744371"},"unionBy.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"3aebcf8ba398df184d6c402ca59e17c6c92a80d668cd39b6b3462b4ab07a8388","blockSize":4194304,"blocks":["3aebcf8ba398df184d6c402ca59e17c6c92a80d668cd39b6b3462b4ab07a8388"]},"offset":"19744526"},"unionWith.js":{"size":163,"integrity":{"algorithm":"SHA256","hash":"9a0bcc8263d509dceb2f4b62afa501efd50bd9880bb3f411d7ddcb18fcfbdfa3","blockSize":4194304,"blocks":["9a0bcc8263d509dceb2f4b62afa501efd50bd9880bb3f411d7ddcb18fcfbdfa3"]},"offset":"19744685"},"uniq.js":{"size":181,"integrity":{"algorithm":"SHA256","hash":"29d5b0cef35689a292bec3c22a0530434bf02357cc5df86fcc2532d9fc861574","blockSize":4194304,"blocks":["29d5b0cef35689a292bec3c22a0530434bf02357cc5df86fcc2532d9fc861574"]},"offset":"19744848"},"uniqBy.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"5c32a30263ae277edbda23287cfa445e63036b23859e4ad1e099015f9ea20420","blockSize":4194304,"blocks":["5c32a30263ae277edbda23287cfa445e63036b23859e4ad1e099015f9ea20420"]},"offset":"19745029"},"uniqWith.js":{"size":161,"integrity":{"algorithm":"SHA256","hash":"8aba52efa7a6f18464d062f85b3b4b756637cc8acdb752267e38fbf19b6625ff","blockSize":4194304,"blocks":["8aba52efa7a6f18464d062f85b3b4b756637cc8acdb752267e38fbf19b6625ff"]},"offset":"19745186"},"uniqueId.js":{"size":161,"integrity":{"algorithm":"SHA256","hash":"74096f8cfdab5ee830604eeb2a2572dd1867ea6076bbf970b83ea49dcb7c82f7","blockSize":4194304,"blocks":["74096f8cfdab5ee830604eeb2a2572dd1867ea6076bbf970b83ea49dcb7c82f7"]},"offset":"19745347"},"unnest.js":{"size":39,"integrity":{"algorithm":"SHA256","hash":"1f8468b09d05e1f72fbaa45f88d048c4ea1a0caaee69bf9f268e62bfba94e692","blockSize":4194304,"blocks":["1f8468b09d05e1f72fbaa45f88d048c4ea1a0caaee69bf9f268e62bfba94e692"]},"offset":"19745508"},"unset.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"d8fd15a5c8dba2f1bcda068273d07b2846a53b241e7169472c4ff4a84f993455","blockSize":4194304,"blocks":["d8fd15a5c8dba2f1bcda068273d07b2846a53b241e7169472c4ff4a84f993455"]},"offset":"19745547"},"unzip.js":{"size":183,"integrity":{"algorithm":"SHA256","hash":"f7641ef8639d08a08f1510263a125883db3d97935494e83b50ca494727e6ab56","blockSize":4194304,"blocks":["f7641ef8639d08a08f1510263a125883db3d97935494e83b50ca494727e6ab56"]},"offset":"19745702"},"unzipWith.js":{"size":163,"integrity":{"algorithm":"SHA256","hash":"4df68143e8e8ad13bcc86f1c1e7a0e6e73ca6f19402585e9086bb6a77d0340b5","blockSize":4194304,"blocks":["4df68143e8e8ad13bcc86f1c1e7a0e6e73ca6f19402585e9086bb6a77d0340b5"]},"offset":"19745885"},"update.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"a08a0b57a68c1d738a653a53a8a8c26aa1b7bcac150d405c9e33e2e20623bff7","blockSize":4194304,"blocks":["a08a0b57a68c1d738a653a53a8a8c26aa1b7bcac150d405c9e33e2e20623bff7"]},"offset":"19746048"},"updateWith.js":{"size":165,"integrity":{"algorithm":"SHA256","hash":"f9d6225dad845212f390546fb5cc0b60ce3212a7a8c0c4226805894b90c7a898","blockSize":4194304,"blocks":["f9d6225dad845212f390546fb5cc0b60ce3212a7a8c0c4226805894b90c7a898"]},"offset":"19746205"},"upperCase.js":{"size":191,"integrity":{"algorithm":"SHA256","hash":"b1e5009eaae20db990f76ef392465273da1bc052f3c39fb83a1810b211b34f43","blockSize":4194304,"blocks":["b1e5009eaae20db990f76ef392465273da1bc052f3c39fb83a1810b211b34f43"]},"offset":"19746370"},"upperFirst.js":{"size":193,"integrity":{"algorithm":"SHA256","hash":"9c9aaa567bae66ac345547e21e7054aec7f8ccc11894064fe1970881233add62","blockSize":4194304,"blocks":["9c9aaa567bae66ac345547e21e7054aec7f8ccc11894064fe1970881233add62"]},"offset":"19746561"},"useWith.js":{"size":40,"integrity":{"algorithm":"SHA256","hash":"6526ee2d4a0f327d13e99aa0ab0d0dc1def42ac1881b93eec3f1d4a654852bdb","blockSize":4194304,"blocks":["6526ee2d4a0f327d13e99aa0ab0d0dc1def42ac1881b93eec3f1d4a654852bdb"]},"offset":"19746754"},"util.js":{"size":82,"integrity":{"algorithm":"SHA256","hash":"9cf2101fbcb2fdfb93c52f4edb978bef946e031c906894b09ee49ea85eecad52","blockSize":4194304,"blocks":["9cf2101fbcb2fdfb93c52f4edb978bef946e031c906894b09ee49ea85eecad52"]},"offset":"19746794"},"value.js":{"size":183,"integrity":{"algorithm":"SHA256","hash":"1233740cd67a3385c096e5558980d06f509f6ea11ebb4c9549e5892744baf171","blockSize":4194304,"blocks":["1233740cd67a3385c096e5558980d06f509f6ea11ebb4c9549e5892744baf171"]},"offset":"19746876"},"valueOf.js":{"size":187,"integrity":{"algorithm":"SHA256","hash":"2f8e43f62075034c135d7537fdb3fc232676b8d6a8b1e31b3d718b0444a7615b","blockSize":4194304,"blocks":["2f8e43f62075034c135d7537fdb3fc232676b8d6a8b1e31b3d718b0444a7615b"]},"offset":"19747059"},"values.js":{"size":185,"integrity":{"algorithm":"SHA256","hash":"48329fa00984a79190700daeb7531f630511010ba9536f078b17aad3104f8e5c","blockSize":4194304,"blocks":["48329fa00984a79190700daeb7531f630511010ba9536f078b17aad3104f8e5c"]},"offset":"19747246"},"valuesIn.js":{"size":189,"integrity":{"algorithm":"SHA256","hash":"e90d1f1aaaed5d6d8aecf6da68d0dba1ac306fe76b501b7d65b7facdf0febf35","blockSize":4194304,"blocks":["e90d1f1aaaed5d6d8aecf6da68d0dba1ac306fe76b501b7d65b7facdf0febf35"]},"offset":"19747431"},"where.js":{"size":42,"integrity":{"algorithm":"SHA256","hash":"335495baefaf23607518544bc875a1ef48507d2c5e6bf0f0c1a225fd0e304f46","blockSize":4194304,"blocks":["335495baefaf23607518544bc875a1ef48507d2c5e6bf0f0c1a225fd0e304f46"]},"offset":"19747620"},"whereEq.js":{"size":39,"integrity":{"algorithm":"SHA256","hash":"c148011a1334aad49cc4fa8700a5395794ca325cf2e0284c9853890311813ea0","blockSize":4194304,"blocks":["c148011a1334aad49cc4fa8700a5395794ca325cf2e0284c9853890311813ea0"]},"offset":"19747662"},"without.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"207a4d42efd14f536e8762ef0e87fdf98e4617aa96bf739ef7a356732634e2bf","blockSize":4194304,"blocks":["207a4d42efd14f536e8762ef0e87fdf98e4617aa96bf739ef7a356732634e2bf"]},"offset":"19747701"},"words.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"89d012be9fd28b62557e78f815b1a3f6dff35594751b5126d71d7cdb7f27edf4","blockSize":4194304,"blocks":["89d012be9fd28b62557e78f815b1a3f6dff35594751b5126d71d7cdb7f27edf4"]},"offset":"19747860"},"wrap.js":{"size":153,"integrity":{"algorithm":"SHA256","hash":"5c7c8fa4423bfc1efa07b6ea3e5a82fb148843b26cdb87d7eddd9edc98cc86ca","blockSize":4194304,"blocks":["5c7c8fa4423bfc1efa07b6ea3e5a82fb148843b26cdb87d7eddd9edc98cc86ca"]},"offset":"19748015"},"wrapperAt.js":{"size":191,"integrity":{"algorithm":"SHA256","hash":"7ffad9f90970b4ad92d30abc9a3b20b74b16e3322028c3779074201170171844","blockSize":4194304,"blocks":["7ffad9f90970b4ad92d30abc9a3b20b74b16e3322028c3779074201170171844"]},"offset":"19748168"},"wrapperChain.js":{"size":197,"integrity":{"algorithm":"SHA256","hash":"1b725e56bf191c50835b108c9a8b4c53a332cfd8191c0219204867b845ee4c7d","blockSize":4194304,"blocks":["1b725e56bf191c50835b108c9a8b4c53a332cfd8191c0219204867b845ee4c7d"]},"offset":"19748359"},"wrapperLodash.js":{"size":199,"integrity":{"algorithm":"SHA256","hash":"f66a3bc9777cbe5137379e344a1049ed467624fca520e8d6b703e67fd1035ce6","blockSize":4194304,"blocks":["f66a3bc9777cbe5137379e344a1049ed467624fca520e8d6b703e67fd1035ce6"]},"offset":"19748556"},"wrapperReverse.js":{"size":201,"integrity":{"algorithm":"SHA256","hash":"473e1059b67c537a26a46c65e91e379011ffa24e7b28288058571e4223929bda","blockSize":4194304,"blocks":["473e1059b67c537a26a46c65e91e379011ffa24e7b28288058571e4223929bda"]},"offset":"19748755"},"wrapperValue.js":{"size":197,"integrity":{"algorithm":"SHA256","hash":"5a68d5f97eeff92a76168808c55d50f29d53ab3393e538e8942966f9a7a19e14","blockSize":4194304,"blocks":["5a68d5f97eeff92a76168808c55d50f29d53ab3393e538e8942966f9a7a19e14"]},"offset":"19748956"},"xor.js":{"size":151,"integrity":{"algorithm":"SHA256","hash":"cbc20b7d7a3a5e612a61eeccf7a438a8411a759ed7de6d559aea2d02f7879c5a","blockSize":4194304,"blocks":["cbc20b7d7a3a5e612a61eeccf7a438a8411a759ed7de6d559aea2d02f7879c5a"]},"offset":"19749153"},"xorBy.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"bf40bcf5f6fe5fec395b0116b8c49ad756d093801eef5d13fa4188ea78a316bd","blockSize":4194304,"blocks":["bf40bcf5f6fe5fec395b0116b8c49ad756d093801eef5d13fa4188ea78a316bd"]},"offset":"19749304"},"xorWith.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"29d23bdebd504d0206191e3575dc157f665fa7fb70a5955bfa5d608c355a4432","blockSize":4194304,"blocks":["29d23bdebd504d0206191e3575dc157f665fa7fb70a5955bfa5d608c355a4432"]},"offset":"19749459"},"zip.js":{"size":151,"integrity":{"algorithm":"SHA256","hash":"fed4485ebcd54848160fba21c8c9523e97cfbb9a40b1856dd5a21c4df99c9f58","blockSize":4194304,"blocks":["fed4485ebcd54848160fba21c8c9523e97cfbb9a40b1856dd5a21c4df99c9f58"]},"offset":"19749618"},"zipAll.js":{"size":154,"integrity":{"algorithm":"SHA256","hash":"5ad4a9a3cdc29bbf8740dd20d496ddb43a193339079c4de07e145a728f0c6243","blockSize":4194304,"blocks":["5ad4a9a3cdc29bbf8740dd20d496ddb43a193339079c4de07e145a728f0c6243"]},"offset":"19749769"},"zipObj.js":{"size":41,"integrity":{"algorithm":"SHA256","hash":"0144c3afd501c2566ac9e2172fd25a35e74ae2b0d2cdd9ff89f290ee901dea3d","blockSize":4194304,"blocks":["0144c3afd501c2566ac9e2172fd25a35e74ae2b0d2cdd9ff89f290ee901dea3d"]},"offset":"19749923"},"zipObject.js":{"size":163,"integrity":{"algorithm":"SHA256","hash":"fdc9387d58165a826b001dcb9b60c563eb7643886fbc6213ce25deae92379620","blockSize":4194304,"blocks":["fdc9387d58165a826b001dcb9b60c563eb7643886fbc6213ce25deae92379620"]},"offset":"19749964"},"zipObjectDeep.js":{"size":171,"integrity":{"algorithm":"SHA256","hash":"92fa710f6ef480fe3843648435072d305170b55d0be8f7c870316f070404ccf4","blockSize":4194304,"blocks":["92fa710f6ef480fe3843648435072d305170b55d0be8f7c870316f070404ccf4"]},"offset":"19750127"},"zipWith.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"c350e83a9babcfee6d919c52ecdb3703af8f17acb9799a85d9b200bac4f93b67","blockSize":4194304,"blocks":["c350e83a9babcfee6d919c52ecdb3703af8f17acb9799a85d9b200bac4f93b67"]},"offset":"19750298"}}}}},"lodash.escaperegexp":{"files":{"LICENSE":{"size":1951,"integrity":{"algorithm":"SHA256","hash":"ffd8b33b354585f4ce119f19c53728281e48a97b074491eb6bf6d5c5ff305272","blockSize":4194304,"blocks":["ffd8b33b354585f4ce119f19c53728281e48a97b074491eb6bf6d5c5ff305272"]},"offset":"19750457"},"index.js":{"size":4398,"integrity":{"algorithm":"SHA256","hash":"584de6ec78e35344eaef8291338a671f223ec225c4df4220b6f91d8f0c004d8d","blockSize":4194304,"blocks":["584de6ec78e35344eaef8291338a671f223ec225c4df4220b6f91d8f0c004d8d"]},"offset":"19752408"},"package.json":{"size":356,"integrity":{"algorithm":"SHA256","hash":"c71b659d3f3f5dfab55d736b6bd17d97f822b13bcf9b1edbce479f8e691e7892","blockSize":4194304,"blocks":["c71b659d3f3f5dfab55d736b6bd17d97f822b13bcf9b1edbce479f8e691e7892"]},"offset":"19756806"}}},"lodash.includes":{"files":{"LICENSE":{"size":1951,"integrity":{"algorithm":"SHA256","hash":"ffd8b33b354585f4ce119f19c53728281e48a97b074491eb6bf6d5c5ff305272","blockSize":4194304,"blocks":["ffd8b33b354585f4ce119f19c53728281e48a97b074491eb6bf6d5c5ff305272"]},"offset":"19757162"},"index.js":{"size":18716,"integrity":{"algorithm":"SHA256","hash":"83318ef5471ffa444d442ab55e24ccb772671fbfcc3e494ed2c32715e85ebe8e","blockSize":4194304,"blocks":["83318ef5471ffa444d442ab55e24ccb772671fbfcc3e494ed2c32715e85ebe8e"]},"offset":"19759113"},"package.json":{"size":348,"integrity":{"algorithm":"SHA256","hash":"87b4c5bb914dd62f0edc39a038759d1f6cdf275ffbbcc0b7a7326abfb624e919","blockSize":4194304,"blocks":["87b4c5bb914dd62f0edc39a038759d1f6cdf275ffbbcc0b7a7326abfb624e919"]},"offset":"19777829"}}},"lodash.isboolean":{"files":{"LICENSE":{"size":1233,"integrity":{"algorithm":"SHA256","hash":"25a399d4a42f419445101092a1fc3f9b4bfe06d614f84128222d79e3a2105fe7","blockSize":4194304,"blocks":["25a399d4a42f419445101092a1fc3f9b4bfe06d614f84128222d79e3a2105fe7"]},"offset":"19778177"},"index.js":{"size":1819,"integrity":{"algorithm":"SHA256","hash":"8fee48fd5bafd252cf16ceccc6fe0d3de14f91bdb99ea17287c5fd2af886b0d1","blockSize":4194304,"blocks":["8fee48fd5bafd252cf16ceccc6fe0d3de14f91bdb99ea17287c5fd2af886b0d1"]},"offset":"19779410"},"package.json":{"size":350,"integrity":{"algorithm":"SHA256","hash":"bacd8926748fb52a6ebe7fbe5c7a44e1929a99adfe7f05f09715af3ccbdae4c4","blockSize":4194304,"blocks":["bacd8926748fb52a6ebe7fbe5c7a44e1929a99adfe7f05f09715af3ccbdae4c4"]},"offset":"19781229"}}},"lodash.isequal":{"files":{"LICENSE":{"size":1950,"integrity":{"algorithm":"SHA256","hash":"e159c6d48c989185448658f276375bfb2300362ec6d4ae5525a2d49c4bcb947d","blockSize":4194304,"blocks":["e159c6d48c989185448658f276375bfb2300362ec6d4ae5525a2d49c4bcb947d"]},"offset":"19781579"},"index.js":{"size":49598,"integrity":{"algorithm":"SHA256","hash":"e552928a511748303101cfd03826a777cfa359eade6a4a60f92c923edbf9184c","blockSize":4194304,"blocks":["e552928a511748303101cfd03826a777cfa359eade6a4a60f92c923edbf9184c"]},"offset":"19783529"},"package.json":{"size":346,"integrity":{"algorithm":"SHA256","hash":"6e84ac44b54c17317d096a280e9d0bd72d736e0a0245095cc7c5d72657890406","blockSize":4194304,"blocks":["6e84ac44b54c17317d096a280e9d0bd72d736e0a0245095cc7c5d72657890406"]},"offset":"19833127"}}},"lodash.isinteger":{"files":{"LICENSE":{"size":1951,"integrity":{"algorithm":"SHA256","hash":"ffd8b33b354585f4ce119f19c53728281e48a97b074491eb6bf6d5c5ff305272","blockSize":4194304,"blocks":["ffd8b33b354585f4ce119f19c53728281e48a97b074491eb6bf6d5c5ff305272"]},"offset":"19833473"},"index.js":{"size":6036,"integrity":{"algorithm":"SHA256","hash":"f08d39de94700d1d233ef6fc7dce458b0959dff006e97a1f071b3c33f4ed1631","blockSize":4194304,"blocks":["f08d39de94700d1d233ef6fc7dce458b0959dff006e97a1f071b3c33f4ed1631"]},"offset":"19835424"},"package.json":{"size":350,"integrity":{"algorithm":"SHA256","hash":"4eda5589e8169ca7e72dd3150b9ab215c172215b5fbf47146e41a5791448d992","blockSize":4194304,"blocks":["4eda5589e8169ca7e72dd3150b9ab215c172215b5fbf47146e41a5791448d992"]},"offset":"19841460"}}},"lodash.isnumber":{"files":{"LICENSE":{"size":1233,"integrity":{"algorithm":"SHA256","hash":"25a399d4a42f419445101092a1fc3f9b4bfe06d614f84128222d79e3a2105fe7","blockSize":4194304,"blocks":["25a399d4a42f419445101092a1fc3f9b4bfe06d614f84128222d79e3a2105fe7"]},"offset":"19841810"},"index.js":{"size":2025,"integrity":{"algorithm":"SHA256","hash":"8af07547259b1a9f9d55e5e9209242295ced23a63df9f6c0d6f3c58d913309de","blockSize":4194304,"blocks":["8af07547259b1a9f9d55e5e9209242295ced23a63df9f6c0d6f3c58d913309de"]},"offset":"19843043"},"package.json":{"size":348,"integrity":{"algorithm":"SHA256","hash":"b032d2c26a1dcac4de78ae95d968d315a13f852faac6bba17a1c32672b0a54a5","blockSize":4194304,"blocks":["b032d2c26a1dcac4de78ae95d968d315a13f852faac6bba17a1c32672b0a54a5"]},"offset":"19845068"}}},"lodash.isplainobject":{"files":{"LICENSE":{"size":1951,"integrity":{"algorithm":"SHA256","hash":"ffd8b33b354585f4ce119f19c53728281e48a97b074491eb6bf6d5c5ff305272","blockSize":4194304,"blocks":["ffd8b33b354585f4ce119f19c53728281e48a97b074491eb6bf6d5c5ff305272"]},"offset":"19845416"},"index.js":{"size":3673,"integrity":{"algorithm":"SHA256","hash":"0f8359da5d7830204b85d5afc6c6321ea35adee76b600531418382930cb90dba","blockSize":4194304,"blocks":["0f8359da5d7830204b85d5afc6c6321ea35adee76b600531418382930cb90dba"]},"offset":"19847367"},"package.json":{"size":358,"integrity":{"algorithm":"SHA256","hash":"896b7e43aea044efcb976dd37f2dfaafb3995414075a663caa6858d172f86947","blockSize":4194304,"blocks":["896b7e43aea044efcb976dd37f2dfaafb3995414075a663caa6858d172f86947"]},"offset":"19851040"}}},"lodash.isstring":{"files":{"LICENSE":{"size":1233,"integrity":{"algorithm":"SHA256","hash":"25a399d4a42f419445101092a1fc3f9b4bfe06d614f84128222d79e3a2105fe7","blockSize":4194304,"blocks":["25a399d4a42f419445101092a1fc3f9b4bfe06d614f84128222d79e3a2105fe7"]},"offset":"19851398"},"index.js":{"size":2302,"integrity":{"algorithm":"SHA256","hash":"d974a8434ce40a084b20268fd2b5a40161597961de3cc9679b68b407f5cb10b2","blockSize":4194304,"blocks":["d974a8434ce40a084b20268fd2b5a40161597961de3cc9679b68b407f5cb10b2"]},"offset":"19852631"},"package.json":{"size":348,"integrity":{"algorithm":"SHA256","hash":"01c1c8d0586a73dc1db82de44d3a6ae0baabfa9ab789b3ddb74b5e6c54d40f32","blockSize":4194304,"blocks":["01c1c8d0586a73dc1db82de44d3a6ae0baabfa9ab789b3ddb74b5e6c54d40f32"]},"offset":"19854933"}}},"lodash.once":{"files":{"LICENSE":{"size":1951,"integrity":{"algorithm":"SHA256","hash":"ffd8b33b354585f4ce119f19c53728281e48a97b074491eb6bf6d5c5ff305272","blockSize":4194304,"blocks":["ffd8b33b354585f4ce119f19c53728281e48a97b074491eb6bf6d5c5ff305272"]},"offset":"19855281"},"index.js":{"size":7094,"integrity":{"algorithm":"SHA256","hash":"0424069c17cc702b439db9bc25302bf0aa7c9037f3bfe2adc78ebeec66af4dc5","blockSize":4194304,"blocks":["0424069c17cc702b439db9bc25302bf0aa7c9037f3bfe2adc78ebeec66af4dc5"]},"offset":"19857232"},"package.json":{"size":340,"integrity":{"algorithm":"SHA256","hash":"22f9be61f892c1b6f61b0a3423f44bfd56e0566114bd7426a37630869719c3a9","blockSize":4194304,"blocks":["22f9be61f892c1b6f61b0a3423f44bfd56e0566114bd7426a37630869719c3a9"]},"offset":"19864326"}}},"lru-cache":{"files":{"LICENSE":{"size":765,"integrity":{"algorithm":"SHA256","hash":"4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b","blockSize":4194304,"blocks":["4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b"]},"offset":"19864666"},"index.js":{"size":8186,"integrity":{"algorithm":"SHA256","hash":"f527d2386a6266b9bf67d264194948cf741b12daa19fea19e3537414ee31f9a7","blockSize":4194304,"blocks":["f527d2386a6266b9bf67d264194948cf741b12daa19fea19e3537414ee31f9a7"]},"offset":"19865431"},"package.json":{"size":473,"integrity":{"algorithm":"SHA256","hash":"bf56ed8252489032360975b60a83537bb0f05341da6176aa3bde8426137e99e8","blockSize":4194304,"blocks":["bf56ed8252489032360975b60a83537bb0f05341da6176aa3bde8426137e99e8"]},"offset":"19873617"}}},"make-dir":{"files":{"index.js":{"size":3124,"integrity":{"algorithm":"SHA256","hash":"951713696f119877cca572ed7f28087c472d7ccb35f92c7baa942f4ef09e8422","blockSize":4194304,"blocks":["951713696f119877cca572ed7f28087c472d7ccb35f92c7baa942f4ef09e8422"]},"offset":"19874090"},"license":{"size":1109,"integrity":{"algorithm":"SHA256","hash":"48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0","blockSize":4194304,"blocks":["48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0"]},"offset":"19877214"},"package.json":{"size":784,"integrity":{"algorithm":"SHA256","hash":"29fec43dc8e9a8792130c543070d88576f32c92c33cb58ab51a8ec2885365db8","blockSize":4194304,"blocks":["29fec43dc8e9a8792130c543070d88576f32c92c33cb58ab51a8ec2885365db8"]},"offset":"19878323"},"node_modules":{"files":{"semver":{"files":{"LICENSE":{"size":765,"integrity":{"algorithm":"SHA256","hash":"4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b","blockSize":4194304,"blocks":["4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b"]},"offset":"42842170"},"package.json":{"size":404,"integrity":{"algorithm":"SHA256","hash":"a486c0f9fdf0add140b891a6d1a18295a719e28f6633136a2b10b2177fc46a15","blockSize":4194304,"blocks":["a486c0f9fdf0add140b891a6d1a18295a719e28f6633136a2b10b2177fc46a15"]},"offset":"42842935"},"range.bnf":{"size":619,"integrity":{"algorithm":"SHA256","hash":"ed628fdaff64be366d07f6cc4559eae4de109826f743ea7f5e1588c370bca49a","blockSize":4194304,"blocks":["ed628fdaff64be366d07f6cc4559eae4de109826f743ea7f5e1588c370bca49a"]},"offset":"42843339"},"semver.js":{"size":42130,"integrity":{"algorithm":"SHA256","hash":"acfcb006e8cbfa5ec841829d60ecc5adb9c1012e39df0b7d2d29e44116001850","blockSize":4194304,"blocks":["acfcb006e8cbfa5ec841829d60ecc5adb9c1012e39df0b7d2d29e44116001850"]},"offset":"42843958"},"bin":{"files":{"semver.js":{"size":4717,"integrity":{"algorithm":"SHA256","hash":"a3ed56435cbd4b3f07a80c4a343edd86d787f89bf2cee0105bdf68cb653ba2a0","blockSize":4194304,"blocks":["a3ed56435cbd4b3f07a80c4a343edd86d787f89bf2cee0105bdf68cb653ba2a0"]},"offset":"42886088"}}}}}}}}},"media-typer":{"files":{"HISTORY.md":{"size":461,"integrity":{"algorithm":"SHA256","hash":"739de29408b3f06851637fef507f1b42f584725e547c272cf19929d5f568cbc2","blockSize":4194304,"blocks":["739de29408b3f06851637fef507f1b42f584725e547c272cf19929d5f568cbc2"]},"offset":"19879107"},"LICENSE":{"size":1089,"integrity":{"algorithm":"SHA256","hash":"74d8054d56d522bdaa340d3d71130cb204997d523a5292c85ac1264dd77c8d06","blockSize":4194304,"blocks":["74d8054d56d522bdaa340d3d71130cb204997d523a5292c85ac1264dd77c8d06"]},"offset":"19879568"},"index.js":{"size":6375,"integrity":{"algorithm":"SHA256","hash":"27af6de782c53c57c4a8f111a81cd26b8d68c896c2dcd83e27da4c73234ce16b","blockSize":4194304,"blocks":["27af6de782c53c57c4a8f111a81cd26b8d68c896c2dcd83e27da4c73234ce16b"]},"offset":"19880657"},"package.json":{"size":449,"integrity":{"algorithm":"SHA256","hash":"fb72c4524b8f005d4bc820c8d6bfab79f1eb8023aca3e04f7175e20c08fb4ee5","blockSize":4194304,"blocks":["fb72c4524b8f005d4bc820c8d6bfab79f1eb8023aca3e04f7175e20c08fb4ee5"]},"offset":"19887032"}}},"merge-descriptors":{"files":{"HISTORY.md":{"size":363,"integrity":{"algorithm":"SHA256","hash":"95dc03eb48a629f2136bbb0d2427963e6ad71906ccd532b28074f438c5cc70ac","blockSize":4194304,"blocks":["95dc03eb48a629f2136bbb0d2427963e6ad71906ccd532b28074f438c5cc70ac"]},"offset":"19887481"},"LICENSE":{"size":1167,"integrity":{"algorithm":"SHA256","hash":"62fb7d7c1822fe783895866057247bbd50164b00631fce9e4981d3897bdee4d9","blockSize":4194304,"blocks":["62fb7d7c1822fe783895866057247bbd50164b00631fce9e4981d3897bdee4d9"]},"offset":"19887844"},"index.js":{"size":1215,"integrity":{"algorithm":"SHA256","hash":"88564234b9eeb2f0fe2cc5d03f617a97eb4802f126bdd21aa223c3c87c02531c","blockSize":4194304,"blocks":["88564234b9eeb2f0fe2cc5d03f617a97eb4802f126bdd21aa223c3c87c02531c"]},"offset":"19889011"},"package.json":{"size":500,"integrity":{"algorithm":"SHA256","hash":"262266fc64cbe457ecf17bf018f4a69c8a9ec6b22c8c062bba86afcbd406bcde","blockSize":4194304,"blocks":["262266fc64cbe457ecf17bf018f4a69c8a9ec6b22c8c062bba86afcbd406bcde"]},"offset":"19890226"}}},"methods":{"files":{"HISTORY.md":{"size":427,"integrity":{"algorithm":"SHA256","hash":"4c23c63b7e97453a1517f474714ec21d6d590bface0961788ec748b800a4e789","blockSize":4194304,"blocks":["4c23c63b7e97453a1517f474714ec21d6d590bface0961788ec748b800a4e789"]},"offset":"19890726"},"LICENSE":{"size":1180,"integrity":{"algorithm":"SHA256","hash":"1da7f0788d14d545b2b953f78a27b916d320dfa174c2fcfa124c5aaffa81056e","blockSize":4194304,"blocks":["1da7f0788d14d545b2b953f78a27b916d320dfa174c2fcfa124c5aaffa81056e"]},"offset":"19891153"},"index.js":{"size":1040,"integrity":{"algorithm":"SHA256","hash":"670576bfe96eb9e4fecd1e8c19f491a68b9bfd7da0e7564cd0a3c2ebd3839180","blockSize":4194304,"blocks":["670576bfe96eb9e4fecd1e8c19f491a68b9bfd7da0e7564cd0a3c2ebd3839180"]},"offset":"19892333"},"package.json":{"size":371,"integrity":{"algorithm":"SHA256","hash":"a3b08d515bb8b3811bbe82a033c9999575be586cb1cb33d30eb8f9b43aba335e","blockSize":4194304,"blocks":["a3b08d515bb8b3811bbe82a033c9999575be586cb1cb33d30eb8f9b43aba335e"]},"offset":"19893373"}}},"mime":{"files":{"LICENSE":{"size":1098,"integrity":{"algorithm":"SHA256","hash":"8f2658c03422c408b2b2ce4d151decc3b1a6fd3d86e5ca9433777bccdcdf75a2","blockSize":4194304,"blocks":["8f2658c03422c408b2b2ce4d151decc3b1a6fd3d86e5ca9433777bccdcdf75a2"]},"offset":"19893744"},"cli.js":{"size":149,"integrity":{"algorithm":"SHA256","hash":"f8691b2f01b77334e33bb6898d69c80dc05b18e4be66760c476331a388f9cd27","blockSize":4194304,"blocks":["f8691b2f01b77334e33bb6898d69c80dc05b18e4be66760c476331a388f9cd27"]},"offset":"19894842"},"mime.js":{"size":2726,"integrity":{"algorithm":"SHA256","hash":"a121a0b9e780e9ae349a26227a0d25c33ebac2d52a85aae5affa84ba0f53f16c","blockSize":4194304,"blocks":["a121a0b9e780e9ae349a26227a0d25c33ebac2d52a85aae5affa84ba0f53f16c"]},"offset":"19894991"},"package.json":{"size":575,"integrity":{"algorithm":"SHA256","hash":"fabc70b391b39ece1c187c403cd5ee8b0003c1ffe06d962ce5a1664e032f252a","blockSize":4194304,"blocks":["fabc70b391b39ece1c187c403cd5ee8b0003c1ffe06d962ce5a1664e032f252a"]},"offset":"19897717"},"types.json":{"size":31555,"integrity":{"algorithm":"SHA256","hash":"a5391e434b1d3d1ad0ffd2c7d2227b4dc3ceac7fc263d2ec1b93c20b9daa41f9","blockSize":4194304,"blocks":["a5391e434b1d3d1ad0ffd2c7d2227b4dc3ceac7fc263d2ec1b93c20b9daa41f9"]},"offset":"19898292"},"src":{"files":{"build.js":{"size":1351,"integrity":{"algorithm":"SHA256","hash":"facaa3974bfa27c832a629735077528b59cbc088fcfd2c22bbacba152c76ef2a","blockSize":4194304,"blocks":["facaa3974bfa27c832a629735077528b59cbc088fcfd2c22bbacba152c76ef2a"]},"offset":"19929847"},"test.js":{"size":2334,"integrity":{"algorithm":"SHA256","hash":"516efe52b18b29b36b9ac4ed1d679a497e0846b269a9cf101fb405fbcc8b402b","blockSize":4194304,"blocks":["516efe52b18b29b36b9ac4ed1d679a497e0846b269a9cf101fb405fbcc8b402b"]},"offset":"19931198"}}}}},"mime-db":{"files":{"HISTORY.md":{"size":12581,"integrity":{"algorithm":"SHA256","hash":"1e820a4ab3b25cc858eed9d2629ddb39bfd48bab307bedec769308c258199aa6","blockSize":4194304,"blocks":["1e820a4ab3b25cc858eed9d2629ddb39bfd48bab307bedec769308c258199aa6"]},"offset":"19933532"},"LICENSE":{"size":1172,"integrity":{"algorithm":"SHA256","hash":"cc1dfd4dafa27271e8212cd3b274eeb3f262e40a6fdab36ddc3f9696f706f58b","blockSize":4194304,"blocks":["cc1dfd4dafa27271e8212cd3b274eeb3f262e40a6fdab36ddc3f9696f706f58b"]},"offset":"19946113"},"db.json":{"size":185882,"integrity":{"algorithm":"SHA256","hash":"85c8e1ba609079947c8df83c092900ab0226e1d7b60e5e7105fb7dd701833263","blockSize":4194304,"blocks":["85c8e1ba609079947c8df83c092900ab0226e1d7b60e5e7105fb7dd701833263"]},"offset":"19947285"},"index.js":{"size":189,"integrity":{"algorithm":"SHA256","hash":"2ccebf3d525708c915c6a86ffbb68e5023d34c9bc30b6b4021db9ebbc6ca9ecc","blockSize":4194304,"blocks":["2ccebf3d525708c915c6a86ffbb68e5023d34c9bc30b6b4021db9ebbc6ca9ecc"]},"offset":"20133167"},"package.json":{"size":804,"integrity":{"algorithm":"SHA256","hash":"27716017d85132ae78d8224e2ecfb6659a92bb15a17743cd1f54434639eb4eed","blockSize":4194304,"blocks":["27716017d85132ae78d8224e2ecfb6659a92bb15a17743cd1f54434639eb4eed"]},"offset":"20133356"}}},"mime-types":{"files":{"HISTORY.md":{"size":8812,"integrity":{"algorithm":"SHA256","hash":"277b1cfc3e8fdb57e8b3fc9ebdef37d108ac13572b60091cccaf0e863167adc0","blockSize":4194304,"blocks":["277b1cfc3e8fdb57e8b3fc9ebdef37d108ac13572b60091cccaf0e863167adc0"]},"offset":"20134160"},"LICENSE":{"size":1167,"integrity":{"algorithm":"SHA256","hash":"71f83c4c0621102a56d9853812777b85751bce7e9726f686f5b056c1f8a4b0e6","blockSize":4194304,"blocks":["71f83c4c0621102a56d9853812777b85751bce7e9726f686f5b056c1f8a4b0e6"]},"offset":"20142972"},"index.js":{"size":3663,"integrity":{"algorithm":"SHA256","hash":"8cfccaac306beb650d60c7f069ae0f4b39d648f1e3914696b18c133ab33e6419","blockSize":4194304,"blocks":["8cfccaac306beb650d60c7f069ae0f4b39d648f1e3914696b18c133ab33e6419"]},"offset":"20144139"},"package.json":{"size":652,"integrity":{"algorithm":"SHA256","hash":"30f3180ab27b24901adfd6bc721bb700b8a7970febeee9dd2d2a4efad3d47046","blockSize":4194304,"blocks":["30f3180ab27b24901adfd6bc721bb700b8a7970febeee9dd2d2a4efad3d47046"]},"offset":"20147802"}}},"minimatch":{"files":{"LICENSE":{"size":765,"integrity":{"algorithm":"SHA256","hash":"4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b","blockSize":4194304,"blocks":["4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b"]},"offset":"20148454"},"minimatch.js":{"size":26266,"integrity":{"algorithm":"SHA256","hash":"ebae64a212004e293fd7b536f33a2ca830452f71377f4b51fa0a0e9885ee6a93","blockSize":4194304,"blocks":["ebae64a212004e293fd7b536f33a2ca830452f71377f4b51fa0a0e9885ee6a93"]},"offset":"20149219"},"package.json":{"size":529,"integrity":{"algorithm":"SHA256","hash":"4ee611480bf3df3cac69baa516cac250f813aca003bc10259db7c25b01d671ec","blockSize":4194304,"blocks":["4ee611480bf3df3cac69baa516cac250f813aca003bc10259db7c25b01d671ec"]},"offset":"20175485"}}},"minimist":{"files":{"LICENSE":{"size":1073,"integrity":{"algorithm":"SHA256","hash":"435a6722c786b0a56fbe7387028f1d9d3f3a2d0fb615bb8fee118727c3f59b7b","blockSize":4194304,"blocks":["435a6722c786b0a56fbe7387028f1d9d3f3a2d0fb615bb8fee118727c3f59b7b"]},"offset":"20176014"},"index.js":{"size":7807,"integrity":{"algorithm":"SHA256","hash":"48ab32c4ba79cde9a1b1236437942567f97b8eac7ce17013b83b548c620db652","blockSize":4194304,"blocks":["48ab32c4ba79cde9a1b1236437942567f97b8eac7ce17013b83b548c620db652"]},"offset":"20177087"},"package.json":{"size":722,"integrity":{"algorithm":"SHA256","hash":"638ea69dcfc83057b3b1473e9a6b8d0bc091d208883de19affa98412a11b743f","blockSize":4194304,"blocks":["638ea69dcfc83057b3b1473e9a6b8d0bc091d208883de19affa98412a11b743f"]},"offset":"20184894"}}},"minipass":{"files":{"LICENSE":{"size":787,"integrity":{"algorithm":"SHA256","hash":"a5a110eb524bf3217958e405b5e3411277e915a2f5902c330348877000337e53","blockSize":4194304,"blocks":["a5a110eb524bf3217958e405b5e3411277e915a2f5902c330348877000337e53"]},"offset":"20185616"},"index.js":{"size":16631,"integrity":{"algorithm":"SHA256","hash":"dbc5220c4bc8b470da9c8e561b6a5382cf3fa9dcd97cace955ac6fd34a27970c","blockSize":4194304,"blocks":["dbc5220c4bc8b470da9c8e561b6a5382cf3fa9dcd97cace955ac6fd34a27970c"]},"offset":"20186403"},"package.json":{"size":954,"integrity":{"algorithm":"SHA256","hash":"9aeefcde94dd23679712ff32c09d48001af2277f10d7a60d458e4a473ab231c6","blockSize":4194304,"blocks":["9aeefcde94dd23679712ff32c09d48001af2277f10d7a60d458e4a473ab231c6"]},"offset":"20203034"}}},"minipass-collect":{"files":{"LICENSE":{"size":765,"integrity":{"algorithm":"SHA256","hash":"4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b","blockSize":4194304,"blocks":["4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b"]},"offset":"20203988"},"index.js":{"size":1990,"integrity":{"algorithm":"SHA256","hash":"c0be2f026e526f10d430fddfa7b953888c42935d8f780c7badb2ca55b9bcbe3c","blockSize":4194304,"blocks":["c0be2f026e526f10d430fddfa7b953888c42935d8f780c7badb2ca55b9bcbe3c"]},"offset":"20204753"},"package.json":{"size":435,"integrity":{"algorithm":"SHA256","hash":"6d3b1af809bdd8746c42469557470d0c9260fd349054e1e78f3e58f424881ada","blockSize":4194304,"blocks":["6d3b1af809bdd8746c42469557470d0c9260fd349054e1e78f3e58f424881ada"]},"offset":"20206743"}}},"minipass-flush":{"files":{"LICENSE":{"size":765,"integrity":{"algorithm":"SHA256","hash":"4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b","blockSize":4194304,"blocks":["4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b"]},"offset":"20207178"},"index.js":{"size":1011,"integrity":{"algorithm":"SHA256","hash":"56d0dfbd2acbaffd7a592eb25130eed4ab12bc1c10844677b2d869d5992c36a9","blockSize":4194304,"blocks":["56d0dfbd2acbaffd7a592eb25130eed4ab12bc1c10844677b2d869d5992c36a9"]},"offset":"20207943"},"package.json":{"size":562,"integrity":{"algorithm":"SHA256","hash":"71882d875cea958f69f267484b6d35b49e8ab0d962f1a90da0d4abd86c664faf","blockSize":4194304,"blocks":["71882d875cea958f69f267484b6d35b49e8ab0d962f1a90da0d4abd86c664faf"]},"offset":"20208954"}}},"minipass-pipeline":{"files":{"LICENSE":{"size":765,"integrity":{"algorithm":"SHA256","hash":"4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b","blockSize":4194304,"blocks":["4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b"]},"offset":"20209516"},"index.js":{"size":3412,"integrity":{"algorithm":"SHA256","hash":"3deadcd27f94ba4ebff5affcaaaa5241ef441444e9169d6c37ac069c6b008cf1","blockSize":4194304,"blocks":["3deadcd27f94ba4ebff5affcaaaa5241ef441444e9169d6c37ac069c6b008cf1"]},"offset":"20210281"},"package.json":{"size":414,"integrity":{"algorithm":"SHA256","hash":"83c6586fbb2b2bc8f7ae5b8c831d7861b930f658757753a3e85f2e81c91451b7","blockSize":4194304,"blocks":["83c6586fbb2b2bc8f7ae5b8c831d7861b930f658757753a3e85f2e81c91451b7"]},"offset":"20213693"}}},"minipass-sized":{"files":{"LICENSE":{"size":765,"integrity":{"algorithm":"SHA256","hash":"4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b","blockSize":4194304,"blocks":["4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b"]},"offset":"20214107"},"index.js":{"size":1785,"integrity":{"algorithm":"SHA256","hash":"21c8904d1ce6960362bc6aa7261e3b371b8f203b60fcc57e1b54a701e96ec77d","blockSize":4194304,"blocks":["21c8904d1ce6960362bc6aa7261e3b371b8f203b60fcc57e1b54a701e96ec77d"]},"offset":"20214872"},"package.json":{"size":595,"integrity":{"algorithm":"SHA256","hash":"a9b47137a8eb6c31265b9b6179fc356c79ba76b8895a34844b1b1cdc47d84c26","blockSize":4194304,"blocks":["a9b47137a8eb6c31265b9b6179fc356c79ba76b8895a34844b1b1cdc47d84c26"]},"offset":"20216657"}}},"minizlib":{"files":{"LICENSE":{"size":1297,"integrity":{"algorithm":"SHA256","hash":"87a4800d70de7edc1640351a045bb588fcaa958093fcd1b3ee878388abceb818","blockSize":4194304,"blocks":["87a4800d70de7edc1640351a045bb588fcaa958093fcd1b3ee878388abceb818"]},"offset":"20217252"},"constants.js":{"size":3740,"integrity":{"algorithm":"SHA256","hash":"d4df7bae3260dec937f377c259a098987954c3ebbcf4145adacf598dacfb90fb","blockSize":4194304,"blocks":["d4df7bae3260dec937f377c259a098987954c3ebbcf4145adacf598dacfb90fb"]},"offset":"20218549"},"index.js":{"size":9444,"integrity":{"algorithm":"SHA256","hash":"038b01f7982845d55b30f7888698dd0d34049e99c9f6913d424e3ba41323654d","blockSize":4194304,"blocks":["038b01f7982845d55b30f7888698dd0d34049e99c9f6913d424e3ba41323654d"]},"offset":"20222289"},"package.json":{"size":586,"integrity":{"algorithm":"SHA256","hash":"c5b458935923717f17c2f2babba8dd9932eb2ddeb4c6720015f9d4d4cac4f897","blockSize":4194304,"blocks":["c5b458935923717f17c2f2babba8dd9932eb2ddeb4c6720015f9d4d4cac4f897"]},"offset":"20231733"}}},"mkdirp":{"files":{"LICENSE":{"size":1141,"integrity":{"algorithm":"SHA256","hash":"05991c2e8f070b69ec5b656c2c12fd07cd0153dd157d39b050b82af59b319a01","blockSize":4194304,"blocks":["05991c2e8f070b69ec5b656c2c12fd07cd0153dd157d39b050b82af59b319a01"]},"offset":"20232319"},"index.js":{"size":2825,"integrity":{"algorithm":"SHA256","hash":"df33312136061eee26701a34ca4f9be043b9675d359a115503dc2df909106432","blockSize":4194304,"blocks":["df33312136061eee26701a34ca4f9be043b9675d359a115503dc2df909106432"]},"offset":"20233460"},"package.json":{"size":524,"integrity":{"algorithm":"SHA256","hash":"dcdb2fd365d28ffadcd5de98859b6a544e9cd455077f921346c78a83c5493596","blockSize":4194304,"blocks":["dcdb2fd365d28ffadcd5de98859b6a544e9cd455077f921346c78a83c5493596"]},"offset":"20236285"},"bin":{"files":{"cmd.js":{"size":731,"integrity":{"algorithm":"SHA256","hash":"24b028bccb1773f02cf0d0fb3dca5468f1b5d22a06cbc5cbf351e1eb3accefb1","blockSize":4194304,"blocks":["24b028bccb1773f02cf0d0fb3dca5468f1b5d22a06cbc5cbf351e1eb3accefb1"]},"offset":"20236809"},"usage.txt":{"size":315,"integrity":{"algorithm":"SHA256","hash":"5575eeea7b83971ed81729048e24b8f5a56b902ab2e1bd43ed031a502eb84759","blockSize":4194304,"blocks":["5575eeea7b83971ed81729048e24b8f5a56b902ab2e1bd43ed031a502eb84759"]},"offset":"20237540"}}}}},"mkdirp-classic":{"files":{"LICENSE":{"size":1118,"integrity":{"algorithm":"SHA256","hash":"a255b85c1a510ecfe660c4d442ecdbc1e9d07f4b4d3d7f90443f7e5570591e0a","blockSize":4194304,"blocks":["a255b85c1a510ecfe660c4d442ecdbc1e9d07f4b4d3d7f90443f7e5570591e0a"]},"offset":"20237855"},"index.js":{"size":2630,"integrity":{"algorithm":"SHA256","hash":"6e4f5d6d26baf194cf4bbb4d82110046ed6215205b412c57a7b5097dc1623eac","blockSize":4194304,"blocks":["6e4f5d6d26baf194cf4bbb4d82110046ed6215205b412c57a7b5097dc1623eac"]},"offset":"20238973"},"package.json":{"size":389,"integrity":{"algorithm":"SHA256","hash":"c8675684cccf747ff7f7bf26673de75488f9eb872eabfa203d2c365b8bd7e8c7","blockSize":4194304,"blocks":["c8675684cccf747ff7f7bf26673de75488f9eb872eabfa203d2c365b8bd7e8c7"]},"offset":"20241603"}}},"moment":{"files":{"LICENSE":{"size":1075,"integrity":{"algorithm":"SHA256","hash":"8f38f320bbf5eb84c08e08676f7ee1d2204ebe5797f6a090d077329cf212fca3","blockSize":4194304,"blocks":["8f38f320bbf5eb84c08e08676f7ee1d2204ebe5797f6a090d077329cf212fca3"]},"offset":"20241992"},"ender.js":{"size":39,"integrity":{"algorithm":"SHA256","hash":"f7b008459f019a44747b37c0349eee9df994ff655841581000b908bc2d1427c3","blockSize":4194304,"blocks":["f7b008459f019a44747b37c0349eee9df994ff655841581000b908bc2d1427c3"]},"offset":"20243067"},"moment.js":{"size":174604,"integrity":{"algorithm":"SHA256","hash":"c33f09a4e1230f3075be8d2a94081108d52f62d3c30b9a238941fe80790267c6","blockSize":4194304,"blocks":["c33f09a4e1230f3075be8d2a94081108d52f62d3c30b9a238941fe80790267c6"]},"offset":"20243106"},"package.js":{"size":273,"integrity":{"algorithm":"SHA256","hash":"6334f70497c6d8fd22adb3089eec30bf1e2b3dacf92508df52eaa7a8aee12bba","blockSize":4194304,"blocks":["6334f70497c6d8fd22adb3089eec30bf1e2b3dacf92508df52eaa7a8aee12bba"]},"offset":"20417710"},"package.json":{"size":1742,"integrity":{"algorithm":"SHA256","hash":"30806a7d02aefc6d6a0d8c92b06aa9fadffa03e26ed18fd5058eee7e88ebbe6b","blockSize":4194304,"blocks":["30806a7d02aefc6d6a0d8c92b06aa9fadffa03e26ed18fd5058eee7e88ebbe6b"]},"offset":"20417983"},"src":{"files":{"moment.js":{"size":2694,"integrity":{"algorithm":"SHA256","hash":"dbed8eccce423de9fb4ac9f619333d5b4d47fbcb3adad0202ccd0caf6e9caa45","blockSize":4194304,"blocks":["dbed8eccce423de9fb4ac9f619333d5b4d47fbcb3adad0202ccd0caf6e9caa45"]},"offset":"20419725"},"locale":{"files":{"af.js":{"size":2149,"integrity":{"algorithm":"SHA256","hash":"203e2a88aa3c7d1ac73d73af5f05f45d38de5e4ab116756f9a4a5eb4edb938d5","blockSize":4194304,"blocks":["203e2a88aa3c7d1ac73d73af5f05f45d38de5e4ab116756f9a4a5eb4edb938d5"]},"offset":"20422419"},"ar-dz.js":{"size":4449,"integrity":{"algorithm":"SHA256","hash":"9ca151d5d32d2aee2513b46f4563af75317cb6bc80c84a2cdd036d3b0583fbea","blockSize":4194304,"blocks":["9ca151d5d32d2aee2513b46f4563af75317cb6bc80c84a2cdd036d3b0583fbea"]},"offset":"20424568"},"ar-kw.js":{"size":1934,"integrity":{"algorithm":"SHA256","hash":"05db52433db1cd184dd86ea13627585caa277842b803cfad24dd9700e95a3d9b","blockSize":4194304,"blocks":["05db52433db1cd184dd86ea13627585caa277842b803cfad24dd9700e95a3d9b"]},"offset":"20429017"},"ar-ly.js":{"size":4648,"integrity":{"algorithm":"SHA256","hash":"eb3346cc67eb2687374abd9afb643a6787a18b695d171747b6346cc255be746a","blockSize":4194304,"blocks":["eb3346cc67eb2687374abd9afb643a6787a18b695d171747b6346cc255be746a"]},"offset":"20430951"},"ar-ma.js":{"size":1989,"integrity":{"algorithm":"SHA256","hash":"3c5e1d7da8592652d9543b7c6683fe53885b51444ab026acc6b1ab11555d430b","blockSize":4194304,"blocks":["3c5e1d7da8592652d9543b7c6683fe53885b51444ab026acc6b1ab11555d430b"]},"offset":"20435599"},"ar-sa.js":{"size":3042,"integrity":{"algorithm":"SHA256","hash":"270c96fde1f824cee84a9ceab5570d2288aaacc821f288daf2ea2e71edb37f63","blockSize":4194304,"blocks":["270c96fde1f824cee84a9ceab5570d2288aaacc821f288daf2ea2e71edb37f63"]},"offset":"20437588"},"ar-tn.js":{"size":1936,"integrity":{"algorithm":"SHA256","hash":"e7cfa73dce796c5e91594f4474fa81f23f04f1f3cb744c8bcf45acc9231e2c23","blockSize":4194304,"blocks":["e7cfa73dce796c5e91594f4474fa81f23f04f1f3cb744c8bcf45acc9231e2c23"]},"offset":"20440630"},"ar.js":{"size":5072,"integrity":{"algorithm":"SHA256","hash":"e7684ee61213f2d7fee0269e0a49b42e3a82f391193cf469ab980842cb6cf029","blockSize":4194304,"blocks":["e7684ee61213f2d7fee0269e0a49b42e3a82f391193cf469ab980842cb6cf029"]},"offset":"20442566"},"az.js":{"size":2846,"integrity":{"algorithm":"SHA256","hash":"54cdde438de2f5dd7ff1ddb6841fae7a3a66b080ff6216542ca6495381a715c8","blockSize":4194304,"blocks":["54cdde438de2f5dd7ff1ddb6841fae7a3a66b080ff6216542ca6495381a715c8"]},"offset":"20447638"},"be.js":{"size":5154,"integrity":{"algorithm":"SHA256","hash":"93bd7cc907fe69c36a6a8bfb3ae2d4d3e787c867d3fa1d0a5740c3f121827e85","blockSize":4194304,"blocks":["93bd7cc907fe69c36a6a8bfb3ae2d4d3e787c867d3fa1d0a5740c3f121827e85"]},"offset":"20450484"},"bg.js":{"size":2955,"integrity":{"algorithm":"SHA256","hash":"1d9c3b15eaabab63bc4e6bea7f1f62dd0c04c97615e3af2c91bd9bfccd9dca93","blockSize":4194304,"blocks":["1d9c3b15eaabab63bc4e6bea7f1f62dd0c04c97615e3af2c91bd9bfccd9dca93"]},"offset":"20455638"},"bm.js":{"size":1784,"integrity":{"algorithm":"SHA256","hash":"d264e9178a3e775007241f9d464ee7bbe42e53ee105e203ddcfb1c24b061eaa3","blockSize":4194304,"blocks":["d264e9178a3e775007241f9d464ee7bbe42e53ee105e203ddcfb1c24b061eaa3"]},"offset":"20458593"},"bn-bd.js":{"size":4349,"integrity":{"algorithm":"SHA256","hash":"62ea7b81624d2a93dc236d1cb1f63dd64a0b8146aaf93b95c924c5b03731b1f1","blockSize":4194304,"blocks":["62ea7b81624d2a93dc236d1cb1f63dd64a0b8146aaf93b95c924c5b03731b1f1"]},"offset":"20460377"},"bn.js":{"size":3898,"integrity":{"algorithm":"SHA256","hash":"431018a0f29f9f811fa707c98cea9198f7039cf01350fb1aaeb855eccfadd169","blockSize":4194304,"blocks":["431018a0f29f9f811fa707c98cea9198f7039cf01350fb1aaeb855eccfadd169"]},"offset":"20464726"},"bo.js":{"size":4399,"integrity":{"algorithm":"SHA256","hash":"714b54feaeea292198f2cbb6f6e44cebe4fc7deec6367b3d78ca5bebdf6f422f","blockSize":4194304,"blocks":["714b54feaeea292198f2cbb6f6e44cebe4fc7deec6367b3d78ca5bebdf6f422f"]},"offset":"20468624"},"br.js":{"size":4544,"integrity":{"algorithm":"SHA256","hash":"db8689c68771c1edf5d28627333ebb659f3d27f0a6b5661daafe1f06d2c8dbe3","blockSize":4194304,"blocks":["db8689c68771c1edf5d28627333ebb659f3d27f0a6b5661daafe1f06d2c8dbe3"]},"offset":"20473023"},"bs.js":{"size":4475,"integrity":{"algorithm":"SHA256","hash":"918f32d2f6e8331a982044f6e3b381a76c36b233ea1b947ae59e6bf756edce60","blockSize":4194304,"blocks":["918f32d2f6e8331a982044f6e3b381a76c36b233ea1b947ae59e6bf756edce60"]},"offset":"20477567"},"ca.js":{"size":3031,"integrity":{"algorithm":"SHA256","hash":"8b3d4ec6d5e5a2a2e4eda9a8fcfb90553afa77393df52f336236fb347286fbce","blockSize":4194304,"blocks":["8b3d4ec6d5e5a2a2e4eda9a8fcfb90553afa77393df52f336236fb347286fbce"]},"offset":"20482042"},"cs.js":{"size":6718,"integrity":{"algorithm":"SHA256","hash":"b6e4c0920fa798daea65b08323f344f1b50d63325ee23298f5f4ed8a98d728d3","blockSize":4194304,"blocks":["b6e4c0920fa798daea65b08323f344f1b50d63325ee23298f5f4ed8a98d728d3"]},"offset":"20485073"},"cv.js":{"size":2341,"integrity":{"algorithm":"SHA256","hash":"61de7c720ff21cb2ad58e86c8ab72a5af21c52d252f6f8f538f4e657e207ab21","blockSize":4194304,"blocks":["61de7c720ff21cb2ad58e86c8ab72a5af21c52d252f6f8f538f4e657e207ab21"]},"offset":"20491791"},"cy.js":{"size":2834,"integrity":{"algorithm":"SHA256","hash":"c62fb82208566696275a9a84ec6c142f147c132f1d80fb03d4c92ac5b4398f47","blockSize":4194304,"blocks":["c62fb82208566696275a9a84ec6c142f147c132f1d80fb03d4c92ac5b4398f47"]},"offset":"20494132"},"da.js":{"size":1629,"integrity":{"algorithm":"SHA256","hash":"e93cbb4f32c15585ade43825f4bafb4eb97567a510756c5b54f2d976d46b40c9","blockSize":4194304,"blocks":["e93cbb4f32c15585ade43825f4bafb4eb97567a510756c5b54f2d976d46b40c9"]},"offset":"20496966"},"de-at.js":{"size":2635,"integrity":{"algorithm":"SHA256","hash":"2c79472151dc55814dea66c60ad0057a614309b637a1c3f758907162c7f2c6a9","blockSize":4194304,"blocks":["2c79472151dc55814dea66c60ad0057a614309b637a1c3f758907162c7f2c6a9"]},"offset":"20498595"},"de-ch.js":{"size":2563,"integrity":{"algorithm":"SHA256","hash":"c34cd1e459f9643e616d7744c6aed45d856df7953b3821441eff6ffe6f6d2992","blockSize":4194304,"blocks":["c34cd1e459f9643e616d7744c6aed45d856df7953b3821441eff6ffe6f6d2992"]},"offset":"20501230"},"de.js":{"size":2562,"integrity":{"algorithm":"SHA256","hash":"bb127d18562814f3b89737fc4cbff5774e09ce7cc5c3ce19b09348d94e36a53b","blockSize":4194304,"blocks":["bb127d18562814f3b89737fc4cbff5774e09ce7cc5c3ce19b09348d94e36a53b"]},"offset":"20503793"},"dv.js":{"size":2464,"integrity":{"algorithm":"SHA256","hash":"a143e02b80550dbc90713796bd0094942a0dd58d23449b71e5846d86c9bb4224","blockSize":4194304,"blocks":["a143e02b80550dbc90713796bd0094942a0dd58d23449b71e5846d86c9bb4224"]},"offset":"20506355"},"el.js":{"size":3877,"integrity":{"algorithm":"SHA256","hash":"6d947bde8e28849626f86154b11ae5446e4a8dde0f599037c9c9edd6a25e410a","blockSize":4194304,"blocks":["6d947bde8e28849626f86154b11ae5446e4a8dde0f599037c9c9edd6a25e410a"]},"offset":"20508819"},"en-au.js":{"size":2029,"integrity":{"algorithm":"SHA256","hash":"409391b33bc5fc1fcb61b9fee48bda0e3608f15323fc06988ae880eacf02c800","blockSize":4194304,"blocks":["409391b33bc5fc1fcb61b9fee48bda0e3608f15323fc06988ae880eacf02c800"]},"offset":"20512696"},"en-ca.js":{"size":1878,"integrity":{"algorithm":"SHA256","hash":"cf4ec7fabf11593a398075b638bb1dac307477ef819a106825d3b1709d2a8ff7","blockSize":4194304,"blocks":["cf4ec7fabf11593a398075b638bb1dac307477ef819a106825d3b1709d2a8ff7"]},"offset":"20514725"},"en-gb.js":{"size":2035,"integrity":{"algorithm":"SHA256","hash":"c652887658c284f3de712fca5bc0c12cc2d9fc71a03691a8bf199aac62ae4f02","blockSize":4194304,"blocks":["c652887658c284f3de712fca5bc0c12cc2d9fc71a03691a8bf199aac62ae4f02"]},"offset":"20516603"},"en-ie.js":{"size":2033,"integrity":{"algorithm":"SHA256","hash":"21678eb92796b3576c96dca63b3ca875a9e283f06dc56d3b00b29f2867b14435","blockSize":4194304,"blocks":["21678eb92796b3576c96dca63b3ca875a9e283f06dc56d3b00b29f2867b14435"]},"offset":"20518638"},"en-il.js":{"size":1871,"integrity":{"algorithm":"SHA256","hash":"2baf5467136c2b16cba796109c5311bd81b031a0b98950121b2134f123afeb9b","blockSize":4194304,"blocks":["2baf5467136c2b16cba796109c5311bd81b031a0b98950121b2134f123afeb9b"]},"offset":"20520671"},"en-in.js":{"size":2029,"integrity":{"algorithm":"SHA256","hash":"e04b56e50944516aafa6a3084988ecc8e4b5191e13ad2bb3c3761083bea6de4b","blockSize":4194304,"blocks":["e04b56e50944516aafa6a3084988ecc8e4b5191e13ad2bb3c3761083bea6de4b"]},"offset":"20522542"},"en-nz.js":{"size":2038,"integrity":{"algorithm":"SHA256","hash":"aab44ef9efcd9351aa2a9943da707f2f5ea3d6a9fc55c919aecd70422e738d69","blockSize":4194304,"blocks":["aab44ef9efcd9351aa2a9943da707f2f5ea3d6a9fc55c919aecd70422e738d69"]},"offset":"20524571"},"en-sg.js":{"size":2047,"integrity":{"algorithm":"SHA256","hash":"52872f32f2a3f2d794ec5ee8bad839b42300d646eac2b9540d454be6143dc068","blockSize":4194304,"blocks":["52872f32f2a3f2d794ec5ee8bad839b42300d646eac2b9540d454be6143dc068"]},"offset":"20526609"},"eo.js":{"size":2338,"integrity":{"algorithm":"SHA256","hash":"443218cf6980aef8a1b3237fc18f916de2b8c84246b61af41dbc3eb34edf4817","blockSize":4194304,"blocks":["443218cf6980aef8a1b3237fc18f916de2b8c84246b61af41dbc3eb34edf4817"]},"offset":"20528656"},"es-do.js":{"size":3441,"integrity":{"algorithm":"SHA256","hash":"a85e82558787c7e7f6dcb71c2dff9abd868a74db1f7faafc0c93f5ae6b59dc97","blockSize":4194304,"blocks":["a85e82558787c7e7f6dcb71c2dff9abd868a74db1f7faafc0c93f5ae6b59dc97"]},"offset":"20530994"},"es-mx.js":{"size":3510,"integrity":{"algorithm":"SHA256","hash":"538c66ceab06fb6b9634ebc0aa72b3d7b6a04a30b496c2e53eb94c9014be6f6f","blockSize":4194304,"blocks":["538c66ceab06fb6b9634ebc0aa72b3d7b6a04a30b496c2e53eb94c9014be6f6f"]},"offset":"20534435"},"es-us.js":{"size":3538,"integrity":{"algorithm":"SHA256","hash":"e7dd8f7d47cce040b040f54f89369b58d6b04c2e341f42d1fe623948d019d3d6","blockSize":4194304,"blocks":["e7dd8f7d47cce040b040f54f89369b58d6b04c2e341f42d1fe623948d019d3d6"]},"offset":"20537945"},"es.js":{"size":3498,"integrity":{"algorithm":"SHA256","hash":"b48d9086c00c8e7a896801d2b087cb9fb2f2397ab6c0c4e3ca2b39fc36de1bfc","blockSize":4194304,"blocks":["b48d9086c00c8e7a896801d2b087cb9fb2f2397ab6c0c4e3ca2b39fc36de1bfc"]},"offset":"20541483"},"et.js":{"size":2631,"integrity":{"algorithm":"SHA256","hash":"7b29b6b32394722b97b097c7c16a25fea6fdc02e2132525221fdc87534d35c3c","blockSize":4194304,"blocks":["7b29b6b32394722b97b097c7c16a25fea6fdc02e2132525221fdc87534d35c3c"]},"offset":"20544981"},"eu.js":{"size":1964,"integrity":{"algorithm":"SHA256","hash":"c212d561aa1d1d366b4af25550cb694471704d7ceefdb86573cfeb01ba3bc0ee","blockSize":4194304,"blocks":["c212d561aa1d1d366b4af25550cb694471704d7ceefdb86573cfeb01ba3bc0ee"]},"offset":"20547612"},"fa.js":{"size":3230,"integrity":{"algorithm":"SHA256","hash":"df6018d93d7eb824f1b4b5781757e85ecb03ca74bccea314357b1d3085c00a1b","blockSize":4194304,"blocks":["df6018d93d7eb824f1b4b5781757e85ecb03ca74bccea314357b1d3085c00a1b"]},"offset":"20549576"},"fi.js":{"size":3632,"integrity":{"algorithm":"SHA256","hash":"928dc7ff4e6b2ab5d186d5d22c80eca75ba6c1827b3e2ea9397d3b6dffcd7fd2","blockSize":4194304,"blocks":["928dc7ff4e6b2ab5d186d5d22c80eca75ba6c1827b3e2ea9397d3b6dffcd7fd2"]},"offset":"20552806"},"fil.js":{"size":1776,"integrity":{"algorithm":"SHA256","hash":"5cf1f1e21ff82efdc535e223a41e62e135ffb77a55880dfb0c1e3583e12dbab0","blockSize":4194304,"blocks":["5cf1f1e21ff82efdc535e223a41e62e135ffb77a55880dfb0c1e3583e12dbab0"]},"offset":"20556438"},"fo.js":{"size":1772,"integrity":{"algorithm":"SHA256","hash":"3e3ed3c52c28076b979e2217254a1973660d493560a01fcae478c40826ff7d12","blockSize":4194304,"blocks":["3e3ed3c52c28076b979e2217254a1973660d493560a01fcae478c40826ff7d12"]},"offset":"20558214"},"fr-ca.js":{"size":2104,"integrity":{"algorithm":"SHA256","hash":"c94d4a653d2a3ad27800e918b5ce52f1e90987d85cf539f5a0018b3ccf816adc","blockSize":4194304,"blocks":["c94d4a653d2a3ad27800e918b5ce52f1e90987d85cf539f5a0018b3ccf816adc"]},"offset":"20559986"},"fr-ch.js":{"size":2263,"integrity":{"algorithm":"SHA256","hash":"1be16e64aa8a831f587a9acfa2b208c55c1930b9c6110e5ac4d6b82af44f51f0","blockSize":4194304,"blocks":["1be16e64aa8a831f587a9acfa2b208c55c1930b9c6110e5ac4d6b82af44f51f0"]},"offset":"20562090"},"fr.js":{"size":3471,"integrity":{"algorithm":"SHA256","hash":"1f308241c4081c7b92f6876e40b59ed281a0eddb5266f087c4600ccaee54513d","blockSize":4194304,"blocks":["1f308241c4081c7b92f6876e40b59ed281a0eddb5266f087c4600ccaee54513d"]},"offset":"20564353"},"fy.js":{"size":2275,"integrity":{"algorithm":"SHA256","hash":"f5c13170fe7d2d32128885e393f56efe431e267bcc75b26b121c0ba9493598f8","blockSize":4194304,"blocks":["f5c13170fe7d2d32128885e393f56efe431e267bcc75b26b121c0ba9493598f8"]},"offset":"20567824"},"ga.js":{"size":2360,"integrity":{"algorithm":"SHA256","hash":"ab3a47a8df789cdc71f2c44afc16cddd679f6a1e168db81da5c2724a555dec7e","blockSize":4194304,"blocks":["ab3a47a8df789cdc71f2c44afc16cddd679f6a1e168db81da5c2724a555dec7e"]},"offset":"20570099"},"gd.js":{"size":2380,"integrity":{"algorithm":"SHA256","hash":"96e22b8bb1187179a379c385091e46b4aa530ddc3964656c5fd4fe3f7d3df262","blockSize":4194304,"blocks":["96e22b8bb1187179a379c385091e46b4aa530ddc3964656c5fd4fe3f7d3df262"]},"offset":"20572459"},"gl.js":{"size":2347,"integrity":{"algorithm":"SHA256","hash":"225c8a483a4d06136863fa2202fc2078a453d9c0c3aa7e9ab5acc1d0cc985ee9","blockSize":4194304,"blocks":["225c8a483a4d06136863fa2202fc2078a453d9c0c3aa7e9ab5acc1d0cc985ee9"]},"offset":"20574839"},"gom-deva.js":{"size":5506,"integrity":{"algorithm":"SHA256","hash":"ba49d34725e12b0c4c3bf7cce3c3476a762e8a0cea3a85589c0e5e7fe8fe0981","blockSize":4194304,"blocks":["ba49d34725e12b0c4c3bf7cce3c3476a762e8a0cea3a85589c0e5e7fe8fe0981"]},"offset":"20577186"},"gom-latn.js":{"size":4130,"integrity":{"algorithm":"SHA256","hash":"86fc8f647d7c75272c8d34e9d42b82b52a8a2b3d938f2912bfedd5f17430bafb","blockSize":4194304,"blocks":["86fc8f647d7c75272c8d34e9d42b82b52a8a2b3d938f2912bfedd5f17430bafb"]},"offset":"20582692"},"gu.js":{"size":4132,"integrity":{"algorithm":"SHA256","hash":"ffa459a40a7a67227c8bacc5ed29cfa9b3aacf8d0604b101618cdead2bb5d725","blockSize":4194304,"blocks":["ffa459a40a7a67227c8bacc5ed29cfa9b3aacf8d0604b101618cdead2bb5d725"]},"offset":"20586822"},"he.js":{"size":3211,"integrity":{"algorithm":"SHA256","hash":"43a3d85cc1b9833a55e4730401e9e3261a00ab862b5a766171268e6b9cc98c6a","blockSize":4194304,"blocks":["43a3d85cc1b9833a55e4730401e9e3261a00ab862b5a766171268e6b9cc98c6a"]},"offset":"20590954"},"hi.js":{"size":6421,"integrity":{"algorithm":"SHA256","hash":"143125d99ab68e9daae7ca2a62fdc523e4469fd47f8f9eb16d0a6743f4eac93d","blockSize":4194304,"blocks":["143125d99ab68e9daae7ca2a62fdc523e4469fd47f8f9eb16d0a6743f4eac93d"]},"offset":"20594165"},"hr.js":{"size":4718,"integrity":{"algorithm":"SHA256","hash":"21164a159b0acf3b7ba54d1dbf570f0913304f3dab27ef279bcbef6d2df2b85e","blockSize":4194304,"blocks":["21164a159b0acf3b7ba54d1dbf570f0913304f3dab27ef279bcbef6d2df2b85e"]},"offset":"20600586"},"hu.js":{"size":3815,"integrity":{"algorithm":"SHA256","hash":"99070988d57aed055b822a5267782fb1bb00dfdf50918936674cc62db250a42b","blockSize":4194304,"blocks":["99070988d57aed055b822a5267782fb1bb00dfdf50918936674cc62db250a42b"]},"offset":"20605304"},"hy-am.js":{"size":3236,"integrity":{"algorithm":"SHA256","hash":"3a7848726dd1c8d7030bbaaf467b6d44f67048097ca3cd1b1378d8011ce349fb","blockSize":4194304,"blocks":["3a7848726dd1c8d7030bbaaf467b6d44f67048097ca3cd1b1378d8011ce349fb"]},"offset":"20609119"},"id.js":{"size":2375,"integrity":{"algorithm":"SHA256","hash":"ba246e24a058bd362fcf4790e3dcd0c044c5b73e9029f0cbab539c162c23e065","blockSize":4194304,"blocks":["ba246e24a058bd362fcf4790e3dcd0c044c5b73e9029f0cbab539c162c23e065"]},"offset":"20612355"},"is.js":{"size":4458,"integrity":{"algorithm":"SHA256","hash":"29856999dcc1a23cf894a611cc2d2f0f97f67b89d4cc4c8d2d73e5ff320e9929","blockSize":4194304,"blocks":["29856999dcc1a23cf894a611cc2d2f0f97f67b89d4cc4c8d2d73e5ff320e9929"]},"offset":"20614730"},"it-ch.js":{"size":1941,"integrity":{"algorithm":"SHA256","hash":"d9abf16eed703724980bad09af56c3e19c65d6973718167dd0f7f97b589b490b","blockSize":4194304,"blocks":["d9abf16eed703724980bad09af56c3e19c65d6973718167dd0f7f97b589b490b"]},"offset":"20619188"},"it.js":{"size":3251,"integrity":{"algorithm":"SHA256","hash":"7f4a1a4fffce32b55081cc3c24e5239b152270f7a22e862a448cd6ca3281b7ff","blockSize":4194304,"blocks":["7f4a1a4fffce32b55081cc3c24e5239b152270f7a22e862a448cd6ca3281b7ff"]},"offset":"20621129"},"ja.js":{"size":3955,"integrity":{"algorithm":"SHA256","hash":"4aa4e657a049839f01ebbfe60b90919b6584f0ce797e5b5e5f7ad7157e2b0a22","blockSize":4194304,"blocks":["4aa4e657a049839f01ebbfe60b90919b6584f0ce797e5b5e5f7ad7157e2b0a22"]},"offset":"20624380"},"jv.js":{"size":2384,"integrity":{"algorithm":"SHA256","hash":"cdc4887a249d28946a9f8f880d6234ddaaebd69533b84d05791f712e2e801748","blockSize":4194304,"blocks":["cdc4887a249d28946a9f8f880d6234ddaaebd69533b84d05791f712e2e801748"]},"offset":"20628335"},"ka.js":{"size":3504,"integrity":{"algorithm":"SHA256","hash":"8ecb232268b139d31a0d6e6da4acce0b059ccfd81d711c0e73db0d98e2524d87","blockSize":4194304,"blocks":["8ecb232268b139d31a0d6e6da4acce0b059ccfd81d711c0e73db0d98e2524d87"]},"offset":"20630719"},"kk.js":{"size":2495,"integrity":{"algorithm":"SHA256","hash":"265a11f33b159887543d11d2bd3a7007242e5de65b04def844b73a47fd0b27bc","blockSize":4194304,"blocks":["265a11f33b159887543d11d2bd3a7007242e5de65b04def844b73a47fd0b27bc"]},"offset":"20634223"},"km.js":{"size":3362,"integrity":{"algorithm":"SHA256","hash":"a0679eb448bba45d9653b301e88ea67b594abe23d97c9d35379e6b510e54ee6b","blockSize":4194304,"blocks":["a0679eb448bba45d9653b301e88ea67b594abe23d97c9d35379e6b510e54ee6b"]},"offset":"20636718"},"kn.js":{"size":4252,"integrity":{"algorithm":"SHA256","hash":"c03429cde5ac7c9cba39a8a077a60eb0e3fa9fc1a175ae5e4b43df91aa3ae371","blockSize":4194304,"blocks":["c03429cde5ac7c9cba39a8a077a60eb0e3fa9fc1a175ae5e4b43df91aa3ae371"]},"offset":"20640080"},"ko.js":{"size":2223,"integrity":{"algorithm":"SHA256","hash":"024f63bc2d036a0a2959dbaa0ff38e67fb12785695be978b3f01a7cfe6e883de","blockSize":4194304,"blocks":["024f63bc2d036a0a2959dbaa0ff38e67fb12785695be978b3f01a7cfe6e883de"]},"offset":"20644332"},"ku.js":{"size":3330,"integrity":{"algorithm":"SHA256","hash":"151754a7034385e460fc776296b4a13cadb357634395b69c3188ba2d5a679271","blockSize":4194304,"blocks":["151754a7034385e460fc776296b4a13cadb357634395b69c3188ba2d5a679271"]},"offset":"20646555"},"ky.js":{"size":2521,"integrity":{"algorithm":"SHA256","hash":"ecec6ddbb82dec2edab9647f221a5942f27490c413e943be85c5da59d55e2d46","blockSize":4194304,"blocks":["ecec6ddbb82dec2edab9647f221a5942f27490c413e943be85c5da59d55e2d46"]},"offset":"20649885"},"lb.js":{"size":4269,"integrity":{"algorithm":"SHA256","hash":"ba8c460128bd3bf50a90ce4c1e50d6bb03647a834141d711dd341ac17c93edf5","blockSize":4194304,"blocks":["ba8c460128bd3bf50a90ce4c1e50d6bb03647a834141d711dd341ac17c93edf5"]},"offset":"20652406"},"lo.js":{"size":2585,"integrity":{"algorithm":"SHA256","hash":"91b0133717eac7637162cc39ebbd063ce17a918384702df93216e379155c1343","blockSize":4194304,"blocks":["91b0133717eac7637162cc39ebbd063ce17a918384702df93216e379155c1343"]},"offset":"20656675"},"lt.js":{"size":4005,"integrity":{"algorithm":"SHA256","hash":"c1c8402e4e2de7d517ab5f3b6fa4d145773fb211a4f43585c0ae755121d18038","blockSize":4194304,"blocks":["c1c8402e4e2de7d517ab5f3b6fa4d145773fb211a4f43585c0ae755121d18038"]},"offset":"20659260"},"lv.js":{"size":3449,"integrity":{"algorithm":"SHA256","hash":"ac9998a307db76ebf48b8413f3e4743955e1e8446169607ce855f7206c0ad885","blockSize":4194304,"blocks":["ac9998a307db76ebf48b8413f3e4743955e1e8446169607ce855f7206c0ad885"]},"offset":"20663265"},"me.js":{"size":3661,"integrity":{"algorithm":"SHA256","hash":"8977a4f9512d9aa28f2d784a1739101025063812f3e50e1a4246e4c733dd2763","blockSize":4194304,"blocks":["8977a4f9512d9aa28f2d784a1739101025063812f3e50e1a4246e4c733dd2763"]},"offset":"20666714"},"mi.js":{"size":2023,"integrity":{"algorithm":"SHA256","hash":"31d67b95ec7f502eed602f1370c431802b0468b5651c443173ca45b472a06bc5","blockSize":4194304,"blocks":["31d67b95ec7f502eed602f1370c431802b0468b5651c443173ca45b472a06bc5"]},"offset":"20670375"},"mk.js":{"size":3021,"integrity":{"algorithm":"SHA256","hash":"6d3cdcc4fd7216a935ed80a155e1d4db500639b309aafe22eecfc9a49f44dc0a","blockSize":4194304,"blocks":["6d3cdcc4fd7216a935ed80a155e1d4db500639b309aafe22eecfc9a49f44dc0a"]},"offset":"20672398"},"ml.js":{"size":3287,"integrity":{"algorithm":"SHA256","hash":"71bff5aac2463a7b9378274771c0abadff30fa2dfbbf0456a8e2de4199605de9","blockSize":4194304,"blocks":["71bff5aac2463a7b9378274771c0abadff30fa2dfbbf0456a8e2de4199605de9"]},"offset":"20675419"},"mn.js":{"size":3414,"integrity":{"algorithm":"SHA256","hash":"34c52784fa1c92ae95c6b2d41db748022c7257994c8c93c9f1913dd3f18c9f38","blockSize":4194304,"blocks":["34c52784fa1c92ae95c6b2d41db748022c7257994c8c93c9f1913dd3f18c9f38"]},"offset":"20678706"},"mr.js":{"size":6574,"integrity":{"algorithm":"SHA256","hash":"3c6cfdfc3046e12700b48a27c0de5e4ae6e825d20c729e6d0152e4ad28b08d81","blockSize":4194304,"blocks":["3c6cfdfc3046e12700b48a27c0de5e4ae6e825d20c729e6d0152e4ad28b08d81"]},"offset":"20682120"},"ms-my.js":{"size":2330,"integrity":{"algorithm":"SHA256","hash":"2158e9feb634e5fd7bc3e0ea2acbff3b4c0762bcff6b09c7c98d2b7534bf1e3d","blockSize":4194304,"blocks":["2158e9feb634e5fd7bc3e0ea2acbff3b4c0762bcff6b09c7c98d2b7534bf1e3d"]},"offset":"20688694"},"ms.js":{"size":2277,"integrity":{"algorithm":"SHA256","hash":"028ed948cf621a57cdffef126ee494b5420165c0481baff79867bd5349576d3e","blockSize":4194304,"blocks":["028ed948cf621a57cdffef126ee494b5420165c0481baff79867bd5349576d3e"]},"offset":"20691024"},"mt.js":{"size":1684,"integrity":{"algorithm":"SHA256","hash":"02136212d059a91d90bafb4a6ce64b3ce52b755cb798bf9a2e15815106be21c4","blockSize":4194304,"blocks":["02136212d059a91d90bafb4a6ce64b3ce52b755cb798bf9a2e15815106be21c4"]},"offset":"20693301"},"my.js":{"size":3094,"integrity":{"algorithm":"SHA256","hash":"82fd3552ff9d7ee31c383dcbc82825f818a7f1d293f380cd4a92d7d6c43d8872","blockSize":4194304,"blocks":["82fd3552ff9d7ee31c383dcbc82825f818a7f1d293f380cd4a92d7d6c43d8872"]},"offset":"20694985"},"nb.js":{"size":1899,"integrity":{"algorithm":"SHA256","hash":"968d9ef135370bab76ad822ecf6b0e57c3c207026687d0f0cf874a72c3e095c9","blockSize":4194304,"blocks":["968d9ef135370bab76ad822ecf6b0e57c3c207026687d0f0cf874a72c3e095c9"]},"offset":"20698079"},"ne.js":{"size":4031,"integrity":{"algorithm":"SHA256","hash":"43b7c2828a3db6a932679ed86be8af8b6951671e56647562a453b0db649b81f1","blockSize":4194304,"blocks":["43b7c2828a3db6a932679ed86be8af8b6951671e56647562a453b0db649b81f1"]},"offset":"20699978"},"nl-be.js":{"size":3169,"integrity":{"algorithm":"SHA256","hash":"116c2375bf4d059d45a9cdf86fa268c9afd17541b6c308189a05707fd5665159","blockSize":4194304,"blocks":["116c2375bf4d059d45a9cdf86fa268c9afd17541b6c308189a05707fd5665159"]},"offset":"20704009"},"nl.js":{"size":3202,"integrity":{"algorithm":"SHA256","hash":"c7486c436b554d746ee6d9a3e36dc68c87fd5690ef7d6772774263487ae3e53f","blockSize":4194304,"blocks":["c7486c436b554d746ee6d9a3e36dc68c87fd5690ef7d6772774263487ae3e53f"]},"offset":"20707178"},"nn.js":{"size":1828,"integrity":{"algorithm":"SHA256","hash":"e7ef9ffbd17dd051ff1e51479bdb9310382f7f2eee345b1e863ee6ea719a8376","blockSize":4194304,"blocks":["e7ef9ffbd17dd051ff1e51479bdb9310382f7f2eee345b1e863ee6ea719a8376"]},"offset":"20710380"},"oc-lnc.js":{"size":2472,"integrity":{"algorithm":"SHA256","hash":"06c264c52dabbf44c881dd47af5a268621d7450debe2f304c221751e27ac3bfd","blockSize":4194304,"blocks":["06c264c52dabbf44c881dd47af5a268621d7450debe2f304c221751e27ac3bfd"]},"offset":"20712208"},"pa-in.js":{"size":4198,"integrity":{"algorithm":"SHA256","hash":"bd66b9185fd0c57357132d3792717aca3fce5a6ede32316ff1c7c07d0799f42e","blockSize":4194304,"blocks":["bd66b9185fd0c57357132d3792717aca3fce5a6ede32316ff1c7c07d0799f42e"]},"offset":"20714680"},"pl.js":{"size":4166,"integrity":{"algorithm":"SHA256","hash":"4be50fa0935b09ca2a419f15e0317353cdaee4ae03fabd8b7c1bedecb1b32d8b","blockSize":4194304,"blocks":["4be50fa0935b09ca2a419f15e0317353cdaee4ae03fabd8b7c1bedecb1b32d8b"]},"offset":"20718878"},"pt-br.js":{"size":1854,"integrity":{"algorithm":"SHA256","hash":"7428b67375cb5c3cc044e747715e1f223b2eb6598b0d5e354b902a93b56a1bad","blockSize":4194304,"blocks":["7428b67375cb5c3cc044e747715e1f223b2eb6598b0d5e354b902a93b56a1bad"]},"offset":"20723044"},"pt.js":{"size":1968,"integrity":{"algorithm":"SHA256","hash":"60737133cad0063bd5c3e31f348ee2014b00b961f91ad85050a0e19cb2636e56","blockSize":4194304,"blocks":["60737133cad0063bd5c3e31f348ee2014b00b961f91ad85050a0e19cb2636e56"]},"offset":"20724898"},"ro.js":{"size":2319,"integrity":{"algorithm":"SHA256","hash":"75152a2d8d10667bbb146af4d65a3e59c6a88ff8386097f80f76e753df507b24","blockSize":4194304,"blocks":["75152a2d8d10667bbb146af4d65a3e59c6a88ff8386097f80f76e753df507b24"]},"offset":"20726866"},"ru.js":{"size":8418,"integrity":{"algorithm":"SHA256","hash":"e88364a57000b9e1190527ab2a120368463491d6d91e0edc9da6233ae6d06120","blockSize":4194304,"blocks":["e88364a57000b9e1190527ab2a120368463491d6d91e0edc9da6233ae6d06120"]},"offset":"20729185"},"sd.js":{"size":2153,"integrity":{"algorithm":"SHA256","hash":"47a6184217fcfdb79be8c8101e24b5de190e707eca660ccebdfc2bd06cb01975","blockSize":4194304,"blocks":["47a6184217fcfdb79be8c8101e24b5de190e707eca660ccebdfc2bd06cb01975"]},"offset":"20737603"},"se.js":{"size":1849,"integrity":{"algorithm":"SHA256","hash":"2d0a0de378acfc7ad80991af8d801a5c2e32b69c18ab93aaf13df464202d15e0","blockSize":4194304,"blocks":["2d0a0de378acfc7ad80991af8d801a5c2e32b69c18ab93aaf13df464202d15e0"]},"offset":"20739756"},"si.js":{"size":2681,"integrity":{"algorithm":"SHA256","hash":"5eefce6d854005294d708f8159ecb2564e90d41d697b38beaf50da20a866c659","blockSize":4194304,"blocks":["5eefce6d854005294d708f8159ecb2564e90d41d697b38beaf50da20a866c659"]},"offset":"20741605"},"sk.js":{"size":5173,"integrity":{"algorithm":"SHA256","hash":"b246e5ee48e9c6cb348de8e7a2eb82c534c9363d842708dc4eb30ecf89ef7adb","blockSize":4194304,"blocks":["b246e5ee48e9c6cb348de8e7a2eb82c534c9363d842708dc4eb30ecf89ef7adb"]},"offset":"20744286"},"sl.js":{"size":6115,"integrity":{"algorithm":"SHA256","hash":"a4f4e53582efcf382b0726e7ec3539a4eb51f3c41547b2618132cf94a4646416","blockSize":4194304,"blocks":["a4f4e53582efcf382b0726e7ec3539a4eb51f3c41547b2618132cf94a4646416"]},"offset":"20749459"},"sq.js":{"size":1987,"integrity":{"algorithm":"SHA256","hash":"9109b6d4d0ecd1c613444811488e2a1607c7d6aa1d3e6acf4a5ad2cbfe88b45f","blockSize":4194304,"blocks":["9109b6d4d0ecd1c613444811488e2a1607c7d6aa1d3e6acf4a5ad2cbfe88b45f"]},"offset":"20755574"},"sr-cyrl.js":{"size":4762,"integrity":{"algorithm":"SHA256","hash":"5b8d89635b896308c502ff8f22746b9c11009ab1b84d5a9db5b23cced270c359","blockSize":4194304,"blocks":["5b8d89635b896308c502ff8f22746b9c11009ab1b84d5a9db5b23cced270c359"]},"offset":"20757561"},"sr.js":{"size":4209,"integrity":{"algorithm":"SHA256","hash":"0dfaa42e2a9d773494bdaa458ead605c7c7a17cc808a87d01e6ac7d517968e45","blockSize":4194304,"blocks":["0dfaa42e2a9d773494bdaa458ead605c7c7a17cc808a87d01e6ac7d517968e45"]},"offset":"20762323"},"ss.js":{"size":2572,"integrity":{"algorithm":"SHA256","hash":"0a3e3fb4b516a0723fbe9fda91e65d7a0fe1a3007fcf2493df1415c1950c47f3","blockSize":4194304,"blocks":["0a3e3fb4b516a0723fbe9fda91e65d7a0fe1a3007fcf2493df1415c1950c47f3"]},"offset":"20766532"},"sv.js":{"size":2066,"integrity":{"algorithm":"SHA256","hash":"85ad85e2b6ada4b40fcafb3c8f69a7485aed5d6761b5321a9018f47a8e6d6d8f","blockSize":4194304,"blocks":["85ad85e2b6ada4b40fcafb3c8f69a7485aed5d6761b5321a9018f47a8e6d6d8f"]},"offset":"20769104"},"sw.js":{"size":1651,"integrity":{"algorithm":"SHA256","hash":"8399be034da0c79fde55f156d7b1231a86d09218a171ac97c868edb213266cec","blockSize":4194304,"blocks":["8399be034da0c79fde55f156d7b1231a86d09218a171ac97c868edb213266cec"]},"offset":"20771170"},"ta.js":{"size":4800,"integrity":{"algorithm":"SHA256","hash":"df2902d214ed4bca610c32301e89da53270adc8e26a00da87a68a244ba90e8f1","blockSize":4194304,"blocks":["df2902d214ed4bca610c32301e89da53270adc8e26a00da87a68a244ba90e8f1"]},"offset":"20772821"},"te.js":{"size":3392,"integrity":{"algorithm":"SHA256","hash":"e0312d7be2d91292d4de688e612a6884135466a8d5b0391a5877f6853dd24a6e","blockSize":4194304,"blocks":["e0312d7be2d91292d4de688e612a6884135466a8d5b0391a5877f6853dd24a6e"]},"offset":"20777621"},"tet.js":{"size":2155,"integrity":{"algorithm":"SHA256","hash":"21dc425bc393e59a99afa482332c508673b86b4be273bd854f275b88c08ec354","blockSize":4194304,"blocks":["21dc425bc393e59a99afa482332c508673b86b4be273bd854f275b88c08ec354"]},"offset":"20781013"},"tg.js":{"size":3604,"integrity":{"algorithm":"SHA256","hash":"1545f21eacf80d77422792854883c46c8550d986995cb0411666f600b6b183ea","blockSize":4194304,"blocks":["1545f21eacf80d77422792854883c46c8550d986995cb0411666f600b6b183ea"]},"offset":"20783168"},"th.js":{"size":2736,"integrity":{"algorithm":"SHA256","hash":"1997bb68570069b5f175cd4edb334969a07b6caf1a57656421d0838d1cb95aef","blockSize":4194304,"blocks":["1997bb68570069b5f175cd4edb334969a07b6caf1a57656421d0838d1cb95aef"]},"offset":"20786772"},"tk.js":{"size":2488,"integrity":{"algorithm":"SHA256","hash":"a3ade222a40733cc6430b0d0c824ff84b8c3101b2af2603feb6381f85d4b0003","blockSize":4194304,"blocks":["a3ade222a40733cc6430b0d0c824ff84b8c3101b2af2603feb6381f85d4b0003"]},"offset":"20789508"},"tl-ph.js":{"size":1735,"integrity":{"algorithm":"SHA256","hash":"c032aae8730b67385af156a603adfefcf4e15233b1ef1930bb76809b1aabbd2c","blockSize":4194304,"blocks":["c032aae8730b67385af156a603adfefcf4e15233b1ef1930bb76809b1aabbd2c"]},"offset":"20791996"},"tlh.js":{"size":3755,"integrity":{"algorithm":"SHA256","hash":"96da45a2d45b23c4c162c40fedc0665009f79fb0de153800857232d03be2799a","blockSize":4194304,"blocks":["96da45a2d45b23c4c162c40fedc0665009f79fb0de153800857232d03be2799a"]},"offset":"20793731"},"tr.js":{"size":2927,"integrity":{"algorithm":"SHA256","hash":"aee3e439c82aaa80e59517188a9e6dedf983d05e71eb9756a1b4168f002224b1","blockSize":4194304,"blocks":["aee3e439c82aaa80e59517188a9e6dedf983d05e71eb9756a1b4168f002224b1"]},"offset":"20797486"},"tzl.js":{"size":3109,"integrity":{"algorithm":"SHA256","hash":"1a8627c869d5f815c09dda91b2588f3df9e692296267f5bc6661fa3998f1c0fa","blockSize":4194304,"blocks":["1a8627c869d5f815c09dda91b2588f3df9e692296267f5bc6661fa3998f1c0fa"]},"offset":"20800413"},"tzm-latn.js":{"size":1691,"integrity":{"algorithm":"SHA256","hash":"1b9a6d4f6538fb55300142f1296f5b4c79aff6d761abb3ed3959033a813f0702","blockSize":4194304,"blocks":["1b9a6d4f6538fb55300142f1296f5b4c79aff6d761abb3ed3959033a813f0702"]},"offset":"20803522"},"tzm.js":{"size":2322,"integrity":{"algorithm":"SHA256","hash":"d139c0b3401b921863148f567eeefc57b2ca3088812adbc58cc9d09ceff43ddf","blockSize":4194304,"blocks":["d139c0b3401b921863148f567eeefc57b2ca3088812adbc58cc9d09ceff43ddf"]},"offset":"20805213"},"ug-cn.js":{"size":3880,"integrity":{"algorithm":"SHA256","hash":"86f5e5d0af1adfcf4575498061738f20d134b16c909bf9efc40be5f966d99ea5","blockSize":4194304,"blocks":["86f5e5d0af1adfcf4575498061738f20d134b16c909bf9efc40be5f966d99ea5"]},"offset":"20807535"},"uk.js":{"size":5955,"integrity":{"algorithm":"SHA256","hash":"e67725466dd6e6eb33feca525403d09c8b3812e8073e62ddc4bb06369bb13a9d","blockSize":4194304,"blocks":["e67725466dd6e6eb33feca525403d09c8b3812e8073e62ddc4bb06369bb13a9d"]},"offset":"20811415"},"ur.js":{"size":2200,"integrity":{"algorithm":"SHA256","hash":"4870e8ee287025d7760731038093cc828f08be91d0b08b0508f931c9a16453ff","blockSize":4194304,"blocks":["4870e8ee287025d7760731038093cc828f08be91d0b08b0508f931c9a16453ff"]},"offset":"20817370"},"uz-latn.js":{"size":1639,"integrity":{"algorithm":"SHA256","hash":"cd289ed8860b697d20b90194c2f5a55ed54e84d40fee15d5d6148c78b1e2ce9e","blockSize":4194304,"blocks":["cd289ed8860b697d20b90194c2f5a55ed54e84d40fee15d5d6148c78b1e2ce9e"]},"offset":"20819570"},"uz.js":{"size":1885,"integrity":{"algorithm":"SHA256","hash":"e9b15bd23e8779fe93fa352a04dc338593206cd7beb4d56d355f8d291835fcd1","blockSize":4194304,"blocks":["e9b15bd23e8779fe93fa352a04dc338593206cd7beb4d56d355f8d291835fcd1"]},"offset":"20821209"},"vi.js":{"size":2430,"integrity":{"algorithm":"SHA256","hash":"e9ec2d01a8171dbd71637bf49f6cb70ec5526e27053114dabf607f1aa13ed9bc","blockSize":4194304,"blocks":["e9ec2d01a8171dbd71637bf49f6cb70ec5526e27053114dabf607f1aa13ed9bc"]},"offset":"20823094"},"x-pseudo.js":{"size":2348,"integrity":{"algorithm":"SHA256","hash":"99f27f45e6de7b3f2d47e146bbefd74c881fb1f9446df29e20cd79dd8f7d3f4e","blockSize":4194304,"blocks":["99f27f45e6de7b3f2d47e146bbefd74c881fb1f9446df29e20cd79dd8f7d3f4e"]},"offset":"20825524"},"yo.js":{"size":1887,"integrity":{"algorithm":"SHA256","hash":"5470a3358714886d14b7897df864a7a0eed2725bffbddf5d3e913ff7b2f79a40","blockSize":4194304,"blocks":["5470a3358714886d14b7897df864a7a0eed2725bffbddf5d3e913ff7b2f79a40"]},"offset":"20827872"},"zh-cn.js":{"size":3711,"integrity":{"algorithm":"SHA256","hash":"9fcdb171506aed19c1776f668330ec4083094f182f17514aa0a63857c93232ad","blockSize":4194304,"blocks":["9fcdb171506aed19c1776f668330ec4083094f182f17514aa0a63857c93232ad"]},"offset":"20829759"},"zh-hk.js":{"size":3116,"integrity":{"algorithm":"SHA256","hash":"3996d5666a44c90f168e60bcf7704a4f3c1ccbce3bb14cdba372c7c4de663672","blockSize":4194304,"blocks":["3996d5666a44c90f168e60bcf7704a4f3c1ccbce3bb14cdba372c7c4de663672"]},"offset":"20833470"},"zh-mo.js":{"size":3066,"integrity":{"algorithm":"SHA256","hash":"ccb21168fff3d307932e776d0394dd518863f0873e7f118c91d8f1f796b40848","blockSize":4194304,"blocks":["ccb21168fff3d307932e776d0394dd518863f0873e7f118c91d8f1f796b40848"]},"offset":"20836586"},"zh-tw.js":{"size":3013,"integrity":{"algorithm":"SHA256","hash":"5d777630817e1b6cbdac934d41924ac44079089ffdfc807d7d53d7b64e1f4ebc","blockSize":4194304,"blocks":["5d777630817e1b6cbdac934d41924ac44079089ffdfc807d7d53d7b64e1f4ebc"]},"offset":"20839652"}}},"lib":{"files":{"utils":{"files":{"abs-ceil.js":{"size":154,"integrity":{"algorithm":"SHA256","hash":"d9e676e01610f301a805394cb9f4010b899943d514257213dfcd670838b69313","blockSize":4194304,"blocks":["d9e676e01610f301a805394cb9f4010b899943d514257213dfcd670838b69313"]},"offset":"20842665"},"abs-floor.js":{"size":179,"integrity":{"algorithm":"SHA256","hash":"d725f49259deb0789facd20d0f92520f92fc3b5f1a1f0c317756261a0e7f5198","blockSize":4194304,"blocks":["d725f49259deb0789facd20d0f92520f92fc3b5f1a1f0c317756261a0e7f5198"]},"offset":"20842819"},"abs-round.js":{"size":166,"integrity":{"algorithm":"SHA256","hash":"543c51e538b580910db499bded36e0d684478696de1ac1fbaeb7315060b6afc7","blockSize":4194304,"blocks":["543c51e538b580910db499bded36e0d684478696de1ac1fbaeb7315060b6afc7"]},"offset":"20842998"},"compare-arrays.js":{"size":553,"integrity":{"algorithm":"SHA256","hash":"9df50bfd820c642f0d45c0c9551540418c3950936021a4512da27513624579e2","blockSize":4194304,"blocks":["9df50bfd820c642f0d45c0c9551540418c3950936021a4512da27513624579e2"]},"offset":"20843164"},"defaults.js":{"size":203,"integrity":{"algorithm":"SHA256","hash":"4b91a8cb1b3155d62eb18f28b6570a39cf0e36da612a5d3d7a74d236104e2123","blockSize":4194304,"blocks":["4b91a8cb1b3155d62eb18f28b6570a39cf0e36da612a5d3d7a74d236104e2123"]},"offset":"20843717"},"deprecate.js":{"size":1946,"integrity":{"algorithm":"SHA256","hash":"192ab3d442dded3baebd62e14b7b48f4558efba4ddbf4d99e2d304704c56450c","blockSize":4194304,"blocks":["192ab3d442dded3baebd62e14b7b48f4558efba4ddbf4d99e2d304704c56450c"]},"offset":"20843920"},"extend.js":{"size":345,"integrity":{"algorithm":"SHA256","hash":"c50fc6547a47313246ff4ca7348b5bbe6370ff7f94be38f8301ce1d2f0bbc263","blockSize":4194304,"blocks":["c50fc6547a47313246ff4ca7348b5bbe6370ff7f94be38f8301ce1d2f0bbc263"]},"offset":"20845866"},"has-own-prop.js":{"size":100,"integrity":{"algorithm":"SHA256","hash":"a39601540adec45a14545a9a86e6b0bbc8989c706583fdd579896f25b7efc3f6","blockSize":4194304,"blocks":["a39601540adec45a14545a9a86e6b0bbc8989c706583fdd579896f25b7efc3f6"]},"offset":"20846211"},"hooks.js":{"size":296,"integrity":{"algorithm":"SHA256","hash":"e990091b29bd5c56b03c0f36ad61dd801b99d8897fe24ddd16079128016458dd","blockSize":4194304,"blocks":["e990091b29bd5c56b03c0f36ad61dd801b99d8897fe24ddd16079128016458dd"]},"offset":"20846311"},"index-of.js":{"size":342,"integrity":{"algorithm":"SHA256","hash":"c8511c4d1fc81adee5187b3756f8f7d439973b62982be9f0cf2d77fc97f5d325","blockSize":4194304,"blocks":["c8511c4d1fc81adee5187b3756f8f7d439973b62982be9f0cf2d77fc97f5d325"]},"offset":"20846607"},"is-array.js":{"size":164,"integrity":{"algorithm":"SHA256","hash":"1d622676e225b34d5862dffe5edf22749658a844e460164754c58c26c5d3e5f3","blockSize":4194304,"blocks":["1d622676e225b34d5862dffe5edf22749658a844e460164754c58c26c5d3e5f3"]},"offset":"20846949"},"is-calendar-spec.js":{"size":670,"integrity":{"algorithm":"SHA256","hash":"3e6a1ce371392e8ae22fdb17e47200a0da9040e6b7aaeb358b8b0340c7c75f62","blockSize":4194304,"blocks":["3e6a1ce371392e8ae22fdb17e47200a0da9040e6b7aaeb358b8b0340c7c75f62"]},"offset":"20847113"},"is-date.js":{"size":161,"integrity":{"algorithm":"SHA256","hash":"38ca8b1e7749b001597b88fc570117916b164b81aa9728a1cb10a588d45ce350","blockSize":4194304,"blocks":["38ca8b1e7749b001597b88fc570117916b164b81aa9728a1cb10a588d45ce350"]},"offset":"20847783"},"is-function.js":{"size":210,"integrity":{"algorithm":"SHA256","hash":"e3b084459109014d1a75359d6799a175d5b28017c38b27edca320249c802feb1","blockSize":4194304,"blocks":["e3b084459109014d1a75359d6799a175d5b28017c38b27edca320249c802feb1"]},"offset":"20847944"},"is-leap-year.js":{"size":106,"integrity":{"algorithm":"SHA256","hash":"2f0ebd5dbed6264a348ac7be6c48d15bccce57dc5e335a85239aafcfa479bbf3","blockSize":4194304,"blocks":["2f0ebd5dbed6264a348ac7be6c48d15bccce57dc5e335a85239aafcfa479bbf3"]},"offset":"20848154"},"is-moment-input.js":{"size":1988,"integrity":{"algorithm":"SHA256","hash":"ed50a19d6ebe50979106c36ab4a24dd3f8e82ccc8b6fcebe97e62b98b29fd4d0","blockSize":4194304,"blocks":["ed50a19d6ebe50979106c36ab4a24dd3f8e82ccc8b6fcebe97e62b98b29fd4d0"]},"offset":"20848260"},"is-number.js":{"size":169,"integrity":{"algorithm":"SHA256","hash":"147fdfea7e2b8f3530f2bb98991dafaab90f09a28557c158379f3e7f3cbfc822","blockSize":4194304,"blocks":["147fdfea7e2b8f3530f2bb98991dafaab90f09a28557c158379f3e7f3cbfc822"]},"offset":"20850248"},"is-object-empty.js":{"size":360,"integrity":{"algorithm":"SHA256","hash":"a2798dac5494df484c3e8d24c22758b64853f21e55b90a30b068ea33969559cc","blockSize":4194304,"blocks":["a2798dac5494df484c3e8d24c22758b64853f21e55b90a30b068ea33969559cc"]},"offset":"20850417"},"is-object.js":{"size":246,"integrity":{"algorithm":"SHA256","hash":"9a663e2f73002dce5add82647cd3a9ce90e2acdfcdc1144dac1fab129b8a4c28","blockSize":4194304,"blocks":["9a663e2f73002dce5add82647cd3a9ce90e2acdfcdc1144dac1fab129b8a4c28"]},"offset":"20850777"},"is-string.js":{"size":109,"integrity":{"algorithm":"SHA256","hash":"d37bedb2835e5022fa4e7e3fc52ad9c0603b8f00897f108a3b0d16346a82acd8","blockSize":4194304,"blocks":["d37bedb2835e5022fa4e7e3fc52ad9c0603b8f00897f108a3b0d16346a82acd8"]},"offset":"20851023"},"is-undefined.js":{"size":76,"integrity":{"algorithm":"SHA256","hash":"4a90bcc6cb242283124049d68dcace3896481cec3114bc9ad62eddc312d7d116","blockSize":4194304,"blocks":["4a90bcc6cb242283124049d68dcace3896481cec3114bc9ad62eddc312d7d116"]},"offset":"20851132"},"keys.js":{"size":344,"integrity":{"algorithm":"SHA256","hash":"982be0c56d0728e8b9860c332d8ed09f166bf07af8efd66dba23cc98a14d35e3","blockSize":4194304,"blocks":["982be0c56d0728e8b9860c332d8ed09f166bf07af8efd66dba23cc98a14d35e3"]},"offset":"20851208"},"map.js":{"size":189,"integrity":{"algorithm":"SHA256","hash":"ed8c2776238a5d2157bbfd8fb8ca746c107dc14c98bd6b93537fdc0790dd7de9","blockSize":4194304,"blocks":["ed8c2776238a5d2157bbfd8fb8ca746c107dc14c98bd6b93537fdc0790dd7de9"]},"offset":"20851552"},"mod.js":{"size":68,"integrity":{"algorithm":"SHA256","hash":"24a639c80787b07e39dcb3fe3e6ee13e14903fa6a7d1cf252c3c63c9f7aeb9b1","blockSize":4194304,"blocks":["24a639c80787b07e39dcb3fe3e6ee13e14903fa6a7d1cf252c3c63c9f7aeb9b1"]},"offset":"20851741"},"some.js":{"size":394,"integrity":{"algorithm":"SHA256","hash":"a0f14d7eb6f26ca1be2024b191feb2f9b552a33f7571043d8cb7a403c0bbea20","blockSize":4194304,"blocks":["a0f14d7eb6f26ca1be2024b191feb2f9b552a33f7571043d8cb7a403c0bbea20"]},"offset":"20851809"},"to-int.js":{"size":282,"integrity":{"algorithm":"SHA256","hash":"654e99362f5e8743d31fdd593d05ce7ea86631410706c44581f2c5dc06f5f00a","blockSize":4194304,"blocks":["654e99362f5e8743d31fdd593d05ce7ea86631410706c44581f2c5dc06f5f00a"]},"offset":"20852203"},"zero-fill.js":{"size":352,"integrity":{"algorithm":"SHA256","hash":"f61b75ca7910c00d5539bf360542962391111e3705f2cc81eda85ff6555abd3e","blockSize":4194304,"blocks":["f61b75ca7910c00d5539bf360542962391111e3705f2cc81eda85ff6555abd3e"]},"offset":"20852485"}}},"units":{"files":{"aliases.js":{"size":809,"integrity":{"algorithm":"SHA256","hash":"a9d35956a8872f5002cee7e73975ac590a51fa26d8ff93789335854074c95f09","blockSize":4194304,"blocks":["a9d35956a8872f5002cee7e73975ac590a51fa26d8ff93789335854074c95f09"]},"offset":"20852837"},"constants.js":{"size":148,"integrity":{"algorithm":"SHA256","hash":"d010aedbb9dcf9e4fdef0cb5813b2a0dacfe28a90ba7df29ce47c914ceb36bdb","blockSize":4194304,"blocks":["d010aedbb9dcf9e4fdef0cb5813b2a0dacfe28a90ba7df29ce47c914ceb36bdb"]},"offset":"20853646"},"day-of-month.js":{"size":1065,"integrity":{"algorithm":"SHA256","hash":"9f2c3df88da31e32e316774d0b70824dbdda773ae3c7d06ec5e788cc2dfd7d1c","blockSize":4194304,"blocks":["9f2c3df88da31e32e316774d0b70824dbdda773ae3c7d06ec5e788cc2dfd7d1c"]},"offset":"20853794"},"day-of-week.js":{"size":12904,"integrity":{"algorithm":"SHA256","hash":"4abcd7db63eba429cad36485837c6e9fca222113bc41135bede2ea33d935137b","blockSize":4194304,"blocks":["4abcd7db63eba429cad36485837c6e9fca222113bc41135bede2ea33d935137b"]},"offset":"20854859"},"day-of-year.js":{"size":920,"integrity":{"algorithm":"SHA256","hash":"6b29d69e636e18cc67780467062258a4fa2730b947264645c09f71e76f72c5fd","blockSize":4194304,"blocks":["6b29d69e636e18cc67780467062258a4fa2730b947264645c09f71e76f72c5fd"]},"offset":"20867763"},"era.js":{"size":7984,"integrity":{"algorithm":"SHA256","hash":"cf8fa80bea2958d6e7f701c83fff3b0407c32e06c45a6f81848e724d23420572","blockSize":4194304,"blocks":["cf8fa80bea2958d6e7f701c83fff3b0407c32e06c45a6f81848e724d23420572"]},"offset":"20868683"},"hour.js":{"size":4475,"integrity":{"algorithm":"SHA256","hash":"7678731977e09b01eab4d95c271183998ccbd8a05cdd9237cb59c0a3ad8886c1","blockSize":4194304,"blocks":["7678731977e09b01eab4d95c271183998ccbd8a05cdd9237cb59c0a3ad8886c1"]},"offset":"20876667"},"millisecond.js":{"size":1870,"integrity":{"algorithm":"SHA256","hash":"a3ff5dd3b50ad930fd1d294e09c3286595f6113108c59b540a01cb3b1b166e6d","blockSize":4194304,"blocks":["a3ff5dd3b50ad930fd1d294e09c3286595f6113108c59b540a01cb3b1b166e6d"]},"offset":"20881142"},"minute.js":{"size":679,"integrity":{"algorithm":"SHA256","hash":"e595754897d59be96bd94028e74920c00c80d9747db66edf52a008301b21a5d2","blockSize":4194304,"blocks":["e595754897d59be96bd94028e74920c00c80d9747db66edf52a008301b21a5d2"]},"offset":"20883012"},"month.js":{"size":10021,"integrity":{"algorithm":"SHA256","hash":"6a7cd99478b84f3ef605aed5d4855ea271e64b203b4f2b6db804ef4372b34b51","blockSize":4194304,"blocks":["6a7cd99478b84f3ef605aed5d4855ea271e64b203b4f2b6db804ef4372b34b51"]},"offset":"20883691"},"offset.js":{"size":7070,"integrity":{"algorithm":"SHA256","hash":"69aeb164101f4fe6d892e51a32849f1e88c0ab9ffbcbb6c89f2f67d11f50e6c2","blockSize":4194304,"blocks":["69aeb164101f4fe6d892e51a32849f1e88c0ab9ffbcbb6c89f2f67d11f50e6c2"]},"offset":"20893712"},"priorities.js":{"size":480,"integrity":{"algorithm":"SHA256","hash":"e9892e94e1b33a68e9c04452a91e665a04d43bfbd04d24f12801511adfdf8a29","blockSize":4194304,"blocks":["e9892e94e1b33a68e9c04452a91e665a04d43bfbd04d24f12801511adfdf8a29"]},"offset":"20900782"},"quarter.js":{"size":780,"integrity":{"algorithm":"SHA256","hash":"bd1da757673386bc5d9df4bdcf86db2bac504e4b7ee8228319fe765359443666","blockSize":4194304,"blocks":["bd1da757673386bc5d9df4bdcf86db2bac504e4b7ee8228319fe765359443666"]},"offset":"20901262"},"second.js":{"size":679,"integrity":{"algorithm":"SHA256","hash":"c1de075eb450e97fa5759fac32c8421f381a1af7325ed0648fb189489bf46672","blockSize":4194304,"blocks":["c1de075eb450e97fa5759fac32c8421f381a1af7325ed0648fb189489bf46672"]},"offset":"20902042"},"timestamp.js":{"size":590,"integrity":{"algorithm":"SHA256","hash":"c5a098231e38b7e2d4661ffe539a9600549647ef8daf25126a39ea7498560007","blockSize":4194304,"blocks":["c5a098231e38b7e2d4661ffe539a9600549647ef8daf25126a39ea7498560007"]},"offset":"20902721"},"timezone.js":{"size":325,"integrity":{"algorithm":"SHA256","hash":"49bf5d0d3ae4a0629edbbe9561af7dff47564ac6714e2a99cbd1ea6b4b827365","blockSize":4194304,"blocks":["49bf5d0d3ae4a0629edbbe9561af7dff47564ac6714e2a99cbd1ea6b4b827365"]},"offset":"20903311"},"units.js":{"size":404,"integrity":{"algorithm":"SHA256","hash":"a955499f9dfc8b7748bb44bac2d99f98a638e440a96db6795dee355eed6e8389","blockSize":4194304,"blocks":["a955499f9dfc8b7748bb44bac2d99f98a638e440a96db6795dee355eed6e8389"]},"offset":"20903636"},"week-calendar-utils.js":{"size":2107,"integrity":{"algorithm":"SHA256","hash":"3199c233ab75fe8032321616ad0b762b855a064a73c86062fa329c65911e38c0","blockSize":4194304,"blocks":["3199c233ab75fe8032321616ad0b762b855a064a73c86062fa329c65911e38c0"]},"offset":"20904040"},"week-year.js":{"size":3483,"integrity":{"algorithm":"SHA256","hash":"ef17df1365211c9a4cc15bbcc78a6bedb1981e252792358eceb30cc973df7318","blockSize":4194304,"blocks":["ef17df1365211c9a4cc15bbcc78a6bedb1981e252792358eceb30cc973df7318"]},"offset":"20906147"},"week.js":{"size":1664,"integrity":{"algorithm":"SHA256","hash":"7a23a2b00473b34d57f4a960e3b7f82fb77169fcb063695194535250a6a217a2","blockSize":4194304,"blocks":["7a23a2b00473b34d57f4a960e3b7f82fb77169fcb063695194535250a6a217a2"]},"offset":"20909630"},"year.js":{"size":2001,"integrity":{"algorithm":"SHA256","hash":"4efe5e44038ba5009d9acda154f137a157ab30510c6c72b59223a7744faed11c","blockSize":4194304,"blocks":["4efe5e44038ba5009d9acda154f137a157ab30510c6c72b59223a7744faed11c"]},"offset":"20911294"}}},"parse":{"files":{"regex.js":{"size":2500,"integrity":{"algorithm":"SHA256","hash":"6b0bd09ab93ecfaf710fca600d8ed28537361c3cc0e7fce9e4764b9d9a07021a","blockSize":4194304,"blocks":["6b0bd09ab93ecfaf710fca600d8ed28537361c3cc0e7fce9e4764b9d9a07021a"]},"offset":"20913295"},"token.js":{"size":958,"integrity":{"algorithm":"SHA256","hash":"0f89d99fcb55e507e606de4330b0e4331c89cf3b3bf0b0e007bd3b57c7d5afa7","blockSize":4194304,"blocks":["0f89d99fcb55e507e606de4330b0e4331c89cf3b3bf0b0e007bd3b57c7d5afa7"]},"offset":"20915795"}}},"moment":{"files":{"add-subtract.js":{"size":1869,"integrity":{"algorithm":"SHA256","hash":"652e4e315e5b64801f20dbf77f5c528d4f8bf54f0fd44e17b003b450cf85e4cd","blockSize":4194304,"blocks":["652e4e315e5b64801f20dbf77f5c528d4f8bf54f0fd44e17b003b450cf85e4cd"]},"offset":"20916753"},"calendar.js":{"size":1737,"integrity":{"algorithm":"SHA256","hash":"31b570850ddd808eea723850b1bc9043911fda49f9a03cb0c4b3079da8df4ff8","blockSize":4194304,"blocks":["31b570850ddd808eea723850b1bc9043911fda49f9a03cb0c4b3079da8df4ff8"]},"offset":"20918622"},"clone.js":{"size":98,"integrity":{"algorithm":"SHA256","hash":"89887852a0656e2a32cd6ca3f1eb6e957729f9706ce230cdc8626a756e48e760","blockSize":4194304,"blocks":["89887852a0656e2a32cd6ca3f1eb6e957729f9706ce230cdc8626a756e48e760"]},"offset":"20920359"},"compare.js":{"size":2379,"integrity":{"algorithm":"SHA256","hash":"8ddd3195b6c07850356875b2eedbc74cd67fc92ecf4d074243d04e998c7a99bd","blockSize":4194304,"blocks":["8ddd3195b6c07850356875b2eedbc74cd67fc92ecf4d074243d04e998c7a99bd"]},"offset":"20920457"},"constructor.js":{"size":2106,"integrity":{"algorithm":"SHA256","hash":"19615ae49105776f7db6969825ab537cda7ed5f9b0c58890b9d3699a25176a98","blockSize":4194304,"blocks":["19615ae49105776f7db6969825ab537cda7ed5f9b0c58890b9d3699a25176a98"]},"offset":"20922836"},"creation-data.js":{"size":192,"integrity":{"algorithm":"SHA256","hash":"7d11734e55e2c08ad011231b01b5ad5c7dfa6c73a7d2740e8faf5140f7fdc591","blockSize":4194304,"blocks":["7d11734e55e2c08ad011231b01b5ad5c7dfa6c73a7d2740e8faf5140f7fdc591"]},"offset":"20924942"},"diff.js":{"size":2345,"integrity":{"algorithm":"SHA256","hash":"7030f73ea182ce22debcdb9ddf531c18b29788d208d9c2ae70302225bc383363","blockSize":4194304,"blocks":["7030f73ea182ce22debcdb9ddf531c18b29788d208d9c2ae70302225bc383363"]},"offset":"20925134"},"format.js":{"size":2340,"integrity":{"algorithm":"SHA256","hash":"808b30c201bb1668d09c481f7eb2ffbfe967f1a12d443a867df049ec1eb7e75b","blockSize":4194304,"blocks":["808b30c201bb1668d09c481f7eb2ffbfe967f1a12d443a867df049ec1eb7e75b"]},"offset":"20927479"},"from.js":{"size":609,"integrity":{"algorithm":"SHA256","hash":"f840ff91d8f37751bddb245c87487db278b9e10ee9d59af558b538727383b6f4","blockSize":4194304,"blocks":["f840ff91d8f37751bddb245c87487db278b9e10ee9d59af558b538727383b6f4"]},"offset":"20929819"},"get-set.js":{"size":2041,"integrity":{"algorithm":"SHA256","hash":"c664163880669196c8c00663d41434979f3c45f0a65a0a155f3592f50281720b","blockSize":4194304,"blocks":["c664163880669196c8c00663d41434979f3c45f0a65a0a155f3592f50281720b"]},"offset":"20930428"},"locale.js":{"size":946,"integrity":{"algorithm":"SHA256","hash":"37e90ac837fb700557e90e3e6f916db33ff5362ca3ddba4a3032c14220a8e103","blockSize":4194304,"blocks":["37e90ac837fb700557e90e3e6f916db33ff5362ca3ddba4a3032c14220a8e103"]},"offset":"20932469"},"min-max.js":{"size":1922,"integrity":{"algorithm":"SHA256","hash":"10237d61e7052ab405d0beff8c86de3cff4696c4cdcb975a07e814820a3a308e","blockSize":4194304,"blocks":["10237d61e7052ab405d0beff8c86de3cff4696c4cdcb975a07e814820a3a308e"]},"offset":"20933415"},"moment.js":{"size":609,"integrity":{"algorithm":"SHA256","hash":"9f29bdda0fe02b37791794d7343892bd3c26b411594e034f3b4079d33eeb3262","blockSize":4194304,"blocks":["9f29bdda0fe02b37791794d7343892bd3c26b411594e034f3b4079d33eeb3262"]},"offset":"20935337"},"now.js":{"size":82,"integrity":{"algorithm":"SHA256","hash":"f6f424c0af9a3eb379f3cf93dbe2c03a82b88254d60a5434d46a835356c486e5","blockSize":4194304,"blocks":["f6f424c0af9a3eb379f3cf93dbe2c03a82b88254d60a5434d46a835356c486e5"]},"offset":"20935946"},"prototype.js":{"size":5511,"integrity":{"algorithm":"SHA256","hash":"6338ea65d7c0065d0f44e712ec373930741fffe6720b0e9c8094f2b52b1c084f","blockSize":4194304,"blocks":["6338ea65d7c0065d0f44e712ec373930741fffe6720b0e9c8094f2b52b1c084f"]},"offset":"20936028"},"start-end-of.js":{"size":4819,"integrity":{"algorithm":"SHA256","hash":"8854fff89cfa8d0ba411b3878a13a26254efd2545d5862b06ce47633fb1b86b5","blockSize":4194304,"blocks":["8854fff89cfa8d0ba411b3878a13a26254efd2545d5862b06ce47633fb1b86b5"]},"offset":"20941539"},"to-type.js":{"size":834,"integrity":{"algorithm":"SHA256","hash":"f2f59e330a742f04aa3017911ca771a308a7d1201534014acd2f95270993086f","blockSize":4194304,"blocks":["f2f59e330a742f04aa3017911ca771a308a7d1201534014acd2f95270993086f"]},"offset":"20946358"},"to.js":{"size":603,"integrity":{"algorithm":"SHA256","hash":"9933983b131deaa91b5232c57bf476378fbb875a9d20edbea1ff254bd78725e7","blockSize":4194304,"blocks":["9933983b131deaa91b5232c57bf476378fbb875a9d20edbea1ff254bd78725e7"]},"offset":"20947192"},"valid.js":{"size":364,"integrity":{"algorithm":"SHA256","hash":"bdb0142381e10910a4df205c6360ef014a9e57085893c49ad7699c3f256bc3c6","blockSize":4194304,"blocks":["bdb0142381e10910a4df205c6360ef014a9e57085893c49ad7699c3f256bc3c6"]},"offset":"20947795"}}},"locale":{"files":{"base-config.js":{"size":1187,"integrity":{"algorithm":"SHA256","hash":"2cd4ceb7d6867170a9ee11e49e92b5782659221068a3f2833ceabff1db20da92","blockSize":4194304,"blocks":["2cd4ceb7d6867170a9ee11e49e92b5782659221068a3f2833ceabff1db20da92"]},"offset":"20948159"},"calendar.js":{"size":442,"integrity":{"algorithm":"SHA256","hash":"0ea60bdceb58259d0e288e9539a7adcdd22b10a5a0acd08ae0ce5790492c4170","blockSize":4194304,"blocks":["0ea60bdceb58259d0e288e9539a7adcdd22b10a5a0acd08ae0ce5790492c4170"]},"offset":"20949346"},"constructor.js":{"size":93,"integrity":{"algorithm":"SHA256","hash":"ad73c87fed51fed8b8dbd719ac8f07b11729f9cdc3358bd6bcb4325800e19416","blockSize":4194304,"blocks":["ad73c87fed51fed8b8dbd719ac8f07b11729f9cdc3358bd6bcb4325800e19416"]},"offset":"20949788"},"en.js":{"size":989,"integrity":{"algorithm":"SHA256","hash":"74380629d9af7eaeaa6e437f79027c0a30a84a765f4962dd6c4400b3a31d7c4d","blockSize":4194304,"blocks":["74380629d9af7eaeaa6e437f79027c0a30a84a765f4962dd6c4400b3a31d7c4d"]},"offset":"20949881"},"formats.js":{"size":876,"integrity":{"algorithm":"SHA256","hash":"6193038859b18d6324861dd3c66a9090321c741c30ffb06335cf15615baf4731","blockSize":4194304,"blocks":["6193038859b18d6324861dd3c66a9090321c741c30ffb06335cf15615baf4731"]},"offset":"20950870"},"invalid.js":{"size":113,"integrity":{"algorithm":"SHA256","hash":"f932e3fc13624ab618379e92c2436182e83d5330a63551de9cfd606ace6d4df4","blockSize":4194304,"blocks":["f932e3fc13624ab618379e92c2436182e83d5330a63551de9cfd606ace6d4df4"]},"offset":"20951746"},"lists.js":{"size":2188,"integrity":{"algorithm":"SHA256","hash":"333f042b694faa7a10f526769fbe60dfed787b928ec03ea564d47b5e4913a48f","blockSize":4194304,"blocks":["333f042b694faa7a10f526769fbe60dfed787b928ec03ea564d47b5e4913a48f"]},"offset":"20951859"},"locale.js":{"size":829,"integrity":{"algorithm":"SHA256","hash":"8e89d1d0db607bdfd992a7217b7bfcdff2dddec674622c95827e199f680683e2","blockSize":4194304,"blocks":["8e89d1d0db607bdfd992a7217b7bfcdff2dddec674622c95827e199f680683e2"]},"offset":"20954047"},"locales.js":{"size":7728,"integrity":{"algorithm":"SHA256","hash":"185a6ab8c9791c753b7ab991f5520b2828d46c88dceb478ff697c5a5e2129ae2","blockSize":4194304,"blocks":["185a6ab8c9791c753b7ab991f5520b2828d46c88dceb478ff697c5a5e2129ae2"]},"offset":"20954876"},"ordinal.js":{"size":218,"integrity":{"algorithm":"SHA256","hash":"cf3e09da5c8926ac7bfec1ab61dfc28fe85e318036c638ead084526e624345c8","blockSize":4194304,"blocks":["cf3e09da5c8926ac7bfec1ab61dfc28fe85e318036c638ead084526e624345c8"]},"offset":"20962604"},"pre-post-format.js":{"size":66,"integrity":{"algorithm":"SHA256","hash":"10b2774bb1d8cdb43f2ab2d03345d6ecc28f687bd7338fcfeddfa97b230010ae","blockSize":4194304,"blocks":["10b2774bb1d8cdb43f2ab2d03345d6ecc28f687bd7338fcfeddfa97b230010ae"]},"offset":"20962822"},"prototype.js":{"size":2229,"integrity":{"algorithm":"SHA256","hash":"4ad2e31e24f475790433eaa870a875e310e766d95e8eb8d3d1c60e06b0fb6c62","blockSize":4194304,"blocks":["4ad2e31e24f475790433eaa870a875e310e766d95e8eb8d3d1c60e06b0fb6c62"]},"offset":"20962888"},"relative.js":{"size":842,"integrity":{"algorithm":"SHA256","hash":"35daa9863f93e2324dd0abd48308d1ccb0290aa3e87de6a905407f2c549d6e94","blockSize":4194304,"blocks":["35daa9863f93e2324dd0abd48308d1ccb0290aa3e87de6a905407f2c549d6e94"]},"offset":"20965117"},"set.js":{"size":1831,"integrity":{"algorithm":"SHA256","hash":"b351121689348345bbc4dd795d9153dcb730954ef99100a4b6bd0c46bf45392f","blockSize":4194304,"blocks":["b351121689348345bbc4dd795d9153dcb730954ef99100a4b6bd0c46bf45392f"]},"offset":"20965959"}}},"format":{"files":{"format.js":{"size":2911,"integrity":{"algorithm":"SHA256","hash":"a2a2e45ba083710e904ef84992bc2397e9b04f42857798804b3366bcc89de706","blockSize":4194304,"blocks":["a2a2e45ba083710e904ef84992bc2397e9b04f42857798804b3366bcc89de706"]},"offset":"20967790"}}},"duration":{"files":{"abs.js":{"size":484,"integrity":{"algorithm":"SHA256","hash":"5a05ac28ce5f1e5e616adb71ebc66de598a05b999f3ce7fa693de391209d7b02","blockSize":4194304,"blocks":["5a05ac28ce5f1e5e616adb71ebc66de598a05b999f3ce7fa693de391209d7b02"]},"offset":"20970701"},"add-subtract.js":{"size":644,"integrity":{"algorithm":"SHA256","hash":"448cf6598fd3f13baee30450a3b2727b12dca1c15517acf8965212ec247c8a6c","blockSize":4194304,"blocks":["448cf6598fd3f13baee30450a3b2727b12dca1c15517acf8965212ec247c8a6c"]},"offset":"20971185"},"as.js":{"size":2360,"integrity":{"algorithm":"SHA256","hash":"a76963bf88815c5db315ebe614f90830b6df3eafbfa94ade875e7e946fa3f6cf","blockSize":4194304,"blocks":["a76963bf88815c5db315ebe614f90830b6df3eafbfa94ade875e7e946fa3f6cf"]},"offset":"20971829"},"bubble.js":{"size":1774,"integrity":{"algorithm":"SHA256","hash":"d9ee34682d14708df7a7a353a73e6aa0059b56c72318583fe364214df881af35","blockSize":4194304,"blocks":["d9ee34682d14708df7a7a353a73e6aa0059b56c72318583fe364214df881af35"]},"offset":"20974189"},"clone.js":{"size":105,"integrity":{"algorithm":"SHA256","hash":"637a410873c432fa546ab8bb0bdc97368b2d2b1574d2e33560f9baa593310759","blockSize":4194304,"blocks":["637a410873c432fa546ab8bb0bdc97368b2d2b1574d2e33560f9baa593310759"]},"offset":"20975963"},"constructor.js":{"size":1593,"integrity":{"algorithm":"SHA256","hash":"59aa5de689608aee7510ae41cbc5918a6d7ab7eaab3b6a685123a5a85e6f1473","blockSize":4194304,"blocks":["59aa5de689608aee7510ae41cbc5918a6d7ab7eaab3b6a685123a5a85e6f1473"]},"offset":"20976068"},"create.js":{"size":4335,"integrity":{"algorithm":"SHA256","hash":"c8ed0f859bfca8553e97b78795fdaffcf808cf71364cc9c9d2a073d819e5cdf7","blockSize":4194304,"blocks":["c8ed0f859bfca8553e97b78795fdaffcf808cf71364cc9c9d2a073d819e5cdf7"]},"offset":"20977661"},"duration.js":{"size":342,"integrity":{"algorithm":"SHA256","hash":"f23788a3a3f12e54b1547afc46483ad420ed5815fad05a807aacd2268ad69e73","blockSize":4194304,"blocks":["f23788a3a3f12e54b1547afc46483ad420ed5815fad05a807aacd2268ad69e73"]},"offset":"20981996"},"get.js":{"size":728,"integrity":{"algorithm":"SHA256","hash":"b1d0a0298fe084ba75373193603cbb7b907b29298262cc4bb8093dfebd0a5894","blockSize":4194304,"blocks":["b1d0a0298fe084ba75373193603cbb7b907b29298262cc4bb8093dfebd0a5894"]},"offset":"20982338"},"humanize.js":{"size":3493,"integrity":{"algorithm":"SHA256","hash":"25d61a7b130596a3a40a0e614c2f2e6327e74c4e5594b52910c7c7c4b48d410d","blockSize":4194304,"blocks":["25d61a7b130596a3a40a0e614c2f2e6327e74c4e5594b52910c7c7c4b48d410d"]},"offset":"20983066"},"iso-string.js":{"size":2078,"integrity":{"algorithm":"SHA256","hash":"e4e3db2ebf8a98a6ed80a9f6a801fef3682b61ac36eab828f75b6f1efad5704c","blockSize":4194304,"blocks":["e4e3db2ebf8a98a6ed80a9f6a801fef3682b61ac36eab828f75b6f1efad5704c"]},"offset":"20986559"},"prototype.js":{"size":1739,"integrity":{"algorithm":"SHA256","hash":"ffb7596e4154ee6f807e6b3f6e0435142b7459fedf74e30523c8dbb7ad247913","blockSize":4194304,"blocks":["ffb7596e4154ee6f807e6b3f6e0435142b7459fedf74e30523c8dbb7ad247913"]},"offset":"20988637"},"valid.js":{"size":1184,"integrity":{"algorithm":"SHA256","hash":"b94e7f8c7a3a90d55ce110be98737a365523614173cbf3f70af384f4f9b833e1","blockSize":4194304,"blocks":["b94e7f8c7a3a90d55ce110be98737a365523614173cbf3f70af384f4f9b833e1"]},"offset":"20990376"}}},"create":{"files":{"check-overflow.js":{"size":1542,"integrity":{"algorithm":"SHA256","hash":"edd9139d9bcd4f6866a541eaaf640ac12c9e3d531bcfc2b26cc79ebf91ebba46","blockSize":4194304,"blocks":["edd9139d9bcd4f6866a541eaaf640ac12c9e3d531bcfc2b26cc79ebf91ebba46"]},"offset":"20991560"},"date-from-array.js":{"size":1076,"integrity":{"algorithm":"SHA256","hash":"c77a21ecce508210c21ad92b189551795fb90f89829f619ee3827b4f8a14204f","blockSize":4194304,"blocks":["c77a21ecce508210c21ad92b189551795fb90f89829f619ee3827b4f8a14204f"]},"offset":"20993102"},"from-anything.js":{"size":3351,"integrity":{"algorithm":"SHA256","hash":"e7cb8110a8d005df6f9a85ef23c6bff05196f072ab4a43cef07f01bf62237a1d","blockSize":4194304,"blocks":["e7cb8110a8d005df6f9a85ef23c6bff05196f072ab4a43cef07f01bf62237a1d"]},"offset":"20994178"},"from-array.js":{"size":5585,"integrity":{"algorithm":"SHA256","hash":"922bff361e3575e7756285581ac6434ea84f6b1dfee518675ac4633ce067faa3","blockSize":4194304,"blocks":["922bff361e3575e7756285581ac6434ea84f6b1dfee518675ac4633ce067faa3"]},"offset":"20997529"},"from-object.js":{"size":549,"integrity":{"algorithm":"SHA256","hash":"e54a0773752eeccab0930074a31f6f1cf62eee97d22ec1492b8a2e4bb150ae12","blockSize":4194304,"blocks":["e54a0773752eeccab0930074a31f6f1cf62eee97d22ec1492b8a2e4bb150ae12"]},"offset":"21003114"},"from-string-and-array.js":{"size":2011,"integrity":{"algorithm":"SHA256","hash":"8f987121a55292ccee761010a9cdb947cfed6f03c19b1e17ae2ae67b69456193","blockSize":4194304,"blocks":["8f987121a55292ccee761010a9cdb947cfed6f03c19b1e17ae2ae67b69456193"]},"offset":"21003663"},"from-string-and-format.js":{"size":4092,"integrity":{"algorithm":"SHA256","hash":"0a4d29582046148f6c3b92e20daa85313af8edceb50644e3644711b29e94457f","blockSize":4194304,"blocks":["0a4d29582046148f6c3b92e20daa85313af8edceb50644e3644711b29e94457f"]},"offset":"21005674"},"from-string.js":{"size":8007,"integrity":{"algorithm":"SHA256","hash":"30d3f2feebddfbfc974fa144441a12dd71dfe1d2e58f7564b9f66c2c8d2b03ee","blockSize":4194304,"blocks":["30d3f2feebddfbfc974fa144441a12dd71dfe1d2e58f7564b9f66c2c8d2b03ee"]},"offset":"21009766"},"local.js":{"size":183,"integrity":{"algorithm":"SHA256","hash":"0316f5b976a4e1aa1950fc059d62e7846f9098337c865e2c74473b59df4130f2","blockSize":4194304,"blocks":["0316f5b976a4e1aa1950fc059d62e7846f9098337c865e2c74473b59df4130f2"]},"offset":"21017773"},"parsing-flags.js":{"size":644,"integrity":{"algorithm":"SHA256","hash":"3e7e6a917c4d8792822fc45c7cffda8f5e026ddd29c68af4e5af931329caf20c","blockSize":4194304,"blocks":["3e7e6a917c4d8792822fc45c7cffda8f5e026ddd29c68af4e5af931329caf20c"]},"offset":"21017956"},"utc.js":{"size":186,"integrity":{"algorithm":"SHA256","hash":"a9333527f666147b10f35a42b216dd55136725b3689e795ce486c9257a6a333e","blockSize":4194304,"blocks":["a9333527f666147b10f35a42b216dd55136725b3689e795ce486c9257a6a333e"]},"offset":"21018600"},"valid.js":{"size":1514,"integrity":{"algorithm":"SHA256","hash":"e7d205e977f6bd8180b7f5aeb68db9da1cd9dba3918b969ddb31042840d73dfe","blockSize":4194304,"blocks":["e7d205e977f6bd8180b7f5aeb68db9da1cd9dba3918b969ddb31042840d73dfe"]},"offset":"21018786"}}}}}}},"min":{"files":{"locales.js":{"size":448027,"integrity":{"algorithm":"SHA256","hash":"a6d8d341af2a118463f8dbec697f3b5210552997ef51e0d9a77c84235f2eb2dd","blockSize":4194304,"blocks":["a6d8d341af2a118463f8dbec697f3b5210552997ef51e0d9a77c84235f2eb2dd"]},"offset":"21020300"},"locales.min.js":{"size":310773,"integrity":{"algorithm":"SHA256","hash":"1a3224b3cabca0fa92ca56e14da46d7f209ed28ce68ed50940b4fa6ed2ffd254","blockSize":4194304,"blocks":["1a3224b3cabca0fa92ca56e14da46d7f209ed28ce68ed50940b4fa6ed2ffd254"]},"offset":"21468327"},"moment-with-locales.js":{"size":622045,"integrity":{"algorithm":"SHA256","hash":"f37cad4429c2815e53699ca98abd4e8773737f696fff554c63a58f4d6589200b","blockSize":4194304,"blocks":["f37cad4429c2815e53699ca98abd4e8773737f696fff554c63a58f4d6589200b"]},"offset":"21779100"},"moment-with-locales.min.js":{"size":369019,"integrity":{"algorithm":"SHA256","hash":"430725b95468277dcbccc27e08e3d873276c0082737310b0b1ad330392511847","blockSize":4194304,"blocks":["430725b95468277dcbccc27e08e3d873276c0082737310b0b1ad330392511847"]},"offset":"22401145"},"moment.min.js":{"size":58103,"integrity":{"algorithm":"SHA256","hash":"f343aa319a17a3fc372ee6ad5af482b9bf6a298cb22652b4aa7502604821071f","blockSize":4194304,"blocks":["f343aa319a17a3fc372ee6ad5af482b9bf6a298cb22652b4aa7502604821071f"]},"offset":"22770164"}}},"locale":{"files":{"af.js":{"size":2753,"integrity":{"algorithm":"SHA256","hash":"c59e2f2d09098829d00f5dab85e6ec623f6aa9e70285ec2aac12030a014e4161","blockSize":4194304,"blocks":["c59e2f2d09098829d00f5dab85e6ec623f6aa9e70285ec2aac12030a014e4161"]},"offset":"22828267"},"ar-dz.js":{"size":5377,"integrity":{"algorithm":"SHA256","hash":"2fcf1465ad9fcb33a1ee00188d0d8cb19e0d9094da9e27f56444b67e50c6810c","blockSize":4194304,"blocks":["2fcf1465ad9fcb33a1ee00188d0d8cb19e0d9094da9e27f56444b67e50c6810c"]},"offset":"22831020"},"ar-kw.js":{"size":2478,"integrity":{"algorithm":"SHA256","hash":"ebcd2afd129890e49aa91cbd6718916ceb743122a4d264c681a533d8066de673","blockSize":4194304,"blocks":["ebcd2afd129890e49aa91cbd6718916ceb743122a4d264c681a533d8066de673"]},"offset":"22836397"},"ar-ly.js":{"size":5652,"integrity":{"algorithm":"SHA256","hash":"0a70bf3f66b074d68453af125059d60f1ce4d5a96d3401b0bb7f013fb7a56696","blockSize":4194304,"blocks":["0a70bf3f66b074d68453af125059d60f1ce4d5a96d3401b0bb7f013fb7a56696"]},"offset":"22838875"},"ar-ma.js":{"size":2533,"integrity":{"algorithm":"SHA256","hash":"ae28a7c4d994a1d4059f2dc1e6385182f3d5aab262d637a6bdfc80f3e3f5471e","blockSize":4194304,"blocks":["ae28a7c4d994a1d4059f2dc1e6385182f3d5aab262d637a6bdfc80f3e3f5471e"]},"offset":"22844527"},"ar-sa.js":{"size":3782,"integrity":{"algorithm":"SHA256","hash":"4913900a380ed33b662fc5299fda05cfba74367870ba23f3d9db5dfd0775c876","blockSize":4194304,"blocks":["4913900a380ed33b662fc5299fda05cfba74367870ba23f3d9db5dfd0775c876"]},"offset":"22847060"},"ar-tn.js":{"size":2480,"integrity":{"algorithm":"SHA256","hash":"2b6a611f7d21a0752d9101347b22943dcdd91293f7e09ac11c3b04cee41f594f","blockSize":4194304,"blocks":["2b6a611f7d21a0752d9101347b22943dcdd91293f7e09ac11c3b04cee41f594f"]},"offset":"22850842"},"ar.js":{"size":6136,"integrity":{"algorithm":"SHA256","hash":"73485f16cb9317f156bab05ba8a3233fa87513cf1cb52728fefc53703ffd5b3e","blockSize":4194304,"blocks":["73485f16cb9317f156bab05ba8a3233fa87513cf1cb52728fefc53703ffd5b3e"]},"offset":"22853322"},"az.js":{"size":3570,"integrity":{"algorithm":"SHA256","hash":"21cfe14e920b3edc4bc394709929f61aa5f2f9e51d3ca0c6edd1e51f29d7e3c9","blockSize":4194304,"blocks":["21cfe14e920b3edc4bc394709929f61aa5f2f9e51d3ca0c6edd1e51f29d7e3c9"]},"offset":"22859458"},"be.js":{"size":6030,"integrity":{"algorithm":"SHA256","hash":"aa0657f4f1e9f9ef3a3ce289bc882f5971195e4681499f02409486ed985e1407","blockSize":4194304,"blocks":["aa0657f4f1e9f9ef3a3ce289bc882f5971195e4681499f02409486ed985e1407"]},"offset":"22863028"},"bg.js":{"size":3623,"integrity":{"algorithm":"SHA256","hash":"0d034309eedbd03f17e22dbd963c8cc8d490c8e877f39c6c4081636d1cd28fca","blockSize":4194304,"blocks":["0d034309eedbd03f17e22dbd963c8cc8d490c8e877f39c6c4081636d1cd28fca"]},"offset":"22869058"},"bm.js":{"size":2233,"integrity":{"algorithm":"SHA256","hash":"1f3217d69f6512ea3984fb7428e1afe0c7779cf3822582c52e6eaa8982ac23b1","blockSize":4194304,"blocks":["1f3217d69f6512ea3984fb7428e1afe0c7779cf3822582c52e6eaa8982ac23b1"]},"offset":"22872681"},"bn-bd.js":{"size":5177,"integrity":{"algorithm":"SHA256","hash":"87296cd8b904b633d89b0a72b779aaf04e8d625fd8ed772e3227046b3a3acf80","blockSize":4194304,"blocks":["87296cd8b904b633d89b0a72b779aaf04e8d625fd8ed772e3227046b3a3acf80"]},"offset":"22874914"},"bn.js":{"size":4690,"integrity":{"algorithm":"SHA256","hash":"a43f974ec15f638e67cec9d73cb33c339ce7cb35bb7041b478a930197977a890","blockSize":4194304,"blocks":["a43f974ec15f638e67cec9d73cb33c339ce7cb35bb7041b478a930197977a890"]},"offset":"22880091"},"bo.js":{"size":5211,"integrity":{"algorithm":"SHA256","hash":"dbf83d196ab69149d5f056a2b44e06441626f1e5d3c3aa1a300e64dc5150565f","blockSize":4194304,"blocks":["dbf83d196ab69149d5f056a2b44e06441626f1e5d3c3aa1a300e64dc5150565f"]},"offset":"22884781"},"br.js":{"size":5520,"integrity":{"algorithm":"SHA256","hash":"35b4113f7552400639dc76ea40d55f1be6f44af2eaf4289e7c37e4e657522ba4","blockSize":4194304,"blocks":["35b4113f7552400639dc76ea40d55f1be6f44af2eaf4289e7c37e4e657522ba4"]},"offset":"22889992"},"bs.js":{"size":5387,"integrity":{"algorithm":"SHA256","hash":"1d185f2b71c18bb14d0e5db063d59912396d42a04aec97cfbbec19a5bb8bb5ec","blockSize":4194304,"blocks":["1d185f2b71c18bb14d0e5db063d59912396d42a04aec97cfbbec19a5bb8bb5ec"]},"offset":"22895512"},"ca.js":{"size":3751,"integrity":{"algorithm":"SHA256","hash":"c0ebe3bb033ce8f82c66a46dd297c19b30c80ba64036c721aca36a7f86f1b234","blockSize":4194304,"blocks":["c0ebe3bb033ce8f82c66a46dd297c19b30c80ba64036c721aca36a7f86f1b234"]},"offset":"22900899"},"cs.js":{"size":7750,"integrity":{"algorithm":"SHA256","hash":"0dcf511c06f565a917e4718cce467392bf898ba60af2b3fdb032b1910599ebc5","blockSize":4194304,"blocks":["0dcf511c06f565a917e4718cce467392bf898ba60af2b3fdb032b1910599ebc5"]},"offset":"22904650"},"cv.js":{"size":2913,"integrity":{"algorithm":"SHA256","hash":"231b3a65bc4beb4d6f0920962dafc82611403df4979655cea53d9740d2986904","blockSize":4194304,"blocks":["231b3a65bc4beb4d6f0920962dafc82611403df4979655cea53d9740d2986904"]},"offset":"22912400"},"cy.js":{"size":3542,"integrity":{"algorithm":"SHA256","hash":"05d100692e8cdd4a6b3b0eb56eb37c9c64dacab3254aaeba18c24689b18a6cf8","blockSize":4194304,"blocks":["05d100692e8cdd4a6b3b0eb56eb37c9c64dacab3254aaeba18c24689b18a6cf8"]},"offset":"22915313"},"da.js":{"size":2161,"integrity":{"algorithm":"SHA256","hash":"891e90544d1061ea578b51173a2dc4638c0e9af95cc2986f1f89ad5008e301e7","blockSize":4194304,"blocks":["891e90544d1061ea578b51173a2dc4638c0e9af95cc2986f1f89ad5008e301e7"]},"offset":"22918855"},"de-at.js":{"size":3259,"integrity":{"algorithm":"SHA256","hash":"0575c8ba66974f2eb3d7d74e16a265c40dbfe7802cefdecc9f196f92c0ecee97","blockSize":4194304,"blocks":["0575c8ba66974f2eb3d7d74e16a265c40dbfe7802cefdecc9f196f92c0ecee97"]},"offset":"22921016"},"de-ch.js":{"size":3094,"integrity":{"algorithm":"SHA256","hash":"b3c3d71abc98200d579cbbef89d470a6cbb272c4faa71e31232a68ef6451edd4","blockSize":4194304,"blocks":["b3c3d71abc98200d579cbbef89d470a6cbb272c4faa71e31232a68ef6451edd4"]},"offset":"22924275"},"de.js":{"size":3182,"integrity":{"algorithm":"SHA256","hash":"20fb0d0967e2720d135a6894165bf96e327b42bdedcbf45a9b2f9e44da7986dc","blockSize":4194304,"blocks":["20fb0d0967e2720d135a6894165bf96e327b42bdedcbf45a9b2f9e44da7986dc"]},"offset":"22927369"},"dv.js":{"size":3140,"integrity":{"algorithm":"SHA256","hash":"94a1563faab9fe61f359a515042f56e2672886200e084de98bbd98769f71ba69","blockSize":4194304,"blocks":["94a1563faab9fe61f359a515042f56e2672886200e084de98bbd98769f71ba69"]},"offset":"22930551"},"el.js":{"size":4617,"integrity":{"algorithm":"SHA256","hash":"a73fa8b59dd099d28a7824980577379437273f6ef35a90409cf36492bc2b3600","blockSize":4194304,"blocks":["a73fa8b59dd099d28a7824980577379437273f6ef35a90409cf36492bc2b3600"]},"offset":"22933691"},"en-au.js":{"size":2625,"integrity":{"algorithm":"SHA256","hash":"6a84d80e99d57f1ca1faa1dcca9f48e9925de4013ac5ceab52cbf20b059cff8c","blockSize":4194304,"blocks":["6a84d80e99d57f1ca1faa1dcca9f48e9925de4013ac5ceab52cbf20b059cff8c"]},"offset":"22938308"},"en-ca.js":{"size":2458,"integrity":{"algorithm":"SHA256","hash":"d7b47d71cd5b63a0cd7bc3945ca1799d9345ba9dc3e85356231dbb4f6becdd01","blockSize":4194304,"blocks":["d7b47d71cd5b63a0cd7bc3945ca1799d9345ba9dc3e85356231dbb4f6becdd01"]},"offset":"22940933"},"en-gb.js":{"size":2631,"integrity":{"algorithm":"SHA256","hash":"46e86bfd873ce2ba61885faa9e0ba2ae1a510574f698d6a3aba7da49d1505eb9","blockSize":4194304,"blocks":["46e86bfd873ce2ba61885faa9e0ba2ae1a510574f698d6a3aba7da49d1505eb9"]},"offset":"22943391"},"en-ie.js":{"size":2629,"integrity":{"algorithm":"SHA256","hash":"41a3d03fb561db37dc1e3a63cba10467c0bcabb2ab7e788329f86b6be6f72d9e","blockSize":4194304,"blocks":["41a3d03fb561db37dc1e3a63cba10467c0bcabb2ab7e788329f86b6be6f72d9e"]},"offset":"22946022"},"en-il.js":{"size":2451,"integrity":{"algorithm":"SHA256","hash":"494c5f26d0a16c8c1645d70cfc327e19086831ce78bc98599f4e5abc321db7d7","blockSize":4194304,"blocks":["494c5f26d0a16c8c1645d70cfc327e19086831ce78bc98599f4e5abc321db7d7"]},"offset":"22948651"},"en-in.js":{"size":2625,"integrity":{"algorithm":"SHA256","hash":"290dd53cb6262cfc22c961faf969851adfa8c38b30c80c496b8c8f19232a13e8","blockSize":4194304,"blocks":["290dd53cb6262cfc22c961faf969851adfa8c38b30c80c496b8c8f19232a13e8"]},"offset":"22951102"},"en-nz.js":{"size":2634,"integrity":{"algorithm":"SHA256","hash":"9590cf61d2ab1b83f793be9f074340397e639fbb112a80c8bb7d2e3a77c45448","blockSize":4194304,"blocks":["9590cf61d2ab1b83f793be9f074340397e639fbb112a80c8bb7d2e3a77c45448"]},"offset":"22953727"},"en-sg.js":{"size":2643,"integrity":{"algorithm":"SHA256","hash":"e3b29449d67e5d53d3420b5f4ec207dbd70f651380573b59f39aee2b1b9ca52d","blockSize":4194304,"blocks":["e3b29449d67e5d53d3420b5f4ec207dbd70f651380573b59f39aee2b1b9ca52d"]},"offset":"22956361"},"eo.js":{"size":2918,"integrity":{"algorithm":"SHA256","hash":"823d3e21f85f9d3801f7004cc5cde82d5f45d98e977979322543a65908411e4c","blockSize":4194304,"blocks":["823d3e21f85f9d3801f7004cc5cde82d5f45d98e977979322543a65908411e4c"]},"offset":"22959004"},"es-do.js":{"size":4197,"integrity":{"algorithm":"SHA256","hash":"a1d29019dcff0ce2a11cdf97018c20e99fbcb739163c059ad8bf2408f77d3161","blockSize":4194304,"blocks":["a1d29019dcff0ce2a11cdf97018c20e99fbcb739163c059ad8bf2408f77d3161"]},"offset":"22961922"},"es-mx.js":{"size":4270,"integrity":{"algorithm":"SHA256","hash":"a233573f641cc9c93c87b555fc5564c2e5ebb97e251338e971ba76e74d512646","blockSize":4194304,"blocks":["a233573f641cc9c93c87b555fc5564c2e5ebb97e251338e971ba76e74d512646"]},"offset":"22966119"},"es-us.js":{"size":4294,"integrity":{"algorithm":"SHA256","hash":"3923c6bd6137387d5edc62f6dc0174cc9eef8363238c16eef78bd9d9c69bfafc","blockSize":4194304,"blocks":["3923c6bd6137387d5edc62f6dc0174cc9eef8363238c16eef78bd9d9c69bfafc"]},"offset":"22970389"},"es.js":{"size":4254,"integrity":{"algorithm":"SHA256","hash":"2a8f1790d492fc338933a032a862f99998f31bcaf7a0e4fc298b6a3cb04cdf7e","blockSize":4194304,"blocks":["2a8f1790d492fc338933a032a862f99998f31bcaf7a0e4fc298b6a3cb04cdf7e"]},"offset":"22974683"},"et.js":{"size":3255,"integrity":{"algorithm":"SHA256","hash":"95c974679dba419b7d835fa51340c430bd0066bdc38a7a139caa575b67389d7e","blockSize":4194304,"blocks":["95c974679dba419b7d835fa51340c430bd0066bdc38a7a139caa575b67389d7e"]},"offset":"22978937"},"eu.js":{"size":2544,"integrity":{"algorithm":"SHA256","hash":"ecbc07cdb215cf9996405fa56ef306761ec6a9383e19a53c2b45d6a1c5c4dc68","blockSize":4194304,"blocks":["ecbc07cdb215cf9996405fa56ef306761ec6a9383e19a53c2b45d6a1c5c4dc68"]},"offset":"22982192"},"fa.js":{"size":3998,"integrity":{"algorithm":"SHA256","hash":"15ca66ce1faa865c68998fcc8ab1160207636b9161ad76f7cf7acd0d7c0ebd1f","blockSize":4194304,"blocks":["15ca66ce1faa865c68998fcc8ab1160207636b9161ad76f7cf7acd0d7c0ebd1f"]},"offset":"22984736"},"fi.js":{"size":4444,"integrity":{"algorithm":"SHA256","hash":"1339d4170019588a6764a56236c2a7c5b2389ace52a9ec5e8c09f1997935741f","blockSize":4194304,"blocks":["1339d4170019588a6764a56236c2a7c5b2389ace52a9ec5e8c09f1997935741f"]},"offset":"22988734"},"fil.js":{"size":2326,"integrity":{"algorithm":"SHA256","hash":"d24cac0d0069d89c48b4c8cee34cddcb7e39892c91f07b884574fe0cafb66ef7","blockSize":4194304,"blocks":["d24cac0d0069d89c48b4c8cee34cddcb7e39892c91f07b884574fe0cafb66ef7"]},"offset":"22993178"},"fo.js":{"size":2316,"integrity":{"algorithm":"SHA256","hash":"6338de573601e330030918569b8d2f80f98a57754e748a03ff56e3672fa25be7","blockSize":4194304,"blocks":["6338de573601e330030918569b8d2f80f98a57754e748a03ff56e3672fa25be7"]},"offset":"22995504"},"fr-ca.js":{"size":2704,"integrity":{"algorithm":"SHA256","hash":"59c5acfba5605fa641721bf16123300164ccc043f4bad6009aa8d880b159124a","blockSize":4194304,"blocks":["59c5acfba5605fa641721bf16123300164ccc043f4bad6009aa8d880b159124a"]},"offset":"22997820"},"fr-ch.js":{"size":2879,"integrity":{"algorithm":"SHA256","hash":"b32f50aa3d147ba5441d7728a45bce592125fd0a97117ca4b93b32c6393d847d","blockSize":4194304,"blocks":["b32f50aa3d147ba5441d7728a45bce592125fd0a97117ca4b93b32c6393d847d"]},"offset":"23000524"},"fr.js":{"size":4211,"integrity":{"algorithm":"SHA256","hash":"d87b4eb850bc7742c104557450d0a70d18a48a917335221af08d23850667523e","blockSize":4194304,"blocks":["d87b4eb850bc7742c104557450d0a70d18a48a917335221af08d23850667523e"]},"offset":"23003403"},"fy.js":{"size":2891,"integrity":{"algorithm":"SHA256","hash":"c33ae59d9a05aca0dbe86d74bff25eb44d04ee97b738034fcb72a21b73ec1cf1","blockSize":4194304,"blocks":["c33ae59d9a05aca0dbe86d74bff25eb44d04ee97b738034fcb72a21b73ec1cf1"]},"offset":"23007614"},"ga.js":{"size":3056,"integrity":{"algorithm":"SHA256","hash":"fc6d5d441553b23b5ebc3c79896499a093a3285f1e6134a680b8899b5cca4c86","blockSize":4194304,"blocks":["fc6d5d441553b23b5ebc3c79896499a093a3285f1e6134a680b8899b5cca4c86"]},"offset":"23010505"},"gd.js":{"size":3076,"integrity":{"algorithm":"SHA256","hash":"efa1d779f65671809a63f900479c69bed19c262f2fe7936076793bd13deda080","blockSize":4194304,"blocks":["efa1d779f65671809a63f900479c69bed19c262f2fe7936076793bd13deda080"]},"offset":"23013561"},"gl.js":{"size":2967,"integrity":{"algorithm":"SHA256","hash":"825e6fad55094c13118d2cada0b6c5945a97ea9b647686c2b00dc6980bea4608","blockSize":4194304,"blocks":["825e6fad55094c13118d2cada0b6c5945a97ea9b647686c2b00dc6980bea4608"]},"offset":"23016637"},"gom-deva.js":{"size":6336,"integrity":{"algorithm":"SHA256","hash":"ff5ebf00d100f610caa956ea22c45584e34067f762c2e9811326d5903ccd819c","blockSize":4194304,"blocks":["ff5ebf00d100f610caa956ea22c45584e34067f762c2e9811326d5903ccd819c"]},"offset":"23019604"},"gom-latn.js":{"size":4952,"integrity":{"algorithm":"SHA256","hash":"caa6b3cafb8d463c7cb0b47783b84d7f7637f685b8d33d1224548f7f9a124cd5","blockSize":4194304,"blocks":["caa6b3cafb8d463c7cb0b47783b84d7f7637f685b8d33d1224548f7f9a124cd5"]},"offset":"23025940"},"gu.js":{"size":4936,"integrity":{"algorithm":"SHA256","hash":"5155f3aa5fe43b18c7b06cf02ff6e9d6c157d7da822c658fbd8e2f0edceef161","blockSize":4194304,"blocks":["5155f3aa5fe43b18c7b06cf02ff6e9d6c157d7da822c658fbd8e2f0edceef161"]},"offset":"23030892"},"he.js":{"size":3899,"integrity":{"algorithm":"SHA256","hash":"93b540d4f1bc21d5668854475e8efd2d6fcaa2f596704752a586ce07d471d475","blockSize":4194304,"blocks":["93b540d4f1bc21d5668854475e8efd2d6fcaa2f596704752a586ce07d471d475"]},"offset":"23035828"},"hi.js":{"size":7385,"integrity":{"algorithm":"SHA256","hash":"482f9289851cc5add17895787d427259acf8d9467db37000d383021aa097a1e3","blockSize":4194304,"blocks":["482f9289851cc5add17895787d427259acf8d9467db37000d383021aa097a1e3"]},"offset":"23039727"},"hr.js":{"size":5658,"integrity":{"algorithm":"SHA256","hash":"4af37cc6b498a4c3418f0b5d90efe5354422b3d158681454dc2eedee31ce1469","blockSize":4194304,"blocks":["4af37cc6b498a4c3418f0b5d90efe5354422b3d158681454dc2eedee31ce1469"]},"offset":"23047112"},"hu.js":{"size":4599,"integrity":{"algorithm":"SHA256","hash":"518c3c1b849d41be9ef9673726ac3c71290096a727ff29c9edfb0f7489e3253f","blockSize":4194304,"blocks":["518c3c1b849d41be9ef9673726ac3c71290096a727ff29c9edfb0f7489e3253f"]},"offset":"23052770"},"hy-am.js":{"size":3936,"integrity":{"algorithm":"SHA256","hash":"2c3bf5ef8c5162c7c4ed0ce4b144fad24eefd691911d7c8b86c21cab84f3bfe6","blockSize":4194304,"blocks":["2c3bf5ef8c5162c7c4ed0ce4b144fad24eefd691911d7c8b86c21cab84f3bfe6"]},"offset":"23057369"},"id.js":{"size":2995,"integrity":{"algorithm":"SHA256","hash":"036154641aa4cba94ac8a65b98af75d2fa0ec29156674947d1148fa146689dc3","blockSize":4194304,"blocks":["036154641aa4cba94ac8a65b98af75d2fa0ec29156674947d1148fa146689dc3"]},"offset":"23061305"},"is.js":{"size":5334,"integrity":{"algorithm":"SHA256","hash":"6943c853ee0ad65ad2e3e38baecc90dc8088071f10406ee8a5ad995d7cf5f6e6","blockSize":4194304,"blocks":["6943c853ee0ad65ad2e3e38baecc90dc8088071f10406ee8a5ad995d7cf5f6e6"]},"offset":"23064300"},"it-ch.js":{"size":2521,"integrity":{"algorithm":"SHA256","hash":"9670e2244dd63556408fc20671fd763fb91be52041eee92934710e75e2b3b7fa","blockSize":4194304,"blocks":["9670e2244dd63556408fc20671fd763fb91be52041eee92934710e75e2b3b7fa"]},"offset":"23069634"},"it.js":{"size":3987,"integrity":{"algorithm":"SHA256","hash":"2fe7346bd6fdf02aee19fde76bd2ca0b5e65903ddd45d097be2342ee7b0b9470","blockSize":4194304,"blocks":["2fe7346bd6fdf02aee19fde76bd2ca0b5e65903ddd45d097be2342ee7b0b9470"]},"offset":"23072155"},"ja.js":{"size":4867,"integrity":{"algorithm":"SHA256","hash":"9720de4592dd94861f2fabb51110533fe44620f517e50448dd828a7f2eef7009","blockSize":4194304,"blocks":["9720de4592dd94861f2fabb51110533fe44620f517e50448dd828a7f2eef7009"]},"offset":"23076142"},"jv.js":{"size":3004,"integrity":{"algorithm":"SHA256","hash":"707617feaac7459e5d5c39ff3ea4a5e5da0cf398384902c1cd5975cbd1a113cd","blockSize":4194304,"blocks":["707617feaac7459e5d5c39ff3ea4a5e5da0cf398384902c1cd5975cbd1a113cd"]},"offset":"23081009"},"ka.js":{"size":4192,"integrity":{"algorithm":"SHA256","hash":"2c15068d2ceb1f34e4b92f95710b181bd1034410b8a96ae15dd11ee24d0ff0fa","blockSize":4194304,"blocks":["2c15068d2ceb1f34e4b92f95710b181bd1034410b8a96ae15dd11ee24d0ff0fa"]},"offset":"23084013"},"kk.js":{"size":3139,"integrity":{"algorithm":"SHA256","hash":"430c86f6c0ea0199d8622045883048b35875bea37b44424663bbe573056ec981","blockSize":4194304,"blocks":["430c86f6c0ea0199d8622045883048b35875bea37b44424663bbe573056ec981"]},"offset":"23088205"},"km.js":{"size":4090,"integrity":{"algorithm":"SHA256","hash":"01b837409a1ee03d8269886915f10ae1b9460b2cc42cc5f6fac862f7360ba103","blockSize":4194304,"blocks":["01b837409a1ee03d8269886915f10ae1b9460b2cc42cc5f6fac862f7360ba103"]},"offset":"23091344"},"kn.js":{"size":5064,"integrity":{"algorithm":"SHA256","hash":"9673f6d7a10086cda8228f1c080ec032e8f34e3a3de2f1413582e0a6cc6f2128","blockSize":4194304,"blocks":["9673f6d7a10086cda8228f1c080ec032e8f34e3a3de2f1413582e0a6cc6f2128"]},"offset":"23095434"},"ko.js":{"size":2839,"integrity":{"algorithm":"SHA256","hash":"f15f592b5d7d5bbbd061c5ad31d4c45f462ad43acad74808c6a7105b108ec0eb","blockSize":4194304,"blocks":["f15f592b5d7d5bbbd061c5ad31d4c45f462ad43acad74808c6a7105b108ec0eb"]},"offset":"23100498"},"ku.js":{"size":4118,"integrity":{"algorithm":"SHA256","hash":"816c9c27f4237f1fa595c5be0a60b7e5c58ec0336d5a908e03f73fd8596e1caf","blockSize":4194304,"blocks":["816c9c27f4237f1fa595c5be0a60b7e5c58ec0336d5a908e03f73fd8596e1caf"]},"offset":"23103337"},"ky.js":{"size":3173,"integrity":{"algorithm":"SHA256","hash":"d3c35f2c47610c7c921268cb98cf398599068d24d51e7a89167707130c85ad59","blockSize":4194304,"blocks":["d3c35f2c47610c7c921268cb98cf398599068d24d51e7a89167707130c85ad59"]},"offset":"23107455"},"lb.js":{"size":5129,"integrity":{"algorithm":"SHA256","hash":"cecd52da4e3f3a7a69d4cde1692c90d000a3726772f8e00a9c232faf4d6ff985","blockSize":4194304,"blocks":["cecd52da4e3f3a7a69d4cde1692c90d000a3726772f8e00a9c232faf4d6ff985"]},"offset":"23110628"},"lo.js":{"size":3169,"integrity":{"algorithm":"SHA256","hash":"83c284d16d40e861cd01c28683acf77475813993b2a17201f17127e238e5bcd6","blockSize":4194304,"blocks":["83c284d16d40e861cd01c28683acf77475813993b2a17201f17127e238e5bcd6"]},"offset":"23115757"},"lt.js":{"size":4825,"integrity":{"algorithm":"SHA256","hash":"a02ce50203e4cc9e85db77632d41f489f14c893f986199c8dd04191199924094","blockSize":4194304,"blocks":["a02ce50203e4cc9e85db77632d41f489f14c893f986199c8dd04191199924094"]},"offset":"23118926"},"lv.js":{"size":4137,"integrity":{"algorithm":"SHA256","hash":"e4f68dbe7147bdc76d7614102eb525f9a5d8dacc690dd661091412b0c9505cb1","blockSize":4194304,"blocks":["e4f68dbe7147bdc76d7614102eb525f9a5d8dacc690dd661091412b0c9505cb1"]},"offset":"23123751"},"me.js":{"size":4441,"integrity":{"algorithm":"SHA256","hash":"24103df1e95500b3fdc4aa60b933c66d2cf33aa4ff8d2401ae847c516285679e","blockSize":4194304,"blocks":["24103df1e95500b3fdc4aa60b933c66d2cf33aa4ff8d2401ae847c516285679e"]},"offset":"23127888"},"mi.js":{"size":2583,"integrity":{"algorithm":"SHA256","hash":"9cc67dce66cf3f0f9a57ce732af6878cc23fedcf256fd5302c6cf57df87eac3a","blockSize":4194304,"blocks":["9cc67dce66cf3f0f9a57ce732af6878cc23fedcf256fd5302c6cf57df87eac3a"]},"offset":"23132329"},"mk.js":{"size":3682,"integrity":{"algorithm":"SHA256","hash":"c38140b5408a91d9632765d23f4368f0cc98dfb6aafb0fcce452b6b4bfa93efd","blockSize":4194304,"blocks":["c38140b5408a91d9632765d23f4368f0cc98dfb6aafb0fcce452b6b4bfa93efd"]},"offset":"23134912"},"ml.js":{"size":3935,"integrity":{"algorithm":"SHA256","hash":"d45ac595a918393ae8f76838688fcd569c917b945e9c53861ec4a1f11f20aed2","blockSize":4194304,"blocks":["d45ac595a918393ae8f76838688fcd569c917b945e9c53861ec4a1f11f20aed2"]},"offset":"23138594"},"mn.js":{"size":4130,"integrity":{"algorithm":"SHA256","hash":"0f1f5bbc9eaf020931f8cb54ae085e51c41c0761ffc7fd265dbb60cbe7d84076","blockSize":4194304,"blocks":["0f1f5bbc9eaf020931f8cb54ae085e51c41c0761ffc7fd265dbb60cbe7d84076"]},"offset":"23142529"},"mr.js":{"size":7694,"integrity":{"algorithm":"SHA256","hash":"f6347f442281844a205245620f9e469f52cacb7dd41640ef67d32a94f2c583d0","blockSize":4194304,"blocks":["f6347f442281844a205245620f9e469f52cacb7dd41640ef67d32a94f2c583d0"]},"offset":"23146659"},"ms-my.js":{"size":2954,"integrity":{"algorithm":"SHA256","hash":"fa77f6b23884ace43199d189a596c8cd436ab20b2b6966599dd9fd589e51548f","blockSize":4194304,"blocks":["fa77f6b23884ace43199d189a596c8cd436ab20b2b6966599dd9fd589e51548f"]},"offset":"23154353"},"ms.js":{"size":2897,"integrity":{"algorithm":"SHA256","hash":"6b6301d42544281a07e51e517a1acd2e498e6289b29e74817433a86751761f71","blockSize":4194304,"blocks":["6b6301d42544281a07e51e517a1acd2e498e6289b29e74817433a86751761f71"]},"offset":"23157307"},"mt.js":{"size":2228,"integrity":{"algorithm":"SHA256","hash":"6af1d3643bd218941f30da0f6ba7bd64d4c2d0c49336876308af3af0387b0440","blockSize":4194304,"blocks":["6af1d3643bd218941f30da0f6ba7bd64d4c2d0c49336876308af3af0387b0440"]},"offset":"23160204"},"my.js":{"size":3762,"integrity":{"algorithm":"SHA256","hash":"92732cb26a774bc3e049c7e212d8ef1425413d63522ccca1fb1b0696854da4ad","blockSize":4194304,"blocks":["92732cb26a774bc3e049c7e212d8ef1425413d63522ccca1fb1b0696854da4ad"]},"offset":"23162432"},"nb.js":{"size":2451,"integrity":{"algorithm":"SHA256","hash":"36f088dce675389ff1b12afe35703b6d166cef8df8a24e1e1d6ecfcf7be84fd5","blockSize":4194304,"blocks":["36f088dce675389ff1b12afe35703b6d166cef8df8a24e1e1d6ecfcf7be84fd5"]},"offset":"23166194"},"ne.js":{"size":4831,"integrity":{"algorithm":"SHA256","hash":"804bbd6c30dc3b74de711a44f9019db06210323a0db31e53ce730feab5ea6275","blockSize":4194304,"blocks":["804bbd6c30dc3b74de711a44f9019db06210323a0db31e53ce730feab5ea6275"]},"offset":"23168645"},"nl-be.js":{"size":3881,"integrity":{"algorithm":"SHA256","hash":"2bd27e18811c7363a1b46b815173d626102523a2f76854792885166f4a99eb5f","blockSize":4194304,"blocks":["2bd27e18811c7363a1b46b815173d626102523a2f76854792885166f4a99eb5f"]},"offset":"23173476"},"nl.js":{"size":3918,"integrity":{"algorithm":"SHA256","hash":"037e055b18b4376112d853e3d357b217dcc0bfd3990e0155b980ff622b4ff8d9","blockSize":4194304,"blocks":["037e055b18b4376112d853e3d357b217dcc0bfd3990e0155b980ff622b4ff8d9"]},"offset":"23177357"},"nn.js":{"size":2380,"integrity":{"algorithm":"SHA256","hash":"66007f84c945a3475100a3024d5fa3d430d6e11e64de81849e50ea73e3f390be","blockSize":4194304,"blocks":["66007f84c945a3475100a3024d5fa3d430d6e11e64de81849e50ea73e3f390be"]},"offset":"23181275"},"oc-lnc.js":{"size":3138,"integrity":{"algorithm":"SHA256","hash":"1e03cd598c495e4dca3bae56e3822cacde57333ab5a85f555c582e104f54261c","blockSize":4194304,"blocks":["1e03cd598c495e4dca3bae56e3822cacde57333ab5a85f555c582e104f54261c"]},"offset":"23183655"},"pa-in.js":{"size":5006,"integrity":{"algorithm":"SHA256","hash":"5ba548ba7844a1c5c4a7f003337237f940b5e8aa67254fb90e1a05a66f2b43ac","blockSize":4194304,"blocks":["5ba548ba7844a1c5c4a7f003337237f940b5e8aa67254fb90e1a05a66f2b43ac"]},"offset":"23186793"},"pl.js":{"size":5026,"integrity":{"algorithm":"SHA256","hash":"5435a1265dacc269403f275095e24a63ff3b8bb0f95908f7a2a987fbe2ab9e43","blockSize":4194304,"blocks":["5435a1265dacc269403f275095e24a63ff3b8bb0f95908f7a2a987fbe2ab9e43"]},"offset":"23191799"},"pt-br.js":{"size":2410,"integrity":{"algorithm":"SHA256","hash":"8a8b165be42795d9e945e7494f38ea353ee2f7eee7eab123073f3a42ce755687","blockSize":4194304,"blocks":["8a8b165be42795d9e945e7494f38ea353ee2f7eee7eab123073f3a42ce755687"]},"offset":"23196825"},"pt.js":{"size":2540,"integrity":{"algorithm":"SHA256","hash":"89e4c2f2d351ad7e2fefec9332778b16cd4a31858ded9ad6fece12fd9db94ac2","blockSize":4194304,"blocks":["89e4c2f2d351ad7e2fefec9332778b16cd4a31858ded9ad6fece12fd9db94ac2"]},"offset":"23199235"},"ro.js":{"size":2931,"integrity":{"algorithm":"SHA256","hash":"f66bcaadde14018ffb3bce26ea8ffc3ce36cc65c4c1e9ef9ed6cb321b7ae9481","blockSize":4194304,"blocks":["f66bcaadde14018ffb3bce26ea8ffc3ce36cc65c4c1e9ef9ed6cb321b7ae9481"]},"offset":"23201775"},"ru.js":{"size":9562,"integrity":{"algorithm":"SHA256","hash":"47b9c98d906dcdc3d7b7f40e604d793fff2e142f7d788f6ac0deac5030458ef5","blockSize":4194304,"blocks":["47b9c98d906dcdc3d7b7f40e604d793fff2e142f7d788f6ac0deac5030458ef5"]},"offset":"23204706"},"sd.js":{"size":2793,"integrity":{"algorithm":"SHA256","hash":"e5f27127927a41eb82e45491e52bd6a529d3db5e6cd519c48f7473268909f6c3","blockSize":4194304,"blocks":["e5f27127927a41eb82e45491e52bd6a529d3db5e6cd519c48f7473268909f6c3"]},"offset":"23214268"},"se.js":{"size":2397,"integrity":{"algorithm":"SHA256","hash":"424ed10805d004f217b44ff6a0da5bad51d8f3b25577306f6e1f59c387525da2","blockSize":4194304,"blocks":["424ed10805d004f217b44ff6a0da5bad51d8f3b25577306f6e1f59c387525da2"]},"offset":"23217061"},"si.js":{"size":3277,"integrity":{"algorithm":"SHA256","hash":"8e7582efb99ff00bb7aeb6de0bfa65792592a5b4e81ae6caa7bf8cd8cb3180de","blockSize":4194304,"blocks":["8e7582efb99ff00bb7aeb6de0bfa65792592a5b4e81ae6caa7bf8cd8cb3180de"]},"offset":"23219458"},"sk.js":{"size":6065,"integrity":{"algorithm":"SHA256","hash":"7685c076b71fd8e36c2cb84c645bb3a75d84566f26c3682a2792f0113b4d9b16","blockSize":4194304,"blocks":["7685c076b71fd8e36c2cb84c645bb3a75d84566f26c3682a2792f0113b4d9b16"]},"offset":"23222735"},"sl.js":{"size":7111,"integrity":{"algorithm":"SHA256","hash":"ff2e8352962c2d13d114356c863701f2473651f6491639e1826ab417d0377f90","blockSize":4194304,"blocks":["ff2e8352962c2d13d114356c863701f2473651f6491639e1826ab417d0377f90"]},"offset":"23228800"},"sq.js":{"size":2559,"integrity":{"algorithm":"SHA256","hash":"9d7d061c245349d6897732c90ad57841c9132b9b556be07a24dc76ff17cf75a0","blockSize":4194304,"blocks":["9d7d061c245349d6897732c90ad57841c9132b9b556be07a24dc76ff17cf75a0"]},"offset":"23235911"},"sr-cyrl.js":{"size":5578,"integrity":{"algorithm":"SHA256","hash":"e62567ebcb6434f8652b1867386d7324c06d1f226fe9fad0517e658503ab496a","blockSize":4194304,"blocks":["e62567ebcb6434f8652b1867386d7324c06d1f226fe9fad0517e658503ab496a"]},"offset":"23238470"},"sr.js":{"size":5025,"integrity":{"algorithm":"SHA256","hash":"307eb8be823a2997ce88c5ad8c3ca19e7a6345f116331fe3856659665de0d453","blockSize":4194304,"blocks":["307eb8be823a2997ce88c5ad8c3ca19e7a6345f116331fe3856659665de0d453"]},"offset":"23244048"},"ss.js":{"size":3228,"integrity":{"algorithm":"SHA256","hash":"0d8a08574cc28602738aca72bed6364e88dd93fb2131a20c06630e3dd7565945","blockSize":4194304,"blocks":["0d8a08574cc28602738aca72bed6364e88dd93fb2131a20c06630e3dd7565945"]},"offset":"23249073"},"sv.js":{"size":2658,"integrity":{"algorithm":"SHA256","hash":"08f8dbba970b89522adaabe609f47a3f20857c0985967888124f9204f4c3e2f0","blockSize":4194304,"blocks":["08f8dbba970b89522adaabe609f47a3f20857c0985967888124f9204f4c3e2f0"]},"offset":"23252301"},"sw.js":{"size":2191,"integrity":{"algorithm":"SHA256","hash":"d6056ac79071a9f60793825357dac3ecf35c43acf10e02a65f1892f1fd9cc0c1","blockSize":4194304,"blocks":["d6056ac79071a9f60793825357dac3ecf35c43acf10e02a65f1892f1fd9cc0c1"]},"offset":"23254959"},"ta.js":{"size":5640,"integrity":{"algorithm":"SHA256","hash":"2dae88a3138adda69fdec54914461ec28d4fa5e720d7626ddb3fb91a74a2ab6b","blockSize":4194304,"blocks":["2dae88a3138adda69fdec54914461ec28d4fa5e720d7626ddb3fb91a74a2ab6b"]},"offset":"23257150"},"te.js":{"size":4064,"integrity":{"algorithm":"SHA256","hash":"2cc07292a2ab5702d8e1e849ae3b28cca5c6194d0d150ec637c6289d9d864e32","blockSize":4194304,"blocks":["2cc07292a2ab5702d8e1e849ae3b28cca5c6194d0d150ec637c6289d9d864e32"]},"offset":"23262790"},"tet.js":{"size":2741,"integrity":{"algorithm":"SHA256","hash":"d80dcb236c671594af031c93d32ed883c322a6f32bd25637d454d7b9d9e81593","blockSize":4194304,"blocks":["d80dcb236c671594af031c93d32ed883c322a6f32bd25637d454d7b9d9e81593"]},"offset":"23266854"},"tg.js":{"size":4388,"integrity":{"algorithm":"SHA256","hash":"24c8928619c471831467afc05aca6f0299e40b418b78bb30b4d66942d872d2bb","blockSize":4194304,"blocks":["24c8928619c471831467afc05aca6f0299e40b418b78bb30b4d66942d872d2bb"]},"offset":"23269595"},"th.js":{"size":3316,"integrity":{"algorithm":"SHA256","hash":"9911634c353a7ce63a81139f914552fc80a499029a803ced8b32b6af88c53bf4","blockSize":4194304,"blocks":["9911634c353a7ce63a81139f914552fc80a499029a803ced8b32b6af88c53bf4"]},"offset":"23273983"},"tk.js":{"size":3168,"integrity":{"algorithm":"SHA256","hash":"fc6654229cf3f6e6bb2aeb5b70dc4e6adf7f307575af9d15b7a31aab897a9988","blockSize":4194304,"blocks":["fc6654229cf3f6e6bb2aeb5b70dc4e6adf7f307575af9d15b7a31aab897a9988"]},"offset":"23277299"},"tl-ph.js":{"size":2287,"integrity":{"algorithm":"SHA256","hash":"e324f1791432534af3ada36c185637db02eaf3d3ed8f88ddf143538dc484cc3a","blockSize":4194304,"blocks":["e324f1791432534af3ada36c185637db02eaf3d3ed8f88ddf143538dc484cc3a"]},"offset":"23280467"},"tlh.js":{"size":4553,"integrity":{"algorithm":"SHA256","hash":"dccea1319a2e92d9bf373e1d8dadcd4a130e1fa2457d7a66dd035c3cb93601cd","blockSize":4194304,"blocks":["dccea1319a2e92d9bf373e1d8dadcd4a130e1fa2457d7a66dd035c3cb93601cd"]},"offset":"23282754"},"tr.js":{"size":3663,"integrity":{"algorithm":"SHA256","hash":"e8af125b0bdb3c15ff5ef2eb171bfe698507a026a9cab54bedb0770cdca34fb2","blockSize":4194304,"blocks":["e8af125b0bdb3c15ff5ef2eb171bfe698507a026a9cab54bedb0770cdca34fb2"]},"offset":"23287307"},"tzl.js":{"size":3779,"integrity":{"algorithm":"SHA256","hash":"393e6424d498fd2abbf646217a197b61c4c57706e6b29ec2873ab20e7bdf6970","blockSize":4194304,"blocks":["393e6424d498fd2abbf646217a197b61c4c57706e6b29ec2873ab20e7bdf6970"]},"offset":"23290970"},"tzm-latn.js":{"size":2237,"integrity":{"algorithm":"SHA256","hash":"7909cef0eb3080599c24794c079e05ba07af565f198450df0ad411c85be45030","blockSize":4194304,"blocks":["7909cef0eb3080599c24794c079e05ba07af565f198450df0ad411c85be45030"]},"offset":"23294749"},"tzm.js":{"size":2860,"integrity":{"algorithm":"SHA256","hash":"e6f3a2e2e3ca86953e2c06ca562607a95d2b5129e751e5e0905270f3e56a1f52","blockSize":4194304,"blocks":["e6f3a2e2e3ca86953e2c06ca562607a95d2b5129e751e5e0905270f3e56a1f52"]},"offset":"23296986"},"ug-cn.js":{"size":4644,"integrity":{"algorithm":"SHA256","hash":"58de2ad653876b1eb27ceaffb0037ddb0e4fb7917e111fa7a88ef8ab01fd041d","blockSize":4194304,"blocks":["58de2ad653876b1eb27ceaffb0037ddb0e4fb7917e111fa7a88ef8ab01fd041d"]},"offset":"23299846"},"uk.js":{"size":6927,"integrity":{"algorithm":"SHA256","hash":"725764b2851d3db79d8fb20b96ce7708cd1dc60c6ca6f37bac4df2350f3ccbf4","blockSize":4194304,"blocks":["725764b2851d3db79d8fb20b96ce7708cd1dc60c6ca6f37bac4df2350f3ccbf4"]},"offset":"23304490"},"ur.js":{"size":2840,"integrity":{"algorithm":"SHA256","hash":"c89fc485a14cb20c0576ff20bc3d157e1296f2b2ddfa8035f71e8b58f61a29a4","blockSize":4194304,"blocks":["c89fc485a14cb20c0576ff20bc3d157e1296f2b2ddfa8035f71e8b58f61a29a4"]},"offset":"23311417"},"uz-latn.js":{"size":2183,"integrity":{"algorithm":"SHA256","hash":"3943e946fcad9c965f147c50e08da71d3270239175de530d1f48be6fb44956ed","blockSize":4194304,"blocks":["3943e946fcad9c965f147c50e08da71d3270239175de530d1f48be6fb44956ed"]},"offset":"23314257"},"uz.js":{"size":2409,"integrity":{"algorithm":"SHA256","hash":"9f22344f9ff69b1cf5546c975fd8847884bb032216d15054ea267cb964a09b08","blockSize":4194304,"blocks":["9f22344f9ff69b1cf5546c975fd8847884bb032216d15054ea267cb964a09b08"]},"offset":"23316440"},"vi.js":{"size":3066,"integrity":{"algorithm":"SHA256","hash":"c5db03ae438e4c55a6edfa004540aaf1def14fe0968f9ed3e03fe7dd7c3faf03","blockSize":4194304,"blocks":["c5db03ae438e4c55a6edfa004540aaf1def14fe0968f9ed3e03fe7dd7c3faf03"]},"offset":"23318849"},"x-pseudo.js":{"size":2970,"integrity":{"algorithm":"SHA256","hash":"ca8ab052a09b2f320574c71c472609e026b4aa72c87a06f204ff33670249e2bf","blockSize":4194304,"blocks":["ca8ab052a09b2f320574c71c472609e026b4aa72c87a06f204ff33670249e2bf"]},"offset":"23321915"},"yo.js":{"size":2419,"integrity":{"algorithm":"SHA256","hash":"d80655b604558af2855f5b67b21b28ec5770985b67fde59e94e1168e5f4795c8","blockSize":4194304,"blocks":["d80655b604558af2855f5b67b21b28ec5770985b67fde59e94e1168e5f4795c8"]},"offset":"23324885"},"zh-cn.js":{"size":4507,"integrity":{"algorithm":"SHA256","hash":"53138532aad7c571af10cf6b17a678552e9a9e7ef5014d250f97af8dc61ae6e1","blockSize":4194304,"blocks":["53138532aad7c571af10cf6b17a678552e9a9e7ef5014d250f97af8dc61ae6e1"]},"offset":"23327304"},"zh-hk.js":{"size":3832,"integrity":{"algorithm":"SHA256","hash":"c6d7de0d1f5544a1d3bb64c7eb27481b30316766f1214fbb5b1c6be358a4b921","blockSize":4194304,"blocks":["c6d7de0d1f5544a1d3bb64c7eb27481b30316766f1214fbb5b1c6be358a4b921"]},"offset":"23331811"},"zh-mo.js":{"size":3782,"integrity":{"algorithm":"SHA256","hash":"874ca3806f556c5809842613ba410c965111ea9441fb949a32abe2a7c3bf7f8a","blockSize":4194304,"blocks":["874ca3806f556c5809842613ba410c965111ea9441fb949a32abe2a7c3bf7f8a"]},"offset":"23335643"},"zh-tw.js":{"size":3729,"integrity":{"algorithm":"SHA256","hash":"62fb1b36d24050120cadf807b975ffe9d7986aeb41a0f4ac218c3ad23a1c9b1a","blockSize":4194304,"blocks":["62fb1b36d24050120cadf807b975ffe9d7986aeb41a0f4ac218c3ad23a1c9b1a"]},"offset":"23339425"}}},"dist":{"files":{"moment.js":{"size":154671,"integrity":{"algorithm":"SHA256","hash":"4859b6a7ecbfb1028828fa5433c4138215aee64b3b4d8a97500d0d786207f1b7","blockSize":4194304,"blocks":["4859b6a7ecbfb1028828fa5433c4138215aee64b3b4d8a97500d0d786207f1b7"]},"offset":"23343154"},"locale":{"files":{"af.js":{"size":2149,"integrity":{"algorithm":"SHA256","hash":"203e2a88aa3c7d1ac73d73af5f05f45d38de5e4ab116756f9a4a5eb4edb938d5","blockSize":4194304,"blocks":["203e2a88aa3c7d1ac73d73af5f05f45d38de5e4ab116756f9a4a5eb4edb938d5"]},"offset":"23497825"},"ar-dz.js":{"size":4449,"integrity":{"algorithm":"SHA256","hash":"9ca151d5d32d2aee2513b46f4563af75317cb6bc80c84a2cdd036d3b0583fbea","blockSize":4194304,"blocks":["9ca151d5d32d2aee2513b46f4563af75317cb6bc80c84a2cdd036d3b0583fbea"]},"offset":"23499974"},"ar-kw.js":{"size":1934,"integrity":{"algorithm":"SHA256","hash":"05db52433db1cd184dd86ea13627585caa277842b803cfad24dd9700e95a3d9b","blockSize":4194304,"blocks":["05db52433db1cd184dd86ea13627585caa277842b803cfad24dd9700e95a3d9b"]},"offset":"23504423"},"ar-ly.js":{"size":4648,"integrity":{"algorithm":"SHA256","hash":"eb3346cc67eb2687374abd9afb643a6787a18b695d171747b6346cc255be746a","blockSize":4194304,"blocks":["eb3346cc67eb2687374abd9afb643a6787a18b695d171747b6346cc255be746a"]},"offset":"23506357"},"ar-ma.js":{"size":1989,"integrity":{"algorithm":"SHA256","hash":"3c5e1d7da8592652d9543b7c6683fe53885b51444ab026acc6b1ab11555d430b","blockSize":4194304,"blocks":["3c5e1d7da8592652d9543b7c6683fe53885b51444ab026acc6b1ab11555d430b"]},"offset":"23511005"},"ar-sa.js":{"size":3042,"integrity":{"algorithm":"SHA256","hash":"270c96fde1f824cee84a9ceab5570d2288aaacc821f288daf2ea2e71edb37f63","blockSize":4194304,"blocks":["270c96fde1f824cee84a9ceab5570d2288aaacc821f288daf2ea2e71edb37f63"]},"offset":"23512994"},"ar-tn.js":{"size":1936,"integrity":{"algorithm":"SHA256","hash":"e7cfa73dce796c5e91594f4474fa81f23f04f1f3cb744c8bcf45acc9231e2c23","blockSize":4194304,"blocks":["e7cfa73dce796c5e91594f4474fa81f23f04f1f3cb744c8bcf45acc9231e2c23"]},"offset":"23516036"},"ar.js":{"size":5072,"integrity":{"algorithm":"SHA256","hash":"e7684ee61213f2d7fee0269e0a49b42e3a82f391193cf469ab980842cb6cf029","blockSize":4194304,"blocks":["e7684ee61213f2d7fee0269e0a49b42e3a82f391193cf469ab980842cb6cf029"]},"offset":"23517972"},"az.js":{"size":2846,"integrity":{"algorithm":"SHA256","hash":"54cdde438de2f5dd7ff1ddb6841fae7a3a66b080ff6216542ca6495381a715c8","blockSize":4194304,"blocks":["54cdde438de2f5dd7ff1ddb6841fae7a3a66b080ff6216542ca6495381a715c8"]},"offset":"23523044"},"be.js":{"size":5154,"integrity":{"algorithm":"SHA256","hash":"93bd7cc907fe69c36a6a8bfb3ae2d4d3e787c867d3fa1d0a5740c3f121827e85","blockSize":4194304,"blocks":["93bd7cc907fe69c36a6a8bfb3ae2d4d3e787c867d3fa1d0a5740c3f121827e85"]},"offset":"23525890"},"bg.js":{"size":2955,"integrity":{"algorithm":"SHA256","hash":"1d9c3b15eaabab63bc4e6bea7f1f62dd0c04c97615e3af2c91bd9bfccd9dca93","blockSize":4194304,"blocks":["1d9c3b15eaabab63bc4e6bea7f1f62dd0c04c97615e3af2c91bd9bfccd9dca93"]},"offset":"23531044"},"bm.js":{"size":1784,"integrity":{"algorithm":"SHA256","hash":"d264e9178a3e775007241f9d464ee7bbe42e53ee105e203ddcfb1c24b061eaa3","blockSize":4194304,"blocks":["d264e9178a3e775007241f9d464ee7bbe42e53ee105e203ddcfb1c24b061eaa3"]},"offset":"23533999"},"bn-bd.js":{"size":4349,"integrity":{"algorithm":"SHA256","hash":"62ea7b81624d2a93dc236d1cb1f63dd64a0b8146aaf93b95c924c5b03731b1f1","blockSize":4194304,"blocks":["62ea7b81624d2a93dc236d1cb1f63dd64a0b8146aaf93b95c924c5b03731b1f1"]},"offset":"23535783"},"bn.js":{"size":3898,"integrity":{"algorithm":"SHA256","hash":"431018a0f29f9f811fa707c98cea9198f7039cf01350fb1aaeb855eccfadd169","blockSize":4194304,"blocks":["431018a0f29f9f811fa707c98cea9198f7039cf01350fb1aaeb855eccfadd169"]},"offset":"23540132"},"bo.js":{"size":4399,"integrity":{"algorithm":"SHA256","hash":"714b54feaeea292198f2cbb6f6e44cebe4fc7deec6367b3d78ca5bebdf6f422f","blockSize":4194304,"blocks":["714b54feaeea292198f2cbb6f6e44cebe4fc7deec6367b3d78ca5bebdf6f422f"]},"offset":"23544030"},"br.js":{"size":4544,"integrity":{"algorithm":"SHA256","hash":"db8689c68771c1edf5d28627333ebb659f3d27f0a6b5661daafe1f06d2c8dbe3","blockSize":4194304,"blocks":["db8689c68771c1edf5d28627333ebb659f3d27f0a6b5661daafe1f06d2c8dbe3"]},"offset":"23548429"},"bs.js":{"size":4475,"integrity":{"algorithm":"SHA256","hash":"918f32d2f6e8331a982044f6e3b381a76c36b233ea1b947ae59e6bf756edce60","blockSize":4194304,"blocks":["918f32d2f6e8331a982044f6e3b381a76c36b233ea1b947ae59e6bf756edce60"]},"offset":"23552973"},"ca.js":{"size":3031,"integrity":{"algorithm":"SHA256","hash":"8b3d4ec6d5e5a2a2e4eda9a8fcfb90553afa77393df52f336236fb347286fbce","blockSize":4194304,"blocks":["8b3d4ec6d5e5a2a2e4eda9a8fcfb90553afa77393df52f336236fb347286fbce"]},"offset":"23557448"},"cs.js":{"size":6718,"integrity":{"algorithm":"SHA256","hash":"b6e4c0920fa798daea65b08323f344f1b50d63325ee23298f5f4ed8a98d728d3","blockSize":4194304,"blocks":["b6e4c0920fa798daea65b08323f344f1b50d63325ee23298f5f4ed8a98d728d3"]},"offset":"23560479"},"cv.js":{"size":2341,"integrity":{"algorithm":"SHA256","hash":"61de7c720ff21cb2ad58e86c8ab72a5af21c52d252f6f8f538f4e657e207ab21","blockSize":4194304,"blocks":["61de7c720ff21cb2ad58e86c8ab72a5af21c52d252f6f8f538f4e657e207ab21"]},"offset":"23567197"},"cy.js":{"size":2834,"integrity":{"algorithm":"SHA256","hash":"c62fb82208566696275a9a84ec6c142f147c132f1d80fb03d4c92ac5b4398f47","blockSize":4194304,"blocks":["c62fb82208566696275a9a84ec6c142f147c132f1d80fb03d4c92ac5b4398f47"]},"offset":"23569538"},"da.js":{"size":1629,"integrity":{"algorithm":"SHA256","hash":"e93cbb4f32c15585ade43825f4bafb4eb97567a510756c5b54f2d976d46b40c9","blockSize":4194304,"blocks":["e93cbb4f32c15585ade43825f4bafb4eb97567a510756c5b54f2d976d46b40c9"]},"offset":"23572372"},"de-at.js":{"size":2635,"integrity":{"algorithm":"SHA256","hash":"2c79472151dc55814dea66c60ad0057a614309b637a1c3f758907162c7f2c6a9","blockSize":4194304,"blocks":["2c79472151dc55814dea66c60ad0057a614309b637a1c3f758907162c7f2c6a9"]},"offset":"23574001"},"de-ch.js":{"size":2563,"integrity":{"algorithm":"SHA256","hash":"c34cd1e459f9643e616d7744c6aed45d856df7953b3821441eff6ffe6f6d2992","blockSize":4194304,"blocks":["c34cd1e459f9643e616d7744c6aed45d856df7953b3821441eff6ffe6f6d2992"]},"offset":"23576636"},"de.js":{"size":2562,"integrity":{"algorithm":"SHA256","hash":"bb127d18562814f3b89737fc4cbff5774e09ce7cc5c3ce19b09348d94e36a53b","blockSize":4194304,"blocks":["bb127d18562814f3b89737fc4cbff5774e09ce7cc5c3ce19b09348d94e36a53b"]},"offset":"23579199"},"dv.js":{"size":2464,"integrity":{"algorithm":"SHA256","hash":"a143e02b80550dbc90713796bd0094942a0dd58d23449b71e5846d86c9bb4224","blockSize":4194304,"blocks":["a143e02b80550dbc90713796bd0094942a0dd58d23449b71e5846d86c9bb4224"]},"offset":"23581761"},"el.js":{"size":3877,"integrity":{"algorithm":"SHA256","hash":"6d947bde8e28849626f86154b11ae5446e4a8dde0f599037c9c9edd6a25e410a","blockSize":4194304,"blocks":["6d947bde8e28849626f86154b11ae5446e4a8dde0f599037c9c9edd6a25e410a"]},"offset":"23584225"},"en-au.js":{"size":2029,"integrity":{"algorithm":"SHA256","hash":"409391b33bc5fc1fcb61b9fee48bda0e3608f15323fc06988ae880eacf02c800","blockSize":4194304,"blocks":["409391b33bc5fc1fcb61b9fee48bda0e3608f15323fc06988ae880eacf02c800"]},"offset":"23588102"},"en-ca.js":{"size":1878,"integrity":{"algorithm":"SHA256","hash":"cf4ec7fabf11593a398075b638bb1dac307477ef819a106825d3b1709d2a8ff7","blockSize":4194304,"blocks":["cf4ec7fabf11593a398075b638bb1dac307477ef819a106825d3b1709d2a8ff7"]},"offset":"23590131"},"en-gb.js":{"size":2035,"integrity":{"algorithm":"SHA256","hash":"c652887658c284f3de712fca5bc0c12cc2d9fc71a03691a8bf199aac62ae4f02","blockSize":4194304,"blocks":["c652887658c284f3de712fca5bc0c12cc2d9fc71a03691a8bf199aac62ae4f02"]},"offset":"23592009"},"en-ie.js":{"size":2033,"integrity":{"algorithm":"SHA256","hash":"21678eb92796b3576c96dca63b3ca875a9e283f06dc56d3b00b29f2867b14435","blockSize":4194304,"blocks":["21678eb92796b3576c96dca63b3ca875a9e283f06dc56d3b00b29f2867b14435"]},"offset":"23594044"},"en-il.js":{"size":1871,"integrity":{"algorithm":"SHA256","hash":"2baf5467136c2b16cba796109c5311bd81b031a0b98950121b2134f123afeb9b","blockSize":4194304,"blocks":["2baf5467136c2b16cba796109c5311bd81b031a0b98950121b2134f123afeb9b"]},"offset":"23596077"},"en-in.js":{"size":2029,"integrity":{"algorithm":"SHA256","hash":"e04b56e50944516aafa6a3084988ecc8e4b5191e13ad2bb3c3761083bea6de4b","blockSize":4194304,"blocks":["e04b56e50944516aafa6a3084988ecc8e4b5191e13ad2bb3c3761083bea6de4b"]},"offset":"23597948"},"en-nz.js":{"size":2038,"integrity":{"algorithm":"SHA256","hash":"aab44ef9efcd9351aa2a9943da707f2f5ea3d6a9fc55c919aecd70422e738d69","blockSize":4194304,"blocks":["aab44ef9efcd9351aa2a9943da707f2f5ea3d6a9fc55c919aecd70422e738d69"]},"offset":"23599977"},"en-sg.js":{"size":2047,"integrity":{"algorithm":"SHA256","hash":"52872f32f2a3f2d794ec5ee8bad839b42300d646eac2b9540d454be6143dc068","blockSize":4194304,"blocks":["52872f32f2a3f2d794ec5ee8bad839b42300d646eac2b9540d454be6143dc068"]},"offset":"23602015"},"eo.js":{"size":2338,"integrity":{"algorithm":"SHA256","hash":"443218cf6980aef8a1b3237fc18f916de2b8c84246b61af41dbc3eb34edf4817","blockSize":4194304,"blocks":["443218cf6980aef8a1b3237fc18f916de2b8c84246b61af41dbc3eb34edf4817"]},"offset":"23604062"},"es-do.js":{"size":3441,"integrity":{"algorithm":"SHA256","hash":"a85e82558787c7e7f6dcb71c2dff9abd868a74db1f7faafc0c93f5ae6b59dc97","blockSize":4194304,"blocks":["a85e82558787c7e7f6dcb71c2dff9abd868a74db1f7faafc0c93f5ae6b59dc97"]},"offset":"23606400"},"es-mx.js":{"size":3510,"integrity":{"algorithm":"SHA256","hash":"538c66ceab06fb6b9634ebc0aa72b3d7b6a04a30b496c2e53eb94c9014be6f6f","blockSize":4194304,"blocks":["538c66ceab06fb6b9634ebc0aa72b3d7b6a04a30b496c2e53eb94c9014be6f6f"]},"offset":"23609841"},"es-us.js":{"size":3538,"integrity":{"algorithm":"SHA256","hash":"e7dd8f7d47cce040b040f54f89369b58d6b04c2e341f42d1fe623948d019d3d6","blockSize":4194304,"blocks":["e7dd8f7d47cce040b040f54f89369b58d6b04c2e341f42d1fe623948d019d3d6"]},"offset":"23613351"},"es.js":{"size":3498,"integrity":{"algorithm":"SHA256","hash":"b48d9086c00c8e7a896801d2b087cb9fb2f2397ab6c0c4e3ca2b39fc36de1bfc","blockSize":4194304,"blocks":["b48d9086c00c8e7a896801d2b087cb9fb2f2397ab6c0c4e3ca2b39fc36de1bfc"]},"offset":"23616889"},"et.js":{"size":2631,"integrity":{"algorithm":"SHA256","hash":"7b29b6b32394722b97b097c7c16a25fea6fdc02e2132525221fdc87534d35c3c","blockSize":4194304,"blocks":["7b29b6b32394722b97b097c7c16a25fea6fdc02e2132525221fdc87534d35c3c"]},"offset":"23620387"},"eu.js":{"size":1964,"integrity":{"algorithm":"SHA256","hash":"c212d561aa1d1d366b4af25550cb694471704d7ceefdb86573cfeb01ba3bc0ee","blockSize":4194304,"blocks":["c212d561aa1d1d366b4af25550cb694471704d7ceefdb86573cfeb01ba3bc0ee"]},"offset":"23623018"},"fa.js":{"size":3230,"integrity":{"algorithm":"SHA256","hash":"df6018d93d7eb824f1b4b5781757e85ecb03ca74bccea314357b1d3085c00a1b","blockSize":4194304,"blocks":["df6018d93d7eb824f1b4b5781757e85ecb03ca74bccea314357b1d3085c00a1b"]},"offset":"23624982"},"fi.js":{"size":3632,"integrity":{"algorithm":"SHA256","hash":"928dc7ff4e6b2ab5d186d5d22c80eca75ba6c1827b3e2ea9397d3b6dffcd7fd2","blockSize":4194304,"blocks":["928dc7ff4e6b2ab5d186d5d22c80eca75ba6c1827b3e2ea9397d3b6dffcd7fd2"]},"offset":"23628212"},"fil.js":{"size":1776,"integrity":{"algorithm":"SHA256","hash":"5cf1f1e21ff82efdc535e223a41e62e135ffb77a55880dfb0c1e3583e12dbab0","blockSize":4194304,"blocks":["5cf1f1e21ff82efdc535e223a41e62e135ffb77a55880dfb0c1e3583e12dbab0"]},"offset":"23631844"},"fo.js":{"size":1772,"integrity":{"algorithm":"SHA256","hash":"3e3ed3c52c28076b979e2217254a1973660d493560a01fcae478c40826ff7d12","blockSize":4194304,"blocks":["3e3ed3c52c28076b979e2217254a1973660d493560a01fcae478c40826ff7d12"]},"offset":"23633620"},"fr-ca.js":{"size":2104,"integrity":{"algorithm":"SHA256","hash":"c94d4a653d2a3ad27800e918b5ce52f1e90987d85cf539f5a0018b3ccf816adc","blockSize":4194304,"blocks":["c94d4a653d2a3ad27800e918b5ce52f1e90987d85cf539f5a0018b3ccf816adc"]},"offset":"23635392"},"fr-ch.js":{"size":2263,"integrity":{"algorithm":"SHA256","hash":"1be16e64aa8a831f587a9acfa2b208c55c1930b9c6110e5ac4d6b82af44f51f0","blockSize":4194304,"blocks":["1be16e64aa8a831f587a9acfa2b208c55c1930b9c6110e5ac4d6b82af44f51f0"]},"offset":"23637496"},"fr.js":{"size":3471,"integrity":{"algorithm":"SHA256","hash":"1f308241c4081c7b92f6876e40b59ed281a0eddb5266f087c4600ccaee54513d","blockSize":4194304,"blocks":["1f308241c4081c7b92f6876e40b59ed281a0eddb5266f087c4600ccaee54513d"]},"offset":"23639759"},"fy.js":{"size":2275,"integrity":{"algorithm":"SHA256","hash":"f5c13170fe7d2d32128885e393f56efe431e267bcc75b26b121c0ba9493598f8","blockSize":4194304,"blocks":["f5c13170fe7d2d32128885e393f56efe431e267bcc75b26b121c0ba9493598f8"]},"offset":"23643230"},"ga.js":{"size":2360,"integrity":{"algorithm":"SHA256","hash":"ab3a47a8df789cdc71f2c44afc16cddd679f6a1e168db81da5c2724a555dec7e","blockSize":4194304,"blocks":["ab3a47a8df789cdc71f2c44afc16cddd679f6a1e168db81da5c2724a555dec7e"]},"offset":"23645505"},"gd.js":{"size":2380,"integrity":{"algorithm":"SHA256","hash":"96e22b8bb1187179a379c385091e46b4aa530ddc3964656c5fd4fe3f7d3df262","blockSize":4194304,"blocks":["96e22b8bb1187179a379c385091e46b4aa530ddc3964656c5fd4fe3f7d3df262"]},"offset":"23647865"},"gl.js":{"size":2347,"integrity":{"algorithm":"SHA256","hash":"225c8a483a4d06136863fa2202fc2078a453d9c0c3aa7e9ab5acc1d0cc985ee9","blockSize":4194304,"blocks":["225c8a483a4d06136863fa2202fc2078a453d9c0c3aa7e9ab5acc1d0cc985ee9"]},"offset":"23650245"},"gom-deva.js":{"size":5506,"integrity":{"algorithm":"SHA256","hash":"ba49d34725e12b0c4c3bf7cce3c3476a762e8a0cea3a85589c0e5e7fe8fe0981","blockSize":4194304,"blocks":["ba49d34725e12b0c4c3bf7cce3c3476a762e8a0cea3a85589c0e5e7fe8fe0981"]},"offset":"23652592"},"gom-latn.js":{"size":4130,"integrity":{"algorithm":"SHA256","hash":"86fc8f647d7c75272c8d34e9d42b82b52a8a2b3d938f2912bfedd5f17430bafb","blockSize":4194304,"blocks":["86fc8f647d7c75272c8d34e9d42b82b52a8a2b3d938f2912bfedd5f17430bafb"]},"offset":"23658098"},"gu.js":{"size":4132,"integrity":{"algorithm":"SHA256","hash":"ffa459a40a7a67227c8bacc5ed29cfa9b3aacf8d0604b101618cdead2bb5d725","blockSize":4194304,"blocks":["ffa459a40a7a67227c8bacc5ed29cfa9b3aacf8d0604b101618cdead2bb5d725"]},"offset":"23662228"},"he.js":{"size":3211,"integrity":{"algorithm":"SHA256","hash":"43a3d85cc1b9833a55e4730401e9e3261a00ab862b5a766171268e6b9cc98c6a","blockSize":4194304,"blocks":["43a3d85cc1b9833a55e4730401e9e3261a00ab862b5a766171268e6b9cc98c6a"]},"offset":"23666360"},"hi.js":{"size":6421,"integrity":{"algorithm":"SHA256","hash":"143125d99ab68e9daae7ca2a62fdc523e4469fd47f8f9eb16d0a6743f4eac93d","blockSize":4194304,"blocks":["143125d99ab68e9daae7ca2a62fdc523e4469fd47f8f9eb16d0a6743f4eac93d"]},"offset":"23669571"},"hr.js":{"size":4718,"integrity":{"algorithm":"SHA256","hash":"21164a159b0acf3b7ba54d1dbf570f0913304f3dab27ef279bcbef6d2df2b85e","blockSize":4194304,"blocks":["21164a159b0acf3b7ba54d1dbf570f0913304f3dab27ef279bcbef6d2df2b85e"]},"offset":"23675992"},"hu.js":{"size":3815,"integrity":{"algorithm":"SHA256","hash":"99070988d57aed055b822a5267782fb1bb00dfdf50918936674cc62db250a42b","blockSize":4194304,"blocks":["99070988d57aed055b822a5267782fb1bb00dfdf50918936674cc62db250a42b"]},"offset":"23680710"},"hy-am.js":{"size":3236,"integrity":{"algorithm":"SHA256","hash":"3a7848726dd1c8d7030bbaaf467b6d44f67048097ca3cd1b1378d8011ce349fb","blockSize":4194304,"blocks":["3a7848726dd1c8d7030bbaaf467b6d44f67048097ca3cd1b1378d8011ce349fb"]},"offset":"23684525"},"id.js":{"size":2375,"integrity":{"algorithm":"SHA256","hash":"ba246e24a058bd362fcf4790e3dcd0c044c5b73e9029f0cbab539c162c23e065","blockSize":4194304,"blocks":["ba246e24a058bd362fcf4790e3dcd0c044c5b73e9029f0cbab539c162c23e065"]},"offset":"23687761"},"is.js":{"size":4458,"integrity":{"algorithm":"SHA256","hash":"29856999dcc1a23cf894a611cc2d2f0f97f67b89d4cc4c8d2d73e5ff320e9929","blockSize":4194304,"blocks":["29856999dcc1a23cf894a611cc2d2f0f97f67b89d4cc4c8d2d73e5ff320e9929"]},"offset":"23690136"},"it-ch.js":{"size":1941,"integrity":{"algorithm":"SHA256","hash":"d9abf16eed703724980bad09af56c3e19c65d6973718167dd0f7f97b589b490b","blockSize":4194304,"blocks":["d9abf16eed703724980bad09af56c3e19c65d6973718167dd0f7f97b589b490b"]},"offset":"23694594"},"it.js":{"size":3251,"integrity":{"algorithm":"SHA256","hash":"7f4a1a4fffce32b55081cc3c24e5239b152270f7a22e862a448cd6ca3281b7ff","blockSize":4194304,"blocks":["7f4a1a4fffce32b55081cc3c24e5239b152270f7a22e862a448cd6ca3281b7ff"]},"offset":"23696535"},"ja.js":{"size":3955,"integrity":{"algorithm":"SHA256","hash":"4aa4e657a049839f01ebbfe60b90919b6584f0ce797e5b5e5f7ad7157e2b0a22","blockSize":4194304,"blocks":["4aa4e657a049839f01ebbfe60b90919b6584f0ce797e5b5e5f7ad7157e2b0a22"]},"offset":"23699786"},"jv.js":{"size":2384,"integrity":{"algorithm":"SHA256","hash":"cdc4887a249d28946a9f8f880d6234ddaaebd69533b84d05791f712e2e801748","blockSize":4194304,"blocks":["cdc4887a249d28946a9f8f880d6234ddaaebd69533b84d05791f712e2e801748"]},"offset":"23703741"},"ka.js":{"size":3504,"integrity":{"algorithm":"SHA256","hash":"8ecb232268b139d31a0d6e6da4acce0b059ccfd81d711c0e73db0d98e2524d87","blockSize":4194304,"blocks":["8ecb232268b139d31a0d6e6da4acce0b059ccfd81d711c0e73db0d98e2524d87"]},"offset":"23706125"},"kk.js":{"size":2495,"integrity":{"algorithm":"SHA256","hash":"265a11f33b159887543d11d2bd3a7007242e5de65b04def844b73a47fd0b27bc","blockSize":4194304,"blocks":["265a11f33b159887543d11d2bd3a7007242e5de65b04def844b73a47fd0b27bc"]},"offset":"23709629"},"km.js":{"size":3362,"integrity":{"algorithm":"SHA256","hash":"a0679eb448bba45d9653b301e88ea67b594abe23d97c9d35379e6b510e54ee6b","blockSize":4194304,"blocks":["a0679eb448bba45d9653b301e88ea67b594abe23d97c9d35379e6b510e54ee6b"]},"offset":"23712124"},"kn.js":{"size":4252,"integrity":{"algorithm":"SHA256","hash":"c03429cde5ac7c9cba39a8a077a60eb0e3fa9fc1a175ae5e4b43df91aa3ae371","blockSize":4194304,"blocks":["c03429cde5ac7c9cba39a8a077a60eb0e3fa9fc1a175ae5e4b43df91aa3ae371"]},"offset":"23715486"},"ko.js":{"size":2223,"integrity":{"algorithm":"SHA256","hash":"024f63bc2d036a0a2959dbaa0ff38e67fb12785695be978b3f01a7cfe6e883de","blockSize":4194304,"blocks":["024f63bc2d036a0a2959dbaa0ff38e67fb12785695be978b3f01a7cfe6e883de"]},"offset":"23719738"},"ku.js":{"size":3330,"integrity":{"algorithm":"SHA256","hash":"151754a7034385e460fc776296b4a13cadb357634395b69c3188ba2d5a679271","blockSize":4194304,"blocks":["151754a7034385e460fc776296b4a13cadb357634395b69c3188ba2d5a679271"]},"offset":"23721961"},"ky.js":{"size":2521,"integrity":{"algorithm":"SHA256","hash":"ecec6ddbb82dec2edab9647f221a5942f27490c413e943be85c5da59d55e2d46","blockSize":4194304,"blocks":["ecec6ddbb82dec2edab9647f221a5942f27490c413e943be85c5da59d55e2d46"]},"offset":"23725291"},"lb.js":{"size":4269,"integrity":{"algorithm":"SHA256","hash":"ba8c460128bd3bf50a90ce4c1e50d6bb03647a834141d711dd341ac17c93edf5","blockSize":4194304,"blocks":["ba8c460128bd3bf50a90ce4c1e50d6bb03647a834141d711dd341ac17c93edf5"]},"offset":"23727812"},"lo.js":{"size":2585,"integrity":{"algorithm":"SHA256","hash":"91b0133717eac7637162cc39ebbd063ce17a918384702df93216e379155c1343","blockSize":4194304,"blocks":["91b0133717eac7637162cc39ebbd063ce17a918384702df93216e379155c1343"]},"offset":"23732081"},"lt.js":{"size":4005,"integrity":{"algorithm":"SHA256","hash":"c1c8402e4e2de7d517ab5f3b6fa4d145773fb211a4f43585c0ae755121d18038","blockSize":4194304,"blocks":["c1c8402e4e2de7d517ab5f3b6fa4d145773fb211a4f43585c0ae755121d18038"]},"offset":"23734666"},"lv.js":{"size":3449,"integrity":{"algorithm":"SHA256","hash":"ac9998a307db76ebf48b8413f3e4743955e1e8446169607ce855f7206c0ad885","blockSize":4194304,"blocks":["ac9998a307db76ebf48b8413f3e4743955e1e8446169607ce855f7206c0ad885"]},"offset":"23738671"},"me.js":{"size":3661,"integrity":{"algorithm":"SHA256","hash":"8977a4f9512d9aa28f2d784a1739101025063812f3e50e1a4246e4c733dd2763","blockSize":4194304,"blocks":["8977a4f9512d9aa28f2d784a1739101025063812f3e50e1a4246e4c733dd2763"]},"offset":"23742120"},"mi.js":{"size":2023,"integrity":{"algorithm":"SHA256","hash":"31d67b95ec7f502eed602f1370c431802b0468b5651c443173ca45b472a06bc5","blockSize":4194304,"blocks":["31d67b95ec7f502eed602f1370c431802b0468b5651c443173ca45b472a06bc5"]},"offset":"23745781"},"mk.js":{"size":3021,"integrity":{"algorithm":"SHA256","hash":"6d3cdcc4fd7216a935ed80a155e1d4db500639b309aafe22eecfc9a49f44dc0a","blockSize":4194304,"blocks":["6d3cdcc4fd7216a935ed80a155e1d4db500639b309aafe22eecfc9a49f44dc0a"]},"offset":"23747804"},"ml.js":{"size":3287,"integrity":{"algorithm":"SHA256","hash":"71bff5aac2463a7b9378274771c0abadff30fa2dfbbf0456a8e2de4199605de9","blockSize":4194304,"blocks":["71bff5aac2463a7b9378274771c0abadff30fa2dfbbf0456a8e2de4199605de9"]},"offset":"23750825"},"mn.js":{"size":3414,"integrity":{"algorithm":"SHA256","hash":"34c52784fa1c92ae95c6b2d41db748022c7257994c8c93c9f1913dd3f18c9f38","blockSize":4194304,"blocks":["34c52784fa1c92ae95c6b2d41db748022c7257994c8c93c9f1913dd3f18c9f38"]},"offset":"23754112"},"mr.js":{"size":6574,"integrity":{"algorithm":"SHA256","hash":"3c6cfdfc3046e12700b48a27c0de5e4ae6e825d20c729e6d0152e4ad28b08d81","blockSize":4194304,"blocks":["3c6cfdfc3046e12700b48a27c0de5e4ae6e825d20c729e6d0152e4ad28b08d81"]},"offset":"23757526"},"ms-my.js":{"size":2330,"integrity":{"algorithm":"SHA256","hash":"2158e9feb634e5fd7bc3e0ea2acbff3b4c0762bcff6b09c7c98d2b7534bf1e3d","blockSize":4194304,"blocks":["2158e9feb634e5fd7bc3e0ea2acbff3b4c0762bcff6b09c7c98d2b7534bf1e3d"]},"offset":"23764100"},"ms.js":{"size":2277,"integrity":{"algorithm":"SHA256","hash":"028ed948cf621a57cdffef126ee494b5420165c0481baff79867bd5349576d3e","blockSize":4194304,"blocks":["028ed948cf621a57cdffef126ee494b5420165c0481baff79867bd5349576d3e"]},"offset":"23766430"},"mt.js":{"size":1684,"integrity":{"algorithm":"SHA256","hash":"02136212d059a91d90bafb4a6ce64b3ce52b755cb798bf9a2e15815106be21c4","blockSize":4194304,"blocks":["02136212d059a91d90bafb4a6ce64b3ce52b755cb798bf9a2e15815106be21c4"]},"offset":"23768707"},"my.js":{"size":3094,"integrity":{"algorithm":"SHA256","hash":"82fd3552ff9d7ee31c383dcbc82825f818a7f1d293f380cd4a92d7d6c43d8872","blockSize":4194304,"blocks":["82fd3552ff9d7ee31c383dcbc82825f818a7f1d293f380cd4a92d7d6c43d8872"]},"offset":"23770391"},"nb.js":{"size":1899,"integrity":{"algorithm":"SHA256","hash":"968d9ef135370bab76ad822ecf6b0e57c3c207026687d0f0cf874a72c3e095c9","blockSize":4194304,"blocks":["968d9ef135370bab76ad822ecf6b0e57c3c207026687d0f0cf874a72c3e095c9"]},"offset":"23773485"},"ne.js":{"size":4031,"integrity":{"algorithm":"SHA256","hash":"43b7c2828a3db6a932679ed86be8af8b6951671e56647562a453b0db649b81f1","blockSize":4194304,"blocks":["43b7c2828a3db6a932679ed86be8af8b6951671e56647562a453b0db649b81f1"]},"offset":"23775384"},"nl-be.js":{"size":3169,"integrity":{"algorithm":"SHA256","hash":"116c2375bf4d059d45a9cdf86fa268c9afd17541b6c308189a05707fd5665159","blockSize":4194304,"blocks":["116c2375bf4d059d45a9cdf86fa268c9afd17541b6c308189a05707fd5665159"]},"offset":"23779415"},"nl.js":{"size":3202,"integrity":{"algorithm":"SHA256","hash":"c7486c436b554d746ee6d9a3e36dc68c87fd5690ef7d6772774263487ae3e53f","blockSize":4194304,"blocks":["c7486c436b554d746ee6d9a3e36dc68c87fd5690ef7d6772774263487ae3e53f"]},"offset":"23782584"},"nn.js":{"size":1828,"integrity":{"algorithm":"SHA256","hash":"e7ef9ffbd17dd051ff1e51479bdb9310382f7f2eee345b1e863ee6ea719a8376","blockSize":4194304,"blocks":["e7ef9ffbd17dd051ff1e51479bdb9310382f7f2eee345b1e863ee6ea719a8376"]},"offset":"23785786"},"oc-lnc.js":{"size":2472,"integrity":{"algorithm":"SHA256","hash":"06c264c52dabbf44c881dd47af5a268621d7450debe2f304c221751e27ac3bfd","blockSize":4194304,"blocks":["06c264c52dabbf44c881dd47af5a268621d7450debe2f304c221751e27ac3bfd"]},"offset":"23787614"},"pa-in.js":{"size":4198,"integrity":{"algorithm":"SHA256","hash":"bd66b9185fd0c57357132d3792717aca3fce5a6ede32316ff1c7c07d0799f42e","blockSize":4194304,"blocks":["bd66b9185fd0c57357132d3792717aca3fce5a6ede32316ff1c7c07d0799f42e"]},"offset":"23790086"},"pl.js":{"size":4166,"integrity":{"algorithm":"SHA256","hash":"4be50fa0935b09ca2a419f15e0317353cdaee4ae03fabd8b7c1bedecb1b32d8b","blockSize":4194304,"blocks":["4be50fa0935b09ca2a419f15e0317353cdaee4ae03fabd8b7c1bedecb1b32d8b"]},"offset":"23794284"},"pt-br.js":{"size":1854,"integrity":{"algorithm":"SHA256","hash":"7428b67375cb5c3cc044e747715e1f223b2eb6598b0d5e354b902a93b56a1bad","blockSize":4194304,"blocks":["7428b67375cb5c3cc044e747715e1f223b2eb6598b0d5e354b902a93b56a1bad"]},"offset":"23798450"},"pt.js":{"size":1968,"integrity":{"algorithm":"SHA256","hash":"60737133cad0063bd5c3e31f348ee2014b00b961f91ad85050a0e19cb2636e56","blockSize":4194304,"blocks":["60737133cad0063bd5c3e31f348ee2014b00b961f91ad85050a0e19cb2636e56"]},"offset":"23800304"},"ro.js":{"size":2319,"integrity":{"algorithm":"SHA256","hash":"75152a2d8d10667bbb146af4d65a3e59c6a88ff8386097f80f76e753df507b24","blockSize":4194304,"blocks":["75152a2d8d10667bbb146af4d65a3e59c6a88ff8386097f80f76e753df507b24"]},"offset":"23802272"},"ru.js":{"size":8418,"integrity":{"algorithm":"SHA256","hash":"e88364a57000b9e1190527ab2a120368463491d6d91e0edc9da6233ae6d06120","blockSize":4194304,"blocks":["e88364a57000b9e1190527ab2a120368463491d6d91e0edc9da6233ae6d06120"]},"offset":"23804591"},"sd.js":{"size":2153,"integrity":{"algorithm":"SHA256","hash":"47a6184217fcfdb79be8c8101e24b5de190e707eca660ccebdfc2bd06cb01975","blockSize":4194304,"blocks":["47a6184217fcfdb79be8c8101e24b5de190e707eca660ccebdfc2bd06cb01975"]},"offset":"23813009"},"se.js":{"size":1849,"integrity":{"algorithm":"SHA256","hash":"2d0a0de378acfc7ad80991af8d801a5c2e32b69c18ab93aaf13df464202d15e0","blockSize":4194304,"blocks":["2d0a0de378acfc7ad80991af8d801a5c2e32b69c18ab93aaf13df464202d15e0"]},"offset":"23815162"},"si.js":{"size":2681,"integrity":{"algorithm":"SHA256","hash":"5eefce6d854005294d708f8159ecb2564e90d41d697b38beaf50da20a866c659","blockSize":4194304,"blocks":["5eefce6d854005294d708f8159ecb2564e90d41d697b38beaf50da20a866c659"]},"offset":"23817011"},"sk.js":{"size":5173,"integrity":{"algorithm":"SHA256","hash":"b246e5ee48e9c6cb348de8e7a2eb82c534c9363d842708dc4eb30ecf89ef7adb","blockSize":4194304,"blocks":["b246e5ee48e9c6cb348de8e7a2eb82c534c9363d842708dc4eb30ecf89ef7adb"]},"offset":"23819692"},"sl.js":{"size":6115,"integrity":{"algorithm":"SHA256","hash":"a4f4e53582efcf382b0726e7ec3539a4eb51f3c41547b2618132cf94a4646416","blockSize":4194304,"blocks":["a4f4e53582efcf382b0726e7ec3539a4eb51f3c41547b2618132cf94a4646416"]},"offset":"23824865"},"sq.js":{"size":1987,"integrity":{"algorithm":"SHA256","hash":"9109b6d4d0ecd1c613444811488e2a1607c7d6aa1d3e6acf4a5ad2cbfe88b45f","blockSize":4194304,"blocks":["9109b6d4d0ecd1c613444811488e2a1607c7d6aa1d3e6acf4a5ad2cbfe88b45f"]},"offset":"23830980"},"sr-cyrl.js":{"size":4762,"integrity":{"algorithm":"SHA256","hash":"5b8d89635b896308c502ff8f22746b9c11009ab1b84d5a9db5b23cced270c359","blockSize":4194304,"blocks":["5b8d89635b896308c502ff8f22746b9c11009ab1b84d5a9db5b23cced270c359"]},"offset":"23832967"},"sr.js":{"size":4209,"integrity":{"algorithm":"SHA256","hash":"0dfaa42e2a9d773494bdaa458ead605c7c7a17cc808a87d01e6ac7d517968e45","blockSize":4194304,"blocks":["0dfaa42e2a9d773494bdaa458ead605c7c7a17cc808a87d01e6ac7d517968e45"]},"offset":"23837729"},"ss.js":{"size":2572,"integrity":{"algorithm":"SHA256","hash":"0a3e3fb4b516a0723fbe9fda91e65d7a0fe1a3007fcf2493df1415c1950c47f3","blockSize":4194304,"blocks":["0a3e3fb4b516a0723fbe9fda91e65d7a0fe1a3007fcf2493df1415c1950c47f3"]},"offset":"23841938"},"sv.js":{"size":2066,"integrity":{"algorithm":"SHA256","hash":"85ad85e2b6ada4b40fcafb3c8f69a7485aed5d6761b5321a9018f47a8e6d6d8f","blockSize":4194304,"blocks":["85ad85e2b6ada4b40fcafb3c8f69a7485aed5d6761b5321a9018f47a8e6d6d8f"]},"offset":"23844510"},"sw.js":{"size":1651,"integrity":{"algorithm":"SHA256","hash":"8399be034da0c79fde55f156d7b1231a86d09218a171ac97c868edb213266cec","blockSize":4194304,"blocks":["8399be034da0c79fde55f156d7b1231a86d09218a171ac97c868edb213266cec"]},"offset":"23846576"},"ta.js":{"size":4800,"integrity":{"algorithm":"SHA256","hash":"df2902d214ed4bca610c32301e89da53270adc8e26a00da87a68a244ba90e8f1","blockSize":4194304,"blocks":["df2902d214ed4bca610c32301e89da53270adc8e26a00da87a68a244ba90e8f1"]},"offset":"23848227"},"te.js":{"size":3392,"integrity":{"algorithm":"SHA256","hash":"e0312d7be2d91292d4de688e612a6884135466a8d5b0391a5877f6853dd24a6e","blockSize":4194304,"blocks":["e0312d7be2d91292d4de688e612a6884135466a8d5b0391a5877f6853dd24a6e"]},"offset":"23853027"},"tet.js":{"size":2155,"integrity":{"algorithm":"SHA256","hash":"21dc425bc393e59a99afa482332c508673b86b4be273bd854f275b88c08ec354","blockSize":4194304,"blocks":["21dc425bc393e59a99afa482332c508673b86b4be273bd854f275b88c08ec354"]},"offset":"23856419"},"tg.js":{"size":3604,"integrity":{"algorithm":"SHA256","hash":"1545f21eacf80d77422792854883c46c8550d986995cb0411666f600b6b183ea","blockSize":4194304,"blocks":["1545f21eacf80d77422792854883c46c8550d986995cb0411666f600b6b183ea"]},"offset":"23858574"},"th.js":{"size":2736,"integrity":{"algorithm":"SHA256","hash":"1997bb68570069b5f175cd4edb334969a07b6caf1a57656421d0838d1cb95aef","blockSize":4194304,"blocks":["1997bb68570069b5f175cd4edb334969a07b6caf1a57656421d0838d1cb95aef"]},"offset":"23862178"},"tk.js":{"size":2488,"integrity":{"algorithm":"SHA256","hash":"a3ade222a40733cc6430b0d0c824ff84b8c3101b2af2603feb6381f85d4b0003","blockSize":4194304,"blocks":["a3ade222a40733cc6430b0d0c824ff84b8c3101b2af2603feb6381f85d4b0003"]},"offset":"23864914"},"tl-ph.js":{"size":1735,"integrity":{"algorithm":"SHA256","hash":"c032aae8730b67385af156a603adfefcf4e15233b1ef1930bb76809b1aabbd2c","blockSize":4194304,"blocks":["c032aae8730b67385af156a603adfefcf4e15233b1ef1930bb76809b1aabbd2c"]},"offset":"23867402"},"tlh.js":{"size":3755,"integrity":{"algorithm":"SHA256","hash":"96da45a2d45b23c4c162c40fedc0665009f79fb0de153800857232d03be2799a","blockSize":4194304,"blocks":["96da45a2d45b23c4c162c40fedc0665009f79fb0de153800857232d03be2799a"]},"offset":"23869137"},"tr.js":{"size":2927,"integrity":{"algorithm":"SHA256","hash":"aee3e439c82aaa80e59517188a9e6dedf983d05e71eb9756a1b4168f002224b1","blockSize":4194304,"blocks":["aee3e439c82aaa80e59517188a9e6dedf983d05e71eb9756a1b4168f002224b1"]},"offset":"23872892"},"tzl.js":{"size":3109,"integrity":{"algorithm":"SHA256","hash":"1a8627c869d5f815c09dda91b2588f3df9e692296267f5bc6661fa3998f1c0fa","blockSize":4194304,"blocks":["1a8627c869d5f815c09dda91b2588f3df9e692296267f5bc6661fa3998f1c0fa"]},"offset":"23875819"},"tzm-latn.js":{"size":1691,"integrity":{"algorithm":"SHA256","hash":"1b9a6d4f6538fb55300142f1296f5b4c79aff6d761abb3ed3959033a813f0702","blockSize":4194304,"blocks":["1b9a6d4f6538fb55300142f1296f5b4c79aff6d761abb3ed3959033a813f0702"]},"offset":"23878928"},"tzm.js":{"size":2322,"integrity":{"algorithm":"SHA256","hash":"d139c0b3401b921863148f567eeefc57b2ca3088812adbc58cc9d09ceff43ddf","blockSize":4194304,"blocks":["d139c0b3401b921863148f567eeefc57b2ca3088812adbc58cc9d09ceff43ddf"]},"offset":"23880619"},"ug-cn.js":{"size":3880,"integrity":{"algorithm":"SHA256","hash":"86f5e5d0af1adfcf4575498061738f20d134b16c909bf9efc40be5f966d99ea5","blockSize":4194304,"blocks":["86f5e5d0af1adfcf4575498061738f20d134b16c909bf9efc40be5f966d99ea5"]},"offset":"23882941"},"uk.js":{"size":5955,"integrity":{"algorithm":"SHA256","hash":"e67725466dd6e6eb33feca525403d09c8b3812e8073e62ddc4bb06369bb13a9d","blockSize":4194304,"blocks":["e67725466dd6e6eb33feca525403d09c8b3812e8073e62ddc4bb06369bb13a9d"]},"offset":"23886821"},"ur.js":{"size":2200,"integrity":{"algorithm":"SHA256","hash":"4870e8ee287025d7760731038093cc828f08be91d0b08b0508f931c9a16453ff","blockSize":4194304,"blocks":["4870e8ee287025d7760731038093cc828f08be91d0b08b0508f931c9a16453ff"]},"offset":"23892776"},"uz-latn.js":{"size":1639,"integrity":{"algorithm":"SHA256","hash":"cd289ed8860b697d20b90194c2f5a55ed54e84d40fee15d5d6148c78b1e2ce9e","blockSize":4194304,"blocks":["cd289ed8860b697d20b90194c2f5a55ed54e84d40fee15d5d6148c78b1e2ce9e"]},"offset":"23894976"},"uz.js":{"size":1885,"integrity":{"algorithm":"SHA256","hash":"e9b15bd23e8779fe93fa352a04dc338593206cd7beb4d56d355f8d291835fcd1","blockSize":4194304,"blocks":["e9b15bd23e8779fe93fa352a04dc338593206cd7beb4d56d355f8d291835fcd1"]},"offset":"23896615"},"vi.js":{"size":2430,"integrity":{"algorithm":"SHA256","hash":"e9ec2d01a8171dbd71637bf49f6cb70ec5526e27053114dabf607f1aa13ed9bc","blockSize":4194304,"blocks":["e9ec2d01a8171dbd71637bf49f6cb70ec5526e27053114dabf607f1aa13ed9bc"]},"offset":"23898500"},"x-pseudo.js":{"size":2348,"integrity":{"algorithm":"SHA256","hash":"99f27f45e6de7b3f2d47e146bbefd74c881fb1f9446df29e20cd79dd8f7d3f4e","blockSize":4194304,"blocks":["99f27f45e6de7b3f2d47e146bbefd74c881fb1f9446df29e20cd79dd8f7d3f4e"]},"offset":"23900930"},"yo.js":{"size":1887,"integrity":{"algorithm":"SHA256","hash":"5470a3358714886d14b7897df864a7a0eed2725bffbddf5d3e913ff7b2f79a40","blockSize":4194304,"blocks":["5470a3358714886d14b7897df864a7a0eed2725bffbddf5d3e913ff7b2f79a40"]},"offset":"23903278"},"zh-cn.js":{"size":3711,"integrity":{"algorithm":"SHA256","hash":"9fcdb171506aed19c1776f668330ec4083094f182f17514aa0a63857c93232ad","blockSize":4194304,"blocks":["9fcdb171506aed19c1776f668330ec4083094f182f17514aa0a63857c93232ad"]},"offset":"23905165"},"zh-hk.js":{"size":3116,"integrity":{"algorithm":"SHA256","hash":"3996d5666a44c90f168e60bcf7704a4f3c1ccbce3bb14cdba372c7c4de663672","blockSize":4194304,"blocks":["3996d5666a44c90f168e60bcf7704a4f3c1ccbce3bb14cdba372c7c4de663672"]},"offset":"23908876"},"zh-mo.js":{"size":3066,"integrity":{"algorithm":"SHA256","hash":"ccb21168fff3d307932e776d0394dd518863f0873e7f118c91d8f1f796b40848","blockSize":4194304,"blocks":["ccb21168fff3d307932e776d0394dd518863f0873e7f118c91d8f1f796b40848"]},"offset":"23911992"},"zh-tw.js":{"size":3013,"integrity":{"algorithm":"SHA256","hash":"5d777630817e1b6cbdac934d41924ac44079089ffdfc807d7d53d7b64e1f4ebc","blockSize":4194304,"blocks":["5d777630817e1b6cbdac934d41924ac44079089ffdfc807d7d53d7b64e1f4ebc"]},"offset":"23915058"}}}}}}},"moment-timezone":{"files":{"LICENSE":{"size":1097,"integrity":{"algorithm":"SHA256","hash":"b3a550795f41cdccdb5eb2523505ce54dc4a7a3e0d3a6d457d297591341795e7","blockSize":4194304,"blocks":["b3a550795f41cdccdb5eb2523505ce54dc4a7a3e0d3a6d457d297591341795e7"]},"offset":"23918071"},"composer.json":{"size":862,"integrity":{"algorithm":"SHA256","hash":"af69db7f8a3e8bcb7d81554154704581aa7a7331128523a4ff7428dabd4ced7f","blockSize":4194304,"blocks":["af69db7f8a3e8bcb7d81554154704581aa7a7331128523a4ff7428dabd4ced7f"]},"offset":"23919168"},"index.js":{"size":114,"integrity":{"algorithm":"SHA256","hash":"b93bc1a0ab15d56e12f0e281bf005d39166952d9208b828e8d056563f3ff1fd1","blockSize":4194304,"blocks":["b93bc1a0ab15d56e12f0e281bf005d39166952d9208b828e8d056563f3ff1fd1"]},"offset":"23920030"},"moment-timezone-utils.js":{"size":7787,"integrity":{"algorithm":"SHA256","hash":"94fffcffef95e274aa5a7a88f3f1e48dd3515c67db05e898aaa0bf694f9ab522","blockSize":4194304,"blocks":["94fffcffef95e274aa5a7a88f3f1e48dd3515c67db05e898aaa0bf694f9ab522"]},"offset":"23920144"},"moment-timezone.js":{"size":16340,"integrity":{"algorithm":"SHA256","hash":"183f03352f1e65da2130b89bced0e02d59bdff8a20eb844d98a803462ec99b4c","blockSize":4194304,"blocks":["183f03352f1e65da2130b89bced0e02d59bdff8a20eb844d98a803462ec99b4c"]},"offset":"23927931"},"package.json":{"size":760,"integrity":{"algorithm":"SHA256","hash":"f19cbfa51b2814fd09f3be2b3b0fdf7e04a9304df38e3d0ef40b89c2da15f870","blockSize":4194304,"blocks":["f19cbfa51b2814fd09f3be2b3b0fdf7e04a9304df38e3d0ef40b89c2da15f870"]},"offset":"23944271"},"data":{"files":{"packed":{"files":{"latest.json":{"size":189231,"integrity":{"algorithm":"SHA256","hash":"ccdc6aa04df161122e948b89e0629618094a55fe7e03a70cf88952f823273b2b","blockSize":4194304,"blocks":["ccdc6aa04df161122e948b89e0629618094a55fe7e03a70cf88952f823273b2b"]},"offset":"23945031"}}},"meta":{"files":{"latest.json":{"size":98784,"integrity":{"algorithm":"SHA256","hash":"1574fc70d8fd2554031aed90b1424371d6775bd9c0cab5cbd20e04753984f501","blockSize":4194304,"blocks":["1574fc70d8fd2554031aed90b1424371d6775bd9c0cab5cbd20e04753984f501"]},"offset":"24134262"}}}}},"builds":{"files":{"moment-timezone-with-data-10-year-range.js":{"size":55126,"integrity":{"algorithm":"SHA256","hash":"29460a44a0ecce0023b658980557c8f4f26ce24e131cf9e46361c5003f57a44a","blockSize":4194304,"blocks":["29460a44a0ecce0023b658980557c8f4f26ce24e131cf9e46361c5003f57a44a"]},"offset":"24233046"},"moment-timezone-with-data-10-year-range.min.js":{"size":42484,"integrity":{"algorithm":"SHA256","hash":"7ed17775731ec99f940c02d17c8944d31c3e2f6d2884369af025e47285468720","blockSize":4194304,"blocks":["7ed17775731ec99f940c02d17c8944d31c3e2f6d2884369af025e47285468720"]},"offset":"24288172"},"moment-timezone-with-data-1970-2030.js":{"size":152444,"integrity":{"algorithm":"SHA256","hash":"d604efbb9e4662e79650e5578e0b19a591a8f54a449240eb4eefb86f23bcc6e6","blockSize":4194304,"blocks":["d604efbb9e4662e79650e5578e0b19a591a8f54a449240eb4eefb86f23bcc6e6"]},"offset":"24330656"},"moment-timezone-with-data-1970-2030.min.js":{"size":139802,"integrity":{"algorithm":"SHA256","hash":"57bf5cf5d3d8ea3293d8a435dba1362af75ce94dcb48e76b64a475ed0a951c1c","blockSize":4194304,"blocks":["57bf5cf5d3d8ea3293d8a435dba1362af75ce94dcb48e76b64a475ed0a951c1c"]},"offset":"24483100"},"moment-timezone-with-data-2012-2022.js":{"size":56065,"integrity":{"algorithm":"SHA256","hash":"95e27858174014dd352e31a379aed42a10135ffb05552184c1afd99f9bd09358","blockSize":4194304,"blocks":["95e27858174014dd352e31a379aed42a10135ffb05552184c1afd99f9bd09358"]},"offset":"24622902"},"moment-timezone-with-data-2012-2022.min.js":{"size":43423,"integrity":{"algorithm":"SHA256","hash":"62603b3e8153d7ec381347e358a847291d969727c83b39d784b7039cb9cf5b1d","blockSize":4194304,"blocks":["62603b3e8153d7ec381347e358a847291d969727c83b39d784b7039cb9cf5b1d"]},"offset":"24678967"},"moment-timezone-with-data.js":{"size":206418,"integrity":{"algorithm":"SHA256","hash":"e5dda007341c3bae59c9ad9e7ecee4107a6222d0b2f97890a0c81c9289ad4826","blockSize":4194304,"blocks":["e5dda007341c3bae59c9ad9e7ecee4107a6222d0b2f97890a0c81c9289ad4826"]},"offset":"24722390"},"moment-timezone-with-data.min.js":{"size":193776,"integrity":{"algorithm":"SHA256","hash":"bdfa0f1c489adc3402c91d6344e596fce29641322b1195dd46e89320debc8789","blockSize":4194304,"blocks":["bdfa0f1c489adc3402c91d6344e596fce29641322b1195dd46e89320debc8789"]},"offset":"24928808"},"moment-timezone.min.js":{"size":7088,"integrity":{"algorithm":"SHA256","hash":"6c7d7957d7c391d33555e26b6fb10b1fd8a7090f74514f04089af57fafad08d5","blockSize":4194304,"blocks":["6c7d7957d7c391d33555e26b6fb10b1fd8a7090f74514f04089af57fafad08d5"]},"offset":"25122584"}}},".github":{"files":{"issue_template.md":{"size":154,"integrity":{"algorithm":"SHA256","hash":"779a3fe7250ef446c38c3d7a26ed150868dcb35ad0eedb43517e125cee008c5c","blockSize":4194304,"blocks":["779a3fe7250ef446c38c3d7a26ed150868dcb35ad0eedb43517e125cee008c5c"]},"offset":"25129672"}}}}},"ms":{"files":{"index.js":{"size":3023,"integrity":{"algorithm":"SHA256","hash":"55986972f5f3c9446f876c576e1cd30fd4f04cd26527efbb5ad834637c740e4c","blockSize":4194304,"blocks":["55986972f5f3c9446f876c576e1cd30fd4f04cd26527efbb5ad834637c740e4c"]},"offset":"25129826"},"license.md":{"size":1077,"integrity":{"algorithm":"SHA256","hash":"6652830c2607c722b66f1b57de15877ab8fc5dca406cc5b335afeb365d0f32c1","blockSize":4194304,"blocks":["6652830c2607c722b66f1b57de15877ab8fc5dca406cc5b335afeb365d0f32c1"]},"offset":"25132849"},"package.json":{"size":470,"integrity":{"algorithm":"SHA256","hash":"d5ba1dc0ec7c9f0ea73ab392c1424b067a349df6d77b71322c08ef9062664188","blockSize":4194304,"blocks":["d5ba1dc0ec7c9f0ea73ab392c1424b067a349df6d77b71322c08ef9062664188"]},"offset":"25133926"}}},"msnodesqlv8":{"files":{".env-cmdrc":{"size":2305,"integrity":{"algorithm":"SHA256","hash":"3e05ba56934e1213db221fc5d4c883bab7132ced5ebbd3869b08f66c7a7f83a6","blockSize":4194304,"blocks":["3e05ba56934e1213db221fc5d4c883bab7132ced5ebbd3869b08f66c7a7f83a6"]},"offset":"25134396"},"CONTRIBUTING.md":{"size":5996,"integrity":{"algorithm":"SHA256","hash":"16308d081b4e6393017544c1397825ddaf8a55690779617ec86e15e6d476ccc5","blockSize":4194304,"blocks":["16308d081b4e6393017544c1397825ddaf8a55690779617ec86e15e6d476ccc5"]},"offset":"25136701"},"CONTRIBUTORS":{"size":910,"integrity":{"algorithm":"SHA256","hash":"938dab93b1f8a80ff01939a3985bf7e69ce2efb3e9463c4e908f01520db6a60b","blockSize":4194304,"blocks":["938dab93b1f8a80ff01939a3985bf7e69ce2efb3e9463c4e908f01520db6a60b"]},"offset":"25142697"},"LICENSE":{"size":587,"integrity":{"algorithm":"SHA256","hash":"88733a6d64cd78901dd1937f85279166240bfccb2899210e25977a6122405d16","blockSize":4194304,"blocks":["88733a6d64cd78901dd1937f85279166240bfccb2899210e25977a6122405d16"]},"offset":"25143607"},"package.json":{"size":1447,"integrity":{"algorithm":"SHA256","hash":"de3390f9fa15fd774ac1bb0fa2046b29fd225fecfd6f823389c46ed5956b4519","blockSize":4194304,"blocks":["de3390f9fa15fd774ac1bb0fa2046b29fd225fecfd6f823389c46ed5956b4519"]},"offset":"25144194"},"tsconfig.json":{"size":291,"integrity":{"algorithm":"SHA256","hash":"5733ed681f52b3b8079f567d9a4b9e1d6b4577d2fb711c144849edc2712c0e9c","blockSize":4194304,"blocks":["5733ed681f52b3b8079f567d9a4b9e1d6b4577d2fb711c144849edc2712c0e9c"]},"offset":"25145641"},"src":{"files":{"BeginTranOperation.cpp":{"size":468,"integrity":{"algorithm":"SHA256","hash":"13c9f320629eb357cfcf5c97632427902c4d2ac85c9f2386bb777eea6fa10f4e","blockSize":4194304,"blocks":["13c9f320629eb357cfcf5c97632427902c4d2ac85c9f2386bb777eea6fa10f4e"]},"offset":"25145932"},"BeginTranOperation.h":{"size":1378,"integrity":{"algorithm":"SHA256","hash":"be43e74b78a65b1712a346844aa43a562108c4d00865b38592fc68c36358ad1e","blockSize":4194304,"blocks":["be43e74b78a65b1712a346844aa43a562108c4d00865b38592fc68c36358ad1e"]},"offset":"25146400"},"BigIntColumn.h":{"size":698,"integrity":{"algorithm":"SHA256","hash":"9f92f9f32468831e76f8d144e41e8b29c7a868c198d072098759b9c047f861c0","blockSize":4194304,"blocks":["9f92f9f32468831e76f8d144e41e8b29c7a868c198d072098759b9c047f861c0"]},"offset":"25147778"},"BinaryColumn.cpp":{"size":2373,"integrity":{"algorithm":"SHA256","hash":"3d54d29dc77ef3cc08daafb91b2bf0a2b0c813b49ba60df5b4745e264ba73f24","blockSize":4194304,"blocks":["3d54d29dc77ef3cc08daafb91b2bf0a2b0c813b49ba60df5b4745e264ba73f24"]},"offset":"25148476"},"BinaryColumn.h":{"size":582,"integrity":{"algorithm":"SHA256","hash":"34bcf3ce5f7c449e43f2fbbdf111680cee245ee7edd079b56b1a521094e77f3a","blockSize":4194304,"blocks":["34bcf3ce5f7c449e43f2fbbdf111680cee245ee7edd079b56b1a521094e77f3a"]},"offset":"25150849"},"BoolColumn.h":{"size":601,"integrity":{"algorithm":"SHA256","hash":"8bfc123458eccd13bff2ba24d06de0f7e84eea2cdafb27dcc1c8dfc51b7a6d0c","blockSize":4194304,"blocks":["8bfc123458eccd13bff2ba24d06de0f7e84eea2cdafb27dcc1c8dfc51b7a6d0c"]},"offset":"25151431"},"BoundDatum.cpp":{"size":56488,"integrity":{"algorithm":"SHA256","hash":"736f7d1c8bbff15a284b9d67c369aac90d672ef5e612160fa515570bb6bcc616","blockSize":4194304,"blocks":["736f7d1c8bbff15a284b9d67c369aac90d672ef5e612160fa515570bb6bcc616"]},"offset":"25152032"},"BoundDatum.h":{"size":6319,"integrity":{"algorithm":"SHA256","hash":"566fe7b00ce7b3de94574dcecd137b3ee872d72a4c966f604fd498d8443cad48","blockSize":4194304,"blocks":["566fe7b00ce7b3de94574dcecd137b3ee872d72a4c966f604fd498d8443cad48"]},"offset":"25208520"},"BoundDatumHelper.h":{"size":7870,"integrity":{"algorithm":"SHA256","hash":"04dc5c45355efd821fbe0fddae9a489b1c8fa2ac18853f05ded6ea0b12030564","blockSize":4194304,"blocks":["04dc5c45355efd821fbe0fddae9a489b1c8fa2ac18853f05ded6ea0b12030564"]},"offset":"25214839"},"BoundDatumSet.cpp":{"size":3499,"integrity":{"algorithm":"SHA256","hash":"46646342c9f785ea2ca1095345f148aebe2b1fac86a2c2abdd3cbed699124286","blockSize":4194304,"blocks":["46646342c9f785ea2ca1095345f148aebe2b1fac86a2c2abdd3cbed699124286"]},"offset":"25222709"},"BoundDatumSet.h":{"size":963,"integrity":{"algorithm":"SHA256","hash":"649584fb8631a3abb7d419b36e603eb8fca313ddc9710634adef35a8238f6ede","blockSize":4194304,"blocks":["649584fb8631a3abb7d419b36e603eb8fca313ddc9710634adef35a8238f6ede"]},"offset":"25226208"},"CMakeLists.txt":{"size":1116,"integrity":{"algorithm":"SHA256","hash":"e68e58965c21eccb4519dce3713a204e942d178743ee625850e4a880cc389906","blockSize":4194304,"blocks":["e68e58965c21eccb4519dce3713a204e942d178743ee625850e4a880cc389906"]},"offset":"25227171"},"CancelOperation.cpp":{"size":336,"integrity":{"algorithm":"SHA256","hash":"cf45974531bd73d88c37893471ff172050c4712b2724bce6b6025052d438b5e3","blockSize":4194304,"blocks":["cf45974531bd73d88c37893471ff172050c4712b2724bce6b6025052d438b5e3"]},"offset":"25228287"},"CancelOperation.h":{"size":1483,"integrity":{"algorithm":"SHA256","hash":"95ef97e82b7808e18e3fdbce7815a69e58925a69cfff23ddb0dba723f3ab0125","blockSize":4194304,"blocks":["95ef97e82b7808e18e3fdbce7815a69e58925a69cfff23ddb0dba723f3ab0125"]},"offset":"25228623"},"CloseOperation.cpp":{"size":652,"integrity":{"algorithm":"SHA256","hash":"16b38a96f192e68f082cdceff47afa0de719480f7ebc32b627962f833a2be869","blockSize":4194304,"blocks":["16b38a96f192e68f082cdceff47afa0de719480f7ebc32b627962f833a2be869"]},"offset":"25230106"},"CloseOperation.h":{"size":1370,"integrity":{"algorithm":"SHA256","hash":"67d9dae5476750975db066fa7fdd763c2cad5bec26ac5e28a61b905002f3e350","blockSize":4194304,"blocks":["67d9dae5476750975db066fa7fdd763c2cad5bec26ac5e28a61b905002f3e350"]},"offset":"25230758"},"CollectOperation.cpp":{"size":450,"integrity":{"algorithm":"SHA256","hash":"8e6efe2d6c87f02075ea48428700090a89fadaf6eb1d587fe6038a643908107a","blockSize":4194304,"blocks":["8e6efe2d6c87f02075ea48428700090a89fadaf6eb1d587fe6038a643908107a"]},"offset":"25232128"},"CollectOperation.h":{"size":1382,"integrity":{"algorithm":"SHA256","hash":"1acd5c77855e2cd69601b794b5208a42372ea46d902dee7f4acd366f857b3c99","blockSize":4194304,"blocks":["1acd5c77855e2cd69601b794b5208a42372ea46d902dee7f4acd366f857b3c99"]},"offset":"25232578"},"Column.cpp":{"size":1092,"integrity":{"algorithm":"SHA256","hash":"fb5240f9ac0eff094833970315d1a2bfcdd56945c8e2b0f3b854acf9d43ffbbb","blockSize":4194304,"blocks":["fb5240f9ac0eff094833970315d1a2bfcdd56945c8e2b0f3b854acf9d43ffbbb"]},"offset":"25233960"},"Column.h":{"size":1736,"integrity":{"algorithm":"SHA256","hash":"3e3920a8a76981e4e565bba70450e2a8636f89245b0caf59e3b8418f8d38fab8","blockSize":4194304,"blocks":["3e3920a8a76981e4e565bba70450e2a8636f89245b0caf59e3b8418f8d38fab8"]},"offset":"25235052"},"Connection.cpp":{"size":9911,"integrity":{"algorithm":"SHA256","hash":"3d562d552f71ca9a696a5a1f099523d49e8fc3bfd1df40928ff5da827b574d75","blockSize":4194304,"blocks":["3d562d552f71ca9a696a5a1f099523d49e8fc3bfd1df40928ff5da827b574d75"]},"offset":"25236788"},"Connection.h":{"size":2817,"integrity":{"algorithm":"SHA256","hash":"47e59ddc8303abf14325f51b013677dc3e7da2851b454a1b60c9b81a6749453a","blockSize":4194304,"blocks":["47e59ddc8303abf14325f51b013677dc3e7da2851b454a1b60c9b81a6749453a"]},"offset":"25246699"},"ConnectionHandles.cpp":{"size":2439,"integrity":{"algorithm":"SHA256","hash":"75f0ca4063858099b5f09d6ad5f3b5746cd528d23a60b84c36f933ddd8315c10","blockSize":4194304,"blocks":["75f0ca4063858099b5f09d6ad5f3b5746cd528d23a60b84c36f933ddd8315c10"]},"offset":"25249516"},"ConnectionHandles.h":{"size":1889,"integrity":{"algorithm":"SHA256","hash":"586f4d838f5a6e5abbb9cd1b610807b95c3fe77f6ffd9b1daae78921955bf6a7","blockSize":4194304,"blocks":["586f4d838f5a6e5abbb9cd1b610807b95c3fe77f6ffd9b1daae78921955bf6a7"]},"offset":"25251955"},"CriticalSection.h":{"size":1439,"integrity":{"algorithm":"SHA256","hash":"1785f5d5ae81ca9fa77357859f3a94ff3cc05ed8b2d51d28aaa87df997035c48","blockSize":4194304,"blocks":["1785f5d5ae81ca9fa77357859f3a94ff3cc05ed8b2d51d28aaa87df997035c48"]},"offset":"25253844"},"EndTranOperation.cpp":{"size":599,"integrity":{"algorithm":"SHA256","hash":"6e6672d4882d2b83ea9756ecfdf9e7332ed1e233856c79147aae1ff44b418d5e","blockSize":4194304,"blocks":["6e6672d4882d2b83ea9756ecfdf9e7332ed1e233856c79147aae1ff44b418d5e"]},"offset":"25255283"},"EndTranOperation.h":{"size":1430,"integrity":{"algorithm":"SHA256","hash":"5712c55d3e9de62708a47da49d7345299f4f9bfd314d28de4e4776341b35166e","blockSize":4194304,"blocks":["5712c55d3e9de62708a47da49d7345299f4f9bfd314d28de4e4776341b35166e"]},"offset":"25255882"},"FreeStatementOperation.cpp":{"size":643,"integrity":{"algorithm":"SHA256","hash":"26595c44da015f959e4ea86cee45920006b28094b9a745d90f61f022cc952a21","blockSize":4194304,"blocks":["26595c44da015f959e4ea86cee45920006b28094b9a745d90f61f022cc952a21"]},"offset":"25257312"},"FreeStatementOperation.h":{"size":1455,"integrity":{"algorithm":"SHA256","hash":"6951960688aec96cc57c1942c5b577d96ef55dd5141469ec503aa56466047285","blockSize":4194304,"blocks":["6951960688aec96cc57c1942c5b577d96ef55dd5141469ec503aa56466047285"]},"offset":"25257955"},"IntColumn.h":{"size":649,"integrity":{"algorithm":"SHA256","hash":"9d385b21fe08712088d559c4cfa45a15df44684ac18b41ea160295f64e7c7ddd","blockSize":4194304,"blocks":["9d385b21fe08712088d559c4cfa45a15df44684ac18b41ea160295f64e7c7ddd"]},"offset":"25259410"},"MutateJS.cpp":{"size":2065,"integrity":{"algorithm":"SHA256","hash":"3bc241652acf841e32863c5340ae5cb2ae173544baf9adad26e2786d635466c0","blockSize":4194304,"blocks":["3bc241652acf841e32863c5340ae5cb2ae173544baf9adad26e2786d635466c0"]},"offset":"25260059"},"MutateJS.h":{"size":880,"integrity":{"algorithm":"SHA256","hash":"df00fc4048385f051684bc5602bd85d66e990935af9e06c9162e2675e8009b1d","blockSize":4194304,"blocks":["df00fc4048385f051684bc5602bd85d66e990935af9e06c9162e2675e8009b1d"]},"offset":"25262124"},"NodeColumns.h":{"size":249,"integrity":{"algorithm":"SHA256","hash":"2dd3a5ef90183bcd35f000e3c5a0ae139a71ce04f2a169b24a4b0e1630f43780","blockSize":4194304,"blocks":["2dd3a5ef90183bcd35f000e3c5a0ae139a71ce04f2a169b24a4b0e1630f43780"]},"offset":"25263004"},"NullColumn.h":{"size":442,"integrity":{"algorithm":"SHA256","hash":"5544269e53b530d07326a4e4b0e1c2bbae51a0444ef9b021ffa7a9723c3ba58d","blockSize":4194304,"blocks":["5544269e53b530d07326a4e4b0e1c2bbae51a0444ef9b021ffa7a9723c3ba58d"]},"offset":"25263253"},"NumberColumn.h":{"size":641,"integrity":{"algorithm":"SHA256","hash":"1eb3198135435030e014b733847bcc63eb4ef65dbe83cb84c5ea721e6f2574bd","blockSize":4194304,"blocks":["1eb3198135435030e014b733847bcc63eb4ef65dbe83cb84c5ea721e6f2574bd"]},"offset":"25263695"},"OdbcConnection.cpp":{"size":6950,"integrity":{"algorithm":"SHA256","hash":"c8aad81c700929732049bd1e5b4f3edd0c490abd51408850e5b3bcaec96d138e","blockSize":4194304,"blocks":["c8aad81c700929732049bd1e5b4f3edd0c490abd51408850e5b3bcaec96d138e"]},"offset":"25264336"},"OdbcConnection.h":{"size":2438,"integrity":{"algorithm":"SHA256","hash":"6a5dd7e13715fccb84a1696d60a491df046a4395ddf65946e61cd868adfb4c19","blockSize":4194304,"blocks":["6a5dd7e13715fccb84a1696d60a491df046a4395ddf65946e61cd868adfb4c19"]},"offset":"25271286"},"OdbcConnectionBridge.cpp":{"size":8025,"integrity":{"algorithm":"SHA256","hash":"92cc60825cd14697644d506083c93050d521ca73529c722ec8aa7bd962081175","blockSize":4194304,"blocks":["92cc60825cd14697644d506083c93050d521ca73529c722ec8aa7bd962081175"]},"offset":"25273724"},"OdbcConnectionBridge.h":{"size":2787,"integrity":{"algorithm":"SHA256","hash":"c73a1a566fa6709e5c1667c47ee3e5c76a5d54dd6f9523d384add7b49b2b13f7","blockSize":4194304,"blocks":["c73a1a566fa6709e5c1667c47ee3e5c76a5d54dd6f9523d384add7b49b2b13f7"]},"offset":"25281749"},"OdbcError.cpp":{"size":1313,"integrity":{"algorithm":"SHA256","hash":"464f0fbf472588977106569d7352c557817de085aec0c0a1f1eea4ca1584c43c","blockSize":4194304,"blocks":["464f0fbf472588977106569d7352c557817de085aec0c0a1f1eea4ca1584c43c"]},"offset":"25284536"},"OdbcError.h":{"size":2498,"integrity":{"algorithm":"SHA256","hash":"dbcf3c83abb49d13c8ccd477eba63159adf7e4da4e9ec6d9c6e8ca50242ad6c9","blockSize":4194304,"blocks":["dbcf3c83abb49d13c8ccd477eba63159adf7e4da4e9ec6d9c6e8ca50242ad6c9"]},"offset":"25285849"},"OdbcHandle.cpp":{"size":4332,"integrity":{"algorithm":"SHA256","hash":"da8ae80df579cd95f93ed4d70d9b591ab49fade222b6a7f702973c6442dc039b","blockSize":4194304,"blocks":["da8ae80df579cd95f93ed4d70d9b591ab49fade222b6a7f702973c6442dc039b"]},"offset":"25288347"},"OdbcHandle.h":{"size":2118,"integrity":{"algorithm":"SHA256","hash":"3c64215ba48187a65c128eac415e36c2e0fbc9de1d7f60463c6e72f70c2f514b","blockSize":4194304,"blocks":["3c64215ba48187a65c128eac415e36c2e0fbc9de1d7f60463c6e72f70c2f514b"]},"offset":"25292679"},"OdbcHelper.h":{"size":2142,"integrity":{"algorithm":"SHA256","hash":"c0d1310423650db330de26137eb95da01d06f1605be64cb997fcd3db9578f113","blockSize":4194304,"blocks":["c0d1310423650db330de26137eb95da01d06f1605be64cb997fcd3db9578f113"]},"offset":"25294797"},"OdbcOperation.cpp":{"size":5399,"integrity":{"algorithm":"SHA256","hash":"cb8e6046b45af79c148fad1b54779bfc86a86671069f9a28398aa1fe4cd65ea2","blockSize":4194304,"blocks":["cb8e6046b45af79c148fad1b54779bfc86a86671069f9a28398aa1fe4cd65ea2"]},"offset":"25296939"},"OdbcOperation.h":{"size":2124,"integrity":{"algorithm":"SHA256","hash":"d12f2f5f60b19d5f145b0a6ef18c3702c8fe05cf53f5235b94d2521e154742ac","blockSize":4194304,"blocks":["d12f2f5f60b19d5f145b0a6ef18c3702c8fe05cf53f5235b94d2521e154742ac"]},"offset":"25302338"},"OdbcOperationQueue.h":{"size":1477,"integrity":{"algorithm":"SHA256","hash":"bdcf94b4d8017fc6b5e94941f5566d949f9c398c39c4622710eb1418ce24d334","blockSize":4194304,"blocks":["bdcf94b4d8017fc6b5e94941f5566d949f9c398c39c4622710eb1418ce24d334"]},"offset":"25304462"},"OdbcPreparedStatement.h":{"size":1341,"integrity":{"algorithm":"SHA256","hash":"374ee926169c227182dce2eb1e710cb0e68d265a9d94e0073d2d25c199bd05c8","blockSize":4194304,"blocks":["374ee926169c227182dce2eb1e710cb0e68d265a9d94e0073d2d25c199bd05c8"]},"offset":"25305939"},"OdbcStatement.cpp":{"size":50006,"integrity":{"algorithm":"SHA256","hash":"309a661aef7a0164ddc61ae2331bd4c58d7171504cf3b2da166b8874bca38575","blockSize":4194304,"blocks":["309a661aef7a0164ddc61ae2331bd4c58d7171504cf3b2da166b8874bca38575"]},"offset":"25307280"},"OdbcStatement.h":{"size":6816,"integrity":{"algorithm":"SHA256","hash":"440bdc38486a7b16ab21a3c10904cda7fa13bbbec9ff0d73c8936e12738dafca","blockSize":4194304,"blocks":["440bdc38486a7b16ab21a3c10904cda7fa13bbbec9ff0d73c8936e12738dafca"]},"offset":"25357286"},"OdbcStatementCache.cpp":{"size":3050,"integrity":{"algorithm":"SHA256","hash":"2d5b254fc645a1555fcebe37b2c5c9da43ac01c571b06514866e9e623926000c","blockSize":4194304,"blocks":["2d5b254fc645a1555fcebe37b2c5c9da43ac01c571b06514866e9e623926000c"]},"offset":"25364102"},"OdbcStatementCache.h":{"size":1780,"integrity":{"algorithm":"SHA256","hash":"11acabb568e0177316a18d1a2db4bc0369a701ba5bfa6ed1d3c2471c34a0d042","blockSize":4194304,"blocks":["11acabb568e0177316a18d1a2db4bc0369a701ba5bfa6ed1d3c2471c34a0d042"]},"offset":"25367152"},"OpenOperation.cpp":{"size":820,"integrity":{"algorithm":"SHA256","hash":"df83212384abcf87b2c7deb58b4cb69dfa6b607db0af1ed484f752bc6cf8a3fa","blockSize":4194304,"blocks":["df83212384abcf87b2c7deb58b4cb69dfa6b607db0af1ed484f752bc6cf8a3fa"]},"offset":"25368932"},"OpenOperation.h":{"size":1608,"integrity":{"algorithm":"SHA256","hash":"f6c7474976426cafbafb7eeb4b441953296f50a69703998c4d3f76424b5b15f1","blockSize":4194304,"blocks":["f6c7474976426cafbafb7eeb4b441953296f50a69703998c4d3f76424b5b15f1"]},"offset":"25369752"},"Operation.cpp":{"size":127,"integrity":{"algorithm":"SHA256","hash":"8445e9645514a6ee89bf5a22db357561fd3c4a88e34f2af04a8842c040b33ad7","blockSize":4194304,"blocks":["8445e9645514a6ee89bf5a22db357561fd3c4a88e34f2af04a8842c040b33ad7"]},"offset":"25371360"},"Operation.h":{"size":1424,"integrity":{"algorithm":"SHA256","hash":"6e7ac255ce34507365053f9b6c16ef92153490ef0b5e0851b1b13596fa4c7179","blockSize":4194304,"blocks":["6e7ac255ce34507365053f9b6c16ef92153490ef0b5e0851b1b13596fa4c7179"]},"offset":"25371487"},"OperationManager.cpp":{"size":1346,"integrity":{"algorithm":"SHA256","hash":"ef3dc7496911fc58f71683f2932c5116f38533b9145839b81c3ff05327193ac0","blockSize":4194304,"blocks":["ef3dc7496911fc58f71683f2932c5116f38533b9145839b81c3ff05327193ac0"]},"offset":"25372911"},"OperationManager.h":{"size":1765,"integrity":{"algorithm":"SHA256","hash":"c735c66db87cfd9c63cd133c626d03dc6d64d995bb26744016694315f9488588","blockSize":4194304,"blocks":["c735c66db87cfd9c63cd133c626d03dc6d64d995bb26744016694315f9488588"]},"offset":"25374257"},"PollingModeOperation.cpp":{"size":333,"integrity":{"algorithm":"SHA256","hash":"5563b2247c250e99bc005866e37c729598959066af25585bbfdf430d3e9e1861","blockSize":4194304,"blocks":["5563b2247c250e99bc005866e37c729598959066af25585bbfdf430d3e9e1861"]},"offset":"25376022"},"PollingModeOperation.h":{"size":1542,"integrity":{"algorithm":"SHA256","hash":"8d6407a8540070b65d88764fa7e2aee0cd1f59f0c09fcba29fe2e49c9cd7d559","blockSize":4194304,"blocks":["8d6407a8540070b65d88764fa7e2aee0cd1f59f0c09fcba29fe2e49c9cd7d559"]},"offset":"25376355"},"PrepareOperation.cpp":{"size":676,"integrity":{"algorithm":"SHA256","hash":"eda4b4084b677be468ce43af54d6af497fa15c19b3809365561bd7f4cd37884f","blockSize":4194304,"blocks":["eda4b4084b677be468ce43af54d6af497fa15c19b3809365561bd7f4cd37884f"]},"offset":"25377897"},"PrepareOperation.h":{"size":1374,"integrity":{"algorithm":"SHA256","hash":"f9f3a1e798a9606e299ce0df43ab8b36427abb209dbc40889187a3601eac3211","blockSize":4194304,"blocks":["f9f3a1e798a9606e299ce0df43ab8b36427abb209dbc40889187a3601eac3211"]},"offset":"25378573"},"ProcedureOperation.cpp":{"size":879,"integrity":{"algorithm":"SHA256","hash":"01b7da7e7b5d5646e222e5d4db23cba03cd8abf50df7ddd3b8f54dcbdc1d5f5f","blockSize":4194304,"blocks":["01b7da7e7b5d5646e222e5d4db23cba03cd8abf50df7ddd3b8f54dcbdc1d5f5f"]},"offset":"25379947"},"ProcedureOperation.h":{"size":1426,"integrity":{"algorithm":"SHA256","hash":"c75690fda999aff26afd3936862e085a8e7295b4f9e1ff12e40997fdfbd8c7d1","blockSize":4194304,"blocks":["c75690fda999aff26afd3936862e085a8e7295b4f9e1ff12e40997fdfbd8c7d1"]},"offset":"25380826"},"QueryOperation.cpp":{"size":2162,"integrity":{"algorithm":"SHA256","hash":"973c541904123a3368599418b6f189f8e2c933a520863fa6bfcf0528b133b8f7","blockSize":4194304,"blocks":["973c541904123a3368599418b6f189f8e2c933a520863fa6bfcf0528b133b8f7"]},"offset":"25382252"},"QueryOperation.h":{"size":1900,"integrity":{"algorithm":"SHA256","hash":"2812377ab94875acaf6b2d61889606d68f4d883200f41888275afe597a46b756","blockSize":4194304,"blocks":["2812377ab94875acaf6b2d61889606d68f4d883200f41888275afe597a46b756"]},"offset":"25384414"},"QueryOperationParams.cpp":{"size":1050,"integrity":{"algorithm":"SHA256","hash":"df3da3a98fe4578dbab79608e8d9660a5822ca182b7f3f8138a15153816f65da","blockSize":4194304,"blocks":["df3da3a98fe4578dbab79608e8d9660a5822ca182b7f3f8138a15153816f65da"]},"offset":"25386314"},"QueryOperationParams.h":{"size":825,"integrity":{"algorithm":"SHA256","hash":"3ef128585d08e9a15c339d4a1937c5414d1f794fa005e321b5458f79a7321f07","blockSize":4194304,"blocks":["3ef128585d08e9a15c339d4a1937c5414d1f794fa005e321b5458f79a7321f07"]},"offset":"25387364"},"QueryPreparedOperation.cpp":{"size":1768,"integrity":{"algorithm":"SHA256","hash":"f69fa382f4ad96077c1d22922cf9c329df64a2a8668dab9beaf05ecc586bbceb","blockSize":4194304,"blocks":["f69fa382f4ad96077c1d22922cf9c329df64a2a8668dab9beaf05ecc586bbceb"]},"offset":"25388189"},"QueryPreparedOperation.h":{"size":1816,"integrity":{"algorithm":"SHA256","hash":"9551bde7516a1945883200245056fd68e2060c5866cd2711debf14b4941412ea","blockSize":4194304,"blocks":["9551bde7516a1945883200245056fd68e2060c5866cd2711debf14b4941412ea"]},"offset":"25389957"},"ReadColumnOperation.cpp":{"size":365,"integrity":{"algorithm":"SHA256","hash":"a17826cc4af78fc7ea706ceaf1ae37ebd83ad47a7213634a8ace11bd5f82768b","blockSize":4194304,"blocks":["a17826cc4af78fc7ea706ceaf1ae37ebd83ad47a7213634a8ace11bd5f82768b"]},"offset":"25391773"},"ReadColumnOperation.h":{"size":1539,"integrity":{"algorithm":"SHA256","hash":"1f7d1ceff8d5a4eedce561a44d9b03a9d16212933869457c09fcfaa62ecca0c3","blockSize":4194304,"blocks":["1f7d1ceff8d5a4eedce561a44d9b03a9d16212933869457c09fcfaa62ecca0c3"]},"offset":"25392138"},"ReadNextResultOperation.cpp":{"size":920,"integrity":{"algorithm":"SHA256","hash":"664c48251202d105a013844adf0d6a956a5c5e2512719350b228b586519e367f","blockSize":4194304,"blocks":["664c48251202d105a013844adf0d6a956a5c5e2512719350b228b586519e367f"]},"offset":"25393677"},"ReadNextResultOperation.h":{"size":1556,"integrity":{"algorithm":"SHA256","hash":"6835cff5fd9ea37914b6ae29c5c15692df501d5083b9a4237eff52cd269ea0aa","blockSize":4194304,"blocks":["6835cff5fd9ea37914b6ae29c5c15692df501d5083b9a4237eff52cd269ea0aa"]},"offset":"25394597"},"ResultSet.cpp":{"size":3939,"integrity":{"algorithm":"SHA256","hash":"f06e6c3fd4e569724c8523f685104d79cbdc7a4258115e4c0e5708ee1b442034","blockSize":4194304,"blocks":["f06e6c3fd4e569724c8523f685104d79cbdc7a4258115e4c0e5708ee1b442034"]},"offset":"25396153"},"ResultSet.h":{"size":2644,"integrity":{"algorithm":"SHA256","hash":"8a201ecdc973a121b576277a0fb850fbfacbd27d6e3491b21d5f7ac0796db596","blockSize":4194304,"blocks":["8a201ecdc973a121b576277a0fb850fbfacbd27d6e3491b21d5f7ac0796db596"]},"offset":"25400092"},"StringColumn.h":{"size":1237,"integrity":{"algorithm":"SHA256","hash":"6dd286602314f84a16dde7e2d3e1672d41bb6b5ae4d7db6cd994093e825c2f66","blockSize":4194304,"blocks":["6dd286602314f84a16dde7e2d3e1672d41bb6b5ae4d7db6cd994093e825c2f66"]},"offset":"25402736"},"TimestampColumn.cpp":{"size":6124,"integrity":{"algorithm":"SHA256","hash":"e4d79ecad3a5bdba04c8f9b16c01b54c9b929b1a8018ad497796acb2caed8ce8","blockSize":4194304,"blocks":["e4d79ecad3a5bdba04c8f9b16c01b54c9b929b1a8018ad497796acb2caed8ce8"]},"offset":"25403973"},"TimestampColumn.h":{"size":3464,"integrity":{"algorithm":"SHA256","hash":"ea6b8edcac527ed893a050726f929fb9f0eb26b8a11ed61827362c5de4f0a23b","blockSize":4194304,"blocks":["ea6b8edcac527ed893a050726f929fb9f0eb26b8a11ed61827362c5de4f0a23b"]},"offset":"25410097"},"UnbindOperation.cpp":{"size":365,"integrity":{"algorithm":"SHA256","hash":"aa5ac503b770c1f0916ac0d89a28356d7260d8bac18e2e0e3f6d7b9512466d01","blockSize":4194304,"blocks":["aa5ac503b770c1f0916ac0d89a28356d7260d8bac18e2e0e3f6d7b9512466d01"]},"offset":"25413561"},"UnbindOperation.h":{"size":1460,"integrity":{"algorithm":"SHA256","hash":"b4fb122728847cb76159407c476cba05fadc8eec9b0173719e2207ae7c789efa","blockSize":4194304,"blocks":["b4fb122728847cb76159407c476cba05fadc8eec9b0173719e2207ae7c789efa"]},"offset":"25413926"},"Utility.cpp":{"size":8668,"integrity":{"algorithm":"SHA256","hash":"7d9d399c613825dfda5745007b1f4a7a8415fb29db3f0e93d32407de3ddc2fe7","blockSize":4194304,"blocks":["7d9d399c613825dfda5745007b1f4a7a8415fb29db3f0e93d32407de3ddc2fe7"]},"offset":"25415386"},"Utility.h":{"size":2656,"integrity":{"algorithm":"SHA256","hash":"7d038e73c0c824b083063e1776ae62f4bb910ac160632bc78c65bda46aee55b0","blockSize":4194304,"blocks":["7d038e73c0c824b083063e1776ae62f4bb910ac160632bc78c65bda46aee55b0"]},"offset":"25424054"},"addon.cpp":{"size":178,"integrity":{"algorithm":"SHA256","hash":"315bc6109627a49f09f52aefe9a0b32fba6a28d5100c995756a79636b1ea16a9","blockSize":4194304,"blocks":["315bc6109627a49f09f52aefe9a0b32fba6a28d5100c995756a79636b1ea16a9"]},"offset":"25426710"},"addon.h":{"size":0,"integrity":{"algorithm":"SHA256","hash":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","blockSize":4194304,"blocks":[]},"offset":"25426888"},"bcp.cpp":{"size":11661,"integrity":{"algorithm":"SHA256","hash":"4a6dac3319f25e898724248045b3d976a707b1114098e4ec405b8191b40e2ea9","blockSize":4194304,"blocks":["4a6dac3319f25e898724248045b3d976a707b1114098e4ec405b8191b40e2ea9"]},"offset":"25426888"},"bcp.h":{"size":3469,"integrity":{"algorithm":"SHA256","hash":"d194b9383afd51a8cee8ef06db03d67ec69c6e5ee63e333c8e69263bf626581b","blockSize":4194304,"blocks":["d194b9383afd51a8cee8ef06db03d67ec69c6e5ee63e333c8e69263bf626581b"]},"offset":"25438549"},"sqlncli-linux.h":{"size":131,"integrity":{"algorithm":"SHA256","hash":"1901486e2b02592fc2d73f414c27dd1d698b38f7fad9bfa743b31c14d1cfd788","blockSize":4194304,"blocks":["1901486e2b02592fc2d73f414c27dd1d698b38f7fad9bfa743b31c14d1cfd788"]},"offset":"25442018"},"sqlncli.h":{"size":175473,"integrity":{"algorithm":"SHA256","hash":"c456a690db999e90100b20ba464ba06670310fc16959553cd6991ff411387b67","blockSize":4194304,"blocks":["c456a690db999e90100b20ba464ba06670310fc16959553cd6991ff411387b67"]},"offset":"25442149"},"stdafx.cpp":{"size":968,"integrity":{"algorithm":"SHA256","hash":"5bb610f8eb613cab9b4304aae3eb1779469438f54d8632a154ee036d1a920fbd","blockSize":4194304,"blocks":["5bb610f8eb613cab9b4304aae3eb1779469438f54d8632a154ee036d1a920fbd"]},"offset":"25617622"},"stdafx.h":{"size":2495,"integrity":{"algorithm":"SHA256","hash":"b16758c10173812815ba901eac1f411a4759ffb474f76687d21b58d917990de2","blockSize":4194304,"blocks":["b16758c10173812815ba901eac1f411a4759ffb474f76687d21b58d917990de2"]},"offset":"25618590"}}},"lib":{"files":{"MsNodeSqWrapperModule.ts":{"size":19547,"integrity":{"algorithm":"SHA256","hash":"72a163f1c91695d3da8dbc5b50edf5c9c2964f386b5bbe6fb87f29bd39019996","blockSize":4194304,"blocks":["72a163f1c91695d3da8dbc5b50edf5c9c2964f386b5bbe6fb87f29bd39019996"]},"offset":"25621085"},"connection.js":{"size":19755,"integrity":{"algorithm":"SHA256","hash":"975a2bfb3458d8a2860139f2e7dd9ba1160a9c854e6eafd4cc3553ea28e0edaf","blockSize":4194304,"blocks":["975a2bfb3458d8a2860139f2e7dd9ba1160a9c854e6eafd4cc3553ea28e0edaf"]},"offset":"25640632"},"dialect.js":{"size":221,"integrity":{"algorithm":"SHA256","hash":"71c1bac2bd2cbfc892e33b171c98cb6cf66b81a5b83de210d03b449ad7fc093a","blockSize":4194304,"blocks":["71c1bac2bd2cbfc892e33b171c98cb6cf66b81a5b83de210d03b449ad7fc093a"]},"offset":"25660387"},"driver.js":{"size":11172,"integrity":{"algorithm":"SHA256","hash":"8e8476cce421a9ecb7f8fa159951aa96dc93c360b424a7cf3169c59f6e19f6a8","blockSize":4194304,"blocks":["8e8476cce421a9ecb7f8fa159951aa96dc93c360b424a7cf3169c59f6e19f6a8"]},"offset":"25660608"},"meta.js":{"size":2909,"integrity":{"algorithm":"SHA256","hash":"c4f1504a29245ff346774395804a0676b378f89f627ab04baafe674b8a9a001b","blockSize":4194304,"blocks":["c4f1504a29245ff346774395804a0676b378f89f627ab04baafe674b8a9a001b"]},"offset":"25671780"},"notifier.js":{"size":4677,"integrity":{"algorithm":"SHA256","hash":"bd881ea817f2844eabcff21043d39fe9d70dab200d27a20880479454353db0ef","blockSize":4194304,"blocks":["bd881ea817f2844eabcff21043d39fe9d70dab200d27a20880479454353db0ef"]},"offset":"25674689"},"pool.js":{"size":22576,"integrity":{"algorithm":"SHA256","hash":"efde9a8486859088700786a94c50b166bc6bf2c83ecd2266feaf22476716cf08","blockSize":4194304,"blocks":["efde9a8486859088700786a94c50b166bc6bf2c83ecd2266feaf22476716cf08"]},"offset":"25679366"},"procedure.js":{"size":19082,"integrity":{"algorithm":"SHA256","hash":"d2983663e550765134bbd977376cc41ee93def666fcb38589cb19adff838b40f","blockSize":4194304,"blocks":["d2983663e550765134bbd977376cc41ee93def666fcb38589cb19adff838b40f"]},"offset":"25701942"},"queue.js":{"size":2509,"integrity":{"algorithm":"SHA256","hash":"b6eea21298eb67d9b52d6f647b1042c7e4477decc00f024361161f6a4dedd7e3","blockSize":4194304,"blocks":["b6eea21298eb67d9b52d6f647b1042c7e4477decc00f024361161f6a4dedd7e3"]},"offset":"25721024"},"reader.js":{"size":10919,"integrity":{"algorithm":"SHA256","hash":"17258d8ac9540a2a5d9d47191b2224a0325f97b3ee7a777ec116a69d334e210d","blockSize":4194304,"blocks":["17258d8ac9540a2a5d9d47191b2224a0325f97b3ee7a777ec116a69d334e210d"]},"offset":"25723533"},"sql.js":{"size":2660,"integrity":{"algorithm":"SHA256","hash":"03cdf721a6e88525763ab3f2a88f0c69fea2a6730c11000d3a4d8816c589baed","blockSize":4194304,"blocks":["03cdf721a6e88525763ab3f2a88f0c69fea2a6730c11000d3a4d8816c589baed"]},"offset":"25734452"},"table.js":{"size":35844,"integrity":{"algorithm":"SHA256","hash":"4ef3cf901cb226498f8b29827f0729a4532ae606bd2a0ba1239ad3d093703956","blockSize":4194304,"blocks":["4ef3cf901cb226498f8b29827f0729a4532ae606bd2a0ba1239ad3d093703956"]},"offset":"25737112"},"user.js":{"size":11484,"integrity":{"algorithm":"SHA256","hash":"68b3eaf5e17c792f6b4acee98545dc791cc221653ea033df8b0b34140d0ed872","blockSize":4194304,"blocks":["68b3eaf5e17c792f6b4acee98545dc791cc221653ea033df8b0b34140d0ed872"]},"offset":"25772956"},"util.js":{"size":7721,"integrity":{"algorithm":"SHA256","hash":"928a99d26a312c15a49e1cdddb60267c26c6d4e573f5dba1a3e71a2f2ccf6975","blockSize":4194304,"blocks":["928a99d26a312c15a49e1cdddb60267c26c6d4e573f5dba1a3e71a2f2ccf6975"]},"offset":"25784440"},"sequelize":{"files":{"connection.js":{"size":5695,"integrity":{"algorithm":"SHA256","hash":"a42c7df91967c77e2d5af20a7467d09ed4c24eae70f5dd1b7c40853c228ce44a","blockSize":4194304,"blocks":["a42c7df91967c77e2d5af20a7467d09ed4c24eae70f5dd1b7c40853c228ce44a"]},"offset":"25792161"},"index.js":{"size":356,"integrity":{"algorithm":"SHA256","hash":"0dc8e9425457f621c143e7b7c82312b5b5b471a13b075eb0698554aa81c000d0","blockSize":4194304,"blocks":["0dc8e9425457f621c143e7b7c82312b5b5b471a13b075eb0698554aa81c000d0"]},"offset":"25797856"},"request.js":{"size":2347,"integrity":{"algorithm":"SHA256","hash":"4b9b527134494a62b026de88465055f240ee8fb9f0a00bee7bab8444f2c60c36","blockSize":4194304,"blocks":["4b9b527134494a62b026de88465055f240ee8fb9f0a00bee7bab8444f2c60c36"]},"offset":"25798212"}}},"queries":{"files":{"proc_describe.sql":{"size":1102,"integrity":{"algorithm":"SHA256","hash":"c3d3509c6cf530268a49dfa6a3de69d0ae36bab5261a1b61c4d4d8dae011d48e","blockSize":4194304,"blocks":["c3d3509c6cf530268a49dfa6a3de69d0ae36bab5261a1b61c4d4d8dae011d48e"]},"offset":"25800559"},"server_version.sql":{"size":934,"integrity":{"algorithm":"SHA256","hash":"ce0750e00a65650449f9d9ace9b2d34c584bb67d66836dd115ded60ef6cd1c77","blockSize":4194304,"blocks":["ce0750e00a65650449f9d9ace9b2d34c584bb67d66836dd115ded60ef6cd1c77"]},"offset":"25801661"},"table_describe.2014.sql":{"size":2361,"integrity":{"algorithm":"SHA256","hash":"bcb0da7c80d97871dad8b6706814efac60bce130b2e69b7f593b8a353dc86472","blockSize":4194304,"blocks":["bcb0da7c80d97871dad8b6706814efac60bce130b2e69b7f593b8a353dc86472"]},"offset":"25802595"},"table_describe.sql":{"size":2373,"integrity":{"algorithm":"SHA256","hash":"ad28f250eb3cf0f94cd91aff74fc8b09e3bba94890a1abc45ffda0918551a121","blockSize":4194304,"blocks":["ad28f250eb3cf0f94cd91aff74fc8b09e3bba94890a1abc45ffda0918551a121"]},"offset":"25804956"},"user_type.sql":{"size":1552,"integrity":{"algorithm":"SHA256","hash":"a112825e4bd0223ef8cdbe3e6d8d6cdaab69228b68d88def50083986d5ce518b","blockSize":4194304,"blocks":["a112825e4bd0223ef8cdbe3e6d8d6cdaab69228b68d88def50083986d5ce518b"]},"offset":"25807329"}}},"data-struture":{"files":{"utils":{"files":{"comparator":{"files":{"Comparator.js":{"size":1829,"integrity":{"algorithm":"SHA256","hash":"8a2b4665f024308caf1748e77b0c4543b224163b2b2045f29872bfe6c3872f90","blockSize":4194304,"blocks":["8a2b4665f024308caf1748e77b0c4543b224163b2b2045f29872bfe6c3872f90"]},"offset":"25808881"}}}}},"priority-queue":{"files":{"PriorityQueue.js":{"size":2645,"integrity":{"algorithm":"SHA256","hash":"9ef09216102bc91cb0c6815cce138c76340c29600bd6e10327723f1e135f19ad","blockSize":4194304,"blocks":["9ef09216102bc91cb0c6815cce138c76340c29600bd6e10327723f1e135f19ad"]},"offset":"25810710"}}},"heap":{"files":{"Heap.js":{"size":7399,"integrity":{"algorithm":"SHA256","hash":"d0422840f85df1ac53117bd4bca105f007243f4512dd5508a8137768e1110c4f","blockSize":4194304,"blocks":["d0422840f85df1ac53117bd4bca105f007243f4512dd5508a8137768e1110c4f"]},"offset":"25813355"},"MaxHeap.js":{"size":536,"integrity":{"algorithm":"SHA256","hash":"9cbcf72cd05d395c61c9ec805811f8f1781318f97c2ceacc8fdd318b0ec9d28d","blockSize":4194304,"blocks":["9cbcf72cd05d395c61c9ec805811f8f1781318f97c2ceacc8fdd318b0ec9d28d"]},"offset":"25820754"},"MinHeap.js":{"size":533,"integrity":{"algorithm":"SHA256","hash":"278c164cd2f46bb086face56f2d3d8e78f13ebae999af9bbdbfaf7b779676a0e","blockSize":4194304,"blocks":["278c164cd2f46bb086face56f2d3d8e78f13ebae999af9bbdbfaf7b779676a0e"]},"offset":"25821290"}}}}}}},"build":{"files":{"Release":{"files":{"sqlserverv8.node":{"size":1041408,"integrity":{"algorithm":"SHA256","hash":"b627a1f2510189005b3e9239c025cd73e0093a202b722ac33cf57308c4eb00e0","blockSize":4194304,"blocks":["b627a1f2510189005b3e9239c025cd73e0093a202b722ac33cf57308c4eb00e0"]},"offset":"25821823"}}}}}}},"mssql":{"files":{"CHANGELOG.txt":{"size":28323,"integrity":{"algorithm":"SHA256","hash":"9071b944cca77faee5f69ba82789608c2c0a123e28eec0458c27c6a99fde4a68","blockSize":4194304,"blocks":["9071b944cca77faee5f69ba82789608c2c0a123e28eec0458c27c6a99fde4a68"]},"offset":"26863231"},"LICENSE.md":{"size":1092,"integrity":{"algorithm":"SHA256","hash":"46e0053aa51277c12157af3afc89c357d707810ed2a64149122171188a5893c0","blockSize":4194304,"blocks":["46e0053aa51277c12157af3afc89c357d707810ed2a64149122171188a5893c0"]},"offset":"26891554"},"index.js":{"size":42,"integrity":{"algorithm":"SHA256","hash":"31a06c9b8f566346752e6445b570dbc2c143579bec3628ecf7e8d86036483869","blockSize":4194304,"blocks":["31a06c9b8f566346752e6445b570dbc2c143579bec3628ecf7e8d86036483869"]},"offset":"26892646"},"msnodesqlv8.js":{"size":46,"integrity":{"algorithm":"SHA256","hash":"feaeeb51257957b0466a909520bf836667cadd52fc01cf96187890dae224f889","blockSize":4194304,"blocks":["feaeeb51257957b0466a909520bf836667cadd52fc01cf96187890dae224f889"]},"offset":"26892688"},"package.json":{"size":707,"integrity":{"algorithm":"SHA256","hash":"25959b7e0844c7ade8324bf491c6340c381a399aa2573f49ec9e1e4132b5d4fe","blockSize":4194304,"blocks":["25959b7e0844c7ade8324bf491c6340c381a399aa2573f49ec9e1e4132b5d4fe"]},"offset":"26892734"},"tedious.js":{"size":42,"integrity":{"algorithm":"SHA256","hash":"31a06c9b8f566346752e6445b570dbc2c143579bec3628ecf7e8d86036483869","blockSize":4194304,"blocks":["31a06c9b8f566346752e6445b570dbc2c143579bec3628ecf7e8d86036483869"]},"offset":"26893441"},"lib":{"files":{"datatypes.js":{"size":4718,"integrity":{"algorithm":"SHA256","hash":"0980aca7e2f827c1cc053a1e7193fa5ccf62add7915164ebace5798bf5f92ce6","blockSize":4194304,"blocks":["0980aca7e2f827c1cc053a1e7193fa5ccf62add7915164ebace5798bf5f92ce6"]},"offset":"26893483"},"global-connection.js":{"size":5466,"integrity":{"algorithm":"SHA256","hash":"e8e15ba3091a6dbaa4dba06a2dd03bd1afca8aff647af47e7f6cab9cb76477bb","blockSize":4194304,"blocks":["e8e15ba3091a6dbaa4dba06a2dd03bd1afca8aff647af47e7f6cab9cb76477bb"]},"offset":"26898201"},"isolationlevel.js":{"size":149,"integrity":{"algorithm":"SHA256","hash":"fdbeac8e20bbcdcdefde3fb3c4a681e07b4bce86fa703a2fc033b7a861b3c4c3","blockSize":4194304,"blocks":["fdbeac8e20bbcdcdefde3fb3c4a681e07b4bce86fa703a2fc033b7a861b3c4c3"]},"offset":"26903667"},"shared.js":{"size":2116,"integrity":{"algorithm":"SHA256","hash":"29dcc866e26ad7a0ef10a76f8c8ab56f14548bdde4d16f701ddc46ee363b2e2a","blockSize":4194304,"blocks":["29dcc866e26ad7a0ef10a76f8c8ab56f14548bdde4d16f701ddc46ee363b2e2a"]},"offset":"26903816"},"table.js":{"size":5126,"integrity":{"algorithm":"SHA256","hash":"dc23dd5d3184bb426382ea8aab138b0936714991c8b947d90c217b492f748985","blockSize":4194304,"blocks":["dc23dd5d3184bb426382ea8aab138b0936714991c8b947d90c217b492f748985"]},"offset":"26905932"},"udt.js":{"size":6784,"integrity":{"algorithm":"SHA256","hash":"c022a7bb855f0aabf4115ecb1b5792e59b01906812363e4551f7b6aadc177dba","blockSize":4194304,"blocks":["c022a7bb855f0aabf4115ecb1b5792e59b01906812363e4551f7b6aadc177dba"]},"offset":"26911058"},"utils.js":{"size":437,"integrity":{"algorithm":"SHA256","hash":"2d8de4ec85fc1fb30475d40a8a78855a259c2d9c30d4854d0811b358c9542472","blockSize":4194304,"blocks":["2d8de4ec85fc1fb30475d40a8a78855a259c2d9c30d4854d0811b358c9542472"]},"offset":"26917842"},"tedious":{"files":{"connection-pool.js":{"size":4633,"integrity":{"algorithm":"SHA256","hash":"35cf5929016df4077f312a91fb6561883fff0491e9db132521d9631ae286609c","blockSize":4194304,"blocks":["35cf5929016df4077f312a91fb6561883fff0491e9db132521d9631ae286609c"]},"offset":"26918279"},"index.js":{"size":778,"integrity":{"algorithm":"SHA256","hash":"e404c4cd6a9574f40cbaf8eb438c57b16454a9551fe0023470e55cf3fce2b1eb","blockSize":4194304,"blocks":["e404c4cd6a9574f40cbaf8eb438c57b16454a9551fe0023470e55cf3fce2b1eb"]},"offset":"26922912"},"request.js":{"size":31738,"integrity":{"algorithm":"SHA256","hash":"39b6aa9070792f299852da25aa7e2584ab7b659db87852b7930339ab735e7d0f","blockSize":4194304,"blocks":["39b6aa9070792f299852da25aa7e2584ab7b659db87852b7930339ab735e7d0f"]},"offset":"26923690"},"transaction.js":{"size":2741,"integrity":{"algorithm":"SHA256","hash":"acb835414d7085f922c2b056e5157f38eebffff6eb753143314603a4726dc018","blockSize":4194304,"blocks":["acb835414d7085f922c2b056e5157f38eebffff6eb753143314603a4726dc018"]},"offset":"26955428"}}},"msnodesqlv8":{"files":{"connection-pool.js":{"size":3209,"integrity":{"algorithm":"SHA256","hash":"79659a1ca3c65952bef12de6c8cab3818916336d44fe4dbbdffb36b1eafbc702","blockSize":4194304,"blocks":["79659a1ca3c65952bef12de6c8cab3818916336d44fe4dbbdffb36b1eafbc702"]},"offset":"26958169"},"index.js":{"size":782,"integrity":{"algorithm":"SHA256","hash":"a07f09830f072b990bb10c6829e4c009c30212bddb353bed2121d1aff1319d29","blockSize":4194304,"blocks":["a07f09830f072b990bb10c6829e4c009c30212bddb353bed2121d1aff1319d29"]},"offset":"26961378"},"request.js":{"size":23037,"integrity":{"algorithm":"SHA256","hash":"5f50fbd519b977dea0ccc9d2632a0ee07fb6bf569ae320b384d63d41a2aa69c3","blockSize":4194304,"blocks":["5f50fbd519b977dea0ccc9d2632a0ee07fb6bf569ae320b384d63d41a2aa69c3"]},"offset":"26962160"},"transaction.js":{"size":2794,"integrity":{"algorithm":"SHA256","hash":"c19efcb5ed887203322456ce1da5c04595e95531effa87d94c2b71c44b9088cc","blockSize":4194304,"blocks":["c19efcb5ed887203322456ce1da5c04595e95531effa87d94c2b71c44b9088cc"]},"offset":"26985197"}}},"error":{"files":{"connection-error.js":{"size":407,"integrity":{"algorithm":"SHA256","hash":"9ed9bc4eebd5bb6032ce7043753096c5ded9cf9fb240b8eb033b0752ce0be6ac","blockSize":4194304,"blocks":["9ed9bc4eebd5bb6032ce7043753096c5ded9cf9fb240b8eb033b0752ce0be6ac"]},"offset":"26987991"},"index.js":{"size":401,"integrity":{"algorithm":"SHA256","hash":"fed05dd6420c7676f88327b4d336496bc6a8e9a469f2363e0db8fca7d7142b76","blockSize":4194304,"blocks":["fed05dd6420c7676f88327b4d336496bc6a8e9a469f2363e0db8fca7d7142b76"]},"offset":"26988398"},"mssql-error.js":{"size":593,"integrity":{"algorithm":"SHA256","hash":"b27f00a80bab58b76480a624d0a05a65961095ce3a4c5c03b256649ecbd8b09a","blockSize":4194304,"blocks":["b27f00a80bab58b76480a624d0a05a65961095ce3a4c5c03b256649ecbd8b09a"]},"offset":"26988799"},"prepared-statement-error.js":{"size":442,"integrity":{"algorithm":"SHA256","hash":"5c728b022ecd6f66e8133a33f4b582573e0a3cf6aeeaf9b4e709aa6f1ddb16ac","blockSize":4194304,"blocks":["5c728b022ecd6f66e8133a33f4b582573e0a3cf6aeeaf9b4e709aa6f1ddb16ac"]},"offset":"26989392"},"request-error.js":{"size":1596,"integrity":{"algorithm":"SHA256","hash":"a9235f0605c5149acbe4161a12e3001524b1b1d77d75e98c61005aadde93c991","blockSize":4194304,"blocks":["a9235f0605c5149acbe4161a12e3001524b1b1d77d75e98c61005aadde93c991"]},"offset":"26989834"},"transaction-error.js":{"size":412,"integrity":{"algorithm":"SHA256","hash":"2786b5013b685b5ef06c5e296f2e1f0b56af5fce45164b93f0284df263602a99","blockSize":4194304,"blocks":["2786b5013b685b5ef06c5e296f2e1f0b56af5fce45164b93f0284df263602a99"]},"offset":"26991430"}}},"base":{"files":{"connection-pool.js":{"size":15941,"integrity":{"algorithm":"SHA256","hash":"8b2a6c86ad01edd9b553d16bc752fcc3e0e70732b0a6253e06ad8b2e78d6830b","blockSize":4194304,"blocks":["8b2a6c86ad01edd9b553d16bc752fcc3e0e70732b0a6253e06ad8b2e78d6830b"]},"offset":"26991842"},"index.js":{"size":2967,"integrity":{"algorithm":"SHA256","hash":"62856d55aa5213c8ad4f4616fd003a285af7fb203d864204e5e2ecf1c72b9437","blockSize":4194304,"blocks":["62856d55aa5213c8ad4f4616fd003a285af7fb203d864204e5e2ecf1c72b9437"]},"offset":"27007783"},"prepared-statement.js":{"size":10598,"integrity":{"algorithm":"SHA256","hash":"016107a6e38497f19b2f9fc3269ee2072dd9cf8d01d8c05c821f643102fdd0ef","blockSize":4194304,"blocks":["016107a6e38497f19b2f9fc3269ee2072dd9cf8d01d8c05c821f643102fdd0ef"]},"offset":"27010750"},"request.js":{"size":18000,"integrity":{"algorithm":"SHA256","hash":"8a91fcb19048c457d2932477a12662688ed0f4a395d4339180f93bafafa6a3c0","blockSize":4194304,"blocks":["8a91fcb19048c457d2932477a12662688ed0f4a395d4339180f93bafafa6a3c0"]},"offset":"27021348"},"transaction.js":{"size":6974,"integrity":{"algorithm":"SHA256","hash":"e0b4208a2ecd4f4dbb32afb5fc0be4f2d2a7df92d4104478a9fad731c7115fc4","blockSize":4194304,"blocks":["e0b4208a2ecd4f4dbb32afb5fc0be4f2d2a7df92d4104478a9fad731c7115fc4"]},"offset":"27039348"}}}}},"bin":{"files":{"mssql":{"size":3758,"integrity":{"algorithm":"SHA256","hash":"f2ee2ba85bf652e5636f5d5df047da52bfb8465d9551c300a04cac16dfeb20a2","blockSize":4194304,"blocks":["f2ee2ba85bf652e5636f5d5df047da52bfb8465d9551c300a04cac16dfeb20a2"]},"offset":"27046322"}}},"node_modules":{"files":{"commander":{"files":{"LICENSE":{"size":1098,"integrity":{"algorithm":"SHA256","hash":"04512a63dce4d2d506ad612dc0bd7681ccf6e3655f7b6eaef7dfac8323d1ec0b","blockSize":4194304,"blocks":["04512a63dce4d2d506ad612dc0bd7681ccf6e3655f7b6eaef7dfac8323d1ec0b"]},"offset":"42890805"},"esm.mjs":{"size":309,"integrity":{"algorithm":"SHA256","hash":"7ddd44a96bb575484e1867113ae53bdb0e9b203bd83edb6320b864753ee447f4","blockSize":4194304,"blocks":["7ddd44a96bb575484e1867113ae53bdb0e9b203bd83edb6320b864753ee447f4"]},"offset":"42891903"},"index.js":{"size":798,"integrity":{"algorithm":"SHA256","hash":"d4f8af488a7a08cd71df8503fcc3e5f2fd61e9b26eb368ecd5cc8159862cde3f","blockSize":4194304,"blocks":["d4f8af488a7a08cd71df8503fcc3e5f2fd61e9b26eb368ecd5cc8159862cde3f"]},"offset":"42892212"},"package-support.json":{"size":231,"integrity":{"algorithm":"SHA256","hash":"b07a441d1dbc88588a2e7f219d43a5ea9b7c429a44f119caa49229da86bb0063","blockSize":4194304,"blocks":["b07a441d1dbc88588a2e7f219d43a5ea9b7c429a44f119caa49229da86bb0063"]},"offset":"42893010"},"package.json":{"size":1470,"integrity":{"algorithm":"SHA256","hash":"2d90b6fe6c44a8c8f693249ada219b0f0256099308569f2fe40b68f4b57fd32f","blockSize":4194304,"blocks":["2d90b6fe6c44a8c8f693249ada219b0f0256099308569f2fe40b68f4b57fd32f"]},"offset":"42893241"},"lib":{"files":{"argument.js":{"size":3174,"integrity":{"algorithm":"SHA256","hash":"7386275ac0ab2e0217de1285cc69e67829d1be32943cea13d024caf12c7a87e7","blockSize":4194304,"blocks":["7386275ac0ab2e0217de1285cc69e67829d1be32943cea13d024caf12c7a87e7"]},"offset":"42894711"},"command.js":{"size":69518,"integrity":{"algorithm":"SHA256","hash":"4a7a41a5d5c9fbd133956e540ef369464d7183ccb6f8a132cc7874e4ab5b217b","blockSize":4194304,"blocks":["4a7a41a5d5c9fbd133956e540ef369464d7183ccb6f8a132cc7874e4ab5b217b"]},"offset":"42897885"},"error.js":{"size":1240,"integrity":{"algorithm":"SHA256","hash":"c69bbc276b3c7fec052f930b9de091db2206646761f765a2077d5731f763dc55","blockSize":4194304,"blocks":["c69bbc276b3c7fec052f930b9de091db2206646761f765a2077d5731f763dc55"]},"offset":"42967403"},"help.js":{"size":12379,"integrity":{"algorithm":"SHA256","hash":"dcbf95f532dd2082b87060302de827bb82ef364b2deaa84ad5b40a8276d57a21","blockSize":4194304,"blocks":["dcbf95f532dd2082b87060302de827bb82ef364b2deaa84ad5b40a8276d57a21"]},"offset":"42968643"},"option.js":{"size":8295,"integrity":{"algorithm":"SHA256","hash":"774f5e64ad0aac2fe9e07c76fa19bf574d4703133716036d2461df1525672522","blockSize":4194304,"blocks":["774f5e64ad0aac2fe9e07c76fa19bf574d4703133716036d2461df1525672522"]},"offset":"42981022"},"suggestSimilar.js":{"size":2765,"integrity":{"algorithm":"SHA256","hash":"2f96448988ab89b4acd941d298e51bb103544bf65b60eb0a4260a26a8b39bb57","blockSize":4194304,"blocks":["2f96448988ab89b4acd941d298e51bb103544bf65b60eb0a4260a26a8b39bb57"]},"offset":"42989317"}}}}}}}}},"nan":{"files":{"LICENSE.md":{"size":1144,"integrity":{"algorithm":"SHA256","hash":"95d152af7a776fba93bd795d3235d478cca4a207f8e1475fc9a3d71d28964c39","blockSize":4194304,"blocks":["95d152af7a776fba93bd795d3235d478cca4a207f8e1475fc9a3d71d28964c39"]},"offset":"27050080"},"include_dirs.js":{"size":55,"integrity":{"algorithm":"SHA256","hash":"c32b11511aba771a4c6765de2c73be416f205316ca9f37283170627e778e8d65","blockSize":4194304,"blocks":["c32b11511aba771a4c6765de2c73be416f205316ca9f37283170627e778e8d65"]},"offset":"27051224"},"nan.h":{"size":88496,"integrity":{"algorithm":"SHA256","hash":"5c59dba64b1b7336ec0a362c6f13589698368167f3ebe881826836acb4d9d76e","blockSize":4194304,"blocks":["5c59dba64b1b7336ec0a362c6f13589698368167f3ebe881826836acb4d9d76e"]},"offset":"27051279"},"nan_callbacks.h":{"size":3089,"integrity":{"algorithm":"SHA256","hash":"56f32971390591edd47beaeca181940a40f15bf92a61d4ce6b0d7c6c5937993a","blockSize":4194304,"blocks":["56f32971390591edd47beaeca181940a40f15bf92a61d4ce6b0d7c6c5937993a"]},"offset":"27139775"},"nan_callbacks_12_inl.h":{"size":17536,"integrity":{"algorithm":"SHA256","hash":"8c1a2088333301f5ea3cf6f8c8d4d33ff3efc506163d85d6c175517f7618da1f","blockSize":4194304,"blocks":["8c1a2088333301f5ea3cf6f8c8d4d33ff3efc506163d85d6c175517f7618da1f"]},"offset":"27142864"},"nan_callbacks_pre_12_inl.h":{"size":17085,"integrity":{"algorithm":"SHA256","hash":"38d1d686ba458e3af2da8874b31d69672648830f173fa0b6367a83f54442c90f","blockSize":4194304,"blocks":["38d1d686ba458e3af2da8874b31d69672648830f173fa0b6367a83f54442c90f"]},"offset":"27160400"},"nan_converters.h":{"size":2109,"integrity":{"algorithm":"SHA256","hash":"6e92e34bb6915434f8093d80db908929984222dfd6b5ce70095fa9400a196154","blockSize":4194304,"blocks":["6e92e34bb6915434f8093d80db908929984222dfd6b5ce70095fa9400a196154"]},"offset":"27177485"},"nan_converters_43_inl.h":{"size":2748,"integrity":{"algorithm":"SHA256","hash":"7045e630e82c24629d8dfeaa375b4fb471dd24b6df72fb2b89d3803c41139e9d","blockSize":4194304,"blocks":["7045e630e82c24629d8dfeaa375b4fb471dd24b6df72fb2b89d3803c41139e9d"]},"offset":"27179594"},"nan_converters_pre_43_inl.h":{"size":1254,"integrity":{"algorithm":"SHA256","hash":"5c2eaa295ec1caf3f3ef319b785b436b3e0bd2c4440ff576b5aba82d12262394","blockSize":4194304,"blocks":["5c2eaa295ec1caf3f3ef319b785b436b3e0bd2c4440ff576b5aba82d12262394"]},"offset":"27182342"},"nan_define_own_property_helper.h":{"size":1027,"integrity":{"algorithm":"SHA256","hash":"cae6c4f3bdba55e362011702976075a8f23c2b555fdbd22ea0a90d3ac5572a20","blockSize":4194304,"blocks":["cae6c4f3bdba55e362011702976075a8f23c2b555fdbd22ea0a90d3ac5572a20"]},"offset":"27183596"},"nan_implementation_12_inl.h":{"size":15054,"integrity":{"algorithm":"SHA256","hash":"7ddff7c5e82c601a6cab39785be4fc84d2f3513e0c2e731a90f5c9f3eb9b2546","blockSize":4194304,"blocks":["7ddff7c5e82c601a6cab39785be4fc84d2f3513e0c2e731a90f5c9f3eb9b2546"]},"offset":"27184623"},"nan_implementation_pre_12_inl.h":{"size":7943,"integrity":{"algorithm":"SHA256","hash":"09bcabcf7d99588c375545a7e6862374e717f5bdd7f6387b2c76377863b7817b","blockSize":4194304,"blocks":["09bcabcf7d99588c375545a7e6862374e717f5bdd7f6387b2c76377863b7817b"]},"offset":"27199677"},"nan_json.h":{"size":5772,"integrity":{"algorithm":"SHA256","hash":"db8990e9fd1c1fef3a354f9e8ecb0830a41be9ac5f6754af520252f513c046b9","blockSize":4194304,"blocks":["db8990e9fd1c1fef3a354f9e8ecb0830a41be9ac5f6754af520252f513c046b9"]},"offset":"27207620"},"nan_maybe_43_inl.h":{"size":12375,"integrity":{"algorithm":"SHA256","hash":"e79a940c0641672fcc463d5eb73e1fa017e5b7b2c13ec1d492ed98efb0830001","blockSize":4194304,"blocks":["e79a940c0641672fcc463d5eb73e1fa017e5b7b2c13ec1d492ed98efb0830001"]},"offset":"27213392"},"nan_maybe_pre_43_inl.h":{"size":7161,"integrity":{"algorithm":"SHA256","hash":"a128293f1802bbe309c11e2764f2a5d1fad9c7dd90eea9dbf7d046da481f8195","blockSize":4194304,"blocks":["a128293f1802bbe309c11e2764f2a5d1fad9c7dd90eea9dbf7d046da481f8195"]},"offset":"27225767"},"nan_new.h":{"size":8786,"integrity":{"algorithm":"SHA256","hash":"11fbc38eb49cb6f3c142022c5b47bccc6a18047ad7d509af011feee48f02d7fd","blockSize":4194304,"blocks":["11fbc38eb49cb6f3c142022c5b47bccc6a18047ad7d509af011feee48f02d7fd"]},"offset":"27232928"},"nan_object_wrap.h":{"size":4128,"integrity":{"algorithm":"SHA256","hash":"57cf6cd941b4a807bcbe69d3555bcefd0dca0ec77f459ad77dac07b491f063d5","blockSize":4194304,"blocks":["57cf6cd941b4a807bcbe69d3555bcefd0dca0ec77f459ad77dac07b491f063d5"]},"offset":"27241714"},"nan_persistent_12_inl.h":{"size":3873,"integrity":{"algorithm":"SHA256","hash":"f720e2e961664e897bf8e82d9181d810f0cb681a7e7bd5b8200c55649d3f02b2","blockSize":4194304,"blocks":["f720e2e961664e897bf8e82d9181d810f0cb681a7e7bd5b8200c55649d3f02b2"]},"offset":"27245842"},"nan_persistent_pre_12_inl.h":{"size":6157,"integrity":{"algorithm":"SHA256","hash":"f502353164d1538f8059c2cf999e55fa462e38cdb15ae97f94af0aaed51e58d2","blockSize":4194304,"blocks":["f502353164d1538f8059c2cf999e55fa462e38cdb15ae97f94af0aaed51e58d2"]},"offset":"27249715"},"nan_private.h":{"size":2477,"integrity":{"algorithm":"SHA256","hash":"c9a7b80803ee292a0e89ea40a5afffd21f2c5af387ddec405fd215e8dd3d60f7","blockSize":4194304,"blocks":["c9a7b80803ee292a0e89ea40a5afffd21f2c5af387ddec405fd215e8dd3d60f7"]},"offset":"27255872"},"nan_scriptorigin.h":{"size":3038,"integrity":{"algorithm":"SHA256","hash":"388954578a8e86706c617cbdc24465b08e115ea64c2f4c20edde5c1f0dfe8452","blockSize":4194304,"blocks":["388954578a8e86706c617cbdc24465b08e115ea64c2f4c20edde5c1f0dfe8452"]},"offset":"27258349"},"nan_string_bytes.h":{"size":8102,"integrity":{"algorithm":"SHA256","hash":"e06ce2cde16826c454691f8f310c3562ddc0d560f132db2fe61b3cb6dd29f101","blockSize":4194304,"blocks":["e06ce2cde16826c454691f8f310c3562ddc0d560f132db2fe61b3cb6dd29f101"]},"offset":"27261387"},"nan_typedarray_contents.h":{"size":3089,"integrity":{"algorithm":"SHA256","hash":"7e3c67b148130da1c4e935aa910b91c18d453f42e2d73b1c57c9839c9a5c5720","blockSize":4194304,"blocks":["7e3c67b148130da1c4e935aa910b91c18d453f42e2d73b1c57c9839c9a5c5720"]},"offset":"27269489"},"nan_weak.h":{"size":15354,"integrity":{"algorithm":"SHA256","hash":"2303a6f5ba881d000511cf698adffd8bd8c448ba8fece209b9d503825cdd95f0","blockSize":4194304,"blocks":["2303a6f5ba881d000511cf698adffd8bd8c448ba8fece209b9d503825cdd95f0"]},"offset":"27272578"},"package.json":{"size":507,"integrity":{"algorithm":"SHA256","hash":"e8f7e4a0be95955976cc74ac5e3d213a19dee8e23aefcf404bf6dc27068ea4df","blockSize":4194304,"blocks":["e8f7e4a0be95955976cc74ac5e3d213a19dee8e23aefcf404bf6dc27068ea4df"]},"offset":"27287932"},"tools":{"files":{"1to2.js":{"size":14363,"integrity":{"algorithm":"SHA256","hash":"04901f617fc36da5bc8a2f4cf1bdcb39d5e38e3a7d084a4a61d4bdb85aac0138","blockSize":4194304,"blocks":["04901f617fc36da5bc8a2f4cf1bdcb39d5e38e3a7d084a4a61d4bdb85aac0138"]},"offset":"27288439"},"README.md":{"size":456,"integrity":{"algorithm":"SHA256","hash":"a5e5b621d84fb9b98c84d5276f0b14ac022b752d2258388c2a1f56af7d830859","blockSize":4194304,"blocks":["a5e5b621d84fb9b98c84d5276f0b14ac022b752d2258388c2a1f56af7d830859"]},"offset":"27302802"},"package.json":{"size":292,"integrity":{"algorithm":"SHA256","hash":"b9721ab2f2531d502ecec010369701ddc8a059945f02657805136a301e008f77","blockSize":4194304,"blocks":["b9721ab2f2531d502ecec010369701ddc8a059945f02657805136a301e008f77"]},"offset":"27303258"}}},"doc":{"files":{"asyncworker.md":{"size":5348,"integrity":{"algorithm":"SHA256","hash":"8899c8dd17a770c6464c17521f6e78de83eddc3009d07194e88c021afe1c63f7","blockSize":4194304,"blocks":["8899c8dd17a770c6464c17521f6e78de83eddc3009d07194e88c021afe1c63f7"]},"offset":"27303550"},"buffers.md":{"size":2121,"integrity":{"algorithm":"SHA256","hash":"b0729c1f183d135e7720e4a04cf060dbeba7d86454a75454018949b5d38ba403","blockSize":4194304,"blocks":["b0729c1f183d135e7720e4a04cf060dbeba7d86454a75454018949b5d38ba403"]},"offset":"27308898"},"callback.md":{"size":2633,"integrity":{"algorithm":"SHA256","hash":"1e0a33a866a7fee7a2a036f93982b2e57ed8ed6885d94a559856baad3ab4e45f","blockSize":4194304,"blocks":["1e0a33a866a7fee7a2a036f93982b2e57ed8ed6885d94a559856baad3ab4e45f"]},"offset":"27311019"},"converters.md":{"size":1950,"integrity":{"algorithm":"SHA256","hash":"5729d8ec9ac3f745b3599e773248a667de73176f2c11e5f79678b1af5ad652b0","blockSize":4194304,"blocks":["5729d8ec9ac3f745b3599e773248a667de73176f2c11e5f79678b1af5ad652b0"]},"offset":"27313652"},"errors.md":{"size":7404,"integrity":{"algorithm":"SHA256","hash":"135418e9fcb06a7ad9f577b4eaae7f90f0e39ba4e5da0037272db59b01ead433","blockSize":4194304,"blocks":["135418e9fcb06a7ad9f577b4eaae7f90f0e39ba4e5da0037272db59b01ead433"]},"offset":"27315602"},"json.md":{"size":1944,"integrity":{"algorithm":"SHA256","hash":"2ca07b2c8582c9cd774e04db3ba433ca074df49353a30345a11227ee9ce49e68","blockSize":4194304,"blocks":["2ca07b2c8582c9cd774e04db3ba433ca074df49353a30345a11227ee9ce49e68"]},"offset":"27323006"},"maybe_types.md":{"size":22401,"integrity":{"algorithm":"SHA256","hash":"ef82717e77c8da7d5d3ecbcf84b4e57d7ace120a969988de3c4ddb2792ef6fc4","blockSize":4194304,"blocks":["ef82717e77c8da7d5d3ecbcf84b4e57d7ace120a969988de3c4ddb2792ef6fc4"]},"offset":"27324950"},"methods.md":{"size":27472,"integrity":{"algorithm":"SHA256","hash":"a4ccb3635ecdc9e94f3ed381bbd42824fa3291a49e50fbe924a8f8388f9a01f0","blockSize":4194304,"blocks":["a4ccb3635ecdc9e94f3ed381bbd42824fa3291a49e50fbe924a8f8388f9a01f0"]},"offset":"27347351"},"new.md":{"size":4859,"integrity":{"algorithm":"SHA256","hash":"27a7478fb2d2e907b27431db232276add7f17a9a9b4d83a58c087e57494332bd","blockSize":4194304,"blocks":["27a7478fb2d2e907b27431db232276add7f17a9a9b4d83a58c087e57494332bd"]},"offset":"27374823"},"node_misc.md":{"size":5704,"integrity":{"algorithm":"SHA256","hash":"081a89819b3187a1afdc9e4ec4e0d2a5bab226d503c83bf5a20ef91b86e3575c","blockSize":4194304,"blocks":["081a89819b3187a1afdc9e4ec4e0d2a5bab226d503c83bf5a20ef91b86e3575c"]},"offset":"27379682"},"object_wrappers.md":{"size":8226,"integrity":{"algorithm":"SHA256","hash":"06a59cd59a0d6e75a9c4588df69aac843c39ace9b24001f999c0d570fd8a0362","blockSize":4194304,"blocks":["06a59cd59a0d6e75a9c4588df69aac843c39ace9b24001f999c0d570fd8a0362"]},"offset":"27385386"},"persistent.md":{"size":10889,"integrity":{"algorithm":"SHA256","hash":"d7560dc79d447a75b238dd287eb11b46581fa1469482f96143d7dbe42cbb3bcc","blockSize":4194304,"blocks":["d7560dc79d447a75b238dd287eb11b46581fa1469482f96143d7dbe42cbb3bcc"]},"offset":"27393612"},"scopes.md":{"size":2362,"integrity":{"algorithm":"SHA256","hash":"33cde5199d3d3b6ac4d8e73261ac23a6941db2ede7a8427d73e63b198e323811","blockSize":4194304,"blocks":["33cde5199d3d3b6ac4d8e73261ac23a6941db2ede7a8427d73e63b198e323811"]},"offset":"27404501"},"script.md":{"size":2081,"integrity":{"algorithm":"SHA256","hash":"3dbefed20733372f194502cf91d8313c836bb6aab3314deed5db81bd71ab577b","blockSize":4194304,"blocks":["3dbefed20733372f194502cf91d8313c836bb6aab3314deed5db81bd71ab577b"]},"offset":"27406863"},"string_bytes.md":{"size":1900,"integrity":{"algorithm":"SHA256","hash":"920c992eaf85103ce332bf5f6d7037610819ec431bfaa2ca80bf10195e10d284","blockSize":4194304,"blocks":["920c992eaf85103ce332bf5f6d7037610819ec431bfaa2ca80bf10195e10d284"]},"offset":"27408944"},"v8_internals.md":{"size":7388,"integrity":{"algorithm":"SHA256","hash":"53b392869842a33f94a0917027d43cb11f50f9191ae06e1338a7258acadf0131","blockSize":4194304,"blocks":["53b392869842a33f94a0917027d43cb11f50f9191ae06e1338a7258acadf0131"]},"offset":"27410844"},"v8_misc.md":{"size":2914,"integrity":{"algorithm":"SHA256","hash":"58a371b74df52c2499abef3e19c7f307f3d2a678138cda8f9b4a91ef5d2916de","blockSize":4194304,"blocks":["58a371b74df52c2499abef3e19c7f307f3d2a678138cda8f9b4a91ef5d2916de"]},"offset":"27418232"}}}}},"napi-build-utils":{"files":{"LICENSE":{"size":1069,"integrity":{"algorithm":"SHA256","hash":"9c6a91d2847bd9bfd493c1ca87b9c3f96302cfd069667e6dd4a6278e69a33a31","blockSize":4194304,"blocks":["9c6a91d2847bd9bfd493c1ca87b9c3f96302cfd069667e6dd4a6278e69a33a31"]},"offset":"27421146"},"index.js":{"size":7206,"integrity":{"algorithm":"SHA256","hash":"bcc8b6546ab1c893638d0886d312f421c1a5222a1b0c62a31432d3cbf7072aae","blockSize":4194304,"blocks":["bcc8b6546ab1c893638d0886d312f421c1a5222a1b0c62a31432d3cbf7072aae"]},"offset":"27422215"},"index.md":{"size":3767,"integrity":{"algorithm":"SHA256","hash":"3edaf008baa77c7110d995e202a5b831eb6e3c554094c3d70bf814192328b383","blockSize":4194304,"blocks":["3edaf008baa77c7110d995e202a5b831eb6e3c554094c3d70bf814192328b383"]},"offset":"27429421"},"package.json":{"size":706,"integrity":{"algorithm":"SHA256","hash":"aa5853f94590ff12f5811d340ff3982df621b28dd0a98d00eca9a88a1060c034","blockSize":4194304,"blocks":["aa5853f94590ff12f5811d340ff3982df621b28dd0a98d00eca9a88a1060c034"]},"offset":"27433188"}}},"native-duplexpair":{"files":{"LICENSE":{"size":1083,"integrity":{"algorithm":"SHA256","hash":"6eebd43460bb77bf88bbda34dfd5f7b390c00bf841225c658a9f123d8143eaae","blockSize":4194304,"blocks":["6eebd43460bb77bf88bbda34dfd5f7b390c00bf841225c658a9f123d8143eaae"]},"offset":"27433894"},"code-of-conduct.md":{"size":3198,"integrity":{"algorithm":"SHA256","hash":"5740af8a8e97f17c0e601a38345f268dce0716ba9021f170442021bbb879aed1","blockSize":4194304,"blocks":["5740af8a8e97f17c0e601a38345f268dce0716ba9021f170442021bbb879aed1"]},"offset":"27434977"},"index.js":{"size":889,"integrity":{"algorithm":"SHA256","hash":"bf320f95e69fc2e2b34d6c2dad4cd24c0f9c9bf4f423b88fae2c1d49f81b0fba","blockSize":4194304,"blocks":["bf320f95e69fc2e2b34d6c2dad4cd24c0f9c9bf4f423b88fae2c1d49f81b0fba"]},"offset":"27438175"},"package.json":{"size":575,"integrity":{"algorithm":"SHA256","hash":"d5d8f377eaf83deb58376607efaada4b8e142f7509cfd05c5cb92043dc089171","blockSize":4194304,"blocks":["d5d8f377eaf83deb58376607efaada4b8e142f7509cfd05c5cb92043dc089171"]},"offset":"27439064"}}},"negotiator":{"files":{"HISTORY.md":{"size":2499,"integrity":{"algorithm":"SHA256","hash":"6b25039b6a40f7fcb7eb6dc891418d154c4b4154284f58c6bffcb10ad7587a6d","blockSize":4194304,"blocks":["6b25039b6a40f7fcb7eb6dc891418d154c4b4154284f58c6bffcb10ad7587a6d"]},"offset":"27439639"},"LICENSE":{"size":1177,"integrity":{"algorithm":"SHA256","hash":"553d4d20029a24e315b428a1a54a9e109eaa340f2e958a4f50a92362c2c4070b","blockSize":4194304,"blocks":["553d4d20029a24e315b428a1a54a9e109eaa340f2e958a4f50a92362c2c4070b"]},"offset":"27442138"},"index.js":{"size":2451,"integrity":{"algorithm":"SHA256","hash":"4f9279bcffc74199c671739f2d0e91fe5176a7f7e4683ca59809a50463a842bd","blockSize":4194304,"blocks":["4f9279bcffc74199c671739f2d0e91fe5176a7f7e4683ca59809a50463a842bd"]},"offset":"27443315"},"package.json":{"size":419,"integrity":{"algorithm":"SHA256","hash":"1486f0307cc0b12d3ac493a4545170313e98586f697eea7676978c465dad136b","blockSize":4194304,"blocks":["1486f0307cc0b12d3ac493a4545170313e98586f697eea7676978c465dad136b"]},"offset":"27445766"},"lib":{"files":{"charset.js":{"size":3081,"integrity":{"algorithm":"SHA256","hash":"e6522a2df58f21a6cdf8d146f7e85b9a49bcaf68b813dec15068a8e84fc582c3","blockSize":4194304,"blocks":["e6522a2df58f21a6cdf8d146f7e85b9a49bcaf68b813dec15068a8e84fc582c3"]},"offset":"27446185"},"encoding.js":{"size":3506,"integrity":{"algorithm":"SHA256","hash":"35421dc78d3c1b608922427bbd6e524518168621ff1a44919fc591ca297e813c","blockSize":4194304,"blocks":["35421dc78d3c1b608922427bbd6e524518168621ff1a44919fc591ca297e813c"]},"offset":"27449266"},"language.js":{"size":3409,"integrity":{"algorithm":"SHA256","hash":"4aebb44da06094f2d56f0b20b4fbdd542cda00a4c9295e10bbe55203701c9024","blockSize":4194304,"blocks":["4aebb44da06094f2d56f0b20b4fbdd542cda00a4c9295e10bbe55203701c9024"]},"offset":"27452772"},"mediaType.js":{"size":5358,"integrity":{"algorithm":"SHA256","hash":"0dab239c924fa4d5f823548e25dc9f10315bf490b821827b640318b7aa200577","blockSize":4194304,"blocks":["0dab239c924fa4d5f823548e25dc9f10315bf490b821827b640318b7aa200577"]},"offset":"27456181"}}}}},"node-abi":{"files":{".releaserc.json":{"size":230,"integrity":{"algorithm":"SHA256","hash":"24fdc5a62d5b09bf4257a10fefd81bedcbfed98b3010476419ad07b3f40db4fc","blockSize":4194304,"blocks":["24fdc5a62d5b09bf4257a10fefd81bedcbfed98b3010476419ad07b3f40db4fc"]},"offset":"27461539"},"CODE_OF_CONDUCT.md":{"size":3194,"integrity":{"algorithm":"SHA256","hash":"e9603dc16ce6b339120bf32d50d7b0d1776527dedbcd90d7f400b336530babe3","blockSize":4194304,"blocks":["e9603dc16ce6b339120bf32d50d7b0d1776527dedbcd90d7f400b336530babe3"]},"offset":"27461769"},"CONTRIBUTING.md":{"size":2520,"integrity":{"algorithm":"SHA256","hash":"bd9352ceefe6a3b0c43273b71441502890579492aa0b71e86d9921a45324c82d","blockSize":4194304,"blocks":["bd9352ceefe6a3b0c43273b71441502890579492aa0b71e86d9921a45324c82d"]},"offset":"27464963"},"LICENSE":{"size":1069,"integrity":{"algorithm":"SHA256","hash":"9a508cd4122f2dc1cc39f8ab0b6950efbc49fb087a581c7177a4b8c9d5d0d6a1","blockSize":4194304,"blocks":["9a508cd4122f2dc1cc39f8ab0b6950efbc49fb087a581c7177a4b8c9d5d0d6a1"]},"offset":"27467483"},"abi_registry.json":{"size":3618,"integrity":{"algorithm":"SHA256","hash":"d7294bf23fd732b6b8996e5055744118bdfa0071b277769baef6779e1dd7b85e","blockSize":4194304,"blocks":["d7294bf23fd732b6b8996e5055744118bdfa0071b277769baef6779e1dd7b85e"]},"offset":"27468552"},"index.js":{"size":6488,"integrity":{"algorithm":"SHA256","hash":"e2039f88b4ebda3d74f595f3b633d8c1422493a2656ee5b40dd6f243552b2b4a","blockSize":4194304,"blocks":["e2039f88b4ebda3d74f595f3b633d8c1422493a2656ee5b40dd6f243552b2b4a"]},"offset":"27472170"},"package.json":{"size":570,"integrity":{"algorithm":"SHA256","hash":"84534ea2152d02888027d04ec23d83d99705c9d34a87f6dc1606ee93fb17962d","blockSize":4194304,"blocks":["84534ea2152d02888027d04ec23d83d99705c9d34a87f6dc1606ee93fb17962d"]},"offset":"27478658"},"scripts":{"files":{"update-abi-registry.js":{"size":3318,"integrity":{"algorithm":"SHA256","hash":"123632d6e5a78c7817b8e99448bb493a0c613ea31fb20db8dd5a1963ad80c651","blockSize":4194304,"blocks":["123632d6e5a78c7817b8e99448bb493a0c613ea31fb20db8dd5a1963ad80c651"]},"offset":"27479228"}}},".github":{"files":{"workflows":{"files":{"update-abi.yml":{"size":1309,"integrity":{"algorithm":"SHA256","hash":"4a2bca71b02526d6a87ff1100f5f0387bd98ea2eea682502cfdab54319f1b67d","blockSize":4194304,"blocks":["4a2bca71b02526d6a87ff1100f5f0387bd98ea2eea682502cfdab54319f1b67d"]},"offset":"27482546"}}}}}}},"node-abort-controller":{"files":{"LICENSE":{"size":1071,"integrity":{"algorithm":"SHA256","hash":"3ed030086e7f0b82f7c8d86b7c66342b6c820d76062458192cd4990a99f95dfa","blockSize":4194304,"blocks":["3ed030086e7f0b82f7c8d86b7c66342b6c820d76062458192cd4990a99f95dfa"]},"offset":"27483855"},"azure-pipelines.yml":{"size":425,"integrity":{"algorithm":"SHA256","hash":"093aa72d6996233d99aa86dbef92a65e211bd0b8fc3bb4fe3b702af8064cb229","blockSize":4194304,"blocks":["093aa72d6996233d99aa86dbef92a65e211bd0b8fc3bb4fe3b702af8064cb229"]},"offset":"27484926"},"browser.js":{"size":479,"integrity":{"algorithm":"SHA256","hash":"efe0bc849851750024951fcd5ec6e9b6094b59dc254d726ad91440eb57180383","blockSize":4194304,"blocks":["efe0bc849851750024951fcd5ec6e9b6094b59dc254d726ad91440eb57180383"]},"offset":"27485351"},"index.js":{"size":1087,"integrity":{"algorithm":"SHA256","hash":"21a7432f80d060d45d59127d01222806868fa1de2c2ca80969dbd605f5628442","blockSize":4194304,"blocks":["21a7432f80d060d45d59127d01222806868fa1de2c2ca80969dbd605f5628442"]},"offset":"27485830"},"package.json":{"size":607,"integrity":{"algorithm":"SHA256","hash":"60f223a9fac9a314deafc08e31231453c71ad0ae91da70ed7f365a9009c321eb","blockSize":4194304,"blocks":["60f223a9fac9a314deafc08e31231453c71ad0ae91da70ed7f365a9009c321eb"]},"offset":"27486917"}}},"node-addon-api":{"files":{"LICENSE.md":{"size":1245,"integrity":{"algorithm":"SHA256","hash":"4fcf69bbecb999ec8fa0ece62bc8934b7cdd45061ac1a8b1939a09be64cd4352","blockSize":4194304,"blocks":["4fcf69bbecb999ec8fa0ece62bc8934b7cdd45061ac1a8b1939a09be64cd4352"]},"offset":"27487524"},"common.gypi":{"size":762,"integrity":{"algorithm":"SHA256","hash":"f15742e3019096b85ef3e8985e2fe66c4dda722908577e113a1b0264893ecca8","blockSize":4194304,"blocks":["f15742e3019096b85ef3e8985e2fe66c4dda722908577e113a1b0264893ecca8"]},"offset":"27488769"},"except.gypi":{"size":560,"integrity":{"algorithm":"SHA256","hash":"ddbc09f5b66fe24dd898fbe659085a6ff72e9575025004fc3762271dba781e8b","blockSize":4194304,"blocks":["ddbc09f5b66fe24dd898fbe659085a6ff72e9575025004fc3762271dba781e8b"]},"offset":"27489531"},"index.js":{"size":296,"integrity":{"algorithm":"SHA256","hash":"6528e924b31e091c3243132fe713ea0f1fa6362ffaa3c2dd09d12670db6b60dc","blockSize":4194304,"blocks":["6528e924b31e091c3243132fe713ea0f1fa6362ffaa3c2dd09d12670db6b60dc"]},"offset":"27490091"},"napi-inl.deprecated.h":{"size":7251,"integrity":{"algorithm":"SHA256","hash":"96afb169fd8af899ddcadc102ea137e3cd253c13b8862cb11bd58601fe2a5f90","blockSize":4194304,"blocks":["96afb169fd8af899ddcadc102ea137e3cd253c13b8862cb11bd58601fe2a5f90"]},"offset":"27490387"},"napi-inl.h":{"size":204456,"integrity":{"algorithm":"SHA256","hash":"141fee09a5439de973314b4ddb783a09e74a097f7ddfc5e3b994764a182e3795","blockSize":4194304,"blocks":["141fee09a5439de973314b4ddb783a09e74a097f7ddfc5e3b994764a182e3795"]},"offset":"27497638"},"napi.h":{"size":121041,"integrity":{"algorithm":"SHA256","hash":"38ece42f702d0226ecd63c8b9f0a13e71368d55944994bd2954dc142efdde669","blockSize":4194304,"blocks":["38ece42f702d0226ecd63c8b9f0a13e71368d55944994bd2954dc142efdde669"]},"offset":"27702094"},"node_api.gyp":{"size":132,"integrity":{"algorithm":"SHA256","hash":"3cd2c44fb0974f016376b676d46bbebbca7c89d4383b09ece30e4cb4122a1499","blockSize":4194304,"blocks":["3cd2c44fb0974f016376b676d46bbebbca7c89d4383b09ece30e4cb4122a1499"]},"offset":"27823135"},"noexcept.gypi":{"size":639,"integrity":{"algorithm":"SHA256","hash":"494060b87197c489497a038504147c435b1d09306152048add42ba0d7d16e747","blockSize":4194304,"blocks":["494060b87197c489497a038504147c435b1d09306152048add42ba0d7d16e747"]},"offset":"27823267"},"nothing.c":{"size":0,"integrity":{"algorithm":"SHA256","hash":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","blockSize":4194304,"blocks":[]},"offset":"27823906"},"package-support.json":{"size":467,"integrity":{"algorithm":"SHA256","hash":"b1cb7da23cca1681c7392a3c889eb0cc4916c53d2d7692d4b654ae751f3442f3","blockSize":4194304,"blocks":["b1cb7da23cca1681c7392a3c889eb0cc4916c53d2d7692d4b654ae751f3442f3"]},"offset":"27823906"},"package.json":{"size":927,"integrity":{"algorithm":"SHA256","hash":"2fa7fd19a60a8618850ad6a63a527e5798e9dc1c02f602360ad24dc0cafe0a37","blockSize":4194304,"blocks":["2fa7fd19a60a8618850ad6a63a527e5798e9dc1c02f602360ad24dc0cafe0a37"]},"offset":"27824373"},"tools":{"files":{"README.md":{"size":3217,"integrity":{"algorithm":"SHA256","hash":"65e9ea918538f453166b10a1d609cf44cec3d2d01f23fecb5265fb3a4bf303d5","blockSize":4194304,"blocks":["65e9ea918538f453166b10a1d609cf44cec3d2d01f23fecb5265fb3a4bf303d5"]},"offset":"27825300"},"check-napi.js":{"size":3210,"integrity":{"algorithm":"SHA256","hash":"f3264fd3f9dd9bc3e051cdcf72125d34617b2b06b914c49f1e1297e53cfd524b","blockSize":4194304,"blocks":["f3264fd3f9dd9bc3e051cdcf72125d34617b2b06b914c49f1e1297e53cfd524b"]},"offset":"27828517"},"clang-format.js":{"size":1892,"integrity":{"algorithm":"SHA256","hash":"f332f9209e5329776e63b4b48a53efbe95403e47ecea8c32dbcf937f3938d90a","blockSize":4194304,"blocks":["f332f9209e5329776e63b4b48a53efbe95403e47ecea8c32dbcf937f3938d90a"]},"offset":"27831727"},"conversion.js":{"size":15275,"integrity":{"algorithm":"SHA256","hash":"df2f681bdb4a1dac5faf7fa70a60dace4dd12ce0b9964effcee56a43f693fc6c","blockSize":4194304,"blocks":["df2f681bdb4a1dac5faf7fa70a60dace4dd12ce0b9964effcee56a43f693fc6c"]},"offset":"27833619"},"eslint-format.js":{"size":1746,"integrity":{"algorithm":"SHA256","hash":"cb0d2625bbee44502b5c170386d00c7bc07d0e0ae4e995524d2d00b025a369e2","blockSize":4194304,"blocks":["cb0d2625bbee44502b5c170386d00c7bc07d0e0ae4e995524d2d00b025a369e2"]},"offset":"27848894"}}}}},"node-fetch":{"files":{"LICENSE.md":{"size":1079,"integrity":{"algorithm":"SHA256","hash":"84eaa985e1ef71b8c630e8aba73404c219ff425c6fdb45c62e998b58d4fbdc8e","blockSize":4194304,"blocks":["84eaa985e1ef71b8c630e8aba73404c219ff425c6fdb45c62e998b58d4fbdc8e"]},"offset":"27850640"},"browser.js":{"size":732,"integrity":{"algorithm":"SHA256","hash":"f30a3f86c32c62c6687166668f5fa60278d1f302f7acd8d0346f73f43df6b66f","blockSize":4194304,"blocks":["f30a3f86c32c62c6687166668f5fa60278d1f302f7acd8d0346f73f43df6b66f"]},"offset":"27851719"},"package.json":{"size":1498,"integrity":{"algorithm":"SHA256","hash":"96ae98913e94c1c27fdedcbf3ba6b16dec5a06411906c84f42d6986b797be7d8","blockSize":4194304,"blocks":["96ae98913e94c1c27fdedcbf3ba6b16dec5a06411906c84f42d6986b797be7d8"]},"offset":"27852451"},"lib":{"files":{"index.es.js":{"size":42656,"integrity":{"algorithm":"SHA256","hash":"531ba602d7a58997c8f18cc9a413e561610ae67c609894ddbbb91523652af64e","blockSize":4194304,"blocks":["531ba602d7a58997c8f18cc9a413e561610ae67c609894ddbbb91523652af64e"]},"offset":"27853949"},"index.js":{"size":43064,"integrity":{"algorithm":"SHA256","hash":"5010821fbd9a88136517267b28c6346aa66994cded5fc66b17d7357304c05d68","blockSize":4194304,"blocks":["5010821fbd9a88136517267b28c6346aa66994cded5fc66b17d7357304c05d68"]},"offset":"27896605"},"index.mjs":{"size":42582,"integrity":{"algorithm":"SHA256","hash":"5b2d2a2e23f8bfaa66fae541fa21ac4886ef3025877baa2180f02b5e49d4874c","blockSize":4194304,"blocks":["5b2d2a2e23f8bfaa66fae541fa21ac4886ef3025877baa2180f02b5e49d4874c"]},"offset":"27939669"}}},"node_modules":{"files":{"tr46":{"files":{"index.js":{"size":7567,"integrity":{"algorithm":"SHA256","hash":"8194f9425ce9ab06ea9aebcd64a85ec064d95d61bb349f8f1c98762ad256638e","blockSize":4194304,"blocks":["8194f9425ce9ab06ea9aebcd64a85ec064d95d61bb349f8f1c98762ad256638e"]},"offset":"42992082"},"package.json":{"size":431,"integrity":{"algorithm":"SHA256","hash":"bb7b622deed9936ada577a7ea52a59cee5162825305a45b1be2278907d899bf1","blockSize":4194304,"blocks":["bb7b622deed9936ada577a7ea52a59cee5162825305a45b1be2278907d899bf1"]},"offset":"42999649"},"lib":{"files":{"mappingTable.json":{"size":260049,"integrity":{"algorithm":"SHA256","hash":"b6b39724dca9011113a08d9d6910204062b58169e98952acdfbd19bf2c31bbff","blockSize":4194304,"blocks":["b6b39724dca9011113a08d9d6910204062b58169e98952acdfbd19bf2c31bbff"]},"offset":"43000080"}}}}},"webidl-conversions":{"files":{"LICENSE.md":{"size":1323,"integrity":{"algorithm":"SHA256","hash":"a889cc4dbee2ae172c179856b25d75b0b7a5a136e1b97109b9b590b2ff1a879c","blockSize":4194304,"blocks":["a889cc4dbee2ae172c179856b25d75b0b7a5a136e1b97109b9b590b2ff1a879c"]},"offset":"43260129"},"package.json":{"size":402,"integrity":{"algorithm":"SHA256","hash":"4d8bfba25f8d4222ebd3399f651703272da73572dd9862f4924c7ead6c55e25c","blockSize":4194304,"blocks":["4d8bfba25f8d4222ebd3399f651703272da73572dd9862f4924c7ead6c55e25c"]},"offset":"43261452"},"lib":{"files":{"index.js":{"size":5056,"integrity":{"algorithm":"SHA256","hash":"0b29621626c38ddda2a8e20787c32d09db10dd031ea743c5e270b59d46754a84","blockSize":4194304,"blocks":["0b29621626c38ddda2a8e20787c32d09db10dd031ea743c5e270b59d46754a84"]},"offset":"43261854"}}}}},"whatwg-url":{"files":{"LICENSE.txt":{"size":1088,"integrity":{"algorithm":"SHA256","hash":"6b7a1792144374d84dc5ed3655b8bbe2754d06f4f1f64a9fb8b9de2d6f448b85","blockSize":4194304,"blocks":["6b7a1792144374d84dc5ed3655b8bbe2754d06f4f1f64a9fb8b9de2d6f448b85"]},"offset":"43266910"},"package.json":{"size":572,"integrity":{"algorithm":"SHA256","hash":"b8574d4e255ba0988d1522857aa06f1494631fd324702db2b4b334697153b2be","blockSize":4194304,"blocks":["b8574d4e255ba0988d1522857aa06f1494631fd324702db2b4b334697153b2be"]},"offset":"43267998"},"lib":{"files":{"URL-impl.js":{"size":3804,"integrity":{"algorithm":"SHA256","hash":"e60103ff74b8bfc4001f5c05eea482f554de610cb5fc4e7ccbfc5aef9e443706","blockSize":4194304,"blocks":["e60103ff74b8bfc4001f5c05eea482f554de610cb5fc4e7ccbfc5aef9e443706"]},"offset":"43268570"},"URL.js":{"size":4212,"integrity":{"algorithm":"SHA256","hash":"3bd67335fc72b50924fa35523c2b0b73dce9cb814f6bae82644ccb1f22560706","blockSize":4194304,"blocks":["3bd67335fc72b50924fa35523c2b0b73dce9cb814f6bae82644ccb1f22560706"]},"offset":"43272374"},"public-api.js":{"size":625,"integrity":{"algorithm":"SHA256","hash":"0cbda6401c6179c4fb2ef0cebeccfb127485fee6f0ed5c129a8a539d4cd29018","blockSize":4194304,"blocks":["0cbda6401c6179c4fb2ef0cebeccfb127485fee6f0ed5c129a8a539d4cd29018"]},"offset":"43276586"},"url-state-machine.js":{"size":33573,"integrity":{"algorithm":"SHA256","hash":"e038db71d8a2313d7d20ad6dd1116a2fcb34b41e39f7a2364c70ff1aff548850","blockSize":4194304,"blocks":["e038db71d8a2313d7d20ad6dd1116a2fcb34b41e39f7a2364c70ff1aff548850"]},"offset":"43277211"},"utils.js":{"size":562,"integrity":{"algorithm":"SHA256","hash":"96b941934b9050815f9397bc6796ea8611bfa00c5886587d81da64a23841e3b9","blockSize":4194304,"blocks":["96b941934b9050815f9397bc6796ea8611bfa00c5886587d81da64a23841e3b9"]},"offset":"43310784"}}}}}}}}},"npmlog":{"files":{"LICENSE.md":{"size":798,"integrity":{"algorithm":"SHA256","hash":"27d998b503b18cdb16c49e93da04069a99ba8a1d7e18d67146de8e242f9a6d21","blockSize":4194304,"blocks":["27d998b503b18cdb16c49e93da04069a99ba8a1d7e18d67146de8e242f9a6d21"]},"offset":"27982251"},"package.json":{"size":821,"integrity":{"algorithm":"SHA256","hash":"760111f1d1130427bae2f30508ce4a596b3286dee4d5c838cc1563ed98ec2ca9","blockSize":4194304,"blocks":["760111f1d1130427bae2f30508ce4a596b3286dee4d5c838cc1563ed98ec2ca9"]},"offset":"27983049"},"lib":{"files":{"log.js":{"size":9046,"integrity":{"algorithm":"SHA256","hash":"7bc9c50016867fb92c6812a0aaf1d71b358574a570ace0122d622e4926cf0657","blockSize":4194304,"blocks":["7bc9c50016867fb92c6812a0aaf1d71b358574a570ace0122d622e4926cf0657"]},"offset":"27983870"}}}}},"object-assign":{"files":{"index.js":{"size":2108,"integrity":{"algorithm":"SHA256","hash":"e02cb9714ef6e561e971fe400644330212f07ca86120587199470d8b759a4b7c","blockSize":4194304,"blocks":["e02cb9714ef6e561e971fe400644330212f07ca86120587199470d8b759a4b7c"]},"offset":"27992916"},"license":{"size":1119,"integrity":{"algorithm":"SHA256","hash":"6fb9754611c20f6649f68805e8c990e83261f29316e29de9e6cedae607b8634c","blockSize":4194304,"blocks":["6fb9754611c20f6649f68805e8c990e83261f29316e29de9e6cedae607b8634c"]},"offset":"27995024"},"package.json":{"size":483,"integrity":{"algorithm":"SHA256","hash":"addc607a71a2726729fbcfafbf86f8915460fd69e4476a210a0abcc4143f5d46","blockSize":4194304,"blocks":["addc607a71a2726729fbcfafbf86f8915460fd69e4476a210a0abcc4143f5d46"]},"offset":"27996143"}}},"object-inspect":{"files":{".nycrc":{"size":236,"integrity":{"algorithm":"SHA256","hash":"054eeda03a706b8eb6821a2cc2d47080c7d6cb031c82252ff9a13460fef3bb8e","blockSize":4194304,"blocks":["054eeda03a706b8eb6821a2cc2d47080c7d6cb031c82252ff9a13460fef3bb8e"]},"offset":"27996626"},"LICENSE":{"size":1071,"integrity":{"algorithm":"SHA256","hash":"bd40cc437e28a3ad7bef2ad34e6b72e757b182e67bda1acadbab4ef0476f8232","blockSize":4194304,"blocks":["bd40cc437e28a3ad7bef2ad34e6b72e757b182e67bda1acadbab4ef0476f8232"]},"offset":"27996862"},"index.js":{"size":18486,"integrity":{"algorithm":"SHA256","hash":"6e21f517d2e631a35b4ace5ff8ed2e818a65f4ab49777a607cf83e365e79a7a8","blockSize":4194304,"blocks":["6e21f517d2e631a35b4ace5ff8ed2e818a65f4ab49777a607cf83e365e79a7a8"]},"offset":"27997933"},"package-support.json":{"size":365,"integrity":{"algorithm":"SHA256","hash":"1d6770f17ca57a021af57c931ebd3c787d0d06ebaed27da98cfcc2ef77633247","blockSize":4194304,"blocks":["1d6770f17ca57a021af57c931ebd3c787d0d06ebaed27da98cfcc2ef77633247"]},"offset":"28016419"},"package.json":{"size":1750,"integrity":{"algorithm":"SHA256","hash":"2a30894b43818611581d9c2bb6496dddf07c9fa2ab4d1829d2be5ae0d01d831a","blockSize":4194304,"blocks":["2a30894b43818611581d9c2bb6496dddf07c9fa2ab4d1829d2be5ae0d01d831a"]},"offset":"28016784"},"test-core-js.js":{"size":534,"integrity":{"algorithm":"SHA256","hash":"16d580a89dec81a3657e20d9f827768178abe029bf31a950136a38852b493b9a","blockSize":4194304,"blocks":["16d580a89dec81a3657e20d9f827768178abe029bf31a950136a38852b493b9a"]},"offset":"28018534"},"util.inspect.js":{"size":42,"integrity":{"algorithm":"SHA256","hash":"bb49299375c82d8d22983b76f6c25cd9ac923dc61cd25fffe9b3f71dad26dc40","blockSize":4194304,"blocks":["bb49299375c82d8d22983b76f6c25cd9ac923dc61cd25fffe9b3f71dad26dc40"]},"offset":"28019068"},".github":{"files":{"FUNDING.yml":{"size":585,"integrity":{"algorithm":"SHA256","hash":"c5d7d674c3932a7e2962b172028b54a41540916a991cdd9ee0bf60f901eb00ae","blockSize":4194304,"blocks":["c5d7d674c3932a7e2962b172028b54a41540916a991cdd9ee0bf60f901eb00ae"]},"offset":"28019110"}}}}},"object-keys":{"files":{".editorconfig":{"size":276,"integrity":{"algorithm":"SHA256","hash":"ede54e8b6b96147c61efd0ddc56d3683508a26066a8baabd63673d2779a06f23","blockSize":4194304,"blocks":["ede54e8b6b96147c61efd0ddc56d3683508a26066a8baabd63673d2779a06f23"]},"offset":"28019695"},"LICENSE":{"size":1080,"integrity":{"algorithm":"SHA256","hash":"5640e5cbe2e9f57f6ccfdd8dbfbeadb875495bdbcb69d2666ce3177ccd0942e4","blockSize":4194304,"blocks":["5640e5cbe2e9f57f6ccfdd8dbfbeadb875495bdbcb69d2666ce3177ccd0942e4"]},"offset":"28019971"},"implementation.js":{"size":3218,"integrity":{"algorithm":"SHA256","hash":"4dd43bf86b886f6adc16aa34b2f0d3a27b92ecf65adcb87224e54cd394d2024c","blockSize":4194304,"blocks":["4dd43bf86b886f6adc16aa34b2f0d3a27b92ecf65adcb87224e54cd394d2024c"]},"offset":"28021051"},"index.js":{"size":823,"integrity":{"algorithm":"SHA256","hash":"4004588aa7a3769d8c34ef9a837e1632237487e53ed57caec51bfcc6668f2c29","blockSize":4194304,"blocks":["4004588aa7a3769d8c34ef9a837e1632237487e53ed57caec51bfcc6668f2c29"]},"offset":"28024269"},"isArguments.js":{"size":422,"integrity":{"algorithm":"SHA256","hash":"31f36ded2784150b7480f56ca42e7fda6e119d4345d5884a4d5f55e13fe6ac30","blockSize":4194304,"blocks":["31f36ded2784150b7480f56ca42e7fda6e119d4345d5884a4d5f55e13fe6ac30"]},"offset":"28025092"},"package.json":{"size":1122,"integrity":{"algorithm":"SHA256","hash":"d1e325bd53dfddbafb1cb668c83046f4a4174cc2673d33eced156c74744e7ea2","blockSize":4194304,"blocks":["d1e325bd53dfddbafb1cb668c83046f4a4174cc2673d33eced156c74744e7ea2"]},"offset":"28025514"}}},"object.assign":{"files":{".editorconfig":{"size":286,"integrity":{"algorithm":"SHA256","hash":"0a73be687a86b6f0e5494b1be555fcfbb886108794948837170c28f18820aae2","blockSize":4194304,"blocks":["0a73be687a86b6f0e5494b1be555fcfbb886108794948837170c28f18820aae2"]},"offset":"28026636"},".eslintignore":{"size":6,"integrity":{"algorithm":"SHA256","hash":"ed19d3c9c8a5e34d0179e0b1a9c2907d2e657738733e4a432a8cf81c76ce56f1","blockSize":4194304,"blocks":["ed19d3c9c8a5e34d0179e0b1a9c2907d2e657738733e4a432a8cf81c76ce56f1"]},"offset":"28026922"},".nycrc":{"size":232,"integrity":{"algorithm":"SHA256","hash":"900aab98b1715b85a00a47a5483331d8e54c39cc7da4e43f69506f49ad265826","blockSize":4194304,"blocks":["900aab98b1715b85a00a47a5483331d8e54c39cc7da4e43f69506f49ad265826"]},"offset":"28026928"},"LICENSE":{"size":1080,"integrity":{"algorithm":"SHA256","hash":"a596744eec6b05682ed972bf93937668bbc8da2caed93fbf6510389de019b5c0","blockSize":4194304,"blocks":["a596744eec6b05682ed972bf93937668bbc8da2caed93fbf6510389de019b5c0"]},"offset":"28027160"},"auto.js":{"size":36,"integrity":{"algorithm":"SHA256","hash":"8a28142fdc864763727d7cfe6a19b5dbcdf5e1861207bd2c122082336a6c3221","blockSize":4194304,"blocks":["8a28142fdc864763727d7cfe6a19b5dbcdf5e1861207bd2c122082336a6c3221"]},"offset":"28028240"},"hasSymbols.js":{"size":1618,"integrity":{"algorithm":"SHA256","hash":"a717ad59c4c930631c0dc207bea045ebd4f4902a19c46f228547ef619ee56177","blockSize":4194304,"blocks":["a717ad59c4c930631c0dc207bea045ebd4f4902a19c46f228547ef619ee56177"]},"offset":"28028276"},"implementation.js":{"size":1329,"integrity":{"algorithm":"SHA256","hash":"c2e69423b531bfcb33e9109f230042b298992da8093a803dac0f6c33e6fb224a","blockSize":4194304,"blocks":["c2e69423b531bfcb33e9109f230042b298992da8093a803dac0f6c33e6fb224a"]},"offset":"28029894"},"index.js":{"size":532,"integrity":{"algorithm":"SHA256","hash":"45465072113bc10047855ba4452a49b8b574d724044e586849fb2c05b530e065","blockSize":4194304,"blocks":["45465072113bc10047855ba4452a49b8b574d724044e586849fb2c05b530e065"]},"offset":"28031223"},"package.json":{"size":1377,"integrity":{"algorithm":"SHA256","hash":"50ddd56718f551cad33392fa271e1cb3e76ba75c88935d8d7ad146c3a82a7499","blockSize":4194304,"blocks":["50ddd56718f551cad33392fa271e1cb3e76ba75c88935d8d7ad146c3a82a7499"]},"offset":"28031755"},"polyfill.js":{"size":1299,"integrity":{"algorithm":"SHA256","hash":"a3eb71f8c21fb517b6f96e1ff01aca5eafd506fbb2959e75b45223eca64c5385","blockSize":4194304,"blocks":["a3eb71f8c21fb517b6f96e1ff01aca5eafd506fbb2959e75b45223eca64c5385"]},"offset":"28033132"},"shim.js":{"size":305,"integrity":{"algorithm":"SHA256","hash":"ed1a380ff16613281554af36e4a11990274555c6de27de9f14359598a7fc58b7","blockSize":4194304,"blocks":["ed1a380ff16613281554af36e4a11990274555c6de27de9f14359598a7fc58b7"]},"offset":"28034431"},"dist":{"files":{"browser.js":{"size":28211,"integrity":{"algorithm":"SHA256","hash":"a4600a8a8c96a434c68d8a0a7714a28c5d41e394d8eccd58ba981b8aff6e8638","blockSize":4194304,"blocks":["a4600a8a8c96a434c68d8a0a7714a28c5d41e394d8eccd58ba981b8aff6e8638"]},"offset":"28034736"}}},".github":{"files":{"FUNDING.yml":{"size":584,"integrity":{"algorithm":"SHA256","hash":"d18562f467d6d6fc294f0773c95e732128eab5bf0de1ec2362debd587203bc4d","blockSize":4194304,"blocks":["d18562f467d6d6fc294f0773c95e732128eab5bf0de1ec2362debd587203bc4d"]},"offset":"28062947"},"workflows":{"files":{"rebase.yml":{"size":257,"integrity":{"algorithm":"SHA256","hash":"4eef02d22e2ad89a965c7cf160c48803c30e2ab84f84636070519aa5d637b69a","blockSize":4194304,"blocks":["4eef02d22e2ad89a965c7cf160c48803c30e2ab84f84636070519aa5d637b69a"]},"offset":"28063531"},"require-allow-edits.yml":{"size":254,"integrity":{"algorithm":"SHA256","hash":"578da8642d8ffa52ea2eeb7ad429647036120c104832dd49e267370dd467a947","blockSize":4194304,"blocks":["578da8642d8ffa52ea2eeb7ad429647036120c104832dd49e267370dd467a947"]},"offset":"28063788"}}}}}}},"on-finished":{"files":{"HISTORY.md":{"size":1865,"integrity":{"algorithm":"SHA256","hash":"1954661afcaee2b2e961f1b56dc9694f3074608def2a4ae75f7b1203d18086ca","blockSize":4194304,"blocks":["1954661afcaee2b2e961f1b56dc9694f3074608def2a4ae75f7b1203d18086ca"]},"offset":"28064042"},"LICENSE":{"size":1167,"integrity":{"algorithm":"SHA256","hash":"8089bcc08845ec143e5761f4a101a65b8c792a0dedbfeeb90a15560c0b77f768","blockSize":4194304,"blocks":["8089bcc08845ec143e5761f4a101a65b8c792a0dedbfeeb90a15560c0b77f768"]},"offset":"28065907"},"index.js":{"size":4430,"integrity":{"algorithm":"SHA256","hash":"8e16bae14ec63bac9cdbb50572a7b53061fee914712f5e803ff03c44e8845276","blockSize":4194304,"blocks":["8e16bae14ec63bac9cdbb50572a7b53061fee914712f5e803ff03c44e8845276"]},"offset":"28067074"},"package.json":{"size":669,"integrity":{"algorithm":"SHA256","hash":"288983bffaa373cdd52ded4b3f905cfe39bc9d0c93188c10d396bd8ab8e63851","blockSize":4194304,"blocks":["288983bffaa373cdd52ded4b3f905cfe39bc9d0c93188c10d396bd8ab8e63851"]},"offset":"28071504"}}},"once":{"files":{"LICENSE":{"size":765,"integrity":{"algorithm":"SHA256","hash":"4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b","blockSize":4194304,"blocks":["4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b"]},"offset":"28072173"},"once.js":{"size":935,"integrity":{"algorithm":"SHA256","hash":"3db73e347ecbdbafdf8d0db85145c877e133f5372e767360ef90c09f70ac5103","blockSize":4194304,"blocks":["3db73e347ecbdbafdf8d0db85145c877e133f5372e767360ef90c09f70ac5103"]},"offset":"28072938"},"package.json":{"size":452,"integrity":{"algorithm":"SHA256","hash":"fa72703fdfef576c9de9d444f92ee28fc4143580569a1272f4baa55f95c7154c","blockSize":4194304,"blocks":["fa72703fdfef576c9de9d444f92ee28fc4143580569a1272f4baa55f95c7154c"]},"offset":"28073873"}}},"open":{"files":{"index.js":{"size":7515,"integrity":{"algorithm":"SHA256","hash":"de80461f9d36016a61399fc638e5acdaad423079c44ea70da35e1290f63599b3","blockSize":4194304,"blocks":["de80461f9d36016a61399fc638e5acdaad423079c44ea70da35e1290f63599b3"]},"offset":"28074325"},"license":{"size":1117,"integrity":{"algorithm":"SHA256","hash":"5c932d88256b4ab958f64a856fa48e8bd1f55bc1d96b8149c65689e0c61789d3","blockSize":4194304,"blocks":["5c932d88256b4ab958f64a856fa48e8bd1f55bc1d96b8149c65689e0c61789d3"]},"offset":"28081840"},"package.json":{"size":696,"integrity":{"algorithm":"SHA256","hash":"7fdb1e60fdd5612db6820224487ffc1684be2d755fbc7e3b9588518bde0db697","blockSize":4194304,"blocks":["7fdb1e60fdd5612db6820224487ffc1684be2d755fbc7e3b9588518bde0db697"]},"offset":"28082957"},"xdg-open":{"size":25778,"integrity":{"algorithm":"SHA256","hash":"2e79a4d5171dd384d20a75b023dfe0e9f4330cdb5d441f6c3859a11fce3db51a","blockSize":4194304,"blocks":["2e79a4d5171dd384d20a75b023dfe0e9f4330cdb5d441f6c3859a11fce3db51a"]},"offset":"28083653"}}},"p-map":{"files":{"index.js":{"size":1640,"integrity":{"algorithm":"SHA256","hash":"0948a5674610f016c9fc9cb00e966c30e4b569ecaf6c59ceb59da956c831e208","blockSize":4194304,"blocks":["0948a5674610f016c9fc9cb00e966c30e4b569ecaf6c59ceb59da956c831e208"]},"offset":"28109431"},"license":{"size":1117,"integrity":{"algorithm":"SHA256","hash":"5c932d88256b4ab958f64a856fa48e8bd1f55bc1d96b8149c65689e0c61789d3","blockSize":4194304,"blocks":["5c932d88256b4ab958f64a856fa48e8bd1f55bc1d96b8149c65689e0c61789d3"]},"offset":"28111071"},"package.json":{"size":675,"integrity":{"algorithm":"SHA256","hash":"9be702e7ed1811e100ee62b991ce4846443522d5cbba2eb136acf355c0df79d4","blockSize":4194304,"blocks":["9be702e7ed1811e100ee62b991ce4846443522d5cbba2eb136acf355c0df79d4"]},"offset":"28112188"}}},"parseurl":{"files":{"HISTORY.md":{"size":1043,"integrity":{"algorithm":"SHA256","hash":"aa6e5cd75ddde03b54623af11e6aeb6f92ccf6a1c69805b20890228182030189","blockSize":4194304,"blocks":["aa6e5cd75ddde03b54623af11e6aeb6f92ccf6a1c69805b20890228182030189"]},"offset":"28112863"},"LICENSE":{"size":1173,"integrity":{"algorithm":"SHA256","hash":"11d017c3b9f1ee3f44caf7203035f0461d5b57e0db8ce1bc03a9af34fa7d3f6b","blockSize":4194304,"blocks":["11d017c3b9f1ee3f44caf7203035f0461d5b57e0db8ce1bc03a9af34fa7d3f6b"]},"offset":"28113906"},"index.js":{"size":2809,"integrity":{"algorithm":"SHA256","hash":"811223d4a19492ccc642384dc84f0af4ad935557dfe8f63750d7ffd673e40f17","blockSize":4194304,"blocks":["811223d4a19492ccc642384dc84f0af4ad935557dfe8f63750d7ffd673e40f17"]},"offset":"28115079"},"package.json":{"size":657,"integrity":{"algorithm":"SHA256","hash":"dcdd7900acf463a0223948001377aa953cce39e95b70ce14f9479d4b0fbccc22","blockSize":4194304,"blocks":["dcdd7900acf463a0223948001377aa953cce39e95b70ce14f9479d4b0fbccc22"]},"offset":"28117888"}}},"path-is-absolute":{"files":{"index.js":{"size":611,"integrity":{"algorithm":"SHA256","hash":"4eb1119c3eeccc4d8e8841b77d062abaf4572b332801f5b16175bc3311b5d8f1","blockSize":4194304,"blocks":["4eb1119c3eeccc4d8e8841b77d062abaf4572b332801f5b16175bc3311b5d8f1"]},"offset":"28118545"},"license":{"size":1119,"integrity":{"algorithm":"SHA256","hash":"6fb9754611c20f6649f68805e8c990e83261f29316e29de9e6cedae607b8634c","blockSize":4194304,"blocks":["6fb9754611c20f6649f68805e8c990e83261f29316e29de9e6cedae607b8634c"]},"offset":"28119156"},"package.json":{"size":424,"integrity":{"algorithm":"SHA256","hash":"1d0ad40ecaa004d97b4db97bc3462e3c7751aa144bcd161151ea08e4feedfa18","blockSize":4194304,"blocks":["1d0ad40ecaa004d97b4db97bc3462e3c7751aa144bcd161151ea08e4feedfa18"]},"offset":"28120275"}}},"path-to-regexp":{"files":{"History.md":{"size":694,"integrity":{"algorithm":"SHA256","hash":"ee1e90f5f384416a9b98e8c7e99965a333980f0990f30220a8fc788063627d68","blockSize":4194304,"blocks":["ee1e90f5f384416a9b98e8c7e99965a333980f0990f30220a8fc788063627d68"]},"offset":"28120699"},"LICENSE":{"size":1103,"integrity":{"algorithm":"SHA256","hash":"4eeb3271453a891df609e5a9f4ee79a68307f730c13417a3bfeffa604ac8cf25","blockSize":4194304,"blocks":["4eeb3271453a891df609e5a9f4ee79a68307f730c13417a3bfeffa604ac8cf25"]},"offset":"28121393"},"index.js":{"size":3328,"integrity":{"algorithm":"SHA256","hash":"c6fca7c07d17e676c51896b785576a118ccffa934959ddcee7ed106d3f8d4d01","blockSize":4194304,"blocks":["c6fca7c07d17e676c51896b785576a118ccffa934959ddcee7ed106d3f8d4d01"]},"offset":"28122496"},"package.json":{"size":437,"integrity":{"algorithm":"SHA256","hash":"5644a920fe9baa963638d850de5fdfb7053bf27cf083579d62700bc97a7d3fc4","blockSize":4194304,"blocks":["5644a920fe9baa963638d850de5fdfb7053bf27cf083579d62700bc97a7d3fc4"]},"offset":"28125824"}}},"pg-connection-string":{"files":{"LICENSE":{"size":1082,"integrity":{"algorithm":"SHA256","hash":"2244b5486c4427001b6756a87b9a297d427c111dcc3ba64a097492a8979c23d0","blockSize":4194304,"blocks":["2244b5486c4427001b6756a87b9a297d427c111dcc3ba64a097492a8979c23d0"]},"offset":"28126261"},"index.js":{"size":2674,"integrity":{"algorithm":"SHA256","hash":"31f7ee0217071ac22b33cd77ac0acf4275e441adf9fb18c21311daaf241964e2","blockSize":4194304,"blocks":["31f7ee0217071ac22b33cd77ac0acf4275e441adf9fb18c21311daaf241964e2"]},"offset":"28127343"},"package.json":{"size":703,"integrity":{"algorithm":"SHA256","hash":"7822eecfe6c86790f0fc4e484ca6fc853b125aeaedc8ac4e192b3f8b2dc93628","blockSize":4194304,"blocks":["7822eecfe6c86790f0fc4e484ca6fc853b125aeaedc8ac4e192b3f8b2dc93628"]},"offset":"28130017"}}},"pony-cause":{"files":{"LICENSE":{"size":673,"integrity":{"algorithm":"SHA256","hash":"15510a68b9227da4bf8ca52d0b19ad102fae1d674a074d0d3fa625b93db2d3d9","blockSize":4194304,"blocks":["15510a68b9227da4bf8ca52d0b19ad102fae1d674a074d0d3fa625b93db2d3d9"]},"offset":"28130720"},"index.js":{"size":665,"integrity":{"algorithm":"SHA256","hash":"af3dd36f49f8922f9fb9456f38ecf2f5b7a33b4914672c3700822ef982c92b6e","blockSize":4194304,"blocks":["af3dd36f49f8922f9fb9456f38ecf2f5b7a33b4914672c3700822ef982c92b6e"]},"offset":"28131393"},"index.mjs":{"size":195,"integrity":{"algorithm":"SHA256","hash":"7e11ae7d089511ebd354c5318bbc1e2da99fa31d84d48833320b7f6ef3e465ae","blockSize":4194304,"blocks":["7e11ae7d089511ebd354c5318bbc1e2da99fa31d84d48833320b7f6ef3e465ae"]},"offset":"28132058"},"package.json":{"size":1896,"integrity":{"algorithm":"SHA256","hash":"56fbe47248a5e065f2392738d950744ee1eddea5d6c2243be2bd912cb7953fa5","blockSize":4194304,"blocks":["56fbe47248a5e065f2392738d950744ee1eddea5d6c2243be2bd912cb7953fa5"]},"offset":"28132253"},"lib":{"files":{"error-with-cause.js":{"size":576,"integrity":{"algorithm":"SHA256","hash":"c92463b74bf5b3e6c521e32bdfe1dcc11755a34f5b82388427e48252c4e24d88","blockSize":4194304,"blocks":["c92463b74bf5b3e6c521e32bdfe1dcc11755a34f5b82388427e48252c4e24d88"]},"offset":"28134149"},"error-with-cause.mjs":{"size":425,"integrity":{"algorithm":"SHA256","hash":"d02b77d6a32f462dc708df1394a18d69be2aa64dbce054db9c605f393cfbfe9b","blockSize":4194304,"blocks":["d02b77d6a32f462dc708df1394a18d69be2aa64dbce054db9c605f393cfbfe9b"]},"offset":"28134725"},"helpers.js":{"size":3425,"integrity":{"algorithm":"SHA256","hash":"d7fa460dca877b517131b7867e3a24d792d686188868ccb6f01fb44ed1bb56e9","blockSize":4194304,"blocks":["d7fa460dca877b517131b7867e3a24d792d686188868ccb6f01fb44ed1bb56e9"]},"offset":"28135150"},"helpers.mjs":{"size":3076,"integrity":{"algorithm":"SHA256","hash":"8254ead0390d7ba28f0523a7c618c41ef466f29915c203599730210d26620362","blockSize":4194304,"blocks":["8254ead0390d7ba28f0523a7c618c41ef466f29915c203599730210d26620362"]},"offset":"28138575"}}}}},"prebuild-install":{"files":{"CONTRIBUTING.md":{"size":218,"integrity":{"algorithm":"SHA256","hash":"e65a6c8971149d9c0bc4721cedcf99f86ec37df9fa7bdf28858ee4d59383c7bb","blockSize":4194304,"blocks":["e65a6c8971149d9c0bc4721cedcf99f86ec37df9fa7bdf28858ee4d59383c7bb"]},"offset":"28141651"},"LICENSE":{"size":1079,"integrity":{"algorithm":"SHA256","hash":"0aa9add6a9158efad3e6649e3affd607c7e2629f6677af19f9988c8fbb0757b0","blockSize":4194304,"blocks":["0aa9add6a9158efad3e6649e3affd607c7e2629f6677af19f9988c8fbb0757b0"]},"offset":"28141869"},"asset.js":{"size":1128,"integrity":{"algorithm":"SHA256","hash":"7d45fb08fb0829581dd00268f1d98f147b659d1cdd8b293d0ddd26fbda941a25","blockSize":4194304,"blocks":["7d45fb08fb0829581dd00268f1d98f147b659d1cdd8b293d0ddd26fbda941a25"]},"offset":"28142948"},"bin.js":{"size":2304,"integrity":{"algorithm":"SHA256","hash":"27e6a2d2e63549eb0b3c2d9a9067b7646f9157a120b7f345a12a1e20c997a998","blockSize":4194304,"blocks":["27e6a2d2e63549eb0b3c2d9a9067b7646f9157a120b7f345a12a1e20c997a998"]},"offset":"28144076"},"download.js":{"size":4098,"integrity":{"algorithm":"SHA256","hash":"91663d22ce22740be17b6f22868e3d2687ea5a759c50b75322f597f0f6ccfb15","blockSize":4194304,"blocks":["91663d22ce22740be17b6f22868e3d2687ea5a759c50b75322f597f0f6ccfb15"]},"offset":"28146380"},"error.js":{"size":355,"integrity":{"algorithm":"SHA256","hash":"0df3fa571a7fb2563113d8a7ea83c79e769830abbe7b5d5d9cd430c3ea893f68","blockSize":4194304,"blocks":["0df3fa571a7fb2563113d8a7ea83c79e769830abbe7b5d5d9cd430c3ea893f68"]},"offset":"28150478"},"help.txt":{"size":1079,"integrity":{"algorithm":"SHA256","hash":"e8e4b86f73fedb870c61bb8ebebe03ca817f33ff75f7bf75ba158e69224d52d6","blockSize":4194304,"blocks":["e8e4b86f73fedb870c61bb8ebebe03ca817f33ff75f7bf75ba158e69224d52d6"]},"offset":"28150833"},"index.js":{"size":41,"integrity":{"algorithm":"SHA256","hash":"51c1dae166a7da3717cc50ba36118c12f5351ff07a7d23d6dd53828bd857f5b6","blockSize":4194304,"blocks":["51c1dae166a7da3717cc50ba36118c12f5351ff07a7d23d6dd53828bd857f5b6"]},"offset":"28151912"},"log.js":{"size":627,"integrity":{"algorithm":"SHA256","hash":"0bf1d515cc020b8f18cfd91783b2905034cc6886b18a774a615eddfd96580bd9","blockSize":4194304,"blocks":["0bf1d515cc020b8f18cfd91783b2905034cc6886b18a774a615eddfd96580bd9"]},"offset":"28151953"},"package.json":{"size":1042,"integrity":{"algorithm":"SHA256","hash":"c7f3d48c5d56edb3a5739c7425748a567c7dfc7700ecbd1f21a21af63c4775eb","blockSize":4194304,"blocks":["c7f3d48c5d56edb3a5739c7425748a567c7dfc7700ecbd1f21a21af63c4775eb"]},"offset":"28152580"},"proxy.js":{"size":1147,"integrity":{"algorithm":"SHA256","hash":"ead9b672f19d036389a4d7c2e8712314f200837e8428402f4a0dad5d19cb744f","blockSize":4194304,"blocks":["ead9b672f19d036389a4d7c2e8712314f200837e8428402f4a0dad5d19cb744f"]},"offset":"28153622"},"rc.js":{"size":2133,"integrity":{"algorithm":"SHA256","hash":"a112308f308c194b38f0e5084b12e4b52779d7f3101b0471e01bc3fa66d60cda","blockSize":4194304,"blocks":["a112308f308c194b38f0e5084b12e4b52779d7f3101b0471e01bc3fa66d60cda"]},"offset":"28154769"},"util.js":{"size":4277,"integrity":{"algorithm":"SHA256","hash":"ab9df1695210f2062f3a12da860ae8a9ed0c8b5c0f90c74c71969d288a7689d7","blockSize":4194304,"blocks":["ab9df1695210f2062f3a12da860ae8a9ed0c8b5c0f90c74c71969d288a7689d7"]},"offset":"28156902"}}},"process":{"files":{"LICENSE":{"size":1098,"integrity":{"algorithm":"SHA256","hash":"59a400d04c5078579acc27ddd6452c1bdf763f9506e01364700935fbb1a7c91b","blockSize":4194304,"blocks":["59a400d04c5078579acc27ddd6452c1bdf763f9506e01364700935fbb1a7c91b"]},"offset":"28161179"},"browser.js":{"size":5418,"integrity":{"algorithm":"SHA256","hash":"a199f9fdd8f0f94be4bfe5407c4969d261aa6f080c372c1a359815dc6187f32c","blockSize":4194304,"blocks":["a199f9fdd8f0f94be4bfe5407c4969d261aa6f080c372c1a359815dc6187f32c"]},"offset":"28162277"},"index.js":{"size":96,"integrity":{"algorithm":"SHA256","hash":"6d7fc57639a3deb4b7cbd55eafae4d9e7b377873b9ce5e6a689e47711965912a","blockSize":4194304,"blocks":["6d7fc57639a3deb4b7cbd55eafae4d9e7b377873b9ce5e6a689e47711965912a"]},"offset":"28167695"},"package.json":{"size":449,"integrity":{"algorithm":"SHA256","hash":"2b8750f3e765e6a4efe3d630e8c6c24c23db3132c18066e733d6773c73e907b1","blockSize":4194304,"blocks":["2b8750f3e765e6a4efe3d630e8c6c24c23db3132c18066e733d6773c73e907b1"]},"offset":"28167791"}}},"promise-inflight":{"files":{"LICENSE":{"size":752,"integrity":{"algorithm":"SHA256","hash":"51ff8bfb2f9f25978427f17d2b65cae0f23fc6bfc9060e96fb2f5a7eac141631","blockSize":4194304,"blocks":["51ff8bfb2f9f25978427f17d2b65cae0f23fc6bfc9060e96fb2f5a7eac141631"]},"offset":"28168240"},"inflight.js":{"size":842,"integrity":{"algorithm":"SHA256","hash":"6a6018ee750117314d70e541ac5ae86ab080a417f8d01bb7e931917ca3c6a0c7","blockSize":4194304,"blocks":["6a6018ee750117314d70e541ac5ae86ab080a417f8d01bb7e931917ca3c6a0c7"]},"offset":"28168992"},"package.json":{"size":493,"integrity":{"algorithm":"SHA256","hash":"caa44571780420a566a793ba0e3cb0edd1cbf30b9259043caad1a43a90730d38","blockSize":4194304,"blocks":["caa44571780420a566a793ba0e3cb0edd1cbf30b9259043caad1a43a90730d38"]},"offset":"28169834"}}},"promise-retry":{"files":{".editorconfig":{"size":220,"integrity":{"algorithm":"SHA256","hash":"3161426dccb7cd128d19b3bad714a0feab0e13cfd276d6296fdf1a2bc895ad4d","blockSize":4194304,"blocks":["3161426dccb7cd128d19b3bad714a0feab0e13cfd276d6296fdf1a2bc895ad4d"]},"offset":"28170327"},"LICENSE":{"size":1056,"integrity":{"algorithm":"SHA256","hash":"b1344bd78ebcbf8a359225ec444d038a653c6a5f9ecf405a50d4a5c11fbf27d1","blockSize":4194304,"blocks":["b1344bd78ebcbf8a359225ec444d038a653c6a5f9ecf405a50d4a5c11fbf27d1"]},"offset":"28170547"},"index.js":{"size":1378,"integrity":{"algorithm":"SHA256","hash":"93c1b8ff5fd1fdb14105573d7eec21351894ce3c5f86090ca6a33fb89d65d559","blockSize":4194304,"blocks":["93c1b8ff5fd1fdb14105573d7eec21351894ce3c5f86090ca6a33fb89d65d559"]},"offset":"28171603"},"package.json":{"size":606,"integrity":{"algorithm":"SHA256","hash":"8578c39257f370a9b55345648262f4f8843e3382ea8d10ca6827f013e267a860","blockSize":4194304,"blocks":["8578c39257f370a9b55345648262f4f8843e3382ea8d10ca6827f013e267a860"]},"offset":"28172981"},"node_modules":{"files":{"retry":{"files":{"License":{"size":1139,"integrity":{"algorithm":"SHA256","hash":"01ad164273e8e095abc9dbd1c21e194594a671af7d528cb43ee7b4c903ba7da3","blockSize":4194304,"blocks":["01ad164273e8e095abc9dbd1c21e194594a671af7d528cb43ee7b4c903ba7da3"]},"offset":"43311346"},"Makefile":{"size":312,"integrity":{"algorithm":"SHA256","hash":"7ca871146d4f446b640251fdee4e8b7e002c5cf502c924343764d076c5e2622e","blockSize":4194304,"blocks":["7ca871146d4f446b640251fdee4e8b7e002c5cf502c924343764d076c5e2622e"]},"offset":"43312485"},"equation.gif":{"size":1209,"integrity":{"algorithm":"SHA256","hash":"ea0b38ba378f11e2adb20e868061ded1bf0b4973c92aa3317bf2710724343c38","blockSize":4194304,"blocks":["ea0b38ba378f11e2adb20e868061ded1bf0b4973c92aa3317bf2710724343c38"]},"offset":"43312797"},"index.js":{"size":40,"integrity":{"algorithm":"SHA256","hash":"003f04e5fb5913675c886ac938e9b7bbd33754eb17ee8f00e074e1bf888bec1e","blockSize":4194304,"blocks":["003f04e5fb5913675c886ac938e9b7bbd33754eb17ee8f00e074e1bf888bec1e"]},"offset":"43314006"},"package.json":{"size":609,"integrity":{"algorithm":"SHA256","hash":"0bb3db7c27964ff55c6b5b92afe393ef2db3015e0e81ccc42ccb7fd972a1b087","blockSize":4194304,"blocks":["0bb3db7c27964ff55c6b5b92afe393ef2db3015e0e81ccc42ccb7fd972a1b087"]},"offset":"43314046"},"lib":{"files":{"retry.js":{"size":2298,"integrity":{"algorithm":"SHA256","hash":"4388d78729faa0dea430e2a7fa572aee6a15a407da05097b41ee44106d336616","blockSize":4194304,"blocks":["4388d78729faa0dea430e2a7fa572aee6a15a407da05097b41ee44106d336616"]},"offset":"43314655"},"retry_operation.js":{"size":3657,"integrity":{"algorithm":"SHA256","hash":"eaca13037da35523326c8870e39c4fd236c4f38b5822a2af0f33d0f4e0b21d02","blockSize":4194304,"blocks":["eaca13037da35523326c8870e39c4fd236c4f38b5822a2af0f33d0f4e0b21d02"]},"offset":"43316953"}}}}}}}}},"proxy-addr":{"files":{"HISTORY.md":{"size":2991,"integrity":{"algorithm":"SHA256","hash":"9bbb818f8492ddca7ba1454d43ea2b3e956cccd1d56ae4ab8b85d9560903b364","blockSize":4194304,"blocks":["9bbb818f8492ddca7ba1454d43ea2b3e956cccd1d56ae4ab8b85d9560903b364"]},"offset":"28173587"},"LICENSE":{"size":1094,"integrity":{"algorithm":"SHA256","hash":"a7996721249a136fbcfc1c201bcb5f414f38a701d4a24f28abe65e16cfcce813","blockSize":4194304,"blocks":["a7996721249a136fbcfc1c201bcb5f414f38a701d4a24f28abe65e16cfcce813"]},"offset":"28176578"},"index.js":{"size":6000,"integrity":{"algorithm":"SHA256","hash":"c586f959f09961edc6e261d9404455fce40998a221f71d44833bb4b12796c33c","blockSize":4194304,"blocks":["c586f959f09961edc6e261d9404455fce40998a221f71d44833bb4b12796c33c"]},"offset":"28177672"},"package.json":{"size":842,"integrity":{"algorithm":"SHA256","hash":"df60228c68aa6b983dde2643274f1217b45d303dd5081b75ae11eaef48ad0b2e","blockSize":4194304,"blocks":["df60228c68aa6b983dde2643274f1217b45d303dd5081b75ae11eaef48ad0b2e"]},"offset":"28183672"},"node_modules":{"files":{"ipaddr.js":{"files":{"LICENSE":{"size":1087,"integrity":{"algorithm":"SHA256","hash":"62568a2d1337b77171ecca9db10579163446de1ba6151678e81f06cdc199971b","blockSize":4194304,"blocks":["62568a2d1337b77171ecca9db10579163446de1ba6151678e81f06cdc199971b"]},"offset":"43320610"},"ipaddr.min.js":{"size":9738,"integrity":{"algorithm":"SHA256","hash":"ab95215c182a1bea49617080dc12e52e3e80521894c37ce0478b69326c151440","blockSize":4194304,"blocks":["ab95215c182a1bea49617080dc12e52e3e80521894c37ce0478b69326c151440"]},"offset":"43321697"},"package.json":{"size":614,"integrity":{"algorithm":"SHA256","hash":"1e20a84d13738a87de1ff5cda2cb241c2f923389e8e64d98818d416211baf037","blockSize":4194304,"blocks":["1e20a84d13738a87de1ff5cda2cb241c2f923389e8e64d98818d416211baf037"]},"offset":"43331435"},"lib":{"files":{"ipaddr.js":{"size":19333,"integrity":{"algorithm":"SHA256","hash":"d82a21a6872925dfe73e9aa10e9eb47baba398987560e36db107f44d92f069b0","blockSize":4194304,"blocks":["d82a21a6872925dfe73e9aa10e9eb47baba398987560e36db107f44d92f069b0"]},"offset":"43332049"}}}}}}}}},"psl":{"files":{".env":{"size":0,"integrity":{"algorithm":"SHA256","hash":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","blockSize":4194304,"blocks":[]},"offset":"28184514"},"LICENSE":{"size":1101,"integrity":{"algorithm":"SHA256","hash":"ae8c4a3b09681bc30ecbc984d58c4dc2c21b56d320fc02f558d12e86995c26c8","blockSize":4194304,"blocks":["ae8c4a3b09681bc30ecbc984d58c4dc2c21b56d320fc02f558d12e86995c26c8"]},"offset":"28184514"},"browserstack-logo.svg":{"size":7552,"integrity":{"algorithm":"SHA256","hash":"ccf7c763424ff6c301ae8bf8056cbaa6aedac0b4fdfd3ea4ec59ae1f5487d6f9","blockSize":4194304,"blocks":["ccf7c763424ff6c301ae8bf8056cbaa6aedac0b4fdfd3ea4ec59ae1f5487d6f9"]},"offset":"28185615"},"index.js":{"size":6036,"integrity":{"algorithm":"SHA256","hash":"b031d76949a9fa16597773062d56615533b45fe856e131b395dcf8be9ffa99d3","blockSize":4194304,"blocks":["b031d76949a9fa16597773062d56615533b45fe856e131b395dcf8be9ffa99d3"]},"offset":"28193167"},"package.json":{"size":757,"integrity":{"algorithm":"SHA256","hash":"83abd3b74f819d7fe39527c52ada9938c8bfc8638692b6063f143d5d4bcfa7ee","blockSize":4194304,"blocks":["83abd3b74f819d7fe39527c52ada9938c8bfc8638692b6063f143d5d4bcfa7ee"]},"offset":"28199203"},"dist":{"files":{"psl.js":{"size":162079,"integrity":{"algorithm":"SHA256","hash":"4d33476d4f2645c3e21e5c68c521578304405df3c197edc73cbe4de80b65585d","blockSize":4194304,"blocks":["4d33476d4f2645c3e21e5c68c521578304405df3c197edc73cbe4de80b65585d"]},"offset":"28199960"},"psl.min.js":{"size":136713,"integrity":{"algorithm":"SHA256","hash":"a465d8738f3558860d654b0ab9b2b10b1414c9d84dae53394bc83978c53c7ddc","blockSize":4194304,"blocks":["a465d8738f3558860d654b0ab9b2b10b1414c9d84dae53394bc83978c53c7ddc"]},"offset":"28362039"}}},"data":{"files":{"rules.json":{"size":140170,"integrity":{"algorithm":"SHA256","hash":"414d0347d274bc1425c7e0263a99b242103e5b1f8f60d8d92bf6c1dab617a485","blockSize":4194304,"blocks":["414d0347d274bc1425c7e0263a99b242103e5b1f8f60d8d92bf6c1dab617a485"]},"offset":"28498752"}}}}},"pump":{"files":{"LICENSE":{"size":1078,"integrity":{"algorithm":"SHA256","hash":"3fe8d55a98dbf260eace67c00cf9bc53edb46234e840098a0b93df3096b97fb6","blockSize":4194304,"blocks":["3fe8d55a98dbf260eace67c00cf9bc53edb46234e840098a0b93df3096b97fb6"]},"offset":"28638922"},"index.js":{"size":2224,"integrity":{"algorithm":"SHA256","hash":"60ae01725219c69e086e0cfe6a6da1f94a9bafcfbf528460b6e04b7b6d983165","blockSize":4194304,"blocks":["60ae01725219c69e086e0cfe6a6da1f94a9bafcfbf528460b6e04b7b6d983165"]},"offset":"28640000"},"package.json":{"size":375,"integrity":{"algorithm":"SHA256","hash":"e367dc856e596bbc98ff06b077cc5f4a66ffc31d185f1e9b7b89f875c0ec3faf","blockSize":4194304,"blocks":["e367dc856e596bbc98ff06b077cc5f4a66ffc31d185f1e9b7b89f875c0ec3faf"]},"offset":"28642224"},"test-browser.js":{"size":1172,"integrity":{"algorithm":"SHA256","hash":"bfdd31d421d9975519122715df56e81662abf283e386bda1d7141ef277f70191","blockSize":4194304,"blocks":["bfdd31d421d9975519122715df56e81662abf283e386bda1d7141ef277f70191"]},"offset":"28642599"},"test-node.js":{"size":992,"integrity":{"algorithm":"SHA256","hash":"04b7b585e056fccea011f300815d9f19afb190b7c88f5bc575aeac8b5dd00ded","blockSize":4194304,"blocks":["04b7b585e056fccea011f300815d9f19afb190b7c88f5bc575aeac8b5dd00ded"]},"offset":"28643771"}}},"punycode":{"files":{"LICENSE-MIT.txt":{"size":1077,"integrity":{"algorithm":"SHA256","hash":"483acb265f182907d1caf6cff9c16c96f31325ed23792832cc5d8b12d5f88c8a","blockSize":4194304,"blocks":["483acb265f182907d1caf6cff9c16c96f31325ed23792832cc5d8b12d5f88c8a"]},"offset":"28644763"},"package.json":{"size":748,"integrity":{"algorithm":"SHA256","hash":"72d526ea4b7d15a23a75669bd420816e78a86316170d7bdc45d7998acb0f2d23","blockSize":4194304,"blocks":["72d526ea4b7d15a23a75669bd420816e78a86316170d7bdc45d7998acb0f2d23"]},"offset":"28645840"},"punycode.es6.js":{"size":12630,"integrity":{"algorithm":"SHA256","hash":"58f3361f52a4e5cc63aca491632eb80293853b3929df55c161c8ba526b858aa0","blockSize":4194304,"blocks":["58f3361f52a4e5cc63aca491632eb80293853b3929df55c161c8ba526b858aa0"]},"offset":"28646588"},"punycode.js":{"size":12561,"integrity":{"algorithm":"SHA256","hash":"df0d890ad33a232fbbc7f2d957e1341a52830d0e114586a80f60cced808abe04","blockSize":4194304,"blocks":["df0d890ad33a232fbbc7f2d957e1341a52830d0e114586a80f60cced808abe04"]},"offset":"28659218"}}},"qs":{"files":{".editorconfig":{"size":569,"integrity":{"algorithm":"SHA256","hash":"e88eb6d645d1e89ac4948b93df420c7798a6a5ea51e4d021246ccacd6b43c639","blockSize":4194304,"blocks":["e88eb6d645d1e89ac4948b93df420c7798a6a5ea51e4d021246ccacd6b43c639"]},"offset":"28671779"},".nycrc":{"size":216,"integrity":{"algorithm":"SHA256","hash":"7e1e3a52df079fc764989d75b3aaf5228228c841978e0c9201d1f394c1fd2655","blockSize":4194304,"blocks":["7e1e3a52df079fc764989d75b3aaf5228228c841978e0c9201d1f394c1fd2655"]},"offset":"28672348"},"LICENSE.md":{"size":1600,"integrity":{"algorithm":"SHA256","hash":"e7dc37bf662d7f786efcb46c545615e70c1daf458a38385521c63cf6607cdfe1","blockSize":4194304,"blocks":["e7dc37bf662d7f786efcb46c545615e70c1daf458a38385521c63cf6607cdfe1"]},"offset":"28672564"},"package.json":{"size":1143,"integrity":{"algorithm":"SHA256","hash":"45edde0fc266cf578f14d74ed2d43f1bde660debd80eb564ca440793321f5cfd","blockSize":4194304,"blocks":["45edde0fc266cf578f14d74ed2d43f1bde660debd80eb564ca440793321f5cfd"]},"offset":"28674164"},"lib":{"files":{"formats.js":{"size":476,"integrity":{"algorithm":"SHA256","hash":"d4e3de8b5a4c94865d8acd6f1c7538144732d466769661160bc0bf6ec9db3f4f","blockSize":4194304,"blocks":["d4e3de8b5a4c94865d8acd6f1c7538144732d466769661160bc0bf6ec9db3f4f"]},"offset":"28675307"},"index.js":{"size":211,"integrity":{"algorithm":"SHA256","hash":"8f4e02eef6ccc43f2b7448c18ae209281c8e9af9807cad491df67450e3817a95","blockSize":4194304,"blocks":["8f4e02eef6ccc43f2b7448c18ae209281c8e9af9807cad491df67450e3817a95"]},"offset":"28675783"},"parse.js":{"size":9380,"integrity":{"algorithm":"SHA256","hash":"9611d65366166f5f826b647f6f2dc25ad94eb5d0259e9646bfd13784dfce907c","blockSize":4194304,"blocks":["9611d65366166f5f826b647f6f2dc25ad94eb5d0259e9646bfd13784dfce907c"]},"offset":"28675994"},"stringify.js":{"size":10358,"integrity":{"algorithm":"SHA256","hash":"62c4b11841066e8a50a8f53b67dca13daea011dd3f6244456ea25ec2bbe5d834","blockSize":4194304,"blocks":["62c4b11841066e8a50a8f53b67dca13daea011dd3f6244456ea25ec2bbe5d834"]},"offset":"28685374"},"utils.js":{"size":6823,"integrity":{"algorithm":"SHA256","hash":"1a360b096b61cb5d5260e6543ed032677d7dcadb0bcf9ba5c42833ca75622e9b","blockSize":4194304,"blocks":["1a360b096b61cb5d5260e6543ed032677d7dcadb0bcf9ba5c42833ca75622e9b"]},"offset":"28695732"}}},"dist":{"files":{"qs.js":{"size":69136,"integrity":{"algorithm":"SHA256","hash":"27d7d7811ddfa98771316d5dc83bbd370e81b982ce982a12ee0a0e319fd20964","blockSize":4194304,"blocks":["27d7d7811ddfa98771316d5dc83bbd370e81b982ce982a12ee0a0e319fd20964"]},"offset":"28702555"}}},".github":{"files":{"FUNDING.yml":{"size":548,"integrity":{"algorithm":"SHA256","hash":"367b5d545d7a66684895ee7efd987130e83018491a7b2f72f25c0b062157ad90","blockSize":4194304,"blocks":["367b5d545d7a66684895ee7efd987130e83018491a7b2f72f25c0b062157ad90"]},"offset":"28771691"}}}}},"ramda":{"files":{"LICENSE.txt":{"size":1103,"integrity":{"algorithm":"SHA256","hash":"02bae6f2aba9f527f23f7045de4422890c7ffe91a2bcca6e09764af7f1ec9ae8","blockSize":4194304,"blocks":["02bae6f2aba9f527f23f7045de4422890c7ffe91a2bcca6e09764af7f1ec9ae8"]},"offset":"28772239"},"package.json":{"size":1831,"integrity":{"algorithm":"SHA256","hash":"cc8f523c2208b9c4835f3e464b10e3a2467c138bbb3b6d3fec2700350b06af54","blockSize":4194304,"blocks":["cc8f523c2208b9c4835f3e464b10e3a2467c138bbb3b6d3fec2700350b06af54"]},"offset":"28773342"},"src":{"files":{"F.js":{"size":325,"integrity":{"algorithm":"SHA256","hash":"b907b83a91a314450da0752f07225d611ce60af53485fbe2d20c9461b0bf723e","blockSize":4194304,"blocks":["b907b83a91a314450da0752f07225d611ce60af53485fbe2d20c9461b0bf723e"]},"offset":"28775173"},"T.js":{"size":322,"integrity":{"algorithm":"SHA256","hash":"297b54d0285e6c34071a3d6990ffd37e5bc8ec904dd03e44530f8e7ddded5093","blockSize":4194304,"blocks":["297b54d0285e6c34071a3d6990ffd37e5bc8ec904dd03e44530f8e7ddded5093"]},"offset":"28775498"},"__.js":{"size":743,"integrity":{"algorithm":"SHA256","hash":"8859f88799c870b31f11bbf9004f5c0eb2191ab09272c3a594f3033cb436b1e7","blockSize":4194304,"blocks":["8859f88799c870b31f11bbf9004f5c0eb2191ab09272c3a594f3033cb436b1e7"]},"offset":"28775820"},"add.js":{"size":466,"integrity":{"algorithm":"SHA256","hash":"0b13f0a7586fff1bb4f89f535b0f97727cbd517cc9481bc1aff7357f5e2312d1","blockSize":4194304,"blocks":["0b13f0a7586fff1bb4f89f535b0f97727cbd517cc9481bc1aff7357f5e2312d1"]},"offset":"28776563"},"addIndex.js":{"size":1749,"integrity":{"algorithm":"SHA256","hash":"7807d53be23d6c8ed90ff3c46d039cd2da64f7f9cc61f234c2f19df9c147a0b3","blockSize":4194304,"blocks":["7807d53be23d6c8ed90ff3c46d039cd2da64f7f9cc61f234c2f19df9c147a0b3"]},"offset":"28777029"},"adjust.js":{"size":1403,"integrity":{"algorithm":"SHA256","hash":"a34f37c6d7b79e8988e3075ee2cfaff2f5bbbf35ab7684e3b3660f35f7735f39","blockSize":4194304,"blocks":["a34f37c6d7b79e8988e3075ee2cfaff2f5bbbf35ab7684e3b3660f35f7735f39"]},"offset":"28778778"},"all.js":{"size":1206,"integrity":{"algorithm":"SHA256","hash":"8b26911f9f8f69a740970455acc3df778fbd75f4cb06316c0dc52020b9b975f7","blockSize":4194304,"blocks":["8b26911f9f8f69a740970455acc3df778fbd75f4cb06316c0dc52020b9b975f7"]},"offset":"28780181"},"allPass.js":{"size":1465,"integrity":{"algorithm":"SHA256","hash":"0ea7c271cd983f04227f27c621346b3faa6210c213df6b3f9962fab50cd69c82","blockSize":4194304,"blocks":["0ea7c271cd983f04227f27c621346b3faa6210c213df6b3f9962fab50cd69c82"]},"offset":"28781387"},"always.js":{"size":725,"integrity":{"algorithm":"SHA256","hash":"d88a8cee1b7bee2d15a6e5f476b926c66a1f0b26004cacd1dd05789c06294444","blockSize":4194304,"blocks":["d88a8cee1b7bee2d15a6e5f476b926c66a1f0b26004cacd1dd05789c06294444"]},"offset":"28782852"},"and.js":{"size":646,"integrity":{"algorithm":"SHA256","hash":"92be431e8cffb569613b9026b9d40006f6e6b87e21d0e8952017bba127d20e1c","blockSize":4194304,"blocks":["92be431e8cffb569613b9026b9d40006f6e6b87e21d0e8952017bba127d20e1c"]},"offset":"28783577"},"andThen.js":{"size":1336,"integrity":{"algorithm":"SHA256","hash":"d3d1991ebc6e1ec4312f55be9701cfb0d5c998218ce5c41b3c2482dfdcb8d199","blockSize":4194304,"blocks":["d3d1991ebc6e1ec4312f55be9701cfb0d5c998218ce5c41b3c2482dfdcb8d199"]},"offset":"28784223"},"any.js":{"size":1251,"integrity":{"algorithm":"SHA256","hash":"882e3a483cfe9ee4862f8fcea676382115a7ae67eefed60fc5b6144e58f96903","blockSize":4194304,"blocks":["882e3a483cfe9ee4862f8fcea676382115a7ae67eefed60fc5b6144e58f96903"]},"offset":"28785559"},"anyPass.js":{"size":1504,"integrity":{"algorithm":"SHA256","hash":"faa3f1c9908399c219e0fd758de2d6160674c08b2c5d3cbfb8ed5fd90a0f4f85","blockSize":4194304,"blocks":["faa3f1c9908399c219e0fd758de2d6160674c08b2c5d3cbfb8ed5fd90a0f4f85"]},"offset":"28786810"},"ap.js":{"size":1498,"integrity":{"algorithm":"SHA256","hash":"ffa7f0809b710a40c2218f5b8a03eb7a12f3db440c2c359bad79190d41a44744","blockSize":4194304,"blocks":["ffa7f0809b710a40c2218f5b8a03eb7a12f3db440c2c359bad79190d41a44744"]},"offset":"28788314"},"aperture.js":{"size":1133,"integrity":{"algorithm":"SHA256","hash":"fbb335988374d5457e9eade0202a72288b6e31232de43c5186634f1fc033fec5","blockSize":4194304,"blocks":["fbb335988374d5457e9eade0202a72288b6e31232de43c5186634f1fc033fec5"]},"offset":"28789812"},"append.js":{"size":915,"integrity":{"algorithm":"SHA256","hash":"047c0ff3577b8f00e68465296b7cb7c0b96bd8a8b120395b90e835d57815eb58","blockSize":4194304,"blocks":["047c0ff3577b8f00e68465296b7cb7c0b96bd8a8b120395b90e835d57815eb58"]},"offset":"28790945"},"apply.js":{"size":846,"integrity":{"algorithm":"SHA256","hash":"c874578cab10d59a9b5fadc4ee3a7e20435a84dbcf5b87fc0e2d94c0b0e828eb","blockSize":4194304,"blocks":["c874578cab10d59a9b5fadc4ee3a7e20435a84dbcf5b87fc0e2d94c0b0e828eb"]},"offset":"28791860"},"applySpec.js":{"size":2176,"integrity":{"algorithm":"SHA256","hash":"84786700d8e2df4eb7e06ca5b2a8681afbf6266928d7428311ef0858ee771e16","blockSize":4194304,"blocks":["84786700d8e2df4eb7e06ca5b2a8681afbf6266928d7428311ef0858ee771e16"]},"offset":"28792706"},"applyTo.js":{"size":615,"integrity":{"algorithm":"SHA256","hash":"a9aad192a42d3e01b31c028abea25bd50506ce5dd89fe4ae31f5ae7f2eecca96","blockSize":4194304,"blocks":["a9aad192a42d3e01b31c028abea25bd50506ce5dd89fe4ae31f5ae7f2eecca96"]},"offset":"28794882"},"ascend.js":{"size":1133,"integrity":{"algorithm":"SHA256","hash":"12fc0b48ea3619650d0b60bc1fd5babf8502db6f82826f708dbab43542ce08cb","blockSize":4194304,"blocks":["12fc0b48ea3619650d0b60bc1fd5babf8502db6f82826f708dbab43542ce08cb"]},"offset":"28795497"},"assoc.js":{"size":977,"integrity":{"algorithm":"SHA256","hash":"16b987ada67678ca5f2be7f35ad535f80ad1bd09232f291d99f9b432d0662d63","blockSize":4194304,"blocks":["16b987ada67678ca5f2be7f35ad535f80ad1bd09232f291d99f9b432d0662d63"]},"offset":"28796630"},"assocPath.js":{"size":1636,"integrity":{"algorithm":"SHA256","hash":"07ddbf9c8b9fdb7e8233f96e7e5747426ba4d1a17a7b5fd4ba430adb29a0a2fe","blockSize":4194304,"blocks":["07ddbf9c8b9fdb7e8233f96e7e5747426ba4d1a17a7b5fd4ba430adb29a0a2fe"]},"offset":"28797607"},"binary.js":{"size":1148,"integrity":{"algorithm":"SHA256","hash":"3b877a4c9528c808ebbcdd50d11b1e0b6fc0a21caa74f60651f3c76453dfdd7e","blockSize":4194304,"blocks":["3b877a4c9528c808ebbcdd50d11b1e0b6fc0a21caa74f60651f3c76453dfdd7e"]},"offset":"28799243"},"bind.js":{"size":1116,"integrity":{"algorithm":"SHA256","hash":"ecd87a5f0ce995762890d06ab235c8db63fb1c5b5f4986f19a4b01629045a0a1","blockSize":4194304,"blocks":["ecd87a5f0ce995762890d06ab235c8db63fb1c5b5f4986f19a4b01629045a0a1"]},"offset":"28800391"},"both.js":{"size":1561,"integrity":{"algorithm":"SHA256","hash":"fee031f04659db403615f02d786c1098d96b3835508a2283cf29af299605a8f3","blockSize":4194304,"blocks":["fee031f04659db403615f02d786c1098d96b3835508a2283cf29af299605a8f3"]},"offset":"28801507"},"call.js":{"size":1255,"integrity":{"algorithm":"SHA256","hash":"0c51914c3e1bdafabc3f841a821fe083d432b6d8139d45e667be09b5bfa457d8","blockSize":4194304,"blocks":["0c51914c3e1bdafabc3f841a821fe083d432b6d8139d45e667be09b5bfa457d8"]},"offset":"28803068"},"chain.js":{"size":1536,"integrity":{"algorithm":"SHA256","hash":"540f31241152a1415d4b355344fd107b0123a1d76945084d44242b93ad663383","blockSize":4194304,"blocks":["540f31241152a1415d4b355344fd107b0123a1d76945084d44242b93ad663383"]},"offset":"28804323"},"clamp.js":{"size":962,"integrity":{"algorithm":"SHA256","hash":"4e4f1008d59b49a4c26da95f6ba1537999656947d501059eee3011a9d3b7b8d4","blockSize":4194304,"blocks":["4e4f1008d59b49a4c26da95f6ba1537999656947d501059eee3011a9d3b7b8d4"]},"offset":"28805859"},"clone.js":{"size":1263,"integrity":{"algorithm":"SHA256","hash":"39803460237e5f97aabd2ec767f83913ab6b40bc2b817a98866cb78c9fe3b143","blockSize":4194304,"blocks":["39803460237e5f97aabd2ec767f83913ab6b40bc2b817a98866cb78c9fe3b143"]},"offset":"28806821"},"collectBy.js":{"size":1619,"integrity":{"algorithm":"SHA256","hash":"170a1c3d082900800cb2ac8593e4bf9ff29ec62402638be9d9d0466fb1f8cad9","blockSize":4194304,"blocks":["170a1c3d082900800cb2ac8593e4bf9ff29ec62402638be9d9d0466fb1f8cad9"]},"offset":"28808084"},"comparator.js":{"size":1132,"integrity":{"algorithm":"SHA256","hash":"eac602f00648284b3ccb366ee5cfe1cb7ccd3c1259e94af18d9ecaa02d4f28b9","blockSize":4194304,"blocks":["eac602f00648284b3ccb366ee5cfe1cb7ccd3c1259e94af18d9ecaa02d4f28b9"]},"offset":"28809703"},"complement.js":{"size":791,"integrity":{"algorithm":"SHA256","hash":"330cf2aba9ddeeb00c4e2a1f6f32007a53c8a0da6a9a75549d2bdd5cc0c21e0b","blockSize":4194304,"blocks":["330cf2aba9ddeeb00c4e2a1f6f32007a53c8a0da6a9a75549d2bdd5cc0c21e0b"]},"offset":"28810835"},"compose.js":{"size":1203,"integrity":{"algorithm":"SHA256","hash":"777708c625b721a6996a3586dd8d8211a7f4ddb546a1b554592fce272ed00bd0","blockSize":4194304,"blocks":["777708c625b721a6996a3586dd8d8211a7f4ddb546a1b554592fce272ed00bd0"]},"offset":"28811626"},"composeWith.js":{"size":1284,"integrity":{"algorithm":"SHA256","hash":"e9d5d17849840f940081c16dfefa83a49c569e3292d165b08feff50da0ad7aa4","blockSize":4194304,"blocks":["e9d5d17849840f940081c16dfefa83a49c569e3292d165b08feff50da0ad7aa4"]},"offset":"28812829"},"concat.js":{"size":1961,"integrity":{"algorithm":"SHA256","hash":"1359d179d793e56e3d5438d10a40a3ab91bfb03684d4cb222704f9372a68ad13","blockSize":4194304,"blocks":["1359d179d793e56e3d5438d10a40a3ab91bfb03684d4cb222704f9372a68ad13"]},"offset":"28814113"},"cond.js":{"size":1935,"integrity":{"algorithm":"SHA256","hash":"82ee803eab5f0c6eda8edd61f9a42f9971aae07d678709475de9b5aabb83a022","blockSize":4194304,"blocks":["82ee803eab5f0c6eda8edd61f9a42f9971aae07d678709475de9b5aabb83a022"]},"offset":"28816074"},"construct.js":{"size":1347,"integrity":{"algorithm":"SHA256","hash":"eecebe8e1458949a71dd0798471ffa3eb0ec52ad164a9c04f0caf67c4a489f93","blockSize":4194304,"blocks":["eecebe8e1458949a71dd0798471ffa3eb0ec52ad164a9c04f0caf67c4a489f93"]},"offset":"28818009"},"constructN.js":{"size":2415,"integrity":{"algorithm":"SHA256","hash":"354c054a23f78e7e5f47e3ac50a8e666ba52bc3a3dcc2d4e7e58966b74ff7bfc","blockSize":4194304,"blocks":["354c054a23f78e7e5f47e3ac50a8e666ba52bc3a3dcc2d4e7e58966b74ff7bfc"]},"offset":"28819356"},"converge.js":{"size":1825,"integrity":{"algorithm":"SHA256","hash":"714fec2a07606a819fc256b42790c32a7e51184c484b601fbf8ea1fbc13f252b","blockSize":4194304,"blocks":["714fec2a07606a819fc256b42790c32a7e51184c484b601fbf8ea1fbc13f252b"]},"offset":"28821771"},"count.js":{"size":747,"integrity":{"algorithm":"SHA256","hash":"40376f177c3c31b6bea308a53e327f47fd9f8066ab138356a7fa7fdc5e0b0c26","blockSize":4194304,"blocks":["40376f177c3c31b6bea308a53e327f47fd9f8066ab138356a7fa7fdc5e0b0c26"]},"offset":"28823596"},"countBy.js":{"size":1126,"integrity":{"algorithm":"SHA256","hash":"cd32f493651a02cd26a79ea31062c447e79d28ceffbf3797db07e4190f66dc28","blockSize":4194304,"blocks":["cd32f493651a02cd26a79ea31062c447e79d28ceffbf3797db07e4190f66dc28"]},"offset":"28824343"},"curry.js":{"size":1471,"integrity":{"algorithm":"SHA256","hash":"942ffa90b5d91ab182a4ef411fe87cd576a9f772413f1d48574a24f3131a3bb5","blockSize":4194304,"blocks":["942ffa90b5d91ab182a4ef411fe87cd576a9f772413f1d48574a24f3131a3bb5"]},"offset":"28825469"},"curryN.js":{"size":1732,"integrity":{"algorithm":"SHA256","hash":"9cf952c0347cf6c0c330be0d297834252578c3549b5e342c67ed811bd5025e51","blockSize":4194304,"blocks":["9cf952c0347cf6c0c330be0d297834252578c3549b5e342c67ed811bd5025e51"]},"offset":"28826940"},"dec.js":{"size":327,"integrity":{"algorithm":"SHA256","hash":"4ec7fb34c9ff1004ecd1ed53d746d40bfaaf9080684a07e1e46a46143556b313","blockSize":4194304,"blocks":["4ec7fb34c9ff1004ecd1ed53d746d40bfaaf9080684a07e1e46a46143556b313"]},"offset":"28828672"},"defaultTo.js":{"size":985,"integrity":{"algorithm":"SHA256","hash":"37ad7074cd963f4d16a325b6e434093cb8548ef134020b7df554f2348f3f8858","blockSize":4194304,"blocks":["37ad7074cd963f4d16a325b6e434093cb8548ef134020b7df554f2348f3f8858"]},"offset":"28828999"},"descend.js":{"size":1135,"integrity":{"algorithm":"SHA256","hash":"b14d9ba72ef656687d99046d70f2ffc75d28713bca0759de681ae9f0e41cae63","blockSize":4194304,"blocks":["b14d9ba72ef656687d99046d70f2ffc75d28713bca0759de681ae9f0e41cae63"]},"offset":"28829984"},"difference.js":{"size":1313,"integrity":{"algorithm":"SHA256","hash":"f1c0fcf4aca446850c3d482a168e3d246ee7c39bc9f2093783ac5ffcc0e51231","blockSize":4194304,"blocks":["f1c0fcf4aca446850c3d482a168e3d246ee7c39bc9f2093783ac5ffcc0e51231"]},"offset":"28831119"},"differenceWith.js":{"size":1368,"integrity":{"algorithm":"SHA256","hash":"22f85a1e454668a5cfa29414bcf163811cb44f1bc86f0bd4a3c300cc25d4a1f8","blockSize":4194304,"blocks":["22f85a1e454668a5cfa29414bcf163811cb44f1bc86f0bd4a3c300cc25d4a1f8"]},"offset":"28832432"},"dissoc.js":{"size":725,"integrity":{"algorithm":"SHA256","hash":"2dd7a22c86e6ac61e5edfa384a3790817239b244259da72ce42ae6fadd1222d2","blockSize":4194304,"blocks":["2dd7a22c86e6ac61e5edfa384a3790817239b244259da72ce42ae6fadd1222d2"]},"offset":"28833800"},"dissocPath.js":{"size":2051,"integrity":{"algorithm":"SHA256","hash":"5fbe16c495636e5f69c76514e6f127e10c138703ebe2a76f3c5f02999adf2141","blockSize":4194304,"blocks":["5fbe16c495636e5f69c76514e6f127e10c138703ebe2a76f3c5f02999adf2141"]},"offset":"28834525"},"divide.js":{"size":658,"integrity":{"algorithm":"SHA256","hash":"8df0fd49815cae1401d3ca3abdb87047bf697f7a0db77e9f9d2ab34dbd6ccddd","blockSize":4194304,"blocks":["8df0fd49815cae1401d3ca3abdb87047bf697f7a0db77e9f9d2ab34dbd6ccddd"]},"offset":"28836576"},"drop.js":{"size":1205,"integrity":{"algorithm":"SHA256","hash":"63166346ead3f1de0beb8eef90677e48c9862c699870fead29f5523b7bd9d4b4","blockSize":4194304,"blocks":["63166346ead3f1de0beb8eef90677e48c9862c699870fead29f5523b7bd9d4b4"]},"offset":"28837234"},"dropLast.js":{"size":1249,"integrity":{"algorithm":"SHA256","hash":"1186a5cc98cc677bf408916a0fa39397cca69fef3a20c0c6beeb36bd9b896703","blockSize":4194304,"blocks":["1186a5cc98cc677bf408916a0fa39397cca69fef3a20c0c6beeb36bd9b896703"]},"offset":"28838439"},"dropLastWhile.js":{"size":1488,"integrity":{"algorithm":"SHA256","hash":"63dfd5f6d2b9e6bf90b1fa6f41409a6c723de205830ef2448be0fcaa3b0b9d47","blockSize":4194304,"blocks":["63dfd5f6d2b9e6bf90b1fa6f41409a6c723de205830ef2448be0fcaa3b0b9d47"]},"offset":"28839688"},"dropRepeats.js":{"size":1021,"integrity":{"algorithm":"SHA256","hash":"ae764103893e30978b2c9b8032c5ec072bf756e529f9943ac4a9f34abeea9e7b","blockSize":4194304,"blocks":["ae764103893e30978b2c9b8032c5ec072bf756e529f9943ac4a9f34abeea9e7b"]},"offset":"28841176"},"dropRepeatsWith.js":{"size":1476,"integrity":{"algorithm":"SHA256","hash":"7a6f678c994777b063a1f4275ac778b06e517e0f07beeca22b42b3421db07040","blockSize":4194304,"blocks":["7a6f678c994777b063a1f4275ac778b06e517e0f07beeca22b42b3421db07040"]},"offset":"28842197"},"dropWhile.js":{"size":1534,"integrity":{"algorithm":"SHA256","hash":"28a395ea549bb3be39564ca32b0ed0cac1a2a6217b2047c404b1bd82ded4627f","blockSize":4194304,"blocks":["28a395ea549bb3be39564ca32b0ed0cac1a2a6217b2047c404b1bd82ded4627f"]},"offset":"28843673"},"either.js":{"size":1541,"integrity":{"algorithm":"SHA256","hash":"6efeacc1ccd3a8c52407e6ebed18c46c3fc7a72e090b5985e65d466a4b23e404","blockSize":4194304,"blocks":["6efeacc1ccd3a8c52407e6ebed18c46c3fc7a72e090b5985e65d466a4b23e404"]},"offset":"28845207"},"empty.js":{"size":1938,"integrity":{"algorithm":"SHA256","hash":"b3d324843d1c1524454081b5b3186b3149c9e9be5cb5f66c7671f9f50c05d9ba","blockSize":4194304,"blocks":["b3d324843d1c1524454081b5b3186b3149c9e9be5cb5f66c7671f9f50c05d9ba"]},"offset":"28846748"},"endsWith.js":{"size":904,"integrity":{"algorithm":"SHA256","hash":"61cd7749dd7ac3b9eaef8bd1f9acc832e4aaf38efca2f01b829dc135eec5aeb8","blockSize":4194304,"blocks":["61cd7749dd7ac3b9eaef8bd1f9acc832e4aaf38efca2f01b829dc135eec5aeb8"]},"offset":"28848686"},"eqBy.js":{"size":620,"integrity":{"algorithm":"SHA256","hash":"582bf76d93de5a712cf827d6eb4892d02be0c786639d8a914a0e2b13ac6194ab","blockSize":4194304,"blocks":["582bf76d93de5a712cf827d6eb4892d02be0c786639d8a914a0e2b13ac6194ab"]},"offset":"28849590"},"eqProps.js":{"size":848,"integrity":{"algorithm":"SHA256","hash":"309604c466e9f45a3fef573907007dbac5f67d06e9a1e8ddf7dd06c6385233fe","blockSize":4194304,"blocks":["309604c466e9f45a3fef573907007dbac5f67d06e9a1e8ddf7dd06c6385233fe"]},"offset":"28850210"},"equals.js":{"size":832,"integrity":{"algorithm":"SHA256","hash":"9d92d651aaa3af4c479f7132d13645fe5f4ef71c71673dff76267c66c5a647ed","blockSize":4194304,"blocks":["9d92d651aaa3af4c479f7132d13645fe5f4ef71c71673dff76267c66c5a647ed"]},"offset":"28851058"},"evolve.js":{"size":1786,"integrity":{"algorithm":"SHA256","hash":"30b016424d6f0170b5b64a55da3e5fcefc41c6ee57c35d503e6e8a7e6f10d35b","blockSize":4194304,"blocks":["30b016424d6f0170b5b64a55da3e5fcefc41c6ee57c35d503e6e8a7e6f10d35b"]},"offset":"28851890"},"filter.js":{"size":1689,"integrity":{"algorithm":"SHA256","hash":"6ad3a341f883989289406fc56f7e7b47f436c5627fa2f8746dea7be8bc8a9f39","blockSize":4194304,"blocks":["6ad3a341f883989289406fc56f7e7b47f436c5627fa2f8746dea7be8bc8a9f39"]},"offset":"28853676"},"find.js":{"size":1238,"integrity":{"algorithm":"SHA256","hash":"e17c85961a7d3699493f84e628f036d629d4cb63c18c4862eddc740007791d2f","blockSize":4194304,"blocks":["e17c85961a7d3699493f84e628f036d629d4cb63c18c4862eddc740007791d2f"]},"offset":"28855365"},"findIndex.js":{"size":1203,"integrity":{"algorithm":"SHA256","hash":"14eede8cf83e389bf5ff85a109b297dc26d15fdabfa3c169dfaa75da069a0939","blockSize":4194304,"blocks":["14eede8cf83e389bf5ff85a109b297dc26d15fdabfa3c169dfaa75da069a0939"]},"offset":"28856603"},"findLast.js":{"size":1179,"integrity":{"algorithm":"SHA256","hash":"7658ac8a0e9175482bc876b21c65946db3d206779caac787f1a2976d1df6a6ed","blockSize":4194304,"blocks":["7658ac8a0e9175482bc876b21c65946db3d206779caac787f1a2976d1df6a6ed"]},"offset":"28857806"},"findLastIndex.js":{"size":1229,"integrity":{"algorithm":"SHA256","hash":"9eac5e58b09a5c37631e7de246cdfc49e8aa4287082baf77a4e2447d38c4e853","blockSize":4194304,"blocks":["9eac5e58b09a5c37631e7de246cdfc49e8aa4287082baf77a4e2447d38c4e853"]},"offset":"28858985"},"flatten.js":{"size":683,"integrity":{"algorithm":"SHA256","hash":"b6ef7aacfcf769246f130d057e30662c7d8ca935d9637bcc8ee3dfb4a0bc107e","blockSize":4194304,"blocks":["b6ef7aacfcf769246f130d057e30662c7d8ca935d9637bcc8ee3dfb4a0bc107e"]},"offset":"28860214"},"flip.js":{"size":1012,"integrity":{"algorithm":"SHA256","hash":"8936465c060124d0aed00599318e9ee442d18a9d30f256492e176fe9e65f75c1","blockSize":4194304,"blocks":["8936465c060124d0aed00599318e9ee442d18a9d30f256492e176fe9e65f75c1"]},"offset":"28860897"},"forEach.js":{"size":1583,"integrity":{"algorithm":"SHA256","hash":"bbc20385b9867a4c6a625b2147fb847cc0fe158cf8b40a623754f1b9cbd4deb0","blockSize":4194304,"blocks":["bbc20385b9867a4c6a625b2147fb847cc0fe158cf8b40a623754f1b9cbd4deb0"]},"offset":"28861909"},"forEachObjIndexed.js":{"size":1173,"integrity":{"algorithm":"SHA256","hash":"9489491230b9510bcf58f49e4b44dd0e985b5da217f876268aaa226704d92e73","blockSize":4194304,"blocks":["9489491230b9510bcf58f49e4b44dd0e985b5da217f876268aaa226704d92e73"]},"offset":"28863492"},"fromPairs.js":{"size":840,"integrity":{"algorithm":"SHA256","hash":"a91e12d14c9783dcced6f2cb77b5802839b922b6058762e946aa50c8ef3cb0ee","blockSize":4194304,"blocks":["a91e12d14c9783dcced6f2cb77b5802839b922b6058762e946aa50c8ef3cb0ee"]},"offset":"28864665"},"groupBy.js":{"size":1831,"integrity":{"algorithm":"SHA256","hash":"183a95f8481816b81afc4f635fd83b27855842233eb672db24e2b88d21edd45c","blockSize":4194304,"blocks":["183a95f8481816b81afc4f635fd83b27855842233eb672db24e2b88d21edd45c"]},"offset":"28865505"},"groupWith.js":{"size":1631,"integrity":{"algorithm":"SHA256","hash":"47fa94e6e5fec3f8d3ae0ca4a67440a733c3f6534b6e290c07dd7e825b9279b4","blockSize":4194304,"blocks":["47fa94e6e5fec3f8d3ae0ca4a67440a733c3f6534b6e290c07dd7e825b9279b4"]},"offset":"28867336"},"gt.js":{"size":597,"integrity":{"algorithm":"SHA256","hash":"5a605848f56d5f3f4c1ec674d518d238258eaae47b15192cc991ee2788574df4","blockSize":4194304,"blocks":["5a605848f56d5f3f4c1ec674d518d238258eaae47b15192cc991ee2788574df4"]},"offset":"28868967"},"gte.js":{"size":628,"integrity":{"algorithm":"SHA256","hash":"4b1731aa62744613f6451b13b9a78fe16977e3f06f716a064b1101a2ada726c3","blockSize":4194304,"blocks":["4b1731aa62744613f6451b13b9a78fe16977e3f06f716a064b1101a2ada726c3"]},"offset":"28869564"},"has.js":{"size":953,"integrity":{"algorithm":"SHA256","hash":"74f444125280e80a4638da90e7c8fa68401bc22af8a1f803b9ab844211c17216","blockSize":4194304,"blocks":["74f444125280e80a4638da90e7c8fa68401bc22af8a1f803b9ab844211c17216"]},"offset":"28870192"},"hasIn.js":{"size":999,"integrity":{"algorithm":"SHA256","hash":"d708bb25fd02791ab6adef200c053da405affabda68130de71167b062ef70c88","blockSize":4194304,"blocks":["d708bb25fd02791ab6adef200c053da405affabda68130de71167b062ef70c88"]},"offset":"28871145"},"hasPath.js":{"size":1223,"integrity":{"algorithm":"SHA256","hash":"aa75448aca40cb35f54c5e3699210e2e5808dab50bda683bf0f9daf3399eacf8","blockSize":4194304,"blocks":["aa75448aca40cb35f54c5e3699210e2e5808dab50bda683bf0f9daf3399eacf8"]},"offset":"28872144"},"head.js":{"size":573,"integrity":{"algorithm":"SHA256","hash":"a749d97ae18246923771a7db71a5fc89c503727eb72d785c5c7bb5a7a77a2eee","blockSize":4194304,"blocks":["a749d97ae18246923771a7db71a5fc89c503727eb72d785c5c7bb5a7a77a2eee"]},"offset":"28873367"},"identical.js":{"size":886,"integrity":{"algorithm":"SHA256","hash":"6130f0abd57da38ee6b47a3247af448c25dd793a9d7d35970c8bc9f3ac260e4a","blockSize":4194304,"blocks":["6130f0abd57da38ee6b47a3247af448c25dd793a9d7d35970c8bc9f3ac260e4a"]},"offset":"28873940"},"identity.js":{"size":631,"integrity":{"algorithm":"SHA256","hash":"53e92e8c031d62b0d93b5b1c51afe8242b211aa1e057fb33252a70ceb0710de4","blockSize":4194304,"blocks":["53e92e8c031d62b0d93b5b1c51afe8242b211aa1e057fb33252a70ceb0710de4"]},"offset":"28874826"},"ifElse.js":{"size":1450,"integrity":{"algorithm":"SHA256","hash":"d57b2bfa2ed4f52c3a5a0bf9db2603b6846de2fdd57b9f8172b7946ae60edb2c","blockSize":4194304,"blocks":["d57b2bfa2ed4f52c3a5a0bf9db2603b6846de2fdd57b9f8172b7946ae60edb2c"]},"offset":"28875457"},"inc.js":{"size":326,"integrity":{"algorithm":"SHA256","hash":"45ff7b15cc377631ce374aa13614c5c02577ef9bd5c543126267a75b0621fd34","blockSize":4194304,"blocks":["45ff7b15cc377631ce374aa13614c5c02577ef9bd5c543126267a75b0621fd34"]},"offset":"28876907"},"includes.js":{"size":938,"integrity":{"algorithm":"SHA256","hash":"8f016758bf29d54ebe27f0bfc02f134a6ce414774341317a44ca051b6c0e4706","blockSize":4194304,"blocks":["8f016758bf29d54ebe27f0bfc02f134a6ce414774341317a44ca051b6c0e4706"]},"offset":"28877233"},"index.js":{"size":16588,"integrity":{"algorithm":"SHA256","hash":"e495ebf3778b20702347d0810d85ea13c54217744c51162dcfa177c256b5f4a6","blockSize":4194304,"blocks":["e495ebf3778b20702347d0810d85ea13c54217744c51162dcfa177c256b5f4a6"]},"offset":"28878171"},"indexBy.js":{"size":1058,"integrity":{"algorithm":"SHA256","hash":"517886bbdefc04ce81fb5368bec05f96f5e5bb8346e274d84efe194a405ab258","blockSize":4194304,"blocks":["517886bbdefc04ce81fb5368bec05f96f5e5bb8346e274d84efe194a405ab258"]},"offset":"28894759"},"indexOf.js":{"size":969,"integrity":{"algorithm":"SHA256","hash":"306a222dc54f36e4750ad3d07811478574a06add2515436c7b97b8e9b217489c","blockSize":4194304,"blocks":["306a222dc54f36e4750ad3d07811478574a06add2515436c7b97b8e9b217489c"]},"offset":"28895817"},"init.js":{"size":654,"integrity":{"algorithm":"SHA256","hash":"2f339628fa03090ed0e20b4bf2dcb4051d1a61ce4f00fbd96da512877c494131","blockSize":4194304,"blocks":["2f339628fa03090ed0e20b4bf2dcb4051d1a61ce4f00fbd96da512877c494131"]},"offset":"28896786"},"innerJoin.js":{"size":1633,"integrity":{"algorithm":"SHA256","hash":"806ff15021316209c47b9bb22d9d993f51fe90da90d0fb1bfb625c0200f45db1","blockSize":4194304,"blocks":["806ff15021316209c47b9bb22d9d993f51fe90da90d0fb1bfb625c0200f45db1"]},"offset":"28897440"},"insert.js":{"size":963,"integrity":{"algorithm":"SHA256","hash":"4373385ebbf492adfc046f65c45e2932e699c859399d0f0df67c4b3bf9f22ce9","blockSize":4194304,"blocks":["4373385ebbf492adfc046f65c45e2932e699c859399d0f0df67c4b3bf9f22ce9"]},"offset":"28899073"},"insertAll.js":{"size":1025,"integrity":{"algorithm":"SHA256","hash":"b6ad289a233ac2607efbcd32ee03f7f64bc39aa9a082f96172191f572958cc3d","blockSize":4194304,"blocks":["b6ad289a233ac2607efbcd32ee03f7f64bc39aa9a082f96172191f572958cc3d"]},"offset":"28900036"},"intersection.js":{"size":1114,"integrity":{"algorithm":"SHA256","hash":"fd2fcf5477bd17fd423ccd45504f5a0ef6dcda391e8355fad4cf1406130c4f2c","blockSize":4194304,"blocks":["fd2fcf5477bd17fd423ccd45504f5a0ef6dcda391e8355fad4cf1406130c4f2c"]},"offset":"28901061"},"intersperse.js":{"size":1028,"integrity":{"algorithm":"SHA256","hash":"87f082d2bd3feb6f7d478de837e53e30a192046dd1c6848874bfd6c54a0b0e3e","blockSize":4194304,"blocks":["87f082d2bd3feb6f7d478de837e53e30a192046dd1c6848874bfd6c54a0b0e3e"]},"offset":"28902175"},"into.js":{"size":2171,"integrity":{"algorithm":"SHA256","hash":"4748dd4be4e47fdfe8515617081bc28f70ccfffe1e29326a54a449924089a62e","blockSize":4194304,"blocks":["4748dd4be4e47fdfe8515617081bc28f70ccfffe1e29326a54a449924089a62e"]},"offset":"28903203"},"invert.js":{"size":1157,"integrity":{"algorithm":"SHA256","hash":"8e44c20ac31a89fac6a91fb34beb6949379e6b0cfe3f0bd91ec77efe0ead29f2","blockSize":4194304,"blocks":["8e44c20ac31a89fac6a91fb34beb6949379e6b0cfe3f0bd91ec77efe0ead29f2"]},"offset":"28905374"},"invertObj.js":{"size":1167,"integrity":{"algorithm":"SHA256","hash":"8f468aad13ef6c8cdaa7dbd9855cc9f20a57dff8ffaf4562b4108fb0e28a70e4","blockSize":4194304,"blocks":["8f468aad13ef6c8cdaa7dbd9855cc9f20a57dff8ffaf4562b4108fb0e28a70e4"]},"offset":"28906531"},"invoker.js":{"size":1896,"integrity":{"algorithm":"SHA256","hash":"3f850d119be2de3a811d24d842f9251623e0db9175ce5261865aa83122b48723","blockSize":4194304,"blocks":["3f850d119be2de3a811d24d842f9251623e0db9175ce5261865aa83122b48723"]},"offset":"28907698"},"is.js":{"size":1019,"integrity":{"algorithm":"SHA256","hash":"a32a9be0ee5ca4826e6df13baefc31e56c63e641b5d6babc52d3b55128f95414","blockSize":4194304,"blocks":["a32a9be0ee5ca4826e6df13baefc31e56c63e641b5d6babc52d3b55128f95414"]},"offset":"28909594"},"isEmpty.js":{"size":896,"integrity":{"algorithm":"SHA256","hash":"b2d1128514df9ed4f3425dc1dd468006f9d5f723b6af6c8fc6c4d4a76c296fd7","blockSize":4194304,"blocks":["b2d1128514df9ed4f3425dc1dd468006f9d5f723b6af6c8fc6c4d4a76c296fd7"]},"offset":"28910613"},"isNil.js":{"size":576,"integrity":{"algorithm":"SHA256","hash":"bd198981d800a217c25db72a3170dd0845187a870e9058603a23e12e950eabc3","blockSize":4194304,"blocks":["bd198981d800a217c25db72a3170dd0845187a870e9058603a23e12e950eabc3"]},"offset":"28911509"},"join.js":{"size":737,"integrity":{"algorithm":"SHA256","hash":"ef43377d769ba27e9447f33d11c0f87db9566bd1d4b514fb330695f5db7a4716","blockSize":4194304,"blocks":["ef43377d769ba27e9447f33d11c0f87db9566bd1d4b514fb330695f5db7a4716"]},"offset":"28912085"},"juxt.js":{"size":851,"integrity":{"algorithm":"SHA256","hash":"dbf329ecfefd8092948faefb1b79da3c12eed3b391d918889a264b1c8c8443ac","blockSize":4194304,"blocks":["dbf329ecfefd8092948faefb1b79da3c12eed3b391d918889a264b1c8c8443ac"]},"offset":"28912822"},"keys.js":{"size":2091,"integrity":{"algorithm":"SHA256","hash":"7257bd548117f383731a137ae9249ceb7706dbac7d32dd8d2e98fda1a3833eda","blockSize":4194304,"blocks":["7257bd548117f383731a137ae9249ceb7706dbac7d32dd8d2e98fda1a3833eda"]},"offset":"28913673"},"keysIn.js":{"size":889,"integrity":{"algorithm":"SHA256","hash":"9be1d254fa9db3358bb6a9c5cee819e1523627d88c075ab52f8916589bfce9f7","blockSize":4194304,"blocks":["9be1d254fa9db3358bb6a9c5cee819e1523627d88c075ab52f8916589bfce9f7"]},"offset":"28915764"},"last.js":{"size":510,"integrity":{"algorithm":"SHA256","hash":"b01e9b64a1d05d9ac2854b28a97b6506dcec2ca698e352267b86b90c27d5242c","blockSize":4194304,"blocks":["b01e9b64a1d05d9ac2854b28a97b6506dcec2ca698e352267b86b90c27d5242c"]},"offset":"28916653"},"lastIndexOf.js":{"size":1147,"integrity":{"algorithm":"SHA256","hash":"26f7b489e77ea5f1fb36268f36b66bc01b5b01ac1261a6d7d86f3573ba8c60f1","blockSize":4194304,"blocks":["26f7b489e77ea5f1fb36268f36b66bc01b5b01ac1261a6d7d86f3573ba8c60f1"]},"offset":"28917163"},"length.js":{"size":625,"integrity":{"algorithm":"SHA256","hash":"e2b0a8a187f8f9d4f358e44daa997e450528f6bc5bcce07dd42fbc75c685b483","blockSize":4194304,"blocks":["e2b0a8a187f8f9d4f358e44daa997e450528f6bc5bcce07dd42fbc75c685b483"]},"offset":"28918310"},"lens.js":{"size":1162,"integrity":{"algorithm":"SHA256","hash":"77b9bc4f3b185ae33b59404da497f8e9b104f1ca3c1a42e8bc2c817a3cfe3ef7","blockSize":4194304,"blocks":["77b9bc4f3b185ae33b59404da497f8e9b104f1ca3c1a42e8bc2c817a3cfe3ef7"]},"offset":"28918935"},"lensIndex.js":{"size":900,"integrity":{"algorithm":"SHA256","hash":"9ff8a1f09f9fbbe6106c332bfeafbec2d0ba9202ba5f45622d5fb74e5d58dd65","blockSize":4194304,"blocks":["9ff8a1f09f9fbbe6106c332bfeafbec2d0ba9202ba5f45622d5fb74e5d58dd65"]},"offset":"28920097"},"lensPath.js":{"size":1071,"integrity":{"algorithm":"SHA256","hash":"e74acc71afad6309c23e7138e5a01afcc31fd050c5738cf2232b82a710d3a3ab","blockSize":4194304,"blocks":["e74acc71afad6309c23e7138e5a01afcc31fd050c5738cf2232b82a710d3a3ab"]},"offset":"28920997"},"lensProp.js":{"size":866,"integrity":{"algorithm":"SHA256","hash":"435e72f7a264a05b81cb823a3376cb8e6219cdfceee62beaddc95f4030a78a3c","blockSize":4194304,"blocks":["435e72f7a264a05b81cb823a3376cb8e6219cdfceee62beaddc95f4030a78a3c"]},"offset":"28922068"},"lift.js":{"size":1017,"integrity":{"algorithm":"SHA256","hash":"a4b97a495737559b5bb0f426776cd547e6452a5a04560c489a79da42188375a6","blockSize":4194304,"blocks":["a4b97a495737559b5bb0f426776cd547e6452a5a04560c489a79da42188375a6"]},"offset":"28922934"},"liftN.js":{"size":1143,"integrity":{"algorithm":"SHA256","hash":"c23220291d19ddaf9370ec1464a119a3eecf1f621718bee24580bb1b3b64ffac","blockSize":4194304,"blocks":["c23220291d19ddaf9370ec1464a119a3eecf1f621718bee24580bb1b3b64ffac"]},"offset":"28923951"},"lt.js":{"size":594,"integrity":{"algorithm":"SHA256","hash":"f001a4dd3acc355b9f48fe03e7c89f49f2143815be5c5769f380a1ac589ed724","blockSize":4194304,"blocks":["f001a4dd3acc355b9f48fe03e7c89f49f2143815be5c5769f380a1ac589ed724"]},"offset":"28925094"},"lte.js":{"size":625,"integrity":{"algorithm":"SHA256","hash":"1fbb2da97ef62eb8ccd77c3cc09441a0d48b9338bf5ed06f8dfa9324959d66e0","blockSize":4194304,"blocks":["1fbb2da97ef62eb8ccd77c3cc09441a0d48b9338bf5ed06f8dfa9324959d66e0"]},"offset":"28925688"},"map.js":{"size":2204,"integrity":{"algorithm":"SHA256","hash":"cb313adff68b47d344578658e12f1f7bc431c9e5a36e66faa1d1b98d062cf87e","blockSize":4194304,"blocks":["cb313adff68b47d344578658e12f1f7bc431c9e5a36e66faa1d1b98d062cf87e"]},"offset":"28926313"},"mapAccum.js":{"size":1537,"integrity":{"algorithm":"SHA256","hash":"ce86eb20edc0521db2fccd82874a24e8d5e8fe848dd8936dbd3dc1af93a21cf0","blockSize":4194304,"blocks":["ce86eb20edc0521db2fccd82874a24e8d5e8fe848dd8936dbd3dc1af93a21cf0"]},"offset":"28928517"},"mapAccumRight.js":{"size":1651,"integrity":{"algorithm":"SHA256","hash":"d95badd0d58d77efa7ca21e9c4e129e754b1af66bf5bd14bda42f5341bcbb314","blockSize":4194304,"blocks":["d95badd0d58d77efa7ca21e9c4e129e754b1af66bf5bd14bda42f5341bcbb314"]},"offset":"28930054"},"mapObjIndexed.js":{"size":1008,"integrity":{"algorithm":"SHA256","hash":"7c5d966a9aab74cedd7497ce8f8a348eef7e56f52bc07dc756214aecf54f7f79","blockSize":4194304,"blocks":["7c5d966a9aab74cedd7497ce8f8a348eef7e56f52bc07dc756214aecf54f7f79"]},"offset":"28931705"},"match.js":{"size":992,"integrity":{"algorithm":"SHA256","hash":"9ce1f47d22a186acdb453773d2dda632452447ab39a28734e110826cf5e3aad1","blockSize":4194304,"blocks":["9ce1f47d22a186acdb453773d2dda632452447ab39a28734e110826cf5e3aad1"]},"offset":"28932713"},"mathMod.js":{"size":1353,"integrity":{"algorithm":"SHA256","hash":"c56a110eb22e83c6f09e0b53a0fb5c619d3e5c4210c01d87d70d0dcb74f953ed","blockSize":4194304,"blocks":["c56a110eb22e83c6f09e0b53a0fb5c619d3e5c4210c01d87d70d0dcb74f953ed"]},"offset":"28933705"},"max.js":{"size":467,"integrity":{"algorithm":"SHA256","hash":"68dd73aff68fd4ce9cbe2ed12603f991c7030e42b4aac435374b05cb7d5ceff5","blockSize":4194304,"blocks":["68dd73aff68fd4ce9cbe2ed12603f991c7030e42b4aac435374b05cb7d5ceff5"]},"offset":"28935058"},"maxBy.js":{"size":771,"integrity":{"algorithm":"SHA256","hash":"22ff5710a2346c8888879d5248830a908c4829cdb1e0582ea56679cc1b6c831f","blockSize":4194304,"blocks":["22ff5710a2346c8888879d5248830a908c4829cdb1e0582ea56679cc1b6c831f"]},"offset":"28935525"},"mean.js":{"size":512,"integrity":{"algorithm":"SHA256","hash":"7bb4e56f3cd46f6082ed285ca65ad8471633157f11551db6cb5bdd804c33a354","blockSize":4194304,"blocks":["7bb4e56f3cd46f6082ed285ca65ad8471633157f11551db6cb5bdd804c33a354"]},"offset":"28936296"},"median.js":{"size":797,"integrity":{"algorithm":"SHA256","hash":"4d2bfec2f29bc30aaa11ef972ccda70183e069451c9ee4a45bc7fe0dfea8b8b9","blockSize":4194304,"blocks":["4d2bfec2f29bc30aaa11ef972ccda70183e069451c9ee4a45bc7fe0dfea8b8b9"]},"offset":"28936808"},"memoizeWith.js":{"size":1554,"integrity":{"algorithm":"SHA256","hash":"06eeb7cbee6cc36a7532a0d2879b727d4854908d05fd566d03000535fdd326de","blockSize":4194304,"blocks":["06eeb7cbee6cc36a7532a0d2879b727d4854908d05fd566d03000535fdd326de"]},"offset":"28937605"},"mergeAll.js":{"size":890,"integrity":{"algorithm":"SHA256","hash":"494c08bb2d039fd5a0cbde61e24af14f6c187b955c28179e2a3c52efa20a4c88","blockSize":4194304,"blocks":["494c08bb2d039fd5a0cbde61e24af14f6c187b955c28179e2a3c52efa20a4c88"]},"offset":"28939159"},"mergeDeepLeft.js":{"size":1128,"integrity":{"algorithm":"SHA256","hash":"b1f9625afae52a61a57e90bd63bd386ad291d2e360a52546ad59d96691040e90","blockSize":4194304,"blocks":["b1f9625afae52a61a57e90bd63bd386ad291d2e360a52546ad59d96691040e90"]},"offset":"28940049"},"mergeDeepRight.js":{"size":1133,"integrity":{"algorithm":"SHA256","hash":"da99f5cdeff3da0af8954ac527c87da4bb962d0036f73d0d45680907bfcc28c4","blockSize":4194304,"blocks":["da99f5cdeff3da0af8954ac527c87da4bb962d0036f73d0d45680907bfcc28c4"]},"offset":"28941177"},"mergeDeepWith.js":{"size":1301,"integrity":{"algorithm":"SHA256","hash":"77477254402d0ca68422cbec1420a9238e0a595df83aa794ed0b913ebb56bdb6","blockSize":4194304,"blocks":["77477254402d0ca68422cbec1420a9238e0a595df83aa794ed0b913ebb56bdb6"]},"offset":"28942310"},"mergeDeepWithKey.js":{"size":1632,"integrity":{"algorithm":"SHA256","hash":"9618add54a94d69c96e95bf445afe51c0897b515c53b6804f3d2701dff1a059e","blockSize":4194304,"blocks":["9618add54a94d69c96e95bf445afe51c0897b515c53b6804f3d2701dff1a059e"]},"offset":"28943611"},"mergeLeft.js":{"size":990,"integrity":{"algorithm":"SHA256","hash":"399b3968d03af7fb3901489e3aec7d96d853f91396c63533af2de0c80fee5bfc","blockSize":4194304,"blocks":["399b3968d03af7fb3901489e3aec7d96d853f91396c63533af2de0c80fee5bfc"]},"offset":"28945243"},"mergeRight.js":{"size":993,"integrity":{"algorithm":"SHA256","hash":"3f870d8128a8e7b7e6d94976607001b677deab9ad882b3558d68870e0766aba0","blockSize":4194304,"blocks":["3f870d8128a8e7b7e6d94976607001b677deab9ad882b3558d68870e0766aba0"]},"offset":"28946233"},"mergeWith.js":{"size":1062,"integrity":{"algorithm":"SHA256","hash":"f91ee44ee9740f37d34a60ec4c8d6022e314488d0dbcbbe8687051ced251dacd","blockSize":4194304,"blocks":["f91ee44ee9740f37d34a60ec4c8d6022e314488d0dbcbbe8687051ced251dacd"]},"offset":"28947226"},"mergeWithKey.js":{"size":1474,"integrity":{"algorithm":"SHA256","hash":"2978f7873651129cbcb37dab4cb56894ff3365868daa851b90a3898a024ed743","blockSize":4194304,"blocks":["2978f7873651129cbcb37dab4cb56894ff3365868daa851b90a3898a024ed743"]},"offset":"28948288"},"min.js":{"size":468,"integrity":{"algorithm":"SHA256","hash":"5ef52195b65d642dc853530dd24a829a90f599db8ded8708adfa852607c8b47e","blockSize":4194304,"blocks":["5ef52195b65d642dc853530dd24a829a90f599db8ded8708adfa852607c8b47e"]},"offset":"28949762"},"minBy.js":{"size":791,"integrity":{"algorithm":"SHA256","hash":"deda9bfacdb58d4522e4a5acb3710ce540db16e39f8b64040ee6129187cbd54d","blockSize":4194304,"blocks":["deda9bfacdb58d4522e4a5acb3710ce540db16e39f8b64040ee6129187cbd54d"]},"offset":"28950230"},"modify.js":{"size":1209,"integrity":{"algorithm":"SHA256","hash":"ff3b57d312d79cea0d7fdfc1d15223740f5404723b4613ba649139043caeedae","blockSize":4194304,"blocks":["ff3b57d312d79cea0d7fdfc1d15223740f5404723b4613ba649139043caeedae"]},"offset":"28951021"},"modifyPath.js":{"size":1976,"integrity":{"algorithm":"SHA256","hash":"eac2ccff854b4abc445abed77414b7dc4c0ad64fade31136e73c0557beca741d","blockSize":4194304,"blocks":["eac2ccff854b4abc445abed77414b7dc4c0ad64fade31136e73c0557beca741d"]},"offset":"28952230"},"modulo.js":{"size":859,"integrity":{"algorithm":"SHA256","hash":"8c7e825adf0316b4688f9c2518f526796f38ea8b66843d9c7ee39625a5c83273","blockSize":4194304,"blocks":["8c7e825adf0316b4688f9c2518f526796f38ea8b66843d9c7ee39625a5c83273"]},"offset":"28954206"},"move.js":{"size":1219,"integrity":{"algorithm":"SHA256","hash":"1e96f1ad4a87ea4e0e14d838bcc81224f82be729e916da366dd9febad5c1d373","blockSize":4194304,"blocks":["1e96f1ad4a87ea4e0e14d838bcc81224f82be729e916da366dd9febad5c1d373"]},"offset":"28955065"},"multiply.js":{"size":670,"integrity":{"algorithm":"SHA256","hash":"ce20e5fb43ce7e5b321b33b6f42d86a572af46f9c621b526ddea815b4ccd96e9","blockSize":4194304,"blocks":["ce20e5fb43ce7e5b321b33b6f42d86a572af46f9c621b526ddea815b4ccd96e9"]},"offset":"28956284"},"nAry.js":{"size":2560,"integrity":{"algorithm":"SHA256","hash":"b8db90b8cc9f6631682ddd5059f49be2c871a44f92ab9c02686b870ba63bc458","blockSize":4194304,"blocks":["b8db90b8cc9f6631682ddd5059f49be2c871a44f92ab9c02686b870ba63bc458"]},"offset":"28956954"},"negate.js":{"size":369,"integrity":{"algorithm":"SHA256","hash":"5d15e90860a19e36064adbe7d35384470725158d6e5f0d58ffda0505d47359ec","blockSize":4194304,"blocks":["5d15e90860a19e36064adbe7d35384470725158d6e5f0d58ffda0505d47359ec"]},"offset":"28959514"},"none.js":{"size":1073,"integrity":{"algorithm":"SHA256","hash":"59c28c48293588c7079c7e039691a13d3049d349130e2bd7ce120bc17390e7f2","blockSize":4194304,"blocks":["59c28c48293588c7079c7e039691a13d3049d349130e2bd7ce120bc17390e7f2"]},"offset":"28959883"},"not.js":{"size":632,"integrity":{"algorithm":"SHA256","hash":"37112f474ea9a5a7b3cbe5632cec67c1eca3798dc3f4ace44cd9382fa5792ff7","blockSize":4194304,"blocks":["37112f474ea9a5a7b3cbe5632cec67c1eca3798dc3f4ace44cd9382fa5792ff7"]},"offset":"28960956"},"nth.js":{"size":1006,"integrity":{"algorithm":"SHA256","hash":"6aebb60301afb0646eb80e56621d0ff79ecf2032a1ec19e048e197458c7c865b","blockSize":4194304,"blocks":["6aebb60301afb0646eb80e56621d0ff79ecf2032a1ec19e048e197458c7c865b"]},"offset":"28961588"},"nthArg.js":{"size":761,"integrity":{"algorithm":"SHA256","hash":"17143819e6d9dc9db5c4f459025082af9bd250655748a5b1ebffc28b558b19c4","blockSize":4194304,"blocks":["17143819e6d9dc9db5c4f459025082af9bd250655748a5b1ebffc28b558b19c4"]},"offset":"28962594"},"o.js":{"size":1176,"integrity":{"algorithm":"SHA256","hash":"3973f79c4f4da12aec801216115e3730b15baabebd0166c4f12a2c2a2b239964","blockSize":4194304,"blocks":["3973f79c4f4da12aec801216115e3730b15baabebd0166c4f12a2c2a2b239964"]},"offset":"28963355"},"objOf.js":{"size":703,"integrity":{"algorithm":"SHA256","hash":"996ea40f0668254a8c92f8c71a7256ccc8fdc55304601396b27660628ce6916b","blockSize":4194304,"blocks":["996ea40f0668254a8c92f8c71a7256ccc8fdc55304601396b27660628ce6916b"]},"offset":"28964531"},"of.js":{"size":625,"integrity":{"algorithm":"SHA256","hash":"b67216f4f8ce19c462694ba4a34fa58df8fbfd0de0a3aebbdcce2d9356c4c64d","blockSize":4194304,"blocks":["b67216f4f8ce19c462694ba4a34fa58df8fbfd0de0a3aebbdcce2d9356c4c64d"]},"offset":"28965234"},"omit.js":{"size":919,"integrity":{"algorithm":"SHA256","hash":"ffff6c5670e92af930806eaecc3d5cd155babbc5a893ef45de49e5a8b5b36f24","blockSize":4194304,"blocks":["ffff6c5670e92af930806eaecc3d5cd155babbc5a893ef45de49e5a8b5b36f24"]},"offset":"28965859"},"on.js":{"size":926,"integrity":{"algorithm":"SHA256","hash":"1e51e5803453482312fd3186405f70f78aa7bbef368b1c0fde7e9997e8582341","blockSize":4194304,"blocks":["1e51e5803453482312fd3186405f70f78aa7bbef368b1c0fde7e9997e8582341"]},"offset":"28966778"},"once.js":{"size":1037,"integrity":{"algorithm":"SHA256","hash":"3df1b3977b7b2cd72d424190dd20c5a7a3bd54436721da4f63b533bd7a1c77ac","blockSize":4194304,"blocks":["3df1b3977b7b2cd72d424190dd20c5a7a3bd54436721da4f63b533bd7a1c77ac"]},"offset":"28967704"},"or.js":{"size":640,"integrity":{"algorithm":"SHA256","hash":"dff49a4abd08d93169141ff892393b81bf8eb0b5f348e068cc5c8d8644d7925f","blockSize":4194304,"blocks":["dff49a4abd08d93169141ff892393b81bf8eb0b5f348e068cc5c8d8644d7925f"]},"offset":"28968741"},"otherwise.js":{"size":1324,"integrity":{"algorithm":"SHA256","hash":"3d7039304f29aaed29f3a71438aba151d7b078b37c6b65009ac2e2ae9efaa721","blockSize":4194304,"blocks":["3d7039304f29aaed29f3a71438aba151d7b078b37c6b65009ac2e2ae9efaa721"]},"offset":"28969381"},"over.js":{"size":1296,"integrity":{"algorithm":"SHA256","hash":"3427686ddb0d81d8b6e5f779da9b8b0065ca50abe930c68974296f891fd40cf6","blockSize":4194304,"blocks":["3427686ddb0d81d8b6e5f779da9b8b0065ca50abe930c68974296f891fd40cf6"]},"offset":"28970705"},"pair.js":{"size":475,"integrity":{"algorithm":"SHA256","hash":"6d6a813b128c418b1b8ad714d5f530f50188e65607cac3ccc9cae2c984cd5aab","blockSize":4194304,"blocks":["6d6a813b128c418b1b8ad714d5f530f50188e65607cac3ccc9cae2c984cd5aab"]},"offset":"28972001"},"partial.js":{"size":1237,"integrity":{"algorithm":"SHA256","hash":"817cf7ee62b438b51d347f3adb58111ea0444f5e83ca81eb263fcdc8c44339e3","blockSize":4194304,"blocks":["817cf7ee62b438b51d347f3adb58111ea0444f5e83ca81eb263fcdc8c44339e3"]},"offset":"28972476"},"partialObject.js":{"size":1371,"integrity":{"algorithm":"SHA256","hash":"e1e489f2a17ae661109394c8596740e39187af819e5f6fc11a075e18f359cdbf","blockSize":4194304,"blocks":["e1e489f2a17ae661109394c8596740e39187af819e5f6fc11a075e18f359cdbf"]},"offset":"28973713"},"partialRight.js":{"size":1153,"integrity":{"algorithm":"SHA256","hash":"7606d314f4df7b8d44084659542a316dabc3d9d205ef7fced1684df703c7a2aa","blockSize":4194304,"blocks":["7606d314f4df7b8d44084659542a316dabc3d9d205ef7fced1684df703c7a2aa"]},"offset":"28975084"},"partition.js":{"size":1287,"integrity":{"algorithm":"SHA256","hash":"c7b5f68f00c2af414ec07fa545ca6e07a49bfd08a8a9e2719a138475557beff9","blockSize":4194304,"blocks":["c7b5f68f00c2af414ec07fa545ca6e07a49bfd08a8a9e2719a138475557beff9"]},"offset":"28976237"},"path.js":{"size":834,"integrity":{"algorithm":"SHA256","hash":"f783daeb576624b70cf5a4558d631f41319184dcaee4f9f73aa254b30460b19c","blockSize":4194304,"blocks":["f783daeb576624b70cf5a4558d631f41319184dcaee4f9f73aa254b30460b19c"]},"offset":"28977524"},"pathEq.js":{"size":1221,"integrity":{"algorithm":"SHA256","hash":"0b8cb7018a1cb689f79e8245fce0036cda0856bdd24b03a7c7cfc117f3396ae8","blockSize":4194304,"blocks":["0b8cb7018a1cb689f79e8245fce0036cda0856bdd24b03a7c7cfc117f3396ae8"]},"offset":"28978358"},"pathOr.js":{"size":946,"integrity":{"algorithm":"SHA256","hash":"7ca2d2dadb6582f461edc63fbc77b2fc16d97dbdd8df07c8fba2ba47c6a73a3c","blockSize":4194304,"blocks":["7ca2d2dadb6582f461edc63fbc77b2fc16d97dbdd8df07c8fba2ba47c6a73a3c"]},"offset":"28979579"},"pathSatisfies.js":{"size":830,"integrity":{"algorithm":"SHA256","hash":"a1a5230a405b393d8a0f87bd5f98e70236ac33a44869158f31bb01a323a958c0","blockSize":4194304,"blocks":["a1a5230a405b393d8a0f87bd5f98e70236ac33a44869158f31bb01a323a958c0"]},"offset":"28980525"},"paths.js":{"size":1198,"integrity":{"algorithm":"SHA256","hash":"9b1c2e21e8ba37fff0c48734f15bf74450cb2f0ebb77d95fff2ad2125aa7aa34","blockSize":4194304,"blocks":["9b1c2e21e8ba37fff0c48734f15bf74450cb2f0ebb77d95fff2ad2125aa7aa34"]},"offset":"28981355"},"pick.js":{"size":955,"integrity":{"algorithm":"SHA256","hash":"436bc697f7aadcd6a87185d4efce9f52e93fc459dfa0d1ab8409d2ddb16e7f2e","blockSize":4194304,"blocks":["436bc697f7aadcd6a87185d4efce9f52e93fc459dfa0d1ab8409d2ddb16e7f2e"]},"offset":"28982553"},"pickAll.js":{"size":964,"integrity":{"algorithm":"SHA256","hash":"5c396d97280cf1f3ed08f680ca734f648cf04f8c2d260b9463bb978c7e72698d","blockSize":4194304,"blocks":["5c396d97280cf1f3ed08f680ca734f648cf04f8c2d260b9463bb978c7e72698d"]},"offset":"28983508"},"pickBy.js":{"size":971,"integrity":{"algorithm":"SHA256","hash":"8b8e274e8a8aaf30111b9f9b9360ed6d3ff27cbdf47eef5945e401e446d654f9","blockSize":4194304,"blocks":["8b8e274e8a8aaf30111b9f9b9360ed6d3ff27cbdf47eef5945e401e446d654f9"]},"offset":"28984472"},"pipe.js":{"size":1134,"integrity":{"algorithm":"SHA256","hash":"8fa10e8adcb8c12a5276614fd0786a9d35bdd400f4975ae546d9ddaa8f95c22f","blockSize":4194304,"blocks":["8fa10e8adcb8c12a5276614fd0786a9d35bdd400f4975ae546d9ddaa8f95c22f"]},"offset":"28985443"},"pipeWith.js":{"size":1624,"integrity":{"algorithm":"SHA256","hash":"509e3d2015d5f750f69f27d2962dc2fdd326b6a54755f6a3c01deb9de82b1cea","blockSize":4194304,"blocks":["509e3d2015d5f750f69f27d2962dc2fdd326b6a54755f6a3c01deb9de82b1cea"]},"offset":"28986577"},"pluck.js":{"size":1283,"integrity":{"algorithm":"SHA256","hash":"efac8b04e760ee1e5d1f0df80b5469853a46af29168176993118da865466978d","blockSize":4194304,"blocks":["efac8b04e760ee1e5d1f0df80b5469853a46af29168176993118da865466978d"]},"offset":"28988201"},"prepend.js":{"size":726,"integrity":{"algorithm":"SHA256","hash":"21265525da999b94c08a47695aff1cdeac087db2072ac52c8035501ba585954b","blockSize":4194304,"blocks":["21265525da999b94c08a47695aff1cdeac087db2072ac52c8035501ba585954b"]},"offset":"28989484"},"product.js":{"size":517,"integrity":{"algorithm":"SHA256","hash":"4309ce0e08dfcc4c79c299d36346782bd0cbc1077ca5a6ea03e5839df3d379cc","blockSize":4194304,"blocks":["4309ce0e08dfcc4c79c299d36346782bd0cbc1077ca5a6ea03e5839df3d379cc"]},"offset":"28990210"},"project.js":{"size":1029,"integrity":{"algorithm":"SHA256","hash":"d9d8c9bc9538e18a997af768f280e4d0b9ac929f48300cd47faef7613cbe06ce","blockSize":4194304,"blocks":["d9d8c9bc9538e18a997af768f280e4d0b9ac929f48300cd47faef7613cbe06ce"]},"offset":"28990727"},"promap.js":{"size":1620,"integrity":{"algorithm":"SHA256","hash":"c2ed08cacbfa727945ce0e259fc912c07a23c361bdb5225c02d4fb18c4c0a003","blockSize":4194304,"blocks":["c2ed08cacbfa727945ce0e259fc912c07a23c361bdb5225c02d4fb18c4c0a003"]},"offset":"28991756"},"prop.js":{"size":992,"integrity":{"algorithm":"SHA256","hash":"4aafb23b569b85eb11d96ca5acb14d52876bacb217a8283b64d3f69c9aafb9cc","blockSize":4194304,"blocks":["4aafb23b569b85eb11d96ca5acb14d52876bacb217a8283b64d3f69c9aafb9cc"]},"offset":"28993376"},"propEq.js":{"size":1174,"integrity":{"algorithm":"SHA256","hash":"ca931671b89d99134ad56ca94dfcef4a76ec2f31811216abc9448cf533f3d4e4","blockSize":4194304,"blocks":["ca931671b89d99134ad56ca94dfcef4a76ec2f31811216abc9448cf533f3d4e4"]},"offset":"28994368"},"propIs.js":{"size":805,"integrity":{"algorithm":"SHA256","hash":"c6a6179fe3766f207c92b2881299ee3d2d8dff001245080d4d6a85ff6ce96171","blockSize":4194304,"blocks":["c6a6179fe3766f207c92b2881299ee3d2d8dff001245080d4d6a85ff6ce96171"]},"offset":"28995542"},"propOr.js":{"size":1143,"integrity":{"algorithm":"SHA256","hash":"8fc1d71aef24338b7e17b9b7ea68581cfb35e78674b5e8c5bb8e740dcd6fae35","blockSize":4194304,"blocks":["8fc1d71aef24338b7e17b9b7ea68581cfb35e78674b5e8c5bb8e740dcd6fae35"]},"offset":"28996347"},"propSatisfies.js":{"size":767,"integrity":{"algorithm":"SHA256","hash":"2ba5544bbe7d80cd1f724b62caab5c036d655e2f4662cc9d8d00a3f0a648e83b","blockSize":4194304,"blocks":["2ba5544bbe7d80cd1f724b62caab5c036d655e2f4662cc9d8d00a3f0a648e83b"]},"offset":"28997490"},"props.js":{"size":966,"integrity":{"algorithm":"SHA256","hash":"f520e1160e3099539d925f6846b5b9bdb0712a4b3b8ae48fe79f1be04aebf70f","blockSize":4194304,"blocks":["f520e1160e3099539d925f6846b5b9bdb0712a4b3b8ae48fe79f1be04aebf70f"]},"offset":"28998257"},"range.js":{"size":910,"integrity":{"algorithm":"SHA256","hash":"75928e054c3d71174e8865e3f573e4fa7edab8be42e1d0990011959dfa221dec","blockSize":4194304,"blocks":["75928e054c3d71174e8865e3f573e4fa7edab8be42e1d0990011959dfa221dec"]},"offset":"28999223"},"reduce.js":{"size":2074,"integrity":{"algorithm":"SHA256","hash":"858e8e08ad690e4e705aeb38009641712ad189b41d9b5a53d62a9ececf5268a4","blockSize":4194304,"blocks":["858e8e08ad690e4e705aeb38009641712ad189b41d9b5a53d62a9ececf5268a4"]},"offset":"29000133"},"reduceBy.js":{"size":2700,"integrity":{"algorithm":"SHA256","hash":"e137f55f05d68f2fa06e1bac8858beda234fb942dc507e23fa50e902b4a4330e","blockSize":4194304,"blocks":["e137f55f05d68f2fa06e1bac8858beda234fb942dc507e23fa50e902b4a4330e"]},"offset":"29002207"},"reduceRight.js":{"size":2175,"integrity":{"algorithm":"SHA256","hash":"3db3ade6d07fca254bff1eaca5df7573c88994556feb59dcf13baa82b80ef119","blockSize":4194304,"blocks":["3db3ade6d07fca254bff1eaca5df7573c88994556feb59dcf13baa82b80ef119"]},"offset":"29004907"},"reduceWhile.js":{"size":1608,"integrity":{"algorithm":"SHA256","hash":"f785a4aca7d6fe64ff6d4068f19b0390e70c35727254f29851db7b6b173c2e57","blockSize":4194304,"blocks":["f785a4aca7d6fe64ff6d4068f19b0390e70c35727254f29851db7b6b173c2e57"]},"offset":"29007082"},"reduced.js":{"size":1030,"integrity":{"algorithm":"SHA256","hash":"1b0f57c14f38c2a827210b221040f38132b2e7c4884726882ae0a9198939b7ae","blockSize":4194304,"blocks":["1b0f57c14f38c2a827210b221040f38132b2e7c4884726882ae0a9198939b7ae"]},"offset":"29008690"},"reject.js":{"size":973,"integrity":{"algorithm":"SHA256","hash":"cd1e7c291788dc2d5361bdd28a080823eb6bb24f6686e535c2c5c652d87cfacf","blockSize":4194304,"blocks":["cd1e7c291788dc2d5361bdd28a080823eb6bb24f6686e535c2c5c652d87cfacf"]},"offset":"29009720"},"remove.js":{"size":978,"integrity":{"algorithm":"SHA256","hash":"e1ad99bee36dbf0385785cd82076a5d811e3c35daa29063f617144f922a6624b","blockSize":4194304,"blocks":["e1ad99bee36dbf0385785cd82076a5d811e3c35daa29063f617144f922a6624b"]},"offset":"29010693"},"repeat.js":{"size":956,"integrity":{"algorithm":"SHA256","hash":"7da3006304450b24a0c7dc8c3fdc5f4c42bbb441253fe14ec98edeed426230e2","blockSize":4194304,"blocks":["7da3006304450b24a0c7dc8c3fdc5f4c42bbb441253fe14ec98edeed426230e2"]},"offset":"29011671"},"replace.js":{"size":1109,"integrity":{"algorithm":"SHA256","hash":"4e84636f259796e90563f8a6d4af5c25a51cc969f2dd04da297e737ecb2739b9","blockSize":4194304,"blocks":["4e84636f259796e90563f8a6d4af5c25a51cc969f2dd04da297e737ecb2739b9"]},"offset":"29012627"},"reverse.js":{"size":935,"integrity":{"algorithm":"SHA256","hash":"a4983486c2a35851c4fe8db01c54efe0f43d842d90a4005d915e4091995346c7","blockSize":4194304,"blocks":["a4983486c2a35851c4fe8db01c54efe0f43d842d90a4005d915e4091995346c7"]},"offset":"29013736"},"scan.js":{"size":1065,"integrity":{"algorithm":"SHA256","hash":"4f9b7753abd2af1363a60a5e250112323f56211dbebb4033e8fc3e65dd29f409","blockSize":4194304,"blocks":["4f9b7753abd2af1363a60a5e250112323f56211dbebb4033e8fc3e65dd29f409"]},"offset":"29014671"},"sequence.js":{"size":1375,"integrity":{"algorithm":"SHA256","hash":"4178f18c577cf9f34e57faca2d70cd11c6a60ad338940c3329ce81fc519c429a","blockSize":4194304,"blocks":["4178f18c577cf9f34e57faca2d70cd11c6a60ad338940c3329ce81fc519c429a"]},"offset":"29015736"},"set.js":{"size":883,"integrity":{"algorithm":"SHA256","hash":"300641af503d32dc3fbe9239c5067a94efc5fa76b1401b1c3fd319ea4de8df63","blockSize":4194304,"blocks":["300641af503d32dc3fbe9239c5067a94efc5fa76b1401b1c3fd319ea4de8df63"]},"offset":"29017111"},"slice.js":{"size":1230,"integrity":{"algorithm":"SHA256","hash":"6437326cd698e3ba7c947d0e78146a795fa784971039496a3e2c07582a527ce8","blockSize":4194304,"blocks":["6437326cd698e3ba7c947d0e78146a795fa784971039496a3e2c07582a527ce8"]},"offset":"29017994"},"sort.js":{"size":1006,"integrity":{"algorithm":"SHA256","hash":"972e836c69b1c2c41aa25c67ac0e2f7ff3e637870048d1ac0a254b0249efc881","blockSize":4194304,"blocks":["972e836c69b1c2c41aa25c67ac0e2f7ff3e637870048d1ac0a254b0249efc881"]},"offset":"29019224"},"sortBy.js":{"size":1240,"integrity":{"algorithm":"SHA256","hash":"34e197bb4c21fc20512301a3fc9b9b74f60514da8c497658bc20fc9b68b3dd50","blockSize":4194304,"blocks":["34e197bb4c21fc20512301a3fc9b9b74f60514da8c497658bc20fc9b68b3dd50"]},"offset":"29020230"},"sortWith.js":{"size":1226,"integrity":{"algorithm":"SHA256","hash":"5407fa865c0d6fe7313465921e23cbdf0c427d560f0c1d4aaf4b9547fc7fe7de","blockSize":4194304,"blocks":["5407fa865c0d6fe7313465921e23cbdf0c427d560f0c1d4aaf4b9547fc7fe7de"]},"offset":"29021470"},"split.js":{"size":737,"integrity":{"algorithm":"SHA256","hash":"edaf3cc860c5511f5214b9477942224f0e73d6982aeda45e8b23b39f121fed5a","blockSize":4194304,"blocks":["edaf3cc860c5511f5214b9477942224f0e73d6982aeda45e8b23b39f121fed5a"]},"offset":"29022696"},"splitAt.js":{"size":892,"integrity":{"algorithm":"SHA256","hash":"0c2dd6457438f7994aebae834c0d81aa04091131650e60e87e0585603b35f283","blockSize":4194304,"blocks":["0c2dd6457438f7994aebae834c0d81aa04091131650e60e87e0585603b35f283"]},"offset":"29023433"},"splitEvery.js":{"size":873,"integrity":{"algorithm":"SHA256","hash":"efde3430b5fcc786fd1a178c7c151b6cd0d90e870829fab1c7c9e754578a9058","blockSize":4194304,"blocks":["efde3430b5fcc786fd1a178c7c151b6cd0d90e870829fab1c7c9e754578a9058"]},"offset":"29024325"},"splitWhen.js":{"size":1087,"integrity":{"algorithm":"SHA256","hash":"343e1c595cc160cf0eec9f59a1a672756dd3927a33a2888c85a8cdcae598580c","blockSize":4194304,"blocks":["343e1c595cc160cf0eec9f59a1a672756dd3927a33a2888c85a8cdcae598580c"]},"offset":"29025198"},"splitWhenever.js":{"size":923,"integrity":{"algorithm":"SHA256","hash":"cf1d7fad88e8b2f4a23bb6e844443a2391b0bdec36908c5160a6dc5705c14273","blockSize":4194304,"blocks":["cf1d7fad88e8b2f4a23bb6e844443a2391b0bdec36908c5160a6dc5705c14273"]},"offset":"29026285"},"startsWith.js":{"size":906,"integrity":{"algorithm":"SHA256","hash":"cf4b65bcb976a4b29e701beadba59590bac75f9e55d4467590633cf7ff0668a4","blockSize":4194304,"blocks":["cf4b65bcb976a4b29e701beadba59590bac75f9e55d4467590633cf7ff0668a4"]},"offset":"29027208"},"subtract.js":{"size":745,"integrity":{"algorithm":"SHA256","hash":"c0976b7e7a921b17458c7e1992e7347df1ab7986ecbbd15e1c8ef2229b7c404e","blockSize":4194304,"blocks":["c0976b7e7a921b17458c7e1992e7347df1ab7986ecbbd15e1c8ef2229b7c404e"]},"offset":"29028114"},"sum.js":{"size":478,"integrity":{"algorithm":"SHA256","hash":"04bbb4618ca48c0501c8da96cfcd1824ee6423d1990dcd86813539ff1e990fe3","blockSize":4194304,"blocks":["04bbb4618ca48c0501c8da96cfcd1824ee6423d1990dcd86813539ff1e990fe3"]},"offset":"29028859"},"symmetricDifference.js":{"size":966,"integrity":{"algorithm":"SHA256","hash":"83023040a273527764b76473a3e31f7ea71e2efa31b0af36875c085566ce92e4","blockSize":4194304,"blocks":["83023040a273527764b76473a3e31f7ea71e2efa31b0af36875c085566ce92e4"]},"offset":"29029337"},"symmetricDifferenceWith.js":{"size":1318,"integrity":{"algorithm":"SHA256","hash":"1670170b7342247a7d8700ec0f180e453b6d4f77a1b8bf83b35fb81fb6ad0286","blockSize":4194304,"blocks":["1670170b7342247a7d8700ec0f180e453b6d4f77a1b8bf83b35fb81fb6ad0286"]},"offset":"29030303"},"tail.js":{"size":977,"integrity":{"algorithm":"SHA256","hash":"146f9acaf87981c06c6c06cb2eb27e567e900285ed5f95442c703baa2d20f638","blockSize":4194304,"blocks":["146f9acaf87981c06c6c06cb2eb27e567e900285ed5f95442c703baa2d20f638"]},"offset":"29031621"},"take.js":{"size":1696,"integrity":{"algorithm":"SHA256","hash":"271643da7011dd86fe53deb7129e838738f46e30ed14bf12c0c9ef43b024ca52","blockSize":4194304,"blocks":["271643da7011dd86fe53deb7129e838738f46e30ed14bf12c0c9ef43b024ca52"]},"offset":"29032598"},"takeLast.js":{"size":1015,"integrity":{"algorithm":"SHA256","hash":"57f1e41f9f56d085dc4676efa6b650d63e9f7abd3163550b1f90ba64b8f0af5c","blockSize":4194304,"blocks":["57f1e41f9f56d085dc4676efa6b650d63e9f7abd3163550b1f90ba64b8f0af5c"]},"offset":"29034294"},"takeLastWhile.js":{"size":1188,"integrity":{"algorithm":"SHA256","hash":"45575b472adb6ce6070a1609bf637dd240b4325e7df5fe493a5f985961d13779","blockSize":4194304,"blocks":["45575b472adb6ce6070a1609bf637dd240b4325e7df5fe493a5f985961d13779"]},"offset":"29035309"},"takeWhile.js":{"size":1542,"integrity":{"algorithm":"SHA256","hash":"eae6e299c2e4973efde9238abcacac011f718eb93003de1ccfc9d9c4157aa711","blockSize":4194304,"blocks":["eae6e299c2e4973efde9238abcacac011f718eb93003de1ccfc9d9c4157aa711"]},"offset":"29036497"},"tap.js":{"size":884,"integrity":{"algorithm":"SHA256","hash":"00ec5dbd705785507e8e28e8485c3466baeee5aee7526050a750ab180e6c271f","blockSize":4194304,"blocks":["00ec5dbd705785507e8e28e8485c3466baeee5aee7526050a750ab180e6c271f"]},"offset":"29038039"},"test.js":{"size":913,"integrity":{"algorithm":"SHA256","hash":"02001227c921293a8da6012b9976ddbc5718538b446c107139219812afc2ed8d","blockSize":4194304,"blocks":["02001227c921293a8da6012b9976ddbc5718538b446c107139219812afc2ed8d"]},"offset":"29038923"},"thunkify.js":{"size":984,"integrity":{"algorithm":"SHA256","hash":"0d89033e91a9b4094bad387d3f3020b8149fec6788b8bed832e482ac90bcb89a","blockSize":4194304,"blocks":["0d89033e91a9b4094bad387d3f3020b8149fec6788b8bed832e482ac90bcb89a"]},"offset":"29039836"},"times.js":{"size":1195,"integrity":{"algorithm":"SHA256","hash":"6992eff1635a37a103907e3e051503d25bec013fd5c1edc8e0b29bf0575e95c0","blockSize":4194304,"blocks":["6992eff1635a37a103907e3e051503d25bec013fd5c1edc8e0b29bf0575e95c0"]},"offset":"29040820"},"toLower.js":{"size":443,"integrity":{"algorithm":"SHA256","hash":"8e5db79ce5a6c22746de217d90781a46ce98e3f54114f1881a4aaf5b7872b621","blockSize":4194304,"blocks":["8e5db79ce5a6c22746de217d90781a46ce98e3f54114f1881a4aaf5b7872b621"]},"offset":"29042015"},"toPairs.js":{"size":942,"integrity":{"algorithm":"SHA256","hash":"0887fd5ba6c49ef6676863a12f318b43ecb6726bfd24fe25a11681338bff497b","blockSize":4194304,"blocks":["0887fd5ba6c49ef6676863a12f318b43ecb6726bfd24fe25a11681338bff497b"]},"offset":"29042458"},"toPairsIn.js":{"size":944,"integrity":{"algorithm":"SHA256","hash":"d5e43860f3b4d33df3f5243214577176b7ba8cf01c876e4fb859280e83ca8a31","blockSize":4194304,"blocks":["d5e43860f3b4d33df3f5243214577176b7ba8cf01c876e4fb859280e83ca8a31"]},"offset":"29043400"},"toString.js":{"size":1478,"integrity":{"algorithm":"SHA256","hash":"9a43b51957f2400e91829e1fe1536a54d92ad9eff3de64b749d3ef519e5832f1","blockSize":4194304,"blocks":["9a43b51957f2400e91829e1fe1536a54d92ad9eff3de64b749d3ef519e5832f1"]},"offset":"29044344"},"toUpper.js":{"size":443,"integrity":{"algorithm":"SHA256","hash":"ce3adb954148a37f618c582d578b5357383b6fce8f1ee8869e51e73438eda082","blockSize":4194304,"blocks":["ce3adb954148a37f618c582d578b5357383b6fce8f1ee8869e51e73438eda082"]},"offset":"29045822"},"transduce.js":{"size":2682,"integrity":{"algorithm":"SHA256","hash":"f092a54d627037685a8ff66fae0b76cb313ee5303ee1af9b276ff27e310cb457","blockSize":4194304,"blocks":["f092a54d627037685a8ff66fae0b76cb313ee5303ee1af9b276ff27e310cb457"]},"offset":"29046265"},"transpose.js":{"size":1329,"integrity":{"algorithm":"SHA256","hash":"f5d66fd6b7bca519b0be491dc91fd29a8698e22cddb861a6649dbde466365306","blockSize":4194304,"blocks":["f5d66fd6b7bca519b0be491dc91fd29a8698e22cddb861a6649dbde466365306"]},"offset":"29048947"},"traverse.js":{"size":1470,"integrity":{"algorithm":"SHA256","hash":"e753b2c570f6ef9675d7d731a5c3e66eaf9b99316c6d026df3d9b3a0eb7dc877","blockSize":4194304,"blocks":["e753b2c570f6ef9675d7d731a5c3e66eaf9b99316c6d026df3d9b3a0eb7dc877"]},"offset":"29050276"},"trim.js":{"size":1079,"integrity":{"algorithm":"SHA256","hash":"09ce4c723e43e3565fc84f70e6f436a18d04ed6f05fce9207811a83b4018cdf9","blockSize":4194304,"blocks":["09ce4c723e43e3565fc84f70e6f436a18d04ed6f05fce9207811a83b4018cdf9"]},"offset":"29051746"},"tryCatch.js":{"size":1664,"integrity":{"algorithm":"SHA256","hash":"6af07145337c2d949c5ae9813cad064a7f416e77d6ff88af930e07a8b7d0b0ce","blockSize":4194304,"blocks":["6af07145337c2d949c5ae9813cad064a7f416e77d6ff88af930e07a8b7d0b0ce"]},"offset":"29052825"},"type.js":{"size":1009,"integrity":{"algorithm":"SHA256","hash":"a675b78b9e3ac8e66e1cdcecb04c811414f22a9d8e3b61b1ccd1492e8a0ceefd","blockSize":4194304,"blocks":["a675b78b9e3ac8e66e1cdcecb04c811414f22a9d8e3b61b1ccd1492e8a0ceefd"]},"offset":"29054489"},"unapply.js":{"size":909,"integrity":{"algorithm":"SHA256","hash":"bb31460201ec88e0f37bef14b3becaf9e469520355823581abd4ed756c0a45c0","blockSize":4194304,"blocks":["bb31460201ec88e0f37bef14b3becaf9e469520355823581abd4ed756c0a45c0"]},"offset":"29055498"},"unary.js":{"size":1104,"integrity":{"algorithm":"SHA256","hash":"322bde3d3f67b55891db92d681f4558021e749a63b3d7ce61eec4e5be71798c8","blockSize":4194304,"blocks":["322bde3d3f67b55891db92d681f4558021e749a63b3d7ce61eec4e5be71798c8"]},"offset":"29056407"},"uncurryN.js":{"size":1362,"integrity":{"algorithm":"SHA256","hash":"814c310ec1e2ea61227f45885da63fa59dc98f48813dee7d405d1c8af0cd9b63","blockSize":4194304,"blocks":["814c310ec1e2ea61227f45885da63fa59dc98f48813dee7d405d1c8af0cd9b63"]},"offset":"29057511"},"unfold.js":{"size":1342,"integrity":{"algorithm":"SHA256","hash":"c8e35fe1f166daf7bfd2c5b2c78176584dabb2db12447d77f8c298dd5ec2910b","blockSize":4194304,"blocks":["c8e35fe1f166daf7bfd2c5b2c78176584dabb2db12447d77f8c298dd5ec2910b"]},"offset":"29058873"},"union.js":{"size":766,"integrity":{"algorithm":"SHA256","hash":"2ea00f3fb78d5f04c0a524156e719d1b689b02f0da7a1c58a7b318c6043f3800","blockSize":4194304,"blocks":["2ea00f3fb78d5f04c0a524156e719d1b689b02f0da7a1c58a7b318c6043f3800"]},"offset":"29060215"},"unionWith.js":{"size":1212,"integrity":{"algorithm":"SHA256","hash":"e710496d53dbb70ddae8373c47680e93ae87f3135c363dd4d55aa07d57bea6ec","blockSize":4194304,"blocks":["e710496d53dbb70ddae8373c47680e93ae87f3135c363dd4d55aa07d57bea6ec"]},"offset":"29060981"},"uniq.js":{"size":638,"integrity":{"algorithm":"SHA256","hash":"83c055fc3473ca36026cce07bd2ae423f22891be56005e017c05a649b4985357","blockSize":4194304,"blocks":["83c055fc3473ca36026cce07bd2ae423f22891be56005e017c05a649b4985357"]},"offset":"29062193"},"uniqBy.js":{"size":1405,"integrity":{"algorithm":"SHA256","hash":"dda72936d244fcb71d626d24deba794e6331241461ff0036b3b610e1cdf7c92d","blockSize":4194304,"blocks":["dda72936d244fcb71d626d24deba794e6331241461ff0036b3b610e1cdf7c92d"]},"offset":"29062831"},"uniqWith.js":{"size":1539,"integrity":{"algorithm":"SHA256","hash":"ce03328ebfb4129b0af16ff925317adf31c52ce74f9417092bcb225731cc7481","blockSize":4194304,"blocks":["ce03328ebfb4129b0af16ff925317adf31c52ce74f9417092bcb225731cc7481"]},"offset":"29064236"},"unless.js":{"size":1172,"integrity":{"algorithm":"SHA256","hash":"eba73b2bf824eef1132e147aac71095f45ec6e94f1bcf8e0ed34e6a334fec8f3","blockSize":4194304,"blocks":["eba73b2bf824eef1132e147aac71095f45ec6e94f1bcf8e0ed34e6a334fec8f3"]},"offset":"29065775"},"unnest.js":{"size":634,"integrity":{"algorithm":"SHA256","hash":"8389844c013adbf06b9785bcf70a62dc339138d75014d15fd61f139dcfa1b1a6","blockSize":4194304,"blocks":["8389844c013adbf06b9785bcf70a62dc339138d75014d15fd61f139dcfa1b1a6"]},"offset":"29066947"},"until.js":{"size":875,"integrity":{"algorithm":"SHA256","hash":"540a301ce69acffa274f3183561e8ffd85fbf1b3c306871122131399754a3c05","blockSize":4194304,"blocks":["540a301ce69acffa274f3183561e8ffd85fbf1b3c306871122131399754a3c05"]},"offset":"29067581"},"unwind.js":{"size":1559,"integrity":{"algorithm":"SHA256","hash":"79e0f0725dfabb329ca6addfd593a8c5c4adf3c58e3c09347d8392ea08ab2707","blockSize":4194304,"blocks":["79e0f0725dfabb329ca6addfd593a8c5c4adf3c58e3c09347d8392ea08ab2707"]},"offset":"29068456"},"update.js":{"size":1093,"integrity":{"algorithm":"SHA256","hash":"8a4a3728f38145561f00b504f8946b0428500b403eb01a9b4b1d4ad32d39331e","blockSize":4194304,"blocks":["8a4a3728f38145561f00b504f8946b0428500b403eb01a9b4b1d4ad32d39331e"]},"offset":"29070015"},"useWith.js":{"size":1841,"integrity":{"algorithm":"SHA256","hash":"86f1df11fbd725073f940b50b9465ea7872e43e425be9a6012ea76f767bc0c0e","blockSize":4194304,"blocks":["86f1df11fbd725073f940b50b9465ea7872e43e425be9a6012ea76f767bc0c0e"]},"offset":"29071108"},"values.js":{"size":877,"integrity":{"algorithm":"SHA256","hash":"c4c3510c1f4973b091178f44f860b466b9acfba5a27148c1bb9f65a13c2e702e","blockSize":4194304,"blocks":["c4c3510c1f4973b091178f44f860b466b9acfba5a27148c1bb9f65a13c2e702e"]},"offset":"29072949"},"valuesIn.js":{"size":892,"integrity":{"algorithm":"SHA256","hash":"28eb1c377b18511363870eb42c952d62677ab533f1d7d3de9737ca9bf0543b22","blockSize":4194304,"blocks":["28eb1c377b18511363870eb42c952d62677ab533f1d7d3de9737ca9bf0543b22"]},"offset":"29073826"},"view.js":{"size":1109,"integrity":{"algorithm":"SHA256","hash":"10049cac7b1dd751fb6deead2d096afa6c899e61e02f7ce66c8803d551021d53","blockSize":4194304,"blocks":["10049cac7b1dd751fb6deead2d096afa6c899e61e02f7ce66c8803d551021d53"]},"offset":"29074718"},"when.js":{"size":1355,"integrity":{"algorithm":"SHA256","hash":"5de6d00fbcc45c58ff3d2e7d01e7800562accd8480d8602451a68caf8e6f1dfc","blockSize":4194304,"blocks":["5de6d00fbcc45c58ff3d2e7d01e7800562accd8480d8602451a68caf8e6f1dfc"]},"offset":"29075827"},"where.js":{"size":1583,"integrity":{"algorithm":"SHA256","hash":"74521d4a4b1427621991b1de87646f8e25059ebace9e3f90daee534c577e9657","blockSize":4194304,"blocks":["74521d4a4b1427621991b1de87646f8e25059ebace9e3f90daee534c577e9657"]},"offset":"29077182"},"whereAny.js":{"size":1559,"integrity":{"algorithm":"SHA256","hash":"3b80569f2bf4c8d090ac719bc2823d3092a9d9bef4bcdc2eb6296cbbb891c691","blockSize":4194304,"blocks":["3b80569f2bf4c8d090ac719bc2823d3092a9d9bef4bcdc2eb6296cbbb891c691"]},"offset":"29078765"},"whereEq.js":{"size":1234,"integrity":{"algorithm":"SHA256","hash":"b72b6658e8efed63c2940a80bb1012311a3a9da91d0be364afc5c2158bf5d7b8","blockSize":4194304,"blocks":["b72b6658e8efed63c2940a80bb1012311a3a9da91d0be364afc5c2158bf5d7b8"]},"offset":"29080324"},"without.js":{"size":942,"integrity":{"algorithm":"SHA256","hash":"95ee6ac27712b7ec97d834714cfde8a9a294171ca9793214f6b9df46a071829e","blockSize":4194304,"blocks":["95ee6ac27712b7ec97d834714cfde8a9a294171ca9793214f6b9df46a071829e"]},"offset":"29081558"},"xor.js":{"size":730,"integrity":{"algorithm":"SHA256","hash":"bc0d18aecc74065363c583062e7325dca50129d7b6bd0acc49f40a59bd1790b6","blockSize":4194304,"blocks":["bc0d18aecc74065363c583062e7325dca50129d7b6bd0acc49f40a59bd1790b6"]},"offset":"29082500"},"xprod.js":{"size":1015,"integrity":{"algorithm":"SHA256","hash":"18870d13955a83b41b524711a4e29c2ffd393a05d50fdf6d6877d45c4690de7d","blockSize":4194304,"blocks":["18870d13955a83b41b524711a4e29c2ffd393a05d50fdf6d6877d45c4690de7d"]},"offset":"29083230"},"zip.js":{"size":1029,"integrity":{"algorithm":"SHA256","hash":"843a57c9db7d4c9bf7f71aef1a971aaa0c3782d09bcbe75cb88594a195293234","blockSize":4194304,"blocks":["843a57c9db7d4c9bf7f71aef1a971aaa0c3782d09bcbe75cb88594a195293234"]},"offset":"29084245"},"zipObj.js":{"size":974,"integrity":{"algorithm":"SHA256","hash":"9b1f7df7f2e0f446f0c310a9d6219595713cca17eb0ac79f67fad70cfbb59a84","blockSize":4194304,"blocks":["9b1f7df7f2e0f446f0c310a9d6219595713cca17eb0ac79f67fad70cfbb59a84"]},"offset":"29085274"},"zipWith.js":{"size":1199,"integrity":{"algorithm":"SHA256","hash":"55a87a87ff9afe9ec42895fed451b52577b2212f2fc81388bbae5c957aac4d32","blockSize":4194304,"blocks":["55a87a87ff9afe9ec42895fed451b52577b2212f2fc81388bbae5c957aac4d32"]},"offset":"29086248"},"internal":{"files":{"_Set.js":{"size":4688,"integrity":{"algorithm":"SHA256","hash":"870e0b91c0ed47860e94a0d649a1f85685369c3d8b4a135ca568ebf1aa44ad6d","blockSize":4194304,"blocks":["870e0b91c0ed47860e94a0d649a1f85685369c3d8b4a135ca568ebf1aa44ad6d"]},"offset":"29087447"},"_aperture.js":{"size":280,"integrity":{"algorithm":"SHA256","hash":"b472c6520abdc83440962103343285913b161678109d1c6d5eb1da1b9d6577ed","blockSize":4194304,"blocks":["b472c6520abdc83440962103343285913b161678109d1c6d5eb1da1b9d6577ed"]},"offset":"29092135"},"_arity.js":{"size":1426,"integrity":{"algorithm":"SHA256","hash":"7ddd02e4d2e3db2428ca00dd89ca69467509130ade58032a852919d116d8f6f9","blockSize":4194304,"blocks":["7ddd02e4d2e3db2428ca00dd89ca69467509130ade58032a852919d116d8f6f9"]},"offset":"29092415"},"_arrayFromIterator.js":{"size":191,"integrity":{"algorithm":"SHA256","hash":"b63c3880d7962bd3ed1a4fa6e26ee8dd51e1c4e09e8d414aaaeabcc8b535c1b4","blockSize":4194304,"blocks":["b63c3880d7962bd3ed1a4fa6e26ee8dd51e1c4e09e8d414aaaeabcc8b535c1b4"]},"offset":"29093841"},"_assertPromise.js":{"size":329,"integrity":{"algorithm":"SHA256","hash":"cf441f00cad04cb25bba44f68deb0f252987796cfdbc40c2125c2b16b76bb7d6","blockSize":4194304,"blocks":["cf441f00cad04cb25bba44f68deb0f252987796cfdbc40c2125c2b16b76bb7d6"]},"offset":"29094032"},"_assoc.js":{"size":917,"integrity":{"algorithm":"SHA256","hash":"244383f13a3640e7488fa75ef552a4b8118ce6109f9b9c6b31e89ca4009bed95","blockSize":4194304,"blocks":["244383f13a3640e7488fa75ef552a4b8118ce6109f9b9c6b31e89ca4009bed95"]},"offset":"29094361"},"_checkForMethod.js":{"size":848,"integrity":{"algorithm":"SHA256","hash":"5b871df00a04b68bf492c9f562fe996a08f0fc27c391379ba983097d4f361c3a","blockSize":4194304,"blocks":["5b871df00a04b68bf492c9f562fe996a08f0fc27c391379ba983097d4f361c3a"]},"offset":"29095278"},"_clone.js":{"size":1577,"integrity":{"algorithm":"SHA256","hash":"80288daa7cf0f260bacde2da76815b7236887ecfb20bb313ac8de9daf93d1ffa","blockSize":4194304,"blocks":["80288daa7cf0f260bacde2da76815b7236887ecfb20bb313ac8de9daf93d1ffa"]},"offset":"29096126"},"_cloneRegExp.js":{"size":260,"integrity":{"algorithm":"SHA256","hash":"2e9dbe9f484f794aaf4cc1fcc0430c29ff5f5320502d425b8ebb99fe3809c29f","blockSize":4194304,"blocks":["2e9dbe9f484f794aaf4cc1fcc0430c29ff5f5320502d425b8ebb99fe3809c29f"]},"offset":"29097703"},"_complement.js":{"size":124,"integrity":{"algorithm":"SHA256","hash":"47a8c4bbff99a4f5d5f53bc0340fb6929a607d4d01d39b53fc5b4f675c261c07","blockSize":4194304,"blocks":["47a8c4bbff99a4f5d5f53bc0340fb6929a607d4d01d39b53fc5b4f675c261c07"]},"offset":"29097963"},"_concat.js":{"size":709,"integrity":{"algorithm":"SHA256","hash":"012a972adb511b4309e5e112c230388e373a96f23442724c6c3b3968830d1e84","blockSize":4194304,"blocks":["012a972adb511b4309e5e112c230388e373a96f23442724c6c3b3968830d1e84"]},"offset":"29098087"},"_createPartialApplicator.js":{"size":372,"integrity":{"algorithm":"SHA256","hash":"09851a16b6f216d8b88eace1fc93f27ead5f22cf4781fb4191a01ecfd5b15e5f","blockSize":4194304,"blocks":["09851a16b6f216d8b88eace1fc93f27ead5f22cf4781fb4191a01ecfd5b15e5f"]},"offset":"29098796"},"_curry1.js":{"size":466,"integrity":{"algorithm":"SHA256","hash":"f3b3e95e170f86c27aecb1e1bb274dede9b771af7d642ba9b79bbc21a448de74","blockSize":4194304,"blocks":["f3b3e95e170f86c27aecb1e1bb274dede9b771af7d642ba9b79bbc21a448de74"]},"offset":"29099168"},"_curry2.js":{"size":839,"integrity":{"algorithm":"SHA256","hash":"7e8856ec17bba9b7685e7008d321dc8786c2416639653bd62fec77289a551dd1","blockSize":4194304,"blocks":["7e8856ec17bba9b7685e7008d321dc8786c2416639653bd62fec77289a551dd1"]},"offset":"29099634"},"_curry3.js":{"size":1695,"integrity":{"algorithm":"SHA256","hash":"044643914149b2b530d6bc7c2c6635d773aa23fd31714b27ae853b48856b3a37","blockSize":4194304,"blocks":["044643914149b2b530d6bc7c2c6635d773aa23fd31714b27ae853b48856b3a37"]},"offset":"29100473"},"_curryN.js":{"size":1169,"integrity":{"algorithm":"SHA256","hash":"2b1b7f49b2c0f5576c3f0605e4cb67b7d25a8e208d6701c67cbf76a7d7169715","blockSize":4194304,"blocks":["2b1b7f49b2c0f5576c3f0605e4cb67b7d25a8e208d6701c67cbf76a7d7169715"]},"offset":"29102168"},"_dispatchable.js":{"size":1629,"integrity":{"algorithm":"SHA256","hash":"5f8883de0c1e1501348199347691bf04eac205db92aaa24af2ea3671b49abad7","blockSize":4194304,"blocks":["5f8883de0c1e1501348199347691bf04eac205db92aaa24af2ea3671b49abad7"]},"offset":"29103337"},"_dissoc.js":{"size":765,"integrity":{"algorithm":"SHA256","hash":"adcb1e4276ed90d57082bd998e35eec1636d804cc3c841d4c0c58a929e3c5b89","blockSize":4194304,"blocks":["adcb1e4276ed90d57082bd998e35eec1636d804cc3c841d4c0c58a929e3c5b89"]},"offset":"29104966"},"_dropLast.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"ffa9092f935cd25d057aedac7155047cce5a74dae3c383530dd94576357fb561","blockSize":4194304,"blocks":["ffa9092f935cd25d057aedac7155047cce5a74dae3c383530dd94576357fb561"]},"offset":"29105731"},"_dropLastWhile.js":{"size":237,"integrity":{"algorithm":"SHA256","hash":"08e2c1c3af52833c4a924a230b5ce1b1aaa5c83f5901259b59d214f0db699f13","blockSize":4194304,"blocks":["08e2c1c3af52833c4a924a230b5ce1b1aaa5c83f5901259b59d214f0db699f13"]},"offset":"29105890"},"_equals.js":{"size":4072,"integrity":{"algorithm":"SHA256","hash":"dba6ca68da577074feaf239d3ca1a354d2775aef0953f011b53e15b342542f1d","blockSize":4194304,"blocks":["dba6ca68da577074feaf239d3ca1a354d2775aef0953f011b53e15b342542f1d"]},"offset":"29106127"},"_filter.js":{"size":248,"integrity":{"algorithm":"SHA256","hash":"17698f51492473914aac8ca588c08f12135dd714b96e0652160bcb6176aca387","blockSize":4194304,"blocks":["17698f51492473914aac8ca588c08f12135dd714b96e0652160bcb6176aca387"]},"offset":"29110199"},"_flatCat.js":{"size":1036,"integrity":{"algorithm":"SHA256","hash":"f564ca9a4f9595fc82d0294dcb4dfb09d10321fb7a507288b3b21ffa8f14aa7d","blockSize":4194304,"blocks":["f564ca9a4f9595fc82d0294dcb4dfb09d10321fb7a507288b3b21ffa8f14aa7d"]},"offset":"29110447"},"_forceReduced.js":{"size":140,"integrity":{"algorithm":"SHA256","hash":"5d47f78f68e38ad737fcc6e2edf6c7fa4c593d12e1af32eb86dda93554fd3fb6","blockSize":4194304,"blocks":["5d47f78f68e38ad737fcc6e2edf6c7fa4c593d12e1af32eb86dda93554fd3fb6"]},"offset":"29111483"},"_functionName.js":{"size":225,"integrity":{"algorithm":"SHA256","hash":"8f23d1149c20d46876a4d0dddb87587037f3318a0022973439e56b3c4deb25fa","blockSize":4194304,"blocks":["8f23d1149c20d46876a4d0dddb87587037f3318a0022973439e56b3c4deb25fa"]},"offset":"29111623"},"_functionsWith.js":{"size":445,"integrity":{"algorithm":"SHA256","hash":"698fd67bcced777c995d6e7f13adc3ff2d117d0c85c707a6099bd7ea1f12aa01","blockSize":4194304,"blocks":["698fd67bcced777c995d6e7f13adc3ff2d117d0c85c707a6099bd7ea1f12aa01"]},"offset":"29111848"},"_has.js":{"size":110,"integrity":{"algorithm":"SHA256","hash":"3d34b5c4731281db6c847471862d85159d9742e53465a81ece8d98fdf39f6f78","blockSize":4194304,"blocks":["3d34b5c4731281db6c847471862d85159d9742e53465a81ece8d98fdf39f6f78"]},"offset":"29112293"},"_identity.js":{"size":66,"integrity":{"algorithm":"SHA256","hash":"ac5fe1edf4b709fa25760cd95c9c34a5cea2b33a4196d1b25a6f0813e3192938","blockSize":4194304,"blocks":["ac5fe1edf4b709fa25760cd95c9c34a5cea2b33a4196d1b25a6f0813e3192938"]},"offset":"29112403"},"_includes.js":{"size":152,"integrity":{"algorithm":"SHA256","hash":"25cdf160f0337b54c98b43e747a4436acae321b003c792b5951906ac05e61d37","blockSize":4194304,"blocks":["25cdf160f0337b54c98b43e747a4436acae321b003c792b5951906ac05e61d37"]},"offset":"29112469"},"_includesWith.js":{"size":228,"integrity":{"algorithm":"SHA256","hash":"53bcb1cd41de7d3f15a875e423ac0abd3414b8b0a7c0fa258f1d7508c7f37046","blockSize":4194304,"blocks":["53bcb1cd41de7d3f15a875e423ac0abd3414b8b0a7c0fa258f1d7508c7f37046"]},"offset":"29112621"},"_indexOf.js":{"size":1452,"integrity":{"algorithm":"SHA256","hash":"8bd9d2fbdd751e417b2bc6402df06ccf65ae9b51d8900985bb5ae47fabc5d85b","blockSize":4194304,"blocks":["8bd9d2fbdd751e417b2bc6402df06ccf65ae9b51d8900985bb5ae47fabc5d85b"]},"offset":"29112849"},"_isArguments.js":{"size":384,"integrity":{"algorithm":"SHA256","hash":"fd59814d28ec0d232c0e7411e2c3d7ea211e7f014492c907ff6cd8ee9fd30e7c","blockSize":4194304,"blocks":["fd59814d28ec0d232c0e7411e2c3d7ea211e7f014492c907ff6cd8ee9fd30e7c"]},"offset":"29114301"},"_isArray.js":{"size":454,"integrity":{"algorithm":"SHA256","hash":"7fcd5b11f4b601b6a4d1467cef27f8637aa06192f862d539be4084f225eb43a6","blockSize":4194304,"blocks":["7fcd5b11f4b601b6a4d1467cef27f8637aa06192f862d539be4084f225eb43a6"]},"offset":"29114685"},"_isArrayLike.js":{"size":1191,"integrity":{"algorithm":"SHA256","hash":"238895d173bc27a0814db4027746b2a8f7db780873bbc05133da52e81a727f40","blockSize":4194304,"blocks":["238895d173bc27a0814db4027746b2a8f7db780873bbc05133da52e81a727f40"]},"offset":"29115139"},"_isFunction.js":{"size":269,"integrity":{"algorithm":"SHA256","hash":"6fd0b618ec926b06758bf489712d977aa2342368558a3962787ce232f8a91fde","blockSize":4194304,"blocks":["6fd0b618ec926b06758bf489712d977aa2342368558a3962787ce232f8a91fde"]},"offset":"29116330"},"_isInteger.js":{"size":216,"integrity":{"algorithm":"SHA256","hash":"45e8cb5320ccff3d1297778c986dcda16a938a017775c062a1eeb1fdb0f5d629","blockSize":4194304,"blocks":["45e8cb5320ccff3d1297778c986dcda16a938a017775c062a1eeb1fdb0f5d629"]},"offset":"29116599"},"_isNumber.js":{"size":120,"integrity":{"algorithm":"SHA256","hash":"84043ebc1bafd77dcfe1735b4564fcf6328f5d22cb74582cb3b4a779c20237f0","blockSize":4194304,"blocks":["84043ebc1bafd77dcfe1735b4564fcf6328f5d22cb74582cb3b4a779c20237f0"]},"offset":"29116815"},"_isObject.js":{"size":120,"integrity":{"algorithm":"SHA256","hash":"75f1073c180702dbfa8bbd0f9fa4b750e354f3a25a8f44c5acc5cda66e5e070f","blockSize":4194304,"blocks":["75f1073c180702dbfa8bbd0f9fa4b750e354f3a25a8f44c5acc5cda66e5e070f"]},"offset":"29116935"},"_isPlaceholder.js":{"size":151,"integrity":{"algorithm":"SHA256","hash":"0ae02e2cf416d3b56c93eca1625eec46238210cb2a48bd02cf9d447d7521d1fe","blockSize":4194304,"blocks":["0ae02e2cf416d3b56c93eca1625eec46238210cb2a48bd02cf9d447d7521d1fe"]},"offset":"29117055"},"_isRegExp.js":{"size":120,"integrity":{"algorithm":"SHA256","hash":"dc483e7ff8cb12fe604b8d35d82b67c8396658fad9697bb1980de298d63592c5","blockSize":4194304,"blocks":["dc483e7ff8cb12fe604b8d35d82b67c8396658fad9697bb1980de298d63592c5"]},"offset":"29117206"},"_isString.js":{"size":120,"integrity":{"algorithm":"SHA256","hash":"5ad201a43077ed9ac4ad9be9213377f2343677c5e1cc49fc67bf68041513c8af","blockSize":4194304,"blocks":["5ad201a43077ed9ac4ad9be9213377f2343677c5e1cc49fc67bf68041513c8af"]},"offset":"29117326"},"_isTransformer.js":{"size":138,"integrity":{"algorithm":"SHA256","hash":"75ad925a9acc15f1678308a0ed085f7babe154f2c849a48fc202499fef1a91e3","blockSize":4194304,"blocks":["75ad925a9acc15f1678308a0ed085f7babe154f2c849a48fc202499fef1a91e3"]},"offset":"29117446"},"_isTypedArray.js":{"size":940,"integrity":{"algorithm":"SHA256","hash":"2f1a54b71064f04a1d7e8eaf69913a914f5c74cba380c7cfe4ec2a54f76a75b8","blockSize":4194304,"blocks":["2f1a54b71064f04a1d7e8eaf69913a914f5c74cba380c7cfe4ec2a54f76a75b8"]},"offset":"29117584"},"_makeFlat.js":{"size":772,"integrity":{"algorithm":"SHA256","hash":"4943c946edbef339426781705148c71aee78d3701cb982493cf2b716e5e963d7","blockSize":4194304,"blocks":["4943c946edbef339426781705148c71aee78d3701cb982493cf2b716e5e963d7"]},"offset":"29118524"},"_map.js":{"size":219,"integrity":{"algorithm":"SHA256","hash":"6b5935117fa7aceb94477127a7da0c362f0810c9407055846354fc8a1de4e6ed","blockSize":4194304,"blocks":["6b5935117fa7aceb94477127a7da0c362f0810c9407055846354fc8a1de4e6ed"]},"offset":"29119296"},"_modify.js":{"size":974,"integrity":{"algorithm":"SHA256","hash":"26a77e7b12944d1250c65f8db70a21604342bf682038c916f55bcbc47f5cd0df","blockSize":4194304,"blocks":["26a77e7b12944d1250c65f8db70a21604342bf682038c916f55bcbc47f5cd0df"]},"offset":"29119515"},"_objectAssign.js":{"size":718,"integrity":{"algorithm":"SHA256","hash":"462b3fb37283516c3353d9f361620f78077c5b15484ba82f9a770ec82d34fe6f","blockSize":4194304,"blocks":["462b3fb37283516c3353d9f361620f78077c5b15484ba82f9a770ec82d34fe6f"]},"offset":"29120489"},"_objectIs.js":{"size":415,"integrity":{"algorithm":"SHA256","hash":"3c7217587a5115ab4c49a202ecbcf2f2f454e0325b97d6cf967819a81436b25f","blockSize":4194304,"blocks":["3c7217587a5115ab4c49a202ecbcf2f2f454e0325b97d6cf967819a81436b25f"]},"offset":"29121207"},"_of.js":{"size":56,"integrity":{"algorithm":"SHA256","hash":"a2e6241b7786ac599046b08ac94b03136739a37ba1df77275735d24aaf6fd597","blockSize":4194304,"blocks":["a2e6241b7786ac599046b08ac94b03136739a37ba1df77275735d24aaf6fd597"]},"offset":"29121622"},"_pipe.js":{"size":128,"integrity":{"algorithm":"SHA256","hash":"eeaecfaad62a3e467aa47cb6c821b27a02d65dd8416a95d7196490fc30d37738","blockSize":4194304,"blocks":["eeaecfaad62a3e467aa47cb6c821b27a02d65dd8416a95d7196490fc30d37738"]},"offset":"29121678"},"_pipeP.js":{"size":191,"integrity":{"algorithm":"SHA256","hash":"85f0147f1d63abb013db28d180cf79fb88a73e645585d66e05a5c5fbdb2175a5","blockSize":4194304,"blocks":["85f0147f1d63abb013db28d180cf79fb88a73e645585d66e05a5c5fbdb2175a5"]},"offset":"29121806"},"_promap.js":{"size":126,"integrity":{"algorithm":"SHA256","hash":"b086c2ed97cf09aee78328c43af7577094bcfa95d54587a5c2b2847fe4e719a8","blockSize":4194304,"blocks":["b086c2ed97cf09aee78328c43af7577094bcfa95d54587a5c2b2847fe4e719a8"]},"offset":"29121997"},"_quote.js":{"size":352,"integrity":{"algorithm":"SHA256","hash":"09b8aa74bb2926980038472ffb5666572a3827f582f45aa507fd8fc9d0971311","blockSize":4194304,"blocks":["09b8aa74bb2926980038472ffb5666572a3827f582f45aa507fd8fc9d0971311"]},"offset":"29122123"},"_reduce.js":{"size":1714,"integrity":{"algorithm":"SHA256","hash":"5c6315db57c4d3829f9663f871c563d8144d504d676c493a5428e4d7fda18749","blockSize":4194304,"blocks":["5c6315db57c4d3829f9663f871c563d8144d504d676c493a5428e4d7fda18749"]},"offset":"29122475"},"_reduced.js":{"size":167,"integrity":{"algorithm":"SHA256","hash":"87c4a9f935105ae5e25b27be71b04ed98f1e6639465a80c934eea8b28bb2d67b","blockSize":4194304,"blocks":["87c4a9f935105ae5e25b27be71b04ed98f1e6639465a80c934eea8b28bb2d67b"]},"offset":"29124189"},"_stepCat.js":{"size":1221,"integrity":{"algorithm":"SHA256","hash":"7a818bdf5e5ed8f24522377c8c25014435fda7938828b896151943a9b8dbd739","blockSize":4194304,"blocks":["7a818bdf5e5ed8f24522377c8c25014435fda7938828b896151943a9b8dbd739"]},"offset":"29124356"},"_toISOString.js":{"size":630,"integrity":{"algorithm":"SHA256","hash":"e6101726e24d25b3c7be9ed6a860a0f8f1b1666fd12f20ec7cb16eb263b65c99","blockSize":4194304,"blocks":["e6101726e24d25b3c7be9ed6a860a0f8f1b1666fd12f20ec7cb16eb263b65c99"]},"offset":"29125577"},"_toString.js":{"size":1922,"integrity":{"algorithm":"SHA256","hash":"ec110e78389e4f48599c21e97351738c6218eb41c39e4e59b9ac7bf4411b8fac","blockSize":4194304,"blocks":["ec110e78389e4f48599c21e97351738c6218eb41c39e4e59b9ac7bf4411b8fac"]},"offset":"29126207"},"_xall.js":{"size":900,"integrity":{"algorithm":"SHA256","hash":"0d5fb02c425f39f971938dacdb624be052f14608561c2d2f2a58b3de4d670491","blockSize":4194304,"blocks":["0d5fb02c425f39f971938dacdb624be052f14608561c2d2f2a58b3de4d670491"]},"offset":"29128129"},"_xany.js":{"size":900,"integrity":{"algorithm":"SHA256","hash":"98e912949b96a9db536e5734900cd7c95871da4f04f36d00cae9afb87aaf640d","blockSize":4194304,"blocks":["98e912949b96a9db536e5734900cd7c95871da4f04f36d00cae9afb87aaf640d"]},"offset":"29129029"},"_xaperture.js":{"size":1247,"integrity":{"algorithm":"SHA256","hash":"02e93359b06498b1ec77d1f6f4864197c62baec59c96b1fb21639f7f6dac31e2","blockSize":4194304,"blocks":["02e93359b06498b1ec77d1f6f4864197c62baec59c96b1fb21639f7f6dac31e2"]},"offset":"29129929"},"_xchain.js":{"size":280,"integrity":{"algorithm":"SHA256","hash":"8ea80ca1609f9397fe4e44ca9c10450f1f9121417d20818ae3e1dab225cd1915","blockSize":4194304,"blocks":["8ea80ca1609f9397fe4e44ca9c10450f1f9121417d20818ae3e1dab225cd1915"]},"offset":"29131176"},"_xdrop.js":{"size":665,"integrity":{"algorithm":"SHA256","hash":"819763cd73d61ff44093f0567142cec66a8a8c3b170baec8eeb5b7b56843e297","blockSize":4194304,"blocks":["819763cd73d61ff44093f0567142cec66a8a8c3b170baec8eeb5b7b56843e297"]},"offset":"29131456"},"_xdropLast.js":{"size":1056,"integrity":{"algorithm":"SHA256","hash":"46c2a5f618473d711102eea6113e9be1a67f407d6cc5c1583f7e7327bf4011e0","blockSize":4194304,"blocks":["46c2a5f618473d711102eea6113e9be1a67f407d6cc5c1583f7e7327bf4011e0"]},"offset":"29132121"},"_xdropLastWhile.js":{"size":1224,"integrity":{"algorithm":"SHA256","hash":"5cff36b105f98155446eca475f063aff9c4d944c5a45f99f8a29d343b3896a8d","blockSize":4194304,"blocks":["5cff36b105f98155446eca475f063aff9c4d944c5a45f99f8a29d343b3896a8d"]},"offset":"29133177"},"_xdropRepeatsWith.js":{"size":1014,"integrity":{"algorithm":"SHA256","hash":"4fdb813c37b0f4c8637642a1af06fba5080a41e154030c639dea469ffd34acb1","blockSize":4194304,"blocks":["4fdb813c37b0f4c8637642a1af06fba5080a41e154030c639dea469ffd34acb1"]},"offset":"29134401"},"_xdropWhile.js":{"size":751,"integrity":{"algorithm":"SHA256","hash":"81d72b8b157c2f41094db6f0f87a7ca9335fefbc6d84df5dfaca78b5aefa20b0","blockSize":4194304,"blocks":["81d72b8b157c2f41094db6f0f87a7ca9335fefbc6d84df5dfaca78b5aefa20b0"]},"offset":"29135415"},"_xfBase.js":{"size":176,"integrity":{"algorithm":"SHA256","hash":"e31d7d3d22ad9abb53bf649fde9c21dd2bf47b2de5152f3de00dee792d2ae3e9","blockSize":4194304,"blocks":["e31d7d3d22ad9abb53bf649fde9c21dd2bf47b2de5152f3de00dee792d2ae3e9"]},"offset":"29136166"},"_xfilter.js":{"size":641,"integrity":{"algorithm":"SHA256","hash":"f4c56c174cbcaec9b70274ca09d084c75d79ffda5f0bf602e6e6a46a039dac4c","blockSize":4194304,"blocks":["f4c56c174cbcaec9b70274ca09d084c75d79ffda5f0bf602e6e6a46a039dac4c"]},"offset":"29136342"},"_xfind.js":{"size":918,"integrity":{"algorithm":"SHA256","hash":"f520eaa485153ebe8082ce7a3062ef734af5b2897ef3cf1a2aecac8924533454","blockSize":4194304,"blocks":["f520eaa485153ebe8082ce7a3062ef734af5b2897ef3cf1a2aecac8924533454"]},"offset":"29136983"},"_xfindIndex.js":{"size":1006,"integrity":{"algorithm":"SHA256","hash":"39ef2330c878e0658563141f9d9fa62f5957f681af8367d345952cc2e2318d03","blockSize":4194304,"blocks":["39ef2330c878e0658563141f9d9fa62f5957f681af8367d345952cc2e2318d03"]},"offset":"29137901"},"_xfindLast.js":{"size":758,"integrity":{"algorithm":"SHA256","hash":"4c30e9f35f4cd057301422af258556e78139b0b9f0257d5879e665f5e7e5030c","blockSize":4194304,"blocks":["4c30e9f35f4cd057301422af258556e78139b0b9f0257d5879e665f5e7e5030c"]},"offset":"29138907"},"_xfindLastIndex.js":{"size":879,"integrity":{"algorithm":"SHA256","hash":"a0008d14cd0e36872e434b9ee0e5dc28dbeddd353c09ee8f44ad6cdaaac0e96c","blockSize":4194304,"blocks":["a0008d14cd0e36872e434b9ee0e5dc28dbeddd353c09ee8f44ad6cdaaac0e96c"]},"offset":"29139665"},"_xmap.js":{"size":594,"integrity":{"algorithm":"SHA256","hash":"e48b2bd708407a4e18c6e222da3b3b76b5f3669023c82824a64b88fcb262245f","blockSize":4194304,"blocks":["e48b2bd708407a4e18c6e222da3b3b76b5f3669023c82824a64b88fcb262245f"]},"offset":"29140544"},"_xpromap.js":{"size":720,"integrity":{"algorithm":"SHA256","hash":"6587015edd8eeb18778bb8abc40046c8836499a192eb97fb6f4c385bacad1d6e","blockSize":4194304,"blocks":["6587015edd8eeb18778bb8abc40046c8836499a192eb97fb6f4c385bacad1d6e"]},"offset":"29141138"},"_xreduceBy.js":{"size":1354,"integrity":{"algorithm":"SHA256","hash":"dc1c5cc8cdf022aef2b87bd3b3f7c0d45c004c9bb2db41895d3ddce595351ce9","blockSize":4194304,"blocks":["dc1c5cc8cdf022aef2b87bd3b3f7c0d45c004c9bb2db41895d3ddce595351ce9"]},"offset":"29141858"},"_xtake.js":{"size":778,"integrity":{"algorithm":"SHA256","hash":"b54a7357a6bc8f81d9c0c35b960165f55aa17c90ba757df90d299736ff46e6c7","blockSize":4194304,"blocks":["b54a7357a6bc8f81d9c0c35b960165f55aa17c90ba757df90d299736ff46e6c7"]},"offset":"29143212"},"_xtakeWhile.js":{"size":737,"integrity":{"algorithm":"SHA256","hash":"1f2a9fe56001ac6617c41d7bd0afefa3b81acc8745fd64c94e65fb9a2fc01805","blockSize":4194304,"blocks":["1f2a9fe56001ac6617c41d7bd0afefa3b81acc8745fd64c94e65fb9a2fc01805"]},"offset":"29143990"},"_xtap.js":{"size":605,"integrity":{"algorithm":"SHA256","hash":"ed44e2e0ad37c7fcdb26015d1caa4730c841a11302debea70fa4513da05d8c1e","blockSize":4194304,"blocks":["ed44e2e0ad37c7fcdb26015d1caa4730c841a11302debea70fa4513da05d8c1e"]},"offset":"29144727"},"_xuniqBy.js":{"size":730,"integrity":{"algorithm":"SHA256","hash":"cf26a7703456e14db4e22a7b9b883d6ad8ca7da811a00887b91ef663ddc7d79e","blockSize":4194304,"blocks":["cf26a7703456e14db4e22a7b9b883d6ad8ca7da811a00887b91ef663ddc7d79e"]},"offset":"29145332"},"_xuniqWith.js":{"size":865,"integrity":{"algorithm":"SHA256","hash":"a7618382f10b113f3448b0ae26d142905b5b3c977b7618929fd1241267ec19eb","blockSize":4194304,"blocks":["a7618382f10b113f3448b0ae26d142905b5b3c977b7618929fd1241267ec19eb"]},"offset":"29146062"},"_xwrap.js":{"size":471,"integrity":{"algorithm":"SHA256","hash":"20633f2834362930f0ab29bbacbb3249e24d3b986d0f86a49ea0fe56d115c0e9","blockSize":4194304,"blocks":["20633f2834362930f0ab29bbacbb3249e24d3b986d0f86a49ea0fe56d115c0e9"]},"offset":"29146927"}}}}},"es":{"files":{"F.js":{"size":323,"integrity":{"algorithm":"SHA256","hash":"6dcd61cd82314a85d22eac8bf11cbe452001a7c60408f902df24b95a47d58b30","blockSize":4194304,"blocks":["6dcd61cd82314a85d22eac8bf11cbe452001a7c60408f902df24b95a47d58b30"]},"offset":"29147398"},"T.js":{"size":320,"integrity":{"algorithm":"SHA256","hash":"02ba6c5ebab0ca8a0972cc3fd9bb91becf7907292d06abf6488873f14e89bf1a","blockSize":4194304,"blocks":["02ba6c5ebab0ca8a0972cc3fd9bb91becf7907292d06abf6488873f14e89bf1a"]},"offset":"29147721"},"__.js":{"size":741,"integrity":{"algorithm":"SHA256","hash":"41924bfeb9f0299cfe006aa98145a39629f662fe3ba7ca123b47bb3423b08486","blockSize":4194304,"blocks":["41924bfeb9f0299cfe006aa98145a39629f662fe3ba7ca123b47bb3423b08486"]},"offset":"29148041"},"add.js":{"size":446,"integrity":{"algorithm":"SHA256","hash":"4b2c13f24b261d4b67fd5ff681e2baee4c71cab19818cabb50e102d7f700ff45","blockSize":4194304,"blocks":["4b2c13f24b261d4b67fd5ff681e2baee4c71cab19818cabb50e102d7f700ff45"]},"offset":"29148782"},"addIndex.js":{"size":1693,"integrity":{"algorithm":"SHA256","hash":"2a0cb5a861431cc9c01d14e261a1a59808dea9621ba0ef1112866d8d175a729b","blockSize":4194304,"blocks":["2a0cb5a861431cc9c01d14e261a1a59808dea9621ba0ef1112866d8d175a729b"]},"offset":"29149228"},"adjust.js":{"size":1365,"integrity":{"algorithm":"SHA256","hash":"1f38efc8dc4c745bafab3bee1d4841c71c91a353034047d86b44d6aa9d21a665","blockSize":4194304,"blocks":["1f38efc8dc4c745bafab3bee1d4841c71c91a353034047d86b44d6aa9d21a665"]},"offset":"29150921"},"all.js":{"size":1150,"integrity":{"algorithm":"SHA256","hash":"d26745990bb95050affd896df33339b03b574697d9361411dacc262baeb59529","blockSize":4194304,"blocks":["d26745990bb95050affd896df33339b03b574697d9361411dacc262baeb59529"]},"offset":"29152286"},"allPass.js":{"size":1373,"integrity":{"algorithm":"SHA256","hash":"7d2241a6129d5230da86604810172b5900478c8c9a66402e7c486f8884ec93b1","blockSize":4194304,"blocks":["7d2241a6129d5230da86604810172b5900478c8c9a66402e7c486f8884ec93b1"]},"offset":"29153436"},"always.js":{"size":705,"integrity":{"algorithm":"SHA256","hash":"bf8516c0ced778a5705f03824f9f1177e4c77e891b1b4c79d290315256f827bd","blockSize":4194304,"blocks":["bf8516c0ced778a5705f03824f9f1177e4c77e891b1b4c79d290315256f827bd"]},"offset":"29154809"},"and.js":{"size":626,"integrity":{"algorithm":"SHA256","hash":"9de9e4db3c6434167d5da210951cd04f2b2d4a015f8c4002c8bd52e462e1a767","blockSize":4194304,"blocks":["9de9e4db3c6434167d5da210951cd04f2b2d4a015f8c4002c8bd52e462e1a767"]},"offset":"29155514"},"andThen.js":{"size":1298,"integrity":{"algorithm":"SHA256","hash":"4fc815ba51b5919f2dbae60eb77c4dc7a76ec8a5208c88c6edc520889ded04d6","blockSize":4194304,"blocks":["4fc815ba51b5919f2dbae60eb77c4dc7a76ec8a5208c88c6edc520889ded04d6"]},"offset":"29156140"},"any.js":{"size":1195,"integrity":{"algorithm":"SHA256","hash":"d1b49cfe4206e1b78715e319c51338cef4719dbd970c85c7c92e077bde0c6550","blockSize":4194304,"blocks":["d1b49cfe4206e1b78715e319c51338cef4719dbd970c85c7c92e077bde0c6550"]},"offset":"29157438"},"anyPass.js":{"size":1412,"integrity":{"algorithm":"SHA256","hash":"add86718aa34191bde64aa461877f8290b83656aaf4f0b11a0cae95721c57886","blockSize":4194304,"blocks":["add86718aa34191bde64aa461877f8290b83656aaf4f0b11a0cae95721c57886"]},"offset":"29158633"},"ap.js":{"size":1424,"integrity":{"algorithm":"SHA256","hash":"2f2ce7d4b7cdf3ee9a526cc3749d3825a86353b4b1aab7f4d7d51071d2e5b655","blockSize":4194304,"blocks":["2f2ce7d4b7cdf3ee9a526cc3749d3825a86353b4b1aab7f4d7d51071d2e5b655"]},"offset":"29160045"},"aperture.js":{"size":1059,"integrity":{"algorithm":"SHA256","hash":"fcf3abd74c4124e11d219a8df923d1dc25c458371ad3c2dc59eb4c45b36f8474","blockSize":4194304,"blocks":["fcf3abd74c4124e11d219a8df923d1dc25c458371ad3c2dc59eb4c45b36f8474"]},"offset":"29161469"},"append.js":{"size":877,"integrity":{"algorithm":"SHA256","hash":"8bdbc7f81f36619d64ff1d637093efeef07d36f105c87fd600019d0fffc3a1d1","blockSize":4194304,"blocks":["8bdbc7f81f36619d64ff1d637093efeef07d36f105c87fd600019d0fffc3a1d1"]},"offset":"29162528"},"apply.js":{"size":826,"integrity":{"algorithm":"SHA256","hash":"54f1fa18ff22c4fad9a5c19ff75816009452650b1930144232b7a9fd6269dda0","blockSize":4194304,"blocks":["54f1fa18ff22c4fad9a5c19ff75816009452650b1930144232b7a9fd6269dda0"]},"offset":"29163405"},"applySpec.js":{"size":2012,"integrity":{"algorithm":"SHA256","hash":"375fee2445ec9fac7ead9833118409d45477a4fa98ef037633a35cd3c18f146a","blockSize":4194304,"blocks":["375fee2445ec9fac7ead9833118409d45477a4fa98ef037633a35cd3c18f146a"]},"offset":"29164231"},"applyTo.js":{"size":595,"integrity":{"algorithm":"SHA256","hash":"96d014fcef1e19ba0cc4c66e2631629adbb402477dd0efe30b92c80bb84d8478","blockSize":4194304,"blocks":["96d014fcef1e19ba0cc4c66e2631629adbb402477dd0efe30b92c80bb84d8478"]},"offset":"29166243"},"ascend.js":{"size":1113,"integrity":{"algorithm":"SHA256","hash":"0f0684c939d495680c4bb1f80e22444c840833a7bd4caa088afe900f8983184d","blockSize":4194304,"blocks":["0f0684c939d495680c4bb1f80e22444c840833a7bd4caa088afe900f8983184d"]},"offset":"29166838"},"assoc.js":{"size":939,"integrity":{"algorithm":"SHA256","hash":"8df9cf6c75bea18a65445660eb8ad4888051ce7c259d66548d43d73dee6b3208","blockSize":4194304,"blocks":["8df9cf6c75bea18a65445660eb8ad4888051ce7c259d66548d43d73dee6b3208"]},"offset":"29167951"},"assocPath.js":{"size":1544,"integrity":{"algorithm":"SHA256","hash":"4eb92f75e53c62f6b3f7823e50d5bbee724b8df9a6bd0dc9f2b792dededcfb97","blockSize":4194304,"blocks":["4eb92f75e53c62f6b3f7823e50d5bbee724b8df9a6bd0dc9f2b792dededcfb97"]},"offset":"29168890"},"binary.js":{"size":1110,"integrity":{"algorithm":"SHA256","hash":"e41b5427f745c59bbe2fd4748628796d0c2229eccbc6e496be6734ff7b8db348","blockSize":4194304,"blocks":["e41b5427f745c59bbe2fd4748628796d0c2229eccbc6e496be6734ff7b8db348"]},"offset":"29170434"},"bind.js":{"size":1078,"integrity":{"algorithm":"SHA256","hash":"e84f3983daf08445347a340883cbcfbe342df0ff4225ab6edcdb79e1060af05e","blockSize":4194304,"blocks":["e84f3983daf08445347a340883cbcfbe342df0ff4225ab6edcdb79e1060af05e"]},"offset":"29171544"},"both.js":{"size":1487,"integrity":{"algorithm":"SHA256","hash":"662ee3c80c23ddd503a1ee3e96a79570b122d1330fec89c4f9d2a4879cc30e3b","blockSize":4194304,"blocks":["662ee3c80c23ddd503a1ee3e96a79570b122d1330fec89c4f9d2a4879cc30e3b"]},"offset":"29172622"},"call.js":{"size":1235,"integrity":{"algorithm":"SHA256","hash":"c4ca3a370e5e8a13a4b840ece355430acca2d3dd1705c9daf403a4b2c5adf161","blockSize":4194304,"blocks":["c4ca3a370e5e8a13a4b840ece355430acca2d3dd1705c9daf403a4b2c5adf161"]},"offset":"29174109"},"chain.js":{"size":1444,"integrity":{"algorithm":"SHA256","hash":"448a78d152021182ae86e2565b7101d002f7b74ed72361ef71c7a6f11e728f5a","blockSize":4194304,"blocks":["448a78d152021182ae86e2565b7101d002f7b74ed72361ef71c7a6f11e728f5a"]},"offset":"29175344"},"clamp.js":{"size":942,"integrity":{"algorithm":"SHA256","hash":"d9512e5deca22a2cd29ac3b909008cc599d57f4ba14aa777567658bd553005ff","blockSize":4194304,"blocks":["d9512e5deca22a2cd29ac3b909008cc599d57f4ba14aa777567658bd553005ff"]},"offset":"29176788"},"clone.js":{"size":1225,"integrity":{"algorithm":"SHA256","hash":"cc7efbf3c5727753f446e1d2cc8adfb838a6df0dc65167897a1f8198e615c355","blockSize":4194304,"blocks":["cc7efbf3c5727753f446e1d2cc8adfb838a6df0dc65167897a1f8198e615c355"]},"offset":"29177730"},"collectBy.js":{"size":1581,"integrity":{"algorithm":"SHA256","hash":"6b5b3b1e1da726edc681cd6e6e4dc886f014cbb5a4ab438940f96af2157f9b48","blockSize":4194304,"blocks":["6b5b3b1e1da726edc681cd6e6e4dc886f014cbb5a4ab438940f96af2157f9b48"]},"offset":"29178955"},"comparator.js":{"size":1112,"integrity":{"algorithm":"SHA256","hash":"0640cf9ce1392567f43225e4f8b81a2066d939ff6f9ee68aca11ec0d0bc31e3a","blockSize":4194304,"blocks":["0640cf9ce1392567f43225e4f8b81a2066d939ff6f9ee68aca11ec0d0bc31e3a"]},"offset":"29180536"},"complement.js":{"size":753,"integrity":{"algorithm":"SHA256","hash":"7003dfbb9e04c15293a54eb02f7f0a71d7c9598a7a3001868785f29222db9be1","blockSize":4194304,"blocks":["7003dfbb9e04c15293a54eb02f7f0a71d7c9598a7a3001868785f29222db9be1"]},"offset":"29181648"},"compose.js":{"size":1155,"integrity":{"algorithm":"SHA256","hash":"35d0e0c2bbf5321d56f7c81466685311bfda63a6483d8f3621ba22a85d61433a","blockSize":4194304,"blocks":["35d0e0c2bbf5321d56f7c81466685311bfda63a6483d8f3621ba22a85d61433a"]},"offset":"29182401"},"composeWith.js":{"size":1228,"integrity":{"algorithm":"SHA256","hash":"35187db80263599562017b42d941b14a448102253d57b94e188271cd3065d8c0","blockSize":4194304,"blocks":["35187db80263599562017b42d941b14a448102253d57b94e188271cd3065d8c0"]},"offset":"29183556"},"concat.js":{"size":1869,"integrity":{"algorithm":"SHA256","hash":"4dcd20a21fdc2fab91524ae166950f489ee40e88494f70fe48c06672d798f074","blockSize":4194304,"blocks":["4dcd20a21fdc2fab91524ae166950f489ee40e88494f70fe48c06672d798f074"]},"offset":"29184784"},"cond.js":{"size":1843,"integrity":{"algorithm":"SHA256","hash":"38281acece614c2fd0ea00dcbb5a6f16659935683de5d6ab709057372419f1ee","blockSize":4194304,"blocks":["38281acece614c2fd0ea00dcbb5a6f16659935683de5d6ab709057372419f1ee"]},"offset":"29186653"},"construct.js":{"size":1309,"integrity":{"algorithm":"SHA256","hash":"b64e763af2378fcda24dfdc8c3983b393a2ac53a7e205dc9bfdee0d7c9017c98","blockSize":4194304,"blocks":["b64e763af2378fcda24dfdc8c3983b393a2ac53a7e205dc9bfdee0d7c9017c98"]},"offset":"29188496"},"constructN.js":{"size":2359,"integrity":{"algorithm":"SHA256","hash":"8ddf3ab0b99149d6c033419bdee27f1a1d5d1caee2195bba1c8b4f13a95cb4bf","blockSize":4194304,"blocks":["8ddf3ab0b99149d6c033419bdee27f1a1d5d1caee2195bba1c8b4f13a95cb4bf"]},"offset":"29189805"},"converge.js":{"size":1715,"integrity":{"algorithm":"SHA256","hash":"fce0e0810ff22951ad47e6862085e777480d1b8cd8cfd9c0be138239ebea6ca4","blockSize":4194304,"blocks":["fce0e0810ff22951ad47e6862085e777480d1b8cd8cfd9c0be138239ebea6ca4"]},"offset":"29192164"},"count.js":{"size":709,"integrity":{"algorithm":"SHA256","hash":"da3e7683e6c0f5c9ebca09758fb29ea9ff1d2aee2f47d7ab7a0e969232ee925d","blockSize":4194304,"blocks":["da3e7683e6c0f5c9ebca09758fb29ea9ff1d2aee2f47d7ab7a0e969232ee925d"]},"offset":"29193879"},"countBy.js":{"size":1106,"integrity":{"algorithm":"SHA256","hash":"db350d2a2efc3ba28cfa53f5ea21070b8561ae5e68c5d4f6195b8a095c9f7b9e","blockSize":4194304,"blocks":["db350d2a2efc3ba28cfa53f5ea21070b8561ae5e68c5d4f6195b8a095c9f7b9e"]},"offset":"29194588"},"curry.js":{"size":1433,"integrity":{"algorithm":"SHA256","hash":"a674a62ee61ac314fa11308484b8a4ebfdf5483eff11cceb4c324d6a6ae06ac2","blockSize":4194304,"blocks":["a674a62ee61ac314fa11308484b8a4ebfdf5483eff11cceb4c324d6a6ae06ac2"]},"offset":"29195694"},"curryN.js":{"size":1658,"integrity":{"algorithm":"SHA256","hash":"c01b225ea7ab2ba9c0093537adbbe097742664bcfaf820f64c46e291311dad9b","blockSize":4194304,"blocks":["c01b225ea7ab2ba9c0093537adbbe097742664bcfaf820f64c46e291311dad9b"]},"offset":"29197127"},"dec.js":{"size":307,"integrity":{"algorithm":"SHA256","hash":"6927b389cca37b558cd48b8d1edb30836f8f857957185a9e046b26d30249769e","blockSize":4194304,"blocks":["6927b389cca37b558cd48b8d1edb30836f8f857957185a9e046b26d30249769e"]},"offset":"29198785"},"defaultTo.js":{"size":965,"integrity":{"algorithm":"SHA256","hash":"5d649c32a17265c1f932c40fb231d9b72d70cd6b479c9042d9927665f896c367","blockSize":4194304,"blocks":["5d649c32a17265c1f932c40fb231d9b72d70cd6b479c9042d9927665f896c367"]},"offset":"29199092"},"descend.js":{"size":1115,"integrity":{"algorithm":"SHA256","hash":"fd571775944fe0417f63425bf7d715d16313aa80e1e0954bed2bdbbbc94bb590","blockSize":4194304,"blocks":["fd571775944fe0417f63425bf7d715d16313aa80e1e0954bed2bdbbbc94bb590"]},"offset":"29200057"},"difference.js":{"size":1275,"integrity":{"algorithm":"SHA256","hash":"6c7eb5950ba26ed93c63303265e17150d0b844f4db35fc9641912c2b545dcbb5","blockSize":4194304,"blocks":["6c7eb5950ba26ed93c63303265e17150d0b844f4db35fc9641912c2b545dcbb5"]},"offset":"29201172"},"differenceWith.js":{"size":1330,"integrity":{"algorithm":"SHA256","hash":"646117ad8cc5e0af7453ea8059bee0efe2138676ca72aa314d34d3de036c699e","blockSize":4194304,"blocks":["646117ad8cc5e0af7453ea8059bee0efe2138676ca72aa314d34d3de036c699e"]},"offset":"29202447"},"dissoc.js":{"size":687,"integrity":{"algorithm":"SHA256","hash":"c828a95a3f4043d84138234a56d8c4512ce37fad267b15089a9e6cf92567772c","blockSize":4194304,"blocks":["c828a95a3f4043d84138234a56d8c4512ce37fad267b15089a9e6cf92567772c"]},"offset":"29203777"},"dissocPath.js":{"size":1959,"integrity":{"algorithm":"SHA256","hash":"a3fe362de4412807cb93234229bcbdd37597a33fa073df62210f82e476c73691","blockSize":4194304,"blocks":["a3fe362de4412807cb93234229bcbdd37597a33fa073df62210f82e476c73691"]},"offset":"29204464"},"divide.js":{"size":638,"integrity":{"algorithm":"SHA256","hash":"93b68f54f17af927f69737bb4fbb62798332a9ebef02ef34e47986bb6cdccdaa","blockSize":4194304,"blocks":["93b68f54f17af927f69737bb4fbb62798332a9ebef02ef34e47986bb6cdccdaa"]},"offset":"29206423"},"drop.js":{"size":1131,"integrity":{"algorithm":"SHA256","hash":"96d453b78b58ea4cff6761f6912212f4492724d2dbdb69d490aa29d30724386c","blockSize":4194304,"blocks":["96d453b78b58ea4cff6761f6912212f4492724d2dbdb69d490aa29d30724386c"]},"offset":"29207061"},"dropLast.js":{"size":1175,"integrity":{"algorithm":"SHA256","hash":"a14377a20ccb4ce365685e1b27a3e825d9ed7d9a74ba5718f6d41e9d303755f0","blockSize":4194304,"blocks":["a14377a20ccb4ce365685e1b27a3e825d9ed7d9a74ba5718f6d41e9d303755f0"]},"offset":"29208192"},"dropLastWhile.js":{"size":1414,"integrity":{"algorithm":"SHA256","hash":"b986f6cda6ba0e9fea4f98fd5e5df70dabb5264126c96a9165c82390f45d4186","blockSize":4194304,"blocks":["b986f6cda6ba0e9fea4f98fd5e5df70dabb5264126c96a9165c82390f45d4186"]},"offset":"29209367"},"dropRepeats.js":{"size":929,"integrity":{"algorithm":"SHA256","hash":"6603ef4db8e186a2e7b1bbf6932b8959c63ccf8180b7c08777b87aa896819187","blockSize":4194304,"blocks":["6603ef4db8e186a2e7b1bbf6932b8959c63ccf8180b7c08777b87aa896819187"]},"offset":"29210781"},"dropRepeatsWith.js":{"size":1402,"integrity":{"algorithm":"SHA256","hash":"f04190d1f319419a858acf288fa5566908442f51453c49a82cb6785940ac5743","blockSize":4194304,"blocks":["f04190d1f319419a858acf288fa5566908442f51453c49a82cb6785940ac5743"]},"offset":"29211710"},"dropWhile.js":{"size":1460,"integrity":{"algorithm":"SHA256","hash":"84e7d01668ccb32c6599be08bf6ff5750b21e00827f3ecbfe34afc9b8da840a0","blockSize":4194304,"blocks":["84e7d01668ccb32c6599be08bf6ff5750b21e00827f3ecbfe34afc9b8da840a0"]},"offset":"29213112"},"either.js":{"size":1467,"integrity":{"algorithm":"SHA256","hash":"35766b1dc85eaf3a4bb14111ef394f9f08008fa76c393e4c3997c407d61fef26","blockSize":4194304,"blocks":["35766b1dc85eaf3a4bb14111ef394f9f08008fa76c393e4c3997c407d61fef26"]},"offset":"29214572"},"empty.js":{"size":1828,"integrity":{"algorithm":"SHA256","hash":"1b83aa237514be15f645a4dc1be13ab49d4b7f2f3d12808d007c8ac5ae33d64c","blockSize":4194304,"blocks":["1b83aa237514be15f645a4dc1be13ab49d4b7f2f3d12808d007c8ac5ae33d64c"]},"offset":"29216039"},"endsWith.js":{"size":848,"integrity":{"algorithm":"SHA256","hash":"dfa6b993b9c706958279c7af4d101957e5eb3c8817bdd1c5e223b22200f59836","blockSize":4194304,"blocks":["dfa6b993b9c706958279c7af4d101957e5eb3c8817bdd1c5e223b22200f59836"]},"offset":"29217867"},"eqBy.js":{"size":582,"integrity":{"algorithm":"SHA256","hash":"2b40c4622629981d423e580f61b6ee584683b2f82e50cdaf7b4725b859bfc9a1","blockSize":4194304,"blocks":["2b40c4622629981d423e580f61b6ee584683b2f82e50cdaf7b4725b859bfc9a1"]},"offset":"29218715"},"eqProps.js":{"size":810,"integrity":{"algorithm":"SHA256","hash":"03d8ec8cdda168a5fdc7eae7694435ae24107ec336b3fc6ba06abf4a0422a4aa","blockSize":4194304,"blocks":["03d8ec8cdda168a5fdc7eae7694435ae24107ec336b3fc6ba06abf4a0422a4aa"]},"offset":"29219297"},"equals.js":{"size":794,"integrity":{"algorithm":"SHA256","hash":"af1d2cb06d4c15eec5fdef3d7e714927291116b9f8ae16b9ed1b863a4b5d3696","blockSize":4194304,"blocks":["af1d2cb06d4c15eec5fdef3d7e714927291116b9f8ae16b9ed1b863a4b5d3696"]},"offset":"29220107"},"evolve.js":{"size":1730,"integrity":{"algorithm":"SHA256","hash":"3f43cd53aa8ac8071a08ec39c131fc6d246b1b5a608a274c9a2fbd5d365c8008","blockSize":4194304,"blocks":["3f43cd53aa8ac8071a08ec39c131fc6d246b1b5a608a274c9a2fbd5d365c8008"]},"offset":"29220901"},"filter.js":{"size":1561,"integrity":{"algorithm":"SHA256","hash":"fac589e8f4b29b0fa9b8c070cc0430f68fa72ab50a207bbbf3b58ee386b4827c","blockSize":4194304,"blocks":["fac589e8f4b29b0fa9b8c070cc0430f68fa72ab50a207bbbf3b58ee386b4827c"]},"offset":"29222631"},"find.js":{"size":1182,"integrity":{"algorithm":"SHA256","hash":"b2abb9766f81a28f848f6a3991e2957db38cd0b429b45cdf59032a1cb90857b2","blockSize":4194304,"blocks":["b2abb9766f81a28f848f6a3991e2957db38cd0b429b45cdf59032a1cb90857b2"]},"offset":"29224192"},"findIndex.js":{"size":1147,"integrity":{"algorithm":"SHA256","hash":"6100886d96d79e7c06cb7ad1b8a08b9d8296b458efa37b7ce33767b88bd2b30b","blockSize":4194304,"blocks":["6100886d96d79e7c06cb7ad1b8a08b9d8296b458efa37b7ce33767b88bd2b30b"]},"offset":"29225374"},"findLast.js":{"size":1123,"integrity":{"algorithm":"SHA256","hash":"2eae23ac41857011883521f5eb47593ef7fdb09ffda99e78e2c20f475b5c0061","blockSize":4194304,"blocks":["2eae23ac41857011883521f5eb47593ef7fdb09ffda99e78e2c20f475b5c0061"]},"offset":"29226521"},"findLastIndex.js":{"size":1173,"integrity":{"algorithm":"SHA256","hash":"9cc456a3e26eaaecc741c252d9372cd07ec4be506cf66af9cce13e7a403dd640","blockSize":4194304,"blocks":["9cc456a3e26eaaecc741c252d9372cd07ec4be506cf66af9cce13e7a403dd640"]},"offset":"29227644"},"flatten.js":{"size":645,"integrity":{"algorithm":"SHA256","hash":"9328f3414a6a57cc7f707f9a4e461a305d3a7d108832c06ff3775586b6b1ca5e","blockSize":4194304,"blocks":["9328f3414a6a57cc7f707f9a4e461a305d3a7d108832c06ff3775586b6b1ca5e"]},"offset":"29228817"},"flip.js":{"size":974,"integrity":{"algorithm":"SHA256","hash":"c126a16fe1054acab075810787fdec1d8a6d9c16e4057bd8c7ffe151dfcaf907","blockSize":4194304,"blocks":["c126a16fe1054acab075810787fdec1d8a6d9c16e4057bd8c7ffe151dfcaf907"]},"offset":"29229462"},"forEach.js":{"size":1545,"integrity":{"algorithm":"SHA256","hash":"c15e1e01f6d965c0000d3f7cf6fa11437e4c7853b938cdcf6255db7556539045","blockSize":4194304,"blocks":["c15e1e01f6d965c0000d3f7cf6fa11437e4c7853b938cdcf6255db7556539045"]},"offset":"29230436"},"forEachObjIndexed.js":{"size":1135,"integrity":{"algorithm":"SHA256","hash":"b67b2ff3d07827aa397424abccb2dfe38228a59cf6b5e9613158c1ecb4e16f8b","blockSize":4194304,"blocks":["b67b2ff3d07827aa397424abccb2dfe38228a59cf6b5e9613158c1ecb4e16f8b"]},"offset":"29231981"},"fromPairs.js":{"size":820,"integrity":{"algorithm":"SHA256","hash":"0e406e496923de9b4ec224d1933a03aa680159fa43516ca881d3df3dc7b099af","blockSize":4194304,"blocks":["0e406e496923de9b4ec224d1933a03aa680159fa43516ca881d3df3dc7b099af"]},"offset":"29233116"},"groupBy.js":{"size":1775,"integrity":{"algorithm":"SHA256","hash":"41b060b80e14958881ff6697230b0d8cbdbc0c077aa5923cdbb0a247d8dce49b","blockSize":4194304,"blocks":["41b060b80e14958881ff6697230b0d8cbdbc0c077aa5923cdbb0a247d8dce49b"]},"offset":"29233936"},"groupWith.js":{"size":1611,"integrity":{"algorithm":"SHA256","hash":"fe2c82ad8f8739cf84d24ed91dc40ce16a04af68f432e110ab3da0af32106338","blockSize":4194304,"blocks":["fe2c82ad8f8739cf84d24ed91dc40ce16a04af68f432e110ab3da0af32106338"]},"offset":"29235711"},"gt.js":{"size":577,"integrity":{"algorithm":"SHA256","hash":"de15b0926329d57e6a46afbefdb6e93b236150078cfaf1534a19b23950840ee3","blockSize":4194304,"blocks":["de15b0926329d57e6a46afbefdb6e93b236150078cfaf1534a19b23950840ee3"]},"offset":"29237322"},"gte.js":{"size":608,"integrity":{"algorithm":"SHA256","hash":"b287f07a63fd6b34ba60d212bc643300ce5d21ae2ad58cc16a743b0f34a4a74b","blockSize":4194304,"blocks":["b287f07a63fd6b34ba60d212bc643300ce5d21ae2ad58cc16a743b0f34a4a74b"]},"offset":"29237899"},"has.js":{"size":915,"integrity":{"algorithm":"SHA256","hash":"d2ee06addb1c856b1c218e70924832d95ad8c1d83ddb7529221c17190899bf05","blockSize":4194304,"blocks":["d2ee06addb1c856b1c218e70924832d95ad8c1d83ddb7529221c17190899bf05"]},"offset":"29238507"},"hasIn.js":{"size":961,"integrity":{"algorithm":"SHA256","hash":"31feb55bea63f7c8009e0d1d8f6575231a53bd9d7a9b3dfa0c1890a847f33d82","blockSize":4194304,"blocks":["31feb55bea63f7c8009e0d1d8f6575231a53bd9d7a9b3dfa0c1890a847f33d82"]},"offset":"29239422"},"hasPath.js":{"size":1167,"integrity":{"algorithm":"SHA256","hash":"eb51fd2be0cd514287281dbc198708768ef9b023eb6e9819f5d0a9927ad78214","blockSize":4194304,"blocks":["eb51fd2be0cd514287281dbc198708768ef9b023eb6e9819f5d0a9927ad78214"]},"offset":"29240383"},"head.js":{"size":553,"integrity":{"algorithm":"SHA256","hash":"1c299c8a65d0a50cc17a7cb1ce01e974785e1205f4381a6a99cf99279b983cee","blockSize":4194304,"blocks":["1c299c8a65d0a50cc17a7cb1ce01e974785e1205f4381a6a99cf99279b983cee"]},"offset":"29241550"},"identical.js":{"size":848,"integrity":{"algorithm":"SHA256","hash":"176725731f15475853644fe3f63fbc1862b650f201efb21e7e3120f04e52e1c7","blockSize":4194304,"blocks":["176725731f15475853644fe3f63fbc1862b650f201efb21e7e3120f04e52e1c7"]},"offset":"29242103"},"identity.js":{"size":593,"integrity":{"algorithm":"SHA256","hash":"4ba599f3a018d2ceb52adf1d8ae0cf9d04d707d6b2ccada6a54e2d2ca32a3428","blockSize":4194304,"blocks":["4ba599f3a018d2ceb52adf1d8ae0cf9d04d707d6b2ccada6a54e2d2ca32a3428"]},"offset":"29242951"},"ifElse.js":{"size":1412,"integrity":{"algorithm":"SHA256","hash":"035f3e6032d4435832f4a723834b6f5772128fb75483e7020d33b64a60685191","blockSize":4194304,"blocks":["035f3e6032d4435832f4a723834b6f5772128fb75483e7020d33b64a60685191"]},"offset":"29243544"},"inc.js":{"size":306,"integrity":{"algorithm":"SHA256","hash":"58e6f889af47445c1c704308412b8f7996ab39edbfe564a10184f8df52dd34da","blockSize":4194304,"blocks":["58e6f889af47445c1c704308412b8f7996ab39edbfe564a10184f8df52dd34da"]},"offset":"29244956"},"includes.js":{"size":900,"integrity":{"algorithm":"SHA256","hash":"8db97fe7199247df5ddca5e2f4a00b3013ae1b6997d9d782d42e5005d169addf","blockSize":4194304,"blocks":["8db97fe7199247df5ddca5e2f4a00b3013ae1b6997d9d782d42e5005d169addf"]},"offset":"29245262"},"index.js":{"size":13174,"integrity":{"algorithm":"SHA256","hash":"e72a438de213a96245c8edeeb37f038220a32634d9d4433bbe67942582a40c23","blockSize":4194304,"blocks":["e72a438de213a96245c8edeeb37f038220a32634d9d4433bbe67942582a40c23"]},"offset":"29246162"},"indexBy.js":{"size":1038,"integrity":{"algorithm":"SHA256","hash":"0cc97988253f15b578249b534f88dc63eafd5d0e18c57ba79c42fe086fac4e57","blockSize":4194304,"blocks":["0cc97988253f15b578249b534f88dc63eafd5d0e18c57ba79c42fe086fac4e57"]},"offset":"29259336"},"indexOf.js":{"size":913,"integrity":{"algorithm":"SHA256","hash":"d79580f52f1418f8632df48a0bee41104bc0a237e6f792a68a999416f5ed308e","blockSize":4194304,"blocks":["d79580f52f1418f8632df48a0bee41104bc0a237e6f792a68a999416f5ed308e"]},"offset":"29260374"},"init.js":{"size":634,"integrity":{"algorithm":"SHA256","hash":"3058688047ee97d06602c6e2f327608a915fbe60030d7ff45123dce85b800754","blockSize":4194304,"blocks":["3058688047ee97d06602c6e2f327608a915fbe60030d7ff45123dce85b800754"]},"offset":"29261287"},"innerJoin.js":{"size":1577,"integrity":{"algorithm":"SHA256","hash":"afde1e508fd14a5596925f5e02a8b3f4b130344de41d173447fbe987a435717d","blockSize":4194304,"blocks":["afde1e508fd14a5596925f5e02a8b3f4b130344de41d173447fbe987a435717d"]},"offset":"29261921"},"insert.js":{"size":943,"integrity":{"algorithm":"SHA256","hash":"64b2ad417f0fcbcabcb7bb83e4193ba88efbbb4836d5a29fd0905f41676de0c6","blockSize":4194304,"blocks":["64b2ad417f0fcbcabcb7bb83e4193ba88efbbb4836d5a29fd0905f41676de0c6"]},"offset":"29263498"},"insertAll.js":{"size":1005,"integrity":{"algorithm":"SHA256","hash":"24b0688c172463c321bcbf7ea1940b7a2e07099a24362e4a86d33259fb5a2ca6","blockSize":4194304,"blocks":["24b0688c172463c321bcbf7ea1940b7a2e07099a24362e4a86d33259fb5a2ca6"]},"offset":"29264441"},"intersection.js":{"size":1022,"integrity":{"algorithm":"SHA256","hash":"6e862a66aa1be90d043931d10a7d42702a12b7fed3b5a6623262b92a6c4e161c","blockSize":4194304,"blocks":["6e862a66aa1be90d043931d10a7d42702a12b7fed3b5a6623262b92a6c4e161c"]},"offset":"29265446"},"intersperse.js":{"size":990,"integrity":{"algorithm":"SHA256","hash":"91aa78c71b54edab38dfe8dd2db4447fc2b48b75226a7cbfd50ab16e0144458d","blockSize":4194304,"blocks":["91aa78c71b54edab38dfe8dd2db4447fc2b48b75226a7cbfd50ab16e0144458d"]},"offset":"29266468"},"into.js":{"size":2079,"integrity":{"algorithm":"SHA256","hash":"bded02100d7f609809114c41204162d32225a0863265843f0a33724920fdaba4","blockSize":4194304,"blocks":["bded02100d7f609809114c41204162d32225a0863265843f0a33724920fdaba4"]},"offset":"29267458"},"invert.js":{"size":1101,"integrity":{"algorithm":"SHA256","hash":"b7f33341ef833342e07f70f8ebae0aba8c2da8acf73f4647af0c62e9322dbb29","blockSize":4194304,"blocks":["b7f33341ef833342e07f70f8ebae0aba8c2da8acf73f4647af0c62e9322dbb29"]},"offset":"29269537"},"invertObj.js":{"size":1129,"integrity":{"algorithm":"SHA256","hash":"f832664a0dc319debff9a4ac4150d7b635a01862eca998df874a51b7bd6c8264","blockSize":4194304,"blocks":["f832664a0dc319debff9a4ac4150d7b635a01862eca998df874a51b7bd6c8264"]},"offset":"29270638"},"invoker.js":{"size":1822,"integrity":{"algorithm":"SHA256","hash":"ba74a6f02f5ea67cac3dd231b742bd080936fcbeb6f3d2eb062eff81a2ef8e61","blockSize":4194304,"blocks":["ba74a6f02f5ea67cac3dd231b742bd080936fcbeb6f3d2eb062eff81a2ef8e61"]},"offset":"29271767"},"is.js":{"size":999,"integrity":{"algorithm":"SHA256","hash":"e0009e3166f3db9fac1f6a866dc88d9dce05befb113ea3041ff9374d4930aa21","blockSize":4194304,"blocks":["e0009e3166f3db9fac1f6a866dc88d9dce05befb113ea3041ff9374d4930aa21"]},"offset":"29273589"},"isEmpty.js":{"size":840,"integrity":{"algorithm":"SHA256","hash":"45b5e18def70c9ce0be02afeb879838c289fbee13b866352da5d1cc6f009e0a7","blockSize":4194304,"blocks":["45b5e18def70c9ce0be02afeb879838c289fbee13b866352da5d1cc6f009e0a7"]},"offset":"29274588"},"isNil.js":{"size":556,"integrity":{"algorithm":"SHA256","hash":"aa18c88c97ca1d434427290879b2e2f7d72258e139cd1555afbc526aa8c1db09","blockSize":4194304,"blocks":["aa18c88c97ca1d434427290879b2e2f7d72258e139cd1555afbc526aa8c1db09"]},"offset":"29275428"},"join.js":{"size":717,"integrity":{"algorithm":"SHA256","hash":"232500a0d0f8597919352bd0c9942476a7f8b17b3f299d186355e13c28a60b21","blockSize":4194304,"blocks":["232500a0d0f8597919352bd0c9942476a7f8b17b3f299d186355e13c28a60b21"]},"offset":"29275984"},"juxt.js":{"size":813,"integrity":{"algorithm":"SHA256","hash":"98ae7631f84cb4b06850f6f44f5bca26cc6d14e3d107ea662eb966581114162b","blockSize":4194304,"blocks":["98ae7631f84cb4b06850f6f44f5bca26cc6d14e3d107ea662eb966581114162b"]},"offset":"29276701"},"keys.js":{"size":2035,"integrity":{"algorithm":"SHA256","hash":"4cbb35108bec028503ced814dadb559a95a2fe5b40421a8ec2ab1b778dc9b1b3","blockSize":4194304,"blocks":["4cbb35108bec028503ced814dadb559a95a2fe5b40421a8ec2ab1b778dc9b1b3"]},"offset":"29277514"},"keysIn.js":{"size":869,"integrity":{"algorithm":"SHA256","hash":"75378f6f27725914afb197908869849fc2a42e2a6a703dca6094c0e6d7d3a29f","blockSize":4194304,"blocks":["75378f6f27725914afb197908869849fc2a42e2a6a703dca6094c0e6d7d3a29f"]},"offset":"29279549"},"last.js":{"size":490,"integrity":{"algorithm":"SHA256","hash":"04d545c201a855d42429673d5064497945c4f3360f671411488bd5a0721c1a37","blockSize":4194304,"blocks":["04d545c201a855d42429673d5064497945c4f3360f671411488bd5a0721c1a37"]},"offset":"29280418"},"lastIndexOf.js":{"size":1091,"integrity":{"algorithm":"SHA256","hash":"827cfce83a34f20153c528f48800dcb6360cffbfb38889a30617f727f9e4e07b","blockSize":4194304,"blocks":["827cfce83a34f20153c528f48800dcb6360cffbfb38889a30617f727f9e4e07b"]},"offset":"29280908"},"length.js":{"size":587,"integrity":{"algorithm":"SHA256","hash":"7679fe06005810323ab9ddfcc5ecb5a8afe251194a56463cbce7bdff5df33288","blockSize":4194304,"blocks":["7679fe06005810323ab9ddfcc5ecb5a8afe251194a56463cbce7bdff5df33288"]},"offset":"29281999"},"lens.js":{"size":1124,"integrity":{"algorithm":"SHA256","hash":"d3ae150ab759620fb57a83abe9dd226e761d1a2a184690e7016ab1cccb2055a0","blockSize":4194304,"blocks":["d3ae150ab759620fb57a83abe9dd226e761d1a2a184690e7016ab1cccb2055a0"]},"offset":"29282586"},"lensIndex.js":{"size":826,"integrity":{"algorithm":"SHA256","hash":"b3710d3db223de8c88598176a2cef6eaf9e2de274feb95d2c56c0935736e0e53","blockSize":4194304,"blocks":["b3710d3db223de8c88598176a2cef6eaf9e2de274feb95d2c56c0935736e0e53"]},"offset":"29283710"},"lensPath.js":{"size":997,"integrity":{"algorithm":"SHA256","hash":"9892814e877df11440b73d5c14ae5539fc7550a3f031cb3a90a14fe1a5fec60a","blockSize":4194304,"blocks":["9892814e877df11440b73d5c14ae5539fc7550a3f031cb3a90a14fe1a5fec60a"]},"offset":"29284536"},"lensProp.js":{"size":792,"integrity":{"algorithm":"SHA256","hash":"3bda79b56234705575897297e93f3f0fb37e3a4071d0bbdce5641bc329cc38c6","blockSize":4194304,"blocks":["3bda79b56234705575897297e93f3f0fb37e3a4071d0bbdce5641bc329cc38c6"]},"offset":"29285533"},"lift.js":{"size":979,"integrity":{"algorithm":"SHA256","hash":"054929b79b4fb40057b910f6e0bf07557b10939d3c2db96f1ac326c704ecb10b","blockSize":4194304,"blocks":["054929b79b4fb40057b910f6e0bf07557b10939d3c2db96f1ac326c704ecb10b"]},"offset":"29286325"},"liftN.js":{"size":1051,"integrity":{"algorithm":"SHA256","hash":"df12e3afd90f4e6e108424f3f57b2ab0f653850da06343010f77590309cb8d80","blockSize":4194304,"blocks":["df12e3afd90f4e6e108424f3f57b2ab0f653850da06343010f77590309cb8d80"]},"offset":"29287304"},"lt.js":{"size":574,"integrity":{"algorithm":"SHA256","hash":"ab4c74aa1a3baaedba15ff04176116d8ed29a7cbcb4d2be6345a971c1b4474d5","blockSize":4194304,"blocks":["ab4c74aa1a3baaedba15ff04176116d8ed29a7cbcb4d2be6345a971c1b4474d5"]},"offset":"29288355"},"lte.js":{"size":605,"integrity":{"algorithm":"SHA256","hash":"cd7dfc2ae81fc09ff6c7d057c33b30cd3bf595096fe3905a7d3bb745d793986a","blockSize":4194304,"blocks":["cd7dfc2ae81fc09ff6c7d057c33b30cd3bf595096fe3905a7d3bb745d793986a"]},"offset":"29288929"},"map.js":{"size":2076,"integrity":{"algorithm":"SHA256","hash":"c007af988f3aaaba783376ab1a42e4edae25e8b394ad5fd387fee47fe1c53fd5","blockSize":4194304,"blocks":["c007af988f3aaaba783376ab1a42e4edae25e8b394ad5fd387fee47fe1c53fd5"]},"offset":"29289534"},"mapAccum.js":{"size":1517,"integrity":{"algorithm":"SHA256","hash":"2e6ea762337c69d99646da543b1ace98e0d8f8eed5cd4ac8f210343c8b872325","blockSize":4194304,"blocks":["2e6ea762337c69d99646da543b1ace98e0d8f8eed5cd4ac8f210343c8b872325"]},"offset":"29291610"},"mapAccumRight.js":{"size":1631,"integrity":{"algorithm":"SHA256","hash":"53d315953e1a645bd7be213211f9d61c71577b49c9c1bdd14339023c961fcc87","blockSize":4194304,"blocks":["53d315953e1a645bd7be213211f9d61c71577b49c9c1bdd14339023c961fcc87"]},"offset":"29293127"},"mapObjIndexed.js":{"size":952,"integrity":{"algorithm":"SHA256","hash":"20cdf40ba23ed5ec4d967a98af1d5611b5fef189673b116f32bbd3f065b0a47d","blockSize":4194304,"blocks":["20cdf40ba23ed5ec4d967a98af1d5611b5fef189673b116f32bbd3f065b0a47d"]},"offset":"29294758"},"match.js":{"size":972,"integrity":{"algorithm":"SHA256","hash":"d6988053a991ea9214f2ba5b1cdd8e6a0ec82b33c8b0b2470dfcf27d623959a7","blockSize":4194304,"blocks":["d6988053a991ea9214f2ba5b1cdd8e6a0ec82b33c8b0b2470dfcf27d623959a7"]},"offset":"29295710"},"mathMod.js":{"size":1315,"integrity":{"algorithm":"SHA256","hash":"9dbd695f7f641a5597d93b0012642c9450f6ff1f3a6f66560fff33baca50f371","blockSize":4194304,"blocks":["9dbd695f7f641a5597d93b0012642c9450f6ff1f3a6f66560fff33baca50f371"]},"offset":"29296682"},"max.js":{"size":447,"integrity":{"algorithm":"SHA256","hash":"9cc5fbe0619c93ec2956f6b684def141d767b054eaed10938b5abb162dc820b6","blockSize":4194304,"blocks":["9cc5fbe0619c93ec2956f6b684def141d767b054eaed10938b5abb162dc820b6"]},"offset":"29297997"},"maxBy.js":{"size":751,"integrity":{"algorithm":"SHA256","hash":"7b5a5bb5e979d45dd8a97d6b300d44bb637ba9b65a87d3bb5f75f5251adf7d8d","blockSize":4194304,"blocks":["7b5a5bb5e979d45dd8a97d6b300d44bb637ba9b65a87d3bb5f75f5251adf7d8d"]},"offset":"29298444"},"mean.js":{"size":474,"integrity":{"algorithm":"SHA256","hash":"5f8b0e8305360bc9559e6524524e4e155d51e401f221c536c17203eea63f58e1","blockSize":4194304,"blocks":["5f8b0e8305360bc9559e6524524e4e155d51e401f221c536c17203eea63f58e1"]},"offset":"29299195"},"median.js":{"size":759,"integrity":{"algorithm":"SHA256","hash":"69eb471da3fbab22dec702723db6449cb9d822c4e15ca4d5e6b36941928995fc","blockSize":4194304,"blocks":["69eb471da3fbab22dec702723db6449cb9d822c4e15ca4d5e6b36941928995fc"]},"offset":"29299669"},"memoizeWith.js":{"size":1498,"integrity":{"algorithm":"SHA256","hash":"a8cea65ec3181dc0ca46444a16e2fffca006799987c5600d2ae0ef465602486d","blockSize":4194304,"blocks":["a8cea65ec3181dc0ca46444a16e2fffca006799987c5600d2ae0ef465602486d"]},"offset":"29300428"},"mergeAll.js":{"size":852,"integrity":{"algorithm":"SHA256","hash":"27a4e87cc1eb758d2f42db26287bd7b85408f82eb0bb522b0c3e174817a13b46","blockSize":4194304,"blocks":["27a4e87cc1eb758d2f42db26287bd7b85408f82eb0bb522b0c3e174817a13b46"]},"offset":"29301926"},"mergeDeepLeft.js":{"size":1090,"integrity":{"algorithm":"SHA256","hash":"8e4131241646b6bd78ff682ea14a8b9dae47fbe791b71302034d82a452628370","blockSize":4194304,"blocks":["8e4131241646b6bd78ff682ea14a8b9dae47fbe791b71302034d82a452628370"]},"offset":"29302778"},"mergeDeepRight.js":{"size":1095,"integrity":{"algorithm":"SHA256","hash":"08707519f5855d36dc3d278a51bd63af902d97e1747030661238407404e05506","blockSize":4194304,"blocks":["08707519f5855d36dc3d278a51bd63af902d97e1747030661238407404e05506"]},"offset":"29303868"},"mergeDeepWith.js":{"size":1263,"integrity":{"algorithm":"SHA256","hash":"5cee3080b64edbf9a090a47aaecaf054b9a8104d6c14ad6ead99de076d7ebe9a","blockSize":4194304,"blocks":["5cee3080b64edbf9a090a47aaecaf054b9a8104d6c14ad6ead99de076d7ebe9a"]},"offset":"29304963"},"mergeDeepWithKey.js":{"size":1576,"integrity":{"algorithm":"SHA256","hash":"1735b7530bae96a43595e408720df3e7cdf60bd2352c46c9c9d0ef096f762176","blockSize":4194304,"blocks":["1735b7530bae96a43595e408720df3e7cdf60bd2352c46c9c9d0ef096f762176"]},"offset":"29306226"},"mergeLeft.js":{"size":952,"integrity":{"algorithm":"SHA256","hash":"b4d1e319589a143a85fa51d667da82efeb6788d94e6e1a3f5aeb4860e064a729","blockSize":4194304,"blocks":["b4d1e319589a143a85fa51d667da82efeb6788d94e6e1a3f5aeb4860e064a729"]},"offset":"29307802"},"mergeRight.js":{"size":955,"integrity":{"algorithm":"SHA256","hash":"354e6d155b20e05097f9d2a215db1fe4ce83f1e08a24afd12d9e085c46b6445c","blockSize":4194304,"blocks":["354e6d155b20e05097f9d2a215db1fe4ce83f1e08a24afd12d9e085c46b6445c"]},"offset":"29308754"},"mergeWith.js":{"size":1024,"integrity":{"algorithm":"SHA256","hash":"256eb44076a8682e25d4a2be243443eb46ad15c75aa8dbe2ee2a2efd836d9434","blockSize":4194304,"blocks":["256eb44076a8682e25d4a2be243443eb46ad15c75aa8dbe2ee2a2efd836d9434"]},"offset":"29309709"},"mergeWithKey.js":{"size":1436,"integrity":{"algorithm":"SHA256","hash":"a589b8b013871515dd2ceccc850353790c401c9421673aab9377c30bfc37eb13","blockSize":4194304,"blocks":["a589b8b013871515dd2ceccc850353790c401c9421673aab9377c30bfc37eb13"]},"offset":"29310733"},"min.js":{"size":448,"integrity":{"algorithm":"SHA256","hash":"9d5df9ef5a73cc310ddb4363fb9b8553150231355f8bbccfef221c5b3f4320f8","blockSize":4194304,"blocks":["9d5df9ef5a73cc310ddb4363fb9b8553150231355f8bbccfef221c5b3f4320f8"]},"offset":"29312169"},"minBy.js":{"size":771,"integrity":{"algorithm":"SHA256","hash":"2fbd788afe8b6f81e3505def3eb1a671a1954849f1c1f0baaab3b5d836884b75","blockSize":4194304,"blocks":["2fbd788afe8b6f81e3505def3eb1a671a1954849f1c1f0baaab3b5d836884b75"]},"offset":"29312617"},"modify.js":{"size":1171,"integrity":{"algorithm":"SHA256","hash":"a35c5819d354fa87a0a78d84e9aa322e58623219284de47a7b52024b12a85245","blockSize":4194304,"blocks":["a35c5819d354fa87a0a78d84e9aa322e58623219284de47a7b52024b12a85245"]},"offset":"29313388"},"modifyPath.js":{"size":1866,"integrity":{"algorithm":"SHA256","hash":"f49c7ad12fa4b38a61c5d5f9ac718fe01e2e822c4ac8535417dcf60f78e3c667","blockSize":4194304,"blocks":["f49c7ad12fa4b38a61c5d5f9ac718fe01e2e822c4ac8535417dcf60f78e3c667"]},"offset":"29314559"},"modulo.js":{"size":839,"integrity":{"algorithm":"SHA256","hash":"33c89bcb66df8f125e41cbff782f3bed4dbd3a93b8623e210f457c9e5a5c496a","blockSize":4194304,"blocks":["33c89bcb66df8f125e41cbff782f3bed4dbd3a93b8623e210f457c9e5a5c496a"]},"offset":"29316425"},"move.js":{"size":1199,"integrity":{"algorithm":"SHA256","hash":"57442dae93a8a87db8d585840e094d953d3f9198b3cfa3241f6695b26717cbe2","blockSize":4194304,"blocks":["57442dae93a8a87db8d585840e094d953d3f9198b3cfa3241f6695b26717cbe2"]},"offset":"29317264"},"multiply.js":{"size":650,"integrity":{"algorithm":"SHA256","hash":"2bfa6464c1d546f38143712674d015849e381d38811ee48f68c5d90590804cc6","blockSize":4194304,"blocks":["2bfa6464c1d546f38143712674d015849e381d38811ee48f68c5d90590804cc6"]},"offset":"29318463"},"nAry.js":{"size":2540,"integrity":{"algorithm":"SHA256","hash":"56007d520b28705faf45eb29bf9567b8ea383ca10e7c86c7d8c73e5790192ac6","blockSize":4194304,"blocks":["56007d520b28705faf45eb29bf9567b8ea383ca10e7c86c7d8c73e5790192ac6"]},"offset":"29319113"},"negate.js":{"size":349,"integrity":{"algorithm":"SHA256","hash":"07001a2824dd2fb52811cb6f231694877252b3385b85adbfd0608bc66fff7a9e","blockSize":4194304,"blocks":["07001a2824dd2fb52811cb6f231694877252b3385b85adbfd0608bc66fff7a9e"]},"offset":"29321653"},"none.js":{"size":1017,"integrity":{"algorithm":"SHA256","hash":"e8b8cfd597f7e2d042c64bbb04b772fa76c595773870e34aafc12d25c794bfa0","blockSize":4194304,"blocks":["e8b8cfd597f7e2d042c64bbb04b772fa76c595773870e34aafc12d25c794bfa0"]},"offset":"29322002"},"not.js":{"size":612,"integrity":{"algorithm":"SHA256","hash":"4ead38022dc3fbdf57c3bfb95570d943ae3bb630d890993132bd9ca2f20405ee","blockSize":4194304,"blocks":["4ead38022dc3fbdf57c3bfb95570d943ae3bb630d890993132bd9ca2f20405ee"]},"offset":"29323019"},"nth.js":{"size":968,"integrity":{"algorithm":"SHA256","hash":"cb02aa20eb6252e8975541d12f3e090264cab680422ee1aacdd3375670f46df4","blockSize":4194304,"blocks":["cb02aa20eb6252e8975541d12f3e090264cab680422ee1aacdd3375670f46df4"]},"offset":"29323631"},"nthArg.js":{"size":705,"integrity":{"algorithm":"SHA256","hash":"04ea4b03849849cce6a15f4887b39d6617d16f5b67d62b5eb04f4ec39475a37a","blockSize":4194304,"blocks":["04ea4b03849849cce6a15f4887b39d6617d16f5b67d62b5eb04f4ec39475a37a"]},"offset":"29324599"},"o.js":{"size":1156,"integrity":{"algorithm":"SHA256","hash":"721efce4d3ee616e962fe3fc2ba0ca666be89e5f2dbde4748baf493304c7e834","blockSize":4194304,"blocks":["721efce4d3ee616e962fe3fc2ba0ca666be89e5f2dbde4748baf493304c7e834"]},"offset":"29325304"},"objOf.js":{"size":683,"integrity":{"algorithm":"SHA256","hash":"6647289396f3b8095aa5e5b142afec72e19d192cea90db34eeaeb61666251081","blockSize":4194304,"blocks":["6647289396f3b8095aa5e5b142afec72e19d192cea90db34eeaeb61666251081"]},"offset":"29326460"},"of.js":{"size":587,"integrity":{"algorithm":"SHA256","hash":"1d7d9cc75d88d4f6dc9449721c56e48caaccfc14bf18eb1c2124bde32e145f3d","blockSize":4194304,"blocks":["1d7d9cc75d88d4f6dc9449721c56e48caaccfc14bf18eb1c2124bde32e145f3d"]},"offset":"29327143"},"omit.js":{"size":899,"integrity":{"algorithm":"SHA256","hash":"790fa04f9d1144df0d67bbbe9c69f5f4c8ecf5be24b4c22bffadb4a69f17afe1","blockSize":4194304,"blocks":["790fa04f9d1144df0d67bbbe9c69f5f4c8ecf5be24b4c22bffadb4a69f17afe1"]},"offset":"29327730"},"on.js":{"size":906,"integrity":{"algorithm":"SHA256","hash":"503f6a07a2509bea8ce7951c2b37753e2f302108389f25d7eafc80cfe93d2db9","blockSize":4194304,"blocks":["503f6a07a2509bea8ce7951c2b37753e2f302108389f25d7eafc80cfe93d2db9"]},"offset":"29328629"},"once.js":{"size":999,"integrity":{"algorithm":"SHA256","hash":"c152a02469d1fe99a557593710c2da143c933c2f1dd21654a1f50df2a473649c","blockSize":4194304,"blocks":["c152a02469d1fe99a557593710c2da143c933c2f1dd21654a1f50df2a473649c"]},"offset":"29329535"},"or.js":{"size":620,"integrity":{"algorithm":"SHA256","hash":"f26f43c17c45ca6f760cc637589e523e34ef128c5bbaa477f23cbed53583b861","blockSize":4194304,"blocks":["f26f43c17c45ca6f760cc637589e523e34ef128c5bbaa477f23cbed53583b861"]},"offset":"29330534"},"otherwise.js":{"size":1286,"integrity":{"algorithm":"SHA256","hash":"bf0a5aefaff055406288787770402db5ef44771917b856102ad18e0080715ef7","blockSize":4194304,"blocks":["bf0a5aefaff055406288787770402db5ef44771917b856102ad18e0080715ef7"]},"offset":"29331154"},"over.js":{"size":1276,"integrity":{"algorithm":"SHA256","hash":"fd93a7c59ef3ae1cfc268730eec0798c4a191278c463263b7a910ca4ea57ac85","blockSize":4194304,"blocks":["fd93a7c59ef3ae1cfc268730eec0798c4a191278c463263b7a910ca4ea57ac85"]},"offset":"29332440"},"package.json":{"size":17,"integrity":{"algorithm":"SHA256","hash":"6dc1b06d6b093e9cccb20bee06a93836eee0420ae26803ca2ce4065d82f070d1","blockSize":4194304,"blocks":["6dc1b06d6b093e9cccb20bee06a93836eee0420ae26803ca2ce4065d82f070d1"]},"offset":"29333716"},"pair.js":{"size":455,"integrity":{"algorithm":"SHA256","hash":"37c1af9bbe339a5d242677791627ba617345f877e2f7b483d3612c5b17027820","blockSize":4194304,"blocks":["37c1af9bbe339a5d242677791627ba617345f877e2f7b483d3612c5b17027820"]},"offset":"29333733"},"partial.js":{"size":1199,"integrity":{"algorithm":"SHA256","hash":"b79f20a923f9fda14c9125a84c36d6056a3f2545bbb7370df96f8bbe1c0f1678","blockSize":4194304,"blocks":["b79f20a923f9fda14c9125a84c36d6056a3f2545bbb7370df96f8bbe1c0f1678"]},"offset":"29334188"},"partialObject.js":{"size":1333,"integrity":{"algorithm":"SHA256","hash":"425313da2c03ad346515cf85e5d43066f2233f35d1a2e93d900257fab2c50506","blockSize":4194304,"blocks":["425313da2c03ad346515cf85e5d43066f2233f35d1a2e93d900257fab2c50506"]},"offset":"29335387"},"partialRight.js":{"size":1097,"integrity":{"algorithm":"SHA256","hash":"6d0da40f0a0393541b2f30592a2d29b475ae099d3a3b7ff711f0d652e465f811","blockSize":4194304,"blocks":["6d0da40f0a0393541b2f30592a2d29b475ae099d3a3b7ff711f0d652e465f811"]},"offset":"29336720"},"partition.js":{"size":1231,"integrity":{"algorithm":"SHA256","hash":"95b6f31ed98faf1c939cc0ec47fd7d7bd114e66d4d00c145e0843e37731303ef","blockSize":4194304,"blocks":["95b6f31ed98faf1c939cc0ec47fd7d7bd114e66d4d00c145e0843e37731303ef"]},"offset":"29337817"},"path.js":{"size":796,"integrity":{"algorithm":"SHA256","hash":"983a9b67ed0f491c9415db2724813865178b9655424b136447d86e22c5cd240b","blockSize":4194304,"blocks":["983a9b67ed0f491c9415db2724813865178b9655424b136447d86e22c5cd240b"]},"offset":"29339048"},"pathEq.js":{"size":1165,"integrity":{"algorithm":"SHA256","hash":"58d1ef5ec4b0e25a6be758cdd7b958c2207a04da1cac425d500a60143e2d54c7","blockSize":4194304,"blocks":["58d1ef5ec4b0e25a6be758cdd7b958c2207a04da1cac425d500a60143e2d54c7"]},"offset":"29339844"},"pathOr.js":{"size":890,"integrity":{"algorithm":"SHA256","hash":"2bf8e31183e40713d3377773f23feb8eff8c1e8dc0f065be44a6af999823c8f3","blockSize":4194304,"blocks":["2bf8e31183e40713d3377773f23feb8eff8c1e8dc0f065be44a6af999823c8f3"]},"offset":"29341009"},"pathSatisfies.js":{"size":792,"integrity":{"algorithm":"SHA256","hash":"10c03a1ba5008bae24ef1f83c271be96697b220739ba64d915557be290d524bb","blockSize":4194304,"blocks":["10c03a1ba5008bae24ef1f83c271be96697b220739ba64d915557be290d524bb"]},"offset":"29341899"},"paths.js":{"size":1142,"integrity":{"algorithm":"SHA256","hash":"87fa41d5e224299595e9baa00027b7cf24c5793b0489fa79fef5a9caf1670ce0","blockSize":4194304,"blocks":["87fa41d5e224299595e9baa00027b7cf24c5793b0489fa79fef5a9caf1670ce0"]},"offset":"29342691"},"pick.js":{"size":935,"integrity":{"algorithm":"SHA256","hash":"7311f1dc67d66e68f484c2a61382af64b9bbf9488cccb8814088f2575c2a1e45","blockSize":4194304,"blocks":["7311f1dc67d66e68f484c2a61382af64b9bbf9488cccb8814088f2575c2a1e45"]},"offset":"29343833"},"pickAll.js":{"size":944,"integrity":{"algorithm":"SHA256","hash":"9cc4e1ef9c9044d7d67871de7e77c16e55bcc54afc62a2047912149141602d9d","blockSize":4194304,"blocks":["9cc4e1ef9c9044d7d67871de7e77c16e55bcc54afc62a2047912149141602d9d"]},"offset":"29344768"},"pickBy.js":{"size":951,"integrity":{"algorithm":"SHA256","hash":"fa4b4e51a95e0b5606f4de636cf36644d0955da041ccb0547f30aff5bdd77b7e","blockSize":4194304,"blocks":["fa4b4e51a95e0b5606f4de636cf36644d0955da041ccb0547f30aff5bdd77b7e"]},"offset":"29345712"},"pipe.js":{"size":1053,"integrity":{"algorithm":"SHA256","hash":"2c6630bf30176f712f4d4f196fafa1105150c9d982f9c8e31fab5d8d9153fa82","blockSize":4194304,"blocks":["2c6630bf30176f712f4d4f196fafa1105150c9d982f9c8e31fab5d8d9153fa82"]},"offset":"29346663"},"pipeWith.js":{"size":1514,"integrity":{"algorithm":"SHA256","hash":"d1e700e276e923fd402c0bf0c19f792330ad4cdc11ab10989d615bb453037106","blockSize":4194304,"blocks":["d1e700e276e923fd402c0bf0c19f792330ad4cdc11ab10989d615bb453037106"]},"offset":"29347716"},"pluck.js":{"size":1227,"integrity":{"algorithm":"SHA256","hash":"81887556a15b360d7c1bab4be25702bbbc343bbfb32ecb86df63df833f17bb09","blockSize":4194304,"blocks":["81887556a15b360d7c1bab4be25702bbbc343bbfb32ecb86df63df833f17bb09"]},"offset":"29349230"},"prepend.js":{"size":688,"integrity":{"algorithm":"SHA256","hash":"e675d6bd3f717a8f4f24f5f4124cd9e7604c23f02327cb2f5b59e41bf4e2a154","blockSize":4194304,"blocks":["e675d6bd3f717a8f4f24f5f4124cd9e7604c23f02327cb2f5b59e41bf4e2a154"]},"offset":"29350457"},"product.js":{"size":479,"integrity":{"algorithm":"SHA256","hash":"3825332dd04042ac415523ff9421d8d0867f3c9583a0c7fc4e652e8617ed7960","blockSize":4194304,"blocks":["3825332dd04042ac415523ff9421d8d0867f3c9583a0c7fc4e652e8617ed7960"]},"offset":"29351145"},"project.js":{"size":955,"integrity":{"algorithm":"SHA256","hash":"f0c51192708c9399d1cc7cf6b9a4e55865c780837f6ecfc1c08035fcd0b538e3","blockSize":4194304,"blocks":["f0c51192708c9399d1cc7cf6b9a4e55865c780837f6ecfc1c08035fcd0b538e3"]},"offset":"29351624"},"promap.js":{"size":1546,"integrity":{"algorithm":"SHA256","hash":"8ce2ff97a2013eae5d75f7d23abc83ba6df308f37c20deff7c2e9ec347e3d413","blockSize":4194304,"blocks":["8ce2ff97a2013eae5d75f7d23abc83ba6df308f37c20deff7c2e9ec347e3d413"]},"offset":"29352579"},"prop.js":{"size":936,"integrity":{"algorithm":"SHA256","hash":"44b748187bb639544a47cc334d605aa5174a5fa144b706750cd2fbbc0cdccfad","blockSize":4194304,"blocks":["44b748187bb639544a47cc334d605aa5174a5fa144b706750cd2fbbc0cdccfad"]},"offset":"29354125"},"propEq.js":{"size":1118,"integrity":{"algorithm":"SHA256","hash":"1250e2c248c164b3c7f0420ca608b94492ff30589ac12ad95558d942b9fa8046","blockSize":4194304,"blocks":["1250e2c248c164b3c7f0420ca608b94492ff30589ac12ad95558d942b9fa8046"]},"offset":"29355061"},"propIs.js":{"size":749,"integrity":{"algorithm":"SHA256","hash":"c480362e31685f0989496f8cc7f6fdb1b3f2616f9392fb4aba5165dd7f40de43","blockSize":4194304,"blocks":["c480362e31685f0989496f8cc7f6fdb1b3f2616f9392fb4aba5165dd7f40de43"]},"offset":"29356179"},"propOr.js":{"size":1087,"integrity":{"algorithm":"SHA256","hash":"976e3ce0b02fcbbee0322f069163dd38c6bb8189c1955ef355d5c9c73be2aa8e","blockSize":4194304,"blocks":["976e3ce0b02fcbbee0322f069163dd38c6bb8189c1955ef355d5c9c73be2aa8e"]},"offset":"29356928"},"propSatisfies.js":{"size":729,"integrity":{"algorithm":"SHA256","hash":"a802abc93ca305fada967e1b4c8cfc1977800a106f058c68a86c18382262f100","blockSize":4194304,"blocks":["a802abc93ca305fada967e1b4c8cfc1977800a106f058c68a86c18382262f100"]},"offset":"29358015"},"props.js":{"size":928,"integrity":{"algorithm":"SHA256","hash":"4fee038482b69ab183698f3ecddf16c49dc94b21dbdc231f0ffa6cfc8c286fff","blockSize":4194304,"blocks":["4fee038482b69ab183698f3ecddf16c49dc94b21dbdc231f0ffa6cfc8c286fff"]},"offset":"29358744"},"range.js":{"size":872,"integrity":{"algorithm":"SHA256","hash":"7601980d88e8faa5a0f7e70dbef1a43fd4812a5b89bd6db1e5073736d3c72ca3","blockSize":4194304,"blocks":["7601980d88e8faa5a0f7e70dbef1a43fd4812a5b89bd6db1e5073736d3c72ca3"]},"offset":"29359672"},"reduce.js":{"size":2036,"integrity":{"algorithm":"SHA256","hash":"3b503bb2ac1294e84750e2e733b9c0f0fd0782f95277b74e6dff631da32b4891","blockSize":4194304,"blocks":["3b503bb2ac1294e84750e2e733b9c0f0fd0782f95277b74e6dff631da32b4891"]},"offset":"29360544"},"reduceBy.js":{"size":2572,"integrity":{"algorithm":"SHA256","hash":"5caee6ec9214f50f67703b6140f33c8fc5be3dfa47b646e54d377124f9885921","blockSize":4194304,"blocks":["5caee6ec9214f50f67703b6140f33c8fc5be3dfa47b646e54d377124f9885921"]},"offset":"29362580"},"reduceRight.js":{"size":2155,"integrity":{"algorithm":"SHA256","hash":"f493db099a1813c84a480edf6c91863aa53bcbfa0139c5064f959c3858a20e20","blockSize":4194304,"blocks":["f493db099a1813c84a480edf6c91863aa53bcbfa0139c5064f959c3858a20e20"]},"offset":"29365152"},"reduceWhile.js":{"size":1552,"integrity":{"algorithm":"SHA256","hash":"6c2e89a5376a407bbd955c5d2d4ce20e8f30d3b8f3de01d757ae3f53c1efefd4","blockSize":4194304,"blocks":["6c2e89a5376a407bbd955c5d2d4ce20e8f30d3b8f3de01d757ae3f53c1efefd4"]},"offset":"29367307"},"reduced.js":{"size":992,"integrity":{"algorithm":"SHA256","hash":"4fecb7852603c94038aaab245e189015e8795620d6efd8c9e26585310190ad82","blockSize":4194304,"blocks":["4fecb7852603c94038aaab245e189015e8795620d6efd8c9e26585310190ad82"]},"offset":"29368859"},"reject.js":{"size":917,"integrity":{"algorithm":"SHA256","hash":"831d4667c7af94109812e765508e23b0ceb819784fed7bf2e9210ee48d343ad5","blockSize":4194304,"blocks":["831d4667c7af94109812e765508e23b0ceb819784fed7bf2e9210ee48d343ad5"]},"offset":"29369851"},"remove.js":{"size":958,"integrity":{"algorithm":"SHA256","hash":"9ddb8dd8f55dd5626c1a61ef918808e33924bb3e4bf214db8416328f78817572","blockSize":4194304,"blocks":["9ddb8dd8f55dd5626c1a61ef918808e33924bb3e4bf214db8416328f78817572"]},"offset":"29370768"},"repeat.js":{"size":900,"integrity":{"algorithm":"SHA256","hash":"9add9139de8960adf3d513dd8021ac7869763352a30cd65e50adb445d76b07c4","blockSize":4194304,"blocks":["9add9139de8960adf3d513dd8021ac7869763352a30cd65e50adb445d76b07c4"]},"offset":"29371726"},"replace.js":{"size":1089,"integrity":{"algorithm":"SHA256","hash":"17d5630e17237ad5e41c0a899facab5675010b5695746220cd22069efe40c5f2","blockSize":4194304,"blocks":["17d5630e17237ad5e41c0a899facab5675010b5695746220cd22069efe40c5f2"]},"offset":"29372626"},"reverse.js":{"size":897,"integrity":{"algorithm":"SHA256","hash":"f70f794fd84e5fdf82c2c7397a4953d42fcee58428570c719eadee29b501c7d4","blockSize":4194304,"blocks":["f70f794fd84e5fdf82c2c7397a4953d42fcee58428570c719eadee29b501c7d4"]},"offset":"29373715"},"scan.js":{"size":1045,"integrity":{"algorithm":"SHA256","hash":"589478419aa76c7de0fc8325bc8f87db157252ec40c9cf82749108b8bbceadd2","blockSize":4194304,"blocks":["589478419aa76c7de0fc8325bc8f87db157252ec40c9cf82749108b8bbceadd2"]},"offset":"29374612"},"sequence.js":{"size":1283,"integrity":{"algorithm":"SHA256","hash":"5bc12ad439cff0da7d6c93b0ba7e17b78df4d9fca40b846bee22ddc1d4097b33","blockSize":4194304,"blocks":["5bc12ad439cff0da7d6c93b0ba7e17b78df4d9fca40b846bee22ddc1d4097b33"]},"offset":"29375657"},"set.js":{"size":827,"integrity":{"algorithm":"SHA256","hash":"e25e363dc3f581f61dd9724ae5cd5fb394ec120fae60b94bdaf0a9ad4a080912","blockSize":4194304,"blocks":["e25e363dc3f581f61dd9724ae5cd5fb394ec120fae60b94bdaf0a9ad4a080912"]},"offset":"29376940"},"slice.js":{"size":1192,"integrity":{"algorithm":"SHA256","hash":"e22efa7b342a725d423f53023aabf6d5d89fb6dd11c0e02d368af8045d31c568","blockSize":4194304,"blocks":["e22efa7b342a725d423f53023aabf6d5d89fb6dd11c0e02d368af8045d31c568"]},"offset":"29377767"},"sort.js":{"size":986,"integrity":{"algorithm":"SHA256","hash":"f66a0a998676062fbd033fe661a6e62d507d1e919f6ff300dcf37ffbe47e85d6","blockSize":4194304,"blocks":["f66a0a998676062fbd033fe661a6e62d507d1e919f6ff300dcf37ffbe47e85d6"]},"offset":"29378959"},"sortBy.js":{"size":1220,"integrity":{"algorithm":"SHA256","hash":"15094ed36619ad3516b5409e7472dce624ea050ffd60afa852f4fbb8e60f0f4f","blockSize":4194304,"blocks":["15094ed36619ad3516b5409e7472dce624ea050ffd60afa852f4fbb8e60f0f4f"]},"offset":"29379945"},"sortWith.js":{"size":1206,"integrity":{"algorithm":"SHA256","hash":"d4e8cfdf1e9efa34d8e5bb153fa85ecad24acc232df4ff7b22604f472fb0998c","blockSize":4194304,"blocks":["d4e8cfdf1e9efa34d8e5bb153fa85ecad24acc232df4ff7b22604f472fb0998c"]},"offset":"29381165"},"split.js":{"size":717,"integrity":{"algorithm":"SHA256","hash":"c5005c68846cb953860ee9d32f9cf02c6e5034b75d4691ce50b24df593157a60","blockSize":4194304,"blocks":["c5005c68846cb953860ee9d32f9cf02c6e5034b75d4691ce50b24df593157a60"]},"offset":"29382371"},"splitAt.js":{"size":836,"integrity":{"algorithm":"SHA256","hash":"f01a444e4582318865e6b63ff94e412fdae3610f0f7d19e1c1d6b0cd283beda5","blockSize":4194304,"blocks":["f01a444e4582318865e6b63ff94e412fdae3610f0f7d19e1c1d6b0cd283beda5"]},"offset":"29383088"},"splitEvery.js":{"size":835,"integrity":{"algorithm":"SHA256","hash":"d76483435043f39b7b1eef5b7baa50208ae75ee51c41db583c4fe98f6426d13d","blockSize":4194304,"blocks":["d76483435043f39b7b1eef5b7baa50208ae75ee51c41db583c4fe98f6426d13d"]},"offset":"29383924"},"splitWhen.js":{"size":1067,"integrity":{"algorithm":"SHA256","hash":"d3f250759735ebf2fe39a3a40295284fdac04626ad7951d8c1845e7cd05ee67d","blockSize":4194304,"blocks":["d3f250759735ebf2fe39a3a40295284fdac04626ad7951d8c1845e7cd05ee67d"]},"offset":"29384759"},"splitWhenever.js":{"size":903,"integrity":{"algorithm":"SHA256","hash":"2a7ad13fa0a5da2c281a2f0b33084ee6cefbe5768d77c3b185d283c25a830e97","blockSize":4194304,"blocks":["2a7ad13fa0a5da2c281a2f0b33084ee6cefbe5768d77c3b185d283c25a830e97"]},"offset":"29385826"},"startsWith.js":{"size":850,"integrity":{"algorithm":"SHA256","hash":"ba21117fd183f0d281e863fcd52a3a75aaf1c48f31d696a443b377af9eb14c6a","blockSize":4194304,"blocks":["ba21117fd183f0d281e863fcd52a3a75aaf1c48f31d696a443b377af9eb14c6a"]},"offset":"29386729"},"subtract.js":{"size":725,"integrity":{"algorithm":"SHA256","hash":"a22e945d3f64eea8990a88c84096d23b3c4db57e0845c738aafa22fe883eeb08","blockSize":4194304,"blocks":["a22e945d3f64eea8990a88c84096d23b3c4db57e0845c738aafa22fe883eeb08"]},"offset":"29387579"},"sum.js":{"size":440,"integrity":{"algorithm":"SHA256","hash":"16f04f5001ed4a34e3aebac0ec5ebe87c18107c8c6270d91ac4bba89a5ecec1d","blockSize":4194304,"blocks":["16f04f5001ed4a34e3aebac0ec5ebe87c18107c8c6270d91ac4bba89a5ecec1d"]},"offset":"29388304"},"symmetricDifference.js":{"size":910,"integrity":{"algorithm":"SHA256","hash":"da7481e7adbf4636cad809e943d2ea41df98ddafbdac4287b5cb731131b364a9","blockSize":4194304,"blocks":["da7481e7adbf4636cad809e943d2ea41df98ddafbdac4287b5cb731131b364a9"]},"offset":"29388744"},"symmetricDifferenceWith.js":{"size":1262,"integrity":{"algorithm":"SHA256","hash":"13293da770a532d208d1323f5850bf39c7929353c7cba8d5c8385bb34fe3a4f6","blockSize":4194304,"blocks":["13293da770a532d208d1323f5850bf39c7929353c7cba8d5c8385bb34fe3a4f6"]},"offset":"29389654"},"tail.js":{"size":921,"integrity":{"algorithm":"SHA256","hash":"a1d894d145ac9374c3870fb0682ec546a76ab66ffbeee88919d03d85933fd7c6","blockSize":4194304,"blocks":["a1d894d145ac9374c3870fb0682ec546a76ab66ffbeee88919d03d85933fd7c6"]},"offset":"29390916"},"take.js":{"size":1622,"integrity":{"algorithm":"SHA256","hash":"12e428b8ab95c2a10f39761b293fa75c955c69f80b8c1a485bf251796f23c013","blockSize":4194304,"blocks":["12e428b8ab95c2a10f39761b293fa75c955c69f80b8c1a485bf251796f23c013"]},"offset":"29391837"},"takeLast.js":{"size":977,"integrity":{"algorithm":"SHA256","hash":"afe24554effd4eef53b0dbeb2abcd1b0c01b5d6ca1082abd114f4250fe0e1309","blockSize":4194304,"blocks":["afe24554effd4eef53b0dbeb2abcd1b0c01b5d6ca1082abd114f4250fe0e1309"]},"offset":"29393459"},"takeLastWhile.js":{"size":1150,"integrity":{"algorithm":"SHA256","hash":"e17c44621438b18bdcae6fc38f0c28611e5d053e758afe5b2d18bbc37f102162","blockSize":4194304,"blocks":["e17c44621438b18bdcae6fc38f0c28611e5d053e758afe5b2d18bbc37f102162"]},"offset":"29394436"},"takeWhile.js":{"size":1468,"integrity":{"algorithm":"SHA256","hash":"58547cf661371731d25ad3db307dfe9ffc13805f3d7a0d5fadbf4b3986fb6c65","blockSize":4194304,"blocks":["58547cf661371731d25ad3db307dfe9ffc13805f3d7a0d5fadbf4b3986fb6c65"]},"offset":"29395586"},"tap.js":{"size":828,"integrity":{"algorithm":"SHA256","hash":"fac38a530956b69b3845d85fb23a8c38e0867837989eed3c5e56691345870ee6","blockSize":4194304,"blocks":["fac38a530956b69b3845d85fb23a8c38e0867837989eed3c5e56691345870ee6"]},"offset":"29397054"},"test.js":{"size":839,"integrity":{"algorithm":"SHA256","hash":"206882c6abb84bd179728d5e38cc3726353a8b5f90024942bd1b10e760503a31","blockSize":4194304,"blocks":["206882c6abb84bd179728d5e38cc3726353a8b5f90024942bd1b10e760503a31"]},"offset":"29397882"},"thunkify.js":{"size":946,"integrity":{"algorithm":"SHA256","hash":"22d88a2f8c0ac51d9c9f3780a79d7fa3d5cd6e132c964c8643f39d032ce51e3d","blockSize":4194304,"blocks":["22d88a2f8c0ac51d9c9f3780a79d7fa3d5cd6e132c964c8643f39d032ce51e3d"]},"offset":"29398721"},"times.js":{"size":1175,"integrity":{"algorithm":"SHA256","hash":"76e340885dfe6c3a0e8d4f0109be995729b3a5db171bbb347101c1de94e3c6d5","blockSize":4194304,"blocks":["76e340885dfe6c3a0e8d4f0109be995729b3a5db171bbb347101c1de94e3c6d5"]},"offset":"29399667"},"toLower.js":{"size":423,"integrity":{"algorithm":"SHA256","hash":"fa68a0681c40b4a5d833c668ce171032758a81e0023e442e68a1d039e91fd9d1","blockSize":4194304,"blocks":["fa68a0681c40b4a5d833c668ce171032758a81e0023e442e68a1d039e91fd9d1"]},"offset":"29400842"},"toPairs.js":{"size":904,"integrity":{"algorithm":"SHA256","hash":"c390a450424e0e87796d2ef8412bb5c1d5647d80deefdeec19fa3aadb82d43a1","blockSize":4194304,"blocks":["c390a450424e0e87796d2ef8412bb5c1d5647d80deefdeec19fa3aadb82d43a1"]},"offset":"29401265"},"toPairsIn.js":{"size":924,"integrity":{"algorithm":"SHA256","hash":"bcda225bc61698f2d80ea0f124f9ad33efad359cd08ab3b0a9f76254bbc275de","blockSize":4194304,"blocks":["bcda225bc61698f2d80ea0f124f9ad33efad359cd08ab3b0a9f76254bbc275de"]},"offset":"29402169"},"toString.js":{"size":1440,"integrity":{"algorithm":"SHA256","hash":"9b4ca06007deec873fe205f404e7ce7e5559c2a72f68d278ddeb77cba1c4b7d4","blockSize":4194304,"blocks":["9b4ca06007deec873fe205f404e7ce7e5559c2a72f68d278ddeb77cba1c4b7d4"]},"offset":"29403093"},"toUpper.js":{"size":423,"integrity":{"algorithm":"SHA256","hash":"ff717dcfe6cf35173b6cbd4b0ede2cf339d8cd8f4ecf6c35e026d49a5ddb9547","blockSize":4194304,"blocks":["ff717dcfe6cf35173b6cbd4b0ede2cf339d8cd8f4ecf6c35e026d49a5ddb9547"]},"offset":"29404533"},"transduce.js":{"size":2626,"integrity":{"algorithm":"SHA256","hash":"c0352cde98c8cb6b7cc249908c4f0611d53afb5635f85478c7581703a8dcd273","blockSize":4194304,"blocks":["c0352cde98c8cb6b7cc249908c4f0611d53afb5635f85478c7581703a8dcd273"]},"offset":"29404956"},"transpose.js":{"size":1309,"integrity":{"algorithm":"SHA256","hash":"7448c211712532c406729907bf265d8f56f9832289b4f5b87ca0adf8289af335","blockSize":4194304,"blocks":["7448c211712532c406729907bf265d8f56f9832289b4f5b87ca0adf8289af335"]},"offset":"29407582"},"traverse.js":{"size":1414,"integrity":{"algorithm":"SHA256","hash":"cdd7ec5c090f441737dfbf1fce59aba879b24b3efc0f039421deb91d38b99b98","blockSize":4194304,"blocks":["cdd7ec5c090f441737dfbf1fce59aba879b24b3efc0f039421deb91d38b99b98"]},"offset":"29408891"},"trim.js":{"size":1059,"integrity":{"algorithm":"SHA256","hash":"c3ab5630cd07393ae1589a1aee6d5b376a7c59c7bfd047ff8c796e6cf8828f45","blockSize":4194304,"blocks":["c3ab5630cd07393ae1589a1aee6d5b376a7c59c7bfd047ff8c796e6cf8828f45"]},"offset":"29410305"},"tryCatch.js":{"size":1608,"integrity":{"algorithm":"SHA256","hash":"718ecf456a4bfec35f2e7ae1b36d5e39db7af30da1812e2378e69a6e87379fbe","blockSize":4194304,"blocks":["718ecf456a4bfec35f2e7ae1b36d5e39db7af30da1812e2378e69a6e87379fbe"]},"offset":"29411364"},"type.js":{"size":989,"integrity":{"algorithm":"SHA256","hash":"ef8aa87ffc358081eec884963832a5824f3c8bfcefaf8bb667b134a1c4ceb59f","blockSize":4194304,"blocks":["ef8aa87ffc358081eec884963832a5824f3c8bfcefaf8bb667b134a1c4ceb59f"]},"offset":"29412972"},"unapply.js":{"size":889,"integrity":{"algorithm":"SHA256","hash":"d1814ff93f7355f048d24bc7551494d1fdbbaa80340e9f76ff87c5fc76a98d93","blockSize":4194304,"blocks":["d1814ff93f7355f048d24bc7551494d1fdbbaa80340e9f76ff87c5fc76a98d93"]},"offset":"29413961"},"unary.js":{"size":1066,"integrity":{"algorithm":"SHA256","hash":"69783320718613c943efcb8315600a86ac9f762157bde85019bd55a7a80f0c06","blockSize":4194304,"blocks":["69783320718613c943efcb8315600a86ac9f762157bde85019bd55a7a80f0c06"]},"offset":"29414850"},"uncurryN.js":{"size":1324,"integrity":{"algorithm":"SHA256","hash":"6e3e891e33aa00a521db25859b83e9eb6d0c9c34792613129c0c9bbeebbc1afb","blockSize":4194304,"blocks":["6e3e891e33aa00a521db25859b83e9eb6d0c9c34792613129c0c9bbeebbc1afb"]},"offset":"29415916"},"unfold.js":{"size":1322,"integrity":{"algorithm":"SHA256","hash":"0acd3f336354442a0ed5d6209ef55b69e6960f3d5b66c356c88ac20ecd400afc","blockSize":4194304,"blocks":["0acd3f336354442a0ed5d6209ef55b69e6960f3d5b66c356c88ac20ecd400afc"]},"offset":"29417240"},"union.js":{"size":692,"integrity":{"algorithm":"SHA256","hash":"e248780d3e05f3defb155b10411e7549888255a71dc6daf7003eb7d6e19ecd8f","blockSize":4194304,"blocks":["e248780d3e05f3defb155b10411e7549888255a71dc6daf7003eb7d6e19ecd8f"]},"offset":"29418562"},"unionWith.js":{"size":1156,"integrity":{"algorithm":"SHA256","hash":"27925e10af37b883ccbd2c82b7acac2e59084c4ff35797eff5495456c5e56f0a","blockSize":4194304,"blocks":["27925e10af37b883ccbd2c82b7acac2e59084c4ff35797eff5495456c5e56f0a"]},"offset":"29419254"},"uniq.js":{"size":600,"integrity":{"algorithm":"SHA256","hash":"36c3495ddb1195a46d6064e54e9bcd179b652f6e3500ed622f504b321fe429e0","blockSize":4194304,"blocks":["36c3495ddb1195a46d6064e54e9bcd179b652f6e3500ed622f504b321fe429e0"]},"offset":"29420410"},"uniqBy.js":{"size":1331,"integrity":{"algorithm":"SHA256","hash":"bf475306f084adb6d3b22618e2fe35dc5819ada849c76af93934884f03e43148","blockSize":4194304,"blocks":["bf475306f084adb6d3b22618e2fe35dc5819ada849c76af93934884f03e43148"]},"offset":"29421010"},"uniqWith.js":{"size":1465,"integrity":{"algorithm":"SHA256","hash":"79dfd9907989a2a9d72f0a6ad78c0711d393ef6043681b83582045a365f7237c","blockSize":4194304,"blocks":["79dfd9907989a2a9d72f0a6ad78c0711d393ef6043681b83582045a365f7237c"]},"offset":"29422341"},"unless.js":{"size":1152,"integrity":{"algorithm":"SHA256","hash":"ec8f3bc11545d726aeaca3fa6ea1996157629238b2301bfb1d2e3f682b1c7b6d","blockSize":4194304,"blocks":["ec8f3bc11545d726aeaca3fa6ea1996157629238b2301bfb1d2e3f682b1c7b6d"]},"offset":"29423806"},"unnest.js":{"size":596,"integrity":{"algorithm":"SHA256","hash":"68c99bf86ec583af06abe1c4e649ceefb08a534df915c91b6aa50588c23b4541","blockSize":4194304,"blocks":["68c99bf86ec583af06abe1c4e649ceefb08a534df915c91b6aa50588c23b4541"]},"offset":"29424958"},"until.js":{"size":855,"integrity":{"algorithm":"SHA256","hash":"d4990a446e62c333afec28b09910b1074a56e45b86e37f1319f2a984a528e8dc","blockSize":4194304,"blocks":["d4990a446e62c333afec28b09910b1074a56e45b86e37f1319f2a984a528e8dc"]},"offset":"29425554"},"unwind.js":{"size":1485,"integrity":{"algorithm":"SHA256","hash":"e84e1126ab0b073e5f726c1bcbc85cbbce5e4f70f146f087cc3e037e9f844cdc","blockSize":4194304,"blocks":["e84e1126ab0b073e5f726c1bcbc85cbbce5e4f70f146f087cc3e037e9f844cdc"]},"offset":"29426409"},"update.js":{"size":1037,"integrity":{"algorithm":"SHA256","hash":"6e1ef098bf65d76b2a41ca882c9783ce734556aa61888ca6a4b8fc0f557e7212","blockSize":4194304,"blocks":["6e1ef098bf65d76b2a41ca882c9783ce734556aa61888ca6a4b8fc0f557e7212"]},"offset":"29427894"},"useWith.js":{"size":1803,"integrity":{"algorithm":"SHA256","hash":"f585d97bbfb6d7990b3be0bac916adb69e82db91459656a3ead36d04db65a212","blockSize":4194304,"blocks":["f585d97bbfb6d7990b3be0bac916adb69e82db91459656a3ead36d04db65a212"]},"offset":"29428931"},"values.js":{"size":839,"integrity":{"algorithm":"SHA256","hash":"e6da423b3e387e2e453d594e0c278dba7d84843c3c2c22909deb84a3ef6f1b61","blockSize":4194304,"blocks":["e6da423b3e387e2e453d594e0c278dba7d84843c3c2c22909deb84a3ef6f1b61"]},"offset":"29430734"},"valuesIn.js":{"size":872,"integrity":{"algorithm":"SHA256","hash":"bc1cdb4fff604ebe604acd42a3deb46f54e2125d6514f6acf3b3a48f1603968a","blockSize":4194304,"blocks":["bc1cdb4fff604ebe604acd42a3deb46f54e2125d6514f6acf3b3a48f1603968a"]},"offset":"29431573"},"view.js":{"size":1089,"integrity":{"algorithm":"SHA256","hash":"fe6a91f4d57bbff198d4d5976f7bbd624007a1917c6f681a088ecfd328ad4992","blockSize":4194304,"blocks":["fe6a91f4d57bbff198d4d5976f7bbd624007a1917c6f681a088ecfd328ad4992"]},"offset":"29432445"},"when.js":{"size":1335,"integrity":{"algorithm":"SHA256","hash":"85b3a403668140edf89d1a7e9b88bc003095f9c522661789183949deeaf8c477","blockSize":4194304,"blocks":["85b3a403668140edf89d1a7e9b88bc003095f9c522661789183949deeaf8c477"]},"offset":"29433534"},"where.js":{"size":1545,"integrity":{"algorithm":"SHA256","hash":"b8d951d80d9bf39e9557629c6c032006d09ebcaf81257a05a8ff0cf963e2c32a","blockSize":4194304,"blocks":["b8d951d80d9bf39e9557629c6c032006d09ebcaf81257a05a8ff0cf963e2c32a"]},"offset":"29434869"},"whereAny.js":{"size":1521,"integrity":{"algorithm":"SHA256","hash":"0c750eeae625e03bee928169f23fef776a051b92e965373bf0f3e32a70266a62","blockSize":4194304,"blocks":["0c750eeae625e03bee928169f23fef776a051b92e965373bf0f3e32a70266a62"]},"offset":"29436414"},"whereEq.js":{"size":1160,"integrity":{"algorithm":"SHA256","hash":"6eb25469887cce90fc31fb607c6f505bf342281694d14775b0f9b876d77790ad","blockSize":4194304,"blocks":["6eb25469887cce90fc31fb607c6f505bf342281694d14775b0f9b876d77790ad"]},"offset":"29437935"},"without.js":{"size":868,"integrity":{"algorithm":"SHA256","hash":"2361f8720a29c0225785c7c7d6a02f2340caf181172b9968947fb9525808b754","blockSize":4194304,"blocks":["2361f8720a29c0225785c7c7d6a02f2340caf181172b9968947fb9525808b754"]},"offset":"29439095"},"xor.js":{"size":710,"integrity":{"algorithm":"SHA256","hash":"6bef317485082e6613c144392474fbfa78d0e359e6ec64249ea25acee3b6ce52","blockSize":4194304,"blocks":["6bef317485082e6613c144392474fbfa78d0e359e6ec64249ea25acee3b6ce52"]},"offset":"29439963"},"xprod.js":{"size":995,"integrity":{"algorithm":"SHA256","hash":"2eba92b8babbe20e9961ff2d995011d3c9a2953428025de4e671f09166052713","blockSize":4194304,"blocks":["2eba92b8babbe20e9961ff2d995011d3c9a2953428025de4e671f09166052713"]},"offset":"29440673"},"zip.js":{"size":1009,"integrity":{"algorithm":"SHA256","hash":"8535b0fc541564ec505abe46db5bf36053fb7adbd7edeaa4cdfd04118727cf6a","blockSize":4194304,"blocks":["8535b0fc541564ec505abe46db5bf36053fb7adbd7edeaa4cdfd04118727cf6a"]},"offset":"29441668"},"zipObj.js":{"size":954,"integrity":{"algorithm":"SHA256","hash":"5cd897e73dfceae68707e61ac639a9631f35f442748accc3c449ba5d4359b15c","blockSize":4194304,"blocks":["5cd897e73dfceae68707e61ac639a9631f35f442748accc3c449ba5d4359b15c"]},"offset":"29442677"},"zipWith.js":{"size":1179,"integrity":{"algorithm":"SHA256","hash":"3026577d70ca6029c79ed178978c1e4ff99bb67f8fe8d20bafe7cd7d1f4124c7","blockSize":4194304,"blocks":["3026577d70ca6029c79ed178978c1e4ff99bb67f8fe8d20bafe7cd7d1f4124c7"]},"offset":"29443631"},"internal":{"files":{"_Set.js":{"size":4669,"integrity":{"algorithm":"SHA256","hash":"2273a2c778beca2d79790066937f933d3d819afcbd2a8f11a7a94e392f46f74d","blockSize":4194304,"blocks":["2273a2c778beca2d79790066937f933d3d819afcbd2a8f11a7a94e392f46f74d"]},"offset":"29444810"},"_aperture.js":{"size":266,"integrity":{"algorithm":"SHA256","hash":"6132d4cce7de597490d5189141e1553d5d2db11a49b3f344adf00a232727618c","blockSize":4194304,"blocks":["6132d4cce7de597490d5189141e1553d5d2db11a49b3f344adf00a232727618c"]},"offset":"29449479"},"_arity.js":{"size":1415,"integrity":{"algorithm":"SHA256","hash":"1522e969b00dea73e4d1cd67a483b087125cd0e7be2c47c9b566f9c2345624f6","blockSize":4194304,"blocks":["1522e969b00dea73e4d1cd67a483b087125cd0e7be2c47c9b566f9c2345624f6"]},"offset":"29449745"},"_arrayFromIterator.js":{"size":168,"integrity":{"algorithm":"SHA256","hash":"4c8cf2bf8c41304817f5931e660a55093a70554dc3714529eebd4de1657e4a0c","blockSize":4194304,"blocks":["4c8cf2bf8c41304817f5931e660a55093a70554dc3714529eebd4de1657e4a0c"]},"offset":"29451160"},"_assertPromise.js":{"size":274,"integrity":{"algorithm":"SHA256","hash":"ba679212dbdbed2a7c6cedf3c76b44a3fa1de293744dba350b154841d8323b1f","blockSize":4194304,"blocks":["ba679212dbdbed2a7c6cedf3c76b44a3fa1de293744dba350b154841d8323b1f"]},"offset":"29451328"},"_assoc.js":{"size":870,"integrity":{"algorithm":"SHA256","hash":"3f7baacc5eb660aac8a88f94d162145e2359868fb95deb13bbb3792542c97c42","blockSize":4194304,"blocks":["3f7baacc5eb660aac8a88f94d162145e2359868fb95deb13bbb3792542c97c42"]},"offset":"29451602"},"_checkForMethod.js":{"size":810,"integrity":{"algorithm":"SHA256","hash":"fbc6073d44932ed33eda2b66405570be62e9565208fb605e96b64ff9a534bc8b","blockSize":4194304,"blocks":["fbc6073d44932ed33eda2b66405570be62e9565208fb605e96b64ff9a534bc8b"]},"offset":"29452472"},"_clone.js":{"size":1530,"integrity":{"algorithm":"SHA256","hash":"a29d1e0124fab90bccb2ce8a3bf514bc7b256856d552d3e79ef13a41b0f94e67","blockSize":4194304,"blocks":["a29d1e0124fab90bccb2ce8a3bf514bc7b256856d552d3e79ef13a41b0f94e67"]},"offset":"29453282"},"_cloneRegExp.js":{"size":243,"integrity":{"algorithm":"SHA256","hash":"2c12885a57c61597f3e97fdfeaec99d3db6aa950f38cddfaeee6e491f00fcf1c","blockSize":4194304,"blocks":["2c12885a57c61597f3e97fdfeaec99d3db6aa950f38cddfaeee6e491f00fcf1c"]},"offset":"29454812"},"_complement.js":{"size":108,"integrity":{"algorithm":"SHA256","hash":"eb8cff5608a915ceaf92a0db27437e0c734e6f1af31dfb71c05d3190fa5272e1","blockSize":4194304,"blocks":["eb8cff5608a915ceaf92a0db27437e0c734e6f1af31dfb71c05d3190fa5272e1"]},"offset":"29455055"},"_concat.js":{"size":697,"integrity":{"algorithm":"SHA256","hash":"2faaae4f5bca65bbcf2f93ba167098659527274996d99017954a968546fb84d4","blockSize":4194304,"blocks":["2faaae4f5bca65bbcf2f93ba167098659527274996d99017954a968546fb84d4"]},"offset":"29455163"},"_createPartialApplicator.js":{"size":307,"integrity":{"algorithm":"SHA256","hash":"c69c30bbfef78cb6f1b50f698ac2a9b251bd7eb55bd8833f40f4a39acc96d1f5","blockSize":4194304,"blocks":["c69c30bbfef78cb6f1b50f698ac2a9b251bd7eb55bd8833f40f4a39acc96d1f5"]},"offset":"29455860"},"_curry1.js":{"size":436,"integrity":{"algorithm":"SHA256","hash":"b5e4740eddf99c76c6e74a9667c7fafabcd8b983587f3cf9edafe8f0db9249f0","blockSize":4194304,"blocks":["b5e4740eddf99c76c6e74a9667c7fafabcd8b983587f3cf9edafe8f0db9249f0"]},"offset":"29456167"},"_curry2.js":{"size":791,"integrity":{"algorithm":"SHA256","hash":"92ccb40fbeb973690d44b5dccca734d91c4d7e7bab1cdfdfcdf9635d9953e38e","blockSize":4194304,"blocks":["92ccb40fbeb973690d44b5dccca734d91c4d7e7bab1cdfdfcdf9635d9953e38e"]},"offset":"29456603"},"_curry3.js":{"size":1629,"integrity":{"algorithm":"SHA256","hash":"39f5456c4fbfdd8c90b50374ce6a1a62980d411049a28f2213fd49c265db45e2","blockSize":4194304,"blocks":["39f5456c4fbfdd8c90b50374ce6a1a62980d411049a28f2213fd49c265db45e2"]},"offset":"29457394"},"_curryN.js":{"size":1121,"integrity":{"algorithm":"SHA256","hash":"94e53932ef7a47d8d637b5e094c064682907f07def0f484de38a2dcb04958252","blockSize":4194304,"blocks":["94e53932ef7a47d8d637b5e094c064682907f07def0f484de38a2dcb04958252"]},"offset":"29459023"},"_dispatchable.js":{"size":1575,"integrity":{"algorithm":"SHA256","hash":"83fe378a170c45dbf4e2bef68bd625d79716e9fa35c72f5cb813c1019b8ebebf","blockSize":4194304,"blocks":["83fe378a170c45dbf4e2bef68bd625d79716e9fa35c72f5cb813c1019b8ebebf"]},"offset":"29460144"},"_dissoc.js":{"size":699,"integrity":{"algorithm":"SHA256","hash":"d885b0512166e63ed0be9a0977c0b279686d361a98cef138de2d55dc5be2af5b","blockSize":4194304,"blocks":["d885b0512166e63ed0be9a0977c0b279686d361a98cef138de2d55dc5be2af5b"]},"offset":"29461719"},"_dropLast.js":{"size":128,"integrity":{"algorithm":"SHA256","hash":"14bc482f7c6678fb240bd81a23a455e00a95e9d90765e8099dc46eb0616b0561","blockSize":4194304,"blocks":["14bc482f7c6678fb240bd81a23a455e00a95e9d90765e8099dc46eb0616b0561"]},"offset":"29462418"},"_dropLastWhile.js":{"size":201,"integrity":{"algorithm":"SHA256","hash":"a3dc2647f6ac8f21c670207280d7f83d29947b1ec0f974be13f3b98eb4cd1c0b","blockSize":4194304,"blocks":["a3dc2647f6ac8f21c670207280d7f83d29947b1ec0f974be13f3b98eb4cd1c0b"]},"offset":"29462546"},"_equals.js":{"size":3934,"integrity":{"algorithm":"SHA256","hash":"1175ae720b9fb241d979525d4ca3ea01d70edb70012534734432c61d2f352c44","blockSize":4194304,"blocks":["1175ae720b9fb241d979525d4ca3ea01d70edb70012534734432c61d2f352c44"]},"offset":"29462747"},"_filter.js":{"size":236,"integrity":{"algorithm":"SHA256","hash":"841b0408fe63f26fa821090ecf88790368a2bbf9903b0fda0983eb1327bdbb43","blockSize":4194304,"blocks":["841b0408fe63f26fa821090ecf88790368a2bbf9903b0fda0983eb1327bdbb43"]},"offset":"29466681"},"_flatCat.js":{"size":963,"integrity":{"algorithm":"SHA256","hash":"4f4c6b5cb0d97ce20e1683fd12a8bab96ad12d4810f7bf0684b68913538e5d40","blockSize":4194304,"blocks":["4f4c6b5cb0d97ce20e1683fd12a8bab96ad12d4810f7bf0684b68913538e5d40"]},"offset":"29466917"},"_forceReduced.js":{"size":122,"integrity":{"algorithm":"SHA256","hash":"21985c5b205804d207f81b8386bd403e6a16acb30e5527ee6560061021fa7c25","blockSize":4194304,"blocks":["21985c5b205804d207f81b8386bd403e6a16acb30e5527ee6560061021fa7c25"]},"offset":"29467880"},"_functionName.js":{"size":207,"integrity":{"algorithm":"SHA256","hash":"bc9210ddafdd6d9457a009118678a0f1e4c33a0fd781e437a9279837d5dd71c4","blockSize":4194304,"blocks":["bc9210ddafdd6d9457a009118678a0f1e4c33a0fd781e437a9279837d5dd71c4"]},"offset":"29468002"},"_functionsWith.js":{"size":408,"integrity":{"algorithm":"SHA256","hash":"895e1e3fd863d3d5354a423591a9a029ddb4c89c67ca04970190ff7fefcb6ce1","blockSize":4194304,"blocks":["895e1e3fd863d3d5354a423591a9a029ddb4c89c67ca04970190ff7fefcb6ce1"]},"offset":"29468209"},"_has.js":{"size":101,"integrity":{"algorithm":"SHA256","hash":"d07805a9b4e5209453eefbede5b5094245b5ec050daab0644c1717357df0e5c1","blockSize":4194304,"blocks":["d07805a9b4e5209453eefbede5b5094245b5ec050daab0644c1717357df0e5c1"]},"offset":"29468617"},"_identity.js":{"size":52,"integrity":{"algorithm":"SHA256","hash":"40d7b1d3362ae77ee624f8f8cd45864e2f0552756889578048f3886c32c9f448","blockSize":4194304,"blocks":["40d7b1d3362ae77ee624f8f8cd45864e2f0552756889578048f3886c32c9f448"]},"offset":"29468718"},"_includes.js":{"size":120,"integrity":{"algorithm":"SHA256","hash":"ed0a7d662b7ca193cfefa69c37129786bd212771a1a24b4d2d85647b2b37e280","blockSize":4194304,"blocks":["ed0a7d662b7ca193cfefa69c37129786bd212771a1a24b4d2d85647b2b37e280"]},"offset":"29468770"},"_includesWith.js":{"size":210,"integrity":{"algorithm":"SHA256","hash":"935480a203d8e3bdf0b3b534622d643d7da05db07316baa831a7a90b1987066f","blockSize":4194304,"blocks":["935480a203d8e3bdf0b3b534622d643d7da05db07316baa831a7a90b1987066f"]},"offset":"29468890"},"_indexOf.js":{"size":1421,"integrity":{"algorithm":"SHA256","hash":"a98d81ddc539994e4b1c8ce781d5eb37fe1005454173d5cae45a4252b8996ab3","blockSize":4194304,"blocks":["a98d81ddc539994e4b1c8ce781d5eb37fe1005454173d5cae45a4252b8996ab3"]},"offset":"29469100"},"_isArguments.js":{"size":364,"integrity":{"algorithm":"SHA256","hash":"18ef035a8aa4e957915b189404a4ac64e6c16fa3c9defbfe202a762112e4ee0c","blockSize":4194304,"blocks":["18ef035a8aa4e957915b189404a4ac64e6c16fa3c9defbfe202a762112e4ee0c"]},"offset":"29470521"},"_isArray.js":{"size":452,"integrity":{"algorithm":"SHA256","hash":"2453ae44b768572c7124f09d1531a97a159fffd2cd661807d9e3bbb5d11e3c0f","blockSize":4194304,"blocks":["2453ae44b768572c7124f09d1531a97a159fffd2cd661807d9e3bbb5d11e3c0f"]},"offset":"29470885"},"_isArrayLike.js":{"size":1135,"integrity":{"algorithm":"SHA256","hash":"8803b18c920f8b0dfb66dc2b318e0bb5400c3b3421afedcb729760fb0befc480","blockSize":4194304,"blocks":["8803b18c920f8b0dfb66dc2b318e0bb5400c3b3421afedcb729760fb0befc480"]},"offset":"29471337"},"_isFunction.js":{"size":253,"integrity":{"algorithm":"SHA256","hash":"84c22befada5a959d11b554f4327b3950c4825c5478d01394b498b8ff10b952c","blockSize":4194304,"blocks":["84c22befada5a959d11b554f4327b3950c4825c5478d01394b498b8ff10b952c"]},"offset":"29472472"},"_isInteger.js":{"size":214,"integrity":{"algorithm":"SHA256","hash":"fe90a5ef0e03ff93857ffad43a644fa0e2c803d1a47fa7752cc121ffdb316a2b","blockSize":4194304,"blocks":["fe90a5ef0e03ff93857ffad43a644fa0e2c803d1a47fa7752cc121ffdb316a2b"]},"offset":"29472725"},"_isNumber.js":{"size":106,"integrity":{"algorithm":"SHA256","hash":"5c526a121ad7616fe62a594a16ef4408893cf7a0975d455ca0c1993421f85f18","blockSize":4194304,"blocks":["5c526a121ad7616fe62a594a16ef4408893cf7a0975d455ca0c1993421f85f18"]},"offset":"29472939"},"_isObject.js":{"size":106,"integrity":{"algorithm":"SHA256","hash":"802c5955949e51313e636753b6b5e4be012ba98c5843da93133b7ccc0286ed51","blockSize":4194304,"blocks":["802c5955949e51313e636753b6b5e4be012ba98c5843da93133b7ccc0286ed51"]},"offset":"29473045"},"_isPlaceholder.js":{"size":132,"integrity":{"algorithm":"SHA256","hash":"e7d1af384a9434647da3306dc666619e35eb7bcd7c562d41a0fab66cb23a59d8","blockSize":4194304,"blocks":["e7d1af384a9434647da3306dc666619e35eb7bcd7c562d41a0fab66cb23a59d8"]},"offset":"29473151"},"_isRegExp.js":{"size":106,"integrity":{"algorithm":"SHA256","hash":"39bd531e4ac0218ca2f0a42985b80779e3e2029e966f7f417e7751c63163cc08","blockSize":4194304,"blocks":["39bd531e4ac0218ca2f0a42985b80779e3e2029e966f7f417e7751c63163cc08"]},"offset":"29473283"},"_isString.js":{"size":106,"integrity":{"algorithm":"SHA256","hash":"5fb1d337bd87046e4ea26c4fe15b6a4a57a2bb9526856874be83b837823ca748","blockSize":4194304,"blocks":["5fb1d337bd87046e4ea26c4fe15b6a4a57a2bb9526856874be83b837823ca748"]},"offset":"29473389"},"_isTransformer.js":{"size":119,"integrity":{"algorithm":"SHA256","hash":"ea936918a012c812a565a905ee0b7de53e0e3e49cbf55658130a8410209d43e7","blockSize":4194304,"blocks":["ea936918a012c812a565a905ee0b7de53e0e3e49cbf55658130a8410209d43e7"]},"offset":"29473495"},"_isTypedArray.js":{"size":922,"integrity":{"algorithm":"SHA256","hash":"c77341e35c4e55a404d96fa96e09e5820a2be71ab6bba40f10db1339104760fa","blockSize":4194304,"blocks":["c77341e35c4e55a404d96fa96e09e5820a2be71ab6bba40f10db1339104760fa"]},"offset":"29473614"},"_makeFlat.js":{"size":740,"integrity":{"algorithm":"SHA256","hash":"bd270a840cdcfc2cf2df6191af4c2934bff6c85b43da2766bb9e950e31527ebe","blockSize":4194304,"blocks":["bd270a840cdcfc2cf2df6191af4c2934bff6c85b43da2766bb9e950e31527ebe"]},"offset":"29474536"},"_map.js":{"size":210,"integrity":{"algorithm":"SHA256","hash":"8ab965430cfb9ff6e8aa4924962a145ef18d05d0836d9915ffe0683b696ae93b","blockSize":4194304,"blocks":["8ab965430cfb9ff6e8aa4924962a145ef18d05d0836d9915ffe0683b696ae93b"]},"offset":"29475276"},"_modify.js":{"size":926,"integrity":{"algorithm":"SHA256","hash":"591aa1e7646e27087fa428a4e0ae463a97fb787820f434b4253c181256531e91","blockSize":4194304,"blocks":["591aa1e7646e27087fa428a4e0ae463a97fb787820f434b4253c181256531e91"]},"offset":"29475486"},"_objectAssign.js":{"size":698,"integrity":{"algorithm":"SHA256","hash":"5ccdabfaba5ade8f983144ede6a18e6ff0ea9a565febd1187f126f3da9e0dd0d","blockSize":4194304,"blocks":["5ccdabfaba5ade8f983144ede6a18e6ff0ea9a565febd1187f126f3da9e0dd0d"]},"offset":"29476412"},"_objectIs.js":{"size":413,"integrity":{"algorithm":"SHA256","hash":"bb72b2a23b379cf5b5e500bdfbc4663070af29ee222a39f2e87fe167f12b34e7","blockSize":4194304,"blocks":["bb72b2a23b379cf5b5e500bdfbc4663070af29ee222a39f2e87fe167f12b34e7"]},"offset":"29477110"},"_of.js":{"size":48,"integrity":{"algorithm":"SHA256","hash":"731160f29314f5f87226bcc84788aa30dcbc487f336ed99712e8c246d15a90aa","blockSize":4194304,"blocks":["731160f29314f5f87226bcc84788aa30dcbc487f336ed99712e8c246d15a90aa"]},"offset":"29477523"},"_pipe.js":{"size":118,"integrity":{"algorithm":"SHA256","hash":"ed5249532b56269b3f38319a23d52052487136ab5583020198e42abb9fbe17d3","blockSize":4194304,"blocks":["ed5249532b56269b3f38319a23d52052487136ab5583020198e42abb9fbe17d3"]},"offset":"29477571"},"_pipeP.js":{"size":180,"integrity":{"algorithm":"SHA256","hash":"640e342a41bef5996aeedf5d4d1c636f232d9653a544141d3d55736f6825c30a","blockSize":4194304,"blocks":["640e342a41bef5996aeedf5d4d1c636f232d9653a544141d3d55736f6825c30a"]},"offset":"29477689"},"_promap.js":{"size":114,"integrity":{"algorithm":"SHA256","hash":"0a29cc5b43c602200b701d2a7f9d736f837f598f60966322403161346e34bd62","blockSize":4194304,"blocks":["0a29cc5b43c602200b701d2a7f9d736f837f598f60966322403161346e34bd62"]},"offset":"29477869"},"_quote.js":{"size":341,"integrity":{"algorithm":"SHA256","hash":"61cba2a37548b7b65d8e5bad7e19637a166494beec8481cfa8780f4a6c02184e","blockSize":4194304,"blocks":["61cba2a37548b7b65d8e5bad7e19637a166494beec8481cfa8780f4a6c02184e"]},"offset":"29477983"},"_reduce.js":{"size":1648,"integrity":{"algorithm":"SHA256","hash":"0b96033c746cb75c1462e90b8d72203be165b753106cb40c782df0ecafc9ef1a","blockSize":4194304,"blocks":["0b96033c746cb75c1462e90b8d72203be165b753106cb40c782df0ecafc9ef1a"]},"offset":"29478324"},"_reduced.js":{"size":154,"integrity":{"algorithm":"SHA256","hash":"e2cdde382d2dc35138c541c29edd32aa95f219e0f3b069497e49845cfc981104","blockSize":4194304,"blocks":["e2cdde382d2dc35138c541c29edd32aa95f219e0f3b069497e49845cfc981104"]},"offset":"29479972"},"_stepCat.js":{"size":1117,"integrity":{"algorithm":"SHA256","hash":"50184d38a212a95761b60ea97e001174b5e3c3ebeb695971f697b664ddb611c3","blockSize":4194304,"blocks":["50184d38a212a95761b60ea97e001174b5e3c3ebeb695971f697b664ddb611c3"]},"offset":"29480126"},"_toISOString.js":{"size":628,"integrity":{"algorithm":"SHA256","hash":"b6c12ea7dcd50b63f989b584ceb06b9135679eb71df2f9613c95cbe4309af657","blockSize":4194304,"blocks":["b6c12ea7dcd50b63f989b584ceb06b9135679eb71df2f9613c95cbe4309af657"]},"offset":"29481243"},"_toString.js":{"size":1800,"integrity":{"algorithm":"SHA256","hash":"065b2d8f860b24537feec16d927b85cacc38bc41fe1e27cd499ea02ef13ead93","blockSize":4194304,"blocks":["065b2d8f860b24537feec16d927b85cacc38bc41fe1e27cd499ea02ef13ead93"]},"offset":"29481871"},"_xall.js":{"size":845,"integrity":{"algorithm":"SHA256","hash":"3d139a06cc022c89db701cb1837ad0630b8ffb1bb46bec0b2b972e1e43d71514","blockSize":4194304,"blocks":["3d139a06cc022c89db701cb1837ad0630b8ffb1bb46bec0b2b972e1e43d71514"]},"offset":"29483671"},"_xany.js":{"size":845,"integrity":{"algorithm":"SHA256","hash":"84132edace8df12ec7312e526dc2c3fbefea16aef67654146991d906531c765a","blockSize":4194304,"blocks":["84132edace8df12ec7312e526dc2c3fbefea16aef67654146991d906531c765a"]},"offset":"29484516"},"_xaperture.js":{"size":1192,"integrity":{"algorithm":"SHA256","hash":"97bd0c3450aebfe856e4c4c4d58b39dcf786bb44dc0fe8bc6d71ca0531835b17","blockSize":4194304,"blocks":["97bd0c3450aebfe856e4c4c4d58b39dcf786bb44dc0fe8bc6d71ca0531835b17"]},"offset":"29485361"},"_xchain.js":{"size":225,"integrity":{"algorithm":"SHA256","hash":"c8c744f53d58a5fa35ed7e1c3c339f7c44beba7a75ff19808b3405baaa1e1bb2","blockSize":4194304,"blocks":["c8c744f53d58a5fa35ed7e1c3c339f7c44beba7a75ff19808b3405baaa1e1bb2"]},"offset":"29486553"},"_xdrop.js":{"size":628,"integrity":{"algorithm":"SHA256","hash":"9bccd4f20bac2a2fa76b09e08bf80b7c8f61de9da68c5df32b9957fcc69ee50c","blockSize":4194304,"blocks":["9bccd4f20bac2a2fa76b09e08bf80b7c8f61de9da68c5df32b9957fcc69ee50c"]},"offset":"29486778"},"_xdropLast.js":{"size":1019,"integrity":{"algorithm":"SHA256","hash":"3c50d99540672fc326e046d3f7694b4a6c721e419cec7457799648902c6c01c8","blockSize":4194304,"blocks":["3c50d99540672fc326e046d3f7694b4a6c721e419cec7457799648902c6c01c8"]},"offset":"29487406"},"_xdropLastWhile.js":{"size":1169,"integrity":{"algorithm":"SHA256","hash":"0927ffb57a0b6260c4fba25fb3234d56ae9cdc9cce2831ad2e09b74cf110af53","blockSize":4194304,"blocks":["0927ffb57a0b6260c4fba25fb3234d56ae9cdc9cce2831ad2e09b74cf110af53"]},"offset":"29488425"},"_xdropRepeatsWith.js":{"size":977,"integrity":{"algorithm":"SHA256","hash":"5a927e5c3718a9fd4d2e59e96903febac191a81087a37990dfed4ae5f986b82c","blockSize":4194304,"blocks":["5a927e5c3718a9fd4d2e59e96903febac191a81087a37990dfed4ae5f986b82c"]},"offset":"29489594"},"_xdropWhile.js":{"size":714,"integrity":{"algorithm":"SHA256","hash":"f7e7c55512094aa5cdd302870523c2889063cee86b65aac010054a889a51bea0","blockSize":4194304,"blocks":["f7e7c55512094aa5cdd302870523c2889063cee86b65aac010054a889a51bea0"]},"offset":"29490571"},"_xfBase.js":{"size":174,"integrity":{"algorithm":"SHA256","hash":"e0e3deda0194df321d31717119730be8b02013246d3d1e078feaa784e14fdff1","blockSize":4194304,"blocks":["e0e3deda0194df321d31717119730be8b02013246d3d1e078feaa784e14fdff1"]},"offset":"29491285"},"_xfilter.js":{"size":604,"integrity":{"algorithm":"SHA256","hash":"a8264b5e892be23f125f1a37a8d08ace30f0661ac6d9d16daa35e30b10b184ef","blockSize":4194304,"blocks":["a8264b5e892be23f125f1a37a8d08ace30f0661ac6d9d16daa35e30b10b184ef"]},"offset":"29491459"},"_xfind.js":{"size":863,"integrity":{"algorithm":"SHA256","hash":"c9043802b9723de6a11a92aaf99755b593784afeb68cd5198b881d36310b156b","blockSize":4194304,"blocks":["c9043802b9723de6a11a92aaf99755b593784afeb68cd5198b881d36310b156b"]},"offset":"29492063"},"_xfindIndex.js":{"size":951,"integrity":{"algorithm":"SHA256","hash":"17ea14eef088c640249f135e0e67a96f1b02ef5dc80b86a09e2df0f20bebbeb0","blockSize":4194304,"blocks":["17ea14eef088c640249f135e0e67a96f1b02ef5dc80b86a09e2df0f20bebbeb0"]},"offset":"29492926"},"_xfindLast.js":{"size":721,"integrity":{"algorithm":"SHA256","hash":"42d9e41a4a922ba1e745d3010af22d6a9dd7dc02a161151bcf019e09650f952f","blockSize":4194304,"blocks":["42d9e41a4a922ba1e745d3010af22d6a9dd7dc02a161151bcf019e09650f952f"]},"offset":"29493877"},"_xfindLastIndex.js":{"size":842,"integrity":{"algorithm":"SHA256","hash":"df2bc940d7415d0f7f90a984807d63629d3fddffe7f361bbebb75ff6a9bab898","blockSize":4194304,"blocks":["df2bc940d7415d0f7f90a984807d63629d3fddffe7f361bbebb75ff6a9bab898"]},"offset":"29494598"},"_xmap.js":{"size":557,"integrity":{"algorithm":"SHA256","hash":"3f36b4a9d69c5b3e66fd8f7af5d9f64acea998f202dac4b5f7b8a31e0fe86845","blockSize":4194304,"blocks":["3f36b4a9d69c5b3e66fd8f7af5d9f64acea998f202dac4b5f7b8a31e0fe86845"]},"offset":"29495440"},"_xpromap.js":{"size":665,"integrity":{"algorithm":"SHA256","hash":"bb4919e2fa7110d03dea6c3471d7c44c70b91bd852926437104a6d556a7dcdd5","blockSize":4194304,"blocks":["bb4919e2fa7110d03dea6c3471d7c44c70b91bd852926437104a6d556a7dcdd5"]},"offset":"29495997"},"_xreduceBy.js":{"size":1299,"integrity":{"algorithm":"SHA256","hash":"29402fd5e46d2cbb666569643efcbf2a39e2cf045e7bb91a678d06aa4f7cc7fc","blockSize":4194304,"blocks":["29402fd5e46d2cbb666569643efcbf2a39e2cf045e7bb91a678d06aa4f7cc7fc"]},"offset":"29496662"},"_xtake.js":{"size":723,"integrity":{"algorithm":"SHA256","hash":"9c280671bbf1b45f26b1a8e03a4f9a745ed0658b9d6285cbfd3b8f4b1c0c2c3a","blockSize":4194304,"blocks":["9c280671bbf1b45f26b1a8e03a4f9a745ed0658b9d6285cbfd3b8f4b1c0c2c3a"]},"offset":"29497961"},"_xtakeWhile.js":{"size":682,"integrity":{"algorithm":"SHA256","hash":"67082ea5fdefd1915281a475a81c27011a0d541626b38ef1a18626e2ff55dd4b","blockSize":4194304,"blocks":["67082ea5fdefd1915281a475a81c27011a0d541626b38ef1a18626e2ff55dd4b"]},"offset":"29498684"},"_xtap.js":{"size":568,"integrity":{"algorithm":"SHA256","hash":"1c835406f27c6470275ee30b66ad065c7cdec004394b8dd86b7051b69b170962","blockSize":4194304,"blocks":["1c835406f27c6470275ee30b66ad065c7cdec004394b8dd86b7051b69b170962"]},"offset":"29499366"},"_xuniqBy.js":{"size":675,"integrity":{"algorithm":"SHA256","hash":"76303b27a7ab7e89601dfe8928190ac6710e359b9850a250dbbd261a15c2c398","blockSize":4194304,"blocks":["76303b27a7ab7e89601dfe8928190ac6710e359b9850a250dbbd261a15c2c398"]},"offset":"29499934"},"_xuniqWith.js":{"size":810,"integrity":{"algorithm":"SHA256","hash":"db6b5c68f3b414b1ef447e5cae418470448b2e8b7fca0b9ce7d87de040a8b7ab","blockSize":4194304,"blocks":["db6b5c68f3b414b1ef447e5cae418470448b2e8b7fca0b9ce7d87de040a8b7ab"]},"offset":"29500609"},"_xwrap.js":{"size":460,"integrity":{"algorithm":"SHA256","hash":"56dc83f20bf100ad5815436b5d5b87b1c484594130aebb1fda4d153909571932","blockSize":4194304,"blocks":["56dc83f20bf100ad5815436b5d5b87b1c484594130aebb1fda4d153909571932"]},"offset":"29501419"}}}}},"dist":{"files":{"ramda.js":{"size":323568,"integrity":{"algorithm":"SHA256","hash":"4df8a55f118abeb2e41025a40e02299ea8c75c162d8bda73bc4132e53e17729d","blockSize":4194304,"blocks":["4df8a55f118abeb2e41025a40e02299ea8c75c162d8bda73bc4132e53e17729d"]},"offset":"29501879"},"ramda.min.js":{"size":48997,"integrity":{"algorithm":"SHA256","hash":"b3573faee50416deaac38ee8fa41dc013e9c11e19dc274ef0b410e46306d521a","blockSize":4194304,"blocks":["b3573faee50416deaac38ee8fa41dc013e9c11e19dc274ef0b410e46306d521a"]},"offset":"29825447"}}}}},"range-parser":{"files":{"HISTORY.md":{"size":917,"integrity":{"algorithm":"SHA256","hash":"aa0d8d70a8c3cdd30685235914ca2422a4e9fd2fa901b166811fa130d05d3f06","blockSize":4194304,"blocks":["aa0d8d70a8c3cdd30685235914ca2422a4e9fd2fa901b166811fa130d05d3f06"]},"offset":"29874444"},"LICENSE":{"size":1178,"integrity":{"algorithm":"SHA256","hash":"f655e6291356ec0de7a8f0e69f294961a2cea86678ec94588be1e6a492e278ab","blockSize":4194304,"blocks":["f655e6291356ec0de7a8f0e69f294961a2cea86678ec94588be1e6a492e278ab"]},"offset":"29875361"},"index.js":{"size":2900,"integrity":{"algorithm":"SHA256","hash":"38786526d000475300728db07455aa21d1e37b0f24e48fbc4cb30136ae30b07b","blockSize":4194304,"blocks":["38786526d000475300728db07455aa21d1e37b0f24e48fbc4cb30136ae30b07b"]},"offset":"29876539"},"package.json":{"size":697,"integrity":{"algorithm":"SHA256","hash":"d77339288e79bdac4bd437cdc9a4c9eb73e5697d86a5281fca8bb6d4f1d044c8","blockSize":4194304,"blocks":["d77339288e79bdac4bd437cdc9a4c9eb73e5697d86a5281fca8bb6d4f1d044c8"]},"offset":"29879439"}}},"raw-body":{"files":{"HISTORY.md":{"size":5962,"integrity":{"algorithm":"SHA256","hash":"745bbf455cbb3ff04d8e9111249a8d46f43ad726f7b20f59f0c5a4b1c2ab777d","blockSize":4194304,"blocks":["745bbf455cbb3ff04d8e9111249a8d46f43ad726f7b20f59f0c5a4b1c2ab777d"]},"offset":"29880136"},"LICENSE":{"size":1181,"integrity":{"algorithm":"SHA256","hash":"37876d7de8bdf5e5b9b58a697ebc34044624e493e6f49eff5c938e5226dcac6b","blockSize":4194304,"blocks":["37876d7de8bdf5e5b9b58a697ebc34044624e493e6f49eff5c938e5226dcac6b"]},"offset":"29886098"},"SECURITY.md":{"size":1188,"integrity":{"algorithm":"SHA256","hash":"410480c1fcb35ddd5ce7ee8fea94048e996768be94ddfd6dc5725ac7aec089c9","blockSize":4194304,"blocks":["410480c1fcb35ddd5ce7ee8fea94048e996768be94ddfd6dc5725ac7aec089c9"]},"offset":"29887279"},"index.js":{"size":6902,"integrity":{"algorithm":"SHA256","hash":"9fc56773a539cb1fd33fb151a49f176654439c54ee6f8f1ff0dba42f954a7278","blockSize":4194304,"blocks":["9fc56773a539cb1fd33fb151a49f176654439c54ee6f8f1ff0dba42f954a7278"]},"offset":"29888467"},"package.json":{"size":948,"integrity":{"algorithm":"SHA256","hash":"787da1ade15bba0e5229a5ca9b12b9dac950d6ae7ba4ccf320860be167d81471","blockSize":4194304,"blocks":["787da1ade15bba0e5229a5ca9b12b9dac950d6ae7ba4ccf320860be167d81471"]},"offset":"29895369"},"node_modules":{"files":{"bytes":{"files":{"History.md":{"size":1775,"integrity":{"algorithm":"SHA256","hash":"b335e48648e33bd56c3bcadbdad4c5a8b419099e7369d3dc845c106ddb49fc1c","blockSize":4194304,"blocks":["b335e48648e33bd56c3bcadbdad4c5a8b419099e7369d3dc845c106ddb49fc1c"]},"offset":"43351382"},"LICENSE":{"size":1153,"integrity":{"algorithm":"SHA256","hash":"e3b44af066615de2ea48d18d852d0762f18c0b2efcea714fa48a6f729d405b85","blockSize":4194304,"blocks":["e3b44af066615de2ea48d18d852d0762f18c0b2efcea714fa48a6f729d405b85"]},"offset":"43353157"},"index.js":{"size":3613,"integrity":{"algorithm":"SHA256","hash":"893fcbbbe962dc00e40dc2e4b20e76e92d874dd257345003c6575d940e91a37f","blockSize":4194304,"blocks":["893fcbbbe962dc00e40dc2e4b20e76e92d874dd257345003c6575d940e91a37f"]},"offset":"43354310"},"package.json":{"size":514,"integrity":{"algorithm":"SHA256","hash":"8a7d291b5d45da5e6f045d601d0c7bd0af26c2b71463dcf34cee58144e5474a3","blockSize":4194304,"blocks":["8a7d291b5d45da5e6f045d601d0c7bd0af26c2b71463dcf34cee58144e5474a3"]},"offset":"43357923"}}},"iconv-lite":{"files":{"LICENSE":{"size":1064,"integrity":{"algorithm":"SHA256","hash":"ac779f7314c74f232ef847ea86e714abe25cf6eeb5cc97b69451b74e2af6492d","blockSize":4194304,"blocks":["ac779f7314c74f232ef847ea86e714abe25cf6eeb5cc97b69451b74e2af6492d"]},"offset":"43358437"},"package.json":{"size":782,"integrity":{"algorithm":"SHA256","hash":"1e36ea870ae39325c1e53e407b0a428254303f1a7033f80ae52095b5af4a7d6e","blockSize":4194304,"blocks":["1e36ea870ae39325c1e53e407b0a428254303f1a7033f80ae52095b5af4a7d6e"]},"offset":"43359501"},"lib":{"files":{"bom-handling.js":{"size":1109,"integrity":{"algorithm":"SHA256","hash":"c230d25d8e7fbb50960c634b636b71327c409e9a77e67fe9446b566bdcea362d","blockSize":4194304,"blocks":["c230d25d8e7fbb50960c634b636b71327c409e9a77e67fe9446b566bdcea362d"]},"offset":"43360283"},"extend-node.js":{"size":8701,"integrity":{"algorithm":"SHA256","hash":"7b86aebd7175d940c50f60eac1981490962855d9723bf971981ddd703ba6af43","blockSize":4194304,"blocks":["7b86aebd7175d940c50f60eac1981490962855d9723bf971981ddd703ba6af43"]},"offset":"43361392"},"index.js":{"size":5123,"integrity":{"algorithm":"SHA256","hash":"77d20e2fd5bcd9e324fb6cfdb909cd06fdaf6a91769adffcf4d7c4c066cce4c3","blockSize":4194304,"blocks":["77d20e2fd5bcd9e324fb6cfdb909cd06fdaf6a91769adffcf4d7c4c066cce4c3"]},"offset":"43370093"},"streams.js":{"size":3387,"integrity":{"algorithm":"SHA256","hash":"25a423eaf41f8dc6bc40cb28189a24e2d63b990ed72c824940bed55d0264ea6d","blockSize":4194304,"blocks":["25a423eaf41f8dc6bc40cb28189a24e2d63b990ed72c824940bed55d0264ea6d"]},"offset":"43375216"}}},"encodings":{"files":{"dbcs-codec.js":{"size":21415,"integrity":{"algorithm":"SHA256","hash":"d39bc17f93fc56af631b00e36542488923378cce5ad9e7db48252ce7a1e7b1ed","blockSize":4194304,"blocks":["d39bc17f93fc56af631b00e36542488923378cce5ad9e7db48252ce7a1e7b1ed"]},"offset":"43378603"},"dbcs-data.js":{"size":8291,"integrity":{"algorithm":"SHA256","hash":"e213f77e926605c30649ea48bcea851d1ec063bb17fa4c2ab6d3b64853b481ac","blockSize":4194304,"blocks":["e213f77e926605c30649ea48bcea851d1ec063bb17fa4c2ab6d3b64853b481ac"]},"offset":"43400018"},"index.js":{"size":710,"integrity":{"algorithm":"SHA256","hash":"69607a9ee51b63333d0e7ee20a38b52e1e96652a4bbc09c701d70835fbbfe10a","blockSize":4194304,"blocks":["69607a9ee51b63333d0e7ee20a38b52e1e96652a4bbc09c701d70835fbbfe10a"]},"offset":"43408309"},"internal.js":{"size":6115,"integrity":{"algorithm":"SHA256","hash":"39d9dd0568708a23c5999fcd6c417ec64f35ecbecd37205f91c7c6b59d14d773","blockSize":4194304,"blocks":["39d9dd0568708a23c5999fcd6c417ec64f35ecbecd37205f91c7c6b59d14d773"]},"offset":"43409019"},"sbcs-codec.js":{"size":2191,"integrity":{"algorithm":"SHA256","hash":"fb511c4c70a6cb0e2a06d03e67ca88dca9f4da6266b909c7338e453d2ecc9fdb","blockSize":4194304,"blocks":["fb511c4c70a6cb0e2a06d03e67ca88dca9f4da6266b909c7338e453d2ecc9fdb"]},"offset":"43415134"},"sbcs-data-generated.js":{"size":32034,"integrity":{"algorithm":"SHA256","hash":"2cf44b3f70c61c9cdd59fda7ec085bc3180809638f208c7239688ccb90a48866","blockSize":4194304,"blocks":["2cf44b3f70c61c9cdd59fda7ec085bc3180809638f208c7239688ccb90a48866"]},"offset":"43417325"},"sbcs-data.js":{"size":4686,"integrity":{"algorithm":"SHA256","hash":"3116c986bff5d0b3a0d9ee1700d97ac466965a7b30d353300d408b41622604c2","blockSize":4194304,"blocks":["3116c986bff5d0b3a0d9ee1700d97ac466965a7b30d353300d408b41622604c2"]},"offset":"43449359"},"utf16.js":{"size":5011,"integrity":{"algorithm":"SHA256","hash":"baf708be438edf0fef70a3e34619c6be94cd53d963acb9b2542419d5fc3bb8c8","blockSize":4194304,"blocks":["baf708be438edf0fef70a3e34619c6be94cd53d963acb9b2542419d5fc3bb8c8"]},"offset":"43454045"},"utf7.js":{"size":9215,"integrity":{"algorithm":"SHA256","hash":"c814ad268d19265ccafc9f7bba2e8dfcdd2afdea62698bb24b7284b3f2ea18a0","blockSize":4194304,"blocks":["c814ad268d19265ccafc9f7bba2e8dfcdd2afdea62698bb24b7284b3f2ea18a0"]},"offset":"43459056"},"tables":{"files":{"big5-added.json":{"size":17717,"integrity":{"algorithm":"SHA256","hash":"db94db5e5d3ab696ddb0025685cfa85da1864839a4a26aab2f8f86f6b8382288","blockSize":4194304,"blocks":["db94db5e5d3ab696ddb0025685cfa85da1864839a4a26aab2f8f86f6b8382288"]},"offset":"43468271"},"cp936.json":{"size":47320,"integrity":{"algorithm":"SHA256","hash":"8225bb693efd380279ed7280b8f8419fd069c5f018d20d5946bf187ad92c0cf7","blockSize":4194304,"blocks":["8225bb693efd380279ed7280b8f8419fd069c5f018d20d5946bf187ad92c0cf7"]},"offset":"43485988"},"cp949.json":{"size":38122,"integrity":{"algorithm":"SHA256","hash":"77a56ea83d0d94d1dc620042ad3c897f0e40814bb05c0085d3aeed0018e8a3e8","blockSize":4194304,"blocks":["77a56ea83d0d94d1dc620042ad3c897f0e40814bb05c0085d3aeed0018e8a3e8"]},"offset":"43533308"},"cp950.json":{"size":42356,"integrity":{"algorithm":"SHA256","hash":"99e2114dc4b39092617967c763f9eaeb4d8e70551afc5884baa3fb92827f3420","blockSize":4194304,"blocks":["99e2114dc4b39092617967c763f9eaeb4d8e70551afc5884baa3fb92827f3420"]},"offset":"43571430"},"eucjp.json":{"size":41064,"integrity":{"algorithm":"SHA256","hash":"7c4fe279000f7e99fc7cd59afb1da21725dcebdc1babd9e3b883253a77abb042","blockSize":4194304,"blocks":["7c4fe279000f7e99fc7cd59afb1da21725dcebdc1babd9e3b883253a77abb042"]},"offset":"43613786"},"gb18030-ranges.json":{"size":2216,"integrity":{"algorithm":"SHA256","hash":"5a3cc11e38f05a0908442acbf1c921d0b73f2a304fb6a9e4484e26eb1ca07d76","blockSize":4194304,"blocks":["5a3cc11e38f05a0908442acbf1c921d0b73f2a304fb6a9e4484e26eb1ca07d76"]},"offset":"43654850"},"gbk-added.json":{"size":1227,"integrity":{"algorithm":"SHA256","hash":"7e6e8c23d37d5819481909e4d972fbf0f35e120dda3498dd3a0cd6b5e4932fe6","blockSize":4194304,"blocks":["7e6e8c23d37d5819481909e4d972fbf0f35e120dda3498dd3a0cd6b5e4932fe6"]},"offset":"43657066"},"shiftjis.json":{"size":23782,"integrity":{"algorithm":"SHA256","hash":"02b0b120f697c48133e8b547e8dc594bc5b9f1c1799b50c2c5ff917298548558","blockSize":4194304,"blocks":["02b0b120f697c48133e8b547e8dc594bc5b9f1c1799b50c2c5ff917298548558"]},"offset":"43658293"}}}}}}}}}}},"rc":{"files":{"LICENSE.APACHE2":{"size":586,"integrity":{"algorithm":"SHA256","hash":"e8734448285a2dd773d40136ed5d5e8163a70701dd540cdc796cfca232f67d55","blockSize":4194304,"blocks":["e8734448285a2dd773d40136ed5d5e8163a70701dd540cdc796cfca232f67d55"]},"offset":"29896317"},"LICENSE.BSD":{"size":1516,"integrity":{"algorithm":"SHA256","hash":"65e7e4d223688c601f42959defde380f8c4aa677fa4706da3b4a53f129bd78a3","blockSize":4194304,"blocks":["65e7e4d223688c601f42959defde380f8c4aa677fa4706da3b4a53f129bd78a3"]},"offset":"29896903"},"LICENSE.MIT":{"size":1088,"integrity":{"algorithm":"SHA256","hash":"d72dea1a8cdf3f4dfa2f594253d0c5b37baefc76e806f5ecb0e426393edcd505","blockSize":4194304,"blocks":["d72dea1a8cdf3f4dfa2f594253d0c5b37baefc76e806f5ecb0e426393edcd505"]},"offset":"29898419"},"browser.js":{"size":137,"integrity":{"algorithm":"SHA256","hash":"6c04801604d01bcc3c9b6db980749bdbd543205af5fef979e6adfc4a835b66c5","blockSize":4194304,"blocks":["6c04801604d01bcc3c9b6db980749bdbd543205af5fef979e6adfc4a835b66c5"]},"offset":"29899507"},"cli.js":{"size":109,"integrity":{"algorithm":"SHA256","hash":"82383f5748af5f9380dbcde8f0166088614bf024e25bdbe073bb87cd385336ba","blockSize":4194304,"blocks":["82383f5748af5f9380dbcde8f0166088614bf024e25bdbe073bb87cd385336ba"]},"offset":"29899644"},"index.js":{"size":1503,"integrity":{"algorithm":"SHA256","hash":"7a4c19d1025d2669723dd2a939ced7d556d815eedfff62bf288970365b8b26dc","blockSize":4194304,"blocks":["7a4c19d1025d2669723dd2a939ced7d556d815eedfff62bf288970365b8b26dc"]},"offset":"29899753"},"package.json":{"size":514,"integrity":{"algorithm":"SHA256","hash":"98ec65d77ff4b6aa7945741f17dbfdfaaf9415d2a920d6a69c3fdc17cd810928","blockSize":4194304,"blocks":["98ec65d77ff4b6aa7945741f17dbfdfaaf9415d2a920d6a69c3fdc17cd810928"]},"offset":"29901256"},"lib":{"files":{"utils.js":{"size":2759,"integrity":{"algorithm":"SHA256","hash":"3eba35eafd078a2c4843a11000c06443b5d8b2fea3b682aae20daeea5be66cd2","blockSize":4194304,"blocks":["3eba35eafd078a2c4843a11000c06443b5d8b2fea3b682aae20daeea5be66cd2"]},"offset":"29901770"}}},"node_modules":{"files":{"strip-json-comments":{"files":{"index.js":{"size":1700,"integrity":{"algorithm":"SHA256","hash":"3fe8c034bfc649c8e80452f4c7052153a49c89a579f3f87a4df6af8bab5ce2b9","blockSize":4194304,"blocks":["3fe8c034bfc649c8e80452f4c7052153a49c89a579f3f87a4df6af8bab5ce2b9"]},"offset":"43682075"},"license":{"size":1119,"integrity":{"algorithm":"SHA256","hash":"6fb9754611c20f6649f68805e8c990e83261f29316e29de9e6cedae607b8634c","blockSize":4194304,"blocks":["6fb9754611c20f6649f68805e8c990e83261f29316e29de9e6cedae607b8634c"]},"offset":"43683775"},"package.json":{"size":468,"integrity":{"algorithm":"SHA256","hash":"7f424d9793b405384e69c943fedf60468298b94982c017e588531e0ee6e18bd3","blockSize":4194304,"blocks":["7f424d9793b405384e69c943fedf60468298b94982c017e588531e0ee6e18bd3"]},"offset":"43684894"}}}}}}},"react-hook-form":{"files":{"LICENSE":{"size":1080,"integrity":{"algorithm":"SHA256","hash":"e8eeb472f0a5889c2c51625b86a3f9b8630680adb9f49a125352e2e426392780","blockSize":4194304,"blocks":["e8eeb472f0a5889c2c51625b86a3f9b8630680adb9f49a125352e2e426392780"]},"offset":"29904529"},"package.json":{"size":2905,"integrity":{"algorithm":"SHA256","hash":"9d4a40b6b6ba94a5f34ea0cb8f82060202fd5f724642c6bd15407a6199859d86","blockSize":4194304,"blocks":["9d4a40b6b6ba94a5f34ea0cb8f82060202fd5f724642c6bd15407a6199859d86"]},"offset":"29905609"},"dist":{"files":{"index.cjs.js":{"size":25525,"integrity":{"algorithm":"SHA256","hash":"51515a2f2206ce6e6cabb20ce450234ab0586edc6e2d091a875987c4537a5cd8","blockSize":4194304,"blocks":["51515a2f2206ce6e6cabb20ce450234ab0586edc6e2d091a875987c4537a5cd8"]},"offset":"29908514"},"index.esm.mjs":{"size":87666,"integrity":{"algorithm":"SHA256","hash":"2779165ca808bc427a0ac62f4f6002e6161e953dda24eb587b37708ca6388b9c","blockSize":4194304,"blocks":["2779165ca808bc427a0ac62f4f6002e6161e953dda24eb587b37708ca6388b9c"]},"offset":"29934039"},"index.umd.js":{"size":25713,"integrity":{"algorithm":"SHA256","hash":"b9be35db1b29fc626ffb1ab73b78f91042c6bba76bc0e575e2305afaf39f1a6c","blockSize":4194304,"blocks":["b9be35db1b29fc626ffb1ab73b78f91042c6bba76bc0e575e2305afaf39f1a6c"]},"offset":"30021705"}}}}},"readable-stream":{"files":{"CONTRIBUTING.md":{"size":1443,"integrity":{"algorithm":"SHA256","hash":"56e4e12a6934a2c4d36c7bf893f4d8aefa6c96f9ffcec357dfa6476e36c4f1f5","blockSize":4194304,"blocks":["56e4e12a6934a2c4d36c7bf893f4d8aefa6c96f9ffcec357dfa6476e36c4f1f5"]},"offset":"30047418"},"GOVERNANCE.md":{"size":5550,"integrity":{"algorithm":"SHA256","hash":"7a521e462d1c6f3b599c44637fb337bbf969dda311510a87236ec539a415331d","blockSize":4194304,"blocks":["7a521e462d1c6f3b599c44637fb337bbf969dda311510a87236ec539a415331d"]},"offset":"30048861"},"LICENSE":{"size":2337,"integrity":{"algorithm":"SHA256","hash":"ec62dc96da0099b87f4511736c87309335527fb7031639493e06c95728dc8c54","blockSize":4194304,"blocks":["ec62dc96da0099b87f4511736c87309335527fb7031639493e06c95728dc8c54"]},"offset":"30054411"},"errors-browser.js":{"size":4197,"integrity":{"algorithm":"SHA256","hash":"346033597378d23e59068d120d6257f7cd85ae88c40b1f85c3329cece0d119c4","blockSize":4194304,"blocks":["346033597378d23e59068d120d6257f7cd85ae88c40b1f85c3329cece0d119c4"]},"offset":"30056748"},"errors.js":{"size":3715,"integrity":{"algorithm":"SHA256","hash":"7028cca95b2f124345bd5b816e0d8184e7b7d208fe0aa76eb38df43e8644fd03","blockSize":4194304,"blocks":["7028cca95b2f124345bd5b816e0d8184e7b7d208fe0aa76eb38df43e8644fd03"]},"offset":"30060945"},"experimentalWarning.js":{"size":460,"integrity":{"algorithm":"SHA256","hash":"5f9beff594347ba6765b806ec36e25699be1407627e2ee91be5d609e40baacb8","blockSize":4194304,"blocks":["5f9beff594347ba6765b806ec36e25699be1407627e2ee91be5d609e40baacb8"]},"offset":"30064660"},"package.json":{"size":1299,"integrity":{"algorithm":"SHA256","hash":"02bac325870a829233ed0f6861fdea78c42cd40cdddff7f5d0c78992924e9172","blockSize":4194304,"blocks":["02bac325870a829233ed0f6861fdea78c42cd40cdddff7f5d0c78992924e9172"]},"offset":"30065120"},"readable-browser.js":{"size":488,"integrity":{"algorithm":"SHA256","hash":"c4ff3ea62ef65a2c68ea721dcbd58b621150660facd02be95ebfc556c4dd123f","blockSize":4194304,"blocks":["c4ff3ea62ef65a2c68ea721dcbd58b621150660facd02be95ebfc556c4dd123f"]},"offset":"30066419"},"readable.js":{"size":729,"integrity":{"algorithm":"SHA256","hash":"2944f1d3c8c5d5c5e07e7c30d6cbef5fc37440b7c73de47aeb37fa8424f04bf1","blockSize":4194304,"blocks":["2944f1d3c8c5d5c5e07e7c30d6cbef5fc37440b7c73de47aeb37fa8424f04bf1"]},"offset":"30066907"},"lib":{"files":{"_stream_duplex.js":{"size":4399,"integrity":{"algorithm":"SHA256","hash":"c3d976062b770b4a88c91d244557bbe9a828b55dc2de1f9ac85c2d5e909389c4","blockSize":4194304,"blocks":["c3d976062b770b4a88c91d244557bbe9a828b55dc2de1f9ac85c2d5e909389c4"]},"offset":"30067636"},"_stream_passthrough.js":{"size":1630,"integrity":{"algorithm":"SHA256","hash":"14475641ec1d85dcbf95e2555fedb04bf02f8482e08822a5a09b01ddc6389f5f","blockSize":4194304,"blocks":["14475641ec1d85dcbf95e2555fedb04bf02f8482e08822a5a09b01ddc6389f5f"]},"offset":"30072035"},"_stream_readable.js":{"size":35972,"integrity":{"algorithm":"SHA256","hash":"c8d010d85186209997a60b3cf1b653a77a88490a3e11e015c2b5eb2d56c30fe7","blockSize":4194304,"blocks":["c8d010d85186209997a60b3cf1b653a77a88490a3e11e015c2b5eb2d56c30fe7"]},"offset":"30073665"},"_stream_transform.js":{"size":7947,"integrity":{"algorithm":"SHA256","hash":"d85bb2b8c6ba3cf71e6ae759342df89dee95981c6856e9f4dc0b85d70cf60b59","blockSize":4194304,"blocks":["d85bb2b8c6ba3cf71e6ae759342df89dee95981c6856e9f4dc0b85d70cf60b59"]},"offset":"30109637"},"_stream_writable.js":{"size":21821,"integrity":{"algorithm":"SHA256","hash":"e97dc3728c1ba71414f84cb44cb4c4ecefdf0fdd1c3242a5f447e08ed20cca6f","blockSize":4194304,"blocks":["e97dc3728c1ba71414f84cb44cb4c4ecefdf0fdd1c3242a5f447e08ed20cca6f"]},"offset":"30117584"},"internal":{"files":{"streams":{"files":{"async_iterator.js":{"size":5957,"integrity":{"algorithm":"SHA256","hash":"3a752f2fcb0de353265f2d4928126183b5a08d9c9eb6aa4fab74808286e69844","blockSize":4194304,"blocks":["3a752f2fcb0de353265f2d4928126183b5a08d9c9eb6aa4fab74808286e69844"]},"offset":"30139405"},"buffer_list.js":{"size":6335,"integrity":{"algorithm":"SHA256","hash":"10f06e02f00b1e4c28afd01cd4b1ecf280c75c59e97fb8611ac014bdd614d2ad","blockSize":4194304,"blocks":["10f06e02f00b1e4c28afd01cd4b1ecf280c75c59e97fb8611ac014bdd614d2ad"]},"offset":"30145362"},"destroy.js":{"size":3117,"integrity":{"algorithm":"SHA256","hash":"54c7b9c8319baeffa83840ae559b5910f530bdca530292d9be190236f219a7b3","blockSize":4194304,"blocks":["54c7b9c8319baeffa83840ae559b5910f530bdca530292d9be190236f219a7b3"]},"offset":"30151697"},"end-of-stream.js":{"size":3102,"integrity":{"algorithm":"SHA256","hash":"75da6b5b0634012017a6252c6e130335de7775e5a02f10817d02af47afa8bb8d","blockSize":4194304,"blocks":["75da6b5b0634012017a6252c6e130335de7775e5a02f10817d02af47afa8bb8d"]},"offset":"30154814"},"from-browser.js":{"size":101,"integrity":{"algorithm":"SHA256","hash":"4b4404c7bd6f66a2175cb7a29c60ce4395c055775ec45eaa35af4357656f604f","blockSize":4194304,"blocks":["4b4404c7bd6f66a2175cb7a29c60ce4395c055775ec45eaa35af4357656f604f"]},"offset":"30157916"},"from.js":{"size":3137,"integrity":{"algorithm":"SHA256","hash":"9c67e32e4f371b72c83265a077c7e317866170134ff8dca4cc24313c5037426b","blockSize":4194304,"blocks":["9c67e32e4f371b72c83265a077c7e317866170134ff8dca4cc24313c5037426b"]},"offset":"30158017"},"pipeline.js":{"size":2428,"integrity":{"algorithm":"SHA256","hash":"16576b2011c78d0c5ceccdeba7451e83e1bd86f2c3f31c05de7df4ccfb149c2a","blockSize":4194304,"blocks":["16576b2011c78d0c5ceccdeba7451e83e1bd86f2c3f31c05de7df4ccfb149c2a"]},"offset":"30161154"},"state.js":{"size":749,"integrity":{"algorithm":"SHA256","hash":"cdbed99634b523be655225df1547cd00295e3041cb02848c652ddad5e6787e49","blockSize":4194304,"blocks":["cdbed99634b523be655225df1547cd00295e3041cb02848c652ddad5e6787e49"]},"offset":"30163582"},"stream-browser.js":{"size":49,"integrity":{"algorithm":"SHA256","hash":"72d46a15491627d8fb1489a47d03583cfe5c21902918016ab532b53e615e5a9a","blockSize":4194304,"blocks":["72d46a15491627d8fb1489a47d03583cfe5c21902918016ab532b53e615e5a9a"]},"offset":"30164331"},"stream.js":{"size":36,"integrity":{"algorithm":"SHA256","hash":"1e7903927df33aadb3659ecce55266c9c851da65ce6c8b723a60a305c1c5422c","blockSize":4194304,"blocks":["1e7903927df33aadb3659ecce55266c9c851da65ce6c8b723a60a305c1c5422c"]},"offset":"30164380"}}}}}}}}},"regexp.prototype.flags":{"files":{".editorconfig":{"size":276,"integrity":{"algorithm":"SHA256","hash":"ede54e8b6b96147c61efd0ddc56d3683508a26066a8baabd63673d2779a06f23","blockSize":4194304,"blocks":["ede54e8b6b96147c61efd0ddc56d3683508a26066a8baabd63673d2779a06f23"]},"offset":"30164416"},".nycrc":{"size":139,"integrity":{"algorithm":"SHA256","hash":"997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a","blockSize":4194304,"blocks":["997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a"]},"offset":"30164692"},"LICENSE":{"size":1082,"integrity":{"algorithm":"SHA256","hash":"9616325393b574ca774a0409b95b05cb0f640393513f72da00c5e3191de4a1ea","blockSize":4194304,"blocks":["9616325393b574ca774a0409b95b05cb0f640393513f72da00c5e3191de4a1ea"]},"offset":"30164831"},"auto.js":{"size":36,"integrity":{"algorithm":"SHA256","hash":"8a28142fdc864763727d7cfe6a19b5dbcdf5e1861207bd2c122082336a6c3221","blockSize":4194304,"blocks":["8a28142fdc864763727d7cfe6a19b5dbcdf5e1861207bd2c122082336a6c3221"]},"offset":"30165913"},"implementation.js":{"size":801,"integrity":{"algorithm":"SHA256","hash":"7f514307177fb0477c68287f9872ae6e8b4172a1f25dbfdf368f93d231618754","blockSize":4194304,"blocks":["7f514307177fb0477c68287f9872ae6e8b4172a1f25dbfdf368f93d231618754"]},"offset":"30165949"},"index.js":{"size":388,"integrity":{"algorithm":"SHA256","hash":"b1ed77f61eeb60e015a5b2eba53e2027e78fe7555418ba2e1a98ee3f65641471","blockSize":4194304,"blocks":["b1ed77f61eeb60e015a5b2eba53e2027e78fe7555418ba2e1a98ee3f65641471"]},"offset":"30166750"},"package.json":{"size":1631,"integrity":{"algorithm":"SHA256","hash":"78fd216b7ad8643b980b059c88d8522f18a43d9db3c6c3c13077c7b63f426e43","blockSize":4194304,"blocks":["78fd216b7ad8643b980b059c88d8522f18a43d9db3c6c3c13077c7b63f426e43"]},"offset":"30167138"},"polyfill.js":{"size":867,"integrity":{"algorithm":"SHA256","hash":"1a24b9b0b1cbc4ea4ff6c0bdce7d8974a5f50701700150ccdbfbdc876bbf6d38","blockSize":4194304,"blocks":["1a24b9b0b1cbc4ea4ff6c0bdce7d8974a5f50701700150ccdbfbdc876bbf6d38"]},"offset":"30168769"},"shim.js":{"size":779,"integrity":{"algorithm":"SHA256","hash":"3f33b3eeb7c3246b410b2e94975e9d015a314a34cf1d89f6489ba6ea45360bef","blockSize":4194304,"blocks":["3f33b3eeb7c3246b410b2e94975e9d015a314a34cf1d89f6489ba6ea45360bef"]},"offset":"30169636"}}},"retry-as-promised":{"files":{"LICENSE":{"size":1098,"integrity":{"algorithm":"SHA256","hash":"f0a3be44c9581a51dde99e4bfe3be1070b5f66a5d0cb5fd8e18e76d7a9d7766f","blockSize":4194304,"blocks":["f0a3be44c9581a51dde99e4bfe3be1070b5f66a5d0cb5fd8e18e76d7a9d7766f"]},"offset":"30170415"},"index.js":{"size":3508,"integrity":{"algorithm":"SHA256","hash":"655bbbb45fa8fba12e1e2bb9e1107f2ad25343defc5fa9b9b9f3cbcf4e0c2ab9","blockSize":4194304,"blocks":["655bbbb45fa8fba12e1e2bb9e1107f2ad25343defc5fa9b9b9f3cbcf4e0c2ab9"]},"offset":"30171513"},"package.json":{"size":604,"integrity":{"algorithm":"SHA256","hash":"784a5a72e4dd7cf8b5bb2da143a44affdd5376eb101cd2591a4b0a23bbe2dc4a","blockSize":4194304,"blocks":["784a5a72e4dd7cf8b5bb2da143a44affdd5376eb101cd2591a4b0a23bbe2dc4a"]},"offset":"30175021"}}},"rfdc":{"files":{"LICENSE":{"size":1101,"integrity":{"algorithm":"SHA256","hash":"1ce941682a96c7b898ecd125d0f2e22319758ea6f3adbf498a65d649b0f3f7dd","blockSize":4194304,"blocks":["1ce941682a96c7b898ecd125d0f2e22319758ea6f3adbf498a65d649b0f3f7dd"]},"offset":"30175625"},"default.js":{"size":55,"integrity":{"algorithm":"SHA256","hash":"d7f46114c176de337df05aef386228b8ee1cd60e93a7400ee4ac98b91651f35e","blockSize":4194304,"blocks":["d7f46114c176de337df05aef386228b8ee1cd60e93a7400ee4ac98b91651f35e"]},"offset":"30176726"},"index.js":{"size":5616,"integrity":{"algorithm":"SHA256","hash":"9b3e80504016390775f93b7ea687744a9a9ba4e19989a184e91b9ed3124734cc","blockSize":4194304,"blocks":["9b3e80504016390775f93b7ea687744a9a9ba4e19989a184e91b9ed3124734cc"]},"offset":"30176781"},"index.test-d.ts":{"size":174,"integrity":{"algorithm":"SHA256","hash":"7804d55c3b95c6f79ee64476b095ccd4917f3866c3ec7a127a1ff3cd438ff071","blockSize":4194304,"blocks":["7804d55c3b95c6f79ee64476b095ccd4917f3866c3ec7a127a1ff3cd438ff071"]},"offset":"30182397"},"package.json":{"size":768,"integrity":{"algorithm":"SHA256","hash":"ff99eb8793fe95320b3448c867030c34c8a88359b6a57e9eb9db67f7c83e08a0","blockSize":4194304,"blocks":["ff99eb8793fe95320b3448c867030c34c8a88359b6a57e9eb9db67f7c83e08a0"]},"offset":"30182571"},".github":{"files":{"workflows":{"files":{"ci.yml":{"size":448,"integrity":{"algorithm":"SHA256","hash":"7701ed5c7e2477ecc9ffd84c8602b90cf8e293b278b66730590e0a68f16a8410","blockSize":4194304,"blocks":["7701ed5c7e2477ecc9ffd84c8602b90cf8e293b278b66730590e0a68f16a8410"]},"offset":"30183339"}}}}}}},"rimraf":{"files":{"LICENSE":{"size":765,"integrity":{"algorithm":"SHA256","hash":"4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b","blockSize":4194304,"blocks":["4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b"]},"offset":"30183787"},"bin.js":{"size":1878,"integrity":{"algorithm":"SHA256","hash":"31a25b2763aa83ea17f4191982c863681739bed548a910f547257fd495641495","blockSize":4194304,"blocks":["31a25b2763aa83ea17f4191982c863681739bed548a910f547257fd495641495"]},"offset":"30184552"},"package.json":{"size":564,"integrity":{"algorithm":"SHA256","hash":"a8487f35c9b0900130c598f6d98cc988b1a5de5c9f14977c1245391f8ca5d861","blockSize":4194304,"blocks":["a8487f35c9b0900130c598f6d98cc988b1a5de5c9f14977c1245391f8ca5d861"]},"offset":"30186430"},"rimraf.js":{"size":8866,"integrity":{"algorithm":"SHA256","hash":"c9db3ffef2ac43cd93b4284147cdd4bfb264eec0ad1a3e69109bc0371b128ee7","blockSize":4194304,"blocks":["c9db3ffef2ac43cd93b4284147cdd4bfb264eec0ad1a3e69109bc0371b128ee7"]},"offset":"30186994"},"node_modules":{"files":{"glob":{"files":{"LICENSE":{"size":976,"integrity":{"algorithm":"SHA256","hash":"6236fa0b88a4a0cce3dda0367979491b2052b3c8d6b1c10b3668de083e86a7f0","blockSize":4194304,"blocks":["6236fa0b88a4a0cce3dda0367979491b2052b3c8d6b1c10b3668de083e86a7f0"]},"offset":"43685362"},"common.js":{"size":6149,"integrity":{"algorithm":"SHA256","hash":"b867e089ab5d4ab19a83e5b34da3dd7f4018fdf255fcacc681aab87d41dc77e8","blockSize":4194304,"blocks":["b867e089ab5d4ab19a83e5b34da3dd7f4018fdf255fcacc681aab87d41dc77e8"]},"offset":"43686338"},"glob.js":{"size":19445,"integrity":{"algorithm":"SHA256","hash":"b8f35657ca927593d0f9e1aae3a8cfe9c33c697bf3c5733c2f6727f25ae25be1","blockSize":4194304,"blocks":["b8f35657ca927593d0f9e1aae3a8cfe9c33c697bf3c5733c2f6727f25ae25be1"]},"offset":"43692487"},"package.json":{"size":915,"integrity":{"algorithm":"SHA256","hash":"1f1d7bffc62d38e63d0a40fd879030357214c409ee2decb35e3882d8ec0aa9a7","blockSize":4194304,"blocks":["1f1d7bffc62d38e63d0a40fd879030357214c409ee2decb35e3882d8ec0aa9a7"]},"offset":"43711932"},"sync.js":{"size":12020,"integrity":{"algorithm":"SHA256","hash":"0f61227f4b55297f1ad16798c53e6a6dd55d633856f153133716413b7c5f61ad","blockSize":4194304,"blocks":["0f61227f4b55297f1ad16798c53e6a6dd55d633856f153133716413b7c5f61ad"]},"offset":"43712847"}}}}}}},"rxjs":{"files":{"CODE_OF_CONDUCT.md":{"size":3280,"integrity":{"algorithm":"SHA256","hash":"59149a00d171318720a00b9ec8d6acc568b51b32c5fcc5ac17fac198e15f05bc","blockSize":4194304,"blocks":["59149a00d171318720a00b9ec8d6acc568b51b32c5fcc5ac17fac198e15f05bc"]},"offset":"30195860"},"LICENSE.txt":{"size":11064,"integrity":{"algorithm":"SHA256","hash":"81c407ac717813b0e3795402960e04003c7bba8ba59b621624707028531c9ade","blockSize":4194304,"blocks":["81c407ac717813b0e3795402960e04003c7bba8ba59b621624707028531c9ade"]},"offset":"30199140"},"package.json":{"size":5190,"integrity":{"algorithm":"SHA256","hash":"bfb53fd5ce2568f494fc34f654144e5b5a77db4617d9f9d86c6b5eab2ff9a9d0","blockSize":4194304,"blocks":["bfb53fd5ce2568f494fc34f654144e5b5a77db4617d9f9d86c6b5eab2ff9a9d0"]},"offset":"30210204"},"tsconfig.json":{"size":692,"integrity":{"algorithm":"SHA256","hash":"5cdc7f317c3ced5cf4e9d540fa01630ed990b07ced6fb215bddd6d8a84f3c9e2","blockSize":4194304,"blocks":["5cdc7f317c3ced5cf4e9d540fa01630ed990b07ced6fb215bddd6d8a84f3c9e2"]},"offset":"30215394"},"webSocket":{"files":{"package.json":{"size":241,"integrity":{"algorithm":"SHA256","hash":"ee53a1fd12d7bf02ffc81bbf1b7a80b252e7081a6b13c119c2f764d393dc734c","blockSize":4194304,"blocks":["ee53a1fd12d7bf02ffc81bbf1b7a80b252e7081a6b13c119c2f764d393dc734c"]},"offset":"30216086"}}},"testing":{"files":{"package.json":{"size":231,"integrity":{"algorithm":"SHA256","hash":"4a14182ff4d487fa27a49ee302e03ff4a6ce63a399ce63812d83f6157ff772f6","blockSize":4194304,"blocks":["4a14182ff4d487fa27a49ee302e03ff4a6ce63a399ce63812d83f6157ff772f6"]},"offset":"30216327"}}},"src":{"files":{"Rx.global.js":{"size":137,"integrity":{"algorithm":"SHA256","hash":"172bc05903d222f919e90658943a92379f63987f7fc0d0c3e8ed40a15a8bd665","blockSize":4194304,"blocks":["172bc05903d222f919e90658943a92379f63987f7fc0d0c3e8ed40a15a8bd665"]},"offset":"30216558"},"index.ts":{"size":11140,"integrity":{"algorithm":"SHA256","hash":"069f9b071ca595155174fe946c622ab4dcb345981f37dfc41de26d146ca98bf3","blockSize":4194304,"blocks":["069f9b071ca595155174fe946c622ab4dcb345981f37dfc41de26d146ca98bf3"]},"offset":"30216695"},"tsconfig.base.json":{"size":200,"integrity":{"algorithm":"SHA256","hash":"c9ab18b70d4fd149a161ed19f72ca34e8ccd5f83458720756a5c89d897f65727","blockSize":4194304,"blocks":["c9ab18b70d4fd149a161ed19f72ca34e8ccd5f83458720756a5c89d897f65727"]},"offset":"30227835"},"tsconfig.cjs.json":{"size":211,"integrity":{"algorithm":"SHA256","hash":"36951b8b9687375e8c5295e40bcd92f3d69900b1595f5f5c431a73ddabeea379","blockSize":4194304,"blocks":["36951b8b9687375e8c5295e40bcd92f3d69900b1595f5f5c431a73ddabeea379"]},"offset":"30228035"},"tsconfig.cjs.spec.json":{"size":275,"integrity":{"algorithm":"SHA256","hash":"e8b94c2dd699d3485fc6238058c9ab0a65a5007ec53392d4e508b4cef690ef59","blockSize":4194304,"blocks":["e8b94c2dd699d3485fc6238058c9ab0a65a5007ec53392d4e508b4cef690ef59"]},"offset":"30228246"},"tsconfig.esm.json":{"size":171,"integrity":{"algorithm":"SHA256","hash":"1e91e222998dc1fe3554a019af963542b4084a218647b74bb6c9d46788687334","blockSize":4194304,"blocks":["1e91e222998dc1fe3554a019af963542b4084a218647b74bb6c9d46788687334"]},"offset":"30228521"},"tsconfig.esm5.json":{"size":237,"integrity":{"algorithm":"SHA256","hash":"58b18f6b7d0d3057c7a74985c644dbca69f317d68a49a11893b71a8104ff0cfa","blockSize":4194304,"blocks":["58b18f6b7d0d3057c7a74985c644dbca69f317d68a49a11893b71a8104ff0cfa"]},"offset":"30228692"},"tsconfig.esm5.rollup.json":{"size":152,"integrity":{"algorithm":"SHA256","hash":"1e6f0df6c96826ac746b1c06879c261c843b23ce1d44a622ad2612f2572e3d29","blockSize":4194304,"blocks":["1e6f0df6c96826ac746b1c06879c261c843b23ce1d44a622ad2612f2572e3d29"]},"offset":"30228929"},"tsconfig.types.json":{"size":327,"integrity":{"algorithm":"SHA256","hash":"b508b16f2dc7758feb0708268608b7b0b620d8c5e18e5ce9e5fa3e43f36c85f5","blockSize":4194304,"blocks":["b508b16f2dc7758feb0708268608b7b0b620d8c5e18e5ce9e5fa3e43f36c85f5"]},"offset":"30229081"},"tsconfig.types.spec.json":{"size":140,"integrity":{"algorithm":"SHA256","hash":"16a4ba8a6376a0c5304c5836abc18220d41d2867926d981d3657bd8e995645bf","blockSize":4194304,"blocks":["16a4ba8a6376a0c5304c5836abc18220d41d2867926d981d3657bd8e995645bf"]},"offset":"30229408"},"webSocket":{"files":{"index.ts":{"size":183,"integrity":{"algorithm":"SHA256","hash":"8617cc109bd63da63d64ea739fc9f4c2515d0256b734282be538a8a705c4cc41","blockSize":4194304,"blocks":["8617cc109bd63da63d64ea739fc9f4c2515d0256b734282be538a8a705c4cc41"]},"offset":"30229548"}}},"testing":{"files":{"index.ts":{"size":79,"integrity":{"algorithm":"SHA256","hash":"9fd7466b77020847dbc9d2165829796bf7ea00895b2520ff3752ffdcff53564b","blockSize":4194304,"blocks":["9fd7466b77020847dbc9d2165829796bf7ea00895b2520ff3752ffdcff53564b"]},"offset":"30229731"}}},"operators":{"files":{"index.ts":{"size":7014,"integrity":{"algorithm":"SHA256","hash":"c1391c61734d641e8a9b5f36224831597a14a2b621fb29b1053ee3ef1781dacc","blockSize":4194304,"blocks":["c1391c61734d641e8a9b5f36224831597a14a2b621fb29b1053ee3ef1781dacc"]},"offset":"30229810"}}},"internal":{"files":{"AnyCatcher.ts":{"size":613,"integrity":{"algorithm":"SHA256","hash":"23b882cce91aa74d651b5b5f6480589378fbbce83a82ad03a36f4dcdf3a7d41b","blockSize":4194304,"blocks":["23b882cce91aa74d651b5b5f6480589378fbbce83a82ad03a36f4dcdf3a7d41b"]},"offset":"30236824"},"AsyncSubject.ts":{"size":1080,"integrity":{"algorithm":"SHA256","hash":"42e792852ecdb846a8bd7ed8c06f57078aea971e15180f2142c005d88a3db269","blockSize":4194304,"blocks":["42e792852ecdb846a8bd7ed8c06f57078aea971e15180f2142c005d88a3db269"]},"offset":"30237437"},"BehaviorSubject.ts":{"size":912,"integrity":{"algorithm":"SHA256","hash":"36757ee596037710fa3c9a374adcce6259b6c5f066d3c55bd0e826da664ad06d","blockSize":4194304,"blocks":["36757ee596037710fa3c9a374adcce6259b6c5f066d3c55bd0e826da664ad06d"]},"offset":"30238517"},"Notification.ts":{"size":11057,"integrity":{"algorithm":"SHA256","hash":"95cd6f879ec4194592f1f98fbee87eabee183e89ec82396b11a3c3043cfa0a4d","blockSize":4194304,"blocks":["95cd6f879ec4194592f1f98fbee87eabee183e89ec82396b11a3c3043cfa0a4d"]},"offset":"30239429"},"NotificationFactories.ts":{"size":1182,"integrity":{"algorithm":"SHA256","hash":"0aaf2f515ae3e73938c240576a98c24d60c51ab778f80b8741cd774beb6df2f7","blockSize":4194304,"blocks":["0aaf2f515ae3e73938c240576a98c24d60c51ab778f80b8741cd774beb6df2f7"]},"offset":"30250486"},"Observable.ts":{"size":20187,"integrity":{"algorithm":"SHA256","hash":"4b5efdc0f0d190d3c4a5f192d16c87078d82958067c5e5e5f0c45960dd5c9cc1","blockSize":4194304,"blocks":["4b5efdc0f0d190d3c4a5f192d16c87078d82958067c5e5e5f0c45960dd5c9cc1"]},"offset":"30251668"},"Operator.ts":{"size":290,"integrity":{"algorithm":"SHA256","hash":"ee64692544091781870a5014747de3dd95f0d86e53e51d699f8c994cb134fc57","blockSize":4194304,"blocks":["ee64692544091781870a5014747de3dd95f0d86e53e51d699f8c994cb134fc57"]},"offset":"30271855"},"ReplaySubject.ts":{"size":4802,"integrity":{"algorithm":"SHA256","hash":"73d1b53bbe728554162f2f0cee831ecf5f3079e880574c25ecbf160ee997b9d3","blockSize":4194304,"blocks":["73d1b53bbe728554162f2f0cee831ecf5f3079e880574c25ecbf160ee997b9d3"]},"offset":"30272145"},"Scheduler.ts":{"size":2518,"integrity":{"algorithm":"SHA256","hash":"9034ea37d1f2e2fb91be182a733b46501701995fad4a4ab8ebf933e8ebfa36fe","blockSize":4194304,"blocks":["9034ea37d1f2e2fb91be182a733b46501701995fad4a4ab8ebf933e8ebfa36fe"]},"offset":"30276947"},"Subject.ts":{"size":5564,"integrity":{"algorithm":"SHA256","hash":"e1420d4a031e30a05c048a9277e059b35f5b079d0245d23c85afabc648c3a35b","blockSize":4194304,"blocks":["e1420d4a031e30a05c048a9277e059b35f5b079d0245d23c85afabc648c3a35b"]},"offset":"30279465"},"Subscriber.ts":{"size":9034,"integrity":{"algorithm":"SHA256","hash":"9bd9c5f4559d2c702cb155795ed967dc6c66cb94eb7df2e458997f690d49d72a","blockSize":4194304,"blocks":["9bd9c5f4559d2c702cb155795ed967dc6c66cb94eb7df2e458997f690d49d72a"]},"offset":"30285029"},"Subscription.ts":{"size":7604,"integrity":{"algorithm":"SHA256","hash":"d5292946bd60171ef270553b517c4613ec544dea1e82b364a469769ce1bce3c2","blockSize":4194304,"blocks":["d5292946bd60171ef270553b517c4613ec544dea1e82b364a469769ce1bce3c2"]},"offset":"30294063"},"config.ts":{"size":4062,"integrity":{"algorithm":"SHA256","hash":"f6d4997cee02ef6b43fb3971af71b48700127ca03ebb9cfff10039f778ce6e94","blockSize":4194304,"blocks":["f6d4997cee02ef6b43fb3971af71b48700127ca03ebb9cfff10039f778ce6e94"]},"offset":"30301667"},"firstValueFrom.ts":{"size":2609,"integrity":{"algorithm":"SHA256","hash":"1a51f044830a78c7d7ebdac9687f5904666671987ebe4035adb704aac77d4b98","blockSize":4194304,"blocks":["1a51f044830a78c7d7ebdac9687f5904666671987ebe4035adb704aac77d4b98"]},"offset":"30305729"},"lastValueFrom.ts":{"size":2536,"integrity":{"algorithm":"SHA256","hash":"ce42bc63e946a7483f7ad3ce9010d33ba399ef189450896fb8905c3fff99bad5","blockSize":4194304,"blocks":["ce42bc63e946a7483f7ad3ce9010d33ba399ef189450896fb8905c3fff99bad5"]},"offset":"30308338"},"types.ts":{"size":9802,"integrity":{"algorithm":"SHA256","hash":"268b475c6e3bbaabc42c910ac139038b75c9f15c9231134735e49c2576e34e78","blockSize":4194304,"blocks":["268b475c6e3bbaabc42c910ac139038b75c9f15c9231134735e49c2576e34e78"]},"offset":"30310874"},"umd.ts":{"size":598,"integrity":{"algorithm":"SHA256","hash":"580f61ce4cddfee4590d2aed54d747f56eca094df00c0984543c74056fd49ad6","blockSize":4194304,"blocks":["580f61ce4cddfee4590d2aed54d747f56eca094df00c0984543c74056fd49ad6"]},"offset":"30320676"},"util":{"files":{"ArgumentOutOfRangeError.ts":{"size":912,"integrity":{"algorithm":"SHA256","hash":"69e50d0affc44950faae8e93e8154e9541eebf163278ff9cbeb971e2ff12ef15","blockSize":4194304,"blocks":["69e50d0affc44950faae8e93e8154e9541eebf163278ff9cbeb971e2ff12ef15"]},"offset":"30321274"},"EmptyError.ts":{"size":787,"integrity":{"algorithm":"SHA256","hash":"a42f5bd889dc6f7b84e68535856fe9d86d19be734f1f7f8382f71e8ce7dd5aaa","blockSize":4194304,"blocks":["a42f5bd889dc6f7b84e68535856fe9d86d19be734f1f7f8382f71e8ce7dd5aaa"]},"offset":"30322186"},"Immediate.ts":{"size":1167,"integrity":{"algorithm":"SHA256","hash":"5bfb311b8d283721eb5ea65aa945c46af66db07c394da9fa955bf671f2993e4e","blockSize":4194304,"blocks":["5bfb311b8d283721eb5ea65aa945c46af66db07c394da9fa955bf671f2993e4e"]},"offset":"30322973"},"NotFoundError.ts":{"size":753,"integrity":{"algorithm":"SHA256","hash":"1dfda08c4e35c47d2d74f3480484973439fedd1434d427add5939623325eeb4c","blockSize":4194304,"blocks":["1dfda08c4e35c47d2d74f3480484973439fedd1434d427add5939623325eeb4c"]},"offset":"30324140"},"ObjectUnsubscribedError.ts":{"size":842,"integrity":{"algorithm":"SHA256","hash":"4a9add1a98b8ec49293a6bdc643f0a9df02c031345d5c2b0e7e1f3459cae38fe","blockSize":4194304,"blocks":["4a9add1a98b8ec49293a6bdc643f0a9df02c031345d5c2b0e7e1f3459cae38fe"]},"offset":"30324893"},"SequenceError.ts":{"size":769,"integrity":{"algorithm":"SHA256","hash":"18013b71d2c60c96bd0dae10a82c28fbe70a7a4f53915b50d2be79e8f16e4973","blockSize":4194304,"blocks":["18013b71d2c60c96bd0dae10a82c28fbe70a7a4f53915b50d2be79e8f16e4973"]},"offset":"30325735"},"UnsubscriptionError.ts":{"size":972,"integrity":{"algorithm":"SHA256","hash":"9501a902ee283375c29e4d676a2b8f9afa9cf2f7d098c4b6163628eeed2db6e0","blockSize":4194304,"blocks":["9501a902ee283375c29e4d676a2b8f9afa9cf2f7d098c4b6163628eeed2db6e0"]},"offset":"30326504"},"applyMixins.ts":{"size":406,"integrity":{"algorithm":"SHA256","hash":"5d49de9570e8a9a8b719b54710ccd18bafeba9f6990ef793d02e75d0e453adf9","blockSize":4194304,"blocks":["5d49de9570e8a9a8b719b54710ccd18bafeba9f6990ef793d02e75d0e453adf9"]},"offset":"30327476"},"args.ts":{"size":641,"integrity":{"algorithm":"SHA256","hash":"fa20f23df91889699843f73011e3718b35b73cc1834ac3d5d2708803a8f3e911","blockSize":4194304,"blocks":["fa20f23df91889699843f73011e3718b35b73cc1834ac3d5d2708803a8f3e911"]},"offset":"30327882"},"argsArgArrayOrObject.ts":{"size":986,"integrity":{"algorithm":"SHA256","hash":"29caec8bb477573a4c6606ea69589e450d80b599722c6b71337bb895fbd2cfe1","blockSize":4194304,"blocks":["29caec8bb477573a4c6606ea69589e450d80b599722c6b71337bb895fbd2cfe1"]},"offset":"30328523"},"argsOrArgArray.ts":{"size":297,"integrity":{"algorithm":"SHA256","hash":"eb8c6d1efcc15534da65896edeb3a4382445fefc768e02b11b9d059eb36ce0ca","blockSize":4194304,"blocks":["eb8c6d1efcc15534da65896edeb3a4382445fefc768e02b11b9d059eb36ce0ca"]},"offset":"30329509"},"arrRemove.ts":{"size":302,"integrity":{"algorithm":"SHA256","hash":"54f59187f112d4f4492126018bdbbebe932ccc082b371ae97e98c5f9fa3cb6dd","blockSize":4194304,"blocks":["54f59187f112d4f4492126018bdbbebe932ccc082b371ae97e98c5f9fa3cb6dd"]},"offset":"30329806"},"createErrorClass.ts":{"size":789,"integrity":{"algorithm":"SHA256","hash":"5d7a364fe929274051f77a1152aaa4e3697a3160642dcb56c385abe614ba7d91","blockSize":4194304,"blocks":["5d7a364fe929274051f77a1152aaa4e3697a3160642dcb56c385abe614ba7d91"]},"offset":"30330108"},"createObject.ts":{"size":154,"integrity":{"algorithm":"SHA256","hash":"8b0cc03c759fabebd1eebd9f03e1f593cc6038280c1aac07fa82750af9841d81","blockSize":4194304,"blocks":["8b0cc03c759fabebd1eebd9f03e1f593cc6038280c1aac07fa82750af9841d81"]},"offset":"30330897"},"errorContext.ts":{"size":1234,"integrity":{"algorithm":"SHA256","hash":"b5f2e39566037089886dd1a73e771f202cce6e161169f7816372eeccbfcbe8a9","blockSize":4194304,"blocks":["b5f2e39566037089886dd1a73e771f202cce6e161169f7816372eeccbfcbe8a9"]},"offset":"30331051"},"executeSchedule.ts":{"size":1243,"integrity":{"algorithm":"SHA256","hash":"9b79b391b45cec1fc540086a209a4a79de0b4fe3281c2a449b6033cbfbce783d","blockSize":4194304,"blocks":["9b79b391b45cec1fc540086a209a4a79de0b4fe3281c2a449b6033cbfbce783d"]},"offset":"30332285"},"identity.ts":{"size":1049,"integrity":{"algorithm":"SHA256","hash":"7a2ce7656d10bea71016d7bbf4db3eec35a0699d9974d7c98e34b7528e917a8e","blockSize":4194304,"blocks":["7a2ce7656d10bea71016d7bbf4db3eec35a0699d9974d7c98e34b7528e917a8e"]},"offset":"30333528"},"isArrayLike.ts":{"size":124,"integrity":{"algorithm":"SHA256","hash":"81fd0b7f59ad6b91ab093fced997dd5e9b4b47809c391763ee1981f508e7e118","blockSize":4194304,"blocks":["81fd0b7f59ad6b91ab093fced997dd5e9b4b47809c391763ee1981f508e7e118"]},"offset":"30334577"},"isAsyncIterable.ts":{"size":192,"integrity":{"algorithm":"SHA256","hash":"04d9b3cd7675f6725e489d2a339d16c7e2e88bff05e534992f9900dfa5b2357c","blockSize":4194304,"blocks":["04d9b3cd7675f6725e489d2a339d16c7e2e88bff05e534992f9900dfa5b2357c"]},"offset":"30334701"},"isDate.ts":{"size":363,"integrity":{"algorithm":"SHA256","hash":"f17dc9ff197ff8dc5e2f04ad0d0f12f78c20022ca91f40a4a4abfbbb5630c322","blockSize":4194304,"blocks":["f17dc9ff197ff8dc5e2f04ad0d0f12f78c20022ca91f40a4a4abfbbb5630c322"]},"offset":"30334893"},"isFunction.ts":{"size":203,"integrity":{"algorithm":"SHA256","hash":"912c3fb2775a298f316645f525d57c3738d0572f958cae0d8a1d8413328c2bf4","blockSize":4194304,"blocks":["912c3fb2775a298f316645f525d57c3738d0572f958cae0d8a1d8413328c2bf4"]},"offset":"30335256"},"isInteropObservable.ts":{"size":378,"integrity":{"algorithm":"SHA256","hash":"684307338705e9c9d3bf9f600ddf66eab07b127e0e4a3efde10ec538ff6d3897","blockSize":4194304,"blocks":["684307338705e9c9d3bf9f600ddf66eab07b127e0e4a3efde10ec538ff6d3897"]},"offset":"30335459"},"isIterable.ts":{"size":272,"integrity":{"algorithm":"SHA256","hash":"04124df776efb1bc49270020d872e98c3496a003ee31e5ef1506050cdc681bfd","blockSize":4194304,"blocks":["04124df776efb1bc49270020d872e98c3496a003ee31e5ef1506050cdc681bfd"]},"offset":"30335837"},"isObservable.ts":{"size":503,"integrity":{"algorithm":"SHA256","hash":"9b97559ca89d52f630e39ab6bb733c3637f2158c63fae61e01630d83a1f674a2","blockSize":4194304,"blocks":["9b97559ca89d52f630e39ab6bb733c3637f2158c63fae61e01630d83a1f674a2"]},"offset":"30336109"},"isPromise.ts":{"size":236,"integrity":{"algorithm":"SHA256","hash":"b18df90eb52deccb9c7ed33518d701d3d55f55161adc048651a37062587a6784","blockSize":4194304,"blocks":["b18df90eb52deccb9c7ed33518d701d3d55f55161adc048651a37062587a6784"]},"offset":"30336612"},"isReadableStreamLike.ts":{"size":704,"integrity":{"algorithm":"SHA256","hash":"3dd04958bde7d4b070ade8b149a27e68e8d44c2c8f8dc1e0b24f4ec451f3b49c","blockSize":4194304,"blocks":["3dd04958bde7d4b070ade8b149a27e68e8d44c2c8f8dc1e0b24f4ec451f3b49c"]},"offset":"30336848"},"isScheduler.ts":{"size":200,"integrity":{"algorithm":"SHA256","hash":"b55ab2aa6fb462c9535edfcb70c7b71a74580752e0d34ee5b8f26bdb74310e2d","blockSize":4194304,"blocks":["b55ab2aa6fb462c9535edfcb70c7b71a74580752e0d34ee5b8f26bdb74310e2d"]},"offset":"30337552"},"lift.ts":{"size":1113,"integrity":{"algorithm":"SHA256","hash":"48581262e69c4f9140f0521d3f8e88cb2358f6371fd00ec99b33b143690e8903","blockSize":4194304,"blocks":["48581262e69c4f9140f0521d3f8e88cb2358f6371fd00ec99b33b143690e8903"]},"offset":"30337752"},"mapOneOrManyArgs.ts":{"size":539,"integrity":{"algorithm":"SHA256","hash":"ad749cb5037c7d4663b1eadfe43748569d5f99264eca879ea893f93bf9b86190","blockSize":4194304,"blocks":["ad749cb5037c7d4663b1eadfe43748569d5f99264eca879ea893f93bf9b86190"]},"offset":"30338865"},"noop.ts":{"size":57,"integrity":{"algorithm":"SHA256","hash":"4fa3043834efad8b07338dd5a9a6737c1e8834377ffd70f6713ef2fca13e8734","blockSize":4194304,"blocks":["4fa3043834efad8b07338dd5a9a6737c1e8834377ffd70f6713ef2fca13e8734"]},"offset":"30339404"},"not.ts":{"size":196,"integrity":{"algorithm":"SHA256","hash":"07e79ee47bbbfe374a41c9d157c95b7ea7f1931c9fef9c9d24fc3578a949cc02","blockSize":4194304,"blocks":["07e79ee47bbbfe374a41c9d157c95b7ea7f1931c9fef9c9d24fc3578a949cc02"]},"offset":"30339461"},"pipe.ts":{"size":3124,"integrity":{"algorithm":"SHA256","hash":"e03eeefc2fb1a351715940606188a293c7101e98798ace6d371ebf9c5a65a61d","blockSize":4194304,"blocks":["e03eeefc2fb1a351715940606188a293c7101e98798ace6d371ebf9c5a65a61d"]},"offset":"30339657"},"reportUnhandledError.ts":{"size":902,"integrity":{"algorithm":"SHA256","hash":"96c1a4f500270f7413e2fa1d9cd35acc02190d5710c7e0e88175806fcb5892a5","blockSize":4194304,"blocks":["96c1a4f500270f7413e2fa1d9cd35acc02190d5710c7e0e88175806fcb5892a5"]},"offset":"30342781"},"subscribeToArray.ts":{"size":389,"integrity":{"algorithm":"SHA256","hash":"c52067ad077824d378de71245a27871f74e25d30dd2000b23fa2453903e04d4e","blockSize":4194304,"blocks":["c52067ad077824d378de71245a27871f74e25d30dd2000b23fa2453903e04d4e"]},"offset":"30343683"},"throwUnobservableError.ts":{"size":564,"integrity":{"algorithm":"SHA256","hash":"d53172d827afc3aafcfcf514f0f5be937d90b5fa0ae572995bcec81159647671","blockSize":4194304,"blocks":["d53172d827afc3aafcfcf514f0f5be937d90b5fa0ae572995bcec81159647671"]},"offset":"30344072"},"workarounds.ts":{"size":338,"integrity":{"algorithm":"SHA256","hash":"c5720f17327a2aa0295ea636cd6bb0b4b713a7524687fecf921dd1c75a73bc56","blockSize":4194304,"blocks":["c5720f17327a2aa0295ea636cd6bb0b4b713a7524687fecf921dd1c75a73bc56"]},"offset":"30344636"}}},"testing":{"files":{"ColdObservable.ts":{"size":1951,"integrity":{"algorithm":"SHA256","hash":"cd788862cc7ccc2658f6764c2e2cd4aaabba726a29c867cf323baef6749f4ba3","blockSize":4194304,"blocks":["cd788862cc7ccc2658f6764c2e2cd4aaabba726a29c867cf323baef6749f4ba3"]},"offset":"30344974"},"HotObservable.ts":{"size":1846,"integrity":{"algorithm":"SHA256","hash":"9c83530f24923a2e3fb8e8634652da08786d6fd0d5ff7c05e0771f620b82d1bb","blockSize":4194304,"blocks":["9c83530f24923a2e3fb8e8634652da08786d6fd0d5ff7c05e0771f620b82d1bb"]},"offset":"30346925"},"SubscriptionLog.ts":{"size":143,"integrity":{"algorithm":"SHA256","hash":"3093b43040ffd76ef49a1b8b083a8d1687bb10d0e38eadeda74ad36466ca5526","blockSize":4194304,"blocks":["3093b43040ffd76ef49a1b8b083a8d1687bb10d0e38eadeda74ad36466ca5526"]},"offset":"30348771"},"SubscriptionLoggable.ts":{"size":711,"integrity":{"algorithm":"SHA256","hash":"f402805343f67e927e00e29442e99acef572357d7e30fa0b715ee4ce19b329cc","blockSize":4194304,"blocks":["f402805343f67e927e00e29442e99acef572357d7e30fa0b715ee4ce19b329cc"]},"offset":"30348914"},"TestMessage.ts":{"size":168,"integrity":{"algorithm":"SHA256","hash":"45cfc6b331c3b10deaf8b7a03035e6bee16d67cffa8ac76563ea0c6e47a1b256","blockSize":4194304,"blocks":["45cfc6b331c3b10deaf8b7a03035e6bee16d67cffa8ac76563ea0c6e47a1b256"]},"offset":"30349625"},"TestScheduler.ts":{"size":25329,"integrity":{"algorithm":"SHA256","hash":"308fcd89a9d14eef044d0c5714c7ba3061e0d0fd6b2924893e9358ea7912ec92","blockSize":4194304,"blocks":["308fcd89a9d14eef044d0c5714c7ba3061e0d0fd6b2924893e9358ea7912ec92"]},"offset":"30349793"}}},"symbol":{"files":{"iterator.ts":{"size":215,"integrity":{"algorithm":"SHA256","hash":"781017ad4369700c23dc3581b4591f4fc855a2f36ad718ff6f355c4ff8ee9f84","blockSize":4194304,"blocks":["781017ad4369700c23dc3581b4591f4fc855a2f36ad718ff6f355c4ff8ee9f84"]},"offset":"30375122"},"observable.ts":{"size":194,"integrity":{"algorithm":"SHA256","hash":"0aec083264ad63ce03d13e6dd35d07e978b03228b6566015fc699e01a8c86a47","blockSize":4194304,"blocks":["0aec083264ad63ce03d13e6dd35d07e978b03228b6566015fc699e01a8c86a47"]},"offset":"30375337"}}},"scheduler":{"files":{"Action.ts":{"size":1312,"integrity":{"algorithm":"SHA256","hash":"cca695d44c6b8ef8cc2e5fa12e88d5d53ce527bd29f8d6121372a9fad146b8a3","blockSize":4194304,"blocks":["cca695d44c6b8ef8cc2e5fa12e88d5d53ce527bd29f8d6121372a9fad146b8a3"]},"offset":"30375531"},"AnimationFrameAction.ts":{"size":2100,"integrity":{"algorithm":"SHA256","hash":"8397f6dd27ce9ee8a91940d38df63f84a98ecf7658d8b56d9f126b66ea76bfb2","blockSize":4194304,"blocks":["8397f6dd27ce9ee8a91940d38df63f84a98ecf7658d8b56d9f126b66ea76bfb2"]},"offset":"30376843"},"AnimationFrameScheduler.ts":{"size":1380,"integrity":{"algorithm":"SHA256","hash":"f1a857b10db363fcf90700c5c44d1aacb3dea9b53e8991c4c12a7e254588a81d","blockSize":4194304,"blocks":["f1a857b10db363fcf90700c5c44d1aacb3dea9b53e8991c4c12a7e254588a81d"]},"offset":"30378943"},"AsapAction.ts":{"size":1987,"integrity":{"algorithm":"SHA256","hash":"c92bad221e10ec3fd737627abafadb2fdf9dfa35c417dbdc18ffe5cc492d78b3","blockSize":4194304,"blocks":["c92bad221e10ec3fd737627abafadb2fdf9dfa35c417dbdc18ffe5cc492d78b3"]},"offset":"30380323"},"AsapScheduler.ts":{"size":1370,"integrity":{"algorithm":"SHA256","hash":"53f58b28f259b4c57e5a9619a11031140d9932123e2448150f01cf6491d7a960","blockSize":4194304,"blocks":["53f58b28f259b4c57e5a9619a11031140d9932123e2448150f01cf6491d7a960"]},"offset":"30382310"},"AsyncAction.ts":{"size":5141,"integrity":{"algorithm":"SHA256","hash":"e6fffc336bfe6e4b1dc3c0fe5ba10251614147bf58dfceb2b555473735f1514d","blockSize":4194304,"blocks":["e6fffc336bfe6e4b1dc3c0fe5ba10251614147bf58dfceb2b555473735f1514d"]},"offset":"30383680"},"AsyncScheduler.ts":{"size":1301,"integrity":{"algorithm":"SHA256","hash":"66c720e3e3e36ad0c6b43089cb8f6e4074d47a307a2fce4f8f95fefba2cd8344","blockSize":4194304,"blocks":["66c720e3e3e36ad0c6b43089cb8f6e4074d47a307a2fce4f8f95fefba2cd8344"]},"offset":"30388821"},"QueueAction.ts":{"size":1341,"integrity":{"algorithm":"SHA256","hash":"0f88b8100d9a07053ef3d9280f48f3bee59f4936cad78873644078b09da8a2ae","blockSize":4194304,"blocks":["0f88b8100d9a07053ef3d9280f48f3bee59f4936cad78873644078b09da8a2ae"]},"offset":"30390122"},"QueueScheduler.ts":{"size":107,"integrity":{"algorithm":"SHA256","hash":"7ec9e8c0447764bdbb2fd4fb95d39414e455cf425a92f98642af7b8e8a03221b","blockSize":4194304,"blocks":["7ec9e8c0447764bdbb2fd4fb95d39414e455cf425a92f98642af7b8e8a03221b"]},"offset":"30391463"},"VirtualTimeScheduler.ts":{"size":4205,"integrity":{"algorithm":"SHA256","hash":"fe9eb06687f0e55756ab9603cb57e8cf118a1f3d2460499361fa11400b2afa53","blockSize":4194304,"blocks":["fe9eb06687f0e55756ab9603cb57e8cf118a1f3d2460499361fa11400b2afa53"]},"offset":"30391570"},"animationFrame.ts":{"size":1409,"integrity":{"algorithm":"SHA256","hash":"6fc76fc7b7b63a9d91e68b5993d38ba007fece7b1cba223a3083febab1e7ab99","blockSize":4194304,"blocks":["6fc76fc7b7b63a9d91e68b5993d38ba007fece7b1cba223a3083febab1e7ab99"]},"offset":"30395775"},"animationFrameProvider.ts":{"size":1629,"integrity":{"algorithm":"SHA256","hash":"db60426a737cb75d51d24649e08f30a865e4d30d61f77ab1892efa8cf51a6bc8","blockSize":4194304,"blocks":["db60426a737cb75d51d24649e08f30a865e4d30d61f77ab1892efa8cf51a6bc8"]},"offset":"30397184"},"asap.ts":{"size":1732,"integrity":{"algorithm":"SHA256","hash":"a36bea65fec1da0977ce92c78e829aed51bade2c9d7563255e43d10adf20b77a","blockSize":4194304,"blocks":["a36bea65fec1da0977ce92c78e829aed51bade2c9d7563255e43d10adf20b77a"]},"offset":"30398813"},"async.ts":{"size":1562,"integrity":{"algorithm":"SHA256","hash":"b6ba5be6855c346e13f86d830b9fd9dc322108aaed86e45fe85c7dfec747b898","blockSize":4194304,"blocks":["b6ba5be6855c346e13f86d830b9fd9dc322108aaed86e45fe85c7dfec747b898"]},"offset":"30400545"},"dateTimestampProvider.ts":{"size":437,"integrity":{"algorithm":"SHA256","hash":"fba730354a5a55ba693516a2ba4ccaa91f11bb5a23982c033f3197ebc14117b5","blockSize":4194304,"blocks":["fba730354a5a55ba693516a2ba4ccaa91f11bb5a23982c033f3197ebc14117b5"]},"offset":"30402107"},"immediateProvider.ts":{"size":1057,"integrity":{"algorithm":"SHA256","hash":"eaf84b65138d07de69f30d1e794b1bcb08c733b3f2ca8da33bb8137cd52e2c64","blockSize":4194304,"blocks":["eaf84b65138d07de69f30d1e794b1bcb08c733b3f2ca8da33bb8137cd52e2c64"]},"offset":"30402544"},"intervalProvider.ts":{"size":1085,"integrity":{"algorithm":"SHA256","hash":"f1eeb5ac6f566d7545afc5a609bf7b64c57e2f92362a919e3032aa80f3c54b7b","blockSize":4194304,"blocks":["f1eeb5ac6f566d7545afc5a609bf7b64c57e2f92362a919e3032aa80f3c54b7b"]},"offset":"30403601"},"performanceTimestampProvider.ts":{"size":472,"integrity":{"algorithm":"SHA256","hash":"b1012c32e14bc68078f6ed813a0b390ebc2751dc28defeec50286dbc27726a95","blockSize":4194304,"blocks":["b1012c32e14bc68078f6ed813a0b390ebc2751dc28defeec50286dbc27726a95"]},"offset":"30404686"},"queue.ts":{"size":2099,"integrity":{"algorithm":"SHA256","hash":"37d2d4855dcad0bd41ca949acf1620589825063dc8cc4dfee114f31786486fa9","blockSize":4194304,"blocks":["37d2d4855dcad0bd41ca949acf1620589825063dc8cc4dfee114f31786486fa9"]},"offset":"30405158"},"timeoutProvider.ts":{"size":1063,"integrity":{"algorithm":"SHA256","hash":"acd553ece2285b2d4c0a45794b74a9c1e7e81c264d9c66d94696312dafa5fd92","blockSize":4194304,"blocks":["acd553ece2285b2d4c0a45794b74a9c1e7e81c264d9c66d94696312dafa5fd92"]},"offset":"30407257"},"timerHandle.ts":{"size":51,"integrity":{"algorithm":"SHA256","hash":"12ac67016ad81cc99ea53a87372499f07d1e4c6bdc3fd581256d990b83723ac2","blockSize":4194304,"blocks":["12ac67016ad81cc99ea53a87372499f07d1e4c6bdc3fd581256d990b83723ac2"]},"offset":"30408320"}}},"scheduled":{"files":{"scheduleArray.ts":{"size":949,"integrity":{"algorithm":"SHA256","hash":"d6f514fc466f532989bb16970b03ca9f510b1f682f08b1c3cbf300350400c09e","blockSize":4194304,"blocks":["d6f514fc466f532989bb16970b03ca9f510b1f682f08b1c3cbf300350400c09e"]},"offset":"30408371"},"scheduleAsyncIterable.ts":{"size":902,"integrity":{"algorithm":"SHA256","hash":"cc2e915ce422dc12671620a85126bbe14a1deb6c3c7f8d60978fcfff787be4d2","blockSize":4194304,"blocks":["cc2e915ce422dc12671620a85126bbe14a1deb6c3c7f8d60978fcfff787be4d2"]},"offset":"30409320"},"scheduleIterable.ts":{"size":2184,"integrity":{"algorithm":"SHA256","hash":"e6cd7d9d774ee0373a79053eecb30ba2549b80e679736a8cd879654579865f00","blockSize":4194304,"blocks":["e6cd7d9d774ee0373a79053eecb30ba2549b80e679736a8cd879654579865f00"]},"offset":"30410222"},"scheduleObservable.ts":{"size":398,"integrity":{"algorithm":"SHA256","hash":"6ce167bf33598d45ae6e160aa13e49b5d96f977cf5c4f8c19e23f8a28d8c6d60","blockSize":4194304,"blocks":["6ce167bf33598d45ae6e160aa13e49b5d96f977cf5c4f8c19e23f8a28d8c6d60"]},"offset":"30412406"},"schedulePromise.ts":{"size":370,"integrity":{"algorithm":"SHA256","hash":"eae05fce375740d9c9b60bb17737ea55c26e8e92bfe4f43320ee43986d74eff9","blockSize":4194304,"blocks":["eae05fce375740d9c9b60bb17737ea55c26e8e92bfe4f43320ee43986d74eff9"]},"offset":"30412804"},"scheduleReadableStreamLike.ts":{"size":462,"integrity":{"algorithm":"SHA256","hash":"c185c0a847f81ee3f8a14814b8b8b55dd5f006537faaa16d51fea40f273a09df","blockSize":4194304,"blocks":["c185c0a847f81ee3f8a14814b8b8b55dd5f006537faaa16d51fea40f273a09df"]},"offset":"30413174"},"scheduled.ts":{"size":2012,"integrity":{"algorithm":"SHA256","hash":"77876a1667d16915a13faff6a2af5752a921cbb903794c1f6f5df115c5542f86","blockSize":4194304,"blocks":["77876a1667d16915a13faff6a2af5752a921cbb903794c1f6f5df115c5542f86"]},"offset":"30413636"}}},"operators":{"files":{"OperatorSubscriber.ts":{"size":5030,"integrity":{"algorithm":"SHA256","hash":"e2bf85c3c0f115aa9894e78aaccf0d996890fc22c5d09ee36ad8bf998a455e26","blockSize":4194304,"blocks":["e2bf85c3c0f115aa9894e78aaccf0d996890fc22c5d09ee36ad8bf998a455e26"]},"offset":"30415648"},"audit.ts":{"size":3361,"integrity":{"algorithm":"SHA256","hash":"55287c6fbffb9397743f44123211e17f2415f852e88883c34d70f03dd54a3397","blockSize":4194304,"blocks":["55287c6fbffb9397743f44123211e17f2415f852e88883c34d70f03dd54a3397"]},"offset":"30420678"},"auditTime.ts":{"size":2385,"integrity":{"algorithm":"SHA256","hash":"836c55b183cbce31b593ec399169275df784b4810f56024221320c8c945614ad","blockSize":4194304,"blocks":["836c55b183cbce31b593ec399169275df784b4810f56024221320c8c945614ad"]},"offset":"30424039"},"buffer.ts":{"size":2366,"integrity":{"algorithm":"SHA256","hash":"7487e585a80d3bfd86515f6dd2e3cb0a991b1c43a270b2df3bc6d7c08fafa439","blockSize":4194304,"blocks":["7487e585a80d3bfd86515f6dd2e3cb0a991b1c43a270b2df3bc6d7c08fafa439"]},"offset":"30426424"},"bufferCount.ts":{"size":4038,"integrity":{"algorithm":"SHA256","hash":"d387d51eae8e00fbd7000952fae7eed9e04dca546cbba24bb9622418e8f479f9","blockSize":4194304,"blocks":["d387d51eae8e00fbd7000952fae7eed9e04dca546cbba24bb9622418e8f479f9"]},"offset":"30428790"},"bufferTime.ts":{"size":6428,"integrity":{"algorithm":"SHA256","hash":"d4b5610b82d569dc5ffb04285c8493752a3eec24faefc18a3b6b28286e049f13","blockSize":4194304,"blocks":["d4b5610b82d569dc5ffb04285c8493752a3eec24faefc18a3b6b28286e049f13"]},"offset":"30432828"},"bufferToggle.ts":{"size":3534,"integrity":{"algorithm":"SHA256","hash":"d4404921caf1e66b030bebac046524e4c0a05174a0031bbfbfac063f288310e6","blockSize":4194304,"blocks":["d4404921caf1e66b030bebac046524e4c0a05174a0031bbfbfac063f288310e6"]},"offset":"30439256"},"bufferWhen.ts":{"size":3474,"integrity":{"algorithm":"SHA256","hash":"1c3809490d93da088dc03d1386d6b3403e3f0209a6dacfda259684b352ec09d0","blockSize":4194304,"blocks":["1c3809490d93da088dc03d1386d6b3403e3f0209a6dacfda259684b352ec09d0"]},"offset":"30442790"},"catchError.ts":{"size":4584,"integrity":{"algorithm":"SHA256","hash":"7ce3f69596439089a417e5149065e598ffd1d8893e3cd8091c2bfc317a4ce739","blockSize":4194304,"blocks":["7ce3f69596439089a417e5149065e598ffd1d8893e3cd8091c2bfc317a4ce739"]},"offset":"30446264"},"combineAll.ts":{"size":183,"integrity":{"algorithm":"SHA256","hash":"2d004b69dbe7657471788824b4a8844837b2bd0908c23d66a640df5120ce932d","blockSize":4194304,"blocks":["2d004b69dbe7657471788824b4a8844837b2bd0908c23d66a640df5120ce932d"]},"offset":"30450848"},"combineLatest.ts":{"size":1878,"integrity":{"algorithm":"SHA256","hash":"bbe5159c7df49f31e310ea8df145f696795502b56d465de40c0c7a9c41e3b091","blockSize":4194304,"blocks":["bbe5159c7df49f31e310ea8df145f696795502b56d465de40c0c7a9c41e3b091"]},"offset":"30451031"},"combineLatestAll.ts":{"size":2462,"integrity":{"algorithm":"SHA256","hash":"01714ee54394dffb1403f05c2729b7f5d7c9ab3b6703f341f709deffe1898500","blockSize":4194304,"blocks":["01714ee54394dffb1403f05c2729b7f5d7c9ab3b6703f341f709deffe1898500"]},"offset":"30452909"},"combineLatestWith.ts":{"size":1855,"integrity":{"algorithm":"SHA256","hash":"6304fcf68f2a224ae84e1c4e26ff29e7e42eefd9ba1240cf780b957d3c025072","blockSize":4194304,"blocks":["6304fcf68f2a224ae84e1c4e26ff29e7e42eefd9ba1240cf780b957d3c025072"]},"offset":"30455371"},"concat.ts":{"size":1023,"integrity":{"algorithm":"SHA256","hash":"415b467a74defb8803650dc31e6c9438539a147ef0a442acddf92aac72fdc226","blockSize":4194304,"blocks":["415b467a74defb8803650dc31e6c9438539a147ef0a442acddf92aac72fdc226"]},"offset":"30457226"},"concatAll.ts":{"size":2167,"integrity":{"algorithm":"SHA256","hash":"a1819c493282f229507fd7b1b831c97447edabd5f09dc914b357253be12486b7","blockSize":4194304,"blocks":["a1819c493282f229507fd7b1b831c97447edabd5f09dc914b357253be12486b7"]},"offset":"30458249"},"concatMap.ts":{"size":3694,"integrity":{"algorithm":"SHA256","hash":"b00aadc17837eedef300523c5901f3938486870d07e97a96d45f1e748c7d365e","blockSize":4194304,"blocks":["b00aadc17837eedef300523c5901f3938486870d07e97a96d45f1e748c7d365e"]},"offset":"30460416"},"concatMapTo.ts":{"size":3599,"integrity":{"algorithm":"SHA256","hash":"631214146b33fa6d8960fa5fd1ce96d24e5f5f0333377d626bfdfb7f09e3bb6d","blockSize":4194304,"blocks":["631214146b33fa6d8960fa5fd1ce96d24e5f5f0333377d626bfdfb7f09e3bb6d"]},"offset":"30464110"},"concatWith.ts":{"size":1432,"integrity":{"algorithm":"SHA256","hash":"dc82b7872307af9211b73b28e0625dadefbac775522b2ae1bb35e6dcb40da0a4","blockSize":4194304,"blocks":["dc82b7872307af9211b73b28e0625dadefbac775522b2ae1bb35e6dcb40da0a4"]},"offset":"30467709"},"connect.ts":{"size":4014,"integrity":{"algorithm":"SHA256","hash":"928a7a3decd553cc7f4440f051a6abbc1de8aa2ef0df6847b2023121d2d8c158","blockSize":4194304,"blocks":["928a7a3decd553cc7f4440f051a6abbc1de8aa2ef0df6847b2023121d2d8c158"]},"offset":"30469141"},"count.ts":{"size":2299,"integrity":{"algorithm":"SHA256","hash":"7b40725706c5a19070fd9c9466fa74b81ce5845a8c1275d680bba70b733dae27","blockSize":4194304,"blocks":["7b40725706c5a19070fd9c9466fa74b81ce5845a8c1275d680bba70b733dae27"]},"offset":"30473155"},"debounce.ts":{"size":4913,"integrity":{"algorithm":"SHA256","hash":"6e1878f8a054497aab2bdf274f08375550808d874cf018a543e9593e8d0b2850","blockSize":4194304,"blocks":["6e1878f8a054497aab2bdf274f08375550808d874cf018a543e9593e8d0b2850"]},"offset":"30475454"},"debounceTime.ts":{"size":4703,"integrity":{"algorithm":"SHA256","hash":"67067be8ed3ba3a8980f407ce5366c4a4d60d55360306b4b33cb65e86ad6c7c7","blockSize":4194304,"blocks":["67067be8ed3ba3a8980f407ce5366c4a4d60d55360306b4b33cb65e86ad6c7c7"]},"offset":"30480367"},"defaultIfEmpty.ts":{"size":1866,"integrity":{"algorithm":"SHA256","hash":"0eecbadaa58c96f6dd74491b813bb02041cf4d2761770f04557d5346525e4329","blockSize":4194304,"blocks":["0eecbadaa58c96f6dd74491b813bb02041cf4d2761770f04557d5346525e4329"]},"offset":"30485070"},"delay.ts":{"size":2333,"integrity":{"algorithm":"SHA256","hash":"a0fbbf70a3153d92297590460edeccef0a371ffd45c1f5b864e28aa93a2af014","blockSize":4194304,"blocks":["a0fbbf70a3153d92297590460edeccef0a371ffd45c1f5b864e28aa93a2af014"]},"offset":"30486936"},"delayWhen.ts":{"size":3710,"integrity":{"algorithm":"SHA256","hash":"967bbad348f81bb05e67c246b29be817fc2c8054c98a4a33988f74267bf673a9","blockSize":4194304,"blocks":["967bbad348f81bb05e67c246b29be817fc2c8054c98a4a33988f74267bf673a9"]},"offset":"30489269"},"dematerialize.ts":{"size":2250,"integrity":{"algorithm":"SHA256","hash":"97421be148875965b33e4d26b797d68f9d772168b3fab6ca2021fb3be8e95b65","blockSize":4194304,"blocks":["97421be148875965b33e4d26b797d68f9d772168b3fab6ca2021fb3be8e95b65"]},"offset":"30492979"},"distinct.ts":{"size":2949,"integrity":{"algorithm":"SHA256","hash":"6361c2c11d665d70cc884d1039d3465b24d1060e22cbfcf6e4facb8139c8db43","blockSize":4194304,"blocks":["6361c2c11d665d70cc884d1039d3465b24d1060e22cbfcf6e4facb8139c8db43"]},"offset":"30495229"},"distinctUntilChanged.ts":{"size":6912,"integrity":{"algorithm":"SHA256","hash":"540aaccc5cb69b3a84972a70b87de50ed7b4fe96424306f9c773a30ac7a5bfcb","blockSize":4194304,"blocks":["540aaccc5cb69b3a84972a70b87de50ed7b4fe96424306f9c773a30ac7a5bfcb"]},"offset":"30498178"},"distinctUntilKeyChanged.ts":{"size":2530,"integrity":{"algorithm":"SHA256","hash":"4f635697ca64da7f591268ce3d0e7a0444c996a6a57244c8d76386fd92e4afa2","blockSize":4194304,"blocks":["4f635697ca64da7f591268ce3d0e7a0444c996a6a57244c8d76386fd92e4afa2"]},"offset":"30505090"},"elementAt.ts":{"size":2467,"integrity":{"algorithm":"SHA256","hash":"0d02e2ebdae9d5b8e44a4b6a9ec07e0bc17829ba13e2e67faedf1e74641df073","blockSize":4194304,"blocks":["0d02e2ebdae9d5b8e44a4b6a9ec07e0bc17829ba13e2e67faedf1e74641df073"]},"offset":"30507620"},"endWith.ts":{"size":2568,"integrity":{"algorithm":"SHA256","hash":"655f6b4c065dc606cb8f4881617140b55e9e933c606ce07f3a154388f2122fc3","blockSize":4194304,"blocks":["655f6b4c065dc606cb8f4881617140b55e9e933c606ce07f3a154388f2122fc3"]},"offset":"30510087"},"every.ts":{"size":2471,"integrity":{"algorithm":"SHA256","hash":"7a97753e53db2f7d0cf86ec70ff90fa52fa74aa7f83479656478f834acc4ecbe","blockSize":4194304,"blocks":["7a97753e53db2f7d0cf86ec70ff90fa52fa74aa7f83479656478f834acc4ecbe"]},"offset":"30512655"},"exhaust.ts":{"size":156,"integrity":{"algorithm":"SHA256","hash":"b72d5bcc0cf0b3186e023cd6707c5884257881d6d04cfd1b955532192261f486","blockSize":4194304,"blocks":["b72d5bcc0cf0b3186e023cd6707c5884257881d6d04cfd1b955532192261f486"]},"offset":"30515126"},"exhaustAll.ts":{"size":1983,"integrity":{"algorithm":"SHA256","hash":"74de55bec732adf4e69a905e059db7ffdc7330e92e28e845c5d17d6fed6cf36e","blockSize":4194304,"blocks":["74de55bec732adf4e69a905e059db7ffdc7330e92e28e845c5d17d6fed6cf36e"]},"offset":"30515282"},"exhaustMap.ts":{"size":4196,"integrity":{"algorithm":"SHA256","hash":"74c8652aff93efc60a53aa2d85d137839a06f9481f93e696ecfee4578e12054e","blockSize":4194304,"blocks":["74c8652aff93efc60a53aa2d85d137839a06f9481f93e696ecfee4578e12054e"]},"offset":"30517265"},"expand.ts":{"size":3672,"integrity":{"algorithm":"SHA256","hash":"1d677b08f83755ac43939a647f5634316b304cf7c348a46affc067a8c2bf5eb8","blockSize":4194304,"blocks":["1d677b08f83755ac43939a647f5634316b304cf7c348a46affc067a8c2bf5eb8"]},"offset":"30521461"},"filter.ts":{"size":3533,"integrity":{"algorithm":"SHA256","hash":"40d681723430d568fe98ecc51960c0fec1dc4acd2c377fce39a61571ae9528be","blockSize":4194304,"blocks":["40d681723430d568fe98ecc51960c0fec1dc4acd2c377fce39a61571ae9528be"]},"offset":"30525133"},"finalize.ts":{"size":2217,"integrity":{"algorithm":"SHA256","hash":"382600daaf5a496f5d8cfacd6c6f1babe5dd84002262c03e86635a78becdc05f","blockSize":4194304,"blocks":["382600daaf5a496f5d8cfacd6c6f1babe5dd84002262c03e86635a78becdc05f"]},"offset":"30528666"},"find.ts":{"size":3637,"integrity":{"algorithm":"SHA256","hash":"0fd70588fd78aadfa797dccf50a66af921ee4075b0b51963a689af00f646c9e8","blockSize":4194304,"blocks":["0fd70588fd78aadfa797dccf50a66af921ee4075b0b51963a689af00f646c9e8"]},"offset":"30530883"},"findIndex.ts":{"size":2730,"integrity":{"algorithm":"SHA256","hash":"88577437849d5e14d670980a4c881973462a462e8fd3f864254f10a19739dac9","blockSize":4194304,"blocks":["88577437849d5e14d670980a4c881973462a462e8fd3f864254f10a19739dac9"]},"offset":"30534520"},"first.ts":{"size":3620,"integrity":{"algorithm":"SHA256","hash":"d1b3e6718f40b2b8c4d66a7c7b593cfbd3a1313a9c24f83bcff61411cfceb401","blockSize":4194304,"blocks":["d1b3e6718f40b2b8c4d66a7c7b593cfbd3a1313a9c24f83bcff61411cfceb401"]},"offset":"30537250"},"flatMap.ts":{"size":148,"integrity":{"algorithm":"SHA256","hash":"39aac5735f5439d56ee7e3030aaa11e532d7247c17daec951c4fa399a9394c75","blockSize":4194304,"blocks":["39aac5735f5439d56ee7e3030aaa11e532d7247c17daec951c4fa399a9394c75"]},"offset":"30540870"},"groupBy.ts":{"size":11273,"integrity":{"algorithm":"SHA256","hash":"d966282875f07d37eba681f4347c1c7965208e436f7bf74c757ef874031f1519","blockSize":4194304,"blocks":["d966282875f07d37eba681f4347c1c7965208e436f7bf74c757ef874031f1519"]},"offset":"30541018"},"ignoreElements.ts":{"size":1564,"integrity":{"algorithm":"SHA256","hash":"8a24ba1e9592defb030a4deb765af5f3a26e727e09e8f553a9d9514b39e3a114","blockSize":4194304,"blocks":["8a24ba1e9592defb030a4deb765af5f3a26e727e09e8f553a9d9514b39e3a114"]},"offset":"30552291"},"isEmpty.ts":{"size":2167,"integrity":{"algorithm":"SHA256","hash":"683e52c6a88c52d61303a6c7c4328f85897aa2fac846cb668453fa701f6a71ba","blockSize":4194304,"blocks":["683e52c6a88c52d61303a6c7c4328f85897aa2fac846cb668453fa701f6a71ba"]},"offset":"30553855"},"joinAllInternals.ts":{"size":1360,"integrity":{"algorithm":"SHA256","hash":"e705724372444027065b999fc65573e5136413d222ace47ac918f8098355e13d","blockSize":4194304,"blocks":["e705724372444027065b999fc65573e5136413d222ace47ac918f8098355e13d"]},"offset":"30556022"},"last.ts":{"size":3546,"integrity":{"algorithm":"SHA256","hash":"b01305492207fc3f86f8ff3388e5335c6bbff5a79981af9ba6323e2841e8bfc7","blockSize":4194304,"blocks":["b01305492207fc3f86f8ff3388e5335c6bbff5a79981af9ba6323e2841e8bfc7"]},"offset":"30557382"},"map.ts":{"size":2589,"integrity":{"algorithm":"SHA256","hash":"041748dd15014e888419f51fbf6d51e59c1ab9d748c148442f0c39e49ff4b1d8","blockSize":4194304,"blocks":["041748dd15014e888419f51fbf6d51e59c1ab9d748c148442f0c39e49ff4b1d8"]},"offset":"30560928"},"mapTo.ts":{"size":1672,"integrity":{"algorithm":"SHA256","hash":"4aa614033a02426c72e4ff7090a828902e7c3b69edf69791b0d2c55acb99b5fa","blockSize":4194304,"blocks":["4aa614033a02426c72e4ff7090a828902e7c3b69edf69791b0d2c55acb99b5fa"]},"offset":"30563517"},"materialize.ts":{"size":2720,"integrity":{"algorithm":"SHA256","hash":"098feb402bebaf78eef625141880e8a0f2de74682978eaaffc227be3bb8827f5","blockSize":4194304,"blocks":["098feb402bebaf78eef625141880e8a0f2de74682978eaaffc227be3bb8827f5"]},"offset":"30565189"},"max.ts":{"size":1407,"integrity":{"algorithm":"SHA256","hash":"7509a4d8af160e39ad10743dcd178ff0a48749cd537f73c0a4a83665b7e4660a","blockSize":4194304,"blocks":["7509a4d8af160e39ad10743dcd178ff0a48749cd537f73c0a4a83665b7e4660a"]},"offset":"30567909"},"merge.ts":{"size":1640,"integrity":{"algorithm":"SHA256","hash":"132cc70becaabf1a9cc04f94428bbba946ffd8efb2fbaf18b1c9392cebacb634","blockSize":4194304,"blocks":["132cc70becaabf1a9cc04f94428bbba946ffd8efb2fbaf18b1c9392cebacb634"]},"offset":"30569316"},"mergeAll.ts":{"size":2418,"integrity":{"algorithm":"SHA256","hash":"6773e0d21e369440bfe511db0c508b93d5ab42e748150783027867dabb9f6876","blockSize":4194304,"blocks":["6773e0d21e369440bfe511db0c508b93d5ab42e748150783027867dabb9f6876"]},"offset":"30570956"},"mergeInternals.ts":{"size":6075,"integrity":{"algorithm":"SHA256","hash":"326bc00537e70208b44a0e40e7c559ed7be9bf6107203073ccc6a452a977bc12","blockSize":4194304,"blocks":["326bc00537e70208b44a0e40e7c559ed7be9bf6107203073ccc6a452a977bc12"]},"offset":"30573374"},"mergeMap.ts":{"size":3829,"integrity":{"algorithm":"SHA256","hash":"1816de09e9674fb42eb5e34858f4a31daa9dbb15c4ddc8e9d9fb1fe0eea84771","blockSize":4194304,"blocks":["1816de09e9674fb42eb5e34858f4a31daa9dbb15c4ddc8e9d9fb1fe0eea84771"]},"offset":"30579449"},"mergeMapTo.ts":{"size":2816,"integrity":{"algorithm":"SHA256","hash":"e9177ffa5bca3629d0bf4edfc27ae77e571daed00b7ed52deb319640cb87b10f","blockSize":4194304,"blocks":["e9177ffa5bca3629d0bf4edfc27ae77e571daed00b7ed52deb319640cb87b10f"]},"offset":"30583278"},"mergeScan.ts":{"size":3296,"integrity":{"algorithm":"SHA256","hash":"84d37e845a5d4451f473d2efc9661bf7c07743aa2fee96e5dcb5a66f47b91231","blockSize":4194304,"blocks":["84d37e845a5d4451f473d2efc9661bf7c07743aa2fee96e5dcb5a66f47b91231"]},"offset":"30586094"},"mergeWith.ts":{"size":1565,"integrity":{"algorithm":"SHA256","hash":"4bd7523bebf8fa934cf718f86acf7a0fa91e25c672f313a87bef71b797643ddf","blockSize":4194304,"blocks":["4bd7523bebf8fa934cf718f86acf7a0fa91e25c672f313a87bef71b797643ddf"]},"offset":"30589390"},"min.ts":{"size":1408,"integrity":{"algorithm":"SHA256","hash":"aebcfffdb867e518c7f66d5d8a76297cabb79b9ccd75f832cfacfd20621e5ce4","blockSize":4194304,"blocks":["aebcfffdb867e518c7f66d5d8a76297cabb79b9ccd75f832cfacfd20621e5ce4"]},"offset":"30590955"},"multicast.ts":{"size":5017,"integrity":{"algorithm":"SHA256","hash":"546e9f59b1918662c8599cf8d135670908919676a0f4b8e7c69b1fc499158f06","blockSize":4194304,"blocks":["546e9f59b1918662c8599cf8d135670908919676a0f4b8e7c69b1fc499158f06"]},"offset":"30592363"},"observeOn.ts":{"size":3867,"integrity":{"algorithm":"SHA256","hash":"87c946b8958b4435e94e735db842517208652369dda42f2be0a02d6220eb4d56","blockSize":4194304,"blocks":["87c946b8958b4435e94e735db842517208652369dda42f2be0a02d6220eb4d56"]},"offset":"30597380"},"onErrorResumeNext.ts":{"size":5133,"integrity":{"algorithm":"SHA256","hash":"c7e7b9f178693dc1831ef2b9738c63f18f81399cff92d68790572712f23b5cc0","blockSize":4194304,"blocks":["c7e7b9f178693dc1831ef2b9738c63f18f81399cff92d68790572712f23b5cc0"]},"offset":"30601247"},"pairwise.ts":{"size":1923,"integrity":{"algorithm":"SHA256","hash":"941bdf9fca46d44fe9babdc906375c3b164d2e4e3591698cf19df5882cd63a14","blockSize":4194304,"blocks":["941bdf9fca46d44fe9babdc906375c3b164d2e4e3591698cf19df5882cd63a14"]},"offset":"30606380"},"partition.ts":{"size":2823,"integrity":{"algorithm":"SHA256","hash":"9ce9898589eb83a59f1834ce83db93e58813b47935a1a3bf35de558299119eac","blockSize":4194304,"blocks":["9ce9898589eb83a59f1834ce83db93e58813b47935a1a3bf35de558299119eac"]},"offset":"30608303"},"pluck.ts":{"size":4379,"integrity":{"algorithm":"SHA256","hash":"09913d9205fe3156e28891fa41b2ce793417a9698142b06ad76f8d43449fc9c0","blockSize":4194304,"blocks":["09913d9205fe3156e28891fa41b2ce793417a9698142b06ad76f8d43449fc9c0"]},"offset":"30611126"},"publish.ts":{"size":4097,"integrity":{"algorithm":"SHA256","hash":"d0e3d0c88fa7a8203403fa228fe04e5a6c7c9d1658e899e5d6d9e9778371c0ae","blockSize":4194304,"blocks":["d0e3d0c88fa7a8203403fa228fe04e5a6c7c9d1658e899e5d6d9e9778371c0ae"]},"offset":"30615505"},"publishBehavior.ts":{"size":1486,"integrity":{"algorithm":"SHA256","hash":"36a6003c2d5d456c8557343fa27cd8f5a38ee3bb1a2f82f8ce89de05c613fe70","blockSize":4194304,"blocks":["36a6003c2d5d456c8557343fa27cd8f5a38ee3bb1a2f82f8ce89de05c613fe70"]},"offset":"30619602"},"publishLast.ts":{"size":2954,"integrity":{"algorithm":"SHA256","hash":"b6a58d41529666d351099e82f426a0ccb01c748d1bdfe1c37d5711c10c3317d3","blockSize":4194304,"blocks":["b6a58d41529666d351099e82f426a0ccb01c748d1bdfe1c37d5711c10c3317d3"]},"offset":"30621088"},"publishReplay.ts":{"size":5326,"integrity":{"algorithm":"SHA256","hash":"becb0322432252955f52dfcbb61d3f34a96eef759686e451b76146607938aaaa","blockSize":4194304,"blocks":["becb0322432252955f52dfcbb61d3f34a96eef759686e451b76146607938aaaa"]},"offset":"30624042"},"race.ts":{"size":1151,"integrity":{"algorithm":"SHA256","hash":"a06d84b69d9d3cbd8f630c06789b5cb1f7ca8d5108c6ac54b73959c0166edee6","blockSize":4194304,"blocks":["a06d84b69d9d3cbd8f630c06789b5cb1f7ca8d5108c6ac54b73959c0166edee6"]},"offset":"30629368"},"raceWith.ts":{"size":1349,"integrity":{"algorithm":"SHA256","hash":"7bbaaac2d0ea7dcd18d271f274f4e2b39e6a84400ce59e6e89857d4ea33a041f","blockSize":4194304,"blocks":["7bbaaac2d0ea7dcd18d271f274f4e2b39e6a84400ce59e6e89857d4ea33a041f"]},"offset":"30630519"},"reduce.ts":{"size":2837,"integrity":{"algorithm":"SHA256","hash":"584d0edbf3c54d55e255fcbe2c70512e72e09efb475aa18cc5a25ea229d88b6e","blockSize":4194304,"blocks":["584d0edbf3c54d55e255fcbe2c70512e72e09efb475aa18cc5a25ea229d88b6e"]},"offset":"30631868"},"refCount.ts":{"size":4654,"integrity":{"algorithm":"SHA256","hash":"ef5731bb32d576ae3cab43835fe4491d2d743a68c13cac0adbefad51a97171f2","blockSize":4194304,"blocks":["ef5731bb32d576ae3cab43835fe4491d2d743a68c13cac0adbefad51a97171f2"]},"offset":"30634705"},"repeat.ts":{"size":5353,"integrity":{"algorithm":"SHA256","hash":"3d9f90953de11524b99cd86034c9b5a6d00a7caf194082d927c18599667acebd","blockSize":4194304,"blocks":["3d9f90953de11524b99cd86034c9b5a6d00a7caf194082d927c18599667acebd"]},"offset":"30639359"},"repeatWhen.ts":{"size":4740,"integrity":{"algorithm":"SHA256","hash":"6beca5ecd6ab612987f9cc0c6a9a38a3b7e45f5e9e19a56ba14f94b845b3d830","blockSize":4194304,"blocks":["6beca5ecd6ab612987f9cc0c6a9a38a3b7e45f5e9e19a56ba14f94b845b3d830"]},"offset":"30644712"},"retry.ts":{"size":6534,"integrity":{"algorithm":"SHA256","hash":"aca331232b6a7f07b4dc0f4fb232df5a624d3b8cc2bbc9007b1665c34d4ab332","blockSize":4194304,"blocks":["aca331232b6a7f07b4dc0f4fb232df5a624d3b8cc2bbc9007b1665c34d4ab332"]},"offset":"30649452"},"retryWhen.ts":{"size":3840,"integrity":{"algorithm":"SHA256","hash":"b26e4f8c0ba73139e2ba4f148383316eda0b16f255831fd29a23f6dab43df378","blockSize":4194304,"blocks":["b26e4f8c0ba73139e2ba4f148383316eda0b16f255831fd29a23f6dab43df378"]},"offset":"30655986"},"sample.ts":{"size":2225,"integrity":{"algorithm":"SHA256","hash":"819b3e7105084661984298de18bcebc44f16f57e68f96c4e11f015b6be63fe0c","blockSize":4194304,"blocks":["819b3e7105084661984298de18bcebc44f16f57e68f96c4e11f015b6be63fe0c"]},"offset":"30659826"},"sampleTime.ts":{"size":1937,"integrity":{"algorithm":"SHA256","hash":"4d7eaf02479dad23c4e37a97c7edd4a8d73cc4cba56d62b879140bf36cff0fa0","blockSize":4194304,"blocks":["4d7eaf02479dad23c4e37a97c7edd4a8d73cc4cba56d62b879140bf36cff0fa0"]},"offset":"30662051"},"scan.ts":{"size":4143,"integrity":{"algorithm":"SHA256","hash":"b5ae3eee8116a8fa4b6a2ec0fb407e22c27fe57fb3efc56731c18b37638497e2","blockSize":4194304,"blocks":["b5ae3eee8116a8fa4b6a2ec0fb407e22c27fe57fb3efc56731c18b37638497e2"]},"offset":"30663988"},"scanInternals.ts":{"size":2263,"integrity":{"algorithm":"SHA256","hash":"1eb13cc05b02e76560177ada11b3a23dda4d4cec418bbc8ca0441c6a80e34b0a","blockSize":4194304,"blocks":["1eb13cc05b02e76560177ada11b3a23dda4d4cec418bbc8ca0441c6a80e34b0a"]},"offset":"30668131"},"sequenceEqual.ts":{"size":5436,"integrity":{"algorithm":"SHA256","hash":"a4d9145af6e7ae8840a14a9d155d23b1e605739d60673f76bf629ab9c54d05f3","blockSize":4194304,"blocks":["a4d9145af6e7ae8840a14a9d155d23b1e605739d60673f76bf629ab9c54d05f3"]},"offset":"30670394"},"share.ts":{"size":11260,"integrity":{"algorithm":"SHA256","hash":"4df4d03ef48234ed02eaf3e4fd906cbe5e0585f6aeb696feb5f436c86c6359c0","blockSize":4194304,"blocks":["4df4d03ef48234ed02eaf3e4fd906cbe5e0585f6aeb696feb5f436c86c6359c0"]},"offset":"30675830"},"shareReplay.ts":{"size":6120,"integrity":{"algorithm":"SHA256","hash":"3edd41222ae5c4ee2a55b148bad8ab2f873312035f7fa4f5da2b921b7db6c45e","blockSize":4194304,"blocks":["3edd41222ae5c4ee2a55b148bad8ab2f873312035f7fa4f5da2b921b7db6c45e"]},"offset":"30687090"},"single.ts":{"size":3839,"integrity":{"algorithm":"SHA256","hash":"e4964dc402d8779ee9ea02f93a78db909cc469ca7a851adf981b5490ada6a27e","blockSize":4194304,"blocks":["e4964dc402d8779ee9ea02f93a78db909cc469ca7a851adf981b5490ada6a27e"]},"offset":"30693210"},"skip.ts":{"size":1220,"integrity":{"algorithm":"SHA256","hash":"07e90b1e43ee21b09c6194ee4e07eaba8f8ece0cee8743a8cb8f19be7e9d231a","blockSize":4194304,"blocks":["07e90b1e43ee21b09c6194ee4e07eaba8f8ece0cee8743a8cb8f19be7e9d231a"]},"offset":"30697049"},"skipLast.ts":{"size":3839,"integrity":{"algorithm":"SHA256","hash":"932aef5c912f6b5006f95575c50487f132a26cb4aa006926cb55dfbb32760b6f","blockSize":4194304,"blocks":["932aef5c912f6b5006f95575c50487f132a26cb4aa006926cb55dfbb32760b6f"]},"offset":"30698269"},"skipUntil.ts":{"size":2692,"integrity":{"algorithm":"SHA256","hash":"f90599e0d10a295b95653e5f2fdfdb0ef839e64365975848f823ea06e4706f59","blockSize":4194304,"blocks":["f90599e0d10a295b95653e5f2fdfdb0ef839e64365975848f823ea06e4706f59"]},"offset":"30702108"},"skipWhile.ts":{"size":2410,"integrity":{"algorithm":"SHA256","hash":"8cec19f2c1d854cb9e41fffe4d3c002e2caf6eb9626eecbce75becdefd5d15fd","blockSize":4194304,"blocks":["8cec19f2c1d854cb9e41fffe4d3c002e2caf6eb9626eecbce75becdefd5d15fd"]},"offset":"30704800"},"startWith.ts":{"size":2669,"integrity":{"algorithm":"SHA256","hash":"342d9767c5499494bf7000ca46ada77ed0e5d9b21508d60b6412ca641e57e162","blockSize":4194304,"blocks":["342d9767c5499494bf7000ca46ada77ed0e5d9b21508d60b6412ca641e57e162"]},"offset":"30707210"},"subscribeOn.ts":{"size":2053,"integrity":{"algorithm":"SHA256","hash":"6bb4dd8fa6c9fd63d215f3f6ed036e2e8f7818fa0b6a4872ea9802bfcfdbecbe","blockSize":4194304,"blocks":["6bb4dd8fa6c9fd63d215f3f6ed036e2e8f7818fa0b6a4872ea9802bfcfdbecbe"]},"offset":"30709879"},"switchAll.ts":{"size":2123,"integrity":{"algorithm":"SHA256","hash":"2779195f18ce53c3eb6a1cc83503e9e6d6b93399d9b4b3adfbdf23deb4192913","blockSize":4194304,"blocks":["2779195f18ce53c3eb6a1cc83503e9e6d6b93399d9b4b3adfbdf23deb4192913"]},"offset":"30711932"},"switchMap.ts":{"size":5452,"integrity":{"algorithm":"SHA256","hash":"adcd680b30c82404a70e3f7839bd44765f1de9d8fd82058de06bd5c20cc359f3","blockSize":4194304,"blocks":["adcd680b30c82404a70e3f7839bd44765f1de9d8fd82058de06bd5c20cc359f3"]},"offset":"30714055"},"switchMapTo.ts":{"size":3035,"integrity":{"algorithm":"SHA256","hash":"7eea768480fe8348e193e8ac772bb0b5f5b8140aad77449d946be4d8d6c2d1ba","blockSize":4194304,"blocks":["7eea768480fe8348e193e8ac772bb0b5f5b8140aad77449d946be4d8d6c2d1ba"]},"offset":"30719507"},"switchScan.ts":{"size":1934,"integrity":{"algorithm":"SHA256","hash":"fc38dbab24e5df714602795f4ece82b9d6646c4510dd2e285fb2c7cdae0fea9b","blockSize":4194304,"blocks":["fc38dbab24e5df714602795f4ece82b9d6646c4510dd2e285fb2c7cdae0fea9b"]},"offset":"30722542"},"take.ts":{"size":2284,"integrity":{"algorithm":"SHA256","hash":"f73f87f11b722e41ccf883b60dd96176a247c42d6b5fbf3047f784b0b3339c45","blockSize":4194304,"blocks":["f73f87f11b722e41ccf883b60dd96176a247c42d6b5fbf3047f784b0b3339c45"]},"offset":"30724476"},"takeLast.ts":{"size":3000,"integrity":{"algorithm":"SHA256","hash":"d63b7c6fbb3c9d05d46b8e0250ae811995f50f2d5d37eaa1173f3d389d28339f","blockSize":4194304,"blocks":["d63b7c6fbb3c9d05d46b8e0250ae811995f50f2d5d37eaa1173f3d389d28339f"]},"offset":"30726760"},"takeUntil.ts":{"size":1935,"integrity":{"algorithm":"SHA256","hash":"2afb72907694723afbd02ed4976c05cd0a6bf7a55c4983fd8183dd097d57ef9c","blockSize":4194304,"blocks":["2afb72907694723afbd02ed4976c05cd0a6bf7a55c4983fd8183dd097d57ef9c"]},"offset":"30729760"},"takeWhile.ts":{"size":3126,"integrity":{"algorithm":"SHA256","hash":"27000fe0fef9b1163610b0222fd165b438721d87ee5f3b5a70067dc5fb81549f","blockSize":4194304,"blocks":["27000fe0fef9b1163610b0222fd165b438721d87ee5f3b5a70067dc5fb81549f"]},"offset":"30731695"},"tap.ts":{"size":6186,"integrity":{"algorithm":"SHA256","hash":"427ba53426f181ad1a1c6c50b847f66de06acdbce880256d3eea045884d0be1a","blockSize":4194304,"blocks":["427ba53426f181ad1a1c6c50b847f66de06acdbce880256d3eea045884d0be1a"]},"offset":"30734821"},"throttle.ts":{"size":4276,"integrity":{"algorithm":"SHA256","hash":"e560b99d84a8e0a65eacff630976d42a5dddcaea19898315bca39e5448bc4f30","blockSize":4194304,"blocks":["e560b99d84a8e0a65eacff630976d42a5dddcaea19898315bca39e5448bc4f30"]},"offset":"30741007"},"throttleTime.ts":{"size":2446,"integrity":{"algorithm":"SHA256","hash":"fbb7c044e0f8d8eb1549360a781dc3f2d5bb8a63c2700247f2f6e0850fd59d6c","blockSize":4194304,"blocks":["fbb7c044e0f8d8eb1549360a781dc3f2d5bb8a63c2700247f2f6e0850fd59d6c"]},"offset":"30745283"},"throwIfEmpty.ts":{"size":1775,"integrity":{"algorithm":"SHA256","hash":"1aa0f403c84debbcc2a375bda9dd34d0cd9e0fc8469f74449d0dbf30bea82b51","blockSize":4194304,"blocks":["1aa0f403c84debbcc2a375bda9dd34d0cd9e0fc8469f74449d0dbf30bea82b51"]},"offset":"30747729"},"timeInterval.ts":{"size":2355,"integrity":{"algorithm":"SHA256","hash":"812701f72c4d1f29535a9e3a586a1a4bf5c0bbe0d36a5dce62d66ec665406519","blockSize":4194304,"blocks":["812701f72c4d1f29535a9e3a586a1a4bf5c0bbe0d36a5dce62d66ec665406519"]},"offset":"30749504"},"timeout.ts":{"size":16001,"integrity":{"algorithm":"SHA256","hash":"56572b6ba9fa47a8a1d173608dff8724ad9d4e133390a8a0d84349483f3042d3","blockSize":4194304,"blocks":["56572b6ba9fa47a8a1d173608dff8724ad9d4e133390a8a0d84349483f3042d3"]},"offset":"30751859"},"timeoutWith.ts":{"size":4633,"integrity":{"algorithm":"SHA256","hash":"b7113ebbc5bf65fbecf8e840d0dfc66da1b54b0ce75d03e3d75be185de167d8b","blockSize":4194304,"blocks":["b7113ebbc5bf65fbecf8e840d0dfc66da1b54b0ce75d03e3d75be185de167d8b"]},"offset":"30767860"},"timestamp.ts":{"size":1631,"integrity":{"algorithm":"SHA256","hash":"e1ba249e6adc274fd6dc72a741f7b57f01f71c708786fb8a1d27ac42f8fb1bcb","blockSize":4194304,"blocks":["e1ba249e6adc274fd6dc72a741f7b57f01f71c708786fb8a1d27ac42f8fb1bcb"]},"offset":"30772493"},"toArray.ts":{"size":1378,"integrity":{"algorithm":"SHA256","hash":"8bbbd89641a1015644d048666453301743676855898dcb219b0486d26f666824","blockSize":4194304,"blocks":["8bbbd89641a1015644d048666453301743676855898dcb219b0486d26f666824"]},"offset":"30774124"},"window.ts":{"size":3053,"integrity":{"algorithm":"SHA256","hash":"50b8c504c63d47768c992438e628db91ba00d9dac4dc85f7148335d6afffbf10","blockSize":4194304,"blocks":["50b8c504c63d47768c992438e628db91ba00d9dac4dc85f7148335d6afffbf10"]},"offset":"30775502"},"windowCount.ts":{"size":4731,"integrity":{"algorithm":"SHA256","hash":"80205755d05d780e8fb32864a8f0343ebf2953f6ff46f5dcc793cd790aba2ffe","blockSize":4194304,"blocks":["80205755d05d780e8fb32864a8f0343ebf2953f6ff46f5dcc793cd790aba2ffe"]},"offset":"30778555"},"windowTime.ts":{"size":7854,"integrity":{"algorithm":"SHA256","hash":"2d70620a344132d3387bb4ad9b773848b3b3f7a508ee6ff35590ace5d078a1c7","blockSize":4194304,"blocks":["2d70620a344132d3387bb4ad9b773848b3b3f7a508ee6ff35590ace5d078a1c7"]},"offset":"30783286"},"windowToggle.ts":{"size":4484,"integrity":{"algorithm":"SHA256","hash":"d5f67f489f911eed35c386d8628684e99ca7ea0b5280196194a93b8d7b112efd","blockSize":4194304,"blocks":["d5f67f489f911eed35c386d8628684e99ca7ea0b5280196194a93b8d7b112efd"]},"offset":"30791140"},"windowWhen.ts":{"size":4275,"integrity":{"algorithm":"SHA256","hash":"9789845614a2b7e88400e2b58c85e808dfa5b2500c58dc83877892e863645b0d","blockSize":4194304,"blocks":["9789845614a2b7e88400e2b58c85e808dfa5b2500c58dc83877892e863645b0d"]},"offset":"30795624"},"withLatestFrom.ts":{"size":4826,"integrity":{"algorithm":"SHA256","hash":"750da62f3593815a73e130147cc2728ec2931a280b27d474fceb2a86fc296e28","blockSize":4194304,"blocks":["750da62f3593815a73e130147cc2728ec2931a280b27d474fceb2a86fc296e28"]},"offset":"30799899"},"zip.ts":{"size":1461,"integrity":{"algorithm":"SHA256","hash":"b495ea5972acd04b09bfdf18a4c1bc0bfa1a87953e93a7c68fa9e2d7dbd49cd5","blockSize":4194304,"blocks":["b495ea5972acd04b09bfdf18a4c1bc0bfa1a87953e93a7c68fa9e2d7dbd49cd5"]},"offset":"30804725"},"zipAll.ts":{"size":828,"integrity":{"algorithm":"SHA256","hash":"24e235879246250a5728e91e65b650ca417e67362f22d021c39c244534d33823","blockSize":4194304,"blocks":["24e235879246250a5728e91e65b650ca417e67362f22d021c39c244534d33823"]},"offset":"30806186"},"zipWith.ts":{"size":1575,"integrity":{"algorithm":"SHA256","hash":"715f97dbf80650fc0cfb8fe6143c9f3bf713ceb64255450955f7b167b6ab97c1","blockSize":4194304,"blocks":["715f97dbf80650fc0cfb8fe6143c9f3bf713ceb64255450955f7b167b6ab97c1"]},"offset":"30807014"}}},"observable":{"files":{"ConnectableObservable.ts":{"size":3588,"integrity":{"algorithm":"SHA256","hash":"adb02943a75233ff3616ced8c2f1ad8bba327c727a3cb6280e791709768ada1c","blockSize":4194304,"blocks":["adb02943a75233ff3616ced8c2f1ad8bba327c727a3cb6280e791709768ada1c"]},"offset":"30808589"},"bindCallback.ts":{"size":6750,"integrity":{"algorithm":"SHA256","hash":"05ec70674969f08c33194cd01821a93adbe012dfd1e8f8e06c3aec28bcc634f0","blockSize":4194304,"blocks":["05ec70674969f08c33194cd01821a93adbe012dfd1e8f8e06c3aec28bcc634f0"]},"offset":"30812177"},"bindCallbackInternals.ts":{"size":4940,"integrity":{"algorithm":"SHA256","hash":"4f973a999b07bbadfb1de27ec4115695b297e123c1f37d5ce27c2211d07dd4c7","blockSize":4194304,"blocks":["4f973a999b07bbadfb1de27ec4115695b297e123c1f37d5ce27c2211d07dd4c7"]},"offset":"30818927"},"bindNodeCallback.ts":{"size":5988,"integrity":{"algorithm":"SHA256","hash":"c294d8635f9aaf72f2586aa70c5e07c4a4319ca01155170628b04c9e8845f4e4","blockSize":4194304,"blocks":["c294d8635f9aaf72f2586aa70c5e07c4a4319ca01155170628b04c9e8845f4e4"]},"offset":"30823867"},"combineLatest.ts":{"size":13410,"integrity":{"algorithm":"SHA256","hash":"d15ad88bd4e5424cd6d2bb2d0a3b4e3fcf0e3f6845cde7e54801e722a3fce65b","blockSize":4194304,"blocks":["d15ad88bd4e5424cd6d2bb2d0a3b4e3fcf0e3f6845cde7e54801e722a3fce65b"]},"offset":"30829855"},"concat.ts":{"size":4529,"integrity":{"algorithm":"SHA256","hash":"dd108ee72c0f22dca4f2a7478e1057220119618e882e24776dc6f1b69f2b465e","blockSize":4194304,"blocks":["dd108ee72c0f22dca4f2a7478e1057220119618e882e24776dc6f1b69f2b465e"]},"offset":"30843265"},"connectable.ts":{"size":2339,"integrity":{"algorithm":"SHA256","hash":"0cc2a155ec81983527d5a071f505f5d5c2f5f0a8df626807a3845aca177437a8","blockSize":4194304,"blocks":["0cc2a155ec81983527d5a071f505f5d5c2f5f0a8df626807a3845aca177437a8"]},"offset":"30847794"},"defer.ts":{"size":2312,"integrity":{"algorithm":"SHA256","hash":"aa01e75d2d9f889253e5eb748eeeedd8a9f641bdb17ab43fc198ec18977f7630","blockSize":4194304,"blocks":["aa01e75d2d9f889253e5eb748eeeedd8a9f641bdb17ab43fc198ec18977f7630"]},"offset":"30850133"},"empty.ts":{"size":2227,"integrity":{"algorithm":"SHA256","hash":"fb22097915375c1473850afbc23b9cdc46fc2df2e1bf3f26f6414d930f128d2d","blockSize":4194304,"blocks":["fb22097915375c1473850afbc23b9cdc46fc2df2e1bf3f26f6414d930f128d2d"]},"offset":"30852445"},"forkJoin.ts":{"size":8214,"integrity":{"algorithm":"SHA256","hash":"b726c8b18c19eff91977217a14ebf54eaeebf7c9189868c0c3ab8ecfa73edfed","blockSize":4194304,"blocks":["b726c8b18c19eff91977217a14ebf54eaeebf7c9189868c0c3ab8ecfa73edfed"]},"offset":"30854672"},"from.ts":{"size":3010,"integrity":{"algorithm":"SHA256","hash":"f36ecf36fcd6f54558ebe20ccdbbc9b40b7911c3047d46c9aeb9e660430ba3ad","blockSize":4194304,"blocks":["f36ecf36fcd6f54558ebe20ccdbbc9b40b7911c3047d46c9aeb9e660430ba3ad"]},"offset":"30862886"},"fromEvent.ts":{"size":14445,"integrity":{"algorithm":"SHA256","hash":"1f405dff746eb7d6ce2ba707e88e7273b598976573e6eb3ac4a7575c36fd6b74","blockSize":4194304,"blocks":["1f405dff746eb7d6ce2ba707e88e7273b598976573e6eb3ac4a7575c36fd6b74"]},"offset":"30865896"},"fromEventPattern.ts":{"size":6851,"integrity":{"algorithm":"SHA256","hash":"9e5bd3ea11aea0440d8f25fe4c8d64a8b48a68c6b6d0b0af874d146cb39686d1","blockSize":4194304,"blocks":["9e5bd3ea11aea0440d8f25fe4c8d64a8b48a68c6b6d0b0af874d146cb39686d1"]},"offset":"30880341"},"fromSubscribable.ts":{"size":559,"integrity":{"algorithm":"SHA256","hash":"1362eca99b479b30343eba98641d1e7c8006ac2aa6b8b21ff7dc290157c50f59","blockSize":4194304,"blocks":["1362eca99b479b30343eba98641d1e7c8006ac2aa6b8b21ff7dc290157c50f59"]},"offset":"30887192"},"generate.ts":{"size":12471,"integrity":{"algorithm":"SHA256","hash":"d38193fa01989251a1b171a601d6142ae90b8582fe28b6158ae468b9e14d1a23","blockSize":4194304,"blocks":["d38193fa01989251a1b171a601d6142ae90b8582fe28b6158ae468b9e14d1a23"]},"offset":"30887751"},"iif.ts":{"size":2541,"integrity":{"algorithm":"SHA256","hash":"612bb3b57b3a27fb8e2dd4afedecfbb2b6e342879aae4467c340ef9a9d82cd6b","blockSize":4194304,"blocks":["612bb3b57b3a27fb8e2dd4afedecfbb2b6e342879aae4467c340ef9a9d82cd6b"]},"offset":"30900222"},"innerFrom.ts":{"size":4780,"integrity":{"algorithm":"SHA256","hash":"aa12a76fc06153cf41e411e9e39f9580b7eec634816e7034091115d85a7fa5fc","blockSize":4194304,"blocks":["aa12a76fc06153cf41e411e9e39f9580b7eec634816e7034091115d85a7fa5fc"]},"offset":"30902763"},"interval.ts":{"size":1883,"integrity":{"algorithm":"SHA256","hash":"28703ccfba583dbae3063c46873f6af8a55e8ace17ff955656fd235d10c517cb","blockSize":4194304,"blocks":["28703ccfba583dbae3063c46873f6af8a55e8ace17ff955656fd235d10c517cb"]},"offset":"30907543"},"merge.ts":{"size":4424,"integrity":{"algorithm":"SHA256","hash":"8a9346c9c157e343870af1a9e924e617269c6fa895c46e6d970727c65bf0e95a","blockSize":4194304,"blocks":["8a9346c9c157e343870af1a9e924e617269c6fa895c46e6d970727c65bf0e95a"]},"offset":"30909426"},"never.ts":{"size":1191,"integrity":{"algorithm":"SHA256","hash":"c342558f678dc8b95fc69a9e80b87594e63ee75b5fd09b7e2a4d61cae6082671","blockSize":4194304,"blocks":["c342558f678dc8b95fc69a9e80b87594e63ee75b5fd09b7e2a4d61cae6082671"]},"offset":"30913850"},"of.ts":{"size":2806,"integrity":{"algorithm":"SHA256","hash":"5a39cd60a3ff1ceb49979eeb0efb2e1f3bb7374272bfc57644a0905d4ed100ee","blockSize":4194304,"blocks":["5a39cd60a3ff1ceb49979eeb0efb2e1f3bb7374272bfc57644a0905d4ed100ee"]},"offset":"30915041"},"onErrorResumeNext.ts":{"size":2826,"integrity":{"algorithm":"SHA256","hash":"64db91fc42831300e75ff8d35c76afb6da5eb42227f641793b38f89cdc194a90","blockSize":4194304,"blocks":["64db91fc42831300e75ff8d35c76afb6da5eb42227f641793b38f89cdc194a90"]},"offset":"30917847"},"pairs.ts":{"size":2824,"integrity":{"algorithm":"SHA256","hash":"140fb03202f4abc590d94828afb1fbe13388406c688044b49191aca2c4d3d6df","blockSize":4194304,"blocks":["140fb03202f4abc590d94828afb1fbe13388406c688044b49191aca2c4d3d6df"]},"offset":"30920673"},"partition.ts":{"size":3533,"integrity":{"algorithm":"SHA256","hash":"cb86a493ab96911258f0f955e541b6b6dd325ceebb72427bafdd45c434f6f896","blockSize":4194304,"blocks":["cb86a493ab96911258f0f955e541b6b6dd325ceebb72427bafdd45c434f6f896"]},"offset":"30923497"},"race.ts":{"size":3788,"integrity":{"algorithm":"SHA256","hash":"3658636761a90d28c936c135d64ea169ba96374b7dc2fcfdc982d75e39710912","blockSize":4194304,"blocks":["3658636761a90d28c936c135d64ea169ba96374b7dc2fcfdc982d75e39710912"]},"offset":"30927030"},"range.ts":{"size":2746,"integrity":{"algorithm":"SHA256","hash":"b2bf06c55ea24264bc03b81118f22361aabcc0e826bb58c75bef4947759e7540","blockSize":4194304,"blocks":["b2bf06c55ea24264bc03b81118f22361aabcc0e826bb58c75bef4947759e7540"]},"offset":"30930818"},"throwError.ts":{"size":4467,"integrity":{"algorithm":"SHA256","hash":"7b614f24e2dc97855aeb91b6984dc84a51ec460134c7ab2dcdb590dca29ab6a9","blockSize":4194304,"blocks":["7b614f24e2dc97855aeb91b6984dc84a51ec460134c7ab2dcdb590dca29ab6a9"]},"offset":"30933564"},"timer.ts":{"size":7059,"integrity":{"algorithm":"SHA256","hash":"039f3645a2889298ed4da817367c54e71ef15afc7b4198c777fe90cb3638152b","blockSize":4194304,"blocks":["039f3645a2889298ed4da817367c54e71ef15afc7b4198c777fe90cb3638152b"]},"offset":"30938031"},"using.ts":{"size":2967,"integrity":{"algorithm":"SHA256","hash":"80cb823f6108a9ed725aeae383774f753245faf8f6082d9d8a28d8a19c583ed9","blockSize":4194304,"blocks":["80cb823f6108a9ed725aeae383774f753245faf8f6082d9d8a28d8a19c583ed9"]},"offset":"30945090"},"zip.ts":{"size":4788,"integrity":{"algorithm":"SHA256","hash":"b0322e61ed89a5e298d12a371c939e78bbb9b83f94311c538cd713d843ba7892","blockSize":4194304,"blocks":["b0322e61ed89a5e298d12a371c939e78bbb9b83f94311c538cd713d843ba7892"]},"offset":"30948057"},"dom":{"files":{"WebSocketSubject.ts":{"size":12568,"integrity":{"algorithm":"SHA256","hash":"05fc68cc7958e4e43419c4fc9ba3e4f2e8015dc1ff33d5795c2a3ff852fe743c","blockSize":4194304,"blocks":["05fc68cc7958e4e43419c4fc9ba3e4f2e8015dc1ff33d5795c2a3ff852fe743c"]},"offset":"30952845"},"animationFrames.ts":{"size":5036,"integrity":{"algorithm":"SHA256","hash":"e13a392f59b71fa2c26121db1cfc362a09c2c52b91d5b72424a7ab76c8e2aa51","blockSize":4194304,"blocks":["e13a392f59b71fa2c26121db1cfc362a09c2c52b91d5b72424a7ab76c8e2aa51"]},"offset":"30965413"},"fetch.ts":{"size":6961,"integrity":{"algorithm":"SHA256","hash":"189f4d8c77728cb0c54ff1dd63a2c76f39af80157047802ee3973ae1626b7148","blockSize":4194304,"blocks":["189f4d8c77728cb0c54ff1dd63a2c76f39af80157047802ee3973ae1626b7148"]},"offset":"30970449"},"webSocket.ts":{"size":10193,"integrity":{"algorithm":"SHA256","hash":"fda9e9cc0ffcb6b36c380aa16840366e037b71c01773b5cd48d18eb987cdb405","blockSize":4194304,"blocks":["fda9e9cc0ffcb6b36c380aa16840366e037b71c01773b5cd48d18eb987cdb405"]},"offset":"30977410"}}}}},"ajax":{"files":{"AjaxResponse.ts":{"size":4810,"integrity":{"algorithm":"SHA256","hash":"2cec32605fe5699eeecc371dd1daabc7112c547ce00e29bbae7c95d66158a7aa","blockSize":4194304,"blocks":["2cec32605fe5699eeecc371dd1daabc7112c547ce00e29bbae7c95d66158a7aa"]},"offset":"30987603"},"ajax.ts":{"size":21954,"integrity":{"algorithm":"SHA256","hash":"0cba53a384b96adfa8c02a38eb7ef4a72d4a5657ecfa2b7ba085ef2e03ea0fb9","blockSize":4194304,"blocks":["0cba53a384b96adfa8c02a38eb7ef4a72d4a5657ecfa2b7ba085ef2e03ea0fb9"]},"offset":"30992413"},"errors.ts":{"size":3070,"integrity":{"algorithm":"SHA256","hash":"474b5050af83dcf0d30bce2ef07d5bc5966492f38c70c10481a8948621edd958","blockSize":4194304,"blocks":["474b5050af83dcf0d30bce2ef07d5bc5966492f38c70c10481a8948621edd958"]},"offset":"31014367"},"getXHRResponse.ts":{"size":1091,"integrity":{"algorithm":"SHA256","hash":"35a47326a0a3e8384cd13aa920159fed99f2605d0751a7bd60836c0c07d513bb","blockSize":4194304,"blocks":["35a47326a0a3e8384cd13aa920159fed99f2605d0751a7bd60836c0c07d513bb"]},"offset":"31017437"},"types.ts":{"size":8760,"integrity":{"algorithm":"SHA256","hash":"5092e0f10c061b40c0ad95de0c21069e842466e8147e552c6f1d1c5cacc8e758","blockSize":4194304,"blocks":["5092e0f10c061b40c0ad95de0c21069e842466e8147e552c6f1d1c5cacc8e758"]},"offset":"31018528"}}}}},"fetch":{"files":{"index.ts":{"size":62,"integrity":{"algorithm":"SHA256","hash":"1a288b2baee026d274e45fff6e6b532c8ee8d40123115a7008cd910df733858c","blockSize":4194304,"blocks":["1a288b2baee026d274e45fff6e6b532c8ee8d40123115a7008cd910df733858c"]},"offset":"31027288"}}},"ajax":{"files":{"index.ts":{"size":260,"integrity":{"algorithm":"SHA256","hash":"d56aac6d4a5ea58d0ff84b212324002793a7324f43b5812272b3788b9ee4e28f","blockSize":4194304,"blocks":["d56aac6d4a5ea58d0ff84b212324002793a7324f43b5812272b3788b9ee4e28f"]},"offset":"31027350"}}}}},"operators":{"files":{"package.json":{"size":241,"integrity":{"algorithm":"SHA256","hash":"a91d2f973f8f500a81d385d6c92b68b1ffe22a37b87e24fdb0c9bfb85e63d14c","blockSize":4194304,"blocks":["a91d2f973f8f500a81d385d6c92b68b1ffe22a37b87e24fdb0c9bfb85e63d14c"]},"offset":"31027610"}}},"fetch":{"files":{"package.json":{"size":221,"integrity":{"algorithm":"SHA256","hash":"37a7e1a0956e8e3c2df2e995e5529da5d3257ed5f2ba40048417ddee866f2591","blockSize":4194304,"blocks":["37a7e1a0956e8e3c2df2e995e5529da5d3257ed5f2ba40048417ddee866f2591"]},"offset":"31027851"}}},"dist":{"files":{"esm5":{"files":{"index.js":{"size":10038,"integrity":{"algorithm":"SHA256","hash":"b31b8593af1087007067a68d62396c1b3f7a20c3ece3a5aa33b1cc337af18369","blockSize":4194304,"blocks":["b31b8593af1087007067a68d62396c1b3f7a20c3ece3a5aa33b1cc337af18369"]},"offset":"31028072"},"webSocket":{"files":{"index.js":{"size":192,"integrity":{"algorithm":"SHA256","hash":"0c15decd4814e4f108c2787d5039d3876b803c2aeb723be31c59c1d2fe07af4a","blockSize":4194304,"blocks":["0c15decd4814e4f108c2787d5039d3876b803c2aeb723be31c59c1d2fe07af4a"]},"offset":"31038110"}}},"testing":{"files":{"index.js":{"size":100,"integrity":{"algorithm":"SHA256","hash":"fe3ac918cc943472c5bfc67b826ae73a295eda35a7882979e1cb426094b64da1","blockSize":4194304,"blocks":["fe3ac918cc943472c5bfc67b826ae73a295eda35a7882979e1cb426094b64da1"]},"offset":"31038302"}}},"operators":{"files":{"index.js":{"size":6872,"integrity":{"algorithm":"SHA256","hash":"d7b498591882ace6fa2e3257898d588e8524b349bd091399f90423d3dc5836bd","blockSize":4194304,"blocks":["d7b498591882ace6fa2e3257898d588e8524b349bd091399f90423d3dc5836bd"]},"offset":"31038402"}}},"internal":{"files":{"AnyCatcher.js":{"size":49,"integrity":{"algorithm":"SHA256","hash":"4715726f08eb6ee9697a68353f4b48e2ebdf64cb4e58f7d1927f05fb77e1483b","blockSize":4194304,"blocks":["4715726f08eb6ee9697a68353f4b48e2ebdf64cb4e58f7d1927f05fb77e1483b"]},"offset":"31045274"},"AsyncSubject.js":{"size":1484,"integrity":{"algorithm":"SHA256","hash":"de4ae10afaad19dcb79d55f755c0bd8a4e092e7642366be286a9d69542903b74","blockSize":4194304,"blocks":["de4ae10afaad19dcb79d55f755c0bd8a4e092e7642366be286a9d69542903b74"]},"offset":"31045323"},"BehaviorSubject.js":{"size":1262,"integrity":{"algorithm":"SHA256","hash":"e34f3ae0c1afc5996e5bed18cb92d2f58ea313282cc38aa6dc6cf859f02c1bd0","blockSize":4194304,"blocks":["e34f3ae0c1afc5996e5bed18cb92d2f58ea313282cc38aa6dc6cf859f02c1bd0"]},"offset":"31046807"},"Notification.js":{"size":3188,"integrity":{"algorithm":"SHA256","hash":"fbe9651cfec6d6e249b55329de96775d3971cd1d24e9b1b9ecdaf9a5e1cf99d4","blockSize":4194304,"blocks":["fbe9651cfec6d6e249b55329de96775d3971cd1d24e9b1b9ecdaf9a5e1cf99d4"]},"offset":"31048069"},"NotificationFactories.js":{"size":499,"integrity":{"algorithm":"SHA256","hash":"858f453a0e859d8a955a3ff61b721f2bf62eb007f0b07d4f9c9faa6c5ee09b1c","blockSize":4194304,"blocks":["858f453a0e859d8a955a3ff61b721f2bf62eb007f0b07d4f9c9faa6c5ee09b1c"]},"offset":"31051257"},"Observable.js":{"size":3805,"integrity":{"algorithm":"SHA256","hash":"b81ff259a4ebe16b37c6bdb29af04710990b447aa3474e50ea2bba82771ff71e","blockSize":4194304,"blocks":["b81ff259a4ebe16b37c6bdb29af04710990b447aa3474e50ea2bba82771ff71e"]},"offset":"31051756"},"Operator.js":{"size":47,"integrity":{"algorithm":"SHA256","hash":"e4fd11ca5599269162de095536f1b9de1c68df04c496ac5a0e10f8b0a4a26bbe","blockSize":4194304,"blocks":["e4fd11ca5599269162de095536f1b9de1c68df04c496ac5a0e10f8b0a4a26bbe"]},"offset":"31055561"},"ReplaySubject.js":{"size":2834,"integrity":{"algorithm":"SHA256","hash":"98d8493d39107832f4c989c9275d417378f9dca78c9be3d3c21a889565bb0ba0","blockSize":4194304,"blocks":["98d8493d39107832f4c989c9275d417378f9dca78c9be3d3c21a889565bb0ba0"]},"offset":"31055608"},"Scheduler.js":{"size":629,"integrity":{"algorithm":"SHA256","hash":"e9f2354415d2d80005374cafa5f9e3093f4b74619769dcd4986e484d54c074e3","blockSize":4194304,"blocks":["e9f2354415d2d80005374cafa5f9e3093f4b74619769dcd4986e484d54c074e3"]},"offset":"31058442"},"Subject.js":{"size":6111,"integrity":{"algorithm":"SHA256","hash":"9ed605e23fc0dc33e2d936cb4888f4155c05ea965ab84e6efe6976875f5307a6","blockSize":4194304,"blocks":["9ed605e23fc0dc33e2d936cb4888f4155c05ea965ab84e6efe6976875f5307a6"]},"offset":"31059071"},"Subscriber.js":{"size":6027,"integrity":{"algorithm":"SHA256","hash":"0d8580a1802ad8a740e9f5b73342247e007b0996bd7f82c3d9cf71e4368a6d2a","blockSize":4194304,"blocks":["0d8580a1802ad8a740e9f5b73342247e007b0996bd7f82c3d9cf71e4368a6d2a"]},"offset":"31065182"},"Subscription.js":{"size":5677,"integrity":{"algorithm":"SHA256","hash":"81700cb413ef892caada665e21a37b4f974d2d0846c5626ef6015b8a965a981c","blockSize":4194304,"blocks":["81700cb413ef892caada665e21a37b4f974d2d0846c5626ef6015b8a965a981c"]},"offset":"31071209"},"config.js":{"size":231,"integrity":{"algorithm":"SHA256","hash":"dd0b0f66363fbba5d16b7739901fcb78b7bf34a58a7a5f721a48228d0f2ead25","blockSize":4194304,"blocks":["dd0b0f66363fbba5d16b7739901fcb78b7bf34a58a7a5f721a48228d0f2ead25"]},"offset":"31076886"},"firstValueFrom.js":{"size":784,"integrity":{"algorithm":"SHA256","hash":"80454dc392876e9e4f67535b6fcd6c7f28dddb8b57c6e40daf6b2e1a8d197101","blockSize":4194304,"blocks":["80454dc392876e9e4f67535b6fcd6c7f28dddb8b57c6e40daf6b2e1a8d197101"]},"offset":"31077117"},"lastValueFrom.js":{"size":814,"integrity":{"algorithm":"SHA256","hash":"28c1d17dc4f33459aa06d6e80c861d8553f6d1588540047d668b1a0bb6393335","blockSize":4194304,"blocks":["28c1d17dc4f33459aa06d6e80c861d8553f6d1588540047d668b1a0bb6393335"]},"offset":"31077901"},"types.js":{"size":44,"integrity":{"algorithm":"SHA256","hash":"01ae2a5b120382f9a648ced7ee8507493a134f216d100fc61600c6c9738235d2","blockSize":4194304,"blocks":["01ae2a5b120382f9a648ced7ee8507493a134f216d100fc61600c6c9738235d2"]},"offset":"31078715"},"util":{"files":{"ArgumentOutOfRangeError.js":{"size":360,"integrity":{"algorithm":"SHA256","hash":"8e9e873e7387115c1d418b1dacae048ac68bf78b734b9e7d1681e79992d6762e","blockSize":4194304,"blocks":["8e9e873e7387115c1d418b1dacae048ac68bf78b734b9e7d1681e79992d6762e"]},"offset":"31078759"},"EmptyError.js":{"size":290,"integrity":{"algorithm":"SHA256","hash":"ecbe54ecfadf12adff984780e5c4a3d91b99c7798371c089d64d03ef7dbcfa7f","blockSize":4194304,"blocks":["ecbe54ecfadf12adff984780e5c4a3d91b99c7798371c089d64d03ef7dbcfa7f"]},"offset":"31079119"},"Immediate.js":{"size":772,"integrity":{"algorithm":"SHA256","hash":"1484ec3bd0264af18bf05a1f018a442b0df0eb486595506a2309865319793e42","blockSize":4194304,"blocks":["1484ec3bd0264af18bf05a1f018a442b0df0eb486595506a2309865319793e42"]},"offset":"31079409"},"NotFoundError.js":{"size":311,"integrity":{"algorithm":"SHA256","hash":"dbc707f8e396afda93593612b262d60264c1c75f46a885e204e1192239ef5d77","blockSize":4194304,"blocks":["dbc707f8e396afda93593612b262d60264c1c75f46a885e204e1192239ef5d77"]},"offset":"31080181"},"ObjectUnsubscribedError.js":{"size":358,"integrity":{"algorithm":"SHA256","hash":"fb8c73a11535fa2e581f1f1a48b06459421a87ee87e83bc0777d945ad0ca74d8","blockSize":4194304,"blocks":["fb8c73a11535fa2e581f1f1a48b06459421a87ee87e83bc0777d945ad0ca74d8"]},"offset":"31080492"},"SequenceError.js":{"size":311,"integrity":{"algorithm":"SHA256","hash":"80cff81d08bef6f50456cdc9f81a96deabcec03c940570c8eeab486085109596","blockSize":4194304,"blocks":["80cff81d08bef6f50456cdc9f81a96deabcec03c940570c8eeab486085109596"]},"offset":"31080850"},"UnsubscriptionError.js":{"size":541,"integrity":{"algorithm":"SHA256","hash":"7552d97c1b2c05cd1e875a0f2fcce6a0cf454c715a65f80932ef6c62f38c2ce5","blockSize":4194304,"blocks":["7552d97c1b2c05cd1e875a0f2fcce6a0cf454c715a65f80932ef6c62f38c2ce5"]},"offset":"31081161"},"applyMixins.js":{"size":466,"integrity":{"algorithm":"SHA256","hash":"24d3756248a79f60040733984646ff635e74813c8c1d163bb58ec012d53f485b","blockSize":4194304,"blocks":["24d3756248a79f60040733984646ff635e74813c8c1d163bb58ec012d53f485b"]},"offset":"31081702"},"args.js":{"size":500,"integrity":{"algorithm":"SHA256","hash":"e2f25404843c7e5f790dc35eb36ee64930307c2918f66a5dfbc722eb53f484cf","blockSize":4194304,"blocks":["e2f25404843c7e5f790dc35eb36ee64930307c2918f66a5dfbc722eb53f484cf"]},"offset":"31082168"},"argsArgArrayOrObject.js":{"size":746,"integrity":{"algorithm":"SHA256","hash":"951b1a229cec25af6129a51164ee59c0e9711990696dd2311288f345a9c122c4","blockSize":4194304,"blocks":["951b1a229cec25af6129a51164ee59c0e9711990696dd2311288f345a9c122c4"]},"offset":"31082668"},"argsOrArgArray.js":{"size":179,"integrity":{"algorithm":"SHA256","hash":"2f53361f53f6c33275217c690f414fe3abdea50810b3d7140dff3aca4b5057e8","blockSize":4194304,"blocks":["2f53361f53f6c33275217c690f414fe3abdea50810b3d7140dff3aca4b5057e8"]},"offset":"31083414"},"arrRemove.js":{"size":182,"integrity":{"algorithm":"SHA256","hash":"cfc5d07bebe2d69273ebee5957837bb10ee40a3f58e140c1ebacfe036d93fe17","blockSize":4194304,"blocks":["cfc5d07bebe2d69273ebee5957837bb10ee40a3f58e140c1ebacfe036d93fe17"]},"offset":"31083593"},"createErrorClass.js":{"size":377,"integrity":{"algorithm":"SHA256","hash":"3d07845633d4aff0166bda70ccd617496ae2fcc53bce19ad2a15a1b4cec917cf","blockSize":4194304,"blocks":["3d07845633d4aff0166bda70ccd617496ae2fcc53bce19ad2a15a1b4cec917cf"]},"offset":"31083775"},"createObject.js":{"size":190,"integrity":{"algorithm":"SHA256","hash":"9a8b38d70c55b1dcaf067e05ea1d62a48a25b63e4d0444a93bfe275aaf5acaf8","blockSize":4194304,"blocks":["9a8b38d70c55b1dcaf067e05ea1d62a48a25b63e4d0444a93bfe275aaf5acaf8"]},"offset":"31084152"},"errorContext.js":{"size":750,"integrity":{"algorithm":"SHA256","hash":"00d91b66cf112c9d57d2ba8febf3141f0ee63a300169435bed1415a822ed53a9","blockSize":4194304,"blocks":["00d91b66cf112c9d57d2ba8febf3141f0ee63a300169435bed1415a822ed53a9"]},"offset":"31084342"},"executeSchedule.js":{"size":579,"integrity":{"algorithm":"SHA256","hash":"1fd6a381f466fea4dad4f9923ad9323029907bf1ab05a2c48ac83f9af40a948c","blockSize":4194304,"blocks":["1fd6a381f466fea4dad4f9923ad9323029907bf1ab05a2c48ac83f9af40a948c"]},"offset":"31085092"},"identity.js":{"size":82,"integrity":{"algorithm":"SHA256","hash":"c4dba24be1568acb8f377ca8cfd43f6bc9906eedcca0fb7e37c8f4229b12a9ff","blockSize":4194304,"blocks":["c4dba24be1568acb8f377ca8cfd43f6bc9906eedcca0fb7e37c8f4229b12a9ff"]},"offset":"31085671"},"isArrayLike.js":{"size":153,"integrity":{"algorithm":"SHA256","hash":"2c90d531faadb0c66deba340f51fb6796210a4ba76bb3ff7811bdc7ad68fcca1","blockSize":4194304,"blocks":["2c90d531faadb0c66deba340f51fb6796210a4ba76bb3ff7811bdc7ad68fcca1"]},"offset":"31085753"},"isAsyncIterable.js":{"size":243,"integrity":{"algorithm":"SHA256","hash":"671176e3b7d03cd00104660692ab1bc1c8ca5a50c3d9c9cb64c36dc5adbdfce0","blockSize":4194304,"blocks":["671176e3b7d03cd00104660692ab1bc1c8ca5a50c3d9c9cb64c36dc5adbdfce0"]},"offset":"31085906"},"isDate.js":{"size":124,"integrity":{"algorithm":"SHA256","hash":"43ed28f060cf4e6420c93823af21b92199daf9853d8eecb2b190b77d88b0c349","blockSize":4194304,"blocks":["43ed28f060cf4e6420c93823af21b92199daf9853d8eecb2b190b77d88b0c349"]},"offset":"31086149"},"isFunction.js":{"size":116,"integrity":{"algorithm":"SHA256","hash":"20008836b429fe5ed72ab8c15250e7ec3e96b2c50b80ffc23f27c645a73f9107","blockSize":4194304,"blocks":["20008836b429fe5ed72ab8c15250e7ec3e96b2c50b80ffc23f27c645a73f9107"]},"offset":"31086273"},"isInteropObservable.js":{"size":258,"integrity":{"algorithm":"SHA256","hash":"53633fc4df9318727b581500b3b4863b97354a7d172523a7b025c3695138a462","blockSize":4194304,"blocks":["53633fc4df9318727b581500b3b4863b97354a7d172523a7b025c3695138a462"]},"offset":"31086389"},"isIterable.js":{"size":278,"integrity":{"algorithm":"SHA256","hash":"6f3bb2ed0c3cc498b85e7e0c4a2bcb14b8dd0bc40ed85516a05e0a05e5ef420e","blockSize":4194304,"blocks":["6f3bb2ed0c3cc498b85e7e0c4a2bcb14b8dd0bc40ed85516a05e0a05e5ef420e"]},"offset":"31086647"},"isObservable.js":{"size":269,"integrity":{"algorithm":"SHA256","hash":"7f3f8eaf78b378e11277852059d9dead74f79490eff3cc7e1b11ab9ce186fb26","blockSize":4194304,"blocks":["7f3f8eaf78b378e11277852059d9dead74f79490eff3cc7e1b11ab9ce186fb26"]},"offset":"31086925"},"isPromise.js":{"size":198,"integrity":{"algorithm":"SHA256","hash":"460ac3d1f3acba5aa74ac5e505f53763746ffb224a891423cecc29f92d289e96","blockSize":4194304,"blocks":["460ac3d1f3acba5aa74ac5e505f53763746ffb224a891423cecc29f92d289e96"]},"offset":"31087194"},"isReadableStreamLike.js":{"size":1546,"integrity":{"algorithm":"SHA256","hash":"8dd91d8f2bea1a3e1fab5d8db3aa233e419f35c83192c433b9e7e1babce82b47","blockSize":4194304,"blocks":["8dd91d8f2bea1a3e1fab5d8db3aa233e419f35c83192c433b9e7e1babce82b47"]},"offset":"31087392"},"isScheduler.js":{"size":169,"integrity":{"algorithm":"SHA256","hash":"97a5819db1ac87ee3d52043e3f95209e76c7f40327c67850d76d5afa65eaa669","blockSize":4194304,"blocks":["97a5819db1ac87ee3d52043e3f95209e76c7f40327c67850d76d5afa65eaa669"]},"offset":"31088938"},"lift.js":{"size":630,"integrity":{"algorithm":"SHA256","hash":"ae26b1f6cafcef4d3eba5f0ec53040183502f25d1939256911e52a9efd6b84d6","blockSize":4194304,"blocks":["ae26b1f6cafcef4d3eba5f0ec53040183502f25d1939256911e52a9efd6b84d6"]},"offset":"31089107"},"mapOneOrManyArgs.js":{"size":392,"integrity":{"algorithm":"SHA256","hash":"b2312d4d61b78cdbae570693be73521184b3d9a29a5828c2ce71128d00655c73","blockSize":4194304,"blocks":["b2312d4d61b78cdbae570693be73521184b3d9a29a5828c2ce71128d00655c73"]},"offset":"31089737"},"noop.js":{"size":59,"integrity":{"algorithm":"SHA256","hash":"fd939bf4ec30140a1be3960d4be464ffc5560862aa7b87cdff77a4ce8d24db6d","blockSize":4194304,"blocks":["fd939bf4ec30140a1be3960d4be464ffc5560862aa7b87cdff77a4ce8d24db6d"]},"offset":"31090129"},"not.js":{"size":152,"integrity":{"algorithm":"SHA256","hash":"b0d28e83929b2c1fc568b8fcccc0ad841353da57e3cb51a7d6e0745a3d718e4a","blockSize":4194304,"blocks":["b0d28e83929b2c1fc568b8fcccc0ad841353da57e3cb51a7d6e0745a3d718e4a"]},"offset":"31090188"},"pipe.js":{"size":511,"integrity":{"algorithm":"SHA256","hash":"6a04123c36a40ae0b4cf88a0f81cd3bfb979f66b14f4d1517cad9c43b64a86e1","blockSize":4194304,"blocks":["6a04123c36a40ae0b4cf88a0f81cd3bfb979f66b14f4d1517cad9c43b64a86e1"]},"offset":"31090340"},"reportUnhandledError.js":{"size":428,"integrity":{"algorithm":"SHA256","hash":"d5eeb38b64a69ac138f12fca93cc9c109086f81807b3e83c2cfb222cbcca35f5","blockSize":4194304,"blocks":["d5eeb38b64a69ac138f12fca93cc9c109086f81807b3e83c2cfb222cbcca35f5"]},"offset":"31090851"},"subscribeToArray.js":{"size":276,"integrity":{"algorithm":"SHA256","hash":"56d1c06c08d2ab184819468e6546c4db3f963d6c3146b02f9a5f40b9004773f5","blockSize":4194304,"blocks":["56d1c06c08d2ab184819468e6546c4db3f963d6c3146b02f9a5f40b9004773f5"]},"offset":"31091279"},"throwUnobservableError.js":{"size":368,"integrity":{"algorithm":"SHA256","hash":"7348129984eca1c2a1d2b6d1d55ff421c011db659c9c20abe6038b31b9ff7255","blockSize":4194304,"blocks":["7348129984eca1c2a1d2b6d1d55ff421c011db659c9c20abe6038b31b9ff7255"]},"offset":"31091555"},"workarounds.js":{"size":50,"integrity":{"algorithm":"SHA256","hash":"c008e3a59fb422b46404377acbd95e625891e3db47ffe5e30fc544d426d2eef0","blockSize":4194304,"blocks":["c008e3a59fb422b46404377acbd95e625891e3db47ffe5e30fc544d426d2eef0"]},"offset":"31091923"}}},"testing":{"files":{"ColdObservable.js":{"size":1719,"integrity":{"algorithm":"SHA256","hash":"95bbabfad6d959aa40c5a9dd95e1ff7325dd21b352f065c9ffa2766fc639f494","blockSize":4194304,"blocks":["95bbabfad6d959aa40c5a9dd95e1ff7325dd21b352f065c9ffa2766fc639f494"]},"offset":"31091973"},"HotObservable.js":{"size":1741,"integrity":{"algorithm":"SHA256","hash":"ff2ab0d6925eb744e4d4fdbb73444216a666f626eae3016b19736ec2eab81ea5","blockSize":4194304,"blocks":["ff2ab0d6925eb744e4d4fdbb73444216a666f626eae3016b19736ec2eab81ea5"]},"offset":"31093692"},"SubscriptionLog.js":{"size":391,"integrity":{"algorithm":"SHA256","hash":"c4954513477890c40b18f1f9f8c570213d8c897eef26d24e78bfbe1c1264db2d","blockSize":4194304,"blocks":["c4954513477890c40b18f1f9f8c570213d8c897eef26d24e78bfbe1c1264db2d"]},"offset":"31095433"},"SubscriptionLoggable.js":{"size":797,"integrity":{"algorithm":"SHA256","hash":"df2aefbba43c122e25b422304167270e1f609eeecc141fa5dc1b4f09d0e887e6","blockSize":4194304,"blocks":["df2aefbba43c122e25b422304167270e1f609eeecc141fa5dc1b4f09d0e887e6"]},"offset":"31095824"},"TestMessage.js":{"size":50,"integrity":{"algorithm":"SHA256","hash":"461551d4960477c5ee50965e5393760cb6d5f5c32348f3d977f5983133920540","blockSize":4194304,"blocks":["461551d4960477c5ee50965e5393760cb6d5f5c32348f3d977f5983133920540"]},"offset":"31096621"},"TestScheduler.js":{"size":25145,"integrity":{"algorithm":"SHA256","hash":"290219383407a4d68590a98a57cbeab531f619660ba24f7dc3d717fa418833f9","blockSize":4194304,"blocks":["290219383407a4d68590a98a57cbeab531f619660ba24f7dc3d717fa418833f9"]},"offset":"31096671"}}},"symbol":{"files":{"iterator.js":{"size":242,"integrity":{"algorithm":"SHA256","hash":"30961bd36cfb8189895ddb4a4569005f4392331de9eddf52e7a1c7d7ceb84718","blockSize":4194304,"blocks":["30961bd36cfb8189895ddb4a4569005f4392331de9eddf52e7a1c7d7ceb84718"]},"offset":"31121816"},"observable.js":{"size":161,"integrity":{"algorithm":"SHA256","hash":"ceddd7b7a6eae08906fb78c9ff8975fbc879ef169f0f4bdf4e7bf0a0bf5fb942","blockSize":4194304,"blocks":["ceddd7b7a6eae08906fb78c9ff8975fbc879ef169f0f4bdf4e7bf0a0bf5fb942"]},"offset":"31122058"}}},"scheduler":{"files":{"Action.js":{"size":456,"integrity":{"algorithm":"SHA256","hash":"20e7f90eeb52638a593d8367b9be4b5781c1d92d8380c9261adae30f81126863","blockSize":4194304,"blocks":["20e7f90eeb52638a593d8367b9be4b5781c1d92d8380c9261adae30f81126863"]},"offset":"31122219"},"AnimationFrameAction.js":{"size":1600,"integrity":{"algorithm":"SHA256","hash":"24c4286195267e22b73cbdf96f90ac5cfae3c623b9bb07fd73ed53939650f9ef","blockSize":4194304,"blocks":["24c4286195267e22b73cbdf96f90ac5cfae3c623b9bb07fd73ed53939650f9ef"]},"offset":"31122675"},"AnimationFrameScheduler.js":{"size":1158,"integrity":{"algorithm":"SHA256","hash":"4f7f8c1b807ced7eed9f81873eb99bd6c50e0793228b2ab297402afca76675ad","blockSize":4194304,"blocks":["4f7f8c1b807ced7eed9f81873eb99bd6c50e0793228b2ab297402afca76675ad"]},"offset":"31124275"},"AsapAction.js":{"size":1477,"integrity":{"algorithm":"SHA256","hash":"b01f44dad5ee33e53b1500f2dcee36ff9a7617626ff6b7debbab1ccfd0dcdd27","blockSize":4194304,"blocks":["b01f44dad5ee33e53b1500f2dcee36ff9a7617626ff6b7debbab1ccfd0dcdd27"]},"offset":"31125433"},"AsapScheduler.js":{"size":1088,"integrity":{"algorithm":"SHA256","hash":"5b9616b96b03f2627af595a732379878be66f0b6ebd1e6ddace34d850ecee671","blockSize":4194304,"blocks":["5b9616b96b03f2627af595a732379878be66f0b6ebd1e6ddace34d850ecee671"]},"offset":"31126910"},"AsyncAction.js":{"size":3038,"integrity":{"algorithm":"SHA256","hash":"a333bb9683102e12e84ade191ff557df2832c73a07724bac7264a5c194bea133","blockSize":4194304,"blocks":["a333bb9683102e12e84ade191ff557df2832c73a07724bac7264a5c194bea133"]},"offset":"31127998"},"AsyncScheduler.js":{"size":1163,"integrity":{"algorithm":"SHA256","hash":"ba4673749b5e0e07efb4726583f226412830b1a46ac484bbb93d8dadafe0aedd","blockSize":4194304,"blocks":["ba4673749b5e0e07efb4726583f226412830b1a46ac484bbb93d8dadafe0aedd"]},"offset":"31131036"},"QueueAction.js":{"size":1354,"integrity":{"algorithm":"SHA256","hash":"a9bde8468193c97df324b1266aa476efaf46e97f681c1bea2a6f407f318d1236","blockSize":4194304,"blocks":["a9bde8468193c97df324b1266aa476efaf46e97f681c1bea2a6f407f318d1236"]},"offset":"31132199"},"QueueScheduler.js":{"size":394,"integrity":{"algorithm":"SHA256","hash":"4b34eb91651811301dbcaf5a40ef62686d76bf99b9db4d8449f1cd88b2997b6b","blockSize":4194304,"blocks":["4b34eb91651811301dbcaf5a40ef62686d76bf99b9db4d8449f1cd88b2997b6b"]},"offset":"31133553"},"VirtualTimeScheduler.js":{"size":3635,"integrity":{"algorithm":"SHA256","hash":"d1da183b52d614a8d15dd861e27fd0cf76553f4d15f636f6a00405d825d121bc","blockSize":4194304,"blocks":["d1da183b52d614a8d15dd861e27fd0cf76553f4d15f636f6a00405d825d121bc"]},"offset":"31133947"},"animationFrame.js":{"size":315,"integrity":{"algorithm":"SHA256","hash":"198809402122ae3d203e3a4cc68e0385216352fed09e449edf6070cb55db3077","blockSize":4194304,"blocks":["198809402122ae3d203e3a4cc68e0385216352fed09e449edf6070cb55db3077"]},"offset":"31137582"},"animationFrameProvider.js":{"size":1597,"integrity":{"algorithm":"SHA256","hash":"d52b70529eb31990d624da06efbf293a9a9fefaad953697f4531be4c2cf8375a","blockSize":4194304,"blocks":["d52b70529eb31990d624da06efbf293a9a9fefaad953697f4531be4c2cf8375a"]},"offset":"31137897"},"asap.js":{"size":215,"integrity":{"algorithm":"SHA256","hash":"fdb6ea4022cb42921d4e5ac8d9790ee9f0c03bb49be1d844868bd1660b203245","blockSize":4194304,"blocks":["fdb6ea4022cb42921d4e5ac8d9790ee9f0c03bb49be1d844868bd1660b203245"]},"offset":"31139494"},"async.js":{"size":225,"integrity":{"algorithm":"SHA256","hash":"a0c902ec18642183af9858fa00a20448fd1f580739f1c334903f1560a28df3ef","blockSize":4194304,"blocks":["a0c902ec18642183af9858fa00a20448fd1f580739f1c334903f1560a28df3ef"]},"offset":"31139709"},"dateTimestampProvider.js":{"size":207,"integrity":{"algorithm":"SHA256","hash":"68429e06e5c42066254ad7b14bef380b5b67a12e78f589163eab7a9f0f4fa86f","blockSize":4194304,"blocks":["68429e06e5c42066254ad7b14bef380b5b67a12e78f589163eab7a9f0f4fa86f"]},"offset":"31139934"},"immediateProvider.js":{"size":880,"integrity":{"algorithm":"SHA256","hash":"7c27f39ac46d98d13426446cb54f4a7c112d368625d260d938a443860a6e5513","blockSize":4194304,"blocks":["7c27f39ac46d98d13426446cb54f4a7c112d368625d260d938a443860a6e5513"]},"offset":"31140141"},"intervalProvider.js":{"size":897,"integrity":{"algorithm":"SHA256","hash":"f2a227d6d1329102375d8e1756ab69ae4a3d9dc864a1316fb3fb6514b19da8e7","blockSize":4194304,"blocks":["f2a227d6d1329102375d8e1756ab69ae4a3d9dc864a1316fb3fb6514b19da8e7"]},"offset":"31141021"},"performanceTimestampProvider.js":{"size":235,"integrity":{"algorithm":"SHA256","hash":"6d32145186a58e39f241bcc7f325a60cb436b36f764e6e2b8ea0d2b62544623e","blockSize":4194304,"blocks":["6d32145186a58e39f241bcc7f325a60cb436b36f764e6e2b8ea0d2b62544623e"]},"offset":"31141918"},"queue.js":{"size":225,"integrity":{"algorithm":"SHA256","hash":"c560892fefa2b06ca195a1d4bf99a0888b941671ec36cf2b08e9fde8a828ae7b","blockSize":4194304,"blocks":["c560892fefa2b06ca195a1d4bf99a0888b941671ec36cf2b08e9fde8a828ae7b"]},"offset":"31142153"},"timeoutProvider.js":{"size":886,"integrity":{"algorithm":"SHA256","hash":"2ca2cfc92a1aeee1d738ee32a755dafae1d65af2df4141c20d89655dabc9495f","blockSize":4194304,"blocks":["2ca2cfc92a1aeee1d738ee32a755dafae1d65af2df4141c20d89655dabc9495f"]},"offset":"31142378"},"timerHandle.js":{"size":50,"integrity":{"algorithm":"SHA256","hash":"7657fa65de5794b6bf810e7dfa47c3ce554f9a7e70281407a5bf27104c86e08f","blockSize":4194304,"blocks":["7657fa65de5794b6bf810e7dfa47c3ce554f9a7e70281407a5bf27104c86e08f"]},"offset":"31143264"}}},"scheduled":{"files":{"scheduleArray.js":{"size":540,"integrity":{"algorithm":"SHA256","hash":"ad6d558449b0b6fcb3b9b00ff4633ef8c8999dbacf900acf057dd7b6863f989d","blockSize":4194304,"blocks":["ad6d558449b0b6fcb3b9b00ff4633ef8c8999dbacf900acf057dd7b6863f989d"]},"offset":"31143314"},"scheduleAsyncIterable.js":{"size":856,"integrity":{"algorithm":"SHA256","hash":"609b8b3ae7d5141133d792a7f1eff37fcbeaef91b520483262a948d2fe1d952a","blockSize":4194304,"blocks":["609b8b3ae7d5141133d792a7f1eff37fcbeaef91b520483262a948d2fe1d952a"]},"offset":"31143854"},"scheduleIterable.js":{"size":1238,"integrity":{"algorithm":"SHA256","hash":"7ef26a9643c7b68bdc5f1e887a2d2ab0fcd698cb84c59b1998f50a329cd930a2","blockSize":4194304,"blocks":["7ef26a9643c7b68bdc5f1e887a2d2ab0fcd698cb84c59b1998f50a329cd930a2"]},"offset":"31144710"},"scheduleObservable.js":{"size":344,"integrity":{"algorithm":"SHA256","hash":"294f5344eb0bdcb1518f2a9b059d1d60a57a66abf58b4338cae4674b9207e567","blockSize":4194304,"blocks":["294f5344eb0bdcb1518f2a9b059d1d60a57a66abf58b4338cae4674b9207e567"]},"offset":"31145948"},"schedulePromise.js":{"size":338,"integrity":{"algorithm":"SHA256","hash":"0b60d7142874c0aa40ba1e54c6bf4fef8ca83b7c2a64c6f9637dcfc512eb8a99","blockSize":4194304,"blocks":["0b60d7142874c0aa40ba1e54c6bf4fef8ca83b7c2a64c6f9637dcfc512eb8a99"]},"offset":"31146292"},"scheduleReadableStreamLike.js":{"size":355,"integrity":{"algorithm":"SHA256","hash":"bd97546688fe9803fe0c705d72da9cf71b904b5f8de7713917f6858fed29f9ca","blockSize":4194304,"blocks":["bd97546688fe9803fe0c705d72da9cf71b904b5f8de7713917f6858fed29f9ca"]},"offset":"31146630"},"scheduled.js":{"size":1573,"integrity":{"algorithm":"SHA256","hash":"9a309ee71ddc5dec61c0b11f016384b414b3685f88bc290be63454385a1854a0","blockSize":4194304,"blocks":["9a309ee71ddc5dec61c0b11f016384b414b3685f88bc290be63454385a1854a0"]},"offset":"31146985"}}},"operators":{"files":{"OperatorSubscriber.js":{"size":2140,"integrity":{"algorithm":"SHA256","hash":"a1e9f86351502f069d45d1f850d3572d11d837876d93bf7c0cb435dd8c2e946a","blockSize":4194304,"blocks":["a1e9f86351502f069d45d1f850d3572d11d837876d93bf7c0cb435dd8c2e946a"]},"offset":"31148558"},"audit.js":{"size":1532,"integrity":{"algorithm":"SHA256","hash":"8e9885ff947a2df81a0eba99317d9bf585962812a7412cd7a752cf7cecb1c81e","blockSize":4194304,"blocks":["8e9885ff947a2df81a0eba99317d9bf585962812a7412cd7a752cf7cecb1c81e"]},"offset":"31150698"},"auditTime.js":{"size":351,"integrity":{"algorithm":"SHA256","hash":"7cedc8fceb23c5ff81742fa51cf2c062d8284322aeb12a146d523e85746affac","blockSize":4194304,"blocks":["7cedc8fceb23c5ff81742fa51cf2c062d8284322aeb12a146d523e85746affac"]},"offset":"31152230"},"buffer.js":{"size":812,"integrity":{"algorithm":"SHA256","hash":"48a3a37f9694551492316e1f9dcc9b2ef91f579a728dd8c1212658d5863533eb","blockSize":4194304,"blocks":["48a3a37f9694551492316e1f9dcc9b2ef91f579a728dd8c1212658d5863533eb"]},"offset":"31152581"},"bufferCount.js":{"size":3047,"integrity":{"algorithm":"SHA256","hash":"fc020b67ef9087bea355cdd9292f1d6acf3dc2f15a559c2c3c816cbd045bc6e7","blockSize":4194304,"blocks":["fc020b67ef9087bea355cdd9292f1d6acf3dc2f15a559c2c3c816cbd045bc6e7"]},"offset":"31153393"},"bufferTime.js":{"size":3435,"integrity":{"algorithm":"SHA256","hash":"1fff75c0812326654a962fe9627eb1552d4af165269fabe438fbd9303833e96a","blockSize":4194304,"blocks":["1fff75c0812326654a962fe9627eb1552d4af165269fabe438fbd9303833e96a"]},"offset":"31156440"},"bufferToggle.js":{"size":1939,"integrity":{"algorithm":"SHA256","hash":"dbbf6731b09795e0e7fa02e532753d36ca1e4d7a331af99473b71e8ccca834c1","blockSize":4194304,"blocks":["dbbf6731b09795e0e7fa02e532753d36ca1e4d7a331af99473b71e8ccca834c1"]},"offset":"31159875"},"bufferWhen.js":{"size":1152,"integrity":{"algorithm":"SHA256","hash":"eef65ff311601225e9c4c9f4d551a07a3776dbe674a82bd5cdc5ff59b1de27ec","blockSize":4194304,"blocks":["eef65ff311601225e9c4c9f4d551a07a3776dbe674a82bd5cdc5ff59b1de27ec"]},"offset":"31161814"},"catchError.js":{"size":976,"integrity":{"algorithm":"SHA256","hash":"15e8c5b17d80d20f6da522a1d1a34e441f582c806dd252620d95e06dabf59447","blockSize":4194304,"blocks":["15e8c5b17d80d20f6da522a1d1a34e441f582c806dd252620d95e06dabf59447"]},"offset":"31162966"},"combineAll.js":{"size":135,"integrity":{"algorithm":"SHA256","hash":"18f656ce711221f6ac09c3d1fe4a9514b8d4cb934f586b39a4533eab6362d60f","blockSize":4194304,"blocks":["18f656ce711221f6ac09c3d1fe4a9514b8d4cb934f586b39a4533eab6362d60f"]},"offset":"31163942"},"combineLatest.js":{"size":892,"integrity":{"algorithm":"SHA256","hash":"51d0a57f9a9d05dadb611a8c691ecc82b207a089212f34d04badef0a4b3e1b5c","blockSize":4194304,"blocks":["51d0a57f9a9d05dadb611a8c691ecc82b207a089212f34d04badef0a4b3e1b5c"]},"offset":"31164077"},"combineLatestAll.js":{"size":259,"integrity":{"algorithm":"SHA256","hash":"3a10ffe87bd4cd0f2b29dbf54a0b4e8c1315d15d745dffe95b212da5af7bf7cb","blockSize":4194304,"blocks":["3a10ffe87bd4cd0f2b29dbf54a0b4e8c1315d15d745dffe95b212da5af7bf7cb"]},"offset":"31164969"},"combineLatestWith.js":{"size":389,"integrity":{"algorithm":"SHA256","hash":"853f972ebba5a0f0deeb6a3e6cf36f65525d45166e2d93276ec8331fda8657aa","blockSize":4194304,"blocks":["853f972ebba5a0f0deeb6a3e6cf36f65525d45166e2d93276ec8331fda8657aa"]},"offset":"31165228"},"concat.js":{"size":588,"integrity":{"algorithm":"SHA256","hash":"f7c1aa8750eb324c5b7fe8606f799eb3d45e5922c628f3cf6533a111d08a6da1","blockSize":4194304,"blocks":["f7c1aa8750eb324c5b7fe8606f799eb3d45e5922c628f3cf6533a111d08a6da1"]},"offset":"31165617"},"concatAll.js":{"size":132,"integrity":{"algorithm":"SHA256","hash":"a08b8574248cfe93705bfd2019875d7d736cbd120f2541cedea34cbc125bad2c","blockSize":4194304,"blocks":["a08b8574248cfe93705bfd2019875d7d736cbd120f2541cedea34cbc125bad2c"]},"offset":"31166205"},"concatMap.js":{"size":281,"integrity":{"algorithm":"SHA256","hash":"3b3b676e2129cd75d32e7d4bad5574c207639207b11a13d532248a8e6a77ae40","blockSize":4194304,"blocks":["3b3b676e2129cd75d32e7d4bad5574c207639207b11a13d532248a8e6a77ae40"]},"offset":"31166337"},"concatMapTo.js":{"size":355,"integrity":{"algorithm":"SHA256","hash":"ef7eb1515cd6961570dda3772433d2515d0a737d9562084a2034ec99d666ff7b","blockSize":4194304,"blocks":["ef7eb1515cd6961570dda3772433d2515d0a737d9562084a2034ec99d666ff7b"]},"offset":"31166618"},"concatWith.js":{"size":354,"integrity":{"algorithm":"SHA256","hash":"26a75a4c01447f3a4d1132063fe9cae1c55f81a1d1c6c0dfba1dbb26f333dbbc","blockSize":4194304,"blocks":["26a75a4c01447f3a4d1132063fe9cae1c55f81a1d1c6c0dfba1dbb26f333dbbc"]},"offset":"31166973"},"connect.js":{"size":676,"integrity":{"algorithm":"SHA256","hash":"a5de394c67b5384c2183047ba7c8f502b16c044fe8c461ca562735c31936dbdd","blockSize":4194304,"blocks":["a5de394c67b5384c2183047ba7c8f502b16c044fe8c461ca562735c31936dbdd"]},"offset":"31167327"},"count.js":{"size":223,"integrity":{"algorithm":"SHA256","hash":"a24872aa9ba705212453ea50accc71a20df76ca0f982c2cb7a8af789c5d218bb","blockSize":4194304,"blocks":["a24872aa9ba705212453ea50accc71a20df76ca0f982c2cb7a8af789c5d218bb"]},"offset":"31168003"},"debounce.js":{"size":1426,"integrity":{"algorithm":"SHA256","hash":"bd62ceb0b19e8c65668a95edae46de8a302551ebe6c901b5471af7e98c733ced","blockSize":4194304,"blocks":["bd62ceb0b19e8c65668a95edae46de8a302551ebe6c901b5471af7e98c733ced"]},"offset":"31168226"},"debounceTime.js":{"size":1568,"integrity":{"algorithm":"SHA256","hash":"bc405ed228f806cecbd35f081dcaea8ab8545e4fe2d36b6d9754bad2d1c5bb78","blockSize":4194304,"blocks":["bc405ed228f806cecbd35f081dcaea8ab8545e4fe2d36b6d9754bad2d1c5bb78"]},"offset":"31169652"},"defaultIfEmpty.js":{"size":594,"integrity":{"algorithm":"SHA256","hash":"d13fcc70407fc6dd79dc56b692a654152062e2eeec5588ae44e7a4a5000c9a7e","blockSize":4194304,"blocks":["d13fcc70407fc6dd79dc56b692a654152062e2eeec5588ae44e7a4a5000c9a7e"]},"offset":"31171220"},"delay.js":{"size":374,"integrity":{"algorithm":"SHA256","hash":"617c6be4301842c74e90da59e783d6c3e3bfef0197a4ac841a33204b78080816","blockSize":4194304,"blocks":["617c6be4301842c74e90da59e783d6c3e3bfef0197a4ac841a33204b78080816"]},"offset":"31171814"},"delayWhen.js":{"size":638,"integrity":{"algorithm":"SHA256","hash":"b550995157872c4a90ac7d2fdc9f9d0c0f732c2bd585fd28c3ce70f8a1cdec0b","blockSize":4194304,"blocks":["b550995157872c4a90ac7d2fdc9f9d0c0f732c2bd585fd28c3ce70f8a1cdec0b"]},"offset":"31172188"},"dematerialize.js":{"size":443,"integrity":{"algorithm":"SHA256","hash":"158ca66cb5489d294cd69a19419bc858b6645c1b25d8092f100db81bd8567bc3","blockSize":4194304,"blocks":["158ca66cb5489d294cd69a19419bc858b6645c1b25d8092f100db81bd8567bc3"]},"offset":"31172826"},"distinct.js":{"size":786,"integrity":{"algorithm":"SHA256","hash":"748d28493e68866d4d7613da0b54ab045c52f1f8de43a1fa5df59565b693d351","blockSize":4194304,"blocks":["748d28493e68866d4d7613da0b54ab045c52f1f8de43a1fa5df59565b693d351"]},"offset":"31173269"},"distinctUntilChanged.js":{"size":916,"integrity":{"algorithm":"SHA256","hash":"a7a8d8ff2383bf4d4a46fa555d4dd05dbbb8b726fefaa8d5e8fd98a12c31bccc","blockSize":4194304,"blocks":["a7a8d8ff2383bf4d4a46fa555d4dd05dbbb8b726fefaa8d5e8fd98a12c31bccc"]},"offset":"31174055"},"distinctUntilKeyChanged.js":{"size":288,"integrity":{"algorithm":"SHA256","hash":"00e3d820c300e208c24188ce2a7648d9cef51e64fb36d41914bbe06e3e5c72af","blockSize":4194304,"blocks":["00e3d820c300e208c24188ce2a7648d9cef51e64fb36d41914bbe06e3e5c72af"]},"offset":"31174971"},"elementAt.js":{"size":690,"integrity":{"algorithm":"SHA256","hash":"b7cd10bd07e9430744b3af8ecad0e97e71e559ead2d0eb822925a1821866481d","blockSize":4194304,"blocks":["b7cd10bd07e9430744b3af8ecad0e97e71e559ead2d0eb822925a1821866481d"]},"offset":"31175259"},"endWith.js":{"size":423,"integrity":{"algorithm":"SHA256","hash":"ca5331a388236aa202993e9f147ff7d14700a7362ef0ba90fc560ff2596db52a","blockSize":4194304,"blocks":["ca5331a388236aa202993e9f147ff7d14700a7362ef0ba90fc560ff2596db52a"]},"offset":"31175949"},"every.js":{"size":616,"integrity":{"algorithm":"SHA256","hash":"b9b11f05af86fb810521c2d3b231c9902694410789212beab9c0abe17e812d7d","blockSize":4194304,"blocks":["b9b11f05af86fb810521c2d3b231c9902694410789212beab9c0abe17e812d7d"]},"offset":"31176372"},"exhaust.js":{"size":111,"integrity":{"algorithm":"SHA256","hash":"2403179c32ef717de185b62018ecd0a1657a7036a8772bae78b988a0d9a666a2","blockSize":4194304,"blocks":["2403179c32ef717de185b62018ecd0a1657a7036a8772bae78b988a0d9a666a2"]},"offset":"31176988"},"exhaustAll.js":{"size":192,"integrity":{"algorithm":"SHA256","hash":"2d62569e5df98f1f2a777f70b7a698f5764695f736787e461665d0332cc6ddce","blockSize":4194304,"blocks":["2d62569e5df98f1f2a777f70b7a698f5764695f736787e461665d0332cc6ddce"]},"offset":"31177099"},"exhaustMap.js":{"size":1194,"integrity":{"algorithm":"SHA256","hash":"67414824cbcd020599e19392deef04f7a2e4e30c8955c0c72ef8823c4d37ec13","blockSize":4194304,"blocks":["67414824cbcd020599e19392deef04f7a2e4e30c8955c0c72ef8823c4d37ec13"]},"offset":"31177291"},"expand.js":{"size":465,"integrity":{"algorithm":"SHA256","hash":"322b8b823c14c1381ff75b86f10c59716bf9b0468a01a0163665a3c72aeb497c","blockSize":4194304,"blocks":["322b8b823c14c1381ff75b86f10c59716bf9b0468a01a0163665a3c72aeb497c"]},"offset":"31178485"},"filter.js":{"size":428,"integrity":{"algorithm":"SHA256","hash":"c384bdc7fc966cafc5635dfceb18f322926cffb6c26658283c79cf292f21b510","blockSize":4194304,"blocks":["c384bdc7fc966cafc5635dfceb18f322926cffb6c26658283c79cf292f21b510"]},"offset":"31178950"},"finalize.js":{"size":306,"integrity":{"algorithm":"SHA256","hash":"fa3e08cde5ed98dbf316703a33c6775540a752df5b7b9e78ad063d7aa8a63aa1","blockSize":4194304,"blocks":["fa3e08cde5ed98dbf316703a33c6775540a752df5b7b9e78ad063d7aa8a63aa1"]},"offset":"31179378"},"find.js":{"size":821,"integrity":{"algorithm":"SHA256","hash":"169b8fa442245fefffc0a68cd43e898bad73ba16c9ae27bc5f44eef6e2d68c5a","blockSize":4194304,"blocks":["169b8fa442245fefffc0a68cd43e898bad73ba16c9ae27bc5f44eef6e2d68c5a"]},"offset":"31179684"},"findIndex.js":{"size":225,"integrity":{"algorithm":"SHA256","hash":"ad6e9d568253c93dfb32b32162717d768db931b1f073e9a338a641658179896e","blockSize":4194304,"blocks":["ad6e9d568253c93dfb32b32162717d768db931b1f073e9a338a641658179896e"]},"offset":"31180505"},"first.js":{"size":655,"integrity":{"algorithm":"SHA256","hash":"82fd6e9670b7d5aec7baa2f6cda88abe4a0183dda91ec2803c3f6fa9adec272d","blockSize":4194304,"blocks":["82fd6e9670b7d5aec7baa2f6cda88abe4a0183dda91ec2803c3f6fa9adec272d"]},"offset":"31180730"},"flatMap.js":{"size":105,"integrity":{"algorithm":"SHA256","hash":"9f51bb67f378a4875250411656d0b91539ccc209aff5fdc67eabae9bacf15bdd","blockSize":4194304,"blocks":["9f51bb67f378a4875250411656d0b91539ccc209aff5fdc67eabae9bacf15bdd"]},"offset":"31181385"},"groupBy.js":{"size":3059,"integrity":{"algorithm":"SHA256","hash":"a21eb66d3cc95fb36aa399d3fb12b0463facc1b07ae783fa64b195d7b8e09dc8","blockSize":4194304,"blocks":["a21eb66d3cc95fb36aa399d3fb12b0463facc1b07ae783fa64b195d7b8e09dc8"]},"offset":"31181490"},"ignoreElements.js":{"size":350,"integrity":{"algorithm":"SHA256","hash":"77f9fca7e257ef7602740a88702c665080f03590dd79353b2170103a52072723","blockSize":4194304,"blocks":["77f9fca7e257ef7602740a88702c665080f03590dd79353b2170103a52072723"]},"offset":"31184549"},"isEmpty.js":{"size":484,"integrity":{"algorithm":"SHA256","hash":"906bd4e51d2bac6c6f9b20ae40550ee94b6836de1cdc54bf8956441be9fb461c","blockSize":4194304,"blocks":["906bd4e51d2bac6c6f9b20ae40550ee94b6836de1cdc54bf8956441be9fb461c"]},"offset":"31184899"},"joinAllInternals.js":{"size":451,"integrity":{"algorithm":"SHA256","hash":"53c8c666dedc9cedf7dbd922efb7bea4e5a5ab5efce4ace86d4b74e225848e85","blockSize":4194304,"blocks":["53c8c666dedc9cedf7dbd922efb7bea4e5a5ab5efce4ace86d4b74e225848e85"]},"offset":"31185383"},"last.js":{"size":665,"integrity":{"algorithm":"SHA256","hash":"1a75a721ad0c33de0ef073326bd7d2ed8b0dffc413cc51d7e254b417df2a7800","blockSize":4194304,"blocks":["1a75a721ad0c33de0ef073326bd7d2ed8b0dffc413cc51d7e254b417df2a7800"]},"offset":"31185834"},"map.js":{"size":422,"integrity":{"algorithm":"SHA256","hash":"2958b62e494473ea607b8abf593c8781176e7352f94efa063bf548010d92194d","blockSize":4194304,"blocks":["2958b62e494473ea607b8abf593c8781176e7352f94efa063bf548010d92194d"]},"offset":"31186499"},"mapTo.js":{"size":142,"integrity":{"algorithm":"SHA256","hash":"548533646dddff1271413e2ff5c009ef816c42dc81aa22beb487f0dd19d5c02c","blockSize":4194304,"blocks":["548533646dddff1271413e2ff5c009ef816c42dc81aa22beb487f0dd19d5c02c"]},"offset":"31186921"},"materialize.js":{"size":683,"integrity":{"algorithm":"SHA256","hash":"7752c93302553beabb95a4ef1486b442c392f7e68fe8461c43efb2a6551e9bec","blockSize":4194304,"blocks":["7752c93302553beabb95a4ef1486b442c392f7e68fe8461c43efb2a6551e9bec"]},"offset":"31187063"},"max.js":{"size":295,"integrity":{"algorithm":"SHA256","hash":"c58592bf19f209dac0470886f45c19cdd9a60f19095dfdf3d848a63c6bbc3a53","blockSize":4194304,"blocks":["c58592bf19f209dac0470886f45c19cdd9a60f19095dfdf3d848a63c6bbc3a53"]},"offset":"31187746"},"merge.js":{"size":742,"integrity":{"algorithm":"SHA256","hash":"6be2409d4ebe851f0b2316bb308d843082024d2cb5e01bf30e7160d2653d6440","blockSize":4194304,"blocks":["6be2409d4ebe851f0b2316bb308d843082024d2cb5e01bf30e7160d2653d6440"]},"offset":"31188041"},"mergeAll.js":{"size":262,"integrity":{"algorithm":"SHA256","hash":"95b2f7907e3a0888ae13ffba0be8e49e067aec8b4be94c375733dfb1d9719574","blockSize":4194304,"blocks":["95b2f7907e3a0888ae13ffba0be8e49e067aec8b4be94c375733dfb1d9719574"]},"offset":"31188783"},"mergeInternals.js":{"size":2417,"integrity":{"algorithm":"SHA256","hash":"1dd184a7fcdee64ef72e07fc20427664bb46441a08dc5bda90cc283e7c05b229","blockSize":4194304,"blocks":["1dd184a7fcdee64ef72e07fc20427664bb46441a08dc5bda90cc283e7c05b229"]},"offset":"31189045"},"mergeMap.js":{"size":793,"integrity":{"algorithm":"SHA256","hash":"1c661a7cf737a75492a06af6980185f42f5568718cb421e5405bf6f4f398133b","blockSize":4194304,"blocks":["1c661a7cf737a75492a06af6980185f42f5568718cb421e5405bf6f4f398133b"]},"offset":"31191462"},"mergeMapTo.js":{"size":561,"integrity":{"algorithm":"SHA256","hash":"600d9e1c9a0911bc3f087cccbe63dca1dd0b01e0122c13069d064c78dbc3ec98","blockSize":4194304,"blocks":["600d9e1c9a0911bc3f087cccbe63dca1dd0b01e0122c13069d064c78dbc3ec98"]},"offset":"31192255"},"mergeScan.js":{"size":580,"integrity":{"algorithm":"SHA256","hash":"24e7f8bd6618c33c7b113b0fc76fea0bb11be1d2713a18f51077edfdc370e1a7","blockSize":4194304,"blocks":["24e7f8bd6618c33c7b113b0fc76fea0bb11be1d2713a18f51077edfdc370e1a7"]},"offset":"31192816"},"mergeWith.js":{"size":349,"integrity":{"algorithm":"SHA256","hash":"4e24ab42d30d96a2231020f614f185f3177f80c7d31db2454e35248883a2ea25","blockSize":4194304,"blocks":["4e24ab42d30d96a2231020f614f185f3177f80c7d31db2454e35248883a2ea25"]},"offset":"31193396"},"min.js":{"size":295,"integrity":{"algorithm":"SHA256","hash":"16427a1be547702ef252eafe9c8623293e69aee2b53cba25c98d3f878f6e5ce0","blockSize":4194304,"blocks":["16427a1be547702ef252eafe9c8623293e69aee2b53cba25c98d3f878f6e5ce0"]},"offset":"31193745"},"multicast.js":{"size":619,"integrity":{"algorithm":"SHA256","hash":"be33500885ff18b5ceb7a5c1319a6fffd2db79f93b01eff4221b9652b7a48364","blockSize":4194304,"blocks":["be33500885ff18b5ceb7a5c1319a6fffd2db79f93b01eff4221b9652b7a48364"]},"offset":"31194040"},"observeOn.js":{"size":776,"integrity":{"algorithm":"SHA256","hash":"b20be0905cb565373b0e6c80dd7b4d5985b96ae48ff5f5eb2336c1fc9a022168","blockSize":4194304,"blocks":["b20be0905cb565373b0e6c80dd7b4d5985b96ae48ff5f5eb2336c1fc9a022168"]},"offset":"31194659"},"onErrorResumeNext.js":{"size":1439,"integrity":{"algorithm":"SHA256","hash":"592b97b544e0604122f6dfd99064706971db0ee85c731d3f7f0ed9afac786435","blockSize":4194304,"blocks":["592b97b544e0604122f6dfd99064706971db0ee85c731d3f7f0ed9afac786435"]},"offset":"31195435"},"pairwise.js":{"size":504,"integrity":{"algorithm":"SHA256","hash":"2939a4185fd91ea8a10e541d0d4d296199bc31e9f26997620edd79ad4004303c","blockSize":4194304,"blocks":["2939a4185fd91ea8a10e541d0d4d296199bc31e9f26997620edd79ad4004303c"]},"offset":"31196874"},"partition.js":{"size":289,"integrity":{"algorithm":"SHA256","hash":"fa0fc0b7dbcc9c5de6a2588575a44e78ba791072acc95c477b4281f50b1f4010","blockSize":4194304,"blocks":["fa0fc0b7dbcc9c5de6a2588575a44e78ba791072acc95c477b4281f50b1f4010"]},"offset":"31197378"},"pluck.js":{"size":755,"integrity":{"algorithm":"SHA256","hash":"ce78cfbb880c6e451d18885784374eb2b67f41306fb94b5387eaf5e56ea25164","blockSize":4194304,"blocks":["ce78cfbb880c6e451d18885784374eb2b67f41306fb94b5387eaf5e56ea25164"]},"offset":"31197667"},"publish.js":{"size":333,"integrity":{"algorithm":"SHA256","hash":"b818308c2af5c0db9c8d3c94a46ebcceb0a3a372dc91881d7f33a051d07bca8e","blockSize":4194304,"blocks":["b818308c2af5c0db9c8d3c94a46ebcceb0a3a372dc91881d7f33a051d07bca8e"]},"offset":"31198422"},"publishBehavior.js":{"size":402,"integrity":{"algorithm":"SHA256","hash":"5a301031d65dc1c713c079c80d9cef934a47f00244459b3ef72b7b3e18b57a17","blockSize":4194304,"blocks":["5a301031d65dc1c713c079c80d9cef934a47f00244459b3ef72b7b3e18b57a17"]},"offset":"31198755"},"publishLast.js":{"size":361,"integrity":{"algorithm":"SHA256","hash":"c3ca7cf49e98d70f75f3842658e2d813fd020e71b8db489ff265e72a2769d49d","blockSize":4194304,"blocks":["c3ca7cf49e98d70f75f3842658e2d813fd020e71b8db489ff265e72a2769d49d"]},"offset":"31199157"},"publishReplay.js":{"size":619,"integrity":{"algorithm":"SHA256","hash":"0ed040dbd87c1786288d438c3e835f0ea293932983dd34288db36d6483953785","blockSize":4194304,"blocks":["0ed040dbd87c1786288d438c3e835f0ea293932983dd34288db36d6483953785"]},"offset":"31199518"},"race.js":{"size":397,"integrity":{"algorithm":"SHA256","hash":"e7a2ff3068be62e9f8e594c8e9045a0d73ec8831dc16c6f2b60be9b10631aed8","blockSize":4194304,"blocks":["e7a2ff3068be62e9f8e594c8e9045a0d73ec8831dc16c6f2b60be9b10631aed8"]},"offset":"31200137"},"raceWith.js":{"size":567,"integrity":{"algorithm":"SHA256","hash":"4c57eddb26d4b149e3fb1b3eaad684d4a30d4dd124f38484c5556547e12baa2c","blockSize":4194304,"blocks":["4c57eddb26d4b149e3fb1b3eaad684d4a30d4dd124f38484c5556547e12baa2c"]},"offset":"31200534"},"reduce.js":{"size":259,"integrity":{"algorithm":"SHA256","hash":"720b17ff8353a32ef11beb54b63e92962b603e6bcd88f49ef4db278c97fc9a1d","blockSize":4194304,"blocks":["720b17ff8353a32ef11beb54b63e92962b603e6bcd88f49ef4db278c97fc9a1d"]},"offset":"31201101"},"refCount.js":{"size":984,"integrity":{"algorithm":"SHA256","hash":"47cd1a480a68f58eb49b7c5072358d316d03110746132f575434b5b0b83c335c","blockSize":4194304,"blocks":["47cd1a480a68f58eb49b7c5072358d316d03110746132f575434b5b0b83c335c"]},"offset":"31201360"},"repeat.js":{"size":2263,"integrity":{"algorithm":"SHA256","hash":"ac181ffaa2322e39da3aa81d7e3b082635114db874a456197489afa5faf75e8d","blockSize":4194304,"blocks":["ac181ffaa2322e39da3aa81d7e3b082635114db874a456197489afa5faf75e8d"]},"offset":"31202344"},"repeatWhen.js":{"size":1732,"integrity":{"algorithm":"SHA256","hash":"b600ee2575d56303d5b7da8ed0c6656f77a5cc77b137b24fbd7650c573165a20","blockSize":4194304,"blocks":["b600ee2575d56303d5b7da8ed0c6656f77a5cc77b137b24fbd7650c573165a20"]},"offset":"31204607"},"retry.js":{"size":2810,"integrity":{"algorithm":"SHA256","hash":"b84038f476a47c5bed7cc177f3c10286c31d109987ba9b5b0ffc432afd0b01e2","blockSize":4194304,"blocks":["b84038f476a47c5bed7cc177f3c10286c31d109987ba9b5b0ffc432afd0b01e2"]},"offset":"31206339"},"retryWhen.js":{"size":1167,"integrity":{"algorithm":"SHA256","hash":"af58e70b347e4f411da71608b5330317a71b2fcb6c1836a84c9199cf29082a0e","blockSize":4194304,"blocks":["af58e70b347e4f411da71608b5330317a71b2fcb6c1836a84c9199cf29082a0e"]},"offset":"31209149"},"sample.js":{"size":772,"integrity":{"algorithm":"SHA256","hash":"bbd6693290b67b2a56a8ea72c51b157ac93e2400b74f12eec15672168bfd84f9","blockSize":4194304,"blocks":["bbd6693290b67b2a56a8ea72c51b157ac93e2400b74f12eec15672168bfd84f9"]},"offset":"31210316"},"sampleTime.js":{"size":337,"integrity":{"algorithm":"SHA256","hash":"0d8ebe239d9733975d365f25e369277c7093388a198d10f3d8bbcc9ffa4ab79b","blockSize":4194304,"blocks":["0d8ebe239d9733975d365f25e369277c7093388a198d10f3d8bbcc9ffa4ab79b"]},"offset":"31211088"},"scan.js":{"size":248,"integrity":{"algorithm":"SHA256","hash":"1b7c8898259705e8346fe6d8b0d3fa940214785e6a250a28cc12b7d85090457f","blockSize":4194304,"blocks":["1b7c8898259705e8346fe6d8b0d3fa940214785e6a250a28cc12b7d85090457f"]},"offset":"31211425"},"scanInternals.js":{"size":822,"integrity":{"algorithm":"SHA256","hash":"b7368bbba42776005d0dcfb2710055257bf235353b8beb269f89636363a9467e","blockSize":4194304,"blocks":["b7368bbba42776005d0dcfb2710055257bf235353b8beb269f89636363a9467e"]},"offset":"31211673"},"sequenceEqual.js":{"size":1653,"integrity":{"algorithm":"SHA256","hash":"f97a1a6ee62c89873529b6dfd55a209dac89d160f738619db0a8e8183954796a","blockSize":4194304,"blocks":["f97a1a6ee62c89873529b6dfd55a209dac89d160f738619db0a8e8183954796a"]},"offset":"31212495"},"share.js":{"size":3359,"integrity":{"algorithm":"SHA256","hash":"f78c9a412e818afb2f25524cc2e745d83dffec301687f4c3f7f0601d79fa3cc5","blockSize":4194304,"blocks":["f78c9a412e818afb2f25524cc2e745d83dffec301687f4c3f7f0601d79fa3cc5"]},"offset":"31214148"},"shareReplay.js":{"size":983,"integrity":{"algorithm":"SHA256","hash":"8e8ceb8beaa8592d2eb7206c480daad10e9a57252a6158ef913f92204d110f8d","blockSize":4194304,"blocks":["8e8ceb8beaa8592d2eb7206c480daad10e9a57252a6158ef913f92204d110f8d"]},"offset":"31217507"},"single.js":{"size":1163,"integrity":{"algorithm":"SHA256","hash":"bc8895d7c0349775b592554bcb69fd2693a1495811c93d086599a18d4807b2d2","blockSize":4194304,"blocks":["bc8895d7c0349775b592554bcb69fd2693a1495811c93d086599a18d4807b2d2"]},"offset":"31218490"},"skip.js":{"size":166,"integrity":{"algorithm":"SHA256","hash":"f4a42ef34cfc7bd3a7383c049e319de6882246542dcc372de8fd5040d678d633","blockSize":4194304,"blocks":["f4a42ef34cfc7bd3a7383c049e319de6882246542dcc372de8fd5040d678d633"]},"offset":"31219653"},"skipLast.js":{"size":979,"integrity":{"algorithm":"SHA256","hash":"6b7c821c0d6988accd84b87ae5f677f5e6c29c050d334ce4a53b4b4508a0e6e4","blockSize":4194304,"blocks":["6b7c821c0d6988accd84b87ae5f677f5e6c29c050d334ce4a53b4b4508a0e6e4"]},"offset":"31219819"},"skipUntil.js":{"size":772,"integrity":{"algorithm":"SHA256","hash":"63d6032794ac80ddbc65e959fb33c086b5c0f95892040a2e009f58adcf58a43d","blockSize":4194304,"blocks":["63d6032794ac80ddbc65e959fb33c086b5c0f95892040a2e009f58adcf58a43d"]},"offset":"31220798"},"skipWhile.js":{"size":463,"integrity":{"algorithm":"SHA256","hash":"8f55ddd1800612d97b706c7bdc1c627d5ed61d9f29597f9127ac058ed6a82d72","blockSize":4194304,"blocks":["8f55ddd1800612d97b706c7bdc1c627d5ed61d9f29597f9127ac058ed6a82d72"]},"offset":"31221570"},"startWith.js":{"size":521,"integrity":{"algorithm":"SHA256","hash":"7664bdec2c285b0e3d19cca360bbc8a50cbd33b2ae3175c4be1a8d70d2c80969","blockSize":4194304,"blocks":["7664bdec2c285b0e3d19cca360bbc8a50cbd33b2ae3175c4be1a8d70d2c80969"]},"offset":"31222033"},"subscribeOn.js":{"size":334,"integrity":{"algorithm":"SHA256","hash":"e5986c170601b5e45606f00237437855b804866d1916ad1a1598600b00418e65","blockSize":4194304,"blocks":["e5986c170601b5e45606f00237437855b804866d1916ad1a1598600b00418e65"]},"offset":"31222554"},"switchAll.js":{"size":187,"integrity":{"algorithm":"SHA256","hash":"2e8fb688a61860ae09b066f9120267c7aa6af8d970feebaf5b545d761eee7450","blockSize":4194304,"blocks":["2e8fb688a61860ae09b066f9120267c7aa6af8d970feebaf5b545d761eee7450"]},"offset":"31222888"},"switchMap.js":{"size":1230,"integrity":{"algorithm":"SHA256","hash":"6f9772bc9409a8cc8f7e980b9aa6522ad1a1ec1693e3ffc38ffb8ecc2bc91471","blockSize":4194304,"blocks":["6f9772bc9409a8cc8f7e980b9aa6522ad1a1ec1693e3ffc38ffb8ecc2bc91471"]},"offset":"31223075"},"switchMapTo.js":{"size":355,"integrity":{"algorithm":"SHA256","hash":"c4504c9b0a874bad6c309efcc0927dfd46f4374ad99b5a625e816d4cb37f913c","blockSize":4194304,"blocks":["c4504c9b0a874bad6c309efcc0927dfd46f4374ad99b5a625e816d4cb37f913c"]},"offset":"31224305"},"switchScan.js":{"size":512,"integrity":{"algorithm":"SHA256","hash":"2d78bd82882c84a0d011853d4c7be2da7af6985019e659afef995ba79c25a0c4","blockSize":4194304,"blocks":["2d78bd82882c84a0d011853d4c7be2da7af6985019e659afef995ba79c25a0c4"]},"offset":"31224660"},"take.js":{"size":689,"integrity":{"algorithm":"SHA256","hash":"946b943e18227c36f5b4d0cd73e1a26a94badb58c96ef65ebd1ccff30e232e24","blockSize":4194304,"blocks":["946b943e18227c36f5b4d0cd73e1a26a94badb58c96ef65ebd1ccff30e232e24"]},"offset":"31225172"},"takeLast.js":{"size":1387,"integrity":{"algorithm":"SHA256","hash":"4cf77de916ddbe43b5e2021890ada30bf525cf5d097f795096aceba27d78b39e","blockSize":4194304,"blocks":["4cf77de916ddbe43b5e2021890ada30bf525cf5d097f795096aceba27d78b39e"]},"offset":"31225861"},"takeUntil.js":{"size":521,"integrity":{"algorithm":"SHA256","hash":"bb0214748909c323a2d52f0323ffed9fe7a67c2684e9b210e5740895e3e7ffbc","blockSize":4194304,"blocks":["bb0214748909c323a2d52f0323ffed9fe7a67c2684e9b210e5740895e3e7ffbc"]},"offset":"31227248"},"takeWhile.js":{"size":582,"integrity":{"algorithm":"SHA256","hash":"ac96bbaa6ee5a0eb6d9a62146e701be503eabc653e19fb7d87ebd6b3c454d679","blockSize":4194304,"blocks":["ac96bbaa6ee5a0eb6d9a62146e701be503eabc653e19fb7d87ebd6b3c454d679"]},"offset":"31227769"},"tap.js":{"size":1784,"integrity":{"algorithm":"SHA256","hash":"b5a27ecd0dc9b6a226db791db71225ef10727194a650c9727571da48805bb09a","blockSize":4194304,"blocks":["b5a27ecd0dc9b6a226db791db71225ef10727194a650c9727571da48805bb09a"]},"offset":"31228351"},"throttle.js":{"size":1961,"integrity":{"algorithm":"SHA256","hash":"818931e6d93535907b35951062bfc5c23b649e419bc58d511a038d39326be003","blockSize":4194304,"blocks":["818931e6d93535907b35951062bfc5c23b649e419bc58d511a038d39326be003"]},"offset":"31230135"},"throttleTime.js":{"size":499,"integrity":{"algorithm":"SHA256","hash":"03a5ef496d1766a8abc0bd203f1976c35f13f83847940503242d538a46001ffe","blockSize":4194304,"blocks":["03a5ef496d1766a8abc0bd203f1976c35f13f83847940503242d538a46001ffe"]},"offset":"31232096"},"throwIfEmpty.js":{"size":721,"integrity":{"algorithm":"SHA256","hash":"6ac35c2bb7e2ed5b2724b3ec31c73844135a8cac7c14d90cde1e377d884be6e3","blockSize":4194304,"blocks":["6ac35c2bb7e2ed5b2724b3ec31c73844135a8cac7c14d90cde1e377d884be6e3"]},"offset":"31232595"},"timeInterval.js":{"size":862,"integrity":{"algorithm":"SHA256","hash":"552c38c650ddb29882ddc0d4b4906bc5923c0adf735f8313c335a6a04e1c7250","blockSize":4194304,"blocks":["552c38c650ddb29882ddc0d4b4906bc5923c0adf735f8313c335a6a04e1c7250"]},"offset":"31233316"},"timeout.js":{"size":2858,"integrity":{"algorithm":"SHA256","hash":"66707531497fb9a245723f4a882b0971ca03011ed5e40ef23cf2974befd63a8d","blockSize":4194304,"blocks":["66707531497fb9a245723f4a882b0971ca03011ed5e40ef23cf2974befd63a8d"]},"offset":"31234178"},"timeoutWith.js":{"size":870,"integrity":{"algorithm":"SHA256","hash":"739ce723fb54b3e1415c28acbf988a076cd3bb4a1ac99632dfb95604a70abaa5","blockSize":4194304,"blocks":["739ce723fb54b3e1415c28acbf988a076cd3bb4a1ac99632dfb95604a70abaa5"]},"offset":"31237036"},"timestamp.js":{"size":377,"integrity":{"algorithm":"SHA256","hash":"8e07352db00a261a02e61ec96c51d972c8959b1a82167895da19b18e7260d637","blockSize":4194304,"blocks":["8e07352db00a261a02e61ec96c51d972c8959b1a82167895da19b18e7260d637"]},"offset":"31237906"},"toArray.js":{"size":336,"integrity":{"algorithm":"SHA256","hash":"1ab6c9ab411bb15f4258c095beba748a56f659ca8a6dbd7260d882131d8f524c","blockSize":4194304,"blocks":["1ab6c9ab411bb15f4258c095beba748a56f659ca8a6dbd7260d882131d8f524c"]},"offset":"31238283"},"window.js":{"size":1234,"integrity":{"algorithm":"SHA256","hash":"2685e47d40874f3b62b50500df4a2c9105d8cce64c84127bd8eb9bd3ba1393eb","blockSize":4194304,"blocks":["2685e47d40874f3b62b50500df4a2c9105d8cce64c84127bd8eb9bd3ba1393eb"]},"offset":"31238619"},"windowCount.js":{"size":2066,"integrity":{"algorithm":"SHA256","hash":"484247ec6015e4a59f71d162892f38758daccac886893633d82aad04ec536a2d","blockSize":4194304,"blocks":["484247ec6015e4a59f71d162892f38758daccac886893633d82aad04ec536a2d"]},"offset":"31239853"},"windowTime.js":{"size":2959,"integrity":{"algorithm":"SHA256","hash":"0ec4e5342049a396dcc526d6e74931c6a5238e4cfb791d50a29abe57541ada02","blockSize":4194304,"blocks":["0ec4e5342049a396dcc526d6e74931c6a5238e4cfb791d50a29abe57541ada02"]},"offset":"31241919"},"windowToggle.js":{"size":2684,"integrity":{"algorithm":"SHA256","hash":"63a69a4a8624e831c2e2c9053b45a79b0733dd2dbee02e286e3a62771fda307b","blockSize":4194304,"blocks":["63a69a4a8624e831c2e2c9053b45a79b0733dd2dbee02e286e3a62771fda307b"]},"offset":"31244878"},"windowWhen.js":{"size":1613,"integrity":{"algorithm":"SHA256","hash":"67aacab9a6cbc7909fc4c5e9ac9d9f0c091eedbbe67a741d809e3418c52005ec","blockSize":4194304,"blocks":["67aacab9a6cbc7909fc4c5e9ac9d9f0c091eedbbe67a741d809e3418c52005ec"]},"offset":"31247562"},"withLatestFrom.js":{"size":1585,"integrity":{"algorithm":"SHA256","hash":"2fa4973c70e4f5ba26e565379db0fe6c2b35f52ef579fc23382220612840263a","blockSize":4194304,"blocks":["2fa4973c70e4f5ba26e565379db0fe6c2b35f52ef579fc23382220612840263a"]},"offset":"31249175"},"zip.js":{"size":471,"integrity":{"algorithm":"SHA256","hash":"a34151a4d387c8fa5295f1d985165bf38e3edafb87bfbe0478895e54461755b0","blockSize":4194304,"blocks":["a34151a4d387c8fa5295f1d985165bf38e3edafb87bfbe0478895e54461755b0"]},"offset":"31250760"},"zipAll.js":{"size":209,"integrity":{"algorithm":"SHA256","hash":"185c0ae906baa9194eebb3e5ba72ab209bf7c6d9675461ebad3b57ba21c76f5d","blockSize":4194304,"blocks":["185c0ae906baa9194eebb3e5ba72ab209bf7c6d9675461ebad3b57ba21c76f5d"]},"offset":"31251231"},"zipWith.js":{"size":336,"integrity":{"algorithm":"SHA256","hash":"0b3ae71a7cbed0cf925d1d64b9475518bd6cea98237b8dda7114920be41775aa","blockSize":4194304,"blocks":["0b3ae71a7cbed0cf925d1d64b9475518bd6cea98237b8dda7114920be41775aa"]},"offset":"31251440"}}},"observable":{"files":{"ConnectableObservable.js":{"size":2506,"integrity":{"algorithm":"SHA256","hash":"d3b1ce18375253c7b826aa41dd96be9787b36a5e9d282dc0863c61e4074d7d98","blockSize":4194304,"blocks":["d3b1ce18375253c7b826aa41dd96be9787b36a5e9d282dc0863c61e4074d7d98"]},"offset":"31251776"},"bindCallback.js":{"size":261,"integrity":{"algorithm":"SHA256","hash":"1d38189d2791a28b5715a4c9761528818eccbda19701baf717a5d5229c81040a","blockSize":4194304,"blocks":["1d38189d2791a28b5715a4c9761528818eccbda19701baf717a5d5229c81040a"]},"offset":"31254282"},"bindCallbackInternals.js":{"size":3027,"integrity":{"algorithm":"SHA256","hash":"28fc884593f3022f931c9427521ec733ae9e64be65938b6b8e687912770e0842","blockSize":4194304,"blocks":["28fc884593f3022f931c9427521ec733ae9e64be65938b6b8e687912770e0842"]},"offset":"31254543"},"bindNodeCallback.js":{"size":268,"integrity":{"algorithm":"SHA256","hash":"cdf38b1927b8f7d1b753b815e16ab329c024d4cb2d07254cf2032772f67f3dc5","blockSize":4194304,"blocks":["cdf38b1927b8f7d1b753b815e16ab329c024d4cb2d07254cf2032772f67f3dc5"]},"offset":"31257570"},"combineLatest.js":{"size":2814,"integrity":{"algorithm":"SHA256","hash":"cb1ca202d1a448cb93d7900f7a50c74a32d85f9e0b73658935de8acba48a14f6","blockSize":4194304,"blocks":["cb1ca202d1a448cb93d7900f7a50c74a32d85f9e0b73658935de8acba48a14f6"]},"offset":"31257838"},"concat.js":{"size":358,"integrity":{"algorithm":"SHA256","hash":"c5aea4e78e2aabaabb599c024d19cdb1bcdc43db811c931511af1234af721ae0","blockSize":4194304,"blocks":["c5aea4e78e2aabaabb599c024d19cdb1bcdc43db811c931511af1234af721ae0"]},"offset":"31260652"},"connectable.js":{"size":1012,"integrity":{"algorithm":"SHA256","hash":"5555ca4377a27887ccfa2141e66408581532cde18165528722b52aa38ad4b0b4","blockSize":4194304,"blocks":["5555ca4377a27887ccfa2141e66408581532cde18165528722b52aa38ad4b0b4"]},"offset":"31261010"},"defer.js":{"size":283,"integrity":{"algorithm":"SHA256","hash":"1745d75e2012585e5c08961e91d7cc5eb8822418b698e9f192bcbc25e924ff98","blockSize":4194304,"blocks":["1745d75e2012585e5c08961e91d7cc5eb8822418b698e9f192bcbc25e924ff98"]},"offset":"31262022"},"empty.js":{"size":431,"integrity":{"algorithm":"SHA256","hash":"e9632292c22ebaed345ce7865ee86bca5b9fd66fc87f18362a333270ddf453c9","blockSize":4194304,"blocks":["e9632292c22ebaed345ce7865ee86bca5b9fd66fc87f18362a333270ddf453c9"]},"offset":"31262305"},"forkJoin.js":{"size":1967,"integrity":{"algorithm":"SHA256","hash":"9711bc474a7160b87be475447eb0aab80ba775e53daed1c52fbbbcb99391d489","blockSize":4194304,"blocks":["9711bc474a7160b87be475447eb0aab80ba775e53daed1c52fbbbcb99391d489"]},"offset":"31262736"},"from.js":{"size":239,"integrity":{"algorithm":"SHA256","hash":"04774464751b291738f9331945e57ac84b11886da645e3d6b04306adbbeabed2","blockSize":4194304,"blocks":["04774464751b291738f9331945e57ac84b11886da645e3d6b04306adbbeabed2"]},"offset":"31264703"},"fromEvent.js":{"size":2564,"integrity":{"algorithm":"SHA256","hash":"d199883751a4f3791ff40103ca7b1063dd42b428df864dd24ada4300670ebcd2","blockSize":4194304,"blocks":["d199883751a4f3791ff40103ca7b1063dd42b428df864dd24ada4300670ebcd2"]},"offset":"31264942"},"fromEventPattern.js":{"size":871,"integrity":{"algorithm":"SHA256","hash":"57e35917a6d0258829271ba06fd3bb452168b6d61fa20b038ec2d57c4ae8fcb8","blockSize":4194304,"blocks":["57e35917a6d0258829271ba06fd3bb452168b6d61fa20b038ec2d57c4ae8fcb8"]},"offset":"31267506"},"fromSubscribable.js":{"size":236,"integrity":{"algorithm":"SHA256","hash":"8287d22e7cc1d561d6f76670afc608f75956fba094989da8c7cf2da9a447d4f9","blockSize":4194304,"blocks":["8287d22e7cc1d561d6f76670afc608f75956fba094989da8c7cf2da9a447d4f9"]},"offset":"31268377"},"generate.js":{"size":1796,"integrity":{"algorithm":"SHA256","hash":"f41d075597b7cb53f4a7c4c2139ed131c20a58b6e1e49c50bb53534e23bf4a55","blockSize":4194304,"blocks":["f41d075597b7cb53f4a7c4c2139ed131c20a58b6e1e49c50bb53534e23bf4a55"]},"offset":"31268613"},"iif.js":{"size":208,"integrity":{"algorithm":"SHA256","hash":"800c89ba8eda8e9a6be1352ca8f52c025eb4ca84dbc10f25f6096f8436680bce","blockSize":4194304,"blocks":["800c89ba8eda8e9a6be1352ca8f52c025eb4ca84dbc10f25f6096f8436680bce"]},"offset":"31270409"},"innerFrom.js":{"size":5385,"integrity":{"algorithm":"SHA256","hash":"1cf49be998f2042a0bee6b1dc22ced8c9659e986e00c9d32348c784cad773dc2","blockSize":4194304,"blocks":["1cf49be998f2042a0bee6b1dc22ced8c9659e986e00c9d32348c784cad773dc2"]},"offset":"31270617"},"interval.js":{"size":368,"integrity":{"algorithm":"SHA256","hash":"ff3e45aeea10af23b5de551ca7658375e6c19c23bffcfcd32e5a616b1589b406","blockSize":4194304,"blocks":["ff3e45aeea10af23b5de551ca7658375e6c19c23bffcfcd32e5a616b1589b406"]},"offset":"31276002"},"merge.js":{"size":711,"integrity":{"algorithm":"SHA256","hash":"6649dc6e96f412d9ee1f7bf3276a1ca34216f688e6883fcc686c438afedcb600","blockSize":4194304,"blocks":["6649dc6e96f412d9ee1f7bf3276a1ca34216f688e6883fcc686c438afedcb600"]},"offset":"31276370"},"never.js":{"size":201,"integrity":{"algorithm":"SHA256","hash":"304314ee3f97656fde47c38b5737342d3de98eaacd3081b53f2a472bf2def028","blockSize":4194304,"blocks":["304314ee3f97656fde47c38b5737342d3de98eaacd3081b53f2a472bf2def028"]},"offset":"31277081"},"of.js":{"size":316,"integrity":{"algorithm":"SHA256","hash":"a83603650092c978bdd882052dfa4da21601c4abb96324619e1a29924e30a064","blockSize":4194304,"blocks":["a83603650092c978bdd882052dfa4da21601c4abb96324619e1a29924e30a064"]},"offset":"31277282"},"onErrorResumeNext.js":{"size":451,"integrity":{"algorithm":"SHA256","hash":"4d1569e4310a945b85381b8a542b5cbde8c777ea8e1d03eecd6bdb3de5ec8e2d","blockSize":4194304,"blocks":["4d1569e4310a945b85381b8a542b5cbde8c777ea8e1d03eecd6bdb3de5ec8e2d"]},"offset":"31277598"},"pairs.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"175d6a4d26640f417bb8edd24b6377359ad169d3de41ed9a48caf51378fb84aa","blockSize":4194304,"blocks":["175d6a4d26640f417bb8edd24b6377359ad169d3de41ed9a48caf51378fb84aa"]},"offset":"31278049"},"partition.js":{"size":329,"integrity":{"algorithm":"SHA256","hash":"b30a3137ff0850558c3e4a153833ec08a730f94112a20f988307d31861196abb","blockSize":4194304,"blocks":["b30a3137ff0850558c3e4a153833ec08a730f94112a20f988307d31861196abb"]},"offset":"31278204"},"race.js":{"size":1242,"integrity":{"algorithm":"SHA256","hash":"adac46f5205767a88881bbca4b2a30fd94e4a66afdfc0736996abc058db96645","blockSize":4194304,"blocks":["adac46f5205767a88881bbca4b2a30fd94e4a66afdfc0736996abc058db96645"]},"offset":"31278533"},"range.js":{"size":1004,"integrity":{"algorithm":"SHA256","hash":"c1123a2a08f63b6361f7b3390e2136528f37e55ce7d301f5215e5146ad36126e","blockSize":4194304,"blocks":["c1123a2a08f63b6361f7b3390e2136528f37e55ce7d301f5215e5146ad36126e"]},"offset":"31279775"},"throwError.js":{"size":522,"integrity":{"algorithm":"SHA256","hash":"66b9a616f45e25a2805dac2f51b81ae3dceea58cf7a844c99bb9660f11049c2d","blockSize":4194304,"blocks":["66b9a616f45e25a2805dac2f51b81ae3dceea58cf7a844c99bb9660f11049c2d"]},"offset":"31280779"},"timer.js":{"size":1242,"integrity":{"algorithm":"SHA256","hash":"ccabc794b49bb00f45b30226c0050284ab74a071cd76ea195657aadb3cdd2a3c","blockSize":4194304,"blocks":["ccabc794b49bb00f45b30226c0050284ab74a071cd76ea195657aadb3cdd2a3c"]},"offset":"31281301"},"using.js":{"size":580,"integrity":{"algorithm":"SHA256","hash":"0998fa098db01be875b72aa678f07dbdb43f1919fcb004ce806f93466eff7a08","blockSize":4194304,"blocks":["0998fa098db01be875b72aa678f07dbdb43f1919fcb004ce806f93466eff7a08"]},"offset":"31282543"},"zip.js":{"size":2136,"integrity":{"algorithm":"SHA256","hash":"b8e52c954c42eb8987a09f12643684aebb9a0f737f7c10427237651a9bdd8427","blockSize":4194304,"blocks":["b8e52c954c42eb8987a09f12643684aebb9a0f737f7c10427237651a9bdd8427"]},"offset":"31283123"},"dom":{"files":{"WebSocketSubject.js":{"size":7992,"integrity":{"algorithm":"SHA256","hash":"26fefc95696e5da65b969212a5eda2d4a76f372fa7b2dc5437bc3e14355e23f0","blockSize":4194304,"blocks":["26fefc95696e5da65b969212a5eda2d4a76f372fa7b2dc5437bc3e14355e23f0"]},"offset":"31285259"},"animationFrames.js":{"size":1259,"integrity":{"algorithm":"SHA256","hash":"1d7a589c22f38ddb73c826a0518414801e793e6ab0328f048f61d6c7a9e00382","blockSize":4194304,"blocks":["1d7a589c22f38ddb73c826a0518414801e793e6ab0328f048f61d6c7a9e00382"]},"offset":"31293251"},"fetch.js":{"size":2096,"integrity":{"algorithm":"SHA256","hash":"6f975f74054158b1c3d39de0bffe36d2d6f5f193b32c7ed188baa41e208bc06d","blockSize":4194304,"blocks":["6f975f74054158b1c3d39de0bffe36d2d6f5f193b32c7ed188baa41e208bc06d"]},"offset":"31294510"},"webSocket.js":{"size":193,"integrity":{"algorithm":"SHA256","hash":"e573d4a26c8af0d27e7e55106a3017238707c868515fab8911baa3d1bac92c05","blockSize":4194304,"blocks":["e573d4a26c8af0d27e7e55106a3017238707c868515fab8911baa3d1bac92c05"]},"offset":"31296606"}}}}},"ajax":{"files":{"AjaxResponse.js":{"size":1232,"integrity":{"algorithm":"SHA256","hash":"42abf022d9818a6290db25988b1467f714934cf85d77fab2664a69319d134821","blockSize":4194304,"blocks":["42abf022d9818a6290db25988b1467f714934cf85d77fab2664a69319d134821"]},"offset":"31296799"},"ajax.js":{"size":10163,"integrity":{"algorithm":"SHA256","hash":"481b6c6bf76bf09c7ae9639f8739ffa778a9069aa89c5e2c376c3ccb9cebe5be","blockSize":4194304,"blocks":["481b6c6bf76bf09c7ae9639f8739ffa778a9069aa89c5e2c376c3ccb9cebe5be"]},"offset":"31298031"},"errors.js":{"size":1008,"integrity":{"algorithm":"SHA256","hash":"8c3d59d6438e2f39120f6b8c211778ff9eafc65e75d4bcd730a73820ff43192e","blockSize":4194304,"blocks":["8c3d59d6438e2f39120f6b8c211778ff9eafc65e75d4bcd730a73820ff43192e"]},"offset":"31308194"},"getXHRResponse.js":{"size":670,"integrity":{"algorithm":"SHA256","hash":"f9d2d7bdfdbc7ef4ab328dded7d9f157aec8e32a53701d299c45312f794bb39f","blockSize":4194304,"blocks":["f9d2d7bdfdbc7ef4ab328dded7d9f157aec8e32a53701d299c45312f794bb39f"]},"offset":"31309202"},"types.js":{"size":44,"integrity":{"algorithm":"SHA256","hash":"01ae2a5b120382f9a648ced7ee8507493a134f216d100fc61600c6c9738235d2","blockSize":4194304,"blocks":["01ae2a5b120382f9a648ced7ee8507493a134f216d100fc61600c6c9738235d2"]},"offset":"31309872"}}}}},"fetch":{"files":{"index.js":{"size":95,"integrity":{"algorithm":"SHA256","hash":"627e8845399533ed35b527db722369142ac804e5aa8e949811335dbdc762ad32","blockSize":4194304,"blocks":["627e8845399533ed35b527db722369142ac804e5aa8e949811335dbdc762ad32"]},"offset":"31309916"}}},"ajax":{"files":{"index.js":{"size":212,"integrity":{"algorithm":"SHA256","hash":"02f835fb3411417fceaa3e75db8bcd020af4efc9955e8db6292925a79e74e08e","blockSize":4194304,"blocks":["02f835fb3411417fceaa3e75db8bcd020af4efc9955e8db6292925a79e74e08e"]},"offset":"31310011"}}}}},"esm":{"files":{"index.js":{"size":10038,"integrity":{"algorithm":"SHA256","hash":"b31b8593af1087007067a68d62396c1b3f7a20c3ece3a5aa33b1cc337af18369","blockSize":4194304,"blocks":["b31b8593af1087007067a68d62396c1b3f7a20c3ece3a5aa33b1cc337af18369"]},"offset":"31310223"},"webSocket":{"files":{"index.js":{"size":192,"integrity":{"algorithm":"SHA256","hash":"0c15decd4814e4f108c2787d5039d3876b803c2aeb723be31c59c1d2fe07af4a","blockSize":4194304,"blocks":["0c15decd4814e4f108c2787d5039d3876b803c2aeb723be31c59c1d2fe07af4a"]},"offset":"31320261"}}},"testing":{"files":{"index.js":{"size":100,"integrity":{"algorithm":"SHA256","hash":"fe3ac918cc943472c5bfc67b826ae73a295eda35a7882979e1cb426094b64da1","blockSize":4194304,"blocks":["fe3ac918cc943472c5bfc67b826ae73a295eda35a7882979e1cb426094b64da1"]},"offset":"31320453"}}},"operators":{"files":{"index.js":{"size":6872,"integrity":{"algorithm":"SHA256","hash":"d7b498591882ace6fa2e3257898d588e8524b349bd091399f90423d3dc5836bd","blockSize":4194304,"blocks":["d7b498591882ace6fa2e3257898d588e8524b349bd091399f90423d3dc5836bd"]},"offset":"31320553"}}},"internal":{"files":{"AnyCatcher.js":{"size":49,"integrity":{"algorithm":"SHA256","hash":"4715726f08eb6ee9697a68353f4b48e2ebdf64cb4e58f7d1927f05fb77e1483b","blockSize":4194304,"blocks":["4715726f08eb6ee9697a68353f4b48e2ebdf64cb4e58f7d1927f05fb77e1483b"]},"offset":"31327425"},"AsyncSubject.js":{"size":991,"integrity":{"algorithm":"SHA256","hash":"f548c90a674554db8667c3cb56accc5a6d87b13c6eb953b303d416e1e46e1886","blockSize":4194304,"blocks":["f548c90a674554db8667c3cb56accc5a6d87b13c6eb953b303d416e1e46e1886"]},"offset":"31327474"},"BehaviorSubject.js":{"size":714,"integrity":{"algorithm":"SHA256","hash":"bde1261bf877780f20fa21de1ac7149d54372600346d6937e2916a6375e6a9ac","blockSize":4194304,"blocks":["bde1261bf877780f20fa21de1ac7149d54372600346d6937e2916a6375e6a9ac"]},"offset":"31328465"},"Notification.js":{"size":2807,"integrity":{"algorithm":"SHA256","hash":"627f70eba0a162e4b1887d33bb484d766431fe27ceb76bf1250ef65851a426d5","blockSize":4194304,"blocks":["627f70eba0a162e4b1887d33bb484d766431fe27ceb76bf1250ef65851a426d5"]},"offset":"31329179"},"NotificationFactories.js":{"size":463,"integrity":{"algorithm":"SHA256","hash":"37ef7d559774abb406204a66504793ca208a515b40854edeea06d4035a4f8179","blockSize":4194304,"blocks":["37ef7d559774abb406204a66504793ca208a515b40854edeea06d4035a4f8179"]},"offset":"31331986"},"Observable.js":{"size":3147,"integrity":{"algorithm":"SHA256","hash":"b813bb282ba4ca02542ec65f44c75cdef2f633734d8db0a0d454cfdcace742ae","blockSize":4194304,"blocks":["b813bb282ba4ca02542ec65f44c75cdef2f633734d8db0a0d454cfdcace742ae"]},"offset":"31332449"},"Operator.js":{"size":47,"integrity":{"algorithm":"SHA256","hash":"e4fd11ca5599269162de095536f1b9de1c68df04c496ac5a0e10f8b0a4a26bbe","blockSize":4194304,"blocks":["e4fd11ca5599269162de095536f1b9de1c68df04c496ac5a0e10f8b0a4a26bbe"]},"offset":"31335596"},"ReplaySubject.js":{"size":2128,"integrity":{"algorithm":"SHA256","hash":"1eb18cb186ed768e146cbd7e86e12b7d92b34e8ef89c8897b4245336e660de3d","blockSize":4194304,"blocks":["1eb18cb186ed768e146cbd7e86e12b7d92b34e8ef89c8897b4245336e660de3d"]},"offset":"31335643"},"Scheduler.js":{"size":453,"integrity":{"algorithm":"SHA256","hash":"5a6cc5aa83fd441a40bb8451308bfe5f689c4c8b5ee152ccc50692098d118775","blockSize":4194304,"blocks":["5a6cc5aa83fd441a40bb8451308bfe5f689c4c8b5ee152ccc50692098d118775"]},"offset":"31337771"},"Subject.js":{"size":4380,"integrity":{"algorithm":"SHA256","hash":"f15550836a42b0b38e5ecf2cf8d1062e0d9d05c87966fafed636d9e0c1fbe596","blockSize":4194304,"blocks":["f15550836a42b0b38e5ecf2cf8d1062e0d9d05c87966fafed636d9e0c1fbe596"]},"offset":"31338224"},"Subscriber.js":{"size":5128,"integrity":{"algorithm":"SHA256","hash":"506f3a2dd35a0760098a8cc4202c69770739a2ccec4d1fe46c2fb4dac512d5d8","blockSize":4194304,"blocks":["506f3a2dd35a0760098a8cc4202c69770739a2ccec4d1fe46c2fb4dac512d5d8"]},"offset":"31342604"},"Subscription.js":{"size":4014,"integrity":{"algorithm":"SHA256","hash":"f2a80cc2f12276f52d3c5ea61e07d4bf47bfe3b2522406de9999c56a9a01ffac","blockSize":4194304,"blocks":["f2a80cc2f12276f52d3c5ea61e07d4bf47bfe3b2522406de9999c56a9a01ffac"]},"offset":"31347732"},"config.js":{"size":233,"integrity":{"algorithm":"SHA256","hash":"179a9501c187ebf6b55d1aaf921c5b58b01795b289d1e58ced2e81d69f97d1ca","blockSize":4194304,"blocks":["179a9501c187ebf6b55d1aaf921c5b58b01795b289d1e58ced2e81d69f97d1ca"]},"offset":"31351746"},"firstValueFrom.js":{"size":770,"integrity":{"algorithm":"SHA256","hash":"917a2814d01f2abef419b78117cdc64f7b5cbafc6d3c43fd34ae1d48ebe4812e","blockSize":4194304,"blocks":["917a2814d01f2abef419b78117cdc64f7b5cbafc6d3c43fd34ae1d48ebe4812e"]},"offset":"31351979"},"lastValueFrom.js":{"size":798,"integrity":{"algorithm":"SHA256","hash":"9f31b6e5e61fd1257d4ebc24b67faadf836986880c46dbc660e301c8f5cd2e82","blockSize":4194304,"blocks":["9f31b6e5e61fd1257d4ebc24b67faadf836986880c46dbc660e301c8f5cd2e82"]},"offset":"31352749"},"types.js":{"size":44,"integrity":{"algorithm":"SHA256","hash":"01ae2a5b120382f9a648ced7ee8507493a134f216d100fc61600c6c9738235d2","blockSize":4194304,"blocks":["01ae2a5b120382f9a648ced7ee8507493a134f216d100fc61600c6c9738235d2"]},"offset":"31353547"},"umd.js":{"size":448,"integrity":{"algorithm":"SHA256","hash":"5363f48fb52482299e3217b6afe7bc5baddd251bfb4863f403a6ef510e8db75b","blockSize":4194304,"blocks":["5363f48fb52482299e3217b6afe7bc5baddd251bfb4863f403a6ef510e8db75b"]},"offset":"31353591"},"util":{"files":{"ArgumentOutOfRangeError.js":{"size":324,"integrity":{"algorithm":"SHA256","hash":"fd0357e662ed3c422ea75948447f4544752667a063a20b0e0ea39655c9a7edee","blockSize":4194304,"blocks":["fd0357e662ed3c422ea75948447f4544752667a063a20b0e0ea39655c9a7edee"]},"offset":"31354039"},"EmptyError.js":{"size":274,"integrity":{"algorithm":"SHA256","hash":"41485f87afa6f406aeda9feca0f330d6217b70b9410a09979397739f2980964c","blockSize":4194304,"blocks":["41485f87afa6f406aeda9feca0f330d6217b70b9410a09979397739f2980964c"]},"offset":"31354363"},"Immediate.js":{"size":729,"integrity":{"algorithm":"SHA256","hash":"9906856f9ffaaa4081ae668d62f92df3232d65adc644aa8f83e7e82e20cf9349","blockSize":4194304,"blocks":["9906856f9ffaaa4081ae668d62f92df3232d65adc644aa8f83e7e82e20cf9349"]},"offset":"31354637"},"NotFoundError.js":{"size":275,"integrity":{"algorithm":"SHA256","hash":"1c928814a4185fe0712001d115e80d566fd2e7497b82ff3b0035120501453f0b","blockSize":4194304,"blocks":["1c928814a4185fe0712001d115e80d566fd2e7497b82ff3b0035120501453f0b"]},"offset":"31355366"},"ObjectUnsubscribedError.js":{"size":322,"integrity":{"algorithm":"SHA256","hash":"1672497a70bc516828a9846b6c50942ac4f810adcdcc9086c51a5d035c27423c","blockSize":4194304,"blocks":["1672497a70bc516828a9846b6c50942ac4f810adcdcc9086c51a5d035c27423c"]},"offset":"31355641"},"SequenceError.js":{"size":275,"integrity":{"algorithm":"SHA256","hash":"0ecf9c49bcaa815a944c9e09688e78d5898e442e37d809754158983fda4f28df","blockSize":4194304,"blocks":["0ecf9c49bcaa815a944c9e09688e78d5898e442e37d809754158983fda4f28df"]},"offset":"31355963"},"UnsubscriptionError.js":{"size":474,"integrity":{"algorithm":"SHA256","hash":"22991c6375965f31da85987980d11c18b5a54ef0d39d79b620ebcb015f84bcf5","blockSize":4194304,"blocks":["22991c6375965f31da85987980d11c18b5a54ef0d39d79b620ebcb015f84bcf5"]},"offset":"31356238"},"applyMixins.js":{"size":466,"integrity":{"algorithm":"SHA256","hash":"8fc5f370eb4f8f350c21b720b4c30df51f9d57e42cd2e56cea22f7df86551ee7","blockSize":4194304,"blocks":["8fc5f370eb4f8f350c21b720b4c30df51f9d57e42cd2e56cea22f7df86551ee7"]},"offset":"31356712"},"args.js":{"size":500,"integrity":{"algorithm":"SHA256","hash":"e2f25404843c7e5f790dc35eb36ee64930307c2918f66a5dfbc722eb53f484cf","blockSize":4194304,"blocks":["e2f25404843c7e5f790dc35eb36ee64930307c2918f66a5dfbc722eb53f484cf"]},"offset":"31357178"},"argsArgArrayOrObject.js":{"size":687,"integrity":{"algorithm":"SHA256","hash":"daf431e5ac405aaaf02da8de56b0c59184f04b23201f9f1025b69a86943d947f","blockSize":4194304,"blocks":["daf431e5ac405aaaf02da8de56b0c59184f04b23201f9f1025b69a86943d947f"]},"offset":"31357678"},"argsOrArgArray.js":{"size":177,"integrity":{"algorithm":"SHA256","hash":"7eb44c35ece3cec65af549274d6bfcd191d01c6e36c2f6c43c43b2c8ad8eb4ee","blockSize":4194304,"blocks":["7eb44c35ece3cec65af549274d6bfcd191d01c6e36c2f6c43c43b2c8ad8eb4ee"]},"offset":"31358365"},"arrRemove.js":{"size":184,"integrity":{"algorithm":"SHA256","hash":"f3a6e685cbb480d31ff00bdcea197f7d6ef16495daecbafad8e67267e63db039","blockSize":4194304,"blocks":["f3a6e685cbb480d31ff00bdcea197f7d6ef16495daecbafad8e67267e63db039"]},"offset":"31358542"},"createErrorClass.js":{"size":375,"integrity":{"algorithm":"SHA256","hash":"80eed1e91895f5da466d0748fddebd3930d4ec2adf21f5aa06425d2732ed5eac","blockSize":4194304,"blocks":["80eed1e91895f5da466d0748fddebd3930d4ec2adf21f5aa06425d2732ed5eac"]},"offset":"31358726"},"createObject.js":{"size":172,"integrity":{"algorithm":"SHA256","hash":"af66a698e6f860987686d9d59f89671e54c235f054b19caba33cbdcb0943133f","blockSize":4194304,"blocks":["af66a698e6f860987686d9d59f89671e54c235f054b19caba33cbdcb0943133f"]},"offset":"31359101"},"errorContext.js":{"size":726,"integrity":{"algorithm":"SHA256","hash":"34bef1bd5ad918cf8f3cf09b7aa4cfcd20a52e5aa56cba2141dc927b19d7aecc","blockSize":4194304,"blocks":["34bef1bd5ad918cf8f3cf09b7aa4cfcd20a52e5aa56cba2141dc927b19d7aecc"]},"offset":"31359273"},"executeSchedule.js":{"size":505,"integrity":{"algorithm":"SHA256","hash":"832c60171c09ac2a3dbedd4031210b4968f0b81248dbb1da4205f9a05bef69b3","blockSize":4194304,"blocks":["832c60171c09ac2a3dbedd4031210b4968f0b81248dbb1da4205f9a05bef69b3"]},"offset":"31359999"},"identity.js":{"size":82,"integrity":{"algorithm":"SHA256","hash":"c4dba24be1568acb8f377ca8cfd43f6bc9906eedcca0fb7e37c8f4229b12a9ff","blockSize":4194304,"blocks":["c4dba24be1568acb8f377ca8cfd43f6bc9906eedcca0fb7e37c8f4229b12a9ff"]},"offset":"31360504"},"isArrayLike.js":{"size":137,"integrity":{"algorithm":"SHA256","hash":"20b595b0c76b0aa6d6a2a782b1865d1a006b2776dec18956c21fd260df110650","blockSize":4194304,"blocks":["20b595b0c76b0aa6d6a2a782b1865d1a006b2776dec18956c21fd260df110650"]},"offset":"31360586"},"isAsyncIterable.js":{"size":243,"integrity":{"algorithm":"SHA256","hash":"671176e3b7d03cd00104660692ab1bc1c8ca5a50c3d9c9cb64c36dc5adbdfce0","blockSize":4194304,"blocks":["671176e3b7d03cd00104660692ab1bc1c8ca5a50c3d9c9cb64c36dc5adbdfce0"]},"offset":"31360723"},"isDate.js":{"size":124,"integrity":{"algorithm":"SHA256","hash":"43ed28f060cf4e6420c93823af21b92199daf9853d8eecb2b190b77d88b0c349","blockSize":4194304,"blocks":["43ed28f060cf4e6420c93823af21b92199daf9853d8eecb2b190b77d88b0c349"]},"offset":"31360966"},"isFunction.js":{"size":116,"integrity":{"algorithm":"SHA256","hash":"20008836b429fe5ed72ab8c15250e7ec3e96b2c50b80ffc23f27c645a73f9107","blockSize":4194304,"blocks":["20008836b429fe5ed72ab8c15250e7ec3e96b2c50b80ffc23f27c645a73f9107"]},"offset":"31361090"},"isInteropObservable.js":{"size":258,"integrity":{"algorithm":"SHA256","hash":"53633fc4df9318727b581500b3b4863b97354a7d172523a7b025c3695138a462","blockSize":4194304,"blocks":["53633fc4df9318727b581500b3b4863b97354a7d172523a7b025c3695138a462"]},"offset":"31361206"},"isIterable.js":{"size":278,"integrity":{"algorithm":"SHA256","hash":"6f3bb2ed0c3cc498b85e7e0c4a2bcb14b8dd0bc40ed85516a05e0a05e5ef420e","blockSize":4194304,"blocks":["6f3bb2ed0c3cc498b85e7e0c4a2bcb14b8dd0bc40ed85516a05e0a05e5ef420e"]},"offset":"31361464"},"isObservable.js":{"size":269,"integrity":{"algorithm":"SHA256","hash":"7f3f8eaf78b378e11277852059d9dead74f79490eff3cc7e1b11ab9ce186fb26","blockSize":4194304,"blocks":["7f3f8eaf78b378e11277852059d9dead74f79490eff3cc7e1b11ab9ce186fb26"]},"offset":"31361742"},"isPromise.js":{"size":198,"integrity":{"algorithm":"SHA256","hash":"460ac3d1f3acba5aa74ac5e505f53763746ffb224a891423cecc29f92d289e96","blockSize":4194304,"blocks":["460ac3d1f3acba5aa74ac5e505f53763746ffb224a891423cecc29f92d289e96"]},"offset":"31362011"},"isReadableStreamLike.js":{"size":831,"integrity":{"algorithm":"SHA256","hash":"083dd39f4f8b4b7e7fab4c5bea692a24e100f82832ee138d8914365a446a3941","blockSize":4194304,"blocks":["083dd39f4f8b4b7e7fab4c5bea692a24e100f82832ee138d8914365a446a3941"]},"offset":"31362209"},"isScheduler.js":{"size":169,"integrity":{"algorithm":"SHA256","hash":"97a5819db1ac87ee3d52043e3f95209e76c7f40327c67850d76d5afa65eaa669","blockSize":4194304,"blocks":["97a5819db1ac87ee3d52043e3f95209e76c7f40327c67850d76d5afa65eaa669"]},"offset":"31363040"},"lift.js":{"size":624,"integrity":{"algorithm":"SHA256","hash":"9071e4806e98139df9576e309a4066e16f1eb48bf3da64c39efe7928b7269fef","blockSize":4194304,"blocks":["9071e4806e98139df9576e309a4066e16f1eb48bf3da64c39efe7928b7269fef"]},"offset":"31363209"},"mapOneOrManyArgs.js":{"size":285,"integrity":{"algorithm":"SHA256","hash":"87fc27c529168002d5d941efcde2f14cc9ef9196166b9512c2cee2f3c6d9fd44","blockSize":4194304,"blocks":["87fc27c529168002d5d941efcde2f14cc9ef9196166b9512c2cee2f3c6d9fd44"]},"offset":"31363833"},"noop.js":{"size":59,"integrity":{"algorithm":"SHA256","hash":"fd939bf4ec30140a1be3960d4be464ffc5560862aa7b87cdff77a4ce8d24db6d","blockSize":4194304,"blocks":["fd939bf4ec30140a1be3960d4be464ffc5560862aa7b87cdff77a4ce8d24db6d"]},"offset":"31364118"},"not.js":{"size":134,"integrity":{"algorithm":"SHA256","hash":"4c9eee88175a7160366dbe23aec49262fd2f77161777cd218a6d6a96876fe54a","blockSize":4194304,"blocks":["4c9eee88175a7160366dbe23aec49262fd2f77161777cd218a6d6a96876fe54a"]},"offset":"31364177"},"pipe.js":{"size":390,"integrity":{"algorithm":"SHA256","hash":"d621dff45887bca424f85efcba78534846347c7c39ddeba9c81e233a33479697","blockSize":4194304,"blocks":["d621dff45887bca424f85efcba78534846347c7c39ddeba9c81e233a33479697"]},"offset":"31364311"},"reportUnhandledError.js":{"size":411,"integrity":{"algorithm":"SHA256","hash":"e5a0f29c256c3fdd507ed9d9971102814bd1b0a7db8f1808c4bfb54ad5522f5f","blockSize":4194304,"blocks":["e5a0f29c256c3fdd507ed9d9971102814bd1b0a7db8f1808c4bfb54ad5522f5f"]},"offset":"31364701"},"subscribeToArray.js":{"size":254,"integrity":{"algorithm":"SHA256","hash":"05f7ecc9238c749acdf72f5794844b202190f10c531224aa2e89caa1a328e31d","blockSize":4194304,"blocks":["05f7ecc9238c749acdf72f5794844b202190f10c531224aa2e89caa1a328e31d"]},"offset":"31365112"},"throwUnobservableError.js":{"size":356,"integrity":{"algorithm":"SHA256","hash":"317ae67b714e4ac7ec8d64bed8d74e08d6aac58467bb9824a5043b8d1c49d306","blockSize":4194304,"blocks":["317ae67b714e4ac7ec8d64bed8d74e08d6aac58467bb9824a5043b8d1c49d306"]},"offset":"31365366"},"workarounds.js":{"size":50,"integrity":{"algorithm":"SHA256","hash":"c008e3a59fb422b46404377acbd95e625891e3db47ffe5e30fc544d426d2eef0","blockSize":4194304,"blocks":["c008e3a59fb422b46404377acbd95e625891e3db47ffe5e30fc544d426d2eef0"]},"offset":"31365722"}}},"testing":{"files":{"ColdObservable.js":{"size":1439,"integrity":{"algorithm":"SHA256","hash":"453bb4447ad55fec315b00950139a0753910bc2c05c9ab7df78435f1562024aa","blockSize":4194304,"blocks":["453bb4447ad55fec315b00950139a0753910bc2c05c9ab7df78435f1562024aa"]},"offset":"31365772"},"HotObservable.js":{"size":1340,"integrity":{"algorithm":"SHA256","hash":"7a3f50113af018a61ab8b119d6423b1f7ce3c716c4d877a1c05fceb5762d557c","blockSize":4194304,"blocks":["7a3f50113af018a61ab8b119d6423b1f7ce3c716c4d877a1c05fceb5762d557c"]},"offset":"31367211"},"SubscriptionLog.js":{"size":247,"integrity":{"algorithm":"SHA256","hash":"2f3eceee85b0ab729d20a60dfe6bca1a30e456cfadc213bb29805ba7e1c8daa4","blockSize":4194304,"blocks":["2f3eceee85b0ab729d20a60dfe6bca1a30e456cfadc213bb29805ba7e1c8daa4"]},"offset":"31368551"},"SubscriptionLoggable.js":{"size":619,"integrity":{"algorithm":"SHA256","hash":"49cf0b0f4078ea1d744022efd5d147666e35d45df2b927cd8bb2dd7856089da0","blockSize":4194304,"blocks":["49cf0b0f4078ea1d744022efd5d147666e35d45df2b927cd8bb2dd7856089da0"]},"offset":"31368798"},"TestMessage.js":{"size":50,"integrity":{"algorithm":"SHA256","hash":"461551d4960477c5ee50965e5393760cb6d5f5c32348f3d977f5983133920540","blockSize":4194304,"blocks":["461551d4960477c5ee50965e5393760cb6d5f5c32348f3d977f5983133920540"]},"offset":"31369417"},"TestScheduler.js":{"size":21648,"integrity":{"algorithm":"SHA256","hash":"7c45f8c6787c6b98d8f3530edc39a40931f9c0d9a9339282f8595e0b7ad48fba","blockSize":4194304,"blocks":["7c45f8c6787c6b98d8f3530edc39a40931f9c0d9a9339282f8595e0b7ad48fba"]},"offset":"31369467"}}},"symbol":{"files":{"iterator.js":{"size":244,"integrity":{"algorithm":"SHA256","hash":"264e49f99425b7b77046066bb3258602726ccbf0f2f15a2346e1611cb4d2cb03","blockSize":4194304,"blocks":["264e49f99425b7b77046066bb3258602726ccbf0f2f15a2346e1611cb4d2cb03"]},"offset":"31391115"},"observable.js":{"size":145,"integrity":{"algorithm":"SHA256","hash":"41cf449072816dd790c5b7a56d1701ba919ba2dee87510f768cdd1395200c253","blockSize":4194304,"blocks":["41cf449072816dd790c5b7a56d1701ba919ba2dee87510f768cdd1395200c253"]},"offset":"31391359"}}},"scheduler":{"files":{"Action.js":{"size":245,"integrity":{"algorithm":"SHA256","hash":"edf226e9833547ce489fff2629e2528c5517f559b1e92dca4453b037cdf7afe7","blockSize":4194304,"blocks":["edf226e9833547ce489fff2629e2528c5517f559b1e92dca4453b037cdf7afe7"]},"offset":"31391504"},"AnimationFrameAction.js":{"size":1123,"integrity":{"algorithm":"SHA256","hash":"6858982b3c8621a316c20db46dff55e5bad3e0b666434aee88d7895901690ce6","blockSize":4194304,"blocks":["6858982b3c8621a316c20db46dff55e5bad3e0b666434aee88d7895901690ce6"]},"offset":"31391749"},"AnimationFrameScheduler.js":{"size":829,"integrity":{"algorithm":"SHA256","hash":"bba7fc9abc6e3b6d5cc0ed8651a9399ea178e9ff01a9baf67b9b1790b3a0151a","blockSize":4194304,"blocks":["bba7fc9abc6e3b6d5cc0ed8651a9399ea178e9ff01a9baf67b9b1790b3a0151a"]},"offset":"31392872"},"AsapAction.js":{"size":1078,"integrity":{"algorithm":"SHA256","hash":"8dac7dd5b00409e987afbc5a35c7e9d6977babb8b126d35559085c9093da5b31","blockSize":4194304,"blocks":["8dac7dd5b00409e987afbc5a35c7e9d6977babb8b126d35559085c9093da5b31"]},"offset":"31393701"},"AsapScheduler.js":{"size":809,"integrity":{"algorithm":"SHA256","hash":"215cf60c3356b21056b4d17b3a3aff822d2adb097689a89e23f6620b779f60fd","blockSize":4194304,"blocks":["215cf60c3356b21056b4d17b3a3aff822d2adb097689a89e23f6620b779f60fd"]},"offset":"31394779"},"AsyncAction.js":{"size":2476,"integrity":{"algorithm":"SHA256","hash":"8ce06352d32fe9c355eeae9022b212f4f1e1cde19649756865bf09ee51430c37","blockSize":4194304,"blocks":["8ce06352d32fe9c355eeae9022b212f4f1e1cde19649756865bf09ee51430c37"]},"offset":"31395588"},"AsyncScheduler.js":{"size":882,"integrity":{"algorithm":"SHA256","hash":"1f8340ce61a383d51050571358f17c90efa14e8df14fcd84d800191d631aa2cb","blockSize":4194304,"blocks":["1f8340ce61a383d51050571358f17c90efa14e8df14fcd84d800191d631aa2cb"]},"offset":"31398064"},"QueueAction.js":{"size":910,"integrity":{"algorithm":"SHA256","hash":"05771dd0509dba2ae6d90cf25c9dbf40df7fff089702ec6433482a14759eb9c4","blockSize":4194304,"blocks":["05771dd0509dba2ae6d90cf25c9dbf40df7fff089702ec6433482a14759eb9c4"]},"offset":"31398946"},"QueueScheduler.js":{"size":148,"integrity":{"algorithm":"SHA256","hash":"09c573d807b58c39a99ae95c5356ae1797b24d5a7ec6bdcbdf53daae1768e08d","blockSize":4194304,"blocks":["09c573d807b58c39a99ae95c5356ae1797b24d5a7ec6bdcbdf53daae1768e08d"]},"offset":"31399856"},"VirtualTimeScheduler.js":{"size":2653,"integrity":{"algorithm":"SHA256","hash":"77a6ba960bb010dea7771683a0b636e2baad88470a02c3cfa574c73dbd17f2ff","blockSize":4194304,"blocks":["77a6ba960bb010dea7771683a0b636e2baad88470a02c3cfa574c73dbd17f2ff"]},"offset":"31400004"},"animationFrame.js":{"size":319,"integrity":{"algorithm":"SHA256","hash":"8a1b5fd634708bedea8feec81c17c8e907b0aeb8b8b5e1d7d6346fd1346b4b3b","blockSize":4194304,"blocks":["8a1b5fd634708bedea8feec81c17c8e907b0aeb8b8b5e1d7d6346fd1346b4b3b"]},"offset":"31402657"},"animationFrameProvider.js":{"size":1172,"integrity":{"algorithm":"SHA256","hash":"fe1b505de9640b0d00245d8a22f0a3a1219bf700d718c3f56fba7d3650dbf0ec","blockSize":4194304,"blocks":["fe1b505de9640b0d00245d8a22f0a3a1219bf700d718c3f56fba7d3650dbf0ec"]},"offset":"31402976"},"asap.js":{"size":219,"integrity":{"algorithm":"SHA256","hash":"107889b9daeb9e51491f10dc76481e6d629a8070d674140c35832160cd13ce38","blockSize":4194304,"blocks":["107889b9daeb9e51491f10dc76481e6d629a8070d674140c35832160cd13ce38"]},"offset":"31404148"},"async.js":{"size":229,"integrity":{"algorithm":"SHA256","hash":"3b1ca697812d37f8a3205839a5a3242422db20701366b652aaaaa3d09062704a","blockSize":4194304,"blocks":["3b1ca697812d37f8a3205839a5a3242422db20701366b652aaaaa3d09062704a"]},"offset":"31404367"},"dateTimestampProvider.js":{"size":198,"integrity":{"algorithm":"SHA256","hash":"80172992696e62ab5ee25dcaad16d0c43229a1ac2253428c3728e4fbe31a80b3","blockSize":4194304,"blocks":["80172992696e62ab5ee25dcaad16d0c43229a1ac2253428c3728e4fbe31a80b3"]},"offset":"31404596"},"immediateProvider.js":{"size":615,"integrity":{"algorithm":"SHA256","hash":"1311c00f1464070f695b0f0ac6eb79093612541c51f984fe99f5674f1a4472a6","blockSize":4194304,"blocks":["1311c00f1464070f695b0f0ac6eb79093612541c51f984fe99f5674f1a4472a6"]},"offset":"31404794"},"intervalProvider.js":{"size":628,"integrity":{"algorithm":"SHA256","hash":"a76e65b14dadd6ae4cace3f10127368dbfa62437c82c87c6ea4e5decff660626","blockSize":4194304,"blocks":["a76e65b14dadd6ae4cace3f10127368dbfa62437c82c87c6ea4e5decff660626"]},"offset":"31405409"},"performanceTimestampProvider.js":{"size":226,"integrity":{"algorithm":"SHA256","hash":"60ca552268bb495ac5991205c9e103e7d0a1a7b528dea3dd71fe87c3e389c4e4","blockSize":4194304,"blocks":["60ca552268bb495ac5991205c9e103e7d0a1a7b528dea3dd71fe87c3e389c4e4"]},"offset":"31406037"},"queue.js":{"size":229,"integrity":{"algorithm":"SHA256","hash":"9efcfd48bd868e4a2d2ad7c8538dc50bf58b8bfa8950ca151faf58d453e490eb","blockSize":4194304,"blocks":["9efcfd48bd868e4a2d2ad7c8538dc50bf58b8bfa8950ca151faf58d453e490eb"]},"offset":"31406263"},"timeoutProvider.js":{"size":617,"integrity":{"algorithm":"SHA256","hash":"c11da00f079c50a0f797ef9c822e652509463b1e1493372e485e12c9ad93cab1","blockSize":4194304,"blocks":["c11da00f079c50a0f797ef9c822e652509463b1e1493372e485e12c9ad93cab1"]},"offset":"31406492"},"timerHandle.js":{"size":50,"integrity":{"algorithm":"SHA256","hash":"7657fa65de5794b6bf810e7dfa47c3ce554f9a7e70281407a5bf27104c86e08f","blockSize":4194304,"blocks":["7657fa65de5794b6bf810e7dfa47c3ce554f9a7e70281407a5bf27104c86e08f"]},"offset":"31407109"}}},"scheduled":{"files":{"scheduleArray.js":{"size":534,"integrity":{"algorithm":"SHA256","hash":"d80344d292a49fb134375d5d2b1fdadd536a1e31d53a34836c9b3e6bd4901b01","blockSize":4194304,"blocks":["d80344d292a49fb134375d5d2b1fdadd536a1e31d53a34836c9b3e6bd4901b01"]},"offset":"31407159"},"scheduleAsyncIterable.js":{"size":834,"integrity":{"algorithm":"SHA256","hash":"7809d20d0204ffd402e1eececf5370b4f73662496b014d1f668f3adbee94c022","blockSize":4194304,"blocks":["7809d20d0204ffd402e1eececf5370b4f73662496b014d1f668f3adbee94c022"]},"offset":"31407693"},"scheduleIterable.js":{"size":1157,"integrity":{"algorithm":"SHA256","hash":"0bb237038be5e787f063a6f5e2a644268b55afc1d1057971d7310830e26359c4","blockSize":4194304,"blocks":["0bb237038be5e787f063a6f5e2a644268b55afc1d1057971d7310830e26359c4"]},"offset":"31408527"},"scheduleObservable.js":{"size":344,"integrity":{"algorithm":"SHA256","hash":"294f5344eb0bdcb1518f2a9b059d1d60a57a66abf58b4338cae4674b9207e567","blockSize":4194304,"blocks":["294f5344eb0bdcb1518f2a9b059d1d60a57a66abf58b4338cae4674b9207e567"]},"offset":"31409684"},"schedulePromise.js":{"size":338,"integrity":{"algorithm":"SHA256","hash":"0b60d7142874c0aa40ba1e54c6bf4fef8ca83b7c2a64c6f9637dcfc512eb8a99","blockSize":4194304,"blocks":["0b60d7142874c0aa40ba1e54c6bf4fef8ca83b7c2a64c6f9637dcfc512eb8a99"]},"offset":"31410028"},"scheduleReadableStreamLike.js":{"size":355,"integrity":{"algorithm":"SHA256","hash":"bd97546688fe9803fe0c705d72da9cf71b904b5f8de7713917f6858fed29f9ca","blockSize":4194304,"blocks":["bd97546688fe9803fe0c705d72da9cf71b904b5f8de7713917f6858fed29f9ca"]},"offset":"31410366"},"scheduled.js":{"size":1573,"integrity":{"algorithm":"SHA256","hash":"9a309ee71ddc5dec61c0b11f016384b414b3685f88bc290be63454385a1854a0","blockSize":4194304,"blocks":["9a309ee71ddc5dec61c0b11f016384b414b3685f88bc290be63454385a1854a0"]},"offset":"31410721"}}},"operators":{"files":{"OperatorSubscriber.js":{"size":1818,"integrity":{"algorithm":"SHA256","hash":"f4203ed1f01907875aaddfc8f4f856129ab2631dcad481a7b2db0c9540c14d0c","blockSize":4194304,"blocks":["f4203ed1f01907875aaddfc8f4f856129ab2631dcad481a7b2db0c9540c14d0c"]},"offset":"31412294"},"audit.js":{"size":1508,"integrity":{"algorithm":"SHA256","hash":"217d7073419e83c147e8da61c7dfc6949cb70297c1c7d2bbf3a50c61ed04dab3","blockSize":4194304,"blocks":["217d7073419e83c147e8da61c7dfc6949cb70297c1c7d2bbf3a50c61ed04dab3"]},"offset":"31414112"},"auditTime.js":{"size":288,"integrity":{"algorithm":"SHA256","hash":"1bb6bc3eca331605be1e609922c3302f760e48b3c8a87f777e0f6dbb4d31c8ae","blockSize":4194304,"blocks":["1bb6bc3eca331605be1e609922c3302f760e48b3c8a87f777e0f6dbb4d31c8ae"]},"offset":"31415620"},"buffer.js":{"size":772,"integrity":{"algorithm":"SHA256","hash":"69ba1d84866e1a9d836a66d9cb5ed4edd1997e0d12afd2135badfa07f55311d6","blockSize":4194304,"blocks":["69ba1d84866e1a9d836a66d9cb5ed4edd1997e0d12afd2135badfa07f55311d6"]},"offset":"31415908"},"bufferCount.js":{"size":1388,"integrity":{"algorithm":"SHA256","hash":"407e2d02e8950037acf37b1d6c056faecebbbcb0c222a731ec0cb31e4717ebad","blockSize":4194304,"blocks":["407e2d02e8950037acf37b1d6c056faecebbbcb0c222a731ec0cb31e4717ebad"]},"offset":"31416680"},"bufferTime.js":{"size":2653,"integrity":{"algorithm":"SHA256","hash":"8709ea02b4c8c48c2952f89fff14c0f95ba65c8f91a0b09196d70eff3dd043fa","blockSize":4194304,"blocks":["8709ea02b4c8c48c2952f89fff14c0f95ba65c8f91a0b09196d70eff3dd043fa"]},"offset":"31418068"},"bufferToggle.js":{"size":1380,"integrity":{"algorithm":"SHA256","hash":"28000bac33f3cf7d14004fc90b27bd024aa8b021835e2dcb98585a57abc6c4ac","blockSize":4194304,"blocks":["28000bac33f3cf7d14004fc90b27bd024aa8b021835e2dcb98585a57abc6c4ac"]},"offset":"31420721"},"bufferWhen.js":{"size":1102,"integrity":{"algorithm":"SHA256","hash":"e121457a62a9cc11695164805f3fad70333ed924cd4ba6813dbee04f8a4fc05b","blockSize":4194304,"blocks":["e121457a62a9cc11695164805f3fad70333ed924cd4ba6813dbee04f8a4fc05b"]},"offset":"31422101"},"catchError.js":{"size":964,"integrity":{"algorithm":"SHA256","hash":"2d9557fe8e8ecc41b2ba3d250e880090e91da053610829121360346512eb79f9","blockSize":4194304,"blocks":["2d9557fe8e8ecc41b2ba3d250e880090e91da053610829121360346512eb79f9"]},"offset":"31423203"},"combineAll.js":{"size":137,"integrity":{"algorithm":"SHA256","hash":"a3058b6ef767d8a33abd24f45bdf5f33328ae09236fb650456d8a4f99b23fbee","blockSize":4194304,"blocks":["a3058b6ef767d8a33abd24f45bdf5f33328ae09236fb650456d8a4f99b23fbee"]},"offset":"31424167"},"combineLatest.js":{"size":679,"integrity":{"algorithm":"SHA256","hash":"b68f736a04a8858172bea9c107b50f8767a57ce2719d5b89fc0310a29252358e","blockSize":4194304,"blocks":["b68f736a04a8858172bea9c107b50f8767a57ce2719d5b89fc0310a29252358e"]},"offset":"31424304"},"combineLatestAll.js":{"size":259,"integrity":{"algorithm":"SHA256","hash":"3a10ffe87bd4cd0f2b29dbf54a0b4e8c1315d15d745dffe95b212da5af7bf7cb","blockSize":4194304,"blocks":["3a10ffe87bd4cd0f2b29dbf54a0b4e8c1315d15d745dffe95b212da5af7bf7cb"]},"offset":"31424983"},"combineLatestWith.js":{"size":192,"integrity":{"algorithm":"SHA256","hash":"5e31df02e364c03a084bbf923e633b0e37be2e03657a486ce93cbce9a7ae1774","blockSize":4194304,"blocks":["5e31df02e364c03a084bbf923e633b0e37be2e03657a486ce93cbce9a7ae1774"]},"offset":"31425242"},"concat.js":{"size":413,"integrity":{"algorithm":"SHA256","hash":"d058ddac28b1ebd821ba2fdaf3247e81557874392c368d32b57e86263e45c9a5","blockSize":4194304,"blocks":["d058ddac28b1ebd821ba2fdaf3247e81557874392c368d32b57e86263e45c9a5"]},"offset":"31425434"},"concatAll.js":{"size":132,"integrity":{"algorithm":"SHA256","hash":"a08b8574248cfe93705bfd2019875d7d736cbd120f2541cedea34cbc125bad2c","blockSize":4194304,"blocks":["a08b8574248cfe93705bfd2019875d7d736cbd120f2541cedea34cbc125bad2c"]},"offset":"31425847"},"concatMap.js":{"size":281,"integrity":{"algorithm":"SHA256","hash":"3b3b676e2129cd75d32e7d4bad5574c207639207b11a13d532248a8e6a77ae40","blockSize":4194304,"blocks":["3b3b676e2129cd75d32e7d4bad5574c207639207b11a13d532248a8e6a77ae40"]},"offset":"31425979"},"concatMapTo.js":{"size":319,"integrity":{"algorithm":"SHA256","hash":"fa3634301979ea3c4ec24b1c9271a603e13df47a3a62ea8d839a596035587c76","blockSize":4194304,"blocks":["fa3634301979ea3c4ec24b1c9271a603e13df47a3a62ea8d839a596035587c76"]},"offset":"31426260"},"concatWith.js":{"size":157,"integrity":{"algorithm":"SHA256","hash":"5067e520ddcf30d10a4aefad0f8e2bd942ca114560f83106a9619504b73aeb94","blockSize":4194304,"blocks":["5067e520ddcf30d10a4aefad0f8e2bd942ca114560f83106a9619504b73aeb94"]},"offset":"31426579"},"connect.js":{"size":613,"integrity":{"algorithm":"SHA256","hash":"4c05ae4c0e79166bfa7b99240363808fbbd92ea7df5a24f03aeb238c2a7a04c0","blockSize":4194304,"blocks":["4c05ae4c0e79166bfa7b99240363808fbbd92ea7df5a24f03aeb238c2a7a04c0"]},"offset":"31426736"},"count.js":{"size":205,"integrity":{"algorithm":"SHA256","hash":"e468b6d2561569e8351158e5eda9c26679288f2e821c246e696520ecf9e1d239","blockSize":4194304,"blocks":["e468b6d2561569e8351158e5eda9c26679288f2e821c246e696520ecf9e1d239"]},"offset":"31427349"},"debounce.js":{"size":1400,"integrity":{"algorithm":"SHA256","hash":"253a9ca5bb009c3d76c84c8a401da5a98c658605ba8bba7e3ad2e6064fa5a975","blockSize":4194304,"blocks":["253a9ca5bb009c3d76c84c8a401da5a98c658605ba8bba7e3ad2e6064fa5a975"]},"offset":"31427554"},"debounceTime.js":{"size":1501,"integrity":{"algorithm":"SHA256","hash":"c56a7a56ffc43463cb8ab30dfd77e662d034071f2c887fd1172fe7ef0f1996b5","blockSize":4194304,"blocks":["c56a7a56ffc43463cb8ab30dfd77e662d034071f2c887fd1172fe7ef0f1996b5"]},"offset":"31428954"},"defaultIfEmpty.js":{"size":576,"integrity":{"algorithm":"SHA256","hash":"254060f909f9ebad11e4c0e4e69f1e2087215f9fd75bd62f99c1035d6dfc5278","blockSize":4194304,"blocks":["254060f909f9ebad11e4c0e4e69f1e2087215f9fd75bd62f99c1035d6dfc5278"]},"offset":"31430455"},"delay.js":{"size":313,"integrity":{"algorithm":"SHA256","hash":"0b6185b597081d77261eaa154673ea12764d4ad9e6d2d0f10b711a906040cc63","blockSize":4194304,"blocks":["0b6185b597081d77261eaa154673ea12764d4ad9e6d2d0f10b711a906040cc63"]},"offset":"31431031"},"delayWhen.js":{"size":582,"integrity":{"algorithm":"SHA256","hash":"415f94183a58af5a0e0585dd47f8ace3038ea3db263b5cd17e78a31f45bbd6ea","blockSize":4194304,"blocks":["415f94183a58af5a0e0585dd47f8ace3038ea3db263b5cd17e78a31f45bbd6ea"]},"offset":"31431344"},"dematerialize.js":{"size":419,"integrity":{"algorithm":"SHA256","hash":"bf5d983e27b1c72d554c08f7ffbdd8475ca3d95b0232d27389fbb7686fb7ce5d","blockSize":4194304,"blocks":["bf5d983e27b1c72d554c08f7ffbdd8475ca3d95b0232d27389fbb7686fb7ce5d"]},"offset":"31431926"},"distinct.js":{"size":760,"integrity":{"algorithm":"SHA256","hash":"a9742bc59e4bd6777e1853eee151457ed849ad946040f7cbfc31653cb1bfc34e","blockSize":4194304,"blocks":["a9742bc59e4bd6777e1853eee151457ed849ad946040f7cbfc31653cb1bfc34e"]},"offset":"31432345"},"distinctUntilChanged.js":{"size":857,"integrity":{"algorithm":"SHA256","hash":"59a73eb081fa01d70f1b9502c74d8f66e05363b149786a6478fcf9d03dc79775","blockSize":4194304,"blocks":["59a73eb081fa01d70f1b9502c74d8f66e05363b149786a6478fcf9d03dc79775"]},"offset":"31433105"},"distinctUntilKeyChanged.js":{"size":270,"integrity":{"algorithm":"SHA256","hash":"f6ef33e8f0feec7d87a6c70e02873bbe3c2a358529bcb2fe8b7aa39a4acd5fb0","blockSize":4194304,"blocks":["f6ef33e8f0feec7d87a6c70e02873bbe3c2a358529bcb2fe8b7aa39a4acd5fb0"]},"offset":"31433962"},"elementAt.js":{"size":626,"integrity":{"algorithm":"SHA256","hash":"20cbb45e31d181dcb74682ef38d5de29a824b90b3fb74a64305616b523fce60b","blockSize":4194304,"blocks":["20cbb45e31d181dcb74682ef38d5de29a824b90b3fb74a64305616b523fce60b"]},"offset":"31434232"},"endWith.js":{"size":214,"integrity":{"algorithm":"SHA256","hash":"bb6970504a39421d362b87c4852aa093238bd020e720065d2f27412080a0d9db","blockSize":4194304,"blocks":["bb6970504a39421d362b87c4852aa093238bd020e720065d2f27412080a0d9db"]},"offset":"31434858"},"every.js":{"size":598,"integrity":{"algorithm":"SHA256","hash":"913f490a64cc2fedd5b56cffc0005165a11758646ca8bcee312d19be3f9ef7ce","blockSize":4194304,"blocks":["913f490a64cc2fedd5b56cffc0005165a11758646ca8bcee312d19be3f9ef7ce"]},"offset":"31435072"},"exhaust.js":{"size":113,"integrity":{"algorithm":"SHA256","hash":"5a508d65cfe805e2a35cd2fd9537e6ac8d08acb78fd71067bbf4268c54aaf029","blockSize":4194304,"blocks":["5a508d65cfe805e2a35cd2fd9537e6ac8d08acb78fd71067bbf4268c54aaf029"]},"offset":"31435670"},"exhaustAll.js":{"size":192,"integrity":{"algorithm":"SHA256","hash":"2d62569e5df98f1f2a777f70b7a698f5764695f736787e461665d0332cc6ddce","blockSize":4194304,"blocks":["2d62569e5df98f1f2a777f70b7a698f5764695f736787e461665d0332cc6ddce"]},"offset":"31435783"},"exhaustMap.js":{"size":1096,"integrity":{"algorithm":"SHA256","hash":"c0b8bd1727597b72424b7de38084bab2df444526cd0423ffd6b119bad1618b77","blockSize":4194304,"blocks":["c0b8bd1727597b72424b7de38084bab2df444526cd0423ffd6b119bad1618b77"]},"offset":"31435975"},"expand.js":{"size":388,"integrity":{"algorithm":"SHA256","hash":"b6ea2d6e3da5db4b1bd6ffd5fee1f48a3b9f1f88b5d41854ecbde581cb6664dc","blockSize":4194304,"blocks":["b6ea2d6e3da5db4b1bd6ffd5fee1f48a3b9f1f88b5d41854ecbde581cb6664dc"]},"offset":"31437071"},"filter.js":{"size":404,"integrity":{"algorithm":"SHA256","hash":"b61c9efb78075c953dc7d7d3b824c5eac825067cdac1107c3c8c28b9cb0eeafc","blockSize":4194304,"blocks":["b61c9efb78075c953dc7d7d3b824c5eac825067cdac1107c3c8c28b9cb0eeafc"]},"offset":"31437459"},"finalize.js":{"size":300,"integrity":{"algorithm":"SHA256","hash":"249ee62ce42c9118db30df6b2288b653e1bfcbe034a41533884d231a4ac1c445","blockSize":4194304,"blocks":["249ee62ce42c9118db30df6b2288b653e1bfcbe034a41533884d231a4ac1c445"]},"offset":"31437863"},"find.js":{"size":807,"integrity":{"algorithm":"SHA256","hash":"0c614659f2000d728cfaa5c4d0ad8ad81dba02b1d154eb690d6f4c1f52d30e1b","blockSize":4194304,"blocks":["0c614659f2000d728cfaa5c4d0ad8ad81dba02b1d154eb690d6f4c1f52d30e1b"]},"offset":"31438163"},"findIndex.js":{"size":225,"integrity":{"algorithm":"SHA256","hash":"ad6e9d568253c93dfb32b32162717d768db931b1f073e9a338a641658179896e","blockSize":4194304,"blocks":["ad6e9d568253c93dfb32b32162717d768db931b1f073e9a338a641658179896e"]},"offset":"31438970"},"first.js":{"size":591,"integrity":{"algorithm":"SHA256","hash":"3a0290daed7603b203a61a64bdfca25851bd68d00622bd4a80f1d4a579712ed1","blockSize":4194304,"blocks":["3a0290daed7603b203a61a64bdfca25851bd68d00622bd4a80f1d4a579712ed1"]},"offset":"31439195"},"flatMap.js":{"size":107,"integrity":{"algorithm":"SHA256","hash":"c0a6da27e4c200035b2a4b2f2f21f005600fa34a3f885c9a4008d9487f7a22e9","blockSize":4194304,"blocks":["c0a6da27e4c200035b2a4b2f2f21f005600fa34a3f885c9a4008d9487f7a22e9"]},"offset":"31439786"},"groupBy.js":{"size":2832,"integrity":{"algorithm":"SHA256","hash":"cd5b3600f51e94c5f00b334b851f65ee68c610d39c982c28c6019e7c950509f9","blockSize":4194304,"blocks":["cd5b3600f51e94c5f00b334b851f65ee68c610d39c982c28c6019e7c950509f9"]},"offset":"31439893"},"ignoreElements.js":{"size":344,"integrity":{"algorithm":"SHA256","hash":"de214138b07633d416d4e350457ebb4afca0dfb2755a8c4ac26c11db4fd7443a","blockSize":4194304,"blocks":["de214138b07633d416d4e350457ebb4afca0dfb2755a8c4ac26c11db4fd7443a"]},"offset":"31442725"},"isEmpty.js":{"size":466,"integrity":{"algorithm":"SHA256","hash":"57e80d761bcc2cada67320acbf74c4c873b709aaa2e78f0c804fb727db9d81c5","blockSize":4194304,"blocks":["57e80d761bcc2cada67320acbf74c4c873b709aaa2e78f0c804fb727db9d81c5"]},"offset":"31443069"},"joinAllInternals.js":{"size":433,"integrity":{"algorithm":"SHA256","hash":"17c0da96328b470471d36127a5882de21c4b4da62b6c30582775fc4aa14fc03d","blockSize":4194304,"blocks":["17c0da96328b470471d36127a5882de21c4b4da62b6c30582775fc4aa14fc03d"]},"offset":"31443535"},"last.js":{"size":601,"integrity":{"algorithm":"SHA256","hash":"72091fdde69d10720b151d6a22a03deae4b5baa2fad56439ccc049009b13044f","blockSize":4194304,"blocks":["72091fdde69d10720b151d6a22a03deae4b5baa2fad56439ccc049009b13044f"]},"offset":"31443968"},"map.js":{"size":410,"integrity":{"algorithm":"SHA256","hash":"296a5c6b21906889df2c5b063ccfd16c2c3bbf0f59f4e0c75d958ed4defa9405","blockSize":4194304,"blocks":["296a5c6b21906889df2c5b063ccfd16c2c3bbf0f59f4e0c75d958ed4defa9405"]},"offset":"31444569"},"mapTo.js":{"size":124,"integrity":{"algorithm":"SHA256","hash":"0754f3a00885787f8997e4af167041965de9ebdb4a45f78afa4a43cb1621b1fb","blockSize":4194304,"blocks":["0754f3a00885787f8997e4af167041965de9ebdb4a45f78afa4a43cb1621b1fb"]},"offset":"31444979"},"materialize.js":{"size":659,"integrity":{"algorithm":"SHA256","hash":"5197941339e7af92f5a73964c18d2f78f6369e524d607f96f22f00f42fa1c999","blockSize":4194304,"blocks":["5197941339e7af92f5a73964c18d2f78f6369e524d607f96f22f00f42fa1c999"]},"offset":"31445103"},"max.js":{"size":259,"integrity":{"algorithm":"SHA256","hash":"f596e96b79dbffa95ce6ff9e0454f9a86d7ade1de318c59ef2cb3e6684d8e3ee","blockSize":4194304,"blocks":["f596e96b79dbffa95ce6ff9e0454f9a86d7ade1de318c59ef2cb3e6684d8e3ee"]},"offset":"31445762"},"merge.js":{"size":569,"integrity":{"algorithm":"SHA256","hash":"acff254d9a5a1752b2c142c196a2b00e2fb95bcc3d36459f84147056cc9efa86","blockSize":4194304,"blocks":["acff254d9a5a1752b2c142c196a2b00e2fb95bcc3d36459f84147056cc9efa86"]},"offset":"31446021"},"mergeAll.js":{"size":215,"integrity":{"algorithm":"SHA256","hash":"86ff2dcb1cffa6f03b0b114ad35a3235a75b5f9a02bfe14a80963d125bdb2e38","blockSize":4194304,"blocks":["86ff2dcb1cffa6f03b0b114ad35a3235a75b5f9a02bfe14a80963d125bdb2e38"]},"offset":"31446590"},"mergeInternals.js":{"size":2243,"integrity":{"algorithm":"SHA256","hash":"b253be5552e53ddb484f9b8a9892e7b81183af3e624293f2646bc586c68a0cf7","blockSize":4194304,"blocks":["b253be5552e53ddb484f9b8a9892e7b81183af3e624293f2646bc586c68a0cf7"]},"offset":"31446805"},"mergeMap.js":{"size":692,"integrity":{"algorithm":"SHA256","hash":"b46e132c2a3bfb9b3e8fa4117231eeb3bf807b22f652ac363247f5b609c273ba","blockSize":4194304,"blocks":["b46e132c2a3bfb9b3e8fa4117231eeb3bf807b22f652ac363247f5b609c273ba"]},"offset":"31449048"},"mergeMapTo.js":{"size":478,"integrity":{"algorithm":"SHA256","hash":"a7e67e6727b25dc6b301b880cfbfd84e1752e75a2e27d700e2d24c5e8e895f3c","blockSize":4194304,"blocks":["a7e67e6727b25dc6b301b880cfbfd84e1752e75a2e27d700e2d24c5e8e895f3c"]},"offset":"31449740"},"mergeScan.js":{"size":485,"integrity":{"algorithm":"SHA256","hash":"3341d1d42048268974a6fdaca943325c8c6f0d9443d3ba67602870b8ee71b985","blockSize":4194304,"blocks":["3341d1d42048268974a6fdaca943325c8c6f0d9443d3ba67602870b8ee71b985"]},"offset":"31450218"},"mergeWith.js":{"size":152,"integrity":{"algorithm":"SHA256","hash":"77973db67172b64bdf8bace22d65428072a7ffd97343ac3ad6cd9b5f62db6d2c","blockSize":4194304,"blocks":["77973db67172b64bdf8bace22d65428072a7ffd97343ac3ad6cd9b5f62db6d2c"]},"offset":"31450703"},"min.js":{"size":259,"integrity":{"algorithm":"SHA256","hash":"8f69b06807d38fed7a00c2589a8b8fd9878509dadaf7f1e75754eb93eed3e0be","blockSize":4194304,"blocks":["8f69b06807d38fed7a00c2589a8b8fd9878509dadaf7f1e75754eb93eed3e0be"]},"offset":"31450855"},"multicast.js":{"size":585,"integrity":{"algorithm":"SHA256","hash":"3353887ba102c1b28142e61c31f593fbcda2fee6193b78b3d188f5f188d7e5da","blockSize":4194304,"blocks":["3353887ba102c1b28142e61c31f593fbcda2fee6193b78b3d188f5f188d7e5da"]},"offset":"31451114"},"observeOn.js":{"size":625,"integrity":{"algorithm":"SHA256","hash":"0ed5c16a5ae3fc30e4b032d8943e877a8ae06589d800cdffa1a12457399a5528","blockSize":4194304,"blocks":["0ed5c16a5ae3fc30e4b032d8943e877a8ae06589d800cdffa1a12457399a5528"]},"offset":"31451699"},"onErrorResumeNext.js":{"size":1252,"integrity":{"algorithm":"SHA256","hash":"d95cfb16d7a11f485251c3c6db66cc20389bdca7c2e65788a2368d76d40073c9","blockSize":4194304,"blocks":["d95cfb16d7a11f485251c3c6db66cc20389bdca7c2e65788a2368d76d40073c9"]},"offset":"31452324"},"pairwise.js":{"size":494,"integrity":{"algorithm":"SHA256","hash":"de9efd1a670129580afe1cd74c6f8d1648c4006ddb9939c3d27f1b0f98a843ed","blockSize":4194304,"blocks":["de9efd1a670129580afe1cd74c6f8d1648c4006ddb9939c3d27f1b0f98a843ed"]},"offset":"31453576"},"partition.js":{"size":259,"integrity":{"algorithm":"SHA256","hash":"3d3c301f198a57dd893061da13410729d9c01f33d4ab02b0d16436cc9de0f12c","blockSize":4194304,"blocks":["3d3c301f198a57dd893061da13410729d9c01f33d4ab02b0d16436cc9de0f12c"]},"offset":"31454070"},"pluck.js":{"size":643,"integrity":{"algorithm":"SHA256","hash":"00480f2381c1ec984a13f509e59003e75fbd3eda436bf35d46205ca28124dc30","blockSize":4194304,"blocks":["00480f2381c1ec984a13f509e59003e75fbd3eda436bf35d46205ca28124dc30"]},"offset":"31454329"},"publish.js":{"size":297,"integrity":{"algorithm":"SHA256","hash":"e9771dbc48cf13e2c8f210d6beef7b0e398b4bb31154bdad8d5bcbccb126247c","blockSize":4194304,"blocks":["e9771dbc48cf13e2c8f210d6beef7b0e398b4bb31154bdad8d5bcbccb126247c"]},"offset":"31454972"},"publishBehavior.js":{"size":380,"integrity":{"algorithm":"SHA256","hash":"0b9a5bd4d0e66bf152b51974d46f6c3a2d84e5a31b364e5ff7cfb13c88a2f37e","blockSize":4194304,"blocks":["0b9a5bd4d0e66bf152b51974d46f6c3a2d84e5a31b364e5ff7cfb13c88a2f37e"]},"offset":"31455269"},"publishLast.js":{"size":339,"integrity":{"algorithm":"SHA256","hash":"33ac6a4483f7ed59acc096abb97b87a4a1a553352bdfdd8c0ff8a539bc415538","blockSize":4194304,"blocks":["33ac6a4483f7ed59acc096abb97b87a4a1a553352bdfdd8c0ff8a539bc415538"]},"offset":"31455649"},"publishReplay.js":{"size":603,"integrity":{"algorithm":"SHA256","hash":"62eec7eb51f76ab0fb634f33fb48d92c0455435bcddc2bdce244b18b00a7bc02","blockSize":4194304,"blocks":["62eec7eb51f76ab0fb634f33fb48d92c0455435bcddc2bdce244b18b00a7bc02"]},"offset":"31455988"},"race.js":{"size":208,"integrity":{"algorithm":"SHA256","hash":"9dcfb6c29ab7d1d00ae1247d5a39ece93919a2e843f41a4e6a28f43e1ba7e9c0","blockSize":4194304,"blocks":["9dcfb6c29ab7d1d00ae1247d5a39ece93919a2e843f41a4e6a28f43e1ba7e9c0"]},"offset":"31456591"},"raceWith.js":{"size":382,"integrity":{"algorithm":"SHA256","hash":"136f6d5210f9446a5f610e5dd0a2cf5f3afa2ecf27d5b731d00a844331053610","blockSize":4194304,"blocks":["136f6d5210f9446a5f610e5dd0a2cf5f3afa2ecf27d5b731d00a844331053610"]},"offset":"31456799"},"reduce.js":{"size":259,"integrity":{"algorithm":"SHA256","hash":"720b17ff8353a32ef11beb54b63e92962b603e6bcd88f49ef4db278c97fc9a1d","blockSize":4194304,"blocks":["720b17ff8353a32ef11beb54b63e92962b603e6bcd88f49ef4db278c97fc9a1d"]},"offset":"31457181"},"refCount.js":{"size":978,"integrity":{"algorithm":"SHA256","hash":"8189ab5f530c56376c0612bdf9901e7c1cec12d49064505b936063b907006675","blockSize":4194304,"blocks":["8189ab5f530c56376c0612bdf9901e7c1cec12d49064505b936063b907006675"]},"offset":"31457440"},"repeat.js":{"size":2156,"integrity":{"algorithm":"SHA256","hash":"5d4125adb7b9af391f9a6e9f17253c77f61b710e3c6b2190a94a4cb460c78f26","blockSize":4194304,"blocks":["5d4125adb7b9af391f9a6e9f17253c77f61b710e3c6b2190a94a4cb460c78f26"]},"offset":"31458418"},"repeatWhen.js":{"size":1684,"integrity":{"algorithm":"SHA256","hash":"b4dbb88d474b5b80b9e6f2984fbd6f53a1d9ce695da160f7ccc3b506b23eb8a6","blockSize":4194304,"blocks":["b4dbb88d474b5b80b9e6f2984fbd6f53a1d9ce695da160f7ccc3b506b23eb8a6"]},"offset":"31460574"},"retry.js":{"size":2638,"integrity":{"algorithm":"SHA256","hash":"ec8a88ec0749ea91fa18615f8db206a4dcc3dcdaa50d66c1f84a081f09790662","blockSize":4194304,"blocks":["ec8a88ec0749ea91fa18615f8db206a4dcc3dcdaa50d66c1f84a081f09790662"]},"offset":"31462258"},"retryWhen.js":{"size":1089,"integrity":{"algorithm":"SHA256","hash":"a54ae90cd7703591297ddd772b3c15f8d71f41bfeedff221f7af296d975b68f0","blockSize":4194304,"blocks":["a54ae90cd7703591297ddd772b3c15f8d71f41bfeedff221f7af296d975b68f0"]},"offset":"31464896"},"sample.js":{"size":756,"integrity":{"algorithm":"SHA256","hash":"f662560727b21ff88266ca23e55cb42192704d63e64f040ce28890b68d75343f","blockSize":4194304,"blocks":["f662560727b21ff88266ca23e55cb42192704d63e64f040ce28890b68d75343f"]},"offset":"31465985"},"sampleTime.js":{"size":292,"integrity":{"algorithm":"SHA256","hash":"ed195fb1845fc27ea139bbe11b2381b93722e0d50c02dbaae9e584c7ae092329","blockSize":4194304,"blocks":["ed195fb1845fc27ea139bbe11b2381b93722e0d50c02dbaae9e584c7ae092329"]},"offset":"31466741"},"scan.js":{"size":248,"integrity":{"algorithm":"SHA256","hash":"1b7c8898259705e8346fe6d8b0d3fa940214785e6a250a28cc12b7d85090457f","blockSize":4194304,"blocks":["1b7c8898259705e8346fe6d8b0d3fa940214785e6a250a28cc12b7d85090457f"]},"offset":"31467033"},"scanInternals.js":{"size":806,"integrity":{"algorithm":"SHA256","hash":"d64f94b7d4d2d39108a511655db4aa0c7fb3e4254655223685332dbb3094f0ab","blockSize":4194304,"blocks":["d64f94b7d4d2d39108a511655db4aa0c7fb3e4254655223685332dbb3094f0ab"]},"offset":"31467281"},"sequenceEqual.js":{"size":1522,"integrity":{"algorithm":"SHA256","hash":"a95ad75f22087d64f621c89dbb16b669077a45a12d7ff833eb435641e6aab4d1","blockSize":4194304,"blocks":["a95ad75f22087d64f621c89dbb16b669077a45a12d7ff833eb435641e6aab4d1"]},"offset":"31468087"},"share.js":{"size":2866,"integrity":{"algorithm":"SHA256","hash":"bb5019b0071d511dd05eccfb01eb67fdc0935448a7bff16e56110bcea19d531f","blockSize":4194304,"blocks":["bb5019b0071d511dd05eccfb01eb67fdc0935448a7bff16e56110bcea19d531f"]},"offset":"31469609"},"shareReplay.js":{"size":770,"integrity":{"algorithm":"SHA256","hash":"39b0e1a86a95c2ba7426ecda6cff5ecd9fe09ee4e98cac55fd2f2e31ca3409ba","blockSize":4194304,"blocks":["39b0e1a86a95c2ba7426ecda6cff5ecd9fe09ee4e98cac55fd2f2e31ca3409ba"]},"offset":"31472475"},"single.js":{"size":1145,"integrity":{"algorithm":"SHA256","hash":"48ba202af104761a34fd1479310baa30449046bf1738b0319b54537c667dcb18","blockSize":4194304,"blocks":["48ba202af104761a34fd1479310baa30449046bf1738b0319b54537c667dcb18"]},"offset":"31473245"},"skip.js":{"size":148,"integrity":{"algorithm":"SHA256","hash":"34ab16b1c48db04664d8c1f2bb592195ce423bb3c2f34bf1a6cdccb0fc3517be","blockSize":4194304,"blocks":["34ab16b1c48db04664d8c1f2bb592195ce423bb3c2f34bf1a6cdccb0fc3517be"]},"offset":"31474390"},"skipLast.js":{"size":967,"integrity":{"algorithm":"SHA256","hash":"acba76bd455100796c4f94b16601819f609cb15409191b458e7e3b47c9199e95","blockSize":4194304,"blocks":["acba76bd455100796c4f94b16601819f609cb15409191b458e7e3b47c9199e95"]},"offset":"31474538"},"skipUntil.js":{"size":744,"integrity":{"algorithm":"SHA256","hash":"53162bfbc907e3ee197da3b3c73dc70049c09e8ad689f2127b03c63e7f673c3f","blockSize":4194304,"blocks":["53162bfbc907e3ee197da3b3c73dc70049c09e8ad689f2127b03c63e7f673c3f"]},"offset":"31475505"},"skipWhile.js":{"size":439,"integrity":{"algorithm":"SHA256","hash":"3b8648dc6cb5153f83f7434556f601aff41ef4791692261bf7c7e82723b3d7ff","blockSize":4194304,"blocks":["3b8648dc6cb5153f83f7434556f601aff41ef4791692261bf7c7e82723b3d7ff"]},"offset":"31476249"},"startWith.js":{"size":411,"integrity":{"algorithm":"SHA256","hash":"675fa80ca6dfed868478aec034a4c0bbd76b1b52ee7a5768b9befe9fb961cc5e","blockSize":4194304,"blocks":["675fa80ca6dfed868478aec034a4c0bbd76b1b52ee7a5768b9befe9fb961cc5e"]},"offset":"31476688"},"subscribeOn.js":{"size":273,"integrity":{"algorithm":"SHA256","hash":"96924bc32f0282e6ae66c8b4428a7f166acd9f42d677977c8d334a985880c6b3","blockSize":4194304,"blocks":["96924bc32f0282e6ae66c8b4428a7f166acd9f42d677977c8d334a985880c6b3"]},"offset":"31477099"},"switchAll.js":{"size":187,"integrity":{"algorithm":"SHA256","hash":"2e8fb688a61860ae09b066f9120267c7aa6af8d970feebaf5b545d761eee7450","blockSize":4194304,"blocks":["2e8fb688a61860ae09b066f9120267c7aa6af8d970feebaf5b545d761eee7450"]},"offset":"31477372"},"switchMap.js":{"size":1174,"integrity":{"algorithm":"SHA256","hash":"facbc17e3aba9771fed6d6e98e37849d70b8721b341f1a7a9c4478ebbb031c74","blockSize":4194304,"blocks":["facbc17e3aba9771fed6d6e98e37849d70b8721b341f1a7a9c4478ebbb031c74"]},"offset":"31477559"},"switchMapTo.js":{"size":319,"integrity":{"algorithm":"SHA256","hash":"92c025c2f9b8e9e364289cbb52948d3698f544ce656c61ae86346a4db264dcb2","blockSize":4194304,"blocks":["92c025c2f9b8e9e364289cbb52948d3698f544ce656c61ae86346a4db264dcb2"]},"offset":"31478733"},"switchScan.js":{"size":464,"integrity":{"algorithm":"SHA256","hash":"0e9c08d8d8ba0aeed60316c1a87452066f192d73da09177a097fbf9c743a40e9","blockSize":4194304,"blocks":["0e9c08d8d8ba0aeed60316c1a87452066f192d73da09177a097fbf9c743a40e9"]},"offset":"31479052"},"take.js":{"size":659,"integrity":{"algorithm":"SHA256","hash":"f4162a259d956a99ab878e0ddc715849c0b91f1dd94bc4a08b4768e69c002e8d","blockSize":4194304,"blocks":["f4162a259d956a99ab878e0ddc715849c0b91f1dd94bc4a08b4768e69c002e8d"]},"offset":"31479516"},"takeLast.js":{"size":775,"integrity":{"algorithm":"SHA256","hash":"26868531570a469c32280aa50862210b8873aa897a12c5e97fc9f0a9c16e2e44","blockSize":4194304,"blocks":["26868531570a469c32280aa50862210b8873aa897a12c5e97fc9f0a9c16e2e44"]},"offset":"31480175"},"takeUntil.js":{"size":497,"integrity":{"algorithm":"SHA256","hash":"2d10655ce42e2ca876a3d5be31d73ac0064a962600facab47baf54e2c4bdeaf4","blockSize":4194304,"blocks":["2d10655ce42e2ca876a3d5be31d73ac0064a962600facab47baf54e2c4bdeaf4"]},"offset":"31480950"},"takeWhile.js":{"size":527,"integrity":{"algorithm":"SHA256","hash":"79ec008bc00a9a7384d74b3a4774af095bff35b3c23b7c3e80297d53bc20c810","blockSize":4194304,"blocks":["79ec008bc00a9a7384d74b3a4774af095bff35b3c23b7c3e80297d53bc20c810"]},"offset":"31481447"},"tap.js":{"size":1739,"integrity":{"algorithm":"SHA256","hash":"56f6df1d2186f23e53ceb1668e5cae4a38bbb2a9e8a6b8427f7b0fd1f6c04e3e","blockSize":4194304,"blocks":["56f6df1d2186f23e53ceb1668e5cae4a38bbb2a9e8a6b8427f7b0fd1f6c04e3e"]},"offset":"31481974"},"throttle.js":{"size":1840,"integrity":{"algorithm":"SHA256","hash":"4955e0a971abe15184778b18babd2ced308a8b917bffdf52d475bcaf986249b2","blockSize":4194304,"blocks":["4955e0a971abe15184778b18babd2ced308a8b917bffdf52d475bcaf986249b2"]},"offset":"31483713"},"throttleTime.js":{"size":399,"integrity":{"algorithm":"SHA256","hash":"b8d7bb40b9a0fb2395ab7ef24490b7de89485d2f9ad180d5995e78ba4b3de30f","blockSize":4194304,"blocks":["b8d7bb40b9a0fb2395ab7ef24490b7de89485d2f9ad180d5995e78ba4b3de30f"]},"offset":"31485553"},"throwIfEmpty.js":{"size":640,"integrity":{"algorithm":"SHA256","hash":"ef07ed4723c1232be361843bfbd7c9397e52cd21ed3bd80e9c4af19e87d3e7bb","blockSize":4194304,"blocks":["ef07ed4723c1232be361843bfbd7c9397e52cd21ed3bd80e9c4af19e87d3e7bb"]},"offset":"31485952"},"timeInterval.js":{"size":739,"integrity":{"algorithm":"SHA256","hash":"ace09df5eaf2c9d760c4932e7f7248fdf236cca69185ac69ab1664a6e7a2ddaf","blockSize":4194304,"blocks":["ace09df5eaf2c9d760c4932e7f7248fdf236cca69185ac69ab1664a6e7a2ddaf"]},"offset":"31486592"},"timeout.js":{"size":2606,"integrity":{"algorithm":"SHA256","hash":"89b0bc9b3bb47492c3cbe2a5595987b2ee1207c6da022b279c587da9d38648d4","blockSize":4194304,"blocks":["89b0bc9b3bb47492c3cbe2a5595987b2ee1207c6da022b279c587da9d38648d4"]},"offset":"31487331"},"timeoutWith.js":{"size":828,"integrity":{"algorithm":"SHA256","hash":"d60167415ab1707481bc6cf0b8e92968a02ea0a3b5bdf99693b0d84d4b20fb39","blockSize":4194304,"blocks":["d60167415ab1707481bc6cf0b8e92968a02ea0a3b5bdf99693b0d84d4b20fb39"]},"offset":"31489937"},"timestamp.js":{"size":291,"integrity":{"algorithm":"SHA256","hash":"fb9f87c107a0d243a26c481c91d8bf8230cf9b2c31e0631dcb8a2cb61dcc39c7","blockSize":4194304,"blocks":["fb9f87c107a0d243a26c481c91d8bf8230cf9b2c31e0631dcb8a2cb61dcc39c7"]},"offset":"31490765"},"toArray.js":{"size":314,"integrity":{"algorithm":"SHA256","hash":"07b20af500fdbd99b3c32f07d33b2b42e0a4be186607e6526d95279beaab76ad","blockSize":4194304,"blocks":["07b20af500fdbd99b3c32f07d33b2b42e0a4be186607e6526d95279beaab76ad"]},"offset":"31491056"},"window.js":{"size":1188,"integrity":{"algorithm":"SHA256","hash":"1950958dc53106837ed5d22c6f98ac6231d7d5d10749886e25e3f09d582e14c5","blockSize":4194304,"blocks":["1950958dc53106837ed5d22c6f98ac6231d7d5d10749886e25e3f09d582e14c5"]},"offset":"31491370"},"windowCount.js":{"size":1436,"integrity":{"algorithm":"SHA256","hash":"cf979ace477abd98ed4dccdb3c7c7dd1c6ccdd8f120b6eaba6f96c5829cb9053","blockSize":4194304,"blocks":["cf979ace477abd98ed4dccdb3c7c7dd1c6ccdd8f120b6eaba6f96c5829cb9053"]},"offset":"31492558"},"windowTime.js":{"size":2599,"integrity":{"algorithm":"SHA256","hash":"9e4a4048ddd0fad273ffa12ec51d598d03c7f9087834c9ba0620c1ef368f3c76","blockSize":4194304,"blocks":["9e4a4048ddd0fad273ffa12ec51d598d03c7f9087834c9ba0620c1ef368f3c76"]},"offset":"31493994"},"windowToggle.js":{"size":2069,"integrity":{"algorithm":"SHA256","hash":"b41bad81976088caac9f141324dc4c182999d4f257f35757666a369e2900bd1e","blockSize":4194304,"blocks":["b41bad81976088caac9f141324dc4c182999d4f257f35757666a369e2900bd1e"]},"offset":"31496593"},"windowWhen.js":{"size":1569,"integrity":{"algorithm":"SHA256","hash":"6629001fe0e6158195a0d06599016a5ed26fc30f6a740c003b43dba74c5c1f9e","blockSize":4194304,"blocks":["6629001fe0e6158195a0d06599016a5ed26fc30f6a740c003b43dba74c5c1f9e"]},"offset":"31498662"},"withLatestFrom.js":{"size":1274,"integrity":{"algorithm":"SHA256","hash":"a31ab487503d072f665acd4190262b906e6dac5c4daf4fc39e4bbde1a8e66ee2","blockSize":4194304,"blocks":["a31ab487503d072f665acd4190262b906e6dac5c4daf4fc39e4bbde1a8e66ee2"]},"offset":"31500231"},"zip.js":{"size":275,"integrity":{"algorithm":"SHA256","hash":"030c865011624aa39dcbafda4f277b54b344ac3976784d318595fa7d37a12f1d","blockSize":4194304,"blocks":["030c865011624aa39dcbafda4f277b54b344ac3976784d318595fa7d37a12f1d"]},"offset":"31501505"},"zipAll.js":{"size":209,"integrity":{"algorithm":"SHA256","hash":"185c0ae906baa9194eebb3e5ba72ab209bf7c6d9675461ebad3b57ba21c76f5d","blockSize":4194304,"blocks":["185c0ae906baa9194eebb3e5ba72ab209bf7c6d9675461ebad3b57ba21c76f5d"]},"offset":"31501780"},"zipWith.js":{"size":140,"integrity":{"algorithm":"SHA256","hash":"dc6fa1a01309f83f45cacd628badd11c99a34c9203accd5272b18cf9d5b9290c","blockSize":4194304,"blocks":["dc6fa1a01309f83f45cacd628badd11c99a34c9203accd5272b18cf9d5b9290c"]},"offset":"31501989"}}},"observable":{"files":{"ConnectableObservable.js":{"size":1979,"integrity":{"algorithm":"SHA256","hash":"ea2774ee261c755393b13acbd120a61e148a74556d57407714e3b662c19b9cea","blockSize":4194304,"blocks":["ea2774ee261c755393b13acbd120a61e148a74556d57407714e3b662c19b9cea"]},"offset":"31502129"},"bindCallback.js":{"size":261,"integrity":{"algorithm":"SHA256","hash":"1d38189d2791a28b5715a4c9761528818eccbda19701baf717a5d5229c81040a","blockSize":4194304,"blocks":["1d38189d2791a28b5715a4c9761528818eccbda19701baf717a5d5229c81040a"]},"offset":"31504108"},"bindCallbackInternals.js":{"size":2321,"integrity":{"algorithm":"SHA256","hash":"0cd202ddecd8865597b8140c1b41affa4904e8b2ae52ea0a32005c4c4a919d38","blockSize":4194304,"blocks":["0cd202ddecd8865597b8140c1b41affa4904e8b2ae52ea0a32005c4c4a919d38"]},"offset":"31504369"},"bindNodeCallback.js":{"size":268,"integrity":{"algorithm":"SHA256","hash":"cdf38b1927b8f7d1b753b815e16ab329c024d4cb2d07254cf2032772f67f3dc5","blockSize":4194304,"blocks":["cdf38b1927b8f7d1b753b815e16ab329c024d4cb2d07254cf2032772f67f3dc5"]},"offset":"31506690"},"combineLatest.js":{"size":2520,"integrity":{"algorithm":"SHA256","hash":"3edc96546bebb287e0e022ea57cfc706f79b9d074b9236abc68843e0e074d446","blockSize":4194304,"blocks":["3edc96546bebb287e0e022ea57cfc706f79b9d074b9236abc68843e0e074d446"]},"offset":"31506958"},"concat.js":{"size":254,"integrity":{"algorithm":"SHA256","hash":"5f2307c410e3aa8765b59142b4a5887382d2051f364c99e98adb0af195f6b431","blockSize":4194304,"blocks":["5f2307c410e3aa8765b59142b4a5887382d2051f364c99e98adb0af195f6b431"]},"offset":"31509478"},"connectable.js":{"size":855,"integrity":{"algorithm":"SHA256","hash":"5f2eafc7333ce646d271d916be0c57acdbeb58cc36ba0a21edf71daf2a0549d9","blockSize":4194304,"blocks":["5f2eafc7333ce646d271d916be0c57acdbeb58cc36ba0a21edf71daf2a0549d9"]},"offset":"31509732"},"defer.js":{"size":277,"integrity":{"algorithm":"SHA256","hash":"69c50b163126300599491485bc05b8c8cab49332f50b09deaa239b5f4518c173","blockSize":4194304,"blocks":["69c50b163126300599491485bc05b8c8cab49332f50b09deaa239b5f4518c173"]},"offset":"31510587"},"empty.js":{"size":379,"integrity":{"algorithm":"SHA256","hash":"e3c8048f627355e2abd4f02ccec735030059117046d02004b836b5b359bd1e5a","blockSize":4194304,"blocks":["e3c8048f627355e2abd4f02ccec735030059117046d02004b836b5b359bd1e5a"]},"offset":"31510864"},"forkJoin.js":{"size":1728,"integrity":{"algorithm":"SHA256","hash":"c30a4457c3af259ea9c1510dfa14589b26fd6cd38f4ad943c08bdf432a422fa3","blockSize":4194304,"blocks":["c30a4457c3af259ea9c1510dfa14589b26fd6cd38f4ad943c08bdf432a422fa3"]},"offset":"31511243"},"from.js":{"size":239,"integrity":{"algorithm":"SHA256","hash":"04774464751b291738f9331945e57ac84b11886da645e3d6b04306adbbeabed2","blockSize":4194304,"blocks":["04774464751b291738f9331945e57ac84b11886da645e3d6b04306adbbeabed2"]},"offset":"31512971"},"fromEvent.js":{"size":2225,"integrity":{"algorithm":"SHA256","hash":"e61c7d60f1c650740069031307d8f2acfdf462fa1522de68f83d6145fb968277","blockSize":4194304,"blocks":["e61c7d60f1c650740069031307d8f2acfdf462fa1522de68f83d6145fb968277"]},"offset":"31513210"},"fromEventPattern.js":{"size":680,"integrity":{"algorithm":"SHA256","hash":"793c89cd55bb5da110e14940f62c2c96926ac3cea7de340419b0a41b6a0e1c41","blockSize":4194304,"blocks":["793c89cd55bb5da110e14940f62c2c96926ac3cea7de340419b0a41b6a0e1c41"]},"offset":"31515435"},"fromSubscribable.js":{"size":218,"integrity":{"algorithm":"SHA256","hash":"11f29ef330d84e185f79b7b245b0cf5d7251c77a037baacc885b7d50af71e059","blockSize":4194304,"blocks":["11f29ef330d84e185f79b7b245b0cf5d7251c77a037baacc885b7d50af71e059"]},"offset":"31516115"},"generate.js":{"size":1230,"integrity":{"algorithm":"SHA256","hash":"fa28aae3a41717439d4ad133099ab2e3fdab69822fae0e1391071d744cb41c91","blockSize":4194304,"blocks":["fa28aae3a41717439d4ad133099ab2e3fdab69822fae0e1391071d744cb41c91"]},"offset":"31516333"},"iif.js":{"size":190,"integrity":{"algorithm":"SHA256","hash":"44e962e1a4c4afce01d26b8d6dfab3d62cdd2773e1314ca146d279dfc2fb418c","blockSize":4194304,"blocks":["44e962e1a4c4afce01d26b8d6dfab3d62cdd2773e1314ca146d279dfc2fb418c"]},"offset":"31517563"},"innerFrom.js":{"size":3931,"integrity":{"algorithm":"SHA256","hash":"3ced09dc64778bbf1c968ce64220eca0b6942c24983cf0f4231f3301e596fe94","blockSize":4194304,"blocks":["3ced09dc64778bbf1c968ce64220eca0b6942c24983cf0f4231f3301e596fe94"]},"offset":"31517753"},"interval.js":{"size":284,"integrity":{"algorithm":"SHA256","hash":"5e7648ec8026e5efd1aecb2b16375af37ab536c4dc6146b537e8725887b95c7a","blockSize":4194304,"blocks":["5e7648ec8026e5efd1aecb2b16375af37ab536c4dc6146b537e8725887b95c7a"]},"offset":"31521684"},"merge.js":{"size":613,"integrity":{"algorithm":"SHA256","hash":"1e4807274d7969e524635ccf432498c57b4b4cb840d97266260b4aef5263d4ae","blockSize":4194304,"blocks":["1e4807274d7969e524635ccf432498c57b4b4cb840d97266260b4aef5263d4ae"]},"offset":"31521968"},"never.js":{"size":203,"integrity":{"algorithm":"SHA256","hash":"be99eb462dcc8faf6bea09e9f636a1a122734371545cd9caca73cf33ba2b3d3b","blockSize":4194304,"blocks":["be99eb462dcc8faf6bea09e9f636a1a122734371545cd9caca73cf33ba2b3d3b"]},"offset":"31522581"},"of.js":{"size":214,"integrity":{"algorithm":"SHA256","hash":"f969dd317e5c25201a4d81578d29795bdfb30f319289a7646265ee9c830ca32e","blockSize":4194304,"blocks":["f969dd317e5c25201a4d81578d29795bdfb30f319289a7646265ee9c830ca32e"]},"offset":"31522784"},"onErrorResumeNext.js":{"size":344,"integrity":{"algorithm":"SHA256","hash":"3000ddcc99ac231221b7b75a4cca4a955323f437bbc2d8cd4ea97c79b909d51a","blockSize":4194304,"blocks":["3000ddcc99ac231221b7b75a4cca4a955323f437bbc2d8cd4ea97c79b909d51a"]},"offset":"31522998"},"pairs.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"175d6a4d26640f417bb8edd24b6377359ad169d3de41ed9a48caf51378fb84aa","blockSize":4194304,"blocks":["175d6a4d26640f417bb8edd24b6377359ad169d3de41ed9a48caf51378fb84aa"]},"offset":"31523342"},"partition.js":{"size":329,"integrity":{"algorithm":"SHA256","hash":"b30a3137ff0850558c3e4a153833ec08a730f94112a20f988307d31861196abb","blockSize":4194304,"blocks":["b30a3137ff0850558c3e4a153833ec08a730f94112a20f988307d31861196abb"]},"offset":"31523497"},"race.js":{"size":1051,"integrity":{"algorithm":"SHA256","hash":"edbefa926ff4e8241eb6c6c17fb49018cbef4d3383364eeef223358d3b79990e","blockSize":4194304,"blocks":["edbefa926ff4e8241eb6c6c17fb49018cbef4d3383364eeef223358d3b79990e"]},"offset":"31523826"},"range.js":{"size":994,"integrity":{"algorithm":"SHA256","hash":"c425cc8b94cda268606f37ac65bfabf4d518ca1a2bb82d9c4745084a23adc6b2","blockSize":4194304,"blocks":["c425cc8b94cda268606f37ac65bfabf4d518ca1a2bb82d9c4745084a23adc6b2"]},"offset":"31524877"},"throwError.js":{"size":472,"integrity":{"algorithm":"SHA256","hash":"a8c0789eec5e75a57526906a28e021023c4260340c053b637b3d3a218255707a","blockSize":4194304,"blocks":["a8c0789eec5e75a57526906a28e021023c4260340c053b637b3d3a218255707a"]},"offset":"31525871"},"timer.js":{"size":1150,"integrity":{"algorithm":"SHA256","hash":"13368d6a9bb5347b6bee46f8ff499af6acfdc74c19a6c0911c0fe9ecdd7aca30","blockSize":4194304,"blocks":["13368d6a9bb5347b6bee46f8ff499af6acfdc74c19a6c0911c0fe9ecdd7aca30"]},"offset":"31526343"},"using.js":{"size":574,"integrity":{"algorithm":"SHA256","hash":"ae262a62ab53055e5db728f609609f3f68e89cdb4242cb3ff3cdff3bf2b9c7dd","blockSize":4194304,"blocks":["ae262a62ab53055e5db728f609609f3f68e89cdb4242cb3ff3cdff3bf2b9c7dd"]},"offset":"31527493"},"zip.js":{"size":1729,"integrity":{"algorithm":"SHA256","hash":"fdf809afede2d7505273c7b972f7ab18d50b818386274299380e702f01c6af41","blockSize":4194304,"blocks":["fdf809afede2d7505273c7b972f7ab18d50b818386274299380e702f01c6af41"]},"offset":"31528067"},"dom":{"files":{"WebSocketSubject.js":{"size":7207,"integrity":{"algorithm":"SHA256","hash":"c3039b692d727923524b90cf16619a20d68c5103a7f0ab55631cd8a5463583d4","blockSize":4194304,"blocks":["c3039b692d727923524b90cf16619a20d68c5103a7f0ab55631cd8a5463583d4"]},"offset":"31529796"},"animationFrames.js":{"size":1256,"integrity":{"algorithm":"SHA256","hash":"9e87ccfca45e530c7e3520aab5eca663edcb90e89426d4f918892e9b1ed7bf62","blockSize":4194304,"blocks":["9e87ccfca45e530c7e3520aab5eca663edcb90e89426d4f918892e9b1ed7bf62"]},"offset":"31537003"},"fetch.js":{"size":1980,"integrity":{"algorithm":"SHA256","hash":"83daa33360149db733015343cb8be94109b624b32c64e0f7edfcadfc9a62c2ee","blockSize":4194304,"blocks":["83daa33360149db733015343cb8be94109b624b32c64e0f7edfcadfc9a62c2ee"]},"offset":"31538259"},"webSocket.js":{"size":193,"integrity":{"algorithm":"SHA256","hash":"e573d4a26c8af0d27e7e55106a3017238707c868515fab8911baa3d1bac92c05","blockSize":4194304,"blocks":["e573d4a26c8af0d27e7e55106a3017238707c868515fab8911baa3d1bac92c05"]},"offset":"31540239"}}}}},"ajax":{"files":{"AjaxResponse.js":{"size":1078,"integrity":{"algorithm":"SHA256","hash":"daabd3b00edfd40240b8dde056d8567619942b3c6ea12bd4c1ce97ee089a0b42","blockSize":4194304,"blocks":["daabd3b00edfd40240b8dde056d8567619942b3c6ea12bd4c1ce97ee089a0b42"]},"offset":"31540432"},"ajax.js":{"size":9497,"integrity":{"algorithm":"SHA256","hash":"4b9ed372e9124c5cf78954ed3151b02840a30d62267edf86d225fdd5bcbffbe5","blockSize":4194304,"blocks":["4b9ed372e9124c5cf78954ed3151b02840a30d62267edf86d225fdd5bcbffbe5"]},"offset":"31541510"},"errors.js":{"size":924,"integrity":{"algorithm":"SHA256","hash":"eaccfdffe45560efc04177baa9c937c65941f076e0909b874ccae76feada08aa","blockSize":4194304,"blocks":["eaccfdffe45560efc04177baa9c937c65941f076e0909b874ccae76feada08aa"]},"offset":"31551007"},"getXHRResponse.js":{"size":674,"integrity":{"algorithm":"SHA256","hash":"cba9472fb92368ad0ca7fe0a863d603375c84f371c6468baf4cdc3190ba1ae15","blockSize":4194304,"blocks":["cba9472fb92368ad0ca7fe0a863d603375c84f371c6468baf4cdc3190ba1ae15"]},"offset":"31551931"},"types.js":{"size":44,"integrity":{"algorithm":"SHA256","hash":"01ae2a5b120382f9a648ced7ee8507493a134f216d100fc61600c6c9738235d2","blockSize":4194304,"blocks":["01ae2a5b120382f9a648ced7ee8507493a134f216d100fc61600c6c9738235d2"]},"offset":"31552605"}}}}},"fetch":{"files":{"index.js":{"size":95,"integrity":{"algorithm":"SHA256","hash":"627e8845399533ed35b527db722369142ac804e5aa8e949811335dbdc762ad32","blockSize":4194304,"blocks":["627e8845399533ed35b527db722369142ac804e5aa8e949811335dbdc762ad32"]},"offset":"31552649"}}},"ajax":{"files":{"index.js":{"size":212,"integrity":{"algorithm":"SHA256","hash":"02f835fb3411417fceaa3e75db8bcd020af4efc9955e8db6292925a79e74e08e","blockSize":4194304,"blocks":["02f835fb3411417fceaa3e75db8bcd020af4efc9955e8db6292925a79e74e08e"]},"offset":"31552744"}}}}},"cjs":{"files":{"index.js":{"size":34859,"integrity":{"algorithm":"SHA256","hash":"d61e53ba20f0bb09d7bc533276cd748af891536da999d4633ee6b31e05fb8368","blockSize":4194304,"blocks":["d61e53ba20f0bb09d7bc533276cd748af891536da999d4633ee6b31e05fb8368"]},"offset":"31552956"},"webSocket":{"files":{"index.js":{"size":572,"integrity":{"algorithm":"SHA256","hash":"b15329c16d3a919fc81718c32c5cc3859eb79f2bba4ecfea2c717b0e7ebb454a","blockSize":4194304,"blocks":["b15329c16d3a919fc81718c32c5cc3859eb79f2bba4ecfea2c717b0e7ebb454a"]},"offset":"31587815"}}},"testing":{"files":{"index.js":{"size":341,"integrity":{"algorithm":"SHA256","hash":"f48f35ad7a6684109058bc92cd53f79f33a91ad3340f3847669895c14fc05dff","blockSize":4194304,"blocks":["f48f35ad7a6684109058bc92cd53f79f33a91ad3340f3847669895c14fc05dff"]},"offset":"31588387"}}},"operators":{"files":{"index.js":{"size":22685,"integrity":{"algorithm":"SHA256","hash":"d14a5c7f758746128fe1b005607ab7d0ecefef2a08e4bbd452c528a17acd1f88","blockSize":4194304,"blocks":["d14a5c7f758746128fe1b005607ab7d0ecefef2a08e4bbd452c528a17acd1f88"]},"offset":"31588728"}}},"internal":{"files":{"AnyCatcher.js":{"size":115,"integrity":{"algorithm":"SHA256","hash":"91c897230d12a98010279378e5500b6ec6387623281a68138bcbbe66ee638ec2","blockSize":4194304,"blocks":["91c897230d12a98010279378e5500b6ec6387623281a68138bcbbe66ee638ec2"]},"offset":"31611413"},"AsyncSubject.js":{"size":2343,"integrity":{"algorithm":"SHA256","hash":"43b0579f650bb20c3d9478b09acbb5608571c181fafd87cea9ade2b5d39001c7","blockSize":4194304,"blocks":["43b0579f650bb20c3d9478b09acbb5608571c181fafd87cea9ade2b5d39001c7"]},"offset":"31611528"},"BehaviorSubject.js":{"size":2127,"integrity":{"algorithm":"SHA256","hash":"54df6a1d20262c2d8b084fe4da90614a4decdfab2b63a21b9240556a344479dd","blockSize":4194304,"blocks":["54df6a1d20262c2d8b084fe4da90614a4decdfab2b63a21b9240556a344479dd"]},"offset":"31613871"},"Notification.js":{"size":3480,"integrity":{"algorithm":"SHA256","hash":"3a72c358a4659d46a8864dc8d6e170f4bee8afae1f6deeb0bd79cee8b118b381","blockSize":4194304,"blocks":["3a72c358a4659d46a8864dc8d6e170f4bee8afae1f6deeb0bd79cee8b118b381"]},"offset":"31615998"},"NotificationFactories.js":{"size":817,"integrity":{"algorithm":"SHA256","hash":"34211501b457fa1f9100ae06f22f2052e97dd8fc85257536f11eb5a912a1f453","blockSize":4194304,"blocks":["34211501b457fa1f9100ae06f22f2052e97dd8fc85257536f11eb5a912a1f453"]},"offset":"31619478"},"Observable.js":{"size":4010,"integrity":{"algorithm":"SHA256","hash":"2227e1910b1b075441d460ed4b1378046ef0e2292263ccf4d88341b9a519516e","blockSize":4194304,"blocks":["2227e1910b1b075441d460ed4b1378046ef0e2292263ccf4d88341b9a519516e"]},"offset":"31620295"},"Operator.js":{"size":113,"integrity":{"algorithm":"SHA256","hash":"5e7dccac6d50d2cd5d936c80ff9c66aacae4155fda38b1269ed996d224073524","blockSize":4194304,"blocks":["5e7dccac6d50d2cd5d936c80ff9c66aacae4155fda38b1269ed996d224073524"]},"offset":"31624305"},"ReplaySubject.js":{"size":3720,"integrity":{"algorithm":"SHA256","hash":"108e51d51b7605ff27ea89f3ca050eb12354e17a1d112bd9740ea54f3fa69cb1","blockSize":4194304,"blocks":["108e51d51b7605ff27ea89f3ca050eb12354e17a1d112bd9740ea54f3fa69cb1"]},"offset":"31624418"},"Scheduler.js":{"size":768,"integrity":{"algorithm":"SHA256","hash":"3bf02b963f7038a456632d87a2cf184ecc75c5521bf7c7d118d14a26414dbb78","blockSize":4194304,"blocks":["3bf02b963f7038a456632d87a2cf184ecc75c5521bf7c7d118d14a26414dbb78"]},"offset":"31628138"},"Subject.js":{"size":7582,"integrity":{"algorithm":"SHA256","hash":"de52b970f505d635b1f5a0d7dd47bc2737d8f5cd239db5aa52e4d706fee66a89","blockSize":4194304,"blocks":["de52b970f505d635b1f5a0d7dd47bc2737d8f5cd239db5aa52e4d706fee66a89"]},"offset":"31628906"},"Subscriber.js":{"size":7107,"integrity":{"algorithm":"SHA256","hash":"23e53ce697e512be9bb701fdc4a009cbacb9a2d70ddc679f1bed04ec63f05250","blockSize":4194304,"blocks":["23e53ce697e512be9bb701fdc4a009cbacb9a2d70ddc679f1bed04ec63f05250"]},"offset":"31636488"},"Subscription.js":{"size":7122,"integrity":{"algorithm":"SHA256","hash":"5f28dd229997514ba0b6dbeb2a3f7900b18e33120748df785a4357db5e5929ce","blockSize":4194304,"blocks":["5f28dd229997514ba0b6dbeb2a3f7900b18e33120748df785a4357db5e5929ce"]},"offset":"31643595"},"config.js":{"size":330,"integrity":{"algorithm":"SHA256","hash":"20d61d0667f95f0d8bd5c70334ee21dd689de75c9de78334d005931b23e44af8","blockSize":4194304,"blocks":["20d61d0667f95f0d8bd5c70334ee21dd689de75c9de78334d005931b23e44af8"]},"offset":"31650717"},"firstValueFrom.js":{"size":952,"integrity":{"algorithm":"SHA256","hash":"e300a978f02e8da5793e2a4c557d47d02d5c990051da9e65f2e68b3b47f6c66a","blockSize":4194304,"blocks":["e300a978f02e8da5793e2a4c557d47d02d5c990051da9e65f2e68b3b47f6c66a"]},"offset":"31651047"},"lastValueFrom.js":{"size":969,"integrity":{"algorithm":"SHA256","hash":"7c56cf5071ad2d0b7a053f2923485933ec9717cced9013a94be46ef725bb0fc3","blockSize":4194304,"blocks":["7c56cf5071ad2d0b7a053f2923485933ec9717cced9013a94be46ef725bb0fc3"]},"offset":"31651999"},"types.js":{"size":110,"integrity":{"algorithm":"SHA256","hash":"b0d2bc4142d0c62d43f996aaeb64f22c4889ac853f8a3765758b505d972d0149","blockSize":4194304,"blocks":["b0d2bc4142d0c62d43f996aaeb64f22c4889ac853f8a3765758b505d972d0149"]},"offset":"31652968"},"util":{"files":{"ArgumentOutOfRangeError.js":{"size":496,"integrity":{"algorithm":"SHA256","hash":"f67fbb0c0a27bcdc1b12eff9d7483e924f2d2b2bd3aa74de52eabba4dd5ee954","blockSize":4194304,"blocks":["f67fbb0c0a27bcdc1b12eff9d7483e924f2d2b2bd3aa74de52eabba4dd5ee954"]},"offset":"31653078"},"EmptyError.js":{"size":413,"integrity":{"algorithm":"SHA256","hash":"d2c6f71eb987daf20211f00078c4243a672443cb21808b446df63a20052533c4","blockSize":4194304,"blocks":["d2c6f71eb987daf20211f00078c4243a672443cb21808b446df63a20052533c4"]},"offset":"31653574"},"Immediate.js":{"size":891,"integrity":{"algorithm":"SHA256","hash":"ba24b6e564891359ce53c06acd8fdb7d934bd8ad475b7c514fa984f76e6c05f6","blockSize":4194304,"blocks":["ba24b6e564891359ce53c06acd8fdb7d934bd8ad475b7c514fa984f76e6c05f6"]},"offset":"31653987"},"NotFoundError.js":{"size":437,"integrity":{"algorithm":"SHA256","hash":"409304607a60be8cf33cbe4f0c5fa7eb6af9012ecd499769e4dd441e3afe1865","blockSize":4194304,"blocks":["409304607a60be8cf33cbe4f0c5fa7eb6af9012ecd499769e4dd441e3afe1865"]},"offset":"31654878"},"ObjectUnsubscribedError.js":{"size":494,"integrity":{"algorithm":"SHA256","hash":"913786f6c6f7608fdc9ce0c19c2be2d7da18e69acc172d61a8d51086e38e93d7","blockSize":4194304,"blocks":["913786f6c6f7608fdc9ce0c19c2be2d7da18e69acc172d61a8d51086e38e93d7"]},"offset":"31655315"},"SequenceError.js":{"size":437,"integrity":{"algorithm":"SHA256","hash":"2113a9da572c43affb14b7e8820c03f431887038c39c54d258dfb5fa4b964195","blockSize":4194304,"blocks":["2113a9da572c43affb14b7e8820c03f431887038c39c54d258dfb5fa4b964195"]},"offset":"31655809"},"UnsubscriptionError.js":{"size":673,"integrity":{"algorithm":"SHA256","hash":"88d7121c29fe765b61acaaece860ea3b4d9f5906ca446a28b73c2ebccc72416d","blockSize":4194304,"blocks":["88d7121c29fe765b61acaaece860ea3b4d9f5906ca446a28b73c2ebccc72416d"]},"offset":"31656246"},"applyMixins.js":{"size":601,"integrity":{"algorithm":"SHA256","hash":"7db1ae8184a0f06cfcb708acec0f54d2e39cd8fb17d533b7a23e1d167746e832","blockSize":4194304,"blocks":["7db1ae8184a0f06cfcb708acec0f54d2e39cd8fb17d533b7a23e1d167746e832"]},"offset":"31656919"},"args.js":{"size":779,"integrity":{"algorithm":"SHA256","hash":"08670b0421d9301f33ec8fb90774f2d0c625d3968445928c707d2d184491ee49","blockSize":4194304,"blocks":["08670b0421d9301f33ec8fb90774f2d0c625d3968445928c707d2d184491ee49"]},"offset":"31657520"},"argsArgArrayOrObject.js":{"size":908,"integrity":{"algorithm":"SHA256","hash":"018c416724d8cfc0a72858389650305bee22bd9aa1c5ed224f2a6c723f57b12e","blockSize":4194304,"blocks":["018c416724d8cfc0a72858389650305bee22bd9aa1c5ed224f2a6c723f57b12e"]},"offset":"31658299"},"argsOrArgArray.js":{"size":323,"integrity":{"algorithm":"SHA256","hash":"566eb7a1f25289462a095282587addce462d1754b703d5b995af855dfe63d145","blockSize":4194304,"blocks":["566eb7a1f25289462a095282587addce462d1754b703d5b995af855dfe63d145"]},"offset":"31659207"},"arrRemove.js":{"size":311,"integrity":{"algorithm":"SHA256","hash":"befcc9f2443c3d1d17b9126e5e95c2ed1d05e35d11e9acfcf4198c881f34c1f2","blockSize":4194304,"blocks":["befcc9f2443c3d1d17b9126e5e95c2ed1d05e35d11e9acfcf4198c881f34c1f2"]},"offset":"31659530"},"createErrorClass.js":{"size":527,"integrity":{"algorithm":"SHA256","hash":"a53d97d27bc43b560dc14fd6de162c6254c97cb42597aa3ee4adec353e2ddd24","blockSize":4194304,"blocks":["a53d97d27bc43b560dc14fd6de162c6254c97cb42597aa3ee4adec353e2ddd24"]},"offset":"31659841"},"createObject.js":{"size":328,"integrity":{"algorithm":"SHA256","hash":"1b754634f273975a2ccb25d25acfa12ac52207f2f9f826f04263db1c7c5952bf","blockSize":4194304,"blocks":["1b754634f273975a2ccb25d25acfa12ac52207f2f9f826f04263db1c7c5952bf"]},"offset":"31660368"},"errorContext.js":{"size":960,"integrity":{"algorithm":"SHA256","hash":"a873614dc20f67113485f2c6d23db1787278dbacd1648192921bafdb7c715b83","blockSize":4194304,"blocks":["a873614dc20f67113485f2c6d23db1787278dbacd1648192921bafdb7c715b83"]},"offset":"31660696"},"executeSchedule.js":{"size":726,"integrity":{"algorithm":"SHA256","hash":"cebe272ba6e3bca60750fd13633728fa27b2b21b8e1d4b0c5bfa9a1a46b2ea0d","blockSize":4194304,"blocks":["cebe272ba6e3bca60750fd13633728fa27b2b21b8e1d4b0c5bfa9a1a46b2ea0d"]},"offset":"31661656"},"identity.js":{"size":208,"integrity":{"algorithm":"SHA256","hash":"67ee561ef5325e14030110f96d44b01fbdd92e41b7982f9fde42533ca3f4e510","blockSize":4194304,"blocks":["67ee561ef5325e14030110f96d44b01fbdd92e41b7982f9fde42533ca3f4e510"]},"offset":"31662382"},"isArrayLike.js":{"size":257,"integrity":{"algorithm":"SHA256","hash":"f6472821ab1a3fcc3681be9d1788a36f098980d2c1a614aaeb5334924de6a2ed","blockSize":4194304,"blocks":["f6472821ab1a3fcc3681be9d1788a36f098980d2c1a614aaeb5334924de6a2ed"]},"offset":"31662590"},"isAsyncIterable.js":{"size":404,"integrity":{"algorithm":"SHA256","hash":"168f5393c3c3400ca78fed481d631f323ca71c3175d1f6c233beef7b687da2ff","blockSize":4194304,"blocks":["168f5393c3c3400ca78fed481d631f323ca71c3175d1f6c233beef7b687da2ff"]},"offset":"31662847"},"isDate.js":{"size":259,"integrity":{"algorithm":"SHA256","hash":"3b37cb89e7823b7c4e3eb3a12cba2cf44a8701a2e750958fbe1bd5b02c656ea1","blockSize":4194304,"blocks":["3b37cb89e7823b7c4e3eb3a12cba2cf44a8701a2e750958fbe1bd5b02c656ea1"]},"offset":"31663251"},"isFunction.js":{"size":248,"integrity":{"algorithm":"SHA256","hash":"79b21347d14e3ef6d9cd5525d03ff3c586144643f67d71aa7733152542571d8f","blockSize":4194304,"blocks":["79b21347d14e3ef6d9cd5525d03ff3c586144643f67d71aa7733152542571d8f"]},"offset":"31663510"},"isInteropObservable.js":{"size":417,"integrity":{"algorithm":"SHA256","hash":"f1457347f4f6acc6c7e14cadee4730dcea152850a0d906484eb1a192a4804e7c","blockSize":4194304,"blocks":["f1457347f4f6acc6c7e14cadee4730dcea152850a0d906484eb1a192a4804e7c"]},"offset":"31663758"},"isIterable.js":{"size":410,"integrity":{"algorithm":"SHA256","hash":"a1953261a74b9f960bfb5747af6887e09a36422ceea465e35fa30ee891c6af3f","blockSize":4194304,"blocks":["a1953261a74b9f960bfb5747af6887e09a36422ceea465e35fa30ee891c6af3f"]},"offset":"31664175"},"isObservable.js":{"size":448,"integrity":{"algorithm":"SHA256","hash":"b0f3359a136d1a5494b4c8849abe37155db57a225f19c1b65c41ba9126d9b539","blockSize":4194304,"blocks":["b0f3359a136d1a5494b4c8849abe37155db57a225f19c1b65c41ba9126d9b539"]},"offset":"31664585"},"isPromise.js":{"size":341,"integrity":{"algorithm":"SHA256","hash":"40c83b0c84cd2437108ea62c24b040f4cad620eb2e1b6371ced99ac1e58f913f","blockSize":4194304,"blocks":["40c83b0c84cd2437108ea62c24b040f4cad620eb2e1b6371ced99ac1e58f913f"]},"offset":"31665033"},"isReadableStreamLike.js":{"size":4634,"integrity":{"algorithm":"SHA256","hash":"680367631adb0b97ca69edd6012ae57b0f84ca3b117a78e0a39b12af5d24fb00","blockSize":4194304,"blocks":["680367631adb0b97ca69edd6012ae57b0f84ca3b117a78e0a39b12af5d24fb00"]},"offset":"31665374"},"isScheduler.js":{"size":318,"integrity":{"algorithm":"SHA256","hash":"9ed28c2d2ee5ea174c96495890dbf5a71d2447742f0035fa32183a281a5c6ab3","blockSize":4194304,"blocks":["9ed28c2d2ee5ea174c96495890dbf5a71d2447742f0035fa32183a281a5c6ab3"]},"offset":"31670008"},"lift.js":{"size":805,"integrity":{"algorithm":"SHA256","hash":"32e3757f091c1e576e53235cc18ae32f23e704dca05d07bc9a9db236152ce697","blockSize":4194304,"blocks":["32e3757f091c1e576e53235cc18ae32f23e704dca05d07bc9a9db236152ce697"]},"offset":"31670326"},"mapOneOrManyArgs.js":{"size":1180,"integrity":{"algorithm":"SHA256","hash":"e09064988ac2193f0a08eac93478c665a240cc0f6c5f900aba0079f0bab53fbf","blockSize":4194304,"blocks":["e09064988ac2193f0a08eac93478c665a240cc0f6c5f900aba0079f0bab53fbf"]},"offset":"31671131"},"noop.js":{"size":173,"integrity":{"algorithm":"SHA256","hash":"61b6da836c0749da346edbb8a3e6d4a5b8c4d0e70e64189b0b120df372487a01","blockSize":4194304,"blocks":["61b6da836c0749da346edbb8a3e6d4a5b8c4d0e70e64189b0b120df372487a01"]},"offset":"31672311"},"not.js":{"size":263,"integrity":{"algorithm":"SHA256","hash":"572a60fa060acbf1ddb30f8e096d5ba120fc4ac2dd5a2c9d8eb92c61c12943ce","blockSize":4194304,"blocks":["572a60fa060acbf1ddb30f8e096d5ba120fc4ac2dd5a2c9d8eb92c61c12943ce"]},"offset":"31672484"},"pipe.js":{"size":693,"integrity":{"algorithm":"SHA256","hash":"b2770b80ea36975151c9d67279fe2e39167288a014198aefca07aab10788635c","blockSize":4194304,"blocks":["b2770b80ea36975151c9d67279fe2e39167288a014198aefca07aab10788635c"]},"offset":"31672747"},"reportUnhandledError.js":{"size":619,"integrity":{"algorithm":"SHA256","hash":"ce47e5a9c6c093ab22df32cad9ce8593b7422dcacb00ab99f43e01660ae188d1","blockSize":4194304,"blocks":["ce47e5a9c6c093ab22df32cad9ce8593b7422dcacb00ab99f43e01660ae188d1"]},"offset":"31673440"},"subscribeToArray.js":{"size":426,"integrity":{"algorithm":"SHA256","hash":"8e52ef049d2092bcc2ba9c3791fa014108bef7b8e235a7f7f92bd25786498562","blockSize":4194304,"blocks":["8e52ef049d2092bcc2ba9c3791fa014108bef7b8e235a7f7f92bd25786498562"]},"offset":"31674059"},"throwUnobservableError.js":{"size":566,"integrity":{"algorithm":"SHA256","hash":"2df9b4fbcd41f5881f1428b60ac107dce568065c0418496c9db0ab87ae8127b3","blockSize":4194304,"blocks":["2df9b4fbcd41f5881f1428b60ac107dce568065c0418496c9db0ab87ae8127b3"]},"offset":"31674485"},"workarounds.js":{"size":116,"integrity":{"algorithm":"SHA256","hash":"0cca7c7946c7943d8ecfc7a2523ba658db92f7a95567bda2f9bb456d198d117f","blockSize":4194304,"blocks":["0cca7c7946c7943d8ecfc7a2523ba658db92f7a95567bda2f9bb456d198d117f"]},"offset":"31675051"}}},"testing":{"files":{"ColdObservable.js":{"size":2664,"integrity":{"algorithm":"SHA256","hash":"459593fb93e38f8cc924a7ec1dab10426e28fa31fb503a5a63054b5f594be19c","blockSize":4194304,"blocks":["459593fb93e38f8cc924a7ec1dab10426e28fa31fb503a5a63054b5f594be19c"]},"offset":"31675167"},"HotObservable.js":{"size":2681,"integrity":{"algorithm":"SHA256","hash":"c93d03f9046bbb301808018bf434186691c8e253391e85553615a5f06463a879","blockSize":4194304,"blocks":["c93d03f9046bbb301808018bf434186691c8e253391e85553615a5f06463a879"]},"offset":"31677831"},"SubscriptionLog.js":{"size":517,"integrity":{"algorithm":"SHA256","hash":"2c8fd1196f282e489c50c0cd94700bbdbed79b4bcfe765d5b1a661d7ac2ddf01","blockSize":4194304,"blocks":["2c8fd1196f282e489c50c0cd94700bbdbed79b4bcfe765d5b1a661d7ac2ddf01"]},"offset":"31680512"},"SubscriptionLoggable.js":{"size":970,"integrity":{"algorithm":"SHA256","hash":"e045d75dee44c0bb923f2104b73fc9dacd4f4ef89d1f7925a4b76aa3f8feb262","blockSize":4194304,"blocks":["e045d75dee44c0bb923f2104b73fc9dacd4f4ef89d1f7925a4b76aa3f8feb262"]},"offset":"31681029"},"TestMessage.js":{"size":116,"integrity":{"algorithm":"SHA256","hash":"37e0626d05b05340d63ddb2998bdf5f8407e1aab9a28cb16dc4caaf8286deda9","blockSize":4194304,"blocks":["37e0626d05b05340d63ddb2998bdf5f8407e1aab9a28cb16dc4caaf8286deda9"]},"offset":"31681999"},"TestScheduler.js":{"size":27799,"integrity":{"algorithm":"SHA256","hash":"11104601cfc020f3f62c3d1b527b707432db2862bbe0ba93f57e73c2b059beeb","blockSize":4194304,"blocks":["11104601cfc020f3f62c3d1b527b707432db2862bbe0ba93f57e73c2b059beeb"]},"offset":"31682115"}}},"symbol":{"files":{"iterator.js":{"size":411,"integrity":{"algorithm":"SHA256","hash":"d7aecedfab0be3e2749232bdda9e2ba4a53b23001a5c18d443e971e4553e2a4f","blockSize":4194304,"blocks":["d7aecedfab0be3e2749232bdda9e2ba4a53b23001a5c18d443e971e4553e2a4f"]},"offset":"31709914"},"observable.js":{"size":264,"integrity":{"algorithm":"SHA256","hash":"1582a9ac63ee121f5fec532f5b8a8f2760eef622d42c265b2c73ed31fadb9dee","blockSize":4194304,"blocks":["1582a9ac63ee121f5fec532f5b8a8f2760eef622d42c265b2c73ed31fadb9dee"]},"offset":"31710325"}}},"scheduler":{"files":{"Action.js":{"size":1308,"integrity":{"algorithm":"SHA256","hash":"07fa4c47c71d93dbd383a898182bf108058f2762b1b5525a168c9000599ab4f2","blockSize":4194304,"blocks":["07fa4c47c71d93dbd383a898182bf108058f2762b1b5525a168c9000599ab4f2"]},"offset":"31710589"},"AnimationFrameAction.js":{"size":2530,"integrity":{"algorithm":"SHA256","hash":"0fe54139cd3caa23d9871ef30f414452a472ddb0f1c3bb4f725fc37197e6927e","blockSize":4194304,"blocks":["0fe54139cd3caa23d9871ef30f414452a472ddb0f1c3bb4f725fc37197e6927e"]},"offset":"31711897"},"AnimationFrameScheduler.js":{"size":2046,"integrity":{"algorithm":"SHA256","hash":"a6144918209b65e7ec15b65c99aa1c11518f744b0cf1373efc8e1e94fbfd2088","blockSize":4194304,"blocks":["a6144918209b65e7ec15b65c99aa1c11518f744b0cf1373efc8e1e94fbfd2088"]},"offset":"31714427"},"AsapAction.js":{"size":2377,"integrity":{"algorithm":"SHA256","hash":"a9a9a17a8fd4cd624ebed87b4c774567b7206d48b0872dda2b0f5c3ac5fce7e9","blockSize":4194304,"blocks":["a9a9a17a8fd4cd624ebed87b4c774567b7206d48b0872dda2b0f5c3ac5fce7e9"]},"offset":"31716473"},"AsapScheduler.js":{"size":1956,"integrity":{"algorithm":"SHA256","hash":"b9c4368602a0f2ed6cf1b0d9694517cae62a1e137f417250a02e1358b7c1c699","blockSize":4194304,"blocks":["b9c4368602a0f2ed6cf1b0d9694517cae62a1e137f417250a02e1358b7c1c699"]},"offset":"31718850"},"AsyncAction.js":{"size":3946,"integrity":{"algorithm":"SHA256","hash":"4cd84ddd222a70304cf54b497801d0718f7e99ed8e57280b885104385238dc59","blockSize":4194304,"blocks":["4cd84ddd222a70304cf54b497801d0718f7e99ed8e57280b885104385238dc59"]},"offset":"31720806"},"AsyncScheduler.js":{"size":2040,"integrity":{"algorithm":"SHA256","hash":"64b53d2963a5b018768d1e43545a7ad4724ae2589e55176021e03ed24834032f","blockSize":4194304,"blocks":["64b53d2963a5b018768d1e43545a7ad4724ae2589e55176021e03ed24834032f"]},"offset":"31724752"},"QueueAction.js":{"size":2215,"integrity":{"algorithm":"SHA256","hash":"5391c8809d2799b5c73337424a011c4c0784a49adbbcacf89d6ba237d8de8b75","blockSize":4194304,"blocks":["5391c8809d2799b5c73337424a011c4c0784a49adbbcacf89d6ba237d8de8b75"]},"offset":"31726792"},"QueueScheduler.js":{"size":1264,"integrity":{"algorithm":"SHA256","hash":"46158187b677a1ce01628d3f0588237bff403cb9f7f93e71b0e8b01226c5ac28","blockSize":4194304,"blocks":["46158187b677a1ce01628d3f0588237bff403cb9f7f93e71b0e8b01226c5ac28"]},"offset":"31729007"},"VirtualTimeScheduler.js":{"size":4585,"integrity":{"algorithm":"SHA256","hash":"91ecad8b9c71f798de1a9922575d8f92f280fcafb992d61ff8ac57d459a2a33d","blockSize":4194304,"blocks":["91ecad8b9c71f798de1a9922575d8f92f280fcafb992d61ff8ac57d459a2a33d"]},"offset":"31730271"},"animationFrame.js":{"size":512,"integrity":{"algorithm":"SHA256","hash":"ef23335b5bb37a1744ed0b9e6665be877476bcb37059948538f45b6e9b22daf5","blockSize":4194304,"blocks":["ef23335b5bb37a1744ed0b9e6665be877476bcb37059948538f45b6e9b22daf5"]},"offset":"31734856"},"animationFrameProvider.js":{"size":2383,"integrity":{"algorithm":"SHA256","hash":"257e561227f1a74ccf7df559979cdf213119ef2ec30bea7a756910fe02814b6b","blockSize":4194304,"blocks":["257e561227f1a74ccf7df559979cdf213119ef2ec30bea7a756910fe02814b6b"]},"offset":"31735368"},"asap.js":{"size":372,"integrity":{"algorithm":"SHA256","hash":"78970a69c3feec5e94f0610d2dfb345419f1f0ec330ac9552181699dd1e0af4e","blockSize":4194304,"blocks":["78970a69c3feec5e94f0610d2dfb345419f1f0ec330ac9552181699dd1e0af4e"]},"offset":"31737751"},"async.js":{"size":386,"integrity":{"algorithm":"SHA256","hash":"afea57e09c51b15ab0743dcb97436ded2e6b33f63c0b2c787e76f7110cad5a44","blockSize":4194304,"blocks":["afea57e09c51b15ab0743dcb97436ded2e6b33f63c0b2c787e76f7110cad5a44"]},"offset":"31738123"},"dateTimestampProvider.js":{"size":329,"integrity":{"algorithm":"SHA256","hash":"68b1102fa221a83df97de57424a428d2beefabee9added90d7f23f0bbcd06490","blockSize":4194304,"blocks":["68b1102fa221a83df97de57424a428d2beefabee9added90d7f23f0bbcd06490"]},"offset":"31738509"},"immediateProvider.js":{"size":1662,"integrity":{"algorithm":"SHA256","hash":"aef911d369e7d42ffda8ee70ba20d553c700b878595e9e1b3389862178b276c1","blockSize":4194304,"blocks":["aef911d369e7d42ffda8ee70ba20d553c700b878595e9e1b3389862178b276c1"]},"offset":"31738838"},"intervalProvider.js":{"size":1653,"integrity":{"algorithm":"SHA256","hash":"ede1c7db30d08d7a35c8239fd90e918c4e669eef1ba38fcea6c18d531473c6bf","blockSize":4194304,"blocks":["ede1c7db30d08d7a35c8239fd90e918c4e669eef1ba38fcea6c18d531473c6bf"]},"offset":"31740500"},"performanceTimestampProvider.js":{"size":364,"integrity":{"algorithm":"SHA256","hash":"f5dd141cc855ac496320ba972691be66c3b9c9ad34563fd310f7c69270643a5c","blockSize":4194304,"blocks":["f5dd141cc855ac496320ba972691be66c3b9c9ad34563fd310f7c69270643a5c"]},"offset":"31742153"},"queue.js":{"size":386,"integrity":{"algorithm":"SHA256","hash":"be5d94eb5759a1aa8d0e8291074c54f14ec772ebf36391fad8411a75ee7f5082","blockSize":4194304,"blocks":["be5d94eb5759a1aa8d0e8291074c54f14ec772ebf36391fad8411a75ee7f5082"]},"offset":"31742517"},"timeoutProvider.js":{"size":1641,"integrity":{"algorithm":"SHA256","hash":"8eb36e7076b6675648bd5bae11a3a4b33d990f0b45e123443383d6e24e47901b","blockSize":4194304,"blocks":["8eb36e7076b6675648bd5bae11a3a4b33d990f0b45e123443383d6e24e47901b"]},"offset":"31742903"},"timerHandle.js":{"size":116,"integrity":{"algorithm":"SHA256","hash":"527c55e4ca1752fc27fa79492268f26efd40c638a5723523faa4456936fcc874","blockSize":4194304,"blocks":["527c55e4ca1752fc27fa79492268f26efd40c638a5723523faa4456936fcc874"]},"offset":"31744544"}}},"scheduled":{"files":{"scheduleArray.js":{"size":695,"integrity":{"algorithm":"SHA256","hash":"ee0da2cea7d367f0482fd710257051cab4c502883aa50ca852bc3125bdd8c613","blockSize":4194304,"blocks":["ee0da2cea7d367f0482fd710257051cab4c502883aa50ca852bc3125bdd8c613"]},"offset":"31744660"},"scheduleAsyncIterable.js":{"size":1072,"integrity":{"algorithm":"SHA256","hash":"8ebcefc48670b7bb446cf47f0039cecad0d6f5fcecf05f0e0a4a442c81d10de6","blockSize":4194304,"blocks":["8ebcefc48670b7bb446cf47f0039cecad0d6f5fcecf05f0e0a4a442c81d10de6"]},"offset":"31745355"},"scheduleIterable.js":{"size":1439,"integrity":{"algorithm":"SHA256","hash":"bd6a87554048405e4f7294d073cbc9444adaf5b4f84396e1226e700d56dd102d","blockSize":4194304,"blocks":["bd6a87554048405e4f7294d073cbc9444adaf5b4f84396e1226e700d56dd102d"]},"offset":"31746427"},"scheduleObservable.js":{"size":541,"integrity":{"algorithm":"SHA256","hash":"31e06b364b3c5529ceda27676dbe7f288b9c1582ab9f43ad48d941365d93e3c2","blockSize":4194304,"blocks":["31e06b364b3c5529ceda27676dbe7f288b9c1582ab9f43ad48d941365d93e3c2"]},"offset":"31747866"},"schedulePromise.js":{"size":526,"integrity":{"algorithm":"SHA256","hash":"de15f28ff1c7b89ef5694b04d3119c32e7f0a941de93139a09fe97b9ecb7b6b1","blockSize":4194304,"blocks":["de15f28ff1c7b89ef5694b04d3119c32e7f0a941de93139a09fe97b9ecb7b6b1"]},"offset":"31748407"},"scheduleReadableStreamLike.js":{"size":570,"integrity":{"algorithm":"SHA256","hash":"d4f5d74d5a70fa6b078e17a5814bc9d2f779f48fbee85e07a4226df1f57e5d2e","blockSize":4194304,"blocks":["d4f5d74d5a70fa6b078e17a5814bc9d2f779f48fbee85e07a4226df1f57e5d2e"]},"offset":"31748933"},"scheduled.js":{"size":1959,"integrity":{"algorithm":"SHA256","hash":"6026a3d33e22fbd3bf96e58fe321d6867849493c61e383dee6298ef5793d93ac","blockSize":4194304,"blocks":["6026a3d33e22fbd3bf96e58fe321d6867849493c61e383dee6298ef5793d93ac"]},"offset":"31749503"}}},"operators":{"files":{"OperatorSubscriber.js":{"size":3103,"integrity":{"algorithm":"SHA256","hash":"917291ddaad8f2fa1d05df7f9db608e16be732feb116bec4186fd7b2d86ef173","blockSize":4194304,"blocks":["917291ddaad8f2fa1d05df7f9db608e16be732feb116bec4186fd7b2d86ef173"]},"offset":"31751462"},"audit.js":{"size":1704,"integrity":{"algorithm":"SHA256","hash":"f27925fbfdf28672c57751019cf62ec729003e6baa9cef672f439769e9ac5ec2","blockSize":4194304,"blocks":["f27925fbfdf28672c57751019cf62ec729003e6baa9cef672f439769e9ac5ec2"]},"offset":"31754565"},"auditTime.js":{"size":498,"integrity":{"algorithm":"SHA256","hash":"eca21d502e81244e5ab7a7a3fb91c8110f159e5ec7cd5d9bd51931e318354e0c","blockSize":4194304,"blocks":["eca21d502e81244e5ab7a7a3fb91c8110f159e5ec7cd5d9bd51931e318354e0c"]},"offset":"31756269"},"buffer.js":{"size":982,"integrity":{"algorithm":"SHA256","hash":"4a51dd493c7c5a2aeb1069eed4f591dc074972c25ad2d455c2c56c32d4c69ae3","blockSize":4194304,"blocks":["4a51dd493c7c5a2aeb1069eed4f591dc074972c25ad2d455c2c56c32d4c69ae3"]},"offset":"31756767"},"bufferCount.js":{"size":3643,"integrity":{"algorithm":"SHA256","hash":"d0fbef4331e6e14d0ed356ed4de04065dddf9e6341c65173c39f101e5ffa4e8e","blockSize":4194304,"blocks":["d0fbef4331e6e14d0ed356ed4de04065dddf9e6341c65173c39f101e5ffa4e8e"]},"offset":"31757749"},"bufferTime.js":{"size":4081,"integrity":{"algorithm":"SHA256","hash":"99bf12bce1d17e2cd064999f5e14f5cfda0a30987b937f9dc376906e6c799a66","blockSize":4194304,"blocks":["99bf12bce1d17e2cd064999f5e14f5cfda0a30987b937f9dc376906e6c799a66"]},"offset":"31761392"},"bufferToggle.js":{"size":2636,"integrity":{"algorithm":"SHA256","hash":"be3f1b174b3399ef775aede82577af73338dffd5a4443ed702587cb2b84a4005","blockSize":4194304,"blocks":["be3f1b174b3399ef775aede82577af73338dffd5a4443ed702587cb2b84a4005"]},"offset":"31765473"},"bufferWhen.js":{"size":1347,"integrity":{"algorithm":"SHA256","hash":"c5f54c5a9b57d5096d56d15c5b3e48aa56ffb3ee49268b21548e7409234b46e8","blockSize":4194304,"blocks":["c5f54c5a9b57d5096d56d15c5b3e48aa56ffb3ee49268b21548e7409234b46e8"]},"offset":"31768109"},"catchError.js":{"size":1142,"integrity":{"algorithm":"SHA256","hash":"1ceb26a4a39bbf62a9b8a233d8bcdc53bcca2943004d525940dfeeeb298e6ed2","blockSize":4194304,"blocks":["1ceb26a4a39bbf62a9b8a233d8bcdc53bcca2943004d525940dfeeeb298e6ed2"]},"offset":"31769456"},"combineAll.js":{"size":258,"integrity":{"algorithm":"SHA256","hash":"06a9afd5ab98ec8f6ba45591bad4de94ce9dd76a61117211e2e0931c52a72199","blockSize":4194304,"blocks":["06a9afd5ab98ec8f6ba45591bad4de94ce9dd76a61117211e2e0931c52a72199"]},"offset":"31770598"},"combineLatest.js":{"size":1723,"integrity":{"algorithm":"SHA256","hash":"c698074a52a8c41feac863439c4536503691267a0294a24fdaa2dbbb9317e396","blockSize":4194304,"blocks":["c698074a52a8c41feac863439c4536503691267a0294a24fdaa2dbbb9317e396"]},"offset":"31770856"},"combineLatestAll.js":{"size":446,"integrity":{"algorithm":"SHA256","hash":"1bde0ad2e177b71a1c838ba9b64e3ebbf0a4cf7380386d78f756c6c6884ba441","blockSize":4194304,"blocks":["1bde0ad2e177b71a1c838ba9b64e3ebbf0a4cf7380386d78f756c6c6884ba441"]},"offset":"31772579"},"combineLatestWith.js":{"size":1190,"integrity":{"algorithm":"SHA256","hash":"157b1dedd66cf0891ca6d191b19a73614ab61a9138a5663595d7687becba69a4","blockSize":4194304,"blocks":["157b1dedd66cf0891ca6d191b19a73614ab61a9138a5663595d7687becba69a4"]},"offset":"31773025"},"concat.js":{"size":1365,"integrity":{"algorithm":"SHA256","hash":"6a0f6445885719843adeb23c8b7507242b3e2c0b8db89f1ad5ad96bf23d0a76c","blockSize":4194304,"blocks":["6a0f6445885719843adeb23c8b7507242b3e2c0b8db89f1ad5ad96bf23d0a76c"]},"offset":"31774215"},"concatAll.js":{"size":273,"integrity":{"algorithm":"SHA256","hash":"f2509644ff75acc7da615de80b44b02e8a0081727db2af8858064f254dfc4269","blockSize":4194304,"blocks":["f2509644ff75acc7da615de80b44b02e8a0081727db2af8858064f254dfc4269"]},"offset":"31775580"},"concatMap.js":{"size":447,"integrity":{"algorithm":"SHA256","hash":"19f0512897f00e8a0e956331ba0cded470ff7b2463d438224ab2fcc0d61ee9a6","blockSize":4194304,"blocks":["19f0512897f00e8a0e956331ba0cded470ff7b2463d438224ab2fcc0d61ee9a6"]},"offset":"31775853"},"concatMapTo.js":{"size":529,"integrity":{"algorithm":"SHA256","hash":"fe4dd06f0148b35e000764838ae2e15de57a732be9ed46dd761156d853b910a6","blockSize":4194304,"blocks":["fe4dd06f0148b35e000764838ae2e15de57a732be9ed46dd761156d853b910a6"]},"offset":"31776300"},"concatWith.js":{"size":1127,"integrity":{"algorithm":"SHA256","hash":"11f12d2cbbb97f87fac28322a8d4e442d1059b1ccf9364870d8cb5f6852c2652","blockSize":4194304,"blocks":["11f12d2cbbb97f87fac28322a8d4e442d1059b1ccf9364870d8cb5f6852c2652"]},"offset":"31776829"},"connect.js":{"size":848,"integrity":{"algorithm":"SHA256","hash":"71124d056400388654e58a0afe75ff40a0487d12795fca3aad552f70074a7483","blockSize":4194304,"blocks":["71124d056400388654e58a0afe75ff40a0487d12795fca3aad552f70074a7483"]},"offset":"31777956"},"count.js":{"size":350,"integrity":{"algorithm":"SHA256","hash":"17e00ee43895794e0ebaa7130b64b2c9f77907e924a1d6877b4095a1f26dc06e","blockSize":4194304,"blocks":["17e00ee43895794e0ebaa7130b64b2c9f77907e924a1d6877b4095a1f26dc06e"]},"offset":"31778804"},"debounce.js":{"size":1615,"integrity":{"algorithm":"SHA256","hash":"19cd0b9f955c9a295b44274cc391af9f5c67995d58d7490a9d2f8270e9ca4f9d","blockSize":4194304,"blocks":["19cd0b9f955c9a295b44274cc391af9f5c67995d58d7490a9d2f8270e9ca4f9d"]},"offset":"31779154"},"debounceTime.js":{"size":1727,"integrity":{"algorithm":"SHA256","hash":"22cab23826d4383b5b8e7a34f42a3547ff87486cc86963c8e8138f1621789cdf","blockSize":4194304,"blocks":["22cab23826d4383b5b8e7a34f42a3547ff87486cc86963c8e8138f1621789cdf"]},"offset":"31780769"},"defaultIfEmpty.js":{"size":759,"integrity":{"algorithm":"SHA256","hash":"7afcf0160d77b04de417168467c97a3965c2b8108dcd4632888557002da721e0","blockSize":4194304,"blocks":["7afcf0160d77b04de417168467c97a3965c2b8108dcd4632888557002da721e0"]},"offset":"31782496"},"delay.js":{"size":513,"integrity":{"algorithm":"SHA256","hash":"f908a59682a319ba00cb07ee8277e27905e7ed4e970de55632a8dca4671d9be2","blockSize":4194304,"blocks":["f908a59682a319ba00cb07ee8277e27905e7ed4e970de55632a8dca4671d9be2"]},"offset":"31783255"},"delayWhen.js":{"size":831,"integrity":{"algorithm":"SHA256","hash":"23b03175a216226601bfca6fdb47e28ee2b770aa1fa89f17e69bdd613b4f3327","blockSize":4194304,"blocks":["23b03175a216226601bfca6fdb47e28ee2b770aa1fa89f17e69bdd613b4f3327"]},"offset":"31783768"},"dematerialize.js":{"size":614,"integrity":{"algorithm":"SHA256","hash":"b4724ce898ade43692b6ca80dbe5577de2757a05c10289791ae67aa765913715","blockSize":4194304,"blocks":["b4724ce898ade43692b6ca80dbe5577de2757a05c10289791ae67aa765913715"]},"offset":"31784599"},"distinct.js":{"size":962,"integrity":{"algorithm":"SHA256","hash":"2a2a3a9732364fc7729f2e6fd622af34c6ef7149524092e84334df950f4239bb","blockSize":4194304,"blocks":["2a2a3a9732364fc7729f2e6fd622af34c6ef7149524092e84334df950f4239bb"]},"offset":"31785213"},"distinctUntilChanged.js":{"size":1111,"integrity":{"algorithm":"SHA256","hash":"373bfea29c064e7f7677208779dba4219b147d7ef5cdaeb1f07941ed730ac32c","blockSize":4194304,"blocks":["373bfea29c064e7f7677208779dba4219b147d7ef5cdaeb1f07941ed730ac32c"]},"offset":"31786175"},"distinctUntilKeyChanged.js":{"size":483,"integrity":{"algorithm":"SHA256","hash":"837155666be21fcd74a3bc8d3a0656adbf3b452ba97f46c6e1ef268369ab66c6","blockSize":4194304,"blocks":["837155666be21fcd74a3bc8d3a0656adbf3b452ba97f46c6e1ef268369ab66c6"]},"offset":"31787286"},"elementAt.js":{"size":924,"integrity":{"algorithm":"SHA256","hash":"cea22856996e2d07bc4d330176de992fd008b45ab86705b43b513068a7e918f9","blockSize":4194304,"blocks":["cea22856996e2d07bc4d330176de992fd008b45ab86705b43b513068a7e918f9"]},"offset":"31787769"},"endWith.js":{"size":1193,"integrity":{"algorithm":"SHA256","hash":"404d026dd5e2526953aaf58b8c3e55e6f465974a4b238d9f4965f484c3ac935d","blockSize":4194304,"blocks":["404d026dd5e2526953aaf58b8c3e55e6f465974a4b238d9f4965f484c3ac935d"]},"offset":"31788693"},"every.js":{"size":754,"integrity":{"algorithm":"SHA256","hash":"f32ab34269b201ef69dcf0e2560e70115e929f2b52d9411a1bb24a86af411689","blockSize":4194304,"blocks":["f32ab34269b201ef69dcf0e2560e70115e929f2b52d9411a1bb24a86af411689"]},"offset":"31789886"},"exhaust.js":{"size":225,"integrity":{"algorithm":"SHA256","hash":"14e045a1561d23c072e23f70b706a3af3e8647b36d88e4eb25c6764515d815b3","blockSize":4194304,"blocks":["14e045a1561d23c072e23f70b706a3af3e8647b36d88e4eb25c6764515d815b3"]},"offset":"31790640"},"exhaustAll.js":{"size":350,"integrity":{"algorithm":"SHA256","hash":"33ca40711e9889afbd830e5e147791c3dae1d8f8c29719e2f56fe080c7cfcbd1","blockSize":4194304,"blocks":["33ca40711e9889afbd830e5e147791c3dae1d8f8c29719e2f56fe080c7cfcbd1"]},"offset":"31790865"},"exhaustMap.js":{"size":1400,"integrity":{"algorithm":"SHA256","hash":"c8fc2ccfbfb484c84fc1668d7e2a8163dca16e4ef615e0d332e5a09993497806","blockSize":4194304,"blocks":["c8fc2ccfbfb484c84fc1668d7e2a8163dca16e4ef615e0d332e5a09993497806"]},"offset":"31791215"},"expand.js":{"size":608,"integrity":{"algorithm":"SHA256","hash":"7b61025c29cdc6812e7e8c9459369f6860299b4fbc534f74e86a7b07910d0229","blockSize":4194304,"blocks":["7b61025c29cdc6812e7e8c9459369f6860299b4fbc534f74e86a7b07910d0229"]},"offset":"31792615"},"filter.js":{"size":569,"integrity":{"algorithm":"SHA256","hash":"e45eca79a648ea9e5c27d709ba474a6b3dc4d2526219a12f389f98cc543fd299","blockSize":4194304,"blocks":["e45eca79a648ea9e5c27d709ba474a6b3dc4d2526219a12f389f98cc543fd299"]},"offset":"31793223"},"finalize.js":{"size":437,"integrity":{"algorithm":"SHA256","hash":"daa189a0c61959de09779f353cdb1ac7a31e90fc466e4563a4064a27a5d55318","blockSize":4194304,"blocks":["daa189a0c61959de09779f353cdb1ac7a31e90fc466e4563a4064a27a5d55318"]},"offset":"31793792"},"find.js":{"size":1003,"integrity":{"algorithm":"SHA256","hash":"0194ad7ba35356ff59a577977deb2305e8ade00761b9627006abdfbbf8179286","blockSize":4194304,"blocks":["0194ad7ba35356ff59a577977deb2305e8ade00761b9627006abdfbbf8179286"]},"offset":"31794229"},"findIndex.js":{"size":361,"integrity":{"algorithm":"SHA256","hash":"76c27315ae5022a63670ed6a35d6b2bfd47386d339e673cadef602769c1f427a","blockSize":4194304,"blocks":["76c27315ae5022a63670ed6a35d6b2bfd47386d339e673cadef602769c1f427a"]},"offset":"31795232"},"first.js":{"size":850,"integrity":{"algorithm":"SHA256","hash":"d867ea9e37a48178f1bc5264f4dc0ecedc95ca231effd4b740b0fb12b281e06b","blockSize":4194304,"blocks":["d867ea9e37a48178f1bc5264f4dc0ecedc95ca231effd4b740b0fb12b281e06b"]},"offset":"31795593"},"flatMap.js":{"size":217,"integrity":{"algorithm":"SHA256","hash":"8104de8720eaad6bcd16dfe8b640a727ad10000622d482b68938133a27f369f9","blockSize":4194304,"blocks":["8104de8720eaad6bcd16dfe8b640a727ad10000622d482b68938133a27f369f9"]},"offset":"31796443"},"groupBy.js":{"size":3242,"integrity":{"algorithm":"SHA256","hash":"a37fcdfc54710add30c519e8bc49170904c77c3ddaf120b8c25c95052a436a04","blockSize":4194304,"blocks":["a37fcdfc54710add30c519e8bc49170904c77c3ddaf120b8c25c95052a436a04"]},"offset":"31796660"},"ignoreElements.js":{"size":523,"integrity":{"algorithm":"SHA256","hash":"1e38e6bf18d2a39c3a7457e0798e7ff68529d097988c39a5350e25fb3fc3211f","blockSize":4194304,"blocks":["1e38e6bf18d2a39c3a7457e0798e7ff68529d097988c39a5350e25fb3fc3211f"]},"offset":"31799902"},"isEmpty.js":{"size":628,"integrity":{"algorithm":"SHA256","hash":"9cf7eee2187b2df4351c030b2e0cad214c276126ddd9e898f43d994aec489835","blockSize":4194304,"blocks":["9cf7eee2187b2df4351c030b2e0cad214c276126ddd9e898f43d994aec489835"]},"offset":"31800425"},"joinAllInternals.js":{"size":664,"integrity":{"algorithm":"SHA256","hash":"7ebe41fee71f5dca4148665debd4f136c1c32f208c05fe31980b6a2148fb5cc1","blockSize":4194304,"blocks":["7ebe41fee71f5dca4148665debd4f136c1c32f208c05fe31980b6a2148fb5cc1"]},"offset":"31801053"},"last.js":{"size":861,"integrity":{"algorithm":"SHA256","hash":"fa72d0df65ac688822dae31765c93e55959704534fe4f3ae6c60be87c1b7e133","blockSize":4194304,"blocks":["fa72d0df65ac688822dae31765c93e55959704534fe4f3ae6c60be87c1b7e133"]},"offset":"31801717"},"map.js":{"size":554,"integrity":{"algorithm":"SHA256","hash":"9480c765db2966a3997341bcd2295c3ff0b8f556380ccfa9f6f9555e70b1c824","blockSize":4194304,"blocks":["9480c765db2966a3997341bcd2295c3ff0b8f556380ccfa9f6f9555e70b1c824"]},"offset":"31802578"},"mapTo.js":{"size":266,"integrity":{"algorithm":"SHA256","hash":"58e637b0a570a8f7d3781f868e87d7e539ceb69aa2c64e9874a9d277f0b496bd","blockSize":4194304,"blocks":["58e637b0a570a8f7d3781f868e87d7e539ceb69aa2c64e9874a9d277f0b496bd"]},"offset":"31803132"},"materialize.js":{"size":885,"integrity":{"algorithm":"SHA256","hash":"b4e8082b6bdbfe708697ada1fc11a53dfa06c787aac3e07006dc3c776795bc37","blockSize":4194304,"blocks":["b4e8082b6bdbfe708697ada1fc11a53dfa06c787aac3e07006dc3c776795bc37"]},"offset":"31803398"},"max.js":{"size":430,"integrity":{"algorithm":"SHA256","hash":"71db24d1e1454b32e7c05ec5994afa504a805e298038c5e13f2cf35fbe3fed8e","blockSize":4194304,"blocks":["71db24d1e1454b32e7c05ec5994afa504a805e298038c5e13f2cf35fbe3fed8e"]},"offset":"31804283"},"merge.js":{"size":1529,"integrity":{"algorithm":"SHA256","hash":"35d598e5c1014a293807875ddba5977fed4236bc769f56e7c810911fe6688806","blockSize":4194304,"blocks":["35d598e5c1014a293807875ddba5977fed4236bc769f56e7c810911fe6688806"]},"offset":"31804713"},"mergeAll.js":{"size":412,"integrity":{"algorithm":"SHA256","hash":"faec9d325d2f757ad399fb87b5bf277054aa66d9aa0a5f818343cc74977068fa","blockSize":4194304,"blocks":["faec9d325d2f757ad399fb87b5bf277054aa66d9aa0a5f818343cc74977068fa"]},"offset":"31806242"},"mergeInternals.js":{"size":2630,"integrity":{"algorithm":"SHA256","hash":"7a4252ac3b65a88ad9bcd367bc95aee235bf85faa7385d79d9e471f6d9612ee3","blockSize":4194304,"blocks":["7a4252ac3b65a88ad9bcd367bc95aee235bf85faa7385d79d9e471f6d9612ee3"]},"offset":"31806654"},"mergeMap.js":{"size":976,"integrity":{"algorithm":"SHA256","hash":"5ebbefdf4ab8ca24c542a451fc9e53c2afeee1ec6a9ee8d91d4aa12177cb1e4c","blockSize":4194304,"blocks":["5ebbefdf4ab8ca24c542a451fc9e53c2afeee1ec6a9ee8d91d4aa12177cb1e4c"]},"offset":"31809284"},"mergeMapTo.js":{"size":730,"integrity":{"algorithm":"SHA256","hash":"f64e1b4fb206d9e5040cab08700ea1acf596658080b0150eed441086954f9dcd","blockSize":4194304,"blocks":["f64e1b4fb206d9e5040cab08700ea1acf596658080b0150eed441086954f9dcd"]},"offset":"31810260"},"mergeScan.js":{"size":732,"integrity":{"algorithm":"SHA256","hash":"9e13d71bb869cb8cecf8b05c384f27e066550875710f776f2aa4145ab591131d","blockSize":4194304,"blocks":["9e13d71bb869cb8cecf8b05c384f27e066550875710f776f2aa4145ab591131d"]},"offset":"31810990"},"mergeWith.js":{"size":1118,"integrity":{"algorithm":"SHA256","hash":"121ad9a45552c669d633594c81673986f9ae7057618682211a9ca301b305c35f","blockSize":4194304,"blocks":["121ad9a45552c669d633594c81673986f9ae7057618682211a9ca301b305c35f"]},"offset":"31811722"},"min.js":{"size":430,"integrity":{"algorithm":"SHA256","hash":"0dde36c98170b99103faf575879f5f5ab59ded6c53a427f2a1b843d82516d7be","blockSize":4194304,"blocks":["0dde36c98170b99103faf575879f5f5ab59ded6c53a427f2a1b843d82516d7be"]},"offset":"31812840"},"multicast.js":{"size":811,"integrity":{"algorithm":"SHA256","hash":"f63f0cefd6c6cb8a5197470888d6004389aa3ad49440cf910748f9e32b19810c","blockSize":4194304,"blocks":["f63f0cefd6c6cb8a5197470888d6004389aa3ad49440cf910748f9e32b19810c"]},"offset":"31813270"},"observeOn.js":{"size":981,"integrity":{"algorithm":"SHA256","hash":"ea271d85ddb9daed7dbd34c6381a206227f66f3231fd457b49ed520ab96c82be","blockSize":4194304,"blocks":["ea271d85ddb9daed7dbd34c6381a206227f66f3231fd457b49ed520ab96c82be"]},"offset":"31814081"},"onErrorResumeNext.js":{"size":2290,"integrity":{"algorithm":"SHA256","hash":"874ca3a11859587b76c8012b937c344bc4076f80f45d8e66a23afef8bc76bde4","blockSize":4194304,"blocks":["874ca3a11859587b76c8012b937c344bc4076f80f45d8e66a23afef8bc76bde4"]},"offset":"31815062"},"pairwise.js":{"size":651,"integrity":{"algorithm":"SHA256","hash":"541f07eb1a2dfef8990c1a88268c2b48d2178b4e2a7a4022809a64c4e7324935","blockSize":4194304,"blocks":["541f07eb1a2dfef8990c1a88268c2b48d2178b4e2a7a4022809a64c4e7324935"]},"offset":"31817352"},"partition.js":{"size":444,"integrity":{"algorithm":"SHA256","hash":"7833242cc48ac7a58f1d89efa524c9334776f41553720813a5c0fe1a262596d6","blockSize":4194304,"blocks":["7833242cc48ac7a58f1d89efa524c9334776f41553720813a5c0fe1a262596d6"]},"offset":"31818003"},"pluck.js":{"size":879,"integrity":{"algorithm":"SHA256","hash":"e2003f68f0e2533ec64d541a7c6981017a4ab1af69ac84e6d92800a7b489d8c8","blockSize":4194304,"blocks":["e2003f68f0e2533ec64d541a7c6981017a4ab1af69ac84e6d92800a7b489d8c8"]},"offset":"31818447"},"publish.js":{"size":491,"integrity":{"algorithm":"SHA256","hash":"20ca52eb97d3f72f12cd7d6a953339180ef13e899f019df2418b197014b16620","blockSize":4194304,"blocks":["20ca52eb97d3f72f12cd7d6a953339180ef13e899f019df2418b197014b16620"]},"offset":"31819326"},"publishBehavior.js":{"size":593,"integrity":{"algorithm":"SHA256","hash":"3cbbdee294428e71a2baac4940250287124bd9d3492c3d9bcfa6d0abd69ee156","blockSize":4194304,"blocks":["3cbbdee294428e71a2baac4940250287124bd9d3492c3d9bcfa6d0abd69ee156"]},"offset":"31819817"},"publishLast.js":{"size":537,"integrity":{"algorithm":"SHA256","hash":"3c0a81a2fc20e0d074393b0c25e4c01be5774d79d294b9207ab866f451dc6291","blockSize":4194304,"blocks":["3c0a81a2fc20e0d074393b0c25e4c01be5774d79d294b9207ab866f451dc6291"]},"offset":"31820410"},"publishReplay.js":{"size":817,"integrity":{"algorithm":"SHA256","hash":"ff79053097e690947cdfffc8a6180705609a38480c0ce0989624d97c09bb9f75","blockSize":4194304,"blocks":["ff79053097e690947cdfffc8a6180705609a38480c0ce0989624d97c09bb9f75"]},"offset":"31820947"},"race.js":{"size":1172,"integrity":{"algorithm":"SHA256","hash":"65542ac0fb9bbcc740f2c4f419b4820503bf66b44000dfd39c67d18cdf039d6b","blockSize":4194304,"blocks":["65542ac0fb9bbcc740f2c4f419b4820503bf66b44000dfd39c67d18cdf039d6b"]},"offset":"31821764"},"raceWith.js":{"size":1345,"integrity":{"algorithm":"SHA256","hash":"2d2e19b8d6edd9bf0b47a9480e84880030f1fa3b27f261427da2c81173a70fa0","blockSize":4194304,"blocks":["2d2e19b8d6edd9bf0b47a9480e84880030f1fa3b27f261427da2c81173a70fa0"]},"offset":"31822936"},"reduce.js":{"size":401,"integrity":{"algorithm":"SHA256","hash":"f94d1d52124005bd1a14b14487176b7b95eef65fdeab9d81a8f8201a5889f1a3","blockSize":4194304,"blocks":["f94d1d52124005bd1a14b14487176b7b95eef65fdeab9d81a8f8201a5889f1a3"]},"offset":"31824281"},"refCount.js":{"size":1131,"integrity":{"algorithm":"SHA256","hash":"766b515cdfb0bb20abdbfb761739f067f1345b7795cd371a03152c36c6d7a71c","blockSize":4194304,"blocks":["766b515cdfb0bb20abdbfb761739f067f1345b7795cd371a03152c36c6d7a71c"]},"offset":"31824682"},"repeat.js":{"size":2456,"integrity":{"algorithm":"SHA256","hash":"9227cf5388c64d59c58ce70299aefbd4736e5a33867468b97b7c9afb192c43f5","blockSize":4194304,"blocks":["9227cf5388c64d59c58ce70299aefbd4736e5a33867468b97b7c9afb192c43f5"]},"offset":"31825813"},"repeatWhen.js":{"size":1917,"integrity":{"algorithm":"SHA256","hash":"a6a6468f17d5c6994c0d232449c0f6c9bbfe790eaed4542688bf5e105b2afbf2","blockSize":4194304,"blocks":["a6a6468f17d5c6994c0d232449c0f6c9bbfe790eaed4542688bf5e105b2afbf2"]},"offset":"31828269"},"retry.js":{"size":3003,"integrity":{"algorithm":"SHA256","hash":"c33896deecc98ed2aa274492f2616d5983665c58f89acb3dbef7f1606d8e4845","blockSize":4194304,"blocks":["c33896deecc98ed2aa274492f2616d5983665c58f89acb3dbef7f1606d8e4845"]},"offset":"31830186"},"retryWhen.js":{"size":1349,"integrity":{"algorithm":"SHA256","hash":"a18613c4e60587bf673e0c9461dc8614613ae5ef5b01cd1ec801fb01ad47ea35","blockSize":4194304,"blocks":["a18613c4e60587bf673e0c9461dc8614613ae5ef5b01cd1ec801fb01ad47ea35"]},"offset":"31833189"},"sample.js":{"size":942,"integrity":{"algorithm":"SHA256","hash":"ab8c55cb37f71987a1f351409d4babb5789fce9e3910b7f5f49002a32451b81b","blockSize":4194304,"blocks":["ab8c55cb37f71987a1f351409d4babb5789fce9e3910b7f5f49002a32451b81b"]},"offset":"31834538"},"sampleTime.js":{"size":491,"integrity":{"algorithm":"SHA256","hash":"45b65a53362b7ec78b549ee7cbcf72f4c4d2f3d55be42c44828e4226b634c067","blockSize":4194304,"blocks":["45b65a53362b7ec78b549ee7cbcf72f4c4d2f3d55be42c44828e4226b634c067"]},"offset":"31835480"},"scan.js":{"size":384,"integrity":{"algorithm":"SHA256","hash":"67deeade492a25077868eeb081c1ca25000fe2b6757d1ecbc725b2b4e4af3468","blockSize":4194304,"blocks":["67deeade492a25077868eeb081c1ca25000fe2b6757d1ecbc725b2b4e4af3468"]},"offset":"31835971"},"scanInternals.js":{"size":979,"integrity":{"algorithm":"SHA256","hash":"75e2f78a6d9fdaffde62f1db4f6594d4e5a55832ea2b96d7a201366fe207f40b","blockSize":4194304,"blocks":["75e2f78a6d9fdaffde62f1db4f6594d4e5a55832ea2b96d7a201366fe207f40b"]},"offset":"31836355"},"sequenceEqual.js":{"size":1815,"integrity":{"algorithm":"SHA256","hash":"8384cbbc22c7e2abc99b18ebbd5baaf4cfefb3a4339ac349bb9de0d7d3c87657","blockSize":4194304,"blocks":["8384cbbc22c7e2abc99b18ebbd5baaf4cfefb3a4339ac349bb9de0d7d3c87657"]},"offset":"31837334"},"share.js":{"size":4159,"integrity":{"algorithm":"SHA256","hash":"a71152f8ebde075f6cd6539d602544882fa0b11cc10bfe2341fd7f884b087741","blockSize":4194304,"blocks":["a71152f8ebde075f6cd6539d602544882fa0b11cc10bfe2341fd7f884b087741"]},"offset":"31839149"},"shareReplay.js":{"size":1144,"integrity":{"algorithm":"SHA256","hash":"03b1927460d15aa5000ec5df88cf5045028aa9191dab4843520a167094741db4","blockSize":4194304,"blocks":["03b1927460d15aa5000ec5df88cf5045028aa9191dab4843520a167094741db4"]},"offset":"31843308"},"single.js":{"size":1352,"integrity":{"algorithm":"SHA256","hash":"8eaff3bdadd585872b0770ed56a09dd87a3e334433782c056e2e0f8c11cce191","blockSize":4194304,"blocks":["8eaff3bdadd585872b0770ed56a09dd87a3e334433782c056e2e0f8c11cce191"]},"offset":"31844452"},"skip.js":{"size":290,"integrity":{"algorithm":"SHA256","hash":"297a17b4bd0ef8f14a70374f99832fdccee06dc0dac1af9b4c25ead08d442b28","blockSize":4194304,"blocks":["297a17b4bd0ef8f14a70374f99832fdccee06dc0dac1af9b4c25ead08d442b28"]},"offset":"31845804"},"skipLast.js":{"size":1138,"integrity":{"algorithm":"SHA256","hash":"2a3182f46586f34aa0575b11ff83f69652f691d93bd5e051fc3eb4afff181621","blockSize":4194304,"blocks":["2a3182f46586f34aa0575b11ff83f69652f691d93bd5e051fc3eb4afff181621"]},"offset":"31846094"},"skipUntil.js":{"size":964,"integrity":{"algorithm":"SHA256","hash":"b7856029b474edaeded594b007d7aaa85884e8503c4c006ff3193d25b78459e7","blockSize":4194304,"blocks":["b7856029b474edaeded594b007d7aaa85884e8503c4c006ff3193d25b78459e7"]},"offset":"31847232"},"skipWhile.js":{"size":613,"integrity":{"algorithm":"SHA256","hash":"08ad83e38b48a941f6529739eab49b285f3dbf2f635635191d7415b0373a103b","blockSize":4194304,"blocks":["08ad83e38b48a941f6529739eab49b285f3dbf2f635635191d7415b0373a103b"]},"offset":"31848196"},"startWith.js":{"size":674,"integrity":{"algorithm":"SHA256","hash":"50f91bdffe6fe92611462f9361acb136d3c4e8471c2e17b655432d18b0498513","blockSize":4194304,"blocks":["50f91bdffe6fe92611462f9361acb136d3c4e8471c2e17b655432d18b0498513"]},"offset":"31848809"},"subscribeOn.js":{"size":474,"integrity":{"algorithm":"SHA256","hash":"477bab1e2b5ffe8e09319da969d108f106dcad4cf9e5805bdc80e5f3cc400a74","blockSize":4194304,"blocks":["477bab1e2b5ffe8e09319da969d108f106dcad4cf9e5805bdc80e5f3cc400a74"]},"offset":"31849483"},"switchAll.js":{"size":341,"integrity":{"algorithm":"SHA256","hash":"f538e3f85bb54608dffdbbe6c7acbdbe1e70b73dc71a871bce192635a6ac0dec","blockSize":4194304,"blocks":["f538e3f85bb54608dffdbbe6c7acbdbe1e70b73dc71a871bce192635a6ac0dec"]},"offset":"31849957"},"switchMap.js":{"size":1414,"integrity":{"algorithm":"SHA256","hash":"55178327ec4bd9c082452cea1efe021dea090b90c35cf64509395770248a60ba","blockSize":4194304,"blocks":["55178327ec4bd9c082452cea1efe021dea090b90c35cf64509395770248a60ba"]},"offset":"31850298"},"switchMapTo.js":{"size":529,"integrity":{"algorithm":"SHA256","hash":"f89ecbe0d32ca42654e691996455b54de94ec0f644c51b1b66bb61e17bfc5c58","blockSize":4194304,"blocks":["f89ecbe0d32ca42654e691996455b54de94ec0f644c51b1b66bb61e17bfc5c58"]},"offset":"31851712"},"switchScan.js":{"size":662,"integrity":{"algorithm":"SHA256","hash":"c086c6252a6fe89294e4286afdc261ced38bc1e5ca2a1f15c6995b4ad8cdaa12","blockSize":4194304,"blocks":["c086c6252a6fe89294e4286afdc261ced38bc1e5ca2a1f15c6995b4ad8cdaa12"]},"offset":"31852241"},"take.js":{"size":833,"integrity":{"algorithm":"SHA256","hash":"1a7ccf8a3efccdfaba162943c1e6c26a597da08e4faeae7bb45dcce97db351c8","blockSize":4194304,"blocks":["1a7ccf8a3efccdfaba162943c1e6c26a597da08e4faeae7bb45dcce97db351c8"]},"offset":"31852903"},"takeLast.js":{"size":1970,"integrity":{"algorithm":"SHA256","hash":"ac355ae3adbfbcef535657f20aea3d25dbc0e7d7de64bb8de4ab8e8327eab65b","blockSize":4194304,"blocks":["ac355ae3adbfbcef535657f20aea3d25dbc0e7d7de64bb8de4ab8e8327eab65b"]},"offset":"31853736"},"takeUntil.js":{"size":692,"integrity":{"algorithm":"SHA256","hash":"25398e9b9086deb3e9f073043c4054e56bc13eb1c3d7c99798f666372580bdee","blockSize":4194304,"blocks":["25398e9b9086deb3e9f073043c4054e56bc13eb1c3d7c99798f666372580bdee"]},"offset":"31855706"},"takeWhile.js":{"size":732,"integrity":{"algorithm":"SHA256","hash":"e87b2321398c6a7894ac1cbee9bbd3f5de3fdfb6b49762a22794317943e7d7c6","blockSize":4194304,"blocks":["e87b2321398c6a7894ac1cbee9bbd3f5de3fdfb6b49762a22794317943e7d7c6"]},"offset":"31856398"},"tap.js":{"size":1942,"integrity":{"algorithm":"SHA256","hash":"34d98d24d3f7cd6c75cba3b7dfe7d228020cd914c4a5ddc9a02ad1b24dfb5839","blockSize":4194304,"blocks":["34d98d24d3f7cd6c75cba3b7dfe7d228020cd914c4a5ddc9a02ad1b24dfb5839"]},"offset":"31857130"},"throttle.js":{"size":2179,"integrity":{"algorithm":"SHA256","hash":"f1b89a0343f087e667726caaad8cb07947f2f070c60f4b18d1fef70297e052cf","blockSize":4194304,"blocks":["f1b89a0343f087e667726caaad8cb07947f2f070c60f4b18d1fef70297e052cf"]},"offset":"31859072"},"throttleTime.js":{"size":646,"integrity":{"algorithm":"SHA256","hash":"ba596a702658ebcda779eaf744c6c268405652803d3fd5305df2d152a5bdaec5","blockSize":4194304,"blocks":["ba596a702658ebcda779eaf744c6c268405652803d3fd5305df2d152a5bdaec5"]},"offset":"31861251"},"throwIfEmpty.js":{"size":894,"integrity":{"algorithm":"SHA256","hash":"b7ff2632d316292eae777367d191ee7c7b6684b25ed9b59ffb131299d831af69","blockSize":4194304,"blocks":["b7ff2632d316292eae777367d191ee7c7b6684b25ed9b59ffb131299d831af69"]},"offset":"31861897"},"timeInterval.js":{"size":1056,"integrity":{"algorithm":"SHA256","hash":"54a1699ab1773173f7d2094a03f91effeacda93d5f533464e56883a2fedf9df7","blockSize":4194304,"blocks":["54a1699ab1773173f7d2094a03f91effeacda93d5f533464e56883a2fedf9df7"]},"offset":"31862791"},"timeout.js":{"size":3087,"integrity":{"algorithm":"SHA256","hash":"0f5227b970fd3833bd9c3af46ab4ccefc9d1fe74036ae1ab0bd045ff8d57fc08","blockSize":4194304,"blocks":["0f5227b970fd3833bd9c3af46ab4ccefc9d1fe74036ae1ab0bd045ff8d57fc08"]},"offset":"31863847"},"timeoutWith.js":{"size":1030,"integrity":{"algorithm":"SHA256","hash":"8091fb52a30a586a622abe64002f112588a91a60d3f577f55f996edc0259c89d","blockSize":4194304,"blocks":["8091fb52a30a586a622abe64002f112588a91a60d3f577f55f996edc0259c89d"]},"offset":"31866934"},"timestamp.js":{"size":538,"integrity":{"algorithm":"SHA256","hash":"cf197dc501e7545b22c2034ef33b03f3e7f065886539812a32d295a0410887d8","blockSize":4194304,"blocks":["cf197dc501e7545b22c2034ef33b03f3e7f065886539812a32d295a0410887d8"]},"offset":"31867964"},"toArray.js":{"size":474,"integrity":{"algorithm":"SHA256","hash":"090a736313ee4fca62f21da46dc082fad3aff9610720d968d7f9a1c84f00a840","blockSize":4194304,"blocks":["090a736313ee4fca62f21da46dc082fad3aff9610720d968d7f9a1c84f00a840"]},"offset":"31868502"},"window.js":{"size":1425,"integrity":{"algorithm":"SHA256","hash":"9d16b52ff3363fc9f6b51f233118a42fd584972ff2ebf0af4d874e60b8d87ed7","blockSize":4194304,"blocks":["9d16b52ff3363fc9f6b51f233118a42fd584972ff2ebf0af4d874e60b8d87ed7"]},"offset":"31868976"},"windowCount.js":{"size":2670,"integrity":{"algorithm":"SHA256","hash":"63e6bcf0c8b54debf2c70b1e18a37a67675a7ec123001c0c2e7521cd8445f8f9","blockSize":4194304,"blocks":["63e6bcf0c8b54debf2c70b1e18a37a67675a7ec123001c0c2e7521cd8445f8f9"]},"offset":"31870401"},"windowTime.js":{"size":3189,"integrity":{"algorithm":"SHA256","hash":"b9f396bd58328f4730dfa892074864d947f8bc7a2a08633f0dc9e2c24c78a39b","blockSize":4194304,"blocks":["b9f396bd58328f4730dfa892074864d947f8bc7a2a08633f0dc9e2c24c78a39b"]},"offset":"31873071"},"windowToggle.js":{"size":3392,"integrity":{"algorithm":"SHA256","hash":"fa59fef1ceebc6f87a47f608d6f0d3846a7114098a4a8fdbc5a186f721b71812","blockSize":4194304,"blocks":["fa59fef1ceebc6f87a47f608d6f0d3846a7114098a4a8fdbc5a186f721b71812"]},"offset":"31876260"},"windowWhen.js":{"size":1811,"integrity":{"algorithm":"SHA256","hash":"a9e74341a294d1144efa72d4e3d03d877d23f3476b931bb91b36d0f93e46eed8","blockSize":4194304,"blocks":["a9e74341a294d1144efa72d4e3d03d877d23f3476b931bb91b36d0f93e46eed8"]},"offset":"31879652"},"withLatestFrom.js":{"size":2430,"integrity":{"algorithm":"SHA256","hash":"c10a1f027319e7892ef24b4c1efb36c6c07477c3156b2f7029de8b78ebc38552","blockSize":4194304,"blocks":["c10a1f027319e7892ef24b4c1efb36c6c07477c3156b2f7029de8b78ebc38552"]},"offset":"31881463"},"zip.js":{"size":1206,"integrity":{"algorithm":"SHA256","hash":"cc417d013f0126cfed54512aa63d04ded4c5704fe78d54d0cedb97ea548a4cca","blockSize":4194304,"blocks":["cc417d013f0126cfed54512aa63d04ded4c5704fe78d54d0cedb97ea548a4cca"]},"offset":"31883893"},"zipAll.js":{"size":356,"integrity":{"algorithm":"SHA256","hash":"5b4cf6497132ddfb5268bbe8733ca462b39b2956b447279998720c69a481f1f0","blockSize":4194304,"blocks":["5b4cf6497132ddfb5268bbe8733ca462b39b2956b447279998720c69a481f1f0"]},"offset":"31885099"},"zipWith.js":{"size":1097,"integrity":{"algorithm":"SHA256","hash":"03121e25eb173926d1112076d7b869d2321dbe4c3a9545ded4bf6757c04bb935","blockSize":4194304,"blocks":["03121e25eb173926d1112076d7b869d2321dbe4c3a9545ded4bf6757c04bb935"]},"offset":"31885455"}}},"observable":{"files":{"ConnectableObservable.js":{"size":3416,"integrity":{"algorithm":"SHA256","hash":"e9e80461d7dcdb7c69f5412f6161136cc434f6d10862bdb67d949a1ed61dcdb3","blockSize":4194304,"blocks":["e9e80461d7dcdb7c69f5412f6161136cc434f6d10862bdb67d949a1ed61dcdb3"]},"offset":"31886552"},"bindCallback.js":{"size":424,"integrity":{"algorithm":"SHA256","hash":"2f84a1db99f2f37dc9c1400cfbce2ed02723abff33e96c90786e651c1813357d","blockSize":4194304,"blocks":["2f84a1db99f2f37dc9c1400cfbce2ed02723abff33e96c90786e651c1813357d"]},"offset":"31889968"},"bindCallbackInternals.js":{"size":3916,"integrity":{"algorithm":"SHA256","hash":"30993c1f05294c7994b0f26b9e0754fced25f42a877684c7490084cf1ea15f2d","blockSize":4194304,"blocks":["30993c1f05294c7994b0f26b9e0754fced25f42a877684c7490084cf1ea15f2d"]},"offset":"31890392"},"bindNodeCallback.js":{"size":443,"integrity":{"algorithm":"SHA256","hash":"9b3c841300d81ab937841a127f67366644b38b66bafb433147588496973f5e74","blockSize":4194304,"blocks":["9b3c841300d81ab937841a127f67366644b38b66bafb433147588496973f5e74"]},"offset":"31894308"},"combineLatest.js":{"size":3158,"integrity":{"algorithm":"SHA256","hash":"e041ea8be36f7de513b6cef4afe3208cab5248791d483cea6a230d2db80a8c25","blockSize":4194304,"blocks":["e041ea8be36f7de513b6cef4afe3208cab5248791d483cea6a230d2db80a8c25"]},"offset":"31894751"},"concat.js":{"size":499,"integrity":{"algorithm":"SHA256","hash":"8a0bb4025cc3242238389b4caa230af2c21ea6ae59c140f0fcc9c26416ea5f3f","blockSize":4194304,"blocks":["8a0bb4025cc3242238389b4caa230af2c21ea6ae59c140f0fcc9c26416ea5f3f"]},"offset":"31897909"},"connectable.js":{"size":1181,"integrity":{"algorithm":"SHA256","hash":"d091ca9e05c66b462586d333cfefd1dbba8ee03eb1909c813600b8ce9fe481c0","blockSize":4194304,"blocks":["d091ca9e05c66b462586d333cfefd1dbba8ee03eb1909c813600b8ce9fe481c0"]},"offset":"31898408"},"defer.js":{"size":427,"integrity":{"algorithm":"SHA256","hash":"85aa942275ea24861cc9b420d90cb7ca0b38e1bf8157dc4e3bffc89ffbb649da","blockSize":4194304,"blocks":["85aa942275ea24861cc9b420d90cb7ca0b38e1bf8157dc4e3bffc89ffbb649da"]},"offset":"31899589"},"empty.js":{"size":596,"integrity":{"algorithm":"SHA256","hash":"ceb29b94fb8b46f971cec838e29e584e1b8a95f04b82152e71fab05d73a9111a","blockSize":4194304,"blocks":["ceb29b94fb8b46f971cec838e29e584e1b8a95f04b82152e71fab05d73a9111a"]},"offset":"31900016"},"forkJoin.js":{"size":2191,"integrity":{"algorithm":"SHA256","hash":"d33fcb4b6352ab3f1fcd00dc8810a93e1975d19626245555518e1993c089e523","blockSize":4194304,"blocks":["d33fcb4b6352ab3f1fcd00dc8810a93e1975d19626245555518e1993c089e523"]},"offset":"31900612"},"from.js":{"size":379,"integrity":{"algorithm":"SHA256","hash":"4055e15603c1b8537b1be8a1fb05acf70de4e5d6f9d69660af89e37febff1f78","blockSize":4194304,"blocks":["4055e15603c1b8537b1be8a1fb05acf70de4e5d6f9d69660af89e37febff1f78"]},"offset":"31902803"},"fromEvent.js":{"size":3317,"integrity":{"algorithm":"SHA256","hash":"38e1cbde1fdb20f74e16781bef47f8f7d8905cb3261759fd5c30b86e36e1137e","blockSize":4194304,"blocks":["38e1cbde1fdb20f74e16781bef47f8f7d8905cb3261759fd5c30b86e36e1137e"]},"offset":"31903182"},"fromEventPattern.js":{"size":1069,"integrity":{"algorithm":"SHA256","hash":"f9be633a0cfecc0cd3d1c7e82bcd99b157fb521a5a79cac49158d100bbfbb00f","blockSize":4194304,"blocks":["f9be633a0cfecc0cd3d1c7e82bcd99b157fb521a5a79cac49158d100bbfbb00f"]},"offset":"31906499"},"fromSubscribable.js":{"size":400,"integrity":{"algorithm":"SHA256","hash":"fdccd29de9551638a5abd47ced51c4985e9af17ca077d30e7fdf5ec0f941333e","blockSize":4194304,"blocks":["fdccd29de9551638a5abd47ced51c4985e9af17ca077d30e7fdf5ec0f941333e"]},"offset":"31907568"},"generate.js":{"size":3743,"integrity":{"algorithm":"SHA256","hash":"59129f75b8c0d436667806021bbd67bb344e497d950f2429670476b27740f52f","blockSize":4194304,"blocks":["59129f75b8c0d436667806021bbd67bb344e497d950f2429670476b27740f52f"]},"offset":"31907968"},"iif.js":{"size":328,"integrity":{"algorithm":"SHA256","hash":"bff9ed3c24921f05dbdcf4480c1fd35067f1022b7d7954f5e26acb1eff0e3f37","blockSize":4194304,"blocks":["bff9ed3c24921f05dbdcf4480c1fd35067f1022b7d7954f5e26acb1eff0e3f37"]},"offset":"31911711"},"innerFrom.js":{"size":9688,"integrity":{"algorithm":"SHA256","hash":"c5aa75609d0d43222789766e2276e957c895df7b7c59f12cdbd7029ddaed6540","blockSize":4194304,"blocks":["c5aa75609d0d43222789766e2276e957c895df7b7c59f12cdbd7029ddaed6540"]},"offset":"31912039"},"interval.js":{"size":503,"integrity":{"algorithm":"SHA256","hash":"e3da3f4f118ef533f04d1ad2261b4a711a5e9883d85f241a74d0ec50e7a3a56c","blockSize":4194304,"blocks":["e3da3f4f118ef533f04d1ad2261b4a711a5e9883d85f241a74d0ec50e7a3a56c"]},"offset":"31921727"},"merge.js":{"size":866,"integrity":{"algorithm":"SHA256","hash":"87923a874b4e1fd68c374c40765a785f12ebbfef98ab50f5433243e791f060aa","blockSize":4194304,"blocks":["87923a874b4e1fd68c374c40765a785f12ebbfef98ab50f5433243e791f060aa"]},"offset":"31922230"},"never.js":{"size":361,"integrity":{"algorithm":"SHA256","hash":"c09b46fadd909a4dba3990624add50eaddd50ee0cdc092de9d471d19f63226b1","blockSize":4194304,"blocks":["c09b46fadd909a4dba3990624add50eaddd50ee0cdc092de9d471d19f63226b1"]},"offset":"31923096"},"of.js":{"size":432,"integrity":{"algorithm":"SHA256","hash":"56fd296b6b7f455ef353719e2efd9a680ed7d662029e8d9e1928e654eb56b037","blockSize":4194304,"blocks":["56fd296b6b7f455ef353719e2efd9a680ed7d662029e8d9e1928e654eb56b037"]},"offset":"31923457"},"onErrorResumeNext.js":{"size":623,"integrity":{"algorithm":"SHA256","hash":"983f2fffba49795f13ce769e4fdf4af0cefcd4307d6b50e458ca0c55104f5ca5","blockSize":4194304,"blocks":["983f2fffba49795f13ce769e4fdf4af0cefcd4307d6b50e458ca0c55104f5ca5"]},"offset":"31923889"},"pairs.js":{"size":280,"integrity":{"algorithm":"SHA256","hash":"6206c1002b9bc2aa37bfd97caeb2ce7433087ddb8c0d17763ee199eefdc40f5c","blockSize":4194304,"blocks":["6206c1002b9bc2aa37bfd97caeb2ce7433087ddb8c0d17763ee199eefdc40f5c"]},"offset":"31924512"},"partition.js":{"size":509,"integrity":{"algorithm":"SHA256","hash":"66de5e44b43cf6bab5d5b44a113900fd3823d0b70daa9a747372a7eee0ef44fc","blockSize":4194304,"blocks":["66de5e44b43cf6bab5d5b44a113900fd3823d0b70daa9a747372a7eee0ef44fc"]},"offset":"31924792"},"race.js":{"size":1470,"integrity":{"algorithm":"SHA256","hash":"a16677ef34446af7a22cffd4c4d23fc36907ee08918b3985854b440d009df1cc","blockSize":4194304,"blocks":["a16677ef34446af7a22cffd4c4d23fc36907ee08918b3985854b440d009df1cc"]},"offset":"31925301"},"range.js":{"size":1144,"integrity":{"algorithm":"SHA256","hash":"0ea6fe72294c4d6e34461b904c9e12dac7e5c6c4e1b1d3fe32798ae491d4f519","blockSize":4194304,"blocks":["0ea6fe72294c4d6e34461b904c9e12dac7e5c6c4e1b1d3fe32798ae491d4f519"]},"offset":"31926771"},"throwError.js":{"size":682,"integrity":{"algorithm":"SHA256","hash":"bf5e00cbfc1988cedba96ecd98a632182ad5b9349468a76aaaa7bdc55e58c0e8","blockSize":4194304,"blocks":["bf5e00cbfc1988cedba96ecd98a632182ad5b9349468a76aaaa7bdc55e58c0e8"]},"offset":"31927915"},"timer.js":{"size":1375,"integrity":{"algorithm":"SHA256","hash":"162ed835940608444384ddf6cd11f21d4c589ac7bf5fa17f586375d100506c3a","blockSize":4194304,"blocks":["162ed835940608444384ddf6cd11f21d4c589ac7bf5fa17f586375d100506c3a"]},"offset":"31928597"},"using.js":{"size":733,"integrity":{"algorithm":"SHA256","hash":"6e60edfda8bc5bb4284f0909facfb9e69f2bc192e21aa9cfc5853e690cd908dd","blockSize":4194304,"blocks":["6e60edfda8bc5bb4284f0909facfb9e69f2bc192e21aa9cfc5853e690cd908dd"]},"offset":"31929972"},"zip.js":{"size":2943,"integrity":{"algorithm":"SHA256","hash":"2e83dc549936a4d019b1f28482e2e54ace5479e983a58418cc1f0b98fefd603d","blockSize":4194304,"blocks":["2e83dc549936a4d019b1f28482e2e54ace5479e983a58418cc1f0b98fefd603d"]},"offset":"31930705"},"dom":{"files":{"WebSocketSubject.js":{"size":9340,"integrity":{"algorithm":"SHA256","hash":"d2cf3dbe7cd267b054d0317a042f6ff090c43095af60f6f747bf430b35b4db56","blockSize":4194304,"blocks":["d2cf3dbe7cd267b054d0317a042f6ff090c43095af60f6f747bf430b35b4db56"]},"offset":"31933648"},"animationFrames.js":{"size":1494,"integrity":{"algorithm":"SHA256","hash":"6f23d0a77cbc4f0cc0aa72cdcbdf4ddd6d8d3c6422d648ba2838ab347b51e82e","blockSize":4194304,"blocks":["6f23d0a77cbc4f0cc0aa72cdcbdf4ddd6d8d3c6422d648ba2838ab347b51e82e"]},"offset":"31942988"},"fetch.js":{"size":3100,"integrity":{"algorithm":"SHA256","hash":"278e12b829c5a205f5a1eee88f97ab1307b4dde770b397b5d2878348d42e5632","blockSize":4194304,"blocks":["278e12b829c5a205f5a1eee88f97ab1307b4dde770b397b5d2878348d42e5632"]},"offset":"31944482"},"webSocket.js":{"size":342,"integrity":{"algorithm":"SHA256","hash":"d93658afa4e69cdfb3da5eefd6d29b4a32b4801f8a5d138a0921632a88fcf089","blockSize":4194304,"blocks":["d93658afa4e69cdfb3da5eefd6d29b4a32b4801f8a5d138a0921632a88fcf089"]},"offset":"31947582"}}}}},"ajax":{"files":{"AjaxResponse.js":{"size":1370,"integrity":{"algorithm":"SHA256","hash":"88d6919cb66ec714ab2f20b876ca8bfa3111c2832bb20a98ef90a6a9f362b29f","blockSize":4194304,"blocks":["88d6919cb66ec714ab2f20b876ca8bfa3111c2832bb20a98ef90a6a9f362b29f"]},"offset":"31947924"},"ajax.js":{"size":10742,"integrity":{"algorithm":"SHA256","hash":"1638abaece2f6d1316fc2ead0a163522014937e89e870f1efab1620ed675cb22","blockSize":4194304,"blocks":["1638abaece2f6d1316fc2ead0a163522014937e89e870f1efab1620ed675cb22"]},"offset":"31949294"},"errors.js":{"size":1188,"integrity":{"algorithm":"SHA256","hash":"4b2edbc438d4255b2a18883cd86b620513d4be71303daf92aa2a7033bb50447d","blockSize":4194304,"blocks":["4b2edbc438d4255b2a18883cd86b620513d4be71303daf92aa2a7033bb50447d"]},"offset":"31960036"},"getXHRResponse.js":{"size":814,"integrity":{"algorithm":"SHA256","hash":"6ec84ebad6a400a74584ab97f4eb6489ddf219db1d44d6f84b9095469887158b","blockSize":4194304,"blocks":["6ec84ebad6a400a74584ab97f4eb6489ddf219db1d44d6f84b9095469887158b"]},"offset":"31961224"},"types.js":{"size":110,"integrity":{"algorithm":"SHA256","hash":"b0d2bc4142d0c62d43f996aaeb64f22c4889ac853f8a3765758b505d972d0149","blockSize":4194304,"blocks":["b0d2bc4142d0c62d43f996aaeb64f22c4889ac853f8a3765758b505d972d0149"]},"offset":"31962038"}}}}},"fetch":{"files":{"index.js":{"size":312,"integrity":{"algorithm":"SHA256","hash":"03070f03c59a1cc7f9c4182567a346ea66624fbe9204a7f2d7ae123b6d8d7242","blockSize":4194304,"blocks":["03070f03c59a1cc7f9c4182567a346ea66624fbe9204a7f2d7ae123b6d8d7242"]},"offset":"31962148"}}},"ajax":{"files":{"index.js":{"size":842,"integrity":{"algorithm":"SHA256","hash":"edd22548bef938c5c176941e6c969443bd94bec53ade1638bc9e72a9a418c77d","blockSize":4194304,"blocks":["edd22548bef938c5c176941e6c969443bd94bec53ade1638bc9e72a9a418c77d"]},"offset":"31962460"}}}}},"bundles":{"files":{"rxjs.umd.js":{"size":283832,"integrity":{"algorithm":"SHA256","hash":"cf3c6590fd18727c42aa53fd516d52d2513f195f60385ec3a15329e7ac44ef8d","blockSize":4194304,"blocks":["cf3c6590fd18727c42aa53fd516d52d2513f195f60385ec3a15329e7ac44ef8d"]},"offset":"31963302"},"rxjs.umd.min.js":{"size":87829,"integrity":{"algorithm":"SHA256","hash":"44f10944118599b328ccc17da2be45c8e698b1cf330e91e03c75050cd8ad2fb0","blockSize":4194304,"blocks":["44f10944118599b328ccc17da2be45c8e698b1cf330e91e03c75050cd8ad2fb0"]},"offset":"32247134"}}}}},"ajax":{"files":{"package.json":{"size":216,"integrity":{"algorithm":"SHA256","hash":"a1d5789b3326db9d728c41641bc68c645198384f59c814bd0d7c0f2096e73913","blockSize":4194304,"blocks":["a1d5789b3326db9d728c41641bc68c645198384f59c814bd0d7c0f2096e73913"]},"offset":"32334963"}}}}},"safe-buffer":{"files":{"LICENSE":{"size":1081,"integrity":{"algorithm":"SHA256","hash":"c7cc929b57080f4b9d0c6cf57669f0463fc5b39906344dfc8d3bc43426b30eac","blockSize":4194304,"blocks":["c7cc929b57080f4b9d0c6cf57669f0463fc5b39906344dfc8d3bc43426b30eac"]},"offset":"32335179"},"index.js":{"size":1529,"integrity":{"algorithm":"SHA256","hash":"d58af21cb0518864d0c505742d1af71e5b5e1f142f4c0f27353aa0f431a616d4","blockSize":4194304,"blocks":["d58af21cb0518864d0c505742d1af71e5b5e1f142f4c0f27353aa0f431a616d4"]},"offset":"32336260"},"package.json":{"size":500,"integrity":{"algorithm":"SHA256","hash":"0bb53dcf379ffebc8f8baa2d2a4efc80be25f203509da73cc17864b97cb9556e","blockSize":4194304,"blocks":["0bb53dcf379ffebc8f8baa2d2a4efc80be25f203509da73cc17864b97cb9556e"]},"offset":"32337789"}}},"safer-buffer":{"files":{"LICENSE":{"size":1094,"integrity":{"algorithm":"SHA256","hash":"4bc935e71be198c67ddf3c2b5fddb195f6edc182bfc155a96a6db61b44b494b9","blockSize":4194304,"blocks":["4bc935e71be198c67ddf3c2b5fddb195f6edc182bfc155a96a6db61b44b494b9"]},"offset":"32338289"},"Porting-Buffer.md":{"size":12794,"integrity":{"algorithm":"SHA256","hash":"134523d05b39e177135c2a2070a426eb319657dfc77589e38ef7cf13cd50e730","blockSize":4194304,"blocks":["134523d05b39e177135c2a2070a426eb319657dfc77589e38ef7cf13cd50e730"]},"offset":"32339383"},"dangerous.js":{"size":1483,"integrity":{"algorithm":"SHA256","hash":"1dc2900bcc8ffc375af0d2fc99a03ecad2dcbb85d278fbf26982e87707bea53f","blockSize":4194304,"blocks":["1dc2900bcc8ffc375af0d2fc99a03ecad2dcbb85d278fbf26982e87707bea53f"]},"offset":"32352177"},"package.json":{"size":572,"integrity":{"algorithm":"SHA256","hash":"9ee991af0fa18b3af71d3db3e497b29a20b6a7362119e084fb57bd0f47cd6995","blockSize":4194304,"blocks":["9ee991af0fa18b3af71d3db3e497b29a20b6a7362119e084fb57bd0f47cd6995"]},"offset":"32353660"},"safer.js":{"size":2110,"integrity":{"algorithm":"SHA256","hash":"37f9716144105051ab302f6a0c30a52ff5de7269b9e1173ac22be798fc11ccad","blockSize":4194304,"blocks":["37f9716144105051ab302f6a0c30a52ff5de7269b9e1173ac22be798fc11ccad"]},"offset":"32354232"},"tests.js":{"size":15735,"integrity":{"algorithm":"SHA256","hash":"511906fdf6a233c84a9216065d1701dbfd84f380fbd495ae1cf5a002370b9885","blockSize":4194304,"blocks":["511906fdf6a233c84a9216065d1701dbfd84f380fbd495ae1cf5a002370b9885"]},"offset":"32356342"}}},"sax":{"files":{"LICENSE":{"size":2011,"integrity":{"algorithm":"SHA256","hash":"3098be2717081cfe2b88a0faa221cb4f2326720cb8ce869199a9d6234f219319","blockSize":4194304,"blocks":["3098be2717081cfe2b88a0faa221cb4f2326720cb8ce869199a9d6234f219319"]},"offset":"32372077"},"package.json":{"size":414,"integrity":{"algorithm":"SHA256","hash":"ca104d2bd5225cc18cf8d97be1fda16ac55a53f50f9ec0ce7415714d9906e7f1","blockSize":4194304,"blocks":["ca104d2bd5225cc18cf8d97be1fda16ac55a53f50f9ec0ce7415714d9906e7f1"]},"offset":"32374088"},"lib":{"files":{"sax.js":{"size":43541,"integrity":{"algorithm":"SHA256","hash":"fa534a9eefadbfdcd35ffb33c827ad4b34069699a79401516879e0b56d6d3827","blockSize":4194304,"blocks":["fa534a9eefadbfdcd35ffb33c827ad4b34069699a79401516879e0b56d6d3827"]},"offset":"32374502"}}}}},"semver":{"files":{"LICENSE":{"size":765,"integrity":{"algorithm":"SHA256","hash":"4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b","blockSize":4194304,"blocks":["4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b"]},"offset":"32418043"},"index.js":{"size":1982,"integrity":{"algorithm":"SHA256","hash":"57c39b74afb746b028051e583e46079ebfae110b2e9a24b56070185e14c381b6","blockSize":4194304,"blocks":["57c39b74afb746b028051e583e46079ebfae110b2e9a24b56070185e14c381b6"]},"offset":"32418808"},"package.json":{"size":1201,"integrity":{"algorithm":"SHA256","hash":"66ea78854eecd778bf35eec8a79b0e60e8035d0cba6137447a710bd5d84ad453","blockSize":4194304,"blocks":["66ea78854eecd778bf35eec8a79b0e60e8035d0cba6137447a710bd5d84ad453"]},"offset":"32420790"},"preload.js":{"size":69,"integrity":{"algorithm":"SHA256","hash":"4117401437ccb64a0438e0b65f92215706fb892a4a1161367fbee215a4627716","blockSize":4194304,"blocks":["4117401437ccb64a0438e0b65f92215706fb892a4a1161367fbee215a4627716"]},"offset":"32421991"},"range.bnf":{"size":619,"integrity":{"algorithm":"SHA256","hash":"ed628fdaff64be366d07f6cc4559eae4de109826f743ea7f5e1588c370bca49a","blockSize":4194304,"blocks":["ed628fdaff64be366d07f6cc4559eae4de109826f743ea7f5e1588c370bca49a"]},"offset":"32422060"},"ranges":{"files":{"gtr.js":{"size":217,"integrity":{"algorithm":"SHA256","hash":"3584a1c39f7482b8a2733cc4630777a6881c627cf2fb1065e7b3387134ae0899","blockSize":4194304,"blocks":["3584a1c39f7482b8a2733cc4630777a6881c627cf2fb1065e7b3387134ae0899"]},"offset":"32422679"},"intersects.js":{"size":201,"integrity":{"algorithm":"SHA256","hash":"a1d70b5eb41cea2af321cf2240d2577e26a0e75d7c04cad527e5d71a45510341","blockSize":4194304,"blocks":["a1d70b5eb41cea2af321cf2240d2577e26a0e75d7c04cad527e5d71a45510341"]},"offset":"32422896"},"ltr.js":{"size":213,"integrity":{"algorithm":"SHA256","hash":"9b2b8cad227317839a7e47c5b835a7f45e3e861270ca3e335c2bb693c1bd425a","blockSize":4194304,"blocks":["9b2b8cad227317839a7e47c5b835a7f45e3e861270ca3e335c2bb693c1bd425a"]},"offset":"32423097"},"max-satisfying.js":{"size":579,"integrity":{"algorithm":"SHA256","hash":"cbc560048c06fb1a3c75412638bf89ddb9782f373a744ffc4d8f2aa0b8d11c3c","blockSize":4194304,"blocks":["cbc560048c06fb1a3c75412638bf89ddb9782f373a744ffc4d8f2aa0b8d11c3c"]},"offset":"32423310"},"min-satisfying.js":{"size":577,"integrity":{"algorithm":"SHA256","hash":"9ea81eb30019b58fd6218ff40f565af60e9e52574ac1cc882e6841fc75b3e8bd","blockSize":4194304,"blocks":["9ea81eb30019b58fd6218ff40f565af60e9e52574ac1cc882e6841fc75b3e8bd"]},"offset":"32423889"},"min-version.js":{"size":1500,"integrity":{"algorithm":"SHA256","hash":"639d348b2c5b0e1690c790fbf6daa4a619ebcf52a1b675002fdb8b4b99823500","blockSize":4194304,"blocks":["639d348b2c5b0e1690c790fbf6daa4a619ebcf52a1b675002fdb8b4b99823500"]},"offset":"32424466"},"outside.js":{"size":2190,"integrity":{"algorithm":"SHA256","hash":"94adbe6d54f2da683d27c3c5ee7c98223400d96ad57a5851eb069743e11e8538","blockSize":4194304,"blocks":["94adbe6d54f2da683d27c3c5ee7c98223400d96ad57a5851eb069743e11e8538"]},"offset":"32425966"},"simplify.js":{"size":1341,"integrity":{"algorithm":"SHA256","hash":"9120ea55b47227123790fc401f7496a60d85791d010a4311bb34d071f8718456","blockSize":4194304,"blocks":["9120ea55b47227123790fc401f7496a60d85791d010a4311bb34d071f8718456"]},"offset":"32428156"},"subset.js":{"size":7418,"integrity":{"algorithm":"SHA256","hash":"878a7bb249b33a3698f524e39775d7b6da8ec8fac07e3cde8c33725b42e0968c","blockSize":4194304,"blocks":["878a7bb249b33a3698f524e39775d7b6da8ec8fac07e3cde8c33725b42e0968c"]},"offset":"32429497"},"to-comparators.js":{"size":268,"integrity":{"algorithm":"SHA256","hash":"c809ef2c27b2e9e47cea6781d1b61e92adabccb139abfac009df253cfc4f6fd3","blockSize":4194304,"blocks":["c809ef2c27b2e9e47cea6781d1b61e92adabccb139abfac009df253cfc4f6fd3"]},"offset":"32436915"},"valid.js":{"size":312,"integrity":{"algorithm":"SHA256","hash":"4f6b4eb0d05fda0e9774ecb1b7464d6fc25c75f1d9df3423ace4cbb2ec466fc4","blockSize":4194304,"blocks":["4f6b4eb0d05fda0e9774ecb1b7464d6fc25c75f1d9df3423ace4cbb2ec466fc4"]},"offset":"32437183"}}},"internal":{"files":{"constants.js":{"size":467,"integrity":{"algorithm":"SHA256","hash":"92c429e19056f15300b5570dba2426d7b77d6a4c375d99a8506649f2480f7b9b","blockSize":4194304,"blocks":["92c429e19056f15300b5570dba2426d7b77d6a4c375d99a8506649f2480f7b9b"]},"offset":"32437495"},"debug.js":{"size":226,"integrity":{"algorithm":"SHA256","hash":"9557f905ecf6e36f97653841e08fd30074ba37ad529070a090ba352986de4fa2","blockSize":4194304,"blocks":["9557f905ecf6e36f97653841e08fd30074ba37ad529070a090ba352986de4fa2"]},"offset":"32437962"},"identifiers.js":{"size":410,"integrity":{"algorithm":"SHA256","hash":"b8799f9187c52ceefee48a395e09073f1d1594c8468c012e84104e72d8f7014d","blockSize":4194304,"blocks":["b8799f9187c52ceefee48a395e09073f1d1594c8468c012e84104e72d8f7014d"]},"offset":"32438188"},"parse-options.js":{"size":383,"integrity":{"algorithm":"SHA256","hash":"e7baf319748ea6338e15f3002d5d7781f68a863cffed7e29efa5ad410c90141e","blockSize":4194304,"blocks":["e7baf319748ea6338e15f3002d5d7781f68a863cffed7e29efa5ad410c90141e"]},"offset":"32438598"},"re.js":{"size":6672,"integrity":{"algorithm":"SHA256","hash":"da783c1e11de453fa3d4973c92f50098cdbb13d3b085435068bffe3ebdf95f60","blockSize":4194304,"blocks":["da783c1e11de453fa3d4973c92f50098cdbb13d3b085435068bffe3ebdf95f60"]},"offset":"32438981"}}},"functions":{"files":{"clean.js":{"size":191,"integrity":{"algorithm":"SHA256","hash":"f539e00fdd674e57cec16ac7aa8c0d10483b31bf01c1c3f1f4bb202014b280ca","blockSize":4194304,"blocks":["f539e00fdd674e57cec16ac7aa8c0d10483b31bf01c1c3f1f4bb202014b280ca"]},"offset":"32445653"},"cmp.js":{"size":947,"integrity":{"algorithm":"SHA256","hash":"19d0f4d1a269078002691b4b617240c7e3ee5957e4a3610e00c1408c63e9a4a9","blockSize":4194304,"blocks":["19d0f4d1a269078002691b4b617240c7e3ee5957e4a3610e00c1408c63e9a4a9"]},"offset":"32445844"},"coerce.js":{"size":1505,"integrity":{"algorithm":"SHA256","hash":"0f660ba09e44a00b3960e2ce094c0d87c67dcfe8fc4b529056ad58b2357f10f8","blockSize":4194304,"blocks":["0f660ba09e44a00b3960e2ce094c0d87c67dcfe8fc4b529056ad58b2357f10f8"]},"offset":"32446791"},"compare-build.js":{"size":267,"integrity":{"algorithm":"SHA256","hash":"56191fa0ed27633a33fed9c99d657e305cf5452b1e677dd38610948a050146e0","blockSize":4194304,"blocks":["56191fa0ed27633a33fed9c99d657e305cf5452b1e677dd38610948a050146e0"]},"offset":"32448296"},"compare-loose.js":{"size":118,"integrity":{"algorithm":"SHA256","hash":"9b75aece458d05e13a299afdd745de6ae6069287862e1d5bc718facb24da7692","blockSize":4194304,"blocks":["9b75aece458d05e13a299afdd745de6ae6069287862e1d5bc718facb24da7692"]},"offset":"32448563"},"compare.js":{"size":156,"integrity":{"algorithm":"SHA256","hash":"cf3e198a250760cf344e0b575dbaad7d8b470cb56e25ce2152adbdf82fa3e5e8","blockSize":4194304,"blocks":["cf3e198a250760cf344e0b575dbaad7d8b470cb56e25ce2152adbdf82fa3e5e8"]},"offset":"32448681"},"diff.js":{"size":634,"integrity":{"algorithm":"SHA256","hash":"431e82902f7604755ba826f922866ea63d245986136ac520fa3cb882a8c34fdd","blockSize":4194304,"blocks":["431e82902f7604755ba826f922866ea63d245986136ac520fa3cb882a8c34fdd"]},"offset":"32448837"},"eq.js":{"size":112,"integrity":{"algorithm":"SHA256","hash":"ee5dc50b4a4b35219e016730aa8631b25d122447dd7df56ec447dd202fd79ad4","blockSize":4194304,"blocks":["ee5dc50b4a4b35219e016730aa8631b25d122447dd7df56ec447dd202fd79ad4"]},"offset":"32449471"},"gt.js":{"size":110,"integrity":{"algorithm":"SHA256","hash":"0776eca71f280f369a20f6edbd03c192b1722dfe6a0681c40d63798bb81a6459","blockSize":4194304,"blocks":["0776eca71f280f369a20f6edbd03c192b1722dfe6a0681c40d63798bb81a6459"]},"offset":"32449583"},"gte.js":{"size":113,"integrity":{"algorithm":"SHA256","hash":"67f27bd87586a498c22954fd41f45971c079aea34cec7d63563becd62de0c810","blockSize":4194304,"blocks":["67f27bd87586a498c22954fd41f45971c079aea34cec7d63563becd62de0c810"]},"offset":"32449693"},"inc.js":{"size":400,"integrity":{"algorithm":"SHA256","hash":"de694ec9e626351572ed070bfc32a8335639ca2bb48f459ef087103e18ee6cc5","blockSize":4194304,"blocks":["de694ec9e626351572ed070bfc32a8335639ca2bb48f459ef087103e18ee6cc5"]},"offset":"32449806"},"lt.js":{"size":110,"integrity":{"algorithm":"SHA256","hash":"124f2039c547d2a4fe83b9a56e6c3b911d383289d47238f4f558ea4061c4348e","blockSize":4194304,"blocks":["124f2039c547d2a4fe83b9a56e6c3b911d383289d47238f4f558ea4061c4348e"]},"offset":"32450206"},"lte.js":{"size":113,"integrity":{"algorithm":"SHA256","hash":"5ad1ce1860079ccf25a7fe62211361fe6cd2ac06a9fc4616a288fa3bb6ffa648","blockSize":4194304,"blocks":["5ad1ce1860079ccf25a7fe62211361fe6cd2ac06a9fc4616a288fa3bb6ffa648"]},"offset":"32450316"},"major.js":{"size":122,"integrity":{"algorithm":"SHA256","hash":"c7e03fbb9bc1528ea1681c2433ad73d241b023c6200a7b13fa63ec083b81e017","blockSize":4194304,"blocks":["c7e03fbb9bc1528ea1681c2433ad73d241b023c6200a7b13fa63ec083b81e017"]},"offset":"32450429"},"minor.js":{"size":122,"integrity":{"algorithm":"SHA256","hash":"a1bd5b53471eaf3d551c3bfb4b611f64832a0be79d82bc0a2d5ee0ff8b6892e4","blockSize":4194304,"blocks":["a1bd5b53471eaf3d551c3bfb4b611f64832a0be79d82bc0a2d5ee0ff8b6892e4"]},"offset":"32450551"},"neq.js":{"size":114,"integrity":{"algorithm":"SHA256","hash":"e1acdf7fbb4cd40e372a37443d2ef2504fe1524e0f214317912418ed5a0a246e","blockSize":4194304,"blocks":["e1acdf7fbb4cd40e372a37443d2ef2504fe1524e0f214317912418ed5a0a246e"]},"offset":"32450673"},"parse.js":{"size":662,"integrity":{"algorithm":"SHA256","hash":"b8c385ef8ff2c71dc2b4f19cce85c846b0d8efcbd40a055cb227d3830ee48255","blockSize":4194304,"blocks":["b8c385ef8ff2c71dc2b4f19cce85c846b0d8efcbd40a055cb227d3830ee48255"]},"offset":"32450787"},"patch.js":{"size":122,"integrity":{"algorithm":"SHA256","hash":"6bc095689e62eb2aa401033b090870d24373aa4e992089c2256773133c994969","blockSize":4194304,"blocks":["6bc095689e62eb2aa401033b090870d24373aa4e992089c2256773133c994969"]},"offset":"32451449"},"prerelease.js":{"size":220,"integrity":{"algorithm":"SHA256","hash":"683e026b74f0d18374161c14c4b367ff0848e568da9fb8bfb3196bc985c26d95","blockSize":4194304,"blocks":["683e026b74f0d18374161c14c4b367ff0848e568da9fb8bfb3196bc985c26d95"]},"offset":"32451571"},"rcompare.js":{"size":118,"integrity":{"algorithm":"SHA256","hash":"5c95ff2fa2f8533041579f34835e2b4f5680ea9f4d8d08ff1f4d537cfd9f7896","blockSize":4194304,"blocks":["5c95ff2fa2f8533041579f34835e2b4f5680ea9f4d8d08ff1f4d537cfd9f7896"]},"offset":"32451791"},"rsort.js":{"size":149,"integrity":{"algorithm":"SHA256","hash":"89dbdb1542343cb549ecd12cd8c79ae01e6111215445ea6b091f337faddd6ebe","blockSize":4194304,"blocks":["89dbdb1542343cb549ecd12cd8c79ae01e6111215445ea6b091f337faddd6ebe"]},"offset":"32451909"},"satisfies.js":{"size":233,"integrity":{"algorithm":"SHA256","hash":"dac3a0af5bbd5ebd2e9b8486582ed61ddec694a9fc9d6afb343b185a1fb3e59f","blockSize":4194304,"blocks":["dac3a0af5bbd5ebd2e9b8486582ed61ddec694a9fc9d6afb343b185a1fb3e59f"]},"offset":"32452058"},"sort.js":{"size":147,"integrity":{"algorithm":"SHA256","hash":"5e3e30991733d8c977afb5cef564a855c2bccd96c080d83e5422e3876cd512fd","blockSize":4194304,"blocks":["5e3e30991733d8c977afb5cef564a855c2bccd96c080d83e5422e3876cd512fd"]},"offset":"32452291"},"valid.js":{"size":162,"integrity":{"algorithm":"SHA256","hash":"d60b69794e2094b2aef35abbed5d17b9e14b41a4fef2ad5a38da4e2171d1c49f","blockSize":4194304,"blocks":["d60b69794e2094b2aef35abbed5d17b9e14b41a4fef2ad5a38da4e2171d1c49f"]},"offset":"32452438"}}},"classes":{"files":{"comparator.js":{"size":3610,"integrity":{"algorithm":"SHA256","hash":"5308ccc329b3e58b681a4d741a226b6d1020789fe8f15cbb7591c1458b2bbc8b","blockSize":4194304,"blocks":["5308ccc329b3e58b681a4d741a226b6d1020789fe8f15cbb7591c1458b2bbc8b"]},"offset":"32452600"},"index.js":{"size":129,"integrity":{"algorithm":"SHA256","hash":"3eab3d0ab16e6b89eb282a8d97e0020f85d938b2d064386445c7d10858a2be98","blockSize":4194304,"blocks":["3eab3d0ab16e6b89eb282a8d97e0020f85d938b2d064386445c7d10858a2be98"]},"offset":"32456210"},"range.js":{"size":14046,"integrity":{"algorithm":"SHA256","hash":"4a2ae32b37a0df0bf13033e541165a09fbdb89b9144807a97e23eed876fc4273","blockSize":4194304,"blocks":["4a2ae32b37a0df0bf13033e541165a09fbdb89b9144807a97e23eed876fc4273"]},"offset":"32456339"},"semver.js":{"size":8008,"integrity":{"algorithm":"SHA256","hash":"e278b17c26d6acebc541b9fa35051a4f5e2ee9f91d7fa9d24f7aa95ba35a1005","blockSize":4194304,"blocks":["e278b17c26d6acebc541b9fa35051a4f5e2ee9f91d7fa9d24f7aa95ba35a1005"]},"offset":"32470385"}}},"bin":{"files":{"semver.js":{"size":4426,"integrity":{"algorithm":"SHA256","hash":"18f1fdb078dcdc5cbc610956e068d9d06f7121a639dc3f62266fee4f3aa82115","blockSize":4194304,"blocks":["18f1fdb078dcdc5cbc610956e068d9d06f7121a639dc3f62266fee4f3aa82115"]},"offset":"32478393"}}}}},"send":{"files":{"HISTORY.md":{"size":13301,"integrity":{"algorithm":"SHA256","hash":"a08b6baffacfbd0ba14cdac367bb7b2e809b91381dcca79633e68518ed360c7c","blockSize":4194304,"blocks":["a08b6baffacfbd0ba14cdac367bb7b2e809b91381dcca79633e68518ed360c7c"]},"offset":"32482819"},"LICENSE":{"size":1128,"integrity":{"algorithm":"SHA256","hash":"25a328069fe771f8ed5b6f983ed4b0e6c84b3312ac0f69b28c3d52dc277962c9","blockSize":4194304,"blocks":["25a328069fe771f8ed5b6f983ed4b0e6c84b3312ac0f69b28c3d52dc277962c9"]},"offset":"32496120"},"SECURITY.md":{"size":1170,"integrity":{"algorithm":"SHA256","hash":"9e6289faf7a1bdb454335b2234d188c178c6fd932d1533326170ed62d157663e","blockSize":4194304,"blocks":["9e6289faf7a1bdb454335b2234d188c178c6fd932d1533326170ed62d157663e"]},"offset":"32497248"},"index.js":{"size":23502,"integrity":{"algorithm":"SHA256","hash":"9196d51e83c8142b5ca56a4d9a0352db4e6fe0a983d9afeb40f8531fb80455a2","blockSize":4194304,"blocks":["9196d51e83c8142b5ca56a4d9a0352db4e6fe0a983d9afeb40f8531fb80455a2"]},"offset":"32498418"},"package.json":{"size":1101,"integrity":{"algorithm":"SHA256","hash":"07423c26d59d2e6c037cb3374c60fd688a58871028ff7a550c1e92c9c3d65eea","blockSize":4194304,"blocks":["07423c26d59d2e6c037cb3374c60fd688a58871028ff7a550c1e92c9c3d65eea"]},"offset":"32521920"},"node_modules":{"files":{"debug":{"files":{"LICENSE":{"size":1107,"integrity":{"algorithm":"SHA256","hash":"98c970de440dcfc77471610aec2377c9d9b0db2b3be6d1add524a586e1d7f422","blockSize":4194304,"blocks":["98c970de440dcfc77471610aec2377c9d9b0db2b3be6d1add524a586e1d7f422"]},"offset":"43724867"},"Makefile":{"size":1059,"integrity":{"algorithm":"SHA256","hash":"f6466507e02c62f14e477af08e4a13ec883152b54d87feeffb8f0d6de6e9013b","blockSize":4194304,"blocks":["f6466507e02c62f14e477af08e4a13ec883152b54d87feeffb8f0d6de6e9013b"]},"offset":"43725974"},"component.json":{"size":321,"integrity":{"algorithm":"SHA256","hash":"2e5ab9ae90f41699e00d00fca16765024f437300a0568c2208669cc281ba7656","blockSize":4194304,"blocks":["2e5ab9ae90f41699e00d00fca16765024f437300a0568c2208669cc281ba7656"]},"offset":"43727033"},"node.js":{"size":40,"integrity":{"algorithm":"SHA256","hash":"996b381f353555cb172ebb2802bb2a7323442ff67b7b530cc26834058d7f31a2","blockSize":4194304,"blocks":["996b381f353555cb172ebb2802bb2a7323442ff67b7b530cc26834058d7f31a2"]},"offset":"43727354"},"package.json":{"size":947,"integrity":{"algorithm":"SHA256","hash":"9eaf6733d4c4fe3dd77abadf7ebafa6acafbfe9a9484e717c262ca8a0ee88e3a","blockSize":4194304,"blocks":["9eaf6733d4c4fe3dd77abadf7ebafa6acafbfe9a9484e717c262ca8a0ee88e3a"]},"offset":"43727394"},"src":{"files":{"browser.js":{"size":4734,"integrity":{"algorithm":"SHA256","hash":"0144ab6a52b9330c567de11a5c3a4aea35cdac47a4c106482aa24ae8054cdc6f","blockSize":4194304,"blocks":["0144ab6a52b9330c567de11a5c3a4aea35cdac47a4c106482aa24ae8054cdc6f"]},"offset":"43728341"},"debug.js":{"size":4394,"integrity":{"algorithm":"SHA256","hash":"d8d1c1d6c387ab67c3f28d78fd0b20b9becd69442db9d3efe110ca464b509c8a","blockSize":4194304,"blocks":["d8d1c1d6c387ab67c3f28d78fd0b20b9becd69442db9d3efe110ca464b509c8a"]},"offset":"43733075"},"index.js":{"size":263,"integrity":{"algorithm":"SHA256","hash":"9a34fedeb2d269c46ed94e6f13039eb0d16d866dd460ec66fa3acd78122fa9fe","blockSize":4194304,"blocks":["9a34fedeb2d269c46ed94e6f13039eb0d16d866dd460ec66fa3acd78122fa9fe"]},"offset":"43737469"},"inspector-log.js":{"size":373,"integrity":{"algorithm":"SHA256","hash":"949ae67ec1b655694f83dce57d47d9d77234f9e7d698616932a90e69c7afee91","blockSize":4194304,"blocks":["949ae67ec1b655694f83dce57d47d9d77234f9e7d698616932a90e69c7afee91"]},"offset":"43737732"},"node.js":{"size":6015,"integrity":{"algorithm":"SHA256","hash":"a3e83594a4ce88997e2e4fc66bc942b17b9d736290ad62560c7f09d6d0989ad0","blockSize":4194304,"blocks":["a3e83594a4ce88997e2e4fc66bc942b17b9d736290ad62560c7f09d6d0989ad0"]},"offset":"43738105"}}},"node_modules":{"files":{"ms":{"files":{"index.js":{"size":2764,"integrity":{"algorithm":"SHA256","hash":"4bd92209cb9dacf3e3773e725acb7aaec43ea9e78540324e4d0f73e5ce9adef7","blockSize":4194304,"blocks":["4bd92209cb9dacf3e3773e725acb7aaec43ea9e78540324e4d0f73e5ce9adef7"]},"offset":"46514923"},"license.md":{"size":1077,"integrity":{"algorithm":"SHA256","hash":"6652830c2607c722b66f1b57de15877ab8fc5dca406cc5b335afeb365d0f32c1","blockSize":4194304,"blocks":["6652830c2607c722b66f1b57de15877ab8fc5dca406cc5b335afeb365d0f32c1"]},"offset":"46517687"},"package.json":{"size":469,"integrity":{"algorithm":"SHA256","hash":"72a34b18a15caec1a2090e28951128f015f6e92d882e4211f08e8284c0f8c3d3","blockSize":4194304,"blocks":["72a34b18a15caec1a2090e28951128f015f6e92d882e4211f08e8284c0f8c3d3"]},"offset":"46518764"}}}}}}},"ms":{"files":{"index.js":{"size":3024,"integrity":{"algorithm":"SHA256","hash":"e5f0b6a946a9b2b356a28557728410717df54ea2f599edb619f9839df6b7b0e9","blockSize":4194304,"blocks":["e5f0b6a946a9b2b356a28557728410717df54ea2f599edb619f9839df6b7b0e9"]},"offset":"43744120"},"license.md":{"size":1079,"integrity":{"algorithm":"SHA256","hash":"1662fae9b5314d11cf51284e2dcd1f006a354f7343f08712a730fcff9a359801","blockSize":4194304,"blocks":["1662fae9b5314d11cf51284e2dcd1f006a354f7343f08712a730fcff9a359801"]},"offset":"43747144"},"package.json":{"size":497,"integrity":{"algorithm":"SHA256","hash":"f983ec581f1dd5a47b7f12b58f97c0b44c4e0cce56cbecc40140031aeef99bdf","blockSize":4194304,"blocks":["f983ec581f1dd5a47b7f12b58f97c0b44c4e0cce56cbecc40140031aeef99bdf"]},"offset":"43748223"}}}}}}},"sequelize":{"files":{"LICENSE":{"size":1087,"integrity":{"algorithm":"SHA256","hash":"59dacfd072bdec3b70f063f29acafc4a41413adf23515710c29a36adaa067abc","blockSize":4194304,"blocks":["59dacfd072bdec3b70f063f29acafc4a41413adf23515710c29a36adaa067abc"]},"offset":"32523021"},"index.js":{"size":264,"integrity":{"algorithm":"SHA256","hash":"7830614a1fae374fb9b2ca0be669788f1f05a9b4ce36be9f52af2ad9136d69e7","blockSize":4194304,"blocks":["7830614a1fae374fb9b2ca0be669788f1f05a9b4ce36be9f52af2ad9136d69e7"]},"offset":"32524108"},"package.json":{"size":4737,"integrity":{"algorithm":"SHA256","hash":"598a49ffa457107762f9d4bfa609f8cdd52086bb424d57b28362d518ad1a1860","blockSize":4194304,"blocks":["598a49ffa457107762f9d4bfa609f8cdd52086bb424d57b28362d518ad1a1860"]},"offset":"32524372"},"lib":{"files":{"data-types.js":{"size":17860,"integrity":{"algorithm":"SHA256","hash":"c973240cd6241e04aed791db1c8f05e8721b3886952c69e7250600ecddd4a844","blockSize":4194304,"blocks":["c973240cd6241e04aed791db1c8f05e8721b3886952c69e7250600ecddd4a844"]},"offset":"32529109"},"deferrable.js":{"size":1344,"integrity":{"algorithm":"SHA256","hash":"5bfa8170ccffd84292ee05e4d9322d3be5ada9eacc715f8af75f9e428636115b","blockSize":4194304,"blocks":["5bfa8170ccffd84292ee05e4d9322d3be5ada9eacc715f8af75f9e428636115b"]},"offset":"32546969"},"hooks.js":{"size":4748,"integrity":{"algorithm":"SHA256","hash":"89d5a66f27ea08eb069ba0f499fa31423d54dbfd4939dbcb3bd3c014d408f0fa","blockSize":4194304,"blocks":["89d5a66f27ea08eb069ba0f499fa31423d54dbfd4939dbcb3bd3c014d408f0fa"]},"offset":"32548313"},"index-hints.js":{"size":146,"integrity":{"algorithm":"SHA256","hash":"bd6aed2affc49d4f3c3391c8a6a3729407a3c2accac0453a190dcf6c1ab43ba9","blockSize":4194304,"blocks":["bd6aed2affc49d4f3c3391c8a6a3729407a3c2accac0453a190dcf6c1ab43ba9"]},"offset":"32553061"},"index.js":{"size":89,"integrity":{"algorithm":"SHA256","hash":"5c45f693e19670bb5025f800aeadd67d803f5e51fb2e9244dafc387bfb123b38","blockSize":4194304,"blocks":["5c45f693e19670bb5025f800aeadd67d803f5e51fb2e9244dafc387bfb123b38"]},"offset":"32553207"},"index.mjs":{"size":4638,"integrity":{"algorithm":"SHA256","hash":"caf2337478f5a4636a92db872a41c76cb0ae5536742e9b3eea2f4fc5ef414028","blockSize":4194304,"blocks":["caf2337478f5a4636a92db872a41c76cb0ae5536742e9b3eea2f4fc5ef414028"]},"offset":"32553296"},"instance-validator.js":{"size":8825,"integrity":{"algorithm":"SHA256","hash":"af26a8d03bfbc9daa2b65628efeff4cc617c546e12531c2522981951845c291c","blockSize":4194304,"blocks":["af26a8d03bfbc9daa2b65628efeff4cc617c546e12531c2522981951845c291c"]},"offset":"32557934"},"model-manager.js":{"size":2463,"integrity":{"algorithm":"SHA256","hash":"cbfb6e2d0475ca1ebb5dc71cfdabed968f0bd646815b715b3fc453aead36e50a","blockSize":4194304,"blocks":["cbfb6e2d0475ca1ebb5dc71cfdabed968f0bd646815b715b3fc453aead36e50a"]},"offset":"32566759"},"model.js":{"size":110174,"integrity":{"algorithm":"SHA256","hash":"d761b0a3683ed960da0fd406eaf1017ce6db961989e03e9de23192221528df29","blockSize":4194304,"blocks":["d761b0a3683ed960da0fd406eaf1017ce6db961989e03e9de23192221528df29"]},"offset":"32569222"},"operators.js":{"size":1741,"integrity":{"algorithm":"SHA256","hash":"2a22e23e4c785b1cb2e1e6148afc5da14ee4ad8f0aced2006cd838f60c183ca9","blockSize":4194304,"blocks":["2a22e23e4c785b1cb2e1e6148afc5da14ee4ad8f0aced2006cd838f60c183ca9"]},"offset":"32679396"},"query-types.js":{"size":436,"integrity":{"algorithm":"SHA256","hash":"985b6564696cb29150bb677e1dee2d25f12552af32dedcc45d69d585539bc518","blockSize":4194304,"blocks":["985b6564696cb29150bb677e1dee2d25f12552af32dedcc45d69d585539bc518"]},"offset":"32681137"},"sequelize.js":{"size":23146,"integrity":{"algorithm":"SHA256","hash":"1ecd114d1af1ffcdd8b3cd699617712a9285ba0a3cfdcb421779813614aaa0b0","blockSize":4194304,"blocks":["1ecd114d1af1ffcdd8b3cd699617712a9285ba0a3cfdcb421779813614aaa0b0"]},"offset":"32681573"},"sql-string.js":{"size":3129,"integrity":{"algorithm":"SHA256","hash":"41aae1b01e9b272aa231ae2127f3c4b0eea3b807578369817b89b4a67b4d83b5","blockSize":4194304,"blocks":["41aae1b01e9b272aa231ae2127f3c4b0eea3b807578369817b89b4a67b4d83b5"]},"offset":"32704719"},"table-hints.js":{"size":476,"integrity":{"algorithm":"SHA256","hash":"17410f6eb4cd6b1fda5dbc1d3ae0efc4d36ee744e6994ba101d8d11de91a048b","blockSize":4194304,"blocks":["17410f6eb4cd6b1fda5dbc1d3ae0efc4d36ee744e6994ba101d8d11de91a048b"]},"offset":"32707848"},"transaction.js":{"size":5852,"integrity":{"algorithm":"SHA256","hash":"8dd3c6765e2dcef31ac28d2974965eb3bfec35fb0b389d022b24f9852e8505af","blockSize":4194304,"blocks":["8dd3c6765e2dcef31ac28d2974965eb3bfec35fb0b389d022b24f9852e8505af"]},"offset":"32708324"},"utils.js":{"size":13295,"integrity":{"algorithm":"SHA256","hash":"cdc0cc892b153eba713c5ef044b732af73139b051e80d523daba4db251863a10","blockSize":4194304,"blocks":["cdc0cc892b153eba713c5ef044b732af73139b051e80d523daba4db251863a10"]},"offset":"32714176"},"utils":{"files":{"class-to-invokable.js":{"size":608,"integrity":{"algorithm":"SHA256","hash":"00ee34a181b7abf303a8a9461612b161f62d0d0f01e0a3d35e16139aaeeb8194","blockSize":4194304,"blocks":["00ee34a181b7abf303a8a9461612b161f62d0d0f01e0a3d35e16139aaeeb8194"]},"offset":"32727471"},"deprecations.js":{"size":2758,"integrity":{"algorithm":"SHA256","hash":"cabab2b7493f32ff54b1a35ffdf38c46a3a85e1c1c593ce7ff2b62fcab9d88bf","blockSize":4194304,"blocks":["cabab2b7493f32ff54b1a35ffdf38c46a3a85e1c1c593ce7ff2b62fcab9d88bf"]},"offset":"32728079"},"join-sql-fragments.js":{"size":2307,"integrity":{"algorithm":"SHA256","hash":"e365dbf1d1a08580ef63ea7e3c6653bdd643c414750ec2e454a709107e51afff","blockSize":4194304,"blocks":["e365dbf1d1a08580ef63ea7e3c6653bdd643c414750ec2e454a709107e51afff"]},"offset":"32730837"},"logger.js":{"size":3126,"integrity":{"algorithm":"SHA256","hash":"eb4dcb878c8b2ac9cfddeb025ce9f245a5292c74c4da65c5cdef812a7c987045","blockSize":4194304,"blocks":["eb4dcb878c8b2ac9cfddeb025ce9f245a5292c74c4da65c5cdef812a7c987045"]},"offset":"32733144"},"sql.js":{"size":6546,"integrity":{"algorithm":"SHA256","hash":"abf2619d3dc13a793afc9e00cdceb6f9b5d111bd7ab98dddea62f5b77c8343d3","blockSize":4194304,"blocks":["abf2619d3dc13a793afc9e00cdceb6f9b5d111bd7ab98dddea62f5b77c8343d3"]},"offset":"32736270"},"validator-extras.js":{"size":2220,"integrity":{"algorithm":"SHA256","hash":"f772f2891f820c03fd01baea83c80685bf2e85d692c0f7a8672d431949650f96","blockSize":4194304,"blocks":["f772f2891f820c03fd01baea83c80685bf2e85d692c0f7a8672d431949650f96"]},"offset":"32742816"}}},"generic":{"files":{"falsy.js":{"size":181,"integrity":{"algorithm":"SHA256","hash":"fc2ecf81015d633eabf29e0704c66fdc56255570c63f658de25b2510cef92262","blockSize":4194304,"blocks":["fc2ecf81015d633eabf29e0704c66fdc56255570c63f658de25b2510cef92262"]},"offset":"32745036"},"sql-fragment.js":{"size":188,"integrity":{"algorithm":"SHA256","hash":"11cd67316980e4f3b0ac3756b98eb35424ed86a0d33ad8e2fda8fe6574ad0bae","blockSize":4194304,"blocks":["11cd67316980e4f3b0ac3756b98eb35424ed86a0d33ad8e2fda8fe6574ad0bae"]},"offset":"32745217"}}},"errors":{"files":{"aggregate-error.js":{"size":2227,"integrity":{"algorithm":"SHA256","hash":"b6f0b8517b94dacd4806539422a16ffb9e3288e75e2f2bdda9a5761e4321e286","blockSize":4194304,"blocks":["b6f0b8517b94dacd4806539422a16ffb9e3288e75e2f2bdda9a5761e4321e286"]},"offset":"32745405"},"association-error.js":{"size":1588,"integrity":{"algorithm":"SHA256","hash":"3a7e18f5bbbd468b4b28d4cf6aa6799c881a705b1d9d1e476169ab7b68a68f26","blockSize":4194304,"blocks":["3a7e18f5bbbd468b4b28d4cf6aa6799c881a705b1d9d1e476169ab7b68a68f26"]},"offset":"32747632"},"base-error.js":{"size":532,"integrity":{"algorithm":"SHA256","hash":"4f414f4f67ea0759cfebb84f4db1d45a9c9168d28a656b2feed45d7761c7b017","blockSize":4194304,"blocks":["4f414f4f67ea0759cfebb84f4db1d45a9c9168d28a656b2feed45d7761c7b017"]},"offset":"32749220"},"bulk-record-error.js":{"size":2014,"integrity":{"algorithm":"SHA256","hash":"4c2897be5f2c40fdd0fb99ac5bc1fdf81c1f375f53990511db464c5b2994171e","blockSize":4194304,"blocks":["4c2897be5f2c40fdd0fb99ac5bc1fdf81c1f375f53990511db464c5b2994171e"]},"offset":"32749752"},"connection-error.js":{"size":2024,"integrity":{"algorithm":"SHA256","hash":"1272739738ab3d881de5246c3892e8cb13fbcd77a52ae96c219ae9ab635f2599","blockSize":4194304,"blocks":["1272739738ab3d881de5246c3892e8cb13fbcd77a52ae96c219ae9ab635f2599"]},"offset":"32751766"},"database-error.js":{"size":2253,"integrity":{"algorithm":"SHA256","hash":"534503e95b3f78bdc11236b898c2a60887c3ce0a392d495787c599d1ae2dc464","blockSize":4194304,"blocks":["534503e95b3f78bdc11236b898c2a60887c3ce0a392d495787c599d1ae2dc464"]},"offset":"32753790"},"eager-loading-error.js":{"size":1597,"integrity":{"algorithm":"SHA256","hash":"996b4381ef9d579a7546b080b5ac9d890d8b123e47dd4c19d049f4cf096c97d1","blockSize":4194304,"blocks":["996b4381ef9d579a7546b080b5ac9d890d8b123e47dd4c19d049f4cf096c97d1"]},"offset":"32756043"},"empty-result-error.js":{"size":1591,"integrity":{"algorithm":"SHA256","hash":"7d0e076a74266d00f633aeddcfb2fb800826a73c4f3ff63985dc84625311282a","blockSize":4194304,"blocks":["7d0e076a74266d00f633aeddcfb2fb800826a73c4f3ff63985dc84625311282a"]},"offset":"32757640"},"index.js":{"size":5394,"integrity":{"algorithm":"SHA256","hash":"350509e6cf67fe99bdfe406ab15ea79ba4844fa34633500211a1eb6e9b72598d","blockSize":4194304,"blocks":["350509e6cf67fe99bdfe406ab15ea79ba4844fa34633500211a1eb6e9b72598d"]},"offset":"32759231"},"instance-error.js":{"size":1570,"integrity":{"algorithm":"SHA256","hash":"3e531596bb9e8b07f09626f38d6336c084403bd9180f9b2fd74f322a52c34963","blockSize":4194304,"blocks":["3e531596bb9e8b07f09626f38d6336c084403bd9180f9b2fd74f322a52c34963"]},"offset":"32764625"},"optimistic-lock-error.js":{"size":2265,"integrity":{"algorithm":"SHA256","hash":"f2fcc6d1a51a6c1fcd9be8c17da1f56873bf8c5298dae63321786679bded65b4","blockSize":4194304,"blocks":["f2fcc6d1a51a6c1fcd9be8c17da1f56873bf8c5298dae63321786679bded65b4"]},"offset":"32766195"},"query-error.js":{"size":1552,"integrity":{"algorithm":"SHA256","hash":"1faccbd253d5364fb5e863563f44e1e4a11296e97aa2e0e7f160392f67c7d7ed","blockSize":4194304,"blocks":["1faccbd253d5364fb5e863563f44e1e4a11296e97aa2e0e7f160392f67c7d7ed"]},"offset":"32768460"},"sequelize-scope-error.js":{"size":1600,"integrity":{"algorithm":"SHA256","hash":"26e273b2e506b31e3b45d83f14b70a647a6affb11f239233bf457092b35ba1d3","blockSize":4194304,"blocks":["26e273b2e506b31e3b45d83f14b70a647a6affb11f239233bf457092b35ba1d3"]},"offset":"32770012"},"validation-error.js":{"size":5444,"integrity":{"algorithm":"SHA256","hash":"279a2d2f6a89f73341d1a0eece4cff4ed2880bf45c598bcb1d32b45039b28488","blockSize":4194304,"blocks":["279a2d2f6a89f73341d1a0eece4cff4ed2880bf45c598bcb1d32b45039b28488"]},"offset":"32771612"},"validation":{"files":{"unique-constraint-error.js":{"size":2598,"integrity":{"algorithm":"SHA256","hash":"477f45a8dae3c3de15499caac03f62bb24534d4811b837445461aecdb20c05cd","blockSize":4194304,"blocks":["477f45a8dae3c3de15499caac03f62bb24534d4811b837445461aecdb20c05cd"]},"offset":"32777056"}}},"database":{"files":{"exclusion-constraint-error.js":{"size":2369,"integrity":{"algorithm":"SHA256","hash":"b43da9637af5025f0b8e75e9359165e03d926937a85f682cff3d92ea25b76eb6","blockSize":4194304,"blocks":["b43da9637af5025f0b8e75e9359165e03d926937a85f682cff3d92ea25b76eb6"]},"offset":"32779654"},"foreign-key-constraint-error.js":{"size":2762,"integrity":{"algorithm":"SHA256","hash":"4b8ef3fe700122cf179521c53e986138b33e74ad99625d24455ac924f198975b","blockSize":4194304,"blocks":["4b8ef3fe700122cf179521c53e986138b33e74ad99625d24455ac924f198975b"]},"offset":"32782023"},"timeout-error.js":{"size":1598,"integrity":{"algorithm":"SHA256","hash":"1043ad575cbb5f43d8a910da5dfd90c3baf1c040aec74fe07d192bb774a7a7b7","blockSize":4194304,"blocks":["1043ad575cbb5f43d8a910da5dfd90c3baf1c040aec74fe07d192bb774a7a7b7"]},"offset":"32784785"},"unknown-constraint-error.js":{"size":2370,"integrity":{"algorithm":"SHA256","hash":"b19f08afd68844accf4e796e252d41315f28e71ff319b4ee44cb80d3b4b6f7b2","blockSize":4194304,"blocks":["b19f08afd68844accf4e796e252d41315f28e71ff319b4ee44cb80d3b4b6f7b2"]},"offset":"32786383"}}},"connection":{"files":{"access-denied-error.js":{"size":1614,"integrity":{"algorithm":"SHA256","hash":"40ab26bb4d718cb3d0ea0dff2326571e2bf5df6f4915bf50338c7bc830b3e977","blockSize":4194304,"blocks":["40ab26bb4d718cb3d0ea0dff2326571e2bf5df6f4915bf50338c7bc830b3e977"]},"offset":"32788753"},"connection-acquire-timeout-error.js":{"size":1689,"integrity":{"algorithm":"SHA256","hash":"fbe79e15eb14b0a1b0ee5aba2199c4878532e8279530e1c4993d00d2b336ee72","blockSize":4194304,"blocks":["fbe79e15eb14b0a1b0ee5aba2199c4878532e8279530e1c4993d00d2b336ee72"]},"offset":"32790367"},"connection-refused-error.js":{"size":1644,"integrity":{"algorithm":"SHA256","hash":"0bf3dd6a60289a80d2f1a54e26cbc28616691423ad824f55fabe1df262e874b7","blockSize":4194304,"blocks":["0bf3dd6a60289a80d2f1a54e26cbc28616691423ad824f55fabe1df262e874b7"]},"offset":"32792056"},"connection-timed-out-error.js":{"size":1653,"integrity":{"algorithm":"SHA256","hash":"d6f9ad011da2999da30998bd6b9a11ae67f644647566f2b687930ae804d2d27a","blockSize":4194304,"blocks":["d6f9ad011da2999da30998bd6b9a11ae67f644647566f2b687930ae804d2d27a"]},"offset":"32793700"},"host-not-found-error.js":{"size":1617,"integrity":{"algorithm":"SHA256","hash":"ef03bcb6aff2e5641f08d515481a6b49d84811121584546e38782fcba96ebd23","blockSize":4194304,"blocks":["ef03bcb6aff2e5641f08d515481a6b49d84811121584546e38782fcba96ebd23"]},"offset":"32795353"},"host-not-reachable-error.js":{"size":1641,"integrity":{"algorithm":"SHA256","hash":"4089a67d98efb48789a3003cd20a991d18ca7826e9c701e87f7aa965715c4e89","blockSize":4194304,"blocks":["4089a67d98efb48789a3003cd20a991d18ca7826e9c701e87f7aa965715c4e89"]},"offset":"32796970"},"invalid-connection-error.js":{"size":1644,"integrity":{"algorithm":"SHA256","hash":"7a3f7205364c3de57eccb5771985ef93364f4eef302a15717fbaef47aa69812c","blockSize":4194304,"blocks":["7a3f7205364c3de57eccb5771985ef93364f4eef302a15717fbaef47aa69812c"]},"offset":"32798611"}}}}},"dialects":{"files":{"parserStore.js":{"size":501,"integrity":{"algorithm":"SHA256","hash":"551a1e8dc9a5e5ec4dae1eec3fdc84cc701e5cf10e3f394815686aa61cf55129","blockSize":4194304,"blocks":["551a1e8dc9a5e5ec4dae1eec3fdc84cc701e5cf10e3f394815686aa61cf55129"]},"offset":"32800255"},"sqlite":{"files":{"connection-manager.js":{"size":3274,"integrity":{"algorithm":"SHA256","hash":"db668f148866694e265486fcd531f82c142e0492b54a767f2c4f43e16d462e84","blockSize":4194304,"blocks":["db668f148866694e265486fcd531f82c142e0492b54a767f2c4f43e16d462e84"]},"offset":"32800756"},"data-types.js":{"size":4783,"integrity":{"algorithm":"SHA256","hash":"0300687e7926a76ccd49620fa666fd25303d21b0342717b1da10cea8e5a1df90","blockSize":4194304,"blocks":["0300687e7926a76ccd49620fa666fd25303d21b0342717b1da10cea8e5a1df90"]},"offset":"32804030"},"index.js":{"size":1795,"integrity":{"algorithm":"SHA256","hash":"68f7dcd96ec11368efa5621c436445169863e094f8114315d7e771057dda4610","blockSize":4194304,"blocks":["68f7dcd96ec11368efa5621c436445169863e094f8114315d7e771057dda4610"]},"offset":"32808813"},"query-generator.js":{"size":15653,"integrity":{"algorithm":"SHA256","hash":"433b1b1684d7771117482416845f7c3b2b91954834908e6d93b2807465de5c6e","blockSize":4194304,"blocks":["433b1b1684d7771117482416845f7c3b2b91954834908e6d93b2807465de5c6e"]},"offset":"32810608"},"query-interface.js":{"size":8589,"integrity":{"algorithm":"SHA256","hash":"6436f084e24c71318d74c192b537ed0157a9437b6f168c6530250481b37b5cb4","blockSize":4194304,"blocks":["6436f084e24c71318d74c192b537ed0157a9437b6f168c6530250481b37b5cb4"]},"offset":"32826261"},"query.js":{"size":12768,"integrity":{"algorithm":"SHA256","hash":"6cb582c4acf6903e4ff5939871559f3cf7c8d0c7173c945deef0d9e7ac40a433","blockSize":4194304,"blocks":["6cb582c4acf6903e4ff5939871559f3cf7c8d0c7173c945deef0d9e7ac40a433"]},"offset":"32834850"},"sqlite-utils.js":{"size":646,"integrity":{"algorithm":"SHA256","hash":"d27f5b8450b6e3c90fe10d2c7656aeeaed89d66b6543796ffda46fca039d1b37","blockSize":4194304,"blocks":["d27f5b8450b6e3c90fe10d2c7656aeeaed89d66b6543796ffda46fca039d1b37"]},"offset":"32847618"}}},"snowflake":{"files":{"connection-manager.js":{"size":4419,"integrity":{"algorithm":"SHA256","hash":"dd3fd94442472da6e43cbeb330f887d22a8b1acc60239dc4821699f5f79c9b9b","blockSize":4194304,"blocks":["dd3fd94442472da6e43cbeb330f887d22a8b1acc60239dc4821699f5f79c9b9b"]},"offset":"32848264"},"data-types.js":{"size":2668,"integrity":{"algorithm":"SHA256","hash":"4b4432e2734daefc6ed6768ca30117537d9ce80a5d93ce5d84553ca36a7f42af","blockSize":4194304,"blocks":["4b4432e2734daefc6ed6768ca30117537d9ce80a5d93ce5d84553ca36a7f42af"]},"offset":"32852683"},"index.js":{"size":1885,"integrity":{"algorithm":"SHA256","hash":"d69a3a730cea61f7b22537a4d618de12cac24cb5a540b30de47cd3cd876ce7cd","blockSize":4194304,"blocks":["d69a3a730cea61f7b22537a4d618de12cac24cb5a540b30de47cd3cd876ce7cd"]},"offset":"32855351"},"query-generator.js":{"size":19901,"integrity":{"algorithm":"SHA256","hash":"f5aa1658e929e605e6eda1accd89ba2954d7fdbf26eba5ece7faab06a36c39e4","blockSize":4194304,"blocks":["f5aa1658e929e605e6eda1accd89ba2954d7fdbf26eba5ece7faab06a36c39e4"]},"offset":"32857236"},"query-interface.js":{"size":3395,"integrity":{"algorithm":"SHA256","hash":"4169bd3468e3086490cf31079d24ce45ceb29fbabbc19dbc1cfddb1833524776","blockSize":4194304,"blocks":["4169bd3468e3086490cf31079d24ce45ceb29fbabbc19dbc1cfddb1833524776"]},"offset":"32877137"},"query.js":{"size":8398,"integrity":{"algorithm":"SHA256","hash":"04396ebf396dbcaa29bb752a76f328e71de4c9f22d8fe99ee1dd972cf3a90418","blockSize":4194304,"blocks":["04396ebf396dbcaa29bb752a76f328e71de4c9f22d8fe99ee1dd972cf3a90418"]},"offset":"32880532"}}},"postgres":{"files":{"connection-manager.js":{"size":9602,"integrity":{"algorithm":"SHA256","hash":"332619d844340d23f5b5eaf7515fc2d0ca95f66cd9740c4cffaee87f1c00dbd4","blockSize":4194304,"blocks":["332619d844340d23f5b5eaf7515fc2d0ca95f66cd9740c4cffaee87f1c00dbd4"]},"offset":"32888930"},"data-types.js":{"size":13058,"integrity":{"algorithm":"SHA256","hash":"d0a104fb9354226c7374c6abf55ea6c10f989fa8c16d448ae0e4545e4c76aefa","blockSize":4194304,"blocks":["d0a104fb9354226c7374c6abf55ea6c10f989fa8c16d448ae0e4545e4c76aefa"]},"offset":"32898532"},"hstore.js":{"size":355,"integrity":{"algorithm":"SHA256","hash":"20ecf1351554b6c4a7840d1eb7eadb0342a34bce98acf0302471bc0acb6c1f29","blockSize":4194304,"blocks":["20ecf1351554b6c4a7840d1eb7eadb0342a34bce98acf0302471bc0acb6c1f29"]},"offset":"32911590"},"index.js":{"size":2159,"integrity":{"algorithm":"SHA256","hash":"e9e36b5d17090eed925d23931883e0c927eb60fd13b33ca24cf1bd07e8ddcca2","blockSize":4194304,"blocks":["e9e36b5d17090eed925d23931883e0c927eb60fd13b33ca24cf1bd07e8ddcca2"]},"offset":"32911945"},"query-generator.js":{"size":31823,"integrity":{"algorithm":"SHA256","hash":"fdcd97fcded257eaa2978266b40085916c068256febdceb70196c93ec5ff11e3","blockSize":4194304,"blocks":["fdcd97fcded257eaa2978266b40085916c068256febdceb70196c93ec5ff11e3"]},"offset":"32914104"},"query-interface.js":{"size":7980,"integrity":{"algorithm":"SHA256","hash":"a44ad9dca3b5262e97f77f234a35e4190c531a87992e0b47e5b2fca6b200b2a2","blockSize":4194304,"blocks":["a44ad9dca3b5262e97f77f234a35e4190c531a87992e0b47e5b2fca6b200b2a2"]},"offset":"32945927"},"query.js":{"size":12583,"integrity":{"algorithm":"SHA256","hash":"331f0e3452cbcfa3995691d3b5b77977d7d808dea29249744a550cc62273d20f","blockSize":4194304,"blocks":["331f0e3452cbcfa3995691d3b5b77977d7d808dea29249744a550cc62273d20f"]},"offset":"32953907"},"range.js":{"size":2140,"integrity":{"algorithm":"SHA256","hash":"2338b4d6af856250f1352a3f76b892e755fd849c983184d7bb7b7d53e11144aa","blockSize":4194304,"blocks":["2338b4d6af856250f1352a3f76b892e755fd849c983184d7bb7b7d53e11144aa"]},"offset":"32966490"}}},"mysql":{"files":{"connection-manager.js":{"size":4549,"integrity":{"algorithm":"SHA256","hash":"ff41812bee3da5a3fea60bb0b316c225c54f72e4c8882c93873544eb0f3a1b91","blockSize":4194304,"blocks":["ff41812bee3da5a3fea60bb0b316c225c54f72e4c8882c93873544eb0f3a1b91"]},"offset":"32968630"},"data-types.js":{"size":3716,"integrity":{"algorithm":"SHA256","hash":"6395182c8df483fc44efab7bd2e86f484bbe4520e20e0e2106a9decb75d0e49a","blockSize":4194304,"blocks":["6395182c8df483fc44efab7bd2e86f484bbe4520e20e0e2106a9decb75d0e49a"]},"offset":"32973179"},"index.js":{"size":1819,"integrity":{"algorithm":"SHA256","hash":"3b318d9e83a017e98c3357d49b87c677137a408ce0d3466dedafcde6199bb0b6","blockSize":4194304,"blocks":["3b318d9e83a017e98c3357d49b87c677137a408ce0d3466dedafcde6199bb0b6"]},"offset":"32976895"},"query-generator.js":{"size":16938,"integrity":{"algorithm":"SHA256","hash":"a666470467f8805cd2d8fe487b02086fb32595fc35950171894e88e387f8f998","blockSize":4194304,"blocks":["a666470467f8805cd2d8fe487b02086fb32595fc35950171894e88e387f8f998"]},"offset":"32978714"},"query-interface.js":{"size":3476,"integrity":{"algorithm":"SHA256","hash":"e74d605c89e445ae3142f741c23e19e86f2d141d1d50b3cf68356a886168bd30","blockSize":4194304,"blocks":["e74d605c89e445ae3142f741c23e19e86f2d141d1d50b3cf68356a886168bd30"]},"offset":"32995652"},"query.js":{"size":8964,"integrity":{"algorithm":"SHA256","hash":"10df5f20bce4c14efa68c0e85bfb719d7a7ba1dc026b95476e52dc63a5058d45","blockSize":4194304,"blocks":["10df5f20bce4c14efa68c0e85bfb719d7a7ba1dc026b95476e52dc63a5058d45"]},"offset":"32999128"}}},"mssql":{"files":{"async-queue.js":{"size":2868,"integrity":{"algorithm":"SHA256","hash":"7fac3d5dcd8727eaadab971c543be93d7a592d632cb03e72a3819a3727b1b79a","blockSize":4194304,"blocks":["7fac3d5dcd8727eaadab971c543be93d7a592d632cb03e72a3819a3727b1b79a"]},"offset":"33008092"},"connection-manager.js":{"size":5077,"integrity":{"algorithm":"SHA256","hash":"45ddfa79dc0ce9d35715e50674f57fef277b6a6a20f561c8c73b38d76d5a9519","blockSize":4194304,"blocks":["45ddfa79dc0ce9d35715e50674f57fef277b6a6a20f561c8c73b38d76d5a9519"]},"offset":"33010960"},"data-types.js":{"size":5318,"integrity":{"algorithm":"SHA256","hash":"829604408c187cac6b1e2bffa5b94db689981fc5fa653a7cf8be6da405bf0e14","blockSize":4194304,"blocks":["829604408c187cac6b1e2bffa5b94db689981fc5fa653a7cf8be6da405bf0e14"]},"offset":"33016037"},"index.js":{"size":1717,"integrity":{"algorithm":"SHA256","hash":"ac8b25dafe0d81da61a504a466d5332a418fd3b4a2b6f41e2ffd61dd95164c05","blockSize":4194304,"blocks":["ac8b25dafe0d81da61a504a466d5332a418fd3b4a2b6f41e2ffd61dd95164c05"]},"offset":"33021355"},"query-generator.js":{"size":32026,"integrity":{"algorithm":"SHA256","hash":"3b25ec740f25b3e5e793134af6194367a0af09bbd26377b5799466fbaa9664f6","blockSize":4194304,"blocks":["3b25ec740f25b3e5e793134af6194367a0af09bbd26377b5799466fbaa9664f6"]},"offset":"33023072"},"query-interface.js":{"size":3500,"integrity":{"algorithm":"SHA256","hash":"a53874c95d804272f062ada9390b0f9b2e56d342aa99de0b325ddcf933948090","blockSize":4194304,"blocks":["a53874c95d804272f062ada9390b0f9b2e56d342aa99de0b325ddcf933948090"]},"offset":"33055098"},"query.js":{"size":11991,"integrity":{"algorithm":"SHA256","hash":"846727e190a93e1d5576364598006760bd1b6ba49d2f83868f71b38d7dc6a78d","blockSize":4194304,"blocks":["846727e190a93e1d5576364598006760bd1b6ba49d2f83868f71b38d7dc6a78d"]},"offset":"33058598"}}},"mariadb":{"files":{"connection-manager.js":{"size":4325,"integrity":{"algorithm":"SHA256","hash":"6ae05e8f6214bcfd2306c0965912fbed4aa608e57bb1a18f2e02a8d2c069417f","blockSize":4194304,"blocks":["6ae05e8f6214bcfd2306c0965912fbed4aa608e57bb1a18f2e02a8d2c069417f"]},"offset":"33070589"},"data-types.js":{"size":3425,"integrity":{"algorithm":"SHA256","hash":"30f9072232cfb4aee53a2300c492e0cc546e1a46a4cf944e734d6981121303f0","blockSize":4194304,"blocks":["30f9072232cfb4aee53a2300c492e0cc546e1a46a4cf944e734d6981121303f0"]},"offset":"33074914"},"index.js":{"size":1875,"integrity":{"algorithm":"SHA256","hash":"84170aa6276e0f9afca9c59047fa3f20b540d87326d50cfcb595e9b843260b93","blockSize":4194304,"blocks":["84170aa6276e0f9afca9c59047fa3f20b540d87326d50cfcb595e9b843260b93"]},"offset":"33078339"},"query-generator.js":{"size":2483,"integrity":{"algorithm":"SHA256","hash":"9e022f91aa4b177f3b67ce698742f67d4f9bbd338ba17a59aedf39ec1abfe817","blockSize":4194304,"blocks":["9e022f91aa4b177f3b67ce698742f67d4f9bbd338ba17a59aedf39ec1abfe817"]},"offset":"33080214"},"query.js":{"size":9461,"integrity":{"algorithm":"SHA256","hash":"67f89353865ee26f49c124783e05c30f87a33331a4f3915b63e5f2f9aef98057","blockSize":4194304,"blocks":["67f89353865ee26f49c124783e05c30f87a33331a4f3915b63e5f2f9aef98057"]},"offset":"33082697"}}},"db2":{"files":{"connection-manager.js":{"size":2770,"integrity":{"algorithm":"SHA256","hash":"0617f6f72a802c6f3647ad6f5610117364514b8261f7981ce94db8785098be5f","blockSize":4194304,"blocks":["0617f6f72a802c6f3647ad6f5610117364514b8261f7981ce94db8785098be5f"]},"offset":"33092158"},"data-types.js":{"size":8522,"integrity":{"algorithm":"SHA256","hash":"a4e6222110e003ce43496734c836f9661123a2d1447d37d15317d60b55c968fd","blockSize":4194304,"blocks":["a4e6222110e003ce43496734c836f9661123a2d1447d37d15317d60b55c968fd"]},"offset":"33094928"},"index.js":{"size":1715,"integrity":{"algorithm":"SHA256","hash":"9aa2c0d5969da4e6aef4fb162104ac91091158310806b5ba6218d14f65e7fc08","blockSize":4194304,"blocks":["9aa2c0d5969da4e6aef4fb162104ac91091158310806b5ba6218d14f65e7fc08"]},"offset":"33103450"},"query-generator.js":{"size":28226,"integrity":{"algorithm":"SHA256","hash":"1ee16fd25ace746d4518556833fee211f6d8780109b96efe5cd4649bf419eb1b","blockSize":4194304,"blocks":["1ee16fd25ace746d4518556833fee211f6d8780109b96efe5cd4649bf419eb1b"]},"offset":"33105165"},"query-interface.js":{"size":4872,"integrity":{"algorithm":"SHA256","hash":"71ac53c70bfd8b3d434cb62a914b18a9b79c6daa43dcfb59b0a8f394a8de405c","blockSize":4194304,"blocks":["71ac53c70bfd8b3d434cb62a914b18a9b79c6daa43dcfb59b0a8f394a8de405c"]},"offset":"33133391"},"query.js":{"size":16426,"integrity":{"algorithm":"SHA256","hash":"809fbd7df8da32916c013422f1a6fedce27d98f400e748d90f493aadf5dd8a31","blockSize":4194304,"blocks":["809fbd7df8da32916c013422f1a6fedce27d98f400e748d90f493aadf5dd8a31"]},"offset":"33138263"}}},"abstract":{"files":{"connection-manager.js":{"size":8660,"integrity":{"algorithm":"SHA256","hash":"545c7c4f06d469711a16f5fed0fab9d3f663f7bd217741f182801cd7f2514599","blockSize":4194304,"blocks":["545c7c4f06d469711a16f5fed0fab9d3f663f7bd217741f182801cd7f2514599"]},"offset":"33154689"},"index.js":{"size":1347,"integrity":{"algorithm":"SHA256","hash":"c38626ab1a5507b7c352f464497890add8d31b09fea398a017e1b4402cf2c45f","blockSize":4194304,"blocks":["c38626ab1a5507b7c352f464497890add8d31b09fea398a017e1b4402cf2c45f"]},"offset":"33163349"},"query-generator.js":{"size":86127,"integrity":{"algorithm":"SHA256","hash":"d507691241a6053d85a1d2911e6f712dd629b3a863e124db77173650dea84c9d","blockSize":4194304,"blocks":["d507691241a6053d85a1d2911e6f712dd629b3a863e124db77173650dea84c9d"]},"offset":"33164696"},"query-interface.js":{"size":24682,"integrity":{"algorithm":"SHA256","hash":"eb7d8fd41957b7a7b2f99c8ad86519370f4f683451d407a86dc71aa365248fd6","blockSize":4194304,"blocks":["eb7d8fd41957b7a7b2f99c8ad86519370f4f683451d407a86dc71aa365248fd6"]},"offset":"33250823"},"query.js":{"size":19072,"integrity":{"algorithm":"SHA256","hash":"0d09c2003652ea217e81ca4c699892238477d3d4f9f9548cbb500b17a19303ff","blockSize":4194304,"blocks":["0d09c2003652ea217e81ca4c699892238477d3d4f9f9548cbb500b17a19303ff"]},"offset":"33275505"},"query-generator":{"files":{"operators.js":{"size":2645,"integrity":{"algorithm":"SHA256","hash":"860f65e035e76e500cf5fd31074d40867a0ebe97a1742511701e1a46e2a99a5f","blockSize":4194304,"blocks":["860f65e035e76e500cf5fd31074d40867a0ebe97a1742511701e1a46e2a99a5f"]},"offset":"33294577"},"transaction.js":{"size":980,"integrity":{"algorithm":"SHA256","hash":"2c9b0d4b76677ef014713bf56ca71cc30fda1db966f9159d01d09e0acfc60253","blockSize":4194304,"blocks":["2c9b0d4b76677ef014713bf56ca71cc30fda1db966f9159d01d09e0acfc60253"]},"offset":"33297222"}}}}}}},"associations":{"files":{"base.js":{"size":1063,"integrity":{"algorithm":"SHA256","hash":"1e45ebbe3bd59ccf74c8159457609ad0c3b07d8b2089d90d2fc8237e0c5bff94","blockSize":4194304,"blocks":["1e45ebbe3bd59ccf74c8159457609ad0c3b07d8b2089d90d2fc8237e0c5bff94"]},"offset":"33298202"},"belongs-to-many.js":{"size":23125,"integrity":{"algorithm":"SHA256","hash":"0d8e90313b7c40d0c845dd04d0bc90fcecdcd04928e3c50da2f87b4aeda5d052","blockSize":4194304,"blocks":["0d8e90313b7c40d0c845dd04d0bc90fcecdcd04928e3c50da2f87b4aeda5d052"]},"offset":"33299265"},"belongs-to.js":{"size":6490,"integrity":{"algorithm":"SHA256","hash":"4c02363403b55b0542a011f74bd52a58424df98fe8f2f4ed4547726b1772f12e","blockSize":4194304,"blocks":["4c02363403b55b0542a011f74bd52a58424df98fe8f2f4ed4547726b1772f12e"]},"offset":"33322390"},"has-many.js":{"size":11910,"integrity":{"algorithm":"SHA256","hash":"d3df7c986e096752a57cd8bba8541af48da75df2ef6a90783ab491c97ffbcc85","blockSize":4194304,"blocks":["d3df7c986e096752a57cd8bba8541af48da75df2ef6a90783ab491c97ffbcc85"]},"offset":"33328880"},"has-one.js":{"size":7518,"integrity":{"algorithm":"SHA256","hash":"972cb20c66a700cf72e217f7b841867f5a01de03b9b43bbc631a69df5a3966d8","blockSize":4194304,"blocks":["972cb20c66a700cf72e217f7b841867f5a01de03b9b43bbc631a69df5a3966d8"]},"offset":"33340790"},"helpers.js":{"size":1591,"integrity":{"algorithm":"SHA256","hash":"fce92b745173749b60846918af5feb8f1de0f848350013b7edc43fb7d22450b1","blockSize":4194304,"blocks":["fce92b745173749b60846918af5feb8f1de0f848350013b7edc43fb7d22450b1"]},"offset":"33348308"},"index.js":{"size":392,"integrity":{"algorithm":"SHA256","hash":"5a26b72e4a76e28690cf24e14e2febe5ba7e73fdabe154bb2f07d0cc14dfa501","blockSize":4194304,"blocks":["5a26b72e4a76e28690cf24e14e2febe5ba7e73fdabe154bb2f07d0cc14dfa501"]},"offset":"33349899"},"mixin.js":{"size":3739,"integrity":{"algorithm":"SHA256","hash":"326bae13855eebdfaeb222c7eaded923be90803c891053d94aba5ed2d1bc82ca","blockSize":4194304,"blocks":["326bae13855eebdfaeb222c7eaded923be90803c891053d94aba5ed2d1bc82ca"]},"offset":"33350291"}}}}},"node_modules":{"files":{"uuid":{"files":{"CONTRIBUTING.md":{"size":513,"integrity":{"algorithm":"SHA256","hash":"99b5cc0a56af12be90a669fdffc9f5a721236d2ede0d92e1171bb7097dd9fdd7","blockSize":4194304,"blocks":["99b5cc0a56af12be90a669fdffc9f5a721236d2ede0d92e1171bb7097dd9fdd7"]},"offset":"43748720"},"LICENSE.md":{"size":1109,"integrity":{"algorithm":"SHA256","hash":"beaa6b04fb82e41dd2ad679e19e27953afb5999b1abbb455b6564e78ebfeb332","blockSize":4194304,"blocks":["beaa6b04fb82e41dd2ad679e19e27953afb5999b1abbb455b6564e78ebfeb332"]},"offset":"43749233"},"package.json":{"size":2601,"integrity":{"algorithm":"SHA256","hash":"c33d17ad3546ea553db5df68edb1ac9a794e2e57fc99f838a9d78434ae009abc","blockSize":4194304,"blocks":["c33d17ad3546ea553db5df68edb1ac9a794e2e57fc99f838a9d78434ae009abc"]},"offset":"43750342"},"wrapper.mjs":{"size":323,"integrity":{"algorithm":"SHA256","hash":"f6835608d7c4b422bb11ab4689bcf91e166ecbbd63aa3fa2b83c448835cd80a5","blockSize":4194304,"blocks":["f6835608d7c4b422bb11ab4689bcf91e166ecbbd63aa3fa2b83c448835cd80a5"]},"offset":"43752943"},"dist":{"files":{"index.js":{"size":1765,"integrity":{"algorithm":"SHA256","hash":"069a2230d395723583c8e45a7c0fee2622af2fbd08dc35f81e4d57836122e59f","blockSize":4194304,"blocks":["069a2230d395723583c8e45a7c0fee2622af2fbd08dc35f81e4d57836122e59f"]},"offset":"43753266"},"md5-browser.js":{"size":7015,"integrity":{"algorithm":"SHA256","hash":"21a4e167b7ae498e8f3778bac8d7330929099006afca6adfe76b626e0e41d795","blockSize":4194304,"blocks":["21a4e167b7ae498e8f3778bac8d7330929099006afca6adfe76b626e0e41d795"]},"offset":"43755031"},"md5.js":{"size":550,"integrity":{"algorithm":"SHA256","hash":"6ca6276ff35f19ea462bb8c9d6d290994fa9980fc775deb741811ef947196ced","blockSize":4194304,"blocks":["6ca6276ff35f19ea462bb8c9d6d290994fa9980fc775deb741811ef947196ced"]},"offset":"43762046"},"nil.js":{"size":188,"integrity":{"algorithm":"SHA256","hash":"7395bd919bd1309bcbced245a59dfc6b077f97992a482af2537343e558795b1f","blockSize":4194304,"blocks":["7395bd919bd1309bcbced245a59dfc6b077f97992a482af2537343e558795b1f"]},"offset":"43762596"},"parse.js":{"size":1380,"integrity":{"algorithm":"SHA256","hash":"1a87ed6a6bb0a3edbe266ca55aaf1c5af8e963ee9486f74b59cfd615280b21b4","blockSize":4194304,"blocks":["1a87ed6a6bb0a3edbe266ca55aaf1c5af8e963ee9486f74b59cfd615280b21b4"]},"offset":"43762784"},"regex.js":{"size":267,"integrity":{"algorithm":"SHA256","hash":"acc4c54d987f100093097f4f156ff245394c39d1332eb2114d7e40db00bd6ddd","blockSize":4194304,"blocks":["acc4c54d987f100093097f4f156ff245394c39d1332eb2114d7e40db00bd6ddd"]},"offset":"43764164"},"rng-browser.js":{"size":1131,"integrity":{"algorithm":"SHA256","hash":"4c88edf4fd7fae3bf84bad34750a55f706c8e522a924af6c6ad22839e3718dd6","blockSize":4194304,"blocks":["4c88edf4fd7fae3bf84bad34750a55f706c8e522a924af6c6ad22839e3718dd6"]},"offset":"43764431"},"rng.js":{"size":549,"integrity":{"algorithm":"SHA256","hash":"fdde4350fc69c07bfed4178eedf6121a56264744207d9f5c8f3e5b1b913dbb06","blockSize":4194304,"blocks":["fdde4350fc69c07bfed4178eedf6121a56264744207d9f5c8f3e5b1b913dbb06"]},"offset":"43765562"},"sha1-browser.js":{"size":2609,"integrity":{"algorithm":"SHA256","hash":"32982388b377b06298f59db97c98077f06e6b4f29fe284d427195a358a72f19e","blockSize":4194304,"blocks":["32982388b377b06298f59db97c98077f06e6b4f29fe284d427195a358a72f19e"]},"offset":"43766111"},"sha1.js":{"size":553,"integrity":{"algorithm":"SHA256","hash":"a9eda407444a3f68a0a4db0373346df18f583abbde2c4bf2b3fbc6d73be2c75e","blockSize":4194304,"blocks":["a9eda407444a3f68a0a4db0373346df18f583abbde2c4bf2b3fbc6d73be2c75e"]},"offset":"43768720"},"stringify.js":{"size":1667,"integrity":{"algorithm":"SHA256","hash":"85a70b8982f37ddb434816dcda7628b0319e5a90d46ac6bc9b08d4d15d6a7650","blockSize":4194304,"blocks":["85a70b8982f37ddb434816dcda7628b0319e5a90d46ac6bc9b08d4d15d6a7650"]},"offset":"43769273"},"uuid-bin.js":{"size":2030,"integrity":{"algorithm":"SHA256","hash":"7c60635cf5a963da72e35292bcbfa7f7221b08374d69d75103fa82da9d950102","blockSize":4194304,"blocks":["7c60635cf5a963da72e35292bcbfa7f7221b08374d69d75103fa82da9d950102"]},"offset":"43770940"},"v1.js":{"size":3618,"integrity":{"algorithm":"SHA256","hash":"6dad9c2e6565ad6b478fba7b2ace95350df56a15a72920e72ac64c3a2691d665","blockSize":4194304,"blocks":["6dad9c2e6565ad6b478fba7b2ace95350df56a15a72920e72ac64c3a2691d665"]},"offset":"43772970"},"v3.js":{"size":414,"integrity":{"algorithm":"SHA256","hash":"95e0c6fa204355c6ef7dbac5720a3ef5239454ed6820674dfcc143a55ea6c459","blockSize":4194304,"blocks":["95e0c6fa204355c6ef7dbac5720a3ef5239454ed6820674dfcc143a55ea6c459"]},"offset":"43776588"},"v35.js":{"size":2008,"integrity":{"algorithm":"SHA256","hash":"ababd96e6f8b1fca9bb58f43220473f7bd59fbc81b3acb212df924813544283f","blockSize":4194304,"blocks":["ababd96e6f8b1fca9bb58f43220473f7bd59fbc81b3acb212df924813544283f"]},"offset":"43777002"},"v4.js":{"size":860,"integrity":{"algorithm":"SHA256","hash":"a9e30e8692dde9dec39a3ef716ef8e650e321813fa9d137f16d27666b9ad96ef","blockSize":4194304,"blocks":["a9e30e8692dde9dec39a3ef716ef8e650e321813fa9d137f16d27666b9ad96ef"]},"offset":"43779010"},"v5.js":{"size":417,"integrity":{"algorithm":"SHA256","hash":"d15c31975f31b9abf6a195e70a3dca0843a9257cb51b49214cf7a9f4ed30fc5a","blockSize":4194304,"blocks":["d15c31975f31b9abf6a195e70a3dca0843a9257cb51b49214cf7a9f4ed30fc5a"]},"offset":"43779870"},"validate.js":{"size":410,"integrity":{"algorithm":"SHA256","hash":"5497d9adffd73474cf379d3e1b76b28698e408124a0726d54e88282500378502","blockSize":4194304,"blocks":["5497d9adffd73474cf379d3e1b76b28698e408124a0726d54e88282500378502"]},"offset":"43780287"},"version.js":{"size":474,"integrity":{"algorithm":"SHA256","hash":"cad5f0ecd518983e310856cafd54d4d0de0b9db3c8e3bd97ec8e773ef63de6e8","blockSize":4194304,"blocks":["cad5f0ecd518983e310856cafd54d4d0de0b9db3c8e3bd97ec8e773ef63de6e8"]},"offset":"43780697"},"umd":{"files":{"uuid.min.js":{"size":8160,"integrity":{"algorithm":"SHA256","hash":"c5df6d9704bdada96df0770523058f395192ee9d1fe13880eb1d57dfe6417533","blockSize":4194304,"blocks":["c5df6d9704bdada96df0770523058f395192ee9d1fe13880eb1d57dfe6417533"]},"offset":"43781171"},"uuidNIL.min.js":{"size":280,"integrity":{"algorithm":"SHA256","hash":"18c98395b8a11f83924c22af88573b8bbe3a5cf4fe7864364e6902e49ac3d7fd","blockSize":4194304,"blocks":["18c98395b8a11f83924c22af88573b8bbe3a5cf4fe7864364e6902e49ac3d7fd"]},"offset":"43789331"},"uuidParse.min.js":{"size":883,"integrity":{"algorithm":"SHA256","hash":"555a6f1b1f49532a96c4235ab4de7c1e5fec9b8724bcf1a1247ba4eb33116af2","blockSize":4194304,"blocks":["555a6f1b1f49532a96c4235ab4de7c1e5fec9b8724bcf1a1247ba4eb33116af2"]},"offset":"43789611"},"uuidStringify.min.js":{"size":829,"integrity":{"algorithm":"SHA256","hash":"9b6db819fecb2f40d9fa5ac8c892218004b3a633a1ec29d7a873801a7eade28f","blockSize":4194304,"blocks":["9b6db819fecb2f40d9fa5ac8c892218004b3a633a1ec29d7a873801a7eade28f"]},"offset":"43790494"},"uuidValidate.min.js":{"size":420,"integrity":{"algorithm":"SHA256","hash":"45a1c7d7618c149522c8f8085675e6707381f6106ca414c294b3e6169065cf21","blockSize":4194304,"blocks":["45a1c7d7618c149522c8f8085675e6707381f6106ca414c294b3e6169065cf21"]},"offset":"43791323"},"uuidVersion.min.js":{"size":506,"integrity":{"algorithm":"SHA256","hash":"c0a99b310a43528b5e4f59c87dcc489732bf8c4dd3a367c34cf882a88a3cecca","blockSize":4194304,"blocks":["c0a99b310a43528b5e4f59c87dcc489732bf8c4dd3a367c34cf882a88a3cecca"]},"offset":"43791743"},"uuidv1.min.js":{"size":2020,"integrity":{"algorithm":"SHA256","hash":"9963a427c7b05e1ea3c923cfed992cfea294e980e42d754ba593cec66d285a07","blockSize":4194304,"blocks":["9963a427c7b05e1ea3c923cfed992cfea294e980e42d754ba593cec66d285a07"]},"offset":"43792249"},"uuidv3.min.js":{"size":5145,"integrity":{"algorithm":"SHA256","hash":"2d31a5a7ef824371df6f91ad677cd137ca9b51a529be40873f9b60009c550932","blockSize":4194304,"blocks":["2d31a5a7ef824371df6f91ad677cd137ca9b51a529be40873f9b60009c550932"]},"offset":"43794269"},"uuidv4.min.js":{"size":1366,"integrity":{"algorithm":"SHA256","hash":"4bbb806e743e21bc9f97b62fc0564e0889b7f31ee9d48c3f2b85d4e00fe629cc","blockSize":4194304,"blocks":["4bbb806e743e21bc9f97b62fc0564e0889b7f31ee9d48c3f2b85d4e00fe629cc"]},"offset":"43799414"},"uuidv5.min.js":{"size":3267,"integrity":{"algorithm":"SHA256","hash":"1a444d14f3a6f8952bfc827be5c52dc7367c99e5bf30a5e5102f0b4ad420df76","blockSize":4194304,"blocks":["1a444d14f3a6f8952bfc827be5c52dc7367c99e5bf30a5e5102f0b4ad420df76"]},"offset":"43800780"}}},"esm-node":{"files":{"index.js":{"size":412,"integrity":{"algorithm":"SHA256","hash":"3efb8df8c64379c5acbaf0b70ce1a1906375f4b53901b7e90a26863ead50fc30","blockSize":4194304,"blocks":["3efb8df8c64379c5acbaf0b70ce1a1906375f4b53901b7e90a26863ead50fc30"]},"offset":"43804047"},"md5.js":{"size":281,"integrity":{"algorithm":"SHA256","hash":"2313329bf3ada8cd17046afeefa761bd7daa3821e140fc55d8c2b94ee7760ed4","blockSize":4194304,"blocks":["2313329bf3ada8cd17046afeefa761bd7daa3821e140fc55d8c2b94ee7760ed4"]},"offset":"43804459"},"nil.js":{"size":54,"integrity":{"algorithm":"SHA256","hash":"40036d4ffe78154827eedb9c1b3f59f660722907389725842bbc178ba28d2241","blockSize":4194304,"blocks":["40036d4ffe78154827eedb9c1b3f59f660722907389725842bbc178ba28d2241"]},"offset":"43804740"},"parse.js":{"size":1106,"integrity":{"algorithm":"SHA256","hash":"2743e5b696fb15df389cf3b1a242e56780f7941bbefc23465529d30e851b80f5","blockSize":4194304,"blocks":["2743e5b696fb15df389cf3b1a242e56780f7941bbefc23465529d30e851b80f5"]},"offset":"43804794"},"regex.js":{"size":133,"integrity":{"algorithm":"SHA256","hash":"9a546763c108d7eeb7283ce26c7a6845a44bd67132005eb32fd1feeca49d1b3f","blockSize":4194304,"blocks":["9a546763c108d7eeb7283ce26c7a6845a44bd67132005eb32fd1feeca49d1b3f"]},"offset":"43805900"},"rng.js":{"size":323,"integrity":{"algorithm":"SHA256","hash":"ff667aff9367a48cc713d36764cea05bd30e8ba05392430571c54734fc9fde03","blockSize":4194304,"blocks":["ff667aff9367a48cc713d36764cea05bd30e8ba05392430571c54734fc9fde03"]},"offset":"43806033"},"sha1.js":{"size":284,"integrity":{"algorithm":"SHA256","hash":"6094b056716c8a37b9f2da365d6c8a17f754543d966411d01dfebd762c94547e","blockSize":4194304,"blocks":["6094b056716c8a37b9f2da365d6c8a17f754543d966411d01dfebd762c94547e"]},"offset":"43806356"},"stringify.js":{"size":1393,"integrity":{"algorithm":"SHA256","hash":"224279f45e9b30fca5de4fcf8620aa00ac3c8bef89fc073bfb36b83272bd1556","blockSize":4194304,"blocks":["224279f45e9b30fca5de4fcf8620aa00ac3c8bef89fc073bfb36b83272bd1556"]},"offset":"43806640"},"v1.js":{"size":3306,"integrity":{"algorithm":"SHA256","hash":"4cbdb6e889c57896cc8dd35f299aa05a00ff7a43b875a187f87c95e7bb2c3f0f","blockSize":4194304,"blocks":["4cbdb6e889c57896cc8dd35f299aa05a00ff7a43b875a187f87c95e7bb2c3f0f"]},"offset":"43808033"},"v3.js":{"size":107,"integrity":{"algorithm":"SHA256","hash":"65b963f24922d433fdc592aa4e2764d10fad59351015bbe5fce0830fe389794a","blockSize":4194304,"blocks":["65b963f24922d433fdc592aa4e2764d10fad59351015bbe5fce0830fe389794a"]},"offset":"43811339"},"v35.js":{"size":1663,"integrity":{"algorithm":"SHA256","hash":"56a358587ded91ef272d54a4937e6f59193cd11b51710503859083feb8d6f20f","blockSize":4194304,"blocks":["56a358587ded91ef272d54a4937e6f59193cd11b51710503859083feb8d6f20f"]},"offset":"43811446"},"v4.js":{"size":546,"integrity":{"algorithm":"SHA256","hash":"44d2fedb301801c7c60e45934eaa13435614e3d65aedf8759775890de75bed69","blockSize":4194304,"blocks":["44d2fedb301801c7c60e45934eaa13435614e3d65aedf8759775890de75bed69"]},"offset":"43813109"},"v5.js":{"size":110,"integrity":{"algorithm":"SHA256","hash":"e9e8d82440c23fc3de56f8acd5a15b1ca2daad6bf6d2e7c4a4b39d04384206d3","blockSize":4194304,"blocks":["e9e8d82440c23fc3de56f8acd5a15b1ca2daad6bf6d2e7c4a4b39d04384206d3"]},"offset":"43813655"},"validate.js":{"size":141,"integrity":{"algorithm":"SHA256","hash":"4a782f41298704c0029c245203430b3e4511365bf05a3addacdbae59d9c664fa","blockSize":4194304,"blocks":["4a782f41298704c0029c245203430b3e4511365bf05a3addacdbae59d9c664fa"]},"offset":"43813765"},"version.js":{"size":200,"integrity":{"algorithm":"SHA256","hash":"84d1c2f759c39dbf8b26a359b0d68ba9fcc68bf8c3612b8b1bb0df31dfb2e693","blockSize":4194304,"blocks":["84d1c2f759c39dbf8b26a359b0d68ba9fcc68bf8c3612b8b1bb0df31dfb2e693"]},"offset":"43813906"}}},"esm-browser":{"files":{"index.js":{"size":412,"integrity":{"algorithm":"SHA256","hash":"3efb8df8c64379c5acbaf0b70ce1a1906375f4b53901b7e90a26863ead50fc30","blockSize":4194304,"blocks":["3efb8df8c64379c5acbaf0b70ce1a1906375f4b53901b7e90a26863ead50fc30"]},"offset":"43814106"},"md5.js":{"size":6852,"integrity":{"algorithm":"SHA256","hash":"705eb0feeda58a88a5b887cf580e38bb9979dec642dd663b63c9dc485e956728","blockSize":4194304,"blocks":["705eb0feeda58a88a5b887cf580e38bb9979dec642dd663b63c9dc485e956728"]},"offset":"43814518"},"nil.js":{"size":54,"integrity":{"algorithm":"SHA256","hash":"40036d4ffe78154827eedb9c1b3f59f660722907389725842bbc178ba28d2241","blockSize":4194304,"blocks":["40036d4ffe78154827eedb9c1b3f59f660722907389725842bbc178ba28d2241"]},"offset":"43821370"},"parse.js":{"size":1104,"integrity":{"algorithm":"SHA256","hash":"1efd0e1dd5d7d205a3405f5aee39029ea60bece8a893b2bf742a16c6a51246a6","blockSize":4194304,"blocks":["1efd0e1dd5d7d205a3405f5aee39029ea60bece8a893b2bf742a16c6a51246a6"]},"offset":"43821424"},"regex.js":{"size":133,"integrity":{"algorithm":"SHA256","hash":"9a546763c108d7eeb7283ce26c7a6845a44bd67132005eb32fd1feeca49d1b3f","blockSize":4194304,"blocks":["9a546763c108d7eeb7283ce26c7a6845a44bd67132005eb32fd1feeca49d1b3f"]},"offset":"43822528"},"rng.js":{"size":1040,"integrity":{"algorithm":"SHA256","hash":"0e1abdc73fa79ff64006ec6675b06a193f55eac039595cc3867e6567e46f2dd7","blockSize":4194304,"blocks":["0e1abdc73fa79ff64006ec6675b06a193f55eac039595cc3867e6567e46f2dd7"]},"offset":"43822661"},"sha1.js":{"size":2488,"integrity":{"algorithm":"SHA256","hash":"0b777c8796a7e0954a47bc5b7d612f89d7cd9218106881a9b4931f8f882fd056","blockSize":4194304,"blocks":["0b777c8796a7e0954a47bc5b7d612f89d7cd9218106881a9b4931f8f882fd056"]},"offset":"43823701"},"stringify.js":{"size":1463,"integrity":{"algorithm":"SHA256","hash":"b3e05d40408725c571660f7f1bfdb1b20fde769c5142f23273a95815b2ca5d01","blockSize":4194304,"blocks":["b3e05d40408725c571660f7f1bfdb1b20fde769c5142f23273a95815b2ca5d01"]},"offset":"43826189"},"v1.js":{"size":3296,"integrity":{"algorithm":"SHA256","hash":"746184938af3d1e32fb432711c135d95305f839d94a5e90dd23438435a8342b6","blockSize":4194304,"blocks":["746184938af3d1e32fb432711c135d95305f839d94a5e90dd23438435a8342b6"]},"offset":"43827652"},"v3.js":{"size":105,"integrity":{"algorithm":"SHA256","hash":"337d2b9ef80229c44c240e4218aa324b129d792701432061946ee4154e30080a","blockSize":4194304,"blocks":["337d2b9ef80229c44c240e4218aa324b129d792701432061946ee4154e30080a"]},"offset":"43830948"},"v35.js":{"size":1657,"integrity":{"algorithm":"SHA256","hash":"c418ede8cd4d61f12ae553adac55b1afa2cbd8c8659c31dd657c1decbb36314b","blockSize":4194304,"blocks":["c418ede8cd4d61f12ae553adac55b1afa2cbd8c8659c31dd657c1decbb36314b"]},"offset":"43831053"},"v4.js":{"size":544,"integrity":{"algorithm":"SHA256","hash":"971f818a59ef77ee2c213dfea32dc4494823f9b8bd45be19fd81cf49b09f44e5","blockSize":4194304,"blocks":["971f818a59ef77ee2c213dfea32dc4494823f9b8bd45be19fd81cf49b09f44e5"]},"offset":"43832710"},"v5.js":{"size":108,"integrity":{"algorithm":"SHA256","hash":"07e6d11989b44edbe92ccb697febb65225ebad32fb2f9c91c5b571a6f5a3c4df","blockSize":4194304,"blocks":["07e6d11989b44edbe92ccb697febb65225ebad32fb2f9c91c5b571a6f5a3c4df"]},"offset":"43833254"},"validate.js":{"size":141,"integrity":{"algorithm":"SHA256","hash":"4a782f41298704c0029c245203430b3e4511365bf05a3addacdbae59d9c664fa","blockSize":4194304,"blocks":["4a782f41298704c0029c245203430b3e4511365bf05a3addacdbae59d9c664fa"]},"offset":"43833362"},"version.js":{"size":200,"integrity":{"algorithm":"SHA256","hash":"84d1c2f759c39dbf8b26a359b0d68ba9fcc68bf8c3612b8b1bb0df31dfb2e693","blockSize":4194304,"blocks":["84d1c2f759c39dbf8b26a359b0d68ba9fcc68bf8c3612b8b1bb0df31dfb2e693"]},"offset":"43833503"}}},"bin":{"files":{"uuid":{"size":44,"integrity":{"algorithm":"SHA256","hash":"30b5422b6c95ccdc402effd7d3354ca6a6bce621cf21d0379749ddf1f96c1ad7","blockSize":4194304,"blocks":["30b5422b6c95ccdc402effd7d3354ca6a6bce621cf21d0379749ddf1f96c1ad7"]},"offset":"43833703"}}}}}}}}}}},"sequelize-pool":{"files":{"LICENSE":{"size":2272,"integrity":{"algorithm":"SHA256","hash":"ba3ae50e3e8e507098299c3fbd73952aeb183b050cde4f34966200798250b8d6","blockSize":4194304,"blocks":["ba3ae50e3e8e507098299c3fbd73952aeb183b050cde4f34966200798250b8d6"]},"offset":"33354030"},"package.json":{"size":877,"integrity":{"algorithm":"SHA256","hash":"aa6faa590b6a85f58e2046609df640a68e4db052528535bee2284788e023ca77","blockSize":4194304,"blocks":["aa6faa590b6a85f58e2046609df640a68e4db052528535bee2284788e023ca77"]},"offset":"33356302"},"lib":{"files":{"AggregateError.js":{"size":756,"integrity":{"algorithm":"SHA256","hash":"0b09169452bd1e894edf20f792b838fb2b03ef34c5b253720282695b870cdfb0","blockSize":4194304,"blocks":["0b09169452bd1e894edf20f792b838fb2b03ef34c5b253720282695b870cdfb0"]},"offset":"33357179"},"Deferred.js":{"size":1021,"integrity":{"algorithm":"SHA256","hash":"7c137dc05f8897c796a390eb3f881414bc9a7fff3bf21a075c26316c3083292c","blockSize":4194304,"blocks":["7c137dc05f8897c796a390eb3f881414bc9a7fff3bf21a075c26316c3083292c"]},"offset":"33357935"},"Pool.js":{"size":10503,"integrity":{"algorithm":"SHA256","hash":"c388674c562790495b86b5a84376cf8a0cb0e877e5d0709eb77a809d06dcadd6","blockSize":4194304,"blocks":["c388674c562790495b86b5a84376cf8a0cb0e877e5d0709eb77a809d06dcadd6"]},"offset":"33358956"},"TimeoutError.js":{"size":222,"integrity":{"algorithm":"SHA256","hash":"83232c75e544ce5f6d8f1336048469b6ed2b79410c0460b35fcec1e87e880ef2","blockSize":4194304,"blocks":["83232c75e544ce5f6d8f1336048469b6ed2b79410c0460b35fcec1e87e880ef2"]},"offset":"33369459"},"index.js":{"size":679,"integrity":{"algorithm":"SHA256","hash":"115e97aadbb49ca09417074de4a808e3351d080097f62bb1d448cf0da6a607cd","blockSize":4194304,"blocks":["115e97aadbb49ca09417074de4a808e3351d080097f62bb1d448cf0da6a607cd"]},"offset":"33369681"}}}}},"serve-static":{"files":{"HISTORY.md":{"size":10537,"integrity":{"algorithm":"SHA256","hash":"a93dbaa07121d81a3b20ef0430835751c7bb4ebec598d7c5757cd918f2b51526","blockSize":4194304,"blocks":["a93dbaa07121d81a3b20ef0430835751c7bb4ebec598d7c5757cd918f2b51526"]},"offset":"33370360"},"LICENSE":{"size":1189,"integrity":{"algorithm":"SHA256","hash":"63b9a188d7d43e64b0558b7115255045b9fe20a5fc3ff483421cb899e7f52bcb","blockSize":4194304,"blocks":["63b9a188d7d43e64b0558b7115255045b9fe20a5fc3ff483421cb899e7f52bcb"]},"offset":"33380897"},"index.js":{"size":4570,"integrity":{"algorithm":"SHA256","hash":"768d6407e86ba974e7b8a0e79625e76a932b1f2503207c87f871fcf98be21b1e","blockSize":4194304,"blocks":["768d6407e86ba974e7b8a0e79625e76a932b1f2503207c87f871fcf98be21b1e"]},"offset":"33382086"},"package.json":{"size":834,"integrity":{"algorithm":"SHA256","hash":"602b41b7d8a26dbec1c5567f4f960f192e7757199a5d770f847ec4b8ffd04836","blockSize":4194304,"blocks":["602b41b7d8a26dbec1c5567f4f960f192e7757199a5d770f847ec4b8ffd04836"]},"offset":"33386656"}}},"set-blocking":{"files":{"LICENSE.txt":{"size":731,"integrity":{"algorithm":"SHA256","hash":"365496ca1f56da40b23c9815fc40fa9005847b2f8f8fd1c1a4929ef25ec8cd1d","blockSize":4194304,"blocks":["365496ca1f56da40b23c9815fc40fa9005847b2f8f8fd1c1a4929ef25ec8cd1d"]},"offset":"33387490"},"index.js":{"size":252,"integrity":{"algorithm":"SHA256","hash":"8b238f1de62bb2a7b35a9e6b0364a64ce0f357cb63251580ff5a25429712e1d1","blockSize":4194304,"blocks":["8b238f1de62bb2a7b35a9e6b0364a64ce0f357cb63251580ff5a25429712e1d1"]},"offset":"33388221"},"package.json":{"size":625,"integrity":{"algorithm":"SHA256","hash":"c979b735f9dbdf502cce0e2ad793f358f54592df7943d329c9c6b365df106e8a","blockSize":4194304,"blocks":["c979b735f9dbdf502cce0e2ad793f358f54592df7943d329c9c6b365df106e8a"]},"offset":"33388473"}}},"setprototypeof":{"files":{"LICENSE":{"size":727,"integrity":{"algorithm":"SHA256","hash":"76d6d1ea0c268da37dd3c961b4fcfb23dee8417fff9e8786d4d44c585b781b69","blockSize":4194304,"blocks":["76d6d1ea0c268da37dd3c961b4fcfb23dee8417fff9e8786d4d44c585b781b69"]},"offset":"33389098"},"index.js":{"size":407,"integrity":{"algorithm":"SHA256","hash":"3e3495ca7ae72a7f0ca459f47dd3d97ae3a48fa4b1a669a31672be778cc97a5f","blockSize":4194304,"blocks":["3e3495ca7ae72a7f0ca459f47dd3d97ae3a48fa4b1a669a31672be778cc97a5f"]},"offset":"33389825"},"package.json":{"size":451,"integrity":{"algorithm":"SHA256","hash":"863acca2f63c8426c264f86ecba74913ad992928590c0a27b9acf9607215f3ca","blockSize":4194304,"blocks":["863acca2f63c8426c264f86ecba74913ad992928590c0a27b9acf9607215f3ca"]},"offset":"33390232"}}},"side-channel":{"files":{".eslintignore":{"size":10,"integrity":{"algorithm":"SHA256","hash":"5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290","blockSize":4194304,"blocks":["5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290"]},"offset":"33390683"},".nycrc":{"size":216,"integrity":{"algorithm":"SHA256","hash":"948366fea3b423a46366326d0bb2e54b08abd1cf0b243678ba6625740c40da5a","blockSize":4194304,"blocks":["948366fea3b423a46366326d0bb2e54b08abd1cf0b243678ba6625740c40da5a"]},"offset":"33390693"},"LICENSE":{"size":1071,"integrity":{"algorithm":"SHA256","hash":"cfc3f455254c0af0655cc3ff46a41ed644b67599f6043346169d285bf2b3cf3b","blockSize":4194304,"blocks":["cfc3f455254c0af0655cc3ff46a41ed644b67599f6043346169d285bf2b3cf3b"]},"offset":"33390909"},"index.js":{"size":3391,"integrity":{"algorithm":"SHA256","hash":"43e8ad3f1f6effb971cbcbbeb78c4c8fe2e8a99e8d5f7794b2e2961e45f90473","blockSize":4194304,"blocks":["43e8ad3f1f6effb971cbcbbeb78c4c8fe2e8a99e8d5f7794b2e2961e45f90473"]},"offset":"33391980"},"package.json":{"size":1155,"integrity":{"algorithm":"SHA256","hash":"12bdc70f87da13d7e2897141f25625761358d95915b4671751da5bd9b66f745c","blockSize":4194304,"blocks":["12bdc70f87da13d7e2897141f25625761358d95915b4671751da5bd9b66f745c"]},"offset":"33395371"},".github":{"files":{"FUNDING.yml":{"size":583,"integrity":{"algorithm":"SHA256","hash":"1bae2dd6cba2f64d3780a4d3136eed2ed80b17888b0f2f169b90b65532ef1a4e","blockSize":4194304,"blocks":["1bae2dd6cba2f64d3780a4d3136eed2ed80b17888b0f2f169b90b65532ef1a4e"]},"offset":"33396526"}}}}},"signal-exit":{"files":{"LICENSE.txt":{"size":748,"integrity":{"algorithm":"SHA256","hash":"e05b1eaf5b5f99b7ad75cd1f38858ff9a311780b97715ead67936d60bf96aa7e","blockSize":4194304,"blocks":["e05b1eaf5b5f99b7ad75cd1f38858ff9a311780b97715ead67936d60bf96aa7e"]},"offset":"33397109"},"index.js":{"size":5708,"integrity":{"algorithm":"SHA256","hash":"7cc6f6a1e14dec79dc23f6afd7caca1319189747144e1a33af77616c21d9e9de","blockSize":4194304,"blocks":["7cc6f6a1e14dec79dc23f6afd7caca1319189747144e1a33af77616c21d9e9de"]},"offset":"33397857"},"package.json":{"size":567,"integrity":{"algorithm":"SHA256","hash":"9f575e41b23ac725fd86ee2e23650e84d687314e592e75f695baf542cf7c8c70","blockSize":4194304,"blocks":["9f575e41b23ac725fd86ee2e23650e84d687314e592e75f695baf542cf7c8c70"]},"offset":"33403565"},"signals.js":{"size":1295,"integrity":{"algorithm":"SHA256","hash":"ae538fdae683d6fa2e14579da06df10fb7a66378cfa50971956fb68c2c86c727","blockSize":4194304,"blocks":["ae538fdae683d6fa2e14579da06df10fb7a66378cfa50971956fb68c2c86c727"]},"offset":"33404132"}}},"simple-concat":{"files":{"LICENSE":{"size":1081,"integrity":{"algorithm":"SHA256","hash":"d4c2065e2b936e62a4eb400efb4576edec9ca1388a9f78aa288e147275e7bc8b","blockSize":4194304,"blocks":["d4c2065e2b936e62a4eb400efb4576edec9ca1388a9f78aa288e147275e7bc8b"]},"offset":"33405427"},"index.js":{"size":392,"integrity":{"algorithm":"SHA256","hash":"fbd2a589ece8138da87d9a5e3d537afbbc32f08582bec0939cd3c494002259a4","blockSize":4194304,"blocks":["fbd2a589ece8138da87d9a5e3d537afbbc32f08582bec0939cd3c494002259a4"]},"offset":"33406508"},"package.json":{"size":817,"integrity":{"algorithm":"SHA256","hash":"a4f9cdf92eb5e9d536a38bf191e7358367414b13999379fe6c1a08e8beccadf5","blockSize":4194304,"blocks":["a4f9cdf92eb5e9d536a38bf191e7358367414b13999379fe6c1a08e8beccadf5"]},"offset":"33406900"}}},"simple-get":{"files":{"LICENSE":{"size":1081,"integrity":{"algorithm":"SHA256","hash":"d4c2065e2b936e62a4eb400efb4576edec9ca1388a9f78aa288e147275e7bc8b","blockSize":4194304,"blocks":["d4c2065e2b936e62a4eb400efb4576edec9ca1388a9f78aa288e147275e7bc8b"]},"offset":"33407717"},"index.js":{"size":4057,"integrity":{"algorithm":"SHA256","hash":"99f995e5d499ad052b9a03a0f1e0d5c24a9705a64d1ac025463ffcbe9522aff6","blockSize":4194304,"blocks":["99f995e5d499ad052b9a03a0f1e0d5c24a9705a64d1ac025463ffcbe9522aff6"]},"offset":"33408798"},"package.json":{"size":1062,"integrity":{"algorithm":"SHA256","hash":"b08d05f34e2515db63517e8ee105bd1bc7c208f15e398a53817726a0a98e4d21","blockSize":4194304,"blocks":["b08d05f34e2515db63517e8ee105bd1bc7c208f15e398a53817726a0a98e4d21"]},"offset":"33412855"},".github":{"files":{"dependabot.yml":{"size":300,"integrity":{"algorithm":"SHA256","hash":"c4982ac89f48fbd97008135057e2768adcdc8bb1581197e3dc2ba87ded910277","blockSize":4194304,"blocks":["c4982ac89f48fbd97008135057e2768adcdc8bb1581197e3dc2ba87ded910277"]},"offset":"33413917"},"workflows":{"files":{"ci.yml":{"size":483,"integrity":{"algorithm":"SHA256","hash":"81797e1b59d82968b131bf5d086fb900a6a0e9b7e733048cec1d630d358156ec","blockSize":4194304,"blocks":["81797e1b59d82968b131bf5d086fb900a6a0e9b7e733048cec1d630d358156ec"]},"offset":"33414217"}}}}},"node_modules":{"files":{"decompress-response":{"files":{"index.js":{"size":1320,"integrity":{"algorithm":"SHA256","hash":"682e0812a9f4f7e4cee568a94f3b51ba0d9e5aec3fb0ec3042d9d5444cf892cf","blockSize":4194304,"blocks":["682e0812a9f4f7e4cee568a94f3b51ba0d9e5aec3fb0ec3042d9d5444cf892cf"]},"offset":"43833747"},"license":{"size":1117,"integrity":{"algorithm":"SHA256","hash":"5c932d88256b4ab958f64a856fa48e8bd1f55bc1d96b8149c65689e0c61789d3","blockSize":4194304,"blocks":["5c932d88256b4ab958f64a856fa48e8bd1f55bc1d96b8149c65689e0c61789d3"]},"offset":"43835067"},"package.json":{"size":685,"integrity":{"algorithm":"SHA256","hash":"42a8b364f4a478088678dae4be5a5e3e3af65b17293d100e8f060d4c4fc18558","blockSize":4194304,"blocks":["42a8b364f4a478088678dae4be5a5e3e3af65b17293d100e8f060d4c4fc18558"]},"offset":"43836184"}}},"mimic-response":{"files":{"index.js":{"size":1581,"integrity":{"algorithm":"SHA256","hash":"5fe21e8b7a51ea8f6bdddc198ec62b523033c12c60c2f95fef6446779200daf0","blockSize":4194304,"blocks":["5fe21e8b7a51ea8f6bdddc198ec62b523033c12c60c2f95fef6446779200daf0"]},"offset":"43836869"},"license":{"size":1117,"integrity":{"algorithm":"SHA256","hash":"5c932d88256b4ab958f64a856fa48e8bd1f55bc1d96b8149c65689e0c61789d3","blockSize":4194304,"blocks":["5c932d88256b4ab958f64a856fa48e8bd1f55bc1d96b8149c65689e0c61789d3"]},"offset":"43838450"},"package.json":{"size":652,"integrity":{"algorithm":"SHA256","hash":"7aead709938ed3e1507fcb0cff661cb1780072d2d5418cda73e3df660f0114c5","blockSize":4194304,"blocks":["7aead709938ed3e1507fcb0cff661cb1780072d2d5418cda73e3df660f0114c5"]},"offset":"43839567"}}}}}}},"smart-buffer":{"files":{".prettierrc.yaml":{"size":84,"integrity":{"algorithm":"SHA256","hash":"f97e9236be3e15c38aa9fb1df9b706f80cd48eaf9bf90563604427a2b76becaf","blockSize":4194304,"blocks":["f97e9236be3e15c38aa9fb1df9b706f80cd48eaf9bf90563604427a2b76becaf"]},"offset":"33414700"},"LICENSE":{"size":1087,"integrity":{"algorithm":"SHA256","hash":"c46e2c333e1c9e6fcfd130cf91b8e54bf67b60fabbc04996f7e199b990353ff3","blockSize":4194304,"blocks":["c46e2c333e1c9e6fcfd130cf91b8e54bf67b60fabbc04996f7e199b990353ff3"]},"offset":"33414784"},"package.json":{"size":996,"integrity":{"algorithm":"SHA256","hash":"3b3e517c9e1a00c6941df62fa952890cc32f1e6d5e92f781ec09749e0a6200a9","blockSize":4194304,"blocks":["3b3e517c9e1a00c6941df62fa952890cc32f1e6d5e92f781ec09749e0a6200a9"]},"offset":"33415871"},"docs":{"files":{"README_v3.md":{"size":12570,"integrity":{"algorithm":"SHA256","hash":"13d04e06d601538ff297540dbf65f4762cfe89523bab18f488ab9fc08863a9b5","blockSize":4194304,"blocks":["13d04e06d601538ff297540dbf65f4762cfe89523bab18f488ab9fc08863a9b5"]},"offset":"33416867"},"ROADMAP.md":{"size":0,"integrity":{"algorithm":"SHA256","hash":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","blockSize":4194304,"blocks":[]},"offset":"33429437"}}},"build":{"files":{"smartbuffer.js":{"size":44500,"integrity":{"algorithm":"SHA256","hash":"6a73858a0aa6f7ac078d8156187ef97a713e44d52afccf6679a0a032539be0cc","blockSize":4194304,"blocks":["6a73858a0aa6f7ac078d8156187ef97a713e44d52afccf6679a0a032539be0cc"]},"offset":"33429437"},"utils.js":{"size":4273,"integrity":{"algorithm":"SHA256","hash":"451b2e82d359f3d8782be4830bd5d9df895434adbbbd911fbeb27e64fc59167d","blockSize":4194304,"blocks":["451b2e82d359f3d8782be4830bd5d9df895434adbbbd911fbeb27e64fc59167d"]},"offset":"33473937"}}}}},"socks":{"files":{".eslintrc.cjs":{"size":207,"integrity":{"algorithm":"SHA256","hash":"e0c3ec930eb941a456791fd13d361ec58e1891927e448fd599af95bf7f552a85","blockSize":4194304,"blocks":["e0c3ec930eb941a456791fd13d361ec58e1891927e448fd599af95bf7f552a85"]},"offset":"33478210"},".prettierrc.yaml":{"size":124,"integrity":{"algorithm":"SHA256","hash":"f7eb231e593c200c8c818bf92043efccf36fe501347e2401018b6f49331363fa","blockSize":4194304,"blocks":["f7eb231e593c200c8c818bf92043efccf36fe501347e2401018b6f49331363fa"]},"offset":"33478417"},"LICENSE":{"size":1082,"integrity":{"algorithm":"SHA256","hash":"4f4f28866154c8d758241a64296e8790d45d7d912ff7b029930778c06d8f2a72","blockSize":4194304,"blocks":["4f4f28866154c8d758241a64296e8790d45d7d912ff7b029930778c06d8f2a72"]},"offset":"33478541"},"package.json":{"size":986,"integrity":{"algorithm":"SHA256","hash":"ef797b61d06ea21da98155cdb21f1e9feb32d018d2c2ff7dd671fe2611c7ad7d","blockSize":4194304,"blocks":["ef797b61d06ea21da98155cdb21f1e9feb32d018d2c2ff7dd671fe2611c7ad7d"]},"offset":"33479623"},"docs":{"files":{"index.md":{"size":129,"integrity":{"algorithm":"SHA256","hash":"a7ab0d44389bd05c9c918aae8a573b13faaff412a6a652ee68d7c308d0e11ffd","blockSize":4194304,"blocks":["a7ab0d44389bd05c9c918aae8a573b13faaff412a6a652ee68d7c308d0e11ffd"]},"offset":"33480609"},"migratingFromV1.md":{"size":2629,"integrity":{"algorithm":"SHA256","hash":"4cf23d36f5e98ec2dcd285fdbdee1db8b177c1dcac386607b57087ca14dc3ebd","blockSize":4194304,"blocks":["4cf23d36f5e98ec2dcd285fdbdee1db8b177c1dcac386607b57087ca14dc3ebd"]},"offset":"33480738"},"examples":{"files":{"index.md":{"size":354,"integrity":{"algorithm":"SHA256","hash":"bb434d3247f08b691954f1414b172cb299765ab4c7f843e8204a539ff4e63ef9","blockSize":4194304,"blocks":["bb434d3247f08b691954f1414b172cb299765ab4c7f843e8204a539ff4e63ef9"]},"offset":"33483367"},"typescript":{"files":{"associateExample.md":{"size":3337,"integrity":{"algorithm":"SHA256","hash":"97460cc4fbbcd1ac80a28386fa29a6ba9edaf828c010f3159694d9ec66caecb5","blockSize":4194304,"blocks":["97460cc4fbbcd1ac80a28386fa29a6ba9edaf828c010f3159694d9ec66caecb5"]},"offset":"33483721"},"bindExample.md":{"size":2838,"integrity":{"algorithm":"SHA256","hash":"6322be1cc9217d2a83b95c9daaea4f3cc1058b2c44ede17d2717b8c9a01816dc","blockSize":4194304,"blocks":["6322be1cc9217d2a83b95c9daaea4f3cc1058b2c44ede17d2717b8c9a01816dc"]},"offset":"33487058"},"connectExample.md":{"size":7738,"integrity":{"algorithm":"SHA256","hash":"436e5161a75d2734675818f560dc03082a6afe8fd195a09120038a0c4f6290c0","blockSize":4194304,"blocks":["436e5161a75d2734675818f560dc03082a6afe8fd195a09120038a0c4f6290c0"]},"offset":"33489896"}}},"javascript":{"files":{"associateExample.md":{"size":3274,"integrity":{"algorithm":"SHA256","hash":"975b87e1d48d33a33f146ff341aa25191e40d3529d4fa653fbcdfe2212eba612","blockSize":4194304,"blocks":["975b87e1d48d33a33f146ff341aa25191e40d3529d4fa653fbcdfe2212eba612"]},"offset":"33497634"},"bindExample.md":{"size":2772,"integrity":{"algorithm":"SHA256","hash":"5adb174e1eb0cbdd5406f14635337f34a7da6deedf65c1cea484a302b2562631","blockSize":4194304,"blocks":["5adb174e1eb0cbdd5406f14635337f34a7da6deedf65c1cea484a302b2562631"]},"offset":"33500908"},"connectExample.md":{"size":7567,"integrity":{"algorithm":"SHA256","hash":"b426332b7da73e8cefaee0d30f4b435e763b44b2affaec7edd167fc4b04279c7","blockSize":4194304,"blocks":["b426332b7da73e8cefaee0d30f4b435e763b44b2affaec7edd167fc4b04279c7"]},"offset":"33503680"}}}}}}},"build":{"files":{"index.js":{"size":846,"integrity":{"algorithm":"SHA256","hash":"c82822bfe17665a9de990c99e1aea5d94874bcbc072f95b42c617bab3d097df7","blockSize":4194304,"blocks":["c82822bfe17665a9de990c99e1aea5d94874bcbc072f95b42c617bab3d097df7"]},"offset":"33511247"},"common":{"files":{"constants.js":{"size":7443,"integrity":{"algorithm":"SHA256","hash":"dff2fab7745c01ba69a14031297c67bf11ccb18cd1d7fa00c09c5fb58538d77a","blockSize":4194304,"blocks":["dff2fab7745c01ba69a14031297c67bf11ccb18cd1d7fa00c09c5fb58538d77a"]},"offset":"33512093"},"helpers.js":{"size":5506,"integrity":{"algorithm":"SHA256","hash":"73870b5ff3a6ff63aa49fc6780f9eedc035de61ce66e0dcb8a62bdf2ceb81c4d","blockSize":4194304,"blocks":["73870b5ff3a6ff63aa49fc6780f9eedc035de61ce66e0dcb8a62bdf2ceb81c4d"]},"offset":"33519536"},"receivebuffer.js":{"size":1549,"integrity":{"algorithm":"SHA256","hash":"49feb670a5499e20899d892740f80d1e3ef24deb64888a21dcabf6fe7419b4e8","blockSize":4194304,"blocks":["49feb670a5499e20899d892740f80d1e3ef24deb64888a21dcabf6fe7419b4e8"]},"offset":"33525042"},"util.js":{"size":698,"integrity":{"algorithm":"SHA256","hash":"917aa278ecf8a4eb0e90e448eac98dd75eb9a4c985de0d7a04e04407e8caf8f6","blockSize":4194304,"blocks":["917aa278ecf8a4eb0e90e448eac98dd75eb9a4c985de0d7a04e04407e8caf8f6"]},"offset":"33526591"}}},"client":{"files":{"socksclient.js":{"size":35455,"integrity":{"algorithm":"SHA256","hash":"facc0e7b4190987569290812727ea2ab94464df2decd896c275e1aafc6bab725","blockSize":4194304,"blocks":["facc0e7b4190987569290812727ea2ab94464df2decd896c275e1aafc6bab725"]},"offset":"33527289"}}}}}}},"sprintf-js":{"files":{"LICENSE":{"size":1518,"integrity":{"algorithm":"SHA256","hash":"a4cdda44b5adea4731d53dcae78fb5124f8fd853e994f01e25d8c33a7daf818b","blockSize":4194304,"blocks":["a4cdda44b5adea4731d53dcae78fb5124f8fd853e994f01e25d8c33a7daf818b"]},"offset":"33562744"},"bower.json":{"size":439,"integrity":{"algorithm":"SHA256","hash":"8b3e0492f6fe368ec15547f409effc86dd933509e0e6fd49135ab6809b1ebc83","blockSize":4194304,"blocks":["8b3e0492f6fe368ec15547f409effc86dd933509e0e6fd49135ab6809b1ebc83"]},"offset":"33564262"},"gruntfile.js":{"size":970,"integrity":{"algorithm":"SHA256","hash":"9ec2accc7e5e32d0ae9a3378107eba05c30ef648eb66e388236204c3f87d9587","blockSize":4194304,"blocks":["9ec2accc7e5e32d0ae9a3378107eba05c30ef648eb66e388236204c3f87d9587"]},"offset":"33564701"},"package.json":{"size":490,"integrity":{"algorithm":"SHA256","hash":"e14c3116baf456b22cc17fdb6733de07a9e38e07a11f5771b14fa46321655089","blockSize":4194304,"blocks":["e14c3116baf456b22cc17fdb6733de07a9e38e07a11f5771b14fa46321655089"]},"offset":"33565671"},"src":{"files":{"angular-sprintf.js":{"size":490,"integrity":{"algorithm":"SHA256","hash":"0d3fe03f4a50d8f3247f4a2938e53638e11975189fa031cb21289bbac7b9753a","blockSize":4194304,"blocks":["0d3fe03f4a50d8f3247f4a2938e53638e11975189fa031cb21289bbac7b9753a"]},"offset":"33566161"},"sprintf.js":{"size":8112,"integrity":{"algorithm":"SHA256","hash":"9904b0d448280bfdfcb0329bdac995883033597727404f9c058d051d9174b7c7","blockSize":4194304,"blocks":["9904b0d448280bfdfcb0329bdac995883033597727404f9c058d051d9174b7c7"]},"offset":"33566651"}}},"dist":{"files":{"angular-sprintf.min.js":{"size":449,"integrity":{"algorithm":"SHA256","hash":"c3d132c5d7490e900008f71ec5b206bd8f685a4483065bd451ef8390b8ff7fda","blockSize":4194304,"blocks":["c3d132c5d7490e900008f71ec5b206bd8f685a4483065bd451ef8390b8ff7fda"]},"offset":"33574763"},"sprintf.min.js":{"size":3169,"integrity":{"algorithm":"SHA256","hash":"e127ce7c8b5c2557881b9953dd9c659bf7ac18248a1146433c48137d2e0327d0","blockSize":4194304,"blocks":["e127ce7c8b5c2557881b9953dd9c659bf7ac18248a1146433c48137d2e0327d0"]},"offset":"33575212"}}},"demo":{"files":{"angular.html":{"size":690,"integrity":{"algorithm":"SHA256","hash":"bd0e5eb64136fd2c4572aa48217925bc04527ee62967e9d88c6dac1e86791019","blockSize":4194304,"blocks":["bd0e5eb64136fd2c4572aa48217925bc04527ee62967e9d88c6dac1e86791019"]},"offset":"33578381"}}}}},"sqlite3":{"files":{"LICENSE":{"size":1460,"integrity":{"algorithm":"SHA256","hash":"7686f81e580cd6774f609a2d8a41b2cebdf79bc30e6b46c3efff5a656158981c","blockSize":4194304,"blocks":["7686f81e580cd6774f609a2d8a41b2cebdf79bc30e6b46c3efff5a656158981c"]},"offset":"33579071"},"package.json":{"size":1380,"integrity":{"algorithm":"SHA256","hash":"7eea31d2fdd58bf589f4f114242f1efa400540d981bf928b973537ec741320d5","blockSize":4194304,"blocks":["7eea31d2fdd58bf589f4f114242f1efa400540d981bf928b973537ec741320d5"]},"offset":"33580531"},"src":{"files":{"async.h":{"size":1952,"integrity":{"algorithm":"SHA256","hash":"b6e86bf43d74c8ee2c2f57eb1947be6ce5d8c258c4866609571ed6c97b58b53c","blockSize":4194304,"blocks":["b6e86bf43d74c8ee2c2f57eb1947be6ce5d8c258c4866609571ed6c97b58b53c"]},"offset":"33581911"},"backup.h":{"size":7058,"integrity":{"algorithm":"SHA256","hash":"d3956cdbb650e1ecff8c94fe4e8645f80e10088156d409703c19f186a9c41aa8","blockSize":4194304,"blocks":["d3956cdbb650e1ecff8c94fe4e8645f80e10088156d409703c19f186a9c41aa8"]},"offset":"33583863"},"database.h":{"size":6028,"integrity":{"algorithm":"SHA256","hash":"8c5bcd084dddab2f2994b6cddc9b69a8f78a1034588b765e7bd859f27868fe43","blockSize":4194304,"blocks":["8c5bcd084dddab2f2994b6cddc9b69a8f78a1034588b765e7bd859f27868fe43"]},"offset":"33590921"},"gcc-preinclude.h":{"size":778,"integrity":{"algorithm":"SHA256","hash":"910d8f4668c0c02e75ca3dc19d0ee078213b7bee1a63c19235baa4a169e46752","blockSize":4194304,"blocks":["910d8f4668c0c02e75ca3dc19d0ee078213b7bee1a63c19235baa4a169e46752"]},"offset":"33596949"},"macros.h":{"size":12006,"integrity":{"algorithm":"SHA256","hash":"6e00501f6950086c04e7ad2de25684b2fff444193ad0aa3adea882d1cc9d72c5","blockSize":4194304,"blocks":["6e00501f6950086c04e7ad2de25684b2fff444193ad0aa3adea882d1cc9d72c5"]},"offset":"33597727"},"statement.h":{"size":6644,"integrity":{"algorithm":"SHA256","hash":"2c99d9cef21876db64b610dd9baba8de1f7c94028d6d1c463eb3db213745b3bf","blockSize":4194304,"blocks":["2c99d9cef21876db64b610dd9baba8de1f7c94028d6d1c463eb3db213745b3bf"]},"offset":"33609733"},"threading.h":{"size":388,"integrity":{"algorithm":"SHA256","hash":"e0ab4f798bccb877548b0ab0f3d98c051b36cde240fdf424c70ace7daf0ffd36","blockSize":4194304,"blocks":["e0ab4f798bccb877548b0ab0f3d98c051b36cde240fdf424c70ace7daf0ffd36"]},"offset":"33616377"}}},"lib":{"files":{"sqlite3-binding.js":{"size":241,"integrity":{"algorithm":"SHA256","hash":"049b7b1b10417274be6c3e6a9518ac364729354435298d70abf834c35e8f3bf3","blockSize":4194304,"blocks":["049b7b1b10417274be6c3e6a9518ac364729354435298d70abf834c35e8f3bf3"]},"offset":"33616765"},"sqlite3.js":{"size":6365,"integrity":{"algorithm":"SHA256","hash":"8d6b400ae7f69a80d0cdd37a968d7b9a913661fa53475e5b8de49dda21684973","blockSize":4194304,"blocks":["8d6b400ae7f69a80d0cdd37a968d7b9a913661fa53475e5b8de49dda21684973"]},"offset":"33617006"},"trace.js":{"size":1357,"integrity":{"algorithm":"SHA256","hash":"d06caec6136120c6fb7ee3681b1ca949e8b634e747ea8d3080c90f35aeb7728f","blockSize":4194304,"blocks":["d06caec6136120c6fb7ee3681b1ca949e8b634e747ea8d3080c90f35aeb7728f"]},"offset":"33623371"},"binding":{"files":{"napi-v6-win32-unknown-ia32":{"files":{"node_sqlite3.node":{"size":1497088,"integrity":{"algorithm":"SHA256","hash":"d67cdb767a8934ce3732009be58803a1cdbf085fef7d3a5bddac8d6bbc5e2a65","blockSize":4194304,"blocks":["d67cdb767a8934ce3732009be58803a1cdbf085fef7d3a5bddac8d6bbc5e2a65"]},"offset":"33624728"}}}}}}},"deps":{"files":{"common-sqlite.gypi":{"size":1322,"integrity":{"algorithm":"SHA256","hash":"e7883fa7a298f6550f3ee2799efb0a852d7c5bb54329a78ce9201ec7c9fe56f0","blockSize":4194304,"blocks":["e7883fa7a298f6550f3ee2799efb0a852d7c5bb54329a78ce9201ec7c9fe56f0"]},"offset":"35121816"},"extract.js":{"size":224,"integrity":{"algorithm":"SHA256","hash":"5be353d29c0fabea29cfd34448c196da9506009c0b20fde55e01d4191941dd74","blockSize":4194304,"blocks":["5be353d29c0fabea29cfd34448c196da9506009c0b20fde55e01d4191941dd74"]},"offset":"35123138"},"sqlite-autoconf-3390300.tar.gz":{"size":3064970,"integrity":{"algorithm":"SHA256","hash":"7868fb3082be3f2cf4491c6fba6de2bddcbc293a35fefb0624ee3c13f01422b9","blockSize":4194304,"blocks":["7868fb3082be3f2cf4491c6fba6de2bddcbc293a35fefb0624ee3c13f01422b9"]},"offset":"35123362"},"sqlite3.gyp":{"size":3021,"integrity":{"algorithm":"SHA256","hash":"8793f62b1133892ba376d18a15f552ef12b1e016f7e5df32ffb7279b760c11bd","blockSize":4194304,"blocks":["8793f62b1133892ba376d18a15f552ef12b1e016f7e5df32ffb7279b760c11bd"]},"offset":"38188332"}}},"node_modules":{"files":{"@npmcli":{"files":{"fs":{"files":{"LICENSE.md":{"size":798,"integrity":{"algorithm":"SHA256","hash":"27d998b503b18cdb16c49e93da04069a99ba8a1d7e18d67146de8e242f9a6d21","blockSize":4194304,"blocks":["27d998b503b18cdb16c49e93da04069a99ba8a1d7e18d67146de8e242f9a6d21"]},"offset":"43840219"},"package.json":{"size":414,"integrity":{"algorithm":"SHA256","hash":"b3200cf6f0a5b7a63bde796a33e226e3cefaee5c0ab3fe7347d37fe812f0af02","blockSize":4194304,"blocks":["b3200cf6f0a5b7a63bde796a33e226e3cefaee5c0ab3fe7347d37fe812f0af02"]},"offset":"43841017"},"lib":{"files":{"copy-file.js":{"size":607,"integrity":{"algorithm":"SHA256","hash":"6921d0f93eff4867a419c33ba560c736bb2461bd03ff2fa1da6f1a07031dc939","blockSize":4194304,"blocks":["6921d0f93eff4867a419c33ba560c736bb2461bd03ff2fa1da6f1a07031dc939"]},"offset":"43841431"},"errors.js":{"size":3396,"integrity":{"algorithm":"SHA256","hash":"a7d09952191cde9205664ff85cd97edf0b765ac0903105039c6c735249269861","blockSize":4194304,"blocks":["a7d09952191cde9205664ff85cd97edf0b765ac0903105039c6c735249269861"]},"offset":"43842038"},"fs.js":{"size":377,"integrity":{"algorithm":"SHA256","hash":"323e4a503c03172dc06c37aedf66884ba49bbdb5fd31626f0c39407b3b6876c8","blockSize":4194304,"blocks":["323e4a503c03172dc06c37aedf66884ba49bbdb5fd31626f0c39407b3b6876c8"]},"offset":"43845434"},"index.js":{"size":310,"integrity":{"algorithm":"SHA256","hash":"95375c6eca4e924139845e38db8c5a886ce119baea4aa802c7d7228e162b66df","blockSize":4194304,"blocks":["95375c6eca4e924139845e38db8c5a886ce119baea4aa802c7d7228e162b66df"]},"offset":"43845811"},"mkdtemp.js":{"size":891,"integrity":{"algorithm":"SHA256","hash":"545613f249fb33b0221053001e68c3a07562a24aeeb35d7d7005add49a314dc2","blockSize":4194304,"blocks":["545613f249fb33b0221053001e68c3a07562a24aeeb35d7d7005add49a314dc2"]},"offset":"43846121"},"with-temp-dir.js":{"size":1009,"integrity":{"algorithm":"SHA256","hash":"136d06d81a3c5b7dfccbe731d574b675b5fa57a1523bb169bde5727fe6e8b107","blockSize":4194304,"blocks":["136d06d81a3c5b7dfccbe731d574b675b5fa57a1523bb169bde5727fe6e8b107"]},"offset":"43847012"},"write-file.js":{"size":507,"integrity":{"algorithm":"SHA256","hash":"2642ef087e8d2eb03f4bdc63d96363750f78fc79edaf554d5074747d3da41040","blockSize":4194304,"blocks":["2642ef087e8d2eb03f4bdc63d96363750f78fc79edaf554d5074747d3da41040"]},"offset":"43848021"},"rm":{"files":{"index.js":{"size":695,"integrity":{"algorithm":"SHA256","hash":"89b5809b322d285b9d7a6fc56bfa2a39711ba5301ef0160c2beb8a4f361940ca","blockSize":4194304,"blocks":["89b5809b322d285b9d7a6fc56bfa2a39711ba5301ef0160c2beb8a4f361940ca"]},"offset":"43848528"},"polyfill.js":{"size":6514,"integrity":{"algorithm":"SHA256","hash":"17bcb88b0a3443e9b5111e075bd480f5e1022b71de3dec27b5fce2ff6ce62fef","blockSize":4194304,"blocks":["17bcb88b0a3443e9b5111e075bd480f5e1022b71de3dec27b5fce2ff6ce62fef"]},"offset":"43849223"}}},"mkdir":{"files":{"index.js":{"size":981,"integrity":{"algorithm":"SHA256","hash":"add63ec8b9cbf05480285d519c9030df9d9b5d9cc97262ca5839c5f5d863283e","blockSize":4194304,"blocks":["add63ec8b9cbf05480285d519c9030df9d9b5d9cc97262ca5839c5f5d863283e"]},"offset":"43855737"},"polyfill.js":{"size":2437,"integrity":{"algorithm":"SHA256","hash":"8d553aa014e333dc2cd4f06e6f68672dae309a58ac7422108b880f8cbb4113b3","blockSize":4194304,"blocks":["8d553aa014e333dc2cd4f06e6f68672dae309a58ac7422108b880f8cbb4113b3"]},"offset":"43856718"}}},"cp":{"files":{"LICENSE":{"size":1084,"integrity":{"algorithm":"SHA256","hash":"1e76029602ae9b21cc4e612db2496d92febed882ba13ba745f8b3309e85f9d39","blockSize":4194304,"blocks":["1e76029602ae9b21cc4e612db2496d92febed882ba13ba745f8b3309e85f9d39"]},"offset":"43859155"},"index.js":{"size":692,"integrity":{"algorithm":"SHA256","hash":"51b95449cef8ca6f9a64edd7f15cc877eb0c4bd57592328a50cc2840b207110a","blockSize":4194304,"blocks":["51b95449cef8ca6f9a64edd7f15cc877eb0c4bd57592328a50cc2840b207110a"]},"offset":"43860239"},"polyfill.js":{"size":12239,"integrity":{"algorithm":"SHA256","hash":"cb1b0129db896aa20377f895639a3b9ae1abd8cd65221b276713b46e1fd8d6fc","blockSize":4194304,"blocks":["cb1b0129db896aa20377f895639a3b9ae1abd8cd65221b276713b46e1fd8d6fc"]},"offset":"43860931"}}},"common":{"files":{"get-options.js":{"size":528,"integrity":{"algorithm":"SHA256","hash":"9effc9eb07753c26041c78a42338687c9dbc3a2fe7580256277d1e6f9b6ce4e1","blockSize":4194304,"blocks":["9effc9eb07753c26041c78a42338687c9dbc3a2fe7580256277d1e6f9b6ce4e1"]},"offset":"43873170"},"node.js":{"size":181,"integrity":{"algorithm":"SHA256","hash":"3682e75ccd114a154ec490db83cb92e4e81a7001f98551305ce8e1f78cef3cbd","blockSize":4194304,"blocks":["3682e75ccd114a154ec490db83cb92e4e81a7001f98551305ce8e1f78cef3cbd"]},"offset":"43873698"},"owner.js":{"size":2188,"integrity":{"algorithm":"SHA256","hash":"73c22a1997a779838a13162f473a1eafdba465ee1515f61a2a10d122f4c35f2e","blockSize":4194304,"blocks":["73c22a1997a779838a13162f473a1eafdba465ee1515f61a2a10d122f4c35f2e"]},"offset":"43873879"},"file-url-to-path":{"files":{"index.js":{"size":450,"integrity":{"algorithm":"SHA256","hash":"f92520525c626ab49eeef5ba8663906187fc90790419e1d0aa9298d709faf682","blockSize":4194304,"blocks":["f92520525c626ab49eeef5ba8663906187fc90790419e1d0aa9298d709faf682"]},"offset":"43876067"},"polyfill.js":{"size":3137,"integrity":{"algorithm":"SHA256","hash":"214657f823570cf213b451ba04d6d87aab9fd3ce823b50529c04e45f58b1de87","blockSize":4194304,"blocks":["214657f823570cf213b451ba04d6d87aab9fd3ce823b50529c04e45f58b1de87"]},"offset":"43876517"}}}}}}}}},"move-file":{"files":{"LICENSE.md":{"size":1141,"integrity":{"algorithm":"SHA256","hash":"1c0cd70d6ba8cb9f35cebbf1fe36922a2575a22d5e119bfa126d279807f0a9ab","blockSize":4194304,"blocks":["1c0cd70d6ba8cb9f35cebbf1fe36922a2575a22d5e119bfa126d279807f0a9ab"]},"offset":"43879654"},"index.js":{"size":4630,"integrity":{"algorithm":"SHA256","hash":"ad86f552221ca7c679142fb57bdf02dba7cfa6a3808ccbf12d32e14852b3799a","blockSize":4194304,"blocks":["ad86f552221ca7c679142fb57bdf02dba7cfa6a3808ccbf12d32e14852b3799a"]},"offset":"43880795"},"package.json":{"size":488,"integrity":{"algorithm":"SHA256","hash":"9ca30c1bc1545034566400aa50535bda2a302c97a5e4268fcb37579da08f7b7e","blockSize":4194304,"blocks":["9ca30c1bc1545034566400aa50535bda2a302c97a5e4268fcb37579da08f7b7e"]},"offset":"43885425"}}}}},"cacache":{"files":{"LICENSE.md":{"size":755,"integrity":{"algorithm":"SHA256","hash":"720836c9bdad386485a492ab41fe08007ecf85ca278ddd8f9333494dcac4949d","blockSize":4194304,"blocks":["720836c9bdad386485a492ab41fe08007ecf85ca278ddd8f9333494dcac4949d"]},"offset":"43885913"},"get.js":{"size":6225,"integrity":{"algorithm":"SHA256","hash":"dbe08a173cb1fea0d80898076b14b9e050feae7d49507fc1102b01cb514b5458","blockSize":4194304,"blocks":["dbe08a173cb1fea0d80898076b14b9e050feae7d49507fc1102b01cb514b5458"]},"offset":"43886668"},"index.js":{"size":1414,"integrity":{"algorithm":"SHA256","hash":"d45220cce3c02786dc08746a70b0e8d106dc47173154774b3cfae9d3952f5c5f","blockSize":4194304,"blocks":["d45220cce3c02786dc08746a70b0e8d106dc47173154774b3cfae9d3952f5c5f"]},"offset":"43892893"},"ls.js":{"size":123,"integrity":{"algorithm":"SHA256","hash":"d7d2305cb9f22252790ea68d64c981e5ad04c674e0ce1de61a9d4e4c69828bde","blockSize":4194304,"blocks":["d7d2305cb9f22252790ea68d64c981e5ad04c674e0ce1de61a9d4e4c69828bde"]},"offset":"43894307"},"package.json":{"size":1170,"integrity":{"algorithm":"SHA256","hash":"031f00d0135a45384af587eb3d831d156a7e398510c70fe02d74e747480cfb9e","blockSize":4194304,"blocks":["031f00d0135a45384af587eb3d831d156a7e398510c70fe02d74e747480cfb9e"]},"offset":"43894430"},"put.js":{"size":2013,"integrity":{"algorithm":"SHA256","hash":"e67cb932afaf506c2066abfe36aa12f0c9c49c7cb38e658a0a136bdc76c8acb5","blockSize":4194304,"blocks":["e67cb932afaf506c2066abfe36aa12f0c9c49c7cb38e658a0a136bdc76c8acb5"]},"offset":"43895600"},"rm.js":{"size":676,"integrity":{"algorithm":"SHA256","hash":"ad3efa4a1587d6843e99e55683401e23f0db25e81bce31c7f1ce462e9475f7b9","blockSize":4194304,"blocks":["ad3efa4a1587d6843e99e55683401e23f0db25e81bce31c7f1ce462e9475f7b9"]},"offset":"43897613"},"verify.js":{"size":55,"integrity":{"algorithm":"SHA256","hash":"683ea2a307b1786b5b1ce6793c6e42124e40003252678f0282f077b952be94f6","blockSize":4194304,"blocks":["683ea2a307b1786b5b1ce6793c6e42124e40003252678f0282f077b952be94f6"]},"offset":"43898289"},"lib":{"files":{"entry-index.js":{"size":11029,"integrity":{"algorithm":"SHA256","hash":"df82d74bd96bea0d6c54cc773e8a5eba4516181205a81fcceb1d9613cf91d15b","blockSize":4194304,"blocks":["df82d74bd96bea0d6c54cc773e8a5eba4516181205a81fcceb1d9613cf91d15b"]},"offset":"43898344"},"memoization.js":{"size":1469,"integrity":{"algorithm":"SHA256","hash":"2e95c0051772164526a686b54ae442cc64ff659156c371fd4b487ce221999530","blockSize":4194304,"blocks":["2e95c0051772164526a686b54ae442cc64ff659156c371fd4b487ce221999530"]},"offset":"43909373"},"verify.js":{"size":7936,"integrity":{"algorithm":"SHA256","hash":"714eda9228124537cd5ae641c99d99632f97f743e9de5564632a5932e41e97e8","blockSize":4194304,"blocks":["714eda9228124537cd5ae641c99d99632f97f743e9de5564632a5932e41e97e8"]},"offset":"43910842"},"util":{"files":{"disposer.js":{"size":798,"integrity":{"algorithm":"SHA256","hash":"4b1e66df907b009a7d74cf8ec5ed3be34e32cf5417570793605e6d7301af1cd9","blockSize":4194304,"blocks":["4b1e66df907b009a7d74cf8ec5ed3be34e32cf5417570793605e6d7301af1cd9"]},"offset":"43918778"},"fix-owner.js":{"size":3443,"integrity":{"algorithm":"SHA256","hash":"a6d75b24b6d5b37ac4384fa1e30c6cb031a7b109527d571782fd76a2e7db8c69","blockSize":4194304,"blocks":["a6d75b24b6d5b37ac4384fa1e30c6cb031a7b109527d571782fd76a2e7db8c69"]},"offset":"43919576"},"hash-to-segments.js":{"size":143,"integrity":{"algorithm":"SHA256","hash":"ed10c878cb3c2b8570a32954b52da3c49539549f64e36b3ce3ab38d7e524bf19","blockSize":4194304,"blocks":["ed10c878cb3c2b8570a32954b52da3c49539549f64e36b3ce3ab38d7e524bf19"]},"offset":"43923019"},"move-file.js":{"size":2385,"integrity":{"algorithm":"SHA256","hash":"a7ac6a72c33e80c24b8eaf5e6a9eef8ef8bb58f1442d70593c53315f1c2a0b23","blockSize":4194304,"blocks":["a7ac6a72c33e80c24b8eaf5e6a9eef8ef8bb58f1442d70593c53315f1c2a0b23"]},"offset":"43923162"},"tmp.js":{"size":839,"integrity":{"algorithm":"SHA256","hash":"85df9d0fee6e55e59894df715032d809b2a3068926c59c2112ea53a85de02c8a","blockSize":4194304,"blocks":["85df9d0fee6e55e59894df715032d809b2a3068926c59c2112ea53a85de02c8a"]},"offset":"43925547"}}},"content":{"files":{"path.js":{"size":737,"integrity":{"algorithm":"SHA256","hash":"7ec9682ee3472435d866bdd35d18e2d570ffe98621bc230f30d31443bd04d8f7","blockSize":4194304,"blocks":["7ec9682ee3472435d866bdd35d18e2d570ffe98621bc230f30d31443bd04d8f7"]},"offset":"43926386"},"read.js":{"size":6381,"integrity":{"algorithm":"SHA256","hash":"571fdc51e48722b962cbf634a888d116427f254d0696fdf3f88198741d6da885","blockSize":4194304,"blocks":["571fdc51e48722b962cbf634a888d116427f254d0696fdf3f88198741d6da885"]},"offset":"43927123"},"rm.js":{"size":499,"integrity":{"algorithm":"SHA256","hash":"912cff1f69d2f1e83eed339fc12566f156fdb3e467216974b51c2bf0567b88ae","blockSize":4194304,"blocks":["912cff1f69d2f1e83eed339fc12566f156fdb3e467216974b51c2bf0567b88ae"]},"offset":"43933504"},"write.js":{"size":5140,"integrity":{"algorithm":"SHA256","hash":"2c8c4a8d0943c121c472ff64a5707a568f574d43bc5250c5ea3b956bfd3ec162","blockSize":4194304,"blocks":["2c8c4a8d0943c121c472ff64a5707a568f574d43bc5250c5ea3b956bfd3ec162"]},"offset":"43934003"}}}}}}},"glob":{"files":{"LICENSE":{"size":976,"integrity":{"algorithm":"SHA256","hash":"6236fa0b88a4a0cce3dda0367979491b2052b3c8d6b1c10b3668de083e86a7f0","blockSize":4194304,"blocks":["6236fa0b88a4a0cce3dda0367979491b2052b3c8d6b1c10b3668de083e86a7f0"]},"offset":"43939143"},"common.js":{"size":6149,"integrity":{"algorithm":"SHA256","hash":"b867e089ab5d4ab19a83e5b34da3dd7f4018fdf255fcacc681aab87d41dc77e8","blockSize":4194304,"blocks":["b867e089ab5d4ab19a83e5b34da3dd7f4018fdf255fcacc681aab87d41dc77e8"]},"offset":"43940119"},"glob.js":{"size":19445,"integrity":{"algorithm":"SHA256","hash":"b8f35657ca927593d0f9e1aae3a8cfe9c33c697bf3c5733c2f6727f25ae25be1","blockSize":4194304,"blocks":["b8f35657ca927593d0f9e1aae3a8cfe9c33c697bf3c5733c2f6727f25ae25be1"]},"offset":"43946268"},"package.json":{"size":915,"integrity":{"algorithm":"SHA256","hash":"1f1d7bffc62d38e63d0a40fd879030357214c409ee2decb35e3882d8ec0aa9a7","blockSize":4194304,"blocks":["1f1d7bffc62d38e63d0a40fd879030357214c409ee2decb35e3882d8ec0aa9a7"]},"offset":"43965713"},"sync.js":{"size":12020,"integrity":{"algorithm":"SHA256","hash":"0f61227f4b55297f1ad16798c53e6a6dd55d633856f153133716413b7c5f61ad","blockSize":4194304,"blocks":["0f61227f4b55297f1ad16798c53e6a6dd55d633856f153133716413b7c5f61ad"]},"offset":"43966628"}}},"make-fetch-happen":{"files":{"LICENSE":{"size":755,"integrity":{"algorithm":"SHA256","hash":"720836c9bdad386485a492ab41fe08007ecf85ca278ddd8f9333494dcac4949d","blockSize":4194304,"blocks":["720836c9bdad386485a492ab41fe08007ecf85ca278ddd8f9333494dcac4949d"]},"offset":"43978648"},"package.json":{"size":1420,"integrity":{"algorithm":"SHA256","hash":"00c4eb931cf66d6e85a3d792205164d1303faeeeda8df1ddfff7ff0cfab0697d","blockSize":4194304,"blocks":["00c4eb931cf66d6e85a3d792205164d1303faeeeda8df1ddfff7ff0cfab0697d"]},"offset":"43979403"},"lib":{"files":{"agent.js":{"size":5362,"integrity":{"algorithm":"SHA256","hash":"e9800696e9af9f6c753a452319312142aacb6ef811c06b11a2cf6ec63d47a740","blockSize":4194304,"blocks":["e9800696e9af9f6c753a452319312142aacb6ef811c06b11a2cf6ec63d47a740"]},"offset":"43980823"},"fetch.js":{"size":3806,"integrity":{"algorithm":"SHA256","hash":"b628f3062b0cabf6913ccd8242346245b608796d6ceb1bf17c0e4f6a14a31ccd","blockSize":4194304,"blocks":["b628f3062b0cabf6913ccd8242346245b608796d6ceb1bf17c0e4f6a14a31ccd"]},"offset":"43986185"},"index.js":{"size":1055,"integrity":{"algorithm":"SHA256","hash":"b0f1bdc8f12bfd3a4094a025c9fb45db8682f46deb251d3bacea1d676673068f","blockSize":4194304,"blocks":["b0f1bdc8f12bfd3a4094a025c9fb45db8682f46deb251d3bacea1d676673068f"]},"offset":"43989991"},"options.js":{"size":1314,"integrity":{"algorithm":"SHA256","hash":"d23d533729d4f3b79698a59ac8f03e852c8e3030d25f9db2e145d1ac75931d26","blockSize":4194304,"blocks":["d23d533729d4f3b79698a59ac8f03e852c8e3030d25f9db2e145d1ac75931d26"]},"offset":"43991046"},"remote.js":{"size":3437,"integrity":{"algorithm":"SHA256","hash":"811ca1f601659c7ca203dfbac4c67b6540adeecadb1f55cc84a37e91b51c095c","blockSize":4194304,"blocks":["811ca1f601659c7ca203dfbac4c67b6540adeecadb1f55cc84a37e91b51c095c"]},"offset":"43992360"},"cache":{"files":{"entry.js":{"size":16832,"integrity":{"algorithm":"SHA256","hash":"72796f4e9724f1fa073046aeaf45485767c9b9d99f057f9e1da95ea9f93ab41e","blockSize":4194304,"blocks":["72796f4e9724f1fa073046aeaf45485767c9b9d99f057f9e1da95ea9f93ab41e"]},"offset":"43995797"},"errors.js":{"size":241,"integrity":{"algorithm":"SHA256","hash":"ebe3e39eeef50c49d61129460eb2ed580b30bc0841f4af013ba03a03a4e8f8ca","blockSize":4194304,"blocks":["ebe3e39eeef50c49d61129460eb2ed580b30bc0841f4af013ba03a03a4e8f8ca"]},"offset":"44012629"},"index.js":{"size":1760,"integrity":{"algorithm":"SHA256","hash":"0af497d3f4dbd8c2c77606e058fbc8bb6478e1aa3e2a5b20e6836178ea2ff932","blockSize":4194304,"blocks":["0af497d3f4dbd8c2c77606e058fbc8bb6478e1aa3e2a5b20e6836178ea2ff932"]},"offset":"44012870"},"key.js":{"size":430,"integrity":{"algorithm":"SHA256","hash":"ae7da8b3fbc282391fc70df8a625de765062f955fc85587e575479cbe9c33adb","blockSize":4194304,"blocks":["ae7da8b3fbc282391fc70df8a625de765062f955fc85587e575479cbe9c33adb"]},"offset":"44014630"},"policy.js":{"size":4907,"integrity":{"algorithm":"SHA256","hash":"fe767b12b9f126ce846c401f6234ed4f62e9e72a3f47ff6df9cdabb61778d449","blockSize":4194304,"blocks":["fe767b12b9f126ce846c401f6234ed4f62e9e72a3f47ff6df9cdabb61778d449"]},"offset":"44015060"}}}}}}},"minipass-fetch":{"files":{"LICENSE":{"size":1308,"integrity":{"algorithm":"SHA256","hash":"1dedee6f84f5875ce4dc398d4d767274eb952a43cfd510a6ada856b2ed347472","blockSize":4194304,"blocks":["1dedee6f84f5875ce4dc398d4d767274eb952a43cfd510a6ada856b2ed347472"]},"offset":"44019967"},"index.js":{"size":43,"integrity":{"algorithm":"SHA256","hash":"e0e30595f1e5437d0b1c0aa2489ecd9967b52c32b25d291b0b71e0f89e91f00f","blockSize":4194304,"blocks":["e0e30595f1e5437d0b1c0aa2489ecd9967b52c32b25d291b0b71e0f89e91f00f"]},"offset":"44021275"},"package.json":{"size":899,"integrity":{"algorithm":"SHA256","hash":"5290d65892ffb829587f9f66ede1f29b72c1e2235c7f5c7e5f8c2ee156ae11b6","blockSize":4194304,"blocks":["5290d65892ffb829587f9f66ede1f29b72c1e2235c7f5c7e5f8c2ee156ae11b6"]},"offset":"44021318"},"lib":{"files":{"abort-error.js":{"size":362,"integrity":{"algorithm":"SHA256","hash":"beef50fea16c75e829bb5288e8135d0c8d5e9c1425c123978dd38a2754afc007","blockSize":4194304,"blocks":["beef50fea16c75e829bb5288e8135d0c8d5e9c1425c123978dd38a2754afc007"]},"offset":"44022217"},"blob.js":{"size":2322,"integrity":{"algorithm":"SHA256","hash":"ecd3554e166da294c0f6ec9d3f324fb91777102cf1ae5cd7b48f3ed23a136094","blockSize":4194304,"blocks":["ecd3554e166da294c0f6ec9d3f324fb91777102cf1ae5cd7b48f3ed23a136094"]},"offset":"44022579"},"body.js":{"size":10120,"integrity":{"algorithm":"SHA256","hash":"2736bb3827b51654836da86b9bb275a07eaf3cfe16042cc5d1496c224586d7ea","blockSize":4194304,"blocks":["2736bb3827b51654836da86b9bb275a07eaf3cfe16042cc5d1496c224586d7ea"]},"offset":"44024901"},"fetch-error.js":{"size":705,"integrity":{"algorithm":"SHA256","hash":"1b7cb7fab4e1a4ad1bf811b7781bac2a79c30e9097e28be37fd083239f5c20cf","blockSize":4194304,"blocks":["1b7cb7fab4e1a4ad1bf811b7781bac2a79c30e9097e28be37fd083239f5c20cf"]},"offset":"44035021"},"headers.js":{"size":6375,"integrity":{"algorithm":"SHA256","hash":"1133f1f643745e71536754e470f70ba1cc401329b791c7481c6370ebbf29e2bb","blockSize":4194304,"blocks":["1133f1f643745e71536754e470f70ba1cc401329b791c7481c6370ebbf29e2bb"]},"offset":"44035726"},"index.js":{"size":11136,"integrity":{"algorithm":"SHA256","hash":"3a68919b9cb75fb96f1ca7c43f8988f2037c8a496a0993a5cc129a196947ed52","blockSize":4194304,"blocks":["3a68919b9cb75fb96f1ca7c43f8988f2037c8a496a0993a5cc129a196947ed52"]},"offset":"44042101"},"request.js":{"size":6719,"integrity":{"algorithm":"SHA256","hash":"c8c0a854a9112393fb3de548a9ba750cabe2510de10e394487a705426e8c71f6","blockSize":4194304,"blocks":["c8c0a854a9112393fb3de548a9ba750cabe2510de10e394487a705426e8c71f6"]},"offset":"44053237"},"response.js":{"size":1943,"integrity":{"algorithm":"SHA256","hash":"ce7477c3c9ce0f10a5a4c7f8084e2361d571797be3dcd7f477f53764f753a4d5","blockSize":4194304,"blocks":["ce7477c3c9ce0f10a5a4c7f8084e2361d571797be3dcd7f477f53764f753a4d5"]},"offset":"44059956"}}}}},"mkdirp":{"files":{"LICENSE":{"size":1166,"integrity":{"algorithm":"SHA256","hash":"144c935613e823350f7798d19da78b5e8315a79af5c2a3744fd85cd61baf07ee","blockSize":4194304,"blocks":["144c935613e823350f7798d19da78b5e8315a79af5c2a3744fd85cd61baf07ee"]},"offset":"44061899"},"index.js":{"size":1029,"integrity":{"algorithm":"SHA256","hash":"fd78d08648851e2db1b19e1271a90ad55b640d0b6ae2b20ad11c94aeec847b33","blockSize":4194304,"blocks":["fd78d08648851e2db1b19e1271a90ad55b640d0b6ae2b20ad11c94aeec847b33"]},"offset":"44063065"},"package.json":{"size":510,"integrity":{"algorithm":"SHA256","hash":"1aa4286767982171365b9a65e85cb7d6a34ce04b26fc76df7f2c3d6a1918970b","blockSize":4194304,"blocks":["1aa4286767982171365b9a65e85cb7d6a34ce04b26fc76df7f2c3d6a1918970b"]},"offset":"44064094"},"lib":{"files":{"find-made.js":{"size":763,"integrity":{"algorithm":"SHA256","hash":"743b7fd8fd5ec11dd6a71800650a65079f5bd3f08cbabb5c8dfadf06d138d755","blockSize":4194304,"blocks":["743b7fd8fd5ec11dd6a71800650a65079f5bd3f08cbabb5c8dfadf06d138d755"]},"offset":"44064604"},"mkdirp-manual.js":{"size":1610,"integrity":{"algorithm":"SHA256","hash":"492bedcd991014695803a3788f6c520df9c9b46fc315c9237debfdb713d75aaf","blockSize":4194304,"blocks":["492bedcd991014695803a3788f6c520df9c9b46fc315c9237debfdb713d75aaf"]},"offset":"44065367"},"mkdirp-native.js":{"size":969,"integrity":{"algorithm":"SHA256","hash":"bb01894bca455d7cc47c4957687293ef0fa740fc50e9af1351517e7ad667d00a","blockSize":4194304,"blocks":["bb01894bca455d7cc47c4957687293ef0fa740fc50e9af1351517e7ad667d00a"]},"offset":"44066977"},"opts-arg.js":{"size":784,"integrity":{"algorithm":"SHA256","hash":"a9a3e4f1700201c1ecb1d5ebb33d6da69ecf3db23546c4d077c730ae42a0a6a9","blockSize":4194304,"blocks":["a9a3e4f1700201c1ecb1d5ebb33d6da69ecf3db23546c4d077c730ae42a0a6a9"]},"offset":"44067946"},"path-arg.js":{"size":730,"integrity":{"algorithm":"SHA256","hash":"93abafb7a89f0fe00c662cd8f4100f4aeef7d5b0a068b8a9af81b38f03d21325","blockSize":4194304,"blocks":["93abafb7a89f0fe00c662cd8f4100f4aeef7d5b0a068b8a9af81b38f03d21325"]},"offset":"44068730"},"use-native.js":{"size":448,"integrity":{"algorithm":"SHA256","hash":"fed1e14f4d3a650493666697889e77ebb3be6ccb6054e9f55197566d1cf0eea8","blockSize":4194304,"blocks":["fed1e14f4d3a650493666697889e77ebb3be6ccb6054e9f55197566d1cf0eea8"]},"offset":"44069460"}}},"bin":{"files":{"cmd.js":{"size":1830,"integrity":{"algorithm":"SHA256","hash":"a5bf5e02584a7d72e4954f45e6efd60965315a78237179072de58cd8a161b8b6","blockSize":4194304,"blocks":["a5bf5e02584a7d72e4954f45e6efd60965315a78237179072de58cd8a161b8b6"]},"offset":"44069908"}}}}},"node-gyp":{"files":{"CONTRIBUTING.md":{"size":1383,"integrity":{"algorithm":"SHA256","hash":"4c74e3d427fb2071182307b6850f686082d0bb0ab2d691bdbb8939f731a8c9cb","blockSize":4194304,"blocks":["4c74e3d427fb2071182307b6850f686082d0bb0ab2d691bdbb8939f731a8c9cb"]},"offset":"44071738"},"LICENSE":{"size":1102,"integrity":{"algorithm":"SHA256","hash":"662a1b0115251cfb29c6aed0f221f8847bc49c6365d1c53a62c9f4bccc2489c3","blockSize":4194304,"blocks":["662a1b0115251cfb29c6aed0f221f8847bc49c6365d1c53a62c9f4bccc2489c3"]},"offset":"44073121"},"addon.gypi":{"size":5425,"integrity":{"algorithm":"SHA256","hash":"81bd7e997d5e649ac220c39dec6fac706c574d2759dabe85d654499f2fe61c09","blockSize":4194304,"blocks":["81bd7e997d5e649ac220c39dec6fac706c574d2759dabe85d654499f2fe61c09"]},"offset":"44074223"},"macOS_Catalina.md":{"size":6665,"integrity":{"algorithm":"SHA256","hash":"a19d715afe35073d38dc44f10bad40943282fb44eebf1ce03dd326a1fca68fa5","blockSize":4194304,"blocks":["a19d715afe35073d38dc44f10bad40943282fb44eebf1ce03dd326a1fca68fa5"]},"offset":"44079648"},"macOS_Catalina_acid_test.sh":{"size":495,"integrity":{"algorithm":"SHA256","hash":"c4ff0028080b20ec21f77b06dc84f27110e3c925e0cb65553a64d08f0989ef6a","blockSize":4194304,"blocks":["c4ff0028080b20ec21f77b06dc84f27110e3c925e0cb65553a64d08f0989ef6a"]},"offset":"44086313"},"package.json":{"size":874,"integrity":{"algorithm":"SHA256","hash":"42ddcd00f41cc9893579d2d516441e65e5d27f30f62af18e01da757a1fd268f2","blockSize":4194304,"blocks":["42ddcd00f41cc9893579d2d516441e65e5d27f30f62af18e01da757a1fd268f2"]},"offset":"44086808"},"update-gyp.py":{"size":1618,"integrity":{"algorithm":"SHA256","hash":"67ab5842c49c059be24d8a0f37f0b96e559126cfcb579b6b4271c3033dd050e3","blockSize":4194304,"blocks":["67ab5842c49c059be24d8a0f37f0b96e559126cfcb579b6b4271c3033dd050e3"]},"offset":"44087682"},"lib":{"files":{"Find-VisualStudio.cs":{"size":7931,"integrity":{"algorithm":"SHA256","hash":"bdb19763c5d23fab534ddc945f64c4cd956584eac934f0bed96c536d3fc53502","blockSize":4194304,"blocks":["bdb19763c5d23fab534ddc945f64c4cd956584eac934f0bed96c536d3fc53502"]},"offset":"44089300"},"build.js":{"size":5504,"integrity":{"algorithm":"SHA256","hash":"58e3a87a58f0b1d0eff6fe5f5398b9253f2926f2a112d2a685cd81684ea7b9b3","blockSize":4194304,"blocks":["58e3a87a58f0b1d0eff6fe5f5398b9253f2926f2a112d2a685cd81684ea7b9b3"]},"offset":"44097231"},"clean.js":{"size":355,"integrity":{"algorithm":"SHA256","hash":"54be92e3f5409cfa18cef347b365fb5cc5f502c4370035663e35c79e3be183c2","blockSize":4194304,"blocks":["54be92e3f5409cfa18cef347b365fb5cc5f502c4370035663e35c79e3be183c2"]},"offset":"44102735"},"configure.js":{"size":9393,"integrity":{"algorithm":"SHA256","hash":"e2aff493e284c49b997c06db3d8ae7df74e21ca392246220db6a1e12606e52d9","blockSize":4194304,"blocks":["e2aff493e284c49b997c06db3d8ae7df74e21ca392246220db6a1e12606e52d9"]},"offset":"44103090"},"create-config-gypi.js":{"size":4636,"integrity":{"algorithm":"SHA256","hash":"88de7613be3d7e458f376a516ee13d1dee3436cba77a72ec264da7b015220b64","blockSize":4194304,"blocks":["88de7613be3d7e458f376a516ee13d1dee3436cba77a72ec264da7b015220b64"]},"offset":"44112483"},"find-node-directory.js":{"size":2373,"integrity":{"algorithm":"SHA256","hash":"b88ec6739fb6329386ea83a9fd8e6683c06c050cea67dbb6106a6b8a0aa80cfc","blockSize":4194304,"blocks":["b88ec6739fb6329386ea83a9fd8e6683c06c050cea67dbb6106a6b8a0aa80cfc"]},"offset":"44117119"},"find-python.js":{"size":12133,"integrity":{"algorithm":"SHA256","hash":"5e5cc5d3b63aa919fb24f6a0b16330def3e441364d17ba5e8ef875fa9e55513e","blockSize":4194304,"blocks":["5e5cc5d3b63aa919fb24f6a0b16330def3e441364d17ba5e8ef875fa9e55513e"]},"offset":"44119492"},"find-visualstudio.js":{"size":14242,"integrity":{"algorithm":"SHA256","hash":"25629f43c976259c7c5b0250ca5f13b7d6b20b9ef3179ede2f7f4412c112d091","blockSize":4194304,"blocks":["25629f43c976259c7c5b0250ca5f13b7d6b20b9ef3179ede2f7f4412c112d091"]},"offset":"44131625"},"install.js":{"size":12111,"integrity":{"algorithm":"SHA256","hash":"ddd4983c08feb8611054fff016f128f2871974ba4311570ccff30b585d5bd523","blockSize":4194304,"blocks":["ddd4983c08feb8611054fff016f128f2871974ba4311570ccff30b585d5bd523"]},"offset":"44145867"},"list.js":{"size":641,"integrity":{"algorithm":"SHA256","hash":"e0c8498220cccc0b72c41cf49605f998c53bf0cd668df35228fdbcc8c368392a","blockSize":4194304,"blocks":["e0c8498220cccc0b72c41cf49605f998c53bf0cd668df35228fdbcc8c368392a"]},"offset":"44157978"},"node-gyp.js":{"size":4733,"integrity":{"algorithm":"SHA256","hash":"dd03a47236a0d230341d93af073ed9315f7991fa0e94fc3d489c762dfd7eeaa1","blockSize":4194304,"blocks":["dd03a47236a0d230341d93af073ed9315f7991fa0e94fc3d489c762dfd7eeaa1"]},"offset":"44158619"},"process-release.js":{"size":5787,"integrity":{"algorithm":"SHA256","hash":"bede94f61c6cd5807215eaec1470e154b0721cb452f37211793a7305b00aefd3","blockSize":4194304,"blocks":["bede94f61c6cd5807215eaec1470e154b0721cb452f37211793a7305b00aefd3"]},"offset":"44163352"},"rebuild.js":{"size":314,"integrity":{"algorithm":"SHA256","hash":"139fb66768d8201de574a69ca912cfc2f94bb274a59bdc3d00086c140622d0fb","blockSize":4194304,"blocks":["139fb66768d8201de574a69ca912cfc2f94bb274a59bdc3d00086c140622d0fb"]},"offset":"44169139"},"remove.js":{"size":1308,"integrity":{"algorithm":"SHA256","hash":"e0ca253c991dacef6900239adf5e5ab5aa803f36118846edaaa2995b71b2b96f","blockSize":4194304,"blocks":["e0ca253c991dacef6900239adf5e5ab5aa803f36118846edaaa2995b71b2b96f"]},"offset":"44169453"},"util.js":{"size":1914,"integrity":{"algorithm":"SHA256","hash":"be700f2b57f75a3b8589d80354f802dadfcfe105c063846d2f6ded86c3dc52ff","blockSize":4194304,"blocks":["be700f2b57f75a3b8589d80354f802dadfcfe105c063846d2f6ded86c3dc52ff"]},"offset":"44170761"}}},"gyp":{"files":{".flake8":{"size":121,"integrity":{"algorithm":"SHA256","hash":"174f5da4b3994df0f4472f4b3107e6abec12a75c4813669c298dfbff6359db4b","blockSize":4194304,"blocks":["174f5da4b3994df0f4472f4b3107e6abec12a75c4813669c298dfbff6359db4b"]},"offset":"44172675"},"AUTHORS":{"size":514,"integrity":{"algorithm":"SHA256","hash":"c6cdcf0e981a7540553d571b782f8b9650268ee9d63c04a4bc1dac258a5a2753","blockSize":4194304,"blocks":["c6cdcf0e981a7540553d571b782f8b9650268ee9d63c04a4bc1dac258a5a2753"]},"offset":"44172796"},"CODE_OF_CONDUCT.md":{"size":203,"integrity":{"algorithm":"SHA256","hash":"b42e5a27c9ead1aeeb7317717d11868d14d7f33ac7e30fb56c294c395f8a7028","blockSize":4194304,"blocks":["b42e5a27c9ead1aeeb7317717d11868d14d7f33ac7e30fb56c294c395f8a7028"]},"offset":"44173310"},"CONTRIBUTING.md":{"size":1327,"integrity":{"algorithm":"SHA256","hash":"1c8dc1a35186f807a1ddf2ece72a420497f51adff3be3c124dbe6ea7ea68441b","blockSize":4194304,"blocks":["1c8dc1a35186f807a1ddf2ece72a420497f51adff3be3c124dbe6ea7ea68441b"]},"offset":"44173513"},"LICENSE":{"size":1537,"integrity":{"algorithm":"SHA256","hash":"ca90abb6ed71de0774461ef9f928de33e748b617aeb79f9e52415cf08d69230e","blockSize":4194304,"blocks":["ca90abb6ed71de0774461ef9f928de33e748b617aeb79f9e52415cf08d69230e"]},"offset":"44174840"},"README.md":{"size":434,"integrity":{"algorithm":"SHA256","hash":"7aca48fe46bc3149549aefcfed3c558300086137ecbd6b7ded8e99ed3d47d970","blockSize":4194304,"blocks":["7aca48fe46bc3149549aefcfed3c558300086137ecbd6b7ded8e99ed3d47d970"]},"offset":"44176377"},"gyp":{"size":240,"integrity":{"algorithm":"SHA256","hash":"38e8b886cf06fe7cec4d89634fd2850891706308e2bbbc0556b3d299bd6a7993","blockSize":4194304,"blocks":["38e8b886cf06fe7cec4d89634fd2850891706308e2bbbc0556b3d299bd6a7993"]},"offset":"44176811"},"gyp.bat":{"size":201,"integrity":{"algorithm":"SHA256","hash":"77bf45e8c077df03d65e6c076920f24bee04752e29bcb21b63d3622fffe84f10","blockSize":4194304,"blocks":["77bf45e8c077df03d65e6c076920f24bee04752e29bcb21b63d3622fffe84f10"]},"offset":"44177051"},"gyp_main.py":{"size":1250,"integrity":{"algorithm":"SHA256","hash":"4ca6a9dfdbb18041c11bbd4bd841ec0cd96aeab8cee750dfc48a8d02a99551e4","blockSize":4194304,"blocks":["4ca6a9dfdbb18041c11bbd4bd841ec0cd96aeab8cee750dfc48a8d02a99551e4"]},"offset":"44177252"},"requirements_dev.txt":{"size":14,"integrity":{"algorithm":"SHA256","hash":"0f1c70d27e26005a96d66ad54482877ae20f7737693c833e29dd72bd6ac24892","blockSize":4194304,"blocks":["0f1c70d27e26005a96d66ad54482877ae20f7737693c833e29dd72bd6ac24892"]},"offset":"44178502"},"setup.py":{"size":1443,"integrity":{"algorithm":"SHA256","hash":"0f8b19f341f697cc3d477bc510c37e8aa9ac01bdd17a225471be2f0241a83b0e","blockSize":4194304,"blocks":["0f8b19f341f697cc3d477bc510c37e8aa9ac01bdd17a225471be2f0241a83b0e"]},"offset":"44178516"},"test_gyp.py":{"size":7660,"integrity":{"algorithm":"SHA256","hash":"f7b17cb6648bc3724bf7fa1323ca493ee42c4f122c80091d408683998b05ae0a","blockSize":4194304,"blocks":["f7b17cb6648bc3724bf7fa1323ca493ee42c4f122c80091d408683998b05ae0a"]},"offset":"44179959"},"tools":{"files":{"README":{"size":838,"integrity":{"algorithm":"SHA256","hash":"edb1728377bd72e4596dabe5a3d7906e691fa5028e4c81f604023c7426b6ee78","blockSize":4194304,"blocks":["edb1728377bd72e4596dabe5a3d7906e691fa5028e4c81f604023c7426b6ee78"]},"offset":"44187619"},"graphviz.py":{"size":3063,"integrity":{"algorithm":"SHA256","hash":"15807b32b2db7f8ca871d02f340977ac8c4229223128615450f3eb5a2a5eab80","blockSize":4194304,"blocks":["15807b32b2db7f8ca871d02f340977ac8c4229223128615450f3eb5a2a5eab80"]},"offset":"44188457"},"pretty_gyp.py":{"size":5028,"integrity":{"algorithm":"SHA256","hash":"d990913d6f8c65f2bb81d9c221aaa11fda9cf1a4112db3293aa2644b75960b70","blockSize":4194304,"blocks":["d990913d6f8c65f2bb81d9c221aaa11fda9cf1a4112db3293aa2644b75960b70"]},"offset":"44191520"},"pretty_sln.py":{"size":5482,"integrity":{"algorithm":"SHA256","hash":"6ff1719be4975023cbdd38b1e04c8dc1936643ece4791205166b8bd11e70161c","blockSize":4194304,"blocks":["6ff1719be4975023cbdd38b1e04c8dc1936643ece4791205166b8bd11e70161c"]},"offset":"44196548"},"pretty_vcproj.py":{"size":10633,"integrity":{"algorithm":"SHA256","hash":"03042bc4ad45fa3863b1b6d3df95d08ebbd635b73720115a297a09a20a8c87fa","blockSize":4194304,"blocks":["03042bc4ad45fa3863b1b6d3df95d08ebbd635b73720115a297a09a20a8c87fa"]},"offset":"44202030"},"emacs":{"files":{"README":{"size":410,"integrity":{"algorithm":"SHA256","hash":"9e6c45e15993038ecec228941d45c0c312eaf0de0f5675201ce7cc56f4fe7c30","blockSize":4194304,"blocks":["9e6c45e15993038ecec228941d45c0c312eaf0de0f5675201ce7cc56f4fe7c30"]},"offset":"44212663"},"gyp-tests.el":{"size":2182,"integrity":{"algorithm":"SHA256","hash":"66774199b3cfedbd2be8c0cf7c32d0353923e194ba6edbae200d63604af6afeb","blockSize":4194304,"blocks":["66774199b3cfedbd2be8c0cf7c32d0353923e194ba6edbae200d63604af6afeb"]},"offset":"44213073"},"gyp.el":{"size":12181,"integrity":{"algorithm":"SHA256","hash":"e428f70cf914a2f03bcbea2f270c5ce54a1d8f5836de551d867946742e4ee79e","blockSize":4194304,"blocks":["e428f70cf914a2f03bcbea2f270c5ce54a1d8f5836de551d867946742e4ee79e"]},"offset":"44215255"},"run-unit-tests.sh":{"size":306,"integrity":{"algorithm":"SHA256","hash":"ecb8d03579a0a68704fcd398545f27b5db5c7548c9fbe1aace49bfa3044273fa","blockSize":4194304,"blocks":["ecb8d03579a0a68704fcd398545f27b5db5c7548c9fbe1aace49bfa3044273fa"]},"offset":"44227436"},"testdata":{"files":{"media.gyp":{"size":37163,"integrity":{"algorithm":"SHA256","hash":"516148c8ee833496988545b3b868e573b50ed26a96f2389d652d985031b54e6e","blockSize":4194304,"blocks":["516148c8ee833496988545b3b868e573b50ed26a96f2389d652d985031b54e6e"]},"offset":"44227742"},"media.gyp.fontified":{"size":162854,"integrity":{"algorithm":"SHA256","hash":"a0f45c13a47f5391efa1e791d7139508c7f2e3895de42659833a6d43a01578bc","blockSize":4194304,"blocks":["a0f45c13a47f5391efa1e791d7139508c7f2e3895de42659833a6d43a01578bc"]},"offset":"44264905"}}}}},"Xcode":{"files":{"README":{"size":289,"integrity":{"algorithm":"SHA256","hash":"fac405b73fe3da72ee0d32bff7b3faa57caa9831d47376b2120fbf807c9c5139","blockSize":4194304,"blocks":["fac405b73fe3da72ee0d32bff7b3faa57caa9831d47376b2120fbf807c9c5139"]},"offset":"44427759"},"Specifications":{"files":{"gyp.pbfilespec":{"size":701,"integrity":{"algorithm":"SHA256","hash":"598ad79cd713bd0c7d585c1060d9eb538dd1d057f7512e33f2c8ffa526a73ff5","blockSize":4194304,"blocks":["598ad79cd713bd0c7d585c1060d9eb538dd1d057f7512e33f2c8ffa526a73ff5"]},"offset":"44428048"},"gyp.xclangspec":{"size":5088,"integrity":{"algorithm":"SHA256","hash":"69bd456d6a621ac22558eabab0fcaa24d709159758ad8cf5fac29c47c9d89db9","blockSize":4194304,"blocks":["69bd456d6a621ac22558eabab0fcaa24d709159758ad8cf5fac29c47c9d89db9"]},"offset":"44428749"}}}}}}},"pylib":{"files":{"gyp":{"files":{"MSVSNew.py":{"size":13095,"integrity":{"algorithm":"SHA256","hash":"335451fca5ae01e0300e7f8ae8faf61491000804ce44a44c7c731dfcc00451f7","blockSize":4194304,"blocks":["335451fca5ae01e0300e7f8ae8faf61491000804ce44a44c7c731dfcc00451f7"]},"offset":"44433837"},"MSVSProject.py":{"size":6743,"integrity":{"algorithm":"SHA256","hash":"e8c98d8cecc87c36c394e7a1153b5977c08cb946764f3d41234c0e3856cb1ac8","blockSize":4194304,"blocks":["e8c98d8cecc87c36c394e7a1153b5977c08cb946764f3d41234c0e3856cb1ac8"]},"offset":"44446932"},"MSVSSettings.py":{"size":45350,"integrity":{"algorithm":"SHA256","hash":"ac626f3caa5060ac4148023d27fe3b95e074a56d6f1b9fd8f2b86d30329c9f0e","blockSize":4194304,"blocks":["ac626f3caa5060ac4148023d27fe3b95e074a56d6f1b9fd8f2b86d30329c9f0e"]},"offset":"44453675"},"MSVSSettings_test.py":{"size":74297,"integrity":{"algorithm":"SHA256","hash":"f7f6ab5c5291d776caba64221dbe8db71e4b5ecf602949d7c44181206a007cf5","blockSize":4194304,"blocks":["f7f6ab5c5291d776caba64221dbe8db71e4b5ecf602949d7c44181206a007cf5"]},"offset":"44499025"},"MSVSToolFile.py":{"size":1789,"integrity":{"algorithm":"SHA256","hash":"9f87e663ecad69e0f123e749ba127436b670c88e1c3c5ae022acb5ff2664d7af","blockSize":4194304,"blocks":["9f87e663ecad69e0f123e749ba127436b670c88e1c3c5ae022acb5ff2664d7af"]},"offset":"44573322"},"MSVSUserFile.py":{"size":5333,"integrity":{"algorithm":"SHA256","hash":"f5b26e5831a2aa284e540da6daf8d63123f71b28085bd49453dc1a5fbaf53924","blockSize":4194304,"blocks":["f5b26e5831a2aa284e540da6daf8d63123f71b28085bd49453dc1a5fbaf53924"]},"offset":"44575111"},"MSVSUtil.py":{"size":10231,"integrity":{"algorithm":"SHA256","hash":"fc384ac06eb66c7dccee116db7d4857e5ccdcca43c5609c36e717afb35fcf6f4","blockSize":4194304,"blocks":["fc384ac06eb66c7dccee116db7d4857e5ccdcca43c5609c36e717afb35fcf6f4"]},"offset":"44580444"},"MSVSVersion.py":{"size":19742,"integrity":{"algorithm":"SHA256","hash":"80523ccae55b01deaf680828b5620ebb7fd8280fd2d6a76e7b0904f52a0b4ad2","blockSize":4194304,"blocks":["80523ccae55b01deaf680828b5620ebb7fd8280fd2d6a76e7b0904f52a0b4ad2"]},"offset":"44590675"},"__init__.py":{"size":23329,"integrity":{"algorithm":"SHA256","hash":"d5a04879a10166d1f4857baa4719351fbbe5417be97090d0efe2c67cc824fc0e","blockSize":4194304,"blocks":["d5a04879a10166d1f4857baa4719351fbbe5417be97090d0efe2c67cc824fc0e"]},"offset":"44610417"},"common.py":{"size":22622,"integrity":{"algorithm":"SHA256","hash":"27281f12f674c122a4ee571e8b008e0b53dc2d131480530310f4c29129d063d4","blockSize":4194304,"blocks":["27281f12f674c122a4ee571e8b008e0b53dc2d131480530310f4c29129d063d4"]},"offset":"44633746"},"common_test.py":{"size":2162,"integrity":{"algorithm":"SHA256","hash":"044f51b104bf0adafa76f618be708fc1ecebdca1c6d13c2e3b717ddd1313440d","blockSize":4194304,"blocks":["044f51b104bf0adafa76f618be708fc1ecebdca1c6d13c2e3b717ddd1313440d"]},"offset":"44656368"},"easy_xml.py":{"size":5287,"integrity":{"algorithm":"SHA256","hash":"34cb72f8bdf511e79b90148716c4eb34fe74fe0d990e8038060d2db4983bd795","blockSize":4194304,"blocks":["34cb72f8bdf511e79b90148716c4eb34fe74fe0d990e8038060d2db4983bd795"]},"offset":"44658530"},"easy_xml_test.py":{"size":3709,"integrity":{"algorithm":"SHA256","hash":"2ea64cc7baddd528bbd00e222e7e6c9fab38f80720397d251eeab74dcddc5570","blockSize":4194304,"blocks":["2ea64cc7baddd528bbd00e222e7e6c9fab38f80720397d251eeab74dcddc5570"]},"offset":"44663817"},"flock_tool.py":{"size":1859,"integrity":{"algorithm":"SHA256","hash":"bf583973d69b2417e8b635459ff9880422e512e915e80c46b8dcb9aaa1ffb083","blockSize":4194304,"blocks":["bf583973d69b2417e8b635459ff9880422e512e915e80c46b8dcb9aaa1ffb083"]},"offset":"44667526"},"input.py":{"size":127052,"integrity":{"algorithm":"SHA256","hash":"50b6f74f703f52f7436d6aa11807c8374e6f4cb0f9851ea21dc2e9c7fb6e17ce","blockSize":4194304,"blocks":["50b6f74f703f52f7436d6aa11807c8374e6f4cb0f9851ea21dc2e9c7fb6e17ce"]},"offset":"44669385"},"input_test.py":{"size":3425,"integrity":{"algorithm":"SHA256","hash":"e1ec5b80522f47d01875b402f063ad470301c1fe3bfc5ff53a96dee3a9d0665e","blockSize":4194304,"blocks":["e1ec5b80522f47d01875b402f063ad470301c1fe3bfc5ff53a96dee3a9d0665e"]},"offset":"44796437"},"mac_tool.py":{"size":30260,"integrity":{"algorithm":"SHA256","hash":"b6eea085dc72511681be84a41c6612e0bdc9e116af5d02fe12e442bf06bdc76f","blockSize":4194304,"blocks":["b6eea085dc72511681be84a41c6612e0bdc9e116af5d02fe12e442bf06bdc76f"]},"offset":"44799862"},"msvs_emulation.py":{"size":54358,"integrity":{"algorithm":"SHA256","hash":"a4cdf6ff7571cb4c5a4ba7d23e45f75b07302213f243d9a2b86a45ae38696f3a","blockSize":4194304,"blocks":["a4cdf6ff7571cb4c5a4ba7d23e45f75b07302213f243d9a2b86a45ae38696f3a"]},"offset":"44830122"},"ninja_syntax.py":{"size":5640,"integrity":{"algorithm":"SHA256","hash":"ccc1e407c9743bba1192e605a1a37d768b676c04c11d9804ad0cedc04fd6eb8f","blockSize":4194304,"blocks":["ccc1e407c9743bba1192e605a1a37d768b676c04c11d9804ad0cedc04fd6eb8f"]},"offset":"44884480"},"simple_copy.py":{"size":1293,"integrity":{"algorithm":"SHA256","hash":"d95fb054c27d4d0f7868043d3a6a61e30ff80c50a6fd41a61bf2f86a5ca507cd","blockSize":4194304,"blocks":["d95fb054c27d4d0f7868043d3a6a61e30ff80c50a6fd41a61bf2f86a5ca507cd"]},"offset":"44890120"},"win_tool.py":{"size":15164,"integrity":{"algorithm":"SHA256","hash":"955bb43c5c9e543bb5138a09fa882fd07ae188db791fa640daef8a20ca53ce86","blockSize":4194304,"blocks":["955bb43c5c9e543bb5138a09fa882fd07ae188db791fa640daef8a20ca53ce86"]},"offset":"44891413"},"xcode_emulation.py":{"size":81834,"integrity":{"algorithm":"SHA256","hash":"f2eb448fee55b564d1939494ea0561ecbb2d3acea4b024fe79be6c556307b181","blockSize":4194304,"blocks":["f2eb448fee55b564d1939494ea0561ecbb2d3acea4b024fe79be6c556307b181"]},"offset":"44906577"},"xcode_ninja.py":{"size":12124,"integrity":{"algorithm":"SHA256","hash":"433d7f7503d730ff4cfa145dea0a8157b719ac1bd3d4fd593f6bd4e7fe33cb30","blockSize":4194304,"blocks":["433d7f7503d730ff4cfa145dea0a8157b719ac1bd3d4fd593f6bd4e7fe33cb30"]},"offset":"44988411"},"xcodeproj_file.py":{"size":135717,"integrity":{"algorithm":"SHA256","hash":"26841ab4c5e247f22d4b93853dfc54ab7df87adb6adda2efb849976c60aa4892","blockSize":4194304,"blocks":["26841ab4c5e247f22d4b93853dfc54ab7df87adb6adda2efb849976c60aa4892"]},"offset":"45000535"},"xml_fix.py":{"size":2245,"integrity":{"algorithm":"SHA256","hash":"fb3d277f752765aeef370d2ec31618848487acde9e48720456c1a3884680b818","blockSize":4194304,"blocks":["fb3d277f752765aeef370d2ec31618848487acde9e48720456c1a3884680b818"]},"offset":"45136252"},"generator":{"files":{"__init__.py":{"size":0,"integrity":{"algorithm":"SHA256","hash":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","blockSize":4194304,"blocks":[]},"offset":"45138497"},"analyzer.py":{"size":31684,"integrity":{"algorithm":"SHA256","hash":"78608eed439d56e9d8653ecff61e8e35620e37c5c21f78b47f2c8d3c35289d6b","blockSize":4194304,"blocks":["78608eed439d56e9d8653ecff61e8e35620e37c5c21f78b47f2c8d3c35289d6b"]},"offset":"45138497"},"android.py":{"size":49966,"integrity":{"algorithm":"SHA256","hash":"0feb8ccd3e6819134252b5142bcf0dd7ac1442445d7c51722595b42023cca1ef","blockSize":4194304,"blocks":["0feb8ccd3e6819134252b5142bcf0dd7ac1442445d7c51722595b42023cca1ef"]},"offset":"45170181"},"cmake.py":{"size":49248,"integrity":{"algorithm":"SHA256","hash":"71a141ac5435dcc7f0ba99f33ac94f3f81e8d4a4b1ebd679c59e8652b37de4b3","blockSize":4194304,"blocks":["71a141ac5435dcc7f0ba99f33ac94f3f81e8d4a4b1ebd679c59e8652b37de4b3"]},"offset":"45220147"},"compile_commands_json.py":{"size":4591,"integrity":{"algorithm":"SHA256","hash":"c6b654088d7e21b9a4672c00d5d227539005a068c463423f9ffed6fdb22224ff","blockSize":4194304,"blocks":["c6b654088d7e21b9a4672c00d5d227539005a068c463423f9ffed6fdb22224ff"]},"offset":"45269395"},"dump_dependency_json.py":{"size":3101,"integrity":{"algorithm":"SHA256","hash":"3d5da711e2c0dfa37651640e2ee5b90f0627bdf30ea856c4700f6992a29c61a5","blockSize":4194304,"blocks":["3d5da711e2c0dfa37651640e2ee5b90f0627bdf30ea856c4700f6992a29c61a5"]},"offset":"45273986"},"eclipse.py":{"size":17554,"integrity":{"algorithm":"SHA256","hash":"2817e34e5467c70f1e4ada7c5c1654c7e8eea18fad08cf04ebafcabaf180d8d7","blockSize":4194304,"blocks":["2817e34e5467c70f1e4ada7c5c1654c7e8eea18fad08cf04ebafcabaf180d8d7"]},"offset":"45277087"},"gypd.py":{"size":3505,"integrity":{"algorithm":"SHA256","hash":"909d07de26ca5155aa40096e8ce0e06ed12b0e05fa2dc98b7ffbfa50274da5d1","blockSize":4194304,"blocks":["909d07de26ca5155aa40096e8ce0e06ed12b0e05fa2dc98b7ffbfa50274da5d1"]},"offset":"45294641"},"gypsh.py":{"size":1713,"integrity":{"algorithm":"SHA256","hash":"d66f5231d2b47c0d971e6324c1a6640310b30c8effcb6e1602622358b4d48ba1","blockSize":4194304,"blocks":["d66f5231d2b47c0d971e6324c1a6640310b30c8effcb6e1602622358b4d48ba1"]},"offset":"45298146"},"make.py":{"size":102224,"integrity":{"algorithm":"SHA256","hash":"9a047742326ebd0c1191b0df702b4b57046dbbf951b79eef46878e800a54d0af","blockSize":4194304,"blocks":["9a047742326ebd0c1191b0df702b4b57046dbbf951b79eef46878e800a54d0af"]},"offset":"45299859"},"msvs.py":{"size":150465,"integrity":{"algorithm":"SHA256","hash":"ea02f2a38c87730cee02cf8b9236306de48f2c0e1c9ec6b510a7603baa9314af","blockSize":4194304,"blocks":["ea02f2a38c87730cee02cf8b9236306de48f2c0e1c9ec6b510a7603baa9314af"]},"offset":"45402083"},"msvs_test.py":{"size":1266,"integrity":{"algorithm":"SHA256","hash":"7972d92171b970576fc66f6c1795524f8224dcd20dd37f9f1b3add25bbaaa1a2","blockSize":4194304,"blocks":["7972d92171b970576fc66f6c1795524f8224dcd20dd37f9f1b3add25bbaaa1a2"]},"offset":"45552548"},"ninja.py":{"size":118398,"integrity":{"algorithm":"SHA256","hash":"897150b8ccd21adacefc572d8d4b1bbb4422f2d525e507460e569a7a23fba5ac","blockSize":4194304,"blocks":["897150b8ccd21adacefc572d8d4b1bbb4422f2d525e507460e569a7a23fba5ac"]},"offset":"45553814"},"ninja_test.py":{"size":1910,"integrity":{"algorithm":"SHA256","hash":"d775c83c23d04131f2667702702828e2a2cb1869eefeded04fe3bb42cf876602","blockSize":4194304,"blocks":["d775c83c23d04131f2667702702828e2a2cb1869eefeded04fe3bb42cf876602"]},"offset":"45672212"},"xcode.py":{"size":66115,"integrity":{"algorithm":"SHA256","hash":"6bf1e8b06e6558fc1ef007349f4ae6d1386692dafa0d26b556c84899c7773e14","blockSize":4194304,"blocks":["6bf1e8b06e6558fc1ef007349f4ae6d1386692dafa0d26b556c84899c7773e14"]},"offset":"45674122"},"xcode_test.py":{"size":672,"integrity":{"algorithm":"SHA256","hash":"aa6cdaaf2d3eb73fcae3c706462570c999ef6d0520139333aaa6e57e3b3e4636","blockSize":4194304,"blocks":["aa6cdaaf2d3eb73fcae3c706462570c999ef6d0520139333aaa6e57e3b3e4636"]},"offset":"45740237"}}}}}}},".github":{"files":{"workflows":{"files":{"Python_tests.yml":{"size":976,"integrity":{"algorithm":"SHA256","hash":"1d65a3e0e14c9c67700b3a80a34371dc9934a98d11b41e506abc498a8901396b","blockSize":4194304,"blocks":["1d65a3e0e14c9c67700b3a80a34371dc9934a98d11b41e506abc498a8901396b"]},"offset":"45740909"},"node-gyp.yml":{"size":1002,"integrity":{"algorithm":"SHA256","hash":"a0ae4c07190e1369d7c7ed11efce2a743d0c2bd986e2f86fd43f596454e3a545","blockSize":4194304,"blocks":["a0ae4c07190e1369d7c7ed11efce2a743d0c2bd986e2f86fd43f596454e3a545"]},"offset":"45741885"},"nodejs-windows.yml":{"size":639,"integrity":{"algorithm":"SHA256","hash":"5e20addc8586796f772a0aa34eacc58d157c2b49c2c867976b718db3501da741","blockSize":4194304,"blocks":["5e20addc8586796f772a0aa34eacc58d157c2b49c2c867976b718db3501da741"]},"offset":"45742887"},"release-please.yml":{"size":341,"integrity":{"algorithm":"SHA256","hash":"913161bdef29587d2f0b6bbfc0e4c884d011e16aed4692dd054f5ff5388133b5","blockSize":4194304,"blocks":["913161bdef29587d2f0b6bbfc0e4c884d011e16aed4692dd054f5ff5388133b5"]},"offset":"45743526"}}}}}}},"docs":{"files":{"Common-issues.md":{"size":708,"integrity":{"algorithm":"SHA256","hash":"9601d17b81c53fc25967c5120d930debaa2c5dc1bcdbe3fcdc7b1002a519f0c1","blockSize":4194304,"blocks":["9601d17b81c53fc25967c5120d930debaa2c5dc1bcdbe3fcdc7b1002a519f0c1"]},"offset":"45743867"},"Error-pre-versions-of-node-cannot-be-installed.md":{"size":3843,"integrity":{"algorithm":"SHA256","hash":"0e3188d33bf79583705465de4d94de6ca67d15c86952ba93cc30390c991d7c28","blockSize":4194304,"blocks":["0e3188d33bf79583705465de4d94de6ca67d15c86952ba93cc30390c991d7c28"]},"offset":"45744575"},"Home.md":{"size":217,"integrity":{"algorithm":"SHA256","hash":"210d05a52cd550b1e0663f8aa1f847428f60258a8be192dafc445f6d7fe1e52a","blockSize":4194304,"blocks":["210d05a52cd550b1e0663f8aa1f847428f60258a8be192dafc445f6d7fe1e52a"]},"offset":"45748418"},"Linking-to-OpenSSL.md":{"size":3855,"integrity":{"algorithm":"SHA256","hash":"e609b04e640d2b65bef8b24c4651d2accdc0b3834202f6bafed0c363905c9ecd","blockSize":4194304,"blocks":["e609b04e640d2b65bef8b24c4651d2accdc0b3834202f6bafed0c363905c9ecd"]},"offset":"45748635"},"Updating-npm-bundled-node-gyp.md":{"size":2680,"integrity":{"algorithm":"SHA256","hash":"feae4cf487b7403eb049a8bcca3d93fa8f112793f578bcd60e1caa45ce0635e3","blockSize":4194304,"blocks":["feae4cf487b7403eb049a8bcca3d93fa8f112793f578bcd60e1caa45ce0635e3"]},"offset":"45752490"},"binding.gyp-files-in-the-wild.md":{"size":4658,"integrity":{"algorithm":"SHA256","hash":"19f80594e254fd2a5b741fc9cdc4920563dff5b01fd2c2908160714c6573adc1","blockSize":4194304,"blocks":["19f80594e254fd2a5b741fc9cdc4920563dff5b01fd2c2908160714c6573adc1"]},"offset":"45755170"}}},"bin":{"files":{"node-gyp.js":{"size":3506,"integrity":{"algorithm":"SHA256","hash":"c1e7add754a692ab1fcac69577dafeb2e5f104ad262e02be9c8c8a84eea302c7","blockSize":4194304,"blocks":["c1e7add754a692ab1fcac69577dafeb2e5f104ad262e02be9c8c8a84eea302c7"]},"offset":"45759828"}}},".github":{"files":{"ISSUE_TEMPLATE.md":{"size":2097,"integrity":{"algorithm":"SHA256","hash":"0cbb165e37f9f5b8bfbb8628700ba37b60ab79ce288a4af4dbfe666de65be82f","blockSize":4194304,"blocks":["0cbb165e37f9f5b8bfbb8628700ba37b60ab79ce288a4af4dbfe666de65be82f"]},"offset":"45763334"},"PULL_REQUEST_TEMPLATE.md":{"size":619,"integrity":{"algorithm":"SHA256","hash":"70dff8a9eebecef2eb7aaa5c5464ea27e43c5099028d53885f9906aa783c4998","blockSize":4194304,"blocks":["70dff8a9eebecef2eb7aaa5c5464ea27e43c5099028d53885f9906aa783c4998"]},"offset":"45765431"},"workflows":{"files":{"release-please.yml":{"size":2779,"integrity":{"algorithm":"SHA256","hash":"7d2f9d75c673152b79e94cf57c0ccb4002a99cfb430e9cb7a1630016a40d8f26","blockSize":4194304,"blocks":["7d2f9d75c673152b79e94cf57c0ccb4002a99cfb430e9cb7a1630016a40d8f26"]},"offset":"45766050"},"tests.yml":{"size":1483,"integrity":{"algorithm":"SHA256","hash":"461b0e12318f7fa99e8670ba52ffa42804e620bc5e0e0844195dee1b2cf455d5","blockSize":4194304,"blocks":["461b0e12318f7fa99e8670ba52ffa42804e620bc5e0e0844195dee1b2cf455d5"]},"offset":"45768829"},"visual-studio.yml":{"size":695,"integrity":{"algorithm":"SHA256","hash":"445d19d056a7087a62d1dc877f5566705bbc2f91d184a8df936caeee2d6d685b","blockSize":4194304,"blocks":["445d19d056a7087a62d1dc877f5566705bbc2f91d184a8df936caeee2d6d685b"]},"offset":"45770312"}}}}}}},"nopt":{"files":{"LICENSE":{"size":765,"integrity":{"algorithm":"SHA256","hash":"4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b","blockSize":4194304,"blocks":["4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b"]},"offset":"45771007"},"package.json":{"size":546,"integrity":{"algorithm":"SHA256","hash":"502654e44ec76ab9ada227578bd77ab7ec315d9cce04c29d629f4f086d88313a","blockSize":4194304,"blocks":["502654e44ec76ab9ada227578bd77ab7ec315d9cce04c29d629f4f086d88313a"]},"offset":"45771772"},"lib":{"files":{"nopt.js":{"size":12220,"integrity":{"algorithm":"SHA256","hash":"aa765390d86b5b9242f0dc2114fd7e2a0c473b854f2ccc85af51a2d800826785","blockSize":4194304,"blocks":["aa765390d86b5b9242f0dc2114fd7e2a0c473b854f2ccc85af51a2d800826785"]},"offset":"45772318"}}},"bin":{"files":{"nopt.js":{"size":1549,"integrity":{"algorithm":"SHA256","hash":"419fd0c250623dcf67bb4993817881331c17096960907ee34adc85af9e74da31","blockSize":4194304,"blocks":["419fd0c250623dcf67bb4993817881331c17096960907ee34adc85af9e74da31"]},"offset":"45784538"}}}}},"socks-proxy-agent":{"files":{"package.json":{"size":1794,"integrity":{"algorithm":"SHA256","hash":"6830f36bc48fea8696f24e9f83afc40feb92867bb0acf61797811e676467e00e","blockSize":4194304,"blocks":["6830f36bc48fea8696f24e9f83afc40feb92867bb0acf61797811e676467e00e"]},"offset":"45786087"},"dist":{"files":{"index.js":{"size":7458,"integrity":{"algorithm":"SHA256","hash":"733d7d4622ffb11a3212da7fa43236e36fa1fad0fe3efb23d2c3890cb9312bb7","blockSize":4194304,"blocks":["733d7d4622ffb11a3212da7fa43236e36fa1fad0fe3efb23d2c3890cb9312bb7"]},"offset":"45787881"}}}}},"ssri":{"files":{"LICENSE.md":{"size":755,"integrity":{"algorithm":"SHA256","hash":"720836c9bdad386485a492ab41fe08007ecf85ca278ddd8f9333494dcac4949d","blockSize":4194304,"blocks":["720836c9bdad386485a492ab41fe08007ecf85ca278ddd8f9333494dcac4949d"]},"offset":"45795339"},"index.js":{"size":13775,"integrity":{"algorithm":"SHA256","hash":"d027d53b84a5abb1926c1b3ff7f3c8164f697c27bb20af6dca79c16669a2ff82","blockSize":4194304,"blocks":["d027d53b84a5abb1926c1b3ff7f3c8164f697c27bb20af6dca79c16669a2ff82"]},"offset":"45796094"},"package.json":{"size":651,"integrity":{"algorithm":"SHA256","hash":"eb13a819890c668335152cbcce19b2e90965a7a7d5ad10e2f298dd1a47482f62","blockSize":4194304,"blocks":["eb13a819890c668335152cbcce19b2e90965a7a7d5ad10e2f298dd1a47482f62"]},"offset":"45809869"}}}}}}},"statuses":{"files":{"HISTORY.md":{"size":1546,"integrity":{"algorithm":"SHA256","hash":"41762ce40aae520bbd476b81288ec5fb717ba11da9409dbe74f782aa5f71d04d","blockSize":4194304,"blocks":["41762ce40aae520bbd476b81288ec5fb717ba11da9409dbe74f782aa5f71d04d"]},"offset":"38191353"},"LICENSE":{"size":1172,"integrity":{"algorithm":"SHA256","hash":"512cfa4d5e7a7569c7ae4dd95241cb6ae2aaf648ef9ebd080c01bd24868d26e9","blockSize":4194304,"blocks":["512cfa4d5e7a7569c7ae4dd95241cb6ae2aaf648ef9ebd080c01bd24868d26e9"]},"offset":"38192899"},"codes.json":{"size":1789,"integrity":{"algorithm":"SHA256","hash":"d2daa083f11600277bd2bf9823bb48ede916a5b0924d2991d6bc4ce331d5604b","blockSize":4194304,"blocks":["d2daa083f11600277bd2bf9823bb48ede916a5b0924d2991d6bc4ce331d5604b"]},"offset":"38194071"},"index.js":{"size":2610,"integrity":{"algorithm":"SHA256","hash":"96a0698e899f5889cf254d1f2e351f3253a37921c7f87269b0e87a497dec666a","blockSize":4194304,"blocks":["96a0698e899f5889cf254d1f2e351f3253a37921c7f87269b0e87a497dec666a"]},"offset":"38195860"},"package.json":{"size":674,"integrity":{"algorithm":"SHA256","hash":"113c61d5269dc08994a3b9529893387239bc949d5e0c280c1aba8580abb117ba","blockSize":4194304,"blocks":["113c61d5269dc08994a3b9529893387239bc949d5e0c280c1aba8580abb117ba"]},"offset":"38198470"}}},"stoppable":{"files":{"LICENSE":{"size":1106,"integrity":{"algorithm":"SHA256","hash":"982560527e5e9d28a52f43a4c251d6fd15e9339d3b891e0fe0b2bfc566f83119","blockSize":4194304,"blocks":["982560527e5e9d28a52f43a4c251d6fd15e9339d3b891e0fe0b2bfc566f83119"]},"offset":"38199144"},"package.json":{"size":551,"integrity":{"algorithm":"SHA256","hash":"8a068fbbb566bf8fbc83e2ed01c0733f72d5aab3315e3f461123b288d5fae02a","blockSize":4194304,"blocks":["8a068fbbb566bf8fbc83e2ed01c0733f72d5aab3315e3f461123b288d5fae02a"]},"offset":"38200250"},"lib":{"files":{"stoppable.js":{"size":1615,"integrity":{"algorithm":"SHA256","hash":"3106d99685ce3ea1ed446ff485cd556f71a86b72d3dabf73a04eae4b2601a023","blockSize":4194304,"blocks":["3106d99685ce3ea1ed446ff485cd556f71a86b72d3dabf73a04eae4b2601a023"]},"offset":"38200801"}}}}},"string-argv":{"files":{"LICENSE":{"size":1101,"integrity":{"algorithm":"SHA256","hash":"2aca619a9845c352d678fb94a7f1dc2a7f9824db7cced3a320d215107847dc72","blockSize":4194304,"blocks":["2aca619a9845c352d678fb94a7f1dc2a7f9824db7cced3a320d215107847dc72"]},"offset":"38202416"},"index.js":{"size":1626,"integrity":{"algorithm":"SHA256","hash":"2f1dbb37aa441c2a5cdb7cd291e001f8a1437781b069d59cc7046ca84d58d31b","blockSize":4194304,"blocks":["2f1dbb37aa441c2a5cdb7cd291e001f8a1437781b069d59cc7046ca84d58d31b"]},"offset":"38203517"},"package.json":{"size":723,"integrity":{"algorithm":"SHA256","hash":"8f74c2b8404d1318535d4b7ab812eba0ab62c40a7828d326c17014a3ed5d9b71","blockSize":4194304,"blocks":["8f74c2b8404d1318535d4b7ab812eba0ab62c40a7828d326c17014a3ed5d9b71"]},"offset":"38205143"}}},"string-width":{"files":{"index.js":{"size":923,"integrity":{"algorithm":"SHA256","hash":"ed69ea4f757130e46dc48a0cc31beb6257e61a31c70936d82b8a3f02ffd64df5","blockSize":4194304,"blocks":["ed69ea4f757130e46dc48a0cc31beb6257e61a31c70936d82b8a3f02ffd64df5"]},"offset":"38205866"},"license":{"size":1109,"integrity":{"algorithm":"SHA256","hash":"48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0","blockSize":4194304,"blocks":["48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0"]},"offset":"38206789"},"package.json":{"size":633,"integrity":{"algorithm":"SHA256","hash":"9af9b1c5c08c1d130ff2a1b829d19fb2ef9d2dd78e04b1e79f5faf322d2912cd","blockSize":4194304,"blocks":["9af9b1c5c08c1d130ff2a1b829d19fb2ef9d2dd78e04b1e79f5faf322d2912cd"]},"offset":"38207898"},"node_modules":{"files":{"emoji-regex":{"files":{"LICENSE-MIT.txt":{"size":1077,"integrity":{"algorithm":"SHA256","hash":"483acb265f182907d1caf6cff9c16c96f31325ed23792832cc5d8b12d5f88c8a","blockSize":4194304,"blocks":["483acb265f182907d1caf6cff9c16c96f31325ed23792832cc5d8b12d5f88c8a"]},"offset":"45810520"},"index.js":{"size":10286,"integrity":{"algorithm":"SHA256","hash":"c56978800e47f095cfbfe96712b5e78d150d1f62e32bb4943675213fce481ef0","blockSize":4194304,"blocks":["c56978800e47f095cfbfe96712b5e78d150d1f62e32bb4943675213fce481ef0"]},"offset":"45811597"},"package.json":{"size":852,"integrity":{"algorithm":"SHA256","hash":"bc390531ac1166d8fd8291a61b9bfe71b220ce892023b536effc7e88ec733664","blockSize":4194304,"blocks":["bc390531ac1166d8fd8291a61b9bfe71b220ce892023b536effc7e88ec733664"]},"offset":"45821883"},"text.js":{"size":10287,"integrity":{"algorithm":"SHA256","hash":"4bae97c68c68cc8c56fa873fcbcbaf6869da926f3f38ddd9cb6ca22e8f60da41","blockSize":4194304,"blocks":["4bae97c68c68cc8c56fa873fcbcbaf6869da926f3f38ddd9cb6ca22e8f60da41"]},"offset":"45822735"},"es2015":{"files":{"index.js":{"size":11104,"integrity":{"algorithm":"SHA256","hash":"8718dea4d28647912918dba60545890dc10ae672bfb186b6ec0af3fc5e826137","blockSize":4194304,"blocks":["8718dea4d28647912918dba60545890dc10ae672bfb186b6ec0af3fc5e826137"]},"offset":"45833022"},"text.js":{"size":11105,"integrity":{"algorithm":"SHA256","hash":"aad6b3f580511fe1fd70ae4ddadff4f4ec6bd5143f1a53b93c7e16eaf608d552","blockSize":4194304,"blocks":["aad6b3f580511fe1fd70ae4ddadff4f4ec6bd5143f1a53b93c7e16eaf608d552"]},"offset":"45844126"}}}}}}}}},"string.prototype.trimend":{"files":{".editorconfig":{"size":286,"integrity":{"algorithm":"SHA256","hash":"0a73be687a86b6f0e5494b1be555fcfbb886108794948837170c28f18820aae2","blockSize":4194304,"blocks":["0a73be687a86b6f0e5494b1be555fcfbb886108794948837170c28f18820aae2"]},"offset":"38208531"},".nycrc":{"size":139,"integrity":{"algorithm":"SHA256","hash":"997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a","blockSize":4194304,"blocks":["997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a"]},"offset":"38208817"},"LICENSE":{"size":1073,"integrity":{"algorithm":"SHA256","hash":"a5e49293b629194f16e08c965807b34a4a8f45aa2735658a3b0e3c1478a34b30","blockSize":4194304,"blocks":["a5e49293b629194f16e08c965807b34a4a8f45aa2735658a3b0e3c1478a34b30"]},"offset":"38208956"},"auto.js":{"size":36,"integrity":{"algorithm":"SHA256","hash":"8a28142fdc864763727d7cfe6a19b5dbcdf5e1861207bd2c122082336a6c3221","blockSize":4194304,"blocks":["8a28142fdc864763727d7cfe6a19b5dbcdf5e1861207bd2c122082336a6c3221"]},"offset":"38210029"},"implementation.js":{"size":644,"integrity":{"algorithm":"SHA256","hash":"cfe03401802fe33e12d527782062fccca03dc3f196c430bd1c5a700b9faa97b4","blockSize":4194304,"blocks":["cfe03401802fe33e12d527782062fccca03dc3f196c430bd1c5a700b9faa97b4"]},"offset":"38210065"},"index.js":{"size":573,"integrity":{"algorithm":"SHA256","hash":"8cd13b94c3664b0b6d0f93f406c08c05c32eb6fa3fcc5e15939a6bc25d659379","blockSize":4194304,"blocks":["8cd13b94c3664b0b6d0f93f406c08c05c32eb6fa3fcc5e15939a6bc25d659379"]},"offset":"38210709"},"package.json":{"size":1040,"integrity":{"algorithm":"SHA256","hash":"72ba6114a3d0df7faa2390b4d6da8e8ced1b29ad8225ee4464eafe40437564e9","blockSize":4194304,"blocks":["72ba6114a3d0df7faa2390b4d6da8e8ced1b29ad8225ee4464eafe40437564e9"]},"offset":"38211282"},"polyfill.js":{"size":458,"integrity":{"algorithm":"SHA256","hash":"eebc2dd839270a93a8fd8cb8e606340b834a35bdd039c4e78e408fc5aa438270","blockSize":4194304,"blocks":["eebc2dd839270a93a8fd8cb8e606340b834a35bdd039c4e78e408fc5aa438270"]},"offset":"38212322"},"shim.js":{"size":329,"integrity":{"algorithm":"SHA256","hash":"26bc7427832cd4d41a828599a1f4f15d1678add5a41d298b1fb3a6971ac0651c","blockSize":4194304,"blocks":["26bc7427832cd4d41a828599a1f4f15d1678add5a41d298b1fb3a6971ac0651c"]},"offset":"38212780"}}},"string.prototype.trimstart":{"files":{".editorconfig":{"size":286,"integrity":{"algorithm":"SHA256","hash":"0a73be687a86b6f0e5494b1be555fcfbb886108794948837170c28f18820aae2","blockSize":4194304,"blocks":["0a73be687a86b6f0e5494b1be555fcfbb886108794948837170c28f18820aae2"]},"offset":"38213109"},".nycrc":{"size":139,"integrity":{"algorithm":"SHA256","hash":"997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a","blockSize":4194304,"blocks":["997785c50b0773e5e18bf15550fbf57823c634fefe623cd37b3c83696402ad0a"]},"offset":"38213395"},"LICENSE":{"size":1073,"integrity":{"algorithm":"SHA256","hash":"a5e49293b629194f16e08c965807b34a4a8f45aa2735658a3b0e3c1478a34b30","blockSize":4194304,"blocks":["a5e49293b629194f16e08c965807b34a4a8f45aa2735658a3b0e3c1478a34b30"]},"offset":"38213534"},"auto.js":{"size":36,"integrity":{"algorithm":"SHA256","hash":"8a28142fdc864763727d7cfe6a19b5dbcdf5e1861207bd2c122082336a6c3221","blockSize":4194304,"blocks":["8a28142fdc864763727d7cfe6a19b5dbcdf5e1861207bd2c122082336a6c3221"]},"offset":"38214607"},"implementation.js":{"size":650,"integrity":{"algorithm":"SHA256","hash":"2176b41e6d057516a25daef1e5d1625099d4d815b32ea6f4039206911daffa91","blockSize":4194304,"blocks":["2176b41e6d057516a25daef1e5d1625099d4d815b32ea6f4039206911daffa91"]},"offset":"38214643"},"index.js":{"size":573,"integrity":{"algorithm":"SHA256","hash":"8cd13b94c3664b0b6d0f93f406c08c05c32eb6fa3fcc5e15939a6bc25d659379","blockSize":4194304,"blocks":["8cd13b94c3664b0b6d0f93f406c08c05c32eb6fa3fcc5e15939a6bc25d659379"]},"offset":"38215293"},"package.json":{"size":1046,"integrity":{"algorithm":"SHA256","hash":"9be249d1959d790b706ea4e48de163f855c0499211aeb3c8efeeda74b20989a9","blockSize":4194304,"blocks":["9be249d1959d790b706ea4e48de163f855c0499211aeb3c8efeeda74b20989a9"]},"offset":"38215866"},"polyfill.js":{"size":463,"integrity":{"algorithm":"SHA256","hash":"cca8bb5b4547b6325f08ca7a3e8f7bd97468a41c55fb7e20072d077fbfdb3838","blockSize":4194304,"blocks":["cca8bb5b4547b6325f08ca7a3e8f7bd97468a41c55fb7e20072d077fbfdb3838"]},"offset":"38216912"},"shim.js":{"size":337,"integrity":{"algorithm":"SHA256","hash":"9137912ba405be18ec1efbf454c397efe156adfd0610f7344716aa75117455af","blockSize":4194304,"blocks":["9137912ba405be18ec1efbf454c397efe156adfd0610f7344716aa75117455af"]},"offset":"38217375"}}},"string_decoder":{"files":{"LICENSE":{"size":2338,"integrity":{"algorithm":"SHA256","hash":"11f2aafb37d06b3ee5bdaf06e9811141d0da05263c316f3d627f45c20d43261b","blockSize":4194304,"blocks":["11f2aafb37d06b3ee5bdaf06e9811141d0da05263c316f3d627f45c20d43261b"]},"offset":"38217712"},"package.json":{"size":542,"integrity":{"algorithm":"SHA256","hash":"420c400885ef61e878b7839d8490a7c5fd19ac9d704a30c55acce3c72daffd4a","blockSize":4194304,"blocks":["420c400885ef61e878b7839d8490a7c5fd19ac9d704a30c55acce3c72daffd4a"]},"offset":"38220050"},"lib":{"files":{"string_decoder.js":{"size":9465,"integrity":{"algorithm":"SHA256","hash":"f1d36d47b2c579063392c1a68963467f2d4f51a069af09eb068d974c63ee3b37","blockSize":4194304,"blocks":["f1d36d47b2c579063392c1a68963467f2d4f51a069af09eb068d974c63ee3b37"]},"offset":"38220592"}}},"node_modules":{"files":{"safe-buffer":{"files":{"LICENSE":{"size":1081,"integrity":{"algorithm":"SHA256","hash":"c7cc929b57080f4b9d0c6cf57669f0463fc5b39906344dfc8d3bc43426b30eac","blockSize":4194304,"blocks":["c7cc929b57080f4b9d0c6cf57669f0463fc5b39906344dfc8d3bc43426b30eac"]},"offset":"45855231"},"index.js":{"size":1670,"integrity":{"algorithm":"SHA256","hash":"184d5c4a83512e3f49d4d5b52f7073f601f933bad11f1fbb3ad364ca5e6478e1","blockSize":4194304,"blocks":["184d5c4a83512e3f49d4d5b52f7073f601f933bad11f1fbb3ad364ca5e6478e1"]},"offset":"45856312"},"package.json":{"size":774,"integrity":{"algorithm":"SHA256","hash":"453bbe16b032826e5ab4f30af0c470f7c256706e0301e7bffbd6b49317c2124a","blockSize":4194304,"blocks":["453bbe16b032826e5ab4f30af0c470f7c256706e0301e7bffbd6b49317c2124a"]},"offset":"45857982"}}}}}}},"strip-ansi":{"files":{"index.js":{"size":154,"integrity":{"algorithm":"SHA256","hash":"bf37cd692bf030c2ec270945bc26aa8b19ad379fa5916f12304758f709ab0978","blockSize":4194304,"blocks":["bf37cd692bf030c2ec270945bc26aa8b19ad379fa5916f12304758f709ab0978"]},"offset":"38230057"},"license":{"size":1109,"integrity":{"algorithm":"SHA256","hash":"48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0","blockSize":4194304,"blocks":["48da2f39e100d4085767e94966b43f4fa95ff6a0698fba57ed460914e35f94a0"]},"offset":"38230211"},"package.json":{"size":511,"integrity":{"algorithm":"SHA256","hash":"4518dec682055621a82c1480a6c33479a7b6ae7d17019ccc4799b86e9be4d4d7","blockSize":4194304,"blocks":["4518dec682055621a82c1480a6c33479a7b6ae7d17019ccc4799b86e9be4d4d7"]},"offset":"38231320"}}},"tar":{"files":{"LICENSE":{"size":765,"integrity":{"algorithm":"SHA256","hash":"4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b","blockSize":4194304,"blocks":["4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b"]},"offset":"38231831"},"index.js":{"size":683,"integrity":{"algorithm":"SHA256","hash":"ad28644733a1ac0ebdf0fa39d9ae6482a7c5fe76a3878ca66fd3dc5eee1af1e7","blockSize":4194304,"blocks":["ad28644733a1ac0ebdf0fa39d9ae6482a7c5fe76a3878ca66fd3dc5eee1af1e7"]},"offset":"38232596"},"package.json":{"size":1014,"integrity":{"algorithm":"SHA256","hash":"1e3e33345f404ee4c4293726ffe108a6c91c4b803438bfe5df74d81c010abe29","blockSize":4194304,"blocks":["1e3e33345f404ee4c4293726ffe108a6c91c4b803438bfe5df74d81c010abe29"]},"offset":"38233279"},"lib":{"files":{"create.js":{"size":2351,"integrity":{"algorithm":"SHA256","hash":"634f524c1e609272761a3e9b09320f66d24a584e9d79925a594524a3c4824b55","blockSize":4194304,"blocks":["634f524c1e609272761a3e9b09320f66d24a584e9d79925a594524a3c4824b55"]},"offset":"38234293"},"extract.js":{"size":2804,"integrity":{"algorithm":"SHA256","hash":"c458d64db22c929f5c59a1b6535c6a5c6dc4930efb484106110c403e6b3e204d","blockSize":4194304,"blocks":["c458d64db22c929f5c59a1b6535c6a5c6dc4930efb484106110c403e6b3e204d"]},"offset":"38236644"},"get-write-flag.js":{"size":921,"integrity":{"algorithm":"SHA256","hash":"a856006693499f10e3b9ff08dc0a81bfe54451322c3a1312d891fac5fc150c7e","blockSize":4194304,"blocks":["a856006693499f10e3b9ff08dc0a81bfe54451322c3a1312d891fac5fc150c7e"]},"offset":"38239448"},"header.js":{"size":8979,"integrity":{"algorithm":"SHA256","hash":"286dcb10c9612f4f0a6cbd114fcb9a743ea876c6ccf3dd93d5ec6c2957fa0583","blockSize":4194304,"blocks":["286dcb10c9612f4f0a6cbd114fcb9a743ea876c6ccf3dd93d5ec6c2957fa0583"]},"offset":"38240369"},"high-level-opt.js":{"size":760,"integrity":{"algorithm":"SHA256","hash":"0296c4419ccb96b4aab5dfe04e46982c83d5cd30c099a65b5b037f5c223d062f","blockSize":4194304,"blocks":["0296c4419ccb96b4aab5dfe04e46982c83d5cd30c099a65b5b037f5c223d062f"]},"offset":"38249348"},"large-numbers.js":{"size":2179,"integrity":{"algorithm":"SHA256","hash":"66888be11976226cb30cb32015efd5ec74633ec312778ee30f0cc09466c9fbf1","blockSize":4194304,"blocks":["66888be11976226cb30cb32015efd5ec74633ec312778ee30f0cc09466c9fbf1"]},"offset":"38250108"},"list.js":{"size":3166,"integrity":{"algorithm":"SHA256","hash":"103a086a1e1d8182e8248b7c058c1d7a38c56b4ba614d516bd71ae898a76cb07","blockSize":4194304,"blocks":["103a086a1e1d8182e8248b7c058c1d7a38c56b4ba614d516bd71ae898a76cb07"]},"offset":"38252287"},"mkdir.js":{"size":5337,"integrity":{"algorithm":"SHA256","hash":"8024240d520c6551253912dc5ff67421290067ab8375a14e2345333879697053","blockSize":4194304,"blocks":["8024240d520c6551253912dc5ff67421290067ab8375a14e2345333879697053"]},"offset":"38255453"},"mode-fix.js":{"size":619,"integrity":{"algorithm":"SHA256","hash":"5f58c33e1d856a194381733390ccdd430f601b07d3a6e10c60be15c314fdfe06","blockSize":4194304,"blocks":["5f58c33e1d856a194381733390ccdd430f601b07d3a6e10c60be15c314fdfe06"]},"offset":"38260790"},"normalize-unicode.js":{"size":405,"integrity":{"algorithm":"SHA256","hash":"519e7008ca6ea2fa3c1abb5f59365c15cf2153c97885bc9797759fb4314637e8","blockSize":4194304,"blocks":["519e7008ca6ea2fa3c1abb5f59365c15cf2153c97885bc9797759fb4314637e8"]},"offset":"38261409"},"normalize-windows-path.js":{"size":410,"integrity":{"algorithm":"SHA256","hash":"d585da94804cf3c623eda666c6068bc513b5f3bed1fa44e0f15bcc98b38fbdd2","blockSize":4194304,"blocks":["d585da94804cf3c623eda666c6068bc513b5f3bed1fa44e0f15bcc98b38fbdd2"]},"offset":"38261814"},"pack.js":{"size":9443,"integrity":{"algorithm":"SHA256","hash":"5c51bbb4760289076fc782c481fc1014c522c2eea87d6966798612c0b49c1491","blockSize":4194304,"blocks":["5c51bbb4760289076fc782c481fc1014c522c2eea87d6966798612c0b49c1491"]},"offset":"38262224"},"parse.js":{"size":14189,"integrity":{"algorithm":"SHA256","hash":"edb2629212b4d588e63f2fd5b2f29a5dcd159f398b28609911a046afbd3c799a","blockSize":4194304,"blocks":["edb2629212b4d588e63f2fd5b2f29a5dcd159f398b28609911a046afbd3c799a"]},"offset":"38271667"},"path-reservations.js":{"size":4306,"integrity":{"algorithm":"SHA256","hash":"e692ebd1fb820f2b6bdf0fa644f40822cea3ca7598968693802815a4b0a5696f","blockSize":4194304,"blocks":["e692ebd1fb820f2b6bdf0fa644f40822cea3ca7598968693802815a4b0a5696f"]},"offset":"38285856"},"pax.js":{"size":4017,"integrity":{"algorithm":"SHA256","hash":"73676119674252f98357425838ea9a8cb449aac740251407809bb7e34e895165","blockSize":4194304,"blocks":["73676119674252f98357425838ea9a8cb449aac740251407809bb7e34e895165"]},"offset":"38290162"},"read-entry.js":{"size":2780,"integrity":{"algorithm":"SHA256","hash":"598210a4d08360456c0b75a09fcbdfe87e9bab9bc2420ea706c8ba6e7f8bdcda","blockSize":4194304,"blocks":["598210a4d08360456c0b75a09fcbdfe87e9bab9bc2420ea706c8ba6e7f8bdcda"]},"offset":"38294179"},"replace.js":{"size":5477,"integrity":{"algorithm":"SHA256","hash":"c4346d5d65b043e35ccff2303a284055348853eec2de89405f7c1db30f9add0c","blockSize":4194304,"blocks":["c4346d5d65b043e35ccff2303a284055348853eec2de89405f7c1db30f9add0c"]},"offset":"38296959"},"strip-absolute-path.js":{"size":918,"integrity":{"algorithm":"SHA256","hash":"910b3fafb10bae4401b38ca58f4b34adf9d73ea0c3382d696e7513140ca7ed8c","blockSize":4194304,"blocks":["910b3fafb10bae4401b38ca58f4b34adf9d73ea0c3382d696e7513140ca7ed8c"]},"offset":"38302436"},"strip-trailing-slashes.js":{"size":394,"integrity":{"algorithm":"SHA256","hash":"5b8dd9c3aa3c76a691a4a2e953d9d515bf4caee6281a1c7ea83ee78174957d08","blockSize":4194304,"blocks":["5b8dd9c3aa3c76a691a4a2e953d9d515bf4caee6281a1c7ea83ee78174957d08"]},"offset":"38303354"},"types.js":{"size":1096,"integrity":{"algorithm":"SHA256","hash":"d4de2e5c48d89e3c6666063ff45d1ffbe9dc975b7262903267c824b8f596910e","blockSize":4194304,"blocks":["d4de2e5c48d89e3c6666063ff45d1ffbe9dc975b7262903267c824b8f596910e"]},"offset":"38303748"},"unpack.js":{"size":25047,"integrity":{"algorithm":"SHA256","hash":"17508fc7c85214d88712fdcd5274601972202e23d67d86eff00a9806dd051610","blockSize":4194304,"blocks":["17508fc7c85214d88712fdcd5274601972202e23d67d86eff00a9806dd051610"]},"offset":"38304844"},"update.js":{"size":842,"integrity":{"algorithm":"SHA256","hash":"36965f2d497a48f574367b742a15d166d1cdc58f3cf8693c556f79d3674cc0bc","blockSize":4194304,"blocks":["36965f2d497a48f574367b742a15d166d1cdc58f3cf8693c556f79d3674cc0bc"]},"offset":"38329891"},"warn-mixin.js":{"size":697,"integrity":{"algorithm":"SHA256","hash":"9b90105f7c9a422da20703902aeb74b4adbeeccacdb7880a09814ff3e92b7205","blockSize":4194304,"blocks":["9b90105f7c9a422da20703902aeb74b4adbeeccacdb7880a09814ff3e92b7205"]},"offset":"38330733"},"winchars.js":{"size":535,"integrity":{"algorithm":"SHA256","hash":"5cb97674101a0d79920df164ba402c8da0941960823daab3a16c8b06a12a1aed","blockSize":4194304,"blocks":["5cb97674101a0d79920df164ba402c8da0941960823daab3a16c8b06a12a1aed"]},"offset":"38331430"},"write-entry.js":{"size":15111,"integrity":{"algorithm":"SHA256","hash":"88b1726cd4df392732968b57713f97ccac0b79de535bdc27c0219e608e5c7b4c","blockSize":4194304,"blocks":["88b1726cd4df392732968b57713f97ccac0b79de535bdc27c0219e608e5c7b4c"]},"offset":"38331965"}}},"node_modules":{"files":{"mkdirp":{"files":{"LICENSE":{"size":1166,"integrity":{"algorithm":"SHA256","hash":"144c935613e823350f7798d19da78b5e8315a79af5c2a3744fd85cd61baf07ee","blockSize":4194304,"blocks":["144c935613e823350f7798d19da78b5e8315a79af5c2a3744fd85cd61baf07ee"]},"offset":"45858756"},"index.js":{"size":1029,"integrity":{"algorithm":"SHA256","hash":"fd78d08648851e2db1b19e1271a90ad55b640d0b6ae2b20ad11c94aeec847b33","blockSize":4194304,"blocks":["fd78d08648851e2db1b19e1271a90ad55b640d0b6ae2b20ad11c94aeec847b33"]},"offset":"45859922"},"package.json":{"size":510,"integrity":{"algorithm":"SHA256","hash":"1aa4286767982171365b9a65e85cb7d6a34ce04b26fc76df7f2c3d6a1918970b","blockSize":4194304,"blocks":["1aa4286767982171365b9a65e85cb7d6a34ce04b26fc76df7f2c3d6a1918970b"]},"offset":"45860951"},"lib":{"files":{"find-made.js":{"size":763,"integrity":{"algorithm":"SHA256","hash":"743b7fd8fd5ec11dd6a71800650a65079f5bd3f08cbabb5c8dfadf06d138d755","blockSize":4194304,"blocks":["743b7fd8fd5ec11dd6a71800650a65079f5bd3f08cbabb5c8dfadf06d138d755"]},"offset":"45861461"},"mkdirp-manual.js":{"size":1610,"integrity":{"algorithm":"SHA256","hash":"492bedcd991014695803a3788f6c520df9c9b46fc315c9237debfdb713d75aaf","blockSize":4194304,"blocks":["492bedcd991014695803a3788f6c520df9c9b46fc315c9237debfdb713d75aaf"]},"offset":"45862224"},"mkdirp-native.js":{"size":969,"integrity":{"algorithm":"SHA256","hash":"bb01894bca455d7cc47c4957687293ef0fa740fc50e9af1351517e7ad667d00a","blockSize":4194304,"blocks":["bb01894bca455d7cc47c4957687293ef0fa740fc50e9af1351517e7ad667d00a"]},"offset":"45863834"},"opts-arg.js":{"size":784,"integrity":{"algorithm":"SHA256","hash":"a9a3e4f1700201c1ecb1d5ebb33d6da69ecf3db23546c4d077c730ae42a0a6a9","blockSize":4194304,"blocks":["a9a3e4f1700201c1ecb1d5ebb33d6da69ecf3db23546c4d077c730ae42a0a6a9"]},"offset":"45864803"},"path-arg.js":{"size":730,"integrity":{"algorithm":"SHA256","hash":"93abafb7a89f0fe00c662cd8f4100f4aeef7d5b0a068b8a9af81b38f03d21325","blockSize":4194304,"blocks":["93abafb7a89f0fe00c662cd8f4100f4aeef7d5b0a068b8a9af81b38f03d21325"]},"offset":"45865587"},"use-native.js":{"size":448,"integrity":{"algorithm":"SHA256","hash":"fed1e14f4d3a650493666697889e77ebb3be6ccb6054e9f55197566d1cf0eea8","blockSize":4194304,"blocks":["fed1e14f4d3a650493666697889e77ebb3be6ccb6054e9f55197566d1cf0eea8"]},"offset":"45866317"}}},"bin":{"files":{"cmd.js":{"size":1830,"integrity":{"algorithm":"SHA256","hash":"a5bf5e02584a7d72e4954f45e6efd60965315a78237179072de58cd8a161b8b6","blockSize":4194304,"blocks":["a5bf5e02584a7d72e4954f45e6efd60965315a78237179072de58cd8a161b8b6"]},"offset":"45866765"}}}}}}}}},"tar-fs":{"files":{"LICENSE":{"size":1078,"integrity":{"algorithm":"SHA256","hash":"3fe8d55a98dbf260eace67c00cf9bc53edb46234e840098a0b93df3096b97fb6","blockSize":4194304,"blocks":["3fe8d55a98dbf260eace67c00cf9bc53edb46234e840098a0b93df3096b97fb6"]},"offset":"38347076"},"index.js":{"size":9587,"integrity":{"algorithm":"SHA256","hash":"593e90fc29525bfb805d60494a94a43cc631ca756092fa378f418cde709c40f3","blockSize":4194304,"blocks":["593e90fc29525bfb805d60494a94a43cc631ca756092fa378f418cde709c40f3"]},"offset":"38348154"},"package.json":{"size":590,"integrity":{"algorithm":"SHA256","hash":"b59dd8504f10c9f56641b4cec5ec100f404c57b316508ce3dc8dfcdd9f60a718","blockSize":4194304,"blocks":["b59dd8504f10c9f56641b4cec5ec100f404c57b316508ce3dc8dfcdd9f60a718"]},"offset":"38357741"},"node_modules":{"files":{"chownr":{"files":{"LICENSE":{"size":765,"integrity":{"algorithm":"SHA256","hash":"4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b","blockSize":4194304,"blocks":["4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b"]},"offset":"45868595"},"chownr.js":{"size":4275,"integrity":{"algorithm":"SHA256","hash":"529b285703d29b8ab31ead64bd1f64146bac12147cc09ceb4b25f0db87a12c96","blockSize":4194304,"blocks":["529b285703d29b8ab31ead64bd1f64146bac12147cc09ceb4b25f0db87a12c96"]},"offset":"45869360"},"package.json":{"size":452,"integrity":{"algorithm":"SHA256","hash":"7e40e46248f8462236218733a458420c5c56bf2828030916758bfc9cd258a7e1","blockSize":4194304,"blocks":["7e40e46248f8462236218733a458420c5c56bf2828030916758bfc9cd258a7e1"]},"offset":"45873635"}}}}}}},"tar-stream":{"files":{"LICENSE":{"size":1078,"integrity":{"algorithm":"SHA256","hash":"3fe8d55a98dbf260eace67c00cf9bc53edb46234e840098a0b93df3096b97fb6","blockSize":4194304,"blocks":["3fe8d55a98dbf260eace67c00cf9bc53edb46234e840098a0b93df3096b97fb6"]},"offset":"38358331"},"extract.js":{"size":5960,"integrity":{"algorithm":"SHA256","hash":"6b5edd072ee880c1c23c540d92089d105ea342f9dcbacbf04fda934c090b8a0d","blockSize":4194304,"blocks":["6b5edd072ee880c1c23c540d92089d105ea342f9dcbacbf04fda934c090b8a0d"]},"offset":"38359409"},"headers.js":{"size":7969,"integrity":{"algorithm":"SHA256","hash":"3bcd61e952038c935c2ea17a891f223b218b3a08decc75c4ea5dec9123ae38a9","blockSize":4194304,"blocks":["3bcd61e952038c935c2ea17a891f223b218b3a08decc75c4ea5dec9123ae38a9"]},"offset":"38365369"},"index.js":{"size":72,"integrity":{"algorithm":"SHA256","hash":"0db9eceef5224dbc34c224c398b50eef4b99f937c80c81f660928615a248ed4f","blockSize":4194304,"blocks":["0db9eceef5224dbc34c224c398b50eef4b99f937c80c81f660928615a248ed4f"]},"offset":"38373338"},"pack.js":{"size":5626,"integrity":{"algorithm":"SHA256","hash":"dfa9a306e8edf3c8b0445d5cc772e6a0a74382dfcbf19ebd3be06e8f31fbf94e","blockSize":4194304,"blocks":["dfa9a306e8edf3c8b0445d5cc772e6a0a74382dfcbf19ebd3be06e8f31fbf94e"]},"offset":"38373410"},"package.json":{"size":924,"integrity":{"algorithm":"SHA256","hash":"03d0a975daeb3544fe00f25f48fb7e8455eaef2bf0b3c966821a4ced10888666","blockSize":4194304,"blocks":["03d0a975daeb3544fe00f25f48fb7e8455eaef2bf0b3c966821a4ced10888666"]},"offset":"38379036"},"sandbox.js":{"size":371,"integrity":{"algorithm":"SHA256","hash":"08c242a5ff86e63801840b6cd6524102f9d044c83369e5245f140bc9994622e9","blockSize":4194304,"blocks":["08c242a5ff86e63801840b6cd6524102f9d044c83369e5245f140bc9994622e9"]},"offset":"38379960"},"node_modules":{"files":{"bl":{"files":{"BufferList.js":{"size":9524,"integrity":{"algorithm":"SHA256","hash":"cb21ad5d2dd255e2195460ecd5a0bdd65cff0adee2a9fd6c860951c22c9fd4b8","blockSize":4194304,"blocks":["cb21ad5d2dd255e2195460ecd5a0bdd65cff0adee2a9fd6c860951c22c9fd4b8"]},"offset":"45874087"},"LICENSE.md":{"size":1216,"integrity":{"algorithm":"SHA256","hash":"9377db95383c8befacf05c6e465d969d756edf178487ca1344fdf3ba147c596f","blockSize":4194304,"blocks":["9377db95383c8befacf05c6e465d969d756edf178487ca1344fdf3ba147c596f"]},"offset":"45883611"},"bl.js":{"size":2043,"integrity":{"algorithm":"SHA256","hash":"71e59aeed4af10ad4268bb35e4c51fe89c640ea9a3f1a9cb597594b02376e249","blockSize":4194304,"blocks":["71e59aeed4af10ad4268bb35e4c51fe89c640ea9a3f1a9cb597594b02376e249"]},"offset":"45884827"},"package.json":{"size":764,"integrity":{"algorithm":"SHA256","hash":"11fa3b7ac8caafcc005147e8dcb846bfa1a69fbee0c310ff5713253c47c3b7a0","blockSize":4194304,"blocks":["11fa3b7ac8caafcc005147e8dcb846bfa1a69fbee0c310ff5713253c47c3b7a0"]},"offset":"45886870"}}},"buffer":{"files":{"AUTHORS.md":{"size":2672,"integrity":{"algorithm":"SHA256","hash":"c30faf5cc3be9f99a672126ffa7f239e640c362be9e2dd4313d9e5310503d98d","blockSize":4194304,"blocks":["c30faf5cc3be9f99a672126ffa7f239e640c362be9e2dd4313d9e5310503d98d"]},"offset":"45887634"},"LICENSE":{"size":1106,"integrity":{"algorithm":"SHA256","hash":"06bafa45fdad2579ba0e43b0c9b2c6290287c99c4203c300254a462b38a307f6","blockSize":4194304,"blocks":["06bafa45fdad2579ba0e43b0c9b2c6290287c99c4203c300254a462b38a307f6"]},"offset":"45890306"},"index.js":{"size":50097,"integrity":{"algorithm":"SHA256","hash":"9fab6e5f345b42e0ab83cac4c0790d40b77b21ad6af47ace7364f3f6a1f8d8d4","blockSize":4194304,"blocks":["9fab6e5f345b42e0ab83cac4c0790d40b77b21ad6af47ace7364f3f6a1f8d8d4"]},"offset":"45891412"},"package.json":{"size":1306,"integrity":{"algorithm":"SHA256","hash":"ac70cf1e28576a37baafe0721a8dc829605482c630fee31c6af9429cc3e12c4f","blockSize":4194304,"blocks":["ac70cf1e28576a37baafe0721a8dc829605482c630fee31c6af9429cc3e12c4f"]},"offset":"45941509"}}}}}}},"tarn":{"files":{"LICENSE":{"size":1077,"integrity":{"algorithm":"SHA256","hash":"bc967aee45ef75dd5c46a9363b209fd2e0f3e5c64f3cd4e7504516738c174e63","blockSize":4194304,"blocks":["bc967aee45ef75dd5c46a9363b209fd2e0f3e5c64f3cd4e7504516738c174e63"]},"offset":"38380331"},"package.json":{"size":1137,"integrity":{"algorithm":"SHA256","hash":"5d2db61b99b7646f48eed377330bf1de54ff6652ac0c457d274461236eab87ee","blockSize":4194304,"blocks":["5d2db61b99b7646f48eed377330bf1de54ff6652ac0c457d274461236eab87ee"]},"offset":"38381408"},"dist":{"files":{"PendingOperation.js":{"size":1643,"integrity":{"algorithm":"SHA256","hash":"61316d35dc8dc69d801c4e7a94adf4b25b71dc6fed408067ec0b3139003dcb2b","blockSize":4194304,"blocks":["61316d35dc8dc69d801c4e7a94adf4b25b71dc6fed408067ec0b3139003dcb2b"]},"offset":"38382545"},"Pool.js":{"size":21554,"integrity":{"algorithm":"SHA256","hash":"50702f8c2d30a5842ffba55cb8bb5521f361f4ac550b9ce79352616082dc5fdc","blockSize":4194304,"blocks":["50702f8c2d30a5842ffba55cb8bb5521f361f4ac550b9ce79352616082dc5fdc"]},"offset":"38384188"},"PromiseInspection.js":{"size":479,"integrity":{"algorithm":"SHA256","hash":"9e261ea0f5ef3f12f4bc88c700fdcf881a457e8d578ae6d60d167323dc59919a","blockSize":4194304,"blocks":["9e261ea0f5ef3f12f4bc88c700fdcf881a457e8d578ae6d60d167323dc59919a"]},"offset":"38405742"},"Resource.js":{"size":535,"integrity":{"algorithm":"SHA256","hash":"690294d299df9a28b425334b266b5152b2460d22bcf5cfa21743d3d835135427","blockSize":4194304,"blocks":["690294d299df9a28b425334b266b5152b2460d22bcf5cfa21743d3d835135427"]},"offset":"38406221"},"TimeoutError.js":{"size":156,"integrity":{"algorithm":"SHA256","hash":"70e7b1b92eff388041647de25e968bf1ae161fc1980ef03b14cb57870c269a57","blockSize":4194304,"blocks":["70e7b1b92eff388041647de25e968bf1ae161fc1980ef03b14cb57870c269a57"]},"offset":"38406756"},"tarn.js":{"size":342,"integrity":{"algorithm":"SHA256","hash":"ed8a7d940438bb7918a2e4e3c8bbf89801ce81f5352c2fc50856a6b028e62f6c","blockSize":4194304,"blocks":["ed8a7d940438bb7918a2e4e3c8bbf89801ce81f5352c2fc50856a6b028e62f6c"]},"offset":"38406912"},"utils.js":{"size":1576,"integrity":{"algorithm":"SHA256","hash":"2cd7292eeba10bd3c7d202a1f668ebe7e74ece368000c2f17cc98acd010c73a8","blockSize":4194304,"blocks":["2cd7292eeba10bd3c7d202a1f668ebe7e74ece368000c2f17cc98acd010c73a8"]},"offset":"38407254"}}}}},"tedious":{"files":{"LICENSE":{"size":1081,"integrity":{"algorithm":"SHA256","hash":"c1d37390d0cffff19fb5c6a2f98c9a8daea51402b85afe1754b363df6c2b05dd","blockSize":4194304,"blocks":["c1d37390d0cffff19fb5c6a2f98c9a8daea51402b85afe1754b363df6c2b05dd"]},"offset":"38408830"},"package.json":{"size":2458,"integrity":{"algorithm":"SHA256","hash":"d6e85705080f08ba40c67cfaf61b20ba68a00b0cbfac22b17d8bbd1cdb455c2f","blockSize":4194304,"blocks":["d6e85705080f08ba40c67cfaf61b20ba68a00b0cbfac22b17d8bbd1cdb455c2f"]},"offset":"38409911"},"pull_request_template.md":{"size":762,"integrity":{"algorithm":"SHA256","hash":"3aee3a91754ca3177bce6900ee51ee7253113cd9c026b440f164089adbdbee2a","blockSize":4194304,"blocks":["3aee3a91754ca3177bce6900ee51ee7253113cd9c026b440f164089adbdbee2a"]},"offset":"38412369"},"tsconfig.json":{"size":581,"integrity":{"algorithm":"SHA256","hash":"5191269d968070be02143ed8a7347d5c72943d1ee51efd0f3505c6c24ae6602a","blockSize":4194304,"blocks":["5191269d968070be02143ed8a7347d5c72943d1ee51efd0f3505c6c24ae6602a"]},"offset":"38413131"},"lib":{"files":{"all-headers.js":{"size":2952,"integrity":{"algorithm":"SHA256","hash":"cbe423be6121d7dd2ffa13137401e36c3a3fc75ab245f0f8fc122ec7dd5ee12f","blockSize":4194304,"blocks":["cbe423be6121d7dd2ffa13137401e36c3a3fc75ab245f0f8fc122ec7dd5ee12f"]},"offset":"38413712"},"bulk-load-payload.js":{"size":2381,"integrity":{"algorithm":"SHA256","hash":"b037de7adccac15f2bc5021771803dddf60348a57f2c55c067fc4a8b19188320","blockSize":4194304,"blocks":["b037de7adccac15f2bc5021771803dddf60348a57f2c55c067fc4a8b19188320"]},"offset":"38416664"},"bulk-load.js":{"size":52987,"integrity":{"algorithm":"SHA256","hash":"e8dcf74d439dd14ba03d259c2a585894faf4256ddd18452ce9aeb8c907257661","blockSize":4194304,"blocks":["e8dcf74d439dd14ba03d259c2a585894faf4256ddd18452ce9aeb8c907257661"]},"offset":"38419045"},"collation.js":{"size":31390,"integrity":{"algorithm":"SHA256","hash":"56ab057df7793d083bb0af48ab1282934e70c4ec10b2d306abfb7e95b9beb640","blockSize":4194304,"blocks":["56ab057df7793d083bb0af48ab1282934e70c4ec10b2d306abfb7e95b9beb640"]},"offset":"38472032"},"connection.js":{"size":359569,"integrity":{"algorithm":"SHA256","hash":"7f3920b904d9d0b840aa94a7d3337cc0439bcef0674d551c492ec38b0a5d941b","blockSize":4194304,"blocks":["7f3920b904d9d0b840aa94a7d3337cc0439bcef0674d551c492ec38b0a5d941b"]},"offset":"38503422"},"connector.js":{"size":19222,"integrity":{"algorithm":"SHA256","hash":"c824a164ef22c4f084e48654c0332c8241a398f06b7233dfb2117c58eb492a41","blockSize":4194304,"blocks":["c824a164ef22c4f084e48654c0332c8241a398f06b7233dfb2117c58eb492a41"]},"offset":"38862991"},"data-type.js":{"size":36496,"integrity":{"algorithm":"SHA256","hash":"20bcdac3684b592f2d23636a3dbcb063cea410a3e1c6e7d8f6c25908b3892a69","blockSize":4194304,"blocks":["20bcdac3684b592f2d23636a3dbcb063cea410a3e1c6e7d8f6c25908b3892a69"]},"offset":"38882213"},"debug.js":{"size":7002,"integrity":{"algorithm":"SHA256","hash":"99c74d02d6aebae0d3f0e91a925eaf4152409cbd7046bc9238f3a2966566a4cd","blockSize":4194304,"blocks":["99c74d02d6aebae0d3f0e91a925eaf4152409cbd7046bc9238f3a2966566a4cd"]},"offset":"38918709"},"errors.js":{"size":2461,"integrity":{"algorithm":"SHA256","hash":"126bca1b4cb57e1b84bdacb94223976929d3a5eb3fe85a1bd775047edd3440d8","blockSize":4194304,"blocks":["126bca1b4cb57e1b84bdacb94223976929d3a5eb3fe85a1bd775047edd3440d8"]},"offset":"38925711"},"guid-parser.js":{"size":27673,"integrity":{"algorithm":"SHA256","hash":"b7afc179468fff3e6824c05c89df21dc73801a2e0b96b14335fd1f3e7180badf","blockSize":4194304,"blocks":["b7afc179468fff3e6824c05c89df21dc73801a2e0b96b14335fd1f3e7180badf"]},"offset":"38928172"},"incoming-message-stream.js":{"size":10429,"integrity":{"algorithm":"SHA256","hash":"d5bc8095827972ca36682d8aeab09bc06cc9189b02ee274b3887a8fd00a08166","blockSize":4194304,"blocks":["d5bc8095827972ca36682d8aeab09bc06cc9189b02ee274b3887a8fd00a08166"]},"offset":"38955845"},"instance-lookup.js":{"size":13475,"integrity":{"algorithm":"SHA256","hash":"e3618e0cca5d4c76d29786240a7ba8dffbfd44af3026d90f3ab7deeccd7034cc","blockSize":4194304,"blocks":["e3618e0cca5d4c76d29786240a7ba8dffbfd44af3026d90f3ab7deeccd7034cc"]},"offset":"38966274"},"library.js":{"size":428,"integrity":{"algorithm":"SHA256","hash":"f037a9ea65b148e688f6a466bb63968d33d77590ce5308546a9dfa4138fa6192","blockSize":4194304,"blocks":["f037a9ea65b148e688f6a466bb63968d33d77590ce5308546a9dfa4138fa6192"]},"offset":"38979749"},"login7-payload.js":{"size":52930,"integrity":{"algorithm":"SHA256","hash":"1f959838c406918c2ca8b544a11ece6fcd790edc657c3c5392ed21654d87f843","blockSize":4194304,"blocks":["1f959838c406918c2ca8b544a11ece6fcd790edc657c3c5392ed21654d87f843"]},"offset":"38980177"},"message-io.js":{"size":23654,"integrity":{"algorithm":"SHA256","hash":"1decc9ff2a138e258c5dda8b55b6580006819f47eb9cff4590a348812c42f663","blockSize":4194304,"blocks":["1decc9ff2a138e258c5dda8b55b6580006819f47eb9cff4590a348812c42f663"]},"offset":"39033107"},"message.js":{"size":1813,"integrity":{"algorithm":"SHA256","hash":"d349bc3c01ae3c5e4a588028839032c7b0f2fe33ff3263cc886d7b4171f8146a","blockSize":4194304,"blocks":["d349bc3c01ae3c5e4a588028839032c7b0f2fe33ff3263cc886d7b4171f8146a"]},"offset":"39056761"},"metadata-parser.js":{"size":29380,"integrity":{"algorithm":"SHA256","hash":"c2862c144dcee636c9e1521647c38e7dfff3117d5fae9422435afbf202f0adf4","blockSize":4194304,"blocks":["c2862c144dcee636c9e1521647c38e7dfff3117d5fae9422435afbf202f0adf4"]},"offset":"39058574"},"ntlm-payload.js":{"size":23552,"integrity":{"algorithm":"SHA256","hash":"5ae8ac84750a9b2737b4364a8f77b4926d3818a625075d37a57ae12eb11d926c","blockSize":4194304,"blocks":["5ae8ac84750a9b2737b4364a8f77b4926d3818a625075d37a57ae12eb11d926c"]},"offset":"39087954"},"ntlm.js":{"size":12588,"integrity":{"algorithm":"SHA256","hash":"239fa38b40dd5a45ce7996860e90cf8054674e59ff6f1b9146b9374d71a9d9f0","blockSize":4194304,"blocks":["239fa38b40dd5a45ce7996860e90cf8054674e59ff6f1b9146b9374d71a9d9f0"]},"offset":"39111506"},"outgoing-message-stream.js":{"size":9431,"integrity":{"algorithm":"SHA256","hash":"5250984b0666c2dab69f6257df784a54f26c93da00a17b5ec867e8594c82580e","blockSize":4194304,"blocks":["5250984b0666c2dab69f6257df784a54f26c93da00a17b5ec867e8594c82580e"]},"offset":"39124094"},"packet.js":{"size":22687,"integrity":{"algorithm":"SHA256","hash":"801d5e9388f5a697f494f749277b62629e0006b0751642063435bbcd00f92a5b","blockSize":4194304,"blocks":["801d5e9388f5a697f494f749277b62629e0006b0751642063435bbcd00f92a5b"]},"offset":"39133525"},"prelogin-payload.js":{"size":25743,"integrity":{"algorithm":"SHA256","hash":"a4bb600359f82796448a0f135141b085d88c62cda5a6ef5ca1a8c4e41e8552be","blockSize":4194304,"blocks":["a4bb600359f82796448a0f135141b085d88c62cda5a6ef5ca1a8c4e41e8552be"]},"offset":"39156212"},"request.js":{"size":36717,"integrity":{"algorithm":"SHA256","hash":"82c9bd21beb6054946293849a49b198623051820d757d8622fd03bf734356c56","blockSize":4194304,"blocks":["82c9bd21beb6054946293849a49b198623051820d757d8622fd03bf734356c56"]},"offset":"39181955"},"rpcrequest-payload.js":{"size":12472,"integrity":{"algorithm":"SHA256","hash":"54188514f276c622bf837b22522946355369f6904364e78e22528ddd31b92d1d","blockSize":4194304,"blocks":["54188514f276c622bf837b22522946355369f6904364e78e22528ddd31b92d1d"]},"offset":"39218672"},"sender.js":{"size":11283,"integrity":{"algorithm":"SHA256","hash":"6e57a323e48143387bee256a4e6b56de409662d3e24827a2baa2fda6e976f5bc","blockSize":4194304,"blocks":["6e57a323e48143387bee256a4e6b56de409662d3e24827a2baa2fda6e976f5bc"]},"offset":"39231144"},"special-stored-procedure.js":{"size":2214,"integrity":{"algorithm":"SHA256","hash":"07e0ff78bb23bbd7aa6624a0f3c7b731422ec2ec7b8eda605fa919ad6ba0e8ae","blockSize":4194304,"blocks":["07e0ff78bb23bbd7aa6624a0f3c7b731422ec2ec7b8eda605fa919ad6ba0e8ae"]},"offset":"39242427"},"sqlbatch-payload.js":{"size":4045,"integrity":{"algorithm":"SHA256","hash":"f8f8a7d0215e4c683c3f013ef557d0db0a58a05f3830bc4973bc6f5064e4b76a","blockSize":4194304,"blocks":["f8f8a7d0215e4c683c3f013ef557d0db0a58a05f3830bc4973bc6f5064e4b76a"]},"offset":"39244641"},"tds-versions.js":{"size":1435,"integrity":{"algorithm":"SHA256","hash":"4bfdfd9ff3e8b49bc048bd0043620363d2a8a5a1252ed7c74a02f41a91a4ad56","blockSize":4194304,"blocks":["4bfdfd9ff3e8b49bc048bd0043620363d2a8a5a1252ed7c74a02f41a91a4ad56"]},"offset":"39248686"},"tedious.js":{"size":3651,"integrity":{"algorithm":"SHA256","hash":"18e0f0afd7f9e2cb4c415d79b5df39e996d32e369c7dbe8d836f58a323dd8205","blockSize":4194304,"blocks":["18e0f0afd7f9e2cb4c415d79b5df39e996d32e369c7dbe8d836f58a323dd8205"]},"offset":"39250121"},"transaction.js":{"size":17091,"integrity":{"algorithm":"SHA256","hash":"e4699596ea4c02ae6a8615a93dee02f593112cc7ab159661eecb74ff88f943ad","blockSize":4194304,"blocks":["e4699596ea4c02ae6a8615a93dee02f593112cc7ab159661eecb74ff88f943ad"]},"offset":"39253772"},"transient-error-lookup.js":{"size":2257,"integrity":{"algorithm":"SHA256","hash":"37b5c20a517bfa8a43edcb1ade168dea1611e0ec56072637a0b490e4fef2d663","blockSize":4194304,"blocks":["37b5c20a517bfa8a43edcb1ade168dea1611e0ec56072637a0b490e4fef2d663"]},"offset":"39270863"},"value-parser.js":{"size":74372,"integrity":{"algorithm":"SHA256","hash":"9887a446e39f6298b38bad633e5dcec774ff28f706494f08811d351c493a8491","blockSize":4194304,"blocks":["9887a446e39f6298b38bad633e5dcec774ff28f706494f08811d351c493a8491"]},"offset":"39273120"},"utils":{"files":{"with-timeout.js":{"size":4461,"integrity":{"algorithm":"SHA256","hash":"0369b4c649a044db6d3c51f2f52368204415416d54e5188e5cdbd56412c4a999","blockSize":4194304,"blocks":["0369b4c649a044db6d3c51f2f52368204415416d54e5188e5cdbd56412c4a999"]},"offset":"39347492"}}},"tracking-buffer":{"files":{"writable-tracking-buffer.js":{"size":31580,"integrity":{"algorithm":"SHA256","hash":"776ef0f38dbba9093281649d0b0dd2fca6a1dc8ac3b4e86d7552894c83758626","blockSize":4194304,"blocks":["776ef0f38dbba9093281649d0b0dd2fca6a1dc8ac3b4e86d7552894c83758626"]},"offset":"39351953"}}},"token":{"files":{"colmetadata-token-parser.js":{"size":11793,"integrity":{"algorithm":"SHA256","hash":"7b55f2a2d0cd3eb444140c8086c13af8ec9f14d4e6a50e3ccea1080f06351e27","blockSize":4194304,"blocks":["7b55f2a2d0cd3eb444140c8086c13af8ec9f14d4e6a50e3ccea1080f06351e27"]},"offset":"39383533"},"done-token-parser.js":{"size":7747,"integrity":{"algorithm":"SHA256","hash":"6586bd4f2cb044c8fe48f5fbf548ea88ba00254808a65ed4b92a04a5d7265468","blockSize":4194304,"blocks":["6586bd4f2cb044c8fe48f5fbf548ea88ba00254808a65ed4b92a04a5d7265468"]},"offset":"39395326"},"env-change-token-parser.js":{"size":19691,"integrity":{"algorithm":"SHA256","hash":"25d6eeb4faea7fcf00ac8e0cf9dccf5eacd83bb02d7fbee4cd8cf755f6afcdd6","blockSize":4194304,"blocks":["25d6eeb4faea7fcf00ac8e0cf9dccf5eacd83bb02d7fbee4cd8cf755f6afcdd6"]},"offset":"39403073"},"feature-ext-ack-parser.js":{"size":4570,"integrity":{"algorithm":"SHA256","hash":"58ad15afc02d661ed21965cb89bc582973e0e65a8c0a2d7ec4ad2cf15399f1e7","blockSize":4194304,"blocks":["58ad15afc02d661ed21965cb89bc582973e0e65a8c0a2d7ec4ad2cf15399f1e7"]},"offset":"39422764"},"fedauth-info-parser.js":{"size":5476,"integrity":{"algorithm":"SHA256","hash":"36b7fc6452da91c3b950aaf2da017915b0c6100aadde342939da1f72b626e960","blockSize":4194304,"blocks":["36b7fc6452da91c3b950aaf2da017915b0c6100aadde342939da1f72b626e960"]},"offset":"39427334"},"handler.js":{"size":58972,"integrity":{"algorithm":"SHA256","hash":"0ab25f1f67a30a9cb341177b589e07de6c2512672cd017ef3b1200c805686c79","blockSize":4194304,"blocks":["0ab25f1f67a30a9cb341177b589e07de6c2512672cd017ef3b1200c805686c79"]},"offset":"39432810"},"infoerror-token-parser.js":{"size":5742,"integrity":{"algorithm":"SHA256","hash":"e32d195f77929d5d7c621025cfa5a524c90a7893881f958b54ecd79978a6f701","blockSize":4194304,"blocks":["e32d195f77929d5d7c621025cfa5a524c90a7893881f958b54ecd79978a6f701"]},"offset":"39491782"},"loginack-token-parser.js":{"size":5278,"integrity":{"algorithm":"SHA256","hash":"969c4e76ff4fadf30d3c80edd66f01530b3fcb71fa0946d452823de6262ad1f7","blockSize":4194304,"blocks":["969c4e76ff4fadf30d3c80edd66f01530b3fcb71fa0946d452823de6262ad1f7"]},"offset":"39497524"},"nbcrow-token-parser.js":{"size":9328,"integrity":{"algorithm":"SHA256","hash":"7dac5a94eba35ffcda06ba5d812e34ef53e6f8e4e0da8beba0300e281c2eb546","blockSize":4194304,"blocks":["7dac5a94eba35ffcda06ba5d812e34ef53e6f8e4e0da8beba0300e281c2eb546"]},"offset":"39502802"},"order-token-parser.js":{"size":2901,"integrity":{"algorithm":"SHA256","hash":"0c3f9a218a72d45404ff6f28e34fe4282973eef9ef2efa619c59cdcf5e2904cb","blockSize":4194304,"blocks":["0c3f9a218a72d45404ff6f28e34fe4282973eef9ef2efa619c59cdcf5e2904cb"]},"offset":"39512130"},"returnstatus-token-parser.js":{"size":1628,"integrity":{"algorithm":"SHA256","hash":"3324c01f1f1db0e96d2517f6eb4c4bdc99de67b290907479934b33f14c3e2f82","blockSize":4194304,"blocks":["3324c01f1f1db0e96d2517f6eb4c4bdc99de67b290907479934b33f14c3e2f82"]},"offset":"39515031"},"returnvalue-token-parser.js":{"size":3885,"integrity":{"algorithm":"SHA256","hash":"2fb86170ddc361856a8777ffed2a67784f74e7470da263235e4e7e558957e66f","blockSize":4194304,"blocks":["2fb86170ddc361856a8777ffed2a67784f74e7470da263235e4e7e558957e66f"]},"offset":"39516659"},"row-token-parser.js":{"size":5192,"integrity":{"algorithm":"SHA256","hash":"08d5b7c8a64c848b442aee6c3b6eebf146df55c04fa397d0784615d75ef07713","blockSize":4194304,"blocks":["08d5b7c8a64c848b442aee6c3b6eebf146df55c04fa397d0784615d75ef07713"]},"offset":"39520544"},"sspi-token-parser.js":{"size":5857,"integrity":{"algorithm":"SHA256","hash":"5837f1aa699a2c1921f94b02995d4f4244837272fa921d4d0e0cc60282725f1c","blockSize":4194304,"blocks":["5837f1aa699a2c1921f94b02995d4f4244837272fa921d4d0e0cc60282725f1c"]},"offset":"39525736"},"stream-parser.js":{"size":50118,"integrity":{"algorithm":"SHA256","hash":"cbca77725a8b5d10f53ee5bf6ca1c45e11a479b962ffc723b3ffae945a5a7cc2","blockSize":4194304,"blocks":["cbca77725a8b5d10f53ee5bf6ca1c45e11a479b962ffc723b3ffae945a5a7cc2"]},"offset":"39531593"},"token-stream-parser.js":{"size":4144,"integrity":{"algorithm":"SHA256","hash":"a4956791fac730191dd594cb02dbdeb8c62567404926b06362d3a923b0109c99","blockSize":4194304,"blocks":["a4956791fac730191dd594cb02dbdeb8c62567404926b06362d3a923b0109c99"]},"offset":"39581711"},"token.js":{"size":41394,"integrity":{"algorithm":"SHA256","hash":"935193fa462edfd8ec2e83a0027cba5dccca8c89d7eba8c110e5fdfd68298382","blockSize":4194304,"blocks":["935193fa462edfd8ec2e83a0027cba5dccca8c89d7eba8c110e5fdfd68298382"]},"offset":"39585855"}}},"errors":{"files":{"abort-error.js":{"size":1059,"integrity":{"algorithm":"SHA256","hash":"ce4137a07eb8a504fbdeb3049fecffcd44caf594e6e111c1026ea63fb0f90f9f","blockSize":4194304,"blocks":["ce4137a07eb8a504fbdeb3049fecffcd44caf594e6e111c1026ea63fb0f90f9f"]},"offset":"39627249"},"timeout-error.js":{"size":1118,"integrity":{"algorithm":"SHA256","hash":"8c90b777436e143aacfa09e11a4cfc08103b7a7b2e9d02dc65612ad406d38b46","blockSize":4194304,"blocks":["8c90b777436e143aacfa09e11a4cfc08103b7a7b2e9d02dc65612ad406d38b46"]},"offset":"39628308"}}},"data-types":{"files":{"bigint.js":{"size":5964,"integrity":{"algorithm":"SHA256","hash":"032c59f1202215a7ea8fbcc1f33266e7238acd5c5e24a6e4e21145dc50eb2f49","blockSize":4194304,"blocks":["032c59f1202215a7ea8fbcc1f33266e7238acd5c5e24a6e4e21145dc50eb2f49"]},"offset":"39629426"},"binary.js":{"size":7317,"integrity":{"algorithm":"SHA256","hash":"bc82261393a008d9aa9afdf26ac5a96058437f87737abee100b6f2f665c989a4","blockSize":4194304,"blocks":["bc82261393a008d9aa9afdf26ac5a96058437f87737abee100b6f2f665c989a4"]},"offset":"39635390"},"bit.js":{"size":4154,"integrity":{"algorithm":"SHA256","hash":"bef85efcfe20ee74b7094e08c9786c0deaeb1ae97e600026edede6761bdfc722","blockSize":4194304,"blocks":["bef85efcfe20ee74b7094e08c9786c0deaeb1ae97e600026edede6761bdfc722"]},"offset":"39642707"},"bitn.js":{"size":2353,"integrity":{"algorithm":"SHA256","hash":"a2495ba5fe30d09750196ead892eb274f55fe21509c029c0a470b4e9c597776d","blockSize":4194304,"blocks":["a2495ba5fe30d09750196ead892eb274f55fe21509c029c0a470b4e9c597776d"]},"offset":"39646861"},"char.js":{"size":9627,"integrity":{"algorithm":"SHA256","hash":"59dd37ac09340cc6a8a5b94ba4ca6d5f8b723135c0972713d644cb8a92d5e6dd","blockSize":4194304,"blocks":["59dd37ac09340cc6a8a5b94ba4ca6d5f8b723135c0972713d644cb8a92d5e6dd"]},"offset":"39649214"},"date.js":{"size":7255,"integrity":{"algorithm":"SHA256","hash":"dbd8bf15f4d6768a0566b62343385146c62de9596c51fcd5763498edd4de5041","blockSize":4194304,"blocks":["dbd8bf15f4d6768a0566b62343385146c62de9596c51fcd5763498edd4de5041"]},"offset":"39658841"},"datetime.js":{"size":10303,"integrity":{"algorithm":"SHA256","hash":"d3c2424692d6bf4fd4c746ecfd53a73d5e734f1c11bc7828410a0d3fcfb90137","blockSize":4194304,"blocks":["d3c2424692d6bf4fd4c746ecfd53a73d5e734f1c11bc7828410a0d3fcfb90137"]},"offset":"39666096"},"datetime2.js":{"size":12884,"integrity":{"algorithm":"SHA256","hash":"97c4853de7000a32adb1a42d68a950e7ec6cd19f2ff1d9f03d74cf197a5d4584","blockSize":4194304,"blocks":["97c4853de7000a32adb1a42d68a950e7ec6cd19f2ff1d9f03d74cf197a5d4584"]},"offset":"39676399"},"datetimen.js":{"size":2416,"integrity":{"algorithm":"SHA256","hash":"5d312a0c0cb3ef544ed92d5c50b120127a2e549f892ee42ca8a42753431d2640","blockSize":4194304,"blocks":["5d312a0c0cb3ef544ed92d5c50b120127a2e549f892ee42ca8a42753431d2640"]},"offset":"39689283"},"datetimeoffset.js":{"size":11790,"integrity":{"algorithm":"SHA256","hash":"4b4deeb6dfbd22ce54b3f5b8917bf32e896ac2892855f88c953f85fe15aa1e5b","blockSize":4194304,"blocks":["4b4deeb6dfbd22ce54b3f5b8917bf32e896ac2892855f88c953f85fe15aa1e5b"]},"offset":"39691699"},"decimal.js":{"size":12581,"integrity":{"algorithm":"SHA256","hash":"b2850bc1686c84aa477d0b799308295685b4c6fb8a6923356340c942c6a05348","blockSize":4194304,"blocks":["b2850bc1686c84aa477d0b799308295685b4c6fb8a6923356340c942c6a05348"]},"offset":"39703489"},"decimaln.js":{"size":2404,"integrity":{"algorithm":"SHA256","hash":"c0e176c0f4c4ec26569342b931521507e6d5ae7a1bc6e796f032b986a5998173","blockSize":4194304,"blocks":["c0e176c0f4c4ec26569342b931521507e6d5ae7a1bc6e796f032b986a5998173"]},"offset":"39716070"},"float.js":{"size":4491,"integrity":{"algorithm":"SHA256","hash":"fdcf2c23274fb3a71decbb2e8d65d25a59b98b2dc32740c09c0148da1cd2f949","blockSize":4194304,"blocks":["fdcf2c23274fb3a71decbb2e8d65d25a59b98b2dc32740c09c0148da1cd2f949"]},"offset":"39718474"},"floatn.js":{"size":2368,"integrity":{"algorithm":"SHA256","hash":"6b600cd2dec5c2ecc9f37b9bc482b17bb23ea50bb1eb604b260eddf357cc3ecb","blockSize":4194304,"blocks":["6b600cd2dec5c2ecc9f37b9bc482b17bb23ea50bb1eb604b260eddf357cc3ecb"]},"offset":"39722965"},"image.js":{"size":5637,"integrity":{"algorithm":"SHA256","hash":"5d362db26a5f0e2809ae8421458b14809e8f954cc0919da97f495df4a47659a7","blockSize":4194304,"blocks":["5d362db26a5f0e2809ae8421458b14809e8f954cc0919da97f495df4a47659a7"]},"offset":"39725333"},"int.js":{"size":5243,"integrity":{"algorithm":"SHA256","hash":"1692a65846940321f95d9d13cd61226febdbb88f4c0a7e7628781c7f4f601db8","blockSize":4194304,"blocks":["1692a65846940321f95d9d13cd61226febdbb88f4c0a7e7628781c7f4f601db8"]},"offset":"39730970"},"intn.js":{"size":2340,"integrity":{"algorithm":"SHA256","hash":"009a83a49fa5e192bb4c32e3a712c989ddb49a56d34827dd0b155bf95ef0e246","blockSize":4194304,"blocks":["009a83a49fa5e192bb4c32e3a712c989ddb49a56d34827dd0b155bf95ef0e246"]},"offset":"39736213"},"money.js":{"size":5431,"integrity":{"algorithm":"SHA256","hash":"201ebfda9dac50a7c81d31c18cbdfbdb09bc81c70068a31970b078cac52e24f2","blockSize":4194304,"blocks":["201ebfda9dac50a7c81d31c18cbdfbdb09bc81c70068a31970b078cac52e24f2"]},"offset":"39738553"},"moneyn.js":{"size":2374,"integrity":{"algorithm":"SHA256","hash":"4a27417729fe98f82b351df589838ad3d7c8429a0e86acba15af7bf23ad82724","blockSize":4194304,"blocks":["4a27417729fe98f82b351df589838ad3d7c8429a0e86acba15af7bf23ad82724"]},"offset":"39743984"},"nchar.js":{"size":10910,"integrity":{"algorithm":"SHA256","hash":"0fbddfd13d41392e9ca63eb138e6f3a0bf947892ccd022326fa5236cdd864555","blockSize":4194304,"blocks":["0fbddfd13d41392e9ca63eb138e6f3a0bf947892ccd022326fa5236cdd864555"]},"offset":"39746358"},"ntext.js":{"size":6322,"integrity":{"algorithm":"SHA256","hash":"74c0e2a8c61a7378a5e11186624f1409fb798c3b028d0a79a3c458461563aa1e","blockSize":4194304,"blocks":["74c0e2a8c61a7378a5e11186624f1409fb798c3b028d0a79a3c458461563aa1e"]},"offset":"39757268"},"null.js":{"size":2340,"integrity":{"algorithm":"SHA256","hash":"d3e89d97ece1d643b33598582e3e2b87b7e68c7ad47804ae188e1868861e2979","blockSize":4194304,"blocks":["d3e89d97ece1d643b33598582e3e2b87b7e68c7ad47804ae188e1868861e2979"]},"offset":"39763590"},"numeric.js":{"size":12495,"integrity":{"algorithm":"SHA256","hash":"5c9b6dc08e08e886e62a1146465c6a4f66726072860db8a436ec8356b3205a58","blockSize":4194304,"blocks":["5c9b6dc08e08e886e62a1146465c6a4f66726072860db8a436ec8356b3205a58"]},"offset":"39765930"},"numericn.js":{"size":2404,"integrity":{"algorithm":"SHA256","hash":"dc9adf36a69e6a2d3b7a19042096ba3a0c9fe4d2be0433e0e043e93a1cfe4d6a","blockSize":4194304,"blocks":["dc9adf36a69e6a2d3b7a19042096ba3a0c9fe4d2be0433e0e043e93a1cfe4d6a"]},"offset":"39778425"},"nvarchar.js":{"size":15048,"integrity":{"algorithm":"SHA256","hash":"2ccf67dd518de05ab98414129d10306356bb9da7554ee74f32fa693d32c6228c","blockSize":4194304,"blocks":["2ccf67dd518de05ab98414129d10306356bb9da7554ee74f32fa693d32c6228c"]},"offset":"39780829"},"real.js":{"size":4606,"integrity":{"algorithm":"SHA256","hash":"9c8a9f0cd238f19d01e6b2476825187530604bfd4284a022f96e8958983c660f","blockSize":4194304,"blocks":["9c8a9f0cd238f19d01e6b2476825187530604bfd4284a022f96e8958983c660f"]},"offset":"39795877"},"smalldatetime.js":{"size":8088,"integrity":{"algorithm":"SHA256","hash":"98ede30e48c7e0368b6e1cd296950a69d16c55cff77ced52a4a6d7080ef66654","blockSize":4194304,"blocks":["98ede30e48c7e0368b6e1cd296950a69d16c55cff77ced52a4a6d7080ef66654"]},"offset":"39800483"},"smallint.js":{"size":5272,"integrity":{"algorithm":"SHA256","hash":"6b9563106dbfed9b07f3e80285c0460d055e6287faa2696473c5039b3bd44ceb","blockSize":4194304,"blocks":["6b9563106dbfed9b07f3e80285c0460d055e6287faa2696473c5039b3bd44ceb"]},"offset":"39808571"},"smallmoney.js":{"size":5192,"integrity":{"algorithm":"SHA256","hash":"e44fdf974d1c10a4d81d646186ceccbdda106341fb129290cbce1727af1a237c","blockSize":4194304,"blocks":["e44fdf974d1c10a4d81d646186ceccbdda106341fb129290cbce1727af1a237c"]},"offset":"39813843"},"sql-variant.js":{"size":2377,"integrity":{"algorithm":"SHA256","hash":"e49fe305925122c65ecb56521fec653c6b35de545454a9be47a5620ba82ccc44","blockSize":4194304,"blocks":["e49fe305925122c65ecb56521fec653c6b35de545454a9be47a5620ba82ccc44"]},"offset":"39819035"},"text.js":{"size":7340,"integrity":{"algorithm":"SHA256","hash":"63257c46e21cc9ff2bf497179298706694fe9ffce4f1ae02c0c1ace63123d2dd","blockSize":4194304,"blocks":["63257c46e21cc9ff2bf497179298706694fe9ffce4f1ae02c0c1ace63123d2dd"]},"offset":"39821412"},"time.js":{"size":10681,"integrity":{"algorithm":"SHA256","hash":"6e40df346b54fa037c2eb44d8f995574b73113c3a44e6e74705df134b79cf571","blockSize":4194304,"blocks":["6e40df346b54fa037c2eb44d8f995574b73113c3a44e6e74705df134b79cf571"]},"offset":"39828752"},"tinyint.js":{"size":5211,"integrity":{"algorithm":"SHA256","hash":"88704facec6c4f3b9eefe82b6d56ef2e41a64468d7a86d679074a3e21c2154cb","blockSize":4194304,"blocks":["88704facec6c4f3b9eefe82b6d56ef2e41a64468d7a86d679074a3e21c2154cb"]},"offset":"39839433"},"tvp.js":{"size":13107,"integrity":{"algorithm":"SHA256","hash":"429d19b66259a09f94b07da7bb72154d84870036c35317c5b6b90f017e16d885","blockSize":4194304,"blocks":["429d19b66259a09f94b07da7bb72154d84870036c35317c5b6b90f017e16d885"]},"offset":"39844644"},"udt.js":{"size":2335,"integrity":{"algorithm":"SHA256","hash":"182a44cd46eef8c182f331f64bfb8579ea543287a2b376c4fd488c1e72ec6e90","blockSize":4194304,"blocks":["182a44cd46eef8c182f331f64bfb8579ea543287a2b376c4fd488c1e72ec6e90"]},"offset":"39857751"},"uniqueidentifier.js":{"size":4987,"integrity":{"algorithm":"SHA256","hash":"1e39124d9ede121ccf09b68632f9f24d8d3a8c0533a3935d3965cf43ee9eef73","blockSize":4194304,"blocks":["1e39124d9ede121ccf09b68632f9f24d8d3a8c0533a3935d3965cf43ee9eef73"]},"offset":"39860086"},"varbinary.js":{"size":13444,"integrity":{"algorithm":"SHA256","hash":"bb7fd34efd13cf438f91baf1da883aa9d0d92ab89595d3e1bd6a4f5b137aaf43","blockSize":4194304,"blocks":["bb7fd34efd13cf438f91baf1da883aa9d0d92ab89595d3e1bd6a4f5b137aaf43"]},"offset":"39865073"},"varchar.js":{"size":12815,"integrity":{"algorithm":"SHA256","hash":"1ca8776fd2ba0daf9d355f1dbd5325db0629f5a93f9cc2e92b505309cc1b9abd","blockSize":4194304,"blocks":["1ca8776fd2ba0daf9d355f1dbd5325db0629f5a93f9cc2e92b505309cc1b9abd"]},"offset":"39878517"},"xml.js":{"size":2327,"integrity":{"algorithm":"SHA256","hash":"7a171107f2a54541c6500dd6176e1945446b56f8a785790747bd856f2c55ece5","blockSize":4194304,"blocks":["7a171107f2a54541c6500dd6176e1945446b56f8a785790747bd856f2c55ece5"]},"offset":"39891332"}}},"always-encrypted":{"files":{"aead-aes-256-cbc-hmac-algorithm.js":{"size":17064,"integrity":{"algorithm":"SHA256","hash":"3744b41455fca5367277675f9383ebe14ab4c20cf9f81169267f115662988f36","blockSize":4194304,"blocks":["3744b41455fca5367277675f9383ebe14ab4c20cf9f81169267f115662988f36"]},"offset":"39893659"},"aead-aes-256-cbc-hmac-encryption-key.js":{"size":9240,"integrity":{"algorithm":"SHA256","hash":"d60038ac55b5e8826c488cfdbc31bcf2b661ce777f5aeca52bc4249a09e177fd","blockSize":4194304,"blocks":["d60038ac55b5e8826c488cfdbc31bcf2b661ce777f5aeca52bc4249a09e177fd"]},"offset":"39910723"},"cek-entry.js":{"size":5506,"integrity":{"algorithm":"SHA256","hash":"bdbfbd27d85b98014efca0f484020396cf76886ca9241dfbe5c729de243b8203","blockSize":4194304,"blocks":["bdbfbd27d85b98014efca0f484020396cf76886ca9241dfbe5c729de243b8203"]},"offset":"39919963"},"get-parameter-encryption-metadata.js":{"size":19866,"integrity":{"algorithm":"SHA256","hash":"d2c93dee89f7b7631aeef357b9a8f76920d1b0d67fa1458b21fcf205a7b7484e","blockSize":4194304,"blocks":["d2c93dee89f7b7631aeef357b9a8f76920d1b0d67fa1458b21fcf205a7b7484e"]},"offset":"39925469"},"key-crypto.js":{"size":12236,"integrity":{"algorithm":"SHA256","hash":"9b30e84078e832e96af5b736907ae93235189006dbe80a471472d87b2182a23e","blockSize":4194304,"blocks":["9b30e84078e832e96af5b736907ae93235189006dbe80a471472d87b2182a23e"]},"offset":"39945335"},"keystore-provider-azure-key-vault.js":{"size":47816,"integrity":{"algorithm":"SHA256","hash":"01505a9f72054b78f340468a0d8ad99cd95791033886121c4972b03fbe2a8363","blockSize":4194304,"blocks":["01505a9f72054b78f340468a0d8ad99cd95791033886121c4972b03fbe2a8363"]},"offset":"39957571"},"symmetric-key-cache.js":{"size":6775,"integrity":{"algorithm":"SHA256","hash":"95c0f1d651bf792a13a9e68dfea5fca5d50c1d2eb7b73ec83fae92d015044ac3","blockSize":4194304,"blocks":["95c0f1d651bf792a13a9e68dfea5fca5d50c1d2eb7b73ec83fae92d015044ac3"]},"offset":"40005387"},"symmetric-key.js":{"size":2366,"integrity":{"algorithm":"SHA256","hash":"2d51d9d9e782e7a16d865ffa31318d2a9ad5e621e2950ad5c0e3fa7d80334b15","blockSize":4194304,"blocks":["2d51d9d9e782e7a16d865ffa31318d2a9ad5e621e2950ad5c0e3fa7d80334b15"]},"offset":"40012162"},"types.js":{"size":9644,"integrity":{"algorithm":"SHA256","hash":"aa2bbd6ef28d317d2fad69019bcfb06dda989aafbfa0d255325d4c5cbbbed424","blockSize":4194304,"blocks":["aa2bbd6ef28d317d2fad69019bcfb06dda989aafbfa0d255325d4c5cbbbed424"]},"offset":"40014528"},"utils.js":{"size":2426,"integrity":{"algorithm":"SHA256","hash":"b5f8f1607d217beff5041795cb9beda47f17fd404422fcafe4c878f1b21fffd5","blockSize":4194304,"blocks":["b5f8f1607d217beff5041795cb9beda47f17fd404422fcafe4c878f1b21fffd5"]},"offset":"40024172"}}}}},"benchmarks":{"files":{"README.md":{"size":339,"integrity":{"algorithm":"SHA256","hash":"aea68f5eb73459e217fcb616e4fb59f3c9fe14bb3ffdc442d55e7bc4578d7e7e","blockSize":4194304,"blocks":["aea68f5eb73459e217fcb616e4fb59f3c9fe14bb3ffdc442d55e7bc4578d7e7e"]},"offset":"40026598"},"common.js":{"size":8595,"integrity":{"algorithm":"SHA256","hash":"b9b5110ef3e2140996f343302ea0f7c05d81fe9aef76f60470a287a68a896688","blockSize":4194304,"blocks":["b9b5110ef3e2140996f343302ea0f7c05d81fe9aef76f60470a287a68a896688"]},"offset":"40026937"},"token-parser":{"files":{"colmetadata-token.js":{"size":707,"integrity":{"algorithm":"SHA256","hash":"c1325110b101094b9e1f61431bf0472e82d83a5a534c3b88dbd7c19e71f98103","blockSize":4194304,"blocks":["c1325110b101094b9e1f61431bf0472e82d83a5a534c3b88dbd7c19e71f98103"]},"offset":"40035532"},"done-token.js":{"size":583,"integrity":{"algorithm":"SHA256","hash":"7dd230ff07e829f6e44faa6dc7a142c9f55792ae9879f2b8d8790ec3bcdeb74f","blockSize":4194304,"blocks":["7dd230ff07e829f6e44faa6dc7a142c9f55792ae9879f2b8d8790ec3bcdeb74f"]},"offset":"40036239"},"simple-tokens.js":{"size":24296,"integrity":{"algorithm":"SHA256","hash":"e9166c1df2f0364a7899baccb2eac3c5868edff01a2f1b37f45e14523343012d","blockSize":4194304,"blocks":["e9166c1df2f0364a7899baccb2eac3c5868edff01a2f1b37f45e14523343012d"]},"offset":"40036822"}}},"request":{"files":{"rpcrequest-payload-tvp.js":{"size":1108,"integrity":{"algorithm":"SHA256","hash":"c6d4770b80a90bc51de929f6dd4a80d4fa8f1749210016af921e19cdd0f09aaf","blockSize":4194304,"blocks":["c6d4770b80a90bc51de929f6dd4a80d4fa8f1749210016af921e19cdd0f09aaf"]},"offset":"40061118"},"rpcrequest-payload-varbinary.js":{"size":871,"integrity":{"algorithm":"SHA256","hash":"a4e813e26dfef27dcee1c60c165806f86dac51f1588a5a1a5d7b73f85cba21ce","blockSize":4194304,"blocks":["a4e813e26dfef27dcee1c60c165806f86dac51f1588a5a1a5d7b73f85cba21ce"]},"offset":"40062226"}}},"query":{"files":{"call-tvp.js":{"size":2364,"integrity":{"algorithm":"SHA256","hash":"093b47f085d3c954a6bb41200941238588b4da096faebe81f8f560e5566ede5a","blockSize":4194304,"blocks":["093b47f085d3c954a6bb41200941238588b4da096faebe81f8f560e5566ede5a"]},"offset":"40063097"},"insert-varbinary.js":{"size":813,"integrity":{"algorithm":"SHA256","hash":"699a332e147e99f2421c1f9f86cc19a8151036ef065afe1a9e04ebac3ffe37fa","blockSize":4194304,"blocks":["699a332e147e99f2421c1f9f86cc19a8151036ef065afe1a9e04ebac3ffe37fa"]},"offset":"40065461"},"select-many-rows.js":{"size":1558,"integrity":{"algorithm":"SHA256","hash":"dc88273e4fec149bf2dbf42c4540edff4ceb1a1e74a39820bbf208e5085b1859","blockSize":4194304,"blocks":["dc88273e4fec149bf2dbf42c4540edff4ceb1a1e74a39820bbf208e5085b1859"]},"offset":"40066274"},"select-nvarchar.js":{"size":1152,"integrity":{"algorithm":"SHA256","hash":"5000373b51be500fc97a0eaebbfe909478e5f196908cb24492212602774b4278","blockSize":4194304,"blocks":["5000373b51be500fc97a0eaebbfe909478e5f196908cb24492212602774b4278"]},"offset":"40067832"},"select-varbinary.js":{"size":1186,"integrity":{"algorithm":"SHA256","hash":"510776decfc83e45f15439f7edb8f1d09ce1effd63eb867ec463f5b3802873ff","blockSize":4194304,"blocks":["510776decfc83e45f15439f7edb8f1d09ce1effd63eb867ec463f5b3802873ff"]},"offset":"40068984"}}},"connection":{"files":{"open.js":{"size":401,"integrity":{"algorithm":"SHA256","hash":"772d174500e8f6c6953d0e9879780f935b68bb04c667a17b9108ed307294c6d7","blockSize":4194304,"blocks":["772d174500e8f6c6953d0e9879780f935b68bb04c667a17b9108ed307294c6d7"]},"offset":"40070170"}}},"bulk-load":{"files":{"iterable.js":{"size":1117,"integrity":{"algorithm":"SHA256","hash":"48d60ba8d89ae11b91585d84a0772435c8ef6259be7289cebe6852891ad78760","blockSize":4194304,"blocks":["48d60ba8d89ae11b91585d84a0772435c8ef6259be7289cebe6852891ad78760"]},"offset":"40070571"},"stream.js":{"size":1208,"integrity":{"algorithm":"SHA256","hash":"dea9f18ac41e58a5e18707c43ce474edebb6267abbaab43f2c4e9a3b64ead247","blockSize":4194304,"blocks":["dea9f18ac41e58a5e18707c43ce474edebb6267abbaab43f2c4e9a3b64ead247"]},"offset":"40071688"},"sync.js":{"size":1084,"integrity":{"algorithm":"SHA256","hash":"2689f0b247b6038a336289b5db26794dbe769d5f88490f5ece083b996f2e5410","blockSize":4194304,"blocks":["2689f0b247b6038a336289b5db26794dbe769d5f88490f5ece083b996f2e5410"]},"offset":"40072896"}}}}},"node_modules":{"files":{"sprintf-js":{"files":{"CONTRIBUTORS.md":{"size":1278,"integrity":{"algorithm":"SHA256","hash":"36ca680da6f49365adab4a17de1dfa422d647fd6cd79adfe593c62ddf0bfa5ce","blockSize":4194304,"blocks":["36ca680da6f49365adab4a17de1dfa422d647fd6cd79adfe593c62ddf0bfa5ce"]},"offset":"45942815"},"LICENSE":{"size":1513,"integrity":{"algorithm":"SHA256","hash":"f8287e4dd9480be58c56aca4a55c23b782c43a86e69aabad78fff4df0d29edef","blockSize":4194304,"blocks":["f8287e4dd9480be58c56aca4a55c23b782c43a86e69aabad78fff4df0d29edef"]},"offset":"45944093"},"package.json":{"size":678,"integrity":{"algorithm":"SHA256","hash":"9c7dcaa034c08e53cd0ea0e6affbb19cccd8e806d4e3afa732e1db64bd5e59d9","blockSize":4194304,"blocks":["9c7dcaa034c08e53cd0ea0e6affbb19cccd8e806d4e3afa732e1db64bd5e59d9"]},"offset":"45945606"},"src":{"files":{"angular-sprintf.js":{"size":663,"integrity":{"algorithm":"SHA256","hash":"3757c85856985cfaf6692a66e78fc838f8f70d59108be186cfd64173460b0c9c","blockSize":4194304,"blocks":["3757c85856985cfaf6692a66e78fc838f8f70d59108be186cfd64173460b0c9c"]},"offset":"45946284"},"sprintf.js":{"size":9250,"integrity":{"algorithm":"SHA256","hash":"95add43f116385be221745307fae02d06751b01d4f939df1debb17dbe2ebf4eb","blockSize":4194304,"blocks":["95add43f116385be221745307fae02d06751b01d4f939df1debb17dbe2ebf4eb"]},"offset":"45946947"}}},"dist":{"files":{"angular-sprintf.min.js":{"size":498,"integrity":{"algorithm":"SHA256","hash":"437be51c3f151896258ffd8a69fcb5bbd49819502e1a6b31a0aa22aaebca4fe9","blockSize":4194304,"blocks":["437be51c3f151896258ffd8a69fcb5bbd49819502e1a6b31a0aa22aaebca4fe9"]},"offset":"45956197"},"sprintf.min.js":{"size":3675,"integrity":{"algorithm":"SHA256","hash":"871814aaba8c601ef133092b0e6b97b991d88066bd0fc1337417db0bb4dfedec","blockSize":4194304,"blocks":["871814aaba8c601ef133092b0e6b97b991d88066bd0fc1337417db0bb4dfedec"]},"offset":"45956695"}}}}}}}}},"toidentifier":{"files":{"HISTORY.md":{"size":128,"integrity":{"algorithm":"SHA256","hash":"4839c59f4e7364d7db5746d3f63fb54c0e81aa8b2c7dbd20009438d1d0864cf0","blockSize":4194304,"blocks":["4839c59f4e7364d7db5746d3f63fb54c0e81aa8b2c7dbd20009438d1d0864cf0"]},"offset":"40073980"},"LICENSE":{"size":1108,"integrity":{"algorithm":"SHA256","hash":"a832d679750e49ab433626ab196350b89964b60eb0d3edd3341887c7d5f4c128","blockSize":4194304,"blocks":["a832d679750e49ab433626ab196350b89964b60eb0d3edd3341887c7d5f4c128"]},"offset":"40074108"},"index.js":{"size":504,"integrity":{"algorithm":"SHA256","hash":"f9f26b0e90e2569b61d02ef2a92718624b8854592b1ede7f2c8879a69cfdba05","blockSize":4194304,"blocks":["f9f26b0e90e2569b61d02ef2a92718624b8854592b1ede7f2c8879a69cfdba05"]},"offset":"40075216"},"package.json":{"size":682,"integrity":{"algorithm":"SHA256","hash":"d40765c27fd6c4153219aa3203d416ff0cb7cc2d5abbeca4517c538a377caa47","blockSize":4194304,"blocks":["d40765c27fd6c4153219aa3203d416ff0cb7cc2d5abbeca4517c538a377caa47"]},"offset":"40075720"}}},"toposort-class":{"files":{"LICENSE":{"size":1096,"integrity":{"algorithm":"SHA256","hash":"c991ce1f355f36b73d232335041e8cdcdb4d111123ef18031236ce158f92a9d6","blockSize":4194304,"blocks":["c991ce1f355f36b73d232335041e8cdcdb4d111123ef18031236ce158f92a9d6"]},"offset":"40076402"},"index.js":{"size":51,"integrity":{"algorithm":"SHA256","hash":"b23877f5ad8e87b92c121b82f29397de9aa8d1a1b7c380a93e6365c07f982e7b","blockSize":4194304,"blocks":["b23877f5ad8e87b92c121b82f29397de9aa8d1a1b7c380a93e6365c07f982e7b"]},"offset":"40077498"},"package.json":{"size":742,"integrity":{"algorithm":"SHA256","hash":"835ea6d85584be812df36484d7ab4d38ba1a96bbc11bed6dda0c03a4032cda66","blockSize":4194304,"blocks":["835ea6d85584be812df36484d7ab4d38ba1a96bbc11bed6dda0c03a4032cda66"]},"offset":"40077549"},"build":{"files":{"toposort.js":{"size":11111,"integrity":{"algorithm":"SHA256","hash":"610aded8b9db869602c168126d42b86924de28ffe23ba41df0078423e0613639","blockSize":4194304,"blocks":["610aded8b9db869602c168126d42b86924de28ffe23ba41df0078423e0613639"]},"offset":"40078291"},"toposort.min.js":{"size":2130,"integrity":{"algorithm":"SHA256","hash":"512af6a51f3c439e62742c8fac02e6f18bab9701fd084c7d5f81e43be4342d85","blockSize":4194304,"blocks":["512af6a51f3c439e62742c8fac02e6f18bab9701fd084c7d5f81e43be4342d85"]},"offset":"40089402"}}},"benchmark":{"files":{"README.md":{"size":598,"integrity":{"algorithm":"SHA256","hash":"3a52fe76411c3756cd695b9ac7c73050cb547b36886fc3f0a90859cac520c6a9","blockSize":4194304,"blocks":["3a52fe76411c3756cd695b9ac7c73050cb547b36886fc3f0a90859cac520c6a9"]},"offset":"40091532"},"general.js":{"size":1503,"integrity":{"algorithm":"SHA256","hash":"8e3de21c6da9b5e87bbdfdfa7a817b7491739b3db6817293ed5597a38c869726","blockSize":4194304,"blocks":["8e3de21c6da9b5e87bbdfdfa7a817b7491739b3db6817293ed5597a38c869726"]},"offset":"40092130"},"results.csv":{"size":340,"integrity":{"algorithm":"SHA256","hash":"7fb200d1201947c70f5fccefc296bb2c697de7b22ccaabb80caf6527e332b47d","blockSize":4194304,"blocks":["7fb200d1201947c70f5fccefc296bb2c697de7b22ccaabb80caf6527e332b47d"]},"offset":"40093633"},"0.3.1":{"files":{"toposort.js":{"size":3997,"integrity":{"algorithm":"SHA256","hash":"9a2564e7c5aae9450b803ebf080ab0441948d413d98ac47535a881d1f71f0deb","blockSize":4194304,"blocks":["9a2564e7c5aae9450b803ebf080ab0441948d413d98ac47535a881d1f71f0deb"]},"offset":"40093973"}}}}}}},"tough-cookie":{"files":{"LICENSE":{"size":1485,"integrity":{"algorithm":"SHA256","hash":"22ec6791c91ba42c0516a05f4cbdde019aae4687f8a38c5ca7e8a69ee68f851d","blockSize":4194304,"blocks":["22ec6791c91ba42c0516a05f4cbdde019aae4687f8a38c5ca7e8a69ee68f851d"]},"offset":"40097970"},"package.json":{"size":877,"integrity":{"algorithm":"SHA256","hash":"c9a603974fd620a1d4e2b885fbbf3ec5e43451044281df42accdd7ebb1680c5d","blockSize":4194304,"blocks":["c9a603974fd620a1d4e2b885fbbf3ec5e43451044281df42accdd7ebb1680c5d"]},"offset":"40099455"},"lib":{"files":{"cookie.js":{"size":47533,"integrity":{"algorithm":"SHA256","hash":"3311c4c03c9f3312e30f8ee4be4f97721dde8e1a41beccd4cc176aa1ff64ed7b","blockSize":4194304,"blocks":["3311c4c03c9f3312e30f8ee4be4f97721dde8e1a41beccd4cc176aa1ff64ed7b"]},"offset":"40100332"},"memstore.js":{"size":5888,"integrity":{"algorithm":"SHA256","hash":"55afde8e7f80be6d7a76394b464e9df929c3c7401070302dca3a1b5ed18e734c","blockSize":4194304,"blocks":["55afde8e7f80be6d7a76394b464e9df929c3c7401070302dca3a1b5ed18e734c"]},"offset":"40147865"},"pathMatch.js":{"size":2436,"integrity":{"algorithm":"SHA256","hash":"34bb7cd4cad544900f5653053f2b4216162eb5b1daedfff522618901aeaaf570","blockSize":4194304,"blocks":["34bb7cd4cad544900f5653053f2b4216162eb5b1daedfff522618901aeaaf570"]},"offset":"40153753"},"permuteDomain.js":{"size":2718,"integrity":{"algorithm":"SHA256","hash":"f22a22513e8901e607e1b9d5c6850f6665a0e232fcfb96cfdc1906fbad144f02","blockSize":4194304,"blocks":["f22a22513e8901e607e1b9d5c6850f6665a0e232fcfb96cfdc1906fbad144f02"]},"offset":"40156189"},"pubsuffix-psl.js":{"size":1722,"integrity":{"algorithm":"SHA256","hash":"f005f99034f0aecb9c13c0080c3b9ffda9818636ab366ea102bce524cacc42cd","blockSize":4194304,"blocks":["f005f99034f0aecb9c13c0080c3b9ffda9818636ab366ea102bce524cacc42cd"]},"offset":"40158907"},"store.js":{"size":2616,"integrity":{"algorithm":"SHA256","hash":"41148d2827b225a09fb283a93823207c0b628d0cc8ac5810542e3e37c4e68e8e","blockSize":4194304,"blocks":["41148d2827b225a09fb283a93823207c0b628d0cc8ac5810542e3e37c4e68e8e"]},"offset":"40160629"},"version.js":{"size":52,"integrity":{"algorithm":"SHA256","hash":"8c78fe429ffe379ada5c6bbd6d1b125f6d98777f27114022c8a18538a4cf1510","blockSize":4194304,"blocks":["8c78fe429ffe379ada5c6bbd6d1b125f6d98777f27114022c8a18538a4cf1510"]},"offset":"40163245"}}},"node_modules":{"files":{"universalify":{"files":{"LICENSE":{"size":1100,"integrity":{"algorithm":"SHA256","hash":"3fda5977c0904e226190b4e21d64340c1731e2142d6fe5f3dee0090a216b8b63","blockSize":4194304,"blocks":["3fda5977c0904e226190b4e21d64340c1731e2142d6fe5f3dee0090a216b8b63"]},"offset":"45960370"},"index.js":{"size":777,"integrity":{"algorithm":"SHA256","hash":"d3411ff41b782d91b9cf61daf5a36fa9f2a0383da19be846aa4463f00226e929","blockSize":4194304,"blocks":["d3411ff41b782d91b9cf61daf5a36fa9f2a0383da19be846aa4463f00226e929"]},"offset":"45961470"},"package.json":{"size":617,"integrity":{"algorithm":"SHA256","hash":"039ab77eb273350d1dcec82dee33f474468767728aa53cc472a4ff227b361175","blockSize":4194304,"blocks":["039ab77eb273350d1dcec82dee33f474468767728aa53cc472a4ff227b361175"]},"offset":"45962247"}}}}}}},"tslib":{"files":{"CopyrightNotice.txt":{"size":822,"integrity":{"algorithm":"SHA256","hash":"da16ddb65f8ca390998fb99223d0112498b56b45784d00afd77ff8ce1ac4de8b","blockSize":4194304,"blocks":["da16ddb65f8ca390998fb99223d0112498b56b45784d00afd77ff8ce1ac4de8b"]},"offset":"40163297"},"LICENSE.txt":{"size":655,"integrity":{"algorithm":"SHA256","hash":"210b19e543130388c68654b7497e967119ce17145f66ab7d85688fbd70f08751","blockSize":4194304,"blocks":["210b19e543130388c68654b7497e967119ce17145f66ab7d85688fbd70f08751"]},"offset":"40164119"},"package.json":{"size":613,"integrity":{"algorithm":"SHA256","hash":"5910f3a6f6ab47790ce21b862189fc2aa3d7ac721b09f2868e735a861eccf5ee","blockSize":4194304,"blocks":["5910f3a6f6ab47790ce21b862189fc2aa3d7ac721b09f2868e735a861eccf5ee"]},"offset":"40164774"},"tslib.es6.html":{"size":36,"integrity":{"algorithm":"SHA256","hash":"759c26504a9ccbbfcd730269c9c5ef15512cf16ba617e61a92212365e57c9f5d","blockSize":4194304,"blocks":["759c26504a9ccbbfcd730269c9c5ef15512cf16ba617e61a92212365e57c9f5d"]},"offset":"40165387"},"tslib.es6.js":{"size":12280,"integrity":{"algorithm":"SHA256","hash":"1f07b8a974b15cf3c7d0c6c3ac8ff027bffc7fbed0e6344940e4aba00b3bce9b","blockSize":4194304,"blocks":["1f07b8a974b15cf3c7d0c6c3ac8ff027bffc7fbed0e6344940e4aba00b3bce9b"]},"offset":"40165423"},"tslib.html":{"size":32,"integrity":{"algorithm":"SHA256","hash":"e14179f388a9690437165289d45ff7747f0f839538b5abec63d2dcfe21c2a5f4","blockSize":4194304,"blocks":["e14179f388a9690437165289d45ff7747f0f839538b5abec63d2dcfe21c2a5f4"]},"offset":"40177703"},"tslib.js":{"size":15458,"integrity":{"algorithm":"SHA256","hash":"701a3a6145a04205429d23b47a48f4c333904d2d632f9fbd5039faf566f8d89c","blockSize":4194304,"blocks":["701a3a6145a04205429d23b47a48f4c333904d2d632f9fbd5039faf566f8d89c"]},"offset":"40177735"},"modules":{"files":{"index.js":{"size":1039,"integrity":{"algorithm":"SHA256","hash":"031c869e44527d636176a048a5dc5fb2614b809f9fa8fdbf17401da6b0a1ee0a","blockSize":4194304,"blocks":["031c869e44527d636176a048a5dc5fb2614b809f9fa8fdbf17401da6b0a1ee0a"]},"offset":"40193193"},"package.json":{"size":26,"integrity":{"algorithm":"SHA256","hash":"f2a77d1fa2e7ee710b2835b2933d75d9c7f5dad4f1bab69e1679876e32b5e9eb","blockSize":4194304,"blocks":["f2a77d1fa2e7ee710b2835b2933d75d9c7f5dad4f1bab69e1679876e32b5e9eb"]},"offset":"40194232"}}}}},"tunnel":{"files":{"LICENSE":{"size":1083,"integrity":{"algorithm":"SHA256","hash":"a0932fa80b4c27a0dce36e606e8d755cb02511ff25b41622314882415cfd321b","blockSize":4194304,"blocks":["a0932fa80b4c27a0dce36e606e8d755cb02511ff25b41622314882415cfd321b"]},"offset":"40194258"},"index.js":{"size":42,"integrity":{"algorithm":"SHA256","hash":"db8151a1f5f71c298bda92fef68f35dcdbfa4a1d5f03fb632532858d09d6344c","blockSize":4194304,"blocks":["db8151a1f5f71c298bda92fef68f35dcdbfa4a1d5f03fb632532858d09d6344c"]},"offset":"40195341"},"package.json":{"size":545,"integrity":{"algorithm":"SHA256","hash":"51d6429585f92acc10f1f4efd9774d7321bdc21eb80f76cc515c460d5c7cb90a","blockSize":4194304,"blocks":["51d6429585f92acc10f1f4efd9774d7321bdc21eb80f76cc515c460d5c7cb90a"]},"offset":"40195383"},"lib":{"files":{"tunnel.js":{"size":7628,"integrity":{"algorithm":"SHA256","hash":"e60f3c68b621efdcad4a32b68752564def48aaa19e3a702fb1436eb0363d6890","blockSize":4194304,"blocks":["e60f3c68b621efdcad4a32b68752564def48aaa19e3a702fb1436eb0363d6890"]},"offset":"40195928"}}}}},"tunnel-agent":{"files":{"LICENSE":{"size":9140,"integrity":{"algorithm":"SHA256","hash":"d446a8c73d7bbe4872d6524b15ae206f9a2d7eb53f8c9cb6e6c893a43acc5276","blockSize":4194304,"blocks":["d446a8c73d7bbe4872d6524b15ae206f9a2d7eb53f8c9cb6e6c893a43acc5276"]},"offset":"40203556"},"index.js":{"size":6884,"integrity":{"algorithm":"SHA256","hash":"76ffc88cb84b3f20c2d7999e4d7c4646e6a450132fde37564c8189bf2c960018","blockSize":4194304,"blocks":["76ffc88cb84b3f20c2d7999e4d7c4646e6a450132fde37564c8189bf2c960018"]},"offset":"40212696"},"package.json":{"size":542,"integrity":{"algorithm":"SHA256","hash":"08a8560b650b49370af44148a8645c11675ba97d21ee7f347d8d434b13c51074","blockSize":4194304,"blocks":["08a8560b650b49370af44148a8645c11675ba97d21ee7f347d8d434b13c51074"]},"offset":"40219580"}}},"type-is":{"files":{"HISTORY.md":{"size":5447,"integrity":{"algorithm":"SHA256","hash":"b32b37e94681b90954e8e6d29caef74a6b864055292634c36fb58fb50a9bddae","blockSize":4194304,"blocks":["b32b37e94681b90954e8e6d29caef74a6b864055292634c36fb58fb50a9bddae"]},"offset":"40220122"},"LICENSE":{"size":1172,"integrity":{"algorithm":"SHA256","hash":"23d466b1b134b415b66fa50c6526b4cf3e7b9258554da88d3abb371721e7ce68","blockSize":4194304,"blocks":["23d466b1b134b415b66fa50c6526b4cf3e7b9258554da88d3abb371721e7ce68"]},"offset":"40225569"},"index.js":{"size":5562,"integrity":{"algorithm":"SHA256","hash":"4a94338bd746c6b17dd8681f21124f84ed2cdd4a16022849d28900d5e568642a","blockSize":4194304,"blocks":["4a94338bd746c6b17dd8681f21124f84ed2cdd4a16022849d28900d5e568642a"]},"offset":"40226741"},"package.json":{"size":668,"integrity":{"algorithm":"SHA256","hash":"f45ab954ba5045082c94cf7546b54045c28a723cd0a4454a57347ebc9715c14a","blockSize":4194304,"blocks":["f45ab954ba5045082c94cf7546b54045c28a723cd0a4454a57347ebc9715c14a"]},"offset":"40232303"}}},"typed-emitter":{"files":{"LICENSE":{"size":1078,"integrity":{"algorithm":"SHA256","hash":"dfab9450d2bf4112af202be012c098a06e91248156961c2d45fd1fd1894ae2ff","blockSize":4194304,"blocks":["dfab9450d2bf4112af202be012c098a06e91248156961c2d45fd1fd1894ae2ff"]},"offset":"40232971"},"package.json":{"size":401,"integrity":{"algorithm":"SHA256","hash":"9a006951195573501f387ce52a1f4580990a36c2f70801c4dc2b095a67d93a3b","blockSize":4194304,"blocks":["9a006951195573501f387ce52a1f4580990a36c2f70801c4dc2b095a67d93a3b"]},"offset":"40234049"},"types.js":{"size":80,"integrity":{"algorithm":"SHA256","hash":"f300b17fe85f08ad16daa1bbd773ba812d55f57e4b89eaafe13672e041b11738","blockSize":4194304,"blocks":["f300b17fe85f08ad16daa1bbd773ba812d55f57e4b89eaafe13672e041b11738"]},"offset":"40234450"},"rxjs":{"files":{"index.js":{"size":80,"integrity":{"algorithm":"SHA256","hash":"f300b17fe85f08ad16daa1bbd773ba812d55f57e4b89eaafe13672e041b11738","blockSize":4194304,"blocks":["f300b17fe85f08ad16daa1bbd773ba812d55f57e4b89eaafe13672e041b11738"]},"offset":"40234530"}}}}},"umzug":{"files":{"LICENSE":{"size":1094,"integrity":{"algorithm":"SHA256","hash":"d66a500539845253d3ad79702609b00dd7c3048eb5aae81c765ea7bff23080ec","blockSize":4194304,"blocks":["d66a500539845253d3ad79702609b00dd7c3048eb5aae81c765ea7bff23080ec"]},"offset":"40234610"},"package.json":{"size":1913,"integrity":{"algorithm":"SHA256","hash":"27536ca4bff99dd92c987926f671d5c3464e9bdc861c18117ad7b364bab0193c","blockSize":4194304,"blocks":["27536ca4bff99dd92c987926f671d5c3464e9bdc861c18117ad7b364bab0193c"]},"offset":"40235704"},"lib":{"files":{"cli.js":{"size":10667,"integrity":{"algorithm":"SHA256","hash":"2eb32148fe3d5c17f3422b9d6d74e928bbcb68bc93b66674eee3d4e6453cca63","blockSize":4194304,"blocks":["2eb32148fe3d5c17f3422b9d6d74e928bbcb68bc93b66674eee3d4e6453cca63"]},"offset":"40237617"},"file-locker.js":{"size":2571,"integrity":{"algorithm":"SHA256","hash":"426cbada502a00097a47f9e18ab8dbc0045659c65f71eba8013d3f9bc39f7309","blockSize":4194304,"blocks":["426cbada502a00097a47f9e18ab8dbc0045659c65f71eba8013d3f9bc39f7309"]},"offset":"40248284"},"index.js":{"size":1011,"integrity":{"algorithm":"SHA256","hash":"ae05dfee7e88d9c2c5a698a0ea35c648d59c08cd9f7632393f6a935537157f40","blockSize":4194304,"blocks":["ae05dfee7e88d9c2c5a698a0ea35c648d59c08cd9f7632393f6a935537157f40"]},"offset":"40250855"},"templates.js":{"size":900,"integrity":{"algorithm":"SHA256","hash":"f3c5c9c3ccb0f93b8a5f74980db54225bea2bed8c305cd40c2f11d9da4d5b4a1","blockSize":4194304,"blocks":["f3c5c9c3ccb0f93b8a5f74980db54225bea2bed8c305cd40c2f11d9da4d5b4a1"]},"offset":"40251866"},"types.js":{"size":536,"integrity":{"algorithm":"SHA256","hash":"a833634020e95d81c8ac93d9cf19fa162fbfe18dac84e631ba87df216c6410ab","blockSize":4194304,"blocks":["a833634020e95d81c8ac93d9cf19fa162fbfe18dac84e631ba87df216c6410ab"]},"offset":"40252766"},"umzug.js":{"size":17671,"integrity":{"algorithm":"SHA256","hash":"06fb4b84c75786c31dd4ae69c8eb743485bef1dbab1496402abcaed0fea17875","blockSize":4194304,"blocks":["06fb4b84c75786c31dd4ae69c8eb743485bef1dbab1496402abcaed0fea17875"]},"offset":"40253302"},"storage":{"files":{"contract.js":{"size":609,"integrity":{"algorithm":"SHA256","hash":"7599d8058dec364dcdcc73b6be1bbbf96e20396affd7470451c016e60bb07723","blockSize":4194304,"blocks":["7599d8058dec364dcdcc73b6be1bbbf96e20396affd7470451c016e60bb07723"]},"offset":"40270973"},"index.js":{"size":1063,"integrity":{"algorithm":"SHA256","hash":"16bfec63c40b2c082920f31068bb8575c0df829a8046136eb61172b93e175be5","blockSize":4194304,"blocks":["16bfec63c40b2c082920f31068bb8575c0df829a8046136eb61172b93e175be5"]},"offset":"40271582"},"json.js":{"size":1130,"integrity":{"algorithm":"SHA256","hash":"7d39a1248d0017452e174439faf89d8f9548ce11e4a34587a2317ebda2235e7e","blockSize":4194304,"blocks":["7d39a1248d0017452e174439faf89d8f9548ce11e4a34587a2317ebda2235e7e"]},"offset":"40272645"},"memory.js":{"size":505,"integrity":{"algorithm":"SHA256","hash":"33ae6e6dd6646b99af3fc6da2988141c4b0604cb04fe1064017b1fb236a56a1e","blockSize":4194304,"blocks":["33ae6e6dd6646b99af3fc6da2988141c4b0604cb04fe1064017b1fb236a56a1e"]},"offset":"40273775"},"mongodb.js":{"size":1317,"integrity":{"algorithm":"SHA256","hash":"c8d55076263ec444e161bed3c7cfbc7b4b80404bc51f6ba2797540589f49a961","blockSize":4194304,"blocks":["c8d55076263ec444e161bed3c7cfbc7b4b80404bc51f6ba2797540589f49a961"]},"offset":"40274280"},"sequelize.js":{"size":3262,"integrity":{"algorithm":"SHA256","hash":"812b1298b25cd8d15f7eeaa6962d0cb9f1602d6ffff1216731eb0738884845a1","blockSize":4194304,"blocks":["812b1298b25cd8d15f7eeaa6962d0cb9f1602d6ffff1216731eb0738884845a1"]},"offset":"40275597"}}}}},"node_modules":{"files":{"emittery":{"files":{"index.js":{"size":12207,"integrity":{"algorithm":"SHA256","hash":"17c92480809a467ae47025a156e290f363ca2eeb1b225edc500341af79882168","blockSize":4194304,"blocks":["17c92480809a467ae47025a156e290f363ca2eeb1b225edc500341af79882168"]},"offset":"45962864"},"license":{"size":1117,"integrity":{"algorithm":"SHA256","hash":"5c932d88256b4ab958f64a856fa48e8bd1f55bc1d96b8149c65689e0c61789d3","blockSize":4194304,"blocks":["5c932d88256b4ab958f64a856fa48e8bd1f55bc1d96b8149c65689e0c61789d3"]},"offset":"45975071"},"package.json":{"size":639,"integrity":{"algorithm":"SHA256","hash":"c7c784982e69e2b125b5e398b60380e228bf5e74afcfb29f38fd655cc045384b","blockSize":4194304,"blocks":["c7c784982e69e2b125b5e398b60380e228bf5e74afcfb29f38fd655cc045384b"]},"offset":"45976188"}}},"type-fest":{"files":{"package.json":{"size":654,"integrity":{"algorithm":"SHA256","hash":"60eea41c2a8b76dd846b458bd18a4ea0b09b138a3bc244c079fc48dec3f746ad","blockSize":4194304,"blocks":["60eea41c2a8b76dd846b458bd18a4ea0b09b138a3bc244c079fc48dec3f746ad"]},"offset":"45976827"}}}}}}},"unbox-primitive":{"files":{".editorconfig":{"size":286,"integrity":{"algorithm":"SHA256","hash":"0a73be687a86b6f0e5494b1be555fcfbb886108794948837170c28f18820aae2","blockSize":4194304,"blocks":["0a73be687a86b6f0e5494b1be555fcfbb886108794948837170c28f18820aae2"]},"offset":"40278859"},".nycrc":{"size":216,"integrity":{"algorithm":"SHA256","hash":"948366fea3b423a46366326d0bb2e54b08abd1cf0b243678ba6625740c40da5a","blockSize":4194304,"blocks":["948366fea3b423a46366326d0bb2e54b08abd1cf0b243678ba6625740c40da5a"]},"offset":"40279145"},"LICENSE":{"size":1071,"integrity":{"algorithm":"SHA256","hash":"cfc3f455254c0af0655cc3ff46a41ed644b67599f6043346169d285bf2b3cf3b","blockSize":4194304,"blocks":["cfc3f455254c0af0655cc3ff46a41ed644b67599f6043346169d285bf2b3cf3b"]},"offset":"40279361"},"index.js":{"size":1314,"integrity":{"algorithm":"SHA256","hash":"afcb5c8d8daccffb32c1fdeeda5f5dc9f510ea524b7ca19be3fbef1c5b8c04be","blockSize":4194304,"blocks":["afcb5c8d8daccffb32c1fdeeda5f5dc9f510ea524b7ca19be3fbef1c5b8c04be"]},"offset":"40280432"},"package.json":{"size":1117,"integrity":{"algorithm":"SHA256","hash":"f9200add862e303e2abbcbc8f2244ede3bfc5bec934479340029e1e561a90c8f","blockSize":4194304,"blocks":["f9200add862e303e2abbcbc8f2244ede3bfc5bec934479340029e1e561a90c8f"]},"offset":"40281746"},".github":{"files":{"FUNDING.yml":{"size":586,"integrity":{"algorithm":"SHA256","hash":"64ee0211b14e2584a77024a381e0316f5a327cf129573c23b81ed31236dd4e16","blockSize":4194304,"blocks":["64ee0211b14e2584a77024a381e0316f5a327cf129573c23b81ed31236dd4e16"]},"offset":"40282863"}}}}},"unique-filename":{"files":{"LICENSE":{"size":717,"integrity":{"algorithm":"SHA256","hash":"11734bf6e540e2c021413451205315e5053932de9df9e81279cf2acad6f135ed","blockSize":4194304,"blocks":["11734bf6e540e2c021413451205315e5053932de9df9e81279cf2acad6f135ed"]},"offset":"40283449"},"index.js":{"size":215,"integrity":{"algorithm":"SHA256","hash":"3a3218f3b64cb4b585a712fe58c9ca0ee4b1d861a4c53b42867143c209a41d78","blockSize":4194304,"blocks":["3a3218f3b64cb4b585a712fe58c9ca0ee4b1d861a4c53b42867143c209a41d78"]},"offset":"40284166"},"package.json":{"size":542,"integrity":{"algorithm":"SHA256","hash":"13e25c3ed49878c160bc120f61b12f11fdff28ceda6f88207c906f0f7bbbfa8d","blockSize":4194304,"blocks":["13e25c3ed49878c160bc120f61b12f11fdff28ceda6f88207c906f0f7bbbfa8d"]},"offset":"40284381"},"coverage":{"files":{"base.css":{"size":4756,"integrity":{"algorithm":"SHA256","hash":"a8d0046d163e8ba620de95c3f3d30844d72b3037d6e28213e34f4e711fda710e","blockSize":4194304,"blocks":["a8d0046d163e8ba620de95c3f3d30844d72b3037d6e28213e34f4e711fda710e"]},"offset":"40284923"},"index.html":{"size":3122,"integrity":{"algorithm":"SHA256","hash":"2d92563975adf69d86293ddd0ce4d66ec9723d9c360357b98fd5b933f1182865","blockSize":4194304,"blocks":["2d92563975adf69d86293ddd0ce4d66ec9723d9c360357b98fd5b933f1182865"]},"offset":"40289679"},"prettify.css":{"size":676,"integrity":{"algorithm":"SHA256","hash":"ea3fe433f9450698ca8a230271688e7aeec12f99c8a7ef6c94379abb38f27823","blockSize":4194304,"blocks":["ea3fe433f9450698ca8a230271688e7aeec12f99c8a7ef6c94379abb38f27823"]},"offset":"40292801"},"prettify.js":{"size":17569,"integrity":{"algorithm":"SHA256","hash":"67126b6cd4d1b2305f8c8fa5974971ebe90ab2b0f6e209ba2f1c6e4af05f0207","blockSize":4194304,"blocks":["67126b6cd4d1b2305f8c8fa5974971ebe90ab2b0f6e209ba2f1c6e4af05f0207"]},"offset":"40293477"},"sort-arrow-sprite.png":{"size":209,"integrity":{"algorithm":"SHA256","hash":"cc0509bb6793ce64f35b199d39fea7bada13ecc2d395a43957d0d8aae4f05864","blockSize":4194304,"blocks":["cc0509bb6793ce64f35b199d39fea7bada13ecc2d395a43957d0d8aae4f05864"]},"offset":"40311046"},"sorter.js":{"size":5041,"integrity":{"algorithm":"SHA256","hash":"f36b3bbab81ff43151b2e5f45dea4770e6e3f2436ed41060792402015c26944d","blockSize":4194304,"blocks":["f36b3bbab81ff43151b2e5f45dea4770e6e3f2436ed41060792402015c26944d"]},"offset":"40311255"},"__root__":{"files":{"index.html":{"size":3183,"integrity":{"algorithm":"SHA256","hash":"3f0a2d6d3e8d2a8f8fcef547507b60045d4354b98392b6d640a6fc30fa6877ab","blockSize":4194304,"blocks":["3f0a2d6d3e8d2a8f8fcef547507b60045d4354b98392b6d640a6fc30fa6877ab"]},"offset":"40316296"},"index.js.html":{"size":2427,"integrity":{"algorithm":"SHA256","hash":"68aa19427432d257fcffd76f9b763cdefcb0868e71abb14ff5a91bd2391f2d00","blockSize":4194304,"blocks":["68aa19427432d257fcffd76f9b763cdefcb0868e71abb14ff5a91bd2391f2d00"]},"offset":"40319479"}}}}}}},"unique-slug":{"files":{"LICENSE":{"size":734,"integrity":{"algorithm":"SHA256","hash":"8e8b31dd3582eb47f1b28bd6f009b54cd926adb9431e8424db7c2eae7c4af437","blockSize":4194304,"blocks":["8e8b31dd3582eb47f1b28bd6f009b54cd926adb9431e8424db7c2eae7c4af437"]},"offset":"40321906"},"index.js":{"size":287,"integrity":{"algorithm":"SHA256","hash":"2bfbe1f3de1620c5da3080b036f2a5a8d6d7586ba24870d54ff919c993f0dc32","blockSize":4194304,"blocks":["2bfbe1f3de1620c5da3080b036f2a5a8d6d7586ba24870d54ff919c993f0dc32"]},"offset":"40322640"},"package.json":{"size":475,"integrity":{"algorithm":"SHA256","hash":"7a2c7c8ab9a5663243fe3e718981438bc42be5ff00fb7d6113cc5db3f4f5e10c","blockSize":4194304,"blocks":["7a2c7c8ab9a5663243fe3e718981438bc42be5ff00fb7d6113cc5db3f4f5e10c"]},"offset":"40322927"}}},"universalify":{"files":{"LICENSE":{"size":1100,"integrity":{"algorithm":"SHA256","hash":"3fda5977c0904e226190b4e21d64340c1731e2142d6fe5f3dee0090a216b8b63","blockSize":4194304,"blocks":["3fda5977c0904e226190b4e21d64340c1731e2142d6fe5f3dee0090a216b8b63"]},"offset":"40323402"},"index.js":{"size":712,"integrity":{"algorithm":"SHA256","hash":"617bfc3ead7ba8220c74d50aa747e7bb78f393dd5a2a0229b9bfa4de930a7288","blockSize":4194304,"blocks":["617bfc3ead7ba8220c74d50aa747e7bb78f393dd5a2a0229b9bfa4de930a7288"]},"offset":"40324502"},"package.json":{"size":618,"integrity":{"algorithm":"SHA256","hash":"c88764c8028d862442ffe9e5ea2804576eaaf78d60f8a23125846caccbc59861","blockSize":4194304,"blocks":["c88764c8028d862442ffe9e5ea2804576eaaf78d60f8a23125846caccbc59861"]},"offset":"40325214"}}},"unpipe":{"files":{"HISTORY.md":{"size":59,"integrity":{"algorithm":"SHA256","hash":"6f6dc64d92c2450fd3a2fe41ca1dd3ebeb9c2321ac3c308728f5de69fe6c6fec","blockSize":4194304,"blocks":["6f6dc64d92c2450fd3a2fe41ca1dd3ebeb9c2321ac3c308728f5de69fe6c6fec"]},"offset":"40325832"},"LICENSE":{"size":1114,"integrity":{"algorithm":"SHA256","hash":"1a526fbe8d8577f5a4b1c2821842b55b7c0e18862531c62ae4ce69c9b19b74b6","blockSize":4194304,"blocks":["1a526fbe8d8577f5a4b1c2821842b55b7c0e18862531c62ae4ce69c9b19b74b6"]},"offset":"40325891"},"index.js":{"size":1118,"integrity":{"algorithm":"SHA256","hash":"69cd57b5cdd08c42410ebc0d92235e334f1fb985e6eb2dcfb1c692db674411bd","blockSize":4194304,"blocks":["69cd57b5cdd08c42410ebc0d92235e334f1fb985e6eb2dcfb1c692db674411bd"]},"offset":"40327005"},"package.json":{"size":460,"integrity":{"algorithm":"SHA256","hash":"e20e820d222e7fcf872573eb9176d7a5c0fb9935c3a244d5e9db5f0adc382f15","blockSize":4194304,"blocks":["e20e820d222e7fcf872573eb9176d7a5c0fb9935c3a244d5e9db5f0adc382f15"]},"offset":"40328123"}}},"util-deprecate":{"files":{"History.md":{"size":282,"integrity":{"algorithm":"SHA256","hash":"ab183ff93d075137547f9d96938185f2cd4b29ba1f4e28b29e6fbd573255968d","blockSize":4194304,"blocks":["ab183ff93d075137547f9d96938185f2cd4b29ba1f4e28b29e6fbd573255968d"]},"offset":"40328583"},"LICENSE":{"size":1102,"integrity":{"algorithm":"SHA256","hash":"0154425673db15cdfa80ecba2c9b1f1a867f7197a006764712849bfc3a93cbb7","blockSize":4194304,"blocks":["0154425673db15cdfa80ecba2c9b1f1a867f7197a006764712849bfc3a93cbb7"]},"offset":"40328865"},"browser.js":{"size":1614,"integrity":{"algorithm":"SHA256","hash":"abaef53ebcdc98f3655331f834986a2d11b6a824f58d670369669246d1b7b69b","blockSize":4194304,"blocks":["abaef53ebcdc98f3655331f834986a2d11b6a824f58d670369669246d1b7b69b"]},"offset":"40329967"},"node.js":{"size":123,"integrity":{"algorithm":"SHA256","hash":"9a86a29fa34a99b861e707345fb1d1e2e55a6c23edb8f992bed57cc607f42d8e","blockSize":4194304,"blocks":["9a86a29fa34a99b861e707345fb1d1e2e55a6c23edb8f992bed57cc607f42d8e"]},"offset":"40331581"},"package.json":{"size":438,"integrity":{"algorithm":"SHA256","hash":"f621593e71540f5fee50dd9e89ee538b76bcefe60030cc6f262189fed4cc094d","blockSize":4194304,"blocks":["f621593e71540f5fee50dd9e89ee538b76bcefe60030cc6f262189fed4cc094d"]},"offset":"40331704"}}},"utils-merge":{"files":{"LICENSE":{"size":1084,"integrity":{"algorithm":"SHA256","hash":"6e7d699cdd1e4fa837ba7718ea49841aa67201b449ea8b3f9cf274be15974a64","blockSize":4194304,"blocks":["6e7d699cdd1e4fa837ba7718ea49841aa67201b449ea8b3f9cf274be15974a64"]},"offset":"40332142"},"index.js":{"size":381,"integrity":{"algorithm":"SHA256","hash":"ec62860d6445addffd574f640451ea92e0558b6df793b2e0f1c7175fc2ff6366","blockSize":4194304,"blocks":["ec62860d6445addffd574f640451ea92e0558b6df793b2e0f1c7175fc2ff6366"]},"offset":"40333226"},"package.json":{"size":626,"integrity":{"algorithm":"SHA256","hash":"a0d3301d2ab8e7b1955d83b44cca51082e7a336f2d299dc6c0fd4116cfae8dc7","blockSize":4194304,"blocks":["a0d3301d2ab8e7b1955d83b44cca51082e7a336f2d299dc6c0fd4116cfae8dc7"]},"offset":"40333607"}}},"uuid":{"files":{"CONTRIBUTING.md":{"size":513,"integrity":{"algorithm":"SHA256","hash":"99b5cc0a56af12be90a669fdffc9f5a721236d2ede0d92e1171bb7097dd9fdd7","blockSize":4194304,"blocks":["99b5cc0a56af12be90a669fdffc9f5a721236d2ede0d92e1171bb7097dd9fdd7"]},"offset":"40334233"},"LICENSE.md":{"size":1109,"integrity":{"algorithm":"SHA256","hash":"beaa6b04fb82e41dd2ad679e19e27953afb5999b1abbb455b6564e78ebfeb332","blockSize":4194304,"blocks":["beaa6b04fb82e41dd2ad679e19e27953afb5999b1abbb455b6564e78ebfeb332"]},"offset":"40334746"},"package.json":{"size":2505,"integrity":{"algorithm":"SHA256","hash":"54243411dc67f0e101181a4cb20b8e91b29a7ca222efe72242a0cdde61cc3f0a","blockSize":4194304,"blocks":["54243411dc67f0e101181a4cb20b8e91b29a7ca222efe72242a0cdde61cc3f0a"]},"offset":"40335855"},"wrapper.mjs":{"size":323,"integrity":{"algorithm":"SHA256","hash":"f6835608d7c4b422bb11ab4689bcf91e166ecbbd63aa3fa2b83c448835cd80a5","blockSize":4194304,"blocks":["f6835608d7c4b422bb11ab4689bcf91e166ecbbd63aa3fa2b83c448835cd80a5"]},"offset":"40338360"},"dist":{"files":{"index.js":{"size":1765,"integrity":{"algorithm":"SHA256","hash":"21f90a4f2f933cdbe9e3afe9274b299a4ceb09fe1d47d513d1a3b7a93d76b1d0","blockSize":4194304,"blocks":["21f90a4f2f933cdbe9e3afe9274b299a4ceb09fe1d47d513d1a3b7a93d76b1d0"]},"offset":"40338683"},"md5-browser.js":{"size":7015,"integrity":{"algorithm":"SHA256","hash":"21a4e167b7ae498e8f3778bac8d7330929099006afca6adfe76b626e0e41d795","blockSize":4194304,"blocks":["21a4e167b7ae498e8f3778bac8d7330929099006afca6adfe76b626e0e41d795"]},"offset":"40340448"},"md5.js":{"size":550,"integrity":{"algorithm":"SHA256","hash":"6ca6276ff35f19ea462bb8c9d6d290994fa9980fc775deb741811ef947196ced","blockSize":4194304,"blocks":["6ca6276ff35f19ea462bb8c9d6d290994fa9980fc775deb741811ef947196ced"]},"offset":"40347463"},"native-browser.js":{"size":271,"integrity":{"algorithm":"SHA256","hash":"1574cfc6e8eae48b4ace082086f210e790849788e38f0787095f3c2b2aba1755","blockSize":4194304,"blocks":["1574cfc6e8eae48b4ace082086f210e790849788e38f0787095f3c2b2aba1755"]},"offset":"40348013"},"native.js":{"size":350,"integrity":{"algorithm":"SHA256","hash":"006f218c1c0450ba06917adc2fe7b35f89985b0a7e3d7be9eecdf35d2319b25b","blockSize":4194304,"blocks":["006f218c1c0450ba06917adc2fe7b35f89985b0a7e3d7be9eecdf35d2319b25b"]},"offset":"40348284"},"nil.js":{"size":188,"integrity":{"algorithm":"SHA256","hash":"7395bd919bd1309bcbced245a59dfc6b077f97992a482af2537343e558795b1f","blockSize":4194304,"blocks":["7395bd919bd1309bcbced245a59dfc6b077f97992a482af2537343e558795b1f"]},"offset":"40348634"},"parse.js":{"size":1380,"integrity":{"algorithm":"SHA256","hash":"1a87ed6a6bb0a3edbe266ca55aaf1c5af8e963ee9486f74b59cfd615280b21b4","blockSize":4194304,"blocks":["1a87ed6a6bb0a3edbe266ca55aaf1c5af8e963ee9486f74b59cfd615280b21b4"]},"offset":"40348822"},"regex.js":{"size":267,"integrity":{"algorithm":"SHA256","hash":"acc4c54d987f100093097f4f156ff245394c39d1332eb2114d7e40db00bd6ddd","blockSize":4194304,"blocks":["acc4c54d987f100093097f4f156ff245394c39d1332eb2114d7e40db00bd6ddd"]},"offset":"40350202"},"rng-browser.js":{"size":927,"integrity":{"algorithm":"SHA256","hash":"4e0f06e51bf0abb18bc2ef780cec71c15eaa5d9a2238a1449b4f19b67bfbc4dd","blockSize":4194304,"blocks":["4e0f06e51bf0abb18bc2ef780cec71c15eaa5d9a2238a1449b4f19b67bfbc4dd"]},"offset":"40350469"},"rng.js":{"size":549,"integrity":{"algorithm":"SHA256","hash":"fdde4350fc69c07bfed4178eedf6121a56264744207d9f5c8f3e5b1b913dbb06","blockSize":4194304,"blocks":["fdde4350fc69c07bfed4178eedf6121a56264744207d9f5c8f3e5b1b913dbb06"]},"offset":"40351396"},"sha1-browser.js":{"size":2609,"integrity":{"algorithm":"SHA256","hash":"32982388b377b06298f59db97c98077f06e6b4f29fe284d427195a358a72f19e","blockSize":4194304,"blocks":["32982388b377b06298f59db97c98077f06e6b4f29fe284d427195a358a72f19e"]},"offset":"40351945"},"sha1.js":{"size":553,"integrity":{"algorithm":"SHA256","hash":"a9eda407444a3f68a0a4db0373346df18f583abbde2c4bf2b3fbc6d73be2c75e","blockSize":4194304,"blocks":["a9eda407444a3f68a0a4db0373346df18f583abbde2c4bf2b3fbc6d73be2c75e"]},"offset":"40354554"},"stringify.js":{"size":1795,"integrity":{"algorithm":"SHA256","hash":"2b950dbcf77edf80150520e8c143be50e22767767240e0109bf1c3ad20539e54","blockSize":4194304,"blocks":["2b950dbcf77edf80150520e8c143be50e22767767240e0109bf1c3ad20539e54"]},"offset":"40355107"},"uuid-bin.js":{"size":2030,"integrity":{"algorithm":"SHA256","hash":"7c60635cf5a963da72e35292bcbfa7f7221b08374d69d75103fa82da9d950102","blockSize":4194304,"blocks":["7c60635cf5a963da72e35292bcbfa7f7221b08374d69d75103fa82da9d950102"]},"offset":"40356902"},"v1.js":{"size":3602,"integrity":{"algorithm":"SHA256","hash":"86f6dc1a1556a9eddad07231c2a4f13e0ad4b6ff964a04d06866f07e36067002","blockSize":4194304,"blocks":["86f6dc1a1556a9eddad07231c2a4f13e0ad4b6ff964a04d06866f07e36067002"]},"offset":"40358932"},"v3.js":{"size":414,"integrity":{"algorithm":"SHA256","hash":"95e0c6fa204355c6ef7dbac5720a3ef5239454ed6820674dfcc143a55ea6c459","blockSize":4194304,"blocks":["95e0c6fa204355c6ef7dbac5720a3ef5239454ed6820674dfcc143a55ea6c459"]},"offset":"40362534"},"v35.js":{"size":2076,"integrity":{"algorithm":"SHA256","hash":"b8a86ffceb3f1224c2b75b29930215ea590464a257b27ae5d1c867fdae6ff601","blockSize":4194304,"blocks":["b8a86ffceb3f1224c2b75b29930215ea590464a257b27ae5d1c867fdae6ff601"]},"offset":"40362948"},"v4.js":{"size":1009,"integrity":{"algorithm":"SHA256","hash":"daadf958ab1e8d7e7b371b22d73539aa85f51a4d7970e502025e2100aecbf07b","blockSize":4194304,"blocks":["daadf958ab1e8d7e7b371b22d73539aa85f51a4d7970e502025e2100aecbf07b"]},"offset":"40365024"},"v5.js":{"size":417,"integrity":{"algorithm":"SHA256","hash":"d15c31975f31b9abf6a195e70a3dca0843a9257cb51b49214cf7a9f4ed30fc5a","blockSize":4194304,"blocks":["d15c31975f31b9abf6a195e70a3dca0843a9257cb51b49214cf7a9f4ed30fc5a"]},"offset":"40366033"},"validate.js":{"size":410,"integrity":{"algorithm":"SHA256","hash":"5497d9adffd73474cf379d3e1b76b28698e408124a0726d54e88282500378502","blockSize":4194304,"blocks":["5497d9adffd73474cf379d3e1b76b28698e408124a0726d54e88282500378502"]},"offset":"40366450"},"version.js":{"size":474,"integrity":{"algorithm":"SHA256","hash":"2e69a54d05ef1342b6fe0a2b7fcdb446179db34ea38aa02c17ae0e1f211a55e4","blockSize":4194304,"blocks":["2e69a54d05ef1342b6fe0a2b7fcdb446179db34ea38aa02c17ae0e1f211a55e4"]},"offset":"40366860"},"esm-node":{"files":{"index.js":{"size":412,"integrity":{"algorithm":"SHA256","hash":"3efb8df8c64379c5acbaf0b70ce1a1906375f4b53901b7e90a26863ead50fc30","blockSize":4194304,"blocks":["3efb8df8c64379c5acbaf0b70ce1a1906375f4b53901b7e90a26863ead50fc30"]},"offset":"40367334"},"md5.js":{"size":281,"integrity":{"algorithm":"SHA256","hash":"2313329bf3ada8cd17046afeefa761bd7daa3821e140fc55d8c2b94ee7760ed4","blockSize":4194304,"blocks":["2313329bf3ada8cd17046afeefa761bd7daa3821e140fc55d8c2b94ee7760ed4"]},"offset":"40367746"},"native.js":{"size":80,"integrity":{"algorithm":"SHA256","hash":"ebe73dc7e111014c544e7a2b1f0bdacaa4640c7d30e724766f9720fd68c93ebb","blockSize":4194304,"blocks":["ebe73dc7e111014c544e7a2b1f0bdacaa4640c7d30e724766f9720fd68c93ebb"]},"offset":"40368027"},"nil.js":{"size":54,"integrity":{"algorithm":"SHA256","hash":"40036d4ffe78154827eedb9c1b3f59f660722907389725842bbc178ba28d2241","blockSize":4194304,"blocks":["40036d4ffe78154827eedb9c1b3f59f660722907389725842bbc178ba28d2241"]},"offset":"40368107"},"parse.js":{"size":1106,"integrity":{"algorithm":"SHA256","hash":"2743e5b696fb15df389cf3b1a242e56780f7941bbefc23465529d30e851b80f5","blockSize":4194304,"blocks":["2743e5b696fb15df389cf3b1a242e56780f7941bbefc23465529d30e851b80f5"]},"offset":"40368161"},"regex.js":{"size":133,"integrity":{"algorithm":"SHA256","hash":"9a546763c108d7eeb7283ce26c7a6845a44bd67132005eb32fd1feeca49d1b3f","blockSize":4194304,"blocks":["9a546763c108d7eeb7283ce26c7a6845a44bd67132005eb32fd1feeca49d1b3f"]},"offset":"40369267"},"rng.js":{"size":323,"integrity":{"algorithm":"SHA256","hash":"ff667aff9367a48cc713d36764cea05bd30e8ba05392430571c54734fc9fde03","blockSize":4194304,"blocks":["ff667aff9367a48cc713d36764cea05bd30e8ba05392430571c54734fc9fde03"]},"offset":"40369400"},"sha1.js":{"size":284,"integrity":{"algorithm":"SHA256","hash":"6094b056716c8a37b9f2da365d6c8a17f754543d966411d01dfebd762c94547e","blockSize":4194304,"blocks":["6094b056716c8a37b9f2da365d6c8a17f754543d966411d01dfebd762c94547e"]},"offset":"40369723"},"stringify.js":{"size":1485,"integrity":{"algorithm":"SHA256","hash":"8f302b21779e051f938d3f72f2c48719eb763133dd45c6b0d32db59855d654e5","blockSize":4194304,"blocks":["8f302b21779e051f938d3f72f2c48719eb763133dd45c6b0d32db59855d654e5"]},"offset":"40370007"},"v1.js":{"size":3322,"integrity":{"algorithm":"SHA256","hash":"66a06976b26b6908ee7a9fb747d7a4f71eced2b6cfa8830ab68e204ffceeab1e","blockSize":4194304,"blocks":["66a06976b26b6908ee7a9fb747d7a4f71eced2b6cfa8830ab68e204ffceeab1e"]},"offset":"40371492"},"v3.js":{"size":107,"integrity":{"algorithm":"SHA256","hash":"65b963f24922d433fdc592aa4e2764d10fad59351015bbe5fce0830fe389794a","blockSize":4194304,"blocks":["65b963f24922d433fdc592aa4e2764d10fad59351015bbe5fce0830fe389794a"]},"offset":"40374814"},"v35.js":{"size":1776,"integrity":{"algorithm":"SHA256","hash":"18ddc96a809c95713fd33d648415081d8d1c467c0d2fbbe690c13d90c7673643","blockSize":4194304,"blocks":["18ddc96a809c95713fd33d648415081d8d1c467c0d2fbbe690c13d90c7673643"]},"offset":"40374921"},"v4.js":{"size":680,"integrity":{"algorithm":"SHA256","hash":"ec62b312aa385dbc8688953daf0a0ef430537702fd435772c6c7f7176431a6ba","blockSize":4194304,"blocks":["ec62b312aa385dbc8688953daf0a0ef430537702fd435772c6c7f7176431a6ba"]},"offset":"40376697"},"v5.js":{"size":110,"integrity":{"algorithm":"SHA256","hash":"e9e8d82440c23fc3de56f8acd5a15b1ca2daad6bf6d2e7c4a4b39d04384206d3","blockSize":4194304,"blocks":["e9e8d82440c23fc3de56f8acd5a15b1ca2daad6bf6d2e7c4a4b39d04384206d3"]},"offset":"40377377"},"validate.js":{"size":141,"integrity":{"algorithm":"SHA256","hash":"4a782f41298704c0029c245203430b3e4511365bf05a3addacdbae59d9c664fa","blockSize":4194304,"blocks":["4a782f41298704c0029c245203430b3e4511365bf05a3addacdbae59d9c664fa"]},"offset":"40377487"},"version.js":{"size":200,"integrity":{"algorithm":"SHA256","hash":"48305d584aad6bdfd12435f20694e45d5e3996a932e2dd2e63e9204c7bfc5766","blockSize":4194304,"blocks":["48305d584aad6bdfd12435f20694e45d5e3996a932e2dd2e63e9204c7bfc5766"]},"offset":"40377628"}}},"esm-browser":{"files":{"index.js":{"size":412,"integrity":{"algorithm":"SHA256","hash":"3efb8df8c64379c5acbaf0b70ce1a1906375f4b53901b7e90a26863ead50fc30","blockSize":4194304,"blocks":["3efb8df8c64379c5acbaf0b70ce1a1906375f4b53901b7e90a26863ead50fc30"]},"offset":"40377828"},"md5.js":{"size":6880,"integrity":{"algorithm":"SHA256","hash":"12a4bafe189f2e03229d5c94b07eb302b7a4e2962028f8deebf788f9615faa9a","blockSize":4194304,"blocks":["12a4bafe189f2e03229d5c94b07eb302b7a4e2962028f8deebf788f9615faa9a"]},"offset":"40378240"},"native.js":{"size":137,"integrity":{"algorithm":"SHA256","hash":"9211342ab52f7343940969e2c41acedee86cc69eed23f00fd42b7719a59e647d","blockSize":4194304,"blocks":["9211342ab52f7343940969e2c41acedee86cc69eed23f00fd42b7719a59e647d"]},"offset":"40385120"},"nil.js":{"size":54,"integrity":{"algorithm":"SHA256","hash":"40036d4ffe78154827eedb9c1b3f59f660722907389725842bbc178ba28d2241","blockSize":4194304,"blocks":["40036d4ffe78154827eedb9c1b3f59f660722907389725842bbc178ba28d2241"]},"offset":"40385257"},"parse.js":{"size":1106,"integrity":{"algorithm":"SHA256","hash":"2743e5b696fb15df389cf3b1a242e56780f7941bbefc23465529d30e851b80f5","blockSize":4194304,"blocks":["2743e5b696fb15df389cf3b1a242e56780f7941bbefc23465529d30e851b80f5"]},"offset":"40385311"},"regex.js":{"size":133,"integrity":{"algorithm":"SHA256","hash":"9a546763c108d7eeb7283ce26c7a6845a44bd67132005eb32fd1feeca49d1b3f","blockSize":4194304,"blocks":["9a546763c108d7eeb7283ce26c7a6845a44bd67132005eb32fd1feeca49d1b3f"]},"offset":"40386417"},"rng.js":{"size":838,"integrity":{"algorithm":"SHA256","hash":"51bd585bb48b66ce343491cae4e8bfc00fe8b0bf06563e9b5269fff425476c19","blockSize":4194304,"blocks":["51bd585bb48b66ce343491cae4e8bfc00fe8b0bf06563e9b5269fff425476c19"]},"offset":"40386550"},"sha1.js":{"size":2474,"integrity":{"algorithm":"SHA256","hash":"7d8a194d59e49d1e2defd043e0e4f5d842db1b4b9ad92a1c9afbe3df656f363a","blockSize":4194304,"blocks":["7d8a194d59e49d1e2defd043e0e4f5d842db1b4b9ad92a1c9afbe3df656f363a"]},"offset":"40387388"},"stringify.js":{"size":1485,"integrity":{"algorithm":"SHA256","hash":"8f302b21779e051f938d3f72f2c48719eb763133dd45c6b0d32db59855d654e5","blockSize":4194304,"blocks":["8f302b21779e051f938d3f72f2c48719eb763133dd45c6b0d32db59855d654e5"]},"offset":"40389862"},"v1.js":{"size":3322,"integrity":{"algorithm":"SHA256","hash":"66a06976b26b6908ee7a9fb747d7a4f71eced2b6cfa8830ab68e204ffceeab1e","blockSize":4194304,"blocks":["66a06976b26b6908ee7a9fb747d7a4f71eced2b6cfa8830ab68e204ffceeab1e"]},"offset":"40391347"},"v3.js":{"size":107,"integrity":{"algorithm":"SHA256","hash":"65b963f24922d433fdc592aa4e2764d10fad59351015bbe5fce0830fe389794a","blockSize":4194304,"blocks":["65b963f24922d433fdc592aa4e2764d10fad59351015bbe5fce0830fe389794a"]},"offset":"40394669"},"v35.js":{"size":1776,"integrity":{"algorithm":"SHA256","hash":"18ddc96a809c95713fd33d648415081d8d1c467c0d2fbbe690c13d90c7673643","blockSize":4194304,"blocks":["18ddc96a809c95713fd33d648415081d8d1c467c0d2fbbe690c13d90c7673643"]},"offset":"40394776"},"v4.js":{"size":680,"integrity":{"algorithm":"SHA256","hash":"ec62b312aa385dbc8688953daf0a0ef430537702fd435772c6c7f7176431a6ba","blockSize":4194304,"blocks":["ec62b312aa385dbc8688953daf0a0ef430537702fd435772c6c7f7176431a6ba"]},"offset":"40396552"},"v5.js":{"size":110,"integrity":{"algorithm":"SHA256","hash":"e9e8d82440c23fc3de56f8acd5a15b1ca2daad6bf6d2e7c4a4b39d04384206d3","blockSize":4194304,"blocks":["e9e8d82440c23fc3de56f8acd5a15b1ca2daad6bf6d2e7c4a4b39d04384206d3"]},"offset":"40397232"},"validate.js":{"size":141,"integrity":{"algorithm":"SHA256","hash":"4a782f41298704c0029c245203430b3e4511365bf05a3addacdbae59d9c664fa","blockSize":4194304,"blocks":["4a782f41298704c0029c245203430b3e4511365bf05a3addacdbae59d9c664fa"]},"offset":"40397342"},"version.js":{"size":200,"integrity":{"algorithm":"SHA256","hash":"48305d584aad6bdfd12435f20694e45d5e3996a932e2dd2e63e9204c7bfc5766","blockSize":4194304,"blocks":["48305d584aad6bdfd12435f20694e45d5e3996a932e2dd2e63e9204c7bfc5766"]},"offset":"40397483"}}},"commonjs-browser":{"files":{"index.js":{"size":1792,"integrity":{"algorithm":"SHA256","hash":"589bea76055fe07e218665bdaab3b64c3bf933ba8b220b74176fdb715f22eca7","blockSize":4194304,"blocks":["589bea76055fe07e218665bdaab3b64c3bf933ba8b220b74176fdb715f22eca7"]},"offset":"40397683"},"md5.js":{"size":7015,"integrity":{"algorithm":"SHA256","hash":"21a4e167b7ae498e8f3778bac8d7330929099006afca6adfe76b626e0e41d795","blockSize":4194304,"blocks":["21a4e167b7ae498e8f3778bac8d7330929099006afca6adfe76b626e0e41d795"]},"offset":"40399475"},"native.js":{"size":271,"integrity":{"algorithm":"SHA256","hash":"1574cfc6e8eae48b4ace082086f210e790849788e38f0787095f3c2b2aba1755","blockSize":4194304,"blocks":["1574cfc6e8eae48b4ace082086f210e790849788e38f0787095f3c2b2aba1755"]},"offset":"40406490"},"nil.js":{"size":188,"integrity":{"algorithm":"SHA256","hash":"7395bd919bd1309bcbced245a59dfc6b077f97992a482af2537343e558795b1f","blockSize":4194304,"blocks":["7395bd919bd1309bcbced245a59dfc6b077f97992a482af2537343e558795b1f"]},"offset":"40406761"},"parse.js":{"size":1380,"integrity":{"algorithm":"SHA256","hash":"1a87ed6a6bb0a3edbe266ca55aaf1c5af8e963ee9486f74b59cfd615280b21b4","blockSize":4194304,"blocks":["1a87ed6a6bb0a3edbe266ca55aaf1c5af8e963ee9486f74b59cfd615280b21b4"]},"offset":"40406949"},"regex.js":{"size":267,"integrity":{"algorithm":"SHA256","hash":"acc4c54d987f100093097f4f156ff245394c39d1332eb2114d7e40db00bd6ddd","blockSize":4194304,"blocks":["acc4c54d987f100093097f4f156ff245394c39d1332eb2114d7e40db00bd6ddd"]},"offset":"40408329"},"rng.js":{"size":927,"integrity":{"algorithm":"SHA256","hash":"4e0f06e51bf0abb18bc2ef780cec71c15eaa5d9a2238a1449b4f19b67bfbc4dd","blockSize":4194304,"blocks":["4e0f06e51bf0abb18bc2ef780cec71c15eaa5d9a2238a1449b4f19b67bfbc4dd"]},"offset":"40408596"},"sha1.js":{"size":2609,"integrity":{"algorithm":"SHA256","hash":"32982388b377b06298f59db97c98077f06e6b4f29fe284d427195a358a72f19e","blockSize":4194304,"blocks":["32982388b377b06298f59db97c98077f06e6b4f29fe284d427195a358a72f19e"]},"offset":"40409523"},"stringify.js":{"size":1795,"integrity":{"algorithm":"SHA256","hash":"2b950dbcf77edf80150520e8c143be50e22767767240e0109bf1c3ad20539e54","blockSize":4194304,"blocks":["2b950dbcf77edf80150520e8c143be50e22767767240e0109bf1c3ad20539e54"]},"offset":"40412132"},"v1.js":{"size":3602,"integrity":{"algorithm":"SHA256","hash":"86f6dc1a1556a9eddad07231c2a4f13e0ad4b6ff964a04d06866f07e36067002","blockSize":4194304,"blocks":["86f6dc1a1556a9eddad07231c2a4f13e0ad4b6ff964a04d06866f07e36067002"]},"offset":"40413927"},"v3.js":{"size":414,"integrity":{"algorithm":"SHA256","hash":"95e0c6fa204355c6ef7dbac5720a3ef5239454ed6820674dfcc143a55ea6c459","blockSize":4194304,"blocks":["95e0c6fa204355c6ef7dbac5720a3ef5239454ed6820674dfcc143a55ea6c459"]},"offset":"40417529"},"v35.js":{"size":2076,"integrity":{"algorithm":"SHA256","hash":"b8a86ffceb3f1224c2b75b29930215ea590464a257b27ae5d1c867fdae6ff601","blockSize":4194304,"blocks":["b8a86ffceb3f1224c2b75b29930215ea590464a257b27ae5d1c867fdae6ff601"]},"offset":"40417943"},"v4.js":{"size":1009,"integrity":{"algorithm":"SHA256","hash":"daadf958ab1e8d7e7b371b22d73539aa85f51a4d7970e502025e2100aecbf07b","blockSize":4194304,"blocks":["daadf958ab1e8d7e7b371b22d73539aa85f51a4d7970e502025e2100aecbf07b"]},"offset":"40420019"},"v5.js":{"size":417,"integrity":{"algorithm":"SHA256","hash":"d15c31975f31b9abf6a195e70a3dca0843a9257cb51b49214cf7a9f4ed30fc5a","blockSize":4194304,"blocks":["d15c31975f31b9abf6a195e70a3dca0843a9257cb51b49214cf7a9f4ed30fc5a"]},"offset":"40421028"},"validate.js":{"size":410,"integrity":{"algorithm":"SHA256","hash":"5497d9adffd73474cf379d3e1b76b28698e408124a0726d54e88282500378502","blockSize":4194304,"blocks":["5497d9adffd73474cf379d3e1b76b28698e408124a0726d54e88282500378502"]},"offset":"40421445"},"version.js":{"size":474,"integrity":{"algorithm":"SHA256","hash":"2e69a54d05ef1342b6fe0a2b7fcdb446179db34ea38aa02c17ae0e1f211a55e4","blockSize":4194304,"blocks":["2e69a54d05ef1342b6fe0a2b7fcdb446179db34ea38aa02c17ae0e1f211a55e4"]},"offset":"40421855"}}},"bin":{"files":{"uuid":{"size":44,"integrity":{"algorithm":"SHA256","hash":"30b5422b6c95ccdc402effd7d3354ca6a6bce621cf21d0379749ddf1f96c1ad7","blockSize":4194304,"blocks":["30b5422b6c95ccdc402effd7d3354ca6a6bce621cf21d0379749ddf1f96c1ad7"]},"offset":"40422329"}}}}}}},"validator":{"files":{"LICENSE":{"size":1077,"integrity":{"algorithm":"SHA256","hash":"683b3c34623e01daad41cb2a3d0a93578c590f8d0206cbd8b0b579fb7def2603","blockSize":4194304,"blocks":["683b3c34623e01daad41cb2a3d0a93578c590f8d0206cbd8b0b579fb7def2603"]},"offset":"40422373"},"index.js":{"size":11469,"integrity":{"algorithm":"SHA256","hash":"6fdeca7677f70f7ba64a1357adc812f69cc06add9b50ba00bdf6a53f082363cb","blockSize":4194304,"blocks":["6fdeca7677f70f7ba64a1357adc812f69cc06add9b50ba00bdf6a53f082363cb"]},"offset":"40423450"},"package.json":{"size":1086,"integrity":{"algorithm":"SHA256","hash":"32ef0043e578b09b9b56ea60b24c91270e9c2aa8302cb39ee48cd960cee1c78b","blockSize":4194304,"blocks":["32ef0043e578b09b9b56ea60b24c91270e9c2aa8302cb39ee48cd960cee1c78b"]},"offset":"40434919"},"validator.js":{"size":155624,"integrity":{"algorithm":"SHA256","hash":"19d3092172fdc1c368e58146b5246b424911877819552d6e02e8233450eca9a7","blockSize":4194304,"blocks":["19d3092172fdc1c368e58146b5246b424911877819552d6e02e8233450eca9a7"]},"offset":"40436005"},"validator.min.js":{"size":73884,"integrity":{"algorithm":"SHA256","hash":"1b678a563a61603751ce26294ec7b870fc420c5d4f85d4dad37fbe74c2888e22","blockSize":4194304,"blocks":["1b678a563a61603751ce26294ec7b870fc420c5d4f85d4dad37fbe74c2888e22"]},"offset":"40591629"},"lib":{"files":{"alpha.js":{"size":5816,"integrity":{"algorithm":"SHA256","hash":"e211673596203d96dc56d0201c4f429b223de3d5677552ec7d6810b493fdb1e8","blockSize":4194304,"blocks":["e211673596203d96dc56d0201c4f429b223de3d5677552ec7d6810b493fdb1e8"]},"offset":"40665513"},"blacklist.js":{"size":498,"integrity":{"algorithm":"SHA256","hash":"14750561ef88b55f114ba70d424246c3acfabfe20dece811b934a3ca2f074deb","blockSize":4194304,"blocks":["14750561ef88b55f114ba70d424246c3acfabfe20dece811b934a3ca2f074deb"]},"offset":"40671329"},"contains.js":{"size":936,"integrity":{"algorithm":"SHA256","hash":"08795b6aedd81c137bb561932aead2ee376a889eff23f5c6dab0bf1b02b33893","blockSize":4194304,"blocks":["08795b6aedd81c137bb561932aead2ee376a889eff23f5c6dab0bf1b02b33893"]},"offset":"40671827"},"equals.js":{"size":458,"integrity":{"algorithm":"SHA256","hash":"6929ace89870e408b6ae7e809fb0caf359b3bcc4cbcff18e68361034bb3c2763","blockSize":4194304,"blocks":["6929ace89870e408b6ae7e809fb0caf359b3bcc4cbcff18e68361034bb3c2763"]},"offset":"40672763"},"escape.js":{"size":619,"integrity":{"algorithm":"SHA256","hash":"759075f35ea3045cdfa97bc7031613d43d4a89b9e2e2f720e9f1b6fb6bebcebc","blockSize":4194304,"blocks":["759075f35ea3045cdfa97bc7031613d43d4a89b9e2e2f720e9f1b6fb6bebcebc"]},"offset":"40673221"},"isAfter.js":{"size":733,"integrity":{"algorithm":"SHA256","hash":"39dca77ca87df4e7e73399e8933b909fa5cd98600f29176bc211d3ece1cf0e19","blockSize":4194304,"blocks":["39dca77ca87df4e7e73399e8933b909fa5cd98600f29176bc211d3ece1cf0e19"]},"offset":"40673840"},"isAlpha.js":{"size":1217,"integrity":{"algorithm":"SHA256","hash":"720cde6e5a536c4143b2287a7512c503039da22d50a2dc161286a08c2ef30205","blockSize":4194304,"blocks":["720cde6e5a536c4143b2287a7512c503039da22d50a2dc161286a08c2ef30205"]},"offset":"40674573"},"isAlphanumeric.js":{"size":1252,"integrity":{"algorithm":"SHA256","hash":"73affaa914b36bbf66a305665da85f6ccc6f8df6c3f3b4bfdbf6a301e8c0581e","blockSize":4194304,"blocks":["73affaa914b36bbf66a305665da85f6ccc6f8df6c3f3b4bfdbf6a301e8c0581e"]},"offset":"40675790"},"isAscii.js":{"size":551,"integrity":{"algorithm":"SHA256","hash":"45ab85bb4cd10891a6ff1e88c0e747eb49c56120b09b7b9850944972405bfd3c","blockSize":4194304,"blocks":["45ab85bb4cd10891a6ff1e88c0e747eb49c56120b09b7b9850944972405bfd3c"]},"offset":"40677042"},"isBIC.js":{"size":826,"integrity":{"algorithm":"SHA256","hash":"7815c250f2d6db9bd74d35f0eca74d5eee75c08f7ba8fc7d2c1259ac44d5498e","blockSize":4194304,"blocks":["7815c250f2d6db9bd74d35f0eca74d5eee75c08f7ba8fc7d2c1259ac44d5498e"]},"offset":"40677593"},"isBase32.js":{"size":558,"integrity":{"algorithm":"SHA256","hash":"eb34251a4bce2a68d503644530b445e83c1bb0de138524e80586c06110d58195","blockSize":4194304,"blocks":["eb34251a4bce2a68d503644530b445e83c1bb0de138524e80586c06110d58195"]},"offset":"40678419"},"isBase58.js":{"size":615,"integrity":{"algorithm":"SHA256","hash":"93e5efe3316a05c2f6b9e6db0c9eedf2a8b4a8625ab127a8a2b6c477d0e3830d","blockSize":4194304,"blocks":["93e5efe3316a05c2f6b9e6db0c9eedf2a8b4a8625ab127a8a2b6c477d0e3830d"]},"offset":"40678977"},"isBase64.js":{"size":1005,"integrity":{"algorithm":"SHA256","hash":"e9764c15aaf80952b39d2b4bf7ec985ce7b73662b36a12753847fe2169b3d4d4","blockSize":4194304,"blocks":["e9764c15aaf80952b39d2b4bf7ec985ce7b73662b36a12753847fe2169b3d4d4"]},"offset":"40679592"},"isBefore.js":{"size":735,"integrity":{"algorithm":"SHA256","hash":"d117fdf637718e28aa931983bf536dba5b3e71edd52f92ed8e148c236edfd43d","blockSize":4194304,"blocks":["d117fdf637718e28aa931983bf536dba5b3e71edd52f92ed8e148c236edfd43d"]},"offset":"40680597"},"isBoolean.js":{"size":799,"integrity":{"algorithm":"SHA256","hash":"96bb0c888475119e5c3c46ff24082690f63d00c199d05876b7c3ec78701c76d4","blockSize":4194304,"blocks":["96bb0c888475119e5c3c46ff24082690f63d00c199d05876b7c3ec78701c76d4"]},"offset":"40681332"},"isBtcAddress.js":{"size":662,"integrity":{"algorithm":"SHA256","hash":"7a79aa000466f7f123f82c42d4159325522fd7ecc4bcc3f1211b8686e044b528","blockSize":4194304,"blocks":["7a79aa000466f7f123f82c42d4159325522fd7ecc4bcc3f1211b8686e044b528"]},"offset":"40682131"},"isByteLength.js":{"size":1219,"integrity":{"algorithm":"SHA256","hash":"1b7fe1e87ce65f37bef5e2bf51eab3ba972467857f3e0648b72fad16530701a8","blockSize":4194304,"blocks":["1b7fe1e87ce65f37bef5e2bf51eab3ba972467857f3e0648b72fad16530701a8"]},"offset":"40682793"},"isCreditCard.js":{"size":1336,"integrity":{"algorithm":"SHA256","hash":"cb0e9479c67f4f6dbe353baac18533e12521f8f3e40118a70ec2a606ab5836dd","blockSize":4194304,"blocks":["cb0e9479c67f4f6dbe353baac18533e12521f8f3e40118a70ec2a606ab5836dd"]},"offset":"40684012"},"isCurrency.js":{"size":3400,"integrity":{"algorithm":"SHA256","hash":"bdd28f95ad8d92aac5db8949730d2d27aadde40c6cabb9e4bc015432cbf4ceb3","blockSize":4194304,"blocks":["bdd28f95ad8d92aac5db8949730d2d27aadde40c6cabb9e4bc015432cbf4ceb3"]},"offset":"40685348"},"isDataURI.js":{"size":1302,"integrity":{"algorithm":"SHA256","hash":"2a65daabf80d04bf8e28f914fc8c93db10612a947d48367a00578a2f1bd4e0ec","blockSize":4194304,"blocks":["2a65daabf80d04bf8e28f914fc8c93db10612a947d48367a00578a2f1bd4e0ec"]},"offset":"40688748"},"isDate.js":{"size":4965,"integrity":{"algorithm":"SHA256","hash":"4ae616707a37d1acf7d7cb9b075c854020c6d211a4ee3cc355add46f936ddb5d","blockSize":4194304,"blocks":["4ae616707a37d1acf7d7cb9b075c854020c6d211a4ee3cc355add46f936ddb5d"]},"offset":"40690050"},"isDecimal.js":{"size":1255,"integrity":{"algorithm":"SHA256","hash":"a80a00ba13adf66d74869176184e8fffc8a242d0568eb26677b080f3188d2cc9","blockSize":4194304,"blocks":["a80a00ba13adf66d74869176184e8fffc8a242d0568eb26677b080f3188d2cc9"]},"offset":"40695015"},"isDivisibleBy.js":{"size":561,"integrity":{"algorithm":"SHA256","hash":"ac38f429d57f621e92a2d89b8ae23351707dbfd12a4753e7b79be7afc13d3b10","blockSize":4194304,"blocks":["ac38f429d57f621e92a2d89b8ae23351707dbfd12a4753e7b79be7afc13d3b10"]},"offset":"40696270"},"isEAN.js":{"size":2461,"integrity":{"algorithm":"SHA256","hash":"ab4b10ba6a944eba44eb7bfebd378a4ce50620df8a572fdd5dbda0c7e3e7799d","blockSize":4194304,"blocks":["ab4b10ba6a944eba44eb7bfebd378a4ce50620df8a572fdd5dbda0c7e3e7799d"]},"offset":"40696831"},"isEmail.js":{"size":6182,"integrity":{"algorithm":"SHA256","hash":"6e3f8d0e268f5b2c78f7e64a03ef66ece2497b7e46f4e1d6a27046f6a0c9ba74","blockSize":4194304,"blocks":["6e3f8d0e268f5b2c78f7e64a03ef66ece2497b7e46f4e1d6a27046f6a0c9ba74"]},"offset":"40699292"},"isEmpty.js":{"size":700,"integrity":{"algorithm":"SHA256","hash":"12f401c2367ceaa7e0205945e577a1f3eb66c9e9df5c6289652254221952fd4b","blockSize":4194304,"blocks":["12f401c2367ceaa7e0205945e577a1f3eb66c9e9df5c6289652254221952fd4b"]},"offset":"40705474"},"isEthereumAddress.js":{"size":497,"integrity":{"algorithm":"SHA256","hash":"e491af2522f5c2c64187a8e178cbd4bbcca210b9abc3129d974c23a0d11f8089","blockSize":4194304,"blocks":["e491af2522f5c2c64187a8e178cbd4bbcca210b9abc3129d974c23a0d11f8089"]},"offset":"40706174"},"isFQDN.js":{"size":2048,"integrity":{"algorithm":"SHA256","hash":"fb7420f5bc0a88c0c5d3dc2de67df197cc03bf8eeecc4269246ff2506becaaea","blockSize":4194304,"blocks":["fb7420f5bc0a88c0c5d3dc2de67df197cc03bf8eeecc4269246ff2506becaaea"]},"offset":"40706671"},"isFloat.js":{"size":1066,"integrity":{"algorithm":"SHA256","hash":"ce1bd010929d6a0af8b021c668c23255cc7c37cede85d2f396508bf731cbef83","blockSize":4194304,"blocks":["ce1bd010929d6a0af8b021c668c23255cc7c37cede85d2f396508bf731cbef83"]},"offset":"40708719"},"isFullWidth.js":{"size":524,"integrity":{"algorithm":"SHA256","hash":"6de34bd4cbb6a6072edcff553b2f5efa5560d1000ccdb4c5badc5f4e3addd26a","blockSize":4194304,"blocks":["6de34bd4cbb6a6072edcff553b2f5efa5560d1000ccdb4c5badc5f4e3addd26a"]},"offset":"40709785"},"isHSL.js":{"size":1293,"integrity":{"algorithm":"SHA256","hash":"66082cfc1a978c2865356c4b3ccc4b91861691625b76dd341bb27842b196c406","blockSize":4194304,"blocks":["66082cfc1a978c2865356c4b3ccc4b91861691625b76dd341bb27842b196c406"]},"offset":"40710309"},"isHalfWidth.js":{"size":523,"integrity":{"algorithm":"SHA256","hash":"52c8f93416b646d5d4f20cebe0a1d85211bafe767bf149cd7fe85d7fda70d92a","blockSize":4194304,"blocks":["52c8f93416b646d5d4f20cebe0a1d85211bafe767bf149cd7fe85d7fda70d92a"]},"offset":"40711602"},"isHash.js":{"size":731,"integrity":{"algorithm":"SHA256","hash":"576e263c1354aaf829f7b79cb8946c6a185c4a59f5b9ef35a36a93a264410d0f","blockSize":4194304,"blocks":["576e263c1354aaf829f7b79cb8946c6a185c4a59f5b9ef35a36a93a264410d0f"]},"offset":"40712125"},"isHexColor.js":{"size":528,"integrity":{"algorithm":"SHA256","hash":"25cc2af5eaafb0cedb87a75ff74e3aa17f5a8f6e77a2b4c66ec290737403f177","blockSize":4194304,"blocks":["25cc2af5eaafb0cedb87a75ff74e3aa17f5a8f6e77a2b4c66ec290737403f177"]},"offset":"40712856"},"isHexadecimal.js":{"size":506,"integrity":{"algorithm":"SHA256","hash":"dcf3f066fa4536310dfbecfdb38573594ff8dda14e40b298afccc65648d5cbab","blockSize":4194304,"blocks":["dcf3f066fa4536310dfbecfdb38573594ff8dda14e40b298afccc65648d5cbab"]},"offset":"40713384"},"isIBAN.js":{"size":5476,"integrity":{"algorithm":"SHA256","hash":"2040fc5f88b354e119e07343784ce801f7a5a3c144786142eb9daaeb84109a5d","blockSize":4194304,"blocks":["2040fc5f88b354e119e07343784ce801f7a5a3c144786142eb9daaeb84109a5d"]},"offset":"40713890"},"isIMEI.js":{"size":1269,"integrity":{"algorithm":"SHA256","hash":"5f29b278e6f7e62109e2a534c16052026b780c560f6a6fd633c32585d29d335b","blockSize":4194304,"blocks":["5f29b278e6f7e62109e2a534c16052026b780c560f6a6fd633c32585d29d335b"]},"offset":"40719366"},"isIP.js":{"size":3153,"integrity":{"algorithm":"SHA256","hash":"2daf8791424f352fa650fec73a4bde7736764979301e7c1749d76af485b520bc","blockSize":4194304,"blocks":["2daf8791424f352fa650fec73a4bde7736764979301e7c1749d76af485b520bc"]},"offset":"40720635"},"isIPRange.js":{"size":1424,"integrity":{"algorithm":"SHA256","hash":"c31a9e314350eb1b4781f254101b6aabd0297957f8968abe72a4ce5aa22b80cf","blockSize":4194304,"blocks":["c31a9e314350eb1b4781f254101b6aabd0297957f8968abe72a4ce5aa22b80cf"]},"offset":"40723788"},"isISBN.js":{"size":1471,"integrity":{"algorithm":"SHA256","hash":"65e689228477d9913522d0aa560de8fcff6b88caebc51fbae41b0ded8b9c28c7","blockSize":4194304,"blocks":["65e689228477d9913522d0aa560de8fcff6b88caebc51fbae41b0ded8b9c28c7"]},"offset":"40725212"},"isISIN.js":{"size":1886,"integrity":{"algorithm":"SHA256","hash":"ec18ede18f0f0b64c8083e90c5a17fdb2ecbd704112c6b2e118008d59a6b9277","blockSize":4194304,"blocks":["ec18ede18f0f0b64c8083e90c5a17fdb2ecbd704112c6b2e118008d59a6b9277"]},"offset":"40726683"},"isISO31661Alpha2.js":{"size":2153,"integrity":{"algorithm":"SHA256","hash":"f731818be64a6a8f7aa0d408cd07771891c0e697dd5944303129c0016aba29ba","blockSize":4194304,"blocks":["f731818be64a6a8f7aa0d408cd07771891c0e697dd5944303129c0016aba29ba"]},"offset":"40728569"},"isISO31661Alpha3.js":{"size":2356,"integrity":{"algorithm":"SHA256","hash":"8aae379ec8469ee8ac85b00ba56e97aad5477baaecf4976608a841367d0eb343","blockSize":4194304,"blocks":["8aae379ec8469ee8ac85b00ba56e97aad5477baaecf4976608a841367d0eb343"]},"offset":"40730722"},"isISO4217.js":{"size":1868,"integrity":{"algorithm":"SHA256","hash":"0cd8589a1d10f7376c0379bd3427d92900d5f34368f360b83ea302f865e7bd7c","blockSize":4194304,"blocks":["0cd8589a1d10f7376c0379bd3427d92900d5f34368f360b83ea302f865e7bd7c"]},"offset":"40733078"},"isISO8601.js":{"size":2495,"integrity":{"algorithm":"SHA256","hash":"7195f1733cc82117cfc314fcc7f55b49ace63bbf0fb396635a085297e49f1fc8","blockSize":4194304,"blocks":["7195f1733cc82117cfc314fcc7f55b49ace63bbf0fb396635a085297e49f1fc8"]},"offset":"40734946"},"isISRC.js":{"size":546,"integrity":{"algorithm":"SHA256","hash":"640d01ce5c6dfb8c9f203477ee66ac12ac8a79146111e83f761475e366e40893","blockSize":4194304,"blocks":["640d01ce5c6dfb8c9f203477ee66ac12ac8a79146111e83f761475e366e40893"]},"offset":"40737441"},"isISSN.js":{"size":1018,"integrity":{"algorithm":"SHA256","hash":"45dcbaa2b1c2a755787db0ffffcab0f0a4e48c2fe0cfffeaa82019c7a50f63f5","blockSize":4194304,"blocks":["45dcbaa2b1c2a755787db0ffffcab0f0a4e48c2fe0cfffeaa82019c7a50f63f5"]},"offset":"40737987"},"isIdentityCard.js":{"size":11406,"integrity":{"algorithm":"SHA256","hash":"e86b45ae1130f9388cea374171db428d7b0663793870ae17a177b0f0d05bc128","blockSize":4194304,"blocks":["e86b45ae1130f9388cea374171db428d7b0663793870ae17a177b0f0d05bc128"]},"offset":"40739005"},"isIn.js":{"size":1517,"integrity":{"algorithm":"SHA256","hash":"de2795d08856b2e705d50198a82ca2ad11acde399e23e3371606b2473f566caa","blockSize":4194304,"blocks":["de2795d08856b2e705d50198a82ca2ad11acde399e23e3371606b2473f566caa"]},"offset":"40750411"},"isInt.js":{"size":1169,"integrity":{"algorithm":"SHA256","hash":"b480cf795f3d13ce205c0b0bde99cf34b3a7760718da32fc951b32062e9f8ca3","blockSize":4194304,"blocks":["b480cf795f3d13ce205c0b0bde99cf34b3a7760718da32fc951b32062e9f8ca3"]},"offset":"40751928"},"isJSON.js":{"size":1272,"integrity":{"algorithm":"SHA256","hash":"6b8b1dc05481311d9775a1411fd72302120c8fdc1738531beb1c846453e2eebb","blockSize":4194304,"blocks":["6b8b1dc05481311d9775a1411fd72302120c8fdc1738531beb1c846453e2eebb"]},"offset":"40753097"},"isJWT.js":{"size":734,"integrity":{"algorithm":"SHA256","hash":"fda03f300b19fd86e929cc4c4297b0a6917b8c2eeb236305ee16292b53e7108e","blockSize":4194304,"blocks":["fda03f300b19fd86e929cc4c4297b0a6917b8c2eeb236305ee16292b53e7108e"]},"offset":"40754369"},"isLatLong.js":{"size":1264,"integrity":{"algorithm":"SHA256","hash":"1449cd8e6fedf74dac8a0a2f249b66ea0c975e599222a0164cf3ff55d44ccbf9","blockSize":4194304,"blocks":["1449cd8e6fedf74dac8a0a2f249b66ea0c975e599222a0164cf3ff55d44ccbf9"]},"offset":"40755103"},"isLength.js":{"size":1281,"integrity":{"algorithm":"SHA256","hash":"4d7b4d1ac069b7f6f23c82d60c194c4534993265a6d326d80a3f70a48a5d5b9e","blockSize":4194304,"blocks":["4d7b4d1ac069b7f6f23c82d60c194c4534993265a6d326d80a3f70a48a5d5b9e"]},"offset":"40756367"},"isLicensePlate.js":{"size":4154,"integrity":{"algorithm":"SHA256","hash":"00a218ceede91439b7105ca64a8ada8c8d971811a6469d277080ea9509c1cb5a","blockSize":4194304,"blocks":["00a218ceede91439b7105ca64a8ada8c8d971811a6469d277080ea9509c1cb5a"]},"offset":"40757648"},"isLocale.js":{"size":625,"integrity":{"algorithm":"SHA256","hash":"1c1ccf0978295d97a413a9f8c049742c8949b17ef7faa71ca2fa92c4c916cdf5","blockSize":4194304,"blocks":["1c1ccf0978295d97a413a9f8c049742c8949b17ef7faa71ca2fa92c4c916cdf5"]},"offset":"40761802"},"isLowercase.js":{"size":463,"integrity":{"algorithm":"SHA256","hash":"328a3451c9f188c34cbdb4c072a3ccd7de771108cd8dea9cdc81e2f2e623a708","blockSize":4194304,"blocks":["328a3451c9f188c34cbdb4c072a3ccd7de771108cd8dea9cdc81e2f2e623a708"]},"offset":"40762427"},"isMACAddress.js":{"size":898,"integrity":{"algorithm":"SHA256","hash":"baa3eddb50d86b7f59b9cf69b0abca975f6cdfaf3a8ebe7fbfe808b990f8b0f6","blockSize":4194304,"blocks":["baa3eddb50d86b7f59b9cf69b0abca975f6cdfaf3a8ebe7fbfe808b990f8b0f6"]},"offset":"40762890"},"isMD5.js":{"size":468,"integrity":{"algorithm":"SHA256","hash":"d6d3adb266c5f588270597d85bf08861b0fe205b63820a55108719c5644add0c","blockSize":4194304,"blocks":["d6d3adb266c5f588270597d85bf08861b0fe205b63820a55108719c5644add0c"]},"offset":"40763788"},"isMagnetURI.js":{"size":608,"integrity":{"algorithm":"SHA256","hash":"f7807b24d5a7253c34e7490f0c1d44b66005a18489138e342d0c830dd8f8e8cb","blockSize":4194304,"blocks":["f7807b24d5a7253c34e7490f0c1d44b66005a18489138e342d0c830dd8f8e8cb"]},"offset":"40764256"},"isMimeType.js":{"size":2240,"integrity":{"algorithm":"SHA256","hash":"ceace7bebf695be805df32bd5cf3878c1ff56bc6c23aa0655db28d72d8c208df","blockSize":4194304,"blocks":["ceace7bebf695be805df32bd5cf3878c1ff56bc6c23aa0655db28d72d8c208df"]},"offset":"40764864"},"isMobilePhone.js":{"size":7771,"integrity":{"algorithm":"SHA256","hash":"bf72e7658e5b7732fc3fdd9a64b8c75f691fcbf4cb8148bddddf644c92a93858","blockSize":4194304,"blocks":["bf72e7658e5b7732fc3fdd9a64b8c75f691fcbf4cb8148bddddf644c92a93858"]},"offset":"40767104"},"isMongoId.js":{"size":561,"integrity":{"algorithm":"SHA256","hash":"9abad93d319b028fff89d6ca49765361ac35bf28c44fa288d8e2df4d88cf0cb0","blockSize":4194304,"blocks":["9abad93d319b028fff89d6ca49765361ac35bf28c44fa288d8e2df4d88cf0cb0"]},"offset":"40774875"},"isMultibyte.js":{"size":565,"integrity":{"algorithm":"SHA256","hash":"42cd4ef88a68eaea7f374b40edf8a360d929c84df19e3a9dcbc49c5763dcc7b2","blockSize":4194304,"blocks":["42cd4ef88a68eaea7f374b40edf8a360d929c84df19e3a9dcbc49c5763dcc7b2"]},"offset":"40775436"},"isNumeric.js":{"size":719,"integrity":{"algorithm":"SHA256","hash":"a41e3e36cd19d26e50ad58bb964d28672e2319602de4b17bacc3e75c92b6d37b","blockSize":4194304,"blocks":["a41e3e36cd19d26e50ad58bb964d28672e2319602de4b17bacc3e75c92b6d37b"]},"offset":"40776001"},"isOctal.js":{"size":476,"integrity":{"algorithm":"SHA256","hash":"2d02c2b8ba8c20903ae6a9a5b086c9fafda3a1d3b5770816906bfa2edb634a94","blockSize":4194304,"blocks":["2d02c2b8ba8c20903ae6a9a5b086c9fafda3a1d3b5770816906bfa2edb634a94"]},"offset":"40776720"},"isPassportNumber.js":{"size":3294,"integrity":{"algorithm":"SHA256","hash":"bface6bd2ed476d430de2d99e7454bba47cd6d597ee513725fd687bdbf5bdff4","blockSize":4194304,"blocks":["bface6bd2ed476d430de2d99e7454bba47cd6d597ee513725fd687bdbf5bdff4"]},"offset":"40777196"},"isPort.js":{"size":432,"integrity":{"algorithm":"SHA256","hash":"f13c74d6bdd1678205051291022cf1bf861452bebe91a017b2c59f197bbae0a3","blockSize":4194304,"blocks":["f13c74d6bdd1678205051291022cf1bf861452bebe91a017b2c59f197bbae0a3"]},"offset":"40780490"},"isPostalCode.js":{"size":2773,"integrity":{"algorithm":"SHA256","hash":"deb065c2870f1142a1a6d48dab6561e3938666e3292f04313e070dc5989eca8f","blockSize":4194304,"blocks":["deb065c2870f1142a1a6d48dab6561e3938666e3292f04313e070dc5989eca8f"]},"offset":"40780922"},"isRFC3339.js":{"size":1368,"integrity":{"algorithm":"SHA256","hash":"fc6ed635a100865c5d2daa1ee763274d56af814f584015129ee5b97b12b3c131","blockSize":4194304,"blocks":["fc6ed635a100865c5d2daa1ee763274d56af814f584015129ee5b97b12b3c131"]},"offset":"40783695"},"isRgbColor.js":{"size":1156,"integrity":{"algorithm":"SHA256","hash":"489f0facb8a9cb715f3d16071a8f7556072ede39faffcbf46e6e3cc7cc43c2b9","blockSize":4194304,"blocks":["489f0facb8a9cb715f3d16071a8f7556072ede39faffcbf46e6e3cc7cc43c2b9"]},"offset":"40785063"},"isSemVer.js":{"size":949,"integrity":{"algorithm":"SHA256","hash":"5286dc043433c45c08076472d3ac64caec17f18e408dd4787b58366d85ad0f72","blockSize":4194304,"blocks":["5286dc043433c45c08076472d3ac64caec17f18e408dd4787b58366d85ad0f72"]},"offset":"40786219"},"isSlug.js":{"size":522,"integrity":{"algorithm":"SHA256","hash":"a75740df30514d86a69bd5a4678b1469b9d880592e384acec606fbe30e64ea3c","blockSize":4194304,"blocks":["a75740df30514d86a69bd5a4678b1469b9d880592e384acec606fbe30e64ea3c"]},"offset":"40787168"},"isStrongPassword.js":{"size":3196,"integrity":{"algorithm":"SHA256","hash":"30df959311ba246a1d36515f2376ac7ff4ce421bb7ea4d654223e2e779555705","blockSize":4194304,"blocks":["30df959311ba246a1d36515f2376ac7ff4ce421bb7ea4d654223e2e779555705"]},"offset":"40787690"},"isSurrogatePair.js":{"size":524,"integrity":{"algorithm":"SHA256","hash":"6b24b49380e5bfd82a3edc4f9c91577f72a6a780d00aabd1a0523f97275f7149","blockSize":4194304,"blocks":["6b24b49380e5bfd82a3edc4f9c91577f72a6a780d00aabd1a0523f97275f7149"]},"offset":"40790886"},"isTaxID.js":{"size":41432,"integrity":{"algorithm":"SHA256","hash":"13b1b91a17a3f6161d2597d89cfa2560ccd2f1889bef3fd66c352537bc2e0c54","blockSize":4194304,"blocks":["13b1b91a17a3f6161d2597d89cfa2560ccd2f1889bef3fd66c352537bc2e0c54"]},"offset":"40791410"},"isURL.js":{"size":6204,"integrity":{"algorithm":"SHA256","hash":"b45eae33ce8050b47b91c5a8da0998c0d644051cf4a2489be7f63de39007092b","blockSize":4194304,"blocks":["b45eae33ce8050b47b91c5a8da0998c0d644051cf4a2489be7f63de39007092b"]},"offset":"40832842"},"isUUID.js":{"size":1012,"integrity":{"algorithm":"SHA256","hash":"3594e82102e1461413b0ed4352736ecc87c61676fe06606ae44dbd6b5f4071cb","blockSize":4194304,"blocks":["3594e82102e1461413b0ed4352736ecc87c61676fe06606ae44dbd6b5f4071cb"]},"offset":"40839046"},"isUppercase.js":{"size":463,"integrity":{"algorithm":"SHA256","hash":"653ea0859725b7c641a2a882b8090077c395087db82748ef537fc233816d753e","blockSize":4194304,"blocks":["653ea0859725b7c641a2a882b8090077c395087db82748ef537fc233816d753e"]},"offset":"40840058"},"isVAT.js":{"size":797,"integrity":{"algorithm":"SHA256","hash":"6b641dd12d1c24ec2a0f6f5add720b87ba4c7e068aad6bb3230a934680dd88b1","blockSize":4194304,"blocks":["6b641dd12d1c24ec2a0f6f5add720b87ba4c7e068aad6bb3230a934680dd88b1"]},"offset":"40840521"},"isVariableWidth.js":{"size":606,"integrity":{"algorithm":"SHA256","hash":"d5c4c7df68b115b9679f446b68a1f342df3facc83fd9ae14d52752ef0d4cbba5","blockSize":4194304,"blocks":["d5c4c7df68b115b9679f446b68a1f342df3facc83fd9ae14d52752ef0d4cbba5"]},"offset":"40841318"},"isWhitelisted.js":{"size":571,"integrity":{"algorithm":"SHA256","hash":"2c0eee7f0386a90d7a55257e7e85c9b3e51831ef6eb9c3307a70687fedfe7e6b","blockSize":4194304,"blocks":["2c0eee7f0386a90d7a55257e7e85c9b3e51831ef6eb9c3307a70687fedfe7e6b"]},"offset":"40841924"},"ltrim.js":{"size":668,"integrity":{"algorithm":"SHA256","hash":"6b91f1a16ddeb0c8b18ffce6baa1c0b08a25a03d1f8c26aabc5845752c3cd8a6","blockSize":4194304,"blocks":["6b91f1a16ddeb0c8b18ffce6baa1c0b08a25a03d1f8c26aabc5845752c3cd8a6"]},"offset":"40842495"},"matches.js":{"size":590,"integrity":{"algorithm":"SHA256","hash":"aae967b0b5621fb8aaa8ac70afce09b53d37ff114becf3f5792a5269c6f39b2f","blockSize":4194304,"blocks":["aae967b0b5621fb8aaa8ac70afce09b53d37ff114becf3f5792a5269c6f39b2f"]},"offset":"40843163"},"normalizeEmail.js":{"size":6666,"integrity":{"algorithm":"SHA256","hash":"ec3c416133e464a6339ba4c0dc3540f25b17eeeab1c07b128923a64701e4537e","blockSize":4194304,"blocks":["ec3c416133e464a6339ba4c0dc3540f25b17eeeab1c07b128923a64701e4537e"]},"offset":"40843753"},"rtrim.js":{"size":935,"integrity":{"algorithm":"SHA256","hash":"2eadd536bedcd7aae555a31ddfc1617e0dfa351aeae0c0acf35517b9d5e689ba","blockSize":4194304,"blocks":["2eadd536bedcd7aae555a31ddfc1617e0dfa351aeae0c0acf35517b9d5e689ba"]},"offset":"40850419"},"stripLow.js":{"size":642,"integrity":{"algorithm":"SHA256","hash":"d6fa5de430dd6f9dee7906bb1c8b5aedaae0b5772ac48285671e023e13c8b1df","blockSize":4194304,"blocks":["d6fa5de430dd6f9dee7906bb1c8b5aedaae0b5772ac48285671e023e13c8b1df"]},"offset":"40851354"},"toBoolean.js":{"size":561,"integrity":{"algorithm":"SHA256","hash":"2c877f6a7c4821a039124472a28eb7e2f057ec777357c3784a71eda85f6ef388","blockSize":4194304,"blocks":["2c877f6a7c4821a039124472a28eb7e2f057ec777357c3784a71eda85f6ef388"]},"offset":"40851996"},"toDate.js":{"size":493,"integrity":{"algorithm":"SHA256","hash":"c295da0c8e79cfef004a3986088a6f945b7899a6a17002a5b04ccbef5ddd718f","blockSize":4194304,"blocks":["c295da0c8e79cfef004a3986088a6f945b7899a6a17002a5b04ccbef5ddd718f"]},"offset":"40852557"},"toFloat.js":{"size":442,"integrity":{"algorithm":"SHA256","hash":"85fc40b528b2a9693cfb3cc685458efe4bea76b8da2aec72076cd64cb9b38e1c","blockSize":4194304,"blocks":["85fc40b528b2a9693cfb3cc685458efe4bea76b8da2aec72076cd64cb9b38e1c"]},"offset":"40853050"},"toInt.js":{"size":459,"integrity":{"algorithm":"SHA256","hash":"b31cb333c0883d65257da3d5adb66c5f18113538beab2ba82809cfaaadc6147d","blockSize":4194304,"blocks":["b31cb333c0883d65257da3d5adb66c5f18113538beab2ba82809cfaaadc6147d"]},"offset":"40853492"},"trim.js":{"size":494,"integrity":{"algorithm":"SHA256","hash":"9694b3daf843bb4836667b7de8089e5b5e7ca8c309ceb2a7b2aabcc473473058","blockSize":4194304,"blocks":["9694b3daf843bb4836667b7de8089e5b5e7ca8c309ceb2a7b2aabcc473473058"]},"offset":"40853951"},"unescape.js":{"size":807,"integrity":{"algorithm":"SHA256","hash":"a8d7076e192c8231d822f1d882ec3ff933e07213eabbfa8da718a955f7390a7a","blockSize":4194304,"blocks":["a8d7076e192c8231d822f1d882ec3ff933e07213eabbfa8da718a955f7390a7a"]},"offset":"40854445"},"whitelist.js":{"size":499,"integrity":{"algorithm":"SHA256","hash":"6dc0b2283f20105f50495be765cc858d3ab1b9cde17130f3e511291172882785","blockSize":4194304,"blocks":["6dc0b2283f20105f50495be765cc858d3ab1b9cde17130f3e511291172882785"]},"offset":"40855252"},"util":{"files":{"algorithms.js":{"size":3079,"integrity":{"algorithm":"SHA256","hash":"88cbec99a17d5d11132f3e8627b4c21311a16c8cb8d26f7f5209268064b37aba","blockSize":4194304,"blocks":["88cbec99a17d5d11132f3e8627b4c21311a16c8cb8d26f7f5209268064b37aba"]},"offset":"40855751"},"assertString.js":{"size":936,"integrity":{"algorithm":"SHA256","hash":"ead8004568bd1f2d7a5062efb012fa2c1ff60a00c248c68827451df9b0716e52","blockSize":4194304,"blocks":["ead8004568bd1f2d7a5062efb012fa2c1ff60a00c248c68827451df9b0716e52"]},"offset":"40858830"},"includes.js":{"size":355,"integrity":{"algorithm":"SHA256","hash":"416b8ac5a42d2d2374c20d80ce43e255de4404e7346c20a9caed6a89dcd7b889","blockSize":4194304,"blocks":["416b8ac5a42d2d2374c20d80ce43e255de4404e7346c20a9caed6a89dcd7b889"]},"offset":"40859766"},"merge.js":{"size":484,"integrity":{"algorithm":"SHA256","hash":"9e27bc8347a3fb81db149f2ef3bc3db970f86eb5270bd2a2e245ddabdcd47b54","blockSize":4194304,"blocks":["9e27bc8347a3fb81db149f2ef3bc3db970f86eb5270bd2a2e245ddabdcd47b54"]},"offset":"40860121"},"multilineRegex.js":{"size":507,"integrity":{"algorithm":"SHA256","hash":"1a997b624598f8e7b9efaec68bea85aceadb091ec8b01fe22e43df543559eaf7","blockSize":4194304,"blocks":["1a997b624598f8e7b9efaec68bea85aceadb091ec8b01fe22e43df543559eaf7"]},"offset":"40860605"},"toString.js":{"size":922,"integrity":{"algorithm":"SHA256","hash":"19426c0768f3546eeb768337c14b2940c36ae8e4332ffef86b2f6a2af048c18a","blockSize":4194304,"blocks":["19426c0768f3546eeb768337c14b2940c36ae8e4332ffef86b2f6a2af048c18a"]},"offset":"40861112"},"typeOf.js":{"size":482,"integrity":{"algorithm":"SHA256","hash":"7b35fa62deb6a32ea896c19575c684ef7d9aa9036da2ab71fcf3b75819879f1d","blockSize":4194304,"blocks":["7b35fa62deb6a32ea896c19575c684ef7d9aa9036da2ab71fcf3b75819879f1d"]},"offset":"40862034"}}}}},"es":{"files":{"index.js":{"size":6503,"integrity":{"algorithm":"SHA256","hash":"1520c78d5087608a95fd73bbd1b9e981df90f34d97121dd862e3e90ce3e88484","blockSize":4194304,"blocks":["1520c78d5087608a95fd73bbd1b9e981df90f34d97121dd862e3e90ce3e88484"]},"offset":"40862516"},"lib":{"files":{"alpha.js":{"size":5337,"integrity":{"algorithm":"SHA256","hash":"98af84f89b57013c780833298e373b65fd225d57b39ceeda813ed362abf97f13","blockSize":4194304,"blocks":["98af84f89b57013c780833298e373b65fd225d57b39ceeda813ed362abf97f13"]},"offset":"40869019"},"blacklist.js":{"size":186,"integrity":{"algorithm":"SHA256","hash":"dc8db1f6134e46bc309ab6280aa8fcded1abe1543e85d7e9febd59cdfe304935","blockSize":4194304,"blocks":["dc8db1f6134e46bc309ab6280aa8fcded1abe1543e85d7e9febd59cdfe304935"]},"offset":"40874356"},"contains.js":{"size":524,"integrity":{"algorithm":"SHA256","hash":"f23148c23af8813e2fa7638e76e90b0509ae238b9cb57a202d5295c7f6ff495b","blockSize":4194304,"blocks":["f23148c23af8813e2fa7638e76e90b0509ae238b9cb57a202d5295c7f6ff495b"]},"offset":"40874542"},"equals.js":{"size":149,"integrity":{"algorithm":"SHA256","hash":"874e9a6ab2ffc7b9c5bab4951b963d1a7a865e6f5ce835ec0d110f4ee6c4efac","blockSize":4194304,"blocks":["874e9a6ab2ffc7b9c5bab4951b963d1a7a865e6f5ce835ec0d110f4ee6c4efac"]},"offset":"40875066"},"escape.js":{"size":310,"integrity":{"algorithm":"SHA256","hash":"d8414b0d1911c8ef65aa07fa76760e9fc6292e1caa25564f7f537bcfa3b875c0","blockSize":4194304,"blocks":["d8414b0d1911c8ef65aa07fa76760e9fc6292e1caa25564f7f537bcfa3b875c0"]},"offset":"40875215"},"isAfter.js":{"size":366,"integrity":{"algorithm":"SHA256","hash":"d5383a3263608bdddc5c1ff3a2ed43e1733474c3245b18ab877a93a9096f8a64","blockSize":4194304,"blocks":["d5383a3263608bdddc5c1ff3a2ed43e1733474c3245b18ab877a93a9096f8a64"]},"offset":"40875525"},"isAlpha.js":{"size":915,"integrity":{"algorithm":"SHA256","hash":"c31f9408f7855baa6a721291fb357a480540e5dd981efcc1a16dc9adb29becf9","blockSize":4194304,"blocks":["c31f9408f7855baa6a721291fb357a480540e5dd981efcc1a16dc9adb29becf9"]},"offset":"40875891"},"isAlphanumeric.js":{"size":950,"integrity":{"algorithm":"SHA256","hash":"a70c1670feb51fb1b9d512f84e8326350cb8f7aaeb0a7d4ea3b66cc07a8b89f8","blockSize":4194304,"blocks":["a70c1670feb51fb1b9d512f84e8326350cb8f7aaeb0a7d4ea3b66cc07a8b89f8"]},"offset":"40876806"},"isAscii.js":{"size":242,"integrity":{"algorithm":"SHA256","hash":"6fa67ea63a0221c85b0cc9bfe1e0f0a5000436d57ca0cf587dd676a9524ac7ca","blockSize":4194304,"blocks":["6fa67ea63a0221c85b0cc9bfe1e0f0a5000436d57ca0cf587dd676a9524ac7ca"]},"offset":"40877756"},"isBIC.js":{"size":497,"integrity":{"algorithm":"SHA256","hash":"31a2a2bd8a5804f444f4859446727c6bad8271d10c9a9740467b0a34c1fb6749","blockSize":4194304,"blocks":["31a2a2bd8a5804f444f4859446727c6bad8271d10c9a9740467b0a34c1fb6749"]},"offset":"40877998"},"isBase32.js":{"size":246,"integrity":{"algorithm":"SHA256","hash":"c7dd64458d4976aa850047a85a074c19b67714f51832360b34df185facce9cea","blockSize":4194304,"blocks":["c7dd64458d4976aa850047a85a074c19b67714f51832360b34df185facce9cea"]},"offset":"40878495"},"isBase58.js":{"size":304,"integrity":{"algorithm":"SHA256","hash":"f8a67b44ad08b58f6e63dedbc3dca6779300cda4aa7260f0cc409de47d672c60","blockSize":4194304,"blocks":["f8a67b44ad08b58f6e63dedbc3dca6779300cda4aa7260f0cc409de47d672c60"]},"offset":"40878741"},"isBase64.js":{"size":650,"integrity":{"algorithm":"SHA256","hash":"4cf954aefe811b886a1f75d112195314d7cdbe102367e27b48d5b912bb83cdc3","blockSize":4194304,"blocks":["4cf954aefe811b886a1f75d112195314d7cdbe102367e27b48d5b912bb83cdc3"]},"offset":"40879045"},"isBefore.js":{"size":367,"integrity":{"algorithm":"SHA256","hash":"fa733502e2feafb2551db202e3d2c63aad7b8030065de4b23db29cfc78387374","blockSize":4194304,"blocks":["fa733502e2feafb2551db202e3d2c63aad7b8030065de4b23db29cfc78387374"]},"offset":"40879695"},"isBoolean.js":{"size":486,"integrity":{"algorithm":"SHA256","hash":"c5a4afb9ccd5f955dda7389a85bc5706275cbd9e5d4c165062b5fc05ac99d036","blockSize":4194304,"blocks":["c5a4afb9ccd5f955dda7389a85bc5706275cbd9e5d4c165062b5fc05ac99d036"]},"offset":"40880062"},"isBtcAddress.js":{"size":347,"integrity":{"algorithm":"SHA256","hash":"f24e1e69d6a7f307edc65819824fec01092518d6d2f2767c623a9f175c4b1f30","blockSize":4194304,"blocks":["f24e1e69d6a7f307edc65819824fec01092518d6d2f2767c623a9f175c4b1f30"]},"offset":"40880548"},"isByteLength.js":{"size":905,"integrity":{"algorithm":"SHA256","hash":"ec9de7326b4491471d8fefc7417bb1089aedac000b018f40ce14e64335675af7","blockSize":4194304,"blocks":["ec9de7326b4491471d8fefc7417bb1089aedac000b018f40ce14e64335675af7"]},"offset":"40880895"},"isCreditCard.js":{"size":1022,"integrity":{"algorithm":"SHA256","hash":"ec74e35bf033b97883a1d17e5467baa440dc1de5506d2a50ade01b7f2d3ec284","blockSize":4194304,"blocks":["ec74e35bf033b97883a1d17e5467baa440dc1de5506d2a50ade01b7f2d3ec284"]},"offset":"40881800"},"isCurrency.js":{"size":3044,"integrity":{"algorithm":"SHA256","hash":"f836d6bb07dac9eda1a02c707b6a4556441ec53f340eb5f15bdadf2c8a1a5f94","blockSize":4194304,"blocks":["f836d6bb07dac9eda1a02c707b6a4556441ec53f340eb5f15bdadf2c8a1a5f94"]},"offset":"40882822"},"isDataURI.js":{"size":989,"integrity":{"algorithm":"SHA256","hash":"265147b3e8f12808c1c2eb3e57bfb0becbd8502fe5ef50da12d17dfaf7ada76f","blockSize":4194304,"blocks":["265147b3e8f12808c1c2eb3e57bfb0becbd8502fe5ef50da12d17dfaf7ada76f"]},"offset":"40885866"},"isDate.js":{"size":4648,"integrity":{"algorithm":"SHA256","hash":"93dbf8eca9f43b54161e52a165d91563d5213b2818a175c99d1bbe576029652c","blockSize":4194304,"blocks":["93dbf8eca9f43b54161e52a165d91563d5213b2818a175c99d1bbe576029652c"]},"offset":"40886855"},"isDecimal.js":{"size":844,"integrity":{"algorithm":"SHA256","hash":"a9369e6fd0aa5e0785ddf0b5792fd7b13e668a2334482cdf54dbfa678f940437","blockSize":4194304,"blocks":["a9369e6fd0aa5e0785ddf0b5792fd7b13e668a2334482cdf54dbfa678f940437"]},"offset":"40891503"},"isDivisibleBy.js":{"size":202,"integrity":{"algorithm":"SHA256","hash":"cba805c52a18f5e2a2be33956e8bf7340efe61947f2f40585ae38af7b66fbdfc","blockSize":4194304,"blocks":["cba805c52a18f5e2a2be33956e8bf7340efe61947f2f40585ae38af7b66fbdfc"]},"offset":"40892347"},"isEAN.js":{"size":2155,"integrity":{"algorithm":"SHA256","hash":"d5c007f8fdf0e926d63f551390d60376ed1f327efecb1f60df52316b0d73cdfa","blockSize":4194304,"blocks":["d5c007f8fdf0e926d63f551390d60376ed1f327efecb1f60df52316b0d73cdfa"]},"offset":"40892549"},"isEmail.js":{"size":5658,"integrity":{"algorithm":"SHA256","hash":"38522f925fafba65fe58be261d628f8c4cc0829c4908d13e0491d9dd9b685185","blockSize":4194304,"blocks":["38522f925fafba65fe58be261d628f8c4cc0829c4908d13e0491d9dd9b685185"]},"offset":"40894704"},"isEmpty.js":{"size":346,"integrity":{"algorithm":"SHA256","hash":"dd181f90df22a86274d3121bfb66246b2a5bc0a0d8e280982b6665c11b909f09","blockSize":4194304,"blocks":["dd181f90df22a86274d3121bfb66246b2a5bc0a0d8e280982b6665c11b909f09"]},"offset":"40900362"},"isEthereumAddress.js":{"size":176,"integrity":{"algorithm":"SHA256","hash":"e1e919e1d8c009e448fd7d3164e52a0c231476a0bfea9d1d14f5c007505f1fa5","blockSize":4194304,"blocks":["e1e919e1d8c009e448fd7d3164e52a0c231476a0bfea9d1d14f5c007505f1fa5"]},"offset":"40900708"},"isFQDN.js":{"size":1695,"integrity":{"algorithm":"SHA256","hash":"b608d49c9a4da6adef6a2bf48d8201472db006f05c8b0825382a95f5d2011e04","blockSize":4194304,"blocks":["b608d49c9a4da6adef6a2bf48d8201472db006f05c8b0825382a95f5d2011e04"]},"offset":"40900884"},"isFloat.js":{"size":776,"integrity":{"algorithm":"SHA256","hash":"9770f1e22713c01da16ac88a784e600e7089b8355bcc1eff51509fc3e8a7d879","blockSize":4194304,"blocks":["9770f1e22713c01da16ac88a784e600e7089b8355bcc1eff51509fc3e8a7d879"]},"offset":"40902579"},"isFullWidth.js":{"size":234,"integrity":{"algorithm":"SHA256","hash":"d3e6e8d13abd04d996362e3fbb4754807a4a3ff5309cc83dd8024ae88ac0e1bc","blockSize":4194304,"blocks":["d3e6e8d13abd04d996362e3fbb4754807a4a3ff5309cc83dd8024ae88ac0e1bc"]},"offset":"40903355"},"isHSL.js":{"size":984,"integrity":{"algorithm":"SHA256","hash":"bcae3844017808971bad0af2863ddaf194212d0454ff4d7e75abf597867de257","blockSize":4194304,"blocks":["bcae3844017808971bad0af2863ddaf194212d0454ff4d7e75abf597867de257"]},"offset":"40903589"},"isHalfWidth.js":{"size":233,"integrity":{"algorithm":"SHA256","hash":"fe5e599aff603e3aa8e4a0724f177c6d2a07ef68ee06accfa307f31704229483","blockSize":4194304,"blocks":["fe5e599aff603e3aa8e4a0724f177c6d2a07ef68ee06accfa307f31704229483"]},"offset":"40904573"},"isHash.js":{"size":421,"integrity":{"algorithm":"SHA256","hash":"9d183ee67b9679b112990dfbeb0cb6cd2f4c78319e05b3d20206869c5ab71de9","blockSize":4194304,"blocks":["9d183ee67b9679b112990dfbeb0cb6cd2f4c78319e05b3d20206869c5ab71de9"]},"offset":"40904806"},"isHexColor.js":{"size":214,"integrity":{"algorithm":"SHA256","hash":"557fe0fd7a7bcd3633623c501b537a0bbc590cb980097ea6c59a3035fe33873a","blockSize":4194304,"blocks":["557fe0fd7a7bcd3633623c501b537a0bbc590cb980097ea6c59a3035fe33873a"]},"offset":"40905227"},"isHexadecimal.js":{"size":189,"integrity":{"algorithm":"SHA256","hash":"80dc0215824adc09454ffc6d3a5581fcc5ca6182f134ad1fee651bf487f0f29b","blockSize":4194304,"blocks":["80dc0215824adc09454ffc6d3a5581fcc5ca6182f134ad1fee651bf487f0f29b"]},"offset":"40905441"},"isIBAN.js":{"size":5200,"integrity":{"algorithm":"SHA256","hash":"940f6dcb490121f002ed68b9b5c3fd5fb2a8ae06fbc01a8017ca63197648eb84","blockSize":4194304,"blocks":["940f6dcb490121f002ed68b9b5c3fd5fb2a8ae06fbc01a8017ca63197648eb84"]},"offset":"40905630"},"isIMEI.js":{"size":959,"integrity":{"algorithm":"SHA256","hash":"7ae1cf6b83ed135f8f1b558288db747d0b7f39e743ed83217f91d41cbeb86c9b","blockSize":4194304,"blocks":["7ae1cf6b83ed135f8f1b558288db747d0b7f39e743ed83217f91d41cbeb86c9b"]},"offset":"40910830"},"isIP.js":{"size":2846,"integrity":{"algorithm":"SHA256","hash":"c536433e81a21abceea8ee05e7b1678a1028b08c8961a9e797bff641755dfe43","blockSize":4194304,"blocks":["c536433e81a21abceea8ee05e7b1678a1028b08c8961a9e797bff641755dfe43"]},"offset":"40911789"},"isIPRange.js":{"size":1054,"integrity":{"algorithm":"SHA256","hash":"c2b63a75da14a96a6b417f59b4edf3af70de3b68268a9d98c3e8a33f1ba48d0e","blockSize":4194304,"blocks":["c2b63a75da14a96a6b417f59b4edf3af70de3b68268a9d98c3e8a33f1ba48d0e"]},"offset":"40914635"},"isISBN.js":{"size":1161,"integrity":{"algorithm":"SHA256","hash":"4d7d1f455bb4e6284cad5df1c0a270cdcdf0ca45649bfd0e1bfe39d256137b33","blockSize":4194304,"blocks":["4d7d1f455bb4e6284cad5df1c0a270cdcdf0ca45649bfd0e1bfe39d256137b33"]},"offset":"40915689"},"isISIN.js":{"size":1584,"integrity":{"algorithm":"SHA256","hash":"93801a6f044988caec5b10240bfd978927518294b6867c9135cc3f0675840c79","blockSize":4194304,"blocks":["93801a6f044988caec5b10240bfd978927518294b6867c9135cc3f0675840c79"]},"offset":"40916850"},"isISO31661Alpha2.js":{"size":1849,"integrity":{"algorithm":"SHA256","hash":"5e2bcf514159cbda66faf94d21f317389b7052bc3508dd2acee61090de30c33c","blockSize":4194304,"blocks":["5e2bcf514159cbda66faf94d21f317389b7052bc3508dd2acee61090de30c33c"]},"offset":"40918434"},"isISO31661Alpha3.js":{"size":2037,"integrity":{"algorithm":"SHA256","hash":"1bd592ae32d93c63235416975b905ff3e8c43c9bd7337b8049f7242a0fffeb6e","blockSize":4194304,"blocks":["1bd592ae32d93c63235416975b905ff3e8c43c9bd7337b8049f7242a0fffeb6e"]},"offset":"40920283"},"isISO4217.js":{"size":1568,"integrity":{"algorithm":"SHA256","hash":"1387c0d870ddfa67b52f57cb67f5b63220683862f7f0158410a7fc328a857ebc","blockSize":4194304,"blocks":["1387c0d870ddfa67b52f57cb67f5b63220683862f7f0158410a7fc328a857ebc"]},"offset":"40922320"},"isISO8601.js":{"size":2184,"integrity":{"algorithm":"SHA256","hash":"e8b096b7d27b32d4408631801a5c41478a5409340bc7d18400e0149107f9fdcb","blockSize":4194304,"blocks":["e8b096b7d27b32d4408631801a5c41478a5409340bc7d18400e0149107f9fdcb"]},"offset":"40923888"},"isISRC.js":{"size":237,"integrity":{"algorithm":"SHA256","hash":"6c3a720046c45356f3b98a8d454bb10b67a21a990ac0095a25e4523411793b34","blockSize":4194304,"blocks":["6c3a720046c45356f3b98a8d454bb10b67a21a990ac0095a25e4523411793b34"]},"offset":"40926072"},"isISSN.js":{"size":708,"integrity":{"algorithm":"SHA256","hash":"b88f4d391e813c5bcfcc19fb52901e94107cf671fd5a8fb3b861a42cf63b07c0","blockSize":4194304,"blocks":["b88f4d391e813c5bcfcc19fb52901e94107cf671fd5a8fb3b861a42cf63b07c0"]},"offset":"40926309"},"isIdentityCard.js":{"size":11005,"integrity":{"algorithm":"SHA256","hash":"a55f2a50d8820fad93e5418d5fdff0bbf21d886f1264a508c89411fd0256b898","blockSize":4194304,"blocks":["a55f2a50d8820fad93e5418d5fdff0bbf21d886f1264a508c89411fd0256b898"]},"offset":"40927017"},"isIn.js":{"size":1167,"integrity":{"algorithm":"SHA256","hash":"5e1c16c8219cea149bf4b2a64530a8815ad7b30e10784c3478c66fd5466c2785","blockSize":4194304,"blocks":["5e1c16c8219cea149bf4b2a64530a8815ad7b30e10784c3478c66fd5466c2785"]},"offset":"40938022"},"isInt.js":{"size":862,"integrity":{"algorithm":"SHA256","hash":"0998b797d5a7cd22513b6e4509621d084dc47b647c3de3a79bab7637e14ffd22","blockSize":4194304,"blocks":["0998b797d5a7cd22513b6e4509621d084dc47b647c3de3a79bab7637e14ffd22"]},"offset":"40939189"},"isJSON.js":{"size":919,"integrity":{"algorithm":"SHA256","hash":"434a4f1558bc6b94de5b3cfc638738ee03b56e428f8f6fc6aee20e4398f28b5f","blockSize":4194304,"blocks":["434a4f1558bc6b94de5b3cfc638738ee03b56e428f8f6fc6aee20e4398f28b5f"]},"offset":"40940051"},"isJWT.js":{"size":387,"integrity":{"algorithm":"SHA256","hash":"f3be8f5a70ae60c4d93c6c3c290de36d7d2bbfd5f6e19695106be455c42bf63a","blockSize":4194304,"blocks":["f3be8f5a70ae60c4d93c6c3c290de36d7d2bbfd5f6e19695106be455c42bf63a"]},"offset":"40940970"},"isLatLong.js":{"size":910,"integrity":{"algorithm":"SHA256","hash":"9944fe30066c8becbcc6b8ce6dd5e9a427a244be19eb3a53343ad31de3ed520b","blockSize":4194304,"blocks":["9944fe30066c8becbcc6b8ce6dd5e9a427a244be19eb3a53343ad31de3ed520b"]},"offset":"40941357"},"isLength.js":{"size":971,"integrity":{"algorithm":"SHA256","hash":"3204b1bf28cee172a220674d7bbc962b1835c41487c6fb4f4fcba57070302bf3","blockSize":4194304,"blocks":["3204b1bf28cee172a220674d7bbc962b1835c41487c6fb4f4fcba57070302bf3"]},"offset":"40942267"},"isLicensePlate.js":{"size":3836,"integrity":{"algorithm":"SHA256","hash":"0097aa630c5a1cb5533c45f6287e157a724f97dd65a25f6ac14f40fbeada1019","blockSize":4194304,"blocks":["0097aa630c5a1cb5533c45f6287e157a724f97dd65a25f6ac14f40fbeada1019"]},"offset":"40943238"},"isLocale.js":{"size":313,"integrity":{"algorithm":"SHA256","hash":"7394bfd2e7929e51e823ef58a9496fc83db6b08a74e30462c3788dd658f75b70","blockSize":4194304,"blocks":["7394bfd2e7929e51e823ef58a9496fc83db6b08a74e30462c3788dd658f75b70"]},"offset":"40947074"},"isLowercase.js":{"size":149,"integrity":{"algorithm":"SHA256","hash":"89944b4b8a8df2bc6d6f3661b26e65d78a24a4120e4c794f084adbf5f028a854","blockSize":4194304,"blocks":["89944b4b8a8df2bc6d6f3661b26e65d78a24a4120e4c794f084adbf5f028a854"]},"offset":"40947387"},"isMACAddress.js":{"size":582,"integrity":{"algorithm":"SHA256","hash":"f4772847ff1c08180754f2bb0ca0ca26c30631ae071c0b1bd614282ea6a82ec4","blockSize":4194304,"blocks":["f4772847ff1c08180754f2bb0ca0ca26c30631ae071c0b1bd614282ea6a82ec4"]},"offset":"40947536"},"isMD5.js":{"size":159,"integrity":{"algorithm":"SHA256","hash":"8f412ff82797d44eb7bb87a8a2e79df09e997ec87102dc8afc2128a7c0c0a490","blockSize":4194304,"blocks":["8f412ff82797d44eb7bb87a8a2e79df09e997ec87102dc8afc2128a7c0c0a490"]},"offset":"40948118"},"isMagnetURI.js":{"size":293,"integrity":{"algorithm":"SHA256","hash":"178cfb861c54eef676b36c907d1fab6b013fec3976afe10501772e7d176ddd92","blockSize":4194304,"blocks":["178cfb861c54eef676b36c907d1fab6b013fec3976afe10501772e7d176ddd92"]},"offset":"40948277"},"isMimeType.js":{"size":1928,"integrity":{"algorithm":"SHA256","hash":"f2315c943f439294576359aef31cb5f1d5233f98baeb59efcdc86340874d2bfd","blockSize":4194304,"blocks":["f2315c943f439294576359aef31cb5f1d5233f98baeb59efcdc86340874d2bfd"]},"offset":"40948570"},"isMobilePhone.js":{"size":7485,"integrity":{"algorithm":"SHA256","hash":"5f7aedc33bded97dafa480915957230662f4b5285830b4882b4cdc53582c55f7","blockSize":4194304,"blocks":["5f7aedc33bded97dafa480915957230662f4b5285830b4882b4cdc53582c55f7"]},"offset":"40950498"},"isMongoId.js":{"size":206,"integrity":{"algorithm":"SHA256","hash":"4aed5b4ca5f4888f2e54a4c07ee40118033894b382be91ffa5477e809fe7200c","blockSize":4194304,"blocks":["4aed5b4ca5f4888f2e54a4c07ee40118033894b382be91ffa5477e809fe7200c"]},"offset":"40957983"},"isMultibyte.js":{"size":252,"integrity":{"algorithm":"SHA256","hash":"12d3f20947da00f78cf43355906f77b56a9b192b64c605601a6c84965c82a362","blockSize":4194304,"blocks":["12d3f20947da00f78cf43355906f77b56a9b192b64c605601a6c84965c82a362"]},"offset":"40958189"},"isNumeric.js":{"size":400,"integrity":{"algorithm":"SHA256","hash":"08efc06bdd99529d5f291bc0b88d7f259cbbfb53f6fac144f919988dd8332121","blockSize":4194304,"blocks":["08efc06bdd99529d5f291bc0b88d7f259cbbfb53f6fac144f919988dd8332121"]},"offset":"40958441"},"isOctal.js":{"size":165,"integrity":{"algorithm":"SHA256","hash":"c584451e0b092ce625f30e302a5fb1c8f76a54fa673f3f0a4c1ef112771805d1","blockSize":4194304,"blocks":["c584451e0b092ce625f30e302a5fb1c8f76a54fa673f3f0a4c1ef112771805d1"]},"offset":"40958841"},"isPassportNumber.js":{"size":2976,"integrity":{"algorithm":"SHA256","hash":"20a4c5ed600c8661791d2c106fd8e26cf7ba87f3917aaac5ee8d8d25ba3c0bb0","blockSize":4194304,"blocks":["20a4c5ed600c8661791d2c106fd8e26cf7ba87f3917aaac5ee8d8d25ba3c0bb0"]},"offset":"40959006"},"isPort.js":{"size":123,"integrity":{"algorithm":"SHA256","hash":"e4eacaf7e56ab4462c1b4a1c83f782248b3232b4c37246425f13c836ed4c8080","blockSize":4194304,"blocks":["e4eacaf7e56ab4462c1b4a1c83f782248b3232b4c37246425f13c836ed4c8080"]},"offset":"40961982"},"isPostalCode.js":{"size":2489,"integrity":{"algorithm":"SHA256","hash":"8f858f036da526eab3427e21f740b0d5a90460507a80ecce71941cc035c8d51c","blockSize":4194304,"blocks":["8f858f036da526eab3427e21f740b0d5a90460507a80ecce71941cc035c8d51c"]},"offset":"40962105"},"isRFC3339.js":{"size":1056,"integrity":{"algorithm":"SHA256","hash":"0a8f216714677de5616ade77023d247baaa68a44e9b53f7b14faa69f17ceba28","blockSize":4194304,"blocks":["0a8f216714677de5616ade77023d247baaa68a44e9b53f7b14faa69f17ceba28"]},"offset":"40964594"},"isRgbColor.js":{"size":842,"integrity":{"algorithm":"SHA256","hash":"a35b2f2baec30e4beed8e555261c3c402472f2049b1c0f6aac71f20591278eaa","blockSize":4194304,"blocks":["a35b2f2baec30e4beed8e555261c3c402472f2049b1c0f6aac71f20591278eaa"]},"offset":"40965650"},"isSemVer.js":{"size":597,"integrity":{"algorithm":"SHA256","hash":"9bfea6bdfcb92c9c19a0462c0fd478e7a319420308c5c5a5f9263bada89c4b50","blockSize":4194304,"blocks":["9bfea6bdfcb92c9c19a0462c0fd478e7a319420308c5c5a5f9263bada89c4b50"]},"offset":"40966492"},"isSlug.js":{"size":212,"integrity":{"algorithm":"SHA256","hash":"cdfb69d94d05f39146aefbf7f494a8bcfb38c0af57733431f7cb04c0315c4572","blockSize":4194304,"blocks":["cdfb69d94d05f39146aefbf7f494a8bcfb38c0af57733431f7cb04c0315c4572"]},"offset":"40967089"},"isStrongPassword.js":{"size":2856,"integrity":{"algorithm":"SHA256","hash":"9b7e7740a2e1b55444a7f546f60fd18780752249488ca24c257d379e65bb88d5","blockSize":4194304,"blocks":["9b7e7740a2e1b55444a7f546f60fd18780752249488ca24c257d379e65bb88d5"]},"offset":"40967301"},"isSurrogatePair.js":{"size":205,"integrity":{"algorithm":"SHA256","hash":"6f592990b6ab3fe3a75bcd0604cdc2eeaf7c40f6be7d8c59abac7ca03524ee5b","blockSize":4194304,"blocks":["6f592990b6ab3fe3a75bcd0604cdc2eeaf7c40f6be7d8c59abac7ca03524ee5b"]},"offset":"40970157"},"isTaxID.js":{"size":39521,"integrity":{"algorithm":"SHA256","hash":"a3998c9f2d23b6d050fcea987083453aee8a6d1a6f23764a7cd85625eac3af53","blockSize":4194304,"blocks":["a3998c9f2d23b6d050fcea987083453aee8a6d1a6f23764a7cd85625eac3af53"]},"offset":"40970362"},"isURL.js":{"size":5754,"integrity":{"algorithm":"SHA256","hash":"59460b5b6088c5f9ba1429487b6200c18f6c7f08dade694cb492a9c269dab675","blockSize":4194304,"blocks":["59460b5b6088c5f9ba1429487b6200c18f6c7f08dade694cb492a9c269dab675"]},"offset":"41009883"},"isUUID.js":{"size":702,"integrity":{"algorithm":"SHA256","hash":"1337892f549fd7a8e0b7759b96bf936da5fcaf5fc8d6847a7995b16b2216bc3b","blockSize":4194304,"blocks":["1337892f549fd7a8e0b7759b96bf936da5fcaf5fc8d6847a7995b16b2216bc3b"]},"offset":"41015637"},"isUppercase.js":{"size":149,"integrity":{"algorithm":"SHA256","hash":"0300f422cda0a27085be4527a2f968098366a159898f15e4d508f62165b34f39","blockSize":4194304,"blocks":["0300f422cda0a27085be4527a2f968098366a159898f15e4d508f62165b34f39"]},"offset":"41016339"},"isVAT.js":{"size":493,"integrity":{"algorithm":"SHA256","hash":"972f0b8d8514cb264d14e11f591121a7fa02ca064a3625945135305b2a43d31b","blockSize":4194304,"blocks":["972f0b8d8514cb264d14e11f591121a7fa02ca064a3625945135305b2a43d31b"]},"offset":"41016488"},"isVariableWidth.js":{"size":256,"integrity":{"algorithm":"SHA256","hash":"2b52219140411b58cb680252ddec538cbd33af4f9f01bb754348d297e5ebf151","blockSize":4194304,"blocks":["2b52219140411b58cb680252ddec538cbd33af4f9f01bb754348d297e5ebf151"]},"offset":"41016981"},"isWhitelisted.js":{"size":255,"integrity":{"algorithm":"SHA256","hash":"db27822f919e4ed4944ebe1adb1d47b34fa6c588e065b64e8d28ea916844e3b4","blockSize":4194304,"blocks":["db27822f919e4ed4944ebe1adb1d47b34fa6c588e065b64e8d28ea916844e3b4"]},"offset":"41017237"},"ltrim.js":{"size":360,"integrity":{"algorithm":"SHA256","hash":"030004a7127e323571583eb8e2de47eb6ed95d8fb116ade244154a67df4a1e18","blockSize":4194304,"blocks":["030004a7127e323571583eb8e2de47eb6ed95d8fb116ade244154a67df4a1e18"]},"offset":"41017492"},"matches.js":{"size":280,"integrity":{"algorithm":"SHA256","hash":"2959286dc4a547688a065a21d3e7e185c02176bff85a647c2b004bc6d6be7f29","blockSize":4194304,"blocks":["2959286dc4a547688a065a21d3e7e185c02176bff85a647c2b004bc6d6be7f29"]},"offset":"41017852"},"normalizeEmail.js":{"size":6349,"integrity":{"algorithm":"SHA256","hash":"f5ec4548127cb604dd89596133d7604fa36e66dc6224bd660e4a1fc032591dc8","blockSize":4194304,"blocks":["f5ec4548127cb604dd89596133d7604fa36e66dc6224bd660e4a1fc032591dc8"]},"offset":"41018132"},"rtrim.js":{"size":627,"integrity":{"algorithm":"SHA256","hash":"31bd6fc36988ea3bf54e2b3874de6de1a61290204c5b5f40f9ce8d2f011f6fe6","blockSize":4194304,"blocks":["31bd6fc36988ea3bf54e2b3874de6de1a61290204c5b5f40f9ce8d2f011f6fe6"]},"offset":"41024481"},"stripLow.js":{"size":288,"integrity":{"algorithm":"SHA256","hash":"3258d89fc0945a90c826e52f54bcd5239ae63899f77cefe98dce3c486428eb20","blockSize":4194304,"blocks":["3258d89fc0945a90c826e52f54bcd5239ae63899f77cefe98dce3c486428eb20"]},"offset":"41025108"},"toBoolean.js":{"size":249,"integrity":{"algorithm":"SHA256","hash":"1f3073d90beb319bc348000ba4ab314d3dc7614053c6d586c86b80881858f0c0","blockSize":4194304,"blocks":["1f3073d90beb319bc348000ba4ab314d3dc7614053c6d586c86b80881858f0c0"]},"offset":"41025396"},"toDate.js":{"size":184,"integrity":{"algorithm":"SHA256","hash":"98bb6bf2258a1a84fc567c5775163fe1a9b2ee1d240cb4f433f3fc14c325b727","blockSize":4194304,"blocks":["98bb6bf2258a1a84fc567c5775163fe1a9b2ee1d240cb4f433f3fc14c325b727"]},"offset":"41025645"},"toFloat.js":{"size":132,"integrity":{"algorithm":"SHA256","hash":"d9d73919f02b3e2ea9ae10efc1dddc655901f2079da3860ad3e084770ff56632","blockSize":4194304,"blocks":["d9d73919f02b3e2ea9ae10efc1dddc655901f2079da3860ad3e084770ff56632"]},"offset":"41025829"},"toInt.js":{"size":151,"integrity":{"algorithm":"SHA256","hash":"071314c3938eed26ced388ecd481cad10c863f855bc5914975828c26ab34af0e","blockSize":4194304,"blocks":["071314c3938eed26ced388ecd481cad10c863f855bc5914975828c26ab34af0e"]},"offset":"41025961"},"trim.js":{"size":144,"integrity":{"algorithm":"SHA256","hash":"f379c9d901f951e6802d8521aa6cb59ade0fffd79ae8ef1a18065e43f31f2a5e","blockSize":4194304,"blocks":["f379c9d901f951e6802d8521aa6cb59ade0fffd79ae8ef1a18065e43f31f2a5e"]},"offset":"41026112"},"unescape.js":{"size":496,"integrity":{"algorithm":"SHA256","hash":"554582061a745a5d23edfcd180abf14f6499d41edba290bef8e81c63ee024181","blockSize":4194304,"blocks":["554582061a745a5d23edfcd180abf14f6499d41edba290bef8e81c63ee024181"]},"offset":"41026256"},"whitelist.js":{"size":187,"integrity":{"algorithm":"SHA256","hash":"d3fe4f91030fe21d7221cea8a2a871d706842a12d73833eed664a01f121c0681","blockSize":4194304,"blocks":["d3fe4f91030fe21d7221cea8a2a871d706842a12d73833eed664a01f121c0681"]},"offset":"41026752"},"util":{"files":{"algorithms.js":{"size":2861,"integrity":{"algorithm":"SHA256","hash":"b25f8125cd13eb9cc416ec4e5e6679c696432c687cc004aab28826f187567277","blockSize":4194304,"blocks":["b25f8125cd13eb9cc416ec4e5e6679c696432c687cc004aab28826f187567277"]},"offset":"41026939"},"assertString.js":{"size":761,"integrity":{"algorithm":"SHA256","hash":"5b819d3972ca59c9f30fc4412696ba35dc3117f88659b2dfb4054bc454c05941","blockSize":4194304,"blocks":["5b819d3972ca59c9f30fc4412696ba35dc3117f88659b2dfb4054bc454c05941"]},"offset":"41029800"},"includes.js":{"size":144,"integrity":{"algorithm":"SHA256","hash":"ce75c031adfffb8638395d07a7f3f9c39b1b690809580c8a6345677653628c88","blockSize":4194304,"blocks":["ce75c031adfffb8638395d07a7f3f9c39b1b690809580c8a6345677653628c88"]},"offset":"41030561"},"merge.js":{"size":316,"integrity":{"algorithm":"SHA256","hash":"4a908feff6d2c4f4c84a27dada999f5f7d0ed475eeb26209a3f54541ff3963e0","blockSize":4194304,"blocks":["4a908feff6d2c4f4c84a27dada999f5f7d0ed475eeb26209a3f54541ff3963e0"]},"offset":"41030705"},"multilineRegex.js":{"size":329,"integrity":{"algorithm":"SHA256","hash":"dd270c0bc194da7e70713c329ff107a38384a752b4b385085f6af902dc149f46","blockSize":4194304,"blocks":["dd270c0bc194da7e70713c329ff107a38384a752b4b385085f6af902dc149f46"]},"offset":"41031021"},"toString.js":{"size":751,"integrity":{"algorithm":"SHA256","hash":"eb3b5e20f4166d8225d0a22c0da1ba60c823762d374d1af660d8016f05339417","blockSize":4194304,"blocks":["eb3b5e20f4166d8225d0a22c0da1ba60c823762d374d1af660d8016f05339417"]},"offset":"41031350"},"typeOf.js":{"size":313,"integrity":{"algorithm":"SHA256","hash":"ddd490e6ce840a6baae190343e0ea1b00beb6e610a4fe4e0fb7f1b505f82bea2","blockSize":4194304,"blocks":["ddd490e6ce840a6baae190343e0ea1b00beb6e610a4fe4e0fb7f1b505f82bea2"]},"offset":"41032101"}}}}}}}}},"vary":{"files":{"HISTORY.md":{"size":792,"integrity":{"algorithm":"SHA256","hash":"273b0ea4abb4c7357db4eed63e84f7a283847ed0165d041b25be37071284d7e5","blockSize":4194304,"blocks":["273b0ea4abb4c7357db4eed63e84f7a283847ed0165d041b25be37071284d7e5"]},"offset":"41032414"},"LICENSE":{"size":1094,"integrity":{"algorithm":"SHA256","hash":"bd47ce7b88c7759630d1e2b9fcfa170a0f1fde522be09e13fb1581a79d090400","blockSize":4194304,"blocks":["bd47ce7b88c7759630d1e2b9fcfa170a0f1fde522be09e13fb1581a79d090400"]},"offset":"41033206"},"index.js":{"size":2930,"integrity":{"algorithm":"SHA256","hash":"8e40311960636d40473c57e335bbca115036766bf150df296b941256432ab410","blockSize":4194304,"blocks":["8e40311960636d40473c57e335bbca115036766bf150df296b941256432ab410"]},"offset":"41034300"},"package.json":{"size":756,"integrity":{"algorithm":"SHA256","hash":"36305415feda3fe75fca621bc2c7493b1c2eab616bc3b4c5fb37be20052cf0b7","blockSize":4194304,"blocks":["36305415feda3fe75fca621bc2c7493b1c2eab616bc3b4c5fb37be20052cf0b7"]},"offset":"41037230"}}},"which":{"files":{"LICENSE":{"size":765,"integrity":{"algorithm":"SHA256","hash":"4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b","blockSize":4194304,"blocks":["4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b"]},"offset":"41037986"},"package.json":{"size":681,"integrity":{"algorithm":"SHA256","hash":"2e6138fb27d6ede860f361a0906d97e273f1f9f8efece31ed6416773ba9794e5","blockSize":4194304,"blocks":["2e6138fb27d6ede860f361a0906d97e273f1f9f8efece31ed6416773ba9794e5"]},"offset":"41038751"},"which.js":{"size":3163,"integrity":{"algorithm":"SHA256","hash":"76845e1fe7851267fb7ee72b18f2d916996d330150e31e48f4657a79e9b46b5b","blockSize":4194304,"blocks":["76845e1fe7851267fb7ee72b18f2d916996d330150e31e48f4657a79e9b46b5b"]},"offset":"41039432"},"bin":{"files":{"node-which":{"size":985,"integrity":{"algorithm":"SHA256","hash":"055f0ac4eed1a1591d033d59462972968bf3483b4cc07e163589569c0fb999f0","blockSize":4194304,"blocks":["055f0ac4eed1a1591d033d59462972968bf3483b4cc07e163589569c0fb999f0"]},"offset":"41042595"}}}}},"which-boxed-primitive":{"files":{".editorconfig":{"size":286,"integrity":{"algorithm":"SHA256","hash":"0a73be687a86b6f0e5494b1be555fcfbb886108794948837170c28f18820aae2","blockSize":4194304,"blocks":["0a73be687a86b6f0e5494b1be555fcfbb886108794948837170c28f18820aae2"]},"offset":"41043580"},".eslintignore":{"size":10,"integrity":{"algorithm":"SHA256","hash":"5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290","blockSize":4194304,"blocks":["5c5daf48fdf4db42e16c29b5b3de54984bafe0c2ff367a186ca97f1d4ed48290"]},"offset":"41043866"},".nycrc":{"size":216,"integrity":{"algorithm":"SHA256","hash":"948366fea3b423a46366326d0bb2e54b08abd1cf0b243678ba6625740c40da5a","blockSize":4194304,"blocks":["948366fea3b423a46366326d0bb2e54b08abd1cf0b243678ba6625740c40da5a"]},"offset":"41043876"},"LICENSE":{"size":1071,"integrity":{"algorithm":"SHA256","hash":"cfc3f455254c0af0655cc3ff46a41ed644b67599f6043346169d285bf2b3cf3b","blockSize":4194304,"blocks":["cfc3f455254c0af0655cc3ff46a41ed644b67599f6043346169d285bf2b3cf3b"]},"offset":"41044092"},"index.js":{"size":691,"integrity":{"algorithm":"SHA256","hash":"b08b002fa26766778488e808b1f67274b7752185935e85c4eff022292216695c","blockSize":4194304,"blocks":["b08b002fa26766778488e808b1f67274b7752185935e85c4eff022292216695c"]},"offset":"41045163"},"package.json":{"size":1153,"integrity":{"algorithm":"SHA256","hash":"dd6010e7fe5d0b347e3be507d87cc440f87a327765b1d738165a3b943a838b94","blockSize":4194304,"blocks":["dd6010e7fe5d0b347e3be507d87cc440f87a327765b1d738165a3b943a838b94"]},"offset":"41045854"},".github":{"files":{"FUNDING.yml":{"size":592,"integrity":{"algorithm":"SHA256","hash":"32d10c27102889b92eb564c34f6e36371b6a3353abe6d813eb6f88517578ffe6","blockSize":4194304,"blocks":["32d10c27102889b92eb564c34f6e36371b6a3353abe6d813eb6f88517578ffe6"]},"offset":"41047007"}}}}},"wide-align":{"files":{"LICENSE":{"size":752,"integrity":{"algorithm":"SHA256","hash":"0cef05dfff8b6aa7f35596984f5709f0d17c2582924a751efa471a76de7cdc11","blockSize":4194304,"blocks":["0cef05dfff8b6aa7f35596984f5709f0d17c2582924a751efa471a76de7cdc11"]},"offset":"41047599"},"align.js":{"size":1428,"integrity":{"algorithm":"SHA256","hash":"6d29d75e7e7bc9b9dddf7111a024db41410a0a7d36f90bf06e6be77d1366c03e","blockSize":4194304,"blocks":["6d29d75e7e7bc9b9dddf7111a024db41410a0a7d36f90bf06e6be77d1366c03e"]},"offset":"41048351"},"package.json":{"size":579,"integrity":{"algorithm":"SHA256","hash":"fc9b6aab5980c0eb7bfda986ce2c54ec38e088d32401f13b1e4dec64d2a4748e","blockSize":4194304,"blocks":["fc9b6aab5980c0eb7bfda986ce2c54ec38e088d32401f13b1e4dec64d2a4748e"]},"offset":"41049779"}}},"wkx":{"files":{"LICENSE.txt":{"size":1104,"integrity":{"algorithm":"SHA256","hash":"a6eaa084d5c73e2a886fb641c195d22fc4e4d38b234b5b11f9deb5acfbdbce21","blockSize":4194304,"blocks":["a6eaa084d5c73e2a886fb641c195d22fc4e4d38b234b5b11f9deb5acfbdbce21"]},"offset":"41050358"},"package.json":{"size":722,"integrity":{"algorithm":"SHA256","hash":"72cf3896d00ad7859b5b3e14f92c0a30be9eefccbc01d8c85e77537b3818a45e","blockSize":4194304,"blocks":["72cf3896d00ad7859b5b3e14f92c0a30be9eefccbc01d8c85e77537b3818a45e"]},"offset":"41051462"},"lib":{"files":{"binaryreader.js":{"size":1719,"integrity":{"algorithm":"SHA256","hash":"13a565f06cf5ab9d840bdb766e6155a4778ddac91b740f7f13b6dfc4192c46f4","blockSize":4194304,"blocks":["13a565f06cf5ab9d840bdb766e6155a4778ddac91b740f7f13b6dfc4192c46f4"]},"offset":"41052184"},"binarywriter.js":{"size":2447,"integrity":{"algorithm":"SHA256","hash":"bf2f9aa10b2639bd7890d63b5542498a3b8e56e2f02ddcf4617c283149e192ec","blockSize":4194304,"blocks":["bf2f9aa10b2639bd7890d63b5542498a3b8e56e2f02ddcf4617c283149e192ec"]},"offset":"41053903"},"geometry.js":{"size":12236,"integrity":{"algorithm":"SHA256","hash":"42bfcade2d3f3961f71225c5e48308d3cd27357bbee609279e351229080118b4","blockSize":4194304,"blocks":["42bfcade2d3f3961f71225c5e48308d3cd27357bbee609279e351229080118b4"]},"offset":"41056350"},"geometrycollection.js":{"size":5023,"integrity":{"algorithm":"SHA256","hash":"c4e24927edff896862c212114dc13185f2a91a1a2bc916c7be80d057c6f98c09","blockSize":4194304,"blocks":["c4e24927edff896862c212114dc13185f2a91a1a2bc916c7be80d057c6f98c09"]},"offset":"41068586"},"linestring.js":{"size":4952,"integrity":{"algorithm":"SHA256","hash":"46a932538af0fa0d6713cc7cdd1ab32dad262a9acedca8ded2cf1655c6b70ebe","blockSize":4194304,"blocks":["46a932538af0fa0d6713cc7cdd1ab32dad262a9acedca8ded2cf1655c6b70ebe"]},"offset":"41073609"},"multilinestring.js":{"size":5758,"integrity":{"algorithm":"SHA256","hash":"8398e55097fe2d051112f71502cd0a67ff8f6372567c64373a3533fcc6a26d9f","blockSize":4194304,"blocks":["8398e55097fe2d051112f71502cd0a67ff8f6372567c64373a3533fcc6a26d9f"]},"offset":"41078561"},"multipoint.js":{"size":4723,"integrity":{"algorithm":"SHA256","hash":"98aa3a364bffc5b540150021d15d363b0636405a0c84872064f93aa9fb86b99f","blockSize":4194304,"blocks":["98aa3a364bffc5b540150021d15d363b0636405a0c84872064f93aa9fb86b99f"]},"offset":"41084319"},"multipolygon.js":{"size":6770,"integrity":{"algorithm":"SHA256","hash":"cce98325e7f309b9d1e647380ffe768cb60dd840ea65089d12c3060f150a27b4","blockSize":4194304,"blocks":["cce98325e7f309b9d1e647380ffe768cb60dd840ea65089d12c3060f150a27b4"]},"offset":"41089042"},"point.js":{"size":6221,"integrity":{"algorithm":"SHA256","hash":"5c05e0400472d4d49a09a364e4f766c010bca7815c9c19333dc0bd7790f55ddb","blockSize":4194304,"blocks":["5c05e0400472d4d49a09a364e4f766c010bca7815c9c19333dc0bd7790f55ddb"]},"offset":"41095812"},"polygon.js":{"size":8508,"integrity":{"algorithm":"SHA256","hash":"6fc99377d7acaf24f21c613c6d0af4b3a99af4b1338ff29ba9c6a93b1bf39527","blockSize":4194304,"blocks":["6fc99377d7acaf24f21c613c6d0af4b3a99af4b1338ff29ba9c6a93b1bf39527"]},"offset":"41102033"},"types.js":{"size":777,"integrity":{"algorithm":"SHA256","hash":"0afa55b586935cc0ff248571dc5daf06ce4a60ca45902fd55695cf82235bee5e","blockSize":4194304,"blocks":["0afa55b586935cc0ff248571dc5daf06ce4a60ca45902fd55695cf82235bee5e"]},"offset":"41110541"},"wktparser.js":{"size":3645,"integrity":{"algorithm":"SHA256","hash":"5ac4abe7933d7e9c21bde9da5145c8b8eca14aa8ab3c3d8cedf0e2dfa8efa6ad","blockSize":4194304,"blocks":["5ac4abe7933d7e9c21bde9da5145c8b8eca14aa8ab3c3d8cedf0e2dfa8efa6ad"]},"offset":"41111318"},"wkx.js":{"size":421,"integrity":{"algorithm":"SHA256","hash":"4d8aeaec15234fac71c93ef2efb63261055393ea25ee61f137975824785a2784","blockSize":4194304,"blocks":["4d8aeaec15234fac71c93ef2efb63261055393ea25ee61f137975824785a2784"]},"offset":"41114963"},"zigzag.js":{"size":196,"integrity":{"algorithm":"SHA256","hash":"98443c5378b0f7b88dc4b96f44fa7ad3b5afbd1df5a96fd8b6a79bbf0db4cd65","blockSize":4194304,"blocks":["98443c5378b0f7b88dc4b96f44fa7ad3b5afbd1df5a96fd8b6a79bbf0db4cd65"]},"offset":"41115384"}}},"dist":{"files":{"wkx.js":{"size":144661,"integrity":{"algorithm":"SHA256","hash":"99f4de21364f6d748d7801bf1de90f8a2b2c03de464ed14fe06e1e8b871c6ba8","blockSize":4194304,"blocks":["99f4de21364f6d748d7801bf1de90f8a2b2c03de464ed14fe06e1e8b871c6ba8"]},"offset":"41115580"},"wkx.min.js":{"size":65323,"integrity":{"algorithm":"SHA256","hash":"4cae5ba8b3443494df9e6d06fc8d5367e27d851703a2b58fb9dcc926cac2abf0","blockSize":4194304,"blocks":["4cae5ba8b3443494df9e6d06fc8d5367e27d851703a2b58fb9dcc926cac2abf0"]},"offset":"41260241"}}}}},"wrappy":{"files":{"LICENSE":{"size":765,"integrity":{"algorithm":"SHA256","hash":"4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b","blockSize":4194304,"blocks":["4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b"]},"offset":"41325564"},"package.json":{"size":479,"integrity":{"algorithm":"SHA256","hash":"21738eaf963f20de6b530101eb1880d537b9a33025eec7dd9f9168dc4ccfef0e","blockSize":4194304,"blocks":["21738eaf963f20de6b530101eb1880d537b9a33025eec7dd9f9168dc4ccfef0e"]},"offset":"41326329"},"wrappy.js":{"size":905,"integrity":{"algorithm":"SHA256","hash":"153453c4d84a3c2f13589c37055a7daff61d48475dcce554f7eedad15fc7b3e5","blockSize":4194304,"blocks":["153453c4d84a3c2f13589c37055a7daff61d48475dcce554f7eedad15fc7b3e5"]},"offset":"41326808"}}},"xml2js":{"files":{"LICENSE":{"size":1079,"integrity":{"algorithm":"SHA256","hash":"c51452ef1dfd5606c9fe266930fa6bf7e8a534d52973b6475df5bf212cad5b0a","blockSize":4194304,"blocks":["c51452ef1dfd5606c9fe266930fa6bf7e8a534d52973b6475df5bf212cad5b0a"]},"offset":"41327713"},"package.json":{"size":774,"integrity":{"algorithm":"SHA256","hash":"5d2b1d67b291781c4a3e761b8e4dfb9060bdc8968563e1fbd8cb7387d1afc1f7","blockSize":4194304,"blocks":["5d2b1d67b291781c4a3e761b8e4dfb9060bdc8968563e1fbd8cb7387d1afc1f7"]},"offset":"41328792"},"lib":{"files":{"bom.js":{"size":223,"integrity":{"algorithm":"SHA256","hash":"1de47fe90d67263709120bfa9fa70a4a45fdcbfda040a45a66a4bb2ec35764bc","blockSize":4194304,"blocks":["1de47fe90d67263709120bfa9fa70a4a45fdcbfda040a45a66a4bb2ec35764bc"]},"offset":"41329566"},"builder.js":{"size":4368,"integrity":{"algorithm":"SHA256","hash":"dda676dd2a256da3a87015c9c6b94400758a69c803050af04087a0f7442fe873","blockSize":4194304,"blocks":["dda676dd2a256da3a87015c9c6b94400758a69c803050af04087a0f7442fe873"]},"offset":"41329789"},"defaults.js":{"size":1663,"integrity":{"algorithm":"SHA256","hash":"1ca452c48115925ea1630f9ac5643cb9283814bf95279c9288373ebd5d056731","blockSize":4194304,"blocks":["1ca452c48115925ea1630f9ac5643cb9283814bf95279c9288373ebd5d056731"]},"offset":"41334157"},"parser.js":{"size":12896,"integrity":{"algorithm":"SHA256","hash":"4cf7f135f0e3b4ce15ebc2ed1ff00632b1a40c2b362acc19a7d8800fe2cc4428","blockSize":4194304,"blocks":["4cf7f135f0e3b4ce15ebc2ed1ff00632b1a40c2b362acc19a7d8800fe2cc4428"]},"offset":"41335820"},"processors.js":{"size":726,"integrity":{"algorithm":"SHA256","hash":"917b3df3d27bd272e030cd726752e59bde327976cdb302877f5978f32b68deaa","blockSize":4194304,"blocks":["917b3df3d27bd272e030cd726752e59bde327976cdb302877f5978f32b68deaa"]},"offset":"41348716"},"xml2js.js":{"size":1062,"integrity":{"algorithm":"SHA256","hash":"084d4a06521b7040e97a7eb33a65094e562d8a5766c80dc2baafd3b936a9ed04","blockSize":4194304,"blocks":["084d4a06521b7040e97a7eb33a65094e562d8a5766c80dc2baafd3b936a9ed04"]},"offset":"41349442"}}}}},"xmlbuilder":{"files":{"LICENSE":{"size":1101,"integrity":{"algorithm":"SHA256","hash":"e368bc4263b466cf98c225af15e300549e00da8859416a4536109e9654d434a8","blockSize":4194304,"blocks":["e368bc4263b466cf98c225af15e300549e00da8859416a4536109e9654d434a8"]},"offset":"41350504"},"package.json":{"size":610,"integrity":{"algorithm":"SHA256","hash":"54d89306f5c9ebf3a7a70b91a06a00afd283a7a732a01e76ae94fe8f9362540c","blockSize":4194304,"blocks":["54d89306f5c9ebf3a7a70b91a06a00afd283a7a732a01e76ae94fe8f9362540c"]},"offset":"41351605"},"lib":{"files":{"Derivation.js":{"size":156,"integrity":{"algorithm":"SHA256","hash":"c8d49354f512f64fb6a10a75ef298c09c0316be8424b357dc5f00c3413b62a0f","blockSize":4194304,"blocks":["c8d49354f512f64fb6a10a75ef298c09c0316be8424b357dc5f00c3413b62a0f"]},"offset":"41352215"},"DocumentPosition.js":{"size":218,"integrity":{"algorithm":"SHA256","hash":"33e04d52b7bae8633b79f22e30b7fed7ca35d6b53ee8e325eb09a161ec0b3fe4","blockSize":4194304,"blocks":["33e04d52b7bae8633b79f22e30b7fed7ca35d6b53ee8e325eb09a161ec0b3fe4"]},"offset":"41352371"},"NodeType.js":{"size":449,"integrity":{"algorithm":"SHA256","hash":"797c1983852a246fc594da773d761d0e4f9dfad8b63029696e0a0ba4c6a886c4","blockSize":4194304,"blocks":["797c1983852a246fc594da773d761d0e4f9dfad8b63029696e0a0ba4c6a886c4"]},"offset":"41352589"},"OperationType.js":{"size":171,"integrity":{"algorithm":"SHA256","hash":"c3f260450730de1a969afdd4f9384471061f2b1f37e5a01a785372110487af51","blockSize":4194304,"blocks":["c3f260450730de1a969afdd4f9384471061f2b1f37e5a01a785372110487af51"]},"offset":"41353038"},"Utility.js":{"size":2149,"integrity":{"algorithm":"SHA256","hash":"8905bc5d2bf8f61bc5085bd218fc861d30a1346871722573c415443cf32aaa05","blockSize":4194304,"blocks":["8905bc5d2bf8f61bc5085bd218fc861d30a1346871722573c415443cf32aaa05"]},"offset":"41353209"},"WriterState.js":{"size":155,"integrity":{"algorithm":"SHA256","hash":"babb03e06bd1b1b996e2b32fe61a961cca20c10678369acd978e2936f9c0e7ae","blockSize":4194304,"blocks":["babb03e06bd1b1b996e2b32fe61a961cca20c10678369acd978e2936f9c0e7ae"]},"offset":"41355358"},"XMLAttribute.js":{"size":2676,"integrity":{"algorithm":"SHA256","hash":"767b124d5274dde7e448a08bffbe17512599cd544d206eaef1eedaf4cd4bc89b","blockSize":4194304,"blocks":["767b124d5274dde7e448a08bffbe17512599cd544d206eaef1eedaf4cd4bc89b"]},"offset":"41355513"},"XMLCData.js":{"size":1216,"integrity":{"algorithm":"SHA256","hash":"6b5e194914e937d8a27729d7ffa06d0535a0811d921198375af487da65186fe7","blockSize":4194304,"blocks":["6b5e194914e937d8a27729d7ffa06d0535a0811d921198375af487da65186fe7"]},"offset":"41358189"},"XMLCharacterData.js":{"size":2477,"integrity":{"algorithm":"SHA256","hash":"e658f146fb5389b5e5133cea4b4970c79d2a07cbeea4fc26e32b03cf0c999335","blockSize":4194304,"blocks":["e658f146fb5389b5e5133cea4b4970c79d2a07cbeea4fc26e32b03cf0c999335"]},"offset":"41359405"},"XMLComment.js":{"size":1234,"integrity":{"algorithm":"SHA256","hash":"98b6ad708dfc3489e28e64cad848bb76f494a556b7c48ecd692579a62f83f752","blockSize":4194304,"blocks":["98b6ad708dfc3489e28e64cad848bb76f494a556b7c48ecd692579a62f83f752"]},"offset":"41361882"},"XMLDOMConfiguration.js":{"size":1788,"integrity":{"algorithm":"SHA256","hash":"f9e6140c4dc7e18338f8e23411794dce69d3eddf8c7dc14b1dc7331acf2667fc","blockSize":4194304,"blocks":["f9e6140c4dc7e18338f8e23411794dce69d3eddf8c7dc14b1dc7331acf2667fc"]},"offset":"41363116"},"XMLDOMErrorHandler.js":{"size":328,"integrity":{"algorithm":"SHA256","hash":"fc7a97ada0b1ff19e67ceb9e7b77a4c23aa8a2a72c6b0032b71c727577204837","blockSize":4194304,"blocks":["fc7a97ada0b1ff19e67ceb9e7b77a4c23aa8a2a72c6b0032b71c727577204837"]},"offset":"41364904"},"XMLDOMImplementation.js":{"size":971,"integrity":{"algorithm":"SHA256","hash":"9a1023a1ab4a6ff8a21e8ab7143ab9229a23c18b98ba825dad8a13f249c07ce8","blockSize":4194304,"blocks":["9a1023a1ab4a6ff8a21e8ab7143ab9229a23c18b98ba825dad8a13f249c07ce8"]},"offset":"41365232"},"XMLDOMStringList.js":{"size":603,"integrity":{"algorithm":"SHA256","hash":"ff7c482102cffc5f99f177b236f7cf67619d04b6384d7a9429e8e4ea1dda2d30","blockSize":4194304,"blocks":["ff7c482102cffc5f99f177b236f7cf67619d04b6384d7a9429e8e4ea1dda2d30"]},"offset":"41366203"},"XMLDTDAttList.js":{"size":2401,"integrity":{"algorithm":"SHA256","hash":"64d81781b7a341d9a1aafd2fa24f3563d044fdcf623e2d23d2e9f3724acc698c","blockSize":4194304,"blocks":["64d81781b7a341d9a1aafd2fa24f3563d044fdcf623e2d23d2e9f3724acc698c"]},"offset":"41366806"},"XMLDTDElement.js":{"size":1324,"integrity":{"algorithm":"SHA256","hash":"74d130c9ef6b0337c1226b00c972c9f5c16d5f3ba6299fa43a48165cea17af97","blockSize":4194304,"blocks":["74d130c9ef6b0337c1226b00c972c9f5c16d5f3ba6299fa43a48165cea17af97"]},"offset":"41369207"},"XMLDTDEntity.js":{"size":3102,"integrity":{"algorithm":"SHA256","hash":"4203b43a46b8d61d6943da279152916fa2822a0cb6f222e243ef440414e7d02f","blockSize":4194304,"blocks":["4203b43a46b8d61d6943da279152916fa2822a0cb6f222e243ef440414e7d02f"]},"offset":"41370531"},"XMLDTDNotation.js":{"size":1772,"integrity":{"algorithm":"SHA256","hash":"816b177244e6d4ce8dd6d2fe03e2506f9726b91053d0dde3e9939a4849c14ab0","blockSize":4194304,"blocks":["816b177244e6d4ce8dd6d2fe03e2506f9726b91053d0dde3e9939a4849c14ab0"]},"offset":"41373633"},"XMLDeclaration.js":{"size":1517,"integrity":{"algorithm":"SHA256","hash":"52d51dc9864eeecb9c628c70805a290ec187f49afdfbc00c18384213b5befd0f","blockSize":4194304,"blocks":["52d51dc9864eeecb9c628c70805a290ec187f49afdfbc00c18384213b5befd0f"]},"offset":"41375405"},"XMLDocType.js":{"size":5605,"integrity":{"algorithm":"SHA256","hash":"4466d7dc96daa0fff3dac75134a9c4a407eecef2bc8793635b372dd88cc3ec16","blockSize":4194304,"blocks":["4466d7dc96daa0fff3dac75134a9c4a407eecef2bc8793635b372dd88cc3ec16"]},"offset":"41376922"},"XMLDocument.js":{"size":7897,"integrity":{"algorithm":"SHA256","hash":"e8c0d00ad0bf48ffe254afd7a7a2620a7c24755da936279d7e9393d5aa6b6270","blockSize":4194304,"blocks":["e8c0d00ad0bf48ffe254afd7a7a2620a7c24755da936279d7e9393d5aa6b6270"]},"offset":"41382527"},"XMLDocumentCB.js":{"size":17549,"integrity":{"algorithm":"SHA256","hash":"a336134bddb06b9e65c52eb1555f8ea3284300e914dd5110a8a584a6b4bcfd5e","blockSize":4194304,"blocks":["a336134bddb06b9e65c52eb1555f8ea3284300e914dd5110a8a584a6b4bcfd5e"]},"offset":"41390424"},"XMLDocumentFragment.js":{"size":860,"integrity":{"algorithm":"SHA256","hash":"f4e35779d963055a793f4689715b5857cd5685f0d463c4cb3056af1a9105c0f8","blockSize":4194304,"blocks":["f4e35779d963055a793f4689715b5857cd5685f0d463c4cb3056af1a9105c0f8"]},"offset":"41407973"},"XMLDummy.js":{"size":916,"integrity":{"algorithm":"SHA256","hash":"5af11153727a0731372bb93975e075c1f554ad1d6b7cf3dc1176af572133c99a","blockSize":4194304,"blocks":["5af11153727a0731372bb93975e075c1f554ad1d6b7cf3dc1176af572133c99a"]},"offset":"41408833"},"XMLElement.js":{"size":9541,"integrity":{"algorithm":"SHA256","hash":"36fc59f777d1266eea0ad5ee410332b4b8266b15f22702d1d655c9695e966185","blockSize":4194304,"blocks":["36fc59f777d1266eea0ad5ee410332b4b8266b15f22702d1d655c9695e966185"]},"offset":"41409749"},"XMLNamedNodeMap.js":{"size":1559,"integrity":{"algorithm":"SHA256","hash":"fa86354c2f54da5dde73dd8e836285fdeefbcc218da3daaca46a7c9c7efb9233","blockSize":4194304,"blocks":["fa86354c2f54da5dde73dd8e836285fdeefbcc218da3daaca46a7c9c7efb9233"]},"offset":"41419290"},"XMLNode.js":{"size":24156,"integrity":{"algorithm":"SHA256","hash":"4fe1e4e529cfe07f213b8bdb13b50454c3e582d8ae86c230ca0b72f9c78461c6","blockSize":4194304,"blocks":["4fe1e4e529cfe07f213b8bdb13b50454c3e582d8ae86c230ca0b72f9c78461c6"]},"offset":"41420849"},"XMLNodeFilter.js":{"size":1152,"integrity":{"algorithm":"SHA256","hash":"1932c68e456ee4e02a07c101fbde3a3074f2c04de06adf40c3d00b77597567ea","blockSize":4194304,"blocks":["1932c68e456ee4e02a07c101fbde3a3074f2c04de06adf40c3d00b77597567ea"]},"offset":"41445005"},"XMLNodeList.js":{"size":560,"integrity":{"algorithm":"SHA256","hash":"ab3d9534c592ae4bbde25ab3b6b59bf0adaed4b9be42d0688e538098f80cee74","blockSize":4194304,"blocks":["ab3d9534c592ae4bbde25ab3b6b59bf0adaed4b9be42d0688e538098f80cee74"]},"offset":"41446157"},"XMLProcessingInstruction.js":{"size":1777,"integrity":{"algorithm":"SHA256","hash":"967fac03889f901e280e4812d4e620fd1be0fb3ecf0bb9faec8cbd1a30ca3508","blockSize":4194304,"blocks":["967fac03889f901e280e4812d4e620fd1be0fb3ecf0bb9faec8cbd1a30ca3508"]},"offset":"41446717"},"XMLRaw.js":{"size":1120,"integrity":{"algorithm":"SHA256","hash":"59456ecb78fbed8af2df39c090f466df5d9d862b7893c15f78ed32af88abc250","blockSize":4194304,"blocks":["59456ecb78fbed8af2df39c090f466df5d9d862b7893c15f78ed32af88abc250"]},"offset":"41448494"},"XMLStreamWriter.js":{"size":7328,"integrity":{"algorithm":"SHA256","hash":"9dfd46767db1648e11109b64c5fc8ac03a21d03063c96ea4713317a93bdc4f5c","blockSize":4194304,"blocks":["9dfd46767db1648e11109b64c5fc8ac03a21d03063c96ea4713317a93bdc4f5c"]},"offset":"41449614"},"XMLStringWriter.js":{"size":1224,"integrity":{"algorithm":"SHA256","hash":"ef2445a4b33f29affac9bc7466cd23f3fcd244c26bd40bf721c0afac0783fcb8","blockSize":4194304,"blocks":["ef2445a4b33f29affac9bc7466cd23f3fcd244c26bd40bf721c0afac0783fcb8"]},"offset":"41456942"},"XMLStringifier.js":{"size":7261,"integrity":{"algorithm":"SHA256","hash":"1c2f477bd86706b1058ce0e4ada36916ac9d54bc0d47321092c0f0c7436c137b","blockSize":4194304,"blocks":["1c2f477bd86706b1058ce0e4ada36916ac9d54bc0d47321092c0f0c7436c137b"]},"offset":"41458166"},"XMLText.js":{"size":2161,"integrity":{"algorithm":"SHA256","hash":"af631325f2480ed93cf449435e99a9460e4fc3e58edc0acfac01508cde4d3d66","blockSize":4194304,"blocks":["af631325f2480ed93cf449435e99a9460e4fc3e58edc0acfac01508cde4d3d66"]},"offset":"41465427"},"XMLTypeInfo.js":{"size":524,"integrity":{"algorithm":"SHA256","hash":"5d1f21358ed0636d947da653bf6bb6c8762a524fe22590513b394f9ebb5d2225","blockSize":4194304,"blocks":["5d1f21358ed0636d947da653bf6bb6c8762a524fe22590513b394f9ebb5d2225"]},"offset":"41467588"},"XMLUserDataHandler.js":{"size":375,"integrity":{"algorithm":"SHA256","hash":"960efb94bc7b6858a2bccfbb692d21ba583591c2b159b990f62e0876272840ef","blockSize":4194304,"blocks":["960efb94bc7b6858a2bccfbb692d21ba583591c2b159b990f62e0876272840ef"]},"offset":"41468112"},"XMLWriterBase.js":{"size":15596,"integrity":{"algorithm":"SHA256","hash":"85bfc5e040c5c6433bf5756c7c0937c2e368571b6c30fcc2773e60fef1a0f631","blockSize":4194304,"blocks":["85bfc5e040c5c6433bf5756c7c0937c2e368571b6c30fcc2773e60fef1a0f631"]},"offset":"41468487"},"index.js":{"size":1792,"integrity":{"algorithm":"SHA256","hash":"4cf96f945039be2d27ac2eb40af3f43ee8c37ff50abd7fc5281c173a98da6dbe","blockSize":4194304,"blocks":["4cf96f945039be2d27ac2eb40af3f43ee8c37ff50abd7fc5281c173a98da6dbe"]},"offset":"41484083"}}}}},"yallist":{"files":{"LICENSE":{"size":765,"integrity":{"algorithm":"SHA256","hash":"4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b","blockSize":4194304,"blocks":["4ec3d4c66cd87f5c8d8ad911b10f99bf27cb00cdfcff82621956e379186b016b"]},"offset":"41485875"},"iterator.js":{"size":207,"integrity":{"algorithm":"SHA256","hash":"d02451fa396de7f9ec93cc6fb3b07aaa7be637acb3409a9ddebd1c2de9279c1a","blockSize":4194304,"blocks":["d02451fa396de7f9ec93cc6fb3b07aaa7be637acb3409a9ddebd1c2de9279c1a"]},"offset":"41486640"},"package.json":{"size":465,"integrity":{"algorithm":"SHA256","hash":"91e84a9e1e2bfe38221c697510eaf30f2b096e4a11b44fde9d784b4147facea6","blockSize":4194304,"blocks":["91e84a9e1e2bfe38221c697510eaf30f2b096e4a11b44fde9d784b4147facea6"]},"offset":"41486847"},"yallist.js":{"size":8411,"integrity":{"algorithm":"SHA256","hash":"69a10f726d26f8d804a3deaeac89f0106ddfa03d576d13971002fffc8f0e8a56","blockSize":4194304,"blocks":["69a10f726d26f8d804a3deaeac89f0106ddfa03d576d13971002fffc8f0e8a56"]},"offset":"41487312"}}}}}}}  BACKEND_URL=https://api.labxpert.ephi.gov.et
UPDATE_URL=https://relay.labxpert.ephi.gov.et
SERVER_PORT=4411
BRAND='{"publisher":"MedX International Ltd","name":"LabXpert Relay","colors":{"primary":"#d05286","secondary":"#572345"},"logo":"","links":{"helpcenter":"https://labxpertsurveillance.tawk.help/","support":"https://tawk.to/chat/62de9ce937898912e95f8b2a/1g8qp9std?pop=1","website":"https://medx.international"}}'
REQUIRE_PATIENT_DETAILS=1
REACT_APP_TITLE=LabXpert RelayBACKEND_URL=http://localhost:5001
UPDATE_URL=http://localhost:5002
SERVER_PORT=4411
REACT_APP_TITLE=LabXpert Relay
BRAND='{"publisher":"MedX International Ltd","name":"LabXpert Relay","colors":{"primary":"#d05286","secondary":"#572345"},"logo":"","links":{"helpcenter":"https://labxpertsurveillance.tawk.help/","support":"https://tawk.to/chat/62de9ce937898912e95f8b2a/1g8qp9std?pop=1","website":"https://medx.international"}}'
REACT_APP_TITLE=LabXpert Relay
{
  "name": "medx-relay",
  "description": "MedX Relay",
  "version": "2.0.3",
  "npmRebuild": false,
  "private": true,
  "main": "./build-electron/main.js",
  "homepage": ".",
  "author": {
    "name": "MedX International",
    "email": "info@medx.international",
    "url": "https://medx.international"
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
  "dependencies": {
    "@elife/pm2": "github:ernest-okot/pm2",
    "axios": "^0.27.2",
    "bluebird": "^3.7.2",
    "bottleneck": "^2.19.5",
    "dotenv": "^16.0.3",
    "electron-log": "^4.4.8",
    "electron-updater": "^5.2.1",
    "express": "^4.18.1",
    "glob": "^8.0.3",
    "hostname-patcher": "^1.1.0",
    "moment": "^2.29.4",
    "msnodesqlv8": "^2.6.0",
    "mssql": "^9.0.0",
    "qs": "^6.11.0",
    "ramda": "^0.28.0",
    "react-hook-form": "^7.38.0",
    "sequelize": "^6.21.3",
    "sqlite3": "^5.1.1",
    "umzug": "^3.2.1",
    "uuid": "^9.0.0"
  }
}PNG

   IHDR          	pHYs  .#  .#x?v    IDATxq\ǵPL@Dċ@XΎw"  EУI@p#}GO 9w6,JU=ݳ`W?`                          d            F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         ϶        9k^FuD\,˕  vI+<"N#v^>:\vIm         V+u|yl^;M  `WLwxӏz        V8䳵:Mm{p  M?qhaJ5sgR         4M,V&   sJwFW3        iGoOX_#r^>:e  gԣgOXS3g&        0G7O\ij۹S  zJ'm#5         )P5e^^;m  t7.SDJ\        |ozJ=v  RO#;aD\9DJ        lL>Ϟ]R/:  -)h;yDm̖        9yGD'  djRo#t7y)9        нVqD5".o   IgNg屃cnLj        `.61`|Lj^   JNFg#         VcDnp?Eb|   ^B+hzb<w`̉Im         tzmcDܷRO}#  m3F        \%d
.}+  J0-"^%mb֝	^0v        nR#ny|X/};  hEmt/a^>8(6         ziom!  ~aKA[lL        @ZS\-'Sq(  Uiw	108,         4=}~.  tz#⬓zy:eR         =iB81nJ=`-  R#⡣-:CW         R+u|iԫ  lI+&""ⰳ38C         yi*b|`=  @VqD|6zw0C        +Cfp*z`-  R/"l~         Сʫmk+u.  C+&"> hiʤ6         J}c׈4  vG+tv2b<`E&        ЕVXR;X  Lˈa6:<蒨        \D^E]+   ߡzJn>`        @Zێ/qX/;X  tۙNgܧ8v'G&        Г:xhw  Rf;4enXQ         =ڱ޵R;X  ԣVǈx7~\:szt0        `Z;|Sck  uW;?,ˇdR         ص)m;Vy_ J~XcEkC        @/aDܵRo:X  VQ+unO>3t0s        `ZcaN1[  49v}nX/W}-}fR         =؇)m;  J''a6`O&        Uԣ}Ozy:  `Lwqǧi^u;         6"~lSێ;X  VyD<y6:4%         6+$"V h^Gtҿsנ08         zblM  0G/&        M&|ُqji ^MW/:4^         &*n|{Ju  ГVMD|-U`t`'        @VQDn爸Z3X+  jGGٞb<:q&        -&<ݛij\  +AۓR:Q         !9¶9-  6aJce[w0S           5"~爸Z3]?  |ilb<&        &<ϛij?  |irY[dl        m86>mԫ  CVǈx?FYvDml        m|w &"ⵍy1~h        zaǾ  3-"^9m        D/  8xH<N&vc6[#j         n|;>	 j?&9fl        4i5>]M  J;'=tH        @sf|ܦG  еqp+>":Thl        Lv;qHx>7  3Jê8sf
Q         )#az,  ݘ&EġS
wB        @%k|$|7= jRWda'U~m        Nwm+~  Z`N~H'j         _YD<  @VMD|&	`        بVqDfzy  fMwuoyLj         Å]V  ^\+2"VJ        @sܵq+CV  ^L+z#v͝T6         2x ٿV;o  J=xc;gT0q         6fza7 oJfw         ]9U+ dԣVmD͒im        iFC+f7 ?6Mh^E5[n        igvx~lSێ}#  VGDE&j#0v        h"NWv7 hE׶dgX/}<         $;#}+vz kFJжsH!j        `Ny#f  wGmi?m# 7&y" O%˾#OF@n#hR<ؖl"`0<U.^mT;oIC?8JmlR         ]r!rb؃  [RGč,plŻI        кfɫHv؃  r-;=EA޿j!-Km         tYm;{  CURgݞ)        !)]= !))q`GJR         ]qr\j]I|00  ]I""q0GJR         kJMz", *)GcG)        +mV|=   II\>8q+){SJm         tJ]IY Juq7"R         ]V~s^/G] }D<FN)         a/]R
 @4/GxQ	z"a         Z\-o7"g NI*"vb        Yi㟜GĪl `J%凈x3Jm         G~^~.)J
 `{UyD\W"
:        @۔x򼮅H [%#"E+y3Jm         TAJV   :P_ PR~;FG+Jm         Mc%[ ~s~tF        6y?))뚈 6SR?"Pˢ2]Qj        MiDJ xSD܉xƣJm         [i$"K xfUkb%ָR         mr6}()/J>W  ?PRKmtˋd        XI "WtKD\M' |^'.Lwm         h7ӕ6XR0 JgRhKR         mQjkJj ~)s ߴN        6GD-]H ZEZ`KM۔         h6<uh&N        (mud^R k)6)Ѻw///R        `#ZJ  CSR'lt9{ h6         `)]k%KM `JWPhc|ϦmJm         A>yI k@Ta|ǦUJm         [vD }MaBV)        І3)#uc]7+' M1O|UJm         G, ުEZȯ}E&J        6X= )/B>*6         6RR> {தTWP M4E|3/2UJm         lJ}q^WP<    IDAT5 EZ{Bڤ        'u4(  [MRQj        `Sdu mi)þQj5Jm         lL쩺hR  :S%y-K=Fk         1+)|S  t\_ShR         r9!)uEi mi1*Fk          ~UfM `m(_8/ED(        6<7*  o|G^Y4f*mQj         RWVd VSn08%ekmB        MH*+ ԢOIyQbhR         bՕfu /JQma<
6         6-MIy^WX8 }D<6ExkݴB        M(0&uYc FKu)        12uYe F)B۱g:mx/E         6"/c\/^LO _IС/7f,         :Z 0`%哈+A6(        b/$"Kc |ڬïac^^^        "YrOq1]V"WR>{lMYj        `]oE fxu$6        N$1%f 3%v          о2oV^ =P%姈kƔ         X*gMJN oM}
~ȳ Sj        `]?VW^> JGD:xk٘R         @.6eP Z8/)?Eĝ37񝖍)        .o燷9nmWrj拈8w ۧ        %o6uÈ |[Dġa-ǲ16         0f% ؂Z(/)#Fް/8acJm          QaJIZ ЭYD"T         YVݕzX}%ۈxxA        u(@#b0
 <"n
jamJm          pX l)ܬ"T          /w%姺.\ JʷR         8t<" 
%壒""n;1Pj        `{ueY AI#XNJmlD         nJ2) |GI>"#b"         *)9+ UI\>`(         쇺>\Ru^ ]I""jxYXf#Jm         ZMIy^RvQ*)GcSvDlB         `FĪ`
hJuSoJm          <o CWRZh;v 3         k7%勈.g+G	">".,pXj         ufє `J'1Wh6         aDcIyJWMaB/96^z         Dh[Jgq1]V	}RR>{l{MXj        `AUEI1/J':B)         S->/ }WRn
m`;c         APR>rr II "" 6         ᫫7/J''6Qj         ID|,)?48 3%#"(         eD̛u تZ.)?EĝK         `|bە`[B""΅0nJm          4%出3 @JGD
 6         qlVN SD܉(         pۮF ))E*"Υ
ה          &U mD<7 7          Z]YO[btIy7(         gPR UR>UD
         ߹+)?	OJʷA#Jm          XOsIy7ൔ          [()_K
ߔ"bB-          xS]#9"&cSj         -#bѬ 02%壒"">8{ ֥         [u ƣ|Qq؄R          ))K}D<FQ)6          6q|TRl/ mQj         `Su繤|+I()_DD-;V ڤ         @[nJD[I>"2 J         6FĪ|&USR>))u(         ж\R,()_E<" ]z/]         egnJq1]V角ADGĥ#`,        R^`M))4l
m[|Pj         kx,)K?JWM/V^tFދ         -PR>r:n": b         mk@|Ҭ)3Jm          l$"K؞uSh;; ^          ȇYD\LC FI ""\ 6         1В()_}%{Vhg	6          vm%fM돈8'в@لR          }qY U! T%姈! }         @7Ŷ+vM1.(Rj        `thKumH SR?"Pd R         XH؂fD KOq'&`KVfJm          qSlvJ UR>k%H(         w>TWUI6"ߓ 7         Xg;PW%cV%yD           xr#QRv "b> &          Gw%出V()FsDL:KL(         .#b^R>qoIy7!Pj        `]?Kv0!*)ED]D:u R         ZIID|,)?8`HJONM           qYR>rx쭒QD<5k }ى)Km         EFjdQR>s:>*)_c
m R         ZHID<OJ+l         ID\O3@o":'ؘ6         "#.#b^R>pZ@/\6 FC        u)EVj@o#1"&N#٘R          c0iۮ6k%壒r]g0=Ɣ         XBrŶ%kJS]4+ 0J^^^<         k))L3m֔">"..g"Pj        `mJmOD\t|ـ!.g$        OX]K7I ()UȹB0_$mPj         `̎ۀ.+%1"&Bb iR         XI 6U%fR WJm         lB
6%嫦v,Q`,
6         6Yz(k;JO1"&3 Pj        `bf%{ѹ􀁳M+          [v/5JGD
6Z        ڦ\z@].wcI)"gM          .&oO"bd-8mPj        `S$]Iiʮ%" Qj        `S%CXITˮ>HiR         ZHID<Bq*)5y} `sJm         lR0a|Jʷ ӧ-Jm         lR0MXR Rj        `Sڀ1))9qU-:jYj5Jm         lR06uɩ051q BZE         l206.gN)>YgrN4R         mIȜ` JgRh[_DC          `=ͲJʷM	        @M{|;;dD,        ІRF꼤|a/!6QjUJm         a!E`J> Jج-:h{q        o0"#֧ |Oq :7z"Q         6VRv!O3%_衒E]UrNt_        %?	9KmC%xThXϢmJm         $,)=苒QIy
F,:6         ڲ$6胒E؁ l̳Sj        -.:DZk))#1"&hR         m,I_Xk()D<">U^`B         ht9K`JWMX SjuE
        @~CuS:TR>3@'L3ܴR         mZI%#Q@wJ'MyT;VR         mJkY@7JWctJN(        &Km *)S*)?DǈsR         m?ͅ<%fR [N(        Кr#+)_q,NG'         h'|$XOIw"غ/R         m[I‷+)4A	+mtF        +y۔돈8EOW         h :.)~RR~;q6         ڶ(_\YI)P
<6         Z5]/Rƙ8돈8@?L3Kmth        @x*X)w":@H蒥6         0*7KG"?ksKVR         ]p௬A|1	@/yS        @\0v%僈xӱgs蔥6         Z7]VE PjcJupLN)         ho#9"&> #kJm         te.YoLJ"aLg\8x%tN        	WYD"ԩrtN        	WmD<ׅB'w<96         :1]2|RVR>*)2čK_˙RSj        Ks8/ucG
6         B$,1H%xk^LV3         "oQ0$%壈x0^LVXj        K.D@/ R[        @g$a }D<F3t         QD<`5         蚋 0 %euAXj        k.F+)D}D\:GA[8^R         .g"e ?%哦0l_˙R[        6Xk=SRj?vv 癍z/n         ^<4 _I "6J        m_0NO":xfc%n         6]Δ8 ~YUI)5(t9Sjc,       HIOںp7	|N~S!@3}D\:QɱmJm        \D=[IʒoWWt9>R@xI RR FN       `WR\{WŔo
*%
on+3p#` ()_Gĝ=6ˋ       zYO8m ?l$G%eրQ.gƞ׬<us'삥6       j.^4%=,٤0˥ْM)Y, #fךfN       '*]`1^l6k`Jm>TR; W`        v|5"?mor#8;Ѽ@a |'Ļ       lYI$"2Dx0]=>`t9{rlSԬ%׾L:       Ur-hTG55Y 0VlUIyPh{<3E       ЭAv2N?%ۈo>y:<<Pjcg        :U"[kj)."nKʵv{I`c+JgWy"}       )m՗fMLIye;]:]jo+#A+        Z̶u]n.g# U]tzXB3ͳH]g;2 	;/       l|`ж}SIblxS.Pci8]()EJ7LN)       l|RR>Fġ,wc=z6#	#8()ץg/ `ةw///N        JQ/~]zN؃>*)ׅct-4miG"e@씥6       7*)_DBm/3Z"`~VhMwەB ,)       R]C()5ǈ8ިg\Ro-xr]GkJu-9"&R`s^^^       4kO.#jy#9DI߭M-Q<r,L 6ey;g       5mvA@(CIM/"b@K<       YCrt9[=ر{! `DBEO¤,       |5Qg()=1+)B(Jm        RRǈf?J rV^@>~B_w        *)D}D\dtJ'qrē YiJ 萕6zR       Bۨճ7`\̝*UR>*)/ g/zC       fke%30o>Lzgyr0yED,< бg/6       `ԚR]ј=~azai#u!\G +mR       0Z"B3Qls
+mW/ - wwGq\ڀw#_-:#8>Q"X	&}{$`~zu_W%ۻ]Yðg}{"       LRڙF>63(XkPܨcZ |!       LN>D`G6Xmo    IDAT@NlT;jO󵈇k NmP       0)m<`@+פx#       L@/1FVG(6*_a&bp       B3¶kV#Umfע(UNn&]]s`Mm       	DkRcDGVE m lk,I       Tm,YZ:9p	SƽT䵡 0 $6       `r\x`D(ȡ"Gw  UƂj       \;+ԿNVBPk.j":"L~ 6K       T}'ˊMU{dȰt^%ki#_)b       JYD|/u8(KZ&0p:ajwrv6 =+Pij       F%UmXb4UR'0`7mӖ; 0TP       0M	V5_s`LC6:ӕ#"^M} k*M       -eC^KRwm߄d ]smaF> g]k*,6       `RD[Ɇ_r#007uYIU}g@\K1xBm       @R:À-{;043+2=j 㧈x5Y PsK	       cЇ$-Qw爸0N` 뮹? UeD, (EAj       0"~̛TB 0WuYHU5 (k(        +UnD8\PV^́L`1
ӑBBm       @N4ekxk>Gą4_@T~ X
O       (Rxc
̩m'l}xvBm       @ҡ^B9P27G`n94KU{@P0>%j       rUZ֩j[T;j/#g(f(Bm       @Q! Dikx>:]+UADFOS qb))P       PζU02uM:wH)p]]smA)P       PT֊Q5<߹+vVwbjM} fk#       jQ8axA`nꮙ8=>z `(P       P-m[mm|u#V."vR?"b{ `er       pXe-0|}0K4k>	kg`䴴Q$Mm       iicd˜d}P%UAD\0rsHJ       (6k)7)$]si㒪o#"> F\,j       -U펖6F 957`	>]dDR~, {%       ݡbrҝ/pVw#vS qq	       C1c5"	纨oS> TXiJ&       Vn[p0z³	q#X>jr;۩I:L       2;qxkn%]ʗ^O} LE&b	       v7"~:ܛZG[F"UNVg &̵j       03>;};@[RvS vhBm       P	02
o熶kS*[Y, <@P       08ᕕa"^<<thT;j6=y k B       Uabꮹhg E	       Ct`UyxM"HU{ /_XM       `0rC"LP=<_[@|jw}l Owu	c       a-<@pm Uy6       `h{*NxIh+\جu 5/_XQ       `RFu|IU75>3 qgux       -mLxSɹ=2݋k6 .:P       0$=L /Qwe pnwyRDī &_lYN       `@ژ $">$}.Kڝ8> A'˗/       ظT_+ˤF""f~_'U~y3fǬ       @hiYd uVẃ@[yRE'6 x6֖       bBr	|`t9eIU6?M} Xij       B^۾aT~h+O~_s+ rm`       p"	qb0
-%IUۇ?Eg 䚆Qϗ/_0       QjO
irj/hwqPw͵e,Gڝ8 /rUw&wFMS       0V,f'(M^*VT[6 x1-mP       0{Va	9MO@Ym[9R?Eg /tWw͹!2v[V        TO;Ks$IU> X#d
4       C Z9Y,j"Z fa`       !%sDk.S9RDg Kta`,1       0 ?2X>xHa"r2 `<       lTZ-mjw#eΌ]53r=k6 X3"D       4:OX#uh")H~в +㚅Ij        `ꮹp뮹eHU_ߦ> X|e      ۷ UKwo6$IU;l rFhj       aj%2Du
#UNpG6 X|"        z]D^5^T{q 5
$        dhkzWwA5jg9z 5dmYz       `-  k7!|2tXig+Gڝ8 kwbL6        =Vh@[9Rv66 Xk͜        ôc]`FK3úkNjg!f{ 82tLS         7`9nQrIU{ým ~wNL6         J[܇kͱj"?Dz ij        `#+	FiicBS         *"fuܚ]Rv7S 6&/4        0eɎh+GڽhAP         S)o?] j?"g a/P         ""v뮹42IU{O} 0 Z`a         	]5'RT{q GK,        ikj=hhj        hkEa5ͣjw"?(f hj        kk1&l]3h+Gh_!         ,>йuYR/"b{ Y-3        ]s*"~2&C5IUޫ `k         <yD"VTq+ Epmj        IL5Ww͹.G`؞,  Z         oJH]5 jw"\; ~AS         <PwuD#3ʒv?"n (gZۄ         u,jO=Y @a\Kwl         [5j?DoC]sbˑv7"#g [n-|6         x\߰07
u3ʒ " Háj        G]9"(YD]smʑ#"> (I cˀ         ,"^SUTq 6@q         rQh+Kڃhji'         ߑCBwĀ}fkTT}=Y @<X f˼         "Q10Yw͹)G݈8 14         ]sWfŀ==k6 | <6         q}͋8B#UNDD۩ FЂij        TwmDt?%U^D\
]smY         i&Wwͥ#U,^O} 02s-m|[f         ?ϩjO"⽱F91r݉l 0Z'         OTwQDܙkpӿʒv/	8k         yfƊE~5]Th{=Y Z\x-        2UUDd|,ټ?(]wͩ#UNDhgѻ2        L5?&"ꮹ5r݋Sl 0	a	        yrXu	%UaD\
$|W         /s}eyyng4rlo> ~vda94        ]99"bW,j"Z &0%j        4)w8,jkWS LUKe         A8ڤʑv'"N$if%         KJ̒︈=݋k6 n|         `y"bfQw͉%Um  5{|`4        ]9`MD%UNs6 üL         >sedr@ʑv?"5{3Y ]]s e         t}[u )Hڣxo `40
ij        %6"un"bO,jwR^
 ^>j        o{3@9]TѯOS `         `uff;9)H~>EĶu =|5VK         Vˈ83ѻݼ"UN~[3  2g         XÈ85Z9Jv?"\ 暖a}4        
]QW<j"@ a޻k          +VwMueΣq{u\O}%IU2"O} \]sj,>[f         kѷ]k*<7x8\Tq feX?Mm         uFđY&	&UID! <(Ձ5         kRwIn̋é4jw#<"^O} n=ij        *<"~h+O^ 13 6         XkͱUD]s>A&Um߶GDlO} 79[         UwQn"5L磩4jw# n`4        f}p̡!k6 ًÆ	        ]p~0."b/IU{DĶu ~=lޖ5         rÔv͙GQ5'S@RFĹ 	n0hj        ͚Dľ@[yR?7m {@        ]s}ȁ}EKU4">F <ɱP         lX5G5՛G/u]ټˑv/".#g <Ms!         0ˁ+V*"97㲤@ xlY         ؼkS[8QT;q xw^ aX4        @]sXglm s]=600Bm         0,."bK,KY, g50@[         TѲ;IU' %8	ä         2#h+Oڽ& ES%         4yد溠3v xyKeq         `x ">Y.j(Oڝg ,A6N6Mm         0Pu\FM7'VT{q- ,чN         C}lʒ]x5Y  Kʰe         `f7Nl[?#@GyRDĩv6 `e         Ww͵։]EĮ@[yREĵ@ GyB         
PwID\L|QTj  "lY,         (,"n#b{bKv7ʓv'"N +2{d0         `bշ	'U^D\ +t$         2"'f}Ưu8\TGj  V8	        @aCW#^دt  UNp{s V*BmY8         (,"#b{d=xTq>$ 0,
         
Twh+Sھ)@ 
&         o0PT;j/#u =#P         ,7-]m<j#_> `-nx        @"b^wq?]s4O_Omv 	6         (\n9]\D^5jwR 5:"         #PwyD𝼫?y  U~D27 `=G         Fws9߅'JUۿ>EĶ ktlYP         ܦ5YDjg+Oڝ8 l<m         #cC9D@[yR$ Mطj        2"mkG7	HU{ wu\[o-k         SwIxoC5^VIU}g lY5~7Mm         0^ܘ.YLj"Z ؠ~j/	          #Uwl;ݺk.ʓoC#"> `c=A#e        `ꮹNU;ˁUyWw͉QyRFĹv6 ` fuZMm         0ru|w{2=k6 ` 6         k"jEDMp^?IU{> `.^-         qߩ    IDAT<"9)O݈8 MD,L6         k>`qx_LjCm {Yޣ#         Rwu=Շk¤=?"b q`o	%         SweDuߠK5^'IU?,g ʻ'&J         &ӈ8w~};۹HyR", A9ĒmM}          0UuM^+#8^IU'+ &]36         |ol)\YLj"R ~oa J?/:ꮹ4d ÓO> CY  `b+\Ynh۞, 3VwgK˗5 uAdkמ~rxՃ/\:?م0Dj_#~+什u [{N5^~΢cv ~),ާ]ܫgˋ~OC,N k5' [xn,\om⡊?ip0Bjvq_u<< B`c~"j=SI; j[8ϱ'V oyt LB{W1-~}  r9vo>	<B%76i CuVw 	-8U><痶@yot/\݃unzӰ kطy۵}Ǵ T;9ք f_# kEϯpM\C&;cFlqm!tV |wK gnOjG	/ lj-5.M}=@~+Ѱ
0Xۥ6jG	jg	 0dh*QBm Bl{5z} <80`S=``rރS%xfKA7 (-Ǖ[QBm )_a& hG `@aNr0+_{"H;zXA7 6.s8!1/4ûP6xP <u ׺kN-=Bm 9ĶķJ	cL)u  ,U{b{cpm؄QBm v< (q5GV
Bm @%'xpl2|M\PM+Bn <G|mp;0F%0Qjw  JqVwj?J&0E_o/Q[!"U}Vb᠄dys:s)!7 ~H{9| &(? @A.9`S&@s"Ϻkb<h4+ĉLQ~b؁2.?D|aߵsr;!7i0A6^@m QBm 0"~ @AnϩJ`AM]:0D	Ι6 =-g)xw[90 Ktp2P<J`"=S 9	<PD[bp<B?	BﯚXhc;p~}k.ȟ`?dk$j|5 PynhiY`IlC>c(EKU;dcnO-P y^&N}P|a&#VD%0rj߭3 P6ńrL?;`Uϙ #rm`
ӿKx` ,?T0/b<<gEQBm #Ϟzh( P_9xK3,~k~O:7mHڽJAʇރ)fL``c7D
0`Ͻn-	 F({9y+ P_kA U,Abô#2amBxR #rIMdop_[=H6jG	Lw
 JX6 PW,Ғ#߄XVC|L0!x/ j S 
vVw" ̶V|3vg.7Ň>PaB+yw
,1bWyeO jsg` 	K'_艛q`)6Q&ޡCC<ʇn"c	è΅/َW|W 
?u 
&P,al<É'_OGnF<X r3yf;_ۦGg'F<G݅V6Aq6x Ƅ	 6xP@簧z =PCcPfk!D' OiǄG]Cvm B泯ojG	(?\y p71yS7"gC49Dqfu[QCa6!IWyX}{ۉ{Y lW!e.jG	&Umw NX96&K;[q9ik!pA$āpm׆L{ô/jG	"Gxƚ hBIVܔaT37s.߉sUT|}*꧚_)6;W'P|P@G F?;{Uz19j|abO8!
m}V#Oםf6N\clGl/2sjG	h sC3Z1 ڹBFWOT{~`P'$$߇L}B7}֐a0۶dSK ˟/RrgSljG	h k'$͹Y5a(<]hļsmr`Noo Jv#qFjG	P|5 0mF1zj!n MH} 6ŁO(Uax,`Ca$Cq] pۄۀ70k+7{)Z%00j|6 @1BmZ~JG<	}mfC^!CQ(vHU{އa.~T`
f9<	Unn;'  1QBm 6o	 0mF	1ZjO}:96VkC'BPwSy6~^M}0 790|kQlV6`<T㸿'8և  U^i ¹k`%IZ|M:qQPRKan6ʡMv9jG	lX6 `DoAh#oYlo}.4pjwo~곀Bj?
#LX|7f0X9 6H !6`06pxIR t0n.V*UA,0uY4ؼxA2u| zP| Te!T]hԪD\QuYt]Ma:`yn]Iȃ[-kTYlCVVlw6NΧg=zAѓν~O=#̈pt!`RԶY
;	@ 0Cj1mÇ؝[ۉSP.S2Or=izcv^t|gUar>jd&$m 	jcx7`'^AfQ1ed¬|E/m+0P1Mv&-OAI`3 0#ꩁ"	1yCvp#vKLZ[}0oT(t	z!6	`v^Emw6x'6tƜߓoZw `&Q)[ÔM(5B8xrxYO 4TV$m0K[Iaυ93P\.:\)=hYB9#  7wR hfR/[?܀ş
?wx}]?t6{RXw"/'O{mƱ0{;5ɤ6?I)ٔ L3IT7=\04}2HxӅt6m M.1,ޯ\Av~`v bh_ 3"LPş8Aj_Z0,ˑƀpM;ao^q~@.5 Aw I)7 3#LPSt ;zXs!OG
7$ CtOUsM[B& H<OS.-'΄5ց=wC  BJ鯧5 fDo|vɈGv7mڱ{Yb@)3x;zU]C!+g 5Dcp;gb'[JCGip)R!"i;v/,1=J cRa6e#^W#B@ B=W5#0m M<Q8i9Ķ jMk)?Y	 6`ژ(<[,Nf-@τBۊi)\"2
mCF X|f,/K	iGm-[m @ǔI)~ yR'LPSq#;Kr<x!oR
8M/tȀr Kό.jh3a⁫g!  Tah_I)Oq `Fń6"674,\ Ƌ!:o,K	aE("nBXt?V*=Kg X 7RJm6 03m	1
Yub|>|U^\p&Pan'zlĖ<u8&; \@[Jo) ̌@0/$Ŋ+*to7wQptEH a;v5z\s LvQ EzR:0@Oڱ[kMzڎݮ%1K q Ť654	ԧ)5:kQ\Xl %w16(3a`Ll bh?R@ 0CmQup74}A,_Nk,x"Edk"r*~wA~֙Y	;L ^ehSJ]J& 03mQ(س;=AQ RWU X,Fl0IAa.	; !4 ꯤ@ 0Cڀ9jT1;N薩(G5J.,l+50yLmP g  LI4Th f(Lf_|񅝥(Q]a^cwAµ]q:C&|($0cWE3(EEVYJi	qsVO۱\yN)}S W)vl,0W&Q"SX͒	r6Nm*.VgE `h'"Sͽ  JSJ_ WlH56SڼE+P@01e6bҌ`1:ǰ0VECӛKL(A< ehܴSJ 03/"vacj4Q⦵E¹P`bJ~yqPDіg&LSM/S=~aݜ	l m)Rg 03RJm@-()m.ӊ;	g:6RŴ!&P<I*x&A" EO))?dG y^XBm 
q/ 3_-v0PSP(MSzP&řcg@	 ZMҷ  03Oڱh#Fbz˞ݠ@k}1xMJ|O]L:,D Cӟ\:(գ)  |ҎJBm/bJ˕S ɔ]$IX}96 줔MkQE y `)O)! vL%F)(>/ 35BDº䟽O=3C{04{+`bbr7 Yt;q  0RJc7z:ejcbl6A
`J:LdKL>O)Z gn,%&f#m~ WRJnJYe `Frms
N
N@%`B`%"~Rڲ ^D_6ڌm Bń4SJ?muyR׎݅MjcLѲ?c
R 5aҾO6`N
Cϣ? VChf"? %yJ |^Tjc00KY.g~MoW0׏l+ wџVMh pgCyzIJYM `Fc/UBmPSi@e6J	`3`Y-OB5 0zLVmL=~ wp `fcwhSNub)Y@Pu9Ŀ_;"JmYX  zۨML2hlh{v hgZ< `F^>lԦPk34 ɂQsPMkB7 x΂;\@i5X~n,il80c\z 3,iܦPdJSh;7 `=23;bO`E6bbۡggܴx[C;  {[3 <@ۅ]x?6I)Z9Xiå`B}`r##;mEbk V-?=v\	z`< pHzҎ] Wjc-\)smhh۳ ?m@%z7* k(~lM+Tth{6 x{o vVR0Bm)mL՝~v#q`xEKr&XT  6k!ȡ/< Pτ:pf3Jm o3
 3*a;vܐPm器vԑབ>-G
KSL(^~)@@_UC3 `YI 0'r]|;vvXژ2u7D3@Mr}9BBmEV`"y* ܥ  sYo6ŔF6 ׶im|h
(].lZ$ 
m{&$\:5 f5 0CcߎKp{BmJf$O0 \B-m
&ӥx وmmL`tF r& ̫w۱s Bm̡MMkοg^ 3~W  $$M<Moy .m <˃1ڱ; !:(<`6Cpcbs~k6Ɨ"8 &*-~6,,{F32  3Y.l,0y1bƩͻv$edZ[	 Sx+    IDATf`sZ W| 6MHv^QjcS2Wui
nn+n}]e !614g 7 ]
iB
 Lݫ҇i$BmPst ؉͉- xLe 16.58S 0Om <˵؝Tjcg7`an4U(^*$x#@X3< ne9 ̖@ 0Oڱˁv`X)M `1nxp	{y&@ lc-ϓw>=Z `^cj_Dt x|oO
	Rܙf 0h; H)c`  ,Uġsh\	P16V"!N6B ' gypK;v6` nU1< K94C|M|]5mbo `Kg! 8 M, LGcFPsy0j`W_lYr
&6< `u0 w )> `^vNl jV9S uN1恵Y@۹! #,LXQx %mm 0QOsM{;v6` n)
ctXFp{:τ@ ӹ`24`; 0$ LcP	S ΛS wr)LK@ ݆`\g`rt elH H)iP6۲v +54%yj۞7`2-m p-m,wp`e\o`hs. LgN;vv,Bm  L~	oNd".4 B3Sjs  {Z6 `j>jnv<Bm  Lő% ]U6 &ƵMRzh  i LԋRێ݉(P  SRڳ[ uh9eh>} LL  36 `b۱q ej  z	MGm p'{Fs  sN  Lƫv۱{i '   ~oh@|T: DP*L  74Fk <lLP   ʹMR:} `Ep	bh{   ~づ  &vr6   Ծ<U ;8\v  )ǵ 0	/RJcwl I   د~
a3 y!{v  Ph s  (\o^;v6`i   z^R)V  KmgCcB+6վ  @ݢڹFk @~ЎwltDnJyJ1   SJ24qJiu    P;6 `"M)؈2FMP   }P伇 О7  ݩg# `Rv;v6irӄtO8aF j   2~;tR: xyZL   19 DR^;v4{|@ń   l+wʲ.e yyZ   [4x9} "(ߦ~[4C?RJ6L
훵/    
{ r~yݎKk<ob}u   54nJ @?L)b;v߷9p?p8O)i:2   xmJ)w (̦M/t\:   Ig~ =I)5m"@   {+9 c/iL  Υ) ۱;lORJ/`hZ=Bm   eVcubJn P<gf߿CX  98I  a~oގݟ#ӐkH)=X~G   ljn P31~  >?m  
7ڱV;vG6eyŒ+   z"Cӟ( m:;
   0t  (/c/ِiȍI§K<k߈`s[?   6߶"{؊ :74/  VL  PRv;v`C!HW$!7n*!   ɴ%b`~D8  PD K)?)oM6[3'   iߊ,U.ؘ stt&(^|e;  @Y֙4 P7RJ@4{ɡ5}G	   oڱ"14I~u   u PL)}_l)_.RJ{kg1y)6   ktZSJ}@Evbrl"  Ph"d ')mE+1qyJiO ̜P   6BmBNg@EP	z`  M fR7۱;h<mh#Wo3%   PbNf[s bX|'  M.Fd X~_M.RJ;~	   oSAMkB V)XwO  T%6< &܎ݷڱs>CqNdh>@Bm   [E;T@  J3  I4c X_ӐbC_LIoݝF0Bm   (ԾSq`8-G)  K<v `FM)	6DE   xm+s{C倫+mzqZ׾  @]򔍔# ؏RJR7ڱ{n˗Ї?K)=pރ3    Imԧ MDr  $Σm: bRRJ?ӎK_hp1' '   έ*jF!k  P3 fJv~Qm?6g-mx?    V744L: ד_["  *Cӟv: BRv^X3m'9;j   g\_t; AYv` ZMGm8 "7ڱڦ![<y-	   cR S FЍ  F4` XRyJio$	M   C횆 bբ^]5  PJ
<>LCVEF|[`Lj   gCGk xAwVz  5) )	M)J>6   *
04"  PLi۩  64~nR:  KIJ[}Roh&W>A3 &D   P{$;A ׶"j  g  SJڱ;j.<tPZ+ "   \EN*v |ݱgJ  P3g )?R2j"ސվlhM   \z(+ kC۰T  UX2 D?h;xީZwˁvN
|%&   Wt  ,)m  @- UJڦ#]xh?#T/	   rgfi (.cJ  0{1N K[)v:;1Fkq4   U=QH VY S  *Z  ھ׎s[MnzmE(P   pV+N  txGP  hgQJOccwna74~JB[{B	   ס;MR:(  Sa䎴: sG6 XRv~Ţ/7>7T;;|%   \ǶUB> 0"	  v XORJd;v߷yރbA6[r	   !ݔN w@s [v XI)vڱ{iA74a.Vn>?ov   %Pg)7_ݽz ,NȷcwnEnh  Z "_n4wX<O"   \KEm,Aët) `~ U91v?;  usϙ }BNqa6"8hbD   
QLpl`ҞFx-מc椵{_08wn^vMɄYAvL#E  `N=  w*Scwd!ah\uX۱L
!   \nBjt+Lʫ^} Mc<._g#{u8
S  Pr ov^Z]һSZi~
A   j\8L,^M!vt;}~~9tmMԎ݉=(  f)|<# w;)UHgߍFݯ   ׵]J9Lb=g sInKxhSצ   0gΠ[QJ?jW,4M=}
74~;vg/P   p]Mj3":d{|9-UU'ްck  0KywJi SJ[t3EYi@%   \WA9FM7ċܶuPԇ(wdJ>  [fN ݔҟfΗ'`hx,Dtu)   \WLB<k$vvڮ֎E;vH)}RzUgm~q?&  ՙf ~;W۱;h+_>+BmFBm   MlWZ:zc^L~_h	Aюjjp  44}>ٲ <MY۱yVsmŅmp]7=   pU
klǂl]:?PG:ABQ^Ok;6  `v n۱6CsGÄw5ym&   7Qˤ>3ٖ-ۀrC@fq  N! pMRJ@4&iohz6X6   &f_pE如<K)}؎ݾ0]
};mԿ1  `v2[v %7+l/YMR:j_	;фVO   &Eq9\mcwnW+s0ݔҋw(imMJ    u45 SJvnVh>Wg0y)VM    D1X9$Xv"}2  0G
+0۟l[A*[nZ04EJak1#b"Bm   M}b)m\y:GzW|6X+~a)  `?2 Bv~BohRmվ3tZ*	   ,l'VL؝Զj_X߯}?d   <#tlSw{)c:情uC:˞͡ݿÊ   724LWlߡ3,͓]XԶ|=5Ԕ6  `~N= wSJ؎	Z$AkQќX26   >yQ *tڔZ1Jx  0C{ !7%T"жUZTUj   njvݨx|s*9쟨;N>}-`Ŏ*^pS   ;r;vhtCӟ[ª   75PjX(&,Ok.۞GXw+]nd  (| ސB)1QoI4 D   ZԾ@ńu>ڱAk_Xꦵ=ɹ  ,3΁ .kE)ۈf   75!&<in_mڱ/׾"{Cq:'  n ҟ|y*)?qM+%j   b<i^X;vm2ǵ,u.H)Q   ,z dSJ?׎h+g;_cZ,P   pShp`1*"+aB?Z  E#5S= 7SJ(9jakh#'   ֌V̡#ܝ@[`%6*
  ũnJvv^ԾM	H)=}-qEae   *Mܙ@[`%f{|`^ *Μw,$ TSJV;vǵ/<b}z   7c|'w#Ɨ|l5`)6m|w	p(>zyϗ];4vJ^|mk M4P
 ugc?վtvPZpcCӟP   ppp@Q\x-m#K	xE|=_fqߓ)wi z P_nj_)Z39I	    Ȯí=@M؝K@-af2%kR*cx:czlҗ( H< P<E/c_MI#Q	w'   ƽZt/ʅQ_EAIxnܓ.9v6i|.lߍ. ̟bV R7+_sׂ9;6   6&j>L@ױSKob5f':Ȗ@.䯓<M TN;v?o74n?`6pG?e  p9z<$8CjY<;^ORJm^;vSڱ;i.OovJ ?Liҿގ?m74}n@Kr04Ņ1x]Ov/}{o|U/ښ//\t/.?S](}Ҏݩu:at)ԂBF7ٹUHQ}ZpɛV> p;
*?h;|TLm +;w-47DiJ<"xafצM*:$|:"\zMQ`JT	\X?0 

O#ȦI[:'fp0w;7l4 T!9ۘh$t꜅ gR S":gc;ү*Yޜl1":ռuVXC+7$n9ԔYk_i}Rt S
 uҿ؎hg+.Cӟͥ)!P %{d; K\0tE7GQD20Ue٢]T\,؉|}=,Ztds7s{&o?b"&0'vQrn `qּc `!Vh}kgy6 n_|eceVY,}"]M7&S*'_EgjNirg^v=#+	ӖLw/,FuGS8۟c%; ~{c'Y0nNjIhS+E\&7\oLez;|vogihsaa>ihfULf$u3Akj}56F|qfr-yҎݡ`^)oD|^ xnHM6/	rp7s(ƂeXx>*S@a^t|@    IDAT6Kk{c' \j /cM{B@a^;v6溺 kl۱7@eT@rܹuʁrN;v)6ڱ;^,R;vcz0pwCO9&"Ο4CX\  )?g-iɹ@:1p3Bm ,lE"wg0_U]M:w>R\ky4Ҏ]~BL9Wg \ϟJ(4s 󿦔vy[[<5wh|h;C">6 V%F~40ۛ~sOP~wa7EAhX|h<-0$&jMbO^'&>alǦjTQ  A;vB;v/[-w;n@UBE *b0O3QX|]8g-pLm֕j{"/@"([+)0hw1PLʓ#>}- `b҂j \osMN?sq͡\P 4SBkv-"|ϣ+0VCM" ʪwb@l "Kgz KS]_ ߊz
74/RJj_&xhl\Me/?jn+cY	\a;v
~ϥhM_<q+'*؛Q`Y"i)zۦbń-
 Ôҿަ|qv>	TGEٶ۱S@ nꓸƞ[aL`ʝhH 1{S`Z>@uAzy{- h$ G)c-ge_CKSJwdZ\ME/GtVnv[]6 7ThUZqjl |jb32 #g 0yy:ϵc}[YxYԾƆ&p56 tSy}-Ul7ti*qκw7.;|jyC ĳ֑I57@[]CJi`vM϶»	pWv{m{v;m2W31{ݗAYTyݼxQk p yRPMr#RJj_fM1x6 nEvuGBIyfeoOVP)>
3fZc|ݘc>t Z. 57:nh|n)վށimnBm g
] 0'm
vJ
jvBLᅿ{3(:Ľw p-A4tM>7x
 M}Ԏݾź4MH#?EY
(>RY;imCR* _LD#|N w	
 &%7ߎwl[RNAa۱Sh$m@}EG3{QuuQtp{JOlI?yv{ގݮ/ x'S `Z.iϩ}+[4gSZP-Bm \nVk"tќGk>",0@Nռأ4~&nJ	BvO_ dhmS `2AJyLhsQ?>S4QzP s+1W }܎ݾõ:-`(J4qŗ%roeyΣH?ge- ĉ I͔ϴcmMЃim6 a9`r(+2[JiϾ{иBwSܳRJ|^E;^D;vm Knȱc) xgJg۱mUن?w?[\bZAw:Y\<FkS@>0[jC&MA͠,m` |I3J (ߓm*WnD;4YJqJic־03/DL}[W2Rليh%jrw&P3S xl0SSJj;p٫[Yb,xqi")̓?iX)&wSڽvHc6 *fR Y4:(gH)m־pA +ӃӎL6ݢ
j_ Y1Sk O+@ힴc@kl6@ўi,_>>7.|TZA$V#`fZ̋?%/MIC`96   P~;vmxzIx}O\`~R:D	)i 3Rd(?
lS+; )m P׵6lCtkdZKBm 6f`h8p[6vjm܉`  $jm4h,{LB Jb:bԾ0!m^Ծ0B:  ?VZ`}>y? Eɵ۱;TkS&0Q=6:	M0mkEb&pw[,vsPPr ex]gsj?ʕϜ{iJilBՄ ʈijy.H}pmj_8p}֊BلYϰlڳl{fqS O2oh|{R:}-`ILkjBm uh>i\m54<9T~6aqڠNeW0	 +1Tٔmhyj	PmLbki;}` ftT83g؝Yw)? `ʢI1 XM5.MϚ6j_Xj}/g>BYLd4Li%/GBm߫턕zA#X8<  DM"Xh;Hl2+&	AY͊ߗ0MBmpsP)IXu#$
w`%ڱ;O)}dv` `->jFᆦϡA2XxfgIHg^ԾPg4L8s7w	>.`jp V+pʵc}fS `r[ϑ*7>@=GVYP=Z,)R{m~ڱ{?P4'DD-gR+ XCgi LE4x2 V+7Cَ&jh|{^	`Zj2{߸:}`͞)5`ZLk:rl:/s ?N
 J Gة_,Q C#3"0_1mjKbXiQ4!LĺK{mNXiE}! *~_jȏ؝XMxgCsZ"0Oc 1ǡE!0L@w`hzP"^jrz):)F,?# P6 D~6܎
Mk#(҆imD`~rwV qLJd3LêatzcMNMtjyDq:n P" `>jnֺ\2ԾP80?{wwT7{)`F 8tNw#h"(l}kvOwnX֔<UO:1X6yI[et1`\B3ivhڪI/b^8n	`x=gT'Z4AUsd *8Olm0KLvjN$O}Xz`$d,PLMmПm1WՆqɻcV܉ *vuzI ( 04Fa	!l-0!eX6_,z8]}ˑ-8{[6m)4jP3֝LI V́M$ 0ៀϰA|O&07%ɔEsu^$a(G`I@l(/<۪= ˇt
B~A&U󲭚tk枆j/Ku3vlQpRZ8䗦gm1c{ueS:a lR~Z Wycj)
^Z{{N`>I\4a,0ͦ6Vzm&j)9cZ0t uLL}4 6 CCh'ކYj.V,?$[z` y0%8ejm~m2¶f9nR(s*&0$H[C HgbS,_[5G9жZ{%6i;?B {K>xc4T9~
&pۑH[59_٠(cjn$ŮNׅW; HcW
<9 -g0Y,]C@r	}Byl_UsE.ݛ.[B8_^Bwaԝ 0&>`}lgjR/0cipdfI`Lfڠ_й	A8^?ܛ,K[3aR~W`0i)Vg[|KP lϡV͙njkd !qper#}ejl;,PCBm0[ژ w} |w!	1; ^bi_8 ZP|B  VV͐P`0g`hyB|]}(6mռlRe?Lϱ!pP7  ѐcww13'
ݥy$hCay0;Bm 9vWk;6m{3 9rz	̊mm ->Th XElt<
t?`6 6|͏<E yy
J"Ք`HG!-' h=a̊Pt.r|dP!7  ِQQ@μ`+` ܥ[է5m#G1+Bm ӐUjPr mok̙C7 y `f.B{6=̂P4ܪ<C#ši g%3Ef. =;RP 4T]CE@̆P@bW\390= <46יz Л=w݄bW{01m͟0yBm hX	h AҐs=bO6 }΁k56	1Bm e3!'VgKO4 z#"Į!\6 =q !.vQcBڀ':V(@lm<Ij6X-m 4 z^P?hПSdA`mmU r 6`m1F%P/cK4y !BA?n/cIbWwa [ ksZ]&\X{"&O\VƖ6V1c"  VM!4[ܱDs-& ]}tU/J{#,6ryͪTΖ6VaD: jz%`6 nB{cr <{#&MLMLnĖ6	jfO  zuk4ǅw,QM  X  |]m΍MX[5'mژ462	\ d*ɲ <Udڪ9!l+ ]-=qmդ0/K]26\0S MmP6? a KvLX[5!聐3B cp|  t}njw^Y0 XI[5>P XOCުHLMm e]F`6aLMm  sPTu-?[z XI:d ,C@<kG[mh$	E`8>c́i ~yPπ,P9 `5j479\jN3 ȶ6&I, øp`v mAnbWq ~¾J cW-Ùw@^{&6r\@iu  +/Ga=Y'x!]}Vi
,lkcr aKpNՖ5]) lM"  +/6!䡏wj|Nj[gt~u wLP@9ƍM   `bWN Ug 1vA{͞|c 70!P7 
0}z P/Eamׄ  «'</mռ^`46\3)Bm      Ѐg`-Bm5? ̡
0SW!̶Y`d6   t   s|V= jm7`>Ʈ>]}VMڼzu F`    ЯkbW_-vP ?r: ]UjB,1Bm   @8t ߶{m|mmW?U҆ f"=[]mL(6&C   (]  J|۽ c0'bWƮv3og!بjlf      `sl1[ B]}Vͱ-@!K1	Bm   @ڪ9 A\?-l;mcmռt(!Ů<` (|OE{=      H.v7	O6 0ulg[ҋ 06Alj   Jfj 0`3Le x#`BQm9ڪIv^8P<6   d{ 066՗jmդ{}`.;՞,D[5/KPm&M^h      (h x lt E;9Elj     `U6&ܪ ) rB8h[jCKP4C(P   P ĞbW?v> Up &s_jvv(|Ez-      &N & !pL+mZzIHX~_Q$       w  O"@nv6j m?ZzpE     0	 cmռt@}΁6v :kAq^h	   P- (lJ S6 P±lUsB]|!IZ~Q      gm< SBm &ogX<˖6`t        FCu|]})d{aK1	2@"     fZ3 ~  JBx#9j(P   P*6  `6bW& 9`	@)nB{uGli=y%       zP^ r|	\Ǧ6      a]/ Us`	 Ҽh;li`=$Bm         l lMa/v.O3sD   (K Nބ   P6 6ShЖ6`F(Bm   @t  K jvBBbWϜ0#         خB;ڪ9f=x         lȁ0ml(݃,%        My !Jjfu
0S۪y@        ѵUs *RY`l̦/      `P | l<ӱ3̦	        \L    IDAT	6 0{v6¶3fE?m         `Lm8,@.B;mH^(   R    l>Į>UY:XZ$   R	    ׁУBhc]ysm'c          "ڶpBh6M        ѴUm[*@>Į>]}DXjuMj        `LB]}®ތj        `LN^kUgQF	        0j^Ugx!|]}^p4yK%lP     ŮwK  <MT`|1Bm       S_ 80	>@۵1h[rƼPz         F$ OB8]}bP"`ܣ16        0j^vU'PTy[%N   (ս     ̊  <hV-F:X2le   
^R 8L  < Cv66Ė"`ҽ߿Φ6      ,v: gSUX0jlP     \9  0j^voz/v	ms KVN        0 BxXa `|P      L p@ݤssu S |/      `P $ d; =     `y_  V` Bx#F^j
@nfGP     \9Snr-@&\1(О j   Ju3     8}]mK/ NQ	      An `X« 96j     Xub{f 9	<W!՗z VgٌR     ,PAn `ڪ	!l>|]} 0Ii1   R  0# K%!Wm 0iP   P: 0`|  K:`B;/ &@P     0@ XV[5 K@$}]} % }=d,Bm      %x[J' BxD`>ڪ,Q   % =()l  8	0k!՗ c6x   @nC ЫcZϲl Ӈէzˌ\.r¦6      VZA jL'? r	칗cBm   @u wi9  K`>.zk=e<3ڮz06   d^ 7z+jfG i__fCR2WBm V́046     e뀆CL<;m/`^ڪq0}w!T/96jcpBm   @ɼ<  mY	> ̏viH屫=KbbW{/o%   
 @z<tBX m6ώLCv6Nxlj     X+s8
P0=7[2pkmDŠ   bŮ ^sᑶjl'Ss>cP/     `1ڠ)fɁ-}q3b<7ϲMm   @t 7k<Mm56`nv66/o)|Xz j   Jg @?Nc><ϾW=g;@>@g<7ۈ fj   J' ,mj	1\iջGm⇯	|mW=P   P:6 +gxÖZ ̎2@nv6Ïkmx`   ҙ	 Cmr(`L(ϧ{-vm7P   P:/  szAz϶V& 0;q ]}5$y|=j   JwC  vLX< `L(G8	<٩R|E   E]- <i
33(z%qbWy?37xF   ;] XٱCKPꁥ:yYr`Ҡ7L 96Cj   al |]=6zX
1iTv6	16   `
u	 .bWX"Uu``#>Ʈ޳>SJN    )% 'IӸ`mm)#dK!Ucz?WOzu q    )% J21;
%0`tWzڻ4Y3{=Ba  	pP >ǮT(Ƶ/#KVK fZ|~~Wf6   x %zkjƶ6$ڶt`^j+B`xyR1ʶ6z'   LŕN |&]}@ jcIliTz_68H$F   pX Oi{7%~[5{ί5`ljNzt^a<`N   
6 >K|WXY [ mWz*y,? P   0: ,B/vQ@?޶Uc	s'	0Sy' '?KgS{   D8( ,]Ǯ>;]{\UsB`jׇէj
HlZ =   A _iۻtz'oeB-@ :`L]~>$]}B'VElj   xW/	AlkcڪI_k.	"ݫ%)=9o ^   Lc<w1G gSz>Į>hrO[ȁ%}$   LP @nzsC
0{B s2O,pUBfB   )jq1ܪ2ʶ685p#.gj`ZBz,gJ   /(`ՠ_19{`.aŮ>]}n0-Ӏmz%   L͕ R[wUL-m `%7!gԻk`+6   `jl  #p0ɲt6<h0o^XmOBm     Pp ޶UsLԉ-mЋ=ed ~,=3y(?Cf <%$mxNAo   1Ah FZqLM[5)^ Cnv35]}B(Oo   I]}k< V]n[5jcB `>@A@0cs+=¦6z#   LҰ:Z0
7E)@ 4]}^i`CwZ,F   "auBm VL}[ڠ_ܤg a̙F   "au0|p4b~[5Kڪ9	!ja1)>ŮN[]zv̝;F   Bm:J0j,H{=}`KKĮv=4~XzY   SusjL`ҁ35PgB0meݤϵ	NC))P   0UK Mm0jNԙU6Rk
àJV́)vu
& ]}$U[56   ``u0ծ`8P|E3 BxX_8F^   4<p JamռTj
pB{zJzX#mg;yGbW硓mܸBm   9,u\+4b;۔Mj&mhP%	,oux
6`6   `lk #pϡ"][5/*z!]X` |P   0eK 4/m9c[m
 )hGWJu= M(P   0Y^³0|@ש#KmEQTBm}]}u EI   AXn[50`\[εch40C%<^Ů>QrOmL6   `ՙ\R
L[5G!*3B*m]06`v5>   S"dw :6c7ols޵UB8UY(aF`N>Ʈ>ȁϙ>*TBm   Ů!"r0|ˤa،tLS]捀0һD}1Ů>l(?/   s` 4؜mыL>w zuB˃FmTƺ   98EXP cjz+ƺr2o pBy]}BxBx B   Bmp* I6Oghb	Q6`+"(B@=b]Bm   \\$̶6 _2l`u&EnF /Sڋ]}@igS
hP8CtYP   0`ARܶ^*!_+Dk Y>Į>̃x 6olC ̙P   0K۪Q7 f #.VM~PPM "m<Ou]T~0P{ú   YntV  ]}BxPe(nnc
L±s
#0iA~F0)93V@66   `NtVvhS #ʒmm8_vU&cu P
K#*ve&`+ "   ̉C<t X إCqu`V͑֐m0Im v=	B=	   tV 3 C3| [[5\9ЖKL[ 9v,ĮN*m y"kj   ƁiXݶ )v}}[5mռԟemL{ G],`bWw{0uBm   ܜ(<ˉ00iPm[5mդߖ^ @)nv6E]}:>8 SB   9]}V]<8vӴU^_{~v|BHS[g.5uVͧ5Om-KT
X0bϿ?UM   t8NҶJk;kLOC)}?)v-\> >ol;J?Z7m: R<s,}>bw P"6   `NY4DXb;}o篿^:UCn|	0qt-^m[5cW>j^|)vISZyVMEY 6   `v̶jn!L`5mm [iKur;!s3
_v՗7=92ml`>Ů>XKÉڪljh=   Li,<f/ڪ9j&_bCcSxoiBC]Ia۪9ap&"Ogo`rg7 s)h<h'pTu   sulyNR#6u/V}uLWڴ6c;@Z|sel`.nB{=W x@   Y]].<ۙoEvv͕-nLg0mwͯj
NeYuY^z=΀ocz/`O!;u4Bm   9ϷgˇOFt~mq8y߫Us)VG=s:N@߶TPz~*vm k]}|VG J"   ̙- tHjv@vōNn۬Xu</m* qB؉]}a ]}:{g j   f+=7mv*T<vmCɓ&	<0Gaxtݿv cŮNC`uz`kj   ΁iXV>&Bڪ9!P|1lpo)l~?0- (XzV*v&'vuFP~   `ҁj􃵤mN!7(N[5sWwze[[5eӄlz&WPtk!|`gTO@v۪IǊ	@A5gO ȟG͙ lMm   2mڤ"N0C7T|c3зyH c6!!FMm   ӿ4-ml]-FUshjFF/&uaqlo<G[ҦR^,aؠ\(v& lN~6
 bS   0{!NC/~3ɝMy?mŰōu ,n78^oV66`h)ll+; 	#vqMA[ Mm   RuzqmiÎr2|,\*(/_sh#ASh؄m՜ 0O<1pA	   	zaK6VQ8=-_[org_JX~K:ܮ[|8KV `г!!Cmդοh¯E   X3ݡ7m/ڙ<[ZMu_ln&qnwmT/_Bl@qD Es ]}Ve~o  j   D%v8d+}t=ޣ}aWsp-]䯽k`jC էZ	0=J[5;9L J   Xt(/^`mռ]}!?X[,϶2=$zKB}fu
0Sgy$ %]{b0m9A[5''6   `iN`iNem-\,[ܖ\Bi&KV́m $96`>{j.\q X)!   $PΝ ҆j^*/J7mդ y?ɯm[5iY
?  `; J[Ů>h=m^ %   ,MR0	񲭚=5˥-M<-n)j۪93P lvޠ ϑ6f,cW>3 j   <O
mϤ@R#lq  `  9ڮU`bW?BwZs   &ǅNu)V͹p	ߒ6kUsIЇnq;abZbW߆.^ *w $<9   	:pV͡zţloyI[5;=	  `[ OqXj]~} *   Eʛ@>>"mOO%TlmUsk;#smȲŮ>!-  m*@i3^ J   X2a\i+uł0c
5~O#zGkBLw (f !&vqrX
    IDAṬB <{!g   ڮ|ؘu]J?oi#V[5)jϡ_۪I!=)P @vݻ7~u z]}B MBm   uVyl5.k7}V<x_ 2?aK,ǧ{ ~*vi  G   X՗FN[ڪ9MA(~tikۙϠ.   xZ`҆7`esOBm    MC	ާ T
D9,7=l@(xy  P +mI} \cWw9, j   /uh6o+&*?a6f`W8'K/  @! Sh ,omQP P   _rjR y̅`[YM (n[5{Z^Uc-os    T8ڠ,mi+lN
UsVM{Rk	"v}tu  (mm pB؉]} %=]1llBm    ʔmVjҖ0}Oʖ)[a{)v-Ζ^B @W \<Bߨ62	   d$M[Ҷ5&xm?6aI^U#aE 6
6伊]9 KπcW`'X6   yiӰ/oo31~Ml0C!p  ½7\vbW_- 8&X6   GlkIJ[UO 0s[!7+vu>d f	Į>!|7/   _(LN*>}U©e~FÈ6mMjQ/ P}] v6 J6 (튬Ŧ6   @`ھjFjNڪlˡm=PL 0 wm .vu4F`wEæ6   o#mYٻ6l]uǁkp@,hȂ,Ђ7҂!-8G B90WF$ʵ"1TX޿Ɵ)nc=MrF{c۱.Щb<3￬? N;ՀIxWͥKTf:w];'6   '.8RP`ULg3[t߅vsK|<u\ɓ&M JIMNrm1ްf
 3#   mg)7b}X#趭^**k`<ܴ6 Q[~IjU')|X3[d !   kfMsswa߻?F-yn;"k7FfZ YbZ y{Wͥk\>_\Xj   s6Ձ3(jo#0 `\!P;d硪Ըϥ`nb2L_\?   o ,?YimQ 8;;QT&ݧ mRMUU.6J"   c6='ctׅ td0NY	Pmɽj Bm    ?g	 Bmt  `<Bm yVU Pt_Ͳw<   <Co PUկa\  1`<7h PmR#j   x> 6J+(P  _9ӺmV !Ԅ 
6   gp    ffٮ] R
{msRU;Kh9P   ˜ET lǥ/@Lk a}02ez'A    ^n!wi xG/@FLk q}лlm6gixjqg $   Buۜ ȅim   6msBˤ0x6'UU8 j   xumJ_x6 |ЛmR%׫沪eŁxN Bm    P E<ݗ  :d1siۺm,- tnl8P   `   jO Zc V6I'   Ji[4 @bZ  0xqUͱ ЯmcjRë	r06   msYUս5 Ȃ   LQ*~S͙ èC4K`8P   V `|¥  z ëS63-    x  +  `p:\mL SuUUUUm]   tns PgB  f,ol @jf[M
],&s06   % n2]u5  x?绯nE mRӴBGBm    	 Ep?  `8&Y\m) @궹X4.ϴL   Cuۜ"BxS:  @>Zhg mnlrI8P   @V fA4  joK^궱  TMg~k{Bm    w f˛m>UU>  5'$O6ԫwp06   msiC fMm"l[:  @L?yHN
 @6YVUuz	    luX   `/>K\=`9_	   $R/ εK:-uۤzW  L]6' ŞQUU.5٧Bm    =涪k rrNҹι  +!JMGu\ @RneUU.9   שׁ pXo.  Ǥ6J-;  &5T{K'    z' fA	)w  Ĥ6J
OY9  PmWUuPϿtB   ` ѡI{Pvc.  B~Jl׮: PEۺm(G.   nKA `]k	  PH)n"&	 IԩQaƼ	6   al^$mu_(*/}  K@,M>f& DX[fj   PtXs 3lvVQ  tgk-> xTPMxgјMMP   +k m޻^祯  t*(+ ^nWUUY3Bm 0  &$6o\3 ރ|3}   9Iӽmcz; ph|{\U՝d4{3Bm yغtE 3 m4U*  \4 9=i&N14ݘi6u#	@@^5 ]tOed  C1Wu" @궹j.9 0w ѸQ( s :߹  p0ōLYj@n3W S	`ۍf433Bm    #" F<?  pb wu|T4@g `><$,лmua,<DwT

L N[F&ne n8Zyn.]jchFM|Xx0]99ޙj Uz\qk.  ƹ
SD9 m!m;SPR  @ObS{&  f(fh   ^S&
2 "mT sF  I| e` n[O8<  &$D.Yj n몪5_#S)6poOs0]i:Zg֤?lw6 d&wuۤCٕ  WQHƛ G]M
]Jdjy=^^,
	 yH6%$&)  &4DST `JIpߪ%#Pcp#0C`_I~/Pe*? Ƴ5  r֌nO.
 05р^5LM Ƨ{]_;A&|Am 19F t/.'qf{7@!tWG9 JI+W1mcjc&R|%'cX'@x޽` yfnCflwi[ `N9}Fn	1%tf,|=.	IcKS#mX6UU]X9Y 3n2n ~@jcpq  \_;A|`ΦË  @g^n|1
Cu۸2m_Z} `R=~6K5:'X$?|Y%etLck-{K6 x56<0+g{\<# t2 @i5ĳ6jc,nh~蚢!/xQȟ  z
8TV
 fn۽?ycο #ja PcqClX}cGҧE/ L*nft!+	0y_N4nKoۘ (ZרfYUEkAhyPci]:g~nB^ ~Ld u"{ r^G"  ms^U՛f]2	^1Le	6p[}F MXay{S+t}>uۜŤU  DMǑ3^1&W0g
lzf'
ߕ 6pVUJL;??Eҡuӳ ,^R-BmɁ {=	\Ћm>
msiJ |AADR.d\}!fi PAWq QKPæPc19O>_ }Kc3UJ ~'Ơ"v	
@}?	 Rȡwۺmά$  㪪,}jc4逗rO>_N>R4Tyl 6g' k"@)sq p'RM~gyMPcqElћ(1.R= 3,%ӵk (@@^Po
ϢQfP:  PeK})/d16JPGW9T/U|>C<_L` h#9p5 򘦴#dK8W%wmέ @aƼPjcl)>C9T
|1!m DD0|dKv-*<}UUG& +msRUջh* c18<Ѝ)wuz٠PA,%ښ6<=m \x+F<dE.!@@u,_F 0u\VUTh:AȁJ˝	P;!5?Xl
mu `vRmM} K `<i R#:^ 0Zj78WBm@gH>og!Q	b3:&hcUxUUu `\i%zv+P+Ąʽ`P;lݍ	Z
1%l޻<k/Z>$ @Ǣ6+6rqJPml24!Jq!EQ̃EB3!	1I{6 øg zVnT} @?&iXb76r!pA)3;Jy18l3Zq s6Lxco Hߦc?*
5 [ӮfUU[eN߄BJsS"uf$LsG	;93Y3 S&s1y q3|gs^L!d{i*~ 0QwIK_ 'FN}{$!s;̹^Qg rv@a zu"&k),6;o  TUM
]~ű?FȆIB@1f|x$̙l s熎r07,Z幉@0, msVU[{EOȍJ10Slݙɘ4g`愆ϊKϋ d$:3gm J{s}Mv5Q&k#Mc Zcs	[̔r`sM4g`cˑ
RqAUUW N) :'=+܁i6ȫYn3 <u/AčO$s,DМ99UmΪ:-} ͽ@l8YSu wo֮R E}[۳弎A#kd$!Fh,hLyn(T6g vS>%lxxMܣݟK8/Fa3  G.̒w7!FvSύ+Ì(p'1j0},]*paFntQ-[<7.=;0ӺmVEh_Rơ|'0GA3  ISԀȵnB\\(&G̅bZ3Đ;@ORSZ,5 tr
Imٹjc  
xޟE,ƌ(&;Q(0q+ژCtT;Qb(fB4LltPL/	zKao
 mb/坍3Lݕb`2rq8	dɴ6f=? t$.F9Rz'="L1<iF5
] h<w<36a _fLգb`rˊb)mdδ6̔6n[SC 8PzN>FCkS^/3tEt]wW  ~$QG5IPST]c/3W3{,SˏDRz ^a蚔DTs0~@[%PF'ڃ՜t(L gGj&ACl$F3QȄ˂>>m.2A3,15䤪wVgy
LZN]E`ccę
-H x5ݟA	=Lйb`&DL&f1!>LXw~&]d4Uyc
%{=  Pc0PS `~(F+`g*.fJbཋD953qt}@Jl
rSy.ܺmn]Q8Emt*k 1jJI`_^L &aɝ	BLJ!pxC@dԛ:ZH M:IC{[
\
x%%H)/ 5YjЄژ!L ܙ $<z+ѱV`Plq
нA]si:80c*6
uNOL ̋z  Wc`(C>186&#6K]12Ӯ`b"敫GLbA\+FKѹwHۘΦl=wssm,GiF_cټ 01869PlGɑd!;t*
Ϫzk:@1.9sשf"@HQHw/  ËVc0jcV̕/q &b
]U|6aU$#B.&0k9ΛN$&)NJmWܣ+%qVC['CM2 0^j|1Bɉ.MgF'\8r5M,DMrqn
CN5cVx    IDAT L{'0Q	$7qly,  وlqU̏Q1IĖfl[0WBA: wu\)>s:̂.h(pi01S>d@4oQ:  9_tjP^0
6leS*J0ő̑d@cFu,MmhHw[
:&m{Lkc1aѨ,  Cp4A"dE+Hna	f)6;a,!g,Kafj$4 pL'ǽֻ-s3SwQ  SuKVhژ:uV؇]02sDjMhlMm{k@Lgrd1ms	ʘƜ]jjP>a.~i  (=Fhژ<V6(4'6Z0YbL `Ox)T{ژ1Sf*K߽o `XMk5dLBm̂ZnA
^@)(iJQ۠oBd-
M( U:t`Dm ]=lwn&  lwպm,nxg`TBmR=;UC"d$FߖG)Q$h]h=1m>_Z F30?)HmU̍N.1Iw  Y:˪wNgTBmFlĜr'7&ЗSS0)Y<c(zmLNLmKESG .REw8<H:c+a}҈)<Lj^ms9  <G480F%ƬDAUcmeQ)].LkBGA፥c+a*Nf*;@R8B@!"zTU՝k贔39OdMicd)_.  P-8P4fl]fgXt`k|iX ?,lTTuBf)t*Ϣ%Pb}RUUzБ7uz5^BƶY?y6}è P:{ݯλc3Y2M"dhOژNT7I3ѽ]^`jЕuTU`Ȅwյ(B x{{xbt&1k&q 68@|GL$J~N@YUU]OJ:[mO8U6g/bK;^}nb  fNM[~.ߵ8㟏B1{m@<`  +RxOs~!
?iW<c=kb}>mtf7=;w  0ֻ73U`bԅpƚLL,gxw&Sװ( n#EswҺmtgHWǞ5d`
39@  @6Qjb佋,F1LlLlLlN`S_m,}- Dv{]y~ -6qNtf';1Q\/\ms  YougP86"w68@8XG {6Q]{.JMS t%/5]C<o |	fBbk|h**  &o5 7d/.%bϷ;7mp-ZJr!I(QTpc)(,Pf{ڀJtm}wUUձ@ލ}=r{P!cB\4 b?H-c(fN%1=({-c:uu-c4ePBDs.3)TL4 wS2mTlRjz  YϪB]6';6_)eOAlCO'F@p0S0xƺtEO.D {&I,
w:k DkV?OV(Z򯥯Eal  %l.]c+	3!d%\zGY2Cq6}F	Q  Phz 'Bm)f-/!SA?,x-`@ŹEDL`bـl>Yրyͪc4'd9r| H
jar;jmf&[
Wwu\0b}-<<k-}!>w2'L+؋ 'm쭽FfXμ9C4g6 ŞMzی}#{SQb]f1l
`D<!
ޗ0b}̋)0R #ڞ0Ex&!@hP$Y  \δqC6G6xfNlYYV?!d$ge.9/}`hzcl Y<@z%nYYtjXR  2YWg6m29Bmqp(xCLҠaLL&In\s&`v"vsazSG"@YZllXg"j  0,#6Ed& `_]IIμ@4h($2Lzr=(8K8/yo/=GnXUUSn$  L@ۤLzixCOl01Q$|%{E3Cl cQ8'@r(p>؃LHjBژb~8g  ^(/'\+p}\	l8dU%a6_:f a\'h Ϯ+^&)$0$6zɃ@Ek,2Y  WǺm~'	h\<D7+`RK6f`X/ccE #7QL)LX[xk Os9a	ph|1[Qk
  32Wuۜes/Fg̘aLb2?ayx\i,0qq}Whc6DGc:=  b}5SƛL{#Lxi#/;C:\bEנ#68VL3'
Xwupiy<Wyo绉3lbtp^@ًgL'  `$59}6~&6p[٠`m{W!0{nz[ΛZ[{&·Ef>3w|M6++D	6ks9   DS5KN:&9a6m ~'֋xxb}pslީ {+/ =o(:M͏1M  (P\gVXO]BmГ(XKƯ[qƔ{YvGgY$瞧(݂t\HcFhO   LVn~.6ԋgR"&s#	+Me=}d"YW[ ]\/s#ȥwҙ,D /loV6^7v_zpxtW|; bQ$?tAۜ~(`z
=B> &dXｻj~Ŝ7ESkUd*ŋ#>:  SbvwmV.S #P=Rt(=)<|^I2wޞDb{w)Metsl4c1LYGj*}6g  7eUz	S!#*ගav !л۲"{Kwp=9D
cٛ}:+{`~Lgw!9ggx=ms   ϵYSs\m.S!q?c$EAuةl*FT9.{SZt-QP(^3Lz6֬U,lXF  x_sqS"O`ۮ(9c￺:ł{qwV!6`J
(Voڟf
]U<C	1x>lB_f#ٳoy4ՕY  _ssC6G.S"_h Q:6?E1P:l08A~?c9x~]=v)C>ǀY1ί*y&L¥g ۵\wR#z^Bsl===FԄ  3:ӊDO{a~noPWU	}ϵU_{,PU1'vju2J7}L½ jo&t$5'zuM
!jϷYӽ_/6  :7!J9ԡ25Bm    0sBn.A E?v!7Ӎx^ \Ewqa68
cЦ  M4хLP    &/cZR!#lWSu1{![DU!hZcLg  fXUU_d	   @~XA##x؅La g{Bny܅Py"6a6؁RS  bwSژ,6    Ob"ɱ=F?:0U~>> !n	iݺ0tim7u۬\  `Lш__c^S%    <Kl/VHc0kNv75$6,Ny^t
4~bZi6.  b}`n3j    Iv݄ʴ݅uۼ/}Q `,Oago:=Fwk=`8/֖N~  9~pS&    bo^'ɺ<|L0\a~ؠC]wK~K!ۘxEzƴV> m4uۜLP    0bݯV=("ߊ`X{a]C3 79S<u߼7	iminK
  LmKv0uBm    @Qlb]woU{aO{: `:olXoA(TB۸|b=13{   T=1nkj    &joɷD&?]Qw [Fo<#<?))ko!|(^mw>[ǘh5LHLk;i&  sq&|2Bm     {Jq$ ^   0B            R            06             #            `             P             j            `0Bm             F                        06             #            `             P             j            `0Bm             F                        06             #            `             P             j            `0Bm             F                        06             #            `             P             j            `0Bm             F                        06             #            `             P             j            `0Bm             F                        06             #            `             P             j            `0Bm             F                        06             #            `             P             j            `0Bm             F                        06             #            `             P             j            `0Bm             F                        06             #            `             P             j            `0Bm             F                        06           woGR]i@s:;,@Bބ4X`ARPʂ#")UZ +9wHj            `1             X6             #            Hj            `1             X6             #            Hj            `1             X6             #            Hj            `1             X6             #            Hj            `1             X6             #            Hj            `1             X6             #            Hj            `1             X6             #            Hj            `1U    ,k=l6]]K  ow6>ή.޹tow7Á糫g    S    k  m|pꓒ&H\    Im     ˋ$	 rD.Ϯ.~u$y    f&    `y I  P* y    fW_0owo]]88    `5fy߹Z ow7ͣǳW.ò݋?;X}    3Fl6g    Z$v#@`6ů7yOc4PTp5RBS>    KfЄ     vL/%%DV_^9@E2	3    dЩL:epvuq*  ВT(ꢥd?+`y_ޜ]],!x_	i9x9GZR4y<    2Hjvѳ@A   d``dO~<"	S:(QO*o6웙?ҺI^   5ŷ    IDATO"gWi}HhHj  Q ˖vm 0t#H`6f/(Gv.oݢ6    ,AR:;Ф  @ߝWB{:̦:9zz_'    $Q-ᨔ   <	|GvۥI	@Ptsvuswm    Iḿ&5=   Eܩ <"S (QOss!ړ   `UڨY¡3%\  E==w(EdV:$%?jG-s   `!ڨYd3+ݣf 1  Тntt(t(f0}Xtݥ    %=|vΔ@wA   ;.u HJOޓ)2EǦB$M[    `Yڨ~m;ФîK  F\.u /V_q@"볫_+quj    X6jS%<9r   @s2
s:RV/q@z:yS"    NRl&ߜ]]|t)5   zYs:RV/ߓ'TXJd-SY6G	A    06j%9췻= ݷ   =.u SRBu/G!    ۦ6f0:S}  @zzz?]]cUFBz:붻vOɋ    P
ImԨp)r t  КBEM]]l6o
( =0Uh2k,!r>]9_wmm!(R
    wH6)Au  " N;9(WQ"    0Im(ry}vuL>x   Z. `bU!9_cSݵ)   IjF=U£N%z   HJt8Eޕ   $Qvh<|fΔ R~svu  Ij`5.O]
(Q(ѫshw_g,R    !8ФFC0   owl6_K" &X|d~Q"cS|="\EJ   `ڨM (J=   SEi^:PTtw    @Rl&_qcH  E=C_ L,`-X}afyW]#`)sjǦ4]E    (6j$ym&v=   H$ `EkKwuvIڴnK.   4ڨ *9 9B   UXS	]`	"ecݵ    `%ڨdjoݳ   4g=l61 S|d^$`q=蹻vwV    #Dt
C   H y]7}OW\SR    X6jIzʲvfyA   hQdOG sPk,!㜯k'    Z$QhJ }  @T`5I&Kj~~זkg    `Bڨ*(r t}vu  @~%{: LMՅtY9_ws!2O    	Ij=U£*  еv' u}"޿,`1G|qd	}    :Im"|xѕ    + Mz7q+ K霯=%/   @q$QTe=l6Y_   Z
 k9PI>Wڭ+#     684)   F" ֔/X}y|XHtnkK   IjQ侽<U  A A &a|~Qz8yW]ۄ>    (6j:tP  ; Mz"?R"=    EFB\Q
   l2:X0:Tg=l6\XʓSswm    2ImԠC    ~#@Eu[^k,!tcSO=    `eu(~sY;7	\>;Z:sfs>]]Q4'9~uɤO)yѭ_izzWl}sGp1%y`2Kc=^C\e[//zX} vyn	w.	    !9t^In59~8xW5u>bҡi:ݻOt!YUJxv=t_>.٭q6}+'9ezGYRpӓq#d<?oKc"w̳fw'{;yܱxD[kƗ8_(_]]]:uڤw~=w׮./
q   bWJ]N6Ŋx,o,fyUy
z>xF[yi=;	
Ae9&&("cW	^U>'B&oN`t= p+G}CUǳt/rxCg^9Ib;aBi,)qM/5gbG=_0>c_uZk]z%ޡoxw|ȟmuTp?|7rydowCgWcgmҎ6k7}MI5c`y]"g谽'=x6Ggl潋ڧ{    %CgWc6'`^:!$Y`~J@%nC
(S<T,֭5ަՂL(ے=pLf8T谺[ffm:$
x54T
?x J
Jx9
f{#x Jzw/pxt%lDӡGn;htk0м?,~K	bK(]|dL~һ}z
(%=[y]XakfU{W}e&Hk+i+6Kտ&]<췻øZ;/5yq=ck    W_9JC&y?C
*!!	v6%LD؉+tv<ߥDW{I#g`k NCr,3>/h:oqv)qjxXqҹ%Ry.lhijyQjﷻU+$y!N-;gW<b)5K"匟c4,.-eL~)0D煌9Cy]ȚY^t5hmm!5I~<*~if6s_q|'   (ImCϤ௡sox8;(`/yFj&_y5arPIy-C<L&Q])]Bq*$4v7^]]</(&y1TO>|* siФN/zT1DT,yVkkVX%͙J _^`!c`sL㥎˪|F]c*\dTEkĕɑq3YH*mqzwl33]    6JVfT{IĶ~XUaCAUKs<HSzV᰿R):]`Z"'/
@)<ԡJĶ﮹4yQA ywma<Gc.C6jI}P|:7维1q){Xkhstgz6SbʤX"}_I[*ڜtޛ{q*פ5K}SUrN %!    sFɢ=j!%*%Z*i:/%"RH[pPJ߳=<O&WVtTkbũJ/'56||w]]yVO2<CF`iUImS1T:&.Mi_V=v)콙'z,,2V/zzL:6iK*::vwFp_nS;r"^J3Kl   `(݂F:0o ybAk@Wm$9>䥧
x-3O@g9<4<TcpvXe.Yi2۩Cbۇ|@^cgli_c/Xe6YBR{G"M%~Ҙwo{X-GOc	?dg3Xm]3RidMX|*ekY["ɷxGo=cs&    &_)%J7P^MRpݽHW%SZZ; *}&kI\Baow 03)?5h}t?Vt5~-n0%,ZmpﷻØ ^xM^=X,Ӽ4|-=N;OgͮhŃ#N.=k>I;1'i曑g^ 2ޛMt:6iG6i^xH^V3gϮ.tj"ɋk޿x3    D6J݄/@3XetgZ<߬t`2Ed W3\cC%_1OX4g|F~ly*
ߤy1A
|R3ԿtZIn[$I7H9[ kH_,y1!!T.qyb׵/uta$;j';\w&+||2CKIS˪|ΦՏM^
gsȩ֑w>y=|GF%u3M3~(["׻cΫ~O?_caF~    
!R^IutjjO<|b `2b-JK+}].w	CȯgWoF=s=rş)odC6{z@즂Ufku:NpX46tLNҝ)IxL}[n>ǦOҳ\zpM&7O_O'ya
DiLfGͳy%<fiL5g:~NxFhk].F1w{5]k9=56m$ijYN;WUg1M,dww#ޑ>O-?gOr~?gњi   h?qm)Ρ[@`Pm;7CCP⿢e 	<OASMvP~vurƏS*ѾOx #<O49o}nRb3%==	PI	C,p-LUa<K&~9-}/;|vuJ虸Hy;-%@=:hCJ2aͭ=1yow!	b6]#sS57YgxScPz;#o3=Cpc$k~-2s!{gyLw}&~7iMg/k6Ck]a]r޽#s4ޑ}MIesή.^qf]A%!rvuL6yyL	̝    Nm*Z!ЍPu|8 1ca6_NxP*)2
vCݤb|^ cuGKV4}gcǮߪZ!fPI|5CP>	=ӵwltzDxs|Rû5E'}UsƮcVh5QX>YOgubmlSs Qu3|ǥ;3G5u7Zw.;t3M5&ϱu{m?E:N4=uy2k}wǀq3FCeaںf&_56&3lNuG{>#G|>}*sji9w,qi9"d<ɸpki|cs   0	ImCa=P(>2bJ9Cm0:%-VKgx2$<HKi/Әn굳Tu 6o;EuSXZC&+_Oе0qNrJ4Kj'i[}~23njy	_i.`0ܳ>l̳AFŒ" ܃̙\<sK_wn'{潋=vg&=>s=>C/ {yM6Wko:u(e;OUR"ʛV:of'<_do'30-    kDj7y S
M
9|pvu!(}c0uj9NGt9ܿ.8gWkf:v}	<l]fJh;^eK	Lw?]t-?Lp-cχֵ<Ng41zȻXs^o6Ʊ%F%_ɓӘogW.9o9&ߥ*;^;KN?gwKg};<`MApux2\]!}ci=(U0EB4}fz=J59ϐeuibΦtJㇵZW%-Sf^^8\R7Ӟ"fPB_J9y=kK   ,(QBZA&MAj9|g#Jdum`Đ⻆Lzyq;82 tl3.&ݾ/izQdHP|UajCƳ1	UGvZ;h?#Miv~|iMN[M`TRFoKIQ?dZNYǘ㍖gT;::kf}ޗO	Y!ct=i=ʮiȿ2]g%uH59k|mL4nTɽڤ 3N<-g=N
ne߽OWoO^=iNׂw   @y$Qfr~/ y|{)'mlG[d9d3hmI!Ch ᐫ.VCd5GNUo'[d8ϑ}:>/=IP(yt~:IB[4ځ	XS$ɋ)]0js]D`ZJl{>⯨oҼT	?3=γv2@~/Jy:rSݻ4stm~s&!?+IPImL:$/pmڤ'16'Iuf}q0FI.>Xݵ''=HQ^b){FC   $$Qܻ>KLQic>wSAA~с`6&OiU#PB26)o)	]IL؀D    IDAT(Ff*ŏY#:J=NI5$-ݳ`ISQE
<R\!)6x;vg& 9?tyVd,e!qKGc)nFE1-kn|_+1t+([6譢愗?xmRekkOq;Ʉm6sF췻ܜqWq8"ٓ!0JK|5b/1<    >#~h>3A݊)L -j5mK#ҽKJ8zHh9VCW#*.-H-[\1ZnjN:&Qmyt3t%ga}tUN|ŷ%%D$w5Zwؘ
ܳ1jgyw{pa5$̝3gm.n`[]rxJZt#nׁbta3fXB˒&6'&/hyo
f5Xc*=#{+(    Fi&L^ѨĠ_JvOM)VJw9$Rs 	 ΒEwf;h]áWMpp."lݽ4_{#jLIg5tQd`LuDJɑ@jX&M('9	xd)4\9ucYOh$ qKW	{d̿k+'車L+v|Y/7X0N=ys_	lYvH3&V&wzm2ABC3_lܸ2=w׎w=?    MRUaMFBͱ;[#'RѷTߓ6 /<*/aAs02]b;K62кʼ9	MZ-d.LA-T0"pI	A_1t.5v<ۤġo*=D{.}ɋ)_@>0NU$Gwsd\~P8nIF̳JhJT{}g[Ƙ|YwaMfD>>98{4.R4ȹ2&kaw
Ll>ZWVcJc^øt>    Fij?4zh~yz`>u81 ,'xV_"	]-}323%e*cgj@cGj+$: muw~gxu3?0271XVb
>V4޵9]U沕y'QDm?KcMn#~W2EJ~sh Pi6GK}Fou{`іoC֑X2{wX|Yd6iicHbK2=9_84v?Ʊ>aM   PImC**6P	94=j
YJj:KnZ+.W>)@_;.0oN*>,[[$0t>Ihzs		M^᷐4{hd;#j	Yo1N=l@do =]{XCWsک-w8'j&v1tӥmAzgU[VdJ	9CϓnmR'Xcc	Cqg9"    N(I	V;of-\%DuCֹ+?	I?`f<MZXtHht/ݶh]`<<:NMcЄV1 pb~+9":x,𺵎2_C=X~;<뼆y"jk1+~E`B[*P&/Ӛ(7Dͧ`!''6CߣSRBBרypMrߑt^aGZB+#8&M;w齛    Hj$w|cpg-Þ ׭v;H9cЪ
犲\N]vTq8>HFwtsRN^{Fڃ7^C`5[^w><GƏp`B%Ԗ^2ëɜ|3Gɶ^\ub}\HZWe:bmSd̾:(Kk4u{`aƄh}    !D6<Kx5Bfbٴ{8~< ZNNb*+=ZʝrĹ77_78o+{l_Ltj=K <%W[]yDy0;o;\Y黪[[$8򦥹VF _	IC?o(ˁ-v&Uv{\Zv&Jt~Ɔ	lY5'L5/fߔjmӑ%yG,ѫڑژ    Ij$95~tQuq}Ui#	Rw_?x̓|N1oB9k&3AqƻpN$ݡNUi_R[SɋC[4_yX^x6"ygp=b5ѭm-=u7-W{xpx?j*M5QLЎcr/$[-6y$wwO?
SRh
{|iy9    FR@tC}x`j0Цak͕F^v~xTre:Z!#'pd7i^F)\fgWu
v:sB1闌-[[t`Sc\|raukAo{w׎Q&sUTW5QUB_pnhr=$w&|FyU@2]UwMXDߑ*u,,46Uޑ+Rc}%Qy9    BT*xhsuVB"}þ$\f+*UH?Hl`ݝLp9X=p{ݽN̻9VA.o&/2*9s30ѩ`	&%$v^=Cmm9wB
x*uLTDߘgn<M	A.;ɞ*qk].+zZu"ׅ$SXS$3然w~rO4^Q9_wyͶʞbg	u~طV    SUt3Kգ ásq{qT{t#c{{Ǥ;WţC%!h=G{JIl:	Hv"_֭'U'33CE!y֐DSwͳnR[	}uTx+Zbݯ6LX`"c[Sg*R^$;26٤!k
ѽû)Kw[R/tM    Sl&ThnT$9Ԯ#3ucPj`?$]= c_`}^d$>|&<5E{	me/h42YNzUw5v](V۷Ln<?99//k5dqSӈw䥽?;q8Rб╏8ZKjjQ    f RDJHb3FD=vD9?MM1v`EF<o)$`UFRJ˷!}0NmS&
V*Ԅɋܷ$#my [*	9 򻗒~	[;w3}jRܹg#dt|].+ecm%w䍽?;g%㜯wG,l>   Q$ړ2n
Lk^d^j64pc{}l0!̪:8hݝgχW^Ξ+Hչ|S$/^5[w:gu'9m=c.
9
W6{]>h?\0d:w`g9?W^/G-t^Go*=xom   (QګMq0V_Tb HA{O9ifCWa7)ê!$*L;PM];v옦sו0WMwNgnS0Dz#]k{wSM
S [/hmwYSuKtj]rvuf҄+iSqȻyyeЬ    X6JWFpT[ZT=rRMƎ]U_+ډ𹀿"1^}]4pg 1'o<.H9;ev|vM[*zyh	ҟx9s}[_י?nι"A15k;#͹6ygtH`Qpr%?Z?;yZǌ'l    F	"[%n	[RTu oݫ1nA^Օj7~Q4^}`ƫajA@Ht 1ɋ($1Ȣ~{f9i 5Ϫ[dZ留Ԙ7fv|3eo3QDeq:eyVޑY3|E)
P5X g#3   $thI*^fnÕv`Up|d$X佞;v]f̕&WSdHLe̿c@k'L^=ɋ C04O텊ƈ'ex5xF;Wނ2fR!ki69hDBg)N];p#Ea%   06VuuWw+ ꢴv<JwKf%Ǹ`5ӷq	+~;JwL{>BybsyҼ3ҽtyyV"=V@4CwŮuKKs$C,kc"ki6 }٭gѽÒ"I;U!Fird]7Pq1Έ   KRkn&t U'36^>zHs=$,X6MjkI)kʪ~mz~5<"TLb*::z	0_KLs1Ϫ\ƺDȻ{=w(	*fe]z#87K41){L&_VEN'SakWzcf    * ^	/g3&xǂ#-pm̊:+|Y$ b{%'JUo:L1,Ԗr:O9{!KC杳|?'yH76޽b=9R

sc
Rs~tjk3kɭ69#bXylIeG	둽19ga
,   @$ګ lEpI5*\Jף	`@ĒeBe=x]NMPGgw蔞U3ɋ
I.Y潀;f6D2Ppd!	}9:3~r:c5)Xuco9Ʉ
YHT}q^#i^k]d~e   hthRFz DJ]wfޫ+o52Sh62!pE~x
ԖsoxȻ޼sZi	0E.m'7E~26:!Զ#Kd|5gfAǮzNCщ#&*dmSnj=/kyMݵk̭    MRk!uhqhQD$ܤ"헽	Z,G5Z~8,W]Z>BwIvj[$|
(X:Gq=Ҽ.:0Pƺ%9
.-vwj{{^(8v.0_Y0t"MŰ6<z^ytw1DIm    _!+^4VO"A}g hAowfCT&ȩ@v$0At	:TyxNXwsv4cdysk͈+Z)1KRO?qg3Eޥ2]VE:s^KɴV_$wd{+ssQ]w+n?   IjcMW³![i"DRB[${/%C+	f.>m4tI$@z3@h a%λuHs9Nt-lGdln#J׈|湂k.q.W{QE]?cm2R&Yphc0_ߑjӞ;)It?Y    WȊ9Pd3\'bJ׾(U~1;|ћ#FƮH B18rof1"ݪ ȼf^&u̳SwB	b"c"Jv&{yߗ4c-)6d{|񮄵ɦTy^p[ZE@OJ\   8XEU:	$ZḤ!]a>2*|Kj;Ƴ	mW<f$BY,-ڽK'nyxthIi	'B
:ܒ526s;3:!nnJW[jzy~	蜽mBpFy+ZTr∵H'khBfɣy7Ɖv,e2*کz<О   >Z>twI$ F~-ՙui˔**Wt}
$10vET,Pfm)x7b[b).XH/2.q<Iac_LAѵkڈNjKr)pwj7KI$,|"hd
i&G5swmB"   0	ImdKWs㪪M:V/w<G*zvuB	hxS){	0Imɋ"Yj~yy`ѩgWs%guo::20)pwja)L.]T$_k˫u_.TSvEޑ;    &!Pc3<_aw$pz{ lE&OY0BJo SOB
xK^̐Yzg$gmrrJy6Ѽ3ڵvh6<6SdJn1J&/2xGN)Pgl6o,|_{@92߾;    &!ťC"tHjP!J@.z}<[pxt@o@FWCBwM%R3"9ytϟyyVzYc6.]jXkJ^˙P$FhU&p;P3ݵ>7u    .ImԌCs|\:s$IdI"۳hO|`^e"]w)`#R{5TAbbL:w:&~6jOIRUU,pwjn.]E0PM(_C"ϐɗU6vBκF?M@n    Ցj3g5My곷rvuq>[0cґ`]&dclu_n    IDAT|%%/9(OOzŋ9;D>yVC2ֹݩД1J&FMD\啺69$UjUUb{Ng   HjcwR,_];\u{0rԝÝr{mIZ^4PRۂL@ E}'1)
Ùg.sdX]"
-LE>JH%I{kuԺ/WeTݵu}   $;kİT4Cv>\ą,&Nw<I^o6󂪣&#ARN0|F(ﮄn-)򔖼}f_d;]2Xys΢	w-8U=7jNE3DQ[q$#Qx{Et[e+J^l#ǫu_.#{ީs    $EUZ6A*OkU[?3ݐ?vy+`#ާƮDr	LY7OTxVBbVIyŌqdvh63'y
Gt~[{"Uu)pw%dDp$OC0ts+r-gm2&w}j,)<vjv4m$a-ve   `}XZ2}R!JcAsd\6N\pG>{s5}wtܢJڼӚo;btewaQ.Xcm25&=K5'QUю5+=w4O'\    V#qfx7[D_~^o6Ww-Gf;z
6(USRϒ	RoM4w-BΗ+3ͳ{Hy	{z͚U:Rw;_g|[LƵiԺ_~b{j,1s   Im,-TU՜ZG|*Jl5E+$Frt+F8xC(J^P`yx;#TtE3[VmImL+)Q{
eU%kJ[^paq'~VNB=deP   IjciUCTV!Nmyo*m쒀܆h]|wvk8Jiψ<%;%$hB_	=sޥx^/ҨuJ^[)ymbpyU&vV<}   $BrD6''>{%$swоl-4 \-/Xy&fDJK^zv7Xc7?k՞u=.]sa*ٛMimJjt5zd~]~b>p   X6TbRfx"mNAҳ[`3Fv;|+j&sw'y1_1Hǟ]wևܳ{<S)@0S[	{iY5|wvJkirX:Qdpk{վ6$*9Z;wxwKWz   HjcIw*154ȒQpk#lo55A𞀟/3V+ZmYRJL `!#aNbǂ	M;3m}#	%wi큻S+iMj&I):WRKZ'~w4jM|i?.	   @$+	WAB
dyAwpѹ'9>JN:k0;"+$%rE+Ֆ'=;P(uk1PamwPڼIdh0ѶtƄ>|%%0J&^^|YN,+Z{&2Rr]$z56ʐlO   6T[UtȐ{#a%]+Ga%ךH"j+18Ĭ?ܒG)#SgHw.seȗԺh<{(|%wҳ6L$,ѫӢ
Uۮ    /KjbơOj5t|r8џH0ccNmpge9}Rq8cTxNp_mPUU~Cel+_3k9{Wk~b-|v5+;    RjLvh9[MJ"Nw |5%8K^anD;֕Ԗkȵ~?vۗ?	]UuѼNT]dD{6'>sw-]~'ݟ   >Im,W6EQP;nU4	H7}*LD3̥uE*P[Y*-3Z2
.+ZBj*t}8<~b>    NRK=F@P*;,4Bd ygfOjTkw)2(Ac^ :3췻o	!<;-NX,$#T/E­ss   ژ]Uo+RsҵVoȧP5wJ,/](ĬT)bImЎCB
Ir)'yP
,do5nEUp;n;f!'|mWv    "%Tʡ(Ut%^J	ft=σٻ%=wn-\B\th%ݜ]]|,w`]SRBmB}G]X{g   Hjc	W:+ @,&4CJD[|`.'<	T]YT.Ms?rX.˧yRO|k#1s   (6P{%<j>DBTH #͂6<
Ppgs.:Qul{U=\»I|Uu廇q7Sto@Qu.~{㞀qjݗbqxNy9j+   @$ZjYK:\n#W{σ%>(ﮄOɋyJM^,X	1=X(DR[ aۣY"{̞PLER
eu_.#ѫqM2s   $ژUj	
)qCԡyJ+Μԩn7$m}oy`ඪyE.=wь
I;4Qj p߱OQBY'Td
h]tϡg<ZqݵkCXKE\    h6VfFbOa%}wU,P`ƖƮJo$\,E_|'<?WSu&NRr-e?Yl=\[ď|waT1c'_	pZ/[YT!:qM.=F>q   @1$1+RZ	éd_ HWUnvB[2lu[뜯.:2x%jJ wiՠwQjXY':qM՚SxkIu    ژ[Р*_5Uy !*u]7uQɾS)<hWl?-SJx,Wj[ݩ,	cMn2֒fm{*O"a'=w׶og".    4LRs}CT|k_w>t{\&\OZfHۑ ޥERM"QJN^hޘy$J)"A<CF pIm:Xy)E$
[4"z/=HEayETp;;'   0ژMFU7Dmg6X]N3^r	8Z࿲XDU|5%8K^Wlf~:Vb5SjMYԢ]Jz׵+,YxGEKSȞZS{!%Uw   @}$1;^*G9LJЊ3S4I׽`]6w`|ɋJO^$/ɨ=_U<d%s̸LBhѢmy5M"]`k-^Y{֞F=I$ݙ_   0;Im̩*_MwY͇(CZ7#
QZu+tQ
Lv][KF<vkg$2GlYyV?MJk)SJO`?\tY=uکUM	/&w8;@m*ƈW='#|w   @Q$17D{:ZR xD]EƮVDg3}Ɖ^Ǉ)Qa^/ݥ-OjKDHн	Gh]طRހwi%dݽ&,awavu6iOtL~0iO4"KwmEr;2   $1%n
PU;w_cd&d&owjꛕgKb&y yqShO>zlU*L$2.PHMrQI p| y<;X'X.$pkS,e_DnNCXK/g    TDRsf(5_rݶϮ.M4)l:~E
^)!r*jJDEƤyVse2DT_QFw'6A7z'|5M?inVRtSy֞NE   6R[ly3J;2>IAn>N)=/V:~g7͛Sy2_M	Β?wMaׁnƏtϢyV}znpz
ܝZ̢-/ow2Be|k9kfE~An^ehIȞ:Nwy]JL3   `ژKz5*8gk? DLGݴVE	w9w̑ѭ6s<#<sS¼Mϛg'$H~w|tFާwcvTqWWk	6w8g9fguX}   Hjc.oR*#~ow^ftKn7/ku*!0 tq"Э"0'ﮀDɋ*F{+;G*d%=FߣujT3'׭nGN@gP<DMړ8{GEƵS!յq   ژ\FU7mgQU@)I&#ԍ4/}0ݯ
|]IJҸsg7X#8%u{+''}~a#:L
LEs,dqyg<kS7'.='IEM'KO]TSt\\I:Y"'Uu-gm2R&sM;MKnV'zzDk7ѴX   HjcUİF~+ՙ⏔:}wrCl6J	no:hR`>W?\8a3'S$oµHWS"B4 ǵŌiŉC=WwY9^<+γ|Wnm{1"{Xkwi^ԋ>N2;W2]|U&SXL#6Y*-gLRNW^9ILg    T@Rs}3]y3JʛzOؗ胔4k=]9eS }ݱ#iprھוkJ%U^SbUحEbڞ"pDJ22GYdޙgeH}k5Yw= ũ=UsjͺS2qsm˲?_)MFM_hmD?'Z$WIcpO^[Ϋz*=w    $9^K|U& ȡ]A)a&#~&R:3 -"rm<':N?T !c18e *G]ΟD6J*L*I4X6IHt)0HP>㳿<:cYͳJJAuj3g\mAϹE'z_}g`i/=R<I&wdm%#g[ZSI   Im̡pkzk\nm]twd+t(~;O^"sJ0"(&Z&=Ǫ&Y(=#=7ssyV@znp[h|-$ɥ땭Ƅ4{MH2:WߦVu2(%Mtk0mS31ީĬ   HjcRlPiEצD2m
F>#]],q+!n˛=cNUkHSߧJFfn+u'jz3FY;*9̳[du	"cI.tYSܝ3aB<tY?cZXYU6}׽	m%un]<ᓞ   (6VfYk^UڔRsw.I(#bt0#ۜ{wBYru<=idPuWw'y1_i;?J?rw.A"Ŧyֳ
YHPݩER5.CiRB[4!۳,]DW}2IL%kkI{=#w8]olkiz*Aѩ   EIjcjW91km5oGx =}S0Q:~JeٕzkJ9Az
>Rq9|Lh;T.~Ԗ!uk)uWwC>N]rRuA/癿Ɇ#\BY3~EХKs׷]$q__IhEH"{%'ZP$wcN6!鴤gD-S"Y    ARS*e<Hi.-UϽuWoD\"+$)]!X*w PIP͹2T$(%tz_RabVIj8,%CHE9|Ve\˜yZshf%jNZ[$!.î3iwMzn"߁˳?_b?&_Wd;M{Jzƻ(^ni,HbV4E!   X6&6DkBʀ$f}EN@i/ݏrp `Ư{t4'3DMVenmOZ4_L
Ip8JHt<n>9(C
]S<P(c.JyǑ5U)I.&f;e]WyyCBZ[[ܣI;pmߵvޑޑ{a<pSh!F   @$16DmgQ7U$>̮Iow2K/r"^-`WnZ0MN`P]JLhǳ:O~EM1 BTߝ5#jV;e<UPZNVTxnK?~vwjړ8 w6P"ѮEMVd;<oO	]xS)B_`".    tDRSйĬռS'oI?xH
fthyzz/sooNh;JI9RRjBFQj
%/9jJg1-)i!sYa~>̳Eg%D̛>|wAKhb/'CVЖƺ`e"Rr&ICk1kOZLezG)Zqy9i-}WV~"YiE
c   P4ImL)5*_O    IDATH \g&0#qf︳|7wE(E"E|޷jz|a[r_싚g8ΝpI@_sπV?jQ7}
Xb1:
6@\CZm=R2@[jB?[5_{okw>gw/<vVv!&H<vsS-%Ky6?K-</"tU1rIiVR76ضY=u\dN.]7Ͼ   `քSũ^K3E] bm[&*j}Ă-6qwmE)uG0ˬ_p	kwzp}gdIΧ.slY̮騪C.-f*֍k*LZw(V(f9b&#<#`E-cAJպ+clm7^9rɥْvB?q]6    ;FQ,͇:)A1Yqz[|߷]
oJgݦ\\k΅CSF`z<䧙ЖzǾ&#Wg==!CPs_m3|>ZYng=qBߦoYhT9O3	,nJf)ڿ{~<n8G{}3	*/W1I	f7zoDy'3ڵOnkWZ拊W]MY>v;zN0k?   X 6Ruq,vGLUHi#Τ}?bVg=`j7:E}
UZo:[oYԬ8?I};9}q7
:&=gU%),Vgvg߶/Μ> 
msvֳv
YCϵRɋ"(-6C{ZJ9<KjF#?nXݹ>1;WPsڥoɐ[/#VzGŸƛ|z/\aԞ}Ou^8S)5N   jc,YE3|lvexSD3 u3aF	4CU:𩘱(::oȺyj
^?ܳRrX~q#mrig_8WxE^C}.ڝgl$FjgV;k~bh٬ַfik[)7U*c[*]n?Ӽ\BlO\|x,c}W:7&'#[hab{տsVLO$>:u^Ubk*cǝU	hK.n   7ǝ29kRozΰ2Q@q<Tl*}5Qg-jNRDv';ۚӪ
VY*_<fn#ޔ.s(>>nkyq<X`=m\]raPaYxŮ,3ϽE;=|ڝM86HYE鳽㛡	mQ$<͹Fp=zȀx8mzj̈́KM`jmrb̹.~MھIxF6}lVh6ɀբ򽉯VjƬNfp{,Uoq︝i]uxu1ͱ]@->   @K^W{AА½ Y@PƀSxY;7ui
Q'#!2(it8'[+
Q)3½sϛ)kܛXm>5͚~Q[Yx]X5{V5bpW*ngXA֬YD$n@q6n#>U!j,95ih/["|R:pxOs;yOGMG}xFX1l	:nxV>e;sO쇛-Olx5z-"&Ry`mbLM1ly#iJq6    ;Hh9ԘJg4b)ܬ֟{gio66BX[5@oWma3CαU1FD_"Q}m.NǱ=8qH< ȖHel[s?
3QMq :qwnwto.-Yu9p4XCλN0;orȟmVʙ@mmKZN(y;S	UXP.}ZDߤ7Llm?c5{1ק'O{qjƚ&$2N1v|ӾJjhcn;1w97pR?-a[r'w    lPczNR_O#`դBmib@s0?ۢ1li!2_)~38쵝@>[_	up}zٱ 6|ql"aC\eCi5ۉEY4ƽ[ݹe[hg]=Ԯ<1j"ϱ'm&S	[m<[:?Fh.VYx2_m{];)&:a}&|F}y>7kl<翼/;kW~p+=MI\    ]Bmf)o)/GXmjbԛU3P[«N1wNaT u9D,87졢Eqd9Ǧ d9rbb;:ko#4vاhwj55r_K;k\M)L<g΅
F3(ߋgm}q
X	lFV}-.&,!mz
=nh9pͱ<oDO٩    K122̼po+(FEn\g.*l'f/={l"	sr*f)`b:I˵;"WYŠgL2JdKm6mT #ø.{hX8ڱbpy9"$v[GdY"ض?a{[>+>e.ZPM1'꯶I\    Qub!V/elp3Φ 23_}fק޻wM$z7)oqjCPL)ŏK|_m!AjsYwC%D;kt)8?j̶]n&+idC{Qj~L'gC}ŉg~LHQ?\}⚏N޾^s=I\    QBm"d3Yûl}̀Ò6)AZ~Z$U)'/lE1V]yrсL5/+,ݹY= M[h>[U!++e6Txa1?g%ђ۸&LHLrWX
xi+|	|?Fx?#E[   jcg2K Y12`΀lW≁W<}=)YjqJ:?fȷEJSy@Ui	/{*۝SZ1}vVgRz	*T_ξvHeAQy+͞u݅o,1aBmbh><70J3#CrWޙ	 g*    er4b/Ûjݜli>yfж\˪lźwZ7
9"jgdCSo;dp8qO3TLN<.yX8ng5Ǧ{M-!5kγt'BCBجQ,6:Wy˝{^e|\?&ҮV߳-gg]Fav~J)&{fn΋K}nG;q6v|&   BmUQ-vEeˏY5b0|oZ9%|}Y淡:P܊}dgX~L1.c,VvwӾWxY	DQdƉB<K:ULbmJ_ss}f}^\]dYbc?盙ďY^MbZ_Eߢ1ɚ6EI'-qN
fP$.    06zQ`993y{cF>i}.6HQ컣-F>ƾ>_Jfܢ9~m%#3v	x
&jsz왼vgQYӶbe8.cڹ(qegiw9.25B|'hcg'7Y<ԙx;4mʮAg{~Ź휱'6kzޤSiG0DO8    ;/?v#,' .n]HSH}7hYs=ϧ<?to#8 )L,D;k~:d?XS/;c3P ޾uZf|\MI7YOsg^|i65u?~M-}Řء9cm?c   	J}wxo 4w[ 9"ng=?Ŀ퀹b0VIڏs
NPνgvUMsKhg=1Y;knz_r@⾻>vhn;'W~lo,"_p/XJlAoYueL    36 fĭCP+#*HSah oZ7}9>l2<'1           ,f>K)U[       _P     `arBjV      (L     XjRz}.}           %Y-	      '     ,Qwpp}z      %     ,f~Rz].y           Y-	      lP     '#      PP     PjRz=u      j      g҅      Bm     @6^Jǌpqp}z      lP     P7۟      0|     'c?\:       c6     fn6      -j    -٬7f>J)f9}      ]$     [ji)_J      A     r"v~ocl>|K      0Bm     P@,vRO;j{j݄ _g]c       f     LkZhk<߱YSJg}      0Bm     0j}RwJw>Jmݝ7!_pp}      `BBm     0bZ8L)RJV      6     E_qf>5OoK      yj    	\6OOg)skh1~}          2>f>vLgT      0Bm     0&u)gzf~3֬w8f      06     mjmRJMkM|&8x      j    22Wk`[PwRz;=<>h       P     d~]
mVflRJ/z@      @g
     
٬֗)WU6^J~itp}z>      0+    @Y5Ŋm}~w;]5a      Jm     PX~RJק75j}'z      	    lV닔랟Κۚ_\1}m       j    -جSJ)>pf>nhlh*      Bm     %z?mnAn;p\fK)RJ/F\       EBm     E#Z#v[|Xm*t]`H      -j    - jnOompٺ~O)b      6     	m]MȭY*c%~)y4?&֓m       j    yJXl           `F6ޱ҄ٚ           mVfŲҳa6      #     3YbնW<F	      6     j}-!>tqp}z>m      `     n;I)}Uٚ0      -j    lV뽔QJ8r[߬v)      }Bm     Pj<nb.t!˃K       "     !ً[^濯      @6     !պhk                    @1            (E            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b          ℺  IDAT   (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            2RJhqH    IENDB`window.env = {
  "BACKEND_URL": "https://api.labxpert.ephi.gov.et",
  "UPDATE_URL": "https://relay.labxpert.ephi.gov.et",
  "SERVER_PORT": "4411",
  "REACT_APP_TITLE": "LabXpert Relay",
  "BRAND": "{\"publisher\":\"MedX International Ltd\",\"name\":\"LabXpert Relay\",\"colors\":{\"primary\":\"#d05286\",\"secondary\":\"#572345\"},\"logo\":\"\",\"links\":{\"helpcenter\":\"https://labxpertsurveillance.tawk.help/\",\"support\":\"https://tawk.to/chat/62de9ce937898912e95f8b2a/1g8qp9std?pop=1\",\"website\":\"https://medx.international\"}}"
};icns ic07   PNG

   IHDR         >a  IDATx&&,"AQyUEF(
UV[kjQimkmz-xUh1h&X%,c9dݙ$>J(MQ=@  
.-	Ā@PT{.9	J@`0<#l+t#d	Z(MQX`,ȭ/B 7*0āMBZ MQ #m	
p5 0,,ՍHP`4EˀGe
97om@
#s[xx\7B3Ai:+p_-=-!y)x|5Yt</(:S@ӍrL&4E8L;frH#
WL,	1YLhF #@XFR8LaoRAp4A2Xe0<F8D!k(j?0/$p4Euo *E^G#)l&c3MQm٥3G#I~wRd;_a3iz309aD,l&670(r fiH@ST/E$ENؤ5Eb	{<	\	?>Cm{?-]0w	.&i@4E6x]vu޲hzhK($I'&Cp4b2͠)xh\n7wMwe>t,egXEK !>xh#N^G#	Hy~	&Giy$[6<N)to5OOS6( <L34MMI8ub-ػ}7vr6%J9V/RQltyHM rh	tݓ)yjHJ|^6܈eZ%UI'f%ؖF.{ْh+Y]iwMѹ}׎[[ǤAvw'~ɇ& WY;#S^Q_#_:27R9j%Jp lIdJ:Pںhնɏ M]҇	 %E6ȒD~$el	![]pZTݍYȂpE᩷gpثqJWgԊ ǌY݀,ˢ.Fs??=~/nXo?n^G4G2pM$2)j	0VOï2Td`.vuuqȐDpСUإϠC4 w&T]jV'C7*e^Υ#-{_/;՘udH"cp؞-۠ VBWgPe%FkچHdf4a;onVd2w7(LTSjɁ`bϷ1%oKB)1+AyH4BSTelX$Xt:B_WGfjUSTA#$w!ЍYr98r$ \ؖ":}iD㆑C>\MmkբX0c.g.n^̨HBJ+YMJ%IX'1Mu[3rz:K&$ǆ$d"I,b{'Op*\9}h#䒉ź@!2П%藇yjC}fir*pso zz!#ȵp Gz򠟦2iH#^eM[Bc6-_~ÑC9yryZxɇ$&+y`'g!^/z<I&̙O}9tS	
OHk%_V?֬'zzGs5НU}~;7ltÍ~(r;Ƭ_YOҐHyh3g%Lq^ʃa熭|-)"#L,iB<Ju$vn؊ٜs=IJ wD	"nP:BD.ҫ <J[|*w~ʄ))ۓ_I|7O.+ Xgfq&=d?)
4lƢ`&(Pʣp'A!6jl	+E񒆋\ >\B8dgnl=uV&-[EPTz&bVEzI
W軔.Rk
E8yo%IJb{	]&4dm
\=iHw +nr
!8/֭amNhLAA8J.ҫ (\@!ؔV]sh<C^XPC.ҫ"yzoq+{'p:_R;\5~$1)ld#;6l%ϪHC"J+\C_U1^&<gpJvpxȳJҐHoytD	!QKuk18q߻_ztL^Н&y4\<,3ݕ|i,jƖANצ{~3.1ƌm|0WE$ 1`' ?c[͖ANwL[8KF&o	$0HC"09MnCO|ؐKuk8l8$IhLᗳm
q-h߭#yY7BIҐh:rl;R]fQVvqߟx;BȖr1f`h*rLxՁ\:hj6'r:!	}!Nsz79FH4n9		AOTrj:dЯm!G4Bqہ}HWrJ3kF3Ԟom2tpr FH4B7B"EWNo2;*ҹjµK<咫#I9X7BBr	$J:ft;W{YH$2a]rRo%x~Kv$1ve}Ɂ]2 pXNLaVl5;n=]@#d@"sశ;YQk֓Mײv'ةr90Idm	vV0h?icv];2$!/{SQf׭"b:,;h^ҍPIdg&` @Bw37VvI4y?쏦Rw8QRZ1dA",Mu܊3/&Ne<4vmNS	!CՍV i8$a4TV;U~G'wfeYd+21ML#KX80X0/V\I3]q,zlò,XN$!N`aZL[XXÚfdjnȖD|fdbWYu؛oUo>[XEco+h&G#]
]8wa;	L
eZ|zvmƀ()r6+?FqfU2MFjMH2ݝ3Z1^ȶd}|(y8
*bgt#D3؅Mjzcnkuٟfꤟ^4MN;Vǎ[Qxfip4ɀ^ᢧ\IILB0&-eYld#ք0|2'|gXDmd)c<űm${У_Nwac9TYMFh:$c?t6XQg`%6HfDS>j"'.׍l cp4R"'X(l	pENH~/Qd9Lfh?nRLh$=(jx Dx)cu#t8(ă<`0Ћlq:dFA` (߁a29FRA`> AљXt#"9)m߀V]LA`>0HIa`n> d 
@d3GLSQ_|#Ax	ܖ Ӎ1LP@4E<u#!(0r	`8熏
p-z@вXbi}Q-A@k
[-0O)pDS2v:MaH s7t#tBBi ڑ[`!P7Bմ@s0 

 .뀕
`nLZ89JS	t:@9\[G
 ;jew#$:ʹ    IENDB`ic08  %PNG

   IHDR         \rf  %cIDATx330TUB$5b59ͩI.wbŒ^ob:v FD	مYvOqe|H$I$I$I$I$I$I$I$I$I$I$I$I$Idq1BZ@/tx p7Y R@8 }`7Ȅ3$[	iA z
a O-@lz>e& c@@`-&V ˁeư1,I YFHViT8;X, H
R	iANf S8[+zDBZL2^#H%҂*0*p6Pt8a=C*)T!-ACˁH1$(.GO UHzskTxxx.GڐF EH B*F!`)o!-A*r /?R~R 7'#[a=b"@:b!-AӁ;୰1@B!-Aw'!Y-A|s8Hv`/7FJ VHvnT#QQXđ>C "p($'<#ҧҧBZp8;HN6GH%i*FfROz$ET<B$R*B!PT2]a=	*PH<
LA=ರDT{+'zJR!BZ"I|yx,KP !- 
$08-ϋcp8i$|x,	*9:W@~8PH_?T$)?*p+FaBZxI*	?+q	i\D$3>x !- BJ03ώcq@BZp(6p4TZ݁>h<S	"IQ\߈c1i@o$j>h<R	z!I_c!
i<($c |9xQ C_cqlDFBZ'&0I:ഀl4;MDHc$kLOG46b!-NF/pl6XŅ 
I!@Z4;H\\ũXXH <$	|wEXTH"@$ɞTഀl4cA*҂l`doX4b1*҂K|$=>h<(XϹ*O5=(X7b!!- j!?s\6d=.pRȪv,F cq,B"BZP^c1#/?j(cOĺVҲo?utWj;Atl57Xcb{`A?1Ȗu17]9ޑ	WX݅ 2xlb!-8xpa1BQUf)ۛ5YN6E**rg8S4T7euvi3MsN:JiA0:'r83>x<뗬)T>΄<iP}@jٖkƂT`R(@*,{}O]9 k7! Ƹ2VTy<v,( ЁT:PHګ|BQ<.q'O~`_Ve9t<řc8$XAaQ|XD aQfLSđ0LSqYHGSr=vX8&?
,lQW֏;53.;!RaU;K{P}X܉t҂+@,R]*cOVL*~5 cP-Tebq>X2S? cavz
qi'p+1h0f~;*<xLP) <0C~KgN8dRVG|
4N#\J l&h<2R)㱸&0I:a<ڈAZt2YD5xGrXvi`q.W>Q.
5
86;w7PWLAQl]/6SF*e҂`6pEopVӹdٸ|-T4	~fTJBb}v76 x4g2p6ٝRQ]*}ǻޕJUx;IIFNNL 9v@`uݻPjٿcĤQT\@_V+BZrP(HM]'ʡ[ؽKQTSQ8z0x+ܔ76s"02P( M!x=\˹{SuU\R3	%6"BZRS((P8~̺c4	+u `3(1w@E:"]{p%K\B!X=<<t?(1
iH
\1>SĮ)5\Xw_ĆB!-ؗR(/6estGrϬ1fq1\Oo3$gP5p%P"!-XA].|;ƫq]X[WGP-\XA401CZQ(3TVB(
_n{gtUPj;Q>XI,6V̤DJl)7^/Ռtsyxz*殦DJ  Al,	+ڳ<OT	3<pzpܨXQ榇єBi\
{*OH=N\OuVLbs*p%Pd!-(Kݟ:uu>B:(w.Owk68%!-Pd
7зauCǍ`_<#8z.`ن&Rd
6mǘ՝~9Ko3Wx3;i4!LBZP  wҥRǥqbpBZPk,p4`&5buBiT<ٞ !P]F&&@)Ldӊu؁RqEzaWs8Bq_;hJ1	`BU.bg[s8WBZbqQ$!-l^Z/Ve&|b
7y3Xe1f40ÁEP<3 I'Ӭ_+ۼj#-{)~j`N5L08"Q(8^kJ 8c"kġBLǁ0mY<
Q#8{,_ p
ؔmġ҂.@8@Oq.6ވ=ɤ䫿ڕ+k&peHP>`EP'`6V^B>U:jh}v7wEPSqwg'bV|Ԋ*.KUG p"ٝ8T@@!-Aq+ءogF:TWLd'(#MiA
Pz?79t6~|hn
U!hjEN"
P@
 nՂзQb7rW{hNwS4	6g)BPേ_#,3;/.=h՝j&0@JXيIG
7
17hnS.T?qݤڒ)j?xFTQ)fTQHp#DWzrؾ~xwxї1M#Ux;IJ,	i3GI
҂5FyWhnG)>ghA\@?&afXJ҂u@0C 
<mwO{?#y RQ^=s=n*{-,F (BaR=9V)Cny=_G{tQ<\\3*SL<
5(f(]PiC/paɕމQdo6ŠB .
Qe1kS,k10zcT6==T)1y4Z/]n){w6>Y G)tr@k *y
iAAjk9@1'rrQ״=zsX*^$L,D3>op?½,&2c"{^6,.pb`Ƹ"'8K[ 
t9>ذ4J{tSj;1H2IDt%O
WM;4Mt2[~}imn=q
z+anj=FSɓ@Ԓ7«_?dG׿t-TN(WC-le}v7!'t'G8f(|U)ڣRLz*5[MHэ<_CY~yFf;i(fTōtfa }FW"uHwnHW=g,%VqL#Vg"5H2RY9^JaъOՒ'"d`ܨHe`2;r{><_5R^TNeLֳ>U'SڭJ^}C]=dnj=3;Hyr?RtUI_0x5]HB*|h	/er2l#Ry_Pkg
i^Hb{n?RȟT3=tx{V^H&n$&O.B\p $ב6HyK'kCuLc,NoD*P<_auWj83*B3Z>C*I!>VTqw5Yk;S|G{SHB\.KE:T6=<\z5̸L+n"!"NxGC:nۖ=n/~`\rH<Ou#:
P+2x+	81tWZӮ:Kw>D\o7_vAH6Mm`]vQ[׉ߘ|4G5;Uiܾv'T*rVTiHb)벻h!csϬ|4>O.gE(
I Ng۩pӫSjgD2m)EQ!n{_ϑ1y4\v; <))G8*@W7F ArrF)_n\rh~*zM$GȗBaPB~I,aCv71z}?#%/WM*
01*
/e>ϩ08R*7_JEPӏc|p2K#P:pQMT e{ ,afZ㨆>|75borR2hpQTiU~\(TF3$4IcڏEMZ騆>/
>h#pQ(Tz!^T"X9˕]Ǘ?%qu3sIQaS DLQ!Nǧx4I3Te{8vXLC:d Ƚ@pjڍJ#%lH	!qYߟr8sz )BVR!&43[ym9q#Ts/&UUK].LT*

PTAT"d18Ruݺ'~ԳO#z٨J)n)`pc}QTF$>ڳ?sNG=_@XB
؊HW=Ng2[ymѹ[n}'@G;3 ;-H@a=ApAj%/%W3/ᮮ{AX_OzpzB);8X]m7y8=ۯcȸXR8;Bq,@Շy$<Bc5Ϝ-cЈr@Eif瓫x;pWWqh#{@=> Gr8 NI.ΟK؜m_:$z	E0I8R
aTTNab(O'>HR>z"qQ<o jg'8`ZK1tX#VJpx"Q(A>`Kn-AXn@QaШa8z`3EP\pj䝴3)sv0tB #BqCG)V3E8uL-ٖüH(G@lRE^$rLS*[?܂i!2-0!i ۀ)""
xtnL7lb%4Բbu]zӇC#9H	/vLTb9亮`bR="V'8SB-6`s]/v)mKؚku~8f`1EPda=basu0y+H4Mgmz"S(ǁ,6VTaef'XӸm?6mXU\xP(PUm%
>`w]~#XQ^ݱ&J@tƪd16rr5I3lZ[6Wmj=#BbSnTde,lĚlL*j:ac;(	4 6 B`kx4.vZ6c/Bla=DJA 93+%efeoǍg]%khB.JTJ(|~?0&U5Q<XI,ׄ]%Z7QU!cG AG0Y<C.fG(!``#&iQVgwXb){V.O~+=i،	S(l&CrKcNj&ב6s8K+ױar9lJLzLl$if)F+-eMfNoww_q#Q\rɤ39;G(5XF4"Ki2tF>]Ⱦ]MÁx63XH(AXpMiJ-efy%A%y-+/mf2P(w~3I)4Zx$u]TMq-<?(}6eP&a=A 6HP*2[ym4L^}]]l݅Ma=B(S@qbK^Hf^j#9ذ,ʍg^y(m&ާT( XX ö\3$W=4fϧ #&BQUaփҸm}JEx08՛QE!LLg>fNr-I3>`.ccԥ30r9A4y2S [mF38`y.HGn|
kZ-XN.:JcϿ8.z-}<X.)?Tů-dSǠTkٛXY]#:<,lKv&&a`0
ZRaLgqa{l+vJ,n>DD1>bjwH)^H"݉TL={YB=0h3xHH`Q)ରCQ@x)IXWvl5\b%MFRid/4)cp]|ؚ籰st 3`9>&[y!63Tb&\n=lgkUt0ǌϿb1I3Kڍ.+n&x.=H嵿)#z8bW.+-mXP8+G>X@4$,('z*FcY[Į-9u,*7Kl,?z),@:~
mL?2䘛Z+5,R[қ2|v3/bQwc*ǌg
 Nxy&X	ZZgjj1/ƂH#!xXL$kVJ,GBXLRG	,FbM/dˁz$(XPX$H5HRh<*d?Y༰YEXX4>^t$~n'0H< Sh<F c!H.bxHu-6bx,_#IֳH6b#x@!Iֱ8)G>FTl&>\Ixa=Qh<#@qSzd%6bSxlW\ xؔEu<I*&`FX,Tl.
s:$v 'JlN؞"pI*pRXT">3tT|+zd x@
F'#8Dt	G
ҰiaT(U`p"I~ #9Hp!-8x$a=pxlsP$})a=S xl_txN*Jc?T#I
|QX
҂ǁH,.T
|Ge{zdHPBZp"0#QT*\4o&*eGT8	LAr둕H%҂
pp	[?)tX!-nHv n둽H!>WHfL`6pcXE
iALCw[a=iAہ㑬}`nXHGD [H
df` :n1E -9h]`&B*,0nXHyHE҂GWݑJa0لT0TT!-X\\LR!L}A #HE#J"9( \\CjSA*>Tr!-_f=	xxsXdJJ UHV' ggT9I!@0!-()xgK `.:G!,#q	T`"{,6$KH҂*0 F# +`}Xd,I JH
04` Ni5 [ l zD!-A(7t:8THIh> a=$I$I$I$I$I$I$I$I$I$I$I$I$I$ITfD    IENDB`ic09  QPNG

   IHDR         x  QhIDATx	Uus٘˾a@"qѫjOjVjeiZYZSnYfn>V(2& e{^z2a=w}>AD^7@zHZV?҈7/zA@/j^@5PT1 Fh;N`;l6Mzu`҈&za`8.0C(ũxXVX؎ "9t=cʋ2`9Xkhi1HI^ L&,X,KZw#"= "ݒt Ӂz`ғ|xxxxx2tJӁY,`
P$>X<<<ҸyGySI
 H!kǁҸ?I׫fs@)fr11੆ƭ2t=H p<p0P#-DʐA$]
F6R2jW-)t80 xxq3"% RӁ@/D:o';ᆖ͈HH^088Ed -;)"tp08HlnnhilGHDLgnXB$|gF"b)I׫ D	^8c]HK׀ۀ->" R.6Q-HI^-p``)nK 54nC@D
@#Rz6 mhilF$`$] KӁJDJ_+p'p𧆖F D,z0$p R~2#W'ZA$Og"O  54fH%]."F>p`CKc2H,pJP "khi t=\D|q->"= C>	ɀ, 9`qCKH0짤0s@iiv
`eCK#" W|FDrm7--)D I׳PD$W ?ihiL#E.Hn f "Ap)xCK#"e餤"R(@𩆖5tA$]/|ED
j-툼HL4DX\"o &8H ?>Ҹ70pDح>444A7& Rnhi\>){I3H|GʚAZN"R|E-ket=Y DDf#Z}$]r74nFʊAFp࿁ш*<цF<HYH^<""TT&u۔jN#% %/z.pp8""oi-ˑft=
|臈Hl.~#%FJR*/_p
0 {)܁)9Is3DTVd$]  754HIt=}S	؉xMRl%]	 "l`R"^XSyRl%]o,k( "['Ret=ɯ-->Rtl$].nz!"`O"^T)*I_ B<``"^hS9)I׫n""3@=0={)ռ)
6R7x8386{)՜B
M~L@Dp $uO4! -zG "RIF0 %]}  6<-H᱑t= c HqxݳMfHAI|`#"R,h )Ռ)I3u倅H3O"^T)I׳ ""e0,{)՜Eg#K^p>"" `l"^w_S9FtS`!""o"01)՜Fc#I^)p""c<05)՜Fa#H^H""R~ %u4HH%]/
$)_c{Ri$l$nDDD cR$ol$o FDDa0&uS9䅍E,[7J 񺇚RY$l$璮gkK @D7Mf)ɩy;&{)Ռ䎍LzFDDމRxRHnXH.nlDD,:`aܰH-@Ch$'l%]/< 
'$u5#=FzTIkJ5c#=&z5ɈHO$ulJ5Ez녁[6H$uw7~t=\@m"^HSG엤k ɥz`k"^\S>_G lDD$,:8dH%]o 8:)ռ閤Uc|O~єjnEF,z6#8DD$(щxM,%6%IcK	={)ՌttADD
c.NK6 psF"f#t0p'0)4UDgM4l%]}ADD
p:{)Ռ=cO!""b`>,m%]oAޑ1##"=
#fOHm[J4 SN|"!D6ED6EFqJ4]HTS53ț} )N8Gn,}?cfO^bWj'"5qbbر@);MțJA:eQ39S>qةsټu,_t G'bC	!=HJoJ5FU!b}W}~C0ӏMm,b2iDͅXG26oTi47 fs[Rͭȿ7e`i#ƏbI˲s"W4\ϐakU481Pv5%ut〯i/~f|-zɡADvK&'uMM旑F~F:($Q?w}?H#R"8	8XtF84YpX"^w{SylKtɌce|2Nʹ%lߜB9=:vC煌.F&uw6ty5Aݟ:A#Ur)sٱu;+@SCHacӔހtx`YSy	t@/K	9t11LG{"*fBpl,ʊД@F s[Rͻ)sW_"]6ȃ"cr_4R4Ţz_H`S撮.z ]99Pӻ'ŞhY*#R,39>:J8X,Io@%)ռ2fSƒWE:^âϾP8DOqBSizf1m*+	LГ*0/ve)N)SIc+Sn9i9ͣcvH=旖ufDH7E'3Ȫ!l,;ٜݍtK/"{)L9(_	cHxx=4n*|lFX̎,NDɥQvod\SlPlh[,bg.:^C.َÁs6e鳋iۊHM0!ע&;#d&u778~C@e1o2nzBTX=#8Rm"Z1dO)3IT#6]39ȧ^̚w$tW/f	c,DC81׳rp"^wKSy7eĦ$]}"'1jL:t*#'߿H%n856	  %ͫ~ xMfʅEy|o%Hӎ:C oϢX=C^iUs2t=8 /U՜~9!TQ]ɬWl6H͑1#dl26/v,_,`\"^w[S9K('LBC~|򿯢>R_wǦ2-4[H882aS!mڻf2#3#Y*^_dDQh6dw!S7)q6e X9)(4
fxNaMdYDWǡQ(D;6Vd ="IlJ5S,J\Az̐a*۱{̭_vbLva(\
G}H)aIc/ G#=X3>z.Օ~C0{ޑ{uWHWM	a^4AP,/tEzL%u6)Um$pc*k?\v>NA3"D%M1Q =}8JEJ|DzLm8X']p:u:3Юz&8(&!l*LQQI3(5X>a0m"_;L?z"ofZxcm*(6H;F)AI3HJ2iGͤ9p54=g,"Qb^,0,jM&ٝHxMfcQ"=WZ1c9+yBVLgݗbWeE8E	(1I3jt ]9pTz(D˓gQb,Jtx$'zTTTWo~⇈ĢHy0a&sDx4RQiHx,JE	I>8HNTTRJ1$Ns*eČ\t=bQZ ' 9SYSE)9:cRZ,"#IFPc	!9)!%"zpUUR*+kk/%ZCJC؁TE!9eHDX	)HNŪb2cGq,_?
)nӛc{Sl:F(H8!˶)Ǎ⊆9c1 bNdRe"X$IףXHN`\Ī*Ku
)5VcrHh$raɹq pPH3a|+whvrvvXE$0/he!1GDFsjt&H;z(r\/"9+.?EUm5RjAA$zQ,XcUw}1G5Ϣ4ZɳWE(n'ɳAP.W8Smɯ9*2yщT0Y'Cɛai1"t=\M=M&A&r>Gn,5}z!۪Aԇaa"yvalEF}?cq|o2>Ƈ06Vd,W!)~Aj8b0ZN:tlFzVxѱ@̄!|"eQXݞ7Fxe}~qg*9+6!H#t!t&PfaQpbIH`bh bhU#oO#R,L࿐@޾yg3^=˲	c8!2qww yo3"i9HEsU,M@g0鬽~1s`!رey_p4jzBޚ&06~V5v$0xEƢ$]0	Lj6Ϙ?
}
8.206uHK`Eqđl~u{e7}ʚ*,M#Do߆
8"bQ$> JmF6Eg|[mʝTZ"[t="aQ<3@غ]{;pN=lY81᱄&n	@E8!ڻkBϼ>r4Ю朊w =O@gHX9@	lX?mq5`ʅ4&~+?ӓX _qyq896p-)ÁC)!	XHAX߼\x&HR69kCrc)8"`Q#cͲHϨSˬyGR;ZCrgsf7RPNN^΢ ch@zƜJJ	3?6wGcc!9)(#(po`ڴ훷!=c촉TTS*ٵ]Qh/{{4;VN(`I'#%ɲ/-Hϰ1SS,GM"M"焤UP,
L`Rp_ZaJf~l2s£ِى
Ea;0HY2ԗb5}[݁$B(PI׳j
:ڑQl,#.1Q$@
	IQ,
$E
ҶM[ٸfC|bRmEX;CC.6~;HS,
׉$?&g޾b:}Xǵ{#ZN)Xp"ʢp.FzƦu)t6EFqZt&oM&g(@(zHA[R2i쐃쟵WRj(G3#gu&	4S`,
Q@)hmd}Zd;ҼxjӗEzFqpl[ٖ݃0dQE
^6eFϲػk1GD85:*F
L,>R Y9QHQ@3֊qFl
F`aӜق9I׋P`,
d` R^޾{y)$c~,3̪E
S;֤SHш)0(B ݍ޾BwEpJ4A	!k}f{vh`.ƢEFx n8+6aXٌ(0$zQ`&RT?<H<r}l~m#AϢX=eȲ"):IE(,Ӂjl۸\t޶׷p0/2	!a}v'۳{X ~HY{v&(}
ΊTg(eH:bQXG~4m{[w;G"zY5HqɐfhN(I#E)i+K3V-W} IDp6ٽHњtJ
E E{EέWѺ{/Ǫdal9C0HjJo@ZF(3ſ;7.-OȢiy%)j8aQ8f!Em<ȿd2izv166FsbdD߁t=9)z7dYo,^}ȧ~vcӘB,XIףXAZW2lۯzbɡ,MUٝ@JB?`QR,A]6/~|1G'p\dalt,N# XCOmVU#?5e]$HiwrHI XiHhoxr{.;<q4z
,IoO#%`Q %џ=@۞VɆqE,~y!jEK)=c-RrJE,tA lݰ[ş~;#Y|hװqNt-lb[v/Rrj 9o2`fRHs7oA&!iBJsd
dUᑧ(UnꅟL:CLc	
BJ[Kf+gv"%@IHiW?e[?$?ܷرu;0		ԚR|UH	D@JV˒Wyg~lJA6~_d5azxG`!aef+eRHID,t=,?#P־+~E6%*LIx}%>RF%]/F5
"%U~Г:ypg0eHyYkRl `1q8>w~6f3'ޱO?Y\0Hl,dy)!Xcys$ū>~XC>T0ESgA뼞ى!X eog#e2~y-m#F:9.2ESjoF& Ic#кg/4{*jm|/mȐkYac"cRX&M)LcQHYy{9c8r楧.:m"G3~϶Fh >N6nS04|fټn:9;VH7"JFNo N@3>>M7m\}:^~%bVd$F`cY5
J 3)Ksۗ~@bTQó=?#;n'j('D3܎#W<ڶ)[#	EpF e[?%m{Zn[uN_Ύ3܎#Xn$ nY';q4zYWYt`1;2#4?lHN@,3)k4?;Z6~ _p	+ zY1Ψ,"e,R $]}>DZjVlfɕ]{ ݑ&88-:V%"o|ZwCd]x77`XD?gQ3q'-{~	ذj£ F[{x',a?5[)t^)6ZG>ĭ
ΌČp,"o!˃mK3]"  Ui7nW?Oh :Y"o@_~!ynIb3?7ڸ|9QL`y+k2)m_ț ',1 7fۯ!]p[ɇVg>4A;xm)Y|D `mݏL:CgoY8N0.ԟEzY5,>VDB?`OyGϓ>gO.^F>ѱ̋L$jD:Jz"opF_D=9cgy3{w+w?Coyщՙm<ٶwЇ X7"o#}WZ^S?w5>0>4+`U#;Vok"; `"vn]Ş+?塛.kȇ96:yDp2׺]vD:7pF/D:a|C_/{|cU2/:V"e@j	C0jO<'ё X͒tAF"]acs\t<'D&A+^lɶfD*z<sȳ
ϪDYUtL[_&HU #3@2)4c#U[ۺv?H7 C9b93H[kjgg
D߮DYt[_b[v/"y!L]1V?=/zf'"0C0" be3 HWmKXَHr?Dɳj+dZՈtW;m}VDzPh'D@8=~V"N{[ВފHg"%]		v2ۺDJCDdp"wpoV!R*<B؈tn{Z_vDJH	NrWlB8DrpX0,"ݵ)Z_b{v/"!|DrX D6k]R R,c8b	3є#m32"WaycOG$36 ~eEY=V%"Aۖc"K9 zYQΈM@v׺u4"҄LoSHwn֥ʶ!O9z#1b~l2*D煎m,C@+"66Dj6<Ҷ;^G@|!|.1p;HwMlA|"Z}`'"]`0̍ "]Z~d R` >ytH8骝~my%|0>"]',NJ2;4Y^Ǐ<+MCr]#f 	E0#	ÜZ`6<2?C9<.FOχiu6DAH=Ա|8r0_83l~x" Xc"o#lNN҄xc-۳䜁K|1C²mDV`-8[UtF}mKxm9i?KE+c\pͥ\|eTL9b:>w 8c#"oazxtlGZ9|p'?1#茓?x&˞ob#6 `lFMkCб;.fsv7fYǜ}2WqCǌl}"6 `lD*M1=~jkѶtrw/.8E~q>a"ouxM._6=|0@.ҟ1iӸD6 `vՈS("o煎<޾%ל)<S.<''q9Yt"l" 3fNx"oe]/?mZ!-ײq!zJ(}p4m2"Y`RcqBd<"ofu&ŭ{gEz3>7|8@raQBDn=  44:E?
7L*l]L*\ĢۗSӧ\:>p"khi	EpV#em݋aN{[D
:6tz9d,&ל|P8!8c#0ՙmm);m1#O?}?Օӈuxϑ8gRfGתD2dycL\U]y1N:cA8墳x'X5l" iARC#=~;wm+kcwyCP"(|B1Hj! Y	Aʆ072Zm/+Fَ=P$L!2g:ӏs?f:`R6ƅ3H[x}5Z.t
>O<O۞V"8>*R6p";V~ٺgW!KM9/{#1B NxiHy	E@ZUl"mEf#+[ɵP$Y|UؗBv{`_hhi$(Z+p|d{3w}Vrm!\~W8IlǦŪ*XEHYr_0;F._-aM:Ecuʋ̙?oV"ea9_Ϯb3)O͙-ܼ9֤SZ0pU5'b%gcA!X@AJHlR^2dy}/%OPǅ_$ǹ| .^, Y1,GJ 1v?۸Eо,>dYG/<+\e[,l1HIkihiC0	)9AǪ6l{Vrw/bs(%Ωg,a)R^"`{)Ij>HytJ~w1;ڸ	[<~üC^DJ)}vl{rͲ-N<og\zN8Df$H,۪`)}k)n<-ZeMx9y8̲-N:t$bfuHIPsoz$@h)b`]QX"W>]Y).XЅ%J$¤!'sK?߮He93g6ҸKpa#L{iS?|6&4.`#ufː1I-ƕ5%Wta#j3N[^Ϥ4AC?E
&"cJaiL[rX@rm2z?uFGRB&"S[G	7 @8]Ơ!iVƎ>~<O؄b @"/21P4EȯF*s?at?Bg?8HCM8l"wjHc\9m%l,csw/vHL9iM+"6QNigK>V(S?|qWYŹ#a{	Hr(6}ݦ}<S0P&~y罗G !a$['"W3-H<*ވ1#yB"o!a+n$sF3DWbs+6Ҡ!3~,B+,&$lBZ'"iܛ_sŗ	0/wHrznB&\!bD>n.as p}y{mA"B&\)G:ciFBSLϭ)RFW=m#=sgcYIO"68DHdL{ry C|+1	H%N9CDNX@؄{Y`!-$qHtV2!GL༿swZr"ME"c3Q$-Cə/\ࡃ;g!3i!|`#h9	&Ǭ|N`asyHL~Ɍ@'	K؄r`/	qg,nkʻ=NÐ:b'D"XD؄{%	$Fڃo@©DL09#C;ypz	#Ѵ`#78]e,+n`Cs)H$s* 0	ǁjG9cp1@;sKY">XτI1~ҡH蕁	!r}o	-#Hxha-kț2a5iH9-'N:`#!d^a"fEaO͝e(m`	Ew'Л!lk6 t=/,2vWÆ 1]'c6ZMHلr`J;*2s
kx$) 1=$vR6!^a(~v]ܑ[ʪRhim蓎EBk{EB&f 	{82mܕ[ QwnzBp[ CBc5V+2W\.lH3e2JyMW f"r=8;Nn-auiQk(KHuL|4--Hq}	!d``ii+w喱?s,GcԸ10		9DBc=)`~S6dǑhimHr6!^X{R[ۃN喰F߹#',9hp ;ǲmAj J+LQKeft7RG$ށ&la!#u7jeՂT_֔_ɓT04wf4GBc0 J=HтTז ôb6,J/.Jwe[H(^RW#HJ/f_3l6,_}7܆Q#>jRwn"&:VKeA)r_~
i*C?E>ݐC=nRw/Kp} !u5˕ܚ[_O3떦,1!uw{a-H݌!}Wlr|6x/CUpq}o0"}e
ܗ_3 VwG]r_ޘ1!6s`l ۲KT>.<7)0H/>$ԍ~Qb=5H]
O72=nS@^!'_{oFTFzf̄Hݤǉq}
ALpsYXDAzR0w&vCQ#^Ndy{/Ur{v)[*?+>UV>ykG@"L#l"td@YX[+DqV5Emx%pb	ycG@bd8&=X\LA\,1wr_]ƞ;:b2৮E6ѵXH`me7wdҁNj
,/qhԂ3DMD 7!RGE*-gf.EΔ{w_P߱,,BM(h{H#Rܓ{ŭdTfˎ!86-ȀKD{Y ;#N~-Mqychfmc;62`~^f} 3&܊y5Mk[?!#2 8s}o70
Y	rgnK0$<J\l۰DMc"5WB1Vwpgn)+Hxm\>̟8IPP.+Ei+QL9<_C;O|亳4 0
Rs34 ("5U0eŮ;rKYUځA$gj:[4 
}q f#57eByw喱78Dצ5ik<y#chdrJbMp} efrD#˛23y, їovQuwt!5 ׸ lb`R3YSQ:-5]Hc1W~򫼼z#;Ӆ<YMq} &" KJ[+Ai\6n~ch$;1w]߫@lϳ,&$oJȯbna=e ~̏.lAEׁNf4]T])(ܚ[K=HY0i񱯐^Fp`^&j*4ƴT]wP`2f.##k|¯1c}&<`ȦgoeHT)q~%O6`)KLOWsڽuRu*MZ܍TUTR$6Wpkn>DǞWX4E߾4(ʤI+Ze=0,(mbN~-SFd̃si<N=˶|6ǌ+ US>nMcA74S.ڛ\EDn;Hl{Z`R5{DAi%l*G^xjH-XN|yA%@whd6opR5{n¬Bō<[IwP@neLN*
auf~l48xOHUtyLunn90WTq%^h:-@*.%cHU:`d}esDvoYO18:0~]߹&`<O!UAX	[|r/5EDje}\+qaβmHU<EphL$c%`Z&PoM+Y_ރALv[ΜQ#/mb-3~ q}oM¦ * ˻=NDZjrR]@=mX;4&ʤI#}V4Nj0V/ R/l'ם儩SpZ#b4/\뢉84T&Mǐ~P{iw	/[͚E+9qF@u/9э7S4ġ	%cIH9؜2`0,`f>EgG$lns3d;cb ڼ?cgˀ^&ЄRIˀ/ '9SAG`SKyS:7Q&@$
yL''NBKkgX]{&dӼ?B,ktRK;N-aui'HU* ܿ=ZZ9)/I94T&M2x,Cd18-م5t""Q^}	6IeYTS>k~N!Gdp{yCKed,,`!3%Nk=jɚ"kXRBA$"KIgBˠVeݒy쎙H^94T&!KZ9e!TÖJ+^@cHzO/wOaԸ1TÜ[aZONe43!K<\Dzjg`XXĜZrH93ēu1XE_%n&vv#{49!Ig nS#pnS(m`iTb/`ߎݜ|֩j/-~9>36M\׺*i%4cO(W^p)֦گ;rJe$cHW2L+`ʈ4<3c.#c8c,8W ^'[?Rd,4yNn=!Vo䙞_N"ͫ\*ٵi;'ѩ2쯟YO! _r}98k2uXbp:c!vpb=<[ j:ŏ=O$6qo&~u8k+wNerIqH09Nm=?T&,lDyL'˰9fd,]~bAzlIk82B2X|hAzh*1d?{7W)WXbΠ!}Ӿs6nAz":Rd,a"=v qJX.Wٺa3Owx~c:;%A%@z{݌!ySXb^ HΔcҔ	9O?[	[ֽBStyCmG	H`ș"}8$H r}o=-2d,UB LG=%y[R4XbpDD$u}-NDD$ls}/X*H/DD$]{1Go!""aH8H2idDD~{WRIp>p(""RkOׅI*.$cO{>'gLzo2X\ ""\<lZ3CH8H2i`p&""RK\AA-Id,$p
p<""Rsp}TE*.'cG60DDR\@A&I瓱c'1H5l>jRt&K."""|HU9Hե2Xb9pЊEǑZyPBDDz=RRLd,
 ""p9p{Hm8Hͤ2ibXmR3RSLd,1_ _w}/@jAj.Id,188y# ^9L:HIDD=\^2`Rt%KN NFDD~c6Ȁqʤ+Xbpp""aBrȀrʤXbpp""aS uʤXbp:p""e)rH]8Hݤ2r2Hs\^T&]NӁこil]!u uʤd,p$p""^Rw
L:HqTDD˯K\+# ʤM2 g""fWABAB%I% 6"" WWgPqIe$c|hAD$Z7R*&K  ";]CBB=n`p""gPsKeۓă 	｀DB*>%N	T&M2E@"A"%I@p "Rej_\+  ʤM2X ""2:~^DDZ{m
pp""%3-C"A"-IN'#"R[ $$Rt6K<2p=%:sʤ+X)``""q "p{e!XHiM ލH,>ދHCqʤ%cC 	i@{[ )Il`#p.0 <Ґ,N nDD-UHCsʤ&cAkUϹix4m<f`""|{Hso`!" XHSjYqH oXHSk9p`!" O FiYHkcF\
,D~=vp#QBD<+mD"=f? EDno4D~B8H|o;1p2"끯("oBmۆ _DD*|{YDނHێ~ |0LmD,Dz=+>'ND q}x[+%*`"2~^^xX20D
ρw}o"}d!O6^q,p58H:*iY /<	\,t} R"Uosog#"}^*x|rj`{eDjBm-TD,t}HYx[p>o{ E WDd Xx+'H1u@"uo3H+?  R"uo>At w?ֺg#i[XD~.DBB$mC_Z20	^	x\\LD$ .p3=HHYDD{m4g%{A_	Xp}/HXDL{N.>XM@ x}GNxx"e! m1EpD/f`!Ҁm.#s99>`{i0"=68~`4"\CQY4xπ6Ҍx<~DHjN  W@	Yo&g8
hAl <`{;,Dum  aVOD5,Dm,(,=Y`0`!`X <,|",DOm#S8ЊB,u "f!"Uo$SwSဍD 
`HUXHM($x88P9`7x	X{eDf,Dnm#c8p4p4`p$0&&|w}	x
L&8`0QH`80@	t `?vN+\CDBD"=+,^e*	8^5[y^0*"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""ov>N}    IENDB`ic10  PNG

   IHDR         +  hIDATx	\ua[In0	$d 	! rXRԭj]G{JbغTתԧZc-Z2V>hQLXB d!$yiiK;~$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I	H%iI' <) 1O/ O4xfw<yR'4OjOVn I&]@$,I'yt`4`:zxl`
~Z^`0
<< []v`<ԁ:p?hOhje$I	H%)Oa0ya@Sl +J2$$ISʒt X, `!4
	YB$$I]*Kҹb ,K%b 	O 6w wwj-Hԅ$u,IR`):Yh `;p;p;p;PnR$I( IR˒4 "p$p$(@0< l.cH$,Igˁ"X,t0
*&g&R@6$eI5
8X`!9  M07 ^G$$IdYRX`-X=@{G \^"I$
H4$] kL!u`/(u??)cH4A$5Q*`-8X9  u`7p#gZQ$Ij$I(Kҹj`=p2Iv ?aVII@C%|xdt`0Cj?~X7#IA
Ht $] N S^$5^`'Z$I) I3Ȓtpp
pz4Y;ہo|T+?$IO# I/ȒX~$=@	OZy'$$eI8H00v
?KHZ@u$ ˁ@N3ԁ;~Xw I*IR˒}'g4$u]@'R@%i$	Vg5wK$u,I{U@
@$=p}V~IRGHZZl`#pGv|AVގ$m$Im'K)q#A$9v_+ʏ"Ij+IR[Ȓt*8 8$M]@(__w IjyIRʒ(HRk
|	:RIRK
HZJ9`9/ f"IQfOK^$I-# ItYFbL7l  I!7KI$M,IӁ@$u1~@	nVIҤH&T*"|`Ї$u@*RI҄	H.K ,^f Ii;p9+@T+!Ij$i$ 88$1^;~P!Ij$i\eI	p>$Iq|psVA4nq%p<R,`$,Z$$I-K ,6/VHZyIA	HXqˀE@@^kgK$I$ IoY^	LC4|FVI~	HQ1x!B F4ƀM_%`SVE% p|$Ih+OKcH~M@K$
'`0$|
(j凑$$_eI:8!IjGcgkJHHR˒4 /NQ@T+"I]* I](KXx1 IR'RI2I"YW0IR7|	0pCVލ$u$u,I뀋)Hn|UN% ]\I&߁oK2ԉa$eiks$IzzcUZI$IY42`!I)HR'HR˒}g I/K2Ʋ$
	\l "$I?cUZIjGIjCY끷g$5p-p-`GVFI@HIs$I8c,ʻ66%ip,fRI&^j=HRHR˒4o2` IZ?-#HR
HRʒ4o^"IR	|
T+!I-& I-$K ^	$IaKrIjIjY "-R$Ij_  >K244ɲ$RH9*{/K24Y4I$@$IgN໥ZyII`Y`!v@?$u j44A$ei뀷H}>|xT+#I! I KppIT RIj$5Q8$Inp9p]VF% IM%0p9z`
$>T+ߏ$5A@Y=K$IA]'Kn$i$ieI p!ITRm$i$idI:x'j`
$PR|tt$ W K$I/^'K^$ $ eI p6C$5(K򏑤%T[HpEV~I: I: Y	1$ImT+$$IlZn$Y$dIWG $U4w)ʣHHȒpO~$IR=R|++$$l|T+A~A@~Ay@/$T+ߌ$$%ixp$m|T+ARHzY ^$IR|T+ߌԵ$W !I:
j=HJI]'KR9cbIFo(H.1JKT $Ip$p)/XWǐ5b$u,I F$uA<bp]^}I]! eI"$IMۀ/j1$uI-K!U"  Ia`v1_R>ԑ$U B$5 ?($uI'K^U IbpC^ARG	H(Y.x1Ћ$Iҁ\\TK2:C@RGȒ46 W$I:47o\Gb$,I ItfSzq$%i $I_? o*Z#-eI?N"$I_[*N%H$5p0/\_WCR[	HjY`p%pC$ib5o on,$Im!KH N"$I&^ 
Fbp[^CRˋ$	8I7WǑb$,ILE$u ˋO*6$%i#I*e7K(ZN%i/2
$IZ`#/XWGRb$,Ig  $IR)?ԫ;2ZFˀ+I xpSVn i$M,I#TcJ$I:-jQ$MI*K^ǁ#$IybJ:I#idI:x0I3 	*?ԫ4)b$M,I^!IԹr:`e1_RnC҄HPY`1$$Iπ+cH01&L9|@I3[nԫcH1&Dks$I^Ӏsbp}^ARHj,ILC$I`N1_~^݅TY|mI$XSR֑4IM%i  NC$Ikj]q%i
|X$Iay|ZWHW1U1p	i`	$I_Cbpc^CҸ4n$^|#I5 *(Eq% n$Itzbpm^݃C#eI^ ICk|[zu'IC%SI$  N*ߪԫu$%2/$IR3\
\tX

$I4~ ~Vn H: YTo#$ID\TnԫH1[8<0I$M)ϋO+*O%i ^|$I&KpP/?ԫHzv1Uxa`
$Il9l *VU$=I(KRy>I$8[^Wǐb$=,Ic[$Ij5XX\WHzJ1R1	u@$IZU  k+^$I&K)/"$Ip$/m^݋_#dI:p)!IveI|+zuC%sF  IvPԫb$,Ig%\  Iv PԫD$$H$, 6k*..#u,Ig_#IN /|R>b.%lKz$IԩfWՇTԥ$|	X$I:L`c1_r^}H](K$IR	l,_WF21Rɒtpp$I6sW+6.#u,I$I,bJKH]"KyS$IRbJH] KyS$I0^R@p1R˒tyT$I_6X_ZWw ueI:9p6$IS[PVW#uCeI:s"  I$=bJH(K I$-VH&F0Y  ^
$Iw/+n#u,I "$IbJCH"KI$`0/|RE 1RȒ}I$Dq@1_v^Cjs1R˒4^\	!I$XU16#,I#%G)H$I+<P~RWHm*FjSYFǁH$I͑N.?ԫ6#,Ip
Y`$IRsn*WR1gyH$Icq,IRLK $I PDj31Rɒt!gH$Icp|1_F^#MdI>
<I$ir- Vr^݉b6%4}+$I4 ԫ#eIf F$IjX	T#,IsˁH$I%v*RZT80$IԚr=|gzԂ"ֵ(G$Ijm iEH-(Ke !I$GUH-(Fj1Y8I$VoV:RZHK$I~r^ݍ"b%i/p9;@$IԾV SµzuH- Kx)>I$`5H1_Q^Cd1$˒4 g  f I$up"P)VU!MGH$Ie0iH(Ky$I:/|R֑&I4I$|I$UǑ&A4	$$I:
/|R!MieI?$IC  [O*jiEHo-p0$I]+ӳ$EHʒpcH$Ii`&HS  I$ubzu7&@1{I$IKbJ:d1ReI> $I/
/PW)Bj $I~ _HM#5QO"I$L/WW#5I$Y W$I$=ybwzu	b&Ȓ4 $Il+߭ԫH-Bju{>$I$6,I[4β$O`I$IbHY4$R$I$ab7zu/8I;e@$IO1_V^E9	x7Ѓ$ICC'8Ȓt	`$ITY.F1!ʒ4>H$IOybzuDH@QqaQ	$ rCD&\tbC%S RzZ^y%gkN$M@`MB._ɚ=u&+f#,I	C3]yj,X~||I&+8pz	6nR_U՝H!F:H|Og|N,]El	99o9$MB0c{g&+_ԫ#,I#	sfw$ԡi;dL­?ё$IjKzx*Ӣ>n^F  GU# eI $Ϲ,N,B<\O#[QH,hVrt<lc[F#5IXWRW" dI|X&28:l$s9Syw!Ix[3M#05iFCjAbJi?H/x=CjcO[c`>DC;$I78)Aȱ^m<ʶ]HMzH)FOY>	"5IU,(,@ĹKW돥z&y$Ikn<+92MLāzBm[$/|RnF1~Ȓt*HMx\ߢB`x?v'$@طh*R}=HM-ԫ!=i?w/R5/Wq(gFEg3z8)',?89"FCCHM6YW,bg%*f7*PŹcx?D$̋pH!&&0^n&
bpK^H KҙEHMv|zg\B3~sؾ]Ti4$?{o0@`6vet;R 'WHO#Fz|
  5QOo/z뫘x>oU9s7=H4%s8!x@o41HM6[XWHO!FzY>x?ЋdKV/fs1Iq+O\Eۨo݆${qQ%L"2%R}Ǒ, GJS#=,I!M_v!Ǟz6s0'n<]wr;.EӻOD	F!M/u^#)󅫁HM6m /ݗ3Ǳ7gH:ߴsg!=!fneoci_W/~E  MlKW(;+wmCH:גL߷Eq@`"{mc&@ +H FYJ<	W0sfq¹g6t;cccH:GOY߷1mA	*#H&F|)&9xe`~:cN=ysofǐ$ /gun>=LsVo Mi|zOo$=x?Ѓ4AV%dEˏS[7}[$ r\пd9΃c;&H 6U
>1>Y 4AB\$YV1cvӓٳn1:2$}'-̾eL@ #[i MXWJzuzX4sfrq+h5fL%o{w?IR{M",V3'ƴi-D'F]/K =Hh"gBBh5Q訄ɫz[$I-(8g6_a @+9{v"M ]ԫ% P MW^̲+heCy{4Ƹ*#{G$sN-051Ƹud+|3zqԵbՊ#Mi3<'fTv+;ف$i͎q^
#GD;CĦE`3JuԵbԵ$]|G`GW^L(bEsZy/[ﾟF$i!be\[h@96>L}1Ip\1_z1_y^E'F])KS1HԋdsnbsO_lF I8S^w$M =lن4	rJVubu$eo/cy^Vx,7E\O!&Ю"7la$8VWWQwP7&8,YH;ugG=D8FqL|.?ã[>`F44~8uu,I#g!Mɫ8BM1XOܓcMww^$Ig0cCRNYL	z(@$S|o*1Yi$9S8H:EOo+N8G.ΛxQ$I&Xbc
D:HcM#[&
|aS^E!Bd*p%Џ4Iأ4!
\r9b$I'Ĭ]}rX4N4;@ԃ4"<1
Y&"}EщMc'7͕$Iozsg!S!⎑xi{µz:^Ei-Zt:Y.Oor.[LI3,幤Vt>r̍Z"
1xY&9u!GBdO?r罌!Iu}!ھ9o3 b/lي4|+(h1hYs+iO7sf-Mc'?u
+gH4#X[H1榑-24ɖ?-TUԹ"+I6kf̙Iy|dn(fǲ"KDLZ@:Z:Vxs	!mB]<U:altIF}!	}xnߑ>U<8THdw %G/%@7p.wy^YCHRO9'nH- G%i8/bvq.f,]nȃ#I."g6`A4D  k4q~1 /UQqbq$e04kbC	esOч[1$pfR^Fhi4FZQzuu);)H-b9D,?w}eo`h8$u Sp=K!FlJe0!81(Y"r  Vrg_1G*۠$#{fs~̍	D3V灱H-d!pW1_RNZeK3[fo8ҳ Ij }G3=g6OCjAG%F#K vއ{mgR'fI&$NHr!T\bv㪫 
X W)JqiRB$3>ꇒdp"wPH,J=Oo|aN)EsF`7=A$ǔ^}e=뚷HAH!|+Q97rbTv5:p5k`+0HO0QB$]D
d<+1#Ə&3!=W9rOYJGK7lz䢘	qBt
KCqE1OB$Dʚ5o"y"x'"9hxHʪʑWR^ʻ>{G^H.1(59u`ť0"9j5,O "y/ODOň䠪pB.;K-XPfr~l.cl{CE$GO%Hs'xI%E$wIΟM
ZFmmz	ֲ$4w-t%s yn]$Y$ߕ"9j씉H(*-|?P>dN9e[ "Drܧ*$9HJl5ψp$H00aZy+ƭ4ڇ@sZ2EW,f#F;+k[׼OgUň䰒Rb123޳7""2Pl3b39)<0%fB丏 c y)OG$8?H,?uu<&ͨGDWG""i[l
ِOB$U5k#y"jDr\Jʊca%|+[X1ư(2s41d`EpB$Gd<aA$X4'/E^Iy)>Wl|b#"%6:q3yMqk]+G!7#k/bD""Gk[c Fo!yAJ2'Sǝ) 20jB5Ǟu۟¾{y3Ò$N5.2FD@(-7,oC$O_QùXw\DDFX[d,eD#z$X$o$	PHCV!Cqu3z""+㝱Ld(x"䓩[(HZ[!"
ayt2k)6ad!lDZ`7$/$%`	"ybD'EЋEYr<CDXg4g.PQ_Ys˺-Y$Y$_V#GKEoyOeFMFDgjh-`- $lӁEH^HK!@)"y$Z##ô\r,:XD$\cYّzb&(."y&|$ODg|08<STVL$ArSJ>^""R9ŜBw&CĸӀEHγHNK!@"ymnwk)b(.e- ȆCQ#x"49P$>cuf~gX俈q9)Z:LE6H:X4Yx"|8<`FC(|X{L:䧑N	oSbkak "y(WܺyKIe9)'"8go}b0
We- Dc 9)OXb`9"yV1aZ/U`)hkna}mQrRcC"d}f/"y*WܲyK9UӁ$"yZ䯊\x釹]2"Ds	I9xF"*FT"X\E|xD$XᱬΡږa|g1Rx"䢩ZD\Qi11L3"+֞:+aVE2<	!2"y-@s,SBD$U}}c@D8嬉a[E
5XD\%d<ab\3x;`cpu9ܕ.v1qgMt6նvP	P4:H10yV-rXy!x6i3!0b) w'	d<1x`qeUS|#Tw*Xw4)\.q)HΰH.9HC,_W_ų1 "'dsNtl)H d<Q	cS?ŪwH4]rjt:'3!DDޖ'"9"`""ylX9\.0ɭlQ8DDX-p,2D1n HC,;$>KlDBaad<gEf2Ҕ "R ,d<Q9E cfo}3.\C(J&3!DD
<DdYdH%	x?PH)./%}G#"g0Lvqnl6Ӝ8XDD
Ld<Q)j)@ne'0f?<ГxYa~x<B""R!CAL20ǁ)0HRZYHňJ杸k-۞L&A$l+Ә%+Rdy6N?H	u[<dHXd(MAD$ KYw_'A$,4gH@!C"C`""O^ʿ\YXu,"A1.K"8=R0S"jLxbV"R|#7u"?STVHT9EIDp9,>iȐP9H"J#r$EŬ5)TôH΍f3AD$ !C".O(/{>"o:N<s,<y) RHeYd2Ef,d<Q:2DDUc&q(*+FwJ83:cB Y#{y2d9ȠJ䥌8CL_8ulF$Y[ Sm~'/!RBu]4.2&g" -XX̘W~cw=D6A$_#ipADDDx4lg	l&Ho89#o|0)L	 ~
*4x20 2g#n8DL9^@"PŪHm)Hox>Q_Y_뚷!"8`"IX,_ǯc\r%E&h")7QD4"Rx!L`ňUQY1V,&VRċl$ՕBdrJ9=Ztgkbk "aʚ5og2XHtwv#_B0{51vAdH8XCY8[AtDf	0,	Cm'cϿ_8	":U锚" 0d<ag'ʀHٍH9|bzyDbDCSlp/H FEqDL*@EYwrbD%"11f- 20<|d	ddYd@%	\ 	Ctut 2Pp+~o1beS(2aDR,]~ r&	Ph
DTW
evL.[XH0hb4cDZn2|Ph	.2"aj>ϰ`5eNx,kcTRDKHD
X(d<QD(ՕRVUy1K\1UdìNp-1B%g	D2`,2w"2"(,=sDz NXh"KA$&'"""ObD}H,{/(KN?7`K2HSPi	0p~20Ȁ@HۈPG#R#)aNqrx"2Z.DcZd@XdC$56#2TJ*Jǯy-u\f:0C~"h`2 ,
ܡ&;*U+.WXsHFfmnD$Dw|Dt#2&L{1H0gfA$WdhSȫf~gp
0NDڢU8mg dqn-H&C'iDUeHHJ|DU-tut!2Ԍ1?u",	mDE~?xWoZDUL}; EQŏE6[f"4HJY4"~ev:PŮfpD
ƹ#v8"߅EX'c~'ʁsgNDry{ʪʑd1ERn}^":'c~c{dE%E/B
OhCDE׉hxX?b_9֦DrkNa|DpLp+yglq[H>u#"oCEE2DD^!:Z%Co7Ò$JM|IvRaK~ar"PNkSmͭcN=F!FY[d,|i@yٺ~3"9N1  5p[H>kID<_XϒD59]#$0?\cY9zJM|oCDd<13Qܴl&H)*gIKP&:%I8XD
l"򆪀HY?5;@ks"h)K"`ѹLt*1-^",p.gd<1X؄H.l>hMr|#3(1D
I߅x
`"::8 "u3),qn?MBDTp"'髷 ."69Dr%HfF6:	A",p.'d<18鑝/lC$WM>	k-2TNQf"VD$HY/V #NZB$UcN	cs"RȲx4fNBz"} BH4m	\4v"qa1fMtl9HkSHYWDCmݱ\d'E*2RA$(m~7"rT'㉉HXF""=>\UTRNkbs"${VaHXN"Qٶ~3^C$T!b,2ٙ=58d<NFDڞmiw 		2ZK"\K Dd8#"r\251@5"rԚ4rpO#"Lcr"T~7-~"+ÀQHo!"G-՝b˳/ 2420cǹYe"A^  G"G%OXl "gE-H+1aNLcEx
&Kf|Dx"dDvlFˁfDrMۡ6u+876Yn5.{mHTb(EDzmK{hܵ\Nwg?\c9zmf"DXhXD׺:DrɎ[f<lUB	#"ABD Ez"='F >[%{H`[9YpF`ۚ=`
c9 HظֿH2?<"3mK1ɲ'ۊ`c9	 پٻu'"b#O!SnNp&!f1H2pHfgN`[f8qۛmK#"d<QEzj&07!2Ԟ}Iҩ4s!(23a1HO=*`#@"o^ڴ]jO#Lrj!"=A^+"ү"	HXN,"ondJmͭ<ț3@ܭbutuH,鹃^.D_$G,D% W^6˓=PzwҎqX[ň5H'#o"= @Dݦ'rMw>rd6,ŉ""G/ADd@K7e8 "nܴ֝噍z0ƚjX";M~vDd@țHO$GBd(Ȥ3녌1I0Sl^0',`:"2`}dDӁy7G^qVt&ǅDpȀ@ސE207le/!2ntw"0y9Lqc0Hߵ]Ͷ""*
,FސErEDLCzDˁ];/lLL*M?{6Z.Dd@Y$Y䈒#"}A|Cdp7*m,	 "kSp%rDy#8"2vlh<zCmh$kc80Hk#ŎL3"2(*,F QDd?>@JNt,*L-:AA"od""<|Gd<x=)X=KBpٔmGDG"'p"2h6?;"2ϾCbA2$[6R4#"ji2pòȑjAspO#Nsߣ5I""owT@rX9%@4y"}~_wTÜb΍f;MFȠ Kòȑ,DdPm]=/Dl]t54ôHΏe@DOͶL"2prX9Ƞ;<Hh?
:Z	q9>ZÙ0"2^i!8O8Xu`"2|>@:F/)~N	kbsXN "g#"Cb$0yα@۞[-yW#H,3BHFgw;{2a`>:9Cm<Gy➇ɗ|"jB0"2td!ceXp""C걻+Ȥ3F8%f;ADN{!v:+x"EDԞwg9v{
-	XfF60֖#"Co~rSpXo!N/M|#_d疗	2R:M3HDdȅcb5p!cϲoDLGKW^56>BgQN)kc4c0D$7bS "`.W,rM@twr{9XC$cHnٚ9!bHD$'wRNwg7\~5?"feS#ӉBDr3xHX'yD$gq/q"_}6
21"{zͶ""9E^EDrFwgoyn~|ٕ}m2XcIiKܵ>.?XE^k. "9?<ÞyE_v%wp;Ȇ9%:D."IB9E^9oζ~oqSƸ$r1D$m4rBDr1_XUx-EDr]tu η?E]*a~x<h#m	")Ix""VT!"9i]<yߣH05ow;O"LVAD6}^"BUYEDrR6o/!k.}:
XQDD3]d,"`!*EEDr֖g_`1}A=>$ؗiwBd1̋d8H~뷱5ӄ4A^"V䴮Nۙ)lswrBTb#$"LuF`|>.?ȫ,g?Ύ/"oN!V<jD$ݬKED¬d<Axb0yM-{Haj|2nd3Y
c,D&rnt6&uٽ{݈H^y< "yw{><RL&ADWIGD!X3䅃{pw!!kW.4;7o394buF`0H~ېGS"/䷝AIE7qݥwLB2YOi<މyE="W9"~][^}
M2Rd
AD
Fg3pxCDy}mtw"[sOs|ߧԄ5P`d%<|D$O"wÿkW!aK{s#RhaIxB "es=VD$/`6 s9H^fq/YrDcH=~\~5{}
MSH-m%G;"0 sADMyb*$7uwpmajh8+S01D0m6'ۂ!"y+rǵd-!e\ozqXļ88Hay4!"ym:"sv~V]x{Wq~
p#Sh+Dpm6;ۂ:`xl&߿CmkmjG|?MwuQ6UX"R<|M {H+I	0KM,"voZ/w6;)4":S#)5Dew)	0KFD
[hmjA_:n+/<(4ÝbΉb;"Rx<A)30J<8D tvEx62x=>旴Qhќ([ ".Su["2tD`~kV]E{eWm|ߧDM"Vb&R20O Ym
"RP?2R]vՍ\ϳO锰:6X\,",OfvҔDD
TP. >|ǯ9	H۷c{Gf2aFh'k(1D$xnz	)8#* D V~?Ey<z\&Phb&TVESb"H0=N׍)Kp""ɇ~3]{K]y#w^+mNH-ն~ӻ6x 4D`Ȥ3Hظ+ztuPh,1f- "A`E"RjA@x 5HAs<t۽,?7=x{W}	<2Yn5	m^3H0.dDeY[70Jkm:W\Ͻ7IB4)#e-CD$ݛ"Rj %0)x{7?s_HuuShcy9e.f@%)xsǵӎgIȑSi[?Pc3؆9.<zw4W)NmGDaP	40`D@hmg_!!״ W]u~rB4-gut6s18XDDy݈HL"\i2"(O Wg~>l߸BK}BqL鵰.	K0MFD%YKQTZ@wGw\KnF:Z)D6HuH,"","8	 I\`9"(pK=[w&wv])
ƹIVa1?evND$6Wf]%x0	Ӗ3az <z^~5{2'481BNtoGDj"`  &""u~L:Cдjo\w>%lM!*NNTb97N?0.cH`=]wK/l營i
0TFDDȦl#ϧ!"60K8D$|23BIgxӼB2D7I{7#"V
%xFD$h'_(T%ɕu7QlUED<z&M"`\g<""/{Yt29m9}^xr=~;ly
0ޭ e)FD'vx)5x q	q}p#*)ݝ]]J!
'ED'Rd{YCD#`,3u`w#7|JlC}\u7ߡBTac<l;""1!O$.'x(DD^[eAX|fYS\kK"a[TL""G%'/!"7xKX`<"">_z%S1|Ɲ?ۮN
QظD"n2ݽ!"7F sG&!Ϯ;]MW\Gg{'8-Zp\DDٟmCD0 q	FD0=a>	c*ˮ"!TL""k9Q%@\9PGu|,!nϸ[IqYϢ8F⮮xT.M@X%#"r-%ߡ\{>YnSi
QS,	 "Y<Io׉țKXe""oo|rA;Ž7Slx|b	cMtSDDz^֧""KFDn:w:b(5;Ͽz-xYB1.Y@h۹{>>""=0 K%""=?m563<cp;.⾛z*b,	 "dmtiDDzhb	ш/L*`7WSظBd1L m` "7>3s0 DD}7܃4ٻmh˲dΊ̤Dx,T'x +X7xT=pݥcߎ=*Z
wrwFQ,% ,a*DDR6je tsׯ};PKV!"_Rd{^""PXH/n7\~5T>;6n+4Hw(DrB"3)5DDlDDJ C@Jn-SLgUkx{Wr@3)bUd:m""msR% \%+?mS[m-K?_E664õ0""o>""}00%8PHtup_y\w~~LB2+S932"FDu~ӵ/HO}Tg7=e=~_}R*mkc,t`oY<Mobw~2p	ለz[9~8ik>mA|ߧPM4LOwtj""(J@G	""8ɺʋξPeEd
j,b 6!"sKpGDSiTFV+-)}&R])
p[i:m""Ν"";(EDu"6n͗I?!ՕP<m""Ox]Kp#"2 wy6-m_r!
UظLa[ADd rwj#3-C@G%""dזSF8Ŝږ!"2<|NocCz/""hDDjNMȄh>lfvoGDd@KpFD Յ=Lٙݝla"HA

Q#5<yMृ ²"u{w{ٝٝ$,[gsC2rYb
&H%;QXCD5}`ņ&.MMei "R[2\
h,r[9(H#"R)]
rH#""2$'1k'EDRz\ADkTM)RfFq%ʝTX0DG4X'΍O2ϕ,-m!""#@DD$e<.HNbNH%8^*gNa#HkTMrF^,%!"R%	`DD5	@#"RiXoeV1KH"""8&'15NH5wd~WFD!<DD$2Fz\0ӈH;x+#"RгNHRCDZx=Aa!"A6ɅIL!EDZn2	
HyDChGD$bFy$9jy$Π!"ŉԛ""մuH~)~""5*NxHX'&Fq^b"	bT#t=԰.BCDDB`񰈈T#t=Ը`k$<,""մuH~)~""R<DDdK#8=>""մuH~)~""R;<DDd@Kc1T#t=Hm)bo2Gǆ`n/,ADDjG4xLMqAbDDmce	
Hmym\`SH59`e	
H""!`1L$Ljr+3
HmbEI$ fVw%DDyD f02scICD|6\q%#""G4lADdJ#x{i4	CDJ.@DDh(#"2 ''3%6Hu(3E-8DDd`d\ѱ!DDyեx<DD4$$21ֆHu^-,cSy7<DD4$$21ֆHm
x~""2yHͨ	.i|""䀕(,'("""T9;1	DD'`~y3PteDD"'<DD,!\DI!"RME|/e]܈DD"b+`!1,'$FrnbI<DDyU8DD"DxDC l#"R#bXNMx<,""մ2݈H8yDJԈSc8;>H8kN(,;#""!""e19xXDD'`NyPr>""""R1ôpΊ""R-9J<S\͂f"" hp@7""Ud0LsQb	bTKR6#<! Lڸ(1$""p;yAWqYr*)GDR^ok) y]pDGtT .ON$Hțl"#|`3""6<ĕi4$""A"""!""b16uTZ,|DD-GxDTHMpEjJu%,`ii""r@ۀD@:	mT@x\<Qv""n~6DDD#:""3kCDJ)odVae ""m7ѱ~dyDD*y5DDIg3DDNMh,J(᳨Yz"ac.p{'8+>H%lw{y8^¨ip3*kU'@D❉)$!"J.o:rDxd/2IޔSo+݌H?pD%:r[Ǖiԛ8""-J<TX3U\W|*qL8n0b(>/SԀH?XGDXc+""}(e<LM!"ҟusOaJ;	6n-|ϑOm7`ADDGtEDČ坩)Oe^(:1p's_ac?g6XCFDe؉H9+1)ae)fnqaKO^E"@bW!6Z^BDKt8#4=1cDDY-n"F?"Jr)>/3fQD%:Ѕk$<,""!1	k-g^y>gpZ32u^툈F4Mzy+(9oj?ACs$&x}F5DDg,&fk/;Fħ?v38y	DGtfDDÙq""J,(oB+61/^n-%/|5Vr2DDCKt@'""hj|b1]_IΕZ|s44DfDD  ",fCf(181"6wc:oq;g\~.X4f8>qXk9D@@DxDfDDRx\:@Dy٥]I%SOz*闞WBDJg3i+{\GX[Gc~=QI5_8+f/&d5""i3b "rA:?l#L1~˿߆ŨF>?DVDD`mİ>3Kx$ojcf1j:|+GD  B<e3""71ޙBI "r:]/װ G،>}z:k-XÅfΌ9DG.`""pvr<m""G,;6q/}ڨ5TOvk`]"-؉>Lq7+Jy=	|;7oamԪ!cAD-t%"#Z`307h	.JL&EDpms{y.|fێ㣷^QLC-3p%gs{/{36  B<% 6#";i1uN,;6D>^khlify1ڧXbیȟ
8"-؂PDDG3x$ O΍u>矠fА|'!"'6bt6MA6yX""jg}\@	c't?iE̋1Pxi%@@xDVDD~b$5zGDP;xNk7\~ut6f?mDDt6CXg""sbbl+"""J<Y\#%t͘?ʻ>suEs >vb1DDF"#z!"7sNb<zy5N01˙ﺀkoC?<f=0YKxDHũɤ#"r0|Bq-{a4Q.Rae#Yέ;HX6!"u||$l+""@'+QXɞ@L:q*7w"Lv7k-"i{"#zD "")b]8ay
C4%g^y?8yϼDf1HX$'Qo∈7\qAƇiθ\bGļϲbRz{HZ8"=ILADdz\gKQXIoP$l;$npֻ/$yDIGO_1@@X"&;YD$RLDDʖ{x	T}\AϷ2\2vxD$֥GXi-"ۓh1uO
.#Ə?Ǩoj@[.ŵ)DDG4AD"cxQ^Wdfq;(;0r;~!ڑ7;y%g_DD"e-MGDB31OMȟ2݄MàF{õ\t핤SȾYkW>粧D%|`"z팵-QMܛ_010nDoOT}
ٿ#⺫1 "&<+j	ΌGDrSŕ,)mx"ۯ<~:!Y<ƕ[D%	-Q4$""1E,.mm|65s}/!"pD%ٌV#"54ȉHDD~'-`Cyabe)~x"/;o?	Հ#<k%"JO""=˥R܀&|244!GZQV^B't6CyD*D$yL!"pv3^f|OrbEƤ{9*"#E Fx "0
k(2abwI|>Ǩ"}9OHwg"J(KtՈHh`Z	.c<]XE	F?¨"\+1 "	tQѶ8	zQH49`}La~abackOGz=7lEDBe(Kt9`"
IQ2)D$z,P~1~a=NlOG*eX+~=ؘEDBeft6,GDB&91>
.2~[BoP$L[qqomP{;5q,"*ٌ#,Ѷ,Sch DGcKE,.m%&?/\~$RIy1D$4VaѶpADzF "QF^*|$LpU/~aHuy?g,"
K0KDdN&D^WR+|¤u΍|[72T}wDj""khpD$5}, Llrێ/~]{%ļR;θ<O?𖥳"Dd@a9-11D$|[;?-~7aOquW՟~S#ǋ{\qDd@[BybDd@k`rl("n9JM. ,13|_zv3?hV]Xs8"2İC"N^-nwa8}3.?cRۼ]#"q0O2;OV⺫I֥Og1[pD\:V""pR|4qbH(tq5c&t+W}C$RH%c!+l ,{cpi^;".f7ເ1i-c:	θ<FM8,{`8!>"vcS0k_֊luuK""ʫ@Լf	e)z"a>v7O&p81lpDdpb!"5oZFH8t^/z|q_s¹!4s!Dd@pfHMk0	F "Un.ʻXrF"t{/fP["2 %وHM`SlE|.b$Lp>ͧ{MHx闝KL"0YIq7:]/Ja=>0o˯
/!w܈Լyk,/"RFyak;rsPMش~]~chp:i"3Q"2QZCEfc˔S#sWH& sXVHiFDNRXO#l&tvFLDӱg̘) X5lߙI"2,sGn˻	;?o2t0]Dsc"R楳k,FhSLED">OVp~	=A0:gg_ւi<!HMzyEEGDjDfDDAw3)5C8#"5sY >"RXo8"REV~ntEgpÏF}S"otֻ.)eUuyMFD&ǚaV̓ŕ<_FOP$Nnרoj@OM<a*GMԔ=buy]:qlDp,]ۃܕF. N8n75 /1/yW_L	yECD&""_]yl.w'o*͍	Hx#S2"RU6H""'G
V	QFs?}amwɈHM?b?5( "U71ڳ-],,mwa2/7i>u. U_T]	x##lTHیc^y3wnu_gc9G!"U6#""R5SHm#<YXA+v^oȴӏȡH%9s1 "Ub:qȾ<k	&ڰ9&ǒV|51 r8N<4Z	7ȾJHMzDܓv/h8g|bQ2ɈHՔ7ȾlV!"e0c0HRRί"JD	F>ȑ0pcEDbyI:q,DlѱDz637ťDE.ɧw-ZON!HUJg3eM,V^|DbFlRH8^)oBv=DoSO;2tT;ǜ~"RqE@a7T^WfWw%sNyD1y61/TTx'D"mv"RYݤsYZF#j[@"D}TT70'S:	g8LI""Q&:-`CT2b(D6&2L',GD0>ֆAD*yY5\|4.2D1y61/TAޒEE fbmFD`w糼 GT٘C_4Tt	S2r"R-YdV~52LI""L<[HCԝrtD62-Y-a7.ǃE<_Rpe.U="	矆wϧ^-Y@ʈHh	m"|Vvp\pe8JtTZADA"CD0HI!"}<_LgЋD2ex"4dT;cGDUx/:`"/{m"w:]/1u0lD*ZˉcXE+DϥLѶJ'w泦܁!W,ҏjr45!"t6SB"c&PDDT!"G@Y<_ cfSF3rD_L,r0^>5k!N92;]/B73pU#R-ɺ$~"/zYYL038ۊ 2;泺d}38j:̓'H[	E"q!"}٦bÓs5& ߴӏu"4rjGDl&@"YmFDDNïy3p!Rm-Z;e"ҧLX`""}b׊ "'`{rɖ;qǝu2"fسOFDn%X䠤"09b͈u%)R<r1bhDjRԀLrP,r(Ji):D-CEZ\Oȡr걈Ԋ3lpDOAȡx؅a	XoB֕wCeaqpшHBEZ:
GDX3ٟWdfqceшԒg19bkAȡzpaemFD[=<PXF.@YڏH-3e#GL49T3=@3"rȚmA&O6-aoP@6f"mPjg=aO!"j9,M=&*(,goP@FcK#6f%͍29"ۀWCbCfCDX7cs})nxqZt' "Gt6Ӄ'<"rH0BD[-ܛ[{:DjѸc&K""<2-!iIm
ȓ<_A+"Z:b(CGGDK09d9dlf/09$M&II eƠ{_܌O]v"RbQaf#"@9hm$"QU&`nyFDXC"C@09(#fDj+liK[	pHetEVM:18t6x9(0ӈH8./`QqBHWnDjQۈ4BDɂt69,9eDlF@$JJRl [E-Z2j"r>YH<DD$3qDb+haWwe:gۺ͈Ԣ.9Y䰥Dzxñ>]y,-m#!GvjDjQL@D2`1r,r|Dd	2/7p_n;6,Djc'aAD9l9R3~FD¬x(g)2R;L֝ԢCijmFDh7rD,rDZ`6"&FI"FXW,{eDjQcK""X٧$e∄M']A/Rs3Em-lGE3DdIPg∄Is_~WSv>Rۖ#Rǎ@Dx9b9bl&SMa	dN![DR{C>	ٯ"Y
(#"oC$ϗܛ[@wG/#RkF=/!"t:#f2؊`S@ܝ,HkaP#"OHHHg3[g?b0zDUN~{Ndr?߉_%MڊӜt6KwEDuu6N|fVsBz"2m߸>DjIS I ܉Lh\t~/'k.DjIۈ!țlFENqDuICd Yo^eCy7>H9q,"&uHHIg3=@"z Nϓ:ޠ׳? R+"pw:AEK@yMS,@zI1 sӽZF"@D^xSSlyMI!R۸#7M.;6npAHhliBD^8S&H*xq9y7/~sjJ5:yMpO:AE"`>"BI!Rva~q&OYbDD5ˁ>g>fJ@H%L"fqy+waD]P=6ـH<פLs/`"0Ԋe~S\ʣ\	?ܺwܺjiڊ/,_O#a	#H-\S뗭៿ՍH52lw 9D"*ET1;ssAd0سJ:z8"W~f_X?XHD%a^J<V\N&+!r0̚?~{twv!RImc3HHIg3{{İT栛tn.	9f៾;D*A{؆DPM"Riܝv/"ksgɶ[D*E}S="ܝfo,ߖ/"A1,"Ct~yWBH}6.YH'y_Y_("16H%8`}tnK[	+g"%Y
_ү,R	O+H+jyߋH?=)ʈTCMucHHKg3;&B?uL~9WB?tp??o	ݝ]5c"0	w{DHHp8ܛϒ6|"P.~[Y"}ܝf,R)H_+Ry=ߋHAWƳf(ʈD"f6
R1"^<1\xDci4IDn
7Q&@r{{Y8k6];v1)Ssv:TE*i0DB#wro~J	pԂB@~CHڊH2HXbL'p'RZ/b߃HqαrRs"_S*9\ɺ:D"~`R1M\İDD~[XKew+?ؼ: Ng3T*	DB3 jYYACd (K̼qṋ,~aA r([bHE-޽;xn}@'GRge^,cfa5{"Kļc##r0vœw<H[R,R /"""dׅ%PXGοc͈/K"rgHť@!}.	\G>wfB쏍Ybq;n,R-3D\ޕxRvs~Z~p?Ino/""x 
TE:
pDv
Kx+#f{pO~ɿ|v6وHD= C"t	q,qn!rHe}̙#FZb"!"8*,RM+\i5嗱;!EVo'_Ӄ$RI	HXjL t!"[=<XX˅Hv6\HKg3ej,Rms	1ܟ_Ⱥ.Ko>""!""RU1^;x^jC$$<L^WbV)ˬb+!"ow<^&7D*DSno/=]{	%A"`
"!R.@mK.nD{rw7~ ""'HեnীHH8Uep_~!8"r`.p,5?M^xʥ2""\ <@"1`!""\+2'
Cc6?W?]`Y&X&HHHt8`s}-nw"r
<_+q!>R	؀ԒW@L&/`S.p,~iz`b		bH'HHlHg3	%  WT~%A{[wӿ1OBDdXԌt66"yHx9n/`Aq3>""׃3d8aLg3R3,Rk #yWB©L&gߍTss7s?IXBB9DBA`!RSbHMY{;v@#"ب #xW)#"W3gtwf҉SI֥p 9Dt6)EKr?{hgAzf 2N Au9lNjz}ֺjJۇ-RjU>D$(!1 e{s㽎`$3_ZC#%ekejh"i4u-|]eò5i_4M67xj9Q7JHmQgVn[Ξ0ZCWw}ԫ5ު*R!J
j9Ԫ7!rZGo8pKe)u$AU\.Dkߎ=Hmn>jIQ׀A6UNjO))[%[~5=Hj]F߻ϼ2?4MQi6Hm
|5J
jIʖ?@jSA:M׶eh"}l^Ͽ㯸[7SP{9sR[ ,B-+ZV5+RР6P{9V[YɽTտ}T*Hm\%0jY!rZN=jHf7ͧןi3E RBgs;!<c騵5h*kKkHCYL9.0Z7ֵL(WA`!zڤB_)HH<
7>ԢҔRjyQ׀ "ZS
$|ka6 -A>?/eҕiZ(}%6Sxj+PZANk	7-cYARؽe'yeZD@ZPAj3wAm!Je RjQkL\_~+	4ER\k}dp_	jR xj'+pZC
lhc^B]/#V/^NhjUcHmdj!jRQHm`O;:u[]T_ƆGyh6<LM;2sDx	jnV FjԨu4u1;K*[h"I?^/;WrއƎdRxj+Q7hJ5ɗ{Rv4G?ȊM}w#KQWQ[ɠvT:cz~0rZCUix\^ɳo6qP@m'N)ON6p Eg_:·V$h4[vQs  %qjW[Cj14RR
|{v7"IG$MYJ>[I)8G8g?R؈RRT$m ~	s~4qԹ+	uHx)Y2~ʣcs3}s=8vR= t2u41v5ݱGYVAJ$zΏxl[QZܗmmmJEF5sZT\s23ih4IY-U6HD۷s/ϬOԳ h|l^pZZCQAn@jQiJZGg$rku֑2o]v%=8Zܕ^B
"ln̳Б䇕Hl4ٸ|--	g#{IVn@jQˣ$A`,PFjQ{#4hǖ1L$M|᝗s1z=3Z=[w#)`BH>MB.9 mյ<\F**e]=9%c(q7r R(텨#Jf>+ oBj1=A0J)z&Ia-dֳgConnUkH-fxwěQGȠN
RjiVѡdQm37`cIjei3eckw^7z́=EjA<:F:FTL\x304hrF,N`Zf~u˪۩DEef=1㨙ӝZ% iCjA;C詥llcI$zƂnw}KW}؊:J:JT$m ~	8.y6j4x+nV<rBM{BFFwُBFI<:Jua@6ˌ-XTD5#Ib߾q3{?I{w.(S(gs;3Cj53゙?4IY˼jv6Hl4ٺvqYr)'ͫ6ruZȏ/DI\G'DP*6JmH- %ev,NLk0VNW{G^BMϴݽ7ƬZExHoZ)
TPMHR:0Hw.v͚&
Z7ccJ4ͭ
8ҍna~eäHRi6l߰Ucai!]}!xoCceP>4Z``L7KkY]e$iʦE3kQ۔`νH-S.B
"l...DbMRqt!UװM$IZzJoLsϢ[<|"̿|,Jh!xRV of"MAy=	tu:5$dmfl})A@wٲ&Abc"l!
ln?i5a:=tʂW7SNkHЁA-xZFfitCcp (SB
"l1׀P$̤f[kXGIҡV]-kz=Ny~z4]QAd#MFdkD'6W>H$p5s_I)r=c#cHS	|؍FFT$mrP='!SeV*iIґ980cV{L1N)?l[i
>%quuBgsoA"usGiw)9j6$E4>jk$)lygs܉'s %NU2m>4FUv6hwU,m汕i"IoFe.GѠڼv!M/+Q	Q)䳹/g"M0p^l`Z&6j4$Ma!ce̟3hGG
QWQɠnUC"9Vi7))=4I$M7zgټj#^jr)RF])D]P*R(w峹_Bմ='0+s4Jŵ-]fIKӔ=[w장	;Lܴ(?GIRuu|6&`$K限ÓhneYmuHݻeQ3hu]7݉46S(GP
QW+|6x+Ѓ4jia:!Iʺ^n-aGcIRhtYř8a,ZUl2ױu&I %B
|6wb @Di	M+*uoJ$5۱Z'gN&jr#HFӅR1E]-Dz\>[' M	9;<V9¼jVv E#c<`	KC>sdu<f4 oxuqRq,m~&Q5mp^l=){WY͞0l4ٸ|kb'
4_Or=$EI|B / IRM<8NT+umjB9!IjOwcifϩgN&J{/;åHh>R?J4-4IR ༞L̓R]^RR$I2VѻQ7y/yg`,w)wGIi$ދBS(泹%@$P眞Lc5hRb^e5H:G$+׳jcv^/'>g6lr?|-kIR>%mH?&D)ln-p @94V+$I,~uܳ8^0dڴی!MP*6~LS
boN@$5\s2&Z
lJb}?)NWTyl/3LEa-@4v%^"=Bx0  MrZ,3Hu,oje$I#Ma󪍬o)g</Ǭ9'V/^ޭ&A<JHO Dzln-p @`LB
OdU:W6Ӡ$;{yQ~~/aOac7GVG`)##RB'Q(|6w?p	p$Kk3A)6K̭`K} I[-;9r1G3Ro`C+&Q@z!S(ln+&`:N
̱og~y*$4k7އ9ә} `<ߵ~ZF&X( =iJŵlnr @`\s2PZnI$IOdpŷǌfrg3#{"MtTLBtC@	VNk֓`&T9Jv4$4juݻ6{iu4Te̷>u؋4xiHP*峹UHAJ3H97M`Qm3wT1֐$pl߰G^©I!zi !C"B%M^d&HYN`:c c^e5k;h"I3qp`EC>lzp&fMH	|5J⫐QtYHF限3Y&)=Ht+|k.x9YGs(6.[Ji=P*VQt
b=-4ÌRՄT:$6N=tfl ɤi_^4 otBT(糹	RMLtkj{H$ibx}4zLٙl/+1	R>%H)Dz\^Hd0-s^f=&)Q$IhFUXy/sq?^A )pRtBgP*lbd	RMLKjJZGɴ{Nh'2S:L&u&ߠ2ZF ߉ 3"=CRq4-D az'懕Ujh"IT(Y2~vo9/G;sk^4AFFI
@TܖuF{*l$lYྛ^!M&Q#P>[
<im0%E26<ʺGVQ֐&
bdPUρH$IOہ?xHP*泹u3$ItƀEI|8 ۀ/u$I$8	IT$=<8I$I}$ iJz>[8	I$Ik+[Q@G	PB$IX4BqV(gs	P^d$ItWGI"iJERlH$Iz:?4B	R(ln*$I$=5FIid&P;;$IDKH(4 "I$U(&R4
"ln%p@$Ilu	"MB泹E$It/Q!MiJJ>[$IԽ6%&IADQ{$IS	0P@D `I$T $FL!$+䳹E@I$g$!Mi
Jf>[\$I >%HT䳹+Ӑ$I:Wxg[Hi
EI0I$3X42HSo) $IRg.DI"MiJEF`I$Ձ+$n MJf>[\H$I+xe"BXgss$I]$@j!R)|6xp:$IRY3JH-$Dj1Rq0-~8I$}l%H-&ԚV F$IjCH-(DjAR|6	$IԺƀ ԂBU(|6
 I$:wԢBV(lQXe@I$u7ˣ$Cja!R+|68x> I$[EI\Bjq!R(|6 B $I4%6"B8 ^	<I$iߋx=R ($I`R ^`+$I| x0JHmP*>$IwC`n)R	PT$m #I$M
a;Q7PԦ
bV I$
Y+QאT
bV M$IS>%qHmP*6BX@I$ȥׁBP(l`b $I̥FI<BQ(klnp&| @$Izfn%R:HT峹9@$Itx~7JH$D0Rn. G$I:tox7R	:PT,糹{g I$=@;:Pԡ
|6w;r$I'
(7!uJŃln>
t$I
xsk:X
p>*l$Io5QCp!R(l.8	I$	 DIH]P*gsNB$Il-QG!R)|bD$Iԍ%."uBx 
8I$u$ވeB.T(-YH$l .ԅB.U(<,$I6 GI\DR!R+lnzD$Iԉ6 GIH]P*䳹<I$uQoDr!(ln.*H$l .x#J|67x\$I.x#IP*泹K3 I$%$ކ"'J|6w" @$Ib	kQEO3
b-8$IR+K[7GII?#D*|6/$IԊR`("	HzRR1gs$Ij%M_DI<'")Jf> d$IR+h  %qIO)D*䳹{!W$I4jˢ$n iH:$R|6*0I$M2Q7tHB$BH>[, D$Ii QH:d!KT$ͭ.C$Ia7.QH:,![T$mbUl$I46%q 	|E$I4IL#7@$IC
	;JH:"!XTgs2H$H4x7XqQ(+l.=H$陨 _>%EqS(ln!e`&$I:#ǀEI\FҸ	4
b3-$I>Qב4B$B泹}EH$马%qI.@҄;Gb @$I?(S$M I$
$I5FII*D҄+l.ƀW ӑ$IneGII.DҤ(|6( <I4 %(G4)B$MBgs`1r`$Iݥ$!iH}W$I|EI"iRH2}sOf IԙueQDҔ4e
H> .f"IYx?L)U(la`%r`$Ia+A(ǐ4B$MBgs@$IRZ$n iHj)}>$IR{x+ZFR( r($IyQERK	r
b=-^F$m> \%ZNT(|6W N2H$X 7J&ZRw1H$2p( HjyR/N@$ijm.% Z^P(lnppp I4n >8IQ|"JHj+!NTgsw#I4v>% NT(ln9p'pH$X%qIm)@R$ITĻB$BXgswY$I6O+$DR
b g$IOxpG$u Ih,$Ip5("H8R/H$={k$ Hh}	$IO x;:VV(G|`R $I)(KHh!:^TLj`.p:B$IRj o  >$I6/GI\ARu{x
 I:]X| X%1K7 1 $ITU$FRW
{^| D$u&("HzRqw>aQHv7|@E$u I1}/~$I<i"I?P*gs08I./$ Iz} x50IԪDI0$)M~4p2 IZ^oDI<$= I:}gW @$Mp+(W#IO#@Qo_9\ @$M|N$Ha;$Id|<JHag"J$i4ǀv$#7x/	`6$i \%H8;x0Itj-G$^$ IG}x IW
.~%qI4{|$I:T+ 4$i|x+0Idx4$iWI.nI(4{xtwO!IF$F&R$M>7c$vFI"I @&Yo_ \|
An><%qID4E{z_><$uGGI\E@$M>w4V#yH9W EI$M Ij}0xp)0I>U(S$iHRӀ$Icp%1J&"$y$uՁ W ˣ$#I-&@ZXo4Eǁ=H:gEQW ImoJ/$IZ WwEI<$ Ij}<$Io)pHR;6	R$Ixˁn$FI$>w<FReH4VW?Jb$HRq' o .^$IGnp5=`_)$C7 /C÷
/JI a{x	/Cp`_)A$C ^d$'=\$F:Q$u>w,jWӐ$u&puv` Jb$HRqG/.^$Ԁ5(n I]oB7Y$Il'`ae$HRwo$n
$u I}pہ IR;Jwo(HR$޾^LCj#s$ށ$HPo߱E}	HZ /J IzJ}Ӂ ~$IS)?X%qIғ
$޾ 8x#v%t$I<|>DI"IzZw<pnl$I p/}Q@tX$IXo_p[%@ 6 ? n VDI\EHEol f!Iz&%7QoCt$I㪿o|-siHJ(?"`Ye$I&@4a{N~xp0$B=QoC4!$Iop&7TsQW$M IҤ;x?!ٚ6`p=0JH&M$iJk~%l @:~`w $n"It)M $a`V`y5$IS*@R{^\\$
,xIR$޾し8$,x? Ij} D&W%.$I-/@v{N^\8$Mx %q$mHZo߉E%S#Sw $N$ IR{p:b8$ۀ@,  IH}3^8dF`>p'4J$I'@{W 'ӑmj~Qf`uu$I-@U{xl"uk:x%1 Ij}Ӂ<J,0I
 +(HV$I?$9XIX%n$IO$=޾s884UxX$IO @iv> +֢0њb7sg *)ȇVH6Pc (uhRVYS]vWVu:Yz:;6o` d4^^NTToWՎuYmTޫXu:
  <$xZ~]muUTClV7ՙt> <C MF[Չ{r٪nUWgթt> <"C -+ձHN5ώEY}Q]NV?Wg٭ [2 d4~uUDVP'ߢڬnW՟3_٧c4 Oh:Z^ިV߭vTsSݬWՅ|I d4^WǪcxV-URlU[՝j:[V )0 Ohyu:^VUGj!jڪ.V立չ\ua:+ x3j2T#ϪjzzZjZTjT.Uߦf d4YWաPu]C<uZ֫Kz|y  d4~:XV?TՏ8ܮ>T?j^]g c &qZVWVKjZYmT׫OյjZmT/,  d4+CۆծjzZ^VjGU~P-U?vd۬UwOϪ[G՗յjQmTU׫W-ڶg  XMF2mhP5TCնՁ\NRnۗFնEբm-Y                                                                                                                                                                                                                                    O O+    IENDB`ic11  \PNG

   IHDR           szz  IDATxohu ?KW۩8/"PK(豶*W6hg^E餇HTOA/
7I|*o'Nݳ{nsχ@)@fYIDDF`P-t@fqJ 1UV@+(	hKET0c B	84sc4C pwhy8*+M@3651_ơY&<بR!#Ts$fkvKdae]UCG
Tb]_ϣϨ!VS")HCh#+"IP	b#Seh1k9{l|`3NkKZ"yhTe%J`Fá?ч]
F΃`K`؍Xi\3Z+%'92b1|8Y)ɥ)`yI`|wiAk>VM,bwh
2K&yR)ؗt؅v#V62`%)"DK^D("3JKA(Tt7X̡
DiO6P&)t7RD0e"|ǃ)m^x,GaI^$$&rD7f.˷q5*V㺇v䇟Q@H0I0I3t8MwjIAZf:=v=$S!* Ngd'0Un^QÒh5t'8K2,'zW&n }ѡTi!25ǩL\?piif	fcoe2Mv1h%)ZwxahFA& MDGͪe\af1l<8xn]U]py|Цzw/m8m>\Hah 9/ -)BD,@=bt 4CSPeDSfYoFN<    IENDB`ic12  ۉPNG

   IHDR   @   @   iq  IDATx}pyҤ)h)/if
(Lec=/:;_Oxn'wNMiQ/8ŗ"Vj=iH<;n.iPo|>u7i)j>P
\@ AhnD04E\f  1>O#CDeeDfz`9N	DS@CxXyd C]
ӣ-A4E= ,r<I&MT9%.pm4R) 1<,w<)I2gΪڀ$4E:`1Tp]by3-$4E]<lP~E2IhZl$pHDgs;Ci<
f$q9o$ $!k _1*s&܋(G'|$@cmk0.#	(cɱpcKyx$["rOmHc|L	Eu$&LRNK~v)+\H&,ɛRLs|LzRSBbpc0qnK-~T	Z'1~1#XDځ0ɒC<Efog+O1p4fV~ir$H>MQC">(Ƥ LiILv$o:B	O-&m)<<E~Hf[44F+t}hqH	)/fb]6/fUA 0E!E5EKS]HءFڛZI6&"$rfu!:^R$CTsHî;If78v$WXhFHiCSM'.a0w׽kϼID.?bAj&'M3!EST;PA{Nb|ͪ+ybU2^M:FZiӏ&yD0P9 WW̴+c8~>^x`%mdۜTLD:;N4	(?#MK[/ʊoaB%Lϙ };B Gm8!Nam
B&Ey(YPHɂ#_B ۜ)#S#ml;@͝E27篡zt@A\d)!ac[edIQ$$C9e,hՏw5a?,sヷ{kɂXK#${~$L?EcG\⤛/?ph$@^@'MW*H	lʫg5LtM :%DH8y4BѪ1X1;yh$kf34}yz"q]aZN)	ػv.yw`\`.iES E
y8aSWPtN*)+e7̌kt|@SmtRpMX0Yf}f;o"B$SXRIHl#D$r>f}>{U.($E}?1$[O
dBF:|3=Fgs;CD|m$#H`5icټD#줠x8dx#.i$xGOcV('DΘ$IĪ3äg>!1@&t}
a?BG'Ua7+<DXmf2xC.Gat*s&I"SM|RDJ'?ķm ${	$>Z>=q-/2Ȗ@7zO!Αz&XK2	XXI dD2&`h 5UŻ I}V)Mf_nq<IBƄڀ+ifY	=
l`,$j^\g0		$ڀp9ov`s=nG'4iz3ul"hzXyH CR`P<yɀ K4E- 
>O,d#b2@XyE!)x`.p%0P Abv;>Q4u$JB|y9묳N _[_    IENDB`ic13  %PNG

   IHDR         \rf  %cIDATx330TUB$5b59ͩI.wbŒ^ob:v FD	مYvOqe|H$I$I$I$I$I$I$I$I$I$I$I$I$Idq1BZ@/tx p7Y R@8 }`7Ȅ3$[	iA z
a O-@lz>e& c@@`-&V ˁeư1,I YFHViT8;X, H
R	iANf S8[+zDBZL2^#H%҂*0*p6Pt8a=C*)T!-ACˁH1$(.GO UHzskTxxx.GڐF EH B*F!`)o!-A*r /?R~R 7'#[a=b"@:b!-AӁ;୰1@B!-Aw'!Y-A|s8Hv`/7FJ VHvnT#QQXđ>C "p($'<#ҧҧBZp8;HN6GH%i*FfROz$ET<B$R*B!PT2]a=	*PH<
LA=ರDT{+'zJR!BZ"I|yx,KP !- 
$08-ϋcp8i$|x,	*9:W@~8PH_?T$)?*p+FaBZxI*	?+q	i\D$3>x !- BJ03ώcq@BZp(6p4TZ݁>h<S	"IQ\߈c1i@o$j>h<R	z!I_c!
i<($c |9xQ C_cqlDFBZ'&0I:ഀl4;MDHc$kLOG46b!-NF/pl6XŅ 
I!@Z4;H\\ũXXH <$	|wEXTH"@$ɞTഀl4cA*҂l`doX4b1*҂K|$=>h<(XϹ*O5=(X7b!!- j!?s\6d=.pRȪv,F cq,B"BZP^c1#/?j(cOĺVҲo?utWj;Atl57Xcb{`A?1Ȗu17]9ޑ	WX݅ 2xlb!-8xpa1BQUf)ۛ5YN6E**rg8S4T7euvi3MsN:JiA0:'r83>x<뗬)T>΄<iP}@jٖkƂT`R(@*,{}O]9 k7! Ƹ2VTy<v,( ЁT:PHګ|BQ<.q'O~`_Ve9t<řc8$XAaQ|XD aQfLSđ0LSqYHGSr=vX8&?
,lQW֏;53.;!RaU;K{P}X܉t҂+@,R]*cOVL*~5 cP-Tebq>X2S? cavz
qi'p+1h0f~;*<xLP) <0C~KgN8dRVG|
4N#\J l&h<2R)㱸&0I:a<ڈAZt2YD5xGrXvi`q.W>Q.
5
86;w7PWLAQl]/6SF*e҂`6pEopVӹdٸ|-T4	~fTJBb}v76 x4g2p6ٝRQ]*}ǻޕJUx;IIFNNL 9v@`uݻPjٿcĤQT\@_V+BZrP(HM]'ʡ[ؽKQTSQ8z0x+ܔ76s"02P( M!x=\˹{SuU\R3	%6"BZRS((P8~̺c4	+u `3(1w@E:"]{p%K\B!X=<<t?(1
iH
\1>SĮ)5\Xw_ĆB!-ؗR(/6estGrϬ1fq1\Oo3$gP5p%P"!-XA].|;ƫq]X[WGP-\XA401CZQ(3TVB(
_n{gtUPj;Q>XI,6V̤DJl)7^/Ռtsyxz*殦DJ  Al,	+ڳ<OT	3<pzpܨXQ榇єBi\
{*OH=N\OuVLbs*p%Pd!-(Kݟ:uu>B:(w.Owk68%!-Pd
7зauCǍ`_<#8z.`ن&Rd
6mǘ՝~9Ko3Wx3;i4!LBZP  wҥRǥqbpBZPk,p4`&5buBiT<ٞ !P]F&&@)Ldӊu؁RqEzaWs8Bq_;hJ1	`BU.bg[s8WBZbqQ$!-l^Z/Ve&|b
7y3Xe1f40ÁEP<3 I'Ӭ_+ۼj#-{)~j`N5L08"Q(8^kJ 8c"kġBLǁ0mY<
Q#8{,_ p
ؔmġ҂.@8@Oq.6ވ=ɤ䫿ڕ+k&peHP>`EP'`6V^B>U:jh}v7wEPSqwg'bV|Ԋ*.KUG p"ٝ8T@@!-Aq+ءogF:TWLd'(#MiA
Pz?79t6~|hn
U!hjEN"
P@
 nՂзQb7rW{hNwS4	6g)BPേ_#,3;/.=h՝j&0@JXيIG
7
17hnS.T?qݤڒ)j?xFTQ)fTQHp#DWzrؾ~xwxї1M#Ux;IJ,	i3GI
҂5FyWhnG)>ghA\@?&afXJ҂u@0C 
<mwO{?#y RQ^=s=n*{-,F (BaR=9V)Cny=_G{tQ<\\3*SL<
5(f(]PiC/paɕމQdo6ŠB .
Qe1kS,k10zcT6==T)1y4Z/]n){w6>Y G)tr@k *y
iAAjk9@1'rrQ״=zsX*^$L,D3>op?½,&2c"{^6,.pb`Ƹ"'8K[ 
t9>ذ4J{tSj;1H2IDt%O
WM;4Mt2[~}imn=q
z+anj=FSɓ@Ԓ7«_?dG׿t-TN(WC-le}v7!'t'G8f(|U)ڣRLz*5[MHэ<_CY~yFf;i(fTōtfa }FW"uHwnHW=g,%VqL#Vg"5H2RY9^JaъOՒ'"d`ܨHe`2;r{><_5R^TNeLֳ>U'SڭJ^}C]=dnj=3;Hyr?RtUI_0x5]HB*|h	/er2l#Ry_Pkg
i^Hb{n?RȟT3=tx{V^H&n$&O.B\p $ב6HyK'kCuLc,NoD*P<_auWj83*B3Z>C*I!>VTqw5Yk;S|G{SHB\.KE:T6=<\z5̸L+n"!"NxGC:nۖ=n/~`\rH<Ou#:
P+2x+	81tWZӮ:Kw>D\o7_vAH6Mm`]vQ[׉ߘ|4G5;Uiܾv'T*rVTiHb)벻h!csϬ|4>O.gE(
I Ng۩pӫSjgD2m)EQ!n{_ϑ1y4\v; <))G8*@W7F ArrF)_n\rh~*zM$GȗBaPB~I,aCv71z}?#%/WM*
01*
/e>ϩ08R*7_JEPӏc|p2K#P:pQMT e{ ,afZ㨆>|75borR2hpQTiU~\(TF3$4IcڏEMZ騆>/
>h#pQ(Tz!^T"X9˕]Ǘ?%qu3sIQaS DLQ!Nǧx4I3Te{8vXLC:d Ƚ@pjڍJ#%lH	!qYߟr8sz )BVR!&43[ym9q#Ts/&UUK].LT*

PTAT"d18Ruݺ'~ԳO#z٨J)n)`pc}QTF$>ڳ?sNG=_@XB
؊HW=Ng2[ymѹ[n}'@G;3 ;-H@a=ApAj%/%W3/ᮮ{AX_OzpzB);8X]m7y8=ۯcȸXR8;Bq,@Շy$<Bc5Ϝ-cЈr@Eif瓫x;pWWqh#{@=> Gr8 NI.ΟK؜m_:$z	E0I8R
aTTNab(O'>HR>z"qQ<o jg'8`ZK1tX#VJpx"Q(A>`Kn-AXn@QaШa8z`3EP\pj䝴3)sv0tB #BqCG)V3E8uL-ٖüH(G@lRE^$rLS*[?܂i!2-0!i ۀ)""
xtnL7lb%4Բbu]zӇC#9H	/vLTb9亮`bR="V'8SB-6`s]/v)mKؚku~8f`1EPda=basu0y+H4Mgmz"S(ǁ,6VTaef'XӸm?6mXU\xP(PUm%
>`w]~#XQ^ݱ&J@tƪd16rr5I3lZ[6Wmj=#BbSnTde,lĚlL*j:ac;(	4 6 B`kx4.vZ6c/Bla=DJA 93+%efeoǍg]%khB.JTJ(|~?0&U5Q<XI,ׄ]%Z7QU!cG AG0Y<C.fG(!``#&iQVgwXb){V.O~+=i،	S(l&CrKcNj&ב6s8K+ױar9lJLzLl$if)F+-eMfNoww_q#Q\rɤ39;G(5XF4"Ki2tF>]Ⱦ]MÁx63XH(AXpMiJ-efy%A%y-+/mf2P(w~3I)4Zx$u]TMq-<?(}6eP&a=A 6HP*2[ym4L^}]]l݅Ma=B(S@qbK^Hf^j#9ذ,ʍg^y(m&ާT( XX ö\3$W=4fϧ #&BQUaփҸm}JEx08՛QE!LLg>fNr-I3>`.ccԥ30r9A4y2S [mF38`y.HGn|
kZ-XN.:JcϿ8.z-}<X.)?Tů-dSǠTkٛXY]#:<,lKv&&a`0
ZRaLgqa{l+vJ,n>DD1>bjwH)^H"݉TL={YB=0h3xHH`Q)ରCQ@x)IXWvl5\b%MFRid/4)cp]|ؚ籰st 3`9>&[y!63Tb&\n=lgkUt0ǌϿb1I3Kڍ.+n&x.=H嵿)#z8bW.+-mXP8+G>X@4$,('z*FcY[Į-9u,*7Kl,?z),@:~
mL?2䘛Z+5,R[қ2|v3/bQwc*ǌg
 Nxy&X	ZZgjj1/ƂH#!xXL$kVJ,GBXLRG	,FbM/dˁz$(XPX$H5HRh<*d?Y༰YEXX4>^t$~n'0H< Sh<F c!H.bxHu-6bx,_#IֳH6b#x@!Iֱ8)G>FTl&>\Ixa=Qh<#@qSzd%6bSxlW\ xؔEu<I*&`FX,Tl.
s:$v 'JlN؞"pI*pRXT">3tT|+zd x@
F'#8Dt	G
ҰiaT(U`p"I~ #9Hp!-8x$a=pxlsP$})a=S xl_txN*Jc?T#I
|QX
҂ǁH,.T
|Ge{zdHPBZp"0#QT*\4o&*eGT8	LAr둕H%҂
pp	[?)tX!-nHv n둽H!>WHfL`6pcXE
iALCw[a=iAہ㑬}`nXHGD [H
df` :n1E -9h]`&B*,0nXHyHE҂GWݑJa0لT0TT!-X\\LR!L}A #HE#J"9( \\CjSA*>Tr!-_f=	xxsXdJJ UHV' ggT9I!@0!-()xgK `.:G!,#q	T`"{,6$KH҂*0 F# +`}Xd,I JH
04` Ni5 [ l zD!-A(7t:8THIh> a=$I$I$I$I$I$I$I$I$I$I$I$I$I$ITfD    IENDB`ic14  QPNG

   IHDR         x  QhIDATx	Uus٘˾a@"qѫjOjVjeiZYZSnYfn>V(2& e{^z2a=w}>AD^7@zHZV?҈7/zA@/j^@5PT1 Fh;N`;l6Mzu`҈&za`8.0C(ũxXVX؎ "9t=cʋ2`9Xkhi1HI^ L&,X,KZw#"= "ݒt Ӂz`ғ|xxxxx2tJӁY,`
P$>X<<<ҸyGySI
 H!kǁҸ?I׫fs@)fr11੆ƭ2t=H p<p0P#-DʐA$]
F6R2jW-)t80 xxq3"% RӁ@/D:o';ᆖ͈HH^088Ed -;)"tp08HlnnhilGHDLgnXB$|gF"b)I׫ D	^8c]HK׀ۀ->" R.6Q-HI^-p``)nK 54nC@D
@#Rz6 mhilF$`$] KӁJDJ_+p'p𧆖F D,z0$p R~2#W'ZA$Og"O  54fH%]."F>p`CKc2H,pJP "khi t=\D|q->"= C>	ɀ, 9`qCKH0짤0s@iiv
`eCK#" W|FDrm7--)D I׳PD$W ?ihiL#E.Hn f "Ap)xCK#"e餤"R(@𩆖5tA$]/|ED
j-툼HL4DX\"o &8H ?>Ҹ70pDح>444A7& Rnhi\>){I3H|GʚAZN"R|E-ket=Y DDf#Z}$]r74nFʊAFp࿁ш*<цF<HYH^<""TT&u۔jN#% %/z.pp8""oi-ˑft=
|臈Hl.~#%FJR*/_p
0 {)܁)9Is3DTVd$]  754HIt=}S	؉xMRl%]	 "l`R"^XSyRl%]o,k( "['Ret=ɯ-->Rtl$].nz!"`O"^T)*I_ B<``"^hS9)I׫n""3@=0={)ռ)
6R7x8386{)՜B
M~L@Dp $uO4! -zG "RIF0 %]}  6<-H᱑t= c HqxݳMfHAI|`#"R,h )Ռ)I3u倅H3O"^T)I׳ ""e0,{)՜Eg#K^p>"" `l"^w_S9FtS`!""o"01)՜Fc#I^)p""c<05)՜Fa#H^H""R~ %u4HH%]/
$)_c{Ri$l$nDDD cR$ol$o FDDa0&uS9䅍E,[7J 񺇚RY$l$璮gkK @D7Mf)ɩy;&{)Ռ䎍LzFDDމRxRHnXH.nlDD,:`aܰH-@Ch$'l%]/< 
'$u5#=FzTIkJ5c#=&z5ɈHO$ulJ5Ez녁[6H$uw7~t=\@m"^HSG엤k ɥz`k"^\S>_G lDD$,:8dH%]o 8:)ռ閤Uc|O~єjnEF,z6#8DD$(щxM,%6%IcK	={)ՌttADD
c.NK6 psF"f#t0p'0)4UDgM4l%]}ADD
p:{)Ռ=cO!""b`>,m%]oAޑ1##"=
#fOHm[J4 SN|"!D6ED6EFqJ4]HTS53ț} )N8Gn,}?cfO^bWj'"5qbbر@);MțJA:eQ39S>qةsټu,_t G'bC	!=HJoJ5FU!b}W}~C0ӏMm,b2iDͅXG26oTi47 fs[Rͭȿ7e`i#ƏbI˲s"W4\ϐakU481Pv5%ut〯i/~f|-zɡADvK&'uMM旑F~F:($Q?w}?H#R"8	8XtF84YpX"^w{SylKtɌce|2Nʹ%lߜB9=:vC煌.F&uw6ty5Aݟ:A#Ur)sٱu;+@SCHacӔހtx`YSy	t@/K	9t11LG{"*fBpl,ʊД@F s[Rͻ)sW_"]6ȃ"cr_4R4Ţz_H`S撮.z ]99Pӻ'ŞhY*#R,39>:J8X,Io@%)ռ2fSƒWE:^âϾP8DOqBSizf1m*+	LГ*0/ve)N)SIc+Sn9i9ͣcvH=旖ufDH7E'3Ȫ!l,;ٜݍtK/"{)L9(_	cHxx=4n*|lFX̎,NDɥQvod\SlPlh[,bg.:^C.َÁs6e鳋iۊHM0!ע&;#d&u778~C@e1o2nzBTX=#8Rm"Z1dO)3IT#6]39ȧ^̚w$tW/f	c,DC81׳rp"^wKSy7eĦ$]}"'1jL:t*#'߿H%n856	  %ͫ~ xMfʅEy|o%Hӎ:C oϢX=C^iUs2t=8 /U՜~9!TQ]ɬWl6H͑1#dl26/v,_,`\"^w[S9K('LBC~|򿯢>R_wǦ2-4[H882aS!mڻf2#3#Y*^_dDQh6dw!S7)q6e X9)(4
fxNaMdYDWǡQ(D;6Vd ="IlJ5S,J\Az̐a*۱{̭_vbLva(\
G}H)aIc/ G#=X3>z.Օ~C0{ޑ{uWHWM	a^4AP,/tEzL%u6)Um$pc*k?\v>NA3"D%M1Q =}8JEJ|DzLm8X']p:u:3Юz&8(&!l*LQQI3(5X>a0m"_;L?z"ofZxcm*(6H;F)AI3HJ2iGͤ9p54=g,"Qb^,0,jM&ٝHxMfcQ"=WZ1c9+yBVLgݗbWeE8E	(1I3jt ]9pTz(D˓gQb,Jtx$'zTTTWo~⇈ĢHy0a&sDx4RQiHx,JE	I>8HNTTRJ1$Ns*eČ\t=bQZ ' 9SYSE)9:cRZ,"#IFPc	!9)!%"zpUUR*+kk/%ZCJC؁TE!9eHDX	)HNŪb2cGq,_?
)nӛc{Sl:F(H8!˶)Ǎ⊆9c1 bNdRe"X$IףXHN`\Ī*Ku
)5VcrHh$raɹq pPH3a|+whvrvvXE$0/he!1GDFsjt&H;z(r\/"9+.?EUm5RjAA$zQ,XcUw}1G5Ϣ4ZɳWE(n'ɳAP.W8Smɯ9*2yщT0Y'Cɛai1"t=\M=M&A&r>Gn,5}z!۪Aԇaa"yvalEF}?cq|o2>Ƈ06Vd,W!)~Aj8b0ZN:tlFzVxѱ@̄!|"eQXݞ7Fxe}~qg*9+6!H#t!t&PfaQpbIH`bh bhU#oO#R,L࿐@޾yg3^=˲	c8!2qww yo3"i9HEsU,M@g0鬽~1s`!رey_p4jzBޚ&06~V5v$0xEƢ$]0	Lj6Ϙ?
}
8.206uHK`Eqđl~u{e7}ʚ*,M#Do߆
8"bQ$> JmF6Eg|[mʝTZ"[t="aQ<3@غ]{;pN=lY81᱄&n	@E8!ڻkBϼ>r4Ю朊w =O@gHX9@	lX?mq5`ʅ4&~+?ӓX _qyq896p-)ÁC)!	XHAX߼\x&HR69kCrc)8"`Q#cͲHϨSˬyGR;ZCrgsf7RPNN^΢ ch@zƜJJ	3?6wGcc!9)(#(po`ڴ훷!=c촉TTS*ٵ]Qh/{{4;VN(`I'#%ɲ/-Hϰ1SS,GM"M"焤UP,
L`Rp_ZaJf~l2s£ِى
Ea;0HY2ԗb5}[݁$B(PI׳j
:ڑQl,#.1Q$@
	IQ,
$E
ҶM[ٸfC|bRmEX;CC.6~;HS,
׉$?&g޾b:}Xǵ{#ZN)Xp"ʢp.FzƦu)t6EFqZt&oM&g(@(zHA[R2i쐃쟵WRj(G3#gu&	4S`,
Q@)hmd}Zd;ҼxjӗEzFqpl[ٖ݃0dQE
^6eFϲػk1GD85:*F
L,>R Y9QHQ@3֊qFl
F`aӜق9I׋P`,
d` R^޾{y)$c~,3̪E
S;֤SHш)0(B ݍ޾BwEpJ4A	!k}f{vh`.ƢEFx n8+6aXٌ(0$zQ`&RT?<H<r}l~m#AϢX=eȲ"):IE(,Ӂjl۸\t޶׷p0/2	!a}v'۳{X ~HY{v&(}
ΊTg(eH:bQXG~4m{[w;G"zY5HqɐfhN(I#E)i+K3V-W} IDp6ٽHњtJ
E E{EέWѺ{/Ǫdal9C0HjJo@ZF(3ſ;7.-OȢiy%)j8aQ8f!Em<ȿd2izv166FsbdD߁t=9)z7dYo,^}ȧ~vcӘB,XIףXAZW2lۯzbɡ,MUٝ@JB?`QR,A]6/~|1G'p\dalt,N# XCOmVU#?5e]$HiwrHI XiHhoxr{.;<q4z
,IoO#%`Q %џ=@۞VɆqE,~y!jEK)=c-RrJE,tA lݰ[ş~;#Y|hװqNt-lb[v/Rrj 9o2`fRHs7oA&!iBJsd
dUᑧ(UnꅟL:CLc	
BJ[Kf+gv"%@IHiW?e[?$?ܷرu;0		ԚR|UH	D@JV˒Wyg~lJA6~_d5azxG`!aef+eRHID,t=,?#P־+~E6%*LIx}%>RF%]/F5
"%U~Г:ypg0eHyYkRl `1q8>w~6f3'ޱO?Y\0Hl,dy)!Xcys$ū>~XC>T0ESgA뼞ى!X eog#e2~y-m#F:9.2ESjoF& Ic#кg/4{*jm|/mȐkYac"cRX&M)LcQHYy{9c8r楧.:m"G3~϶Fh >N6nS04|fټn:9;VH7"JFNo N@3>>M7m\}:^~%bVd$F`cY5
J 3)Ksۗ~@bTQó=?#;n'j('D3܎#W<ڶ)[#	EpF e[?%m{Zn[uN_Ύ3܎#Xn$ nY';q4zYWYt`1;2#4?lHN@,3)k4?;Z6~ _p	+ zY1Ψ,"e,R $]}>DZjVlfɕ]{ ݑ&88-:V%"o|ZwCd]x77`XD?gQ3q'-{~	ذj£ F[{x',a?5[)t^)6ZG>ĭ
ΌČp,"o!˃mK3]"  Ui7nW?Oh :Y"o@_~!ynIb3?7ڸ|9QL`y+k2)m_ț ',1 7fۯ!]p[ɇVg>4A;xm)Y|D `mݏL:CgoY8N0.ԟEzY5,>VDB?`OyGϓ>gO.^F>ѱ̋L$jD:Jz"opF_D=9cgy3{w+w?Coyщՙm<ٶwЇ X7"o#}WZ^S?w5>0>4+`U#;Vok"; `"vn]Ş+?塛.kȇ96:yDp2׺]vD:7pF/D:a|C_/{|cU2/:V"e@j	C0jO<'ё X͒tAF"]acs\t<'D&A+^lɶfD*z<sȳ
ϪDYUtL[_&HU #3@2)4c#U[ۺv?H7 C9b93H[kjgg
D߮DYt[_b[v/"y!L]1V?=/zf'"0C0" be3 HWmKXَHr?Dɳj+dZՈtW;m}VDzPh'D@8=~V"N{[ВފHg"%]		v2ۺDJCDdp"wpoV!R*<B؈tn{Z_vDJH	NrWlB8DrpX0,"ݵ)Z_b{v/"!|DrX D6k]R R,c8b	3є#m32"WaycOG$36 ~eEY=V%"Aۖc"K9 zYQΈM@v׺u4"҄LoSHwn֥ʶ!O9z#1b~l2*D煎m,C@+"66Dj6<Ҷ;^G@|!|.1p;HwMlA|"Z}`'"]`0̍ "]Z~d R` >ytH8骝~my%|0>"]',NJ2;4Y^Ǐ<+MCr]#f 	E0#	ÜZ`6<2?C9<.FOχiu6DAH=Ա|8r0_83l~x" Xc"o#lNN҄xc-۳䜁K|1C²mDV`-8[UtF}mKxm9i?KE+c\pͥ\|eTL9b:>w 8c#"oazxtlGZ9|p'?1#茓?x&˞ob#6 `lFMkCб;.fsv7fYǜ}2WqCǌl}"6 `lD*M1=~jkѶtrw/.8E~q>a"ouxM._6=|0@.ҟ1iӸD6 `vՈS("o煎<޾%ל)<S.<''q9Yt"l" 3fNx"oe]/?mZ!-ײq!zJ(}p4m2"Y`RcqBd<"ofu&ŭ{gEz3>7|8@raQBDn=  44:E?
7L*l]L*\ĢۗSӧ\:>p"khi	EpV#em݋aN{[D
:6tz9d,&ל|P8!8c#0ՙmm);m1#O?}?Օӈuxϑ8gRfGתD2dycL\U]y1N:cA8墳x'X5l" iARC#=~;wm+kcwyCP"(|B1Hj! Y	Aʆ072Zm/+Fَ=P$L!2g:ӏs?f:`R6ƅ3H[x}5Z.t
>O<O۞V"8>*R6p";V~ٺgW!KM9/{#1B NxiHy	E@ZUl"mEf#+[ɵP$Y|UؗBv{`_hhi$(Z+p|d{3w}Vrm!\~W8IlǦŪ*XEHYr_0;F._-aM:Ecuʋ̙?oV"ea9_Ϯb3)O͙-ܼ9֤SZ0pU5'b%gcA!X@AJHlR^2dy}/%OPǅ_$ǹ| .^, Y1,GJ 1v?۸Eо,>dYG/<+\e[,l1HIkihiC0	)9AǪ6l{Vrw/bs(%Ωg,a)R^"`{)Ij>HytJ~w1;ڸ	[<~üC^DJ)}vl{rͲ-N<og\zN8Df$H,۪`)}k)n<-ZeMx9y8̲-N:t$bfuHIPsoz$@h)b`]QX"W>]Y).XЅ%J$¤!'sK?߮He93g6ҸKpa#L{iS?|6&4.`#ufː1I-ƕ5%Wta#j3N[^Ϥ4AC?E
&"cJaiL[rX@rm2z?uFGRB&"S[G	7 @8]Ơ!iVƎ>~<O؄b @"/21P4EȯF*s?at?Bg?8HCM8l"wjHc\9m%l,csw/vHL9iM+"6QNigK>V(S?|qWYŹ#a{	Hr(6}ݦ}<S0P&~y罗G !a$['"W3-H<*ވ1#yB"o!a+n$sF3DWbs+6Ҡ!3~,B+,&$lBZ'"iܛ_sŗ	0/wHrznB&\!bD>n.as p}y{mA"B&\)G:ciFBSLϭ)RFW=m#=sgcYIO"68DHdL{ry C|+1	H%N9CDNX@؄{Y`!-$qHtV2!GL༿swZr"ME"c3Q$-Cə/\ࡃ;g!3i!|`#h9	&Ǭ|N`asyHL~Ɍ@'	K؄r`/	qg,nkʻ=NÐ:b'D"XD؄{%	$Fڃo@©DL09#C;ypz	#Ѵ`#78]e,+n`Cs)H$s* 0	ǁjG9cp1@;sKY">XτI1~ҡH蕁	!r}o	-#Hxha-kț2a5iH9-'N:`#!d^a"fEaO͝e(m`	Ew'Л!lk6 t=/,2vWÆ 1]'c6ZMHلr`J;*2s
kx$) 1=$vR6!^a(~v]ܑ[ʪRhim蓎EBk{EB&f 	{82mܕ[ QwnzBp[ CBc5V+2W\.lH3e2JyMW f"r=8;Nn-auiQk(KHuL|4--Hq}	!d``ii+w喱?s,GcԸ10		9DBc=)`~S6dǑhimHr6!^X{R[ۃN喰F߹#',9hp ;ǲmAj J+LQKeft7RG$ށ&la!#u7jeՂT_֔_ɓT04wf4GBc0 J=HтTז ôb6,J/.Jwe[H(^RW#HJ/f_3l6,_}7܆Q#>jRwn"&:VKeA)r_~
i*C?E>ݐC=nRw/Kp} !u5˕ܚ[_O3떦,1!uw{a-H݌!}Wlr|6x/CUpq}o0"}e
ܗ_3 VwG]r_ޘ1!6s`l ۲KT>.<7)0H/>$ԍ~Qb=5H]
O72=nS@^!'_{oFTFzf̄Hݤǉq}
ALpsYXDAzR0w&vCQ#^Ndy{/Ur{v)[*?+>UV>ykG@"L#l"td@YX[+DqV5Emx%pb	ycG@bd8&=X\LA\,1wr_]ƞ;:b2৮E6ѵXH`me7wdҁNj
,/qhԂ3DMD 7!RGE*-gf.EΔ{w_P߱,,BM(h{H#Rܓ{ŭdTfˎ!86-ȀKD{Y ;#N~-Mqychfmc;62`~^f} 3&܊y5Mk[?!#2 8s}o70
Y	rgnK0$<J\l۰DMc"5WB1Vwpgn)+Hxm\>̟8IPP.+Ei+QL9<_C;O|亳4 0
Rs34 ("5U0eŮ;rKYUځA$gj:[4 
}q f#57eByw喱78Dצ5ik<y#chdrJbMp} efrD#˛23y, їovQuwt!5 ׸ lb`R3YSQ:-5]Hc1W~򫼼z#;Ӆ<YMq} &" KJ[+Ai\6n~ch$;1w]߫@lϳ,&$oJȯbna=e ~̏.lAEׁNf4]T])(ܚ[K=HY0i񱯐^Fp`^&j*4ƴT]wP`2f.##k|¯1c}&<`ȦgoeHT)q~%O6`)KLOWsڽuRu*MZ܍TUTR$6Wpkn>DǞWX4E߾4(ʤI+Ze=0,(mbN~-SFd̃si<N=˶|6ǌ+ US>nMcA74S.ڛ\EDn;Hl{Z`R5{DAi%l*G^xjH-XN|yA%@whd6opR5{n¬Bō<[IwP@neLN*
auf~l48xOHUtyLunn90WTq%^h:-@*.%cHU:`d}esDvoYO18:0~]߹&`<O!UAX	[|r/5EDje}\+qaβmHU<EphL$c%`Z&PoM+Y_ރALv[ΜQ#/mb-3~ q}oM¦ * ˻=NDZjrR]@=mX;4&ʤI#}V4Nj0V/ R/l'ם儩SpZ#b4/\뢉84T&Mǐ~P{iw	/[͚E+9qF@u/9э7S4ġ	%cIH9؜2`0,`f>EgG$lns3d;cb ڼ?cgˀ^&ЄRIˀ/ '9SAG`SKyS:7Q&@$
yL''NBKkgX]{&dӼ?B,ktRK;N-aui'HU* ܿ=ZZ9)/I94T&M2x,Cd18-م5t""Q^}	6IeYTS>k~N!Gdp{yCKed,,`!3%Nk=jɚ"kXRBA$"KIgBˠVeݒy쎙H^94T&!KZ9e!TÖJ+^@cHzO/wOaԸ1TÜ[aZONe43!K<\Dzjg`XXĜZrH93ēu1XE_%n&vv#{49!Ig nS#pnS(m`iTb/`ߎݜ|֩j/-~9>36M\׺*i%4cO(W^p)֦گ;rJe$cHW2L+`ʈ4<3c.#c8c,8W ^'[?Rd,4yNn=!Vo䙞_N"ͫ\*ٵi;'ѩ2쯟YO! _r}98k2uXbp:c!vpb=<[ j:ŏ=O$6qo&~u8k+wNerIqH09Nm=?T&,lDyL'˰9fd,]~bAzlIk82B2X|hAzh*1d?{7W)WXbΠ!}Ӿs6nAz":Rd,a"=v qJX.Wٺa3Owx~c:;%A%@z{݌!ySXb^ HΔcҔ	9O?[	[ֽBStyCmG	H`ș"}8$H r}o=-2d,UB LG=%y[R4XbpDD$u}-NDD$ls}/X*H/DD$]{1Go!""aH8H2idDD~{WRIp>p(""RkOׅI*.$cO{>'gLzo2X\ ""\<lZ3CH8H2i`p&""RK\AA-Id,$p
p<""Rsp}TE*.'cG60DDR\@A&I瓱c'1H5l>jRt&K."""|HU9Hե2Xb9pЊEǑZyPBDDz=RRLd,
 ""p9p{Hm8Hͤ2ibXmR3RSLd,1_ _w}/@jAj.Id,188y# ^9L:HIDD=\^2`Rt%KN NFDD~c6Ȁqʤ+Xbpp""aBrȀrʤXbpp""aS uʤXbp:p""e)rH]8Hݤ2r2Hs\^T&]NӁこil]!u uʤd,p$p""^Rw
L:HqTDD˯K\+# ʤM2 g""fWABAB%I% 6"" WWgPqIe$c|hAD$Z7R*&K  ";]CBB=n`p""gPsKeۓă 	｀DB*>%N	T&M2E@"A"%I@p "Rej_\+  ʤM2X ""2:~^DDZ{m
pp""%3-C"A"-IN'#"R[ $$Rt6K<2p=%:sʤ+X)``""q "p{e!XHiM ލH,>ދHCqʤ%cC 	i@{[ )Il`#p.0 <Ґ,N nDD-UHCsʤ&cAkUϹix4m<f`""|{Hso`!" XHSjYqH oXHSk9p`!" O FiYHkcF\
,D~=vp#QBD<+mD"=f? EDno4D~B8H|o;1p2"끯("oBmۆ _DD*|{YDނHێ~ |0LmD,Dz=+>'ND q}x[+%*`"2~^^xX20D
ρw}o"}d!O6^q,p58H:*iY /<	\,t} R"Uosog#"}^*x|rj`{eDjBm-TD,t}HYx[p>o{ E WDd Xx+'H1u@"uo3H+?  R"uo>At w?ֺg#i[XD~.DBB$mC_Z20	^	x\\LD$ .p3=HHYDD{m4g%{A_	Xp}/HXDL{N.>XM@ x}GNxx"e! m1EpD/f`!Ҁm.#s99>`{i0"=68~`4"\CQY4xπ6Ҍx<~DHjN  W@	Yo&g8
hAl <`{;,Dum  aVOD5,Dm,(,=Y`0`!`X <,|",DOm#S8ЊB,u "f!"Uo$SwSဍD 
`HUXHM($x88P9`7x	X{eDf,Dnm#c8p4p4`p$0&&|w}	x
L&8`0QH`80@	t `?vN+\CDBD"=+,^e*	8^5[y^0*"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""ov>N}    IENDB`is32  ރ W W W WW]W\WW W\WW[W  W[iΝW  W΃~WXXWXXWɅW  Wιj[W  W[WW\W WW\W]WW W W W  ! ! ! !!)! !(!((!  !&#+-(!  !j',--%!#r*- *! *-*r#!%--,'j!  !(-+#&!  !((!(! !)!! ! ! !  E E E EELEHEE EJEEGljE  EIO{lE  E^[EGnuFEFupGE\_E  El{PIE  EimGEEJE EEHELEE E E E s8mk                  ..       yz     yz   ..      ..   zz     zz       //                il32  o W W W W W W W pW iW W_ZWY]W WzkWfpW W ~W|ƀ sW W kgWZ fW W ]g W Woǃ W  W]`[W  W^gjW  WjÄj^W  W\a]W  W ɃnW W j] W W h[Wg kW W tȁW W WnηhWkzW W[țZWZ_W W iW pW W W W W W W  ! ! ! ! ! ! ! C! #! !+%!'-"! !O;!"*--$! ! Uc!%,- $! ! ;6!!(- "! ! )#+- +! !@%,- '!  !(ܠ((- +!  !+#+-,#!  !#,-+#*!  !"+-(((!  ! '-,%@! ! ,-+#) ! ! #-(!!6 <! ! $-,%!c U! !#--+#!;P! !,(!%+! ! #! C! ! ! ! ! ! !  E E E E E E E aE OE ENHEFiHE El[EMxSE E q|EZ UE E [WEGj ME E LNz ~E E_[ cE  EKMl}GE  EMN{PE  EP|OME  EH}nMKE  E e]_E E {PL E E NmGEV [E E U\E} qE ERzOE[lE EGkGEHNE E OE aE E E E E E E l8mk                                               00                       ww                                 ]^                               ]]                      uv           ..  ..           vv                      ]^                               ^^                                 xx                       00                                                      (  v        (	           (    00     ($    @@     (@  B       (  >         (  f (                                                            E!WE!WE!WE!W                                        E!W/E!WE!WE!WE!WE!WE!WE!W/                        E!W E!WzE!WE!WE!WE!WE!WE!WE!WE!WE!WzE!W                 E!WzE!WH!\E!WE!WE!WE!WE!WE!WL)]E!WE!Wz            E!W.E!WE!Wi(m(G![E!WE!WJ(\E!WE!WE!W.        E!WE!WE!Wl(-{+P#jI&[E!WE!WE!W    E!WE!WE!WE!W\%--,_'ɾjE!WE!WE!WE!WE!WE!WE!WE!WF!Xu*---p*rG#XE!WE!WE!WE!WE!WE!WE!WE!WG#Xrn*---u*F!XE!WE!WE!WE!WE!WE!WE!WE!Wjɾ^',--[%~E!WE!WE!WE!W    E!WE!WE!WI&[O#i{+-l(E!WE!WE!W        E!W.E!WE!WJ(\E!WE!WG![l(j(E!WE!WE!W.            E!WyE!WL)]E!WE!WE!WE!WE!WE!WH!\E!WE!Wz                E!W E!WyE!WE!WE!WE!WE!WE!WE!WE!WE!WzE!W                         E!W.E!WE!WE!WE!WE!WE!WE!W.                                        E!WE!WE!WE!W                        (      0           	                                                                                                                                                  E!WE!WYE!WE!WE!WE!WE!WZE!W                                                        E!W%E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W%                                        E!W E!WmE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WmE!W                             E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                         E!WlE!WE!WF!YJ"_E!WE!WE!WE!WE!WE!WE!WE!WP.aJ&[E!WE!WE!Wm                    E!W$E!WE!WE!WW$w,T$sE!WE!WE!WE!WE!WE!WlOz|bE!WE!WE!WE!W%                E!WE!WE!WE!Wa&--d'E!XE!WE!WF"XE!WE!WE!WE!W            E!WE!WE!WE!WE!W^&---u*K"aE!WqE!WE!WE!WE!WE!W        E!WXE!WE!WE!WE!WN#g----,V$umZ:jE!WE!WE!WE!WE!WX        E!WE!WE!WE!WE!WE!Wq)-----f'|bE!WE!WE!WE!WE!WE!W        E!WE!WE!WE!WE!WE!WJ"`|+-----v*^9sR1cE!WE!WE!WE!WE!WE!W        E!WE!WE!WE!WE!WE!WR1c]9qt*-----}+J"`E!WE!WE!WE!WE!WE!W        E!WE!WE!WE!WE!WE!W|bd'-----o)E!WE!WE!WE!WE!WE!W        E!WXE!WE!WE!WE!WZ:jmT$s,----L"dE!WE!WE!WE!WE!WX        E!WE!WE!WE!WE!WpE!WJ"`s)---]%E!WE!WE!WE!WE!W            E!WE!WE!WE!WF"XE!WE!WE!Wc&--a&E!WE!WE!WE!W                E!W$E!WE!WE!W|blOzE!WE!WE!WE!WE!WE!WS$p~+X%zE!WE!WE!WE!W$                    E!WlE!WE!WJ&[P/aE!WE!WE!WE!WE!WE!WE!WE!WI"^G!ZE!WE!WE!Wl                        E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                             E!W E!WlE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WmE!W                                         E!W%E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W%                                                        E!WE!WYE!WE!WE!WE!WE!WYE!W                                                                                                                                (       @                                                                                                                                                                                                                 E!WE!WE!W0E!W0E!WE!W                                                                                            E!WE!WxE!WE!WE!WE!WE!WE!WE!WE!WE!WxE!W                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                            E!W^E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                    E!W]E!WE!WE!WE!WO#iE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WaCpE!WE!WE!WE!WE!W^                            E!WE!WE!WE!WE!WG![,k(G!ZE!WE!WE!WE!WE!WE!WE!WE!WH%ZN+_E!WE!WE!WE!WE!W                        E!WE!WE!WE!WE!WR#n--z+O#hE!WE!WE!WE!WE!WE!W[;klPzE!WE!WE!WE!WE!W                    E!WE!WE!WE!WE!WE!WU$t---,\%E!WE!WE!WE!W}cqUE!WE!WE!WE!WE!WE!W                E!WvE!WE!WE!WE!WE!WN#h-----m(G![E!WV6g[<kE!WE!WE!WE!WE!WE!Wv                E!WE!WE!WE!WE!WE!WE!W,-----{+P#jL)]E!WE!WE!WE!WE!WE!WE!W            E!WE!WE!WE!WE!WE!WE!WE!We'------,]%_@nE!WE!WE!WE!WE!WE!WE!WE!W        E!WE!WE!WE!WE!WE!WE!WE!WH"\}+-------n(M(aK(]E!WE!WE!WE!WE!WE!WE!WE!W        E!W.E!WE!WE!WE!WE!WE!WE!WE!WP#j,-------|+O#jM*^E!WE!WE!WE!WE!WE!WE!WE!WE!W.        E!W.E!WE!WE!WE!WE!WE!WE!WE!WM+^N#g{+-------,P#jE!WE!WE!WE!WE!WE!WE!WE!WE!W.        E!WE!WE!WE!WE!WE!WE!WE!WK(]M(`l(-------}+G![E!WE!WE!WE!WE!WE!WE!WE!W        E!WE!WE!WE!WE!WE!WE!WE!W_@o[%,------c'E!WE!WE!WE!WE!WE!WE!WE!W            E!WE!WE!WE!WE!WE!WE!WL)]N#gz+-----~+E!WE!WE!WE!WE!WE!WE!W                E!WuE!WE!WE!WE!WE!W[;kW6gE!WG!Zj(-----M"fE!WE!WE!WE!WE!WE!Wv                E!WE!WE!WE!WE!WE!WqU~|cE!WE!WE!WE!WZ%|,---U$sE!WE!WE!WE!WE!WE!W                    E!WE!WE!WE!WE!WlOz[;kE!WE!WE!WE!WE!WE!WM"fx*--S$pE!WE!WE!WE!WE!W                        E!WE!WE!WE!WE!WN+_H%ZE!WE!WE!WE!WE!WE!WE!WE!WF!Yi'-H"]E!WE!WE!WE!WE!W                            E!W]E!WE!WE!WE!WaCpE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WO#iE!WE!WE!WE!WE!W]                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                E!W]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                        E!WE!WwE!WE!WE!WE!WE!WE!WE!WE!WE!WwE!W                                                                                            E!WE!WE!W0E!W0E!WE!W                                                                                                                                                                                    (   0   `           $                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  E!WE!W'E!W?E!WKE!WKE!W?E!W'E!W                                                                                                                                                E!WE!WIE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WJE!W                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                            E!W@E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WA                                                                                E!W E!WwE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WxE!W                                                                     E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                            E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                         E!WvE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Ww                                                    E!W?E!WE!WE!WE!WE!WE!WI"^X$yE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WrWW7gE!WE!WE!WE!WE!WE!WE!W@                                            E!WE!WE!WE!WE!WE!WE!WE!W`&-i(F!ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG#YE!WE!WE!WE!WE!WE!WE!WE!W                                        E!WE!WE!WE!WE!WE!WE!WE!Wq)--y*N#fE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WV6gɿE!WE!WE!WE!WE!WE!WE!WE!W                                    E!WE!WE!WE!WE!WE!WE!WE!WE!W{+---,[%~E!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wv\E!WE!WE!WE!WE!WE!WE!WE!WE!W                                E!WE!WE!WE!WE!WE!WE!WE!WE!W~+-----k(G![E!WE!WE!WE!WE!WE!WH$YE!WE!WE!WE!WE!WE!WE!WE!WE!W                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!W{+------z+O#hE!WE!WE!WE!WF"XȽE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                        E!WFE!WE!WE!WE!WE!WE!WE!WE!WE!Wr)-------,\%E!WE!WE!WkNyE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wa&---------m(G![E!WT3dvE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK"b----------{+P#jE!WkQ0bE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wm(----------,]%E!WoS}E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                E!W$E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK"b,-----------n(H!\Q/b¶S2dE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W%                E!W;E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WY%z------------|+P#kE!W{y`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W<                E!WGE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^&-------------\%E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH                E!WGE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WY%{,------------`&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH                E!W;E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wy_{E!WN#gz+------------X%yE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W<                E!W$E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WS1c÷Q0bG!Zk(-----------,J"`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W%                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WoT}E!WZ%},----------k(E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WQ/blE!WM#fy*----------I"_E!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WuT3eE!WF!Yi(---------^&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                        E!WFE!WE!WE!WE!WE!WE!WE!WE!WE!WkOzE!WE!WE!WY%z,-------o)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WȽF"XE!WE!WE!WE!WL"dx*------z+E!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                            E!WE!WE!WE!WE!WE!WE!WE!WE!WG$YE!WE!WE!WE!WE!WE!WF!Yh'-----~,E!WE!WE!WE!WE!WE!WE!WE!WE!W                                E!WE!WE!WE!WE!WE!WE!WE!WE!Wv\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW$x,---}+E!WE!WE!WE!WE!WE!WE!WE!WE!W                                    E!WE!WE!WE!WE!WE!WE!WE!WɿV6gE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WL"cv*--t*E!WE!WE!WE!WE!WE!WE!WE!W                                        E!WE!WE!WE!WE!WE!WE!WE!WG#YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Xe'-d'E!WE!WE!WE!WE!WE!WE!WE!W                                            E!W?E!WE!WE!WE!WE!WE!WW6grWE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WU$tK"cE!WE!WE!WE!WE!WE!WE!W?                                                    E!WuE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wv                                                        E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                             E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                    E!W E!WvE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WwE!W                                                                                 E!W?E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W@                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                        E!WE!WHE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WIE!W                                                                                                                                                E!WE!W&E!W>E!WJE!WJE!W>E!W&E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                (   @              @                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              E!WE!W0E!WJE!W\E!WeE!WeE!W\E!WJE!W0E!W                                                                                                                                                                                                        E!WE!WfE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WfE!W                                                                                                                                                                            E!WE!WdE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WeE!W                                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                        E!WE!WkE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WlE!W                                                                                                                            E!W'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W(                                                                                                                    E!W\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W]                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                            E!W[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W\                                                                    E!W&E!WE!WE!WE!WE!WE!WE!WE!WE!W\%W$wE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WkOzyE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W'                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W{+-g'F!YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF"XF"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!WhE!WE!WE!WE!WE!WE!WE!WE!WE!WM#e---w*M"eE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WR1cƻgIuE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wj                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WZ%~----,Y%{E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WoT}sE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                E!W~E!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wb&------j(G!ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                            E!W	E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wf'-------y+N#gE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WU4eE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W
                                        E!WaE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wd'--------,[%~E!WE!WE!WE!WE!WE!WE!WE!WmP{E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wb                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^&----------k(G![E!WE!WE!WE!WE!WR0ckE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WR#o-----------z+O#hE!WE!WE!WE!W}d`BpE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                E!WaE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Y,-----------,\%E!WE!WE!W_@oE"WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wc                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wn)-------------m(G![E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WT$r--------------{+O#jE!WF"XdFsE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                            E!W	E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wu*--------------,]%E!WE!Wg·E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W
                        E!W+E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WP#k----------------m(H!\E!WZ;j^?mE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W,                        E!WFE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wb&----------------|+P#jE!WH$Y~E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG                        E!WWE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wn)-----------------_&E!WE!WdFsE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WY                        E!W`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Yo)-----------------m(F!YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wa                        E!W`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Xh(-----------------s)F!YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wa                        E!WWE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WeGtE!WE!WZ%|,----------------o)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WY                        E!WEE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W}H$YE!WM#fy*----------------a&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG                        E!W+E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^>m[;kE!WF!Zi(----------------N#gE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W,                        E!W	E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W¶gE!WE!WY%{,--------------r)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W
                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WcErF#XE!WM"ex*--------------P#kE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Yh'-------------j(E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                E!WaE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W`AoE!WE!WE!WW$x,-----------,E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wb                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W`Ao~eE!WE!WE!WE!WL"cw*-----------O#iE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WjR1cE!WE!WE!WE!WE!WF!Xf'----------[%E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                        E!W`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WmQ{E!WE!WE!WE!WE!WE!WE!WE!WV$v,--------c&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wb                                        E!W	E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WT3eE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK"bu*-------f'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W
                                            E!W}E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Xe'------d'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W~                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WroT}E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WU$t,----]%E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                    E!WhE!WE!WE!WE!WE!WE!WE!WE!WE!WgIuƻR1cE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WJ"`s)---Q#mE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wi                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF"XF"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wb&-,E!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                            E!W%E!WE!WE!WE!WE!WE!WE!WE!WE!WylOzE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WS$p_&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!W&                                                                    E!WZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                        E!W[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W\                                                                                                                    E!W&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W'                                                                                                                            E!WE!WjE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WjE!W                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                        E!W
E!WcE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WdE!W                                                                                                                                                                            E!WE!WdE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WeE!W                                                                                                                                                                                                        E!WE!W.E!WIE!W[E!WcE!WdE!W[E!WIE!W.E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            (                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           E!WE!W+E!WOE!WoE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WoE!WPE!W,E!W                                                                                                                                                                                                                                                                                                                                                                                                                            E!WE!W0E!WkE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WlE!W0E!W                                                                                                                                                                                                                                                                                                                                                                                            E!WE!W]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^E!W                                                                                                                                                                                                                                                                                                                                                                    E!WE!W]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^E!W                                                                                                                                                                                                                                                                                                                                                E!W,E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W-                                                                                                                                                                                                                                                                                                                            E!W E!WAE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WBE!W                                                                                                                                                                                                                                                                                                         E!W E!W?E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W@E!W                                                                                                                                                                                                                                                                                             E!W(E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W)                                                                                                                                                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                    E!WDE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF                                                                                                                                                                                                                                                        E!W	E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W
                                                                                                                                                                                                                                            E!W)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W+                                                                                                                                                                                                                                    E!WUE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW                                                                                                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                    E!W
E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                    E!W
E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                            E!WSE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WU                                                                                                                                                    E!W'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W)                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[%~H"\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG#XnE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W	                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK"b-|+Q#lE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WV5frWE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                    E!W@E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wd'---`&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wv[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WC                                                                                                                            E!W	E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W{+----q)I"^E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG$YJ'[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W
                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WM#e------~,S$pE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WX8isXE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                    E!W$E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W]%--------c'E!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wz`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W&                                                                                                            E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wj(---------t*J"`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH%ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                         E!W:E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wu*----------,U$tE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[;kE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W<                                                                                                    E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W}+------------e'F!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W~eE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                 E!W;E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W,-------------u*K"bE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WJ'[F"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W=                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W---------------,W$wE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^?nH$ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                            E!W&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!X-----------------g'F!YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WkF#XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W(                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W------------------w*L"dE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK(\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W,------------------,X%yE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WO-`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W	                                                                                E!WUE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W{+--------------------h(F!YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WǼE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WX                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wr)---------------------x*M#eE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wx^E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wf'----------------------,Y%|E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W{E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                        E!WUE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WY%z------------------------j(G!ZE!WE!WE!WE!WE!WE!WE!WE!WE!WhJvE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WX                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI"_-------------------------y+N#gE!WE!WE!WE!WE!WE!WE!WE!WG#YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Ww*-------------------------,[%E!WE!WE!WE!WE!WE!WE!WY8iE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                E!W'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wb&---------------------------l(G![E!WE!WE!WE!WE!WE!WgE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W*                                                                E!WcE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK"b----------------------------{+O#iE!WE!WE!WE!WE!WF#X¶J'\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!We                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wq)----------------------------,\%E!WE!WE!WE!WE!WI&[·E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WT$r------------------------------m(G![E!WE!WE!WE!WG#Y[<kE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wu*------------------------------{+N#hE!WE!WE!WE!WE!Ww]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!W"E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WR$o-------------------------------,\%E!WE!WE!WE!WE!WV5f[;kE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W%                                                        E!WFE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wm(--------------------------------l(G![E!WE!WE!WE!WF"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI                                                        E!WeE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI"_,--------------------------------{+O#iE!WE!WE!WE!WE!WlPzK(\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wh                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW$x---------------------------------,]%E!WE!WE!WE!WE!WO-`mQ|E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wg'----------------------------------m(H"\E!WE!WE!WE!WE!WuE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Xr)----------------------------------|+Q#lE!WE!WE!WE!WE!WbCqF"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH"\x*-----------------------------------a&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI"_y+-----------------------------------o)G![E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH"\u*-----------------------------------x*J"`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG!Zn)-----------------------------------|+K"bE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Xf'-----------------------------------|+K"aE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WV$v,----------------------------------y+H"\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF"XcErE!WE!WE!WE!WE!WK"bv*----------------------------------r)E!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WwE!WE!WE!WE!WE!WF!Xe'----------------------------------e'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WmQ{P.aE!WE!WE!WE!WE!WU$u,---------------------------------T$rE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!WeE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK(\mQ{E!WE!WE!WE!WE!WK"at*--------------------------------}+G![E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wh                                                        E!WFE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF#XE!WE!WE!WE!WE!Xd'--------------------------------g'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH                                                        E!W"E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WZ:jV5fE!WE!WE!WE!WE!WT$s,-------------------------------M#eE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W$                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Ww]E!WE!WE!WE!WE!WJ"`s*------------------------------n)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WZ;jG#YE!WE!WE!WE!WE!Xc'------------------------------M#fE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WŹJ'\E!WE!WE!WE!WE!WS$q,----------------------------i(E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                E!WbE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI&[ĸG#YE!WE!WE!WE!WE!WI"_r)---------------------------,G!ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!We                                                                E!W&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W~eE!WE!WE!WE!WE!WE!WE!Wa&---------------------------Z%}E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W)                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WY9iE!WE!WE!WE!WE!WE!WE!WR$o~+-------------------------p)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG#XE!WE!WE!WE!WE!WE!WE!WE!WI"^q)------------------------,F!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                        E!WTE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WgIuE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W`&------------------------R#nE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WzE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WQ#m}+----------------------`&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wz`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH"]o)---------------------m(E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                E!WTE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WɾE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^&--------------------w*E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WP.aE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WP#k|+------------------~,E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W	                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WJ'\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH"\n)-----------------,E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                        E!W%E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF"XkE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W]%,----------------F!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W'                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF#X^?nE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WO#i{+---------------F!YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                E!W:E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WJ&[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG![l(--------------E!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W<                                                                                                E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W~eE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[%,-----------,E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                     E!W8E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[;kE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WN#gz+----------z+E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W;                                                                                                        E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH%ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG!Zj(---------q)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                             E!W#E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WzaE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WY%{,-------e'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W%                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WsXY8iE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WM"ex*------V$uE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                        E!W	E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WJ&[H$YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Yg'----,G!ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W
                                                                                                                            E!W?E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wv\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW$w,--o)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WB                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WqVV5gE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK"bu*-U$tE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WnG#YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!X\%E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                            E!W&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W(                                                                                                                                                    E!WQE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WS                                                                                                                                                            E!W}E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                            E!W
E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W
                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                            E!W
E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W
                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                        E!WSE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WT                                                                                                                                                                                                                                    E!W(E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W)                                                                                                                                                                                                                                            E!W	E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W	                                                                                                                                                                                                                                                        E!WBE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WC                                                                                                                                                                                                                                                                    E!W
E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                E!W&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W'                                                                                                                                                                                                                                                                                            E!W E!W=E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W>E!W                                                                                                                                                                                                                                                                                                         E!W E!W>E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W@E!W                                                                                                                                                                                                                                                                                                                             E!W)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W*                                                                                                                                                                                                                                                                                                                                                E!W
E!WZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[E!W
                                                                                                                                                                                                                                                                                                                                                                    E!WE!W[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[E!W                                                                                                                                                                                                                                                                                                                                                                                            E!WE!W-E!WiE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WiE!W.E!W                                                                                                                                                                                                                                                                                                                                                                                                                            E!WE!W)E!WME!WlE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WlE!WME!W)E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        (                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               E!W E!WE!W E!W7E!WJE!W\E!WlE!WyE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WyE!WlE!W\E!WKE!W7E!W!E!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             E!WE!WE!WDE!WiE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WkE!WDE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            E!WE!W+E!W`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WaE!W,E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!W	E!W@E!W~E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WBE!W
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!WE!W.E!WuE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WwE!W/E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            E!WE!WDE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WEE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    E!WE!WCE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WEE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            E!W E!W,E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W.E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         E!WE!WaE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WcE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!W"E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W$                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    E!W E!W8E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W;E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                E!WE!WEE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WGE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                E!WE!WFE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WIE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                E!W E!W;E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W>E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     E!W'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W*                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!WE!WcE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WfE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            E!W-E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W/                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    E!W6E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W8                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            E!W%E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W(                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                E!W E!W\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W`E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    E!W
E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                            E!W"E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W%                                                                                                                                                                                                                                                                                                                                                                                                                                                                    E!WFE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!WE!WoE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WtE!W                                                                                                                                                                                                                                                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                    E!W!E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W$                                                                                                                                                                                                                                                                                                                                                                                                            E!W*E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W-                                                                                                                                                                                                                                                                                                                                                                                                    E!W/E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W2                                                                                                                                                                                                                                                                                                                                                                                            E!W2E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W2                                                                                                                                                                                                                                                                                                                                                                                    E!W/E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W2                                                                                                                                                                                                                                                                                                                                                                            E!W)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W,                                                                                                                                                                                                                                                                                                                                                                    E!W!E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W$                                                                                                                                                                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                E!WkE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wp                                                                                                                                                                                                                                                                                                                            E!WBE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF                                                                                                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W"                                                                                                                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W	                                                                                                                                                                                                                                                                                                    E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                 E!WVE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!ZF!YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WL*^E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[                                                                                                                                                                                                                                                                                            E!W!E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wb'}+Q#lE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK(]F"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W$                                                                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG!Z,--_&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WaCqw]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                E!WzE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W\&----q)I"^E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WqȽE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                            E!W/E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Ww*-----~,S$pE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WM*^Z;jE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W3                                                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WN#g--------b'E!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WeGtE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                E!WzE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wd'---------s*J"aE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE"WwE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                            E!W&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wy+----------,U$tE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WO-`X8iE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W*                                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WL"c-------------e'F!YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WiLwrE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                E!WYE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W]&--------------v*L"cE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF"X}E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^                                                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wm)---------------,X%yE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WQ/bE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W|+-----------------h(F!YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WlP{R1cE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                    E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI"^-------------------x*M#fE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF"XsXE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W#                                                                                                                                                                                                                            E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WT$r--------------------,Z%|E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WR1cƻ|E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                         E!W1E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W_&----------------------k(G!ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WpT~E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W6                                                                                                                                                                                                                    E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wh(-----------------------z+N#hE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF#XøE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                 E!W:E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wp)------------------------,\%E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WU4eE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WA                                                                                                                                                                                                            E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wv*--------------------------l(G"[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WtYE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                        E!W9E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W|+---------------------------{+P#jE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG$YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W>                                                                                                                                                                                                    E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W,-----------------------------^&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WX7hG$YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                 E!W-E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W,------------------------------n)H"]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wy_J'\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W1                                                                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Y--------------------------------|+Q#lE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI%ZK(]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Y----------------------------------_&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[;jI&[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                        E!W~E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Y-----------------------------------p)I"^E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W}dF"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W,-----------------------------------}+R$oE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WJ'\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                E!WSE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W,-------------------------------------a&E!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W]=lE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WX                                                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W~+--------------------------------------r)I"_E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WmQ{E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                         E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wx+---------------------------------------~,S$pE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WnR|E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W$                                                                                                                                                                        E!W{E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wr)-----------------------------------------c'E!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W\<kE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wj(------------------------------------------s*J"`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF"X|E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                E!W4E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wa&-------------------------------------------,T$sE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wku[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W9                                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WX%x---------------------------------------------d'F!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW7hE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WL#d----------------------------------------------u*K"bE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WT3dF"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                        E!W4E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!X,----------------------------------------------,V$uE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WsXɾE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W9                                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wt*------------------------------------------------f'F!YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W{bE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!We'-------------------------------------------------v*L"cE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WqU~tYE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                 E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WT$s--------------------------------------------------,W%xE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WR0cL*^E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W#                                                                                                                                                E!WeE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG!Z,---------------------------------------------------g(F!YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wj                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wr)----------------------------------------------------w*M#dE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WxE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^&-----------------------------------------------------,Y%zE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK(\^?nE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                        E!W/E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WJ"`-------------------------------------------------------i(G!ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WfE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W5                                                                                                                                        E!WmE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wt*-------------------------------------------------------x+M#fE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wr                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[%--------------------------------------------------------,Z%}E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK(\Y9iE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                    E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG"[,---------------------------------------------------------k(G!ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WT3dȾE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                 E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wi(----------------------------------------------------------z+N#hE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW6g}dE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                E!WNE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WN#g-----------------------------------------------------------,[%E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WT3eH$ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WT                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wr)------------------------------------------------------------k(G![E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WL)]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WS$p-------------------------------------------------------------y+N#gE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF"X~N,_E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wu*-------------------------------------------------------------,Z%}E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WhKwE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WS$p---------------------------------------------------------------i(G!ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WN,_O-`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                        E!W1E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wq)---------------------------------------------------------------x+M#fE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WpE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W7                                                                                                                        E!WWE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WN#h----------------------------------------------------------------,Z%}E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W_@oJ'\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W]                                                                                                                        E!W{E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wg(-----------------------------------------------------------------j(G!ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WJ'[~fE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH"\~,-----------------------------------------------------------------y+N#gE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wz`ȾE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW%w------------------------------------------------------------------,[%~E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW7h\=lE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                    E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wm)-------------------------------------------------------------------k(G![E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG#YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                 E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH"]}+-------------------------------------------------------------------z+O#iE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WnR}G#XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WR$o--------------------------------------------------------------------,\%E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WQ/b[;kE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                E!W#E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wa&---------------------------------------------------------------------l(H"\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE"WyiE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W)                                                                                                                E!W8E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wo)---------------------------------------------------------------------{+O#iE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WdFsE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W<                                                                                                                E!WIE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG![y+----------------------------------------------------------------------]&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WL)]H%ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WN                                                                                                                E!WXE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK"b~,----------------------------------------------------------------------o)J"`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wv\R1cE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^                                                                                                                E!WfE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WO#j,----------------------------------------------------------------------,V$uE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wk                                                                                                                E!WpE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WS$q,-----------------------------------------------------------------------d'E!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wv                                                                                                                E!WzE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WV$v------------------------------------------------------------------------r*I"]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WV$v,-----------------------------------------------------------------------{+N#gE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WP$k,-----------------------------------------------------------------------,S$qE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WN#h~,------------------------------------------------------------------------Y%zE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK"cx+------------------------------------------------------------------------\&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH"]r)------------------------------------------------------------------------^&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG!Zn)------------------------------------------------------------------------^&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                E!WyE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^&------------------------------------------------------------------------[%E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                E!WpE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WP#k|+-----------------------------------------------------------------------W$wE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wv                                                                                                                E!WfE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH"\n)----------------------------------------------------------------------,Q#lE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wk                                                                                                                E!WXE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WR0cw]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W]&----------------------------------------------------------------------,K"bE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^                                                                                                                E!WIE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI%ZL*^E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WP#j{+---------------------------------------------------------------------x*G!ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WN                                                                                                                E!W7E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WfHuE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH"\m)---------------------------------------------------------------------k(E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W<                                                                                                                E!W#E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wg|F"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W\&,--------------------------------------------------------------------[%E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W)                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WZ:j·R0cE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WO#iz+-------------------------------------------------------------------,M#fE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF#XpU~E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG"[l(-------------------------------------------------------------------w*F!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W~G$YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W\%,------------------------------------------------------------------b'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                     E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[<kY9iE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WN#hz+------------------------------------------------------------------N#gE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wƻ|cE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG!Zk(-----------------------------------------------------------------u*E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                        E!W{E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W|cJ'\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WZ%},----------------------------------------------------------------Z%}E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                        E!WWE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI&[`BpE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WM#fy+---------------------------------------------------------------~,G![E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W\                                                                                                                        E!W0E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WrE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG!Zi(---------------------------------------------------------------c'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W6                                                                                                                        E!W
E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WN,_N,_E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WY%{,-------------------------------------------------------------,I"^E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WiLwE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WM#ex*-------------------------------------------------------------e'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WM*^F"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Yh(------------------------------------------------------------,H"]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W~M+^E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WX%x,-----------------------------------------------------------b'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                E!WNE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG#YV6gE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WL"cw*----------------------------------------------------------~,F!YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WR                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W{aZ:jE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Yf'----------------------------------------------------------Y%|E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WƻU5fE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WV$v,--------------------------------------------------------t*E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                     E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW6gL)]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK"bu*--------------------------------------------------------L#dE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                        E!WlE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Xe'-------------------------------------------------------d'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wq                                                                                                                                        E!W.E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WhE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WU$t,-----------------------------------------------------z+E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W3                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W\<kK(\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK"at*-----------------------------------------------------N#hE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WzE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Xd'----------------------------------------------------b'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                E!WcE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WʿE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WT$s,--------------------------------------------------v*E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wi                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK)]T3dE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WJ"`s*--------------------------------------------------H"\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W"                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WrWsXE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Xb'-------------------------------------------------W$wE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                     E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WfE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WS$q~,-----------------------------------------------f'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                        E!W3E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WǼu[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI"_q)----------------------------------------------u*E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W8                                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF"XV5fE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wa&---------------------------------------------,F!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WV5fE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WR$n}+--------------------------------------------M#eE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                E!W3E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WtYnE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI"^p)-------------------------------------------X%yE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W8                                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WzF"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W_&------------------------------------------b&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                    E!WzE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^?nE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WQ#l|+----------------------------------------j(E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WrWE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH"]o)---------------------------------------r)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W"                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WnQ|E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^&--------------------------------------y+E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                E!WPE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WZ:jE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WP#k{+------------------------------------~,E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WV                                                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI&[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH"\m)-----------------------------------,E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                    E!W|E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W|bE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W\&,----------------------------------F!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH$ZZ:jE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WO#iz+---------------------------------G"[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH$ZH%ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG"[l(--------------------------------H"[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                E!W+E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH$Zx^E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[%,------------------------------H"[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W/                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF"XW7hE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WN#gy+-----------------------------F!YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                     E!W7E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG$YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG!Zj(---------------------------,E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W<                                                                                                                                                                                                        E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WtYE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WY%|,-------------------------~,E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                             E!W9E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WU4eE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WM#ex*------------------------x+E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W>                                                                                                                                                                                                                E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF#XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Yh(-----------------------q)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                     E!W/E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WpT~E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW%x,---------------------i(E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W4                                                                                                                                                                                                                        E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W{ƻS1cE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WL"cv*--------------------`&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                             E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WrWF"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Yf'-------------------V$uE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W"                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WR1cmP{E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WV$u,-----------------J"`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WQ/bE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK"at*---------------~,E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                            E!WVE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W~F"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Xc'--------------o)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[                                                                                                                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WriLxE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WT$q~,------------^&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                    E!W$E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW7gO-`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI"_q)-----------L#dE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W'                                                                                                                                                                                                                                                            E!WwE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WxE"WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!X`&---------y+E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W|                                                                                                                                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WfHuE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WR$n}+-------c'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                    E!W-E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WX8hM+_E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH"]o)------L#dE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W1                                                                                                                                                                                                                                                                            E!WvE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WźsE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^&----s*E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W|                                                                                                                                                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Ww\bDrE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WP#j{+--W$wE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF"XL)]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG"[l(y+E!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W!                                                                                                                                                                                                                                                                                            E!WRE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WL)]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG!ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW                                                                                                                                                                                                                                                                                                E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                     E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                     E!W>E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WC                                                                                                                                                                                                                                                                                                                            E!WfE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wk                                                                                                                                                                                                                                                                                                                                E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W!                                                                                                                                                                                                                                                                                                                                                                    E!W'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W)                                                                                                                                                                                                                                                                                                                                                                            E!W-E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W/                                                                                                                                                                                                                                                                                                                                                                                    E!W-E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W2                                                                                                                                                                                                                                                                                                                                                                                            E!W-E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W/                                                                                                                                                                                                                                                                                                                                                                                                    E!W'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W*                                                                                                                                                                                                                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W!                                                                                                                                                                                                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                            E!W E!WjE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WnE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!WAE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE                                                                                                                                                                                                                                                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W"                                                                                                                                                                                                                                                                                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    E!W E!WWE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 E!W"E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W$                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            E!WE!W|E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!W2E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W4                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    E!WE!W~E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                E!W)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            E!WE!W^E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WaE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!W#E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W&                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    E!W E!W7E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W9E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 E!W E!WAE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WCE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                E!WE!W@E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WBE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                E!W E!W3E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W5E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         E!W	E!W[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^E!W
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!W E!W'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W)E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             E!WE!W>E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W@E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    E!WE!W?E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W@E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            E!WE!W(E!WpE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WrE!W*E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!WE!W:E!WyE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WzE!W<E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!WE!W&E!W[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[E!W(E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            E!W E!WE!W>E!WeE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WeE!W?E!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             E!W E!WE!WE!W1E!WEE!WWE!WfE!WtE!W~E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WtE!WfE!WWE!WFE!W1E!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             PNG

   IHDR        Ir   	pHYs  .#  .#x?v    IDATxMR\Ƕeׇ@ Z5uFptG ԫQ:*Fb0_lķeW?~>rx:UVO       l       '      @|       h             >       4@                            @|       h             >       4@                            @|       h             >       4@                            @|       h             >       4@                            @|       h             >       4@                            @|       h             >       4@                            @|       h             >       4@                            @|       h             >       4@                            @|       h             >       4@                            @|       h             >       4@                            @|       h             >       4@                            @|       h             >       4@                            @|       h             >       4@                            @|       h             >       4@                        FIy?"#bw~يu&|E.   >   FBwEg^6"n3   `t|   z[7=N,ab   `c|   PR~v_O    Q>   k%◯i_v?   "  j% 9X<n/Ǹ3YLoN   5|   f:åL^~i{o  |  Z
OJ{ؼ+C  0R>   I̡W6~    zj)?c\/m   ='  4^w4ֻxrܿ?bzgr   m  d񯮻qSl  A  ؠPUohus  >  wP־}  5  iCW#s  x  l?U`~ ߸]1  x  ;[OzN>  >  0z%'{`3D}  #  R7zf  h	  ``0̛  P	  `l9]Az|SVM;G    ғwh$F1-}W  #  dU ՓoK  h  4gc   Z#  [tcv= pk  xu Ɇ̩   $  k'cW>  )>  rK$"L  wa	    v` f    <=SgטY  ?"  UR^ް?0% x'AH e>  wpd* vK1    cUR]z; U  |  eR\ ]	  A e qCv>    c z){;  D [K{ F=    =TR_
8C /sC ~ '\ mw>    +) Xǫ/v A>  4g v   `˖-x|77   G -()/E#g  4B - `CYD; иzd1;,  X?  H B  `D{ `|  X  V@ FJ  D{ o<h  |  xn= ?/ 	  O/ *b>    x=h _5]̿3S    KJ5w~l  ֦҈ |  F|> []̟>  c& 0J%pw @nk|  H `TJʏ޵ hu   w z{    +w {/3 `h|   류}  A Jʇq| \w>  & Ku{W й]ʿ1  F WJʏW  /	  h^IyF3  V  h @l b񱾗g  F ) ؀n+ h @l % h ض !ow[7 m ظqD۶ QW]̟, M ؈nݴ?m @O/l 	>  kUR>Ԥ /zC `]|  ֢m`  V `|  VtM 0`   kwM>  ctU׿t   &  z}  E U\  r>  o" "%]  /wUC  x k# 7! '>  SR]&τ  `ew>   K}{ z}N>  |  o  |  $ XI    0B%o  B~?N; 0> Hw޷ }]bw A ~]q  KB> 	  U}wM3 R֟9R  |\7{  /  05wG  Fn_8r  z|R߷ `nF c> @O3  9r
 @  =#  /p]_ zB 	  x! G| wg=  B> @  Z
ώ3  VD h   ! A> @{  `>Gćbz  K "  h e>   @\ E> 	  @O  [  lHIp   A> Ϻw$#bϬ  6@ X   ! `|  Bba  "%㈸ !¡  N5wGf	   > 	   stf4  ' RIyS  /  B=  }7F < %c^   n  ?  @Ip  2H N Y.|   VF
 - `II")"  `n _> aG  Qetf 	 Uc  ]Ed1q X	 (ww  @3>׍;G  NI^/  ~n( c" QR>_ 8u  ^=,  }eϑ  襫g 2 )  > H |^w   H s]d  n{    u zO z;   Tχ L z|ֽy{   6 H zs߅  wk/  z]~O   /pg B z]x|   j; Z& M_DĞ   J TRޯ   X
 F |   6#k @3\  V h l  2 M*)wWp]>   w] l lE.ۺ?p   4n_: `| `JʻuW  aݵg! I RR>  8yI 6> v%_~   @\kgN X' X)  0 kȿs : Z	  0 mK
  TIy7">Fĩ  0`W58d `U~6I `UJgq#  0G1O | J#  `6 ! RR>n`$  >#Oӻ x xaݺ?0A   mƟ	 Z> *%݈39   G_jȷ  XIn   <FK ^B Uw5-   xn| #> C  `%mq D nw_*   UV6> 7?	 TI$"n{   Xύ x> u]    a ֽx   a | 9[    | 3[    | #[   4 0R6`dl  @lH[#ԙ  @o #PR>x    `lխs  R%  UR>ˈs   05_:R  ml  `>GĹm|  n_Dās  3G sa()GL  ZR`l@ϕw[G   Fn  =VR>   FzC S6}w=ީ   7 "@ϔ#⢾s   =5_  =RR93   >Gd130 h =PRޏ   kFd1 g m+)E\   ި{z 0 Шn}g   U}@=> 4|Xs>   ׈i  S͹    ka4 AF+?~L   s O"F   6 "f%s [VR:   `˾m|W %%ze3    q'p> lAI,"=   И *)FDwe   `CJʇqa   g  x   ND|u> l| X#W   J} X3 ĕ    R     ʕ F6`\   +`| X~D\ں   FRx: +`J'1  |l;+5G   `Dę+| x=   _kw> +Jq#   |dVR>3 x= ^   L>/ ^ B/f   "ݕ'Ƹ y6Jʇ{   +9B > <6=   tW ?
} ǈՌ    VKDM;;{qd>    +u]#X['{s   `-g
g%o	 d=s   X]K +*)_Dĩy    lw^   yW0vK݋    ]| F/| {    M.> 
} F1"~u    M.> $0*ˈ8r    M?,7	p> Q߻    н?/);. B`J'58q   ZR>sd #   TRpn 7)   U}q0D> TRue>    ֈ?w +aD܈    -nO/ C#0(%峺y{   |W0(   |,g!ED:M   Qbz3^+)+w   0n]?,> UR>x   @hVR>6 Jn~	   PDג7%ީd    ԧGSo@^:5    ^sDO;| z]?ub    uD @j޻?pZ    mDLӹ2oдaD{    a[))" -hV@5    =v"kIh@    ʧE> ͩ>9    ䷒К
 ͨN    pǓΰh@JʻqGN   hx?   ׈?7|  lUI0"=    [- $55w{N   -"ג `[| ~~0   V|*);  l\L   },( lTIx   @/ dxNM   bz X7+)FD1m    zH`#| ֪YD4    =v'tXo6%}   *):P E`-x   ԈPX~V?    ty}-)9U VM`J'=    #I`| V~`]   `$a*?=<<& V'   `>OS | ޭ)c   :-)_8} > R?"    ė8,wF[ x    s"> o
} D   :YIyx x- J1D    ﳉ{    x;yI x) x    or_7sl,    log	 P`1   D| ^D)   <Fcc |R1!    X%3{| F   $=>    `#D| F/=    l7| T?(!   F E12	    
?	 #'   @D| |1   )]Ŀp$ %x    M:K!    &02=    0B>    +"> #!   @/ #"x    &0p=    0>    0(">	 %     &x    &00=    0@>    0*"> !   ( "x    Ec59\    IDAT zL    MS =f{    `ɧ! =eJ'    S>@#b;    \3=    !G{    D|zB    @ox    }DOӹ!>@{    gF &4=    N">@ ۼ?pF    
 $    k"4Lhx    Y/w 4Dhυx    A"4_	    ">@c|Fx<    :Oz =    E;J Lزx    l٩}>x     L    hPv` VR>?    hԿ&m|a5    hاz( d`    =?t 6>w#R    zdV  `j6    `s|Y    =E	 kVR   ;">	 kT    EK	>>{    `` k AI,"c     ?:XXV|)    0p,VHXaD"b\   VHX~D{    `D#x:y`Jʻq)    #}':N6ީ    F6"'  og>    Mݱ=|w()_Dĩ    ta o'QIL    /u	7ޠOf    7%scxJʇ[Ncn     _6>+ PRޏx    "3YLF2xnD\     /6>u     ^[R <CxrNӑY    Z536	 ()Gĩ9    A]|()E   ?{[g}$vfo<i8$8).<4} ;0pKaZ$J!U\f!")b76R,*Z6#4Ump;NP-?ۄ_=1Ix~^U?|>c8'Qήejjx fDjS     ̞ÓG `I^    [!ÓG^4ZSp${CO    "A* N#i\     &Jp$v	    @UTP%Jx"%     hՃU j2(BA     ${Oq(=>PzI^޹    @s<eB(${CO    +eV2}     zz
@i%Q| '      3 JIR!/>    @()[J%!:    @9<yi|T@TNzz     Va(@iT     \]Reޙ4d     S=P
|(Bm    J]@)($B4    @}x+LZ!{    P9<yD>PX*J7    0($>PdHC6    P=J"DN    (Br>P8I
!7    (O"
zы    (<UEB(GO    J.BErz     S=P|(BM    JE| (!<k     A>k| ת޿{     BÇ'h@^9=     UOW~ ȭ$w      Uio@^	\Jx"%    I3 ܁NU    pzx@\]|     ÓG^6( /TysHx    ,>I!1     fi(C
}      ='WBm    0}c'hx@i=     އz` @%Q/0jK     ,P!YBȬ$B     5t#| @&Uk^    @-"@V=-    Nv>E| s{    @25*Lq=     >| S@f    &p>*,q=     >| 3@&    &IWd
}{    @9<yE $ZKb	G     hBcI>l@\!
   P,=oI4M{C;m ȓg~7   vv_vt_V/1 oBlh@S$Q1$=u׮Ucw   0\Y>Jh`O{xÓG5ќZ?t䁼?C}j⁻=  hmIp/PxEO 9VXh|Tk r#g|[o02  JgᎮBzw &	|TD3u o9}?w}P8v=;  
-=Uuaop<<@ yÓG܉4@TTyȬ5>uO~_  ȫKY1JXe@=D"j@tszi;Ưh  p+k­S\|zZ {mh>Is=Gs9}
:;;  Ƚ2?qz+iޗCeFuWz<3mپ-|o?  [;
-\tW;(=@]Uk<BNߟnz$|A   rg[@cSa :D$P^ w>IM_w|@]*   +Gۢ-r'$Z'ӄ<;U_k7J}   һkQ?KZVem  (g{@0] >{uu{* ,Z_|EM*E>@=D PN wҊkn]R  ȒTDוakk+ZNUء$Ԝ j}ШyO7앫   9V.mثXc@WTԔ5DLȳΩFO|'Gc  "=E9uc@#O"P+N5S!k4%O=P!  nepce)}8ub%vh *[jERZ?d@]wMM}i;   @MM̟֎q%>PId@' {>n3  LZpڛ>姚  rn4⽖Ԃ Xju;~e-  ji2%[9 5hX(>P5A tOQ  peM&*g>P6 *}`$Q+G;Կ{T  s;/qř?dPX)%NE׮;^g  ,]"JV8o2J j3'<g|8,|."Og>   [+#é*a8D/5`^$Q70jz@?ݻ#  >|qEBP̋
}`TE  'د"wݟρuxlHS̙|
c\  @j[@cS2* jF>0g|`N(ާ:(F>  SZtѶU>P(i+BZCP}}a¼qx_m(w  wt][fRZK2J jf<]	̖ C'+^|Zg;Ư  ek]!*g(Q̚ ju~/8O|#xp* `UDוakkqC-+3* j9`yhpeaמJ}  (W=#j,mXcNUld P8?R,5}HA>  _Z+
Y?uދX8Uy	sRQZ+mK[  O+ۗ2&xX(Uy	RU|.I>  KZ#SeS+fp|a J8'>p.
idǧKJ}x5  Lғ;/.PeEԆ*}TEջ7K_S   #̿2ZiJ^	@ͩJ||.M[~`x{Oe  @W֔2&kދUL<g?&Q  MV<2&jS| @us>J>  4GZk$\ҲfF(J%Hx DRn* [+#'eSǅ}q 7D9U($wz~ggG_.  %	S|@Dqz~4R?7i}O>7	  zQ9J
ҫ 
?ς Ph.}aSG  u;6̟5%U@US??iJ}  2?mPv0Y3 Kx|Y}\sn  0ie]WƷ ZemOX[. J,^Oe0xՐ=׀J}  Jh7XhE,<DFCPȎOs KOOt]2%XԔC	%Q<BxKCg~W_+G  `.^dSur7;yw<rP|REW:YvMxoO  jk]~:Za_#rB{6\g_xp +^CPg?VpTC$Q1{svO>  e4ر*N7CUi+@OOy <P}}R @tݗkm7+J~;T(	>Hiue14v]7J}  nepce8u\ؾt(J_ه e"Hxyl>'N78<ݯjA  "I+ol
Z}5%+Ɓ2Rc>P|(' J!=~e7tJ;  #}	R1 z\(	>@ŻB;(9_>  V	8k($B	((m![o_{QG @Wք[+#N}|V
Lŗ>o@|sgKWy\>  0]_la(UP||($7d@
&  dE*s @	V
JŦ:(_jR 9nؤ2?-PZ$Jxo$e1{  dIZt6@]S>(){>yr8@<b9s_xWo}  4AZ~}ڍ?g{'O}@y<C8t@xJ|Zy0<'>
  l2_xOkڝJP E$I8Wo UZo=>ϗ}  4JRe~]ؾ# mz.P |(Ovl)rW} p XxE9V.5s>@WV(>HBv
ٖ T P/c]w_Cv	ZOZ] PIT bQ @-MWom\= az.P |(' JŤR X2܃pSP|(u;(;t#e  sV4\hs>)CIkC1G ]Z-:;;>  cepce8U(T r.}!~{qm}O> *TȊ%e@^JrN9D@A%@aͺc(RS CTׅTWrJvD@]MeA tie%5к# 8Sc|ȩt;6]	()  Wք[+#'TJ?Z%QrJ	:NcS^ӕuO @;/q^r	i ؗDE C'VߣR +/iYiݜ  ~'~wy@!gOpuFw~]> @mPG~
})f"9P}rF^&<7T LZtѶjTu3-SSSv9Q}Ra'g|H8{ϐ  rlp}:yݿ2sx!s|pœr gP ȿ2M{+}W>Dia_ KMR O*󙫏Aa@>!O+ذT/<r_ah  vpGUeU1kږ&Q<`6}|ȇ' 87:lپ-|o68 Uc]w]0>YAW}"NY<h4KWy<  2dY[%Lt]^h-˪V'agc&W}23	2]* 2"9"eV/5Ds
2NV}n܎ fo?TR :ZUSSkSpCIOd m ]:ӡ&T 4%ʰ|j@@J Q'F+֛5R q;V*TSs8p鵽{	ejjj cO.;<ytwx'<<~?d  5Vs]j3ZwpÓG^6''!
έw/'	M +۲k|!1k c3"W}#  50\Y2Y٦F`Ɠ(3(>dρ3 -~`x{O>s  V<Jh7CB0kNC!C(ޘ>f' rMG> {F%-+M 0kIOd } 7^jR4J} K+o.ro8"33j ֚C3 8+Y$|ȎCv0;N?lӕ{ Ջz]W'90{(d 2zL] UgRd5=P u;6Jh/(Ȉ|9Q &>{9XEu9ّV거y  V'a- S.lw`DAs	Vl`VqڙlI+=J} t+[[>i) s>4 z~ ͪ&F&R    IDAT De>YTxc#:=ܭߴ, @-k+UyZZ8M$&#3n s֕C jaOHX> 6>4 E!?Ju @!u/B(J^ka sܠ9'v=u.25re5g>j ri2kHTZ<p0OIO4 1 8O>}ߣR ʶ%v0(Ve&5wYF95;V BGk{}|rҲ?xXU\S d%pj!wA )|h,>4P~35G! hcUIe>Q @=NCc	}@e(
 @VLW_h|
( 50Jh>4H{X!'E4]c: Be>E>8#Ut!5]ឃU 5\Y2[|w
C fFضl7E" *=_2«Ԉ |p=NMP|K/_}q @ݤ{F%-+RX>@7&ԗ {YƝJ} [+#'T̗Ҩ,l9`P_|}0NȪFI j|(Z$G{Yڻ4) B^ԫ2 %wCLMM/A?-@<bKIx}_YQ  s i >sxs
>ԏ' Zy0<' 82? ":CTOߏ-@~+	M QZGUeAvXz.CC}x _лנ7wl
n(p- 
's>~&gP LSVC&%;d r
3P ]Be>6 ujL5DXz R ik]~*fq
jLI3:貋cR[V	]WZ5ª֥P?!>Ԉ ݻ̄aJ{>nad P@ie$A
zr
jH	3  3mwɇB_ @̇Lgd$P#|osV1 P *aa4V ԝSP#|OYZ̝J} ȿU*<@a @> OGk{}ivPi u>Ԁ e u&pP }I2Z0V>@L` N4FeIICLW=* *T y>, Ɠd @.Ã P_=`h	, {\eP׮	>]W/ 4|e )|X >̟' /ܧR hFe> P42'>̃ @ѨK+wv_U E>̓ Ǔc @I+tKZV:4@rh,Y
̃ (N4V2UH*[+#'TL (2a0w{+֛84tE"92 $9$Q<B73 J>x1~}̇L@9s$ P:9_> ̓|ȆUgh0|%2۲}[T sV'*JxC9}$}k2`*`V/wt][ fM=@sp١R m[@cSm T:#d iTGMW揶Yb7 #kYy$QBeN  R ~Ge>V>@9 B1' _лׄ (%  רp  ̓=^fT FZŭ2 `Nv&Q<`dpv|87
 'J//~ (W=#* ]p|87h@pJ} 
mk]~* g)|8;>EN ̏J} (̟2lm~ )|8>?  R"_պ^!>ֶ aWŪ`|A}  ,J} Ne>GG2503> ߼}X  u)|(>!  VZ-:;;LLS Pw)	cG mwɇB_19aG* C#2AIxcaL  +c*ȔK0!3 O)|8 >̓^  R,XnlR x4|Jx 0n  Rf̿v  ͑3{->'  D> ͠2  3d4P%ߞ!2 普Կ{TPw* 2e4V|}c  7;~*  j@&L  ;V]}S j&52  Ɠ(NO%Qe @}TPÕ5H	 ..)=>  K> V<# @Mמ(3>D  ٧R̿e CS s  GT0[* rkQf|J+⁴'   _+/ 2  (v
SfN TZg;ƯB >2 0 RJ70n  6]ឃUu ($2SVO (-۷=M %V'a q
RSV 
d*JhpGUe xJ)$ G>@y7wl
n7u° ŁLJGO (0 Ŧ2Xy]ȗIe"T(!: @(&  Be픉 Q3=fe_л y2 Y=e"4(!8@}娍~`x{O$@-k (j2 2q J//~G  G.^t `o'@i)_  %w*rbk]~* H6-C	)$= J}lK+'[[/)  N& ,|  4]uu_Iԣ^c!! L*Ce>o/ȱiyRt|`߼}Đ@e>  sqShIm ym*Կo * j2 s Y'
}}PGaG* &| 0'iSP'+ۗ+aR  x
IOa%Q6 \U&@S2 "P?|*PPӕ.ڠ2 ZQX|
Z2j ߱Ii+?jK   A
GOQY  j%#;G>  Iח6  0;~*Ce>Ez^ e"vzl8'mȌkׄGJ}H+t2ԿZ
@hdp/k9o 5\YnP1  A#3#P(BU  A>o;/q& @#$Q,ħP tc
dVZ#te%-+} L{}wlBSIV`rJL[|ioW| OO/b64C!)4Q  v|(T 1NS|ė3  M~`x{OYPH*zq(]զf=>PFMz/vH+G,(m*z}>@fSN 9|V'a-L  JVD!ɽj%  Ȥ{,ȥՋz]Wp o&vUQ (=ދE\%̿cSvrw,'/c  2/<6o, T S=>VBE[2P|0r	d|z(kLO9}Pe
v;'tvvX*)*z1(>&'(U @^}O>$2aY[Ee>  E1DmW|,{lx4P87
,hW=#*B{}ײgrKO@(7uzL4X׺p+Tw|%KQ ._**̟2lmR|I5 R}PB/Z;PXB|Q+W.5s4^?B'䕧  (!>Po* (Fg>S<9K@v(/B>y~]r2(-(1W2;|r%޴ Wi@i!Bggڮ2 f8n ՟DF'O %~+Jepߓ	9[پ$XV'@9O>@׏.@!/<0kMM*{>Q81:QJitwnv)}iv y{Pn=I; Jn_ wxRaf4]?g@ gS' >y" w?6=`2^?	3O\IOF ~ (O=:;;>@e>N>y= ? Jm_cS0;M5
@O%QܛV _`maupeM22`9'Q<:>yӗ zpц(DݗbkN:h|&J >pcPuׁ}PiepIJ+OoH >DO	ɴ$BC5kׄ+{BŮ譓 IX3&'	Gg
@5[/3(  d G_*}( | >b<^c!dVC6& &?H Tk'1I )|2KO9}~a t@-'LAY|̗' 3z&@N^Je>@|lF(0HO&%QV 391s̓a9n* jsRO&	*_ WYa<ie~=F\Po|\8Md IWg._Fo#oYnU u5Z eH>Y$'p^G_?+z2Je>@cwIp>{MENp^?zC8;がQ8La ̆L)-U rmQXo&l'QѤ>YI' f՟lP >d|{1S`&L,5$_N  #=aL$*aJ Mo; p)"'3(! q{71+Ꮜ`aOHXպ*F_Of_ Kc8>nD`c]PDo/`NdTd ,QL%8˗G	`2kDLa ̕ 	! `.^Q$bLPg*= s֣FWB^:Q- 0*2AOV`Ǔ0KWxQAȦy]`>d SBg,|54رJe>@FJ'd/C |XvM3+Xp*2x8;yj /M''0o?zO\wQl_n dkS`A4 RB߻`>}Y<7U6ȸOaE ,}NO`A ~`]k`0*up+JO`A՛0k.6.% B	i*>M>Zy/,fip۰Q,ȧO8ѧ4/? jb/$,mjTp*)P32,LW~SkׄΎp{FgH+wW=b4 9)>M>M>Zyj3Wք[+#{߶> jE>M#Y|P3G_9j s~eUieC~ 
%YM!YPS/(,\gTP5.iYi 	 Ԕ pd j@>(WްQ jM>M!LZ{'?5SYڲ}QQZ*SNP2-NO3xZ	 2~~	| BE	i${C;MZ;+,]!2*JEe>@ EFhTn^. !ie~=2[1 2a4 FP7?z >zQo߲P 
) ԕlhI[.3*
m[@cSv(NNJkF0I{B	Ԁ+Gۢ4~~Md\4 F@];^^5d () Pwa4 {i PB*I}> 2FFIo!6 @( 4̘Q|E ? JBe> ۥ i( hＡB nk| «'2 egŽM	 &@w?6k (em0uez[xxe FNP?z?URY\ĒxEm͐Qղ)XV75d+TZ2d,a5$F4Fp{0Cc4dqNyU	)<r;9;n;;M< ރ pyQuz`Xmƿ#"W|xb 7>U>U] 3MkNP?;`Mlijԩ&>M$ FĆksbڧ2)E9 #A4U% Zǁe׍8	tSM|C|<i:, [ -MӌjS5-MYx?ф	8ml1jҌ)*=emB (T j`Dvd)uq1w*8-P4PS5|Ir>dόgQX
 { j['Y *޻c0܃pb{i2Ԅ2^*a` 
>= #= 'O;#Je> C| 0BOx|ڻcOtuu
#Fe> Cq(JαPdaT jP܃Ay~0bT0TLmijB4>Ԭ2f Ӷvq0TP)o,%NSq|
Ѿ=:vZ{vlQ0V@E8	@-qSV ԔWE    IDAT w}ǁ`j</8;&F0dz:l Ԓ9-M͓lJSQ-MӲ;?LZ~{QVEs'y3@MLME	49~o?dTOl TZ$T 9Y]tVu>Le> մ $%Ҿh Ԣ^m/@ִJ}T| ^YS[/*$f! Ԭ7o iW2Ƌ:vЀe)>"6HYh{ًLT| ˎZ&#bT 5M}4nbT0,E)9V2l j+><-"f& ^ I%b=)n:,C`X{ j_KST JP+>;Flrå
y{ r?Z R Լ}A@JrfȎW90v;\Q|*[E KO( )kW`| Fȍ-M͓3d-M͗DD 6=k{־, a  JP	@nڲ3:vZ_-֢ Ԋ=Cv@2>m" re,(2Z39V Dϐ	9@d_@?dLe> dsO} 7S߻z3$-M$ w^li@ݱ'6^ohk.)ua Q,'*> kZGl~;q{ jʡ(aK dg r= KXPHN3W s| j=-3$|yRD4A _	br*:3ٺ 5iQ> 5=  q#ml@P?TPJQG@if \ǟ@P) :}@4Px kj"ٰzm{N92 P s,rAq= Egu E7KR@d;3 rAXE`y P/="[Xkڲ"zt | 
DƠ, 
O?g@u쌧=4̸qVu +(Y"g<t (j\_=]]ݖh/U@`܃ϠiHymc[\w2UK(3|BQՒGe> E>1`|SHy⥱kNCe> >3`|QI/}2"Q@A3 -M͓@;]]v0 | = y:Yg0Pp5D@y PX5m6	*8hD `Pp5%y گ^\=U'*̿R@q~s= Eqt+@-z讅}}{ H}> )p>!g <\ (|iKjΚU,&1*H/(Bp`g,Y$Fe> rD@.f	|j b5>1*Hš(a o|bi+_g&>-*How; [_KKS7 HF˛*FҊZ{sGO[}.>5jr  !mGɺH~_* $#~a}`lO}$ⲱFcԧ>
 39Vr R>" $e?d@O@V2~V9)Q ޲v R#k_ HJۺc=:WOuV  Q;-MlsZ-MYx?Ѥ HKOs`X}{}w| R={ʩ49i	 OVX<0l\46^o2 ~o&@4^sZ|$e6Y>Pu+ke<n2 ~PbǑ@	 z',EĐLe> 7z i3S 'Z'ETS Um/o{jo;>vF| W6 ,$t<D HZe y3_1gǍcg+	 qJ|NCj ,_pmѾhquc.V [F 7NC\bB nז}5 
(g>( #JQG` @i99& x) uf̟R7!Q 	m=e-ḾsR-M ]Q CW7ȂQ mSFs* uq 2 g_Og/6- WrR|N gS+ʥO^[-rs* >ٝ{w1`@oCC+z 0 (ǎld A3̓sB-M͓"b =&X&ן7R wt >AZNHɨXcEx_,3ļKU m~ dq  @ǁPTőU_=~z}| }=| dq  g8)}q̟9G [ '>'$d<4 $vm{w1#š2 qM NnjKS$|DKS󴈘h2 pr  / P{ڣl pj>'= Ɔx):vGx_*r^~4dr|  2& k f52 *dwxX8# 3?;c}{ϥ>\*8h| v{ 'j>'2T :tĆkM
W*o7;>5jr 9q䀁@LlijfV hij }Ҹ 1;[so\V11S TԺ[
 #| @ۺc=Fze> PY(Gۑ2U  <$ `?c#l)w[wNֻ?{ʦ sy~`6K}r'5蠠~wGWWTV= T˥]& ' L轰lAAx5R αiMlijfn'Z 蠀`wh92 φ#o6 ?~ 0H:bMSPٵ߻Xi;ͩN5Ύј( E)0h < s \ ~53bM Gw6 q| `זaZ#۶-n|^n:webꨳR }[>q?~ 0Dόrjc
s(rå owԬ)>٠{ CUnݱ'=<y讅,?{S 0JQM{ *#4K8BXQBNdk-R #ksO{tm *Uq P!m/o'5Heݫϯ2M F+o[  T>Nsz B0Kjؓƽ_CxCYe~Y{ a{c%k GqL *g͓w
-xfr1griU @eM5OBOy TVvK*Ԑ2U7Eۺ׭%wA\7ht ݽ*hij֘ >*9 

cq2@hL|㩏 jƋG*! TAxhaϷ2ƱcJ݄G 5#;}"J\y >| g~wF#dqT| MN@U< P%NXr߃m92 j׾N/|  )|>Ye+>m92 jco TYKS'Y TYv
?kM몾][vtv(Jֽϖ dw- Ęka<<\| ȁ& 	 av
*o=q_?g94aJkTe> 8`X'C  SPY+k{pkn7ٜiO/T 9= +ىM	| &O\f0;oW7*??fzL=  0fyڜgj a>Ͷmۄ92 { ~-MW{O? ?a\4=	PVbsR  0b'L6~ )|>_VFۺM-T@~9} #F0ip>pzYen| /`DiNi>ޒK6R = (p&O? we}	U_xqLFr FT+H
z;?|HbԬk sNkij֤(~|`n硻ƢDWWLVEs'R  P34i'J.z ﬁݱ'+RE.e759Q @!<f Pdyˇ j@ǁIښUqnk T@={v* mډˇ jS`g|{T| (Y &J.z )'/mc[,ظz| (&L4	C 5>w".{Yew) P\N@iijZ#O; ԞBNS\*߾X*s(o?Ke> v6iN ?M> P<NSHYenu[p;zR2s1uY 
 PM ?M> PS?BYr߃qNtecŗ.ƨO} PXw, jL/A49 5{$5Xi̡shJ} Ph(/[2 ԮIv~ PÞXkV/R Xw)8 Ԯ9v~|m\/ <z讅}WB?* Mڿ ֵ45;~bZUm @k"W+}@?* ==  ?1\   5\XXk[}w| Hϡ(E[>|%F/bz 996[5`g<} wA| y ?k'	 ':tēZ5iƶXpmq@vG; 
J ?=> #xSPKK*s1gǍcgǔ	 V|q?1@tuuǏ!+&d/|b[HNe׍8ݦ I+Y> LJ ?=> 3/..cmnu[D JQ_vmO~ G-MͮN ?!> _c,Xt8<R d{+{f $K ?-> S;)[bҧ=T CQ]o %v~Z| auU~G =f o/p@eO.^jTCw-/nΡST `=*$ ȹ+,08 9G5jض-+7cU V sH7!p@e'Hŭx5pwn7\f\8+f:'Q  xXH  fa:i  6^VK*"kt~*s*̟x| JQM{ 
y]Af@ɐe󯺩Ge> p*=e3'B@d5O.^jZsC*S{0ں  ?t8 G?~g}]-T {@!O P0}|~k6^_>/ֽnh92 u=oa%·>V Pvwy\fҒK6*??fzL= pr(ǯKL Iv"@A={bџEn7x^4"1  #mS6* (&'B?| (,}rR#ִ{p>/Hx ރhicj "ţOEN;O]Pr(̿qԨɩ 觟 \KSS	'{ (,]{ض-\s[9ȩ2kcb4>
 + { O  жذzU',Jaw) `Rz  N'>$B x[ߏOc1	V2?k`^ k/v g ~O  q#ZԺUϿ&} kso{=a~ ' O  r}.ŷ/2 R] ~i@bV^`YetIq˸ŧFMA `P~v-{ʆ iq?4x Ӿ=\Jִ/L}uiK1S 0H{Ǝ# 3΋O  RG;}<txxN}U淌shJ} d?/m5B HTKS\KS ,}Xd/byWϥ>:^?uY ;c%ct	N_| e5Y:ָ]@> *%TҲ o  
nɂocY:G:v#߼?6^(r+9u T	 	" @*_71ʶm192 5vas \]p| {]~N<xi;@G- @錵]o+ .>(1 G~m*󳦄ecg48ݩ{ Vj  ph  }T׮cΎ : 9Rl⛖  J,Xt,ȧ+]׍Xe> Pq #/  J?kgdݱ'+r6SYeW}&>[G T| DZ]]`| ĨyY=_5w>:^?nB  Du> p
.0|E3  NxkMhe?%\DYeS @5 NC_`N $Jڶ-\s>T Eu> p*L_l> I>O.^o[e~ | 	M} pJYZJo_W,{&ȧ21G *{Pu> .0~	zKb=UaVW2 N(K R'/6 ie';UAK{0ݼ :t)53 α 1͔K @ڲv&[bҧM2cU  跩FU\bs mlִ/24̸qVu &_٥:   #߸᡻]G@>e/U i  oA	 }a45yWz    IDATϙXN FҺcǑv  $S+&~A45_ ךix5pwK| `$_v 0X <i0'{71 H[qd| `(T >  ``z5*_uSl\~.Oe> PVˇ   uǓ{Y;@GM<| =J{ *Y`A9r IѧbL|3RV7̏][vO`j</]}S *E95K  *A_PN- 0dY#߸?7^_>OxcYe_ #W{ )	K TD_=0`,yAKSVQm qzގG] T%FYL  pZ/..ҘsmsᇵwǞXUg jxv TD,&'[7 @E-Y@_]dkZW=_Uxc ٽ˺{ @[7 @EeU"1 @-ّxXn kijv  [v2j`6łknO`e_k{ e;6 @5>'/e<^?	U_=vS @ui  0 Nm }YeKxs*Z{) PM  }VWm^R Բv TC$/i  <އc@G4FVEs' I `(܁_L| `X>;쬁:wh1 @ `9 }kZW=_Uxs_nTx ԬeݯY 0$/&]  };knYSV2~V9{α% 0$b$  +o_3S߶-+}WV˸Qg" P{ `$8[@|  *bf3,
/ @^=k޴/ `$4m  ]2=>>Ԭu[he6"\8. P9N
} `Ddw//>2U7	sNe> 7Wlo  T &>  `t舿aO.^~鎾?R 3Ga{ FTKS4(>  kXr߃Ulv[soe<n9U淌shJ} @lm}V ~yR3  jʥOǚUUY6^_>EKe> Gz:c  Ux Ԍ%iyOϨ؏]YreN ySr  ' x{+"Ϲ_= KO^ 
(>  Uվ=!Y=_:q1n- -|  *~ 9m^|π~{x.\n rhso{u:  N_< jccѶml#W ރw[- a  oþ?7]{?Kc[Le:fS @nR}k 2wo  VO}I%㓟?6*ɷ2ߩ{  JQҫSG  
}  Uv~]Ӻ*n|>T E#m|> VN e!ĿG-s*XUm8r> vY `ڲBe> P{cSi} y1ͦE  ZVME1n! 3V"<j["  Ee> P$?)mS  FoڊGM  U2 (Rjt %/5  T| ~5-  #
  0%n;[x 3Gޣ
 VKSWN  PWW f:Ǡ Bm, !  Njr1c(bj  ~45OK}  TNVF2g P0z:㗥
 @M\ 2 @eOJl  Ԝ:+  *o% 
Xqd (Kl8   ,(ˇ (I6Z ĩ Rm{  j   U~2j_ 9%ںY0  5O_,  T )X M] R bso{<v  7   @*+վh.>  $Be> }=$ @|s  2 HI){ @ T ))EYx @	 T )'J 5  W_=vz|jd  p<_>l     
$̿
 $Ax @  f5N  )& R7-   rNe> gn} nj(>  |  U{  H  92 H  @Ψ RN=  % 9whWy  A{cmכV @a֯X&>  "l촘sF Ij   Xf>  "*lE1uY $Ix @*  P&ן6^њ $	 H   jcΎ?3} @   h׍Xx $Kx -Mӌ  Pc.;-掾Z d	 L_  @z9+ %  eN @x H 	 dw7* d	 @  #cg4 H  ~O  #>i
 d	 _՛  11m  H  >H  lr1cJ %  0yF 	    @x  C  35 4=     쒏Wj @Ҟ9%ں>  8%  PEYm1 4=  <-  Ԓ&f֝{  i{  ?$  Fd5^* ' "  T  ّqi   V  *dFÔ?) O^é  7  PYx?wF	 $Mx  C# ! DR^  `.;-d @tOJ(  `H  0Hvߎ1>  i{  ~q   ӹ'	ѻ?V
 B~s  `4_pq I^ @9  4̘xi4k4 u=onO}  Pqy ~8q 9%ں%?  >  FvaL @JQgn @	 f4L/4"  iYxD_>(    p{ CQҫ{  |  8= @ľIiStM     >Dx FXY* a$  Dlmj  0  = @3GD[>  Pg  4iJ\;s& $xȫ{  AN g'w(Q  'Ja  0  $>f5shK  $k_Og){~	  `	 HRvcǔ	~ dѻ?V
 M;,>  9wha  azގW   ~s  |c	 @Rf4L/t  imR  >  ɸbٺ[8 R+|/   ~쎈 D?=f:l deݯ;J~	  F	M> G	Խѻ?VFwO9Q  @M Ph{  uzގݞ      HYvGE[>  |  
Ix Pj/{   9" p @vz}  C|  
岱ӄ @6m  ]|  
cFÔsF q= @L} E" ~- H 8P~  4	Tew  /  1g$y;w @ ȭgƟa @Rv-v9`  P0|  r)5^J $d_Og8Ue>  o; = ͽ)?  '  " RTc  oL8|	 @n4L 8h-2  Qgх|  +oS&2 ݽ㿾^x  	qt	 ' RX @b  ԼN) @Ou{v6  $H @MzԨɖ ^V]EwOٲ o  3GcA @ `~cx!/o  1a (<  ՙFqt*o  sG_h @ѻ?ye=  N PS=Ix ުocSiE    fL?3kB :h-ˇ-  >  5cg4ƼK_Q=e+ b~sY-C11!  PW4\$ 
xhg  )x~sR Yx}㬘R7 ˺_w,  8->  #ʱĔQ{ xk޴Y    Oα  P_.r pȔE 0Ex |;g9GǞoƮ-;S b;wc-
 (wZhM߶-pwtuu>  YNG  j3O̰% JQU	(;ut'?=g>  '>  æ>5^ Xslg<˱:s>D~	 a& `Xd @!<stKz3{3٩oo	gM8rY\ mO  ԦN)u eOi}uﳫ76~D_0_ǝ_OG 0  9W >5j  O^CIGN{Dݗ  զ 0%>[qC r+{+6uQCΞw>'뾿o|^tuu>R  	|  fr1w ?{wu}ߍKn(nX@͚%ۆܶI`t4GDGMnkɨc+MVfGx#1va`Fkae`^@~>5yɬe}Fu͞>yDrCG:I  ż3  t3%|島 dmaMRe$_H @sP*} @576Z dTޯePV}r)e'wϽO z/  T܅
*w P+G޻O*ɞ$Xs'?z}k+%J zsܛ3}}} wj
 ͜S-  ȜTgPRxajygO];9 P?RE~>}  @}t5O \?P^{]xASO>qoMD5  P)|  *bB)+#; Ȕ$_Yvgqt¤iu;gv_8S  M 576--z	 dC{£=/w/[[ƴo߽0kޜ]0lyncx" -1\  'alh1u  3W7
3kSq}a   /ar8 27};½}F-pӪ;ߟO%=|  M u5OO3@  6mUEu-zWE/\yS  qC|
 T݄SWFv4 	}ղ2hs;gvOj/\4??	 M?M  U.⯓ @ʕCo߆-=ۭ*c:Ks^|WwR  5. [?&6Q %_/Ϡ2'\x<{ @-h!~>e fN̆	 Vru@y}e'aҴ7x 9$ϡB I#S He;z߳I.֯oI}x  0 ɻ_oa Cϡ^Kʘ)ӧYzIe Jr ?v>  rvh	M
 ҺKZpk{ @h'~~ *KpFؘP -w[6-wKYN 0|  Nhڨavi }l93s9aΙ]Qz m95y ۘ-/F @vCo[vZ$U_vq貅'o^Bֽ-? ڸs~~ mAx H$_Y ϠƇn2?⺟{    c= 6e;z߳9ÝO2x&Mo   OΩ/- 0d޽ $A/fMrmxab-m/>>%? Qr_~i!= &}_ggV
኿!oK @	  iTn=z$c.\4?ܶzY=ΓLǒ{ ȒMOK ڜӽ{ ºKaW-#c[|U8Ι]_t  "U9%ϩB I#S 2φ{0kfK?̚7'QXEi ~}  4767ڴ Jw/[D6W_nZu!g?! `JŵO|S ȅ= P7~޳}%7>t{Eb&Mݯg   ;#0!1  u+53<zO[O	 6盯 '4p^wܷ-<}dHRׅUe~] Jc| ET ;+}{TĽabE%_XW 0X|= ח0 P[ܷ^e~]h~oS#	  Nb ?6>  &lO3 ?fx|ˡPgHR~}K⛯}5qƷE_
  "e @M>JXuCϘ)ӧYf͛(j&mF_ gsLo.sab0 @Mtlҳ3f՗V/^| #1~JE 2mpfC jZ(}lԷwKY(;JU  sLݱ  Iu_R TPׇL;cf;',}9M> p<RQw	O /o	M TC{ևt6op}OU  /  8Cu> Pu˯C!u?I4#QRR3®r~!\  3%451  U\gCXU}$w>Bxb𭾜 mQ TOru1}п#fIRׅ+1Qd*} (9b  ,Ο0Ο *V|%ln3e7-}ƨ 7z | t˄7|71  s.wA    IDAT RjMߎte͐m{:gv>L5a} 3~ιϹB ": rx)<e}t͞>y>'[Bkksc rN  1Q TC{Ɓf!IȻKMP#./:1 @
A DDu> PI^;z3in|p5bE.%US. Dh ?| DWD @<Ͱf1^|~X=*s~J >N 476j `ؒ_|=}YIzrMM^հf #8  /_u̘2?%o*l^Bֽ k9TA 97mpfk z^gЅ;^!ԥ?^#  ~@W C+vb$ݷ
x͚7'{ @\G@B) @}eJZ wׇ`t͞~fexW ǣ; @Mh:%n<nA;R_ػ1~ 3d՗VF(8,x 9W(]G@@]4S
 C{UgKp˿.fQ. L>h  2N> -ab+ `p6m>cf;',}9+QpW#ZgqC 92fDK8u 08z3eHxy[UsRu7( ȧ]> ȟZU 2_oo~Y>=\0P(<v}dqp> Ĥm̆		 ȺKl9ÝO3hIS7n@}$ ȁƦf 'W=s}?K-.\yǍa0e'  gd}GP*V alhJ 3&	\~fe
u]?2C ̍ ?.c  d٘-aW4 uV7T\h~ms RQ_-> ฒ;%q`!eHpͽ?3=D-/= -0.6 @VM5>Lng 1%W=+Ϙ3'S5I.Ks}~\| 2+>iu 1{
{7Ca՗Vݡ2貅atOq@mx 2hNalh: >Jxnc,in|p5b5 ͑nDq cƌh	G| I*޳!ln0r%ޣ25oN9LvDbATj ោ3&X bkac-ɐ2܅>
h;{Ͱ5 @](5mG~|6>  ȊI#ۄ vrx^x1IeO+F^U Eod @F|eV ~hOxp=ɐw>"L(H7_ƷY dK}Eod @t5OG[ s02"̿%a).K;lj_q> \scSNk%x)
ﳤkp3+ìysb)ueÔS C}~dK )wvsGh	M Mߎ7 C\}iioC-bp25 bcF#\ @ʡ7{o)l,@$o_sC̮GAF$I[Ėme ~ǎJE> [X D*	W73fs'ޓ9z@6"#Ӻ  i4id[8n  Bwgݪ2L4#{ )87>* HsGبϦẟ? ,2+c N%>.) @L5>Lng/ #WlI.|z\H#^Ur}!~ 2_I+lV7ϐ2{KWqc g~Qhf N2	B RybZ "kzZyFL>50wJv_Z- 	#T(> HƦ𕑝 H޻/ޓ.n[?䄼貅 ǫ; @ZB] @uܿ{ݷ$,GA$\@8ʍ ?^ u\	k ;ru_ػ1~٪3kìysbI" p)~|c = [ޯ,opu!a՗Vݡ2(-bp)b]  ï0w ȫ_x5}ώ3}r{7Ι]%^)c  ?^~>2 _	 ϐ	KGx M\G~ P'Y 9\?3$_0w>
 RC)*I   Co_#̿{p /> Ԙ{ ȟ2m6C.\4?0iZG죀cJ% }	&3 r"y/-=ۭ4#[|U죀W ԏ/bm}  PKF3&9 @ׇ7ΌH%n/? й} yo3f՗V/Ǎ}0(nF)DN 5\Ong aIe/Ve~o9+Q %ËJ]!   -_Y ϐ3'0+k=^|Tp @lK*W7d6opӪ;TCx jm T{ Ȧ2WCÍ.la죀r 56r|| @lR=^|~*
\@M9\S l2  =Ie]gDRxabT+^|j!@"?rRч  Tɘ- CTgϔSíO+H-9 gGNOb) @}= dppe@m,b*s|
}*L *'?D TgKR?͉}Ps]rWJ S  Oe~$ϬCr} ~k *= 9R?zGuu
 
GЧo @tS-*!}xW^Gst|B(B )t6L0I Hbk*3De>E-ml *-|> *Т Rgw([^||H] }	9B% Sr}?{' R7};ևYM$[z]c+| 8O.`F R&|*3}r{܅>
Ȅ9gQ P9m'a Be~t͞<zO( 3~Qk Pm'_T  <1-F )2?{oZu!cY_@e'hL o@*ϖr?{a_-](eO| `ȶ0ѵ ԓI.[( &M3c 0<2:> h> `5 TgOp3+w91oZ% 9 1#Zq u2?{fK{#ɗqLj 0t2:> Rч [\@=ϦfUw!.\Z`dt|@G3 Ʀ0 Tgӷxy[c܅m CȖ	( 0@g7wd\ PC*󳧵?貅ro\d 0xk>%̈ ԈlJ]xA!|>ʇ @W06 ԀlJsfW죀h7:, G6Ǉol |= Ԃlj>y"t߲v "X '00a@Ϯ$_=@|&M]g< Z>Jϱ | @Ϯ)ӧ
0 Z~ cq476ڍ De~v͜wNm2=. o3 8fG	9> F U2?ےn}QE ''= ̈ Tl L#x 1m06 TlǓ<|F  ǵP*n5>Jxs >bHo@l?Ge~	7 O1	9 p1#Z *`s߶Qe~	'"4 ,cs<>4 (m>8 `ʡ7>JXU&ߚo^ pl.9&>t͍npV 2eyCҳ3Lxy. 1-$D|p @ybh	MF C2?P7:t},\(w	"D BtǍ @e~~7 >Lq	9oo 1#Zq Me~~L>UxK̮>ٳd p>%
 }G  7UDCKcP_|c$f fg6N 2/^WIx{߯\Z[ >%d|hM5>-   $_8Ӹr 	ل@%%']?L uf9  Z3Fz "_eʁ$ۅ@_YNɀ8	" Dïpf| 82lqu3Ix9+1 U0kޜ6-ڹxYN>'T(v 6r	ϧor=PU" vg9!>nqϧW_.lac 1 1\(UpB|B@T&4ƆKH*>RXuə	\(1 50iZG=è|NJ@0 *3Op w²}Ϫϡ)ӧ51 54_0n bhsRRч	 Ql` puBasXr}r{>ƒ:Z[9: ]CKhk 8\[#슟F(:Y@lvJE>'%g\3Ȣ2Z9+1 u2o= 1 ( 2}]h~ QmaN_ |>Cu%5q=#, γ bX3 R1*f jl_ 2?ɵ5pKc R+ߺ* FTt,ˀ, ֘-abh JIe~asHI:Bd_ 
묙3| rK}> 1zXpoNo @ƀ	os [q *ܷ>}#{5bB_?Z  3`R1961 fB)alhW Q}-<e=fI~%# 33| 3}7Ñl<"߽Z6_  l2|K@8R=q:ìysbr- 3"g| +8OnWqcc 2 i	Q@>| F}> y2?nWG d} rLϠ
4 | js6p9+1 F\(wY.!g( ´Q;V|%Hoo*1 F1h| pH C{򆰥gF컷]R@4>| qv	@n$UGns¬ysbQj!>&g| iNQ@.p`@f gϐ*> 6}Ty*9ڟ@ Gdi @{ Me>Gk.f F1$|; d| ,K*v F3$| >J*ܿ>q`)ӧYjȁu޿g LR@=Ͱ|Ǉ,br3_m d!3 Y3fD| 2He}[gs\3iZGh9L3d|pf Ko_ d|N7^aF@.}n@fJE>C&g| )g5  Ts2}r
G_?^Ȫu6p.> &60 RMe>5o[ƷY0 Y	jEp	Ȍi#ej}g@L:gvkZ0 Y$;cXwU 	g4EZ/ލ*?XlP@;K@.lS	I@&0΢ H2=sZ>=̚7ǰK>Z[-,1l|* 7m,
TI*{6}p0`_|,,=&g
b6I & ˑC6À%]ht9۲G J@8 HǬ~ +ǰ	> 5fDKZ,Sp}R@\FLj d|*BOP o9 ԝ|}r{e@t>s@8v"TJn >1 P׫g>7|Ctyj d SI> H3@}oGxp=`|Co| l]TV!:FG Zx|*󩈮3߁մ>i #W*FO%p u:RS13v΅> ͑+#bW3Q QO|Kg\#  vJMC4W FscSبjPOOnu/ R=%|HF TSmg}O! 帕SQ+Bv* i Uo|ng2C q+%|P
7 zꃯ5{_UOU6Y2@" BB$>ՠ*3%-@m?',o[z.UwIp)>8 HGT ja@u4 *._Uި25ðr9g i"T᪐&@=yJROx:OM](7&Z, 0Sg?Q:gvyp}OUP7N	- 6S0zh; ϫ daT 8\m CGS0,Ie^RO]}|Z Cל4pOU&<.&p%_8O9 3_m, B>G !yЛa»n	 0iZG3# PGjSM.1#Zb ʑ^78Rc,8Id`T 9\	PKMcAQOZu~v wB>H '>f |lpO 	iJO@'Z[:gv^RU|P*n!l6e j Tw;*ISzd|3vJEǫT ZM$ j͠8uBaF gs5Pk2/NO-,7e jaScJ*޳!<@NuޟZ% SuRqSRi T޿%=>t  Gwd@U    IDATT ZQ)@MnaG*{S[ L>՘ ͅR7é:>I TՄ& 'd݄S` :g0& jœԄ (I۴6| ǌ/βm jű*5!P5G6\ Tկ-` :?;ݘ B⍚SK@՜ڧB fC9<P^2 "3z>65#|P͍Mab|XoGxp=  BӬj=5#f
b &@ V{_V sPMI}&VԚwӚ 2G*7߲zr~?̧
j0MM	5r T|'ۺ3 u2* q*5%
fS P ˔Sj](RS|aP)͍Malh1OSO~s0@gnT TS> #N1LܷMe>Qڻ]ӧaT TLSsjӚ ʡ7>JXUDw~3_mT T|BO"[ V7-=ۭhx|4#6 4>""NS7IeFDތ} rI@%ɲ>uQ(7M8rBe>|ضm&0f $.ԓ> eH|8_= ЄvR/LzSOM}C<Pg~e: ǟQP)P>uFc Ò2N෿ P.Rԍ zpdTR;Nw`Lj\ |JO`&66<zЛa»`#Ec3N7* )u%0T͍M%4@_ukAXߍ`&nT  >#d|76fz 4ӝFpϧ}  2g]WO=g 0kc`8Rw|N> C1 RNe>TӅ3MjfT  >S\Yw;aپgUClyvQи3* B}> '-0(F@J{
{7CVO' tΚaL cSRAO*`ZBLR[~i 0e'	
|> 2iHeBR[$N=È I>i"`@66@̇ybJ8Ι]F`'5FTLz67 '3Ռ R@e>ދOoDv#`vJE>!'m\pRG@̇"ɴ `*|Ƈ$ '	̇:Z/O=5x ("'U0ƙ@@y}XVOxv p:T0 I>it p<͍7};և?+|x$` <LI#tƏ8p j,|*!E+eVp1 BOIB+ p,cFTC~?~&#"m+| iLc Ԁ|Ȇ{~pMǩSpB(RIOZ= &:{=R1cةtH#>tF7 =mP d=*!V=V:N5 gsTj: 4{\TmaUy|Ƞ];wG^au 1㋳Yn2 *ImC m|*ް+aWUCYD[  )%'|1# T,o[z+nF̚78 8f|N	 (?ۺc Gimm6 >(&'
&5 1? |7U vI&vI;>Yp-j à2p~ǶB;u1 p
.!doBЯaA TصsWٺB:N5 &s"^TBxܦ 8g 0XIe^
k2"_sћ O݅RQO	
  0HIeׇ74:У7toY '+ݶb%}lh~zG# ?ed L(|3
  N|{M~@&Mo'!drט-p*cֽ-,m{2COfJŵ!nF>NŧևcF@M5 (Ie{6Nj͊'/Ġ贞jL5|H֤ࣺ	=>!cXHѴ|̩7d L)[Cl ح{
{7C7}[ tJE>"'\DaU=osƌ/βlx	>S( ԆSl|R  D.&kdoL @	Xt~v]i᧙!SdoLDʁ(I`'O2I|2P*n
!l=xLl.@|~ӷCe>PuB| ڜ*>YS  VޗU5!ԩ .JE߆'d  5%  G<Lf	ɬߜZa 7id-QH*ܷ>}8G, ȕ3NPxl>3d s @."	'(rǞb i|2P*!t"  Y2H$_~= @4>y Z%@ڭYDX?' f|q%a'!  &PuK9_QdO٢= @Ɍ<>W(I  `=aeyCҳݾֽ-ܴXIX@u~z2MO^F  o[XUި2Ȥ$=R@ s:gvY@e \(%߬M  He2mp?o" HǞ <S7Z Tyfa7.>  iP*@O H@my2e_2"rCOnJŭ!m zSȻ; ^Z'/]6
 @=%_2F.?ҿJ}  A6Dɕ߰U  Co^_6 :/>^>jgnA >\Gi3F[)jIe^
knQ@TicOYQ(w+y"'|
 gZBu2;-	@>  娓;if 6 ǗT_T P-&%o+|  Fe>ڹ+~N߳oʌO@'RT\|v wTңa7U Bx>#>yW  TԺKw|!+s p-?2 <{7  `Xlj ÐTo
o G :+odܘ-VURl߳탾P)kV<׮PT
oؓ[|7 2nt #=zm~J)|)-P	rBC	ɵZg  |ؿ'{OoM .y&' #\goe  ̇{m  L5 u{[ Dy'' q@y}Xv	POG*w  G[Q({|be #~ӷ#<o} ċO7-*-VTTv.ǚDAO#1 hIe{_VBI~bZNi5LlZW(716  Ae>@f$T  hJŭ7l  n*G> @Ժ hQ  "2 J¿ܹ "'*|R(wm  .Q?%߸V> @v;$6|b  "U*rd2  XTeDO  9VaWȡ];w ȿ1^
 @%+s* rk]TjFO |sDIOcK @ۑJ(  P*Ib$'fj rBe> GYD_B> @'Z|.4/{bw0Мqoԫv|
L	PZ9J!$vB80%&9%3XmĶ؎oX]ےŖKYJM/z|`ߦi%}oͭI?  vhlϾ2|t< P=3I:Ic	i:w TT^ʍw)+sscO &ъ7> +̍R P9|M!  K $K&CD~
  Me> Zǟ1G i74 +n Fkn  Gߌ_O3T rKt|}@Í-e*hSɯ~7 PNx!Oot @y/.s^J_>J} rL] n> @ILoV@G (PHt"oh5 +Gcay& 
  =5dp;  | zJkW @8}-U& TPyS_^|p  tLD8}Ý E*(Ro0^^>$KL@y's| J)O~?}IP#Ny(*spw 蠓Kgv<.-:@?R 3F;	F{W  htw= TJ} pBwQ V+Ο3V *G> @[kw!{> @{.J'm  %܃ )|%*S@L_>nn o,	s@ͷnTk*W7W >}x `&[* X{Ãy `c1pxq} 4J}+ݶ zK p
.T@^8pѺ h$P~7 ̔`|XoCɩOV꿳  Nk 5(N3+ ۩;'|}s T~~,v
 oT1Z+Q = ֨e̼ Jn(Cgcxm  _J}(/ |XoZn(2ƁS k47RJ#ǭ7d+|X&+̍  {X'>7 z`&zh2_P 4LI>@oLLz@e> j/t:Qxc = Y}3v|i[?}Τw?0fڝd鴙aiUcK| Sɯ~76{tO~~y	aeyeG.+ĳ*:q6HT4? .ZWٷM_@/ԇκ>	t	| tɥ%hN+GcayќTC;e
KM&$Y:V3CΛo	T@Z;Jq6I.| T@O}{6 TI|$C.~2 * [?׺`>:!@g9}m 4G 
fb>~3?G TD^۟*~ؓ*2s@md遈3KʃG`N.Ş)@?R (+M>֜2 *N>l;@g9}m"6q
B2 G> P2NC	𡽜蠋8	2 -Vkp}1tF|h#2E ӗr}h< = )|9E^x#*a^x\> mCNC{	͜ zeu!^?2 ġc*r23Jt\Nt%$M^Sw7ɬ ,:@>@g&N'. pOLCx| ~V+МhS>v@CS l!!ƻ*+}s { >t7 #=sq妏 X7F^};*i$- m7d9|$K8 ˡ1<v\]7S `>:Ma& cI t :)|6:8m4jeS l܂J}'{Kht :)|r7͢2 4U? m?`Y|>ؼK"2 $4_NfvNC,w5@{̄0zS tj/̩Of-`9}!>@{LLښj]fR tGߌ_O3xj켥lސBwKh[j,Gcayц0u!wclojJ4$Yz;EIL9̷n W濸p$] <Ϫԧ626E|>li#6V+s J} {.>tYNlεyT eR:8w`f\'2w$fb>~3?2 ([+]faTO,`v'Y2L=dh~6.*:ٺ{fҢ?$ ՑW?Orf6h{>6a:§zcT W?kTƕnY {>H"blQGY PiyocOԧ/˞ 6`*aCo`.#ՠ2 USz?hI 3hn;|$KKF `-ЧcQe> Pk*)W`ƊaG{C+ͺ %>uqZ4De> P{*)}h? ̠cIл`ZWLҙl]珪 %VOdf! 3= !`})|#U 4}y:P9RW>7 XP)|0%je6 4ޫ?]ԧ.L]ەdCI$Y:뒊rzY  s1=uq/ e> iӢgWnfO gΙ?,C$Yz "`f܃O{  *酏}h k3dP"|(A;X-ٷ꒗G  jR̠͌F30 J&3 M~|  /bxMi k0dAAvB@g]EM h7F^};* {(!>PoXK5Er| 6x7U~ d$	CI%Y[X^~yeG 耹tDp3NCy	
gZW+_{%    IDAT}+T	 i*ivM@		Ē,͛{..CZ;  *iyT  )|WUW #x+`SB ' J.҉'{Ssfl]=qi   7cǗu	C(1>T@ i=lPa| 0u!wcloj-˿Lo` =T * h;i 㖓Ӭjey'  (Ϫg]N<j` w7R4%'Htw~Ծ | Pz_ΚfC]Z`y\e> @Ũg h*@d遈gg w4RrqZ4$N,\4# 
RڕkVP 4U4!QspgZjօxy| +'d~`  w#ILD7;]\r
ۭVq}  5פ?k|a n_T );۝[tWW PSyocOg_O3i
C%Y:^;k8|6gߎK @?R8\L_R7-v@𡢒,1{-ƁSM @_&p >TS %~SV柾q  h$vG>[M@	,o܃LcK|  VO|*)- (>TΈGOY]p$c  ߅ׇύJC|t<k VT *Qp7TJ0Vu {gq5M]I: 'Ht8űKOXXֶ  8tL~;M@n*"vT )|{k&U n*w5} 8>D}|z~R/'[b|  6L~= ƒ,5>ΕÉ fcT iM{X1hP|? =n57)f~<Οk(  hRǞ]?7֊s=@J]P#|&g^;}ߚ>[ϯD  NxcWR4TDnnPONW_\G** +@ͼ@𡆊]v4ݙK/]4$N,\l(  袹%YzC:C}.s K_!Q  Jjq=`31 I5U:v-+7ލ72 S_nY45$+s1dgZW=sq妏 YXKI-	.4}@3M&YPE@#ZW/Cgcx4Q  PR}3v|i[?}ΊJț ͥ:jN5WTgN7/>
  * ?Wc{S*c> |ѼԘ әk;vauEe>  WgU{34 cЮ\v/b-e\?2 R_/O7}@@	!,]4ѹER^88wC  6Tޟ_ 3d騽C3Y*);'1N}B^[q(  [+]qeWwS$(3vY EF:|l2ayQ +'lN:֘
{dZCh>4L"bMs [̏ Jgx{-\] 4d-E4X 4F^Ngl]=+  @Sɯ⧏=RÎHhԅCUCv4-;)]0]Oe>  uxJ{O|1v%Y:a<|h$K1D~g\\Rt\  J_<]ׯpP%fS4dB<Te>  bRx\~M۵. 0X4$KQy<޸|  _J6ެ x$K4 .ҝMj7/iHXX  W?s#	O[ !KfQT49|Ve>  l?JMk+Au> VNOD. B/=r80{Je>  lJ;9@}IZ3 VUS4+̍   Rւє 4+gߎKU  P	*^MQ6j|` L"y@/8pd2  TxgAϥl m0dnV	S4ᅳ}S+[q Ǟ]?7PԜ||6EM.-~3ƖHeW  @71Z+Q9˫X2p+>pU@S\Vj2 W>:?R}6Rܕ U@Qd|  (	s jHu>pO|TMpui>..72]0]Oe>  J?#T$I>癘̏s%4  ݬVm=ڛ% m:/> Z;q-83;?)  '/Qs0ZS< /U@yy\e>  TGߌ_ڶr/|߽#	Rݱ?Ց8p  ؈D_n#*ӑ|
R X+U@mqytz]M.GU @4R?Aat	>	@ۨL*}&w
?)W  5SJ7Tk&L>PgG{W  zc+|Q X/U@-]]֕Z|Cgcx  jO{r%~O,P'uJwZoZ`T	>  MJ͗_/ h!z	u+wP7'.U f+_/O ž$KX/>!IU},GU  +ɯ*Y/S |`fx j|-Ņ#qpN  pU/&hMlXOuefߊ7.  j)q|
ȫG(>)E)u_KmW*y_?  =y?]R͗_/ ش)͵f	v,c&w|~3?Gϕ   Urбx.e;eb@-6MlZ;Mr?ٺ{f'%4  @!_*]`ӞO1%">	ŉJe  ڢLO[i I܀vJK1ٺӯsqZ4De>  veŋԁ|m@(&
ᅳ=&/U  tL+w?[0Pu,E]@[%Y:c@TJWI^  "WJ~5,$KUm%:!`2Y޾ٽS'.  Y|ߌw/n@h:A]Qd:8}r|ǿɡ1<|  g>Ty?޻RPag,h7>ŝ?Lyc"ƻq`  yTپ:YS3f@ynyeS   eJ*jJu>I| *_ǖK  ؈NU=l@t  o#wt\[N9W  հZM=Pa,=`@'	+1i7}
u%^}+6  P-yWc{M}y恪,(>-C@ Sye~rʋ    UWg?O?*ʯjs@7(TFN+7U  Gߌ_ڶJ}
,8>5INDl=/._  SV*nMtX]dIԁZ)օxyh\ZĮ Z+_x<]v߯PES ]#zakqg@%jew=  '17}gx ]P2mD7yCm>?uN	 _-v߻? h*'H@D<o@U[N  z1=+N=5?_?  =}./k*%@z,?j    =B$KDĠ-     c_zF>P
}6     -@YEĤm     e3u ='JShxP    nt=P|4,(N    @7<dIe|t܇    @L&YAe>PF    { (    ag(>PJ    C{;Rs>     m4d	|܇    @;(=>Pj    Ms(->Pz}6    Je|2wGl    up=PNd    X)U"f    X#"*x$     #	SDTN"b    p#I6j@%%Y3"     3CT A     
3ߎ{T [ßE     ޽@e	J+T!    +OZ7׿;"~`     4d	|,OO&    @L׭T -    ho[,v@mh*     c(	BJV    j$KZ3ן?mY    ZKT#+P;Nd`DL.    @L[+PG|/gl    6nMtJ:U<P    $K'+>PkŃv[    ,FjZ@_Pͦ    *i,R@94B1i     3{om@&R<    P3yxd}M xZ<    P~IN|Q![    (]IZ$|q,l    F,i=@F*Fl    t&5M%lx    f"bk4CV$"{S     s)	k 	|ђ,=[>    .N4^@s     , TwG    %YLC     tdD7 ,    謙ؒd9|JpAqK    @gB9B|    Jtn'ql     nW
pZ @_?g>     m1dQܝ 7A    L&Yܛ
}(3'    -p|Z<`    >31d鴹ܟ
}5$"&"a3    Xdq< kd院i     d` P<h    Htؘ N>F    $K`} 4ן9     n3d#X? T=     >3[`c 3X<    4LDlIt (>&[    @	@I`
    D[,yA`E    4$KX<	ڤ    hI[8@{<j:=f
    H>NY
    Ԙ di^?b    @MN3Tt@_hDf    DoItB	|,h    nFxY|*d   t
}.$"&"a    *f58r,=Sğ1o    b !W    T$KGm; ]TCf    T@[@xn    @OB|    ~Ђ O#E?b    @zHCŃ    (Ɉ	    (<ߒde CVJ`""`    @	J	|R<(    tˌ< %Q<    n D    @P(G""p~~    6 %d$     m&()>@IB|    KPbB|    ~@KPrB|      "+    ` !{}     >@   uT b    AT     }*JPQB|    . &0!>    p=@	*w#    4jZP}y.   q 5>@M#	    ">@   Q 5#!>    4 5$   ZԔ     PK{Ԙ    jExPs|   @-@ B|    4=@CB    $h>@   R #h!>    T $   R4     PJ{4X?    P
{{j5} 7ןRs    > +'#bQ    @OX!`    zBxg |F    ]%6| n#   !jZ_      F=oшxؔ    - ܓ 4"   `ӄ ܗ;$K'""??cR    a{ H	   `= kB5S    뒇[2 @Nf/DĤ   }	X7> dtQ/   !| M    4)` l-!>   { 6Ve l@_pDl3E    l5C F9%Y:#&	   @C	h'h   AF. i| j?ee    { J> mdi~vS   v	h7'舁0    58 m%cB|    jDx@(!>    51[,P : tT#1i    TqIN   I= "+n	GL   U#b   Pbc8 ]!'"9   F, M> =dn    { z	| zj?4"	    zl{Ö @蹁G#   $KG- ^P
}'`#    tQoIt5wP
IQI   K&  @_~6   ViC,t,m  IDAT   PFNPZ}yǆ    h,2P H@oRa   `'Y:l  4"   ؠLt (3> 0E   `f';
,ъ}   MF#{ 	| *g?l   piC* T@_`D=    b$Aj T@_^?"    I U$-BI   FIh  .> 7b   h"~ L@mhl   Q&#bK@	xV   a$A.&$KwG)<   v'G#b4"   j%?1d騵P7| jk#@D|   ja*"&Y:a ԑ m6   PicEx?m ԕ Fl   Fw@h-Ž:   @elOtغ h> 2hD   f"bhm /?   Jk2"4NX};#i?    2CIN[ M##b{   JaGxŽM   @oM d     4 pf   [s܋   ]   cw | [g>    m{ 'wF   )oa   l$K O k4Hq/   `M | X$Kpuo    XD<"s 6`0"   ]=d `-*   VI 
} ؠ-!   @L+9 m0׿3"6K   F"b(i?  q| h-Ef
   4L[8 l  h?+   Ps} !?0[   T@ۻ8m; x 0ʩLxpy4ipE>7Z̵"Iъsj|} ؒ/"bb>   003n\* l [TqY  [Dą => 쀕   @([ [$X    #> PYF3   $T`?=   mD\Y %4U}wV   ,K =    | 3 h*"]    {gD\[ %@MUi#w   ȲL9p ؿ/  r(ڈÕ    ;~/B<L@BMU_FMD   `Ok  TSe;   6de   5U4	   	 9	 MUG$"   Nˈg 	 MU՝   oTV?;0 Oi2"n"   t>v@ > PSq'   X(S Ek)?!   Pܖ_  =Ti?r   0Zˈgw> __ [YF?]%   CD &`@IDW   vz:ݸj  [   gϮ Cj2"nL  |g׮ GkL㟹g   vr:=J & FM<   [N+ &H  ^Z{ '4UN   ?ۍzU8 0BMUi   阺`L  @:`| 9   { @ b   = | o  `L   ?1   [g  4>   l{ | _5U}NDā  O1u + 4  w{+S    w>Ϯ > .e&":9   # J >ꋲV4>   ײsL kLs   eQ  ! Ty?r   в; | |t>ӈ0  ۈ8M0 lTSէe  `e% " [TUD\Gā  ``t7 $ [TayS  ` "j:=L `| `뚪>/!i  Cvt>qy 6}q  OˊA   ۈ8]0 TSmoq  Hl vB     oٵK vM    x(S.  ػK?q   A.j:9| `|  "Z}   v{Y}T  `G   `K Ԭ  ` R   zA zo   o`]> +> ;MU_|k  xͲʿv: @|q[ @LIDGğ.  5q* }d 赦ې?V  `ʺ _> 0}6Q  QYp?q @	 4UݮH>>  (|/oݿn `| `p>l.   (SϮ  OK>>  0x 4 /J>>  @?y  ۷񯽏  +޹ FC FFy  n= 0&> 0JMU_}   Ry(;  5U}^&~   {(߹ `| Be	G  `eƱ c' t4U}UBs  تeyf:8j   'MUk˗  ye  MUio  `#"R x %O"Y  |Cw|  & QSe"_  xE<t>s^  ' S	D  xբLO 	  Te  |v<  O o"Y  #,_  6]%  c]  `|  `Dn;. `3| -?/  00=   [Tq  L !  豇 O !!  葇2q  vC !  HL  `|    `| |  `{ $| D|  `{ d| |  `{ | Ą|  `~Dčp  B>  	e! & H	q  = @  =TaB>  N ) Ǆ|  XFĤq/  0 %_w)  FoJq  & LS՗B>  ޢ3q/  0PMU_g  cQ޷R  2/ @== 	  #Tq	9  Cwe  ' L	j  )ݖpz  C ;!   n7eUp 0B>  m̿,1i  -:  ߚ>/9  غ'  xMy'  l܏v~:;Z  |  ~N~u  '%{ W	  w Co 	  Ky'_  CsD   wېi>  GG {	  |Jy'""#i 0B a>  c>  #P޶x  6A `z `HѾk=Ϟ,  $ UMUB 57eޚ|  B `'>-! G~]  & SMUv9}  j'eޚ|  vF `o>/1T>  <h?q  샀 5U}\B|  vlYoL o>  4U}QBW7    L  HM  2|  >ȴ=    MU+S  ƢLOL >  Tyd[ Q o|  zL_	 0JM	/>   `4U}\B  vf:=n  @ `(! vEt>V  F `Ь Պ6?R  J `4 +  Qj<".K?)  H]?gw  W! `O:+_\  c% @Q˿,_ .   ^Q˿(o{/ `3]w g>  FSէ| Yv _ J̿*1 jw  F j|1 /?J8  x?  6@ FGg  >N  `|  "1   L  `|  1 Hj
q/ n	  gMUFeG رeg   Hw lɢDt>{t    I5U}܉g	 Τh  		  MUvbw7Ѿe_C |  衦W!߻ @ٷ~:8    zK(=){ @	  0 VhX  $ 5U}މw  I hn| ϔ=    #e: 1e  #'  ݷבS[&K7e  #'  ?i:! ؘZG
  t	  oY T}q    ukZ|  |  S>}06ޱ  6F  6J`kޱ  6F  J{  `g|  `} a(  $  {TZ?q# S;ް  F  i _.    Ti˵u  L  zvԔ> OXo>  G>  0kSEgz  `|  `ʔKnv=  0T>  0MUw&Wa_硄z Q QU  +  `+Qs5b=  ?	   o*8;W-+K  7|  Ohz5l?0BN.+}   >F  ذδ~79g:T=     ;R?Vު  -  `~wz*~`J_MԿ   %  $YſOFn_MO    C}Egiz    q?ԉ!    0"jzgye=     &a#ʿ}t>{v     {5U
UzP8
1}   x+  	~>Y"|g}tޠ79  	   USկ{Mx*љޜ  `_|   z^J  -:_:!  '>   |ϯ 6g=zn     >׬pgޮܿoOp         /.       O      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       ط?,BJ|    IENDB`<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="theme-color" content="#000000" />
    <link rel="apple-touch-icon" href="%PUBLIC_URL%/icon.png" />
    <!--
      manifest.json provides metadata used when your web app is installed on a
      user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
    -->
    <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
    <!--
      Notice the use of %PUBLIC_URL% in the tags above.
      It will be replaced with the URL of the `public` folder during the build.
      Only files inside the `public` folder can be referenced from the HTML.

      Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
      work correctly both with client-side routing and a non-root public URL.
      Learn how to configure a non-root public URL by running `npm run build`.
    -->
    <script src="%PUBLIC_URL%/env.js"></script>
    <style>
      *,
      *:before,
      *:after {
        box-sizing: border-box;
      }
      body {
        margin: 0;
        background: transparent !important;
      }
      .scroll_enabled {
        overflow: scroll;
      }

      .scroll_enabled::-webkit-scrollbar {
        width: 12px;
      }
      .scroll_enabled::-webkit-scrollbar-corner {
        background: rgba(0, 0, 0, 0);
      }
      .scroll_enabled::-webkit-scrollbar-thumb {
        background-color: #e861a3aa;
        border-radius: 6px;
        border: 4px solid rgba(0, 0, 0, 0);
        background-clip: content-box;
      }
      .scroll_enabled::-webkit-scrollbar-track {
        background-color: rgba(0, 0, 0, 0);
      }
    </style>
  </head>
  <body>
    <noscript>You need to enable JavaScript to run this app.</noscript>
    <div id="root"></div>
    <!--
      This HTML file is a template.
      If you open it directly in the browser, you will see an empty page.

      You can add webfonts, meta tags, or analytics to this file.
      The build step will place the bundled scripts into the <body> tag.

      To begin the development, run `npm start` or `yarn start`.
      To create a production bundle, use `npm run build` or `yarn build`.
    -->
  </body>
</html>
{
  "short_name": "Relay",
  "name": "Relay",
  "icons": [
    {
      "src": "icon.png",
      "sizes": "64x64 32x32 24x24 16x16",
      "type": "image/x-icon"
    },
    {
      "src": "icon.png",
      "type": "image/png",
      "sizes": "192x192"
    },
    {
      "src": "icon.png",
      "type": "image/png",
      "sizes": "512x512"
    }
  ],
  "start_url": ".",
  "display": "standalone",
  "theme_color": "#000000",
  "background_color": "#ffffff"
}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" enable-background="new 0 0 2032 2031" xml:space="preserve" viewBox="549.13 475.71 935.74 1081.71">
  <path 
    fill="none" 
    opacity="0.80" 
    stroke="#682c54" 
    stroke-width="15"
    d=" M1463.166016,760.192505   C1445.348633,831.218323 1413.649780,895.035217 1368.330444,951.877014   C1352.908325,971.220032 1336.252075,989.745972 1318.721191,1007.200317   C1294.658569,1031.158081 1268.282837,1052.499268 1239.894287,1071.376587   C1224.148560,1081.847046 1209.494263,1093.955933 1194.317261,1105.285278   C1180.206665,1115.818481 1166.017334,1126.246094 1151.931274,1136.811768   C1131.450317,1152.174072 1111.097534,1167.707520 1090.572998,1183.010986   C1034.940063,1224.491943 979.244507,1265.888672 923.575562,1307.321289   C889.266785,1332.856201 854.998352,1358.445312 820.646057,1383.921509   C762.101501,1427.338745 703.499939,1470.679077 644.934204,1514.067749   C631.030396,1524.368408 617.193787,1534.759644 603.274841,1545.039551   C601.056824,1546.677734 598.566895,1547.947632 595.332764,1549.917725   C590.647949,1539.167969 585.978699,1529.270264 581.976379,1519.109863   C571.884216,1493.489990 565.312866,1466.886597 561.245117,1439.701660   C557.023682,1411.489502 555.751770,1383.036621 557.201660,1354.584473   C560.231689,1295.123657 574.910522,1238.512695 600.049438,1184.542114   C618.149597,1145.683105 640.910095,1109.818481 668.491272,1077.050293   C678.662598,1064.966187 688.923584,1052.855713 700.179077,1041.812500   C713.186279,1029.050537 727.346680,1017.465149 740.987366,1005.347473   C776.379211,973.907288 815.862244,947.798889 853.515320,919.319946   C914.699097,873.043213 976.567688,827.672363 1038.112183,781.871887   C1091.379028,742.231323 1144.546387,702.456909 1197.849731,662.865662   C1259.703125,616.923828 1321.649414,571.107117 1383.572021,525.258423   C1400.958862,512.384827 1418.376221,499.552124 1435.839722,486.782776   C1440.858887,483.112610 1441.323730,483.320557 1444.103516,489.115662   C1458.081543,518.255554 1466.960693,548.915222 1472.150391,580.787781   C1477.014526,610.661621 1478.243774,640.708069 1476.792358,670.819824   C1475.343140,700.887146 1470.872070,730.604736 1463.166016,760.192505  z" 
  >
  </path>
  <path 
    fill="none" 
    opacity="0.80" 
    stroke="#73496b"
    stroke-width="15" 
    d=" M577.210449,518.455811   C580.463623,510.768555 583.458069,503.401733 586.668396,496.130219   C588.510315,491.958282 590.702698,487.941101 593.059814,483.206451   C595.259827,484.739502 596.856323,485.791351 598.389160,486.928894   C661.764893,533.959839 725.169678,580.951843 788.488953,628.058716   C814.804199,647.636230 841.194397,667.129089 867.052856,687.298523   C882.431824,699.294128 893.622314,714.851196 898.300232,734.087891   C902.316284,750.603210 900.258179,766.822632 893.143372,782.339844   C879.695068,811.669922 857.288757,833.280945 831.962646,852.032349   C782.458191,888.685242 732.594421,924.852905 682.872314,961.211731   C676.959167,965.535767 676.648743,965.541870 672.014282,959.882812   C644.580994,926.384399 621.173584,890.259949 603.358093,850.794861   C593.991699,830.046326 585.338196,808.831299 578.396301,787.175110   C571.882324,766.854187 567.390808,745.804016 563.257874,724.828735   C560.404602,710.347656 558.915100,695.485779 558.180298,680.726196   C557.132263,659.674316 556.484009,638.527771 557.288818,617.483765   C557.861206,602.514526 560.316956,587.482910 563.371094,572.777954   C566.939514,555.596619 572.076050,538.741089 576.516174,521.740051   C576.765625,520.784790 576.870178,519.791687 577.210449,518.455811  z" 
  >
  </path>
  <path 
    fill="none" 
    opacity="0.80" 
    stroke="#73496b"
    stroke-width="15" 
    d=" M1445.053467,1542.020752   C1443.638062,1544.648315 1442.351807,1546.924805 1440.730835,1549.794067   C1429.899048,1541.819824 1419.452393,1534.183105 1409.062012,1526.470581   C1332.054932,1469.311035 1255.042847,1412.158081 1178.072266,1354.949341   C1160.865112,1342.159912 1146.111572,1327.197021 1138.109253,1306.792603   C1133.508057,1295.060059 1131.929688,1283.149414 1134.569824,1270.386475   C1140.620728,1241.133911 1158.023193,1219.004883 1179.524414,1200.306885   C1200.578369,1181.997803 1223.335815,1165.600098 1245.776855,1148.944458   C1281.066406,1122.752686 1316.751587,1097.094238 1352.165894,1071.069336   C1355.921631,1068.309326 1358.213867,1068.371826 1361.247681,1072.074707   C1395.342529,1113.686768 1423.044678,1159.143188 1442.490112,1209.325806   C1450.167725,1229.139160 1456.780396,1249.488403 1462.110229,1270.051880   C1466.983398,1288.853027 1469.837036,1308.214722 1472.870361,1327.441528   C1474.635742,1338.632812 1475.352173,1350.027222 1475.913330,1361.361328   C1476.618408,1375.603271 1477.472534,1389.913940 1476.806763,1404.126831   C1476.097168,1419.276123 1474.246948,1434.434448 1471.866943,1449.425537   C1469.421875,1464.826416 1466.701172,1480.312988 1462.328125,1495.242676   C1457.701782,1511.037231 1450.985962,1526.219849 1445.053467,1542.020752  z"
  >
  </path>
</svg># https://www.robotstxt.org/robotstxt.html
User-agent: *
Disallow:
(()=>{"use strict";var e={7632:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.backendClient=void 0;const s=l(a(2167)),n=a(231),i=a(9968);t.backendClient=s.default.create({baseURL:`${n.backendUrl}/relay`,timeout:3e5}),t.backendClient.interceptors.request.use((e=>(0,i.get)("registration_token").then((t=>Object.assign(Object.assign({},e),{headers:Object.assign(Object.assign({},e.headers),{"Relay-Token":t})}))))),t.backendClient.interceptors.response.use((e=>e),(e=>{var t;return 401===(null===(t=e.response)||void 0===t?void 0:t.status)?(0,i.update)("registration_token",null).then((()=>Promise.reject(e))):Promise.reject(e)}))},231:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.requirePatientDetails=t.brand=t.serverPort=t.backendUrl=void 0,a(5142).config(),process.env,t.backendUrl="https://api.labxpert.ephi.gov.et",t.serverPort="4411",t.brand=JSON.parse('{"publisher":"MedX International Ltd","name":"LabXpert Relay","colors":{"primary":"#d05286","secondary":"#572345"},"logo":"","links":{"helpcenter":"https://labxpertsurveillance.tawk.help/","support":"https://tawk.to/chat/62de9ce937898912e95f8b2a/1g8qp9std?pop=1","website":"https://medx.international"}}'),t.requirePatientDetails=Boolean(JSON.parse("1"))},2473:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RegistrationError=void 0;class a extends Error{constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype)}}t.RegistrationError=a},8969:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.registerDevice=void 0;const s=l(a(2167)),n=a(231),i=a(1415),r=a(9968),o=a(2473);t.registerDevice=function(){return(0,i.createGeneXpertClient)().then((e=>(0,r.read)().then((t=>e.systemInfo().then((e=>{var a;return s.default.post(`${n.backendUrl}/relay/machines/register/`,Object.assign(Object.assign({},e),{labId:null===(a=null==t?void 0:t.lab)||void 0===a?void 0:a.id})).catch((e=>(console.error(e),Promise.reject(new o.RegistrationError(e.message))))).then((e=>e.data)).then((e=>"string"!=typeof e?Promise.reject(new o.RegistrationError("Invalid registration token")):(0,r.update)("registration_token",e)))}))))))}},81:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.deviceRouter=void 0;const s=l(a(3983)),n=a(6860),i=a(9634),r=a(1415),o=a(7219),u=a(9968),d=a(8969);t.deviceRouter=(0,n.Router)(),t.deviceRouter.get("/",((e,t)=>s.default.join((0,r.createGeneXpertClient)().then((e=>e.systemInfo().then((t=>e.close().then((()=>t)))))).catch((e=>(o.logger.error(e),{}))),(0,u.read)(),((e,t)=>(0,i.mergeRight)(e,t))).then((e=>t.json(e))).catch((e=>t.status(500).json({message:e.message}))))),t.deviceRouter.post("/register",((e,t,a)=>(0,d.registerDevice)().then((()=>t.send())).catch(a)))},3963:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.dismissRouter=void 0;const s=a(6860),n=l(a(2245)),i=a(9968);t.dismissRouter=(0,s.Router)(),t.dismissRouter.get("/:id",((e,t)=>{Promise.resolve().then((()=>(0,i.update)(e.params.id,(0,n.default)().add(1,"hour").toDate()))).then((()=>t.send()))}))},7306:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.toSystemInfo=t.createSequelize=t.assaysForDataEntry=t.LAB_RESULT_APPROVAL_DEADLINE_HOURS=t.hoursForDataEntry=void 0;const s=a(9634),n=a(496),i=l(a(2245)),r=a(881);t.hoursForDataEntry=8,t.LAB_RESULT_APPROVAL_DEADLINE_HOURS=1,t.assaysForDataEntry=["Xpert MTB-RIF Assay G4","Xpert MTB-RIF Ultra","Xpert MTB-XDR","Xpert_HIV-1 Viral Load","Xpert_HIV-1 Qual","Xpert HIV-1 Qual XC DBS"],t.createSequelize=function(e,t,a){const l="win32"===process.platform&&"true"!==process.env.IS_DEV?{dialectModulePath:"msnodesqlv8/lib/sequelize",dialectOptions:{options:{connectionString:`server=(local);Database=${e};Trusted_Connection=Yes;Driver={SQL Server Native Client 11.0}`,trustedConnection:!0,requestTimeout:3e5}}}:{database:e,username:t,password:a,dialectOptions:{options:{useUTC:!1,dateFirst:1}}},s=Object.assign(Object.assign({},l),{dialect:"mssql",logging:!1,pool:{min:0,max:5,idle:1e4}});return new n.Sequelize(s)},t.toSystemInfo=function(e,t){const a=e.sort(((e,t)=>new Date(t.log_time).getTime()-new Date(e.log_time).getTime())).map(((e,t,a)=>({serial:e.site_serial_number.toString(),instrument:e.instrument_serial_number.toString(),replaced:a.indexOf(e)!==t,lastLoggedAt:new Date(e.log_time),disabled:!(0,s.isNil)(e.disabled_at),position:e.site_name.trim()}))),[l]=(0,s.pluck)("sw_version",e),n=function(e){const[t]=(0,s.groupWith)(((e,t)=>Math.abs((0,i.default)(t.lastLoggedAt).diff(e.lastLoggedAt,"day"))<7),function(e){return(0,s.groupWith)(((e,t)=>e.instrument===t.instrument),e.filter((e=>e.serial.length>3&&e.instrument.length>3&&!e.replaced))).map((e=>e.sort(((e,t)=>new Date(t.lastLoggedAt).getTime()-new Date(e.lastLoggedAt).getTime())))).map((([e])=>e))}(e)).map((e=>(0,s.uniq)(e.map((e=>e.instrument)))));return t}(a),o=function(e){const[t]=(0,s.groupWith)(((e,t)=>Math.abs((0,i.default)(t.lastLoggedAt).diff(e.lastLoggedAt,"day"))<7),function(e){return(0,s.groupWith)(((e,t)=>e.position[0]===t.position[0]),e.filter((e=>e.serial.length>3&&e.instrument.length>3&&!e.replaced))).map((e=>e.sort(((e,t)=>new Date(t.lastLoggedAt).getTime()-new Date(e.lastLoggedAt).getTime())))).map((([e])=>e))}(e)).map((e=>(0,s.uniq)(e.map((e=>e.position[0])))));return(0,s.uniq)(e.filter((e=>t.includes(e.position[0]))).map((e=>e.position)))}(a);return{version:l,relayVersion:r.version,config:t,sites:o,modules:a,instruments:n}}},1415:function(e,t,a){var l=this&&this.__createBinding||(Object.create?function(e,t,a,l){void 0===l&&(l=a);var s=Object.getOwnPropertyDescriptor(t,a);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,l,s)}:function(e,t,a,l){void 0===l&&(l=a),e[l]=t[a]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&l(t,e,a);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.createGeneXpertClient=void 0;const i={user:"sa",password:"F00tball"};function r(e){return"win32"===process.platform&&"true"!==process.env.IS_DEV?Promise.resolve().then((()=>n(a(4768)))).then((t=>t.connect({server:"(local)",database:e,options:{trustedConnection:!0}}))):Promise.resolve().then((()=>n(a(9424)))).then((t=>t.connect(Object.assign(Object.assign({},i),{database:e,requestTimeout:3e3,connectionTimeout:3e3,server:"127.0.0.1",pool:{max:10,min:0,idleTimeoutMillis:3e4},options:{encrypt:!1,trustServerCertificate:!0}}))))}t.createGeneXpertClient=function(){return r("master").then((e=>function(e){return e.query("SELECT name FROM master.sys.databases").then((e=>e.recordset.map((e=>e.name)).sort().find((e=>e.match(/gx_\w+/)))||Promise.reject(new Error("No genexpert database found"))))}(e).then((t=>e.close().then((()=>r(t))).then((e=>function(e){return e.query("SELECT sw_version FROM system_log ORDER BY log_time DESC OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY").then((e=>e.recordset)).then((([e])=>e?e.sw_version:Promise.reject(new Error("Unknown version"))))}(e))).then((e=>[e,t])))))).then((([e,t])=>function(e,t,l,s){const[i,r]=e.split(".");return"6"===i&&parseInt(r,10)>=5?Promise.resolve().then((()=>n(a(1058)))).then((({GeneXpertClient:a})=>new a(e,t,l,s))):"6"===i?Promise.resolve().then((()=>n(a(2522)))).then((({GeneXpertClient:a})=>new a(e,t,l,s))):"5"===i?Promise.resolve().then((()=>n(a(8207)))).then((({GeneXpertClient:a})=>new a(e,t,l,s))):"4"===i?Promise.resolve().then((()=>n(a(7556)))).then((({GeneXpertClient:a})=>new a(e,t,l,s))):Promise.reject(new Error(`GeneXpert Version ${e} is not currently supported`))}(e,t,i.user,i.password)))}},7556:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{o(l.next(e))}catch(e){n(e)}}function r(e){try{o(l.throw(e))}catch(e){n(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,r)}o((l=l.apply(e,t||[])).next())}))},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.GeneXpertClient=void 0;const n=s(a(2245)),i=a(9634),r=a(496),o=a(7306),u=a(1558),d="YYYY/MM/DD HH:mm:ss.SSS";t.GeneXpertClient=class{constructor(e,t,a,l){this.version=e,this.sequelize=(0,o.createSequelize)(t,a,l),this.models=(0,u.initModels)(this.sequelize)}systemInfo(){const e=this.sequelize.query("\n        SELECT TOP 1 WITH TIES\n          [sw_version],\n          [instrument_serial_number],\n          [dbo].[system_log].[site_serial_number],\n          [site_name],\n          [log_time],\n          [dbo].[disabled_module].[creation] AS [disabled_at]\n        FROM [dbo].[system_log]\n          LEFT JOIN [dbo].[disabled_module]\n          ON [dbo].[disabled_module].[site_serial_number] = [dbo].[system_log].[site_serial_number]\n        ORDER BY row_number() \n        OVER (PARTITION BY [dbo].[system_log].[site_serial_number] ORDER BY [log_time] DESC)\n      ").then((([e])=>e)),t=this.models.Config.findAll().then((e=>e.map((e=>({[e.param_key]:e.param_val}))))).then(i.mergeAll);return Promise.all([e,t]).then((e=>(0,o.toSystemInfo)(...e)))}logsTotal(){return this.models.SystemLog.count()}testsTotal(){return this.models.Test.count()}testsPresyncables(e,t,a){return this.models.Test.findAll({where:{[r.Op.or]:[{modified:{[r.Op.gt]:(0,n.default)(e).format(d)}},{modified:{[r.Op.eq]:(0,n.default)(e).format(d)},test_ID:{[r.Op.notIn]:t}}]},attributes:["test_ID","modified"],limit:a,order:[["modified","ASC"]]}).then((e=>e.map((({test_ID:e,modified:t})=>({id:e.toString(),modified:(0,n.default)(t,d).toDate()})))))}testsSyncables(e){return this.models.Test.findAll({where:{test_ID:e},include:[{as:"operator",model:this.models.User},{as:"test_errors",model:this.models.TestPcError},{as:"test_run",model:this.models.TestRun,attributes:{exclude:["data","cartridge_barcode"]}},{as:"patient_test_order",model:this.models.PatientTestOrder,include:[{as:"patient",model:this.models.Patient}]},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]}},{as:"analyte_results",model:this.models.AnalyteResult,include:[{as:"analyte",model:this.models.Analyte}]},{as:"organism_results",model:this.models.OrganismResult,include:[{as:"organism",model:this.models.Organism}]}]}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.test_ID.toString()}))))}testsForEntry(e,t){return this.models.Test.findAll({where:{start_time:{[r.Op.gt]:(0,n.default)().subtract(t||o.hoursForDataEntry,"hours").format(d)},sample_ID:{[r.Op.notIn]:e}},include:[{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[r.Op.in]:o.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t;return{id:e.test_ID,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(e.end_time,d).toDate(),sampleId:e.sample_ID,startedAt:(0,n.default)(e.start_time,d).toDate()}}))))}logsPresyncables(e,t,a){return this.models.SystemLog.findAll({where:{[r.Op.or]:[{log_time:{[r.Op.gt]:(0,n.default)(e).format(d)}},{log_time:{[r.Op.eq]:(0,n.default)(e).format(d)},system_log_ID:{[r.Op.notIn]:t}}]},limit:a,attributes:["system_log_ID","log_time"],order:[["log_time","ASC"]]}).then((e=>e.map((({system_log_ID:e,log_time:t})=>({id:e.toString(),modified:(0,n.default)(t,d).toDate()})))))}logsSyncables(e){return this.models.SystemLog.findAll({where:{system_log_ID:{[r.Op.in]:e}}}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.system_log_ID.toString()}))))}close(){return this.sequelize.close()}getTest(e){return l(this,void 0,void 0,(function*(){return this.models.Test.findOne({where:{sample_ID:{[r.Op.eq]:e}}})}))}getTestsByTestIds(e){return this.models.Test.findAll({where:{test_ID:{[r.Op.in]:e}},include:[{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[r.Op.in]:o.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t;return{id:e.test_ID,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(e.end_time,d).toDate(),sampleId:e.sample_ID,startedAt:(0,n.default)(e.start_time,d).toDate()}}))))}getCompletedTestsBySampleIds(e){return this.models.Test.findAll({where:{sample_ID:{[r.Op.in]:e},end_time:{[r.Op.and]:[{[r.Op.not]:null},{[r.Op.between]:[(0,n.default)().subtract(o.LAB_RESULT_APPROVAL_DEADLINE_HOURS,"hours").format(d),(0,n.default)().format(d)]}]},result_text:{[r.Op.not]:null}},include:[{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[r.Op.in]:o.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t;return{id:e.test_ID,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(e.end_time,d).toDate(),sampleId:e.sample_ID,startedAt:(0,n.default)(e.start_time,d).toDate()}}))))}}},892:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Advancestagesetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Advancestagesetting",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1},stage_number:{type:l.DataTypes.SMALLINT,allowNull:!0},protocol_number:{type:l.DataTypes.SMALLINT,allowNull:!0},new_stage_number:{type:l.DataTypes.SMALLINT,allowNull:!0},stop_after_new_stage:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},stop_if_no_ct:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},advance_stage_settings_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"advancestagesettings",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_advancestagesettings",unique:!0,fields:[{name:"advance_stage_settings_id"}]}]})}}t.Advancestagesetting=s},4878:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AnalyteResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AnalyteResultText",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},target_result_key:{type:l.DataTypes.STRING(8),allowNull:!0},result_text_reference:{type:l.DataTypes.SMALLINT,allowNull:!1}},{tableName:"analyte_result_text ",schema:"dbo",timestamps:!1})}}t.AnalyteResultText=s},804:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AnalyteResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AnalyteResult",{test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},expected_result:{type:l.DataTypes.SMALLINT,allowNull:!0},endpoint:{type:l.DataTypes.FLOAT,allowNull:!1},threshold:{type:l.DataTypes.FLOAT,allowNull:!1},cycle_threshold:{type:l.DataTypes.FLOAT,allowNull:!1},probe_check_result:{type:l.DataTypes.SMALLINT,allowNull:!0},probe_check_reading1:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_reading2:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_reading3:{type:l.DataTypes.FLOAT,allowNull:!0},error_status:{type:l.DataTypes.SMALLINT,allowNull:!0},target_result:{type:l.DataTypes.SMALLINT,allowNull:!0},ic_result:{type:l.DataTypes.SMALLINT,allowNull:!0},ec_result:{type:l.DataTypes.SMALLINT,allowNull:!0},spc_result:{type:l.DataTypes.SMALLINT,allowNull:!0},interpretation:{type:l.DataTypes.SMALLINT,allowNull:!0},second_deriv_peak_height:{type:l.DataTypes.FLOAT,allowNull:!0},nc_ic_endpoint:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:0},curve_fit_result:{type:l.DataTypes.SMALLINT,allowNull:!0},delta_ct:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-9999},TTP:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:0},quantitative_result:{type:l.DataTypes.FLOAT,allowNull:!0},iqs_lq_result:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:1},iqs_hq_result:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:1},analyte_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},reason:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"analyte_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK_analyte_result",unique:!0,fields:[{name:"analyte_result_id"}]},{name:"test_ID",fields:[{name:"test_ID"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.AnalyteResult=s},5745:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Analyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Analyte",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_index:{type:l.DataTypes.INTEGER,allowNull:!1},usage:{type:l.DataTypes.SMALLINT,allowNull:!0},target:{type:l.DataTypes.BLOB,allowNull:!0},analyte_name:{type:l.DataTypes.STRING(20),allowNull:!0},intended_concentration:{type:l.DataTypes.FLOAT,allowNull:!0},analyte_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},use_curve_fit:{type:l.DataTypes.BOOLEAN,allowNull:!0},enable_signal_loss_detection:{type:l.DataTypes.BOOLEAN,allowNull:!0},reporter_name:{type:l.DataTypes.STRING(12),allowNull:!1},boxcar_cycles:{type:l.DataTypes.SMALLINT,allowNull:!0},curve_analysis:{type:l.DataTypes.SMALLINT,allowNull:!0},background_start:{type:l.DataTypes.SMALLINT,allowNull:!0},background_end:{type:l.DataTypes.SMALLINT,allowNull:!0},cycle_if_no_ct:{type:l.DataTypes.SMALLINT,allowNull:!0},min_ct_req_pass_controls:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_on_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},curve_fit_start_background:{type:l.DataTypes.BOOLEAN,allowNull:!0},curve_fit_start_index:{type:l.DataTypes.SMALLINT,allowNull:!0},curve_fit_end_data:{type:l.DataTypes.BOOLEAN,allowNull:!0},curve_fit_end_index:{type:l.DataTypes.SMALLINT,allowNull:!0},curve_fit_min_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_nrse:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_slope_vs_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},background_min_points:{type:l.DataTypes.SMALLINT,allowNull:!0},background_look_back:{type:l.DataTypes.SMALLINT,allowNull:!0},background_validate:{type:l.DataTypes.BOOLEAN,allowNull:!0},background_max_slope:{type:l.DataTypes.FLOAT,allowNull:!0},background_max_rms_error:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_use_delta_pc:{type:l.DataTypes.BOOLEAN,allowNull:!0},probe_check_min_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_max_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},invalid_bias:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"analyte",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_analyte",unique:!0,fields:[{name:"analyte_id"}]},{name:"pos",fields:[{name:"analyte_index"}]}]})}}t.Analyte=s},4044:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayCartridge=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayCartridge",{assay_cartridge_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!0},need_lot_parameters:{type:l.DataTypes.BOOLEAN,allowNull:!1},need_ext_control:{type:l.DataTypes.BOOLEAN,allowNull:!1},ext_control_frq:{type:l.DataTypes.SMALLINT,allowNull:!0},cartridge_type_ID:{type:l.DataTypes.INTEGER,allowNull:!0},command_seq:{type:l.DataTypes.BLOB,allowNull:!0},melt_all_peaks:{type:l.DataTypes.BOOLEAN,allowNull:!1},use_background_subtraction:{type:l.DataTypes.BOOLEAN,allowNull:!1},air_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},overflow_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},comments:{type:l.DataTypes.STRING(256),allowNull:!0},command_seq_format:{type:l.DataTypes.SMALLINT,allowNull:!0},picture:{type:l.DataTypes.BLOB,allowNull:!0},read_interval:{type:l.DataTypes.INTEGER,allowNull:!0},prep_cartridge_shelf_life:{type:l.DataTypes.INTEGER,allowNull:!1},retain_cartridge:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"assay_cartridge",schema:"dbo",timestamps:!1,indexes:[{name:"PK_assay_cartridge",unique:!0,fields:[{name:"assay_cartridge_id"}]}]})}}t.AssayCartridge=s},8667:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayChamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayChamber",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!0},name:{type:l.DataTypes.STRING(16),allowNull:!0},initial_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},assay_chamber_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"assay_chamber",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"PK_assay_chamber",unique:!0,fields:[{name:"assay_chamber_id"}]}]})}}t.AssayChamber=s},4942:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Assay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Assay",{assay_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},pos:{type:l.DataTypes.INTEGER,allowNull:!0},name:{type:l.DataTypes.STRING(32),allowNull:!0},version:{type:l.DataTypes.SMALLINT,allowNull:!0},user_ID:{type:l.DataTypes.INTEGER,allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_verified:{type:l.DataTypes.BOOLEAN,allowNull:!0},comments:{type:l.DataTypes.STRING(256),allowNull:!0},lock_comments:{type:l.DataTypes.STRING(256),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},product_code:{type:l.DataTypes.SMALLINT,allowNull:!0},assay_type:{type:l.DataTypes.SMALLINT,allowNull:!0},disclaimer:{type:l.DataTypes.STRING(512),allowNull:!0},company_code:{type:l.DataTypes.SMALLINT,allowNull:!0},result_text_type:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:0},class:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:0},analysis_type:{type:l.DataTypes.SMALLINT,allowNull:!0},sample_prep_instruction:{type:l.DataTypes.STRING(256),allowNull:!0},sample_prep_video:{type:l.DataTypes.BLOB,allowNull:!0},test_code:{type:l.DataTypes.STRING(15),allowNull:!0},enable_test_code:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},enable_auto_archive:{type:l.DataTypes.BOOLEAN,allowNull:!1},default_result_text_reference:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:5},default_text_color_reference:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:3},clia_waived:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"assay",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_assay_ID",unique:!0,fields:[{name:"assay_ID"}]},{name:"pos",fields:[{name:"pos"}]}]})}}t.Assay=s},1163:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CalibrationChamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CalibrationChamber",{calibration_seq_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1,primaryKey:!0},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!0},name:{type:l.DataTypes.STRING(16),allowNull:!0},initial_volume:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"calibration_chamber",schema:"dbo",timestamps:!1,indexes:[{name:"calibration_seq_id",fields:[{name:"calibration_seq_id"}]},{name:"cartridge_ID",fields:[{name:"cartridge_id"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"PK_calibration_chamber",unique:!0,fields:[{name:"calibration_seq_id"},{name:"cartridge_id"},{name:"chamber_number"}]}]})}}t.CalibrationChamber=s},2632:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CalibrationSequence=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CalibrationSequence",{calibration_seq_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},pos:{type:l.DataTypes.INTEGER,allowNull:!0},name:{type:l.DataTypes.STRING(32),allowNull:!0},cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!0},command_seq:{type:l.DataTypes.BLOB,allowNull:!0},command_seq_format:{type:l.DataTypes.SMALLINT,allowNull:!0},air_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},comments:{type:l.DataTypes.STRING(256),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"calibration_sequence",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_calibration_sequence",unique:!0,fields:[{name:"calibration_seq_id"}]},{name:"pos",fields:[{name:"pos"}]}]})}}t.CalibrationSequence=s},4859:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CartridgeOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CartridgeOrder",{cartridge_order_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},sample_id:{type:l.DataTypes.STRING(25),allowNull:!0},scanned_SID:{type:l.DataTypes.BOOLEAN,allowNull:!0},scanned_PID:{type:l.DataTypes.BOOLEAN,allowNull:!0},priority:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0},rgt_lot_id:{type:l.DataTypes.STRING(6),allowNull:!1},cartridge_serial_number:{type:l.DataTypes.BIGINT,allowNull:!0},cartridge_expiration_date:{type:l.DataTypes.DATE,allowNull:!0},cartridge_barcode:{type:l.DataTypes.STRING(1024),allowNull:!0},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},other_sample_type_text:{type:l.DataTypes.STRING(32),allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_status:{type:l.DataTypes.STRING(32),allowNull:!0},order_sw_version:{type:l.DataTypes.STRING(16),allowNull:!1},cartridge_order_time:{type:l.DataTypes.STRING(24),allowNull:!0},cartridge_order_expiration:{type:l.DataTypes.STRING(24),allowNull:!0},location:{type:l.DataTypes.STRING(32),allowNull:!0},location_site:{type:l.DataTypes.INTEGER,allowNull:!0},lis_order_id:{type:l.DataTypes.INTEGER,allowNull:!1},test_type:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"cartridge_order",schema:"dbo",timestamps:!1,indexes:[{name:"PK_cartridge_order",unique:!0,fields:[{name:"cartridge_order_id"}]}]})}}t.CartridgeOrder=s},1544:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Cartridge=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Cartridge",{cartridge_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},name:{type:l.DataTypes.STRING(32),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},max_pressure:{type:l.DataTypes.SMALLINT,allowNull:!0},syringe_min_transfer_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},syringe_max_transfer_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},syringe_max_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_syringe_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_chamber_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},direct_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},filter_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},direct_flow_rate_min:{type:l.DataTypes.SMALLINT,allowNull:!0},direct_flow_rate_max:{type:l.DataTypes.SMALLINT,allowNull:!0},microliters_per_revolution:{type:l.DataTypes.FLOAT,allowNull:!0},initial_aspirate_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},initial_aspirate_flow_rate:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_pressurized_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},air_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},overflow_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},min_pressure:{type:l.DataTypes.SMALLINT,allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1,defaultValue:""},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},filter_flow_rate_min:{type:l.DataTypes.SMALLINT,allowNull:!0},filter_flow_rate_max:{type:l.DataTypes.SMALLINT,allowNull:!0},cartridge_foot_height:{type:l.DataTypes.INTEGER,allowNull:!0},adc_2_psi:{type:l.DataTypes.FLOAT,allowNull:!0},plunger_strip_position:{type:l.DataTypes.INTEGER,allowNull:!0},plunger_pickup_position:{type:l.DataTypes.INTEGER,allowNull:!0},picture:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"cartridge",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"name",fields:[{name:"name"}]},{name:"PK_cartridge_ID",unique:!0,fields:[{name:"cartridge_ID"}]},{name:"version",fields:[{name:"version"}]}]})}}t.Cartridge=s},3918:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Chamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Chamber",{cartridge_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1,primaryKey:!0},min_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},max_volume:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"chamber",schema:"dbo",timestamps:!1,indexes:[{name:"cartridge_ID",fields:[{name:"cartridge_ID"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"PK_chamber",unique:!0,fields:[{name:"cartridge_ID"},{name:"chamber_number"}]}]})}}t.Chamber=s},6038:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorDisclaimer=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ColorDisclaimer",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},color:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},disclaimer:{type:l.DataTypes.STRING(256),allowNull:!0}},{tableName:"color_disclaimer",schema:"dbo",timestamps:!1,indexes:[{name:"PK_color_disclaimer",unique:!0,fields:[{name:"assay_ID"},{name:"color"}]}]})}}t.ColorDisclaimer=s},87:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Config",{param_key:{type:l.DataTypes.STRING(64),primaryKey:!0,allowNull:!1},param_val:{type:l.DataTypes.STRING(512),allowNull:!1,defaultValue:""}},{tableName:"config",schema:"dbo",timestamps:!1})}}t.Config=s},2075:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CrosstalkFactor=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CrosstalkFactor",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},protocol_number:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:-1},factor:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:0},crosstalk_factor_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},from_analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},to_analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"crosstalk_factor",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_crosstalk_factor",unique:!0,fields:[{name:"crosstalk_factor_id"}]}]})}}t.CrosstalkFactor=s},1726:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DisabledModule=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("DisabledModule",{site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!0},creation:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"disabled_module",schema:"dbo",timestamps:!1,indexes:[{name:"PK_disabled_module",unique:!0,fields:[{name:"site_serial_number"}]}]})}}t.DisabledModule=s},7772:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Dtproperty=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Dtproperty",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},objectid:{type:l.DataTypes.INTEGER,allowNull:!0},property:{type:l.DataTypes.STRING(64),allowNull:!1,primaryKey:!0},value:{type:l.DataTypes.STRING(255),allowNull:!0},uvalue:{type:l.DataTypes.STRING(255),allowNull:!0},lvalue:{type:l.DataTypes.BLOB,allowNull:!0},version:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:0}},{tableName:"dtproperties",schema:"dbo",timestamps:!1,indexes:[{name:"pk_dtproperties",unique:!0,fields:[{name:"id"},{name:"property"}]}]})}}t.Dtproperty=s},2e3:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.FailedLocation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("FailedLocation",{location:{type:l.DataTypes.STRING(32),allowNull:!1,primaryKey:!0},location_site:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"failed_location",schema:"dbo",timestamps:!1,indexes:[{name:"PK_failed_location",unique:!0,fields:[{name:"location"},{name:"location_site"}]}]})}}t.FailedLocation=s},5033:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetting",{graph_setting_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},graph_type:{type:l.DataTypes.SMALLINT,allowNull:!1},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"assay_ID"}},param_key:{type:l.DataTypes.STRING(64),allowNull:!1},param_val:{type:l.DataTypes.STRING(512),allowNull:!1,defaultValue:""}},{tableName:"graph_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__graph_setting__408F9238",unique:!0,fields:[{name:"graph_setting_id"}]}]})}}t.GraphSetting=s},140:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetup",{graph_setup_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},pos:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!0},is_default:{type:l.DataTypes.BOOLEAN,allowNull:!1},user_ID:{type:l.DataTypes.INTEGER,allowNull:!0},settings:{type:l.DataTypes.INTEGER,allowNull:!0},format:{type:l.DataTypes.SMALLINT,allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_graph_setup",unique:!0,fields:[{name:"graph_setup_ID"}]},{name:"pos",fields:[{name:"pos"}]}]})}}t.GraphSetup=s},6281:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.HaplotypeResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("HaplotypeResultText",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(11),allowNull:!1,primaryKey:!0},alleles_text_1:{type:l.DataTypes.STRING(10),allowNull:!0},alleles_text_2:{type:l.DataTypes.STRING(10),allowNull:!0},text_color_reference:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"haplotype_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK_haplotype_result_text",unique:!0,fields:[{name:"assay_id"},{name:"haplotype_id"},{name:"result_key"}]}]})}}t.HaplotypeResultText=s},5038:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Haplotype=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Haplotype",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},name:{type:l.DataTypes.STRING(20),allowNull:!0},lis_test_code:{type:l.DataTypes.STRING(15),allowNull:!0}},{tableName:"haplotype",schema:"dbo",timestamps:!1,indexes:[{name:"PK_haplotype",unique:!0,fields:[{name:"assay_id"},{name:"haplotype_id"}]}]})}}t.Haplotype=s},7912:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.InfinitySystemLog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("InfinitySystemLog",{infinity_system_log_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1},code:{type:l.DataTypes.INTEGER,allowNull:!1},subsystem:{type:l.DataTypes.INTEGER,allowNull:!1},details:{type:l.DataTypes.STRING(512),allowNull:!0},log_time:{type:l.DataTypes.STRING(24),allowNull:!1},sw_version:{type:l.DataTypes.STRING(16),allowNull:!1},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"infinity_system_log",schema:"dbo",timestamps:!1,indexes:[{name:"PK_infinity_system_log",unique:!0,fields:[{name:"infinity_system_log_id"}]}]})}}t.InfinitySystemLog=s},1558:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestGraphSetup=t.TestBlogCounter=t.TestBlog=t.Test=t.SystemLog=t.Snp=t.SampleType=t.SampleSetting=t.RetainCartridgeColor=t.ReagentLot=t.QuantUnitSetting=t.QuantResult=t.Privilege=t.PatientTestOrder=t.Patient=t.Path=t.OrganismTarget=t.OrganismResultText=t.OrganismResultRule=t.OrganismResultEvaluator=t.OrganismResult=t.Organism=t.MeltPeakSetting=t.MeltPeakResult=t.LisTestOrder=t.Instrument=t.InfinitySystemLog=t.HaplotypeResultText=t.Haplotype=t.GraphSetup=t.GraphSetting=t.FailedLocation=t.Dtproperty=t.DisabledModule=t.CrosstalkFactor=t.Config=t.ColorDisclaimer=t.Chamber=t.CartridgeOrder=t.Cartridge=t.CalibrationSequence=t.CalibrationChamber=t.AssayChamber=t.AssayCartridge=t.Assay=t.AnalyteResultText=t.AnalyteResult=t.Analyte=t.Advancestagesetting=t.IntegrityCheck=void 0,t.initModels=t.User=t.TestRun=t.TestPcError=t.TestHistory=void 0;const l=a(8792);Object.defineProperty(t,"IntegrityCheck",{enumerable:!0,get:function(){return l.IntegrityCheck}});const s=a(892);Object.defineProperty(t,"Advancestagesetting",{enumerable:!0,get:function(){return s.Advancestagesetting}});const n=a(5745);Object.defineProperty(t,"Analyte",{enumerable:!0,get:function(){return n.Analyte}});const i=a(804);Object.defineProperty(t,"AnalyteResult",{enumerable:!0,get:function(){return i.AnalyteResult}});const r=a(4878);Object.defineProperty(t,"AnalyteResultText",{enumerable:!0,get:function(){return r.AnalyteResultText}});const o=a(4942);Object.defineProperty(t,"Assay",{enumerable:!0,get:function(){return o.Assay}});const u=a(4044);Object.defineProperty(t,"AssayCartridge",{enumerable:!0,get:function(){return u.AssayCartridge}});const d=a(8667);Object.defineProperty(t,"AssayChamber",{enumerable:!0,get:function(){return d.AssayChamber}});const p=a(1163);Object.defineProperty(t,"CalibrationChamber",{enumerable:!0,get:function(){return p.CalibrationChamber}});const y=a(2632);Object.defineProperty(t,"CalibrationSequence",{enumerable:!0,get:function(){return y.CalibrationSequence}});const c=a(1544);Object.defineProperty(t,"Cartridge",{enumerable:!0,get:function(){return c.Cartridge}});const _=a(4859);Object.defineProperty(t,"CartridgeOrder",{enumerable:!0,get:function(){return _.CartridgeOrder}});const m=a(3918);Object.defineProperty(t,"Chamber",{enumerable:!0,get:function(){return m.Chamber}});const T=a(6038);Object.defineProperty(t,"ColorDisclaimer",{enumerable:!0,get:function(){return T.ColorDisclaimer}});const N=a(87);Object.defineProperty(t,"Config",{enumerable:!0,get:function(){return N.Config}});const g=a(2075);Object.defineProperty(t,"CrosstalkFactor",{enumerable:!0,get:function(){return g.CrosstalkFactor}});const f=a(1726);Object.defineProperty(t,"DisabledModule",{enumerable:!0,get:function(){return f.DisabledModule}});const D=a(7772);Object.defineProperty(t,"Dtproperty",{enumerable:!0,get:function(){return D.Dtproperty}});const E=a(2e3);Object.defineProperty(t,"FailedLocation",{enumerable:!0,get:function(){return E.FailedLocation}});const b=a(5033);Object.defineProperty(t,"GraphSetting",{enumerable:!0,get:function(){return b.GraphSetting}});const w=a(140);Object.defineProperty(t,"GraphSetup",{enumerable:!0,get:function(){return w.GraphSetup}});const I=a(5038);Object.defineProperty(t,"Haplotype",{enumerable:!0,get:function(){return I.Haplotype}});const R=a(6281);Object.defineProperty(t,"HaplotypeResultText",{enumerable:!0,get:function(){return R.HaplotypeResultText}});const O=a(7912);Object.defineProperty(t,"InfinitySystemLog",{enumerable:!0,get:function(){return O.InfinitySystemLog}});const h=a(3662);Object.defineProperty(t,"Instrument",{enumerable:!0,get:function(){return h.Instrument}});const M=a(9806);Object.defineProperty(t,"LisTestOrder",{enumerable:!0,get:function(){return M.LisTestOrder}});const v=a(965);Object.defineProperty(t,"MeltPeakResult",{enumerable:!0,get:function(){return v.MeltPeakResult}});const G=a(2792);Object.defineProperty(t,"MeltPeakSetting",{enumerable:!0,get:function(){return G.MeltPeakSetting}});const A=a(4397);Object.defineProperty(t,"Organism",{enumerable:!0,get:function(){return A.Organism}});const S=a(199);Object.defineProperty(t,"OrganismResult",{enumerable:!0,get:function(){return S.OrganismResult}});const P=a(9671);Object.defineProperty(t,"OrganismResultEvaluator",{enumerable:!0,get:function(){return P.OrganismResultEvaluator}});const L=a(4953);Object.defineProperty(t,"OrganismResultRule",{enumerable:!0,get:function(){return L.OrganismResultRule}});const x=a(6563);Object.defineProperty(t,"OrganismResultText",{enumerable:!0,get:function(){return x.OrganismResultText}});const C=a(2932);Object.defineProperty(t,"OrganismTarget",{enumerable:!0,get:function(){return C.OrganismTarget}});const K=a(9094);Object.defineProperty(t,"Path",{enumerable:!0,get:function(){return K.Path}});const j=a(5549);Object.defineProperty(t,"Patient",{enumerable:!0,get:function(){return j.Patient}});const q=a(1106);Object.defineProperty(t,"PatientTestOrder",{enumerable:!0,get:function(){return q.PatientTestOrder}});const k=a(3656);Object.defineProperty(t,"Privilege",{enumerable:!0,get:function(){return k.Privilege}});const F=a(9056);Object.defineProperty(t,"QuantResult",{enumerable:!0,get:function(){return F.QuantResult}});const B=a(3366);Object.defineProperty(t,"QuantUnitSetting",{enumerable:!0,get:function(){return B.QuantUnitSetting}});const H=a(8963);Object.defineProperty(t,"ReagentLot",{enumerable:!0,get:function(){return H.ReagentLot}});const V=a(1186);Object.defineProperty(t,"RetainCartridgeColor",{enumerable:!0,get:function(){return V.RetainCartridgeColor}});const U=a(217);Object.defineProperty(t,"SampleSetting",{enumerable:!0,get:function(){return U.SampleSetting}});const Q=a(1863);Object.defineProperty(t,"SampleType",{enumerable:!0,get:function(){return Q.SampleType}});const X=a(8094);Object.defineProperty(t,"Snp",{enumerable:!0,get:function(){return X.Snp}});const z=a(7634);Object.defineProperty(t,"SystemLog",{enumerable:!0,get:function(){return z.SystemLog}});const Y=a(4678);Object.defineProperty(t,"Test",{enumerable:!0,get:function(){return Y.Test}});const $=a(6450);Object.defineProperty(t,"TestBlog",{enumerable:!0,get:function(){return $.TestBlog}});const J=a(4258);Object.defineProperty(t,"TestBlogCounter",{enumerable:!0,get:function(){return J.TestBlogCounter}});const W=a(9432);Object.defineProperty(t,"TestGraphSetup",{enumerable:!0,get:function(){return W.TestGraphSetup}});const Z=a(1360);Object.defineProperty(t,"TestHistory",{enumerable:!0,get:function(){return Z.TestHistory}});const ee=a(2848);Object.defineProperty(t,"TestPcError",{enumerable:!0,get:function(){return ee.TestPcError}});const te=a(972);Object.defineProperty(t,"TestRun",{enumerable:!0,get:function(){return te.TestRun}});const ae=a(3509);Object.defineProperty(t,"User",{enumerable:!0,get:function(){return ae.User}}),t.initModels=function(e){const t=l.IntegrityCheck.initModel(e),a=s.Advancestagesetting.initModel(e),le=n.Analyte.initModel(e),se=i.AnalyteResult.initModel(e),ne=r.AnalyteResultText.initModel(e),ie=o.Assay.initModel(e),re=u.AssayCartridge.initModel(e),oe=d.AssayChamber.initModel(e),ue=p.CalibrationChamber.initModel(e),de=y.CalibrationSequence.initModel(e),pe=c.Cartridge.initModel(e),ye=_.CartridgeOrder.initModel(e),ce=m.Chamber.initModel(e),_e=T.ColorDisclaimer.initModel(e),me=N.Config.initModel(e),Te=g.CrosstalkFactor.initModel(e),Ne=f.DisabledModule.initModel(e),ge=D.Dtproperty.initModel(e),fe=E.FailedLocation.initModel(e),De=b.GraphSetting.initModel(e),Ee=w.GraphSetup.initModel(e),be=I.Haplotype.initModel(e),we=R.HaplotypeResultText.initModel(e),Ie=O.InfinitySystemLog.initModel(e),Re=h.Instrument.initModel(e),Oe=M.LisTestOrder.initModel(e),he=v.MeltPeakResult.initModel(e),Me=G.MeltPeakSetting.initModel(e),ve=A.Organism.initModel(e),Ge=S.OrganismResult.initModel(e),Ae=P.OrganismResultEvaluator.initModel(e),Se=L.OrganismResultRule.initModel(e),Pe=x.OrganismResultText.initModel(e),Le=C.OrganismTarget.initModel(e),xe=K.Path.initModel(e),Ce=j.Patient.initModel(e),Ke=q.PatientTestOrder.initModel(e),je=k.Privilege.initModel(e),qe=F.QuantResult.initModel(e),ke=B.QuantUnitSetting.initModel(e),Fe=H.ReagentLot.initModel(e),Be=V.RetainCartridgeColor.initModel(e),He=U.SampleSetting.initModel(e),Ve=Q.SampleType.initModel(e),Ue=X.Snp.initModel(e),Qe=z.SystemLog.initModel(e),Xe=Y.Test.initModel(e),ze=$.TestBlog.initModel(e),Ye=J.TestBlogCounter.initModel(e),$e=W.TestGraphSetup.initModel(e),Je=Z.TestHistory.initModel(e),We=ee.TestPcError.initModel(e),Ze=te.TestRun.initModel(e),et=ae.User.initModel(e);return De.belongsTo(ie,{as:"assay",foreignKey:"assay_id"}),ie.hasMany(De,{as:"graph_settings",foreignKey:"assay_id"}),ke.belongsTo(ie,{as:"assay",foreignKey:"assay_id"}),ie.hasMany(ke,{as:"quant_unit_settings",foreignKey:"assay_id"}),Le.belongsTo(ke,{as:"selected_quant_unit",foreignKey:"selected_quant_unit_id"}),ke.hasMany(Le,{as:"organism_targets",foreignKey:"selected_quant_unit_id"}),qe.belongsTo(ke,{as:"quant_unit_setting",foreignKey:"quant_unit_setting_id"}),ke.hasMany(qe,{as:"quant_results",foreignKey:"quant_unit_setting_id"}),qe.belongsTo(Xe,{as:"test",foreignKey:"test_id"}),Xe.hasMany(qe,{as:"quant_results",foreignKey:"test_id"}),Xe.hasMany(Ge,{as:"organism_results",foreignKey:"test_ID",sourceKey:"test_ID"}),Xe.belongsTo(ie,{as:"assay",foreignKey:"assay_ID",targetKey:"assay_ID"}),Xe.hasMany(se,{as:"analyte_results",foreignKey:"test_ID"}),Xe.belongsTo(et,{as:"operator",foreignKey:"operator_ids"}),Xe.hasOne(Ze,{as:"test_run",foreignKey:"test_ID"}),Xe.hasOne(Ke,{as:"patient_test_order",foreignKey:"test_id"}),Xe.hasMany(We,{as:"test_errors",foreignKey:"test_id"}),Ke.belongsTo(Ce,{as:"patient",foreignKey:"patient_id"}),se.belongsTo(le,{as:"analyte",foreignKey:"analyte_id"}),Ge.belongsTo(ve,{as:"organism",foreignKey:"organism_id",targetKey:"organism_id"}),Ye.belongsTo(ze,{as:"test_blog",foreignKey:"test_blog_ID"}),ze.hasMany(Ye,{as:"test_blog_counters",foreignKey:"test_blog_ID"}),{IntegrityCheck:t,Advancestagesetting:a,Analyte:le,AnalyteResult:se,AnalyteResultText:ne,Assay:ie,AssayCartridge:re,AssayChamber:oe,CalibrationChamber:ue,CalibrationSequence:de,Cartridge:pe,CartridgeOrder:ye,Chamber:ce,ColorDisclaimer:_e,Config:me,CrosstalkFactor:Te,DisabledModule:Ne,Dtproperty:ge,FailedLocation:fe,GraphSetting:De,GraphSetup:Ee,Haplotype:be,HaplotypeResultText:we,InfinitySystemLog:Ie,Instrument:Re,LisTestOrder:Oe,MeltPeakResult:he,MeltPeakSetting:Me,Organism:ve,OrganismResult:Ge,OrganismResultEvaluator:Ae,OrganismResultRule:Se,OrganismResultText:Pe,OrganismTarget:Le,Path:xe,Patient:Ce,PatientTestOrder:Ke,Privilege:je,QuantResult:qe,QuantUnitSetting:ke,ReagentLot:Fe,RetainCartridgeColor:Be,SampleSetting:He,SampleType:Ve,Snp:Ue,SystemLog:Qe,Test:Xe,TestBlog:ze,TestBlogCounter:Ye,TestGraphSetup:$e,TestHistory:Je,TestPcError:We,TestRun:Ze,User:et}}},3662:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Instrument=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Instrument",{Instrument_id:{type:l.DataTypes.INTEGER,allowNull:!0},mac_address:{type:l.DataTypes.BLOB,allowNull:!0},serial_number:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"instrument",schema:"dbo",timestamps:!1,indexes:[{name:"mac_address",fields:[{name:"mac_address"}]}]})}}t.Instrument=s},8792:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.IntegrityCheck=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("IntegrityCheck",{table_name:{type:l.DataTypes.STRING(32),allowNull:!0},field_name:{type:l.DataTypes.STRING(24),allowNull:!0},id_number:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"Integrity_Check",schema:"dbo",timestamps:!1})}}t.IntegrityCheck=s},9806:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisTestOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisTestOrder",{instrument_specimen_ID:{type:l.DataTypes.STRING(64),allowNull:!1,defaultValue:""},sample_ID:{type:l.DataTypes.STRING(25),allowNull:!0},test_code:{type:l.DataTypes.STRING(15),allowNull:!0,defaultValue:""},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:-1},order_time:{type:l.DataTypes.STRING(24),allowNull:!0},order_status:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:1},priority:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:1},LIS_test_order_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"lis_test_order",schema:"dbo",timestamps:!1,indexes:[{name:"IX_lis_test_order",fields:[{name:"instrument_specimen_ID"}]},{name:"PK_lis_test_order",unique:!0,fields:[{name:"LIS_test_order_ID"}]}]})}}t.LisTestOrder=s},965:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakResult",{melt_peak_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_result_id:{type:l.DataTypes.INTEGER,allowNull:!1},peak_index:{type:l.DataTypes.INTEGER,allowNull:!1},peak_height:{type:l.DataTypes.FLOAT,allowNull:!1},peak_temperature:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"melt_peak_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK_melt_peak_result",unique:!0,fields:[{name:"melt_peak_result_id"}]}]})}}t.MeltPeakResult=s},2792:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakSetting",{melt_peak_settings_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},slope_positive:{type:l.DataTypes.BOOLEAN,allowNull:!1},baseline_start_temp:{type:l.DataTypes.FLOAT,allowNull:!1},baseline_look_back:{type:l.DataTypes.FLOAT,allowNull:!1},baseline_num_points:{type:l.DataTypes.INTEGER,allowNull:!1},points_around_peak:{type:l.DataTypes.INTEGER,allowNull:!1},peak_threshold:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_min:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_max:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"melt_peak_settings",schema:"dbo",timestamps:!1,indexes:[{name:"PK_melt_peak_settings",unique:!0,fields:[{name:"melt_peak_settings_id"}]}]})}}t.MeltPeakSetting=s},9671:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultEvaluator=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultEvaluator",{organism_result_evaluator_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0},parent_evaluator_id:{type:l.DataTypes.INTEGER,allowNull:!0},evaluator_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"organism_result_evaluator",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result_evaluator",unique:!0,fields:[{name:"organism_result_evaluator_id"}]}]})}}t.OrganismResultEvaluator=s},4953:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultRule=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultRule",{organism_result_rule_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},evaluator_id:{type:l.DataTypes.INTEGER,allowNull:!0},parent_rule_id:{type:l.DataTypes.INTEGER,allowNull:!0},rule_type:{type:l.DataTypes.INTEGER,allowNull:!1},rule_anded:{type:l.DataTypes.BOOLEAN,allowNull:!0},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0},pass_on_equals:{type:l.DataTypes.BOOLEAN,allowNull:!0},interpretation:{type:l.DataTypes.INTEGER,allowNull:!0},reasons:{type:l.DataTypes.STRING(50),allowNull:!0},pass_on_peak:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"organism_result_rule",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result_rule",unique:!0,fields:[{name:"organism_result_rule_id"}]}]})}}t.OrganismResultRule=s},6563:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultText",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(8),allowNull:!1},result_text_reference:{type:l.DataTypes.SMALLINT,allowNull:!0},text_color_reference:{type:l.DataTypes.SMALLINT,allowNull:!0},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},organism_result_text_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"organism_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result_text",unique:!0,fields:[{name:"organism_result_text_id"}]}]})}}t.OrganismResultText=s},199:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResult",{organism_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},result_type:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0},haplotype_index:{type:l.DataTypes.INTEGER,allowNull:!0},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_color:{type:l.DataTypes.INTEGER,allowNull:!0},result_invalid:{type:l.DataTypes.BOOLEAN,allowNull:!0},allele2_text:{type:l.DataTypes.TEXT,allowNull:!0},lda_total:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result",unique:!0,fields:[{name:"organism_result_id"}]}]})}}t.OrganismResult=s},2932:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismTarget=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismTarget",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1},selected_quant_unit_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"quant_unit_setting",key:"quant_unit_setting_id"}},organism_target_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},lda_ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!0},lda_delta_ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"organism_target",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_target",unique:!0,fields:[{name:"organism_target_id"}]}]})}}t.OrganismTarget=s},4397:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Organism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Organism",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(20),allowNull:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1},early_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},late_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},medium_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},low_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},very_low_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},semi_quant_text_ref:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:-1},replacement_text_ref:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:-1},replacement_color_ref:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:-1},delta_ct_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},organism_lis_test_code:{type:l.DataTypes.STRING(15),allowNull:!0},organism_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},lda_intercept:{type:l.DataTypes.FLOAT,allowNull:!0},lda_min_valid:{type:l.DataTypes.FLOAT,allowNull:!0},lda_cutoff:{type:l.DataTypes.FLOAT,allowNull:!0},lda_max_valid:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism",unique:!0,fields:[{name:"organism_id"}]}]})}}t.Organism=s},9094:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Path=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Path",{path_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},cartridge_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1},tube:{type:l.DataTypes.BOOLEAN,allowNull:!0},block:{type:l.DataTypes.BOOLEAN,allowNull:!0},type:{type:l.DataTypes.SMALLINT,allowNull:!0},angular_offset:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"path",schema:"dbo",timestamps:!1,indexes:[{name:"cartridge_ID",fields:[{name:"cartridge_ID"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"path_id",fields:[{name:"path_ID"}]},{name:"PK_path",unique:!0,fields:[{name:"path_ID"},{name:"cartridge_ID"}]},{name:"type",fields:[{name:"type"}]}]})}}t.Path=s},1106:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PatientTestOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PatientTestOrder",{patient_test_order_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},patient_id:{type:l.DataTypes.INTEGER,allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0},lis_test_order_id:{type:l.DataTypes.INTEGER,allowNull:!0},cartridge_order_id:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"patient_test_order",schema:"dbo",timestamps:!1,indexes:[{name:"PK__patient_test_ord__4924D839",unique:!0,fields:[{name:"patient_test_order_id"}]}]})}}t.PatientTestOrder=s},5549:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Patient=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Patient",{patient_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},gx_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},practice_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},family_name:{type:l.DataTypes.TEXT,allowNull:!0},given_name:{type:l.DataTypes.TEXT,allowNull:!0},middle_name:{type:l.DataTypes.TEXT,allowNull:!0},date_of_birth:{type:l.DataTypes.STRING(32),allowNull:!0},gender:{type:l.DataTypes.STRING(64),allowNull:!0},ethnicity:{type:l.DataTypes.STRING(64),allowNull:!0},postal_code:{type:l.DataTypes.TEXT,allowNull:!0}},{tableName:"patient",schema:"dbo",timestamps:!1,indexes:[{name:"PK__patient__473C8FC7",unique:!0,fields:[{name:"patient_id"}]}]})}}t.Patient=s},3656:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Privilege=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Privilege",{privilege_name:{type:l.DataTypes.STRING(64),allowNull:!1,primaryKey:!0},user_type:{type:l.DataTypes.SMALLINT,allowNull:!1,primaryKey:!0}},{tableName:"privilege",schema:"dbo",timestamps:!1,indexes:[{name:"PK_privilege",unique:!0,fields:[{name:"privilege_name"},{name:"user_type"}]}]})}}t.Privilege=s},9056:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QuantResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QuantResult",{quant_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"test_ID"}},quant_unit_setting_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"quant_unit_setting",key:"quant_unit_setting_id"}},quantitative_result:{type:l.DataTypes.FLOAT,allowNull:!0},result_text:{type:l.DataTypes.STRING(1024),allowNull:!0},result_text_color:{type:l.DataTypes.SMALLINT,allowNull:!1},qualitative_result:{type:l.DataTypes.STRING(50),allowNull:!0},result_abnormal_flag:{type:l.DataTypes.STRING(5),allowNull:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_result_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"quant_result",schema:"dbo",timestamps:!1,indexes:[{name:"analyte_result_id",fields:[{name:"analyte_result_id"}]},{name:"PK__quant_result__3AD6B8E2",unique:!0,fields:[{name:"quant_result_id"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.QuantResult=s},3366:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QuantUnitSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QuantUnitSetting",{quant_unit_setting_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"assay_ID"}},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1},position:{type:l.DataTypes.INTEGER,allowNull:!1},unit_key:{type:l.DataTypes.STRING(50),allowNull:!1},conversion_factor:{type:l.DataTypes.FLOAT,allowNull:!1},lower_limit:{type:l.DataTypes.FLOAT,allowNull:!1},upper_limit:{type:l.DataTypes.FLOAT,allowNull:!1},display_log_value:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:0},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"quant_unit_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant_unit_setti__351DDF8C",unique:!0,fields:[{name:"quant_unit_setting_id"}]}]})}}t.QuantUnitSetting=s},8963:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ReagentLot",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},rgt_lot_number:{type:l.DataTypes.STRING(3),allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!0},reagent_lot_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"guid",fields:[{name:"guid"}]},{name:"PK_reagent_lot",unique:!0,fields:[{name:"reagent_lot_id"}]},{name:"rgt_lot_number",fields:[{name:"rgt_lot_number"}]}]})}}t.ReagentLot=s},1186:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RetainCartridgeColor=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("RetainCartridgeColor",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1},color:{type:l.DataTypes.INTEGER,allowNull:!1},retain_cartridge:{type:l.DataTypes.BOOLEAN,allowNull:!0},retain_cartridge_color_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"retain_cartridge_color",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_retain_cartridge",unique:!0,fields:[{name:"retain_cartridge_color_id"}]}]})}}t.RetainCartridgeColor=s},217:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleSetting",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},sample_type:{type:l.DataTypes.SMALLINT,allowNull:!1},valid_min:{type:l.DataTypes.DECIMAL(5,1),allowNull:!0},valid_max:{type:l.DataTypes.DECIMAL(5,1),allowNull:!0},end_pt_threshold:{type:l.DataTypes.SMALLINT,allowNull:!0},probe_chk_low_max:{type:l.DataTypes.INTEGER,allowNull:!0},probe_chk_high_min:{type:l.DataTypes.INTEGER,allowNull:!0},probe_chk_delta:{type:l.DataTypes.INTEGER,allowNull:!0},is_lot_parameters:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_endpoint:{type:l.DataTypes.BOOLEAN,allowNull:!0},peak_height_min:{type:l.DataTypes.FLOAT,allowNull:!0},use_delta_ct:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},min_delta_ct:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:0},delta_ct_eff:{type:l.DataTypes.FLOAT,allowNull:!0},E0:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E1:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E2:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E3:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E4:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},sample_settings_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},reagent_lot_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_low_min:{type:l.DataTypes.INTEGER,allowNull:!0},probe_chk_high_max:{type:l.DataTypes.INTEGER,allowNull:!0},ct_threshold_value:{type:l.DataTypes.FLOAT,allowNull:!0},normalization_factor:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"sample_settings",schema:"dbo",timestamps:!1,indexes:[{name:"analyte_id",fields:[{name:"analyte_id"}]},{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"PK_sample_settings",unique:!0,fields:[{name:"sample_settings_id"}]},{name:"reagent_lot_id",fields:[{name:"reagent_lot_id"}]},{name:"sample_type",fields:[{name:"sample_type"}]}]})}}t.SampleSetting=s},1863:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleType=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleType",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},pos:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"sample_type",schema:"dbo",timestamps:!1})}}t.SampleType=s},8094:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Snp=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Snp",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!0},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!0},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0},snp_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"snp",schema:"dbo",timestamps:!1,indexes:[{name:"PK_snp",unique:!0,fields:[{name:"snp_id"}]}]})}}t.Snp=s},7634:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SystemLog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SystemLog",{error_type:{type:l.DataTypes.INTEGER,allowNull:!0},log_time:{type:l.DataTypes.STRING(24),allowNull:!0},error_code:{type:l.DataTypes.INTEGER,allowNull:!0},details:{type:l.DataTypes.STRING(512),allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},site_name:{type:l.DataTypes.CHAR(3),allowNull:!0,defaultValue:""},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},system_log_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"system_log",schema:"dbo",timestamps:!1,indexes:[{name:"IX_system_log",fields:[{name:"system_log_ID"}]},{name:"PK_system_log",unique:!0,fields:[{name:"system_log_ID"}]}]})}}t.SystemLog=s},4258:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlogCounter=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlogCounter",{test_blog_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"test_blog",key:"test_blog_ID"}},date_text:{type:l.DataTypes.STRING(8),allowNull:!1,primaryKey:!0},test_count:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_blog_counter",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_blog_counter",unique:!0,fields:[{name:"test_blog_ID"},{name:"date_text"}]}]})}}t.TestBlogCounter=s},6450:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlog",{test_blog_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_name:{type:l.DataTypes.STRING(32),allowNull:!0},assay_version:{type:l.DataTypes.SMALLINT,allowNull:!1}},{tableName:"test_blog",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_blog",unique:!0,fields:[{name:"test_blog_ID"}]}]})}}t.TestBlog=s},9432:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestGraphSetup",{test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},graph_setup_ID:{type:l.DataTypes.INTEGER,allowNull:!1},pos:{type:l.DataTypes.SMALLINT,allowNull:!0},test_graph_setup_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"graph_setup_ID",fields:[{name:"graph_setup_ID"}]},{name:"PK_test_graph_setup",unique:!0,fields:[{name:"test_graph_setup_id"}]},{name:"test_ID",fields:[{name:"test_ID"}]}]})}}t.TestGraphSetup=s},1360:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestHistory",{test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},field_name:{type:l.DataTypes.STRING(32),allowNull:!1},old_content:{type:l.DataTypes.STRING(512),allowNull:!0},new_content:{type:l.DataTypes.STRING(512),allowNull:!0},user_ID:{type:l.DataTypes.INTEGER,allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!1},test_history_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"test_history",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_history",unique:!0,fields:[{name:"test_history_id"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.TestHistory=s},2848:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestPcError=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestPcError",{test_id:{type:l.DataTypes.INTEGER,allowNull:!1},code:{type:l.DataTypes.INTEGER,allowNull:!0},type:{type:l.DataTypes.SMALLINT,allowNull:!0},details:{type:l.DataTypes.STRING(512),allowNull:!0},severity:{type:l.DataTypes.SMALLINT,allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!0},parameter_1:{type:l.DataTypes.FLOAT,allowNull:!0},parameter_2:{type:l.DataTypes.FLOAT,allowNull:!0},parameter_3:{type:l.DataTypes.FLOAT,allowNull:!0},parameter_4:{type:l.DataTypes.FLOAT,allowNull:!0},textparameter:{type:l.DataTypes.STRING(64),allowNull:!0},test_pc_error_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_pc_error",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_pc_error",unique:!0,fields:[{name:"test_pc_error_id"}]},{name:"test_id",fields:[{name:"test_id"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.TestPcError=s},972:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestRun=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestRun",{test_run_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},site_name:{type:l.DataTypes.CHAR(3),allowNull:!1},site_serial_num:{type:l.DataTypes.INTEGER,allowNull:!0},rgt_lot_ID:{type:l.DataTypes.STRING(6),allowNull:!1},cart_serial_number:{type:l.DataTypes.BIGINT,allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},state:{type:l.DataTypes.SMALLINT,allowNull:!0},error_status:{type:l.DataTypes.SMALLINT,allowNull:!0},start_time:{type:l.DataTypes.STRING(24),allowNull:!0},end_time:{type:l.DataTypes.STRING(24),allowNull:!0},user_ID:{type:l.DataTypes.INTEGER,allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0},icore_serial_num:{type:l.DataTypes.INTEGER,allowNull:!0},fw_version:{type:l.DataTypes.STRING(12),allowNull:!0},datagram_format:{type:l.DataTypes.SMALLINT,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},order_time:{type:l.DataTypes.STRING(24),allowNull:!0},expiration_date:{type:l.DataTypes.DATE,allowNull:!1},cartridge_barcode:{type:l.DataTypes.STRING(1024),allowNull:!0},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},current_test_run:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"test_run",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_run",unique:!0,fields:[{name:"test_run_id"}]}]})}}t.TestRun=s},4678:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Test=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Test",{test_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!0},sample_ID:{type:l.DataTypes.STRING(25),allowNull:!0},scanned_SID:{type:l.DataTypes.BOOLEAN,allowNull:!0},scanned_PID:{type:l.DataTypes.BOOLEAN,allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},test_type:{type:l.DataTypes.SMALLINT,allowNull:!0},expected_result:{type:l.DataTypes.SMALLINT,allowNull:!0},lis_upload_message_ID:{type:l.DataTypes.STRING(64),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},order_time:{type:l.DataTypes.STRING(24),allowNull:!0},outliner:{type:l.DataTypes.BOOLEAN,allowNull:!1},archived:{type:l.DataTypes.BOOLEAN,allowNull:!1},auto_archived:{type:l.DataTypes.BOOLEAN,allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},other_sample_type_text:{type:l.DataTypes.STRING(32),allowNull:!0},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_text_colors:{type:l.DataTypes.TEXT,allowNull:!0},express_result_text:{type:l.DataTypes.STRING(1024),allowNull:!0},order_id:{type:l.DataTypes.INTEGER,allowNull:!1},upload_status:{type:l.DataTypes.INTEGER,allowNull:!1},priority:{type:l.DataTypes.INTEGER,allowNull:!0},cartridge_order_id:{type:l.DataTypes.INTEGER,allowNull:!0},data_reduction_alg:{type:l.DataTypes.SMALLINT,allowNull:!1},state:{type:l.DataTypes.SMALLINT,allowNull:!0},error_status:{type:l.DataTypes.SMALLINT,allowNull:!0},site_name:{type:l.DataTypes.TEXT,allowNull:!0},site_serial_num:{type:l.DataTypes.TEXT,allowNull:!0},operator_ids:{type:l.DataTypes.TEXT,allowNull:!0},start_time:{type:l.DataTypes.STRING(24),allowNull:!0},end_time:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"test",schema:"dbo",timestamps:!1,indexes:[{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"guid",fields:[{name:"guid"}]},{name:"PK_test",unique:!0,fields:[{name:"test_ID"}]},{name:"start_time",fields:[{name:"start_time"}]}]})}}t.Test=s},3509:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.User=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("User",{user_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},login_name:{type:l.DataTypes.STRING(16),allowNull:!0},full_name:{type:l.DataTypes.STRING(128),allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_hidden:{type:l.DataTypes.BOOLEAN,allowNull:!1},password:{type:l.DataTypes.STRING(32),allowNull:!0},user_type:{type:l.DataTypes.SMALLINT,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"users",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_users",unique:!0,fields:[{name:"user_ID"}]}]})}}t.User=s},8207:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{o(l.next(e))}catch(e){n(e)}}function r(e){try{o(l.throw(e))}catch(e){n(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,r)}o((l=l.apply(e,t||[])).next())}))},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.GeneXpertClient=void 0;const n=s(a(2245)),i=a(9634),r=a(496),o=a(7306),u=a(7819),d="YYYY/MM/DD HH:mm:ss.SSS";t.GeneXpertClient=class{constructor(e,t,a,l){this.version=e,this.sequelize=(0,o.createSequelize)(t,a,l),this.models=(0,u.initModels)(this.sequelize)}systemInfo(){const e=this.sequelize.query("\n        SELECT TOP 1 WITH TIES\n          [sw_version],\n          [instrument_serial_number],\n          [dbo].[system_log].[site_serial_number],\n          [site_name],\n          [log_time],\n          [dbo].[disabled_module].[creation] AS [disabled_at]\n        FROM [dbo].[system_log]\n          LEFT JOIN [dbo].[disabled_module]\n          ON [dbo].[disabled_module].[site_serial_number] = [dbo].[system_log].[site_serial_number]\n        ORDER BY row_number() \n        OVER (PARTITION BY [dbo].[system_log].[site_serial_number] ORDER BY [log_time] DESC)\n      ").then((([e])=>e)),t=this.models.Config.findAll().then((e=>e.map((e=>({[e.param_key]:e.param_val}))))).then(i.mergeAll);return Promise.all([e,t]).then((e=>(0,o.toSystemInfo)(...e)))}logsTotal(){return this.models.SystemLog.count()}testsTotal(){return this.models.Test.count()}testsPresyncables(e,t,a){return this.models.Test.findAll({where:{[r.Op.or]:[{modified:{[r.Op.gt]:(0,n.default)(e).format(d)}},{modified:{[r.Op.eq]:(0,n.default)(e).format(d)},test_ID:{[r.Op.notIn]:t}}]},attributes:["test_ID","modified"],limit:a,order:[["modified","ASC"]]}).then((e=>e.map((({test_ID:e,modified:t})=>({id:e.toString(),modified:(0,n.default)(t,d).toDate()})))))}testsSyncables(e){return this.models.Test.findAll({where:{test_ID:{[r.Op.in]:e}},include:[{as:"operator",model:this.models.User},{as:"test_errors",model:this.models.TestPcError},{as:"test_run",model:this.models.TestRun,attributes:{exclude:["data","cartridge_barcode"]}},{as:"patient_test_order",model:this.models.PatientTestOrder,include:[{as:"patient",model:this.models.Patient}]},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]}},{as:"analyte_results",model:this.models.AnalyteResult,include:[{as:"analyte",model:this.models.Analyte}]},{as:"organism_results",model:this.models.OrganismResult,include:[{as:"organism",model:this.models.Organism}]}]}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.test_ID.toString()}))))}testsForEntry(e,t){return this.models.Test.findAll({where:{start_time:{[r.Op.gt]:(0,n.default)().subtract(t||o.hoursForDataEntry,"hours").format(d)},sample_ID:{[r.Op.notIn]:e}},include:[{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[r.Op.in]:o.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t;return{id:e.test_ID,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(e.end_time,d).toDate(),sampleId:e.sample_ID,startedAt:(0,n.default)(e.start_time,d).toDate()}}))))}logsPresyncables(e,t,a){return this.models.SystemLog.findAll({where:{[r.Op.or]:[{log_time:{[r.Op.gt]:(0,n.default)(e).format(d)}},{log_time:{[r.Op.eq]:(0,n.default)(e).format(d)},system_log_ID:{[r.Op.notIn]:t}}]},limit:a,attributes:["system_log_ID","log_time"],order:[["log_time","ASC"]]}).then((e=>e.map((({system_log_ID:e,log_time:t})=>({id:e.toString(),modified:(0,n.default)(t,d).toDate()})))))}logsSyncables(e){return this.models.SystemLog.findAll({where:{system_log_ID:{[r.Op.in]:e}}}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.system_log_ID.toString()}))))}close(){return this.sequelize.close()}getTest(e){return l(this,void 0,void 0,(function*(){return this.models.Test.findOne({where:{sample_ID:{[r.Op.eq]:e}}})}))}getTestsByTestIds(e){return this.models.Test.findAll({where:{test_ID:{[r.Op.in]:e}},include:[{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[r.Op.in]:o.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t;return{id:e.test_ID,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(e.end_time,d).toDate(),sampleId:e.sample_ID,startedAt:(0,n.default)(e.start_time,d).toDate()}}))))}getCompletedTestsBySampleIds(e){return this.models.Test.findAll({where:{sample_ID:{[r.Op.in]:e},end_time:{[r.Op.and]:[{[r.Op.not]:null},{[r.Op.between]:[(0,n.default)().subtract(o.LAB_RESULT_APPROVAL_DEADLINE_HOURS,"hours").format(d),(0,n.default)().format(d)]}]},result_text:{[r.Op.not]:null}},include:[{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[r.Op.in]:o.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t;return{id:e.test_ID,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(e.end_time,d).toDate(),sampleId:e.sample_ID,startedAt:(0,n.default)(e.start_time,d).toDate()}}))))}}},2952:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Advancestagesetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Advancestagesetting",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1},stage_number:{type:l.DataTypes.SMALLINT,allowNull:!0},protocol_number:{type:l.DataTypes.SMALLINT,allowNull:!0},new_stage_number:{type:l.DataTypes.SMALLINT,allowNull:!0},stop_after_new_stage:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},stop_if_no_ct:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},advance_stage_settings_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"advancestagesettings",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_advancestagesettings",unique:!0,fields:[{name:"advance_stage_settings_id"}]}]})}}t.Advancestagesetting=s},6623:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AnalyteResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AnalyteResultText",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},target_result_key:{type:l.DataTypes.STRING(8),allowNull:!0},result_text_reference:{type:l.DataTypes.SMALLINT,allowNull:!1}},{tableName:"analyte_result_text ",schema:"dbo",timestamps:!1})}}t.AnalyteResultText=s},7089:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AnalyteResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AnalyteResult",{test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},expected_result:{type:l.DataTypes.SMALLINT,allowNull:!0},endpoint:{type:l.DataTypes.FLOAT,allowNull:!1},threshold:{type:l.DataTypes.FLOAT,allowNull:!1},cycle_threshold:{type:l.DataTypes.FLOAT,allowNull:!1},probe_check_result:{type:l.DataTypes.SMALLINT,allowNull:!0},probe_check_reading1:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_reading2:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_reading3:{type:l.DataTypes.FLOAT,allowNull:!0},error_status:{type:l.DataTypes.SMALLINT,allowNull:!0},target_result:{type:l.DataTypes.SMALLINT,allowNull:!0},ic_result:{type:l.DataTypes.SMALLINT,allowNull:!0},ec_result:{type:l.DataTypes.SMALLINT,allowNull:!0},spc_result:{type:l.DataTypes.SMALLINT,allowNull:!0},interpretation:{type:l.DataTypes.SMALLINT,allowNull:!0},second_deriv_peak_height:{type:l.DataTypes.FLOAT,allowNull:!0},nc_ic_endpoint:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:0},curve_fit_result:{type:l.DataTypes.SMALLINT,allowNull:!0},delta_ct:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-9999},TTP:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:0},quantitative_result:{type:l.DataTypes.FLOAT,allowNull:!0},iqs_lq_result:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:1},iqs_hq_result:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:1},analyte_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},reason:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"analyte_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK_analyte_result",unique:!0,fields:[{name:"analyte_result_id"}]},{name:"test_ID",fields:[{name:"test_ID"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.AnalyteResult=s},3425:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Analyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Analyte",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_index:{type:l.DataTypes.INTEGER,allowNull:!1},usage:{type:l.DataTypes.SMALLINT,allowNull:!0},target:{type:l.DataTypes.BLOB,allowNull:!0},analyte_name:{type:l.DataTypes.STRING(20),allowNull:!0},intended_concentration:{type:l.DataTypes.FLOAT,allowNull:!0},analyte_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},use_curve_fit:{type:l.DataTypes.BOOLEAN,allowNull:!0},enable_signal_loss_detection:{type:l.DataTypes.BOOLEAN,allowNull:!0},reporter_name:{type:l.DataTypes.STRING(12),allowNull:!1},boxcar_cycles:{type:l.DataTypes.SMALLINT,allowNull:!0},curve_analysis:{type:l.DataTypes.SMALLINT,allowNull:!0},background_start:{type:l.DataTypes.SMALLINT,allowNull:!0},background_end:{type:l.DataTypes.SMALLINT,allowNull:!0},cycle_if_no_ct:{type:l.DataTypes.SMALLINT,allowNull:!0},min_ct_req_pass_controls:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_on_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},curve_fit_start_background:{type:l.DataTypes.BOOLEAN,allowNull:!0},curve_fit_start_index:{type:l.DataTypes.SMALLINT,allowNull:!0},curve_fit_end_data:{type:l.DataTypes.BOOLEAN,allowNull:!0},curve_fit_end_index:{type:l.DataTypes.SMALLINT,allowNull:!0},curve_fit_min_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_nrse:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_slope_vs_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},background_min_points:{type:l.DataTypes.SMALLINT,allowNull:!0},background_look_back:{type:l.DataTypes.SMALLINT,allowNull:!0},background_validate:{type:l.DataTypes.BOOLEAN,allowNull:!0},background_max_slope:{type:l.DataTypes.FLOAT,allowNull:!0},background_max_rms_error:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_use_delta_pc:{type:l.DataTypes.BOOLEAN,allowNull:!0},probe_check_min_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_max_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},invalid_bias:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"analyte",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_analyte",unique:!0,fields:[{name:"analyte_id"}]},{name:"pos",fields:[{name:"analyte_index"}]}]})}}t.Analyte=s},1401:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayCartridge=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayCartridge",{assay_cartridge_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!0},need_lot_parameters:{type:l.DataTypes.BOOLEAN,allowNull:!1},need_ext_control:{type:l.DataTypes.BOOLEAN,allowNull:!1},ext_control_frq:{type:l.DataTypes.SMALLINT,allowNull:!0},cartridge_type_ID:{type:l.DataTypes.INTEGER,allowNull:!0},command_seq:{type:l.DataTypes.BLOB,allowNull:!0},melt_all_peaks:{type:l.DataTypes.BOOLEAN,allowNull:!1},use_background_subtraction:{type:l.DataTypes.BOOLEAN,allowNull:!1},air_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},overflow_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},comments:{type:l.DataTypes.STRING(256),allowNull:!0},command_seq_format:{type:l.DataTypes.SMALLINT,allowNull:!0},picture:{type:l.DataTypes.BLOB,allowNull:!0},read_interval:{type:l.DataTypes.INTEGER,allowNull:!0},prep_cartridge_shelf_life:{type:l.DataTypes.INTEGER,allowNull:!1},retain_cartridge:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"assay_cartridge",schema:"dbo",timestamps:!1,indexes:[{name:"PK_assay_cartridge",unique:!0,fields:[{name:"assay_cartridge_id"}]}]})}}t.AssayCartridge=s},1548:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayChamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayChamber",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!0},name:{type:l.DataTypes.STRING(16),allowNull:!0},initial_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},assay_chamber_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"assay_chamber",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"PK_assay_chamber",unique:!0,fields:[{name:"assay_chamber_id"}]}]})}}t.AssayChamber=s},378:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Assay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Assay",{assay_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},pos:{type:l.DataTypes.INTEGER,allowNull:!0},name:{type:l.DataTypes.STRING(32),allowNull:!0},version:{type:l.DataTypes.SMALLINT,allowNull:!0},user_ID:{type:l.DataTypes.INTEGER,allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_verified:{type:l.DataTypes.BOOLEAN,allowNull:!0},comments:{type:l.DataTypes.STRING(256),allowNull:!0},lock_comments:{type:l.DataTypes.STRING(256),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},product_code:{type:l.DataTypes.SMALLINT,allowNull:!0},assay_type:{type:l.DataTypes.SMALLINT,allowNull:!0},disclaimer:{type:l.DataTypes.STRING(512),allowNull:!0},company_code:{type:l.DataTypes.SMALLINT,allowNull:!0},result_text_type:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:0},class:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:0},analysis_type:{type:l.DataTypes.SMALLINT,allowNull:!0},sample_prep_instruction:{type:l.DataTypes.STRING(256),allowNull:!0},sample_prep_video:{type:l.DataTypes.BLOB,allowNull:!0},test_code:{type:l.DataTypes.STRING(15),allowNull:!0},enable_test_code:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},enable_auto_archive:{type:l.DataTypes.BOOLEAN,allowNull:!1},default_result_text_reference:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:5},default_text_color_reference:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:3},clia_waived:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"assay",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_assay_ID",unique:!0,fields:[{name:"assay_ID"}]},{name:"pos",fields:[{name:"pos"}]}]})}}t.Assay=s},8486:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CalibrationChamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CalibrationChamber",{calibration_seq_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1,primaryKey:!0},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!0},name:{type:l.DataTypes.STRING(16),allowNull:!0},initial_volume:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"calibration_chamber",schema:"dbo",timestamps:!1,indexes:[{name:"calibration_seq_id",fields:[{name:"calibration_seq_id"}]},{name:"cartridge_ID",fields:[{name:"cartridge_id"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"PK_calibration_chamber",unique:!0,fields:[{name:"calibration_seq_id"},{name:"cartridge_id"},{name:"chamber_number"}]}]})}}t.CalibrationChamber=s},447:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CalibrationSequence=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CalibrationSequence",{calibration_seq_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},pos:{type:l.DataTypes.INTEGER,allowNull:!0},name:{type:l.DataTypes.STRING(32),allowNull:!0},cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!0},command_seq:{type:l.DataTypes.BLOB,allowNull:!0},command_seq_format:{type:l.DataTypes.SMALLINT,allowNull:!0},air_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},comments:{type:l.DataTypes.STRING(256),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"calibration_sequence",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_calibration_sequence",unique:!0,fields:[{name:"calibration_seq_id"}]},{name:"pos",fields:[{name:"pos"}]}]})}}t.CalibrationSequence=s},975:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CartridgeOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CartridgeOrder",{cartridge_order_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},sample_id:{type:l.DataTypes.STRING(25),allowNull:!0},scanned_SID:{type:l.DataTypes.BOOLEAN,allowNull:!0},scanned_PID:{type:l.DataTypes.BOOLEAN,allowNull:!0},priority:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0},rgt_lot_id:{type:l.DataTypes.STRING(6),allowNull:!1},cartridge_serial_number:{type:l.DataTypes.BIGINT,allowNull:!0},cartridge_expiration_date:{type:l.DataTypes.DATE,allowNull:!0},cartridge_barcode:{type:l.DataTypes.STRING(1024),allowNull:!0},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},other_sample_type_text:{type:l.DataTypes.STRING(32),allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_status:{type:l.DataTypes.STRING(32),allowNull:!0},order_sw_version:{type:l.DataTypes.STRING(16),allowNull:!1},cartridge_order_time:{type:l.DataTypes.STRING(24),allowNull:!0},cartridge_order_expiration:{type:l.DataTypes.STRING(24),allowNull:!0},location:{type:l.DataTypes.STRING(32),allowNull:!0},location_site:{type:l.DataTypes.INTEGER,allowNull:!0},lis_order_id:{type:l.DataTypes.INTEGER,allowNull:!1},test_type:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"cartridge_order",schema:"dbo",timestamps:!1,indexes:[{name:"PK_cartridge_order",unique:!0,fields:[{name:"cartridge_order_id"}]}]})}}t.CartridgeOrder=s},1291:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Cartridge=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Cartridge",{cartridge_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},name:{type:l.DataTypes.STRING(32),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},max_pressure:{type:l.DataTypes.SMALLINT,allowNull:!0},syringe_min_transfer_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},syringe_max_transfer_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},syringe_max_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_syringe_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_chamber_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},direct_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},filter_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},direct_flow_rate_min:{type:l.DataTypes.SMALLINT,allowNull:!0},direct_flow_rate_max:{type:l.DataTypes.SMALLINT,allowNull:!0},microliters_per_revolution:{type:l.DataTypes.FLOAT,allowNull:!0},initial_aspirate_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},initial_aspirate_flow_rate:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_pressurized_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},air_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},overflow_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},min_pressure:{type:l.DataTypes.SMALLINT,allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1,defaultValue:""},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},filter_flow_rate_min:{type:l.DataTypes.SMALLINT,allowNull:!0},filter_flow_rate_max:{type:l.DataTypes.SMALLINT,allowNull:!0},cartridge_foot_height:{type:l.DataTypes.INTEGER,allowNull:!0},adc_2_psi:{type:l.DataTypes.FLOAT,allowNull:!0},plunger_strip_position:{type:l.DataTypes.INTEGER,allowNull:!0},plunger_pickup_position:{type:l.DataTypes.INTEGER,allowNull:!0},picture:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"cartridge",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"name",fields:[{name:"name"}]},{name:"PK_cartridge_ID",unique:!0,fields:[{name:"cartridge_ID"}]},{name:"version",fields:[{name:"version"}]}]})}}t.Cartridge=s},7184:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Chamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Chamber",{cartridge_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1,primaryKey:!0},min_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},max_volume:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"chamber",schema:"dbo",timestamps:!1,indexes:[{name:"cartridge_ID",fields:[{name:"cartridge_ID"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"PK_chamber",unique:!0,fields:[{name:"cartridge_ID"},{name:"chamber_number"}]}]})}}t.Chamber=s},7527:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorDisclaimer=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ColorDisclaimer",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},color:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},disclaimer:{type:l.DataTypes.STRING(256),allowNull:!0}},{tableName:"color_disclaimer",schema:"dbo",timestamps:!1,indexes:[{name:"PK_color_disclaimer",unique:!0,fields:[{name:"assay_ID"},{name:"color"}]}]})}}t.ColorDisclaimer=s},6840:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Config",{param_key:{type:l.DataTypes.STRING(64),primaryKey:!0,allowNull:!1},param_val:{type:l.DataTypes.STRING(512),allowNull:!1,defaultValue:""}},{tableName:"config",schema:"dbo",timestamps:!1})}}t.Config=s},501:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CrosstalkFactor=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CrosstalkFactor",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},protocol_number:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:-1},factor:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:0},crosstalk_factor_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},from_analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},to_analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"crosstalk_factor",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_crosstalk_factor",unique:!0,fields:[{name:"crosstalk_factor_id"}]}]})}}t.CrosstalkFactor=s},8567:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DisabledModule=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("DisabledModule",{site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!0},creation:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"disabled_module",schema:"dbo",timestamps:!1,indexes:[{name:"PK_disabled_module",unique:!0,fields:[{name:"site_serial_number"}]}]})}}t.DisabledModule=s},7928:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Dtproperty=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Dtproperty",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},objectid:{type:l.DataTypes.INTEGER,allowNull:!0},property:{type:l.DataTypes.STRING(64),allowNull:!1,primaryKey:!0},value:{type:l.DataTypes.STRING(255),allowNull:!0},uvalue:{type:l.DataTypes.STRING(255),allowNull:!0},lvalue:{type:l.DataTypes.BLOB,allowNull:!0},version:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:0}},{tableName:"dtproperties",schema:"dbo",timestamps:!1,indexes:[{name:"pk_dtproperties",unique:!0,fields:[{name:"id"},{name:"property"}]}]})}}t.Dtproperty=s},4368:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.FailedLocation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("FailedLocation",{location:{type:l.DataTypes.STRING(32),allowNull:!1,primaryKey:!0},location_site:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"failed_location",schema:"dbo",timestamps:!1,indexes:[{name:"PK_failed_location",unique:!0,fields:[{name:"location"},{name:"location_site"}]}]})}}t.FailedLocation=s},1692:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetting",{graph_setting_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},graph_type:{type:l.DataTypes.SMALLINT,allowNull:!1},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"assay_ID"}},param_key:{type:l.DataTypes.STRING(64),allowNull:!1},param_val:{type:l.DataTypes.STRING(512),allowNull:!1,defaultValue:""}},{tableName:"graph_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__graph_setting__408F9238",unique:!0,fields:[{name:"graph_setting_id"}]}]})}}t.GraphSetting=s},5208:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetup",{graph_setup_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},pos:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!0},is_default:{type:l.DataTypes.BOOLEAN,allowNull:!1},user_ID:{type:l.DataTypes.INTEGER,allowNull:!0},settings:{type:l.DataTypes.INTEGER,allowNull:!0},format:{type:l.DataTypes.SMALLINT,allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_graph_setup",unique:!0,fields:[{name:"graph_setup_ID"}]},{name:"pos",fields:[{name:"pos"}]}]})}}t.GraphSetup=s},9447:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.HaplotypeResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("HaplotypeResultText",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(11),allowNull:!1,primaryKey:!0},alleles_text_1:{type:l.DataTypes.STRING(10),allowNull:!0},alleles_text_2:{type:l.DataTypes.STRING(10),allowNull:!0},text_color_reference:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"haplotype_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK_haplotype_result_text",unique:!0,fields:[{name:"assay_id"},{name:"haplotype_id"},{name:"result_key"}]}]})}}t.HaplotypeResultText=s},9933:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Haplotype=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Haplotype",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},name:{type:l.DataTypes.STRING(20),allowNull:!0},lis_test_code:{type:l.DataTypes.STRING(15),allowNull:!0}},{tableName:"haplotype",schema:"dbo",timestamps:!1,indexes:[{name:"PK_haplotype",unique:!0,fields:[{name:"assay_id"},{name:"haplotype_id"}]}]})}}t.Haplotype=s},6824:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.InfinitySystemLog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("InfinitySystemLog",{infinity_system_log_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1},code:{type:l.DataTypes.INTEGER,allowNull:!1},subsystem:{type:l.DataTypes.INTEGER,allowNull:!1},details:{type:l.DataTypes.STRING(512),allowNull:!0},log_time:{type:l.DataTypes.STRING(24),allowNull:!1},sw_version:{type:l.DataTypes.STRING(16),allowNull:!1},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"infinity_system_log",schema:"dbo",timestamps:!1,indexes:[{name:"PK_infinity_system_log",unique:!0,fields:[{name:"infinity_system_log_id"}]}]})}}t.InfinitySystemLog=s},7819:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlog=t.Test=t.SystemLog=t.Snp=t.SampleType=t.SampleSetting=t.RetainCartridgeColor=t.ReagentLot=t.QuantUnitSetting=t.QuantResult=t.QcTest=t.QcResult=t.Privilege=t.PatientTestOrder=t.Patient=t.Path=t.OrganismTarget=t.OrganismResultText=t.OrganismResultRule=t.OrganismResultEvaluator=t.OrganismResult=t.Organism=t.MeltPeakSetting=t.MeltPeakResult=t.LisTestOrder=t.Instrument=t.InfinitySystemLog=t.HaplotypeResultText=t.Haplotype=t.GraphSetup=t.GraphSetting=t.FailedLocation=t.Dtproperty=t.DisabledModule=t.CrosstalkFactor=t.Config=t.ColorDisclaimer=t.Chamber=t.CartridgeOrder=t.Cartridge=t.CalibrationSequence=t.CalibrationChamber=t.AssayChamber=t.AssayCartridge=t.Assay=t.AnalyteResultText=t.AnalyteResult=t.Analyte=t.Advancestagesetting=t.IntegrityCheck=void 0,t.initModels=t.User=t.TestRun=t.TestPcError=t.TestHistory=t.TestGraphSetup=t.TestBlogCounter=void 0;const l=a(2496);Object.defineProperty(t,"IntegrityCheck",{enumerable:!0,get:function(){return l.IntegrityCheck}});const s=a(2952);Object.defineProperty(t,"Advancestagesetting",{enumerable:!0,get:function(){return s.Advancestagesetting}});const n=a(3425);Object.defineProperty(t,"Analyte",{enumerable:!0,get:function(){return n.Analyte}});const i=a(7089);Object.defineProperty(t,"AnalyteResult",{enumerable:!0,get:function(){return i.AnalyteResult}});const r=a(6623);Object.defineProperty(t,"AnalyteResultText",{enumerable:!0,get:function(){return r.AnalyteResultText}});const o=a(378);Object.defineProperty(t,"Assay",{enumerable:!0,get:function(){return o.Assay}});const u=a(1401);Object.defineProperty(t,"AssayCartridge",{enumerable:!0,get:function(){return u.AssayCartridge}});const d=a(1548);Object.defineProperty(t,"AssayChamber",{enumerable:!0,get:function(){return d.AssayChamber}});const p=a(8486);Object.defineProperty(t,"CalibrationChamber",{enumerable:!0,get:function(){return p.CalibrationChamber}});const y=a(447);Object.defineProperty(t,"CalibrationSequence",{enumerable:!0,get:function(){return y.CalibrationSequence}});const c=a(1291);Object.defineProperty(t,"Cartridge",{enumerable:!0,get:function(){return c.Cartridge}});const _=a(975);Object.defineProperty(t,"CartridgeOrder",{enumerable:!0,get:function(){return _.CartridgeOrder}});const m=a(7184);Object.defineProperty(t,"Chamber",{enumerable:!0,get:function(){return m.Chamber}});const T=a(7527);Object.defineProperty(t,"ColorDisclaimer",{enumerable:!0,get:function(){return T.ColorDisclaimer}});const N=a(6840);Object.defineProperty(t,"Config",{enumerable:!0,get:function(){return N.Config}});const g=a(501);Object.defineProperty(t,"CrosstalkFactor",{enumerable:!0,get:function(){return g.CrosstalkFactor}});const f=a(8567);Object.defineProperty(t,"DisabledModule",{enumerable:!0,get:function(){return f.DisabledModule}});const D=a(7928);Object.defineProperty(t,"Dtproperty",{enumerable:!0,get:function(){return D.Dtproperty}});const E=a(4368);Object.defineProperty(t,"FailedLocation",{enumerable:!0,get:function(){return E.FailedLocation}});const b=a(1692);Object.defineProperty(t,"GraphSetting",{enumerable:!0,get:function(){return b.GraphSetting}});const w=a(5208);Object.defineProperty(t,"GraphSetup",{enumerable:!0,get:function(){return w.GraphSetup}});const I=a(9933);Object.defineProperty(t,"Haplotype",{enumerable:!0,get:function(){return I.Haplotype}});const R=a(9447);Object.defineProperty(t,"HaplotypeResultText",{enumerable:!0,get:function(){return R.HaplotypeResultText}});const O=a(6824);Object.defineProperty(t,"InfinitySystemLog",{enumerable:!0,get:function(){return O.InfinitySystemLog}});const h=a(3026);Object.defineProperty(t,"Instrument",{enumerable:!0,get:function(){return h.Instrument}});const M=a(7198);Object.defineProperty(t,"LisTestOrder",{enumerable:!0,get:function(){return M.LisTestOrder}});const v=a(7358);Object.defineProperty(t,"MeltPeakResult",{enumerable:!0,get:function(){return v.MeltPeakResult}});const G=a(9047);Object.defineProperty(t,"MeltPeakSetting",{enumerable:!0,get:function(){return G.MeltPeakSetting}});const A=a(5973);Object.defineProperty(t,"Organism",{enumerable:!0,get:function(){return A.Organism}});const S=a(8356);Object.defineProperty(t,"OrganismResult",{enumerable:!0,get:function(){return S.OrganismResult}});const P=a(4271);Object.defineProperty(t,"OrganismResultEvaluator",{enumerable:!0,get:function(){return P.OrganismResultEvaluator}});const L=a(1688);Object.defineProperty(t,"OrganismResultRule",{enumerable:!0,get:function(){return L.OrganismResultRule}});const x=a(2020);Object.defineProperty(t,"OrganismResultText",{enumerable:!0,get:function(){return x.OrganismResultText}});const C=a(1857);Object.defineProperty(t,"OrganismTarget",{enumerable:!0,get:function(){return C.OrganismTarget}});const K=a(2703);Object.defineProperty(t,"Path",{enumerable:!0,get:function(){return K.Path}});const j=a(3848);Object.defineProperty(t,"Patient",{enumerable:!0,get:function(){return j.Patient}});const q=a(5856);Object.defineProperty(t,"PatientTestOrder",{enumerable:!0,get:function(){return q.PatientTestOrder}});const k=a(598);Object.defineProperty(t,"Privilege",{enumerable:!0,get:function(){return k.Privilege}});const F=a(7679);Object.defineProperty(t,"QcResult",{enumerable:!0,get:function(){return F.QcResult}});const B=a(5234);Object.defineProperty(t,"QcTest",{enumerable:!0,get:function(){return B.QcTest}});const H=a(500);Object.defineProperty(t,"QuantResult",{enumerable:!0,get:function(){return H.QuantResult}});const V=a(6572);Object.defineProperty(t,"QuantUnitSetting",{enumerable:!0,get:function(){return V.QuantUnitSetting}});const U=a(2025);Object.defineProperty(t,"ReagentLot",{enumerable:!0,get:function(){return U.ReagentLot}});const Q=a(1084);Object.defineProperty(t,"RetainCartridgeColor",{enumerable:!0,get:function(){return Q.RetainCartridgeColor}});const X=a(7617);Object.defineProperty(t,"SampleSetting",{enumerable:!0,get:function(){return X.SampleSetting}});const z=a(1674);Object.defineProperty(t,"SampleType",{enumerable:!0,get:function(){return z.SampleType}});const Y=a(2412);Object.defineProperty(t,"Snp",{enumerable:!0,get:function(){return Y.Snp}});const $=a(6151);Object.defineProperty(t,"SystemLog",{enumerable:!0,get:function(){return $.SystemLog}});const J=a(9100);Object.defineProperty(t,"Test",{enumerable:!0,get:function(){return J.Test}});const W=a(6103);Object.defineProperty(t,"TestBlog",{enumerable:!0,get:function(){return W.TestBlog}});const Z=a(3969);Object.defineProperty(t,"TestBlogCounter",{enumerable:!0,get:function(){return Z.TestBlogCounter}});const ee=a(1808);Object.defineProperty(t,"TestGraphSetup",{enumerable:!0,get:function(){return ee.TestGraphSetup}});const te=a(3569);Object.defineProperty(t,"TestHistory",{enumerable:!0,get:function(){return te.TestHistory}});const ae=a(9642);Object.defineProperty(t,"TestPcError",{enumerable:!0,get:function(){return ae.TestPcError}});const le=a(6548);Object.defineProperty(t,"TestRun",{enumerable:!0,get:function(){return le.TestRun}});const se=a(8075);Object.defineProperty(t,"User",{enumerable:!0,get:function(){return se.User}}),t.initModels=function(e){const t=l.IntegrityCheck.initModel(e),a=s.Advancestagesetting.initModel(e),ne=n.Analyte.initModel(e),ie=i.AnalyteResult.initModel(e),re=r.AnalyteResultText.initModel(e),oe=o.Assay.initModel(e),ue=u.AssayCartridge.initModel(e),de=d.AssayChamber.initModel(e),pe=p.CalibrationChamber.initModel(e),ye=y.CalibrationSequence.initModel(e),ce=c.Cartridge.initModel(e),_e=_.CartridgeOrder.initModel(e),me=m.Chamber.initModel(e),Te=T.ColorDisclaimer.initModel(e),Ne=N.Config.initModel(e),ge=g.CrosstalkFactor.initModel(e),fe=f.DisabledModule.initModel(e),De=D.Dtproperty.initModel(e),Ee=E.FailedLocation.initModel(e),be=b.GraphSetting.initModel(e),we=w.GraphSetup.initModel(e),Ie=I.Haplotype.initModel(e),Re=R.HaplotypeResultText.initModel(e),Oe=O.InfinitySystemLog.initModel(e),he=h.Instrument.initModel(e),Me=M.LisTestOrder.initModel(e),ve=v.MeltPeakResult.initModel(e),Ge=G.MeltPeakSetting.initModel(e),Ae=A.Organism.initModel(e),Se=S.OrganismResult.initModel(e),Pe=P.OrganismResultEvaluator.initModel(e),Le=L.OrganismResultRule.initModel(e),xe=x.OrganismResultText.initModel(e),Ce=C.OrganismTarget.initModel(e),Ke=K.Path.initModel(e),je=j.Patient.initModel(e),qe=q.PatientTestOrder.initModel(e),ke=k.Privilege.initModel(e),Fe=F.QcResult.initModel(e),Be=B.QcTest.initModel(e),He=H.QuantResult.initModel(e),Ve=V.QuantUnitSetting.initModel(e),Ue=U.ReagentLot.initModel(e),Qe=Q.RetainCartridgeColor.initModel(e),Xe=X.SampleSetting.initModel(e),ze=z.SampleType.initModel(e),Ye=Y.Snp.initModel(e),$e=$.SystemLog.initModel(e),Je=J.Test.initModel(e),We=W.TestBlog.initModel(e),Ze=Z.TestBlogCounter.initModel(e),et=ee.TestGraphSetup.initModel(e),tt=te.TestHistory.initModel(e),at=ae.TestPcError.initModel(e),lt=le.TestRun.initModel(e),st=se.User.initModel(e);return be.belongsTo(oe,{as:"assay",foreignKey:"assay_id"}),oe.hasMany(be,{as:"graph_settings",foreignKey:"assay_id"}),Ve.belongsTo(oe,{as:"assay",foreignKey:"assay_id"}),oe.hasMany(Ve,{as:"quant_unit_settings",foreignKey:"assay_id"}),Ce.belongsTo(Ve,{as:"selected_quant_unit",foreignKey:"selected_quant_unit_id"}),Ve.hasMany(Ce,{as:"organism_targets",foreignKey:"selected_quant_unit_id"}),He.belongsTo(Ve,{as:"quant_unit_setting",foreignKey:"quant_unit_setting_id"}),Ve.hasMany(He,{as:"quant_results",foreignKey:"quant_unit_setting_id"}),He.belongsTo(Je,{as:"test",foreignKey:"test_ID"}),Je.hasMany(He,{as:"quant_results",foreignKey:"test_ID"}),Je.hasMany(ie,{as:"analyte_results",foreignKey:"test_ID"}),Je.hasMany(Se,{as:"organism_results",foreignKey:"test_ID"}),Je.belongsTo(oe,{as:"assay",foreignKey:"assay_ID"}),Je.belongsTo(st,{as:"operator",foreignKey:"operator_ids"}),Je.hasOne(lt,{as:"test_run",foreignKey:"test_ID"}),Je.belongsTo(qe,{as:"patient_test_order",foreignKey:"test_id"}),Je.hasMany(at,{as:"test_errors",foreignKey:"test_id"}),qe.belongsTo(je,{as:"patient",foreignKey:"patient_id"}),ie.belongsTo(ne,{as:"analyte",foreignKey:"analyte_ID"}),Se.belongsTo(Ae,{as:"organism",foreignKey:"organism_ID"}),Ze.belongsTo(We,{as:"test_blog",foreignKey:"test_blog_ID"}),We.hasMany(Ze,{as:"test_blog_counters",foreignKey:"test_blog_ID"}),{IntegrityCheck:t,Advancestagesetting:a,Analyte:ne,AnalyteResult:ie,AnalyteResultText:re,Assay:oe,AssayCartridge:ue,AssayChamber:de,CalibrationChamber:pe,CalibrationSequence:ye,Cartridge:ce,CartridgeOrder:_e,Chamber:me,ColorDisclaimer:Te,Config:Ne,CrosstalkFactor:ge,DisabledModule:fe,Dtproperty:De,FailedLocation:Ee,GraphSetting:be,GraphSetup:we,Haplotype:Ie,HaplotypeResultText:Re,InfinitySystemLog:Oe,Instrument:he,LisTestOrder:Me,MeltPeakResult:ve,MeltPeakSetting:Ge,Organism:Ae,OrganismResult:Se,OrganismResultEvaluator:Pe,OrganismResultRule:Le,OrganismResultText:xe,OrganismTarget:Ce,Path:Ke,Patient:je,PatientTestOrder:qe,Privilege:ke,QcResult:Fe,QcTest:Be,QuantResult:He,QuantUnitSetting:Ve,ReagentLot:Ue,RetainCartridgeColor:Qe,SampleSetting:Xe,SampleType:ze,Snp:Ye,SystemLog:$e,Test:Je,TestBlog:We,TestBlogCounter:Ze,TestGraphSetup:et,TestHistory:tt,TestPcError:at,TestRun:lt,User:st}}},3026:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Instrument=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Instrument",{Instrument_id:{type:l.DataTypes.INTEGER,allowNull:!0},mac_address:{type:l.DataTypes.BLOB,allowNull:!0},serial_number:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"instrument",schema:"dbo",timestamps:!1,indexes:[{name:"mac_address",fields:[{name:"mac_address"}]}]})}}t.Instrument=s},2496:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.IntegrityCheck=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("IntegrityCheck",{table_name:{type:l.DataTypes.STRING(32),allowNull:!0},field_name:{type:l.DataTypes.STRING(24),allowNull:!0},id_number:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"Integrity_Check",schema:"dbo",timestamps:!1})}}t.IntegrityCheck=s},7198:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisTestOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisTestOrder",{instrument_specimen_ID:{type:l.DataTypes.STRING(64),allowNull:!1,defaultValue:""},sample_ID:{type:l.DataTypes.STRING(25),allowNull:!0},test_code:{type:l.DataTypes.STRING(15),allowNull:!0,defaultValue:""},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:-1},order_time:{type:l.DataTypes.STRING(24),allowNull:!0},order_status:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:1},priority:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:1},LIS_test_order_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},cartridge_ID:{type:l.DataTypes.STRING(25),allowNull:!0}},{tableName:"lis_test_order",schema:"dbo",timestamps:!1,indexes:[{name:"IX_lis_test_order",fields:[{name:"instrument_specimen_ID"}]},{name:"PK_lis_test_order",unique:!0,fields:[{name:"LIS_test_order_ID"}]}]})}}t.LisTestOrder=s},7358:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakResult",{melt_peak_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_result_id:{type:l.DataTypes.INTEGER,allowNull:!1},peak_index:{type:l.DataTypes.INTEGER,allowNull:!1},peak_height:{type:l.DataTypes.FLOAT,allowNull:!1},peak_temperature:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"melt_peak_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK_melt_peak_result",unique:!0,fields:[{name:"melt_peak_result_id"}]}]})}}t.MeltPeakResult=s},9047:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakSetting",{melt_peak_settings_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},slope_positive:{type:l.DataTypes.BOOLEAN,allowNull:!1},baseline_start_temp:{type:l.DataTypes.FLOAT,allowNull:!1},baseline_look_back:{type:l.DataTypes.FLOAT,allowNull:!1},baseline_num_points:{type:l.DataTypes.INTEGER,allowNull:!1},points_around_peak:{type:l.DataTypes.INTEGER,allowNull:!1},peak_threshold:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_min:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_max:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"melt_peak_settings",schema:"dbo",timestamps:!1,indexes:[{name:"PK_melt_peak_settings",unique:!0,fields:[{name:"melt_peak_settings_id"}]}]})}}t.MeltPeakSetting=s},4271:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultEvaluator=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultEvaluator",{organism_result_evaluator_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0},parent_evaluator_id:{type:l.DataTypes.INTEGER,allowNull:!0},evaluator_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"organism_result_evaluator",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result_evaluator",unique:!0,fields:[{name:"organism_result_evaluator_id"}]}]})}}t.OrganismResultEvaluator=s},1688:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultRule=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultRule",{organism_result_rule_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},evaluator_id:{type:l.DataTypes.INTEGER,allowNull:!0},parent_rule_id:{type:l.DataTypes.INTEGER,allowNull:!0},rule_type:{type:l.DataTypes.INTEGER,allowNull:!1},rule_anded:{type:l.DataTypes.BOOLEAN,allowNull:!0},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0},pass_on_equals:{type:l.DataTypes.BOOLEAN,allowNull:!0},interpretation:{type:l.DataTypes.INTEGER,allowNull:!0},reasons:{type:l.DataTypes.STRING(50),allowNull:!0},pass_on_peak:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"organism_result_rule",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result_rule",unique:!0,fields:[{name:"organism_result_rule_id"}]}]})}}t.OrganismResultRule=s},2020:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultText",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(8),allowNull:!1},result_text_reference:{type:l.DataTypes.SMALLINT,allowNull:!0},text_color_reference:{type:l.DataTypes.SMALLINT,allowNull:!0},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},organism_result_text_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"organism_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result_text",unique:!0,fields:[{name:"organism_result_text_id"}]}]})}}t.OrganismResultText=s},8356:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResult",{organism_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},result_type:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0},haplotype_index:{type:l.DataTypes.INTEGER,allowNull:!0},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_color:{type:l.DataTypes.INTEGER,allowNull:!0},result_invalid:{type:l.DataTypes.BOOLEAN,allowNull:!0},allele2_text:{type:l.DataTypes.TEXT,allowNull:!0},lda_total:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result",unique:!0,fields:[{name:"organism_result_id"}]}]})}}t.OrganismResult=s},1857:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismTarget=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismTarget",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1},selected_quant_unit_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"quant_unit_setting",key:"quant_unit_setting_id"}},organism_target_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},lda_ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!0},lda_delta_ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"organism_target",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_target",unique:!0,fields:[{name:"organism_target_id"}]}]})}}t.OrganismTarget=s},5973:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Organism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Organism",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(20),allowNull:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1},early_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},late_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},medium_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},low_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},very_low_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},semi_quant_text_ref:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:-1},replacement_text_ref:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:-1},replacement_color_ref:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:-1},delta_ct_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},organism_lis_test_code:{type:l.DataTypes.STRING(15),allowNull:!0},organism_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},lda_intercept:{type:l.DataTypes.FLOAT,allowNull:!0},lda_min_valid:{type:l.DataTypes.FLOAT,allowNull:!0},lda_cutoff:{type:l.DataTypes.FLOAT,allowNull:!0},lda_max_valid:{type:l.DataTypes.FLOAT,allowNull:!0},pr_dynamic_range_min:{type:l.DataTypes.FLOAT,allowNull:!0},pr_lod_loq:{type:l.DataTypes.FLOAT,allowNull:!0},pr_dynamic_range_max:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism",unique:!0,fields:[{name:"organism_id"}]}]})}}t.Organism=s},2703:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Path=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Path",{path_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},cartridge_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1},tube:{type:l.DataTypes.BOOLEAN,allowNull:!0},block:{type:l.DataTypes.BOOLEAN,allowNull:!0},type:{type:l.DataTypes.SMALLINT,allowNull:!0},angular_offset:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"path",schema:"dbo",timestamps:!1,indexes:[{name:"cartridge_ID",fields:[{name:"cartridge_ID"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"path_id",fields:[{name:"path_ID"}]},{name:"PK_path",unique:!0,fields:[{name:"path_ID"},{name:"cartridge_ID"}]},{name:"type",fields:[{name:"type"}]}]})}}t.Path=s},5856:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PatientTestOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PatientTestOrder",{patient_test_order_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},patient_id:{type:l.DataTypes.INTEGER,allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0},lis_test_order_id:{type:l.DataTypes.INTEGER,allowNull:!0},cartridge_order_id:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"patient_test_order",schema:"dbo",timestamps:!1,indexes:[{name:"PK__patient_test_ord__4924D839",unique:!0,fields:[{name:"patient_test_order_id"}]}]})}}t.PatientTestOrder=s},3848:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Patient=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Patient",{patient_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},gx_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},practice_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},family_name:{type:l.DataTypes.TEXT,allowNull:!0},given_name:{type:l.DataTypes.TEXT,allowNull:!0},middle_name:{type:l.DataTypes.TEXT,allowNull:!0},date_of_birth:{type:l.DataTypes.STRING(32),allowNull:!0},gender:{type:l.DataTypes.STRING(64),allowNull:!0},ethnicity:{type:l.DataTypes.STRING(64),allowNull:!0},postal_code:{type:l.DataTypes.TEXT,allowNull:!0}},{tableName:"patient",schema:"dbo",timestamps:!1,indexes:[{name:"PK__patient__473C8FC7",unique:!0,fields:[{name:"patient_id"}]}]})}}t.Patient=s},598:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Privilege=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Privilege",{privilege_name:{type:l.DataTypes.STRING(64),allowNull:!1,primaryKey:!0},user_type:{type:l.DataTypes.SMALLINT,allowNull:!1,primaryKey:!0}},{tableName:"privilege",schema:"dbo",timestamps:!1,indexes:[{name:"PK_privilege",unique:!0,fields:[{name:"privilege_name"},{name:"user_type"}]}]})}}t.Privilege=s},7679:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QcResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QcResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_name:{type:l.DataTypes.STRING(32),allowNull:!1},assay_version:{type:l.DataTypes.SMALLINT,allowNull:!1},rgt_lot_id:{type:l.DataTypes.STRING(6),allowNull:!0},completion_date:{type:l.DataTypes.DATE,allowNull:!0},due_date:{type:l.DataTypes.DATE,allowNull:!1}},{tableName:"qc_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__qc_resul__3213E83F0FB750B3",unique:!0,fields:[{name:"id"}]}]})}}t.QcResult=s},5234:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QcTest=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QcTest",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0},qc_result_id:{type:l.DataTypes.INTEGER,allowNull:!1},is_pos:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_pass:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"qc_test",schema:"dbo",timestamps:!1,indexes:[{name:"PK__qc_test__3213E83F1387E197",unique:!0,fields:[{name:"id"}]}]})}}t.QcTest=s},500:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QuantResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QuantResult",{quant_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"test_ID"}},quant_unit_setting_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"quant_unit_setting",key:"quant_unit_setting_id"}},quantitative_result:{type:l.DataTypes.FLOAT,allowNull:!0},result_text:{type:l.DataTypes.STRING(1024),allowNull:!0},result_text_color:{type:l.DataTypes.SMALLINT,allowNull:!1},qualitative_result:{type:l.DataTypes.STRING(50),allowNull:!0},result_abnormal_flag:{type:l.DataTypes.STRING(5),allowNull:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_result_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"quant_result",schema:"dbo",timestamps:!1,indexes:[{name:"analyte_result_id",fields:[{name:"analyte_result_id"}]},{name:"PK__quant_result__3AD6B8E2",unique:!0,fields:[{name:"quant_result_id"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.QuantResult=s},6572:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QuantUnitSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QuantUnitSetting",{quant_unit_setting_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"assay_ID"}},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1},position:{type:l.DataTypes.INTEGER,allowNull:!1},unit_key:{type:l.DataTypes.STRING(50),allowNull:!1},conversion_factor:{type:l.DataTypes.FLOAT,allowNull:!1},lower_limit:{type:l.DataTypes.FLOAT,allowNull:!1},upper_limit:{type:l.DataTypes.FLOAT,allowNull:!1},display_log_value:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:0},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"quant_unit_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant_unit_setti__351DDF8C",unique:!0,fields:[{name:"quant_unit_setting_id"}]}]})}}t.QuantUnitSetting=s},2025:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ReagentLot",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},rgt_lot_number:{type:l.DataTypes.STRING(3),allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!0},reagent_lot_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"guid",fields:[{name:"guid"}]},{name:"PK_reagent_lot",unique:!0,fields:[{name:"reagent_lot_id"}]},{name:"rgt_lot_number",fields:[{name:"rgt_lot_number"}]}]})}}t.ReagentLot=s},1084:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RetainCartridgeColor=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("RetainCartridgeColor",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1},color:{type:l.DataTypes.INTEGER,allowNull:!1},retain_cartridge:{type:l.DataTypes.BOOLEAN,allowNull:!0},retain_cartridge_color_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"retain_cartridge_color",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_retain_cartridge",unique:!0,fields:[{name:"retain_cartridge_color_id"}]}]})}}t.RetainCartridgeColor=s},7617:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleSetting",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},sample_type:{type:l.DataTypes.SMALLINT,allowNull:!1},valid_min:{type:l.DataTypes.DECIMAL(5,1),allowNull:!0},valid_max:{type:l.DataTypes.DECIMAL(5,1),allowNull:!0},end_pt_threshold:{type:l.DataTypes.SMALLINT,allowNull:!0},probe_chk_low_max:{type:l.DataTypes.INTEGER,allowNull:!0},probe_chk_high_min:{type:l.DataTypes.INTEGER,allowNull:!0},probe_chk_delta:{type:l.DataTypes.INTEGER,allowNull:!0},is_lot_parameters:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_endpoint:{type:l.DataTypes.BOOLEAN,allowNull:!0},peak_height_min:{type:l.DataTypes.FLOAT,allowNull:!0},use_delta_ct:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},min_delta_ct:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:0},delta_ct_eff:{type:l.DataTypes.FLOAT,allowNull:!0},E0:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E1:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E2:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E3:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E4:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},sample_settings_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},reagent_lot_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_low_min:{type:l.DataTypes.INTEGER,allowNull:!0},probe_chk_high_max:{type:l.DataTypes.INTEGER,allowNull:!0},ct_threshold_value:{type:l.DataTypes.FLOAT,allowNull:!0},normalization_factor:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"sample_settings",schema:"dbo",timestamps:!1,indexes:[{name:"analyte_id",fields:[{name:"analyte_id"}]},{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"PK_sample_settings",unique:!0,fields:[{name:"sample_settings_id"}]},{name:"reagent_lot_id",fields:[{name:"reagent_lot_id"}]},{name:"sample_type",fields:[{name:"sample_type"}]}]})}}t.SampleSetting=s},1674:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleType=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleType",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},pos:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"sample_type",schema:"dbo",timestamps:!1})}}t.SampleType=s},2412:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Snp=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Snp",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!0},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!0},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0},snp_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"snp",schema:"dbo",timestamps:!1,indexes:[{name:"PK_snp",unique:!0,fields:[{name:"snp_id"}]}]})}}t.Snp=s},6151:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SystemLog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SystemLog",{error_type:{type:l.DataTypes.INTEGER,allowNull:!0},log_time:{type:l.DataTypes.STRING(24),allowNull:!0},error_code:{type:l.DataTypes.INTEGER,allowNull:!0},details:{type:l.DataTypes.STRING(512),allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},site_name:{type:l.DataTypes.CHAR(3),allowNull:!0,defaultValue:""},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},system_log_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"system_log",schema:"dbo",timestamps:!1,indexes:[{name:"IX_system_log",fields:[{name:"system_log_ID"}]},{name:"PK_system_log",unique:!0,fields:[{name:"system_log_ID"}]}]})}}t.SystemLog=s},3969:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlogCounter=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlogCounter",{test_blog_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"test_blog",key:"test_blog_ID"}},date_text:{type:l.DataTypes.STRING(8),allowNull:!1,primaryKey:!0},test_count:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_blog_counter",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_blog_counter",unique:!0,fields:[{name:"test_blog_ID"},{name:"date_text"}]}]})}}t.TestBlogCounter=s},6103:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlog",{test_blog_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_name:{type:l.DataTypes.STRING(32),allowNull:!0},assay_version:{type:l.DataTypes.SMALLINT,allowNull:!1}},{tableName:"test_blog",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_blog",unique:!0,fields:[{name:"test_blog_ID"}]}]})}}t.TestBlog=s},1808:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestGraphSetup",{test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},graph_setup_ID:{type:l.DataTypes.INTEGER,allowNull:!1},pos:{type:l.DataTypes.SMALLINT,allowNull:!0},test_graph_setup_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"graph_setup_ID",fields:[{name:"graph_setup_ID"}]},{name:"PK_test_graph_setup",unique:!0,fields:[{name:"test_graph_setup_id"}]},{name:"test_ID",fields:[{name:"test_ID"}]}]})}}t.TestGraphSetup=s},3569:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestHistory",{test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},field_name:{type:l.DataTypes.STRING(32),allowNull:!1},old_content:{type:l.DataTypes.STRING(512),allowNull:!0},new_content:{type:l.DataTypes.STRING(512),allowNull:!0},user_ID:{type:l.DataTypes.INTEGER,allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!1},test_history_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"test_history",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_history",unique:!0,fields:[{name:"test_history_id"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.TestHistory=s},9642:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestPcError=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestPcError",{test_id:{type:l.DataTypes.INTEGER,allowNull:!1},code:{type:l.DataTypes.INTEGER,allowNull:!0},type:{type:l.DataTypes.SMALLINT,allowNull:!0},details:{type:l.DataTypes.STRING(512),allowNull:!0},severity:{type:l.DataTypes.SMALLINT,allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!0},parameter_1:{type:l.DataTypes.FLOAT,allowNull:!0},parameter_2:{type:l.DataTypes.FLOAT,allowNull:!0},parameter_3:{type:l.DataTypes.FLOAT,allowNull:!0},parameter_4:{type:l.DataTypes.FLOAT,allowNull:!0},textparameter:{type:l.DataTypes.STRING(64),allowNull:!0},test_pc_error_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_pc_error",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_pc_error",unique:!0,fields:[{name:"test_pc_error_id"}]},{name:"test_id",fields:[{name:"test_id"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.TestPcError=s},6548:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestRun=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestRun",{test_run_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},site_name:{type:l.DataTypes.CHAR(3),allowNull:!1},site_serial_num:{type:l.DataTypes.INTEGER,allowNull:!0},rgt_lot_ID:{type:l.DataTypes.STRING(6),allowNull:!1},cart_serial_number:{type:l.DataTypes.BIGINT,allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},state:{type:l.DataTypes.SMALLINT,allowNull:!0},error_status:{type:l.DataTypes.SMALLINT,allowNull:!0},start_time:{type:l.DataTypes.STRING(24),allowNull:!0},end_time:{type:l.DataTypes.STRING(24),allowNull:!0},user_ID:{type:l.DataTypes.INTEGER,allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0},icore_serial_num:{type:l.DataTypes.INTEGER,allowNull:!0},fw_version:{type:l.DataTypes.STRING(12),allowNull:!0},datagram_format:{type:l.DataTypes.SMALLINT,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},order_time:{type:l.DataTypes.STRING(24),allowNull:!0},expiration_date:{type:l.DataTypes.DATE,allowNull:!1},cartridge_barcode:{type:l.DataTypes.STRING(1024),allowNull:!0},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},current_test_run:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"test_run",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_run",unique:!0,fields:[{name:"test_run_id"}]}]})}}t.TestRun=s},9100:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Test=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Test",{test_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!0},sample_ID:{type:l.DataTypes.STRING(25),allowNull:!0},scanned_SID:{type:l.DataTypes.BOOLEAN,allowNull:!0},scanned_PID:{type:l.DataTypes.BOOLEAN,allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},test_type:{type:l.DataTypes.SMALLINT,allowNull:!0},expected_result:{type:l.DataTypes.SMALLINT,allowNull:!0},lis_upload_message_ID:{type:l.DataTypes.STRING(64),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},order_time:{type:l.DataTypes.STRING(24),allowNull:!0},outliner:{type:l.DataTypes.BOOLEAN,allowNull:!1},archived:{type:l.DataTypes.BOOLEAN,allowNull:!1},auto_archived:{type:l.DataTypes.BOOLEAN,allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},other_sample_type_text:{type:l.DataTypes.STRING(32),allowNull:!0},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_text_colors:{type:l.DataTypes.TEXT,allowNull:!0},express_result_text:{type:l.DataTypes.STRING(1024),allowNull:!0},order_id:{type:l.DataTypes.INTEGER,allowNull:!1},upload_status:{type:l.DataTypes.INTEGER,allowNull:!1},priority:{type:l.DataTypes.INTEGER,allowNull:!0},cartridge_order_id:{type:l.DataTypes.INTEGER,allowNull:!0},data_reduction_alg:{type:l.DataTypes.SMALLINT,allowNull:!1},state:{type:l.DataTypes.SMALLINT,allowNull:!0},error_status:{type:l.DataTypes.SMALLINT,allowNull:!0},site_name:{type:l.DataTypes.TEXT,allowNull:!0},site_serial_num:{type:l.DataTypes.TEXT,allowNull:!0},operator_ids:{type:l.DataTypes.TEXT,allowNull:!0},start_time:{type:l.DataTypes.STRING(24),allowNull:!0},end_time:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"test",schema:"dbo",timestamps:!1,indexes:[{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"guid",fields:[{name:"guid"}]},{name:"PK_test",unique:!0,fields:[{name:"test_ID"}]},{name:"start_time",fields:[{name:"start_time"}]}]})}}t.Test=s},8075:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.User=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("User",{user_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},login_name:{type:l.DataTypes.STRING(16),allowNull:!0},full_name:{type:l.DataTypes.STRING(128),allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_hidden:{type:l.DataTypes.BOOLEAN,allowNull:!1},password:{type:l.DataTypes.STRING(32),allowNull:!0},user_type:{type:l.DataTypes.SMALLINT,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"users",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_users",unique:!0,fields:[{name:"user_ID"}]}]})}}t.User=s},1058:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{o(l.next(e))}catch(e){n(e)}}function r(e){try{o(l.throw(e))}catch(e){n(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,r)}o((l=l.apply(e,t||[])).next())}))},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.GeneXpertClient=void 0;const n=s(a(2245)),i=a(9634),r=a(496),o=a(7306),u=a(7228),d="YYYY/MM/DD HH:mm:ss.SSS";t.GeneXpertClient=class{constructor(e,t,a,l){this.version=e,this.sequelize=(0,o.createSequelize)(t,a,l),this.models=(0,u.initModels)(this.sequelize)}logsTotal(){return this.models.SystemLog.count()}testsTotal(){return this.models.Test.count()}systemInfo(){const e=this.sequelize.query("\n          SELECT\n            MAX(sw_version) as [sw_version],\n            [system_log].[site_serial_number],\n            [system_log].[site_name],\n            MAX([instrument_serial_number]) as [instrument_serial_number],\n            MAX(log_time) as [log_time],\n            MIN(log_time) as [first_seen_at],\n            MAX([disabled_module].[creation_time]) as [disabled_at]\n          FROM [dbo].[system_log]\n            LEFT JOIN [dbo].[disabled_module]\n            ON [dbo].[disabled_module].[site_serial_number] = [dbo].[system_log].[site_serial_number]\n          GROUP BY [site_name], [system_log].[site_serial_number]\n          ORDER BY log_time DESC\n        ").then((([e])=>e)),t=this.models.Config.findAll().then((e=>e.map((e=>({[e.param_key]:e.param_val}))))).then(i.mergeAll);return Promise.all([e,t]).then((e=>(0,o.toSystemInfo)(...e)))}testsPresyncables(e,t,a){return this.models.Test.findAll({where:{[r.Op.or]:[{modification_time:{[r.Op.gt]:e}},{modification_time:{[r.Op.eq]:e},id:{[r.Op.notIn]:t}}]},order:[["modification_time","DESC"]],limit:a}).then((e=>e.map((({id:e,modification_time:t})=>({id:e.toString(),modified:t})))))}testsSyncables(e){return this.models.Test.findAll({where:{id:{[r.Op.in]:e}},include:[{as:"test_data",model:this.models.TestDatum,include:[{as:"run_data",model:this.models.RunDatum}]},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]}},{as:"user",model:this.models.User},{as:"test_errors",model:this.models.TestError},{as:"patient",model:this.models.Patient},{as:"analyte_results",model:this.models.AnalyteResult,include:[{as:"analyte",model:this.models.Analyte},{as:"channel_processed_data_items",model:this.models.ChannelProcessedDataItem}]},{as:"organism_results",model:this.models.OrganismResult,include:[{as:"organism",model:this.models.Organism},{as:"organism_based_organism_result",model:this.models.OrganismBasedOrganismResult}]}]}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}testsForEntry(e,t){return this.models.Test.findAll({where:{sample_id:{[r.Op.notIn]:e}},include:[{as:"test_data",model:this.models.TestDatum,include:[{as:"run_data",model:this.models.RunDatum,required:!0,where:{start_time:{[r.Op.gte]:(0,n.default)().subtract(t||o.hoursForDataEntry,"hours").toDate()}}}],required:!0},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[r.Op.in]:o.assaysForDataEntry}},required:!0}]}).then((e=>(console.log({tests:e}),e.map((e=>({id:e.id,assay:e.assay.name,endedAt:e.test_data.run_data.end_time,sampleId:e.sample_id,startedAt:e.test_data.run_data.start_time}))))))}logsPresyncables(e,t,a){return this.models.SystemLog.findAll({where:{[r.Op.or]:[{log_time:{[r.Op.gt]:e}},{log_time:{[r.Op.eq]:e},id:{[r.Op.notIn]:t}}]},limit:a,attributes:["id","log_time"],order:[["log_time","ASC"]]}).then((e=>e.map((({id:e,log_time:t})=>({id:e.toString(),modified:t})))))}logsSyncables(e){return this.models.SystemLog.findAll({where:{id:{[r.Op.in]:e}}}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}close(){return this.sequelize.close()}getTest(e){var t,a;return l(this,void 0,void 0,(function*(){const l=yield this.models.Test.findOne({where:{sample_id:{[r.Op.eq]:e}},include:[{as:"test_data",model:this.models.TestDatum,include:[{as:"run_data",model:this.models.RunDatum}],required:!0}]});return{dataValues:Object.assign(Object.assign({},null==l?void 0:l.dataValues),{end_time:null===(t=null==l?void 0:l.dataValues)||void 0===t?void 0:t.test_data.run_data.end_time,sampleId:null===(a=null==l?void 0:l.dataValues)||void 0===a?void 0:a.sample_id})}}))}getTestsByTestIds(e){return this.models.Test.findAll({where:{id:{[r.Op.in]:e}},include:[{as:"test_data",model:this.models.TestDatum,include:[{as:"run_data",model:this.models.RunDatum,required:!0}],required:!0},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[r.Op.in]:o.assaysForDataEntry}},required:!0}]}).then((e=>(console.log({tests:e}),e.map((e=>({id:e.id,assay:e.assay.name,endedAt:e.test_data.run_data.end_time,sampleId:e.sample_id,startedAt:e.test_data.run_data.start_time}))))))}getCompletedTestsBySampleIds(e){return this.models.Test.findAll({where:{sample_id:{[r.Op.in]:e},modification_time:{[r.Op.and]:[{[r.Op.not]:null},{[r.Op.between]:[(0,n.default)().subtract(o.LAB_RESULT_APPROVAL_DEADLINE_HOURS,"hours").format(d),(0,n.default)().format(d)]}]},result_text:{[r.Op.not]:null}},include:[{as:"test_data",model:this.models.TestDatum,include:[{as:"run_data",model:this.models.RunDatum,required:!0}],required:!0},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[r.Op.in]:o.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t,a,l,s,i,r,o;return{id:e.id,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(null!==(s=null===(l=null===(a=null==e?void 0:e.test_data)||void 0===a?void 0:a.run_data)||void 0===l?void 0:l.end_time)&&void 0!==s?s:null==e?void 0:e.modification_time,d).toDate(),sampleId:e.sample_id,startedAt:(0,n.default)(null!==(o=null===(r=null===(i=null==e?void 0:e.test_data)||void 0===i?void 0:i.run_data)||void 0===r?void 0:r.start_time)&&void 0!==o?o:null==e?void 0:e.order_time,d).toDate()}}))))}}},7978:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AnalyteResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AnalyteResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}}},{tableName:"analyte_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_analyte_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__analyte___3213E83E14E7CED0",unique:!0,fields:[{name:"id"}]}]})}}t.AnalyteResult=s},2794:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Analyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Analyte",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},analyte_index:{type:l.DataTypes.INTEGER,allowNull:!1},background_end:{type:l.DataTypes.INTEGER,allowNull:!1},background_look_back:{type:l.DataTypes.INTEGER,allowNull:!1},background_max_rms_error:{type:l.DataTypes.FLOAT,allowNull:!0},background_max_slope:{type:l.DataTypes.FLOAT,allowNull:!0},background_min_points:{type:l.DataTypes.INTEGER,allowNull:!1},background_start:{type:l.DataTypes.INTEGER,allowNull:!1},boxcar_cycles:{type:l.DataTypes.INTEGER,allowNull:!1},curve_analysis:{type:l.DataTypes.INTEGER,allowNull:!1},curve_fit_end_index:{type:l.DataTypes.INTEGER,allowNull:!0},curve_fit_max_nrse:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_slope_vs_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_min_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_start_index:{type:l.DataTypes.INTEGER,allowNull:!0},intended_concentration:{type:l.DataTypes.FLOAT,allowNull:!1},invalid_bias:{type:l.DataTypes.INTEGER,allowNull:!1},is_signal_loss_detection_enabled:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_probe_check_use_delta_pc:{type:l.DataTypes.BOOLEAN,allowNull:!1},name:{type:l.DataTypes.STRING(20),allowNull:!1},probe_check_max_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_min_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},reporter_name:{type:l.DataTypes.STRING(12),allowNull:!1},target:{type:l.DataTypes.BLOB,allowNull:!0},use_curve_fit:{type:l.DataTypes.BOOLEAN,allowNull:!1},use_curve_fit_end_data:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_curve_fit_on_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_curve_fit_start_background:{type:l.DataTypes.BOOLEAN,allowNull:!0},usage:{type:l.DataTypes.INTEGER,allowNull:!1},use_background_validation:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"analyte",schema:"dbo",timestamps:!1,indexes:[{name:"PK__analyte__3213E83F45720FCE",unique:!0,fields:[{name:"id"}]}]})}}t.Analyte=s},7237:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayChamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayChamber",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge",key:"id"}},chamber_number:{type:l.DataTypes.INTEGER,allowNull:!1},initial_volume:{type:l.DataTypes.INTEGER,allowNull:!1},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!1},name:{type:l.DataTypes.STRING(16),allowNull:!1}},{tableName:"assay_chamber",schema:"dbo",timestamps:!1,indexes:[{name:"PK__assay_ch__3213E83F3198BBBB",unique:!0,fields:[{name:"id"}]}]})}}t.AssayChamber=s},9295:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayExt=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayExt",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},position:{type:l.DataTypes.INTEGER,allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"assay_ext",schema:"dbo",timestamps:!1,indexes:[{name:"PK__assay_ex__3213E83F022A7289",unique:!0,fields:[{name:"id"}]},{name:"UX_assayext_assayid",unique:!0,fields:[{name:"assay_id"}]}]})}}t.AssayExt=s},3262:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Assay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Assay",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}},assay_index:{type:l.DataTypes.INTEGER,allowNull:!0},result_text_type:{type:l.DataTypes.INTEGER,allowNull:!0},allows_result_masking:{type:l.DataTypes.BOOLEAN,allowNull:!0},assay_lock_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_version:{type:l.DataTypes.INTEGER,allowNull:!0},command_bytes:{type:l.DataTypes.BLOB,allowNull:!0},command_sequence_format:{type:l.DataTypes.INTEGER,allowNull:!0},comments:{type:l.DataTypes.STRING(4e3),allowNull:!0},company_code:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},data_reduction_algorithm:{type:l.DataTypes.INTEGER,allowNull:!0},default_result_text_index:{type:l.DataTypes.INTEGER,allowNull:!0},default_text_color_reference:{type:l.DataTypes.INTEGER,allowNull:!0},disclaimer:{type:l.DataTypes.STRING(4e3),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_clia_waived:{type:l.DataTypes.BOOLEAN,allowNull:!0},lock_comments:{type:l.DataTypes.STRING(4e3),allowNull:!0},lock_time:{type:l.DataTypes.DATE,allowNull:!0},modification_time:{type:l.DataTypes.DATE,allowNull:!0},name:{type:l.DataTypes.STRING(32),allowNull:!1},need_lsp:{type:l.DataTypes.BOOLEAN,allowNull:!0},picture:{type:l.DataTypes.BLOB,allowNull:!0},prep_cartridge_shelf_life:{type:l.DataTypes.INTEGER,allowNull:!0},product_code:{type:l.DataTypes.INTEGER,allowNull:!0},sample_prep_instruction:{type:l.DataTypes.STRING(256),allowNull:!0},sample_prep_video:{type:l.DataTypes.BLOB,allowNull:!0},use_background_subtraction:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_melt_all_peaks:{type:l.DataTypes.BOOLEAN,allowNull:!0},melt_calculation_type:{type:l.DataTypes.INTEGER,allowNull:!0},user_name:{type:l.DataTypes.STRING(128),allowNull:!0}},{tableName:"assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__assay__3213E83FA31C85AC",unique:!0,fields:[{name:"id"}]},{name:"UX_assay_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.Assay=s},7023:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BasicOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("BasicOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}}},{tableName:"basic_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__basic_or__3213E83F1461EC00",unique:!0,fields:[{name:"id"}]}]})}}t.BasicOrganism=s},7747:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CartridgeType=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CartridgeType",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},adc_2_psi:{type:l.DataTypes.FLOAT,allowNull:!1},air_chamber:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_foot_height:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_version:{type:l.DataTypes.INTEGER,allowNull:!1},creation_time:{type:l.DataTypes.DATE,allowNull:!1},direct_flow_rate_max:{type:l.DataTypes.FLOAT,allowNull:!1},direct_flow_rate_min:{type:l.DataTypes.FLOAT,allowNull:!1},direct_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},filter_flow_rate_max:{type:l.DataTypes.FLOAT,allowNull:!1},filter_flow_rate_min:{type:l.DataTypes.FLOAT,allowNull:!1},filter_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},initial_aspirate_flow_rate:{type:l.DataTypes.FLOAT,allowNull:!1},initial_aspirate_volume:{type:l.DataTypes.INTEGER,allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},max_pressure:{type:l.DataTypes.INTEGER,allowNull:!1},microliters_per_revolution:{type:l.DataTypes.FLOAT,allowNull:!1},min_pressure:{type:l.DataTypes.INTEGER,allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1},overflow_chamber:{type:l.DataTypes.INTEGER,allowNull:!1},picture:{type:l.DataTypes.BLOB,allowNull:!0},plunger_pickup_position:{type:l.DataTypes.INTEGER,allowNull:!1},plunger_strip_position:{type:l.DataTypes.INTEGER,allowNull:!1},syringe_max_transfer_volume:{type:l.DataTypes.INTEGER,allowNull:!1},syringe_max_volume:{type:l.DataTypes.INTEGER,allowNull:!1},syringe_min_transfer_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_chamber_number:{type:l.DataTypes.INTEGER,allowNull:!1},tube_chamber_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_pressurized_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_syringe_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_volume:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"cartridge_type",schema:"dbo",timestamps:!1,indexes:[{name:"PK__cartridg__3213E83FBEDCCE47",unique:!0,fields:[{name:"id"}]},{name:"UX_cartridgetype_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.CartridgeType=s},4786:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Cartridge=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Cartridge",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},air_chamber:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_type_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge_type",key:"id"}},overflow_chamber:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"cartridge",schema:"dbo",timestamps:!1,indexes:[{name:"PK__cartridg__3213E83FC188E9DE",unique:!0,fields:[{name:"id"}]}]})}}t.Cartridge=s},72:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Chamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Chamber",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge_type",key:"id"}},chamber_number:{type:l.DataTypes.INTEGER,allowNull:!1},max_volume:{type:l.DataTypes.INTEGER,allowNull:!1},min_volume:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"chamber",schema:"dbo",timestamps:!1,indexes:[{name:"PK__chamber__3213E83F0917E88C",unique:!0,fields:[{name:"id"}]}]})}}t.Chamber=s},1245:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ChannelProcessedDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ChannelProcessedDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte_result",key:"id"}},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"channel_processed_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_channel_processed_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__channel___3213E83E2B0FCE58",unique:!0,fields:[{name:"id"}]}]})}}t.ChannelProcessedDataItem=s},2762:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ChannelRawDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ChannelRawDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"channel_raw_data",key:"id"}},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0},timestamps:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"channel_raw_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_channel_raw_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__channel___3213E83E9C17EB49",unique:!0,fields:[{name:"id"}]}]})}}t.ChannelRawDataItem=s},1843:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ChannelRawDatum=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ChannelRawDatum",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test_data",key:"id"}},protocol_number:{type:l.DataTypes.INTEGER,allowNull:!1},channel_name:{type:l.DataTypes.STRING(32),allowNull:!1}},{tableName:"channel_raw_data",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_channel_raw_data_parent_id",fields:[{name:"parent_id"}]},{name:"PK__channel___3213E83EE6BEF901",unique:!0,fields:[{name:"id"}]}]})}}t.ChannelRawDatum=s},1328:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalAnalyteDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalAnalyteDataItem",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"channel_processed_data_item",key:"id"}},organism_index:{type:l.DataTypes.INTEGER,allowNull:!0},calculation_index:{type:l.DataTypes.INTEGER,allowNull:!0},row_index:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"clinical_analyte_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F0CD269AC",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalAnalyteDataItem=s},3525:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalAnalyteResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalAnalyteResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"analyte_result",key:"id"}}},{tableName:"clinical_analyte_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FFA28E224",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalAnalyteResult=s},524:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalAssay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"clinical_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FF50319E1",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalAssay=s},9505:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalCalculationInput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalCalculationInput",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_input",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_calculation_row",key:"id"}}},{tableName:"clinical_calculation_input",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F414142BF",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalCalculationInput=s},1349:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalCalculationOutput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalCalculationOutput",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_output",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_calculation_row",key:"id"}}},{tableName:"clinical_calculation_output",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F4BBB0C99",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalCalculationOutput=s},76:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalCalculationRow=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalCalculationRow",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_calculation",key:"id"}},row_index:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_calculation_row",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F5B82DD16",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalCalculationRow=s},4944:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalCalculation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalCalculation",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_organism",key:"id"}},calculation_index:{type:l.DataTypes.INTEGER,allowNull:!1},description:{type:l.DataTypes.STRING(200),allowNull:!1},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_calculation",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F9541F948",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalCalculation=s},394:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalActionFinalResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalActionFinalResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_conditional_action",key:"id"}},result_text:{type:l.DataTypes.INTEGER,allowNull:!0},result_color:{type:l.DataTypes.INTEGER,allowNull:!1},formatted_result:{type:l.DataTypes.STRING(100),allowNull:!0}},{tableName:"clinical_conditional_action_final_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FCC4B13C0",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalActionFinalResult=s},4966:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalActionInput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalActionInput",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_input",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_conditional_action",key:"id"}}},{tableName:"clinical_conditional_action_input",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FEFE9E46E",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalActionInput=s},6025:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalActionOutput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalActionOutput",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_output",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_conditional_action",key:"id"}}},{tableName:"clinical_conditional_action_output",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F9516484F",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalActionOutput=s},1649:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalAction=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalAction",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_conditional_row",key:"id"}},action_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_conditional_action",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F4F69BFC0",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalAction=s},1737:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalCellBoolean=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalCellBoolean",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_conditional_cell",key:"id"}},pass_on_true:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"clinical_conditional_cell_boolean",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F77B37E6A",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalCellBoolean=s},396:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalCellInput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalCellInput",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_input",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_conditional_cell",key:"id"}}},{tableName:"clinical_conditional_cell_input",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F7103405A",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalCellInput=s},6199:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalCellNumeric=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalCellNumeric",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_conditional_cell",key:"id"}},comparator:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_conditional_cell_numeric",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FA2655DA8",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalCellNumeric=s},8085:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalCell=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalCell",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_conditional_row",key:"id"}},cell_index:{type:l.DataTypes.INTEGER,allowNull:!1},cell_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_conditional_cell",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F03BC1C65",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalCell=s},7243:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalRow=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalRow",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_calculation",key:"id"}},row_index:{type:l.DataTypes.INTEGER,allowNull:!1},anded:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"clinical_conditional_row",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F8B8030AD",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalRow=s},8263:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalDataItemHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalDataItemHistory",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_test_history",key:"id"}},assay_index:{type:l.DataTypes.INTEGER,allowNull:!0},item_type:{type:l.DataTypes.INTEGER,allowNull:!1},item_index:{type:l.DataTypes.INTEGER,allowNull:!1},item_name:{type:l.DataTypes.STRING(64),allowNull:!1},item_value:{type:l.DataTypes.TEXT,allowNull:!1}},{tableName:"clinical_data_item_history",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_clinical_data_item_history_parent_id",fields:[{name:"parent_id"}]},{name:"PK__clinical__3213E83E85137B98",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalDataItemHistory=s},9838:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorChoiceValue=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorChoiceValue",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_factor",key:"id"}},description:{type:l.DataTypes.STRING(200),allowNull:!1},value_index:{type:l.DataTypes.INTEGER,allowNull:!1},value:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"clinical_factor_choice_value",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F86CD6890",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorChoiceValue=s},1387:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorDouble=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorDouble",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_factor",key:"id"}},max_value:{type:l.DataTypes.FLOAT,allowNull:!0},max_inclusive:{type:l.DataTypes.BOOLEAN,allowNull:!0},min_value:{type:l.DataTypes.FLOAT,allowNull:!0},min_inclusive:{type:l.DataTypes.BOOLEAN,allowNull:!0},scale:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_factor_double",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F9FC35501",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorDouble=s},7308:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorHistory",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_test_history",key:"id"}},factor_index:{type:l.DataTypes.INTEGER,allowNull:!1},factor_value:{type:l.DataTypes.TEXT,allowNull:!0}},{tableName:"clinical_factor_history",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_clinical_factor_history_parent_id",fields:[{name:"parent_id"}]},{name:"PK__clinical__3213E83E8816DFD4",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorHistory=s},165:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorInteger=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorInteger",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_factor",key:"id"}},max_value:{type:l.DataTypes.INTEGER,allowNull:!0},max_inclusive:{type:l.DataTypes.BOOLEAN,allowNull:!0},min_value:{type:l.DataTypes.INTEGER,allowNull:!0},min_inclusive:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"clinical_factor_integer",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F5DE2C715",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorInteger=s},8127:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorIntervalRange=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorIntervalRange",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_factor",key:"id"}},max_value:{type:l.DataTypes.FLOAT,allowNull:!0},max_inclusive:{type:l.DataTypes.BOOLEAN,allowNull:!0},min_value:{type:l.DataTypes.FLOAT,allowNull:!0},min_inclusive:{type:l.DataTypes.BOOLEAN,allowNull:!0},range_index:{type:l.DataTypes.INTEGER,allowNull:!1},value:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"clinical_factor_interval_range",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FCDBAF07C",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorIntervalRange=s},2995:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorInterval=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorInterval",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_factor",key:"id"}},scale:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_factor_interval",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F6C72855B",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorInterval=s},7395:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorText",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_factor",key:"id"}},max_length:{type:l.DataTypes.INTEGER,allowNull:!0},min_length:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"clinical_factor_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F438B66D2",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorText=s},2327:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorValue=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorValue",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},factor_index:{type:l.DataTypes.INTEGER,allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0}},{tableName:"clinical_factor_value",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_clinical_factor_value_parent_id",fields:[{name:"parent_id"}]},{name:"PK__clinical__3213E83E8C7743F0",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorValue=s},6072:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactor=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactor",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},type:{type:l.DataTypes.INTEGER,allowNull:!1},factor_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1},required:{type:l.DataTypes.BOOLEAN,allowNull:!1},reportable:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"clinical_factor",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F6E1A38C3",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactor=s},8206:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalInput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalInput",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_index:{type:l.DataTypes.INTEGER,allowNull:!0},input_index:{type:l.DataTypes.INTEGER,allowNull:!1},item_index:{type:l.DataTypes.INTEGER,allowNull:!0},item_name:{type:l.DataTypes.STRING(64),allowNull:!0},item_type:{type:l.DataTypes.INTEGER,allowNull:!1},item_value:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"clinical_input",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F74FD12D5",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalInput=s},4411:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalOrganismDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalOrganismDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_organism_result",key:"id"}},calculation_index:{type:l.DataTypes.INTEGER,allowNull:!1},row_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0}},{tableName:"clinical_organism_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_clinical_organism_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__clinical__3213E83E7D5A9F8B",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalOrganismDataItem=s},2837:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},formatted_result:{type:l.DataTypes.TEXT,allowNull:!0}},{tableName:"clinical_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F0BF84811",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalOrganismResult=s},823:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}}},{tableName:"clinical_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F91CC7040",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalOrganism=s},9554:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalOutput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalOutput",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_index:{type:l.DataTypes.INTEGER,allowNull:!0},item_type:{type:l.DataTypes.INTEGER,allowNull:!1},item_index:{type:l.DataTypes.INTEGER,allowNull:!1},output_name:{type:l.DataTypes.STRING(64),allowNull:!1},scale:{type:l.DataTypes.INTEGER,allowNull:!1},persisted:{type:l.DataTypes.BOOLEAN,allowNull:!1},reportable:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"clinical_output",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F14B9ED43",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalOutput=s},1491:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalReagentLot",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"reagent_lot",key:"id"}}},{tableName:"clinical_reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F4E29E422",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalReagentLot=s},3999:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalSampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalSampleSetting",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"sample_setting",key:"id"}},lsp1:{type:l.DataTypes.FLOAT,allowNull:!0},lsp2:{type:l.DataTypes.FLOAT,allowNull:!0},lsp3:{type:l.DataTypes.FLOAT,allowNull:!0},lsp4:{type:l.DataTypes.FLOAT,allowNull:!0},lsp5:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"clinical_sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FD8FB1F3C",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalSampleSetting=s},6277:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalTestHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalTestHistory",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"test_history",key:"id"}},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_color:{type:l.DataTypes.TEXT,allowNull:!0},change_notes:{type:l.DataTypes.STRING(512),allowNull:!0}},{tableName:"clinical_test_history",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FE9C5E368",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalTestHistory=s},9891:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorDisclaimer=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ColorDisclaimer",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},color:{type:l.DataTypes.INTEGER,allowNull:!1},disclaimer:{type:l.DataTypes.STRING(256),allowNull:!0}},{tableName:"color_disclaimer",schema:"dbo",timestamps:!1,indexes:[{name:"PK__color_di__3213E83FAE3B421D",unique:!0,fields:[{name:"id"}]}]})}}t.ColorDisclaimer=s},2469:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Config",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},param_key:{type:l.DataTypes.STRING(64),allowNull:!0},param_val:{type:l.DataTypes.STRING(512),allowNull:!0}},{tableName:"config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__config__3213E83FC1650530",unique:!0,fields:[{name:"id"}]},{name:"UX_config_paramkey",unique:!0,fields:[{name:"param_key"}]}]})}}t.Config=s},1630:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CrosstalkCorrResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CrosstalkCorrResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte_result",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte",key:"id"}},protocol_index:{type:l.DataTypes.INTEGER,allowNull:!1},ignore_code:{type:l.DataTypes.STRING(64),allowNull:!1},correlation_slope:{type:l.DataTypes.FLOAT,allowNull:!0},correlation_r2:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"crosstalk_corr_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_crosstalk_corr_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__crosstal__3213E83E0C67F430",unique:!0,fields:[{name:"id"}]}]})}}t.CrosstalkCorrResult=s},611:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DeltaCtOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("DeltaCtOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"basic_organism",key:"id"}},delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!1},delta_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"delta_ct_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__delta_ct__3213E83F4A8FAF95",unique:!0,fields:[{name:"id"}]}]})}}t.DeltaCtOrganism=s},6688:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DisabledModule=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("DisabledModule",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!1},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"disabled_module",schema:"dbo",timestamps:!1,indexes:[{name:"PK__disabled__3213E83F9BC346A8",unique:!0,fields:[{name:"id"}]},{name:"UX_disabledmodule_siteserialnumber",unique:!0,fields:[{name:"site_serial_number"}]}]})}}t.DisabledModule=s},6778:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingHaplotypeOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingHaplotypeOrganism",{haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"haplotype",key:"id"}},genotyping_organism_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"genotyping_organism",key:"id"}}},{tableName:"genotyping_haplotype_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__060A713D62762933",unique:!0,fields:[{name:"haplotype_id"},{name:"genotyping_organism_id"}]},{name:"UX_gho_haplotypeid_genotypingorganismid",unique:!0,fields:[{name:"haplotype_id"},{name:"genotyping_organism_id"}]}]})}}t.GenotypingHaplotypeOrganism=s},6331:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}}},{tableName:"genotyping_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__3213E83F30C3A17A",unique:!0,fields:[{name:"id"}]}]})}}t.GenotypingOrganismResult=s},4037:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},early_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!1},late_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"genotyping_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__3213E83FE30FD201",unique:!0,fields:[{name:"id"}]}]})}}t.GenotypingOrganism=s},9059:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetupAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetupAssay",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},graph_setup_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"graph_setup",key:"id"}},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}}},{tableName:"graph_setup_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__graph_se__3213E83FD6372598",unique:!0,fields:[{name:"id"}]},{name:"UX_graphsetupassay_graphsetupid_assayid",unique:!0,fields:[{name:"graph_setup_id"},{name:"assay_id"}]}]})}}t.GraphSetupAssay=s},6898:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetup",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},graph_type:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!1},is_default:{type:l.DataTypes.BOOLEAN,allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1}},{tableName:"graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__graph_se__3213E83F9C07A4B9",unique:!0,fields:[{name:"id"}]}]})}}t.GraphSetup=s},6919:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.HaplotypeResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("HaplotypeResultText",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"haplotype",key:"id"}},alleles_text1:{type:l.DataTypes.STRING(10),allowNull:!1},alleles_text2:{type:l.DataTypes.STRING(10),allowNull:!1},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(11),allowNull:!1},text_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"haplotype_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK__haplotyp__3213E83F72031D90",unique:!0,fields:[{name:"id"}]}]})}}t.HaplotypeResultText=s},8932:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.HaplotypeResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("HaplotypeResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"haplotype",key:"id"}},allele1_text:{type:l.DataTypes.TEXT,allowNull:!1},allele2_text:{type:l.DataTypes.TEXT,allowNull:!1},result_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"haplotype_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_haplotype_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__haplotyp__3213E83E3CD9584C",unique:!0,fields:[{name:"id"}]}]})}}t.HaplotypeResult=s},904:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Haplotype=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Haplotype",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},haplotype_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(20),allowNull:!1}},{tableName:"haplotype",schema:"dbo",timestamps:!1,indexes:[{name:"PK__haplotyp__3213E83FF5494E7E",unique:!0,fields:[{name:"id"}]}]})}}t.Haplotype=s},7228:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DeltaCtOrganism=t.CrosstalkCorrResult=t.Config=t.ColorDisclaimer=t.ClinicalTestHistory=t.ClinicalSampleSetting=t.ClinicalReagentLot=t.ClinicalOutput=t.ClinicalOrganismResult=t.ClinicalOrganismDataItem=t.ClinicalOrganism=t.ClinicalInput=t.ClinicalFactorValue=t.ClinicalFactorText=t.ClinicalFactorIntervalRange=t.ClinicalFactorInterval=t.ClinicalFactorInteger=t.ClinicalFactorHistory=t.ClinicalFactorDouble=t.ClinicalFactorChoiceValue=t.ClinicalFactor=t.ClinicalDataItemHistory=t.ClinicalConditionalRow=t.ClinicalConditionalCellNumeric=t.ClinicalConditionalCellInput=t.ClinicalConditionalCellBoolean=t.ClinicalConditionalCell=t.ClinicalConditionalActionOutput=t.ClinicalConditionalActionInput=t.ClinicalConditionalActionFinalResult=t.ClinicalConditionalAction=t.ClinicalCalculationRow=t.ClinicalCalculationOutput=t.ClinicalCalculationInput=t.ClinicalCalculation=t.ClinicalAssay=t.ClinicalAnalyteResult=t.ClinicalAnalyteDataItem=t.ChannelRawDataItem=t.ChannelRawDatum=t.ChannelProcessedDataItem=t.Chamber=t.CartridgeType=t.Cartridge=t.BasicOrganism=t.AssayExt=t.AssayChamber=t.Assay=t.AnalyteResult=t.Analyte=void 0,t.Reporter=t.ReportGraphSetting=t.ReagentLot=t.RawDataItem=t.QuantUnitSetting=t.Quant1SampleSetting=t.Quant1Result=t.Quant1ReagentLot=t.Quant1OrganismResult=t.Quant1Organism=t.QcTest=t.QcResult=t.QcLockoutSetting=t.PressureGraphSetup=t.PercentRatioSampleSetting=t.PercentRatioResultEvaluator=t.PercentRatioReagentLot=t.PercentRatioOrganismResult=t.PercentRatioOrganism=t.Patient=t.Path=t.OrganismTarget=t.OrganismResultText=t.OrganismResult=t.OrganismBasedOrganismResult=t.Organism=t.OpticsGraphSetup=t.MeltPeakSetting=t.MeltPeakResult=t.MeltGraphSetup=t.LisUpload=t.LisTestOrder=t.LisOrganismConfig=t.LisHaplotypeConfig=t.LisGenotypingAssayConfig=t.LisAssayConfig=t.LdaOrganismResult=t.LdaOrganism=t.LdaCoefficient=t.LdaAnalyte=t.Instrument=t.HaplotypeResultText=t.HaplotypeResult=t.Haplotype=t.GraphSetupAssay=t.GraphSetup=t.GenotypingOrganismResult=t.GenotypingOrganism=t.GenotypingHaplotypeOrganism=t.DisabledModule=void 0,t.initModels=t.User=t.UserPrivilege=t.UserLockout=t.UserExt=t.UltrasonicGraphSetup=t.TestHistory=t.TestExt=t.TestError=t.TestDataError=t.TestDatum=t.TestBlogCounter=t.TestBlog=t.Test=t.TemperatureGraphSetup=t.TargetBasedOrganism=t.SystemLog=t.SemiQuantOrganism=t.SelectedQuantUnitSetting=t.SampleType=t.SampleSetting=t.RunDatum=t.ResultRuleMeltPeak=t.ResultRuleInterpretation=t.ResultRuleAnalyte=t.ResultMaskingConfig=t.ResultEvaluator=t.ResultCalculation=void 0;const l=a(2794);Object.defineProperty(t,"Analyte",{enumerable:!0,get:function(){return l.Analyte}});const s=a(7978);Object.defineProperty(t,"AnalyteResult",{enumerable:!0,get:function(){return s.AnalyteResult}});const n=a(3262);Object.defineProperty(t,"Assay",{enumerable:!0,get:function(){return n.Assay}});const i=a(7237);Object.defineProperty(t,"AssayChamber",{enumerable:!0,get:function(){return i.AssayChamber}});const r=a(9295);Object.defineProperty(t,"AssayExt",{enumerable:!0,get:function(){return r.AssayExt}});const o=a(7023);Object.defineProperty(t,"BasicOrganism",{enumerable:!0,get:function(){return o.BasicOrganism}});const u=a(4786);Object.defineProperty(t,"Cartridge",{enumerable:!0,get:function(){return u.Cartridge}});const d=a(7747);Object.defineProperty(t,"CartridgeType",{enumerable:!0,get:function(){return d.CartridgeType}});const p=a(72);Object.defineProperty(t,"Chamber",{enumerable:!0,get:function(){return p.Chamber}});const y=a(1245);Object.defineProperty(t,"ChannelProcessedDataItem",{enumerable:!0,get:function(){return y.ChannelProcessedDataItem}});const c=a(1843);Object.defineProperty(t,"ChannelRawDatum",{enumerable:!0,get:function(){return c.ChannelRawDatum}});const _=a(2762);Object.defineProperty(t,"ChannelRawDataItem",{enumerable:!0,get:function(){return _.ChannelRawDataItem}});const m=a(1328);Object.defineProperty(t,"ClinicalAnalyteDataItem",{enumerable:!0,get:function(){return m.ClinicalAnalyteDataItem}});const T=a(3525);Object.defineProperty(t,"ClinicalAnalyteResult",{enumerable:!0,get:function(){return T.ClinicalAnalyteResult}});const N=a(524);Object.defineProperty(t,"ClinicalAssay",{enumerable:!0,get:function(){return N.ClinicalAssay}});const g=a(4944);Object.defineProperty(t,"ClinicalCalculation",{enumerable:!0,get:function(){return g.ClinicalCalculation}});const f=a(9505);Object.defineProperty(t,"ClinicalCalculationInput",{enumerable:!0,get:function(){return f.ClinicalCalculationInput}});const D=a(1349);Object.defineProperty(t,"ClinicalCalculationOutput",{enumerable:!0,get:function(){return D.ClinicalCalculationOutput}});const E=a(76);Object.defineProperty(t,"ClinicalCalculationRow",{enumerable:!0,get:function(){return E.ClinicalCalculationRow}});const b=a(1649);Object.defineProperty(t,"ClinicalConditionalAction",{enumerable:!0,get:function(){return b.ClinicalConditionalAction}});const w=a(394);Object.defineProperty(t,"ClinicalConditionalActionFinalResult",{enumerable:!0,get:function(){return w.ClinicalConditionalActionFinalResult}});const I=a(4966);Object.defineProperty(t,"ClinicalConditionalActionInput",{enumerable:!0,get:function(){return I.ClinicalConditionalActionInput}});const R=a(6025);Object.defineProperty(t,"ClinicalConditionalActionOutput",{enumerable:!0,get:function(){return R.ClinicalConditionalActionOutput}});const O=a(8085);Object.defineProperty(t,"ClinicalConditionalCell",{enumerable:!0,get:function(){return O.ClinicalConditionalCell}});const h=a(1737);Object.defineProperty(t,"ClinicalConditionalCellBoolean",{enumerable:!0,get:function(){return h.ClinicalConditionalCellBoolean}});const M=a(396);Object.defineProperty(t,"ClinicalConditionalCellInput",{enumerable:!0,get:function(){return M.ClinicalConditionalCellInput}});const v=a(6199);Object.defineProperty(t,"ClinicalConditionalCellNumeric",{enumerable:!0,get:function(){return v.ClinicalConditionalCellNumeric}});const G=a(7243);Object.defineProperty(t,"ClinicalConditionalRow",{enumerable:!0,get:function(){return G.ClinicalConditionalRow}});const A=a(8263);Object.defineProperty(t,"ClinicalDataItemHistory",{enumerable:!0,get:function(){return A.ClinicalDataItemHistory}});const S=a(6072);Object.defineProperty(t,"ClinicalFactor",{enumerable:!0,get:function(){return S.ClinicalFactor}});const P=a(9838);Object.defineProperty(t,"ClinicalFactorChoiceValue",{enumerable:!0,get:function(){return P.ClinicalFactorChoiceValue}});const L=a(1387);Object.defineProperty(t,"ClinicalFactorDouble",{enumerable:!0,get:function(){return L.ClinicalFactorDouble}});const x=a(7308);Object.defineProperty(t,"ClinicalFactorHistory",{enumerable:!0,get:function(){return x.ClinicalFactorHistory}});const C=a(165);Object.defineProperty(t,"ClinicalFactorInteger",{enumerable:!0,get:function(){return C.ClinicalFactorInteger}});const K=a(2995);Object.defineProperty(t,"ClinicalFactorInterval",{enumerable:!0,get:function(){return K.ClinicalFactorInterval}});const j=a(8127);Object.defineProperty(t,"ClinicalFactorIntervalRange",{enumerable:!0,get:function(){return j.ClinicalFactorIntervalRange}});const q=a(7395);Object.defineProperty(t,"ClinicalFactorText",{enumerable:!0,get:function(){return q.ClinicalFactorText}});const k=a(2327);Object.defineProperty(t,"ClinicalFactorValue",{enumerable:!0,get:function(){return k.ClinicalFactorValue}});const F=a(8206);Object.defineProperty(t,"ClinicalInput",{enumerable:!0,get:function(){return F.ClinicalInput}});const B=a(823);Object.defineProperty(t,"ClinicalOrganism",{enumerable:!0,get:function(){return B.ClinicalOrganism}});const H=a(4411);Object.defineProperty(t,"ClinicalOrganismDataItem",{enumerable:!0,get:function(){return H.ClinicalOrganismDataItem}});const V=a(2837);Object.defineProperty(t,"ClinicalOrganismResult",{enumerable:!0,get:function(){return V.ClinicalOrganismResult}});const U=a(9554);Object.defineProperty(t,"ClinicalOutput",{enumerable:!0,get:function(){return U.ClinicalOutput}});const Q=a(1491);Object.defineProperty(t,"ClinicalReagentLot",{enumerable:!0,get:function(){return Q.ClinicalReagentLot}});const X=a(3999);Object.defineProperty(t,"ClinicalSampleSetting",{enumerable:!0,get:function(){return X.ClinicalSampleSetting}});const z=a(6277);Object.defineProperty(t,"ClinicalTestHistory",{enumerable:!0,get:function(){return z.ClinicalTestHistory}});const Y=a(9891);Object.defineProperty(t,"ColorDisclaimer",{enumerable:!0,get:function(){return Y.ColorDisclaimer}});const $=a(2469);Object.defineProperty(t,"Config",{enumerable:!0,get:function(){return $.Config}});const J=a(1630);Object.defineProperty(t,"CrosstalkCorrResult",{enumerable:!0,get:function(){return J.CrosstalkCorrResult}});const W=a(611);Object.defineProperty(t,"DeltaCtOrganism",{enumerable:!0,get:function(){return W.DeltaCtOrganism}});const Z=a(6688);Object.defineProperty(t,"DisabledModule",{enumerable:!0,get:function(){return Z.DisabledModule}});const ee=a(6778);Object.defineProperty(t,"GenotypingHaplotypeOrganism",{enumerable:!0,get:function(){return ee.GenotypingHaplotypeOrganism}});const te=a(4037);Object.defineProperty(t,"GenotypingOrganism",{enumerable:!0,get:function(){return te.GenotypingOrganism}});const ae=a(6331);Object.defineProperty(t,"GenotypingOrganismResult",{enumerable:!0,get:function(){return ae.GenotypingOrganismResult}});const le=a(6898);Object.defineProperty(t,"GraphSetup",{enumerable:!0,get:function(){return le.GraphSetup}});const se=a(9059);Object.defineProperty(t,"GraphSetupAssay",{enumerable:!0,get:function(){return se.GraphSetupAssay}});const ne=a(904);Object.defineProperty(t,"Haplotype",{enumerable:!0,get:function(){return ne.Haplotype}});const ie=a(8932);Object.defineProperty(t,"HaplotypeResult",{enumerable:!0,get:function(){return ie.HaplotypeResult}});const re=a(6919);Object.defineProperty(t,"HaplotypeResultText",{enumerable:!0,get:function(){return re.HaplotypeResultText}});const oe=a(5160);Object.defineProperty(t,"Instrument",{enumerable:!0,get:function(){return oe.Instrument}});const ue=a(1608);Object.defineProperty(t,"LdaAnalyte",{enumerable:!0,get:function(){return ue.LdaAnalyte}});const de=a(7176);Object.defineProperty(t,"LdaCoefficient",{enumerable:!0,get:function(){return de.LdaCoefficient}});const pe=a(8529);Object.defineProperty(t,"LdaOrganism",{enumerable:!0,get:function(){return pe.LdaOrganism}});const ye=a(7853);Object.defineProperty(t,"LdaOrganismResult",{enumerable:!0,get:function(){return ye.LdaOrganismResult}});const ce=a(625);Object.defineProperty(t,"LisAssayConfig",{enumerable:!0,get:function(){return ce.LisAssayConfig}});const _e=a(6465);Object.defineProperty(t,"LisGenotypingAssayConfig",{enumerable:!0,get:function(){return _e.LisGenotypingAssayConfig}});const me=a(7946);Object.defineProperty(t,"LisHaplotypeConfig",{enumerable:!0,get:function(){return me.LisHaplotypeConfig}});const Te=a(672);Object.defineProperty(t,"LisOrganismConfig",{enumerable:!0,get:function(){return Te.LisOrganismConfig}});const Ne=a(2938);Object.defineProperty(t,"LisTestOrder",{enumerable:!0,get:function(){return Ne.LisTestOrder}});const ge=a(6522);Object.defineProperty(t,"LisUpload",{enumerable:!0,get:function(){return ge.LisUpload}});const fe=a(6611);Object.defineProperty(t,"MeltGraphSetup",{enumerable:!0,get:function(){return fe.MeltGraphSetup}});const De=a(227);Object.defineProperty(t,"MeltPeakResult",{enumerable:!0,get:function(){return De.MeltPeakResult}});const Ee=a(9073);Object.defineProperty(t,"MeltPeakSetting",{enumerable:!0,get:function(){return Ee.MeltPeakSetting}});const be=a(8396);Object.defineProperty(t,"OpticsGraphSetup",{enumerable:!0,get:function(){return be.OpticsGraphSetup}});const we=a(848);Object.defineProperty(t,"Organism",{enumerable:!0,get:function(){return we.Organism}});const Ie=a(7029);Object.defineProperty(t,"OrganismBasedOrganismResult",{enumerable:!0,get:function(){return Ie.OrganismBasedOrganismResult}});const Re=a(4701);Object.defineProperty(t,"OrganismResult",{enumerable:!0,get:function(){return Re.OrganismResult}});const Oe=a(2677);Object.defineProperty(t,"OrganismResultText",{enumerable:!0,get:function(){return Oe.OrganismResultText}});const he=a(8456);Object.defineProperty(t,"OrganismTarget",{enumerable:!0,get:function(){return he.OrganismTarget}});const Me=a(7762);Object.defineProperty(t,"Path",{enumerable:!0,get:function(){return Me.Path}});const ve=a(2157);Object.defineProperty(t,"Patient",{enumerable:!0,get:function(){return ve.Patient}});const Ge=a(8967);Object.defineProperty(t,"PercentRatioOrganism",{enumerable:!0,get:function(){return Ge.PercentRatioOrganism}});const Ae=a(1604);Object.defineProperty(t,"PercentRatioOrganismResult",{enumerable:!0,get:function(){return Ae.PercentRatioOrganismResult}});const Se=a(7189);Object.defineProperty(t,"PercentRatioReagentLot",{enumerable:!0,get:function(){return Se.PercentRatioReagentLot}});const Pe=a(8524);Object.defineProperty(t,"PercentRatioResultEvaluator",{enumerable:!0,get:function(){return Pe.PercentRatioResultEvaluator}});const Le=a(7287);Object.defineProperty(t,"PercentRatioSampleSetting",{enumerable:!0,get:function(){return Le.PercentRatioSampleSetting}});const xe=a(459);Object.defineProperty(t,"PressureGraphSetup",{enumerable:!0,get:function(){return xe.PressureGraphSetup}});const Ce=a(5503);Object.defineProperty(t,"QcLockoutSetting",{enumerable:!0,get:function(){return Ce.QcLockoutSetting}});const Ke=a(2190);Object.defineProperty(t,"QcResult",{enumerable:!0,get:function(){return Ke.QcResult}});const je=a(4230);Object.defineProperty(t,"QcTest",{enumerable:!0,get:function(){return je.QcTest}});const qe=a(7284);Object.defineProperty(t,"Quant1Organism",{enumerable:!0,get:function(){return qe.Quant1Organism}});const ke=a(6774);Object.defineProperty(t,"Quant1OrganismResult",{enumerable:!0,get:function(){return ke.Quant1OrganismResult}});const Fe=a(8925);Object.defineProperty(t,"Quant1ReagentLot",{enumerable:!0,get:function(){return Fe.Quant1ReagentLot}});const Be=a(7795);Object.defineProperty(t,"Quant1Result",{enumerable:!0,get:function(){return Be.Quant1Result}});const He=a(6977);Object.defineProperty(t,"Quant1SampleSetting",{enumerable:!0,get:function(){return He.Quant1SampleSetting}});const Ve=a(589);Object.defineProperty(t,"QuantUnitSetting",{enumerable:!0,get:function(){return Ve.QuantUnitSetting}});const Ue=a(2132);Object.defineProperty(t,"RawDataItem",{enumerable:!0,get:function(){return Ue.RawDataItem}});const Qe=a(9092);Object.defineProperty(t,"ReagentLot",{enumerable:!0,get:function(){return Qe.ReagentLot}});const Xe=a(5076);Object.defineProperty(t,"ReportGraphSetting",{enumerable:!0,get:function(){return Xe.ReportGraphSetting}});const ze=a(617);Object.defineProperty(t,"Reporter",{enumerable:!0,get:function(){return ze.Reporter}});const Ye=a(3513);Object.defineProperty(t,"ResultCalculation",{enumerable:!0,get:function(){return Ye.ResultCalculation}});const $e=a(7014);Object.defineProperty(t,"ResultEvaluator",{enumerable:!0,get:function(){return $e.ResultEvaluator}});const Je=a(8770);Object.defineProperty(t,"ResultMaskingConfig",{enumerable:!0,get:function(){return Je.ResultMaskingConfig}});const We=a(6430);Object.defineProperty(t,"ResultRuleAnalyte",{enumerable:!0,get:function(){return We.ResultRuleAnalyte}});const Ze=a(872);Object.defineProperty(t,"ResultRuleInterpretation",{enumerable:!0,get:function(){return Ze.ResultRuleInterpretation}});const et=a(3051);Object.defineProperty(t,"ResultRuleMeltPeak",{enumerable:!0,get:function(){return et.ResultRuleMeltPeak}});const tt=a(2658);Object.defineProperty(t,"RunDatum",{enumerable:!0,get:function(){return tt.RunDatum}});const at=a(591);Object.defineProperty(t,"SampleSetting",{enumerable:!0,get:function(){return at.SampleSetting}});const lt=a(7919);Object.defineProperty(t,"SampleType",{enumerable:!0,get:function(){return lt.SampleType}});const st=a(7167);Object.defineProperty(t,"SelectedQuantUnitSetting",{enumerable:!0,get:function(){return st.SelectedQuantUnitSetting}});const nt=a(7020);Object.defineProperty(t,"SemiQuantOrganism",{enumerable:!0,get:function(){return nt.SemiQuantOrganism}});const it=a(4617);Object.defineProperty(t,"SystemLog",{enumerable:!0,get:function(){return it.SystemLog}});const rt=a(922);Object.defineProperty(t,"TargetBasedOrganism",{enumerable:!0,get:function(){return rt.TargetBasedOrganism}});const ot=a(7571);Object.defineProperty(t,"TemperatureGraphSetup",{enumerable:!0,get:function(){return ot.TemperatureGraphSetup}});const ut=a(1731);Object.defineProperty(t,"Test",{enumerable:!0,get:function(){return ut.Test}});const dt=a(4715);Object.defineProperty(t,"TestBlog",{enumerable:!0,get:function(){return dt.TestBlog}});const pt=a(248);Object.defineProperty(t,"TestBlogCounter",{enumerable:!0,get:function(){return pt.TestBlogCounter}});const yt=a(4309);Object.defineProperty(t,"TestDatum",{enumerable:!0,get:function(){return yt.TestDatum}});const ct=a(196);Object.defineProperty(t,"TestDataError",{enumerable:!0,get:function(){return ct.TestDataError}});const _t=a(1591);Object.defineProperty(t,"TestError",{enumerable:!0,get:function(){return _t.TestError}});const mt=a(5748);Object.defineProperty(t,"TestExt",{enumerable:!0,get:function(){return mt.TestExt}});const Tt=a(1396);Object.defineProperty(t,"TestHistory",{enumerable:!0,get:function(){return Tt.TestHistory}});const Nt=a(2535);Object.defineProperty(t,"UltrasonicGraphSetup",{enumerable:!0,get:function(){return Nt.UltrasonicGraphSetup}});const gt=a(9884);Object.defineProperty(t,"UserExt",{enumerable:!0,get:function(){return gt.UserExt}});const ft=a(6772);Object.defineProperty(t,"UserLockout",{enumerable:!0,get:function(){return ft.UserLockout}});const Dt=a(1701);Object.defineProperty(t,"UserPrivilege",{enumerable:!0,get:function(){return Dt.UserPrivilege}});const Et=a(8655);Object.defineProperty(t,"User",{enumerable:!0,get:function(){return Et.User}}),t.initModels=function(e){const t=l.Analyte.initModel(e),a=s.AnalyteResult.initModel(e),bt=n.Assay.initModel(e),wt=i.AssayChamber.initModel(e),It=r.AssayExt.initModel(e),Rt=o.BasicOrganism.initModel(e),Ot=u.Cartridge.initModel(e),ht=d.CartridgeType.initModel(e),Mt=p.Chamber.initModel(e),vt=y.ChannelProcessedDataItem.initModel(e),Gt=c.ChannelRawDatum.initModel(e),At=_.ChannelRawDataItem.initModel(e),St=m.ClinicalAnalyteDataItem.initModel(e),Pt=T.ClinicalAnalyteResult.initModel(e),Lt=N.ClinicalAssay.initModel(e),xt=g.ClinicalCalculation.initModel(e),Ct=f.ClinicalCalculationInput.initModel(e),Kt=D.ClinicalCalculationOutput.initModel(e),jt=E.ClinicalCalculationRow.initModel(e),qt=b.ClinicalConditionalAction.initModel(e),kt=w.ClinicalConditionalActionFinalResult.initModel(e),Ft=I.ClinicalConditionalActionInput.initModel(e),Bt=R.ClinicalConditionalActionOutput.initModel(e),Ht=O.ClinicalConditionalCell.initModel(e),Vt=h.ClinicalConditionalCellBoolean.initModel(e),Ut=M.ClinicalConditionalCellInput.initModel(e),Qt=v.ClinicalConditionalCellNumeric.initModel(e),Xt=G.ClinicalConditionalRow.initModel(e),zt=A.ClinicalDataItemHistory.initModel(e),Yt=S.ClinicalFactor.initModel(e),$t=P.ClinicalFactorChoiceValue.initModel(e),Jt=L.ClinicalFactorDouble.initModel(e),Wt=x.ClinicalFactorHistory.initModel(e),Zt=C.ClinicalFactorInteger.initModel(e),ea=K.ClinicalFactorInterval.initModel(e),ta=j.ClinicalFactorIntervalRange.initModel(e),aa=q.ClinicalFactorText.initModel(e),la=k.ClinicalFactorValue.initModel(e),sa=F.ClinicalInput.initModel(e),na=B.ClinicalOrganism.initModel(e),ia=H.ClinicalOrganismDataItem.initModel(e),ra=V.ClinicalOrganismResult.initModel(e),oa=U.ClinicalOutput.initModel(e),ua=Q.ClinicalReagentLot.initModel(e),da=X.ClinicalSampleSetting.initModel(e),pa=z.ClinicalTestHistory.initModel(e),ya=Y.ColorDisclaimer.initModel(e),ca=$.Config.initModel(e),_a=J.CrosstalkCorrResult.initModel(e),ma=W.DeltaCtOrganism.initModel(e),Ta=Z.DisabledModule.initModel(e),Na=ee.GenotypingHaplotypeOrganism.initModel(e),ga=te.GenotypingOrganism.initModel(e),fa=ae.GenotypingOrganismResult.initModel(e),Da=le.GraphSetup.initModel(e),Ea=se.GraphSetupAssay.initModel(e),ba=ne.Haplotype.initModel(e),wa=ie.HaplotypeResult.initModel(e),Ia=re.HaplotypeResultText.initModel(e),Ra=oe.Instrument.initModel(e),Oa=ue.LdaAnalyte.initModel(e),ha=de.LdaCoefficient.initModel(e),Ma=pe.LdaOrganism.initModel(e),va=ye.LdaOrganismResult.initModel(e),Ga=ce.LisAssayConfig.initModel(e),Aa=_e.LisGenotypingAssayConfig.initModel(e),Sa=me.LisHaplotypeConfig.initModel(e),Pa=Te.LisOrganismConfig.initModel(e),La=Ne.LisTestOrder.initModel(e),xa=ge.LisUpload.initModel(e),Ca=fe.MeltGraphSetup.initModel(e),Ka=De.MeltPeakResult.initModel(e),ja=Ee.MeltPeakSetting.initModel(e),qa=be.OpticsGraphSetup.initModel(e),ka=we.Organism.initModel(e),Fa=Ie.OrganismBasedOrganismResult.initModel(e),Ba=Re.OrganismResult.initModel(e),Ha=Oe.OrganismResultText.initModel(e),Va=he.OrganismTarget.initModel(e),Ua=Me.Path.initModel(e),Qa=ve.Patient.initModel(e),Xa=Ge.PercentRatioOrganism.initModel(e),za=Ae.PercentRatioOrganismResult.initModel(e),Ya=Se.PercentRatioReagentLot.initModel(e),$a=Pe.PercentRatioResultEvaluator.initModel(e),Ja=Le.PercentRatioSampleSetting.initModel(e),Wa=xe.PressureGraphSetup.initModel(e),Za=Ce.QcLockoutSetting.initModel(e),el=Ke.QcResult.initModel(e),tl=je.QcTest.initModel(e),al=qe.Quant1Organism.initModel(e),ll=ke.Quant1OrganismResult.initModel(e),sl=Fe.Quant1ReagentLot.initModel(e),nl=Be.Quant1Result.initModel(e),il=He.Quant1SampleSetting.initModel(e),rl=Ve.QuantUnitSetting.initModel(e),ol=Ue.RawDataItem.initModel(e),ul=Qe.ReagentLot.initModel(e),dl=Xe.ReportGraphSetting.initModel(e),pl=ze.Reporter.initModel(e),yl=Ye.ResultCalculation.initModel(e),cl=$e.ResultEvaluator.initModel(e),_l=Je.ResultMaskingConfig.initModel(e),ml=We.ResultRuleAnalyte.initModel(e),Tl=Ze.ResultRuleInterpretation.initModel(e),Nl=et.ResultRuleMeltPeak.initModel(e),gl=tt.RunDatum.initModel(e),fl=at.SampleSetting.initModel(e),Dl=lt.SampleType.initModel(e),El=st.SelectedQuantUnitSetting.initModel(e),bl=nt.SemiQuantOrganism.initModel(e),wl=it.SystemLog.initModel(e),Il=rt.TargetBasedOrganism.initModel(e),Rl=ot.TemperatureGraphSetup.initModel(e),Ol=ut.Test.initModel(e),hl=dt.TestBlog.initModel(e),Ml=pt.TestBlogCounter.initModel(e),vl=yt.TestDatum.initModel(e),Gl=ct.TestDataError.initModel(e),Al=_t.TestError.initModel(e),Sl=mt.TestExt.initModel(e),Pl=Tt.TestHistory.initModel(e),Ll=Nt.UltrasonicGraphSetup.initModel(e),xl=gt.UserExt.initModel(e),Cl=ft.UserLockout.initModel(e),Kl=Dt.UserPrivilege.initModel(e),jl=Et.User.initModel(e);return ga.belongsToMany(ba,{as:"haplotype_id_haplotypes",through:Na,foreignKey:"genotyping_organism_id",otherKey:"haplotype_id"}),ba.belongsToMany(ga,{as:"genotyping_organism_id_genotyping_organisms",through:Na,foreignKey:"haplotype_id",otherKey:"genotyping_organism_id"}),a.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(a,{as:"analyte_results",foreignKey:"analyte_id"}),_a.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(_a,{as:"crosstalk_corr_results",foreignKey:"analyte_id"}),Oa.belongsTo(t,{as:"id_analyte",foreignKey:"id"}),t.hasOne(Oa,{as:"lda_analyte",foreignKey:"id"}),ha.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(ha,{as:"lda_coefficients",foreignKey:"analyte_id"}),ja.belongsTo(t,{as:"parent",foreignKey:"parent_id"}),t.hasMany(ja,{as:"melt_peak_settings",foreignKey:"parent_id"}),Va.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(Va,{as:"organism_targets",foreignKey:"analyte_id"}),za.belongsTo(t,{as:"calculation_target",foreignKey:"calculation_target_id"}),t.hasMany(za,{as:"percent_ratio_organism_results",foreignKey:"calculation_target_id"}),za.belongsTo(t,{as:"reporting_target",foreignKey:"reporting_target_id"}),t.hasMany(za,{as:"reporting_target_percent_ratio_organism_results",foreignKey:"reporting_target_id"}),$a.belongsTo(t,{as:"calculation_target",foreignKey:"calculation_target_id"}),t.hasMany($a,{as:"percent_ratio_result_evaluators",foreignKey:"calculation_target_id"}),$a.belongsTo(t,{as:"reporting_target",foreignKey:"reporting_target_id"}),t.hasMany($a,{as:"reporting_target_percent_ratio_result_evaluators",foreignKey:"reporting_target_id"}),ml.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(ml,{as:"result_rule_analytes",foreignKey:"analyte_id"}),fl.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(fl,{as:"sample_settings",foreignKey:"analyte_id"}),vt.belongsTo(a,{as:"parent",foreignKey:"parent_id"}),a.hasMany(vt,{as:"channel_processed_data_items",foreignKey:"parent_id"}),Pt.belongsTo(a,{as:"id_analyte_result",foreignKey:"id"}),a.hasOne(Pt,{as:"clinical_analyte_result",foreignKey:"id"}),_a.belongsTo(a,{as:"parent",foreignKey:"parent_id"}),a.hasMany(_a,{as:"crosstalk_corr_results",foreignKey:"parent_id"}),Ka.belongsTo(a,{as:"parent",foreignKey:"parent_id"}),a.hasMany(Ka,{as:"melt_peak_results",foreignKey:"parent_id"}),t.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(t,{as:"analytes",foreignKey:"parent_id"}),bt.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(bt,{as:"assays",foreignKey:"parent_id"}),It.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(It,{as:"assay_exts",foreignKey:"assay_id"}),Ot.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(Ot,{as:"cartridges",foreignKey:"parent_id"}),Lt.belongsTo(bt,{as:"id_assay",foreignKey:"id"}),bt.hasOne(Lt,{as:"clinical_assay",foreignKey:"id"}),Yt.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(Yt,{as:"clinical_factors",foreignKey:"parent_id"}),ya.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(ya,{as:"color_disclaimers",foreignKey:"parent_id"}),Ea.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(Ea,{as:"graph_setup_assays",foreignKey:"assay_id"}),ba.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(ba,{as:"haplotypes",foreignKey:"parent_id"}),Ga.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(Ga,{as:"lis_assay_configs",foreignKey:"assay_id"}),ka.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(ka,{as:"organisms",foreignKey:"parent_id"}),ul.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(ul,{as:"reagent_lots",foreignKey:"parent_id"}),dl.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(dl,{as:"report_graph_settings",foreignKey:"assay_id"}),yl.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(yl,{as:"result_calculations",foreignKey:"parent_id"}),Dl.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(Dl,{as:"sample_types",foreignKey:"parent_id"}),El.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(El,{as:"selected_quant_unit_settings",foreignKey:"assay_id"}),Ol.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(Ol,{as:"tests",foreignKey:"assay_id"}),hl.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(hl,{as:"test_blogs",foreignKey:"assay_id"}),Za.belongsTo(It,{as:"parent",foreignKey:"parent_id"}),It.hasMany(Za,{as:"qc_lockout_settings",foreignKey:"parent_id"}),_l.belongsTo(It,{as:"parent",foreignKey:"parent_id"}),It.hasMany(_l,{as:"result_masking_configs",foreignKey:"parent_id"}),ma.belongsTo(Rt,{as:"id_basic_organism",foreignKey:"id"}),Rt.hasOne(ma,{as:"delta_ct_organism",foreignKey:"id"}),bl.belongsTo(Rt,{as:"id_basic_organism",foreignKey:"id"}),Rt.hasOne(bl,{as:"semi_quant_organism",foreignKey:"id"}),wt.belongsTo(Ot,{as:"parent",foreignKey:"parent_id"}),Ot.hasMany(wt,{as:"assay_chambers",foreignKey:"parent_id"}),Ot.belongsTo(ht,{as:"cartridge_type",foreignKey:"cartridge_type_id"}),ht.hasMany(Ot,{as:"cartridges",foreignKey:"cartridge_type_id"}),Mt.belongsTo(ht,{as:"parent",foreignKey:"parent_id"}),ht.hasMany(Mt,{as:"chambers",foreignKey:"parent_id"}),Ua.belongsTo(ht,{as:"parent",foreignKey:"parent_id"}),ht.hasMany(Ua,{as:"paths",foreignKey:"parent_id"}),St.belongsTo(vt,{as:"id_channel_processed_data_item",foreignKey:"id"}),vt.hasOne(St,{as:"clinical_analyte_data_item",foreignKey:"id"}),At.belongsTo(Gt,{as:"parent",foreignKey:"parent_id"}),Gt.hasMany(At,{as:"channel_raw_data_items",foreignKey:"parent_id"}),jt.belongsTo(xt,{as:"parent",foreignKey:"parent_id"}),xt.hasMany(jt,{as:"clinical_calculation_rows",foreignKey:"parent_id"}),Xt.belongsTo(xt,{as:"parent",foreignKey:"parent_id"}),xt.hasMany(Xt,{as:"clinical_conditional_rows",foreignKey:"parent_id"}),Ct.belongsTo(jt,{as:"parent",foreignKey:"parent_id"}),jt.hasMany(Ct,{as:"clinical_calculation_inputs",foreignKey:"parent_id"}),Kt.belongsTo(jt,{as:"parent",foreignKey:"parent_id"}),jt.hasMany(Kt,{as:"clinical_calculation_outputs",foreignKey:"parent_id"}),kt.belongsTo(qt,{as:"id_clinical_conditional_action",foreignKey:"id"}),qt.hasOne(kt,{as:"clinical_conditional_action_final_result",foreignKey:"id"}),Ft.belongsTo(qt,{as:"parent",foreignKey:"parent_id"}),qt.hasMany(Ft,{as:"clinical_conditional_action_inputs",foreignKey:"parent_id"}),Bt.belongsTo(qt,{as:"parent",foreignKey:"parent_id"}),qt.hasMany(Bt,{as:"clinical_conditional_action_outputs",foreignKey:"parent_id"}),Vt.belongsTo(Ht,{as:"id_clinical_conditional_cell",foreignKey:"id"}),Ht.hasOne(Vt,{as:"clinical_conditional_cell_boolean",foreignKey:"id"}),Ut.belongsTo(Ht,{as:"parent",foreignKey:"parent_id"}),Ht.hasMany(Ut,{as:"clinical_conditional_cell_inputs",foreignKey:"parent_id"}),Qt.belongsTo(Ht,{as:"id_clinical_conditional_cell",foreignKey:"id"}),Ht.hasOne(Qt,{as:"clinical_conditional_cell_numeric",foreignKey:"id"}),qt.belongsTo(Xt,{as:"parent",foreignKey:"parent_id"}),Xt.hasMany(qt,{as:"clinical_conditional_actions",foreignKey:"parent_id"}),Ht.belongsTo(Xt,{as:"parent",foreignKey:"parent_id"}),Xt.hasMany(Ht,{as:"clinical_conditional_cells",foreignKey:"parent_id"}),$t.belongsTo(Yt,{as:"parent",foreignKey:"parent_id"}),Yt.hasMany($t,{as:"clinical_factor_choice_values",foreignKey:"parent_id"}),Jt.belongsTo(Yt,{as:"id_clinical_factor",foreignKey:"id"}),Yt.hasOne(Jt,{as:"clinical_factor_double",foreignKey:"id"}),Zt.belongsTo(Yt,{as:"id_clinical_factor",foreignKey:"id"}),Yt.hasOne(Zt,{as:"clinical_factor_integer",foreignKey:"id"}),ea.belongsTo(Yt,{as:"id_clinical_factor",foreignKey:"id"}),Yt.hasOne(ea,{as:"clinical_factor_interval",foreignKey:"id"}),ta.belongsTo(Yt,{as:"parent",foreignKey:"parent_id"}),Yt.hasMany(ta,{as:"clinical_factor_interval_ranges",foreignKey:"parent_id"}),aa.belongsTo(Yt,{as:"id_clinical_factor",foreignKey:"id"}),Yt.hasOne(aa,{as:"clinical_factor_text",foreignKey:"id"}),Ct.belongsTo(sa,{as:"id_clinical_input",foreignKey:"id"}),sa.hasOne(Ct,{as:"clinical_calculation_input",foreignKey:"id"}),Ft.belongsTo(sa,{as:"id_clinical_input",foreignKey:"id"}),sa.hasOne(Ft,{as:"clinical_conditional_action_input",foreignKey:"id"}),Ut.belongsTo(sa,{as:"id_clinical_input",foreignKey:"id"}),sa.hasOne(Ut,{as:"clinical_conditional_cell_input",foreignKey:"id"}),xt.belongsTo(na,{as:"parent",foreignKey:"parent_id"}),na.hasMany(xt,{as:"clinical_calculations",foreignKey:"parent_id"}),ia.belongsTo(ra,{as:"parent",foreignKey:"parent_id"}),ra.hasMany(ia,{as:"clinical_organism_data_items",foreignKey:"parent_id"}),Kt.belongsTo(oa,{as:"id_clinical_output",foreignKey:"id"}),oa.hasOne(Kt,{as:"clinical_calculation_output",foreignKey:"id"}),Bt.belongsTo(oa,{as:"id_clinical_output",foreignKey:"id"}),oa.hasOne(Bt,{as:"clinical_conditional_action_output",foreignKey:"id"}),zt.belongsTo(pa,{as:"parent",foreignKey:"parent_id"}),pa.hasMany(zt,{as:"clinical_data_item_histories",foreignKey:"parent_id"}),Wt.belongsTo(pa,{as:"parent",foreignKey:"parent_id"}),pa.hasMany(Wt,{as:"clinical_factor_histories",foreignKey:"parent_id"}),Na.belongsTo(ga,{as:"genotyping_organism",foreignKey:"genotyping_organism_id"}),ga.hasMany(Na,{as:"genotyping_haplotype_organisms",foreignKey:"genotyping_organism_id"}),Ea.belongsTo(Da,{as:"graph_setup",foreignKey:"graph_setup_id"}),Da.hasMany(Ea,{as:"graph_setup_assays",foreignKey:"graph_setup_id"}),Ca.belongsTo(Da,{as:"id_graph_setup",foreignKey:"id"}),Da.hasOne(Ca,{as:"melt_graph_setup",foreignKey:"id"}),qa.belongsTo(Da,{as:"id_graph_setup",foreignKey:"id"}),Da.hasOne(qa,{as:"optics_graph_setup",foreignKey:"id"}),Wa.belongsTo(Da,{as:"id_graph_setup",foreignKey:"id"}),Da.hasOne(Wa,{as:"pressure_graph_setup",foreignKey:"id"}),Rl.belongsTo(Da,{as:"id_graph_setup",foreignKey:"id"}),Da.hasOne(Rl,{as:"temperature_graph_setup",foreignKey:"id"}),Ll.belongsTo(Da,{as:"id_graph_setup",foreignKey:"id"}),Da.hasOne(Ll,{as:"ultrasonic_graph_setup",foreignKey:"id"}),Na.belongsTo(ba,{as:"haplotype",foreignKey:"haplotype_id"}),ba.hasMany(Na,{as:"genotyping_haplotype_organisms",foreignKey:"haplotype_id"}),wa.belongsTo(ba,{as:"haplotype",foreignKey:"haplotype_id"}),ba.hasMany(wa,{as:"haplotype_results",foreignKey:"haplotype_id"}),Ia.belongsTo(ba,{as:"parent",foreignKey:"parent_id"}),ba.hasMany(Ia,{as:"haplotype_result_texts",foreignKey:"parent_id"}),Sa.belongsTo(ba,{as:"haplotype",foreignKey:"haplotype_id"}),ba.hasMany(Sa,{as:"lis_haplotype_configs",foreignKey:"haplotype_id"}),ha.belongsTo(Ma,{as:"parent",foreignKey:"parent_id"}),Ma.hasMany(ha,{as:"lda_coefficients",foreignKey:"parent_id"}),Aa.belongsTo(Ga,{as:"id_lis_assay_config",foreignKey:"id"}),Ga.hasOne(Aa,{as:"lis_genotyping_assay_config",foreignKey:"id"}),xa.belongsTo(La,{as:"test_order",foreignKey:"test_order_id"}),La.hasMany(xa,{as:"lis_uploads",foreignKey:"test_order_id"}),Rt.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(Rt,{as:"basic_organism",foreignKey:"id"}),na.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(na,{as:"clinical_organism",foreignKey:"id"}),ga.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(ga,{as:"genotyping_organism",foreignKey:"id"}),Ma.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(Ma,{as:"lda_organism",foreignKey:"id"}),Pa.belongsTo(ka,{as:"organism",foreignKey:"organism_id"}),ka.hasMany(Pa,{as:"lis_organism_configs",foreignKey:"organism_id"}),Ba.belongsTo(ka,{as:"organism",foreignKey:"organism_id"}),ka.hasMany(Ba,{as:"organism_results",foreignKey:"organism_id"}),Ha.belongsTo(ka,{as:"parent",foreignKey:"parent_id"}),ka.hasMany(Ha,{as:"organism_result_texts",foreignKey:"parent_id"}),Va.belongsTo(ka,{as:"parent",foreignKey:"parent_id"}),ka.hasMany(Va,{as:"organism_targets",foreignKey:"parent_id"}),Xa.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(Xa,{as:"percent_ratio_organism",foreignKey:"id"}),al.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(al,{as:"quant1_organism",foreignKey:"id"}),cl.belongsTo(ka,{as:"parent",foreignKey:"parent_id"}),ka.hasMany(cl,{as:"result_evaluators",foreignKey:"parent_id"}),_l.belongsTo(ka,{as:"organism",foreignKey:"organism_id"}),ka.hasMany(_l,{as:"result_masking_configs",foreignKey:"organism_id"}),Il.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(Il,{as:"target_based_organism",foreignKey:"id"}),ra.belongsTo(Ba,{as:"id_organism_result",foreignKey:"id"}),Ba.hasOne(ra,{as:"clinical_organism_result",foreignKey:"id"}),fa.belongsTo(Ba,{as:"id_organism_result",foreignKey:"id"}),Ba.hasOne(fa,{as:"genotyping_organism_result",foreignKey:"id"}),va.belongsTo(Ba,{as:"id_organism_result",foreignKey:"id"}),Ba.hasOne(va,{as:"lda_organism_result",foreignKey:"id"}),Fa.belongsTo(Ba,{as:"id_organism_result",foreignKey:"id"}),Ba.hasOne(Fa,{as:"organism_based_organism_result",foreignKey:"id"}),za.belongsTo(Ba,{as:"id_organism_result",foreignKey:"id"}),Ba.hasOne(za,{as:"percent_ratio_organism_result",foreignKey:"id"}),ll.belongsTo(Ba,{as:"id_organism_result",foreignKey:"id"}),Ba.hasOne(ll,{as:"quant1_organism_result",foreignKey:"id"}),La.belongsTo(Qa,{as:"patient",foreignKey:"patient_id"}),Qa.hasMany(La,{as:"lis_test_orders",foreignKey:"patient_id"}),Ol.belongsTo(Qa,{as:"patient",foreignKey:"patient_id"}),Qa.hasMany(Ol,{as:"tests",foreignKey:"patient_id"}),tl.belongsTo(el,{as:"parent",foreignKey:"parent_id"}),el.hasMany(tl,{as:"qc_tests",foreignKey:"parent_id"}),rl.belongsTo(al,{as:"parent",foreignKey:"parent_id"}),al.hasMany(rl,{as:"quant_unit_settings",foreignKey:"parent_id"}),nl.belongsTo(ll,{as:"parent",foreignKey:"parent_id"}),ll.hasMany(nl,{as:"quant1_results",foreignKey:"parent_id"}),nl.belongsTo(rl,{as:"quant_unit_setting",foreignKey:"quant_unit_setting_id"}),rl.hasMany(nl,{as:"quant1_results",foreignKey:"quant_unit_setting_id"}),ua.belongsTo(ul,{as:"id_reagent_lot",foreignKey:"id"}),ul.hasOne(ua,{as:"clinical_reagent_lot",foreignKey:"id"}),Ya.belongsTo(ul,{as:"id_reagent_lot",foreignKey:"id"}),ul.hasOne(Ya,{as:"percent_ratio_reagent_lot",foreignKey:"id"}),sl.belongsTo(ul,{as:"id_reagent_lot",foreignKey:"id"}),ul.hasOne(sl,{as:"quant1_reagent_lot",foreignKey:"id"}),fl.belongsTo(ul,{as:"parent",foreignKey:"parent_id"}),ul.hasMany(fl,{as:"sample_settings",foreignKey:"parent_id"}),ml.belongsTo(cl,{as:"parent",foreignKey:"parent_id"}),cl.hasMany(ml,{as:"result_rule_analytes",foreignKey:"parent_id"}),Tl.belongsTo(ml,{as:"id_result_rule_analyte",foreignKey:"id"}),ml.hasOne(Tl,{as:"result_rule_interpretation",foreignKey:"id"}),Nl.belongsTo(ml,{as:"id_result_rule_analyte",foreignKey:"id"}),ml.hasOne(Nl,{as:"result_rule_melt_peak",foreignKey:"id"}),da.belongsTo(fl,{as:"id_sample_setting",foreignKey:"id"}),fl.hasOne(da,{as:"clinical_sample_setting",foreignKey:"id"}),Ja.belongsTo(fl,{as:"id_sample_setting",foreignKey:"id"}),fl.hasOne(Ja,{as:"percent_ratio_sample_setting",foreignKey:"id"}),il.belongsTo(fl,{as:"id_sample_setting",foreignKey:"id"}),fl.hasOne(il,{as:"quant1_sample_setting",foreignKey:"id"}),a.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasMany(a,{as:"analyte_results",foreignKey:"parent_id"}),la.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasMany(la,{as:"clinical_factor_values",foreignKey:"parent_id"}),wa.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasMany(wa,{as:"haplotype_results",foreignKey:"parent_id"}),La.belongsTo(Ol,{as:"test",foreignKey:"test_id"}),Ol.hasMany(La,{as:"lis_test_orders",foreignKey:"test_id"}),xa.belongsTo(Ol,{as:"test",foreignKey:"test_id"}),Ol.hasMany(xa,{as:"lis_uploads",foreignKey:"test_id"}),Ba.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasMany(Ba,{as:"organism_results",foreignKey:"parent_id"}),Ol.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.belongsTo(jl,{as:"user",foreignKey:"user_login_name",targetKey:"login_name"}),Ol.hasMany(Ol,{as:"tests",foreignKey:"parent_id"}),vl.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasOne(vl,{as:"test_data",foreignKey:"parent_id"}),Al.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasMany(Al,{as:"test_errors",foreignKey:"parent_id"}),Sl.belongsTo(Ol,{as:"id_test",foreignKey:"id"}),Ol.hasOne(Sl,{as:"test_ext",foreignKey:"id"}),Pl.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasMany(Pl,{as:"test_histories",foreignKey:"parent_id"}),Ml.belongsTo(hl,{as:"test_blog",foreignKey:"test_blog_id"}),hl.hasMany(Ml,{as:"test_blog_counters",foreignKey:"test_blog_id"}),Gt.belongsTo(vl,{as:"parent",foreignKey:"parent_id"}),vl.hasMany(Gt,{as:"channel_raw_data",foreignKey:"parent_id"}),ol.belongsTo(vl,{as:"parent",foreignKey:"parent_id"}),vl.hasMany(ol,{as:"raw_data_items",foreignKey:"parent_id"}),gl.belongsTo(vl,{as:"test_datum",foreignKey:"test_data_id"}),vl.hasOne(gl,{as:"run_data",foreignKey:"test_data_id"}),Gl.belongsTo(vl,{as:"parent",foreignKey:"parent_id"}),vl.hasMany(Gl,{as:"test_data_errors",foreignKey:"parent_id"}),pa.belongsTo(Pl,{as:"id_test_history",foreignKey:"id"}),Pl.hasOne(pa,{as:"clinical_test_history",foreignKey:"id"}),xl.belongsTo(jl,{as:"id_user",foreignKey:"id"}),jl.hasOne(xl,{as:"user_ext",foreignKey:"id"}),{Analyte:t,AnalyteResult:a,Assay:bt,AssayChamber:wt,AssayExt:It,BasicOrganism:Rt,Cartridge:Ot,CartridgeType:ht,Chamber:Mt,ChannelProcessedDataItem:vt,ChannelRawDatum:Gt,ChannelRawDataItem:At,ClinicalAnalyteDataItem:St,ClinicalAnalyteResult:Pt,ClinicalAssay:Lt,ClinicalCalculation:xt,ClinicalCalculationInput:Ct,ClinicalCalculationOutput:Kt,ClinicalCalculationRow:jt,ClinicalConditionalAction:qt,ClinicalConditionalActionFinalResult:kt,ClinicalConditionalActionInput:Ft,ClinicalConditionalActionOutput:Bt,ClinicalConditionalCell:Ht,ClinicalConditionalCellBoolean:Vt,ClinicalConditionalCellInput:Ut,ClinicalConditionalCellNumeric:Qt,ClinicalConditionalRow:Xt,ClinicalDataItemHistory:zt,ClinicalFactor:Yt,ClinicalFactorChoiceValue:$t,ClinicalFactorDouble:Jt,ClinicalFactorHistory:Wt,ClinicalFactorInteger:Zt,ClinicalFactorInterval:ea,ClinicalFactorIntervalRange:ta,ClinicalFactorText:aa,ClinicalFactorValue:la,ClinicalInput:sa,ClinicalOrganism:na,ClinicalOrganismDataItem:ia,ClinicalOrganismResult:ra,ClinicalOutput:oa,ClinicalReagentLot:ua,ClinicalSampleSetting:da,ClinicalTestHistory:pa,ColorDisclaimer:ya,Config:ca,CrosstalkCorrResult:_a,DeltaCtOrganism:ma,DisabledModule:Ta,GenotypingHaplotypeOrganism:Na,GenotypingOrganism:ga,GenotypingOrganismResult:fa,GraphSetup:Da,GraphSetupAssay:Ea,Haplotype:ba,HaplotypeResult:wa,HaplotypeResultText:Ia,Instrument:Ra,LdaAnalyte:Oa,LdaCoefficient:ha,LdaOrganism:Ma,LdaOrganismResult:va,LisAssayConfig:Ga,LisGenotypingAssayConfig:Aa,LisHaplotypeConfig:Sa,LisOrganismConfig:Pa,LisTestOrder:La,LisUpload:xa,MeltGraphSetup:Ca,MeltPeakResult:Ka,MeltPeakSetting:ja,OpticsGraphSetup:qa,Organism:ka,OrganismBasedOrganismResult:Fa,OrganismResult:Ba,OrganismResultText:Ha,OrganismTarget:Va,Path:Ua,Patient:Qa,PercentRatioOrganism:Xa,PercentRatioOrganismResult:za,PercentRatioReagentLot:Ya,PercentRatioResultEvaluator:$a,PercentRatioSampleSetting:Ja,PressureGraphSetup:Wa,QcLockoutSetting:Za,QcResult:el,QcTest:tl,Quant1Organism:al,Quant1OrganismResult:ll,Quant1ReagentLot:sl,Quant1Result:nl,Quant1SampleSetting:il,QuantUnitSetting:rl,RawDataItem:ol,ReagentLot:ul,ReportGraphSetting:dl,Reporter:pl,ResultCalculation:yl,ResultEvaluator:cl,ResultMaskingConfig:_l,ResultRuleAnalyte:ml,ResultRuleInterpretation:Tl,ResultRuleMeltPeak:Nl,RunDatum:gl,SampleSetting:fl,SampleType:Dl,SelectedQuantUnitSetting:El,SemiQuantOrganism:bl,SystemLog:wl,TargetBasedOrganism:Il,TemperatureGraphSetup:Rl,Test:Ol,TestBlog:hl,TestBlogCounter:Ml,TestDatum:vl,TestDataError:Gl,TestError:Al,TestExt:Sl,TestHistory:Pl,UltrasonicGraphSetup:Ll,UserExt:xl,UserLockout:Cl,UserPrivilege:Kl,User:jl}}},5160:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Instrument=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Instrument",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},mac_address:{type:l.DataTypes.BLOB,allowNull:!0},serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},letter_offset:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"instrument",schema:"dbo",timestamps:!1,indexes:[{name:"PK__instrume__3213E83F6675BC96",unique:!0,fields:[{name:"id"}]},{name:"UX_instrument_letteroffset",unique:!0,fields:[{name:"letter_offset"}]},{name:"UX_instrument_macaddress",unique:!0,fields:[{name:"mac_address"}]},{name:"UX_instrument_serialnumber",unique:!0,fields:[{name:"serial_number"}]}]})}}t.Instrument=s},1608:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaAnalyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaAnalyte",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"analyte",key:"id"}},cycle_if_no_ct:{type:l.DataTypes.INTEGER,allowNull:!1},min_ct_req_pass_controls:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"lda_analyte",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_anal__3213E83F8B6778C1",unique:!0,fields:[{name:"id"}]}]})}}t.LdaAnalyte=s},7176:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaCoefficient=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaCoefficient",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"lda_organism",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!1},delta_ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"lda_coefficient",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_coef__3213E83F223CDD5C",unique:!0,fields:[{name:"id"}]}]})}}t.LdaCoefficient=s},7853:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},lda_total:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"lda_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_orga__3213E83FD28170E9",unique:!0,fields:[{name:"id"}]}]})}}t.LdaOrganismResult=s},8529:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},cutoff:{type:l.DataTypes.FLOAT,allowNull:!1},intercept:{type:l.DataTypes.FLOAT,allowNull:!1},max_valid_range:{type:l.DataTypes.FLOAT,allowNull:!1},min_valid_range:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"lda_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_orga__3213E83F9FD9F26C",unique:!0,fields:[{name:"id"}]}]})}}t.LdaOrganism=s},625:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisAssayConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisAssayConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},test_code:{type:l.DataTypes.STRING(15),allowNull:!0},test_code_enabled:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"lis_assay_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_assa__3213E83FFE29AC11",unique:!0,fields:[{name:"id"}]}]})}}t.LisAssayConfig=s},6465:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisGenotypingAssayConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisGenotypingAssayConfig",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"lis_assay_config",key:"id"}}},{tableName:"lis_genotyping_assay_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_geno__3213E83F51EF8137",unique:!0,fields:[{name:"id"}]}]})}}t.LisGenotypingAssayConfig=s},7946:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisHaplotypeConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisHaplotypeConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"haplotype",key:"id"}},result_code:{type:l.DataTypes.STRING(15),allowNull:!0}},{tableName:"lis_haplotype_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_hapl__3213E83F34DD1BA3",unique:!0,fields:[{name:"id"}]}]})}}t.LisHaplotypeConfig=s},672:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisOrganismConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisOrganismConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},result_code:{type:l.DataTypes.STRING(15),allowNull:!0}},{tableName:"lis_organism_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_orga__3213E83F4812458C",unique:!0,fields:[{name:"id"}]}]})}}t.LisOrganismConfig=s},2938:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisTestOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisTestOrder",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},cartridge_id:{type:l.DataTypes.STRING(25),allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},host_test_code:{type:l.DataTypes.STRING(15),allowNull:!0},instrument_specific_sample_id:{type:l.DataTypes.STRING(32),allowNull:!0},order_status:{type:l.DataTypes.INTEGER,allowNull:!1},patient_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"patient",key:"id"}},priority:{type:l.DataTypes.INTEGER,allowNull:!1},sample_id:{type:l.DataTypes.STRING(25),allowNull:!0},sample_type:{type:l.DataTypes.STRING(5),allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test",key:"id"}}},{tableName:"lis_test_order",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_test__3213E83F7178DECE",unique:!0,fields:[{name:"id"}]},{name:"UX_listestorder_testid",unique:!0,fields:[{name:"test_id"}]}]})}}t.LisTestOrder=s},6522:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisUpload=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisUpload",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},test_order_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"lis_test_order",key:"id"}},upload_message_id:{type:l.DataTypes.STRING(64),allowNull:!0},upload_status:{type:l.DataTypes.INTEGER,allowNull:!1},sample_priority:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"lis_upload",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_uplo__3213E83F638B691C",unique:!0,fields:[{name:"id"}]},{name:"UX_lis_upload_test_id",unique:!0,fields:[{name:"test_id"}]}]})}}t.LisUpload=s},6611:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltGraphSetup",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"graph_setup",key:"id"}},show_raw:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_normalized:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_1st_derivative:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_baseline:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_delta:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_temperature:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_2nd_derivative:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_zeroLine:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_threshold:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_melt_peaks:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"melt_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__melt_gra__3213E83FD58D0244",unique:!0,fields:[{name:"id"}]}]})}}t.MeltGraphSetup=s},227:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte_result",key:"id"}},peak_height:{type:l.DataTypes.FLOAT,allowNull:!1},peak_index:{type:l.DataTypes.INTEGER,allowNull:!1},peak_temperature:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"melt_peak_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_melt_peak_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__melt_pea__3213E83E6D358FD1",unique:!0,fields:[{name:"id"}]}]})}}t.MeltPeakResult=s},9073:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte",key:"id"}},baseline_look_back:{type:l.DataTypes.FLOAT,allowNull:!0},baseline_num_points:{type:l.DataTypes.INTEGER,allowNull:!0},baseline_start_temp:{type:l.DataTypes.FLOAT,allowNull:!0},peak_range_max:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_min:{type:l.DataTypes.FLOAT,allowNull:!1},peak_threshold:{type:l.DataTypes.FLOAT,allowNull:!1},points_around_peak:{type:l.DataTypes.INTEGER,allowNull:!0},reportable_melt_type:{type:l.DataTypes.INTEGER,allowNull:!0},slope_positive:{type:l.DataTypes.BOOLEAN,allowNull:!1},valley_threshold:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"melt_peak_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__melt_pea__3213E83FF9DEB820",unique:!0,fields:[{name:"id"}]},{name:"UX_meltpeaksetting_parentid",unique:!0,fields:[{name:"parent_id"}]}]})}}t.MeltPeakSetting=s},8396:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OpticsGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OpticsGraphSetup",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"graph_setup",key:"id"}},show_primary:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_raw:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_curve_fit:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_res_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_normalized:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_2nd_derivative:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_threshold:{type:l.DataTypes.BOOLEAN,allowNull:!0},axes_type:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"optics_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__optics_g__3213E83FFFECD845",unique:!0,fields:[{name:"id"}]}]})}}t.OpticsGraphSetup=s},7029:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismBasedOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismBasedOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},semi_quant_level:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"organism_based_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83F11027669",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismBasedOrganismResult=s},2677:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultText",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(8),allowNull:!1},result_text:{type:l.DataTypes.INTEGER,allowNull:!1},text_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"organism_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83F9D7E3B70",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismResultText=s},4701:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"organism",key:"id"}},result_text:{type:l.DataTypes.INTEGER,allowNull:!0},result_color:{type:l.DataTypes.INTEGER,allowNull:!0},is_result_invalid:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_result_masked:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_organism_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__organism__3213E83EFB5E0D40",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismResult=s},8456:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismTarget=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismTarget",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}}},{tableName:"organism_target",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83FBF8598E6",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismTarget=s},848:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Organism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Organism",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},name:{type:l.DataTypes.STRING(32),allowNull:!1},organism_index:{type:l.DataTypes.INTEGER,allowNull:!1},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83F26F926ED",unique:!0,fields:[{name:"id"}]}]})}}t.Organism=s},7762:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Path=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Path",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge_type",key:"id"}},angular_offset:{type:l.DataTypes.FLOAT,allowNull:!1},chamber_number:{type:l.DataTypes.INTEGER,allowNull:!0},is_block:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!1},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"path",schema:"dbo",timestamps:!1,indexes:[{name:"PK__path__3213E83F240FBBF3",unique:!0,fields:[{name:"id"}]}]})}}t.Path=s},2157:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Patient=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Patient",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},gx_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},practice_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},family_name:{type:l.DataTypes.STRING(1552),allowNull:!0},given_name:{type:l.DataTypes.STRING(240),allowNull:!0},middle_name:{type:l.DataTypes.STRING(240),allowNull:!0},date_of_birth:{type:l.DataTypes.STRING(96),allowNull:!0},gender:{type:l.DataTypes.STRING(128),allowNull:!0},ethnicity:{type:l.DataTypes.STRING(512),allowNull:!0},postal_code:{type:l.DataTypes.STRING(96),allowNull:!0}},{tableName:"patient",schema:"dbo",timestamps:!1,indexes:[{name:"PK__patient__3213E83F541351BB",unique:!0,fields:[{name:"id"}]}]})}}t.Patient=s},1604:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},ratio_percent:{type:l.DataTypes.FLOAT,allowNull:!0},log_transform:{type:l.DataTypes.FLOAT,allowNull:!0},reporting_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},calculation_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},detailed_result:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"percent_ratio_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83FC6D34960",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioOrganismResult=s},8967:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},dynamic_range_max:{type:l.DataTypes.FLOAT,allowNull:!1},dynamic_range_min:{type:l.DataTypes.FLOAT,allowNull:!1},lod_loq:{type:l.DataTypes.FLOAT,allowNull:!1},log_transform_type:{type:l.DataTypes.INTEGER,allowNull:!1},units:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"percent_ratio_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F1369279B",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioOrganism=s},7189:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioReagentLot",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"reagent_lot",key:"id"}}},{tableName:"percent_ratio_reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83FAC63EA04",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioReagentLot=s},8524:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioResultEvaluator=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioResultEvaluator",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},calculation_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},reporting_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}}},{tableName:"percent_ratio_result_evaluator",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83FC91E78DE",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioResultEvaluator=s},7287:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioSampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioSampleSetting",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"sample_setting",key:"id"}},delta_ct_efficiency:{type:l.DataTypes.FLOAT,allowNull:!0},scaling_factor:{type:l.DataTypes.DECIMAL(5,2),allowNull:!0}},{tableName:"percent_ratio_sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F5A46BC97",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioSampleSetting=s},459:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PressureGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PressureGraphSetup",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"graph_setup",key:"id"}},show_assay_threshold:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_system_threshold:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"pressure_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__pressure__3213E83F32143A0B",unique:!0,fields:[{name:"id"}]}]})}}t.PressureGraphSetup=s},5503:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QcLockoutSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QcLockoutSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay_ext",key:"id"}},qc_enabled:{type:l.DataTypes.BOOLEAN,allowNull:!1},qc_on_lot:{type:l.DataTypes.BOOLEAN,allowNull:!1},frequency:{type:l.DataTypes.INTEGER,allowNull:!1},display:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"qc_lockout_settings",schema:"dbo",timestamps:!1,indexes:[{name:"PK__qc_locko__3213E83F6DF99E8C",unique:!0,fields:[{name:"id"}]}]})}}t.QcLockoutSetting=s},2190:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QcResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QcResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_name:{type:l.DataTypes.STRING(32),allowNull:!1},assay_version:{type:l.DataTypes.INTEGER,allowNull:!1},rgt_lot_id:{type:l.DataTypes.STRING(5),allowNull:!0},due_date:{type:l.DataTypes.DATE,allowNull:!1},completion_date:{type:l.DataTypes.DATE,allowNull:!0}},{tableName:"qc_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__qc_resul__3213E83FC6AB8A0D",unique:!0,fields:[{name:"id"}]}]})}}t.QcResult=s},4230:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QcTest=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QcTest",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"qc_result",key:"id"}},test_id:{type:l.DataTypes.INTEGER,allowNull:!0},status:{type:l.DataTypes.INTEGER,allowNull:!1},end_time:{type:l.DataTypes.DATE,allowNull:!0},is_pos:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"qc_test",schema:"dbo",timestamps:!1,indexes:[{name:"PK__qc_test__3213E83FADFD5E80",unique:!0,fields:[{name:"id"}]}]})}}t.QcTest=s},6774:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1OrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1OrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}}},{tableName:"quant1_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_o__3213E83F56AEF9A5",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1OrganismResult=s},7284:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1Organism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1Organism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},max_quantitative_delta:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"quant1_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_o__3213E83F0EE566DB",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1Organism=s},8925:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1ReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1ReagentLot",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"reagent_lot",key:"id"}}},{tableName:"quant1_reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_r__3213E83F68A59646",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1ReagentLot=s},7795:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1Result=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1Result",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"quant1_organism_result",key:"id"}},quantitative_result:{type:l.DataTypes.FLOAT,allowNull:!0},quant_unit_setting_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"quant_unit_setting",key:"id"}},result_abnormal_flag:{type:l.DataTypes.STRING(5),allowNull:!0}},{tableName:"quant1_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_quant1_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__quant1_r__3213E83E7286B386",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1Result=s},6977:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1SampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1SampleSetting",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"sample_setting",key:"id"}},e0:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},e1:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},e2:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0}},{tableName:"quant1_sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_s__3213E83FFA6CD02F",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1SampleSetting=s},589:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QuantUnitSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QuantUnitSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"quant1_organism",key:"id"}},conversion_factor:{type:l.DataTypes.FLOAT,allowNull:!1},display_log_value:{type:l.DataTypes.BOOLEAN,allowNull:!1},lower_limit:{type:l.DataTypes.FLOAT,allowNull:!1},position:{type:l.DataTypes.INTEGER,allowNull:!1},units:{type:l.DataTypes.INTEGER,allowNull:!1},upper_limit:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"quant_unit_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant_un__3213E83F6AA4ACAC",unique:!0,fields:[{name:"id"}]}]})}}t.QuantUnitSetting=s},2132:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RawDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("RawDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test_data",key:"id"}},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0},timestamps:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"raw_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_raw_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__raw_data__3213E83E6F5B3EAF",unique:!0,fields:[{name:"id"}]}]})}}t.RawDataItem=s},9092:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ReagentLot",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},creation_time:{type:l.DataTypes.DATE,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!1},reagent_lot_number:{type:l.DataTypes.STRING(3),allowNull:!1}},{tableName:"reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__reagent___3213E83FE1FD856F",unique:!0,fields:[{name:"id"}]}]})}}t.ReagentLot=s},5076:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ReportGraphSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ReportGraphSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}},graph_type:{type:l.DataTypes.INTEGER,allowNull:!0},param_key:{type:l.DataTypes.STRING(64),allowNull:!1},param_val:{type:l.DataTypes.STRING(512),allowNull:!0}},{tableName:"report_graph_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__report_g__3213E83F88AEEA20",unique:!0,fields:[{name:"id"}]}]})}}t.ReportGraphSetting=s},617:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Reporter=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Reporter",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},concentration:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(12),allowNull:!1}},{tableName:"reporter",schema:"dbo",timestamps:!1,indexes:[{name:"PK__reporter__3213E83FE02BD9EF",unique:!0,fields:[{name:"id"}]},{name:"UX_reporter_name",unique:!0,fields:[{name:"name"}]}]})}}t.Reporter=s},3513:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultCalculation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultCalculation",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},chain_name:{type:l.DataTypes.STRING(64),allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1}},{tableName:"result_calculation",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_c__3213E83F401E0DFE",unique:!0,fields:[{name:"id"}]}]})}}t.ResultCalculation=s},7014:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultEvaluator=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultEvaluator",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},evaluator_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_text:{type:l.DataTypes.INTEGER,allowNull:!1},rule_anded:{type:l.DataTypes.BOOLEAN,allowNull:!1},text_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"result_evaluator",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_e__3213E83FE1614926",unique:!0,fields:[{name:"id"}]}]})}}t.ResultEvaluator=s},8770:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultMaskingConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultMaskingConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay_ext",key:"id"}},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}}},{tableName:"result_masking_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_m__3213E83FCE36E124",unique:!0,fields:[{name:"id"}]}]})}}t.ResultMaskingConfig=s},6430:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultRuleAnalyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultRuleAnalyte",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"result_evaluator",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},rule_index:{type:l.DataTypes.INTEGER,allowNull:!1},rule_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"result_rule_analyte",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_r__3213E83FD2CA5D7B",unique:!0,fields:[{name:"id"}]}]})}}t.ResultRuleAnalyte=s},872:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultRuleInterpretation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultRuleInterpretation",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"result_rule_analyte",key:"id"}},interpretation:{type:l.DataTypes.INTEGER,allowNull:!1},pass_on_equals:{type:l.DataTypes.BOOLEAN,allowNull:!1},reasons:{type:l.DataTypes.STRING(50),allowNull:!0}},{tableName:"result_rule_interpretation",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_r__3213E83FF6E9FEAE",unique:!0,fields:[{name:"id"}]}]})}}t.ResultRuleInterpretation=s},3051:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultRuleMeltPeak=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultRuleMeltPeak",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"result_rule_analyte",key:"id"}},pass_on_peak:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"result_rule_melt_peak",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_r__3213E83F6989F9D8",unique:!0,fields:[{name:"id"}]}]})}}t.ResultRuleMeltPeak=s},2658:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RunDatum=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("RunDatum",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_data_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test_data",key:"id"}},datagram_format:{type:l.DataTypes.INTEGER,allowNull:!0},datagrams:{type:l.DataTypes.BLOB,allowNull:!0},end_time:{type:l.DataTypes.DATE,allowNull:!0},fw_version:{type:l.DataTypes.STRING(12),allowNull:!0},icore_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},site_name:{type:l.DataTypes.STRING(512),allowNull:!0},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},start_time:{type:l.DataTypes.DATE,allowNull:!0},state:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"run_data",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_run_data_test_data_id",fields:[{name:"test_data_id"}]},{name:"PK__run_data__3213E83E567DD4BC",unique:!0,fields:[{name:"id"}]},{name:"UX_rundata_testdataid",unique:!0,fields:[{name:"test_data_id"}]}]})}}t.RunDatum=s},591:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"reagent_lot",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},ct_threshold_value:{type:l.DataTypes.FLOAT,allowNull:!1},end_pt_threshold:{type:l.DataTypes.INTEGER,allowNull:!1},min_delta_ct:{type:l.DataTypes.FLOAT,allowNull:!1},normalization_factor:{type:l.DataTypes.INTEGER,allowNull:!1},peak_height_min:{type:l.DataTypes.FLOAT,allowNull:!1},probe_chk_delta:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_high_max:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_high_min:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_low_max:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_low_min:{type:l.DataTypes.INTEGER,allowNull:!1},use_endpoint:{type:l.DataTypes.BOOLEAN,allowNull:!1},use_min_delta_ct:{type:l.DataTypes.BOOLEAN,allowNull:!1},valid_max:{type:l.DataTypes.DECIMAL(5,1),allowNull:!1},valid_min:{type:l.DataTypes.DECIMAL(5,1),allowNull:!1}},{tableName:"sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__sample_s__3213E83F5CA8F508",unique:!0,fields:[{name:"id"}]}]})}}t.SampleSetting=s},7919:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleType=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleType",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},sample_type_key:{type:l.DataTypes.STRING(5),allowNull:!1}},{tableName:"sample_type",schema:"dbo",timestamps:!1,indexes:[{name:"PK__sample_t__3213E83F677484AC",unique:!0,fields:[{name:"id"}]}]})}}t.SampleType=s},7167:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SelectedQuantUnitSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SelectedQuantUnitSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},units:{type:l.DataTypes.INTEGER,allowNull:!1},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}}},{tableName:"selected_quant_unit_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__selected__3213E83FD2197D49",unique:!0,fields:[{name:"id"}]}]})}}t.SelectedQuantUnitSetting=s},7020:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SemiQuantOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SemiQuantOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"basic_organism",key:"id"}},delta_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1},low_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1},medium_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1},replaced_result_color:{type:l.DataTypes.INTEGER,allowNull:!1},replaced_result_text:{type:l.DataTypes.INTEGER,allowNull:!1},semi_quant_result_text:{type:l.DataTypes.INTEGER,allowNull:!1},very_low_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"semi_quant_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__semi_qua__3213E83FD6EC71C5",unique:!0,fields:[{name:"id"}]}]})}}t.SemiQuantOrganism=s},4617:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SystemLog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SystemLog",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},details:{type:l.DataTypes.STRING(512),allowNull:!0},error_code:{type:l.DataTypes.INTEGER,allowNull:!0},error_type:{type:l.DataTypes.INTEGER,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!1},site_name:{type:l.DataTypes.STRING(512),allowNull:!0},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0}},{tableName:"system_log",schema:"dbo",timestamps:!1,indexes:[{name:"PK__system_l__3213E83F2F74C3E3",unique:!0,fields:[{name:"id"}]}]})}}t.SystemLog=s},922:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TargetBasedOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TargetBasedOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}}},{tableName:"target_based_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__target_b__3213E83FC9C8466E",unique:!0,fields:[{name:"id"}]}]})}}t.TargetBasedOrganism=s},7571:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TemperatureGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TemperatureGraphSetup",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"graph_setup",key:"id"}},show_sample:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_heater:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_target:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"temperature_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__temperat__3213E83F0FBD7F66",unique:!0,fields:[{name:"id"}]}]})}}t.TemperatureGraphSetup=s},248:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlogCounter=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlogCounter",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_blog_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test_blog",key:"id"}},date_text:{type:l.DataTypes.STRING(8),allowNull:!0},test_count:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"test_blog_counter",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test_blo__3213E83FC91A3CB2",unique:!0,fields:[{name:"id"}]},{name:"UX_testblogcounter_testblogid_datetext",unique:!0,fields:[{name:"test_blog_id"},{name:"date_text"}]}]})}}t.TestBlogCounter=s},4715:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlog",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}}},{tableName:"test_blog",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test_blo__3213E83F18287316",unique:!0,fields:[{name:"id"}]},{name:"UX_testblog_assayid",unique:!0,fields:[{name:"assay_id"}]}]})}}t.TestBlog=s},196:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestDataError=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestDataError",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test_data",key:"id"}},code:{type:l.DataTypes.INTEGER,allowNull:!1},details:{type:l.DataTypes.STRING(512),allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!1},param1:{type:l.DataTypes.FLOAT,allowNull:!0},param2:{type:l.DataTypes.FLOAT,allowNull:!0},param3:{type:l.DataTypes.FLOAT,allowNull:!0},param4:{type:l.DataTypes.FLOAT,allowNull:!0},severity:{type:l.DataTypes.INTEGER,allowNull:!1},site_state:{type:l.DataTypes.INTEGER,allowNull:!1},step_number:{type:l.DataTypes.INTEGER,allowNull:!1},text_param:{type:l.DataTypes.STRING(64),allowNull:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_data_error",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_data_error_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_dat__3213E83E78622473",unique:!0,fields:[{name:"id"}]}]})}}t.TestDataError=s},4309:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestDatum=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestDatum",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},error_status:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_data",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_data_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_dat__3213E83E31E5BA7A",unique:!0,fields:[{name:"id"}]},{name:"UX_testdata_parentid",unique:!0,fields:[{name:"parent_id"}]}]})}}t.TestDatum=s},1591:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestError=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestError",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},code:{type:l.DataTypes.INTEGER,allowNull:!1},details:{type:l.DataTypes.STRING(512),allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!1},param1:{type:l.DataTypes.FLOAT,allowNull:!0},param2:{type:l.DataTypes.FLOAT,allowNull:!0},param3:{type:l.DataTypes.FLOAT,allowNull:!0},param4:{type:l.DataTypes.FLOAT,allowNull:!0},severity:{type:l.DataTypes.INTEGER,allowNull:!1},text_param:{type:l.DataTypes.STRING(256),allowNull:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_error",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_error_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_err__3213E83EF5E87ABE",unique:!0,fields:[{name:"id"}]}]})}}t.TestError=s},5748:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestExt=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestExt",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"test",key:"id"}},version:{type:l.DataTypes.INTEGER,allowNull:!0},archived:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"test_ext",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test_ext__3213E83F7C62AA47",unique:!0,fields:[{name:"id"}]}]})}}t.TestExt=s},1396:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestHistory",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},creation_time:{type:l.DataTypes.DATE,allowNull:!1},field_name:{type:l.DataTypes.STRING(32),allowNull:!1},new_content:{type:l.DataTypes.STRING(512),allowNull:!0},old_content:{type:l.DataTypes.STRING(512),allowNull:!0},user_name:{type:l.DataTypes.STRING(128),allowNull:!0}},{tableName:"test_history",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_history_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_his__3213E83E4CEA85AD",unique:!0,fields:[{name:"id"}]}]})}}t.TestHistory=s},1731:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Test=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Test",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},result_text_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test",key:"id"}},is_current_test:{type:l.DataTypes.BOOLEAN,allowNull:!0},cartridge_barcode:{type:l.DataTypes.STRING(1024),allowNull:!0},cart_serial_number:{type:l.DataTypes.BIGINT,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},data_reduction_algorithm:{type:l.DataTypes.INTEGER,allowNull:!0},error_status:{type:l.DataTypes.INTEGER,allowNull:!1},expiration_date:{type:l.DataTypes.DATE,allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_scanned_patient_id:{type:l.DataTypes.BOOLEAN,allowNull:!0},is_scanned_sample_id:{type:l.DataTypes.BOOLEAN,allowNull:!0},modification_time:{type:l.DataTypes.DATE,allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},order_time:{type:l.DataTypes.DATE,allowNull:!0},other_sample_type_text:{type:l.DataTypes.STRING(32),allowNull:!0},legacy_result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_color:{type:l.DataTypes.TEXT,allowNull:!0},rgt_lot_id:{type:l.DataTypes.STRING(5),allowNull:!0},sample_id:{type:l.DataTypes.STRING(25),allowNull:!0},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},user_full_name:{type:l.DataTypes.STRING(128),allowNull:!0},user_login_name:{type:l.DataTypes.STRING(128),allowNull:!0},patient_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"patient",key:"id"}},test_type:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"test",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test__3213E83FF5B8B492",unique:!0,fields:[{name:"id"}]},{name:"UX_test_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.Test=s},2535:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UltrasonicGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("UltrasonicGraphSetup",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"graph_setup",key:"id"}},show_amplitude:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_frequency:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_duty_cycle:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"ultrasonic_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__ultrason__3213E83F317F7578",unique:!0,fields:[{name:"id"}]}]})}}t.UltrasonicGraphSetup=s},9884:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UserExt=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("UserExt",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"users",key:"id"}},institutional_id:{type:l.DataTypes.STRING(128),allowNull:!0},active_date:{type:l.DataTypes.DATE,allowNull:!0},expiration_date:{type:l.DataTypes.DATE,allowNull:!0}},{tableName:"user_ext",schema:"dbo",timestamps:!1,indexes:[{name:"PK__user_ext__3213E83F67F47F65",unique:!0,fields:[{name:"id"}]}]})}}t.UserExt=s},6772:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UserLockout=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("UserLockout",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},login_name:{type:l.DataTypes.STRING(32),allowNull:!1},failure_count:{type:l.DataTypes.INTEGER,allowNull:!1},last_failure:{type:l.DataTypes.DATE,allowNull:!0}},{tableName:"user_lockout",schema:"dbo",timestamps:!1,indexes:[{name:"PK__user_loc__3213E83F6537F831",unique:!0,fields:[{name:"id"}]}]})}}t.UserLockout=s},1701:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UserPrivilege=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("UserPrivilege",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},privilege_name:{type:l.DataTypes.STRING(64),allowNull:!1},user_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"user_privilege",schema:"dbo",timestamps:!1,indexes:[{name:"PK__user_pri__3213E83F7375D6FB",unique:!0,fields:[{name:"id"}]}]})}}t.UserPrivilege=s},8655:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.User=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("User",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},full_name:{type:l.DataTypes.STRING(128),allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_hidden:{type:l.DataTypes.BOOLEAN,allowNull:!1},login_name:{type:l.DataTypes.STRING(32),allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!0},password:{type:l.DataTypes.STRING(256),allowNull:!1},user_source:{type:l.DataTypes.INTEGER,allowNull:!1},user_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"users",schema:"dbo",timestamps:!1,indexes:[{name:"PK__users__3213E83F4F70944B",unique:!0,fields:[{name:"id"}]},{name:"UX_users_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.User=s},2522:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{o(l.next(e))}catch(e){n(e)}}function r(e){try{o(l.throw(e))}catch(e){n(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,r)}o((l=l.apply(e,t||[])).next())}))},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.GeneXpertClient=void 0;const n=s(a(2245)),i=a(9634),r=a(496),o=a(7306),u=a(5662),d="YYYY/MM/DD HH:mm:ss.SSS";t.GeneXpertClient=class{constructor(e,t,a,l){this.version=e,this.sequelize=(0,o.createSequelize)(t,a,l),this.models=(0,u.initModels)(this.sequelize)}logsTotal(){return this.models.SystemLog.count()}testsTotal(){return this.models.Test.count({include:[{as:"test_data",model:this.models.TestDatum,where:{state:{[r.Op.ne]:1}},required:!0}]})}systemInfo(){const e=this.sequelize.query("\n          SELECT\n            MAX(sw_version) as [sw_version],\n            [system_log].[site_serial_number],\n            [system_log].[site_name],\n            MAX([instrument_serial_number]) as [instrument_serial_number],\n            MAX(log_time) as [log_time],\n            MIN(log_time) as [first_seen_at],\n            MAX([disabled_module].[creation_time]) as [disabled_at]\n          FROM [dbo].[system_log]\n            LEFT JOIN [dbo].[disabled_module]\n            ON [dbo].[disabled_module].[site_serial_number] = [dbo].[system_log].[site_serial_number]\n          GROUP BY [site_name], [system_log].[site_serial_number]\n          ORDER BY log_time DESC\n        ").then((([e])=>e)),t=this.models.Config.findAll().then((e=>e.map((e=>({[e.param_key]:e.param_val}))))).then(i.mergeAll);return Promise.all([e,t]).then((e=>(0,o.toSystemInfo)(...e)))}testsPresyncables(e,t,a){return this.models.Test.findAll({where:{[r.Op.or]:[{order_time:{[r.Op.lt]:(0,n.default)().subtract(1,"hour").toDate()},modification_time:{[r.Op.gt]:e}},{order_time:{[r.Op.lt]:(0,n.default)().subtract(1,"hour").toDate()},modification_time:{[r.Op.eq]:e},id:{[r.Op.notIn]:t}}]},order:[["modification_time","DESC"]],limit:a}).then((e=>e.map((({id:e,modification_time:t})=>({id:e.toString(),modified:t})))))}testsSyncables(e){return this.models.Test.findAll({where:{id:{[r.Op.in]:e}},include:[{as:"test_data",model:this.models.TestDatum},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]}},{as:"user",model:this.models.User},{as:"test_errors",model:this.models.TestError},{as:"patient",model:this.models.Patient},{as:"analyte_results",model:this.models.AnalyteResult,include:[{as:"analyte",model:this.models.Analyte},{as:"channel_processed_data_items",model:this.models.ChannelProcessedDataItem}]},{as:"organism_results",model:this.models.OrganismResult,include:[{as:"organism",model:this.models.Organism},{as:"organism_based_organism_result",model:this.models.OrganismBasedOrganismResult}]}]}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}testsForEntry(e,t){return this.models.Test.findAll({where:{sample_id:{[r.Op.notIn]:e}},include:[{as:"test_data",model:this.models.TestDatum,where:{start_time:{[r.Op.gte]:(0,n.default)().subtract(t||o.hoursForDataEntry,"hours").toDate()}}},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[r.Op.in]:o.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>({id:e.id,assay:e.assay.name,endedAt:e.test_data.end_time,sampleId:e.sample_id,startedAt:e.test_data.start_time})))))}logsPresyncables(e,t,a){return this.models.SystemLog.findAll({where:{[r.Op.or]:[{log_time:{[r.Op.gt]:e}},{log_time:{[r.Op.eq]:e},id:{[r.Op.notIn]:t}}]},limit:a,attributes:["id","log_time"],order:[["log_time","ASC"]]}).then((e=>e.map((({id:e,log_time:t})=>({id:e.toString(),modified:t})))))}logsSyncables(e){return this.models.SystemLog.findAll({where:{id:{[r.Op.in]:e}}}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}close(){return this.sequelize.close()}getTest(e){var t,a,s;return l(this,void 0,void 0,(function*(){const l=yield this.models.Test.findOne({where:{sample_id:{[r.Op.eq]:e}},include:[{as:"test_data",model:this.models.TestDatum}]});return{dataValues:Object.assign(Object.assign({},null==l?void 0:l.dataValues),{end_time:null===(a=null===(t=null==l?void 0:l.dataValues)||void 0===t?void 0:t.test_data)||void 0===a?void 0:a.end_time,sampleId:null===(s=null==l?void 0:l.dataValues)||void 0===s?void 0:s.sample_id})}}))}getTestsByTestIds(e){return this.models.Test.findAll({where:{id:{[r.Op.in]:e}},include:[{as:"test_data",model:this.models.TestDatum},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[r.Op.in]:o.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>({id:e.id,assay:e.assay.name,endedAt:e.test_data.end_time,sampleId:e.sample_id,startedAt:e.test_data.start_time})))))}getCompletedTestsBySampleIds(e){return this.models.Test.findAll({where:{sample_id:{[r.Op.in]:e},modification_time:{[r.Op.and]:[{[r.Op.not]:null},{[r.Op.between]:[(0,n.default)().subtract(o.LAB_RESULT_APPROVAL_DEADLINE_HOURS,"hours").format(d),(0,n.default)().format(d)]}]},result_text:{[r.Op.not]:null}},include:[{as:"test_data",model:this.models.TestDatum},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[r.Op.in]:o.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t,a,l,s,i;return{id:e.id,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(null!==(l=null===(a=null==e?void 0:e.test_data)||void 0===a?void 0:a.end_time)&&void 0!==l?l:null==e?void 0:e.modification_time,d).toDate(),sampleId:e.sample_id,startedAt:(0,n.default)(null!==(i=null===(s=null==e?void 0:e.test_data)||void 0===s?void 0:s.start_time)&&void 0!==i?i:null==e?void 0:e.order_time,d).toDate()}}))))}}},9057:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AnalyteResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AnalyteResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}}},{tableName:"analyte_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_analyte_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__analyte___3213E83ECDC2EDFE",unique:!0,fields:[{name:"id"}]}]})}}t.AnalyteResult=s},3363:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Analyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Analyte",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},analyte_index:{type:l.DataTypes.INTEGER,allowNull:!1},background_end:{type:l.DataTypes.INTEGER,allowNull:!1},background_look_back:{type:l.DataTypes.INTEGER,allowNull:!1},background_max_rms_error:{type:l.DataTypes.FLOAT,allowNull:!0},background_max_slope:{type:l.DataTypes.FLOAT,allowNull:!0},background_min_points:{type:l.DataTypes.INTEGER,allowNull:!1},background_start:{type:l.DataTypes.INTEGER,allowNull:!1},boxcar_cycles:{type:l.DataTypes.INTEGER,allowNull:!1},curve_analysis:{type:l.DataTypes.INTEGER,allowNull:!1},curve_fit_end_index:{type:l.DataTypes.INTEGER,allowNull:!0},curve_fit_max_nrse:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_slope_vs_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_min_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_start_index:{type:l.DataTypes.INTEGER,allowNull:!0},intended_concentration:{type:l.DataTypes.FLOAT,allowNull:!1},invalid_bias:{type:l.DataTypes.INTEGER,allowNull:!1},is_signal_loss_detection_enabled:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_probe_check_use_delta_pc:{type:l.DataTypes.BOOLEAN,allowNull:!1},name:{type:l.DataTypes.STRING(20),allowNull:!1},probe_check_max_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_min_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},reporter_name:{type:l.DataTypes.STRING(12),allowNull:!1},target:{type:l.DataTypes.BLOB,allowNull:!0},use_curve_fit:{type:l.DataTypes.BOOLEAN,allowNull:!1},use_curve_fit_end_data:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_curve_fit_on_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_curve_fit_start_background:{type:l.DataTypes.BOOLEAN,allowNull:!0},usage:{type:l.DataTypes.INTEGER,allowNull:!1},use_background_validation:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"analyte",schema:"dbo",timestamps:!1,indexes:[{name:"PK__analyte__3213E83FA63374DD",unique:!0,fields:[{name:"id"}]}]})}}t.Analyte=s},3133:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayChamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayChamber",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge",key:"id"}},chamber_number:{type:l.DataTypes.INTEGER,allowNull:!1},initial_volume:{type:l.DataTypes.INTEGER,allowNull:!1},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!1},name:{type:l.DataTypes.STRING(16),allowNull:!1}},{tableName:"assay_chamber",schema:"dbo",timestamps:!1,indexes:[{name:"PK__assay_ch__3213E83FBA29C6D8",unique:!0,fields:[{name:"id"}]}]})}}t.AssayChamber=s},5083:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayPosition=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayPosition",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},position:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"assay_position",schema:"dbo",timestamps:!1,indexes:[{name:"PK__assay_po__3213E83F9ED37278",unique:!0,fields:[{name:"id"}]}]})}}t.AssayPosition=s},6570:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Assay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Assay",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}},assay_index:{type:l.DataTypes.INTEGER,allowNull:!0},result_text_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_lock_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_version:{type:l.DataTypes.INTEGER,allowNull:!0},command_bytes:{type:l.DataTypes.BLOB,allowNull:!0},command_sequence_format:{type:l.DataTypes.INTEGER,allowNull:!0},comments:{type:l.DataTypes.STRING(4e3),allowNull:!0},company_code:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},data_reduction_algorithm:{type:l.DataTypes.INTEGER,allowNull:!0},default_result_text_index:{type:l.DataTypes.INTEGER,allowNull:!0},default_text_color_reference:{type:l.DataTypes.INTEGER,allowNull:!0},disclaimer:{type:l.DataTypes.STRING(4e3),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!0},is_clia_waived:{type:l.DataTypes.BOOLEAN,allowNull:!0},lock_comments:{type:l.DataTypes.STRING(4e3),allowNull:!0},lock_time:{type:l.DataTypes.DATE,allowNull:!0},modification_time:{type:l.DataTypes.DATE,allowNull:!0},name:{type:l.DataTypes.STRING(32),allowNull:!1},need_lsp:{type:l.DataTypes.BOOLEAN,allowNull:!0},picture:{type:l.DataTypes.BLOB,allowNull:!0},prep_cartridge_shelf_life:{type:l.DataTypes.INTEGER,allowNull:!0},product_code:{type:l.DataTypes.INTEGER,allowNull:!0},sample_prep_instruction:{type:l.DataTypes.STRING(256),allowNull:!0},sample_prep_video:{type:l.DataTypes.BLOB,allowNull:!0},use_background_subtraction:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_melt_all_peaks:{type:l.DataTypes.BOOLEAN,allowNull:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"users",key:"id"}}},{tableName:"assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__assay__3213E83F2029E23F",unique:!0,fields:[{name:"id"}]},{name:"UX_assay_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.Assay=s},8804:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BasicOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("BasicOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}}},{tableName:"basic_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__basic_or__3213E83F330C3338",unique:!0,fields:[{name:"id"}]}]})}}t.BasicOrganism=s},3642:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CartridgeType=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CartridgeType",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},adc_2_psi:{type:l.DataTypes.FLOAT,allowNull:!1},air_chamber:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_foot_height:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_version:{type:l.DataTypes.INTEGER,allowNull:!1},creation_time:{type:l.DataTypes.DATE,allowNull:!1},direct_flow_rate_max:{type:l.DataTypes.FLOAT,allowNull:!1},direct_flow_rate_min:{type:l.DataTypes.FLOAT,allowNull:!1},direct_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},filter_flow_rate_max:{type:l.DataTypes.FLOAT,allowNull:!1},filter_flow_rate_min:{type:l.DataTypes.FLOAT,allowNull:!1},filter_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},initial_aspirate_flow_rate:{type:l.DataTypes.FLOAT,allowNull:!1},initial_aspirate_volume:{type:l.DataTypes.INTEGER,allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},max_pressure:{type:l.DataTypes.INTEGER,allowNull:!1},microliters_per_revolution:{type:l.DataTypes.FLOAT,allowNull:!1},min_pressure:{type:l.DataTypes.INTEGER,allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1},overflow_chamber:{type:l.DataTypes.INTEGER,allowNull:!1},picture:{type:l.DataTypes.BLOB,allowNull:!0},plunger_pickup_position:{type:l.DataTypes.INTEGER,allowNull:!1},plunger_strip_position:{type:l.DataTypes.INTEGER,allowNull:!1},syringe_max_transfer_volume:{type:l.DataTypes.INTEGER,allowNull:!1},syringe_max_volume:{type:l.DataTypes.INTEGER,allowNull:!1},syringe_min_transfer_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_chamber_number:{type:l.DataTypes.INTEGER,allowNull:!1},tube_chamber_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_pressurized_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_syringe_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_volume:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"cartridge_type",schema:"dbo",timestamps:!1,indexes:[{name:"PK__cartridg__3213E83F8C4F3852",unique:!0,fields:[{name:"id"}]},{name:"UX_cartridgetype_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.CartridgeType=s},3406:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Cartridge=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Cartridge",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},air_chamber:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_type_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge_type",key:"id"}},overflow_chamber:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"cartridge",schema:"dbo",timestamps:!1,indexes:[{name:"PK__cartridg__3213E83F250C10B7",unique:!0,fields:[{name:"id"}]}]})}}t.Cartridge=s},9909:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Chamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Chamber",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge_type",key:"id"}},chamber_number:{type:l.DataTypes.INTEGER,allowNull:!1},max_volume:{type:l.DataTypes.INTEGER,allowNull:!1},min_volume:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"chamber",schema:"dbo",timestamps:!1,indexes:[{name:"PK__chamber__3213E83F4AB9898B",unique:!0,fields:[{name:"id"}]}]})}}t.Chamber=s},3465:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ChannelProcessedDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ChannelProcessedDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte_result",key:"id"}},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"channel_processed_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_channel_processed_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__channel___3213E83ED0788519",unique:!0,fields:[{name:"id"}]}]})}}t.ChannelProcessedDataItem=s},2637:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ChannelRawDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ChannelRawDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"channel_raw_data",key:"id"}},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0},timestamps:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"channel_raw_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_channel_raw_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__channel___3213E83EC0F7CD0A",unique:!0,fields:[{name:"id"}]}]})}}t.ChannelRawDataItem=s},2418:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ChannelRawDatum=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ChannelRawDatum",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test_data",key:"id"}},protocol_number:{type:l.DataTypes.INTEGER,allowNull:!1},channel_name:{type:l.DataTypes.STRING(32),allowNull:!1}},{tableName:"channel_raw_data",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_channel_raw_data_parent_id",fields:[{name:"parent_id"}]},{name:"PK__channel___3213E83EC68CD172",unique:!0,fields:[{name:"id"}]}]})}}t.ChannelRawDatum=s},3258:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorDisclaimer=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ColorDisclaimer",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},color:{type:l.DataTypes.INTEGER,allowNull:!1},disclaimer:{type:l.DataTypes.STRING(256),allowNull:!0}},{tableName:"color_disclaimer",schema:"dbo",timestamps:!1,indexes:[{name:"PK__color_di__3213E83F654A7801",unique:!0,fields:[{name:"id"}]}]})}}t.ColorDisclaimer=s},8949:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Config",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},param_key:{type:l.DataTypes.STRING(64),allowNull:!0},param_val:{type:l.DataTypes.STRING(512),allowNull:!0}},{tableName:"config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__config__3213E83FB24EFCAC",unique:!0,fields:[{name:"id"}]},{name:"UX_config_paramkey",unique:!0,fields:[{name:"param_key"}]}]})}}t.Config=s},5479:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CrosstalkCorrResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CrosstalkCorrResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte_result",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte",key:"id"}},protocol_index:{type:l.DataTypes.INTEGER,allowNull:!1},ignore_code:{type:l.DataTypes.STRING(64),allowNull:!1},correlation_slope:{type:l.DataTypes.FLOAT,allowNull:!0},correlation_r2:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"crosstalk_corr_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_crosstalk_corr_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__crosstal__3213E83E924D6078",unique:!0,fields:[{name:"id"}]}]})}}t.CrosstalkCorrResult=s},9171:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DeltaCtOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("DeltaCtOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"basic_organism",key:"id"}},delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!1},delta_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"delta_ct_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__delta_ct__3213E83FE042FFFC",unique:!0,fields:[{name:"id"}]}]})}}t.DeltaCtOrganism=s},606:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DisabledModule=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("DisabledModule",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!1},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!1},user_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"users",key:"id"}}},{tableName:"disabled_module",schema:"dbo",timestamps:!1,indexes:[{name:"PK__disabled__3213E83F96810815",unique:!0,fields:[{name:"id"}]},{name:"UX_disabledmodule_siteserialnumber",unique:!0,fields:[{name:"site_serial_number"}]}]})}}t.DisabledModule=s},1903:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingAssay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"genotyping_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__3213E83F7C84A87B",unique:!0,fields:[{name:"id"}]}]})}}t.GenotypingAssay=s},5738:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingHaplotypeOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingHaplotypeOrganism",{haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"haplotype",key:"id"}},genotyping_organism_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"genotyping_organism",key:"id"}}},{tableName:"genotyping_haplotype_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__060A713D88EAF29B",unique:!0,fields:[{name:"haplotype_id"},{name:"genotyping_organism_id"}]},{name:"UX_gho_haplotypeid_genotypingorganismid",unique:!0,fields:[{name:"haplotype_id"},{name:"genotyping_organism_id"}]}]})}}t.GenotypingHaplotypeOrganism=s},7676:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}}},{tableName:"genotyping_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__3213E83F71AF25E1",unique:!0,fields:[{name:"id"}]}]})}}t.GenotypingOrganismResult=s},3722:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},early_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!1},late_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"genotyping_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__3213E83F13741DD0",unique:!0,fields:[{name:"id"}]}]})}}t.GenotypingOrganism=s},8378:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetupAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetupAssay",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},graph_setup_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"graph_setup",key:"id"}},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}}},{tableName:"graph_setup_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__graph_se__3213E83FB241A5B9",unique:!0,fields:[{name:"id"}]},{name:"UX_graphsetupassay_graphsetupid_assayid",unique:!0,fields:[{name:"graph_setup_id"},{name:"assay_id"}]}]})}}t.GraphSetupAssay=s},3017:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetup",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_default:{type:l.DataTypes.BOOLEAN,allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1},pos:{type:l.DataTypes.INTEGER,allowNull:!1},settings:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__graph_se__3213E83F6ADA0B5A",unique:!0,fields:[{name:"id"}]},{name:"UX_graphsetup_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.GraphSetup=s},4359:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.HaplotypeResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("HaplotypeResultText",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"haplotype",key:"id"}},alleles_text1:{type:l.DataTypes.STRING(10),allowNull:!1},alleles_text2:{type:l.DataTypes.STRING(10),allowNull:!1},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(11),allowNull:!1},text_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"haplotype_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK__haplotyp__3213E83FC0009034",unique:!0,fields:[{name:"id"}]}]})}}t.HaplotypeResultText=s},2428:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.HaplotypeResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("HaplotypeResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"haplotype",key:"id"}},allele1_text:{type:l.DataTypes.TEXT,allowNull:!1},allele2_text:{type:l.DataTypes.TEXT,allowNull:!1},result_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"haplotype_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_haplotype_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__haplotyp__3213E83EDA363883",unique:!0,fields:[{name:"id"}]}]})}}t.HaplotypeResult=s},4997:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Haplotype=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Haplotype",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"genotyping_assay",key:"id"}},haplotype_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(20),allowNull:!1}},{tableName:"haplotype",schema:"dbo",timestamps:!1,indexes:[{name:"PK__haplotyp__3213E83F6E1A2AB7",unique:!0,fields:[{name:"id"}]}]})}}t.Haplotype=s},5662:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioOrganism=t.PercentRatioAssay=t.Patient=t.Path=t.OrganismTarget=t.OrganismResultText=t.OrganismResult=t.OrganismBasedOrganismResult=t.OrganismBasedAssay=t.Organism=t.MeltPeakSetting=t.MeltPeakResult=t.LisUpload=t.LisTestOrder=t.LisOrganismConfig=t.LisHaplotypeConfig=t.LisGenotypingAssayConfig=t.LisAssayConfig=t.LdaOrganismResult=t.LdaOrganism=t.LdaCoefficient=t.LdaAssay=t.LdaAnalyte=t.Instrument=t.HaplotypeResultText=t.HaplotypeResult=t.Haplotype=t.GraphSetupAssay=t.GraphSetup=t.GenotypingOrganismResult=t.GenotypingOrganism=t.GenotypingHaplotypeOrganism=t.GenotypingAssay=t.DisabledModule=t.DeltaCtOrganism=t.CrosstalkCorrResult=t.Config=t.ColorDisclaimer=t.ChannelRawDataItem=t.ChannelRawDatum=t.ChannelProcessedDataItem=t.Chamber=t.CartridgeType=t.Cartridge=t.BasicOrganism=t.AssayPosition=t.AssayChamber=t.Assay=t.AnalyteResult=t.Analyte=void 0,t.initModels=t.User=t.UserPrivilege=t.TestNv=t.TestHistory=t.TestError=t.TestDataError=t.TestDatum=t.TestBlogCounter=t.TestBlog=t.Test=t.TargetBasedOrganism=t.TargetBasedAssay=t.SystemLog=t.SemiQuantOrganism=t.SelectedQuantUnitSetting=t.SampleType=t.SampleSetting=t.ResultRuleMeltPeak=t.ResultRuleInterpretation=t.ResultRuleAnalyte=t.ResultEvaluator=t.ResultCalculation=t.Reporter=t.ReportGraphSetting=t.ReagentLot=t.RawDataItem=t.QuantUnitSetting=t.Quant1SampleSetting=t.Quant1Result=t.Quant1ReagentLot=t.Quant1OrganismResult=t.Quant1Organism=t.Quant1Assay=t.PercentRatioSampleSetting=t.PercentRatioResultEvaluator=t.PercentRatioReagentLot=t.PercentRatioOrganismResult=void 0;const l=a(3363);Object.defineProperty(t,"Analyte",{enumerable:!0,get:function(){return l.Analyte}});const s=a(9057);Object.defineProperty(t,"AnalyteResult",{enumerable:!0,get:function(){return s.AnalyteResult}});const n=a(6570);Object.defineProperty(t,"Assay",{enumerable:!0,get:function(){return n.Assay}});const i=a(3133);Object.defineProperty(t,"AssayChamber",{enumerable:!0,get:function(){return i.AssayChamber}});const r=a(5083);Object.defineProperty(t,"AssayPosition",{enumerable:!0,get:function(){return r.AssayPosition}});const o=a(8804);Object.defineProperty(t,"BasicOrganism",{enumerable:!0,get:function(){return o.BasicOrganism}});const u=a(3406);Object.defineProperty(t,"Cartridge",{enumerable:!0,get:function(){return u.Cartridge}});const d=a(3642);Object.defineProperty(t,"CartridgeType",{enumerable:!0,get:function(){return d.CartridgeType}});const p=a(9909);Object.defineProperty(t,"Chamber",{enumerable:!0,get:function(){return p.Chamber}});const y=a(3465);Object.defineProperty(t,"ChannelProcessedDataItem",{enumerable:!0,get:function(){return y.ChannelProcessedDataItem}});const c=a(2418);Object.defineProperty(t,"ChannelRawDatum",{enumerable:!0,get:function(){return c.ChannelRawDatum}});const _=a(2637);Object.defineProperty(t,"ChannelRawDataItem",{enumerable:!0,get:function(){return _.ChannelRawDataItem}});const m=a(3258);Object.defineProperty(t,"ColorDisclaimer",{enumerable:!0,get:function(){return m.ColorDisclaimer}});const T=a(8949);Object.defineProperty(t,"Config",{enumerable:!0,get:function(){return T.Config}});const N=a(5479);Object.defineProperty(t,"CrosstalkCorrResult",{enumerable:!0,get:function(){return N.CrosstalkCorrResult}});const g=a(9171);Object.defineProperty(t,"DeltaCtOrganism",{enumerable:!0,get:function(){return g.DeltaCtOrganism}});const f=a(606);Object.defineProperty(t,"DisabledModule",{enumerable:!0,get:function(){return f.DisabledModule}});const D=a(1903);Object.defineProperty(t,"GenotypingAssay",{enumerable:!0,get:function(){return D.GenotypingAssay}});const E=a(5738);Object.defineProperty(t,"GenotypingHaplotypeOrganism",{enumerable:!0,get:function(){return E.GenotypingHaplotypeOrganism}});const b=a(3722);Object.defineProperty(t,"GenotypingOrganism",{enumerable:!0,get:function(){return b.GenotypingOrganism}});const w=a(7676);Object.defineProperty(t,"GenotypingOrganismResult",{enumerable:!0,get:function(){return w.GenotypingOrganismResult}});const I=a(3017);Object.defineProperty(t,"GraphSetup",{enumerable:!0,get:function(){return I.GraphSetup}});const R=a(8378);Object.defineProperty(t,"GraphSetupAssay",{enumerable:!0,get:function(){return R.GraphSetupAssay}});const O=a(4997);Object.defineProperty(t,"Haplotype",{enumerable:!0,get:function(){return O.Haplotype}});const h=a(2428);Object.defineProperty(t,"HaplotypeResult",{enumerable:!0,get:function(){return h.HaplotypeResult}});const M=a(4359);Object.defineProperty(t,"HaplotypeResultText",{enumerable:!0,get:function(){return M.HaplotypeResultText}});const v=a(7324);Object.defineProperty(t,"Instrument",{enumerable:!0,get:function(){return v.Instrument}});const G=a(2673);Object.defineProperty(t,"LdaAnalyte",{enumerable:!0,get:function(){return G.LdaAnalyte}});const A=a(7425);Object.defineProperty(t,"LdaAssay",{enumerable:!0,get:function(){return A.LdaAssay}});const S=a(5710);Object.defineProperty(t,"LdaCoefficient",{enumerable:!0,get:function(){return S.LdaCoefficient}});const P=a(7110);Object.defineProperty(t,"LdaOrganism",{enumerable:!0,get:function(){return P.LdaOrganism}});const L=a(4741);Object.defineProperty(t,"LdaOrganismResult",{enumerable:!0,get:function(){return L.LdaOrganismResult}});const x=a(3179);Object.defineProperty(t,"LisAssayConfig",{enumerable:!0,get:function(){return x.LisAssayConfig}});const C=a(4810);Object.defineProperty(t,"LisGenotypingAssayConfig",{enumerable:!0,get:function(){return C.LisGenotypingAssayConfig}});const K=a(1219);Object.defineProperty(t,"LisHaplotypeConfig",{enumerable:!0,get:function(){return K.LisHaplotypeConfig}});const j=a(2855);Object.defineProperty(t,"LisOrganismConfig",{enumerable:!0,get:function(){return j.LisOrganismConfig}});const q=a(7519);Object.defineProperty(t,"LisTestOrder",{enumerable:!0,get:function(){return q.LisTestOrder}});const k=a(8608);Object.defineProperty(t,"LisUpload",{enumerable:!0,get:function(){return k.LisUpload}});const F=a(4298);Object.defineProperty(t,"MeltPeakResult",{enumerable:!0,get:function(){return F.MeltPeakResult}});const B=a(630);Object.defineProperty(t,"MeltPeakSetting",{enumerable:!0,get:function(){return B.MeltPeakSetting}});const H=a(8374);Object.defineProperty(t,"Organism",{enumerable:!0,get:function(){return H.Organism}});const V=a(7883);Object.defineProperty(t,"OrganismBasedAssay",{enumerable:!0,get:function(){return V.OrganismBasedAssay}});const U=a(1122);Object.defineProperty(t,"OrganismBasedOrganismResult",{enumerable:!0,get:function(){return U.OrganismBasedOrganismResult}});const Q=a(9668);Object.defineProperty(t,"OrganismResult",{enumerable:!0,get:function(){return Q.OrganismResult}});const X=a(6321);Object.defineProperty(t,"OrganismResultText",{enumerable:!0,get:function(){return X.OrganismResultText}});const z=a(8476);Object.defineProperty(t,"OrganismTarget",{enumerable:!0,get:function(){return z.OrganismTarget}});const Y=a(5828);Object.defineProperty(t,"Path",{enumerable:!0,get:function(){return Y.Path}});const $=a(3708);Object.defineProperty(t,"Patient",{enumerable:!0,get:function(){return $.Patient}});const J=a(9913);Object.defineProperty(t,"PercentRatioAssay",{enumerable:!0,get:function(){return J.PercentRatioAssay}});const W=a(2232);Object.defineProperty(t,"PercentRatioOrganism",{enumerable:!0,get:function(){return W.PercentRatioOrganism}});const Z=a(9169);Object.defineProperty(t,"PercentRatioOrganismResult",{enumerable:!0,get:function(){return Z.PercentRatioOrganismResult}});const ee=a(894);Object.defineProperty(t,"PercentRatioReagentLot",{enumerable:!0,get:function(){return ee.PercentRatioReagentLot}});const te=a(7363);Object.defineProperty(t,"PercentRatioResultEvaluator",{enumerable:!0,get:function(){return te.PercentRatioResultEvaluator}});const ae=a(2026);Object.defineProperty(t,"PercentRatioSampleSetting",{enumerable:!0,get:function(){return ae.PercentRatioSampleSetting}});const le=a(9250);Object.defineProperty(t,"Quant1Assay",{enumerable:!0,get:function(){return le.Quant1Assay}});const se=a(3739);Object.defineProperty(t,"Quant1Organism",{enumerable:!0,get:function(){return se.Quant1Organism}});const ne=a(5021);Object.defineProperty(t,"Quant1OrganismResult",{enumerable:!0,get:function(){return ne.Quant1OrganismResult}});const ie=a(6693);Object.defineProperty(t,"Quant1ReagentLot",{enumerable:!0,get:function(){return ie.Quant1ReagentLot}});const re=a(2949);Object.defineProperty(t,"Quant1Result",{enumerable:!0,get:function(){return re.Quant1Result}});const oe=a(3664);Object.defineProperty(t,"Quant1SampleSetting",{enumerable:!0,get:function(){return oe.Quant1SampleSetting}});const ue=a(1747);Object.defineProperty(t,"QuantUnitSetting",{enumerable:!0,get:function(){return ue.QuantUnitSetting}});const de=a(8090);Object.defineProperty(t,"RawDataItem",{enumerable:!0,get:function(){return de.RawDataItem}});const pe=a(8323);Object.defineProperty(t,"ReagentLot",{enumerable:!0,get:function(){return pe.ReagentLot}});const ye=a(771);Object.defineProperty(t,"ReportGraphSetting",{enumerable:!0,get:function(){return ye.ReportGraphSetting}});const ce=a(200);Object.defineProperty(t,"Reporter",{enumerable:!0,get:function(){return ce.Reporter}});const _e=a(4829);Object.defineProperty(t,"ResultCalculation",{enumerable:!0,get:function(){return _e.ResultCalculation}});const me=a(1452);Object.defineProperty(t,"ResultEvaluator",{enumerable:!0,get:function(){return me.ResultEvaluator}});const Te=a(1093);Object.defineProperty(t,"ResultRuleAnalyte",{enumerable:!0,get:function(){return Te.ResultRuleAnalyte}});const Ne=a(3271);Object.defineProperty(t,"ResultRuleInterpretation",{enumerable:!0,get:function(){return Ne.ResultRuleInterpretation}});const ge=a(3745);Object.defineProperty(t,"ResultRuleMeltPeak",{enumerable:!0,get:function(){return ge.ResultRuleMeltPeak}});const fe=a(6709);Object.defineProperty(t,"SampleSetting",{enumerable:!0,get:function(){return fe.SampleSetting}});const De=a(8388);Object.defineProperty(t,"SampleType",{enumerable:!0,get:function(){return De.SampleType}});const Ee=a(1111);Object.defineProperty(t,"SelectedQuantUnitSetting",{enumerable:!0,get:function(){return Ee.SelectedQuantUnitSetting}});const be=a(5274);Object.defineProperty(t,"SemiQuantOrganism",{enumerable:!0,get:function(){return be.SemiQuantOrganism}});const we=a(7497);Object.defineProperty(t,"SystemLog",{enumerable:!0,get:function(){return we.SystemLog}});const Ie=a(7657);Object.defineProperty(t,"TargetBasedAssay",{enumerable:!0,get:function(){return Ie.TargetBasedAssay}});const Re=a(6344);Object.defineProperty(t,"TargetBasedOrganism",{enumerable:!0,get:function(){return Re.TargetBasedOrganism}});const Oe=a(6676);Object.defineProperty(t,"Test",{enumerable:!0,get:function(){return Oe.Test}});const he=a(806);Object.defineProperty(t,"TestBlog",{enumerable:!0,get:function(){return he.TestBlog}});const Me=a(4668);Object.defineProperty(t,"TestBlogCounter",{enumerable:!0,get:function(){return Me.TestBlogCounter}});const ve=a(4114);Object.defineProperty(t,"TestDatum",{enumerable:!0,get:function(){return ve.TestDatum}});const Ge=a(1257);Object.defineProperty(t,"TestDataError",{enumerable:!0,get:function(){return Ge.TestDataError}});const Ae=a(9067);Object.defineProperty(t,"TestError",{enumerable:!0,get:function(){return Ae.TestError}});const Se=a(7595);Object.defineProperty(t,"TestHistory",{enumerable:!0,get:function(){return Se.TestHistory}});const Pe=a(2200);Object.defineProperty(t,"TestNv",{enumerable:!0,get:function(){return Pe.TestNv}});const Le=a(8803);Object.defineProperty(t,"UserPrivilege",{enumerable:!0,get:function(){return Le.UserPrivilege}});const xe=a(9005);Object.defineProperty(t,"User",{enumerable:!0,get:function(){return xe.User}}),t.initModels=function(e){const t=l.Analyte.initModel(e),a=s.AnalyteResult.initModel(e),Ce=n.Assay.initModel(e),Ke=i.AssayChamber.initModel(e),je=r.AssayPosition.initModel(e),qe=o.BasicOrganism.initModel(e),ke=u.Cartridge.initModel(e),Fe=d.CartridgeType.initModel(e),Be=p.Chamber.initModel(e),He=y.ChannelProcessedDataItem.initModel(e),Ve=c.ChannelRawDatum.initModel(e),Ue=_.ChannelRawDataItem.initModel(e),Qe=m.ColorDisclaimer.initModel(e),Xe=T.Config.initModel(e),ze=N.CrosstalkCorrResult.initModel(e),Ye=g.DeltaCtOrganism.initModel(e),$e=f.DisabledModule.initModel(e),Je=D.GenotypingAssay.initModel(e),We=E.GenotypingHaplotypeOrganism.initModel(e),Ze=b.GenotypingOrganism.initModel(e),et=w.GenotypingOrganismResult.initModel(e),tt=I.GraphSetup.initModel(e),at=R.GraphSetupAssay.initModel(e),lt=O.Haplotype.initModel(e),st=h.HaplotypeResult.initModel(e),nt=M.HaplotypeResultText.initModel(e),it=v.Instrument.initModel(e),rt=G.LdaAnalyte.initModel(e),ot=A.LdaAssay.initModel(e),ut=S.LdaCoefficient.initModel(e),dt=P.LdaOrganism.initModel(e),pt=L.LdaOrganismResult.initModel(e),yt=x.LisAssayConfig.initModel(e),ct=C.LisGenotypingAssayConfig.initModel(e),_t=K.LisHaplotypeConfig.initModel(e),mt=j.LisOrganismConfig.initModel(e),Tt=q.LisTestOrder.initModel(e),Nt=k.LisUpload.initModel(e),gt=F.MeltPeakResult.initModel(e),ft=B.MeltPeakSetting.initModel(e),Dt=H.Organism.initModel(e),Et=V.OrganismBasedAssay.initModel(e),bt=U.OrganismBasedOrganismResult.initModel(e),wt=Q.OrganismResult.initModel(e),It=X.OrganismResultText.initModel(e),Rt=z.OrganismTarget.initModel(e),Ot=Y.Path.initModel(e),ht=$.Patient.initModel(e),Mt=J.PercentRatioAssay.initModel(e),vt=W.PercentRatioOrganism.initModel(e),Gt=Z.PercentRatioOrganismResult.initModel(e),At=ee.PercentRatioReagentLot.initModel(e),St=te.PercentRatioResultEvaluator.initModel(e),Pt=ae.PercentRatioSampleSetting.initModel(e),Lt=le.Quant1Assay.initModel(e),xt=se.Quant1Organism.initModel(e),Ct=ne.Quant1OrganismResult.initModel(e),Kt=ie.Quant1ReagentLot.initModel(e),jt=re.Quant1Result.initModel(e),qt=oe.Quant1SampleSetting.initModel(e),kt=ue.QuantUnitSetting.initModel(e),Ft=de.RawDataItem.initModel(e),Bt=pe.ReagentLot.initModel(e),Ht=ye.ReportGraphSetting.initModel(e),Vt=ce.Reporter.initModel(e),Ut=_e.ResultCalculation.initModel(e),Qt=me.ResultEvaluator.initModel(e),Xt=Te.ResultRuleAnalyte.initModel(e),zt=Ne.ResultRuleInterpretation.initModel(e),Yt=ge.ResultRuleMeltPeak.initModel(e),$t=fe.SampleSetting.initModel(e),Jt=De.SampleType.initModel(e),Wt=Ee.SelectedQuantUnitSetting.initModel(e),Zt=be.SemiQuantOrganism.initModel(e),ea=we.SystemLog.initModel(e),ta=Ie.TargetBasedAssay.initModel(e),aa=Re.TargetBasedOrganism.initModel(e),la=Oe.Test.initModel(e),sa=he.TestBlog.initModel(e),na=Me.TestBlogCounter.initModel(e),ia=ve.TestDatum.initModel(e),ra=Ge.TestDataError.initModel(e),oa=Ae.TestError.initModel(e),ua=Se.TestHistory.initModel(e),da=Pe.TestNv.initModel(e),pa=Le.UserPrivilege.initModel(e),ya=xe.User.initModel(e);return Ze.belongsToMany(lt,{as:"haplotype_id_haplotypes",through:We,foreignKey:"genotyping_organism_id",otherKey:"haplotype_id"}),lt.belongsToMany(Ze,{as:"genotyping_organism_id_genotyping_organisms",through:We,foreignKey:"haplotype_id",otherKey:"genotyping_organism_id"}),a.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(a,{as:"analyte_results",foreignKey:"analyte_id"}),ze.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(ze,{as:"crosstalk_corr_results",foreignKey:"analyte_id"}),rt.belongsTo(t,{as:"id_analyte",foreignKey:"id"}),t.hasOne(rt,{as:"lda_analyte",foreignKey:"id"}),ut.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(ut,{as:"lda_coefficients",foreignKey:"analyte_id"}),ft.belongsTo(t,{as:"parent",foreignKey:"parent_id"}),t.hasMany(ft,{as:"melt_peak_settings",foreignKey:"parent_id"}),Rt.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(Rt,{as:"organism_targets",foreignKey:"analyte_id"}),Gt.belongsTo(t,{as:"calculation_target",foreignKey:"calculation_target_id"}),t.hasMany(Gt,{as:"percent_ratio_organism_results",foreignKey:"calculation_target_id"}),Gt.belongsTo(t,{as:"reporting_target",foreignKey:"reporting_target_id"}),t.hasMany(Gt,{as:"reporting_target_percent_ratio_organism_results",foreignKey:"reporting_target_id"}),St.belongsTo(t,{as:"calculation_target",foreignKey:"calculation_target_id"}),t.hasMany(St,{as:"percent_ratio_result_evaluators",foreignKey:"calculation_target_id"}),St.belongsTo(t,{as:"reporting_target",foreignKey:"reporting_target_id"}),t.hasMany(St,{as:"reporting_target_percent_ratio_result_evaluators",foreignKey:"reporting_target_id"}),Xt.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(Xt,{as:"result_rule_analytes",foreignKey:"analyte_id"}),$t.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany($t,{as:"sample_settings",foreignKey:"analyte_id"}),He.belongsTo(a,{as:"parent",foreignKey:"parent_id"}),a.hasMany(He,{as:"channel_processed_data_items",foreignKey:"parent_id"}),ze.belongsTo(a,{as:"parent",foreignKey:"parent_id"}),a.hasMany(ze,{as:"crosstalk_corr_results",foreignKey:"parent_id"}),gt.belongsTo(a,{as:"parent",foreignKey:"parent_id"}),a.hasMany(gt,{as:"melt_peak_results",foreignKey:"parent_id"}),t.belongsTo(Ce,{as:"parent",foreignKey:"parent_id"}),Ce.hasMany(t,{as:"analytes",foreignKey:"parent_id"}),Ce.belongsTo(Ce,{as:"parent",foreignKey:"parent_id"}),Ce.hasMany(Ce,{as:"assays",foreignKey:"parent_id"}),je.belongsTo(Ce,{as:"assay",foreignKey:"assay_id"}),Ce.hasMany(je,{as:"assay_positions",foreignKey:"assay_id"}),ke.belongsTo(Ce,{as:"parent",foreignKey:"parent_id"}),Ce.hasMany(ke,{as:"cartridges",foreignKey:"parent_id"}),Qe.belongsTo(Ce,{as:"parent",foreignKey:"parent_id"}),Ce.hasMany(Qe,{as:"color_disclaimers",foreignKey:"parent_id"}),Je.belongsTo(Ce,{as:"id_assay",foreignKey:"id"}),Ce.hasOne(Je,{as:"genotyping_assay",foreignKey:"id"}),at.belongsTo(Ce,{as:"assay",foreignKey:"assay_id"}),Ce.hasMany(at,{as:"graph_setup_assays",foreignKey:"assay_id"}),ot.belongsTo(Ce,{as:"id_assay",foreignKey:"id"}),Ce.hasOne(ot,{as:"lda_assay",foreignKey:"id"}),yt.belongsTo(Ce,{as:"assay",foreignKey:"assay_id"}),Ce.hasMany(yt,{as:"lis_assay_configs",foreignKey:"assay_id"}),Dt.belongsTo(Ce,{as:"parent",foreignKey:"parent_id"}),Ce.hasMany(Dt,{as:"organisms",foreignKey:"parent_id"}),Et.belongsTo(Ce,{as:"id_assay",foreignKey:"id"}),Ce.hasOne(Et,{as:"organism_based_assay",foreignKey:"id"}),Mt.belongsTo(Ce,{as:"id_assay",foreignKey:"id"}),Ce.hasOne(Mt,{as:"percent_ratio_assay",foreignKey:"id"}),Lt.belongsTo(Ce,{as:"id_assay",foreignKey:"id"}),Ce.hasOne(Lt,{as:"quant1_assay",foreignKey:"id"}),Bt.belongsTo(Ce,{as:"parent",foreignKey:"parent_id"}),Ce.hasMany(Bt,{as:"reagent_lots",foreignKey:"parent_id"}),Ht.belongsTo(Ce,{as:"assay",foreignKey:"assay_id"}),Ce.hasMany(Ht,{as:"report_graph_settings",foreignKey:"assay_id"}),Ut.belongsTo(Ce,{as:"parent",foreignKey:"parent_id"}),Ce.hasMany(Ut,{as:"result_calculations",foreignKey:"parent_id"}),Jt.belongsTo(Ce,{as:"parent",foreignKey:"parent_id"}),Ce.hasMany(Jt,{as:"sample_types",foreignKey:"parent_id"}),Wt.belongsTo(Ce,{as:"assay",foreignKey:"assay_id"}),Ce.hasMany(Wt,{as:"selected_quant_unit_settings",foreignKey:"assay_id"}),ta.belongsTo(Ce,{as:"id_assay",foreignKey:"id"}),Ce.hasOne(ta,{as:"target_based_assay",foreignKey:"id"}),la.belongsTo(Ce,{as:"assay",foreignKey:"assay_id"}),Ce.hasMany(la,{as:"tests",foreignKey:"assay_id"}),sa.belongsTo(Ce,{as:"assay",foreignKey:"assay_id"}),Ce.hasMany(sa,{as:"test_blogs",foreignKey:"assay_id"}),Ye.belongsTo(qe,{as:"id_basic_organism",foreignKey:"id"}),qe.hasOne(Ye,{as:"delta_ct_organism",foreignKey:"id"}),Zt.belongsTo(qe,{as:"id_basic_organism",foreignKey:"id"}),qe.hasOne(Zt,{as:"semi_quant_organism",foreignKey:"id"}),Ke.belongsTo(ke,{as:"parent",foreignKey:"parent_id"}),ke.hasMany(Ke,{as:"assay_chambers",foreignKey:"parent_id"}),ke.belongsTo(Fe,{as:"cartridge_type",foreignKey:"cartridge_type_id"}),Fe.hasMany(ke,{as:"cartridges",foreignKey:"cartridge_type_id"}),Be.belongsTo(Fe,{as:"parent",foreignKey:"parent_id"}),Fe.hasMany(Be,{as:"chambers",foreignKey:"parent_id"}),Ot.belongsTo(Fe,{as:"parent",foreignKey:"parent_id"}),Fe.hasMany(Ot,{as:"paths",foreignKey:"parent_id"}),Ue.belongsTo(Ve,{as:"parent",foreignKey:"parent_id"}),Ve.hasMany(Ue,{as:"channel_raw_data_items",foreignKey:"parent_id"}),lt.belongsTo(Je,{as:"parent",foreignKey:"parent_id"}),Je.hasMany(lt,{as:"haplotypes",foreignKey:"parent_id"}),We.belongsTo(Ze,{as:"genotyping_organism",foreignKey:"genotyping_organism_id"}),Ze.hasMany(We,{as:"genotyping_haplotype_organisms",foreignKey:"genotyping_organism_id"}),at.belongsTo(tt,{as:"graph_setup",foreignKey:"graph_setup_id"}),tt.hasMany(at,{as:"graph_setup_assays",foreignKey:"graph_setup_id"}),We.belongsTo(lt,{as:"haplotype",foreignKey:"haplotype_id"}),lt.hasMany(We,{as:"genotyping_haplotype_organisms",foreignKey:"haplotype_id"}),st.belongsTo(lt,{as:"haplotype",foreignKey:"haplotype_id"}),lt.hasMany(st,{as:"haplotype_results",foreignKey:"haplotype_id"}),nt.belongsTo(lt,{as:"parent",foreignKey:"parent_id"}),lt.hasMany(nt,{as:"haplotype_result_texts",foreignKey:"parent_id"}),_t.belongsTo(lt,{as:"haplotype",foreignKey:"haplotype_id"}),lt.hasMany(_t,{as:"lis_haplotype_configs",foreignKey:"haplotype_id"}),ut.belongsTo(dt,{as:"parent",foreignKey:"parent_id"}),dt.hasMany(ut,{as:"lda_coefficients",foreignKey:"parent_id"}),ct.belongsTo(yt,{as:"id_lis_assay_config",foreignKey:"id"}),yt.hasOne(ct,{as:"lis_genotyping_assay_config",foreignKey:"id"}),Nt.belongsTo(Tt,{as:"test_order",foreignKey:"test_order_id"}),Tt.hasMany(Nt,{as:"lis_uploads",foreignKey:"test_order_id"}),qe.belongsTo(Dt,{as:"id_organism",foreignKey:"id"}),Dt.hasOne(qe,{as:"basic_organism",foreignKey:"id"}),Ze.belongsTo(Dt,{as:"id_organism",foreignKey:"id"}),Dt.hasOne(Ze,{as:"genotyping_organism",foreignKey:"id"}),dt.belongsTo(Dt,{as:"id_organism",foreignKey:"id"}),Dt.hasOne(dt,{as:"lda_organism",foreignKey:"id"}),mt.belongsTo(Dt,{as:"organism",foreignKey:"organism_id"}),Dt.hasMany(mt,{as:"lis_organism_configs",foreignKey:"organism_id"}),wt.belongsTo(Dt,{as:"organism",foreignKey:"organism_id"}),Dt.hasMany(wt,{as:"organism_results",foreignKey:"organism_id"}),It.belongsTo(Dt,{as:"parent",foreignKey:"parent_id"}),Dt.hasMany(It,{as:"organism_result_texts",foreignKey:"parent_id"}),Rt.belongsTo(Dt,{as:"parent",foreignKey:"parent_id"}),Dt.hasMany(Rt,{as:"organism_targets",foreignKey:"parent_id"}),vt.belongsTo(Dt,{as:"id_organism",foreignKey:"id"}),Dt.hasOne(vt,{as:"percent_ratio_organism",foreignKey:"id"}),xt.belongsTo(Dt,{as:"id_organism",foreignKey:"id"}),Dt.hasOne(xt,{as:"quant1_organism",foreignKey:"id"}),Qt.belongsTo(Dt,{as:"parent",foreignKey:"parent_id"}),Dt.hasMany(Qt,{as:"result_evaluators",foreignKey:"parent_id"}),aa.belongsTo(Dt,{as:"id_organism",foreignKey:"id"}),Dt.hasOne(aa,{as:"target_based_organism",foreignKey:"id"}),et.belongsTo(wt,{as:"id_organism_result",foreignKey:"id"}),wt.hasOne(et,{as:"genotyping_organism_result",foreignKey:"id"}),pt.belongsTo(wt,{as:"id_organism_result",foreignKey:"id"}),wt.hasOne(pt,{as:"lda_organism_result",foreignKey:"id"}),bt.belongsTo(wt,{as:"id_organism_result",foreignKey:"id"}),wt.hasOne(bt,{as:"organism_based_organism_result",foreignKey:"id"}),Gt.belongsTo(wt,{as:"id_organism_result",foreignKey:"id"}),wt.hasOne(Gt,{as:"percent_ratio_organism_result",foreignKey:"id"}),Ct.belongsTo(wt,{as:"id_organism_result",foreignKey:"id"}),wt.hasOne(Ct,{as:"quant1_organism_result",foreignKey:"id"}),Tt.belongsTo(ht,{as:"patient",foreignKey:"patient_id"}),ht.hasMany(Tt,{as:"lis_test_orders",foreignKey:"patient_id"}),la.belongsTo(ht,{as:"patient",foreignKey:"patient_id"}),ht.hasMany(la,{as:"tests",foreignKey:"patient_id"}),kt.belongsTo(xt,{as:"parent",foreignKey:"parent_id"}),xt.hasMany(kt,{as:"quant_unit_settings",foreignKey:"parent_id"}),jt.belongsTo(Ct,{as:"parent",foreignKey:"parent_id"}),Ct.hasMany(jt,{as:"quant1_results",foreignKey:"parent_id"}),jt.belongsTo(kt,{as:"quant_unit_setting",foreignKey:"quant_unit_setting_id"}),kt.hasMany(jt,{as:"quant1_results",foreignKey:"quant_unit_setting_id"}),At.belongsTo(Bt,{as:"id_reagent_lot",foreignKey:"id"}),Bt.hasOne(At,{as:"percent_ratio_reagent_lot",foreignKey:"id"}),Kt.belongsTo(Bt,{as:"id_reagent_lot",foreignKey:"id"}),Bt.hasOne(Kt,{as:"quant1_reagent_lot",foreignKey:"id"}),$t.belongsTo(Bt,{as:"parent",foreignKey:"parent_id"}),Bt.hasMany($t,{as:"sample_settings",foreignKey:"parent_id"}),Xt.belongsTo(Qt,{as:"parent",foreignKey:"parent_id"}),Qt.hasMany(Xt,{as:"result_rule_analytes",foreignKey:"parent_id"}),zt.belongsTo(Xt,{as:"id_result_rule_analyte",foreignKey:"id"}),Xt.hasOne(zt,{as:"result_rule_interpretation",foreignKey:"id"}),Yt.belongsTo(Xt,{as:"id_result_rule_analyte",foreignKey:"id"}),Xt.hasOne(Yt,{as:"result_rule_melt_peak",foreignKey:"id"}),Pt.belongsTo($t,{as:"id_sample_setting",foreignKey:"id"}),$t.hasOne(Pt,{as:"percent_ratio_sample_setting",foreignKey:"id"}),qt.belongsTo($t,{as:"id_sample_setting",foreignKey:"id"}),$t.hasOne(qt,{as:"quant1_sample_setting",foreignKey:"id"}),a.belongsTo(la,{as:"parent",foreignKey:"parent_id"}),la.hasMany(a,{as:"analyte_results",foreignKey:"parent_id"}),st.belongsTo(la,{as:"parent",foreignKey:"parent_id"}),la.hasMany(st,{as:"haplotype_results",foreignKey:"parent_id"}),Tt.belongsTo(la,{as:"test",foreignKey:"test_id"}),la.hasMany(Tt,{as:"lis_test_orders",foreignKey:"test_id"}),Nt.belongsTo(la,{as:"test",foreignKey:"test_id"}),la.hasMany(Nt,{as:"lis_uploads",foreignKey:"test_id"}),wt.belongsTo(la,{as:"parent",foreignKey:"parent_id"}),la.hasMany(wt,{as:"organism_results",foreignKey:"parent_id"}),la.belongsTo(la,{as:"parent",foreignKey:"parent_id"}),la.hasMany(la,{as:"tests",foreignKey:"parent_id"}),ia.belongsTo(la,{as:"test",foreignKey:"test_id"}),la.hasOne(ia,{as:"test_data",foreignKey:"test_id"}),oa.belongsTo(la,{as:"parent",foreignKey:"parent_id"}),la.hasMany(oa,{as:"test_errors",foreignKey:"parent_id"}),ua.belongsTo(la,{as:"parent",foreignKey:"parent_id"}),la.hasMany(ua,{as:"test_histories",foreignKey:"parent_id"}),da.belongsTo(la,{as:"test",foreignKey:"test_id"}),la.hasMany(da,{as:"test_nvs",foreignKey:"test_id"}),na.belongsTo(sa,{as:"test_blog",foreignKey:"test_blog_id"}),sa.hasMany(na,{as:"test_blog_counters",foreignKey:"test_blog_id"}),Ve.belongsTo(ia,{as:"parent",foreignKey:"parent_id"}),ia.hasMany(Ve,{as:"channel_raw_data",foreignKey:"parent_id"}),Ft.belongsTo(ia,{as:"parent",foreignKey:"parent_id"}),ia.hasMany(Ft,{as:"raw_data_items",foreignKey:"parent_id"}),ra.belongsTo(ia,{as:"parent",foreignKey:"parent_id"}),ia.hasMany(ra,{as:"test_data_errors",foreignKey:"parent_id"}),Ce.belongsTo(ya,{as:"user",foreignKey:"user_id"}),ya.hasMany(Ce,{as:"assays",foreignKey:"user_id"}),$e.belongsTo(ya,{as:"user",foreignKey:"user_id"}),ya.hasMany($e,{as:"disabled_modules",foreignKey:"user_id"}),la.belongsTo(ya,{as:"user",foreignKey:"user_id"}),ya.hasMany(la,{as:"tests",foreignKey:"user_id"}),ua.belongsTo(ya,{as:"user",foreignKey:"user_id"}),ya.hasMany(ua,{as:"test_histories",foreignKey:"user_id"}),{Analyte:t,AnalyteResult:a,Assay:Ce,AssayChamber:Ke,AssayPosition:je,BasicOrganism:qe,Cartridge:ke,CartridgeType:Fe,Chamber:Be,ChannelProcessedDataItem:He,ChannelRawDatum:Ve,ChannelRawDataItem:Ue,ColorDisclaimer:Qe,Config:Xe,CrosstalkCorrResult:ze,DeltaCtOrganism:Ye,DisabledModule:$e,GenotypingAssay:Je,GenotypingHaplotypeOrganism:We,GenotypingOrganism:Ze,GenotypingOrganismResult:et,GraphSetup:tt,GraphSetupAssay:at,Haplotype:lt,HaplotypeResult:st,HaplotypeResultText:nt,Instrument:it,LdaAnalyte:rt,LdaAssay:ot,LdaCoefficient:ut,LdaOrganism:dt,LdaOrganismResult:pt,LisAssayConfig:yt,LisGenotypingAssayConfig:ct,LisHaplotypeConfig:_t,LisOrganismConfig:mt,LisTestOrder:Tt,LisUpload:Nt,MeltPeakResult:gt,MeltPeakSetting:ft,Organism:Dt,OrganismBasedAssay:Et,OrganismBasedOrganismResult:bt,OrganismResult:wt,OrganismResultText:It,OrganismTarget:Rt,Path:Ot,Patient:ht,PercentRatioAssay:Mt,PercentRatioOrganism:vt,PercentRatioOrganismResult:Gt,PercentRatioReagentLot:At,PercentRatioResultEvaluator:St,PercentRatioSampleSetting:Pt,Quant1Assay:Lt,Quant1Organism:xt,Quant1OrganismResult:Ct,Quant1ReagentLot:Kt,Quant1Result:jt,Quant1SampleSetting:qt,QuantUnitSetting:kt,RawDataItem:Ft,ReagentLot:Bt,ReportGraphSetting:Ht,Reporter:Vt,ResultCalculation:Ut,ResultEvaluator:Qt,ResultRuleAnalyte:Xt,ResultRuleInterpretation:zt,ResultRuleMeltPeak:Yt,SampleSetting:$t,SampleType:Jt,SelectedQuantUnitSetting:Wt,SemiQuantOrganism:Zt,SystemLog:ea,TargetBasedAssay:ta,TargetBasedOrganism:aa,Test:la,TestBlog:sa,TestBlogCounter:na,TestDatum:ia,TestDataError:ra,TestError:oa,TestHistory:ua,TestNv:da,UserPrivilege:pa,User:ya}}},7324:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Instrument=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Instrument",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},mac_address:{type:l.DataTypes.BLOB,allowNull:!0},serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},letter_offset:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"instrument",schema:"dbo",timestamps:!1,indexes:[{name:"PK__instrume__3213E83F1D5A460D",unique:!0,fields:[{name:"id"}]},{name:"UX_instrument_letteroffset",unique:!0,fields:[{name:"letter_offset"}]},{name:"UX_instrument_macaddress",unique:!0,fields:[{name:"mac_address"}]},{name:"UX_instrument_serialnumber",unique:!0,fields:[{name:"serial_number"}]}]})}}t.Instrument=s},2673:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaAnalyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaAnalyte",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"analyte",key:"id"}},cycle_if_no_ct:{type:l.DataTypes.INTEGER,allowNull:!1},min_ct_req_pass_controls:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"lda_analyte",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_anal__3213E83F29F9EB12",unique:!0,fields:[{name:"id"}]}]})}}t.LdaAnalyte=s},7425:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaAssay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"lda_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_assa__3213E83F59A52308",unique:!0,fields:[{name:"id"}]}]})}}t.LdaAssay=s},5710:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaCoefficient=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaCoefficient",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"lda_organism",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!1},delta_ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"lda_coefficient",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_coef__3213E83F72D43F1D",unique:!0,fields:[{name:"id"}]}]})}}t.LdaCoefficient=s},4741:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},lda_total:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"lda_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_orga__3213E83F380F55A4",unique:!0,fields:[{name:"id"}]}]})}}t.LdaOrganismResult=s},7110:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},cutoff:{type:l.DataTypes.FLOAT,allowNull:!1},intercept:{type:l.DataTypes.FLOAT,allowNull:!1},max_valid_range:{type:l.DataTypes.FLOAT,allowNull:!1},min_valid_range:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"lda_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_orga__3213E83F8614FDA0",unique:!0,fields:[{name:"id"}]}]})}}t.LdaOrganism=s},3179:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisAssayConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisAssayConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},test_code:{type:l.DataTypes.STRING(15),allowNull:!0},test_code_enabled:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"lis_assay_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_assa__3213E83F3C29870A",unique:!0,fields:[{name:"id"}]}]})}}t.LisAssayConfig=s},4810:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisGenotypingAssayConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisGenotypingAssayConfig",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"lis_assay_config",key:"id"}}},{tableName:"lis_genotyping_assay_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_geno__3213E83FEC5A20DB",unique:!0,fields:[{name:"id"}]}]})}}t.LisGenotypingAssayConfig=s},1219:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisHaplotypeConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisHaplotypeConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"haplotype",key:"id"}},result_code:{type:l.DataTypes.STRING(15),allowNull:!0}},{tableName:"lis_haplotype_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_hapl__3213E83FC2F71408",unique:!0,fields:[{name:"id"}]}]})}}t.LisHaplotypeConfig=s},2855:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisOrganismConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisOrganismConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},result_code:{type:l.DataTypes.STRING(15),allowNull:!0}},{tableName:"lis_organism_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_orga__3213E83F2F292B05",unique:!0,fields:[{name:"id"}]}]})}}t.LisOrganismConfig=s},7519:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisTestOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisTestOrder",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},host_test_code:{type:l.DataTypes.STRING(15),allowNull:!0},instrument_specific_sample_id:{type:l.DataTypes.STRING(64),allowNull:!0},order_status:{type:l.DataTypes.INTEGER,allowNull:!1},patient_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"patient",key:"id"}},priority:{type:l.DataTypes.INTEGER,allowNull:!1},sample_id:{type:l.DataTypes.STRING(25),allowNull:!0},cartridge_id:{type:l.DataTypes.STRING(25),allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test",key:"id"}}},{tableName:"lis_test_order",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_test__3213E83FF0E2345C",unique:!0,fields:[{name:"id"}]},{name:"UX_listestorder_testid",unique:!0,fields:[{name:"test_id"}]}]})}}t.LisTestOrder=s},8608:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisUpload=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisUpload",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},test_order_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"lis_test_order",key:"id"}},upload_message_id:{type:l.DataTypes.STRING(64),allowNull:!0},upload_status:{type:l.DataTypes.INTEGER,allowNull:!1},sample_priority:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"lis_upload",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_uplo__3213E83F0EA9D7BF",unique:!0,fields:[{name:"id"}]},{name:"UX_lis_upload_test_id",unique:!0,fields:[{name:"test_id"}]}]})}}t.LisUpload=s},4298:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte_result",key:"id"}},peak_height:{type:l.DataTypes.FLOAT,allowNull:!1},peak_index:{type:l.DataTypes.INTEGER,allowNull:!1},peak_temperature:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"melt_peak_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_melt_peak_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__melt_pea__3213E83E1FE51EFB",unique:!0,fields:[{name:"id"}]}]})}}t.MeltPeakResult=s},630:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte",key:"id"}},slope_positive:{type:l.DataTypes.BOOLEAN,allowNull:!1},baseline_look_back:{type:l.DataTypes.FLOAT,allowNull:!1},baseline_num_points:{type:l.DataTypes.INTEGER,allowNull:!1},baseline_start_temp:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_max:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_min:{type:l.DataTypes.FLOAT,allowNull:!1},peak_threshold:{type:l.DataTypes.FLOAT,allowNull:!1},points_around_peak:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"melt_peak_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__melt_pea__3213E83FBAF87862",unique:!0,fields:[{name:"id"}]},{name:"UX_meltpeaksetting_parentid",unique:!0,fields:[{name:"parent_id"}]}]})}}t.MeltPeakSetting=s},7883:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismBasedAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismBasedAssay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"organism_based_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83F210E91DF",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismBasedAssay=s},1122:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismBasedOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismBasedOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},semi_quant_level:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"organism_based_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83FBBF8D3EA",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismBasedOrganismResult=s},6321:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultText",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(8),allowNull:!1},result_text:{type:l.DataTypes.INTEGER,allowNull:!1},text_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"organism_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83FF9BBD424",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismResultText=s},9668:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"organism",key:"id"}},result_text:{type:l.DataTypes.INTEGER,allowNull:!1},result_color:{type:l.DataTypes.INTEGER,allowNull:!1},is_result_invalid:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_organism_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__organism__3213E83EA550B35B",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismResult=s},8476:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismTarget=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismTarget",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}}},{tableName:"organism_target",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83F06D96945",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismTarget=s},8374:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Organism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Organism",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},name:{type:l.DataTypes.STRING(32),allowNull:!1},organism_index:{type:l.DataTypes.INTEGER,allowNull:!1},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83FE0D2FAA1",unique:!0,fields:[{name:"id"}]}]})}}t.Organism=s},5828:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Path=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Path",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge_type",key:"id"}},angular_offset:{type:l.DataTypes.FLOAT,allowNull:!1},chamber_number:{type:l.DataTypes.INTEGER,allowNull:!0},is_block:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!1},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"path",schema:"dbo",timestamps:!1,indexes:[{name:"PK__path__3213E83F3A63F5BA",unique:!0,fields:[{name:"id"}]}]})}}t.Path=s},3708:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Patient=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Patient",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},gx_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},practice_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},family_name:{type:l.DataTypes.STRING(1552),allowNull:!0},given_name:{type:l.DataTypes.STRING(240),allowNull:!0},middle_name:{type:l.DataTypes.STRING(240),allowNull:!0},date_of_birth:{type:l.DataTypes.STRING(96),allowNull:!0},gender:{type:l.DataTypes.STRING(128),allowNull:!0},ethnicity:{type:l.DataTypes.STRING(512),allowNull:!0},postal_code:{type:l.DataTypes.STRING(96),allowNull:!0}},{tableName:"patient",schema:"dbo",timestamps:!1,indexes:[{name:"PK__patient__3213E83F500DEB6B",unique:!0,fields:[{name:"id"}]}]})}}t.Patient=s},9913:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioAssay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"percent_ratio_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F68A8D83F",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioAssay=s},9169:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},ratio_percent:{type:l.DataTypes.FLOAT,allowNull:!0},log_transform:{type:l.DataTypes.FLOAT,allowNull:!0},reporting_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},calculation_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},detailed_result:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"percent_ratio_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F8DCBBE5A",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioOrganismResult=s},2232:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},dynamic_range_max:{type:l.DataTypes.FLOAT,allowNull:!1},dynamic_range_min:{type:l.DataTypes.FLOAT,allowNull:!1},lod_loq:{type:l.DataTypes.FLOAT,allowNull:!1},log_transform_type:{type:l.DataTypes.INTEGER,allowNull:!1},units:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"percent_ratio_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F1C1399B7",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioOrganism=s},894:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioReagentLot",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"reagent_lot",key:"id"}}},{tableName:"percent_ratio_reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F295E59AE",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioReagentLot=s},7363:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioResultEvaluator=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioResultEvaluator",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},calculation_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},reporting_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}}},{tableName:"percent_ratio_result_evaluator",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F0102494E",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioResultEvaluator=s},2026:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioSampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioSampleSetting",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"sample_setting",key:"id"}},delta_ct_efficiency:{type:l.DataTypes.FLOAT,allowNull:!0},scaling_factor:{type:l.DataTypes.DECIMAL(5,2),allowNull:!0}},{tableName:"percent_ratio_sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83FACBB9456",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioSampleSetting=s},9250:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1Assay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1Assay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"quant1_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_a__3213E83FFBCA71DA",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1Assay=s},5021:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1OrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1OrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}}},{tableName:"quant1_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_o__3213E83F4ADBB366",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1OrganismResult=s},3739:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1Organism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1Organism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},max_quantitative_delta:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"quant1_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_o__3213E83F760E8E2C",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1Organism=s},6693:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1ReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1ReagentLot",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"reagent_lot",key:"id"}}},{tableName:"quant1_reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_r__3213E83FD7043653",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1ReagentLot=s},2949:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1Result=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1Result",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"quant1_organism_result",key:"id"}},quantitative_result:{type:l.DataTypes.FLOAT,allowNull:!0},quant_unit_setting_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"quant_unit_setting",key:"id"}},result_abnormal_flag:{type:l.DataTypes.STRING(5),allowNull:!0}},{tableName:"quant1_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_quant1_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__quant1_r__3213E83E904FF5F0",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1Result=s},3664:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1SampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1SampleSetting",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"sample_setting",key:"id"}},e0:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},e1:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},e2:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0}},{tableName:"quant1_sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_s__3213E83F2C81C938",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1SampleSetting=s},1747:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QuantUnitSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QuantUnitSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"quant1_organism",key:"id"}},conversion_factor:{type:l.DataTypes.FLOAT,allowNull:!1},display_log_value:{type:l.DataTypes.BOOLEAN,allowNull:!1},lower_limit:{type:l.DataTypes.FLOAT,allowNull:!1},position:{type:l.DataTypes.INTEGER,allowNull:!1},units:{type:l.DataTypes.INTEGER,allowNull:!1},upper_limit:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"quant_unit_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant_un__3213E83FE8E6C80B",unique:!0,fields:[{name:"id"}]}]})}}t.QuantUnitSetting=s},8090:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RawDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("RawDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test_data",key:"id"}},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0},timestamps:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"raw_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_raw_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__raw_data__3213E83E261626F5",unique:!0,fields:[{name:"id"}]}]})}}t.RawDataItem=s},8323:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ReagentLot",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},creation_time:{type:l.DataTypes.DATE,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!1},reagent_lot_number:{type:l.DataTypes.STRING(3),allowNull:!1}},{tableName:"reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__reagent___3213E83F654D76BF",unique:!0,fields:[{name:"id"}]}]})}}t.ReagentLot=s},771:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ReportGraphSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ReportGraphSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}},graph_type:{type:l.DataTypes.INTEGER,allowNull:!0},param_key:{type:l.DataTypes.STRING(64),allowNull:!1},param_val:{type:l.DataTypes.STRING(512),allowNull:!0}},{tableName:"report_graph_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__report_g__3213E83F45404AE6",unique:!0,fields:[{name:"id"}]}]})}}t.ReportGraphSetting=s},200:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Reporter=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Reporter",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},concentration:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(12),allowNull:!1}},{tableName:"reporter",schema:"dbo",timestamps:!1,indexes:[{name:"PK__reporter__3213E83F8B6A21DD",unique:!0,fields:[{name:"id"}]},{name:"UX_reporter_name",unique:!0,fields:[{name:"name"}]}]})}}t.Reporter=s},4829:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultCalculation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultCalculation",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},chain_name:{type:l.DataTypes.STRING(64),allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1}},{tableName:"result_calculation",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_c__3213E83FDF13CEAD",unique:!0,fields:[{name:"id"}]}]})}}t.ResultCalculation=s},1452:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultEvaluator=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultEvaluator",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},evaluator_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_text:{type:l.DataTypes.INTEGER,allowNull:!1},rule_anded:{type:l.DataTypes.BOOLEAN,allowNull:!1},text_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"result_evaluator",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_e__3213E83F523A8A97",unique:!0,fields:[{name:"id"}]}]})}}t.ResultEvaluator=s},1093:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultRuleAnalyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultRuleAnalyte",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"result_evaluator",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},rule_index:{type:l.DataTypes.INTEGER,allowNull:!1},rule_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"result_rule_analyte",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_r__3213E83F54E0B232",unique:!0,fields:[{name:"id"}]}]})}}t.ResultRuleAnalyte=s},3271:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultRuleInterpretation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultRuleInterpretation",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"result_rule_analyte",key:"id"}},interpretation:{type:l.DataTypes.INTEGER,allowNull:!1},pass_on_equals:{type:l.DataTypes.BOOLEAN,allowNull:!1},reasons:{type:l.DataTypes.STRING(50),allowNull:!0}},{tableName:"result_rule_interpretation",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_r__3213E83FB046073F",unique:!0,fields:[{name:"id"}]}]})}}t.ResultRuleInterpretation=s},3745:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultRuleMeltPeak=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultRuleMeltPeak",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"result_rule_analyte",key:"id"}},pass_on_peak:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"result_rule_melt_peak",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_r__3213E83FCFD26AA9",unique:!0,fields:[{name:"id"}]}]})}}t.ResultRuleMeltPeak=s},6709:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"reagent_lot",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},ct_threshold_value:{type:l.DataTypes.FLOAT,allowNull:!1},end_pt_threshold:{type:l.DataTypes.INTEGER,allowNull:!1},min_delta_ct:{type:l.DataTypes.FLOAT,allowNull:!1},normalization_factor:{type:l.DataTypes.INTEGER,allowNull:!1},peak_height_min:{type:l.DataTypes.FLOAT,allowNull:!1},probe_chk_delta:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_high_max:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_high_min:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_low_max:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_low_min:{type:l.DataTypes.INTEGER,allowNull:!1},use_endpoint:{type:l.DataTypes.BOOLEAN,allowNull:!1},use_min_delta_ct:{type:l.DataTypes.BOOLEAN,allowNull:!1},valid_max:{type:l.DataTypes.DECIMAL(5,1),allowNull:!1},valid_min:{type:l.DataTypes.DECIMAL(5,1),allowNull:!1}},{tableName:"sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__sample_s__3213E83F372020C1",unique:!0,fields:[{name:"id"}]}]})}}t.SampleSetting=s},8388:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleType=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleType",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},sample_type_key:{type:l.DataTypes.STRING(5),allowNull:!1}},{tableName:"sample_type",schema:"dbo",timestamps:!1,indexes:[{name:"PK__sample_t__3213E83FB25BD1D4",unique:!0,fields:[{name:"id"}]}]})}}t.SampleType=s},1111:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SelectedQuantUnitSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SelectedQuantUnitSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},units:{type:l.DataTypes.INTEGER,allowNull:!1},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}}},{tableName:"selected_quant_unit_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__selected__3213E83F734FFC3D",unique:!0,fields:[{name:"id"}]}]})}}t.SelectedQuantUnitSetting=s},5274:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SemiQuantOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SemiQuantOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"basic_organism",key:"id"}},delta_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1},low_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1},medium_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1},replaced_result_color:{type:l.DataTypes.INTEGER,allowNull:!1},replaced_result_text:{type:l.DataTypes.INTEGER,allowNull:!1},semi_quant_result_text:{type:l.DataTypes.INTEGER,allowNull:!1},very_low_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"semi_quant_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__semi_qua__3213E83F798098BE",unique:!0,fields:[{name:"id"}]}]})}}t.SemiQuantOrganism=s},7497:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SystemLog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SystemLog",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},details:{type:l.DataTypes.STRING(512),allowNull:!0},error_code:{type:l.DataTypes.INTEGER,allowNull:!0},error_type:{type:l.DataTypes.INTEGER,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!1},site_name:{type:l.DataTypes.CHAR(3),allowNull:!0},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"system_log",schema:"dbo",timestamps:!1,indexes:[{name:"PK__system_l__3213E83FD2152FF4",unique:!0,fields:[{name:"id"}]}]})}}t.SystemLog=s},7657:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TargetBasedAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TargetBasedAssay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"target_based_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__target_b__3213E83FBC5750E1",unique:!0,fields:[{name:"id"}]}]})}}t.TargetBasedAssay=s},6344:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TargetBasedOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TargetBasedOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}}},{tableName:"target_based_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__target_b__3213E83FD1505E40",unique:!0,fields:[{name:"id"}]}]})}}t.TargetBasedOrganism=s},4668:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlogCounter=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlogCounter",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_blog_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test_blog",key:"id"}},date_text:{type:l.DataTypes.STRING(8),allowNull:!0},test_count:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"test_blog_counter",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test_blo__3213E83F641C1761",unique:!0,fields:[{name:"id"}]},{name:"UX_testblogcounter_testblogid_datetext",unique:!0,fields:[{name:"test_blog_id"},{name:"date_text"}]}]})}}t.TestBlogCounter=s},806:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlog",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}}},{tableName:"test_blog",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test_blo__3213E83FB1125CAD",unique:!0,fields:[{name:"id"}]},{name:"UX_testblog_assayid",unique:!0,fields:[{name:"assay_id"}]}]})}}t.TestBlog=s},1257:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestDataError=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestDataError",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test_data",key:"id"}},code:{type:l.DataTypes.INTEGER,allowNull:!1},details:{type:l.DataTypes.STRING(512),allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!1},param1:{type:l.DataTypes.FLOAT,allowNull:!0},param2:{type:l.DataTypes.FLOAT,allowNull:!0},param3:{type:l.DataTypes.FLOAT,allowNull:!0},param4:{type:l.DataTypes.FLOAT,allowNull:!0},severity:{type:l.DataTypes.INTEGER,allowNull:!1},site_state:{type:l.DataTypes.INTEGER,allowNull:!1},step_number:{type:l.DataTypes.INTEGER,allowNull:!1},text_param:{type:l.DataTypes.STRING(64),allowNull:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_data_error",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_data_error_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_dat__3213E83E1B49E848",unique:!0,fields:[{name:"id"}]}]})}}t.TestDataError=s},4114:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestDatum=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestDatum",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test",key:"id"}},datagram_format:{type:l.DataTypes.INTEGER,allowNull:!0},end_time:{type:l.DataTypes.DATE,allowNull:!0},error_status:{type:l.DataTypes.INTEGER,allowNull:!1},fw_version:{type:l.DataTypes.STRING(12),allowNull:!0},icore_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},site_name:{type:l.DataTypes.STRING(512),allowNull:!0},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},start_time:{type:l.DataTypes.DATE,allowNull:!0},state:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_data",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_data_test_id",fields:[{name:"test_id"}]},{name:"PK__test_dat__3213E83EF0E87FE5",unique:!0,fields:[{name:"id"}]},{name:"UX_testdata_testid",unique:!0,fields:[{name:"test_id"}]}]})}}t.TestDatum=s},9067:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestError=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestError",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},code:{type:l.DataTypes.INTEGER,allowNull:!1},details:{type:l.DataTypes.STRING(512),allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!1},param1:{type:l.DataTypes.FLOAT,allowNull:!0},param2:{type:l.DataTypes.FLOAT,allowNull:!0},param3:{type:l.DataTypes.FLOAT,allowNull:!0},param4:{type:l.DataTypes.FLOAT,allowNull:!0},severity:{type:l.DataTypes.INTEGER,allowNull:!1},text_param:{type:l.DataTypes.STRING(64),allowNull:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_error",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_error_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_err__3213E83E23C2502B",unique:!0,fields:[{name:"id"}]}]})}}t.TestError=s},7595:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestHistory",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},creation_time:{type:l.DataTypes.DATE,allowNull:!1},field_name:{type:l.DataTypes.STRING(32),allowNull:!1},new_content:{type:l.DataTypes.STRING(512),allowNull:!0},old_content:{type:l.DataTypes.STRING(512),allowNull:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"users",key:"id"}}},{tableName:"test_history",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_history_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_his__3213E83ED52A9142",unique:!0,fields:[{name:"id"}]}]})}}t.TestHistory=s},2200:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestNv=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestNv",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},archived:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_nv",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test_nv__3213E83F55A45015",unique:!0,fields:[{name:"id"}]},{name:"UX_testnv_testid",unique:!0,fields:[{name:"test_id"}]}]})}}t.TestNv=s},6676:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Test=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Test",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},result_text_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test",key:"id"}},is_current_test:{type:l.DataTypes.BOOLEAN,allowNull:!0},cartridge_barcode:{type:l.DataTypes.STRING(1024),allowNull:!0},cart_serial_number:{type:l.DataTypes.BIGINT,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},data_reduction_algorithm:{type:l.DataTypes.INTEGER,allowNull:!0},error_status:{type:l.DataTypes.INTEGER,allowNull:!1},expiration_date:{type:l.DataTypes.DATE,allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_scanned_patient_id:{type:l.DataTypes.BOOLEAN,allowNull:!0},is_scanned_sample_id:{type:l.DataTypes.BOOLEAN,allowNull:!0},modification_time:{type:l.DataTypes.DATE,allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},order_time:{type:l.DataTypes.DATE,allowNull:!0},other_sample_type_text:{type:l.DataTypes.STRING(32),allowNull:!0},legacy_result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_color:{type:l.DataTypes.TEXT,allowNull:!0},rgt_lot_id:{type:l.DataTypes.STRING(6),allowNull:!0},sample_id:{type:l.DataTypes.STRING(25),allowNull:!0},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"users",key:"id"}},patient_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"patient",key:"id"}},test_type:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"test",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test__3213E83F20BD5504",unique:!0,fields:[{name:"id"}]},{name:"UX_test_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.Test=s},8803:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UserPrivilege=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("UserPrivilege",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},privilege_name:{type:l.DataTypes.STRING(64),allowNull:!1},user_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"user_privilege",schema:"dbo",timestamps:!1,indexes:[{name:"PK__user_pri__3213E83FB86800A5",unique:!0,fields:[{name:"id"}]}]})}}t.UserPrivilege=s},9005:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.User=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("User",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},full_name:{type:l.DataTypes.STRING(128),allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_hidden:{type:l.DataTypes.BOOLEAN,allowNull:!1},login_name:{type:l.DataTypes.STRING(32),allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!0},password:{type:l.DataTypes.STRING(256),allowNull:!1},user_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"users",schema:"dbo",timestamps:!1,indexes:[{name:"PK__users__3213E83FFBF72FFA",unique:!0,fields:[{name:"id"}]},{name:"UX_users_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.User=s},3153:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.triggerLabSelection=t.triggerRegistration=t.saveLab=t.fetchLabs=void 0;const l=a(7104),s=a(7632),n=a(8969),i=a(7219),r=a(9968);function o(e){return(0,r.update)("lab",e)}t.fetchLabs=function(e){return s.backendClient.get(`/labs?${(0,l.stringify)({field:"name",order:"ASC",perPage:100,filter:{search:{name:e}}})}`).then((e=>e.data.data))},t.saveLab=o,t.triggerRegistration=function(){return(0,r.get)("registration_token").then((e=>e?Promise.resolve():(0,n.registerDevice)())).catch((e=>{var t;return i.logger.info(null===(t=null==e?void 0:e.response)||void 0===t?void 0:t.config)}))},t.triggerLabSelection=function(){return(0,r.get)("lab").then((e=>e?Promise.resolve():s.backendClient.get("/labs/current").then((e=>e.data)).then((e=>o(e))).catch((e=>{var t,a;404===(null===(t=e.response)||void 0===t?void 0:t.status)&&(null===(a=process.send)||void 0===a||a.call(process,{type:"trigger-lab-selection"}))}))))}},2577:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.labsRouter=void 0;const l=a(6860),s=a(7219),n=a(9968),i=a(3153);t.labsRouter=(0,l.Router)(),t.labsRouter.get("/",((e,t)=>{const a=e.query.name;return(0,i.fetchLabs)(a).then((e=>t.json(e))).catch((e=>{s.logger.error(e),t.json([])}))})),t.labsRouter.get("/current",((e,t)=>(0,n.get)("lab").then((e=>t.json(e))))),t.labsRouter.post("/",((e,t,a)=>{(0,i.saveLab)(e.body).then((()=>t.status(201).send())).catch(a)}))},7219:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.logger=void 0;const s=l(a(8857));t.logger=s.default},1895:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.logRouter=void 0;const l=a(6860),s=a(5133);t.logRouter=(0,l.Router)(),t.logRouter.all("/",((e,t)=>{(0,s.saveLog)(e.body).then((()=>{t.status(200).send()}))}))},324:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.catchErrors=t.cors=void 0,t.cors=function(e,t,a){if(t.setHeader("Access-Control-Allow-Origin","*"),t.setHeader("Access-Control-Allow-Methods","GET, PUT, POST, DELETE, HEAD, OPTIONS, PATCH"),t.setHeader("Access-Control-Allow-Headers","*"),t.setHeader("Access-Control-Expose-Headers","X-File-Name"),"OPTIONS"===e.method)return t.send();a()},t.catchErrors=function(e,t,a,l){return console.error(e.message),a.status(500).json({message:"Something went wrong"})}},4639:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CalibrationSummary=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.INTEGER,primaryKey:!0,autoIncrement:!0},name:{type:l.DataTypes.STRING},path:{type:l.DataTypes.STRING},content:{type:l.DataTypes.STRING},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"CalibrationSummary",tableName:"CalibrationSummary"})}static associate(e){}}t.CalibrationSummary=s},5586:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.saveCalibration=void 0;const l=a(3292),s=a(3695);t.saveCalibration=function(e){return(0,l.readFile)(e.path).then((t=>s.sqliteModels.CalibrationSummary.create(Object.assign(Object.assign({},e),{content:t.toString("base64")}))))}},7036:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.listCalibrations=void 0;const l=a(4639);t.listCalibrations=function(){return l.CalibrationSummary.findAll({attributes:{exclude:["content"]}})}},195:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.calibrationRouter=void 0;const l=a(6860),s=a(5586),n=a(7036);t.calibrationRouter=(0,l.Router)(),t.calibrationRouter.post("/",(function(e,t,a){(0,s.saveCalibration)(e.body).then((e=>t.json(e))).catch(a)})),t.calibrationRouter.get("/",(function(e,t,a){(0,n.listCalibrations)().then((e=>{t.json(e)})).catch(a)}))},7755:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ContactPerson=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.STRING,primaryKey:!0},name:{type:l.DataTypes.STRING},phone:{type:l.DataTypes.STRING},email:{type:l.DataTypes.STRING},isPrimaryContact:{type:l.DataTypes.BOOLEAN,defaultValue:!1,allowNull:!0},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"ContactPerson",tableName:"ContactPerson"})}static associate(e){}}t.ContactPerson=s},5132:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{o(l.next(e))}catch(e){n(e)}}function r(e){try{o(l.throw(e))}catch(e){n(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,r)}o((l=l.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.clearContactPersons=t.saveContactPersons=t.fetchContactPersons=void 0;const s=a(3695);function n(){return s.sqliteModels.ContactPerson.destroy({where:{}})}t.fetchContactPersons=function(e=null){return l(this,void 0,void 0,(function*(){return null==e?yield s.sqliteModels.ContactPerson.findAll():yield s.sqliteModels.ContactPerson.findAll({where:{isPrimaryContact:e}})}))},t.saveContactPersons=function(e){return l(this,void 0,void 0,(function*(){return yield n(),s.sqliteModels.ContactPerson.bulkCreate(e)}))},t.clearContactPersons=n},9524:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.contactPersonRouter=void 0;const l=a(6860),s=a(5132);t.contactPersonRouter=(0,l.Router)(),t.contactPersonRouter.get("/",(function(e,t,a){var l;const n="true"===(null===(l=null==e?void 0:e.query)||void 0===l?void 0:l.isPrimaryContact)||void 0;(0,s.fetchContactPersons)(n).then((e=>t.json(e))).catch(a)}))},621:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DailySummary=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.INTEGER,autoIncrement:!0,primaryKey:!0},category:{type:l.DataTypes.STRING,allowNull:!1},numberOfSamplesReceived:{type:l.DataTypes.INTEGER,allowNull:!0},numberOfSamplesDone:{type:l.DataTypes.INTEGER,allowNull:!0},numberOfBacklogSamples:{type:l.DataTypes.INTEGER,allowNull:!0},numberOfRejectedSamples:{type:l.DataTypes.INTEGER,allowNull:!0},numberOfTestsReferred:{type:l.DataTypes.INTEGER,allowNull:!0},numberOfReferredTestResultsReturned:{type:l.DataTypes.INTEGER,allowNull:!0},reportDate:{type:l.DataTypes.DATE,allowNull:!1},createdAt:{type:l.DataTypes.DATE,allowNull:!1},isDraft:{type:l.DataTypes.BOOLEAN,allowNull:!1,defaultValue:!0},sampleRejections:{type:l.DataTypes.JSONB,allowNull:!1,defaultValue:[]},referrals:{type:l.DataTypes.JSONB,allowNull:!1,defaultValue:{id:0,specimenType:{sputum:{total:0,returned:0},stool:{total:0,returned:0},bodyFluid:{total:0,returned:0},tissue:{total:0,returned:0},isolate:{total:0,returned:0},other:{total:0,returned:0}},testType:{geneXpert:{total:0,returned:0},flDST:{total:0,returned:0},slDST:{total:0,returned:0},genomeSequencing:{total:0,returned:0},tbCulture:{total:0,returned:0}}}}},{sequelize:e,timestamps:!1,modelName:"DailySummary",tableName:"DailySummary"})}static associate(e){}}t.DailySummary=s},5075:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{o(l.next(e))}catch(e){n(e)}}function r(e){try{o(l.throw(e))}catch(e){n(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,r)}o((l=l.apply(e,t||[])).next())}))},s=this&&this.__rest||function(e,t){var a={};for(var l in e)Object.prototype.hasOwnProperty.call(e,l)&&t.indexOf(l)<0&&(a[l]=e[l]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var s=0;for(l=Object.getOwnPropertySymbols(e);s<l.length;s++)t.indexOf(l[s])<0&&Object.prototype.propertyIsEnumerable.call(e,l[s])&&(a[l[s]]=e[l[s]])}return a};Object.defineProperty(t,"__esModule",{value:!0}),t.DailySummaryService=void 0;const n=a(496),i=a(621);t.DailySummaryService=class{static validateRejectionDetails(e,t){if("TB"===e){if(!(t.mrn&&t.type&&t.reason&&t.phoneNumber))throw new Error("TB rejection requires mrn, type, reason, and phoneNumber (lab technician)")}else if("XPERT HIV-1 QUAL"===e){if(!(t.mrn&&t.heiCode&&t.reason&&t.phoneNumber))throw new Error("EID rejection requires mrn, heiCode, reason, and phoneNumber (PMTCT)")}else{if("XPERT HIV-1 VIRAL LOAD"!==e)throw new Error("Invalid category: must be TB, XPERT HIV-1 QUAL, or XPERT HIV-1 VIRAL LOAD");if(!t.artId||!t.reason||!t.phoneNumber)throw new Error("VL rejection requires artId, reason, and phoneNumber (requestor)")}}static validateReferralDetails(e,t=!1){const a=(e,t,a)=>{if(e&&("number"!=typeof e.total||e.total<0||"number"!=typeof e.returned||e.returned<0||e.returned>e.total))throw new Error(`Invalid ${t} counts for ${a}: total and returned must be non-negative integers, returned <= total`)};e.specimenType&&Object.entries(e.specimenType).forEach((([e,t])=>a(t,"specimenType",e))),e.testType&&Object.entries(e.testType).forEach((([e,t])=>a(t,"testType",e)))}static createReport(e,t,a){return l(this,void 0,void 0,(function*(){const l=yield i.DailySummary.sequelize.transaction();try{if(!["TB","XPERT HIV-1 QUAL","XPERT HIV-1 VIRAL LOAD"].includes(e.category||""))throw new Error("Invalid category: must be TB, XPERT HIV-1 QUAL, or XPERT HIV-1 VIRAL LOAD");if(e.reportDate&&e.category){console.log("Checking for existing report with date:",e.reportDate,"and category:",e.category);const t=new Date(e.reportDate);t.setHours(0,0,0,0);const a=new Date(e.reportDate);a.setHours(23,59,59,999);const s=yield i.DailySummary.findOne({where:{reportDate:{[n.Op.between]:[t.toISOString(),a.toISOString()]},category:e.category},transaction:l});if(console.log("Existing report found:",s),s)throw new Error("Report exists for the chosen date and category")}const{id:r}=e,o=s(e,["id"]),u=e.category,d=(null==t?void 0:t.map(((e,t)=>Object.assign(Object.assign({},e),{id:t+1,dailySummaryId:0,createdAt:new Date(e.createdAt||new Date)}))))||[];let p;a&&(this.validateReferralDetails(a),p=Object.assign(Object.assign({},a),{id:0}));const y=Object.assign(Object.assign(Object.assign({},o),{category:u,isDraft:!0,createdAt:new Date,sampleRejections:d}),p&&{referrals:p});o.reportDate&&(y.reportDate=o.reportDate);const c=yield i.DailySummary.create(y,{transaction:l});return c.sampleRejections=c.sampleRejections.map((e=>Object.assign(Object.assign({},e),{dailySummaryId:c.id}))),p&&(c.referrals=Object.assign(Object.assign({},c.referrals),{id:c.id})),yield c.save({transaction:l}),yield l.commit(),c}catch(e){throw console.log("Error creating report:",e),yield l.rollback(),e}}))}static getReportById(e){return l(this,void 0,void 0,(function*(){return i.DailySummary.findOne({where:{id:e}})}))}static getAllReports(e,t,a,s){return l(this,void 0,void 0,(function*(){const l=Object.assign(Object.assign(Object.assign({},e?{category:e}:{}),t&&a?{reportDate:{[n.Op.between]:[t,a]}}:{}),void 0!==s?{isDraft:s}:{});return i.DailySummary.findAll({where:l})}))}static getDraftReports(e,t,a){return l(this,void 0,void 0,(function*(){return this.getAllReports(e,t,a,!0)}))}static updateReport(e,t,a,s){return l(this,void 0,void 0,(function*(){const l=yield i.DailySummary.sequelize.transaction();try{const r=yield i.DailySummary.findOne({where:{id:e},transaction:l});if(!r)throw new Error("Daily summary report not found");if(t.category&&!["TB","XPERT HIV-1 QUAL","XPERT HIV-1 VIRAL LOAD"].includes(t.category))throw new Error("Invalid category: must be TB, XPERT HIV-1 QUAL, or XPERT HIV-1 VIRAL LOAD");if(t.reportDate||t.category){const a=t.reportDate||r.reportDate,s=t.category||r.category,o=new Date(a);o.setHours(0,0,0,0);const u=new Date(a);if(u.setHours(23,59,59,999),yield i.DailySummary.findOne({where:{reportDate:{[n.Op.between]:[o.toISOString(),u.toISOString()]},category:s,id:{[n.Op.ne]:e}},transaction:l}))throw new Error("Report exists for the chosen date and category")}const o=(null==a?void 0:a.map(((t,a)=>Object.assign(Object.assign({},t),{id:a+1,dailySummaryId:e,createdAt:new Date(t.createdAt||new Date)}))))||r.sampleRejections;let u=r.referrals;return s&&(this.validateReferralDetails(s),u=Object.assign(Object.assign({},s),{id:e})),yield r.update(Object.assign(Object.assign({},t),{sampleRejections:o,referrals:u}),{transaction:l}),yield l.commit(),r}catch(e){throw console.log("Error updating report:",e),yield l.rollback(),e}}))}static markReportAsComplete(e,t,a,r){return l(this,void 0,void 0,(function*(){const l=yield i.DailySummary.sequelize.transaction();try{let o;if(console.log("Marking report as complete. ID:",e,"Data:",t),e){const s=yield i.DailySummary.findOne({where:{id:e},transaction:l});if(!s)throw new Error("Daily summary report not found");if(o=s,t.category&&!["TB","XPERT HIV-1 QUAL","XPERT HIV-1 VIRAL LOAD"].includes(t.category))throw new Error("Invalid category: must be TB, XPERT HIV-1 QUAL, or XPERT HIV-1 VIRAL LOAD");if(t.reportDate||t.category){const a=t.reportDate||o.reportDate,s=t.category||o.category,r=new Date(a);r.setHours(0,0,0,0);const u=new Date(a);if(u.setHours(23,59,59,999),yield i.DailySummary.findOne({where:{reportDate:{[n.Op.between]:[r.toISOString(),u.toISOString()]},category:s,id:{[n.Op.ne]:e}},transaction:l}))throw new Error("Report exists for the chosen date and category")}const u=(null==a?void 0:a.map(((t,a)=>Object.assign(Object.assign({},t),{id:a+1,dailySummaryId:e,createdAt:new Date(t.createdAt||new Date)}))))||o.sampleRejections;let d=o.referrals;r&&(this.validateReferralDetails(r,!0),d=Object.assign(Object.assign({},r),{id:e})),yield o.update(Object.assign(Object.assign({},t),{sampleRejections:u,referrals:d,isDraft:!1}),{transaction:l})}else{if(!t.category||!["TB","XPERT HIV-1 QUAL","XPERT HIV-1 VIRAL LOAD"].includes(t.category))throw new Error("Invalid or missing category: must be TB, XPERT HIV-1 QUAL, or XPERT HIV-1 VIRAL LOAD");if(!t.reportDate)throw new Error("Report date is required");const e=new Date(t.reportDate);e.setHours(0,0,0,0);const u=new Date(t.reportDate);if(u.setHours(23,59,59,999),yield i.DailySummary.findOne({where:{reportDate:{[n.Op.between]:[e.toISOString(),u.toISOString()]},category:t.category},transaction:l}))throw new Error("Report exists for the chosen date and category");const{id:d}=t,p=s(t,["id"]),y=(null!=a?a:[]).map(((e,t)=>Object.assign(Object.assign({},e),{id:t+1,dailySummaryId:0,createdAt:new Date(e.createdAt||new Date)})));let c;r&&(this.validateReferralDetails(r,!0),c=Object.assign(Object.assign({},r),{id:0}));const _=Object.assign(Object.assign(Object.assign({},p),{category:t.category,isDraft:!1,createdAt:new Date,sampleRejections:y}),c&&{referrals:c});o=yield i.DailySummary.create(_,{transaction:l}),o.sampleRejections=o.sampleRejections.map((e=>Object.assign(Object.assign({},e),{dailySummaryId:o.id}))),c&&(o.referrals=Object.assign(Object.assign({},o.referrals),{id:o.id})),yield o.save({transaction:l})}return yield l.commit(),o}catch(e){throw console.log("Error marking report as complete:",e),yield l.rollback(),e}}))}static deleteReport(e){return l(this,void 0,void 0,(function*(){const t=yield i.DailySummary.sequelize.transaction();try{const a=yield i.DailySummary.findOne({where:{id:e},transaction:t});if(!a)throw new Error("Daily summary report not found");return yield a.destroy({transaction:t}),yield t.commit(),{message:"Report deleted successfully"}}catch(e){throw console.log("Error deleting report:",e),yield t.rollback(),e}}))}}},9310:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{o(l.next(e))}catch(e){n(e)}}function r(e){try{o(l.throw(e))}catch(e){n(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,r)}o((l=l.apply(e,t||[])).next())}))},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const n=s(a(6860)),i=a(5075),r=n.default.Router();r.get("/total",((e,t)=>l(void 0,void 0,void 0,(function*(){const{category:a,startDate:l,endDate:s,isDraft:n}=e.query;try{const e=yield i.DailySummaryService.getAllReports(a,l?new Date(l):void 0,s?new Date(s):void 0,void 0!==n?"true"===n:void 0);t.json(e)}catch(e){console.error("Error retrieving reports:",e),t.status(400).json({error:e.message})}})))),r.get("/drafts",((e,t)=>l(void 0,void 0,void 0,(function*(){const{category:a,startDate:l,endDate:s}=e.query;try{const e=yield i.DailySummaryService.getDraftReports(a,l?new Date(l):void 0,s?new Date(s):void 0);t.json(e)}catch(e){console.error("Error retrieving draft reports:",e),t.status(400).json({error:e.message})}})))),r.get("/:id",((e,t)=>l(void 0,void 0,void 0,(function*(){const{id:a}=e.params;try{const e=yield i.DailySummaryService.getReportById(parseInt(a));if(!e)return t.status(404).json({error:"Report not found"});t.json(e)}catch(e){console.error("Error retrieving report:",e),t.status(400).json({error:e.message})}})))),r.post("/",((e,t)=>l(void 0,void 0,void 0,(function*(){const{report:a,rejectionDetails:l,referralDetails:s}=e.body;try{console.log("Received request to create report. Data:",a);const e=yield i.DailySummaryService.createReport(a,l,s);t.status(201).json(e)}catch(e){console.error("Error creating report:",e),t.status(400).json({error:e.message})}})))),r.put("/:id",((e,t)=>l(void 0,void 0,void 0,(function*(){const{id:a}=e.params,{report:l,rejectionDetails:s,referralDetails:n}=e.body;try{const e=yield i.DailySummaryService.updateReport(parseInt(a),l,s,n);t.json(e)}catch(e){console.error("Error updating report:",e),t.status(400).json({error:e.message})}})))),r.post("/:id/complete",((e,t)=>l(void 0,void 0,void 0,(function*(){const{id:a}=e.params,{report:l,rejectionDetails:s,referralDetails:n}=e.body;try{console.log("Received request to mark report as complete. ID:",a,"Data:",l.category);const e=yield i.DailySummaryService.markReportAsComplete(parseInt(a),l,s,n);t.json(e)}catch(e){console.error("Error marking report as complete:",e),t.status(400).json({error:e.message})}})))),r.delete("/:id",((e,t)=>l(void 0,void 0,void 0,(function*(){const{id:a}=e.params;try{const e=yield i.DailySummaryService.deleteReport(parseInt(a));t.json(e)}catch(e){console.error("Error deleting report:",e),t.status(400).json({error:e.message})}})))),t.default=r},9931:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.EqaSummary=void 0;const l=a(496),s={type:l.DataTypes.JSON,allowNull:!0,defaultValue:null};class n extends l.Model{static initialize(e){const t={id:{type:l.DataTypes.INTEGER,autoIncrement:!0,primaryKey:!0},round:{type:l.DataTypes.INTEGER,allowNull:!1},reportYear:{type:l.DataTypes.INTEGER,allowNull:!1},createdAt:{type:l.DataTypes.DATE,allowNull:!1}};return["xpertMTBUltraData","truenatMTB","xpertMTBXdrData","afbData","lflamData","cultureData","pdstData","xpertHIV1QualAssay","xpertHIV1ViralLoad"].forEach((e=>{t[e]=Object.assign({},s)})),n.init(t,{sequelize:e,timestamps:!1,modelName:"EqaSummary",tableName:"EqaSummary"})}static associate(e){}}t.EqaSummary=n},7007:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{o(l.next(e))}catch(e){n(e)}}function r(e){try{o(l.throw(e))}catch(e){n(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,r)}o((l=l.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.EqaSummaryService=void 0;const s=a(496),n=a(9931),i={xpertMTBUltraData:"Xpert MTB | RIF Ultra",truenatMTB:"Truenat MTB | RIF Dx",xpertMTBXdrData:"Xpert MTB | XDR Assay",afbData:"AFB",lflamData:"LF-LAM",cultureData:" Culture",pdstData:"PDST",xpertHIV1QualAssay:"Xpert HIV-1 Qual Assay (EID)",xpertHIV1ViralLoad:"Xpert HIV-1 Viral Load (VL)"};t.EqaSummaryService=class{static validateReportData({reportYear:e,round:t}){if(!t)throw new Error("Report Round is required");if(!e)throw new Error("Report Year is required")}static validateOptionalSampleFields(e,t){if(!t)return;const{method:a,mtbUltraCycleThresholds:l,pdstDrugConcentrations:s,xdrTestResults:n}=t;if(a&&"string"!=typeof a)throw new Error(`Invalid sample ${e}: method must be a string`);l&&["probeErpoB1","probeDrpoB2","probeCrpoB3","probeBrpoB4","probeArpoIS1081_IS6110","SPC"].forEach((t=>{const a=l[t];if("number"!=typeof a||isNaN(a))throw new Error(`Invalid sample ${e}: mtbUltraCycleThresholds.${t} must be a number`)})),s&&Object.entries(s).forEach((([t,a])=>{if(a&&("string"!=typeof a.pdst||"string"!=typeof a.tNGS))throw new Error(`Invalid sample ${e}: psdtDrugConcentrations.${t} fields must be strings`)})),n&&Object.entries(n).forEach((([t,a])=>{Object.entries(a).forEach((([a,l])=>{if("boolean"!=typeof l&&"number"!=typeof l)throw new Error(`Invalid sample ${e}: xdrTestResults.${t}.${a} must be boolean or number`)}))}))}static validateCompleteData(e,t){const a=(e,t)=>{Object.entries(e).forEach((([e,a])=>{if(!a)return;const{sample:l,result:s,ctValue:n}=a;if(!(null==l?void 0:l.trim()))throw new Error(`Invalid ${t}: missing sample name for ${e}`);if(s){if("string"!=typeof s.key||"string"!=typeof s.value)throw new Error(`Invalid ${t}: result fields incomplete for ${e}`);if("number"!=typeof n||isNaN(n))throw new Error(`Invalid ${t}: ctValue must be a valid number for ${e}`)}else if("number"!=typeof n&&""!==n)throw new Error(`Invalid ${t}: ctValue must be empty or a number for ${e}`);this.validateOptionalSampleFields(e,a)}))};if(!t)throw new Error(`${e} data field must be filled for completion`);((e,t)=>{if(["category","sampleReceivedDate","resultReportedDate"].forEach((a=>{const l=e[a];if(null==l||"string"==typeof l&&!l.trim())throw new Error(`Invalid ${t}: ${a} is missing or empty`)})),!e.sampleData||0===Object.keys(e.sampleData).length)throw new Error(`Invalid ${t}: sampleData is empty`);a(e.sampleData,t)})(t,e)}static getAllReports(e,t,a,i){return l(this,void 0,void 0,(function*(){const l=Object.assign(Object.assign({},e?{round:e}:{}),t?{reportYear:t}:{});return a&&(l[s.Op.and]=[...l[s.Op.and]||[],(0,s.literal)(`(${a} IS NOT NULL AND json_extract(${a}, '$.isDraft') = ${i?1:0})`)]),n.EqaSummary.findAll({where:l})}))}static getDraftReports(e,t,a){return l(this,void 0,void 0,(function*(){return this.getAllReports(e,t,a,!0)}))}static getReportById(e){return l(this,void 0,void 0,(function*(){return n.EqaSummary.findOne({where:{id:e}})}))}static createReport({testType:e,round:t,reportYear:a,xpertMTBUltraData:i,truenatMTB:r,xpertMTBXdrData:o,afbData:u,lflamData:d,cultureData:p,pdstData:y,xpertHIV1QualAssay:c,xpertHIV1ViralLoad:_}){return l(this,void 0,void 0,(function*(){const l=yield n.EqaSummary.sequelize.transaction();try{this.validateReportData({reportYear:a,round:t});let m=yield n.EqaSummary.findOne({where:{reportYear:a,round:t},transaction:l});if(m){if(yield n.EqaSummary.findOne({where:{round:t,reportYear:a,id:{[s.Op.ne]:m.id}},transaction:l}))throw new Error("Another report exists for the chosen year and round");const T=m[e];if(T&&!1===T.isDraft)throw new Error("Report is already submitted");const N={xpertMTBUltraData:i,truenatMTB:r,xpertMTBXdrData:o,afbData:u,lflamData:d,cultureData:p,pdstData:y,xpertHIV1QualAssay:c,xpertHIV1ViralLoad:_};yield m.update({[e]:N[e]},{transaction:l})}else{const e={round:t,reportYear:a,createdAt:new Date,xpertMTBUltraData:i,truenatMTB:r,xpertMTBXdrData:o,afbData:u,lflamData:d,cultureData:p,pdstData:y,xpertHIV1QualAssay:c,xpertHIV1ViralLoad:_};m=yield n.EqaSummary.create(e,{transaction:l})}return yield l.commit(),m}catch(e){throw yield l.rollback(),e}}))}static updateReport({id:e,testType:t,round:a,reportYear:i,xpertMTBUltraData:r,truenatMTB:o,xpertMTBXdrData:u,afbData:d,lflamData:p,cultureData:y,pdstData:c,xpertHIV1QualAssay:_,xpertHIV1ViralLoad:m}){return l(this,void 0,void 0,(function*(){const l=yield n.EqaSummary.sequelize.transaction();try{const T=yield n.EqaSummary.findOne({where:{id:e},transaction:l});if(!T)throw new Error("Eqa summary report not found");if(a){const t=a||T.round;if(yield n.EqaSummary.findOne({where:{round:t,reportYear:i,id:{[s.Op.ne]:e}},transaction:l}))throw new Error("Report exists for the chosen year and round")}const N={xpertMTBUltraData:r,truenatMTB:o,xpertMTBXdrData:u,afbData:d,lflamData:p,cultureData:y,pdstData:c,xpertHIV1QualAssay:_,xpertHIV1ViralLoad:m};return yield T.update({[t]:N[t]},{transaction:l}),yield l.commit(),T}catch(e){throw yield l.rollback(),e}}))}static markReportAsComplete({id:e,testType:t,round:a,reportYear:s,xpertMTBUltraData:r,truenatMTB:o,xpertMTBXdrData:u,afbData:d,lflamData:p,cultureData:y,pdstData:c,xpertHIV1QualAssay:_,xpertHIV1ViralLoad:m}){return l(this,void 0,void 0,(function*(){return n.EqaSummary.sequelize.transaction((T=>l(this,void 0,void 0,(function*(){const l={xpertMTBUltraData:r,truenatMTB:o,xpertMTBXdrData:u,afbData:d,lflamData:p,cultureData:y,pdstData:c,xpertHIV1QualAssay:_,xpertHIV1ViralLoad:m};if(!Object.keys(l).includes(t))throw new Error(`Unknown test type: ${t}`);const N=l[t];if(!a||!s)throw new Error("Invalid round or reportYear");this.validateReportData({reportYear:s,round:a}),this.validateCompleteData(i[t],N);let g=null;if(e){if(g=yield n.EqaSummary.findOne({where:{id:e},transaction:T}),!g)throw new Error("EQA summary report not found")}else g=yield n.EqaSummary.findOne({where:{round:a,reportYear:s},transaction:T});if(g){const e=g[t];if(e&&!1===e.isDraft)throw new Error("Report is already submitted");yield g.update({[t]:N},{transaction:T})}else{const e={round:a,reportYear:s,createdAt:new Date,xpertMTBUltraData:r,truenatMTB:o,xpertMTBXdrData:u,afbData:d,lflamData:p,cultureData:y,pdstData:c,xpertHIV1QualAssay:_,xpertHIV1ViralLoad:m};g=yield n.EqaSummary.create(e,{transaction:T})}return g}))))}))}static deleteReport(e){return l(this,void 0,void 0,(function*(){const t=yield n.EqaSummary.sequelize.transaction();try{const a=yield n.EqaSummary.findOne({where:{id:e},transaction:t});if(!a)throw new Error("Eqa summary report not found");return yield a.destroy({transaction:t}),yield t.commit(),{message:"Eqa Report deleted successfully"}}catch(e){throw yield t.rollback(),e}}))}}},5115:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{o(l.next(e))}catch(e){n(e)}}function r(e){try{o(l.throw(e))}catch(e){n(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,r)}o((l=l.apply(e,t||[])).next())}))},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const n=s(a(6860)),i=a(7007),r=n.default.Router();r.get("/total",((e,t)=>l(void 0,void 0,void 0,(function*(){const{round:a,reportYear:l,subType:s}=e.query,n="string"==typeof a?parseInt(a):a;try{const e=yield i.EqaSummaryService.getAllReports(n,l,s);t.json(e)}catch(e){t.status(400).json({error:e.message})}})))),r.get("/drafts",((e,t)=>l(void 0,void 0,void 0,(function*(){const{round:a,reportYear:l,subType:s}=e.query,n="string"==typeof a?parseInt(a):a;try{const e=yield i.EqaSummaryService.getDraftReports(n,l,s);t.json(e)}catch(e){t.status(400).json({error:e.message})}})))),r.get("/:id",((e,t)=>l(void 0,void 0,void 0,(function*(){const{id:a}=e.params;try{const e=yield i.EqaSummaryService.getReportById(parseInt(a));if(!e)return t.status(404).json({error:"Report not found"});t.json(e)}catch(e){t.status(400).json({error:e.message})}})))),r.post("/",((e,t)=>l(void 0,void 0,void 0,(function*(){const{testType:a,round:l,reportYear:s,xpertMTBUltraData:n,truenatMTB:r,xpertMTBXdrData:o,afbData:u,lflamData:d,cultureData:p,pdstData:y,xpertHIV1QualAssay:c,xpertHIV1ViralLoad:_}=e.body;try{const e=yield i.EqaSummaryService.createReport({testType:a,round:l,reportYear:s,xpertMTBUltraData:n,truenatMTB:r,xpertMTBXdrData:o,afbData:u,lflamData:d,cultureData:p,pdstData:y,xpertHIV1QualAssay:c,xpertHIV1ViralLoad:_});t.status(201).json(e)}catch(e){t.status(400).json({error:e.message})}})))),r.put("/:id",((e,t)=>l(void 0,void 0,void 0,(function*(){const{id:a}=e.params,{testType:l,round:s,reportYear:n,xpertMTBUltraData:r,truenatMTB:o,xpertMTBXdrData:u,afbData:d,lflamData:p,cultureData:y,pdstData:c,xpertHIV1QualAssay:_,xpertHIV1ViralLoad:m}=e.body;try{const e=yield i.EqaSummaryService.updateReport({id:parseInt(a),testType:l,round:s,reportYear:n,xpertMTBUltraData:r,truenatMTB:o,xpertMTBXdrData:u,afbData:d,lflamData:p,cultureData:y,pdstData:c,xpertHIV1QualAssay:_,xpertHIV1ViralLoad:m});t.json(e)}catch(e){t.status(400).json({error:e.message})}})))),r.post("/:id/complete",((e,t)=>l(void 0,void 0,void 0,(function*(){const{id:a}=e.params,{testType:l,round:s,reportYear:n,xpertMTBUltraData:r,truenatMTB:o,xpertMTBXdrData:u,afbData:d,lflamData:p,cultureData:y,pdstData:c,xpertHIV1QualAssay:_,xpertHIV1ViralLoad:m}=e.body;try{const e=yield i.EqaSummaryService.markReportAsComplete({id:parseInt(a)||null,testType:l,round:s,reportYear:n,xpertMTBUltraData:r,truenatMTB:o,xpertMTBXdrData:u,afbData:d,lflamData:p,cultureData:y,pdstData:c,xpertHIV1QualAssay:_,xpertHIV1ViralLoad:m});t.json(e)}catch(e){t.status(400).json({error:e.message})}})))),r.delete("/:id",((e,t)=>l(void 0,void 0,void 0,(function*(){const{id:a}=e.params;try{const e=yield i.EqaSummaryService.deleteReport(parseInt(a));t.json(e)}catch(e){t.status(400).json({error:e.message})}})))),t.default=r},7214:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Facility=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.STRING,primaryKey:!0},name:{type:l.DataTypes.STRING,allowNull:!1}},{sequelize:e,timestamps:!1,modelName:"Facility",tableName:"Facility"})}static associate(e){}}t.Facility=s},180:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.findFacilityIdById=t.listFacilities=void 0;const l=a(496),s=a(3695);t.listFacilities=function(e){return s.sqliteModels.Facility.findAll(Object.assign({limit:10,order:[["name","ASC"]]},e?{where:{name:{[l.Op.like]:`%${e}%`}}}:{}))},t.findFacilityIdById=function(e){return s.sqliteModels.Facility.findOne({where:{id:{[l.Op.eq]:e}},rejectOnEmpty:!0})}},3405:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.facilityRouter=void 0;const l=a(6860),s=a(180);t.facilityRouter=(0,l.Router)(),t.facilityRouter.get("/",((e,t,a)=>(0,s.listFacilities)(e.query.q).then((e=>t.json(e))).catch(a))),t.facilityRouter.get("/:id",((e,t,a)=>(0,s.findFacilityIdById)(e.params.id).then((e=>t.json(e))).catch(a)))},2933:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Instrument=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({serial:{type:l.DataTypes.STRING,primaryKey:!0},active:{type:l.DataTypes.BOOLEAN}},{sequelize:e,modelName:"Instrument",tableName:"Instrument",timestamps:!1})}static associate(e){}}t.Instrument=s},309:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.saveInstruments=t.fetchInstruments=void 0;const l=a(3695);t.fetchInstruments=function(){return l.sqliteModels.Instrument.findAll()},t.saveInstruments=function(e){return l.sqliteModels.Instrument.bulkCreate(e,{updateOnDuplicate:["active"]})}},1062:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.instrumentRouter=void 0;const l=a(6860),s=a(309);t.instrumentRouter=(0,l.Router)(),t.instrumentRouter.get("/",(function(e,t,a){(0,s.fetchInstruments)().then((e=>t.json(e))).catch(a)})),t.instrumentRouter.post("/",(function(e,t,a){(0,s.saveInstruments)(e.body).then((e=>t.json(e))).catch(a)}))},253:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.InventoryAdjustment=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.STRING,primaryKey:!0,autoIncrement:!0},type:{type:l.DataTypes.STRING},itemId:{type:l.DataTypes.STRING,references:{key:"id",model:"InventoryItem"}},batchId:{type:l.DataTypes.STRING},previousBatchAdjustmentId:{type:l.DataTypes.STRING},previousItemAdjustmentId:{type:l.DataTypes.STRING},quantity:{type:l.DataTypes.INTEGER},batchNumber:{type:l.DataTypes.STRING},expiry:{type:l.DataTypes.DATE},disposeReason:{type:l.DataTypes.STRING},narrative:{type:l.DataTypes.STRING},batchBalance:{type:l.DataTypes.INTEGER},itemBalance:{type:l.DataTypes.INTEGER},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"InventoryAdjustment",tableName:"InventoryAdjustment"})}static associate(e){e.InventoryAdjustment.belongsTo(e.InventoryItem,{as:"item",foreignKey:"batchId",targetKey:"id"})}}t.InventoryAdjustment=s},6911:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.findBatchWithItem=void 0;const l=a(3695);t.findBatchWithItem=function(e){return l.sequelize.query("\nselect * from (\n  select\n    Batch.id as id,\n    Item.id as itemId,\n    Item.name as name,\n    Item.image as image,\n    Item.unit as unit,\n    Batch.batchNumber as batchNumber,\n    Batch.expiry as expiry,\n    Adjustment.batchBalance as balance,\n    Batch.quantity as quantity,\n    Batch.createdAt,\n    Adjustment.createdAt as adjustedAt\n  from \n    InventoryAdjustment as Batch\n    left join InventoryItem as Item\n      on Item.id = Batch.itemId\n    left join InventoryAdjustment as Adjustment\n      on Adjustment.batchId = Batch.id or Adjustment.id = Batch.id\n  where Batch.id = :id\n  order by Adjustment.createdAt DESC\n) as BatchedItem\ngroup by BatchedItem.id\n",{replacements:{id:e}}).then((([[e]])=>e))}},2228:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.listBatchAdjustments=t.listBatches=void 0;const l=a(496),s=a(3695);t.listBatches=function(e){return s.sequelize.query("\nselect * from (  \n  select \n    Batch.id,\n    Batch.batchNumber,\n    Batch.expiry,\n    Batch.quantity,\n    Adjustment.batchBalance as balance,\n    Batch.createdAt,\n    Adjustment.createdAt as adjustedAt\n  from \n    InventoryAdjustment as Batch\n    left join InventoryAdjustment as Adjustment\n      on Batch.id = Adjustment.batchId OR Batch.id = Adjustment.id\n  where \n  Batch.itemId = :itemId AND Batch.type = 'in'\n  order by Adjustment.createdAt DESC\n) as Batches\ngroup by Batches.id\n",{replacements:{itemId:e}}).then((([e])=>e))},t.listBatchAdjustments=function(e){return s.sqliteModels.InventoryAdjustment.findAll({where:{[l.Op.or]:[{batchId:e},{id:e}]},order:[["createdAt","DESC"]]})}},1892:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.InventoryEntry=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.INTEGER,primaryKey:!0,autoIncrement:!0},type:{type:l.DataTypes.STRING},itemId:{type:l.DataTypes.INTEGER,references:{key:"id",model:"InventoryItem"}},quantity:{type:l.DataTypes.INTEGER},batchNumber:{type:l.DataTypes.STRING},expiry:{type:l.DataTypes.DATE},disposeReason:{type:l.DataTypes.STRING},narrative:{type:l.DataTypes.STRING},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"InventoryEntry",tableName:"InventoryEntry"})}static associate(e){e.InventoryEntry.hasOne(e.SyncItem,{as:"syncItem",foreignKey:"primaryId",scope:{list:"stock"}}),e.InventoryEntry.belongsTo(e.InventoryItem,{as:"item",foreignKey:"itemId"})}}t.InventoryEntry=s},6928:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.createEntry=void 0;const l=a(3695);t.createEntry=function(e){return l.sqliteModels.InventoryEntry.create(e)}},584:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.InventoryItem=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.STRING,primaryKey:!0},name:{type:l.DataTypes.STRING},image:{type:l.DataTypes.STRING},unit:{type:l.DataTypes.STRING},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"InventoryItem",tableName:"InventoryItem"})}static associate(e){e.InventoryItem.hasMany(e.InventoryAdjustment,{as:"lastAdjustment",foreignKey:"itemId",sourceKey:"id"})}}t.InventoryItem=s},3597:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.findItem=void 0;const l=a(3695);t.findItem=function(e){return l.sequelize.query("\nselect * from\n(\n  select \n    Item.id,\n    Item.name,\n    Item.image,\n    Item.unit,\n    Adjustment.itemBalance as balance,\n    Adjustment.createdAt as lastAdjustedAt,\n    OfflineEntries.offlineEntries\n  from \n    InventoryItem as Item \n    left join InventoryAdjustment as Adjustment \n      on Item.id = Adjustment.itemId\n    \n\n    left join \n      (\n        select \n          itemId,\n          sum(quantity) as offlineEntries \n        from SyncItem\n        left join InventoryEntry\n          on \n            InventoryEntry.id = SyncItem.primaryId \n            AND SyncItem.list = 'stock' \n            AND SyncItem.uploadedAt is NULL\n        group by itemId\n      ) as OfflineEntries\n      on Item.id = OfflineEntries.itemId\n\n  where Item.id = :id\n  order by Adjustment.createdAt DESC\n) as ItemBalances\ngroup by id\n",{replacements:{id:e}}).then((([[e]])=>e))}},6881:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.checkAndNotifyForStockUpdate=t.listItemsWithNegativeBatches=t.listItems=void 0;const l=a(3695),s=a(2228);function n(){return l.sqliteModels.InventoryItem.findAll().then((e=>Promise.all(e.map((e=>(0,s.listBatches)(e.id).then((t=>[e,t.filter((e=>e.balance<0))]))))))).then((e=>e.filter((([,e])=>e.length>0))))}t.listItems=function(){return l.sequelize.query("\n  select * from\n  (\n    select \n      Item.id,\n      Item.name,\n      Item.image,\n      Item.unit,\n      Adjustment.itemBalance as balance,\n      Adjustment.createdAt as lastAdjustedAt,\n      OfflineEntries.offlineEntries\n    from \n      InventoryItem as Item \n\n      left join InventoryAdjustment as Adjustment \n        on Item.id = Adjustment.itemId\n\n      left join \n        (\n          select \n            itemId,\n            sum(quantity) as offlineEntries \n          from InventoryEntry\n          right join SyncItem\n            on \n              InventoryEntry.id = SyncItem.primaryId \n              AND SyncItem.list = 'stock' \n              AND SyncItem.uploadedAt is NULL\n          group by itemId\n        ) as OfflineEntries\n        on Item.id = OfflineEntries.itemId\n\n    order by Adjustment.createdAt DESC\n  ) as ItemBalances\n  group by id\n").then((([e])=>e))},t.listItemsWithNegativeBatches=n,t.checkAndNotifyForStockUpdate=function(){return n().then((e=>{e.length}))}},9150:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.inventoryRouter=void 0;const l=a(6860),s=a(6928),n=a(6911),i=a(2228),r=a(3597),o=a(6881);t.inventoryRouter=(0,l.Router)(),t.inventoryRouter.get("/items",(function(e,t,a){return(0,o.listItems)().then((e=>t.json(e))).catch(a)})),t.inventoryRouter.get("/items/negative",(function(e,t,a){return(0,o.listItemsWithNegativeBatches)().then((e=>t.json(e))).catch(a)})),t.inventoryRouter.get("/items/:id",(function(e,t,a){return(0,r.findItem)(e.params.id).then((e=>t.json(e))).catch(a)})),t.inventoryRouter.get("/items/:id/batches",(function(e,t,a){return(0,i.listBatches)(e.params.id).then((e=>t.json(e))).catch(a)})),t.inventoryRouter.get("/batches/:id",(function(e,t,a){return(0,n.findBatchWithItem)(e.params.id).then((e=>t.json(e))).catch(a)})),t.inventoryRouter.get("/batches/:id/adjustments",(function(e,t,a){return(0,i.listBatchAdjustments)(e.params.id).then((e=>t.json(e))).catch(a)})),t.inventoryRouter.post("/entries",(function(e,t,a){return(0,s.createEntry)(e.body).then((e=>t.json(e))).catch(a)}))},4880:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.KeyValue=void 0;const l=a(496),s=a(3695);class n extends l.Model{}t.KeyValue=n,n.init({key:{type:l.DataTypes.STRING,primaryKey:!0},value:{type:l.DataTypes.JSON,get(){const e=this.getDataValue("value");return JSON.parse(e)},set(e){this.setDataValue("value",JSON.stringify(e))}}},{sequelize:s.sequelize,timestamps:!1,modelName:"KeyValue",tableName:"KeyValue"})},9968:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{o(l.next(e))}catch(e){n(e)}}function r(e){try{o(l.throw(e))}catch(e){n(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,r)}o((l=l.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.read=t.update=t.get=void 0;const s=a(9634),n=a(4880);t.get=function(e){return n.KeyValue.findByPk(e).then((e=>e?e.value:null))},t.update=function(e,t){return n.KeyValue.findOne({where:{key:e}}).then((a=>a?a.update({value:t}):n.KeyValue.create({key:e,value:t},{})))},t.read=function(){return l(this,void 0,void 0,(function*(){return n.KeyValue.findAll().then((e=>e.map((({key:e,value:t})=>({[e]:t}))))).then(s.mergeAll)}))}},2358:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Log=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.INTEGER,primaryKey:!0,autoIncrement:!0},value:{type:l.DataTypes.JSON,get(){const e=this.getDataValue("value");return JSON.parse(e)},set(e){this.setDataValue("value",JSON.stringify(e))}}},{sequelize:e,modelName:"Log",tableName:"Log"})}static associate(e){}}t.Log=s},5133:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.saveLog=void 0;const l=a(3695);t.saveLog=function(e){return l.sqliteModels.Log.create({value:e})}},7840:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MonthlySummary=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.INTEGER,autoIncrement:!0,primaryKey:!0},category:{type:l.DataTypes.STRING,allowNull:!1},reportMonth:{type:l.DataTypes.STRING,allowNull:!0},reportYear:{type:l.DataTypes.INTEGER,allowNull:!0},createdAt:{type:l.DataTypes.DATE,allowNull:!1},isDraft:{type:l.DataTypes.BOOLEAN,allowNull:!1,defaultValue:!0},afbData:{type:l.DataTypes.JSON,allowNull:!1,defaultValue:{}},lflamData:{type:l.DataTypes.JSON,allowNull:!1,defaultValue:{}},cultureData:{type:l.DataTypes.JSON,allowNull:!1,defaultValue:{}},dstData:{type:l.DataTypes.JSON,allowNull:!1,defaultValue:{}},eidData:{type:l.DataTypes.JSON,allowNull:!1,defaultValue:{}},vlData:{type:l.DataTypes.JSON,allowNull:!1,defaultValue:{}}},{sequelize:e,timestamps:!1,modelName:"MonthlySummary",tableName:"MonthlySummary"})}static associate(e){}}t.MonthlySummary=s},6054:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{o(l.next(e))}catch(e){n(e)}}function r(e){try{o(l.throw(e))}catch(e){n(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,r)}o((l=l.apply(e,t||[])).next())}))},s=this&&this.__rest||function(e,t){var a={};for(var l in e)Object.prototype.hasOwnProperty.call(e,l)&&t.indexOf(l)<0&&(a[l]=e[l]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var s=0;for(l=Object.getOwnPropertySymbols(e);s<l.length;s++)t.indexOf(l[s])<0&&Object.prototype.propertyIsEnumerable.call(e,l[s])&&(a[l[s]]=e[l[s]])}return a};Object.defineProperty(t,"__esModule",{value:!0}),t.MonthlySummaryService=void 0;const n=a(496),i=a(7840);t.MonthlySummaryService=class{static validateReportData(e){if(!e.category||!["TB","HIV"].includes(e.category))throw new Error("Invalid or missing category: must be TB or HIV");if(!e.reportMonth)throw new Error("Report month is required");if(!e.reportYear||"number"!=typeof e.reportYear)throw new Error("Report year is required and must be a number")}static validateCompleteData(e,t,a,l,s,n,i){const r=e=>null!=e&&("object"!=typeof e?"number"==typeof e:Object.values(e).every(r));if("TB"===e.category){if(!r(t))throw new Error("All AFB data fields must be filled");if(!r(a))throw new Error("All LF-LAM data fields must be filled");if(!r(l))throw new Error("All Culture data fields must be filled");if(!r(s))throw new Error("All DST data fields must be filled");const e=e=>"number"==typeof e.pos&&"number"==typeof e.neg,n=e=>!("number"!=typeof e.positive||"number"!=typeof e.negative||void 0!==e.pos0&&"number"!=typeof e.pos0||void 0!==e.neg0&&"number"!=typeof e.neg0||void 0!==e.pos5&&"number"!=typeof e.pos5||void 0!==e.neg5&&"number"!=typeof e.neg5||void 0!==e.ntm&&"number"!=typeof e.ntm||void 0!==e.cont&&"number"!=typeof e.cont),i=e=>"number"==typeof e.susc&&"number"==typeof e.res;Object.values(t.sex).forEach((t=>{if(!e(t))throw new Error("Invalid AfbData: sex")})),Object.values(t.age).forEach((t=>{if(!e(t))throw new Error("Invalid AfbData: age")})),Object.values(t.reason).forEach((t=>{if(!e(t))throw new Error("Invalid AfbData: reason")})),Object.values(t.method).forEach((t=>{if(!e(t))throw new Error("Invalid AfbData: method")})),Object.values(t.hiv).forEach((t=>{if(!e(t))throw new Error("Invalid AfbData: hiv")})),Object.values(l.method).forEach((e=>{if(!n(e))throw new Error("Invalid CultureData: method")})),Object.values(l.reason).forEach((e=>{if(!n(e))throw new Error("Invalid CultureData: reason")})),Object.values(l.sex).forEach((e=>{if(!n(e))throw new Error("Invalid CultureData: sex")})),Object.values(l.patientGroup).forEach((e=>{if(!n(e))throw new Error("Invalid CultureData: patientGroup")})),Object.values(l.hiv).forEach((e=>{if(!n(e))throw new Error("Invalid CultureData: hiv")})),Object.values(s.fl).forEach((e=>{if(!i(e))throw new Error("Invalid DstData: first-line")})),Object.values(s.sl).forEach((e=>{if(!i(e))throw new Error("Invalid DstData: second-line")}))}else{if("HIV"!==e.category)throw new Error("Invalid category: must be TB or HIV");{if(!r(i))throw new Error("All Viral Load fields must be filled");if(!r(n))throw new Error("All EID fields must be filled");const e=e=>"number"==typeof e.total&&"number"==typeof e.lt50&&"number"==typeof e["50to999"]&&"number"==typeof e.gte1000,t=e=>"number"==typeof e.total&&"number"==typeof e.notDetected&&"number"==typeof e.detected&&"number"==typeof e.indeterminate&&"number"==typeof e.error&&"number"==typeof e.invalid;Object.values(i.platform).forEach((t=>{if(!e(t))throw new Error("Invalid VlData: platform")})),Object.values(i.sex).forEach((t=>{if(!e(t))throw new Error("Invalid VlData: sex")})),Object.values(i.age).forEach((t=>{if(!e(t))throw new Error("Invalid VlData: age")})),Object.values(i.artRegimen).forEach((t=>{if(!e(t))throw new Error("Invalid VlData: artRegimen")})),Object.values(i.indication).forEach((t=>{if(!e(t))throw new Error("Invalid VlData: indication")})),Object.values(i.pregnancy).forEach((t=>{if(!e(t))throw new Error("Invalid VlData: pregnancy")})),Object.values(i.breastFeeding).forEach((t=>{if(!e(t))throw new Error("Invalid VlData: breastFeeding")})),Object.values(n.platform).forEach((e=>{if(!t(e))throw new Error("Invalid EidData: platform")})),Object.values(n.age).forEach((e=>{if(!t(e))throw new Error("Invalid EidData: age")})),Object.values(n.testType).forEach((e=>{if(!t(e))throw new Error("Invalid EidData: testType")}))}}}static getAllReports(e,t,a,s){return l(this,void 0,void 0,(function*(){const l=Object.assign(Object.assign({},e?{category:e}:{}),void 0!==s?{isDraft:s}:{});return t&&a&&(l.reportMonth={[n.Op.between]:[t,a]}),i.MonthlySummary.findAll({where:l})}))}static getDraftReports(e,t,a){return l(this,void 0,void 0,(function*(){return this.getAllReports(e,t,a,!0)}))}static getReportById(e){return l(this,void 0,void 0,(function*(){return i.MonthlySummary.findOne({where:{id:e}})}))}static createReport(e,t,a,n,r,o,u){return l(this,void 0,void 0,(function*(){const l=yield i.MonthlySummary.sequelize.transaction();try{if(this.validateReportData(e),e.reportMonth&&e.reportYear&&e.category&&(yield i.MonthlySummary.findOne({where:{reportMonth:e.reportMonth,reportYear:e.reportYear,category:e.category,isDraft:!1},transaction:l})))throw new Error("Report exists for the chosen month and category");const{id:d}=e,p=s(e,["id"]),y=Object.assign(Object.assign({},p),{category:e.category,isDraft:!0,createdAt:new Date});"TB"===e.category?(y.afbData=t,y.lflamData=a,y.cultureData=n,y.dstData=r):"HIV"===e.category&&(y.eidData=o,y.vlData=u);const c=yield i.MonthlySummary.create(y,{transaction:l});return yield l.commit(),c}catch(e){throw yield l.rollback(),e}}))}static updateReport(e,t,a,s,r,o,u,d){return l(this,void 0,void 0,(function*(){const l=yield i.MonthlySummary.sequelize.transaction();try{const p=yield i.MonthlySummary.findOne({where:{id:e},transaction:l});if(!p)throw new Error("Report not found");if(t.category&&!["TB","HIV"].includes(t.category))throw new Error("Invalid category: must be TB or HIV");if(t.reportMonth||t.reportYear||t.category){const a=t.reportMonth||p.reportMonth,s=t.reportYear||p.reportYear,r=t.category||p.category;yield i.MonthlySummary.findOne({where:{reportMonth:a,reportYear:s,category:r,id:{[n.Op.ne]:e},isDraft:!1},transaction:l})}const y=Object.assign({},t);return"TB"!==p.category&&"TB"!==t.category||(y.afbData=a,y.lflamData=s,y.cultureData=r,y.dstData=o),"HIV"!==p.category&&"HIV"!==t.category||(y.eidData=u,y.vlData=d),yield p.update(y,{transaction:l}),yield l.commit(),p}catch(e){throw yield l.rollback(),e}}))}static markReportAsComplete(e,t,a,r,o,u,d,p){return l(this,void 0,void 0,(function*(){const l=yield i.MonthlySummary.sequelize.transaction();try{let y;if(this.validateReportData(t),this.validateCompleteData(t,a,r,o,u,d,p),e){if(y=yield i.MonthlySummary.findOne({where:{id:e},transaction:l}),!y)throw new Error("Report not found");if(!y.isDraft)throw new Error("Report is already submitted");if(t.category&&!["TB","HIV"].includes(t.category))throw new Error("Invalid category");const s=t.reportMonth||y.reportMonth,c=t.reportYear||y.reportYear,_=t.category||y.category;if(yield i.MonthlySummary.findOne({where:{reportMonth:s,reportYear:c,category:_,id:{[n.Op.ne]:e},isDraft:!1},transaction:l}))throw new Error("Report exists for the chosen month and category");const m=Object.assign(Object.assign({},t),{isDraft:!1});"TB"===y.category?(m.afbData=a,m.lflamData=r,m.cultureData=o,m.dstData=u):(m.eidData=d,m.vlData=p),yield y.update(m,{transaction:l})}else{if(yield i.MonthlySummary.findOne({where:{reportMonth:t.reportMonth,reportYear:t.reportYear,category:t.category,isDraft:!1},transaction:l}))throw new Error("Report exists for the chosen month and category");const{id:e}=t,n=s(t,["id"]),c=Object.assign(Object.assign({},n),{category:t.category,isDraft:!1,createdAt:new Date});"TB"===t.category?(c.afbData=a,c.lflamData=r,c.cultureData=o,c.dstData=u):(c.eidData=d,c.vlData=p),y=yield i.MonthlySummary.create(c,{transaction:l})}return yield l.commit(),y}catch(e){throw yield l.rollback(),e}}))}static deleteReport(e){return l(this,void 0,void 0,(function*(){const t=yield i.MonthlySummary.sequelize.transaction();try{const a=yield i.MonthlySummary.findOne({where:{id:e},transaction:t});if(!a)throw new Error("Report not found");return yield a.destroy({transaction:t}),yield t.commit(),{message:"Report deleted successfully"}}catch(e){throw yield t.rollback(),e}}))}}},6093:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{o(l.next(e))}catch(e){n(e)}}function r(e){try{o(l.throw(e))}catch(e){n(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,r)}o((l=l.apply(e,t||[])).next())}))},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const n=s(a(6860)),i=a(6054),r=n.default.Router();r.get("/total",((e,t)=>l(void 0,void 0,void 0,(function*(){const{category:a,startMonth:l,endMonth:s,isDraft:n}=e.query;try{const e=yield i.MonthlySummaryService.getAllReports(a,l,s,void 0!==n?"true"===n:void 0);t.json(e)}catch(e){t.status(400).json({error:e.message})}})))),r.get("/drafts",((e,t)=>l(void 0,void 0,void 0,(function*(){const{category:a,startMonth:l,endMonth:s}=e.query;try{const e=yield i.MonthlySummaryService.getDraftReports(a,l,s);t.json(e)}catch(e){t.status(400).json({error:e.message})}})))),r.get("/:id",((e,t)=>l(void 0,void 0,void 0,(function*(){const{id:a}=e.params;try{const e=yield i.MonthlySummaryService.getReportById(parseInt(a));if(!e)return t.status(404).json({error:"Report not found"});t.json(e)}catch(e){t.status(400).json({error:e.message})}})))),r.post("/",((e,t)=>l(void 0,void 0,void 0,(function*(){const{report:a,afbData:l,lflamData:s,cultureData:n,dstData:r}=e.body;try{console.log("saving draft at database >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>============================");const e=yield i.MonthlySummaryService.createReport(a,l,s,n,r);t.status(201).json(e)}catch(e){t.status(400).json({error:e.message})}})))),r.put("/:id",((e,t)=>l(void 0,void 0,void 0,(function*(){const{id:a}=e.params,{report:l,afbData:s,lflamData:n,cultureData:r,dstData:o}=e.body;try{const e=yield i.MonthlySummaryService.updateReport(parseInt(a),l,s,n,r,o);t.json(e)}catch(e){t.status(400).json({error:e.message})}})))),r.post("/:id/complete",((e,t)=>l(void 0,void 0,void 0,(function*(){const{id:a}=e.params,{report:l,afbData:s,lflamData:n,cultureData:r,dstData:o,eidData:u,vlData:d}=e.body;try{const e=yield i.MonthlySummaryService.markReportAsComplete(parseInt(a)||null,l,s,n,r,o,u,d);t.json(e)}catch(e){t.status(400).json({error:e.message})}})))),r.delete("/:id",((e,t)=>l(void 0,void 0,void 0,(function*(){const{id:a}=e.params;try{const e=yield i.MonthlySummaryService.deleteReport(parseInt(a));t.json(e)}catch(e){t.status(400).json({error:e.message})}})))),t.default=r},8358:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Request=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.INTEGER,autoIncrement:!0,primaryKey:!0},testType:{type:l.DataTypes.STRING},sampleId:{type:l.DataTypes.STRING,allowNull:!1},mrn:{type:l.DataTypes.STRING},diagnosisType:{type:l.DataTypes.STRING},name:{type:l.DataTypes.STRING},age:{type:l.DataTypes.NUMBER},gender:{type:l.DataTypes.STRING},reasonForDiagnosis:{type:l.DataTypes.STRING},infectionSite:{type:l.DataTypes.STRING},previouslyTreated:{type:l.DataTypes.STRING},hivStatus:{type:l.DataTypes.STRING},isRepeatedRifResitanceTest:{type:l.DataTypes.STRING},sampleCollectedAt:{type:l.DataTypes.DATE},sampleCollectionSiteType:{type:l.DataTypes.STRING},sampleCollectionSiteId:{type:l.DataTypes.STRING},sampleType:{type:l.DataTypes.STRING},patientContacts:{type:l.DataTypes.STRING},clinicianContacts:{type:l.DataTypes.STRING},referringLabContacts:{type:l.DataTypes.STRING},patientRegistrationGroup:{type:l.DataTypes.STRING},isRepeatedConfirmatoryRifTest:{type:l.DataTypes.STRING},panelProvider:{type:l.DataTypes.STRING},panelScheme:{type:l.DataTypes.STRING},panelYear:{type:l.DataTypes.STRING},panelRound:{type:l.DataTypes.STRING},panelPtId:{type:l.DataTypes.STRING},verificationType:{type:l.DataTypes.STRING},laboratoryName:{type:l.DataTypes.STRING},address:{type:l.DataTypes.STRING},verificationDate:{type:l.DataTypes.DATE},testScheme:{type:l.DataTypes.STRING},instrumentSn:{type:l.DataTypes.STRING},moduleName:{type:l.DataTypes.STRING},moduleSn:{type:l.DataTypes.STRING},sampleLotNo:{type:l.DataTypes.STRING},eid:{type:l.DataTypes.JSON},viralLoad:{type:l.DataTypes.JSON},researchName:{type:l.DataTypes.STRING},isAutoApproved:{type:l.DataTypes.BOOLEAN,allowNull:!0},approvedById:{type:l.DataTypes.STRING,allowNull:!0,defaultValue:null},approvedByName:{type:l.DataTypes.STRING,allowNull:!0,defaultValue:null},approvedDate:{type:l.DataTypes.DATE,allowNull:!0,defaultValue:null},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"Request",tableName:"Request",timestamps:!0})}static associate(e){}}t.Request=s},48:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{o(l.next(e))}catch(e){n(e)}}function r(e){try{o(l.throw(e))}catch(e){n(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,r)}o((l=l.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.countPendingRequests=t.findPendingRequests=t.approveRequest=t.createRequest=t.findRequestDetail=t.findRequest=t.findAllRequests=void 0;const s=a(496),n=a(3695),i=a(1415);t.findAllRequests=function(){return n.sqliteModels.Request.findAll({order:[["createdAt","DESC"]]})},t.findRequest=function(e){return n.sqliteModels.Request.findOne({where:{sampleId:e},rejectOnEmpty:!0})},t.findRequestDetail=function(e){return l(this,void 0,void 0,(function*(){const t=yield n.sqliteModels.Request.findOne({where:{sampleId:e},rejectOnEmpty:!0});let a=null;if(t){const t=yield(0,i.createGeneXpertClient)();a=yield t.getTest(e)}return console.log("findRequestDetail",t),Object.assign(Object.assign({},t.dataValues),{test:a})}))},t.createRequest=function(e){return n.sqliteModels.Request.bulkCreate([e],{updateOnDuplicate:["age","clinicianContacts","gender","hivStatus","infectionSite","mrn","name","patientContacts","sampleId","testType","patientRegistrationGroup"]}).then((([e])=>e))},t.approveRequest=function(e){var t;return l(this,void 0,void 0,(function*(){const a=yield n.sqliteModels.Request.findOne({where:{sampleId:e.sampleId},rejectOnEmpty:!0});if(!a)throw new Error("Request not found");return yield a.update(Object.assign(Object.assign({},e),{isAutoApproved:null!==(t=e.isAutoApproved)&&void 0!==t&&t,approvedById:e.approvedById,approvedByName:e.approvedByName,approvedDate:new Date})),yield a.reload(),a}))},t.findPendingRequests=function(){return l(this,void 0,void 0,(function*(){const e=yield n.sqliteModels.Request.findAll({where:{sampleId:{[s.Op.not]:null},approvedDate:{[s.Op.is]:null}},order:[["createdAt","ASC"]]});console.log("requests",e);const t=e.map((e=>e.sampleId)),a=yield(0,i.createGeneXpertClient)(),l=yield a.getCompletedTestsBySampleIds(t);console.log("Completed requests",l);const r=new Set(l.map((e=>e.sampleId)));return e.filter((e=>r.has(e.sampleId)))}))},t.countPendingRequests=function(){var e;return l(this,void 0,void 0,(function*(){const t=yield n.sqliteModels.Request.findAll({attributes:["sampleId","createdAt","approvedDate"],where:{sampleId:{[s.Op.not]:null},approvedDate:{[s.Op.is]:null}},order:[["createdAt","ASC"]]}),a=t.map((e=>e.sampleId)),l=yield(0,i.createGeneXpertClient)(),r=yield l.getCompletedTestsBySampleIds(a),o=new Set(r.map((e=>e.sampleId))),u=t.filter((e=>o.has(e.sampleId)));return null!==(e=u.length)&&void 0!==e?e:0}))}},1759:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.requestsRouter=void 0;const l=a(6860),s=a(48);t.requestsRouter=(0,l.Router)(),t.requestsRouter.get("/",((e,t,a)=>Promise.resolve((0,s.findAllRequests)()).then((e=>t.json(e))).catch(a))),t.requestsRouter.post("/",((e,t,a)=>Promise.resolve((0,s.createRequest)(e.body)).then((e=>t.json(e))).catch(a))),t.requestsRouter.get("/:id",((e,t,a)=>Promise.resolve((0,s.findRequest)(e.params.id)).then((e=>t.json(e))).catch(a))),t.requestsRouter.get("/get-detail/:sampleId",((e,t,a)=>Promise.resolve((0,s.findRequestDetail)(e.params.sampleId)).then((e=>t.json(e))).catch(a))),t.requestsRouter.post("/approve",((e,t,a)=>Promise.resolve((0,s.approveRequest)(e.body)).then((e=>t.json(e))).catch(a))),t.requestsRouter.get("/pending-requests/fetch",((e,t,a)=>Promise.resolve((0,s.findPendingRequests)()).then((e=>t.json(e))).catch(a))),t.requestsRouter.get("/pending-requests/count",((e,t,a)=>Promise.resolve((0,s.countPendingRequests)()).then((e=>t.json({count:e}))).catch(a)))},3695:function(e,t,a){var l=this&&this.__createBinding||(Object.create?function(e,t,a,l){void 0===l&&(l=a);var s=Object.getOwnPropertyDescriptor(t,a);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,l,s)}:function(e,t,a,l){void 0===l&&(l=a),e[l]=t[a]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&l(t,e,a);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.sqliteModels=t.sequelize=void 0;const i=a(496),r=n(a(661)),o=a(4639),u=a(253),d=a(1892),p=a(584),y=a(2358),c=a(8358),_=a(7003),m=a(7214),T=a(2933),N=a(7761),g=a(7427),f=a(883),D=a(621),E=a(7840),b=a(7755),w=a(9931),[,,I]=process.argv;t.sequelize=new i.Sequelize({dialectModule:r,dialect:"sqlite",storage:I,logging:!1}),t.sqliteModels=function(e){const t=[o.CalibrationSummary,m.Facility,f.GeneXpertStatus,T.Instrument,u.InventoryAdjustment,d.InventoryEntry,p.InventoryItem,y.Log,c.Request,N.ServiceRequest,_.SyncItem,g.User,D.DailySummary,E.MonthlySummary,w.EqaSummary,b.ContactPerson].map((({initialize:t})=>t(e))).reduce(((e,t)=>Object.assign(Object.assign({},e),{[t.name]:t})),{});return Object.keys(t).forEach((e=>{var a,l;null===(l=null===(a=t[e])||void 0===a?void 0:a.associate)||void 0===l||l.call(a,t)})),t}(t.sequelize)},7761:function(e,t,a){var l=this&&this.__createBinding||(Object.create?function(e,t,a,l){void 0===l&&(l=a);var s=Object.getOwnPropertyDescriptor(t,a);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,l,s)}:function(e,t,a,l){void 0===l&&(l=a),e[l]=t[a]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&l(t,e,a);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.ServiceRequest=void 0;const i=a(496),r=n(a(5622));class o extends i.Model{static initialize(e){return o.init({id:{type:i.DataTypes.STRING,defaultValue:r.v4,primaryKey:!0},remoteId:{type:i.DataTypes.STRING},maintenanceNumber:{type:i.DataTypes.INTEGER},status:{type:i.DataTypes.STRING,defaultValue:"initiated"},issueType:{type:i.DataTypes.STRING},computerSerialNumber:{type:i.DataTypes.STRING},machineSerialNumber:{type:i.DataTypes.STRING,allowNull:!0},serialNumber:{type:i.DataTypes.STRING},failedModuleSerialNumber:{type:i.DataTypes.STRING},description:{type:i.DataTypes.STRING},photo:{type:i.DataTypes.JSON},installationQualificationReport:{type:i.DataTypes.STRING},systemLogReport:{type:i.DataTypes.STRING},resultArchiveReport:{type:i.DataTypes.STRING},createdAt:{type:i.DataTypes.DATE},updatedAt:{type:i.DataTypes.DATE}},{sequelize:e,modelName:"ServiceRequest",tableName:"ServiceRequest",timestamps:!0})}static associate(e){}}t.ServiceRequest=o},7483:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.createServiceRequest=t.findServiceRequest=t.listServiceRequests=void 0;const l=a(3695);t.listServiceRequests=function(){return l.sqliteModels.ServiceRequest.findAll({order:[["createdAt","DESC"]]})},t.findServiceRequest=function(e){return l.sqliteModels.ServiceRequest.findByPk(e,{rejectOnEmpty:!0})},t.createServiceRequest=function(e){return l.sqliteModels.ServiceRequest.create(e)}},1867:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.serviceRequestsRouter=void 0;const l=a(6860),s=a(7483);t.serviceRequestsRouter=(0,l.Router)(),t.serviceRequestsRouter.get("/",((e,t,a)=>Promise.resolve((0,s.listServiceRequests)()).then((e=>t.json(e))).catch(a))),t.serviceRequestsRouter.post("/",((e,t,a)=>Promise.resolve((0,s.createServiceRequest)(e.body)).then((e=>t.json(e))).catch(a))),t.serviceRequestsRouter.get("/:id",((e,t,a)=>Promise.resolve((0,s.findServiceRequest)(e.params.id)).then((e=>t.json(e))).catch(a)))},883:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GeneXpertStatus=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.STRING,primaryKey:!0},state:{type:l.DataTypes.JSON},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"GeneXpertStatus",tableName:"GeneXpertStatus",timestamps:!0})}static associate(e){}}t.GeneXpertStatus=s},7427:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.User=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.STRING,primaryKey:!0},name:{type:l.DataTypes.STRING}},{sequelize:e,modelName:"User",tableName:"User"})}static associate(e){}}t.User=s},7158:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.findAllUsers=void 0;const l=a(3695);t.findAllUsers=function(){return l.sqliteModels.User.findAll()}},4592:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.usersRouter=void 0;const l=a(6860),s=a(7158);t.usersRouter=(0,l.Router)(),t.usersRouter.get("/",((e,t,a)=>Promise.resolve((0,s.findAllUsers)()).then((e=>t.json(e))).catch(a)))},7003:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SyncItem=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({list:{type:l.DataTypes.STRING,allowNull:!1,primaryKey:!0},direction:{type:l.DataTypes.STRING,allowNull:!1,primaryKey:!0,defaultValue:"up"},primaryId:{type:l.DataTypes.STRING,allowNull:!1,primaryKey:!0},secondaryId:{type:l.DataTypes.STRING,allowNull:!0},version:{type:l.DataTypes.STRING,allowNull:!0},modifiedAt:{type:l.DataTypes.DATE,allowNull:!0},uploadedAt:{type:l.DataTypes.DATE,allowNull:!0},createdAt:{type:l.DataTypes.DATE,allowNull:!1},updatedAt:{type:l.DataTypes.DATE,allowNull:!1}},{sequelize:e,modelName:"SyncItem",tableName:"SyncItem",timestamps:!0})}static associate(e){}}t.SyncItem=s},2166:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.findTestsForDataEntry=t.checkAndNotifyForDataEntry=void 0;const s=l(a(2245)),n=a(9634),i=a(496),r=a(3695),o=a(7219);function u(e,t){return r.sqliteModels.Request.findAll({where:{createdAt:{[i.Op.gt]:(0,s.default)().subtract(24,"hours").toDate()}}}).then((a=>(o.logger.info(`Found ${a.length} requests for data entry query.`),e.testsForEntry((0,n.pluck)("sampleId",a),t)))).catch((e=>{throw o.logger.error("Error in findTestsForDataEntry db or query errors:",e),e}))}t.checkAndNotifyForDataEntry=function(e){return u(e).then((e=>{var t;0!==e.length?(o.logger.info(`Found ${e.length} tests for data entry. Triggering popup.`),null===(t=process.send)||void 0===t||t.call(process,{type:"trigger-data-entry"})):o.logger.info("No tests found for data entry.")})).catch((e=>{o.logger.error("Error in checkAndNotifyForDataEntry:",e)}))},t.findTestsForDataEntry=u},5509:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.testsRouter=void 0;const l=a(6860),s=a(1415),n=a(2166);t.testsRouter=(0,l.Router)(),t.testsRouter.get("/",((e,t)=>(0,s.createGeneXpertClient)().then((t=>(0,n.findTestsForDataEntry)(t,parseInt(e.query.hours,10)))).then((e=>t.json(e)))))},3571:function(e,t,a){var l=this&&this.__createBinding||(Object.create?function(e,t,a,l){void 0===l&&(l=a);var s=Object.getOwnPropertyDescriptor(t,a);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,l,s)}:function(e,t,a,l){void 0===l&&(l=a),e[l]=t[a]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&l(t,e,a);return s(t,e),t},i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),a(4804);const r=n(a(3986)),o=i(a(6860)),u=a(231),d=a(81),p=a(2577),y=a(1759),c=a(5509),_=a(7219),m=a(1895),T=a(195),N=a(9150),g=a(324),f=a(1062),D=a(3405),E=a(3963),b=a(1867),w=a(4592),I=i(a(9310)),R=i(a(6093)),O=i(a(5115)),h=a(9524),M=(0,o.default)(),[,,,v]=process.argv;M.set("trust proxy","loopback"),M.use(g.cors),M.use(r.json({limit:"50mb"})),M.use(r.urlencoded({extended:!0})),M.use("/facilities",D.facilityRouter),M.use("/service",b.serviceRequestsRouter),M.use("/device",d.deviceRouter),M.use("/labs",p.labsRouter),M.use("/instruments",f.instrumentRouter),M.use("/logs",m.logRouter),M.use("/requests",y.requestsRouter),M.use("/tests",c.testsRouter),M.use("/calibrations",T.calibrationRouter),M.use("/inventory",N.inventoryRouter),M.use("/dismiss",E.dismissRouter),M.use("/users",w.usersRouter),M.use("/daily-summaries",I.default),M.use("/monthly-summary",R.default),M.use("/eqa",O.default),M.use("/contact-persons",h.contactPersonRouter),M.use(o.default.static(v)),M.use(g.catchErrors),M.listen(u.serverPort,(()=>{_.logger.info(`Listening on http://localhost:${u.serverPort}.`,"Press CTRL-C to stop\n")}))},2167:e=>{e.exports=require("axios")},3983:e=>{e.exports=require("bluebird")},3986:e=>{e.exports=require("body-parser")},5142:e=>{e.exports=require("dotenv")},8857:e=>{e.exports=require("electron-log")},6860:e=>{e.exports=require("express")},4804:e=>{e.exports=require("hostname-patcher")},2245:e=>{e.exports=require("moment")},9424:e=>{e.exports=require("mssql")},4768:e=>{e.exports=require("mssql/msnodesqlv8")},7104:e=>{e.exports=require("qs")},9634:e=>{e.exports=require("ramda")},496:e=>{e.exports=require("sequelize")},661:e=>{e.exports=require("sqlite3")},5622:e=>{e.exports=require("uuid")},3292:e=>{e.exports=require("fs/promises")},881:e=>{e.exports=JSON.parse('{"name":"medx-relay","description":"MedX Relay","version":"2.0.3","npmRebuild":false,"private":true,"main":"./build-electron/main.js","homepage":".","author":{"name":"MedX International","email":"info@medx.international","url":"https://medx.international"},"scripts":{"postinstall":"electron-builder install-app-deps","react:start":"cross-env BROWSER=none PORT=3001 react-scripts start","react:build":"react-scripts build","react:test":"react-scripts test","react:eject":"react-scripts eject","compile":"tsc --project tsconfig.json","compile:watch":"npm run compile -- --watch","predev":"npm run runtime-env","dev":"npm run compile && npm run dev:watch","dev:watch":"concurrently --kill-others-on-fail \\"npm run react:start\\" \\"npm run compile:watch\\" \\"npm run electron:watch\\"","electron:watch":"nodemon -d 5 -w dist/src/electron -w dist/src -i dist/src/ui  -x \\"npm run electron:start\\"","electron:start":"wait-on tcp:3001 && cross-env IS_DEV=true electron ./dist/src/main.js","electron:build":"cross-env NODE_ENV=production webpack --config webpack-back.config.js","prepack":"npm run clean && npm run runtime-env && npm run compile && npm run electron:build && npm run react:build","clean":"node ./fs.js rm build build-electron connect dist out","runtime-env":"node ./runtime-env.js","pack:win":"electron-builder -c builder.js --dir -w --ia32","dist:win":"electron-builder -c builder.js -w --ia32","pack:linux":"electron-builder -c builder.js --dir -l","dist:linux":"electron-builder -c builder.js -l","migration":"node migration.js","migrate:up":"npx ts-node src/store/migrate.ts"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"devDependencies":{"@emotion/react":"^11.10.0","@emotion/styled":"^11.10.0","@mui/icons-material":"^5.8.4","@mui/material":"^5.9.2","@tanstack/react-query":"^4.0.10","@testing-library/jest-dom":"^5.16.4","@testing-library/react":"^13.3.0","@testing-library/user-event":"^13.5.0","@types/bluebird":"^3.5.36","@types/glob":"^8.1.0","@types/jest":"^27.5.2","@types/mssql":"^8.0.3","@types/node":"^18.6.3","@types/ramda":"^0.28.15","@types/react":"^18.0.15","@types/react-dom":"^18.0.6","@types/sqlite3":"^3.1.8","@types/uuid":"^9.0.1","concurrently":"^7.3.0","cross-env":"^7.0.3","dotenv-webpack":"^8.0.1","electron":"^19.0.10","electron-builder":"^23.3.3","electron-icon-maker":"^0.0.5","electron-is-dev":"^2.0.0","json-to-ts":"^1.7.0","node-loader":"^2.0.0","nodemon":"^2.0.19","react":"^18.2.0","react-dom":"^18.2.0","react-router-dom":"^6.3.0","react-scripts":"5.0.1","sequelize-auto":"^0.8.8","sequelize-typescript-generator":"^8.4.1","string-replace-loader":"^3.1.0","typescript":"^4.7.4","wait-on":"^6.0.1","web-vitals":"^2.1.4","webpack-cli":"^4.10.0","webpack-node-externals":"^3.0.0"},"dependencies":{"@elife/pm2":"github:ernest-okot/pm2","axios":"^0.27.2","bluebird":"^3.7.2","bottleneck":"^2.19.5","dotenv":"^16.0.3","electron-log":"^4.4.8","electron-updater":"^5.2.1","express":"^4.18.1","glob":"^8.0.3","hostname-patcher":"^1.1.0","moment":"^2.29.4","msnodesqlv8":"^2.6.0","mssql":"^9.0.0","qs":"^6.11.0","ramda":"^0.28.0","react-hook-form":"^7.38.0","sequelize":"^6.21.3","sqlite3":"^5.1.1","umzug":"^3.2.1","uuid":"^9.0.0"}}')}},t={};!function a(l){var s=t[l];if(void 0!==s)return s.exports;var n=t[l]={exports:{}};return e[l].call(n.exports,n,n.exports,a),n.exports}(3571)})();(()=>{"use strict";var e={665:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(4026),n=a(7219);l.autoUpdater.autoDownload=!0,l.autoUpdater.on("checking-for-update",(function(){n.logger.info("Checking for update...")})),l.autoUpdater.on("update-available",(function(e){n.logger.info("Update available.")})),l.autoUpdater.on("update-not-available",(function(e){n.logger.info("Update not available.")})),l.autoUpdater.on("error",(function(e){n.logger.error("Error in auto-updater.",e)})),l.autoUpdater.on("download-progress",(function(e){n.logger.info(`${e.bytesPerSecond}b/s: ${e.transferred} / ${e.total}`)})),l.autoUpdater.on("update-downloaded",(function(e){n.logger.info("Update downloaded; installing..."),l.autoUpdater.quitAndInstall()})),setInterval((()=>{l.autoUpdater.checkForUpdatesAndNotify({title:"A new update is ready to install",body:"v{version} has been downloaded and will be automatically installed"})}),9e5)},231:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.requirePatientDetails=t.brand=t.serverPort=t.backendUrl=void 0,a(5142).config(),process.env,t.backendUrl="https://api.labxpert.ephi.gov.et",t.serverPort="4411",t.brand=JSON.parse('{"publisher":"MedX International Ltd","name":"LabXpert Relay","colors":{"primary":"#d05286","secondary":"#572345"},"logo":"","links":{"helpcenter":"https://labxpertsurveillance.tawk.help/","support":"https://tawk.to/chat/62de9ce937898912e95f8b2a/1g8qp9std?pop=1","website":"https://medx.international"}}'),t.requirePatientDetails=Boolean(JSON.parse("1"))},7219:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.logger=void 0;const n=l(a(8857));t.logger=n.default},2603:function(e,t,a){var l=this&&this.__createBinding||(Object.create?function(e,t,a,l){void 0===l&&(l=a);var n=Object.getOwnPropertyDescriptor(t,a);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,l,n)}:function(e,t,a,l){void 0===l&&(l=a),e[l]=t[a]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&l(t,e,a);return n(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.rollback=t.migrate=void 0;const s=a(714),r=a(496),u=o(a(661)),p=a(2748);function d(e){const t=new r.Sequelize({dialectModule:u,dialect:"sqlite",storage:e,logging:console.log}),a=new s.Umzug({migrations:p.migrations,context:t.getQueryInterface(),storage:new s.SequelizeStorage({sequelize:t}),logger:console});return{up:()=>a.up(),down:()=>a.down()}}t.migrate=function(e){const{up:t}=d(e);return t()},t.rollback=function(e){const{down:t}=d(e);return t()}},4069:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"00-add-key-value-table",up:({context:e})=>e.createTable("KeyValue",{key:{type:l.DataTypes.STRING,primaryKey:!0,allowNull:!1},value:{type:l.DataTypes.JSON,allowNull:!0}}),down:({context:e})=>e.dropTable("KeyValue")};t.default=n},5891:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"01-add-sync-item-table",up:({context:e})=>e.createTable("SyncItem",{list:{type:l.DataTypes.STRING,allowNull:!1},version:{type:l.DataTypes.STRING,allowNull:!0},localId:{type:l.DataTypes.NUMBER,allowNull:!1},modifiedAt:{type:l.DataTypes.DATE,allowNull:!0},remoteId:{type:l.DataTypes.STRING,allowNull:!0},uploadedAt:{type:l.DataTypes.DATE,allowNull:!0},createdAt:{type:l.DataTypes.DATE,allowNull:!1},updatedAt:{type:l.DataTypes.DATE,allowNull:!1}}).then((()=>e.addConstraint("SyncItem",{type:"primary key",fields:["list","localId"],name:"SyncItem_pkey"}))).then((()=>e.addIndex("SyncItem",["list"],{name:"list-index",unique:!1}))).then((()=>e.addIndex("SyncItem",["modifiedAt"],{name:"modifiedAt-index"}))),down:({context:e})=>e.dropTable("SyncItem")};t.default=n},331:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"02-add-log-table",up:({context:e})=>e.createTable("Log",{id:{type:l.DataTypes.INTEGER,primaryKey:!0,autoIncrement:!0},value:{type:l.DataTypes.JSON,allowNull:!1},createdAt:{type:l.DataTypes.DATE,allowNull:!1},updatedAt:{type:l.DataTypes.DATE,allowNull:!1}}),down:({context:e})=>e.dropTable("Log")};t.default=n},8423:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"03-add-requests-table",up:({context:e})=>e.createTable("Request",{id:{type:l.DataTypes.INTEGER,autoIncrement:!0,primaryKey:!0},status:{type:l.DataTypes.STRING,defaultValue:"initiated"},testType:{type:l.DataTypes.STRING},sampleId:{type:l.DataTypes.STRING,allowNull:!1},mrn:{type:l.DataTypes.STRING},name:{type:l.DataTypes.STRING},age:{type:l.DataTypes.NUMBER},gender:{type:l.DataTypes.STRING},infectionSite:{type:l.DataTypes.STRING},hivStatus:{type:l.DataTypes.STRING},patientContacts:{type:l.DataTypes.STRING},clinicianContacts:{type:l.DataTypes.STRING},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}}),down:({context:e})=>e.dropTable("Request")};t.default=n},689:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"04-trigger-reupload",up:({context:e})=>Promise.all([e.bulkDelete("SyncItem",{list:"tests"}),e.bulkDelete("KeyValue",{key:{[l.Op.in]:["tests_last_id","tests_last_modified","tests_saved","tests_total","tests_uploaded"]}})])};t.default=n},9455:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"05-add-calibrations-table",up:({context:e})=>e.createTable("CalibrationSummary",{id:{type:l.DataTypes.INTEGER,autoIncrement:!0,primaryKey:!0},name:{type:l.DataTypes.STRING},path:{type:l.DataTypes.STRING},content:{type:l.DataTypes.STRING},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}}),down:({context:e})=>e.dropTable("CalibrationSummary")};t.default=n},1325:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"06-remove-calibration-last-check",up:({context:e})=>Promise.all([e.bulkDelete("KeyValue",{key:{[l.Op.in]:["last_calibration_checked_at"]}})])};t.default=n},9525:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"07-trigger-reupload",up:({context:e})=>Promise.all([e.bulkDelete("SyncItem",{list:"tests"}),e.bulkDelete("KeyValue",{key:{[l.Op.in]:["tests_last_id","tests_last_modified","tests_saved","tests_total","tests_uploaded"]}})])};t.default=n},6290:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"08-add-inventory-item-table",up:({context:e})=>e.createTable("InventoryItem",{id:{type:l.DataTypes.INTEGER,primaryKey:!0,autoIncrement:!0},name:{type:l.DataTypes.STRING},image:{type:l.DataTypes.STRING},unit:{type:l.DataTypes.STRING},remoteId:{type:l.DataTypes.STRING,unique:!0},autoConsumption:{type:l.DataTypes.JSON},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}}),down:({context:e})=>e.dropTable("InventoryItem")};t.default=n},9459:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"09-add-first-inventory-items",up:({context:e})=>e.bulkInsert("InventoryItem",[{name:"Xpert® MTB/RIF Assay G4",image:"60ed2090-2206-47b6-af02-67b28bbce8ff-item.jpeg",unit:"cartridges",remoteId:"62d6bc052ae7ef78f7d10968",autoConsumption:JSON.stringify({enabled:!0,quantity:1,select:"cartridge",cartridgeTypes:["Xpert MTB-RIF A0","Xpert MTB-RIF AsH","Xpert MTB-RIF AssaH","Xpert MTB-RIF Assay G4"]})},{name:"Xpert® MTB/RIF Ultra",image:"62e05524-5609-41f9-8aab-f4fc4a602e56-item.jpeg",unit:"cartridges",remoteId:"62d6bb7a2ae7ef78f7d10930",autoConsumption:JSON.stringify({enabled:!0,quantity:1,select:"cartridge",cartridgeTypes:["Xpert MTB-RIF Ultra"]})},{name:"Xpert® MTB/XDR",image:"81a70998-c570-49b7-9f13-264065cca3eb-item.jpeg",unit:"pieces",remoteId:"63625f1733e93d8e81cbdb78",autoConsumption:JSON.stringify({enabled:!0,quantity:1,select:"any"})},{name:"Falcon Tube",image:"025f21ed-6604-4ef5-bab9-0fc7ca4c4529-item.jpeg",unit:"pieces",remoteId:"63625c9733e93d8e81cbd244",autoConsumption:JSON.stringify({enabled:!0,quantity:1,select:"any"})}]),down({context:e}){const t={remoteId:{[l.Op.in]:["62d6bc052ae7ef78f7d10968","62d6bb7a2ae7ef78f7d10930","63625f1733e93d8e81cbdb78","63625c9733e93d8e81cbd244"]}};return e.bulkDelete("InventoryItem",t,{})}};t.default=n},9613:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"10-add-inventory-entry-table",up:({context:e})=>e.createTable("InventoryEntry",{id:{type:l.DataTypes.INTEGER,primaryKey:!0,autoIncrement:!0},type:{type:l.DataTypes.STRING},itemId:{type:l.DataTypes.INTEGER,references:{key:"id",model:"InventoryItem"}},batchId:{type:l.DataTypes.INTEGER},quantity:{type:l.DataTypes.INTEGER},batchNumber:{type:l.DataTypes.STRING},expiry:{type:l.DataTypes.DATE},disposeReason:{type:l.DataTypes.STRING},narrative:{type:l.DataTypes.STRING},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}}),down:({context:e})=>e.dropTable("InventoryEntry")};t.default=n},2679:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"10-add-inventry-adjustment-table",up:({context:e})=>e.createTable("InventoryAdjustment",{id:{type:l.DataTypes.INTEGER,primaryKey:!0,autoIncrement:!0},type:{type:l.DataTypes.STRING},itemId:{type:l.DataTypes.INTEGER,references:{key:"id",model:"InventoryItem"}},remoteId:{type:l.DataTypes.STRING},batchId:{type:l.DataTypes.INTEGER},quantity:{type:l.DataTypes.INTEGER},batchNumber:{type:l.DataTypes.STRING},expiry:{type:l.DataTypes.DATE},disposeReason:{type:l.DataTypes.STRING},narrative:{type:l.DataTypes.STRING},batchBalance:{type:l.DataTypes.INTEGER},previousBatchAdjustmentId:{type:l.DataTypes.STRING},itemBalance:{type:l.DataTypes.INTEGER},previousItemAdjustmentId:{type:l.DataTypes.INTEGER,references:{key:"id",model:"InventoryAdjustment"}},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}}),down:({context:e})=>e.dropTable("InventoryAdjustment")};t.default=n},5186:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"11-add-instruments-table",up:({context:e})=>e.createTable("Instrument",{serial:{type:l.DataTypes.STRING,primaryKey:!0},active:{type:l.DataTypes.BOOLEAN}}),down:({context:e})=>e.dropTable("Instrument")};t.default=n},3938:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20221122020003-change-sync-item-table",up:({context:e})=>Promise.resolve().then((()=>e.removeConstraint("SyncItem","SyncItem_pkey"))).then((()=>e.renameColumn("SyncItem","localId","primaryId"))).then((()=>e.renameColumn("SyncItem","remoteId","secondaryId"))).then((()=>e.changeColumn("SyncItem","primaryId",{type:l.DataTypes.STRING,allowNull:!1}))).then((()=>e.addColumn("SyncItem","direction",{type:l.DataTypes.STRING,allowNull:!1,defaultValue:"up"}))).then((()=>e.addConstraint("SyncItem",{type:"primary key",fields:["list","direction","primaryId"],name:"SyncItem_pkey"}))),down:({context:e})=>Promise.resolve().then((()=>e.removeConstraint("SyncItem","SyncItem_pkey"))).then((()=>e.changeColumn("SyncItem","primaryId",{type:l.DataTypes.INTEGER,allowNull:!1}))).then((()=>e.renameColumn("SyncItem","primaryId","localId"))).then((()=>e.renameColumn("SyncItem","secondaryId","remoteId"))).then((()=>e.removeColumn("SyncItem","direction"))).then((()=>e.addConstraint("SyncItem",{type:"primary key",fields:["list","localId"],name:"SyncItem_pkey"})))};t.default=n},2955:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20221123103535-add-facility-table",up:({context:e})=>e.createTable("Facility",{id:{type:l.DataTypes.STRING,primaryKey:!0},name:{type:l.DataTypes.STRING,allowNull:!1}}),down:({context:e})=>e.dropTable("Facility")};t.default=n},7069:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20221129042422-fix-inventory-item-id",up:({context:e})=>e.dropTable("InventoryItem").then((()=>e.createTable("InventoryItem",{id:{type:l.DataTypes.STRING,primaryKey:!0},name:{type:l.DataTypes.STRING},image:{type:l.DataTypes.STRING},unit:{type:l.DataTypes.STRING},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}}))),down:({context:e})=>e.dropTable("InventoryItem").then((()=>e.createTable("InventoryItem",{id:{type:l.DataTypes.INTEGER,primaryKey:!0,autoIncrement:!0},name:{type:l.DataTypes.STRING},image:{type:l.DataTypes.STRING},unit:{type:l.DataTypes.STRING},remoteId:{type:l.DataTypes.STRING,unique:!0},autoConsumption:{type:l.DataTypes.JSON},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}})))};t.default=n},3276:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20221129042644-fix-inventory-adjustment",up:({context:e})=>e.dropTable("InventoryAdjustment").then((()=>e.createTable("InventoryAdjustment",{id:{type:l.DataTypes.STRING,primaryKey:!0},type:{type:l.DataTypes.STRING},itemId:{type:l.DataTypes.STRING,references:{key:"id",model:"InventoryItem"}},batchId:{type:l.DataTypes.STRING},previousBatchAdjustmentId:{type:l.DataTypes.STRING},previousItemAdjustmentId:{type:l.DataTypes.STRING},quantity:{type:l.DataTypes.INTEGER},batchNumber:{type:l.DataTypes.STRING},expiry:{type:l.DataTypes.DATE},disposeReason:{type:l.DataTypes.STRING},narrative:{type:l.DataTypes.STRING},batchBalance:{type:l.DataTypes.INTEGER},itemBalance:{type:l.DataTypes.INTEGER},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}}))),down:({context:e})=>e.dropTable("InventoryAdjustment").then((()=>e.createTable("InventoryAdjustment",{id:{type:l.DataTypes.INTEGER,primaryKey:!0,autoIncrement:!0},type:{type:l.DataTypes.STRING},itemId:{type:l.DataTypes.INTEGER,references:{key:"id",model:"InventoryItem"}},remoteId:{type:l.DataTypes.STRING},batchId:{type:l.DataTypes.INTEGER},quantity:{type:l.DataTypes.INTEGER},batchNumber:{type:l.DataTypes.STRING},expiry:{type:l.DataTypes.DATE},disposeReason:{type:l.DataTypes.STRING},narrative:{type:l.DataTypes.STRING},batchBalance:{type:l.DataTypes.INTEGER},previousBatchAdjustmentId:{type:l.DataTypes.INTEGER,references:{key:"id",model:"InventoryAdjustment"}},itemBalance:{type:l.DataTypes.INTEGER},previousItemAdjustmentId:{type:l.DataTypes.INTEGER,references:{key:"id",model:"InventoryAdjustment"}},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}})))};t.default=n},3105:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20230209030004-add-additional-test-details",up:({context:e})=>Promise.all([e.addColumn("Request","previouslyTreated",{type:l.DataTypes.BOOLEAN}),e.addColumn("Request","sampleCollectedAt",{type:l.DataTypes.DATE}),e.addColumn("Request","sampleCollectionSiteType",{type:l.DataTypes.STRING}),e.addColumn("Request","sampleCollectionSiteId",{type:l.DataTypes.STRING})]),down:({context:e})=>Promise.all([e.removeColumn("Request","previouslyTreated"),e.removeColumn("Request","sampleCollectedAt"),e.removeColumn("Request","sampleCollectionSiteType"),e.removeColumn("Request","sampleCollectionSiteId")])};t.default=n},4857:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20230211044210-trigger-registration",up:({context:e})=>e.bulkDelete("KeyValue",{key:{[l.Op.in]:["registration_token"]}})};t.default=n},4429:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20230223122419-request-treatment",up:({context:e})=>e.changeColumn("Request","previouslyTreated",{type:l.DataTypes.STRING}),down:({context:e})=>e.changeColumn("Request","previouslyTreated",{type:l.DataTypes.BOOLEAN})};t.default=n},999:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20230303123802-fix-adjustments",up:({context:e})=>e.dropTable("InventoryAdjustment").then((()=>e.createTable("InventoryAdjustment",{id:{type:l.DataTypes.STRING,primaryKey:!0},type:{type:l.DataTypes.STRING},itemId:{type:l.DataTypes.STRING},batchId:{type:l.DataTypes.STRING},previousBatchAdjustmentId:{type:l.DataTypes.STRING},previousItemAdjustmentId:{type:l.DataTypes.STRING},quantity:{type:l.DataTypes.INTEGER},batchNumber:{type:l.DataTypes.STRING},expiry:{type:l.DataTypes.DATE},disposeReason:{type:l.DataTypes.STRING},narrative:{type:l.DataTypes.STRING},batchBalance:{type:l.DataTypes.INTEGER},itemBalance:{type:l.DataTypes.INTEGER},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}}))),down:({context:e})=>e.dropTable("InventoryAdjustment").then((()=>e.createTable("InventoryAdjustment",{id:{type:l.DataTypes.STRING,primaryKey:!0},type:{type:l.DataTypes.STRING},itemId:{type:l.DataTypes.STRING,references:{key:"id",model:"InventoryItem"}},batchId:{type:l.DataTypes.STRING},previousBatchAdjustmentId:{type:l.DataTypes.STRING},previousItemAdjustmentId:{type:l.DataTypes.STRING},quantity:{type:l.DataTypes.INTEGER},batchNumber:{type:l.DataTypes.STRING},expiry:{type:l.DataTypes.DATE},disposeReason:{type:l.DataTypes.STRING},narrative:{type:l.DataTypes.STRING},batchBalance:{type:l.DataTypes.INTEGER},itemBalance:{type:l.DataTypes.INTEGER},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}})))};t.default=n},5398:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20230306071915-service-request",up:({context:e})=>e.createTable("ServiceRequest",{id:{type:l.DataTypes.STRING,primaryKey:!0},remoteId:{type:l.DataTypes.STRING},maintenanceNumber:{type:l.DataTypes.INTEGER},status:{type:l.DataTypes.STRING},issueType:{type:l.DataTypes.STRING},computerSerialNumber:{type:l.DataTypes.STRING},serialNumber:{type:l.DataTypes.STRING},failedModuleSerialNumber:{type:l.DataTypes.STRING},description:{type:l.DataTypes.STRING},photo:{type:l.DataTypes.JSON},installationQualificationReport:{type:l.DataTypes.STRING},systemLogReport:{type:l.DataTypes.STRING},resultArchiveReport:{type:l.DataTypes.STRING},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}}),down:({context:e})=>e.dropTable("ServiceRequest")};t.default=n},5582:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20230321023512-trigger-registration",up:({context:e})=>e.bulkDelete("KeyValue",{key:{[l.Op.in]:["registration_token"]}})};t.default=n},399:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20230321023534-trigger-reupload",up:({context:e})=>Promise.all([e.bulkDelete("SyncItem",{list:"tests"}),e.bulkDelete("KeyValue",{key:{[l.Op.in]:["tests_last_id","tests_last_modified","tests_saved","tests_total","tests_uploaded"]}})])};t.default=n},4352:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20230329024223-trigger-reupload-calibrations",up:({context:e})=>Promise.all([e.bulkDelete("SyncItem",{list:"calibrations"}),e.bulkDelete("KeyValue",{key:{[l.Op.in]:["calibrations_last_id","calibrations_last_modified","calibrations_saved","calibrations_total","calibrations_uploaded"]}})])};t.default=n},9241:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20230404011836-add-additional-test-details",up:({context:e})=>Promise.all([e.addColumn("Request","isRepeatedRifResitanceTest",{type:l.DataTypes.STRING}),e.addColumn("Request","panelProvider",{type:l.DataTypes.STRING}),e.addColumn("Request","panelScheme",{type:l.DataTypes.STRING}),e.addColumn("Request","panelYear",{type:l.DataTypes.STRING}),e.addColumn("Request","panelRound",{type:l.DataTypes.STRING}),e.addColumn("Request","panelPtId",{type:l.DataTypes.STRING}),e.addColumn("Request","researchName",{type:l.DataTypes.STRING})]),down:({context:e})=>Promise.all([e.removeColumn("Request","isRepeatedRifResitanceTest"),e.removeColumn("Request","panelProvider"),e.removeColumn("Request","panelScheme"),e.removeColumn("Request","panelYear"),e.removeColumn("Request","panelRound"),e.removeColumn("Request","panelPtId"),e.removeColumn("Request","researchName")])};t.default=n},4395:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20230405070114-delete-relay-logs",up:({context:e})=>Promise.all([e.bulkDelete("SyncItem",{list:"relaylogs"}),e.bulkDelete("KeyValue",{key:{[l.Op.in]:["relaylogs_last_id","relaylogs_last_modified","relaylogs_saved","relaylogs_total","relaylogs_uploaded"]}}),e.bulkDelete("Log",{})])};t.default=n},9175:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(1017),n=a(9496),o=a(3292),s=process.env.IS_DEV?(0,l.resolve)():n.app.getPath("userData"),r=(0,l.join)(s,"app.db"),u={name:"20230406125051-delete-relay-db",up:()=>(0,o.unlink)(r).catch(console.log)};t.default=u},6124:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20230408095506-trigger-registration",up:({context:e})=>e.bulkDelete("KeyValue",{key:{[l.Op.in]:["registration_token"]}})};t.default=n},7536:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20230412033718-trigger-reupload",up:({context:e})=>Promise.all([e.bulkDelete("SyncItem",{list:"relaylogs"}),e.bulkDelete("KeyValue",{key:{[l.Op.in]:["relaylogs_last_id","relaylogs_last_modified","relaylogs_saved","relaylogs_total","relaylogs_uploaded"]}}),e.bulkDelete("Log",{})])};t.default=n},7511:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20230417081216-add-users-table",up:({context:e})=>e.createTable("User",{id:{type:l.DataTypes.STRING,primaryKey:!0},name:{type:l.DataTypes.STRING},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}}),down:({context:e})=>e.dropTable("User")};t.default=n},4702:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20230612120428-trigger-reupload",up:({context:e})=>Promise.all([e.bulkDelete("SyncItem",{list:"tests"}),e.bulkDelete("KeyValue",{key:{[l.Op.in]:["tests_last_id","tests_last_modified","tests_saved","tests_total","tests_uploaded"]}})])};t.default=n},2214:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20230616020519-trigger-reupload",up:({context:e})=>Promise.all([e.bulkDelete("SyncItem",{list:"tests"}),e.bulkDelete("KeyValue",{key:{[l.Op.in]:["tests_last_id","tests_last_modified","tests_saved","tests_total","tests_uploaded"]}})])};t.default=n},6484:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20230629123413-trigger-reupload",up:({context:e})=>Promise.all([e.bulkDelete("SyncItem",{list:"tests"}),e.bulkDelete("KeyValue",{key:{[l.Op.in]:["tests_last_id","tests_last_modified","tests_saved","tests_total","tests_uploaded"]}})])};t.default=n},7539:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20230702033713-trigger-reupload",up:({context:e})=>Promise.all([e.bulkDelete("SyncItem",{list:"tests"}),e.bulkDelete("KeyValue",{key:{[l.Op.in]:["tests_last_id","tests_last_modified","tests_saved","tests_total","tests_uploaded"]}})])};t.default=n},6971:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20230706093536-add-genexpert-state",up:({context:e})=>e.createTable("GeneXpertStatus",{id:{type:l.DataTypes.STRING,primaryKey:!0},state:{type:l.DataTypes.JSON},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}}),down:({context:e})=>e.dropTable("GeneXpertStatus")};t.default=n},9673:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20230823041144-trigger-reupload",up:({context:e})=>Promise.all([e.bulkDelete("SyncItem",{list:"tests"}),e.bulkDelete("KeyValue",{key:{[l.Op.in]:["tests_last_id","tests_last_modified","tests_saved","tests_total","tests_uploaded"]}})])};t.default=n},9835:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20231017112820-trigger-reupload",up:({context:e})=>Promise.all([e.bulkDelete("SyncItem",{list:"tests"}),e.bulkDelete("KeyValue",{key:{[l.Op.in]:["tests_last_id","tests_last_modified","tests_saved","tests_total","tests_uploaded"]}})])};t.default=n},7507:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20240103085117-trigger-reupload",up:({context:e})=>Promise.all([e.bulkDelete("SyncItem",{list:"tests"}),e.bulkDelete("KeyValue",{key:{[l.Op.in]:["tests_last_id","tests_last_modified","tests_saved","tests_total","tests_uploaded"]}})])};t.default=n},4776:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20240122125943-trigger-reupload",up:({context:e})=>Promise.all([e.bulkDelete("SyncItem",{list:"tests"}),e.bulkDelete("KeyValue",{key:{[l.Op.in]:["tests_last_id","tests_last_modified","tests_saved","tests_total","tests_uploaded"]}})])};t.default=n},9346:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20241104032215-add-sample-type-lab-no",up:({context:e})=>Promise.all([e.addColumn("Request","reasonForDiagnosis",{type:l.DataTypes.STRING}),e.addColumn("Request","sampleType",{type:l.DataTypes.STRING}),e.addColumn("Request","referringLabContacts",{type:l.DataTypes.STRING})]),down:({context:e})=>Promise.all([e.removeColumn("Request","reasonForDiagnosis"),e.removeColumn("Request","sampleType"),e.removeColumn("Request","referringLabContacts")])};t.default=n},4289:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(n,o){function s(e){try{u(l.next(e))}catch(e){o(e)}}function r(e){try{u(l.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(s,r)}u((l=l.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const n=a(496),o={name:"20251001132500-create-daily-summary-table",up({context:e}){return l(this,void 0,void 0,(function*(){yield e.sequelize.transaction((t=>l(this,void 0,void 0,(function*(){yield e.createTable("DailySummary",{id:{type:n.DataTypes.INTEGER,autoIncrement:!0,primaryKey:!0,allowNull:!1},category:{type:n.DataTypes.STRING,allowNull:!1},numberOfSamplesReceived:{type:n.DataTypes.INTEGER,allowNull:!0},numberOfSamplesDone:{type:n.DataTypes.INTEGER,allowNull:!0},numberOfBacklogSamples:{type:n.DataTypes.INTEGER,allowNull:!0},numberOfRejectedSamples:{type:n.DataTypes.INTEGER,allowNull:!0},numberOfTestsReferred:{type:n.DataTypes.INTEGER,allowNull:!0},numberOfReferredTestResultsReturned:{type:n.DataTypes.INTEGER,allowNull:!0},reportDate:{type:n.DataTypes.DATE,allowNull:!1},createdAt:{type:n.DataTypes.DATE,allowNull:!1,defaultValue:n.DataTypes.NOW},isDraft:{type:n.DataTypes.BOOLEAN,allowNull:!1,defaultValue:!0},sampleRejections:{type:n.DataTypes.JSONB,allowNull:!0,defaultValue:[]},referrals:{type:n.DataTypes.JSONB,allowNull:!0,defaultValue:[]}},{transaction:t}),yield e.addConstraint("DailySummary",{type:"unique",fields:["category","reportDate"],name:"daily_summary_category_report_date_unique",transaction:t})}))))}))},down({context:e}){return l(this,void 0,void 0,(function*(){yield e.sequelize.transaction((t=>l(this,void 0,void 0,(function*(){yield e.dropTable("DailySummary",{transaction:t})}))))}))}};t.default=o},3139:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20250918132215-add-test-approval",up:({context:e})=>Promise.all([e.addColumn("Request","isAutoApproved",{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:null}),e.addColumn("Request","approvedById",{type:l.DataTypes.STRING,allowNull:!0,defaultValue:null}),e.addColumn("Request","approvedByName",{type:l.DataTypes.STRING,allowNull:!0,defaultValue:null}),e.addColumn("Request","approvedDate",{type:l.DataTypes.DATE,allowNull:!0,defaultValue:null})]),down:({context:e})=>Promise.all([e.removeColumn("Request","isAutoApproved"),e.removeColumn("Request","approvedById"),e.removeColumn("Request","approvedByName"),e.removeColumn("Request","approvedDate")])};t.default=n},429:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(n,o){function s(e){try{u(l.next(e))}catch(e){o(e)}}function r(e){try{u(l.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(s,r)}u((l=l.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const n=a(496),o={name:"20250929104300-create-monthly-summary-table",up({context:e}){return l(this,void 0,void 0,(function*(){yield e.sequelize.transaction((t=>l(this,void 0,void 0,(function*(){yield e.createTable("MonthlySummary",{id:{type:n.DataTypes.INTEGER,autoIncrement:!0,primaryKey:!0,allowNull:!1},category:{type:n.DataTypes.STRING,allowNull:!1},reportMonth:{type:n.DataTypes.STRING,allowNull:!0},reportYear:{type:n.DataTypes.INTEGER,allowNull:!0},createdAt:{type:n.DataTypes.DATE,allowNull:!1},isDraft:{type:n.DataTypes.BOOLEAN,allowNull:!1,defaultValue:!0},afbData:{type:n.DataTypes.JSON,allowNull:!1,defaultValue:{}},lflamData:{type:n.DataTypes.JSON,allowNull:!1,defaultValue:{}},cultureData:{type:n.DataTypes.JSON,allowNull:!1,defaultValue:{}},dstData:{type:n.DataTypes.JSON,allowNull:!1,defaultValue:{}}},{transaction:t})}))))}))},down({context:e}){return l(this,void 0,void 0,(function*(){yield e.sequelize.transaction((t=>l(this,void 0,void 0,(function*(){yield e.dropTable("MonthlySummary",{transaction:t})}))))}))}};t.default=o},3964:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20250930043225-add-contact-person-table",up:({context:e})=>e.createTable("ContactPerson",{id:{type:l.DataTypes.STRING,primaryKey:!0},name:{type:l.DataTypes.STRING},phone:{type:l.DataTypes.STRING},email:{type:l.DataTypes.STRING},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}}),down:({context:e})=>e.dropTable("ContactPerson")};t.default=n},6e3:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20251006090153-add-verification-test-details",up:({context:e})=>Promise.all([e.addColumn("Request","verificationType",{type:l.DataTypes.STRING,allowNull:!0,defaultValue:null}),e.addColumn("Request","laboratoryName",{type:l.DataTypes.STRING,allowNull:!0,defaultValue:null}),e.addColumn("Request","address",{type:l.DataTypes.STRING,allowNull:!0,defaultValue:null}),e.addColumn("Request","verificationDate",{type:l.DataTypes.DATE,allowNull:!0,defaultValue:null}),e.addColumn("Request","testScheme",{type:l.DataTypes.STRING,allowNull:!0,defaultValue:null}),e.addColumn("Request","instrumentSn",{type:l.DataTypes.STRING,allowNull:!0,defaultValue:null}),e.addColumn("Request","moduleName",{type:l.DataTypes.STRING,allowNull:!0,defaultValue:null}),e.addColumn("Request","moduleSn",{type:l.DataTypes.STRING,allowNull:!0,defaultValue:null}),e.addColumn("Request","sampleLotNo",{type:l.DataTypes.STRING,allowNull:!0,defaultValue:null}),e.addColumn("Request","eid",{type:l.DataTypes.JSON,allowNull:!0,defaultValue:null}),e.addColumn("Request","viralLoad",{type:l.DataTypes.JSON,allowNull:!0,defaultValue:null}),e.addColumn("Request","diagnosisType",{type:l.DataTypes.STRING,allowNull:!0,defaultValue:null})]),down:({context:e})=>Promise.all([e.removeColumn("Request","verificationType"),e.removeColumn("Request","laboratoryName"),e.removeColumn("Request","address"),e.removeColumn("Request","verificationDate"),e.removeColumn("Request","testScheme"),e.removeColumn("Request","instrumentSn"),e.removeColumn("Request","moduleName"),e.removeColumn("Request","moduleSn"),e.removeColumn("Request","sampleLotNo"),e.removeColumn("Request","eid"),e.removeColumn("Request","viralLoad"),e.removeColumn("Request","diagnosisType")])};t.default=n},8864:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20251009072953-add-is-primary-contact-column",up:({context:e})=>Promise.all([e.addColumn("ContactPerson","isPrimaryContact",{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1})]),down:({context:e})=>Promise.all([e.removeColumn("ContactPerson","isPrimaryContact")])};t.default=n},9420:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(n,o){function s(e){try{u(l.next(e))}catch(e){o(e)}}function r(e){try{u(l.throw(e))}catch(e){o(e)}}function u(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(s,r)}u((l=l.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0});const n=a(496),o={name:"20251103024752-add-eqa-summary-table",up({context:e}){return l(this,void 0,void 0,(function*(){yield e.sequelize.transaction((t=>l(this,void 0,void 0,(function*(){yield e.createTable("EqaSummary",{id:{type:n.DataTypes.INTEGER,autoIncrement:!0,primaryKey:!0,allowNull:!1},round:{type:n.DataTypes.INTEGER,allowNull:!1},reportYear:{type:n.DataTypes.INTEGER,allowNull:!0},createdAt:{type:n.DataTypes.DATE,allowNull:!1,defaultValue:n.DataTypes.NOW},xpertMTBUltraData:{type:n.DataTypes.JSON,allowNull:!0,defaultValue:null},truenatMTB:{type:n.DataTypes.JSON,allowNull:!0,defaultValue:null},xpertMTBXdrData:{type:n.DataTypes.JSON,allowNull:!0,defaultValue:null},afbData:{type:n.DataTypes.JSON,allowNull:!0,defaultValue:null},lflamData:{type:n.DataTypes.JSON,allowNull:!0,defaultValue:null},cultureData:{type:n.DataTypes.JSON,allowNull:!0,defaultValue:null},pdstData:{type:n.DataTypes.JSON,allowNull:!0,defaultValue:null},xpertHIV1QualAssay:{type:n.DataTypes.JSON,allowNull:!0,defaultValue:null},xpertHIV1ViralLoad:{type:n.DataTypes.JSON,allowNull:!0,defaultValue:null}},{transaction:t})}))))}))},down({context:e}){return l(this,void 0,void 0,(function*(){yield e.sequelize.transaction((t=>l(this,void 0,void 0,(function*(){yield e.dropTable("EqaSummary",{transaction:t})}))))}))}};t.default=o},4756:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20251023024636-add-eid-vl",up:({context:e})=>Promise.all([e.addColumn("MonthlySummary","eidData",{type:l.DataTypes.JSON,allowNull:!0,defaultValue:null}),e.addColumn("MonthlySummary","vlData",{type:l.DataTypes.JSON,allowNull:!0,defaultValue:null})]),down:({context:e})=>Promise.all([e.removeColumn("MonthlySummary","eidData"),e.removeColumn("MonthlySummary","vlData")])};t.default=n},1296:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20251105101924-add-patient-registration-group-isconfirmatory-tt",up:({context:e})=>Promise.all([e.addColumn("Request","patientRegistrationGroup",{type:l.DataTypes.STRING,allowNull:!0,defaultValue:null}),e.addColumn("Request","isRepeatedConfirmatoryRifTest",{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:null})]),down:({context:e})=>Promise.all([e.removeColumn("Request","patientRegistrationGroup"),e.removeColumn("Request","isRepeatedConfirmatoryRifTest")])};t.default=n},7750:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const l=a(496),n={name:"20251106132215-add-machine-serialnumber-to-maintenance",up:({context:e})=>Promise.all([e.addColumn("ServiceRequest","machineSerialNumber",{type:l.DataTypes.STRING,allowNull:!0,defaultValue:null})]),down:({context:e})=>Promise.all([e.removeColumn("ServiceRequest","machineSerialNumber")])};t.default=n},2748:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.migrations=void 0;const n=l(a(4069)),o=l(a(5891)),s=l(a(331)),r=l(a(8423)),u=l(a(689)),p=l(a(9455)),d=l(a(1325)),i=l(a(9525)),y=l(a(6290)),c=l(a(9459)),m=l(a(9613)),T=l(a(2679)),f=l(a(5186)),D=l(a(3938)),b=l(a(2955)),I=l(a(7069)),v=l(a(3276)),N=l(a(3105)),R=l(a(4857)),_=l(a(4429)),S=l(a(999)),g=l(a(5398)),w=l(a(5582)),h=l(a(399)),G=l(a(4352)),E=l(a(9241)),O=l(a(4395)),A=l(a(9175)),x=l(a(6124)),j=l(a(7536)),q=l(a(7511)),P=l(a(4702)),k=l(a(2214)),C=l(a(6484)),M=l(a(7539)),V=l(a(6971)),B=l(a(9673)),K=l(a(9835)),J=l(a(7507)),L=l(a(4776)),U=l(a(9346)),z=l(a(4289)),W=l(a(429)),X=l(a(3139)),F=l(a(6e3)),H=l(a(3964)),$=l(a(8864)),Y=l(a(1296)),Q=l(a(4756)),Z=l(a(9420)),ee=l(a(7750));t.migrations=[n.default,o.default,s.default,r.default,u.default,p.default,d.default,i.default,y.default,c.default,m.default,T.default,f.default,D.default,b.default,I.default,v.default,N.default,R.default,_.default,S.default,g.default,w.default,h.default,G.default,E.default,O.default,A.default,x.default,j.default,q.default,P.default,k.default,C.default,M.default,V.default,B.default,K.default,J.default,L.default,U.default,H.default,W.default,X.default,z.default,F.default,$.default,Y.default,Q.default,Z.default,ee.default]},8098:function(e,t,a){var l=this&&this.__createBinding||(Object.create?function(e,t,a,l){void 0===l&&(l=a);var n=Object.getOwnPropertyDescriptor(t,a);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,l,n)}:function(e,t,a,l){void 0===l&&(l=a),e[l]=t[a]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&l(t,e,a);return n(t,e),t},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.start=void 0,a(4804);const r=a(9496),u=o(a(1017)),p=s(a(8789)),d=a(1017);a(665);const i=a(881),y=a(7219),c=a(2603),m=a(3292),T=a(9634),f=a(231),D=process.env.IS_DEV,b=u.join(__dirname,"../public/icon.png"),I=D?(0,d.resolve)():r.app.getPath("userData"),v=(0,d.join)(I,"relay.db"),N=(0,d.join)(I,"downloads"),R=D?"http://localhost:3001":`file://${u.join(__dirname,"../build/index.html")}`;function _(){Promise.resolve().then(S).then(h).then(G).then((()=>(0,c.migrate)(v))).then(w).then(E).then(D?()=>{}:g)}function S(){if(!r.app.requestSingleInstanceLock())return r.app.quit();r.app.on("second-instance",(()=>{g().focus()}))}function g(){if(r.BrowserWindow.getAllWindows().length){const[e]=r.BrowserWindow.getAllWindows();return e}const e=new r.BrowserWindow({icon:b,webPreferences:{preload:u.join(__dirname,"./preload.js"),nodeIntegration:!0,webSecurity:!1},width:720,height:560,frame:!0,movable:!0,transparent:!1,autoHideMenuBar:!0});return e.setTitle(f.brand.name),e.loadURL(R),e.on("minimize",(()=>r.BrowserWindow.getAllWindows().map((e=>e.close())))),e}function w(){const e=[{name:"api",script:u.join(__dirname,"./api.js"),args:[v,N],stdio:["ipc"]},{name:"pull",script:u.join(__dirname,"./pull.js"),args:[v,N],stdio:["ipc"]},{name:"push",script:u.join(__dirname,"./push.js"),args:[v,N],stdio:["ipc"]},{name:"prompt",script:u.join(__dirname,"./prompt.js"),args:[v,N],stdio:["ipc"]}];return(0,m.mkdir)(N,{recursive:!0}).then((()=>Promise.all(e.map((e=>new Promise(((t,a)=>{p.default.start(e,((l,n)=>{if(l)return y.logger.error(l),a(l);y.logger.info("Started "+e.name),t(n)}))}))))))).then((e=>(e.forEach((e=>e.child.on("message",k))),e)))}function h(){const e=new r.Tray(b),t=r.Menu.buildFromTemplate([{label:"Open",click:O},{label:"Close",click:A},{label:"Debug",submenu:[{label:"Dev Tools",click:q},{label:"Toggle Kiosk Mode",click:()=>P()}]}]);e.on("click",(()=>{e.popUpContextMenu(t)})),e.setContextMenu(t)}function G(){var e;r.app.on("activate",(()=>g())),r.app.setLoginItemSettings({openAtLogin:!0,openAsHidden:!0}),r.app.setAboutPanelOptions({applicationName:f.brand.name,applicationVersion:i.version,website:null===(e=f.brand.links)||void 0===e?void 0:e.website,iconPath:b,authors:[f.brand.publisher]}),r.app.on("window-all-closed",(()=>{var e;null===(e=r.app.dock)||void 0===e||e.hide()}))}function E(){r.ipcMain.on("close",A),r.ipcMain.on("minimise",x),r.ipcMain.on("restart",j),r.ipcMain.on("kiosk",(()=>P(!1)))}function O(){g().focus()}function A(){r.BrowserWindow.getAllWindows().forEach((e=>e.close()))}function x(){r.BrowserWindow.getAllWindows().forEach((e=>e.minimize()))}function j(){r.app.relaunch(),r.app.exit()}function q(){r.BrowserWindow.getAllWindows().forEach((e=>e.webContents.openDevTools({mode:"right"})))}function P(e){const t=g(),a=(0,T.isNil)(e)?!t.isKiosk():e;t.setAlwaysOnTop(a),t.setKiosk(a)}function k(e){y.logger.info("IPC message received : request for popup",e),"trigger-data-entry"!==e.type?"trigger-stock-update"!==e.type?"trigger-lab-selection"!==e.type||C("lab"):C("stock"):C("tests")}function C(e){const t={tests:"tests/0",stock:"stock",lab:"lab"},a=g(),l=a.webContents.getURL(),n=t[e];return a.isAlwaysOnTop()||a.setAlwaysOnTop(!0),a.isKiosk()||a.setKiosk(!0),Object.values(t).every((e=>!l.includes(e)))&&a.webContents.loadURL(`${R}#/${n}`),a}t.start=_,r.app.whenReady().then(_)},8789:e=>{e.exports=require("@elife/pm2")},5142:e=>{e.exports=require("dotenv")},9496:e=>{e.exports=require("electron")},8857:e=>{e.exports=require("electron-log")},4026:e=>{e.exports=require("electron-updater")},4804:e=>{e.exports=require("hostname-patcher")},9634:e=>{e.exports=require("ramda")},496:e=>{e.exports=require("sequelize")},661:e=>{e.exports=require("sqlite3")},714:e=>{e.exports=require("umzug")},3292:e=>{e.exports=require("fs/promises")},1017:e=>{e.exports=require("path")},881:e=>{e.exports=JSON.parse('{"name":"medx-relay","description":"MedX Relay","version":"2.0.3","npmRebuild":false,"private":true,"main":"./build-electron/main.js","homepage":".","author":{"name":"MedX International","email":"info@medx.international","url":"https://medx.international"},"scripts":{"postinstall":"electron-builder install-app-deps","react:start":"cross-env BROWSER=none PORT=3001 react-scripts start","react:build":"react-scripts build","react:test":"react-scripts test","react:eject":"react-scripts eject","compile":"tsc --project tsconfig.json","compile:watch":"npm run compile -- --watch","predev":"npm run runtime-env","dev":"npm run compile && npm run dev:watch","dev:watch":"concurrently --kill-others-on-fail \\"npm run react:start\\" \\"npm run compile:watch\\" \\"npm run electron:watch\\"","electron:watch":"nodemon -d 5 -w dist/src/electron -w dist/src -i dist/src/ui  -x \\"npm run electron:start\\"","electron:start":"wait-on tcp:3001 && cross-env IS_DEV=true electron ./dist/src/main.js","electron:build":"cross-env NODE_ENV=production webpack --config webpack-back.config.js","prepack":"npm run clean && npm run runtime-env && npm run compile && npm run electron:build && npm run react:build","clean":"node ./fs.js rm build build-electron connect dist out","runtime-env":"node ./runtime-env.js","pack:win":"electron-builder -c builder.js --dir -w --ia32","dist:win":"electron-builder -c builder.js -w --ia32","pack:linux":"electron-builder -c builder.js --dir -l","dist:linux":"electron-builder -c builder.js -l","migration":"node migration.js","migrate:up":"npx ts-node src/store/migrate.ts"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"devDependencies":{"@emotion/react":"^11.10.0","@emotion/styled":"^11.10.0","@mui/icons-material":"^5.8.4","@mui/material":"^5.9.2","@tanstack/react-query":"^4.0.10","@testing-library/jest-dom":"^5.16.4","@testing-library/react":"^13.3.0","@testing-library/user-event":"^13.5.0","@types/bluebird":"^3.5.36","@types/glob":"^8.1.0","@types/jest":"^27.5.2","@types/mssql":"^8.0.3","@types/node":"^18.6.3","@types/ramda":"^0.28.15","@types/react":"^18.0.15","@types/react-dom":"^18.0.6","@types/sqlite3":"^3.1.8","@types/uuid":"^9.0.1","concurrently":"^7.3.0","cross-env":"^7.0.3","dotenv-webpack":"^8.0.1","electron":"^19.0.10","electron-builder":"^23.3.3","electron-icon-maker":"^0.0.5","electron-is-dev":"^2.0.0","json-to-ts":"^1.7.0","node-loader":"^2.0.0","nodemon":"^2.0.19","react":"^18.2.0","react-dom":"^18.2.0","react-router-dom":"^6.3.0","react-scripts":"5.0.1","sequelize-auto":"^0.8.8","sequelize-typescript-generator":"^8.4.1","string-replace-loader":"^3.1.0","typescript":"^4.7.4","wait-on":"^6.0.1","web-vitals":"^2.1.4","webpack-cli":"^4.10.0","webpack-node-externals":"^3.0.0"},"dependencies":{"@elife/pm2":"github:ernest-okot/pm2","axios":"^0.27.2","bluebird":"^3.7.2","bottleneck":"^2.19.5","dotenv":"^16.0.3","electron-log":"^4.4.8","electron-updater":"^5.2.1","express":"^4.18.1","glob":"^8.0.3","hostname-patcher":"^1.1.0","moment":"^2.29.4","msnodesqlv8":"^2.6.0","mssql":"^9.0.0","qs":"^6.11.0","ramda":"^0.28.0","react-hook-form":"^7.38.0","sequelize":"^6.21.3","sqlite3":"^5.1.1","umzug":"^3.2.1","uuid":"^9.0.0"}}')}},t={};!function a(l){var n=t[l];if(void 0!==n)return n.exports;var o=t[l]={exports:{}};return e[l].call(o.exports,o,o.exports,a),o.exports}(8098)})();(()=>{"use strict";var e={298:e=>{e.exports=require("electron")}},r={};function n(s){var i=r[s];if(void 0!==i)return i.exports;var t=r[s]={exports:{}};return e[s](t,t.exports,n),t.exports}(()=>{const e=n(298),r={navigate(r){const n=(e,n)=>r(n);return e.ipcRenderer.addListener("navigate",n),()=>e.ipcRenderer.removeListener("log",n)},closeKiosk(){e.ipcRenderer.send("kiosk")},close(){e.ipcRenderer.send("close")},minimise(){e.ipcRenderer.send("minimise")},restart(){e.ipcRenderer.send("restart")},openFile(r){e.shell.openPath(r)},openBrowser(r){e.shell.openExternal(r)}};e.contextBridge.exposeInMainWorld("API",r)})()})();(()=>{"use strict";var e={7632:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.backendClient=void 0;const s=l(a(2167)),n=a(231),i=a(9968);t.backendClient=s.default.create({baseURL:`${n.backendUrl}/relay`,timeout:3e5}),t.backendClient.interceptors.request.use((e=>(0,i.get)("registration_token").then((t=>Object.assign(Object.assign({},e),{headers:Object.assign(Object.assign({},e.headers),{"Relay-Token":t})}))))),t.backendClient.interceptors.response.use((e=>e),(e=>{var t;return 401===(null===(t=e.response)||void 0===t?void 0:t.status)?(0,i.update)("registration_token",null).then((()=>Promise.reject(e))):Promise.reject(e)}))},231:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.requirePatientDetails=t.brand=t.serverPort=t.backendUrl=void 0,a(5142).config(),process.env,t.backendUrl="https://api.labxpert.ephi.gov.et",t.serverPort="4411",t.brand=JSON.parse('{"publisher":"MedX International Ltd","name":"LabXpert Relay","colors":{"primary":"#d05286","secondary":"#572345"},"logo":"","links":{"helpcenter":"https://labxpertsurveillance.tawk.help/","support":"https://tawk.to/chat/62de9ce937898912e95f8b2a/1g8qp9std?pop=1","website":"https://medx.international"}}'),t.requirePatientDetails=Boolean(JSON.parse("1"))},2473:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RegistrationError=void 0;class a extends Error{constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype)}}t.RegistrationError=a},8969:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.registerDevice=void 0;const s=l(a(2167)),n=a(231),i=a(1415),o=a(9968),r=a(2473);t.registerDevice=function(){return(0,i.createGeneXpertClient)().then((e=>(0,o.read)().then((t=>e.systemInfo().then((e=>{var a;return s.default.post(`${n.backendUrl}/relay/machines/register/`,Object.assign(Object.assign({},e),{labId:null===(a=null==t?void 0:t.lab)||void 0===a?void 0:a.id})).catch((e=>(console.error(e),Promise.reject(new r.RegistrationError(e.message))))).then((e=>e.data)).then((e=>"string"!=typeof e?Promise.reject(new r.RegistrationError("Invalid registration token")):(0,o.update)("registration_token",e)))}))))))}},7306:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.toSystemInfo=t.createSequelize=t.assaysForDataEntry=t.LAB_RESULT_APPROVAL_DEADLINE_HOURS=t.hoursForDataEntry=void 0;const s=a(9634),n=a(496),i=l(a(2245)),o=a(881);t.hoursForDataEntry=8,t.LAB_RESULT_APPROVAL_DEADLINE_HOURS=1,t.assaysForDataEntry=["Xpert MTB-RIF Assay G4","Xpert MTB-RIF Ultra","Xpert MTB-XDR","Xpert_HIV-1 Viral Load","Xpert_HIV-1 Qual","Xpert HIV-1 Qual XC DBS"],t.createSequelize=function(e,t,a){const l="win32"===process.platform&&"true"!==process.env.IS_DEV?{dialectModulePath:"msnodesqlv8/lib/sequelize",dialectOptions:{options:{connectionString:`server=(local);Database=${e};Trusted_Connection=Yes;Driver={SQL Server Native Client 11.0}`,trustedConnection:!0,requestTimeout:3e5}}}:{database:e,username:t,password:a,dialectOptions:{options:{useUTC:!1,dateFirst:1}}},s=Object.assign(Object.assign({},l),{dialect:"mssql",logging:!1,pool:{min:0,max:5,idle:1e4}});return new n.Sequelize(s)},t.toSystemInfo=function(e,t){const a=e.sort(((e,t)=>new Date(t.log_time).getTime()-new Date(e.log_time).getTime())).map(((e,t,a)=>({serial:e.site_serial_number.toString(),instrument:e.instrument_serial_number.toString(),replaced:a.indexOf(e)!==t,lastLoggedAt:new Date(e.log_time),disabled:!(0,s.isNil)(e.disabled_at),position:e.site_name.trim()}))),[l]=(0,s.pluck)("sw_version",e),n=function(e){const[t]=(0,s.groupWith)(((e,t)=>Math.abs((0,i.default)(t.lastLoggedAt).diff(e.lastLoggedAt,"day"))<7),function(e){return(0,s.groupWith)(((e,t)=>e.instrument===t.instrument),e.filter((e=>e.serial.length>3&&e.instrument.length>3&&!e.replaced))).map((e=>e.sort(((e,t)=>new Date(t.lastLoggedAt).getTime()-new Date(e.lastLoggedAt).getTime())))).map((([e])=>e))}(e)).map((e=>(0,s.uniq)(e.map((e=>e.instrument)))));return t}(a),r=function(e){const[t]=(0,s.groupWith)(((e,t)=>Math.abs((0,i.default)(t.lastLoggedAt).diff(e.lastLoggedAt,"day"))<7),function(e){return(0,s.groupWith)(((e,t)=>e.position[0]===t.position[0]),e.filter((e=>e.serial.length>3&&e.instrument.length>3&&!e.replaced))).map((e=>e.sort(((e,t)=>new Date(t.lastLoggedAt).getTime()-new Date(e.lastLoggedAt).getTime())))).map((([e])=>e))}(e)).map((e=>(0,s.uniq)(e.map((e=>e.position[0])))));return(0,s.uniq)(e.filter((e=>t.includes(e.position[0]))).map((e=>e.position)))}(a);return{version:l,relayVersion:o.version,config:t,sites:r,modules:a,instruments:n}}},1415:function(e,t,a){var l=this&&this.__createBinding||(Object.create?function(e,t,a,l){void 0===l&&(l=a);var s=Object.getOwnPropertyDescriptor(t,a);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,l,s)}:function(e,t,a,l){void 0===l&&(l=a),e[l]=t[a]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&l(t,e,a);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.createGeneXpertClient=void 0;const i={user:"sa",password:"F00tball"};function o(e){return"win32"===process.platform&&"true"!==process.env.IS_DEV?Promise.resolve().then((()=>n(a(4768)))).then((t=>t.connect({server:"(local)",database:e,options:{trustedConnection:!0}}))):Promise.resolve().then((()=>n(a(9424)))).then((t=>t.connect(Object.assign(Object.assign({},i),{database:e,requestTimeout:3e3,connectionTimeout:3e3,server:"127.0.0.1",pool:{max:10,min:0,idleTimeoutMillis:3e4},options:{encrypt:!1,trustServerCertificate:!0}}))))}t.createGeneXpertClient=function(){return o("master").then((e=>function(e){return e.query("SELECT name FROM master.sys.databases").then((e=>e.recordset.map((e=>e.name)).sort().find((e=>e.match(/gx_\w+/)))||Promise.reject(new Error("No genexpert database found"))))}(e).then((t=>e.close().then((()=>o(t))).then((e=>function(e){return e.query("SELECT sw_version FROM system_log ORDER BY log_time DESC OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY").then((e=>e.recordset)).then((([e])=>e?e.sw_version:Promise.reject(new Error("Unknown version"))))}(e))).then((e=>[e,t])))))).then((([e,t])=>function(e,t,l,s){const[i,o]=e.split(".");return"6"===i&&parseInt(o,10)>=5?Promise.resolve().then((()=>n(a(1058)))).then((({GeneXpertClient:a})=>new a(e,t,l,s))):"6"===i?Promise.resolve().then((()=>n(a(2522)))).then((({GeneXpertClient:a})=>new a(e,t,l,s))):"5"===i?Promise.resolve().then((()=>n(a(8207)))).then((({GeneXpertClient:a})=>new a(e,t,l,s))):"4"===i?Promise.resolve().then((()=>n(a(7556)))).then((({GeneXpertClient:a})=>new a(e,t,l,s))):Promise.reject(new Error(`GeneXpert Version ${e} is not currently supported`))}(e,t,i.user,i.password)))}},7556:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,o)}r((l=l.apply(e,t||[])).next())}))},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.GeneXpertClient=void 0;const n=s(a(2245)),i=a(9634),o=a(496),r=a(7306),p=a(1558),y="YYYY/MM/DD HH:mm:ss.SSS";t.GeneXpertClient=class{constructor(e,t,a,l){this.version=e,this.sequelize=(0,r.createSequelize)(t,a,l),this.models=(0,p.initModels)(this.sequelize)}systemInfo(){const e=this.sequelize.query("\n        SELECT TOP 1 WITH TIES\n          [sw_version],\n          [instrument_serial_number],\n          [dbo].[system_log].[site_serial_number],\n          [site_name],\n          [log_time],\n          [dbo].[disabled_module].[creation] AS [disabled_at]\n        FROM [dbo].[system_log]\n          LEFT JOIN [dbo].[disabled_module]\n          ON [dbo].[disabled_module].[site_serial_number] = [dbo].[system_log].[site_serial_number]\n        ORDER BY row_number() \n        OVER (PARTITION BY [dbo].[system_log].[site_serial_number] ORDER BY [log_time] DESC)\n      ").then((([e])=>e)),t=this.models.Config.findAll().then((e=>e.map((e=>({[e.param_key]:e.param_val}))))).then(i.mergeAll);return Promise.all([e,t]).then((e=>(0,r.toSystemInfo)(...e)))}logsTotal(){return this.models.SystemLog.count()}testsTotal(){return this.models.Test.count()}testsPresyncables(e,t,a){return this.models.Test.findAll({where:{[o.Op.or]:[{modified:{[o.Op.gt]:(0,n.default)(e).format(y)}},{modified:{[o.Op.eq]:(0,n.default)(e).format(y)},test_ID:{[o.Op.notIn]:t}}]},attributes:["test_ID","modified"],limit:a,order:[["modified","ASC"]]}).then((e=>e.map((({test_ID:e,modified:t})=>({id:e.toString(),modified:(0,n.default)(t,y).toDate()})))))}testsSyncables(e){return this.models.Test.findAll({where:{test_ID:e},include:[{as:"operator",model:this.models.User},{as:"test_errors",model:this.models.TestPcError},{as:"test_run",model:this.models.TestRun,attributes:{exclude:["data","cartridge_barcode"]}},{as:"patient_test_order",model:this.models.PatientTestOrder,include:[{as:"patient",model:this.models.Patient}]},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]}},{as:"analyte_results",model:this.models.AnalyteResult,include:[{as:"analyte",model:this.models.Analyte}]},{as:"organism_results",model:this.models.OrganismResult,include:[{as:"organism",model:this.models.Organism}]}]}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.test_ID.toString()}))))}testsForEntry(e,t){return this.models.Test.findAll({where:{start_time:{[o.Op.gt]:(0,n.default)().subtract(t||r.hoursForDataEntry,"hours").format(y)},sample_ID:{[o.Op.notIn]:e}},include:[{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t;return{id:e.test_ID,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(e.end_time,y).toDate(),sampleId:e.sample_ID,startedAt:(0,n.default)(e.start_time,y).toDate()}}))))}logsPresyncables(e,t,a){return this.models.SystemLog.findAll({where:{[o.Op.or]:[{log_time:{[o.Op.gt]:(0,n.default)(e).format(y)}},{log_time:{[o.Op.eq]:(0,n.default)(e).format(y)},system_log_ID:{[o.Op.notIn]:t}}]},limit:a,attributes:["system_log_ID","log_time"],order:[["log_time","ASC"]]}).then((e=>e.map((({system_log_ID:e,log_time:t})=>({id:e.toString(),modified:(0,n.default)(t,y).toDate()})))))}logsSyncables(e){return this.models.SystemLog.findAll({where:{system_log_ID:{[o.Op.in]:e}}}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.system_log_ID.toString()}))))}close(){return this.sequelize.close()}getTest(e){return l(this,void 0,void 0,(function*(){return this.models.Test.findOne({where:{sample_ID:{[o.Op.eq]:e}}})}))}getTestsByTestIds(e){return this.models.Test.findAll({where:{test_ID:{[o.Op.in]:e}},include:[{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t;return{id:e.test_ID,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(e.end_time,y).toDate(),sampleId:e.sample_ID,startedAt:(0,n.default)(e.start_time,y).toDate()}}))))}getCompletedTestsBySampleIds(e){return this.models.Test.findAll({where:{sample_ID:{[o.Op.in]:e},end_time:{[o.Op.and]:[{[o.Op.not]:null},{[o.Op.between]:[(0,n.default)().subtract(r.LAB_RESULT_APPROVAL_DEADLINE_HOURS,"hours").format(y),(0,n.default)().format(y)]}]},result_text:{[o.Op.not]:null}},include:[{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t;return{id:e.test_ID,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(e.end_time,y).toDate(),sampleId:e.sample_ID,startedAt:(0,n.default)(e.start_time,y).toDate()}}))))}}},892:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Advancestagesetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Advancestagesetting",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1},stage_number:{type:l.DataTypes.SMALLINT,allowNull:!0},protocol_number:{type:l.DataTypes.SMALLINT,allowNull:!0},new_stage_number:{type:l.DataTypes.SMALLINT,allowNull:!0},stop_after_new_stage:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},stop_if_no_ct:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},advance_stage_settings_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"advancestagesettings",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_advancestagesettings",unique:!0,fields:[{name:"advance_stage_settings_id"}]}]})}}t.Advancestagesetting=s},4878:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AnalyteResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AnalyteResultText",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},target_result_key:{type:l.DataTypes.STRING(8),allowNull:!0},result_text_reference:{type:l.DataTypes.SMALLINT,allowNull:!1}},{tableName:"analyte_result_text ",schema:"dbo",timestamps:!1})}}t.AnalyteResultText=s},804:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AnalyteResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AnalyteResult",{test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},expected_result:{type:l.DataTypes.SMALLINT,allowNull:!0},endpoint:{type:l.DataTypes.FLOAT,allowNull:!1},threshold:{type:l.DataTypes.FLOAT,allowNull:!1},cycle_threshold:{type:l.DataTypes.FLOAT,allowNull:!1},probe_check_result:{type:l.DataTypes.SMALLINT,allowNull:!0},probe_check_reading1:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_reading2:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_reading3:{type:l.DataTypes.FLOAT,allowNull:!0},error_status:{type:l.DataTypes.SMALLINT,allowNull:!0},target_result:{type:l.DataTypes.SMALLINT,allowNull:!0},ic_result:{type:l.DataTypes.SMALLINT,allowNull:!0},ec_result:{type:l.DataTypes.SMALLINT,allowNull:!0},spc_result:{type:l.DataTypes.SMALLINT,allowNull:!0},interpretation:{type:l.DataTypes.SMALLINT,allowNull:!0},second_deriv_peak_height:{type:l.DataTypes.FLOAT,allowNull:!0},nc_ic_endpoint:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:0},curve_fit_result:{type:l.DataTypes.SMALLINT,allowNull:!0},delta_ct:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-9999},TTP:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:0},quantitative_result:{type:l.DataTypes.FLOAT,allowNull:!0},iqs_lq_result:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:1},iqs_hq_result:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:1},analyte_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},reason:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"analyte_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK_analyte_result",unique:!0,fields:[{name:"analyte_result_id"}]},{name:"test_ID",fields:[{name:"test_ID"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.AnalyteResult=s},5745:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Analyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Analyte",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_index:{type:l.DataTypes.INTEGER,allowNull:!1},usage:{type:l.DataTypes.SMALLINT,allowNull:!0},target:{type:l.DataTypes.BLOB,allowNull:!0},analyte_name:{type:l.DataTypes.STRING(20),allowNull:!0},intended_concentration:{type:l.DataTypes.FLOAT,allowNull:!0},analyte_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},use_curve_fit:{type:l.DataTypes.BOOLEAN,allowNull:!0},enable_signal_loss_detection:{type:l.DataTypes.BOOLEAN,allowNull:!0},reporter_name:{type:l.DataTypes.STRING(12),allowNull:!1},boxcar_cycles:{type:l.DataTypes.SMALLINT,allowNull:!0},curve_analysis:{type:l.DataTypes.SMALLINT,allowNull:!0},background_start:{type:l.DataTypes.SMALLINT,allowNull:!0},background_end:{type:l.DataTypes.SMALLINT,allowNull:!0},cycle_if_no_ct:{type:l.DataTypes.SMALLINT,allowNull:!0},min_ct_req_pass_controls:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_on_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},curve_fit_start_background:{type:l.DataTypes.BOOLEAN,allowNull:!0},curve_fit_start_index:{type:l.DataTypes.SMALLINT,allowNull:!0},curve_fit_end_data:{type:l.DataTypes.BOOLEAN,allowNull:!0},curve_fit_end_index:{type:l.DataTypes.SMALLINT,allowNull:!0},curve_fit_min_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_nrse:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_slope_vs_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},background_min_points:{type:l.DataTypes.SMALLINT,allowNull:!0},background_look_back:{type:l.DataTypes.SMALLINT,allowNull:!0},background_validate:{type:l.DataTypes.BOOLEAN,allowNull:!0},background_max_slope:{type:l.DataTypes.FLOAT,allowNull:!0},background_max_rms_error:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_use_delta_pc:{type:l.DataTypes.BOOLEAN,allowNull:!0},probe_check_min_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_max_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},invalid_bias:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"analyte",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_analyte",unique:!0,fields:[{name:"analyte_id"}]},{name:"pos",fields:[{name:"analyte_index"}]}]})}}t.Analyte=s},4044:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayCartridge=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayCartridge",{assay_cartridge_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!0},need_lot_parameters:{type:l.DataTypes.BOOLEAN,allowNull:!1},need_ext_control:{type:l.DataTypes.BOOLEAN,allowNull:!1},ext_control_frq:{type:l.DataTypes.SMALLINT,allowNull:!0},cartridge_type_ID:{type:l.DataTypes.INTEGER,allowNull:!0},command_seq:{type:l.DataTypes.BLOB,allowNull:!0},melt_all_peaks:{type:l.DataTypes.BOOLEAN,allowNull:!1},use_background_subtraction:{type:l.DataTypes.BOOLEAN,allowNull:!1},air_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},overflow_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},comments:{type:l.DataTypes.STRING(256),allowNull:!0},command_seq_format:{type:l.DataTypes.SMALLINT,allowNull:!0},picture:{type:l.DataTypes.BLOB,allowNull:!0},read_interval:{type:l.DataTypes.INTEGER,allowNull:!0},prep_cartridge_shelf_life:{type:l.DataTypes.INTEGER,allowNull:!1},retain_cartridge:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"assay_cartridge",schema:"dbo",timestamps:!1,indexes:[{name:"PK_assay_cartridge",unique:!0,fields:[{name:"assay_cartridge_id"}]}]})}}t.AssayCartridge=s},8667:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayChamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayChamber",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!0},name:{type:l.DataTypes.STRING(16),allowNull:!0},initial_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},assay_chamber_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"assay_chamber",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"PK_assay_chamber",unique:!0,fields:[{name:"assay_chamber_id"}]}]})}}t.AssayChamber=s},4942:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Assay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Assay",{assay_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},pos:{type:l.DataTypes.INTEGER,allowNull:!0},name:{type:l.DataTypes.STRING(32),allowNull:!0},version:{type:l.DataTypes.SMALLINT,allowNull:!0},user_ID:{type:l.DataTypes.INTEGER,allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_verified:{type:l.DataTypes.BOOLEAN,allowNull:!0},comments:{type:l.DataTypes.STRING(256),allowNull:!0},lock_comments:{type:l.DataTypes.STRING(256),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},product_code:{type:l.DataTypes.SMALLINT,allowNull:!0},assay_type:{type:l.DataTypes.SMALLINT,allowNull:!0},disclaimer:{type:l.DataTypes.STRING(512),allowNull:!0},company_code:{type:l.DataTypes.SMALLINT,allowNull:!0},result_text_type:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:0},class:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:0},analysis_type:{type:l.DataTypes.SMALLINT,allowNull:!0},sample_prep_instruction:{type:l.DataTypes.STRING(256),allowNull:!0},sample_prep_video:{type:l.DataTypes.BLOB,allowNull:!0},test_code:{type:l.DataTypes.STRING(15),allowNull:!0},enable_test_code:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},enable_auto_archive:{type:l.DataTypes.BOOLEAN,allowNull:!1},default_result_text_reference:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:5},default_text_color_reference:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:3},clia_waived:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"assay",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_assay_ID",unique:!0,fields:[{name:"assay_ID"}]},{name:"pos",fields:[{name:"pos"}]}]})}}t.Assay=s},1163:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CalibrationChamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CalibrationChamber",{calibration_seq_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1,primaryKey:!0},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!0},name:{type:l.DataTypes.STRING(16),allowNull:!0},initial_volume:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"calibration_chamber",schema:"dbo",timestamps:!1,indexes:[{name:"calibration_seq_id",fields:[{name:"calibration_seq_id"}]},{name:"cartridge_ID",fields:[{name:"cartridge_id"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"PK_calibration_chamber",unique:!0,fields:[{name:"calibration_seq_id"},{name:"cartridge_id"},{name:"chamber_number"}]}]})}}t.CalibrationChamber=s},2632:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CalibrationSequence=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CalibrationSequence",{calibration_seq_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},pos:{type:l.DataTypes.INTEGER,allowNull:!0},name:{type:l.DataTypes.STRING(32),allowNull:!0},cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!0},command_seq:{type:l.DataTypes.BLOB,allowNull:!0},command_seq_format:{type:l.DataTypes.SMALLINT,allowNull:!0},air_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},comments:{type:l.DataTypes.STRING(256),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"calibration_sequence",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_calibration_sequence",unique:!0,fields:[{name:"calibration_seq_id"}]},{name:"pos",fields:[{name:"pos"}]}]})}}t.CalibrationSequence=s},4859:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CartridgeOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CartridgeOrder",{cartridge_order_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},sample_id:{type:l.DataTypes.STRING(25),allowNull:!0},scanned_SID:{type:l.DataTypes.BOOLEAN,allowNull:!0},scanned_PID:{type:l.DataTypes.BOOLEAN,allowNull:!0},priority:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0},rgt_lot_id:{type:l.DataTypes.STRING(6),allowNull:!1},cartridge_serial_number:{type:l.DataTypes.BIGINT,allowNull:!0},cartridge_expiration_date:{type:l.DataTypes.DATE,allowNull:!0},cartridge_barcode:{type:l.DataTypes.STRING(1024),allowNull:!0},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},other_sample_type_text:{type:l.DataTypes.STRING(32),allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_status:{type:l.DataTypes.STRING(32),allowNull:!0},order_sw_version:{type:l.DataTypes.STRING(16),allowNull:!1},cartridge_order_time:{type:l.DataTypes.STRING(24),allowNull:!0},cartridge_order_expiration:{type:l.DataTypes.STRING(24),allowNull:!0},location:{type:l.DataTypes.STRING(32),allowNull:!0},location_site:{type:l.DataTypes.INTEGER,allowNull:!0},lis_order_id:{type:l.DataTypes.INTEGER,allowNull:!1},test_type:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"cartridge_order",schema:"dbo",timestamps:!1,indexes:[{name:"PK_cartridge_order",unique:!0,fields:[{name:"cartridge_order_id"}]}]})}}t.CartridgeOrder=s},1544:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Cartridge=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Cartridge",{cartridge_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},name:{type:l.DataTypes.STRING(32),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},max_pressure:{type:l.DataTypes.SMALLINT,allowNull:!0},syringe_min_transfer_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},syringe_max_transfer_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},syringe_max_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_syringe_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_chamber_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},direct_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},filter_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},direct_flow_rate_min:{type:l.DataTypes.SMALLINT,allowNull:!0},direct_flow_rate_max:{type:l.DataTypes.SMALLINT,allowNull:!0},microliters_per_revolution:{type:l.DataTypes.FLOAT,allowNull:!0},initial_aspirate_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},initial_aspirate_flow_rate:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_pressurized_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},air_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},overflow_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},min_pressure:{type:l.DataTypes.SMALLINT,allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1,defaultValue:""},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},filter_flow_rate_min:{type:l.DataTypes.SMALLINT,allowNull:!0},filter_flow_rate_max:{type:l.DataTypes.SMALLINT,allowNull:!0},cartridge_foot_height:{type:l.DataTypes.INTEGER,allowNull:!0},adc_2_psi:{type:l.DataTypes.FLOAT,allowNull:!0},plunger_strip_position:{type:l.DataTypes.INTEGER,allowNull:!0},plunger_pickup_position:{type:l.DataTypes.INTEGER,allowNull:!0},picture:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"cartridge",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"name",fields:[{name:"name"}]},{name:"PK_cartridge_ID",unique:!0,fields:[{name:"cartridge_ID"}]},{name:"version",fields:[{name:"version"}]}]})}}t.Cartridge=s},3918:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Chamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Chamber",{cartridge_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1,primaryKey:!0},min_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},max_volume:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"chamber",schema:"dbo",timestamps:!1,indexes:[{name:"cartridge_ID",fields:[{name:"cartridge_ID"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"PK_chamber",unique:!0,fields:[{name:"cartridge_ID"},{name:"chamber_number"}]}]})}}t.Chamber=s},6038:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorDisclaimer=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ColorDisclaimer",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},color:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},disclaimer:{type:l.DataTypes.STRING(256),allowNull:!0}},{tableName:"color_disclaimer",schema:"dbo",timestamps:!1,indexes:[{name:"PK_color_disclaimer",unique:!0,fields:[{name:"assay_ID"},{name:"color"}]}]})}}t.ColorDisclaimer=s},87:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Config",{param_key:{type:l.DataTypes.STRING(64),primaryKey:!0,allowNull:!1},param_val:{type:l.DataTypes.STRING(512),allowNull:!1,defaultValue:""}},{tableName:"config",schema:"dbo",timestamps:!1})}}t.Config=s},2075:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CrosstalkFactor=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CrosstalkFactor",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},protocol_number:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:-1},factor:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:0},crosstalk_factor_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},from_analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},to_analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"crosstalk_factor",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_crosstalk_factor",unique:!0,fields:[{name:"crosstalk_factor_id"}]}]})}}t.CrosstalkFactor=s},1726:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DisabledModule=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("DisabledModule",{site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!0},creation:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"disabled_module",schema:"dbo",timestamps:!1,indexes:[{name:"PK_disabled_module",unique:!0,fields:[{name:"site_serial_number"}]}]})}}t.DisabledModule=s},7772:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Dtproperty=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Dtproperty",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},objectid:{type:l.DataTypes.INTEGER,allowNull:!0},property:{type:l.DataTypes.STRING(64),allowNull:!1,primaryKey:!0},value:{type:l.DataTypes.STRING(255),allowNull:!0},uvalue:{type:l.DataTypes.STRING(255),allowNull:!0},lvalue:{type:l.DataTypes.BLOB,allowNull:!0},version:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:0}},{tableName:"dtproperties",schema:"dbo",timestamps:!1,indexes:[{name:"pk_dtproperties",unique:!0,fields:[{name:"id"},{name:"property"}]}]})}}t.Dtproperty=s},2e3:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.FailedLocation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("FailedLocation",{location:{type:l.DataTypes.STRING(32),allowNull:!1,primaryKey:!0},location_site:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"failed_location",schema:"dbo",timestamps:!1,indexes:[{name:"PK_failed_location",unique:!0,fields:[{name:"location"},{name:"location_site"}]}]})}}t.FailedLocation=s},5033:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetting",{graph_setting_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},graph_type:{type:l.DataTypes.SMALLINT,allowNull:!1},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"assay_ID"}},param_key:{type:l.DataTypes.STRING(64),allowNull:!1},param_val:{type:l.DataTypes.STRING(512),allowNull:!1,defaultValue:""}},{tableName:"graph_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__graph_setting__408F9238",unique:!0,fields:[{name:"graph_setting_id"}]}]})}}t.GraphSetting=s},140:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetup",{graph_setup_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},pos:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!0},is_default:{type:l.DataTypes.BOOLEAN,allowNull:!1},user_ID:{type:l.DataTypes.INTEGER,allowNull:!0},settings:{type:l.DataTypes.INTEGER,allowNull:!0},format:{type:l.DataTypes.SMALLINT,allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_graph_setup",unique:!0,fields:[{name:"graph_setup_ID"}]},{name:"pos",fields:[{name:"pos"}]}]})}}t.GraphSetup=s},6281:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.HaplotypeResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("HaplotypeResultText",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(11),allowNull:!1,primaryKey:!0},alleles_text_1:{type:l.DataTypes.STRING(10),allowNull:!0},alleles_text_2:{type:l.DataTypes.STRING(10),allowNull:!0},text_color_reference:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"haplotype_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK_haplotype_result_text",unique:!0,fields:[{name:"assay_id"},{name:"haplotype_id"},{name:"result_key"}]}]})}}t.HaplotypeResultText=s},5038:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Haplotype=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Haplotype",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},name:{type:l.DataTypes.STRING(20),allowNull:!0},lis_test_code:{type:l.DataTypes.STRING(15),allowNull:!0}},{tableName:"haplotype",schema:"dbo",timestamps:!1,indexes:[{name:"PK_haplotype",unique:!0,fields:[{name:"assay_id"},{name:"haplotype_id"}]}]})}}t.Haplotype=s},7912:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.InfinitySystemLog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("InfinitySystemLog",{infinity_system_log_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1},code:{type:l.DataTypes.INTEGER,allowNull:!1},subsystem:{type:l.DataTypes.INTEGER,allowNull:!1},details:{type:l.DataTypes.STRING(512),allowNull:!0},log_time:{type:l.DataTypes.STRING(24),allowNull:!1},sw_version:{type:l.DataTypes.STRING(16),allowNull:!1},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"infinity_system_log",schema:"dbo",timestamps:!1,indexes:[{name:"PK_infinity_system_log",unique:!0,fields:[{name:"infinity_system_log_id"}]}]})}}t.InfinitySystemLog=s},1558:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestGraphSetup=t.TestBlogCounter=t.TestBlog=t.Test=t.SystemLog=t.Snp=t.SampleType=t.SampleSetting=t.RetainCartridgeColor=t.ReagentLot=t.QuantUnitSetting=t.QuantResult=t.Privilege=t.PatientTestOrder=t.Patient=t.Path=t.OrganismTarget=t.OrganismResultText=t.OrganismResultRule=t.OrganismResultEvaluator=t.OrganismResult=t.Organism=t.MeltPeakSetting=t.MeltPeakResult=t.LisTestOrder=t.Instrument=t.InfinitySystemLog=t.HaplotypeResultText=t.Haplotype=t.GraphSetup=t.GraphSetting=t.FailedLocation=t.Dtproperty=t.DisabledModule=t.CrosstalkFactor=t.Config=t.ColorDisclaimer=t.Chamber=t.CartridgeOrder=t.Cartridge=t.CalibrationSequence=t.CalibrationChamber=t.AssayChamber=t.AssayCartridge=t.Assay=t.AnalyteResultText=t.AnalyteResult=t.Analyte=t.Advancestagesetting=t.IntegrityCheck=void 0,t.initModels=t.User=t.TestRun=t.TestPcError=t.TestHistory=void 0;const l=a(8792);Object.defineProperty(t,"IntegrityCheck",{enumerable:!0,get:function(){return l.IntegrityCheck}});const s=a(892);Object.defineProperty(t,"Advancestagesetting",{enumerable:!0,get:function(){return s.Advancestagesetting}});const n=a(5745);Object.defineProperty(t,"Analyte",{enumerable:!0,get:function(){return n.Analyte}});const i=a(804);Object.defineProperty(t,"AnalyteResult",{enumerable:!0,get:function(){return i.AnalyteResult}});const o=a(4878);Object.defineProperty(t,"AnalyteResultText",{enumerable:!0,get:function(){return o.AnalyteResultText}});const r=a(4942);Object.defineProperty(t,"Assay",{enumerable:!0,get:function(){return r.Assay}});const p=a(4044);Object.defineProperty(t,"AssayCartridge",{enumerable:!0,get:function(){return p.AssayCartridge}});const y=a(8667);Object.defineProperty(t,"AssayChamber",{enumerable:!0,get:function(){return y.AssayChamber}});const u=a(1163);Object.defineProperty(t,"CalibrationChamber",{enumerable:!0,get:function(){return u.CalibrationChamber}});const d=a(2632);Object.defineProperty(t,"CalibrationSequence",{enumerable:!0,get:function(){return d.CalibrationSequence}});const _=a(1544);Object.defineProperty(t,"Cartridge",{enumerable:!0,get:function(){return _.Cartridge}});const m=a(4859);Object.defineProperty(t,"CartridgeOrder",{enumerable:!0,get:function(){return m.CartridgeOrder}});const c=a(3918);Object.defineProperty(t,"Chamber",{enumerable:!0,get:function(){return c.Chamber}});const T=a(6038);Object.defineProperty(t,"ColorDisclaimer",{enumerable:!0,get:function(){return T.ColorDisclaimer}});const N=a(87);Object.defineProperty(t,"Config",{enumerable:!0,get:function(){return N.Config}});const g=a(2075);Object.defineProperty(t,"CrosstalkFactor",{enumerable:!0,get:function(){return g.CrosstalkFactor}});const f=a(1726);Object.defineProperty(t,"DisabledModule",{enumerable:!0,get:function(){return f.DisabledModule}});const D=a(7772);Object.defineProperty(t,"Dtproperty",{enumerable:!0,get:function(){return D.Dtproperty}});const E=a(2e3);Object.defineProperty(t,"FailedLocation",{enumerable:!0,get:function(){return E.FailedLocation}});const b=a(5033);Object.defineProperty(t,"GraphSetting",{enumerable:!0,get:function(){return b.GraphSetting}});const w=a(140);Object.defineProperty(t,"GraphSetup",{enumerable:!0,get:function(){return w.GraphSetup}});const I=a(5038);Object.defineProperty(t,"Haplotype",{enumerable:!0,get:function(){return I.Haplotype}});const R=a(6281);Object.defineProperty(t,"HaplotypeResultText",{enumerable:!0,get:function(){return R.HaplotypeResultText}});const O=a(7912);Object.defineProperty(t,"InfinitySystemLog",{enumerable:!0,get:function(){return O.InfinitySystemLog}});const h=a(3662);Object.defineProperty(t,"Instrument",{enumerable:!0,get:function(){return h.Instrument}});const M=a(9806);Object.defineProperty(t,"LisTestOrder",{enumerable:!0,get:function(){return M.LisTestOrder}});const G=a(965);Object.defineProperty(t,"MeltPeakResult",{enumerable:!0,get:function(){return G.MeltPeakResult}});const v=a(2792);Object.defineProperty(t,"MeltPeakSetting",{enumerable:!0,get:function(){return v.MeltPeakSetting}});const A=a(4397);Object.defineProperty(t,"Organism",{enumerable:!0,get:function(){return A.Organism}});const P=a(199);Object.defineProperty(t,"OrganismResult",{enumerable:!0,get:function(){return P.OrganismResult}});const S=a(9671);Object.defineProperty(t,"OrganismResultEvaluator",{enumerable:!0,get:function(){return S.OrganismResultEvaluator}});const L=a(4953);Object.defineProperty(t,"OrganismResultRule",{enumerable:!0,get:function(){return L.OrganismResultRule}});const K=a(6563);Object.defineProperty(t,"OrganismResultText",{enumerable:!0,get:function(){return K.OrganismResultText}});const C=a(2932);Object.defineProperty(t,"OrganismTarget",{enumerable:!0,get:function(){return C.OrganismTarget}});const x=a(9094);Object.defineProperty(t,"Path",{enumerable:!0,get:function(){return x.Path}});const j=a(5549);Object.defineProperty(t,"Patient",{enumerable:!0,get:function(){return j.Patient}});const F=a(1106);Object.defineProperty(t,"PatientTestOrder",{enumerable:!0,get:function(){return F.PatientTestOrder}});const k=a(3656);Object.defineProperty(t,"Privilege",{enumerable:!0,get:function(){return k.Privilege}});const q=a(9056);Object.defineProperty(t,"QuantResult",{enumerable:!0,get:function(){return q.QuantResult}});const B=a(3366);Object.defineProperty(t,"QuantUnitSetting",{enumerable:!0,get:function(){return B.QuantUnitSetting}});const Q=a(8963);Object.defineProperty(t,"ReagentLot",{enumerable:!0,get:function(){return Q.ReagentLot}});const U=a(1186);Object.defineProperty(t,"RetainCartridgeColor",{enumerable:!0,get:function(){return U.RetainCartridgeColor}});const H=a(217);Object.defineProperty(t,"SampleSetting",{enumerable:!0,get:function(){return H.SampleSetting}});const X=a(1863);Object.defineProperty(t,"SampleType",{enumerable:!0,get:function(){return X.SampleType}});const V=a(8094);Object.defineProperty(t,"Snp",{enumerable:!0,get:function(){return V.Snp}});const z=a(7634);Object.defineProperty(t,"SystemLog",{enumerable:!0,get:function(){return z.SystemLog}});const J=a(4678);Object.defineProperty(t,"Test",{enumerable:!0,get:function(){return J.Test}});const Y=a(6450);Object.defineProperty(t,"TestBlog",{enumerable:!0,get:function(){return Y.TestBlog}});const W=a(4258);Object.defineProperty(t,"TestBlogCounter",{enumerable:!0,get:function(){return W.TestBlogCounter}});const $=a(9432);Object.defineProperty(t,"TestGraphSetup",{enumerable:!0,get:function(){return $.TestGraphSetup}});const Z=a(1360);Object.defineProperty(t,"TestHistory",{enumerable:!0,get:function(){return Z.TestHistory}});const ee=a(2848);Object.defineProperty(t,"TestPcError",{enumerable:!0,get:function(){return ee.TestPcError}});const te=a(972);Object.defineProperty(t,"TestRun",{enumerable:!0,get:function(){return te.TestRun}});const ae=a(3509);Object.defineProperty(t,"User",{enumerable:!0,get:function(){return ae.User}}),t.initModels=function(e){const t=l.IntegrityCheck.initModel(e),a=s.Advancestagesetting.initModel(e),le=n.Analyte.initModel(e),se=i.AnalyteResult.initModel(e),ne=o.AnalyteResultText.initModel(e),ie=r.Assay.initModel(e),oe=p.AssayCartridge.initModel(e),re=y.AssayChamber.initModel(e),pe=u.CalibrationChamber.initModel(e),ye=d.CalibrationSequence.initModel(e),ue=_.Cartridge.initModel(e),de=m.CartridgeOrder.initModel(e),_e=c.Chamber.initModel(e),me=T.ColorDisclaimer.initModel(e),ce=N.Config.initModel(e),Te=g.CrosstalkFactor.initModel(e),Ne=f.DisabledModule.initModel(e),ge=D.Dtproperty.initModel(e),fe=E.FailedLocation.initModel(e),De=b.GraphSetting.initModel(e),Ee=w.GraphSetup.initModel(e),be=I.Haplotype.initModel(e),we=R.HaplotypeResultText.initModel(e),Ie=O.InfinitySystemLog.initModel(e),Re=h.Instrument.initModel(e),Oe=M.LisTestOrder.initModel(e),he=G.MeltPeakResult.initModel(e),Me=v.MeltPeakSetting.initModel(e),Ge=A.Organism.initModel(e),ve=P.OrganismResult.initModel(e),Ae=S.OrganismResultEvaluator.initModel(e),Pe=L.OrganismResultRule.initModel(e),Se=K.OrganismResultText.initModel(e),Le=C.OrganismTarget.initModel(e),Ke=x.Path.initModel(e),Ce=j.Patient.initModel(e),xe=F.PatientTestOrder.initModel(e),je=k.Privilege.initModel(e),Fe=q.QuantResult.initModel(e),ke=B.QuantUnitSetting.initModel(e),qe=Q.ReagentLot.initModel(e),Be=U.RetainCartridgeColor.initModel(e),Qe=H.SampleSetting.initModel(e),Ue=X.SampleType.initModel(e),He=V.Snp.initModel(e),Xe=z.SystemLog.initModel(e),Ve=J.Test.initModel(e),ze=Y.TestBlog.initModel(e),Je=W.TestBlogCounter.initModel(e),Ye=$.TestGraphSetup.initModel(e),We=Z.TestHistory.initModel(e),$e=ee.TestPcError.initModel(e),Ze=te.TestRun.initModel(e),et=ae.User.initModel(e);return De.belongsTo(ie,{as:"assay",foreignKey:"assay_id"}),ie.hasMany(De,{as:"graph_settings",foreignKey:"assay_id"}),ke.belongsTo(ie,{as:"assay",foreignKey:"assay_id"}),ie.hasMany(ke,{as:"quant_unit_settings",foreignKey:"assay_id"}),Le.belongsTo(ke,{as:"selected_quant_unit",foreignKey:"selected_quant_unit_id"}),ke.hasMany(Le,{as:"organism_targets",foreignKey:"selected_quant_unit_id"}),Fe.belongsTo(ke,{as:"quant_unit_setting",foreignKey:"quant_unit_setting_id"}),ke.hasMany(Fe,{as:"quant_results",foreignKey:"quant_unit_setting_id"}),Fe.belongsTo(Ve,{as:"test",foreignKey:"test_id"}),Ve.hasMany(Fe,{as:"quant_results",foreignKey:"test_id"}),Ve.hasMany(ve,{as:"organism_results",foreignKey:"test_ID",sourceKey:"test_ID"}),Ve.belongsTo(ie,{as:"assay",foreignKey:"assay_ID",targetKey:"assay_ID"}),Ve.hasMany(se,{as:"analyte_results",foreignKey:"test_ID"}),Ve.belongsTo(et,{as:"operator",foreignKey:"operator_ids"}),Ve.hasOne(Ze,{as:"test_run",foreignKey:"test_ID"}),Ve.hasOne(xe,{as:"patient_test_order",foreignKey:"test_id"}),Ve.hasMany($e,{as:"test_errors",foreignKey:"test_id"}),xe.belongsTo(Ce,{as:"patient",foreignKey:"patient_id"}),se.belongsTo(le,{as:"analyte",foreignKey:"analyte_id"}),ve.belongsTo(Ge,{as:"organism",foreignKey:"organism_id",targetKey:"organism_id"}),Je.belongsTo(ze,{as:"test_blog",foreignKey:"test_blog_ID"}),ze.hasMany(Je,{as:"test_blog_counters",foreignKey:"test_blog_ID"}),{IntegrityCheck:t,Advancestagesetting:a,Analyte:le,AnalyteResult:se,AnalyteResultText:ne,Assay:ie,AssayCartridge:oe,AssayChamber:re,CalibrationChamber:pe,CalibrationSequence:ye,Cartridge:ue,CartridgeOrder:de,Chamber:_e,ColorDisclaimer:me,Config:ce,CrosstalkFactor:Te,DisabledModule:Ne,Dtproperty:ge,FailedLocation:fe,GraphSetting:De,GraphSetup:Ee,Haplotype:be,HaplotypeResultText:we,InfinitySystemLog:Ie,Instrument:Re,LisTestOrder:Oe,MeltPeakResult:he,MeltPeakSetting:Me,Organism:Ge,OrganismResult:ve,OrganismResultEvaluator:Ae,OrganismResultRule:Pe,OrganismResultText:Se,OrganismTarget:Le,Path:Ke,Patient:Ce,PatientTestOrder:xe,Privilege:je,QuantResult:Fe,QuantUnitSetting:ke,ReagentLot:qe,RetainCartridgeColor:Be,SampleSetting:Qe,SampleType:Ue,Snp:He,SystemLog:Xe,Test:Ve,TestBlog:ze,TestBlogCounter:Je,TestGraphSetup:Ye,TestHistory:We,TestPcError:$e,TestRun:Ze,User:et}}},3662:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Instrument=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Instrument",{Instrument_id:{type:l.DataTypes.INTEGER,allowNull:!0},mac_address:{type:l.DataTypes.BLOB,allowNull:!0},serial_number:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"instrument",schema:"dbo",timestamps:!1,indexes:[{name:"mac_address",fields:[{name:"mac_address"}]}]})}}t.Instrument=s},8792:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.IntegrityCheck=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("IntegrityCheck",{table_name:{type:l.DataTypes.STRING(32),allowNull:!0},field_name:{type:l.DataTypes.STRING(24),allowNull:!0},id_number:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"Integrity_Check",schema:"dbo",timestamps:!1})}}t.IntegrityCheck=s},9806:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisTestOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisTestOrder",{instrument_specimen_ID:{type:l.DataTypes.STRING(64),allowNull:!1,defaultValue:""},sample_ID:{type:l.DataTypes.STRING(25),allowNull:!0},test_code:{type:l.DataTypes.STRING(15),allowNull:!0,defaultValue:""},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:-1},order_time:{type:l.DataTypes.STRING(24),allowNull:!0},order_status:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:1},priority:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:1},LIS_test_order_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"lis_test_order",schema:"dbo",timestamps:!1,indexes:[{name:"IX_lis_test_order",fields:[{name:"instrument_specimen_ID"}]},{name:"PK_lis_test_order",unique:!0,fields:[{name:"LIS_test_order_ID"}]}]})}}t.LisTestOrder=s},965:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakResult",{melt_peak_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_result_id:{type:l.DataTypes.INTEGER,allowNull:!1},peak_index:{type:l.DataTypes.INTEGER,allowNull:!1},peak_height:{type:l.DataTypes.FLOAT,allowNull:!1},peak_temperature:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"melt_peak_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK_melt_peak_result",unique:!0,fields:[{name:"melt_peak_result_id"}]}]})}}t.MeltPeakResult=s},2792:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakSetting",{melt_peak_settings_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},slope_positive:{type:l.DataTypes.BOOLEAN,allowNull:!1},baseline_start_temp:{type:l.DataTypes.FLOAT,allowNull:!1},baseline_look_back:{type:l.DataTypes.FLOAT,allowNull:!1},baseline_num_points:{type:l.DataTypes.INTEGER,allowNull:!1},points_around_peak:{type:l.DataTypes.INTEGER,allowNull:!1},peak_threshold:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_min:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_max:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"melt_peak_settings",schema:"dbo",timestamps:!1,indexes:[{name:"PK_melt_peak_settings",unique:!0,fields:[{name:"melt_peak_settings_id"}]}]})}}t.MeltPeakSetting=s},9671:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultEvaluator=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultEvaluator",{organism_result_evaluator_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0},parent_evaluator_id:{type:l.DataTypes.INTEGER,allowNull:!0},evaluator_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"organism_result_evaluator",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result_evaluator",unique:!0,fields:[{name:"organism_result_evaluator_id"}]}]})}}t.OrganismResultEvaluator=s},4953:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultRule=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultRule",{organism_result_rule_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},evaluator_id:{type:l.DataTypes.INTEGER,allowNull:!0},parent_rule_id:{type:l.DataTypes.INTEGER,allowNull:!0},rule_type:{type:l.DataTypes.INTEGER,allowNull:!1},rule_anded:{type:l.DataTypes.BOOLEAN,allowNull:!0},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0},pass_on_equals:{type:l.DataTypes.BOOLEAN,allowNull:!0},interpretation:{type:l.DataTypes.INTEGER,allowNull:!0},reasons:{type:l.DataTypes.STRING(50),allowNull:!0},pass_on_peak:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"organism_result_rule",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result_rule",unique:!0,fields:[{name:"organism_result_rule_id"}]}]})}}t.OrganismResultRule=s},6563:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultText",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(8),allowNull:!1},result_text_reference:{type:l.DataTypes.SMALLINT,allowNull:!0},text_color_reference:{type:l.DataTypes.SMALLINT,allowNull:!0},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},organism_result_text_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"organism_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result_text",unique:!0,fields:[{name:"organism_result_text_id"}]}]})}}t.OrganismResultText=s},199:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResult",{organism_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},result_type:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0},haplotype_index:{type:l.DataTypes.INTEGER,allowNull:!0},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_color:{type:l.DataTypes.INTEGER,allowNull:!0},result_invalid:{type:l.DataTypes.BOOLEAN,allowNull:!0},allele2_text:{type:l.DataTypes.TEXT,allowNull:!0},lda_total:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result",unique:!0,fields:[{name:"organism_result_id"}]}]})}}t.OrganismResult=s},2932:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismTarget=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismTarget",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1},selected_quant_unit_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"quant_unit_setting",key:"quant_unit_setting_id"}},organism_target_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},lda_ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!0},lda_delta_ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"organism_target",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_target",unique:!0,fields:[{name:"organism_target_id"}]}]})}}t.OrganismTarget=s},4397:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Organism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Organism",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(20),allowNull:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1},early_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},late_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},medium_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},low_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},very_low_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},semi_quant_text_ref:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:-1},replacement_text_ref:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:-1},replacement_color_ref:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:-1},delta_ct_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},organism_lis_test_code:{type:l.DataTypes.STRING(15),allowNull:!0},organism_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},lda_intercept:{type:l.DataTypes.FLOAT,allowNull:!0},lda_min_valid:{type:l.DataTypes.FLOAT,allowNull:!0},lda_cutoff:{type:l.DataTypes.FLOAT,allowNull:!0},lda_max_valid:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism",unique:!0,fields:[{name:"organism_id"}]}]})}}t.Organism=s},9094:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Path=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Path",{path_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},cartridge_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1},tube:{type:l.DataTypes.BOOLEAN,allowNull:!0},block:{type:l.DataTypes.BOOLEAN,allowNull:!0},type:{type:l.DataTypes.SMALLINT,allowNull:!0},angular_offset:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"path",schema:"dbo",timestamps:!1,indexes:[{name:"cartridge_ID",fields:[{name:"cartridge_ID"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"path_id",fields:[{name:"path_ID"}]},{name:"PK_path",unique:!0,fields:[{name:"path_ID"},{name:"cartridge_ID"}]},{name:"type",fields:[{name:"type"}]}]})}}t.Path=s},1106:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PatientTestOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PatientTestOrder",{patient_test_order_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},patient_id:{type:l.DataTypes.INTEGER,allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0},lis_test_order_id:{type:l.DataTypes.INTEGER,allowNull:!0},cartridge_order_id:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"patient_test_order",schema:"dbo",timestamps:!1,indexes:[{name:"PK__patient_test_ord__4924D839",unique:!0,fields:[{name:"patient_test_order_id"}]}]})}}t.PatientTestOrder=s},5549:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Patient=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Patient",{patient_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},gx_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},practice_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},family_name:{type:l.DataTypes.TEXT,allowNull:!0},given_name:{type:l.DataTypes.TEXT,allowNull:!0},middle_name:{type:l.DataTypes.TEXT,allowNull:!0},date_of_birth:{type:l.DataTypes.STRING(32),allowNull:!0},gender:{type:l.DataTypes.STRING(64),allowNull:!0},ethnicity:{type:l.DataTypes.STRING(64),allowNull:!0},postal_code:{type:l.DataTypes.TEXT,allowNull:!0}},{tableName:"patient",schema:"dbo",timestamps:!1,indexes:[{name:"PK__patient__473C8FC7",unique:!0,fields:[{name:"patient_id"}]}]})}}t.Patient=s},3656:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Privilege=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Privilege",{privilege_name:{type:l.DataTypes.STRING(64),allowNull:!1,primaryKey:!0},user_type:{type:l.DataTypes.SMALLINT,allowNull:!1,primaryKey:!0}},{tableName:"privilege",schema:"dbo",timestamps:!1,indexes:[{name:"PK_privilege",unique:!0,fields:[{name:"privilege_name"},{name:"user_type"}]}]})}}t.Privilege=s},9056:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QuantResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QuantResult",{quant_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"test_ID"}},quant_unit_setting_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"quant_unit_setting",key:"quant_unit_setting_id"}},quantitative_result:{type:l.DataTypes.FLOAT,allowNull:!0},result_text:{type:l.DataTypes.STRING(1024),allowNull:!0},result_text_color:{type:l.DataTypes.SMALLINT,allowNull:!1},qualitative_result:{type:l.DataTypes.STRING(50),allowNull:!0},result_abnormal_flag:{type:l.DataTypes.STRING(5),allowNull:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_result_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"quant_result",schema:"dbo",timestamps:!1,indexes:[{name:"analyte_result_id",fields:[{name:"analyte_result_id"}]},{name:"PK__quant_result__3AD6B8E2",unique:!0,fields:[{name:"quant_result_id"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.QuantResult=s},3366:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QuantUnitSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QuantUnitSetting",{quant_unit_setting_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"assay_ID"}},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1},position:{type:l.DataTypes.INTEGER,allowNull:!1},unit_key:{type:l.DataTypes.STRING(50),allowNull:!1},conversion_factor:{type:l.DataTypes.FLOAT,allowNull:!1},lower_limit:{type:l.DataTypes.FLOAT,allowNull:!1},upper_limit:{type:l.DataTypes.FLOAT,allowNull:!1},display_log_value:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:0},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"quant_unit_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant_unit_setti__351DDF8C",unique:!0,fields:[{name:"quant_unit_setting_id"}]}]})}}t.QuantUnitSetting=s},8963:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ReagentLot",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},rgt_lot_number:{type:l.DataTypes.STRING(3),allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!0},reagent_lot_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"guid",fields:[{name:"guid"}]},{name:"PK_reagent_lot",unique:!0,fields:[{name:"reagent_lot_id"}]},{name:"rgt_lot_number",fields:[{name:"rgt_lot_number"}]}]})}}t.ReagentLot=s},1186:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RetainCartridgeColor=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("RetainCartridgeColor",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1},color:{type:l.DataTypes.INTEGER,allowNull:!1},retain_cartridge:{type:l.DataTypes.BOOLEAN,allowNull:!0},retain_cartridge_color_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"retain_cartridge_color",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_retain_cartridge",unique:!0,fields:[{name:"retain_cartridge_color_id"}]}]})}}t.RetainCartridgeColor=s},217:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleSetting",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},sample_type:{type:l.DataTypes.SMALLINT,allowNull:!1},valid_min:{type:l.DataTypes.DECIMAL(5,1),allowNull:!0},valid_max:{type:l.DataTypes.DECIMAL(5,1),allowNull:!0},end_pt_threshold:{type:l.DataTypes.SMALLINT,allowNull:!0},probe_chk_low_max:{type:l.DataTypes.INTEGER,allowNull:!0},probe_chk_high_min:{type:l.DataTypes.INTEGER,allowNull:!0},probe_chk_delta:{type:l.DataTypes.INTEGER,allowNull:!0},is_lot_parameters:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_endpoint:{type:l.DataTypes.BOOLEAN,allowNull:!0},peak_height_min:{type:l.DataTypes.FLOAT,allowNull:!0},use_delta_ct:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},min_delta_ct:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:0},delta_ct_eff:{type:l.DataTypes.FLOAT,allowNull:!0},E0:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E1:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E2:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E3:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E4:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},sample_settings_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},reagent_lot_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_low_min:{type:l.DataTypes.INTEGER,allowNull:!0},probe_chk_high_max:{type:l.DataTypes.INTEGER,allowNull:!0},ct_threshold_value:{type:l.DataTypes.FLOAT,allowNull:!0},normalization_factor:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"sample_settings",schema:"dbo",timestamps:!1,indexes:[{name:"analyte_id",fields:[{name:"analyte_id"}]},{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"PK_sample_settings",unique:!0,fields:[{name:"sample_settings_id"}]},{name:"reagent_lot_id",fields:[{name:"reagent_lot_id"}]},{name:"sample_type",fields:[{name:"sample_type"}]}]})}}t.SampleSetting=s},1863:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleType=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleType",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},pos:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"sample_type",schema:"dbo",timestamps:!1})}}t.SampleType=s},8094:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Snp=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Snp",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!0},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!0},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0},snp_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"snp",schema:"dbo",timestamps:!1,indexes:[{name:"PK_snp",unique:!0,fields:[{name:"snp_id"}]}]})}}t.Snp=s},7634:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SystemLog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SystemLog",{error_type:{type:l.DataTypes.INTEGER,allowNull:!0},log_time:{type:l.DataTypes.STRING(24),allowNull:!0},error_code:{type:l.DataTypes.INTEGER,allowNull:!0},details:{type:l.DataTypes.STRING(512),allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},site_name:{type:l.DataTypes.CHAR(3),allowNull:!0,defaultValue:""},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},system_log_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"system_log",schema:"dbo",timestamps:!1,indexes:[{name:"IX_system_log",fields:[{name:"system_log_ID"}]},{name:"PK_system_log",unique:!0,fields:[{name:"system_log_ID"}]}]})}}t.SystemLog=s},4258:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlogCounter=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlogCounter",{test_blog_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"test_blog",key:"test_blog_ID"}},date_text:{type:l.DataTypes.STRING(8),allowNull:!1,primaryKey:!0},test_count:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_blog_counter",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_blog_counter",unique:!0,fields:[{name:"test_blog_ID"},{name:"date_text"}]}]})}}t.TestBlogCounter=s},6450:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlog",{test_blog_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_name:{type:l.DataTypes.STRING(32),allowNull:!0},assay_version:{type:l.DataTypes.SMALLINT,allowNull:!1}},{tableName:"test_blog",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_blog",unique:!0,fields:[{name:"test_blog_ID"}]}]})}}t.TestBlog=s},9432:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestGraphSetup",{test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},graph_setup_ID:{type:l.DataTypes.INTEGER,allowNull:!1},pos:{type:l.DataTypes.SMALLINT,allowNull:!0},test_graph_setup_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"graph_setup_ID",fields:[{name:"graph_setup_ID"}]},{name:"PK_test_graph_setup",unique:!0,fields:[{name:"test_graph_setup_id"}]},{name:"test_ID",fields:[{name:"test_ID"}]}]})}}t.TestGraphSetup=s},1360:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestHistory",{test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},field_name:{type:l.DataTypes.STRING(32),allowNull:!1},old_content:{type:l.DataTypes.STRING(512),allowNull:!0},new_content:{type:l.DataTypes.STRING(512),allowNull:!0},user_ID:{type:l.DataTypes.INTEGER,allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!1},test_history_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"test_history",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_history",unique:!0,fields:[{name:"test_history_id"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.TestHistory=s},2848:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestPcError=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestPcError",{test_id:{type:l.DataTypes.INTEGER,allowNull:!1},code:{type:l.DataTypes.INTEGER,allowNull:!0},type:{type:l.DataTypes.SMALLINT,allowNull:!0},details:{type:l.DataTypes.STRING(512),allowNull:!0},severity:{type:l.DataTypes.SMALLINT,allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!0},parameter_1:{type:l.DataTypes.FLOAT,allowNull:!0},parameter_2:{type:l.DataTypes.FLOAT,allowNull:!0},parameter_3:{type:l.DataTypes.FLOAT,allowNull:!0},parameter_4:{type:l.DataTypes.FLOAT,allowNull:!0},textparameter:{type:l.DataTypes.STRING(64),allowNull:!0},test_pc_error_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_pc_error",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_pc_error",unique:!0,fields:[{name:"test_pc_error_id"}]},{name:"test_id",fields:[{name:"test_id"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.TestPcError=s},972:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestRun=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestRun",{test_run_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},site_name:{type:l.DataTypes.CHAR(3),allowNull:!1},site_serial_num:{type:l.DataTypes.INTEGER,allowNull:!0},rgt_lot_ID:{type:l.DataTypes.STRING(6),allowNull:!1},cart_serial_number:{type:l.DataTypes.BIGINT,allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},state:{type:l.DataTypes.SMALLINT,allowNull:!0},error_status:{type:l.DataTypes.SMALLINT,allowNull:!0},start_time:{type:l.DataTypes.STRING(24),allowNull:!0},end_time:{type:l.DataTypes.STRING(24),allowNull:!0},user_ID:{type:l.DataTypes.INTEGER,allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0},icore_serial_num:{type:l.DataTypes.INTEGER,allowNull:!0},fw_version:{type:l.DataTypes.STRING(12),allowNull:!0},datagram_format:{type:l.DataTypes.SMALLINT,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},order_time:{type:l.DataTypes.STRING(24),allowNull:!0},expiration_date:{type:l.DataTypes.DATE,allowNull:!1},cartridge_barcode:{type:l.DataTypes.STRING(1024),allowNull:!0},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},current_test_run:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"test_run",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_run",unique:!0,fields:[{name:"test_run_id"}]}]})}}t.TestRun=s},4678:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Test=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Test",{test_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!0},sample_ID:{type:l.DataTypes.STRING(25),allowNull:!0},scanned_SID:{type:l.DataTypes.BOOLEAN,allowNull:!0},scanned_PID:{type:l.DataTypes.BOOLEAN,allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},test_type:{type:l.DataTypes.SMALLINT,allowNull:!0},expected_result:{type:l.DataTypes.SMALLINT,allowNull:!0},lis_upload_message_ID:{type:l.DataTypes.STRING(64),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},order_time:{type:l.DataTypes.STRING(24),allowNull:!0},outliner:{type:l.DataTypes.BOOLEAN,allowNull:!1},archived:{type:l.DataTypes.BOOLEAN,allowNull:!1},auto_archived:{type:l.DataTypes.BOOLEAN,allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},other_sample_type_text:{type:l.DataTypes.STRING(32),allowNull:!0},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_text_colors:{type:l.DataTypes.TEXT,allowNull:!0},express_result_text:{type:l.DataTypes.STRING(1024),allowNull:!0},order_id:{type:l.DataTypes.INTEGER,allowNull:!1},upload_status:{type:l.DataTypes.INTEGER,allowNull:!1},priority:{type:l.DataTypes.INTEGER,allowNull:!0},cartridge_order_id:{type:l.DataTypes.INTEGER,allowNull:!0},data_reduction_alg:{type:l.DataTypes.SMALLINT,allowNull:!1},state:{type:l.DataTypes.SMALLINT,allowNull:!0},error_status:{type:l.DataTypes.SMALLINT,allowNull:!0},site_name:{type:l.DataTypes.TEXT,allowNull:!0},site_serial_num:{type:l.DataTypes.TEXT,allowNull:!0},operator_ids:{type:l.DataTypes.TEXT,allowNull:!0},start_time:{type:l.DataTypes.STRING(24),allowNull:!0},end_time:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"test",schema:"dbo",timestamps:!1,indexes:[{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"guid",fields:[{name:"guid"}]},{name:"PK_test",unique:!0,fields:[{name:"test_ID"}]},{name:"start_time",fields:[{name:"start_time"}]}]})}}t.Test=s},3509:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.User=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("User",{user_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},login_name:{type:l.DataTypes.STRING(16),allowNull:!0},full_name:{type:l.DataTypes.STRING(128),allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_hidden:{type:l.DataTypes.BOOLEAN,allowNull:!1},password:{type:l.DataTypes.STRING(32),allowNull:!0},user_type:{type:l.DataTypes.SMALLINT,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"users",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_users",unique:!0,fields:[{name:"user_ID"}]}]})}}t.User=s},8207:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,o)}r((l=l.apply(e,t||[])).next())}))},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.GeneXpertClient=void 0;const n=s(a(2245)),i=a(9634),o=a(496),r=a(7306),p=a(7819),y="YYYY/MM/DD HH:mm:ss.SSS";t.GeneXpertClient=class{constructor(e,t,a,l){this.version=e,this.sequelize=(0,r.createSequelize)(t,a,l),this.models=(0,p.initModels)(this.sequelize)}systemInfo(){const e=this.sequelize.query("\n        SELECT TOP 1 WITH TIES\n          [sw_version],\n          [instrument_serial_number],\n          [dbo].[system_log].[site_serial_number],\n          [site_name],\n          [log_time],\n          [dbo].[disabled_module].[creation] AS [disabled_at]\n        FROM [dbo].[system_log]\n          LEFT JOIN [dbo].[disabled_module]\n          ON [dbo].[disabled_module].[site_serial_number] = [dbo].[system_log].[site_serial_number]\n        ORDER BY row_number() \n        OVER (PARTITION BY [dbo].[system_log].[site_serial_number] ORDER BY [log_time] DESC)\n      ").then((([e])=>e)),t=this.models.Config.findAll().then((e=>e.map((e=>({[e.param_key]:e.param_val}))))).then(i.mergeAll);return Promise.all([e,t]).then((e=>(0,r.toSystemInfo)(...e)))}logsTotal(){return this.models.SystemLog.count()}testsTotal(){return this.models.Test.count()}testsPresyncables(e,t,a){return this.models.Test.findAll({where:{[o.Op.or]:[{modified:{[o.Op.gt]:(0,n.default)(e).format(y)}},{modified:{[o.Op.eq]:(0,n.default)(e).format(y)},test_ID:{[o.Op.notIn]:t}}]},attributes:["test_ID","modified"],limit:a,order:[["modified","ASC"]]}).then((e=>e.map((({test_ID:e,modified:t})=>({id:e.toString(),modified:(0,n.default)(t,y).toDate()})))))}testsSyncables(e){return this.models.Test.findAll({where:{test_ID:{[o.Op.in]:e}},include:[{as:"operator",model:this.models.User},{as:"test_errors",model:this.models.TestPcError},{as:"test_run",model:this.models.TestRun,attributes:{exclude:["data","cartridge_barcode"]}},{as:"patient_test_order",model:this.models.PatientTestOrder,include:[{as:"patient",model:this.models.Patient}]},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]}},{as:"analyte_results",model:this.models.AnalyteResult,include:[{as:"analyte",model:this.models.Analyte}]},{as:"organism_results",model:this.models.OrganismResult,include:[{as:"organism",model:this.models.Organism}]}]}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.test_ID.toString()}))))}testsForEntry(e,t){return this.models.Test.findAll({where:{start_time:{[o.Op.gt]:(0,n.default)().subtract(t||r.hoursForDataEntry,"hours").format(y)},sample_ID:{[o.Op.notIn]:e}},include:[{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t;return{id:e.test_ID,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(e.end_time,y).toDate(),sampleId:e.sample_ID,startedAt:(0,n.default)(e.start_time,y).toDate()}}))))}logsPresyncables(e,t,a){return this.models.SystemLog.findAll({where:{[o.Op.or]:[{log_time:{[o.Op.gt]:(0,n.default)(e).format(y)}},{log_time:{[o.Op.eq]:(0,n.default)(e).format(y)},system_log_ID:{[o.Op.notIn]:t}}]},limit:a,attributes:["system_log_ID","log_time"],order:[["log_time","ASC"]]}).then((e=>e.map((({system_log_ID:e,log_time:t})=>({id:e.toString(),modified:(0,n.default)(t,y).toDate()})))))}logsSyncables(e){return this.models.SystemLog.findAll({where:{system_log_ID:{[o.Op.in]:e}}}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.system_log_ID.toString()}))))}close(){return this.sequelize.close()}getTest(e){return l(this,void 0,void 0,(function*(){return this.models.Test.findOne({where:{sample_ID:{[o.Op.eq]:e}}})}))}getTestsByTestIds(e){return this.models.Test.findAll({where:{test_ID:{[o.Op.in]:e}},include:[{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t;return{id:e.test_ID,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(e.end_time,y).toDate(),sampleId:e.sample_ID,startedAt:(0,n.default)(e.start_time,y).toDate()}}))))}getCompletedTestsBySampleIds(e){return this.models.Test.findAll({where:{sample_ID:{[o.Op.in]:e},end_time:{[o.Op.and]:[{[o.Op.not]:null},{[o.Op.between]:[(0,n.default)().subtract(r.LAB_RESULT_APPROVAL_DEADLINE_HOURS,"hours").format(y),(0,n.default)().format(y)]}]},result_text:{[o.Op.not]:null}},include:[{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t;return{id:e.test_ID,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(e.end_time,y).toDate(),sampleId:e.sample_ID,startedAt:(0,n.default)(e.start_time,y).toDate()}}))))}}},2952:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Advancestagesetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Advancestagesetting",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1},stage_number:{type:l.DataTypes.SMALLINT,allowNull:!0},protocol_number:{type:l.DataTypes.SMALLINT,allowNull:!0},new_stage_number:{type:l.DataTypes.SMALLINT,allowNull:!0},stop_after_new_stage:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},stop_if_no_ct:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},advance_stage_settings_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"advancestagesettings",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_advancestagesettings",unique:!0,fields:[{name:"advance_stage_settings_id"}]}]})}}t.Advancestagesetting=s},6623:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AnalyteResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AnalyteResultText",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},target_result_key:{type:l.DataTypes.STRING(8),allowNull:!0},result_text_reference:{type:l.DataTypes.SMALLINT,allowNull:!1}},{tableName:"analyte_result_text ",schema:"dbo",timestamps:!1})}}t.AnalyteResultText=s},7089:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AnalyteResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AnalyteResult",{test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},expected_result:{type:l.DataTypes.SMALLINT,allowNull:!0},endpoint:{type:l.DataTypes.FLOAT,allowNull:!1},threshold:{type:l.DataTypes.FLOAT,allowNull:!1},cycle_threshold:{type:l.DataTypes.FLOAT,allowNull:!1},probe_check_result:{type:l.DataTypes.SMALLINT,allowNull:!0},probe_check_reading1:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_reading2:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_reading3:{type:l.DataTypes.FLOAT,allowNull:!0},error_status:{type:l.DataTypes.SMALLINT,allowNull:!0},target_result:{type:l.DataTypes.SMALLINT,allowNull:!0},ic_result:{type:l.DataTypes.SMALLINT,allowNull:!0},ec_result:{type:l.DataTypes.SMALLINT,allowNull:!0},spc_result:{type:l.DataTypes.SMALLINT,allowNull:!0},interpretation:{type:l.DataTypes.SMALLINT,allowNull:!0},second_deriv_peak_height:{type:l.DataTypes.FLOAT,allowNull:!0},nc_ic_endpoint:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:0},curve_fit_result:{type:l.DataTypes.SMALLINT,allowNull:!0},delta_ct:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-9999},TTP:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:0},quantitative_result:{type:l.DataTypes.FLOAT,allowNull:!0},iqs_lq_result:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:1},iqs_hq_result:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:1},analyte_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},reason:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"analyte_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK_analyte_result",unique:!0,fields:[{name:"analyte_result_id"}]},{name:"test_ID",fields:[{name:"test_ID"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.AnalyteResult=s},3425:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Analyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Analyte",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_index:{type:l.DataTypes.INTEGER,allowNull:!1},usage:{type:l.DataTypes.SMALLINT,allowNull:!0},target:{type:l.DataTypes.BLOB,allowNull:!0},analyte_name:{type:l.DataTypes.STRING(20),allowNull:!0},intended_concentration:{type:l.DataTypes.FLOAT,allowNull:!0},analyte_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},use_curve_fit:{type:l.DataTypes.BOOLEAN,allowNull:!0},enable_signal_loss_detection:{type:l.DataTypes.BOOLEAN,allowNull:!0},reporter_name:{type:l.DataTypes.STRING(12),allowNull:!1},boxcar_cycles:{type:l.DataTypes.SMALLINT,allowNull:!0},curve_analysis:{type:l.DataTypes.SMALLINT,allowNull:!0},background_start:{type:l.DataTypes.SMALLINT,allowNull:!0},background_end:{type:l.DataTypes.SMALLINT,allowNull:!0},cycle_if_no_ct:{type:l.DataTypes.SMALLINT,allowNull:!0},min_ct_req_pass_controls:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_on_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},curve_fit_start_background:{type:l.DataTypes.BOOLEAN,allowNull:!0},curve_fit_start_index:{type:l.DataTypes.SMALLINT,allowNull:!0},curve_fit_end_data:{type:l.DataTypes.BOOLEAN,allowNull:!0},curve_fit_end_index:{type:l.DataTypes.SMALLINT,allowNull:!0},curve_fit_min_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_nrse:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_slope_vs_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},background_min_points:{type:l.DataTypes.SMALLINT,allowNull:!0},background_look_back:{type:l.DataTypes.SMALLINT,allowNull:!0},background_validate:{type:l.DataTypes.BOOLEAN,allowNull:!0},background_max_slope:{type:l.DataTypes.FLOAT,allowNull:!0},background_max_rms_error:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_use_delta_pc:{type:l.DataTypes.BOOLEAN,allowNull:!0},probe_check_min_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_max_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},invalid_bias:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"analyte",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_analyte",unique:!0,fields:[{name:"analyte_id"}]},{name:"pos",fields:[{name:"analyte_index"}]}]})}}t.Analyte=s},1401:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayCartridge=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayCartridge",{assay_cartridge_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!0},need_lot_parameters:{type:l.DataTypes.BOOLEAN,allowNull:!1},need_ext_control:{type:l.DataTypes.BOOLEAN,allowNull:!1},ext_control_frq:{type:l.DataTypes.SMALLINT,allowNull:!0},cartridge_type_ID:{type:l.DataTypes.INTEGER,allowNull:!0},command_seq:{type:l.DataTypes.BLOB,allowNull:!0},melt_all_peaks:{type:l.DataTypes.BOOLEAN,allowNull:!1},use_background_subtraction:{type:l.DataTypes.BOOLEAN,allowNull:!1},air_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},overflow_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},comments:{type:l.DataTypes.STRING(256),allowNull:!0},command_seq_format:{type:l.DataTypes.SMALLINT,allowNull:!0},picture:{type:l.DataTypes.BLOB,allowNull:!0},read_interval:{type:l.DataTypes.INTEGER,allowNull:!0},prep_cartridge_shelf_life:{type:l.DataTypes.INTEGER,allowNull:!1},retain_cartridge:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"assay_cartridge",schema:"dbo",timestamps:!1,indexes:[{name:"PK_assay_cartridge",unique:!0,fields:[{name:"assay_cartridge_id"}]}]})}}t.AssayCartridge=s},1548:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayChamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayChamber",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!0},name:{type:l.DataTypes.STRING(16),allowNull:!0},initial_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},assay_chamber_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"assay_chamber",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"PK_assay_chamber",unique:!0,fields:[{name:"assay_chamber_id"}]}]})}}t.AssayChamber=s},378:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Assay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Assay",{assay_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},pos:{type:l.DataTypes.INTEGER,allowNull:!0},name:{type:l.DataTypes.STRING(32),allowNull:!0},version:{type:l.DataTypes.SMALLINT,allowNull:!0},user_ID:{type:l.DataTypes.INTEGER,allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_verified:{type:l.DataTypes.BOOLEAN,allowNull:!0},comments:{type:l.DataTypes.STRING(256),allowNull:!0},lock_comments:{type:l.DataTypes.STRING(256),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},product_code:{type:l.DataTypes.SMALLINT,allowNull:!0},assay_type:{type:l.DataTypes.SMALLINT,allowNull:!0},disclaimer:{type:l.DataTypes.STRING(512),allowNull:!0},company_code:{type:l.DataTypes.SMALLINT,allowNull:!0},result_text_type:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:0},class:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:0},analysis_type:{type:l.DataTypes.SMALLINT,allowNull:!0},sample_prep_instruction:{type:l.DataTypes.STRING(256),allowNull:!0},sample_prep_video:{type:l.DataTypes.BLOB,allowNull:!0},test_code:{type:l.DataTypes.STRING(15),allowNull:!0},enable_test_code:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},enable_auto_archive:{type:l.DataTypes.BOOLEAN,allowNull:!1},default_result_text_reference:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:5},default_text_color_reference:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:3},clia_waived:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"assay",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_assay_ID",unique:!0,fields:[{name:"assay_ID"}]},{name:"pos",fields:[{name:"pos"}]}]})}}t.Assay=s},8486:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CalibrationChamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CalibrationChamber",{calibration_seq_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1,primaryKey:!0},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!0},name:{type:l.DataTypes.STRING(16),allowNull:!0},initial_volume:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"calibration_chamber",schema:"dbo",timestamps:!1,indexes:[{name:"calibration_seq_id",fields:[{name:"calibration_seq_id"}]},{name:"cartridge_ID",fields:[{name:"cartridge_id"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"PK_calibration_chamber",unique:!0,fields:[{name:"calibration_seq_id"},{name:"cartridge_id"},{name:"chamber_number"}]}]})}}t.CalibrationChamber=s},447:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CalibrationSequence=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CalibrationSequence",{calibration_seq_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},pos:{type:l.DataTypes.INTEGER,allowNull:!0},name:{type:l.DataTypes.STRING(32),allowNull:!0},cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!0},command_seq:{type:l.DataTypes.BLOB,allowNull:!0},command_seq_format:{type:l.DataTypes.SMALLINT,allowNull:!0},air_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},comments:{type:l.DataTypes.STRING(256),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"calibration_sequence",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_calibration_sequence",unique:!0,fields:[{name:"calibration_seq_id"}]},{name:"pos",fields:[{name:"pos"}]}]})}}t.CalibrationSequence=s},975:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CartridgeOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CartridgeOrder",{cartridge_order_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},sample_id:{type:l.DataTypes.STRING(25),allowNull:!0},scanned_SID:{type:l.DataTypes.BOOLEAN,allowNull:!0},scanned_PID:{type:l.DataTypes.BOOLEAN,allowNull:!0},priority:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0},rgt_lot_id:{type:l.DataTypes.STRING(6),allowNull:!1},cartridge_serial_number:{type:l.DataTypes.BIGINT,allowNull:!0},cartridge_expiration_date:{type:l.DataTypes.DATE,allowNull:!0},cartridge_barcode:{type:l.DataTypes.STRING(1024),allowNull:!0},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},other_sample_type_text:{type:l.DataTypes.STRING(32),allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_status:{type:l.DataTypes.STRING(32),allowNull:!0},order_sw_version:{type:l.DataTypes.STRING(16),allowNull:!1},cartridge_order_time:{type:l.DataTypes.STRING(24),allowNull:!0},cartridge_order_expiration:{type:l.DataTypes.STRING(24),allowNull:!0},location:{type:l.DataTypes.STRING(32),allowNull:!0},location_site:{type:l.DataTypes.INTEGER,allowNull:!0},lis_order_id:{type:l.DataTypes.INTEGER,allowNull:!1},test_type:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"cartridge_order",schema:"dbo",timestamps:!1,indexes:[{name:"PK_cartridge_order",unique:!0,fields:[{name:"cartridge_order_id"}]}]})}}t.CartridgeOrder=s},1291:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Cartridge=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Cartridge",{cartridge_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},name:{type:l.DataTypes.STRING(32),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},max_pressure:{type:l.DataTypes.SMALLINT,allowNull:!0},syringe_min_transfer_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},syringe_max_transfer_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},syringe_max_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_syringe_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_chamber_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},direct_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},filter_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},direct_flow_rate_min:{type:l.DataTypes.SMALLINT,allowNull:!0},direct_flow_rate_max:{type:l.DataTypes.SMALLINT,allowNull:!0},microliters_per_revolution:{type:l.DataTypes.FLOAT,allowNull:!0},initial_aspirate_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},initial_aspirate_flow_rate:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_pressurized_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},air_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},overflow_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},min_pressure:{type:l.DataTypes.SMALLINT,allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1,defaultValue:""},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},filter_flow_rate_min:{type:l.DataTypes.SMALLINT,allowNull:!0},filter_flow_rate_max:{type:l.DataTypes.SMALLINT,allowNull:!0},cartridge_foot_height:{type:l.DataTypes.INTEGER,allowNull:!0},adc_2_psi:{type:l.DataTypes.FLOAT,allowNull:!0},plunger_strip_position:{type:l.DataTypes.INTEGER,allowNull:!0},plunger_pickup_position:{type:l.DataTypes.INTEGER,allowNull:!0},picture:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"cartridge",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"name",fields:[{name:"name"}]},{name:"PK_cartridge_ID",unique:!0,fields:[{name:"cartridge_ID"}]},{name:"version",fields:[{name:"version"}]}]})}}t.Cartridge=s},7184:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Chamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Chamber",{cartridge_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1,primaryKey:!0},min_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},max_volume:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"chamber",schema:"dbo",timestamps:!1,indexes:[{name:"cartridge_ID",fields:[{name:"cartridge_ID"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"PK_chamber",unique:!0,fields:[{name:"cartridge_ID"},{name:"chamber_number"}]}]})}}t.Chamber=s},7527:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorDisclaimer=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ColorDisclaimer",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},color:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},disclaimer:{type:l.DataTypes.STRING(256),allowNull:!0}},{tableName:"color_disclaimer",schema:"dbo",timestamps:!1,indexes:[{name:"PK_color_disclaimer",unique:!0,fields:[{name:"assay_ID"},{name:"color"}]}]})}}t.ColorDisclaimer=s},6840:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Config",{param_key:{type:l.DataTypes.STRING(64),primaryKey:!0,allowNull:!1},param_val:{type:l.DataTypes.STRING(512),allowNull:!1,defaultValue:""}},{tableName:"config",schema:"dbo",timestamps:!1})}}t.Config=s},501:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CrosstalkFactor=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CrosstalkFactor",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},protocol_number:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:-1},factor:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:0},crosstalk_factor_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},from_analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},to_analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"crosstalk_factor",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_crosstalk_factor",unique:!0,fields:[{name:"crosstalk_factor_id"}]}]})}}t.CrosstalkFactor=s},8567:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DisabledModule=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("DisabledModule",{site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!0},creation:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"disabled_module",schema:"dbo",timestamps:!1,indexes:[{name:"PK_disabled_module",unique:!0,fields:[{name:"site_serial_number"}]}]})}}t.DisabledModule=s},7928:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Dtproperty=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Dtproperty",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},objectid:{type:l.DataTypes.INTEGER,allowNull:!0},property:{type:l.DataTypes.STRING(64),allowNull:!1,primaryKey:!0},value:{type:l.DataTypes.STRING(255),allowNull:!0},uvalue:{type:l.DataTypes.STRING(255),allowNull:!0},lvalue:{type:l.DataTypes.BLOB,allowNull:!0},version:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:0}},{tableName:"dtproperties",schema:"dbo",timestamps:!1,indexes:[{name:"pk_dtproperties",unique:!0,fields:[{name:"id"},{name:"property"}]}]})}}t.Dtproperty=s},4368:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.FailedLocation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("FailedLocation",{location:{type:l.DataTypes.STRING(32),allowNull:!1,primaryKey:!0},location_site:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"failed_location",schema:"dbo",timestamps:!1,indexes:[{name:"PK_failed_location",unique:!0,fields:[{name:"location"},{name:"location_site"}]}]})}}t.FailedLocation=s},1692:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetting",{graph_setting_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},graph_type:{type:l.DataTypes.SMALLINT,allowNull:!1},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"assay_ID"}},param_key:{type:l.DataTypes.STRING(64),allowNull:!1},param_val:{type:l.DataTypes.STRING(512),allowNull:!1,defaultValue:""}},{tableName:"graph_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__graph_setting__408F9238",unique:!0,fields:[{name:"graph_setting_id"}]}]})}}t.GraphSetting=s},5208:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetup",{graph_setup_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},pos:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!0},is_default:{type:l.DataTypes.BOOLEAN,allowNull:!1},user_ID:{type:l.DataTypes.INTEGER,allowNull:!0},settings:{type:l.DataTypes.INTEGER,allowNull:!0},format:{type:l.DataTypes.SMALLINT,allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_graph_setup",unique:!0,fields:[{name:"graph_setup_ID"}]},{name:"pos",fields:[{name:"pos"}]}]})}}t.GraphSetup=s},9447:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.HaplotypeResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("HaplotypeResultText",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(11),allowNull:!1,primaryKey:!0},alleles_text_1:{type:l.DataTypes.STRING(10),allowNull:!0},alleles_text_2:{type:l.DataTypes.STRING(10),allowNull:!0},text_color_reference:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"haplotype_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK_haplotype_result_text",unique:!0,fields:[{name:"assay_id"},{name:"haplotype_id"},{name:"result_key"}]}]})}}t.HaplotypeResultText=s},9933:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Haplotype=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Haplotype",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},name:{type:l.DataTypes.STRING(20),allowNull:!0},lis_test_code:{type:l.DataTypes.STRING(15),allowNull:!0}},{tableName:"haplotype",schema:"dbo",timestamps:!1,indexes:[{name:"PK_haplotype",unique:!0,fields:[{name:"assay_id"},{name:"haplotype_id"}]}]})}}t.Haplotype=s},6824:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.InfinitySystemLog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("InfinitySystemLog",{infinity_system_log_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1},code:{type:l.DataTypes.INTEGER,allowNull:!1},subsystem:{type:l.DataTypes.INTEGER,allowNull:!1},details:{type:l.DataTypes.STRING(512),allowNull:!0},log_time:{type:l.DataTypes.STRING(24),allowNull:!1},sw_version:{type:l.DataTypes.STRING(16),allowNull:!1},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"infinity_system_log",schema:"dbo",timestamps:!1,indexes:[{name:"PK_infinity_system_log",unique:!0,fields:[{name:"infinity_system_log_id"}]}]})}}t.InfinitySystemLog=s},7819:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlog=t.Test=t.SystemLog=t.Snp=t.SampleType=t.SampleSetting=t.RetainCartridgeColor=t.ReagentLot=t.QuantUnitSetting=t.QuantResult=t.QcTest=t.QcResult=t.Privilege=t.PatientTestOrder=t.Patient=t.Path=t.OrganismTarget=t.OrganismResultText=t.OrganismResultRule=t.OrganismResultEvaluator=t.OrganismResult=t.Organism=t.MeltPeakSetting=t.MeltPeakResult=t.LisTestOrder=t.Instrument=t.InfinitySystemLog=t.HaplotypeResultText=t.Haplotype=t.GraphSetup=t.GraphSetting=t.FailedLocation=t.Dtproperty=t.DisabledModule=t.CrosstalkFactor=t.Config=t.ColorDisclaimer=t.Chamber=t.CartridgeOrder=t.Cartridge=t.CalibrationSequence=t.CalibrationChamber=t.AssayChamber=t.AssayCartridge=t.Assay=t.AnalyteResultText=t.AnalyteResult=t.Analyte=t.Advancestagesetting=t.IntegrityCheck=void 0,t.initModels=t.User=t.TestRun=t.TestPcError=t.TestHistory=t.TestGraphSetup=t.TestBlogCounter=void 0;const l=a(2496);Object.defineProperty(t,"IntegrityCheck",{enumerable:!0,get:function(){return l.IntegrityCheck}});const s=a(2952);Object.defineProperty(t,"Advancestagesetting",{enumerable:!0,get:function(){return s.Advancestagesetting}});const n=a(3425);Object.defineProperty(t,"Analyte",{enumerable:!0,get:function(){return n.Analyte}});const i=a(7089);Object.defineProperty(t,"AnalyteResult",{enumerable:!0,get:function(){return i.AnalyteResult}});const o=a(6623);Object.defineProperty(t,"AnalyteResultText",{enumerable:!0,get:function(){return o.AnalyteResultText}});const r=a(378);Object.defineProperty(t,"Assay",{enumerable:!0,get:function(){return r.Assay}});const p=a(1401);Object.defineProperty(t,"AssayCartridge",{enumerable:!0,get:function(){return p.AssayCartridge}});const y=a(1548);Object.defineProperty(t,"AssayChamber",{enumerable:!0,get:function(){return y.AssayChamber}});const u=a(8486);Object.defineProperty(t,"CalibrationChamber",{enumerable:!0,get:function(){return u.CalibrationChamber}});const d=a(447);Object.defineProperty(t,"CalibrationSequence",{enumerable:!0,get:function(){return d.CalibrationSequence}});const _=a(1291);Object.defineProperty(t,"Cartridge",{enumerable:!0,get:function(){return _.Cartridge}});const m=a(975);Object.defineProperty(t,"CartridgeOrder",{enumerable:!0,get:function(){return m.CartridgeOrder}});const c=a(7184);Object.defineProperty(t,"Chamber",{enumerable:!0,get:function(){return c.Chamber}});const T=a(7527);Object.defineProperty(t,"ColorDisclaimer",{enumerable:!0,get:function(){return T.ColorDisclaimer}});const N=a(6840);Object.defineProperty(t,"Config",{enumerable:!0,get:function(){return N.Config}});const g=a(501);Object.defineProperty(t,"CrosstalkFactor",{enumerable:!0,get:function(){return g.CrosstalkFactor}});const f=a(8567);Object.defineProperty(t,"DisabledModule",{enumerable:!0,get:function(){return f.DisabledModule}});const D=a(7928);Object.defineProperty(t,"Dtproperty",{enumerable:!0,get:function(){return D.Dtproperty}});const E=a(4368);Object.defineProperty(t,"FailedLocation",{enumerable:!0,get:function(){return E.FailedLocation}});const b=a(1692);Object.defineProperty(t,"GraphSetting",{enumerable:!0,get:function(){return b.GraphSetting}});const w=a(5208);Object.defineProperty(t,"GraphSetup",{enumerable:!0,get:function(){return w.GraphSetup}});const I=a(9933);Object.defineProperty(t,"Haplotype",{enumerable:!0,get:function(){return I.Haplotype}});const R=a(9447);Object.defineProperty(t,"HaplotypeResultText",{enumerable:!0,get:function(){return R.HaplotypeResultText}});const O=a(6824);Object.defineProperty(t,"InfinitySystemLog",{enumerable:!0,get:function(){return O.InfinitySystemLog}});const h=a(3026);Object.defineProperty(t,"Instrument",{enumerable:!0,get:function(){return h.Instrument}});const M=a(7198);Object.defineProperty(t,"LisTestOrder",{enumerable:!0,get:function(){return M.LisTestOrder}});const G=a(7358);Object.defineProperty(t,"MeltPeakResult",{enumerable:!0,get:function(){return G.MeltPeakResult}});const v=a(9047);Object.defineProperty(t,"MeltPeakSetting",{enumerable:!0,get:function(){return v.MeltPeakSetting}});const A=a(5973);Object.defineProperty(t,"Organism",{enumerable:!0,get:function(){return A.Organism}});const P=a(8356);Object.defineProperty(t,"OrganismResult",{enumerable:!0,get:function(){return P.OrganismResult}});const S=a(4271);Object.defineProperty(t,"OrganismResultEvaluator",{enumerable:!0,get:function(){return S.OrganismResultEvaluator}});const L=a(1688);Object.defineProperty(t,"OrganismResultRule",{enumerable:!0,get:function(){return L.OrganismResultRule}});const K=a(2020);Object.defineProperty(t,"OrganismResultText",{enumerable:!0,get:function(){return K.OrganismResultText}});const C=a(1857);Object.defineProperty(t,"OrganismTarget",{enumerable:!0,get:function(){return C.OrganismTarget}});const x=a(2703);Object.defineProperty(t,"Path",{enumerable:!0,get:function(){return x.Path}});const j=a(3848);Object.defineProperty(t,"Patient",{enumerable:!0,get:function(){return j.Patient}});const F=a(5856);Object.defineProperty(t,"PatientTestOrder",{enumerable:!0,get:function(){return F.PatientTestOrder}});const k=a(598);Object.defineProperty(t,"Privilege",{enumerable:!0,get:function(){return k.Privilege}});const q=a(7679);Object.defineProperty(t,"QcResult",{enumerable:!0,get:function(){return q.QcResult}});const B=a(5234);Object.defineProperty(t,"QcTest",{enumerable:!0,get:function(){return B.QcTest}});const Q=a(500);Object.defineProperty(t,"QuantResult",{enumerable:!0,get:function(){return Q.QuantResult}});const U=a(6572);Object.defineProperty(t,"QuantUnitSetting",{enumerable:!0,get:function(){return U.QuantUnitSetting}});const H=a(2025);Object.defineProperty(t,"ReagentLot",{enumerable:!0,get:function(){return H.ReagentLot}});const X=a(1084);Object.defineProperty(t,"RetainCartridgeColor",{enumerable:!0,get:function(){return X.RetainCartridgeColor}});const V=a(7617);Object.defineProperty(t,"SampleSetting",{enumerable:!0,get:function(){return V.SampleSetting}});const z=a(1674);Object.defineProperty(t,"SampleType",{enumerable:!0,get:function(){return z.SampleType}});const J=a(2412);Object.defineProperty(t,"Snp",{enumerable:!0,get:function(){return J.Snp}});const Y=a(6151);Object.defineProperty(t,"SystemLog",{enumerable:!0,get:function(){return Y.SystemLog}});const W=a(9100);Object.defineProperty(t,"Test",{enumerable:!0,get:function(){return W.Test}});const $=a(6103);Object.defineProperty(t,"TestBlog",{enumerable:!0,get:function(){return $.TestBlog}});const Z=a(3969);Object.defineProperty(t,"TestBlogCounter",{enumerable:!0,get:function(){return Z.TestBlogCounter}});const ee=a(1808);Object.defineProperty(t,"TestGraphSetup",{enumerable:!0,get:function(){return ee.TestGraphSetup}});const te=a(3569);Object.defineProperty(t,"TestHistory",{enumerable:!0,get:function(){return te.TestHistory}});const ae=a(9642);Object.defineProperty(t,"TestPcError",{enumerable:!0,get:function(){return ae.TestPcError}});const le=a(6548);Object.defineProperty(t,"TestRun",{enumerable:!0,get:function(){return le.TestRun}});const se=a(8075);Object.defineProperty(t,"User",{enumerable:!0,get:function(){return se.User}}),t.initModels=function(e){const t=l.IntegrityCheck.initModel(e),a=s.Advancestagesetting.initModel(e),ne=n.Analyte.initModel(e),ie=i.AnalyteResult.initModel(e),oe=o.AnalyteResultText.initModel(e),re=r.Assay.initModel(e),pe=p.AssayCartridge.initModel(e),ye=y.AssayChamber.initModel(e),ue=u.CalibrationChamber.initModel(e),de=d.CalibrationSequence.initModel(e),_e=_.Cartridge.initModel(e),me=m.CartridgeOrder.initModel(e),ce=c.Chamber.initModel(e),Te=T.ColorDisclaimer.initModel(e),Ne=N.Config.initModel(e),ge=g.CrosstalkFactor.initModel(e),fe=f.DisabledModule.initModel(e),De=D.Dtproperty.initModel(e),Ee=E.FailedLocation.initModel(e),be=b.GraphSetting.initModel(e),we=w.GraphSetup.initModel(e),Ie=I.Haplotype.initModel(e),Re=R.HaplotypeResultText.initModel(e),Oe=O.InfinitySystemLog.initModel(e),he=h.Instrument.initModel(e),Me=M.LisTestOrder.initModel(e),Ge=G.MeltPeakResult.initModel(e),ve=v.MeltPeakSetting.initModel(e),Ae=A.Organism.initModel(e),Pe=P.OrganismResult.initModel(e),Se=S.OrganismResultEvaluator.initModel(e),Le=L.OrganismResultRule.initModel(e),Ke=K.OrganismResultText.initModel(e),Ce=C.OrganismTarget.initModel(e),xe=x.Path.initModel(e),je=j.Patient.initModel(e),Fe=F.PatientTestOrder.initModel(e),ke=k.Privilege.initModel(e),qe=q.QcResult.initModel(e),Be=B.QcTest.initModel(e),Qe=Q.QuantResult.initModel(e),Ue=U.QuantUnitSetting.initModel(e),He=H.ReagentLot.initModel(e),Xe=X.RetainCartridgeColor.initModel(e),Ve=V.SampleSetting.initModel(e),ze=z.SampleType.initModel(e),Je=J.Snp.initModel(e),Ye=Y.SystemLog.initModel(e),We=W.Test.initModel(e),$e=$.TestBlog.initModel(e),Ze=Z.TestBlogCounter.initModel(e),et=ee.TestGraphSetup.initModel(e),tt=te.TestHistory.initModel(e),at=ae.TestPcError.initModel(e),lt=le.TestRun.initModel(e),st=se.User.initModel(e);return be.belongsTo(re,{as:"assay",foreignKey:"assay_id"}),re.hasMany(be,{as:"graph_settings",foreignKey:"assay_id"}),Ue.belongsTo(re,{as:"assay",foreignKey:"assay_id"}),re.hasMany(Ue,{as:"quant_unit_settings",foreignKey:"assay_id"}),Ce.belongsTo(Ue,{as:"selected_quant_unit",foreignKey:"selected_quant_unit_id"}),Ue.hasMany(Ce,{as:"organism_targets",foreignKey:"selected_quant_unit_id"}),Qe.belongsTo(Ue,{as:"quant_unit_setting",foreignKey:"quant_unit_setting_id"}),Ue.hasMany(Qe,{as:"quant_results",foreignKey:"quant_unit_setting_id"}),Qe.belongsTo(We,{as:"test",foreignKey:"test_ID"}),We.hasMany(Qe,{as:"quant_results",foreignKey:"test_ID"}),We.hasMany(ie,{as:"analyte_results",foreignKey:"test_ID"}),We.hasMany(Pe,{as:"organism_results",foreignKey:"test_ID"}),We.belongsTo(re,{as:"assay",foreignKey:"assay_ID"}),We.belongsTo(st,{as:"operator",foreignKey:"operator_ids"}),We.hasOne(lt,{as:"test_run",foreignKey:"test_ID"}),We.belongsTo(Fe,{as:"patient_test_order",foreignKey:"test_id"}),We.hasMany(at,{as:"test_errors",foreignKey:"test_id"}),Fe.belongsTo(je,{as:"patient",foreignKey:"patient_id"}),ie.belongsTo(ne,{as:"analyte",foreignKey:"analyte_ID"}),Pe.belongsTo(Ae,{as:"organism",foreignKey:"organism_ID"}),Ze.belongsTo($e,{as:"test_blog",foreignKey:"test_blog_ID"}),$e.hasMany(Ze,{as:"test_blog_counters",foreignKey:"test_blog_ID"}),{IntegrityCheck:t,Advancestagesetting:a,Analyte:ne,AnalyteResult:ie,AnalyteResultText:oe,Assay:re,AssayCartridge:pe,AssayChamber:ye,CalibrationChamber:ue,CalibrationSequence:de,Cartridge:_e,CartridgeOrder:me,Chamber:ce,ColorDisclaimer:Te,Config:Ne,CrosstalkFactor:ge,DisabledModule:fe,Dtproperty:De,FailedLocation:Ee,GraphSetting:be,GraphSetup:we,Haplotype:Ie,HaplotypeResultText:Re,InfinitySystemLog:Oe,Instrument:he,LisTestOrder:Me,MeltPeakResult:Ge,MeltPeakSetting:ve,Organism:Ae,OrganismResult:Pe,OrganismResultEvaluator:Se,OrganismResultRule:Le,OrganismResultText:Ke,OrganismTarget:Ce,Path:xe,Patient:je,PatientTestOrder:Fe,Privilege:ke,QcResult:qe,QcTest:Be,QuantResult:Qe,QuantUnitSetting:Ue,ReagentLot:He,RetainCartridgeColor:Xe,SampleSetting:Ve,SampleType:ze,Snp:Je,SystemLog:Ye,Test:We,TestBlog:$e,TestBlogCounter:Ze,TestGraphSetup:et,TestHistory:tt,TestPcError:at,TestRun:lt,User:st}}},3026:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Instrument=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Instrument",{Instrument_id:{type:l.DataTypes.INTEGER,allowNull:!0},mac_address:{type:l.DataTypes.BLOB,allowNull:!0},serial_number:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"instrument",schema:"dbo",timestamps:!1,indexes:[{name:"mac_address",fields:[{name:"mac_address"}]}]})}}t.Instrument=s},2496:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.IntegrityCheck=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("IntegrityCheck",{table_name:{type:l.DataTypes.STRING(32),allowNull:!0},field_name:{type:l.DataTypes.STRING(24),allowNull:!0},id_number:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"Integrity_Check",schema:"dbo",timestamps:!1})}}t.IntegrityCheck=s},7198:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisTestOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisTestOrder",{instrument_specimen_ID:{type:l.DataTypes.STRING(64),allowNull:!1,defaultValue:""},sample_ID:{type:l.DataTypes.STRING(25),allowNull:!0},test_code:{type:l.DataTypes.STRING(15),allowNull:!0,defaultValue:""},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:-1},order_time:{type:l.DataTypes.STRING(24),allowNull:!0},order_status:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:1},priority:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:1},LIS_test_order_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},cartridge_ID:{type:l.DataTypes.STRING(25),allowNull:!0}},{tableName:"lis_test_order",schema:"dbo",timestamps:!1,indexes:[{name:"IX_lis_test_order",fields:[{name:"instrument_specimen_ID"}]},{name:"PK_lis_test_order",unique:!0,fields:[{name:"LIS_test_order_ID"}]}]})}}t.LisTestOrder=s},7358:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakResult",{melt_peak_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_result_id:{type:l.DataTypes.INTEGER,allowNull:!1},peak_index:{type:l.DataTypes.INTEGER,allowNull:!1},peak_height:{type:l.DataTypes.FLOAT,allowNull:!1},peak_temperature:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"melt_peak_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK_melt_peak_result",unique:!0,fields:[{name:"melt_peak_result_id"}]}]})}}t.MeltPeakResult=s},9047:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakSetting",{melt_peak_settings_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},slope_positive:{type:l.DataTypes.BOOLEAN,allowNull:!1},baseline_start_temp:{type:l.DataTypes.FLOAT,allowNull:!1},baseline_look_back:{type:l.DataTypes.FLOAT,allowNull:!1},baseline_num_points:{type:l.DataTypes.INTEGER,allowNull:!1},points_around_peak:{type:l.DataTypes.INTEGER,allowNull:!1},peak_threshold:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_min:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_max:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"melt_peak_settings",schema:"dbo",timestamps:!1,indexes:[{name:"PK_melt_peak_settings",unique:!0,fields:[{name:"melt_peak_settings_id"}]}]})}}t.MeltPeakSetting=s},4271:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultEvaluator=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultEvaluator",{organism_result_evaluator_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0},parent_evaluator_id:{type:l.DataTypes.INTEGER,allowNull:!0},evaluator_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"organism_result_evaluator",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result_evaluator",unique:!0,fields:[{name:"organism_result_evaluator_id"}]}]})}}t.OrganismResultEvaluator=s},1688:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultRule=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultRule",{organism_result_rule_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},evaluator_id:{type:l.DataTypes.INTEGER,allowNull:!0},parent_rule_id:{type:l.DataTypes.INTEGER,allowNull:!0},rule_type:{type:l.DataTypes.INTEGER,allowNull:!1},rule_anded:{type:l.DataTypes.BOOLEAN,allowNull:!0},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0},pass_on_equals:{type:l.DataTypes.BOOLEAN,allowNull:!0},interpretation:{type:l.DataTypes.INTEGER,allowNull:!0},reasons:{type:l.DataTypes.STRING(50),allowNull:!0},pass_on_peak:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"organism_result_rule",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result_rule",unique:!0,fields:[{name:"organism_result_rule_id"}]}]})}}t.OrganismResultRule=s},2020:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultText",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(8),allowNull:!1},result_text_reference:{type:l.DataTypes.SMALLINT,allowNull:!0},text_color_reference:{type:l.DataTypes.SMALLINT,allowNull:!0},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},organism_result_text_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"organism_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result_text",unique:!0,fields:[{name:"organism_result_text_id"}]}]})}}t.OrganismResultText=s},8356:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResult",{organism_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},result_type:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0},haplotype_index:{type:l.DataTypes.INTEGER,allowNull:!0},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_color:{type:l.DataTypes.INTEGER,allowNull:!0},result_invalid:{type:l.DataTypes.BOOLEAN,allowNull:!0},allele2_text:{type:l.DataTypes.TEXT,allowNull:!0},lda_total:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result",unique:!0,fields:[{name:"organism_result_id"}]}]})}}t.OrganismResult=s},1857:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismTarget=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismTarget",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1},selected_quant_unit_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"quant_unit_setting",key:"quant_unit_setting_id"}},organism_target_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},lda_ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!0},lda_delta_ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"organism_target",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_target",unique:!0,fields:[{name:"organism_target_id"}]}]})}}t.OrganismTarget=s},5973:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Organism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Organism",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(20),allowNull:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1},early_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},late_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},medium_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},low_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},very_low_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},semi_quant_text_ref:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:-1},replacement_text_ref:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:-1},replacement_color_ref:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:-1},delta_ct_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},organism_lis_test_code:{type:l.DataTypes.STRING(15),allowNull:!0},organism_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},lda_intercept:{type:l.DataTypes.FLOAT,allowNull:!0},lda_min_valid:{type:l.DataTypes.FLOAT,allowNull:!0},lda_cutoff:{type:l.DataTypes.FLOAT,allowNull:!0},lda_max_valid:{type:l.DataTypes.FLOAT,allowNull:!0},pr_dynamic_range_min:{type:l.DataTypes.FLOAT,allowNull:!0},pr_lod_loq:{type:l.DataTypes.FLOAT,allowNull:!0},pr_dynamic_range_max:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism",unique:!0,fields:[{name:"organism_id"}]}]})}}t.Organism=s},2703:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Path=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Path",{path_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},cartridge_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1},tube:{type:l.DataTypes.BOOLEAN,allowNull:!0},block:{type:l.DataTypes.BOOLEAN,allowNull:!0},type:{type:l.DataTypes.SMALLINT,allowNull:!0},angular_offset:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"path",schema:"dbo",timestamps:!1,indexes:[{name:"cartridge_ID",fields:[{name:"cartridge_ID"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"path_id",fields:[{name:"path_ID"}]},{name:"PK_path",unique:!0,fields:[{name:"path_ID"},{name:"cartridge_ID"}]},{name:"type",fields:[{name:"type"}]}]})}}t.Path=s},5856:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PatientTestOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PatientTestOrder",{patient_test_order_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},patient_id:{type:l.DataTypes.INTEGER,allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0},lis_test_order_id:{type:l.DataTypes.INTEGER,allowNull:!0},cartridge_order_id:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"patient_test_order",schema:"dbo",timestamps:!1,indexes:[{name:"PK__patient_test_ord__4924D839",unique:!0,fields:[{name:"patient_test_order_id"}]}]})}}t.PatientTestOrder=s},3848:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Patient=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Patient",{patient_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},gx_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},practice_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},family_name:{type:l.DataTypes.TEXT,allowNull:!0},given_name:{type:l.DataTypes.TEXT,allowNull:!0},middle_name:{type:l.DataTypes.TEXT,allowNull:!0},date_of_birth:{type:l.DataTypes.STRING(32),allowNull:!0},gender:{type:l.DataTypes.STRING(64),allowNull:!0},ethnicity:{type:l.DataTypes.STRING(64),allowNull:!0},postal_code:{type:l.DataTypes.TEXT,allowNull:!0}},{tableName:"patient",schema:"dbo",timestamps:!1,indexes:[{name:"PK__patient__473C8FC7",unique:!0,fields:[{name:"patient_id"}]}]})}}t.Patient=s},598:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Privilege=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Privilege",{privilege_name:{type:l.DataTypes.STRING(64),allowNull:!1,primaryKey:!0},user_type:{type:l.DataTypes.SMALLINT,allowNull:!1,primaryKey:!0}},{tableName:"privilege",schema:"dbo",timestamps:!1,indexes:[{name:"PK_privilege",unique:!0,fields:[{name:"privilege_name"},{name:"user_type"}]}]})}}t.Privilege=s},7679:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QcResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QcResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_name:{type:l.DataTypes.STRING(32),allowNull:!1},assay_version:{type:l.DataTypes.SMALLINT,allowNull:!1},rgt_lot_id:{type:l.DataTypes.STRING(6),allowNull:!0},completion_date:{type:l.DataTypes.DATE,allowNull:!0},due_date:{type:l.DataTypes.DATE,allowNull:!1}},{tableName:"qc_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__qc_resul__3213E83F0FB750B3",unique:!0,fields:[{name:"id"}]}]})}}t.QcResult=s},5234:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QcTest=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QcTest",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0},qc_result_id:{type:l.DataTypes.INTEGER,allowNull:!1},is_pos:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_pass:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"qc_test",schema:"dbo",timestamps:!1,indexes:[{name:"PK__qc_test__3213E83F1387E197",unique:!0,fields:[{name:"id"}]}]})}}t.QcTest=s},500:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QuantResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QuantResult",{quant_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"test_ID"}},quant_unit_setting_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"quant_unit_setting",key:"quant_unit_setting_id"}},quantitative_result:{type:l.DataTypes.FLOAT,allowNull:!0},result_text:{type:l.DataTypes.STRING(1024),allowNull:!0},result_text_color:{type:l.DataTypes.SMALLINT,allowNull:!1},qualitative_result:{type:l.DataTypes.STRING(50),allowNull:!0},result_abnormal_flag:{type:l.DataTypes.STRING(5),allowNull:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_result_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"quant_result",schema:"dbo",timestamps:!1,indexes:[{name:"analyte_result_id",fields:[{name:"analyte_result_id"}]},{name:"PK__quant_result__3AD6B8E2",unique:!0,fields:[{name:"quant_result_id"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.QuantResult=s},6572:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QuantUnitSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QuantUnitSetting",{quant_unit_setting_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"assay_ID"}},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1},position:{type:l.DataTypes.INTEGER,allowNull:!1},unit_key:{type:l.DataTypes.STRING(50),allowNull:!1},conversion_factor:{type:l.DataTypes.FLOAT,allowNull:!1},lower_limit:{type:l.DataTypes.FLOAT,allowNull:!1},upper_limit:{type:l.DataTypes.FLOAT,allowNull:!1},display_log_value:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:0},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"quant_unit_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant_unit_setti__351DDF8C",unique:!0,fields:[{name:"quant_unit_setting_id"}]}]})}}t.QuantUnitSetting=s},2025:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ReagentLot",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},rgt_lot_number:{type:l.DataTypes.STRING(3),allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!0},reagent_lot_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"guid",fields:[{name:"guid"}]},{name:"PK_reagent_lot",unique:!0,fields:[{name:"reagent_lot_id"}]},{name:"rgt_lot_number",fields:[{name:"rgt_lot_number"}]}]})}}t.ReagentLot=s},1084:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RetainCartridgeColor=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("RetainCartridgeColor",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1},color:{type:l.DataTypes.INTEGER,allowNull:!1},retain_cartridge:{type:l.DataTypes.BOOLEAN,allowNull:!0},retain_cartridge_color_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"retain_cartridge_color",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_retain_cartridge",unique:!0,fields:[{name:"retain_cartridge_color_id"}]}]})}}t.RetainCartridgeColor=s},7617:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleSetting",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},sample_type:{type:l.DataTypes.SMALLINT,allowNull:!1},valid_min:{type:l.DataTypes.DECIMAL(5,1),allowNull:!0},valid_max:{type:l.DataTypes.DECIMAL(5,1),allowNull:!0},end_pt_threshold:{type:l.DataTypes.SMALLINT,allowNull:!0},probe_chk_low_max:{type:l.DataTypes.INTEGER,allowNull:!0},probe_chk_high_min:{type:l.DataTypes.INTEGER,allowNull:!0},probe_chk_delta:{type:l.DataTypes.INTEGER,allowNull:!0},is_lot_parameters:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_endpoint:{type:l.DataTypes.BOOLEAN,allowNull:!0},peak_height_min:{type:l.DataTypes.FLOAT,allowNull:!0},use_delta_ct:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},min_delta_ct:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:0},delta_ct_eff:{type:l.DataTypes.FLOAT,allowNull:!0},E0:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E1:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E2:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E3:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E4:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},sample_settings_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},reagent_lot_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_low_min:{type:l.DataTypes.INTEGER,allowNull:!0},probe_chk_high_max:{type:l.DataTypes.INTEGER,allowNull:!0},ct_threshold_value:{type:l.DataTypes.FLOAT,allowNull:!0},normalization_factor:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"sample_settings",schema:"dbo",timestamps:!1,indexes:[{name:"analyte_id",fields:[{name:"analyte_id"}]},{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"PK_sample_settings",unique:!0,fields:[{name:"sample_settings_id"}]},{name:"reagent_lot_id",fields:[{name:"reagent_lot_id"}]},{name:"sample_type",fields:[{name:"sample_type"}]}]})}}t.SampleSetting=s},1674:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleType=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleType",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},pos:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"sample_type",schema:"dbo",timestamps:!1})}}t.SampleType=s},2412:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Snp=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Snp",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!0},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!0},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0},snp_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"snp",schema:"dbo",timestamps:!1,indexes:[{name:"PK_snp",unique:!0,fields:[{name:"snp_id"}]}]})}}t.Snp=s},6151:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SystemLog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SystemLog",{error_type:{type:l.DataTypes.INTEGER,allowNull:!0},log_time:{type:l.DataTypes.STRING(24),allowNull:!0},error_code:{type:l.DataTypes.INTEGER,allowNull:!0},details:{type:l.DataTypes.STRING(512),allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},site_name:{type:l.DataTypes.CHAR(3),allowNull:!0,defaultValue:""},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},system_log_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"system_log",schema:"dbo",timestamps:!1,indexes:[{name:"IX_system_log",fields:[{name:"system_log_ID"}]},{name:"PK_system_log",unique:!0,fields:[{name:"system_log_ID"}]}]})}}t.SystemLog=s},3969:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlogCounter=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlogCounter",{test_blog_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"test_blog",key:"test_blog_ID"}},date_text:{type:l.DataTypes.STRING(8),allowNull:!1,primaryKey:!0},test_count:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_blog_counter",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_blog_counter",unique:!0,fields:[{name:"test_blog_ID"},{name:"date_text"}]}]})}}t.TestBlogCounter=s},6103:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlog",{test_blog_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_name:{type:l.DataTypes.STRING(32),allowNull:!0},assay_version:{type:l.DataTypes.SMALLINT,allowNull:!1}},{tableName:"test_blog",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_blog",unique:!0,fields:[{name:"test_blog_ID"}]}]})}}t.TestBlog=s},1808:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestGraphSetup",{test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},graph_setup_ID:{type:l.DataTypes.INTEGER,allowNull:!1},pos:{type:l.DataTypes.SMALLINT,allowNull:!0},test_graph_setup_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"graph_setup_ID",fields:[{name:"graph_setup_ID"}]},{name:"PK_test_graph_setup",unique:!0,fields:[{name:"test_graph_setup_id"}]},{name:"test_ID",fields:[{name:"test_ID"}]}]})}}t.TestGraphSetup=s},3569:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestHistory",{test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},field_name:{type:l.DataTypes.STRING(32),allowNull:!1},old_content:{type:l.DataTypes.STRING(512),allowNull:!0},new_content:{type:l.DataTypes.STRING(512),allowNull:!0},user_ID:{type:l.DataTypes.INTEGER,allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!1},test_history_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"test_history",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_history",unique:!0,fields:[{name:"test_history_id"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.TestHistory=s},9642:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestPcError=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestPcError",{test_id:{type:l.DataTypes.INTEGER,allowNull:!1},code:{type:l.DataTypes.INTEGER,allowNull:!0},type:{type:l.DataTypes.SMALLINT,allowNull:!0},details:{type:l.DataTypes.STRING(512),allowNull:!0},severity:{type:l.DataTypes.SMALLINT,allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!0},parameter_1:{type:l.DataTypes.FLOAT,allowNull:!0},parameter_2:{type:l.DataTypes.FLOAT,allowNull:!0},parameter_3:{type:l.DataTypes.FLOAT,allowNull:!0},parameter_4:{type:l.DataTypes.FLOAT,allowNull:!0},textparameter:{type:l.DataTypes.STRING(64),allowNull:!0},test_pc_error_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_pc_error",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_pc_error",unique:!0,fields:[{name:"test_pc_error_id"}]},{name:"test_id",fields:[{name:"test_id"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.TestPcError=s},6548:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestRun=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestRun",{test_run_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},site_name:{type:l.DataTypes.CHAR(3),allowNull:!1},site_serial_num:{type:l.DataTypes.INTEGER,allowNull:!0},rgt_lot_ID:{type:l.DataTypes.STRING(6),allowNull:!1},cart_serial_number:{type:l.DataTypes.BIGINT,allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},state:{type:l.DataTypes.SMALLINT,allowNull:!0},error_status:{type:l.DataTypes.SMALLINT,allowNull:!0},start_time:{type:l.DataTypes.STRING(24),allowNull:!0},end_time:{type:l.DataTypes.STRING(24),allowNull:!0},user_ID:{type:l.DataTypes.INTEGER,allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0},icore_serial_num:{type:l.DataTypes.INTEGER,allowNull:!0},fw_version:{type:l.DataTypes.STRING(12),allowNull:!0},datagram_format:{type:l.DataTypes.SMALLINT,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},order_time:{type:l.DataTypes.STRING(24),allowNull:!0},expiration_date:{type:l.DataTypes.DATE,allowNull:!1},cartridge_barcode:{type:l.DataTypes.STRING(1024),allowNull:!0},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},current_test_run:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"test_run",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_run",unique:!0,fields:[{name:"test_run_id"}]}]})}}t.TestRun=s},9100:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Test=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Test",{test_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!0},sample_ID:{type:l.DataTypes.STRING(25),allowNull:!0},scanned_SID:{type:l.DataTypes.BOOLEAN,allowNull:!0},scanned_PID:{type:l.DataTypes.BOOLEAN,allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},test_type:{type:l.DataTypes.SMALLINT,allowNull:!0},expected_result:{type:l.DataTypes.SMALLINT,allowNull:!0},lis_upload_message_ID:{type:l.DataTypes.STRING(64),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},order_time:{type:l.DataTypes.STRING(24),allowNull:!0},outliner:{type:l.DataTypes.BOOLEAN,allowNull:!1},archived:{type:l.DataTypes.BOOLEAN,allowNull:!1},auto_archived:{type:l.DataTypes.BOOLEAN,allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},other_sample_type_text:{type:l.DataTypes.STRING(32),allowNull:!0},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_text_colors:{type:l.DataTypes.TEXT,allowNull:!0},express_result_text:{type:l.DataTypes.STRING(1024),allowNull:!0},order_id:{type:l.DataTypes.INTEGER,allowNull:!1},upload_status:{type:l.DataTypes.INTEGER,allowNull:!1},priority:{type:l.DataTypes.INTEGER,allowNull:!0},cartridge_order_id:{type:l.DataTypes.INTEGER,allowNull:!0},data_reduction_alg:{type:l.DataTypes.SMALLINT,allowNull:!1},state:{type:l.DataTypes.SMALLINT,allowNull:!0},error_status:{type:l.DataTypes.SMALLINT,allowNull:!0},site_name:{type:l.DataTypes.TEXT,allowNull:!0},site_serial_num:{type:l.DataTypes.TEXT,allowNull:!0},operator_ids:{type:l.DataTypes.TEXT,allowNull:!0},start_time:{type:l.DataTypes.STRING(24),allowNull:!0},end_time:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"test",schema:"dbo",timestamps:!1,indexes:[{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"guid",fields:[{name:"guid"}]},{name:"PK_test",unique:!0,fields:[{name:"test_ID"}]},{name:"start_time",fields:[{name:"start_time"}]}]})}}t.Test=s},8075:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.User=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("User",{user_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},login_name:{type:l.DataTypes.STRING(16),allowNull:!0},full_name:{type:l.DataTypes.STRING(128),allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_hidden:{type:l.DataTypes.BOOLEAN,allowNull:!1},password:{type:l.DataTypes.STRING(32),allowNull:!0},user_type:{type:l.DataTypes.SMALLINT,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"users",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_users",unique:!0,fields:[{name:"user_ID"}]}]})}}t.User=s},1058:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,o)}r((l=l.apply(e,t||[])).next())}))},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.GeneXpertClient=void 0;const n=s(a(2245)),i=a(9634),o=a(496),r=a(7306),p=a(7228),y="YYYY/MM/DD HH:mm:ss.SSS";t.GeneXpertClient=class{constructor(e,t,a,l){this.version=e,this.sequelize=(0,r.createSequelize)(t,a,l),this.models=(0,p.initModels)(this.sequelize)}logsTotal(){return this.models.SystemLog.count()}testsTotal(){return this.models.Test.count()}systemInfo(){const e=this.sequelize.query("\n          SELECT\n            MAX(sw_version) as [sw_version],\n            [system_log].[site_serial_number],\n            [system_log].[site_name],\n            MAX([instrument_serial_number]) as [instrument_serial_number],\n            MAX(log_time) as [log_time],\n            MIN(log_time) as [first_seen_at],\n            MAX([disabled_module].[creation_time]) as [disabled_at]\n          FROM [dbo].[system_log]\n            LEFT JOIN [dbo].[disabled_module]\n            ON [dbo].[disabled_module].[site_serial_number] = [dbo].[system_log].[site_serial_number]\n          GROUP BY [site_name], [system_log].[site_serial_number]\n          ORDER BY log_time DESC\n        ").then((([e])=>e)),t=this.models.Config.findAll().then((e=>e.map((e=>({[e.param_key]:e.param_val}))))).then(i.mergeAll);return Promise.all([e,t]).then((e=>(0,r.toSystemInfo)(...e)))}testsPresyncables(e,t,a){return this.models.Test.findAll({where:{[o.Op.or]:[{modification_time:{[o.Op.gt]:e}},{modification_time:{[o.Op.eq]:e},id:{[o.Op.notIn]:t}}]},order:[["modification_time","DESC"]],limit:a}).then((e=>e.map((({id:e,modification_time:t})=>({id:e.toString(),modified:t})))))}testsSyncables(e){return this.models.Test.findAll({where:{id:{[o.Op.in]:e}},include:[{as:"test_data",model:this.models.TestDatum,include:[{as:"run_data",model:this.models.RunDatum}]},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]}},{as:"user",model:this.models.User},{as:"test_errors",model:this.models.TestError},{as:"patient",model:this.models.Patient},{as:"analyte_results",model:this.models.AnalyteResult,include:[{as:"analyte",model:this.models.Analyte},{as:"channel_processed_data_items",model:this.models.ChannelProcessedDataItem}]},{as:"organism_results",model:this.models.OrganismResult,include:[{as:"organism",model:this.models.Organism},{as:"organism_based_organism_result",model:this.models.OrganismBasedOrganismResult}]}]}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}testsForEntry(e,t){return this.models.Test.findAll({where:{sample_id:{[o.Op.notIn]:e}},include:[{as:"test_data",model:this.models.TestDatum,include:[{as:"run_data",model:this.models.RunDatum,required:!0,where:{start_time:{[o.Op.gte]:(0,n.default)().subtract(t||r.hoursForDataEntry,"hours").toDate()}}}],required:!0},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>(console.log({tests:e}),e.map((e=>({id:e.id,assay:e.assay.name,endedAt:e.test_data.run_data.end_time,sampleId:e.sample_id,startedAt:e.test_data.run_data.start_time}))))))}logsPresyncables(e,t,a){return this.models.SystemLog.findAll({where:{[o.Op.or]:[{log_time:{[o.Op.gt]:e}},{log_time:{[o.Op.eq]:e},id:{[o.Op.notIn]:t}}]},limit:a,attributes:["id","log_time"],order:[["log_time","ASC"]]}).then((e=>e.map((({id:e,log_time:t})=>({id:e.toString(),modified:t})))))}logsSyncables(e){return this.models.SystemLog.findAll({where:{id:{[o.Op.in]:e}}}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}close(){return this.sequelize.close()}getTest(e){var t,a;return l(this,void 0,void 0,(function*(){const l=yield this.models.Test.findOne({where:{sample_id:{[o.Op.eq]:e}},include:[{as:"test_data",model:this.models.TestDatum,include:[{as:"run_data",model:this.models.RunDatum}],required:!0}]});return{dataValues:Object.assign(Object.assign({},null==l?void 0:l.dataValues),{end_time:null===(t=null==l?void 0:l.dataValues)||void 0===t?void 0:t.test_data.run_data.end_time,sampleId:null===(a=null==l?void 0:l.dataValues)||void 0===a?void 0:a.sample_id})}}))}getTestsByTestIds(e){return this.models.Test.findAll({where:{id:{[o.Op.in]:e}},include:[{as:"test_data",model:this.models.TestDatum,include:[{as:"run_data",model:this.models.RunDatum,required:!0}],required:!0},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>(console.log({tests:e}),e.map((e=>({id:e.id,assay:e.assay.name,endedAt:e.test_data.run_data.end_time,sampleId:e.sample_id,startedAt:e.test_data.run_data.start_time}))))))}getCompletedTestsBySampleIds(e){return this.models.Test.findAll({where:{sample_id:{[o.Op.in]:e},modification_time:{[o.Op.and]:[{[o.Op.not]:null},{[o.Op.between]:[(0,n.default)().subtract(r.LAB_RESULT_APPROVAL_DEADLINE_HOURS,"hours").format(y),(0,n.default)().format(y)]}]},result_text:{[o.Op.not]:null}},include:[{as:"test_data",model:this.models.TestDatum,include:[{as:"run_data",model:this.models.RunDatum,required:!0}],required:!0},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t,a,l,s,i,o,r;return{id:e.id,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(null!==(s=null===(l=null===(a=null==e?void 0:e.test_data)||void 0===a?void 0:a.run_data)||void 0===l?void 0:l.end_time)&&void 0!==s?s:null==e?void 0:e.modification_time,y).toDate(),sampleId:e.sample_id,startedAt:(0,n.default)(null!==(r=null===(o=null===(i=null==e?void 0:e.test_data)||void 0===i?void 0:i.run_data)||void 0===o?void 0:o.start_time)&&void 0!==r?r:null==e?void 0:e.order_time,y).toDate()}}))))}}},7978:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AnalyteResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AnalyteResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}}},{tableName:"analyte_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_analyte_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__analyte___3213E83E14E7CED0",unique:!0,fields:[{name:"id"}]}]})}}t.AnalyteResult=s},2794:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Analyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Analyte",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},analyte_index:{type:l.DataTypes.INTEGER,allowNull:!1},background_end:{type:l.DataTypes.INTEGER,allowNull:!1},background_look_back:{type:l.DataTypes.INTEGER,allowNull:!1},background_max_rms_error:{type:l.DataTypes.FLOAT,allowNull:!0},background_max_slope:{type:l.DataTypes.FLOAT,allowNull:!0},background_min_points:{type:l.DataTypes.INTEGER,allowNull:!1},background_start:{type:l.DataTypes.INTEGER,allowNull:!1},boxcar_cycles:{type:l.DataTypes.INTEGER,allowNull:!1},curve_analysis:{type:l.DataTypes.INTEGER,allowNull:!1},curve_fit_end_index:{type:l.DataTypes.INTEGER,allowNull:!0},curve_fit_max_nrse:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_slope_vs_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_min_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_start_index:{type:l.DataTypes.INTEGER,allowNull:!0},intended_concentration:{type:l.DataTypes.FLOAT,allowNull:!1},invalid_bias:{type:l.DataTypes.INTEGER,allowNull:!1},is_signal_loss_detection_enabled:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_probe_check_use_delta_pc:{type:l.DataTypes.BOOLEAN,allowNull:!1},name:{type:l.DataTypes.STRING(20),allowNull:!1},probe_check_max_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_min_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},reporter_name:{type:l.DataTypes.STRING(12),allowNull:!1},target:{type:l.DataTypes.BLOB,allowNull:!0},use_curve_fit:{type:l.DataTypes.BOOLEAN,allowNull:!1},use_curve_fit_end_data:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_curve_fit_on_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_curve_fit_start_background:{type:l.DataTypes.BOOLEAN,allowNull:!0},usage:{type:l.DataTypes.INTEGER,allowNull:!1},use_background_validation:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"analyte",schema:"dbo",timestamps:!1,indexes:[{name:"PK__analyte__3213E83F45720FCE",unique:!0,fields:[{name:"id"}]}]})}}t.Analyte=s},7237:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayChamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayChamber",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge",key:"id"}},chamber_number:{type:l.DataTypes.INTEGER,allowNull:!1},initial_volume:{type:l.DataTypes.INTEGER,allowNull:!1},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!1},name:{type:l.DataTypes.STRING(16),allowNull:!1}},{tableName:"assay_chamber",schema:"dbo",timestamps:!1,indexes:[{name:"PK__assay_ch__3213E83F3198BBBB",unique:!0,fields:[{name:"id"}]}]})}}t.AssayChamber=s},9295:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayExt=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayExt",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},position:{type:l.DataTypes.INTEGER,allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"assay_ext",schema:"dbo",timestamps:!1,indexes:[{name:"PK__assay_ex__3213E83F022A7289",unique:!0,fields:[{name:"id"}]},{name:"UX_assayext_assayid",unique:!0,fields:[{name:"assay_id"}]}]})}}t.AssayExt=s},3262:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Assay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Assay",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}},assay_index:{type:l.DataTypes.INTEGER,allowNull:!0},result_text_type:{type:l.DataTypes.INTEGER,allowNull:!0},allows_result_masking:{type:l.DataTypes.BOOLEAN,allowNull:!0},assay_lock_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_version:{type:l.DataTypes.INTEGER,allowNull:!0},command_bytes:{type:l.DataTypes.BLOB,allowNull:!0},command_sequence_format:{type:l.DataTypes.INTEGER,allowNull:!0},comments:{type:l.DataTypes.STRING(4e3),allowNull:!0},company_code:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},data_reduction_algorithm:{type:l.DataTypes.INTEGER,allowNull:!0},default_result_text_index:{type:l.DataTypes.INTEGER,allowNull:!0},default_text_color_reference:{type:l.DataTypes.INTEGER,allowNull:!0},disclaimer:{type:l.DataTypes.STRING(4e3),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_clia_waived:{type:l.DataTypes.BOOLEAN,allowNull:!0},lock_comments:{type:l.DataTypes.STRING(4e3),allowNull:!0},lock_time:{type:l.DataTypes.DATE,allowNull:!0},modification_time:{type:l.DataTypes.DATE,allowNull:!0},name:{type:l.DataTypes.STRING(32),allowNull:!1},need_lsp:{type:l.DataTypes.BOOLEAN,allowNull:!0},picture:{type:l.DataTypes.BLOB,allowNull:!0},prep_cartridge_shelf_life:{type:l.DataTypes.INTEGER,allowNull:!0},product_code:{type:l.DataTypes.INTEGER,allowNull:!0},sample_prep_instruction:{type:l.DataTypes.STRING(256),allowNull:!0},sample_prep_video:{type:l.DataTypes.BLOB,allowNull:!0},use_background_subtraction:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_melt_all_peaks:{type:l.DataTypes.BOOLEAN,allowNull:!0},melt_calculation_type:{type:l.DataTypes.INTEGER,allowNull:!0},user_name:{type:l.DataTypes.STRING(128),allowNull:!0}},{tableName:"assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__assay__3213E83FA31C85AC",unique:!0,fields:[{name:"id"}]},{name:"UX_assay_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.Assay=s},7023:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BasicOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("BasicOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}}},{tableName:"basic_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__basic_or__3213E83F1461EC00",unique:!0,fields:[{name:"id"}]}]})}}t.BasicOrganism=s},7747:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CartridgeType=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CartridgeType",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},adc_2_psi:{type:l.DataTypes.FLOAT,allowNull:!1},air_chamber:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_foot_height:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_version:{type:l.DataTypes.INTEGER,allowNull:!1},creation_time:{type:l.DataTypes.DATE,allowNull:!1},direct_flow_rate_max:{type:l.DataTypes.FLOAT,allowNull:!1},direct_flow_rate_min:{type:l.DataTypes.FLOAT,allowNull:!1},direct_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},filter_flow_rate_max:{type:l.DataTypes.FLOAT,allowNull:!1},filter_flow_rate_min:{type:l.DataTypes.FLOAT,allowNull:!1},filter_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},initial_aspirate_flow_rate:{type:l.DataTypes.FLOAT,allowNull:!1},initial_aspirate_volume:{type:l.DataTypes.INTEGER,allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},max_pressure:{type:l.DataTypes.INTEGER,allowNull:!1},microliters_per_revolution:{type:l.DataTypes.FLOAT,allowNull:!1},min_pressure:{type:l.DataTypes.INTEGER,allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1},overflow_chamber:{type:l.DataTypes.INTEGER,allowNull:!1},picture:{type:l.DataTypes.BLOB,allowNull:!0},plunger_pickup_position:{type:l.DataTypes.INTEGER,allowNull:!1},plunger_strip_position:{type:l.DataTypes.INTEGER,allowNull:!1},syringe_max_transfer_volume:{type:l.DataTypes.INTEGER,allowNull:!1},syringe_max_volume:{type:l.DataTypes.INTEGER,allowNull:!1},syringe_min_transfer_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_chamber_number:{type:l.DataTypes.INTEGER,allowNull:!1},tube_chamber_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_pressurized_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_syringe_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_volume:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"cartridge_type",schema:"dbo",timestamps:!1,indexes:[{name:"PK__cartridg__3213E83FBEDCCE47",unique:!0,fields:[{name:"id"}]},{name:"UX_cartridgetype_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.CartridgeType=s},4786:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Cartridge=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Cartridge",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},air_chamber:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_type_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge_type",key:"id"}},overflow_chamber:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"cartridge",schema:"dbo",timestamps:!1,indexes:[{name:"PK__cartridg__3213E83FC188E9DE",unique:!0,fields:[{name:"id"}]}]})}}t.Cartridge=s},72:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Chamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Chamber",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge_type",key:"id"}},chamber_number:{type:l.DataTypes.INTEGER,allowNull:!1},max_volume:{type:l.DataTypes.INTEGER,allowNull:!1},min_volume:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"chamber",schema:"dbo",timestamps:!1,indexes:[{name:"PK__chamber__3213E83F0917E88C",unique:!0,fields:[{name:"id"}]}]})}}t.Chamber=s},1245:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ChannelProcessedDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ChannelProcessedDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte_result",key:"id"}},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"channel_processed_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_channel_processed_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__channel___3213E83E2B0FCE58",unique:!0,fields:[{name:"id"}]}]})}}t.ChannelProcessedDataItem=s},2762:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ChannelRawDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ChannelRawDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"channel_raw_data",key:"id"}},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0},timestamps:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"channel_raw_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_channel_raw_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__channel___3213E83E9C17EB49",unique:!0,fields:[{name:"id"}]}]})}}t.ChannelRawDataItem=s},1843:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ChannelRawDatum=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ChannelRawDatum",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test_data",key:"id"}},protocol_number:{type:l.DataTypes.INTEGER,allowNull:!1},channel_name:{type:l.DataTypes.STRING(32),allowNull:!1}},{tableName:"channel_raw_data",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_channel_raw_data_parent_id",fields:[{name:"parent_id"}]},{name:"PK__channel___3213E83EE6BEF901",unique:!0,fields:[{name:"id"}]}]})}}t.ChannelRawDatum=s},1328:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalAnalyteDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalAnalyteDataItem",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"channel_processed_data_item",key:"id"}},organism_index:{type:l.DataTypes.INTEGER,allowNull:!0},calculation_index:{type:l.DataTypes.INTEGER,allowNull:!0},row_index:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"clinical_analyte_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F0CD269AC",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalAnalyteDataItem=s},3525:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalAnalyteResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalAnalyteResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"analyte_result",key:"id"}}},{tableName:"clinical_analyte_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FFA28E224",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalAnalyteResult=s},524:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalAssay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"clinical_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FF50319E1",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalAssay=s},9505:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalCalculationInput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalCalculationInput",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_input",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_calculation_row",key:"id"}}},{tableName:"clinical_calculation_input",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F414142BF",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalCalculationInput=s},1349:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalCalculationOutput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalCalculationOutput",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_output",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_calculation_row",key:"id"}}},{tableName:"clinical_calculation_output",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F4BBB0C99",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalCalculationOutput=s},76:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalCalculationRow=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalCalculationRow",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_calculation",key:"id"}},row_index:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_calculation_row",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F5B82DD16",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalCalculationRow=s},4944:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalCalculation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalCalculation",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_organism",key:"id"}},calculation_index:{type:l.DataTypes.INTEGER,allowNull:!1},description:{type:l.DataTypes.STRING(200),allowNull:!1},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_calculation",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F9541F948",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalCalculation=s},394:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalActionFinalResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalActionFinalResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_conditional_action",key:"id"}},result_text:{type:l.DataTypes.INTEGER,allowNull:!0},result_color:{type:l.DataTypes.INTEGER,allowNull:!1},formatted_result:{type:l.DataTypes.STRING(100),allowNull:!0}},{tableName:"clinical_conditional_action_final_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FCC4B13C0",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalActionFinalResult=s},4966:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalActionInput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalActionInput",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_input",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_conditional_action",key:"id"}}},{tableName:"clinical_conditional_action_input",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FEFE9E46E",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalActionInput=s},6025:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalActionOutput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalActionOutput",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_output",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_conditional_action",key:"id"}}},{tableName:"clinical_conditional_action_output",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F9516484F",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalActionOutput=s},1649:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalAction=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalAction",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_conditional_row",key:"id"}},action_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_conditional_action",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F4F69BFC0",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalAction=s},1737:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalCellBoolean=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalCellBoolean",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_conditional_cell",key:"id"}},pass_on_true:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"clinical_conditional_cell_boolean",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F77B37E6A",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalCellBoolean=s},396:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalCellInput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalCellInput",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_input",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_conditional_cell",key:"id"}}},{tableName:"clinical_conditional_cell_input",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F7103405A",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalCellInput=s},6199:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalCellNumeric=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalCellNumeric",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_conditional_cell",key:"id"}},comparator:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_conditional_cell_numeric",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FA2655DA8",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalCellNumeric=s},8085:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalCell=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalCell",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_conditional_row",key:"id"}},cell_index:{type:l.DataTypes.INTEGER,allowNull:!1},cell_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_conditional_cell",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F03BC1C65",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalCell=s},7243:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalRow=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalRow",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_calculation",key:"id"}},row_index:{type:l.DataTypes.INTEGER,allowNull:!1},anded:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"clinical_conditional_row",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F8B8030AD",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalRow=s},8263:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalDataItemHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalDataItemHistory",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_test_history",key:"id"}},assay_index:{type:l.DataTypes.INTEGER,allowNull:!0},item_type:{type:l.DataTypes.INTEGER,allowNull:!1},item_index:{type:l.DataTypes.INTEGER,allowNull:!1},item_name:{type:l.DataTypes.STRING(64),allowNull:!1},item_value:{type:l.DataTypes.TEXT,allowNull:!1}},{tableName:"clinical_data_item_history",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_clinical_data_item_history_parent_id",fields:[{name:"parent_id"}]},{name:"PK__clinical__3213E83E85137B98",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalDataItemHistory=s},9838:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorChoiceValue=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorChoiceValue",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_factor",key:"id"}},description:{type:l.DataTypes.STRING(200),allowNull:!1},value_index:{type:l.DataTypes.INTEGER,allowNull:!1},value:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"clinical_factor_choice_value",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F86CD6890",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorChoiceValue=s},1387:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorDouble=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorDouble",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_factor",key:"id"}},max_value:{type:l.DataTypes.FLOAT,allowNull:!0},max_inclusive:{type:l.DataTypes.BOOLEAN,allowNull:!0},min_value:{type:l.DataTypes.FLOAT,allowNull:!0},min_inclusive:{type:l.DataTypes.BOOLEAN,allowNull:!0},scale:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_factor_double",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F9FC35501",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorDouble=s},7308:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorHistory",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_test_history",key:"id"}},factor_index:{type:l.DataTypes.INTEGER,allowNull:!1},factor_value:{type:l.DataTypes.TEXT,allowNull:!0}},{tableName:"clinical_factor_history",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_clinical_factor_history_parent_id",fields:[{name:"parent_id"}]},{name:"PK__clinical__3213E83E8816DFD4",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorHistory=s},165:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorInteger=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorInteger",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_factor",key:"id"}},max_value:{type:l.DataTypes.INTEGER,allowNull:!0},max_inclusive:{type:l.DataTypes.BOOLEAN,allowNull:!0},min_value:{type:l.DataTypes.INTEGER,allowNull:!0},min_inclusive:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"clinical_factor_integer",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F5DE2C715",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorInteger=s},8127:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorIntervalRange=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorIntervalRange",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_factor",key:"id"}},max_value:{type:l.DataTypes.FLOAT,allowNull:!0},max_inclusive:{type:l.DataTypes.BOOLEAN,allowNull:!0},min_value:{type:l.DataTypes.FLOAT,allowNull:!0},min_inclusive:{type:l.DataTypes.BOOLEAN,allowNull:!0},range_index:{type:l.DataTypes.INTEGER,allowNull:!1},value:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"clinical_factor_interval_range",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FCDBAF07C",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorIntervalRange=s},2995:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorInterval=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorInterval",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_factor",key:"id"}},scale:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_factor_interval",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F6C72855B",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorInterval=s},7395:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorText",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_factor",key:"id"}},max_length:{type:l.DataTypes.INTEGER,allowNull:!0},min_length:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"clinical_factor_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F438B66D2",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorText=s},2327:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorValue=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorValue",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},factor_index:{type:l.DataTypes.INTEGER,allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0}},{tableName:"clinical_factor_value",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_clinical_factor_value_parent_id",fields:[{name:"parent_id"}]},{name:"PK__clinical__3213E83E8C7743F0",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorValue=s},6072:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactor=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactor",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},type:{type:l.DataTypes.INTEGER,allowNull:!1},factor_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1},required:{type:l.DataTypes.BOOLEAN,allowNull:!1},reportable:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"clinical_factor",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F6E1A38C3",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactor=s},8206:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalInput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalInput",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_index:{type:l.DataTypes.INTEGER,allowNull:!0},input_index:{type:l.DataTypes.INTEGER,allowNull:!1},item_index:{type:l.DataTypes.INTEGER,allowNull:!0},item_name:{type:l.DataTypes.STRING(64),allowNull:!0},item_type:{type:l.DataTypes.INTEGER,allowNull:!1},item_value:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"clinical_input",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F74FD12D5",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalInput=s},4411:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalOrganismDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalOrganismDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_organism_result",key:"id"}},calculation_index:{type:l.DataTypes.INTEGER,allowNull:!1},row_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0}},{tableName:"clinical_organism_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_clinical_organism_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__clinical__3213E83E7D5A9F8B",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalOrganismDataItem=s},2837:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},formatted_result:{type:l.DataTypes.TEXT,allowNull:!0}},{tableName:"clinical_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F0BF84811",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalOrganismResult=s},823:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}}},{tableName:"clinical_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F91CC7040",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalOrganism=s},9554:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalOutput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalOutput",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_index:{type:l.DataTypes.INTEGER,allowNull:!0},item_type:{type:l.DataTypes.INTEGER,allowNull:!1},item_index:{type:l.DataTypes.INTEGER,allowNull:!1},output_name:{type:l.DataTypes.STRING(64),allowNull:!1},scale:{type:l.DataTypes.INTEGER,allowNull:!1},persisted:{type:l.DataTypes.BOOLEAN,allowNull:!1},reportable:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"clinical_output",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F14B9ED43",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalOutput=s},1491:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalReagentLot",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"reagent_lot",key:"id"}}},{tableName:"clinical_reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F4E29E422",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalReagentLot=s},3999:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalSampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalSampleSetting",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"sample_setting",key:"id"}},lsp1:{type:l.DataTypes.FLOAT,allowNull:!0},lsp2:{type:l.DataTypes.FLOAT,allowNull:!0},lsp3:{type:l.DataTypes.FLOAT,allowNull:!0},lsp4:{type:l.DataTypes.FLOAT,allowNull:!0},lsp5:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"clinical_sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FD8FB1F3C",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalSampleSetting=s},6277:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalTestHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalTestHistory",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"test_history",key:"id"}},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_color:{type:l.DataTypes.TEXT,allowNull:!0},change_notes:{type:l.DataTypes.STRING(512),allowNull:!0}},{tableName:"clinical_test_history",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FE9C5E368",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalTestHistory=s},9891:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorDisclaimer=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ColorDisclaimer",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},color:{type:l.DataTypes.INTEGER,allowNull:!1},disclaimer:{type:l.DataTypes.STRING(256),allowNull:!0}},{tableName:"color_disclaimer",schema:"dbo",timestamps:!1,indexes:[{name:"PK__color_di__3213E83FAE3B421D",unique:!0,fields:[{name:"id"}]}]})}}t.ColorDisclaimer=s},2469:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Config",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},param_key:{type:l.DataTypes.STRING(64),allowNull:!0},param_val:{type:l.DataTypes.STRING(512),allowNull:!0}},{tableName:"config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__config__3213E83FC1650530",unique:!0,fields:[{name:"id"}]},{name:"UX_config_paramkey",unique:!0,fields:[{name:"param_key"}]}]})}}t.Config=s},1630:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CrosstalkCorrResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CrosstalkCorrResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte_result",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte",key:"id"}},protocol_index:{type:l.DataTypes.INTEGER,allowNull:!1},ignore_code:{type:l.DataTypes.STRING(64),allowNull:!1},correlation_slope:{type:l.DataTypes.FLOAT,allowNull:!0},correlation_r2:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"crosstalk_corr_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_crosstalk_corr_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__crosstal__3213E83E0C67F430",unique:!0,fields:[{name:"id"}]}]})}}t.CrosstalkCorrResult=s},611:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DeltaCtOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("DeltaCtOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"basic_organism",key:"id"}},delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!1},delta_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"delta_ct_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__delta_ct__3213E83F4A8FAF95",unique:!0,fields:[{name:"id"}]}]})}}t.DeltaCtOrganism=s},6688:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DisabledModule=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("DisabledModule",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!1},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"disabled_module",schema:"dbo",timestamps:!1,indexes:[{name:"PK__disabled__3213E83F9BC346A8",unique:!0,fields:[{name:"id"}]},{name:"UX_disabledmodule_siteserialnumber",unique:!0,fields:[{name:"site_serial_number"}]}]})}}t.DisabledModule=s},6778:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingHaplotypeOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingHaplotypeOrganism",{haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"haplotype",key:"id"}},genotyping_organism_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"genotyping_organism",key:"id"}}},{tableName:"genotyping_haplotype_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__060A713D62762933",unique:!0,fields:[{name:"haplotype_id"},{name:"genotyping_organism_id"}]},{name:"UX_gho_haplotypeid_genotypingorganismid",unique:!0,fields:[{name:"haplotype_id"},{name:"genotyping_organism_id"}]}]})}}t.GenotypingHaplotypeOrganism=s},6331:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}}},{tableName:"genotyping_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__3213E83F30C3A17A",unique:!0,fields:[{name:"id"}]}]})}}t.GenotypingOrganismResult=s},4037:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},early_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!1},late_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"genotyping_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__3213E83FE30FD201",unique:!0,fields:[{name:"id"}]}]})}}t.GenotypingOrganism=s},9059:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetupAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetupAssay",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},graph_setup_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"graph_setup",key:"id"}},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}}},{tableName:"graph_setup_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__graph_se__3213E83FD6372598",unique:!0,fields:[{name:"id"}]},{name:"UX_graphsetupassay_graphsetupid_assayid",unique:!0,fields:[{name:"graph_setup_id"},{name:"assay_id"}]}]})}}t.GraphSetupAssay=s},6898:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetup",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},graph_type:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!1},is_default:{type:l.DataTypes.BOOLEAN,allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1}},{tableName:"graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__graph_se__3213E83F9C07A4B9",unique:!0,fields:[{name:"id"}]}]})}}t.GraphSetup=s},6919:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.HaplotypeResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("HaplotypeResultText",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"haplotype",key:"id"}},alleles_text1:{type:l.DataTypes.STRING(10),allowNull:!1},alleles_text2:{type:l.DataTypes.STRING(10),allowNull:!1},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(11),allowNull:!1},text_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"haplotype_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK__haplotyp__3213E83F72031D90",unique:!0,fields:[{name:"id"}]}]})}}t.HaplotypeResultText=s},8932:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.HaplotypeResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("HaplotypeResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"haplotype",key:"id"}},allele1_text:{type:l.DataTypes.TEXT,allowNull:!1},allele2_text:{type:l.DataTypes.TEXT,allowNull:!1},result_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"haplotype_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_haplotype_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__haplotyp__3213E83E3CD9584C",unique:!0,fields:[{name:"id"}]}]})}}t.HaplotypeResult=s},904:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Haplotype=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Haplotype",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},haplotype_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(20),allowNull:!1}},{tableName:"haplotype",schema:"dbo",timestamps:!1,indexes:[{name:"PK__haplotyp__3213E83FF5494E7E",unique:!0,fields:[{name:"id"}]}]})}}t.Haplotype=s},7228:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DeltaCtOrganism=t.CrosstalkCorrResult=t.Config=t.ColorDisclaimer=t.ClinicalTestHistory=t.ClinicalSampleSetting=t.ClinicalReagentLot=t.ClinicalOutput=t.ClinicalOrganismResult=t.ClinicalOrganismDataItem=t.ClinicalOrganism=t.ClinicalInput=t.ClinicalFactorValue=t.ClinicalFactorText=t.ClinicalFactorIntervalRange=t.ClinicalFactorInterval=t.ClinicalFactorInteger=t.ClinicalFactorHistory=t.ClinicalFactorDouble=t.ClinicalFactorChoiceValue=t.ClinicalFactor=t.ClinicalDataItemHistory=t.ClinicalConditionalRow=t.ClinicalConditionalCellNumeric=t.ClinicalConditionalCellInput=t.ClinicalConditionalCellBoolean=t.ClinicalConditionalCell=t.ClinicalConditionalActionOutput=t.ClinicalConditionalActionInput=t.ClinicalConditionalActionFinalResult=t.ClinicalConditionalAction=t.ClinicalCalculationRow=t.ClinicalCalculationOutput=t.ClinicalCalculationInput=t.ClinicalCalculation=t.ClinicalAssay=t.ClinicalAnalyteResult=t.ClinicalAnalyteDataItem=t.ChannelRawDataItem=t.ChannelRawDatum=t.ChannelProcessedDataItem=t.Chamber=t.CartridgeType=t.Cartridge=t.BasicOrganism=t.AssayExt=t.AssayChamber=t.Assay=t.AnalyteResult=t.Analyte=void 0,t.Reporter=t.ReportGraphSetting=t.ReagentLot=t.RawDataItem=t.QuantUnitSetting=t.Quant1SampleSetting=t.Quant1Result=t.Quant1ReagentLot=t.Quant1OrganismResult=t.Quant1Organism=t.QcTest=t.QcResult=t.QcLockoutSetting=t.PressureGraphSetup=t.PercentRatioSampleSetting=t.PercentRatioResultEvaluator=t.PercentRatioReagentLot=t.PercentRatioOrganismResult=t.PercentRatioOrganism=t.Patient=t.Path=t.OrganismTarget=t.OrganismResultText=t.OrganismResult=t.OrganismBasedOrganismResult=t.Organism=t.OpticsGraphSetup=t.MeltPeakSetting=t.MeltPeakResult=t.MeltGraphSetup=t.LisUpload=t.LisTestOrder=t.LisOrganismConfig=t.LisHaplotypeConfig=t.LisGenotypingAssayConfig=t.LisAssayConfig=t.LdaOrganismResult=t.LdaOrganism=t.LdaCoefficient=t.LdaAnalyte=t.Instrument=t.HaplotypeResultText=t.HaplotypeResult=t.Haplotype=t.GraphSetupAssay=t.GraphSetup=t.GenotypingOrganismResult=t.GenotypingOrganism=t.GenotypingHaplotypeOrganism=t.DisabledModule=void 0,t.initModels=t.User=t.UserPrivilege=t.UserLockout=t.UserExt=t.UltrasonicGraphSetup=t.TestHistory=t.TestExt=t.TestError=t.TestDataError=t.TestDatum=t.TestBlogCounter=t.TestBlog=t.Test=t.TemperatureGraphSetup=t.TargetBasedOrganism=t.SystemLog=t.SemiQuantOrganism=t.SelectedQuantUnitSetting=t.SampleType=t.SampleSetting=t.RunDatum=t.ResultRuleMeltPeak=t.ResultRuleInterpretation=t.ResultRuleAnalyte=t.ResultMaskingConfig=t.ResultEvaluator=t.ResultCalculation=void 0;const l=a(2794);Object.defineProperty(t,"Analyte",{enumerable:!0,get:function(){return l.Analyte}});const s=a(7978);Object.defineProperty(t,"AnalyteResult",{enumerable:!0,get:function(){return s.AnalyteResult}});const n=a(3262);Object.defineProperty(t,"Assay",{enumerable:!0,get:function(){return n.Assay}});const i=a(7237);Object.defineProperty(t,"AssayChamber",{enumerable:!0,get:function(){return i.AssayChamber}});const o=a(9295);Object.defineProperty(t,"AssayExt",{enumerable:!0,get:function(){return o.AssayExt}});const r=a(7023);Object.defineProperty(t,"BasicOrganism",{enumerable:!0,get:function(){return r.BasicOrganism}});const p=a(4786);Object.defineProperty(t,"Cartridge",{enumerable:!0,get:function(){return p.Cartridge}});const y=a(7747);Object.defineProperty(t,"CartridgeType",{enumerable:!0,get:function(){return y.CartridgeType}});const u=a(72);Object.defineProperty(t,"Chamber",{enumerable:!0,get:function(){return u.Chamber}});const d=a(1245);Object.defineProperty(t,"ChannelProcessedDataItem",{enumerable:!0,get:function(){return d.ChannelProcessedDataItem}});const _=a(1843);Object.defineProperty(t,"ChannelRawDatum",{enumerable:!0,get:function(){return _.ChannelRawDatum}});const m=a(2762);Object.defineProperty(t,"ChannelRawDataItem",{enumerable:!0,get:function(){return m.ChannelRawDataItem}});const c=a(1328);Object.defineProperty(t,"ClinicalAnalyteDataItem",{enumerable:!0,get:function(){return c.ClinicalAnalyteDataItem}});const T=a(3525);Object.defineProperty(t,"ClinicalAnalyteResult",{enumerable:!0,get:function(){return T.ClinicalAnalyteResult}});const N=a(524);Object.defineProperty(t,"ClinicalAssay",{enumerable:!0,get:function(){return N.ClinicalAssay}});const g=a(4944);Object.defineProperty(t,"ClinicalCalculation",{enumerable:!0,get:function(){return g.ClinicalCalculation}});const f=a(9505);Object.defineProperty(t,"ClinicalCalculationInput",{enumerable:!0,get:function(){return f.ClinicalCalculationInput}});const D=a(1349);Object.defineProperty(t,"ClinicalCalculationOutput",{enumerable:!0,get:function(){return D.ClinicalCalculationOutput}});const E=a(76);Object.defineProperty(t,"ClinicalCalculationRow",{enumerable:!0,get:function(){return E.ClinicalCalculationRow}});const b=a(1649);Object.defineProperty(t,"ClinicalConditionalAction",{enumerable:!0,get:function(){return b.ClinicalConditionalAction}});const w=a(394);Object.defineProperty(t,"ClinicalConditionalActionFinalResult",{enumerable:!0,get:function(){return w.ClinicalConditionalActionFinalResult}});const I=a(4966);Object.defineProperty(t,"ClinicalConditionalActionInput",{enumerable:!0,get:function(){return I.ClinicalConditionalActionInput}});const R=a(6025);Object.defineProperty(t,"ClinicalConditionalActionOutput",{enumerable:!0,get:function(){return R.ClinicalConditionalActionOutput}});const O=a(8085);Object.defineProperty(t,"ClinicalConditionalCell",{enumerable:!0,get:function(){return O.ClinicalConditionalCell}});const h=a(1737);Object.defineProperty(t,"ClinicalConditionalCellBoolean",{enumerable:!0,get:function(){return h.ClinicalConditionalCellBoolean}});const M=a(396);Object.defineProperty(t,"ClinicalConditionalCellInput",{enumerable:!0,get:function(){return M.ClinicalConditionalCellInput}});const G=a(6199);Object.defineProperty(t,"ClinicalConditionalCellNumeric",{enumerable:!0,get:function(){return G.ClinicalConditionalCellNumeric}});const v=a(7243);Object.defineProperty(t,"ClinicalConditionalRow",{enumerable:!0,get:function(){return v.ClinicalConditionalRow}});const A=a(8263);Object.defineProperty(t,"ClinicalDataItemHistory",{enumerable:!0,get:function(){return A.ClinicalDataItemHistory}});const P=a(6072);Object.defineProperty(t,"ClinicalFactor",{enumerable:!0,get:function(){return P.ClinicalFactor}});const S=a(9838);Object.defineProperty(t,"ClinicalFactorChoiceValue",{enumerable:!0,get:function(){return S.ClinicalFactorChoiceValue}});const L=a(1387);Object.defineProperty(t,"ClinicalFactorDouble",{enumerable:!0,get:function(){return L.ClinicalFactorDouble}});const K=a(7308);Object.defineProperty(t,"ClinicalFactorHistory",{enumerable:!0,get:function(){return K.ClinicalFactorHistory}});const C=a(165);Object.defineProperty(t,"ClinicalFactorInteger",{enumerable:!0,get:function(){return C.ClinicalFactorInteger}});const x=a(2995);Object.defineProperty(t,"ClinicalFactorInterval",{enumerable:!0,get:function(){return x.ClinicalFactorInterval}});const j=a(8127);Object.defineProperty(t,"ClinicalFactorIntervalRange",{enumerable:!0,get:function(){return j.ClinicalFactorIntervalRange}});const F=a(7395);Object.defineProperty(t,"ClinicalFactorText",{enumerable:!0,get:function(){return F.ClinicalFactorText}});const k=a(2327);Object.defineProperty(t,"ClinicalFactorValue",{enumerable:!0,get:function(){return k.ClinicalFactorValue}});const q=a(8206);Object.defineProperty(t,"ClinicalInput",{enumerable:!0,get:function(){return q.ClinicalInput}});const B=a(823);Object.defineProperty(t,"ClinicalOrganism",{enumerable:!0,get:function(){return B.ClinicalOrganism}});const Q=a(4411);Object.defineProperty(t,"ClinicalOrganismDataItem",{enumerable:!0,get:function(){return Q.ClinicalOrganismDataItem}});const U=a(2837);Object.defineProperty(t,"ClinicalOrganismResult",{enumerable:!0,get:function(){return U.ClinicalOrganismResult}});const H=a(9554);Object.defineProperty(t,"ClinicalOutput",{enumerable:!0,get:function(){return H.ClinicalOutput}});const X=a(1491);Object.defineProperty(t,"ClinicalReagentLot",{enumerable:!0,get:function(){return X.ClinicalReagentLot}});const V=a(3999);Object.defineProperty(t,"ClinicalSampleSetting",{enumerable:!0,get:function(){return V.ClinicalSampleSetting}});const z=a(6277);Object.defineProperty(t,"ClinicalTestHistory",{enumerable:!0,get:function(){return z.ClinicalTestHistory}});const J=a(9891);Object.defineProperty(t,"ColorDisclaimer",{enumerable:!0,get:function(){return J.ColorDisclaimer}});const Y=a(2469);Object.defineProperty(t,"Config",{enumerable:!0,get:function(){return Y.Config}});const W=a(1630);Object.defineProperty(t,"CrosstalkCorrResult",{enumerable:!0,get:function(){return W.CrosstalkCorrResult}});const $=a(611);Object.defineProperty(t,"DeltaCtOrganism",{enumerable:!0,get:function(){return $.DeltaCtOrganism}});const Z=a(6688);Object.defineProperty(t,"DisabledModule",{enumerable:!0,get:function(){return Z.DisabledModule}});const ee=a(6778);Object.defineProperty(t,"GenotypingHaplotypeOrganism",{enumerable:!0,get:function(){return ee.GenotypingHaplotypeOrganism}});const te=a(4037);Object.defineProperty(t,"GenotypingOrganism",{enumerable:!0,get:function(){return te.GenotypingOrganism}});const ae=a(6331);Object.defineProperty(t,"GenotypingOrganismResult",{enumerable:!0,get:function(){return ae.GenotypingOrganismResult}});const le=a(6898);Object.defineProperty(t,"GraphSetup",{enumerable:!0,get:function(){return le.GraphSetup}});const se=a(9059);Object.defineProperty(t,"GraphSetupAssay",{enumerable:!0,get:function(){return se.GraphSetupAssay}});const ne=a(904);Object.defineProperty(t,"Haplotype",{enumerable:!0,get:function(){return ne.Haplotype}});const ie=a(8932);Object.defineProperty(t,"HaplotypeResult",{enumerable:!0,get:function(){return ie.HaplotypeResult}});const oe=a(6919);Object.defineProperty(t,"HaplotypeResultText",{enumerable:!0,get:function(){return oe.HaplotypeResultText}});const re=a(5160);Object.defineProperty(t,"Instrument",{enumerable:!0,get:function(){return re.Instrument}});const pe=a(1608);Object.defineProperty(t,"LdaAnalyte",{enumerable:!0,get:function(){return pe.LdaAnalyte}});const ye=a(7176);Object.defineProperty(t,"LdaCoefficient",{enumerable:!0,get:function(){return ye.LdaCoefficient}});const ue=a(8529);Object.defineProperty(t,"LdaOrganism",{enumerable:!0,get:function(){return ue.LdaOrganism}});const de=a(7853);Object.defineProperty(t,"LdaOrganismResult",{enumerable:!0,get:function(){return de.LdaOrganismResult}});const _e=a(625);Object.defineProperty(t,"LisAssayConfig",{enumerable:!0,get:function(){return _e.LisAssayConfig}});const me=a(6465);Object.defineProperty(t,"LisGenotypingAssayConfig",{enumerable:!0,get:function(){return me.LisGenotypingAssayConfig}});const ce=a(7946);Object.defineProperty(t,"LisHaplotypeConfig",{enumerable:!0,get:function(){return ce.LisHaplotypeConfig}});const Te=a(672);Object.defineProperty(t,"LisOrganismConfig",{enumerable:!0,get:function(){return Te.LisOrganismConfig}});const Ne=a(2938);Object.defineProperty(t,"LisTestOrder",{enumerable:!0,get:function(){return Ne.LisTestOrder}});const ge=a(6522);Object.defineProperty(t,"LisUpload",{enumerable:!0,get:function(){return ge.LisUpload}});const fe=a(6611);Object.defineProperty(t,"MeltGraphSetup",{enumerable:!0,get:function(){return fe.MeltGraphSetup}});const De=a(227);Object.defineProperty(t,"MeltPeakResult",{enumerable:!0,get:function(){return De.MeltPeakResult}});const Ee=a(9073);Object.defineProperty(t,"MeltPeakSetting",{enumerable:!0,get:function(){return Ee.MeltPeakSetting}});const be=a(8396);Object.defineProperty(t,"OpticsGraphSetup",{enumerable:!0,get:function(){return be.OpticsGraphSetup}});const we=a(848);Object.defineProperty(t,"Organism",{enumerable:!0,get:function(){return we.Organism}});const Ie=a(7029);Object.defineProperty(t,"OrganismBasedOrganismResult",{enumerable:!0,get:function(){return Ie.OrganismBasedOrganismResult}});const Re=a(4701);Object.defineProperty(t,"OrganismResult",{enumerable:!0,get:function(){return Re.OrganismResult}});const Oe=a(2677);Object.defineProperty(t,"OrganismResultText",{enumerable:!0,get:function(){return Oe.OrganismResultText}});const he=a(8456);Object.defineProperty(t,"OrganismTarget",{enumerable:!0,get:function(){return he.OrganismTarget}});const Me=a(7762);Object.defineProperty(t,"Path",{enumerable:!0,get:function(){return Me.Path}});const Ge=a(2157);Object.defineProperty(t,"Patient",{enumerable:!0,get:function(){return Ge.Patient}});const ve=a(8967);Object.defineProperty(t,"PercentRatioOrganism",{enumerable:!0,get:function(){return ve.PercentRatioOrganism}});const Ae=a(1604);Object.defineProperty(t,"PercentRatioOrganismResult",{enumerable:!0,get:function(){return Ae.PercentRatioOrganismResult}});const Pe=a(7189);Object.defineProperty(t,"PercentRatioReagentLot",{enumerable:!0,get:function(){return Pe.PercentRatioReagentLot}});const Se=a(8524);Object.defineProperty(t,"PercentRatioResultEvaluator",{enumerable:!0,get:function(){return Se.PercentRatioResultEvaluator}});const Le=a(7287);Object.defineProperty(t,"PercentRatioSampleSetting",{enumerable:!0,get:function(){return Le.PercentRatioSampleSetting}});const Ke=a(459);Object.defineProperty(t,"PressureGraphSetup",{enumerable:!0,get:function(){return Ke.PressureGraphSetup}});const Ce=a(5503);Object.defineProperty(t,"QcLockoutSetting",{enumerable:!0,get:function(){return Ce.QcLockoutSetting}});const xe=a(2190);Object.defineProperty(t,"QcResult",{enumerable:!0,get:function(){return xe.QcResult}});const je=a(4230);Object.defineProperty(t,"QcTest",{enumerable:!0,get:function(){return je.QcTest}});const Fe=a(7284);Object.defineProperty(t,"Quant1Organism",{enumerable:!0,get:function(){return Fe.Quant1Organism}});const ke=a(6774);Object.defineProperty(t,"Quant1OrganismResult",{enumerable:!0,get:function(){return ke.Quant1OrganismResult}});const qe=a(8925);Object.defineProperty(t,"Quant1ReagentLot",{enumerable:!0,get:function(){return qe.Quant1ReagentLot}});const Be=a(7795);Object.defineProperty(t,"Quant1Result",{enumerable:!0,get:function(){return Be.Quant1Result}});const Qe=a(6977);Object.defineProperty(t,"Quant1SampleSetting",{enumerable:!0,get:function(){return Qe.Quant1SampleSetting}});const Ue=a(589);Object.defineProperty(t,"QuantUnitSetting",{enumerable:!0,get:function(){return Ue.QuantUnitSetting}});const He=a(2132);Object.defineProperty(t,"RawDataItem",{enumerable:!0,get:function(){return He.RawDataItem}});const Xe=a(9092);Object.defineProperty(t,"ReagentLot",{enumerable:!0,get:function(){return Xe.ReagentLot}});const Ve=a(5076);Object.defineProperty(t,"ReportGraphSetting",{enumerable:!0,get:function(){return Ve.ReportGraphSetting}});const ze=a(617);Object.defineProperty(t,"Reporter",{enumerable:!0,get:function(){return ze.Reporter}});const Je=a(3513);Object.defineProperty(t,"ResultCalculation",{enumerable:!0,get:function(){return Je.ResultCalculation}});const Ye=a(7014);Object.defineProperty(t,"ResultEvaluator",{enumerable:!0,get:function(){return Ye.ResultEvaluator}});const We=a(8770);Object.defineProperty(t,"ResultMaskingConfig",{enumerable:!0,get:function(){return We.ResultMaskingConfig}});const $e=a(6430);Object.defineProperty(t,"ResultRuleAnalyte",{enumerable:!0,get:function(){return $e.ResultRuleAnalyte}});const Ze=a(872);Object.defineProperty(t,"ResultRuleInterpretation",{enumerable:!0,get:function(){return Ze.ResultRuleInterpretation}});const et=a(3051);Object.defineProperty(t,"ResultRuleMeltPeak",{enumerable:!0,get:function(){return et.ResultRuleMeltPeak}});const tt=a(2658);Object.defineProperty(t,"RunDatum",{enumerable:!0,get:function(){return tt.RunDatum}});const at=a(591);Object.defineProperty(t,"SampleSetting",{enumerable:!0,get:function(){return at.SampleSetting}});const lt=a(7919);Object.defineProperty(t,"SampleType",{enumerable:!0,get:function(){return lt.SampleType}});const st=a(7167);Object.defineProperty(t,"SelectedQuantUnitSetting",{enumerable:!0,get:function(){return st.SelectedQuantUnitSetting}});const nt=a(7020);Object.defineProperty(t,"SemiQuantOrganism",{enumerable:!0,get:function(){return nt.SemiQuantOrganism}});const it=a(4617);Object.defineProperty(t,"SystemLog",{enumerable:!0,get:function(){return it.SystemLog}});const ot=a(922);Object.defineProperty(t,"TargetBasedOrganism",{enumerable:!0,get:function(){return ot.TargetBasedOrganism}});const rt=a(7571);Object.defineProperty(t,"TemperatureGraphSetup",{enumerable:!0,get:function(){return rt.TemperatureGraphSetup}});const pt=a(1731);Object.defineProperty(t,"Test",{enumerable:!0,get:function(){return pt.Test}});const yt=a(4715);Object.defineProperty(t,"TestBlog",{enumerable:!0,get:function(){return yt.TestBlog}});const ut=a(248);Object.defineProperty(t,"TestBlogCounter",{enumerable:!0,get:function(){return ut.TestBlogCounter}});const dt=a(4309);Object.defineProperty(t,"TestDatum",{enumerable:!0,get:function(){return dt.TestDatum}});const _t=a(196);Object.defineProperty(t,"TestDataError",{enumerable:!0,get:function(){return _t.TestDataError}});const mt=a(1591);Object.defineProperty(t,"TestError",{enumerable:!0,get:function(){return mt.TestError}});const ct=a(5748);Object.defineProperty(t,"TestExt",{enumerable:!0,get:function(){return ct.TestExt}});const Tt=a(1396);Object.defineProperty(t,"TestHistory",{enumerable:!0,get:function(){return Tt.TestHistory}});const Nt=a(2535);Object.defineProperty(t,"UltrasonicGraphSetup",{enumerable:!0,get:function(){return Nt.UltrasonicGraphSetup}});const gt=a(9884);Object.defineProperty(t,"UserExt",{enumerable:!0,get:function(){return gt.UserExt}});const ft=a(6772);Object.defineProperty(t,"UserLockout",{enumerable:!0,get:function(){return ft.UserLockout}});const Dt=a(1701);Object.defineProperty(t,"UserPrivilege",{enumerable:!0,get:function(){return Dt.UserPrivilege}});const Et=a(8655);Object.defineProperty(t,"User",{enumerable:!0,get:function(){return Et.User}}),t.initModels=function(e){const t=l.Analyte.initModel(e),a=s.AnalyteResult.initModel(e),bt=n.Assay.initModel(e),wt=i.AssayChamber.initModel(e),It=o.AssayExt.initModel(e),Rt=r.BasicOrganism.initModel(e),Ot=p.Cartridge.initModel(e),ht=y.CartridgeType.initModel(e),Mt=u.Chamber.initModel(e),Gt=d.ChannelProcessedDataItem.initModel(e),vt=_.ChannelRawDatum.initModel(e),At=m.ChannelRawDataItem.initModel(e),Pt=c.ClinicalAnalyteDataItem.initModel(e),St=T.ClinicalAnalyteResult.initModel(e),Lt=N.ClinicalAssay.initModel(e),Kt=g.ClinicalCalculation.initModel(e),Ct=f.ClinicalCalculationInput.initModel(e),xt=D.ClinicalCalculationOutput.initModel(e),jt=E.ClinicalCalculationRow.initModel(e),Ft=b.ClinicalConditionalAction.initModel(e),kt=w.ClinicalConditionalActionFinalResult.initModel(e),qt=I.ClinicalConditionalActionInput.initModel(e),Bt=R.ClinicalConditionalActionOutput.initModel(e),Qt=O.ClinicalConditionalCell.initModel(e),Ut=h.ClinicalConditionalCellBoolean.initModel(e),Ht=M.ClinicalConditionalCellInput.initModel(e),Xt=G.ClinicalConditionalCellNumeric.initModel(e),Vt=v.ClinicalConditionalRow.initModel(e),zt=A.ClinicalDataItemHistory.initModel(e),Jt=P.ClinicalFactor.initModel(e),Yt=S.ClinicalFactorChoiceValue.initModel(e),Wt=L.ClinicalFactorDouble.initModel(e),$t=K.ClinicalFactorHistory.initModel(e),Zt=C.ClinicalFactorInteger.initModel(e),ea=x.ClinicalFactorInterval.initModel(e),ta=j.ClinicalFactorIntervalRange.initModel(e),aa=F.ClinicalFactorText.initModel(e),la=k.ClinicalFactorValue.initModel(e),sa=q.ClinicalInput.initModel(e),na=B.ClinicalOrganism.initModel(e),ia=Q.ClinicalOrganismDataItem.initModel(e),oa=U.ClinicalOrganismResult.initModel(e),ra=H.ClinicalOutput.initModel(e),pa=X.ClinicalReagentLot.initModel(e),ya=V.ClinicalSampleSetting.initModel(e),ua=z.ClinicalTestHistory.initModel(e),da=J.ColorDisclaimer.initModel(e),_a=Y.Config.initModel(e),ma=W.CrosstalkCorrResult.initModel(e),ca=$.DeltaCtOrganism.initModel(e),Ta=Z.DisabledModule.initModel(e),Na=ee.GenotypingHaplotypeOrganism.initModel(e),ga=te.GenotypingOrganism.initModel(e),fa=ae.GenotypingOrganismResult.initModel(e),Da=le.GraphSetup.initModel(e),Ea=se.GraphSetupAssay.initModel(e),ba=ne.Haplotype.initModel(e),wa=ie.HaplotypeResult.initModel(e),Ia=oe.HaplotypeResultText.initModel(e),Ra=re.Instrument.initModel(e),Oa=pe.LdaAnalyte.initModel(e),ha=ye.LdaCoefficient.initModel(e),Ma=ue.LdaOrganism.initModel(e),Ga=de.LdaOrganismResult.initModel(e),va=_e.LisAssayConfig.initModel(e),Aa=me.LisGenotypingAssayConfig.initModel(e),Pa=ce.LisHaplotypeConfig.initModel(e),Sa=Te.LisOrganismConfig.initModel(e),La=Ne.LisTestOrder.initModel(e),Ka=ge.LisUpload.initModel(e),Ca=fe.MeltGraphSetup.initModel(e),xa=De.MeltPeakResult.initModel(e),ja=Ee.MeltPeakSetting.initModel(e),Fa=be.OpticsGraphSetup.initModel(e),ka=we.Organism.initModel(e),qa=Ie.OrganismBasedOrganismResult.initModel(e),Ba=Re.OrganismResult.initModel(e),Qa=Oe.OrganismResultText.initModel(e),Ua=he.OrganismTarget.initModel(e),Ha=Me.Path.initModel(e),Xa=Ge.Patient.initModel(e),Va=ve.PercentRatioOrganism.initModel(e),za=Ae.PercentRatioOrganismResult.initModel(e),Ja=Pe.PercentRatioReagentLot.initModel(e),Ya=Se.PercentRatioResultEvaluator.initModel(e),Wa=Le.PercentRatioSampleSetting.initModel(e),$a=Ke.PressureGraphSetup.initModel(e),Za=Ce.QcLockoutSetting.initModel(e),el=xe.QcResult.initModel(e),tl=je.QcTest.initModel(e),al=Fe.Quant1Organism.initModel(e),ll=ke.Quant1OrganismResult.initModel(e),sl=qe.Quant1ReagentLot.initModel(e),nl=Be.Quant1Result.initModel(e),il=Qe.Quant1SampleSetting.initModel(e),ol=Ue.QuantUnitSetting.initModel(e),rl=He.RawDataItem.initModel(e),pl=Xe.ReagentLot.initModel(e),yl=Ve.ReportGraphSetting.initModel(e),ul=ze.Reporter.initModel(e),dl=Je.ResultCalculation.initModel(e),_l=Ye.ResultEvaluator.initModel(e),ml=We.ResultMaskingConfig.initModel(e),cl=$e.ResultRuleAnalyte.initModel(e),Tl=Ze.ResultRuleInterpretation.initModel(e),Nl=et.ResultRuleMeltPeak.initModel(e),gl=tt.RunDatum.initModel(e),fl=at.SampleSetting.initModel(e),Dl=lt.SampleType.initModel(e),El=st.SelectedQuantUnitSetting.initModel(e),bl=nt.SemiQuantOrganism.initModel(e),wl=it.SystemLog.initModel(e),Il=ot.TargetBasedOrganism.initModel(e),Rl=rt.TemperatureGraphSetup.initModel(e),Ol=pt.Test.initModel(e),hl=yt.TestBlog.initModel(e),Ml=ut.TestBlogCounter.initModel(e),Gl=dt.TestDatum.initModel(e),vl=_t.TestDataError.initModel(e),Al=mt.TestError.initModel(e),Pl=ct.TestExt.initModel(e),Sl=Tt.TestHistory.initModel(e),Ll=Nt.UltrasonicGraphSetup.initModel(e),Kl=gt.UserExt.initModel(e),Cl=ft.UserLockout.initModel(e),xl=Dt.UserPrivilege.initModel(e),jl=Et.User.initModel(e);return ga.belongsToMany(ba,{as:"haplotype_id_haplotypes",through:Na,foreignKey:"genotyping_organism_id",otherKey:"haplotype_id"}),ba.belongsToMany(ga,{as:"genotyping_organism_id_genotyping_organisms",through:Na,foreignKey:"haplotype_id",otherKey:"genotyping_organism_id"}),a.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(a,{as:"analyte_results",foreignKey:"analyte_id"}),ma.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(ma,{as:"crosstalk_corr_results",foreignKey:"analyte_id"}),Oa.belongsTo(t,{as:"id_analyte",foreignKey:"id"}),t.hasOne(Oa,{as:"lda_analyte",foreignKey:"id"}),ha.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(ha,{as:"lda_coefficients",foreignKey:"analyte_id"}),ja.belongsTo(t,{as:"parent",foreignKey:"parent_id"}),t.hasMany(ja,{as:"melt_peak_settings",foreignKey:"parent_id"}),Ua.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(Ua,{as:"organism_targets",foreignKey:"analyte_id"}),za.belongsTo(t,{as:"calculation_target",foreignKey:"calculation_target_id"}),t.hasMany(za,{as:"percent_ratio_organism_results",foreignKey:"calculation_target_id"}),za.belongsTo(t,{as:"reporting_target",foreignKey:"reporting_target_id"}),t.hasMany(za,{as:"reporting_target_percent_ratio_organism_results",foreignKey:"reporting_target_id"}),Ya.belongsTo(t,{as:"calculation_target",foreignKey:"calculation_target_id"}),t.hasMany(Ya,{as:"percent_ratio_result_evaluators",foreignKey:"calculation_target_id"}),Ya.belongsTo(t,{as:"reporting_target",foreignKey:"reporting_target_id"}),t.hasMany(Ya,{as:"reporting_target_percent_ratio_result_evaluators",foreignKey:"reporting_target_id"}),cl.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(cl,{as:"result_rule_analytes",foreignKey:"analyte_id"}),fl.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(fl,{as:"sample_settings",foreignKey:"analyte_id"}),Gt.belongsTo(a,{as:"parent",foreignKey:"parent_id"}),a.hasMany(Gt,{as:"channel_processed_data_items",foreignKey:"parent_id"}),St.belongsTo(a,{as:"id_analyte_result",foreignKey:"id"}),a.hasOne(St,{as:"clinical_analyte_result",foreignKey:"id"}),ma.belongsTo(a,{as:"parent",foreignKey:"parent_id"}),a.hasMany(ma,{as:"crosstalk_corr_results",foreignKey:"parent_id"}),xa.belongsTo(a,{as:"parent",foreignKey:"parent_id"}),a.hasMany(xa,{as:"melt_peak_results",foreignKey:"parent_id"}),t.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(t,{as:"analytes",foreignKey:"parent_id"}),bt.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(bt,{as:"assays",foreignKey:"parent_id"}),It.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(It,{as:"assay_exts",foreignKey:"assay_id"}),Ot.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(Ot,{as:"cartridges",foreignKey:"parent_id"}),Lt.belongsTo(bt,{as:"id_assay",foreignKey:"id"}),bt.hasOne(Lt,{as:"clinical_assay",foreignKey:"id"}),Jt.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(Jt,{as:"clinical_factors",foreignKey:"parent_id"}),da.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(da,{as:"color_disclaimers",foreignKey:"parent_id"}),Ea.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(Ea,{as:"graph_setup_assays",foreignKey:"assay_id"}),ba.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(ba,{as:"haplotypes",foreignKey:"parent_id"}),va.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(va,{as:"lis_assay_configs",foreignKey:"assay_id"}),ka.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(ka,{as:"organisms",foreignKey:"parent_id"}),pl.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(pl,{as:"reagent_lots",foreignKey:"parent_id"}),yl.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(yl,{as:"report_graph_settings",foreignKey:"assay_id"}),dl.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(dl,{as:"result_calculations",foreignKey:"parent_id"}),Dl.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(Dl,{as:"sample_types",foreignKey:"parent_id"}),El.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(El,{as:"selected_quant_unit_settings",foreignKey:"assay_id"}),Ol.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(Ol,{as:"tests",foreignKey:"assay_id"}),hl.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(hl,{as:"test_blogs",foreignKey:"assay_id"}),Za.belongsTo(It,{as:"parent",foreignKey:"parent_id"}),It.hasMany(Za,{as:"qc_lockout_settings",foreignKey:"parent_id"}),ml.belongsTo(It,{as:"parent",foreignKey:"parent_id"}),It.hasMany(ml,{as:"result_masking_configs",foreignKey:"parent_id"}),ca.belongsTo(Rt,{as:"id_basic_organism",foreignKey:"id"}),Rt.hasOne(ca,{as:"delta_ct_organism",foreignKey:"id"}),bl.belongsTo(Rt,{as:"id_basic_organism",foreignKey:"id"}),Rt.hasOne(bl,{as:"semi_quant_organism",foreignKey:"id"}),wt.belongsTo(Ot,{as:"parent",foreignKey:"parent_id"}),Ot.hasMany(wt,{as:"assay_chambers",foreignKey:"parent_id"}),Ot.belongsTo(ht,{as:"cartridge_type",foreignKey:"cartridge_type_id"}),ht.hasMany(Ot,{as:"cartridges",foreignKey:"cartridge_type_id"}),Mt.belongsTo(ht,{as:"parent",foreignKey:"parent_id"}),ht.hasMany(Mt,{as:"chambers",foreignKey:"parent_id"}),Ha.belongsTo(ht,{as:"parent",foreignKey:"parent_id"}),ht.hasMany(Ha,{as:"paths",foreignKey:"parent_id"}),Pt.belongsTo(Gt,{as:"id_channel_processed_data_item",foreignKey:"id"}),Gt.hasOne(Pt,{as:"clinical_analyte_data_item",foreignKey:"id"}),At.belongsTo(vt,{as:"parent",foreignKey:"parent_id"}),vt.hasMany(At,{as:"channel_raw_data_items",foreignKey:"parent_id"}),jt.belongsTo(Kt,{as:"parent",foreignKey:"parent_id"}),Kt.hasMany(jt,{as:"clinical_calculation_rows",foreignKey:"parent_id"}),Vt.belongsTo(Kt,{as:"parent",foreignKey:"parent_id"}),Kt.hasMany(Vt,{as:"clinical_conditional_rows",foreignKey:"parent_id"}),Ct.belongsTo(jt,{as:"parent",foreignKey:"parent_id"}),jt.hasMany(Ct,{as:"clinical_calculation_inputs",foreignKey:"parent_id"}),xt.belongsTo(jt,{as:"parent",foreignKey:"parent_id"}),jt.hasMany(xt,{as:"clinical_calculation_outputs",foreignKey:"parent_id"}),kt.belongsTo(Ft,{as:"id_clinical_conditional_action",foreignKey:"id"}),Ft.hasOne(kt,{as:"clinical_conditional_action_final_result",foreignKey:"id"}),qt.belongsTo(Ft,{as:"parent",foreignKey:"parent_id"}),Ft.hasMany(qt,{as:"clinical_conditional_action_inputs",foreignKey:"parent_id"}),Bt.belongsTo(Ft,{as:"parent",foreignKey:"parent_id"}),Ft.hasMany(Bt,{as:"clinical_conditional_action_outputs",foreignKey:"parent_id"}),Ut.belongsTo(Qt,{as:"id_clinical_conditional_cell",foreignKey:"id"}),Qt.hasOne(Ut,{as:"clinical_conditional_cell_boolean",foreignKey:"id"}),Ht.belongsTo(Qt,{as:"parent",foreignKey:"parent_id"}),Qt.hasMany(Ht,{as:"clinical_conditional_cell_inputs",foreignKey:"parent_id"}),Xt.belongsTo(Qt,{as:"id_clinical_conditional_cell",foreignKey:"id"}),Qt.hasOne(Xt,{as:"clinical_conditional_cell_numeric",foreignKey:"id"}),Ft.belongsTo(Vt,{as:"parent",foreignKey:"parent_id"}),Vt.hasMany(Ft,{as:"clinical_conditional_actions",foreignKey:"parent_id"}),Qt.belongsTo(Vt,{as:"parent",foreignKey:"parent_id"}),Vt.hasMany(Qt,{as:"clinical_conditional_cells",foreignKey:"parent_id"}),Yt.belongsTo(Jt,{as:"parent",foreignKey:"parent_id"}),Jt.hasMany(Yt,{as:"clinical_factor_choice_values",foreignKey:"parent_id"}),Wt.belongsTo(Jt,{as:"id_clinical_factor",foreignKey:"id"}),Jt.hasOne(Wt,{as:"clinical_factor_double",foreignKey:"id"}),Zt.belongsTo(Jt,{as:"id_clinical_factor",foreignKey:"id"}),Jt.hasOne(Zt,{as:"clinical_factor_integer",foreignKey:"id"}),ea.belongsTo(Jt,{as:"id_clinical_factor",foreignKey:"id"}),Jt.hasOne(ea,{as:"clinical_factor_interval",foreignKey:"id"}),ta.belongsTo(Jt,{as:"parent",foreignKey:"parent_id"}),Jt.hasMany(ta,{as:"clinical_factor_interval_ranges",foreignKey:"parent_id"}),aa.belongsTo(Jt,{as:"id_clinical_factor",foreignKey:"id"}),Jt.hasOne(aa,{as:"clinical_factor_text",foreignKey:"id"}),Ct.belongsTo(sa,{as:"id_clinical_input",foreignKey:"id"}),sa.hasOne(Ct,{as:"clinical_calculation_input",foreignKey:"id"}),qt.belongsTo(sa,{as:"id_clinical_input",foreignKey:"id"}),sa.hasOne(qt,{as:"clinical_conditional_action_input",foreignKey:"id"}),Ht.belongsTo(sa,{as:"id_clinical_input",foreignKey:"id"}),sa.hasOne(Ht,{as:"clinical_conditional_cell_input",foreignKey:"id"}),Kt.belongsTo(na,{as:"parent",foreignKey:"parent_id"}),na.hasMany(Kt,{as:"clinical_calculations",foreignKey:"parent_id"}),ia.belongsTo(oa,{as:"parent",foreignKey:"parent_id"}),oa.hasMany(ia,{as:"clinical_organism_data_items",foreignKey:"parent_id"}),xt.belongsTo(ra,{as:"id_clinical_output",foreignKey:"id"}),ra.hasOne(xt,{as:"clinical_calculation_output",foreignKey:"id"}),Bt.belongsTo(ra,{as:"id_clinical_output",foreignKey:"id"}),ra.hasOne(Bt,{as:"clinical_conditional_action_output",foreignKey:"id"}),zt.belongsTo(ua,{as:"parent",foreignKey:"parent_id"}),ua.hasMany(zt,{as:"clinical_data_item_histories",foreignKey:"parent_id"}),$t.belongsTo(ua,{as:"parent",foreignKey:"parent_id"}),ua.hasMany($t,{as:"clinical_factor_histories",foreignKey:"parent_id"}),Na.belongsTo(ga,{as:"genotyping_organism",foreignKey:"genotyping_organism_id"}),ga.hasMany(Na,{as:"genotyping_haplotype_organisms",foreignKey:"genotyping_organism_id"}),Ea.belongsTo(Da,{as:"graph_setup",foreignKey:"graph_setup_id"}),Da.hasMany(Ea,{as:"graph_setup_assays",foreignKey:"graph_setup_id"}),Ca.belongsTo(Da,{as:"id_graph_setup",foreignKey:"id"}),Da.hasOne(Ca,{as:"melt_graph_setup",foreignKey:"id"}),Fa.belongsTo(Da,{as:"id_graph_setup",foreignKey:"id"}),Da.hasOne(Fa,{as:"optics_graph_setup",foreignKey:"id"}),$a.belongsTo(Da,{as:"id_graph_setup",foreignKey:"id"}),Da.hasOne($a,{as:"pressure_graph_setup",foreignKey:"id"}),Rl.belongsTo(Da,{as:"id_graph_setup",foreignKey:"id"}),Da.hasOne(Rl,{as:"temperature_graph_setup",foreignKey:"id"}),Ll.belongsTo(Da,{as:"id_graph_setup",foreignKey:"id"}),Da.hasOne(Ll,{as:"ultrasonic_graph_setup",foreignKey:"id"}),Na.belongsTo(ba,{as:"haplotype",foreignKey:"haplotype_id"}),ba.hasMany(Na,{as:"genotyping_haplotype_organisms",foreignKey:"haplotype_id"}),wa.belongsTo(ba,{as:"haplotype",foreignKey:"haplotype_id"}),ba.hasMany(wa,{as:"haplotype_results",foreignKey:"haplotype_id"}),Ia.belongsTo(ba,{as:"parent",foreignKey:"parent_id"}),ba.hasMany(Ia,{as:"haplotype_result_texts",foreignKey:"parent_id"}),Pa.belongsTo(ba,{as:"haplotype",foreignKey:"haplotype_id"}),ba.hasMany(Pa,{as:"lis_haplotype_configs",foreignKey:"haplotype_id"}),ha.belongsTo(Ma,{as:"parent",foreignKey:"parent_id"}),Ma.hasMany(ha,{as:"lda_coefficients",foreignKey:"parent_id"}),Aa.belongsTo(va,{as:"id_lis_assay_config",foreignKey:"id"}),va.hasOne(Aa,{as:"lis_genotyping_assay_config",foreignKey:"id"}),Ka.belongsTo(La,{as:"test_order",foreignKey:"test_order_id"}),La.hasMany(Ka,{as:"lis_uploads",foreignKey:"test_order_id"}),Rt.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(Rt,{as:"basic_organism",foreignKey:"id"}),na.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(na,{as:"clinical_organism",foreignKey:"id"}),ga.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(ga,{as:"genotyping_organism",foreignKey:"id"}),Ma.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(Ma,{as:"lda_organism",foreignKey:"id"}),Sa.belongsTo(ka,{as:"organism",foreignKey:"organism_id"}),ka.hasMany(Sa,{as:"lis_organism_configs",foreignKey:"organism_id"}),Ba.belongsTo(ka,{as:"organism",foreignKey:"organism_id"}),ka.hasMany(Ba,{as:"organism_results",foreignKey:"organism_id"}),Qa.belongsTo(ka,{as:"parent",foreignKey:"parent_id"}),ka.hasMany(Qa,{as:"organism_result_texts",foreignKey:"parent_id"}),Ua.belongsTo(ka,{as:"parent",foreignKey:"parent_id"}),ka.hasMany(Ua,{as:"organism_targets",foreignKey:"parent_id"}),Va.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(Va,{as:"percent_ratio_organism",foreignKey:"id"}),al.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(al,{as:"quant1_organism",foreignKey:"id"}),_l.belongsTo(ka,{as:"parent",foreignKey:"parent_id"}),ka.hasMany(_l,{as:"result_evaluators",foreignKey:"parent_id"}),ml.belongsTo(ka,{as:"organism",foreignKey:"organism_id"}),ka.hasMany(ml,{as:"result_masking_configs",foreignKey:"organism_id"}),Il.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(Il,{as:"target_based_organism",foreignKey:"id"}),oa.belongsTo(Ba,{as:"id_organism_result",foreignKey:"id"}),Ba.hasOne(oa,{as:"clinical_organism_result",foreignKey:"id"}),fa.belongsTo(Ba,{as:"id_organism_result",foreignKey:"id"}),Ba.hasOne(fa,{as:"genotyping_organism_result",foreignKey:"id"}),Ga.belongsTo(Ba,{as:"id_organism_result",foreignKey:"id"}),Ba.hasOne(Ga,{as:"lda_organism_result",foreignKey:"id"}),qa.belongsTo(Ba,{as:"id_organism_result",foreignKey:"id"}),Ba.hasOne(qa,{as:"organism_based_organism_result",foreignKey:"id"}),za.belongsTo(Ba,{as:"id_organism_result",foreignKey:"id"}),Ba.hasOne(za,{as:"percent_ratio_organism_result",foreignKey:"id"}),ll.belongsTo(Ba,{as:"id_organism_result",foreignKey:"id"}),Ba.hasOne(ll,{as:"quant1_organism_result",foreignKey:"id"}),La.belongsTo(Xa,{as:"patient",foreignKey:"patient_id"}),Xa.hasMany(La,{as:"lis_test_orders",foreignKey:"patient_id"}),Ol.belongsTo(Xa,{as:"patient",foreignKey:"patient_id"}),Xa.hasMany(Ol,{as:"tests",foreignKey:"patient_id"}),tl.belongsTo(el,{as:"parent",foreignKey:"parent_id"}),el.hasMany(tl,{as:"qc_tests",foreignKey:"parent_id"}),ol.belongsTo(al,{as:"parent",foreignKey:"parent_id"}),al.hasMany(ol,{as:"quant_unit_settings",foreignKey:"parent_id"}),nl.belongsTo(ll,{as:"parent",foreignKey:"parent_id"}),ll.hasMany(nl,{as:"quant1_results",foreignKey:"parent_id"}),nl.belongsTo(ol,{as:"quant_unit_setting",foreignKey:"quant_unit_setting_id"}),ol.hasMany(nl,{as:"quant1_results",foreignKey:"quant_unit_setting_id"}),pa.belongsTo(pl,{as:"id_reagent_lot",foreignKey:"id"}),pl.hasOne(pa,{as:"clinical_reagent_lot",foreignKey:"id"}),Ja.belongsTo(pl,{as:"id_reagent_lot",foreignKey:"id"}),pl.hasOne(Ja,{as:"percent_ratio_reagent_lot",foreignKey:"id"}),sl.belongsTo(pl,{as:"id_reagent_lot",foreignKey:"id"}),pl.hasOne(sl,{as:"quant1_reagent_lot",foreignKey:"id"}),fl.belongsTo(pl,{as:"parent",foreignKey:"parent_id"}),pl.hasMany(fl,{as:"sample_settings",foreignKey:"parent_id"}),cl.belongsTo(_l,{as:"parent",foreignKey:"parent_id"}),_l.hasMany(cl,{as:"result_rule_analytes",foreignKey:"parent_id"}),Tl.belongsTo(cl,{as:"id_result_rule_analyte",foreignKey:"id"}),cl.hasOne(Tl,{as:"result_rule_interpretation",foreignKey:"id"}),Nl.belongsTo(cl,{as:"id_result_rule_analyte",foreignKey:"id"}),cl.hasOne(Nl,{as:"result_rule_melt_peak",foreignKey:"id"}),ya.belongsTo(fl,{as:"id_sample_setting",foreignKey:"id"}),fl.hasOne(ya,{as:"clinical_sample_setting",foreignKey:"id"}),Wa.belongsTo(fl,{as:"id_sample_setting",foreignKey:"id"}),fl.hasOne(Wa,{as:"percent_ratio_sample_setting",foreignKey:"id"}),il.belongsTo(fl,{as:"id_sample_setting",foreignKey:"id"}),fl.hasOne(il,{as:"quant1_sample_setting",foreignKey:"id"}),a.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasMany(a,{as:"analyte_results",foreignKey:"parent_id"}),la.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasMany(la,{as:"clinical_factor_values",foreignKey:"parent_id"}),wa.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasMany(wa,{as:"haplotype_results",foreignKey:"parent_id"}),La.belongsTo(Ol,{as:"test",foreignKey:"test_id"}),Ol.hasMany(La,{as:"lis_test_orders",foreignKey:"test_id"}),Ka.belongsTo(Ol,{as:"test",foreignKey:"test_id"}),Ol.hasMany(Ka,{as:"lis_uploads",foreignKey:"test_id"}),Ba.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasMany(Ba,{as:"organism_results",foreignKey:"parent_id"}),Ol.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.belongsTo(jl,{as:"user",foreignKey:"user_login_name",targetKey:"login_name"}),Ol.hasMany(Ol,{as:"tests",foreignKey:"parent_id"}),Gl.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasOne(Gl,{as:"test_data",foreignKey:"parent_id"}),Al.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasMany(Al,{as:"test_errors",foreignKey:"parent_id"}),Pl.belongsTo(Ol,{as:"id_test",foreignKey:"id"}),Ol.hasOne(Pl,{as:"test_ext",foreignKey:"id"}),Sl.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasMany(Sl,{as:"test_histories",foreignKey:"parent_id"}),Ml.belongsTo(hl,{as:"test_blog",foreignKey:"test_blog_id"}),hl.hasMany(Ml,{as:"test_blog_counters",foreignKey:"test_blog_id"}),vt.belongsTo(Gl,{as:"parent",foreignKey:"parent_id"}),Gl.hasMany(vt,{as:"channel_raw_data",foreignKey:"parent_id"}),rl.belongsTo(Gl,{as:"parent",foreignKey:"parent_id"}),Gl.hasMany(rl,{as:"raw_data_items",foreignKey:"parent_id"}),gl.belongsTo(Gl,{as:"test_datum",foreignKey:"test_data_id"}),Gl.hasOne(gl,{as:"run_data",foreignKey:"test_data_id"}),vl.belongsTo(Gl,{as:"parent",foreignKey:"parent_id"}),Gl.hasMany(vl,{as:"test_data_errors",foreignKey:"parent_id"}),ua.belongsTo(Sl,{as:"id_test_history",foreignKey:"id"}),Sl.hasOne(ua,{as:"clinical_test_history",foreignKey:"id"}),Kl.belongsTo(jl,{as:"id_user",foreignKey:"id"}),jl.hasOne(Kl,{as:"user_ext",foreignKey:"id"}),{Analyte:t,AnalyteResult:a,Assay:bt,AssayChamber:wt,AssayExt:It,BasicOrganism:Rt,Cartridge:Ot,CartridgeType:ht,Chamber:Mt,ChannelProcessedDataItem:Gt,ChannelRawDatum:vt,ChannelRawDataItem:At,ClinicalAnalyteDataItem:Pt,ClinicalAnalyteResult:St,ClinicalAssay:Lt,ClinicalCalculation:Kt,ClinicalCalculationInput:Ct,ClinicalCalculationOutput:xt,ClinicalCalculationRow:jt,ClinicalConditionalAction:Ft,ClinicalConditionalActionFinalResult:kt,ClinicalConditionalActionInput:qt,ClinicalConditionalActionOutput:Bt,ClinicalConditionalCell:Qt,ClinicalConditionalCellBoolean:Ut,ClinicalConditionalCellInput:Ht,ClinicalConditionalCellNumeric:Xt,ClinicalConditionalRow:Vt,ClinicalDataItemHistory:zt,ClinicalFactor:Jt,ClinicalFactorChoiceValue:Yt,ClinicalFactorDouble:Wt,ClinicalFactorHistory:$t,ClinicalFactorInteger:Zt,ClinicalFactorInterval:ea,ClinicalFactorIntervalRange:ta,ClinicalFactorText:aa,ClinicalFactorValue:la,ClinicalInput:sa,ClinicalOrganism:na,ClinicalOrganismDataItem:ia,ClinicalOrganismResult:oa,ClinicalOutput:ra,ClinicalReagentLot:pa,ClinicalSampleSetting:ya,ClinicalTestHistory:ua,ColorDisclaimer:da,Config:_a,CrosstalkCorrResult:ma,DeltaCtOrganism:ca,DisabledModule:Ta,GenotypingHaplotypeOrganism:Na,GenotypingOrganism:ga,GenotypingOrganismResult:fa,GraphSetup:Da,GraphSetupAssay:Ea,Haplotype:ba,HaplotypeResult:wa,HaplotypeResultText:Ia,Instrument:Ra,LdaAnalyte:Oa,LdaCoefficient:ha,LdaOrganism:Ma,LdaOrganismResult:Ga,LisAssayConfig:va,LisGenotypingAssayConfig:Aa,LisHaplotypeConfig:Pa,LisOrganismConfig:Sa,LisTestOrder:La,LisUpload:Ka,MeltGraphSetup:Ca,MeltPeakResult:xa,MeltPeakSetting:ja,OpticsGraphSetup:Fa,Organism:ka,OrganismBasedOrganismResult:qa,OrganismResult:Ba,OrganismResultText:Qa,OrganismTarget:Ua,Path:Ha,Patient:Xa,PercentRatioOrganism:Va,PercentRatioOrganismResult:za,PercentRatioReagentLot:Ja,PercentRatioResultEvaluator:Ya,PercentRatioSampleSetting:Wa,PressureGraphSetup:$a,QcLockoutSetting:Za,QcResult:el,QcTest:tl,Quant1Organism:al,Quant1OrganismResult:ll,Quant1ReagentLot:sl,Quant1Result:nl,Quant1SampleSetting:il,QuantUnitSetting:ol,RawDataItem:rl,ReagentLot:pl,ReportGraphSetting:yl,Reporter:ul,ResultCalculation:dl,ResultEvaluator:_l,ResultMaskingConfig:ml,ResultRuleAnalyte:cl,ResultRuleInterpretation:Tl,ResultRuleMeltPeak:Nl,RunDatum:gl,SampleSetting:fl,SampleType:Dl,SelectedQuantUnitSetting:El,SemiQuantOrganism:bl,SystemLog:wl,TargetBasedOrganism:Il,TemperatureGraphSetup:Rl,Test:Ol,TestBlog:hl,TestBlogCounter:Ml,TestDatum:Gl,TestDataError:vl,TestError:Al,TestExt:Pl,TestHistory:Sl,UltrasonicGraphSetup:Ll,UserExt:Kl,UserLockout:Cl,UserPrivilege:xl,User:jl}}},5160:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Instrument=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Instrument",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},mac_address:{type:l.DataTypes.BLOB,allowNull:!0},serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},letter_offset:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"instrument",schema:"dbo",timestamps:!1,indexes:[{name:"PK__instrume__3213E83F6675BC96",unique:!0,fields:[{name:"id"}]},{name:"UX_instrument_letteroffset",unique:!0,fields:[{name:"letter_offset"}]},{name:"UX_instrument_macaddress",unique:!0,fields:[{name:"mac_address"}]},{name:"UX_instrument_serialnumber",unique:!0,fields:[{name:"serial_number"}]}]})}}t.Instrument=s},1608:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaAnalyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaAnalyte",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"analyte",key:"id"}},cycle_if_no_ct:{type:l.DataTypes.INTEGER,allowNull:!1},min_ct_req_pass_controls:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"lda_analyte",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_anal__3213E83F8B6778C1",unique:!0,fields:[{name:"id"}]}]})}}t.LdaAnalyte=s},7176:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaCoefficient=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaCoefficient",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"lda_organism",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!1},delta_ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"lda_coefficient",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_coef__3213E83F223CDD5C",unique:!0,fields:[{name:"id"}]}]})}}t.LdaCoefficient=s},7853:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},lda_total:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"lda_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_orga__3213E83FD28170E9",unique:!0,fields:[{name:"id"}]}]})}}t.LdaOrganismResult=s},8529:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},cutoff:{type:l.DataTypes.FLOAT,allowNull:!1},intercept:{type:l.DataTypes.FLOAT,allowNull:!1},max_valid_range:{type:l.DataTypes.FLOAT,allowNull:!1},min_valid_range:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"lda_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_orga__3213E83F9FD9F26C",unique:!0,fields:[{name:"id"}]}]})}}t.LdaOrganism=s},625:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisAssayConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisAssayConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},test_code:{type:l.DataTypes.STRING(15),allowNull:!0},test_code_enabled:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"lis_assay_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_assa__3213E83FFE29AC11",unique:!0,fields:[{name:"id"}]}]})}}t.LisAssayConfig=s},6465:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisGenotypingAssayConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisGenotypingAssayConfig",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"lis_assay_config",key:"id"}}},{tableName:"lis_genotyping_assay_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_geno__3213E83F51EF8137",unique:!0,fields:[{name:"id"}]}]})}}t.LisGenotypingAssayConfig=s},7946:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisHaplotypeConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisHaplotypeConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"haplotype",key:"id"}},result_code:{type:l.DataTypes.STRING(15),allowNull:!0}},{tableName:"lis_haplotype_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_hapl__3213E83F34DD1BA3",unique:!0,fields:[{name:"id"}]}]})}}t.LisHaplotypeConfig=s},672:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisOrganismConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisOrganismConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},result_code:{type:l.DataTypes.STRING(15),allowNull:!0}},{tableName:"lis_organism_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_orga__3213E83F4812458C",unique:!0,fields:[{name:"id"}]}]})}}t.LisOrganismConfig=s},2938:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisTestOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisTestOrder",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},cartridge_id:{type:l.DataTypes.STRING(25),allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},host_test_code:{type:l.DataTypes.STRING(15),allowNull:!0},instrument_specific_sample_id:{type:l.DataTypes.STRING(32),allowNull:!0},order_status:{type:l.DataTypes.INTEGER,allowNull:!1},patient_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"patient",key:"id"}},priority:{type:l.DataTypes.INTEGER,allowNull:!1},sample_id:{type:l.DataTypes.STRING(25),allowNull:!0},sample_type:{type:l.DataTypes.STRING(5),allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test",key:"id"}}},{tableName:"lis_test_order",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_test__3213E83F7178DECE",unique:!0,fields:[{name:"id"}]},{name:"UX_listestorder_testid",unique:!0,fields:[{name:"test_id"}]}]})}}t.LisTestOrder=s},6522:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisUpload=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisUpload",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},test_order_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"lis_test_order",key:"id"}},upload_message_id:{type:l.DataTypes.STRING(64),allowNull:!0},upload_status:{type:l.DataTypes.INTEGER,allowNull:!1},sample_priority:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"lis_upload",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_uplo__3213E83F638B691C",unique:!0,fields:[{name:"id"}]},{name:"UX_lis_upload_test_id",unique:!0,fields:[{name:"test_id"}]}]})}}t.LisUpload=s},6611:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltGraphSetup",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"graph_setup",key:"id"}},show_raw:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_normalized:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_1st_derivative:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_baseline:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_delta:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_temperature:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_2nd_derivative:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_zeroLine:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_threshold:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_melt_peaks:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"melt_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__melt_gra__3213E83FD58D0244",unique:!0,fields:[{name:"id"}]}]})}}t.MeltGraphSetup=s},227:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte_result",key:"id"}},peak_height:{type:l.DataTypes.FLOAT,allowNull:!1},peak_index:{type:l.DataTypes.INTEGER,allowNull:!1},peak_temperature:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"melt_peak_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_melt_peak_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__melt_pea__3213E83E6D358FD1",unique:!0,fields:[{name:"id"}]}]})}}t.MeltPeakResult=s},9073:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte",key:"id"}},baseline_look_back:{type:l.DataTypes.FLOAT,allowNull:!0},baseline_num_points:{type:l.DataTypes.INTEGER,allowNull:!0},baseline_start_temp:{type:l.DataTypes.FLOAT,allowNull:!0},peak_range_max:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_min:{type:l.DataTypes.FLOAT,allowNull:!1},peak_threshold:{type:l.DataTypes.FLOAT,allowNull:!1},points_around_peak:{type:l.DataTypes.INTEGER,allowNull:!0},reportable_melt_type:{type:l.DataTypes.INTEGER,allowNull:!0},slope_positive:{type:l.DataTypes.BOOLEAN,allowNull:!1},valley_threshold:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"melt_peak_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__melt_pea__3213E83FF9DEB820",unique:!0,fields:[{name:"id"}]},{name:"UX_meltpeaksetting_parentid",unique:!0,fields:[{name:"parent_id"}]}]})}}t.MeltPeakSetting=s},8396:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OpticsGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OpticsGraphSetup",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"graph_setup",key:"id"}},show_primary:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_raw:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_curve_fit:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_res_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_normalized:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_2nd_derivative:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_threshold:{type:l.DataTypes.BOOLEAN,allowNull:!0},axes_type:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"optics_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__optics_g__3213E83FFFECD845",unique:!0,fields:[{name:"id"}]}]})}}t.OpticsGraphSetup=s},7029:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismBasedOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismBasedOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},semi_quant_level:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"organism_based_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83F11027669",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismBasedOrganismResult=s},2677:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultText",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(8),allowNull:!1},result_text:{type:l.DataTypes.INTEGER,allowNull:!1},text_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"organism_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83F9D7E3B70",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismResultText=s},4701:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"organism",key:"id"}},result_text:{type:l.DataTypes.INTEGER,allowNull:!0},result_color:{type:l.DataTypes.INTEGER,allowNull:!0},is_result_invalid:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_result_masked:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_organism_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__organism__3213E83EFB5E0D40",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismResult=s},8456:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismTarget=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismTarget",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}}},{tableName:"organism_target",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83FBF8598E6",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismTarget=s},848:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Organism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Organism",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},name:{type:l.DataTypes.STRING(32),allowNull:!1},organism_index:{type:l.DataTypes.INTEGER,allowNull:!1},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83F26F926ED",unique:!0,fields:[{name:"id"}]}]})}}t.Organism=s},7762:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Path=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Path",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge_type",key:"id"}},angular_offset:{type:l.DataTypes.FLOAT,allowNull:!1},chamber_number:{type:l.DataTypes.INTEGER,allowNull:!0},is_block:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!1},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"path",schema:"dbo",timestamps:!1,indexes:[{name:"PK__path__3213E83F240FBBF3",unique:!0,fields:[{name:"id"}]}]})}}t.Path=s},2157:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Patient=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Patient",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},gx_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},practice_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},family_name:{type:l.DataTypes.STRING(1552),allowNull:!0},given_name:{type:l.DataTypes.STRING(240),allowNull:!0},middle_name:{type:l.DataTypes.STRING(240),allowNull:!0},date_of_birth:{type:l.DataTypes.STRING(96),allowNull:!0},gender:{type:l.DataTypes.STRING(128),allowNull:!0},ethnicity:{type:l.DataTypes.STRING(512),allowNull:!0},postal_code:{type:l.DataTypes.STRING(96),allowNull:!0}},{tableName:"patient",schema:"dbo",timestamps:!1,indexes:[{name:"PK__patient__3213E83F541351BB",unique:!0,fields:[{name:"id"}]}]})}}t.Patient=s},1604:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},ratio_percent:{type:l.DataTypes.FLOAT,allowNull:!0},log_transform:{type:l.DataTypes.FLOAT,allowNull:!0},reporting_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},calculation_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},detailed_result:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"percent_ratio_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83FC6D34960",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioOrganismResult=s},8967:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},dynamic_range_max:{type:l.DataTypes.FLOAT,allowNull:!1},dynamic_range_min:{type:l.DataTypes.FLOAT,allowNull:!1},lod_loq:{type:l.DataTypes.FLOAT,allowNull:!1},log_transform_type:{type:l.DataTypes.INTEGER,allowNull:!1},units:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"percent_ratio_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F1369279B",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioOrganism=s},7189:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioReagentLot",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"reagent_lot",key:"id"}}},{tableName:"percent_ratio_reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83FAC63EA04",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioReagentLot=s},8524:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioResultEvaluator=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioResultEvaluator",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},calculation_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},reporting_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}}},{tableName:"percent_ratio_result_evaluator",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83FC91E78DE",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioResultEvaluator=s},7287:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioSampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioSampleSetting",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"sample_setting",key:"id"}},delta_ct_efficiency:{type:l.DataTypes.FLOAT,allowNull:!0},scaling_factor:{type:l.DataTypes.DECIMAL(5,2),allowNull:!0}},{tableName:"percent_ratio_sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F5A46BC97",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioSampleSetting=s},459:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PressureGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PressureGraphSetup",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"graph_setup",key:"id"}},show_assay_threshold:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_system_threshold:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"pressure_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__pressure__3213E83F32143A0B",unique:!0,fields:[{name:"id"}]}]})}}t.PressureGraphSetup=s},5503:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QcLockoutSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QcLockoutSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay_ext",key:"id"}},qc_enabled:{type:l.DataTypes.BOOLEAN,allowNull:!1},qc_on_lot:{type:l.DataTypes.BOOLEAN,allowNull:!1},frequency:{type:l.DataTypes.INTEGER,allowNull:!1},display:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"qc_lockout_settings",schema:"dbo",timestamps:!1,indexes:[{name:"PK__qc_locko__3213E83F6DF99E8C",unique:!0,fields:[{name:"id"}]}]})}}t.QcLockoutSetting=s},2190:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QcResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QcResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_name:{type:l.DataTypes.STRING(32),allowNull:!1},assay_version:{type:l.DataTypes.INTEGER,allowNull:!1},rgt_lot_id:{type:l.DataTypes.STRING(5),allowNull:!0},due_date:{type:l.DataTypes.DATE,allowNull:!1},completion_date:{type:l.DataTypes.DATE,allowNull:!0}},{tableName:"qc_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__qc_resul__3213E83FC6AB8A0D",unique:!0,fields:[{name:"id"}]}]})}}t.QcResult=s},4230:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QcTest=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QcTest",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"qc_result",key:"id"}},test_id:{type:l.DataTypes.INTEGER,allowNull:!0},status:{type:l.DataTypes.INTEGER,allowNull:!1},end_time:{type:l.DataTypes.DATE,allowNull:!0},is_pos:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"qc_test",schema:"dbo",timestamps:!1,indexes:[{name:"PK__qc_test__3213E83FADFD5E80",unique:!0,fields:[{name:"id"}]}]})}}t.QcTest=s},6774:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1OrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1OrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}}},{tableName:"quant1_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_o__3213E83F56AEF9A5",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1OrganismResult=s},7284:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1Organism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1Organism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},max_quantitative_delta:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"quant1_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_o__3213E83F0EE566DB",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1Organism=s},8925:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1ReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1ReagentLot",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"reagent_lot",key:"id"}}},{tableName:"quant1_reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_r__3213E83F68A59646",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1ReagentLot=s},7795:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1Result=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1Result",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"quant1_organism_result",key:"id"}},quantitative_result:{type:l.DataTypes.FLOAT,allowNull:!0},quant_unit_setting_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"quant_unit_setting",key:"id"}},result_abnormal_flag:{type:l.DataTypes.STRING(5),allowNull:!0}},{tableName:"quant1_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_quant1_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__quant1_r__3213E83E7286B386",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1Result=s},6977:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1SampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1SampleSetting",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"sample_setting",key:"id"}},e0:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},e1:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},e2:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0}},{tableName:"quant1_sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_s__3213E83FFA6CD02F",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1SampleSetting=s},589:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QuantUnitSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QuantUnitSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"quant1_organism",key:"id"}},conversion_factor:{type:l.DataTypes.FLOAT,allowNull:!1},display_log_value:{type:l.DataTypes.BOOLEAN,allowNull:!1},lower_limit:{type:l.DataTypes.FLOAT,allowNull:!1},position:{type:l.DataTypes.INTEGER,allowNull:!1},units:{type:l.DataTypes.INTEGER,allowNull:!1},upper_limit:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"quant_unit_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant_un__3213E83F6AA4ACAC",unique:!0,fields:[{name:"id"}]}]})}}t.QuantUnitSetting=s},2132:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RawDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("RawDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test_data",key:"id"}},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0},timestamps:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"raw_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_raw_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__raw_data__3213E83E6F5B3EAF",unique:!0,fields:[{name:"id"}]}]})}}t.RawDataItem=s},9092:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ReagentLot",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},creation_time:{type:l.DataTypes.DATE,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!1},reagent_lot_number:{type:l.DataTypes.STRING(3),allowNull:!1}},{tableName:"reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__reagent___3213E83FE1FD856F",unique:!0,fields:[{name:"id"}]}]})}}t.ReagentLot=s},5076:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ReportGraphSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ReportGraphSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}},graph_type:{type:l.DataTypes.INTEGER,allowNull:!0},param_key:{type:l.DataTypes.STRING(64),allowNull:!1},param_val:{type:l.DataTypes.STRING(512),allowNull:!0}},{tableName:"report_graph_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__report_g__3213E83F88AEEA20",unique:!0,fields:[{name:"id"}]}]})}}t.ReportGraphSetting=s},617:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Reporter=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Reporter",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},concentration:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(12),allowNull:!1}},{tableName:"reporter",schema:"dbo",timestamps:!1,indexes:[{name:"PK__reporter__3213E83FE02BD9EF",unique:!0,fields:[{name:"id"}]},{name:"UX_reporter_name",unique:!0,fields:[{name:"name"}]}]})}}t.Reporter=s},3513:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultCalculation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultCalculation",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},chain_name:{type:l.DataTypes.STRING(64),allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1}},{tableName:"result_calculation",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_c__3213E83F401E0DFE",unique:!0,fields:[{name:"id"}]}]})}}t.ResultCalculation=s},7014:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultEvaluator=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultEvaluator",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},evaluator_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_text:{type:l.DataTypes.INTEGER,allowNull:!1},rule_anded:{type:l.DataTypes.BOOLEAN,allowNull:!1},text_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"result_evaluator",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_e__3213E83FE1614926",unique:!0,fields:[{name:"id"}]}]})}}t.ResultEvaluator=s},8770:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultMaskingConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultMaskingConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay_ext",key:"id"}},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}}},{tableName:"result_masking_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_m__3213E83FCE36E124",unique:!0,fields:[{name:"id"}]}]})}}t.ResultMaskingConfig=s},6430:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultRuleAnalyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultRuleAnalyte",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"result_evaluator",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},rule_index:{type:l.DataTypes.INTEGER,allowNull:!1},rule_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"result_rule_analyte",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_r__3213E83FD2CA5D7B",unique:!0,fields:[{name:"id"}]}]})}}t.ResultRuleAnalyte=s},872:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultRuleInterpretation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultRuleInterpretation",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"result_rule_analyte",key:"id"}},interpretation:{type:l.DataTypes.INTEGER,allowNull:!1},pass_on_equals:{type:l.DataTypes.BOOLEAN,allowNull:!1},reasons:{type:l.DataTypes.STRING(50),allowNull:!0}},{tableName:"result_rule_interpretation",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_r__3213E83FF6E9FEAE",unique:!0,fields:[{name:"id"}]}]})}}t.ResultRuleInterpretation=s},3051:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultRuleMeltPeak=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultRuleMeltPeak",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"result_rule_analyte",key:"id"}},pass_on_peak:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"result_rule_melt_peak",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_r__3213E83F6989F9D8",unique:!0,fields:[{name:"id"}]}]})}}t.ResultRuleMeltPeak=s},2658:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RunDatum=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("RunDatum",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_data_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test_data",key:"id"}},datagram_format:{type:l.DataTypes.INTEGER,allowNull:!0},datagrams:{type:l.DataTypes.BLOB,allowNull:!0},end_time:{type:l.DataTypes.DATE,allowNull:!0},fw_version:{type:l.DataTypes.STRING(12),allowNull:!0},icore_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},site_name:{type:l.DataTypes.STRING(512),allowNull:!0},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},start_time:{type:l.DataTypes.DATE,allowNull:!0},state:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"run_data",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_run_data_test_data_id",fields:[{name:"test_data_id"}]},{name:"PK__run_data__3213E83E567DD4BC",unique:!0,fields:[{name:"id"}]},{name:"UX_rundata_testdataid",unique:!0,fields:[{name:"test_data_id"}]}]})}}t.RunDatum=s},591:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"reagent_lot",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},ct_threshold_value:{type:l.DataTypes.FLOAT,allowNull:!1},end_pt_threshold:{type:l.DataTypes.INTEGER,allowNull:!1},min_delta_ct:{type:l.DataTypes.FLOAT,allowNull:!1},normalization_factor:{type:l.DataTypes.INTEGER,allowNull:!1},peak_height_min:{type:l.DataTypes.FLOAT,allowNull:!1},probe_chk_delta:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_high_max:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_high_min:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_low_max:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_low_min:{type:l.DataTypes.INTEGER,allowNull:!1},use_endpoint:{type:l.DataTypes.BOOLEAN,allowNull:!1},use_min_delta_ct:{type:l.DataTypes.BOOLEAN,allowNull:!1},valid_max:{type:l.DataTypes.DECIMAL(5,1),allowNull:!1},valid_min:{type:l.DataTypes.DECIMAL(5,1),allowNull:!1}},{tableName:"sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__sample_s__3213E83F5CA8F508",unique:!0,fields:[{name:"id"}]}]})}}t.SampleSetting=s},7919:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleType=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleType",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},sample_type_key:{type:l.DataTypes.STRING(5),allowNull:!1}},{tableName:"sample_type",schema:"dbo",timestamps:!1,indexes:[{name:"PK__sample_t__3213E83F677484AC",unique:!0,fields:[{name:"id"}]}]})}}t.SampleType=s},7167:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SelectedQuantUnitSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SelectedQuantUnitSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},units:{type:l.DataTypes.INTEGER,allowNull:!1},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}}},{tableName:"selected_quant_unit_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__selected__3213E83FD2197D49",unique:!0,fields:[{name:"id"}]}]})}}t.SelectedQuantUnitSetting=s},7020:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SemiQuantOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SemiQuantOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"basic_organism",key:"id"}},delta_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1},low_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1},medium_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1},replaced_result_color:{type:l.DataTypes.INTEGER,allowNull:!1},replaced_result_text:{type:l.DataTypes.INTEGER,allowNull:!1},semi_quant_result_text:{type:l.DataTypes.INTEGER,allowNull:!1},very_low_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"semi_quant_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__semi_qua__3213E83FD6EC71C5",unique:!0,fields:[{name:"id"}]}]})}}t.SemiQuantOrganism=s},4617:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SystemLog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SystemLog",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},details:{type:l.DataTypes.STRING(512),allowNull:!0},error_code:{type:l.DataTypes.INTEGER,allowNull:!0},error_type:{type:l.DataTypes.INTEGER,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!1},site_name:{type:l.DataTypes.STRING(512),allowNull:!0},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0}},{tableName:"system_log",schema:"dbo",timestamps:!1,indexes:[{name:"PK__system_l__3213E83F2F74C3E3",unique:!0,fields:[{name:"id"}]}]})}}t.SystemLog=s},922:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TargetBasedOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TargetBasedOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}}},{tableName:"target_based_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__target_b__3213E83FC9C8466E",unique:!0,fields:[{name:"id"}]}]})}}t.TargetBasedOrganism=s},7571:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TemperatureGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TemperatureGraphSetup",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"graph_setup",key:"id"}},show_sample:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_heater:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_target:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"temperature_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__temperat__3213E83F0FBD7F66",unique:!0,fields:[{name:"id"}]}]})}}t.TemperatureGraphSetup=s},248:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlogCounter=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlogCounter",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_blog_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test_blog",key:"id"}},date_text:{type:l.DataTypes.STRING(8),allowNull:!0},test_count:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"test_blog_counter",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test_blo__3213E83FC91A3CB2",unique:!0,fields:[{name:"id"}]},{name:"UX_testblogcounter_testblogid_datetext",unique:!0,fields:[{name:"test_blog_id"},{name:"date_text"}]}]})}}t.TestBlogCounter=s},4715:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlog",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}}},{tableName:"test_blog",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test_blo__3213E83F18287316",unique:!0,fields:[{name:"id"}]},{name:"UX_testblog_assayid",unique:!0,fields:[{name:"assay_id"}]}]})}}t.TestBlog=s},196:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestDataError=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestDataError",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test_data",key:"id"}},code:{type:l.DataTypes.INTEGER,allowNull:!1},details:{type:l.DataTypes.STRING(512),allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!1},param1:{type:l.DataTypes.FLOAT,allowNull:!0},param2:{type:l.DataTypes.FLOAT,allowNull:!0},param3:{type:l.DataTypes.FLOAT,allowNull:!0},param4:{type:l.DataTypes.FLOAT,allowNull:!0},severity:{type:l.DataTypes.INTEGER,allowNull:!1},site_state:{type:l.DataTypes.INTEGER,allowNull:!1},step_number:{type:l.DataTypes.INTEGER,allowNull:!1},text_param:{type:l.DataTypes.STRING(64),allowNull:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_data_error",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_data_error_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_dat__3213E83E78622473",unique:!0,fields:[{name:"id"}]}]})}}t.TestDataError=s},4309:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestDatum=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestDatum",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},error_status:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_data",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_data_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_dat__3213E83E31E5BA7A",unique:!0,fields:[{name:"id"}]},{name:"UX_testdata_parentid",unique:!0,fields:[{name:"parent_id"}]}]})}}t.TestDatum=s},1591:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestError=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestError",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},code:{type:l.DataTypes.INTEGER,allowNull:!1},details:{type:l.DataTypes.STRING(512),allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!1},param1:{type:l.DataTypes.FLOAT,allowNull:!0},param2:{type:l.DataTypes.FLOAT,allowNull:!0},param3:{type:l.DataTypes.FLOAT,allowNull:!0},param4:{type:l.DataTypes.FLOAT,allowNull:!0},severity:{type:l.DataTypes.INTEGER,allowNull:!1},text_param:{type:l.DataTypes.STRING(256),allowNull:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_error",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_error_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_err__3213E83EF5E87ABE",unique:!0,fields:[{name:"id"}]}]})}}t.TestError=s},5748:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestExt=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestExt",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"test",key:"id"}},version:{type:l.DataTypes.INTEGER,allowNull:!0},archived:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"test_ext",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test_ext__3213E83F7C62AA47",unique:!0,fields:[{name:"id"}]}]})}}t.TestExt=s},1396:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestHistory",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},creation_time:{type:l.DataTypes.DATE,allowNull:!1},field_name:{type:l.DataTypes.STRING(32),allowNull:!1},new_content:{type:l.DataTypes.STRING(512),allowNull:!0},old_content:{type:l.DataTypes.STRING(512),allowNull:!0},user_name:{type:l.DataTypes.STRING(128),allowNull:!0}},{tableName:"test_history",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_history_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_his__3213E83E4CEA85AD",unique:!0,fields:[{name:"id"}]}]})}}t.TestHistory=s},1731:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Test=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Test",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},result_text_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test",key:"id"}},is_current_test:{type:l.DataTypes.BOOLEAN,allowNull:!0},cartridge_barcode:{type:l.DataTypes.STRING(1024),allowNull:!0},cart_serial_number:{type:l.DataTypes.BIGINT,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},data_reduction_algorithm:{type:l.DataTypes.INTEGER,allowNull:!0},error_status:{type:l.DataTypes.INTEGER,allowNull:!1},expiration_date:{type:l.DataTypes.DATE,allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_scanned_patient_id:{type:l.DataTypes.BOOLEAN,allowNull:!0},is_scanned_sample_id:{type:l.DataTypes.BOOLEAN,allowNull:!0},modification_time:{type:l.DataTypes.DATE,allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},order_time:{type:l.DataTypes.DATE,allowNull:!0},other_sample_type_text:{type:l.DataTypes.STRING(32),allowNull:!0},legacy_result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_color:{type:l.DataTypes.TEXT,allowNull:!0},rgt_lot_id:{type:l.DataTypes.STRING(5),allowNull:!0},sample_id:{type:l.DataTypes.STRING(25),allowNull:!0},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},user_full_name:{type:l.DataTypes.STRING(128),allowNull:!0},user_login_name:{type:l.DataTypes.STRING(128),allowNull:!0},patient_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"patient",key:"id"}},test_type:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"test",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test__3213E83FF5B8B492",unique:!0,fields:[{name:"id"}]},{name:"UX_test_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.Test=s},2535:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UltrasonicGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("UltrasonicGraphSetup",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"graph_setup",key:"id"}},show_amplitude:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_frequency:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_duty_cycle:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"ultrasonic_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__ultrason__3213E83F317F7578",unique:!0,fields:[{name:"id"}]}]})}}t.UltrasonicGraphSetup=s},9884:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UserExt=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("UserExt",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"users",key:"id"}},institutional_id:{type:l.DataTypes.STRING(128),allowNull:!0},active_date:{type:l.DataTypes.DATE,allowNull:!0},expiration_date:{type:l.DataTypes.DATE,allowNull:!0}},{tableName:"user_ext",schema:"dbo",timestamps:!1,indexes:[{name:"PK__user_ext__3213E83F67F47F65",unique:!0,fields:[{name:"id"}]}]})}}t.UserExt=s},6772:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UserLockout=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("UserLockout",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},login_name:{type:l.DataTypes.STRING(32),allowNull:!1},failure_count:{type:l.DataTypes.INTEGER,allowNull:!1},last_failure:{type:l.DataTypes.DATE,allowNull:!0}},{tableName:"user_lockout",schema:"dbo",timestamps:!1,indexes:[{name:"PK__user_loc__3213E83F6537F831",unique:!0,fields:[{name:"id"}]}]})}}t.UserLockout=s},1701:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UserPrivilege=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("UserPrivilege",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},privilege_name:{type:l.DataTypes.STRING(64),allowNull:!1},user_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"user_privilege",schema:"dbo",timestamps:!1,indexes:[{name:"PK__user_pri__3213E83F7375D6FB",unique:!0,fields:[{name:"id"}]}]})}}t.UserPrivilege=s},8655:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.User=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("User",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},full_name:{type:l.DataTypes.STRING(128),allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_hidden:{type:l.DataTypes.BOOLEAN,allowNull:!1},login_name:{type:l.DataTypes.STRING(32),allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!0},password:{type:l.DataTypes.STRING(256),allowNull:!1},user_source:{type:l.DataTypes.INTEGER,allowNull:!1},user_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"users",schema:"dbo",timestamps:!1,indexes:[{name:"PK__users__3213E83F4F70944B",unique:!0,fields:[{name:"id"}]},{name:"UX_users_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.User=s},2522:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,o)}r((l=l.apply(e,t||[])).next())}))},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.GeneXpertClient=void 0;const n=s(a(2245)),i=a(9634),o=a(496),r=a(7306),p=a(5662),y="YYYY/MM/DD HH:mm:ss.SSS";t.GeneXpertClient=class{constructor(e,t,a,l){this.version=e,this.sequelize=(0,r.createSequelize)(t,a,l),this.models=(0,p.initModels)(this.sequelize)}logsTotal(){return this.models.SystemLog.count()}testsTotal(){return this.models.Test.count({include:[{as:"test_data",model:this.models.TestDatum,where:{state:{[o.Op.ne]:1}},required:!0}]})}systemInfo(){const e=this.sequelize.query("\n          SELECT\n            MAX(sw_version) as [sw_version],\n            [system_log].[site_serial_number],\n            [system_log].[site_name],\n            MAX([instrument_serial_number]) as [instrument_serial_number],\n            MAX(log_time) as [log_time],\n            MIN(log_time) as [first_seen_at],\n            MAX([disabled_module].[creation_time]) as [disabled_at]\n          FROM [dbo].[system_log]\n            LEFT JOIN [dbo].[disabled_module]\n            ON [dbo].[disabled_module].[site_serial_number] = [dbo].[system_log].[site_serial_number]\n          GROUP BY [site_name], [system_log].[site_serial_number]\n          ORDER BY log_time DESC\n        ").then((([e])=>e)),t=this.models.Config.findAll().then((e=>e.map((e=>({[e.param_key]:e.param_val}))))).then(i.mergeAll);return Promise.all([e,t]).then((e=>(0,r.toSystemInfo)(...e)))}testsPresyncables(e,t,a){return this.models.Test.findAll({where:{[o.Op.or]:[{order_time:{[o.Op.lt]:(0,n.default)().subtract(1,"hour").toDate()},modification_time:{[o.Op.gt]:e}},{order_time:{[o.Op.lt]:(0,n.default)().subtract(1,"hour").toDate()},modification_time:{[o.Op.eq]:e},id:{[o.Op.notIn]:t}}]},order:[["modification_time","DESC"]],limit:a}).then((e=>e.map((({id:e,modification_time:t})=>({id:e.toString(),modified:t})))))}testsSyncables(e){return this.models.Test.findAll({where:{id:{[o.Op.in]:e}},include:[{as:"test_data",model:this.models.TestDatum},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]}},{as:"user",model:this.models.User},{as:"test_errors",model:this.models.TestError},{as:"patient",model:this.models.Patient},{as:"analyte_results",model:this.models.AnalyteResult,include:[{as:"analyte",model:this.models.Analyte},{as:"channel_processed_data_items",model:this.models.ChannelProcessedDataItem}]},{as:"organism_results",model:this.models.OrganismResult,include:[{as:"organism",model:this.models.Organism},{as:"organism_based_organism_result",model:this.models.OrganismBasedOrganismResult}]}]}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}testsForEntry(e,t){return this.models.Test.findAll({where:{sample_id:{[o.Op.notIn]:e}},include:[{as:"test_data",model:this.models.TestDatum,where:{start_time:{[o.Op.gte]:(0,n.default)().subtract(t||r.hoursForDataEntry,"hours").toDate()}}},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>({id:e.id,assay:e.assay.name,endedAt:e.test_data.end_time,sampleId:e.sample_id,startedAt:e.test_data.start_time})))))}logsPresyncables(e,t,a){return this.models.SystemLog.findAll({where:{[o.Op.or]:[{log_time:{[o.Op.gt]:e}},{log_time:{[o.Op.eq]:e},id:{[o.Op.notIn]:t}}]},limit:a,attributes:["id","log_time"],order:[["log_time","ASC"]]}).then((e=>e.map((({id:e,log_time:t})=>({id:e.toString(),modified:t})))))}logsSyncables(e){return this.models.SystemLog.findAll({where:{id:{[o.Op.in]:e}}}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}close(){return this.sequelize.close()}getTest(e){var t,a,s;return l(this,void 0,void 0,(function*(){const l=yield this.models.Test.findOne({where:{sample_id:{[o.Op.eq]:e}},include:[{as:"test_data",model:this.models.TestDatum}]});return{dataValues:Object.assign(Object.assign({},null==l?void 0:l.dataValues),{end_time:null===(a=null===(t=null==l?void 0:l.dataValues)||void 0===t?void 0:t.test_data)||void 0===a?void 0:a.end_time,sampleId:null===(s=null==l?void 0:l.dataValues)||void 0===s?void 0:s.sample_id})}}))}getTestsByTestIds(e){return this.models.Test.findAll({where:{id:{[o.Op.in]:e}},include:[{as:"test_data",model:this.models.TestDatum},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>({id:e.id,assay:e.assay.name,endedAt:e.test_data.end_time,sampleId:e.sample_id,startedAt:e.test_data.start_time})))))}getCompletedTestsBySampleIds(e){return this.models.Test.findAll({where:{sample_id:{[o.Op.in]:e},modification_time:{[o.Op.and]:[{[o.Op.not]:null},{[o.Op.between]:[(0,n.default)().subtract(r.LAB_RESULT_APPROVAL_DEADLINE_HOURS,"hours").format(y),(0,n.default)().format(y)]}]},result_text:{[o.Op.not]:null}},include:[{as:"test_data",model:this.models.TestDatum},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t,a,l,s,i;return{id:e.id,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(null!==(l=null===(a=null==e?void 0:e.test_data)||void 0===a?void 0:a.end_time)&&void 0!==l?l:null==e?void 0:e.modification_time,y).toDate(),sampleId:e.sample_id,startedAt:(0,n.default)(null!==(i=null===(s=null==e?void 0:e.test_data)||void 0===s?void 0:s.start_time)&&void 0!==i?i:null==e?void 0:e.order_time,y).toDate()}}))))}}},9057:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AnalyteResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AnalyteResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}}},{tableName:"analyte_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_analyte_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__analyte___3213E83ECDC2EDFE",unique:!0,fields:[{name:"id"}]}]})}}t.AnalyteResult=s},3363:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Analyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Analyte",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},analyte_index:{type:l.DataTypes.INTEGER,allowNull:!1},background_end:{type:l.DataTypes.INTEGER,allowNull:!1},background_look_back:{type:l.DataTypes.INTEGER,allowNull:!1},background_max_rms_error:{type:l.DataTypes.FLOAT,allowNull:!0},background_max_slope:{type:l.DataTypes.FLOAT,allowNull:!0},background_min_points:{type:l.DataTypes.INTEGER,allowNull:!1},background_start:{type:l.DataTypes.INTEGER,allowNull:!1},boxcar_cycles:{type:l.DataTypes.INTEGER,allowNull:!1},curve_analysis:{type:l.DataTypes.INTEGER,allowNull:!1},curve_fit_end_index:{type:l.DataTypes.INTEGER,allowNull:!0},curve_fit_max_nrse:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_slope_vs_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_min_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_start_index:{type:l.DataTypes.INTEGER,allowNull:!0},intended_concentration:{type:l.DataTypes.FLOAT,allowNull:!1},invalid_bias:{type:l.DataTypes.INTEGER,allowNull:!1},is_signal_loss_detection_enabled:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_probe_check_use_delta_pc:{type:l.DataTypes.BOOLEAN,allowNull:!1},name:{type:l.DataTypes.STRING(20),allowNull:!1},probe_check_max_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_min_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},reporter_name:{type:l.DataTypes.STRING(12),allowNull:!1},target:{type:l.DataTypes.BLOB,allowNull:!0},use_curve_fit:{type:l.DataTypes.BOOLEAN,allowNull:!1},use_curve_fit_end_data:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_curve_fit_on_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_curve_fit_start_background:{type:l.DataTypes.BOOLEAN,allowNull:!0},usage:{type:l.DataTypes.INTEGER,allowNull:!1},use_background_validation:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"analyte",schema:"dbo",timestamps:!1,indexes:[{name:"PK__analyte__3213E83FA63374DD",unique:!0,fields:[{name:"id"}]}]})}}t.Analyte=s},3133:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayChamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayChamber",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge",key:"id"}},chamber_number:{type:l.DataTypes.INTEGER,allowNull:!1},initial_volume:{type:l.DataTypes.INTEGER,allowNull:!1},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!1},name:{type:l.DataTypes.STRING(16),allowNull:!1}},{tableName:"assay_chamber",schema:"dbo",timestamps:!1,indexes:[{name:"PK__assay_ch__3213E83FBA29C6D8",unique:!0,fields:[{name:"id"}]}]})}}t.AssayChamber=s},5083:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayPosition=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayPosition",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},position:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"assay_position",schema:"dbo",timestamps:!1,indexes:[{name:"PK__assay_po__3213E83F9ED37278",unique:!0,fields:[{name:"id"}]}]})}}t.AssayPosition=s},6570:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Assay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Assay",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}},assay_index:{type:l.DataTypes.INTEGER,allowNull:!0},result_text_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_lock_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_version:{type:l.DataTypes.INTEGER,allowNull:!0},command_bytes:{type:l.DataTypes.BLOB,allowNull:!0},command_sequence_format:{type:l.DataTypes.INTEGER,allowNull:!0},comments:{type:l.DataTypes.STRING(4e3),allowNull:!0},company_code:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},data_reduction_algorithm:{type:l.DataTypes.INTEGER,allowNull:!0},default_result_text_index:{type:l.DataTypes.INTEGER,allowNull:!0},default_text_color_reference:{type:l.DataTypes.INTEGER,allowNull:!0},disclaimer:{type:l.DataTypes.STRING(4e3),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!0},is_clia_waived:{type:l.DataTypes.BOOLEAN,allowNull:!0},lock_comments:{type:l.DataTypes.STRING(4e3),allowNull:!0},lock_time:{type:l.DataTypes.DATE,allowNull:!0},modification_time:{type:l.DataTypes.DATE,allowNull:!0},name:{type:l.DataTypes.STRING(32),allowNull:!1},need_lsp:{type:l.DataTypes.BOOLEAN,allowNull:!0},picture:{type:l.DataTypes.BLOB,allowNull:!0},prep_cartridge_shelf_life:{type:l.DataTypes.INTEGER,allowNull:!0},product_code:{type:l.DataTypes.INTEGER,allowNull:!0},sample_prep_instruction:{type:l.DataTypes.STRING(256),allowNull:!0},sample_prep_video:{type:l.DataTypes.BLOB,allowNull:!0},use_background_subtraction:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_melt_all_peaks:{type:l.DataTypes.BOOLEAN,allowNull:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"users",key:"id"}}},{tableName:"assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__assay__3213E83F2029E23F",unique:!0,fields:[{name:"id"}]},{name:"UX_assay_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.Assay=s},8804:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BasicOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("BasicOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}}},{tableName:"basic_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__basic_or__3213E83F330C3338",unique:!0,fields:[{name:"id"}]}]})}}t.BasicOrganism=s},3642:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CartridgeType=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CartridgeType",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},adc_2_psi:{type:l.DataTypes.FLOAT,allowNull:!1},air_chamber:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_foot_height:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_version:{type:l.DataTypes.INTEGER,allowNull:!1},creation_time:{type:l.DataTypes.DATE,allowNull:!1},direct_flow_rate_max:{type:l.DataTypes.FLOAT,allowNull:!1},direct_flow_rate_min:{type:l.DataTypes.FLOAT,allowNull:!1},direct_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},filter_flow_rate_max:{type:l.DataTypes.FLOAT,allowNull:!1},filter_flow_rate_min:{type:l.DataTypes.FLOAT,allowNull:!1},filter_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},initial_aspirate_flow_rate:{type:l.DataTypes.FLOAT,allowNull:!1},initial_aspirate_volume:{type:l.DataTypes.INTEGER,allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},max_pressure:{type:l.DataTypes.INTEGER,allowNull:!1},microliters_per_revolution:{type:l.DataTypes.FLOAT,allowNull:!1},min_pressure:{type:l.DataTypes.INTEGER,allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1},overflow_chamber:{type:l.DataTypes.INTEGER,allowNull:!1},picture:{type:l.DataTypes.BLOB,allowNull:!0},plunger_pickup_position:{type:l.DataTypes.INTEGER,allowNull:!1},plunger_strip_position:{type:l.DataTypes.INTEGER,allowNull:!1},syringe_max_transfer_volume:{type:l.DataTypes.INTEGER,allowNull:!1},syringe_max_volume:{type:l.DataTypes.INTEGER,allowNull:!1},syringe_min_transfer_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_chamber_number:{type:l.DataTypes.INTEGER,allowNull:!1},tube_chamber_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_pressurized_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_syringe_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_volume:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"cartridge_type",schema:"dbo",timestamps:!1,indexes:[{name:"PK__cartridg__3213E83F8C4F3852",unique:!0,fields:[{name:"id"}]},{name:"UX_cartridgetype_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.CartridgeType=s},3406:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Cartridge=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Cartridge",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},air_chamber:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_type_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge_type",key:"id"}},overflow_chamber:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"cartridge",schema:"dbo",timestamps:!1,indexes:[{name:"PK__cartridg__3213E83F250C10B7",unique:!0,fields:[{name:"id"}]}]})}}t.Cartridge=s},9909:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Chamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Chamber",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge_type",key:"id"}},chamber_number:{type:l.DataTypes.INTEGER,allowNull:!1},max_volume:{type:l.DataTypes.INTEGER,allowNull:!1},min_volume:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"chamber",schema:"dbo",timestamps:!1,indexes:[{name:"PK__chamber__3213E83F4AB9898B",unique:!0,fields:[{name:"id"}]}]})}}t.Chamber=s},3465:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ChannelProcessedDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ChannelProcessedDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte_result",key:"id"}},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"channel_processed_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_channel_processed_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__channel___3213E83ED0788519",unique:!0,fields:[{name:"id"}]}]})}}t.ChannelProcessedDataItem=s},2637:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ChannelRawDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ChannelRawDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"channel_raw_data",key:"id"}},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0},timestamps:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"channel_raw_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_channel_raw_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__channel___3213E83EC0F7CD0A",unique:!0,fields:[{name:"id"}]}]})}}t.ChannelRawDataItem=s},2418:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ChannelRawDatum=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ChannelRawDatum",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test_data",key:"id"}},protocol_number:{type:l.DataTypes.INTEGER,allowNull:!1},channel_name:{type:l.DataTypes.STRING(32),allowNull:!1}},{tableName:"channel_raw_data",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_channel_raw_data_parent_id",fields:[{name:"parent_id"}]},{name:"PK__channel___3213E83EC68CD172",unique:!0,fields:[{name:"id"}]}]})}}t.ChannelRawDatum=s},3258:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorDisclaimer=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ColorDisclaimer",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},color:{type:l.DataTypes.INTEGER,allowNull:!1},disclaimer:{type:l.DataTypes.STRING(256),allowNull:!0}},{tableName:"color_disclaimer",schema:"dbo",timestamps:!1,indexes:[{name:"PK__color_di__3213E83F654A7801",unique:!0,fields:[{name:"id"}]}]})}}t.ColorDisclaimer=s},8949:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Config",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},param_key:{type:l.DataTypes.STRING(64),allowNull:!0},param_val:{type:l.DataTypes.STRING(512),allowNull:!0}},{tableName:"config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__config__3213E83FB24EFCAC",unique:!0,fields:[{name:"id"}]},{name:"UX_config_paramkey",unique:!0,fields:[{name:"param_key"}]}]})}}t.Config=s},5479:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CrosstalkCorrResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CrosstalkCorrResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte_result",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte",key:"id"}},protocol_index:{type:l.DataTypes.INTEGER,allowNull:!1},ignore_code:{type:l.DataTypes.STRING(64),allowNull:!1},correlation_slope:{type:l.DataTypes.FLOAT,allowNull:!0},correlation_r2:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"crosstalk_corr_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_crosstalk_corr_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__crosstal__3213E83E924D6078",unique:!0,fields:[{name:"id"}]}]})}}t.CrosstalkCorrResult=s},9171:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DeltaCtOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("DeltaCtOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"basic_organism",key:"id"}},delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!1},delta_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"delta_ct_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__delta_ct__3213E83FE042FFFC",unique:!0,fields:[{name:"id"}]}]})}}t.DeltaCtOrganism=s},606:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DisabledModule=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("DisabledModule",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!1},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!1},user_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"users",key:"id"}}},{tableName:"disabled_module",schema:"dbo",timestamps:!1,indexes:[{name:"PK__disabled__3213E83F96810815",unique:!0,fields:[{name:"id"}]},{name:"UX_disabledmodule_siteserialnumber",unique:!0,fields:[{name:"site_serial_number"}]}]})}}t.DisabledModule=s},1903:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingAssay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"genotyping_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__3213E83F7C84A87B",unique:!0,fields:[{name:"id"}]}]})}}t.GenotypingAssay=s},5738:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingHaplotypeOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingHaplotypeOrganism",{haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"haplotype",key:"id"}},genotyping_organism_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"genotyping_organism",key:"id"}}},{tableName:"genotyping_haplotype_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__060A713D88EAF29B",unique:!0,fields:[{name:"haplotype_id"},{name:"genotyping_organism_id"}]},{name:"UX_gho_haplotypeid_genotypingorganismid",unique:!0,fields:[{name:"haplotype_id"},{name:"genotyping_organism_id"}]}]})}}t.GenotypingHaplotypeOrganism=s},7676:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}}},{tableName:"genotyping_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__3213E83F71AF25E1",unique:!0,fields:[{name:"id"}]}]})}}t.GenotypingOrganismResult=s},3722:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},early_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!1},late_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"genotyping_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__3213E83F13741DD0",unique:!0,fields:[{name:"id"}]}]})}}t.GenotypingOrganism=s},8378:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetupAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetupAssay",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},graph_setup_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"graph_setup",key:"id"}},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}}},{tableName:"graph_setup_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__graph_se__3213E83FB241A5B9",unique:!0,fields:[{name:"id"}]},{name:"UX_graphsetupassay_graphsetupid_assayid",unique:!0,fields:[{name:"graph_setup_id"},{name:"assay_id"}]}]})}}t.GraphSetupAssay=s},3017:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetup",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_default:{type:l.DataTypes.BOOLEAN,allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1},pos:{type:l.DataTypes.INTEGER,allowNull:!1},settings:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__graph_se__3213E83F6ADA0B5A",unique:!0,fields:[{name:"id"}]},{name:"UX_graphsetup_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.GraphSetup=s},4359:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.HaplotypeResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("HaplotypeResultText",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"haplotype",key:"id"}},alleles_text1:{type:l.DataTypes.STRING(10),allowNull:!1},alleles_text2:{type:l.DataTypes.STRING(10),allowNull:!1},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(11),allowNull:!1},text_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"haplotype_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK__haplotyp__3213E83FC0009034",unique:!0,fields:[{name:"id"}]}]})}}t.HaplotypeResultText=s},2428:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.HaplotypeResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("HaplotypeResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"haplotype",key:"id"}},allele1_text:{type:l.DataTypes.TEXT,allowNull:!1},allele2_text:{type:l.DataTypes.TEXT,allowNull:!1},result_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"haplotype_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_haplotype_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__haplotyp__3213E83EDA363883",unique:!0,fields:[{name:"id"}]}]})}}t.HaplotypeResult=s},4997:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Haplotype=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Haplotype",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"genotyping_assay",key:"id"}},haplotype_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(20),allowNull:!1}},{tableName:"haplotype",schema:"dbo",timestamps:!1,indexes:[{name:"PK__haplotyp__3213E83F6E1A2AB7",unique:!0,fields:[{name:"id"}]}]})}}t.Haplotype=s},5662:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioOrganism=t.PercentRatioAssay=t.Patient=t.Path=t.OrganismTarget=t.OrganismResultText=t.OrganismResult=t.OrganismBasedOrganismResult=t.OrganismBasedAssay=t.Organism=t.MeltPeakSetting=t.MeltPeakResult=t.LisUpload=t.LisTestOrder=t.LisOrganismConfig=t.LisHaplotypeConfig=t.LisGenotypingAssayConfig=t.LisAssayConfig=t.LdaOrganismResult=t.LdaOrganism=t.LdaCoefficient=t.LdaAssay=t.LdaAnalyte=t.Instrument=t.HaplotypeResultText=t.HaplotypeResult=t.Haplotype=t.GraphSetupAssay=t.GraphSetup=t.GenotypingOrganismResult=t.GenotypingOrganism=t.GenotypingHaplotypeOrganism=t.GenotypingAssay=t.DisabledModule=t.DeltaCtOrganism=t.CrosstalkCorrResult=t.Config=t.ColorDisclaimer=t.ChannelRawDataItem=t.ChannelRawDatum=t.ChannelProcessedDataItem=t.Chamber=t.CartridgeType=t.Cartridge=t.BasicOrganism=t.AssayPosition=t.AssayChamber=t.Assay=t.AnalyteResult=t.Analyte=void 0,t.initModels=t.User=t.UserPrivilege=t.TestNv=t.TestHistory=t.TestError=t.TestDataError=t.TestDatum=t.TestBlogCounter=t.TestBlog=t.Test=t.TargetBasedOrganism=t.TargetBasedAssay=t.SystemLog=t.SemiQuantOrganism=t.SelectedQuantUnitSetting=t.SampleType=t.SampleSetting=t.ResultRuleMeltPeak=t.ResultRuleInterpretation=t.ResultRuleAnalyte=t.ResultEvaluator=t.ResultCalculation=t.Reporter=t.ReportGraphSetting=t.ReagentLot=t.RawDataItem=t.QuantUnitSetting=t.Quant1SampleSetting=t.Quant1Result=t.Quant1ReagentLot=t.Quant1OrganismResult=t.Quant1Organism=t.Quant1Assay=t.PercentRatioSampleSetting=t.PercentRatioResultEvaluator=t.PercentRatioReagentLot=t.PercentRatioOrganismResult=void 0;const l=a(3363);Object.defineProperty(t,"Analyte",{enumerable:!0,get:function(){return l.Analyte}});const s=a(9057);Object.defineProperty(t,"AnalyteResult",{enumerable:!0,get:function(){return s.AnalyteResult}});const n=a(6570);Object.defineProperty(t,"Assay",{enumerable:!0,get:function(){return n.Assay}});const i=a(3133);Object.defineProperty(t,"AssayChamber",{enumerable:!0,get:function(){return i.AssayChamber}});const o=a(5083);Object.defineProperty(t,"AssayPosition",{enumerable:!0,get:function(){return o.AssayPosition}});const r=a(8804);Object.defineProperty(t,"BasicOrganism",{enumerable:!0,get:function(){return r.BasicOrganism}});const p=a(3406);Object.defineProperty(t,"Cartridge",{enumerable:!0,get:function(){return p.Cartridge}});const y=a(3642);Object.defineProperty(t,"CartridgeType",{enumerable:!0,get:function(){return y.CartridgeType}});const u=a(9909);Object.defineProperty(t,"Chamber",{enumerable:!0,get:function(){return u.Chamber}});const d=a(3465);Object.defineProperty(t,"ChannelProcessedDataItem",{enumerable:!0,get:function(){return d.ChannelProcessedDataItem}});const _=a(2418);Object.defineProperty(t,"ChannelRawDatum",{enumerable:!0,get:function(){return _.ChannelRawDatum}});const m=a(2637);Object.defineProperty(t,"ChannelRawDataItem",{enumerable:!0,get:function(){return m.ChannelRawDataItem}});const c=a(3258);Object.defineProperty(t,"ColorDisclaimer",{enumerable:!0,get:function(){return c.ColorDisclaimer}});const T=a(8949);Object.defineProperty(t,"Config",{enumerable:!0,get:function(){return T.Config}});const N=a(5479);Object.defineProperty(t,"CrosstalkCorrResult",{enumerable:!0,get:function(){return N.CrosstalkCorrResult}});const g=a(9171);Object.defineProperty(t,"DeltaCtOrganism",{enumerable:!0,get:function(){return g.DeltaCtOrganism}});const f=a(606);Object.defineProperty(t,"DisabledModule",{enumerable:!0,get:function(){return f.DisabledModule}});const D=a(1903);Object.defineProperty(t,"GenotypingAssay",{enumerable:!0,get:function(){return D.GenotypingAssay}});const E=a(5738);Object.defineProperty(t,"GenotypingHaplotypeOrganism",{enumerable:!0,get:function(){return E.GenotypingHaplotypeOrganism}});const b=a(3722);Object.defineProperty(t,"GenotypingOrganism",{enumerable:!0,get:function(){return b.GenotypingOrganism}});const w=a(7676);Object.defineProperty(t,"GenotypingOrganismResult",{enumerable:!0,get:function(){return w.GenotypingOrganismResult}});const I=a(3017);Object.defineProperty(t,"GraphSetup",{enumerable:!0,get:function(){return I.GraphSetup}});const R=a(8378);Object.defineProperty(t,"GraphSetupAssay",{enumerable:!0,get:function(){return R.GraphSetupAssay}});const O=a(4997);Object.defineProperty(t,"Haplotype",{enumerable:!0,get:function(){return O.Haplotype}});const h=a(2428);Object.defineProperty(t,"HaplotypeResult",{enumerable:!0,get:function(){return h.HaplotypeResult}});const M=a(4359);Object.defineProperty(t,"HaplotypeResultText",{enumerable:!0,get:function(){return M.HaplotypeResultText}});const G=a(7324);Object.defineProperty(t,"Instrument",{enumerable:!0,get:function(){return G.Instrument}});const v=a(2673);Object.defineProperty(t,"LdaAnalyte",{enumerable:!0,get:function(){return v.LdaAnalyte}});const A=a(7425);Object.defineProperty(t,"LdaAssay",{enumerable:!0,get:function(){return A.LdaAssay}});const P=a(5710);Object.defineProperty(t,"LdaCoefficient",{enumerable:!0,get:function(){return P.LdaCoefficient}});const S=a(7110);Object.defineProperty(t,"LdaOrganism",{enumerable:!0,get:function(){return S.LdaOrganism}});const L=a(4741);Object.defineProperty(t,"LdaOrganismResult",{enumerable:!0,get:function(){return L.LdaOrganismResult}});const K=a(3179);Object.defineProperty(t,"LisAssayConfig",{enumerable:!0,get:function(){return K.LisAssayConfig}});const C=a(4810);Object.defineProperty(t,"LisGenotypingAssayConfig",{enumerable:!0,get:function(){return C.LisGenotypingAssayConfig}});const x=a(1219);Object.defineProperty(t,"LisHaplotypeConfig",{enumerable:!0,get:function(){return x.LisHaplotypeConfig}});const j=a(2855);Object.defineProperty(t,"LisOrganismConfig",{enumerable:!0,get:function(){return j.LisOrganismConfig}});const F=a(7519);Object.defineProperty(t,"LisTestOrder",{enumerable:!0,get:function(){return F.LisTestOrder}});const k=a(8608);Object.defineProperty(t,"LisUpload",{enumerable:!0,get:function(){return k.LisUpload}});const q=a(4298);Object.defineProperty(t,"MeltPeakResult",{enumerable:!0,get:function(){return q.MeltPeakResult}});const B=a(630);Object.defineProperty(t,"MeltPeakSetting",{enumerable:!0,get:function(){return B.MeltPeakSetting}});const Q=a(8374);Object.defineProperty(t,"Organism",{enumerable:!0,get:function(){return Q.Organism}});const U=a(7883);Object.defineProperty(t,"OrganismBasedAssay",{enumerable:!0,get:function(){return U.OrganismBasedAssay}});const H=a(1122);Object.defineProperty(t,"OrganismBasedOrganismResult",{enumerable:!0,get:function(){return H.OrganismBasedOrganismResult}});const X=a(9668);Object.defineProperty(t,"OrganismResult",{enumerable:!0,get:function(){return X.OrganismResult}});const V=a(6321);Object.defineProperty(t,"OrganismResultText",{enumerable:!0,get:function(){return V.OrganismResultText}});const z=a(8476);Object.defineProperty(t,"OrganismTarget",{enumerable:!0,get:function(){return z.OrganismTarget}});const J=a(5828);Object.defineProperty(t,"Path",{enumerable:!0,get:function(){return J.Path}});const Y=a(3708);Object.defineProperty(t,"Patient",{enumerable:!0,get:function(){return Y.Patient}});const W=a(9913);Object.defineProperty(t,"PercentRatioAssay",{enumerable:!0,get:function(){return W.PercentRatioAssay}});const $=a(2232);Object.defineProperty(t,"PercentRatioOrganism",{enumerable:!0,get:function(){return $.PercentRatioOrganism}});const Z=a(9169);Object.defineProperty(t,"PercentRatioOrganismResult",{enumerable:!0,get:function(){return Z.PercentRatioOrganismResult}});const ee=a(894);Object.defineProperty(t,"PercentRatioReagentLot",{enumerable:!0,get:function(){return ee.PercentRatioReagentLot}});const te=a(7363);Object.defineProperty(t,"PercentRatioResultEvaluator",{enumerable:!0,get:function(){return te.PercentRatioResultEvaluator}});const ae=a(2026);Object.defineProperty(t,"PercentRatioSampleSetting",{enumerable:!0,get:function(){return ae.PercentRatioSampleSetting}});const le=a(9250);Object.defineProperty(t,"Quant1Assay",{enumerable:!0,get:function(){return le.Quant1Assay}});const se=a(3739);Object.defineProperty(t,"Quant1Organism",{enumerable:!0,get:function(){return se.Quant1Organism}});const ne=a(5021);Object.defineProperty(t,"Quant1OrganismResult",{enumerable:!0,get:function(){return ne.Quant1OrganismResult}});const ie=a(6693);Object.defineProperty(t,"Quant1ReagentLot",{enumerable:!0,get:function(){return ie.Quant1ReagentLot}});const oe=a(2949);Object.defineProperty(t,"Quant1Result",{enumerable:!0,get:function(){return oe.Quant1Result}});const re=a(3664);Object.defineProperty(t,"Quant1SampleSetting",{enumerable:!0,get:function(){return re.Quant1SampleSetting}});const pe=a(1747);Object.defineProperty(t,"QuantUnitSetting",{enumerable:!0,get:function(){return pe.QuantUnitSetting}});const ye=a(8090);Object.defineProperty(t,"RawDataItem",{enumerable:!0,get:function(){return ye.RawDataItem}});const ue=a(8323);Object.defineProperty(t,"ReagentLot",{enumerable:!0,get:function(){return ue.ReagentLot}});const de=a(771);Object.defineProperty(t,"ReportGraphSetting",{enumerable:!0,get:function(){return de.ReportGraphSetting}});const _e=a(200);Object.defineProperty(t,"Reporter",{enumerable:!0,get:function(){return _e.Reporter}});const me=a(4829);Object.defineProperty(t,"ResultCalculation",{enumerable:!0,get:function(){return me.ResultCalculation}});const ce=a(1452);Object.defineProperty(t,"ResultEvaluator",{enumerable:!0,get:function(){return ce.ResultEvaluator}});const Te=a(1093);Object.defineProperty(t,"ResultRuleAnalyte",{enumerable:!0,get:function(){return Te.ResultRuleAnalyte}});const Ne=a(3271);Object.defineProperty(t,"ResultRuleInterpretation",{enumerable:!0,get:function(){return Ne.ResultRuleInterpretation}});const ge=a(3745);Object.defineProperty(t,"ResultRuleMeltPeak",{enumerable:!0,get:function(){return ge.ResultRuleMeltPeak}});const fe=a(6709);Object.defineProperty(t,"SampleSetting",{enumerable:!0,get:function(){return fe.SampleSetting}});const De=a(8388);Object.defineProperty(t,"SampleType",{enumerable:!0,get:function(){return De.SampleType}});const Ee=a(1111);Object.defineProperty(t,"SelectedQuantUnitSetting",{enumerable:!0,get:function(){return Ee.SelectedQuantUnitSetting}});const be=a(5274);Object.defineProperty(t,"SemiQuantOrganism",{enumerable:!0,get:function(){return be.SemiQuantOrganism}});const we=a(7497);Object.defineProperty(t,"SystemLog",{enumerable:!0,get:function(){return we.SystemLog}});const Ie=a(7657);Object.defineProperty(t,"TargetBasedAssay",{enumerable:!0,get:function(){return Ie.TargetBasedAssay}});const Re=a(6344);Object.defineProperty(t,"TargetBasedOrganism",{enumerable:!0,get:function(){return Re.TargetBasedOrganism}});const Oe=a(6676);Object.defineProperty(t,"Test",{enumerable:!0,get:function(){return Oe.Test}});const he=a(806);Object.defineProperty(t,"TestBlog",{enumerable:!0,get:function(){return he.TestBlog}});const Me=a(4668);Object.defineProperty(t,"TestBlogCounter",{enumerable:!0,get:function(){return Me.TestBlogCounter}});const Ge=a(4114);Object.defineProperty(t,"TestDatum",{enumerable:!0,get:function(){return Ge.TestDatum}});const ve=a(1257);Object.defineProperty(t,"TestDataError",{enumerable:!0,get:function(){return ve.TestDataError}});const Ae=a(9067);Object.defineProperty(t,"TestError",{enumerable:!0,get:function(){return Ae.TestError}});const Pe=a(7595);Object.defineProperty(t,"TestHistory",{enumerable:!0,get:function(){return Pe.TestHistory}});const Se=a(2200);Object.defineProperty(t,"TestNv",{enumerable:!0,get:function(){return Se.TestNv}});const Le=a(8803);Object.defineProperty(t,"UserPrivilege",{enumerable:!0,get:function(){return Le.UserPrivilege}});const Ke=a(9005);Object.defineProperty(t,"User",{enumerable:!0,get:function(){return Ke.User}}),t.initModels=function(e){const t=l.Analyte.initModel(e),a=s.AnalyteResult.initModel(e),Ce=n.Assay.initModel(e),xe=i.AssayChamber.initModel(e),je=o.AssayPosition.initModel(e),Fe=r.BasicOrganism.initModel(e),ke=p.Cartridge.initModel(e),qe=y.CartridgeType.initModel(e),Be=u.Chamber.initModel(e),Qe=d.ChannelProcessedDataItem.initModel(e),Ue=_.ChannelRawDatum.initModel(e),He=m.ChannelRawDataItem.initModel(e),Xe=c.ColorDisclaimer.initModel(e),Ve=T.Config.initModel(e),ze=N.CrosstalkCorrResult.initModel(e),Je=g.DeltaCtOrganism.initModel(e),Ye=f.DisabledModule.initModel(e),We=D.GenotypingAssay.initModel(e),$e=E.GenotypingHaplotypeOrganism.initModel(e),Ze=b.GenotypingOrganism.initModel(e),et=w.GenotypingOrganismResult.initModel(e),tt=I.GraphSetup.initModel(e),at=R.GraphSetupAssay.initModel(e),lt=O.Haplotype.initModel(e),st=h.HaplotypeResult.initModel(e),nt=M.HaplotypeResultText.initModel(e),it=G.Instrument.initModel(e),ot=v.LdaAnalyte.initModel(e),rt=A.LdaAssay.initModel(e),pt=P.LdaCoefficient.initModel(e),yt=S.LdaOrganism.initModel(e),ut=L.LdaOrganismResult.initModel(e),dt=K.LisAssayConfig.initModel(e),_t=C.LisGenotypingAssayConfig.initModel(e),mt=x.LisHaplotypeConfig.initModel(e),ct=j.LisOrganismConfig.initModel(e),Tt=F.LisTestOrder.initModel(e),Nt=k.LisUpload.initModel(e),gt=q.MeltPeakResult.initModel(e),ft=B.MeltPeakSetting.initModel(e),Dt=Q.Organism.initModel(e),Et=U.OrganismBasedAssay.initModel(e),bt=H.OrganismBasedOrganismResult.initModel(e),wt=X.OrganismResult.initModel(e),It=V.OrganismResultText.initModel(e),Rt=z.OrganismTarget.initModel(e),Ot=J.Path.initModel(e),ht=Y.Patient.initModel(e),Mt=W.PercentRatioAssay.initModel(e),Gt=$.PercentRatioOrganism.initModel(e),vt=Z.PercentRatioOrganismResult.initModel(e),At=ee.PercentRatioReagentLot.initModel(e),Pt=te.PercentRatioResultEvaluator.initModel(e),St=ae.PercentRatioSampleSetting.initModel(e),Lt=le.Quant1Assay.initModel(e),Kt=se.Quant1Organism.initModel(e),Ct=ne.Quant1OrganismResult.initModel(e),xt=ie.Quant1ReagentLot.initModel(e),jt=oe.Quant1Result.initModel(e),Ft=re.Quant1SampleSetting.initModel(e),kt=pe.QuantUnitSetting.initModel(e),qt=ye.RawDataItem.initModel(e),Bt=ue.ReagentLot.initModel(e),Qt=de.ReportGraphSetting.initModel(e),Ut=_e.Reporter.initModel(e),Ht=me.ResultCalculation.initModel(e),Xt=ce.ResultEvaluator.initModel(e),Vt=Te.ResultRuleAnalyte.initModel(e),zt=Ne.ResultRuleInterpretation.initModel(e),Jt=ge.ResultRuleMeltPeak.initModel(e),Yt=fe.SampleSetting.initModel(e),Wt=De.SampleType.initModel(e),$t=Ee.SelectedQuantUnitSetting.initModel(e),Zt=be.SemiQuantOrganism.initModel(e),ea=we.SystemLog.initModel(e),ta=Ie.TargetBasedAssay.initModel(e),aa=Re.TargetBasedOrganism.initModel(e),la=Oe.Test.initModel(e),sa=he.TestBlog.initModel(e),na=Me.TestBlogCounter.initModel(e),ia=Ge.TestDatum.initModel(e),oa=ve.TestDataError.initModel(e),ra=Ae.TestError.initModel(e),pa=Pe.TestHistory.initModel(e),ya=Se.TestNv.initModel(e),ua=Le.UserPrivilege.initModel(e),da=Ke.User.initModel(e);return Ze.belongsToMany(lt,{as:"haplotype_id_haplotypes",through:$e,foreignKey:"genotyping_organism_id",otherKey:"haplotype_id"}),lt.belongsToMany(Ze,{as:"genotyping_organism_id_genotyping_organisms",through:$e,foreignKey:"haplotype_id",otherKey:"genotyping_organism_id"}),a.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(a,{as:"analyte_results",foreignKey:"analyte_id"}),ze.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(ze,{as:"crosstalk_corr_results",foreignKey:"analyte_id"}),ot.belongsTo(t,{as:"id_analyte",foreignKey:"id"}),t.hasOne(ot,{as:"lda_analyte",foreignKey:"id"}),pt.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(pt,{as:"lda_coefficients",foreignKey:"analyte_id"}),ft.belongsTo(t,{as:"parent",foreignKey:"parent_id"}),t.hasMany(ft,{as:"melt_peak_settings",foreignKey:"parent_id"}),Rt.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(Rt,{as:"organism_targets",foreignKey:"analyte_id"}),vt.belongsTo(t,{as:"calculation_target",foreignKey:"calculation_target_id"}),t.hasMany(vt,{as:"percent_ratio_organism_results",foreignKey:"calculation_target_id"}),vt.belongsTo(t,{as:"reporting_target",foreignKey:"reporting_target_id"}),t.hasMany(vt,{as:"reporting_target_percent_ratio_organism_results",foreignKey:"reporting_target_id"}),Pt.belongsTo(t,{as:"calculation_target",foreignKey:"calculation_target_id"}),t.hasMany(Pt,{as:"percent_ratio_result_evaluators",foreignKey:"calculation_target_id"}),Pt.belongsTo(t,{as:"reporting_target",foreignKey:"reporting_target_id"}),t.hasMany(Pt,{as:"reporting_target_percent_ratio_result_evaluators",foreignKey:"reporting_target_id"}),Vt.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(Vt,{as:"result_rule_analytes",foreignKey:"analyte_id"}),Yt.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(Yt,{as:"sample_settings",foreignKey:"analyte_id"}),Qe.belongsTo(a,{as:"parent",foreignKey:"parent_id"}),a.hasMany(Qe,{as:"channel_processed_data_items",foreignKey:"parent_id"}),ze.belongsTo(a,{as:"parent",foreignKey:"parent_id"}),a.hasMany(ze,{as:"crosstalk_corr_results",foreignKey:"parent_id"}),gt.belongsTo(a,{as:"parent",foreignKey:"parent_id"}),a.hasMany(gt,{as:"melt_peak_results",foreignKey:"parent_id"}),t.belongsTo(Ce,{as:"parent",foreignKey:"parent_id"}),Ce.hasMany(t,{as:"analytes",foreignKey:"parent_id"}),Ce.belongsTo(Ce,{as:"parent",foreignKey:"parent_id"}),Ce.hasMany(Ce,{as:"assays",foreignKey:"parent_id"}),je.belongsTo(Ce,{as:"assay",foreignKey:"assay_id"}),Ce.hasMany(je,{as:"assay_positions",foreignKey:"assay_id"}),ke.belongsTo(Ce,{as:"parent",foreignKey:"parent_id"}),Ce.hasMany(ke,{as:"cartridges",foreignKey:"parent_id"}),Xe.belongsTo(Ce,{as:"parent",foreignKey:"parent_id"}),Ce.hasMany(Xe,{as:"color_disclaimers",foreignKey:"parent_id"}),We.belongsTo(Ce,{as:"id_assay",foreignKey:"id"}),Ce.hasOne(We,{as:"genotyping_assay",foreignKey:"id"}),at.belongsTo(Ce,{as:"assay",foreignKey:"assay_id"}),Ce.hasMany(at,{as:"graph_setup_assays",foreignKey:"assay_id"}),rt.belongsTo(Ce,{as:"id_assay",foreignKey:"id"}),Ce.hasOne(rt,{as:"lda_assay",foreignKey:"id"}),dt.belongsTo(Ce,{as:"assay",foreignKey:"assay_id"}),Ce.hasMany(dt,{as:"lis_assay_configs",foreignKey:"assay_id"}),Dt.belongsTo(Ce,{as:"parent",foreignKey:"parent_id"}),Ce.hasMany(Dt,{as:"organisms",foreignKey:"parent_id"}),Et.belongsTo(Ce,{as:"id_assay",foreignKey:"id"}),Ce.hasOne(Et,{as:"organism_based_assay",foreignKey:"id"}),Mt.belongsTo(Ce,{as:"id_assay",foreignKey:"id"}),Ce.hasOne(Mt,{as:"percent_ratio_assay",foreignKey:"id"}),Lt.belongsTo(Ce,{as:"id_assay",foreignKey:"id"}),Ce.hasOne(Lt,{as:"quant1_assay",foreignKey:"id"}),Bt.belongsTo(Ce,{as:"parent",foreignKey:"parent_id"}),Ce.hasMany(Bt,{as:"reagent_lots",foreignKey:"parent_id"}),Qt.belongsTo(Ce,{as:"assay",foreignKey:"assay_id"}),Ce.hasMany(Qt,{as:"report_graph_settings",foreignKey:"assay_id"}),Ht.belongsTo(Ce,{as:"parent",foreignKey:"parent_id"}),Ce.hasMany(Ht,{as:"result_calculations",foreignKey:"parent_id"}),Wt.belongsTo(Ce,{as:"parent",foreignKey:"parent_id"}),Ce.hasMany(Wt,{as:"sample_types",foreignKey:"parent_id"}),$t.belongsTo(Ce,{as:"assay",foreignKey:"assay_id"}),Ce.hasMany($t,{as:"selected_quant_unit_settings",foreignKey:"assay_id"}),ta.belongsTo(Ce,{as:"id_assay",foreignKey:"id"}),Ce.hasOne(ta,{as:"target_based_assay",foreignKey:"id"}),la.belongsTo(Ce,{as:"assay",foreignKey:"assay_id"}),Ce.hasMany(la,{as:"tests",foreignKey:"assay_id"}),sa.belongsTo(Ce,{as:"assay",foreignKey:"assay_id"}),Ce.hasMany(sa,{as:"test_blogs",foreignKey:"assay_id"}),Je.belongsTo(Fe,{as:"id_basic_organism",foreignKey:"id"}),Fe.hasOne(Je,{as:"delta_ct_organism",foreignKey:"id"}),Zt.belongsTo(Fe,{as:"id_basic_organism",foreignKey:"id"}),Fe.hasOne(Zt,{as:"semi_quant_organism",foreignKey:"id"}),xe.belongsTo(ke,{as:"parent",foreignKey:"parent_id"}),ke.hasMany(xe,{as:"assay_chambers",foreignKey:"parent_id"}),ke.belongsTo(qe,{as:"cartridge_type",foreignKey:"cartridge_type_id"}),qe.hasMany(ke,{as:"cartridges",foreignKey:"cartridge_type_id"}),Be.belongsTo(qe,{as:"parent",foreignKey:"parent_id"}),qe.hasMany(Be,{as:"chambers",foreignKey:"parent_id"}),Ot.belongsTo(qe,{as:"parent",foreignKey:"parent_id"}),qe.hasMany(Ot,{as:"paths",foreignKey:"parent_id"}),He.belongsTo(Ue,{as:"parent",foreignKey:"parent_id"}),Ue.hasMany(He,{as:"channel_raw_data_items",foreignKey:"parent_id"}),lt.belongsTo(We,{as:"parent",foreignKey:"parent_id"}),We.hasMany(lt,{as:"haplotypes",foreignKey:"parent_id"}),$e.belongsTo(Ze,{as:"genotyping_organism",foreignKey:"genotyping_organism_id"}),Ze.hasMany($e,{as:"genotyping_haplotype_organisms",foreignKey:"genotyping_organism_id"}),at.belongsTo(tt,{as:"graph_setup",foreignKey:"graph_setup_id"}),tt.hasMany(at,{as:"graph_setup_assays",foreignKey:"graph_setup_id"}),$e.belongsTo(lt,{as:"haplotype",foreignKey:"haplotype_id"}),lt.hasMany($e,{as:"genotyping_haplotype_organisms",foreignKey:"haplotype_id"}),st.belongsTo(lt,{as:"haplotype",foreignKey:"haplotype_id"}),lt.hasMany(st,{as:"haplotype_results",foreignKey:"haplotype_id"}),nt.belongsTo(lt,{as:"parent",foreignKey:"parent_id"}),lt.hasMany(nt,{as:"haplotype_result_texts",foreignKey:"parent_id"}),mt.belongsTo(lt,{as:"haplotype",foreignKey:"haplotype_id"}),lt.hasMany(mt,{as:"lis_haplotype_configs",foreignKey:"haplotype_id"}),pt.belongsTo(yt,{as:"parent",foreignKey:"parent_id"}),yt.hasMany(pt,{as:"lda_coefficients",foreignKey:"parent_id"}),_t.belongsTo(dt,{as:"id_lis_assay_config",foreignKey:"id"}),dt.hasOne(_t,{as:"lis_genotyping_assay_config",foreignKey:"id"}),Nt.belongsTo(Tt,{as:"test_order",foreignKey:"test_order_id"}),Tt.hasMany(Nt,{as:"lis_uploads",foreignKey:"test_order_id"}),Fe.belongsTo(Dt,{as:"id_organism",foreignKey:"id"}),Dt.hasOne(Fe,{as:"basic_organism",foreignKey:"id"}),Ze.belongsTo(Dt,{as:"id_organism",foreignKey:"id"}),Dt.hasOne(Ze,{as:"genotyping_organism",foreignKey:"id"}),yt.belongsTo(Dt,{as:"id_organism",foreignKey:"id"}),Dt.hasOne(yt,{as:"lda_organism",foreignKey:"id"}),ct.belongsTo(Dt,{as:"organism",foreignKey:"organism_id"}),Dt.hasMany(ct,{as:"lis_organism_configs",foreignKey:"organism_id"}),wt.belongsTo(Dt,{as:"organism",foreignKey:"organism_id"}),Dt.hasMany(wt,{as:"organism_results",foreignKey:"organism_id"}),It.belongsTo(Dt,{as:"parent",foreignKey:"parent_id"}),Dt.hasMany(It,{as:"organism_result_texts",foreignKey:"parent_id"}),Rt.belongsTo(Dt,{as:"parent",foreignKey:"parent_id"}),Dt.hasMany(Rt,{as:"organism_targets",foreignKey:"parent_id"}),Gt.belongsTo(Dt,{as:"id_organism",foreignKey:"id"}),Dt.hasOne(Gt,{as:"percent_ratio_organism",foreignKey:"id"}),Kt.belongsTo(Dt,{as:"id_organism",foreignKey:"id"}),Dt.hasOne(Kt,{as:"quant1_organism",foreignKey:"id"}),Xt.belongsTo(Dt,{as:"parent",foreignKey:"parent_id"}),Dt.hasMany(Xt,{as:"result_evaluators",foreignKey:"parent_id"}),aa.belongsTo(Dt,{as:"id_organism",foreignKey:"id"}),Dt.hasOne(aa,{as:"target_based_organism",foreignKey:"id"}),et.belongsTo(wt,{as:"id_organism_result",foreignKey:"id"}),wt.hasOne(et,{as:"genotyping_organism_result",foreignKey:"id"}),ut.belongsTo(wt,{as:"id_organism_result",foreignKey:"id"}),wt.hasOne(ut,{as:"lda_organism_result",foreignKey:"id"}),bt.belongsTo(wt,{as:"id_organism_result",foreignKey:"id"}),wt.hasOne(bt,{as:"organism_based_organism_result",foreignKey:"id"}),vt.belongsTo(wt,{as:"id_organism_result",foreignKey:"id"}),wt.hasOne(vt,{as:"percent_ratio_organism_result",foreignKey:"id"}),Ct.belongsTo(wt,{as:"id_organism_result",foreignKey:"id"}),wt.hasOne(Ct,{as:"quant1_organism_result",foreignKey:"id"}),Tt.belongsTo(ht,{as:"patient",foreignKey:"patient_id"}),ht.hasMany(Tt,{as:"lis_test_orders",foreignKey:"patient_id"}),la.belongsTo(ht,{as:"patient",foreignKey:"patient_id"}),ht.hasMany(la,{as:"tests",foreignKey:"patient_id"}),kt.belongsTo(Kt,{as:"parent",foreignKey:"parent_id"}),Kt.hasMany(kt,{as:"quant_unit_settings",foreignKey:"parent_id"}),jt.belongsTo(Ct,{as:"parent",foreignKey:"parent_id"}),Ct.hasMany(jt,{as:"quant1_results",foreignKey:"parent_id"}),jt.belongsTo(kt,{as:"quant_unit_setting",foreignKey:"quant_unit_setting_id"}),kt.hasMany(jt,{as:"quant1_results",foreignKey:"quant_unit_setting_id"}),At.belongsTo(Bt,{as:"id_reagent_lot",foreignKey:"id"}),Bt.hasOne(At,{as:"percent_ratio_reagent_lot",foreignKey:"id"}),xt.belongsTo(Bt,{as:"id_reagent_lot",foreignKey:"id"}),Bt.hasOne(xt,{as:"quant1_reagent_lot",foreignKey:"id"}),Yt.belongsTo(Bt,{as:"parent",foreignKey:"parent_id"}),Bt.hasMany(Yt,{as:"sample_settings",foreignKey:"parent_id"}),Vt.belongsTo(Xt,{as:"parent",foreignKey:"parent_id"}),Xt.hasMany(Vt,{as:"result_rule_analytes",foreignKey:"parent_id"}),zt.belongsTo(Vt,{as:"id_result_rule_analyte",foreignKey:"id"}),Vt.hasOne(zt,{as:"result_rule_interpretation",foreignKey:"id"}),Jt.belongsTo(Vt,{as:"id_result_rule_analyte",foreignKey:"id"}),Vt.hasOne(Jt,{as:"result_rule_melt_peak",foreignKey:"id"}),St.belongsTo(Yt,{as:"id_sample_setting",foreignKey:"id"}),Yt.hasOne(St,{as:"percent_ratio_sample_setting",foreignKey:"id"}),Ft.belongsTo(Yt,{as:"id_sample_setting",foreignKey:"id"}),Yt.hasOne(Ft,{as:"quant1_sample_setting",foreignKey:"id"}),a.belongsTo(la,{as:"parent",foreignKey:"parent_id"}),la.hasMany(a,{as:"analyte_results",foreignKey:"parent_id"}),st.belongsTo(la,{as:"parent",foreignKey:"parent_id"}),la.hasMany(st,{as:"haplotype_results",foreignKey:"parent_id"}),Tt.belongsTo(la,{as:"test",foreignKey:"test_id"}),la.hasMany(Tt,{as:"lis_test_orders",foreignKey:"test_id"}),Nt.belongsTo(la,{as:"test",foreignKey:"test_id"}),la.hasMany(Nt,{as:"lis_uploads",foreignKey:"test_id"}),wt.belongsTo(la,{as:"parent",foreignKey:"parent_id"}),la.hasMany(wt,{as:"organism_results",foreignKey:"parent_id"}),la.belongsTo(la,{as:"parent",foreignKey:"parent_id"}),la.hasMany(la,{as:"tests",foreignKey:"parent_id"}),ia.belongsTo(la,{as:"test",foreignKey:"test_id"}),la.hasOne(ia,{as:"test_data",foreignKey:"test_id"}),ra.belongsTo(la,{as:"parent",foreignKey:"parent_id"}),la.hasMany(ra,{as:"test_errors",foreignKey:"parent_id"}),pa.belongsTo(la,{as:"parent",foreignKey:"parent_id"}),la.hasMany(pa,{as:"test_histories",foreignKey:"parent_id"}),ya.belongsTo(la,{as:"test",foreignKey:"test_id"}),la.hasMany(ya,{as:"test_nvs",foreignKey:"test_id"}),na.belongsTo(sa,{as:"test_blog",foreignKey:"test_blog_id"}),sa.hasMany(na,{as:"test_blog_counters",foreignKey:"test_blog_id"}),Ue.belongsTo(ia,{as:"parent",foreignKey:"parent_id"}),ia.hasMany(Ue,{as:"channel_raw_data",foreignKey:"parent_id"}),qt.belongsTo(ia,{as:"parent",foreignKey:"parent_id"}),ia.hasMany(qt,{as:"raw_data_items",foreignKey:"parent_id"}),oa.belongsTo(ia,{as:"parent",foreignKey:"parent_id"}),ia.hasMany(oa,{as:"test_data_errors",foreignKey:"parent_id"}),Ce.belongsTo(da,{as:"user",foreignKey:"user_id"}),da.hasMany(Ce,{as:"assays",foreignKey:"user_id"}),Ye.belongsTo(da,{as:"user",foreignKey:"user_id"}),da.hasMany(Ye,{as:"disabled_modules",foreignKey:"user_id"}),la.belongsTo(da,{as:"user",foreignKey:"user_id"}),da.hasMany(la,{as:"tests",foreignKey:"user_id"}),pa.belongsTo(da,{as:"user",foreignKey:"user_id"}),da.hasMany(pa,{as:"test_histories",foreignKey:"user_id"}),{Analyte:t,AnalyteResult:a,Assay:Ce,AssayChamber:xe,AssayPosition:je,BasicOrganism:Fe,Cartridge:ke,CartridgeType:qe,Chamber:Be,ChannelProcessedDataItem:Qe,ChannelRawDatum:Ue,ChannelRawDataItem:He,ColorDisclaimer:Xe,Config:Ve,CrosstalkCorrResult:ze,DeltaCtOrganism:Je,DisabledModule:Ye,GenotypingAssay:We,GenotypingHaplotypeOrganism:$e,GenotypingOrganism:Ze,GenotypingOrganismResult:et,GraphSetup:tt,GraphSetupAssay:at,Haplotype:lt,HaplotypeResult:st,HaplotypeResultText:nt,Instrument:it,LdaAnalyte:ot,LdaAssay:rt,LdaCoefficient:pt,LdaOrganism:yt,LdaOrganismResult:ut,LisAssayConfig:dt,LisGenotypingAssayConfig:_t,LisHaplotypeConfig:mt,LisOrganismConfig:ct,LisTestOrder:Tt,LisUpload:Nt,MeltPeakResult:gt,MeltPeakSetting:ft,Organism:Dt,OrganismBasedAssay:Et,OrganismBasedOrganismResult:bt,OrganismResult:wt,OrganismResultText:It,OrganismTarget:Rt,Path:Ot,Patient:ht,PercentRatioAssay:Mt,PercentRatioOrganism:Gt,PercentRatioOrganismResult:vt,PercentRatioReagentLot:At,PercentRatioResultEvaluator:Pt,PercentRatioSampleSetting:St,Quant1Assay:Lt,Quant1Organism:Kt,Quant1OrganismResult:Ct,Quant1ReagentLot:xt,Quant1Result:jt,Quant1SampleSetting:Ft,QuantUnitSetting:kt,RawDataItem:qt,ReagentLot:Bt,ReportGraphSetting:Qt,Reporter:Ut,ResultCalculation:Ht,ResultEvaluator:Xt,ResultRuleAnalyte:Vt,ResultRuleInterpretation:zt,ResultRuleMeltPeak:Jt,SampleSetting:Yt,SampleType:Wt,SelectedQuantUnitSetting:$t,SemiQuantOrganism:Zt,SystemLog:ea,TargetBasedAssay:ta,TargetBasedOrganism:aa,Test:la,TestBlog:sa,TestBlogCounter:na,TestDatum:ia,TestDataError:oa,TestError:ra,TestHistory:pa,TestNv:ya,UserPrivilege:ua,User:da}}},7324:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Instrument=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Instrument",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},mac_address:{type:l.DataTypes.BLOB,allowNull:!0},serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},letter_offset:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"instrument",schema:"dbo",timestamps:!1,indexes:[{name:"PK__instrume__3213E83F1D5A460D",unique:!0,fields:[{name:"id"}]},{name:"UX_instrument_letteroffset",unique:!0,fields:[{name:"letter_offset"}]},{name:"UX_instrument_macaddress",unique:!0,fields:[{name:"mac_address"}]},{name:"UX_instrument_serialnumber",unique:!0,fields:[{name:"serial_number"}]}]})}}t.Instrument=s},2673:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaAnalyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaAnalyte",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"analyte",key:"id"}},cycle_if_no_ct:{type:l.DataTypes.INTEGER,allowNull:!1},min_ct_req_pass_controls:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"lda_analyte",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_anal__3213E83F29F9EB12",unique:!0,fields:[{name:"id"}]}]})}}t.LdaAnalyte=s},7425:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaAssay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"lda_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_assa__3213E83F59A52308",unique:!0,fields:[{name:"id"}]}]})}}t.LdaAssay=s},5710:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaCoefficient=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaCoefficient",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"lda_organism",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!1},delta_ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"lda_coefficient",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_coef__3213E83F72D43F1D",unique:!0,fields:[{name:"id"}]}]})}}t.LdaCoefficient=s},4741:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},lda_total:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"lda_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_orga__3213E83F380F55A4",unique:!0,fields:[{name:"id"}]}]})}}t.LdaOrganismResult=s},7110:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},cutoff:{type:l.DataTypes.FLOAT,allowNull:!1},intercept:{type:l.DataTypes.FLOAT,allowNull:!1},max_valid_range:{type:l.DataTypes.FLOAT,allowNull:!1},min_valid_range:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"lda_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_orga__3213E83F8614FDA0",unique:!0,fields:[{name:"id"}]}]})}}t.LdaOrganism=s},3179:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisAssayConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisAssayConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},test_code:{type:l.DataTypes.STRING(15),allowNull:!0},test_code_enabled:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"lis_assay_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_assa__3213E83F3C29870A",unique:!0,fields:[{name:"id"}]}]})}}t.LisAssayConfig=s},4810:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisGenotypingAssayConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisGenotypingAssayConfig",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"lis_assay_config",key:"id"}}},{tableName:"lis_genotyping_assay_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_geno__3213E83FEC5A20DB",unique:!0,fields:[{name:"id"}]}]})}}t.LisGenotypingAssayConfig=s},1219:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisHaplotypeConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisHaplotypeConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"haplotype",key:"id"}},result_code:{type:l.DataTypes.STRING(15),allowNull:!0}},{tableName:"lis_haplotype_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_hapl__3213E83FC2F71408",unique:!0,fields:[{name:"id"}]}]})}}t.LisHaplotypeConfig=s},2855:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisOrganismConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisOrganismConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},result_code:{type:l.DataTypes.STRING(15),allowNull:!0}},{tableName:"lis_organism_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_orga__3213E83F2F292B05",unique:!0,fields:[{name:"id"}]}]})}}t.LisOrganismConfig=s},7519:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisTestOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisTestOrder",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},host_test_code:{type:l.DataTypes.STRING(15),allowNull:!0},instrument_specific_sample_id:{type:l.DataTypes.STRING(64),allowNull:!0},order_status:{type:l.DataTypes.INTEGER,allowNull:!1},patient_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"patient",key:"id"}},priority:{type:l.DataTypes.INTEGER,allowNull:!1},sample_id:{type:l.DataTypes.STRING(25),allowNull:!0},cartridge_id:{type:l.DataTypes.STRING(25),allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test",key:"id"}}},{tableName:"lis_test_order",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_test__3213E83FF0E2345C",unique:!0,fields:[{name:"id"}]},{name:"UX_listestorder_testid",unique:!0,fields:[{name:"test_id"}]}]})}}t.LisTestOrder=s},8608:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisUpload=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisUpload",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},test_order_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"lis_test_order",key:"id"}},upload_message_id:{type:l.DataTypes.STRING(64),allowNull:!0},upload_status:{type:l.DataTypes.INTEGER,allowNull:!1},sample_priority:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"lis_upload",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_uplo__3213E83F0EA9D7BF",unique:!0,fields:[{name:"id"}]},{name:"UX_lis_upload_test_id",unique:!0,fields:[{name:"test_id"}]}]})}}t.LisUpload=s},4298:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte_result",key:"id"}},peak_height:{type:l.DataTypes.FLOAT,allowNull:!1},peak_index:{type:l.DataTypes.INTEGER,allowNull:!1},peak_temperature:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"melt_peak_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_melt_peak_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__melt_pea__3213E83E1FE51EFB",unique:!0,fields:[{name:"id"}]}]})}}t.MeltPeakResult=s},630:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte",key:"id"}},slope_positive:{type:l.DataTypes.BOOLEAN,allowNull:!1},baseline_look_back:{type:l.DataTypes.FLOAT,allowNull:!1},baseline_num_points:{type:l.DataTypes.INTEGER,allowNull:!1},baseline_start_temp:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_max:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_min:{type:l.DataTypes.FLOAT,allowNull:!1},peak_threshold:{type:l.DataTypes.FLOAT,allowNull:!1},points_around_peak:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"melt_peak_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__melt_pea__3213E83FBAF87862",unique:!0,fields:[{name:"id"}]},{name:"UX_meltpeaksetting_parentid",unique:!0,fields:[{name:"parent_id"}]}]})}}t.MeltPeakSetting=s},7883:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismBasedAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismBasedAssay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"organism_based_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83F210E91DF",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismBasedAssay=s},1122:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismBasedOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismBasedOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},semi_quant_level:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"organism_based_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83FBBF8D3EA",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismBasedOrganismResult=s},6321:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultText",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(8),allowNull:!1},result_text:{type:l.DataTypes.INTEGER,allowNull:!1},text_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"organism_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83FF9BBD424",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismResultText=s},9668:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"organism",key:"id"}},result_text:{type:l.DataTypes.INTEGER,allowNull:!1},result_color:{type:l.DataTypes.INTEGER,allowNull:!1},is_result_invalid:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_organism_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__organism__3213E83EA550B35B",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismResult=s},8476:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismTarget=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismTarget",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}}},{tableName:"organism_target",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83F06D96945",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismTarget=s},8374:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Organism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Organism",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},name:{type:l.DataTypes.STRING(32),allowNull:!1},organism_index:{type:l.DataTypes.INTEGER,allowNull:!1},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83FE0D2FAA1",unique:!0,fields:[{name:"id"}]}]})}}t.Organism=s},5828:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Path=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Path",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge_type",key:"id"}},angular_offset:{type:l.DataTypes.FLOAT,allowNull:!1},chamber_number:{type:l.DataTypes.INTEGER,allowNull:!0},is_block:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!1},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"path",schema:"dbo",timestamps:!1,indexes:[{name:"PK__path__3213E83F3A63F5BA",unique:!0,fields:[{name:"id"}]}]})}}t.Path=s},3708:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Patient=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Patient",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},gx_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},practice_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},family_name:{type:l.DataTypes.STRING(1552),allowNull:!0},given_name:{type:l.DataTypes.STRING(240),allowNull:!0},middle_name:{type:l.DataTypes.STRING(240),allowNull:!0},date_of_birth:{type:l.DataTypes.STRING(96),allowNull:!0},gender:{type:l.DataTypes.STRING(128),allowNull:!0},ethnicity:{type:l.DataTypes.STRING(512),allowNull:!0},postal_code:{type:l.DataTypes.STRING(96),allowNull:!0}},{tableName:"patient",schema:"dbo",timestamps:!1,indexes:[{name:"PK__patient__3213E83F500DEB6B",unique:!0,fields:[{name:"id"}]}]})}}t.Patient=s},9913:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioAssay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"percent_ratio_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F68A8D83F",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioAssay=s},9169:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},ratio_percent:{type:l.DataTypes.FLOAT,allowNull:!0},log_transform:{type:l.DataTypes.FLOAT,allowNull:!0},reporting_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},calculation_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},detailed_result:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"percent_ratio_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F8DCBBE5A",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioOrganismResult=s},2232:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},dynamic_range_max:{type:l.DataTypes.FLOAT,allowNull:!1},dynamic_range_min:{type:l.DataTypes.FLOAT,allowNull:!1},lod_loq:{type:l.DataTypes.FLOAT,allowNull:!1},log_transform_type:{type:l.DataTypes.INTEGER,allowNull:!1},units:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"percent_ratio_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F1C1399B7",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioOrganism=s},894:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioReagentLot",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"reagent_lot",key:"id"}}},{tableName:"percent_ratio_reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F295E59AE",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioReagentLot=s},7363:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioResultEvaluator=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioResultEvaluator",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},calculation_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},reporting_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}}},{tableName:"percent_ratio_result_evaluator",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F0102494E",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioResultEvaluator=s},2026:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioSampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioSampleSetting",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"sample_setting",key:"id"}},delta_ct_efficiency:{type:l.DataTypes.FLOAT,allowNull:!0},scaling_factor:{type:l.DataTypes.DECIMAL(5,2),allowNull:!0}},{tableName:"percent_ratio_sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83FACBB9456",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioSampleSetting=s},9250:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1Assay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1Assay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"quant1_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_a__3213E83FFBCA71DA",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1Assay=s},5021:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1OrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1OrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}}},{tableName:"quant1_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_o__3213E83F4ADBB366",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1OrganismResult=s},3739:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1Organism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1Organism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},max_quantitative_delta:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"quant1_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_o__3213E83F760E8E2C",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1Organism=s},6693:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1ReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1ReagentLot",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"reagent_lot",key:"id"}}},{tableName:"quant1_reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_r__3213E83FD7043653",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1ReagentLot=s},2949:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1Result=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1Result",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"quant1_organism_result",key:"id"}},quantitative_result:{type:l.DataTypes.FLOAT,allowNull:!0},quant_unit_setting_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"quant_unit_setting",key:"id"}},result_abnormal_flag:{type:l.DataTypes.STRING(5),allowNull:!0}},{tableName:"quant1_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_quant1_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__quant1_r__3213E83E904FF5F0",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1Result=s},3664:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1SampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1SampleSetting",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"sample_setting",key:"id"}},e0:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},e1:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},e2:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0}},{tableName:"quant1_sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_s__3213E83F2C81C938",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1SampleSetting=s},1747:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QuantUnitSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QuantUnitSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"quant1_organism",key:"id"}},conversion_factor:{type:l.DataTypes.FLOAT,allowNull:!1},display_log_value:{type:l.DataTypes.BOOLEAN,allowNull:!1},lower_limit:{type:l.DataTypes.FLOAT,allowNull:!1},position:{type:l.DataTypes.INTEGER,allowNull:!1},units:{type:l.DataTypes.INTEGER,allowNull:!1},upper_limit:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"quant_unit_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant_un__3213E83FE8E6C80B",unique:!0,fields:[{name:"id"}]}]})}}t.QuantUnitSetting=s},8090:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RawDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("RawDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test_data",key:"id"}},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0},timestamps:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"raw_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_raw_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__raw_data__3213E83E261626F5",unique:!0,fields:[{name:"id"}]}]})}}t.RawDataItem=s},8323:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ReagentLot",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},creation_time:{type:l.DataTypes.DATE,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!1},reagent_lot_number:{type:l.DataTypes.STRING(3),allowNull:!1}},{tableName:"reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__reagent___3213E83F654D76BF",unique:!0,fields:[{name:"id"}]}]})}}t.ReagentLot=s},771:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ReportGraphSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ReportGraphSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}},graph_type:{type:l.DataTypes.INTEGER,allowNull:!0},param_key:{type:l.DataTypes.STRING(64),allowNull:!1},param_val:{type:l.DataTypes.STRING(512),allowNull:!0}},{tableName:"report_graph_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__report_g__3213E83F45404AE6",unique:!0,fields:[{name:"id"}]}]})}}t.ReportGraphSetting=s},200:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Reporter=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Reporter",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},concentration:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(12),allowNull:!1}},{tableName:"reporter",schema:"dbo",timestamps:!1,indexes:[{name:"PK__reporter__3213E83F8B6A21DD",unique:!0,fields:[{name:"id"}]},{name:"UX_reporter_name",unique:!0,fields:[{name:"name"}]}]})}}t.Reporter=s},4829:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultCalculation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultCalculation",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},chain_name:{type:l.DataTypes.STRING(64),allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1}},{tableName:"result_calculation",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_c__3213E83FDF13CEAD",unique:!0,fields:[{name:"id"}]}]})}}t.ResultCalculation=s},1452:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultEvaluator=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultEvaluator",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},evaluator_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_text:{type:l.DataTypes.INTEGER,allowNull:!1},rule_anded:{type:l.DataTypes.BOOLEAN,allowNull:!1},text_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"result_evaluator",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_e__3213E83F523A8A97",unique:!0,fields:[{name:"id"}]}]})}}t.ResultEvaluator=s},1093:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultRuleAnalyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultRuleAnalyte",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"result_evaluator",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},rule_index:{type:l.DataTypes.INTEGER,allowNull:!1},rule_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"result_rule_analyte",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_r__3213E83F54E0B232",unique:!0,fields:[{name:"id"}]}]})}}t.ResultRuleAnalyte=s},3271:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultRuleInterpretation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultRuleInterpretation",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"result_rule_analyte",key:"id"}},interpretation:{type:l.DataTypes.INTEGER,allowNull:!1},pass_on_equals:{type:l.DataTypes.BOOLEAN,allowNull:!1},reasons:{type:l.DataTypes.STRING(50),allowNull:!0}},{tableName:"result_rule_interpretation",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_r__3213E83FB046073F",unique:!0,fields:[{name:"id"}]}]})}}t.ResultRuleInterpretation=s},3745:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultRuleMeltPeak=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultRuleMeltPeak",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"result_rule_analyte",key:"id"}},pass_on_peak:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"result_rule_melt_peak",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_r__3213E83FCFD26AA9",unique:!0,fields:[{name:"id"}]}]})}}t.ResultRuleMeltPeak=s},6709:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"reagent_lot",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},ct_threshold_value:{type:l.DataTypes.FLOAT,allowNull:!1},end_pt_threshold:{type:l.DataTypes.INTEGER,allowNull:!1},min_delta_ct:{type:l.DataTypes.FLOAT,allowNull:!1},normalization_factor:{type:l.DataTypes.INTEGER,allowNull:!1},peak_height_min:{type:l.DataTypes.FLOAT,allowNull:!1},probe_chk_delta:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_high_max:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_high_min:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_low_max:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_low_min:{type:l.DataTypes.INTEGER,allowNull:!1},use_endpoint:{type:l.DataTypes.BOOLEAN,allowNull:!1},use_min_delta_ct:{type:l.DataTypes.BOOLEAN,allowNull:!1},valid_max:{type:l.DataTypes.DECIMAL(5,1),allowNull:!1},valid_min:{type:l.DataTypes.DECIMAL(5,1),allowNull:!1}},{tableName:"sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__sample_s__3213E83F372020C1",unique:!0,fields:[{name:"id"}]}]})}}t.SampleSetting=s},8388:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleType=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleType",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},sample_type_key:{type:l.DataTypes.STRING(5),allowNull:!1}},{tableName:"sample_type",schema:"dbo",timestamps:!1,indexes:[{name:"PK__sample_t__3213E83FB25BD1D4",unique:!0,fields:[{name:"id"}]}]})}}t.SampleType=s},1111:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SelectedQuantUnitSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SelectedQuantUnitSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},units:{type:l.DataTypes.INTEGER,allowNull:!1},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}}},{tableName:"selected_quant_unit_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__selected__3213E83F734FFC3D",unique:!0,fields:[{name:"id"}]}]})}}t.SelectedQuantUnitSetting=s},5274:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SemiQuantOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SemiQuantOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"basic_organism",key:"id"}},delta_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1},low_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1},medium_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1},replaced_result_color:{type:l.DataTypes.INTEGER,allowNull:!1},replaced_result_text:{type:l.DataTypes.INTEGER,allowNull:!1},semi_quant_result_text:{type:l.DataTypes.INTEGER,allowNull:!1},very_low_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"semi_quant_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__semi_qua__3213E83F798098BE",unique:!0,fields:[{name:"id"}]}]})}}t.SemiQuantOrganism=s},7497:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SystemLog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SystemLog",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},details:{type:l.DataTypes.STRING(512),allowNull:!0},error_code:{type:l.DataTypes.INTEGER,allowNull:!0},error_type:{type:l.DataTypes.INTEGER,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!1},site_name:{type:l.DataTypes.CHAR(3),allowNull:!0},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"system_log",schema:"dbo",timestamps:!1,indexes:[{name:"PK__system_l__3213E83FD2152FF4",unique:!0,fields:[{name:"id"}]}]})}}t.SystemLog=s},7657:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TargetBasedAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TargetBasedAssay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"target_based_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__target_b__3213E83FBC5750E1",unique:!0,fields:[{name:"id"}]}]})}}t.TargetBasedAssay=s},6344:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TargetBasedOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TargetBasedOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}}},{tableName:"target_based_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__target_b__3213E83FD1505E40",unique:!0,fields:[{name:"id"}]}]})}}t.TargetBasedOrganism=s},4668:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlogCounter=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlogCounter",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_blog_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test_blog",key:"id"}},date_text:{type:l.DataTypes.STRING(8),allowNull:!0},test_count:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"test_blog_counter",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test_blo__3213E83F641C1761",unique:!0,fields:[{name:"id"}]},{name:"UX_testblogcounter_testblogid_datetext",unique:!0,fields:[{name:"test_blog_id"},{name:"date_text"}]}]})}}t.TestBlogCounter=s},806:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlog",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}}},{tableName:"test_blog",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test_blo__3213E83FB1125CAD",unique:!0,fields:[{name:"id"}]},{name:"UX_testblog_assayid",unique:!0,fields:[{name:"assay_id"}]}]})}}t.TestBlog=s},1257:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestDataError=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestDataError",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test_data",key:"id"}},code:{type:l.DataTypes.INTEGER,allowNull:!1},details:{type:l.DataTypes.STRING(512),allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!1},param1:{type:l.DataTypes.FLOAT,allowNull:!0},param2:{type:l.DataTypes.FLOAT,allowNull:!0},param3:{type:l.DataTypes.FLOAT,allowNull:!0},param4:{type:l.DataTypes.FLOAT,allowNull:!0},severity:{type:l.DataTypes.INTEGER,allowNull:!1},site_state:{type:l.DataTypes.INTEGER,allowNull:!1},step_number:{type:l.DataTypes.INTEGER,allowNull:!1},text_param:{type:l.DataTypes.STRING(64),allowNull:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_data_error",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_data_error_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_dat__3213E83E1B49E848",unique:!0,fields:[{name:"id"}]}]})}}t.TestDataError=s},4114:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestDatum=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestDatum",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test",key:"id"}},datagram_format:{type:l.DataTypes.INTEGER,allowNull:!0},end_time:{type:l.DataTypes.DATE,allowNull:!0},error_status:{type:l.DataTypes.INTEGER,allowNull:!1},fw_version:{type:l.DataTypes.STRING(12),allowNull:!0},icore_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},site_name:{type:l.DataTypes.STRING(512),allowNull:!0},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},start_time:{type:l.DataTypes.DATE,allowNull:!0},state:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_data",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_data_test_id",fields:[{name:"test_id"}]},{name:"PK__test_dat__3213E83EF0E87FE5",unique:!0,fields:[{name:"id"}]},{name:"UX_testdata_testid",unique:!0,fields:[{name:"test_id"}]}]})}}t.TestDatum=s},9067:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestError=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestError",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},code:{type:l.DataTypes.INTEGER,allowNull:!1},details:{type:l.DataTypes.STRING(512),allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!1},param1:{type:l.DataTypes.FLOAT,allowNull:!0},param2:{type:l.DataTypes.FLOAT,allowNull:!0},param3:{type:l.DataTypes.FLOAT,allowNull:!0},param4:{type:l.DataTypes.FLOAT,allowNull:!0},severity:{type:l.DataTypes.INTEGER,allowNull:!1},text_param:{type:l.DataTypes.STRING(64),allowNull:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_error",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_error_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_err__3213E83E23C2502B",unique:!0,fields:[{name:"id"}]}]})}}t.TestError=s},7595:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestHistory",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},creation_time:{type:l.DataTypes.DATE,allowNull:!1},field_name:{type:l.DataTypes.STRING(32),allowNull:!1},new_content:{type:l.DataTypes.STRING(512),allowNull:!0},old_content:{type:l.DataTypes.STRING(512),allowNull:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"users",key:"id"}}},{tableName:"test_history",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_history_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_his__3213E83ED52A9142",unique:!0,fields:[{name:"id"}]}]})}}t.TestHistory=s},2200:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestNv=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestNv",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},archived:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_nv",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test_nv__3213E83F55A45015",unique:!0,fields:[{name:"id"}]},{name:"UX_testnv_testid",unique:!0,fields:[{name:"test_id"}]}]})}}t.TestNv=s},6676:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Test=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Test",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},result_text_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test",key:"id"}},is_current_test:{type:l.DataTypes.BOOLEAN,allowNull:!0},cartridge_barcode:{type:l.DataTypes.STRING(1024),allowNull:!0},cart_serial_number:{type:l.DataTypes.BIGINT,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},data_reduction_algorithm:{type:l.DataTypes.INTEGER,allowNull:!0},error_status:{type:l.DataTypes.INTEGER,allowNull:!1},expiration_date:{type:l.DataTypes.DATE,allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_scanned_patient_id:{type:l.DataTypes.BOOLEAN,allowNull:!0},is_scanned_sample_id:{type:l.DataTypes.BOOLEAN,allowNull:!0},modification_time:{type:l.DataTypes.DATE,allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},order_time:{type:l.DataTypes.DATE,allowNull:!0},other_sample_type_text:{type:l.DataTypes.STRING(32),allowNull:!0},legacy_result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_color:{type:l.DataTypes.TEXT,allowNull:!0},rgt_lot_id:{type:l.DataTypes.STRING(6),allowNull:!0},sample_id:{type:l.DataTypes.STRING(25),allowNull:!0},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"users",key:"id"}},patient_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"patient",key:"id"}},test_type:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"test",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test__3213E83F20BD5504",unique:!0,fields:[{name:"id"}]},{name:"UX_test_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.Test=s},8803:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UserPrivilege=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("UserPrivilege",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},privilege_name:{type:l.DataTypes.STRING(64),allowNull:!1},user_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"user_privilege",schema:"dbo",timestamps:!1,indexes:[{name:"PK__user_pri__3213E83FB86800A5",unique:!0,fields:[{name:"id"}]}]})}}t.UserPrivilege=s},9005:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.User=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("User",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},full_name:{type:l.DataTypes.STRING(128),allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_hidden:{type:l.DataTypes.BOOLEAN,allowNull:!1},login_name:{type:l.DataTypes.STRING(32),allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!0},password:{type:l.DataTypes.STRING(256),allowNull:!1},user_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"users",schema:"dbo",timestamps:!1,indexes:[{name:"PK__users__3213E83FFBF72FFA",unique:!0,fields:[{name:"id"}]},{name:"UX_users_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.User=s},3153:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.triggerLabSelection=t.triggerRegistration=t.saveLab=t.fetchLabs=void 0;const l=a(7104),s=a(7632),n=a(8969),i=a(7219),o=a(9968);function r(e){return(0,o.update)("lab",e)}t.fetchLabs=function(e){return s.backendClient.get(`/labs?${(0,l.stringify)({field:"name",order:"ASC",perPage:100,filter:{search:{name:e}}})}`).then((e=>e.data.data))},t.saveLab=r,t.triggerRegistration=function(){return(0,o.get)("registration_token").then((e=>e?Promise.resolve():(0,n.registerDevice)())).catch((e=>{var t;return i.logger.info(null===(t=null==e?void 0:e.response)||void 0===t?void 0:t.config)}))},t.triggerLabSelection=function(){return(0,o.get)("lab").then((e=>e?Promise.resolve():s.backendClient.get("/labs/current").then((e=>e.data)).then((e=>r(e))).catch((e=>{var t,a;404===(null===(t=e.response)||void 0===t?void 0:t.status)&&(null===(a=process.send)||void 0===a||a.call(process,{type:"trigger-lab-selection"}))}))))}},7219:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.logger=void 0;const s=l(a(8857));t.logger=s.default},9718:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,o)}r((l=l.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),a(4804);const s=a(3827),n=a(7219),i=a(1415),o=a(2166),r=a(5232),p=a(6881),y=a(3153),u=a(8626),d=(0,s.createSyncWorker)();function _(){return l(this,void 0,void 0,(function*(){try{const e=yield(0,i.createGeneXpertClient)();return[(0,u.throttled)((()=>(0,o.checkAndNotifyForDataEntry)(e)),(0,u.storedInterval)("next_tests_prompt_at"))]}catch(e){throw console.error("Failed to add GeneXpert jobs:",e),e}}))}function m(){const e=(0,u.throttled)(p.checkAndNotifyForStockUpdate,(0,u.storedInterval)("next_stock_prompt_at"));return Promise.resolve([e])}d.add(y.triggerRegistration),(0,r.ensureDeviceIsRegistered)().then((()=>d.addFromGetters([_,m]))).catch((e=>{n.logger.error(e.message),process.exit(1)}))},5232:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ensureDeviceIsRegistered=void 0;const l=a(8670),s=a(7219),n=a(9968);t.ensureDeviceIsRegistered=function e(){return(0,n.get)("registration_token").then((t=>{if(!t)return s.logger.info("device is not registered"),(0,l.setTimeout)(5e3).then((()=>e()))}))}},4639:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CalibrationSummary=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.INTEGER,primaryKey:!0,autoIncrement:!0},name:{type:l.DataTypes.STRING},path:{type:l.DataTypes.STRING},content:{type:l.DataTypes.STRING},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"CalibrationSummary",tableName:"CalibrationSummary"})}static associate(e){}}t.CalibrationSummary=s},7755:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ContactPerson=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.STRING,primaryKey:!0},name:{type:l.DataTypes.STRING},phone:{type:l.DataTypes.STRING},email:{type:l.DataTypes.STRING},isPrimaryContact:{type:l.DataTypes.BOOLEAN,defaultValue:!1,allowNull:!0},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"ContactPerson",tableName:"ContactPerson"})}static associate(e){}}t.ContactPerson=s},5132:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,o)}r((l=l.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.clearContactPersons=t.saveContactPersons=t.fetchContactPersons=void 0;const s=a(3695);function n(){return s.sqliteModels.ContactPerson.destroy({where:{}})}t.fetchContactPersons=function(e=null){return l(this,void 0,void 0,(function*(){return null==e?yield s.sqliteModels.ContactPerson.findAll():yield s.sqliteModels.ContactPerson.findAll({where:{isPrimaryContact:e}})}))},t.saveContactPersons=function(e){return l(this,void 0,void 0,(function*(){return yield n(),s.sqliteModels.ContactPerson.bulkCreate(e)}))},t.clearContactPersons=n},621:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DailySummary=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.INTEGER,autoIncrement:!0,primaryKey:!0},category:{type:l.DataTypes.STRING,allowNull:!1},numberOfSamplesReceived:{type:l.DataTypes.INTEGER,allowNull:!0},numberOfSamplesDone:{type:l.DataTypes.INTEGER,allowNull:!0},numberOfBacklogSamples:{type:l.DataTypes.INTEGER,allowNull:!0},numberOfRejectedSamples:{type:l.DataTypes.INTEGER,allowNull:!0},numberOfTestsReferred:{type:l.DataTypes.INTEGER,allowNull:!0},numberOfReferredTestResultsReturned:{type:l.DataTypes.INTEGER,allowNull:!0},reportDate:{type:l.DataTypes.DATE,allowNull:!1},createdAt:{type:l.DataTypes.DATE,allowNull:!1},isDraft:{type:l.DataTypes.BOOLEAN,allowNull:!1,defaultValue:!0},sampleRejections:{type:l.DataTypes.JSONB,allowNull:!1,defaultValue:[]},referrals:{type:l.DataTypes.JSONB,allowNull:!1,defaultValue:{id:0,specimenType:{sputum:{total:0,returned:0},stool:{total:0,returned:0},bodyFluid:{total:0,returned:0},tissue:{total:0,returned:0},isolate:{total:0,returned:0},other:{total:0,returned:0}},testType:{geneXpert:{total:0,returned:0},flDST:{total:0,returned:0},slDST:{total:0,returned:0},genomeSequencing:{total:0,returned:0},tbCulture:{total:0,returned:0}}}}},{sequelize:e,timestamps:!1,modelName:"DailySummary",tableName:"DailySummary"})}static associate(e){}}t.DailySummary=s},9931:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.EqaSummary=void 0;const l=a(496),s={type:l.DataTypes.JSON,allowNull:!0,defaultValue:null};class n extends l.Model{static initialize(e){const t={id:{type:l.DataTypes.INTEGER,autoIncrement:!0,primaryKey:!0},round:{type:l.DataTypes.INTEGER,allowNull:!1},reportYear:{type:l.DataTypes.INTEGER,allowNull:!1},createdAt:{type:l.DataTypes.DATE,allowNull:!1}};return["xpertMTBUltraData","truenatMTB","xpertMTBXdrData","afbData","lflamData","cultureData","pdstData","xpertHIV1QualAssay","xpertHIV1ViralLoad"].forEach((e=>{t[e]=Object.assign({},s)})),n.init(t,{sequelize:e,timestamps:!1,modelName:"EqaSummary",tableName:"EqaSummary"})}static associate(e){}}t.EqaSummary=n},7214:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Facility=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.STRING,primaryKey:!0},name:{type:l.DataTypes.STRING,allowNull:!1}},{sequelize:e,timestamps:!1,modelName:"Facility",tableName:"Facility"})}static associate(e){}}t.Facility=s},2933:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Instrument=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({serial:{type:l.DataTypes.STRING,primaryKey:!0},active:{type:l.DataTypes.BOOLEAN}},{sequelize:e,modelName:"Instrument",tableName:"Instrument",timestamps:!1})}static associate(e){}}t.Instrument=s},253:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.InventoryAdjustment=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.STRING,primaryKey:!0,autoIncrement:!0},type:{type:l.DataTypes.STRING},itemId:{type:l.DataTypes.STRING,references:{key:"id",model:"InventoryItem"}},batchId:{type:l.DataTypes.STRING},previousBatchAdjustmentId:{type:l.DataTypes.STRING},previousItemAdjustmentId:{type:l.DataTypes.STRING},quantity:{type:l.DataTypes.INTEGER},batchNumber:{type:l.DataTypes.STRING},expiry:{type:l.DataTypes.DATE},disposeReason:{type:l.DataTypes.STRING},narrative:{type:l.DataTypes.STRING},batchBalance:{type:l.DataTypes.INTEGER},itemBalance:{type:l.DataTypes.INTEGER},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"InventoryAdjustment",tableName:"InventoryAdjustment"})}static associate(e){e.InventoryAdjustment.belongsTo(e.InventoryItem,{as:"item",foreignKey:"batchId",targetKey:"id"})}}t.InventoryAdjustment=s},2228:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.listBatchAdjustments=t.listBatches=void 0;const l=a(496),s=a(3695);t.listBatches=function(e){return s.sequelize.query("\nselect * from (  \n  select \n    Batch.id,\n    Batch.batchNumber,\n    Batch.expiry,\n    Batch.quantity,\n    Adjustment.batchBalance as balance,\n    Batch.createdAt,\n    Adjustment.createdAt as adjustedAt\n  from \n    InventoryAdjustment as Batch\n    left join InventoryAdjustment as Adjustment\n      on Batch.id = Adjustment.batchId OR Batch.id = Adjustment.id\n  where \n  Batch.itemId = :itemId AND Batch.type = 'in'\n  order by Adjustment.createdAt DESC\n) as Batches\ngroup by Batches.id\n",{replacements:{itemId:e}}).then((([e])=>e))},t.listBatchAdjustments=function(e){return s.sqliteModels.InventoryAdjustment.findAll({where:{[l.Op.or]:[{batchId:e},{id:e}]},order:[["createdAt","DESC"]]})}},1892:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.InventoryEntry=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.INTEGER,primaryKey:!0,autoIncrement:!0},type:{type:l.DataTypes.STRING},itemId:{type:l.DataTypes.INTEGER,references:{key:"id",model:"InventoryItem"}},quantity:{type:l.DataTypes.INTEGER},batchNumber:{type:l.DataTypes.STRING},expiry:{type:l.DataTypes.DATE},disposeReason:{type:l.DataTypes.STRING},narrative:{type:l.DataTypes.STRING},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"InventoryEntry",tableName:"InventoryEntry"})}static associate(e){e.InventoryEntry.hasOne(e.SyncItem,{as:"syncItem",foreignKey:"primaryId",scope:{list:"stock"}}),e.InventoryEntry.belongsTo(e.InventoryItem,{as:"item",foreignKey:"itemId"})}}t.InventoryEntry=s},584:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.InventoryItem=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.STRING,primaryKey:!0},name:{type:l.DataTypes.STRING},image:{type:l.DataTypes.STRING},unit:{type:l.DataTypes.STRING},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"InventoryItem",tableName:"InventoryItem"})}static associate(e){e.InventoryItem.hasMany(e.InventoryAdjustment,{as:"lastAdjustment",foreignKey:"itemId",sourceKey:"id"})}}t.InventoryItem=s},6881:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.checkAndNotifyForStockUpdate=t.listItemsWithNegativeBatches=t.listItems=void 0;const l=a(3695),s=a(2228);function n(){return l.sqliteModels.InventoryItem.findAll().then((e=>Promise.all(e.map((e=>(0,s.listBatches)(e.id).then((t=>[e,t.filter((e=>e.balance<0))]))))))).then((e=>e.filter((([,e])=>e.length>0))))}t.listItems=function(){return l.sequelize.query("\n  select * from\n  (\n    select \n      Item.id,\n      Item.name,\n      Item.image,\n      Item.unit,\n      Adjustment.itemBalance as balance,\n      Adjustment.createdAt as lastAdjustedAt,\n      OfflineEntries.offlineEntries\n    from \n      InventoryItem as Item \n\n      left join InventoryAdjustment as Adjustment \n        on Item.id = Adjustment.itemId\n\n      left join \n        (\n          select \n            itemId,\n            sum(quantity) as offlineEntries \n          from InventoryEntry\n          right join SyncItem\n            on \n              InventoryEntry.id = SyncItem.primaryId \n              AND SyncItem.list = 'stock' \n              AND SyncItem.uploadedAt is NULL\n          group by itemId\n        ) as OfflineEntries\n        on Item.id = OfflineEntries.itemId\n\n    order by Adjustment.createdAt DESC\n  ) as ItemBalances\n  group by id\n").then((([e])=>e))},t.listItemsWithNegativeBatches=n,t.checkAndNotifyForStockUpdate=function(){return n().then((e=>{e.length}))}},4880:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.KeyValue=void 0;const l=a(496),s=a(3695);class n extends l.Model{}t.KeyValue=n,n.init({key:{type:l.DataTypes.STRING,primaryKey:!0},value:{type:l.DataTypes.JSON,get(){const e=this.getDataValue("value");return JSON.parse(e)},set(e){this.setDataValue("value",JSON.stringify(e))}}},{sequelize:s.sequelize,timestamps:!1,modelName:"KeyValue",tableName:"KeyValue"})},9968:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,o)}r((l=l.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.read=t.update=t.get=void 0;const s=a(9634),n=a(4880);t.get=function(e){return n.KeyValue.findByPk(e).then((e=>e?e.value:null))},t.update=function(e,t){return n.KeyValue.findOne({where:{key:e}}).then((a=>a?a.update({value:t}):n.KeyValue.create({key:e,value:t},{})))},t.read=function(){return l(this,void 0,void 0,(function*(){return n.KeyValue.findAll().then((e=>e.map((({key:e,value:t})=>({[e]:t}))))).then(s.mergeAll)}))}},2358:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Log=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.INTEGER,primaryKey:!0,autoIncrement:!0},value:{type:l.DataTypes.JSON,get(){const e=this.getDataValue("value");return JSON.parse(e)},set(e){this.setDataValue("value",JSON.stringify(e))}}},{sequelize:e,modelName:"Log",tableName:"Log"})}static associate(e){}}t.Log=s},7840:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MonthlySummary=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.INTEGER,autoIncrement:!0,primaryKey:!0},category:{type:l.DataTypes.STRING,allowNull:!1},reportMonth:{type:l.DataTypes.STRING,allowNull:!0},reportYear:{type:l.DataTypes.INTEGER,allowNull:!0},createdAt:{type:l.DataTypes.DATE,allowNull:!1},isDraft:{type:l.DataTypes.BOOLEAN,allowNull:!1,defaultValue:!0},afbData:{type:l.DataTypes.JSON,allowNull:!1,defaultValue:{}},lflamData:{type:l.DataTypes.JSON,allowNull:!1,defaultValue:{}},cultureData:{type:l.DataTypes.JSON,allowNull:!1,defaultValue:{}},dstData:{type:l.DataTypes.JSON,allowNull:!1,defaultValue:{}},eidData:{type:l.DataTypes.JSON,allowNull:!1,defaultValue:{}},vlData:{type:l.DataTypes.JSON,allowNull:!1,defaultValue:{}}},{sequelize:e,timestamps:!1,modelName:"MonthlySummary",tableName:"MonthlySummary"})}static associate(e){}}t.MonthlySummary=s},8358:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Request=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.INTEGER,autoIncrement:!0,primaryKey:!0},testType:{type:l.DataTypes.STRING},sampleId:{type:l.DataTypes.STRING,allowNull:!1},mrn:{type:l.DataTypes.STRING},diagnosisType:{type:l.DataTypes.STRING},name:{type:l.DataTypes.STRING},age:{type:l.DataTypes.NUMBER},gender:{type:l.DataTypes.STRING},reasonForDiagnosis:{type:l.DataTypes.STRING},infectionSite:{type:l.DataTypes.STRING},previouslyTreated:{type:l.DataTypes.STRING},hivStatus:{type:l.DataTypes.STRING},isRepeatedRifResitanceTest:{type:l.DataTypes.STRING},sampleCollectedAt:{type:l.DataTypes.DATE},sampleCollectionSiteType:{type:l.DataTypes.STRING},sampleCollectionSiteId:{type:l.DataTypes.STRING},sampleType:{type:l.DataTypes.STRING},patientContacts:{type:l.DataTypes.STRING},clinicianContacts:{type:l.DataTypes.STRING},referringLabContacts:{type:l.DataTypes.STRING},patientRegistrationGroup:{type:l.DataTypes.STRING},isRepeatedConfirmatoryRifTest:{type:l.DataTypes.STRING},panelProvider:{type:l.DataTypes.STRING},panelScheme:{type:l.DataTypes.STRING},panelYear:{type:l.DataTypes.STRING},panelRound:{type:l.DataTypes.STRING},panelPtId:{type:l.DataTypes.STRING},verificationType:{type:l.DataTypes.STRING},laboratoryName:{type:l.DataTypes.STRING},address:{type:l.DataTypes.STRING},verificationDate:{type:l.DataTypes.DATE},testScheme:{type:l.DataTypes.STRING},instrumentSn:{type:l.DataTypes.STRING},moduleName:{type:l.DataTypes.STRING},moduleSn:{type:l.DataTypes.STRING},sampleLotNo:{type:l.DataTypes.STRING},eid:{type:l.DataTypes.JSON},viralLoad:{type:l.DataTypes.JSON},researchName:{type:l.DataTypes.STRING},isAutoApproved:{type:l.DataTypes.BOOLEAN,allowNull:!0},approvedById:{type:l.DataTypes.STRING,allowNull:!0,defaultValue:null},approvedByName:{type:l.DataTypes.STRING,allowNull:!0,defaultValue:null},approvedDate:{type:l.DataTypes.DATE,allowNull:!0,defaultValue:null},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"Request",tableName:"Request",timestamps:!0})}static associate(e){}}t.Request=s},3695:function(e,t,a){var l=this&&this.__createBinding||(Object.create?function(e,t,a,l){void 0===l&&(l=a);var s=Object.getOwnPropertyDescriptor(t,a);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,l,s)}:function(e,t,a,l){void 0===l&&(l=a),e[l]=t[a]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&l(t,e,a);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.sqliteModels=t.sequelize=void 0;const i=a(496),o=n(a(661)),r=a(4639),p=a(253),y=a(1892),u=a(584),d=a(2358),_=a(8358),m=a(7003),c=a(7214),T=a(2933),N=a(7761),g=a(7427),f=a(883),D=a(621),E=a(7840),b=a(7755),w=a(9931),[,,I]=process.argv;t.sequelize=new i.Sequelize({dialectModule:o,dialect:"sqlite",storage:I,logging:!1}),t.sqliteModels=function(e){const t=[r.CalibrationSummary,c.Facility,f.GeneXpertStatus,T.Instrument,p.InventoryAdjustment,y.InventoryEntry,u.InventoryItem,d.Log,_.Request,N.ServiceRequest,m.SyncItem,g.User,D.DailySummary,E.MonthlySummary,w.EqaSummary,b.ContactPerson].map((({initialize:t})=>t(e))).reduce(((e,t)=>Object.assign(Object.assign({},e),{[t.name]:t})),{});return Object.keys(t).forEach((e=>{var a,l;null===(l=null===(a=t[e])||void 0===a?void 0:a.associate)||void 0===l||l.call(a,t)})),t}(t.sequelize)},7761:function(e,t,a){var l=this&&this.__createBinding||(Object.create?function(e,t,a,l){void 0===l&&(l=a);var s=Object.getOwnPropertyDescriptor(t,a);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,l,s)}:function(e,t,a,l){void 0===l&&(l=a),e[l]=t[a]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&l(t,e,a);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.ServiceRequest=void 0;const i=a(496),o=n(a(5622));class r extends i.Model{static initialize(e){return r.init({id:{type:i.DataTypes.STRING,defaultValue:o.v4,primaryKey:!0},remoteId:{type:i.DataTypes.STRING},maintenanceNumber:{type:i.DataTypes.INTEGER},status:{type:i.DataTypes.STRING,defaultValue:"initiated"},issueType:{type:i.DataTypes.STRING},computerSerialNumber:{type:i.DataTypes.STRING},machineSerialNumber:{type:i.DataTypes.STRING,allowNull:!0},serialNumber:{type:i.DataTypes.STRING},failedModuleSerialNumber:{type:i.DataTypes.STRING},description:{type:i.DataTypes.STRING},photo:{type:i.DataTypes.JSON},installationQualificationReport:{type:i.DataTypes.STRING},systemLogReport:{type:i.DataTypes.STRING},resultArchiveReport:{type:i.DataTypes.STRING},createdAt:{type:i.DataTypes.DATE},updatedAt:{type:i.DataTypes.DATE}},{sequelize:e,modelName:"ServiceRequest",tableName:"ServiceRequest",timestamps:!0})}static associate(e){}}t.ServiceRequest=r},883:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GeneXpertStatus=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.STRING,primaryKey:!0},state:{type:l.DataTypes.JSON},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"GeneXpertStatus",tableName:"GeneXpertStatus",timestamps:!0})}static associate(e){}}t.GeneXpertStatus=s},7427:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.User=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.STRING,primaryKey:!0},name:{type:l.DataTypes.STRING}},{sequelize:e,modelName:"User",tableName:"User"})}static associate(e){}}t.User=s},7003:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SyncItem=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({list:{type:l.DataTypes.STRING,allowNull:!1,primaryKey:!0},direction:{type:l.DataTypes.STRING,allowNull:!1,primaryKey:!0,defaultValue:"up"},primaryId:{type:l.DataTypes.STRING,allowNull:!1,primaryKey:!0},secondaryId:{type:l.DataTypes.STRING,allowNull:!0},version:{type:l.DataTypes.STRING,allowNull:!0},modifiedAt:{type:l.DataTypes.DATE,allowNull:!0},uploadedAt:{type:l.DataTypes.DATE,allowNull:!0},createdAt:{type:l.DataTypes.DATE,allowNull:!1},updatedAt:{type:l.DataTypes.DATE,allowNull:!1}},{sequelize:e,modelName:"SyncItem",tableName:"SyncItem",timestamps:!0})}static associate(e){}}t.SyncItem=s},3827:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.createSyncWorker=void 0;const s=l(a(1055)),n=a(7219);t.createSyncWorker=function(){const e=new s.default({maxConcurrent:1,minTime:2e3});let t=[];const a=()=>Promise.resolve(),l=()=>{(t.length?t:[a]).forEach((t=>e.schedule(t)))};return l(),e.on("idle",l),e.on("error",(e=>n.logger.error(e.message,e.stack))),{add(e){t.push(e)},addFromGetters(e){return e.reduce(((e,t)=>e.then((()=>t())).then((e=>e.forEach((e=>this.add(e)))))),Promise.resolve())}}}},2166:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.findTestsForDataEntry=t.checkAndNotifyForDataEntry=void 0;const s=l(a(2245)),n=a(9634),i=a(496),o=a(3695),r=a(7219);function p(e,t){return o.sqliteModels.Request.findAll({where:{createdAt:{[i.Op.gt]:(0,s.default)().subtract(24,"hours").toDate()}}}).then((a=>(r.logger.info(`Found ${a.length} requests for data entry query.`),e.testsForEntry((0,n.pluck)("sampleId",a),t)))).catch((e=>{throw r.logger.error("Error in findTestsForDataEntry db or query errors:",e),e}))}t.checkAndNotifyForDataEntry=function(e){return p(e).then((e=>{var t;0!==e.length?(r.logger.info(`Found ${e.length} tests for data entry. Triggering popup.`),null===(t=process.send)||void 0===t||t.call(process,{type:"trigger-data-entry"})):r.logger.info("No tests found for data entry.")})).catch((e=>{r.logger.error("Error in checkAndNotifyForDataEntry:",e)}))},t.findTestsForDataEntry=p},8626:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.loadContactPersons=t.isAssigned=t.isOnline=t.storedInterval=t.interval=t.intervalWhenFull=t.throttled=void 0;const s=l(a(2245)),n=a(9634),i=a(7632),o=a(3153),r=a(9968),p=a(5132);t.throttled=function(e,...t){return()=>Promise.all(t.map((e=>e()))).then((t=>{if(t.every(Boolean))return e()}))},t.intervalWhenFull=function(e,t=15){let a;return()=>(0,r.read)().then((l=>!(l[`${e}_saved`]===l[`${e}_total`]&&!(0,n.isNil)(a)&&!(0,s.default)(a).isBefore()||(a=(0,s.default)().add(t,"minutes").toDate(),0))))},t.interval=function(e=15){let t;return()=>!(!(0,n.isNil)(t)&&!(0,s.default)(t).isBefore()||(t=(0,s.default)().add(e,"minutes").toDate(),0))},t.storedInterval=function(e){return()=>(0,r.get)(e).then((e=>(0,n.isNil)(e)||(0,s.default)(e).isBefore()))},t.isOnline=function(){return(0,r.get)("server").then(Boolean)},t.isAssigned=function(){return(0,r.get)("lab").then((e=>!!e||i.backendClient.get("/labs/current").then((e=>e.data)).then((e=>(0,o.saveLab)(e))).then((()=>!1)).catch((e=>!1))))},t.loadContactPersons=function(){return console.log("Loading contact persons from server..."),i.backendClient.get("/contact-persons").then((e=>e.data)).then((e=>(0,p.saveContactPersons)(e))).then((()=>!1)).catch((e=>!1))}},2167:e=>{e.exports=require("axios")},1055:e=>{e.exports=require("bottleneck")},5142:e=>{e.exports=require("dotenv")},8857:e=>{e.exports=require("electron-log")},4804:e=>{e.exports=require("hostname-patcher")},2245:e=>{e.exports=require("moment")},9424:e=>{e.exports=require("mssql")},4768:e=>{e.exports=require("mssql/msnodesqlv8")},7104:e=>{e.exports=require("qs")},9634:e=>{e.exports=require("ramda")},496:e=>{e.exports=require("sequelize")},661:e=>{e.exports=require("sqlite3")},5622:e=>{e.exports=require("uuid")},8670:e=>{e.exports=require("timers/promises")},881:e=>{e.exports=JSON.parse('{"name":"medx-relay","description":"MedX Relay","version":"2.0.3","npmRebuild":false,"private":true,"main":"./build-electron/main.js","homepage":".","author":{"name":"MedX International","email":"info@medx.international","url":"https://medx.international"},"scripts":{"postinstall":"electron-builder install-app-deps","react:start":"cross-env BROWSER=none PORT=3001 react-scripts start","react:build":"react-scripts build","react:test":"react-scripts test","react:eject":"react-scripts eject","compile":"tsc --project tsconfig.json","compile:watch":"npm run compile -- --watch","predev":"npm run runtime-env","dev":"npm run compile && npm run dev:watch","dev:watch":"concurrently --kill-others-on-fail \\"npm run react:start\\" \\"npm run compile:watch\\" \\"npm run electron:watch\\"","electron:watch":"nodemon -d 5 -w dist/src/electron -w dist/src -i dist/src/ui  -x \\"npm run electron:start\\"","electron:start":"wait-on tcp:3001 && cross-env IS_DEV=true electron ./dist/src/main.js","electron:build":"cross-env NODE_ENV=production webpack --config webpack-back.config.js","prepack":"npm run clean && npm run runtime-env && npm run compile && npm run electron:build && npm run react:build","clean":"node ./fs.js rm build build-electron connect dist out","runtime-env":"node ./runtime-env.js","pack:win":"electron-builder -c builder.js --dir -w --ia32","dist:win":"electron-builder -c builder.js -w --ia32","pack:linux":"electron-builder -c builder.js --dir -l","dist:linux":"electron-builder -c builder.js -l","migration":"node migration.js","migrate:up":"npx ts-node src/store/migrate.ts"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"devDependencies":{"@emotion/react":"^11.10.0","@emotion/styled":"^11.10.0","@mui/icons-material":"^5.8.4","@mui/material":"^5.9.2","@tanstack/react-query":"^4.0.10","@testing-library/jest-dom":"^5.16.4","@testing-library/react":"^13.3.0","@testing-library/user-event":"^13.5.0","@types/bluebird":"^3.5.36","@types/glob":"^8.1.0","@types/jest":"^27.5.2","@types/mssql":"^8.0.3","@types/node":"^18.6.3","@types/ramda":"^0.28.15","@types/react":"^18.0.15","@types/react-dom":"^18.0.6","@types/sqlite3":"^3.1.8","@types/uuid":"^9.0.1","concurrently":"^7.3.0","cross-env":"^7.0.3","dotenv-webpack":"^8.0.1","electron":"^19.0.10","electron-builder":"^23.3.3","electron-icon-maker":"^0.0.5","electron-is-dev":"^2.0.0","json-to-ts":"^1.7.0","node-loader":"^2.0.0","nodemon":"^2.0.19","react":"^18.2.0","react-dom":"^18.2.0","react-router-dom":"^6.3.0","react-scripts":"5.0.1","sequelize-auto":"^0.8.8","sequelize-typescript-generator":"^8.4.1","string-replace-loader":"^3.1.0","typescript":"^4.7.4","wait-on":"^6.0.1","web-vitals":"^2.1.4","webpack-cli":"^4.10.0","webpack-node-externals":"^3.0.0"},"dependencies":{"@elife/pm2":"github:ernest-okot/pm2","axios":"^0.27.2","bluebird":"^3.7.2","bottleneck":"^2.19.5","dotenv":"^16.0.3","electron-log":"^4.4.8","electron-updater":"^5.2.1","express":"^4.18.1","glob":"^8.0.3","hostname-patcher":"^1.1.0","moment":"^2.29.4","msnodesqlv8":"^2.6.0","mssql":"^9.0.0","qs":"^6.11.0","ramda":"^0.28.0","react-hook-form":"^7.38.0","sequelize":"^6.21.3","sqlite3":"^5.1.1","umzug":"^3.2.1","uuid":"^9.0.0"}}')}},t={};!function a(l){var s=t[l];if(void 0!==s)return s.exports;var n=t[l]={exports:{}};return e[l].call(n.exports,n,n.exports,a),n.exports}(9718)})();(()=>{"use strict";var e={7632:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.backendClient=void 0;const s=l(a(2167)),n=a(231),i=a(9968);t.backendClient=s.default.create({baseURL:`${n.backendUrl}/relay`,timeout:3e5}),t.backendClient.interceptors.request.use((e=>(0,i.get)("registration_token").then((t=>Object.assign(Object.assign({},e),{headers:Object.assign(Object.assign({},e.headers),{"Relay-Token":t})}))))),t.backendClient.interceptors.response.use((e=>e),(e=>{var t;return 401===(null===(t=e.response)||void 0===t?void 0:t.status)?(0,i.update)("registration_token",null).then((()=>Promise.reject(e))):Promise.reject(e)}))},231:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.requirePatientDetails=t.brand=t.serverPort=t.backendUrl=void 0,a(5142).config(),process.env,t.backendUrl="https://api.labxpert.ephi.gov.et",t.serverPort="4411",t.brand=JSON.parse('{"publisher":"MedX International Ltd","name":"LabXpert Relay","colors":{"primary":"#d05286","secondary":"#572345"},"logo":"","links":{"helpcenter":"https://labxpertsurveillance.tawk.help/","support":"https://tawk.to/chat/62de9ce937898912e95f8b2a/1g8qp9std?pop=1","website":"https://medx.international"}}'),t.requirePatientDetails=Boolean(JSON.parse("1"))},2473:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RegistrationError=void 0;class a extends Error{constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype)}}t.RegistrationError=a},8969:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.registerDevice=void 0;const s=l(a(2167)),n=a(231),i=a(1415),o=a(9968),r=a(2473);t.registerDevice=function(){return(0,i.createGeneXpertClient)().then((e=>(0,o.read)().then((t=>e.systemInfo().then((e=>{var a;return s.default.post(`${n.backendUrl}/relay/machines/register/`,Object.assign(Object.assign({},e),{labId:null===(a=null==t?void 0:t.lab)||void 0===a?void 0:a.id})).catch((e=>(console.error(e),Promise.reject(new r.RegistrationError(e.message))))).then((e=>e.data)).then((e=>"string"!=typeof e?Promise.reject(new r.RegistrationError("Invalid registration token")):(0,o.update)("registration_token",e)))}))))))}},7306:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.toSystemInfo=t.createSequelize=t.assaysForDataEntry=t.LAB_RESULT_APPROVAL_DEADLINE_HOURS=t.hoursForDataEntry=void 0;const s=a(9634),n=a(496),i=l(a(2245)),o=a(881);t.hoursForDataEntry=8,t.LAB_RESULT_APPROVAL_DEADLINE_HOURS=1,t.assaysForDataEntry=["Xpert MTB-RIF Assay G4","Xpert MTB-RIF Ultra","Xpert MTB-XDR","Xpert_HIV-1 Viral Load","Xpert_HIV-1 Qual","Xpert HIV-1 Qual XC DBS"],t.createSequelize=function(e,t,a){const l="win32"===process.platform&&"true"!==process.env.IS_DEV?{dialectModulePath:"msnodesqlv8/lib/sequelize",dialectOptions:{options:{connectionString:`server=(local);Database=${e};Trusted_Connection=Yes;Driver={SQL Server Native Client 11.0}`,trustedConnection:!0,requestTimeout:3e5}}}:{database:e,username:t,password:a,dialectOptions:{options:{useUTC:!1,dateFirst:1}}},s=Object.assign(Object.assign({},l),{dialect:"mssql",logging:!1,pool:{min:0,max:5,idle:1e4}});return new n.Sequelize(s)},t.toSystemInfo=function(e,t){const a=e.sort(((e,t)=>new Date(t.log_time).getTime()-new Date(e.log_time).getTime())).map(((e,t,a)=>({serial:e.site_serial_number.toString(),instrument:e.instrument_serial_number.toString(),replaced:a.indexOf(e)!==t,lastLoggedAt:new Date(e.log_time),disabled:!(0,s.isNil)(e.disabled_at),position:e.site_name.trim()}))),[l]=(0,s.pluck)("sw_version",e),n=function(e){const[t]=(0,s.groupWith)(((e,t)=>Math.abs((0,i.default)(t.lastLoggedAt).diff(e.lastLoggedAt,"day"))<7),function(e){return(0,s.groupWith)(((e,t)=>e.instrument===t.instrument),e.filter((e=>e.serial.length>3&&e.instrument.length>3&&!e.replaced))).map((e=>e.sort(((e,t)=>new Date(t.lastLoggedAt).getTime()-new Date(e.lastLoggedAt).getTime())))).map((([e])=>e))}(e)).map((e=>(0,s.uniq)(e.map((e=>e.instrument)))));return t}(a),r=function(e){const[t]=(0,s.groupWith)(((e,t)=>Math.abs((0,i.default)(t.lastLoggedAt).diff(e.lastLoggedAt,"day"))<7),function(e){return(0,s.groupWith)(((e,t)=>e.position[0]===t.position[0]),e.filter((e=>e.serial.length>3&&e.instrument.length>3&&!e.replaced))).map((e=>e.sort(((e,t)=>new Date(t.lastLoggedAt).getTime()-new Date(e.lastLoggedAt).getTime())))).map((([e])=>e))}(e)).map((e=>(0,s.uniq)(e.map((e=>e.position[0])))));return(0,s.uniq)(e.filter((e=>t.includes(e.position[0]))).map((e=>e.position)))}(a);return{version:l,relayVersion:o.version,config:t,sites:r,modules:a,instruments:n}}},1415:function(e,t,a){var l=this&&this.__createBinding||(Object.create?function(e,t,a,l){void 0===l&&(l=a);var s=Object.getOwnPropertyDescriptor(t,a);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,l,s)}:function(e,t,a,l){void 0===l&&(l=a),e[l]=t[a]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&l(t,e,a);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.createGeneXpertClient=void 0;const i={user:"sa",password:"F00tball"};function o(e){return"win32"===process.platform&&"true"!==process.env.IS_DEV?Promise.resolve().then((()=>n(a(4768)))).then((t=>t.connect({server:"(local)",database:e,options:{trustedConnection:!0}}))):Promise.resolve().then((()=>n(a(9424)))).then((t=>t.connect(Object.assign(Object.assign({},i),{database:e,requestTimeout:3e3,connectionTimeout:3e3,server:"127.0.0.1",pool:{max:10,min:0,idleTimeoutMillis:3e4},options:{encrypt:!1,trustServerCertificate:!0}}))))}t.createGeneXpertClient=function(){return o("master").then((e=>function(e){return e.query("SELECT name FROM master.sys.databases").then((e=>e.recordset.map((e=>e.name)).sort().find((e=>e.match(/gx_\w+/)))||Promise.reject(new Error("No genexpert database found"))))}(e).then((t=>e.close().then((()=>o(t))).then((e=>function(e){return e.query("SELECT sw_version FROM system_log ORDER BY log_time DESC OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY").then((e=>e.recordset)).then((([e])=>e?e.sw_version:Promise.reject(new Error("Unknown version"))))}(e))).then((e=>[e,t])))))).then((([e,t])=>function(e,t,l,s){const[i,o]=e.split(".");return"6"===i&&parseInt(o,10)>=5?Promise.resolve().then((()=>n(a(1058)))).then((({GeneXpertClient:a})=>new a(e,t,l,s))):"6"===i?Promise.resolve().then((()=>n(a(2522)))).then((({GeneXpertClient:a})=>new a(e,t,l,s))):"5"===i?Promise.resolve().then((()=>n(a(8207)))).then((({GeneXpertClient:a})=>new a(e,t,l,s))):"4"===i?Promise.resolve().then((()=>n(a(7556)))).then((({GeneXpertClient:a})=>new a(e,t,l,s))):Promise.reject(new Error(`GeneXpert Version ${e} is not currently supported`))}(e,t,i.user,i.password)))}},7556:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,o)}r((l=l.apply(e,t||[])).next())}))},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.GeneXpertClient=void 0;const n=s(a(2245)),i=a(9634),o=a(496),r=a(7306),p=a(1558),u="YYYY/MM/DD HH:mm:ss.SSS";t.GeneXpertClient=class{constructor(e,t,a,l){this.version=e,this.sequelize=(0,r.createSequelize)(t,a,l),this.models=(0,p.initModels)(this.sequelize)}systemInfo(){const e=this.sequelize.query("\n        SELECT TOP 1 WITH TIES\n          [sw_version],\n          [instrument_serial_number],\n          [dbo].[system_log].[site_serial_number],\n          [site_name],\n          [log_time],\n          [dbo].[disabled_module].[creation] AS [disabled_at]\n        FROM [dbo].[system_log]\n          LEFT JOIN [dbo].[disabled_module]\n          ON [dbo].[disabled_module].[site_serial_number] = [dbo].[system_log].[site_serial_number]\n        ORDER BY row_number() \n        OVER (PARTITION BY [dbo].[system_log].[site_serial_number] ORDER BY [log_time] DESC)\n      ").then((([e])=>e)),t=this.models.Config.findAll().then((e=>e.map((e=>({[e.param_key]:e.param_val}))))).then(i.mergeAll);return Promise.all([e,t]).then((e=>(0,r.toSystemInfo)(...e)))}logsTotal(){return this.models.SystemLog.count()}testsTotal(){return this.models.Test.count()}testsPresyncables(e,t,a){return this.models.Test.findAll({where:{[o.Op.or]:[{modified:{[o.Op.gt]:(0,n.default)(e).format(u)}},{modified:{[o.Op.eq]:(0,n.default)(e).format(u)},test_ID:{[o.Op.notIn]:t}}]},attributes:["test_ID","modified"],limit:a,order:[["modified","ASC"]]}).then((e=>e.map((({test_ID:e,modified:t})=>({id:e.toString(),modified:(0,n.default)(t,u).toDate()})))))}testsSyncables(e){return this.models.Test.findAll({where:{test_ID:e},include:[{as:"operator",model:this.models.User},{as:"test_errors",model:this.models.TestPcError},{as:"test_run",model:this.models.TestRun,attributes:{exclude:["data","cartridge_barcode"]}},{as:"patient_test_order",model:this.models.PatientTestOrder,include:[{as:"patient",model:this.models.Patient}]},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]}},{as:"analyte_results",model:this.models.AnalyteResult,include:[{as:"analyte",model:this.models.Analyte}]},{as:"organism_results",model:this.models.OrganismResult,include:[{as:"organism",model:this.models.Organism}]}]}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.test_ID.toString()}))))}testsForEntry(e,t){return this.models.Test.findAll({where:{start_time:{[o.Op.gt]:(0,n.default)().subtract(t||r.hoursForDataEntry,"hours").format(u)},sample_ID:{[o.Op.notIn]:e}},include:[{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t;return{id:e.test_ID,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(e.end_time,u).toDate(),sampleId:e.sample_ID,startedAt:(0,n.default)(e.start_time,u).toDate()}}))))}logsPresyncables(e,t,a){return this.models.SystemLog.findAll({where:{[o.Op.or]:[{log_time:{[o.Op.gt]:(0,n.default)(e).format(u)}},{log_time:{[o.Op.eq]:(0,n.default)(e).format(u)},system_log_ID:{[o.Op.notIn]:t}}]},limit:a,attributes:["system_log_ID","log_time"],order:[["log_time","ASC"]]}).then((e=>e.map((({system_log_ID:e,log_time:t})=>({id:e.toString(),modified:(0,n.default)(t,u).toDate()})))))}logsSyncables(e){return this.models.SystemLog.findAll({where:{system_log_ID:{[o.Op.in]:e}}}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.system_log_ID.toString()}))))}close(){return this.sequelize.close()}getTest(e){return l(this,void 0,void 0,(function*(){return this.models.Test.findOne({where:{sample_ID:{[o.Op.eq]:e}}})}))}getTestsByTestIds(e){return this.models.Test.findAll({where:{test_ID:{[o.Op.in]:e}},include:[{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t;return{id:e.test_ID,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(e.end_time,u).toDate(),sampleId:e.sample_ID,startedAt:(0,n.default)(e.start_time,u).toDate()}}))))}getCompletedTestsBySampleIds(e){return this.models.Test.findAll({where:{sample_ID:{[o.Op.in]:e},end_time:{[o.Op.and]:[{[o.Op.not]:null},{[o.Op.between]:[(0,n.default)().subtract(r.LAB_RESULT_APPROVAL_DEADLINE_HOURS,"hours").format(u),(0,n.default)().format(u)]}]},result_text:{[o.Op.not]:null}},include:[{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t;return{id:e.test_ID,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(e.end_time,u).toDate(),sampleId:e.sample_ID,startedAt:(0,n.default)(e.start_time,u).toDate()}}))))}}},892:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Advancestagesetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Advancestagesetting",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1},stage_number:{type:l.DataTypes.SMALLINT,allowNull:!0},protocol_number:{type:l.DataTypes.SMALLINT,allowNull:!0},new_stage_number:{type:l.DataTypes.SMALLINT,allowNull:!0},stop_after_new_stage:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},stop_if_no_ct:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},advance_stage_settings_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"advancestagesettings",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_advancestagesettings",unique:!0,fields:[{name:"advance_stage_settings_id"}]}]})}}t.Advancestagesetting=s},4878:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AnalyteResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AnalyteResultText",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},target_result_key:{type:l.DataTypes.STRING(8),allowNull:!0},result_text_reference:{type:l.DataTypes.SMALLINT,allowNull:!1}},{tableName:"analyte_result_text ",schema:"dbo",timestamps:!1})}}t.AnalyteResultText=s},804:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AnalyteResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AnalyteResult",{test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},expected_result:{type:l.DataTypes.SMALLINT,allowNull:!0},endpoint:{type:l.DataTypes.FLOAT,allowNull:!1},threshold:{type:l.DataTypes.FLOAT,allowNull:!1},cycle_threshold:{type:l.DataTypes.FLOAT,allowNull:!1},probe_check_result:{type:l.DataTypes.SMALLINT,allowNull:!0},probe_check_reading1:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_reading2:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_reading3:{type:l.DataTypes.FLOAT,allowNull:!0},error_status:{type:l.DataTypes.SMALLINT,allowNull:!0},target_result:{type:l.DataTypes.SMALLINT,allowNull:!0},ic_result:{type:l.DataTypes.SMALLINT,allowNull:!0},ec_result:{type:l.DataTypes.SMALLINT,allowNull:!0},spc_result:{type:l.DataTypes.SMALLINT,allowNull:!0},interpretation:{type:l.DataTypes.SMALLINT,allowNull:!0},second_deriv_peak_height:{type:l.DataTypes.FLOAT,allowNull:!0},nc_ic_endpoint:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:0},curve_fit_result:{type:l.DataTypes.SMALLINT,allowNull:!0},delta_ct:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-9999},TTP:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:0},quantitative_result:{type:l.DataTypes.FLOAT,allowNull:!0},iqs_lq_result:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:1},iqs_hq_result:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:1},analyte_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},reason:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"analyte_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK_analyte_result",unique:!0,fields:[{name:"analyte_result_id"}]},{name:"test_ID",fields:[{name:"test_ID"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.AnalyteResult=s},5745:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Analyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Analyte",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_index:{type:l.DataTypes.INTEGER,allowNull:!1},usage:{type:l.DataTypes.SMALLINT,allowNull:!0},target:{type:l.DataTypes.BLOB,allowNull:!0},analyte_name:{type:l.DataTypes.STRING(20),allowNull:!0},intended_concentration:{type:l.DataTypes.FLOAT,allowNull:!0},analyte_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},use_curve_fit:{type:l.DataTypes.BOOLEAN,allowNull:!0},enable_signal_loss_detection:{type:l.DataTypes.BOOLEAN,allowNull:!0},reporter_name:{type:l.DataTypes.STRING(12),allowNull:!1},boxcar_cycles:{type:l.DataTypes.SMALLINT,allowNull:!0},curve_analysis:{type:l.DataTypes.SMALLINT,allowNull:!0},background_start:{type:l.DataTypes.SMALLINT,allowNull:!0},background_end:{type:l.DataTypes.SMALLINT,allowNull:!0},cycle_if_no_ct:{type:l.DataTypes.SMALLINT,allowNull:!0},min_ct_req_pass_controls:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_on_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},curve_fit_start_background:{type:l.DataTypes.BOOLEAN,allowNull:!0},curve_fit_start_index:{type:l.DataTypes.SMALLINT,allowNull:!0},curve_fit_end_data:{type:l.DataTypes.BOOLEAN,allowNull:!0},curve_fit_end_index:{type:l.DataTypes.SMALLINT,allowNull:!0},curve_fit_min_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_nrse:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_slope_vs_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},background_min_points:{type:l.DataTypes.SMALLINT,allowNull:!0},background_look_back:{type:l.DataTypes.SMALLINT,allowNull:!0},background_validate:{type:l.DataTypes.BOOLEAN,allowNull:!0},background_max_slope:{type:l.DataTypes.FLOAT,allowNull:!0},background_max_rms_error:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_use_delta_pc:{type:l.DataTypes.BOOLEAN,allowNull:!0},probe_check_min_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_max_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},invalid_bias:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"analyte",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_analyte",unique:!0,fields:[{name:"analyte_id"}]},{name:"pos",fields:[{name:"analyte_index"}]}]})}}t.Analyte=s},4044:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayCartridge=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayCartridge",{assay_cartridge_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!0},need_lot_parameters:{type:l.DataTypes.BOOLEAN,allowNull:!1},need_ext_control:{type:l.DataTypes.BOOLEAN,allowNull:!1},ext_control_frq:{type:l.DataTypes.SMALLINT,allowNull:!0},cartridge_type_ID:{type:l.DataTypes.INTEGER,allowNull:!0},command_seq:{type:l.DataTypes.BLOB,allowNull:!0},melt_all_peaks:{type:l.DataTypes.BOOLEAN,allowNull:!1},use_background_subtraction:{type:l.DataTypes.BOOLEAN,allowNull:!1},air_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},overflow_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},comments:{type:l.DataTypes.STRING(256),allowNull:!0},command_seq_format:{type:l.DataTypes.SMALLINT,allowNull:!0},picture:{type:l.DataTypes.BLOB,allowNull:!0},read_interval:{type:l.DataTypes.INTEGER,allowNull:!0},prep_cartridge_shelf_life:{type:l.DataTypes.INTEGER,allowNull:!1},retain_cartridge:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"assay_cartridge",schema:"dbo",timestamps:!1,indexes:[{name:"PK_assay_cartridge",unique:!0,fields:[{name:"assay_cartridge_id"}]}]})}}t.AssayCartridge=s},8667:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayChamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayChamber",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!0},name:{type:l.DataTypes.STRING(16),allowNull:!0},initial_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},assay_chamber_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"assay_chamber",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"PK_assay_chamber",unique:!0,fields:[{name:"assay_chamber_id"}]}]})}}t.AssayChamber=s},4942:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Assay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Assay",{assay_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},pos:{type:l.DataTypes.INTEGER,allowNull:!0},name:{type:l.DataTypes.STRING(32),allowNull:!0},version:{type:l.DataTypes.SMALLINT,allowNull:!0},user_ID:{type:l.DataTypes.INTEGER,allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_verified:{type:l.DataTypes.BOOLEAN,allowNull:!0},comments:{type:l.DataTypes.STRING(256),allowNull:!0},lock_comments:{type:l.DataTypes.STRING(256),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},product_code:{type:l.DataTypes.SMALLINT,allowNull:!0},assay_type:{type:l.DataTypes.SMALLINT,allowNull:!0},disclaimer:{type:l.DataTypes.STRING(512),allowNull:!0},company_code:{type:l.DataTypes.SMALLINT,allowNull:!0},result_text_type:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:0},class:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:0},analysis_type:{type:l.DataTypes.SMALLINT,allowNull:!0},sample_prep_instruction:{type:l.DataTypes.STRING(256),allowNull:!0},sample_prep_video:{type:l.DataTypes.BLOB,allowNull:!0},test_code:{type:l.DataTypes.STRING(15),allowNull:!0},enable_test_code:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},enable_auto_archive:{type:l.DataTypes.BOOLEAN,allowNull:!1},default_result_text_reference:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:5},default_text_color_reference:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:3},clia_waived:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"assay",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_assay_ID",unique:!0,fields:[{name:"assay_ID"}]},{name:"pos",fields:[{name:"pos"}]}]})}}t.Assay=s},1163:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CalibrationChamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CalibrationChamber",{calibration_seq_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1,primaryKey:!0},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!0},name:{type:l.DataTypes.STRING(16),allowNull:!0},initial_volume:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"calibration_chamber",schema:"dbo",timestamps:!1,indexes:[{name:"calibration_seq_id",fields:[{name:"calibration_seq_id"}]},{name:"cartridge_ID",fields:[{name:"cartridge_id"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"PK_calibration_chamber",unique:!0,fields:[{name:"calibration_seq_id"},{name:"cartridge_id"},{name:"chamber_number"}]}]})}}t.CalibrationChamber=s},2632:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CalibrationSequence=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CalibrationSequence",{calibration_seq_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},pos:{type:l.DataTypes.INTEGER,allowNull:!0},name:{type:l.DataTypes.STRING(32),allowNull:!0},cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!0},command_seq:{type:l.DataTypes.BLOB,allowNull:!0},command_seq_format:{type:l.DataTypes.SMALLINT,allowNull:!0},air_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},comments:{type:l.DataTypes.STRING(256),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"calibration_sequence",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_calibration_sequence",unique:!0,fields:[{name:"calibration_seq_id"}]},{name:"pos",fields:[{name:"pos"}]}]})}}t.CalibrationSequence=s},4859:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CartridgeOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CartridgeOrder",{cartridge_order_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},sample_id:{type:l.DataTypes.STRING(25),allowNull:!0},scanned_SID:{type:l.DataTypes.BOOLEAN,allowNull:!0},scanned_PID:{type:l.DataTypes.BOOLEAN,allowNull:!0},priority:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0},rgt_lot_id:{type:l.DataTypes.STRING(6),allowNull:!1},cartridge_serial_number:{type:l.DataTypes.BIGINT,allowNull:!0},cartridge_expiration_date:{type:l.DataTypes.DATE,allowNull:!0},cartridge_barcode:{type:l.DataTypes.STRING(1024),allowNull:!0},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},other_sample_type_text:{type:l.DataTypes.STRING(32),allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_status:{type:l.DataTypes.STRING(32),allowNull:!0},order_sw_version:{type:l.DataTypes.STRING(16),allowNull:!1},cartridge_order_time:{type:l.DataTypes.STRING(24),allowNull:!0},cartridge_order_expiration:{type:l.DataTypes.STRING(24),allowNull:!0},location:{type:l.DataTypes.STRING(32),allowNull:!0},location_site:{type:l.DataTypes.INTEGER,allowNull:!0},lis_order_id:{type:l.DataTypes.INTEGER,allowNull:!1},test_type:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"cartridge_order",schema:"dbo",timestamps:!1,indexes:[{name:"PK_cartridge_order",unique:!0,fields:[{name:"cartridge_order_id"}]}]})}}t.CartridgeOrder=s},1544:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Cartridge=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Cartridge",{cartridge_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},name:{type:l.DataTypes.STRING(32),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},max_pressure:{type:l.DataTypes.SMALLINT,allowNull:!0},syringe_min_transfer_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},syringe_max_transfer_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},syringe_max_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_syringe_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_chamber_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},direct_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},filter_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},direct_flow_rate_min:{type:l.DataTypes.SMALLINT,allowNull:!0},direct_flow_rate_max:{type:l.DataTypes.SMALLINT,allowNull:!0},microliters_per_revolution:{type:l.DataTypes.FLOAT,allowNull:!0},initial_aspirate_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},initial_aspirate_flow_rate:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_pressurized_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},air_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},overflow_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},min_pressure:{type:l.DataTypes.SMALLINT,allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1,defaultValue:""},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},filter_flow_rate_min:{type:l.DataTypes.SMALLINT,allowNull:!0},filter_flow_rate_max:{type:l.DataTypes.SMALLINT,allowNull:!0},cartridge_foot_height:{type:l.DataTypes.INTEGER,allowNull:!0},adc_2_psi:{type:l.DataTypes.FLOAT,allowNull:!0},plunger_strip_position:{type:l.DataTypes.INTEGER,allowNull:!0},plunger_pickup_position:{type:l.DataTypes.INTEGER,allowNull:!0},picture:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"cartridge",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"name",fields:[{name:"name"}]},{name:"PK_cartridge_ID",unique:!0,fields:[{name:"cartridge_ID"}]},{name:"version",fields:[{name:"version"}]}]})}}t.Cartridge=s},3918:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Chamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Chamber",{cartridge_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1,primaryKey:!0},min_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},max_volume:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"chamber",schema:"dbo",timestamps:!1,indexes:[{name:"cartridge_ID",fields:[{name:"cartridge_ID"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"PK_chamber",unique:!0,fields:[{name:"cartridge_ID"},{name:"chamber_number"}]}]})}}t.Chamber=s},6038:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorDisclaimer=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ColorDisclaimer",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},color:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},disclaimer:{type:l.DataTypes.STRING(256),allowNull:!0}},{tableName:"color_disclaimer",schema:"dbo",timestamps:!1,indexes:[{name:"PK_color_disclaimer",unique:!0,fields:[{name:"assay_ID"},{name:"color"}]}]})}}t.ColorDisclaimer=s},87:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Config",{param_key:{type:l.DataTypes.STRING(64),primaryKey:!0,allowNull:!1},param_val:{type:l.DataTypes.STRING(512),allowNull:!1,defaultValue:""}},{tableName:"config",schema:"dbo",timestamps:!1})}}t.Config=s},2075:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CrosstalkFactor=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CrosstalkFactor",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},protocol_number:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:-1},factor:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:0},crosstalk_factor_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},from_analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},to_analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"crosstalk_factor",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_crosstalk_factor",unique:!0,fields:[{name:"crosstalk_factor_id"}]}]})}}t.CrosstalkFactor=s},1726:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DisabledModule=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("DisabledModule",{site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!0},creation:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"disabled_module",schema:"dbo",timestamps:!1,indexes:[{name:"PK_disabled_module",unique:!0,fields:[{name:"site_serial_number"}]}]})}}t.DisabledModule=s},7772:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Dtproperty=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Dtproperty",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},objectid:{type:l.DataTypes.INTEGER,allowNull:!0},property:{type:l.DataTypes.STRING(64),allowNull:!1,primaryKey:!0},value:{type:l.DataTypes.STRING(255),allowNull:!0},uvalue:{type:l.DataTypes.STRING(255),allowNull:!0},lvalue:{type:l.DataTypes.BLOB,allowNull:!0},version:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:0}},{tableName:"dtproperties",schema:"dbo",timestamps:!1,indexes:[{name:"pk_dtproperties",unique:!0,fields:[{name:"id"},{name:"property"}]}]})}}t.Dtproperty=s},2e3:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.FailedLocation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("FailedLocation",{location:{type:l.DataTypes.STRING(32),allowNull:!1,primaryKey:!0},location_site:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"failed_location",schema:"dbo",timestamps:!1,indexes:[{name:"PK_failed_location",unique:!0,fields:[{name:"location"},{name:"location_site"}]}]})}}t.FailedLocation=s},5033:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetting",{graph_setting_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},graph_type:{type:l.DataTypes.SMALLINT,allowNull:!1},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"assay_ID"}},param_key:{type:l.DataTypes.STRING(64),allowNull:!1},param_val:{type:l.DataTypes.STRING(512),allowNull:!1,defaultValue:""}},{tableName:"graph_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__graph_setting__408F9238",unique:!0,fields:[{name:"graph_setting_id"}]}]})}}t.GraphSetting=s},140:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetup",{graph_setup_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},pos:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!0},is_default:{type:l.DataTypes.BOOLEAN,allowNull:!1},user_ID:{type:l.DataTypes.INTEGER,allowNull:!0},settings:{type:l.DataTypes.INTEGER,allowNull:!0},format:{type:l.DataTypes.SMALLINT,allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_graph_setup",unique:!0,fields:[{name:"graph_setup_ID"}]},{name:"pos",fields:[{name:"pos"}]}]})}}t.GraphSetup=s},6281:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.HaplotypeResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("HaplotypeResultText",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(11),allowNull:!1,primaryKey:!0},alleles_text_1:{type:l.DataTypes.STRING(10),allowNull:!0},alleles_text_2:{type:l.DataTypes.STRING(10),allowNull:!0},text_color_reference:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"haplotype_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK_haplotype_result_text",unique:!0,fields:[{name:"assay_id"},{name:"haplotype_id"},{name:"result_key"}]}]})}}t.HaplotypeResultText=s},5038:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Haplotype=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Haplotype",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},name:{type:l.DataTypes.STRING(20),allowNull:!0},lis_test_code:{type:l.DataTypes.STRING(15),allowNull:!0}},{tableName:"haplotype",schema:"dbo",timestamps:!1,indexes:[{name:"PK_haplotype",unique:!0,fields:[{name:"assay_id"},{name:"haplotype_id"}]}]})}}t.Haplotype=s},7912:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.InfinitySystemLog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("InfinitySystemLog",{infinity_system_log_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1},code:{type:l.DataTypes.INTEGER,allowNull:!1},subsystem:{type:l.DataTypes.INTEGER,allowNull:!1},details:{type:l.DataTypes.STRING(512),allowNull:!0},log_time:{type:l.DataTypes.STRING(24),allowNull:!1},sw_version:{type:l.DataTypes.STRING(16),allowNull:!1},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"infinity_system_log",schema:"dbo",timestamps:!1,indexes:[{name:"PK_infinity_system_log",unique:!0,fields:[{name:"infinity_system_log_id"}]}]})}}t.InfinitySystemLog=s},1558:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestGraphSetup=t.TestBlogCounter=t.TestBlog=t.Test=t.SystemLog=t.Snp=t.SampleType=t.SampleSetting=t.RetainCartridgeColor=t.ReagentLot=t.QuantUnitSetting=t.QuantResult=t.Privilege=t.PatientTestOrder=t.Patient=t.Path=t.OrganismTarget=t.OrganismResultText=t.OrganismResultRule=t.OrganismResultEvaluator=t.OrganismResult=t.Organism=t.MeltPeakSetting=t.MeltPeakResult=t.LisTestOrder=t.Instrument=t.InfinitySystemLog=t.HaplotypeResultText=t.Haplotype=t.GraphSetup=t.GraphSetting=t.FailedLocation=t.Dtproperty=t.DisabledModule=t.CrosstalkFactor=t.Config=t.ColorDisclaimer=t.Chamber=t.CartridgeOrder=t.Cartridge=t.CalibrationSequence=t.CalibrationChamber=t.AssayChamber=t.AssayCartridge=t.Assay=t.AnalyteResultText=t.AnalyteResult=t.Analyte=t.Advancestagesetting=t.IntegrityCheck=void 0,t.initModels=t.User=t.TestRun=t.TestPcError=t.TestHistory=void 0;const l=a(8792);Object.defineProperty(t,"IntegrityCheck",{enumerable:!0,get:function(){return l.IntegrityCheck}});const s=a(892);Object.defineProperty(t,"Advancestagesetting",{enumerable:!0,get:function(){return s.Advancestagesetting}});const n=a(5745);Object.defineProperty(t,"Analyte",{enumerable:!0,get:function(){return n.Analyte}});const i=a(804);Object.defineProperty(t,"AnalyteResult",{enumerable:!0,get:function(){return i.AnalyteResult}});const o=a(4878);Object.defineProperty(t,"AnalyteResultText",{enumerable:!0,get:function(){return o.AnalyteResultText}});const r=a(4942);Object.defineProperty(t,"Assay",{enumerable:!0,get:function(){return r.Assay}});const p=a(4044);Object.defineProperty(t,"AssayCartridge",{enumerable:!0,get:function(){return p.AssayCartridge}});const u=a(8667);Object.defineProperty(t,"AssayChamber",{enumerable:!0,get:function(){return u.AssayChamber}});const d=a(1163);Object.defineProperty(t,"CalibrationChamber",{enumerable:!0,get:function(){return d.CalibrationChamber}});const y=a(2632);Object.defineProperty(t,"CalibrationSequence",{enumerable:!0,get:function(){return y.CalibrationSequence}});const _=a(1544);Object.defineProperty(t,"Cartridge",{enumerable:!0,get:function(){return _.Cartridge}});const m=a(4859);Object.defineProperty(t,"CartridgeOrder",{enumerable:!0,get:function(){return m.CartridgeOrder}});const c=a(3918);Object.defineProperty(t,"Chamber",{enumerable:!0,get:function(){return c.Chamber}});const T=a(6038);Object.defineProperty(t,"ColorDisclaimer",{enumerable:!0,get:function(){return T.ColorDisclaimer}});const N=a(87);Object.defineProperty(t,"Config",{enumerable:!0,get:function(){return N.Config}});const g=a(2075);Object.defineProperty(t,"CrosstalkFactor",{enumerable:!0,get:function(){return g.CrosstalkFactor}});const f=a(1726);Object.defineProperty(t,"DisabledModule",{enumerable:!0,get:function(){return f.DisabledModule}});const D=a(7772);Object.defineProperty(t,"Dtproperty",{enumerable:!0,get:function(){return D.Dtproperty}});const E=a(2e3);Object.defineProperty(t,"FailedLocation",{enumerable:!0,get:function(){return E.FailedLocation}});const b=a(5033);Object.defineProperty(t,"GraphSetting",{enumerable:!0,get:function(){return b.GraphSetting}});const w=a(140);Object.defineProperty(t,"GraphSetup",{enumerable:!0,get:function(){return w.GraphSetup}});const I=a(5038);Object.defineProperty(t,"Haplotype",{enumerable:!0,get:function(){return I.Haplotype}});const R=a(6281);Object.defineProperty(t,"HaplotypeResultText",{enumerable:!0,get:function(){return R.HaplotypeResultText}});const O=a(7912);Object.defineProperty(t,"InfinitySystemLog",{enumerable:!0,get:function(){return O.InfinitySystemLog}});const h=a(3662);Object.defineProperty(t,"Instrument",{enumerable:!0,get:function(){return h.Instrument}});const M=a(9806);Object.defineProperty(t,"LisTestOrder",{enumerable:!0,get:function(){return M.LisTestOrder}});const G=a(965);Object.defineProperty(t,"MeltPeakResult",{enumerable:!0,get:function(){return G.MeltPeakResult}});const v=a(2792);Object.defineProperty(t,"MeltPeakSetting",{enumerable:!0,get:function(){return v.MeltPeakSetting}});const S=a(4397);Object.defineProperty(t,"Organism",{enumerable:!0,get:function(){return S.Organism}});const A=a(199);Object.defineProperty(t,"OrganismResult",{enumerable:!0,get:function(){return A.OrganismResult}});const P=a(9671);Object.defineProperty(t,"OrganismResultEvaluator",{enumerable:!0,get:function(){return P.OrganismResultEvaluator}});const L=a(4953);Object.defineProperty(t,"OrganismResultRule",{enumerable:!0,get:function(){return L.OrganismResultRule}});const C=a(6563);Object.defineProperty(t,"OrganismResultText",{enumerable:!0,get:function(){return C.OrganismResultText}});const K=a(2932);Object.defineProperty(t,"OrganismTarget",{enumerable:!0,get:function(){return K.OrganismTarget}});const x=a(9094);Object.defineProperty(t,"Path",{enumerable:!0,get:function(){return x.Path}});const j=a(5549);Object.defineProperty(t,"Patient",{enumerable:!0,get:function(){return j.Patient}});const q=a(1106);Object.defineProperty(t,"PatientTestOrder",{enumerable:!0,get:function(){return q.PatientTestOrder}});const k=a(3656);Object.defineProperty(t,"Privilege",{enumerable:!0,get:function(){return k.Privilege}});const F=a(9056);Object.defineProperty(t,"QuantResult",{enumerable:!0,get:function(){return F.QuantResult}});const B=a(3366);Object.defineProperty(t,"QuantUnitSetting",{enumerable:!0,get:function(){return B.QuantUnitSetting}});const Q=a(8963);Object.defineProperty(t,"ReagentLot",{enumerable:!0,get:function(){return Q.ReagentLot}});const U=a(1186);Object.defineProperty(t,"RetainCartridgeColor",{enumerable:!0,get:function(){return U.RetainCartridgeColor}});const H=a(217);Object.defineProperty(t,"SampleSetting",{enumerable:!0,get:function(){return H.SampleSetting}});const X=a(1863);Object.defineProperty(t,"SampleType",{enumerable:!0,get:function(){return X.SampleType}});const V=a(8094);Object.defineProperty(t,"Snp",{enumerable:!0,get:function(){return V.Snp}});const z=a(7634);Object.defineProperty(t,"SystemLog",{enumerable:!0,get:function(){return z.SystemLog}});const J=a(4678);Object.defineProperty(t,"Test",{enumerable:!0,get:function(){return J.Test}});const $=a(6450);Object.defineProperty(t,"TestBlog",{enumerable:!0,get:function(){return $.TestBlog}});const Y=a(4258);Object.defineProperty(t,"TestBlogCounter",{enumerable:!0,get:function(){return Y.TestBlogCounter}});const W=a(9432);Object.defineProperty(t,"TestGraphSetup",{enumerable:!0,get:function(){return W.TestGraphSetup}});const Z=a(1360);Object.defineProperty(t,"TestHistory",{enumerable:!0,get:function(){return Z.TestHistory}});const ee=a(2848);Object.defineProperty(t,"TestPcError",{enumerable:!0,get:function(){return ee.TestPcError}});const te=a(972);Object.defineProperty(t,"TestRun",{enumerable:!0,get:function(){return te.TestRun}});const ae=a(3509);Object.defineProperty(t,"User",{enumerable:!0,get:function(){return ae.User}}),t.initModels=function(e){const t=l.IntegrityCheck.initModel(e),a=s.Advancestagesetting.initModel(e),le=n.Analyte.initModel(e),se=i.AnalyteResult.initModel(e),ne=o.AnalyteResultText.initModel(e),ie=r.Assay.initModel(e),oe=p.AssayCartridge.initModel(e),re=u.AssayChamber.initModel(e),pe=d.CalibrationChamber.initModel(e),ue=y.CalibrationSequence.initModel(e),de=_.Cartridge.initModel(e),ye=m.CartridgeOrder.initModel(e),_e=c.Chamber.initModel(e),me=T.ColorDisclaimer.initModel(e),ce=N.Config.initModel(e),Te=g.CrosstalkFactor.initModel(e),Ne=f.DisabledModule.initModel(e),ge=D.Dtproperty.initModel(e),fe=E.FailedLocation.initModel(e),De=b.GraphSetting.initModel(e),Ee=w.GraphSetup.initModel(e),be=I.Haplotype.initModel(e),we=R.HaplotypeResultText.initModel(e),Ie=O.InfinitySystemLog.initModel(e),Re=h.Instrument.initModel(e),Oe=M.LisTestOrder.initModel(e),he=G.MeltPeakResult.initModel(e),Me=v.MeltPeakSetting.initModel(e),Ge=S.Organism.initModel(e),ve=A.OrganismResult.initModel(e),Se=P.OrganismResultEvaluator.initModel(e),Ae=L.OrganismResultRule.initModel(e),Pe=C.OrganismResultText.initModel(e),Le=K.OrganismTarget.initModel(e),Ce=x.Path.initModel(e),Ke=j.Patient.initModel(e),xe=q.PatientTestOrder.initModel(e),je=k.Privilege.initModel(e),qe=F.QuantResult.initModel(e),ke=B.QuantUnitSetting.initModel(e),Fe=Q.ReagentLot.initModel(e),Be=U.RetainCartridgeColor.initModel(e),Qe=H.SampleSetting.initModel(e),Ue=X.SampleType.initModel(e),He=V.Snp.initModel(e),Xe=z.SystemLog.initModel(e),Ve=J.Test.initModel(e),ze=$.TestBlog.initModel(e),Je=Y.TestBlogCounter.initModel(e),$e=W.TestGraphSetup.initModel(e),Ye=Z.TestHistory.initModel(e),We=ee.TestPcError.initModel(e),Ze=te.TestRun.initModel(e),et=ae.User.initModel(e);return De.belongsTo(ie,{as:"assay",foreignKey:"assay_id"}),ie.hasMany(De,{as:"graph_settings",foreignKey:"assay_id"}),ke.belongsTo(ie,{as:"assay",foreignKey:"assay_id"}),ie.hasMany(ke,{as:"quant_unit_settings",foreignKey:"assay_id"}),Le.belongsTo(ke,{as:"selected_quant_unit",foreignKey:"selected_quant_unit_id"}),ke.hasMany(Le,{as:"organism_targets",foreignKey:"selected_quant_unit_id"}),qe.belongsTo(ke,{as:"quant_unit_setting",foreignKey:"quant_unit_setting_id"}),ke.hasMany(qe,{as:"quant_results",foreignKey:"quant_unit_setting_id"}),qe.belongsTo(Ve,{as:"test",foreignKey:"test_id"}),Ve.hasMany(qe,{as:"quant_results",foreignKey:"test_id"}),Ve.hasMany(ve,{as:"organism_results",foreignKey:"test_ID",sourceKey:"test_ID"}),Ve.belongsTo(ie,{as:"assay",foreignKey:"assay_ID",targetKey:"assay_ID"}),Ve.hasMany(se,{as:"analyte_results",foreignKey:"test_ID"}),Ve.belongsTo(et,{as:"operator",foreignKey:"operator_ids"}),Ve.hasOne(Ze,{as:"test_run",foreignKey:"test_ID"}),Ve.hasOne(xe,{as:"patient_test_order",foreignKey:"test_id"}),Ve.hasMany(We,{as:"test_errors",foreignKey:"test_id"}),xe.belongsTo(Ke,{as:"patient",foreignKey:"patient_id"}),se.belongsTo(le,{as:"analyte",foreignKey:"analyte_id"}),ve.belongsTo(Ge,{as:"organism",foreignKey:"organism_id",targetKey:"organism_id"}),Je.belongsTo(ze,{as:"test_blog",foreignKey:"test_blog_ID"}),ze.hasMany(Je,{as:"test_blog_counters",foreignKey:"test_blog_ID"}),{IntegrityCheck:t,Advancestagesetting:a,Analyte:le,AnalyteResult:se,AnalyteResultText:ne,Assay:ie,AssayCartridge:oe,AssayChamber:re,CalibrationChamber:pe,CalibrationSequence:ue,Cartridge:de,CartridgeOrder:ye,Chamber:_e,ColorDisclaimer:me,Config:ce,CrosstalkFactor:Te,DisabledModule:Ne,Dtproperty:ge,FailedLocation:fe,GraphSetting:De,GraphSetup:Ee,Haplotype:be,HaplotypeResultText:we,InfinitySystemLog:Ie,Instrument:Re,LisTestOrder:Oe,MeltPeakResult:he,MeltPeakSetting:Me,Organism:Ge,OrganismResult:ve,OrganismResultEvaluator:Se,OrganismResultRule:Ae,OrganismResultText:Pe,OrganismTarget:Le,Path:Ce,Patient:Ke,PatientTestOrder:xe,Privilege:je,QuantResult:qe,QuantUnitSetting:ke,ReagentLot:Fe,RetainCartridgeColor:Be,SampleSetting:Qe,SampleType:Ue,Snp:He,SystemLog:Xe,Test:Ve,TestBlog:ze,TestBlogCounter:Je,TestGraphSetup:$e,TestHistory:Ye,TestPcError:We,TestRun:Ze,User:et}}},3662:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Instrument=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Instrument",{Instrument_id:{type:l.DataTypes.INTEGER,allowNull:!0},mac_address:{type:l.DataTypes.BLOB,allowNull:!0},serial_number:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"instrument",schema:"dbo",timestamps:!1,indexes:[{name:"mac_address",fields:[{name:"mac_address"}]}]})}}t.Instrument=s},8792:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.IntegrityCheck=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("IntegrityCheck",{table_name:{type:l.DataTypes.STRING(32),allowNull:!0},field_name:{type:l.DataTypes.STRING(24),allowNull:!0},id_number:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"Integrity_Check",schema:"dbo",timestamps:!1})}}t.IntegrityCheck=s},9806:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisTestOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisTestOrder",{instrument_specimen_ID:{type:l.DataTypes.STRING(64),allowNull:!1,defaultValue:""},sample_ID:{type:l.DataTypes.STRING(25),allowNull:!0},test_code:{type:l.DataTypes.STRING(15),allowNull:!0,defaultValue:""},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:-1},order_time:{type:l.DataTypes.STRING(24),allowNull:!0},order_status:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:1},priority:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:1},LIS_test_order_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"lis_test_order",schema:"dbo",timestamps:!1,indexes:[{name:"IX_lis_test_order",fields:[{name:"instrument_specimen_ID"}]},{name:"PK_lis_test_order",unique:!0,fields:[{name:"LIS_test_order_ID"}]}]})}}t.LisTestOrder=s},965:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakResult",{melt_peak_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_result_id:{type:l.DataTypes.INTEGER,allowNull:!1},peak_index:{type:l.DataTypes.INTEGER,allowNull:!1},peak_height:{type:l.DataTypes.FLOAT,allowNull:!1},peak_temperature:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"melt_peak_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK_melt_peak_result",unique:!0,fields:[{name:"melt_peak_result_id"}]}]})}}t.MeltPeakResult=s},2792:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakSetting",{melt_peak_settings_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},slope_positive:{type:l.DataTypes.BOOLEAN,allowNull:!1},baseline_start_temp:{type:l.DataTypes.FLOAT,allowNull:!1},baseline_look_back:{type:l.DataTypes.FLOAT,allowNull:!1},baseline_num_points:{type:l.DataTypes.INTEGER,allowNull:!1},points_around_peak:{type:l.DataTypes.INTEGER,allowNull:!1},peak_threshold:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_min:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_max:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"melt_peak_settings",schema:"dbo",timestamps:!1,indexes:[{name:"PK_melt_peak_settings",unique:!0,fields:[{name:"melt_peak_settings_id"}]}]})}}t.MeltPeakSetting=s},9671:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultEvaluator=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultEvaluator",{organism_result_evaluator_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0},parent_evaluator_id:{type:l.DataTypes.INTEGER,allowNull:!0},evaluator_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"organism_result_evaluator",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result_evaluator",unique:!0,fields:[{name:"organism_result_evaluator_id"}]}]})}}t.OrganismResultEvaluator=s},4953:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultRule=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultRule",{organism_result_rule_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},evaluator_id:{type:l.DataTypes.INTEGER,allowNull:!0},parent_rule_id:{type:l.DataTypes.INTEGER,allowNull:!0},rule_type:{type:l.DataTypes.INTEGER,allowNull:!1},rule_anded:{type:l.DataTypes.BOOLEAN,allowNull:!0},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0},pass_on_equals:{type:l.DataTypes.BOOLEAN,allowNull:!0},interpretation:{type:l.DataTypes.INTEGER,allowNull:!0},reasons:{type:l.DataTypes.STRING(50),allowNull:!0},pass_on_peak:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"organism_result_rule",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result_rule",unique:!0,fields:[{name:"organism_result_rule_id"}]}]})}}t.OrganismResultRule=s},6563:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultText",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(8),allowNull:!1},result_text_reference:{type:l.DataTypes.SMALLINT,allowNull:!0},text_color_reference:{type:l.DataTypes.SMALLINT,allowNull:!0},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},organism_result_text_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"organism_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result_text",unique:!0,fields:[{name:"organism_result_text_id"}]}]})}}t.OrganismResultText=s},199:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResult",{organism_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},result_type:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0},haplotype_index:{type:l.DataTypes.INTEGER,allowNull:!0},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_color:{type:l.DataTypes.INTEGER,allowNull:!0},result_invalid:{type:l.DataTypes.BOOLEAN,allowNull:!0},allele2_text:{type:l.DataTypes.TEXT,allowNull:!0},lda_total:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result",unique:!0,fields:[{name:"organism_result_id"}]}]})}}t.OrganismResult=s},2932:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismTarget=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismTarget",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1},selected_quant_unit_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"quant_unit_setting",key:"quant_unit_setting_id"}},organism_target_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},lda_ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!0},lda_delta_ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"organism_target",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_target",unique:!0,fields:[{name:"organism_target_id"}]}]})}}t.OrganismTarget=s},4397:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Organism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Organism",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(20),allowNull:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1},early_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},late_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},medium_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},low_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},very_low_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},semi_quant_text_ref:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:-1},replacement_text_ref:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:-1},replacement_color_ref:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:-1},delta_ct_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},organism_lis_test_code:{type:l.DataTypes.STRING(15),allowNull:!0},organism_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},lda_intercept:{type:l.DataTypes.FLOAT,allowNull:!0},lda_min_valid:{type:l.DataTypes.FLOAT,allowNull:!0},lda_cutoff:{type:l.DataTypes.FLOAT,allowNull:!0},lda_max_valid:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism",unique:!0,fields:[{name:"organism_id"}]}]})}}t.Organism=s},9094:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Path=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Path",{path_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},cartridge_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1},tube:{type:l.DataTypes.BOOLEAN,allowNull:!0},block:{type:l.DataTypes.BOOLEAN,allowNull:!0},type:{type:l.DataTypes.SMALLINT,allowNull:!0},angular_offset:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"path",schema:"dbo",timestamps:!1,indexes:[{name:"cartridge_ID",fields:[{name:"cartridge_ID"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"path_id",fields:[{name:"path_ID"}]},{name:"PK_path",unique:!0,fields:[{name:"path_ID"},{name:"cartridge_ID"}]},{name:"type",fields:[{name:"type"}]}]})}}t.Path=s},1106:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PatientTestOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PatientTestOrder",{patient_test_order_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},patient_id:{type:l.DataTypes.INTEGER,allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0},lis_test_order_id:{type:l.DataTypes.INTEGER,allowNull:!0},cartridge_order_id:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"patient_test_order",schema:"dbo",timestamps:!1,indexes:[{name:"PK__patient_test_ord__4924D839",unique:!0,fields:[{name:"patient_test_order_id"}]}]})}}t.PatientTestOrder=s},5549:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Patient=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Patient",{patient_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},gx_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},practice_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},family_name:{type:l.DataTypes.TEXT,allowNull:!0},given_name:{type:l.DataTypes.TEXT,allowNull:!0},middle_name:{type:l.DataTypes.TEXT,allowNull:!0},date_of_birth:{type:l.DataTypes.STRING(32),allowNull:!0},gender:{type:l.DataTypes.STRING(64),allowNull:!0},ethnicity:{type:l.DataTypes.STRING(64),allowNull:!0},postal_code:{type:l.DataTypes.TEXT,allowNull:!0}},{tableName:"patient",schema:"dbo",timestamps:!1,indexes:[{name:"PK__patient__473C8FC7",unique:!0,fields:[{name:"patient_id"}]}]})}}t.Patient=s},3656:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Privilege=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Privilege",{privilege_name:{type:l.DataTypes.STRING(64),allowNull:!1,primaryKey:!0},user_type:{type:l.DataTypes.SMALLINT,allowNull:!1,primaryKey:!0}},{tableName:"privilege",schema:"dbo",timestamps:!1,indexes:[{name:"PK_privilege",unique:!0,fields:[{name:"privilege_name"},{name:"user_type"}]}]})}}t.Privilege=s},9056:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QuantResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QuantResult",{quant_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"test_ID"}},quant_unit_setting_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"quant_unit_setting",key:"quant_unit_setting_id"}},quantitative_result:{type:l.DataTypes.FLOAT,allowNull:!0},result_text:{type:l.DataTypes.STRING(1024),allowNull:!0},result_text_color:{type:l.DataTypes.SMALLINT,allowNull:!1},qualitative_result:{type:l.DataTypes.STRING(50),allowNull:!0},result_abnormal_flag:{type:l.DataTypes.STRING(5),allowNull:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_result_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"quant_result",schema:"dbo",timestamps:!1,indexes:[{name:"analyte_result_id",fields:[{name:"analyte_result_id"}]},{name:"PK__quant_result__3AD6B8E2",unique:!0,fields:[{name:"quant_result_id"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.QuantResult=s},3366:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QuantUnitSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QuantUnitSetting",{quant_unit_setting_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"assay_ID"}},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1},position:{type:l.DataTypes.INTEGER,allowNull:!1},unit_key:{type:l.DataTypes.STRING(50),allowNull:!1},conversion_factor:{type:l.DataTypes.FLOAT,allowNull:!1},lower_limit:{type:l.DataTypes.FLOAT,allowNull:!1},upper_limit:{type:l.DataTypes.FLOAT,allowNull:!1},display_log_value:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:0},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"quant_unit_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant_unit_setti__351DDF8C",unique:!0,fields:[{name:"quant_unit_setting_id"}]}]})}}t.QuantUnitSetting=s},8963:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ReagentLot",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},rgt_lot_number:{type:l.DataTypes.STRING(3),allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!0},reagent_lot_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"guid",fields:[{name:"guid"}]},{name:"PK_reagent_lot",unique:!0,fields:[{name:"reagent_lot_id"}]},{name:"rgt_lot_number",fields:[{name:"rgt_lot_number"}]}]})}}t.ReagentLot=s},1186:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RetainCartridgeColor=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("RetainCartridgeColor",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1},color:{type:l.DataTypes.INTEGER,allowNull:!1},retain_cartridge:{type:l.DataTypes.BOOLEAN,allowNull:!0},retain_cartridge_color_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"retain_cartridge_color",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_retain_cartridge",unique:!0,fields:[{name:"retain_cartridge_color_id"}]}]})}}t.RetainCartridgeColor=s},217:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleSetting",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},sample_type:{type:l.DataTypes.SMALLINT,allowNull:!1},valid_min:{type:l.DataTypes.DECIMAL(5,1),allowNull:!0},valid_max:{type:l.DataTypes.DECIMAL(5,1),allowNull:!0},end_pt_threshold:{type:l.DataTypes.SMALLINT,allowNull:!0},probe_chk_low_max:{type:l.DataTypes.INTEGER,allowNull:!0},probe_chk_high_min:{type:l.DataTypes.INTEGER,allowNull:!0},probe_chk_delta:{type:l.DataTypes.INTEGER,allowNull:!0},is_lot_parameters:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_endpoint:{type:l.DataTypes.BOOLEAN,allowNull:!0},peak_height_min:{type:l.DataTypes.FLOAT,allowNull:!0},use_delta_ct:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},min_delta_ct:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:0},delta_ct_eff:{type:l.DataTypes.FLOAT,allowNull:!0},E0:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E1:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E2:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E3:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E4:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},sample_settings_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},reagent_lot_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_low_min:{type:l.DataTypes.INTEGER,allowNull:!0},probe_chk_high_max:{type:l.DataTypes.INTEGER,allowNull:!0},ct_threshold_value:{type:l.DataTypes.FLOAT,allowNull:!0},normalization_factor:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"sample_settings",schema:"dbo",timestamps:!1,indexes:[{name:"analyte_id",fields:[{name:"analyte_id"}]},{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"PK_sample_settings",unique:!0,fields:[{name:"sample_settings_id"}]},{name:"reagent_lot_id",fields:[{name:"reagent_lot_id"}]},{name:"sample_type",fields:[{name:"sample_type"}]}]})}}t.SampleSetting=s},1863:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleType=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleType",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},pos:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"sample_type",schema:"dbo",timestamps:!1})}}t.SampleType=s},8094:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Snp=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Snp",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!0},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!0},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0},snp_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"snp",schema:"dbo",timestamps:!1,indexes:[{name:"PK_snp",unique:!0,fields:[{name:"snp_id"}]}]})}}t.Snp=s},7634:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SystemLog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SystemLog",{error_type:{type:l.DataTypes.INTEGER,allowNull:!0},log_time:{type:l.DataTypes.STRING(24),allowNull:!0},error_code:{type:l.DataTypes.INTEGER,allowNull:!0},details:{type:l.DataTypes.STRING(512),allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},site_name:{type:l.DataTypes.CHAR(3),allowNull:!0,defaultValue:""},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},system_log_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"system_log",schema:"dbo",timestamps:!1,indexes:[{name:"IX_system_log",fields:[{name:"system_log_ID"}]},{name:"PK_system_log",unique:!0,fields:[{name:"system_log_ID"}]}]})}}t.SystemLog=s},4258:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlogCounter=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlogCounter",{test_blog_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"test_blog",key:"test_blog_ID"}},date_text:{type:l.DataTypes.STRING(8),allowNull:!1,primaryKey:!0},test_count:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_blog_counter",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_blog_counter",unique:!0,fields:[{name:"test_blog_ID"},{name:"date_text"}]}]})}}t.TestBlogCounter=s},6450:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlog",{test_blog_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_name:{type:l.DataTypes.STRING(32),allowNull:!0},assay_version:{type:l.DataTypes.SMALLINT,allowNull:!1}},{tableName:"test_blog",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_blog",unique:!0,fields:[{name:"test_blog_ID"}]}]})}}t.TestBlog=s},9432:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestGraphSetup",{test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},graph_setup_ID:{type:l.DataTypes.INTEGER,allowNull:!1},pos:{type:l.DataTypes.SMALLINT,allowNull:!0},test_graph_setup_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"graph_setup_ID",fields:[{name:"graph_setup_ID"}]},{name:"PK_test_graph_setup",unique:!0,fields:[{name:"test_graph_setup_id"}]},{name:"test_ID",fields:[{name:"test_ID"}]}]})}}t.TestGraphSetup=s},1360:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestHistory",{test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},field_name:{type:l.DataTypes.STRING(32),allowNull:!1},old_content:{type:l.DataTypes.STRING(512),allowNull:!0},new_content:{type:l.DataTypes.STRING(512),allowNull:!0},user_ID:{type:l.DataTypes.INTEGER,allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!1},test_history_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"test_history",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_history",unique:!0,fields:[{name:"test_history_id"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.TestHistory=s},2848:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestPcError=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestPcError",{test_id:{type:l.DataTypes.INTEGER,allowNull:!1},code:{type:l.DataTypes.INTEGER,allowNull:!0},type:{type:l.DataTypes.SMALLINT,allowNull:!0},details:{type:l.DataTypes.STRING(512),allowNull:!0},severity:{type:l.DataTypes.SMALLINT,allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!0},parameter_1:{type:l.DataTypes.FLOAT,allowNull:!0},parameter_2:{type:l.DataTypes.FLOAT,allowNull:!0},parameter_3:{type:l.DataTypes.FLOAT,allowNull:!0},parameter_4:{type:l.DataTypes.FLOAT,allowNull:!0},textparameter:{type:l.DataTypes.STRING(64),allowNull:!0},test_pc_error_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_pc_error",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_pc_error",unique:!0,fields:[{name:"test_pc_error_id"}]},{name:"test_id",fields:[{name:"test_id"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.TestPcError=s},972:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestRun=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestRun",{test_run_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},site_name:{type:l.DataTypes.CHAR(3),allowNull:!1},site_serial_num:{type:l.DataTypes.INTEGER,allowNull:!0},rgt_lot_ID:{type:l.DataTypes.STRING(6),allowNull:!1},cart_serial_number:{type:l.DataTypes.BIGINT,allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},state:{type:l.DataTypes.SMALLINT,allowNull:!0},error_status:{type:l.DataTypes.SMALLINT,allowNull:!0},start_time:{type:l.DataTypes.STRING(24),allowNull:!0},end_time:{type:l.DataTypes.STRING(24),allowNull:!0},user_ID:{type:l.DataTypes.INTEGER,allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0},icore_serial_num:{type:l.DataTypes.INTEGER,allowNull:!0},fw_version:{type:l.DataTypes.STRING(12),allowNull:!0},datagram_format:{type:l.DataTypes.SMALLINT,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},order_time:{type:l.DataTypes.STRING(24),allowNull:!0},expiration_date:{type:l.DataTypes.DATE,allowNull:!1},cartridge_barcode:{type:l.DataTypes.STRING(1024),allowNull:!0},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},current_test_run:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"test_run",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_run",unique:!0,fields:[{name:"test_run_id"}]}]})}}t.TestRun=s},4678:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Test=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Test",{test_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!0},sample_ID:{type:l.DataTypes.STRING(25),allowNull:!0},scanned_SID:{type:l.DataTypes.BOOLEAN,allowNull:!0},scanned_PID:{type:l.DataTypes.BOOLEAN,allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},test_type:{type:l.DataTypes.SMALLINT,allowNull:!0},expected_result:{type:l.DataTypes.SMALLINT,allowNull:!0},lis_upload_message_ID:{type:l.DataTypes.STRING(64),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},order_time:{type:l.DataTypes.STRING(24),allowNull:!0},outliner:{type:l.DataTypes.BOOLEAN,allowNull:!1},archived:{type:l.DataTypes.BOOLEAN,allowNull:!1},auto_archived:{type:l.DataTypes.BOOLEAN,allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},other_sample_type_text:{type:l.DataTypes.STRING(32),allowNull:!0},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_text_colors:{type:l.DataTypes.TEXT,allowNull:!0},express_result_text:{type:l.DataTypes.STRING(1024),allowNull:!0},order_id:{type:l.DataTypes.INTEGER,allowNull:!1},upload_status:{type:l.DataTypes.INTEGER,allowNull:!1},priority:{type:l.DataTypes.INTEGER,allowNull:!0},cartridge_order_id:{type:l.DataTypes.INTEGER,allowNull:!0},data_reduction_alg:{type:l.DataTypes.SMALLINT,allowNull:!1},state:{type:l.DataTypes.SMALLINT,allowNull:!0},error_status:{type:l.DataTypes.SMALLINT,allowNull:!0},site_name:{type:l.DataTypes.TEXT,allowNull:!0},site_serial_num:{type:l.DataTypes.TEXT,allowNull:!0},operator_ids:{type:l.DataTypes.TEXT,allowNull:!0},start_time:{type:l.DataTypes.STRING(24),allowNull:!0},end_time:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"test",schema:"dbo",timestamps:!1,indexes:[{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"guid",fields:[{name:"guid"}]},{name:"PK_test",unique:!0,fields:[{name:"test_ID"}]},{name:"start_time",fields:[{name:"start_time"}]}]})}}t.Test=s},3509:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.User=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("User",{user_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},login_name:{type:l.DataTypes.STRING(16),allowNull:!0},full_name:{type:l.DataTypes.STRING(128),allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_hidden:{type:l.DataTypes.BOOLEAN,allowNull:!1},password:{type:l.DataTypes.STRING(32),allowNull:!0},user_type:{type:l.DataTypes.SMALLINT,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"users",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_users",unique:!0,fields:[{name:"user_ID"}]}]})}}t.User=s},8207:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,o)}r((l=l.apply(e,t||[])).next())}))},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.GeneXpertClient=void 0;const n=s(a(2245)),i=a(9634),o=a(496),r=a(7306),p=a(7819),u="YYYY/MM/DD HH:mm:ss.SSS";t.GeneXpertClient=class{constructor(e,t,a,l){this.version=e,this.sequelize=(0,r.createSequelize)(t,a,l),this.models=(0,p.initModels)(this.sequelize)}systemInfo(){const e=this.sequelize.query("\n        SELECT TOP 1 WITH TIES\n          [sw_version],\n          [instrument_serial_number],\n          [dbo].[system_log].[site_serial_number],\n          [site_name],\n          [log_time],\n          [dbo].[disabled_module].[creation] AS [disabled_at]\n        FROM [dbo].[system_log]\n          LEFT JOIN [dbo].[disabled_module]\n          ON [dbo].[disabled_module].[site_serial_number] = [dbo].[system_log].[site_serial_number]\n        ORDER BY row_number() \n        OVER (PARTITION BY [dbo].[system_log].[site_serial_number] ORDER BY [log_time] DESC)\n      ").then((([e])=>e)),t=this.models.Config.findAll().then((e=>e.map((e=>({[e.param_key]:e.param_val}))))).then(i.mergeAll);return Promise.all([e,t]).then((e=>(0,r.toSystemInfo)(...e)))}logsTotal(){return this.models.SystemLog.count()}testsTotal(){return this.models.Test.count()}testsPresyncables(e,t,a){return this.models.Test.findAll({where:{[o.Op.or]:[{modified:{[o.Op.gt]:(0,n.default)(e).format(u)}},{modified:{[o.Op.eq]:(0,n.default)(e).format(u)},test_ID:{[o.Op.notIn]:t}}]},attributes:["test_ID","modified"],limit:a,order:[["modified","ASC"]]}).then((e=>e.map((({test_ID:e,modified:t})=>({id:e.toString(),modified:(0,n.default)(t,u).toDate()})))))}testsSyncables(e){return this.models.Test.findAll({where:{test_ID:{[o.Op.in]:e}},include:[{as:"operator",model:this.models.User},{as:"test_errors",model:this.models.TestPcError},{as:"test_run",model:this.models.TestRun,attributes:{exclude:["data","cartridge_barcode"]}},{as:"patient_test_order",model:this.models.PatientTestOrder,include:[{as:"patient",model:this.models.Patient}]},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]}},{as:"analyte_results",model:this.models.AnalyteResult,include:[{as:"analyte",model:this.models.Analyte}]},{as:"organism_results",model:this.models.OrganismResult,include:[{as:"organism",model:this.models.Organism}]}]}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.test_ID.toString()}))))}testsForEntry(e,t){return this.models.Test.findAll({where:{start_time:{[o.Op.gt]:(0,n.default)().subtract(t||r.hoursForDataEntry,"hours").format(u)},sample_ID:{[o.Op.notIn]:e}},include:[{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t;return{id:e.test_ID,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(e.end_time,u).toDate(),sampleId:e.sample_ID,startedAt:(0,n.default)(e.start_time,u).toDate()}}))))}logsPresyncables(e,t,a){return this.models.SystemLog.findAll({where:{[o.Op.or]:[{log_time:{[o.Op.gt]:(0,n.default)(e).format(u)}},{log_time:{[o.Op.eq]:(0,n.default)(e).format(u)},system_log_ID:{[o.Op.notIn]:t}}]},limit:a,attributes:["system_log_ID","log_time"],order:[["log_time","ASC"]]}).then((e=>e.map((({system_log_ID:e,log_time:t})=>({id:e.toString(),modified:(0,n.default)(t,u).toDate()})))))}logsSyncables(e){return this.models.SystemLog.findAll({where:{system_log_ID:{[o.Op.in]:e}}}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.system_log_ID.toString()}))))}close(){return this.sequelize.close()}getTest(e){return l(this,void 0,void 0,(function*(){return this.models.Test.findOne({where:{sample_ID:{[o.Op.eq]:e}}})}))}getTestsByTestIds(e){return this.models.Test.findAll({where:{test_ID:{[o.Op.in]:e}},include:[{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t;return{id:e.test_ID,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(e.end_time,u).toDate(),sampleId:e.sample_ID,startedAt:(0,n.default)(e.start_time,u).toDate()}}))))}getCompletedTestsBySampleIds(e){return this.models.Test.findAll({where:{sample_ID:{[o.Op.in]:e},end_time:{[o.Op.and]:[{[o.Op.not]:null},{[o.Op.between]:[(0,n.default)().subtract(r.LAB_RESULT_APPROVAL_DEADLINE_HOURS,"hours").format(u),(0,n.default)().format(u)]}]},result_text:{[o.Op.not]:null}},include:[{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t;return{id:e.test_ID,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(e.end_time,u).toDate(),sampleId:e.sample_ID,startedAt:(0,n.default)(e.start_time,u).toDate()}}))))}}},2952:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Advancestagesetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Advancestagesetting",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1},stage_number:{type:l.DataTypes.SMALLINT,allowNull:!0},protocol_number:{type:l.DataTypes.SMALLINT,allowNull:!0},new_stage_number:{type:l.DataTypes.SMALLINT,allowNull:!0},stop_after_new_stage:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},stop_if_no_ct:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},advance_stage_settings_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"advancestagesettings",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_advancestagesettings",unique:!0,fields:[{name:"advance_stage_settings_id"}]}]})}}t.Advancestagesetting=s},6623:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AnalyteResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AnalyteResultText",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},target_result_key:{type:l.DataTypes.STRING(8),allowNull:!0},result_text_reference:{type:l.DataTypes.SMALLINT,allowNull:!1}},{tableName:"analyte_result_text ",schema:"dbo",timestamps:!1})}}t.AnalyteResultText=s},7089:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AnalyteResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AnalyteResult",{test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},expected_result:{type:l.DataTypes.SMALLINT,allowNull:!0},endpoint:{type:l.DataTypes.FLOAT,allowNull:!1},threshold:{type:l.DataTypes.FLOAT,allowNull:!1},cycle_threshold:{type:l.DataTypes.FLOAT,allowNull:!1},probe_check_result:{type:l.DataTypes.SMALLINT,allowNull:!0},probe_check_reading1:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_reading2:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_reading3:{type:l.DataTypes.FLOAT,allowNull:!0},error_status:{type:l.DataTypes.SMALLINT,allowNull:!0},target_result:{type:l.DataTypes.SMALLINT,allowNull:!0},ic_result:{type:l.DataTypes.SMALLINT,allowNull:!0},ec_result:{type:l.DataTypes.SMALLINT,allowNull:!0},spc_result:{type:l.DataTypes.SMALLINT,allowNull:!0},interpretation:{type:l.DataTypes.SMALLINT,allowNull:!0},second_deriv_peak_height:{type:l.DataTypes.FLOAT,allowNull:!0},nc_ic_endpoint:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:0},curve_fit_result:{type:l.DataTypes.SMALLINT,allowNull:!0},delta_ct:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-9999},TTP:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:0},quantitative_result:{type:l.DataTypes.FLOAT,allowNull:!0},iqs_lq_result:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:1},iqs_hq_result:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:1},analyte_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},reason:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"analyte_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK_analyte_result",unique:!0,fields:[{name:"analyte_result_id"}]},{name:"test_ID",fields:[{name:"test_ID"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.AnalyteResult=s},3425:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Analyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Analyte",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_index:{type:l.DataTypes.INTEGER,allowNull:!1},usage:{type:l.DataTypes.SMALLINT,allowNull:!0},target:{type:l.DataTypes.BLOB,allowNull:!0},analyte_name:{type:l.DataTypes.STRING(20),allowNull:!0},intended_concentration:{type:l.DataTypes.FLOAT,allowNull:!0},analyte_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},use_curve_fit:{type:l.DataTypes.BOOLEAN,allowNull:!0},enable_signal_loss_detection:{type:l.DataTypes.BOOLEAN,allowNull:!0},reporter_name:{type:l.DataTypes.STRING(12),allowNull:!1},boxcar_cycles:{type:l.DataTypes.SMALLINT,allowNull:!0},curve_analysis:{type:l.DataTypes.SMALLINT,allowNull:!0},background_start:{type:l.DataTypes.SMALLINT,allowNull:!0},background_end:{type:l.DataTypes.SMALLINT,allowNull:!0},cycle_if_no_ct:{type:l.DataTypes.SMALLINT,allowNull:!0},min_ct_req_pass_controls:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_on_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},curve_fit_start_background:{type:l.DataTypes.BOOLEAN,allowNull:!0},curve_fit_start_index:{type:l.DataTypes.SMALLINT,allowNull:!0},curve_fit_end_data:{type:l.DataTypes.BOOLEAN,allowNull:!0},curve_fit_end_index:{type:l.DataTypes.SMALLINT,allowNull:!0},curve_fit_min_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_nrse:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_slope_vs_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},background_min_points:{type:l.DataTypes.SMALLINT,allowNull:!0},background_look_back:{type:l.DataTypes.SMALLINT,allowNull:!0},background_validate:{type:l.DataTypes.BOOLEAN,allowNull:!0},background_max_slope:{type:l.DataTypes.FLOAT,allowNull:!0},background_max_rms_error:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_use_delta_pc:{type:l.DataTypes.BOOLEAN,allowNull:!0},probe_check_min_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_max_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},invalid_bias:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"analyte",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_analyte",unique:!0,fields:[{name:"analyte_id"}]},{name:"pos",fields:[{name:"analyte_index"}]}]})}}t.Analyte=s},1401:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayCartridge=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayCartridge",{assay_cartridge_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!0},need_lot_parameters:{type:l.DataTypes.BOOLEAN,allowNull:!1},need_ext_control:{type:l.DataTypes.BOOLEAN,allowNull:!1},ext_control_frq:{type:l.DataTypes.SMALLINT,allowNull:!0},cartridge_type_ID:{type:l.DataTypes.INTEGER,allowNull:!0},command_seq:{type:l.DataTypes.BLOB,allowNull:!0},melt_all_peaks:{type:l.DataTypes.BOOLEAN,allowNull:!1},use_background_subtraction:{type:l.DataTypes.BOOLEAN,allowNull:!1},air_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},overflow_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},comments:{type:l.DataTypes.STRING(256),allowNull:!0},command_seq_format:{type:l.DataTypes.SMALLINT,allowNull:!0},picture:{type:l.DataTypes.BLOB,allowNull:!0},read_interval:{type:l.DataTypes.INTEGER,allowNull:!0},prep_cartridge_shelf_life:{type:l.DataTypes.INTEGER,allowNull:!1},retain_cartridge:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"assay_cartridge",schema:"dbo",timestamps:!1,indexes:[{name:"PK_assay_cartridge",unique:!0,fields:[{name:"assay_cartridge_id"}]}]})}}t.AssayCartridge=s},9438:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayChamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayChamber",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!0},name:{type:l.DataTypes.STRING(16),allowNull:!0},initial_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},assay_chamber_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"assay_chamber",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"PK_assay_chamber",unique:!0,fields:[{name:"assay_chamber_id"}]}]})}}t.AssayChamber=s},378:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Assay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Assay",{assay_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},pos:{type:l.DataTypes.INTEGER,allowNull:!0},name:{type:l.DataTypes.STRING(32),allowNull:!0},version:{type:l.DataTypes.SMALLINT,allowNull:!0},user_ID:{type:l.DataTypes.INTEGER,allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_verified:{type:l.DataTypes.BOOLEAN,allowNull:!0},comments:{type:l.DataTypes.STRING(256),allowNull:!0},lock_comments:{type:l.DataTypes.STRING(256),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},product_code:{type:l.DataTypes.SMALLINT,allowNull:!0},assay_type:{type:l.DataTypes.SMALLINT,allowNull:!0},disclaimer:{type:l.DataTypes.STRING(512),allowNull:!0},company_code:{type:l.DataTypes.SMALLINT,allowNull:!0},result_text_type:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:0},class:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:0},analysis_type:{type:l.DataTypes.SMALLINT,allowNull:!0},sample_prep_instruction:{type:l.DataTypes.STRING(256),allowNull:!0},sample_prep_video:{type:l.DataTypes.BLOB,allowNull:!0},test_code:{type:l.DataTypes.STRING(15),allowNull:!0},enable_test_code:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},enable_auto_archive:{type:l.DataTypes.BOOLEAN,allowNull:!1},default_result_text_reference:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:5},default_text_color_reference:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:3},clia_waived:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"assay",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_assay_ID",unique:!0,fields:[{name:"assay_ID"}]},{name:"pos",fields:[{name:"pos"}]}]})}}t.Assay=s},8486:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CalibrationChamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CalibrationChamber",{calibration_seq_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1,primaryKey:!0},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!0},name:{type:l.DataTypes.STRING(16),allowNull:!0},initial_volume:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"calibration_chamber",schema:"dbo",timestamps:!1,indexes:[{name:"calibration_seq_id",fields:[{name:"calibration_seq_id"}]},{name:"cartridge_ID",fields:[{name:"cartridge_id"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"PK_calibration_chamber",unique:!0,fields:[{name:"calibration_seq_id"},{name:"cartridge_id"},{name:"chamber_number"}]}]})}}t.CalibrationChamber=s},447:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CalibrationSequence=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CalibrationSequence",{calibration_seq_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},pos:{type:l.DataTypes.INTEGER,allowNull:!0},name:{type:l.DataTypes.STRING(32),allowNull:!0},cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!0},command_seq:{type:l.DataTypes.BLOB,allowNull:!0},command_seq_format:{type:l.DataTypes.SMALLINT,allowNull:!0},air_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},comments:{type:l.DataTypes.STRING(256),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"calibration_sequence",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_calibration_sequence",unique:!0,fields:[{name:"calibration_seq_id"}]},{name:"pos",fields:[{name:"pos"}]}]})}}t.CalibrationSequence=s},975:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CartridgeOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CartridgeOrder",{cartridge_order_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},sample_id:{type:l.DataTypes.STRING(25),allowNull:!0},scanned_SID:{type:l.DataTypes.BOOLEAN,allowNull:!0},scanned_PID:{type:l.DataTypes.BOOLEAN,allowNull:!0},priority:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0},rgt_lot_id:{type:l.DataTypes.STRING(6),allowNull:!1},cartridge_serial_number:{type:l.DataTypes.BIGINT,allowNull:!0},cartridge_expiration_date:{type:l.DataTypes.DATE,allowNull:!0},cartridge_barcode:{type:l.DataTypes.STRING(1024),allowNull:!0},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},other_sample_type_text:{type:l.DataTypes.STRING(32),allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_status:{type:l.DataTypes.STRING(32),allowNull:!0},order_sw_version:{type:l.DataTypes.STRING(16),allowNull:!1},cartridge_order_time:{type:l.DataTypes.STRING(24),allowNull:!0},cartridge_order_expiration:{type:l.DataTypes.STRING(24),allowNull:!0},location:{type:l.DataTypes.STRING(32),allowNull:!0},location_site:{type:l.DataTypes.INTEGER,allowNull:!0},lis_order_id:{type:l.DataTypes.INTEGER,allowNull:!1},test_type:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"cartridge_order",schema:"dbo",timestamps:!1,indexes:[{name:"PK_cartridge_order",unique:!0,fields:[{name:"cartridge_order_id"}]}]})}}t.CartridgeOrder=s},1291:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Cartridge=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Cartridge",{cartridge_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},name:{type:l.DataTypes.STRING(32),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},max_pressure:{type:l.DataTypes.SMALLINT,allowNull:!0},syringe_min_transfer_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},syringe_max_transfer_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},syringe_max_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_syringe_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_chamber_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},direct_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},filter_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},direct_flow_rate_min:{type:l.DataTypes.SMALLINT,allowNull:!0},direct_flow_rate_max:{type:l.DataTypes.SMALLINT,allowNull:!0},microliters_per_revolution:{type:l.DataTypes.FLOAT,allowNull:!0},initial_aspirate_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},initial_aspirate_flow_rate:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_pressurized_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},air_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},overflow_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},min_pressure:{type:l.DataTypes.SMALLINT,allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1,defaultValue:""},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},filter_flow_rate_min:{type:l.DataTypes.SMALLINT,allowNull:!0},filter_flow_rate_max:{type:l.DataTypes.SMALLINT,allowNull:!0},cartridge_foot_height:{type:l.DataTypes.INTEGER,allowNull:!0},adc_2_psi:{type:l.DataTypes.FLOAT,allowNull:!0},plunger_strip_position:{type:l.DataTypes.INTEGER,allowNull:!0},plunger_pickup_position:{type:l.DataTypes.INTEGER,allowNull:!0},picture:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"cartridge",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"name",fields:[{name:"name"}]},{name:"PK_cartridge_ID",unique:!0,fields:[{name:"cartridge_ID"}]},{name:"version",fields:[{name:"version"}]}]})}}t.Cartridge=s},7184:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Chamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Chamber",{cartridge_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1,primaryKey:!0},min_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},max_volume:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"chamber",schema:"dbo",timestamps:!1,indexes:[{name:"cartridge_ID",fields:[{name:"cartridge_ID"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"PK_chamber",unique:!0,fields:[{name:"cartridge_ID"},{name:"chamber_number"}]}]})}}t.Chamber=s},7527:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorDisclaimer=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ColorDisclaimer",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},color:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},disclaimer:{type:l.DataTypes.STRING(256),allowNull:!0}},{tableName:"color_disclaimer",schema:"dbo",timestamps:!1,indexes:[{name:"PK_color_disclaimer",unique:!0,fields:[{name:"assay_ID"},{name:"color"}]}]})}}t.ColorDisclaimer=s},6840:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Config",{param_key:{type:l.DataTypes.STRING(64),primaryKey:!0,allowNull:!1},param_val:{type:l.DataTypes.STRING(512),allowNull:!1,defaultValue:""}},{tableName:"config",schema:"dbo",timestamps:!1})}}t.Config=s},501:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CrosstalkFactor=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CrosstalkFactor",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},protocol_number:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:-1},factor:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:0},crosstalk_factor_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},from_analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},to_analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"crosstalk_factor",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_crosstalk_factor",unique:!0,fields:[{name:"crosstalk_factor_id"}]}]})}}t.CrosstalkFactor=s},8567:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DisabledModule=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("DisabledModule",{site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!0},creation:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"disabled_module",schema:"dbo",timestamps:!1,indexes:[{name:"PK_disabled_module",unique:!0,fields:[{name:"site_serial_number"}]}]})}}t.DisabledModule=s},7928:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Dtproperty=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Dtproperty",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},objectid:{type:l.DataTypes.INTEGER,allowNull:!0},property:{type:l.DataTypes.STRING(64),allowNull:!1,primaryKey:!0},value:{type:l.DataTypes.STRING(255),allowNull:!0},uvalue:{type:l.DataTypes.STRING(255),allowNull:!0},lvalue:{type:l.DataTypes.BLOB,allowNull:!0},version:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:0}},{tableName:"dtproperties",schema:"dbo",timestamps:!1,indexes:[{name:"pk_dtproperties",unique:!0,fields:[{name:"id"},{name:"property"}]}]})}}t.Dtproperty=s},4368:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.FailedLocation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("FailedLocation",{location:{type:l.DataTypes.STRING(32),allowNull:!1,primaryKey:!0},location_site:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"failed_location",schema:"dbo",timestamps:!1,indexes:[{name:"PK_failed_location",unique:!0,fields:[{name:"location"},{name:"location_site"}]}]})}}t.FailedLocation=s},1692:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetting",{graph_setting_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},graph_type:{type:l.DataTypes.SMALLINT,allowNull:!1},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"assay_ID"}},param_key:{type:l.DataTypes.STRING(64),allowNull:!1},param_val:{type:l.DataTypes.STRING(512),allowNull:!1,defaultValue:""}},{tableName:"graph_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__graph_setting__408F9238",unique:!0,fields:[{name:"graph_setting_id"}]}]})}}t.GraphSetting=s},5208:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetup",{graph_setup_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},pos:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!0},is_default:{type:l.DataTypes.BOOLEAN,allowNull:!1},user_ID:{type:l.DataTypes.INTEGER,allowNull:!0},settings:{type:l.DataTypes.INTEGER,allowNull:!0},format:{type:l.DataTypes.SMALLINT,allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_graph_setup",unique:!0,fields:[{name:"graph_setup_ID"}]},{name:"pos",fields:[{name:"pos"}]}]})}}t.GraphSetup=s},9447:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.HaplotypeResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("HaplotypeResultText",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(11),allowNull:!1,primaryKey:!0},alleles_text_1:{type:l.DataTypes.STRING(10),allowNull:!0},alleles_text_2:{type:l.DataTypes.STRING(10),allowNull:!0},text_color_reference:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"haplotype_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK_haplotype_result_text",unique:!0,fields:[{name:"assay_id"},{name:"haplotype_id"},{name:"result_key"}]}]})}}t.HaplotypeResultText=s},9933:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Haplotype=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Haplotype",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},name:{type:l.DataTypes.STRING(20),allowNull:!0},lis_test_code:{type:l.DataTypes.STRING(15),allowNull:!0}},{tableName:"haplotype",schema:"dbo",timestamps:!1,indexes:[{name:"PK_haplotype",unique:!0,fields:[{name:"assay_id"},{name:"haplotype_id"}]}]})}}t.Haplotype=s},6824:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.InfinitySystemLog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("InfinitySystemLog",{infinity_system_log_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1},code:{type:l.DataTypes.INTEGER,allowNull:!1},subsystem:{type:l.DataTypes.INTEGER,allowNull:!1},details:{type:l.DataTypes.STRING(512),allowNull:!0},log_time:{type:l.DataTypes.STRING(24),allowNull:!1},sw_version:{type:l.DataTypes.STRING(16),allowNull:!1},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"infinity_system_log",schema:"dbo",timestamps:!1,indexes:[{name:"PK_infinity_system_log",unique:!0,fields:[{name:"infinity_system_log_id"}]}]})}}t.InfinitySystemLog=s},7819:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlog=t.Test=t.SystemLog=t.Snp=t.SampleType=t.SampleSetting=t.RetainCartridgeColor=t.ReagentLot=t.QuantUnitSetting=t.QuantResult=t.QcTest=t.QcResult=t.Privilege=t.PatientTestOrder=t.Patient=t.Path=t.OrganismTarget=t.OrganismResultText=t.OrganismResultRule=t.OrganismResultEvaluator=t.OrganismResult=t.Organism=t.MeltPeakSetting=t.MeltPeakResult=t.LisTestOrder=t.Instrument=t.InfinitySystemLog=t.HaplotypeResultText=t.Haplotype=t.GraphSetup=t.GraphSetting=t.FailedLocation=t.Dtproperty=t.DisabledModule=t.CrosstalkFactor=t.Config=t.ColorDisclaimer=t.Chamber=t.CartridgeOrder=t.Cartridge=t.CalibrationSequence=t.CalibrationChamber=t.AssayChamber=t.AssayCartridge=t.Assay=t.AnalyteResultText=t.AnalyteResult=t.Analyte=t.Advancestagesetting=t.IntegrityCheck=void 0,t.initModels=t.User=t.TestRun=t.TestPcError=t.TestHistory=t.TestGraphSetup=t.TestBlogCounter=void 0;const l=a(2496);Object.defineProperty(t,"IntegrityCheck",{enumerable:!0,get:function(){return l.IntegrityCheck}});const s=a(2952);Object.defineProperty(t,"Advancestagesetting",{enumerable:!0,get:function(){return s.Advancestagesetting}});const n=a(3425);Object.defineProperty(t,"Analyte",{enumerable:!0,get:function(){return n.Analyte}});const i=a(7089);Object.defineProperty(t,"AnalyteResult",{enumerable:!0,get:function(){return i.AnalyteResult}});const o=a(6623);Object.defineProperty(t,"AnalyteResultText",{enumerable:!0,get:function(){return o.AnalyteResultText}});const r=a(378);Object.defineProperty(t,"Assay",{enumerable:!0,get:function(){return r.Assay}});const p=a(1401);Object.defineProperty(t,"AssayCartridge",{enumerable:!0,get:function(){return p.AssayCartridge}});const u=a(9438);Object.defineProperty(t,"AssayChamber",{enumerable:!0,get:function(){return u.AssayChamber}});const d=a(8486);Object.defineProperty(t,"CalibrationChamber",{enumerable:!0,get:function(){return d.CalibrationChamber}});const y=a(447);Object.defineProperty(t,"CalibrationSequence",{enumerable:!0,get:function(){return y.CalibrationSequence}});const _=a(1291);Object.defineProperty(t,"Cartridge",{enumerable:!0,get:function(){return _.Cartridge}});const m=a(975);Object.defineProperty(t,"CartridgeOrder",{enumerable:!0,get:function(){return m.CartridgeOrder}});const c=a(7184);Object.defineProperty(t,"Chamber",{enumerable:!0,get:function(){return c.Chamber}});const T=a(7527);Object.defineProperty(t,"ColorDisclaimer",{enumerable:!0,get:function(){return T.ColorDisclaimer}});const N=a(6840);Object.defineProperty(t,"Config",{enumerable:!0,get:function(){return N.Config}});const g=a(501);Object.defineProperty(t,"CrosstalkFactor",{enumerable:!0,get:function(){return g.CrosstalkFactor}});const f=a(8567);Object.defineProperty(t,"DisabledModule",{enumerable:!0,get:function(){return f.DisabledModule}});const D=a(7928);Object.defineProperty(t,"Dtproperty",{enumerable:!0,get:function(){return D.Dtproperty}});const E=a(4368);Object.defineProperty(t,"FailedLocation",{enumerable:!0,get:function(){return E.FailedLocation}});const b=a(1692);Object.defineProperty(t,"GraphSetting",{enumerable:!0,get:function(){return b.GraphSetting}});const w=a(5208);Object.defineProperty(t,"GraphSetup",{enumerable:!0,get:function(){return w.GraphSetup}});const I=a(9933);Object.defineProperty(t,"Haplotype",{enumerable:!0,get:function(){return I.Haplotype}});const R=a(9447);Object.defineProperty(t,"HaplotypeResultText",{enumerable:!0,get:function(){return R.HaplotypeResultText}});const O=a(6824);Object.defineProperty(t,"InfinitySystemLog",{enumerable:!0,get:function(){return O.InfinitySystemLog}});const h=a(3026);Object.defineProperty(t,"Instrument",{enumerable:!0,get:function(){return h.Instrument}});const M=a(7198);Object.defineProperty(t,"LisTestOrder",{enumerable:!0,get:function(){return M.LisTestOrder}});const G=a(7358);Object.defineProperty(t,"MeltPeakResult",{enumerable:!0,get:function(){return G.MeltPeakResult}});const v=a(9047);Object.defineProperty(t,"MeltPeakSetting",{enumerable:!0,get:function(){return v.MeltPeakSetting}});const S=a(5973);Object.defineProperty(t,"Organism",{enumerable:!0,get:function(){return S.Organism}});const A=a(8356);Object.defineProperty(t,"OrganismResult",{enumerable:!0,get:function(){return A.OrganismResult}});const P=a(4271);Object.defineProperty(t,"OrganismResultEvaluator",{enumerable:!0,get:function(){return P.OrganismResultEvaluator}});const L=a(1688);Object.defineProperty(t,"OrganismResultRule",{enumerable:!0,get:function(){return L.OrganismResultRule}});const C=a(2020);Object.defineProperty(t,"OrganismResultText",{enumerable:!0,get:function(){return C.OrganismResultText}});const K=a(1857);Object.defineProperty(t,"OrganismTarget",{enumerable:!0,get:function(){return K.OrganismTarget}});const x=a(2703);Object.defineProperty(t,"Path",{enumerable:!0,get:function(){return x.Path}});const j=a(3848);Object.defineProperty(t,"Patient",{enumerable:!0,get:function(){return j.Patient}});const q=a(5856);Object.defineProperty(t,"PatientTestOrder",{enumerable:!0,get:function(){return q.PatientTestOrder}});const k=a(598);Object.defineProperty(t,"Privilege",{enumerable:!0,get:function(){return k.Privilege}});const F=a(7679);Object.defineProperty(t,"QcResult",{enumerable:!0,get:function(){return F.QcResult}});const B=a(5234);Object.defineProperty(t,"QcTest",{enumerable:!0,get:function(){return B.QcTest}});const Q=a(500);Object.defineProperty(t,"QuantResult",{enumerable:!0,get:function(){return Q.QuantResult}});const U=a(6572);Object.defineProperty(t,"QuantUnitSetting",{enumerable:!0,get:function(){return U.QuantUnitSetting}});const H=a(2025);Object.defineProperty(t,"ReagentLot",{enumerable:!0,get:function(){return H.ReagentLot}});const X=a(1084);Object.defineProperty(t,"RetainCartridgeColor",{enumerable:!0,get:function(){return X.RetainCartridgeColor}});const V=a(7617);Object.defineProperty(t,"SampleSetting",{enumerable:!0,get:function(){return V.SampleSetting}});const z=a(1674);Object.defineProperty(t,"SampleType",{enumerable:!0,get:function(){return z.SampleType}});const J=a(2412);Object.defineProperty(t,"Snp",{enumerable:!0,get:function(){return J.Snp}});const $=a(6151);Object.defineProperty(t,"SystemLog",{enumerable:!0,get:function(){return $.SystemLog}});const Y=a(9100);Object.defineProperty(t,"Test",{enumerable:!0,get:function(){return Y.Test}});const W=a(6103);Object.defineProperty(t,"TestBlog",{enumerable:!0,get:function(){return W.TestBlog}});const Z=a(3969);Object.defineProperty(t,"TestBlogCounter",{enumerable:!0,get:function(){return Z.TestBlogCounter}});const ee=a(1808);Object.defineProperty(t,"TestGraphSetup",{enumerable:!0,get:function(){return ee.TestGraphSetup}});const te=a(3569);Object.defineProperty(t,"TestHistory",{enumerable:!0,get:function(){return te.TestHistory}});const ae=a(9642);Object.defineProperty(t,"TestPcError",{enumerable:!0,get:function(){return ae.TestPcError}});const le=a(6548);Object.defineProperty(t,"TestRun",{enumerable:!0,get:function(){return le.TestRun}});const se=a(8075);Object.defineProperty(t,"User",{enumerable:!0,get:function(){return se.User}}),t.initModels=function(e){const t=l.IntegrityCheck.initModel(e),a=s.Advancestagesetting.initModel(e),ne=n.Analyte.initModel(e),ie=i.AnalyteResult.initModel(e),oe=o.AnalyteResultText.initModel(e),re=r.Assay.initModel(e),pe=p.AssayCartridge.initModel(e),ue=u.AssayChamber.initModel(e),de=d.CalibrationChamber.initModel(e),ye=y.CalibrationSequence.initModel(e),_e=_.Cartridge.initModel(e),me=m.CartridgeOrder.initModel(e),ce=c.Chamber.initModel(e),Te=T.ColorDisclaimer.initModel(e),Ne=N.Config.initModel(e),ge=g.CrosstalkFactor.initModel(e),fe=f.DisabledModule.initModel(e),De=D.Dtproperty.initModel(e),Ee=E.FailedLocation.initModel(e),be=b.GraphSetting.initModel(e),we=w.GraphSetup.initModel(e),Ie=I.Haplotype.initModel(e),Re=R.HaplotypeResultText.initModel(e),Oe=O.InfinitySystemLog.initModel(e),he=h.Instrument.initModel(e),Me=M.LisTestOrder.initModel(e),Ge=G.MeltPeakResult.initModel(e),ve=v.MeltPeakSetting.initModel(e),Se=S.Organism.initModel(e),Ae=A.OrganismResult.initModel(e),Pe=P.OrganismResultEvaluator.initModel(e),Le=L.OrganismResultRule.initModel(e),Ce=C.OrganismResultText.initModel(e),Ke=K.OrganismTarget.initModel(e),xe=x.Path.initModel(e),je=j.Patient.initModel(e),qe=q.PatientTestOrder.initModel(e),ke=k.Privilege.initModel(e),Fe=F.QcResult.initModel(e),Be=B.QcTest.initModel(e),Qe=Q.QuantResult.initModel(e),Ue=U.QuantUnitSetting.initModel(e),He=H.ReagentLot.initModel(e),Xe=X.RetainCartridgeColor.initModel(e),Ve=V.SampleSetting.initModel(e),ze=z.SampleType.initModel(e),Je=J.Snp.initModel(e),$e=$.SystemLog.initModel(e),Ye=Y.Test.initModel(e),We=W.TestBlog.initModel(e),Ze=Z.TestBlogCounter.initModel(e),et=ee.TestGraphSetup.initModel(e),tt=te.TestHistory.initModel(e),at=ae.TestPcError.initModel(e),lt=le.TestRun.initModel(e),st=se.User.initModel(e);return be.belongsTo(re,{as:"assay",foreignKey:"assay_id"}),re.hasMany(be,{as:"graph_settings",foreignKey:"assay_id"}),Ue.belongsTo(re,{as:"assay",foreignKey:"assay_id"}),re.hasMany(Ue,{as:"quant_unit_settings",foreignKey:"assay_id"}),Ke.belongsTo(Ue,{as:"selected_quant_unit",foreignKey:"selected_quant_unit_id"}),Ue.hasMany(Ke,{as:"organism_targets",foreignKey:"selected_quant_unit_id"}),Qe.belongsTo(Ue,{as:"quant_unit_setting",foreignKey:"quant_unit_setting_id"}),Ue.hasMany(Qe,{as:"quant_results",foreignKey:"quant_unit_setting_id"}),Qe.belongsTo(Ye,{as:"test",foreignKey:"test_ID"}),Ye.hasMany(Qe,{as:"quant_results",foreignKey:"test_ID"}),Ye.hasMany(ie,{as:"analyte_results",foreignKey:"test_ID"}),Ye.hasMany(Ae,{as:"organism_results",foreignKey:"test_ID"}),Ye.belongsTo(re,{as:"assay",foreignKey:"assay_ID"}),Ye.belongsTo(st,{as:"operator",foreignKey:"operator_ids"}),Ye.hasOne(lt,{as:"test_run",foreignKey:"test_ID"}),Ye.belongsTo(qe,{as:"patient_test_order",foreignKey:"test_id"}),Ye.hasMany(at,{as:"test_errors",foreignKey:"test_id"}),qe.belongsTo(je,{as:"patient",foreignKey:"patient_id"}),ie.belongsTo(ne,{as:"analyte",foreignKey:"analyte_ID"}),Ae.belongsTo(Se,{as:"organism",foreignKey:"organism_ID"}),Ze.belongsTo(We,{as:"test_blog",foreignKey:"test_blog_ID"}),We.hasMany(Ze,{as:"test_blog_counters",foreignKey:"test_blog_ID"}),{IntegrityCheck:t,Advancestagesetting:a,Analyte:ne,AnalyteResult:ie,AnalyteResultText:oe,Assay:re,AssayCartridge:pe,AssayChamber:ue,CalibrationChamber:de,CalibrationSequence:ye,Cartridge:_e,CartridgeOrder:me,Chamber:ce,ColorDisclaimer:Te,Config:Ne,CrosstalkFactor:ge,DisabledModule:fe,Dtproperty:De,FailedLocation:Ee,GraphSetting:be,GraphSetup:we,Haplotype:Ie,HaplotypeResultText:Re,InfinitySystemLog:Oe,Instrument:he,LisTestOrder:Me,MeltPeakResult:Ge,MeltPeakSetting:ve,Organism:Se,OrganismResult:Ae,OrganismResultEvaluator:Pe,OrganismResultRule:Le,OrganismResultText:Ce,OrganismTarget:Ke,Path:xe,Patient:je,PatientTestOrder:qe,Privilege:ke,QcResult:Fe,QcTest:Be,QuantResult:Qe,QuantUnitSetting:Ue,ReagentLot:He,RetainCartridgeColor:Xe,SampleSetting:Ve,SampleType:ze,Snp:Je,SystemLog:$e,Test:Ye,TestBlog:We,TestBlogCounter:Ze,TestGraphSetup:et,TestHistory:tt,TestPcError:at,TestRun:lt,User:st}}},3026:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Instrument=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Instrument",{Instrument_id:{type:l.DataTypes.INTEGER,allowNull:!0},mac_address:{type:l.DataTypes.BLOB,allowNull:!0},serial_number:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"instrument",schema:"dbo",timestamps:!1,indexes:[{name:"mac_address",fields:[{name:"mac_address"}]}]})}}t.Instrument=s},2496:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.IntegrityCheck=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("IntegrityCheck",{table_name:{type:l.DataTypes.STRING(32),allowNull:!0},field_name:{type:l.DataTypes.STRING(24),allowNull:!0},id_number:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"Integrity_Check",schema:"dbo",timestamps:!1})}}t.IntegrityCheck=s},7198:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisTestOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisTestOrder",{instrument_specimen_ID:{type:l.DataTypes.STRING(64),allowNull:!1,defaultValue:""},sample_ID:{type:l.DataTypes.STRING(25),allowNull:!0},test_code:{type:l.DataTypes.STRING(15),allowNull:!0,defaultValue:""},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:-1},order_time:{type:l.DataTypes.STRING(24),allowNull:!0},order_status:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:1},priority:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:1},LIS_test_order_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},cartridge_ID:{type:l.DataTypes.STRING(25),allowNull:!0}},{tableName:"lis_test_order",schema:"dbo",timestamps:!1,indexes:[{name:"IX_lis_test_order",fields:[{name:"instrument_specimen_ID"}]},{name:"PK_lis_test_order",unique:!0,fields:[{name:"LIS_test_order_ID"}]}]})}}t.LisTestOrder=s},7358:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakResult",{melt_peak_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_result_id:{type:l.DataTypes.INTEGER,allowNull:!1},peak_index:{type:l.DataTypes.INTEGER,allowNull:!1},peak_height:{type:l.DataTypes.FLOAT,allowNull:!1},peak_temperature:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"melt_peak_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK_melt_peak_result",unique:!0,fields:[{name:"melt_peak_result_id"}]}]})}}t.MeltPeakResult=s},9047:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakSetting",{melt_peak_settings_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},slope_positive:{type:l.DataTypes.BOOLEAN,allowNull:!1},baseline_start_temp:{type:l.DataTypes.FLOAT,allowNull:!1},baseline_look_back:{type:l.DataTypes.FLOAT,allowNull:!1},baseline_num_points:{type:l.DataTypes.INTEGER,allowNull:!1},points_around_peak:{type:l.DataTypes.INTEGER,allowNull:!1},peak_threshold:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_min:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_max:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"melt_peak_settings",schema:"dbo",timestamps:!1,indexes:[{name:"PK_melt_peak_settings",unique:!0,fields:[{name:"melt_peak_settings_id"}]}]})}}t.MeltPeakSetting=s},4271:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultEvaluator=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultEvaluator",{organism_result_evaluator_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0},parent_evaluator_id:{type:l.DataTypes.INTEGER,allowNull:!0},evaluator_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"organism_result_evaluator",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result_evaluator",unique:!0,fields:[{name:"organism_result_evaluator_id"}]}]})}}t.OrganismResultEvaluator=s},1688:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultRule=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultRule",{organism_result_rule_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},evaluator_id:{type:l.DataTypes.INTEGER,allowNull:!0},parent_rule_id:{type:l.DataTypes.INTEGER,allowNull:!0},rule_type:{type:l.DataTypes.INTEGER,allowNull:!1},rule_anded:{type:l.DataTypes.BOOLEAN,allowNull:!0},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0},pass_on_equals:{type:l.DataTypes.BOOLEAN,allowNull:!0},interpretation:{type:l.DataTypes.INTEGER,allowNull:!0},reasons:{type:l.DataTypes.STRING(50),allowNull:!0},pass_on_peak:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"organism_result_rule",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result_rule",unique:!0,fields:[{name:"organism_result_rule_id"}]}]})}}t.OrganismResultRule=s},2020:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultText",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(8),allowNull:!1},result_text_reference:{type:l.DataTypes.SMALLINT,allowNull:!0},text_color_reference:{type:l.DataTypes.SMALLINT,allowNull:!0},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},organism_result_text_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"organism_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result_text",unique:!0,fields:[{name:"organism_result_text_id"}]}]})}}t.OrganismResultText=s},8356:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResult",{organism_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},result_type:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0},haplotype_index:{type:l.DataTypes.INTEGER,allowNull:!0},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_color:{type:l.DataTypes.INTEGER,allowNull:!0},result_invalid:{type:l.DataTypes.BOOLEAN,allowNull:!0},allele2_text:{type:l.DataTypes.TEXT,allowNull:!0},lda_total:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result",unique:!0,fields:[{name:"organism_result_id"}]}]})}}t.OrganismResult=s},1857:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismTarget=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismTarget",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1},selected_quant_unit_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"quant_unit_setting",key:"quant_unit_setting_id"}},organism_target_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},lda_ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!0},lda_delta_ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"organism_target",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_target",unique:!0,fields:[{name:"organism_target_id"}]}]})}}t.OrganismTarget=s},5973:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Organism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Organism",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(20),allowNull:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1},early_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},late_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},medium_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},low_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},very_low_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},semi_quant_text_ref:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:-1},replacement_text_ref:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:-1},replacement_color_ref:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:-1},delta_ct_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},organism_lis_test_code:{type:l.DataTypes.STRING(15),allowNull:!0},organism_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},lda_intercept:{type:l.DataTypes.FLOAT,allowNull:!0},lda_min_valid:{type:l.DataTypes.FLOAT,allowNull:!0},lda_cutoff:{type:l.DataTypes.FLOAT,allowNull:!0},lda_max_valid:{type:l.DataTypes.FLOAT,allowNull:!0},pr_dynamic_range_min:{type:l.DataTypes.FLOAT,allowNull:!0},pr_lod_loq:{type:l.DataTypes.FLOAT,allowNull:!0},pr_dynamic_range_max:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism",unique:!0,fields:[{name:"organism_id"}]}]})}}t.Organism=s},2703:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Path=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Path",{path_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},cartridge_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1},tube:{type:l.DataTypes.BOOLEAN,allowNull:!0},block:{type:l.DataTypes.BOOLEAN,allowNull:!0},type:{type:l.DataTypes.SMALLINT,allowNull:!0},angular_offset:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"path",schema:"dbo",timestamps:!1,indexes:[{name:"cartridge_ID",fields:[{name:"cartridge_ID"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"path_id",fields:[{name:"path_ID"}]},{name:"PK_path",unique:!0,fields:[{name:"path_ID"},{name:"cartridge_ID"}]},{name:"type",fields:[{name:"type"}]}]})}}t.Path=s},5856:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PatientTestOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PatientTestOrder",{patient_test_order_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},patient_id:{type:l.DataTypes.INTEGER,allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0},lis_test_order_id:{type:l.DataTypes.INTEGER,allowNull:!0},cartridge_order_id:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"patient_test_order",schema:"dbo",timestamps:!1,indexes:[{name:"PK__patient_test_ord__4924D839",unique:!0,fields:[{name:"patient_test_order_id"}]}]})}}t.PatientTestOrder=s},3848:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Patient=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Patient",{patient_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},gx_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},practice_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},family_name:{type:l.DataTypes.TEXT,allowNull:!0},given_name:{type:l.DataTypes.TEXT,allowNull:!0},middle_name:{type:l.DataTypes.TEXT,allowNull:!0},date_of_birth:{type:l.DataTypes.STRING(32),allowNull:!0},gender:{type:l.DataTypes.STRING(64),allowNull:!0},ethnicity:{type:l.DataTypes.STRING(64),allowNull:!0},postal_code:{type:l.DataTypes.TEXT,allowNull:!0}},{tableName:"patient",schema:"dbo",timestamps:!1,indexes:[{name:"PK__patient__473C8FC7",unique:!0,fields:[{name:"patient_id"}]}]})}}t.Patient=s},598:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Privilege=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Privilege",{privilege_name:{type:l.DataTypes.STRING(64),allowNull:!1,primaryKey:!0},user_type:{type:l.DataTypes.SMALLINT,allowNull:!1,primaryKey:!0}},{tableName:"privilege",schema:"dbo",timestamps:!1,indexes:[{name:"PK_privilege",unique:!0,fields:[{name:"privilege_name"},{name:"user_type"}]}]})}}t.Privilege=s},7679:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QcResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QcResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_name:{type:l.DataTypes.STRING(32),allowNull:!1},assay_version:{type:l.DataTypes.SMALLINT,allowNull:!1},rgt_lot_id:{type:l.DataTypes.STRING(6),allowNull:!0},completion_date:{type:l.DataTypes.DATE,allowNull:!0},due_date:{type:l.DataTypes.DATE,allowNull:!1}},{tableName:"qc_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__qc_resul__3213E83F0FB750B3",unique:!0,fields:[{name:"id"}]}]})}}t.QcResult=s},5234:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QcTest=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QcTest",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0},qc_result_id:{type:l.DataTypes.INTEGER,allowNull:!1},is_pos:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_pass:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"qc_test",schema:"dbo",timestamps:!1,indexes:[{name:"PK__qc_test__3213E83F1387E197",unique:!0,fields:[{name:"id"}]}]})}}t.QcTest=s},500:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QuantResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QuantResult",{quant_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"test_ID"}},quant_unit_setting_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"quant_unit_setting",key:"quant_unit_setting_id"}},quantitative_result:{type:l.DataTypes.FLOAT,allowNull:!0},result_text:{type:l.DataTypes.STRING(1024),allowNull:!0},result_text_color:{type:l.DataTypes.SMALLINT,allowNull:!1},qualitative_result:{type:l.DataTypes.STRING(50),allowNull:!0},result_abnormal_flag:{type:l.DataTypes.STRING(5),allowNull:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_result_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"quant_result",schema:"dbo",timestamps:!1,indexes:[{name:"analyte_result_id",fields:[{name:"analyte_result_id"}]},{name:"PK__quant_result__3AD6B8E2",unique:!0,fields:[{name:"quant_result_id"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.QuantResult=s},6572:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QuantUnitSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QuantUnitSetting",{quant_unit_setting_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"assay_ID"}},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1},position:{type:l.DataTypes.INTEGER,allowNull:!1},unit_key:{type:l.DataTypes.STRING(50),allowNull:!1},conversion_factor:{type:l.DataTypes.FLOAT,allowNull:!1},lower_limit:{type:l.DataTypes.FLOAT,allowNull:!1},upper_limit:{type:l.DataTypes.FLOAT,allowNull:!1},display_log_value:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:0},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"quant_unit_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant_unit_setti__351DDF8C",unique:!0,fields:[{name:"quant_unit_setting_id"}]}]})}}t.QuantUnitSetting=s},2025:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ReagentLot",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},rgt_lot_number:{type:l.DataTypes.STRING(3),allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!0},reagent_lot_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"guid",fields:[{name:"guid"}]},{name:"PK_reagent_lot",unique:!0,fields:[{name:"reagent_lot_id"}]},{name:"rgt_lot_number",fields:[{name:"rgt_lot_number"}]}]})}}t.ReagentLot=s},1084:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RetainCartridgeColor=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("RetainCartridgeColor",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1},color:{type:l.DataTypes.INTEGER,allowNull:!1},retain_cartridge:{type:l.DataTypes.BOOLEAN,allowNull:!0},retain_cartridge_color_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"retain_cartridge_color",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_retain_cartridge",unique:!0,fields:[{name:"retain_cartridge_color_id"}]}]})}}t.RetainCartridgeColor=s},7617:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleSetting",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},sample_type:{type:l.DataTypes.SMALLINT,allowNull:!1},valid_min:{type:l.DataTypes.DECIMAL(5,1),allowNull:!0},valid_max:{type:l.DataTypes.DECIMAL(5,1),allowNull:!0},end_pt_threshold:{type:l.DataTypes.SMALLINT,allowNull:!0},probe_chk_low_max:{type:l.DataTypes.INTEGER,allowNull:!0},probe_chk_high_min:{type:l.DataTypes.INTEGER,allowNull:!0},probe_chk_delta:{type:l.DataTypes.INTEGER,allowNull:!0},is_lot_parameters:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_endpoint:{type:l.DataTypes.BOOLEAN,allowNull:!0},peak_height_min:{type:l.DataTypes.FLOAT,allowNull:!0},use_delta_ct:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},min_delta_ct:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:0},delta_ct_eff:{type:l.DataTypes.FLOAT,allowNull:!0},E0:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E1:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E2:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E3:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E4:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},sample_settings_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},reagent_lot_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_low_min:{type:l.DataTypes.INTEGER,allowNull:!0},probe_chk_high_max:{type:l.DataTypes.INTEGER,allowNull:!0},ct_threshold_value:{type:l.DataTypes.FLOAT,allowNull:!0},normalization_factor:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"sample_settings",schema:"dbo",timestamps:!1,indexes:[{name:"analyte_id",fields:[{name:"analyte_id"}]},{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"PK_sample_settings",unique:!0,fields:[{name:"sample_settings_id"}]},{name:"reagent_lot_id",fields:[{name:"reagent_lot_id"}]},{name:"sample_type",fields:[{name:"sample_type"}]}]})}}t.SampleSetting=s},1674:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleType=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleType",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},pos:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"sample_type",schema:"dbo",timestamps:!1})}}t.SampleType=s},2412:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Snp=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Snp",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!0},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!0},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0},snp_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"snp",schema:"dbo",timestamps:!1,indexes:[{name:"PK_snp",unique:!0,fields:[{name:"snp_id"}]}]})}}t.Snp=s},6151:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SystemLog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SystemLog",{error_type:{type:l.DataTypes.INTEGER,allowNull:!0},log_time:{type:l.DataTypes.STRING(24),allowNull:!0},error_code:{type:l.DataTypes.INTEGER,allowNull:!0},details:{type:l.DataTypes.STRING(512),allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},site_name:{type:l.DataTypes.CHAR(3),allowNull:!0,defaultValue:""},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},system_log_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"system_log",schema:"dbo",timestamps:!1,indexes:[{name:"IX_system_log",fields:[{name:"system_log_ID"}]},{name:"PK_system_log",unique:!0,fields:[{name:"system_log_ID"}]}]})}}t.SystemLog=s},3969:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlogCounter=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlogCounter",{test_blog_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"test_blog",key:"test_blog_ID"}},date_text:{type:l.DataTypes.STRING(8),allowNull:!1,primaryKey:!0},test_count:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_blog_counter",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_blog_counter",unique:!0,fields:[{name:"test_blog_ID"},{name:"date_text"}]}]})}}t.TestBlogCounter=s},6103:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlog",{test_blog_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_name:{type:l.DataTypes.STRING(32),allowNull:!0},assay_version:{type:l.DataTypes.SMALLINT,allowNull:!1}},{tableName:"test_blog",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_blog",unique:!0,fields:[{name:"test_blog_ID"}]}]})}}t.TestBlog=s},1808:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestGraphSetup",{test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},graph_setup_ID:{type:l.DataTypes.INTEGER,allowNull:!1},pos:{type:l.DataTypes.SMALLINT,allowNull:!0},test_graph_setup_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"graph_setup_ID",fields:[{name:"graph_setup_ID"}]},{name:"PK_test_graph_setup",unique:!0,fields:[{name:"test_graph_setup_id"}]},{name:"test_ID",fields:[{name:"test_ID"}]}]})}}t.TestGraphSetup=s},3569:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestHistory",{test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},field_name:{type:l.DataTypes.STRING(32),allowNull:!1},old_content:{type:l.DataTypes.STRING(512),allowNull:!0},new_content:{type:l.DataTypes.STRING(512),allowNull:!0},user_ID:{type:l.DataTypes.INTEGER,allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!1},test_history_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"test_history",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_history",unique:!0,fields:[{name:"test_history_id"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.TestHistory=s},9642:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestPcError=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestPcError",{test_id:{type:l.DataTypes.INTEGER,allowNull:!1},code:{type:l.DataTypes.INTEGER,allowNull:!0},type:{type:l.DataTypes.SMALLINT,allowNull:!0},details:{type:l.DataTypes.STRING(512),allowNull:!0},severity:{type:l.DataTypes.SMALLINT,allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!0},parameter_1:{type:l.DataTypes.FLOAT,allowNull:!0},parameter_2:{type:l.DataTypes.FLOAT,allowNull:!0},parameter_3:{type:l.DataTypes.FLOAT,allowNull:!0},parameter_4:{type:l.DataTypes.FLOAT,allowNull:!0},textparameter:{type:l.DataTypes.STRING(64),allowNull:!0},test_pc_error_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_pc_error",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_pc_error",unique:!0,fields:[{name:"test_pc_error_id"}]},{name:"test_id",fields:[{name:"test_id"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.TestPcError=s},6548:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestRun=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestRun",{test_run_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},site_name:{type:l.DataTypes.CHAR(3),allowNull:!1},site_serial_num:{type:l.DataTypes.INTEGER,allowNull:!0},rgt_lot_ID:{type:l.DataTypes.STRING(6),allowNull:!1},cart_serial_number:{type:l.DataTypes.BIGINT,allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},state:{type:l.DataTypes.SMALLINT,allowNull:!0},error_status:{type:l.DataTypes.SMALLINT,allowNull:!0},start_time:{type:l.DataTypes.STRING(24),allowNull:!0},end_time:{type:l.DataTypes.STRING(24),allowNull:!0},user_ID:{type:l.DataTypes.INTEGER,allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0},icore_serial_num:{type:l.DataTypes.INTEGER,allowNull:!0},fw_version:{type:l.DataTypes.STRING(12),allowNull:!0},datagram_format:{type:l.DataTypes.SMALLINT,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},order_time:{type:l.DataTypes.STRING(24),allowNull:!0},expiration_date:{type:l.DataTypes.DATE,allowNull:!1},cartridge_barcode:{type:l.DataTypes.STRING(1024),allowNull:!0},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},current_test_run:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"test_run",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_run",unique:!0,fields:[{name:"test_run_id"}]}]})}}t.TestRun=s},9100:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Test=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Test",{test_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!0},sample_ID:{type:l.DataTypes.STRING(25),allowNull:!0},scanned_SID:{type:l.DataTypes.BOOLEAN,allowNull:!0},scanned_PID:{type:l.DataTypes.BOOLEAN,allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},test_type:{type:l.DataTypes.SMALLINT,allowNull:!0},expected_result:{type:l.DataTypes.SMALLINT,allowNull:!0},lis_upload_message_ID:{type:l.DataTypes.STRING(64),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},order_time:{type:l.DataTypes.STRING(24),allowNull:!0},outliner:{type:l.DataTypes.BOOLEAN,allowNull:!1},archived:{type:l.DataTypes.BOOLEAN,allowNull:!1},auto_archived:{type:l.DataTypes.BOOLEAN,allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},other_sample_type_text:{type:l.DataTypes.STRING(32),allowNull:!0},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_text_colors:{type:l.DataTypes.TEXT,allowNull:!0},express_result_text:{type:l.DataTypes.STRING(1024),allowNull:!0},order_id:{type:l.DataTypes.INTEGER,allowNull:!1},upload_status:{type:l.DataTypes.INTEGER,allowNull:!1},priority:{type:l.DataTypes.INTEGER,allowNull:!0},cartridge_order_id:{type:l.DataTypes.INTEGER,allowNull:!0},data_reduction_alg:{type:l.DataTypes.SMALLINT,allowNull:!1},state:{type:l.DataTypes.SMALLINT,allowNull:!0},error_status:{type:l.DataTypes.SMALLINT,allowNull:!0},site_name:{type:l.DataTypes.TEXT,allowNull:!0},site_serial_num:{type:l.DataTypes.TEXT,allowNull:!0},operator_ids:{type:l.DataTypes.TEXT,allowNull:!0},start_time:{type:l.DataTypes.STRING(24),allowNull:!0},end_time:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"test",schema:"dbo",timestamps:!1,indexes:[{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"guid",fields:[{name:"guid"}]},{name:"PK_test",unique:!0,fields:[{name:"test_ID"}]},{name:"start_time",fields:[{name:"start_time"}]}]})}}t.Test=s},8075:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.User=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("User",{user_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},login_name:{type:l.DataTypes.STRING(16),allowNull:!0},full_name:{type:l.DataTypes.STRING(128),allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_hidden:{type:l.DataTypes.BOOLEAN,allowNull:!1},password:{type:l.DataTypes.STRING(32),allowNull:!0},user_type:{type:l.DataTypes.SMALLINT,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"users",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_users",unique:!0,fields:[{name:"user_ID"}]}]})}}t.User=s},1058:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,o)}r((l=l.apply(e,t||[])).next())}))},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.GeneXpertClient=void 0;const n=s(a(2245)),i=a(9634),o=a(496),r=a(7306),p=a(7228),u="YYYY/MM/DD HH:mm:ss.SSS";t.GeneXpertClient=class{constructor(e,t,a,l){this.version=e,this.sequelize=(0,r.createSequelize)(t,a,l),this.models=(0,p.initModels)(this.sequelize)}logsTotal(){return this.models.SystemLog.count()}testsTotal(){return this.models.Test.count()}systemInfo(){const e=this.sequelize.query("\n          SELECT\n            MAX(sw_version) as [sw_version],\n            [system_log].[site_serial_number],\n            [system_log].[site_name],\n            MAX([instrument_serial_number]) as [instrument_serial_number],\n            MAX(log_time) as [log_time],\n            MIN(log_time) as [first_seen_at],\n            MAX([disabled_module].[creation_time]) as [disabled_at]\n          FROM [dbo].[system_log]\n            LEFT JOIN [dbo].[disabled_module]\n            ON [dbo].[disabled_module].[site_serial_number] = [dbo].[system_log].[site_serial_number]\n          GROUP BY [site_name], [system_log].[site_serial_number]\n          ORDER BY log_time DESC\n        ").then((([e])=>e)),t=this.models.Config.findAll().then((e=>e.map((e=>({[e.param_key]:e.param_val}))))).then(i.mergeAll);return Promise.all([e,t]).then((e=>(0,r.toSystemInfo)(...e)))}testsPresyncables(e,t,a){return this.models.Test.findAll({where:{[o.Op.or]:[{modification_time:{[o.Op.gt]:e}},{modification_time:{[o.Op.eq]:e},id:{[o.Op.notIn]:t}}]},order:[["modification_time","DESC"]],limit:a}).then((e=>e.map((({id:e,modification_time:t})=>({id:e.toString(),modified:t})))))}testsSyncables(e){return this.models.Test.findAll({where:{id:{[o.Op.in]:e}},include:[{as:"test_data",model:this.models.TestDatum,include:[{as:"run_data",model:this.models.RunDatum}]},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]}},{as:"user",model:this.models.User},{as:"test_errors",model:this.models.TestError},{as:"patient",model:this.models.Patient},{as:"analyte_results",model:this.models.AnalyteResult,include:[{as:"analyte",model:this.models.Analyte},{as:"channel_processed_data_items",model:this.models.ChannelProcessedDataItem}]},{as:"organism_results",model:this.models.OrganismResult,include:[{as:"organism",model:this.models.Organism},{as:"organism_based_organism_result",model:this.models.OrganismBasedOrganismResult}]}]}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}testsForEntry(e,t){return this.models.Test.findAll({where:{sample_id:{[o.Op.notIn]:e}},include:[{as:"test_data",model:this.models.TestDatum,include:[{as:"run_data",model:this.models.RunDatum,required:!0,where:{start_time:{[o.Op.gte]:(0,n.default)().subtract(t||r.hoursForDataEntry,"hours").toDate()}}}],required:!0},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>(console.log({tests:e}),e.map((e=>({id:e.id,assay:e.assay.name,endedAt:e.test_data.run_data.end_time,sampleId:e.sample_id,startedAt:e.test_data.run_data.start_time}))))))}logsPresyncables(e,t,a){return this.models.SystemLog.findAll({where:{[o.Op.or]:[{log_time:{[o.Op.gt]:e}},{log_time:{[o.Op.eq]:e},id:{[o.Op.notIn]:t}}]},limit:a,attributes:["id","log_time"],order:[["log_time","ASC"]]}).then((e=>e.map((({id:e,log_time:t})=>({id:e.toString(),modified:t})))))}logsSyncables(e){return this.models.SystemLog.findAll({where:{id:{[o.Op.in]:e}}}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}close(){return this.sequelize.close()}getTest(e){var t,a;return l(this,void 0,void 0,(function*(){const l=yield this.models.Test.findOne({where:{sample_id:{[o.Op.eq]:e}},include:[{as:"test_data",model:this.models.TestDatum,include:[{as:"run_data",model:this.models.RunDatum}],required:!0}]});return{dataValues:Object.assign(Object.assign({},null==l?void 0:l.dataValues),{end_time:null===(t=null==l?void 0:l.dataValues)||void 0===t?void 0:t.test_data.run_data.end_time,sampleId:null===(a=null==l?void 0:l.dataValues)||void 0===a?void 0:a.sample_id})}}))}getTestsByTestIds(e){return this.models.Test.findAll({where:{id:{[o.Op.in]:e}},include:[{as:"test_data",model:this.models.TestDatum,include:[{as:"run_data",model:this.models.RunDatum,required:!0}],required:!0},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>(console.log({tests:e}),e.map((e=>({id:e.id,assay:e.assay.name,endedAt:e.test_data.run_data.end_time,sampleId:e.sample_id,startedAt:e.test_data.run_data.start_time}))))))}getCompletedTestsBySampleIds(e){return this.models.Test.findAll({where:{sample_id:{[o.Op.in]:e},modification_time:{[o.Op.and]:[{[o.Op.not]:null},{[o.Op.between]:[(0,n.default)().subtract(r.LAB_RESULT_APPROVAL_DEADLINE_HOURS,"hours").format(u),(0,n.default)().format(u)]}]},result_text:{[o.Op.not]:null}},include:[{as:"test_data",model:this.models.TestDatum,include:[{as:"run_data",model:this.models.RunDatum,required:!0}],required:!0},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t,a,l,s,i,o,r;return{id:e.id,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(null!==(s=null===(l=null===(a=null==e?void 0:e.test_data)||void 0===a?void 0:a.run_data)||void 0===l?void 0:l.end_time)&&void 0!==s?s:null==e?void 0:e.modification_time,u).toDate(),sampleId:e.sample_id,startedAt:(0,n.default)(null!==(r=null===(o=null===(i=null==e?void 0:e.test_data)||void 0===i?void 0:i.run_data)||void 0===o?void 0:o.start_time)&&void 0!==r?r:null==e?void 0:e.order_time,u).toDate()}}))))}}},7978:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AnalyteResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AnalyteResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}}},{tableName:"analyte_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_analyte_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__analyte___3213E83E14E7CED0",unique:!0,fields:[{name:"id"}]}]})}}t.AnalyteResult=s},2794:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Analyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Analyte",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},analyte_index:{type:l.DataTypes.INTEGER,allowNull:!1},background_end:{type:l.DataTypes.INTEGER,allowNull:!1},background_look_back:{type:l.DataTypes.INTEGER,allowNull:!1},background_max_rms_error:{type:l.DataTypes.FLOAT,allowNull:!0},background_max_slope:{type:l.DataTypes.FLOAT,allowNull:!0},background_min_points:{type:l.DataTypes.INTEGER,allowNull:!1},background_start:{type:l.DataTypes.INTEGER,allowNull:!1},boxcar_cycles:{type:l.DataTypes.INTEGER,allowNull:!1},curve_analysis:{type:l.DataTypes.INTEGER,allowNull:!1},curve_fit_end_index:{type:l.DataTypes.INTEGER,allowNull:!0},curve_fit_max_nrse:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_slope_vs_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_min_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_start_index:{type:l.DataTypes.INTEGER,allowNull:!0},intended_concentration:{type:l.DataTypes.FLOAT,allowNull:!1},invalid_bias:{type:l.DataTypes.INTEGER,allowNull:!1},is_signal_loss_detection_enabled:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_probe_check_use_delta_pc:{type:l.DataTypes.BOOLEAN,allowNull:!1},name:{type:l.DataTypes.STRING(20),allowNull:!1},probe_check_max_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_min_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},reporter_name:{type:l.DataTypes.STRING(12),allowNull:!1},target:{type:l.DataTypes.BLOB,allowNull:!0},use_curve_fit:{type:l.DataTypes.BOOLEAN,allowNull:!1},use_curve_fit_end_data:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_curve_fit_on_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_curve_fit_start_background:{type:l.DataTypes.BOOLEAN,allowNull:!0},usage:{type:l.DataTypes.INTEGER,allowNull:!1},use_background_validation:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"analyte",schema:"dbo",timestamps:!1,indexes:[{name:"PK__analyte__3213E83F45720FCE",unique:!0,fields:[{name:"id"}]}]})}}t.Analyte=s},7237:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayChamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayChamber",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge",key:"id"}},chamber_number:{type:l.DataTypes.INTEGER,allowNull:!1},initial_volume:{type:l.DataTypes.INTEGER,allowNull:!1},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!1},name:{type:l.DataTypes.STRING(16),allowNull:!1}},{tableName:"assay_chamber",schema:"dbo",timestamps:!1,indexes:[{name:"PK__assay_ch__3213E83F3198BBBB",unique:!0,fields:[{name:"id"}]}]})}}t.AssayChamber=s},9295:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayExt=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayExt",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},position:{type:l.DataTypes.INTEGER,allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"assay_ext",schema:"dbo",timestamps:!1,indexes:[{name:"PK__assay_ex__3213E83F022A7289",unique:!0,fields:[{name:"id"}]},{name:"UX_assayext_assayid",unique:!0,fields:[{name:"assay_id"}]}]})}}t.AssayExt=s},3262:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Assay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Assay",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}},assay_index:{type:l.DataTypes.INTEGER,allowNull:!0},result_text_type:{type:l.DataTypes.INTEGER,allowNull:!0},allows_result_masking:{type:l.DataTypes.BOOLEAN,allowNull:!0},assay_lock_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_version:{type:l.DataTypes.INTEGER,allowNull:!0},command_bytes:{type:l.DataTypes.BLOB,allowNull:!0},command_sequence_format:{type:l.DataTypes.INTEGER,allowNull:!0},comments:{type:l.DataTypes.STRING(4e3),allowNull:!0},company_code:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},data_reduction_algorithm:{type:l.DataTypes.INTEGER,allowNull:!0},default_result_text_index:{type:l.DataTypes.INTEGER,allowNull:!0},default_text_color_reference:{type:l.DataTypes.INTEGER,allowNull:!0},disclaimer:{type:l.DataTypes.STRING(4e3),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_clia_waived:{type:l.DataTypes.BOOLEAN,allowNull:!0},lock_comments:{type:l.DataTypes.STRING(4e3),allowNull:!0},lock_time:{type:l.DataTypes.DATE,allowNull:!0},modification_time:{type:l.DataTypes.DATE,allowNull:!0},name:{type:l.DataTypes.STRING(32),allowNull:!1},need_lsp:{type:l.DataTypes.BOOLEAN,allowNull:!0},picture:{type:l.DataTypes.BLOB,allowNull:!0},prep_cartridge_shelf_life:{type:l.DataTypes.INTEGER,allowNull:!0},product_code:{type:l.DataTypes.INTEGER,allowNull:!0},sample_prep_instruction:{type:l.DataTypes.STRING(256),allowNull:!0},sample_prep_video:{type:l.DataTypes.BLOB,allowNull:!0},use_background_subtraction:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_melt_all_peaks:{type:l.DataTypes.BOOLEAN,allowNull:!0},melt_calculation_type:{type:l.DataTypes.INTEGER,allowNull:!0},user_name:{type:l.DataTypes.STRING(128),allowNull:!0}},{tableName:"assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__assay__3213E83FA31C85AC",unique:!0,fields:[{name:"id"}]},{name:"UX_assay_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.Assay=s},7023:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BasicOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("BasicOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}}},{tableName:"basic_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__basic_or__3213E83F1461EC00",unique:!0,fields:[{name:"id"}]}]})}}t.BasicOrganism=s},7747:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CartridgeType=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CartridgeType",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},adc_2_psi:{type:l.DataTypes.FLOAT,allowNull:!1},air_chamber:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_foot_height:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_version:{type:l.DataTypes.INTEGER,allowNull:!1},creation_time:{type:l.DataTypes.DATE,allowNull:!1},direct_flow_rate_max:{type:l.DataTypes.FLOAT,allowNull:!1},direct_flow_rate_min:{type:l.DataTypes.FLOAT,allowNull:!1},direct_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},filter_flow_rate_max:{type:l.DataTypes.FLOAT,allowNull:!1},filter_flow_rate_min:{type:l.DataTypes.FLOAT,allowNull:!1},filter_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},initial_aspirate_flow_rate:{type:l.DataTypes.FLOAT,allowNull:!1},initial_aspirate_volume:{type:l.DataTypes.INTEGER,allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},max_pressure:{type:l.DataTypes.INTEGER,allowNull:!1},microliters_per_revolution:{type:l.DataTypes.FLOAT,allowNull:!1},min_pressure:{type:l.DataTypes.INTEGER,allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1},overflow_chamber:{type:l.DataTypes.INTEGER,allowNull:!1},picture:{type:l.DataTypes.BLOB,allowNull:!0},plunger_pickup_position:{type:l.DataTypes.INTEGER,allowNull:!1},plunger_strip_position:{type:l.DataTypes.INTEGER,allowNull:!1},syringe_max_transfer_volume:{type:l.DataTypes.INTEGER,allowNull:!1},syringe_max_volume:{type:l.DataTypes.INTEGER,allowNull:!1},syringe_min_transfer_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_chamber_number:{type:l.DataTypes.INTEGER,allowNull:!1},tube_chamber_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_pressurized_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_syringe_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_volume:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"cartridge_type",schema:"dbo",timestamps:!1,indexes:[{name:"PK__cartridg__3213E83FBEDCCE47",unique:!0,fields:[{name:"id"}]},{name:"UX_cartridgetype_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.CartridgeType=s},4786:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Cartridge=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Cartridge",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},air_chamber:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_type_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge_type",key:"id"}},overflow_chamber:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"cartridge",schema:"dbo",timestamps:!1,indexes:[{name:"PK__cartridg__3213E83FC188E9DE",unique:!0,fields:[{name:"id"}]}]})}}t.Cartridge=s},72:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Chamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Chamber",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge_type",key:"id"}},chamber_number:{type:l.DataTypes.INTEGER,allowNull:!1},max_volume:{type:l.DataTypes.INTEGER,allowNull:!1},min_volume:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"chamber",schema:"dbo",timestamps:!1,indexes:[{name:"PK__chamber__3213E83F0917E88C",unique:!0,fields:[{name:"id"}]}]})}}t.Chamber=s},1245:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ChannelProcessedDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ChannelProcessedDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte_result",key:"id"}},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"channel_processed_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_channel_processed_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__channel___3213E83E2B0FCE58",unique:!0,fields:[{name:"id"}]}]})}}t.ChannelProcessedDataItem=s},2762:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ChannelRawDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ChannelRawDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"channel_raw_data",key:"id"}},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0},timestamps:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"channel_raw_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_channel_raw_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__channel___3213E83E9C17EB49",unique:!0,fields:[{name:"id"}]}]})}}t.ChannelRawDataItem=s},1843:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ChannelRawDatum=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ChannelRawDatum",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test_data",key:"id"}},protocol_number:{type:l.DataTypes.INTEGER,allowNull:!1},channel_name:{type:l.DataTypes.STRING(32),allowNull:!1}},{tableName:"channel_raw_data",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_channel_raw_data_parent_id",fields:[{name:"parent_id"}]},{name:"PK__channel___3213E83EE6BEF901",unique:!0,fields:[{name:"id"}]}]})}}t.ChannelRawDatum=s},1328:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalAnalyteDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalAnalyteDataItem",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"channel_processed_data_item",key:"id"}},organism_index:{type:l.DataTypes.INTEGER,allowNull:!0},calculation_index:{type:l.DataTypes.INTEGER,allowNull:!0},row_index:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"clinical_analyte_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F0CD269AC",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalAnalyteDataItem=s},3525:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalAnalyteResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalAnalyteResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"analyte_result",key:"id"}}},{tableName:"clinical_analyte_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FFA28E224",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalAnalyteResult=s},524:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalAssay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"clinical_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FF50319E1",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalAssay=s},9505:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalCalculationInput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalCalculationInput",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_input",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_calculation_row",key:"id"}}},{tableName:"clinical_calculation_input",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F414142BF",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalCalculationInput=s},1349:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalCalculationOutput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalCalculationOutput",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_output",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_calculation_row",key:"id"}}},{tableName:"clinical_calculation_output",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F4BBB0C99",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalCalculationOutput=s},76:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalCalculationRow=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalCalculationRow",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_calculation",key:"id"}},row_index:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_calculation_row",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F5B82DD16",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalCalculationRow=s},4944:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalCalculation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalCalculation",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_organism",key:"id"}},calculation_index:{type:l.DataTypes.INTEGER,allowNull:!1},description:{type:l.DataTypes.STRING(200),allowNull:!1},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_calculation",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F9541F948",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalCalculation=s},394:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalActionFinalResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalActionFinalResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_conditional_action",key:"id"}},result_text:{type:l.DataTypes.INTEGER,allowNull:!0},result_color:{type:l.DataTypes.INTEGER,allowNull:!1},formatted_result:{type:l.DataTypes.STRING(100),allowNull:!0}},{tableName:"clinical_conditional_action_final_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FCC4B13C0",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalActionFinalResult=s},4966:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalActionInput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalActionInput",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_input",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_conditional_action",key:"id"}}},{tableName:"clinical_conditional_action_input",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FEFE9E46E",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalActionInput=s},6025:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalActionOutput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalActionOutput",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_output",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_conditional_action",key:"id"}}},{tableName:"clinical_conditional_action_output",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F9516484F",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalActionOutput=s},1649:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalAction=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalAction",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_conditional_row",key:"id"}},action_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_conditional_action",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F4F69BFC0",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalAction=s},1737:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalCellBoolean=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalCellBoolean",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_conditional_cell",key:"id"}},pass_on_true:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"clinical_conditional_cell_boolean",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F77B37E6A",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalCellBoolean=s},396:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalCellInput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalCellInput",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_input",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_conditional_cell",key:"id"}}},{tableName:"clinical_conditional_cell_input",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F7103405A",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalCellInput=s},6199:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalCellNumeric=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalCellNumeric",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_conditional_cell",key:"id"}},comparator:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_conditional_cell_numeric",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FA2655DA8",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalCellNumeric=s},8085:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalCell=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalCell",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_conditional_row",key:"id"}},cell_index:{type:l.DataTypes.INTEGER,allowNull:!1},cell_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_conditional_cell",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F03BC1C65",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalCell=s},7243:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalRow=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalRow",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_calculation",key:"id"}},row_index:{type:l.DataTypes.INTEGER,allowNull:!1},anded:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"clinical_conditional_row",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F8B8030AD",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalRow=s},8263:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalDataItemHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalDataItemHistory",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_test_history",key:"id"}},assay_index:{type:l.DataTypes.INTEGER,allowNull:!0},item_type:{type:l.DataTypes.INTEGER,allowNull:!1},item_index:{type:l.DataTypes.INTEGER,allowNull:!1},item_name:{type:l.DataTypes.STRING(64),allowNull:!1},item_value:{type:l.DataTypes.TEXT,allowNull:!1}},{tableName:"clinical_data_item_history",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_clinical_data_item_history_parent_id",fields:[{name:"parent_id"}]},{name:"PK__clinical__3213E83E85137B98",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalDataItemHistory=s},9838:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorChoiceValue=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorChoiceValue",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_factor",key:"id"}},description:{type:l.DataTypes.STRING(200),allowNull:!1},value_index:{type:l.DataTypes.INTEGER,allowNull:!1},value:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"clinical_factor_choice_value",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F86CD6890",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorChoiceValue=s},1387:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorDouble=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorDouble",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_factor",key:"id"}},max_value:{type:l.DataTypes.FLOAT,allowNull:!0},max_inclusive:{type:l.DataTypes.BOOLEAN,allowNull:!0},min_value:{type:l.DataTypes.FLOAT,allowNull:!0},min_inclusive:{type:l.DataTypes.BOOLEAN,allowNull:!0},scale:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_factor_double",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F9FC35501",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorDouble=s},7308:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorHistory",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_test_history",key:"id"}},factor_index:{type:l.DataTypes.INTEGER,allowNull:!1},factor_value:{type:l.DataTypes.TEXT,allowNull:!0}},{tableName:"clinical_factor_history",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_clinical_factor_history_parent_id",fields:[{name:"parent_id"}]},{name:"PK__clinical__3213E83E8816DFD4",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorHistory=s},165:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorInteger=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorInteger",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_factor",key:"id"}},max_value:{type:l.DataTypes.INTEGER,allowNull:!0},max_inclusive:{type:l.DataTypes.BOOLEAN,allowNull:!0},min_value:{type:l.DataTypes.INTEGER,allowNull:!0},min_inclusive:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"clinical_factor_integer",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F5DE2C715",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorInteger=s},8127:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorIntervalRange=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorIntervalRange",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_factor",key:"id"}},max_value:{type:l.DataTypes.FLOAT,allowNull:!0},max_inclusive:{type:l.DataTypes.BOOLEAN,allowNull:!0},min_value:{type:l.DataTypes.FLOAT,allowNull:!0},min_inclusive:{type:l.DataTypes.BOOLEAN,allowNull:!0},range_index:{type:l.DataTypes.INTEGER,allowNull:!1},value:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"clinical_factor_interval_range",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FCDBAF07C",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorIntervalRange=s},2995:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorInterval=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorInterval",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_factor",key:"id"}},scale:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_factor_interval",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F6C72855B",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorInterval=s},7395:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorText",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_factor",key:"id"}},max_length:{type:l.DataTypes.INTEGER,allowNull:!0},min_length:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"clinical_factor_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F438B66D2",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorText=s},2327:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorValue=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorValue",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},factor_index:{type:l.DataTypes.INTEGER,allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0}},{tableName:"clinical_factor_value",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_clinical_factor_value_parent_id",fields:[{name:"parent_id"}]},{name:"PK__clinical__3213E83E8C7743F0",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorValue=s},6072:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactor=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactor",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},type:{type:l.DataTypes.INTEGER,allowNull:!1},factor_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1},required:{type:l.DataTypes.BOOLEAN,allowNull:!1},reportable:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"clinical_factor",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F6E1A38C3",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactor=s},8206:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalInput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalInput",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_index:{type:l.DataTypes.INTEGER,allowNull:!0},input_index:{type:l.DataTypes.INTEGER,allowNull:!1},item_index:{type:l.DataTypes.INTEGER,allowNull:!0},item_name:{type:l.DataTypes.STRING(64),allowNull:!0},item_type:{type:l.DataTypes.INTEGER,allowNull:!1},item_value:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"clinical_input",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F74FD12D5",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalInput=s},4411:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalOrganismDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalOrganismDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_organism_result",key:"id"}},calculation_index:{type:l.DataTypes.INTEGER,allowNull:!1},row_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0}},{tableName:"clinical_organism_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_clinical_organism_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__clinical__3213E83E7D5A9F8B",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalOrganismDataItem=s},2837:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},formatted_result:{type:l.DataTypes.TEXT,allowNull:!0}},{tableName:"clinical_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F0BF84811",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalOrganismResult=s},823:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}}},{tableName:"clinical_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F91CC7040",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalOrganism=s},9554:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalOutput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalOutput",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_index:{type:l.DataTypes.INTEGER,allowNull:!0},item_type:{type:l.DataTypes.INTEGER,allowNull:!1},item_index:{type:l.DataTypes.INTEGER,allowNull:!1},output_name:{type:l.DataTypes.STRING(64),allowNull:!1},scale:{type:l.DataTypes.INTEGER,allowNull:!1},persisted:{type:l.DataTypes.BOOLEAN,allowNull:!1},reportable:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"clinical_output",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F14B9ED43",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalOutput=s},1491:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalReagentLot",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"reagent_lot",key:"id"}}},{tableName:"clinical_reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F4E29E422",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalReagentLot=s},3999:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalSampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalSampleSetting",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"sample_setting",key:"id"}},lsp1:{type:l.DataTypes.FLOAT,allowNull:!0},lsp2:{type:l.DataTypes.FLOAT,allowNull:!0},lsp3:{type:l.DataTypes.FLOAT,allowNull:!0},lsp4:{type:l.DataTypes.FLOAT,allowNull:!0},lsp5:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"clinical_sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FD8FB1F3C",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalSampleSetting=s},6277:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalTestHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalTestHistory",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"test_history",key:"id"}},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_color:{type:l.DataTypes.TEXT,allowNull:!0},change_notes:{type:l.DataTypes.STRING(512),allowNull:!0}},{tableName:"clinical_test_history",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FE9C5E368",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalTestHistory=s},9891:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorDisclaimer=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ColorDisclaimer",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},color:{type:l.DataTypes.INTEGER,allowNull:!1},disclaimer:{type:l.DataTypes.STRING(256),allowNull:!0}},{tableName:"color_disclaimer",schema:"dbo",timestamps:!1,indexes:[{name:"PK__color_di__3213E83FAE3B421D",unique:!0,fields:[{name:"id"}]}]})}}t.ColorDisclaimer=s},2469:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Config",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},param_key:{type:l.DataTypes.STRING(64),allowNull:!0},param_val:{type:l.DataTypes.STRING(512),allowNull:!0}},{tableName:"config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__config__3213E83FC1650530",unique:!0,fields:[{name:"id"}]},{name:"UX_config_paramkey",unique:!0,fields:[{name:"param_key"}]}]})}}t.Config=s},1630:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CrosstalkCorrResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CrosstalkCorrResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte_result",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte",key:"id"}},protocol_index:{type:l.DataTypes.INTEGER,allowNull:!1},ignore_code:{type:l.DataTypes.STRING(64),allowNull:!1},correlation_slope:{type:l.DataTypes.FLOAT,allowNull:!0},correlation_r2:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"crosstalk_corr_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_crosstalk_corr_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__crosstal__3213E83E0C67F430",unique:!0,fields:[{name:"id"}]}]})}}t.CrosstalkCorrResult=s},611:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DeltaCtOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("DeltaCtOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"basic_organism",key:"id"}},delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!1},delta_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"delta_ct_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__delta_ct__3213E83F4A8FAF95",unique:!0,fields:[{name:"id"}]}]})}}t.DeltaCtOrganism=s},6688:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DisabledModule=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("DisabledModule",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!1},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"disabled_module",schema:"dbo",timestamps:!1,indexes:[{name:"PK__disabled__3213E83F9BC346A8",unique:!0,fields:[{name:"id"}]},{name:"UX_disabledmodule_siteserialnumber",unique:!0,fields:[{name:"site_serial_number"}]}]})}}t.DisabledModule=s},6778:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingHaplotypeOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingHaplotypeOrganism",{haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"haplotype",key:"id"}},genotyping_organism_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"genotyping_organism",key:"id"}}},{tableName:"genotyping_haplotype_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__060A713D62762933",unique:!0,fields:[{name:"haplotype_id"},{name:"genotyping_organism_id"}]},{name:"UX_gho_haplotypeid_genotypingorganismid",unique:!0,fields:[{name:"haplotype_id"},{name:"genotyping_organism_id"}]}]})}}t.GenotypingHaplotypeOrganism=s},6331:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}}},{tableName:"genotyping_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__3213E83F30C3A17A",unique:!0,fields:[{name:"id"}]}]})}}t.GenotypingOrganismResult=s},4037:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},early_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!1},late_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"genotyping_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__3213E83FE30FD201",unique:!0,fields:[{name:"id"}]}]})}}t.GenotypingOrganism=s},9059:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetupAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetupAssay",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},graph_setup_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"graph_setup",key:"id"}},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}}},{tableName:"graph_setup_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__graph_se__3213E83FD6372598",unique:!0,fields:[{name:"id"}]},{name:"UX_graphsetupassay_graphsetupid_assayid",unique:!0,fields:[{name:"graph_setup_id"},{name:"assay_id"}]}]})}}t.GraphSetupAssay=s},6898:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetup",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},graph_type:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!1},is_default:{type:l.DataTypes.BOOLEAN,allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1}},{tableName:"graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__graph_se__3213E83F9C07A4B9",unique:!0,fields:[{name:"id"}]}]})}}t.GraphSetup=s},6919:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.HaplotypeResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("HaplotypeResultText",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"haplotype",key:"id"}},alleles_text1:{type:l.DataTypes.STRING(10),allowNull:!1},alleles_text2:{type:l.DataTypes.STRING(10),allowNull:!1},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(11),allowNull:!1},text_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"haplotype_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK__haplotyp__3213E83F72031D90",unique:!0,fields:[{name:"id"}]}]})}}t.HaplotypeResultText=s},8932:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.HaplotypeResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("HaplotypeResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"haplotype",key:"id"}},allele1_text:{type:l.DataTypes.TEXT,allowNull:!1},allele2_text:{type:l.DataTypes.TEXT,allowNull:!1},result_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"haplotype_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_haplotype_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__haplotyp__3213E83E3CD9584C",unique:!0,fields:[{name:"id"}]}]})}}t.HaplotypeResult=s},904:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Haplotype=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Haplotype",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},haplotype_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(20),allowNull:!1}},{tableName:"haplotype",schema:"dbo",timestamps:!1,indexes:[{name:"PK__haplotyp__3213E83FF5494E7E",unique:!0,fields:[{name:"id"}]}]})}}t.Haplotype=s},7228:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DeltaCtOrganism=t.CrosstalkCorrResult=t.Config=t.ColorDisclaimer=t.ClinicalTestHistory=t.ClinicalSampleSetting=t.ClinicalReagentLot=t.ClinicalOutput=t.ClinicalOrganismResult=t.ClinicalOrganismDataItem=t.ClinicalOrganism=t.ClinicalInput=t.ClinicalFactorValue=t.ClinicalFactorText=t.ClinicalFactorIntervalRange=t.ClinicalFactorInterval=t.ClinicalFactorInteger=t.ClinicalFactorHistory=t.ClinicalFactorDouble=t.ClinicalFactorChoiceValue=t.ClinicalFactor=t.ClinicalDataItemHistory=t.ClinicalConditionalRow=t.ClinicalConditionalCellNumeric=t.ClinicalConditionalCellInput=t.ClinicalConditionalCellBoolean=t.ClinicalConditionalCell=t.ClinicalConditionalActionOutput=t.ClinicalConditionalActionInput=t.ClinicalConditionalActionFinalResult=t.ClinicalConditionalAction=t.ClinicalCalculationRow=t.ClinicalCalculationOutput=t.ClinicalCalculationInput=t.ClinicalCalculation=t.ClinicalAssay=t.ClinicalAnalyteResult=t.ClinicalAnalyteDataItem=t.ChannelRawDataItem=t.ChannelRawDatum=t.ChannelProcessedDataItem=t.Chamber=t.CartridgeType=t.Cartridge=t.BasicOrganism=t.AssayExt=t.AssayChamber=t.Assay=t.AnalyteResult=t.Analyte=void 0,t.Reporter=t.ReportGraphSetting=t.ReagentLot=t.RawDataItem=t.QuantUnitSetting=t.Quant1SampleSetting=t.Quant1Result=t.Quant1ReagentLot=t.Quant1OrganismResult=t.Quant1Organism=t.QcTest=t.QcResult=t.QcLockoutSetting=t.PressureGraphSetup=t.PercentRatioSampleSetting=t.PercentRatioResultEvaluator=t.PercentRatioReagentLot=t.PercentRatioOrganismResult=t.PercentRatioOrganism=t.Patient=t.Path=t.OrganismTarget=t.OrganismResultText=t.OrganismResult=t.OrganismBasedOrganismResult=t.Organism=t.OpticsGraphSetup=t.MeltPeakSetting=t.MeltPeakResult=t.MeltGraphSetup=t.LisUpload=t.LisTestOrder=t.LisOrganismConfig=t.LisHaplotypeConfig=t.LisGenotypingAssayConfig=t.LisAssayConfig=t.LdaOrganismResult=t.LdaOrganism=t.LdaCoefficient=t.LdaAnalyte=t.Instrument=t.HaplotypeResultText=t.HaplotypeResult=t.Haplotype=t.GraphSetupAssay=t.GraphSetup=t.GenotypingOrganismResult=t.GenotypingOrganism=t.GenotypingHaplotypeOrganism=t.DisabledModule=void 0,t.initModels=t.User=t.UserPrivilege=t.UserLockout=t.UserExt=t.UltrasonicGraphSetup=t.TestHistory=t.TestExt=t.TestError=t.TestDataError=t.TestDatum=t.TestBlogCounter=t.TestBlog=t.Test=t.TemperatureGraphSetup=t.TargetBasedOrganism=t.SystemLog=t.SemiQuantOrganism=t.SelectedQuantUnitSetting=t.SampleType=t.SampleSetting=t.RunDatum=t.ResultRuleMeltPeak=t.ResultRuleInterpretation=t.ResultRuleAnalyte=t.ResultMaskingConfig=t.ResultEvaluator=t.ResultCalculation=void 0;const l=a(2794);Object.defineProperty(t,"Analyte",{enumerable:!0,get:function(){return l.Analyte}});const s=a(7978);Object.defineProperty(t,"AnalyteResult",{enumerable:!0,get:function(){return s.AnalyteResult}});const n=a(3262);Object.defineProperty(t,"Assay",{enumerable:!0,get:function(){return n.Assay}});const i=a(7237);Object.defineProperty(t,"AssayChamber",{enumerable:!0,get:function(){return i.AssayChamber}});const o=a(9295);Object.defineProperty(t,"AssayExt",{enumerable:!0,get:function(){return o.AssayExt}});const r=a(7023);Object.defineProperty(t,"BasicOrganism",{enumerable:!0,get:function(){return r.BasicOrganism}});const p=a(4786);Object.defineProperty(t,"Cartridge",{enumerable:!0,get:function(){return p.Cartridge}});const u=a(7747);Object.defineProperty(t,"CartridgeType",{enumerable:!0,get:function(){return u.CartridgeType}});const d=a(72);Object.defineProperty(t,"Chamber",{enumerable:!0,get:function(){return d.Chamber}});const y=a(1245);Object.defineProperty(t,"ChannelProcessedDataItem",{enumerable:!0,get:function(){return y.ChannelProcessedDataItem}});const _=a(1843);Object.defineProperty(t,"ChannelRawDatum",{enumerable:!0,get:function(){return _.ChannelRawDatum}});const m=a(2762);Object.defineProperty(t,"ChannelRawDataItem",{enumerable:!0,get:function(){return m.ChannelRawDataItem}});const c=a(1328);Object.defineProperty(t,"ClinicalAnalyteDataItem",{enumerable:!0,get:function(){return c.ClinicalAnalyteDataItem}});const T=a(3525);Object.defineProperty(t,"ClinicalAnalyteResult",{enumerable:!0,get:function(){return T.ClinicalAnalyteResult}});const N=a(524);Object.defineProperty(t,"ClinicalAssay",{enumerable:!0,get:function(){return N.ClinicalAssay}});const g=a(4944);Object.defineProperty(t,"ClinicalCalculation",{enumerable:!0,get:function(){return g.ClinicalCalculation}});const f=a(9505);Object.defineProperty(t,"ClinicalCalculationInput",{enumerable:!0,get:function(){return f.ClinicalCalculationInput}});const D=a(1349);Object.defineProperty(t,"ClinicalCalculationOutput",{enumerable:!0,get:function(){return D.ClinicalCalculationOutput}});const E=a(76);Object.defineProperty(t,"ClinicalCalculationRow",{enumerable:!0,get:function(){return E.ClinicalCalculationRow}});const b=a(1649);Object.defineProperty(t,"ClinicalConditionalAction",{enumerable:!0,get:function(){return b.ClinicalConditionalAction}});const w=a(394);Object.defineProperty(t,"ClinicalConditionalActionFinalResult",{enumerable:!0,get:function(){return w.ClinicalConditionalActionFinalResult}});const I=a(4966);Object.defineProperty(t,"ClinicalConditionalActionInput",{enumerable:!0,get:function(){return I.ClinicalConditionalActionInput}});const R=a(6025);Object.defineProperty(t,"ClinicalConditionalActionOutput",{enumerable:!0,get:function(){return R.ClinicalConditionalActionOutput}});const O=a(8085);Object.defineProperty(t,"ClinicalConditionalCell",{enumerable:!0,get:function(){return O.ClinicalConditionalCell}});const h=a(1737);Object.defineProperty(t,"ClinicalConditionalCellBoolean",{enumerable:!0,get:function(){return h.ClinicalConditionalCellBoolean}});const M=a(396);Object.defineProperty(t,"ClinicalConditionalCellInput",{enumerable:!0,get:function(){return M.ClinicalConditionalCellInput}});const G=a(6199);Object.defineProperty(t,"ClinicalConditionalCellNumeric",{enumerable:!0,get:function(){return G.ClinicalConditionalCellNumeric}});const v=a(7243);Object.defineProperty(t,"ClinicalConditionalRow",{enumerable:!0,get:function(){return v.ClinicalConditionalRow}});const S=a(8263);Object.defineProperty(t,"ClinicalDataItemHistory",{enumerable:!0,get:function(){return S.ClinicalDataItemHistory}});const A=a(6072);Object.defineProperty(t,"ClinicalFactor",{enumerable:!0,get:function(){return A.ClinicalFactor}});const P=a(9838);Object.defineProperty(t,"ClinicalFactorChoiceValue",{enumerable:!0,get:function(){return P.ClinicalFactorChoiceValue}});const L=a(1387);Object.defineProperty(t,"ClinicalFactorDouble",{enumerable:!0,get:function(){return L.ClinicalFactorDouble}});const C=a(7308);Object.defineProperty(t,"ClinicalFactorHistory",{enumerable:!0,get:function(){return C.ClinicalFactorHistory}});const K=a(165);Object.defineProperty(t,"ClinicalFactorInteger",{enumerable:!0,get:function(){return K.ClinicalFactorInteger}});const x=a(2995);Object.defineProperty(t,"ClinicalFactorInterval",{enumerable:!0,get:function(){return x.ClinicalFactorInterval}});const j=a(8127);Object.defineProperty(t,"ClinicalFactorIntervalRange",{enumerable:!0,get:function(){return j.ClinicalFactorIntervalRange}});const q=a(7395);Object.defineProperty(t,"ClinicalFactorText",{enumerable:!0,get:function(){return q.ClinicalFactorText}});const k=a(2327);Object.defineProperty(t,"ClinicalFactorValue",{enumerable:!0,get:function(){return k.ClinicalFactorValue}});const F=a(8206);Object.defineProperty(t,"ClinicalInput",{enumerable:!0,get:function(){return F.ClinicalInput}});const B=a(823);Object.defineProperty(t,"ClinicalOrganism",{enumerable:!0,get:function(){return B.ClinicalOrganism}});const Q=a(4411);Object.defineProperty(t,"ClinicalOrganismDataItem",{enumerable:!0,get:function(){return Q.ClinicalOrganismDataItem}});const U=a(2837);Object.defineProperty(t,"ClinicalOrganismResult",{enumerable:!0,get:function(){return U.ClinicalOrganismResult}});const H=a(9554);Object.defineProperty(t,"ClinicalOutput",{enumerable:!0,get:function(){return H.ClinicalOutput}});const X=a(1491);Object.defineProperty(t,"ClinicalReagentLot",{enumerable:!0,get:function(){return X.ClinicalReagentLot}});const V=a(3999);Object.defineProperty(t,"ClinicalSampleSetting",{enumerable:!0,get:function(){return V.ClinicalSampleSetting}});const z=a(6277);Object.defineProperty(t,"ClinicalTestHistory",{enumerable:!0,get:function(){return z.ClinicalTestHistory}});const J=a(9891);Object.defineProperty(t,"ColorDisclaimer",{enumerable:!0,get:function(){return J.ColorDisclaimer}});const $=a(2469);Object.defineProperty(t,"Config",{enumerable:!0,get:function(){return $.Config}});const Y=a(1630);Object.defineProperty(t,"CrosstalkCorrResult",{enumerable:!0,get:function(){return Y.CrosstalkCorrResult}});const W=a(611);Object.defineProperty(t,"DeltaCtOrganism",{enumerable:!0,get:function(){return W.DeltaCtOrganism}});const Z=a(6688);Object.defineProperty(t,"DisabledModule",{enumerable:!0,get:function(){return Z.DisabledModule}});const ee=a(6778);Object.defineProperty(t,"GenotypingHaplotypeOrganism",{enumerable:!0,get:function(){return ee.GenotypingHaplotypeOrganism}});const te=a(4037);Object.defineProperty(t,"GenotypingOrganism",{enumerable:!0,get:function(){return te.GenotypingOrganism}});const ae=a(6331);Object.defineProperty(t,"GenotypingOrganismResult",{enumerable:!0,get:function(){return ae.GenotypingOrganismResult}});const le=a(6898);Object.defineProperty(t,"GraphSetup",{enumerable:!0,get:function(){return le.GraphSetup}});const se=a(9059);Object.defineProperty(t,"GraphSetupAssay",{enumerable:!0,get:function(){return se.GraphSetupAssay}});const ne=a(904);Object.defineProperty(t,"Haplotype",{enumerable:!0,get:function(){return ne.Haplotype}});const ie=a(8932);Object.defineProperty(t,"HaplotypeResult",{enumerable:!0,get:function(){return ie.HaplotypeResult}});const oe=a(6919);Object.defineProperty(t,"HaplotypeResultText",{enumerable:!0,get:function(){return oe.HaplotypeResultText}});const re=a(5160);Object.defineProperty(t,"Instrument",{enumerable:!0,get:function(){return re.Instrument}});const pe=a(1608);Object.defineProperty(t,"LdaAnalyte",{enumerable:!0,get:function(){return pe.LdaAnalyte}});const ue=a(7176);Object.defineProperty(t,"LdaCoefficient",{enumerable:!0,get:function(){return ue.LdaCoefficient}});const de=a(8529);Object.defineProperty(t,"LdaOrganism",{enumerable:!0,get:function(){return de.LdaOrganism}});const ye=a(7853);Object.defineProperty(t,"LdaOrganismResult",{enumerable:!0,get:function(){return ye.LdaOrganismResult}});const _e=a(625);Object.defineProperty(t,"LisAssayConfig",{enumerable:!0,get:function(){return _e.LisAssayConfig}});const me=a(6465);Object.defineProperty(t,"LisGenotypingAssayConfig",{enumerable:!0,get:function(){return me.LisGenotypingAssayConfig}});const ce=a(7946);Object.defineProperty(t,"LisHaplotypeConfig",{enumerable:!0,get:function(){return ce.LisHaplotypeConfig}});const Te=a(672);Object.defineProperty(t,"LisOrganismConfig",{enumerable:!0,get:function(){return Te.LisOrganismConfig}});const Ne=a(2938);Object.defineProperty(t,"LisTestOrder",{enumerable:!0,get:function(){return Ne.LisTestOrder}});const ge=a(6522);Object.defineProperty(t,"LisUpload",{enumerable:!0,get:function(){return ge.LisUpload}});const fe=a(6611);Object.defineProperty(t,"MeltGraphSetup",{enumerable:!0,get:function(){return fe.MeltGraphSetup}});const De=a(227);Object.defineProperty(t,"MeltPeakResult",{enumerable:!0,get:function(){return De.MeltPeakResult}});const Ee=a(9073);Object.defineProperty(t,"MeltPeakSetting",{enumerable:!0,get:function(){return Ee.MeltPeakSetting}});const be=a(8396);Object.defineProperty(t,"OpticsGraphSetup",{enumerable:!0,get:function(){return be.OpticsGraphSetup}});const we=a(848);Object.defineProperty(t,"Organism",{enumerable:!0,get:function(){return we.Organism}});const Ie=a(7029);Object.defineProperty(t,"OrganismBasedOrganismResult",{enumerable:!0,get:function(){return Ie.OrganismBasedOrganismResult}});const Re=a(4701);Object.defineProperty(t,"OrganismResult",{enumerable:!0,get:function(){return Re.OrganismResult}});const Oe=a(2677);Object.defineProperty(t,"OrganismResultText",{enumerable:!0,get:function(){return Oe.OrganismResultText}});const he=a(8456);Object.defineProperty(t,"OrganismTarget",{enumerable:!0,get:function(){return he.OrganismTarget}});const Me=a(7762);Object.defineProperty(t,"Path",{enumerable:!0,get:function(){return Me.Path}});const Ge=a(2157);Object.defineProperty(t,"Patient",{enumerable:!0,get:function(){return Ge.Patient}});const ve=a(8967);Object.defineProperty(t,"PercentRatioOrganism",{enumerable:!0,get:function(){return ve.PercentRatioOrganism}});const Se=a(1604);Object.defineProperty(t,"PercentRatioOrganismResult",{enumerable:!0,get:function(){return Se.PercentRatioOrganismResult}});const Ae=a(7189);Object.defineProperty(t,"PercentRatioReagentLot",{enumerable:!0,get:function(){return Ae.PercentRatioReagentLot}});const Pe=a(8524);Object.defineProperty(t,"PercentRatioResultEvaluator",{enumerable:!0,get:function(){return Pe.PercentRatioResultEvaluator}});const Le=a(7287);Object.defineProperty(t,"PercentRatioSampleSetting",{enumerable:!0,get:function(){return Le.PercentRatioSampleSetting}});const Ce=a(459);Object.defineProperty(t,"PressureGraphSetup",{enumerable:!0,get:function(){return Ce.PressureGraphSetup}});const Ke=a(5503);Object.defineProperty(t,"QcLockoutSetting",{enumerable:!0,get:function(){return Ke.QcLockoutSetting}});const xe=a(2190);Object.defineProperty(t,"QcResult",{enumerable:!0,get:function(){return xe.QcResult}});const je=a(4230);Object.defineProperty(t,"QcTest",{enumerable:!0,get:function(){return je.QcTest}});const qe=a(7284);Object.defineProperty(t,"Quant1Organism",{enumerable:!0,get:function(){return qe.Quant1Organism}});const ke=a(6774);Object.defineProperty(t,"Quant1OrganismResult",{enumerable:!0,get:function(){return ke.Quant1OrganismResult}});const Fe=a(8925);Object.defineProperty(t,"Quant1ReagentLot",{enumerable:!0,get:function(){return Fe.Quant1ReagentLot}});const Be=a(7795);Object.defineProperty(t,"Quant1Result",{enumerable:!0,get:function(){return Be.Quant1Result}});const Qe=a(6977);Object.defineProperty(t,"Quant1SampleSetting",{enumerable:!0,get:function(){return Qe.Quant1SampleSetting}});const Ue=a(589);Object.defineProperty(t,"QuantUnitSetting",{enumerable:!0,get:function(){return Ue.QuantUnitSetting}});const He=a(2132);Object.defineProperty(t,"RawDataItem",{enumerable:!0,get:function(){return He.RawDataItem}});const Xe=a(9092);Object.defineProperty(t,"ReagentLot",{enumerable:!0,get:function(){return Xe.ReagentLot}});const Ve=a(5076);Object.defineProperty(t,"ReportGraphSetting",{enumerable:!0,get:function(){return Ve.ReportGraphSetting}});const ze=a(617);Object.defineProperty(t,"Reporter",{enumerable:!0,get:function(){return ze.Reporter}});const Je=a(3513);Object.defineProperty(t,"ResultCalculation",{enumerable:!0,get:function(){return Je.ResultCalculation}});const $e=a(7014);Object.defineProperty(t,"ResultEvaluator",{enumerable:!0,get:function(){return $e.ResultEvaluator}});const Ye=a(8770);Object.defineProperty(t,"ResultMaskingConfig",{enumerable:!0,get:function(){return Ye.ResultMaskingConfig}});const We=a(6430);Object.defineProperty(t,"ResultRuleAnalyte",{enumerable:!0,get:function(){return We.ResultRuleAnalyte}});const Ze=a(872);Object.defineProperty(t,"ResultRuleInterpretation",{enumerable:!0,get:function(){return Ze.ResultRuleInterpretation}});const et=a(3051);Object.defineProperty(t,"ResultRuleMeltPeak",{enumerable:!0,get:function(){return et.ResultRuleMeltPeak}});const tt=a(2658);Object.defineProperty(t,"RunDatum",{enumerable:!0,get:function(){return tt.RunDatum}});const at=a(591);Object.defineProperty(t,"SampleSetting",{enumerable:!0,get:function(){return at.SampleSetting}});const lt=a(7919);Object.defineProperty(t,"SampleType",{enumerable:!0,get:function(){return lt.SampleType}});const st=a(7167);Object.defineProperty(t,"SelectedQuantUnitSetting",{enumerable:!0,get:function(){return st.SelectedQuantUnitSetting}});const nt=a(7020);Object.defineProperty(t,"SemiQuantOrganism",{enumerable:!0,get:function(){return nt.SemiQuantOrganism}});const it=a(4617);Object.defineProperty(t,"SystemLog",{enumerable:!0,get:function(){return it.SystemLog}});const ot=a(922);Object.defineProperty(t,"TargetBasedOrganism",{enumerable:!0,get:function(){return ot.TargetBasedOrganism}});const rt=a(7571);Object.defineProperty(t,"TemperatureGraphSetup",{enumerable:!0,get:function(){return rt.TemperatureGraphSetup}});const pt=a(1731);Object.defineProperty(t,"Test",{enumerable:!0,get:function(){return pt.Test}});const ut=a(4715);Object.defineProperty(t,"TestBlog",{enumerable:!0,get:function(){return ut.TestBlog}});const dt=a(248);Object.defineProperty(t,"TestBlogCounter",{enumerable:!0,get:function(){return dt.TestBlogCounter}});const yt=a(4309);Object.defineProperty(t,"TestDatum",{enumerable:!0,get:function(){return yt.TestDatum}});const _t=a(196);Object.defineProperty(t,"TestDataError",{enumerable:!0,get:function(){return _t.TestDataError}});const mt=a(1591);Object.defineProperty(t,"TestError",{enumerable:!0,get:function(){return mt.TestError}});const ct=a(5748);Object.defineProperty(t,"TestExt",{enumerable:!0,get:function(){return ct.TestExt}});const Tt=a(1396);Object.defineProperty(t,"TestHistory",{enumerable:!0,get:function(){return Tt.TestHistory}});const Nt=a(2535);Object.defineProperty(t,"UltrasonicGraphSetup",{enumerable:!0,get:function(){return Nt.UltrasonicGraphSetup}});const gt=a(9884);Object.defineProperty(t,"UserExt",{enumerable:!0,get:function(){return gt.UserExt}});const ft=a(6772);Object.defineProperty(t,"UserLockout",{enumerable:!0,get:function(){return ft.UserLockout}});const Dt=a(1701);Object.defineProperty(t,"UserPrivilege",{enumerable:!0,get:function(){return Dt.UserPrivilege}});const Et=a(8655);Object.defineProperty(t,"User",{enumerable:!0,get:function(){return Et.User}}),t.initModels=function(e){const t=l.Analyte.initModel(e),a=s.AnalyteResult.initModel(e),bt=n.Assay.initModel(e),wt=i.AssayChamber.initModel(e),It=o.AssayExt.initModel(e),Rt=r.BasicOrganism.initModel(e),Ot=p.Cartridge.initModel(e),ht=u.CartridgeType.initModel(e),Mt=d.Chamber.initModel(e),Gt=y.ChannelProcessedDataItem.initModel(e),vt=_.ChannelRawDatum.initModel(e),St=m.ChannelRawDataItem.initModel(e),At=c.ClinicalAnalyteDataItem.initModel(e),Pt=T.ClinicalAnalyteResult.initModel(e),Lt=N.ClinicalAssay.initModel(e),Ct=g.ClinicalCalculation.initModel(e),Kt=f.ClinicalCalculationInput.initModel(e),xt=D.ClinicalCalculationOutput.initModel(e),jt=E.ClinicalCalculationRow.initModel(e),qt=b.ClinicalConditionalAction.initModel(e),kt=w.ClinicalConditionalActionFinalResult.initModel(e),Ft=I.ClinicalConditionalActionInput.initModel(e),Bt=R.ClinicalConditionalActionOutput.initModel(e),Qt=O.ClinicalConditionalCell.initModel(e),Ut=h.ClinicalConditionalCellBoolean.initModel(e),Ht=M.ClinicalConditionalCellInput.initModel(e),Xt=G.ClinicalConditionalCellNumeric.initModel(e),Vt=v.ClinicalConditionalRow.initModel(e),zt=S.ClinicalDataItemHistory.initModel(e),Jt=A.ClinicalFactor.initModel(e),$t=P.ClinicalFactorChoiceValue.initModel(e),Yt=L.ClinicalFactorDouble.initModel(e),Wt=C.ClinicalFactorHistory.initModel(e),Zt=K.ClinicalFactorInteger.initModel(e),ea=x.ClinicalFactorInterval.initModel(e),ta=j.ClinicalFactorIntervalRange.initModel(e),aa=q.ClinicalFactorText.initModel(e),la=k.ClinicalFactorValue.initModel(e),sa=F.ClinicalInput.initModel(e),na=B.ClinicalOrganism.initModel(e),ia=Q.ClinicalOrganismDataItem.initModel(e),oa=U.ClinicalOrganismResult.initModel(e),ra=H.ClinicalOutput.initModel(e),pa=X.ClinicalReagentLot.initModel(e),ua=V.ClinicalSampleSetting.initModel(e),da=z.ClinicalTestHistory.initModel(e),ya=J.ColorDisclaimer.initModel(e),_a=$.Config.initModel(e),ma=Y.CrosstalkCorrResult.initModel(e),ca=W.DeltaCtOrganism.initModel(e),Ta=Z.DisabledModule.initModel(e),Na=ee.GenotypingHaplotypeOrganism.initModel(e),ga=te.GenotypingOrganism.initModel(e),fa=ae.GenotypingOrganismResult.initModel(e),Da=le.GraphSetup.initModel(e),Ea=se.GraphSetupAssay.initModel(e),ba=ne.Haplotype.initModel(e),wa=ie.HaplotypeResult.initModel(e),Ia=oe.HaplotypeResultText.initModel(e),Ra=re.Instrument.initModel(e),Oa=pe.LdaAnalyte.initModel(e),ha=ue.LdaCoefficient.initModel(e),Ma=de.LdaOrganism.initModel(e),Ga=ye.LdaOrganismResult.initModel(e),va=_e.LisAssayConfig.initModel(e),Sa=me.LisGenotypingAssayConfig.initModel(e),Aa=ce.LisHaplotypeConfig.initModel(e),Pa=Te.LisOrganismConfig.initModel(e),La=Ne.LisTestOrder.initModel(e),Ca=ge.LisUpload.initModel(e),Ka=fe.MeltGraphSetup.initModel(e),xa=De.MeltPeakResult.initModel(e),ja=Ee.MeltPeakSetting.initModel(e),qa=be.OpticsGraphSetup.initModel(e),ka=we.Organism.initModel(e),Fa=Ie.OrganismBasedOrganismResult.initModel(e),Ba=Re.OrganismResult.initModel(e),Qa=Oe.OrganismResultText.initModel(e),Ua=he.OrganismTarget.initModel(e),Ha=Me.Path.initModel(e),Xa=Ge.Patient.initModel(e),Va=ve.PercentRatioOrganism.initModel(e),za=Se.PercentRatioOrganismResult.initModel(e),Ja=Ae.PercentRatioReagentLot.initModel(e),$a=Pe.PercentRatioResultEvaluator.initModel(e),Ya=Le.PercentRatioSampleSetting.initModel(e),Wa=Ce.PressureGraphSetup.initModel(e),Za=Ke.QcLockoutSetting.initModel(e),el=xe.QcResult.initModel(e),tl=je.QcTest.initModel(e),al=qe.Quant1Organism.initModel(e),ll=ke.Quant1OrganismResult.initModel(e),sl=Fe.Quant1ReagentLot.initModel(e),nl=Be.Quant1Result.initModel(e),il=Qe.Quant1SampleSetting.initModel(e),ol=Ue.QuantUnitSetting.initModel(e),rl=He.RawDataItem.initModel(e),pl=Xe.ReagentLot.initModel(e),ul=Ve.ReportGraphSetting.initModel(e),dl=ze.Reporter.initModel(e),yl=Je.ResultCalculation.initModel(e),_l=$e.ResultEvaluator.initModel(e),ml=Ye.ResultMaskingConfig.initModel(e),cl=We.ResultRuleAnalyte.initModel(e),Tl=Ze.ResultRuleInterpretation.initModel(e),Nl=et.ResultRuleMeltPeak.initModel(e),gl=tt.RunDatum.initModel(e),fl=at.SampleSetting.initModel(e),Dl=lt.SampleType.initModel(e),El=st.SelectedQuantUnitSetting.initModel(e),bl=nt.SemiQuantOrganism.initModel(e),wl=it.SystemLog.initModel(e),Il=ot.TargetBasedOrganism.initModel(e),Rl=rt.TemperatureGraphSetup.initModel(e),Ol=pt.Test.initModel(e),hl=ut.TestBlog.initModel(e),Ml=dt.TestBlogCounter.initModel(e),Gl=yt.TestDatum.initModel(e),vl=_t.TestDataError.initModel(e),Sl=mt.TestError.initModel(e),Al=ct.TestExt.initModel(e),Pl=Tt.TestHistory.initModel(e),Ll=Nt.UltrasonicGraphSetup.initModel(e),Cl=gt.UserExt.initModel(e),Kl=ft.UserLockout.initModel(e),xl=Dt.UserPrivilege.initModel(e),jl=Et.User.initModel(e);return ga.belongsToMany(ba,{as:"haplotype_id_haplotypes",through:Na,foreignKey:"genotyping_organism_id",otherKey:"haplotype_id"}),ba.belongsToMany(ga,{as:"genotyping_organism_id_genotyping_organisms",through:Na,foreignKey:"haplotype_id",otherKey:"genotyping_organism_id"}),a.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(a,{as:"analyte_results",foreignKey:"analyte_id"}),ma.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(ma,{as:"crosstalk_corr_results",foreignKey:"analyte_id"}),Oa.belongsTo(t,{as:"id_analyte",foreignKey:"id"}),t.hasOne(Oa,{as:"lda_analyte",foreignKey:"id"}),ha.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(ha,{as:"lda_coefficients",foreignKey:"analyte_id"}),ja.belongsTo(t,{as:"parent",foreignKey:"parent_id"}),t.hasMany(ja,{as:"melt_peak_settings",foreignKey:"parent_id"}),Ua.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(Ua,{as:"organism_targets",foreignKey:"analyte_id"}),za.belongsTo(t,{as:"calculation_target",foreignKey:"calculation_target_id"}),t.hasMany(za,{as:"percent_ratio_organism_results",foreignKey:"calculation_target_id"}),za.belongsTo(t,{as:"reporting_target",foreignKey:"reporting_target_id"}),t.hasMany(za,{as:"reporting_target_percent_ratio_organism_results",foreignKey:"reporting_target_id"}),$a.belongsTo(t,{as:"calculation_target",foreignKey:"calculation_target_id"}),t.hasMany($a,{as:"percent_ratio_result_evaluators",foreignKey:"calculation_target_id"}),$a.belongsTo(t,{as:"reporting_target",foreignKey:"reporting_target_id"}),t.hasMany($a,{as:"reporting_target_percent_ratio_result_evaluators",foreignKey:"reporting_target_id"}),cl.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(cl,{as:"result_rule_analytes",foreignKey:"analyte_id"}),fl.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(fl,{as:"sample_settings",foreignKey:"analyte_id"}),Gt.belongsTo(a,{as:"parent",foreignKey:"parent_id"}),a.hasMany(Gt,{as:"channel_processed_data_items",foreignKey:"parent_id"}),Pt.belongsTo(a,{as:"id_analyte_result",foreignKey:"id"}),a.hasOne(Pt,{as:"clinical_analyte_result",foreignKey:"id"}),ma.belongsTo(a,{as:"parent",foreignKey:"parent_id"}),a.hasMany(ma,{as:"crosstalk_corr_results",foreignKey:"parent_id"}),xa.belongsTo(a,{as:"parent",foreignKey:"parent_id"}),a.hasMany(xa,{as:"melt_peak_results",foreignKey:"parent_id"}),t.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(t,{as:"analytes",foreignKey:"parent_id"}),bt.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(bt,{as:"assays",foreignKey:"parent_id"}),It.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(It,{as:"assay_exts",foreignKey:"assay_id"}),Ot.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(Ot,{as:"cartridges",foreignKey:"parent_id"}),Lt.belongsTo(bt,{as:"id_assay",foreignKey:"id"}),bt.hasOne(Lt,{as:"clinical_assay",foreignKey:"id"}),Jt.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(Jt,{as:"clinical_factors",foreignKey:"parent_id"}),ya.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(ya,{as:"color_disclaimers",foreignKey:"parent_id"}),Ea.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(Ea,{as:"graph_setup_assays",foreignKey:"assay_id"}),ba.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(ba,{as:"haplotypes",foreignKey:"parent_id"}),va.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(va,{as:"lis_assay_configs",foreignKey:"assay_id"}),ka.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(ka,{as:"organisms",foreignKey:"parent_id"}),pl.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(pl,{as:"reagent_lots",foreignKey:"parent_id"}),ul.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(ul,{as:"report_graph_settings",foreignKey:"assay_id"}),yl.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(yl,{as:"result_calculations",foreignKey:"parent_id"}),Dl.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(Dl,{as:"sample_types",foreignKey:"parent_id"}),El.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(El,{as:"selected_quant_unit_settings",foreignKey:"assay_id"}),Ol.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(Ol,{as:"tests",foreignKey:"assay_id"}),hl.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(hl,{as:"test_blogs",foreignKey:"assay_id"}),Za.belongsTo(It,{as:"parent",foreignKey:"parent_id"}),It.hasMany(Za,{as:"qc_lockout_settings",foreignKey:"parent_id"}),ml.belongsTo(It,{as:"parent",foreignKey:"parent_id"}),It.hasMany(ml,{as:"result_masking_configs",foreignKey:"parent_id"}),ca.belongsTo(Rt,{as:"id_basic_organism",foreignKey:"id"}),Rt.hasOne(ca,{as:"delta_ct_organism",foreignKey:"id"}),bl.belongsTo(Rt,{as:"id_basic_organism",foreignKey:"id"}),Rt.hasOne(bl,{as:"semi_quant_organism",foreignKey:"id"}),wt.belongsTo(Ot,{as:"parent",foreignKey:"parent_id"}),Ot.hasMany(wt,{as:"assay_chambers",foreignKey:"parent_id"}),Ot.belongsTo(ht,{as:"cartridge_type",foreignKey:"cartridge_type_id"}),ht.hasMany(Ot,{as:"cartridges",foreignKey:"cartridge_type_id"}),Mt.belongsTo(ht,{as:"parent",foreignKey:"parent_id"}),ht.hasMany(Mt,{as:"chambers",foreignKey:"parent_id"}),Ha.belongsTo(ht,{as:"parent",foreignKey:"parent_id"}),ht.hasMany(Ha,{as:"paths",foreignKey:"parent_id"}),At.belongsTo(Gt,{as:"id_channel_processed_data_item",foreignKey:"id"}),Gt.hasOne(At,{as:"clinical_analyte_data_item",foreignKey:"id"}),St.belongsTo(vt,{as:"parent",foreignKey:"parent_id"}),vt.hasMany(St,{as:"channel_raw_data_items",foreignKey:"parent_id"}),jt.belongsTo(Ct,{as:"parent",foreignKey:"parent_id"}),Ct.hasMany(jt,{as:"clinical_calculation_rows",foreignKey:"parent_id"}),Vt.belongsTo(Ct,{as:"parent",foreignKey:"parent_id"}),Ct.hasMany(Vt,{as:"clinical_conditional_rows",foreignKey:"parent_id"}),Kt.belongsTo(jt,{as:"parent",foreignKey:"parent_id"}),jt.hasMany(Kt,{as:"clinical_calculation_inputs",foreignKey:"parent_id"}),xt.belongsTo(jt,{as:"parent",foreignKey:"parent_id"}),jt.hasMany(xt,{as:"clinical_calculation_outputs",foreignKey:"parent_id"}),kt.belongsTo(qt,{as:"id_clinical_conditional_action",foreignKey:"id"}),qt.hasOne(kt,{as:"clinical_conditional_action_final_result",foreignKey:"id"}),Ft.belongsTo(qt,{as:"parent",foreignKey:"parent_id"}),qt.hasMany(Ft,{as:"clinical_conditional_action_inputs",foreignKey:"parent_id"}),Bt.belongsTo(qt,{as:"parent",foreignKey:"parent_id"}),qt.hasMany(Bt,{as:"clinical_conditional_action_outputs",foreignKey:"parent_id"}),Ut.belongsTo(Qt,{as:"id_clinical_conditional_cell",foreignKey:"id"}),Qt.hasOne(Ut,{as:"clinical_conditional_cell_boolean",foreignKey:"id"}),Ht.belongsTo(Qt,{as:"parent",foreignKey:"parent_id"}),Qt.hasMany(Ht,{as:"clinical_conditional_cell_inputs",foreignKey:"parent_id"}),Xt.belongsTo(Qt,{as:"id_clinical_conditional_cell",foreignKey:"id"}),Qt.hasOne(Xt,{as:"clinical_conditional_cell_numeric",foreignKey:"id"}),qt.belongsTo(Vt,{as:"parent",foreignKey:"parent_id"}),Vt.hasMany(qt,{as:"clinical_conditional_actions",foreignKey:"parent_id"}),Qt.belongsTo(Vt,{as:"parent",foreignKey:"parent_id"}),Vt.hasMany(Qt,{as:"clinical_conditional_cells",foreignKey:"parent_id"}),$t.belongsTo(Jt,{as:"parent",foreignKey:"parent_id"}),Jt.hasMany($t,{as:"clinical_factor_choice_values",foreignKey:"parent_id"}),Yt.belongsTo(Jt,{as:"id_clinical_factor",foreignKey:"id"}),Jt.hasOne(Yt,{as:"clinical_factor_double",foreignKey:"id"}),Zt.belongsTo(Jt,{as:"id_clinical_factor",foreignKey:"id"}),Jt.hasOne(Zt,{as:"clinical_factor_integer",foreignKey:"id"}),ea.belongsTo(Jt,{as:"id_clinical_factor",foreignKey:"id"}),Jt.hasOne(ea,{as:"clinical_factor_interval",foreignKey:"id"}),ta.belongsTo(Jt,{as:"parent",foreignKey:"parent_id"}),Jt.hasMany(ta,{as:"clinical_factor_interval_ranges",foreignKey:"parent_id"}),aa.belongsTo(Jt,{as:"id_clinical_factor",foreignKey:"id"}),Jt.hasOne(aa,{as:"clinical_factor_text",foreignKey:"id"}),Kt.belongsTo(sa,{as:"id_clinical_input",foreignKey:"id"}),sa.hasOne(Kt,{as:"clinical_calculation_input",foreignKey:"id"}),Ft.belongsTo(sa,{as:"id_clinical_input",foreignKey:"id"}),sa.hasOne(Ft,{as:"clinical_conditional_action_input",foreignKey:"id"}),Ht.belongsTo(sa,{as:"id_clinical_input",foreignKey:"id"}),sa.hasOne(Ht,{as:"clinical_conditional_cell_input",foreignKey:"id"}),Ct.belongsTo(na,{as:"parent",foreignKey:"parent_id"}),na.hasMany(Ct,{as:"clinical_calculations",foreignKey:"parent_id"}),ia.belongsTo(oa,{as:"parent",foreignKey:"parent_id"}),oa.hasMany(ia,{as:"clinical_organism_data_items",foreignKey:"parent_id"}),xt.belongsTo(ra,{as:"id_clinical_output",foreignKey:"id"}),ra.hasOne(xt,{as:"clinical_calculation_output",foreignKey:"id"}),Bt.belongsTo(ra,{as:"id_clinical_output",foreignKey:"id"}),ra.hasOne(Bt,{as:"clinical_conditional_action_output",foreignKey:"id"}),zt.belongsTo(da,{as:"parent",foreignKey:"parent_id"}),da.hasMany(zt,{as:"clinical_data_item_histories",foreignKey:"parent_id"}),Wt.belongsTo(da,{as:"parent",foreignKey:"parent_id"}),da.hasMany(Wt,{as:"clinical_factor_histories",foreignKey:"parent_id"}),Na.belongsTo(ga,{as:"genotyping_organism",foreignKey:"genotyping_organism_id"}),ga.hasMany(Na,{as:"genotyping_haplotype_organisms",foreignKey:"genotyping_organism_id"}),Ea.belongsTo(Da,{as:"graph_setup",foreignKey:"graph_setup_id"}),Da.hasMany(Ea,{as:"graph_setup_assays",foreignKey:"graph_setup_id"}),Ka.belongsTo(Da,{as:"id_graph_setup",foreignKey:"id"}),Da.hasOne(Ka,{as:"melt_graph_setup",foreignKey:"id"}),qa.belongsTo(Da,{as:"id_graph_setup",foreignKey:"id"}),Da.hasOne(qa,{as:"optics_graph_setup",foreignKey:"id"}),Wa.belongsTo(Da,{as:"id_graph_setup",foreignKey:"id"}),Da.hasOne(Wa,{as:"pressure_graph_setup",foreignKey:"id"}),Rl.belongsTo(Da,{as:"id_graph_setup",foreignKey:"id"}),Da.hasOne(Rl,{as:"temperature_graph_setup",foreignKey:"id"}),Ll.belongsTo(Da,{as:"id_graph_setup",foreignKey:"id"}),Da.hasOne(Ll,{as:"ultrasonic_graph_setup",foreignKey:"id"}),Na.belongsTo(ba,{as:"haplotype",foreignKey:"haplotype_id"}),ba.hasMany(Na,{as:"genotyping_haplotype_organisms",foreignKey:"haplotype_id"}),wa.belongsTo(ba,{as:"haplotype",foreignKey:"haplotype_id"}),ba.hasMany(wa,{as:"haplotype_results",foreignKey:"haplotype_id"}),Ia.belongsTo(ba,{as:"parent",foreignKey:"parent_id"}),ba.hasMany(Ia,{as:"haplotype_result_texts",foreignKey:"parent_id"}),Aa.belongsTo(ba,{as:"haplotype",foreignKey:"haplotype_id"}),ba.hasMany(Aa,{as:"lis_haplotype_configs",foreignKey:"haplotype_id"}),ha.belongsTo(Ma,{as:"parent",foreignKey:"parent_id"}),Ma.hasMany(ha,{as:"lda_coefficients",foreignKey:"parent_id"}),Sa.belongsTo(va,{as:"id_lis_assay_config",foreignKey:"id"}),va.hasOne(Sa,{as:"lis_genotyping_assay_config",foreignKey:"id"}),Ca.belongsTo(La,{as:"test_order",foreignKey:"test_order_id"}),La.hasMany(Ca,{as:"lis_uploads",foreignKey:"test_order_id"}),Rt.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(Rt,{as:"basic_organism",foreignKey:"id"}),na.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(na,{as:"clinical_organism",foreignKey:"id"}),ga.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(ga,{as:"genotyping_organism",foreignKey:"id"}),Ma.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(Ma,{as:"lda_organism",foreignKey:"id"}),Pa.belongsTo(ka,{as:"organism",foreignKey:"organism_id"}),ka.hasMany(Pa,{as:"lis_organism_configs",foreignKey:"organism_id"}),Ba.belongsTo(ka,{as:"organism",foreignKey:"organism_id"}),ka.hasMany(Ba,{as:"organism_results",foreignKey:"organism_id"}),Qa.belongsTo(ka,{as:"parent",foreignKey:"parent_id"}),ka.hasMany(Qa,{as:"organism_result_texts",foreignKey:"parent_id"}),Ua.belongsTo(ka,{as:"parent",foreignKey:"parent_id"}),ka.hasMany(Ua,{as:"organism_targets",foreignKey:"parent_id"}),Va.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(Va,{as:"percent_ratio_organism",foreignKey:"id"}),al.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(al,{as:"quant1_organism",foreignKey:"id"}),_l.belongsTo(ka,{as:"parent",foreignKey:"parent_id"}),ka.hasMany(_l,{as:"result_evaluators",foreignKey:"parent_id"}),ml.belongsTo(ka,{as:"organism",foreignKey:"organism_id"}),ka.hasMany(ml,{as:"result_masking_configs",foreignKey:"organism_id"}),Il.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(Il,{as:"target_based_organism",foreignKey:"id"}),oa.belongsTo(Ba,{as:"id_organism_result",foreignKey:"id"}),Ba.hasOne(oa,{as:"clinical_organism_result",foreignKey:"id"}),fa.belongsTo(Ba,{as:"id_organism_result",foreignKey:"id"}),Ba.hasOne(fa,{as:"genotyping_organism_result",foreignKey:"id"}),Ga.belongsTo(Ba,{as:"id_organism_result",foreignKey:"id"}),Ba.hasOne(Ga,{as:"lda_organism_result",foreignKey:"id"}),Fa.belongsTo(Ba,{as:"id_organism_result",foreignKey:"id"}),Ba.hasOne(Fa,{as:"organism_based_organism_result",foreignKey:"id"}),za.belongsTo(Ba,{as:"id_organism_result",foreignKey:"id"}),Ba.hasOne(za,{as:"percent_ratio_organism_result",foreignKey:"id"}),ll.belongsTo(Ba,{as:"id_organism_result",foreignKey:"id"}),Ba.hasOne(ll,{as:"quant1_organism_result",foreignKey:"id"}),La.belongsTo(Xa,{as:"patient",foreignKey:"patient_id"}),Xa.hasMany(La,{as:"lis_test_orders",foreignKey:"patient_id"}),Ol.belongsTo(Xa,{as:"patient",foreignKey:"patient_id"}),Xa.hasMany(Ol,{as:"tests",foreignKey:"patient_id"}),tl.belongsTo(el,{as:"parent",foreignKey:"parent_id"}),el.hasMany(tl,{as:"qc_tests",foreignKey:"parent_id"}),ol.belongsTo(al,{as:"parent",foreignKey:"parent_id"}),al.hasMany(ol,{as:"quant_unit_settings",foreignKey:"parent_id"}),nl.belongsTo(ll,{as:"parent",foreignKey:"parent_id"}),ll.hasMany(nl,{as:"quant1_results",foreignKey:"parent_id"}),nl.belongsTo(ol,{as:"quant_unit_setting",foreignKey:"quant_unit_setting_id"}),ol.hasMany(nl,{as:"quant1_results",foreignKey:"quant_unit_setting_id"}),pa.belongsTo(pl,{as:"id_reagent_lot",foreignKey:"id"}),pl.hasOne(pa,{as:"clinical_reagent_lot",foreignKey:"id"}),Ja.belongsTo(pl,{as:"id_reagent_lot",foreignKey:"id"}),pl.hasOne(Ja,{as:"percent_ratio_reagent_lot",foreignKey:"id"}),sl.belongsTo(pl,{as:"id_reagent_lot",foreignKey:"id"}),pl.hasOne(sl,{as:"quant1_reagent_lot",foreignKey:"id"}),fl.belongsTo(pl,{as:"parent",foreignKey:"parent_id"}),pl.hasMany(fl,{as:"sample_settings",foreignKey:"parent_id"}),cl.belongsTo(_l,{as:"parent",foreignKey:"parent_id"}),_l.hasMany(cl,{as:"result_rule_analytes",foreignKey:"parent_id"}),Tl.belongsTo(cl,{as:"id_result_rule_analyte",foreignKey:"id"}),cl.hasOne(Tl,{as:"result_rule_interpretation",foreignKey:"id"}),Nl.belongsTo(cl,{as:"id_result_rule_analyte",foreignKey:"id"}),cl.hasOne(Nl,{as:"result_rule_melt_peak",foreignKey:"id"}),ua.belongsTo(fl,{as:"id_sample_setting",foreignKey:"id"}),fl.hasOne(ua,{as:"clinical_sample_setting",foreignKey:"id"}),Ya.belongsTo(fl,{as:"id_sample_setting",foreignKey:"id"}),fl.hasOne(Ya,{as:"percent_ratio_sample_setting",foreignKey:"id"}),il.belongsTo(fl,{as:"id_sample_setting",foreignKey:"id"}),fl.hasOne(il,{as:"quant1_sample_setting",foreignKey:"id"}),a.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasMany(a,{as:"analyte_results",foreignKey:"parent_id"}),la.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasMany(la,{as:"clinical_factor_values",foreignKey:"parent_id"}),wa.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasMany(wa,{as:"haplotype_results",foreignKey:"parent_id"}),La.belongsTo(Ol,{as:"test",foreignKey:"test_id"}),Ol.hasMany(La,{as:"lis_test_orders",foreignKey:"test_id"}),Ca.belongsTo(Ol,{as:"test",foreignKey:"test_id"}),Ol.hasMany(Ca,{as:"lis_uploads",foreignKey:"test_id"}),Ba.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasMany(Ba,{as:"organism_results",foreignKey:"parent_id"}),Ol.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.belongsTo(jl,{as:"user",foreignKey:"user_login_name",targetKey:"login_name"}),Ol.hasMany(Ol,{as:"tests",foreignKey:"parent_id"}),Gl.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasOne(Gl,{as:"test_data",foreignKey:"parent_id"}),Sl.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasMany(Sl,{as:"test_errors",foreignKey:"parent_id"}),Al.belongsTo(Ol,{as:"id_test",foreignKey:"id"}),Ol.hasOne(Al,{as:"test_ext",foreignKey:"id"}),Pl.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasMany(Pl,{as:"test_histories",foreignKey:"parent_id"}),Ml.belongsTo(hl,{as:"test_blog",foreignKey:"test_blog_id"}),hl.hasMany(Ml,{as:"test_blog_counters",foreignKey:"test_blog_id"}),vt.belongsTo(Gl,{as:"parent",foreignKey:"parent_id"}),Gl.hasMany(vt,{as:"channel_raw_data",foreignKey:"parent_id"}),rl.belongsTo(Gl,{as:"parent",foreignKey:"parent_id"}),Gl.hasMany(rl,{as:"raw_data_items",foreignKey:"parent_id"}),gl.belongsTo(Gl,{as:"test_datum",foreignKey:"test_data_id"}),Gl.hasOne(gl,{as:"run_data",foreignKey:"test_data_id"}),vl.belongsTo(Gl,{as:"parent",foreignKey:"parent_id"}),Gl.hasMany(vl,{as:"test_data_errors",foreignKey:"parent_id"}),da.belongsTo(Pl,{as:"id_test_history",foreignKey:"id"}),Pl.hasOne(da,{as:"clinical_test_history",foreignKey:"id"}),Cl.belongsTo(jl,{as:"id_user",foreignKey:"id"}),jl.hasOne(Cl,{as:"user_ext",foreignKey:"id"}),{Analyte:t,AnalyteResult:a,Assay:bt,AssayChamber:wt,AssayExt:It,BasicOrganism:Rt,Cartridge:Ot,CartridgeType:ht,Chamber:Mt,ChannelProcessedDataItem:Gt,ChannelRawDatum:vt,ChannelRawDataItem:St,ClinicalAnalyteDataItem:At,ClinicalAnalyteResult:Pt,ClinicalAssay:Lt,ClinicalCalculation:Ct,ClinicalCalculationInput:Kt,ClinicalCalculationOutput:xt,ClinicalCalculationRow:jt,ClinicalConditionalAction:qt,ClinicalConditionalActionFinalResult:kt,ClinicalConditionalActionInput:Ft,ClinicalConditionalActionOutput:Bt,ClinicalConditionalCell:Qt,ClinicalConditionalCellBoolean:Ut,ClinicalConditionalCellInput:Ht,ClinicalConditionalCellNumeric:Xt,ClinicalConditionalRow:Vt,ClinicalDataItemHistory:zt,ClinicalFactor:Jt,ClinicalFactorChoiceValue:$t,ClinicalFactorDouble:Yt,ClinicalFactorHistory:Wt,ClinicalFactorInteger:Zt,ClinicalFactorInterval:ea,ClinicalFactorIntervalRange:ta,ClinicalFactorText:aa,ClinicalFactorValue:la,ClinicalInput:sa,ClinicalOrganism:na,ClinicalOrganismDataItem:ia,ClinicalOrganismResult:oa,ClinicalOutput:ra,ClinicalReagentLot:pa,ClinicalSampleSetting:ua,ClinicalTestHistory:da,ColorDisclaimer:ya,Config:_a,CrosstalkCorrResult:ma,DeltaCtOrganism:ca,DisabledModule:Ta,GenotypingHaplotypeOrganism:Na,GenotypingOrganism:ga,GenotypingOrganismResult:fa,GraphSetup:Da,GraphSetupAssay:Ea,Haplotype:ba,HaplotypeResult:wa,HaplotypeResultText:Ia,Instrument:Ra,LdaAnalyte:Oa,LdaCoefficient:ha,LdaOrganism:Ma,LdaOrganismResult:Ga,LisAssayConfig:va,LisGenotypingAssayConfig:Sa,LisHaplotypeConfig:Aa,LisOrganismConfig:Pa,LisTestOrder:La,LisUpload:Ca,MeltGraphSetup:Ka,MeltPeakResult:xa,MeltPeakSetting:ja,OpticsGraphSetup:qa,Organism:ka,OrganismBasedOrganismResult:Fa,OrganismResult:Ba,OrganismResultText:Qa,OrganismTarget:Ua,Path:Ha,Patient:Xa,PercentRatioOrganism:Va,PercentRatioOrganismResult:za,PercentRatioReagentLot:Ja,PercentRatioResultEvaluator:$a,PercentRatioSampleSetting:Ya,PressureGraphSetup:Wa,QcLockoutSetting:Za,QcResult:el,QcTest:tl,Quant1Organism:al,Quant1OrganismResult:ll,Quant1ReagentLot:sl,Quant1Result:nl,Quant1SampleSetting:il,QuantUnitSetting:ol,RawDataItem:rl,ReagentLot:pl,ReportGraphSetting:ul,Reporter:dl,ResultCalculation:yl,ResultEvaluator:_l,ResultMaskingConfig:ml,ResultRuleAnalyte:cl,ResultRuleInterpretation:Tl,ResultRuleMeltPeak:Nl,RunDatum:gl,SampleSetting:fl,SampleType:Dl,SelectedQuantUnitSetting:El,SemiQuantOrganism:bl,SystemLog:wl,TargetBasedOrganism:Il,TemperatureGraphSetup:Rl,Test:Ol,TestBlog:hl,TestBlogCounter:Ml,TestDatum:Gl,TestDataError:vl,TestError:Sl,TestExt:Al,TestHistory:Pl,UltrasonicGraphSetup:Ll,UserExt:Cl,UserLockout:Kl,UserPrivilege:xl,User:jl}}},5160:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Instrument=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Instrument",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},mac_address:{type:l.DataTypes.BLOB,allowNull:!0},serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},letter_offset:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"instrument",schema:"dbo",timestamps:!1,indexes:[{name:"PK__instrume__3213E83F6675BC96",unique:!0,fields:[{name:"id"}]},{name:"UX_instrument_letteroffset",unique:!0,fields:[{name:"letter_offset"}]},{name:"UX_instrument_macaddress",unique:!0,fields:[{name:"mac_address"}]},{name:"UX_instrument_serialnumber",unique:!0,fields:[{name:"serial_number"}]}]})}}t.Instrument=s},1608:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaAnalyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaAnalyte",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"analyte",key:"id"}},cycle_if_no_ct:{type:l.DataTypes.INTEGER,allowNull:!1},min_ct_req_pass_controls:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"lda_analyte",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_anal__3213E83F8B6778C1",unique:!0,fields:[{name:"id"}]}]})}}t.LdaAnalyte=s},7176:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaCoefficient=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaCoefficient",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"lda_organism",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!1},delta_ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"lda_coefficient",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_coef__3213E83F223CDD5C",unique:!0,fields:[{name:"id"}]}]})}}t.LdaCoefficient=s},7853:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},lda_total:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"lda_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_orga__3213E83FD28170E9",unique:!0,fields:[{name:"id"}]}]})}}t.LdaOrganismResult=s},8529:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},cutoff:{type:l.DataTypes.FLOAT,allowNull:!1},intercept:{type:l.DataTypes.FLOAT,allowNull:!1},max_valid_range:{type:l.DataTypes.FLOAT,allowNull:!1},min_valid_range:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"lda_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_orga__3213E83F9FD9F26C",unique:!0,fields:[{name:"id"}]}]})}}t.LdaOrganism=s},625:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisAssayConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisAssayConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},test_code:{type:l.DataTypes.STRING(15),allowNull:!0},test_code_enabled:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"lis_assay_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_assa__3213E83FFE29AC11",unique:!0,fields:[{name:"id"}]}]})}}t.LisAssayConfig=s},6465:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisGenotypingAssayConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisGenotypingAssayConfig",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"lis_assay_config",key:"id"}}},{tableName:"lis_genotyping_assay_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_geno__3213E83F51EF8137",unique:!0,fields:[{name:"id"}]}]})}}t.LisGenotypingAssayConfig=s},7946:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisHaplotypeConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisHaplotypeConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"haplotype",key:"id"}},result_code:{type:l.DataTypes.STRING(15),allowNull:!0}},{tableName:"lis_haplotype_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_hapl__3213E83F34DD1BA3",unique:!0,fields:[{name:"id"}]}]})}}t.LisHaplotypeConfig=s},672:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisOrganismConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisOrganismConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},result_code:{type:l.DataTypes.STRING(15),allowNull:!0}},{tableName:"lis_organism_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_orga__3213E83F4812458C",unique:!0,fields:[{name:"id"}]}]})}}t.LisOrganismConfig=s},2938:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisTestOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisTestOrder",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},cartridge_id:{type:l.DataTypes.STRING(25),allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},host_test_code:{type:l.DataTypes.STRING(15),allowNull:!0},instrument_specific_sample_id:{type:l.DataTypes.STRING(32),allowNull:!0},order_status:{type:l.DataTypes.INTEGER,allowNull:!1},patient_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"patient",key:"id"}},priority:{type:l.DataTypes.INTEGER,allowNull:!1},sample_id:{type:l.DataTypes.STRING(25),allowNull:!0},sample_type:{type:l.DataTypes.STRING(5),allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test",key:"id"}}},{tableName:"lis_test_order",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_test__3213E83F7178DECE",unique:!0,fields:[{name:"id"}]},{name:"UX_listestorder_testid",unique:!0,fields:[{name:"test_id"}]}]})}}t.LisTestOrder=s},6522:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisUpload=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisUpload",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},test_order_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"lis_test_order",key:"id"}},upload_message_id:{type:l.DataTypes.STRING(64),allowNull:!0},upload_status:{type:l.DataTypes.INTEGER,allowNull:!1},sample_priority:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"lis_upload",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_uplo__3213E83F638B691C",unique:!0,fields:[{name:"id"}]},{name:"UX_lis_upload_test_id",unique:!0,fields:[{name:"test_id"}]}]})}}t.LisUpload=s},6611:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltGraphSetup",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"graph_setup",key:"id"}},show_raw:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_normalized:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_1st_derivative:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_baseline:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_delta:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_temperature:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_2nd_derivative:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_zeroLine:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_threshold:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_melt_peaks:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"melt_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__melt_gra__3213E83FD58D0244",unique:!0,fields:[{name:"id"}]}]})}}t.MeltGraphSetup=s},227:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte_result",key:"id"}},peak_height:{type:l.DataTypes.FLOAT,allowNull:!1},peak_index:{type:l.DataTypes.INTEGER,allowNull:!1},peak_temperature:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"melt_peak_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_melt_peak_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__melt_pea__3213E83E6D358FD1",unique:!0,fields:[{name:"id"}]}]})}}t.MeltPeakResult=s},9073:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte",key:"id"}},baseline_look_back:{type:l.DataTypes.FLOAT,allowNull:!0},baseline_num_points:{type:l.DataTypes.INTEGER,allowNull:!0},baseline_start_temp:{type:l.DataTypes.FLOAT,allowNull:!0},peak_range_max:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_min:{type:l.DataTypes.FLOAT,allowNull:!1},peak_threshold:{type:l.DataTypes.FLOAT,allowNull:!1},points_around_peak:{type:l.DataTypes.INTEGER,allowNull:!0},reportable_melt_type:{type:l.DataTypes.INTEGER,allowNull:!0},slope_positive:{type:l.DataTypes.BOOLEAN,allowNull:!1},valley_threshold:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"melt_peak_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__melt_pea__3213E83FF9DEB820",unique:!0,fields:[{name:"id"}]},{name:"UX_meltpeaksetting_parentid",unique:!0,fields:[{name:"parent_id"}]}]})}}t.MeltPeakSetting=s},8396:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OpticsGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OpticsGraphSetup",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"graph_setup",key:"id"}},show_primary:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_raw:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_curve_fit:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_res_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_normalized:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_2nd_derivative:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_threshold:{type:l.DataTypes.BOOLEAN,allowNull:!0},axes_type:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"optics_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__optics_g__3213E83FFFECD845",unique:!0,fields:[{name:"id"}]}]})}}t.OpticsGraphSetup=s},7029:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismBasedOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismBasedOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},semi_quant_level:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"organism_based_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83F11027669",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismBasedOrganismResult=s},2677:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultText",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(8),allowNull:!1},result_text:{type:l.DataTypes.INTEGER,allowNull:!1},text_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"organism_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83F9D7E3B70",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismResultText=s},4701:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"organism",key:"id"}},result_text:{type:l.DataTypes.INTEGER,allowNull:!0},result_color:{type:l.DataTypes.INTEGER,allowNull:!0},is_result_invalid:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_result_masked:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_organism_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__organism__3213E83EFB5E0D40",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismResult=s},8456:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismTarget=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismTarget",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}}},{tableName:"organism_target",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83FBF8598E6",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismTarget=s},848:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Organism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Organism",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},name:{type:l.DataTypes.STRING(32),allowNull:!1},organism_index:{type:l.DataTypes.INTEGER,allowNull:!1},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83F26F926ED",unique:!0,fields:[{name:"id"}]}]})}}t.Organism=s},7762:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Path=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Path",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge_type",key:"id"}},angular_offset:{type:l.DataTypes.FLOAT,allowNull:!1},chamber_number:{type:l.DataTypes.INTEGER,allowNull:!0},is_block:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!1},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"path",schema:"dbo",timestamps:!1,indexes:[{name:"PK__path__3213E83F240FBBF3",unique:!0,fields:[{name:"id"}]}]})}}t.Path=s},2157:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Patient=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Patient",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},gx_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},practice_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},family_name:{type:l.DataTypes.STRING(1552),allowNull:!0},given_name:{type:l.DataTypes.STRING(240),allowNull:!0},middle_name:{type:l.DataTypes.STRING(240),allowNull:!0},date_of_birth:{type:l.DataTypes.STRING(96),allowNull:!0},gender:{type:l.DataTypes.STRING(128),allowNull:!0},ethnicity:{type:l.DataTypes.STRING(512),allowNull:!0},postal_code:{type:l.DataTypes.STRING(96),allowNull:!0}},{tableName:"patient",schema:"dbo",timestamps:!1,indexes:[{name:"PK__patient__3213E83F541351BB",unique:!0,fields:[{name:"id"}]}]})}}t.Patient=s},1604:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},ratio_percent:{type:l.DataTypes.FLOAT,allowNull:!0},log_transform:{type:l.DataTypes.FLOAT,allowNull:!0},reporting_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},calculation_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},detailed_result:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"percent_ratio_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83FC6D34960",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioOrganismResult=s},8967:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},dynamic_range_max:{type:l.DataTypes.FLOAT,allowNull:!1},dynamic_range_min:{type:l.DataTypes.FLOAT,allowNull:!1},lod_loq:{type:l.DataTypes.FLOAT,allowNull:!1},log_transform_type:{type:l.DataTypes.INTEGER,allowNull:!1},units:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"percent_ratio_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F1369279B",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioOrganism=s},7189:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioReagentLot",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"reagent_lot",key:"id"}}},{tableName:"percent_ratio_reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83FAC63EA04",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioReagentLot=s},8524:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioResultEvaluator=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioResultEvaluator",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},calculation_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},reporting_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}}},{tableName:"percent_ratio_result_evaluator",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83FC91E78DE",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioResultEvaluator=s},7287:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioSampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioSampleSetting",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"sample_setting",key:"id"}},delta_ct_efficiency:{type:l.DataTypes.FLOAT,allowNull:!0},scaling_factor:{type:l.DataTypes.DECIMAL(5,2),allowNull:!0}},{tableName:"percent_ratio_sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F5A46BC97",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioSampleSetting=s},459:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PressureGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PressureGraphSetup",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"graph_setup",key:"id"}},show_assay_threshold:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_system_threshold:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"pressure_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__pressure__3213E83F32143A0B",unique:!0,fields:[{name:"id"}]}]})}}t.PressureGraphSetup=s},5503:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QcLockoutSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QcLockoutSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay_ext",key:"id"}},qc_enabled:{type:l.DataTypes.BOOLEAN,allowNull:!1},qc_on_lot:{type:l.DataTypes.BOOLEAN,allowNull:!1},frequency:{type:l.DataTypes.INTEGER,allowNull:!1},display:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"qc_lockout_settings",schema:"dbo",timestamps:!1,indexes:[{name:"PK__qc_locko__3213E83F6DF99E8C",unique:!0,fields:[{name:"id"}]}]})}}t.QcLockoutSetting=s},2190:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QcResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QcResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_name:{type:l.DataTypes.STRING(32),allowNull:!1},assay_version:{type:l.DataTypes.INTEGER,allowNull:!1},rgt_lot_id:{type:l.DataTypes.STRING(5),allowNull:!0},due_date:{type:l.DataTypes.DATE,allowNull:!1},completion_date:{type:l.DataTypes.DATE,allowNull:!0}},{tableName:"qc_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__qc_resul__3213E83FC6AB8A0D",unique:!0,fields:[{name:"id"}]}]})}}t.QcResult=s},4230:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QcTest=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QcTest",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"qc_result",key:"id"}},test_id:{type:l.DataTypes.INTEGER,allowNull:!0},status:{type:l.DataTypes.INTEGER,allowNull:!1},end_time:{type:l.DataTypes.DATE,allowNull:!0},is_pos:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"qc_test",schema:"dbo",timestamps:!1,indexes:[{name:"PK__qc_test__3213E83FADFD5E80",unique:!0,fields:[{name:"id"}]}]})}}t.QcTest=s},6774:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1OrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1OrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}}},{tableName:"quant1_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_o__3213E83F56AEF9A5",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1OrganismResult=s},7284:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1Organism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1Organism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},max_quantitative_delta:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"quant1_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_o__3213E83F0EE566DB",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1Organism=s},8925:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1ReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1ReagentLot",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"reagent_lot",key:"id"}}},{tableName:"quant1_reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_r__3213E83F68A59646",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1ReagentLot=s},7795:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1Result=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1Result",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"quant1_organism_result",key:"id"}},quantitative_result:{type:l.DataTypes.FLOAT,allowNull:!0},quant_unit_setting_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"quant_unit_setting",key:"id"}},result_abnormal_flag:{type:l.DataTypes.STRING(5),allowNull:!0}},{tableName:"quant1_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_quant1_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__quant1_r__3213E83E7286B386",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1Result=s},6977:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1SampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1SampleSetting",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"sample_setting",key:"id"}},e0:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},e1:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},e2:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0}},{tableName:"quant1_sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_s__3213E83FFA6CD02F",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1SampleSetting=s},589:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QuantUnitSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QuantUnitSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"quant1_organism",key:"id"}},conversion_factor:{type:l.DataTypes.FLOAT,allowNull:!1},display_log_value:{type:l.DataTypes.BOOLEAN,allowNull:!1},lower_limit:{type:l.DataTypes.FLOAT,allowNull:!1},position:{type:l.DataTypes.INTEGER,allowNull:!1},units:{type:l.DataTypes.INTEGER,allowNull:!1},upper_limit:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"quant_unit_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant_un__3213E83F6AA4ACAC",unique:!0,fields:[{name:"id"}]}]})}}t.QuantUnitSetting=s},2132:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RawDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("RawDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test_data",key:"id"}},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0},timestamps:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"raw_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_raw_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__raw_data__3213E83E6F5B3EAF",unique:!0,fields:[{name:"id"}]}]})}}t.RawDataItem=s},9092:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ReagentLot",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},creation_time:{type:l.DataTypes.DATE,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!1},reagent_lot_number:{type:l.DataTypes.STRING(3),allowNull:!1}},{tableName:"reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__reagent___3213E83FE1FD856F",unique:!0,fields:[{name:"id"}]}]})}}t.ReagentLot=s},5076:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ReportGraphSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ReportGraphSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}},graph_type:{type:l.DataTypes.INTEGER,allowNull:!0},param_key:{type:l.DataTypes.STRING(64),allowNull:!1},param_val:{type:l.DataTypes.STRING(512),allowNull:!0}},{tableName:"report_graph_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__report_g__3213E83F88AEEA20",unique:!0,fields:[{name:"id"}]}]})}}t.ReportGraphSetting=s},617:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Reporter=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Reporter",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},concentration:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(12),allowNull:!1}},{tableName:"reporter",schema:"dbo",timestamps:!1,indexes:[{name:"PK__reporter__3213E83FE02BD9EF",unique:!0,fields:[{name:"id"}]},{name:"UX_reporter_name",unique:!0,fields:[{name:"name"}]}]})}}t.Reporter=s},3513:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultCalculation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultCalculation",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},chain_name:{type:l.DataTypes.STRING(64),allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1}},{tableName:"result_calculation",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_c__3213E83F401E0DFE",unique:!0,fields:[{name:"id"}]}]})}}t.ResultCalculation=s},7014:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultEvaluator=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultEvaluator",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},evaluator_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_text:{type:l.DataTypes.INTEGER,allowNull:!1},rule_anded:{type:l.DataTypes.BOOLEAN,allowNull:!1},text_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"result_evaluator",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_e__3213E83FE1614926",unique:!0,fields:[{name:"id"}]}]})}}t.ResultEvaluator=s},8770:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultMaskingConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultMaskingConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay_ext",key:"id"}},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}}},{tableName:"result_masking_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_m__3213E83FCE36E124",unique:!0,fields:[{name:"id"}]}]})}}t.ResultMaskingConfig=s},6430:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultRuleAnalyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultRuleAnalyte",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"result_evaluator",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},rule_index:{type:l.DataTypes.INTEGER,allowNull:!1},rule_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"result_rule_analyte",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_r__3213E83FD2CA5D7B",unique:!0,fields:[{name:"id"}]}]})}}t.ResultRuleAnalyte=s},872:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultRuleInterpretation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultRuleInterpretation",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"result_rule_analyte",key:"id"}},interpretation:{type:l.DataTypes.INTEGER,allowNull:!1},pass_on_equals:{type:l.DataTypes.BOOLEAN,allowNull:!1},reasons:{type:l.DataTypes.STRING(50),allowNull:!0}},{tableName:"result_rule_interpretation",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_r__3213E83FF6E9FEAE",unique:!0,fields:[{name:"id"}]}]})}}t.ResultRuleInterpretation=s},3051:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultRuleMeltPeak=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultRuleMeltPeak",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"result_rule_analyte",key:"id"}},pass_on_peak:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"result_rule_melt_peak",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_r__3213E83F6989F9D8",unique:!0,fields:[{name:"id"}]}]})}}t.ResultRuleMeltPeak=s},2658:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RunDatum=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("RunDatum",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_data_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test_data",key:"id"}},datagram_format:{type:l.DataTypes.INTEGER,allowNull:!0},datagrams:{type:l.DataTypes.BLOB,allowNull:!0},end_time:{type:l.DataTypes.DATE,allowNull:!0},fw_version:{type:l.DataTypes.STRING(12),allowNull:!0},icore_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},site_name:{type:l.DataTypes.STRING(512),allowNull:!0},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},start_time:{type:l.DataTypes.DATE,allowNull:!0},state:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"run_data",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_run_data_test_data_id",fields:[{name:"test_data_id"}]},{name:"PK__run_data__3213E83E567DD4BC",unique:!0,fields:[{name:"id"}]},{name:"UX_rundata_testdataid",unique:!0,fields:[{name:"test_data_id"}]}]})}}t.RunDatum=s},591:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"reagent_lot",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},ct_threshold_value:{type:l.DataTypes.FLOAT,allowNull:!1},end_pt_threshold:{type:l.DataTypes.INTEGER,allowNull:!1},min_delta_ct:{type:l.DataTypes.FLOAT,allowNull:!1},normalization_factor:{type:l.DataTypes.INTEGER,allowNull:!1},peak_height_min:{type:l.DataTypes.FLOAT,allowNull:!1},probe_chk_delta:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_high_max:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_high_min:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_low_max:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_low_min:{type:l.DataTypes.INTEGER,allowNull:!1},use_endpoint:{type:l.DataTypes.BOOLEAN,allowNull:!1},use_min_delta_ct:{type:l.DataTypes.BOOLEAN,allowNull:!1},valid_max:{type:l.DataTypes.DECIMAL(5,1),allowNull:!1},valid_min:{type:l.DataTypes.DECIMAL(5,1),allowNull:!1}},{tableName:"sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__sample_s__3213E83F5CA8F508",unique:!0,fields:[{name:"id"}]}]})}}t.SampleSetting=s},7919:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleType=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleType",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},sample_type_key:{type:l.DataTypes.STRING(5),allowNull:!1}},{tableName:"sample_type",schema:"dbo",timestamps:!1,indexes:[{name:"PK__sample_t__3213E83F677484AC",unique:!0,fields:[{name:"id"}]}]})}}t.SampleType=s},7167:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SelectedQuantUnitSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SelectedQuantUnitSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},units:{type:l.DataTypes.INTEGER,allowNull:!1},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}}},{tableName:"selected_quant_unit_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__selected__3213E83FD2197D49",unique:!0,fields:[{name:"id"}]}]})}}t.SelectedQuantUnitSetting=s},7020:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SemiQuantOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SemiQuantOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"basic_organism",key:"id"}},delta_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1},low_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1},medium_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1},replaced_result_color:{type:l.DataTypes.INTEGER,allowNull:!1},replaced_result_text:{type:l.DataTypes.INTEGER,allowNull:!1},semi_quant_result_text:{type:l.DataTypes.INTEGER,allowNull:!1},very_low_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"semi_quant_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__semi_qua__3213E83FD6EC71C5",unique:!0,fields:[{name:"id"}]}]})}}t.SemiQuantOrganism=s},4617:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SystemLog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SystemLog",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},details:{type:l.DataTypes.STRING(512),allowNull:!0},error_code:{type:l.DataTypes.INTEGER,allowNull:!0},error_type:{type:l.DataTypes.INTEGER,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!1},site_name:{type:l.DataTypes.STRING(512),allowNull:!0},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0}},{tableName:"system_log",schema:"dbo",timestamps:!1,indexes:[{name:"PK__system_l__3213E83F2F74C3E3",unique:!0,fields:[{name:"id"}]}]})}}t.SystemLog=s},922:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TargetBasedOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TargetBasedOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}}},{tableName:"target_based_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__target_b__3213E83FC9C8466E",unique:!0,fields:[{name:"id"}]}]})}}t.TargetBasedOrganism=s},7571:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TemperatureGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TemperatureGraphSetup",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"graph_setup",key:"id"}},show_sample:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_heater:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_target:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"temperature_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__temperat__3213E83F0FBD7F66",unique:!0,fields:[{name:"id"}]}]})}}t.TemperatureGraphSetup=s},248:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlogCounter=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlogCounter",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_blog_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test_blog",key:"id"}},date_text:{type:l.DataTypes.STRING(8),allowNull:!0},test_count:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"test_blog_counter",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test_blo__3213E83FC91A3CB2",unique:!0,fields:[{name:"id"}]},{name:"UX_testblogcounter_testblogid_datetext",unique:!0,fields:[{name:"test_blog_id"},{name:"date_text"}]}]})}}t.TestBlogCounter=s},4715:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlog",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}}},{tableName:"test_blog",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test_blo__3213E83F18287316",unique:!0,fields:[{name:"id"}]},{name:"UX_testblog_assayid",unique:!0,fields:[{name:"assay_id"}]}]})}}t.TestBlog=s},196:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestDataError=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestDataError",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test_data",key:"id"}},code:{type:l.DataTypes.INTEGER,allowNull:!1},details:{type:l.DataTypes.STRING(512),allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!1},param1:{type:l.DataTypes.FLOAT,allowNull:!0},param2:{type:l.DataTypes.FLOAT,allowNull:!0},param3:{type:l.DataTypes.FLOAT,allowNull:!0},param4:{type:l.DataTypes.FLOAT,allowNull:!0},severity:{type:l.DataTypes.INTEGER,allowNull:!1},site_state:{type:l.DataTypes.INTEGER,allowNull:!1},step_number:{type:l.DataTypes.INTEGER,allowNull:!1},text_param:{type:l.DataTypes.STRING(64),allowNull:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_data_error",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_data_error_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_dat__3213E83E78622473",unique:!0,fields:[{name:"id"}]}]})}}t.TestDataError=s},4309:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestDatum=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestDatum",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},error_status:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_data",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_data_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_dat__3213E83E31E5BA7A",unique:!0,fields:[{name:"id"}]},{name:"UX_testdata_parentid",unique:!0,fields:[{name:"parent_id"}]}]})}}t.TestDatum=s},1591:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestError=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestError",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},code:{type:l.DataTypes.INTEGER,allowNull:!1},details:{type:l.DataTypes.STRING(512),allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!1},param1:{type:l.DataTypes.FLOAT,allowNull:!0},param2:{type:l.DataTypes.FLOAT,allowNull:!0},param3:{type:l.DataTypes.FLOAT,allowNull:!0},param4:{type:l.DataTypes.FLOAT,allowNull:!0},severity:{type:l.DataTypes.INTEGER,allowNull:!1},text_param:{type:l.DataTypes.STRING(256),allowNull:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_error",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_error_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_err__3213E83EF5E87ABE",unique:!0,fields:[{name:"id"}]}]})}}t.TestError=s},5748:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestExt=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestExt",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"test",key:"id"}},version:{type:l.DataTypes.INTEGER,allowNull:!0},archived:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"test_ext",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test_ext__3213E83F7C62AA47",unique:!0,fields:[{name:"id"}]}]})}}t.TestExt=s},1396:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestHistory",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},creation_time:{type:l.DataTypes.DATE,allowNull:!1},field_name:{type:l.DataTypes.STRING(32),allowNull:!1},new_content:{type:l.DataTypes.STRING(512),allowNull:!0},old_content:{type:l.DataTypes.STRING(512),allowNull:!0},user_name:{type:l.DataTypes.STRING(128),allowNull:!0}},{tableName:"test_history",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_history_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_his__3213E83E4CEA85AD",unique:!0,fields:[{name:"id"}]}]})}}t.TestHistory=s},1731:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Test=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Test",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},result_text_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test",key:"id"}},is_current_test:{type:l.DataTypes.BOOLEAN,allowNull:!0},cartridge_barcode:{type:l.DataTypes.STRING(1024),allowNull:!0},cart_serial_number:{type:l.DataTypes.BIGINT,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},data_reduction_algorithm:{type:l.DataTypes.INTEGER,allowNull:!0},error_status:{type:l.DataTypes.INTEGER,allowNull:!1},expiration_date:{type:l.DataTypes.DATE,allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_scanned_patient_id:{type:l.DataTypes.BOOLEAN,allowNull:!0},is_scanned_sample_id:{type:l.DataTypes.BOOLEAN,allowNull:!0},modification_time:{type:l.DataTypes.DATE,allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},order_time:{type:l.DataTypes.DATE,allowNull:!0},other_sample_type_text:{type:l.DataTypes.STRING(32),allowNull:!0},legacy_result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_color:{type:l.DataTypes.TEXT,allowNull:!0},rgt_lot_id:{type:l.DataTypes.STRING(5),allowNull:!0},sample_id:{type:l.DataTypes.STRING(25),allowNull:!0},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},user_full_name:{type:l.DataTypes.STRING(128),allowNull:!0},user_login_name:{type:l.DataTypes.STRING(128),allowNull:!0},patient_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"patient",key:"id"}},test_type:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"test",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test__3213E83FF5B8B492",unique:!0,fields:[{name:"id"}]},{name:"UX_test_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.Test=s},2535:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UltrasonicGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("UltrasonicGraphSetup",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"graph_setup",key:"id"}},show_amplitude:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_frequency:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_duty_cycle:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"ultrasonic_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__ultrason__3213E83F317F7578",unique:!0,fields:[{name:"id"}]}]})}}t.UltrasonicGraphSetup=s},9884:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UserExt=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("UserExt",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"users",key:"id"}},institutional_id:{type:l.DataTypes.STRING(128),allowNull:!0},active_date:{type:l.DataTypes.DATE,allowNull:!0},expiration_date:{type:l.DataTypes.DATE,allowNull:!0}},{tableName:"user_ext",schema:"dbo",timestamps:!1,indexes:[{name:"PK__user_ext__3213E83F67F47F65",unique:!0,fields:[{name:"id"}]}]})}}t.UserExt=s},6772:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UserLockout=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("UserLockout",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},login_name:{type:l.DataTypes.STRING(32),allowNull:!1},failure_count:{type:l.DataTypes.INTEGER,allowNull:!1},last_failure:{type:l.DataTypes.DATE,allowNull:!0}},{tableName:"user_lockout",schema:"dbo",timestamps:!1,indexes:[{name:"PK__user_loc__3213E83F6537F831",unique:!0,fields:[{name:"id"}]}]})}}t.UserLockout=s},1701:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UserPrivilege=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("UserPrivilege",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},privilege_name:{type:l.DataTypes.STRING(64),allowNull:!1},user_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"user_privilege",schema:"dbo",timestamps:!1,indexes:[{name:"PK__user_pri__3213E83F7375D6FB",unique:!0,fields:[{name:"id"}]}]})}}t.UserPrivilege=s},8655:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.User=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("User",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},full_name:{type:l.DataTypes.STRING(128),allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_hidden:{type:l.DataTypes.BOOLEAN,allowNull:!1},login_name:{type:l.DataTypes.STRING(32),allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!0},password:{type:l.DataTypes.STRING(256),allowNull:!1},user_source:{type:l.DataTypes.INTEGER,allowNull:!1},user_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"users",schema:"dbo",timestamps:!1,indexes:[{name:"PK__users__3213E83F4F70944B",unique:!0,fields:[{name:"id"}]},{name:"UX_users_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.User=s},2522:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,o)}r((l=l.apply(e,t||[])).next())}))},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.GeneXpertClient=void 0;const n=s(a(2245)),i=a(9634),o=a(496),r=a(7306),p=a(5662),u="YYYY/MM/DD HH:mm:ss.SSS";t.GeneXpertClient=class{constructor(e,t,a,l){this.version=e,this.sequelize=(0,r.createSequelize)(t,a,l),this.models=(0,p.initModels)(this.sequelize)}logsTotal(){return this.models.SystemLog.count()}testsTotal(){return this.models.Test.count({include:[{as:"test_data",model:this.models.TestDatum,where:{state:{[o.Op.ne]:1}},required:!0}]})}systemInfo(){const e=this.sequelize.query("\n          SELECT\n            MAX(sw_version) as [sw_version],\n            [system_log].[site_serial_number],\n            [system_log].[site_name],\n            MAX([instrument_serial_number]) as [instrument_serial_number],\n            MAX(log_time) as [log_time],\n            MIN(log_time) as [first_seen_at],\n            MAX([disabled_module].[creation_time]) as [disabled_at]\n          FROM [dbo].[system_log]\n            LEFT JOIN [dbo].[disabled_module]\n            ON [dbo].[disabled_module].[site_serial_number] = [dbo].[system_log].[site_serial_number]\n          GROUP BY [site_name], [system_log].[site_serial_number]\n          ORDER BY log_time DESC\n        ").then((([e])=>e)),t=this.models.Config.findAll().then((e=>e.map((e=>({[e.param_key]:e.param_val}))))).then(i.mergeAll);return Promise.all([e,t]).then((e=>(0,r.toSystemInfo)(...e)))}testsPresyncables(e,t,a){return this.models.Test.findAll({where:{[o.Op.or]:[{order_time:{[o.Op.lt]:(0,n.default)().subtract(1,"hour").toDate()},modification_time:{[o.Op.gt]:e}},{order_time:{[o.Op.lt]:(0,n.default)().subtract(1,"hour").toDate()},modification_time:{[o.Op.eq]:e},id:{[o.Op.notIn]:t}}]},order:[["modification_time","DESC"]],limit:a}).then((e=>e.map((({id:e,modification_time:t})=>({id:e.toString(),modified:t})))))}testsSyncables(e){return this.models.Test.findAll({where:{id:{[o.Op.in]:e}},include:[{as:"test_data",model:this.models.TestDatum},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]}},{as:"user",model:this.models.User},{as:"test_errors",model:this.models.TestError},{as:"patient",model:this.models.Patient},{as:"analyte_results",model:this.models.AnalyteResult,include:[{as:"analyte",model:this.models.Analyte},{as:"channel_processed_data_items",model:this.models.ChannelProcessedDataItem}]},{as:"organism_results",model:this.models.OrganismResult,include:[{as:"organism",model:this.models.Organism},{as:"organism_based_organism_result",model:this.models.OrganismBasedOrganismResult}]}]}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}testsForEntry(e,t){return this.models.Test.findAll({where:{sample_id:{[o.Op.notIn]:e}},include:[{as:"test_data",model:this.models.TestDatum,where:{start_time:{[o.Op.gte]:(0,n.default)().subtract(t||r.hoursForDataEntry,"hours").toDate()}}},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>({id:e.id,assay:e.assay.name,endedAt:e.test_data.end_time,sampleId:e.sample_id,startedAt:e.test_data.start_time})))))}logsPresyncables(e,t,a){return this.models.SystemLog.findAll({where:{[o.Op.or]:[{log_time:{[o.Op.gt]:e}},{log_time:{[o.Op.eq]:e},id:{[o.Op.notIn]:t}}]},limit:a,attributes:["id","log_time"],order:[["log_time","ASC"]]}).then((e=>e.map((({id:e,log_time:t})=>({id:e.toString(),modified:t})))))}logsSyncables(e){return this.models.SystemLog.findAll({where:{id:{[o.Op.in]:e}}}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}close(){return this.sequelize.close()}getTest(e){var t,a,s;return l(this,void 0,void 0,(function*(){const l=yield this.models.Test.findOne({where:{sample_id:{[o.Op.eq]:e}},include:[{as:"test_data",model:this.models.TestDatum}]});return{dataValues:Object.assign(Object.assign({},null==l?void 0:l.dataValues),{end_time:null===(a=null===(t=null==l?void 0:l.dataValues)||void 0===t?void 0:t.test_data)||void 0===a?void 0:a.end_time,sampleId:null===(s=null==l?void 0:l.dataValues)||void 0===s?void 0:s.sample_id})}}))}getTestsByTestIds(e){return this.models.Test.findAll({where:{id:{[o.Op.in]:e}},include:[{as:"test_data",model:this.models.TestDatum},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>({id:e.id,assay:e.assay.name,endedAt:e.test_data.end_time,sampleId:e.sample_id,startedAt:e.test_data.start_time})))))}getCompletedTestsBySampleIds(e){return this.models.Test.findAll({where:{sample_id:{[o.Op.in]:e},modification_time:{[o.Op.and]:[{[o.Op.not]:null},{[o.Op.between]:[(0,n.default)().subtract(r.LAB_RESULT_APPROVAL_DEADLINE_HOURS,"hours").format(u),(0,n.default)().format(u)]}]},result_text:{[o.Op.not]:null}},include:[{as:"test_data",model:this.models.TestDatum},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t,a,l,s,i;return{id:e.id,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(null!==(l=null===(a=null==e?void 0:e.test_data)||void 0===a?void 0:a.end_time)&&void 0!==l?l:null==e?void 0:e.modification_time,u).toDate(),sampleId:e.sample_id,startedAt:(0,n.default)(null!==(i=null===(s=null==e?void 0:e.test_data)||void 0===s?void 0:s.start_time)&&void 0!==i?i:null==e?void 0:e.order_time,u).toDate()}}))))}}},9057:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AnalyteResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AnalyteResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}}},{tableName:"analyte_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_analyte_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__analyte___3213E83ECDC2EDFE",unique:!0,fields:[{name:"id"}]}]})}}t.AnalyteResult=s},3363:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Analyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Analyte",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},analyte_index:{type:l.DataTypes.INTEGER,allowNull:!1},background_end:{type:l.DataTypes.INTEGER,allowNull:!1},background_look_back:{type:l.DataTypes.INTEGER,allowNull:!1},background_max_rms_error:{type:l.DataTypes.FLOAT,allowNull:!0},background_max_slope:{type:l.DataTypes.FLOAT,allowNull:!0},background_min_points:{type:l.DataTypes.INTEGER,allowNull:!1},background_start:{type:l.DataTypes.INTEGER,allowNull:!1},boxcar_cycles:{type:l.DataTypes.INTEGER,allowNull:!1},curve_analysis:{type:l.DataTypes.INTEGER,allowNull:!1},curve_fit_end_index:{type:l.DataTypes.INTEGER,allowNull:!0},curve_fit_max_nrse:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_slope_vs_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_min_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_start_index:{type:l.DataTypes.INTEGER,allowNull:!0},intended_concentration:{type:l.DataTypes.FLOAT,allowNull:!1},invalid_bias:{type:l.DataTypes.INTEGER,allowNull:!1},is_signal_loss_detection_enabled:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_probe_check_use_delta_pc:{type:l.DataTypes.BOOLEAN,allowNull:!1},name:{type:l.DataTypes.STRING(20),allowNull:!1},probe_check_max_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_min_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},reporter_name:{type:l.DataTypes.STRING(12),allowNull:!1},target:{type:l.DataTypes.BLOB,allowNull:!0},use_curve_fit:{type:l.DataTypes.BOOLEAN,allowNull:!1},use_curve_fit_end_data:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_curve_fit_on_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_curve_fit_start_background:{type:l.DataTypes.BOOLEAN,allowNull:!0},usage:{type:l.DataTypes.INTEGER,allowNull:!1},use_background_validation:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"analyte",schema:"dbo",timestamps:!1,indexes:[{name:"PK__analyte__3213E83FA63374DD",unique:!0,fields:[{name:"id"}]}]})}}t.Analyte=s},3133:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayChamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayChamber",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge",key:"id"}},chamber_number:{type:l.DataTypes.INTEGER,allowNull:!1},initial_volume:{type:l.DataTypes.INTEGER,allowNull:!1},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!1},name:{type:l.DataTypes.STRING(16),allowNull:!1}},{tableName:"assay_chamber",schema:"dbo",timestamps:!1,indexes:[{name:"PK__assay_ch__3213E83FBA29C6D8",unique:!0,fields:[{name:"id"}]}]})}}t.AssayChamber=s},5083:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayPosition=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayPosition",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},position:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"assay_position",schema:"dbo",timestamps:!1,indexes:[{name:"PK__assay_po__3213E83F9ED37278",unique:!0,fields:[{name:"id"}]}]})}}t.AssayPosition=s},6570:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Assay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Assay",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}},assay_index:{type:l.DataTypes.INTEGER,allowNull:!0},result_text_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_lock_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_version:{type:l.DataTypes.INTEGER,allowNull:!0},command_bytes:{type:l.DataTypes.BLOB,allowNull:!0},command_sequence_format:{type:l.DataTypes.INTEGER,allowNull:!0},comments:{type:l.DataTypes.STRING(4e3),allowNull:!0},company_code:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},data_reduction_algorithm:{type:l.DataTypes.INTEGER,allowNull:!0},default_result_text_index:{type:l.DataTypes.INTEGER,allowNull:!0},default_text_color_reference:{type:l.DataTypes.INTEGER,allowNull:!0},disclaimer:{type:l.DataTypes.STRING(4e3),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!0},is_clia_waived:{type:l.DataTypes.BOOLEAN,allowNull:!0},lock_comments:{type:l.DataTypes.STRING(4e3),allowNull:!0},lock_time:{type:l.DataTypes.DATE,allowNull:!0},modification_time:{type:l.DataTypes.DATE,allowNull:!0},name:{type:l.DataTypes.STRING(32),allowNull:!1},need_lsp:{type:l.DataTypes.BOOLEAN,allowNull:!0},picture:{type:l.DataTypes.BLOB,allowNull:!0},prep_cartridge_shelf_life:{type:l.DataTypes.INTEGER,allowNull:!0},product_code:{type:l.DataTypes.INTEGER,allowNull:!0},sample_prep_instruction:{type:l.DataTypes.STRING(256),allowNull:!0},sample_prep_video:{type:l.DataTypes.BLOB,allowNull:!0},use_background_subtraction:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_melt_all_peaks:{type:l.DataTypes.BOOLEAN,allowNull:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"users",key:"id"}}},{tableName:"assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__assay__3213E83F2029E23F",unique:!0,fields:[{name:"id"}]},{name:"UX_assay_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.Assay=s},8804:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BasicOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("BasicOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}}},{tableName:"basic_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__basic_or__3213E83F330C3338",unique:!0,fields:[{name:"id"}]}]})}}t.BasicOrganism=s},3642:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CartridgeType=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CartridgeType",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},adc_2_psi:{type:l.DataTypes.FLOAT,allowNull:!1},air_chamber:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_foot_height:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_version:{type:l.DataTypes.INTEGER,allowNull:!1},creation_time:{type:l.DataTypes.DATE,allowNull:!1},direct_flow_rate_max:{type:l.DataTypes.FLOAT,allowNull:!1},direct_flow_rate_min:{type:l.DataTypes.FLOAT,allowNull:!1},direct_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},filter_flow_rate_max:{type:l.DataTypes.FLOAT,allowNull:!1},filter_flow_rate_min:{type:l.DataTypes.FLOAT,allowNull:!1},filter_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},initial_aspirate_flow_rate:{type:l.DataTypes.FLOAT,allowNull:!1},initial_aspirate_volume:{type:l.DataTypes.INTEGER,allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},max_pressure:{type:l.DataTypes.INTEGER,allowNull:!1},microliters_per_revolution:{type:l.DataTypes.FLOAT,allowNull:!1},min_pressure:{type:l.DataTypes.INTEGER,allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1},overflow_chamber:{type:l.DataTypes.INTEGER,allowNull:!1},picture:{type:l.DataTypes.BLOB,allowNull:!0},plunger_pickup_position:{type:l.DataTypes.INTEGER,allowNull:!1},plunger_strip_position:{type:l.DataTypes.INTEGER,allowNull:!1},syringe_max_transfer_volume:{type:l.DataTypes.INTEGER,allowNull:!1},syringe_max_volume:{type:l.DataTypes.INTEGER,allowNull:!1},syringe_min_transfer_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_chamber_number:{type:l.DataTypes.INTEGER,allowNull:!1},tube_chamber_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_pressurized_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_syringe_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_volume:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"cartridge_type",schema:"dbo",timestamps:!1,indexes:[{name:"PK__cartridg__3213E83F8C4F3852",unique:!0,fields:[{name:"id"}]},{name:"UX_cartridgetype_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.CartridgeType=s},3406:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Cartridge=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Cartridge",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},air_chamber:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_type_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge_type",key:"id"}},overflow_chamber:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"cartridge",schema:"dbo",timestamps:!1,indexes:[{name:"PK__cartridg__3213E83F250C10B7",unique:!0,fields:[{name:"id"}]}]})}}t.Cartridge=s},9909:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Chamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Chamber",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge_type",key:"id"}},chamber_number:{type:l.DataTypes.INTEGER,allowNull:!1},max_volume:{type:l.DataTypes.INTEGER,allowNull:!1},min_volume:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"chamber",schema:"dbo",timestamps:!1,indexes:[{name:"PK__chamber__3213E83F4AB9898B",unique:!0,fields:[{name:"id"}]}]})}}t.Chamber=s},3465:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ChannelProcessedDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ChannelProcessedDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte_result",key:"id"}},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"channel_processed_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_channel_processed_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__channel___3213E83ED0788519",unique:!0,fields:[{name:"id"}]}]})}}t.ChannelProcessedDataItem=s},2637:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ChannelRawDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ChannelRawDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"channel_raw_data",key:"id"}},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0},timestamps:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"channel_raw_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_channel_raw_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__channel___3213E83EC0F7CD0A",unique:!0,fields:[{name:"id"}]}]})}}t.ChannelRawDataItem=s},2418:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ChannelRawDatum=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ChannelRawDatum",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test_data",key:"id"}},protocol_number:{type:l.DataTypes.INTEGER,allowNull:!1},channel_name:{type:l.DataTypes.STRING(32),allowNull:!1}},{tableName:"channel_raw_data",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_channel_raw_data_parent_id",fields:[{name:"parent_id"}]},{name:"PK__channel___3213E83EC68CD172",unique:!0,fields:[{name:"id"}]}]})}}t.ChannelRawDatum=s},3258:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorDisclaimer=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ColorDisclaimer",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},color:{type:l.DataTypes.INTEGER,allowNull:!1},disclaimer:{type:l.DataTypes.STRING(256),allowNull:!0}},{tableName:"color_disclaimer",schema:"dbo",timestamps:!1,indexes:[{name:"PK__color_di__3213E83F654A7801",unique:!0,fields:[{name:"id"}]}]})}}t.ColorDisclaimer=s},8949:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Config",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},param_key:{type:l.DataTypes.STRING(64),allowNull:!0},param_val:{type:l.DataTypes.STRING(512),allowNull:!0}},{tableName:"config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__config__3213E83FB24EFCAC",unique:!0,fields:[{name:"id"}]},{name:"UX_config_paramkey",unique:!0,fields:[{name:"param_key"}]}]})}}t.Config=s},5479:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CrosstalkCorrResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CrosstalkCorrResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte_result",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte",key:"id"}},protocol_index:{type:l.DataTypes.INTEGER,allowNull:!1},ignore_code:{type:l.DataTypes.STRING(64),allowNull:!1},correlation_slope:{type:l.DataTypes.FLOAT,allowNull:!0},correlation_r2:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"crosstalk_corr_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_crosstalk_corr_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__crosstal__3213E83E924D6078",unique:!0,fields:[{name:"id"}]}]})}}t.CrosstalkCorrResult=s},9171:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DeltaCtOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("DeltaCtOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"basic_organism",key:"id"}},delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!1},delta_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"delta_ct_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__delta_ct__3213E83FE042FFFC",unique:!0,fields:[{name:"id"}]}]})}}t.DeltaCtOrganism=s},606:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DisabledModule=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("DisabledModule",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!1},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!1},user_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"users",key:"id"}}},{tableName:"disabled_module",schema:"dbo",timestamps:!1,indexes:[{name:"PK__disabled__3213E83F96810815",unique:!0,fields:[{name:"id"}]},{name:"UX_disabledmodule_siteserialnumber",unique:!0,fields:[{name:"site_serial_number"}]}]})}}t.DisabledModule=s},1903:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingAssay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"genotyping_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__3213E83F7C84A87B",unique:!0,fields:[{name:"id"}]}]})}}t.GenotypingAssay=s},5738:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingHaplotypeOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingHaplotypeOrganism",{haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"haplotype",key:"id"}},genotyping_organism_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"genotyping_organism",key:"id"}}},{tableName:"genotyping_haplotype_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__060A713D88EAF29B",unique:!0,fields:[{name:"haplotype_id"},{name:"genotyping_organism_id"}]},{name:"UX_gho_haplotypeid_genotypingorganismid",unique:!0,fields:[{name:"haplotype_id"},{name:"genotyping_organism_id"}]}]})}}t.GenotypingHaplotypeOrganism=s},7676:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}}},{tableName:"genotyping_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__3213E83F71AF25E1",unique:!0,fields:[{name:"id"}]}]})}}t.GenotypingOrganismResult=s},3722:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},early_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!1},late_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"genotyping_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__3213E83F13741DD0",unique:!0,fields:[{name:"id"}]}]})}}t.GenotypingOrganism=s},8378:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetupAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetupAssay",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},graph_setup_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"graph_setup",key:"id"}},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}}},{tableName:"graph_setup_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__graph_se__3213E83FB241A5B9",unique:!0,fields:[{name:"id"}]},{name:"UX_graphsetupassay_graphsetupid_assayid",unique:!0,fields:[{name:"graph_setup_id"},{name:"assay_id"}]}]})}}t.GraphSetupAssay=s},3017:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetup",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_default:{type:l.DataTypes.BOOLEAN,allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1},pos:{type:l.DataTypes.INTEGER,allowNull:!1},settings:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__graph_se__3213E83F6ADA0B5A",unique:!0,fields:[{name:"id"}]},{name:"UX_graphsetup_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.GraphSetup=s},4359:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.HaplotypeResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("HaplotypeResultText",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"haplotype",key:"id"}},alleles_text1:{type:l.DataTypes.STRING(10),allowNull:!1},alleles_text2:{type:l.DataTypes.STRING(10),allowNull:!1},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(11),allowNull:!1},text_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"haplotype_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK__haplotyp__3213E83FC0009034",unique:!0,fields:[{name:"id"}]}]})}}t.HaplotypeResultText=s},2428:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.HaplotypeResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("HaplotypeResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"haplotype",key:"id"}},allele1_text:{type:l.DataTypes.TEXT,allowNull:!1},allele2_text:{type:l.DataTypes.TEXT,allowNull:!1},result_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"haplotype_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_haplotype_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__haplotyp__3213E83EDA363883",unique:!0,fields:[{name:"id"}]}]})}}t.HaplotypeResult=s},4997:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Haplotype=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Haplotype",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"genotyping_assay",key:"id"}},haplotype_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(20),allowNull:!1}},{tableName:"haplotype",schema:"dbo",timestamps:!1,indexes:[{name:"PK__haplotyp__3213E83F6E1A2AB7",unique:!0,fields:[{name:"id"}]}]})}}t.Haplotype=s},5662:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioOrganism=t.PercentRatioAssay=t.Patient=t.Path=t.OrganismTarget=t.OrganismResultText=t.OrganismResult=t.OrganismBasedOrganismResult=t.OrganismBasedAssay=t.Organism=t.MeltPeakSetting=t.MeltPeakResult=t.LisUpload=t.LisTestOrder=t.LisOrganismConfig=t.LisHaplotypeConfig=t.LisGenotypingAssayConfig=t.LisAssayConfig=t.LdaOrganismResult=t.LdaOrganism=t.LdaCoefficient=t.LdaAssay=t.LdaAnalyte=t.Instrument=t.HaplotypeResultText=t.HaplotypeResult=t.Haplotype=t.GraphSetupAssay=t.GraphSetup=t.GenotypingOrganismResult=t.GenotypingOrganism=t.GenotypingHaplotypeOrganism=t.GenotypingAssay=t.DisabledModule=t.DeltaCtOrganism=t.CrosstalkCorrResult=t.Config=t.ColorDisclaimer=t.ChannelRawDataItem=t.ChannelRawDatum=t.ChannelProcessedDataItem=t.Chamber=t.CartridgeType=t.Cartridge=t.BasicOrganism=t.AssayPosition=t.AssayChamber=t.Assay=t.AnalyteResult=t.Analyte=void 0,t.initModels=t.User=t.UserPrivilege=t.TestNv=t.TestHistory=t.TestError=t.TestDataError=t.TestDatum=t.TestBlogCounter=t.TestBlog=t.Test=t.TargetBasedOrganism=t.TargetBasedAssay=t.SystemLog=t.SemiQuantOrganism=t.SelectedQuantUnitSetting=t.SampleType=t.SampleSetting=t.ResultRuleMeltPeak=t.ResultRuleInterpretation=t.ResultRuleAnalyte=t.ResultEvaluator=t.ResultCalculation=t.Reporter=t.ReportGraphSetting=t.ReagentLot=t.RawDataItem=t.QuantUnitSetting=t.Quant1SampleSetting=t.Quant1Result=t.Quant1ReagentLot=t.Quant1OrganismResult=t.Quant1Organism=t.Quant1Assay=t.PercentRatioSampleSetting=t.PercentRatioResultEvaluator=t.PercentRatioReagentLot=t.PercentRatioOrganismResult=void 0;const l=a(3363);Object.defineProperty(t,"Analyte",{enumerable:!0,get:function(){return l.Analyte}});const s=a(9057);Object.defineProperty(t,"AnalyteResult",{enumerable:!0,get:function(){return s.AnalyteResult}});const n=a(6570);Object.defineProperty(t,"Assay",{enumerable:!0,get:function(){return n.Assay}});const i=a(3133);Object.defineProperty(t,"AssayChamber",{enumerable:!0,get:function(){return i.AssayChamber}});const o=a(5083);Object.defineProperty(t,"AssayPosition",{enumerable:!0,get:function(){return o.AssayPosition}});const r=a(8804);Object.defineProperty(t,"BasicOrganism",{enumerable:!0,get:function(){return r.BasicOrganism}});const p=a(3406);Object.defineProperty(t,"Cartridge",{enumerable:!0,get:function(){return p.Cartridge}});const u=a(3642);Object.defineProperty(t,"CartridgeType",{enumerable:!0,get:function(){return u.CartridgeType}});const d=a(9909);Object.defineProperty(t,"Chamber",{enumerable:!0,get:function(){return d.Chamber}});const y=a(3465);Object.defineProperty(t,"ChannelProcessedDataItem",{enumerable:!0,get:function(){return y.ChannelProcessedDataItem}});const _=a(2418);Object.defineProperty(t,"ChannelRawDatum",{enumerable:!0,get:function(){return _.ChannelRawDatum}});const m=a(2637);Object.defineProperty(t,"ChannelRawDataItem",{enumerable:!0,get:function(){return m.ChannelRawDataItem}});const c=a(3258);Object.defineProperty(t,"ColorDisclaimer",{enumerable:!0,get:function(){return c.ColorDisclaimer}});const T=a(8949);Object.defineProperty(t,"Config",{enumerable:!0,get:function(){return T.Config}});const N=a(5479);Object.defineProperty(t,"CrosstalkCorrResult",{enumerable:!0,get:function(){return N.CrosstalkCorrResult}});const g=a(9171);Object.defineProperty(t,"DeltaCtOrganism",{enumerable:!0,get:function(){return g.DeltaCtOrganism}});const f=a(606);Object.defineProperty(t,"DisabledModule",{enumerable:!0,get:function(){return f.DisabledModule}});const D=a(1903);Object.defineProperty(t,"GenotypingAssay",{enumerable:!0,get:function(){return D.GenotypingAssay}});const E=a(5738);Object.defineProperty(t,"GenotypingHaplotypeOrganism",{enumerable:!0,get:function(){return E.GenotypingHaplotypeOrganism}});const b=a(3722);Object.defineProperty(t,"GenotypingOrganism",{enumerable:!0,get:function(){return b.GenotypingOrganism}});const w=a(7676);Object.defineProperty(t,"GenotypingOrganismResult",{enumerable:!0,get:function(){return w.GenotypingOrganismResult}});const I=a(3017);Object.defineProperty(t,"GraphSetup",{enumerable:!0,get:function(){return I.GraphSetup}});const R=a(8378);Object.defineProperty(t,"GraphSetupAssay",{enumerable:!0,get:function(){return R.GraphSetupAssay}});const O=a(4997);Object.defineProperty(t,"Haplotype",{enumerable:!0,get:function(){return O.Haplotype}});const h=a(2428);Object.defineProperty(t,"HaplotypeResult",{enumerable:!0,get:function(){return h.HaplotypeResult}});const M=a(4359);Object.defineProperty(t,"HaplotypeResultText",{enumerable:!0,get:function(){return M.HaplotypeResultText}});const G=a(7324);Object.defineProperty(t,"Instrument",{enumerable:!0,get:function(){return G.Instrument}});const v=a(2673);Object.defineProperty(t,"LdaAnalyte",{enumerable:!0,get:function(){return v.LdaAnalyte}});const S=a(7425);Object.defineProperty(t,"LdaAssay",{enumerable:!0,get:function(){return S.LdaAssay}});const A=a(5710);Object.defineProperty(t,"LdaCoefficient",{enumerable:!0,get:function(){return A.LdaCoefficient}});const P=a(7110);Object.defineProperty(t,"LdaOrganism",{enumerable:!0,get:function(){return P.LdaOrganism}});const L=a(4741);Object.defineProperty(t,"LdaOrganismResult",{enumerable:!0,get:function(){return L.LdaOrganismResult}});const C=a(3179);Object.defineProperty(t,"LisAssayConfig",{enumerable:!0,get:function(){return C.LisAssayConfig}});const K=a(4810);Object.defineProperty(t,"LisGenotypingAssayConfig",{enumerable:!0,get:function(){return K.LisGenotypingAssayConfig}});const x=a(1219);Object.defineProperty(t,"LisHaplotypeConfig",{enumerable:!0,get:function(){return x.LisHaplotypeConfig}});const j=a(2855);Object.defineProperty(t,"LisOrganismConfig",{enumerable:!0,get:function(){return j.LisOrganismConfig}});const q=a(7519);Object.defineProperty(t,"LisTestOrder",{enumerable:!0,get:function(){return q.LisTestOrder}});const k=a(8608);Object.defineProperty(t,"LisUpload",{enumerable:!0,get:function(){return k.LisUpload}});const F=a(4298);Object.defineProperty(t,"MeltPeakResult",{enumerable:!0,get:function(){return F.MeltPeakResult}});const B=a(630);Object.defineProperty(t,"MeltPeakSetting",{enumerable:!0,get:function(){return B.MeltPeakSetting}});const Q=a(8374);Object.defineProperty(t,"Organism",{enumerable:!0,get:function(){return Q.Organism}});const U=a(7883);Object.defineProperty(t,"OrganismBasedAssay",{enumerable:!0,get:function(){return U.OrganismBasedAssay}});const H=a(1122);Object.defineProperty(t,"OrganismBasedOrganismResult",{enumerable:!0,get:function(){return H.OrganismBasedOrganismResult}});const X=a(9668);Object.defineProperty(t,"OrganismResult",{enumerable:!0,get:function(){return X.OrganismResult}});const V=a(6321);Object.defineProperty(t,"OrganismResultText",{enumerable:!0,get:function(){return V.OrganismResultText}});const z=a(8476);Object.defineProperty(t,"OrganismTarget",{enumerable:!0,get:function(){return z.OrganismTarget}});const J=a(1548);Object.defineProperty(t,"Path",{enumerable:!0,get:function(){return J.Path}});const $=a(3708);Object.defineProperty(t,"Patient",{enumerable:!0,get:function(){return $.Patient}});const Y=a(9913);Object.defineProperty(t,"PercentRatioAssay",{enumerable:!0,get:function(){return Y.PercentRatioAssay}});const W=a(2232);Object.defineProperty(t,"PercentRatioOrganism",{enumerable:!0,get:function(){return W.PercentRatioOrganism}});const Z=a(9169);Object.defineProperty(t,"PercentRatioOrganismResult",{enumerable:!0,get:function(){return Z.PercentRatioOrganismResult}});const ee=a(894);Object.defineProperty(t,"PercentRatioReagentLot",{enumerable:!0,get:function(){return ee.PercentRatioReagentLot}});const te=a(7363);Object.defineProperty(t,"PercentRatioResultEvaluator",{enumerable:!0,get:function(){return te.PercentRatioResultEvaluator}});const ae=a(2026);Object.defineProperty(t,"PercentRatioSampleSetting",{enumerable:!0,get:function(){return ae.PercentRatioSampleSetting}});const le=a(9250);Object.defineProperty(t,"Quant1Assay",{enumerable:!0,get:function(){return le.Quant1Assay}});const se=a(3739);Object.defineProperty(t,"Quant1Organism",{enumerable:!0,get:function(){return se.Quant1Organism}});const ne=a(5021);Object.defineProperty(t,"Quant1OrganismResult",{enumerable:!0,get:function(){return ne.Quant1OrganismResult}});const ie=a(6693);Object.defineProperty(t,"Quant1ReagentLot",{enumerable:!0,get:function(){return ie.Quant1ReagentLot}});const oe=a(2949);Object.defineProperty(t,"Quant1Result",{enumerable:!0,get:function(){return oe.Quant1Result}});const re=a(3664);Object.defineProperty(t,"Quant1SampleSetting",{enumerable:!0,get:function(){return re.Quant1SampleSetting}});const pe=a(1747);Object.defineProperty(t,"QuantUnitSetting",{enumerable:!0,get:function(){return pe.QuantUnitSetting}});const ue=a(8090);Object.defineProperty(t,"RawDataItem",{enumerable:!0,get:function(){return ue.RawDataItem}});const de=a(8323);Object.defineProperty(t,"ReagentLot",{enumerable:!0,get:function(){return de.ReagentLot}});const ye=a(771);Object.defineProperty(t,"ReportGraphSetting",{enumerable:!0,get:function(){return ye.ReportGraphSetting}});const _e=a(200);Object.defineProperty(t,"Reporter",{enumerable:!0,get:function(){return _e.Reporter}});const me=a(4829);Object.defineProperty(t,"ResultCalculation",{enumerable:!0,get:function(){return me.ResultCalculation}});const ce=a(1452);Object.defineProperty(t,"ResultEvaluator",{enumerable:!0,get:function(){return ce.ResultEvaluator}});const Te=a(1093);Object.defineProperty(t,"ResultRuleAnalyte",{enumerable:!0,get:function(){return Te.ResultRuleAnalyte}});const Ne=a(3271);Object.defineProperty(t,"ResultRuleInterpretation",{enumerable:!0,get:function(){return Ne.ResultRuleInterpretation}});const ge=a(3745);Object.defineProperty(t,"ResultRuleMeltPeak",{enumerable:!0,get:function(){return ge.ResultRuleMeltPeak}});const fe=a(6709);Object.defineProperty(t,"SampleSetting",{enumerable:!0,get:function(){return fe.SampleSetting}});const De=a(8388);Object.defineProperty(t,"SampleType",{enumerable:!0,get:function(){return De.SampleType}});const Ee=a(1111);Object.defineProperty(t,"SelectedQuantUnitSetting",{enumerable:!0,get:function(){return Ee.SelectedQuantUnitSetting}});const be=a(5274);Object.defineProperty(t,"SemiQuantOrganism",{enumerable:!0,get:function(){return be.SemiQuantOrganism}});const we=a(7497);Object.defineProperty(t,"SystemLog",{enumerable:!0,get:function(){return we.SystemLog}});const Ie=a(7657);Object.defineProperty(t,"TargetBasedAssay",{enumerable:!0,get:function(){return Ie.TargetBasedAssay}});const Re=a(6344);Object.defineProperty(t,"TargetBasedOrganism",{enumerable:!0,get:function(){return Re.TargetBasedOrganism}});const Oe=a(6676);Object.defineProperty(t,"Test",{enumerable:!0,get:function(){return Oe.Test}});const he=a(806);Object.defineProperty(t,"TestBlog",{enumerable:!0,get:function(){return he.TestBlog}});const Me=a(4668);Object.defineProperty(t,"TestBlogCounter",{enumerable:!0,get:function(){return Me.TestBlogCounter}});const Ge=a(4114);Object.defineProperty(t,"TestDatum",{enumerable:!0,get:function(){return Ge.TestDatum}});const ve=a(1257);Object.defineProperty(t,"TestDataError",{enumerable:!0,get:function(){return ve.TestDataError}});const Se=a(9067);Object.defineProperty(t,"TestError",{enumerable:!0,get:function(){return Se.TestError}});const Ae=a(7595);Object.defineProperty(t,"TestHistory",{enumerable:!0,get:function(){return Ae.TestHistory}});const Pe=a(2200);Object.defineProperty(t,"TestNv",{enumerable:!0,get:function(){return Pe.TestNv}});const Le=a(8803);Object.defineProperty(t,"UserPrivilege",{enumerable:!0,get:function(){return Le.UserPrivilege}});const Ce=a(9005);Object.defineProperty(t,"User",{enumerable:!0,get:function(){return Ce.User}}),t.initModels=function(e){const t=l.Analyte.initModel(e),a=s.AnalyteResult.initModel(e),Ke=n.Assay.initModel(e),xe=i.AssayChamber.initModel(e),je=o.AssayPosition.initModel(e),qe=r.BasicOrganism.initModel(e),ke=p.Cartridge.initModel(e),Fe=u.CartridgeType.initModel(e),Be=d.Chamber.initModel(e),Qe=y.ChannelProcessedDataItem.initModel(e),Ue=_.ChannelRawDatum.initModel(e),He=m.ChannelRawDataItem.initModel(e),Xe=c.ColorDisclaimer.initModel(e),Ve=T.Config.initModel(e),ze=N.CrosstalkCorrResult.initModel(e),Je=g.DeltaCtOrganism.initModel(e),$e=f.DisabledModule.initModel(e),Ye=D.GenotypingAssay.initModel(e),We=E.GenotypingHaplotypeOrganism.initModel(e),Ze=b.GenotypingOrganism.initModel(e),et=w.GenotypingOrganismResult.initModel(e),tt=I.GraphSetup.initModel(e),at=R.GraphSetupAssay.initModel(e),lt=O.Haplotype.initModel(e),st=h.HaplotypeResult.initModel(e),nt=M.HaplotypeResultText.initModel(e),it=G.Instrument.initModel(e),ot=v.LdaAnalyte.initModel(e),rt=S.LdaAssay.initModel(e),pt=A.LdaCoefficient.initModel(e),ut=P.LdaOrganism.initModel(e),dt=L.LdaOrganismResult.initModel(e),yt=C.LisAssayConfig.initModel(e),_t=K.LisGenotypingAssayConfig.initModel(e),mt=x.LisHaplotypeConfig.initModel(e),ct=j.LisOrganismConfig.initModel(e),Tt=q.LisTestOrder.initModel(e),Nt=k.LisUpload.initModel(e),gt=F.MeltPeakResult.initModel(e),ft=B.MeltPeakSetting.initModel(e),Dt=Q.Organism.initModel(e),Et=U.OrganismBasedAssay.initModel(e),bt=H.OrganismBasedOrganismResult.initModel(e),wt=X.OrganismResult.initModel(e),It=V.OrganismResultText.initModel(e),Rt=z.OrganismTarget.initModel(e),Ot=J.Path.initModel(e),ht=$.Patient.initModel(e),Mt=Y.PercentRatioAssay.initModel(e),Gt=W.PercentRatioOrganism.initModel(e),vt=Z.PercentRatioOrganismResult.initModel(e),St=ee.PercentRatioReagentLot.initModel(e),At=te.PercentRatioResultEvaluator.initModel(e),Pt=ae.PercentRatioSampleSetting.initModel(e),Lt=le.Quant1Assay.initModel(e),Ct=se.Quant1Organism.initModel(e),Kt=ne.Quant1OrganismResult.initModel(e),xt=ie.Quant1ReagentLot.initModel(e),jt=oe.Quant1Result.initModel(e),qt=re.Quant1SampleSetting.initModel(e),kt=pe.QuantUnitSetting.initModel(e),Ft=ue.RawDataItem.initModel(e),Bt=de.ReagentLot.initModel(e),Qt=ye.ReportGraphSetting.initModel(e),Ut=_e.Reporter.initModel(e),Ht=me.ResultCalculation.initModel(e),Xt=ce.ResultEvaluator.initModel(e),Vt=Te.ResultRuleAnalyte.initModel(e),zt=Ne.ResultRuleInterpretation.initModel(e),Jt=ge.ResultRuleMeltPeak.initModel(e),$t=fe.SampleSetting.initModel(e),Yt=De.SampleType.initModel(e),Wt=Ee.SelectedQuantUnitSetting.initModel(e),Zt=be.SemiQuantOrganism.initModel(e),ea=we.SystemLog.initModel(e),ta=Ie.TargetBasedAssay.initModel(e),aa=Re.TargetBasedOrganism.initModel(e),la=Oe.Test.initModel(e),sa=he.TestBlog.initModel(e),na=Me.TestBlogCounter.initModel(e),ia=Ge.TestDatum.initModel(e),oa=ve.TestDataError.initModel(e),ra=Se.TestError.initModel(e),pa=Ae.TestHistory.initModel(e),ua=Pe.TestNv.initModel(e),da=Le.UserPrivilege.initModel(e),ya=Ce.User.initModel(e);return Ze.belongsToMany(lt,{as:"haplotype_id_haplotypes",through:We,foreignKey:"genotyping_organism_id",otherKey:"haplotype_id"}),lt.belongsToMany(Ze,{as:"genotyping_organism_id_genotyping_organisms",through:We,foreignKey:"haplotype_id",otherKey:"genotyping_organism_id"}),a.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(a,{as:"analyte_results",foreignKey:"analyte_id"}),ze.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(ze,{as:"crosstalk_corr_results",foreignKey:"analyte_id"}),ot.belongsTo(t,{as:"id_analyte",foreignKey:"id"}),t.hasOne(ot,{as:"lda_analyte",foreignKey:"id"}),pt.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(pt,{as:"lda_coefficients",foreignKey:"analyte_id"}),ft.belongsTo(t,{as:"parent",foreignKey:"parent_id"}),t.hasMany(ft,{as:"melt_peak_settings",foreignKey:"parent_id"}),Rt.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(Rt,{as:"organism_targets",foreignKey:"analyte_id"}),vt.belongsTo(t,{as:"calculation_target",foreignKey:"calculation_target_id"}),t.hasMany(vt,{as:"percent_ratio_organism_results",foreignKey:"calculation_target_id"}),vt.belongsTo(t,{as:"reporting_target",foreignKey:"reporting_target_id"}),t.hasMany(vt,{as:"reporting_target_percent_ratio_organism_results",foreignKey:"reporting_target_id"}),At.belongsTo(t,{as:"calculation_target",foreignKey:"calculation_target_id"}),t.hasMany(At,{as:"percent_ratio_result_evaluators",foreignKey:"calculation_target_id"}),At.belongsTo(t,{as:"reporting_target",foreignKey:"reporting_target_id"}),t.hasMany(At,{as:"reporting_target_percent_ratio_result_evaluators",foreignKey:"reporting_target_id"}),Vt.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(Vt,{as:"result_rule_analytes",foreignKey:"analyte_id"}),$t.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany($t,{as:"sample_settings",foreignKey:"analyte_id"}),Qe.belongsTo(a,{as:"parent",foreignKey:"parent_id"}),a.hasMany(Qe,{as:"channel_processed_data_items",foreignKey:"parent_id"}),ze.belongsTo(a,{as:"parent",foreignKey:"parent_id"}),a.hasMany(ze,{as:"crosstalk_corr_results",foreignKey:"parent_id"}),gt.belongsTo(a,{as:"parent",foreignKey:"parent_id"}),a.hasMany(gt,{as:"melt_peak_results",foreignKey:"parent_id"}),t.belongsTo(Ke,{as:"parent",foreignKey:"parent_id"}),Ke.hasMany(t,{as:"analytes",foreignKey:"parent_id"}),Ke.belongsTo(Ke,{as:"parent",foreignKey:"parent_id"}),Ke.hasMany(Ke,{as:"assays",foreignKey:"parent_id"}),je.belongsTo(Ke,{as:"assay",foreignKey:"assay_id"}),Ke.hasMany(je,{as:"assay_positions",foreignKey:"assay_id"}),ke.belongsTo(Ke,{as:"parent",foreignKey:"parent_id"}),Ke.hasMany(ke,{as:"cartridges",foreignKey:"parent_id"}),Xe.belongsTo(Ke,{as:"parent",foreignKey:"parent_id"}),Ke.hasMany(Xe,{as:"color_disclaimers",foreignKey:"parent_id"}),Ye.belongsTo(Ke,{as:"id_assay",foreignKey:"id"}),Ke.hasOne(Ye,{as:"genotyping_assay",foreignKey:"id"}),at.belongsTo(Ke,{as:"assay",foreignKey:"assay_id"}),Ke.hasMany(at,{as:"graph_setup_assays",foreignKey:"assay_id"}),rt.belongsTo(Ke,{as:"id_assay",foreignKey:"id"}),Ke.hasOne(rt,{as:"lda_assay",foreignKey:"id"}),yt.belongsTo(Ke,{as:"assay",foreignKey:"assay_id"}),Ke.hasMany(yt,{as:"lis_assay_configs",foreignKey:"assay_id"}),Dt.belongsTo(Ke,{as:"parent",foreignKey:"parent_id"}),Ke.hasMany(Dt,{as:"organisms",foreignKey:"parent_id"}),Et.belongsTo(Ke,{as:"id_assay",foreignKey:"id"}),Ke.hasOne(Et,{as:"organism_based_assay",foreignKey:"id"}),Mt.belongsTo(Ke,{as:"id_assay",foreignKey:"id"}),Ke.hasOne(Mt,{as:"percent_ratio_assay",foreignKey:"id"}),Lt.belongsTo(Ke,{as:"id_assay",foreignKey:"id"}),Ke.hasOne(Lt,{as:"quant1_assay",foreignKey:"id"}),Bt.belongsTo(Ke,{as:"parent",foreignKey:"parent_id"}),Ke.hasMany(Bt,{as:"reagent_lots",foreignKey:"parent_id"}),Qt.belongsTo(Ke,{as:"assay",foreignKey:"assay_id"}),Ke.hasMany(Qt,{as:"report_graph_settings",foreignKey:"assay_id"}),Ht.belongsTo(Ke,{as:"parent",foreignKey:"parent_id"}),Ke.hasMany(Ht,{as:"result_calculations",foreignKey:"parent_id"}),Yt.belongsTo(Ke,{as:"parent",foreignKey:"parent_id"}),Ke.hasMany(Yt,{as:"sample_types",foreignKey:"parent_id"}),Wt.belongsTo(Ke,{as:"assay",foreignKey:"assay_id"}),Ke.hasMany(Wt,{as:"selected_quant_unit_settings",foreignKey:"assay_id"}),ta.belongsTo(Ke,{as:"id_assay",foreignKey:"id"}),Ke.hasOne(ta,{as:"target_based_assay",foreignKey:"id"}),la.belongsTo(Ke,{as:"assay",foreignKey:"assay_id"}),Ke.hasMany(la,{as:"tests",foreignKey:"assay_id"}),sa.belongsTo(Ke,{as:"assay",foreignKey:"assay_id"}),Ke.hasMany(sa,{as:"test_blogs",foreignKey:"assay_id"}),Je.belongsTo(qe,{as:"id_basic_organism",foreignKey:"id"}),qe.hasOne(Je,{as:"delta_ct_organism",foreignKey:"id"}),Zt.belongsTo(qe,{as:"id_basic_organism",foreignKey:"id"}),qe.hasOne(Zt,{as:"semi_quant_organism",foreignKey:"id"}),xe.belongsTo(ke,{as:"parent",foreignKey:"parent_id"}),ke.hasMany(xe,{as:"assay_chambers",foreignKey:"parent_id"}),ke.belongsTo(Fe,{as:"cartridge_type",foreignKey:"cartridge_type_id"}),Fe.hasMany(ke,{as:"cartridges",foreignKey:"cartridge_type_id"}),Be.belongsTo(Fe,{as:"parent",foreignKey:"parent_id"}),Fe.hasMany(Be,{as:"chambers",foreignKey:"parent_id"}),Ot.belongsTo(Fe,{as:"parent",foreignKey:"parent_id"}),Fe.hasMany(Ot,{as:"paths",foreignKey:"parent_id"}),He.belongsTo(Ue,{as:"parent",foreignKey:"parent_id"}),Ue.hasMany(He,{as:"channel_raw_data_items",foreignKey:"parent_id"}),lt.belongsTo(Ye,{as:"parent",foreignKey:"parent_id"}),Ye.hasMany(lt,{as:"haplotypes",foreignKey:"parent_id"}),We.belongsTo(Ze,{as:"genotyping_organism",foreignKey:"genotyping_organism_id"}),Ze.hasMany(We,{as:"genotyping_haplotype_organisms",foreignKey:"genotyping_organism_id"}),at.belongsTo(tt,{as:"graph_setup",foreignKey:"graph_setup_id"}),tt.hasMany(at,{as:"graph_setup_assays",foreignKey:"graph_setup_id"}),We.belongsTo(lt,{as:"haplotype",foreignKey:"haplotype_id"}),lt.hasMany(We,{as:"genotyping_haplotype_organisms",foreignKey:"haplotype_id"}),st.belongsTo(lt,{as:"haplotype",foreignKey:"haplotype_id"}),lt.hasMany(st,{as:"haplotype_results",foreignKey:"haplotype_id"}),nt.belongsTo(lt,{as:"parent",foreignKey:"parent_id"}),lt.hasMany(nt,{as:"haplotype_result_texts",foreignKey:"parent_id"}),mt.belongsTo(lt,{as:"haplotype",foreignKey:"haplotype_id"}),lt.hasMany(mt,{as:"lis_haplotype_configs",foreignKey:"haplotype_id"}),pt.belongsTo(ut,{as:"parent",foreignKey:"parent_id"}),ut.hasMany(pt,{as:"lda_coefficients",foreignKey:"parent_id"}),_t.belongsTo(yt,{as:"id_lis_assay_config",foreignKey:"id"}),yt.hasOne(_t,{as:"lis_genotyping_assay_config",foreignKey:"id"}),Nt.belongsTo(Tt,{as:"test_order",foreignKey:"test_order_id"}),Tt.hasMany(Nt,{as:"lis_uploads",foreignKey:"test_order_id"}),qe.belongsTo(Dt,{as:"id_organism",foreignKey:"id"}),Dt.hasOne(qe,{as:"basic_organism",foreignKey:"id"}),Ze.belongsTo(Dt,{as:"id_organism",foreignKey:"id"}),Dt.hasOne(Ze,{as:"genotyping_organism",foreignKey:"id"}),ut.belongsTo(Dt,{as:"id_organism",foreignKey:"id"}),Dt.hasOne(ut,{as:"lda_organism",foreignKey:"id"}),ct.belongsTo(Dt,{as:"organism",foreignKey:"organism_id"}),Dt.hasMany(ct,{as:"lis_organism_configs",foreignKey:"organism_id"}),wt.belongsTo(Dt,{as:"organism",foreignKey:"organism_id"}),Dt.hasMany(wt,{as:"organism_results",foreignKey:"organism_id"}),It.belongsTo(Dt,{as:"parent",foreignKey:"parent_id"}),Dt.hasMany(It,{as:"organism_result_texts",foreignKey:"parent_id"}),Rt.belongsTo(Dt,{as:"parent",foreignKey:"parent_id"}),Dt.hasMany(Rt,{as:"organism_targets",foreignKey:"parent_id"}),Gt.belongsTo(Dt,{as:"id_organism",foreignKey:"id"}),Dt.hasOne(Gt,{as:"percent_ratio_organism",foreignKey:"id"}),Ct.belongsTo(Dt,{as:"id_organism",foreignKey:"id"}),Dt.hasOne(Ct,{as:"quant1_organism",foreignKey:"id"}),Xt.belongsTo(Dt,{as:"parent",foreignKey:"parent_id"}),Dt.hasMany(Xt,{as:"result_evaluators",foreignKey:"parent_id"}),aa.belongsTo(Dt,{as:"id_organism",foreignKey:"id"}),Dt.hasOne(aa,{as:"target_based_organism",foreignKey:"id"}),et.belongsTo(wt,{as:"id_organism_result",foreignKey:"id"}),wt.hasOne(et,{as:"genotyping_organism_result",foreignKey:"id"}),dt.belongsTo(wt,{as:"id_organism_result",foreignKey:"id"}),wt.hasOne(dt,{as:"lda_organism_result",foreignKey:"id"}),bt.belongsTo(wt,{as:"id_organism_result",foreignKey:"id"}),wt.hasOne(bt,{as:"organism_based_organism_result",foreignKey:"id"}),vt.belongsTo(wt,{as:"id_organism_result",foreignKey:"id"}),wt.hasOne(vt,{as:"percent_ratio_organism_result",foreignKey:"id"}),Kt.belongsTo(wt,{as:"id_organism_result",foreignKey:"id"}),wt.hasOne(Kt,{as:"quant1_organism_result",foreignKey:"id"}),Tt.belongsTo(ht,{as:"patient",foreignKey:"patient_id"}),ht.hasMany(Tt,{as:"lis_test_orders",foreignKey:"patient_id"}),la.belongsTo(ht,{as:"patient",foreignKey:"patient_id"}),ht.hasMany(la,{as:"tests",foreignKey:"patient_id"}),kt.belongsTo(Ct,{as:"parent",foreignKey:"parent_id"}),Ct.hasMany(kt,{as:"quant_unit_settings",foreignKey:"parent_id"}),jt.belongsTo(Kt,{as:"parent",foreignKey:"parent_id"}),Kt.hasMany(jt,{as:"quant1_results",foreignKey:"parent_id"}),jt.belongsTo(kt,{as:"quant_unit_setting",foreignKey:"quant_unit_setting_id"}),kt.hasMany(jt,{as:"quant1_results",foreignKey:"quant_unit_setting_id"}),St.belongsTo(Bt,{as:"id_reagent_lot",foreignKey:"id"}),Bt.hasOne(St,{as:"percent_ratio_reagent_lot",foreignKey:"id"}),xt.belongsTo(Bt,{as:"id_reagent_lot",foreignKey:"id"}),Bt.hasOne(xt,{as:"quant1_reagent_lot",foreignKey:"id"}),$t.belongsTo(Bt,{as:"parent",foreignKey:"parent_id"}),Bt.hasMany($t,{as:"sample_settings",foreignKey:"parent_id"}),Vt.belongsTo(Xt,{as:"parent",foreignKey:"parent_id"}),Xt.hasMany(Vt,{as:"result_rule_analytes",foreignKey:"parent_id"}),zt.belongsTo(Vt,{as:"id_result_rule_analyte",foreignKey:"id"}),Vt.hasOne(zt,{as:"result_rule_interpretation",foreignKey:"id"}),Jt.belongsTo(Vt,{as:"id_result_rule_analyte",foreignKey:"id"}),Vt.hasOne(Jt,{as:"result_rule_melt_peak",foreignKey:"id"}),Pt.belongsTo($t,{as:"id_sample_setting",foreignKey:"id"}),$t.hasOne(Pt,{as:"percent_ratio_sample_setting",foreignKey:"id"}),qt.belongsTo($t,{as:"id_sample_setting",foreignKey:"id"}),$t.hasOne(qt,{as:"quant1_sample_setting",foreignKey:"id"}),a.belongsTo(la,{as:"parent",foreignKey:"parent_id"}),la.hasMany(a,{as:"analyte_results",foreignKey:"parent_id"}),st.belongsTo(la,{as:"parent",foreignKey:"parent_id"}),la.hasMany(st,{as:"haplotype_results",foreignKey:"parent_id"}),Tt.belongsTo(la,{as:"test",foreignKey:"test_id"}),la.hasMany(Tt,{as:"lis_test_orders",foreignKey:"test_id"}),Nt.belongsTo(la,{as:"test",foreignKey:"test_id"}),la.hasMany(Nt,{as:"lis_uploads",foreignKey:"test_id"}),wt.belongsTo(la,{as:"parent",foreignKey:"parent_id"}),la.hasMany(wt,{as:"organism_results",foreignKey:"parent_id"}),la.belongsTo(la,{as:"parent",foreignKey:"parent_id"}),la.hasMany(la,{as:"tests",foreignKey:"parent_id"}),ia.belongsTo(la,{as:"test",foreignKey:"test_id"}),la.hasOne(ia,{as:"test_data",foreignKey:"test_id"}),ra.belongsTo(la,{as:"parent",foreignKey:"parent_id"}),la.hasMany(ra,{as:"test_errors",foreignKey:"parent_id"}),pa.belongsTo(la,{as:"parent",foreignKey:"parent_id"}),la.hasMany(pa,{as:"test_histories",foreignKey:"parent_id"}),ua.belongsTo(la,{as:"test",foreignKey:"test_id"}),la.hasMany(ua,{as:"test_nvs",foreignKey:"test_id"}),na.belongsTo(sa,{as:"test_blog",foreignKey:"test_blog_id"}),sa.hasMany(na,{as:"test_blog_counters",foreignKey:"test_blog_id"}),Ue.belongsTo(ia,{as:"parent",foreignKey:"parent_id"}),ia.hasMany(Ue,{as:"channel_raw_data",foreignKey:"parent_id"}),Ft.belongsTo(ia,{as:"parent",foreignKey:"parent_id"}),ia.hasMany(Ft,{as:"raw_data_items",foreignKey:"parent_id"}),oa.belongsTo(ia,{as:"parent",foreignKey:"parent_id"}),ia.hasMany(oa,{as:"test_data_errors",foreignKey:"parent_id"}),Ke.belongsTo(ya,{as:"user",foreignKey:"user_id"}),ya.hasMany(Ke,{as:"assays",foreignKey:"user_id"}),$e.belongsTo(ya,{as:"user",foreignKey:"user_id"}),ya.hasMany($e,{as:"disabled_modules",foreignKey:"user_id"}),la.belongsTo(ya,{as:"user",foreignKey:"user_id"}),ya.hasMany(la,{as:"tests",foreignKey:"user_id"}),pa.belongsTo(ya,{as:"user",foreignKey:"user_id"}),ya.hasMany(pa,{as:"test_histories",foreignKey:"user_id"}),{Analyte:t,AnalyteResult:a,Assay:Ke,AssayChamber:xe,AssayPosition:je,BasicOrganism:qe,Cartridge:ke,CartridgeType:Fe,Chamber:Be,ChannelProcessedDataItem:Qe,ChannelRawDatum:Ue,ChannelRawDataItem:He,ColorDisclaimer:Xe,Config:Ve,CrosstalkCorrResult:ze,DeltaCtOrganism:Je,DisabledModule:$e,GenotypingAssay:Ye,GenotypingHaplotypeOrganism:We,GenotypingOrganism:Ze,GenotypingOrganismResult:et,GraphSetup:tt,GraphSetupAssay:at,Haplotype:lt,HaplotypeResult:st,HaplotypeResultText:nt,Instrument:it,LdaAnalyte:ot,LdaAssay:rt,LdaCoefficient:pt,LdaOrganism:ut,LdaOrganismResult:dt,LisAssayConfig:yt,LisGenotypingAssayConfig:_t,LisHaplotypeConfig:mt,LisOrganismConfig:ct,LisTestOrder:Tt,LisUpload:Nt,MeltPeakResult:gt,MeltPeakSetting:ft,Organism:Dt,OrganismBasedAssay:Et,OrganismBasedOrganismResult:bt,OrganismResult:wt,OrganismResultText:It,OrganismTarget:Rt,Path:Ot,Patient:ht,PercentRatioAssay:Mt,PercentRatioOrganism:Gt,PercentRatioOrganismResult:vt,PercentRatioReagentLot:St,PercentRatioResultEvaluator:At,PercentRatioSampleSetting:Pt,Quant1Assay:Lt,Quant1Organism:Ct,Quant1OrganismResult:Kt,Quant1ReagentLot:xt,Quant1Result:jt,Quant1SampleSetting:qt,QuantUnitSetting:kt,RawDataItem:Ft,ReagentLot:Bt,ReportGraphSetting:Qt,Reporter:Ut,ResultCalculation:Ht,ResultEvaluator:Xt,ResultRuleAnalyte:Vt,ResultRuleInterpretation:zt,ResultRuleMeltPeak:Jt,SampleSetting:$t,SampleType:Yt,SelectedQuantUnitSetting:Wt,SemiQuantOrganism:Zt,SystemLog:ea,TargetBasedAssay:ta,TargetBasedOrganism:aa,Test:la,TestBlog:sa,TestBlogCounter:na,TestDatum:ia,TestDataError:oa,TestError:ra,TestHistory:pa,TestNv:ua,UserPrivilege:da,User:ya}}},7324:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Instrument=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Instrument",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},mac_address:{type:l.DataTypes.BLOB,allowNull:!0},serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},letter_offset:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"instrument",schema:"dbo",timestamps:!1,indexes:[{name:"PK__instrume__3213E83F1D5A460D",unique:!0,fields:[{name:"id"}]},{name:"UX_instrument_letteroffset",unique:!0,fields:[{name:"letter_offset"}]},{name:"UX_instrument_macaddress",unique:!0,fields:[{name:"mac_address"}]},{name:"UX_instrument_serialnumber",unique:!0,fields:[{name:"serial_number"}]}]})}}t.Instrument=s},2673:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaAnalyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaAnalyte",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"analyte",key:"id"}},cycle_if_no_ct:{type:l.DataTypes.INTEGER,allowNull:!1},min_ct_req_pass_controls:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"lda_analyte",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_anal__3213E83F29F9EB12",unique:!0,fields:[{name:"id"}]}]})}}t.LdaAnalyte=s},7425:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaAssay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"lda_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_assa__3213E83F59A52308",unique:!0,fields:[{name:"id"}]}]})}}t.LdaAssay=s},5710:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaCoefficient=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaCoefficient",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"lda_organism",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!1},delta_ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"lda_coefficient",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_coef__3213E83F72D43F1D",unique:!0,fields:[{name:"id"}]}]})}}t.LdaCoefficient=s},4741:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},lda_total:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"lda_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_orga__3213E83F380F55A4",unique:!0,fields:[{name:"id"}]}]})}}t.LdaOrganismResult=s},7110:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},cutoff:{type:l.DataTypes.FLOAT,allowNull:!1},intercept:{type:l.DataTypes.FLOAT,allowNull:!1},max_valid_range:{type:l.DataTypes.FLOAT,allowNull:!1},min_valid_range:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"lda_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_orga__3213E83F8614FDA0",unique:!0,fields:[{name:"id"}]}]})}}t.LdaOrganism=s},3179:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisAssayConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisAssayConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},test_code:{type:l.DataTypes.STRING(15),allowNull:!0},test_code_enabled:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"lis_assay_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_assa__3213E83F3C29870A",unique:!0,fields:[{name:"id"}]}]})}}t.LisAssayConfig=s},4810:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisGenotypingAssayConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisGenotypingAssayConfig",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"lis_assay_config",key:"id"}}},{tableName:"lis_genotyping_assay_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_geno__3213E83FEC5A20DB",unique:!0,fields:[{name:"id"}]}]})}}t.LisGenotypingAssayConfig=s},1219:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisHaplotypeConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisHaplotypeConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"haplotype",key:"id"}},result_code:{type:l.DataTypes.STRING(15),allowNull:!0}},{tableName:"lis_haplotype_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_hapl__3213E83FC2F71408",unique:!0,fields:[{name:"id"}]}]})}}t.LisHaplotypeConfig=s},2855:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisOrganismConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisOrganismConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},result_code:{type:l.DataTypes.STRING(15),allowNull:!0}},{tableName:"lis_organism_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_orga__3213E83F2F292B05",unique:!0,fields:[{name:"id"}]}]})}}t.LisOrganismConfig=s},7519:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisTestOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisTestOrder",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},host_test_code:{type:l.DataTypes.STRING(15),allowNull:!0},instrument_specific_sample_id:{type:l.DataTypes.STRING(64),allowNull:!0},order_status:{type:l.DataTypes.INTEGER,allowNull:!1},patient_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"patient",key:"id"}},priority:{type:l.DataTypes.INTEGER,allowNull:!1},sample_id:{type:l.DataTypes.STRING(25),allowNull:!0},cartridge_id:{type:l.DataTypes.STRING(25),allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test",key:"id"}}},{tableName:"lis_test_order",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_test__3213E83FF0E2345C",unique:!0,fields:[{name:"id"}]},{name:"UX_listestorder_testid",unique:!0,fields:[{name:"test_id"}]}]})}}t.LisTestOrder=s},8608:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisUpload=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisUpload",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},test_order_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"lis_test_order",key:"id"}},upload_message_id:{type:l.DataTypes.STRING(64),allowNull:!0},upload_status:{type:l.DataTypes.INTEGER,allowNull:!1},sample_priority:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"lis_upload",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_uplo__3213E83F0EA9D7BF",unique:!0,fields:[{name:"id"}]},{name:"UX_lis_upload_test_id",unique:!0,fields:[{name:"test_id"}]}]})}}t.LisUpload=s},4298:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte_result",key:"id"}},peak_height:{type:l.DataTypes.FLOAT,allowNull:!1},peak_index:{type:l.DataTypes.INTEGER,allowNull:!1},peak_temperature:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"melt_peak_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_melt_peak_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__melt_pea__3213E83E1FE51EFB",unique:!0,fields:[{name:"id"}]}]})}}t.MeltPeakResult=s},630:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte",key:"id"}},slope_positive:{type:l.DataTypes.BOOLEAN,allowNull:!1},baseline_look_back:{type:l.DataTypes.FLOAT,allowNull:!1},baseline_num_points:{type:l.DataTypes.INTEGER,allowNull:!1},baseline_start_temp:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_max:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_min:{type:l.DataTypes.FLOAT,allowNull:!1},peak_threshold:{type:l.DataTypes.FLOAT,allowNull:!1},points_around_peak:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"melt_peak_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__melt_pea__3213E83FBAF87862",unique:!0,fields:[{name:"id"}]},{name:"UX_meltpeaksetting_parentid",unique:!0,fields:[{name:"parent_id"}]}]})}}t.MeltPeakSetting=s},7883:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismBasedAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismBasedAssay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"organism_based_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83F210E91DF",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismBasedAssay=s},1122:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismBasedOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismBasedOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},semi_quant_level:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"organism_based_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83FBBF8D3EA",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismBasedOrganismResult=s},6321:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultText",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(8),allowNull:!1},result_text:{type:l.DataTypes.INTEGER,allowNull:!1},text_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"organism_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83FF9BBD424",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismResultText=s},9668:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"organism",key:"id"}},result_text:{type:l.DataTypes.INTEGER,allowNull:!1},result_color:{type:l.DataTypes.INTEGER,allowNull:!1},is_result_invalid:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_organism_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__organism__3213E83EA550B35B",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismResult=s},8476:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismTarget=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismTarget",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}}},{tableName:"organism_target",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83F06D96945",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismTarget=s},8374:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Organism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Organism",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},name:{type:l.DataTypes.STRING(32),allowNull:!1},organism_index:{type:l.DataTypes.INTEGER,allowNull:!1},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83FE0D2FAA1",unique:!0,fields:[{name:"id"}]}]})}}t.Organism=s},1548:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Path=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Path",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge_type",key:"id"}},angular_offset:{type:l.DataTypes.FLOAT,allowNull:!1},chamber_number:{type:l.DataTypes.INTEGER,allowNull:!0},is_block:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!1},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"path",schema:"dbo",timestamps:!1,indexes:[{name:"PK__path__3213E83F3A63F5BA",unique:!0,fields:[{name:"id"}]}]})}}t.Path=s},3708:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Patient=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Patient",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},gx_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},practice_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},family_name:{type:l.DataTypes.STRING(1552),allowNull:!0},given_name:{type:l.DataTypes.STRING(240),allowNull:!0},middle_name:{type:l.DataTypes.STRING(240),allowNull:!0},date_of_birth:{type:l.DataTypes.STRING(96),allowNull:!0},gender:{type:l.DataTypes.STRING(128),allowNull:!0},ethnicity:{type:l.DataTypes.STRING(512),allowNull:!0},postal_code:{type:l.DataTypes.STRING(96),allowNull:!0}},{tableName:"patient",schema:"dbo",timestamps:!1,indexes:[{name:"PK__patient__3213E83F500DEB6B",unique:!0,fields:[{name:"id"}]}]})}}t.Patient=s},9913:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioAssay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"percent_ratio_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F68A8D83F",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioAssay=s},9169:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},ratio_percent:{type:l.DataTypes.FLOAT,allowNull:!0},log_transform:{type:l.DataTypes.FLOAT,allowNull:!0},reporting_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},calculation_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},detailed_result:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"percent_ratio_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F8DCBBE5A",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioOrganismResult=s},2232:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},dynamic_range_max:{type:l.DataTypes.FLOAT,allowNull:!1},dynamic_range_min:{type:l.DataTypes.FLOAT,allowNull:!1},lod_loq:{type:l.DataTypes.FLOAT,allowNull:!1},log_transform_type:{type:l.DataTypes.INTEGER,allowNull:!1},units:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"percent_ratio_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F1C1399B7",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioOrganism=s},894:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioReagentLot",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"reagent_lot",key:"id"}}},{tableName:"percent_ratio_reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F295E59AE",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioReagentLot=s},7363:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioResultEvaluator=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioResultEvaluator",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},calculation_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},reporting_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}}},{tableName:"percent_ratio_result_evaluator",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F0102494E",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioResultEvaluator=s},2026:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioSampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioSampleSetting",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"sample_setting",key:"id"}},delta_ct_efficiency:{type:l.DataTypes.FLOAT,allowNull:!0},scaling_factor:{type:l.DataTypes.DECIMAL(5,2),allowNull:!0}},{tableName:"percent_ratio_sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83FACBB9456",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioSampleSetting=s},9250:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1Assay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1Assay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"quant1_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_a__3213E83FFBCA71DA",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1Assay=s},5021:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1OrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1OrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}}},{tableName:"quant1_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_o__3213E83F4ADBB366",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1OrganismResult=s},3739:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1Organism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1Organism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},max_quantitative_delta:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"quant1_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_o__3213E83F760E8E2C",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1Organism=s},6693:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1ReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1ReagentLot",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"reagent_lot",key:"id"}}},{tableName:"quant1_reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_r__3213E83FD7043653",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1ReagentLot=s},2949:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1Result=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1Result",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"quant1_organism_result",key:"id"}},quantitative_result:{type:l.DataTypes.FLOAT,allowNull:!0},quant_unit_setting_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"quant_unit_setting",key:"id"}},result_abnormal_flag:{type:l.DataTypes.STRING(5),allowNull:!0}},{tableName:"quant1_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_quant1_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__quant1_r__3213E83E904FF5F0",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1Result=s},3664:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1SampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1SampleSetting",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"sample_setting",key:"id"}},e0:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},e1:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},e2:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0}},{tableName:"quant1_sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_s__3213E83F2C81C938",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1SampleSetting=s},1747:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QuantUnitSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QuantUnitSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"quant1_organism",key:"id"}},conversion_factor:{type:l.DataTypes.FLOAT,allowNull:!1},display_log_value:{type:l.DataTypes.BOOLEAN,allowNull:!1},lower_limit:{type:l.DataTypes.FLOAT,allowNull:!1},position:{type:l.DataTypes.INTEGER,allowNull:!1},units:{type:l.DataTypes.INTEGER,allowNull:!1},upper_limit:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"quant_unit_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant_un__3213E83FE8E6C80B",unique:!0,fields:[{name:"id"}]}]})}}t.QuantUnitSetting=s},8090:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RawDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("RawDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test_data",key:"id"}},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0},timestamps:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"raw_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_raw_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__raw_data__3213E83E261626F5",unique:!0,fields:[{name:"id"}]}]})}}t.RawDataItem=s},8323:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ReagentLot",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},creation_time:{type:l.DataTypes.DATE,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!1},reagent_lot_number:{type:l.DataTypes.STRING(3),allowNull:!1}},{tableName:"reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__reagent___3213E83F654D76BF",unique:!0,fields:[{name:"id"}]}]})}}t.ReagentLot=s},771:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ReportGraphSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ReportGraphSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}},graph_type:{type:l.DataTypes.INTEGER,allowNull:!0},param_key:{type:l.DataTypes.STRING(64),allowNull:!1},param_val:{type:l.DataTypes.STRING(512),allowNull:!0}},{tableName:"report_graph_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__report_g__3213E83F45404AE6",unique:!0,fields:[{name:"id"}]}]})}}t.ReportGraphSetting=s},200:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Reporter=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Reporter",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},concentration:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(12),allowNull:!1}},{tableName:"reporter",schema:"dbo",timestamps:!1,indexes:[{name:"PK__reporter__3213E83F8B6A21DD",unique:!0,fields:[{name:"id"}]},{name:"UX_reporter_name",unique:!0,fields:[{name:"name"}]}]})}}t.Reporter=s},4829:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultCalculation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultCalculation",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},chain_name:{type:l.DataTypes.STRING(64),allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1}},{tableName:"result_calculation",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_c__3213E83FDF13CEAD",unique:!0,fields:[{name:"id"}]}]})}}t.ResultCalculation=s},1452:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultEvaluator=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultEvaluator",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},evaluator_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_text:{type:l.DataTypes.INTEGER,allowNull:!1},rule_anded:{type:l.DataTypes.BOOLEAN,allowNull:!1},text_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"result_evaluator",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_e__3213E83F523A8A97",unique:!0,fields:[{name:"id"}]}]})}}t.ResultEvaluator=s},1093:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultRuleAnalyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultRuleAnalyte",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"result_evaluator",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},rule_index:{type:l.DataTypes.INTEGER,allowNull:!1},rule_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"result_rule_analyte",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_r__3213E83F54E0B232",unique:!0,fields:[{name:"id"}]}]})}}t.ResultRuleAnalyte=s},3271:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultRuleInterpretation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultRuleInterpretation",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"result_rule_analyte",key:"id"}},interpretation:{type:l.DataTypes.INTEGER,allowNull:!1},pass_on_equals:{type:l.DataTypes.BOOLEAN,allowNull:!1},reasons:{type:l.DataTypes.STRING(50),allowNull:!0}},{tableName:"result_rule_interpretation",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_r__3213E83FB046073F",unique:!0,fields:[{name:"id"}]}]})}}t.ResultRuleInterpretation=s},3745:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultRuleMeltPeak=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultRuleMeltPeak",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"result_rule_analyte",key:"id"}},pass_on_peak:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"result_rule_melt_peak",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_r__3213E83FCFD26AA9",unique:!0,fields:[{name:"id"}]}]})}}t.ResultRuleMeltPeak=s},6709:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"reagent_lot",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},ct_threshold_value:{type:l.DataTypes.FLOAT,allowNull:!1},end_pt_threshold:{type:l.DataTypes.INTEGER,allowNull:!1},min_delta_ct:{type:l.DataTypes.FLOAT,allowNull:!1},normalization_factor:{type:l.DataTypes.INTEGER,allowNull:!1},peak_height_min:{type:l.DataTypes.FLOAT,allowNull:!1},probe_chk_delta:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_high_max:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_high_min:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_low_max:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_low_min:{type:l.DataTypes.INTEGER,allowNull:!1},use_endpoint:{type:l.DataTypes.BOOLEAN,allowNull:!1},use_min_delta_ct:{type:l.DataTypes.BOOLEAN,allowNull:!1},valid_max:{type:l.DataTypes.DECIMAL(5,1),allowNull:!1},valid_min:{type:l.DataTypes.DECIMAL(5,1),allowNull:!1}},{tableName:"sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__sample_s__3213E83F372020C1",unique:!0,fields:[{name:"id"}]}]})}}t.SampleSetting=s},8388:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleType=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleType",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},sample_type_key:{type:l.DataTypes.STRING(5),allowNull:!1}},{tableName:"sample_type",schema:"dbo",timestamps:!1,indexes:[{name:"PK__sample_t__3213E83FB25BD1D4",unique:!0,fields:[{name:"id"}]}]})}}t.SampleType=s},1111:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SelectedQuantUnitSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SelectedQuantUnitSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},units:{type:l.DataTypes.INTEGER,allowNull:!1},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}}},{tableName:"selected_quant_unit_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__selected__3213E83F734FFC3D",unique:!0,fields:[{name:"id"}]}]})}}t.SelectedQuantUnitSetting=s},5274:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SemiQuantOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SemiQuantOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"basic_organism",key:"id"}},delta_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1},low_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1},medium_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1},replaced_result_color:{type:l.DataTypes.INTEGER,allowNull:!1},replaced_result_text:{type:l.DataTypes.INTEGER,allowNull:!1},semi_quant_result_text:{type:l.DataTypes.INTEGER,allowNull:!1},very_low_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"semi_quant_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__semi_qua__3213E83F798098BE",unique:!0,fields:[{name:"id"}]}]})}}t.SemiQuantOrganism=s},7497:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SystemLog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SystemLog",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},details:{type:l.DataTypes.STRING(512),allowNull:!0},error_code:{type:l.DataTypes.INTEGER,allowNull:!0},error_type:{type:l.DataTypes.INTEGER,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!1},site_name:{type:l.DataTypes.CHAR(3),allowNull:!0},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"system_log",schema:"dbo",timestamps:!1,indexes:[{name:"PK__system_l__3213E83FD2152FF4",unique:!0,fields:[{name:"id"}]}]})}}t.SystemLog=s},7657:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TargetBasedAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TargetBasedAssay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"target_based_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__target_b__3213E83FBC5750E1",unique:!0,fields:[{name:"id"}]}]})}}t.TargetBasedAssay=s},6344:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TargetBasedOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TargetBasedOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}}},{tableName:"target_based_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__target_b__3213E83FD1505E40",unique:!0,fields:[{name:"id"}]}]})}}t.TargetBasedOrganism=s},4668:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlogCounter=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlogCounter",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_blog_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test_blog",key:"id"}},date_text:{type:l.DataTypes.STRING(8),allowNull:!0},test_count:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"test_blog_counter",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test_blo__3213E83F641C1761",unique:!0,fields:[{name:"id"}]},{name:"UX_testblogcounter_testblogid_datetext",unique:!0,fields:[{name:"test_blog_id"},{name:"date_text"}]}]})}}t.TestBlogCounter=s},806:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlog",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}}},{tableName:"test_blog",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test_blo__3213E83FB1125CAD",unique:!0,fields:[{name:"id"}]},{name:"UX_testblog_assayid",unique:!0,fields:[{name:"assay_id"}]}]})}}t.TestBlog=s},1257:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestDataError=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestDataError",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test_data",key:"id"}},code:{type:l.DataTypes.INTEGER,allowNull:!1},details:{type:l.DataTypes.STRING(512),allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!1},param1:{type:l.DataTypes.FLOAT,allowNull:!0},param2:{type:l.DataTypes.FLOAT,allowNull:!0},param3:{type:l.DataTypes.FLOAT,allowNull:!0},param4:{type:l.DataTypes.FLOAT,allowNull:!0},severity:{type:l.DataTypes.INTEGER,allowNull:!1},site_state:{type:l.DataTypes.INTEGER,allowNull:!1},step_number:{type:l.DataTypes.INTEGER,allowNull:!1},text_param:{type:l.DataTypes.STRING(64),allowNull:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_data_error",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_data_error_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_dat__3213E83E1B49E848",unique:!0,fields:[{name:"id"}]}]})}}t.TestDataError=s},4114:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestDatum=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestDatum",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test",key:"id"}},datagram_format:{type:l.DataTypes.INTEGER,allowNull:!0},end_time:{type:l.DataTypes.DATE,allowNull:!0},error_status:{type:l.DataTypes.INTEGER,allowNull:!1},fw_version:{type:l.DataTypes.STRING(12),allowNull:!0},icore_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},site_name:{type:l.DataTypes.STRING(512),allowNull:!0},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},start_time:{type:l.DataTypes.DATE,allowNull:!0},state:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_data",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_data_test_id",fields:[{name:"test_id"}]},{name:"PK__test_dat__3213E83EF0E87FE5",unique:!0,fields:[{name:"id"}]},{name:"UX_testdata_testid",unique:!0,fields:[{name:"test_id"}]}]})}}t.TestDatum=s},9067:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestError=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestError",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},code:{type:l.DataTypes.INTEGER,allowNull:!1},details:{type:l.DataTypes.STRING(512),allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!1},param1:{type:l.DataTypes.FLOAT,allowNull:!0},param2:{type:l.DataTypes.FLOAT,allowNull:!0},param3:{type:l.DataTypes.FLOAT,allowNull:!0},param4:{type:l.DataTypes.FLOAT,allowNull:!0},severity:{type:l.DataTypes.INTEGER,allowNull:!1},text_param:{type:l.DataTypes.STRING(64),allowNull:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_error",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_error_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_err__3213E83E23C2502B",unique:!0,fields:[{name:"id"}]}]})}}t.TestError=s},7595:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestHistory",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},creation_time:{type:l.DataTypes.DATE,allowNull:!1},field_name:{type:l.DataTypes.STRING(32),allowNull:!1},new_content:{type:l.DataTypes.STRING(512),allowNull:!0},old_content:{type:l.DataTypes.STRING(512),allowNull:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"users",key:"id"}}},{tableName:"test_history",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_history_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_his__3213E83ED52A9142",unique:!0,fields:[{name:"id"}]}]})}}t.TestHistory=s},2200:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestNv=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestNv",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},archived:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_nv",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test_nv__3213E83F55A45015",unique:!0,fields:[{name:"id"}]},{name:"UX_testnv_testid",unique:!0,fields:[{name:"test_id"}]}]})}}t.TestNv=s},6676:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Test=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Test",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},result_text_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test",key:"id"}},is_current_test:{type:l.DataTypes.BOOLEAN,allowNull:!0},cartridge_barcode:{type:l.DataTypes.STRING(1024),allowNull:!0},cart_serial_number:{type:l.DataTypes.BIGINT,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},data_reduction_algorithm:{type:l.DataTypes.INTEGER,allowNull:!0},error_status:{type:l.DataTypes.INTEGER,allowNull:!1},expiration_date:{type:l.DataTypes.DATE,allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_scanned_patient_id:{type:l.DataTypes.BOOLEAN,allowNull:!0},is_scanned_sample_id:{type:l.DataTypes.BOOLEAN,allowNull:!0},modification_time:{type:l.DataTypes.DATE,allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},order_time:{type:l.DataTypes.DATE,allowNull:!0},other_sample_type_text:{type:l.DataTypes.STRING(32),allowNull:!0},legacy_result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_color:{type:l.DataTypes.TEXT,allowNull:!0},rgt_lot_id:{type:l.DataTypes.STRING(6),allowNull:!0},sample_id:{type:l.DataTypes.STRING(25),allowNull:!0},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"users",key:"id"}},patient_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"patient",key:"id"}},test_type:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"test",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test__3213E83F20BD5504",unique:!0,fields:[{name:"id"}]},{name:"UX_test_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.Test=s},8803:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UserPrivilege=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("UserPrivilege",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},privilege_name:{type:l.DataTypes.STRING(64),allowNull:!1},user_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"user_privilege",schema:"dbo",timestamps:!1,indexes:[{name:"PK__user_pri__3213E83FB86800A5",unique:!0,fields:[{name:"id"}]}]})}}t.UserPrivilege=s},9005:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.User=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("User",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},full_name:{type:l.DataTypes.STRING(128),allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_hidden:{type:l.DataTypes.BOOLEAN,allowNull:!1},login_name:{type:l.DataTypes.STRING(32),allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!0},password:{type:l.DataTypes.STRING(256),allowNull:!1},user_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"users",schema:"dbo",timestamps:!1,indexes:[{name:"PK__users__3213E83FFBF72FFA",unique:!0,fields:[{name:"id"}]},{name:"UX_users_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.User=s},3153:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.triggerLabSelection=t.triggerRegistration=t.saveLab=t.fetchLabs=void 0;const l=a(7104),s=a(7632),n=a(8969),i=a(7219),o=a(9968);function r(e){return(0,o.update)("lab",e)}t.fetchLabs=function(e){return s.backendClient.get(`/labs?${(0,l.stringify)({field:"name",order:"ASC",perPage:100,filter:{search:{name:e}}})}`).then((e=>e.data.data))},t.saveLab=r,t.triggerRegistration=function(){return(0,o.get)("registration_token").then((e=>e?Promise.resolve():(0,n.registerDevice)())).catch((e=>{var t;return i.logger.info(null===(t=null==e?void 0:e.response)||void 0===t?void 0:t.config)}))},t.triggerLabSelection=function(){return(0,o.get)("lab").then((e=>e?Promise.resolve():s.backendClient.get("/labs/current").then((e=>e.data)).then((e=>r(e))).catch((e=>{var t,a;404===(null===(t=e.response)||void 0===t?void 0:t.status)&&(null===(a=process.send)||void 0===a||a.call(process,{type:"trigger-lab-selection"}))}))))}},7219:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.logger=void 0;const s=l(a(8857));t.logger=s.default},5232:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ensureDeviceIsRegistered=void 0;const l=a(8670),s=a(7219),n=a(9968);t.ensureDeviceIsRegistered=function e(){return(0,n.get)("registration_token").then((t=>{if(!t)return s.logger.info("device is not registered"),(0,l.setTimeout)(5e3).then((()=>e()))}))}},5670:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SqliteClient=void 0;const l=a(9634),s=a(496);t.SqliteClient=class{constructor(e){this.models=e}relaylogsTotal(){return this.models.Log.count()}requestsTotal(){return this.models.Request.count()}calibrationsTotal(){return this.models.CalibrationSummary.count()}stockTotal(){return this.models.InventoryEntry.count()}maintenanceTotal(){return this.models.ServiceRequest.count({where:{remoteId:{[s.Op.is]:null}}})}statusTotal(){return this.models.GeneXpertStatus.count()}dailySummaryTotal(){return this.models.DailySummary.count()}monthlySummaryTotal(){return this.models.MonthlySummary.count()}eqaSummaryTotal(){return this.models.EqaSummary.count()}relaylogsPresyncables(e,t,a){return this.models.Log.findAll({where:{[s.Op.or]:[{updatedAt:{[s.Op.gt]:e}},{updatedAt:{[s.Op.eq]:e},id:{[s.Op.notIn]:t}}]},attributes:["id","updatedAt"],limit:a}).then((e=>e.map((e=>({id:e.id.toString(),modified:e.updatedAt})))))}requestsPresyncables(e,t,a){return this.models.Request.findAll({where:{[s.Op.or]:[{updatedAt:{[s.Op.gt]:e}},{updatedAt:{[s.Op.eq]:e},id:{[s.Op.notIn]:t}}]},attributes:["id","updatedAt"],limit:a}).then((e=>e.map((e=>({id:e.id.toString(),modified:e.updatedAt})))))}calibrationsPresyncables(e,t,a){return this.models.CalibrationSummary.findAll({where:{[s.Op.or]:[{updatedAt:{[s.Op.gt]:e}},{updatedAt:{[s.Op.eq]:e},id:{[s.Op.notIn]:t}}]},attributes:["id","updatedAt"],limit:a}).then((e=>e.map((e=>({id:e.id.toString(),modified:e.updatedAt})))))}stockPresyncables(e,t,a){return this.models.InventoryEntry.findAll({where:{[s.Op.or]:[{updatedAt:{[s.Op.gt]:e}},{updatedAt:{[s.Op.eq]:e},id:{[s.Op.notIn]:t}}]},attributes:["id","updatedAt"],limit:a}).then((e=>e.map((e=>({id:e.id.toString(),modified:e.updatedAt})))))}maintenancePresyncables(e,t,a){return this.models.ServiceRequest.findAll({where:{remoteId:{[s.Op.is]:null},[s.Op.or]:[{updatedAt:{[s.Op.gt]:e}},{updatedAt:{[s.Op.eq]:e},id:{[s.Op.notIn]:t}}]},attributes:["id","createdAt"],limit:a}).then((e=>e.map((e=>({id:e.id.toString(),modified:e.createdAt})))))}statusPresyncables(e,t,a){return this.models.GeneXpertStatus.findAll({where:{[s.Op.or]:[{updatedAt:{[s.Op.gt]:e}},{updatedAt:{[s.Op.eq]:e},id:{[s.Op.notIn]:t}}]},attributes:["id","createdAt"],limit:a}).then((e=>e.map((e=>({id:e.id.toString(),modified:e.createdAt})))))}dailySummaryPresyncables(e,t,a){return this.models.DailySummary.findAll({where:{[s.Op.or]:[{createdAt:{[s.Op.gt]:e}},{createdAt:{[s.Op.eq]:e},id:{[s.Op.notIn]:t}}]},attributes:["id","createdAt"],limit:a}).then((e=>e.map((e=>({id:e.id.toString(),modified:e.createdAt})))))}monthlySummaryPresyncables(e,t,a){return this.models.MonthlySummary.findAll({where:{[s.Op.or]:[{createdAt:{[s.Op.gt]:e}},{createdAt:{[s.Op.eq]:e},id:{[s.Op.notIn]:t}}]},attributes:["id","createdAt"],limit:a}).then((e=>e.map((e=>({id:e.id.toString(),modified:e.createdAt})))))}eqaSummaryPresyncables(e,t,a){return this.models.EqaSummary.findAll({where:{[s.Op.or]:[{createdAt:{[s.Op.gt]:e}},{createdAt:{[s.Op.eq]:e},id:{[s.Op.notIn]:t}}]},attributes:["id","createdAt"],limit:a}).then((e=>e.map((e=>({id:e.id.toString(),modified:e.createdAt})))))}relaylogsSyncables(e){return this.models.Log.findAll({where:{id:{[s.Op.in]:e}}}).then((0,l.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}requestsSyncables(e){return this.models.Request.findAll({where:{id:{[s.Op.in]:e}}}).then((0,l.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}calibrationsSyncables(e){return this.models.CalibrationSummary.findAll({where:{id:{[s.Op.in]:e}}}).then((0,l.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}stockSyncables(e){return this.models.InventoryEntry.findAll({where:{id:{[s.Op.in]:e}},include:[{as:"item",model:this.models.InventoryItem}]}).then((0,l.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}maintenanceSyncables(e){return this.models.ServiceRequest.findAll({where:{id:{[s.Op.in]:e}}}).then((0,l.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id}))))}statusSyncables(e){return this.models.GeneXpertStatus.findAll({where:{id:{[s.Op.in]:e}}}).then((0,l.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id}))))}dailySummarySyncables(e){return this.models.DailySummary.findAll({where:{id:{[s.Op.in]:e}}}).then((0,l.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}monthlySummarySyncables(e){return this.models.MonthlySummary.findAll({where:{id:{[s.Op.in]:e}}}).then((0,l.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}eqaSummarySyncables(e){return this.models.EqaSummary.findAll({where:{id:{[s.Op.in]:e}}}).then((0,l.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}}},4639:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CalibrationSummary=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.INTEGER,primaryKey:!0,autoIncrement:!0},name:{type:l.DataTypes.STRING},path:{type:l.DataTypes.STRING},content:{type:l.DataTypes.STRING},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"CalibrationSummary",tableName:"CalibrationSummary"})}static associate(e){}}t.CalibrationSummary=s},22:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.fetchCalibrationSummaries=t.UnsupportedCalibrationError=t.CalibrationCheckError=void 0;const s=l(a(3983)),n=a(3292),i=a(521),o=l(a(2245)),r=a(2037),p=a(1017),u=a(9634),d=a(496),y=a(7219),_=a(9968),m=a(4639);class c extends Error{constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype)}}t.CalibrationCheckError=c;class T extends Error{constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype)}}function N(){return"linux"===process.platform?(0,p.join)((0,r.homedir)(),"Downloads","Summary*.pdf"):"win32"===process.platform?"C:/GeneXpert/XpertCal*/reports/Summary*.pdf":Promise.reject(new T("Unsupported platform"))}function g(e){return new Promise(((t,a)=>{(0,i.glob)(e,((e,l)=>{if(e)return a(e);t(l)}))}))}function f(e){return e.map((e=>({name:e.split(/[\\/]+/).slice(-1).join(""),path:e})))}function D(e){return m.CalibrationSummary.findAll({where:{name:{[d.Op.in]:(0,u.pluck)("name",e)}}}).then((e=>(0,u.pluck)("name",e))).then((t=>e.filter((e=>!t.includes(e.name)))))}function E(e){return Promise.all(e.map((e=>(0,n.readFile)(e.path).then((t=>({name:e.name,path:e.path,content:t.toString("base64")})))))).then((e=>m.CalibrationSummary.bulkCreate(e)))}function b(){return(0,_.update)("last_calibration_checked_at",new Date)}t.UnsupportedCalibrationError=T,t.fetchCalibrationSummaries=function(){return s.default.resolve((0,_.get)("last_calibration_checked_at").then((e=>{if(e&&(0,o.default)(e).add(1,"hours").isBefore())return Promise.reject(new c("Calibration check is not yet due!"))}))).then(N).then(g).then(f).then(D).then(E).then(b).catch(c,(e=>y.logger.info(e.message))).catch((e=>y.logger.error(e)))}},7755:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ContactPerson=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.STRING,primaryKey:!0},name:{type:l.DataTypes.STRING},phone:{type:l.DataTypes.STRING},email:{type:l.DataTypes.STRING},isPrimaryContact:{type:l.DataTypes.BOOLEAN,defaultValue:!1,allowNull:!0},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"ContactPerson",tableName:"ContactPerson"})}static associate(e){}}t.ContactPerson=s},5132:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,o)}r((l=l.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.clearContactPersons=t.saveContactPersons=t.fetchContactPersons=void 0;const s=a(3695);function n(){return s.sqliteModels.ContactPerson.destroy({where:{}})}t.fetchContactPersons=function(e=null){return l(this,void 0,void 0,(function*(){return null==e?yield s.sqliteModels.ContactPerson.findAll():yield s.sqliteModels.ContactPerson.findAll({where:{isPrimaryContact:e}})}))},t.saveContactPersons=function(e){return l(this,void 0,void 0,(function*(){return yield n(),s.sqliteModels.ContactPerson.bulkCreate(e)}))},t.clearContactPersons=n},621:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DailySummary=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.INTEGER,autoIncrement:!0,primaryKey:!0},category:{type:l.DataTypes.STRING,allowNull:!1},numberOfSamplesReceived:{type:l.DataTypes.INTEGER,allowNull:!0},numberOfSamplesDone:{type:l.DataTypes.INTEGER,allowNull:!0},numberOfBacklogSamples:{type:l.DataTypes.INTEGER,allowNull:!0},numberOfRejectedSamples:{type:l.DataTypes.INTEGER,allowNull:!0},numberOfTestsReferred:{type:l.DataTypes.INTEGER,allowNull:!0},numberOfReferredTestResultsReturned:{type:l.DataTypes.INTEGER,allowNull:!0},reportDate:{type:l.DataTypes.DATE,allowNull:!1},createdAt:{type:l.DataTypes.DATE,allowNull:!1},isDraft:{type:l.DataTypes.BOOLEAN,allowNull:!1,defaultValue:!0},sampleRejections:{type:l.DataTypes.JSONB,allowNull:!1,defaultValue:[]},referrals:{type:l.DataTypes.JSONB,allowNull:!1,defaultValue:{id:0,specimenType:{sputum:{total:0,returned:0},stool:{total:0,returned:0},bodyFluid:{total:0,returned:0},tissue:{total:0,returned:0},isolate:{total:0,returned:0},other:{total:0,returned:0}},testType:{geneXpert:{total:0,returned:0},flDST:{total:0,returned:0},slDST:{total:0,returned:0},genomeSequencing:{total:0,returned:0},tbCulture:{total:0,returned:0}}}}},{sequelize:e,timestamps:!1,modelName:"DailySummary",tableName:"DailySummary"})}static associate(e){}}t.DailySummary=s},9931:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.EqaSummary=void 0;const l=a(496),s={type:l.DataTypes.JSON,allowNull:!0,defaultValue:null};class n extends l.Model{static initialize(e){const t={id:{type:l.DataTypes.INTEGER,autoIncrement:!0,primaryKey:!0},round:{type:l.DataTypes.INTEGER,allowNull:!1},reportYear:{type:l.DataTypes.INTEGER,allowNull:!1},createdAt:{type:l.DataTypes.DATE,allowNull:!1}};return["xpertMTBUltraData","truenatMTB","xpertMTBXdrData","afbData","lflamData","cultureData","pdstData","xpertHIV1QualAssay","xpertHIV1ViralLoad"].forEach((e=>{t[e]=Object.assign({},s)})),n.init(t,{sequelize:e,timestamps:!1,modelName:"EqaSummary",tableName:"EqaSummary"})}static associate(e){}}t.EqaSummary=n},7214:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Facility=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.STRING,primaryKey:!0},name:{type:l.DataTypes.STRING,allowNull:!1}},{sequelize:e,timestamps:!1,modelName:"Facility",tableName:"Facility"})}static associate(e){}}t.Facility=s},2933:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Instrument=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({serial:{type:l.DataTypes.STRING,primaryKey:!0},active:{type:l.DataTypes.BOOLEAN}},{sequelize:e,modelName:"Instrument",tableName:"Instrument",timestamps:!1})}static associate(e){}}t.Instrument=s},253:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.InventoryAdjustment=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.STRING,primaryKey:!0,autoIncrement:!0},type:{type:l.DataTypes.STRING},itemId:{type:l.DataTypes.STRING,references:{key:"id",model:"InventoryItem"}},batchId:{type:l.DataTypes.STRING},previousBatchAdjustmentId:{type:l.DataTypes.STRING},previousItemAdjustmentId:{type:l.DataTypes.STRING},quantity:{type:l.DataTypes.INTEGER},batchNumber:{type:l.DataTypes.STRING},expiry:{type:l.DataTypes.DATE},disposeReason:{type:l.DataTypes.STRING},narrative:{type:l.DataTypes.STRING},batchBalance:{type:l.DataTypes.INTEGER},itemBalance:{type:l.DataTypes.INTEGER},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"InventoryAdjustment",tableName:"InventoryAdjustment"})}static associate(e){e.InventoryAdjustment.belongsTo(e.InventoryItem,{as:"item",foreignKey:"batchId",targetKey:"id"})}}t.InventoryAdjustment=s},1892:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.InventoryEntry=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.INTEGER,primaryKey:!0,autoIncrement:!0},type:{type:l.DataTypes.STRING},itemId:{type:l.DataTypes.INTEGER,references:{key:"id",model:"InventoryItem"}},quantity:{type:l.DataTypes.INTEGER},batchNumber:{type:l.DataTypes.STRING},expiry:{type:l.DataTypes.DATE},disposeReason:{type:l.DataTypes.STRING},narrative:{type:l.DataTypes.STRING},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"InventoryEntry",tableName:"InventoryEntry"})}static associate(e){e.InventoryEntry.hasOne(e.SyncItem,{as:"syncItem",foreignKey:"primaryId",scope:{list:"stock"}}),e.InventoryEntry.belongsTo(e.InventoryItem,{as:"item",foreignKey:"itemId"})}}t.InventoryEntry=s},584:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.InventoryItem=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.STRING,primaryKey:!0},name:{type:l.DataTypes.STRING},image:{type:l.DataTypes.STRING},unit:{type:l.DataTypes.STRING},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"InventoryItem",tableName:"InventoryItem"})}static associate(e){e.InventoryItem.hasMany(e.InventoryAdjustment,{as:"lastAdjustment",foreignKey:"itemId",sourceKey:"id"})}}t.InventoryItem=s},4880:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.KeyValue=void 0;const l=a(496),s=a(3695);class n extends l.Model{}t.KeyValue=n,n.init({key:{type:l.DataTypes.STRING,primaryKey:!0},value:{type:l.DataTypes.JSON,get(){const e=this.getDataValue("value");return JSON.parse(e)},set(e){this.setDataValue("value",JSON.stringify(e))}}},{sequelize:s.sequelize,timestamps:!1,modelName:"KeyValue",tableName:"KeyValue"})},9968:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,o)}r((l=l.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.read=t.update=t.get=void 0;const s=a(9634),n=a(4880);t.get=function(e){return n.KeyValue.findByPk(e).then((e=>e?e.value:null))},t.update=function(e,t){return n.KeyValue.findOne({where:{key:e}}).then((a=>a?a.update({value:t}):n.KeyValue.create({key:e,value:t},{})))},t.read=function(){return l(this,void 0,void 0,(function*(){return n.KeyValue.findAll().then((e=>e.map((({key:e,value:t})=>({[e]:t}))))).then(s.mergeAll)}))}},2358:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Log=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.INTEGER,primaryKey:!0,autoIncrement:!0},value:{type:l.DataTypes.JSON,get(){const e=this.getDataValue("value");return JSON.parse(e)},set(e){this.setDataValue("value",JSON.stringify(e))}}},{sequelize:e,modelName:"Log",tableName:"Log"})}static associate(e){}}t.Log=s},7840:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MonthlySummary=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.INTEGER,autoIncrement:!0,primaryKey:!0},category:{type:l.DataTypes.STRING,allowNull:!1},reportMonth:{type:l.DataTypes.STRING,allowNull:!0},reportYear:{type:l.DataTypes.INTEGER,allowNull:!0},createdAt:{type:l.DataTypes.DATE,allowNull:!1},isDraft:{type:l.DataTypes.BOOLEAN,allowNull:!1,defaultValue:!0},afbData:{type:l.DataTypes.JSON,allowNull:!1,defaultValue:{}},lflamData:{type:l.DataTypes.JSON,allowNull:!1,defaultValue:{}},cultureData:{type:l.DataTypes.JSON,allowNull:!1,defaultValue:{}},dstData:{type:l.DataTypes.JSON,allowNull:!1,defaultValue:{}},eidData:{type:l.DataTypes.JSON,allowNull:!1,defaultValue:{}},vlData:{type:l.DataTypes.JSON,allowNull:!1,defaultValue:{}}},{sequelize:e,timestamps:!1,modelName:"MonthlySummary",tableName:"MonthlySummary"})}static associate(e){}}t.MonthlySummary=s},8358:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Request=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.INTEGER,autoIncrement:!0,primaryKey:!0},testType:{type:l.DataTypes.STRING},sampleId:{type:l.DataTypes.STRING,allowNull:!1},mrn:{type:l.DataTypes.STRING},diagnosisType:{type:l.DataTypes.STRING},name:{type:l.DataTypes.STRING},age:{type:l.DataTypes.NUMBER},gender:{type:l.DataTypes.STRING},reasonForDiagnosis:{type:l.DataTypes.STRING},infectionSite:{type:l.DataTypes.STRING},previouslyTreated:{type:l.DataTypes.STRING},hivStatus:{type:l.DataTypes.STRING},isRepeatedRifResitanceTest:{type:l.DataTypes.STRING},sampleCollectedAt:{type:l.DataTypes.DATE},sampleCollectionSiteType:{type:l.DataTypes.STRING},sampleCollectionSiteId:{type:l.DataTypes.STRING},sampleType:{type:l.DataTypes.STRING},patientContacts:{type:l.DataTypes.STRING},clinicianContacts:{type:l.DataTypes.STRING},referringLabContacts:{type:l.DataTypes.STRING},patientRegistrationGroup:{type:l.DataTypes.STRING},isRepeatedConfirmatoryRifTest:{type:l.DataTypes.STRING},panelProvider:{type:l.DataTypes.STRING},panelScheme:{type:l.DataTypes.STRING},panelYear:{type:l.DataTypes.STRING},panelRound:{type:l.DataTypes.STRING},panelPtId:{type:l.DataTypes.STRING},verificationType:{type:l.DataTypes.STRING},laboratoryName:{type:l.DataTypes.STRING},address:{type:l.DataTypes.STRING},verificationDate:{type:l.DataTypes.DATE},testScheme:{type:l.DataTypes.STRING},instrumentSn:{type:l.DataTypes.STRING},moduleName:{type:l.DataTypes.STRING},moduleSn:{type:l.DataTypes.STRING},sampleLotNo:{type:l.DataTypes.STRING},eid:{type:l.DataTypes.JSON},viralLoad:{type:l.DataTypes.JSON},researchName:{type:l.DataTypes.STRING},isAutoApproved:{type:l.DataTypes.BOOLEAN,allowNull:!0},approvedById:{type:l.DataTypes.STRING,allowNull:!0,defaultValue:null},approvedByName:{type:l.DataTypes.STRING,allowNull:!0,defaultValue:null},approvedDate:{type:l.DataTypes.DATE,allowNull:!0,defaultValue:null},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"Request",tableName:"Request",timestamps:!0})}static associate(e){}}t.Request=s},3695:function(e,t,a){var l=this&&this.__createBinding||(Object.create?function(e,t,a,l){void 0===l&&(l=a);var s=Object.getOwnPropertyDescriptor(t,a);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,l,s)}:function(e,t,a,l){void 0===l&&(l=a),e[l]=t[a]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&l(t,e,a);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.sqliteModels=t.sequelize=void 0;const i=a(496),o=n(a(661)),r=a(4639),p=a(253),u=a(1892),d=a(584),y=a(2358),_=a(8358),m=a(7003),c=a(7214),T=a(2933),N=a(7761),g=a(7427),f=a(883),D=a(621),E=a(7840),b=a(7755),w=a(9931),[,,I]=process.argv;t.sequelize=new i.Sequelize({dialectModule:o,dialect:"sqlite",storage:I,logging:!1}),t.sqliteModels=function(e){const t=[r.CalibrationSummary,c.Facility,f.GeneXpertStatus,T.Instrument,p.InventoryAdjustment,u.InventoryEntry,d.InventoryItem,y.Log,_.Request,N.ServiceRequest,m.SyncItem,g.User,D.DailySummary,E.MonthlySummary,w.EqaSummary,b.ContactPerson].map((({initialize:t})=>t(e))).reduce(((e,t)=>Object.assign(Object.assign({},e),{[t.name]:t})),{});return Object.keys(t).forEach((e=>{var a,l;null===(l=null===(a=t[e])||void 0===a?void 0:a.associate)||void 0===l||l.call(a,t)})),t}(t.sequelize)},7761:function(e,t,a){var l=this&&this.__createBinding||(Object.create?function(e,t,a,l){void 0===l&&(l=a);var s=Object.getOwnPropertyDescriptor(t,a);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,l,s)}:function(e,t,a,l){void 0===l&&(l=a),e[l]=t[a]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&l(t,e,a);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.ServiceRequest=void 0;const i=a(496),o=n(a(5828));class r extends i.Model{static initialize(e){return r.init({id:{type:i.DataTypes.STRING,defaultValue:o.v4,primaryKey:!0},remoteId:{type:i.DataTypes.STRING},maintenanceNumber:{type:i.DataTypes.INTEGER},status:{type:i.DataTypes.STRING,defaultValue:"initiated"},issueType:{type:i.DataTypes.STRING},computerSerialNumber:{type:i.DataTypes.STRING},machineSerialNumber:{type:i.DataTypes.STRING,allowNull:!0},serialNumber:{type:i.DataTypes.STRING},failedModuleSerialNumber:{type:i.DataTypes.STRING},description:{type:i.DataTypes.STRING},photo:{type:i.DataTypes.JSON},installationQualificationReport:{type:i.DataTypes.STRING},systemLogReport:{type:i.DataTypes.STRING},resultArchiveReport:{type:i.DataTypes.STRING},createdAt:{type:i.DataTypes.DATE},updatedAt:{type:i.DataTypes.DATE}},{sequelize:e,modelName:"ServiceRequest",tableName:"ServiceRequest",timestamps:!0})}static associate(e){}}t.ServiceRequest=r},3157:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.fetchStatus=void 0;const l=a(5828),s=a(3695);t.fetchStatus=function(e){return()=>e.systemInfo().then((e=>{const t=e.sites.map((t=>{const{serial:a,instrument:l,disabled:s}=e.modules.find((e=>e.position.trim()===t));return{site:t,module:a,instrument:l,disabled:s}})),a=(0,l.v4)();return s.sqliteModels.GeneXpertStatus.create({id:a,state:t})}))}},883:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GeneXpertStatus=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.STRING,primaryKey:!0},state:{type:l.DataTypes.JSON},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"GeneXpertStatus",tableName:"GeneXpertStatus",timestamps:!0})}static associate(e){}}t.GeneXpertStatus=s},7427:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.User=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.STRING,primaryKey:!0},name:{type:l.DataTypes.STRING}},{sequelize:e,modelName:"User",tableName:"User"})}static associate(e){}}t.User=s},7003:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SyncItem=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({list:{type:l.DataTypes.STRING,allowNull:!1,primaryKey:!0},direction:{type:l.DataTypes.STRING,allowNull:!1,primaryKey:!0,defaultValue:"up"},primaryId:{type:l.DataTypes.STRING,allowNull:!1,primaryKey:!0},secondaryId:{type:l.DataTypes.STRING,allowNull:!0},version:{type:l.DataTypes.STRING,allowNull:!0},modifiedAt:{type:l.DataTypes.DATE,allowNull:!0},uploadedAt:{type:l.DataTypes.DATE,allowNull:!0},createdAt:{type:l.DataTypes.DATE,allowNull:!1},updatedAt:{type:l.DataTypes.DATE,allowNull:!1}},{sequelize:e,modelName:"SyncItem",tableName:"SyncItem",timestamps:!0})}static associate(e){}}t.SyncItem=s},3827:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.createSyncWorker=void 0;const s=l(a(1055)),n=a(7219);t.createSyncWorker=function(){const e=new s.default({maxConcurrent:1,minTime:2e3});let t=[];const a=()=>Promise.resolve(),l=()=>{(t.length?t:[a]).forEach((t=>e.schedule(t)))};return l(),e.on("idle",l),e.on("error",(e=>n.logger.error(e.message,e.stack))),{add(e){t.push(e)},addFromGetters(e){return e.reduce(((e,t)=>e.then((()=>t())).then((e=>e.forEach((e=>this.add(e)))))),Promise.resolve())}}}},3728:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.updateLastModified=t.createSqlitePuller=t.createServerPuller=t.createGeneXpertPuller=t.PullError=void 0;const s=a(9968),n=l(a(3983)),i=a(881),o=a(7219),r=a(3695),p=a(9634);class u extends Error{constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype)}}function d(){return(0,s.get)("database").then((e=>{if(!e)return Promise.reject(new u("GeneXpert database is not connected"))}))}function y(e,t="up"){return a=>{if(0===a.length)return Promise.reject(new u(`No ${e} left to save`));o.logger.info(`Saving ${a.length} ${e}`);const l=a.map((({id:a,modified:l})=>({list:e,version:i.version,direction:t,primaryId:a,modifiedAt:l})));return r.sqliteModels.SyncItem.bulkCreate(l,{updateOnDuplicate:["modifiedAt","primaryId"]})}}function _(e){return()=>r.sqliteModels.SyncItem.findOne({where:{list:e},order:[["modifiedAt","DESC"]],attributes:["modifiedAt"],rejectOnEmpty:!0}).then((t=>(0,s.update)(`${e}_last_modified`,t.modifiedAt))).then((({value:e})=>r.sqliteModels.SyncItem.findAll({where:{modifiedAt:e},attributes:["primaryId"]}))).then((t=>(0,s.update)(`${e}_last_ids`,(0,p.pluck)("primaryId",t))))}t.PullError=u,t.createGeneXpertPuller=function(e,t=100,a){return()=>n.default.resolve().then(d).then(function(e,t,a){return()=>Promise.all([(0,s.get)(`${e}_last_modified`),(0,s.get)(`${e}_last_ids`)]).then((([l,s])=>t[`${e}Presyncables`](l||new Date("1970"),s||[],a)))}(e,a,t)).then(function(e,t){return a=>{if(!a.length)return Promise.reject(new u(`No ${e} left to save`));const l=a.map((({id:a,modified:l})=>({list:e,status:"fetched",version:t.version,primaryId:a,modifiedAt:l})));return r.sqliteModels.SyncItem.bulkCreate(l,{updateOnDuplicate:["modifiedAt","primaryId"]})}}(e,a)).then(_(e)).catch(u,(e=>o.logger.info(e.message))).catch((e=>(o.logger.error(e.message,e),Promise.reject(e))))},t.createServerPuller=function(e,t,a=10){return()=>n.default.resolve().then(function(e,t,a){return()=>Promise.all([(0,s.get)(`${t}_last_modified`),(0,s.get)(`${t}_last_ids`)]).then((([l,s])=>e[`${t}Presyncables`](l||new Date("1970"),s||[],a)))}(e,t,a)).then(y(t,"down")).then(_(t)).catch(u,(e=>o.logger.info(e.message))).catch((e=>(o.logger.error(e.message,e),Promise.reject(e))))},t.createSqlitePuller=function(e,t,a=100){return()=>n.default.resolve().then(function(e,t,a){return()=>Promise.all([(0,s.get)(`${t}_last_modified`),(0,s.get)(`${t}_last_ids`)]).then((([l,s])=>e[`${t}Presyncables`](l||new Date("1970"),s||[],a)))}(e,t,a)).then(y(t)).then(_(t)).catch(u,(e=>o.logger.info(e.message))).catch((e=>(o.logger.error(e.message,e),Promise.reject(e))))},t.updateLastModified=_},1467:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getMachineStatus=void 0;const l=a(9968);t.getMachineStatus=function(e){return Promise.all([(0,l.read)(),e.systemInfo()]).then((([e,t])=>Object.assign(Object.assign({},e),{time:new Date,info:t})))}},653:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,o)}r((l=l.apply(e,t||[])).next())}))},s=this&&this.__asyncValues||function(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,a=e[Symbol.asyncIterator];return a?a.call(e):(e="function"==typeof __values?__values(e):e[Symbol.iterator](),t={},l("next"),l("throw"),l("return"),t[Symbol.asyncIterator]=function(){return this},t);function l(a){t[a]=e[a]&&function(t){return new Promise((function(l,s){!function(e,t,a,l){Promise.resolve(l).then((function(t){e({value:t,done:a})}),t)}(l,s,(t=e[a](t)).done,t.value)}))}}};Object.defineProperty(t,"__esModule",{value:!0}),t.autoApproveRequests=t.updateSavedCount=t.updateSyncListTotal=t.updateServerStatus=t.updateDatabaseStatus=void 0;const n=a(496),i=a(7632),o=a(7219),r=a(9968),p=a(3695),u=a(1467),d=a(1415);t.updateDatabaseStatus=function(e){return e.sequelize.authenticate().then((()=>(0,r.update)("database",!0))).catch((e=>(o.logger.error(e),(0,r.update)("database",!1))))},t.updateServerStatus=function(e){return(0,u.getMachineStatus)(e).then((e=>i.backendClient.post("/status",e))).then((()=>!0)).catch((()=>!1)).then((e=>(0,r.update)("server",e)))},t.updateSyncListTotal=function(e,t){return()=>e[`${t}Total`]().then((e=>(0,r.update)(`${t}_total`,e||0)))},t.updateSavedCount=function(){return p.sequelize.query("select list, count(*) as count from SyncItem group by list").then((([e])=>e)).then((e=>Promise.all(e.map((({list:e,count:t})=>(0,r.update)(`${e}_saved`,t))))))},t.autoApproveRequests=function(){var e,t,a;return l(this,void 0,void 0,(function*(){console.log("autoApproveRequests updater");const l=yield p.sqliteModels.Request.findAll({where:{approvedDate:{[n.Op.is]:null}},order:[["sampleCollectedAt","DESC"]]});if(o.logger.info(`=========> Auto approving ${l.length} requests`),l.length>0){const n=yield(0,d.createGeneXpertClient)();try{for(var i,r=s(l);!(i=yield r.next()).done;){const e=i.value,t=yield n.getTest(e.sampleId),l=null==t?void 0:t.dataValues;if(console.log(`Checking request for auto approving ${e.sampleId} with state ${null==l?void 0:l.state} and end_time ${null==l?void 0:l.end_time} and modification_time ${null==l?void 0:l.modification_time}`),l&&"2"===(null===(a=null==l?void 0:l.state)||void 0===a?void 0:a.toString())&&((null==l?void 0:l.end_time)||(null==l?void 0:l.modification_time))){new Date(l.end_time||l.modification_time)<new Date(Date.now()-36e5)&&(yield e.update({isAutoApproved:!0,approvedByName:"Auto Approved",approvedDate:new Date}))}}}catch(t){e={error:t}}finally{try{i&&!i.done&&(t=r.return)&&(yield t.call(r))}finally{if(e)throw e.error}}}return l}))}},5222:function(e,t,a){var l=this&&this.__createBinding||(Object.create?function(e,t,a,l){void 0===l&&(l=a);var s=Object.getOwnPropertyDescriptor(t,a);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,l,s)}:function(e,t,a,l){void 0===l&&(l=a),e[l]=t[a]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&l(t,e,a);return s(t,e),t},i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.ServerSyncClient=void 0;const o=i(a(2167)),r=n(a(7147)),p=i(a(1017)),u=a(9634),d=a(7632);function y(e){return d.backendClient.get(`/sync-items/${e}/total`).then((e=>e.data))}function _(e,t,a,l){return d.backendClient.post(`/sync-items/${e}/presyncables`,{since:t,lastIds:a,limit:l}).then((e=>e.data))}function m(e,t){return d.backendClient.post(`/sync-items/${e}/syncables`,{ids:t}).then((e=>e.data))}t.ServerSyncClient=class{constructor(e){this.models=e}stockitemsTotal(){return y("stockitems")}stockitemsPresyncables(e,t,a){return _("stockitems",e,t,a)}stockitemsSyncables(e){return m("stockitems",e)}stockitemsSave(e){const t=(0,u.map)((e=>({id:e.id,name:e.name,unit:e.unit,image:e.image}))),a=(0,u.map)((e=>({secondaryId:e.id,primaryId:e.id})));return Promise.all(e.map((e=>Promise.resolve(function(e){if(!e)return;const[,,,t]=process.argv,a=e.split("/").pop(),l=p.default.join(t||p.default.resolve("images"),a);return(0,o.default)({url:e,method:"GET",responseType:"stream"}).then((e=>new Promise(((t,s)=>{e.data.pipe(r.createWriteStream(l)).on("error",s).once("close",(()=>t(a)))}))))}(e.image)).then((t=>Object.assign(Object.assign({},e),{image:t})))))).then(t).then((e=>this.models.InventoryItem.bulkCreate(e,{updateOnDuplicate:["name","unit","image"]}))).then(a)}stockledgerTotal(){return y("stockledger")}stockledgerPresyncables(e,t,a){return _("stockledger",e,t,a)}stockledgerSyncables(e){return m("stockledger",e)}stockledgerSave(e){const t=(0,u.map)((e=>({id:e.id,itemId:e.itemId,batchId:e.batchId,type:e.type,quantity:e.quantity,previousBatchAdjustmentId:e.previousBatchAdjustmentId,previousItemAdjustmentId:e.previousStoreItemAdjustmentId,itemBalance:e.storeItemBalance,batchBalance:e.batchBalance,batchNumber:e.batchNumber,disposeReason:e.disposeReason,expiry:e.expiry,narrative:e.narrative,createdAt:new Date(e.createdAt),updatedAt:new Date(e.createdAt)})));return this.models.InventoryAdjustment.bulkCreate(t(e)).then((e=>e.map((e=>({secondaryId:e.id,primaryId:e.id})))))}facilitiesTotal(){return y("facilities")}facilitiesPresyncables(e,t,a){return _("facilities",e,t,a)}facilitiesSyncables(e){return m("facilities",e)}facilitiesSave(e){return this.models.Facility.bulkCreate(e.map((e=>({id:e.id,name:e.name}))),{updateOnDuplicate:["name"]}).then((e=>e.map((e=>({secondaryId:e.id,primaryId:e.id})))))}servicerequestsTotal(){return y("servicerequests")}servicerequestsPresyncables(e,t,a){return _("servicerequests",e,t,a)}servicerequestsSyncables(e){return m("servicerequests",e)}servicerequestsSave(e){return this.models.ServiceRequest.bulkCreate(e.map((e=>({id:e.originalId,remoteId:e.id,issueType:e.issueType,serialNumber:e.serialNumber,computerSerialNumber:e.computerSerialNumber,description:e.description,failedModuleSerialNumber:e.failedModuleSerialNumber,status:e.status,maintenanceNumber:e.maintenanceNumber,photo:e.photo,resultArchiveReport:e.resultArchive,installationQualificationReport:e.installationQualificationReport,systemLogReport:e.systemLogReport}))),{updateOnDuplicate:["remoteId","issueType","serialNumber","computerSerialNumber","description","failedModuleSerialNumber","status","maintenanceNumber","photo","resultArchiveReport","installationQualificationReport","systemLogReport"]}).then((e=>e.map((e=>({primaryId:e.remoteId,secondaryId:e.id})))))}usersTotal(){return y("users")}usersPresyncables(e,t,a){return _("users",e,t,a)}usersSyncables(e){return m("users",e)}usersSave(e){return this.models.User.bulkCreate(e.map((e=>({id:e.id,name:e.name}))),{updateOnDuplicate:["name"]}).then((e=>e.map((e=>({secondaryId:e.id,primaryId:e.id})))))}}},8626:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.loadContactPersons=t.isAssigned=t.isOnline=t.storedInterval=t.interval=t.intervalWhenFull=t.throttled=void 0;const s=l(a(2245)),n=a(9634),i=a(7632),o=a(3153),r=a(9968),p=a(5132);t.throttled=function(e,...t){return()=>Promise.all(t.map((e=>e()))).then((t=>{if(t.every(Boolean))return e()}))},t.intervalWhenFull=function(e,t=15){let a;return()=>(0,r.read)().then((l=>!(l[`${e}_saved`]===l[`${e}_total`]&&!(0,n.isNil)(a)&&!(0,s.default)(a).isBefore()||(a=(0,s.default)().add(t,"minutes").toDate(),0))))},t.interval=function(e=15){let t;return()=>!(!(0,n.isNil)(t)&&!(0,s.default)(t).isBefore()||(t=(0,s.default)().add(e,"minutes").toDate(),0))},t.storedInterval=function(e){return()=>(0,r.get)(e).then((e=>(0,n.isNil)(e)||(0,s.default)(e).isBefore()))},t.isOnline=function(){return(0,r.get)("server").then(Boolean)},t.isAssigned=function(){return(0,r.get)("lab").then((e=>!!e||i.backendClient.get("/labs/current").then((e=>e.data)).then((e=>(0,o.saveLab)(e))).then((()=>!1)).catch((e=>!1))))},t.loadContactPersons=function(){return console.log("Loading contact persons from server..."),i.backendClient.get("/contact-persons").then((e=>e.data)).then((e=>(0,p.saveContactPersons)(e))).then((()=>!1)).catch((e=>!1))}},2167:e=>{e.exports=require("axios")},3983:e=>{e.exports=require("bluebird")},1055:e=>{e.exports=require("bottleneck")},5142:e=>{e.exports=require("dotenv")},8857:e=>{e.exports=require("electron-log")},521:e=>{e.exports=require("glob")},4804:e=>{e.exports=require("hostname-patcher")},2245:e=>{e.exports=require("moment")},9424:e=>{e.exports=require("mssql")},4768:e=>{e.exports=require("mssql/msnodesqlv8")},7104:e=>{e.exports=require("qs")},9634:e=>{e.exports=require("ramda")},496:e=>{e.exports=require("sequelize")},661:e=>{e.exports=require("sqlite3")},5828:e=>{e.exports=require("uuid")},7147:e=>{e.exports=require("fs")},3292:e=>{e.exports=require("fs/promises")},2037:e=>{e.exports=require("os")},1017:e=>{e.exports=require("path")},8670:e=>{e.exports=require("timers/promises")},881:e=>{e.exports=JSON.parse('{"name":"medx-relay","description":"MedX Relay","version":"2.0.3","npmRebuild":false,"private":true,"main":"./build-electron/main.js","homepage":".","author":{"name":"MedX International","email":"info@medx.international","url":"https://medx.international"},"scripts":{"postinstall":"electron-builder install-app-deps","react:start":"cross-env BROWSER=none PORT=3001 react-scripts start","react:build":"react-scripts build","react:test":"react-scripts test","react:eject":"react-scripts eject","compile":"tsc --project tsconfig.json","compile:watch":"npm run compile -- --watch","predev":"npm run runtime-env","dev":"npm run compile && npm run dev:watch","dev:watch":"concurrently --kill-others-on-fail \\"npm run react:start\\" \\"npm run compile:watch\\" \\"npm run electron:watch\\"","electron:watch":"nodemon -d 5 -w dist/src/electron -w dist/src -i dist/src/ui  -x \\"npm run electron:start\\"","electron:start":"wait-on tcp:3001 && cross-env IS_DEV=true electron ./dist/src/main.js","electron:build":"cross-env NODE_ENV=production webpack --config webpack-back.config.js","prepack":"npm run clean && npm run runtime-env && npm run compile && npm run electron:build && npm run react:build","clean":"node ./fs.js rm build build-electron connect dist out","runtime-env":"node ./runtime-env.js","pack:win":"electron-builder -c builder.js --dir -w --ia32","dist:win":"electron-builder -c builder.js -w --ia32","pack:linux":"electron-builder -c builder.js --dir -l","dist:linux":"electron-builder -c builder.js -l","migration":"node migration.js","migrate:up":"npx ts-node src/store/migrate.ts"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"devDependencies":{"@emotion/react":"^11.10.0","@emotion/styled":"^11.10.0","@mui/icons-material":"^5.8.4","@mui/material":"^5.9.2","@tanstack/react-query":"^4.0.10","@testing-library/jest-dom":"^5.16.4","@testing-library/react":"^13.3.0","@testing-library/user-event":"^13.5.0","@types/bluebird":"^3.5.36","@types/glob":"^8.1.0","@types/jest":"^27.5.2","@types/mssql":"^8.0.3","@types/node":"^18.6.3","@types/ramda":"^0.28.15","@types/react":"^18.0.15","@types/react-dom":"^18.0.6","@types/sqlite3":"^3.1.8","@types/uuid":"^9.0.1","concurrently":"^7.3.0","cross-env":"^7.0.3","dotenv-webpack":"^8.0.1","electron":"^19.0.10","electron-builder":"^23.3.3","electron-icon-maker":"^0.0.5","electron-is-dev":"^2.0.0","json-to-ts":"^1.7.0","node-loader":"^2.0.0","nodemon":"^2.0.19","react":"^18.2.0","react-dom":"^18.2.0","react-router-dom":"^6.3.0","react-scripts":"5.0.1","sequelize-auto":"^0.8.8","sequelize-typescript-generator":"^8.4.1","string-replace-loader":"^3.1.0","typescript":"^4.7.4","wait-on":"^6.0.1","web-vitals":"^2.1.4","webpack-cli":"^4.10.0","webpack-node-externals":"^3.0.0"},"dependencies":{"@elife/pm2":"github:ernest-okot/pm2","axios":"^0.27.2","bluebird":"^3.7.2","bottleneck":"^2.19.5","dotenv":"^16.0.3","electron-log":"^4.4.8","electron-updater":"^5.2.1","express":"^4.18.1","glob":"^8.0.3","hostname-patcher":"^1.1.0","moment":"^2.29.4","msnodesqlv8":"^2.6.0","mssql":"^9.0.0","qs":"^6.11.0","ramda":"^0.28.0","react-hook-form":"^7.38.0","sequelize":"^6.21.3","sqlite3":"^5.1.1","umzug":"^3.2.1","uuid":"^9.0.0"}}')}},t={};function a(l){var s=t[l];if(void 0!==s)return s.exports;var n=t[l]={exports:{}};return e[l].call(n.exports,n,n.exports,a),n.exports}(()=>{a(4804);const e=a(3827),t=a(7219),l=a(3728),s=a(653),n=a(1415),i=a(22),o=a(5670),r=a(3695),p=a(9634),u=a(5222),d=a(5232),y=a(8626),_=a(3157),m=(0,e.createSyncWorker)();function c(){const e=["tests","logs"];return(0,n.createGeneXpertClient)().then((t=>[()=>(0,s.updateDatabaseStatus)(t),...e.map((e=>(0,s.updateSyncListTotal)(t,e))),...e.map((e=>(0,l.createGeneXpertPuller)(e,2e3,t))),(0,y.throttled)((0,_.fetchStatus)(t),(0,y.interval)(60))]))}function T(){const e=new o.SqliteClient(r.sqliteModels);return Promise.resolve((0,p.flatten)(["relaylogs","requests","calibrations","status","maintenance","monthlySummary","dailySummary","eqaSummary"].map((t=>[(0,l.createSqlitePuller)(e,t,2e3),(0,s.updateSyncListTotal)(e,t)]))).concat([i.fetchCalibrationSummaries,s.updateSavedCount]))}function N(){const e=new u.ServerSyncClient(r.sqliteModels);return Promise.resolve((0,p.flatten)(["facilities","servicerequests","users"].map((t=>[(0,y.throttled)((0,l.createServerPuller)(e,t,100),y.isOnline,(0,y.intervalWhenFull)(t,15),y.isAssigned),(0,y.throttled)((0,s.updateSyncListTotal)(e,t),y.isOnline,(0,y.interval)(15)),y.isAssigned,y.loadContactPersons]))))}Promise.resolve().then((()=>m.addFromGetters([c,T]))).then((()=>(0,d.ensureDeviceIsRegistered)())).then((()=>m.addFromGetters([N]))).catch((e=>{t.logger.error(e),process.exit(1)}))})()})();(()=>{"use strict";var e={7632:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.backendClient=void 0;const s=l(a(2167)),n=a(231),i=a(9968);t.backendClient=s.default.create({baseURL:`${n.backendUrl}/relay`,timeout:3e5}),t.backendClient.interceptors.request.use((e=>(0,i.get)("registration_token").then((t=>Object.assign(Object.assign({},e),{headers:Object.assign(Object.assign({},e.headers),{"Relay-Token":t})}))))),t.backendClient.interceptors.response.use((e=>e),(e=>{var t;return 401===(null===(t=e.response)||void 0===t?void 0:t.status)?(0,i.update)("registration_token",null).then((()=>Promise.reject(e))):Promise.reject(e)}))},231:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.requirePatientDetails=t.brand=t.serverPort=t.backendUrl=void 0,a(5142).config(),process.env,t.backendUrl="https://api.labxpert.ephi.gov.et",t.serverPort="4411",t.brand=JSON.parse('{"publisher":"MedX International Ltd","name":"LabXpert Relay","colors":{"primary":"#d05286","secondary":"#572345"},"logo":"","links":{"helpcenter":"https://labxpertsurveillance.tawk.help/","support":"https://tawk.to/chat/62de9ce937898912e95f8b2a/1g8qp9std?pop=1","website":"https://medx.international"}}'),t.requirePatientDetails=Boolean(JSON.parse("1"))},2473:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RegistrationError=void 0;class a extends Error{constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype)}}t.RegistrationError=a},8969:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.registerDevice=void 0;const s=l(a(2167)),n=a(231),i=a(1415),o=a(9968),r=a(2473);t.registerDevice=function(){return(0,i.createGeneXpertClient)().then((e=>(0,o.read)().then((t=>e.systemInfo().then((e=>{var a;return s.default.post(`${n.backendUrl}/relay/machines/register/`,Object.assign(Object.assign({},e),{labId:null===(a=null==t?void 0:t.lab)||void 0===a?void 0:a.id})).catch((e=>(console.error(e),Promise.reject(new r.RegistrationError(e.message))))).then((e=>e.data)).then((e=>"string"!=typeof e?Promise.reject(new r.RegistrationError("Invalid registration token")):(0,o.update)("registration_token",e)))}))))))}},7306:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.toSystemInfo=t.createSequelize=t.assaysForDataEntry=t.LAB_RESULT_APPROVAL_DEADLINE_HOURS=t.hoursForDataEntry=void 0;const s=a(9634),n=a(496),i=l(a(2245)),o=a(881);t.hoursForDataEntry=8,t.LAB_RESULT_APPROVAL_DEADLINE_HOURS=1,t.assaysForDataEntry=["Xpert MTB-RIF Assay G4","Xpert MTB-RIF Ultra","Xpert MTB-XDR","Xpert_HIV-1 Viral Load","Xpert_HIV-1 Qual","Xpert HIV-1 Qual XC DBS"],t.createSequelize=function(e,t,a){const l="win32"===process.platform&&"true"!==process.env.IS_DEV?{dialectModulePath:"msnodesqlv8/lib/sequelize",dialectOptions:{options:{connectionString:`server=(local);Database=${e};Trusted_Connection=Yes;Driver={SQL Server Native Client 11.0}`,trustedConnection:!0,requestTimeout:3e5}}}:{database:e,username:t,password:a,dialectOptions:{options:{useUTC:!1,dateFirst:1}}},s=Object.assign(Object.assign({},l),{dialect:"mssql",logging:!1,pool:{min:0,max:5,idle:1e4}});return new n.Sequelize(s)},t.toSystemInfo=function(e,t){const a=e.sort(((e,t)=>new Date(t.log_time).getTime()-new Date(e.log_time).getTime())).map(((e,t,a)=>({serial:e.site_serial_number.toString(),instrument:e.instrument_serial_number.toString(),replaced:a.indexOf(e)!==t,lastLoggedAt:new Date(e.log_time),disabled:!(0,s.isNil)(e.disabled_at),position:e.site_name.trim()}))),[l]=(0,s.pluck)("sw_version",e),n=function(e){const[t]=(0,s.groupWith)(((e,t)=>Math.abs((0,i.default)(t.lastLoggedAt).diff(e.lastLoggedAt,"day"))<7),function(e){return(0,s.groupWith)(((e,t)=>e.instrument===t.instrument),e.filter((e=>e.serial.length>3&&e.instrument.length>3&&!e.replaced))).map((e=>e.sort(((e,t)=>new Date(t.lastLoggedAt).getTime()-new Date(e.lastLoggedAt).getTime())))).map((([e])=>e))}(e)).map((e=>(0,s.uniq)(e.map((e=>e.instrument)))));return t}(a),r=function(e){const[t]=(0,s.groupWith)(((e,t)=>Math.abs((0,i.default)(t.lastLoggedAt).diff(e.lastLoggedAt,"day"))<7),function(e){return(0,s.groupWith)(((e,t)=>e.position[0]===t.position[0]),e.filter((e=>e.serial.length>3&&e.instrument.length>3&&!e.replaced))).map((e=>e.sort(((e,t)=>new Date(t.lastLoggedAt).getTime()-new Date(e.lastLoggedAt).getTime())))).map((([e])=>e))}(e)).map((e=>(0,s.uniq)(e.map((e=>e.position[0])))));return(0,s.uniq)(e.filter((e=>t.includes(e.position[0]))).map((e=>e.position)))}(a);return{version:l,relayVersion:o.version,config:t,sites:r,modules:a,instruments:n}}},1415:function(e,t,a){var l=this&&this.__createBinding||(Object.create?function(e,t,a,l){void 0===l&&(l=a);var s=Object.getOwnPropertyDescriptor(t,a);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,l,s)}:function(e,t,a,l){void 0===l&&(l=a),e[l]=t[a]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&l(t,e,a);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.createGeneXpertClient=void 0;const i={user:"sa",password:"F00tball"};function o(e){return"win32"===process.platform&&"true"!==process.env.IS_DEV?Promise.resolve().then((()=>n(a(4768)))).then((t=>t.connect({server:"(local)",database:e,options:{trustedConnection:!0}}))):Promise.resolve().then((()=>n(a(9424)))).then((t=>t.connect(Object.assign(Object.assign({},i),{database:e,requestTimeout:3e3,connectionTimeout:3e3,server:"127.0.0.1",pool:{max:10,min:0,idleTimeoutMillis:3e4},options:{encrypt:!1,trustServerCertificate:!0}}))))}t.createGeneXpertClient=function(){return o("master").then((e=>function(e){return e.query("SELECT name FROM master.sys.databases").then((e=>e.recordset.map((e=>e.name)).sort().find((e=>e.match(/gx_\w+/)))||Promise.reject(new Error("No genexpert database found"))))}(e).then((t=>e.close().then((()=>o(t))).then((e=>function(e){return e.query("SELECT sw_version FROM system_log ORDER BY log_time DESC OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY").then((e=>e.recordset)).then((([e])=>e?e.sw_version:Promise.reject(new Error("Unknown version"))))}(e))).then((e=>[e,t])))))).then((([e,t])=>function(e,t,l,s){const[i,o]=e.split(".");return"6"===i&&parseInt(o,10)>=5?Promise.resolve().then((()=>n(a(1058)))).then((({GeneXpertClient:a})=>new a(e,t,l,s))):"6"===i?Promise.resolve().then((()=>n(a(2522)))).then((({GeneXpertClient:a})=>new a(e,t,l,s))):"5"===i?Promise.resolve().then((()=>n(a(8207)))).then((({GeneXpertClient:a})=>new a(e,t,l,s))):"4"===i?Promise.resolve().then((()=>n(a(7556)))).then((({GeneXpertClient:a})=>new a(e,t,l,s))):Promise.reject(new Error(`GeneXpert Version ${e} is not currently supported`))}(e,t,i.user,i.password)))}},7556:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,o)}r((l=l.apply(e,t||[])).next())}))},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.GeneXpertClient=void 0;const n=s(a(2245)),i=a(9634),o=a(496),r=a(7306),p=a(1558),u="YYYY/MM/DD HH:mm:ss.SSS";t.GeneXpertClient=class{constructor(e,t,a,l){this.version=e,this.sequelize=(0,r.createSequelize)(t,a,l),this.models=(0,p.initModels)(this.sequelize)}systemInfo(){const e=this.sequelize.query("\n        SELECT TOP 1 WITH TIES\n          [sw_version],\n          [instrument_serial_number],\n          [dbo].[system_log].[site_serial_number],\n          [site_name],\n          [log_time],\n          [dbo].[disabled_module].[creation] AS [disabled_at]\n        FROM [dbo].[system_log]\n          LEFT JOIN [dbo].[disabled_module]\n          ON [dbo].[disabled_module].[site_serial_number] = [dbo].[system_log].[site_serial_number]\n        ORDER BY row_number() \n        OVER (PARTITION BY [dbo].[system_log].[site_serial_number] ORDER BY [log_time] DESC)\n      ").then((([e])=>e)),t=this.models.Config.findAll().then((e=>e.map((e=>({[e.param_key]:e.param_val}))))).then(i.mergeAll);return Promise.all([e,t]).then((e=>(0,r.toSystemInfo)(...e)))}logsTotal(){return this.models.SystemLog.count()}testsTotal(){return this.models.Test.count()}testsPresyncables(e,t,a){return this.models.Test.findAll({where:{[o.Op.or]:[{modified:{[o.Op.gt]:(0,n.default)(e).format(u)}},{modified:{[o.Op.eq]:(0,n.default)(e).format(u)},test_ID:{[o.Op.notIn]:t}}]},attributes:["test_ID","modified"],limit:a,order:[["modified","ASC"]]}).then((e=>e.map((({test_ID:e,modified:t})=>({id:e.toString(),modified:(0,n.default)(t,u).toDate()})))))}testsSyncables(e){return this.models.Test.findAll({where:{test_ID:e},include:[{as:"operator",model:this.models.User},{as:"test_errors",model:this.models.TestPcError},{as:"test_run",model:this.models.TestRun,attributes:{exclude:["data","cartridge_barcode"]}},{as:"patient_test_order",model:this.models.PatientTestOrder,include:[{as:"patient",model:this.models.Patient}]},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]}},{as:"analyte_results",model:this.models.AnalyteResult,include:[{as:"analyte",model:this.models.Analyte}]},{as:"organism_results",model:this.models.OrganismResult,include:[{as:"organism",model:this.models.Organism}]}]}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.test_ID.toString()}))))}testsForEntry(e,t){return this.models.Test.findAll({where:{start_time:{[o.Op.gt]:(0,n.default)().subtract(t||r.hoursForDataEntry,"hours").format(u)},sample_ID:{[o.Op.notIn]:e}},include:[{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t;return{id:e.test_ID,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(e.end_time,u).toDate(),sampleId:e.sample_ID,startedAt:(0,n.default)(e.start_time,u).toDate()}}))))}logsPresyncables(e,t,a){return this.models.SystemLog.findAll({where:{[o.Op.or]:[{log_time:{[o.Op.gt]:(0,n.default)(e).format(u)}},{log_time:{[o.Op.eq]:(0,n.default)(e).format(u)},system_log_ID:{[o.Op.notIn]:t}}]},limit:a,attributes:["system_log_ID","log_time"],order:[["log_time","ASC"]]}).then((e=>e.map((({system_log_ID:e,log_time:t})=>({id:e.toString(),modified:(0,n.default)(t,u).toDate()})))))}logsSyncables(e){return this.models.SystemLog.findAll({where:{system_log_ID:{[o.Op.in]:e}}}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.system_log_ID.toString()}))))}close(){return this.sequelize.close()}getTest(e){return l(this,void 0,void 0,(function*(){return this.models.Test.findOne({where:{sample_ID:{[o.Op.eq]:e}}})}))}getTestsByTestIds(e){return this.models.Test.findAll({where:{test_ID:{[o.Op.in]:e}},include:[{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t;return{id:e.test_ID,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(e.end_time,u).toDate(),sampleId:e.sample_ID,startedAt:(0,n.default)(e.start_time,u).toDate()}}))))}getCompletedTestsBySampleIds(e){return this.models.Test.findAll({where:{sample_ID:{[o.Op.in]:e},end_time:{[o.Op.and]:[{[o.Op.not]:null},{[o.Op.between]:[(0,n.default)().subtract(r.LAB_RESULT_APPROVAL_DEADLINE_HOURS,"hours").format(u),(0,n.default)().format(u)]}]},result_text:{[o.Op.not]:null}},include:[{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t;return{id:e.test_ID,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(e.end_time,u).toDate(),sampleId:e.sample_ID,startedAt:(0,n.default)(e.start_time,u).toDate()}}))))}}},892:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Advancestagesetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Advancestagesetting",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1},stage_number:{type:l.DataTypes.SMALLINT,allowNull:!0},protocol_number:{type:l.DataTypes.SMALLINT,allowNull:!0},new_stage_number:{type:l.DataTypes.SMALLINT,allowNull:!0},stop_after_new_stage:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},stop_if_no_ct:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},advance_stage_settings_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"advancestagesettings",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_advancestagesettings",unique:!0,fields:[{name:"advance_stage_settings_id"}]}]})}}t.Advancestagesetting=s},4878:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AnalyteResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AnalyteResultText",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},target_result_key:{type:l.DataTypes.STRING(8),allowNull:!0},result_text_reference:{type:l.DataTypes.SMALLINT,allowNull:!1}},{tableName:"analyte_result_text ",schema:"dbo",timestamps:!1})}}t.AnalyteResultText=s},804:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AnalyteResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AnalyteResult",{test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},expected_result:{type:l.DataTypes.SMALLINT,allowNull:!0},endpoint:{type:l.DataTypes.FLOAT,allowNull:!1},threshold:{type:l.DataTypes.FLOAT,allowNull:!1},cycle_threshold:{type:l.DataTypes.FLOAT,allowNull:!1},probe_check_result:{type:l.DataTypes.SMALLINT,allowNull:!0},probe_check_reading1:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_reading2:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_reading3:{type:l.DataTypes.FLOAT,allowNull:!0},error_status:{type:l.DataTypes.SMALLINT,allowNull:!0},target_result:{type:l.DataTypes.SMALLINT,allowNull:!0},ic_result:{type:l.DataTypes.SMALLINT,allowNull:!0},ec_result:{type:l.DataTypes.SMALLINT,allowNull:!0},spc_result:{type:l.DataTypes.SMALLINT,allowNull:!0},interpretation:{type:l.DataTypes.SMALLINT,allowNull:!0},second_deriv_peak_height:{type:l.DataTypes.FLOAT,allowNull:!0},nc_ic_endpoint:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:0},curve_fit_result:{type:l.DataTypes.SMALLINT,allowNull:!0},delta_ct:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-9999},TTP:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:0},quantitative_result:{type:l.DataTypes.FLOAT,allowNull:!0},iqs_lq_result:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:1},iqs_hq_result:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:1},analyte_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},reason:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"analyte_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK_analyte_result",unique:!0,fields:[{name:"analyte_result_id"}]},{name:"test_ID",fields:[{name:"test_ID"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.AnalyteResult=s},5745:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Analyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Analyte",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_index:{type:l.DataTypes.INTEGER,allowNull:!1},usage:{type:l.DataTypes.SMALLINT,allowNull:!0},target:{type:l.DataTypes.BLOB,allowNull:!0},analyte_name:{type:l.DataTypes.STRING(20),allowNull:!0},intended_concentration:{type:l.DataTypes.FLOAT,allowNull:!0},analyte_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},use_curve_fit:{type:l.DataTypes.BOOLEAN,allowNull:!0},enable_signal_loss_detection:{type:l.DataTypes.BOOLEAN,allowNull:!0},reporter_name:{type:l.DataTypes.STRING(12),allowNull:!1},boxcar_cycles:{type:l.DataTypes.SMALLINT,allowNull:!0},curve_analysis:{type:l.DataTypes.SMALLINT,allowNull:!0},background_start:{type:l.DataTypes.SMALLINT,allowNull:!0},background_end:{type:l.DataTypes.SMALLINT,allowNull:!0},cycle_if_no_ct:{type:l.DataTypes.SMALLINT,allowNull:!0},min_ct_req_pass_controls:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_on_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},curve_fit_start_background:{type:l.DataTypes.BOOLEAN,allowNull:!0},curve_fit_start_index:{type:l.DataTypes.SMALLINT,allowNull:!0},curve_fit_end_data:{type:l.DataTypes.BOOLEAN,allowNull:!0},curve_fit_end_index:{type:l.DataTypes.SMALLINT,allowNull:!0},curve_fit_min_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_nrse:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_slope_vs_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},background_min_points:{type:l.DataTypes.SMALLINT,allowNull:!0},background_look_back:{type:l.DataTypes.SMALLINT,allowNull:!0},background_validate:{type:l.DataTypes.BOOLEAN,allowNull:!0},background_max_slope:{type:l.DataTypes.FLOAT,allowNull:!0},background_max_rms_error:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_use_delta_pc:{type:l.DataTypes.BOOLEAN,allowNull:!0},probe_check_min_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_max_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},invalid_bias:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"analyte",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_analyte",unique:!0,fields:[{name:"analyte_id"}]},{name:"pos",fields:[{name:"analyte_index"}]}]})}}t.Analyte=s},4044:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayCartridge=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayCartridge",{assay_cartridge_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!0},need_lot_parameters:{type:l.DataTypes.BOOLEAN,allowNull:!1},need_ext_control:{type:l.DataTypes.BOOLEAN,allowNull:!1},ext_control_frq:{type:l.DataTypes.SMALLINT,allowNull:!0},cartridge_type_ID:{type:l.DataTypes.INTEGER,allowNull:!0},command_seq:{type:l.DataTypes.BLOB,allowNull:!0},melt_all_peaks:{type:l.DataTypes.BOOLEAN,allowNull:!1},use_background_subtraction:{type:l.DataTypes.BOOLEAN,allowNull:!1},air_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},overflow_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},comments:{type:l.DataTypes.STRING(256),allowNull:!0},command_seq_format:{type:l.DataTypes.SMALLINT,allowNull:!0},picture:{type:l.DataTypes.BLOB,allowNull:!0},read_interval:{type:l.DataTypes.INTEGER,allowNull:!0},prep_cartridge_shelf_life:{type:l.DataTypes.INTEGER,allowNull:!1},retain_cartridge:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"assay_cartridge",schema:"dbo",timestamps:!1,indexes:[{name:"PK_assay_cartridge",unique:!0,fields:[{name:"assay_cartridge_id"}]}]})}}t.AssayCartridge=s},8667:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayChamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayChamber",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!0},name:{type:l.DataTypes.STRING(16),allowNull:!0},initial_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},assay_chamber_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"assay_chamber",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"PK_assay_chamber",unique:!0,fields:[{name:"assay_chamber_id"}]}]})}}t.AssayChamber=s},4942:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Assay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Assay",{assay_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},pos:{type:l.DataTypes.INTEGER,allowNull:!0},name:{type:l.DataTypes.STRING(32),allowNull:!0},version:{type:l.DataTypes.SMALLINT,allowNull:!0},user_ID:{type:l.DataTypes.INTEGER,allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_verified:{type:l.DataTypes.BOOLEAN,allowNull:!0},comments:{type:l.DataTypes.STRING(256),allowNull:!0},lock_comments:{type:l.DataTypes.STRING(256),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},product_code:{type:l.DataTypes.SMALLINT,allowNull:!0},assay_type:{type:l.DataTypes.SMALLINT,allowNull:!0},disclaimer:{type:l.DataTypes.STRING(512),allowNull:!0},company_code:{type:l.DataTypes.SMALLINT,allowNull:!0},result_text_type:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:0},class:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:0},analysis_type:{type:l.DataTypes.SMALLINT,allowNull:!0},sample_prep_instruction:{type:l.DataTypes.STRING(256),allowNull:!0},sample_prep_video:{type:l.DataTypes.BLOB,allowNull:!0},test_code:{type:l.DataTypes.STRING(15),allowNull:!0},enable_test_code:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},enable_auto_archive:{type:l.DataTypes.BOOLEAN,allowNull:!1},default_result_text_reference:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:5},default_text_color_reference:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:3},clia_waived:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"assay",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_assay_ID",unique:!0,fields:[{name:"assay_ID"}]},{name:"pos",fields:[{name:"pos"}]}]})}}t.Assay=s},1163:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CalibrationChamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CalibrationChamber",{calibration_seq_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1,primaryKey:!0},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!0},name:{type:l.DataTypes.STRING(16),allowNull:!0},initial_volume:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"calibration_chamber",schema:"dbo",timestamps:!1,indexes:[{name:"calibration_seq_id",fields:[{name:"calibration_seq_id"}]},{name:"cartridge_ID",fields:[{name:"cartridge_id"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"PK_calibration_chamber",unique:!0,fields:[{name:"calibration_seq_id"},{name:"cartridge_id"},{name:"chamber_number"}]}]})}}t.CalibrationChamber=s},2632:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CalibrationSequence=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CalibrationSequence",{calibration_seq_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},pos:{type:l.DataTypes.INTEGER,allowNull:!0},name:{type:l.DataTypes.STRING(32),allowNull:!0},cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!0},command_seq:{type:l.DataTypes.BLOB,allowNull:!0},command_seq_format:{type:l.DataTypes.SMALLINT,allowNull:!0},air_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},comments:{type:l.DataTypes.STRING(256),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"calibration_sequence",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_calibration_sequence",unique:!0,fields:[{name:"calibration_seq_id"}]},{name:"pos",fields:[{name:"pos"}]}]})}}t.CalibrationSequence=s},4859:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CartridgeOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CartridgeOrder",{cartridge_order_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},sample_id:{type:l.DataTypes.STRING(25),allowNull:!0},scanned_SID:{type:l.DataTypes.BOOLEAN,allowNull:!0},scanned_PID:{type:l.DataTypes.BOOLEAN,allowNull:!0},priority:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0},rgt_lot_id:{type:l.DataTypes.STRING(6),allowNull:!1},cartridge_serial_number:{type:l.DataTypes.BIGINT,allowNull:!0},cartridge_expiration_date:{type:l.DataTypes.DATE,allowNull:!0},cartridge_barcode:{type:l.DataTypes.STRING(1024),allowNull:!0},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},other_sample_type_text:{type:l.DataTypes.STRING(32),allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_status:{type:l.DataTypes.STRING(32),allowNull:!0},order_sw_version:{type:l.DataTypes.STRING(16),allowNull:!1},cartridge_order_time:{type:l.DataTypes.STRING(24),allowNull:!0},cartridge_order_expiration:{type:l.DataTypes.STRING(24),allowNull:!0},location:{type:l.DataTypes.STRING(32),allowNull:!0},location_site:{type:l.DataTypes.INTEGER,allowNull:!0},lis_order_id:{type:l.DataTypes.INTEGER,allowNull:!1},test_type:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"cartridge_order",schema:"dbo",timestamps:!1,indexes:[{name:"PK_cartridge_order",unique:!0,fields:[{name:"cartridge_order_id"}]}]})}}t.CartridgeOrder=s},1544:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Cartridge=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Cartridge",{cartridge_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},name:{type:l.DataTypes.STRING(32),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},max_pressure:{type:l.DataTypes.SMALLINT,allowNull:!0},syringe_min_transfer_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},syringe_max_transfer_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},syringe_max_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_syringe_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_chamber_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},direct_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},filter_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},direct_flow_rate_min:{type:l.DataTypes.SMALLINT,allowNull:!0},direct_flow_rate_max:{type:l.DataTypes.SMALLINT,allowNull:!0},microliters_per_revolution:{type:l.DataTypes.FLOAT,allowNull:!0},initial_aspirate_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},initial_aspirate_flow_rate:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_pressurized_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},air_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},overflow_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},min_pressure:{type:l.DataTypes.SMALLINT,allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1,defaultValue:""},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},filter_flow_rate_min:{type:l.DataTypes.SMALLINT,allowNull:!0},filter_flow_rate_max:{type:l.DataTypes.SMALLINT,allowNull:!0},cartridge_foot_height:{type:l.DataTypes.INTEGER,allowNull:!0},adc_2_psi:{type:l.DataTypes.FLOAT,allowNull:!0},plunger_strip_position:{type:l.DataTypes.INTEGER,allowNull:!0},plunger_pickup_position:{type:l.DataTypes.INTEGER,allowNull:!0},picture:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"cartridge",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"name",fields:[{name:"name"}]},{name:"PK_cartridge_ID",unique:!0,fields:[{name:"cartridge_ID"}]},{name:"version",fields:[{name:"version"}]}]})}}t.Cartridge=s},3918:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Chamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Chamber",{cartridge_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1,primaryKey:!0},min_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},max_volume:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"chamber",schema:"dbo",timestamps:!1,indexes:[{name:"cartridge_ID",fields:[{name:"cartridge_ID"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"PK_chamber",unique:!0,fields:[{name:"cartridge_ID"},{name:"chamber_number"}]}]})}}t.Chamber=s},6038:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorDisclaimer=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ColorDisclaimer",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},color:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},disclaimer:{type:l.DataTypes.STRING(256),allowNull:!0}},{tableName:"color_disclaimer",schema:"dbo",timestamps:!1,indexes:[{name:"PK_color_disclaimer",unique:!0,fields:[{name:"assay_ID"},{name:"color"}]}]})}}t.ColorDisclaimer=s},87:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Config",{param_key:{type:l.DataTypes.STRING(64),primaryKey:!0,allowNull:!1},param_val:{type:l.DataTypes.STRING(512),allowNull:!1,defaultValue:""}},{tableName:"config",schema:"dbo",timestamps:!1})}}t.Config=s},2075:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CrosstalkFactor=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CrosstalkFactor",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},protocol_number:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:-1},factor:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:0},crosstalk_factor_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},from_analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},to_analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"crosstalk_factor",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_crosstalk_factor",unique:!0,fields:[{name:"crosstalk_factor_id"}]}]})}}t.CrosstalkFactor=s},1726:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DisabledModule=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("DisabledModule",{site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!0},creation:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"disabled_module",schema:"dbo",timestamps:!1,indexes:[{name:"PK_disabled_module",unique:!0,fields:[{name:"site_serial_number"}]}]})}}t.DisabledModule=s},7772:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Dtproperty=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Dtproperty",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},objectid:{type:l.DataTypes.INTEGER,allowNull:!0},property:{type:l.DataTypes.STRING(64),allowNull:!1,primaryKey:!0},value:{type:l.DataTypes.STRING(255),allowNull:!0},uvalue:{type:l.DataTypes.STRING(255),allowNull:!0},lvalue:{type:l.DataTypes.BLOB,allowNull:!0},version:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:0}},{tableName:"dtproperties",schema:"dbo",timestamps:!1,indexes:[{name:"pk_dtproperties",unique:!0,fields:[{name:"id"},{name:"property"}]}]})}}t.Dtproperty=s},2e3:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.FailedLocation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("FailedLocation",{location:{type:l.DataTypes.STRING(32),allowNull:!1,primaryKey:!0},location_site:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"failed_location",schema:"dbo",timestamps:!1,indexes:[{name:"PK_failed_location",unique:!0,fields:[{name:"location"},{name:"location_site"}]}]})}}t.FailedLocation=s},5033:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetting",{graph_setting_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},graph_type:{type:l.DataTypes.SMALLINT,allowNull:!1},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"assay_ID"}},param_key:{type:l.DataTypes.STRING(64),allowNull:!1},param_val:{type:l.DataTypes.STRING(512),allowNull:!1,defaultValue:""}},{tableName:"graph_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__graph_setting__408F9238",unique:!0,fields:[{name:"graph_setting_id"}]}]})}}t.GraphSetting=s},140:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetup",{graph_setup_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},pos:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!0},is_default:{type:l.DataTypes.BOOLEAN,allowNull:!1},user_ID:{type:l.DataTypes.INTEGER,allowNull:!0},settings:{type:l.DataTypes.INTEGER,allowNull:!0},format:{type:l.DataTypes.SMALLINT,allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_graph_setup",unique:!0,fields:[{name:"graph_setup_ID"}]},{name:"pos",fields:[{name:"pos"}]}]})}}t.GraphSetup=s},6281:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.HaplotypeResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("HaplotypeResultText",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(11),allowNull:!1,primaryKey:!0},alleles_text_1:{type:l.DataTypes.STRING(10),allowNull:!0},alleles_text_2:{type:l.DataTypes.STRING(10),allowNull:!0},text_color_reference:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"haplotype_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK_haplotype_result_text",unique:!0,fields:[{name:"assay_id"},{name:"haplotype_id"},{name:"result_key"}]}]})}}t.HaplotypeResultText=s},5038:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Haplotype=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Haplotype",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},name:{type:l.DataTypes.STRING(20),allowNull:!0},lis_test_code:{type:l.DataTypes.STRING(15),allowNull:!0}},{tableName:"haplotype",schema:"dbo",timestamps:!1,indexes:[{name:"PK_haplotype",unique:!0,fields:[{name:"assay_id"},{name:"haplotype_id"}]}]})}}t.Haplotype=s},7912:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.InfinitySystemLog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("InfinitySystemLog",{infinity_system_log_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1},code:{type:l.DataTypes.INTEGER,allowNull:!1},subsystem:{type:l.DataTypes.INTEGER,allowNull:!1},details:{type:l.DataTypes.STRING(512),allowNull:!0},log_time:{type:l.DataTypes.STRING(24),allowNull:!1},sw_version:{type:l.DataTypes.STRING(16),allowNull:!1},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"infinity_system_log",schema:"dbo",timestamps:!1,indexes:[{name:"PK_infinity_system_log",unique:!0,fields:[{name:"infinity_system_log_id"}]}]})}}t.InfinitySystemLog=s},1558:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestGraphSetup=t.TestBlogCounter=t.TestBlog=t.Test=t.SystemLog=t.Snp=t.SampleType=t.SampleSetting=t.RetainCartridgeColor=t.ReagentLot=t.QuantUnitSetting=t.QuantResult=t.Privilege=t.PatientTestOrder=t.Patient=t.Path=t.OrganismTarget=t.OrganismResultText=t.OrganismResultRule=t.OrganismResultEvaluator=t.OrganismResult=t.Organism=t.MeltPeakSetting=t.MeltPeakResult=t.LisTestOrder=t.Instrument=t.InfinitySystemLog=t.HaplotypeResultText=t.Haplotype=t.GraphSetup=t.GraphSetting=t.FailedLocation=t.Dtproperty=t.DisabledModule=t.CrosstalkFactor=t.Config=t.ColorDisclaimer=t.Chamber=t.CartridgeOrder=t.Cartridge=t.CalibrationSequence=t.CalibrationChamber=t.AssayChamber=t.AssayCartridge=t.Assay=t.AnalyteResultText=t.AnalyteResult=t.Analyte=t.Advancestagesetting=t.IntegrityCheck=void 0,t.initModels=t.User=t.TestRun=t.TestPcError=t.TestHistory=void 0;const l=a(8792);Object.defineProperty(t,"IntegrityCheck",{enumerable:!0,get:function(){return l.IntegrityCheck}});const s=a(892);Object.defineProperty(t,"Advancestagesetting",{enumerable:!0,get:function(){return s.Advancestagesetting}});const n=a(5745);Object.defineProperty(t,"Analyte",{enumerable:!0,get:function(){return n.Analyte}});const i=a(804);Object.defineProperty(t,"AnalyteResult",{enumerable:!0,get:function(){return i.AnalyteResult}});const o=a(4878);Object.defineProperty(t,"AnalyteResultText",{enumerable:!0,get:function(){return o.AnalyteResultText}});const r=a(4942);Object.defineProperty(t,"Assay",{enumerable:!0,get:function(){return r.Assay}});const p=a(4044);Object.defineProperty(t,"AssayCartridge",{enumerable:!0,get:function(){return p.AssayCartridge}});const u=a(8667);Object.defineProperty(t,"AssayChamber",{enumerable:!0,get:function(){return u.AssayChamber}});const d=a(1163);Object.defineProperty(t,"CalibrationChamber",{enumerable:!0,get:function(){return d.CalibrationChamber}});const y=a(2632);Object.defineProperty(t,"CalibrationSequence",{enumerable:!0,get:function(){return y.CalibrationSequence}});const _=a(1544);Object.defineProperty(t,"Cartridge",{enumerable:!0,get:function(){return _.Cartridge}});const m=a(4859);Object.defineProperty(t,"CartridgeOrder",{enumerable:!0,get:function(){return m.CartridgeOrder}});const c=a(3918);Object.defineProperty(t,"Chamber",{enumerable:!0,get:function(){return c.Chamber}});const T=a(6038);Object.defineProperty(t,"ColorDisclaimer",{enumerable:!0,get:function(){return T.ColorDisclaimer}});const N=a(87);Object.defineProperty(t,"Config",{enumerable:!0,get:function(){return N.Config}});const g=a(2075);Object.defineProperty(t,"CrosstalkFactor",{enumerable:!0,get:function(){return g.CrosstalkFactor}});const f=a(1726);Object.defineProperty(t,"DisabledModule",{enumerable:!0,get:function(){return f.DisabledModule}});const D=a(7772);Object.defineProperty(t,"Dtproperty",{enumerable:!0,get:function(){return D.Dtproperty}});const E=a(2e3);Object.defineProperty(t,"FailedLocation",{enumerable:!0,get:function(){return E.FailedLocation}});const b=a(5033);Object.defineProperty(t,"GraphSetting",{enumerable:!0,get:function(){return b.GraphSetting}});const w=a(140);Object.defineProperty(t,"GraphSetup",{enumerable:!0,get:function(){return w.GraphSetup}});const I=a(5038);Object.defineProperty(t,"Haplotype",{enumerable:!0,get:function(){return I.Haplotype}});const R=a(6281);Object.defineProperty(t,"HaplotypeResultText",{enumerable:!0,get:function(){return R.HaplotypeResultText}});const O=a(7912);Object.defineProperty(t,"InfinitySystemLog",{enumerable:!0,get:function(){return O.InfinitySystemLog}});const h=a(3662);Object.defineProperty(t,"Instrument",{enumerable:!0,get:function(){return h.Instrument}});const M=a(9806);Object.defineProperty(t,"LisTestOrder",{enumerable:!0,get:function(){return M.LisTestOrder}});const G=a(965);Object.defineProperty(t,"MeltPeakResult",{enumerable:!0,get:function(){return G.MeltPeakResult}});const v=a(2792);Object.defineProperty(t,"MeltPeakSetting",{enumerable:!0,get:function(){return v.MeltPeakSetting}});const S=a(4397);Object.defineProperty(t,"Organism",{enumerable:!0,get:function(){return S.Organism}});const A=a(199);Object.defineProperty(t,"OrganismResult",{enumerable:!0,get:function(){return A.OrganismResult}});const P=a(9671);Object.defineProperty(t,"OrganismResultEvaluator",{enumerable:!0,get:function(){return P.OrganismResultEvaluator}});const L=a(4953);Object.defineProperty(t,"OrganismResultRule",{enumerable:!0,get:function(){return L.OrganismResultRule}});const C=a(6563);Object.defineProperty(t,"OrganismResultText",{enumerable:!0,get:function(){return C.OrganismResultText}});const K=a(2932);Object.defineProperty(t,"OrganismTarget",{enumerable:!0,get:function(){return K.OrganismTarget}});const x=a(9094);Object.defineProperty(t,"Path",{enumerable:!0,get:function(){return x.Path}});const j=a(5549);Object.defineProperty(t,"Patient",{enumerable:!0,get:function(){return j.Patient}});const q=a(1106);Object.defineProperty(t,"PatientTestOrder",{enumerable:!0,get:function(){return q.PatientTestOrder}});const k=a(3656);Object.defineProperty(t,"Privilege",{enumerable:!0,get:function(){return k.Privilege}});const F=a(9056);Object.defineProperty(t,"QuantResult",{enumerable:!0,get:function(){return F.QuantResult}});const B=a(3366);Object.defineProperty(t,"QuantUnitSetting",{enumerable:!0,get:function(){return B.QuantUnitSetting}});const Q=a(8963);Object.defineProperty(t,"ReagentLot",{enumerable:!0,get:function(){return Q.ReagentLot}});const U=a(1186);Object.defineProperty(t,"RetainCartridgeColor",{enumerable:!0,get:function(){return U.RetainCartridgeColor}});const H=a(217);Object.defineProperty(t,"SampleSetting",{enumerable:!0,get:function(){return H.SampleSetting}});const X=a(1863);Object.defineProperty(t,"SampleType",{enumerable:!0,get:function(){return X.SampleType}});const V=a(8094);Object.defineProperty(t,"Snp",{enumerable:!0,get:function(){return V.Snp}});const z=a(7634);Object.defineProperty(t,"SystemLog",{enumerable:!0,get:function(){return z.SystemLog}});const J=a(4678);Object.defineProperty(t,"Test",{enumerable:!0,get:function(){return J.Test}});const $=a(6450);Object.defineProperty(t,"TestBlog",{enumerable:!0,get:function(){return $.TestBlog}});const Y=a(4258);Object.defineProperty(t,"TestBlogCounter",{enumerable:!0,get:function(){return Y.TestBlogCounter}});const W=a(9432);Object.defineProperty(t,"TestGraphSetup",{enumerable:!0,get:function(){return W.TestGraphSetup}});const Z=a(1360);Object.defineProperty(t,"TestHistory",{enumerable:!0,get:function(){return Z.TestHistory}});const ee=a(2848);Object.defineProperty(t,"TestPcError",{enumerable:!0,get:function(){return ee.TestPcError}});const te=a(972);Object.defineProperty(t,"TestRun",{enumerable:!0,get:function(){return te.TestRun}});const ae=a(3509);Object.defineProperty(t,"User",{enumerable:!0,get:function(){return ae.User}}),t.initModels=function(e){const t=l.IntegrityCheck.initModel(e),a=s.Advancestagesetting.initModel(e),le=n.Analyte.initModel(e),se=i.AnalyteResult.initModel(e),ne=o.AnalyteResultText.initModel(e),ie=r.Assay.initModel(e),oe=p.AssayCartridge.initModel(e),re=u.AssayChamber.initModel(e),pe=d.CalibrationChamber.initModel(e),ue=y.CalibrationSequence.initModel(e),de=_.Cartridge.initModel(e),ye=m.CartridgeOrder.initModel(e),_e=c.Chamber.initModel(e),me=T.ColorDisclaimer.initModel(e),ce=N.Config.initModel(e),Te=g.CrosstalkFactor.initModel(e),Ne=f.DisabledModule.initModel(e),ge=D.Dtproperty.initModel(e),fe=E.FailedLocation.initModel(e),De=b.GraphSetting.initModel(e),Ee=w.GraphSetup.initModel(e),be=I.Haplotype.initModel(e),we=R.HaplotypeResultText.initModel(e),Ie=O.InfinitySystemLog.initModel(e),Re=h.Instrument.initModel(e),Oe=M.LisTestOrder.initModel(e),he=G.MeltPeakResult.initModel(e),Me=v.MeltPeakSetting.initModel(e),Ge=S.Organism.initModel(e),ve=A.OrganismResult.initModel(e),Se=P.OrganismResultEvaluator.initModel(e),Ae=L.OrganismResultRule.initModel(e),Pe=C.OrganismResultText.initModel(e),Le=K.OrganismTarget.initModel(e),Ce=x.Path.initModel(e),Ke=j.Patient.initModel(e),xe=q.PatientTestOrder.initModel(e),je=k.Privilege.initModel(e),qe=F.QuantResult.initModel(e),ke=B.QuantUnitSetting.initModel(e),Fe=Q.ReagentLot.initModel(e),Be=U.RetainCartridgeColor.initModel(e),Qe=H.SampleSetting.initModel(e),Ue=X.SampleType.initModel(e),He=V.Snp.initModel(e),Xe=z.SystemLog.initModel(e),Ve=J.Test.initModel(e),ze=$.TestBlog.initModel(e),Je=Y.TestBlogCounter.initModel(e),$e=W.TestGraphSetup.initModel(e),Ye=Z.TestHistory.initModel(e),We=ee.TestPcError.initModel(e),Ze=te.TestRun.initModel(e),et=ae.User.initModel(e);return De.belongsTo(ie,{as:"assay",foreignKey:"assay_id"}),ie.hasMany(De,{as:"graph_settings",foreignKey:"assay_id"}),ke.belongsTo(ie,{as:"assay",foreignKey:"assay_id"}),ie.hasMany(ke,{as:"quant_unit_settings",foreignKey:"assay_id"}),Le.belongsTo(ke,{as:"selected_quant_unit",foreignKey:"selected_quant_unit_id"}),ke.hasMany(Le,{as:"organism_targets",foreignKey:"selected_quant_unit_id"}),qe.belongsTo(ke,{as:"quant_unit_setting",foreignKey:"quant_unit_setting_id"}),ke.hasMany(qe,{as:"quant_results",foreignKey:"quant_unit_setting_id"}),qe.belongsTo(Ve,{as:"test",foreignKey:"test_id"}),Ve.hasMany(qe,{as:"quant_results",foreignKey:"test_id"}),Ve.hasMany(ve,{as:"organism_results",foreignKey:"test_ID",sourceKey:"test_ID"}),Ve.belongsTo(ie,{as:"assay",foreignKey:"assay_ID",targetKey:"assay_ID"}),Ve.hasMany(se,{as:"analyte_results",foreignKey:"test_ID"}),Ve.belongsTo(et,{as:"operator",foreignKey:"operator_ids"}),Ve.hasOne(Ze,{as:"test_run",foreignKey:"test_ID"}),Ve.hasOne(xe,{as:"patient_test_order",foreignKey:"test_id"}),Ve.hasMany(We,{as:"test_errors",foreignKey:"test_id"}),xe.belongsTo(Ke,{as:"patient",foreignKey:"patient_id"}),se.belongsTo(le,{as:"analyte",foreignKey:"analyte_id"}),ve.belongsTo(Ge,{as:"organism",foreignKey:"organism_id",targetKey:"organism_id"}),Je.belongsTo(ze,{as:"test_blog",foreignKey:"test_blog_ID"}),ze.hasMany(Je,{as:"test_blog_counters",foreignKey:"test_blog_ID"}),{IntegrityCheck:t,Advancestagesetting:a,Analyte:le,AnalyteResult:se,AnalyteResultText:ne,Assay:ie,AssayCartridge:oe,AssayChamber:re,CalibrationChamber:pe,CalibrationSequence:ue,Cartridge:de,CartridgeOrder:ye,Chamber:_e,ColorDisclaimer:me,Config:ce,CrosstalkFactor:Te,DisabledModule:Ne,Dtproperty:ge,FailedLocation:fe,GraphSetting:De,GraphSetup:Ee,Haplotype:be,HaplotypeResultText:we,InfinitySystemLog:Ie,Instrument:Re,LisTestOrder:Oe,MeltPeakResult:he,MeltPeakSetting:Me,Organism:Ge,OrganismResult:ve,OrganismResultEvaluator:Se,OrganismResultRule:Ae,OrganismResultText:Pe,OrganismTarget:Le,Path:Ce,Patient:Ke,PatientTestOrder:xe,Privilege:je,QuantResult:qe,QuantUnitSetting:ke,ReagentLot:Fe,RetainCartridgeColor:Be,SampleSetting:Qe,SampleType:Ue,Snp:He,SystemLog:Xe,Test:Ve,TestBlog:ze,TestBlogCounter:Je,TestGraphSetup:$e,TestHistory:Ye,TestPcError:We,TestRun:Ze,User:et}}},3662:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Instrument=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Instrument",{Instrument_id:{type:l.DataTypes.INTEGER,allowNull:!0},mac_address:{type:l.DataTypes.BLOB,allowNull:!0},serial_number:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"instrument",schema:"dbo",timestamps:!1,indexes:[{name:"mac_address",fields:[{name:"mac_address"}]}]})}}t.Instrument=s},8792:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.IntegrityCheck=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("IntegrityCheck",{table_name:{type:l.DataTypes.STRING(32),allowNull:!0},field_name:{type:l.DataTypes.STRING(24),allowNull:!0},id_number:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"Integrity_Check",schema:"dbo",timestamps:!1})}}t.IntegrityCheck=s},9806:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisTestOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisTestOrder",{instrument_specimen_ID:{type:l.DataTypes.STRING(64),allowNull:!1,defaultValue:""},sample_ID:{type:l.DataTypes.STRING(25),allowNull:!0},test_code:{type:l.DataTypes.STRING(15),allowNull:!0,defaultValue:""},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:-1},order_time:{type:l.DataTypes.STRING(24),allowNull:!0},order_status:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:1},priority:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:1},LIS_test_order_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"lis_test_order",schema:"dbo",timestamps:!1,indexes:[{name:"IX_lis_test_order",fields:[{name:"instrument_specimen_ID"}]},{name:"PK_lis_test_order",unique:!0,fields:[{name:"LIS_test_order_ID"}]}]})}}t.LisTestOrder=s},965:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakResult",{melt_peak_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_result_id:{type:l.DataTypes.INTEGER,allowNull:!1},peak_index:{type:l.DataTypes.INTEGER,allowNull:!1},peak_height:{type:l.DataTypes.FLOAT,allowNull:!1},peak_temperature:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"melt_peak_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK_melt_peak_result",unique:!0,fields:[{name:"melt_peak_result_id"}]}]})}}t.MeltPeakResult=s},2792:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakSetting",{melt_peak_settings_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},slope_positive:{type:l.DataTypes.BOOLEAN,allowNull:!1},baseline_start_temp:{type:l.DataTypes.FLOAT,allowNull:!1},baseline_look_back:{type:l.DataTypes.FLOAT,allowNull:!1},baseline_num_points:{type:l.DataTypes.INTEGER,allowNull:!1},points_around_peak:{type:l.DataTypes.INTEGER,allowNull:!1},peak_threshold:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_min:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_max:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"melt_peak_settings",schema:"dbo",timestamps:!1,indexes:[{name:"PK_melt_peak_settings",unique:!0,fields:[{name:"melt_peak_settings_id"}]}]})}}t.MeltPeakSetting=s},9671:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultEvaluator=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultEvaluator",{organism_result_evaluator_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0},parent_evaluator_id:{type:l.DataTypes.INTEGER,allowNull:!0},evaluator_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"organism_result_evaluator",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result_evaluator",unique:!0,fields:[{name:"organism_result_evaluator_id"}]}]})}}t.OrganismResultEvaluator=s},4953:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultRule=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultRule",{organism_result_rule_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},evaluator_id:{type:l.DataTypes.INTEGER,allowNull:!0},parent_rule_id:{type:l.DataTypes.INTEGER,allowNull:!0},rule_type:{type:l.DataTypes.INTEGER,allowNull:!1},rule_anded:{type:l.DataTypes.BOOLEAN,allowNull:!0},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0},pass_on_equals:{type:l.DataTypes.BOOLEAN,allowNull:!0},interpretation:{type:l.DataTypes.INTEGER,allowNull:!0},reasons:{type:l.DataTypes.STRING(50),allowNull:!0},pass_on_peak:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"organism_result_rule",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result_rule",unique:!0,fields:[{name:"organism_result_rule_id"}]}]})}}t.OrganismResultRule=s},6563:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultText",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(8),allowNull:!1},result_text_reference:{type:l.DataTypes.SMALLINT,allowNull:!0},text_color_reference:{type:l.DataTypes.SMALLINT,allowNull:!0},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},organism_result_text_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"organism_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result_text",unique:!0,fields:[{name:"organism_result_text_id"}]}]})}}t.OrganismResultText=s},199:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResult",{organism_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},result_type:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0},haplotype_index:{type:l.DataTypes.INTEGER,allowNull:!0},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_color:{type:l.DataTypes.INTEGER,allowNull:!0},result_invalid:{type:l.DataTypes.BOOLEAN,allowNull:!0},allele2_text:{type:l.DataTypes.TEXT,allowNull:!0},lda_total:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result",unique:!0,fields:[{name:"organism_result_id"}]}]})}}t.OrganismResult=s},2932:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismTarget=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismTarget",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1},selected_quant_unit_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"quant_unit_setting",key:"quant_unit_setting_id"}},organism_target_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},lda_ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!0},lda_delta_ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"organism_target",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_target",unique:!0,fields:[{name:"organism_target_id"}]}]})}}t.OrganismTarget=s},4397:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Organism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Organism",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(20),allowNull:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1},early_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},late_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},medium_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},low_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},very_low_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},semi_quant_text_ref:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:-1},replacement_text_ref:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:-1},replacement_color_ref:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:-1},delta_ct_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},organism_lis_test_code:{type:l.DataTypes.STRING(15),allowNull:!0},organism_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},lda_intercept:{type:l.DataTypes.FLOAT,allowNull:!0},lda_min_valid:{type:l.DataTypes.FLOAT,allowNull:!0},lda_cutoff:{type:l.DataTypes.FLOAT,allowNull:!0},lda_max_valid:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism",unique:!0,fields:[{name:"organism_id"}]}]})}}t.Organism=s},9094:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Path=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Path",{path_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},cartridge_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1},tube:{type:l.DataTypes.BOOLEAN,allowNull:!0},block:{type:l.DataTypes.BOOLEAN,allowNull:!0},type:{type:l.DataTypes.SMALLINT,allowNull:!0},angular_offset:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"path",schema:"dbo",timestamps:!1,indexes:[{name:"cartridge_ID",fields:[{name:"cartridge_ID"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"path_id",fields:[{name:"path_ID"}]},{name:"PK_path",unique:!0,fields:[{name:"path_ID"},{name:"cartridge_ID"}]},{name:"type",fields:[{name:"type"}]}]})}}t.Path=s},1106:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PatientTestOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PatientTestOrder",{patient_test_order_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},patient_id:{type:l.DataTypes.INTEGER,allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0},lis_test_order_id:{type:l.DataTypes.INTEGER,allowNull:!0},cartridge_order_id:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"patient_test_order",schema:"dbo",timestamps:!1,indexes:[{name:"PK__patient_test_ord__4924D839",unique:!0,fields:[{name:"patient_test_order_id"}]}]})}}t.PatientTestOrder=s},5549:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Patient=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Patient",{patient_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},gx_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},practice_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},family_name:{type:l.DataTypes.TEXT,allowNull:!0},given_name:{type:l.DataTypes.TEXT,allowNull:!0},middle_name:{type:l.DataTypes.TEXT,allowNull:!0},date_of_birth:{type:l.DataTypes.STRING(32),allowNull:!0},gender:{type:l.DataTypes.STRING(64),allowNull:!0},ethnicity:{type:l.DataTypes.STRING(64),allowNull:!0},postal_code:{type:l.DataTypes.TEXT,allowNull:!0}},{tableName:"patient",schema:"dbo",timestamps:!1,indexes:[{name:"PK__patient__473C8FC7",unique:!0,fields:[{name:"patient_id"}]}]})}}t.Patient=s},3656:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Privilege=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Privilege",{privilege_name:{type:l.DataTypes.STRING(64),allowNull:!1,primaryKey:!0},user_type:{type:l.DataTypes.SMALLINT,allowNull:!1,primaryKey:!0}},{tableName:"privilege",schema:"dbo",timestamps:!1,indexes:[{name:"PK_privilege",unique:!0,fields:[{name:"privilege_name"},{name:"user_type"}]}]})}}t.Privilege=s},9056:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QuantResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QuantResult",{quant_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"test_ID"}},quant_unit_setting_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"quant_unit_setting",key:"quant_unit_setting_id"}},quantitative_result:{type:l.DataTypes.FLOAT,allowNull:!0},result_text:{type:l.DataTypes.STRING(1024),allowNull:!0},result_text_color:{type:l.DataTypes.SMALLINT,allowNull:!1},qualitative_result:{type:l.DataTypes.STRING(50),allowNull:!0},result_abnormal_flag:{type:l.DataTypes.STRING(5),allowNull:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_result_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"quant_result",schema:"dbo",timestamps:!1,indexes:[{name:"analyte_result_id",fields:[{name:"analyte_result_id"}]},{name:"PK__quant_result__3AD6B8E2",unique:!0,fields:[{name:"quant_result_id"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.QuantResult=s},3366:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QuantUnitSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QuantUnitSetting",{quant_unit_setting_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"assay_ID"}},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1},position:{type:l.DataTypes.INTEGER,allowNull:!1},unit_key:{type:l.DataTypes.STRING(50),allowNull:!1},conversion_factor:{type:l.DataTypes.FLOAT,allowNull:!1},lower_limit:{type:l.DataTypes.FLOAT,allowNull:!1},upper_limit:{type:l.DataTypes.FLOAT,allowNull:!1},display_log_value:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:0},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"quant_unit_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant_unit_setti__351DDF8C",unique:!0,fields:[{name:"quant_unit_setting_id"}]}]})}}t.QuantUnitSetting=s},8963:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ReagentLot",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},rgt_lot_number:{type:l.DataTypes.STRING(3),allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!0},reagent_lot_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"guid",fields:[{name:"guid"}]},{name:"PK_reagent_lot",unique:!0,fields:[{name:"reagent_lot_id"}]},{name:"rgt_lot_number",fields:[{name:"rgt_lot_number"}]}]})}}t.ReagentLot=s},1186:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RetainCartridgeColor=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("RetainCartridgeColor",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1},color:{type:l.DataTypes.INTEGER,allowNull:!1},retain_cartridge:{type:l.DataTypes.BOOLEAN,allowNull:!0},retain_cartridge_color_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"retain_cartridge_color",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_retain_cartridge",unique:!0,fields:[{name:"retain_cartridge_color_id"}]}]})}}t.RetainCartridgeColor=s},217:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleSetting",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},sample_type:{type:l.DataTypes.SMALLINT,allowNull:!1},valid_min:{type:l.DataTypes.DECIMAL(5,1),allowNull:!0},valid_max:{type:l.DataTypes.DECIMAL(5,1),allowNull:!0},end_pt_threshold:{type:l.DataTypes.SMALLINT,allowNull:!0},probe_chk_low_max:{type:l.DataTypes.INTEGER,allowNull:!0},probe_chk_high_min:{type:l.DataTypes.INTEGER,allowNull:!0},probe_chk_delta:{type:l.DataTypes.INTEGER,allowNull:!0},is_lot_parameters:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_endpoint:{type:l.DataTypes.BOOLEAN,allowNull:!0},peak_height_min:{type:l.DataTypes.FLOAT,allowNull:!0},use_delta_ct:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},min_delta_ct:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:0},delta_ct_eff:{type:l.DataTypes.FLOAT,allowNull:!0},E0:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E1:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E2:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E3:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E4:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},sample_settings_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},reagent_lot_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_low_min:{type:l.DataTypes.INTEGER,allowNull:!0},probe_chk_high_max:{type:l.DataTypes.INTEGER,allowNull:!0},ct_threshold_value:{type:l.DataTypes.FLOAT,allowNull:!0},normalization_factor:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"sample_settings",schema:"dbo",timestamps:!1,indexes:[{name:"analyte_id",fields:[{name:"analyte_id"}]},{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"PK_sample_settings",unique:!0,fields:[{name:"sample_settings_id"}]},{name:"reagent_lot_id",fields:[{name:"reagent_lot_id"}]},{name:"sample_type",fields:[{name:"sample_type"}]}]})}}t.SampleSetting=s},1863:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleType=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleType",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},pos:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"sample_type",schema:"dbo",timestamps:!1})}}t.SampleType=s},8094:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Snp=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Snp",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!0},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!0},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0},snp_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"snp",schema:"dbo",timestamps:!1,indexes:[{name:"PK_snp",unique:!0,fields:[{name:"snp_id"}]}]})}}t.Snp=s},7634:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SystemLog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SystemLog",{error_type:{type:l.DataTypes.INTEGER,allowNull:!0},log_time:{type:l.DataTypes.STRING(24),allowNull:!0},error_code:{type:l.DataTypes.INTEGER,allowNull:!0},details:{type:l.DataTypes.STRING(512),allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},site_name:{type:l.DataTypes.CHAR(3),allowNull:!0,defaultValue:""},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},system_log_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"system_log",schema:"dbo",timestamps:!1,indexes:[{name:"IX_system_log",fields:[{name:"system_log_ID"}]},{name:"PK_system_log",unique:!0,fields:[{name:"system_log_ID"}]}]})}}t.SystemLog=s},4258:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlogCounter=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlogCounter",{test_blog_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"test_blog",key:"test_blog_ID"}},date_text:{type:l.DataTypes.STRING(8),allowNull:!1,primaryKey:!0},test_count:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_blog_counter",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_blog_counter",unique:!0,fields:[{name:"test_blog_ID"},{name:"date_text"}]}]})}}t.TestBlogCounter=s},6450:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlog",{test_blog_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_name:{type:l.DataTypes.STRING(32),allowNull:!0},assay_version:{type:l.DataTypes.SMALLINT,allowNull:!1}},{tableName:"test_blog",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_blog",unique:!0,fields:[{name:"test_blog_ID"}]}]})}}t.TestBlog=s},9432:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestGraphSetup",{test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},graph_setup_ID:{type:l.DataTypes.INTEGER,allowNull:!1},pos:{type:l.DataTypes.SMALLINT,allowNull:!0},test_graph_setup_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"graph_setup_ID",fields:[{name:"graph_setup_ID"}]},{name:"PK_test_graph_setup",unique:!0,fields:[{name:"test_graph_setup_id"}]},{name:"test_ID",fields:[{name:"test_ID"}]}]})}}t.TestGraphSetup=s},1360:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestHistory",{test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},field_name:{type:l.DataTypes.STRING(32),allowNull:!1},old_content:{type:l.DataTypes.STRING(512),allowNull:!0},new_content:{type:l.DataTypes.STRING(512),allowNull:!0},user_ID:{type:l.DataTypes.INTEGER,allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!1},test_history_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"test_history",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_history",unique:!0,fields:[{name:"test_history_id"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.TestHistory=s},2848:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestPcError=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestPcError",{test_id:{type:l.DataTypes.INTEGER,allowNull:!1},code:{type:l.DataTypes.INTEGER,allowNull:!0},type:{type:l.DataTypes.SMALLINT,allowNull:!0},details:{type:l.DataTypes.STRING(512),allowNull:!0},severity:{type:l.DataTypes.SMALLINT,allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!0},parameter_1:{type:l.DataTypes.FLOAT,allowNull:!0},parameter_2:{type:l.DataTypes.FLOAT,allowNull:!0},parameter_3:{type:l.DataTypes.FLOAT,allowNull:!0},parameter_4:{type:l.DataTypes.FLOAT,allowNull:!0},textparameter:{type:l.DataTypes.STRING(64),allowNull:!0},test_pc_error_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_pc_error",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_pc_error",unique:!0,fields:[{name:"test_pc_error_id"}]},{name:"test_id",fields:[{name:"test_id"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.TestPcError=s},972:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestRun=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestRun",{test_run_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},site_name:{type:l.DataTypes.CHAR(3),allowNull:!1},site_serial_num:{type:l.DataTypes.INTEGER,allowNull:!0},rgt_lot_ID:{type:l.DataTypes.STRING(6),allowNull:!1},cart_serial_number:{type:l.DataTypes.BIGINT,allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},state:{type:l.DataTypes.SMALLINT,allowNull:!0},error_status:{type:l.DataTypes.SMALLINT,allowNull:!0},start_time:{type:l.DataTypes.STRING(24),allowNull:!0},end_time:{type:l.DataTypes.STRING(24),allowNull:!0},user_ID:{type:l.DataTypes.INTEGER,allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0},icore_serial_num:{type:l.DataTypes.INTEGER,allowNull:!0},fw_version:{type:l.DataTypes.STRING(12),allowNull:!0},datagram_format:{type:l.DataTypes.SMALLINT,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},order_time:{type:l.DataTypes.STRING(24),allowNull:!0},expiration_date:{type:l.DataTypes.DATE,allowNull:!1},cartridge_barcode:{type:l.DataTypes.STRING(1024),allowNull:!0},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},current_test_run:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"test_run",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_run",unique:!0,fields:[{name:"test_run_id"}]}]})}}t.TestRun=s},4678:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Test=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Test",{test_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!0},sample_ID:{type:l.DataTypes.STRING(25),allowNull:!0},scanned_SID:{type:l.DataTypes.BOOLEAN,allowNull:!0},scanned_PID:{type:l.DataTypes.BOOLEAN,allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},test_type:{type:l.DataTypes.SMALLINT,allowNull:!0},expected_result:{type:l.DataTypes.SMALLINT,allowNull:!0},lis_upload_message_ID:{type:l.DataTypes.STRING(64),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},order_time:{type:l.DataTypes.STRING(24),allowNull:!0},outliner:{type:l.DataTypes.BOOLEAN,allowNull:!1},archived:{type:l.DataTypes.BOOLEAN,allowNull:!1},auto_archived:{type:l.DataTypes.BOOLEAN,allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},other_sample_type_text:{type:l.DataTypes.STRING(32),allowNull:!0},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_text_colors:{type:l.DataTypes.TEXT,allowNull:!0},express_result_text:{type:l.DataTypes.STRING(1024),allowNull:!0},order_id:{type:l.DataTypes.INTEGER,allowNull:!1},upload_status:{type:l.DataTypes.INTEGER,allowNull:!1},priority:{type:l.DataTypes.INTEGER,allowNull:!0},cartridge_order_id:{type:l.DataTypes.INTEGER,allowNull:!0},data_reduction_alg:{type:l.DataTypes.SMALLINT,allowNull:!1},state:{type:l.DataTypes.SMALLINT,allowNull:!0},error_status:{type:l.DataTypes.SMALLINT,allowNull:!0},site_name:{type:l.DataTypes.TEXT,allowNull:!0},site_serial_num:{type:l.DataTypes.TEXT,allowNull:!0},operator_ids:{type:l.DataTypes.TEXT,allowNull:!0},start_time:{type:l.DataTypes.STRING(24),allowNull:!0},end_time:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"test",schema:"dbo",timestamps:!1,indexes:[{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"guid",fields:[{name:"guid"}]},{name:"PK_test",unique:!0,fields:[{name:"test_ID"}]},{name:"start_time",fields:[{name:"start_time"}]}]})}}t.Test=s},3509:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.User=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("User",{user_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},login_name:{type:l.DataTypes.STRING(16),allowNull:!0},full_name:{type:l.DataTypes.STRING(128),allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_hidden:{type:l.DataTypes.BOOLEAN,allowNull:!1},password:{type:l.DataTypes.STRING(32),allowNull:!0},user_type:{type:l.DataTypes.SMALLINT,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"users",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_users",unique:!0,fields:[{name:"user_ID"}]}]})}}t.User=s},8207:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,o)}r((l=l.apply(e,t||[])).next())}))},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.GeneXpertClient=void 0;const n=s(a(2245)),i=a(9634),o=a(496),r=a(7306),p=a(7819),u="YYYY/MM/DD HH:mm:ss.SSS";t.GeneXpertClient=class{constructor(e,t,a,l){this.version=e,this.sequelize=(0,r.createSequelize)(t,a,l),this.models=(0,p.initModels)(this.sequelize)}systemInfo(){const e=this.sequelize.query("\n        SELECT TOP 1 WITH TIES\n          [sw_version],\n          [instrument_serial_number],\n          [dbo].[system_log].[site_serial_number],\n          [site_name],\n          [log_time],\n          [dbo].[disabled_module].[creation] AS [disabled_at]\n        FROM [dbo].[system_log]\n          LEFT JOIN [dbo].[disabled_module]\n          ON [dbo].[disabled_module].[site_serial_number] = [dbo].[system_log].[site_serial_number]\n        ORDER BY row_number() \n        OVER (PARTITION BY [dbo].[system_log].[site_serial_number] ORDER BY [log_time] DESC)\n      ").then((([e])=>e)),t=this.models.Config.findAll().then((e=>e.map((e=>({[e.param_key]:e.param_val}))))).then(i.mergeAll);return Promise.all([e,t]).then((e=>(0,r.toSystemInfo)(...e)))}logsTotal(){return this.models.SystemLog.count()}testsTotal(){return this.models.Test.count()}testsPresyncables(e,t,a){return this.models.Test.findAll({where:{[o.Op.or]:[{modified:{[o.Op.gt]:(0,n.default)(e).format(u)}},{modified:{[o.Op.eq]:(0,n.default)(e).format(u)},test_ID:{[o.Op.notIn]:t}}]},attributes:["test_ID","modified"],limit:a,order:[["modified","ASC"]]}).then((e=>e.map((({test_ID:e,modified:t})=>({id:e.toString(),modified:(0,n.default)(t,u).toDate()})))))}testsSyncables(e){return this.models.Test.findAll({where:{test_ID:{[o.Op.in]:e}},include:[{as:"operator",model:this.models.User},{as:"test_errors",model:this.models.TestPcError},{as:"test_run",model:this.models.TestRun,attributes:{exclude:["data","cartridge_barcode"]}},{as:"patient_test_order",model:this.models.PatientTestOrder,include:[{as:"patient",model:this.models.Patient}]},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]}},{as:"analyte_results",model:this.models.AnalyteResult,include:[{as:"analyte",model:this.models.Analyte}]},{as:"organism_results",model:this.models.OrganismResult,include:[{as:"organism",model:this.models.Organism}]}]}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.test_ID.toString()}))))}testsForEntry(e,t){return this.models.Test.findAll({where:{start_time:{[o.Op.gt]:(0,n.default)().subtract(t||r.hoursForDataEntry,"hours").format(u)},sample_ID:{[o.Op.notIn]:e}},include:[{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t;return{id:e.test_ID,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(e.end_time,u).toDate(),sampleId:e.sample_ID,startedAt:(0,n.default)(e.start_time,u).toDate()}}))))}logsPresyncables(e,t,a){return this.models.SystemLog.findAll({where:{[o.Op.or]:[{log_time:{[o.Op.gt]:(0,n.default)(e).format(u)}},{log_time:{[o.Op.eq]:(0,n.default)(e).format(u)},system_log_ID:{[o.Op.notIn]:t}}]},limit:a,attributes:["system_log_ID","log_time"],order:[["log_time","ASC"]]}).then((e=>e.map((({system_log_ID:e,log_time:t})=>({id:e.toString(),modified:(0,n.default)(t,u).toDate()})))))}logsSyncables(e){return this.models.SystemLog.findAll({where:{system_log_ID:{[o.Op.in]:e}}}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.system_log_ID.toString()}))))}close(){return this.sequelize.close()}getTest(e){return l(this,void 0,void 0,(function*(){return this.models.Test.findOne({where:{sample_ID:{[o.Op.eq]:e}}})}))}getTestsByTestIds(e){return this.models.Test.findAll({where:{test_ID:{[o.Op.in]:e}},include:[{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t;return{id:e.test_ID,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(e.end_time,u).toDate(),sampleId:e.sample_ID,startedAt:(0,n.default)(e.start_time,u).toDate()}}))))}getCompletedTestsBySampleIds(e){return this.models.Test.findAll({where:{sample_ID:{[o.Op.in]:e},end_time:{[o.Op.and]:[{[o.Op.not]:null},{[o.Op.between]:[(0,n.default)().subtract(r.LAB_RESULT_APPROVAL_DEADLINE_HOURS,"hours").format(u),(0,n.default)().format(u)]}]},result_text:{[o.Op.not]:null}},include:[{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t;return{id:e.test_ID,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(e.end_time,u).toDate(),sampleId:e.sample_ID,startedAt:(0,n.default)(e.start_time,u).toDate()}}))))}}},2952:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Advancestagesetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Advancestagesetting",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1},stage_number:{type:l.DataTypes.SMALLINT,allowNull:!0},protocol_number:{type:l.DataTypes.SMALLINT,allowNull:!0},new_stage_number:{type:l.DataTypes.SMALLINT,allowNull:!0},stop_after_new_stage:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},stop_if_no_ct:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},advance_stage_settings_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"advancestagesettings",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_advancestagesettings",unique:!0,fields:[{name:"advance_stage_settings_id"}]}]})}}t.Advancestagesetting=s},6623:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AnalyteResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AnalyteResultText",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},target_result_key:{type:l.DataTypes.STRING(8),allowNull:!0},result_text_reference:{type:l.DataTypes.SMALLINT,allowNull:!1}},{tableName:"analyte_result_text ",schema:"dbo",timestamps:!1})}}t.AnalyteResultText=s},7089:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AnalyteResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AnalyteResult",{test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},expected_result:{type:l.DataTypes.SMALLINT,allowNull:!0},endpoint:{type:l.DataTypes.FLOAT,allowNull:!1},threshold:{type:l.DataTypes.FLOAT,allowNull:!1},cycle_threshold:{type:l.DataTypes.FLOAT,allowNull:!1},probe_check_result:{type:l.DataTypes.SMALLINT,allowNull:!0},probe_check_reading1:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_reading2:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_reading3:{type:l.DataTypes.FLOAT,allowNull:!0},error_status:{type:l.DataTypes.SMALLINT,allowNull:!0},target_result:{type:l.DataTypes.SMALLINT,allowNull:!0},ic_result:{type:l.DataTypes.SMALLINT,allowNull:!0},ec_result:{type:l.DataTypes.SMALLINT,allowNull:!0},spc_result:{type:l.DataTypes.SMALLINT,allowNull:!0},interpretation:{type:l.DataTypes.SMALLINT,allowNull:!0},second_deriv_peak_height:{type:l.DataTypes.FLOAT,allowNull:!0},nc_ic_endpoint:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:0},curve_fit_result:{type:l.DataTypes.SMALLINT,allowNull:!0},delta_ct:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-9999},TTP:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:0},quantitative_result:{type:l.DataTypes.FLOAT,allowNull:!0},iqs_lq_result:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:1},iqs_hq_result:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:1},analyte_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},reason:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"analyte_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK_analyte_result",unique:!0,fields:[{name:"analyte_result_id"}]},{name:"test_ID",fields:[{name:"test_ID"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.AnalyteResult=s},3425:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Analyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Analyte",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_index:{type:l.DataTypes.INTEGER,allowNull:!1},usage:{type:l.DataTypes.SMALLINT,allowNull:!0},target:{type:l.DataTypes.BLOB,allowNull:!0},analyte_name:{type:l.DataTypes.STRING(20),allowNull:!0},intended_concentration:{type:l.DataTypes.FLOAT,allowNull:!0},analyte_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},use_curve_fit:{type:l.DataTypes.BOOLEAN,allowNull:!0},enable_signal_loss_detection:{type:l.DataTypes.BOOLEAN,allowNull:!0},reporter_name:{type:l.DataTypes.STRING(12),allowNull:!1},boxcar_cycles:{type:l.DataTypes.SMALLINT,allowNull:!0},curve_analysis:{type:l.DataTypes.SMALLINT,allowNull:!0},background_start:{type:l.DataTypes.SMALLINT,allowNull:!0},background_end:{type:l.DataTypes.SMALLINT,allowNull:!0},cycle_if_no_ct:{type:l.DataTypes.SMALLINT,allowNull:!0},min_ct_req_pass_controls:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_on_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},curve_fit_start_background:{type:l.DataTypes.BOOLEAN,allowNull:!0},curve_fit_start_index:{type:l.DataTypes.SMALLINT,allowNull:!0},curve_fit_end_data:{type:l.DataTypes.BOOLEAN,allowNull:!0},curve_fit_end_index:{type:l.DataTypes.SMALLINT,allowNull:!0},curve_fit_min_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_nrse:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_slope_vs_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},background_min_points:{type:l.DataTypes.SMALLINT,allowNull:!0},background_look_back:{type:l.DataTypes.SMALLINT,allowNull:!0},background_validate:{type:l.DataTypes.BOOLEAN,allowNull:!0},background_max_slope:{type:l.DataTypes.FLOAT,allowNull:!0},background_max_rms_error:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_use_delta_pc:{type:l.DataTypes.BOOLEAN,allowNull:!0},probe_check_min_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_max_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},invalid_bias:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"analyte",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_analyte",unique:!0,fields:[{name:"analyte_id"}]},{name:"pos",fields:[{name:"analyte_index"}]}]})}}t.Analyte=s},1401:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayCartridge=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayCartridge",{assay_cartridge_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!0},need_lot_parameters:{type:l.DataTypes.BOOLEAN,allowNull:!1},need_ext_control:{type:l.DataTypes.BOOLEAN,allowNull:!1},ext_control_frq:{type:l.DataTypes.SMALLINT,allowNull:!0},cartridge_type_ID:{type:l.DataTypes.INTEGER,allowNull:!0},command_seq:{type:l.DataTypes.BLOB,allowNull:!0},melt_all_peaks:{type:l.DataTypes.BOOLEAN,allowNull:!1},use_background_subtraction:{type:l.DataTypes.BOOLEAN,allowNull:!1},air_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},overflow_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},comments:{type:l.DataTypes.STRING(256),allowNull:!0},command_seq_format:{type:l.DataTypes.SMALLINT,allowNull:!0},picture:{type:l.DataTypes.BLOB,allowNull:!0},read_interval:{type:l.DataTypes.INTEGER,allowNull:!0},prep_cartridge_shelf_life:{type:l.DataTypes.INTEGER,allowNull:!1},retain_cartridge:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"assay_cartridge",schema:"dbo",timestamps:!1,indexes:[{name:"PK_assay_cartridge",unique:!0,fields:[{name:"assay_cartridge_id"}]}]})}}t.AssayCartridge=s},1548:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayChamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayChamber",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!0},name:{type:l.DataTypes.STRING(16),allowNull:!0},initial_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},assay_chamber_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"assay_chamber",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"PK_assay_chamber",unique:!0,fields:[{name:"assay_chamber_id"}]}]})}}t.AssayChamber=s},378:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Assay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Assay",{assay_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},pos:{type:l.DataTypes.INTEGER,allowNull:!0},name:{type:l.DataTypes.STRING(32),allowNull:!0},version:{type:l.DataTypes.SMALLINT,allowNull:!0},user_ID:{type:l.DataTypes.INTEGER,allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_verified:{type:l.DataTypes.BOOLEAN,allowNull:!0},comments:{type:l.DataTypes.STRING(256),allowNull:!0},lock_comments:{type:l.DataTypes.STRING(256),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},product_code:{type:l.DataTypes.SMALLINT,allowNull:!0},assay_type:{type:l.DataTypes.SMALLINT,allowNull:!0},disclaimer:{type:l.DataTypes.STRING(512),allowNull:!0},company_code:{type:l.DataTypes.SMALLINT,allowNull:!0},result_text_type:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:0},class:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:0},analysis_type:{type:l.DataTypes.SMALLINT,allowNull:!0},sample_prep_instruction:{type:l.DataTypes.STRING(256),allowNull:!0},sample_prep_video:{type:l.DataTypes.BLOB,allowNull:!0},test_code:{type:l.DataTypes.STRING(15),allowNull:!0},enable_test_code:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},enable_auto_archive:{type:l.DataTypes.BOOLEAN,allowNull:!1},default_result_text_reference:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:5},default_text_color_reference:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:3},clia_waived:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"assay",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_assay_ID",unique:!0,fields:[{name:"assay_ID"}]},{name:"pos",fields:[{name:"pos"}]}]})}}t.Assay=s},8486:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CalibrationChamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CalibrationChamber",{calibration_seq_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1,primaryKey:!0},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!0},name:{type:l.DataTypes.STRING(16),allowNull:!0},initial_volume:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"calibration_chamber",schema:"dbo",timestamps:!1,indexes:[{name:"calibration_seq_id",fields:[{name:"calibration_seq_id"}]},{name:"cartridge_ID",fields:[{name:"cartridge_id"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"PK_calibration_chamber",unique:!0,fields:[{name:"calibration_seq_id"},{name:"cartridge_id"},{name:"chamber_number"}]}]})}}t.CalibrationChamber=s},447:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CalibrationSequence=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CalibrationSequence",{calibration_seq_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},pos:{type:l.DataTypes.INTEGER,allowNull:!0},name:{type:l.DataTypes.STRING(32),allowNull:!0},cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!0},command_seq:{type:l.DataTypes.BLOB,allowNull:!0},command_seq_format:{type:l.DataTypes.SMALLINT,allowNull:!0},air_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},comments:{type:l.DataTypes.STRING(256),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"calibration_sequence",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_calibration_sequence",unique:!0,fields:[{name:"calibration_seq_id"}]},{name:"pos",fields:[{name:"pos"}]}]})}}t.CalibrationSequence=s},975:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CartridgeOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CartridgeOrder",{cartridge_order_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},sample_id:{type:l.DataTypes.STRING(25),allowNull:!0},scanned_SID:{type:l.DataTypes.BOOLEAN,allowNull:!0},scanned_PID:{type:l.DataTypes.BOOLEAN,allowNull:!0},priority:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0},rgt_lot_id:{type:l.DataTypes.STRING(6),allowNull:!1},cartridge_serial_number:{type:l.DataTypes.BIGINT,allowNull:!0},cartridge_expiration_date:{type:l.DataTypes.DATE,allowNull:!0},cartridge_barcode:{type:l.DataTypes.STRING(1024),allowNull:!0},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},other_sample_type_text:{type:l.DataTypes.STRING(32),allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_status:{type:l.DataTypes.STRING(32),allowNull:!0},order_sw_version:{type:l.DataTypes.STRING(16),allowNull:!1},cartridge_order_time:{type:l.DataTypes.STRING(24),allowNull:!0},cartridge_order_expiration:{type:l.DataTypes.STRING(24),allowNull:!0},location:{type:l.DataTypes.STRING(32),allowNull:!0},location_site:{type:l.DataTypes.INTEGER,allowNull:!0},lis_order_id:{type:l.DataTypes.INTEGER,allowNull:!1},test_type:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"cartridge_order",schema:"dbo",timestamps:!1,indexes:[{name:"PK_cartridge_order",unique:!0,fields:[{name:"cartridge_order_id"}]}]})}}t.CartridgeOrder=s},1291:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Cartridge=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Cartridge",{cartridge_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},name:{type:l.DataTypes.STRING(32),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},max_pressure:{type:l.DataTypes.SMALLINT,allowNull:!0},syringe_min_transfer_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},syringe_max_transfer_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},syringe_max_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_syringe_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_chamber_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},direct_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},filter_path_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},direct_flow_rate_min:{type:l.DataTypes.SMALLINT,allowNull:!0},direct_flow_rate_max:{type:l.DataTypes.SMALLINT,allowNull:!0},microliters_per_revolution:{type:l.DataTypes.FLOAT,allowNull:!0},initial_aspirate_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},initial_aspirate_flow_rate:{type:l.DataTypes.SMALLINT,allowNull:!0},tube_pressurized_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},air_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},overflow_chamber:{type:l.DataTypes.SMALLINT,allowNull:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},min_pressure:{type:l.DataTypes.SMALLINT,allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1,defaultValue:""},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},filter_flow_rate_min:{type:l.DataTypes.SMALLINT,allowNull:!0},filter_flow_rate_max:{type:l.DataTypes.SMALLINT,allowNull:!0},cartridge_foot_height:{type:l.DataTypes.INTEGER,allowNull:!0},adc_2_psi:{type:l.DataTypes.FLOAT,allowNull:!0},plunger_strip_position:{type:l.DataTypes.INTEGER,allowNull:!0},plunger_pickup_position:{type:l.DataTypes.INTEGER,allowNull:!0},picture:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"cartridge",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"name",fields:[{name:"name"}]},{name:"PK_cartridge_ID",unique:!0,fields:[{name:"cartridge_ID"}]},{name:"version",fields:[{name:"version"}]}]})}}t.Cartridge=s},7184:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Chamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Chamber",{cartridge_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1,primaryKey:!0},min_volume:{type:l.DataTypes.SMALLINT,allowNull:!0},max_volume:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"chamber",schema:"dbo",timestamps:!1,indexes:[{name:"cartridge_ID",fields:[{name:"cartridge_ID"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"PK_chamber",unique:!0,fields:[{name:"cartridge_ID"},{name:"chamber_number"}]}]})}}t.Chamber=s},7527:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorDisclaimer=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ColorDisclaimer",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},color:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},disclaimer:{type:l.DataTypes.STRING(256),allowNull:!0}},{tableName:"color_disclaimer",schema:"dbo",timestamps:!1,indexes:[{name:"PK_color_disclaimer",unique:!0,fields:[{name:"assay_ID"},{name:"color"}]}]})}}t.ColorDisclaimer=s},6840:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Config",{param_key:{type:l.DataTypes.STRING(64),primaryKey:!0,allowNull:!1},param_val:{type:l.DataTypes.STRING(512),allowNull:!1,defaultValue:""}},{tableName:"config",schema:"dbo",timestamps:!1})}}t.Config=s},501:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CrosstalkFactor=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CrosstalkFactor",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},protocol_number:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:-1},factor:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:0},crosstalk_factor_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},from_analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},to_analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"crosstalk_factor",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_crosstalk_factor",unique:!0,fields:[{name:"crosstalk_factor_id"}]}]})}}t.CrosstalkFactor=s},8567:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DisabledModule=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("DisabledModule",{site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!0},creation:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"disabled_module",schema:"dbo",timestamps:!1,indexes:[{name:"PK_disabled_module",unique:!0,fields:[{name:"site_serial_number"}]}]})}}t.DisabledModule=s},7928:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Dtproperty=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Dtproperty",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},objectid:{type:l.DataTypes.INTEGER,allowNull:!0},property:{type:l.DataTypes.STRING(64),allowNull:!1,primaryKey:!0},value:{type:l.DataTypes.STRING(255),allowNull:!0},uvalue:{type:l.DataTypes.STRING(255),allowNull:!0},lvalue:{type:l.DataTypes.BLOB,allowNull:!0},version:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:0}},{tableName:"dtproperties",schema:"dbo",timestamps:!1,indexes:[{name:"pk_dtproperties",unique:!0,fields:[{name:"id"},{name:"property"}]}]})}}t.Dtproperty=s},4368:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.FailedLocation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("FailedLocation",{location:{type:l.DataTypes.STRING(32),allowNull:!1,primaryKey:!0},location_site:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"failed_location",schema:"dbo",timestamps:!1,indexes:[{name:"PK_failed_location",unique:!0,fields:[{name:"location"},{name:"location_site"}]}]})}}t.FailedLocation=s},1692:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetting",{graph_setting_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},graph_type:{type:l.DataTypes.SMALLINT,allowNull:!1},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"assay_ID"}},param_key:{type:l.DataTypes.STRING(64),allowNull:!1},param_val:{type:l.DataTypes.STRING(512),allowNull:!1,defaultValue:""}},{tableName:"graph_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__graph_setting__408F9238",unique:!0,fields:[{name:"graph_setting_id"}]}]})}}t.GraphSetting=s},5208:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetup",{graph_setup_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},pos:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!0},is_default:{type:l.DataTypes.BOOLEAN,allowNull:!1},user_ID:{type:l.DataTypes.INTEGER,allowNull:!0},settings:{type:l.DataTypes.INTEGER,allowNull:!0},format:{type:l.DataTypes.SMALLINT,allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_graph_setup",unique:!0,fields:[{name:"graph_setup_ID"}]},{name:"pos",fields:[{name:"pos"}]}]})}}t.GraphSetup=s},9447:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.HaplotypeResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("HaplotypeResultText",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(11),allowNull:!1,primaryKey:!0},alleles_text_1:{type:l.DataTypes.STRING(10),allowNull:!0},alleles_text_2:{type:l.DataTypes.STRING(10),allowNull:!0},text_color_reference:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"haplotype_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK_haplotype_result_text",unique:!0,fields:[{name:"assay_id"},{name:"haplotype_id"},{name:"result_key"}]}]})}}t.HaplotypeResultText=s},9933:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Haplotype=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Haplotype",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},name:{type:l.DataTypes.STRING(20),allowNull:!0},lis_test_code:{type:l.DataTypes.STRING(15),allowNull:!0}},{tableName:"haplotype",schema:"dbo",timestamps:!1,indexes:[{name:"PK_haplotype",unique:!0,fields:[{name:"assay_id"},{name:"haplotype_id"}]}]})}}t.Haplotype=s},6824:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.InfinitySystemLog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("InfinitySystemLog",{infinity_system_log_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1},code:{type:l.DataTypes.INTEGER,allowNull:!1},subsystem:{type:l.DataTypes.INTEGER,allowNull:!1},details:{type:l.DataTypes.STRING(512),allowNull:!0},log_time:{type:l.DataTypes.STRING(24),allowNull:!1},sw_version:{type:l.DataTypes.STRING(16),allowNull:!1},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"infinity_system_log",schema:"dbo",timestamps:!1,indexes:[{name:"PK_infinity_system_log",unique:!0,fields:[{name:"infinity_system_log_id"}]}]})}}t.InfinitySystemLog=s},7819:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlog=t.Test=t.SystemLog=t.Snp=t.SampleType=t.SampleSetting=t.RetainCartridgeColor=t.ReagentLot=t.QuantUnitSetting=t.QuantResult=t.QcTest=t.QcResult=t.Privilege=t.PatientTestOrder=t.Patient=t.Path=t.OrganismTarget=t.OrganismResultText=t.OrganismResultRule=t.OrganismResultEvaluator=t.OrganismResult=t.Organism=t.MeltPeakSetting=t.MeltPeakResult=t.LisTestOrder=t.Instrument=t.InfinitySystemLog=t.HaplotypeResultText=t.Haplotype=t.GraphSetup=t.GraphSetting=t.FailedLocation=t.Dtproperty=t.DisabledModule=t.CrosstalkFactor=t.Config=t.ColorDisclaimer=t.Chamber=t.CartridgeOrder=t.Cartridge=t.CalibrationSequence=t.CalibrationChamber=t.AssayChamber=t.AssayCartridge=t.Assay=t.AnalyteResultText=t.AnalyteResult=t.Analyte=t.Advancestagesetting=t.IntegrityCheck=void 0,t.initModels=t.User=t.TestRun=t.TestPcError=t.TestHistory=t.TestGraphSetup=t.TestBlogCounter=void 0;const l=a(2496);Object.defineProperty(t,"IntegrityCheck",{enumerable:!0,get:function(){return l.IntegrityCheck}});const s=a(2952);Object.defineProperty(t,"Advancestagesetting",{enumerable:!0,get:function(){return s.Advancestagesetting}});const n=a(3425);Object.defineProperty(t,"Analyte",{enumerable:!0,get:function(){return n.Analyte}});const i=a(7089);Object.defineProperty(t,"AnalyteResult",{enumerable:!0,get:function(){return i.AnalyteResult}});const o=a(6623);Object.defineProperty(t,"AnalyteResultText",{enumerable:!0,get:function(){return o.AnalyteResultText}});const r=a(378);Object.defineProperty(t,"Assay",{enumerable:!0,get:function(){return r.Assay}});const p=a(1401);Object.defineProperty(t,"AssayCartridge",{enumerable:!0,get:function(){return p.AssayCartridge}});const u=a(1548);Object.defineProperty(t,"AssayChamber",{enumerable:!0,get:function(){return u.AssayChamber}});const d=a(8486);Object.defineProperty(t,"CalibrationChamber",{enumerable:!0,get:function(){return d.CalibrationChamber}});const y=a(447);Object.defineProperty(t,"CalibrationSequence",{enumerable:!0,get:function(){return y.CalibrationSequence}});const _=a(1291);Object.defineProperty(t,"Cartridge",{enumerable:!0,get:function(){return _.Cartridge}});const m=a(975);Object.defineProperty(t,"CartridgeOrder",{enumerable:!0,get:function(){return m.CartridgeOrder}});const c=a(7184);Object.defineProperty(t,"Chamber",{enumerable:!0,get:function(){return c.Chamber}});const T=a(7527);Object.defineProperty(t,"ColorDisclaimer",{enumerable:!0,get:function(){return T.ColorDisclaimer}});const N=a(6840);Object.defineProperty(t,"Config",{enumerable:!0,get:function(){return N.Config}});const g=a(501);Object.defineProperty(t,"CrosstalkFactor",{enumerable:!0,get:function(){return g.CrosstalkFactor}});const f=a(8567);Object.defineProperty(t,"DisabledModule",{enumerable:!0,get:function(){return f.DisabledModule}});const D=a(7928);Object.defineProperty(t,"Dtproperty",{enumerable:!0,get:function(){return D.Dtproperty}});const E=a(4368);Object.defineProperty(t,"FailedLocation",{enumerable:!0,get:function(){return E.FailedLocation}});const b=a(1692);Object.defineProperty(t,"GraphSetting",{enumerable:!0,get:function(){return b.GraphSetting}});const w=a(5208);Object.defineProperty(t,"GraphSetup",{enumerable:!0,get:function(){return w.GraphSetup}});const I=a(9933);Object.defineProperty(t,"Haplotype",{enumerable:!0,get:function(){return I.Haplotype}});const R=a(9447);Object.defineProperty(t,"HaplotypeResultText",{enumerable:!0,get:function(){return R.HaplotypeResultText}});const O=a(6824);Object.defineProperty(t,"InfinitySystemLog",{enumerable:!0,get:function(){return O.InfinitySystemLog}});const h=a(3026);Object.defineProperty(t,"Instrument",{enumerable:!0,get:function(){return h.Instrument}});const M=a(7198);Object.defineProperty(t,"LisTestOrder",{enumerable:!0,get:function(){return M.LisTestOrder}});const G=a(7358);Object.defineProperty(t,"MeltPeakResult",{enumerable:!0,get:function(){return G.MeltPeakResult}});const v=a(9047);Object.defineProperty(t,"MeltPeakSetting",{enumerable:!0,get:function(){return v.MeltPeakSetting}});const S=a(5973);Object.defineProperty(t,"Organism",{enumerable:!0,get:function(){return S.Organism}});const A=a(8356);Object.defineProperty(t,"OrganismResult",{enumerable:!0,get:function(){return A.OrganismResult}});const P=a(4271);Object.defineProperty(t,"OrganismResultEvaluator",{enumerable:!0,get:function(){return P.OrganismResultEvaluator}});const L=a(1688);Object.defineProperty(t,"OrganismResultRule",{enumerable:!0,get:function(){return L.OrganismResultRule}});const C=a(2020);Object.defineProperty(t,"OrganismResultText",{enumerable:!0,get:function(){return C.OrganismResultText}});const K=a(1857);Object.defineProperty(t,"OrganismTarget",{enumerable:!0,get:function(){return K.OrganismTarget}});const x=a(2703);Object.defineProperty(t,"Path",{enumerable:!0,get:function(){return x.Path}});const j=a(3848);Object.defineProperty(t,"Patient",{enumerable:!0,get:function(){return j.Patient}});const q=a(5856);Object.defineProperty(t,"PatientTestOrder",{enumerable:!0,get:function(){return q.PatientTestOrder}});const k=a(598);Object.defineProperty(t,"Privilege",{enumerable:!0,get:function(){return k.Privilege}});const F=a(7679);Object.defineProperty(t,"QcResult",{enumerable:!0,get:function(){return F.QcResult}});const B=a(5234);Object.defineProperty(t,"QcTest",{enumerable:!0,get:function(){return B.QcTest}});const Q=a(500);Object.defineProperty(t,"QuantResult",{enumerable:!0,get:function(){return Q.QuantResult}});const U=a(6572);Object.defineProperty(t,"QuantUnitSetting",{enumerable:!0,get:function(){return U.QuantUnitSetting}});const H=a(2025);Object.defineProperty(t,"ReagentLot",{enumerable:!0,get:function(){return H.ReagentLot}});const X=a(1084);Object.defineProperty(t,"RetainCartridgeColor",{enumerable:!0,get:function(){return X.RetainCartridgeColor}});const V=a(7617);Object.defineProperty(t,"SampleSetting",{enumerable:!0,get:function(){return V.SampleSetting}});const z=a(1674);Object.defineProperty(t,"SampleType",{enumerable:!0,get:function(){return z.SampleType}});const J=a(2412);Object.defineProperty(t,"Snp",{enumerable:!0,get:function(){return J.Snp}});const $=a(6151);Object.defineProperty(t,"SystemLog",{enumerable:!0,get:function(){return $.SystemLog}});const Y=a(9100);Object.defineProperty(t,"Test",{enumerable:!0,get:function(){return Y.Test}});const W=a(6103);Object.defineProperty(t,"TestBlog",{enumerable:!0,get:function(){return W.TestBlog}});const Z=a(3969);Object.defineProperty(t,"TestBlogCounter",{enumerable:!0,get:function(){return Z.TestBlogCounter}});const ee=a(1808);Object.defineProperty(t,"TestGraphSetup",{enumerable:!0,get:function(){return ee.TestGraphSetup}});const te=a(3569);Object.defineProperty(t,"TestHistory",{enumerable:!0,get:function(){return te.TestHistory}});const ae=a(9642);Object.defineProperty(t,"TestPcError",{enumerable:!0,get:function(){return ae.TestPcError}});const le=a(6548);Object.defineProperty(t,"TestRun",{enumerable:!0,get:function(){return le.TestRun}});const se=a(8075);Object.defineProperty(t,"User",{enumerable:!0,get:function(){return se.User}}),t.initModels=function(e){const t=l.IntegrityCheck.initModel(e),a=s.Advancestagesetting.initModel(e),ne=n.Analyte.initModel(e),ie=i.AnalyteResult.initModel(e),oe=o.AnalyteResultText.initModel(e),re=r.Assay.initModel(e),pe=p.AssayCartridge.initModel(e),ue=u.AssayChamber.initModel(e),de=d.CalibrationChamber.initModel(e),ye=y.CalibrationSequence.initModel(e),_e=_.Cartridge.initModel(e),me=m.CartridgeOrder.initModel(e),ce=c.Chamber.initModel(e),Te=T.ColorDisclaimer.initModel(e),Ne=N.Config.initModel(e),ge=g.CrosstalkFactor.initModel(e),fe=f.DisabledModule.initModel(e),De=D.Dtproperty.initModel(e),Ee=E.FailedLocation.initModel(e),be=b.GraphSetting.initModel(e),we=w.GraphSetup.initModel(e),Ie=I.Haplotype.initModel(e),Re=R.HaplotypeResultText.initModel(e),Oe=O.InfinitySystemLog.initModel(e),he=h.Instrument.initModel(e),Me=M.LisTestOrder.initModel(e),Ge=G.MeltPeakResult.initModel(e),ve=v.MeltPeakSetting.initModel(e),Se=S.Organism.initModel(e),Ae=A.OrganismResult.initModel(e),Pe=P.OrganismResultEvaluator.initModel(e),Le=L.OrganismResultRule.initModel(e),Ce=C.OrganismResultText.initModel(e),Ke=K.OrganismTarget.initModel(e),xe=x.Path.initModel(e),je=j.Patient.initModel(e),qe=q.PatientTestOrder.initModel(e),ke=k.Privilege.initModel(e),Fe=F.QcResult.initModel(e),Be=B.QcTest.initModel(e),Qe=Q.QuantResult.initModel(e),Ue=U.QuantUnitSetting.initModel(e),He=H.ReagentLot.initModel(e),Xe=X.RetainCartridgeColor.initModel(e),Ve=V.SampleSetting.initModel(e),ze=z.SampleType.initModel(e),Je=J.Snp.initModel(e),$e=$.SystemLog.initModel(e),Ye=Y.Test.initModel(e),We=W.TestBlog.initModel(e),Ze=Z.TestBlogCounter.initModel(e),et=ee.TestGraphSetup.initModel(e),tt=te.TestHistory.initModel(e),at=ae.TestPcError.initModel(e),lt=le.TestRun.initModel(e),st=se.User.initModel(e);return be.belongsTo(re,{as:"assay",foreignKey:"assay_id"}),re.hasMany(be,{as:"graph_settings",foreignKey:"assay_id"}),Ue.belongsTo(re,{as:"assay",foreignKey:"assay_id"}),re.hasMany(Ue,{as:"quant_unit_settings",foreignKey:"assay_id"}),Ke.belongsTo(Ue,{as:"selected_quant_unit",foreignKey:"selected_quant_unit_id"}),Ue.hasMany(Ke,{as:"organism_targets",foreignKey:"selected_quant_unit_id"}),Qe.belongsTo(Ue,{as:"quant_unit_setting",foreignKey:"quant_unit_setting_id"}),Ue.hasMany(Qe,{as:"quant_results",foreignKey:"quant_unit_setting_id"}),Qe.belongsTo(Ye,{as:"test",foreignKey:"test_ID"}),Ye.hasMany(Qe,{as:"quant_results",foreignKey:"test_ID"}),Ye.hasMany(ie,{as:"analyte_results",foreignKey:"test_ID"}),Ye.hasMany(Ae,{as:"organism_results",foreignKey:"test_ID"}),Ye.belongsTo(re,{as:"assay",foreignKey:"assay_ID"}),Ye.belongsTo(st,{as:"operator",foreignKey:"operator_ids"}),Ye.hasOne(lt,{as:"test_run",foreignKey:"test_ID"}),Ye.belongsTo(qe,{as:"patient_test_order",foreignKey:"test_id"}),Ye.hasMany(at,{as:"test_errors",foreignKey:"test_id"}),qe.belongsTo(je,{as:"patient",foreignKey:"patient_id"}),ie.belongsTo(ne,{as:"analyte",foreignKey:"analyte_ID"}),Ae.belongsTo(Se,{as:"organism",foreignKey:"organism_ID"}),Ze.belongsTo(We,{as:"test_blog",foreignKey:"test_blog_ID"}),We.hasMany(Ze,{as:"test_blog_counters",foreignKey:"test_blog_ID"}),{IntegrityCheck:t,Advancestagesetting:a,Analyte:ne,AnalyteResult:ie,AnalyteResultText:oe,Assay:re,AssayCartridge:pe,AssayChamber:ue,CalibrationChamber:de,CalibrationSequence:ye,Cartridge:_e,CartridgeOrder:me,Chamber:ce,ColorDisclaimer:Te,Config:Ne,CrosstalkFactor:ge,DisabledModule:fe,Dtproperty:De,FailedLocation:Ee,GraphSetting:be,GraphSetup:we,Haplotype:Ie,HaplotypeResultText:Re,InfinitySystemLog:Oe,Instrument:he,LisTestOrder:Me,MeltPeakResult:Ge,MeltPeakSetting:ve,Organism:Se,OrganismResult:Ae,OrganismResultEvaluator:Pe,OrganismResultRule:Le,OrganismResultText:Ce,OrganismTarget:Ke,Path:xe,Patient:je,PatientTestOrder:qe,Privilege:ke,QcResult:Fe,QcTest:Be,QuantResult:Qe,QuantUnitSetting:Ue,ReagentLot:He,RetainCartridgeColor:Xe,SampleSetting:Ve,SampleType:ze,Snp:Je,SystemLog:$e,Test:Ye,TestBlog:We,TestBlogCounter:Ze,TestGraphSetup:et,TestHistory:tt,TestPcError:at,TestRun:lt,User:st}}},3026:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Instrument=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Instrument",{Instrument_id:{type:l.DataTypes.INTEGER,allowNull:!0},mac_address:{type:l.DataTypes.BLOB,allowNull:!0},serial_number:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"instrument",schema:"dbo",timestamps:!1,indexes:[{name:"mac_address",fields:[{name:"mac_address"}]}]})}}t.Instrument=s},2496:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.IntegrityCheck=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("IntegrityCheck",{table_name:{type:l.DataTypes.STRING(32),allowNull:!0},field_name:{type:l.DataTypes.STRING(24),allowNull:!0},id_number:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"Integrity_Check",schema:"dbo",timestamps:!1})}}t.IntegrityCheck=s},7198:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisTestOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisTestOrder",{instrument_specimen_ID:{type:l.DataTypes.STRING(64),allowNull:!1,defaultValue:""},sample_ID:{type:l.DataTypes.STRING(25),allowNull:!0},test_code:{type:l.DataTypes.STRING(15),allowNull:!0,defaultValue:""},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:-1},order_time:{type:l.DataTypes.STRING(24),allowNull:!0},order_status:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:1},priority:{type:l.DataTypes.INTEGER,allowNull:!1,defaultValue:1},LIS_test_order_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},cartridge_ID:{type:l.DataTypes.STRING(25),allowNull:!0}},{tableName:"lis_test_order",schema:"dbo",timestamps:!1,indexes:[{name:"IX_lis_test_order",fields:[{name:"instrument_specimen_ID"}]},{name:"PK_lis_test_order",unique:!0,fields:[{name:"LIS_test_order_ID"}]}]})}}t.LisTestOrder=s},7358:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakResult",{melt_peak_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_result_id:{type:l.DataTypes.INTEGER,allowNull:!1},peak_index:{type:l.DataTypes.INTEGER,allowNull:!1},peak_height:{type:l.DataTypes.FLOAT,allowNull:!1},peak_temperature:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"melt_peak_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK_melt_peak_result",unique:!0,fields:[{name:"melt_peak_result_id"}]}]})}}t.MeltPeakResult=s},9047:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakSetting",{melt_peak_settings_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},slope_positive:{type:l.DataTypes.BOOLEAN,allowNull:!1},baseline_start_temp:{type:l.DataTypes.FLOAT,allowNull:!1},baseline_look_back:{type:l.DataTypes.FLOAT,allowNull:!1},baseline_num_points:{type:l.DataTypes.INTEGER,allowNull:!1},points_around_peak:{type:l.DataTypes.INTEGER,allowNull:!1},peak_threshold:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_min:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_max:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"melt_peak_settings",schema:"dbo",timestamps:!1,indexes:[{name:"PK_melt_peak_settings",unique:!0,fields:[{name:"melt_peak_settings_id"}]}]})}}t.MeltPeakSetting=s},4271:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultEvaluator=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultEvaluator",{organism_result_evaluator_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0},parent_evaluator_id:{type:l.DataTypes.INTEGER,allowNull:!0},evaluator_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"organism_result_evaluator",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result_evaluator",unique:!0,fields:[{name:"organism_result_evaluator_id"}]}]})}}t.OrganismResultEvaluator=s},1688:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultRule=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultRule",{organism_result_rule_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},evaluator_id:{type:l.DataTypes.INTEGER,allowNull:!0},parent_rule_id:{type:l.DataTypes.INTEGER,allowNull:!0},rule_type:{type:l.DataTypes.INTEGER,allowNull:!1},rule_anded:{type:l.DataTypes.BOOLEAN,allowNull:!0},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0},pass_on_equals:{type:l.DataTypes.BOOLEAN,allowNull:!0},interpretation:{type:l.DataTypes.INTEGER,allowNull:!0},reasons:{type:l.DataTypes.STRING(50),allowNull:!0},pass_on_peak:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"organism_result_rule",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result_rule",unique:!0,fields:[{name:"organism_result_rule_id"}]}]})}}t.OrganismResultRule=s},2020:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultText",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(8),allowNull:!1},result_text_reference:{type:l.DataTypes.SMALLINT,allowNull:!0},text_color_reference:{type:l.DataTypes.SMALLINT,allowNull:!0},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},organism_result_text_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"organism_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result_text",unique:!0,fields:[{name:"organism_result_text_id"}]}]})}}t.OrganismResultText=s},8356:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResult",{organism_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},result_type:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0},haplotype_index:{type:l.DataTypes.INTEGER,allowNull:!0},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_color:{type:l.DataTypes.INTEGER,allowNull:!0},result_invalid:{type:l.DataTypes.BOOLEAN,allowNull:!0},allele2_text:{type:l.DataTypes.TEXT,allowNull:!0},lda_total:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_result",unique:!0,fields:[{name:"organism_result_id"}]}]})}}t.OrganismResult=s},1857:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismTarget=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismTarget",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1},selected_quant_unit_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"quant_unit_setting",key:"quant_unit_setting_id"}},organism_target_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},lda_ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!0},lda_delta_ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"organism_target",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism_target",unique:!0,fields:[{name:"organism_target_id"}]}]})}}t.OrganismTarget=s},5973:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Organism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Organism",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},organism_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(20),allowNull:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1},early_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},late_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},medium_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},low_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},very_low_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},semi_quant_text_ref:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:-1},replacement_text_ref:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:-1},replacement_color_ref:{type:l.DataTypes.INTEGER,allowNull:!0,defaultValue:-1},delta_ct_min:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:-1},organism_lis_test_code:{type:l.DataTypes.STRING(15),allowNull:!0},organism_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},lda_intercept:{type:l.DataTypes.FLOAT,allowNull:!0},lda_min_valid:{type:l.DataTypes.FLOAT,allowNull:!0},lda_cutoff:{type:l.DataTypes.FLOAT,allowNull:!0},lda_max_valid:{type:l.DataTypes.FLOAT,allowNull:!0},pr_dynamic_range_min:{type:l.DataTypes.FLOAT,allowNull:!0},pr_lod_loq:{type:l.DataTypes.FLOAT,allowNull:!0},pr_dynamic_range_max:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK_organism",unique:!0,fields:[{name:"organism_id"}]}]})}}t.Organism=s},2703:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Path=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Path",{path_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},cartridge_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},chamber_number:{type:l.DataTypes.SMALLINT,allowNull:!1},tube:{type:l.DataTypes.BOOLEAN,allowNull:!0},block:{type:l.DataTypes.BOOLEAN,allowNull:!0},type:{type:l.DataTypes.SMALLINT,allowNull:!0},angular_offset:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"path",schema:"dbo",timestamps:!1,indexes:[{name:"cartridge_ID",fields:[{name:"cartridge_ID"}]},{name:"chamber_number",fields:[{name:"chamber_number"}]},{name:"path_id",fields:[{name:"path_ID"}]},{name:"PK_path",unique:!0,fields:[{name:"path_ID"},{name:"cartridge_ID"}]},{name:"type",fields:[{name:"type"}]}]})}}t.Path=s},5856:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PatientTestOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PatientTestOrder",{patient_test_order_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},patient_id:{type:l.DataTypes.INTEGER,allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0},lis_test_order_id:{type:l.DataTypes.INTEGER,allowNull:!0},cartridge_order_id:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"patient_test_order",schema:"dbo",timestamps:!1,indexes:[{name:"PK__patient_test_ord__4924D839",unique:!0,fields:[{name:"patient_test_order_id"}]}]})}}t.PatientTestOrder=s},3848:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Patient=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Patient",{patient_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},gx_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},practice_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},family_name:{type:l.DataTypes.TEXT,allowNull:!0},given_name:{type:l.DataTypes.TEXT,allowNull:!0},middle_name:{type:l.DataTypes.TEXT,allowNull:!0},date_of_birth:{type:l.DataTypes.STRING(32),allowNull:!0},gender:{type:l.DataTypes.STRING(64),allowNull:!0},ethnicity:{type:l.DataTypes.STRING(64),allowNull:!0},postal_code:{type:l.DataTypes.TEXT,allowNull:!0}},{tableName:"patient",schema:"dbo",timestamps:!1,indexes:[{name:"PK__patient__473C8FC7",unique:!0,fields:[{name:"patient_id"}]}]})}}t.Patient=s},598:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Privilege=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Privilege",{privilege_name:{type:l.DataTypes.STRING(64),allowNull:!1,primaryKey:!0},user_type:{type:l.DataTypes.SMALLINT,allowNull:!1,primaryKey:!0}},{tableName:"privilege",schema:"dbo",timestamps:!1,indexes:[{name:"PK_privilege",unique:!0,fields:[{name:"privilege_name"},{name:"user_type"}]}]})}}t.Privilege=s},7679:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QcResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QcResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_name:{type:l.DataTypes.STRING(32),allowNull:!1},assay_version:{type:l.DataTypes.SMALLINT,allowNull:!1},rgt_lot_id:{type:l.DataTypes.STRING(6),allowNull:!0},completion_date:{type:l.DataTypes.DATE,allowNull:!0},due_date:{type:l.DataTypes.DATE,allowNull:!1}},{tableName:"qc_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__qc_resul__3213E83F0FB750B3",unique:!0,fields:[{name:"id"}]}]})}}t.QcResult=s},5234:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QcTest=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QcTest",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0},qc_result_id:{type:l.DataTypes.INTEGER,allowNull:!1},is_pos:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_pass:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"qc_test",schema:"dbo",timestamps:!1,indexes:[{name:"PK__qc_test__3213E83F1387E197",unique:!0,fields:[{name:"id"}]}]})}}t.QcTest=s},500:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QuantResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QuantResult",{quant_result_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"test_ID"}},quant_unit_setting_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"quant_unit_setting",key:"quant_unit_setting_id"}},quantitative_result:{type:l.DataTypes.FLOAT,allowNull:!0},result_text:{type:l.DataTypes.STRING(1024),allowNull:!0},result_text_color:{type:l.DataTypes.SMALLINT,allowNull:!1},qualitative_result:{type:l.DataTypes.STRING(50),allowNull:!0},result_abnormal_flag:{type:l.DataTypes.STRING(5),allowNull:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_result_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"quant_result",schema:"dbo",timestamps:!1,indexes:[{name:"analyte_result_id",fields:[{name:"analyte_result_id"}]},{name:"PK__quant_result__3AD6B8E2",unique:!0,fields:[{name:"quant_result_id"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.QuantResult=s},6572:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QuantUnitSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QuantUnitSetting",{quant_unit_setting_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"assay_ID"}},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1},position:{type:l.DataTypes.INTEGER,allowNull:!1},unit_key:{type:l.DataTypes.STRING(50),allowNull:!1},conversion_factor:{type:l.DataTypes.FLOAT,allowNull:!1},lower_limit:{type:l.DataTypes.FLOAT,allowNull:!1},upper_limit:{type:l.DataTypes.FLOAT,allowNull:!1},display_log_value:{type:l.DataTypes.SMALLINT,allowNull:!1,defaultValue:0},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"quant_unit_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant_unit_setti__351DDF8C",unique:!0,fields:[{name:"quant_unit_setting_id"}]}]})}}t.QuantUnitSetting=s},2025:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ReagentLot",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},rgt_lot_number:{type:l.DataTypes.STRING(3),allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!0},reagent_lot_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"guid",fields:[{name:"guid"}]},{name:"PK_reagent_lot",unique:!0,fields:[{name:"reagent_lot_id"}]},{name:"rgt_lot_number",fields:[{name:"rgt_lot_number"}]}]})}}t.ReagentLot=s},1084:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RetainCartridgeColor=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("RetainCartridgeColor",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!1},color:{type:l.DataTypes.INTEGER,allowNull:!1},retain_cartridge:{type:l.DataTypes.BOOLEAN,allowNull:!0},retain_cartridge_color_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"retain_cartridge_color",schema:"dbo",timestamps:!1,indexes:[{name:"assay_cartridge_id",fields:[{name:"assay_cartridge_id"}]},{name:"PK_retain_cartridge",unique:!0,fields:[{name:"retain_cartridge_color_id"}]}]})}}t.RetainCartridgeColor=s},7617:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleSetting",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},sample_type:{type:l.DataTypes.SMALLINT,allowNull:!1},valid_min:{type:l.DataTypes.DECIMAL(5,1),allowNull:!0},valid_max:{type:l.DataTypes.DECIMAL(5,1),allowNull:!0},end_pt_threshold:{type:l.DataTypes.SMALLINT,allowNull:!0},probe_chk_low_max:{type:l.DataTypes.INTEGER,allowNull:!0},probe_chk_high_min:{type:l.DataTypes.INTEGER,allowNull:!0},probe_chk_delta:{type:l.DataTypes.INTEGER,allowNull:!0},is_lot_parameters:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_endpoint:{type:l.DataTypes.BOOLEAN,allowNull:!0},peak_height_min:{type:l.DataTypes.FLOAT,allowNull:!0},use_delta_ct:{type:l.DataTypes.BOOLEAN,allowNull:!0,defaultValue:!1},min_delta_ct:{type:l.DataTypes.FLOAT,allowNull:!0,defaultValue:0},delta_ct_eff:{type:l.DataTypes.FLOAT,allowNull:!0},E0:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E1:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E2:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E3:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},E4:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},sample_settings_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},reagent_lot_id:{type:l.DataTypes.INTEGER,allowNull:!1},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_low_min:{type:l.DataTypes.INTEGER,allowNull:!0},probe_chk_high_max:{type:l.DataTypes.INTEGER,allowNull:!0},ct_threshold_value:{type:l.DataTypes.FLOAT,allowNull:!0},normalization_factor:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"sample_settings",schema:"dbo",timestamps:!1,indexes:[{name:"analyte_id",fields:[{name:"analyte_id"}]},{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"PK_sample_settings",unique:!0,fields:[{name:"sample_settings_id"}]},{name:"reagent_lot_id",fields:[{name:"reagent_lot_id"}]},{name:"sample_type",fields:[{name:"sample_type"}]}]})}}t.SampleSetting=s},1674:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleType=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleType",{assay_ID:{type:l.DataTypes.INTEGER,allowNull:!1},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},pos:{type:l.DataTypes.SMALLINT,allowNull:!0}},{tableName:"sample_type",schema:"dbo",timestamps:!1})}}t.SampleType=s},2412:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Snp=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Snp",{assay_id:{type:l.DataTypes.INTEGER,allowNull:!0},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!0},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0},snp_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"snp",schema:"dbo",timestamps:!1,indexes:[{name:"PK_snp",unique:!0,fields:[{name:"snp_id"}]}]})}}t.Snp=s},6151:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SystemLog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SystemLog",{error_type:{type:l.DataTypes.INTEGER,allowNull:!0},log_time:{type:l.DataTypes.STRING(24),allowNull:!0},error_code:{type:l.DataTypes.INTEGER,allowNull:!0},details:{type:l.DataTypes.STRING(512),allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},site_name:{type:l.DataTypes.CHAR(3),allowNull:!0,defaultValue:""},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},system_log_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0}},{tableName:"system_log",schema:"dbo",timestamps:!1,indexes:[{name:"IX_system_log",fields:[{name:"system_log_ID"}]},{name:"PK_system_log",unique:!0,fields:[{name:"system_log_ID"}]}]})}}t.SystemLog=s},3969:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlogCounter=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlogCounter",{test_blog_ID:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"test_blog",key:"test_blog_ID"}},date_text:{type:l.DataTypes.STRING(8),allowNull:!1,primaryKey:!0},test_count:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_blog_counter",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_blog_counter",unique:!0,fields:[{name:"test_blog_ID"},{name:"date_text"}]}]})}}t.TestBlogCounter=s},6103:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlog",{test_blog_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_name:{type:l.DataTypes.STRING(32),allowNull:!0},assay_version:{type:l.DataTypes.SMALLINT,allowNull:!1}},{tableName:"test_blog",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_blog",unique:!0,fields:[{name:"test_blog_ID"}]}]})}}t.TestBlog=s},1808:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestGraphSetup",{test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},graph_setup_ID:{type:l.DataTypes.INTEGER,allowNull:!1},pos:{type:l.DataTypes.SMALLINT,allowNull:!0},test_graph_setup_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"graph_setup_ID",fields:[{name:"graph_setup_ID"}]},{name:"PK_test_graph_setup",unique:!0,fields:[{name:"test_graph_setup_id"}]},{name:"test_ID",fields:[{name:"test_ID"}]}]})}}t.TestGraphSetup=s},3569:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestHistory",{test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},field_name:{type:l.DataTypes.STRING(32),allowNull:!1},old_content:{type:l.DataTypes.STRING(512),allowNull:!0},new_content:{type:l.DataTypes.STRING(512),allowNull:!0},user_ID:{type:l.DataTypes.INTEGER,allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!1},test_history_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"test_history",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_history",unique:!0,fields:[{name:"test_history_id"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.TestHistory=s},9642:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestPcError=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestPcError",{test_id:{type:l.DataTypes.INTEGER,allowNull:!1},code:{type:l.DataTypes.INTEGER,allowNull:!0},type:{type:l.DataTypes.SMALLINT,allowNull:!0},details:{type:l.DataTypes.STRING(512),allowNull:!0},severity:{type:l.DataTypes.SMALLINT,allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!0},parameter_1:{type:l.DataTypes.FLOAT,allowNull:!0},parameter_2:{type:l.DataTypes.FLOAT,allowNull:!0},parameter_3:{type:l.DataTypes.FLOAT,allowNull:!0},parameter_4:{type:l.DataTypes.FLOAT,allowNull:!0},textparameter:{type:l.DataTypes.STRING(64),allowNull:!0},test_pc_error_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},test_run_id:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_pc_error",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_pc_error",unique:!0,fields:[{name:"test_pc_error_id"}]},{name:"test_id",fields:[{name:"test_id"}]},{name:"test_run_id",fields:[{name:"test_run_id"}]}]})}}t.TestPcError=s},6548:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestRun=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestRun",{test_run_id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},site_name:{type:l.DataTypes.CHAR(3),allowNull:!1},site_serial_num:{type:l.DataTypes.INTEGER,allowNull:!0},rgt_lot_ID:{type:l.DataTypes.STRING(6),allowNull:!1},cart_serial_number:{type:l.DataTypes.BIGINT,allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},state:{type:l.DataTypes.SMALLINT,allowNull:!0},error_status:{type:l.DataTypes.SMALLINT,allowNull:!0},start_time:{type:l.DataTypes.STRING(24),allowNull:!0},end_time:{type:l.DataTypes.STRING(24),allowNull:!0},user_ID:{type:l.DataTypes.INTEGER,allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0},icore_serial_num:{type:l.DataTypes.INTEGER,allowNull:!0},fw_version:{type:l.DataTypes.STRING(12),allowNull:!0},datagram_format:{type:l.DataTypes.SMALLINT,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},order_time:{type:l.DataTypes.STRING(24),allowNull:!0},expiration_date:{type:l.DataTypes.DATE,allowNull:!1},cartridge_barcode:{type:l.DataTypes.STRING(1024),allowNull:!0},test_ID:{type:l.DataTypes.INTEGER,allowNull:!1},assay_cartridge_id:{type:l.DataTypes.INTEGER,allowNull:!1},current_test_run:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"test_run",schema:"dbo",timestamps:!1,indexes:[{name:"PK_test_run",unique:!0,fields:[{name:"test_run_id"}]}]})}}t.TestRun=s},9100:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Test=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Test",{test_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_ID:{type:l.DataTypes.INTEGER,allowNull:!0},sample_ID:{type:l.DataTypes.STRING(25),allowNull:!0},scanned_SID:{type:l.DataTypes.BOOLEAN,allowNull:!0},scanned_PID:{type:l.DataTypes.BOOLEAN,allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},test_type:{type:l.DataTypes.SMALLINT,allowNull:!0},expected_result:{type:l.DataTypes.SMALLINT,allowNull:!0},lis_upload_message_ID:{type:l.DataTypes.STRING(64),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},order_time:{type:l.DataTypes.STRING(24),allowNull:!0},outliner:{type:l.DataTypes.BOOLEAN,allowNull:!1},archived:{type:l.DataTypes.BOOLEAN,allowNull:!1},auto_archived:{type:l.DataTypes.BOOLEAN,allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},other_sample_type_text:{type:l.DataTypes.STRING(32),allowNull:!0},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_text_colors:{type:l.DataTypes.TEXT,allowNull:!0},express_result_text:{type:l.DataTypes.STRING(1024),allowNull:!0},order_id:{type:l.DataTypes.INTEGER,allowNull:!1},upload_status:{type:l.DataTypes.INTEGER,allowNull:!1},priority:{type:l.DataTypes.INTEGER,allowNull:!0},cartridge_order_id:{type:l.DataTypes.INTEGER,allowNull:!0},data_reduction_alg:{type:l.DataTypes.SMALLINT,allowNull:!1},state:{type:l.DataTypes.SMALLINT,allowNull:!0},error_status:{type:l.DataTypes.SMALLINT,allowNull:!0},site_name:{type:l.DataTypes.TEXT,allowNull:!0},site_serial_num:{type:l.DataTypes.TEXT,allowNull:!0},operator_ids:{type:l.DataTypes.TEXT,allowNull:!0},start_time:{type:l.DataTypes.STRING(24),allowNull:!0},end_time:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"test",schema:"dbo",timestamps:!1,indexes:[{name:"assay_ID",fields:[{name:"assay_ID"}]},{name:"guid",fields:[{name:"guid"}]},{name:"PK_test",unique:!0,fields:[{name:"test_ID"}]},{name:"start_time",fields:[{name:"start_time"}]}]})}}t.Test=s},8075:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.User=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("User",{user_ID:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},login_name:{type:l.DataTypes.STRING(16),allowNull:!0},full_name:{type:l.DataTypes.STRING(128),allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_hidden:{type:l.DataTypes.BOOLEAN,allowNull:!1},password:{type:l.DataTypes.STRING(32),allowNull:!0},user_type:{type:l.DataTypes.SMALLINT,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},creation:{type:l.DataTypes.STRING(24),allowNull:!0},modified:{type:l.DataTypes.STRING(24),allowNull:!0}},{tableName:"users",schema:"dbo",timestamps:!1,indexes:[{name:"guid",fields:[{name:"guid"}]},{name:"PK_users",unique:!0,fields:[{name:"user_ID"}]}]})}}t.User=s},1058:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,o)}r((l=l.apply(e,t||[])).next())}))},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.GeneXpertClient=void 0;const n=s(a(2245)),i=a(9634),o=a(496),r=a(7306),p=a(7228),u="YYYY/MM/DD HH:mm:ss.SSS";t.GeneXpertClient=class{constructor(e,t,a,l){this.version=e,this.sequelize=(0,r.createSequelize)(t,a,l),this.models=(0,p.initModels)(this.sequelize)}logsTotal(){return this.models.SystemLog.count()}testsTotal(){return this.models.Test.count()}systemInfo(){const e=this.sequelize.query("\n          SELECT\n            MAX(sw_version) as [sw_version],\n            [system_log].[site_serial_number],\n            [system_log].[site_name],\n            MAX([instrument_serial_number]) as [instrument_serial_number],\n            MAX(log_time) as [log_time],\n            MIN(log_time) as [first_seen_at],\n            MAX([disabled_module].[creation_time]) as [disabled_at]\n          FROM [dbo].[system_log]\n            LEFT JOIN [dbo].[disabled_module]\n            ON [dbo].[disabled_module].[site_serial_number] = [dbo].[system_log].[site_serial_number]\n          GROUP BY [site_name], [system_log].[site_serial_number]\n          ORDER BY log_time DESC\n        ").then((([e])=>e)),t=this.models.Config.findAll().then((e=>e.map((e=>({[e.param_key]:e.param_val}))))).then(i.mergeAll);return Promise.all([e,t]).then((e=>(0,r.toSystemInfo)(...e)))}testsPresyncables(e,t,a){return this.models.Test.findAll({where:{[o.Op.or]:[{modification_time:{[o.Op.gt]:e}},{modification_time:{[o.Op.eq]:e},id:{[o.Op.notIn]:t}}]},order:[["modification_time","DESC"]],limit:a}).then((e=>e.map((({id:e,modification_time:t})=>({id:e.toString(),modified:t})))))}testsSyncables(e){return this.models.Test.findAll({where:{id:{[o.Op.in]:e}},include:[{as:"test_data",model:this.models.TestDatum,include:[{as:"run_data",model:this.models.RunDatum}]},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]}},{as:"user",model:this.models.User},{as:"test_errors",model:this.models.TestError},{as:"patient",model:this.models.Patient},{as:"analyte_results",model:this.models.AnalyteResult,include:[{as:"analyte",model:this.models.Analyte},{as:"channel_processed_data_items",model:this.models.ChannelProcessedDataItem}]},{as:"organism_results",model:this.models.OrganismResult,include:[{as:"organism",model:this.models.Organism},{as:"organism_based_organism_result",model:this.models.OrganismBasedOrganismResult}]}]}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}testsForEntry(e,t){return this.models.Test.findAll({where:{sample_id:{[o.Op.notIn]:e}},include:[{as:"test_data",model:this.models.TestDatum,include:[{as:"run_data",model:this.models.RunDatum,required:!0,where:{start_time:{[o.Op.gte]:(0,n.default)().subtract(t||r.hoursForDataEntry,"hours").toDate()}}}],required:!0},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>(console.log({tests:e}),e.map((e=>({id:e.id,assay:e.assay.name,endedAt:e.test_data.run_data.end_time,sampleId:e.sample_id,startedAt:e.test_data.run_data.start_time}))))))}logsPresyncables(e,t,a){return this.models.SystemLog.findAll({where:{[o.Op.or]:[{log_time:{[o.Op.gt]:e}},{log_time:{[o.Op.eq]:e},id:{[o.Op.notIn]:t}}]},limit:a,attributes:["id","log_time"],order:[["log_time","ASC"]]}).then((e=>e.map((({id:e,log_time:t})=>({id:e.toString(),modified:t})))))}logsSyncables(e){return this.models.SystemLog.findAll({where:{id:{[o.Op.in]:e}}}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}close(){return this.sequelize.close()}getTest(e){var t,a;return l(this,void 0,void 0,(function*(){const l=yield this.models.Test.findOne({where:{sample_id:{[o.Op.eq]:e}},include:[{as:"test_data",model:this.models.TestDatum,include:[{as:"run_data",model:this.models.RunDatum}],required:!0}]});return{dataValues:Object.assign(Object.assign({},null==l?void 0:l.dataValues),{end_time:null===(t=null==l?void 0:l.dataValues)||void 0===t?void 0:t.test_data.run_data.end_time,sampleId:null===(a=null==l?void 0:l.dataValues)||void 0===a?void 0:a.sample_id})}}))}getTestsByTestIds(e){return this.models.Test.findAll({where:{id:{[o.Op.in]:e}},include:[{as:"test_data",model:this.models.TestDatum,include:[{as:"run_data",model:this.models.RunDatum,required:!0}],required:!0},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>(console.log({tests:e}),e.map((e=>({id:e.id,assay:e.assay.name,endedAt:e.test_data.run_data.end_time,sampleId:e.sample_id,startedAt:e.test_data.run_data.start_time}))))))}getCompletedTestsBySampleIds(e){return this.models.Test.findAll({where:{sample_id:{[o.Op.in]:e},modification_time:{[o.Op.and]:[{[o.Op.not]:null},{[o.Op.between]:[(0,n.default)().subtract(r.LAB_RESULT_APPROVAL_DEADLINE_HOURS,"hours").format(u),(0,n.default)().format(u)]}]},result_text:{[o.Op.not]:null}},include:[{as:"test_data",model:this.models.TestDatum,include:[{as:"run_data",model:this.models.RunDatum,required:!0}],required:!0},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t,a,l,s,i,o,r;return{id:e.id,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(null!==(s=null===(l=null===(a=null==e?void 0:e.test_data)||void 0===a?void 0:a.run_data)||void 0===l?void 0:l.end_time)&&void 0!==s?s:null==e?void 0:e.modification_time,u).toDate(),sampleId:e.sample_id,startedAt:(0,n.default)(null!==(r=null===(o=null===(i=null==e?void 0:e.test_data)||void 0===i?void 0:i.run_data)||void 0===o?void 0:o.start_time)&&void 0!==r?r:null==e?void 0:e.order_time,u).toDate()}}))))}}},7978:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AnalyteResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AnalyteResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}}},{tableName:"analyte_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_analyte_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__analyte___3213E83E14E7CED0",unique:!0,fields:[{name:"id"}]}]})}}t.AnalyteResult=s},2794:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Analyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Analyte",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},analyte_index:{type:l.DataTypes.INTEGER,allowNull:!1},background_end:{type:l.DataTypes.INTEGER,allowNull:!1},background_look_back:{type:l.DataTypes.INTEGER,allowNull:!1},background_max_rms_error:{type:l.DataTypes.FLOAT,allowNull:!0},background_max_slope:{type:l.DataTypes.FLOAT,allowNull:!0},background_min_points:{type:l.DataTypes.INTEGER,allowNull:!1},background_start:{type:l.DataTypes.INTEGER,allowNull:!1},boxcar_cycles:{type:l.DataTypes.INTEGER,allowNull:!1},curve_analysis:{type:l.DataTypes.INTEGER,allowNull:!1},curve_fit_end_index:{type:l.DataTypes.INTEGER,allowNull:!0},curve_fit_max_nrse:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_slope_vs_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_min_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_start_index:{type:l.DataTypes.INTEGER,allowNull:!0},intended_concentration:{type:l.DataTypes.FLOAT,allowNull:!1},invalid_bias:{type:l.DataTypes.INTEGER,allowNull:!1},is_signal_loss_detection_enabled:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_probe_check_use_delta_pc:{type:l.DataTypes.BOOLEAN,allowNull:!1},name:{type:l.DataTypes.STRING(20),allowNull:!1},probe_check_max_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_min_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},reporter_name:{type:l.DataTypes.STRING(12),allowNull:!1},target:{type:l.DataTypes.BLOB,allowNull:!0},use_curve_fit:{type:l.DataTypes.BOOLEAN,allowNull:!1},use_curve_fit_end_data:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_curve_fit_on_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_curve_fit_start_background:{type:l.DataTypes.BOOLEAN,allowNull:!0},usage:{type:l.DataTypes.INTEGER,allowNull:!1},use_background_validation:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"analyte",schema:"dbo",timestamps:!1,indexes:[{name:"PK__analyte__3213E83F45720FCE",unique:!0,fields:[{name:"id"}]}]})}}t.Analyte=s},7237:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayChamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayChamber",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge",key:"id"}},chamber_number:{type:l.DataTypes.INTEGER,allowNull:!1},initial_volume:{type:l.DataTypes.INTEGER,allowNull:!1},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!1},name:{type:l.DataTypes.STRING(16),allowNull:!1}},{tableName:"assay_chamber",schema:"dbo",timestamps:!1,indexes:[{name:"PK__assay_ch__3213E83F3198BBBB",unique:!0,fields:[{name:"id"}]}]})}}t.AssayChamber=s},9295:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayExt=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayExt",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},position:{type:l.DataTypes.INTEGER,allowNull:!0},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"assay_ext",schema:"dbo",timestamps:!1,indexes:[{name:"PK__assay_ex__3213E83F022A7289",unique:!0,fields:[{name:"id"}]},{name:"UX_assayext_assayid",unique:!0,fields:[{name:"assay_id"}]}]})}}t.AssayExt=s},3262:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Assay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Assay",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}},assay_index:{type:l.DataTypes.INTEGER,allowNull:!0},result_text_type:{type:l.DataTypes.INTEGER,allowNull:!0},allows_result_masking:{type:l.DataTypes.BOOLEAN,allowNull:!0},assay_lock_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_version:{type:l.DataTypes.INTEGER,allowNull:!0},command_bytes:{type:l.DataTypes.BLOB,allowNull:!0},command_sequence_format:{type:l.DataTypes.INTEGER,allowNull:!0},comments:{type:l.DataTypes.STRING(4e3),allowNull:!0},company_code:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},data_reduction_algorithm:{type:l.DataTypes.INTEGER,allowNull:!0},default_result_text_index:{type:l.DataTypes.INTEGER,allowNull:!0},default_text_color_reference:{type:l.DataTypes.INTEGER,allowNull:!0},disclaimer:{type:l.DataTypes.STRING(4e3),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_clia_waived:{type:l.DataTypes.BOOLEAN,allowNull:!0},lock_comments:{type:l.DataTypes.STRING(4e3),allowNull:!0},lock_time:{type:l.DataTypes.DATE,allowNull:!0},modification_time:{type:l.DataTypes.DATE,allowNull:!0},name:{type:l.DataTypes.STRING(32),allowNull:!1},need_lsp:{type:l.DataTypes.BOOLEAN,allowNull:!0},picture:{type:l.DataTypes.BLOB,allowNull:!0},prep_cartridge_shelf_life:{type:l.DataTypes.INTEGER,allowNull:!0},product_code:{type:l.DataTypes.INTEGER,allowNull:!0},sample_prep_instruction:{type:l.DataTypes.STRING(256),allowNull:!0},sample_prep_video:{type:l.DataTypes.BLOB,allowNull:!0},use_background_subtraction:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_melt_all_peaks:{type:l.DataTypes.BOOLEAN,allowNull:!0},melt_calculation_type:{type:l.DataTypes.INTEGER,allowNull:!0},user_name:{type:l.DataTypes.STRING(128),allowNull:!0}},{tableName:"assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__assay__3213E83FA31C85AC",unique:!0,fields:[{name:"id"}]},{name:"UX_assay_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.Assay=s},7023:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BasicOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("BasicOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}}},{tableName:"basic_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__basic_or__3213E83F1461EC00",unique:!0,fields:[{name:"id"}]}]})}}t.BasicOrganism=s},7747:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CartridgeType=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CartridgeType",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},adc_2_psi:{type:l.DataTypes.FLOAT,allowNull:!1},air_chamber:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_foot_height:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_version:{type:l.DataTypes.INTEGER,allowNull:!1},creation_time:{type:l.DataTypes.DATE,allowNull:!1},direct_flow_rate_max:{type:l.DataTypes.FLOAT,allowNull:!1},direct_flow_rate_min:{type:l.DataTypes.FLOAT,allowNull:!1},direct_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},filter_flow_rate_max:{type:l.DataTypes.FLOAT,allowNull:!1},filter_flow_rate_min:{type:l.DataTypes.FLOAT,allowNull:!1},filter_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},initial_aspirate_flow_rate:{type:l.DataTypes.FLOAT,allowNull:!1},initial_aspirate_volume:{type:l.DataTypes.INTEGER,allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},max_pressure:{type:l.DataTypes.INTEGER,allowNull:!1},microliters_per_revolution:{type:l.DataTypes.FLOAT,allowNull:!1},min_pressure:{type:l.DataTypes.INTEGER,allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1},overflow_chamber:{type:l.DataTypes.INTEGER,allowNull:!1},picture:{type:l.DataTypes.BLOB,allowNull:!0},plunger_pickup_position:{type:l.DataTypes.INTEGER,allowNull:!1},plunger_strip_position:{type:l.DataTypes.INTEGER,allowNull:!1},syringe_max_transfer_volume:{type:l.DataTypes.INTEGER,allowNull:!1},syringe_max_volume:{type:l.DataTypes.INTEGER,allowNull:!1},syringe_min_transfer_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_chamber_number:{type:l.DataTypes.INTEGER,allowNull:!1},tube_chamber_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_pressurized_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_syringe_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_volume:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"cartridge_type",schema:"dbo",timestamps:!1,indexes:[{name:"PK__cartridg__3213E83FBEDCCE47",unique:!0,fields:[{name:"id"}]},{name:"UX_cartridgetype_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.CartridgeType=s},4786:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Cartridge=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Cartridge",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},air_chamber:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_type_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge_type",key:"id"}},overflow_chamber:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"cartridge",schema:"dbo",timestamps:!1,indexes:[{name:"PK__cartridg__3213E83FC188E9DE",unique:!0,fields:[{name:"id"}]}]})}}t.Cartridge=s},72:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Chamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Chamber",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge_type",key:"id"}},chamber_number:{type:l.DataTypes.INTEGER,allowNull:!1},max_volume:{type:l.DataTypes.INTEGER,allowNull:!1},min_volume:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"chamber",schema:"dbo",timestamps:!1,indexes:[{name:"PK__chamber__3213E83F0917E88C",unique:!0,fields:[{name:"id"}]}]})}}t.Chamber=s},1245:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ChannelProcessedDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ChannelProcessedDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte_result",key:"id"}},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"channel_processed_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_channel_processed_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__channel___3213E83E2B0FCE58",unique:!0,fields:[{name:"id"}]}]})}}t.ChannelProcessedDataItem=s},2762:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ChannelRawDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ChannelRawDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"channel_raw_data",key:"id"}},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0},timestamps:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"channel_raw_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_channel_raw_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__channel___3213E83E9C17EB49",unique:!0,fields:[{name:"id"}]}]})}}t.ChannelRawDataItem=s},1843:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ChannelRawDatum=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ChannelRawDatum",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test_data",key:"id"}},protocol_number:{type:l.DataTypes.INTEGER,allowNull:!1},channel_name:{type:l.DataTypes.STRING(32),allowNull:!1}},{tableName:"channel_raw_data",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_channel_raw_data_parent_id",fields:[{name:"parent_id"}]},{name:"PK__channel___3213E83EE6BEF901",unique:!0,fields:[{name:"id"}]}]})}}t.ChannelRawDatum=s},1328:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalAnalyteDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalAnalyteDataItem",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"channel_processed_data_item",key:"id"}},organism_index:{type:l.DataTypes.INTEGER,allowNull:!0},calculation_index:{type:l.DataTypes.INTEGER,allowNull:!0},row_index:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"clinical_analyte_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F0CD269AC",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalAnalyteDataItem=s},3525:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalAnalyteResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalAnalyteResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"analyte_result",key:"id"}}},{tableName:"clinical_analyte_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FFA28E224",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalAnalyteResult=s},524:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalAssay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"clinical_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FF50319E1",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalAssay=s},9505:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalCalculationInput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalCalculationInput",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_input",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_calculation_row",key:"id"}}},{tableName:"clinical_calculation_input",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F414142BF",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalCalculationInput=s},1349:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalCalculationOutput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalCalculationOutput",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_output",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_calculation_row",key:"id"}}},{tableName:"clinical_calculation_output",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F4BBB0C99",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalCalculationOutput=s},76:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalCalculationRow=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalCalculationRow",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_calculation",key:"id"}},row_index:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_calculation_row",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F5B82DD16",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalCalculationRow=s},4944:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalCalculation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalCalculation",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_organism",key:"id"}},calculation_index:{type:l.DataTypes.INTEGER,allowNull:!1},description:{type:l.DataTypes.STRING(200),allowNull:!1},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_calculation",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F9541F948",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalCalculation=s},394:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalActionFinalResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalActionFinalResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_conditional_action",key:"id"}},result_text:{type:l.DataTypes.INTEGER,allowNull:!0},result_color:{type:l.DataTypes.INTEGER,allowNull:!1},formatted_result:{type:l.DataTypes.STRING(100),allowNull:!0}},{tableName:"clinical_conditional_action_final_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FCC4B13C0",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalActionFinalResult=s},4966:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalActionInput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalActionInput",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_input",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_conditional_action",key:"id"}}},{tableName:"clinical_conditional_action_input",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FEFE9E46E",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalActionInput=s},6025:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalActionOutput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalActionOutput",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_output",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_conditional_action",key:"id"}}},{tableName:"clinical_conditional_action_output",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F9516484F",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalActionOutput=s},1649:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalAction=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalAction",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_conditional_row",key:"id"}},action_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_conditional_action",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F4F69BFC0",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalAction=s},1737:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalCellBoolean=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalCellBoolean",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_conditional_cell",key:"id"}},pass_on_true:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"clinical_conditional_cell_boolean",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F77B37E6A",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalCellBoolean=s},396:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalCellInput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalCellInput",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_input",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_conditional_cell",key:"id"}}},{tableName:"clinical_conditional_cell_input",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F7103405A",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalCellInput=s},6199:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalCellNumeric=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalCellNumeric",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_conditional_cell",key:"id"}},comparator:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_conditional_cell_numeric",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FA2655DA8",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalCellNumeric=s},8085:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalCell=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalCell",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_conditional_row",key:"id"}},cell_index:{type:l.DataTypes.INTEGER,allowNull:!1},cell_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_conditional_cell",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F03BC1C65",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalCell=s},7243:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalConditionalRow=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalConditionalRow",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_calculation",key:"id"}},row_index:{type:l.DataTypes.INTEGER,allowNull:!1},anded:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"clinical_conditional_row",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F8B8030AD",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalConditionalRow=s},8263:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalDataItemHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalDataItemHistory",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_test_history",key:"id"}},assay_index:{type:l.DataTypes.INTEGER,allowNull:!0},item_type:{type:l.DataTypes.INTEGER,allowNull:!1},item_index:{type:l.DataTypes.INTEGER,allowNull:!1},item_name:{type:l.DataTypes.STRING(64),allowNull:!1},item_value:{type:l.DataTypes.TEXT,allowNull:!1}},{tableName:"clinical_data_item_history",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_clinical_data_item_history_parent_id",fields:[{name:"parent_id"}]},{name:"PK__clinical__3213E83E85137B98",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalDataItemHistory=s},9838:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorChoiceValue=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorChoiceValue",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_factor",key:"id"}},description:{type:l.DataTypes.STRING(200),allowNull:!1},value_index:{type:l.DataTypes.INTEGER,allowNull:!1},value:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"clinical_factor_choice_value",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F86CD6890",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorChoiceValue=s},1387:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorDouble=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorDouble",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_factor",key:"id"}},max_value:{type:l.DataTypes.FLOAT,allowNull:!0},max_inclusive:{type:l.DataTypes.BOOLEAN,allowNull:!0},min_value:{type:l.DataTypes.FLOAT,allowNull:!0},min_inclusive:{type:l.DataTypes.BOOLEAN,allowNull:!0},scale:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_factor_double",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F9FC35501",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorDouble=s},7308:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorHistory",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_test_history",key:"id"}},factor_index:{type:l.DataTypes.INTEGER,allowNull:!1},factor_value:{type:l.DataTypes.TEXT,allowNull:!0}},{tableName:"clinical_factor_history",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_clinical_factor_history_parent_id",fields:[{name:"parent_id"}]},{name:"PK__clinical__3213E83E8816DFD4",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorHistory=s},165:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorInteger=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorInteger",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_factor",key:"id"}},max_value:{type:l.DataTypes.INTEGER,allowNull:!0},max_inclusive:{type:l.DataTypes.BOOLEAN,allowNull:!0},min_value:{type:l.DataTypes.INTEGER,allowNull:!0},min_inclusive:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"clinical_factor_integer",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F5DE2C715",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorInteger=s},8127:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorIntervalRange=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorIntervalRange",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_factor",key:"id"}},max_value:{type:l.DataTypes.FLOAT,allowNull:!0},max_inclusive:{type:l.DataTypes.BOOLEAN,allowNull:!0},min_value:{type:l.DataTypes.FLOAT,allowNull:!0},min_inclusive:{type:l.DataTypes.BOOLEAN,allowNull:!0},range_index:{type:l.DataTypes.INTEGER,allowNull:!1},value:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"clinical_factor_interval_range",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FCDBAF07C",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorIntervalRange=s},2995:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorInterval=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorInterval",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_factor",key:"id"}},scale:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"clinical_factor_interval",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F6C72855B",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorInterval=s},7395:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorText",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"clinical_factor",key:"id"}},max_length:{type:l.DataTypes.INTEGER,allowNull:!0},min_length:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"clinical_factor_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F438B66D2",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorText=s},2327:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactorValue=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactorValue",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},factor_index:{type:l.DataTypes.INTEGER,allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0}},{tableName:"clinical_factor_value",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_clinical_factor_value_parent_id",fields:[{name:"parent_id"}]},{name:"PK__clinical__3213E83E8C7743F0",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactorValue=s},6072:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalFactor=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalFactor",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},type:{type:l.DataTypes.INTEGER,allowNull:!1},factor_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1},required:{type:l.DataTypes.BOOLEAN,allowNull:!1},reportable:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"clinical_factor",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F6E1A38C3",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalFactor=s},8206:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalInput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalInput",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_index:{type:l.DataTypes.INTEGER,allowNull:!0},input_index:{type:l.DataTypes.INTEGER,allowNull:!1},item_index:{type:l.DataTypes.INTEGER,allowNull:!0},item_name:{type:l.DataTypes.STRING(64),allowNull:!0},item_type:{type:l.DataTypes.INTEGER,allowNull:!1},item_value:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"clinical_input",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F74FD12D5",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalInput=s},4411:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalOrganismDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalOrganismDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"clinical_organism_result",key:"id"}},calculation_index:{type:l.DataTypes.INTEGER,allowNull:!1},row_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0}},{tableName:"clinical_organism_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_clinical_organism_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__clinical__3213E83E7D5A9F8B",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalOrganismDataItem=s},2837:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},formatted_result:{type:l.DataTypes.TEXT,allowNull:!0}},{tableName:"clinical_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F0BF84811",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalOrganismResult=s},823:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}}},{tableName:"clinical_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F91CC7040",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalOrganism=s},9554:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalOutput=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalOutput",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},assay_index:{type:l.DataTypes.INTEGER,allowNull:!0},item_type:{type:l.DataTypes.INTEGER,allowNull:!1},item_index:{type:l.DataTypes.INTEGER,allowNull:!1},output_name:{type:l.DataTypes.STRING(64),allowNull:!1},scale:{type:l.DataTypes.INTEGER,allowNull:!1},persisted:{type:l.DataTypes.BOOLEAN,allowNull:!1},reportable:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"clinical_output",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F14B9ED43",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalOutput=s},1491:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalReagentLot",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"reagent_lot",key:"id"}}},{tableName:"clinical_reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83F4E29E422",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalReagentLot=s},3999:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalSampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalSampleSetting",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"sample_setting",key:"id"}},lsp1:{type:l.DataTypes.FLOAT,allowNull:!0},lsp2:{type:l.DataTypes.FLOAT,allowNull:!0},lsp3:{type:l.DataTypes.FLOAT,allowNull:!0},lsp4:{type:l.DataTypes.FLOAT,allowNull:!0},lsp5:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"clinical_sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FD8FB1F3C",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalSampleSetting=s},6277:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ClinicalTestHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ClinicalTestHistory",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"test_history",key:"id"}},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_color:{type:l.DataTypes.TEXT,allowNull:!0},change_notes:{type:l.DataTypes.STRING(512),allowNull:!0}},{tableName:"clinical_test_history",schema:"dbo",timestamps:!1,indexes:[{name:"PK__clinical__3213E83FE9C5E368",unique:!0,fields:[{name:"id"}]}]})}}t.ClinicalTestHistory=s},9891:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorDisclaimer=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ColorDisclaimer",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},color:{type:l.DataTypes.INTEGER,allowNull:!1},disclaimer:{type:l.DataTypes.STRING(256),allowNull:!0}},{tableName:"color_disclaimer",schema:"dbo",timestamps:!1,indexes:[{name:"PK__color_di__3213E83FAE3B421D",unique:!0,fields:[{name:"id"}]}]})}}t.ColorDisclaimer=s},2469:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Config",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},param_key:{type:l.DataTypes.STRING(64),allowNull:!0},param_val:{type:l.DataTypes.STRING(512),allowNull:!0}},{tableName:"config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__config__3213E83FC1650530",unique:!0,fields:[{name:"id"}]},{name:"UX_config_paramkey",unique:!0,fields:[{name:"param_key"}]}]})}}t.Config=s},1630:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CrosstalkCorrResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CrosstalkCorrResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte_result",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte",key:"id"}},protocol_index:{type:l.DataTypes.INTEGER,allowNull:!1},ignore_code:{type:l.DataTypes.STRING(64),allowNull:!1},correlation_slope:{type:l.DataTypes.FLOAT,allowNull:!0},correlation_r2:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"crosstalk_corr_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_crosstalk_corr_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__crosstal__3213E83E0C67F430",unique:!0,fields:[{name:"id"}]}]})}}t.CrosstalkCorrResult=s},611:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DeltaCtOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("DeltaCtOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"basic_organism",key:"id"}},delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!1},delta_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"delta_ct_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__delta_ct__3213E83F4A8FAF95",unique:!0,fields:[{name:"id"}]}]})}}t.DeltaCtOrganism=s},6688:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DisabledModule=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("DisabledModule",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!1},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"disabled_module",schema:"dbo",timestamps:!1,indexes:[{name:"PK__disabled__3213E83F9BC346A8",unique:!0,fields:[{name:"id"}]},{name:"UX_disabledmodule_siteserialnumber",unique:!0,fields:[{name:"site_serial_number"}]}]})}}t.DisabledModule=s},6778:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingHaplotypeOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingHaplotypeOrganism",{haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"haplotype",key:"id"}},genotyping_organism_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"genotyping_organism",key:"id"}}},{tableName:"genotyping_haplotype_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__060A713D62762933",unique:!0,fields:[{name:"haplotype_id"},{name:"genotyping_organism_id"}]},{name:"UX_gho_haplotypeid_genotypingorganismid",unique:!0,fields:[{name:"haplotype_id"},{name:"genotyping_organism_id"}]}]})}}t.GenotypingHaplotypeOrganism=s},6331:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}}},{tableName:"genotyping_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__3213E83F30C3A17A",unique:!0,fields:[{name:"id"}]}]})}}t.GenotypingOrganismResult=s},4037:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},early_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!1},late_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"genotyping_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__3213E83FE30FD201",unique:!0,fields:[{name:"id"}]}]})}}t.GenotypingOrganism=s},9059:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetupAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetupAssay",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},graph_setup_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"graph_setup",key:"id"}},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}}},{tableName:"graph_setup_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__graph_se__3213E83FD6372598",unique:!0,fields:[{name:"id"}]},{name:"UX_graphsetupassay_graphsetupid_assayid",unique:!0,fields:[{name:"graph_setup_id"},{name:"assay_id"}]}]})}}t.GraphSetupAssay=s},6898:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetup",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},graph_type:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!1},is_default:{type:l.DataTypes.BOOLEAN,allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1}},{tableName:"graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__graph_se__3213E83F9C07A4B9",unique:!0,fields:[{name:"id"}]}]})}}t.GraphSetup=s},6919:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.HaplotypeResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("HaplotypeResultText",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"haplotype",key:"id"}},alleles_text1:{type:l.DataTypes.STRING(10),allowNull:!1},alleles_text2:{type:l.DataTypes.STRING(10),allowNull:!1},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(11),allowNull:!1},text_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"haplotype_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK__haplotyp__3213E83F72031D90",unique:!0,fields:[{name:"id"}]}]})}}t.HaplotypeResultText=s},8932:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.HaplotypeResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("HaplotypeResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"haplotype",key:"id"}},allele1_text:{type:l.DataTypes.TEXT,allowNull:!1},allele2_text:{type:l.DataTypes.TEXT,allowNull:!1},result_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"haplotype_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_haplotype_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__haplotyp__3213E83E3CD9584C",unique:!0,fields:[{name:"id"}]}]})}}t.HaplotypeResult=s},904:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Haplotype=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Haplotype",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},haplotype_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(20),allowNull:!1}},{tableName:"haplotype",schema:"dbo",timestamps:!1,indexes:[{name:"PK__haplotyp__3213E83FF5494E7E",unique:!0,fields:[{name:"id"}]}]})}}t.Haplotype=s},7228:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DeltaCtOrganism=t.CrosstalkCorrResult=t.Config=t.ColorDisclaimer=t.ClinicalTestHistory=t.ClinicalSampleSetting=t.ClinicalReagentLot=t.ClinicalOutput=t.ClinicalOrganismResult=t.ClinicalOrganismDataItem=t.ClinicalOrganism=t.ClinicalInput=t.ClinicalFactorValue=t.ClinicalFactorText=t.ClinicalFactorIntervalRange=t.ClinicalFactorInterval=t.ClinicalFactorInteger=t.ClinicalFactorHistory=t.ClinicalFactorDouble=t.ClinicalFactorChoiceValue=t.ClinicalFactor=t.ClinicalDataItemHistory=t.ClinicalConditionalRow=t.ClinicalConditionalCellNumeric=t.ClinicalConditionalCellInput=t.ClinicalConditionalCellBoolean=t.ClinicalConditionalCell=t.ClinicalConditionalActionOutput=t.ClinicalConditionalActionInput=t.ClinicalConditionalActionFinalResult=t.ClinicalConditionalAction=t.ClinicalCalculationRow=t.ClinicalCalculationOutput=t.ClinicalCalculationInput=t.ClinicalCalculation=t.ClinicalAssay=t.ClinicalAnalyteResult=t.ClinicalAnalyteDataItem=t.ChannelRawDataItem=t.ChannelRawDatum=t.ChannelProcessedDataItem=t.Chamber=t.CartridgeType=t.Cartridge=t.BasicOrganism=t.AssayExt=t.AssayChamber=t.Assay=t.AnalyteResult=t.Analyte=void 0,t.Reporter=t.ReportGraphSetting=t.ReagentLot=t.RawDataItem=t.QuantUnitSetting=t.Quant1SampleSetting=t.Quant1Result=t.Quant1ReagentLot=t.Quant1OrganismResult=t.Quant1Organism=t.QcTest=t.QcResult=t.QcLockoutSetting=t.PressureGraphSetup=t.PercentRatioSampleSetting=t.PercentRatioResultEvaluator=t.PercentRatioReagentLot=t.PercentRatioOrganismResult=t.PercentRatioOrganism=t.Patient=t.Path=t.OrganismTarget=t.OrganismResultText=t.OrganismResult=t.OrganismBasedOrganismResult=t.Organism=t.OpticsGraphSetup=t.MeltPeakSetting=t.MeltPeakResult=t.MeltGraphSetup=t.LisUpload=t.LisTestOrder=t.LisOrganismConfig=t.LisHaplotypeConfig=t.LisGenotypingAssayConfig=t.LisAssayConfig=t.LdaOrganismResult=t.LdaOrganism=t.LdaCoefficient=t.LdaAnalyte=t.Instrument=t.HaplotypeResultText=t.HaplotypeResult=t.Haplotype=t.GraphSetupAssay=t.GraphSetup=t.GenotypingOrganismResult=t.GenotypingOrganism=t.GenotypingHaplotypeOrganism=t.DisabledModule=void 0,t.initModels=t.User=t.UserPrivilege=t.UserLockout=t.UserExt=t.UltrasonicGraphSetup=t.TestHistory=t.TestExt=t.TestError=t.TestDataError=t.TestDatum=t.TestBlogCounter=t.TestBlog=t.Test=t.TemperatureGraphSetup=t.TargetBasedOrganism=t.SystemLog=t.SemiQuantOrganism=t.SelectedQuantUnitSetting=t.SampleType=t.SampleSetting=t.RunDatum=t.ResultRuleMeltPeak=t.ResultRuleInterpretation=t.ResultRuleAnalyte=t.ResultMaskingConfig=t.ResultEvaluator=t.ResultCalculation=void 0;const l=a(2794);Object.defineProperty(t,"Analyte",{enumerable:!0,get:function(){return l.Analyte}});const s=a(7978);Object.defineProperty(t,"AnalyteResult",{enumerable:!0,get:function(){return s.AnalyteResult}});const n=a(3262);Object.defineProperty(t,"Assay",{enumerable:!0,get:function(){return n.Assay}});const i=a(7237);Object.defineProperty(t,"AssayChamber",{enumerable:!0,get:function(){return i.AssayChamber}});const o=a(9295);Object.defineProperty(t,"AssayExt",{enumerable:!0,get:function(){return o.AssayExt}});const r=a(7023);Object.defineProperty(t,"BasicOrganism",{enumerable:!0,get:function(){return r.BasicOrganism}});const p=a(4786);Object.defineProperty(t,"Cartridge",{enumerable:!0,get:function(){return p.Cartridge}});const u=a(7747);Object.defineProperty(t,"CartridgeType",{enumerable:!0,get:function(){return u.CartridgeType}});const d=a(72);Object.defineProperty(t,"Chamber",{enumerable:!0,get:function(){return d.Chamber}});const y=a(1245);Object.defineProperty(t,"ChannelProcessedDataItem",{enumerable:!0,get:function(){return y.ChannelProcessedDataItem}});const _=a(1843);Object.defineProperty(t,"ChannelRawDatum",{enumerable:!0,get:function(){return _.ChannelRawDatum}});const m=a(2762);Object.defineProperty(t,"ChannelRawDataItem",{enumerable:!0,get:function(){return m.ChannelRawDataItem}});const c=a(1328);Object.defineProperty(t,"ClinicalAnalyteDataItem",{enumerable:!0,get:function(){return c.ClinicalAnalyteDataItem}});const T=a(3525);Object.defineProperty(t,"ClinicalAnalyteResult",{enumerable:!0,get:function(){return T.ClinicalAnalyteResult}});const N=a(524);Object.defineProperty(t,"ClinicalAssay",{enumerable:!0,get:function(){return N.ClinicalAssay}});const g=a(4944);Object.defineProperty(t,"ClinicalCalculation",{enumerable:!0,get:function(){return g.ClinicalCalculation}});const f=a(9505);Object.defineProperty(t,"ClinicalCalculationInput",{enumerable:!0,get:function(){return f.ClinicalCalculationInput}});const D=a(1349);Object.defineProperty(t,"ClinicalCalculationOutput",{enumerable:!0,get:function(){return D.ClinicalCalculationOutput}});const E=a(76);Object.defineProperty(t,"ClinicalCalculationRow",{enumerable:!0,get:function(){return E.ClinicalCalculationRow}});const b=a(1649);Object.defineProperty(t,"ClinicalConditionalAction",{enumerable:!0,get:function(){return b.ClinicalConditionalAction}});const w=a(394);Object.defineProperty(t,"ClinicalConditionalActionFinalResult",{enumerable:!0,get:function(){return w.ClinicalConditionalActionFinalResult}});const I=a(4966);Object.defineProperty(t,"ClinicalConditionalActionInput",{enumerable:!0,get:function(){return I.ClinicalConditionalActionInput}});const R=a(6025);Object.defineProperty(t,"ClinicalConditionalActionOutput",{enumerable:!0,get:function(){return R.ClinicalConditionalActionOutput}});const O=a(8085);Object.defineProperty(t,"ClinicalConditionalCell",{enumerable:!0,get:function(){return O.ClinicalConditionalCell}});const h=a(1737);Object.defineProperty(t,"ClinicalConditionalCellBoolean",{enumerable:!0,get:function(){return h.ClinicalConditionalCellBoolean}});const M=a(396);Object.defineProperty(t,"ClinicalConditionalCellInput",{enumerable:!0,get:function(){return M.ClinicalConditionalCellInput}});const G=a(6199);Object.defineProperty(t,"ClinicalConditionalCellNumeric",{enumerable:!0,get:function(){return G.ClinicalConditionalCellNumeric}});const v=a(7243);Object.defineProperty(t,"ClinicalConditionalRow",{enumerable:!0,get:function(){return v.ClinicalConditionalRow}});const S=a(8263);Object.defineProperty(t,"ClinicalDataItemHistory",{enumerable:!0,get:function(){return S.ClinicalDataItemHistory}});const A=a(6072);Object.defineProperty(t,"ClinicalFactor",{enumerable:!0,get:function(){return A.ClinicalFactor}});const P=a(9838);Object.defineProperty(t,"ClinicalFactorChoiceValue",{enumerable:!0,get:function(){return P.ClinicalFactorChoiceValue}});const L=a(1387);Object.defineProperty(t,"ClinicalFactorDouble",{enumerable:!0,get:function(){return L.ClinicalFactorDouble}});const C=a(7308);Object.defineProperty(t,"ClinicalFactorHistory",{enumerable:!0,get:function(){return C.ClinicalFactorHistory}});const K=a(165);Object.defineProperty(t,"ClinicalFactorInteger",{enumerable:!0,get:function(){return K.ClinicalFactorInteger}});const x=a(2995);Object.defineProperty(t,"ClinicalFactorInterval",{enumerable:!0,get:function(){return x.ClinicalFactorInterval}});const j=a(8127);Object.defineProperty(t,"ClinicalFactorIntervalRange",{enumerable:!0,get:function(){return j.ClinicalFactorIntervalRange}});const q=a(7395);Object.defineProperty(t,"ClinicalFactorText",{enumerable:!0,get:function(){return q.ClinicalFactorText}});const k=a(2327);Object.defineProperty(t,"ClinicalFactorValue",{enumerable:!0,get:function(){return k.ClinicalFactorValue}});const F=a(8206);Object.defineProperty(t,"ClinicalInput",{enumerable:!0,get:function(){return F.ClinicalInput}});const B=a(823);Object.defineProperty(t,"ClinicalOrganism",{enumerable:!0,get:function(){return B.ClinicalOrganism}});const Q=a(4411);Object.defineProperty(t,"ClinicalOrganismDataItem",{enumerable:!0,get:function(){return Q.ClinicalOrganismDataItem}});const U=a(2837);Object.defineProperty(t,"ClinicalOrganismResult",{enumerable:!0,get:function(){return U.ClinicalOrganismResult}});const H=a(9554);Object.defineProperty(t,"ClinicalOutput",{enumerable:!0,get:function(){return H.ClinicalOutput}});const X=a(1491);Object.defineProperty(t,"ClinicalReagentLot",{enumerable:!0,get:function(){return X.ClinicalReagentLot}});const V=a(3999);Object.defineProperty(t,"ClinicalSampleSetting",{enumerable:!0,get:function(){return V.ClinicalSampleSetting}});const z=a(6277);Object.defineProperty(t,"ClinicalTestHistory",{enumerable:!0,get:function(){return z.ClinicalTestHistory}});const J=a(9891);Object.defineProperty(t,"ColorDisclaimer",{enumerable:!0,get:function(){return J.ColorDisclaimer}});const $=a(2469);Object.defineProperty(t,"Config",{enumerable:!0,get:function(){return $.Config}});const Y=a(1630);Object.defineProperty(t,"CrosstalkCorrResult",{enumerable:!0,get:function(){return Y.CrosstalkCorrResult}});const W=a(611);Object.defineProperty(t,"DeltaCtOrganism",{enumerable:!0,get:function(){return W.DeltaCtOrganism}});const Z=a(6688);Object.defineProperty(t,"DisabledModule",{enumerable:!0,get:function(){return Z.DisabledModule}});const ee=a(6778);Object.defineProperty(t,"GenotypingHaplotypeOrganism",{enumerable:!0,get:function(){return ee.GenotypingHaplotypeOrganism}});const te=a(4037);Object.defineProperty(t,"GenotypingOrganism",{enumerable:!0,get:function(){return te.GenotypingOrganism}});const ae=a(6331);Object.defineProperty(t,"GenotypingOrganismResult",{enumerable:!0,get:function(){return ae.GenotypingOrganismResult}});const le=a(6898);Object.defineProperty(t,"GraphSetup",{enumerable:!0,get:function(){return le.GraphSetup}});const se=a(9059);Object.defineProperty(t,"GraphSetupAssay",{enumerable:!0,get:function(){return se.GraphSetupAssay}});const ne=a(904);Object.defineProperty(t,"Haplotype",{enumerable:!0,get:function(){return ne.Haplotype}});const ie=a(8932);Object.defineProperty(t,"HaplotypeResult",{enumerable:!0,get:function(){return ie.HaplotypeResult}});const oe=a(6919);Object.defineProperty(t,"HaplotypeResultText",{enumerable:!0,get:function(){return oe.HaplotypeResultText}});const re=a(5160);Object.defineProperty(t,"Instrument",{enumerable:!0,get:function(){return re.Instrument}});const pe=a(1608);Object.defineProperty(t,"LdaAnalyte",{enumerable:!0,get:function(){return pe.LdaAnalyte}});const ue=a(7176);Object.defineProperty(t,"LdaCoefficient",{enumerable:!0,get:function(){return ue.LdaCoefficient}});const de=a(8529);Object.defineProperty(t,"LdaOrganism",{enumerable:!0,get:function(){return de.LdaOrganism}});const ye=a(7853);Object.defineProperty(t,"LdaOrganismResult",{enumerable:!0,get:function(){return ye.LdaOrganismResult}});const _e=a(625);Object.defineProperty(t,"LisAssayConfig",{enumerable:!0,get:function(){return _e.LisAssayConfig}});const me=a(6465);Object.defineProperty(t,"LisGenotypingAssayConfig",{enumerable:!0,get:function(){return me.LisGenotypingAssayConfig}});const ce=a(7946);Object.defineProperty(t,"LisHaplotypeConfig",{enumerable:!0,get:function(){return ce.LisHaplotypeConfig}});const Te=a(672);Object.defineProperty(t,"LisOrganismConfig",{enumerable:!0,get:function(){return Te.LisOrganismConfig}});const Ne=a(2938);Object.defineProperty(t,"LisTestOrder",{enumerable:!0,get:function(){return Ne.LisTestOrder}});const ge=a(6522);Object.defineProperty(t,"LisUpload",{enumerable:!0,get:function(){return ge.LisUpload}});const fe=a(6611);Object.defineProperty(t,"MeltGraphSetup",{enumerable:!0,get:function(){return fe.MeltGraphSetup}});const De=a(227);Object.defineProperty(t,"MeltPeakResult",{enumerable:!0,get:function(){return De.MeltPeakResult}});const Ee=a(9073);Object.defineProperty(t,"MeltPeakSetting",{enumerable:!0,get:function(){return Ee.MeltPeakSetting}});const be=a(8396);Object.defineProperty(t,"OpticsGraphSetup",{enumerable:!0,get:function(){return be.OpticsGraphSetup}});const we=a(848);Object.defineProperty(t,"Organism",{enumerable:!0,get:function(){return we.Organism}});const Ie=a(7029);Object.defineProperty(t,"OrganismBasedOrganismResult",{enumerable:!0,get:function(){return Ie.OrganismBasedOrganismResult}});const Re=a(4701);Object.defineProperty(t,"OrganismResult",{enumerable:!0,get:function(){return Re.OrganismResult}});const Oe=a(2677);Object.defineProperty(t,"OrganismResultText",{enumerable:!0,get:function(){return Oe.OrganismResultText}});const he=a(8456);Object.defineProperty(t,"OrganismTarget",{enumerable:!0,get:function(){return he.OrganismTarget}});const Me=a(7762);Object.defineProperty(t,"Path",{enumerable:!0,get:function(){return Me.Path}});const Ge=a(2157);Object.defineProperty(t,"Patient",{enumerable:!0,get:function(){return Ge.Patient}});const ve=a(8967);Object.defineProperty(t,"PercentRatioOrganism",{enumerable:!0,get:function(){return ve.PercentRatioOrganism}});const Se=a(1604);Object.defineProperty(t,"PercentRatioOrganismResult",{enumerable:!0,get:function(){return Se.PercentRatioOrganismResult}});const Ae=a(7189);Object.defineProperty(t,"PercentRatioReagentLot",{enumerable:!0,get:function(){return Ae.PercentRatioReagentLot}});const Pe=a(8524);Object.defineProperty(t,"PercentRatioResultEvaluator",{enumerable:!0,get:function(){return Pe.PercentRatioResultEvaluator}});const Le=a(7287);Object.defineProperty(t,"PercentRatioSampleSetting",{enumerable:!0,get:function(){return Le.PercentRatioSampleSetting}});const Ce=a(459);Object.defineProperty(t,"PressureGraphSetup",{enumerable:!0,get:function(){return Ce.PressureGraphSetup}});const Ke=a(5503);Object.defineProperty(t,"QcLockoutSetting",{enumerable:!0,get:function(){return Ke.QcLockoutSetting}});const xe=a(2190);Object.defineProperty(t,"QcResult",{enumerable:!0,get:function(){return xe.QcResult}});const je=a(4230);Object.defineProperty(t,"QcTest",{enumerable:!0,get:function(){return je.QcTest}});const qe=a(7284);Object.defineProperty(t,"Quant1Organism",{enumerable:!0,get:function(){return qe.Quant1Organism}});const ke=a(6774);Object.defineProperty(t,"Quant1OrganismResult",{enumerable:!0,get:function(){return ke.Quant1OrganismResult}});const Fe=a(8925);Object.defineProperty(t,"Quant1ReagentLot",{enumerable:!0,get:function(){return Fe.Quant1ReagentLot}});const Be=a(7795);Object.defineProperty(t,"Quant1Result",{enumerable:!0,get:function(){return Be.Quant1Result}});const Qe=a(6977);Object.defineProperty(t,"Quant1SampleSetting",{enumerable:!0,get:function(){return Qe.Quant1SampleSetting}});const Ue=a(589);Object.defineProperty(t,"QuantUnitSetting",{enumerable:!0,get:function(){return Ue.QuantUnitSetting}});const He=a(2132);Object.defineProperty(t,"RawDataItem",{enumerable:!0,get:function(){return He.RawDataItem}});const Xe=a(9092);Object.defineProperty(t,"ReagentLot",{enumerable:!0,get:function(){return Xe.ReagentLot}});const Ve=a(5076);Object.defineProperty(t,"ReportGraphSetting",{enumerable:!0,get:function(){return Ve.ReportGraphSetting}});const ze=a(617);Object.defineProperty(t,"Reporter",{enumerable:!0,get:function(){return ze.Reporter}});const Je=a(3513);Object.defineProperty(t,"ResultCalculation",{enumerable:!0,get:function(){return Je.ResultCalculation}});const $e=a(7014);Object.defineProperty(t,"ResultEvaluator",{enumerable:!0,get:function(){return $e.ResultEvaluator}});const Ye=a(8770);Object.defineProperty(t,"ResultMaskingConfig",{enumerable:!0,get:function(){return Ye.ResultMaskingConfig}});const We=a(6430);Object.defineProperty(t,"ResultRuleAnalyte",{enumerable:!0,get:function(){return We.ResultRuleAnalyte}});const Ze=a(872);Object.defineProperty(t,"ResultRuleInterpretation",{enumerable:!0,get:function(){return Ze.ResultRuleInterpretation}});const et=a(3051);Object.defineProperty(t,"ResultRuleMeltPeak",{enumerable:!0,get:function(){return et.ResultRuleMeltPeak}});const tt=a(2658);Object.defineProperty(t,"RunDatum",{enumerable:!0,get:function(){return tt.RunDatum}});const at=a(591);Object.defineProperty(t,"SampleSetting",{enumerable:!0,get:function(){return at.SampleSetting}});const lt=a(7919);Object.defineProperty(t,"SampleType",{enumerable:!0,get:function(){return lt.SampleType}});const st=a(7167);Object.defineProperty(t,"SelectedQuantUnitSetting",{enumerable:!0,get:function(){return st.SelectedQuantUnitSetting}});const nt=a(7020);Object.defineProperty(t,"SemiQuantOrganism",{enumerable:!0,get:function(){return nt.SemiQuantOrganism}});const it=a(4617);Object.defineProperty(t,"SystemLog",{enumerable:!0,get:function(){return it.SystemLog}});const ot=a(922);Object.defineProperty(t,"TargetBasedOrganism",{enumerable:!0,get:function(){return ot.TargetBasedOrganism}});const rt=a(7571);Object.defineProperty(t,"TemperatureGraphSetup",{enumerable:!0,get:function(){return rt.TemperatureGraphSetup}});const pt=a(1731);Object.defineProperty(t,"Test",{enumerable:!0,get:function(){return pt.Test}});const ut=a(4715);Object.defineProperty(t,"TestBlog",{enumerable:!0,get:function(){return ut.TestBlog}});const dt=a(248);Object.defineProperty(t,"TestBlogCounter",{enumerable:!0,get:function(){return dt.TestBlogCounter}});const yt=a(4309);Object.defineProperty(t,"TestDatum",{enumerable:!0,get:function(){return yt.TestDatum}});const _t=a(196);Object.defineProperty(t,"TestDataError",{enumerable:!0,get:function(){return _t.TestDataError}});const mt=a(1591);Object.defineProperty(t,"TestError",{enumerable:!0,get:function(){return mt.TestError}});const ct=a(5748);Object.defineProperty(t,"TestExt",{enumerable:!0,get:function(){return ct.TestExt}});const Tt=a(1396);Object.defineProperty(t,"TestHistory",{enumerable:!0,get:function(){return Tt.TestHistory}});const Nt=a(2535);Object.defineProperty(t,"UltrasonicGraphSetup",{enumerable:!0,get:function(){return Nt.UltrasonicGraphSetup}});const gt=a(9884);Object.defineProperty(t,"UserExt",{enumerable:!0,get:function(){return gt.UserExt}});const ft=a(6772);Object.defineProperty(t,"UserLockout",{enumerable:!0,get:function(){return ft.UserLockout}});const Dt=a(1701);Object.defineProperty(t,"UserPrivilege",{enumerable:!0,get:function(){return Dt.UserPrivilege}});const Et=a(8655);Object.defineProperty(t,"User",{enumerable:!0,get:function(){return Et.User}}),t.initModels=function(e){const t=l.Analyte.initModel(e),a=s.AnalyteResult.initModel(e),bt=n.Assay.initModel(e),wt=i.AssayChamber.initModel(e),It=o.AssayExt.initModel(e),Rt=r.BasicOrganism.initModel(e),Ot=p.Cartridge.initModel(e),ht=u.CartridgeType.initModel(e),Mt=d.Chamber.initModel(e),Gt=y.ChannelProcessedDataItem.initModel(e),vt=_.ChannelRawDatum.initModel(e),St=m.ChannelRawDataItem.initModel(e),At=c.ClinicalAnalyteDataItem.initModel(e),Pt=T.ClinicalAnalyteResult.initModel(e),Lt=N.ClinicalAssay.initModel(e),Ct=g.ClinicalCalculation.initModel(e),Kt=f.ClinicalCalculationInput.initModel(e),xt=D.ClinicalCalculationOutput.initModel(e),jt=E.ClinicalCalculationRow.initModel(e),qt=b.ClinicalConditionalAction.initModel(e),kt=w.ClinicalConditionalActionFinalResult.initModel(e),Ft=I.ClinicalConditionalActionInput.initModel(e),Bt=R.ClinicalConditionalActionOutput.initModel(e),Qt=O.ClinicalConditionalCell.initModel(e),Ut=h.ClinicalConditionalCellBoolean.initModel(e),Ht=M.ClinicalConditionalCellInput.initModel(e),Xt=G.ClinicalConditionalCellNumeric.initModel(e),Vt=v.ClinicalConditionalRow.initModel(e),zt=S.ClinicalDataItemHistory.initModel(e),Jt=A.ClinicalFactor.initModel(e),$t=P.ClinicalFactorChoiceValue.initModel(e),Yt=L.ClinicalFactorDouble.initModel(e),Wt=C.ClinicalFactorHistory.initModel(e),Zt=K.ClinicalFactorInteger.initModel(e),ea=x.ClinicalFactorInterval.initModel(e),ta=j.ClinicalFactorIntervalRange.initModel(e),aa=q.ClinicalFactorText.initModel(e),la=k.ClinicalFactorValue.initModel(e),sa=F.ClinicalInput.initModel(e),na=B.ClinicalOrganism.initModel(e),ia=Q.ClinicalOrganismDataItem.initModel(e),oa=U.ClinicalOrganismResult.initModel(e),ra=H.ClinicalOutput.initModel(e),pa=X.ClinicalReagentLot.initModel(e),ua=V.ClinicalSampleSetting.initModel(e),da=z.ClinicalTestHistory.initModel(e),ya=J.ColorDisclaimer.initModel(e),_a=$.Config.initModel(e),ma=Y.CrosstalkCorrResult.initModel(e),ca=W.DeltaCtOrganism.initModel(e),Ta=Z.DisabledModule.initModel(e),Na=ee.GenotypingHaplotypeOrganism.initModel(e),ga=te.GenotypingOrganism.initModel(e),fa=ae.GenotypingOrganismResult.initModel(e),Da=le.GraphSetup.initModel(e),Ea=se.GraphSetupAssay.initModel(e),ba=ne.Haplotype.initModel(e),wa=ie.HaplotypeResult.initModel(e),Ia=oe.HaplotypeResultText.initModel(e),Ra=re.Instrument.initModel(e),Oa=pe.LdaAnalyte.initModel(e),ha=ue.LdaCoefficient.initModel(e),Ma=de.LdaOrganism.initModel(e),Ga=ye.LdaOrganismResult.initModel(e),va=_e.LisAssayConfig.initModel(e),Sa=me.LisGenotypingAssayConfig.initModel(e),Aa=ce.LisHaplotypeConfig.initModel(e),Pa=Te.LisOrganismConfig.initModel(e),La=Ne.LisTestOrder.initModel(e),Ca=ge.LisUpload.initModel(e),Ka=fe.MeltGraphSetup.initModel(e),xa=De.MeltPeakResult.initModel(e),ja=Ee.MeltPeakSetting.initModel(e),qa=be.OpticsGraphSetup.initModel(e),ka=we.Organism.initModel(e),Fa=Ie.OrganismBasedOrganismResult.initModel(e),Ba=Re.OrganismResult.initModel(e),Qa=Oe.OrganismResultText.initModel(e),Ua=he.OrganismTarget.initModel(e),Ha=Me.Path.initModel(e),Xa=Ge.Patient.initModel(e),Va=ve.PercentRatioOrganism.initModel(e),za=Se.PercentRatioOrganismResult.initModel(e),Ja=Ae.PercentRatioReagentLot.initModel(e),$a=Pe.PercentRatioResultEvaluator.initModel(e),Ya=Le.PercentRatioSampleSetting.initModel(e),Wa=Ce.PressureGraphSetup.initModel(e),Za=Ke.QcLockoutSetting.initModel(e),el=xe.QcResult.initModel(e),tl=je.QcTest.initModel(e),al=qe.Quant1Organism.initModel(e),ll=ke.Quant1OrganismResult.initModel(e),sl=Fe.Quant1ReagentLot.initModel(e),nl=Be.Quant1Result.initModel(e),il=Qe.Quant1SampleSetting.initModel(e),ol=Ue.QuantUnitSetting.initModel(e),rl=He.RawDataItem.initModel(e),pl=Xe.ReagentLot.initModel(e),ul=Ve.ReportGraphSetting.initModel(e),dl=ze.Reporter.initModel(e),yl=Je.ResultCalculation.initModel(e),_l=$e.ResultEvaluator.initModel(e),ml=Ye.ResultMaskingConfig.initModel(e),cl=We.ResultRuleAnalyte.initModel(e),Tl=Ze.ResultRuleInterpretation.initModel(e),Nl=et.ResultRuleMeltPeak.initModel(e),gl=tt.RunDatum.initModel(e),fl=at.SampleSetting.initModel(e),Dl=lt.SampleType.initModel(e),El=st.SelectedQuantUnitSetting.initModel(e),bl=nt.SemiQuantOrganism.initModel(e),wl=it.SystemLog.initModel(e),Il=ot.TargetBasedOrganism.initModel(e),Rl=rt.TemperatureGraphSetup.initModel(e),Ol=pt.Test.initModel(e),hl=ut.TestBlog.initModel(e),Ml=dt.TestBlogCounter.initModel(e),Gl=yt.TestDatum.initModel(e),vl=_t.TestDataError.initModel(e),Sl=mt.TestError.initModel(e),Al=ct.TestExt.initModel(e),Pl=Tt.TestHistory.initModel(e),Ll=Nt.UltrasonicGraphSetup.initModel(e),Cl=gt.UserExt.initModel(e),Kl=ft.UserLockout.initModel(e),xl=Dt.UserPrivilege.initModel(e),jl=Et.User.initModel(e);return ga.belongsToMany(ba,{as:"haplotype_id_haplotypes",through:Na,foreignKey:"genotyping_organism_id",otherKey:"haplotype_id"}),ba.belongsToMany(ga,{as:"genotyping_organism_id_genotyping_organisms",through:Na,foreignKey:"haplotype_id",otherKey:"genotyping_organism_id"}),a.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(a,{as:"analyte_results",foreignKey:"analyte_id"}),ma.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(ma,{as:"crosstalk_corr_results",foreignKey:"analyte_id"}),Oa.belongsTo(t,{as:"id_analyte",foreignKey:"id"}),t.hasOne(Oa,{as:"lda_analyte",foreignKey:"id"}),ha.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(ha,{as:"lda_coefficients",foreignKey:"analyte_id"}),ja.belongsTo(t,{as:"parent",foreignKey:"parent_id"}),t.hasMany(ja,{as:"melt_peak_settings",foreignKey:"parent_id"}),Ua.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(Ua,{as:"organism_targets",foreignKey:"analyte_id"}),za.belongsTo(t,{as:"calculation_target",foreignKey:"calculation_target_id"}),t.hasMany(za,{as:"percent_ratio_organism_results",foreignKey:"calculation_target_id"}),za.belongsTo(t,{as:"reporting_target",foreignKey:"reporting_target_id"}),t.hasMany(za,{as:"reporting_target_percent_ratio_organism_results",foreignKey:"reporting_target_id"}),$a.belongsTo(t,{as:"calculation_target",foreignKey:"calculation_target_id"}),t.hasMany($a,{as:"percent_ratio_result_evaluators",foreignKey:"calculation_target_id"}),$a.belongsTo(t,{as:"reporting_target",foreignKey:"reporting_target_id"}),t.hasMany($a,{as:"reporting_target_percent_ratio_result_evaluators",foreignKey:"reporting_target_id"}),cl.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(cl,{as:"result_rule_analytes",foreignKey:"analyte_id"}),fl.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(fl,{as:"sample_settings",foreignKey:"analyte_id"}),Gt.belongsTo(a,{as:"parent",foreignKey:"parent_id"}),a.hasMany(Gt,{as:"channel_processed_data_items",foreignKey:"parent_id"}),Pt.belongsTo(a,{as:"id_analyte_result",foreignKey:"id"}),a.hasOne(Pt,{as:"clinical_analyte_result",foreignKey:"id"}),ma.belongsTo(a,{as:"parent",foreignKey:"parent_id"}),a.hasMany(ma,{as:"crosstalk_corr_results",foreignKey:"parent_id"}),xa.belongsTo(a,{as:"parent",foreignKey:"parent_id"}),a.hasMany(xa,{as:"melt_peak_results",foreignKey:"parent_id"}),t.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(t,{as:"analytes",foreignKey:"parent_id"}),bt.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(bt,{as:"assays",foreignKey:"parent_id"}),It.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(It,{as:"assay_exts",foreignKey:"assay_id"}),Ot.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(Ot,{as:"cartridges",foreignKey:"parent_id"}),Lt.belongsTo(bt,{as:"id_assay",foreignKey:"id"}),bt.hasOne(Lt,{as:"clinical_assay",foreignKey:"id"}),Jt.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(Jt,{as:"clinical_factors",foreignKey:"parent_id"}),ya.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(ya,{as:"color_disclaimers",foreignKey:"parent_id"}),Ea.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(Ea,{as:"graph_setup_assays",foreignKey:"assay_id"}),ba.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(ba,{as:"haplotypes",foreignKey:"parent_id"}),va.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(va,{as:"lis_assay_configs",foreignKey:"assay_id"}),ka.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(ka,{as:"organisms",foreignKey:"parent_id"}),pl.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(pl,{as:"reagent_lots",foreignKey:"parent_id"}),ul.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(ul,{as:"report_graph_settings",foreignKey:"assay_id"}),yl.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(yl,{as:"result_calculations",foreignKey:"parent_id"}),Dl.belongsTo(bt,{as:"parent",foreignKey:"parent_id"}),bt.hasMany(Dl,{as:"sample_types",foreignKey:"parent_id"}),El.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(El,{as:"selected_quant_unit_settings",foreignKey:"assay_id"}),Ol.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(Ol,{as:"tests",foreignKey:"assay_id"}),hl.belongsTo(bt,{as:"assay",foreignKey:"assay_id"}),bt.hasMany(hl,{as:"test_blogs",foreignKey:"assay_id"}),Za.belongsTo(It,{as:"parent",foreignKey:"parent_id"}),It.hasMany(Za,{as:"qc_lockout_settings",foreignKey:"parent_id"}),ml.belongsTo(It,{as:"parent",foreignKey:"parent_id"}),It.hasMany(ml,{as:"result_masking_configs",foreignKey:"parent_id"}),ca.belongsTo(Rt,{as:"id_basic_organism",foreignKey:"id"}),Rt.hasOne(ca,{as:"delta_ct_organism",foreignKey:"id"}),bl.belongsTo(Rt,{as:"id_basic_organism",foreignKey:"id"}),Rt.hasOne(bl,{as:"semi_quant_organism",foreignKey:"id"}),wt.belongsTo(Ot,{as:"parent",foreignKey:"parent_id"}),Ot.hasMany(wt,{as:"assay_chambers",foreignKey:"parent_id"}),Ot.belongsTo(ht,{as:"cartridge_type",foreignKey:"cartridge_type_id"}),ht.hasMany(Ot,{as:"cartridges",foreignKey:"cartridge_type_id"}),Mt.belongsTo(ht,{as:"parent",foreignKey:"parent_id"}),ht.hasMany(Mt,{as:"chambers",foreignKey:"parent_id"}),Ha.belongsTo(ht,{as:"parent",foreignKey:"parent_id"}),ht.hasMany(Ha,{as:"paths",foreignKey:"parent_id"}),At.belongsTo(Gt,{as:"id_channel_processed_data_item",foreignKey:"id"}),Gt.hasOne(At,{as:"clinical_analyte_data_item",foreignKey:"id"}),St.belongsTo(vt,{as:"parent",foreignKey:"parent_id"}),vt.hasMany(St,{as:"channel_raw_data_items",foreignKey:"parent_id"}),jt.belongsTo(Ct,{as:"parent",foreignKey:"parent_id"}),Ct.hasMany(jt,{as:"clinical_calculation_rows",foreignKey:"parent_id"}),Vt.belongsTo(Ct,{as:"parent",foreignKey:"parent_id"}),Ct.hasMany(Vt,{as:"clinical_conditional_rows",foreignKey:"parent_id"}),Kt.belongsTo(jt,{as:"parent",foreignKey:"parent_id"}),jt.hasMany(Kt,{as:"clinical_calculation_inputs",foreignKey:"parent_id"}),xt.belongsTo(jt,{as:"parent",foreignKey:"parent_id"}),jt.hasMany(xt,{as:"clinical_calculation_outputs",foreignKey:"parent_id"}),kt.belongsTo(qt,{as:"id_clinical_conditional_action",foreignKey:"id"}),qt.hasOne(kt,{as:"clinical_conditional_action_final_result",foreignKey:"id"}),Ft.belongsTo(qt,{as:"parent",foreignKey:"parent_id"}),qt.hasMany(Ft,{as:"clinical_conditional_action_inputs",foreignKey:"parent_id"}),Bt.belongsTo(qt,{as:"parent",foreignKey:"parent_id"}),qt.hasMany(Bt,{as:"clinical_conditional_action_outputs",foreignKey:"parent_id"}),Ut.belongsTo(Qt,{as:"id_clinical_conditional_cell",foreignKey:"id"}),Qt.hasOne(Ut,{as:"clinical_conditional_cell_boolean",foreignKey:"id"}),Ht.belongsTo(Qt,{as:"parent",foreignKey:"parent_id"}),Qt.hasMany(Ht,{as:"clinical_conditional_cell_inputs",foreignKey:"parent_id"}),Xt.belongsTo(Qt,{as:"id_clinical_conditional_cell",foreignKey:"id"}),Qt.hasOne(Xt,{as:"clinical_conditional_cell_numeric",foreignKey:"id"}),qt.belongsTo(Vt,{as:"parent",foreignKey:"parent_id"}),Vt.hasMany(qt,{as:"clinical_conditional_actions",foreignKey:"parent_id"}),Qt.belongsTo(Vt,{as:"parent",foreignKey:"parent_id"}),Vt.hasMany(Qt,{as:"clinical_conditional_cells",foreignKey:"parent_id"}),$t.belongsTo(Jt,{as:"parent",foreignKey:"parent_id"}),Jt.hasMany($t,{as:"clinical_factor_choice_values",foreignKey:"parent_id"}),Yt.belongsTo(Jt,{as:"id_clinical_factor",foreignKey:"id"}),Jt.hasOne(Yt,{as:"clinical_factor_double",foreignKey:"id"}),Zt.belongsTo(Jt,{as:"id_clinical_factor",foreignKey:"id"}),Jt.hasOne(Zt,{as:"clinical_factor_integer",foreignKey:"id"}),ea.belongsTo(Jt,{as:"id_clinical_factor",foreignKey:"id"}),Jt.hasOne(ea,{as:"clinical_factor_interval",foreignKey:"id"}),ta.belongsTo(Jt,{as:"parent",foreignKey:"parent_id"}),Jt.hasMany(ta,{as:"clinical_factor_interval_ranges",foreignKey:"parent_id"}),aa.belongsTo(Jt,{as:"id_clinical_factor",foreignKey:"id"}),Jt.hasOne(aa,{as:"clinical_factor_text",foreignKey:"id"}),Kt.belongsTo(sa,{as:"id_clinical_input",foreignKey:"id"}),sa.hasOne(Kt,{as:"clinical_calculation_input",foreignKey:"id"}),Ft.belongsTo(sa,{as:"id_clinical_input",foreignKey:"id"}),sa.hasOne(Ft,{as:"clinical_conditional_action_input",foreignKey:"id"}),Ht.belongsTo(sa,{as:"id_clinical_input",foreignKey:"id"}),sa.hasOne(Ht,{as:"clinical_conditional_cell_input",foreignKey:"id"}),Ct.belongsTo(na,{as:"parent",foreignKey:"parent_id"}),na.hasMany(Ct,{as:"clinical_calculations",foreignKey:"parent_id"}),ia.belongsTo(oa,{as:"parent",foreignKey:"parent_id"}),oa.hasMany(ia,{as:"clinical_organism_data_items",foreignKey:"parent_id"}),xt.belongsTo(ra,{as:"id_clinical_output",foreignKey:"id"}),ra.hasOne(xt,{as:"clinical_calculation_output",foreignKey:"id"}),Bt.belongsTo(ra,{as:"id_clinical_output",foreignKey:"id"}),ra.hasOne(Bt,{as:"clinical_conditional_action_output",foreignKey:"id"}),zt.belongsTo(da,{as:"parent",foreignKey:"parent_id"}),da.hasMany(zt,{as:"clinical_data_item_histories",foreignKey:"parent_id"}),Wt.belongsTo(da,{as:"parent",foreignKey:"parent_id"}),da.hasMany(Wt,{as:"clinical_factor_histories",foreignKey:"parent_id"}),Na.belongsTo(ga,{as:"genotyping_organism",foreignKey:"genotyping_organism_id"}),ga.hasMany(Na,{as:"genotyping_haplotype_organisms",foreignKey:"genotyping_organism_id"}),Ea.belongsTo(Da,{as:"graph_setup",foreignKey:"graph_setup_id"}),Da.hasMany(Ea,{as:"graph_setup_assays",foreignKey:"graph_setup_id"}),Ka.belongsTo(Da,{as:"id_graph_setup",foreignKey:"id"}),Da.hasOne(Ka,{as:"melt_graph_setup",foreignKey:"id"}),qa.belongsTo(Da,{as:"id_graph_setup",foreignKey:"id"}),Da.hasOne(qa,{as:"optics_graph_setup",foreignKey:"id"}),Wa.belongsTo(Da,{as:"id_graph_setup",foreignKey:"id"}),Da.hasOne(Wa,{as:"pressure_graph_setup",foreignKey:"id"}),Rl.belongsTo(Da,{as:"id_graph_setup",foreignKey:"id"}),Da.hasOne(Rl,{as:"temperature_graph_setup",foreignKey:"id"}),Ll.belongsTo(Da,{as:"id_graph_setup",foreignKey:"id"}),Da.hasOne(Ll,{as:"ultrasonic_graph_setup",foreignKey:"id"}),Na.belongsTo(ba,{as:"haplotype",foreignKey:"haplotype_id"}),ba.hasMany(Na,{as:"genotyping_haplotype_organisms",foreignKey:"haplotype_id"}),wa.belongsTo(ba,{as:"haplotype",foreignKey:"haplotype_id"}),ba.hasMany(wa,{as:"haplotype_results",foreignKey:"haplotype_id"}),Ia.belongsTo(ba,{as:"parent",foreignKey:"parent_id"}),ba.hasMany(Ia,{as:"haplotype_result_texts",foreignKey:"parent_id"}),Aa.belongsTo(ba,{as:"haplotype",foreignKey:"haplotype_id"}),ba.hasMany(Aa,{as:"lis_haplotype_configs",foreignKey:"haplotype_id"}),ha.belongsTo(Ma,{as:"parent",foreignKey:"parent_id"}),Ma.hasMany(ha,{as:"lda_coefficients",foreignKey:"parent_id"}),Sa.belongsTo(va,{as:"id_lis_assay_config",foreignKey:"id"}),va.hasOne(Sa,{as:"lis_genotyping_assay_config",foreignKey:"id"}),Ca.belongsTo(La,{as:"test_order",foreignKey:"test_order_id"}),La.hasMany(Ca,{as:"lis_uploads",foreignKey:"test_order_id"}),Rt.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(Rt,{as:"basic_organism",foreignKey:"id"}),na.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(na,{as:"clinical_organism",foreignKey:"id"}),ga.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(ga,{as:"genotyping_organism",foreignKey:"id"}),Ma.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(Ma,{as:"lda_organism",foreignKey:"id"}),Pa.belongsTo(ka,{as:"organism",foreignKey:"organism_id"}),ka.hasMany(Pa,{as:"lis_organism_configs",foreignKey:"organism_id"}),Ba.belongsTo(ka,{as:"organism",foreignKey:"organism_id"}),ka.hasMany(Ba,{as:"organism_results",foreignKey:"organism_id"}),Qa.belongsTo(ka,{as:"parent",foreignKey:"parent_id"}),ka.hasMany(Qa,{as:"organism_result_texts",foreignKey:"parent_id"}),Ua.belongsTo(ka,{as:"parent",foreignKey:"parent_id"}),ka.hasMany(Ua,{as:"organism_targets",foreignKey:"parent_id"}),Va.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(Va,{as:"percent_ratio_organism",foreignKey:"id"}),al.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(al,{as:"quant1_organism",foreignKey:"id"}),_l.belongsTo(ka,{as:"parent",foreignKey:"parent_id"}),ka.hasMany(_l,{as:"result_evaluators",foreignKey:"parent_id"}),ml.belongsTo(ka,{as:"organism",foreignKey:"organism_id"}),ka.hasMany(ml,{as:"result_masking_configs",foreignKey:"organism_id"}),Il.belongsTo(ka,{as:"id_organism",foreignKey:"id"}),ka.hasOne(Il,{as:"target_based_organism",foreignKey:"id"}),oa.belongsTo(Ba,{as:"id_organism_result",foreignKey:"id"}),Ba.hasOne(oa,{as:"clinical_organism_result",foreignKey:"id"}),fa.belongsTo(Ba,{as:"id_organism_result",foreignKey:"id"}),Ba.hasOne(fa,{as:"genotyping_organism_result",foreignKey:"id"}),Ga.belongsTo(Ba,{as:"id_organism_result",foreignKey:"id"}),Ba.hasOne(Ga,{as:"lda_organism_result",foreignKey:"id"}),Fa.belongsTo(Ba,{as:"id_organism_result",foreignKey:"id"}),Ba.hasOne(Fa,{as:"organism_based_organism_result",foreignKey:"id"}),za.belongsTo(Ba,{as:"id_organism_result",foreignKey:"id"}),Ba.hasOne(za,{as:"percent_ratio_organism_result",foreignKey:"id"}),ll.belongsTo(Ba,{as:"id_organism_result",foreignKey:"id"}),Ba.hasOne(ll,{as:"quant1_organism_result",foreignKey:"id"}),La.belongsTo(Xa,{as:"patient",foreignKey:"patient_id"}),Xa.hasMany(La,{as:"lis_test_orders",foreignKey:"patient_id"}),Ol.belongsTo(Xa,{as:"patient",foreignKey:"patient_id"}),Xa.hasMany(Ol,{as:"tests",foreignKey:"patient_id"}),tl.belongsTo(el,{as:"parent",foreignKey:"parent_id"}),el.hasMany(tl,{as:"qc_tests",foreignKey:"parent_id"}),ol.belongsTo(al,{as:"parent",foreignKey:"parent_id"}),al.hasMany(ol,{as:"quant_unit_settings",foreignKey:"parent_id"}),nl.belongsTo(ll,{as:"parent",foreignKey:"parent_id"}),ll.hasMany(nl,{as:"quant1_results",foreignKey:"parent_id"}),nl.belongsTo(ol,{as:"quant_unit_setting",foreignKey:"quant_unit_setting_id"}),ol.hasMany(nl,{as:"quant1_results",foreignKey:"quant_unit_setting_id"}),pa.belongsTo(pl,{as:"id_reagent_lot",foreignKey:"id"}),pl.hasOne(pa,{as:"clinical_reagent_lot",foreignKey:"id"}),Ja.belongsTo(pl,{as:"id_reagent_lot",foreignKey:"id"}),pl.hasOne(Ja,{as:"percent_ratio_reagent_lot",foreignKey:"id"}),sl.belongsTo(pl,{as:"id_reagent_lot",foreignKey:"id"}),pl.hasOne(sl,{as:"quant1_reagent_lot",foreignKey:"id"}),fl.belongsTo(pl,{as:"parent",foreignKey:"parent_id"}),pl.hasMany(fl,{as:"sample_settings",foreignKey:"parent_id"}),cl.belongsTo(_l,{as:"parent",foreignKey:"parent_id"}),_l.hasMany(cl,{as:"result_rule_analytes",foreignKey:"parent_id"}),Tl.belongsTo(cl,{as:"id_result_rule_analyte",foreignKey:"id"}),cl.hasOne(Tl,{as:"result_rule_interpretation",foreignKey:"id"}),Nl.belongsTo(cl,{as:"id_result_rule_analyte",foreignKey:"id"}),cl.hasOne(Nl,{as:"result_rule_melt_peak",foreignKey:"id"}),ua.belongsTo(fl,{as:"id_sample_setting",foreignKey:"id"}),fl.hasOne(ua,{as:"clinical_sample_setting",foreignKey:"id"}),Ya.belongsTo(fl,{as:"id_sample_setting",foreignKey:"id"}),fl.hasOne(Ya,{as:"percent_ratio_sample_setting",foreignKey:"id"}),il.belongsTo(fl,{as:"id_sample_setting",foreignKey:"id"}),fl.hasOne(il,{as:"quant1_sample_setting",foreignKey:"id"}),a.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasMany(a,{as:"analyte_results",foreignKey:"parent_id"}),la.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasMany(la,{as:"clinical_factor_values",foreignKey:"parent_id"}),wa.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasMany(wa,{as:"haplotype_results",foreignKey:"parent_id"}),La.belongsTo(Ol,{as:"test",foreignKey:"test_id"}),Ol.hasMany(La,{as:"lis_test_orders",foreignKey:"test_id"}),Ca.belongsTo(Ol,{as:"test",foreignKey:"test_id"}),Ol.hasMany(Ca,{as:"lis_uploads",foreignKey:"test_id"}),Ba.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasMany(Ba,{as:"organism_results",foreignKey:"parent_id"}),Ol.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.belongsTo(jl,{as:"user",foreignKey:"user_login_name",targetKey:"login_name"}),Ol.hasMany(Ol,{as:"tests",foreignKey:"parent_id"}),Gl.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasOne(Gl,{as:"test_data",foreignKey:"parent_id"}),Sl.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasMany(Sl,{as:"test_errors",foreignKey:"parent_id"}),Al.belongsTo(Ol,{as:"id_test",foreignKey:"id"}),Ol.hasOne(Al,{as:"test_ext",foreignKey:"id"}),Pl.belongsTo(Ol,{as:"parent",foreignKey:"parent_id"}),Ol.hasMany(Pl,{as:"test_histories",foreignKey:"parent_id"}),Ml.belongsTo(hl,{as:"test_blog",foreignKey:"test_blog_id"}),hl.hasMany(Ml,{as:"test_blog_counters",foreignKey:"test_blog_id"}),vt.belongsTo(Gl,{as:"parent",foreignKey:"parent_id"}),Gl.hasMany(vt,{as:"channel_raw_data",foreignKey:"parent_id"}),rl.belongsTo(Gl,{as:"parent",foreignKey:"parent_id"}),Gl.hasMany(rl,{as:"raw_data_items",foreignKey:"parent_id"}),gl.belongsTo(Gl,{as:"test_datum",foreignKey:"test_data_id"}),Gl.hasOne(gl,{as:"run_data",foreignKey:"test_data_id"}),vl.belongsTo(Gl,{as:"parent",foreignKey:"parent_id"}),Gl.hasMany(vl,{as:"test_data_errors",foreignKey:"parent_id"}),da.belongsTo(Pl,{as:"id_test_history",foreignKey:"id"}),Pl.hasOne(da,{as:"clinical_test_history",foreignKey:"id"}),Cl.belongsTo(jl,{as:"id_user",foreignKey:"id"}),jl.hasOne(Cl,{as:"user_ext",foreignKey:"id"}),{Analyte:t,AnalyteResult:a,Assay:bt,AssayChamber:wt,AssayExt:It,BasicOrganism:Rt,Cartridge:Ot,CartridgeType:ht,Chamber:Mt,ChannelProcessedDataItem:Gt,ChannelRawDatum:vt,ChannelRawDataItem:St,ClinicalAnalyteDataItem:At,ClinicalAnalyteResult:Pt,ClinicalAssay:Lt,ClinicalCalculation:Ct,ClinicalCalculationInput:Kt,ClinicalCalculationOutput:xt,ClinicalCalculationRow:jt,ClinicalConditionalAction:qt,ClinicalConditionalActionFinalResult:kt,ClinicalConditionalActionInput:Ft,ClinicalConditionalActionOutput:Bt,ClinicalConditionalCell:Qt,ClinicalConditionalCellBoolean:Ut,ClinicalConditionalCellInput:Ht,ClinicalConditionalCellNumeric:Xt,ClinicalConditionalRow:Vt,ClinicalDataItemHistory:zt,ClinicalFactor:Jt,ClinicalFactorChoiceValue:$t,ClinicalFactorDouble:Yt,ClinicalFactorHistory:Wt,ClinicalFactorInteger:Zt,ClinicalFactorInterval:ea,ClinicalFactorIntervalRange:ta,ClinicalFactorText:aa,ClinicalFactorValue:la,ClinicalInput:sa,ClinicalOrganism:na,ClinicalOrganismDataItem:ia,ClinicalOrganismResult:oa,ClinicalOutput:ra,ClinicalReagentLot:pa,ClinicalSampleSetting:ua,ClinicalTestHistory:da,ColorDisclaimer:ya,Config:_a,CrosstalkCorrResult:ma,DeltaCtOrganism:ca,DisabledModule:Ta,GenotypingHaplotypeOrganism:Na,GenotypingOrganism:ga,GenotypingOrganismResult:fa,GraphSetup:Da,GraphSetupAssay:Ea,Haplotype:ba,HaplotypeResult:wa,HaplotypeResultText:Ia,Instrument:Ra,LdaAnalyte:Oa,LdaCoefficient:ha,LdaOrganism:Ma,LdaOrganismResult:Ga,LisAssayConfig:va,LisGenotypingAssayConfig:Sa,LisHaplotypeConfig:Aa,LisOrganismConfig:Pa,LisTestOrder:La,LisUpload:Ca,MeltGraphSetup:Ka,MeltPeakResult:xa,MeltPeakSetting:ja,OpticsGraphSetup:qa,Organism:ka,OrganismBasedOrganismResult:Fa,OrganismResult:Ba,OrganismResultText:Qa,OrganismTarget:Ua,Path:Ha,Patient:Xa,PercentRatioOrganism:Va,PercentRatioOrganismResult:za,PercentRatioReagentLot:Ja,PercentRatioResultEvaluator:$a,PercentRatioSampleSetting:Ya,PressureGraphSetup:Wa,QcLockoutSetting:Za,QcResult:el,QcTest:tl,Quant1Organism:al,Quant1OrganismResult:ll,Quant1ReagentLot:sl,Quant1Result:nl,Quant1SampleSetting:il,QuantUnitSetting:ol,RawDataItem:rl,ReagentLot:pl,ReportGraphSetting:ul,Reporter:dl,ResultCalculation:yl,ResultEvaluator:_l,ResultMaskingConfig:ml,ResultRuleAnalyte:cl,ResultRuleInterpretation:Tl,ResultRuleMeltPeak:Nl,RunDatum:gl,SampleSetting:fl,SampleType:Dl,SelectedQuantUnitSetting:El,SemiQuantOrganism:bl,SystemLog:wl,TargetBasedOrganism:Il,TemperatureGraphSetup:Rl,Test:Ol,TestBlog:hl,TestBlogCounter:Ml,TestDatum:Gl,TestDataError:vl,TestError:Sl,TestExt:Al,TestHistory:Pl,UltrasonicGraphSetup:Ll,UserExt:Cl,UserLockout:Kl,UserPrivilege:xl,User:jl}}},5160:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Instrument=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Instrument",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},mac_address:{type:l.DataTypes.BLOB,allowNull:!0},serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},letter_offset:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"instrument",schema:"dbo",timestamps:!1,indexes:[{name:"PK__instrume__3213E83F6675BC96",unique:!0,fields:[{name:"id"}]},{name:"UX_instrument_letteroffset",unique:!0,fields:[{name:"letter_offset"}]},{name:"UX_instrument_macaddress",unique:!0,fields:[{name:"mac_address"}]},{name:"UX_instrument_serialnumber",unique:!0,fields:[{name:"serial_number"}]}]})}}t.Instrument=s},1608:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaAnalyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaAnalyte",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"analyte",key:"id"}},cycle_if_no_ct:{type:l.DataTypes.INTEGER,allowNull:!1},min_ct_req_pass_controls:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"lda_analyte",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_anal__3213E83F8B6778C1",unique:!0,fields:[{name:"id"}]}]})}}t.LdaAnalyte=s},7176:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaCoefficient=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaCoefficient",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"lda_organism",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!1},delta_ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"lda_coefficient",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_coef__3213E83F223CDD5C",unique:!0,fields:[{name:"id"}]}]})}}t.LdaCoefficient=s},7853:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},lda_total:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"lda_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_orga__3213E83FD28170E9",unique:!0,fields:[{name:"id"}]}]})}}t.LdaOrganismResult=s},8529:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},cutoff:{type:l.DataTypes.FLOAT,allowNull:!1},intercept:{type:l.DataTypes.FLOAT,allowNull:!1},max_valid_range:{type:l.DataTypes.FLOAT,allowNull:!1},min_valid_range:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"lda_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_orga__3213E83F9FD9F26C",unique:!0,fields:[{name:"id"}]}]})}}t.LdaOrganism=s},625:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisAssayConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisAssayConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},test_code:{type:l.DataTypes.STRING(15),allowNull:!0},test_code_enabled:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"lis_assay_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_assa__3213E83FFE29AC11",unique:!0,fields:[{name:"id"}]}]})}}t.LisAssayConfig=s},6465:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisGenotypingAssayConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisGenotypingAssayConfig",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"lis_assay_config",key:"id"}}},{tableName:"lis_genotyping_assay_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_geno__3213E83F51EF8137",unique:!0,fields:[{name:"id"}]}]})}}t.LisGenotypingAssayConfig=s},7946:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisHaplotypeConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisHaplotypeConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"haplotype",key:"id"}},result_code:{type:l.DataTypes.STRING(15),allowNull:!0}},{tableName:"lis_haplotype_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_hapl__3213E83F34DD1BA3",unique:!0,fields:[{name:"id"}]}]})}}t.LisHaplotypeConfig=s},672:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisOrganismConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisOrganismConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},result_code:{type:l.DataTypes.STRING(15),allowNull:!0}},{tableName:"lis_organism_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_orga__3213E83F4812458C",unique:!0,fields:[{name:"id"}]}]})}}t.LisOrganismConfig=s},2938:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisTestOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisTestOrder",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},cartridge_id:{type:l.DataTypes.STRING(25),allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},host_test_code:{type:l.DataTypes.STRING(15),allowNull:!0},instrument_specific_sample_id:{type:l.DataTypes.STRING(32),allowNull:!0},order_status:{type:l.DataTypes.INTEGER,allowNull:!1},patient_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"patient",key:"id"}},priority:{type:l.DataTypes.INTEGER,allowNull:!1},sample_id:{type:l.DataTypes.STRING(25),allowNull:!0},sample_type:{type:l.DataTypes.STRING(5),allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test",key:"id"}}},{tableName:"lis_test_order",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_test__3213E83F7178DECE",unique:!0,fields:[{name:"id"}]},{name:"UX_listestorder_testid",unique:!0,fields:[{name:"test_id"}]}]})}}t.LisTestOrder=s},6522:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisUpload=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisUpload",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},test_order_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"lis_test_order",key:"id"}},upload_message_id:{type:l.DataTypes.STRING(64),allowNull:!0},upload_status:{type:l.DataTypes.INTEGER,allowNull:!1},sample_priority:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"lis_upload",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_uplo__3213E83F638B691C",unique:!0,fields:[{name:"id"}]},{name:"UX_lis_upload_test_id",unique:!0,fields:[{name:"test_id"}]}]})}}t.LisUpload=s},6611:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltGraphSetup",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"graph_setup",key:"id"}},show_raw:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_normalized:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_1st_derivative:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_baseline:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_delta:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_temperature:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_2nd_derivative:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_zeroLine:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_threshold:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_melt_peaks:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"melt_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__melt_gra__3213E83FD58D0244",unique:!0,fields:[{name:"id"}]}]})}}t.MeltGraphSetup=s},227:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte_result",key:"id"}},peak_height:{type:l.DataTypes.FLOAT,allowNull:!1},peak_index:{type:l.DataTypes.INTEGER,allowNull:!1},peak_temperature:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"melt_peak_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_melt_peak_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__melt_pea__3213E83E6D358FD1",unique:!0,fields:[{name:"id"}]}]})}}t.MeltPeakResult=s},9073:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte",key:"id"}},baseline_look_back:{type:l.DataTypes.FLOAT,allowNull:!0},baseline_num_points:{type:l.DataTypes.INTEGER,allowNull:!0},baseline_start_temp:{type:l.DataTypes.FLOAT,allowNull:!0},peak_range_max:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_min:{type:l.DataTypes.FLOAT,allowNull:!1},peak_threshold:{type:l.DataTypes.FLOAT,allowNull:!1},points_around_peak:{type:l.DataTypes.INTEGER,allowNull:!0},reportable_melt_type:{type:l.DataTypes.INTEGER,allowNull:!0},slope_positive:{type:l.DataTypes.BOOLEAN,allowNull:!1},valley_threshold:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"melt_peak_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__melt_pea__3213E83FF9DEB820",unique:!0,fields:[{name:"id"}]},{name:"UX_meltpeaksetting_parentid",unique:!0,fields:[{name:"parent_id"}]}]})}}t.MeltPeakSetting=s},8396:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OpticsGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OpticsGraphSetup",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"graph_setup",key:"id"}},show_primary:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_raw:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_curve_fit:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_res_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_normalized:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_2nd_derivative:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_threshold:{type:l.DataTypes.BOOLEAN,allowNull:!0},axes_type:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"optics_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__optics_g__3213E83FFFECD845",unique:!0,fields:[{name:"id"}]}]})}}t.OpticsGraphSetup=s},7029:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismBasedOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismBasedOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},semi_quant_level:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"organism_based_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83F11027669",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismBasedOrganismResult=s},2677:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultText",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(8),allowNull:!1},result_text:{type:l.DataTypes.INTEGER,allowNull:!1},text_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"organism_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83F9D7E3B70",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismResultText=s},4701:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"organism",key:"id"}},result_text:{type:l.DataTypes.INTEGER,allowNull:!0},result_color:{type:l.DataTypes.INTEGER,allowNull:!0},is_result_invalid:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_result_masked:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_organism_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__organism__3213E83EFB5E0D40",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismResult=s},8456:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismTarget=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismTarget",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}}},{tableName:"organism_target",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83FBF8598E6",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismTarget=s},848:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Organism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Organism",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},name:{type:l.DataTypes.STRING(32),allowNull:!1},organism_index:{type:l.DataTypes.INTEGER,allowNull:!1},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83F26F926ED",unique:!0,fields:[{name:"id"}]}]})}}t.Organism=s},7762:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Path=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Path",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge_type",key:"id"}},angular_offset:{type:l.DataTypes.FLOAT,allowNull:!1},chamber_number:{type:l.DataTypes.INTEGER,allowNull:!0},is_block:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!1},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"path",schema:"dbo",timestamps:!1,indexes:[{name:"PK__path__3213E83F240FBBF3",unique:!0,fields:[{name:"id"}]}]})}}t.Path=s},2157:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Patient=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Patient",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},gx_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},practice_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},family_name:{type:l.DataTypes.STRING(1552),allowNull:!0},given_name:{type:l.DataTypes.STRING(240),allowNull:!0},middle_name:{type:l.DataTypes.STRING(240),allowNull:!0},date_of_birth:{type:l.DataTypes.STRING(96),allowNull:!0},gender:{type:l.DataTypes.STRING(128),allowNull:!0},ethnicity:{type:l.DataTypes.STRING(512),allowNull:!0},postal_code:{type:l.DataTypes.STRING(96),allowNull:!0}},{tableName:"patient",schema:"dbo",timestamps:!1,indexes:[{name:"PK__patient__3213E83F541351BB",unique:!0,fields:[{name:"id"}]}]})}}t.Patient=s},1604:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},ratio_percent:{type:l.DataTypes.FLOAT,allowNull:!0},log_transform:{type:l.DataTypes.FLOAT,allowNull:!0},reporting_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},calculation_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},detailed_result:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"percent_ratio_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83FC6D34960",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioOrganismResult=s},8967:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},dynamic_range_max:{type:l.DataTypes.FLOAT,allowNull:!1},dynamic_range_min:{type:l.DataTypes.FLOAT,allowNull:!1},lod_loq:{type:l.DataTypes.FLOAT,allowNull:!1},log_transform_type:{type:l.DataTypes.INTEGER,allowNull:!1},units:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"percent_ratio_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F1369279B",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioOrganism=s},7189:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioReagentLot",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"reagent_lot",key:"id"}}},{tableName:"percent_ratio_reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83FAC63EA04",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioReagentLot=s},8524:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioResultEvaluator=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioResultEvaluator",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},calculation_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},reporting_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}}},{tableName:"percent_ratio_result_evaluator",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83FC91E78DE",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioResultEvaluator=s},7287:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioSampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioSampleSetting",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"sample_setting",key:"id"}},delta_ct_efficiency:{type:l.DataTypes.FLOAT,allowNull:!0},scaling_factor:{type:l.DataTypes.DECIMAL(5,2),allowNull:!0}},{tableName:"percent_ratio_sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F5A46BC97",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioSampleSetting=s},459:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PressureGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PressureGraphSetup",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"graph_setup",key:"id"}},show_assay_threshold:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_system_threshold:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"pressure_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__pressure__3213E83F32143A0B",unique:!0,fields:[{name:"id"}]}]})}}t.PressureGraphSetup=s},5503:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QcLockoutSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QcLockoutSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay_ext",key:"id"}},qc_enabled:{type:l.DataTypes.BOOLEAN,allowNull:!1},qc_on_lot:{type:l.DataTypes.BOOLEAN,allowNull:!1},frequency:{type:l.DataTypes.INTEGER,allowNull:!1},display:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"qc_lockout_settings",schema:"dbo",timestamps:!1,indexes:[{name:"PK__qc_locko__3213E83F6DF99E8C",unique:!0,fields:[{name:"id"}]}]})}}t.QcLockoutSetting=s},2190:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QcResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QcResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_name:{type:l.DataTypes.STRING(32),allowNull:!1},assay_version:{type:l.DataTypes.INTEGER,allowNull:!1},rgt_lot_id:{type:l.DataTypes.STRING(5),allowNull:!0},due_date:{type:l.DataTypes.DATE,allowNull:!1},completion_date:{type:l.DataTypes.DATE,allowNull:!0}},{tableName:"qc_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__qc_resul__3213E83FC6AB8A0D",unique:!0,fields:[{name:"id"}]}]})}}t.QcResult=s},4230:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QcTest=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QcTest",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"qc_result",key:"id"}},test_id:{type:l.DataTypes.INTEGER,allowNull:!0},status:{type:l.DataTypes.INTEGER,allowNull:!1},end_time:{type:l.DataTypes.DATE,allowNull:!0},is_pos:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"qc_test",schema:"dbo",timestamps:!1,indexes:[{name:"PK__qc_test__3213E83FADFD5E80",unique:!0,fields:[{name:"id"}]}]})}}t.QcTest=s},6774:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1OrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1OrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}}},{tableName:"quant1_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_o__3213E83F56AEF9A5",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1OrganismResult=s},7284:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1Organism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1Organism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},max_quantitative_delta:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"quant1_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_o__3213E83F0EE566DB",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1Organism=s},8925:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1ReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1ReagentLot",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"reagent_lot",key:"id"}}},{tableName:"quant1_reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_r__3213E83F68A59646",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1ReagentLot=s},7795:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1Result=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1Result",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"quant1_organism_result",key:"id"}},quantitative_result:{type:l.DataTypes.FLOAT,allowNull:!0},quant_unit_setting_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"quant_unit_setting",key:"id"}},result_abnormal_flag:{type:l.DataTypes.STRING(5),allowNull:!0}},{tableName:"quant1_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_quant1_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__quant1_r__3213E83E7286B386",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1Result=s},6977:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1SampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1SampleSetting",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"sample_setting",key:"id"}},e0:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},e1:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},e2:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0}},{tableName:"quant1_sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_s__3213E83FFA6CD02F",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1SampleSetting=s},589:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QuantUnitSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QuantUnitSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"quant1_organism",key:"id"}},conversion_factor:{type:l.DataTypes.FLOAT,allowNull:!1},display_log_value:{type:l.DataTypes.BOOLEAN,allowNull:!1},lower_limit:{type:l.DataTypes.FLOAT,allowNull:!1},position:{type:l.DataTypes.INTEGER,allowNull:!1},units:{type:l.DataTypes.INTEGER,allowNull:!1},upper_limit:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"quant_unit_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant_un__3213E83F6AA4ACAC",unique:!0,fields:[{name:"id"}]}]})}}t.QuantUnitSetting=s},2132:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RawDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("RawDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test_data",key:"id"}},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0},timestamps:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"raw_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_raw_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__raw_data__3213E83E6F5B3EAF",unique:!0,fields:[{name:"id"}]}]})}}t.RawDataItem=s},9092:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ReagentLot",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},creation_time:{type:l.DataTypes.DATE,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!1},reagent_lot_number:{type:l.DataTypes.STRING(3),allowNull:!1}},{tableName:"reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__reagent___3213E83FE1FD856F",unique:!0,fields:[{name:"id"}]}]})}}t.ReagentLot=s},5076:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ReportGraphSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ReportGraphSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}},graph_type:{type:l.DataTypes.INTEGER,allowNull:!0},param_key:{type:l.DataTypes.STRING(64),allowNull:!1},param_val:{type:l.DataTypes.STRING(512),allowNull:!0}},{tableName:"report_graph_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__report_g__3213E83F88AEEA20",unique:!0,fields:[{name:"id"}]}]})}}t.ReportGraphSetting=s},617:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Reporter=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Reporter",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},concentration:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(12),allowNull:!1}},{tableName:"reporter",schema:"dbo",timestamps:!1,indexes:[{name:"PK__reporter__3213E83FE02BD9EF",unique:!0,fields:[{name:"id"}]},{name:"UX_reporter_name",unique:!0,fields:[{name:"name"}]}]})}}t.Reporter=s},3513:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultCalculation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultCalculation",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},chain_name:{type:l.DataTypes.STRING(64),allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1}},{tableName:"result_calculation",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_c__3213E83F401E0DFE",unique:!0,fields:[{name:"id"}]}]})}}t.ResultCalculation=s},7014:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultEvaluator=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultEvaluator",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},evaluator_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_text:{type:l.DataTypes.INTEGER,allowNull:!1},rule_anded:{type:l.DataTypes.BOOLEAN,allowNull:!1},text_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"result_evaluator",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_e__3213E83FE1614926",unique:!0,fields:[{name:"id"}]}]})}}t.ResultEvaluator=s},8770:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultMaskingConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultMaskingConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay_ext",key:"id"}},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}}},{tableName:"result_masking_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_m__3213E83FCE36E124",unique:!0,fields:[{name:"id"}]}]})}}t.ResultMaskingConfig=s},6430:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultRuleAnalyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultRuleAnalyte",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"result_evaluator",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},rule_index:{type:l.DataTypes.INTEGER,allowNull:!1},rule_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"result_rule_analyte",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_r__3213E83FD2CA5D7B",unique:!0,fields:[{name:"id"}]}]})}}t.ResultRuleAnalyte=s},872:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultRuleInterpretation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultRuleInterpretation",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"result_rule_analyte",key:"id"}},interpretation:{type:l.DataTypes.INTEGER,allowNull:!1},pass_on_equals:{type:l.DataTypes.BOOLEAN,allowNull:!1},reasons:{type:l.DataTypes.STRING(50),allowNull:!0}},{tableName:"result_rule_interpretation",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_r__3213E83FF6E9FEAE",unique:!0,fields:[{name:"id"}]}]})}}t.ResultRuleInterpretation=s},3051:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultRuleMeltPeak=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultRuleMeltPeak",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"result_rule_analyte",key:"id"}},pass_on_peak:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"result_rule_melt_peak",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_r__3213E83F6989F9D8",unique:!0,fields:[{name:"id"}]}]})}}t.ResultRuleMeltPeak=s},2658:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RunDatum=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("RunDatum",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_data_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test_data",key:"id"}},datagram_format:{type:l.DataTypes.INTEGER,allowNull:!0},datagrams:{type:l.DataTypes.BLOB,allowNull:!0},end_time:{type:l.DataTypes.DATE,allowNull:!0},fw_version:{type:l.DataTypes.STRING(12),allowNull:!0},icore_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},site_name:{type:l.DataTypes.STRING(512),allowNull:!0},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},start_time:{type:l.DataTypes.DATE,allowNull:!0},state:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"run_data",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_run_data_test_data_id",fields:[{name:"test_data_id"}]},{name:"PK__run_data__3213E83E567DD4BC",unique:!0,fields:[{name:"id"}]},{name:"UX_rundata_testdataid",unique:!0,fields:[{name:"test_data_id"}]}]})}}t.RunDatum=s},591:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"reagent_lot",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},ct_threshold_value:{type:l.DataTypes.FLOAT,allowNull:!1},end_pt_threshold:{type:l.DataTypes.INTEGER,allowNull:!1},min_delta_ct:{type:l.DataTypes.FLOAT,allowNull:!1},normalization_factor:{type:l.DataTypes.INTEGER,allowNull:!1},peak_height_min:{type:l.DataTypes.FLOAT,allowNull:!1},probe_chk_delta:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_high_max:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_high_min:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_low_max:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_low_min:{type:l.DataTypes.INTEGER,allowNull:!1},use_endpoint:{type:l.DataTypes.BOOLEAN,allowNull:!1},use_min_delta_ct:{type:l.DataTypes.BOOLEAN,allowNull:!1},valid_max:{type:l.DataTypes.DECIMAL(5,1),allowNull:!1},valid_min:{type:l.DataTypes.DECIMAL(5,1),allowNull:!1}},{tableName:"sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__sample_s__3213E83F5CA8F508",unique:!0,fields:[{name:"id"}]}]})}}t.SampleSetting=s},7919:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleType=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleType",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},sample_type_key:{type:l.DataTypes.STRING(5),allowNull:!1}},{tableName:"sample_type",schema:"dbo",timestamps:!1,indexes:[{name:"PK__sample_t__3213E83F677484AC",unique:!0,fields:[{name:"id"}]}]})}}t.SampleType=s},7167:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SelectedQuantUnitSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SelectedQuantUnitSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},units:{type:l.DataTypes.INTEGER,allowNull:!1},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}}},{tableName:"selected_quant_unit_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__selected__3213E83FD2197D49",unique:!0,fields:[{name:"id"}]}]})}}t.SelectedQuantUnitSetting=s},7020:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SemiQuantOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SemiQuantOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"basic_organism",key:"id"}},delta_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1},low_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1},medium_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1},replaced_result_color:{type:l.DataTypes.INTEGER,allowNull:!1},replaced_result_text:{type:l.DataTypes.INTEGER,allowNull:!1},semi_quant_result_text:{type:l.DataTypes.INTEGER,allowNull:!1},very_low_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"semi_quant_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__semi_qua__3213E83FD6EC71C5",unique:!0,fields:[{name:"id"}]}]})}}t.SemiQuantOrganism=s},4617:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SystemLog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SystemLog",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},details:{type:l.DataTypes.STRING(512),allowNull:!0},error_code:{type:l.DataTypes.INTEGER,allowNull:!0},error_type:{type:l.DataTypes.INTEGER,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!1},site_name:{type:l.DataTypes.STRING(512),allowNull:!0},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0}},{tableName:"system_log",schema:"dbo",timestamps:!1,indexes:[{name:"PK__system_l__3213E83F2F74C3E3",unique:!0,fields:[{name:"id"}]}]})}}t.SystemLog=s},922:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TargetBasedOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TargetBasedOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}}},{tableName:"target_based_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__target_b__3213E83FC9C8466E",unique:!0,fields:[{name:"id"}]}]})}}t.TargetBasedOrganism=s},7571:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TemperatureGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TemperatureGraphSetup",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"graph_setup",key:"id"}},show_sample:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_heater:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_target:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"temperature_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__temperat__3213E83F0FBD7F66",unique:!0,fields:[{name:"id"}]}]})}}t.TemperatureGraphSetup=s},248:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlogCounter=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlogCounter",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_blog_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test_blog",key:"id"}},date_text:{type:l.DataTypes.STRING(8),allowNull:!0},test_count:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"test_blog_counter",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test_blo__3213E83FC91A3CB2",unique:!0,fields:[{name:"id"}]},{name:"UX_testblogcounter_testblogid_datetext",unique:!0,fields:[{name:"test_blog_id"},{name:"date_text"}]}]})}}t.TestBlogCounter=s},4715:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlog",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}}},{tableName:"test_blog",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test_blo__3213E83F18287316",unique:!0,fields:[{name:"id"}]},{name:"UX_testblog_assayid",unique:!0,fields:[{name:"assay_id"}]}]})}}t.TestBlog=s},196:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestDataError=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestDataError",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test_data",key:"id"}},code:{type:l.DataTypes.INTEGER,allowNull:!1},details:{type:l.DataTypes.STRING(512),allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!1},param1:{type:l.DataTypes.FLOAT,allowNull:!0},param2:{type:l.DataTypes.FLOAT,allowNull:!0},param3:{type:l.DataTypes.FLOAT,allowNull:!0},param4:{type:l.DataTypes.FLOAT,allowNull:!0},severity:{type:l.DataTypes.INTEGER,allowNull:!1},site_state:{type:l.DataTypes.INTEGER,allowNull:!1},step_number:{type:l.DataTypes.INTEGER,allowNull:!1},text_param:{type:l.DataTypes.STRING(64),allowNull:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_data_error",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_data_error_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_dat__3213E83E78622473",unique:!0,fields:[{name:"id"}]}]})}}t.TestDataError=s},4309:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestDatum=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestDatum",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},error_status:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_data",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_data_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_dat__3213E83E31E5BA7A",unique:!0,fields:[{name:"id"}]},{name:"UX_testdata_parentid",unique:!0,fields:[{name:"parent_id"}]}]})}}t.TestDatum=s},1591:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestError=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestError",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},code:{type:l.DataTypes.INTEGER,allowNull:!1},details:{type:l.DataTypes.STRING(512),allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!1},param1:{type:l.DataTypes.FLOAT,allowNull:!0},param2:{type:l.DataTypes.FLOAT,allowNull:!0},param3:{type:l.DataTypes.FLOAT,allowNull:!0},param4:{type:l.DataTypes.FLOAT,allowNull:!0},severity:{type:l.DataTypes.INTEGER,allowNull:!1},text_param:{type:l.DataTypes.STRING(256),allowNull:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_error",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_error_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_err__3213E83EF5E87ABE",unique:!0,fields:[{name:"id"}]}]})}}t.TestError=s},5748:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestExt=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestExt",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"test",key:"id"}},version:{type:l.DataTypes.INTEGER,allowNull:!0},archived:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"test_ext",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test_ext__3213E83F7C62AA47",unique:!0,fields:[{name:"id"}]}]})}}t.TestExt=s},1396:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestHistory",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},creation_time:{type:l.DataTypes.DATE,allowNull:!1},field_name:{type:l.DataTypes.STRING(32),allowNull:!1},new_content:{type:l.DataTypes.STRING(512),allowNull:!0},old_content:{type:l.DataTypes.STRING(512),allowNull:!0},user_name:{type:l.DataTypes.STRING(128),allowNull:!0}},{tableName:"test_history",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_history_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_his__3213E83E4CEA85AD",unique:!0,fields:[{name:"id"}]}]})}}t.TestHistory=s},1731:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Test=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Test",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},result_text_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test",key:"id"}},is_current_test:{type:l.DataTypes.BOOLEAN,allowNull:!0},cartridge_barcode:{type:l.DataTypes.STRING(1024),allowNull:!0},cart_serial_number:{type:l.DataTypes.BIGINT,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},data_reduction_algorithm:{type:l.DataTypes.INTEGER,allowNull:!0},error_status:{type:l.DataTypes.INTEGER,allowNull:!1},expiration_date:{type:l.DataTypes.DATE,allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_scanned_patient_id:{type:l.DataTypes.BOOLEAN,allowNull:!0},is_scanned_sample_id:{type:l.DataTypes.BOOLEAN,allowNull:!0},modification_time:{type:l.DataTypes.DATE,allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},order_time:{type:l.DataTypes.DATE,allowNull:!0},other_sample_type_text:{type:l.DataTypes.STRING(32),allowNull:!0},legacy_result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_color:{type:l.DataTypes.TEXT,allowNull:!0},rgt_lot_id:{type:l.DataTypes.STRING(5),allowNull:!0},sample_id:{type:l.DataTypes.STRING(25),allowNull:!0},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},user_full_name:{type:l.DataTypes.STRING(128),allowNull:!0},user_login_name:{type:l.DataTypes.STRING(128),allowNull:!0},patient_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"patient",key:"id"}},test_type:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"test",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test__3213E83FF5B8B492",unique:!0,fields:[{name:"id"}]},{name:"UX_test_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.Test=s},2535:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UltrasonicGraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("UltrasonicGraphSetup",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"graph_setup",key:"id"}},show_amplitude:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_frequency:{type:l.DataTypes.BOOLEAN,allowNull:!0},show_duty_cycle:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"ultrasonic_graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__ultrason__3213E83F317F7578",unique:!0,fields:[{name:"id"}]}]})}}t.UltrasonicGraphSetup=s},9884:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UserExt=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("UserExt",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"users",key:"id"}},institutional_id:{type:l.DataTypes.STRING(128),allowNull:!0},active_date:{type:l.DataTypes.DATE,allowNull:!0},expiration_date:{type:l.DataTypes.DATE,allowNull:!0}},{tableName:"user_ext",schema:"dbo",timestamps:!1,indexes:[{name:"PK__user_ext__3213E83F67F47F65",unique:!0,fields:[{name:"id"}]}]})}}t.UserExt=s},6772:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UserLockout=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("UserLockout",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},login_name:{type:l.DataTypes.STRING(32),allowNull:!1},failure_count:{type:l.DataTypes.INTEGER,allowNull:!1},last_failure:{type:l.DataTypes.DATE,allowNull:!0}},{tableName:"user_lockout",schema:"dbo",timestamps:!1,indexes:[{name:"PK__user_loc__3213E83F6537F831",unique:!0,fields:[{name:"id"}]}]})}}t.UserLockout=s},1701:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UserPrivilege=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("UserPrivilege",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},privilege_name:{type:l.DataTypes.STRING(64),allowNull:!1},user_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"user_privilege",schema:"dbo",timestamps:!1,indexes:[{name:"PK__user_pri__3213E83F7375D6FB",unique:!0,fields:[{name:"id"}]}]})}}t.UserPrivilege=s},8655:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.User=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("User",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},full_name:{type:l.DataTypes.STRING(128),allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_hidden:{type:l.DataTypes.BOOLEAN,allowNull:!1},login_name:{type:l.DataTypes.STRING(32),allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!0},password:{type:l.DataTypes.STRING(256),allowNull:!1},user_source:{type:l.DataTypes.INTEGER,allowNull:!1},user_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"users",schema:"dbo",timestamps:!1,indexes:[{name:"PK__users__3213E83F4F70944B",unique:!0,fields:[{name:"id"}]},{name:"UX_users_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.User=s},2522:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,o)}r((l=l.apply(e,t||[])).next())}))},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.GeneXpertClient=void 0;const n=s(a(2245)),i=a(9634),o=a(496),r=a(7306),p=a(5662),u="YYYY/MM/DD HH:mm:ss.SSS";t.GeneXpertClient=class{constructor(e,t,a,l){this.version=e,this.sequelize=(0,r.createSequelize)(t,a,l),this.models=(0,p.initModels)(this.sequelize)}logsTotal(){return this.models.SystemLog.count()}testsTotal(){return this.models.Test.count({include:[{as:"test_data",model:this.models.TestDatum,where:{state:{[o.Op.ne]:1}},required:!0}]})}systemInfo(){const e=this.sequelize.query("\n          SELECT\n            MAX(sw_version) as [sw_version],\n            [system_log].[site_serial_number],\n            [system_log].[site_name],\n            MAX([instrument_serial_number]) as [instrument_serial_number],\n            MAX(log_time) as [log_time],\n            MIN(log_time) as [first_seen_at],\n            MAX([disabled_module].[creation_time]) as [disabled_at]\n          FROM [dbo].[system_log]\n            LEFT JOIN [dbo].[disabled_module]\n            ON [dbo].[disabled_module].[site_serial_number] = [dbo].[system_log].[site_serial_number]\n          GROUP BY [site_name], [system_log].[site_serial_number]\n          ORDER BY log_time DESC\n        ").then((([e])=>e)),t=this.models.Config.findAll().then((e=>e.map((e=>({[e.param_key]:e.param_val}))))).then(i.mergeAll);return Promise.all([e,t]).then((e=>(0,r.toSystemInfo)(...e)))}testsPresyncables(e,t,a){return this.models.Test.findAll({where:{[o.Op.or]:[{order_time:{[o.Op.lt]:(0,n.default)().subtract(1,"hour").toDate()},modification_time:{[o.Op.gt]:e}},{order_time:{[o.Op.lt]:(0,n.default)().subtract(1,"hour").toDate()},modification_time:{[o.Op.eq]:e},id:{[o.Op.notIn]:t}}]},order:[["modification_time","DESC"]],limit:a}).then((e=>e.map((({id:e,modification_time:t})=>({id:e.toString(),modified:t})))))}testsSyncables(e){return this.models.Test.findAll({where:{id:{[o.Op.in]:e}},include:[{as:"test_data",model:this.models.TestDatum},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]}},{as:"user",model:this.models.User},{as:"test_errors",model:this.models.TestError},{as:"patient",model:this.models.Patient},{as:"analyte_results",model:this.models.AnalyteResult,include:[{as:"analyte",model:this.models.Analyte},{as:"channel_processed_data_items",model:this.models.ChannelProcessedDataItem}]},{as:"organism_results",model:this.models.OrganismResult,include:[{as:"organism",model:this.models.Organism},{as:"organism_based_organism_result",model:this.models.OrganismBasedOrganismResult}]}]}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}testsForEntry(e,t){return this.models.Test.findAll({where:{sample_id:{[o.Op.notIn]:e}},include:[{as:"test_data",model:this.models.TestDatum,where:{start_time:{[o.Op.gte]:(0,n.default)().subtract(t||r.hoursForDataEntry,"hours").toDate()}}},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>({id:e.id,assay:e.assay.name,endedAt:e.test_data.end_time,sampleId:e.sample_id,startedAt:e.test_data.start_time})))))}logsPresyncables(e,t,a){return this.models.SystemLog.findAll({where:{[o.Op.or]:[{log_time:{[o.Op.gt]:e}},{log_time:{[o.Op.eq]:e},id:{[o.Op.notIn]:t}}]},limit:a,attributes:["id","log_time"],order:[["log_time","ASC"]]}).then((e=>e.map((({id:e,log_time:t})=>({id:e.toString(),modified:t})))))}logsSyncables(e){return this.models.SystemLog.findAll({where:{id:{[o.Op.in]:e}}}).then((0,i.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}close(){return this.sequelize.close()}getTest(e){var t,a,s;return l(this,void 0,void 0,(function*(){const l=yield this.models.Test.findOne({where:{sample_id:{[o.Op.eq]:e}},include:[{as:"test_data",model:this.models.TestDatum}]});return{dataValues:Object.assign(Object.assign({},null==l?void 0:l.dataValues),{end_time:null===(a=null===(t=null==l?void 0:l.dataValues)||void 0===t?void 0:t.test_data)||void 0===a?void 0:a.end_time,sampleId:null===(s=null==l?void 0:l.dataValues)||void 0===s?void 0:s.sample_id})}}))}getTestsByTestIds(e){return this.models.Test.findAll({where:{id:{[o.Op.in]:e}},include:[{as:"test_data",model:this.models.TestDatum},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>({id:e.id,assay:e.assay.name,endedAt:e.test_data.end_time,sampleId:e.sample_id,startedAt:e.test_data.start_time})))))}getCompletedTestsBySampleIds(e){return this.models.Test.findAll({where:{sample_id:{[o.Op.in]:e},modification_time:{[o.Op.and]:[{[o.Op.not]:null},{[o.Op.between]:[(0,n.default)().subtract(r.LAB_RESULT_APPROVAL_DEADLINE_HOURS,"hours").format(u),(0,n.default)().format(u)]}]},result_text:{[o.Op.not]:null}},include:[{as:"test_data",model:this.models.TestDatum},{as:"assay",model:this.models.Assay,attributes:{exclude:["sample_prep_video","picture","command_bytes"]},where:{name:{[o.Op.in]:r.assaysForDataEntry}},required:!0}]}).then((e=>e.map((e=>{var t,a,l,s,i;return{id:e.id,assay:null===(t=e.assay)||void 0===t?void 0:t.name,endedAt:(0,n.default)(null!==(l=null===(a=null==e?void 0:e.test_data)||void 0===a?void 0:a.end_time)&&void 0!==l?l:null==e?void 0:e.modification_time,u).toDate(),sampleId:e.sample_id,startedAt:(0,n.default)(null!==(i=null===(s=null==e?void 0:e.test_data)||void 0===s?void 0:s.start_time)&&void 0!==i?i:null==e?void 0:e.order_time,u).toDate()}}))))}}},9057:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AnalyteResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AnalyteResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}}},{tableName:"analyte_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_analyte_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__analyte___3213E83ECDC2EDFE",unique:!0,fields:[{name:"id"}]}]})}}t.AnalyteResult=s},3363:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Analyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Analyte",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},analyte_index:{type:l.DataTypes.INTEGER,allowNull:!1},background_end:{type:l.DataTypes.INTEGER,allowNull:!1},background_look_back:{type:l.DataTypes.INTEGER,allowNull:!1},background_max_rms_error:{type:l.DataTypes.FLOAT,allowNull:!0},background_max_slope:{type:l.DataTypes.FLOAT,allowNull:!0},background_min_points:{type:l.DataTypes.INTEGER,allowNull:!1},background_start:{type:l.DataTypes.INTEGER,allowNull:!1},boxcar_cycles:{type:l.DataTypes.INTEGER,allowNull:!1},curve_analysis:{type:l.DataTypes.INTEGER,allowNull:!1},curve_fit_end_index:{type:l.DataTypes.INTEGER,allowNull:!0},curve_fit_max_nrse:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_max_slope_vs_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_min_shape_factor:{type:l.DataTypes.FLOAT,allowNull:!0},curve_fit_start_index:{type:l.DataTypes.INTEGER,allowNull:!0},intended_concentration:{type:l.DataTypes.FLOAT,allowNull:!1},invalid_bias:{type:l.DataTypes.INTEGER,allowNull:!1},is_signal_loss_detection_enabled:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_probe_check_use_delta_pc:{type:l.DataTypes.BOOLEAN,allowNull:!1},name:{type:l.DataTypes.STRING(20),allowNull:!1},probe_check_max_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},probe_check_min_ratio:{type:l.DataTypes.FLOAT,allowNull:!0},reporter_name:{type:l.DataTypes.STRING(12),allowNull:!1},target:{type:l.DataTypes.BLOB,allowNull:!0},use_curve_fit:{type:l.DataTypes.BOOLEAN,allowNull:!1},use_curve_fit_end_data:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_curve_fit_on_crosstalk:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_curve_fit_start_background:{type:l.DataTypes.BOOLEAN,allowNull:!0},usage:{type:l.DataTypes.INTEGER,allowNull:!1},use_background_validation:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"analyte",schema:"dbo",timestamps:!1,indexes:[{name:"PK__analyte__3213E83FA63374DD",unique:!0,fields:[{name:"id"}]}]})}}t.Analyte=s},3133:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayChamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayChamber",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge",key:"id"}},chamber_number:{type:l.DataTypes.INTEGER,allowNull:!1},initial_volume:{type:l.DataTypes.INTEGER,allowNull:!1},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!1},name:{type:l.DataTypes.STRING(16),allowNull:!1}},{tableName:"assay_chamber",schema:"dbo",timestamps:!1,indexes:[{name:"PK__assay_ch__3213E83FBA29C6D8",unique:!0,fields:[{name:"id"}]}]})}}t.AssayChamber=s},5083:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AssayPosition=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("AssayPosition",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},position:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"assay_position",schema:"dbo",timestamps:!1,indexes:[{name:"PK__assay_po__3213E83F9ED37278",unique:!0,fields:[{name:"id"}]}]})}}t.AssayPosition=s},6570:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Assay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Assay",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}},assay_index:{type:l.DataTypes.INTEGER,allowNull:!0},result_text_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_lock_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_version:{type:l.DataTypes.INTEGER,allowNull:!0},command_bytes:{type:l.DataTypes.BLOB,allowNull:!0},command_sequence_format:{type:l.DataTypes.INTEGER,allowNull:!0},comments:{type:l.DataTypes.STRING(4e3),allowNull:!0},company_code:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},data_reduction_algorithm:{type:l.DataTypes.INTEGER,allowNull:!0},default_result_text_index:{type:l.DataTypes.INTEGER,allowNull:!0},default_text_color_reference:{type:l.DataTypes.INTEGER,allowNull:!0},disclaimer:{type:l.DataTypes.STRING(4e3),allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!0},is_clia_waived:{type:l.DataTypes.BOOLEAN,allowNull:!0},lock_comments:{type:l.DataTypes.STRING(4e3),allowNull:!0},lock_time:{type:l.DataTypes.DATE,allowNull:!0},modification_time:{type:l.DataTypes.DATE,allowNull:!0},name:{type:l.DataTypes.STRING(32),allowNull:!1},need_lsp:{type:l.DataTypes.BOOLEAN,allowNull:!0},picture:{type:l.DataTypes.BLOB,allowNull:!0},prep_cartridge_shelf_life:{type:l.DataTypes.INTEGER,allowNull:!0},product_code:{type:l.DataTypes.INTEGER,allowNull:!0},sample_prep_instruction:{type:l.DataTypes.STRING(256),allowNull:!0},sample_prep_video:{type:l.DataTypes.BLOB,allowNull:!0},use_background_subtraction:{type:l.DataTypes.BOOLEAN,allowNull:!0},use_melt_all_peaks:{type:l.DataTypes.BOOLEAN,allowNull:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"users",key:"id"}}},{tableName:"assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__assay__3213E83F2029E23F",unique:!0,fields:[{name:"id"}]},{name:"UX_assay_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.Assay=s},8804:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BasicOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("BasicOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}}},{tableName:"basic_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__basic_or__3213E83F330C3338",unique:!0,fields:[{name:"id"}]}]})}}t.BasicOrganism=s},3642:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CartridgeType=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CartridgeType",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},adc_2_psi:{type:l.DataTypes.FLOAT,allowNull:!1},air_chamber:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_foot_height:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_version:{type:l.DataTypes.INTEGER,allowNull:!1},creation_time:{type:l.DataTypes.DATE,allowNull:!1},direct_flow_rate_max:{type:l.DataTypes.FLOAT,allowNull:!1},direct_flow_rate_min:{type:l.DataTypes.FLOAT,allowNull:!1},direct_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},filter_flow_rate_max:{type:l.DataTypes.FLOAT,allowNull:!1},filter_flow_rate_min:{type:l.DataTypes.FLOAT,allowNull:!1},filter_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},initial_aspirate_flow_rate:{type:l.DataTypes.FLOAT,allowNull:!1},initial_aspirate_volume:{type:l.DataTypes.INTEGER,allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},max_pressure:{type:l.DataTypes.INTEGER,allowNull:!1},microliters_per_revolution:{type:l.DataTypes.FLOAT,allowNull:!1},min_pressure:{type:l.DataTypes.INTEGER,allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1},overflow_chamber:{type:l.DataTypes.INTEGER,allowNull:!1},picture:{type:l.DataTypes.BLOB,allowNull:!0},plunger_pickup_position:{type:l.DataTypes.INTEGER,allowNull:!1},plunger_strip_position:{type:l.DataTypes.INTEGER,allowNull:!1},syringe_max_transfer_volume:{type:l.DataTypes.INTEGER,allowNull:!1},syringe_max_volume:{type:l.DataTypes.INTEGER,allowNull:!1},syringe_min_transfer_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_chamber_number:{type:l.DataTypes.INTEGER,allowNull:!1},tube_chamber_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_pressurized_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_syringe_path_volume:{type:l.DataTypes.INTEGER,allowNull:!1},tube_volume:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"cartridge_type",schema:"dbo",timestamps:!1,indexes:[{name:"PK__cartridg__3213E83F8C4F3852",unique:!0,fields:[{name:"id"}]},{name:"UX_cartridgetype_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.CartridgeType=s},3406:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Cartridge=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Cartridge",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},air_chamber:{type:l.DataTypes.INTEGER,allowNull:!1},cartridge_type_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge_type",key:"id"}},overflow_chamber:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"cartridge",schema:"dbo",timestamps:!1,indexes:[{name:"PK__cartridg__3213E83F250C10B7",unique:!0,fields:[{name:"id"}]}]})}}t.Cartridge=s},9909:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Chamber=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Chamber",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge_type",key:"id"}},chamber_number:{type:l.DataTypes.INTEGER,allowNull:!1},max_volume:{type:l.DataTypes.INTEGER,allowNull:!1},min_volume:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"chamber",schema:"dbo",timestamps:!1,indexes:[{name:"PK__chamber__3213E83F4AB9898B",unique:!0,fields:[{name:"id"}]}]})}}t.Chamber=s},3465:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ChannelProcessedDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ChannelProcessedDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte_result",key:"id"}},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"channel_processed_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_channel_processed_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__channel___3213E83ED0788519",unique:!0,fields:[{name:"id"}]}]})}}t.ChannelProcessedDataItem=s},2637:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ChannelRawDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ChannelRawDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"channel_raw_data",key:"id"}},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0},timestamps:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"channel_raw_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_channel_raw_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__channel___3213E83EC0F7CD0A",unique:!0,fields:[{name:"id"}]}]})}}t.ChannelRawDataItem=s},2418:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ChannelRawDatum=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ChannelRawDatum",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test_data",key:"id"}},protocol_number:{type:l.DataTypes.INTEGER,allowNull:!1},channel_name:{type:l.DataTypes.STRING(32),allowNull:!1}},{tableName:"channel_raw_data",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_channel_raw_data_parent_id",fields:[{name:"parent_id"}]},{name:"PK__channel___3213E83EC68CD172",unique:!0,fields:[{name:"id"}]}]})}}t.ChannelRawDatum=s},3258:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorDisclaimer=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ColorDisclaimer",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},color:{type:l.DataTypes.INTEGER,allowNull:!1},disclaimer:{type:l.DataTypes.STRING(256),allowNull:!0}},{tableName:"color_disclaimer",schema:"dbo",timestamps:!1,indexes:[{name:"PK__color_di__3213E83F654A7801",unique:!0,fields:[{name:"id"}]}]})}}t.ColorDisclaimer=s},8949:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Config",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},param_key:{type:l.DataTypes.STRING(64),allowNull:!0},param_val:{type:l.DataTypes.STRING(512),allowNull:!0}},{tableName:"config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__config__3213E83FB24EFCAC",unique:!0,fields:[{name:"id"}]},{name:"UX_config_paramkey",unique:!0,fields:[{name:"param_key"}]}]})}}t.Config=s},5479:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CrosstalkCorrResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("CrosstalkCorrResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte_result",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte",key:"id"}},protocol_index:{type:l.DataTypes.INTEGER,allowNull:!1},ignore_code:{type:l.DataTypes.STRING(64),allowNull:!1},correlation_slope:{type:l.DataTypes.FLOAT,allowNull:!0},correlation_r2:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"crosstalk_corr_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_crosstalk_corr_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__crosstal__3213E83E924D6078",unique:!0,fields:[{name:"id"}]}]})}}t.CrosstalkCorrResult=s},9171:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DeltaCtOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("DeltaCtOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"basic_organism",key:"id"}},delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!1},delta_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"delta_ct_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__delta_ct__3213E83FE042FFFC",unique:!0,fields:[{name:"id"}]}]})}}t.DeltaCtOrganism=s},606:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DisabledModule=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("DisabledModule",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!1},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!1},user_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"users",key:"id"}}},{tableName:"disabled_module",schema:"dbo",timestamps:!1,indexes:[{name:"PK__disabled__3213E83F96810815",unique:!0,fields:[{name:"id"}]},{name:"UX_disabledmodule_siteserialnumber",unique:!0,fields:[{name:"site_serial_number"}]}]})}}t.DisabledModule=s},1903:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingAssay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"genotyping_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__3213E83F7C84A87B",unique:!0,fields:[{name:"id"}]}]})}}t.GenotypingAssay=s},5738:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingHaplotypeOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingHaplotypeOrganism",{haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"haplotype",key:"id"}},genotyping_organism_id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"genotyping_organism",key:"id"}}},{tableName:"genotyping_haplotype_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__060A713D88EAF29B",unique:!0,fields:[{name:"haplotype_id"},{name:"genotyping_organism_id"}]},{name:"UX_gho_haplotypeid_genotypingorganismid",unique:!0,fields:[{name:"haplotype_id"},{name:"genotyping_organism_id"}]}]})}}t.GenotypingHaplotypeOrganism=s},7676:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}}},{tableName:"genotyping_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__3213E83F71AF25E1",unique:!0,fields:[{name:"id"}]}]})}}t.GenotypingOrganismResult=s},3722:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GenotypingOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GenotypingOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},early_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!1},late_delta_ct_max:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"genotyping_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__genotypi__3213E83F13741DD0",unique:!0,fields:[{name:"id"}]}]})}}t.GenotypingOrganism=s},8378:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetupAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetupAssay",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},graph_setup_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"graph_setup",key:"id"}},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}}},{tableName:"graph_setup_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__graph_se__3213E83FB241A5B9",unique:!0,fields:[{name:"id"}]},{name:"UX_graphsetupassay_graphsetupid_assayid",unique:!0,fields:[{name:"graph_setup_id"},{name:"assay_id"}]}]})}}t.GraphSetupAssay=s},3017:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GraphSetup=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("GraphSetup",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_default:{type:l.DataTypes.BOOLEAN,allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1},pos:{type:l.DataTypes.INTEGER,allowNull:!1},settings:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"graph_setup",schema:"dbo",timestamps:!1,indexes:[{name:"PK__graph_se__3213E83F6ADA0B5A",unique:!0,fields:[{name:"id"}]},{name:"UX_graphsetup_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.GraphSetup=s},4359:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.HaplotypeResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("HaplotypeResultText",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"haplotype",key:"id"}},alleles_text1:{type:l.DataTypes.STRING(10),allowNull:!1},alleles_text2:{type:l.DataTypes.STRING(10),allowNull:!1},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(11),allowNull:!1},text_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"haplotype_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK__haplotyp__3213E83FC0009034",unique:!0,fields:[{name:"id"}]}]})}}t.HaplotypeResultText=s},2428:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.HaplotypeResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("HaplotypeResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"haplotype",key:"id"}},allele1_text:{type:l.DataTypes.TEXT,allowNull:!1},allele2_text:{type:l.DataTypes.TEXT,allowNull:!1},result_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"haplotype_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_haplotype_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__haplotyp__3213E83EDA363883",unique:!0,fields:[{name:"id"}]}]})}}t.HaplotypeResult=s},4997:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Haplotype=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Haplotype",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"genotyping_assay",key:"id"}},haplotype_index:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(20),allowNull:!1}},{tableName:"haplotype",schema:"dbo",timestamps:!1,indexes:[{name:"PK__haplotyp__3213E83F6E1A2AB7",unique:!0,fields:[{name:"id"}]}]})}}t.Haplotype=s},5662:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioOrganism=t.PercentRatioAssay=t.Patient=t.Path=t.OrganismTarget=t.OrganismResultText=t.OrganismResult=t.OrganismBasedOrganismResult=t.OrganismBasedAssay=t.Organism=t.MeltPeakSetting=t.MeltPeakResult=t.LisUpload=t.LisTestOrder=t.LisOrganismConfig=t.LisHaplotypeConfig=t.LisGenotypingAssayConfig=t.LisAssayConfig=t.LdaOrganismResult=t.LdaOrganism=t.LdaCoefficient=t.LdaAssay=t.LdaAnalyte=t.Instrument=t.HaplotypeResultText=t.HaplotypeResult=t.Haplotype=t.GraphSetupAssay=t.GraphSetup=t.GenotypingOrganismResult=t.GenotypingOrganism=t.GenotypingHaplotypeOrganism=t.GenotypingAssay=t.DisabledModule=t.DeltaCtOrganism=t.CrosstalkCorrResult=t.Config=t.ColorDisclaimer=t.ChannelRawDataItem=t.ChannelRawDatum=t.ChannelProcessedDataItem=t.Chamber=t.CartridgeType=t.Cartridge=t.BasicOrganism=t.AssayPosition=t.AssayChamber=t.Assay=t.AnalyteResult=t.Analyte=void 0,t.initModels=t.User=t.UserPrivilege=t.TestNv=t.TestHistory=t.TestError=t.TestDataError=t.TestDatum=t.TestBlogCounter=t.TestBlog=t.Test=t.TargetBasedOrganism=t.TargetBasedAssay=t.SystemLog=t.SemiQuantOrganism=t.SelectedQuantUnitSetting=t.SampleType=t.SampleSetting=t.ResultRuleMeltPeak=t.ResultRuleInterpretation=t.ResultRuleAnalyte=t.ResultEvaluator=t.ResultCalculation=t.Reporter=t.ReportGraphSetting=t.ReagentLot=t.RawDataItem=t.QuantUnitSetting=t.Quant1SampleSetting=t.Quant1Result=t.Quant1ReagentLot=t.Quant1OrganismResult=t.Quant1Organism=t.Quant1Assay=t.PercentRatioSampleSetting=t.PercentRatioResultEvaluator=t.PercentRatioReagentLot=t.PercentRatioOrganismResult=void 0;const l=a(3363);Object.defineProperty(t,"Analyte",{enumerable:!0,get:function(){return l.Analyte}});const s=a(9057);Object.defineProperty(t,"AnalyteResult",{enumerable:!0,get:function(){return s.AnalyteResult}});const n=a(6570);Object.defineProperty(t,"Assay",{enumerable:!0,get:function(){return n.Assay}});const i=a(3133);Object.defineProperty(t,"AssayChamber",{enumerable:!0,get:function(){return i.AssayChamber}});const o=a(5083);Object.defineProperty(t,"AssayPosition",{enumerable:!0,get:function(){return o.AssayPosition}});const r=a(8804);Object.defineProperty(t,"BasicOrganism",{enumerable:!0,get:function(){return r.BasicOrganism}});const p=a(3406);Object.defineProperty(t,"Cartridge",{enumerable:!0,get:function(){return p.Cartridge}});const u=a(3642);Object.defineProperty(t,"CartridgeType",{enumerable:!0,get:function(){return u.CartridgeType}});const d=a(9909);Object.defineProperty(t,"Chamber",{enumerable:!0,get:function(){return d.Chamber}});const y=a(3465);Object.defineProperty(t,"ChannelProcessedDataItem",{enumerable:!0,get:function(){return y.ChannelProcessedDataItem}});const _=a(2418);Object.defineProperty(t,"ChannelRawDatum",{enumerable:!0,get:function(){return _.ChannelRawDatum}});const m=a(2637);Object.defineProperty(t,"ChannelRawDataItem",{enumerable:!0,get:function(){return m.ChannelRawDataItem}});const c=a(3258);Object.defineProperty(t,"ColorDisclaimer",{enumerable:!0,get:function(){return c.ColorDisclaimer}});const T=a(8949);Object.defineProperty(t,"Config",{enumerable:!0,get:function(){return T.Config}});const N=a(5479);Object.defineProperty(t,"CrosstalkCorrResult",{enumerable:!0,get:function(){return N.CrosstalkCorrResult}});const g=a(9171);Object.defineProperty(t,"DeltaCtOrganism",{enumerable:!0,get:function(){return g.DeltaCtOrganism}});const f=a(606);Object.defineProperty(t,"DisabledModule",{enumerable:!0,get:function(){return f.DisabledModule}});const D=a(1903);Object.defineProperty(t,"GenotypingAssay",{enumerable:!0,get:function(){return D.GenotypingAssay}});const E=a(5738);Object.defineProperty(t,"GenotypingHaplotypeOrganism",{enumerable:!0,get:function(){return E.GenotypingHaplotypeOrganism}});const b=a(3722);Object.defineProperty(t,"GenotypingOrganism",{enumerable:!0,get:function(){return b.GenotypingOrganism}});const w=a(7676);Object.defineProperty(t,"GenotypingOrganismResult",{enumerable:!0,get:function(){return w.GenotypingOrganismResult}});const I=a(3017);Object.defineProperty(t,"GraphSetup",{enumerable:!0,get:function(){return I.GraphSetup}});const R=a(8378);Object.defineProperty(t,"GraphSetupAssay",{enumerable:!0,get:function(){return R.GraphSetupAssay}});const O=a(4997);Object.defineProperty(t,"Haplotype",{enumerable:!0,get:function(){return O.Haplotype}});const h=a(2428);Object.defineProperty(t,"HaplotypeResult",{enumerable:!0,get:function(){return h.HaplotypeResult}});const M=a(4359);Object.defineProperty(t,"HaplotypeResultText",{enumerable:!0,get:function(){return M.HaplotypeResultText}});const G=a(7324);Object.defineProperty(t,"Instrument",{enumerable:!0,get:function(){return G.Instrument}});const v=a(2673);Object.defineProperty(t,"LdaAnalyte",{enumerable:!0,get:function(){return v.LdaAnalyte}});const S=a(7425);Object.defineProperty(t,"LdaAssay",{enumerable:!0,get:function(){return S.LdaAssay}});const A=a(5710);Object.defineProperty(t,"LdaCoefficient",{enumerable:!0,get:function(){return A.LdaCoefficient}});const P=a(7110);Object.defineProperty(t,"LdaOrganism",{enumerable:!0,get:function(){return P.LdaOrganism}});const L=a(4741);Object.defineProperty(t,"LdaOrganismResult",{enumerable:!0,get:function(){return L.LdaOrganismResult}});const C=a(3179);Object.defineProperty(t,"LisAssayConfig",{enumerable:!0,get:function(){return C.LisAssayConfig}});const K=a(4810);Object.defineProperty(t,"LisGenotypingAssayConfig",{enumerable:!0,get:function(){return K.LisGenotypingAssayConfig}});const x=a(1219);Object.defineProperty(t,"LisHaplotypeConfig",{enumerable:!0,get:function(){return x.LisHaplotypeConfig}});const j=a(2855);Object.defineProperty(t,"LisOrganismConfig",{enumerable:!0,get:function(){return j.LisOrganismConfig}});const q=a(7519);Object.defineProperty(t,"LisTestOrder",{enumerable:!0,get:function(){return q.LisTestOrder}});const k=a(8608);Object.defineProperty(t,"LisUpload",{enumerable:!0,get:function(){return k.LisUpload}});const F=a(4298);Object.defineProperty(t,"MeltPeakResult",{enumerable:!0,get:function(){return F.MeltPeakResult}});const B=a(630);Object.defineProperty(t,"MeltPeakSetting",{enumerable:!0,get:function(){return B.MeltPeakSetting}});const Q=a(8374);Object.defineProperty(t,"Organism",{enumerable:!0,get:function(){return Q.Organism}});const U=a(7883);Object.defineProperty(t,"OrganismBasedAssay",{enumerable:!0,get:function(){return U.OrganismBasedAssay}});const H=a(1122);Object.defineProperty(t,"OrganismBasedOrganismResult",{enumerable:!0,get:function(){return H.OrganismBasedOrganismResult}});const X=a(9668);Object.defineProperty(t,"OrganismResult",{enumerable:!0,get:function(){return X.OrganismResult}});const V=a(6321);Object.defineProperty(t,"OrganismResultText",{enumerable:!0,get:function(){return V.OrganismResultText}});const z=a(8476);Object.defineProperty(t,"OrganismTarget",{enumerable:!0,get:function(){return z.OrganismTarget}});const J=a(5828);Object.defineProperty(t,"Path",{enumerable:!0,get:function(){return J.Path}});const $=a(3708);Object.defineProperty(t,"Patient",{enumerable:!0,get:function(){return $.Patient}});const Y=a(9913);Object.defineProperty(t,"PercentRatioAssay",{enumerable:!0,get:function(){return Y.PercentRatioAssay}});const W=a(2232);Object.defineProperty(t,"PercentRatioOrganism",{enumerable:!0,get:function(){return W.PercentRatioOrganism}});const Z=a(9169);Object.defineProperty(t,"PercentRatioOrganismResult",{enumerable:!0,get:function(){return Z.PercentRatioOrganismResult}});const ee=a(894);Object.defineProperty(t,"PercentRatioReagentLot",{enumerable:!0,get:function(){return ee.PercentRatioReagentLot}});const te=a(7363);Object.defineProperty(t,"PercentRatioResultEvaluator",{enumerable:!0,get:function(){return te.PercentRatioResultEvaluator}});const ae=a(2026);Object.defineProperty(t,"PercentRatioSampleSetting",{enumerable:!0,get:function(){return ae.PercentRatioSampleSetting}});const le=a(9250);Object.defineProperty(t,"Quant1Assay",{enumerable:!0,get:function(){return le.Quant1Assay}});const se=a(3739);Object.defineProperty(t,"Quant1Organism",{enumerable:!0,get:function(){return se.Quant1Organism}});const ne=a(5021);Object.defineProperty(t,"Quant1OrganismResult",{enumerable:!0,get:function(){return ne.Quant1OrganismResult}});const ie=a(6693);Object.defineProperty(t,"Quant1ReagentLot",{enumerable:!0,get:function(){return ie.Quant1ReagentLot}});const oe=a(2949);Object.defineProperty(t,"Quant1Result",{enumerable:!0,get:function(){return oe.Quant1Result}});const re=a(3664);Object.defineProperty(t,"Quant1SampleSetting",{enumerable:!0,get:function(){return re.Quant1SampleSetting}});const pe=a(1747);Object.defineProperty(t,"QuantUnitSetting",{enumerable:!0,get:function(){return pe.QuantUnitSetting}});const ue=a(8090);Object.defineProperty(t,"RawDataItem",{enumerable:!0,get:function(){return ue.RawDataItem}});const de=a(8323);Object.defineProperty(t,"ReagentLot",{enumerable:!0,get:function(){return de.ReagentLot}});const ye=a(771);Object.defineProperty(t,"ReportGraphSetting",{enumerable:!0,get:function(){return ye.ReportGraphSetting}});const _e=a(200);Object.defineProperty(t,"Reporter",{enumerable:!0,get:function(){return _e.Reporter}});const me=a(4829);Object.defineProperty(t,"ResultCalculation",{enumerable:!0,get:function(){return me.ResultCalculation}});const ce=a(1452);Object.defineProperty(t,"ResultEvaluator",{enumerable:!0,get:function(){return ce.ResultEvaluator}});const Te=a(1093);Object.defineProperty(t,"ResultRuleAnalyte",{enumerable:!0,get:function(){return Te.ResultRuleAnalyte}});const Ne=a(3271);Object.defineProperty(t,"ResultRuleInterpretation",{enumerable:!0,get:function(){return Ne.ResultRuleInterpretation}});const ge=a(3745);Object.defineProperty(t,"ResultRuleMeltPeak",{enumerable:!0,get:function(){return ge.ResultRuleMeltPeak}});const fe=a(6709);Object.defineProperty(t,"SampleSetting",{enumerable:!0,get:function(){return fe.SampleSetting}});const De=a(8388);Object.defineProperty(t,"SampleType",{enumerable:!0,get:function(){return De.SampleType}});const Ee=a(1111);Object.defineProperty(t,"SelectedQuantUnitSetting",{enumerable:!0,get:function(){return Ee.SelectedQuantUnitSetting}});const be=a(5274);Object.defineProperty(t,"SemiQuantOrganism",{enumerable:!0,get:function(){return be.SemiQuantOrganism}});const we=a(7497);Object.defineProperty(t,"SystemLog",{enumerable:!0,get:function(){return we.SystemLog}});const Ie=a(7657);Object.defineProperty(t,"TargetBasedAssay",{enumerable:!0,get:function(){return Ie.TargetBasedAssay}});const Re=a(6344);Object.defineProperty(t,"TargetBasedOrganism",{enumerable:!0,get:function(){return Re.TargetBasedOrganism}});const Oe=a(6676);Object.defineProperty(t,"Test",{enumerable:!0,get:function(){return Oe.Test}});const he=a(806);Object.defineProperty(t,"TestBlog",{enumerable:!0,get:function(){return he.TestBlog}});const Me=a(4668);Object.defineProperty(t,"TestBlogCounter",{enumerable:!0,get:function(){return Me.TestBlogCounter}});const Ge=a(4114);Object.defineProperty(t,"TestDatum",{enumerable:!0,get:function(){return Ge.TestDatum}});const ve=a(1257);Object.defineProperty(t,"TestDataError",{enumerable:!0,get:function(){return ve.TestDataError}});const Se=a(9067);Object.defineProperty(t,"TestError",{enumerable:!0,get:function(){return Se.TestError}});const Ae=a(7595);Object.defineProperty(t,"TestHistory",{enumerable:!0,get:function(){return Ae.TestHistory}});const Pe=a(2200);Object.defineProperty(t,"TestNv",{enumerable:!0,get:function(){return Pe.TestNv}});const Le=a(8803);Object.defineProperty(t,"UserPrivilege",{enumerable:!0,get:function(){return Le.UserPrivilege}});const Ce=a(9005);Object.defineProperty(t,"User",{enumerable:!0,get:function(){return Ce.User}}),t.initModels=function(e){const t=l.Analyte.initModel(e),a=s.AnalyteResult.initModel(e),Ke=n.Assay.initModel(e),xe=i.AssayChamber.initModel(e),je=o.AssayPosition.initModel(e),qe=r.BasicOrganism.initModel(e),ke=p.Cartridge.initModel(e),Fe=u.CartridgeType.initModel(e),Be=d.Chamber.initModel(e),Qe=y.ChannelProcessedDataItem.initModel(e),Ue=_.ChannelRawDatum.initModel(e),He=m.ChannelRawDataItem.initModel(e),Xe=c.ColorDisclaimer.initModel(e),Ve=T.Config.initModel(e),ze=N.CrosstalkCorrResult.initModel(e),Je=g.DeltaCtOrganism.initModel(e),$e=f.DisabledModule.initModel(e),Ye=D.GenotypingAssay.initModel(e),We=E.GenotypingHaplotypeOrganism.initModel(e),Ze=b.GenotypingOrganism.initModel(e),et=w.GenotypingOrganismResult.initModel(e),tt=I.GraphSetup.initModel(e),at=R.GraphSetupAssay.initModel(e),lt=O.Haplotype.initModel(e),st=h.HaplotypeResult.initModel(e),nt=M.HaplotypeResultText.initModel(e),it=G.Instrument.initModel(e),ot=v.LdaAnalyte.initModel(e),rt=S.LdaAssay.initModel(e),pt=A.LdaCoefficient.initModel(e),ut=P.LdaOrganism.initModel(e),dt=L.LdaOrganismResult.initModel(e),yt=C.LisAssayConfig.initModel(e),_t=K.LisGenotypingAssayConfig.initModel(e),mt=x.LisHaplotypeConfig.initModel(e),ct=j.LisOrganismConfig.initModel(e),Tt=q.LisTestOrder.initModel(e),Nt=k.LisUpload.initModel(e),gt=F.MeltPeakResult.initModel(e),ft=B.MeltPeakSetting.initModel(e),Dt=Q.Organism.initModel(e),Et=U.OrganismBasedAssay.initModel(e),bt=H.OrganismBasedOrganismResult.initModel(e),wt=X.OrganismResult.initModel(e),It=V.OrganismResultText.initModel(e),Rt=z.OrganismTarget.initModel(e),Ot=J.Path.initModel(e),ht=$.Patient.initModel(e),Mt=Y.PercentRatioAssay.initModel(e),Gt=W.PercentRatioOrganism.initModel(e),vt=Z.PercentRatioOrganismResult.initModel(e),St=ee.PercentRatioReagentLot.initModel(e),At=te.PercentRatioResultEvaluator.initModel(e),Pt=ae.PercentRatioSampleSetting.initModel(e),Lt=le.Quant1Assay.initModel(e),Ct=se.Quant1Organism.initModel(e),Kt=ne.Quant1OrganismResult.initModel(e),xt=ie.Quant1ReagentLot.initModel(e),jt=oe.Quant1Result.initModel(e),qt=re.Quant1SampleSetting.initModel(e),kt=pe.QuantUnitSetting.initModel(e),Ft=ue.RawDataItem.initModel(e),Bt=de.ReagentLot.initModel(e),Qt=ye.ReportGraphSetting.initModel(e),Ut=_e.Reporter.initModel(e),Ht=me.ResultCalculation.initModel(e),Xt=ce.ResultEvaluator.initModel(e),Vt=Te.ResultRuleAnalyte.initModel(e),zt=Ne.ResultRuleInterpretation.initModel(e),Jt=ge.ResultRuleMeltPeak.initModel(e),$t=fe.SampleSetting.initModel(e),Yt=De.SampleType.initModel(e),Wt=Ee.SelectedQuantUnitSetting.initModel(e),Zt=be.SemiQuantOrganism.initModel(e),ea=we.SystemLog.initModel(e),ta=Ie.TargetBasedAssay.initModel(e),aa=Re.TargetBasedOrganism.initModel(e),la=Oe.Test.initModel(e),sa=he.TestBlog.initModel(e),na=Me.TestBlogCounter.initModel(e),ia=Ge.TestDatum.initModel(e),oa=ve.TestDataError.initModel(e),ra=Se.TestError.initModel(e),pa=Ae.TestHistory.initModel(e),ua=Pe.TestNv.initModel(e),da=Le.UserPrivilege.initModel(e),ya=Ce.User.initModel(e);return Ze.belongsToMany(lt,{as:"haplotype_id_haplotypes",through:We,foreignKey:"genotyping_organism_id",otherKey:"haplotype_id"}),lt.belongsToMany(Ze,{as:"genotyping_organism_id_genotyping_organisms",through:We,foreignKey:"haplotype_id",otherKey:"genotyping_organism_id"}),a.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(a,{as:"analyte_results",foreignKey:"analyte_id"}),ze.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(ze,{as:"crosstalk_corr_results",foreignKey:"analyte_id"}),ot.belongsTo(t,{as:"id_analyte",foreignKey:"id"}),t.hasOne(ot,{as:"lda_analyte",foreignKey:"id"}),pt.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(pt,{as:"lda_coefficients",foreignKey:"analyte_id"}),ft.belongsTo(t,{as:"parent",foreignKey:"parent_id"}),t.hasMany(ft,{as:"melt_peak_settings",foreignKey:"parent_id"}),Rt.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(Rt,{as:"organism_targets",foreignKey:"analyte_id"}),vt.belongsTo(t,{as:"calculation_target",foreignKey:"calculation_target_id"}),t.hasMany(vt,{as:"percent_ratio_organism_results",foreignKey:"calculation_target_id"}),vt.belongsTo(t,{as:"reporting_target",foreignKey:"reporting_target_id"}),t.hasMany(vt,{as:"reporting_target_percent_ratio_organism_results",foreignKey:"reporting_target_id"}),At.belongsTo(t,{as:"calculation_target",foreignKey:"calculation_target_id"}),t.hasMany(At,{as:"percent_ratio_result_evaluators",foreignKey:"calculation_target_id"}),At.belongsTo(t,{as:"reporting_target",foreignKey:"reporting_target_id"}),t.hasMany(At,{as:"reporting_target_percent_ratio_result_evaluators",foreignKey:"reporting_target_id"}),Vt.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany(Vt,{as:"result_rule_analytes",foreignKey:"analyte_id"}),$t.belongsTo(t,{as:"analyte",foreignKey:"analyte_id"}),t.hasMany($t,{as:"sample_settings",foreignKey:"analyte_id"}),Qe.belongsTo(a,{as:"parent",foreignKey:"parent_id"}),a.hasMany(Qe,{as:"channel_processed_data_items",foreignKey:"parent_id"}),ze.belongsTo(a,{as:"parent",foreignKey:"parent_id"}),a.hasMany(ze,{as:"crosstalk_corr_results",foreignKey:"parent_id"}),gt.belongsTo(a,{as:"parent",foreignKey:"parent_id"}),a.hasMany(gt,{as:"melt_peak_results",foreignKey:"parent_id"}),t.belongsTo(Ke,{as:"parent",foreignKey:"parent_id"}),Ke.hasMany(t,{as:"analytes",foreignKey:"parent_id"}),Ke.belongsTo(Ke,{as:"parent",foreignKey:"parent_id"}),Ke.hasMany(Ke,{as:"assays",foreignKey:"parent_id"}),je.belongsTo(Ke,{as:"assay",foreignKey:"assay_id"}),Ke.hasMany(je,{as:"assay_positions",foreignKey:"assay_id"}),ke.belongsTo(Ke,{as:"parent",foreignKey:"parent_id"}),Ke.hasMany(ke,{as:"cartridges",foreignKey:"parent_id"}),Xe.belongsTo(Ke,{as:"parent",foreignKey:"parent_id"}),Ke.hasMany(Xe,{as:"color_disclaimers",foreignKey:"parent_id"}),Ye.belongsTo(Ke,{as:"id_assay",foreignKey:"id"}),Ke.hasOne(Ye,{as:"genotyping_assay",foreignKey:"id"}),at.belongsTo(Ke,{as:"assay",foreignKey:"assay_id"}),Ke.hasMany(at,{as:"graph_setup_assays",foreignKey:"assay_id"}),rt.belongsTo(Ke,{as:"id_assay",foreignKey:"id"}),Ke.hasOne(rt,{as:"lda_assay",foreignKey:"id"}),yt.belongsTo(Ke,{as:"assay",foreignKey:"assay_id"}),Ke.hasMany(yt,{as:"lis_assay_configs",foreignKey:"assay_id"}),Dt.belongsTo(Ke,{as:"parent",foreignKey:"parent_id"}),Ke.hasMany(Dt,{as:"organisms",foreignKey:"parent_id"}),Et.belongsTo(Ke,{as:"id_assay",foreignKey:"id"}),Ke.hasOne(Et,{as:"organism_based_assay",foreignKey:"id"}),Mt.belongsTo(Ke,{as:"id_assay",foreignKey:"id"}),Ke.hasOne(Mt,{as:"percent_ratio_assay",foreignKey:"id"}),Lt.belongsTo(Ke,{as:"id_assay",foreignKey:"id"}),Ke.hasOne(Lt,{as:"quant1_assay",foreignKey:"id"}),Bt.belongsTo(Ke,{as:"parent",foreignKey:"parent_id"}),Ke.hasMany(Bt,{as:"reagent_lots",foreignKey:"parent_id"}),Qt.belongsTo(Ke,{as:"assay",foreignKey:"assay_id"}),Ke.hasMany(Qt,{as:"report_graph_settings",foreignKey:"assay_id"}),Ht.belongsTo(Ke,{as:"parent",foreignKey:"parent_id"}),Ke.hasMany(Ht,{as:"result_calculations",foreignKey:"parent_id"}),Yt.belongsTo(Ke,{as:"parent",foreignKey:"parent_id"}),Ke.hasMany(Yt,{as:"sample_types",foreignKey:"parent_id"}),Wt.belongsTo(Ke,{as:"assay",foreignKey:"assay_id"}),Ke.hasMany(Wt,{as:"selected_quant_unit_settings",foreignKey:"assay_id"}),ta.belongsTo(Ke,{as:"id_assay",foreignKey:"id"}),Ke.hasOne(ta,{as:"target_based_assay",foreignKey:"id"}),la.belongsTo(Ke,{as:"assay",foreignKey:"assay_id"}),Ke.hasMany(la,{as:"tests",foreignKey:"assay_id"}),sa.belongsTo(Ke,{as:"assay",foreignKey:"assay_id"}),Ke.hasMany(sa,{as:"test_blogs",foreignKey:"assay_id"}),Je.belongsTo(qe,{as:"id_basic_organism",foreignKey:"id"}),qe.hasOne(Je,{as:"delta_ct_organism",foreignKey:"id"}),Zt.belongsTo(qe,{as:"id_basic_organism",foreignKey:"id"}),qe.hasOne(Zt,{as:"semi_quant_organism",foreignKey:"id"}),xe.belongsTo(ke,{as:"parent",foreignKey:"parent_id"}),ke.hasMany(xe,{as:"assay_chambers",foreignKey:"parent_id"}),ke.belongsTo(Fe,{as:"cartridge_type",foreignKey:"cartridge_type_id"}),Fe.hasMany(ke,{as:"cartridges",foreignKey:"cartridge_type_id"}),Be.belongsTo(Fe,{as:"parent",foreignKey:"parent_id"}),Fe.hasMany(Be,{as:"chambers",foreignKey:"parent_id"}),Ot.belongsTo(Fe,{as:"parent",foreignKey:"parent_id"}),Fe.hasMany(Ot,{as:"paths",foreignKey:"parent_id"}),He.belongsTo(Ue,{as:"parent",foreignKey:"parent_id"}),Ue.hasMany(He,{as:"channel_raw_data_items",foreignKey:"parent_id"}),lt.belongsTo(Ye,{as:"parent",foreignKey:"parent_id"}),Ye.hasMany(lt,{as:"haplotypes",foreignKey:"parent_id"}),We.belongsTo(Ze,{as:"genotyping_organism",foreignKey:"genotyping_organism_id"}),Ze.hasMany(We,{as:"genotyping_haplotype_organisms",foreignKey:"genotyping_organism_id"}),at.belongsTo(tt,{as:"graph_setup",foreignKey:"graph_setup_id"}),tt.hasMany(at,{as:"graph_setup_assays",foreignKey:"graph_setup_id"}),We.belongsTo(lt,{as:"haplotype",foreignKey:"haplotype_id"}),lt.hasMany(We,{as:"genotyping_haplotype_organisms",foreignKey:"haplotype_id"}),st.belongsTo(lt,{as:"haplotype",foreignKey:"haplotype_id"}),lt.hasMany(st,{as:"haplotype_results",foreignKey:"haplotype_id"}),nt.belongsTo(lt,{as:"parent",foreignKey:"parent_id"}),lt.hasMany(nt,{as:"haplotype_result_texts",foreignKey:"parent_id"}),mt.belongsTo(lt,{as:"haplotype",foreignKey:"haplotype_id"}),lt.hasMany(mt,{as:"lis_haplotype_configs",foreignKey:"haplotype_id"}),pt.belongsTo(ut,{as:"parent",foreignKey:"parent_id"}),ut.hasMany(pt,{as:"lda_coefficients",foreignKey:"parent_id"}),_t.belongsTo(yt,{as:"id_lis_assay_config",foreignKey:"id"}),yt.hasOne(_t,{as:"lis_genotyping_assay_config",foreignKey:"id"}),Nt.belongsTo(Tt,{as:"test_order",foreignKey:"test_order_id"}),Tt.hasMany(Nt,{as:"lis_uploads",foreignKey:"test_order_id"}),qe.belongsTo(Dt,{as:"id_organism",foreignKey:"id"}),Dt.hasOne(qe,{as:"basic_organism",foreignKey:"id"}),Ze.belongsTo(Dt,{as:"id_organism",foreignKey:"id"}),Dt.hasOne(Ze,{as:"genotyping_organism",foreignKey:"id"}),ut.belongsTo(Dt,{as:"id_organism",foreignKey:"id"}),Dt.hasOne(ut,{as:"lda_organism",foreignKey:"id"}),ct.belongsTo(Dt,{as:"organism",foreignKey:"organism_id"}),Dt.hasMany(ct,{as:"lis_organism_configs",foreignKey:"organism_id"}),wt.belongsTo(Dt,{as:"organism",foreignKey:"organism_id"}),Dt.hasMany(wt,{as:"organism_results",foreignKey:"organism_id"}),It.belongsTo(Dt,{as:"parent",foreignKey:"parent_id"}),Dt.hasMany(It,{as:"organism_result_texts",foreignKey:"parent_id"}),Rt.belongsTo(Dt,{as:"parent",foreignKey:"parent_id"}),Dt.hasMany(Rt,{as:"organism_targets",foreignKey:"parent_id"}),Gt.belongsTo(Dt,{as:"id_organism",foreignKey:"id"}),Dt.hasOne(Gt,{as:"percent_ratio_organism",foreignKey:"id"}),Ct.belongsTo(Dt,{as:"id_organism",foreignKey:"id"}),Dt.hasOne(Ct,{as:"quant1_organism",foreignKey:"id"}),Xt.belongsTo(Dt,{as:"parent",foreignKey:"parent_id"}),Dt.hasMany(Xt,{as:"result_evaluators",foreignKey:"parent_id"}),aa.belongsTo(Dt,{as:"id_organism",foreignKey:"id"}),Dt.hasOne(aa,{as:"target_based_organism",foreignKey:"id"}),et.belongsTo(wt,{as:"id_organism_result",foreignKey:"id"}),wt.hasOne(et,{as:"genotyping_organism_result",foreignKey:"id"}),dt.belongsTo(wt,{as:"id_organism_result",foreignKey:"id"}),wt.hasOne(dt,{as:"lda_organism_result",foreignKey:"id"}),bt.belongsTo(wt,{as:"id_organism_result",foreignKey:"id"}),wt.hasOne(bt,{as:"organism_based_organism_result",foreignKey:"id"}),vt.belongsTo(wt,{as:"id_organism_result",foreignKey:"id"}),wt.hasOne(vt,{as:"percent_ratio_organism_result",foreignKey:"id"}),Kt.belongsTo(wt,{as:"id_organism_result",foreignKey:"id"}),wt.hasOne(Kt,{as:"quant1_organism_result",foreignKey:"id"}),Tt.belongsTo(ht,{as:"patient",foreignKey:"patient_id"}),ht.hasMany(Tt,{as:"lis_test_orders",foreignKey:"patient_id"}),la.belongsTo(ht,{as:"patient",foreignKey:"patient_id"}),ht.hasMany(la,{as:"tests",foreignKey:"patient_id"}),kt.belongsTo(Ct,{as:"parent",foreignKey:"parent_id"}),Ct.hasMany(kt,{as:"quant_unit_settings",foreignKey:"parent_id"}),jt.belongsTo(Kt,{as:"parent",foreignKey:"parent_id"}),Kt.hasMany(jt,{as:"quant1_results",foreignKey:"parent_id"}),jt.belongsTo(kt,{as:"quant_unit_setting",foreignKey:"quant_unit_setting_id"}),kt.hasMany(jt,{as:"quant1_results",foreignKey:"quant_unit_setting_id"}),St.belongsTo(Bt,{as:"id_reagent_lot",foreignKey:"id"}),Bt.hasOne(St,{as:"percent_ratio_reagent_lot",foreignKey:"id"}),xt.belongsTo(Bt,{as:"id_reagent_lot",foreignKey:"id"}),Bt.hasOne(xt,{as:"quant1_reagent_lot",foreignKey:"id"}),$t.belongsTo(Bt,{as:"parent",foreignKey:"parent_id"}),Bt.hasMany($t,{as:"sample_settings",foreignKey:"parent_id"}),Vt.belongsTo(Xt,{as:"parent",foreignKey:"parent_id"}),Xt.hasMany(Vt,{as:"result_rule_analytes",foreignKey:"parent_id"}),zt.belongsTo(Vt,{as:"id_result_rule_analyte",foreignKey:"id"}),Vt.hasOne(zt,{as:"result_rule_interpretation",foreignKey:"id"}),Jt.belongsTo(Vt,{as:"id_result_rule_analyte",foreignKey:"id"}),Vt.hasOne(Jt,{as:"result_rule_melt_peak",foreignKey:"id"}),Pt.belongsTo($t,{as:"id_sample_setting",foreignKey:"id"}),$t.hasOne(Pt,{as:"percent_ratio_sample_setting",foreignKey:"id"}),qt.belongsTo($t,{as:"id_sample_setting",foreignKey:"id"}),$t.hasOne(qt,{as:"quant1_sample_setting",foreignKey:"id"}),a.belongsTo(la,{as:"parent",foreignKey:"parent_id"}),la.hasMany(a,{as:"analyte_results",foreignKey:"parent_id"}),st.belongsTo(la,{as:"parent",foreignKey:"parent_id"}),la.hasMany(st,{as:"haplotype_results",foreignKey:"parent_id"}),Tt.belongsTo(la,{as:"test",foreignKey:"test_id"}),la.hasMany(Tt,{as:"lis_test_orders",foreignKey:"test_id"}),Nt.belongsTo(la,{as:"test",foreignKey:"test_id"}),la.hasMany(Nt,{as:"lis_uploads",foreignKey:"test_id"}),wt.belongsTo(la,{as:"parent",foreignKey:"parent_id"}),la.hasMany(wt,{as:"organism_results",foreignKey:"parent_id"}),la.belongsTo(la,{as:"parent",foreignKey:"parent_id"}),la.hasMany(la,{as:"tests",foreignKey:"parent_id"}),ia.belongsTo(la,{as:"test",foreignKey:"test_id"}),la.hasOne(ia,{as:"test_data",foreignKey:"test_id"}),ra.belongsTo(la,{as:"parent",foreignKey:"parent_id"}),la.hasMany(ra,{as:"test_errors",foreignKey:"parent_id"}),pa.belongsTo(la,{as:"parent",foreignKey:"parent_id"}),la.hasMany(pa,{as:"test_histories",foreignKey:"parent_id"}),ua.belongsTo(la,{as:"test",foreignKey:"test_id"}),la.hasMany(ua,{as:"test_nvs",foreignKey:"test_id"}),na.belongsTo(sa,{as:"test_blog",foreignKey:"test_blog_id"}),sa.hasMany(na,{as:"test_blog_counters",foreignKey:"test_blog_id"}),Ue.belongsTo(ia,{as:"parent",foreignKey:"parent_id"}),ia.hasMany(Ue,{as:"channel_raw_data",foreignKey:"parent_id"}),Ft.belongsTo(ia,{as:"parent",foreignKey:"parent_id"}),ia.hasMany(Ft,{as:"raw_data_items",foreignKey:"parent_id"}),oa.belongsTo(ia,{as:"parent",foreignKey:"parent_id"}),ia.hasMany(oa,{as:"test_data_errors",foreignKey:"parent_id"}),Ke.belongsTo(ya,{as:"user",foreignKey:"user_id"}),ya.hasMany(Ke,{as:"assays",foreignKey:"user_id"}),$e.belongsTo(ya,{as:"user",foreignKey:"user_id"}),ya.hasMany($e,{as:"disabled_modules",foreignKey:"user_id"}),la.belongsTo(ya,{as:"user",foreignKey:"user_id"}),ya.hasMany(la,{as:"tests",foreignKey:"user_id"}),pa.belongsTo(ya,{as:"user",foreignKey:"user_id"}),ya.hasMany(pa,{as:"test_histories",foreignKey:"user_id"}),{Analyte:t,AnalyteResult:a,Assay:Ke,AssayChamber:xe,AssayPosition:je,BasicOrganism:qe,Cartridge:ke,CartridgeType:Fe,Chamber:Be,ChannelProcessedDataItem:Qe,ChannelRawDatum:Ue,ChannelRawDataItem:He,ColorDisclaimer:Xe,Config:Ve,CrosstalkCorrResult:ze,DeltaCtOrganism:Je,DisabledModule:$e,GenotypingAssay:Ye,GenotypingHaplotypeOrganism:We,GenotypingOrganism:Ze,GenotypingOrganismResult:et,GraphSetup:tt,GraphSetupAssay:at,Haplotype:lt,HaplotypeResult:st,HaplotypeResultText:nt,Instrument:it,LdaAnalyte:ot,LdaAssay:rt,LdaCoefficient:pt,LdaOrganism:ut,LdaOrganismResult:dt,LisAssayConfig:yt,LisGenotypingAssayConfig:_t,LisHaplotypeConfig:mt,LisOrganismConfig:ct,LisTestOrder:Tt,LisUpload:Nt,MeltPeakResult:gt,MeltPeakSetting:ft,Organism:Dt,OrganismBasedAssay:Et,OrganismBasedOrganismResult:bt,OrganismResult:wt,OrganismResultText:It,OrganismTarget:Rt,Path:Ot,Patient:ht,PercentRatioAssay:Mt,PercentRatioOrganism:Gt,PercentRatioOrganismResult:vt,PercentRatioReagentLot:St,PercentRatioResultEvaluator:At,PercentRatioSampleSetting:Pt,Quant1Assay:Lt,Quant1Organism:Ct,Quant1OrganismResult:Kt,Quant1ReagentLot:xt,Quant1Result:jt,Quant1SampleSetting:qt,QuantUnitSetting:kt,RawDataItem:Ft,ReagentLot:Bt,ReportGraphSetting:Qt,Reporter:Ut,ResultCalculation:Ht,ResultEvaluator:Xt,ResultRuleAnalyte:Vt,ResultRuleInterpretation:zt,ResultRuleMeltPeak:Jt,SampleSetting:$t,SampleType:Yt,SelectedQuantUnitSetting:Wt,SemiQuantOrganism:Zt,SystemLog:ea,TargetBasedAssay:ta,TargetBasedOrganism:aa,Test:la,TestBlog:sa,TestBlogCounter:na,TestDatum:ia,TestDataError:oa,TestError:ra,TestHistory:pa,TestNv:ua,UserPrivilege:da,User:ya}}},7324:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Instrument=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Instrument",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},mac_address:{type:l.DataTypes.BLOB,allowNull:!0},serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},letter_offset:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"instrument",schema:"dbo",timestamps:!1,indexes:[{name:"PK__instrume__3213E83F1D5A460D",unique:!0,fields:[{name:"id"}]},{name:"UX_instrument_letteroffset",unique:!0,fields:[{name:"letter_offset"}]},{name:"UX_instrument_macaddress",unique:!0,fields:[{name:"mac_address"}]},{name:"UX_instrument_serialnumber",unique:!0,fields:[{name:"serial_number"}]}]})}}t.Instrument=s},2673:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaAnalyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaAnalyte",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"analyte",key:"id"}},cycle_if_no_ct:{type:l.DataTypes.INTEGER,allowNull:!1},min_ct_req_pass_controls:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"lda_analyte",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_anal__3213E83F29F9EB12",unique:!0,fields:[{name:"id"}]}]})}}t.LdaAnalyte=s},7425:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaAssay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"lda_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_assa__3213E83F59A52308",unique:!0,fields:[{name:"id"}]}]})}}t.LdaAssay=s},5710:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaCoefficient=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaCoefficient",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"lda_organism",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!1},delta_ct_coefficient:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"lda_coefficient",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_coef__3213E83F72D43F1D",unique:!0,fields:[{name:"id"}]}]})}}t.LdaCoefficient=s},4741:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},lda_total:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"lda_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_orga__3213E83F380F55A4",unique:!0,fields:[{name:"id"}]}]})}}t.LdaOrganismResult=s},7110:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LdaOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LdaOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},cutoff:{type:l.DataTypes.FLOAT,allowNull:!1},intercept:{type:l.DataTypes.FLOAT,allowNull:!1},max_valid_range:{type:l.DataTypes.FLOAT,allowNull:!1},min_valid_range:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"lda_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lda_orga__3213E83F8614FDA0",unique:!0,fields:[{name:"id"}]}]})}}t.LdaOrganism=s},3179:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisAssayConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisAssayConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},test_code:{type:l.DataTypes.STRING(15),allowNull:!0},test_code_enabled:{type:l.DataTypes.BOOLEAN,allowNull:!0}},{tableName:"lis_assay_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_assa__3213E83F3C29870A",unique:!0,fields:[{name:"id"}]}]})}}t.LisAssayConfig=s},4810:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisGenotypingAssayConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisGenotypingAssayConfig",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"lis_assay_config",key:"id"}}},{tableName:"lis_genotyping_assay_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_geno__3213E83FEC5A20DB",unique:!0,fields:[{name:"id"}]}]})}}t.LisGenotypingAssayConfig=s},1219:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisHaplotypeConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisHaplotypeConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1},haplotype_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"haplotype",key:"id"}},result_code:{type:l.DataTypes.STRING(15),allowNull:!0}},{tableName:"lis_haplotype_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_hapl__3213E83FC2F71408",unique:!0,fields:[{name:"id"}]}]})}}t.LisHaplotypeConfig=s},2855:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisOrganismConfig=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisOrganismConfig",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1},organism_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},result_code:{type:l.DataTypes.STRING(15),allowNull:!0}},{tableName:"lis_organism_config",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_orga__3213E83F2F292B05",unique:!0,fields:[{name:"id"}]}]})}}t.LisOrganismConfig=s},7519:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisTestOrder=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisTestOrder",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},host_test_code:{type:l.DataTypes.STRING(15),allowNull:!0},instrument_specific_sample_id:{type:l.DataTypes.STRING(64),allowNull:!0},order_status:{type:l.DataTypes.INTEGER,allowNull:!1},patient_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"patient",key:"id"}},priority:{type:l.DataTypes.INTEGER,allowNull:!1},sample_id:{type:l.DataTypes.STRING(25),allowNull:!0},cartridge_id:{type:l.DataTypes.STRING(25),allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test",key:"id"}}},{tableName:"lis_test_order",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_test__3213E83FF0E2345C",unique:!0,fields:[{name:"id"}]},{name:"UX_listestorder_testid",unique:!0,fields:[{name:"test_id"}]}]})}}t.LisTestOrder=s},8608:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LisUpload=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("LisUpload",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},test_order_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"lis_test_order",key:"id"}},upload_message_id:{type:l.DataTypes.STRING(64),allowNull:!0},upload_status:{type:l.DataTypes.INTEGER,allowNull:!1},sample_priority:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"lis_upload",schema:"dbo",timestamps:!1,indexes:[{name:"PK__lis_uplo__3213E83F0EA9D7BF",unique:!0,fields:[{name:"id"}]},{name:"UX_lis_upload_test_id",unique:!0,fields:[{name:"test_id"}]}]})}}t.LisUpload=s},4298:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte_result",key:"id"}},peak_height:{type:l.DataTypes.FLOAT,allowNull:!1},peak_index:{type:l.DataTypes.INTEGER,allowNull:!1},peak_temperature:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"melt_peak_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_melt_peak_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__melt_pea__3213E83E1FE51EFB",unique:!0,fields:[{name:"id"}]}]})}}t.MeltPeakResult=s},630:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MeltPeakSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("MeltPeakSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"analyte",key:"id"}},slope_positive:{type:l.DataTypes.BOOLEAN,allowNull:!1},baseline_look_back:{type:l.DataTypes.FLOAT,allowNull:!1},baseline_num_points:{type:l.DataTypes.INTEGER,allowNull:!1},baseline_start_temp:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_max:{type:l.DataTypes.FLOAT,allowNull:!1},peak_range_min:{type:l.DataTypes.FLOAT,allowNull:!1},peak_threshold:{type:l.DataTypes.FLOAT,allowNull:!1},points_around_peak:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"melt_peak_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__melt_pea__3213E83FBAF87862",unique:!0,fields:[{name:"id"}]},{name:"UX_meltpeaksetting_parentid",unique:!0,fields:[{name:"parent_id"}]}]})}}t.MeltPeakSetting=s},7883:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismBasedAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismBasedAssay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"organism_based_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83F210E91DF",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismBasedAssay=s},1122:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismBasedOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismBasedOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},semi_quant_level:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"organism_based_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83FBBF8D3EA",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismBasedOrganismResult=s},6321:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResultText=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResultText",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},result_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_key:{type:l.DataTypes.STRING(8),allowNull:!1},result_text:{type:l.DataTypes.INTEGER,allowNull:!1},text_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"organism_result_text",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83FF9BBD424",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismResultText=s},9668:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismResult",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},organism_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"organism",key:"id"}},result_text:{type:l.DataTypes.INTEGER,allowNull:!1},result_color:{type:l.DataTypes.INTEGER,allowNull:!1},is_result_invalid:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_organism_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__organism__3213E83EA550B35B",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismResult=s},8476:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OrganismTarget=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("OrganismTarget",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}}},{tableName:"organism_target",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83F06D96945",unique:!0,fields:[{name:"id"}]}]})}}t.OrganismTarget=s},8374:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Organism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Organism",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},name:{type:l.DataTypes.STRING(32),allowNull:!1},organism_index:{type:l.DataTypes.INTEGER,allowNull:!1},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__organism__3213E83FE0D2FAA1",unique:!0,fields:[{name:"id"}]}]})}}t.Organism=s},5828:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Path=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Path",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"cartridge_type",key:"id"}},angular_offset:{type:l.DataTypes.FLOAT,allowNull:!1},chamber_number:{type:l.DataTypes.INTEGER,allowNull:!0},is_block:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_tube:{type:l.DataTypes.BOOLEAN,allowNull:!1},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"path",schema:"dbo",timestamps:!1,indexes:[{name:"PK__path__3213E83F3A63F5BA",unique:!0,fields:[{name:"id"}]}]})}}t.Path=s},3708:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Patient=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Patient",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},gx_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},practice_patient_id:{type:l.DataTypes.STRING(32),allowNull:!0},family_name:{type:l.DataTypes.STRING(1552),allowNull:!0},given_name:{type:l.DataTypes.STRING(240),allowNull:!0},middle_name:{type:l.DataTypes.STRING(240),allowNull:!0},date_of_birth:{type:l.DataTypes.STRING(96),allowNull:!0},gender:{type:l.DataTypes.STRING(128),allowNull:!0},ethnicity:{type:l.DataTypes.STRING(512),allowNull:!0},postal_code:{type:l.DataTypes.STRING(96),allowNull:!0}},{tableName:"patient",schema:"dbo",timestamps:!1,indexes:[{name:"PK__patient__3213E83F500DEB6B",unique:!0,fields:[{name:"id"}]}]})}}t.Patient=s},9913:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioAssay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"percent_ratio_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F68A8D83F",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioAssay=s},9169:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioOrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioOrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}},ratio_percent:{type:l.DataTypes.FLOAT,allowNull:!0},log_transform:{type:l.DataTypes.FLOAT,allowNull:!0},reporting_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},calculation_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},detailed_result:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"percent_ratio_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F8DCBBE5A",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioOrganismResult=s},2232:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},dynamic_range_max:{type:l.DataTypes.FLOAT,allowNull:!1},dynamic_range_min:{type:l.DataTypes.FLOAT,allowNull:!1},lod_loq:{type:l.DataTypes.FLOAT,allowNull:!1},log_transform_type:{type:l.DataTypes.INTEGER,allowNull:!1},units:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"percent_ratio_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F1C1399B7",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioOrganism=s},894:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioReagentLot",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"reagent_lot",key:"id"}}},{tableName:"percent_ratio_reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F295E59AE",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioReagentLot=s},7363:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioResultEvaluator=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioResultEvaluator",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},calculation_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},reporting_target_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}}},{tableName:"percent_ratio_result_evaluator",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83F0102494E",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioResultEvaluator=s},2026:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PercentRatioSampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("PercentRatioSampleSetting",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"sample_setting",key:"id"}},delta_ct_efficiency:{type:l.DataTypes.FLOAT,allowNull:!0},scaling_factor:{type:l.DataTypes.DECIMAL(5,2),allowNull:!0}},{tableName:"percent_ratio_sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__percent___3213E83FACBB9456",unique:!0,fields:[{name:"id"}]}]})}}t.PercentRatioSampleSetting=s},9250:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1Assay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1Assay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"quant1_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_a__3213E83FFBCA71DA",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1Assay=s},5021:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1OrganismResult=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1OrganismResult",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism_result",key:"id"}}},{tableName:"quant1_organism_result",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_o__3213E83F4ADBB366",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1OrganismResult=s},3739:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1Organism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1Organism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}},max_quantitative_delta:{type:l.DataTypes.FLOAT,allowNull:!0}},{tableName:"quant1_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_o__3213E83F760E8E2C",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1Organism=s},6693:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1ReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1ReagentLot",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"reagent_lot",key:"id"}}},{tableName:"quant1_reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_r__3213E83FD7043653",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1ReagentLot=s},2949:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1Result=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1Result",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"quant1_organism_result",key:"id"}},quantitative_result:{type:l.DataTypes.FLOAT,allowNull:!0},quant_unit_setting_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"quant_unit_setting",key:"id"}},result_abnormal_flag:{type:l.DataTypes.STRING(5),allowNull:!0}},{tableName:"quant1_result",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_quant1_result_parent_id",fields:[{name:"parent_id"}]},{name:"PK__quant1_r__3213E83E904FF5F0",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1Result=s},3664:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Quant1SampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Quant1SampleSetting",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"sample_setting",key:"id"}},e0:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},e1:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0},e2:{type:l.DataTypes.DECIMAL(38,5),allowNull:!0}},{tableName:"quant1_sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant1_s__3213E83F2C81C938",unique:!0,fields:[{name:"id"}]}]})}}t.Quant1SampleSetting=s},1747:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.QuantUnitSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("QuantUnitSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"quant1_organism",key:"id"}},conversion_factor:{type:l.DataTypes.FLOAT,allowNull:!1},display_log_value:{type:l.DataTypes.BOOLEAN,allowNull:!1},lower_limit:{type:l.DataTypes.FLOAT,allowNull:!1},position:{type:l.DataTypes.INTEGER,allowNull:!1},units:{type:l.DataTypes.INTEGER,allowNull:!1},upper_limit:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"quant_unit_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__quant_un__3213E83FE8E6C80B",unique:!0,fields:[{name:"id"}]}]})}}t.QuantUnitSetting=s},8090:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RawDataItem=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("RawDataItem",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test_data",key:"id"}},name:{type:l.DataTypes.STRING(64),allowNull:!1},data_type:{type:l.DataTypes.STRING(20),allowNull:!1},value:{type:l.DataTypes.TEXT,allowNull:!0},data:{type:l.DataTypes.BLOB,allowNull:!0},timestamps:{type:l.DataTypes.BLOB,allowNull:!0}},{tableName:"raw_data_item",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_raw_data_item_parent_id",fields:[{name:"parent_id"}]},{name:"PK__raw_data__3213E83E261626F5",unique:!0,fields:[{name:"id"}]}]})}}t.RawDataItem=s},8323:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ReagentLot=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ReagentLot",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},creation_time:{type:l.DataTypes.DATE,allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!1},reagent_lot_number:{type:l.DataTypes.STRING(3),allowNull:!1}},{tableName:"reagent_lot",schema:"dbo",timestamps:!1,indexes:[{name:"PK__reagent___3213E83F654D76BF",unique:!0,fields:[{name:"id"}]}]})}}t.ReagentLot=s},771:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ReportGraphSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ReportGraphSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}},graph_type:{type:l.DataTypes.INTEGER,allowNull:!0},param_key:{type:l.DataTypes.STRING(64),allowNull:!1},param_val:{type:l.DataTypes.STRING(512),allowNull:!0}},{tableName:"report_graph_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__report_g__3213E83F45404AE6",unique:!0,fields:[{name:"id"}]}]})}}t.ReportGraphSetting=s},200:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Reporter=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Reporter",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},concentration:{type:l.DataTypes.INTEGER,allowNull:!1},name:{type:l.DataTypes.STRING(12),allowNull:!1}},{tableName:"reporter",schema:"dbo",timestamps:!1,indexes:[{name:"PK__reporter__3213E83F8B6A21DD",unique:!0,fields:[{name:"id"}]},{name:"UX_reporter_name",unique:!0,fields:[{name:"name"}]}]})}}t.Reporter=s},4829:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultCalculation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultCalculation",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},chain_name:{type:l.DataTypes.STRING(64),allowNull:!1},name:{type:l.DataTypes.STRING(32),allowNull:!1}},{tableName:"result_calculation",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_c__3213E83FDF13CEAD",unique:!0,fields:[{name:"id"}]}]})}}t.ResultCalculation=s},1452:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultEvaluator=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultEvaluator",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"organism",key:"id"}},evaluator_index:{type:l.DataTypes.INTEGER,allowNull:!1},result_text:{type:l.DataTypes.INTEGER,allowNull:!1},rule_anded:{type:l.DataTypes.BOOLEAN,allowNull:!1},text_color:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"result_evaluator",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_e__3213E83F523A8A97",unique:!0,fields:[{name:"id"}]}]})}}t.ResultEvaluator=s},1093:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultRuleAnalyte=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultRuleAnalyte",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"result_evaluator",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},rule_index:{type:l.DataTypes.INTEGER,allowNull:!1},rule_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"result_rule_analyte",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_r__3213E83F54E0B232",unique:!0,fields:[{name:"id"}]}]})}}t.ResultRuleAnalyte=s},3271:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultRuleInterpretation=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultRuleInterpretation",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"result_rule_analyte",key:"id"}},interpretation:{type:l.DataTypes.INTEGER,allowNull:!1},pass_on_equals:{type:l.DataTypes.BOOLEAN,allowNull:!1},reasons:{type:l.DataTypes.STRING(50),allowNull:!0}},{tableName:"result_rule_interpretation",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_r__3213E83FB046073F",unique:!0,fields:[{name:"id"}]}]})}}t.ResultRuleInterpretation=s},3745:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ResultRuleMeltPeak=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("ResultRuleMeltPeak",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"result_rule_analyte",key:"id"}},pass_on_peak:{type:l.DataTypes.BOOLEAN,allowNull:!1}},{tableName:"result_rule_melt_peak",schema:"dbo",timestamps:!1,indexes:[{name:"PK__result_r__3213E83FCFD26AA9",unique:!0,fields:[{name:"id"}]}]})}}t.ResultRuleMeltPeak=s},6709:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"reagent_lot",key:"id"}},analyte_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"analyte",key:"id"}},ct_threshold_value:{type:l.DataTypes.FLOAT,allowNull:!1},end_pt_threshold:{type:l.DataTypes.INTEGER,allowNull:!1},min_delta_ct:{type:l.DataTypes.FLOAT,allowNull:!1},normalization_factor:{type:l.DataTypes.INTEGER,allowNull:!1},peak_height_min:{type:l.DataTypes.FLOAT,allowNull:!1},probe_chk_delta:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_high_max:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_high_min:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_low_max:{type:l.DataTypes.INTEGER,allowNull:!1},probe_chk_low_min:{type:l.DataTypes.INTEGER,allowNull:!1},use_endpoint:{type:l.DataTypes.BOOLEAN,allowNull:!1},use_min_delta_ct:{type:l.DataTypes.BOOLEAN,allowNull:!1},valid_max:{type:l.DataTypes.DECIMAL(5,1),allowNull:!1},valid_min:{type:l.DataTypes.DECIMAL(5,1),allowNull:!1}},{tableName:"sample_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__sample_s__3213E83F372020C1",unique:!0,fields:[{name:"id"}]}]})}}t.SampleSetting=s},8388:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SampleType=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SampleType",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}},sample_type_key:{type:l.DataTypes.STRING(5),allowNull:!1}},{tableName:"sample_type",schema:"dbo",timestamps:!1,indexes:[{name:"PK__sample_t__3213E83FB25BD1D4",unique:!0,fields:[{name:"id"}]}]})}}t.SampleType=s},1111:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SelectedQuantUnitSetting=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SelectedQuantUnitSetting",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},units:{type:l.DataTypes.INTEGER,allowNull:!1},assay_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"assay",key:"id"}}},{tableName:"selected_quant_unit_setting",schema:"dbo",timestamps:!1,indexes:[{name:"PK__selected__3213E83F734FFC3D",unique:!0,fields:[{name:"id"}]}]})}}t.SelectedQuantUnitSetting=s},5274:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SemiQuantOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SemiQuantOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"basic_organism",key:"id"}},delta_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1},low_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1},medium_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1},replaced_result_color:{type:l.DataTypes.INTEGER,allowNull:!1},replaced_result_text:{type:l.DataTypes.INTEGER,allowNull:!1},semi_quant_result_text:{type:l.DataTypes.INTEGER,allowNull:!1},very_low_ct_min:{type:l.DataTypes.FLOAT,allowNull:!1}},{tableName:"semi_quant_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__semi_qua__3213E83F798098BE",unique:!0,fields:[{name:"id"}]}]})}}t.SemiQuantOrganism=s},7497:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SystemLog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("SystemLog",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},details:{type:l.DataTypes.STRING(512),allowNull:!0},error_code:{type:l.DataTypes.INTEGER,allowNull:!0},error_type:{type:l.DataTypes.INTEGER,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!1},site_name:{type:l.DataTypes.CHAR(3),allowNull:!0},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"system_log",schema:"dbo",timestamps:!1,indexes:[{name:"PK__system_l__3213E83FD2152FF4",unique:!0,fields:[{name:"id"}]}]})}}t.SystemLog=s},7657:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TargetBasedAssay=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TargetBasedAssay",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"assay",key:"id"}}},{tableName:"target_based_assay",schema:"dbo",timestamps:!1,indexes:[{name:"PK__target_b__3213E83FBC5750E1",unique:!0,fields:[{name:"id"}]}]})}}t.TargetBasedAssay=s},6344:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TargetBasedOrganism=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TargetBasedOrganism",{id:{type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0,references:{model:"organism",key:"id"}}},{tableName:"target_based_organism",schema:"dbo",timestamps:!1,indexes:[{name:"PK__target_b__3213E83FD1505E40",unique:!0,fields:[{name:"id"}]}]})}}t.TargetBasedOrganism=s},4668:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlogCounter=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlogCounter",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_blog_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test_blog",key:"id"}},date_text:{type:l.DataTypes.STRING(8),allowNull:!0},test_count:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"test_blog_counter",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test_blo__3213E83F641C1761",unique:!0,fields:[{name:"id"}]},{name:"UX_testblogcounter_testblogid_datetext",unique:!0,fields:[{name:"test_blog_id"},{name:"date_text"}]}]})}}t.TestBlogCounter=s},806:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestBlog=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestBlog",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}}},{tableName:"test_blog",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test_blo__3213E83FB1125CAD",unique:!0,fields:[{name:"id"}]},{name:"UX_testblog_assayid",unique:!0,fields:[{name:"assay_id"}]}]})}}t.TestBlog=s},1257:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestDataError=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestDataError",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test_data",key:"id"}},code:{type:l.DataTypes.INTEGER,allowNull:!1},details:{type:l.DataTypes.STRING(512),allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!1},param1:{type:l.DataTypes.FLOAT,allowNull:!0},param2:{type:l.DataTypes.FLOAT,allowNull:!0},param3:{type:l.DataTypes.FLOAT,allowNull:!0},param4:{type:l.DataTypes.FLOAT,allowNull:!0},severity:{type:l.DataTypes.INTEGER,allowNull:!1},site_state:{type:l.DataTypes.INTEGER,allowNull:!1},step_number:{type:l.DataTypes.INTEGER,allowNull:!1},text_param:{type:l.DataTypes.STRING(64),allowNull:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_data_error",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_data_error_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_dat__3213E83E1B49E848",unique:!0,fields:[{name:"id"}]}]})}}t.TestDataError=s},4114:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestDatum=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestDatum",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test",key:"id"}},datagram_format:{type:l.DataTypes.INTEGER,allowNull:!0},end_time:{type:l.DataTypes.DATE,allowNull:!0},error_status:{type:l.DataTypes.INTEGER,allowNull:!1},fw_version:{type:l.DataTypes.STRING(12),allowNull:!0},icore_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},instrument_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},site_name:{type:l.DataTypes.STRING(512),allowNull:!0},site_serial_number:{type:l.DataTypes.INTEGER,allowNull:!0},start_time:{type:l.DataTypes.DATE,allowNull:!0},state:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_data",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_data_test_id",fields:[{name:"test_id"}]},{name:"PK__test_dat__3213E83EF0E87FE5",unique:!0,fields:[{name:"id"}]},{name:"UX_testdata_testid",unique:!0,fields:[{name:"test_id"}]}]})}}t.TestDatum=s},9067:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestError=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestError",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},code:{type:l.DataTypes.INTEGER,allowNull:!1},details:{type:l.DataTypes.STRING(512),allowNull:!0},log_time:{type:l.DataTypes.DATE,allowNull:!1},param1:{type:l.DataTypes.FLOAT,allowNull:!0},param2:{type:l.DataTypes.FLOAT,allowNull:!0},param3:{type:l.DataTypes.FLOAT,allowNull:!0},param4:{type:l.DataTypes.FLOAT,allowNull:!0},severity:{type:l.DataTypes.INTEGER,allowNull:!1},text_param:{type:l.DataTypes.STRING(64),allowNull:!0},type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_error",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_error_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_err__3213E83E23C2502B",unique:!0,fields:[{name:"id"}]}]})}}t.TestError=s},7595:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestHistory=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestHistory",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},parent_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},creation_time:{type:l.DataTypes.DATE,allowNull:!1},field_name:{type:l.DataTypes.STRING(32),allowNull:!1},new_content:{type:l.DataTypes.STRING(512),allowNull:!0},old_content:{type:l.DataTypes.STRING(512),allowNull:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"users",key:"id"}}},{tableName:"test_history",schema:"dbo",timestamps:!1,indexes:[{name:"INDEX_test_history_parent_id",fields:[{name:"parent_id"}]},{name:"PK__test_his__3213E83ED52A9142",unique:!0,fields:[{name:"id"}]}]})}}t.TestHistory=s},2200:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TestNv=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("TestNv",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},test_id:{type:l.DataTypes.INTEGER,allowNull:!1,references:{model:"test",key:"id"}},archived:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"test_nv",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test_nv__3213E83F55A45015",unique:!0,fields:[{name:"id"}]},{name:"UX_testnv_testid",unique:!0,fields:[{name:"test_id"}]}]})}}t.TestNv=s},6676:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Test=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("Test",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},result_text_type:{type:l.DataTypes.INTEGER,allowNull:!0},assay_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"assay",key:"id"}},parent_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"test",key:"id"}},is_current_test:{type:l.DataTypes.BOOLEAN,allowNull:!0},cartridge_barcode:{type:l.DataTypes.STRING(1024),allowNull:!0},cart_serial_number:{type:l.DataTypes.BIGINT,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},data_reduction_algorithm:{type:l.DataTypes.INTEGER,allowNull:!0},error_status:{type:l.DataTypes.INTEGER,allowNull:!1},expiration_date:{type:l.DataTypes.DATE,allowNull:!0},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_scanned_patient_id:{type:l.DataTypes.BOOLEAN,allowNull:!0},is_scanned_sample_id:{type:l.DataTypes.BOOLEAN,allowNull:!0},modification_time:{type:l.DataTypes.DATE,allowNull:!0},notes:{type:l.DataTypes.STRING(512),allowNull:!0},order_time:{type:l.DataTypes.DATE,allowNull:!0},other_sample_type_text:{type:l.DataTypes.STRING(32),allowNull:!0},legacy_result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_text:{type:l.DataTypes.TEXT,allowNull:!0},result_color:{type:l.DataTypes.TEXT,allowNull:!0},rgt_lot_id:{type:l.DataTypes.STRING(6),allowNull:!0},sample_id:{type:l.DataTypes.STRING(25),allowNull:!0},sample_type_key:{type:l.DataTypes.STRING(24),allowNull:!0},sw_version:{type:l.DataTypes.STRING(16),allowNull:!0},user_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"users",key:"id"}},patient_id:{type:l.DataTypes.INTEGER,allowNull:!0,references:{model:"patient",key:"id"}},test_type:{type:l.DataTypes.INTEGER,allowNull:!0}},{tableName:"test",schema:"dbo",timestamps:!1,indexes:[{name:"PK__test__3213E83F20BD5504",unique:!0,fields:[{name:"id"}]},{name:"UX_test_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.Test=s},8803:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UserPrivilege=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("UserPrivilege",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},privilege_name:{type:l.DataTypes.STRING(64),allowNull:!1},user_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"user_privilege",schema:"dbo",timestamps:!1,indexes:[{name:"PK__user_pri__3213E83FB86800A5",unique:!0,fields:[{name:"id"}]}]})}}t.UserPrivilege=s},9005:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.User=void 0;const l=a(496);class s extends l.Model{static initModel(e){return e.define("User",{id:{autoIncrement:!0,type:l.DataTypes.INTEGER,allowNull:!1,primaryKey:!0},version:{type:l.DataTypes.INTEGER,allowNull:!0},creation_time:{type:l.DataTypes.DATE,allowNull:!0},full_name:{type:l.DataTypes.STRING(128),allowNull:!1},guid:{type:l.DataTypes.STRING(64),allowNull:!1},is_active:{type:l.DataTypes.BOOLEAN,allowNull:!1},is_hidden:{type:l.DataTypes.BOOLEAN,allowNull:!1},login_name:{type:l.DataTypes.STRING(32),allowNull:!1},modification_time:{type:l.DataTypes.DATE,allowNull:!0},password:{type:l.DataTypes.STRING(256),allowNull:!1},user_type:{type:l.DataTypes.INTEGER,allowNull:!1}},{tableName:"users",schema:"dbo",timestamps:!1,indexes:[{name:"PK__users__3213E83FFBF72FFA",unique:!0,fields:[{name:"id"}]},{name:"UX_users_guid",unique:!0,fields:[{name:"guid"}]}]})}}t.User=s},3153:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.triggerLabSelection=t.triggerRegistration=t.saveLab=t.fetchLabs=void 0;const l=a(7104),s=a(7632),n=a(8969),i=a(7219),o=a(9968);function r(e){return(0,o.update)("lab",e)}t.fetchLabs=function(e){return s.backendClient.get(`/labs?${(0,l.stringify)({field:"name",order:"ASC",perPage:100,filter:{search:{name:e}}})}`).then((e=>e.data.data))},t.saveLab=r,t.triggerRegistration=function(){return(0,o.get)("registration_token").then((e=>e?Promise.resolve():(0,n.registerDevice)())).catch((e=>{var t;return i.logger.info(null===(t=null==e?void 0:e.response)||void 0===t?void 0:t.config)}))},t.triggerLabSelection=function(){return(0,o.get)("lab").then((e=>e?Promise.resolve():s.backendClient.get("/labs/current").then((e=>e.data)).then((e=>r(e))).catch((e=>{var t,a;404===(null===(t=e.response)||void 0===t?void 0:t.status)&&(null===(a=process.send)||void 0===a||a.call(process,{type:"trigger-lab-selection"}))}))))}},7219:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.logger=void 0;const s=l(a(8857));t.logger=s.default},6392:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,o)}r((l=l.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),a(4804);const s=a(3827),n=a(7219),i=a(1415),o=a(5670),r=a(3695),p=a(5232),u=a(3557),d=a(653),y=a(5222),_=a(8626),m=(0,s.createSyncWorker)();function c(){return(0,i.createGeneXpertClient)().then((e=>{const t=[["tests",10],["logs",20]].map((([t,a])=>(0,_.throttled)((0,u.createGeneXpertPusher)(t,a,e),_.isAssigned)));return[(0,_.throttled)((()=>(0,d.updateServerStatus)(e)),(0,_.interval)(1)),...t]}))}function T(){const e=new o.SqliteClient(r.sqliteModels);return Promise.resolve([["requests",10],["calibrations",1],["stock",10],["maintenance",1],["status",10],["monthlySummary",1],["dailySummary",10],["eqaSummary",1]].map((([t,a])=>(0,_.throttled)((0,u.createSqlitePusher)(e,t,a),_.isAssigned))))}function N(){const e=new y.ServerSyncClient(r.sqliteModels);return Promise.resolve(["facilities","stockitems","stockledger","servicerequests","users"].map((t=>(0,_.throttled)((0,u.createServerPusher)(e,t,200),_.isAssigned))))}function g(){console.log("autoApproveRequestJob");const e=[(0,_.throttled)((()=>l(this,void 0,void 0,(function*(){return(0,d.autoApproveRequests)()}))),(0,_.interval)(1))];return Promise.resolve([...e])}(0,p.ensureDeviceIsRegistered)().then((()=>m.addFromGetters([c,T,N,g]))).catch((e=>{n.logger.error(e),process.exit(1)}))},5232:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ensureDeviceIsRegistered=void 0;const l=a(8670),s=a(7219),n=a(9968);t.ensureDeviceIsRegistered=function e(){return(0,n.get)("registration_token").then((t=>{if(!t)return s.logger.info("device is not registered"),(0,l.setTimeout)(5e3).then((()=>e()))}))}},5670:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SqliteClient=void 0;const l=a(9634),s=a(496);t.SqliteClient=class{constructor(e){this.models=e}relaylogsTotal(){return this.models.Log.count()}requestsTotal(){return this.models.Request.count()}calibrationsTotal(){return this.models.CalibrationSummary.count()}stockTotal(){return this.models.InventoryEntry.count()}maintenanceTotal(){return this.models.ServiceRequest.count({where:{remoteId:{[s.Op.is]:null}}})}statusTotal(){return this.models.GeneXpertStatus.count()}dailySummaryTotal(){return this.models.DailySummary.count()}monthlySummaryTotal(){return this.models.MonthlySummary.count()}eqaSummaryTotal(){return this.models.EqaSummary.count()}relaylogsPresyncables(e,t,a){return this.models.Log.findAll({where:{[s.Op.or]:[{updatedAt:{[s.Op.gt]:e}},{updatedAt:{[s.Op.eq]:e},id:{[s.Op.notIn]:t}}]},attributes:["id","updatedAt"],limit:a}).then((e=>e.map((e=>({id:e.id.toString(),modified:e.updatedAt})))))}requestsPresyncables(e,t,a){return this.models.Request.findAll({where:{[s.Op.or]:[{updatedAt:{[s.Op.gt]:e}},{updatedAt:{[s.Op.eq]:e},id:{[s.Op.notIn]:t}}]},attributes:["id","updatedAt"],limit:a}).then((e=>e.map((e=>({id:e.id.toString(),modified:e.updatedAt})))))}calibrationsPresyncables(e,t,a){return this.models.CalibrationSummary.findAll({where:{[s.Op.or]:[{updatedAt:{[s.Op.gt]:e}},{updatedAt:{[s.Op.eq]:e},id:{[s.Op.notIn]:t}}]},attributes:["id","updatedAt"],limit:a}).then((e=>e.map((e=>({id:e.id.toString(),modified:e.updatedAt})))))}stockPresyncables(e,t,a){return this.models.InventoryEntry.findAll({where:{[s.Op.or]:[{updatedAt:{[s.Op.gt]:e}},{updatedAt:{[s.Op.eq]:e},id:{[s.Op.notIn]:t}}]},attributes:["id","updatedAt"],limit:a}).then((e=>e.map((e=>({id:e.id.toString(),modified:e.updatedAt})))))}maintenancePresyncables(e,t,a){return this.models.ServiceRequest.findAll({where:{remoteId:{[s.Op.is]:null},[s.Op.or]:[{updatedAt:{[s.Op.gt]:e}},{updatedAt:{[s.Op.eq]:e},id:{[s.Op.notIn]:t}}]},attributes:["id","createdAt"],limit:a}).then((e=>e.map((e=>({id:e.id.toString(),modified:e.createdAt})))))}statusPresyncables(e,t,a){return this.models.GeneXpertStatus.findAll({where:{[s.Op.or]:[{updatedAt:{[s.Op.gt]:e}},{updatedAt:{[s.Op.eq]:e},id:{[s.Op.notIn]:t}}]},attributes:["id","createdAt"],limit:a}).then((e=>e.map((e=>({id:e.id.toString(),modified:e.createdAt})))))}dailySummaryPresyncables(e,t,a){return this.models.DailySummary.findAll({where:{[s.Op.or]:[{createdAt:{[s.Op.gt]:e}},{createdAt:{[s.Op.eq]:e},id:{[s.Op.notIn]:t}}]},attributes:["id","createdAt"],limit:a}).then((e=>e.map((e=>({id:e.id.toString(),modified:e.createdAt})))))}monthlySummaryPresyncables(e,t,a){return this.models.MonthlySummary.findAll({where:{[s.Op.or]:[{createdAt:{[s.Op.gt]:e}},{createdAt:{[s.Op.eq]:e},id:{[s.Op.notIn]:t}}]},attributes:["id","createdAt"],limit:a}).then((e=>e.map((e=>({id:e.id.toString(),modified:e.createdAt})))))}eqaSummaryPresyncables(e,t,a){return this.models.EqaSummary.findAll({where:{[s.Op.or]:[{createdAt:{[s.Op.gt]:e}},{createdAt:{[s.Op.eq]:e},id:{[s.Op.notIn]:t}}]},attributes:["id","createdAt"],limit:a}).then((e=>e.map((e=>({id:e.id.toString(),modified:e.createdAt})))))}relaylogsSyncables(e){return this.models.Log.findAll({where:{id:{[s.Op.in]:e}}}).then((0,l.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}requestsSyncables(e){return this.models.Request.findAll({where:{id:{[s.Op.in]:e}}}).then((0,l.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}calibrationsSyncables(e){return this.models.CalibrationSummary.findAll({where:{id:{[s.Op.in]:e}}}).then((0,l.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}stockSyncables(e){return this.models.InventoryEntry.findAll({where:{id:{[s.Op.in]:e}},include:[{as:"item",model:this.models.InventoryItem}]}).then((0,l.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}maintenanceSyncables(e){return this.models.ServiceRequest.findAll({where:{id:{[s.Op.in]:e}}}).then((0,l.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id}))))}statusSyncables(e){return this.models.GeneXpertStatus.findAll({where:{id:{[s.Op.in]:e}}}).then((0,l.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id}))))}dailySummarySyncables(e){return this.models.DailySummary.findAll({where:{id:{[s.Op.in]:e}}}).then((0,l.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}monthlySummarySyncables(e){return this.models.MonthlySummary.findAll({where:{id:{[s.Op.in]:e}}}).then((0,l.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}eqaSummarySyncables(e){return this.models.EqaSummary.findAll({where:{id:{[s.Op.in]:e}}}).then((0,l.map)((e=>Object.assign(Object.assign({},e.toJSON()),{id:e.id.toString()}))))}}},4639:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CalibrationSummary=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.INTEGER,primaryKey:!0,autoIncrement:!0},name:{type:l.DataTypes.STRING},path:{type:l.DataTypes.STRING},content:{type:l.DataTypes.STRING},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"CalibrationSummary",tableName:"CalibrationSummary"})}static associate(e){}}t.CalibrationSummary=s},7755:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ContactPerson=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.STRING,primaryKey:!0},name:{type:l.DataTypes.STRING},phone:{type:l.DataTypes.STRING},email:{type:l.DataTypes.STRING},isPrimaryContact:{type:l.DataTypes.BOOLEAN,defaultValue:!1,allowNull:!0},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"ContactPerson",tableName:"ContactPerson"})}static associate(e){}}t.ContactPerson=s},5132:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,o)}r((l=l.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.clearContactPersons=t.saveContactPersons=t.fetchContactPersons=void 0;const s=a(3695);function n(){return s.sqliteModels.ContactPerson.destroy({where:{}})}t.fetchContactPersons=function(e=null){return l(this,void 0,void 0,(function*(){return null==e?yield s.sqliteModels.ContactPerson.findAll():yield s.sqliteModels.ContactPerson.findAll({where:{isPrimaryContact:e}})}))},t.saveContactPersons=function(e){return l(this,void 0,void 0,(function*(){return yield n(),s.sqliteModels.ContactPerson.bulkCreate(e)}))},t.clearContactPersons=n},621:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DailySummary=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.INTEGER,autoIncrement:!0,primaryKey:!0},category:{type:l.DataTypes.STRING,allowNull:!1},numberOfSamplesReceived:{type:l.DataTypes.INTEGER,allowNull:!0},numberOfSamplesDone:{type:l.DataTypes.INTEGER,allowNull:!0},numberOfBacklogSamples:{type:l.DataTypes.INTEGER,allowNull:!0},numberOfRejectedSamples:{type:l.DataTypes.INTEGER,allowNull:!0},numberOfTestsReferred:{type:l.DataTypes.INTEGER,allowNull:!0},numberOfReferredTestResultsReturned:{type:l.DataTypes.INTEGER,allowNull:!0},reportDate:{type:l.DataTypes.DATE,allowNull:!1},createdAt:{type:l.DataTypes.DATE,allowNull:!1},isDraft:{type:l.DataTypes.BOOLEAN,allowNull:!1,defaultValue:!0},sampleRejections:{type:l.DataTypes.JSONB,allowNull:!1,defaultValue:[]},referrals:{type:l.DataTypes.JSONB,allowNull:!1,defaultValue:{id:0,specimenType:{sputum:{total:0,returned:0},stool:{total:0,returned:0},bodyFluid:{total:0,returned:0},tissue:{total:0,returned:0},isolate:{total:0,returned:0},other:{total:0,returned:0}},testType:{geneXpert:{total:0,returned:0},flDST:{total:0,returned:0},slDST:{total:0,returned:0},genomeSequencing:{total:0,returned:0},tbCulture:{total:0,returned:0}}}}},{sequelize:e,timestamps:!1,modelName:"DailySummary",tableName:"DailySummary"})}static associate(e){}}t.DailySummary=s},9931:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.EqaSummary=void 0;const l=a(496),s={type:l.DataTypes.JSON,allowNull:!0,defaultValue:null};class n extends l.Model{static initialize(e){const t={id:{type:l.DataTypes.INTEGER,autoIncrement:!0,primaryKey:!0},round:{type:l.DataTypes.INTEGER,allowNull:!1},reportYear:{type:l.DataTypes.INTEGER,allowNull:!1},createdAt:{type:l.DataTypes.DATE,allowNull:!1}};return["xpertMTBUltraData","truenatMTB","xpertMTBXdrData","afbData","lflamData","cultureData","pdstData","xpertHIV1QualAssay","xpertHIV1ViralLoad"].forEach((e=>{t[e]=Object.assign({},s)})),n.init(t,{sequelize:e,timestamps:!1,modelName:"EqaSummary",tableName:"EqaSummary"})}static associate(e){}}t.EqaSummary=n},7214:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Facility=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.STRING,primaryKey:!0},name:{type:l.DataTypes.STRING,allowNull:!1}},{sequelize:e,timestamps:!1,modelName:"Facility",tableName:"Facility"})}static associate(e){}}t.Facility=s},2933:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Instrument=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({serial:{type:l.DataTypes.STRING,primaryKey:!0},active:{type:l.DataTypes.BOOLEAN}},{sequelize:e,modelName:"Instrument",tableName:"Instrument",timestamps:!1})}static associate(e){}}t.Instrument=s},253:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.InventoryAdjustment=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.STRING,primaryKey:!0,autoIncrement:!0},type:{type:l.DataTypes.STRING},itemId:{type:l.DataTypes.STRING,references:{key:"id",model:"InventoryItem"}},batchId:{type:l.DataTypes.STRING},previousBatchAdjustmentId:{type:l.DataTypes.STRING},previousItemAdjustmentId:{type:l.DataTypes.STRING},quantity:{type:l.DataTypes.INTEGER},batchNumber:{type:l.DataTypes.STRING},expiry:{type:l.DataTypes.DATE},disposeReason:{type:l.DataTypes.STRING},narrative:{type:l.DataTypes.STRING},batchBalance:{type:l.DataTypes.INTEGER},itemBalance:{type:l.DataTypes.INTEGER},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"InventoryAdjustment",tableName:"InventoryAdjustment"})}static associate(e){e.InventoryAdjustment.belongsTo(e.InventoryItem,{as:"item",foreignKey:"batchId",targetKey:"id"})}}t.InventoryAdjustment=s},1892:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.InventoryEntry=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.INTEGER,primaryKey:!0,autoIncrement:!0},type:{type:l.DataTypes.STRING},itemId:{type:l.DataTypes.INTEGER,references:{key:"id",model:"InventoryItem"}},quantity:{type:l.DataTypes.INTEGER},batchNumber:{type:l.DataTypes.STRING},expiry:{type:l.DataTypes.DATE},disposeReason:{type:l.DataTypes.STRING},narrative:{type:l.DataTypes.STRING},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"InventoryEntry",tableName:"InventoryEntry"})}static associate(e){e.InventoryEntry.hasOne(e.SyncItem,{as:"syncItem",foreignKey:"primaryId",scope:{list:"stock"}}),e.InventoryEntry.belongsTo(e.InventoryItem,{as:"item",foreignKey:"itemId"})}}t.InventoryEntry=s},584:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.InventoryItem=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.STRING,primaryKey:!0},name:{type:l.DataTypes.STRING},image:{type:l.DataTypes.STRING},unit:{type:l.DataTypes.STRING},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"InventoryItem",tableName:"InventoryItem"})}static associate(e){e.InventoryItem.hasMany(e.InventoryAdjustment,{as:"lastAdjustment",foreignKey:"itemId",sourceKey:"id"})}}t.InventoryItem=s},4880:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.KeyValue=void 0;const l=a(496),s=a(3695);class n extends l.Model{}t.KeyValue=n,n.init({key:{type:l.DataTypes.STRING,primaryKey:!0},value:{type:l.DataTypes.JSON,get(){const e=this.getDataValue("value");return JSON.parse(e)},set(e){this.setDataValue("value",JSON.stringify(e))}}},{sequelize:s.sequelize,timestamps:!1,modelName:"KeyValue",tableName:"KeyValue"})},9968:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,o)}r((l=l.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.read=t.update=t.get=void 0;const s=a(9634),n=a(4880);t.get=function(e){return n.KeyValue.findByPk(e).then((e=>e?e.value:null))},t.update=function(e,t){return n.KeyValue.findOne({where:{key:e}}).then((a=>a?a.update({value:t}):n.KeyValue.create({key:e,value:t},{})))},t.read=function(){return l(this,void 0,void 0,(function*(){return n.KeyValue.findAll().then((e=>e.map((({key:e,value:t})=>({[e]:t}))))).then(s.mergeAll)}))}},2358:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Log=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.INTEGER,primaryKey:!0,autoIncrement:!0},value:{type:l.DataTypes.JSON,get(){const e=this.getDataValue("value");return JSON.parse(e)},set(e){this.setDataValue("value",JSON.stringify(e))}}},{sequelize:e,modelName:"Log",tableName:"Log"})}static associate(e){}}t.Log=s},7840:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.MonthlySummary=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.INTEGER,autoIncrement:!0,primaryKey:!0},category:{type:l.DataTypes.STRING,allowNull:!1},reportMonth:{type:l.DataTypes.STRING,allowNull:!0},reportYear:{type:l.DataTypes.INTEGER,allowNull:!0},createdAt:{type:l.DataTypes.DATE,allowNull:!1},isDraft:{type:l.DataTypes.BOOLEAN,allowNull:!1,defaultValue:!0},afbData:{type:l.DataTypes.JSON,allowNull:!1,defaultValue:{}},lflamData:{type:l.DataTypes.JSON,allowNull:!1,defaultValue:{}},cultureData:{type:l.DataTypes.JSON,allowNull:!1,defaultValue:{}},dstData:{type:l.DataTypes.JSON,allowNull:!1,defaultValue:{}},eidData:{type:l.DataTypes.JSON,allowNull:!1,defaultValue:{}},vlData:{type:l.DataTypes.JSON,allowNull:!1,defaultValue:{}}},{sequelize:e,timestamps:!1,modelName:"MonthlySummary",tableName:"MonthlySummary"})}static associate(e){}}t.MonthlySummary=s},8358:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Request=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.INTEGER,autoIncrement:!0,primaryKey:!0},testType:{type:l.DataTypes.STRING},sampleId:{type:l.DataTypes.STRING,allowNull:!1},mrn:{type:l.DataTypes.STRING},diagnosisType:{type:l.DataTypes.STRING},name:{type:l.DataTypes.STRING},age:{type:l.DataTypes.NUMBER},gender:{type:l.DataTypes.STRING},reasonForDiagnosis:{type:l.DataTypes.STRING},infectionSite:{type:l.DataTypes.STRING},previouslyTreated:{type:l.DataTypes.STRING},hivStatus:{type:l.DataTypes.STRING},isRepeatedRifResitanceTest:{type:l.DataTypes.STRING},sampleCollectedAt:{type:l.DataTypes.DATE},sampleCollectionSiteType:{type:l.DataTypes.STRING},sampleCollectionSiteId:{type:l.DataTypes.STRING},sampleType:{type:l.DataTypes.STRING},patientContacts:{type:l.DataTypes.STRING},clinicianContacts:{type:l.DataTypes.STRING},referringLabContacts:{type:l.DataTypes.STRING},patientRegistrationGroup:{type:l.DataTypes.STRING},isRepeatedConfirmatoryRifTest:{type:l.DataTypes.STRING},panelProvider:{type:l.DataTypes.STRING},panelScheme:{type:l.DataTypes.STRING},panelYear:{type:l.DataTypes.STRING},panelRound:{type:l.DataTypes.STRING},panelPtId:{type:l.DataTypes.STRING},verificationType:{type:l.DataTypes.STRING},laboratoryName:{type:l.DataTypes.STRING},address:{type:l.DataTypes.STRING},verificationDate:{type:l.DataTypes.DATE},testScheme:{type:l.DataTypes.STRING},instrumentSn:{type:l.DataTypes.STRING},moduleName:{type:l.DataTypes.STRING},moduleSn:{type:l.DataTypes.STRING},sampleLotNo:{type:l.DataTypes.STRING},eid:{type:l.DataTypes.JSON},viralLoad:{type:l.DataTypes.JSON},researchName:{type:l.DataTypes.STRING},isAutoApproved:{type:l.DataTypes.BOOLEAN,allowNull:!0},approvedById:{type:l.DataTypes.STRING,allowNull:!0,defaultValue:null},approvedByName:{type:l.DataTypes.STRING,allowNull:!0,defaultValue:null},approvedDate:{type:l.DataTypes.DATE,allowNull:!0,defaultValue:null},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"Request",tableName:"Request",timestamps:!0})}static associate(e){}}t.Request=s},3695:function(e,t,a){var l=this&&this.__createBinding||(Object.create?function(e,t,a,l){void 0===l&&(l=a);var s=Object.getOwnPropertyDescriptor(t,a);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,l,s)}:function(e,t,a,l){void 0===l&&(l=a),e[l]=t[a]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&l(t,e,a);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.sqliteModels=t.sequelize=void 0;const i=a(496),o=n(a(661)),r=a(4639),p=a(253),u=a(1892),d=a(584),y=a(2358),_=a(8358),m=a(7003),c=a(7214),T=a(2933),N=a(7761),g=a(7427),f=a(883),D=a(621),E=a(7840),b=a(7755),w=a(9931),[,,I]=process.argv;t.sequelize=new i.Sequelize({dialectModule:o,dialect:"sqlite",storage:I,logging:!1}),t.sqliteModels=function(e){const t=[r.CalibrationSummary,c.Facility,f.GeneXpertStatus,T.Instrument,p.InventoryAdjustment,u.InventoryEntry,d.InventoryItem,y.Log,_.Request,N.ServiceRequest,m.SyncItem,g.User,D.DailySummary,E.MonthlySummary,w.EqaSummary,b.ContactPerson].map((({initialize:t})=>t(e))).reduce(((e,t)=>Object.assign(Object.assign({},e),{[t.name]:t})),{});return Object.keys(t).forEach((e=>{var a,l;null===(l=null===(a=t[e])||void 0===a?void 0:a.associate)||void 0===l||l.call(a,t)})),t}(t.sequelize)},7761:function(e,t,a){var l=this&&this.__createBinding||(Object.create?function(e,t,a,l){void 0===l&&(l=a);var s=Object.getOwnPropertyDescriptor(t,a);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,l,s)}:function(e,t,a,l){void 0===l&&(l=a),e[l]=t[a]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&l(t,e,a);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.ServiceRequest=void 0;const i=a(496),o=n(a(5622));class r extends i.Model{static initialize(e){return r.init({id:{type:i.DataTypes.STRING,defaultValue:o.v4,primaryKey:!0},remoteId:{type:i.DataTypes.STRING},maintenanceNumber:{type:i.DataTypes.INTEGER},status:{type:i.DataTypes.STRING,defaultValue:"initiated"},issueType:{type:i.DataTypes.STRING},computerSerialNumber:{type:i.DataTypes.STRING},machineSerialNumber:{type:i.DataTypes.STRING,allowNull:!0},serialNumber:{type:i.DataTypes.STRING},failedModuleSerialNumber:{type:i.DataTypes.STRING},description:{type:i.DataTypes.STRING},photo:{type:i.DataTypes.JSON},installationQualificationReport:{type:i.DataTypes.STRING},systemLogReport:{type:i.DataTypes.STRING},resultArchiveReport:{type:i.DataTypes.STRING},createdAt:{type:i.DataTypes.DATE},updatedAt:{type:i.DataTypes.DATE}},{sequelize:e,modelName:"ServiceRequest",tableName:"ServiceRequest",timestamps:!0})}static associate(e){}}t.ServiceRequest=r},883:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GeneXpertStatus=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.STRING,primaryKey:!0},state:{type:l.DataTypes.JSON},createdAt:{type:l.DataTypes.DATE},updatedAt:{type:l.DataTypes.DATE}},{sequelize:e,modelName:"GeneXpertStatus",tableName:"GeneXpertStatus",timestamps:!0})}static associate(e){}}t.GeneXpertStatus=s},7427:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.User=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({id:{type:l.DataTypes.STRING,primaryKey:!0},name:{type:l.DataTypes.STRING}},{sequelize:e,modelName:"User",tableName:"User"})}static associate(e){}}t.User=s},7003:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SyncItem=void 0;const l=a(496);class s extends l.Model{static initialize(e){return s.init({list:{type:l.DataTypes.STRING,allowNull:!1,primaryKey:!0},direction:{type:l.DataTypes.STRING,allowNull:!1,primaryKey:!0,defaultValue:"up"},primaryId:{type:l.DataTypes.STRING,allowNull:!1,primaryKey:!0},secondaryId:{type:l.DataTypes.STRING,allowNull:!0},version:{type:l.DataTypes.STRING,allowNull:!0},modifiedAt:{type:l.DataTypes.DATE,allowNull:!0},uploadedAt:{type:l.DataTypes.DATE,allowNull:!0},createdAt:{type:l.DataTypes.DATE,allowNull:!1},updatedAt:{type:l.DataTypes.DATE,allowNull:!1}},{sequelize:e,modelName:"SyncItem",tableName:"SyncItem",timestamps:!0})}static associate(e){}}t.SyncItem=s},3827:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.createSyncWorker=void 0;const s=l(a(1055)),n=a(7219);t.createSyncWorker=function(){const e=new s.default({maxConcurrent:1,minTime:2e3});let t=[];const a=()=>Promise.resolve(),l=()=>{(t.length?t:[a]).forEach((t=>e.schedule(t)))};return l(),e.on("idle",l),e.on("error",(e=>n.logger.error(e.message,e.stack))),{add(e){t.push(e)},addFromGetters(e){return e.reduce(((e,t)=>e.then((()=>t())).then((e=>e.forEach((e=>this.add(e)))))),Promise.resolve())}}}},3557:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,o)}r((l=l.apply(e,t||[])).next())}))},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.updateUploadedCount=t.createSqlitePusherForRequests=t.createSqlitePusher=t.createServerPusher=t.createGeneXpertTestPusher=t.createGeneXpertPusher=t.PushError=void 0;const n=a(9634),i=a(9968),o=a(7632),r=s(a(3983)),p=a(7219),u=a(496),d=a(2167),y=a(3695),_=a(1415);class m extends Error{constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype)}}function c(e,t){return()=>y.sqliteModels.SyncItem.findAll({where:{list:e,[u.Op.or]:[{uploadedAt:{[u.Op.is]:null}},{uploadedAt:{[u.Op.lt]:(0,u.col)("modifiedAt")}}]},limit:t,order:[["primaryId","desc"]]}).then((t=>0===t.length?Promise.reject(new m(`No ${e} left to upload`)):(p.logger.info(`Uploading ${t.length} ${e}`),t)))}function T(e,t){return a=>{if(0===a.length)return Promise.resolve([]);const s=(0,n.pluck)("primaryId",a),[i]=(0,n.pluck)("version",a);return e[`${t}Syncables`](s).then((e=>{const a=e.map((e=>({list:t,version:i,localId:e.id,value:e})));if("tests"!==t)return o.backendClient.post("/sync-items",a).then((e=>e.data));const s=a.map((e=>{var t,a,s;const n=null!==(a=null===(t=null==e?void 0:e.value)||void 0===t?void 0:t.sample_ID)&&void 0!==a?a:null===(s=null==e?void 0:e.value)||void 0===s?void 0:s.sample_id;return n?function(e){return l(this,void 0,void 0,(function*(){const t=yield y.sqliteModels.Request.findOne({where:{sampleId:e}});return t?t.dataValues:null}))}(n).then((t=>(t&&(e.value.approvedDate=t.approvedDate,e.value.approvedByName=t.approvedByName,e.value.isAutoApproved=t.isAutoApproved,e.value.approvedById=t.approvedById),e))):Promise.resolve(e)}));return Promise.all(s).then((e=>(console.log("uploadGeneXpertItems tests data",e),o.backendClient.post("/sync-items",e).then((e=>e.data)))))}))}}function N(e,t){return a=>{if(0===a.length)return Promise.resolve([]);const l=(0,n.pluck)("primaryId",a),[s]=(0,n.pluck)("version",a);return e[`${t}Syncables`](l).then((e=>e.map((e=>({list:t,version:s,localId:e.id,value:e}))))).then((e=>o.backendClient.post("/sync-items",e).then((e=>e.data))))}}function g(e,t="up"){return a=>{const l=a.map((a=>({list:e,direction:t,primaryId:a.primaryId,secondaryId:a.secondaryId,uploadedAt:new Date})));return y.sqliteModels.SyncItem.bulkCreate(l,{updateOnDuplicate:["secondaryId","uploadedAt"]})}}function f(e){return()=>y.sqliteModels.SyncItem.count({where:{list:e,[u.Op.and]:[{uploadedAt:{[u.Op.not]:null}},{uploadedAt:{[u.Op.gt]:(0,u.col)("modifiedAt")}}]}}).then((t=>(0,i.update)(`${e}_uploaded`,t)))}t.PushError=m,t.createGeneXpertPusher=function(e,t=10,a){return()=>r.default.resolve((0,i.get)("server")).then((e=>{if(!e)return Promise.reject(new m("Server is not connected"))})).then(c(e,t)).then(T(a,e)).then(g(e)).then(f(e)).catch(m,(e=>p.logger.info(e.message))).catch(d.AxiosError,(e=>p.logger.error(e.message))).catch((e=>(p.logger.error(e.message),Promise.reject(e))))},t.createGeneXpertTestPusher=function(e,t=10,a){return()=>r.default.resolve((0,i.get)("server")).then((e=>{if(!e)return Promise.reject(new m("Server is not connected"))})).then(function(e,t){return console.log("createGeneXpertTestPusher ",e),()=>y.sqliteModels.SyncItem.findAll({where:{list:e,[u.Op.or]:[{uploadedAt:{[u.Op.is]:null}}]},limit:t,order:[["primaryId","desc"]]}).then((t=>0===t.length?Promise.reject(new m(`No ${e} left to upload`)):function(e){return l(this,void 0,void 0,(function*(){console.log("getApproveRequests Push");const t=yield(0,_.createGeneXpertClient)(),a=yield t.getTestsByTestIds(e);if(0===a.length)return[];const l=a.map((e=>e.sampleId)).filter((e=>void 0!==e)),s=new Date(Date.now()-72e5),n=yield y.sqliteModels.Request.findAll({where:{sampleId:{[u.Op.in]:l},sampleCollectedAt:{[u.Op.lte]:s}},order:[["sampleCollectedAt","DESC"]]});p.logger.info(`=========> Get approved getApproveRequests ${n.length} requests`);const i=n.map((e=>null==e?void 0:e.dataValues)),o=[];for(const e of i){const t=a.find((t=>t.sampleId===e.sampleId));t&&o.push(t)}return o}))}(t.map((e=>e.primaryId))).then((a=>{if(0===a.length)return Promise.reject(new m(`No ${e} left to upload uuuuu`));const l=a.map((e=>String(e.id)));console.log("fetchApprovedTests requestIds",l,t);const s=t.filter((e=>l.includes(e.primaryId)));return console.log("fetchApprovedTests matchedItems",s),0===s.length?Promise.reject(new m(`No ${e} left to upload`)):(p.logger.info(`Uploading fetchApprovedTests ${s.length} ${e}`),s)}))))}(e,t)).then(T(a,e)).then(g(e)).then(f(e)).catch(m,(e=>p.logger.info(e.message))).catch(d.AxiosError,(e=>p.logger.error(e.message))).catch((e=>(p.logger.error(e.message),Promise.reject(e))))},t.createServerPusher=function(e,t,a=10){return()=>r.default.resolve((0,i.get)("server")).then((e=>{if(!e)return Promise.reject(new m("Server is not connected"))})).then(c(t,a)).then(function(e,t){return a=>{if(0===a.length)return Promise.resolve([]);const l=(0,n.pluck)("primaryId",a);return e[`${t}Syncables`](l)}}(e,t)).then(function(e,t){return a=>e[`${t}Save`](a)}(e,t)).then(g(t,"down")).then(f(t)).catch(m,(e=>p.logger.info(e.message))).catch(d.AxiosError,(e=>p.logger.error(e.message))).catch((e=>(p.logger.error(e.message),Promise.reject(e))))},t.createSqlitePusher=function(e,t,a=100){return()=>r.default.resolve((0,i.get)("server")).then((e=>{if(!e)return Promise.reject(new m("Server is not connected"))})).then(c(t,a)).then(N(e,t)).then(g(t)).then(f(t)).catch(m,(e=>p.logger.info(e.message))).catch(d.AxiosError,(e=>p.logger.error(e.message))).catch((e=>(p.logger.error(e.message),Promise.reject(e))))},t.createSqlitePusherForRequests=function(e,t,a=100){return()=>r.default.resolve((0,i.get)("server")).then((e=>{if(!e)return Promise.reject(new m("Server is not connected"))})).then(function(e,t){return console.log("createGeneXpertTestPusher ",e),()=>y.sqliteModels.SyncItem.findAll({where:{list:e,[u.Op.or]:[{uploadedAt:{[u.Op.is]:null}}]},limit:t,order:[["primaryId","desc"]]}).then((t=>0===t.length?Promise.reject(new m(`No ${e} left to upload`)):function(e){return l(this,void 0,void 0,(function*(){const t=yield y.sqliteModels.Request.findAll({where:{id:{[u.Op.in]:e},approvedDate:{[u.Op.not]:null}},order:[["createdAt","DESC"]]});return p.logger.info(`=========> Get approved getApproveRequests ${t.length} requests`),t.map((e=>null==e?void 0:e.dataValues))}))}(t.map((e=>e.primaryId))).then((a=>{if(0===a.length)return Promise.reject(new m(`No ${e} left to upload`));const l=a.map((e=>String(e.id)));console.log("fetchApprovedRequests requestIds",l,t);const s=t.filter((e=>l.includes(e.primaryId)));return console.log("fetchApprovedRequests matchedItems",s),0===s.length?Promise.reject(new m(`No ${e} left to upload`)):(p.logger.info(`Uploading fetchApprovedRequests ${s.length} ${e}`),s)}))))}(t,a)).then(N(e,t)).then(g(t)).then(f(t)).catch(m,(e=>p.logger.info(e.message))).catch(d.AxiosError,(e=>p.logger.error(e.message))).catch((e=>(p.logger.error(e.message),Promise.reject(e))))},t.updateUploadedCount=f},1467:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getMachineStatus=void 0;const l=a(9968);t.getMachineStatus=function(e){return Promise.all([(0,l.read)(),e.systemInfo()]).then((([e,t])=>Object.assign(Object.assign({},e),{time:new Date,info:t})))}},653:function(e,t,a){var l=this&&this.__awaiter||function(e,t,a,l){return new(a||(a=Promise))((function(s,n){function i(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(i,o)}r((l=l.apply(e,t||[])).next())}))},s=this&&this.__asyncValues||function(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,a=e[Symbol.asyncIterator];return a?a.call(e):(e="function"==typeof __values?__values(e):e[Symbol.iterator](),t={},l("next"),l("throw"),l("return"),t[Symbol.asyncIterator]=function(){return this},t);function l(a){t[a]=e[a]&&function(t){return new Promise((function(l,s){!function(e,t,a,l){Promise.resolve(l).then((function(t){e({value:t,done:a})}),t)}(l,s,(t=e[a](t)).done,t.value)}))}}};Object.defineProperty(t,"__esModule",{value:!0}),t.autoApproveRequests=t.updateSavedCount=t.updateSyncListTotal=t.updateServerStatus=t.updateDatabaseStatus=void 0;const n=a(496),i=a(7632),o=a(7219),r=a(9968),p=a(3695),u=a(1467),d=a(1415);t.updateDatabaseStatus=function(e){return e.sequelize.authenticate().then((()=>(0,r.update)("database",!0))).catch((e=>(o.logger.error(e),(0,r.update)("database",!1))))},t.updateServerStatus=function(e){return(0,u.getMachineStatus)(e).then((e=>i.backendClient.post("/status",e))).then((()=>!0)).catch((()=>!1)).then((e=>(0,r.update)("server",e)))},t.updateSyncListTotal=function(e,t){return()=>e[`${t}Total`]().then((e=>(0,r.update)(`${t}_total`,e||0)))},t.updateSavedCount=function(){return p.sequelize.query("select list, count(*) as count from SyncItem group by list").then((([e])=>e)).then((e=>Promise.all(e.map((({list:e,count:t})=>(0,r.update)(`${e}_saved`,t))))))},t.autoApproveRequests=function(){var e,t,a;return l(this,void 0,void 0,(function*(){console.log("autoApproveRequests updater");const l=yield p.sqliteModels.Request.findAll({where:{approvedDate:{[n.Op.is]:null}},order:[["sampleCollectedAt","DESC"]]});if(o.logger.info(`=========> Auto approving ${l.length} requests`),l.length>0){const n=yield(0,d.createGeneXpertClient)();try{for(var i,r=s(l);!(i=yield r.next()).done;){const e=i.value,t=yield n.getTest(e.sampleId),l=null==t?void 0:t.dataValues;if(console.log(`Checking request for auto approving ${e.sampleId} with state ${null==l?void 0:l.state} and end_time ${null==l?void 0:l.end_time} and modification_time ${null==l?void 0:l.modification_time}`),l&&"2"===(null===(a=null==l?void 0:l.state)||void 0===a?void 0:a.toString())&&((null==l?void 0:l.end_time)||(null==l?void 0:l.modification_time))){new Date(l.end_time||l.modification_time)<new Date(Date.now()-36e5)&&(yield e.update({isAutoApproved:!0,approvedByName:"Auto Approved",approvedDate:new Date}))}}}catch(t){e={error:t}}finally{try{i&&!i.done&&(t=r.return)&&(yield t.call(r))}finally{if(e)throw e.error}}}return l}))}},5222:function(e,t,a){var l=this&&this.__createBinding||(Object.create?function(e,t,a,l){void 0===l&&(l=a);var s=Object.getOwnPropertyDescriptor(t,a);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[a]}}),Object.defineProperty(e,l,s)}:function(e,t,a,l){void 0===l&&(l=a),e[l]=t[a]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),n=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&l(t,e,a);return s(t,e),t},i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.ServerSyncClient=void 0;const o=i(a(2167)),r=n(a(7147)),p=i(a(1017)),u=a(9634),d=a(7632);function y(e){return d.backendClient.get(`/sync-items/${e}/total`).then((e=>e.data))}function _(e,t,a,l){return d.backendClient.post(`/sync-items/${e}/presyncables`,{since:t,lastIds:a,limit:l}).then((e=>e.data))}function m(e,t){return d.backendClient.post(`/sync-items/${e}/syncables`,{ids:t}).then((e=>e.data))}t.ServerSyncClient=class{constructor(e){this.models=e}stockitemsTotal(){return y("stockitems")}stockitemsPresyncables(e,t,a){return _("stockitems",e,t,a)}stockitemsSyncables(e){return m("stockitems",e)}stockitemsSave(e){const t=(0,u.map)((e=>({id:e.id,name:e.name,unit:e.unit,image:e.image}))),a=(0,u.map)((e=>({secondaryId:e.id,primaryId:e.id})));return Promise.all(e.map((e=>Promise.resolve(function(e){if(!e)return;const[,,,t]=process.argv,a=e.split("/").pop(),l=p.default.join(t||p.default.resolve("images"),a);return(0,o.default)({url:e,method:"GET",responseType:"stream"}).then((e=>new Promise(((t,s)=>{e.data.pipe(r.createWriteStream(l)).on("error",s).once("close",(()=>t(a)))}))))}(e.image)).then((t=>Object.assign(Object.assign({},e),{image:t})))))).then(t).then((e=>this.models.InventoryItem.bulkCreate(e,{updateOnDuplicate:["name","unit","image"]}))).then(a)}stockledgerTotal(){return y("stockledger")}stockledgerPresyncables(e,t,a){return _("stockledger",e,t,a)}stockledgerSyncables(e){return m("stockledger",e)}stockledgerSave(e){const t=(0,u.map)((e=>({id:e.id,itemId:e.itemId,batchId:e.batchId,type:e.type,quantity:e.quantity,previousBatchAdjustmentId:e.previousBatchAdjustmentId,previousItemAdjustmentId:e.previousStoreItemAdjustmentId,itemBalance:e.storeItemBalance,batchBalance:e.batchBalance,batchNumber:e.batchNumber,disposeReason:e.disposeReason,expiry:e.expiry,narrative:e.narrative,createdAt:new Date(e.createdAt),updatedAt:new Date(e.createdAt)})));return this.models.InventoryAdjustment.bulkCreate(t(e)).then((e=>e.map((e=>({secondaryId:e.id,primaryId:e.id})))))}facilitiesTotal(){return y("facilities")}facilitiesPresyncables(e,t,a){return _("facilities",e,t,a)}facilitiesSyncables(e){return m("facilities",e)}facilitiesSave(e){return this.models.Facility.bulkCreate(e.map((e=>({id:e.id,name:e.name}))),{updateOnDuplicate:["name"]}).then((e=>e.map((e=>({secondaryId:e.id,primaryId:e.id})))))}servicerequestsTotal(){return y("servicerequests")}servicerequestsPresyncables(e,t,a){return _("servicerequests",e,t,a)}servicerequestsSyncables(e){return m("servicerequests",e)}servicerequestsSave(e){return this.models.ServiceRequest.bulkCreate(e.map((e=>({id:e.originalId,remoteId:e.id,issueType:e.issueType,serialNumber:e.serialNumber,computerSerialNumber:e.computerSerialNumber,description:e.description,failedModuleSerialNumber:e.failedModuleSerialNumber,status:e.status,maintenanceNumber:e.maintenanceNumber,photo:e.photo,resultArchiveReport:e.resultArchive,installationQualificationReport:e.installationQualificationReport,systemLogReport:e.systemLogReport}))),{updateOnDuplicate:["remoteId","issueType","serialNumber","computerSerialNumber","description","failedModuleSerialNumber","status","maintenanceNumber","photo","resultArchiveReport","installationQualificationReport","systemLogReport"]}).then((e=>e.map((e=>({primaryId:e.remoteId,secondaryId:e.id})))))}usersTotal(){return y("users")}usersPresyncables(e,t,a){return _("users",e,t,a)}usersSyncables(e){return m("users",e)}usersSave(e){return this.models.User.bulkCreate(e.map((e=>({id:e.id,name:e.name}))),{updateOnDuplicate:["name"]}).then((e=>e.map((e=>({secondaryId:e.id,primaryId:e.id})))))}}},8626:function(e,t,a){var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.loadContactPersons=t.isAssigned=t.isOnline=t.storedInterval=t.interval=t.intervalWhenFull=t.throttled=void 0;const s=l(a(2245)),n=a(9634),i=a(7632),o=a(3153),r=a(9968),p=a(5132);t.throttled=function(e,...t){return()=>Promise.all(t.map((e=>e()))).then((t=>{if(t.every(Boolean))return e()}))},t.intervalWhenFull=function(e,t=15){let a;return()=>(0,r.read)().then((l=>!(l[`${e}_saved`]===l[`${e}_total`]&&!(0,n.isNil)(a)&&!(0,s.default)(a).isBefore()||(a=(0,s.default)().add(t,"minutes").toDate(),0))))},t.interval=function(e=15){let t;return()=>!(!(0,n.isNil)(t)&&!(0,s.default)(t).isBefore()||(t=(0,s.default)().add(e,"minutes").toDate(),0))},t.storedInterval=function(e){return()=>(0,r.get)(e).then((e=>(0,n.isNil)(e)||(0,s.default)(e).isBefore()))},t.isOnline=function(){return(0,r.get)("server").then(Boolean)},t.isAssigned=function(){return(0,r.get)("lab").then((e=>!!e||i.backendClient.get("/labs/current").then((e=>e.data)).then((e=>(0,o.saveLab)(e))).then((()=>!1)).catch((e=>!1))))},t.loadContactPersons=function(){return console.log("Loading contact persons from server..."),i.backendClient.get("/contact-persons").then((e=>e.data)).then((e=>(0,p.saveContactPersons)(e))).then((()=>!1)).catch((e=>!1))}},2167:e=>{e.exports=require("axios")},3983:e=>{e.exports=require("bluebird")},1055:e=>{e.exports=require("bottleneck")},5142:e=>{e.exports=require("dotenv")},8857:e=>{e.exports=require("electron-log")},4804:e=>{e.exports=require("hostname-patcher")},2245:e=>{e.exports=require("moment")},9424:e=>{e.exports=require("mssql")},4768:e=>{e.exports=require("mssql/msnodesqlv8")},7104:e=>{e.exports=require("qs")},9634:e=>{e.exports=require("ramda")},496:e=>{e.exports=require("sequelize")},661:e=>{e.exports=require("sqlite3")},5622:e=>{e.exports=require("uuid")},7147:e=>{e.exports=require("fs")},1017:e=>{e.exports=require("path")},8670:e=>{e.exports=require("timers/promises")},881:e=>{e.exports=JSON.parse('{"name":"medx-relay","description":"MedX Relay","version":"2.0.3","npmRebuild":false,"private":true,"main":"./build-electron/main.js","homepage":".","author":{"name":"MedX International","email":"info@medx.international","url":"https://medx.international"},"scripts":{"postinstall":"electron-builder install-app-deps","react:start":"cross-env BROWSER=none PORT=3001 react-scripts start","react:build":"react-scripts build","react:test":"react-scripts test","react:eject":"react-scripts eject","compile":"tsc --project tsconfig.json","compile:watch":"npm run compile -- --watch","predev":"npm run runtime-env","dev":"npm run compile && npm run dev:watch","dev:watch":"concurrently --kill-others-on-fail \\"npm run react:start\\" \\"npm run compile:watch\\" \\"npm run electron:watch\\"","electron:watch":"nodemon -d 5 -w dist/src/electron -w dist/src -i dist/src/ui  -x \\"npm run electron:start\\"","electron:start":"wait-on tcp:3001 && cross-env IS_DEV=true electron ./dist/src/main.js","electron:build":"cross-env NODE_ENV=production webpack --config webpack-back.config.js","prepack":"npm run clean && npm run runtime-env && npm run compile && npm run electron:build && npm run react:build","clean":"node ./fs.js rm build build-electron connect dist out","runtime-env":"node ./runtime-env.js","pack:win":"electron-builder -c builder.js --dir -w --ia32","dist:win":"electron-builder -c builder.js -w --ia32","pack:linux":"electron-builder -c builder.js --dir -l","dist:linux":"electron-builder -c builder.js -l","migration":"node migration.js","migrate:up":"npx ts-node src/store/migrate.ts"},"eslintConfig":{"extends":["react-app","react-app/jest"]},"browserslist":{"production":[">0.2%","not dead","not op_mini all"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"devDependencies":{"@emotion/react":"^11.10.0","@emotion/styled":"^11.10.0","@mui/icons-material":"^5.8.4","@mui/material":"^5.9.2","@tanstack/react-query":"^4.0.10","@testing-library/jest-dom":"^5.16.4","@testing-library/react":"^13.3.0","@testing-library/user-event":"^13.5.0","@types/bluebird":"^3.5.36","@types/glob":"^8.1.0","@types/jest":"^27.5.2","@types/mssql":"^8.0.3","@types/node":"^18.6.3","@types/ramda":"^0.28.15","@types/react":"^18.0.15","@types/react-dom":"^18.0.6","@types/sqlite3":"^3.1.8","@types/uuid":"^9.0.1","concurrently":"^7.3.0","cross-env":"^7.0.3","dotenv-webpack":"^8.0.1","electron":"^19.0.10","electron-builder":"^23.3.3","electron-icon-maker":"^0.0.5","electron-is-dev":"^2.0.0","json-to-ts":"^1.7.0","node-loader":"^2.0.0","nodemon":"^2.0.19","react":"^18.2.0","react-dom":"^18.2.0","react-router-dom":"^6.3.0","react-scripts":"5.0.1","sequelize-auto":"^0.8.8","sequelize-typescript-generator":"^8.4.1","string-replace-loader":"^3.1.0","typescript":"^4.7.4","wait-on":"^6.0.1","web-vitals":"^2.1.4","webpack-cli":"^4.10.0","webpack-node-externals":"^3.0.0"},"dependencies":{"@elife/pm2":"github:ernest-okot/pm2","axios":"^0.27.2","bluebird":"^3.7.2","bottleneck":"^2.19.5","dotenv":"^16.0.3","electron-log":"^4.4.8","electron-updater":"^5.2.1","express":"^4.18.1","glob":"^8.0.3","hostname-patcher":"^1.1.0","moment":"^2.29.4","msnodesqlv8":"^2.6.0","mssql":"^9.0.0","qs":"^6.11.0","ramda":"^0.28.0","react-hook-form":"^7.38.0","sequelize":"^6.21.3","sqlite3":"^5.1.1","umzug":"^3.2.1","uuid":"^9.0.0"}}')}},t={};!function a(l){var s=t[l];if(void 0!==s)return s.exports;var n=t[l]={exports:{}};return e[l].call(n.exports,n,n.exports,a),n.exports}(6392)})();PNG

   IHDR          	pHYs  .#  .#x?v    IDATxq\ǵPL@Dċ@XΎw"  EУI@p#}GO 9w6,JU=ݳ`W?`                          d            F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         F            @Q             iDm                         ϶        9k^FuD\,˕  vI+<"N#v^>:\vIm         V+u|yl^;M  `WLwxӏz        V8䳵:Mm{p  M?qhaJ5sgR         4M,V&   sJwFW3        iGoOX_#r^>:e  gԣgOXS3g&        0G7O\ij۹S  zJ'm#5         )P5e^^;m  t7.SDJ\        |ozJ=v  RO#;aD\9DJ        lL>Ϟ]R/:  -)h;yDm̖        9yGD'  djRo#t7y)9        нVqD5".o   IgNg屃cnLj        `.61`|Lj^   JNFg#         VcDnp?Eb|   ^B+hzb<w`̉Im         tzmcDܷRO}#  m3F        \%d
.}+  J0-"^%mb֝	^0v        nR#ny|X/};  hEmt/a^>8(6         ziom!  ~aKA[lL        @ZS\-'Sq(  Uiw	108,         4=}~.  tz#⬓zy:eR         =iB81nJ=`-  R#⡣-:CW         R+u|iԫ  lI+&""ⰳ38C         yi*b|`=  @VqD|6zw0C        +Cfp*z`-  R/"l~         Сʫmk+u.  C+&"> hiʤ6         J}c׈4  vG+tv2b<`E&        ЕVXR;X  Lˈa6:<蒨        \D^E]+   ߡzJn>`        @Zێ/qX/;X  tۙNgܧ8v'G&        Г:xhw  Rf;4enXQ         =ڱ޵R;X  ԣVǈx7~\:szt0        `Z;|Sck  uW;?,ˇdR         ص)m;Vy_ J~XcEkC        @/aDܵRo:X  VQ+unO>3t0s        `ZcaN1[  49v}nX/W}-}fR         =؇)m;  J''a6`O&        Uԣ}Ozy:  `Lwqǧi^u;         6"~lSێ;X  VyD<y6:4%         6+$"V h^Gtҿsנ08         zblM  0G/&        M&|ُqji ^MW/:4^         &*n|{Ju  ГVMD|-U`t`'        @VQDn爸Z3X+  jGGٞb<:q&        -&<ݛij\  +AۓR:Q         !9¶9-  6aJce[w0S           5"~爸Z3]?  |ilb<&        &<ϛij?  |irY[dl        m86>mԫ  CVǈx?FYvDml        m|w &"ⵍy1~h        zaǾ  3-"^9m        D/  8xH<N&vc6[#j         n|;>	 j?&9fl        4i5>]M  J;'=tH        @sf|ܦG  еqp+>":Thl        Lv;qHx>7  3Jê8sf
Q         )#az,  ݘ&EġS
wB        @%k|$|7= jRWda'U~m        Nwm+~  Z`N~H'j         _YD<  @VMD|&	`        بVqDfzy  fMwuoyLj         Å]V  ^\+2"VJ        @sܵq+CV  ^L+z#v͝T6         2x ٿV;o  J=xc;gT0q         6fza7 oJfw         ]9U+ dԣVmD͒im        iFC+f7 ?6Mh^E5[n        igvx~lSێ}#  VGDE&j#0v        h"NWv7 hE׶dgX/}<         $;#}+vz kFJжsH!j        `Ny#f  wGmi?m# 7&y" O%˾#OF@n#hR<ؖl"`0<U.^mT;oIC?8JmlR         ]r!rb؃  [RGč,plŻI        кfɫHv؃  r-;=EA޿j!-Km         tYm;{  CURgݞ)        !)]= !))q`GJR         ]qr\j]I|00  ]I""q0GJR         kJMz", *)GcG)        +mV|=   II\>8q+){SJm         tJ]IY Juq7"R         ]V~s^/G] }D<FN)         a/]R
 @4/GxQ	z"a         Z\-o7"g NI*"vb        Yi㟜GĪl `J%凈x3Jm         G~^~.)J
 `{UyD\W"
:        @۔x򼮅H [%#"E+y3Jm         TAJV   :P_ PR~;FG+Jm         Mc%[ ~s~tF        6y?))뚈 6SR?"Pˢ2]Qj        MiDJ xSD܉xƣJm         [i$"K xfUkb%ָR         mr6}()/J>W  ?PRKmtˋd        XI "WtKD\M' |^'.Lwm         h7ӕ6XR0 JgRhKR         mQjkJj ~)s ߴN        6GD-]H ZEZ`KM۔         h6<uh&N        (mud^R k)6)Ѻw///R        `#ZJ  CSR'lt9{ h6         `)]k%KM `JWPhc|ϦmJm         A>yI k@Ta|ǦUJm         [vD }MaBV)        І3)#uc]7+' M1O|UJm         G, ުEZȯ}E&J        6X= )/B>*6         6RR> {தTWP M4E|3/2UJm         lJ}q^WP<    IDAT5 EZ{Bڤ        'u4(  [MRQj        `Sdu mi)þQj5Jm         lL쩺hR  :S%y-K=Fk         1+)|S  t\_ShR         r9!)uEi mi1*Fk          ~UfM `m(_8/ED(        6<7*  o|G^Y4f*mQj         RWVd VSn08%ekmB        MH*+ ԢOIyQbhR         bՕfu /JQma<
6         6-MIy^WX8 }D<6ExkݴB        M(0&uYc FKu)        12uYe F)B۱g:mx/E         6"/c\/^LO _IС/7f,         :Z 0`%哈+A6(        b/$"Kc |ڬïac^^^        "YrOq1]V"WR>{lMYj        `]oE fxu$6        N$1%f 3%v          о2oV^ =P%姈kƔ         X*gMJN oM}
~ȳ Sj        `]?VW^> JGD:xk٘R         @.6eP Z8/)?Eĝ37񝖍)        .o燷9nmWrj拈8w ۧ        %o6uÈ |[Dġa-ǲ16         0f% ؂Z(/)#Fް/8acJm          QaJIZ ЭYD"T         YVݕzX}%ۈxxA        u(@#b0
 <"n
jamJm          pX l)ܬ"T          /w%姺.\ JʷR         8t<" 
%壒""n;1Pj        `{ueY AI#XNJmlD         nJ2) |GI>"#b"         *)9+ UI\>`(         쇺>\Ru^ ]I""jxYXf#Jm         ZMIy^RvQ*)GcSvDlB         `FĪ`
hJuSoJm          <o CWRZh;v 3         k7%勈.g+G	">".,pXj         ufє `J'1Wh6         aDcIyJWMaB/96^z         Dh[Jgq1]V	}RR>{l{MXj        `AUEI1/J':B)         S->/ }WRn
m`;c         APR>rr II "" 6         ᫫7/J''6Qj         ID|,)?48 3%#"(         eD̛u تZ.)?EĝK         `|bە`[B""΅0nJm          4%出3 @JGD
 6         qlVN SD܉(         pۮF ))E*"Υ
ה          &U mD<7 7          Z]YO[btIy7(         gPR UR>UD
         ߹+)?	OJʷA#Jm          XOsIy7ൔ          [()_K
ߔ"bB-          xS]#9"&cSj         -#bѬ 02%壒"">8{ ֥         [u ƣ|Qq؄R          ))K}D<FQ)6          6q|TRl/ mQj         `Su繤|+I()_DD-;V ڤ         @[nJD[I>"2 J         6FĪ|&USR>))u(         ж\R,()_E<" ]z/]         egnJq1]V角ADGĥ#`,        R^`M))4l
m[|Pj         kx,)K?JWM/V^tFދ         -PR>r:n": b         mk@|Ҭ)3Jm          l$"K؞uSh;; ^          ȇYD\LC FI ""\ 6         1В()_}%{Vhg	6          vm%fM돈8'в@لR          }qY U! T%姈! }         @7Ŷ+vM1.(Rj        `thKumH SR?"Pd R         XH؂fD KOq'&`KVfJm          qSlvJ UR>k%H(         w>TWUI6"ߓ 7         Xg;PW%cV%yD           xr#QRv "b> &          Gw%出V()FsDL:KL(         .#b^R>qoIy7!Pj        `]?Kv0!*)ED]D:u R         ZIID|,)?8`HJONM           qYR>rx쭒QD<5k }ى)Km         EFjdQR>s:>*)_c
m R         ZHID<OJ+l         ID\O3@o":'ؘ6         "#.#b^R>pZ@/\6 FC        u)EVj@o#1"&N#٘R          c0iۮ6k%壒r]g0=Ɣ         XBrŶ%kJS]4+ 0J^^^<         k))L3m֔">"..g"Pj        `mJmOD\t|ـ!.g$        OX]K7I ()UȹB0_$mPj         `̎ۀ.+%1"&Bb iR         XI 6U%fR WJm         lB
6%嫦v,Q`,
6         6Yz(k;JO1"&3 Pj        `bf%{ѹ􀁳M+          [v/5JGD
6Z        ڦ\z@].wcI)"gM          .&oO"bd-8mPj        `S$]Iiʮ%" Qj        `S%CXITˮ>HiR         ZHID<Bq*)5y} `sJm         lR0a|Jʷ ӧ-Jm         lR0MXR Rj        `Sڀ1))9qU-:jYj5Jm         lR06uɩ051q BZE         l206.gN)>YgrN4R         mIȜ` JgRh[_DC          `=ͲJʷM	        @M{|;;dD,        ІRF꼤|a/!6QjUJm         a!E`J> Jج-:h{q        o0"#֧ |Oq :7z"Q         6VRv!O3%_衒E]UrNt_        %?	9KmC%xThXϢmJm         $,)=苒QIy
F,:6         ڲ$6胒E؁ l̳Sj        -.:DZk))#1"&hR         m,I_Xk()D<">U^`B         ht9K`JWMX SjuE
        @~CuS:TR>3@'L3ܴR         mZI%#Q@wJ'MyT;VR         mJkY@7JWctJN(        &Km *)S*)?DǈsR         m?ͅ<%fR [N(        Кr#+)_q,NG'         h'|$XOIw"غ/R         m[I‷+)4A	+mtF        +y۔돈8EOW         h :.)~RR~;q6         ڶ(_\YI)P
<6         Z5]/Rƙ8돈8@?L3Kmth        @x*X)w":@H蒥6         0*7KG"?ksKVR         ]p௬A|1	@/yS        @\0v%僈xӱgs蔥6         Z7]VE PjcJupLN)         ho#9"&> #kJm         te.YoLJ"aLg\8x%tN        	WYD"ԩrtN        	WmD<ׅB'w<96         :1]2|RVR>*)2čK_˙RSj        Ks8/ucG
6         B$,1H%xk^LV3         "oQ0$%壈x0^LVXj        K.D@/ R[        @g$a }D<F3t         QD<`5         蚋 0 %euAXj        k.F+)D}D\:GA[8^R         .g"e ?%哦0l_˙R[        6Xk=SRj?vv 癍z/n         ^<4 _I "6J        m_0NO":xfc%n         6]Δ8 ~YUI)5(t9Sjc,       HIOںp7	|N~S!@3}D\:QɱmJm        \D=[IʒoWWt9>R@xI RR FN       `WR\{WŔo
*%
on+3p#` ()_Gĝ=6ˋ       zYO8m ?l$G%eրQ.gƞ׬<us'삥6       j.^4%=,٤0˥ْM)Y, #fךfN       '*]`1^l6k`Jm>TR; W`        v|5"?mor#8;Ѽ@a |'Ļ       lYI$"2Dx0]=>`t9{rlSԬ%׾L:       Ur-hTG55Y 0VlUIyPh{<3E       ЭAv2N?%ۈo>y:<<Pjcg        :U"[kj)."nKʵv{I`c+JgWy"}       )m՗fMLIye;]:]jo+#A+        Z̶u]n.g# U]tzXB3ͳH]g;2 	;/       l|`ж}SIblxS.Pci8]()EJ7LN)       l|RR>Fġ,wc=z6#	#8()ץg/ `ةw///N        JQ/~]zN؃>*)ׅct-4miG"e@씥6       7*)_DBm/3Z"`~VhMwەB ,)       R]C()5ǈ8ިg\Ro-xr]GkJu-9"&R`s^^^       4kO.#jy#9DI߭M-Q<r,L 6ey;g       5mvA@(CIM/"b@K<       YCrt9[=ر{! `DBEO¤,       |5Qg()=1+)B(Jm        RRǈf?J rV^@>~B_w        *)D}D\dtJ'qrē YiJ 萕6zR       Bۨճ7`\̝*UR>*)/ g/zC       fke%30o>Lzgyr0yED,< бg/6       `ԚR]ј=~azai#u!\G +mR       0Z"B3Qls
+mW/ - wwGq\ڀw#_-:#8>Q"X	&}{$`~zu_W%ۻ]Yðg}{"       LRڙF>63(XkPܨcZ |!       LN>D`G6Xmo    IDAT@NlT;jO󵈇k NmP       0)m<`@+פx#       L@/1FVG(6*_a&bp       B3¶kV#Umfע(UNn&]]s`Mm       	DkRcDGVE m lk,I       Tm,YZ:9p	SƽT䵡 0 $6       `r\x`D(ȡ"Gw  UƂj       \;+ԿNVBPk.j":"L~ 6K       T}'ˊMU{dȰt^%ki#_)b       JYD|/u8(KZ&0p:ajwrv6 =+Pij       F%UmXb4UR'0`7mӖ; 0TP       0M	V5_s`LC6:ӕ#"^M} k*M       -eC^KRwm߄d ]smaF> g]k*,6       `RD[Ɇ_r#007uYIU}g@\K1xBm       @R:À-{;043+2=j 㧈x5Y PsK	       cЇ$-Qw爸0N` 뮹? UeD, (EAj       0"~̛TB 0WuYHU5 (k(        +UnD8\PV^́L`1
ӑBBm       @N4ekxk>Gą4_@T~ X
O       (Rxc
̩m'l}xvBm       @ҡ^B9P27G`n94KU{@P0>%j       rUZ֩j[T;j/#g(f(Bm       @Q! Dikx>:]+UADFOS qb))P       PζU02uM:wH)p]]smA)P       PT֊Q5<߹+vVwbjM} fk#       jQ8axA`nꮙ8=>z `(P       P-m[mm|u#V."vR?"b{ `er       pXe-0|}0K4k>	kg`䴴Q$Mm       iicd˜d}P%UAD\0rsHJ       (6k)7)$]si㒪o#"> F\,j       -U펖6F 957`	>]dDR~, {%       ݡbrҝ/pVw#vS qq	       C1c5"	纨oS> TXiJ&       Vn[p0z³	q#X>jr;۩I:L       2;qxkn%]ʗ^O} LE&b	       v7"~:ܛZG[F"UNVg &̵j       03>;};@[RvS vhBm       P	02
o熶kS*[Y, <@P       08ᕕa"^<<thT;j6=y k B       Uabꮹhg E	       Ct`UyxM"HU{ /_XM       `0rC"LP=<_[@|jw}l Owu	c       a-<@pm Uy6       `h{*NxIh+\جu 5/_XQ       `RFu|IU75>3 qgux       -mLxSɹ=2݋k6 .:P       0$=L /Qwe pnwyRDī &_lYN       `@ژ $">$}.Kڝ8> A'˗/       ظT_+ˤF""f~_'U~y3fǬ       @hiYd uVẃ@[yRE'6 x6֖       bBr	|`t9eIU6?M} Xij       B^۾aT~h+O~_s+ rm`       p"	qb0
-%IUۇ?Eg 䚆Qϗ/_0       QjO
irj/hwqPw͵e,Gڝ8 /rUw&wFMS       0V,f'(M^*VT[6 x1-mP       0{Va	9MO@Ym[9R?Eg /tWw͹!2v[V        TO;Ks$IU> X#d
4       C Z9Y,j"Z fa`       !%sDk.S9RDg Kta`,1       0 ?2X>xHa"r2 `<       lTZ-mjw#eΌ]53r=k6 X3"D       4:OX#uh")H~в +㚅Ij        `ꮹp뮹eHU_ߦ> X|e      ۷ UKwo6$IU;l rFhj       aj%2Du
#UNpG6 X|"        z]D^5^T{q 5
$        dhkzWwA5jg9z 5dmYz       `-  k7!|2tXig+Gڝ8 kwbL6        =Vh@[9Rv66 Xk͜        ôc]`FK3úkNjg!f{ 82tLS         7`9nQrIU{ým ~wNL6         J[܇kͱj"?Dz ij        `#+	FiicBS         *"fuܚ]Rv7S 6&/4        0eɎh+GڽhAP         S)o?] j?"g a/P         ""v뮹42IU{O} 0 Z`a         	]5'RT{q GK,        ikj=hhj        hkEa5ͣjw"?(f hj        kk1&l]3h+Gh_!         ,>йuYR/"b{ Y-3        ]s*"~2&C5IUޫ `k         <yD"VTq+ Epmj        IL5Ww͹.G`؞,  Z         oJH]5 jw"\; ~AS         <PwuD#3ʒv?"n (gZۄ         u,jO=Y @a\Kwl         [5j?DoC]sbˑv7"#g [n-|6         x\߰07
u3ʒ " Háj        G]9"(YD]smʑ#"> (I cˀ         ,"^SUTq 6@q         rQh+Kڃhji'         ߑCBwĀ}fkTT}=Y @<X f˼         "Q10Yw͹)G݈8 14         ]sWfŀ==k6 | <6         q}͋8B#UNDD۩ FЂij        TwmDt?%U^D\
]smY         i&Wwͥ#U,^O} 02s-m|[f         ?ϩjO"⽱F91r݉l 0Z'         OTwQDܙkpӿʒv/	8k         yfƊE~5]Th{=Y Z\x-        2UUDd|,ټ?(]wͩ#UNDhgѻ2        L5?&"ꮹ5r݋Sl 0	a	        yrXu	%UaD\
$|W         /s}eyyng4rlo> ~vda94        ]99"bW,j"Z &0%j        4)w8,jkWS LUKe         A8ڤʑv'"N$if%         KJ̒︈=݋k6 n|         `y"bfQw͉%Um  5{|`4        ]9`MD%UNs6 üL         >sedr@ʑv?"5{3Y ]]s e         t}[u )Hڣxo `40
ij        %6"un"bO,jwR^
 ^>j        o{3@9]TѯOS `         `uff;9)H~>EĶu =|5VK         Vˈ83ѻݼ"UN~[3  2g         XÈ85Z9Jv?"\ 暖a}4        
]QW<j"@ a޻k          +VwMueΣq{u\O}%IU2"O} \]sj,>[f         kѷ]k*<7x8\Tq feX?Mm         uFđY&	&UID! <(Ձ5         kRwIn̋é4jw#<"^O} n=ij        *<"~h+O^ 13 6         XkͱUD]s>A&Um߶GDlO} 79[         UwQn"5L磩4jw# n`4        f}p̡!k6 ًÆ	        ]p~0."b/IU{DĶu ~=lޖ5         rÔv͙GQ5'S@RFĹ 	n0hj        ͚Dľ@[yR?7m {@        ]s}ȁ}EKU4">F <ɱP         lX5G5՛G/u]ټˑv/".#g <Ms!         0ˁ+V*"97㲤@ xlY         ؼkS[8QT;q xw^ aX4        @]sXglm s]=600Bm         0,."bK,KY, g50@[         TѲ;IU' %8	ä         2#h+Oڽ& ES%         4yد溠3v xyKeq         `x ">Y.j(Oڝg ,A6N6Mm         0Pu\FM7'VT{q- ,чN         C}lʒ]x5Y  Kʰe         `f7Nl[?#@GyRDĩv6 `e         Ww͵։]EĮ@[yREĵ@ GyB         
PwID\L|QTj  "lY,         (,"n#b{bKv7ʓv'"N +2{d0         `bշ	'U^D\ +t$         2"'f}Ưu8\TGj  V8	        @aCW#^دt  UNp{s V*BmY8         (,"#b{d=xTq>$ 0,
         
Twh+Sھ)@ 
&         o0PT;j/#u =#P         ,7-]m<j#_> `-nx        @"b^wq?]s4O_Omv 	6         (\n9]\D^5jwR 5:"         #PwyD𝼫?y  U~D27 `=G         Fws9߅'JUۿ>EĶ ktlYP         ܦ5YDjg+Oڝ8 l<m         #cC9D@[yR$ Mطj        2"mkG7	HU{ wu\[o-k         SwIxoC5^VIU}g lY5~7Mm         0^ܘ.YLj"Z ؠ~j/	          #Uwl;ݺk.ʓoC#"> `c=A#e        `ꮹNU;ˁUyWw͉QyRFĹv6 ` fuZMm         0ru|w{2=k6 ` 6         k"jEDMp^?IU{> `.^-         qߩ    IDAT<"9)O݈8 MD,L6         k>`qx_LjCm {Yޣ#         Rwu=Շk¤=?"b q`o	%         SweDuߠK5^'IU?,g ʻ'&J         &ӈ8w~};۹HyR", A9ĒmM}          0UuM^+#8^IU'+ &]36         |ol)\YLj"R ~oa J?/:ꮹ4d ÓO> CY  `b+\Ynh۞, 3VwgK˗5 uAdkמ~rxՃ/\:?م0Dj_#~+什u [{N5^~΢cv ~),ާ]ܫgˋ~OC,N k5' [xn,\om⡊?ip0Bjvq_u<< B`c~"j=SI; j[8ϱ'V oyt LB{W1-~}  r9vo>	<B%76i CuVw 	-8U><痶@yot/\݃unzӰ kطy۵}Ǵ T;9ք f_# kEϯpM\C&;cFlqm!tV |wK gnOjG	/ lj-5.M}=@~+Ѱ
0Xۥ6jG	jg	 0dh*QBm Bl{5z} <80`S=``rރS%xfKA7 (-Ǖ[QBm )_a& hG `@aNr0+_{"H;zXA7 6.s8!1/4ûP6xP <u ׺kN-=Bm 9ĶķJ	cL)u  ,U{b{cpm؄QBm v< (q5GV
Bm @%'xpl2|M\PM+Bn <G|mp;0F%0Qjw  JqVwj?J&0E_o/Q[!"U}Vb᠄dys:s)!7 ~H{9| &(? @A.9`S&@s"Ϻkb<h4+ĉLQ~b؁2.?D|aߵsr;!7i0A6^@m QBm 0"~ @AnϩJ`AM]:0D	Ι6 =-g)xw[90 Ktp2P<J`"=S 9	<PD[bp<B?	BﯚXhc;p~}k.ȟ`?dk$j|5 PynhiY`IlC>c(EKU;dcnO-P y^&N}P|a&#VD%0rj߭3 P6ńrL?;`Uϙ #rm`
ӿKx` ,?T0/b<<gEQBm #Ϟzh( P_9xK3,~k~O:7mHڽJAʇރ)fL``c7D
0`Ͻn-	 F({9y+ P_kA U,Abô#2amBxR #rIMdop_[=H6jG	Lw
 JX6 PW,Ғ#߄XVC|L0!x/ j S 
vVw" ̶V|3vg.7Ň>PaB+yw
,1bWyeO jsg` 	K'_艛q`)6Q&ޡCC<ʇn"c	è΅/َW|W 
?u 
&P,al<É'_OGnF<X r3yf;_ۦGg'F<G݅V6Aq6x Ƅ	 6xP@簧z =PCcPfk!D' OiǄG]Cvm B泯ojG	(?\y p71yS7"gC49Dqfu[QCa6!IWyX}{ۉ{Y lW!e.jG	&Umw NX96&K;[q9ik!pA$āpm׆L{ô/jG	"Gxƚ hBIVܔaT37s.߉sUT|}*꧚_)6;W'P|P@G F?;{Uz19j|abO8!
m}V#Oםf6N\clGl/2sjG	h sC3Z1 ڹBFWOT{~`P'$$߇L}B7}֐a0۶dSK ˟/RrgSljG	h k'$͹Y5a(<]hļsmr`Noo Jv#qFjG	P|5 0mF1zj!n MH} 6ŁO(Uax,`Ca$Cq] pۄۀ70k+7{)Z%00j|6 @1BmZ~JG<	}mfC^!CQ(vHU{އa.~T`
f9<	Unn;'  1QBm 6o	 0mF	1ZjO}:96VkC'BPwSy6~^M}0 790|kQlV6`<T㸿'8և  U^i ¹k`%IZ|M:qQPRKan6ʡMv9jG	lX6 `DoAh#oYlo}.4pjwo~곀Bj?
#LX|7f0X9 6H !6`06pxIR t0n.V*UA,0uY4ؼxA2u| zP| Te!T]hԪD\QuYt]Ma:`yn]Iȃ[-kTYlCVVlw6NΧg=zAѓν~O=#̈pt!`RԶY
;	@ 0Cj1mÇ؝[ۉSP.S2Or=izcv^t|gUar>jd&$m 	jcx7`'^AfQ1ed¬|E/m+0P1Mv&-OAI`3 0#ꩁ"	1yCvp#vKLZ[}0oT(t	z!6	`v^Emw6x'6tƜߓoZw `&Q)[ÔM(5B8xrxYO 4TV$m0K[Iaυ93P\.:\)=hYB9#  7wR hfR/[?܀ş
?wx}]?t6{RXw"/'O{mƱ0{;5ɤ6?I)ٔ L3IT7=\04}2HxӅt6m M.1,ޯ\Av~`v bh_ 3"LPş8Aj_Z0,ˑƀpM;ao^q~@.5 Aw I)7 3#LPSt ;zXs!OG
7$ CtOUsM[B& H<OS.-'΄5ց=wC  BJ鯧5 fDo|vɈGv7mڱ{Yb@)3x;zU]C!+g 5Dcp;gb'[JCGip)R!"i;v/,1=J cRa6e#^W#B@ B=W5#0m M<Q8i9Ķ jMk)?Y	 6`ژ(<[,Nf-@τBۊi)\"2
mCF X|f,/K	iGm-[m @ǔI)~ yR'LPSq#;Kr<x!oR
8M/tȀr Kό.jh3a⁫g!  Tah_I)Oq `Fń6"674,\ Ƌ!:o,K	aE("nBXt?V*=Kg X 7RJm6 03m	1
Yub|>|U^\p&Pan'zlĖ<u8&; \@[Jo) ̌@0/$Ŋ+*to7wQptEH a;v5z\s LvQ EzR:0@Oڱ[kMzڎݮ%1K q Ť654	ԧ)5:kQ\Xl %w16(3a`Ll bh?R@ 0CmQup74}A,_Nk,x"Edk"r*~wA~֙Y	;L ^ehSJ]J& 03mQ(س;=AQ RWU X,Fl0IAa.	; !4 ꯤ@ 0Cڀ9jT1;N薩(G5J.,l+50yLmP g  LI4Th f(Lf_|񅝥(Q]a^cwAµ]q:C&|($0cWE3(EEVYJi	qsVO۱\yN)}S W)vl,0W&Q"SX͒	r6Nm*.VgE `h'"Sͽ  JSJ_ WlH56SڼE+P@01e6bҌ`1:ǰ0VECӛKL(A< ehܴSJ 03/"vacj4Q⦵E¹P`bJ~yqPDіg&LSM/S=~aݜ	l m)Rg 03RJm@-()m.ӊ;	g:6RŴ!&P<I*x&A" EO))?dG y^XBm 
q/ 3_-v0PSP(MSzP&řcg@	 ZMҷ  03Oڱh#Fbz˞ݠ@k}1xMJ|O]L:,D Cӟ\:(գ)  |ҎJBm/bJ˕S ɔ]$IX}96 줔MkQE y `)O)! vL%F)(>/ 35BDº䟽O=3C{04{+`bbr7 Yt;q  0RJc7z:ejcbl6A
`J:LdKL>O)Z gn,%&f#m~ WRJnJYe `Frms
N
N@%`B`%"~Rڲ ^D_6ڌm Bń4SJ?muyR׎݅MjcLѲ?c
R 5aҾO6`N
Cϣ? VChf"? %yJ |^Tjc00KY.g~MoW0׏l+ wџVMh pgCyzIJYM `Fc/UBmPSi@e6J	`3`Y-OB5 0zLVmL=~ wp `fcwhSNub)Y@Pu9Ŀ_;"JmYX  zۨML2hlh{v hgZ< `F^>lԦPk34 ɂQsPMkB7 x΂;\@i5X~n,il80c\z 3,iܦPdJSh;7 `=23;bO`E6bbۡggܴx[C;  {[3 <@ۅ]x?6I)Z9Xiå`B}`r##;mEbk V-?=v\	z`< pHzҎ] Wjc-\)smhh۳ ?m@%z7* k(~lM+Tth{6 x{o vVR0Bm)mL՝~v#q`xEKr&XT  6k!ȡ/< Pτ:pf3Jm o3
 3*a;vܐPm器vԑབ>-G
KSL(^~)@@_UC3 `YI 0'r]|;vvXژ2u7D3@Mr}9BBmEV`"y* ܥ  sYo6ŔF6 ׶im|h
(].lZ$ 
m{&$\:5 f5 0CcߎKp{BmJf$O0 \B-m
&ӥx وmmL`tF r& ̫w۱s Bm̡MMkοg^ 3~W  $$M<Moy .m <˃1ڱ; !:(<`6Cpcbs~k6Ɨ"8 &*-~6,,{F32  3Y.l,0y1bƩͻv$edZ[	 Sx+    IDATf`sZ W| 6MHv^QjcS2Wui
nn+n}]e !614g 7 ]
iB
 Lݫ҇i$BmPst ؉͉- xLe 16.58S 0Om <˵؝Tjcg7`an4U(^*$x#@X3< ne9 ̖@ 0Oڱˁv`X)M `1nxp	{y&@ lc-ϓw>=Z `^cj_Dt x|oO
	Rܙf 0h; H)c`  ,Uġsh\	P16V"!N6B ' gypK;v6` nU1< K94C|M|]5mbo `Kg! 8 M, LGcFPsy0j`W_lYr
&6< `u0 w )> `^vNl jV9S uN1恵Y@۹! #,LXQx %mm 0QOsM{;v6` n)
ctXFp{:τ@ ӹ`24`; 0$ LcP	S ΛS wr)LK@ ݆`\g`rt elH H)iP6۲v +54%yj۞7`2-m p-m,wp`e\o`hs. LgN;vv,Bm  L~	oNd".4 B3Sjs  {Z6 `j>jnv<Bm  Lő% ]U6 &ƵMRzh  i LԋRێ݉(P  SRڳ[ uh9eh>} LL  36 `b۱q ej  z	MGm p'{Fs  sN  Lƫv۱{i '   ~oh@|T: DP*L  74Fk <lLP   ʹMR:} `Ep	bh{   ~づ  &vr6   Ծ<U ;8\v  )ǵ 0	/RJcwl I   د~
a3 y!{v  Ph s  (\o^;v6`i   z^R)V  KmgCcB+6վ  @ݢڹFk @~ЎwltDnJyJ1   SJ24qJiu    P;6 `"M)؈2FMP   }P伇 О7  ݩg# `Rv;v6irӄtO8aF j   2~;tR: xyZL   19 DR^;v4{|@ń   l+wʲ.e yyZ   [4x9} "(ߦ~[4C?RJ6L
훵/    
{ r~yݎKk<ob}u   54nJ @?L)b;v߷9p?p8O)i:2   xmJ)w (̦M/t\:   Ig~ =I)5m"@   {+9 c/iL  Υ) ۱;lORJ/`hZ=Bm   eVcubJn P<gf߿CX  98I  a~oގݟ#ӐkH)=X~G   ljn P31~  >?m  
7ڱV;vG6eyŒ+   z"Cӟ( m:;
   0t  (/c/ِiȍI§K<k߈`s[?   6߶"{؊ :74/  VL  PRv;v`C!HW$!7n*!   ɴ%b`~D8  PD K)?)oM6[3'   iߊ,U.ؘ stt&(^|e;  @Y֙4 P7RJ@4{ɡ5}G	   oڱ"14I~u   u PL)}_l)_.RJ{kg1y)6   ktZSJ}@Evbrl"  Ph"d ')mE+1qyJiO ̜P   6BmBNg@EP	z`  M fR7۱;h<mh#Wo3%   PbNf[s bX|'  M.Fd X~_M.RJ;~	   oSAMkB V)XwO  T%6< &܎ݷڱs>CqNdh>@Bm   [E;T@  J3  I4c X_ӐbC_LIoݝF0Bm   (ԾSq`8-G)  K<v `FM)	6DE   xm+s{C倫+mzqZ׾  @]򔍔# ؏RJR7ڱ{n˗Ї?K)=pރ3    Imԧ MDr  $Σm: bRRJ?ӎK_hp1' '   έ*jF!k  P3 fJv~Qm?6g-mx?    V744L: ד_["  *Cӟv: BRv^X3m'9;j   g\_t; AYv` ZMGm8 "7ڱڦ![<y-	   cR S FЍ  F4` XRyJio$	M   C횆 bբ^]5  PJ
<>LCVEF|[`Lj   gCGk xAwVz  5) )	M)J>6   *
04"  PLi۩  64~nR:  KIJ[}Roh&W>A3 &D   P{$;A ׶"j  g  SJڱ;j.<tPZ+ "   \EN*v |ݱgJ  P3g )?R2j"ސվlhM   \z(+ kC۰T  UX2 D?h;xީZwˁvN
|%&   Wt  ,)m  @- UJڦ#]xh?#T/	   rgfi (.cJ  0{1N K[)v:;1Fkq4   U=QH VY S  *Z  ھ׎s[MnzmE(P   pV+N  txGP  hgQJOccwna74~JB[{B	   ס;MR:(  Sa䎴: sG6 XRv~Ţ/7>7T;;|%   \ǶUB> 0"	  v XORJd;v߷yރbA6[r	   !ݔN w@s [v XI)vڱ{iA74a.Vn>?ov   %Pg)7_ݽz ,NȷcwnEnh  Z "_n4wX<O"   \KEm,Aët) `~ U91v?;  usϙ }BNqa6"8hbD   
QLpl`ҞFx-מc椵{_08wn^vMɄYAvL#E  `N=  w*Scwd!ah\uX۱L
!   \nBjt+Lʫ^} Mc<._g#{u8
S  Pr ov^Z]һSZi~
A   j\8L,^M!vt;}~~9tmMԎ݉=(  f)|<# w;)UHgߍFݯ   ׵]J9Lb=g sInKxhSצ   0gΠ[QJ?jW,4M=}
74~;vg/P   p]Mj3":d{|9-UU'ްck  0KywJi SJ[t3EYi@%   \WA9FM7ċܶuPԇ(wdJ>  [fN ݔҟfΗ'`hx,Dtu)   \WLB<k$vvڮ֎E;vH)}RzUgm~q?&  ՙf ~;W۱;h+_>+BmFBm   MlWZ:zc^L~_h	Aюjjp  44}>ٲ <MY۱yVsmŅmp]7=   pU
klǂl]:?PG:ABQ^Ok;6  `v n۱6CsGÄw5ym&   7Qˤ>3ٖ-ۀrC@fq  N! pMRJ@4&iohz6X6   &f_pE如<K)}؎ݾ0]
};mԿ1  `v2[v %7+l/YMR:j_	;фVO   &Eq9\mcwnW+s0ݔҋw(imMJ    u45 SJvnVh>Wg0y)VM    D1X9$Xv"}2  0G
+0۟l[A*[nZ04EJak1#b"Bm   M}b)m\y:GzW|6X+~a)  `?2 Bv~BohRmվ3tZ*	   ,l'VL؝Զj_X߯}?d   <#tlSw{)c:情uC:˞͡ݿÊ   724LWlߡ3,͓]XԶ|=5Ԕ6  `~N= wSJ؎	Z$AkQќX26   >yQ *tڔZ1Jx  0C{ !7%T"жUZTUj   njvݨx|s*9쟨;N>}-`Ŏ*^pS   ;r;vhtCӟ[ª   75PjX(&,Ok.۞GXw+]nd  (| ސB)1QoI4 D   ZԾ@ńu>ڱAk_Xꦵ=ɹ  ,3΁ .kE)ۈf   75!&<in_mڱ/׾"{Cq:'  n ҟ|y*)?qM+%j   b<i^X;vm2ǵ,u.H)Q   ,z dSJ?׎h+g;_cZ,P   pShp`1*"+aB?Z  E#5S= 7SJ(9jakh#'   ֌V̡#ܝ@[`%6*
  ũnJvv^ԾM	H)=}-qEae   *Mܙ@[`%f{|`^ *Μw,$ TSJV;vǵ/<b}z   7c|'w#Ɨ|l5`)6m|w	p(>zyϗ];4vJ^|mk M4P
 ugc?վtvPZpcCӟP   ppp@Q\x-m#K	xE|=_fqߓ)wi z P_nj_)Z39I	    Ȯí=@M؝K@-af2%kR*cx:czlҗ( H< P<E/c_MI#Q	w'   ƽZt/ʅQ_EAIxnܓ.9v6i|.lߍ. ̟bV R7+_sׂ9;6   6&j>L@ױSKob5f':Ȗ@.䯓<M TN;v?o74n?`6pG?e  p9z<$8CjY<;^ORJm^;vSڱ;i.OovJ ?Liҿގ?m74}n@Kr04Ņ1x]Ov/}{o|U/ښ//\t/.?S](}Ҏݩu:at)ԂBF7ٹUHQ}ZpɛV> p;
*?h;|TLm +;w-47DiJ<"xafצM*:$|:"\zMQ`JT	\X?0 

O#ȦI[:'fp0w;7l4 T!9ۘh$t꜅ gR S":gc;ү*Yޜl1":ռuVXC+7$n9ԔYk_i}Rt S
 uҿ؎hg+.Cӟͥ)!P %{d; K\0tE7GQD20Ue٢]T\,؉|}=,Ztds7s{&o?b"&0'vQrn `qּc `!Vh}kgy6 n_|eceVY,}"]M7&S*'_EgjNirg^v=#+	ӖLw/,FuGS8۟c%; ~{c'Y0nNjIhS+E\&7\oLez;|vogihsaa>ihfULf$u3Akj}56F|qfr-yҎݡ`^)oD|^ xnHM6/	rp7s(ƂeXx>*S@a^t|@    IDAT6Kk{c' \j /cM{B@a^;v6溺 kl۱7@eT@rܹuʁrN;v)6ڱ;^,R;vcz0pwCO9&"Ο4CX\  )?g-iɹ@:1p3Bm ,lE"wg0_U]M:w>R\ky4Ҏ]~BL9Wg \ϟJ(4s 󿦔vy[[<5wh|h;C">6 V%F~40ۛ~sOP~wa7EAhX|h<-0$&jMbO^'&>alǦjTQ  A;vB;v/[-w;n@UBE *b0O3QX|]8g-pLm֕j{"/@"([+)0hw1PLʓ#>}- `b҂j \osMN?sq͡\P 4SBkv-"|ϣ+0VCM" ʪwb@l "Kgz KS]_ ߊz
74/RJj_&xhl\Me/?jn+cY	\a;v
~ϥhM_<q+'*؛Q`Y"i)zۦbń-
 Ôҿަ|qv>	TGEٶ۱S@ nꓸƞ[aL`ʝhH 1{S`Z>@uAzy{- h$ G)c-ge_CKSJwdZ\ME/GtVnv[]6 7ThUZqjl |jb32 #g 0yy:ϵc}[YxYԾƆ&p56 tSy}-Ul7ti*qκw7.;|jyC ĳ֑I57@[]CJi`vM϶»	pWv{m{v;m2W31{ݗAYTyݼxQk p yRPMr#RJj_fM1x6 nEvuGBIyfeoOVP)>
3fZc|ݘc>t Z. 57:nh|n)վށimnBm g
] 0'm
vJ
jvBLᅿ{3(:Ľw p-A4tM>7x
 M}Ԏݾź4MH#?EY
(>RY;imCR* _LD#|N w	
 &%7ߎwl[RNAa۱Sh$m@}EG3{QuuQtp{JOlI?yv{ގݮ/ x'S `Z.iϩ}+[4gSZP-Bm \nVk"tќGk>",0@Nռأ4~&nJ	BvO_ dhmS `2AJyLhsQ?>S4QzP s+1W }܎ݾõ:-`(J4qŗ%roeyΣH?ge- ĉ I͔ϴcmMЃim6 a9`r(+2[JiϾ{иBwSܳRJ|^E;^D;vm Knȱc) xgJg۱mUن?w?[\bZAw:Y\<FkS@>0[jC&MA͠,m` |I3J (ߓm*WnD;4YJqJic־03/DL}[W2Rليh%jrw&P3S xl0SSJj;p٫[Yb,xqi")̓?iX)&wSڽvHc6 *fR Y4:(gH)m־pA +ӃӎL6ݢ
j_ Y1Sk O+@ힴc@kl6@ўi,_>>7.|TZA$V#`fZ̋?%/MIC`96   P~;vmxzIx}O\`~R:D	)i 3Rd(?
lS+; )m P׵6lCtkdZKBm 6f`h8p[6vjm܉`  $jm4h,{LB Jb:bԾ0!m^Ծ0B:  ?VZ`}>y? Eɵ۱;TkS&0Q=6:	M0mkEb&pw[,vsPPr ex]gsj?ʕϜ{iJilBՄ ʈijy.H}pmj_8p}֊BلYϰlڳl{fqS O2oh|{R:}-`ILkjBm uh>i\m54<9T~6aqڠNeW0	 +1Tٔmhyj	PmLbki;}` ftT83g؝Yw)? `ʢI1 XM5.MϚ6j_Xj}/g>BYLd4Li%/GBm߫턕zA#X8<  DM"Xh;Hl2+&	AY͊ߗ0MBmpsP)IXu#$
w`%ڱ;O)}dv` `->jFᆦϡA2XxfgIHg^ԾPg4L8s7w	>.`jp V+pʵc}fS `r[ϑ*7>@=GVYP=Z,)R{m~ڱ{?P4'DD-gR+ XCgi LE4x2 V+7Cَ&jh|{^	`Zj2{߸:}`͞)5`ZLk:rl:/s ?N
 J Gة_,Q C#3"0_1mjKbXiQ4!LĺK{mNXiE}! *~_jȏ؝XMxgCsZ"0Oc 1ǡE!0L@w`hzP"^jrz):)F,?# P6 D~6܎
Mk#(҆imD`~rwV qLJd3LêatzcMNMtjyDq:n P" `>jnֺ\2ԾP80?{wwT7{)`F 8tNw#h"(l}kvOwnX֔<UO:1X6yI[et1`\B3ivhڪI/b^8n	`x=gT'Z4AUsd *8Olm0KLvjN$O}Xz`$d,PLMmПm1WՆqɻcV܉ *vuzI ( 04Fa	!l-0!eX6_,z8]}ˑ-8{[6m)4jP3֝LI V́M$ 0ៀϰA|O&07%ɔEsu^$a(G`I@l(/<۪= ˇt
B~A&U󲭚tk枆j/Ku3vlQpRZ8䗦gm1c{ueS:a lR~Z Wycj)
^Z{{N`>I\4a,0ͦ6Vzm&j)9cZ0t uLL}4 6 CCh'ކYj.V,?$[z` y0%8ejm~m2¶f9nR(s*&0$H[C HgbS,_[5G9жZ{%6i;?B {K>xc4T9~
&pۑH[59_٠(cjn$ŮNׅW; HcW
<9 -g0Y,]C@r	}Byl_UsE.ݛ.[B8_^Bwaԝ 0&>`}lgjR/0cipdfI`Lfڠ_й	A8^?ܛ,K[3aR~W`0i)Vg[|KP lϡV͙njkd !qper#}ejl;,PCBm0[ژ w} |w!	1; ^bi_8 ZP|B  VV͐P`0g`hyB|]}(6mռlRe?Lϱ!pP7  ѐcww13'
ݥy$hCay0;Bm 9vWk;6m{3 9rz	̊mm ->Th XElt<
t?`6 6|͏<E yy
J"Ք`HG!-' h=a̊Pt.r|dP!7  ِQQ@μ`+` ܥ[է5m#G1+Bm ӐUjPr mok̙C7 y `f.B{6=̂P4ܪ<C#ši g%3Ef. =;RP 4T]CE@̆P@bW\390= <46יz Л=w݄bW{01m͟0yBm hX	h AҐs=bO6 }΁k56	1Bm e3!'VgKO4 z#"Į!\6 =q !.vQcBڀ':V(@lm<Ij6X-m 4 z^P?hПSdA`mmU r 6`m1F%P/cK4y !BA?n/cIbWwa [ ksZ]&\X{"&O\VƖ6V1c"  VM!4[ܱDs-& ]}tU/J{#,6ryͪTΖ6VaD: jz%`6 nB{cr <{#&MLMLnĖ6	jfO  zuk4ǅw,QM  X  |]m΍MX[5'mژ462	\ d*ɲ <Udڪ9!l+ ]-=qmդ0/K]26\0S MmP6? a KvLX[5!聐3B cp|  t}njw^Y0 XI[5>P XOCުHLMm e]F`6aLMm  sPTu-?[z XI:d ,C@<kG[mh$	E`8>c́i ~yPπ,P9 `5j479\jN3 ȶ6&I, øp`v mAnbWq ~¾J cW-Ùw@^{&6r\@iu  +/Ga=Y'x!]}Vi
,lkcr aKpNՖ5]) lM"  +/6!䡏wj|Nj[gt~u wLP@9ƍM   `bWN Ug 1vA{͞|c 70!P7 
0}z P/Eamׄ  «'</mռ^`46\3)Bm      Ѐg`-Bm5? ̡
0SW!̶Y`d6   t   s|V= jm7`>Ʈ>]}VMڼzu F`    ЯkbW_-vP ?r: ]UjB,1Bm   @8t ߶{m|mmW?U҆ f"=[]mL(6&C   (]  J|۽ c0'bWƮv3og!بjlf      `sl1[ B]}Vͱ-@!K1	Bm   @ڪ9 A\?-l;mcmռt(!Ů<` (|OE{=      H.v7	O6 0ulg[ҋ 06Alj   Jfj 0`3Le x#`BQm9ڪIv^8P<6   d{ 066՗jmդ{}`.;՞,D[5/KPm&M^h      (h x lt E;9Elj     `U6&ܪ ) rB8h[jCKP4C(P   P ĞbW?v> Up &s_jvv(|Ez-      &N & !pL+mZzIHX~_Q$       w  O"@nv6j m?ZzpE     0	 cmռt@}΁6v :kAq^h	   P- (lJ S6 P±lUsB]|!IZ~Q      gm< SBm &ogX<˖6`t        FCu|]})d{aK1	2@"     fZ3 ~  JBx#9j(P   P*6  `6bW& 9`	@)nB{uGli=y%       zP^ r|	\Ǧ6      a]/ Us`	 Ҽh;li`=$Bm         l lMa/v.O3sD   (K Nބ   P6 6ShЖ6`F(Bm   @t  K jvBBbWϜ0#         خB;ڪ9f=x         lȁ0ml(݃,%        My !Jjfu
0S۪y@        ѵUs *RY`l̦/      `P | l<ӱ3̦	        \L    IDAT	6 0{v6¶3fE?m         `Lm8,@.B;mH^(   R    l>Į>UY:XZ$   R	    ׁУBhc]ysm'c          "ڶpBh6M        ѴUm[*@>Į>]}DXjuMj        `LB]}®ތj        `LN^kUgQF	        0j^Ugx!|]}^p4yK%lP     ŮwK  <MT`|1Bm       S_ 80	>@۵1h[rƼPz         F$ OB8]}bP"`ܣ16        0j^vU'PTy[%N   (ս     ̊  <hV-F:X2le   
^R 8L  < Cv66Ė"`ҽ߿Φ6      ,v: gSUX0jlP     \9  0j^voz/v	ms KVN        0 BxXa `|P      L p@ݤssu S |/      `P $ d; =     `y_  V` Bx#F^j
@nfGP     \9Snr-@&\1(О j   Ju3     8}]mK/ NQ	      An `X« 96j     Xub{f 9	<W!՗z VgٌR     ,PAn `ڪ	!l>|]} 0Ii1   R  0# K%!Wm 0iP   P: 0`|  K:`B;/ &@P     0@ XV[5 K@$}]} % }=d,Bm      %x[J' BxD`>ڪ,Q   % =()l  8	0k!՗ c6x   @nC ЫcZϲl Ӈէzˌ\.r¦6      VZA jL'? r	칗cBm   @u wi9  K`>.zk=e<3ڮz06   d^ 7z+jfG i__fCR2WBm V́046     e뀆CL<;m/`^ڪq0}w!T/96jcpBm   @ɼ<  mY	> ̏viH屫=KbbW{/o%   
 @z<tBX m6ώLCv6Nxlj     X+s8
P0=7[2pkmDŠ   bŮ ^sᑶjl'Ss>cP/     `1ڠ)fɁ-}q3b<7ϲMm   @t 7k<Mm56`nv66/o)|Xz j   Jg @?Nc><ϾW=g;@>@g<7ۈ fj   J' ,mj	1\iջGm⇯	|mW=P   P:6 +gxÖZ ̎2@nv6Ïkmx`   ҙ	 Cmr(`L(ϧ{-vm7P   P:/  szAz϶V& 0;q ]}5$y|=j   JwC  vLX< `L(G8	<٩R|E   E]- <i
33(z%qbWy?37xF   ;] XٱCKPꁥ:yYr`Ҡ7L 96Cj   al |]=6zX
1iTv6	16   `
u	 .bWX"Uu``#>Ʈ޳>SJN    )% 'IӸ`mm)#dK!Ucz?WOzu q    )% J21;
%0`tWzڻ4Y3{=Ba  	pP >ǮT(Ƶ/#KVK fZ|~~Wf6   x %zkjƶ6$ڶt`^j+B`xyR1ʶ6z'   LŕN |&]}@ jcIliTz_68H$F   pX Oi{7%~[5{ί5`ljNzt^a<`N   
6 >K|WXY [ mWz*y,? P   0: ,B/vQ@?޶Uc	s'	0Sy' '?KgS{   D8( ,]Ǯ>;]{\UsB`jׇէj
HlZ =   A _iۻtz'oeB-@ :`L]~>$]}B'VElj   xW/	AlkcڪI_k.	"ݫ%)=9o ^   Lc<w1G gSz>Į>hrO[ȁ%}$   LP @nzsC
0{B s2O,pUBfB   )jq1ܪ2ʶ685p#.gj`ZBz,gJ   /(`ՠ_19{`.aŮ>]}n0-Ӏmz%   L͕ R[wUL-m `%7!gԻk`+6   `jl  #p0ɲt6<h0o^XmOBm     Pp ޶UsLԉ-mЋ=ed ~,=3y(?Cf <%$mxNAo   1Ah FZqLM[5)^ Cnv35]}B(Oo   I]}k< V]n[5jcB `>@A@0cs+=¦6z#   LҰ:Z0
7E)@ 4]}^i`CwZ,F   "auBm VL}[ڠ_ܤg a̙F   "au0|p4b~[5Kڪ9	!ja1)>ŮN[]zv̝;F   Bm:J0j,H{=}`KKĮv=4~XzY   SusjL`ҁ35PgB0meݤϵ	NC))P   0UK Mm0jNԙU6Rk
àJV́)vu
& ]}$U[56   ``u0ծ`8P|E3 BxX_8F^   4<p JamռTj
pB{zJzX#mg;yGbW硓mܸBm   9,u\+4b;۔Mj&mhP%	,oux
6`6   `lk #pϡ"][5/*z!]X` |P   0eK 4/m9c[m
 )hGWJu= M(P   0Y^³0|@ש#KmEQTBm}]}u EI   AXn[50`\[εch40C%<^Ů>QrOmL6   `ՙ\R
L[5G!*3B*m]06`v5>   S"dw :6c7ols޵UB8UY(aF`N>Ʈ>ȁϙ>*TBm   Ů!"r0|ˤa،tLS]捀0һD}1Ů>l(?/   s` 4؜mыL>w zuB˃FmTƺ   98EXP cjz+ƺr2o pBy]}BxBx B   Bmp* I6Oghb	Q6`+"(B@=b]Bm   \\$̶6 _2l`u&EnF /Sڋ]}@igS
hP8CtYP   0`ARܶ^*!_+Dk Y>Į>̃x 6olC ̙P   0K۪Q7 f #.VM~PPM "m<Ou]T~0P{ú   YntV  ]}BxPe(nnc
L±s
#0iA~F0)93V@66   `NtVvhS #ʒmm8_vU&cu P
K#*ve&`+ "   ̉C<t X إCqu`V͑֐m0Im v=	B=	   tV 3 C3| [[5\9ЖKL[ 9v,ĮN*m y"kj   ƁiXݶ )v}}[5mռԟemL{ G],`bWw{0uBm   ܜ(<ˉ00iPm[5mդߖ^ @)nv6E]}:>8 SB   9]}V]<8vӴU^_{~v|BHS[g.5uVͧ5Om-KT
X0bϿ?UM   t8NҶJk;kLOC)}?)v-\> >ol;J?Z7m: R<s,}>bw P"6   `NY4DXb;}o篿^:UCn|	0qt-^m[5cW>j^|)vISZyVMEY 6   `v̶jn!L`5mm [iKur;!s3
_v՗7=92ml`>Ů>XKÉڪljh=   Li,<f/ڪ9j&_bCcSxoiBC]Ia۪9ap&"Ogo`rg7 s)h<h'pTu   sulyNR#6u/V}uLWڴ6c;@Z|sel`.nB{=W x@   Y]].<ۙoEvv͕-nLg0mwͯj
NeYuY^z=΀ocz/`O!;u4Bm   9ϷgˇOFt~mq8y߫Us)VG=s:N@߶TPz~*vm k]}|VG J"   ̙- tHjv@vōNn۬Xu</m* qB؉]}a ]}:{g j   f+=7mv*T<vmCɓ&	<0Gaxtݿv cŮNC`uz`kj   ΁iXV>&Bڪ9!P|1lpo)l~?0- (XzV*v&'vuFP~   `ҁj􃵤mN!7(N[5sWwze[[5eӄlz&WPtk!|`gTO@v۪IǊ	@A5gO ȟG͙ lMm   2mڤ"N0C7T|c3зyH c6!!FMm   ӿ4-ml]-FUshjFF/&uaqlo<G[ҦR^,aؠ\(v& lN~6
 bS   0{!NC/~3ɝMy?mŰōu ,n78^oV66`h)ll+; 	#vqMA[ Mm   RuzqmiÎr2|,\*(/_sh#ASh؄m՜ 0O<1pA	   	zaK6VQ8=-_[org_JX~K:ܮ[|8KV `г!!Cmդοh¯E   X3ݡ7m/ڙ<[ZMu_ln&qnwmT/_Bl@qD Es ]}Ve~o  j   D%v8d+}t=ޣ}aWsp-]䯽k`jC էZ	0=J[5;9L J   Xt(/^`mռ]}!?X[,϶2=$zKB}fu
0Sgy$ %]{b0m9A[5''6   `iN`iNem-\,[ܖ\Bi&KV́m $96`>{j.\q X)!   $PΝ ҆j^*/J7mդ y?ɯm[5iY
?  `; J[Ů>h=m^ %   ,MR0	񲭚=5˥-M<-n)j۪93P lvޠ ϑ6f,cW>3 j   <O
mϤ@R#lq  `  9ڮU`bW?BwZs   &ǅNu)V͹p	ߒ6kUsIЇnq;abZbW߆.^ *w $<9   	:pV͡zţloyI[5;=	  `[ OqXj]~} *   Eʛ@>>"mOO%TlmUsk;#smȲŮ>!-  m*@i3^ J   X2a\i+uł0c
5~O#zGkBLw (f !&vqrX
    IDAṬB <{!g   ڮ|ؘu]J?oi#V[5)jϡ_۪I!=)P @vݻ7~u z]}B MBm   uVyl5.k7}V<x_ 2?aK,ǧ{ ~*vi  G   X՗FN[ڪ9MA(~tikۙϠ.   xZ`҆7`esOBm    MC	ާ T
D9,7=l@(xy  P +mI} \cWw9, j   /uh6o+&*?a6f`W8'K/  @! Sh ,omQP P   _rjR y̅`[YM (n[5{Z^Uc-os    T8ڠ,mi+lN
UsVM{Rk	"v}tu  (mm pB؉]} %=]1llBm    ʔmVjҖ0}Oʖ)[a{)v-Ζ^B @W \<Bߨ62	   d$M[Ҷ5&xm?6aI^U#aE 6
6伊]9 KπcW`'X6   yiӰ/oo31~Ml0C!p  ½7\vbW_- 8&X6   GlkIJ[UO 0s[!7+vu>d f	Į>!|7/   _(LN*>}U©e~FÈ6mMjQ/ P}] v6 J6 (튬Ŧ6   @`ھjFjNڪlˡm=PL 0 wm .vu4F`wEæ6   o#mYٻ6l]uǁkp@,hȂ,Ђ7҂!-8G B90WF$ʵ"1TX޿Ɵ)nc=MrF{c۱.Щb<3￬? N;ՀIxWͥKTf:w];'6   '.8RP`ULg3[t߅vsK|<u\ɓ&M JIMNrm1ްf
 3#   mg)7b}X#趭^**k`<ܴ6 Q[~IjU')|X3[d !   kfMsswa߻?F-yn;"k7FfZ YbZ y{Wͥk\>_\Xj   s6Ձ3(jo#0 `\!P;d硪Ըϥ`nb2L_\?   o ,?YimQ 8;;QT&ݧ mRMUU.6J"   c6='ctׅ td0NY	Pmɽj Bm    ?g	 Bmt  `<Bm yVU Pt_Ͳw<   <Co PUկa\  1`<7h PmR#j   x> 6J+(P  _9ӺmV !Ԅ 
6   gp    ffٮ] R
{msRU;Kh9P   ˜ET lǥ/@Lk a}02ez'A    ^n!wi xG/@FLk q}лlm6gixjqg $   Buۜ ȅim   6msBˤ0x6'UU8 j   xumJ_x6 |ЛmR%׫沪eŁxN Bm    P E<ݗ  :d1siۺm,- tnl8P   `   jO Zc V6I'   Ji[4 @bZ  0xqUͱ ЯmcjRë	r06   msYUս5 Ȃ   LQ*~S͙ èC4K`8P   V `|¥  z ëS63-    x  +  `p:\mL SuUUUUm]   tns PgB  f,ol @jf[M
],&s06   % n2]u5  x?绯nE mRӴBGBm    	 Ep?  `8&Y\m) @궹X4.ϴL   Cuۜ"BxS:  @>Zhg mnlrI8P   @V fA4  joK^궱  TMg~k{Bm    w f˛m>UU>  5'$O6ԫwp06   msiC fMm"l[:  @L?yHN
 @6YVUuz	    luX   `/>K\=`9_	   $R/ εK:-uۤzW  L]6' ŞQUU.5٧Bm    =涪k rrNҹι  +!JMGu\ @RneUU.9   שׁ pXo.  Ǥ6J-;  &5T{K'    z' fA	)w  Ĥ6J
OY9  PmWUuPϿtB   ` ѡI{Pvc.  B~Jl׮: PEۺm(G.   nKA `]k	  PH)n"&	 IԩQaƼ	6   al^$mu_(*/}  K@,M>f& DX[fj   PtXs 3lvVQ  tgk-> xTPMxgјMMP   +k m޻^祯  t*(+ ^nWUUY3Bm 0  &$6o\3 ރ|3}   9Iӽmcz; ph|{\U՝d4{3Bm yغtE 3 m4U*  \4 9=i&N14ݘi6u#	@@^5 ]tOed  C1Wu" @궹j.9 0w ѸQ( s :߹  p0ōLYj@n3W S	`ۍf433Bm    #" F<?  pb wu|T4@g `><$,лmua,<DwT

L N[F&ne n8Zyn.]jchFM|Xx0]99ޙj Uz\qk.  ƹ
SD9 m!m;SPR  @ObS{&  f(fh   ^S&
2 "mT sF  I| e` n[O8<  &$D.Yj n몪5_#S)6poOs0]i:Zg֤?lw6 d&wuۤCٕ  WQHƛ G]M
]Jdjy=^^,
	 yH6%$&)  &4DST `JIpߪ%#Pcp#0C`_I~/Pe*? Ƴ5  r֌nO.
 05р^5LM Ƨ{]_;A&|Am 19F t/.'qf{7@!tWG9 JI+W1mcjc&R|%'cX'@x޽` yfnCflwi[ `N9}Fn	1%tf,|=.	IcKS#mX6UU]X9Y 3n2n ~@jcpq  \_;A|`ΦË  @g^n|1
Cu۸2m_Z} `R=~6K5:'X$?|Y%etLck-{K6 x56<0+g{\<# t2 @i5ĳ6jc,nh~蚢!/xQȟ  z
8TV
 fn۽?ycο #ja PcqClX}cGҧE/ L*nft!+	0y_N4nKoۘ (ZרfYUEkAhyPci]:g~nB^ ~Ld u"{ r^G"  ms^U՛f]2	^1Le	6p[}F MXay{S+t}>uۜŤU  DMǑ3^1&W0g
lzf'
ߕ 6pVUJL;??Eҡuӳ ,^R-BmɁ {=	\Ћm>
msiJ |AADR.d\}!fi PAWq QKPæPc19O>_ }Kc3UJ ~'Ơ"v	
@}?	 Rȡwۺmά$  㪪,}jc4逗rO>_N>R4Tyl 6g' k"@)sq p'RM~gyMPcqElћ(1.R= 3,%ӵk (@@^Po
ϢQfP:  PeK})/d16JPGW9T/U|>C<_L` h#9p5 򘦴#dK8W%wmέ @aƼPjcl)>C9T
|1!m DD0|dKv-*<}UUG& +msRUջh* c18<Ѝ)wuz٠PA,%ښ6<=m \x+F<dE.!@@u,_F 0u\VUTh:AȁJ˝	P;!5?Xl
mu `vRmM} K `<i R#:^ 0Zj78WBm@gH>og!Q	b3:&hcUxUUu `\i%zv+P+Ąʽ`P;lݍ	Z
1%l޻<k/Z>$ @Ǣ6+6rqJPml24!Jq!EQ̃EB3!	1I{6 øg zVnT} @?&iXb76r!pA)3;Jy18l3Zq s6Lxco Hߦc?*
5 [ӮfUU[eN߄BJsS"uf$LsG	;93Y3 S&s1y q3|gs^L!d{i*~ 0QwIK_ 'FN}{$!s;̹^Qg rv@a zu"&k),6;o  TUM
]~ű?FȆIB@1f|x$̙l s熎r07,Z幉@0, msVU[{EOȍJ10Slݙɘ4g`愆ϊKϋ d$:3gm J{s}Mv5Q&k#Mc Zcs	[̔r`sM4g`cˑ
RqAUUW N) :'=+܁i6ȫYn3 <u/AčO$s,DМ99UmΪ:-} ͽ@l8YSu wo֮R E}[۳弎A#kd$!Fh,hLyn(T6g vS>%lxxMܣݟK8/Fa3  G.̒w7!FvSύ+Ì(p'1j0},]*paFntQ-[<7.=;0ӺmVEh_Rơ|'0GA3  ISԀȵnB\\(&G̅bZ3Đ;@ORSZ,5 tr
Imٹjc  
xޟE,ƌ(&;Q(0q+ژCtT;Qb(fB4LltPL/	zKao
 mb/坍3Lݕb`2rq8	dɴ6f=? t$.F9Rz'="L1<iF5
] h<w<36a _fLգb`rˊb)mdδ6̔6n[SC 8PzN>FCkS^/3tEt]wW  ~$QG5IPST]c/3W3{,SˏDRz ^a蚔DTs0~@[%PF'ڃ՜t(L gGj&ACl$F3QȄ˂>>m.2A3,15䤪wVgy
LZN]E`ccę
-H x5ݟA	=Lйb`&DL&f1!>LXw~&]d4Uyc
%{=  Pc0PS `~(F+`g*.fJbཋD953qt}@Jl
rSy.ܺmn]Q8Emt*k 1jJI`_^L &aɝ	BLJ!pxC@dԛ:ZH M:IC{[
\
x%%H)/ 5YjЄژ!L ܙ $<z+ѱV`Plq
нA]si:80c*6
uNOL ̋z  Wc`(C>186&#6K]12Ӯ`b"敫GLbA\+FKѹwHۘΦl=wssm,GiF_cټ 01869PlGɑd!;t*
Ϫzk:@1.9sשf"@HQHw/  ËVc0jcV̕/q &b
]U|6aU$#B.&0k9ΛN$&)NJmWܣ+%qVC['CM2 0^j|1Bɉ.MgF'\8r5M,DMrqn
CN5cVx    IDAT L{'0Q	$7qly,  وlqU̏Q1IĖfl[0WBA: wu\)>s:̂.h(pi01S>d@4oQ:  9_tjP^0
6leS*J0ő̑d@cFu,MmhHw[
:&m{Lkc1aѨ,  Cp4A"dE+Hna	f)6;a,!g,Kafj$4 pL'ǽֻ-s3SwQ  SuKVhژ:uV؇]02sDjMhlMm{k@Lgrd1ms	ʘƜ]jjP>a.~i  (=Fhژ<V6(4'6Z0YbL `Ox)T{ژ1Sf*K߽o `XMk5dLBm̂ZnA
^@)(iJQ۠oBd-
M( U:t`Dm ]=lwn&  lwպm,nxg`TBmR=;UC"d$FߖG)Q$h]h=1m>_Z F30?)HmU̍N.1Iw  Y:˪wNgTBmFlĜr'7&ЗSS0)Y<c(zmLNLmKESG .REw8<H:c+a}҈)<Lj^ms9  <G480F%ƬDAUcmeQ)].LkBGA፥c+a*Nf*;@R8B@!"zTU՝k贔39OdMicd)_.  P-8P4fl]fgXt`k|iX ?,lTTuBf)t*Ϣ%Pb}RUUzБ7uz5^BƶY?y6}è P:{ݯλc3Y2M"dhOژNT7I3ѽ]^`jЕuTU`Ȅwյ(B x{{xbt&1k&q 68@|GL$J~N@YUU]OJ:[mO8U6g/bK;^}nb  fNM[~.ߵ8㟏B1{m@<`  +RxOs~!
?iW<c=kb}>mtf7=;w  0ֻ73U`bԅpƚLL,gxw&Sװ( n#EswҺmtgHWǞ5d`
39@  @6Qjb佋,F1LlLlLlN`S_m,}- Dv{]y~ -6qNtf';1Q\/\ms  YougP86"w68@8XG {6Q]{.JMS t%/5]C<o |	fBbk|h**  &o5 7d/.%bϷ;7mp-ZJr!I(QTpc)(,Pf{ڀJtm}wUUձ@ލ}=r{P!cB\4 b?H-c(fN%1=({-c:uu-c4ePBDs.3)TL4 wS2mTlRjz  YϪB]6';6_)eOAlCO'F@p0S0xƺtEO.D {&I,
w:k DkV?OV(Z򯥯Eal  %l.]c+	3!d%\zGY2Cq6}F	Q  Phz 'Bm)f-/!SA?,x-`@ŹEDL`bـl>Yրyͪc4'd9r| H
jar;jmf&[
Wwu\0b}-<<k-}!>w2'L+؋ 'm쭽FfXμ9C4g6 ŞMzی}#{SQb]f1l
`D<!
ޗ0b}̋)0R #ڞ0Ex&!@hP$Y  \δqC6G6xfNlYYV?!d$ge.9/}`hzcl Y<@z%nYYtjXR  2YWg6m29Bmqp(xCLҠaLL&In\s&`v"vsazSG"@YZllXg"j  0,#6Ed& `_]IIμ@4h($2Lzr=(8K8/yo/=GnXUUSn$  L@ۤLzixCOl01Q$|%{E3Cl cQ8'@r(p>؃LHjBژb~8g  ^(/'\+p}\	l8dU%a6_:f a\'h Ϯ+^&)$0$6zɃ@Ek,2Y  WǺm~'	h\<D7+`RK6f`X/ccE #7QL)LX[xk Os9a	ph|1[Qk
  32Wuۜes/Fg̘aLb2?ayx\i,0qq}Whc6DGc:=  b}5SƛL{#Lxi#/;C:\bEנ#68VL3'
Xwupiy<Wyo绉3lbtp^@ًgL'  `$59}6~&6p[٠`m{W!0{nz[ΛZ[{&·Ef>3w|M6++D	6ks9   DS5KN:&9a6m ~'֋xxb}pslީ {+/ =o(:M͏1M  (P\gVXO]BmГ(XKƯ[qƔ{YvGgY$瞧(݂t\HcFhO   LVn~.6ԋgR"&s#	+Me=}d"YW[ ]\/s#ȥwҙ,D /loV6^7v_zpxtW|; bQ$?tAۜ~(`z
=B> &dXｻj~Ŝ7ESkUd*ŋ#>:  SbvwmV.S #P=Rt(=)<|^I2wޞDb{w)Metsl4c1LYGj*}6g  7eUz	S!#*ගav !л۲"{Kwp=9D
cٛ}:+{`~Lgw!9ggx=ms   ϵYSs\m.S!q?c$EAuةl*FT9.{SZt-QP(^3Lz6֬U,lXF  x_sqS"O`ۮ(9c￺:ł{qwV!6`J
(Voڟf
]U<C	1x>lB_f#ٳoy4ՕY  _ssC6G.S"_h Q:6?E1P:l08A~?c9x~]=v)C>ǀY1ί*y&L¥g ۵\wR#z^Bsl===FԄ  3:ӊDO{a~noPWU	}ϵU_{,PU1'vju2J7}L½ jo&t$5'zuM
!jϷYӽ_/6  :7!J9ԡ25Bm    0sBn.A E?v!7Ӎx^ \Ewqa68
cЦ  M4хLP    &/cZR!#lWSu1{![DU!hZcLg  fXUU_d	   @~XA##x؅La g{Bny܅Py"6a6؁RS  bwSژ,6    Ob"ɱ=F?:0U~>> !n	iݺ0tim7u۬\  `Lш__c^S%    <Kl/VHc0kNv75$6,Ny^t
4~bZi6.  b}`n3j    Iv݄ʴ݅uۼ/}Q `,Oago:=Fwk=`8/֖N~  9~pS&    bo^'ɺ<|L0\a~ؠC]wK~K!ۘxEzƴV> m4uۜLP    0bݯV=("ߊ`X{a]C3 79S<u߼7	iminK
  LmKv0uBm    @Qlb]woU{aO{: `:olXoA(TB۸|b=13{   T=1nkj    &joɷD&?]Qw [Fo<#<?))ko!|(^mw>[ǘh5LHLk;i&  sq&|2Bm     {Jq$ ^   0B            R            06             #            `             P             j            `0Bm             F                        06             #            `             P             j            `0Bm             F                        06             #            `             P             j            `0Bm             F                        06             #            `             P             j            `0Bm             F                        06             #            `             P             j            `0Bm             F                        06             #            `             P             j            `0Bm             F                        06             #            `             P             j            `0Bm             F                        06             #            `             P             j            `0Bm             F                        06             #            `             P             j            `0Bm             F                        06           woGR]i@s:;,@Bބ4X`ARPʂ#")UZ +9wHj            `1             X6             #            Hj            `1             X6             #            Hj            `1             X6             #            Hj            `1             X6             #            Hj            `1             X6             #            Hj            `1             X6             #            Hj            `1             X6             #            Hj            `1U    ,k=l6]]K  ow6>ή.޹tow7Á糫g    S    k  m|pꓒ&H\    Im     ˋ$	 rD.Ϯ.~u$y    f&    `y I  P* y    fW_0owo]]88    `5fy߹Z ow7ͣǳW.ò݋?;X}    3Fl6g    Z$v#@`6ů7yOc4PTp5RBS>    KfЄ     vL/%%DV_^9@E2	3    dЩL:epvuq*  ВT(ꢥd?+`y_ޜ]],!x_	i9x9GZR4y<    2Hjvѳ@A   d``dO~<"	S:(QO*o6웙?ҺI^   5ŷ    IDATO"gWi}HhHj  Q ˖vm 0t#H`6f/(Gv.oݢ6    ,AR:;Ф  @ߝWB{:̦:9zz_'    $Q-ᨔ   <	|GvۥI	@Ptsvuswm    Iḿ&5=   Eܩ <"S (QOss!ړ   `UڨY¡3%\  E==w(EdV:$%?jG-s   `!ڨYd3+ݣf 1  Тntt(t(f0}Xtݥ    %=|vΔ@wA   ;.u HJOޓ)2EǦB$M[    `Yڨ~m;ФîK  F\.u /V_q@"볫_+quj    X6jS%<9r   @s2
s:RV/q@z:yS"    NRl&ߜ]]|t)5   zYs:RV/ߓ'TXJd-SY6G	A    06j%9췻= ݷ   =.u SRBu/G!    ۦ6f0:S}  @zzz?]]cUFBz:붻vOɋ    P
ImԨp)r t  КBEM]]l6o
( =0Uh2k,!r>]9_wmm!(R
    wH6)Au  " N;9(WQ"    0Im(ry}vuL>x   Z. `bU!9_cSݵ)   IjF=U£N%z   HJt8Eޕ   $Qvh<|fΔ R~svu  Ij`5.O]
(Q(ѫshw_g,R    !8ФFC0   owl6_K" &X|d~Q"cS|="\EJ   `ڨM (J=   SEi^:PTtw    @Rl&_qcH  E=C_ L,`-X}afyW]#`)sjǦ4]E    (6j$ym&v=   H$ `EkKwuvIڴnK.   4ڨ *9 9B   UXS	]`	"ecݵ    `%ڨdjoݳ   4g=l61 S|d^$`q=蹻vwV    #Dt
C   H y]7}OW\SR    X6jIzʲvfyA   hQdOG sPk,!㜯k'    Z$QhJ }  @T`5I&Kj~~זkg    `Bڨ*(r t}vu  @~%{: LMՅtY9_ws!2O    	Ij=U£*  еv' u}"޿,`1G|qd	}    :Im"|xѕ    + Mz7q+ K霯=%/   @q$QTe=l6Y_   Z
 k9PI>Wڭ+#     684)   F" ֔/X}y|XHtnkK   IjQ侽<U  A A &a|~Qz8yW]ۄ>    (6j:tP  ; Mz"?R"=    EFB\Q
   l2:X0:Tg=l6\XʓSswm    2ImԠC    ~#@Eu[^k,!tcSO=    `eu(~sY;7	\>;Z:sfs>]]Q4'9~uɤO)yѭ_izzWl}sGp1%y`2Kc=^C\e[//zX} vyn	w.	    !9t^In59~8xW5u>bҡi:ݻOt!YUJxv=t_>.٭q6}+'9ezGYRpӓq#d<?oKc"w̳fw'{;yܱxD[kƗ8_(_]]]:uڤw~=w׮./
q   bWJ]N6Ŋx,o,fyUy
z>xF[yi=;	
Ae9&&("cW	^U>'B&oN`t= p+G}CUǳt/rxCg^9Ib;aBi,)qM/5gbG=_0>c_uZk]z%ޡoxw|ȟmuTp?|7rydowCgWcgmҎ6k7}MI5c`y]"g谽'=x6Ggl潋ڧ{    %CgWc6'`^:!$Y`~J@%nC
(S<T,֭5ަՂL(ے=pLf8T谺[ffm:$
x54T
?x J
Jx9
f{#x Jzw/pxt%lDӡGn;htk0м?,~K	bK(]|dL~һ}z
(%=[y]XakfU{W}e&Hk+i+6Kտ&]<췻øZ;/5yq=ck    W_9JC&y?C
*!!	v6%LD؉+tv<ߥDW{I#g`k NCr,3>/h:oqv)qjxXqҹ%Ry.lhijyQjﷻU+$y!N-;gW<b)5K"匟c4,.-eL~)0D煌9Cy]ȚY^t5hmm!5I~<*~if6s_q|'   (ImCϤ௡sox8;(`/yFj&_y5arPIy-C<L&Q])]Bq*$4v7^]]</(&y1TO>|* siФN/zT1DT,yVkkVX%͙J _^`!c`sL㥎˪|F]c*\dTEkĕɑq3YH*mqzwl33]    6JVfT{IĶ~XUaCAUKs<HSzV᰿R):]`Z"'/
@)<ԡJĶ﮹4yQA ywma<Gc.C6jI}P|:7维1q){Xkhstgz6SbʤX"}_I[*ڜtޛ{q*פ5K}SUrN %!    sFɢ=j!%*%Z*i:/%"RH[pPJ߳=<O&WVtTkbũJ/'56||w]]yVO2<CF`iUImS1T:&.Mi_V=v)콙'z,,2V/zzL:6iK*::vwFp_nS;r"^J3Kl   `(݂F:0o ybAk@Wm$9>䥧
x-3O@g9<4<TcpvXe.Yi2۩Cbۇ|@^cgli_c/Xe6YBR{G"M%~Ҙwo{X-GOc	?dg3Xm]3RidMX|*ekY["ɷxGo=cs&    &_)%J7P^MRpݽHW%SZZ; *}&kI\Baow 03)?5h}t?Vt5~-n0%,ZmpﷻØ ^xM^=X,Ӽ4|-=N;OgͮhŃ#N.=k>I;1'i曑g^ 2ޛMt:6iG6i^xH^V3gϮ.tj"ɋk޿x3    D6J݄/@3XetgZ<߬t`2Ed W3\cC%_1OX4g|F~ly*
ߤy1A
|R3ԿtZIn[$I7H9[ kH_,y1!!T.qyb׵/uta$;j';\w&+||2CKIS˪|ΦՏM^
gsȩ֑w>y=|GF%u3M3~(["׻cΫ~O?_caF~    
!R^IutjjO<|b `2b-JK+}].w	CȯgWoF=s=rş)odC6{z@즂Ufku:NpX46tLNҝ)IxL}[n>ǦOҳ\zpM&7O_O'ya
DiLfGͳy%<fiL5g:~NxFhk].F1w{5]k9=56m$ijYN;WUg1M,dww#ޑ>O-?gOr~?gњi   h?qm)Ρ[@`Pm;7CCP⿢e 	<OASMvP~vurƏS*ѾOx #<O49o}nRb3%==	PI	C,p-LUa<K&~9-}/;|vuJ虸Hy;-%@=:hCJ2aͭ=1yow!	b6]#sS57YgxScPz;#o3=Cpc$k~-2s!{gyLw}&~7iMg/k6Ck]a]r޽#s4ޑ}MIesή.^qf]A%!rvuL6yyL	̝    Nm*Z!ЍPu|8 1ca6_NxP*)2
vCݤb|^ cuGKV4}gcǮߪZ!fPI|5CP>	=ӵwltzDxs|Rû5E'}UsƮcVh5QX>YOgubmlSs Qu3|ǥ;3G5u7Zw.;t3M5&ϱu{m?E:N4=uy2k}wǀq3FCeaںf&_56&3lNuG{>#G|>}*sji9w,qi9"d<ɸpki|cs   0	ImCa=P(>2bJ9Cm0:%-VKgx2$<HKi/Әn굳Tu 6o;EuSXZC&+_Oе0qNrJ4Kj'i[}~23njy	_i.`0ܳ>l̳AFŒ" ܃̙\<sK_wn'{潋=vg&=>s=>C/ {yM6Wko:u(e;OUR"ʛV:of'<_do'30-    kDj7y S
M
9|pvu!(}c0uj9NGt9ܿ.8gWkf:v}	<l]fJh;^eK	Lw?]t-?Lp-cχֵ<Ng41zȻXs^o6Ʊ%F%_ɓӘogW.9o9&ߥ*;^;KN?gwKg};<`MApux2\]!}ci=(U0EB4}fz=J59ϐeuibΦtJㇵZW%-Sf^^8\R7Ӟ"fPB_J9y=kK   ,(QBZA&MAj9|g#Jdum`Đ⻆Lzyq;82 tl3.&ݾ/izQdHP|UajCƳ1	UGvZ;h?#Miv~|iMN[M`TRFoKIQ?dZNYǘ㍖gT;::kf}ޗO	Y!ct=i=ʮiȿ2]g%uH59k|mL4nTɽڤ 3N<-g=N
ne߽OWoO^=iNׂw   @y$Qfr~/ y|{)'mlG[d9d3hmI!Ch ᐫ.VCd5GNUo'[d8ϑ}:>/=IP(yt~:IB[4ځ	XS$ɋ)]0js]D`ZJl{>⯨oҼT	?3=γv2@~/Jy:rSݻ4stm~s&!?+IPImL:$/pmڤ'16'Iuf}q0FI.>Xݵ''=HQ^b){FC   $$Qܻ>KLQic>wSAA~с`6&OiU#PB26)o)	]IL؀D    IDAT(Ff*ŏY#:J=NI5$-ݳ`ISQE
<R\!)6x;vg& 9?tyVd,e!qKGc)nFE1-kn|_+1t+([6譢愗?xmRekkOq;Ʉm6sF췻ܜqWq8"ٓ!0JK|5b/1<    >#~h>3A݊)L -j5mK#ҽKJ8zHh9VCW#*.-H-[\1ZnjN:&Qmyt3t%ga}tUN|ŷ%%D$w5Zwؘ
ܳ1jgyw{pa5$̝3gm.n`[]rxJZt#nׁbta3fXB˒&6'&/hyo
f5Xc*=#{+(    Fi&L^ѨĠ_JvOM)VJw9$Rs 	 ΒEwf;h]áWMpp."lݽ4_{#jLIg5tQd`LuDJɑ@jX&M('9	xd)4\9ucYOh$ qKW	{d̿k+'車L+v|Y/7X0N=ys_	lYvH3&V&wzm2ABC3_lܸ2=w׎w=?    MRUaMFBͱ;[#'RѷTߓ6 /<*/aAs02]b;K62кʼ9	MZ-d.LA-T0"pI	A_1t.5v<ۤġo*=D{.}ɋ)_@>0NU$Gwsd\~P8nIF̳JhJT{}g[Ƙ|YwaMfD>>98{4.R4ȹ2&kaw
Ll>ZWVcJc^øt>    Fij?4zh~yz`>u81 ,'xV_"	]-}323%e*cgj@cGj+$: muw~gxu3?0271XVb
>V4޵9]U沕y'QDm?KcMn#~W2EJ~sh Pi6GK}Fou{`іoC֑X2{wX|Yd6iicHbK2=9_84v?Ʊ>aM   PImC**6P	94=j
YJj:KnZ+.W>)@_;.0oN*>,[[$0t>Ihzs		M^᷐4{hd;#j	Yo1N=l@do =]{XCWsک-w8'j&v1tӥmAzgU[VdJ	9CϓnmR'Xcc	Cqg9"    N(I	V;of-\%DuCֹ+?	I?`f<MZXtHht/ݶh]`<<:NMcЄV1 pb~+9":x,𺵎2_C=X~;<뼆y"jk1+~E`B[*P&/Ӛ(7Dͧ`!''6CߣSRBBרypMrߑt^aGZB+#8&M;w齛    Hj$w|cpg-Þ ׭v;H9cЪ
犲\N]vTq8>HFwtsRN^{Fڃ7^C`5[^w><GƏp`B%Ԗ^2ëɜ|3Gɶ^\ub}\HZWe:bmSd̾:(Kk4u{`aƄh}    !D6<Kx5Bfbٴ{8~< ZNNb*+=ZʝrĹ77_78o+{l_Ltj=K <%W[]yDy0;o;\Y黪[[$8򦥹VF _	IC?o(ˁ-v&Uv{\Zv&Jt~Ɔ	lY5'L5/fߔjmӑ%yG,ѫڑژ    Ij$95~tQuq}Ui#	Rw_?x̓|N1oB9k&3AqƻpN$ݡNUi_R[SɋC[4_yX^x6"ygp=b5ѭm-=u7-W{xpx?j*M5QLЎcr/$[-6y$wwO?
SRh
{|iy9    FR@tC}x`j0Цak͕F^v~xTre:Z!#'pd7i^F)\fgWu
v:sB1闌-[[t`Sc\|raukAo{w׎Q&sUTW5QUB_pnhr=$w&|FyU@2]UwMXDߑ*u,,46Uޑ+Rc}%Qy9    BT*xhsuVB"}þ$\f+*UH?Hl`ݝLp9X=p{ݽN̻9VA.o&/2*9s30ѩ`	&%$v^=Cmm9wB
x*uLTDߘgn<M	A.;ɞ*qk].+zZu"ׅ$SXS$3然w~rO4^Q9_wyͶʞbg	u~طV    SUt3Kգ ásq{qT{t#c{{Ǥ;WţC%!h=G{JIl:	Hv"_֭'U'33CE!y֐DSwͳnR[	}uTx+Zbݯ6LX`"c[Sg*R^$;26٤!k
ѽû)Kw[R/tM    Sl&ThnT$9Ԯ#3ucPj`?$]= c_`}^d$>|&<5E{	me/h42YNzUw5v](V۷Ln<?99//k5dqSӈw䥽?;q8Rб╏8ZKjjQ    f RDJHb3FD=vD9?MM1v`EF<o)$`UFRJ˷!}0NmS&
V*Ԅɋܷ$#my [*	9 򻗒~	[;w3}jRܹg#dt|].+ecm%w䍽?;g%㜯wG,l>   Q$ړ2n
Lk^d^j64pc{}l0!̪:8hݝgχW^Ξ+Hչ|S$/^5[w:gu'9m=c.
9
W6{]>h?\0d:w`g9?W^/G-t^Go*=xom   (QګMq0V_Tb HA{O9ifCWa7)ê!$*L;PM];v옦sו0WMwNgnS0Dz#]k{wSM
S [/hmwYSuKtj]rvuf҄+iSqȻyyeЬ    X6JWFpT[ZT=rRMƎ]U_+ډ𹀿"1^}]4pg 1'o<.H9;ev|vM[*zyh	ҟx9s}[_י?nι"A15k;#͹6ygtH`Qpr%?Z?;yZǌ'l    F	"[%n	[RTu oݫ1nA^Օj7~Q4^}`ƫajA@Ht 1ɋ($1Ȣ~{f9i 5Ϫ[dZ留Ԙ7fv|3eo3QDeq:eyVޑY3|E)
P5X g#3   $thI*^fnÕv`Up|d$X佞;v]f̕&WSdHLe̿c@k'L^=ɋ C04O텊ƈ'ex5xF;Wނ2fR!ki69hDBg)N];p#Ea%   06VuuWw+ ꢴv<JwKf%Ǹ`5ӷq	+~;JwL{>BybsyҼ3ҽtyyV"=V@4CwŮuKKs$C,kc"ki6 }٭gѽÒ"I;U!Fird]7Pq1Έ   KRkn&t U'36^>zHs=$,X6MjkI)kʪ~mz~5<"TLb*::z	0_KLs1Ϫ\ƺDȻ{=w(	*fe]z#87K41){L&_VEN'SakWzcf    * ^	/g3&xǂ#-pm̊:+|Y$ b{%'JUo:L1,Ԗr:O9{!KC杳|?'yH76޽b=9R

sc
Rs~tjk3kɭ69#bXylIeG	둽19ga
,   @$ګ lEpI5*\Jף	`@ĒeBe=x]NMPGgw蔞U3ɋ
I.Y潀;f6D2Ppd!	}9:3~r:c5)Xuco9Ʉ
YHT}q^#i^k]d~e   hthRFz DJ]wfޫ+o52Sh62!pE~x
ԖsoxȻ޼sZi	0E.m'7E~26:!Զ#Kd|5gfAǮzNCщ#&*dmSnj=/kyMݵk̭    MRk!uhqhQD$ܤ"헽	Z,G5Z~8,W]Z>BwIvj[$|
(X:Gq=Ҽ.:0Pƺ%9
.-vwj{{^(8v.0_Y0t"MŰ6<z^ytw1DIm    _!+^4VO"A}g hAowfCT&ȩ@v$0At	:TyxNXwsv4cdysk͈+Z)1KRO?qg3Eޥ2]VE:s^KɴV_$wd{+ssQ]w+n?   IjcMW³![i"DRB[${/%C+	f.>m4tI$@z3@h a%λuHs9Nt-lGdln#J׈|湂k.q.W{QE]?cm2R&Yphc0_ߑjӞ;)It?Y    WȊ9Pd3\'bJ׾(U~1;|ћ#FƮH B18rof1"ݪ ȼf^&u̳SwB	b"c"Jv&{yߗ4c-)6d{|񮄵ɦTy^p[ZE@OJ\   8XEU:	$ZḤ!]a>2*|Kj;Ƴ	mW<f$BY,-ڽK'nyxthIi	'B
:ܒ526s;3:!nnJW[jzy~	蜽mBpFy+ZTr∵H'khBfɣy7Ɖv,e2*کz<О   >Z>twI$ F~-ՙui˔**Wt}
$10vET,Pfm)x7b[b).XH/2.q<Iac_LAѵkڈNjKr)pwj7KI$,|"hd
i&G5swmB"   0	ImdKWs㪪M:V/w<G*zvuB	hxS){	0Imɋ"Yj~yy`ѩgWs%guo::20)pwja)L.]T$_k˫u_.TSvEޑ;    &!Pc3<_aw$pz{ lE&OY0BJo SOB
xK^̐Yzg$gmrrJy6Ѽ3ڵvh6<6SdJn1J&/2xGN)Pgl6o,|_{@92߾;    &!ťC"tHjP!J@.z}<[pxt@o@FWCBwM%R3"9ytϟyyVzYc6.]jXkJ^˙P$FhU&p;P3ݵ>7u    .ImԌCs|\:s$IdI"۳hO|`^e"]w)`#R{5TAbbL:w:&~6jOIRUU,pwjn.]E0PM(_C"ϐɗU6vBκF?M@n    Ցj3g5My곷rvuq>[0cґ`]&dclu_n    IDAT|%%/9(OOzŋ9;D>yVC2ֹݩД1J&FMD\啺69$UjUUb{Ng   HjcwR,_];\u{0rԝÝr{mIZ^4PRۂL@ E}'1)
Ùg.sdX]"
-LE>JH%I{kuԺ/WeTݵu}   $;kİT4Cv>\ą,&Nw<I^o6󂪣&#ARN0|F(ﮄn-)򔖼}f_d;]2Xys΢	w-8U=7jNE3DQ[q$#Qx{Et[e+J^l#ǫu_.#{ީs    $EUZ6A*OkU[?3ݐ?vy+`#ާƮDr	LY7OTxVBbVIyŌqdvh63'y
Gt~[{"Uu)pw%dDp$OC0ts+r-gm2&w}j,)<vjv4m$a-ve   `}XZ2}R!JcAsd\6N\pG>{s5}wtܢJڼӚo;btewaQ.Xcm25&=K5'QUю5+=w4O'\    V#qfx7[D_~^o6Ww-Gf;z
6(USRϒ	RoM4w-BΗ+3ͳ{Hy	{z͚U:Rw;_g|[LƵiԺ_~b{j,1s   Im,-TU՜ZG|*Jl5E+$Frt+F8xC(J^P`yx;#TtE3[VmImL+)Q{
eU%kJ[^paq'~VNB=deP   IjciUCTV!Nmyo*m쒀܆h]|wvk8Jiψ<%;%$hB_	=sޥx^/ҨuJ^[)ymbpyU&vV<}   $BrD6''>{%$swоl-4 \-/Xy&fDJK^zv7Xc7?k՞u=.]sa*ٛMimJjt5zd~]~b>p   X6TbRfx"mNAҳ[`3Fv;|+j&sw'y1_1Hǟ]wևܳ{<S)@0S[	{iY5|wvJkirX:Qdpk{վ6$*9Z;wxwKWz   HjcIw*154ȒQpk#lo55A𞀟/3V+ZmYRJL `!#aNbǂ	M;3m}#	%wi큻S+iMj&I):WRKZ'~w4jM|i?.	   @$+	WAB
dyAwpѹ'9>JN:k0;"+$%rE+Ֆ'=;P(uk1PamwPڼIdh0ѶtƄ>|%%0J&^^|YN,+Z{&2Rr]$z56ʐlO   6T[UtȐ{#a%]+Ga%ךH"j+18Ĭ?ܒG)#SgHw.seȗԺh<{(|%wҳ6L$,ѫӢ
Uۮ    /KjbơOj5t|r8џH0ccNmpge9}Rq8cTxNp_mPUU~Cel+_3k9{Wk~b-|v5+;    RjLvh9[MJ"Nw |5%8K^anD;֕Ԗkȵ~?vۗ?	]UuѼNT]dD{6'>sw-]~'ݟ   >Im,W6EQP;nU4	H7}*LD3̥uE*P[Y*-3Z2
.+ZBj*t}8<~b>    NRK=F@P*;,4Bd ygfOjTkw)2(Ac^ :3췻o	!<;-NX,$#T/E­ss   ژ]Uo+RsҵVoȧP5wJ,/](ĬT)bImЎCB
Ir)'yP
,do5nEUp;n;f!'|mWv    "%Tʡ(Ut%^J	ft=σٻ%=wn-\B\th%ݜ]]|,w`]SRBmB}G]X{g   Hjc	W:+ @,&4CJD[|`.'<	T]YT.Ms?rX.˧yRO|k#1s   (6P{%<j>DBTH #͂6<
Ppgs.:Qul{U=\»I|Uu廇q7Sto@Qu.~{㞀qjݗbqxNy9j+   @$ZjYK:\n#W{σ%>(ﮄOɋyJM^,X	1=X(DR[ aۣY"{̞PLER
eu_.#ѫqM2s   $ژUj	
)qCԡyJ+Μԩn7$m}oy`ඪyE.=wь
I;4Qj p߱OQBY'Td
h]tϡg<ZqݵkCXKE\    h6VfFbOa%}wU,P`ƖƮJo$\,E_|'<?WSu&NRr-e?Yl=\[ď|waT1c'_	pZ/[YT!:qM.=F>q   @1$1+RZ	éd_ HWUnvB[2lu[뜯.:2x%jJ wiՠwQjXY':qM՚SxkIu    ژ[Р*_5Uy !*u]7uQɾS)<hWl?-SJx,Wj[ݩ,	cMn2֒fm{*O"a'=w׶og".    4LRs}CT|k_w>t{\&\OZfHۑ ޥERM"QJN^hޘy$J)"A<CF pIm:Xy)E$
[4"z/=HEayETp;;'   0ژMFU7Dmg6X]N3^r	8Z࿲XDU|5%8K^Wlf~:Vb5SjMYԢ]Jz׵+,YxGEKSȞZS{!%Uw   @}$1;^*G9LJЊ3S4I׽`]6w`|ɋJO^$/ɨ=_U<d%s̸LBhѢmy5M"]`k-^Y{֞F=I$ݙ_   0;Im̩*_MwY͇(CZ7#
QZu+tQ
Lv][KF<vkg$2GlYyV?MJk)SJO`?\tY=uکUM	/&w8;@m*ƈW='#|w   @Q$17D{:ZR xD]EƮVDg3}Ɖ^Ǉ)Qa^/ݥ-OjKDHн	Gh]طRހwi%dݽ&,awavu6iOtL~0iO4"KwmEr;2   $1%n
PU;w_cd&d&owjꛕgKb&y yqShO>zlU*L$2.PHMrQI p| y<;X'X.$pkS,e_DnNCXK/g    TDRsf(5_rݶϮ.M4)l:~E
^)!r*jJDEƤyVse2DT_QFw'6A7z'|5M?inVRtSy֞NE   6R[ly3J;2>IAn>N)=/V:~g7͛Sy2_M	Β?wMaׁnƏtϢyV}znpz
ܝZ̢-/ow2Be|k9kfE~An^ehIȞ:Nwy]JL3   `ژKz5*8gk? DLGݴVE	w9w̑ѭ6s<#<sS¼Mϛg'$H~w|tFާwcvTqWWk	6w8g9fguX}   Hjc.oR*#~ow^ftKn7/ku*!0 tq"Э"0'ﮀDɋ*F{+;G*d%=FߣujT3'׭nGN@gP<DMړ8{GEƵS!յq   ژ\FU7mgQU@)I&#ԍ4/}0ݯ
|]IJҸsg7X#8%u{+''}~a#:L
LEs,dqyg<kS7'.='IEM'KO]TSt\\I:Y"'Uu-gm2R&sM;MKnV'zzDk7ѴX   HjcUİF~+ՙ⏔:}wrCl6J	no:hR`>W?\8a3'S$oµHWS"B4 ǵŌiŉC=WwY9^<+γ|Wnm{1"{Xkwi^ԋ>N2;W2]|U&SXL#6Y*-gLRNW^9ILg    T@Rs}3]y3JʛzOؗ胔4k=]9eS }ݱ#iprھוkJ%U^SbUحEbڞ"pDJ22GYdޙgeH}k5Yw= ũ=UsjͺS2qsm˲?_)MFM_hmD?'Z$WIcpO^[Ϋz*=w    $9^K|U& ȡ]A)a&#~&R:3 -"rm<':N?T !c18e *G]ΟD6J*L*I4X6IHt)0HP>㳿<:cYͳJJAuj3g\mAϹE'z_}g`i/=R<I&wdm%#g[ZSI   Im̡pkzk\nm]twd+t(~;O^"sJ0"(&Z&=Ǫ&Y(=#=7ssyV@znp[h|-$ɥ땭Ƅ4{MH2:WߦVu2(%Mtk0mS31ީĬ   HjcRlPiEצD2m
F>#]],q+!n˛=cNUkHSߧJFfn+u'jz3FY;*9̳[du	"cI.tYSܝ3aB<tY?cZXYU6}׽	m%un]<ᓞ   (6VfYk^UڔRsw.I(#bt0#ۜ{wBYru<=idPuWw'y1_i;?J?rw.A"Ŧyֳ
YHPݩER5.CiRB[4!۳,]DW}2IL%kkI{=#w8]olkiz*Aѩ   EIjcjW91km5oGx =}S0Q:~JeٕzkJ9Az
>Rq9|Lh;T.~Ԗ!uk)uWwC>N]rRuA/癿Ɇ#\BY3~EХKs׷]$q__IhEH"{%'ZP$wcN6!鴤gD-S"Y    ARS*e<Hi.-UϽuWoD\"+$)]!X*w PIP͹2T$(%tz_RabVIj8,%CHE9|Ve\˜yZshf%jNZ[$!.î3iwMzn"߁˳?_b?&_Wd;M{Jzƻ(^ni,HbV4E!   X6&6DkBʀ$f}EN@i/ݏrp `Ư{t4'3DMVenmOZ4_L
Ip8JHt<n>9(C
]S<P(c.JyǑ5U)I.&f;e]WyyCBZ[[ܣI;pmߵvޑޑ{a<pSh!F   @$16DmgQ7U$>̮Iow2K/r"^-`WnZ0MN`P]JLhǳ:O~EM1 BTߝ5#jV;e<UPZNVTxnK?~vwjړ8 w6P"ѮEMVd;<oO	]xS)B_`".    tDRSйĬռS'oI?xH
fthyzz/sooNh;JI9RRjBFQj
%/9jJg1-)i!sYa~>̳Eg%D̛>|wAKhb/'CVЖƺ`e"Rr&ICk1kOZLezG)Zqy9i-}WV~"YiE
c   P4ImL)5*_O    IDATH \g&0#qf︳|7wE(E"E|޷jz|a[r_싚g8ΝpI@_sπV?jQ7}
Xb1:
6@\CZm=R2@[jB?[5_{okw>gw/<vVv!&H<vsS-%Ky6?K-</"tU1rIiVR76ضY=u\dN.]7Ͼ   `քSũ^K3E] bm[&*j}Ă-6qwmE)uG0ˬ_p	kwzp}gdIΧ.slY̮騪C.-f*֍k*LZw(V(f9b&#<#`E-cAJպ+clm7^9rɥْvB?q]6    ;FQ,͇:)A1Yqz[|߷]
oJgݦ\\k΅CSF`z<䧙ЖzǾ&#Wg==!CPs_m3|>ZYng=qBߦoYhT9O3	,nJf)ڿ{~<n8G{}3	*/W1I	f7zoDy'3ڵOnkWZ拊W]MY>v;zN0k?   X 6Ruq,vGLUHi#Τ}?bVg=`j7:E}
UZo:[oYԬ8?I};9}q7
:&=gU%),Vgvg߶/Μ> 
msvֳv
YCϵRɋ"(-6C{ZJ9<KjF#?nXݹ>1;WPsڥoɐ[/#VzGŸƛ|z/\aԞ}Ou^8S)5N   jc,YE3|lvexSD3 u3aF	4CU:𩘱(::oȺyj
^?ܳRrX~q#mrig_8WxE^C}.ڝgl$FjgV;k~bh٬ַfik[)7U*c[*]n?Ӽ\BlO\|x,c}W:7&'#[hab{տsVLO$>:u^Ubk*cǝU	hK.n   7ǝ29kRozΰ2Q@q<Tl*}5Qg-jNRDv';ۚӪ
VY*_<fn#ޔ.s(>>nkyq<X`=m\]raPaYxŮ,3ϽE;=|ڝM86HYE鳽㛡	mQ$<͹Fp=zȀx8mzj̈́KM`jmrb̹.~MھIxF6}lVh6ɀբ򽉯VjƬNfp{,Uoq︝i]uxu1ͱ]@->   @K^W{AА½ Y@PƀSxY;7ui
Q'#!2(it8'[+
Q)3½sϛ)kܛXm>5͚~Q[Yx]X5{V5bpW*ngXA֬YD$n@q6n#>U!j,95ih/["|R:pxOs;yOGMG}xFX1l	:nxV>e;sO쇛-Olx5z-"&Ry`mbLM1ly#iJq6    ;Hh9ԘJg4b)ܬ֟{gio66BX[5@oWma3CαU1FD_"Q}m.NǱ=8qH< ȖHel[s?
3QMq :qwnwto.-Yu9p4XCλN0;orȟmVʙ@mmKZN(y;S	UXP.}ZDߤ7Llm?c5{1ק'O{qjƚ&$2N1v|ӾJjhcn;1w97pR?-a[r'w    lPczNR_O#`դBmib@s0?ۢ1li!2_)~38쵝@>[_	up}zٱ 6|ql"aC\eCi5ۉEY4ƽ[ݹe[hg]=Ԯ<1j"ϱ'm&S	[m<[:?Fh.VYx2_m{];)&:a}&|F}y>7kl<翼/;kW~p+=MI\    ]Bmf)o)/GXmjbԛU3P[«N1wNaT u9D,87졢Eqd9Ǧ d9rbb;:ko#4vاhwj55r_K;k\M)L<g΅
F3(ߋgm}q
X	lFV}-.&,!mz
=nh9pͱ<oDO٩    K122̼po+(FEn\g.*l'f/={l"	sr*f)`b:I˵;"WYŠgL2JdKm6mT #ø.{hX8ڱbpy9"$v[GdY"ض?a{[>+>e.ZPM1'꯶I\    Qub!V/elp3Φ 23_}fק޻wM$z7)oqjCPL)ŏK|_m!AjsYwC%D;kt)8?j̶]n&+idC{Qj~L'gC}ŉg~LHQ?\}⚏N޾^s=I\    QBm"d3Yûl}̀Ò6)AZ~Z$U)'/lE1V]yrсL5/+,ݹY= M[h>[U!++e6Txa1?g%ђ۸&LHLrWX
xi+|	|?Fx?#E[   jcg2K Y12`΀lW≁W<}=)YjqJ:?fȷEJSy@Ui	/{*۝SZ1}vVgRz	*T_ξvHeAQy+͞u݅o,1aBmbh><70J3#CrWޙ	 g*    er4b/Ûjݜli>yfж\˪lźwZ7
9"jgdCSo;dp8qO3TLN<.yX8ng5Ǧ{M-!5kγt'BCBجQ,6:Wy˝{^e|\?&ҮV߳-gg]Fav~J)&{fn΋K}nG;q6v|&   BmUQ-vEeˏY5b0|oZ9%|}Y淡:P܊}dgX~L1.c,VvwӾWxY	DQdƉB<K:ULbmJ_ss}f}^\]dYbc?盙ďY^MbZ_Eߢ1ɚ6EI'-qN
fP$.    06zQ`993y{cF>i}.6HQ컣-F>ƾ>_Jfܢ9~m%#3v	x
&jsz왼vgQYӶbe8.cڹ(qegiw9.25B|'hcg'7Y<ԙx;4mʮAg{~Ź휱'6kzޤSiG0DO8    ;/?v#,' .n]HSH}7hYs=ϧ<?to#8 )L,D;k~:d?XS/;c3P ޾uZf|\MI7YOsg^|i65u?~M-}Řء9cm?c   	J}wxo 4w[ 9"ng=?Ŀ퀹b0VIڏs
NPνgvUMsKhg=1Y;knz_r@⾻>vhn;'W~lo,"_p/XJlAoYueL    36 fĭCP+#*HSah oZ7}9>l2<'1           ,f>K)U[       _P     `arBjV      (L     XjRz}.}           %Y-	      '     ,Qwpp}z      %     ,f~Rz].y           Y-	      lP     '#      PP     PjRz=u      j      g҅      Bm     @6^Jǌpqp}z      lP     P7۟      0|     'c?\:       c6     fn6      -j    -٬7f>J)f9}      ]$     [ji)_J      A     r"v~ocl>|K      0Bm     P@,vRO;j{j݄ _g]c       f     LkZhk<߱YSJg}      0Bm     0j}RwJw>Jmݝ7!_pp}      `BBm     0bZ8L)RJV      6     E_qf>5OoK      yj    	\6OOg)skh1~}          2>f>vLgT      0Bm     0&u)gzf~3֬w8f      06     mjmRJMkM|&8x      j    22Wk`[PwRz;=<>h       P     d~]
mVflRJ/z@      @g
     
٬֗)WU6^J~itp}z>      0+    @Y5Ŋm}~w;]5a      Jm     PX~RJק75j}'z      	    lV닔랟Κۚ_\1}m       j    -جSJ)>pf>nhlh*      Bm     %z?mnAn;p\fK)RJ/F\       EBm     E#Z#v[|Xm*t]`H      -j    - jnOompٺ~O)b      6     	m]MȭY*c%~)y4?&֓m       j    yJXl           `F6ޱ҄ٚ           mVfŲҳa6      #     3YbնW<F	      6     j}-!>tqp}z>m      `     n;I)}Uٚ0      -j    lV뽔QJ8r[߬v)      }Bm     Pj<nb.t!˃K       "     !ً[^濯      @6     !պhk                    @1            (E            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b          ℺  IDAT   (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            b             (F            2RJhqH    IENDB`{
  "files": {
    "main.js": "./static/js/main.ff19a20a.js",
    "static/js/787.6fe45b4d.chunk.js": "./static/js/787.6fe45b4d.chunk.js",
    "index.html": "./index.html",
    "main.ff19a20a.js.map": "./static/js/main.ff19a20a.js.map",
    "787.6fe45b4d.chunk.js.map": "./static/js/787.6fe45b4d.chunk.js.map"
  },
  "entrypoints": [
    "static/js/main.ff19a20a.js"
  ]
}window.env = {
  "BACKEND_URL": "https://api.labxpert.ephi.gov.et",
  "UPDATE_URL": "https://relay.labxpert.ephi.gov.et",
  "SERVER_PORT": "4411",
  "REACT_APP_TITLE": "LabXpert Relay",
  "BRAND": "{\"publisher\":\"MedX International Ltd\",\"name\":\"LabXpert Relay\",\"colors\":{\"primary\":\"#d05286\",\"secondary\":\"#572345\"},\"logo\":\"\",\"links\":{\"helpcenter\":\"https://labxpertsurveillance.tawk.help/\",\"support\":\"https://tawk.to/chat/62de9ce937898912e95f8b2a/1g8qp9std?pop=1\",\"website\":\"https://medx.international\"}}"
};icns ic07   PNG

   IHDR         >a  IDATx&&,"AQyUEF(
UV[kjQimkmz-xUh1h&X%,c9dݙ$>J(MQ=@  
.-	Ā@PT{.9	J@`0<#l+t#d	Z(MQX`,ȭ/B 7*0āMBZ MQ #m	
p5 0,,ՍHP`4EˀGe
97om@
#s[xx\7B3Ai:+p_-=-!y)x|5Yt</(:S@ӍrL&4E8L;frH#
WL,	1YLhF #@XFR8LaoRAp4A2Xe0<F8D!k(j?0/$p4Euo *E^G#)l&c3MQm٥3G#I~wRd;_a3iz309aD,l&670(r fiH@ST/E$ENؤ5Eb	{<	\	?>Cm{?-]0w	.&i@4E6x]vu޲hzhK($I'&Cp4b2͠)xh\n7wMwe>t,egXEK !>xh#N^G#	Hy~	&Giy$[6<N)to5OOS6( <L34MMI8ub-ػ}7vr6%J9V/RQltyHM rh	tݓ)yjHJ|^6܈eZ%UI'f%ؖF.{ْh+Y]iwMѹ}׎[[ǤAvw'~ɇ& WY;#S^Q_#_:27R9j%Jp lIdJ:Pںhնɏ M]҇	 %E6ȒD~$el	![]pZTݍYȂpE᩷gpثqJWgԊ ǌY݀,ˢ.Fs??=~/nXo?n^G4G2pM$2)j	0VOï2Td`.vuuqȐDpСUإϠC4 w&T]jV'C7*e^Υ#-{_/;՘udH"cp؞-۠ VBWgPe%FkچHdf4a;onVd2w7(LTSjɁ`bϷ1%oKB)1+AyH4BSTelX$Xt:B_WGfjUSTA#$w!ЍYr98r$ \ؖ":}iD㆑C>\MmkբX0c.g.n^̨HBJ+YMJ%IX'1Mu[3rz:K&$ǆ$d"I,b{'Op*\9}h#䒉ź@!2П%藇yjC}fir*pso zz!#ȵp Gz򠟦2iH#^eM[Bc6-_~ÑC9yryZxɇ$&+y`'g!^/z<I&̙O}9tS	
OHk%_V?֬'zzGs5НU}~;7ltÍ~(r;Ƭ_YOҐHyh3g%Lq^ʃa熭|-)"#L,iB<Ju$vn؊ٜs=IJ wD	"nP:BD.ҫ <J[|*w~ʄ))ۓ_I|7O.+ Xgfq&=d?)
4lƢ`&(Pʣp'A!6jl	+E񒆋\ >\B8dgnl=uV&-[EPTz&bVEzI
W軔.Rk
E8yo%IJb{	]&4dm
\=iHw +nr
!8/֭amNhLAA8J.ҫ (\@!ؔV]sh<C^XPC.ҫ"yzoq+{'p:_R;\5~$1)ld#;6l%ϪHC"J+\C_U1^&<gpJvpxȳJҐHoytD	!QKuk18q߻_ztL^Н&y4\<,3ݕ|i,jƖANצ{~3.1ƌm|0WE$ 1`' ?c[͖ANwL[8KF&o	$0HC"09MnCO|ؐKuk8l8$IhLᗳm
q-h߭#yY7BIҐh:rl;R]fQVvqߟx;BȖr1f`h*rLxՁ\:hj6'r:!	}!Nsz79FH4n9		AOTrj:dЯm!G4Bqہ}HWrJ3kF3Ԟom2tpr FH4B7B"EWNo2;*ҹjµK<咫#I9X7BBr	$J:ft;W{YH$2a]rRo%x~Kv$1ve}Ɂ]2 pXNLaVl5;n=]@#d@"sశ;YQk֓Mײv'ةr90Idm	vV0h?icv];2$!/{SQf׭"b:,;h^ҍPIdg&` @Bw37VvI4y?쏦Rw8QRZ1dA",Mu܊3/&Ne<4vmNS	!CՍV i8$a4TV;U~G'wfeYd+21ML#KX80X0/V\I3]q,zlò,XN$!N`aZL[XXÚfdjnȖD|fdbWYu؛oUo>[XEco+h&G#]
]8wa;	L
eZ|zvmƀ()r6+?FqfU2MFjMH2ݝ3Z1^ȶd}|(y8
*bgt#D3؅Mjzcnkuٟfꤟ^4MN;Vǎ[Qxfip4ɀ^ᢧ\IILB0&-eYld#ք0|2'|gXDmd)c<űm${У_Nwac9TYMFh:$c?t6XQg`%6HfDS>j"'.׍l cp4R"'X(l	pENH~/Qd9Lfh?nRLh$=(jx Dx)cu#t8(ă<`0Ћlq:dFA` (߁a29FRA`> AљXt#"9)m߀V]LA`>0HIa`n> d 
@d3GLSQ_|#Ax	ܖ Ӎ1LP@4E<u#!(0r	`8熏
p-z@вXbi}Q-A@k
[-0O)pDS2v:MaH s7t#tBBi ڑ[`!P7Bմ@s0 

 .뀕
`nLZ89JS	t:@9\[G
 ;jew#$:ʹ    IENDB`ic08  %PNG

   IHDR         \rf  %cIDATx330TUB$5b59ͩI.wbŒ^ob:v FD	مYvOqe|H$I$I$I$I$I$I$I$I$I$I$I$I$Idq1BZ@/tx p7Y R@8 }`7Ȅ3$[	iA z
a O-@lz>e& c@@`-&V ˁeư1,I YFHViT8;X, H
R	iANf S8[+zDBZL2^#H%҂*0*p6Pt8a=C*)T!-ACˁH1$(.GO UHzskTxxx.GڐF EH B*F!`)o!-A*r /?R~R 7'#[a=b"@:b!-AӁ;୰1@B!-Aw'!Y-A|s8Hv`/7FJ VHvnT#QQXđ>C "p($'<#ҧҧBZp8;HN6GH%i*FfROz$ET<B$R*B!PT2]a=	*PH<
LA=ರDT{+'zJR!BZ"I|yx,KP !- 
$08-ϋcp8i$|x,	*9:W@~8PH_?T$)?*p+FaBZxI*	?+q	i\D$3>x !- BJ03ώcq@BZp(6p4TZ݁>h<S	"IQ\߈c1i@o$j>h<R	z!I_c!
i<($c |9xQ C_cqlDFBZ'&0I:ഀl4;MDHc$kLOG46b!-NF/pl6XŅ 
I!@Z4;H\\ũXXH <$	|wEXTH"@$ɞTഀl4cA*҂l`doX4b1*҂K|$=>h<(XϹ*O5=(X7b!!- j!?s\6d=.pRȪv,F cq,B"BZP^c1#/?j(cOĺVҲo?utWj;Atl57Xcb{`A?1Ȗu17]9ޑ	WX݅ 2xlb!-8xpa1BQUf)ۛ5YN6E**rg8S4T7euvi3MsN:JiA0:'r83>x<뗬)T>΄<iP}@jٖkƂT`R(@*,{}O]9 k7! Ƹ2VTy<v,( ЁT:PHګ|BQ<.q'O~`_Ve9t<řc8$XAaQ|XD aQfLSđ0LSqYHGSr=vX8&?
,lQW֏;53.;!RaU;K{P}X܉t҂+@,R]*cOVL*~5 cP-Tebq>X2S? cavz
qi'p+1h0f~;*<xLP) <0C~KgN8dRVG|
4N#\J l&h<2R)㱸&0I:a<ڈAZt2YD5xGrXvi`q.W>Q.
5
86;w7PWLAQl]/6SF*e҂`6pEopVӹdٸ|-T4	~fTJBb}v76 x4g2p6ٝRQ]*}ǻޕJUx;IIFNNL 9v@`uݻPjٿcĤQT\@_V+BZrP(HM]'ʡ[ؽKQTSQ8z0x+ܔ76s"02P( M!x=\˹{SuU\R3	%6"BZRS((P8~̺c4	+u `3(1w@E:"]{p%K\B!X=<<t?(1
iH
\1>SĮ)5\Xw_ĆB!-ؗR(/6estGrϬ1fq1\Oo3$gP5p%P"!-XA].|;ƫq]X[WGP-\XA401CZQ(3TVB(
_n{gtUPj;Q>XI,6V̤DJl)7^/Ռtsyxz*殦DJ  Al,	+ڳ<OT	3<pzpܨXQ榇єBi\
{*OH=N\OuVLbs*p%Pd!-(Kݟ:uu>B:(w.Owk68%!-Pd
7зauCǍ`_<#8z.`ن&Rd
6mǘ՝~9Ko3Wx3;i4!LBZP  wҥRǥqbpBZPk,p4`&5buBiT<ٞ !P]F&&@)Ldӊu؁RqEzaWs8Bq_;hJ1	`BU.bg[s8WBZbqQ$!-l^Z/Ve&|b
7y3Xe1f40ÁEP<3 I'Ӭ_+ۼj#-{)~j`N5L08"Q(8^kJ 8c"kġBLǁ0mY<
Q#8{,_ p
ؔmġ҂.@8@Oq.6ވ=ɤ䫿ڕ+k&peHP>`EP'`6V^B>U:jh}v7wEPSqwg'bV|Ԋ*.KUG p"ٝ8T@@!-Aq+ءogF:TWLd'(#MiA
Pz?79t6~|hn
U!hjEN"
P@
 nՂзQb7rW{hNwS4	6g)BPേ_#,3;/.=h՝j&0@JXيIG
7
17hnS.T?qݤڒ)j?xFTQ)fTQHp#DWzrؾ~xwxї1M#Ux;IJ,	i3GI
҂5FyWhnG)>ghA\@?&afXJ҂u@0C 
<mwO{?#y RQ^=s=n*{-,F (BaR=9V)Cny=_G{tQ<\\3*SL<
5(f(]PiC/paɕމQdo6ŠB .
Qe1kS,k10zcT6==T)1y4Z/]n){w6>Y G)tr@k *y
iAAjk9@1'rrQ״=zsX*^$L,D3>op?½,&2c"{^6,.pb`Ƹ"'8K[ 
t9>ذ4J{tSj;1H2IDt%O
WM;4Mt2[~}imn=q
z+anj=FSɓ@Ԓ7«_?dG׿t-TN(WC-le}v7!'t'G8f(|U)ڣRLz*5[MHэ<_CY~yFf;i(fTōtfa }FW"uHwnHW=g,%VqL#Vg"5H2RY9^JaъOՒ'"d`ܨHe`2;r{><_5R^TNeLֳ>U'SڭJ^}C]=dnj=3;Hyr?RtUI_0x5]HB*|h	/er2l#Ry_Pkg
i^Hb{n?RȟT3=tx{V^H&n$&O.B\p $ב6HyK'kCuLc,NoD*P<_auWj83*B3Z>C*I!>VTqw5Yk;S|G{SHB\.KE:T6=<\z5̸L+n"!"NxGC:nۖ=n/~`\rH<Ou#:
P+2x+	81tWZӮ:Kw>D\o7_vAH6Mm`]vQ[׉ߘ|4G5;Uiܾv'T*rVTiHb)벻h!csϬ|4>O.gE(
I Ng۩pӫSjgD2m)EQ!n{_ϑ1y4\v; <))G8*@W7F ArrF)_n\rh~*zM$GȗBaPB~I,aCv71z}?#%/WM*
01*
/e>ϩ08R*7_JEPӏc|p2K#P:pQMT e{ ,afZ㨆>|75borR2hpQTiU~\(TF3$4IcڏEMZ騆>/
>h#pQ(Tz!^T"X9˕]Ǘ?%qu3sIQaS DLQ!Nǧx4I3Te{8vXLC:d Ƚ@pjڍJ#%lH	!qYߟr8sz )BVR!&43[ym9q#Ts/&UUK].LT*

PTAT"d18Ruݺ'~ԳO#z٨J)n)`pc}QTF$>ڳ?sNG=_@XB
؊HW=Ng2[ymѹ[n}'@G;3 ;-H@a=ApAj%/%W3/ᮮ{AX_OzpzB);8X]m7y8=ۯcȸXR8;Bq,@Շy$<Bc5Ϝ-cЈr@Eif瓫x;pWWqh#{@=> Gr8 NI.ΟK؜m_:$z	E0I8R
aTTNab(O'>HR>z"qQ<o jg'8`ZK1tX#VJpx"Q(A>`Kn-AXn@QaШa8z`3EP\pj䝴3)sv0tB #BqCG)V3E8uL-ٖüH(G@lRE^$rLS*[?܂i!2-0!i ۀ)""
xtnL7lb%4Բbu]zӇC#9H	/vLTb9亮`bR="V'8SB-6`s]/v)mKؚku~8f`1EPda=basu0y+H4Mgmz"S(ǁ,6VTaef'XӸm?6mXU\xP(PUm%
>`w]~#XQ^ݱ&J@tƪd16rr5I3lZ[6Wmj=#BbSnTde,lĚlL*j:ac;(	4 6 B`kx4.vZ6c/Bla=DJA 93+%efeoǍg]%khB.JTJ(|~?0&U5Q<XI,ׄ]%Z7QU!cG AG0Y<C.fG(!``#&iQVgwXb){V.O~+=i،	S(l&CrKcNj&ב6s8K+ױar9lJLzLl$if)F+-eMfNoww_q#Q\rɤ39;G(5XF4"Ki2tF>]Ⱦ]MÁx63XH(AXpMiJ-efy%A%y-+/mf2P(w~3I)4Zx$u]TMq-<?(}6eP&a=A 6HP*2[ym4L^}]]l݅Ma=B(S@qbK^Hf^j#9ذ,ʍg^y(m&ާT( XX ö\3$W=4fϧ #&BQUaփҸm}JEx08՛QE!LLg>fNr-I3>`.ccԥ30r9A4y2S [mF38`y.HGn|
kZ-XN.:JcϿ8.z-}<X.)?Tů-dSǠTkٛXY]#:<,lKv&&a`0
ZRaLgqa{l+vJ,n>DD1>bjwH)^H"݉TL={YB=0h3xHH`Q)ରCQ@x)IXWvl5\b%MFRid/4)cp]|ؚ籰st 3`9>&[y!63Tb&\n=lgkUt0ǌϿb1I3Kڍ.+n&x.=H嵿)#z8bW.+-mXP8+G>X@4$,('z*FcY[Į-9u,*7Kl,?z),@:~
mL?2䘛Z+5,R[қ2|v3/bQwc*ǌg
 Nxy&X	ZZgjj1/ƂH#!xXL$kVJ,GBXLRG	,FbM/dˁz$(XPX$H5HRh<*d?Y༰YEXX4>^t$~n'0H< Sh<F c!H.bxHu-6bx,_#IֳH6b#x@!Iֱ8)G>FTl&>\Ixa=Qh<#@qSzd%6bSxlW\ xؔEu<I*&`FX,Tl.
s:$v 'JlN؞"pI*pRXT">3tT|+zd x@
F'#8Dt	G
ҰiaT(U`p"I~ #9Hp!-8x$a=pxlsP$})a=S xl_txN*Jc?T#I
|QX
҂ǁH,.T
|Ge{zdHPBZp"0#QT*\4o&*eGT8	LAr둕H%҂
pp	[?)tX!-nHv n둽H!>WHfL`6pcXE
iALCw[a=iAہ㑬}`nXHGD [H
df` :n1E -9h]`&B*,0nXHyHE҂GWݑJa0لT0TT!-X\\LR!L}A #HE#J"9( \\CjSA*>Tr!-_f=	xxsXdJJ UHV' ggT9I!@0!-()xgK `.:G!,#q	T`"{,6$KH҂*0 F# +`}Xd,I JH
04` Ni5 [ l zD!-A(7t:8THIh> a=$I$I$I$I$I$I$I$I$I$I$I$I$I$ITfD    IENDB`ic09  QPNG

   IHDR         x  QhIDATx	Uus٘˾a@"qѫjOjVjeiZYZSnYfn>V(2& e{^z2a=w}>AD^7@zHZV?҈7/zA@/j^@5PT1 Fh;N`;l6Mzu`҈&za`8.0C(ũxXVX؎ "9t=cʋ2`9Xkhi1HI^ L&,X,KZw#"= "ݒt Ӂz`ғ|xxxxx2tJӁY,`
P$>X<<<ҸyGySI
 H!kǁҸ?I׫fs@)fr11੆ƭ2t=H p<p0P#-DʐA$]
F6R2jW-)t80 xxq3"% RӁ@/D:o';ᆖ͈HH^088Ed -;)"tp08HlnnhilGHDLgnXB$|gF"b)I׫ D	^8c]HK׀ۀ->" R.6Q-HI^-p``)nK 54nC@D
@#Rz6 mhilF$`$] KӁJDJ_+p'p𧆖F D,z0$p R~2#W'ZA$Og"O  54fH%]."F>p`CKc2H,pJP "khi t=\D|q->"= C>	ɀ, 9`qCKH0짤0s@iiv
`eCK#" W|FDrm7--)D I׳PD$W ?ihiL#E.Hn f "Ap)xCK#"e餤"R(@𩆖5tA$]/|ED
j-툼HL4DX\"o &8H ?>Ҹ70pDح>444A7& Rnhi\>){I3H|GʚAZN"R|E-ket=Y DDf#Z}$]r74nFʊAFp࿁ш*<цF<HYH^<""TT&u۔jN#% %/z.pp8""oi-ˑft=
|臈Hl.~#%FJR*/_p
0 {)܁)9Is3DTVd$]  754HIt=}S	؉xMRl%]	 "l`R"^XSyRl%]o,k( "['Ret=ɯ-->Rtl$].nz!"`O"^T)*I_ B<``"^hS9)I׫n""3@=0={)ռ)
6R7x8386{)՜B
M~L@Dp $uO4! -zG "RIF0 %]}  6<-H᱑t= c HqxݳMfHAI|`#"R,h )Ռ)I3u倅H3O"^T)I׳ ""e0,{)՜Eg#K^p>"" `l"^w_S9FtS`!""o"01)՜Fc#I^)p""c<05)՜Fa#H^H""R~ %u4HH%]/
$)_c{Ri$l$nDDD cR$ol$o FDDa0&uS9䅍E,[7J 񺇚RY$l$璮gkK @D7Mf)ɩy;&{)Ռ䎍LzFDDމRxRHnXH.nlDD,:`aܰH-@Ch$'l%]/< 
'$u5#=FzTIkJ5c#=&z5ɈHO$ulJ5Ez녁[6H$uw7~t=\@m"^HSG엤k ɥz`k"^\S>_G lDD$,:8dH%]o 8:)ռ閤Uc|O~єjnEF,z6#8DD$(щxM,%6%IcK	={)ՌttADD
c.NK6 psF"f#t0p'0)4UDgM4l%]}ADD
p:{)Ռ=cO!""b`>,m%]oAޑ1##"=
#fOHm[J4 SN|"!D6ED6EFqJ4]HTS53ț} )N8Gn,}?cfO^bWj'"5qbbر@);MțJA:eQ39S>qةsټu,_t G'bC	!=HJoJ5FU!b}W}~C0ӏMm,b2iDͅXG26oTi47 fs[Rͭȿ7e`i#ƏbI˲s"W4\ϐakU481Pv5%ut〯i/~f|-zɡADvK&'uMM旑F~F:($Q?w}?H#R"8	8XtF84YpX"^w{SylKtɌce|2Nʹ%lߜB9=:vC煌.F&uw6ty5Aݟ:A#Ur)sٱu;+@SCHacӔހtx`YSy	t@/K	9t11LG{"*fBpl,ʊД@F s[Rͻ)sW_"]6ȃ"cr_4R4Ţz_H`S撮.z ]99Pӻ'ŞhY*#R,39>:J8X,Io@%)ռ2fSƒWE:^âϾP8DOqBSizf1m*+	LГ*0/ve)N)SIc+Sn9i9ͣcvH=旖ufDH7E'3Ȫ!l,;ٜݍtK/"{)L9(_	cHxx=4n*|lFX̎,NDɥQvod\SlPlh[,bg.:^C.َÁs6e鳋iۊHM0!ע&;#d&u778~C@e1o2nzBTX=#8Rm"Z1dO)3IT#6]39ȧ^̚w$tW/f	c,DC81׳rp"^wKSy7eĦ$]}"'1jL:t*#'߿H%n856	  %ͫ~ xMfʅEy|o%Hӎ:C oϢX=C^iUs2t=8 /U՜~9!TQ]ɬWl6H͑1#dl26/v,_,`\"^w[S9K('LBC~|򿯢>R_wǦ2-4[H882aS!mڻf2#3#Y*^_dDQh6dw!S7)q6e X9)(4
fxNaMdYDWǡQ(D;6Vd ="IlJ5S,J\Az̐a*۱{̭_vbLva(\
G}H)aIc/ G#=X3>z.Օ~C0{ޑ{uWHWM	a^4AP,/tEzL%u6)Um$pc*k?\v>NA3"D%M1Q =}8JEJ|DzLm8X']p:u:3Юz&8(&!l*LQQI3(5X>a0m"_;L?z"ofZxcm*(6H;F)AI3HJ2iGͤ9p54=g,"Qb^,0,jM&ٝHxMfcQ"=WZ1c9+yBVLgݗbWeE8E	(1I3jt ]9pTz(D˓gQb,Jtx$'zTTTWo~⇈ĢHy0a&sDx4RQiHx,JE	I>8HNTTRJ1$Ns*eČ\t=bQZ ' 9SYSE)9:cRZ,"#IFPc	!9)!%"zpUUR*+kk/%ZCJC؁TE!9eHDX	)HNŪb2cGq,_?
)nӛc{Sl:F(H8!˶)Ǎ⊆9c1 bNdRe"X$IףXHN`\Ī*Ku
)5VcrHh$raɹq pPH3a|+whvrvvXE$0/he!1GDFsjt&H;z(r\/"9+.?EUm5RjAA$zQ,XcUw}1G5Ϣ4ZɳWE(n'ɳAP.W8Smɯ9*2yщT0Y'Cɛai1"t=\M=M&A&r>Gn,5}z!۪Aԇaa"yvalEF}?cq|o2>Ƈ06Vd,W!)~Aj8b0ZN:tlFzVxѱ@̄!|"eQXݞ7Fxe}~qg*9+6!H#t!t&PfaQpbIH`bh bhU#oO#R,L࿐@޾yg3^=˲	c8!2qww yo3"i9HEsU,M@g0鬽~1s`!رey_p4jzBޚ&06~V5v$0xEƢ$]0	Lj6Ϙ?
}
8.206uHK`Eqđl~u{e7}ʚ*,M#Do߆
8"bQ$> JmF6Eg|[mʝTZ"[t="aQ<3@غ]{;pN=lY81᱄&n	@E8!ڻkBϼ>r4Ю朊w =O@gHX9@	lX?mq5`ʅ4&~+?ӓX _qyq896p-)ÁC)!	XHAX߼\x&HR69kCrc)8"`Q#cͲHϨSˬyGR;ZCrgsf7RPNN^΢ ch@zƜJJ	3?6wGcc!9)(#(po`ڴ훷!=c촉TTS*ٵ]Qh/{{4;VN(`I'#%ɲ/-Hϰ1SS,GM"M"焤UP,
L`Rp_ZaJf~l2s£ِى
Ea;0HY2ԗb5}[݁$B(PI׳j
:ڑQl,#.1Q$@
	IQ,
$E
ҶM[ٸfC|bRmEX;CC.6~;HS,
׉$?&g޾b:}Xǵ{#ZN)Xp"ʢp.FzƦu)t6EFqZt&oM&g(@(zHA[R2i쐃쟵WRj(G3#gu&	4S`,
Q@)hmd}Zd;ҼxjӗEzFqpl[ٖ݃0dQE
^6eFϲػk1GD85:*F
L,>R Y9QHQ@3֊qFl
F`aӜق9I׋P`,
d` R^޾{y)$c~,3̪E
S;֤SHш)0(B ݍ޾BwEpJ4A	!k}f{vh`.ƢEFx n8+6aXٌ(0$zQ`&RT?<H<r}l~m#AϢX=eȲ"):IE(,Ӂjl۸\t޶׷p0/2	!a}v'۳{X ~HY{v&(}
ΊTg(eH:bQXG~4m{[w;G"zY5HqɐfhN(I#E)i+K3V-W} IDp6ٽHњtJ
E E{EέWѺ{/Ǫdal9C0HjJo@ZF(3ſ;7.-OȢiy%)j8aQ8f!Em<ȿd2izv166FsbdD߁t=9)z7dYo,^}ȧ~vcӘB,XIףXAZW2lۯzbɡ,MUٝ@JB?`QR,A]6/~|1G'p\dalt,N# XCOmVU#?5e]$HiwrHI XiHhoxr{.;<q4z
,IoO#%`Q %џ=@۞VɆqE,~y!jEK)=c-RrJE,tA lݰ[ş~;#Y|hװqNt-lb[v/Rrj 9o2`fRHs7oA&!iBJsd
dUᑧ(UnꅟL:CLc	
BJ[Kf+gv"%@IHiW?e[?$?ܷرu;0		ԚR|UH	D@JV˒Wyg~lJA6~_d5azxG`!aef+eRHID,t=,?#P־+~E6%*LIx}%>RF%]/F5
"%U~Г:ypg0eHyYkRl `1q8>w~6f3'ޱO?Y\0Hl,dy)!Xcys$ū>~XC>T0ESgA뼞ى!X eog#e2~y-m#F:9.2ESjoF& Ic#кg/4{*jm|/mȐkYac"cRX&M)LcQHYy{9c8r楧.:m"G3~϶Fh >N6nS04|fټn:9;VH7"JFNo N@3>>M7m\}:^~%bVd$F`cY5
J 3)Ksۗ~@bTQó=?#;n'j('D3܎#W<ڶ)[#	EpF e[?%m{Zn[uN_Ύ3܎#Xn$ nY';q4zYWYt`1;2#4?lHN@,3)k4?;Z6~ _p	+ zY1Ψ,"e,R $]}>DZjVlfɕ]{ ݑ&88-:V%"o|ZwCd]x77`XD?gQ3q'-{~	ذj£ F[{x',a?5[)t^)6ZG>ĭ
ΌČp,"o!˃mK3]"  Ui7nW?Oh :Y"o@_~!ynIb3?7ڸ|9QL`y+k2)m_ț ',1 7fۯ!]p[ɇVg>4A;xm)Y|D `mݏL:CgoY8N0.ԟEzY5,>VDB?`OyGϓ>gO.^F>ѱ̋L$jD:Jz"opF_D=9cgy3{w+w?Coyщՙm<ٶwЇ X7"o#}WZ^S?w5>0>4+`U#;Vok"; `"vn]Ş+?塛.kȇ96:yDp2׺]vD:7pF/D:a|C_/{|cU2/:V"e@j	C0jO<'ё X͒tAF"]acs\t<'D&A+^lɶfD*z<sȳ
ϪDYUtL[_&HU #3@2)4c#U[ۺv?H7 C9b93H[kjgg
D߮DYt[_b[v/"y!L]1V?=/zf'"0C0" be3 HWmKXَHr?Dɳj+dZՈtW;m}VDzPh'D@8=~V"N{[ВފHg"%]		v2ۺDJCDdp"wpoV!R*<B؈tn{Z_vDJH	NrWlB8DrpX0,"ݵ)Z_b{v/"!|DrX D6k]R R,c8b	3є#m32"WaycOG$36 ~eEY=V%"Aۖc"K9 zYQΈM@v׺u4"҄LoSHwn֥ʶ!O9z#1b~l2*D煎m,C@+"66Dj6<Ҷ;^G@|!|.1p;HwMlA|"Z}`'"]`0̍ "]Z~d R` >ytH8骝~my%|0>"]',NJ2;4Y^Ǐ<+MCr]#f 	E0#	ÜZ`6<2?C9<.FOχiu6DAH=Ա|8r0_83l~x" Xc"o#lNN҄xc-۳䜁K|1C²mDV`-8[UtF}mKxm9i?KE+c\pͥ\|eTL9b:>w 8c#"oazxtlGZ9|p'?1#茓?x&˞ob#6 `lFMkCб;.fsv7fYǜ}2WqCǌl}"6 `lD*M1=~jkѶtrw/.8E~q>a"ouxM._6=|0@.ҟ1iӸD6 `vՈS("o煎<޾%ל)<S.<''q9Yt"l" 3fNx"oe]/?mZ!-ײq!zJ(}p4m2"Y`RcqBd<"ofu&ŭ{gEz3>7|8@raQBDn=  44:E?
7L*l]L*\ĢۗSӧ\:>p"khi	EpV#em݋aN{[D
:6tz9d,&ל|P8!8c#0ՙmm);m1#O?}?Օӈuxϑ8gRfGתD2dycL\U]y1N:cA8墳x'X5l" iARC#=~;wm+kcwyCP"(|B1Hj! Y	Aʆ072Zm/+Fَ=P$L!2g:ӏs?f:`R6ƅ3H[x}5Z.t
>O<O۞V"8>*R6p";V~ٺgW!KM9/{#1B NxiHy	E@ZUl"mEf#+[ɵP$Y|UؗBv{`_hhi$(Z+p|d{3w}Vrm!\~W8IlǦŪ*XEHYr_0;F._-aM:Ecuʋ̙?oV"ea9_Ϯb3)O͙-ܼ9֤SZ0pU5'b%gcA!X@AJHlR^2dy}/%OPǅ_$ǹ| .^, Y1,GJ 1v?۸Eо,>dYG/<+\e[,l1HIkihiC0	)9AǪ6l{Vrw/bs(%Ωg,a)R^"`{)Ij>HytJ~w1;ڸ	[<~üC^DJ)}vl{rͲ-N<og\zN8Df$H,۪`)}k)n<-ZeMx9y8̲-N:t$bfuHIPsoz$@h)b`]QX"W>]Y).XЅ%J$¤!'sK?߮He93g6ҸKpa#L{iS?|6&4.`#ufː1I-ƕ5%Wta#j3N[^Ϥ4AC?E
&"cJaiL[rX@rm2z?uFGRB&"S[G	7 @8]Ơ!iVƎ>~<O؄b @"/21P4EȯF*s?at?Bg?8HCM8l"wjHc\9m%l,csw/vHL9iM+"6QNigK>V(S?|qWYŹ#a{	Hr(6}ݦ}<S0P&~y罗G !a$['"W3-H<*ވ1#yB"o!a+n$sF3DWbs+6Ҡ!3~,B+,&$lBZ'"iܛ_sŗ	0/wHrznB&\!bD>n.as p}y{mA"B&\)G:ciFBSLϭ)RFW=m#=sgcYIO"68DHdL{ry C|+1	H%N9CDNX@؄{Y`!-$qHtV2!GL༿swZr"ME"c3Q$-Cə/\ࡃ;g!3i!|`#h9	&Ǭ|N`asyHL~Ɍ@'	K؄r`/	qg,nkʻ=NÐ:b'D"XD؄{%	$Fڃo@©DL09#C;ypz	#Ѵ`#78]e,+n`Cs)H$s* 0	ǁjG9cp1@;sKY">XτI1~ҡH蕁	!r}o	-#Hxha-kț2a5iH9-'N:`#!d^a"fEaO͝e(m`	Ew'Л!lk6 t=/,2vWÆ 1]'c6ZMHلr`J;*2s
kx$) 1=$vR6!^a(~v]ܑ[ʪRhim蓎EBk{EB&f 	{82mܕ[ QwnzBp[ CBc5V+2W\.lH3e2JyMW f"r=8;Nn-auiQk(KHuL|4--Hq}	!d``ii+w喱?s,GcԸ10		9DBc=)`~S6dǑhimHr6!^X{R[ۃN喰F߹#',9hp ;ǲmAj J+LQKeft7RG$ށ&la!#u7jeՂT_֔_ɓT04wf4GBc0 J=HтTז ôb6,J/.Jwe[H(^RW#HJ/f_3l6,_}7܆Q#>jRwn"&:VKeA)r_~
i*C?E>ݐC=nRw/Kp} !u5˕ܚ[_O3떦,1!uw{a-H݌!}Wlr|6x/CUpq}o0"}e
ܗ_3 VwG]r_ޘ1!6s`l ۲KT>.<7)0H/>$ԍ~Qb=5H]
O72=nS@^!'_{oFTFzf̄Hݤǉq}
ALpsYXDAzR0w&vCQ#^Ndy{/Ur{v)[*?+>UV>ykG@"L#l"td@YX[+DqV5Emx%pb	ycG@bd8&=X\LA\,1wr_]ƞ;:b2৮E6ѵXH`me7wdҁNj
,/qhԂ3DMD 7!RGE*-gf.EΔ{w_P߱,,BM(h{H#Rܓ{ŭdTfˎ!86-ȀKD{Y ;#N~-Mqychfmc;62`~^f} 3&܊y5Mk[?!#2 8s}o70
Y	rgnK0$<J\l۰DMc"5WB1Vwpgn)+Hxm\>̟8IPP.+Ei+QL9<_C;O|亳4 0
Rs34 ("5U0eŮ;rKYUځA$gj:[4 
}q f#57eByw喱78Dצ5ik<y#chdrJbMp} efrD#˛23y, їovQuwt!5 ׸ lb`R3YSQ:-5]Hc1W~򫼼z#;Ӆ<YMq} &" KJ[+Ai\6n~ch$;1w]߫@lϳ,&$oJȯbna=e ~̏.lAEׁNf4]T])(ܚ[K=HY0i񱯐^Fp`^&j*4ƴT]wP`2f.##k|¯1c}&<`ȦgoeHT)q~%O6`)KLOWsڽuRu*MZ܍TUTR$6Wpkn>DǞWX4E߾4(ʤI+Ze=0,(mbN~-SFd̃si<N=˶|6ǌ+ US>nMcA74S.ڛ\EDn;Hl{Z`R5{DAi%l*G^xjH-XN|yA%@whd6opR5{n¬Bō<[IwP@neLN*
auf~l48xOHUtyLunn90WTq%^h:-@*.%cHU:`d}esDvoYO18:0~]߹&`<O!UAX	[|r/5EDje}\+qaβmHU<EphL$c%`Z&PoM+Y_ރALv[ΜQ#/mb-3~ q}oM¦ * ˻=NDZjrR]@=mX;4&ʤI#}V4Nj0V/ R/l'ם儩SpZ#b4/\뢉84T&Mǐ~P{iw	/[͚E+9qF@u/9э7S4ġ	%cIH9؜2`0,`f>EgG$lns3d;cb ڼ?cgˀ^&ЄRIˀ/ '9SAG`SKyS:7Q&@$
yL''NBKkgX]{&dӼ?B,ktRK;N-aui'HU* ܿ=ZZ9)/I94T&M2x,Cd18-م5t""Q^}	6IeYTS>k~N!Gdp{yCKed,,`!3%Nk=jɚ"kXRBA$"KIgBˠVeݒy쎙H^94T&!KZ9e!TÖJ+^@cHzO/wOaԸ1TÜ[aZONe43!K<\Dzjg`XXĜZrH93ēu1XE_%n&vv#{49!Ig nS#pnS(m`iTb/`ߎݜ|֩j/-~9>36M\׺*i%4cO(W^p)֦گ;rJe$cHW2L+`ʈ4<3c.#c8c,8W ^'[?Rd,4yNn=!Vo䙞_N"ͫ\*ٵi;'ѩ2쯟YO! _r}98k2uXbp:c!vpb=<[ j:ŏ=O$6qo&~u8k+wNerIqH09Nm=?T&,lDyL'˰9fd,]~bAzlIk82B2X|hAzh*1d?{7W)WXbΠ!}Ӿs6nAz":Rd,a"=v qJX.Wٺa3Owx~c:;%A%@z{݌!ySXb^ HΔcҔ	9O?[	[ֽBStyCmG	H`ș"}8$H r}o=-2d,UB LG=%y[R4XbpDD$u}-NDD$ls}/X*H/DD$]{1Go!""aH8H2idDD~{WRIp>p(""RkOׅI*.$cO{>'gLzo2X\ ""\<lZ3CH8H2i`p&""RK\AA-Id,$p
p<""Rsp}TE*.'cG60DDR\@A&I瓱c'1H5l>jRt&K."""|HU9Hե2Xb9pЊEǑZyPBDDz=RRLd,
 ""p9p{Hm8Hͤ2ibXmR3RSLd,1_ _w}/@jAj.Id,188y# ^9L:HIDD=\^2`Rt%KN NFDD~c6Ȁqʤ+Xbpp""aBrȀrʤXbpp""aS uʤXbp:p""e)rH]8Hݤ2r2Hs\^T&]NӁこil]!u uʤd,p$p""^Rw
L:HqTDD˯K\+# ʤM2 g""fWABAB%I% 6"" WWgPqIe$c|hAD$Z7R*&K  ";]CBB=n`p""gPsKeۓă 	｀DB*>%N	T&M2E@"A"%I@p "Rej_\+  ʤM2X ""2:~^DDZ{m
pp""%3-C"A"-IN'#"R[ $$Rt6K<2p=%:sʤ+X)``""q "p{e!XHiM ލH,>ދHCqʤ%cC 	i@{[ )Il`#p.0 <Ґ,N nDD-UHCsʤ&cAkUϹix4m<f`""|{Hso`!" XHSjYqH oXHSk9p`!" O FiYHkcF\
,D~=vp#QBD<+mD"=f? EDno4D~B8H|o;1p2"끯("oBmۆ _DD*|{YDނHێ~ |0LmD,Dz=+>'ND q}x[+%*`"2~^^xX20D
ρw}o"}d!O6^q,p58H:*iY /<	\,t} R"Uosog#"}^*x|rj`{eDjBm-TD,t}HYx[p>o{ E WDd Xx+'H1u@"uo3H+?  R"uo>At w?ֺg#i[XD~.DBB$mC_Z20	^	x\\LD$ .p3=HHYDD{m4g%{A_	Xp}/HXDL{N.>XM@ x}GNxx"e! m1EpD/f`!Ҁm.#s99>`{i0"=68~`4"\CQY4xπ6Ҍx<~DHjN  W@	Yo&g8
hAl <`{;,Dum  aVOD5,Dm,(,=Y`0`!`X <,|",DOm#S8ЊB,u "f!"Uo$SwSဍD 
`HUXHM($x88P9`7x	X{eDf,Dnm#c8p4p4`p$0&&|w}	x
L&8`0QH`80@	t `?vN+\CDBD"=+,^e*	8^5[y^0*"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""ov>N}    IENDB`ic10  PNG

   IHDR         +  hIDATx	\ua[In0	$d 	! rXRԭj]G{JbغTתԧZc-Z2V>hQLXB d!$yiiK;~$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I	H%iI' <) 1O/ O4xfw<yR'4OjOVn I&]@$,I'yt`4`:zxl`
~Z^`0
<< []v`<ԁ:p?hOhje$I	H%)Oa0ya@Sl +J2$$ISʒt X, `!4
	YB$$I]*Kҹb ,K%b 	O 6w wwj-Hԅ$u,IR`):Yh `;p;p;p;PnR$I( IR˒4 "p$p$(@0< l.cH$,Igˁ"X,t0
*&g&R@6$eI5
8X`!9  M07 ^G$$IdYRX`-X=@{G \^"I$
H4$] kL!u`/(u??)cH4A$5Q*`-8X9  u`7p#gZQ$Ij$I(Kҹj`=p2Iv ?aVII@C%|xdt`0Cj?~X7#IA
Ht $] N S^$5^`'Z$I) I3Ȓtpp
pz4Y;ہo|T+?$IO# I/ȒX~$=@	OZy'$$eI8H00v
?KHZ@u$ ˁ@N3ԁ;~Xw I*IR˒}'g4$u]@'R@%i$	Vg5wK$u,I{U@
@$=p}V~IRGHZZl`#pGv|AVގ$m$Im'K)q#A$9v_+ʏ"Ij+IR[Ȓt*8 8$M]@(__w IjyIRʒ(HRk
|	:RIRK
HZJ9`9/ f"IQfOK^$I-# ItYFbL7l  I!7KI$M,IӁ@$u1~@	nVIҤH&T*"|`Ї$u@*RI҄	H.K ,^f Ii;p9+@T+!Ij$i$ 88$1^;~P!Ij$i\eI	p>$Iq|psVA4nq%p<R,`$,Z$$I-K ,6/VHZyIA	HXqˀE@@^kgK$I$ IoY^	LC4|FVI~	HQ1x!B F4ƀM_%`SVE% p|$Ih+OKcH~M@K$
'`0$|
(j凑$$_eI:8!IjGcgkJHHR˒4 /NQ@T+"I]* I](KXx1 IR'RI2I"YW0IR7|	0pCVލ$u$u,I뀋)Hn|UN% ]\I&߁oK2ԉa$eiks$IzzcUZI$IY42`!I)HR'HR˒}g I/K2Ʋ$
	\l "$I?cUZIjGIjCY끷g$5p-p-`GVFI@HIs$I8c,ʻ66%ip,fRI&^j=HRHR˒4o2` IZ?-#HR
HRʒ4o^"IR	|
T+!I-& I-$K ^	$IaKrIjIjY "-R$Ij_  >K244ɲ$RH9*{/K24Y4I$@$IgN໥ZyII`Y`!v@?$u j44A$ei뀷H}>|xT+#I! I KppIT RIj$5Q8$Inp9p]VF% IM%0p9z`
$>T+ߏ$5A@Y=K$IA]'Kn$i$ieI p!ITRm$i$idI:x'j`
$PR|tt$ W K$I/^'K^$ $ eI p6C$5(K򏑤%T[HpEV~I: I: Y	1$ImT+$$IlZn$Y$dIWG $U4w)ʣHHȒpO~$IR=R|++$$l|T+A~A@~Ay@/$T+ߌ$$%ixp$m|T+ARHzY ^$IR|T+ߌԵ$W !I:
j=HJI]'KR9cbIFo(H.1JKT $Ip$p)/XWǐ5b$u,I F$uA<bp]^}I]! eI"$IMۀ/j1$uI-K!U"  Ia`v1_R>ԑ$U B$5 ?($uI'K^U IbpC^ARG	H(Y.x1Ћ$Iҁ\\TK2:C@RGȒ46 W$I:47o\Gb$,I ItfSzq$%i $I_? o*Z#-eI?N"$I_[*N%H$5p0/\_WCR[	HjY`p%pC$ib5o on,$Im!KH N"$I&^ 
Fbp[^CRˋ$	8I7WǑb$,ILE$u ˋO*6$%i#I*e7K(ZN%i/2
$IZ`#/XWGRb$,Ig  $IR)?ԫ;2ZFˀ+I xpSVn i$M,I#TcJ$I:-jQ$MI*K^ǁ#$IybJ:I#idI:x0I3 	*?ԫ4)b$M,I^!IԹr:`e1_RnC҄HPY`1$$Iπ+cH01&L9|@I3[nԫcH1&Dks$I^Ӏsbp}^ARHj,ILC$I`N1_~^݅TY|mI$XSR֑4IM%i  NC$Ikj]q%i
|X$Iay|ZWHW1U1p	i`	$I_Cbpc^CҸ4n$^|#I5 *(Eq% n$Itzbpm^݃C#eI^ ICk|[zu'IC%SI$  N*ߪԫu$%2/$IR3\
\tX

$I4~ ~Vn H: YTo#$ID\TnԫH1[8<0I$M)ϋO+*O%i ^|$I&KpP/?ԫHzv1Uxa`
$Il9l *VU$=I(KRy>I$8[^Wǐb$=,Ic[$Ij5XX\WHzJ1R1	u@$IZU  k+^$I&K)/"$Ip$/m^݋_#dI:p)!IveI|+zuC%sF  IvPԫb$,Ig%\  Iv PԫD$$H$, 6k*..#u,Ig_#IN /|R>b.%lKz$IԩfWՇTԥ$|	X$I:L`c1_r^}H](K$IR	l,_WF21Rɒtpp$I6sW+6.#u,I$I,bJKH]"KyS$IRbJH] KyS$I0^R@p1R˒tyT$I_6X_ZWw ueI:9p6$IS[PVW#uCeI:s"  I$=bJH(K I$-VH&F0Y  ^
$Iw/+n#u,I "$IbJCH"KI$`0/|RE 1RȒ}I$Dq@1_v^Cjs1R˒4^\	!I$XU16#,I#%G)H$I+<P~RWHm*FjSYFǁH$I͑N.?ԫ6#,Ip
Y`$IRsn*WR1gyH$Icq,IRLK $I PDj31Rɒt!gH$Icp|1_F^#MdI>
<I$ir- Vr^݉b6%4}+$I4 ԫ#eIf F$IjX	T#,IsˁH$I%v*RZT80$IԚr=|gzԂ"ֵ(G$Ijm iEH-(Ke !I$GUH-(Fj1Y8I$VoV:RZHK$I~r^ݍ"b%i/p9;@$IԾV SµzuH- Kx)>I$`5H1_Q^Cd1$˒4 g  f I$up"P)VU!MGH$Ie0iH(Ky$I:/|R֑&I4I$|I$UǑ&A4	$$I:
/|R!MieI?$IC  [O*jiEHo-p0$I]+ӳ$EHʒpcH$Ii`&HS  I$ubzu7&@1{I$IKbJ:d1ReI> $I/
/PW)Bj $I~ _HM#5QO"I$L/WW#5I$Y W$I$=ybwzu	b&Ȓ4 $Il+߭ԫH-Bju{>$I$6,I[4β$O`I$IbHY4$R$I$ab7zu/8I;e@$IO1_V^E9	x7Ѓ$ICC'8Ȓt	`$ITY.F1!ʒ4>H$IOybzuDH@QqaQ	$ rCD&\tbC%S RzZ^y%gkN$M@`MB._ɚ=u&+f#,I	C3]yj,X~||I&+8pz	6nR_U՝H!F:H|Og|N,]El	99o9$MB0c{g&+_ԫ#,I#	sfw$ԡi;dL­?ё$IjKzx*Ӣ>n^F  GU# eI $Ϲ,N,B<\O#[QH,hVrt<lc[F#5IXWRW" dI|X&28:l$s9Syw!Ix[3M#05iFCjAbJi?H/x=CjcO[c`>DC;$I78)Aȱ^m<ʶ]HMzH)FOY>	"5IU,(,@ĹKW돥z&y$Ikn<+92MLāzBm[$/|RnF1~Ȓt*HMx\ߢB`x?v'$@طh*R}=HM-ԫ!=i?w/R5/Wq(gFEg3z8)',?89"FCCHM6YW,bg%*f7*PŹcx?D$̋pH!&&0^n&
bpK^H KҙEHMv|zg\B3~sؾ]Ti4$?{o0@`6vet;R 'WHO#Fz|
  5QOo/z뫘x>oU9s7=H4%s8!x@o41HM6[XWHO!FzY>x?ЋdKV/fs1Iq+O\Eۨo݆${qQ%L"2%R}Ǒ, GJS#=,I!M_v!Ǟz6s0'n<]wr;.EӻOD	F!M/u^#)󅫁HM6m /ݗ3Ǳ7gH:ߴsg!=!fneoci_W/~E  MlKW(;+wmCH:גL߷Eq@`"{mc&@ +H FYJ<	W0sfq¹g6t;cccH:GOY߷1mA	*#H&F|)&9xe`~:cN=ysofǐ$ /gun>=LsVo Mi|zOo$=x?Ѓ4AV%dEˏS[7}[$ r\пd9΃c;&H 6U
>1>Y 4AB\$YV1cvӓٳn1:2$}'-̾eL@ #[i MXWJzuzX4sfrq+h5fL%o{w?IR{M",V3'ƴi-D'F]/K =Hh"gBBh5Q訄ɫz[$I-(8g6_a @+9{v"M ]ԫ% P MW^̲+heCy{4Ƹ*#{G$sN-051Ƹud+|3zqԵbՊ#Mi3<'fTv+;ف$i͎q^
#GD;CĦE`3JuԵbԵ$]|G`GW^L(bEsZy/[ﾟF$i!be\[h@96>L}1Ip\1_z1_y^E'F])KS1HԋdsnbsO_lF I8S^w$M =lن4	rJVubu$eo/cy^Vx,7E\O!&Ю"7la$8VWWQwP7&8,YH;ugG=D8FqL|.?ã[>`F44~8uu,I#g!Mɫ8BM1XOܓcMww^$Ig0cCRNYL	z(@$S|o*1Yi$9S8H:EOo+N8G.ΛxQ$I&Xbc
D:HcM#[&
|aS^E!Bd*p%Џ4Iأ4!
\r9b$I'Ĭ]}rX4N4;@ԃ4"<1
Y&"}EщMc'7͕$Iozsg!S!⎑xi{µz:^Ei-Zt:Y.Oor.[LI3,幤Vt>r̍Z"
1xY&9u!GBdO?r罌!Iu}!ھ9o3 b/lي4|+(h1hYs+iO7sf-Mc'?u
+gH4#X[H1榑-24ɖ?-TUԹ"+I6kf̙Iy|dn(fǲ"KDLZ@:Z:Vxs	!mB]<U:altIF}!	}xnߑ>U<8THdw %G/%@7p.wy^YCHRO9'nH- G%i8/bvq.f,]nȃ#I."g6`A4D  k4q~1 /UQqbq$e04kbC	esOч[1$pfR^Fhi4FZQzuu);)H-b9D,?w}eo`h8$u Sp=K!FlJe0!81(Y"r  Vrg_1G*۠$#{fs~̍	D3V灱H-d!pW1_RNZeK3[fo8ҳ Ij }G3=g6OCjAG%F#K vއ{mgR'fI&$NHr!T\bv㪫 
X W)JqiRB$3>ꇒdp"wPH,J=Oo|aN)EsF`7=A$ǔ^}e=뚷HAH!|+Q97rbTv5:p5k`+0HO0QB$]D
d<+1#Ə&3!=W9rOYJGK7lz䢘	qBt
KCqE1OB$Dʚ5o"y"x'"9hxHʪʑWR^ʻ>{G^H.1(59u`ť0"9j5,O "y/ODOň䠪pB.;K-XPfr~l.cl{CE$GO%Hs'xI%E$wIΟM
ZFmmz	ֲ$4w-t%s yn]$Y$ߕ"9j씉H(*-|?P>dN9e[ "Drܧ*$9HJl5ψp$H00aZy+ƭ4ڇ@sZ2EW,f#F;+k[׼OgUň䰒Rb123޳7""2Pl3b39)<0%fB丏 c y)OG$8?H,?uu<&ͨGDWG""i[l
ِOB$U5k#y"jDr\Jʊca%|+[X1ư(2s41d`EpB$Gd<aA$X4'/E^Iy)>Wl|b#"%6:q3yMqk]+G!7#k/bD""Gk[c Fo!yAJ2'Sǝ) 20jB5Ǟu۟¾{y3Ò$N5.2FD@(-7,oC$O_QùXw\DDFX[d,eD#z$X$o$	PHCV!Cqu3z""+㝱Ld(x"䓩[(HZ[!"
ayt2k)6ad!lDZ`7$/$%`	"ybD'EЋEYr<CDXg4g.PQ_Ys˺-Y$Y$_V#GKEoyOeFMFDgjh-`- $lӁEH^HK!@)"y$Z##ô\r,:XD$\cYّzb&(."y&|$ODg|08<STVL$ArSJ>^""R9ŜBw&CĸӀEHγHNK!@"ymnwk)b(.e- ȆCQ#x"49P$>cuf~gX俈q9)Z:LE6H:X4Yx"|8<`FC(|X{L:䧑N	oSbkak "y(WܺyKIe9)'"8go}b0
We- Dc 9)OXb`9"yV1aZ/U`)hkna}mQrRcC"d}f/"y*WܲyK9UӁ$"yZ䯊\x釹]2"Ds	I9xF"*FT"X\E|xD$XᱬΡږa|g1Rx"䢩ZD\Qi11L3"+֞:+aVE2<	!2"y-@s,SBD$U}}c@D8嬉a[E
5XD\%d<ab\3x;`cpu9ܕ.v1qgMt6նvP	P4:H10yV-rXy!x6i3!0b) w'	d<1x`qeUS|#Tw*Xw4)\.q)HΰH.9HC,_W_ų1 "'dsNtl)H d<Q	cS?ŪwH4]rjt:'3!DDޖ'"9"`""ylX9\.0ɭlQ8DDX-p,2D1n HC,;$>KlDBaad<gEf2Ҕ "R ,d<Q9E cfo}3.\C(J&3!DD
<DdYdH%	x?PH)./%}G#"g0Lvqnl6Ӝ8XDD
Ld<Q)j)@ne'0f?<ГxYa~x<B""R!CAL20ǁ)0HRZYHňJ杸k-۞L&A$l+Ә%+Rdy6N?H	u[<dHXd(MAD$ KYw_'A$,4gH@!C"C`""O^ʿ\YXu,"A1.K"8=R0S"jLxbV"R|#7u"?STVHT9EIDp9,>iȐP9H"J#r$EŬ5)TôH΍f3AD$ !C".O(/{>"o:N<s,<y) RHeYd2Ef,d<Q:2DDUc&q(*+FwJ83:cB Y#{y2d9ȠJ䥌8CL_8ulF$Y[ Sm~'/!RBu]4.2&g" -XX̘W~cw=D6A$_#ipADDDx4lg	l&Ho89#o|0)L	 ~
*4x20 2g#n8DL9^@"PŪHm)Hox>Q_Y_뚷!"8`"IX,_ǯc\r%E&h")7QD4"Rx!L`ňUQY1V,&VRċl$ՕBdrJ9=Ztgkbk "aʚ5og2XHtwv#_B0{51vAdH8XCY8[AtDf	0,	Cm'cϿ_8	":U锚" 0d<ag'ʀHٍH9|bzyDbDCSlp/H FEqDL*@EYwrbD%"11f- 20<|d	ddYd@%	\ 	Ctut 2Pp+~o1beS(2aDR,]~ r&	Ph
DTW
evL.[XH0hb4cDZn2|Ph	.2"aj>ϰ`5eNx,kcTRDKHD
X(d<QD(ՕRVUy1K\1UdìNp-1B%g	D2`,2w"2"(,=sDz NXh"KA$&'"""ObD}H,{/(KN?7`K2HSPi	0p~20Ȁ@HۈPG#R#)aNqrx"2Z.DcZd@XdC$56#2TJ*Jǯy-u\f:0C~"h`2 ,
ܡ&;*U+.WXsHFfmnD$Dw|Dt#2&L{1H0gfA$WdhSȫf~gp
0NDڢU8mg dqn-H&C'iDUeHHJ|DU-tut!2Ԍ1?u",	mDE~?xWoZDUL}; EQŏE6[f"4HJY4"~ev:PŮfpD
ƹ#v8"߅EX'c~'ʁsgNDry{ʪʑd1ERn}^":'c~c{dE%E/B
OhCDE׉hxX?b_9֦DrkNa|DpLp+yglq[H>u#"oCEE2DD^!:Z%Co7Ò$JM|IvRaK~ar"PNkSmͭcN=F!FY[d,|i@yٺ~3"9N1  5p[H>kID<_XϒD59]#$0?\cY9zJM|oCDd<13Qܴl&H)*gIKP&:%I8XD
l"򆪀HY?5;@ks"h)K"`ѹLt*1-^",p.gd<1X؄H.l>hMr|#3(1D
I߅x
`"::8 "u3),qn?MBDTp"'髷 ."69Dr%HfF6:	A",p.'d<18鑝/lC$WM>	k-2TNQf"VD$HY/V #NZB$UcN	cs"RȲx4fNBz"} BH4m	\4v"qa1fMtl9HkSHYWDCmݱ\d'E*2RA$(m~7"rT'㉉HXF""=>\UTRNkbs"${VaHXN"Qٶ~3^C$T!b,2ٙ=58d<NFDڞmiw 		2ZK"\K Dd8#"r\251@5"rԚ4rpO#"Lcr"T~7-~"+ÀQHo!"G-՝b˳/ 2420cǹYe"A^  G"G%OXl "gE-H+1aNLcEx
&Kf|Dx"dDvlFˁfDrMۡ6u+876Yn5.{mHTb(EDzmK{hܵ\Nwg?\c9zmf"DXhXD׺:DrɎ[f<lUB	#"ABD Ez"='F >[%{H`[9YpF`ۚ=`
c9 HظֿH2?<"3mK1ɲ'ۊ`c9	 پٻu'"b#O!SnNp&!f1H2pHfgN`[f8qۛmK#"d<QEzj&07!2Ԟ}Iҩ4s!(23a1HO=*`#@"o^ڴ]jO#Lrj!"=A^+"ү"	HXN,"ondJmͭ<ț3@ܭbutuH,鹃^.D_$G,D% W^6˓=PzwҎqX[ň5H'#o"= @Dݦ'rMw>rd6,ŉ""G/ADd@K7e8 "nܴ֝噍z0ƚjX";M~vDd@țHO$GBd(Ȥ3녌1I0Sl^0',`:"2`}dDӁy7G^qVt&ǅDpȀ@ސE207le/!2ntw"0y9Lqc0Hߵ]Ͷ""*
,FސErEDLCzDˁ];/lLL*M?{6Z.Dd@Y$Y䈒#"}A|Cdp7*m,	 "kSp%rDy#8"2vlh<zCmh$kc80Hk#ŎL3"2(*,F QDd?>@JNt,*L-:AA"od""<|Gd<x=)X=KBpٔmGDG"'p"2h6?;"2ϾCbA2$[6R4#"ji2pòȑjAspO#Nsߣ5I""owT@rX9%@4y"}~_wTÜb΍f;MFȠ Kòȑ,DdPm]=/Dl]t54ôHΏe@DOͶL"2prX9Ƞ;<Hh?
:Z	q9>ZÙ0"2^i!8O8Xu`"2|>@:F/)~N	kbsXN "g#"Cb$0yα@۞[-yW#H,3BHFgw;{2a`>:9Cm<Gy➇ɗ|"jB0"2td!ceXp""C걻+Ȥ3F8%f;ADN{!v:+x"EDԞwg9v{
-	XfF60֖#"Co~rSpXo!N/M|#_d疗	2R:M3HDdȅcb5p!cϲoDLGKW^56>BgQN)kc4c0D$7bS "`.W,rM@twr{9XC$cHnٚ9!bHD$'wRNwg7\~5?"feS#ӉBDr3xHX'yD$gq/q"_}6
21"{zͶ""9E^EDrFwgoyn~|ٕ}m2XcIiKܵ>.?XE^k. "9?<ÞyE_v%wp;Ȇ9%:D."IB9E^9oζ~oqSƸ$r1D$m4rBDr1_XUx-EDr]tu η?E]*a~x<h#m	")Ix""VT!"9i]<yߣH05ow;O"LVAD6}^"BUYEDrR6o/!k.}:
XQDD3]d,"`!*EEDr֖g_`1}A=>$ؗiwBd1̋d8H~뷱5ӄ4A^"V䴮Nۙ)lswrBTb#$"LuF`|>.?ȫ,g?Ύ/"oN!V<jD$ݬKED¬d<Axb0yM-{Haj|2nd3Y
c,D&rnt6&uٽ{݈H^y< "yw{><RL&ADWIGD!X3䅃{pw!!kW.4;7o394buF`0H~ېGS"/䷝AIE7qݥwLB2YOi<މyE="W9"~][^}
M2Rd
AD
Fg3pxCDy}mtw"[sOs|ߧԄ5P`d%<|D$O"wÿkW!aK{s#RhaIxB "es=VD$/`6 s9H^fq/YrDcH=~\~5{}
MSH-m%G;"0 sADMyb*$7uwpmajh8+S01D0m6'ۂ!"y+rǵd-!e\ozqXļ88Hay4!"ym:"sv~V]x{Wq~
p#Sh+Dpm6;ۂ:`xl&߿CmkmjG|?MwuQ6UX"R<|M {H+I	0KM,"voZ/w6;)4":S#)5Dew)	0KFD
[hmjA_:n+/<(4ÝbΉb;"Rx<A)30J<8D tvEx62x=>旴Qhќ([ ".Su["2tD`~kV]E{eWm|ߧDM"Vb&R20O Ym
"RP?2R]vՍ\ϳO锰:6X\,",OfvҔDD
TP. >|ǯ9	H۷c{Gf2aFh'k(1D$xnz	)8#* D V~?Ey<z\&Phb&TVESb"H0=N׍)Kp""ɇ~3]{K]y#w^+mNH-ն~ӻ6x 4D`Ȥ3Hظ+ztuPh,1f- "A`E"RjA@x 5HAs<t۽,?7=x{W}	<2Yn5	m^3H0.dDeY[70Jkm:W\Ͻ7IB4)#e-CD$ݛ"Rj %0)x{7?s_HuuShcy9e.f@%)xsǵӎgIȑSi[?Pc3؆9.<zw4W)NmGDaP	40`D@hmg_!!״ W]u~rB4-gut6s18XDDy݈HL"\i2"(O Wg~>l߸BK}BqL鵰.	K0MFD%YKQTZ@wGw\KnF:Z)D6HuH,"","8	 I\`9"(pK=[w&wv])
ƹIVa1?evND$6Wf]%x0	Ӗ3az <z^~5{2'481BNtoGDj"`  &""u~L:Cдjo\w>%lM!*NNTb97N?0.cH`=]wK/l營i
0TFDDȦl#ϧ!"60K8D$|23BIgxӼB2D7I{7#"V
%xFD$h'_(T%ɕu7QlUED<z&M"`\g<""/{Yt29m9}^xr=~;ly
0ޭ e)FD'vx)5x q	q}p#*)ݝ]]J!
'ED'Rd{YCD#`,3u`w#7|JlC}\u7ߡBTac<l;""1!O$.'x(DD^[eAX|fYS\kK"a[TL""G%'/!"7xKX`<"">_z%S1|Ɲ?ۮN
QظD"n2ݽ!"7F sG&!Ϯ;]MW\Gg{'8-Zp\DDٟmCD0 q	FD0=a>	c*ˮ"!TL""k9Q%@\9PGu|,!nϸ[IqYϢ8F⮮xT.M@X%#"r-%ߡ\{>YnSi
QS,	 "Y<Io׉țKXe""oo|rA;Ž7Slx|b	cMtSDDz^֧""KFDn:w:b(5;Ͽz-xYB1.Y@h۹{>>""=0 K%""=?m563<cp;.⾛z*b,	 "dmtiDDzhb	ш/L*`7WSظBd1L m` "7>3s0 DD}7܃4ٻmh˲dΊ̤Dx,T'x +X7xT=pݥcߎ=*Z
wrwFQ,% ,a*DDR6je tsׯ};PKV!"_Rd{^""PXH/n7\~5T>;6n+4Hw(DrB"3)5DDlDDJ C@Jn-SLgUkx{Wr@3)bUd:m""msR% \%+?mS[m-K?_E664õ0""o>""}00%8PHtup_y\w~~LB2+S932"FDu~ӵ/HO}Tg7=e=~_}R*mkc,t`oY<Mobw~2p	ለz[9~8ik>mA|ߧPM4LOwtj""(J@G	""8ɺʋξPeEd
j,b 6!"sKpGDSiTFV+-)}&R])
p[i:m""Ν"";(EDu"6n͗I?!ՕP<m""Ox]Kp#"2 wy6-m_r!
UظLa[ADd rwj#3-C@G%""dזSF8Ŝږ!"2<|NocCz/""hDDjNMȄh>lfvoGDd@KpFD Յ=Lٙݝla"HA

Q#5<yMृ ²"u{w{ٝٝ$,[gsC2rYb
&H%;QXCD5}`ņ&.MMei "R[2\
h,r[9(H#"R)]
rH#""2$'1k'EDRz\ADkTM)RfFq%ʝTX0DG4X'΍O2ϕ,-m!""#@DD$e<.HNbNH%8^*gNa#HkTMrF^,%!"R%	`DD5	@#"RiXoeV1KH"""8&'15NH5wd~WFD!<DD$2Fz\0ӈH;x+#"RгNHRCDZx=Aa!"A6ɅIL!EDZn2	
HyDChGD$bFy$9jy$Π!"ŉԛ""մuH~)~""5*NxHX'&Fq^b"	bT#t=԰.BCDDB`񰈈T#t=Ը`k$<,""մuH~)~""R<DDdK#8=>""մuH~)~""R;<DDd@Kc1T#t=Hm)bo2Gǆ`n/,ADDjG4xLMqAbDDmce	
Hmym\`SH59`e	
H""!`1L$Ljr+3
HmbEI$ fVw%DDyD f02scICD|6\q%#""G4lADdJ#x{i4	CDJ.@DDh(#"2 ''3%6Hu(3E-8DDd`d\ѱ!DDyեx<DD4$$21ֆHu^-,cSy7<DD4$$21ֆHm
x~""2yHͨ	.i|""䀕(,'("""T9;1	DD'`~y3PteDD"'<DD,!\DI!"RME|/e]܈DD"b+`!1,'$FrnbI<DDyU8DD"DxDC l#"R#bXNMx<,""մ2݈H8yDJԈSc8;>H8kN(,;#""!""e19xXDD'`NyPr>""""R1ôpΊ""R-9J<S\͂f"" hp@7""Ud0LsQb	bTKR6#<! Lڸ(1$""p;yAWqYr*)GDR^ok) y]pDGtT .ON$Hțl"#|`3""6<ĕi4$""A"""!""b16uTZ,|DD-GxDTHMpEjJu%,`ii""r@ۀD@:	mT@x\<Qv""n~6DDD#:""3kCDJ)odVae ""m7ѱ~dyDD*y5DDIg3DDNMh,J(᳨Yz"ac.p{'8+>H%lw{y8^¨ip3*kU'@D❉)$!"J.o:rDxd/2IޔSo+݌H?pD%:r[Ǖiԛ8""-J<TX3U\W|*qL8n0b(>/SԀH?XGDXc+""}(e<LM!"ҟusOaJ;	6n-|ϑOm7`ADDGtEDČ坩)Oe^(:1p's_ac?g6XCFDe؉H9+1)ae)fnqaKO^E"@bW!6Z^BDKt8#4=1cDDY-n"F?"Jr)>/3fQD%:Ѕk$<,""!1	k-g^y>gpZ32u^툈F4Mzy+(9oj?ACs$&x}F5DDg,&fk/;Fħ?v38y	DGtfDDÙq""J,(oB+61/^n-%/|5Vr2DDCKt@'""hj|b1]_IΕZ|s44DfDD  ",fCf(181"6wc:oq;g\~.X4f8>qXk9D@@DxDfDDRx\:@Dy٥]I%SOz*闞WBDJg3i+{\GX[Gc~=QI5_8+f/&d5""i3b "rA:?l#L1~˿߆ŨF>?DVDD`mİ>3Kx$ojcf1j:|+GD  B<e3""71ޙBI "r:]/װ G،>}z:k-XÅfΌ9DG.`""pvr<m""G,;6q/}ڨ5TOvk`]"-؉>Lq7+Jy=	|;7oamԪ!cAD-t%"#Z`307h	.JL&EDpms{y.|fێ㣷^QLC-3p%gs{/{36  B<% 6#";i1uN,;6D>^khlify1ڧXbیȟ
8"-؂PDDG3x$ O΍u>矠fА|'!"'6bt6MA6yX""jg}\@	c't?iE̋1Pxi%@@xDVDD~b$5zGDP;xNk7\~ut6f?mDDt6CXg""sbbl+"""J<Y\#%t͘?ʻ>suEs >vb1DDF"#z!"7sNb<zy5N01˙ﺀkoC?<f=0YKxDHũɤ#"r0|Bq-{a4Q.Rae#Yέ;HX6!"u||$l+""@'+QXɞ@L:q*7w"Lv7k-"i{"#zD "")b]8ay
C4%g^y?8yϼDf1HX$'Qo∈7\qAƇiθ\bGļϲbRz{HZ8"=ILADdz\gKQXIoP$l;$npֻ/$yDIGO_1@@X"&;YD$RLDDʖ{x	T}\AϷ2\2vxD$֥GXi-"ۓh1uO
.#Ə?Ǩoj@[.ŵ)DDG4AD"cxQ^Wdfq;(;0r;~!ڑ7;y%g_DD"e-MGDB31OMȟ2݄MàF{õ\t핤SȾYkW>粧D%|`"z팵-QMܛ_010nDoOT}
ٿ#⺫1 "&<+j	ΌGDrSŕ,)mx"ۯ<~:!Y<ƕ[D%	-Q4$""1E,.mm|65s}/!"pD%ٌV#"54ȉHDD~'-`Cyabe)~x"/;o?	Հ#<k%"JO""=˥R܀&|244!GZQV^B't6CyD*D$yL!"pv3^f|OrbEƤ{9*"#E Fx "0
k(2abwI|>Ǩ"}9OHwg"J(KtՈHh`Z	.c<]XE	F?¨"\+1 "	tQѶ8	zQH49`}La~abackOGz=7lEDBe(Kt9`"
IQ2)D$z,P~1~a=NlOG*eX+~=ؘEDBeft6,GDB&91>
.2~[BoP$L[qqomP{;5q,"*ٌ#,Ѷ,Sch DGcKE,.m%&?/\~$RIy1D$4VaѶpADzF "QF^*|$LpU/~aHuy?g,"
K0KDdN&D^WR+|¤u΍|[72T}wDj""khpD$5}, Llrێ/~]{%ļR;θ<O?𖥳"Dd@a9-11D$|[;?-~7aOquW՟~S#ǋ{\qDd@[BybDd@k`rl("n9JM. ,13|_zv3?hV]Xs8"2İC"N^-nwa8}3.?cRۼ]#"q0O2;OV⺫I֥Og1[pD\:V""pR|4qbH(tq5c&t+W}C$RH%c!+l ,{cpi^;".f7ເ1i-c:	θ<FM8,{`8!>"vcS0k_֊luuK""ʫ@Լf	e)z"a>v7O&p81lpDdpb!"5oZFH8t^/z|q_s¹!4s!Dd@pfHMk0	F "Un.ʻXrF"t{/fP["2 %وHM`SlE|.b$Lp>ͧ{MHx闝KL"0YIq7:]/Ja=>0o˯
/!w܈Լyk,/"RFyak;rsPMش~]~chp:i"3Q"2QZCEfc˔S#sWH& sXVHiFDNRXO#l&tvFLDӱg̘) X5lߙI"2,sGn˻	;?o2t0]Dsc"R楳k,FhSLED">OVp~	=A0:gg_ւi<!HMzyEEGDjDfDDAw3)5C8#"5sY >"RXo8"REV~ntEgpÏF}S"otֻ.)eUuyMFD&ǚaV̓ŕ<_FOP$Nnרoj@OM<a*GMԔ=buy]:qlDp,]ۃܕF. N8n75 /1/yW_L	yECD&""_]yl.w'o*͍	Hx#S2"RU6H""'G
V	QFs?}amwɈHM?b?5( "U71ڳ-],,mwa2/7i>u. U_T]	x##lTHیc^y3wnu_gc9G!"U6#""R5SHm#<YXA+v^oȴӏȡH%9s1 "Ub:qȾ<k	&ڰ9&ǒV|51 r8N<4Z	7ȾJHMzDܓv/h8g|bQ2ɈHՔ7ȾlV!"e0c0HRRί"JD	F>ȑ0pcEDbyI:q,DlѱDz637ťDE.ɧw-ZON!HUJg3eM,V^|DbFlRH8^)oBv=DoSO;2tT;ǜ~"RqE@a7T^WfWw%sNyD1y61/TTx'D"mv"RYݤsYZF#j[@"D}TT70'S:	g8LI""Q&:-`CT2b(D6&2L',GD0>ֆAD*yY5\|4.2D1y61/TAޒEE fbmFD`w糼 GT٘C_4Tt	S2r"R-YdV~52LI""L<[HCԝrtD62-Y-a7.ǃE<_Rpe.U="	矆wϧ^-Y@ʈHh	m"|Vvp\pe8JtTZADA"CD0HI!"}<_LgЋD2ex"4dT;cGDUx/:`"/{m"w:]/1u0lD*ZˉcXE+DϥLѶJ'w泦܁!W,ҏjr45!"t6SB"c&PDDT!"G@Y<_ cfSF3rD_L,r0^>5k!N92;]/B73pU#R-ɺ$~"/zYYL038ۊ 2;泺d}38j:̓'H[	E"q!"}٦bÓs5& ߴӏu"4rjGDl&@"YmFDDNïy3p!Rm-Z;e"ҧLX`""}b׊ "'`{rɖ;qǝu2"fسOFDn%X䠤"09b͈u%)R<r1bhDjRԀLrP,r(Ji):D-CEZ\Oȡr걈Ԋ3lpDOAȡx؅a	XoB֕wCeaqpшHBEZ:
GDX3ٟWdfqceшԒg19bkAȡzpaemFD[=<PXF.@YڏH-3e#GL49T3=@3"rȚmA&O6-aoP@6f"mPjg=aO!"j9,M=&*(,goP@FcK#6f%͍29"ۀWCbCfCDX7cs})nxqZt' "Gt6Ӄ'<"rH0BD[-ܛ[{:DjѸc&K""<2-!iIm
ȓ<_A+"Z:b(CGGDK09d9dlf/09$M&II eƠ{_܌O]v"RbQaf#"@9hm$"QU&`nyFDXC"C@09(#fDj+liK[	pHetEVM:18t6x9(0ӈH8./`QqBHWnDjQۈ4BDɂt69,9eDlF@$JJRl [E-Z2j"r>YH<DD$3qDb+haWwe:gۺ͈Ԣ.9Y䰥Dzxñ>]y,-m#!GvjDjQL@D2`1r,r|Dd	2/7p_n;6,Djc'aAD9l9R3~FD¬x(g)2R;L֝ԢCijmFDh7rD,rDZ`6"&FI"FXW,{eDjQcK""X٧$e∄M']A/Rs3Em-lGE3DdIPg∄Is_~WSv>Rۖ#Rǎ@Dx9b9bl&SMa	dN![DR{C>	ٯ"Y
(#"oC$ϗܛ[@wG/#RkF=/!"t:#f2؊`S@ܝ,HkaP#"OHHHg3[g?b0zDUN~{Ndr?߉_%MڊӜt6KwEDuu6N|fVsBz"2m߸>DjIS I ܉Lh\t~/'k.DjIۈ!țlFENqDuICd Yo^eCy7>H9q,"&uHHIg3=@"z Nϓ:ޠ׳? R+"pw:AEK@yMS,@zI1 sӽZF"@D^xSSlyMI!R۸#7M.;6npAHhliBD^8S&H*xq9y7/~sjJ5:yMpO:AE"`>"BI!Rva~q&OYbDD5ˁ>g>fJ@H%L"fqy+waD]P=6ـH<פLs/`"0Ԋe~S\ʣ\	?ܺwܺjiڊ/,_O#a	#H-\S뗭៿ՍH52lw 9D"*ET1;ssAd0سJ:z8"W~f_X?XHD%a^J<V\N&+!r0̚?~{twv!RImc3HHIg3{{İT栛tn.	9f៾;D*A{؆DPM"Riܝv/"ksgɶ[D*E}S="ܝfo,ߖ/"A1,"Ct~yWBH}6.YH'y_Y_("16H%8`}tnK[	+g"%Y
_ү,R	O+H+jyߋH?=)ʈTCMucHHKg3;&B?uL~9WB?tp??o	ݝ]5c"0	w{DHHp8ܛϒ6|"P.~[Y"}ܝf,R)H_+Ry=ߋHAWƳf(ʈD"f6
R1"^<1\xDci4IDn
7Q&@r{{Y8k6];v1)Ssv:TE*i0DB#wro~J	pԂB@~CHڊH2HXbL'p'RZ/b߃HqαrRs"_S*9\ɺ:D"~`R1M\İDD~[XKew+?ؼ: Ng3T*	DB3 jYYACd (K̼qṋ,~aA r([bHE-޽;xn}@'GRge^,cfa5{"Kļc##r0vœw<H[R,R /"""dׅ%PXGοc͈/K"rgHť@!}.	\G>wfB쏍Ybq;n,R-3D\ޕxRvs~Z~p?Ino/""x 
TE:
pDv
Kx+#f{pO~ɿ|v6وHD= C"t	q,qn!rHe}̙#FZb"!"8*,RM+\i5嗱;!EVo'_Ӄ$RI	HXjL t!"[=<XX˅Hv6\HKg3ej,Rms	1ܟ_Ⱥ.Ko>""!""RU1^;x^jC$$<L^WbV)ˬb+!"ow<^&7D*DSno/=]{	%A"`
"!R.@mK.nD{rw7~ ""'HեnীHH8Uep_~!8"r`.p,5?M^xʥ2""\ <@"1`!""\+2'
Cc6?W?]`Y&X&HHHt8`s}-nw"r
<_+q!>R	؀ԒW@L&/`S.p,~iz`b		bH'HHlHg3	%  WT~%A{[wӿ1OBDdXԌt66"yHx9n/`Aq3>""׃3d8aLg3R3,Rk #yWB©L&gߍTss7s?IXBB9DBA`!RSbHMY{;v@#"ب #xW)#"W3gtwf҉SI֥p 9Dt6)EKr?{hgAzf 2N Au9lNjz}ֺjJۇ-RjU>D$(!1 e{s㽎`$3_ZC#%ekejh"i4u-|]eò5i_4M67xj9Q7JHmQgVn[Ξ0ZCWw}ԫ5ު*R!J
j9Ԫ7!rZGo8pKe)u$AU\.Dkߎ=Hmn>jIQ׀A6UNjO))[%[~5=Hj]F߻ϼ2?4MQi6Hm
|5J
jIʖ?@jSA:M׶eh"}l^Ͽ㯸[7SP{9sR[ ,B-+ZV5+RР6P{9V[YɽTտ}T*Hm\%0jY!rZN=jHf7ͧןi3E RBgs;!<c騵5h*kKkHCYL9.0Z7ֵL(WA`!zڤB_)HH<
7>ԢҔRjyQ׀ "ZS
$|ka6 -A>?/eҕiZ(}%6Sxj+PZANk	7-cYARؽe'yeZD@ZPAj3wAm!Je RjQkL\_~+	4ER\k}dp_	jR xj'+pZC
lhc^B]/#V/^NhjUcHmdj!jRQHm`O;:u[]T_ƆGyh6<LM;2sDx	jnV FjԨu4u1;K*[h"I?^/;WrއƎdRxj+Q7hJ5ɗ{Rv4G?ȊM}w#KQWQ[ɠvT:cz~0rZCUix\^ɳo6qP@m'N)ON6p Eg_:·V$h4[vQs  %qjW[Cj14RR
|{v7"IG$MYJ>[I)8G8g?R؈RRT$m ~	s~4qԹ+	uHx)Y2~ʣcs3}s=8vR= t2u41v5ݱGYVAJ$zΏxl[QZܗmmmJEF5sZT\s23ih4IY-U6HD۷s/ϬOԳ h|l^pZZCQAn@jQiJZGg$rku֑2o]v%=8Zܕ^B
"ln̳Б䇕Hl4ٸ|--	g#{IVn@jQˣ$A`,PFjQ{#4hǖ1L$M|᝗s1z=3Z=[w#)`BH>MB.9 mյ<\F**e]=9%c(q7r R(텨#Jf>+ oBj1=A0J)z&Ia-dֳgConnUkH-fxwěQGȠN
RjiVѡdQm37`cIjei3eckw^7z́=EjA<:F:FTL\x304hrF,N`Zf~u˪۩DEef=1㨙ӝZ% iCjA;C詥llcI$zƂnw}KW}؊:J:JT$m ~	8.y6j4x+nV<rBM{BFFwُBFI<:Jua@6ˌ-XTD5#Ib߾q3{?I{w.(S(gs;3Cj53゙?4IY˼jv6Hl4ٺvqYr)'ͫ6ruZȏ/DI\G'DP*6JmH- %ev,NLk0VNW{G^BMϴݽ7ƬZExHoZ)
TPMHR:0Hw.v͚&
Z7ccJ4ͭ
8ҍna~eäHRi6l߰Ucai!]}!xoCceP>4Z``L7KkY]e$iʦE3kQ۔`νH-S.B
"l...DbMRqt!UװM$IZzJoLsϢ[<|"̿|,Jh!xRV of"MAy=	tu:5$dmfl})A@wٲ&Abc"l!
ln?i5a:=tʂW7SNkHЁA-xZFfitCcp (SB
"l1׀P$̤f[kXGIҡV]-kz=Ny~z4]QAd#MFdkD'6W>H$p5s_I)r=c#cHS	|؍FFT$mrP='!SeV*iIґ980cV{L1N)?l[i
>%quuBgsoA"usGiw)9j6$E4>jk$)lygs܉'s %NU2m>4FUv6hwU,m汕i"IoFe.GѠڼv!M/+Q	Q)䳹/g"M0p^l`Z&6j4$Ma!ce̟3hGG
QWQɠnUC"9Vi7))=4I$M7zgټj#^jr)RF])D]P*R(w峹_Bմ='0+s4Jŵ-]fIKӔ=[w장	;Lܴ(?GIRuu|6&`$K限ÓhneYmuHݻeQ3hu]7݉46S(GP
QW+|6x+Ѓ4jia:!Iʺ^n-aGcIRhtYř8a,ZUl2ױu&I %B
|6wb @Di	M+*uoJ$5۱Z'gN&jr#HFӅR1E]-Dz\>[' M	9;<V9¼jVv E#c<`	KC>sdu<f4 oxuqRq,m~&Q5mp^l=){WY͞0l4ٸ|kb'
4_Or=$EI|B / IRM<8NT+umjB9!IjOwcifϩgN&J{/;åHh>R?J4-4IR ༞L̓R]^RR$I2VѻQ7y/yg`,w)wGIi$ދBS(泹%@$P眞Lc5hRb^e5H:G$+׳jcv^/'>g6lr?|-kIR>%mH?&D)ln-p @94V+$I,~uܳ8^0dڴی!MP*6~LS
boN@$5\s2&Z
lJb}?)NWTyl/3LEa-@4v%^"=Bx0  MrZ,3Hu,oje$I#Ma󪍬o)g</Ǭ9'V/^ޭ&A<JHO Dzln-p @`LB
OdU:W6Ӡ$;{yQ~~/aOac7GVG`)##RB'Q(|6w?p	p$Kk3A)6K̭`K} I[-;9r1G3Ro`C+&Q@z!S(ln+&`:N
̱og~y*$4k7އ9ә} `<ߵ~ZF&X( =iJŵlnr @`\s2PZnI$IOdpŷǌfrg3#{"MtTLBtC@	VNk֓`&T9Jv4$4juݻ6{iu4Te̷>u؋4xiHP*峹UHAJ3H97M`Qm3wT1֐$pl߰G^©I!zi !C"B%M^d&HYN`:c c^e5k;h"I3qp`EC>lzp&fMH	|5J⫐QtYHF限3Y&)=Ht+|k.x9YGs(6.[Ji=P*VQt
b=-4ÌRՄT:$6N=tfl ɤi_^4 otBT(糹	RMLtkj{H$ibx}4zLٙl/+1	R>%H)Dz\^Hd0-s^f=&)Q$IhFUXy/sq?^A )pRtBgP*lbd	RMLKjJZGɴ{Nh'2S:L&u&ߠ2ZF ߉ 3"=CRq4-D az'懕Ujh"IT(Y2~vo9/G;sk^4AFFI
@TܖuF{*l$lYྛ^!M&Q#P>[
<im0%E26<ʺGVQ֐&
bdPUρH$IOہ?xHP*泹u3$ItƀEI|8 ۀ/u$I$8	IT$=<8I$I}$ iJz>[8	I$Ik+[Q@G	PB$IX4BqV(gs	P^d$ItWGI"iJERlH$Iz:?4B	R(ln*$I$=5FIid&P;;$IDKH(4 "I$U(&R4
"ln%p@$Ilu	"MB泹E$It/Q!MiJJ>[$IԽ6%&IADQ{$IS	0P@D `I$T $FL!$+䳹E@I$g$!Mi
Jf>[\$I >%HT䳹+Ӑ$I:Wxg[Hi
EI0I$3X42HSo) $IRg.DI"MiJEF`I$Ձ+$n MJf>[\H$I+xe"BXgss$I]$@j!R)|6xp:$IRY3JH-$Dj1Rq0-~8I$}l%H-&ԚV F$IjCH-(DjAR|6	$IԺƀ ԂBU(|6
 I$:wԢBV(lQXe@I$u7ˣ$Cja!R+|68x> I$[EI\Bjq!R(|6 B $I4%6"B8 ^	<I$iߋx=R ($I`R ^`+$I| x0JHmP*>$IwC`n)R	PT$m #I$M
a;Q7PԦ
bV I$
Y+QאT
bV M$IS>%qHmP*6BX@I$ȥׁBP(l`b $I̥FI<BQ(klnp&| @$Izfn%R:HT峹9@$Itx~7JH$D0Rn. G$I:tox7R	:PT,糹{g I$=@;:Pԡ
|6w;r$I'
(7!uJŃln>
t$I
xsk:X
p>*l$Io5QCp!R(l.8	I$	 DIH]P*gsNB$Il-QG!R)|bD$Iԍ%."uBx 
8I$u$ވeB.T(-YH$l .ԅB.U(<,$I6 GI\DR!R+lnzD$Iԉ6 GIH]P*䳹<I$uQoDr!(ln.*H$l .x#J|67x\$I.x#IP*泹K3 I$%$ކ"'J|6w" @$Ib	kQEO3
b-8$IR+K[7GII?#D*|6/$IԊR`("	HzRR1gs$Ij%M_DI<'")Jf> d$IR+h  %qIO)D*䳹{!W$I4jˢ$n iH:$R|6*0I$M2Q7tHB$BH>[, D$Ii QH:d!KT$ͭ.C$Ia7.QH:,![T$mbUl$I46%q 	|E$I4IL#7@$IC
	;JH:"!XTgs2H$H4x7XqQ(+l.=H$陨 _>%EqS(ln!e`&$I:#ǀEI\FҸ	4
b3-$I>Qב4B$B泹}EH$马%qI.@҄;Gb @$I?(S$M I$
$I5FII*D҄+l.ƀW ӑ$IneGII.DҤ(|6( <I4 %(G4)B$MBgs`1r`$Iݥ$!iH}W$I|EI"iRH2}sOf IԙueQDҔ4e
H> .f"IYx?L)U(la`%r`$Ia+A(ǐ4B$MBgs@$IRZ$n iHj)}>$IR{x+ZFR( r($IyQERK	r
b=-^F$m> \%ZNT(|6W N2H$X 7J&ZRw1H$2p( HjyR/N@$ijm.% Z^P(lnppp I4n >8IQ|"JHj+!NTgsw#I4v>% NT(ln9p'pH$X%qIm)@R$ITĻB$BXgswY$I6O+$DR
b g$IOxpG$u Ih,$Ip5("H8R/H$={k$ Hh}	$IO x;:VV(G|`R $I)(KHh!:^TLj`.p:B$IRj o  >$I6/GI\ARu{x
 I:]X| X%1K7 1 $ITU$FRW
{^| D$u&("HzRqw>aQHv7|@E$u I1}/~$I<i"I?P*gs08I./$ Iz} x50IԪDI0$)M~4p2 IZ^oDI<$= I:}gW @$Mp+(W#IO#@Qo_9\ @$M|N$Ha;$Id|<JHag"J$i4ǀv$#7x/	`6$i \%H8;x0Itj-G$^$ IG}x IW
.~%qI4{|$I:T+ 4$i|x+0Idx4$iWI.nI(4{xtwO!IF$F&R$M>7c$vFI"I @&Yo_ \|
An><%qID4E{z_><$uGGI\E@$M>w4V#yH9W EI$M Ij}0xp)0I>U(S$iHRӀ$Icp%1J&"$y$uՁ W ˣ$#I-&@ZXo4Eǁ=H:gEQW ImoJ/$IZ WwEI<$ Ij}<$Io)pHR;6	R$Ixˁn$FI$>w<FReH4VW?Jb$HRq' o .^$IGnp5=`_)$C7 /C÷
/JI a{x	/Cp`_)A$C ^d$'=\$F:Q$u>w,jWӐ$u&puv` Jb$HRqG/.^$Ԁ5(n I]oB7Y$Il'`ae$HRwo$n
$u I}pہ IR;Jwo(HR$޾^LCj#s$ށ$HPo߱E}	HZ /J IzJ}Ӂ ~$IS)?X%qIғ
$޾ 8x#v%t$I<|>DI"IzZw<pnl$I p/}Q@tX$IXo_p[%@ 6 ? n VDI\EHEol f!Iz&%7QoCt$I㪿o|-siHJ(?"`Ye$I&@4a{N~xp0$B=QoC4!$Iop&7TsQW$M IҤ;x?!ٚ6`p=0JH&M$iJk~%l @:~`w $n"It)M $a`V`y5$IS*@R{^\\$
,xIR$޾し8$,x? Ij} D&W%.$I-/@v{N^\8$Mx %q$mHZo߉E%S#Sw $N$ IR{p:b8$ۀ@,  IH}3^8dF`>p'4J$I'@{W 'ӑmj~Qf`uu$I-@U{xl"uk:x%1 Ij}Ӂ<J,0I
 +(HV$I?$9XIX%n$IO$=޾s884UxX$IO @iv> +֢0њb7sg *)ȇVH6Pc (uhRVYS]vWVu:Yz:;6o` d4^^NTToWՎuYmTޫXu:
  <$xZ~]muUTClV7ՙt> <C MF[Չ{r٪nUWgթt> <"C -+ձHN5ώEY}Q]NV?Wg٭ [2 d4~uUDVP'ߢڬnW՟3_٧c4 Oh:Z^ިV߭vTsSݬWՅ|I d4^WǪcxV-URlU[՝j:[V )0 Ohyu:^VUGj!jڪ.V立չ\ua:+ x3j2T#ϪjzzZjZTjT.Uߦf d4YWաPu]C<uZ֫Kz|y  d4~:XV?TՏ8ܮ>T?j^]g c &qZVWVKjZYmT׫OյjZmT/,  d4+CۆծjzZ^VjGU~P-U?vd۬UwOϪ[G՗յjQmTU׫W-ڶg  XMF2mhP5TCնՁ\NRnۗFնEբm-Y                                                                                                                                                                                                                                    O O+    IENDB`ic11  \PNG

   IHDR           szz  IDATxohu ?KW۩8/"PK(豶*W6hg^E餇HTOA/
7I|*o'Nݳ{nsχ@)@fYIDDF`P-t@fqJ 1UV@+(	hKET0c B	84sc4C pwhy8*+M@3651_ơY&<بR!#Ts$fkvKdae]UCG
Tb]_ϣϨ!VS")HCh#+"IP	b#Seh1k9{l|`3NkKZ"yhTe%J`Fá?ч]
F΃`K`؍Xi\3Z+%'92b1|8Y)ɥ)`yI`|wiAk>VM,bwh
2K&yR)ؗt؅v#V62`%)"DK^D("3JKA(Tt7X̡
DiO6P&)t7RD0e"|ǃ)m^x,GaI^$$&rD7f.˷q5*V㺇v䇟Q@H0I0I3t8MwjIAZf:=v=$S!* Ngd'0Un^QÒh5t'8K2,'zW&n }ѡTi!25ǩL\?piif	fcoe2Mv1h%)ZwxahFA& MDGͪe\af1l<8xn]U]py|Цzw/m8m>\Hah 9/ -)BD,@=bt 4CSPeDSfYoFN<    IENDB`ic12  ۉPNG

   IHDR   @   @   iq  IDATx}pyҤ)h)/if
(Lec=/:;_Oxn'wNMiQ/8ŗ"Vj=iH<;n.iPo|>u7i)j>P
\@ AhnD04E\f  1>O#CDeeDfz`9N	DS@CxXyd C]
ӣ-A4E= ,r<I&MT9%.pm4R) 1<,w<)I2gΪڀ$4E:`1Tp]by3-$4E]<lP~E2IhZl$pHDgs;Ci<
f$q9o$ $!k _1*s&܋(G'|$@cmk0.#	(cɱpcKyx$["rOmHc|L	Eu$&LRNK~v)+\H&,ɛRLs|LzRSBbpc0qnK-~T	Z'1~1#XDځ0ɒC<Efog+O1p4fV~ir$H>MQC">(Ƥ LiILv$o:B	O-&m)<<E~Hf[44F+t}hqH	)/fb]6/fUA 0E!E5EKS]HءFڛZI6&"$rfu!:^R$CTsHî;If78v$WXhFHiCSM'.a0w׽kϼID.?bAj&'M3!EST;PA{Nb|ͪ+ybU2^M:FZiӏ&yD0P9 WW̴+c8~>^x`%mdۜTLD:;N4	(?#MK[/ʊoaB%Lϙ };B Gm8!Nam
B&Ey(YPHɂ#_B ۜ)#S#ml;@͝E27篡zt@A\d)!ac[edIQ$$C9e,hՏw5a?,sヷ{kɂXK#${~$L?EcG\⤛/?ph$@^@'MW*H	lʫg5LtM :%DH8y4BѪ1X1;yh$kf34}yz"q]aZN)	ػv.yw`\`.iES E
y8aSWPtN*)+e7̌kt|@SmtRpMX0Yf}f;o"B$SXRIHl#D$r>f}>{U.($E}?1$[O
dBF:|3=Fgs;CD|m$#H`5icټD#줠x8dx#.i$xGOcV('DΘ$IĪ3äg>!1@&t}
a?BG'Ua7+<DXmf2xC.Gat*s&I"SM|RDJ'?ķm ${	$>Z>=q-/2Ȗ@7zO!Αz&XK2	XXI dD2&`h 5UŻ I}V)Mf_nq<IBƄڀ+ifY	=
l`,$j^\g0		$ڀp9ov`s=nG'4iz3ul"hzXyH CR`P<yɀ K4E- 
>O,d#b2@XyE!)x`.p%0P Abv;>Q4u$JB|y9묳N _[_    IENDB`ic13  %PNG

   IHDR         \rf  %cIDATx330TUB$5b59ͩI.wbŒ^ob:v FD	مYvOqe|H$I$I$I$I$I$I$I$I$I$I$I$I$Idq1BZ@/tx p7Y R@8 }`7Ȅ3$[	iA z
a O-@lz>e& c@@`-&V ˁeư1,I YFHViT8;X, H
R	iANf S8[+zDBZL2^#H%҂*0*p6Pt8a=C*)T!-ACˁH1$(.GO UHzskTxxx.GڐF EH B*F!`)o!-A*r /?R~R 7'#[a=b"@:b!-AӁ;୰1@B!-Aw'!Y-A|s8Hv`/7FJ VHvnT#QQXđ>C "p($'<#ҧҧBZp8;HN6GH%i*FfROz$ET<B$R*B!PT2]a=	*PH<
LA=ರDT{+'zJR!BZ"I|yx,KP !- 
$08-ϋcp8i$|x,	*9:W@~8PH_?T$)?*p+FaBZxI*	?+q	i\D$3>x !- BJ03ώcq@BZp(6p4TZ݁>h<S	"IQ\߈c1i@o$j>h<R	z!I_c!
i<($c |9xQ C_cqlDFBZ'&0I:ഀl4;MDHc$kLOG46b!-NF/pl6XŅ 
I!@Z4;H\\ũXXH <$	|wEXTH"@$ɞTഀl4cA*҂l`doX4b1*҂K|$=>h<(XϹ*O5=(X7b!!- j!?s\6d=.pRȪv,F cq,B"BZP^c1#/?j(cOĺVҲo?utWj;Atl57Xcb{`A?1Ȗu17]9ޑ	WX݅ 2xlb!-8xpa1BQUf)ۛ5YN6E**rg8S4T7euvi3MsN:JiA0:'r83>x<뗬)T>΄<iP}@jٖkƂT`R(@*,{}O]9 k7! Ƹ2VTy<v,( ЁT:PHګ|BQ<.q'O~`_Ve9t<řc8$XAaQ|XD aQfLSđ0LSqYHGSr=vX8&?
,lQW֏;53.;!RaU;K{P}X܉t҂+@,R]*cOVL*~5 cP-Tebq>X2S? cavz
qi'p+1h0f~;*<xLP) <0C~KgN8dRVG|
4N#\J l&h<2R)㱸&0I:a<ڈAZt2YD5xGrXvi`q.W>Q.
5
86;w7PWLAQl]/6SF*e҂`6pEopVӹdٸ|-T4	~fTJBb}v76 x4g2p6ٝRQ]*}ǻޕJUx;IIFNNL 9v@`uݻPjٿcĤQT\@_V+BZrP(HM]'ʡ[ؽKQTSQ8z0x+ܔ76s"02P( M!x=\˹{SuU\R3	%6"BZRS((P8~̺c4	+u `3(1w@E:"]{p%K\B!X=<<t?(1
iH
\1>SĮ)5\Xw_ĆB!-ؗR(/6estGrϬ1fq1\Oo3$gP5p%P"!-XA].|;ƫq]X[WGP-\XA401CZQ(3TVB(
_n{gtUPj;Q>XI,6V̤DJl)7^/Ռtsyxz*殦DJ  Al,	+ڳ<OT	3<pzpܨXQ榇єBi\
{*OH=N\OuVLbs*p%Pd!-(Kݟ:uu>B:(w.Owk68%!-Pd
7зauCǍ`_<#8z.`ن&Rd
6mǘ՝~9Ko3Wx3;i4!LBZP  wҥRǥqbpBZPk,p4`&5buBiT<ٞ !P]F&&@)Ldӊu؁RqEzaWs8Bq_;hJ1	`BU.bg[s8WBZbqQ$!-l^Z/Ve&|b
7y3Xe1f40ÁEP<3 I'Ӭ_+ۼj#-{)~j`N5L08"Q(8^kJ 8c"kġBLǁ0mY<
Q#8{,_ p
ؔmġ҂.@8@Oq.6ވ=ɤ䫿ڕ+k&peHP>`EP'`6V^B>U:jh}v7wEPSqwg'bV|Ԋ*.KUG p"ٝ8T@@!-Aq+ءogF:TWLd'(#MiA
Pz?79t6~|hn
U!hjEN"
P@
 nՂзQb7rW{hNwS4	6g)BPേ_#,3;/.=h՝j&0@JXيIG
7
17hnS.T?qݤڒ)j?xFTQ)fTQHp#DWzrؾ~xwxї1M#Ux;IJ,	i3GI
҂5FyWhnG)>ghA\@?&afXJ҂u@0C 
<mwO{?#y RQ^=s=n*{-,F (BaR=9V)Cny=_G{tQ<\\3*SL<
5(f(]PiC/paɕމQdo6ŠB .
Qe1kS,k10zcT6==T)1y4Z/]n){w6>Y G)tr@k *y
iAAjk9@1'rrQ״=zsX*^$L,D3>op?½,&2c"{^6,.pb`Ƹ"'8K[ 
t9>ذ4J{tSj;1H2IDt%O
WM;4Mt2[~}imn=q
z+anj=FSɓ@Ԓ7«_?dG׿t-TN(WC-le}v7!'t'G8f(|U)ڣRLz*5[MHэ<_CY~yFf;i(fTōtfa }FW"uHwnHW=g,%VqL#Vg"5H2RY9^JaъOՒ'"d`ܨHe`2;r{><_5R^TNeLֳ>U'SڭJ^}C]=dnj=3;Hyr?RtUI_0x5]HB*|h	/er2l#Ry_Pkg
i^Hb{n?RȟT3=tx{V^H&n$&O.B\p $ב6HyK'kCuLc,NoD*P<_auWj83*B3Z>C*I!>VTqw5Yk;S|G{SHB\.KE:T6=<\z5̸L+n"!"NxGC:nۖ=n/~`\rH<Ou#:
P+2x+	81tWZӮ:Kw>D\o7_vAH6Mm`]vQ[׉ߘ|4G5;Uiܾv'T*rVTiHb)벻h!csϬ|4>O.gE(
I Ng۩pӫSjgD2m)EQ!n{_ϑ1y4\v; <))G8*@W7F ArrF)_n\rh~*zM$GȗBaPB~I,aCv71z}?#%/WM*
01*
/e>ϩ08R*7_JEPӏc|p2K#P:pQMT e{ ,afZ㨆>|75borR2hpQTiU~\(TF3$4IcڏEMZ騆>/
>h#pQ(Tz!^T"X9˕]Ǘ?%qu3sIQaS DLQ!Nǧx4I3Te{8vXLC:d Ƚ@pjڍJ#%lH	!qYߟr8sz )BVR!&43[ym9q#Ts/&UUK].LT*

PTAT"d18Ruݺ'~ԳO#z٨J)n)`pc}QTF$>ڳ?sNG=_@XB
؊HW=Ng2[ymѹ[n}'@G;3 ;-H@a=ApAj%/%W3/ᮮ{AX_OzpzB);8X]m7y8=ۯcȸXR8;Bq,@Շy$<Bc5Ϝ-cЈr@Eif瓫x;pWWqh#{@=> Gr8 NI.ΟK؜m_:$z	E0I8R
aTTNab(O'>HR>z"qQ<o jg'8`ZK1tX#VJpx"Q(A>`Kn-AXn@QaШa8z`3EP\pj䝴3)sv0tB #BqCG)V3E8uL-ٖüH(G@lRE^$rLS*[?܂i!2-0!i ۀ)""
xtnL7lb%4Բbu]zӇC#9H	/vLTb9亮`bR="V'8SB-6`s]/v)mKؚku~8f`1EPda=basu0y+H4Mgmz"S(ǁ,6VTaef'XӸm?6mXU\xP(PUm%
>`w]~#XQ^ݱ&J@tƪd16rr5I3lZ[6Wmj=#BbSnTde,lĚlL*j:ac;(	4 6 B`kx4.vZ6c/Bla=DJA 93+%efeoǍg]%khB.JTJ(|~?0&U5Q<XI,ׄ]%Z7QU!cG AG0Y<C.fG(!``#&iQVgwXb){V.O~+=i،	S(l&CrKcNj&ב6s8K+ױar9lJLzLl$if)F+-eMfNoww_q#Q\rɤ39;G(5XF4"Ki2tF>]Ⱦ]MÁx63XH(AXpMiJ-efy%A%y-+/mf2P(w~3I)4Zx$u]TMq-<?(}6eP&a=A 6HP*2[ym4L^}]]l݅Ma=B(S@qbK^Hf^j#9ذ,ʍg^y(m&ާT( XX ö\3$W=4fϧ #&BQUaփҸm}JEx08՛QE!LLg>fNr-I3>`.ccԥ30r9A4y2S [mF38`y.HGn|
kZ-XN.:JcϿ8.z-}<X.)?Tů-dSǠTkٛXY]#:<,lKv&&a`0
ZRaLgqa{l+vJ,n>DD1>bjwH)^H"݉TL={YB=0h3xHH`Q)ରCQ@x)IXWvl5\b%MFRid/4)cp]|ؚ籰st 3`9>&[y!63Tb&\n=lgkUt0ǌϿb1I3Kڍ.+n&x.=H嵿)#z8bW.+-mXP8+G>X@4$,('z*FcY[Į-9u,*7Kl,?z),@:~
mL?2䘛Z+5,R[қ2|v3/bQwc*ǌg
 Nxy&X	ZZgjj1/ƂH#!xXL$kVJ,GBXLRG	,FbM/dˁz$(XPX$H5HRh<*d?Y༰YEXX4>^t$~n'0H< Sh<F c!H.bxHu-6bx,_#IֳH6b#x@!Iֱ8)G>FTl&>\Ixa=Qh<#@qSzd%6bSxlW\ xؔEu<I*&`FX,Tl.
s:$v 'JlN؞"pI*pRXT">3tT|+zd x@
F'#8Dt	G
ҰiaT(U`p"I~ #9Hp!-8x$a=pxlsP$})a=S xl_txN*Jc?T#I
|QX
҂ǁH,.T
|Ge{zdHPBZp"0#QT*\4o&*eGT8	LAr둕H%҂
pp	[?)tX!-nHv n둽H!>WHfL`6pcXE
iALCw[a=iAہ㑬}`nXHGD [H
df` :n1E -9h]`&B*,0nXHyHE҂GWݑJa0لT0TT!-X\\LR!L}A #HE#J"9( \\CjSA*>Tr!-_f=	xxsXdJJ UHV' ggT9I!@0!-()xgK `.:G!,#q	T`"{,6$KH҂*0 F# +`}Xd,I JH
04` Ni5 [ l zD!-A(7t:8THIh> a=$I$I$I$I$I$I$I$I$I$I$I$I$I$ITfD    IENDB`ic14  QPNG

   IHDR         x  QhIDATx	Uus٘˾a@"qѫjOjVjeiZYZSnYfn>V(2& e{^z2a=w}>AD^7@zHZV?҈7/zA@/j^@5PT1 Fh;N`;l6Mzu`҈&za`8.0C(ũxXVX؎ "9t=cʋ2`9Xkhi1HI^ L&,X,KZw#"= "ݒt Ӂz`ғ|xxxxx2tJӁY,`
P$>X<<<ҸyGySI
 H!kǁҸ?I׫fs@)fr11੆ƭ2t=H p<p0P#-DʐA$]
F6R2jW-)t80 xxq3"% RӁ@/D:o';ᆖ͈HH^088Ed -;)"tp08HlnnhilGHDLgnXB$|gF"b)I׫ D	^8c]HK׀ۀ->" R.6Q-HI^-p``)nK 54nC@D
@#Rz6 mhilF$`$] KӁJDJ_+p'p𧆖F D,z0$p R~2#W'ZA$Og"O  54fH%]."F>p`CKc2H,pJP "khi t=\D|q->"= C>	ɀ, 9`qCKH0짤0s@iiv
`eCK#" W|FDrm7--)D I׳PD$W ?ihiL#E.Hn f "Ap)xCK#"e餤"R(@𩆖5tA$]/|ED
j-툼HL4DX\"o &8H ?>Ҹ70pDح>444A7& Rnhi\>){I3H|GʚAZN"R|E-ket=Y DDf#Z}$]r74nFʊAFp࿁ш*<цF<HYH^<""TT&u۔jN#% %/z.pp8""oi-ˑft=
|臈Hl.~#%FJR*/_p
0 {)܁)9Is3DTVd$]  754HIt=}S	؉xMRl%]	 "l`R"^XSyRl%]o,k( "['Ret=ɯ-->Rtl$].nz!"`O"^T)*I_ B<``"^hS9)I׫n""3@=0={)ռ)
6R7x8386{)՜B
M~L@Dp $uO4! -zG "RIF0 %]}  6<-H᱑t= c HqxݳMfHAI|`#"R,h )Ռ)I3u倅H3O"^T)I׳ ""e0,{)՜Eg#K^p>"" `l"^w_S9FtS`!""o"01)՜Fc#I^)p""c<05)՜Fa#H^H""R~ %u4HH%]/
$)_c{Ri$l$nDDD cR$ol$o FDDa0&uS9䅍E,[7J 񺇚RY$l$璮gkK @D7Mf)ɩy;&{)Ռ䎍LzFDDމRxRHnXH.nlDD,:`aܰH-@Ch$'l%]/< 
'$u5#=FzTIkJ5c#=&z5ɈHO$ulJ5Ez녁[6H$uw7~t=\@m"^HSG엤k ɥz`k"^\S>_G lDD$,:8dH%]o 8:)ռ閤Uc|O~єjnEF,z6#8DD$(щxM,%6%IcK	={)ՌttADD
c.NK6 psF"f#t0p'0)4UDgM4l%]}ADD
p:{)Ռ=cO!""b`>,m%]oAޑ1##"=
#fOHm[J4 SN|"!D6ED6EFqJ4]HTS53ț} )N8Gn,}?cfO^bWj'"5qbbر@);MțJA:eQ39S>qةsټu,_t G'bC	!=HJoJ5FU!b}W}~C0ӏMm,b2iDͅXG26oTi47 fs[Rͭȿ7e`i#ƏbI˲s"W4\ϐakU481Pv5%ut〯i/~f|-zɡADvK&'uMM旑F~F:($Q?w}?H#R"8	8XtF84YpX"^w{SylKtɌce|2Nʹ%lߜB9=:vC煌.F&uw6ty5Aݟ:A#Ur)sٱu;+@SCHacӔހtx`YSy	t@/K	9t11LG{"*fBpl,ʊД@F s[Rͻ)sW_"]6ȃ"cr_4R4Ţz_H`S撮.z ]99Pӻ'ŞhY*#R,39>:J8X,Io@%)ռ2fSƒWE:^âϾP8DOqBSizf1m*+	LГ*0/ve)N)SIc+Sn9i9ͣcvH=旖ufDH7E'3Ȫ!l,;ٜݍtK/"{)L9(_	cHxx=4n*|lFX̎,NDɥQvod\SlPlh[,bg.:^C.َÁs6e鳋iۊHM0!ע&;#d&u778~C@e1o2nzBTX=#8Rm"Z1dO)3IT#6]39ȧ^̚w$tW/f	c,DC81׳rp"^wKSy7eĦ$]}"'1jL:t*#'߿H%n856	  %ͫ~ xMfʅEy|o%Hӎ:C oϢX=C^iUs2t=8 /U՜~9!TQ]ɬWl6H͑1#dl26/v,_,`\"^w[S9K('LBC~|򿯢>R_wǦ2-4[H882aS!mڻf2#3#Y*^_dDQh6dw!S7)q6e X9)(4
fxNaMdYDWǡQ(D;6Vd ="IlJ5S,J\Az̐a*۱{̭_vbLva(\
G}H)aIc/ G#=X3>z.Օ~C0{ޑ{uWHWM	a^4AP,/tEzL%u6)Um$pc*k?\v>NA3"D%M1Q =}8JEJ|DzLm8X']p:u:3Юz&8(&!l*LQQI3(5X>a0m"_;L?z"ofZxcm*(6H;F)AI3HJ2iGͤ9p54=g,"Qb^,0,jM&ٝHxMfcQ"=WZ1c9+yBVLgݗbWeE8E	(1I3jt ]9pTz(D˓gQb,Jtx$'zTTTWo~⇈ĢHy0a&sDx4RQiHx,JE	I>8HNTTRJ1$Ns*eČ\t=bQZ ' 9SYSE)9:cRZ,"#IFPc	!9)!%"zpUUR*+kk/%ZCJC؁TE!9eHDX	)HNŪb2cGq,_?
)nӛc{Sl:F(H8!˶)Ǎ⊆9c1 bNdRe"X$IףXHN`\Ī*Ku
)5VcrHh$raɹq pPH3a|+whvrvvXE$0/he!1GDFsjt&H;z(r\/"9+.?EUm5RjAA$zQ,XcUw}1G5Ϣ4ZɳWE(n'ɳAP.W8Smɯ9*2yщT0Y'Cɛai1"t=\M=M&A&r>Gn,5}z!۪Aԇaa"yvalEF}?cq|o2>Ƈ06Vd,W!)~Aj8b0ZN:tlFzVxѱ@̄!|"eQXݞ7Fxe}~qg*9+6!H#t!t&PfaQpbIH`bh bhU#oO#R,L࿐@޾yg3^=˲	c8!2qww yo3"i9HEsU,M@g0鬽~1s`!رey_p4jzBޚ&06~V5v$0xEƢ$]0	Lj6Ϙ?
}
8.206uHK`Eqđl~u{e7}ʚ*,M#Do߆
8"bQ$> JmF6Eg|[mʝTZ"[t="aQ<3@غ]{;pN=lY81᱄&n	@E8!ڻkBϼ>r4Ю朊w =O@gHX9@	lX?mq5`ʅ4&~+?ӓX _qyq896p-)ÁC)!	XHAX߼\x&HR69kCrc)8"`Q#cͲHϨSˬyGR;ZCrgsf7RPNN^΢ ch@zƜJJ	3?6wGcc!9)(#(po`ڴ훷!=c촉TTS*ٵ]Qh/{{4;VN(`I'#%ɲ/-Hϰ1SS,GM"M"焤UP,
L`Rp_ZaJf~l2s£ِى
Ea;0HY2ԗb5}[݁$B(PI׳j
:ڑQl,#.1Q$@
	IQ,
$E
ҶM[ٸfC|bRmEX;CC.6~;HS,
׉$?&g޾b:}Xǵ{#ZN)Xp"ʢp.FzƦu)t6EFqZt&oM&g(@(zHA[R2i쐃쟵WRj(G3#gu&	4S`,
Q@)hmd}Zd;ҼxjӗEzFqpl[ٖ݃0dQE
^6eFϲػk1GD85:*F
L,>R Y9QHQ@3֊qFl
F`aӜق9I׋P`,
d` R^޾{y)$c~,3̪E
S;֤SHш)0(B ݍ޾BwEpJ4A	!k}f{vh`.ƢEFx n8+6aXٌ(0$zQ`&RT?<H<r}l~m#AϢX=eȲ"):IE(,Ӂjl۸\t޶׷p0/2	!a}v'۳{X ~HY{v&(}
ΊTg(eH:bQXG~4m{[w;G"zY5HqɐfhN(I#E)i+K3V-W} IDp6ٽHњtJ
E E{EέWѺ{/Ǫdal9C0HjJo@ZF(3ſ;7.-OȢiy%)j8aQ8f!Em<ȿd2izv166FsbdD߁t=9)z7dYo,^}ȧ~vcӘB,XIףXAZW2lۯzbɡ,MUٝ@JB?`QR,A]6/~|1G'p\dalt,N# XCOmVU#?5e]$HiwrHI XiHhoxr{.;<q4z
,IoO#%`Q %џ=@۞VɆqE,~y!jEK)=c-RrJE,tA lݰ[ş~;#Y|hװqNt-lb[v/Rrj 9o2`fRHs7oA&!iBJsd
dUᑧ(UnꅟL:CLc	
BJ[Kf+gv"%@IHiW?e[?$?ܷرu;0		ԚR|UH	D@JV˒Wyg~lJA6~_d5azxG`!aef+eRHID,t=,?#P־+~E6%*LIx}%>RF%]/F5
"%U~Г:ypg0eHyYkRl `1q8>w~6f3'ޱO?Y\0Hl,dy)!Xcys$ū>~XC>T0ESgA뼞ى!X eog#e2~y-m#F:9.2ESjoF& Ic#кg/4{*jm|/mȐkYac"cRX&M)LcQHYy{9c8r楧.:m"G3~϶Fh >N6nS04|fټn:9;VH7"JFNo N@3>>M7m\}:^~%bVd$F`cY5
J 3)Ksۗ~@bTQó=?#;n'j('D3܎#W<ڶ)[#	EpF e[?%m{Zn[uN_Ύ3܎#Xn$ nY';q4zYWYt`1;2#4?lHN@,3)k4?;Z6~ _p	+ zY1Ψ,"e,R $]}>DZjVlfɕ]{ ݑ&88-:V%"o|ZwCd]x77`XD?gQ3q'-{~	ذj£ F[{x',a?5[)t^)6ZG>ĭ
ΌČp,"o!˃mK3]"  Ui7nW?Oh :Y"o@_~!ynIb3?7ڸ|9QL`y+k2)m_ț ',1 7fۯ!]p[ɇVg>4A;xm)Y|D `mݏL:CgoY8N0.ԟEzY5,>VDB?`OyGϓ>gO.^F>ѱ̋L$jD:Jz"opF_D=9cgy3{w+w?Coyщՙm<ٶwЇ X7"o#}WZ^S?w5>0>4+`U#;Vok"; `"vn]Ş+?塛.kȇ96:yDp2׺]vD:7pF/D:a|C_/{|cU2/:V"e@j	C0jO<'ё X͒tAF"]acs\t<'D&A+^lɶfD*z<sȳ
ϪDYUtL[_&HU #3@2)4c#U[ۺv?H7 C9b93H[kjgg
D߮DYt[_b[v/"y!L]1V?=/zf'"0C0" be3 HWmKXَHr?Dɳj+dZՈtW;m}VDzPh'D@8=~V"N{[ВފHg"%]		v2ۺDJCDdp"wpoV!R*<B؈tn{Z_vDJH	NrWlB8DrpX0,"ݵ)Z_b{v/"!|DrX D6k]R R,c8b	3є#m32"WaycOG$36 ~eEY=V%"Aۖc"K9 zYQΈM@v׺u4"҄LoSHwn֥ʶ!O9z#1b~l2*D煎m,C@+"66Dj6<Ҷ;^G@|!|.1p;HwMlA|"Z}`'"]`0̍ "]Z~d R` >ytH8骝~my%|0>"]',NJ2;4Y^Ǐ<+MCr]#f 	E0#	ÜZ`6<2?C9<.FOχiu6DAH=Ա|8r0_83l~x" Xc"o#lNN҄xc-۳䜁K|1C²mDV`-8[UtF}mKxm9i?KE+c\pͥ\|eTL9b:>w 8c#"oazxtlGZ9|p'?1#茓?x&˞ob#6 `lFMkCб;.fsv7fYǜ}2WqCǌl}"6 `lD*M1=~jkѶtrw/.8E~q>a"ouxM._6=|0@.ҟ1iӸD6 `vՈS("o煎<޾%ל)<S.<''q9Yt"l" 3fNx"oe]/?mZ!-ײq!zJ(}p4m2"Y`RcqBd<"ofu&ŭ{gEz3>7|8@raQBDn=  44:E?
7L*l]L*\ĢۗSӧ\:>p"khi	EpV#em݋aN{[D
:6tz9d,&ל|P8!8c#0ՙmm);m1#O?}?Օӈuxϑ8gRfGתD2dycL\U]y1N:cA8墳x'X5l" iARC#=~;wm+kcwyCP"(|B1Hj! Y	Aʆ072Zm/+Fَ=P$L!2g:ӏs?f:`R6ƅ3H[x}5Z.t
>O<O۞V"8>*R6p";V~ٺgW!KM9/{#1B NxiHy	E@ZUl"mEf#+[ɵP$Y|UؗBv{`_hhi$(Z+p|d{3w}Vrm!\~W8IlǦŪ*XEHYr_0;F._-aM:Ecuʋ̙?oV"ea9_Ϯb3)O͙-ܼ9֤SZ0pU5'b%gcA!X@AJHlR^2dy}/%OPǅ_$ǹ| .^, Y1,GJ 1v?۸Eо,>dYG/<+\e[,l1HIkihiC0	)9AǪ6l{Vrw/bs(%Ωg,a)R^"`{)Ij>HytJ~w1;ڸ	[<~üC^DJ)}vl{rͲ-N<og\zN8Df$H,۪`)}k)n<-ZeMx9y8̲-N:t$bfuHIPsoz$@h)b`]QX"W>]Y).XЅ%J$¤!'sK?߮He93g6ҸKpa#L{iS?|6&4.`#ufː1I-ƕ5%Wta#j3N[^Ϥ4AC?E
&"cJaiL[rX@rm2z?uFGRB&"S[G	7 @8]Ơ!iVƎ>~<O؄b @"/21P4EȯF*s?at?Bg?8HCM8l"wjHc\9m%l,csw/vHL9iM+"6QNigK>V(S?|qWYŹ#a{	Hr(6}ݦ}<S0P&~y罗G !a$['"W3-H<*ވ1#yB"o!a+n$sF3DWbs+6Ҡ!3~,B+,&$lBZ'"iܛ_sŗ	0/wHrznB&\!bD>n.as p}y{mA"B&\)G:ciFBSLϭ)RFW=m#=sgcYIO"68DHdL{ry C|+1	H%N9CDNX@؄{Y`!-$qHtV2!GL༿swZr"ME"c3Q$-Cə/\ࡃ;g!3i!|`#h9	&Ǭ|N`asyHL~Ɍ@'	K؄r`/	qg,nkʻ=NÐ:b'D"XD؄{%	$Fڃo@©DL09#C;ypz	#Ѵ`#78]e,+n`Cs)H$s* 0	ǁjG9cp1@;sKY">XτI1~ҡH蕁	!r}o	-#Hxha-kț2a5iH9-'N:`#!d^a"fEaO͝e(m`	Ew'Л!lk6 t=/,2vWÆ 1]'c6ZMHلr`J;*2s
kx$) 1=$vR6!^a(~v]ܑ[ʪRhim蓎EBk{EB&f 	{82mܕ[ QwnzBp[ CBc5V+2W\.lH3e2JyMW f"r=8;Nn-auiQk(KHuL|4--Hq}	!d``ii+w喱?s,GcԸ10		9DBc=)`~S6dǑhimHr6!^X{R[ۃN喰F߹#',9hp ;ǲmAj J+LQKeft7RG$ށ&la!#u7jeՂT_֔_ɓT04wf4GBc0 J=HтTז ôb6,J/.Jwe[H(^RW#HJ/f_3l6,_}7܆Q#>jRwn"&:VKeA)r_~
i*C?E>ݐC=nRw/Kp} !u5˕ܚ[_O3떦,1!uw{a-H݌!}Wlr|6x/CUpq}o0"}e
ܗ_3 VwG]r_ޘ1!6s`l ۲KT>.<7)0H/>$ԍ~Qb=5H]
O72=nS@^!'_{oFTFzf̄Hݤǉq}
ALpsYXDAzR0w&vCQ#^Ndy{/Ur{v)[*?+>UV>ykG@"L#l"td@YX[+DqV5Emx%pb	ycG@bd8&=X\LA\,1wr_]ƞ;:b2৮E6ѵXH`me7wdҁNj
,/qhԂ3DMD 7!RGE*-gf.EΔ{w_P߱,,BM(h{H#Rܓ{ŭdTfˎ!86-ȀKD{Y ;#N~-Mqychfmc;62`~^f} 3&܊y5Mk[?!#2 8s}o70
Y	rgnK0$<J\l۰DMc"5WB1Vwpgn)+Hxm\>̟8IPP.+Ei+QL9<_C;O|亳4 0
Rs34 ("5U0eŮ;rKYUځA$gj:[4 
}q f#57eByw喱78Dצ5ik<y#chdrJbMp} efrD#˛23y, їovQuwt!5 ׸ lb`R3YSQ:-5]Hc1W~򫼼z#;Ӆ<YMq} &" KJ[+Ai\6n~ch$;1w]߫@lϳ,&$oJȯbna=e ~̏.lAEׁNf4]T])(ܚ[K=HY0i񱯐^Fp`^&j*4ƴT]wP`2f.##k|¯1c}&<`ȦgoeHT)q~%O6`)KLOWsڽuRu*MZ܍TUTR$6Wpkn>DǞWX4E߾4(ʤI+Ze=0,(mbN~-SFd̃si<N=˶|6ǌ+ US>nMcA74S.ڛ\EDn;Hl{Z`R5{DAi%l*G^xjH-XN|yA%@whd6opR5{n¬Bō<[IwP@neLN*
auf~l48xOHUtyLunn90WTq%^h:-@*.%cHU:`d}esDvoYO18:0~]߹&`<O!UAX	[|r/5EDje}\+qaβmHU<EphL$c%`Z&PoM+Y_ރALv[ΜQ#/mb-3~ q}oM¦ * ˻=NDZjrR]@=mX;4&ʤI#}V4Nj0V/ R/l'ם儩SpZ#b4/\뢉84T&Mǐ~P{iw	/[͚E+9qF@u/9э7S4ġ	%cIH9؜2`0,`f>EgG$lns3d;cb ڼ?cgˀ^&ЄRIˀ/ '9SAG`SKyS:7Q&@$
yL''NBKkgX]{&dӼ?B,ktRK;N-aui'HU* ܿ=ZZ9)/I94T&M2x,Cd18-م5t""Q^}	6IeYTS>k~N!Gdp{yCKed,,`!3%Nk=jɚ"kXRBA$"KIgBˠVeݒy쎙H^94T&!KZ9e!TÖJ+^@cHzO/wOaԸ1TÜ[aZONe43!K<\Dzjg`XXĜZrH93ēu1XE_%n&vv#{49!Ig nS#pnS(m`iTb/`ߎݜ|֩j/-~9>36M\׺*i%4cO(W^p)֦گ;rJe$cHW2L+`ʈ4<3c.#c8c,8W ^'[?Rd,4yNn=!Vo䙞_N"ͫ\*ٵi;'ѩ2쯟YO! _r}98k2uXbp:c!vpb=<[ j:ŏ=O$6qo&~u8k+wNerIqH09Nm=?T&,lDyL'˰9fd,]~bAzlIk82B2X|hAzh*1d?{7W)WXbΠ!}Ӿs6nAz":Rd,a"=v qJX.Wٺa3Owx~c:;%A%@z{݌!ySXb^ HΔcҔ	9O?[	[ֽBStyCmG	H`ș"}8$H r}o=-2d,UB LG=%y[R4XbpDD$u}-NDD$ls}/X*H/DD$]{1Go!""aH8H2idDD~{WRIp>p(""RkOׅI*.$cO{>'gLzo2X\ ""\<lZ3CH8H2i`p&""RK\AA-Id,$p
p<""Rsp}TE*.'cG60DDR\@A&I瓱c'1H5l>jRt&K."""|HU9Hե2Xb9pЊEǑZyPBDDz=RRLd,
 ""p9p{Hm8Hͤ2ibXmR3RSLd,1_ _w}/@jAj.Id,188y# ^9L:HIDD=\^2`Rt%KN NFDD~c6Ȁqʤ+Xbpp""aBrȀrʤXbpp""aS uʤXbp:p""e)rH]8Hݤ2r2Hs\^T&]NӁこil]!u uʤd,p$p""^Rw
L:HqTDD˯K\+# ʤM2 g""fWABAB%I% 6"" WWgPqIe$c|hAD$Z7R*&K  ";]CBB=n`p""gPsKeۓă 	｀DB*>%N	T&M2E@"A"%I@p "Rej_\+  ʤM2X ""2:~^DDZ{m
pp""%3-C"A"-IN'#"R[ $$Rt6K<2p=%:sʤ+X)``""q "p{e!XHiM ލH,>ދHCqʤ%cC 	i@{[ )Il`#p.0 <Ґ,N nDD-UHCsʤ&cAkUϹix4m<f`""|{Hso`!" XHSjYqH oXHSk9p`!" O FiYHkcF\
,D~=vp#QBD<+mD"=f? EDno4D~B8H|o;1p2"끯("oBmۆ _DD*|{YDނHێ~ |0LmD,Dz=+>'ND q}x[+%*`"2~^^xX20D
ρw}o"}d!O6^q,p58H:*iY /<	\,t} R"Uosog#"}^*x|rj`{eDjBm-TD,t}HYx[p>o{ E WDd Xx+'H1u@"uo3H+?  R"uo>At w?ֺg#i[XD~.DBB$mC_Z20	^	x\\LD$ .p3=HHYDD{m4g%{A_	Xp}/HXDL{N.>XM@ x}GNxx"e! m1EpD/f`!Ҁm.#s99>`{i0"=68~`4"\CQY4xπ6Ҍx<~DHjN  W@	Yo&g8
hAl <`{;,Dum  aVOD5,Dm,(,=Y`0`!`X <,|",DOm#S8ЊB,u "f!"Uo$SwSဍD 
`HUXHM($x88P9`7x	X{eDf,Dnm#c8p4p4`p$0&&|w}	x
L&8`0QH`80@	t `?vN+\CDBD"=+,^e*	8^5[y^0*"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""ov>N}    IENDB`is32  ރ W W W WW]W\WW W\WW[W  W[iΝW  W΃~WXXWXXWɅW  Wιj[W  W[WW\W WW\W]WW W W W  ! ! ! !!)! !(!((!  !&#+-(!  !j',--%!#r*- *! *-*r#!%--,'j!  !(-+#&!  !((!(! !)!! ! ! !  E E E EELEHEE EJEEGljE  EIO{lE  E^[EGnuFEFupGE\_E  El{PIE  EimGEEJE EEHELEE E E E s8mk                  ..       yz     yz   ..      ..   zz     zz       //                il32  o W W W W W W W pW iW W_ZWY]W WzkWfpW W ~W|ƀ sW W kgWZ fW W ]g W Woǃ W  W]`[W  W^gjW  WjÄj^W  W\a]W  W ɃnW W j] W W h[Wg kW W tȁW W WnηhWkzW W[țZWZ_W W iW pW W W W W W W  ! ! ! ! ! ! ! C! #! !+%!'-"! !O;!"*--$! ! Uc!%,- $! ! ;6!!(- "! ! )#+- +! !@%,- '!  !(ܠ((- +!  !+#+-,#!  !#,-+#*!  !"+-(((!  ! '-,%@! ! ,-+#) ! ! #-(!!6 <! ! $-,%!c U! !#--+#!;P! !,(!%+! ! #! C! ! ! ! ! ! !  E E E E E E E aE OE ENHEFiHE El[EMxSE E q|EZ UE E [WEGj ME E LNz ~E E_[ cE  EKMl}GE  EMN{PE  EP|OME  EH}nMKE  E e]_E E {PL E E NmGEV [E E U\E} qE ERzOE[lE EGkGEHNE E OE aE E E E E E E l8mk                                               00                       ww                                 ]^                               ]]                      uv           ..  ..           vv                      ]^                               ^^                                 xx                       00                                                      (  v        (	           (    00     ($    @@     (@  B       (  >         (  f (                                                            E!WE!WE!WE!W                                        E!W/E!WE!WE!WE!WE!WE!WE!W/                        E!W E!WzE!WE!WE!WE!WE!WE!WE!WE!WE!WzE!W                 E!WzE!WH!\E!WE!WE!WE!WE!WE!WL)]E!WE!Wz            E!W.E!WE!Wi(m(G![E!WE!WJ(\E!WE!WE!W.        E!WE!WE!Wl(-{+P#jI&[E!WE!WE!W    E!WE!WE!WE!W\%--,_'ɾjE!WE!WE!WE!WE!WE!WE!WE!WF!Xu*---p*rG#XE!WE!WE!WE!WE!WE!WE!WE!WG#Xrn*---u*F!XE!WE!WE!WE!WE!WE!WE!WE!Wjɾ^',--[%~E!WE!WE!WE!W    E!WE!WE!WI&[O#i{+-l(E!WE!WE!W        E!W.E!WE!WJ(\E!WE!WG![l(j(E!WE!WE!W.            E!WyE!WL)]E!WE!WE!WE!WE!WE!WH!\E!WE!Wz                E!W E!WyE!WE!WE!WE!WE!WE!WE!WE!WE!WzE!W                         E!W.E!WE!WE!WE!WE!WE!WE!W.                                        E!WE!WE!WE!W                        (      0           	                                                                                                                                                  E!WE!WYE!WE!WE!WE!WE!WZE!W                                                        E!W%E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W%                                        E!W E!WmE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WmE!W                             E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                         E!WlE!WE!WF!YJ"_E!WE!WE!WE!WE!WE!WE!WE!WP.aJ&[E!WE!WE!Wm                    E!W$E!WE!WE!WW$w,T$sE!WE!WE!WE!WE!WE!WlOz|bE!WE!WE!WE!W%                E!WE!WE!WE!Wa&--d'E!XE!WE!WF"XE!WE!WE!WE!W            E!WE!WE!WE!WE!W^&---u*K"aE!WqE!WE!WE!WE!WE!W        E!WXE!WE!WE!WE!WN#g----,V$umZ:jE!WE!WE!WE!WE!WX        E!WE!WE!WE!WE!WE!Wq)-----f'|bE!WE!WE!WE!WE!WE!W        E!WE!WE!WE!WE!WE!WJ"`|+-----v*^9sR1cE!WE!WE!WE!WE!WE!W        E!WE!WE!WE!WE!WE!WR1c]9qt*-----}+J"`E!WE!WE!WE!WE!WE!W        E!WE!WE!WE!WE!WE!W|bd'-----o)E!WE!WE!WE!WE!WE!W        E!WXE!WE!WE!WE!WZ:jmT$s,----L"dE!WE!WE!WE!WE!WX        E!WE!WE!WE!WE!WpE!WJ"`s)---]%E!WE!WE!WE!WE!W            E!WE!WE!WE!WF"XE!WE!WE!Wc&--a&E!WE!WE!WE!W                E!W$E!WE!WE!W|blOzE!WE!WE!WE!WE!WE!WS$p~+X%zE!WE!WE!WE!W$                    E!WlE!WE!WJ&[P/aE!WE!WE!WE!WE!WE!WE!WE!WI"^G!ZE!WE!WE!Wl                        E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                             E!W E!WlE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WmE!W                                         E!W%E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W%                                                        E!WE!WYE!WE!WE!WE!WE!WYE!W                                                                                                                                (       @                                                                                                                                                                                                                 E!WE!WE!W0E!W0E!WE!W                                                                                            E!WE!WxE!WE!WE!WE!WE!WE!WE!WE!WE!WxE!W                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                            E!W^E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                    E!W]E!WE!WE!WE!WO#iE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WaCpE!WE!WE!WE!WE!W^                            E!WE!WE!WE!WE!WG![,k(G!ZE!WE!WE!WE!WE!WE!WE!WE!WH%ZN+_E!WE!WE!WE!WE!W                        E!WE!WE!WE!WE!WR#n--z+O#hE!WE!WE!WE!WE!WE!W[;klPzE!WE!WE!WE!WE!W                    E!WE!WE!WE!WE!WE!WU$t---,\%E!WE!WE!WE!W}cqUE!WE!WE!WE!WE!WE!W                E!WvE!WE!WE!WE!WE!WN#h-----m(G![E!WV6g[<kE!WE!WE!WE!WE!WE!Wv                E!WE!WE!WE!WE!WE!WE!W,-----{+P#jL)]E!WE!WE!WE!WE!WE!WE!W            E!WE!WE!WE!WE!WE!WE!WE!We'------,]%_@nE!WE!WE!WE!WE!WE!WE!WE!W        E!WE!WE!WE!WE!WE!WE!WE!WH"\}+-------n(M(aK(]E!WE!WE!WE!WE!WE!WE!WE!W        E!W.E!WE!WE!WE!WE!WE!WE!WE!WP#j,-------|+O#jM*^E!WE!WE!WE!WE!WE!WE!WE!WE!W.        E!W.E!WE!WE!WE!WE!WE!WE!WE!WM+^N#g{+-------,P#jE!WE!WE!WE!WE!WE!WE!WE!WE!W.        E!WE!WE!WE!WE!WE!WE!WE!WK(]M(`l(-------}+G![E!WE!WE!WE!WE!WE!WE!WE!W        E!WE!WE!WE!WE!WE!WE!WE!W_@o[%,------c'E!WE!WE!WE!WE!WE!WE!WE!W            E!WE!WE!WE!WE!WE!WE!WL)]N#gz+-----~+E!WE!WE!WE!WE!WE!WE!W                E!WuE!WE!WE!WE!WE!W[;kW6gE!WG!Zj(-----M"fE!WE!WE!WE!WE!WE!Wv                E!WE!WE!WE!WE!WE!WqU~|cE!WE!WE!WE!WZ%|,---U$sE!WE!WE!WE!WE!WE!W                    E!WE!WE!WE!WE!WlOz[;kE!WE!WE!WE!WE!WE!WM"fx*--S$pE!WE!WE!WE!WE!W                        E!WE!WE!WE!WE!WN+_H%ZE!WE!WE!WE!WE!WE!WE!WE!WF!Yi'-H"]E!WE!WE!WE!WE!W                            E!W]E!WE!WE!WE!WaCpE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WO#iE!WE!WE!WE!WE!W]                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                E!W]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                        E!WE!WwE!WE!WE!WE!WE!WE!WE!WE!WE!WwE!W                                                                                            E!WE!WE!W0E!W0E!WE!W                                                                                                                                                                                    (   0   `           $                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  E!WE!W'E!W?E!WKE!WKE!W?E!W'E!W                                                                                                                                                E!WE!WIE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WJE!W                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                            E!W@E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WA                                                                                E!W E!WwE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WxE!W                                                                     E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                            E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                         E!WvE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Ww                                                    E!W?E!WE!WE!WE!WE!WE!WI"^X$yE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WrWW7gE!WE!WE!WE!WE!WE!WE!W@                                            E!WE!WE!WE!WE!WE!WE!WE!W`&-i(F!ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG#YE!WE!WE!WE!WE!WE!WE!WE!W                                        E!WE!WE!WE!WE!WE!WE!WE!Wq)--y*N#fE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WV6gɿE!WE!WE!WE!WE!WE!WE!WE!W                                    E!WE!WE!WE!WE!WE!WE!WE!WE!W{+---,[%~E!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wv\E!WE!WE!WE!WE!WE!WE!WE!WE!W                                E!WE!WE!WE!WE!WE!WE!WE!WE!W~+-----k(G![E!WE!WE!WE!WE!WE!WH$YE!WE!WE!WE!WE!WE!WE!WE!WE!W                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!W{+------z+O#hE!WE!WE!WE!WF"XȽE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                        E!WFE!WE!WE!WE!WE!WE!WE!WE!WE!Wr)-------,\%E!WE!WE!WkNyE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wa&---------m(G![E!WT3dvE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK"b----------{+P#jE!WkQ0bE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wm(----------,]%E!WoS}E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                E!W$E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK"b,-----------n(H!\Q/b¶S2dE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W%                E!W;E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WY%z------------|+P#kE!W{y`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W<                E!WGE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^&-------------\%E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH                E!WGE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WY%{,------------`&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH                E!W;E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wy_{E!WN#gz+------------X%yE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W<                E!W$E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WS1c÷Q0bG!Zk(-----------,J"`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W%                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WoT}E!WZ%},----------k(E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WQ/blE!WM#fy*----------I"_E!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WuT3eE!WF!Yi(---------^&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                        E!WFE!WE!WE!WE!WE!WE!WE!WE!WE!WkOzE!WE!WE!WY%z,-------o)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WȽF"XE!WE!WE!WE!WL"dx*------z+E!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                            E!WE!WE!WE!WE!WE!WE!WE!WE!WG$YE!WE!WE!WE!WE!WE!WF!Yh'-----~,E!WE!WE!WE!WE!WE!WE!WE!WE!W                                E!WE!WE!WE!WE!WE!WE!WE!WE!Wv\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW$x,---}+E!WE!WE!WE!WE!WE!WE!WE!WE!W                                    E!WE!WE!WE!WE!WE!WE!WE!WɿV6gE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WL"cv*--t*E!WE!WE!WE!WE!WE!WE!WE!W                                        E!WE!WE!WE!WE!WE!WE!WE!WG#YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Xe'-d'E!WE!WE!WE!WE!WE!WE!WE!W                                            E!W?E!WE!WE!WE!WE!WE!WW6grWE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WU$tK"cE!WE!WE!WE!WE!WE!WE!W?                                                    E!WuE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wv                                                        E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                             E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                    E!W E!WvE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WwE!W                                                                                 E!W?E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W@                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                        E!WE!WHE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WIE!W                                                                                                                                                E!WE!W&E!W>E!WJE!WJE!W>E!W&E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                (   @              @                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              E!WE!W0E!WJE!W\E!WeE!WeE!W\E!WJE!W0E!W                                                                                                                                                                                                        E!WE!WfE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WfE!W                                                                                                                                                                            E!WE!WdE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WeE!W                                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                        E!WE!WkE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WlE!W                                                                                                                            E!W'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W(                                                                                                                    E!W\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W]                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                            E!W[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W\                                                                    E!W&E!WE!WE!WE!WE!WE!WE!WE!WE!W\%W$wE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WkOzyE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W'                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W{+-g'F!YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF"XF"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!WhE!WE!WE!WE!WE!WE!WE!WE!WE!WM#e---w*M"eE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WR1cƻgIuE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wj                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WZ%~----,Y%{E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WoT}sE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                E!W~E!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wb&------j(G!ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                            E!W	E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wf'-------y+N#gE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WU4eE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W
                                        E!WaE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wd'--------,[%~E!WE!WE!WE!WE!WE!WE!WE!WmP{E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wb                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^&----------k(G![E!WE!WE!WE!WE!WR0ckE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WR#o-----------z+O#hE!WE!WE!WE!W}d`BpE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                E!WaE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Y,-----------,\%E!WE!WE!W_@oE"WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wc                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wn)-------------m(G![E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WT$r--------------{+O#jE!WF"XdFsE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                            E!W	E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wu*--------------,]%E!WE!Wg·E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W
                        E!W+E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WP#k----------------m(H!\E!WZ;j^?mE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W,                        E!WFE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wb&----------------|+P#jE!WH$Y~E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG                        E!WWE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wn)-----------------_&E!WE!WdFsE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WY                        E!W`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Yo)-----------------m(F!YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wa                        E!W`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Xh(-----------------s)F!YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wa                        E!WWE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WeGtE!WE!WZ%|,----------------o)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WY                        E!WEE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W}H$YE!WM#fy*----------------a&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG                        E!W+E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^>m[;kE!WF!Zi(----------------N#gE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W,                        E!W	E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W¶gE!WE!WY%{,--------------r)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W
                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WcErF#XE!WM"ex*--------------P#kE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Yh'-------------j(E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                E!WaE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W`AoE!WE!WE!WW$x,-----------,E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wb                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W`Ao~eE!WE!WE!WE!WL"cw*-----------O#iE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WjR1cE!WE!WE!WE!WE!WF!Xf'----------[%E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                        E!W`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WmQ{E!WE!WE!WE!WE!WE!WE!WE!WV$v,--------c&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wb                                        E!W	E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WT3eE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK"bu*-------f'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W
                                            E!W}E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Xe'------d'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W~                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WroT}E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WU$t,----]%E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                    E!WhE!WE!WE!WE!WE!WE!WE!WE!WE!WgIuƻR1cE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WJ"`s)---Q#mE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wi                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF"XF"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wb&-,E!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                            E!W%E!WE!WE!WE!WE!WE!WE!WE!WE!WylOzE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WS$p_&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!W&                                                                    E!WZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                        E!W[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W\                                                                                                                    E!W&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W'                                                                                                                            E!WE!WjE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WjE!W                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                        E!W
E!WcE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WdE!W                                                                                                                                                                            E!WE!WdE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WeE!W                                                                                                                                                                                                        E!WE!W.E!WIE!W[E!WcE!WdE!W[E!WIE!W.E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            (                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           E!WE!W+E!WOE!WoE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WoE!WPE!W,E!W                                                                                                                                                                                                                                                                                                                                                                                                                            E!WE!W0E!WkE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WlE!W0E!W                                                                                                                                                                                                                                                                                                                                                                                            E!WE!W]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^E!W                                                                                                                                                                                                                                                                                                                                                                    E!WE!W]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^E!W                                                                                                                                                                                                                                                                                                                                                E!W,E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W-                                                                                                                                                                                                                                                                                                                            E!W E!WAE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WBE!W                                                                                                                                                                                                                                                                                                         E!W E!W?E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W@E!W                                                                                                                                                                                                                                                                                             E!W(E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W)                                                                                                                                                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                    E!WDE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF                                                                                                                                                                                                                                                        E!W	E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W
                                                                                                                                                                                                                                            E!W)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W+                                                                                                                                                                                                                                    E!WUE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW                                                                                                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                    E!W
E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                    E!W
E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                            E!WSE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WU                                                                                                                                                    E!W'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W)                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[%~H"\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG#XnE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W	                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK"b-|+Q#lE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WV5frWE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                    E!W@E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wd'---`&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wv[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WC                                                                                                                            E!W	E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W{+----q)I"^E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG$YJ'[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W
                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WM#e------~,S$pE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WX8isXE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                    E!W$E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W]%--------c'E!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wz`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W&                                                                                                            E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wj(---------t*J"`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH%ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                         E!W:E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wu*----------,U$tE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[;kE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W<                                                                                                    E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W}+------------e'F!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W~eE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                 E!W;E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W,-------------u*K"bE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WJ'[F"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W=                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W---------------,W$wE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^?nH$ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                            E!W&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!X-----------------g'F!YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WkF#XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W(                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W------------------w*L"dE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK(\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W,------------------,X%yE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WO-`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W	                                                                                E!WUE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W{+--------------------h(F!YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WǼE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WX                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wr)---------------------x*M#eE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wx^E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wf'----------------------,Y%|E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W{E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                        E!WUE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WY%z------------------------j(G!ZE!WE!WE!WE!WE!WE!WE!WE!WE!WhJvE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WX                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI"_-------------------------y+N#gE!WE!WE!WE!WE!WE!WE!WE!WG#YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Ww*-------------------------,[%E!WE!WE!WE!WE!WE!WE!WY8iE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                E!W'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wb&---------------------------l(G![E!WE!WE!WE!WE!WE!WgE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W*                                                                E!WcE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK"b----------------------------{+O#iE!WE!WE!WE!WE!WF#X¶J'\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!We                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wq)----------------------------,\%E!WE!WE!WE!WE!WI&[·E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WT$r------------------------------m(G![E!WE!WE!WE!WG#Y[<kE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wu*------------------------------{+N#hE!WE!WE!WE!WE!Ww]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!W"E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WR$o-------------------------------,\%E!WE!WE!WE!WE!WV5f[;kE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W%                                                        E!WFE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wm(--------------------------------l(G![E!WE!WE!WE!WF"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI                                                        E!WeE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI"_,--------------------------------{+O#iE!WE!WE!WE!WE!WlPzK(\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wh                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW$x---------------------------------,]%E!WE!WE!WE!WE!WO-`mQ|E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wg'----------------------------------m(H"\E!WE!WE!WE!WE!WuE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Xr)----------------------------------|+Q#lE!WE!WE!WE!WE!WbCqF"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH"\x*-----------------------------------a&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI"_y+-----------------------------------o)G![E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH"\u*-----------------------------------x*J"`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG!Zn)-----------------------------------|+K"bE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Xf'-----------------------------------|+K"aE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WV$v,----------------------------------y+H"\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF"XcErE!WE!WE!WE!WE!WK"bv*----------------------------------r)E!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WwE!WE!WE!WE!WE!WF!Xe'----------------------------------e'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WmQ{P.aE!WE!WE!WE!WE!WU$u,---------------------------------T$rE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                        E!WeE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK(\mQ{E!WE!WE!WE!WE!WK"at*--------------------------------}+G![E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wh                                                        E!WFE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF#XE!WE!WE!WE!WE!Xd'--------------------------------g'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH                                                        E!W"E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WZ:jV5fE!WE!WE!WE!WE!WT$s,-------------------------------M#eE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W$                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Ww]E!WE!WE!WE!WE!WJ"`s*------------------------------n)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WZ;jG#YE!WE!WE!WE!WE!Xc'------------------------------M#fE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WŹJ'\E!WE!WE!WE!WE!WS$q,----------------------------i(E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                E!WbE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI&[ĸG#YE!WE!WE!WE!WE!WI"_r)---------------------------,G!ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!We                                                                E!W&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W~eE!WE!WE!WE!WE!WE!WE!Wa&---------------------------Z%}E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W)                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WY9iE!WE!WE!WE!WE!WE!WE!WR$o~+-------------------------p)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG#XE!WE!WE!WE!WE!WE!WE!WE!WI"^q)------------------------,F!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                        E!WTE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WgIuE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W`&------------------------R#nE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WzE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WQ#m}+----------------------`&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wz`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH"]o)---------------------m(E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                E!WTE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WɾE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^&--------------------w*E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WP.aE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WP#k|+------------------~,E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W	                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WJ'\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH"\n)-----------------,E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                        E!W%E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF"XkE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W]%,----------------F!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W'                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF#X^?nE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WO#i{+---------------F!YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                E!W:E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WJ&[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG![l(--------------E!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W<                                                                                                E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W~eE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[%,-----------,E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                     E!W8E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[;kE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WN#gz+----------z+E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W;                                                                                                        E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH%ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG!Zj(---------q)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                             E!W#E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WzaE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WY%{,-------e'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W%                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WsXY8iE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WM"ex*------V$uE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                        E!W	E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WJ&[H$YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Yg'----,G!ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W
                                                                                                                            E!W?E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wv\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW$w,--o)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WB                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WqVV5gE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK"bu*-U$tE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WnG#YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!X\%E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                            E!W&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W(                                                                                                                                                    E!WQE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WS                                                                                                                                                            E!W}E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                            E!W
E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W
                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                            E!W
E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W
                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                        E!WSE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WT                                                                                                                                                                                                                                    E!W(E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W)                                                                                                                                                                                                                                            E!W	E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W	                                                                                                                                                                                                                                                        E!WBE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WC                                                                                                                                                                                                                                                                    E!W
E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                E!W&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W'                                                                                                                                                                                                                                                                                            E!W E!W=E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W>E!W                                                                                                                                                                                                                                                                                                         E!W E!W>E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W@E!W                                                                                                                                                                                                                                                                                                                             E!W)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W*                                                                                                                                                                                                                                                                                                                                                E!W
E!WZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[E!W
                                                                                                                                                                                                                                                                                                                                                                    E!WE!W[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[E!W                                                                                                                                                                                                                                                                                                                                                                                            E!WE!W-E!WiE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WiE!W.E!W                                                                                                                                                                                                                                                                                                                                                                                                                            E!WE!W)E!WME!WlE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WlE!WME!W)E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        (                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               E!W E!WE!W E!W7E!WJE!W\E!WlE!WyE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WyE!WlE!W\E!WKE!W7E!W!E!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             E!WE!WE!WDE!WiE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WkE!WDE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            E!WE!W+E!W`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WaE!W,E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!W	E!W@E!W~E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WBE!W
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!WE!W.E!WuE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WwE!W/E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            E!WE!WDE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WEE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    E!WE!WCE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WEE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            E!W E!W,E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W.E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         E!WE!WaE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WcE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!W"E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W$                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    E!W E!W8E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W;E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                E!WE!WEE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WGE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                E!WE!WFE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WIE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                E!W E!W;E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W>E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     E!W'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W*                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!WE!WcE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WfE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            E!W-E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W/                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    E!W6E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W8                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            E!W%E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W(                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                E!W E!W\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W`E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    E!W
E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                            E!W"E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W%                                                                                                                                                                                                                                                                                                                                                                                                                                                                    E!WFE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!WE!WoE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WtE!W                                                                                                                                                                                                                                                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                    E!W!E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W$                                                                                                                                                                                                                                                                                                                                                                                                            E!W*E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W-                                                                                                                                                                                                                                                                                                                                                                                                    E!W/E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W2                                                                                                                                                                                                                                                                                                                                                                                            E!W2E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W2                                                                                                                                                                                                                                                                                                                                                                                    E!W/E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W2                                                                                                                                                                                                                                                                                                                                                                            E!W)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W,                                                                                                                                                                                                                                                                                                                                                                    E!W!E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W$                                                                                                                                                                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                E!WkE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wp                                                                                                                                                                                                                                                                                                                            E!WBE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF                                                                                                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W"                                                                                                                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W	                                                                                                                                                                                                                                                                                                    E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                 E!WVE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!ZF!YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WL*^E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[                                                                                                                                                                                                                                                                                            E!W!E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wb'}+Q#lE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK(]F"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W$                                                                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG!Z,--_&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WaCqw]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                E!WzE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W\&----q)I"^E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WqȽE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                            E!W/E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Ww*-----~,S$pE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WM*^Z;jE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W3                                                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WN#g--------b'E!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WeGtE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                E!WzE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wd'---------s*J"aE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE"WwE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                            E!W&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wy+----------,U$tE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WO-`X8iE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W*                                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WL"c-------------e'F!YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WiLwrE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                E!WYE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W]&--------------v*L"cE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF"X}E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^                                                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wm)---------------,X%yE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WQ/bE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W|+-----------------h(F!YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WlP{R1cE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                    E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI"^-------------------x*M#fE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF"XsXE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W#                                                                                                                                                                                                                            E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WT$r--------------------,Z%|E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WR1cƻ|E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                         E!W1E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W_&----------------------k(G!ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WpT~E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W6                                                                                                                                                                                                                    E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wh(-----------------------z+N#hE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF#XøE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                 E!W:E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wp)------------------------,\%E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WU4eE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WA                                                                                                                                                                                                            E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wv*--------------------------l(G"[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WtYE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                        E!W9E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W|+---------------------------{+P#jE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG$YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W>                                                                                                                                                                                                    E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W,-----------------------------^&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WX7hG$YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                 E!W-E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W,------------------------------n)H"]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wy_J'\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W1                                                                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Y--------------------------------|+Q#lE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI%ZK(]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Y----------------------------------_&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[;jI&[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                        E!W~E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Y-----------------------------------p)I"^E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W}dF"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W,-----------------------------------}+R$oE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WJ'\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                E!WSE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W,-------------------------------------a&E!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W]=lE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WX                                                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W~+--------------------------------------r)I"_E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WmQ{E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                         E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wx+---------------------------------------~,S$pE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WnR|E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W$                                                                                                                                                                        E!W{E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wr)-----------------------------------------c'E!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W\<kE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wj(------------------------------------------s*J"`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF"X|E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                E!W4E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wa&-------------------------------------------,T$sE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wku[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W9                                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WX%x---------------------------------------------d'F!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW7hE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WL#d----------------------------------------------u*K"bE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WT3dF"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                        E!W4E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!X,----------------------------------------------,V$uE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WsXɾE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W9                                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wt*------------------------------------------------f'F!YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W{bE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!We'-------------------------------------------------v*L"cE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WqU~tYE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                 E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WT$s--------------------------------------------------,W%xE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WR0cL*^E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W#                                                                                                                                                E!WeE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG!Z,---------------------------------------------------g(F!YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wj                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wr)----------------------------------------------------w*M#dE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WxE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^&-----------------------------------------------------,Y%zE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK(\^?nE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                        E!W/E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WJ"`-------------------------------------------------------i(G!ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WfE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W5                                                                                                                                        E!WmE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wt*-------------------------------------------------------x+M#fE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wr                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[%--------------------------------------------------------,Z%}E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK(\Y9iE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                    E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG"[,---------------------------------------------------------k(G!ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WT3dȾE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                 E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wi(----------------------------------------------------------z+N#hE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW6g}dE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                E!WNE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WN#g-----------------------------------------------------------,[%E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WT3eH$ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WT                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wr)------------------------------------------------------------k(G![E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WL)]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WS$p-------------------------------------------------------------y+N#gE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF"X~N,_E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wu*-------------------------------------------------------------,Z%}E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WhKwE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WS$p---------------------------------------------------------------i(G!ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WN,_O-`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                        E!W1E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wq)---------------------------------------------------------------x+M#fE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WpE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W7                                                                                                                        E!WWE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WN#h----------------------------------------------------------------,Z%}E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W_@oJ'\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W]                                                                                                                        E!W{E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wg(-----------------------------------------------------------------j(G!ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WJ'[~fE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH"\~,-----------------------------------------------------------------y+N#gE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wz`ȾE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW%w------------------------------------------------------------------,[%~E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW7h\=lE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                    E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wm)-------------------------------------------------------------------k(G![E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG#YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                 E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH"]}+-------------------------------------------------------------------z+O#iE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WnR}G#XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WR$o--------------------------------------------------------------------,\%E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WQ/b[;kE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                E!W#E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wa&---------------------------------------------------------------------l(H"\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE"WyiE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W)                                                                                                                E!W8E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wo)---------------------------------------------------------------------{+O#iE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WdFsE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W<                                                                                                                E!WIE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG![y+----------------------------------------------------------------------]&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WL)]H%ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WN                                                                                                                E!WXE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK"b~,----------------------------------------------------------------------o)J"`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wv\R1cE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^                                                                                                                E!WfE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WO#j,----------------------------------------------------------------------,V$uE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wk                                                                                                                E!WpE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WS$q,-----------------------------------------------------------------------d'E!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wv                                                                                                                E!WzE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WV$v------------------------------------------------------------------------r*I"]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WV$v,-----------------------------------------------------------------------{+N#gE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WP$k,-----------------------------------------------------------------------,S$qE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WN#h~,------------------------------------------------------------------------Y%zE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK"cx+------------------------------------------------------------------------\&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH"]r)------------------------------------------------------------------------^&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG!Zn)------------------------------------------------------------------------^&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                E!WyE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^&------------------------------------------------------------------------[%E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                E!WpE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WP#k|+-----------------------------------------------------------------------W$wE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wv                                                                                                                E!WfE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH"\n)----------------------------------------------------------------------,Q#lE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wk                                                                                                                E!WXE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WR0cw]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W]&----------------------------------------------------------------------,K"bE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^                                                                                                                E!WIE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI%ZL*^E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WP#j{+---------------------------------------------------------------------x*G!ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WN                                                                                                                E!W7E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WfHuE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH"\m)---------------------------------------------------------------------k(E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W<                                                                                                                E!W#E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wg|F"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W\&,--------------------------------------------------------------------[%E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W)                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WZ:j·R0cE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WO#iz+-------------------------------------------------------------------,M#fE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF#XpU~E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG"[l(-------------------------------------------------------------------w*F!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W~G$YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W\%,------------------------------------------------------------------b'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                     E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[<kY9iE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WN#hz+------------------------------------------------------------------N#gE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wƻ|cE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG!Zk(-----------------------------------------------------------------u*E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                        E!W{E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W|cJ'\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WZ%},----------------------------------------------------------------Z%}E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                        E!WWE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI&[`BpE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WM#fy+---------------------------------------------------------------~,G![E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W\                                                                                                                        E!W0E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WrE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG!Zi(---------------------------------------------------------------c'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W6                                                                                                                        E!W
E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WN,_N,_E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WY%{,-------------------------------------------------------------,I"^E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WiLwE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WM#ex*-------------------------------------------------------------e'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WM*^F"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Yh(------------------------------------------------------------,H"]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W~M+^E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WX%x,-----------------------------------------------------------b'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                E!WNE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG#YV6gE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WL"cw*----------------------------------------------------------~,F!YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WR                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W{aZ:jE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Yf'----------------------------------------------------------Y%|E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WƻU5fE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WV$v,--------------------------------------------------------t*E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                     E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW6gL)]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK"bu*--------------------------------------------------------L#dE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                        E!WlE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Xe'-------------------------------------------------------d'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wq                                                                                                                                        E!W.E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WhE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WU$t,-----------------------------------------------------z+E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W3                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W\<kK(\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK"at*-----------------------------------------------------N#hE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WzE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Xd'----------------------------------------------------b'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                E!WcE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WʿE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WT$s,--------------------------------------------------v*E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wi                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK)]T3dE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WJ"`s*--------------------------------------------------H"\E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W"                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WrWsXE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Xb'-------------------------------------------------W$wE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                     E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WfE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WS$q~,-----------------------------------------------f'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                        E!W3E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WǼu[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI"_q)----------------------------------------------u*E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W8                                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF"XV5fE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wa&---------------------------------------------,F!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WV5fE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WR$n}+--------------------------------------------M#eE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                E!W3E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WtYnE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI"^p)-------------------------------------------X%yE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W8                                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WzF"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W_&------------------------------------------b&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                    E!WzE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^?nE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WQ#l|+----------------------------------------j(E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WrWE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH"]o)---------------------------------------r)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W"                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WnQ|E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^&--------------------------------------y+E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                E!WPE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WZ:jE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WP#k{+------------------------------------~,E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WV                                                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI&[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH"\m)-----------------------------------,E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                    E!W|E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W|bE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W\&,----------------------------------F!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH$ZZ:jE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WO#iz+---------------------------------G"[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH$ZH%ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG"[l(--------------------------------H"[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                E!W+E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH$Zx^E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[%,------------------------------H"[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W/                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF"XW7hE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WN#gy+-----------------------------F!YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                     E!W7E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG$YE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG!Zj(---------------------------,E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W<                                                                                                                                                                                                        E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WtYE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WY%|,-------------------------~,E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                             E!W9E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WU4eE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WM#ex*------------------------x+E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W>                                                                                                                                                                                                                E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF#XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Yh(-----------------------q)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                     E!W/E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WpT~E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW%x,---------------------i(E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W4                                                                                                                                                                                                                        E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W{ƻS1cE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WL"cv*--------------------`&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                             E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WrWF"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Yf'-------------------V$uE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W"                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WR1cmP{E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WV$u,-----------------J"`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WQ/bE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WK"at*---------------~,E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                            E!WVE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W~F"XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF!Xc'--------------o)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[                                                                                                                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WriLxE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WT$q~,------------^&E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                    E!W$E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW7gO-`E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WI"_q)-----------L#dE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W'                                                                                                                                                                                                                                                            E!WwE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WxE"WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!X`&---------y+E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W|                                                                                                                                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WfHuE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WR$n}+-------c'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                    E!W-E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WX8hM+_E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WH"]o)------L#dE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W1                                                                                                                                                                                                                                                                            E!WvE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WźsE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^&----s*E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W|                                                                                                                                                                                                                                                                                E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Ww\bDrE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WP#j{+--W$wE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WF"XL)]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG"[l(y+E!XE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W!                                                                                                                                                                                                                                                                                            E!WRE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WL)]E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WG!ZE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WW                                                                                                                                                                                                                                                                                                E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                     E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                     E!W>E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WC                                                                                                                                                                                                                                                                                                                            E!WfE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!Wk                                                                                                                                                                                                                                                                                                                                E!W E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W!                                                                                                                                                                                                                                                                                                                                                                    E!W'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W)                                                                                                                                                                                                                                                                                                                                                                            E!W-E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W/                                                                                                                                                                                                                                                                                                                                                                                    E!W-E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W2                                                                                                                                                                                                                                                                                                                                                                                            E!W-E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W/                                                                                                                                                                                                                                                                                                                                                                                                    E!W'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W*                                                                                                                                                                                                                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W!                                                                                                                                                                                                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                            E!W E!WjE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WnE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!WAE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE                                                                                                                                                                                                                                                                                                                                                                                                                                                                    E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W"                                                                                                                                                                                                                                                                                                                                                                                                                                                                            E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    E!W E!WWE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 E!W"E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W$                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            E!WE!W|E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!W2E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W4                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    E!WE!W~E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                E!W)E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            E!WE!W^E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WaE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!W#E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W&                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    E!W E!W7E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W9E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 E!W E!WAE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WCE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                E!WE!W@E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WBE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                E!W E!W3E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W5E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         E!W	E!W[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W^E!W
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!W E!W'E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W)E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             E!WE!W>E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W@E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    E!WE!W?E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W@E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            E!WE!W(E!WpE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WrE!W*E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!WE!W:E!WyE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WzE!W<E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        E!WE!W&E!W[E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!W[E!W(E!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            E!W E!WE!W>E!WeE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WE!WeE!W?E!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             E!W E!WE!WE!W1E!WEE!WWE!WfE!WtE!W~E!WE!WE!WE!WE!WE!WE!WE!WE!WE!WtE!WfE!WWE!WFE!W1E!WE!WE!W                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             PNG

   IHDR        Ir   	pHYs  .#  .#x?v    IDATxMR\Ƕeׇ@ Z5uFptG ԫQ:*Fb0_lķeW?~>rx:UVO       l       '      @|       h             >       4@                            @|       h             >       4@                            @|       h             >       4@                            @|       h             >       4@                            @|       h             >       4@                            @|       h             >       4@                            @|       h             >       4@                            @|       h             >       4@                            @|       h             >       4@                            @|       h             >       4@                            @|       h             >       4@                            @|       h             >       4@                            @|       h             >       4@                            @|       h             >       4@                        FIy?"#bw~يu&|E.   >   FBwEg^6"n3   `t|   z[7=N,ab   `c|   PR~v_O    Q>   k%◯i_v?   "  j% 9X<n/Ǹ3YLoN   5|   f:åL^~i{o  |  Z
OJ{ؼ+C  0R>   I̡W6~    zj)?c\/m   ='  4^w4ֻxrܿ?bzgr   m  d񯮻qSl  A  ؠPUohus  >  wP־}  5  iCW#s  x  l?U`~ ߸]1  x  ;[OzN>  >  0z%'{`3D}  #  R7zf  h	  ``0̛  P	  `l9]Az|SVM;G    ғwh$F1-}W  #  dU ՓoK  h  4gc   Z#  [tcv= pk  xu Ɇ̩   $  k'cW>  )>  rK$"L  wa	    v` f    <=SgטY  ?"  UR^ް?0% x'AH e>  wpd* vK1    cUR]z; U  |  eR\ ]	  A e qCv>    c z){;  D [K{ F=    =TR_
8C /sC ~ '\ mw>    +) Xǫ/v A>  4g v   `˖-x|77   G -()/E#g  4B - `CYD; иzd1;,  X?  H B  `D{ `|  X  V@ FJ  D{ o<h  |  xn= ?/ 	  O/ *b>    x=h _5]̿3S    KJ5w~l  ֦҈ |  F|> []̟>  c& 0J%pw @nk|  H `TJʏ޵ hu   w z{    +w {/3 `h|   류}  A Jʇq| \w>  & Ku{W й]ʿ1  F WJʏW  /	  h^IyF3  V  h @l b񱾗g  F ) ؀n+ h @l % h ض !ow[7 m ظqD۶ QW]̟, M ؈nݴ?m @O/l 	>  kUR>Ԥ /zC `]|  ֢m`  V `|  VtM 0`   kwM>  ctU׿t   &  z}  E U\  r>  o" "%]  /wUC  x k# 7! '>  SR]&τ  `ew>   K}{ z}N>  |  o  |  $ XI    0B%o  B~?N; 0> Hw޷ }]bw A ~]q  KB> 	  U}wM3 R֟9R  |\7{  /  05wG  Fn_8r  z|R߷ `nF c> @O3  9r
 @  =#  /p]_ zB 	  x! G| wg=  B> @  Z
ώ3  VD h   ! A> @{  `>Gćbz  K "  h e>   @\ E> 	  @O  [  lHIp   A> Ϻw$#bϬ  6@ X   ! `|  Bba  "%㈸ !¡  N5wGf	   > 	   stf4  ' RIyS  /  B=  }7F < %c^   n  ?  @Ip  2H N Y.|   VF
 - `II")"  `n _> aG  Qetf 	 Uc  ]Ed1q X	 (ww  @3>׍;G  NI^/  ~n( c" QR>_ 8u  ^=,  }eϑ  襫g 2 )  > H |^w   H s]d  n{    u zO z;   Tχ L z|ֽy{   6 H zs߅  wk/  z]~O   /pg B z]x|   j; Z& M_DĞ   J TRޯ   X
 F |   6#k @3\  V h l  2 M*)wWp]>   w] l lE.ۺ?p   4n_: `| `JʻuW  aݵg! I RR>  8yI 6> v%_~   @\kgN X' X)  0 kȿs : Z	  0 mK
  TIy7">Fĩ  0`W58d `U~6I `UJgq#  0G1O | J#  `6 ! RR>n`$  >#Oӻ x xaݺ?0A   mƟ	 Z> *%݈39   G_jȷ  XIn   <FK ^B Uw5-   xn| #> C  `%mq D nw_*   UV6> 7?	 TI$"n{   Xύ x> u]    a ֽx   a | 9[    | 3[    | #[   4 0R6`dl  @lH[#ԙ  @o #PR>x    `lխs  R%  UR>ˈs   05_:R  ml  `>GĹm|  n_Dās  3G sa()GL  ZR`l@ϕw[G   Fn  =VR>   FzC S6}w=ީ   7 "@ϔ#⢾s   =5_  =RR93   >Gd130 h =PRޏ   kFd1 g m+)E\   ި{z 0 Шn}g   U}@=> 4|Xs>   ׈i  S͹    ka4 AF+?~L   s O"F   6 "f%s [VR:   `˾m|W %%ze3    q'p> lAI,"=   И *)FDwe   `CJʇqa   g  x   ND|u> l| X#W   J} X3 ĕ    R     ʕ F6`\   +`| X~D\ں   FRx: +`J'1  |l;+5G   `Dę+| x=   _kw> +Jq#   |dVR>3 x= ^   L>/ ^ B/f   "ݕ'Ƹ y6Jʇ{   +9B > <6=   tW ?
} ǈՌ    VKDM;;{qd>    +u]#X['{s   `-g
g%o	 d=s   X]K +*)_Dĩy    lw^   yW0vK݋    ]| F/| {    M.> 
} F1"~u    M.> $0*ˈ8r    M?,7	p> Q߻    н?/);. B`J'58q   ZR>sd #   TRpn 7)   U}q0D> TRue>    ֈ?w +aD܈    -nO/ C#0(%峺y{   |W0(   |,g!ED:M   Qbz3^+)+w   0n]?,> UR>x   @hVR>6 Jn~	   PDג7%ީd    ԧGSo@^:5    ^sDO;| z]?ub    uD @j޻?pZ    mDLӹ2oдaD{    a[))" -hV@5    =v"kIh@    ʧE> ͩ>9    ䷒К
 ͨN    pǓΰh@JʻqGN   hx?   ׈?7|  lUI0"=    [- $55w{N   -"ג `[| ~~0   V|*);  l\L   },( lTIx   @/ dxNM   bz X7+)FD1m    zH`#| ֪YD4    =v'tXo6%}   *):P E`-x   ԈPX~V?    ty}-)9U VM`J'=    #I`| V~`]   `$a*?=<<& V'   `>OS | ޭ)c   :-)_8} > R?"    ė8,wF[ x    s"> o
} D   :YIyx x- J1D    ﳉ{    x;yI x) x    or_7sl,    log	 P`1   D| ^D)   <Fcc |R1!    X%3{| F   $=>    `#D| F/=    l7| T?(!   F E12	    
?	 #'   @D| |1   )]Ŀp$ %x    M:K!    &02=    0B>    +"> #!   @/ #"x    &0p=    0>    0(">	 %     &x    &00=    0@>    0*"> !   ( "x    Ec59\    IDAT zL    MS =f{    `ɧ! =eJ'    S>@#b;    \3=    !G{    D|zB    @ox    }DOӹ!>@{    gF &4=    N">@ ۼ?pF    
 $    k"4Lhx    Y/w 4Dhυx    A"4_	    ">@c|Fx<    :Oz =    E;J Lزx    l٩}>x     L    hPv` VR>?    hԿ&m|a5    hاz( d`    =?t 6>w#R    zdV  `j6    `s|Y    =E	 kVR   ;">	 kT    EK	>>{    `` k AI,"c     ?:XXV|)    0p,VHXaD"b\   VHX~D{    `D#x:y`Jʻq)    #}':N6ީ    F6"'  og>    Mݱ=|w()_Dĩ    ta o'QIL    /u	7ޠOf    7%scxJʇ[Ncn     _6>+ PRޏx    "3YLF2xnD\     /6>u     ^[R <CxrNӑY    Z536	 ()Gĩ9    A]|()E   ?{[g}$vfo<i8$8).<4} ;0pKaZ$J!U\f!")b76R,*Z6#4Ump;NP-?ۄ_=1Ix~^U?|>c8'Qήejjx fDjS     ̞ÓG `I^    [!ÓG^4ZSp${CO    "A* N#i\     &Jp$v	    @UTP%Jx"%     hՃU j2(BA     ${Oq(=>PzI^޹    @s<eB(${CO    +eV2}     zz
@i%Q| '      3 JIR!/>    @()[J%!:    @9<yi|T@TNzz     Va(@iT     \]Reޙ4d     S=P
|(Bm    J]@)($B4    @}x+LZ!{    P9<yD>PX*J7    0($>PdHC6    P=J"DN    (Br>P8I
!7    (O"
zы    (<UEB(GO    J.BErz     S=P|(BM    JE| (!<k     A>k| ת޿{     BÇ'h@^9=     UOW~ ȭ$w      Uio@^	\Jx"%    I3 ܁NU    pzx@\]|     ÓG^6( /TysHx    ,>I!1     fi(C
}      ='WBm    0}c'hx@i=     އz` @%Q/0jK     ,P!YBȬ$B     5t#| @&Uk^    @-"@V=-    Nv>E| s{    @25*Lq=     >| S@f    &p>*,q=     >| 3@&    &IWd
}{    @9<yE $ZKb	G     hBcI>l@\!
   P,=oI4M{C;m ȓg~7   vv_vt_V/1 oBlh@S$Q1$=u׮Ucw   0\Y>Jh`O{xÓG5ќZ?t䁼?C}j⁻=  hmIp/PxEO 9VXh|Tk r#g|[o02  JgᎮBzw &	|TD3u o9}?w}P8v=;  
-=Uuaop<<@ yÓG܉4@TTyȬ5>uO~_  ȫKY1JXe@=D"j@tszi;Ưh  p+k­S\|zZ {mh>Is=Gs9}
:;;  Ƚ2?qz+iޗCeFuWz<3mپ-|o?  [;
-\tW;(=@]Uk<BNߟnz$|A   rg[@cSa :D$P^ w>IM_w|@]*   +Gۢ-r'$Z'ӄ<;U_k7J}   һkQ?KZVem  (g{@0] >{uu{* ,Z_|EM*E>@=D PN wҊkn]R  ȒTDוakk+ZNUء$Ԝ j}ШyO7앫   9V.mثXc@WTԔ5DLȳΩFO|'Gc  "=E9uc@#O"P+N5S!k4%O=P!  nepce)}8ub%vh *[jERZ?d@]wMM}i;   @MM̟֎q%>PId@' {>n3  LZpڛ>姚  rn4⽖Ԃ Xju;~e-  ji2%[9 5hX(>P5A tOQ  peM&*g>P6 *}`$Q+G;Կ{T  s;/qř?dPX)%NE׮;^g  ,]"JV8o2J j3'<g|8,|."Og>   [+#é*a8D/5`^$Q70jz@?ݻ#  >|qEBP̋
}`TE  'د"wݟρuxlHS̙|
c\  @j[@cS2* jF>0g|`N(ާ:(F>  SZtѶU>P(i+BZCP}}a¼qx_m(w  wt][fRZK2J jf<]	̖ C'+^|Zg;Ư  ek]!*g(Q̚ ju~/8O|#xp* `UDוakkqC-+3* j9`yhpeaמJ}  (W=#j,mXcNUld P8?R,5}HA>  _Z+
Y?uދX8Uy	sRQZ+mK[  O+ۗ2&xX(Uy	RU|.I>  KZ#SeS+fp|a J8'>p.
idǧKJ}x5  Lғ;/.PeEԆ*}TEջ7K_S   #̿2ZiJ^	@ͩJ||.M[~`x{Oe  @W֔2&kދUL<g?&Q  MV<2&jS| @us>J>  4GZk$\ҲfF(J%Hx DRn* [+#'eSǅ}q 7D9U($wz~ggG_.  %	S|@Dqz~4R?7i}O>7	  zQ9J
ҫ 
?ς Ph.}aSG  u;6̟5%U@US??iJ}  2?mPv0Y3 Kx|Y}\sn  0ie]WƷ ZemOX[. J,^Oe0xՐ=׀J}  Jh7XhE,<DFCPȎOs KOOt]2%XԔC	%Q<BxKCg~W_+G  `.^dSur7;yw<rP|REW:YvMxoO  jk]~:Za_#rB{6\g_xp +^CPg?VpTC$Q1{svO>  e4ر*N7CUi+@OOy <P}}R @tݗkm7+J~;T(	>Hiue14v]7J}  nepce8u\ؾt(J_ه e"Hxyl>'N78<ݯjA  "I+ol
Z}5%+Ɓ2Rc>P|(' J!=~e7tJ;  #}	R1 z\(	>@ŻB;(9_>  V	8k($B	((m![o_{QG @Wք[+#N}|V
Lŗ>o@|sgKWy\>  0]_la(UP||($7d@
&  dE*s @	V
JŦ:(_jR 9nؤ2?-PZ$Jxo$e1{  dIZt6@]S>(){>yr8@<b9s_xWo}  4AZ~}ڍ?g{'O}@y<C8t@xJ|Zy0<'>
  l2_xOkڝJP E$I8Wo UZo=>ϗ}  4JRe~]ؾ# mz.P |(Ovl)rW} p XxE9V.5s>@WV(>HBv
ٖ T P/c]w_Cv	ZOZ] PIT bQ @-MWom\= az.P |(' JŤR X2܃pSP|(u;(;t#e  sV4\hs>)CIkC1G ]Z-:;;>  cepce8U(T r.}!~{qm}O> *TȊ%e@^JrN9D@A%@aͺc(RS CTׅTWrJvD@]MeA tie%5к# 8Sc|ȩt;6]	()  Wք[+#'TJ?Z%QrJ	:NcS^ӕuO @;/q^r	i ؗDE C'VߣR +/iYiݜ  ~'~wy@!gOpuFw~]> @mPG~
})f"9P}rF^&<7T LZtѶjTu3-SSSv9Q}Ra'g|H8{ϐ  rlp}:yݿ2sx!s|pœr gP ȿ2M{+}W>Dia_ KMR O*󙫏Aa@>!O+ذT/<r_ah  vpGUeU1kږ&Q<`6}|ȇ' 87:lپ-|o68 Uc]w]0>YAW}"NY<h4KWy<  2dY[%Lt]^h-˪V'agc&W}23	2]* 2"9"eV/5Ds
2NV}n܎ fo?TR :ZUSSkSpCIOd m ]:ӡ&T 4%ʰ|j@@J Q'F+֛5R q;V*TSs8p鵽{	ejjj cO.;<ytwx'<<~?d  5Vs]j3ZwpÓG^6''!
έw/'	M +۲k|!1k c3"W}#  50\Y2Y٦F`Ɠ(3(>dρ3 -~`x{O>s  V<Jh7CB0kNC!C(ޘ>f' rMG> {F%-+M 0kIOd } 7^jR4J} K+o.ro8"33j ֚C3 8+Y$|ȎCv0;N?lӕ{ Ջz]W'90{(d 2zL] UgRd5=P u;6Jh/(Ȉ|9Q &>{9XEu9ّV거y  V'a- S.lw`DAs	Vl`VqڙlI+=J} t+[[>i) s>4 z~ ͪ&F&R    IDAT De>YTxc#:=ܭߴ, @-k+UyZZ8M$&#3n s֕C jaOHX> 6>4 E!?Ju @!u/B(J^ka sܠ9'v=u.25re5g>j ri2kHTZ<p0OIO4 1 8O>}ߣR ʶ%v0(Ve&5wYF95;V BGk{}|rҲ?xXU\S d%pj!wA )|h,>4P~35G! hcUIe>Q @=NCc	}@e(
 @VLW_h|
( 50Jh>4H{X!'E4]c: Be>E>8#Ut!5]ឃU 5\Y2[|w
C fFضl7E" *=_2«Ԉ |p=NMP|K/_}q @ݤ{F%-+RX>@7&ԗ {YƝJ} [+#'T̗Ҩ,l9`P_|}0NȪFI j|(Z$G{Yڻ4) B^ԫ2 %wCLMM/A?-@<bKIx}_YQ  s i >sxs
>ԏ' Zy0<' 82? ":CTOߏ-@~+	M QZGUeAvXz.CC}x _лנ7wl
n(p- 
's>~&gP LSVC&%;d r
3P ]Be>6 ujL5DXz R ik]~*fq
jLI3:貋cR[V	]WZ5ª֥P?!>Ԉ ݻ̄aJ{>nad P@ie$A
zr
jH	3  3mwɇB_ @̇Lgd$P#|osV1 P *aa4V ԝSP#|OYZ̝J} ȿU*<@a @> OGk{}ivPi u>Ԁ e u&pP }I2Z0V>@L` N4FeIICLW=* *T y>, Ɠd @.Ã P_=`h	, {\eP׮	>]W/ 4|e )|X >̟' /ܧR hFe> P42'>̃ @ѨK+wv_U E>̓ Ǔc @I+tKZV:4@rh,Y
̃ (N4V2UH*[+#'TL (2a0w{+֛84tE"92 $9$Q<B73 J>x1~}̇L@9s$ P:9_> ̓|ȆUgh0|%2۲}[T sV'*JxC9}$}k2`*`V/wt][ fM=@sp١R m[@cSm T:#d iTGMW揶Yb7 #kYy$QBeN  R ~Ge>V>@9 B1' _лׄ (%  רp  ̓=^fT FZŭ2 `Nv&Q<`dpv|87
 'J//~ (W=#* ]p|87h@pJ} 
mk]~* g)|8;>EN ̏J} (̟2lm~ )|8>?  R"_պ^!>ֶ aWŪ`|A}  ,J} Ne>GG2503> ߼}X  u)|(>!  VZ-:;;LLS Pw)	cG mwɇB_19aG* C#2AIxcaL  +c*ȔK0!3 O)|8 >̓^  R,XnlR x4|Jx 0n  Rf̿v  ͑3{->'  D> ͠2  3d4P%ߞ!2 普Կ{TPw* 2e4V|}c  7;~*  j@&L  ;V]}S j&52  Ɠ(NO%Qe @}TPÕ5H	 ..)=>  K> V<# @Mמ(3>D  ٧R̿e CS s  GT0[* rkQf|J+⁴'   _+/ 2  (v
SfN TZg;ƯB >2 0 RJ70n  6]ឃUu ($2SVO (-۷=M %V'a q
RSV 
d*JhpGUe xJ)$ G>@y7wl
n7u° ŁLJGO (0 Ŧ2Xy]ȗIe"T(!: @(&  Be픉 Q3=fe_л y2 Y=e"4(!8@}娍~`x{O$@-k (j2 2q J//~G  G.^t `o'@i)_  %w*rbk]~* H6-C	)$= J}lK+'[[/)  N& ,|  4]uu_Iԣ^c!! L*Ce>o/ȱiyRt|`߼}Đ@e>  sqShIm ym*Կo * j2 s Y'
}}PGaG* &| 0'iSP'+ۗ+aR  x
IOa%Q6 \U&@S2 "P?|*PPӕ.ڠ2 ZQX|
Z2j ߱Ii+?jK   A
GOQY  j%#;G>  Iח6  0;~*Ce>Ez^ e"vzl8'mȌkׄGJ}H+t2ԿZ
@hdp/k9o 5\YnP1  A#3#P(BU  A>o;/q& @#$Q,ħP tc
dVZ#te%-+} L{}wlBSIV`rJL[|ioW| OO/b64C!)4Q  v|(T 1NS|ė3  M~`x{OYPH*zq(]զf=>PFMz/vH+G,(m*z}>@fSN 9|V'a-L  JVD!ɽj%  Ȥ{,ȥՋz]Wp o&vUQ (=ދE\%̿cSvrw,'/c  2/<6o, T S=>VBE[2P|0r	d|z(kLO9}Pe
v;'tvvX*)*z1(>&'(U @^}O>$2aY[Ee>  E1DmW|,{lx4P87
,hW=#*B{}ײgrKO@(7uzL4X׺p+Tw|%KQ ._**̟2lmR|I5 R}PB/Z;PXB|Q+W.5s4^?B'䕧  (!>Po* (Fg>S<9K@v(/B>y~]r2(-(1W2;|r%޴ Wi@i!Bggڮ2 f8n ՟DF'O %~+Jepߓ	9[پ$XV'@9O>@׏.@!/<0kMM*{>Q81:QJitwnv)}iv y{Pn=I; Jn_ wxRaf4]?g@ gS' >y" w?6=`2^?	3O\IOF ~ (O=:;;>@e>N>y= ? Jm_cS0;M5
@O%QܛV _`maupeM22`9'Q<:>yӗ zpц(DݗbkN:h|&J >pcPuׁ}PiepIJ+OoH >DO	ɴ$BC5kׄ+{BŮ譓 IX3&'	Gg
@5[/3(  d G_*}( | >b<^c!dVC6& &?H Tk'1I )|2KO9}~a t@-'LAY|̗' 3z&@N^Je>@|lF(0HO&%QV 391s̓a9n* jsRO&	*_ WYa<ie~=F\Po|\8Md IWg._Fo#oYnU u5Z eH>Y$'p^G_?+z2Je>@cwIp>{MENp^?zC8;がQ8La ̆L)-U rmQXo&l'QѤ>YI' f՟lP >d|{1S`&L,5$_N  #=aL$*aJ Mo; p)"'3(! q{71+Ꮜ`aOHXպ*F_Of_ Kc8>nD`c]PDo/`NdTd ,QL%8˗G	`2kDLa ̕ 	! `.^Q$bLPg*= s֣FWB^:Q- 0*2AOV`Ǔ0KWxQAȦy]`>d SBg,|54رJe>@FJ'd/C |XvM3+Xp*2x8;yj /M''0o?zO\wQl_n dkS`A4 RB߻`>}Y<7U6ȸOaE ,}NO`A ~`]k`0*up+JO`A՛0k.6.% B	i*>M>Zy/,fip۰Q,ȧO8ѧ4/? jb/$,mjTp*)P32,LW~SkׄΎp{FgH+wW=b4 9)>M>M>Zyj3Wք[+#{߶> jE>M#Y|P3G_9j s~eUieC~ 
%YM!YPS/(,\gTP5.iYi 	 Ԕ pd j@>(WްQ jM>M!LZ{'?5SYڲ}QQZ*SNP2-NO3xZ	 2~~	| BE	i${C;MZ;+,]!2*JEe>@ EFhTn^. !ie~=2[1 2a4 FP7?z >zQo߲P 
) ԕlhI[.3*
m[@cSv(NNJkF0I{B	Ԁ+Gۢ4~~Md\4 F@];^^5d () Pwa4 {i PB*I}> 2FFIo!6 @( 4̘Q|E ? JBe> ۥ i( hＡB nk| «'2 egŽM	 &@w?6k (em0uez[xxe FNP?z?URY\ĒxEm͐Qղ)XV75d+TZ2d,a5$F4Fp{0Cc4dqNyU	)<r;9;n;;M< ރ pyQuz`Xmƿ#"W|xb 7>U>U] 3MkNP?;`Mlijԩ&>M$ FĆksbڧ2)E9 #A4U% Zǁe׍8	tSM|C|<i:, [ -MӌjS5-MYx?ф	8ml1jҌ)*=emB (T j`Dvd)uq1w*8-P4PS5|Ir>dόgQX
 { j['Y *޻c0܃pb{i2Ԅ2^*a` 
>= #= 'O;#Je> C| 0BOx|ڻcOtuu
#Fe> Cq(JαPdaT jP܃Ay~0bT0TLmijB4>Ԭ2f Ӷvq0TP)o,%NSq|
Ѿ=:vZ{vlQ0V@E8	@-qSV ԔWE    IDAT w}ǁ`j</8;&F0dz:l Ԓ9-M͓lJSQ-MӲ;?LZ~{QVEs'y3@MLME	49~o?dTOl TZ$T 9Y]tVu>Le> մ $%Ҿh Ԣ^m/@ִJ}T| ^YS[/*$f! Ԭ7o iW2Ƌ:vЀe)>"6HYh{ًLT| ˎZ&#bT 5M}4nbT0,E)9V2l j+><-"f& ^ I%b=)n:,C`X{ j_KST JP+>;Flrå
y{ r?Z R Լ}A@JrfȎW90v;\Q|*[E KO( )kW`| Fȍ-M͓3d-M͗DD 6=k{־, a  JP	@nڲ3:vZ_-֢ Ԋ=Cv@2>m" re,(2Z39V Dϐ	9@d_@?dLe> dsO} 7S߻z3$-M$ w^li@ݱ'6^ohk.)ua Q,'*> kZGl~;q{ jʡ(aK dg r= KXPHN3W s| j=-3$|yRD4A _	br*:3ٺ 5iQ> 5=  q#ml@P?TPJQG@if \ǟ@P) :}@4Px kj"ٰzm{N92 P s,rAq= Egu E7KR@d;3 rAXE`y P/="[Xkڲ"zt | 
DƠ, 
O?g@u쌧=4̸qVu +(Y"g<t (j\_=]]ݖh/U@`܃ϠiHymc[\w2UK(3|BQՒGe> E>1`|SHy⥱kNCe> >3`|QI/}2"Q@A3 -M͓@;]]v0 | = y:Yg0Pp5D@y PX5m6	*8hD `Pp5%y گ^\=U'*̿R@q~s= Eqt+@-z讅}}{ H}> )p>!g <\ (|iKjΚU,&1*H/(Bp`g,Y$Fe> rD@.f	|j b5>1*Hš(a o|bi+_g&>-*How; [_KKS7 HF˛*FҊZ{sGO[}.>5jr  !mGɺH~_* $#~a}`lO}$ⲱFcԧ>
 39Vr R>" $e?d@O@V2~V9)Q ޲v R#k_ HJۺc=:WOuV  Q;-MlsZ-MYx?Ѥ HKOs`X}{}w| R={ʩ49i	 OVX<0l\46^o2 ~o&@4^sZ|$e6Y>Pu+ke<n2 ~PbǑ@	 z',EĐLe> 7z i3S 'Z'ETS Um/o{jo;>vF| W6 ,$t<D HZe y3_1gǍcg+	 qJ|NCj ,_pmѾhquc.V [F 7NC\bB nז}5 
(g>( #JQG` @i99& x) uf̟R7!Q 	m=e-ḾsR-M ]Q CW7ȂQ mSFs* uq 2 g_Og/6- WrR|N gS+ʥO^[-rs* >ٝ{w1`@oCC+z 0 (ǎld A3̓sB-M͓"b =&X&ן7R wt >AZNHɨXcEx_,3ļKU m~ dq  @ǁPTőU_=~z}| }=| dq  g8)}q̟9G [ '>'$d<4 $vm{w1#š2 qM NnjKS$|DKS󴈘h2 pr  / P{ڣl pj>'= Ɔx):vGx_*r^~4dr|  2& k f52 *dwxX8# 3?;c}{ϥ>\*8h| v{ 'j>'2T :tĆkM
W*o7;>5jr 9q䀁@LlijfV hij }Ҹ 1;[so\V11S TԺ[
 #| @ۺc=Fze> PY(Gۑ2U  <$ `?c#l)w[wNֻ?{ʦ sy~`6K}r'5蠠~wGWWTV= T˥]& ' L轰lAAx5R αiMlijfn'Z 蠀`wh92 φ#o6 ?~ 0H:bMSPٵ߻Xi;ͩN5Ύј( E)0h < s \ ~53bM Gw6 q| `זaZ#۶-n|^n:webꨳR }[>q?~ 0Dόrjc
s(rå owԬ)>٠{ CUnݱ'=<y讅,?{S 0JQM{ *#4K8BXQBNdk-R #ksO{tm *Uq P!m/o'5Heݫϯ2M F+o[  T>Nsz B0Kjؓƽ_CxCYe~Y{ a{c%k GqL *g͓w
-xfr1griU @eM5OBOy TVvK*Ԑ2U7Eۺ׭%wA\7ht ݽ*hij֘ >*9 

cq2@hL|㩏 jƋG*! TAxhaϷ2ƱcJ݄G 5#;}"J\y >| g~wF#dqT| MN@U< P%NXr߃m92 j׾N/|  )|>Ye+>m92 jco TYKS'Y TYv
?kM몾][vtv(Jֽϖ dw- Ęka<<\| ȁ& 	 av
*o=q_?g94aJkTe> 8`X'C  SPY+k{pkn7ٜiO/T 9= +ىM	| &O\f0;oW7*??fzL=  0fyڜgj a>Ͷmۄ92 { ~-MW{O? ?a\4=	PVbsR  0b'L6~ )|>_VFۺM-T@~9} #F0ip>pzYen| /`DiNi>ޒK6R = (p&O? we}	U_xqLFr FT+H
z;?|HbԬk sNkij֤(~|`n硻ƢDWWLVEs'R  P34i'J.z ﬁݱ'+RE.e759Q @!<f Pdyˇ j@ǁIښUqnk T@={v* mډˇ jS`g|{T| (Y &J.z )'/mc[,ظz| (&L4	C 5>w".{Yew) P\N@iijZ#O; ԞBNS\*߾X*s(o?Ke> v6iN ?M> P<NSHYenu[p;zR2s1uY 
 PM ?M> PS?BYr߃qNtecŗ.ƨO} PXw, jL/A49 5{$5Xi̡shJ} Ph(/[2 ԮIv~ PÞXkV/R Xw)8 Ԯ9v~|m\/ <z讅}WB?* Mڿ ֵ45;~bZUm @k"W+}@?* ==  ?1\   5\XXk[}w| Hϡ(E[>|%F/bz 996[5`g<} wA| y ?k'	 ':tēZ5iƶXpmq@vG; 
J ?=> #xSPKK*s1gǍcgǔ	 V|q?1@tuuǏ!+&d/|b[HNe׍8ݦ I+Y> LJ ?=> 3/..cmnu[D JQ_vmO~ G-MͮN ?!> _c,Xt8<R d{+{f $K ?-> S;)[bҧ=T CQ]o %v~Z| auU~G =f o/p@eO.^jTCw-/nΡST `=*$ ȹ+,08 9G5jض-+7cU V sH7!p@e'Hŭx5pwn7\f\8+f:'Q  xXH  fa:i  6^VK*"kt~*s*̟x| JQM{ 
y]Af@ɐe󯺩Ge> p*=e3'B@d5O.^jZsC*S{0ں  ?t8 G?~g}]-T {@!O P0}|~k6^_>/ֽnh92 u=oa%·>V Pvwy\fҒK6*??fzL= pr(ǯKL Iv"@A={bџEn7x^4"1  #mS6* (&'B?| (,}rR#ִ{p>/Hx ރhicj "ţOEN;O]Pr(̿qԨɩ 觟 \KSS	'{ (,]{ض-\s[9ȩ2kcb4>
 + { O  жذzU',Jaw) `Rz  N'>$B x[ߏOc1	V2?k`^ k/v g ~O  q#ZԺUϿ&} kso{=a~ ' O  r}.ŷ/2 R] ~i@bV^`YetIq˸ŧFMA `P~v-{ʆ iq?4x Ӿ=\Jִ/L}uiK1S 0H{Ǝ# 3΋O  RG;}<txxN}U淌shJ} d?/m5B HTKS\KS ,}Xd/byWϥ>:^?uY ;c%ct	N_| e5Y:ָ]@> *%TҲ o  
nɂocY:G:v#߼?6^(r+9u T	 	" @*_71ʶm192 5vas \]p| {]~N<xi;@G- @錵]o+ .>(1 G~m*󳦄ecg48ݩ{ Vj  ph  }T׮cΎ : 9Rl⛖  J,Xt,ȧ+]׍Xe> Pq #/  J?kgdݱ'+r6SYeW}&>[G T| DZ]]`| ĨyY=_5w>:^?nB  Du> p
.0|E3  NxkMhe?%\DYeS @5 NC_`N $Jڶ-\s>T Eu> p*L_l> I>O.^o[e~ | 	M} pJYZJo_W,{&ȧ21G *{Pu> .0~	zKb=UaVW2 N(K R'/6 ie';UAK{0ݼ :t)53 α 1͔K @ڲv&[bҧM2cU  跩FU\bs mlִ/24̸qVu &_٥:   #߸᡻]G@>e/U i  oA	 }a45yWz    IDATϙXN FҺcǑv  $S+&~A45_ ךix5pwK| `$_v 0X <i0'{71 H[qd| `(T >  ``z5*_uSl\~.Oe> PVˇ   uǓ{Y;@GM<| =J{ *Y`A9r IѧbL|3RV7̏][vO`j</]}S *E95K  *A_PN- 0dY#߸?7^_>OxcYe_ #W{ )	K TD_=0`,yAKSVQm qzގG] T%FYL  pZ/..ҘsmsᇵwǞXUg jxv TD,&'[7 @E-Y@_]dkZW=_Uxc ٽ˺{ @[7 @EeU"1 @-ّxXn kijv  [v2j`6łknO`e_k{ e;6 @5>'/e<^?	U_=vS @ui  0 Nm }YeKxs*Z{) PM  }VWm^R Բv TC$/i  <އc@G4FVEs' I `(܁_L| `X>;쬁:wh1 @ `9 }kZW=_Uxs_nTx ԬeݯY 0$/&]  };knYSV2~V9{α% 0$b$  +o_3S߶-+}WV˸Qg" P{ `$8[@|  *bf3,
/ @^=k޴/ `$4m  ]2=>>Ԭu[he6"\8. P9N
} `Ddw//>2U7	sNe> 7Wlo  T &>  `t舿aO.^~鎾?R 3Ga{ FTKS4(>  kXr߃Ulv[soe<n9U淌shJ} @lm}V ~yR3  jʥOǚUUY6^_>EKe> Gz:c  Ux Ԍ%iyOϨ؏]YreN ySr  ' x{+"Ϲ_= KO^ 
(>  Uվ=!Y=_:q1n- -|  *~ 9m^|π~{x.\n rhso{u:  N_< jccѶml#W ރw[- a  oþ?7]{?Kc[Le:fS @nR}k 2wo  VO}I%㓟?6*ɷ2ߩ{  JQҫSG  
}  Uv~]Ӻ*n|>T E#m|> VN e!ĿG-s*XUm8r> vY `ڲBe> P{cSi} y1ͦE  ZVME1n! 3V"<j["  Ee> P$?)mS  FoڊGM  U2 (Rjt %/5  T| ~5-  #
  0%n;[x 3Gޣ
 VKSWN  PWW f:Ǡ Bm, !  Njr1c(bj  ~45OK}  TNVF2g P0z:㗥
 @M\ 2 @eOJl  Ԝ:+  *o% 
Xqd (Kl8   ,(ˇ (I6Z ĩ Rm{  j   U~2j_ 9%ںY0  5O_,  T )X M] R bso{<v  7   @*+վh.>  $Be> }=$ @|s  2 HI){ @ T ))EYx @	 T )'J 5  W_=vz|jd  p<_>l     
$̿
 $Ax @  f5N  )& R7-   rNe> gn} nj(>  |  U{  H  92 H  @Ψ RN=  % 9whWy  A{cmכV @a֯X&>  "l촘sF Ij   Xf>  "*lE1uY $Ix @*  P&ן6^њ $	 H   jcΎ?3} @   h׍Xx $Kx -Mӌ  Pc.;-掾Z d	 L_  @z9+ %  eN @x H 	 dw7* d	 @  #cg4 H  ~O  #>i
 d	 _՛  11m  H  >H  lr1cJ %  0yF 	    @x  C  35 4=     쒏Wj @Ҟ9%ں>  8%  PEYm1 4=  <-  Ԓ&f֝{  i{  ?$  Fd5^* ' "  T  ّqi   V  *dFÔ?) O^é  7  PYx?wF	 $Mx  C# ! DR^  `.;-d @tOJ(  `H  0Hvߎ1>  i{  ~q   ӹ'	ѻ?V
 B~s  `4_pq I^ @9  4̘xi4k4 u=onO}  Pqy ~8q 9%ں%?  >  FvaL @JQgn @	 f4L/4"  iYxD_>(    p{ CQҫ{  |  8= @ľIiStM     >Dx FXY* a$  Dlmj  0  = @3GD[>  Pg  4iJ\;s& $xȫ{  AN g'w(Q  'Ja  0  $>f5shK  $k_Og){~	  `	 HRvcǔ	~ dѻ?V
 M;,>  9wha  azގW   ~s  |c	 @Rf4L/t  imR  >  ɸbٺ[8 R+|/   ~쎈 D?=f:l deݯ;J~	  F	M> G	Խѻ?VFwO9Q  @M Ph{  uzގݞ      HYvGE[>  |  
Ix Pj/{   9" p @vz}  C|  
岱ӄ @6m  ]|  
cFÔsF q= @L} E" ~- H 8P~  4	Tew  /  1g$y;w @ ȭgƟa @Rv-v9`  P0|  r)5^J $d_Og8Ue>  o; = ͽ)?  '  " RTc  oL8|	 @n4L 8h-2  Qgх|  +oS&2 ݽ㿾^x  	qt	 ' RX @b  ԼN) @Ou{v6  $H @MzԨɖ ^V]EwOٲ o  3GcA @ `~cx!/o  1a (<  ՙFqt*o  sG_h @ѻ?ye=  N PS=Ix ުocSiE    fL?3kB :h-ˇ-  >  5cg4ƼK_Q=e+ b~sY-C11!  PW4\$ 
xhg  )x~sR Yx}㬘R7 ˺_w,  8->  #ʱĔQ{ xk޴Y    Oα  P_.r pȔE 0Ex |;g9GǞoƮ-;S b;wc-
 (wZhM߶-pwtuu>  YNG  j3O̰% JQU	(;ut'?=g>  '>  æ>5^ Xslg<˱:s>D~	 a& `Xd @!<stKz3{3٩oo	gM8rY\ mO  ԦN)u eOi}uﳫ76~D_0_ǝ_OG 0  9W >5j  O^CIGN{Dݗ  զ 0%>[qC r+{+6uQCΞw>'뾿o|^tuu>R  	|  fr1w ?{wu}ߍKn(nX@͚%ۆܶI`t4GDGMnkɨc+MVfGx#1va`Fkae`^@~>5yɬe}Fu͞>yDrCG:I  ż3  t3%|島 dmaMRe$_H @sP*} @576Z dTޯePV}r)e'wϽO z/  T܅
*w P+G޻O*ɞ$Xs'?z}k+%J zsܛ3}}} wj
 ͜S-  ȜTgPRxajygO];9 P?RE~>}  @}t5O \?P^{]xASO>qoMD5  P)|  *bB)+#; Ȕ$_Yvgqt¤iu;gv_8S  M 576--z	 dC{£=/w/[[ƴo߽0kޜ]0lyncx" -1\  'alh1u  3W7
3kSq}a   /ar8 27};½}F-pӪ;ߟO%=|  M u5OO3@  6mUEu-zWE/\yS  qC|
 T݄SWFv4 	}ղ2hs;gvOj/\4??	 M?M  U.⯓ @ʕCo߆-=ۭ*c:Ks^|WwR  5. [?&6Q %_/Ϡ2'\x<{ @-h!~>e fN̆	 Vru@y}e'aҴ7x 9$ϡB I#S He;z߳I.֯oI}x  0 ɻ_oa Cϡ^Kʘ)ӧYzIe Jr ?v>  rvh	M
 ҺKZpk{ @h'~~ *KpFؘP -w[6-wKYN 0|  Nhڨavi }l93s9aΙ]Qz m95y ۘ-/F @vCo[vZ$U_vq貅'o^Bֽ-? ڸs~~ mAx H$_Y ϠƇn2?⺟{    c= 6e;z߳9ÝO2x&Mo   OΩ/- 0d޽ $A/fMrmxab-m/>>%? Qr_~i!= &}_ggV
኿!oK @	  iTn=z$c.\4?ܶzY=ΓLǒ{ ȒMOK ڜӽ{ ºKaW-#c[|U8Ι]_t  "U9%ϩB I#S 2φ{0kfK?̚7'QXEi ~}  4767ڴ Jw/[D6W_nZu!g?! `JŵO|S ȅ= P7~޳}%7>t{Eb&Mݯg   ;#0!1  u+53<zO[O	 6盯 '4p^wܷ-<}dHRׅUe~] Jc| ET ;+}{TĽabE%_XW 0X|= ח0 P[ܷ^e~]h~oS#	  Nb ?6>  &lO3 ?fx|ˡPgHR~}K⛯}5qƷE_
  "e @M>JXuCϘ)ӧYf͛(j&mF_ gsLo.sab0 @Mtlҳ3f՗V/^| #1~JE 2mpfC jZ(}lԷwKY(;JU  sLݱ  Iu_R TPׇL;cf;',}9M> p<RQw	O /o	M TC{ևt6op}OU  /  8Cu> Pu˯C!u?I4#QRR3®r~!\  3%451  U\gCXU}$w>Bxb𭾜 mQ TOru1}п#fIRׅ+1Qd*} (9b  ,Ο0Ο *V|%ln3e7-}ƨ 7z | t˄7|71  s.wA    IDAT RjMߎte͐m{:gv>L5a} 3~ιϹB ": rx)<e}t͞>y>'[Bkksc rN  1Q TC{Ɓf!IȻKMP#./:1 @
A DDu> PI^;z3in|p5bE.%US. Dh ?| DWD @<Ͱf1^|~X=*s~J >N 476j `ؒ_|=}YIzrMM^հf #8  /_u̘2?%o*l^Bֽ k9TA 97mpfk z^gЅ;^!ԥ?^#  ~@W C+vb$ݷ
x͚7'{ @\G@B) @}eJZ wׇ`t͞~fexW ǣ; @Mh:%n<nA;R_ػ1~ 3d՗VF(8,x 9W(]G@@]4S
 C{UgKp˿.fQ. L>h  2N> -ab+ `p6m>cf;',}9+QpW#ZgqC 92fDK8u 08z3eHxy[UsRu7( ȧ]> ȟZU 2_oo~Y>=\0P(<v}dqp> Ĥm̆		 ȺKl9ÝO3hIS7n@}$ ȁƦf 'W=s}?K-.\yǍa0e'  gd}GP*V alhJ 3&	\~fe
u]?2C ̍ ?.c  d٘-aW4 uV7T\h~ms RQ_-> ฒ;%q`!eHpͽ?3=D-/= -0.6 @VM5>Lng 1%W=+Ϙ3'S5I.Ks}~\| 2+>iu 1{
{7Ca՗Vݡ2貅atOq@mx 2hNalh: >Jxnc,in|p5b5 ͑nDq cƌh	G| I*޳!ln0r%ޣ25oN9LvDbATj ោ3&X bkac-ɐ2܅>
h;{Ͱ5 @](5mG~|6>  ȊI#ۄ vrx^x1IeO+F^U Eod @F|eV ~hOxp=ɐw>"L(H7_ƷY dK}Eod @t5OG[ s02"̿%a).K;lj_q> \scSNk%x)
ﳤkp3+ìysb)ueÔS C}~dK )wvsGh	M Mߎ7 C\}iioC-bp25 bcF#\ @ʡ7{o)l,@$o_sC̮GAF$I[Ėme ~ǎJE> [X D*	W73fs'ޓ9z@6"#Ӻ  i4id[8n  Bwgݪ2L4#{ )87>* HsGبϦẟ? ,2+c N%>.) @L5>Lng/ #WlI.|z\H#^Ur}!~ 2_I+lV7ϐ2{KWqc g~Qhf N2	B RybZ "kzZyFL>50wJv_Z- 	#T(> HƦ𕑝 H޻/ޓ.n[?䄼貅 ǫ; @ZB] @uܿ{ݷ$,GA$\@8ʍ ?^ u\	k ;ru_ػ1~٪3kìysbI" p)~|c = [ޯ,opu!a՗Vݡ2(-bp)b]  ï0w ȫ_x5}ώ3}r{7Ι]%^)c  ?^~>2 _	 ϐ	KGx M\G~ P'Y 9\?3$_0w>
 RC)*I   Co_#̿{p /> Ԙ{ ȟ2m6C.\4?0iZG죀cJ% }	&3 r"y/-=ۭ4#[|U죀W ԏ/bm}  PKF3&9 @ׇ7ΌH%n/? й} yo3f՗V/Ǎ}0(nF)DN 5\Ong aIe/Ve~o9+Q %ËJ]!   -_Y ϐ3'0+k=^|Tp @lK*W7d6opӪ;TCx jm T{ Ȧ2WCÍ.la죀r 56r|| @lR=^|~*
\@M9\S l2  =Ie]gDRxabT+^|j!@"?rRч  Tɘ- CTgϔSíO+H-9 gGNOb) @}= dppe@m,b*s|
}*L *'?D TgKR?͉}Ps]rWJ S  Oe~$ϬCr} ~k *= 9R?zGuu
 
GЧo @tS-*!}xW^Gst|B(B )t6L0I Hbk*3De>E-ml *-|> *Т Rgw([^||H] }	9B% Sr}?{' R7};ևYM$[z]c+| 8O.`F R&|*3}r{܅>
Ȅ9gQ P9m'a Be~t͞<zO( 3~Qk Pm'_T  <1-F )2?{oZu!cY_@e'hL o@*ϖr?{a_-](eO| `ȶ0ѵ ԓI.[( &M3c 0<2:> h> `5 TgOp3+w91oZ% 9 1#Zq u2?{fK{#ɗqLj 0t2:> Rч [\@=ϦfUw!.\Z`dt|@G3 Ʀ0 Tgӷxy[c܅m CȖ	( 0@g7wd\ PC*󳧵?貅ro\d 0xk>%̈ ԈlJ]xA!|>ʇ @W06 ԀlJsfW죀h7:, G6Ǉol |= Ԃlj>y"t߲v "X '00a@Ϯ$_=@|&M]g< Z>Jϱ | @Ϯ)ӧ
0 Z~ cq476ڍ De~v͜wNm2=. o3 8fG	9> F U2?ےn}QE ''= ̈ Tl L#x 1m06 TlǓ<|F  ǵP*n5>Jxs >bHo@l?Ge~	7 O1	9 p1#Z *`s߶Qe~	'"4 ,cs<>4 (m>8 `ʡ7>JXU&ߚo^ pl.9&>t͍npV 2eyCҳ3Lxy. 1-$D|p @ybh	MF C2?P7:t},\(w	"D BtǍ @e~~7 >Lq	9oo 1#Zq Me~~L>UxK̮>ٳd p>%
 }G  7UDCKcP_|c$f fg6N 2/^WIx{߯\Z[ >%d|hM5>-   $_8Ӹr 	ل@%%']?L uf9  Z3Fz "_eʁ$ۅ@_YNɀ8	" Dïpf| 82lqu3Ix9+1 U0kޜ6-ڹxYN>'T(v 6r	ϧor=PU" vg9!>nqϧW_.lac 1 1\(UpB|B@T&4ƆKH*>RXuə	\(1 50iZG=è|NJ@0 *3Op w²}Ϫϡ)ӧ51 54_0n bhsRRч	 Ql` puBasXr}r{>ƒ:Z[9: ]CKhk 8\[#슟F(:Y@lvJE>'%g\3Ȣ2Z9+1 u2o= 1 ( 2}]h~ QmaN_ |>Cu%5q=#, γ bX3 R1*f jl_ 2?ɵ5pKc R+ߺ* FTt,ˀ, ֘-abh JIe~asHI:Bd_ 
묙3| rK}> 1zXpoNo @ƀ	os [q *ܷ>}#{5bB_?Z  3`R1961 fB)alhW Q}-<e=fI~%# 33| 3}7Ñl<"߽Z6_  l2|K@8R=q:ìysbr- 3"g| +8OnWqcc 2 i	Q@>| F}> y2?nWG d} rLϠ
4 | js6p9+1 F\(wY.!g( ´Q;V|%Hoo*1 F1h| pH C{򆰥gF컷]R@4>| qv	@n$UGns¬ysbQj!>&g| iNQ@.p`@f gϐ*> 6}Ty*9ڟ@ Gdi @{ Me>Gk.f F1$|; d| ,K*v F3$| >J*ܿ>q`)ӧYjȁu޿g LR@=Ͱ|Ǉ,br3_m d!3 Y3fD| 2He}[gs\3iZGh9L3d|pf Ko_ d|N7^aF@.}n@fJE>C&g| )g5  Ts2}r
G_?^Ȫu6p.> &60 RMe>5o[ƷY0 Y	jEp	Ȍi#ej}g@L:gvkZ0 Y$;cXwU 	g4EZ/ލ*?XlP@;K@.lS	I@&0΢ H2=sZ>=̚7ǰK>Z[-,1l|* 7m,
TI*{6}p0`_|,,=&g
b6I & ˑC6À%]ht9۲G J@8 HǬ~ +ǰ	> 5fDKZ,Sp}R@\FLj d|*BOP o9 ԝ|}r{e@t>s@8v"TJn >1 P׫g>7|Ctyj d SI> H3@}oGxp=`|Co| l]TV!:FG Zx|*󩈮3߁մ>i #W*FO%p u:RS13v΅> ͑+#bW3Q QO|Kg\#  vJMC4W FscSبjPOOnu/ R=%|HF TSmg}O! 帕SQ+Bv* i Uo|ng2C q+%|P
7 zꃯ5{_UOU6Y2@" BB$>ՠ*3%-@m?',o[z.UwIp)>8 HGT ja@u4 *._Uި25ðr9g i"T᪐&@=yJROx:OM](7&Z, 0Sg?Q:gvyp}OUP7N	- 6S0zh; ϫ daT 8\m CGS0,Ie^RO]}|Z Cל4pOU&<.&p%_8O9 3_m, B>G !yЛa»n	 0iZG3# PGjSM.1#Zb ʑ^78Rc,8Id`T 9\	PKMcAQOZu~v wB>H '>f |lpO 	iJO@'Z[:gv^RU|P*n!l6e j Tw;*ISzd|3vJEǫT ZM$ j͠8uBaF gs5Pk2/NO-,7e jaScJ*޳!<@NuޟZ% SuRqSRi T޿%=>t  Gwd@U    IDATT ZQ)@MnaG*{S[ L>՘ ͅR7é:>I TՄ& 'd݄S` :g0& jœԄ (I۴6| ǌ/βm jű*5!P5G6\ Tկ-` :?;ݘ B⍚SK@՜ڧB fC9<P^2 "3z>65#|P͍Mab|XoGxp=  BӬj=5#f
b &@ V{_V sPMI}&VԚwӚ 2G*7߲zr~?̧
j0MM	5r T|'ۺ3 u2* q*5%
fS P ˔Sj](RS|aP)͍Malh1OSO~s0@gnT TS> #N1LܷMe>Qڻ]ӧaT TLSsjӚ ʡ7>JXUDw~3_mT T|BO"[ V7-=ۭhx|4#6 4>""NS7IeFDތ} rI@%ɲ>uQ(7M8rBe>|ضm&0f $.ԓ> eH|8_= ЄvR/LzSOM}C<Pg~e: ǟQP)P>uFc Ò2N෿ P.Rԍ zpdTR;Nw`Lj\ |JO`&66<zЛa»`#Ec3N7* )u%0T͍M%4@_ukAXߍ`&nT  >#d|76fz 4ӝFpϧ}  2g]WO=g 0kc`8Rw|N> C1 RNe>TӅ3MjfT  >S\Yw;aپgUClyvQи3* B}> '-0(F@J{
{7CVO' tΚaL cSRAO*`ZBLR[~i 0e'	
|> 2iHeBR[$N=È I>i"`@66@̇ybJ8Ι]F`'5FTLz67 '3Ռ R@e>ދOoDv#`vJE>!'m\pRG@̇"ɴ `*|Ƈ$ '	̇:Z/O=5x ("'U0ƙ@@y}XVOxv p:T0 I>it p<͍7};և?+|x$` <LI#tƏ8p j,|*!E+eVp1 BOIB+ p,cFTC~?~&#"m+| iLc Ԁ|Ȇ{~pMǩSpB(RIOZ= &:{=R1cةtH#>tF7 =mP d=*!V=V:N5 gsTj: 4{\TmaUy|Ƞ];wG^au 1㋳Yn2 *ImC m|*ް+aWUCYD[  )%'|1# T,o[z+nF̚78 8f|N	 (?ۺc Gimm6 >(&'
&5 1? |7U vI&vI;>Yp-j à2p~ǶB;u1 p
.!doBЯaA TصsWٺB:N5 &s"^TBxܦ 8g 0XIe^
k2"_sћ O݅RQO	
  0HIeׇ74:У7toY '+ݶb%}lh~zG# ?ed L(|3
  N|{M~@&Mo'!drט-p*cֽ-,m{2COfJŵ!nF>NŧևcF@M5 (Ie{6Nj͊'/Ġ贞jL5|H֤ࣺ	=>!cXHѴ|̩7d L)[Cl ح{
{7C7}[ tJE>"'\DaU=osƌ/βlx	>S( ԆSl|R  D.&kdoL @	Xt~v]i᧙!SdoLDʁ(I`'O2I|2P*n
!l=xLl.@|~ӷCe>PuB| ڜ*>YS  VޗU5!ԩ .JE߆'d  5%  G<Lf	ɬߜZa 7id-QH*ܷ>}8G, ȕ3NPxl>3d s @."	'(rǞb i|2P*!t"  Y2H$_~= @4>y Z%@ڭYDX?' f|q%a'!  &PuK9_QdO٢= @Ɍ<>W(I  `=aeyCҳݾֽ-ܴXIX@u~z2MO^F  o[XUި2Ȥ$=R@ s:gvY@e \(%߬M  He2mp?o" HǞ <S7Z Tyfa7.>  iP*@O H@my2e_2"rCOnJŭ!m zSȻ; ^Z'/]6
 @=%_2F.?ҿJ}  A6Dɕ߰U  Co^_6 :/>^>jgnA >\Gi3F[)jIe^
knQ@TicOYQ(w+y"'|
 gZBu2;-	@>  娓;if 6 ǗT_T P-&%o+|  Fe>ڹ+~N߳oʌO@'RT\|v wTңa7U Bx>#>yW  TԺKw|!+s p-?2 <{7  `Xlj ÐTo
o G :+odܘ-VURl߳탾P)kV<׮PT
oؓ[|7 2nt #=zm~J)|)-P	rBC	ɵZg  |ؿ'{OoM .y&' #\goe  ̇{m  L5 u{[ Dy'' q@y}Xv	POG*w  G[Q({|be #~ӷ#<o} ċO7-*-VTTv.ǚDAO#1 hIe{_VBI~bZNi5LlZW(716  Ae>@f$T  hJŭ7l  n*G> @Ժ hQ  "2 J¿ܹ "'*|R(wm  .Q?%߸V> @v;$6|b  "U*rd2  XTeDO  9VaWȡ];w ȿ1^
 @%+s* rk]TjFO |sDIOcK @ۑJ(  P*Ib$'fj rBe> GYD_B> @'Z|.4/{bw0Мqoԫv|
L	PZ9J!$vB80%&9%3XmĶ؎oX]ےŖKYJM/z|`ߦi%}oͭI?  vhlϾ2|t< P=3I:Ic	i:w TT^ʍw)+sscO &ъ7> +̍R P9|M!  K $K&CD~
  Me> Zǟ1G i74 +n Fkn  Gߌ_O3T rKt|}@Í-e*hSɯ~7 PNx!Oot @y/.s^J_>J} rL] n> @ILoV@G (PHt"oh5 +Gcay& 
  =5dp;  | zJkW @8}-U& TPyS_^|p  tLD8}Ý E*(Ro0^^>$KL@y's| J)O~?}IP#Ny(*spw 蠓Kgv<.-:@?R 3F;	F{W  htw= TJ} pBwQ V+Ο3V *G> @[kw!{> @{.J'm  %܃ )|%*S@L_>nn o,	s@ͷnTk*W7W >}x `&[* X{Ãy `c1pxq} 4J}+ݶ zK p
.T@^8pѺ h$P~7 ̔`|XoCɩOV꿳  Nk 5(N3+ ۩;'|}s T~~,v
 oT1Z+Q = ֨e̼ Jn(Cgcxm  _J}(/ |XoZn(2ƁS k47RJ#ǭ7d+|X&+̍  {X'>7 z`&zh2_P 4LI>@oLLz@e> j/t:Qxc = Y}3v|i[?}Τw?0fڝd鴙aiUcK| Sɯ~76{tO~~y	aeyeG.+ĳ*:q6HT4? .ZWٷM_@/ԇκ>	t	| tɥ%hN+GcayќTC;e
KM&$Y:V3CΛo	T@Z;Jq6I.| T@O}{6 TI|$C.~2 * [?׺`>:!@g9}m 4G 
fb>~3?G TD^۟*~ؓ*2s@md遈3KʃG`N.Ş)@?R (+M>֜2 *N>l;@g9}m"6q
B2 G> P2NC	𡽜蠋8	2 -Vkp}1tF|h#2E ӗr}h< = )|9E^x#*a^x\> mCNC{	͜ zeu!^?2 ġc*r23Jt\Nt%$M^Sw7ɬ ,:@>@g&N'. pOLCx| ~V+МhS>v@CS l!!ƻ*+}s { >t7 #=sq妏 X7F^};*i$- m7d9|$K8 ˡ1<v\]7S `>:Ma& cI t :)|6:8m4jeS l܂J}'{Kht :)|r7͢2 4U? m?`Y|>ؼK"2 $4_NfvNC,w5@{̄0zS tj/̩Of-`9}!>@{LLښj]fR tGߌ_O3xj켥lސBwKh[j,Gcayц0u!wclojJ4$Yz;EIL9̷n W濸p$] <Ϫԧ626E|>li#6V+s J} {.>tYNlεyT eR:8w`f\'2w$fb>~3?2 ([+]faTO,`v'Y2L=dh~6.*:ٺ{fҢ?$ ՑW?Orf6h{>6a:§zcT W?kTƕnY {>H"blQGY PiyocOԧ/˞ 6`*aCo`.#ՠ2 USz?hI 3hn;|$KKF `-ЧcQe> Pk*)W`ƊaG{C+ͺ %>uqZ4De> P{*)}h? ̠cIл`ZWLҙl]珪 %VOdf! 3= !`})|#U 4}y:P9RW>7 XP)|0%je6 4ޫ?]ԧ.L]ەdCI$Y:뒊rzY  s1=uq/ e> iӢgWnfO gΙ?,C$Yz "`f܃O{  *酏}h k3dP"|(A;X-ٷ꒗G  jR̠͌F30 J&3 M~|  /bxMi k0dAAvB@g]EM h7F^};* {(!>PoXK5Er| 6x7U~ d$	CI%Y[X^~yeG 耹tDp3NCy	
gZW+_{%    IDAT}+T	 i*ivM@		Ē,͛{..CZ;  *iyT  )|WUW #x+`SB ' J.҉'{Ssfl]=qi   7cǗu	C(1>T@ i=lPa| 0u!wcloj-˿Lo` =T * h;i 㖓Ӭjey'  (Ϫg]N<j` w7R4%'Htw~Ծ | Pz_ΚfC]Z`y\e> @Ũg h*@d遈gg w4RrqZ4$N,\4# 
RڕkVP 4U4!QspgZjօxy| +'d~`  w#ILD7;]\r
ۭVq}  5פ?k|a n_T );۝[tWW PSyocOg_O3i
C%Y:^;k8|6gߎK @?R8\L_R7-v@𡢒,1{-ƁSM @_&p >TS %~SV柾q  h$vG>[M@	,o܃LcK|  VO|*)- (>TΈGOY]p$c  ߅ׇύJC|t<k VT *Qp7TJ0Vu {gq5M]I: 'Ht8űKOXXֶ  8tL~;M@n*"vT )|{k&U n*w5} 8>D}|z~R/'[b|  6L~= ƒ,5>ΕÉ fcT iM{X1hP|? =n57)f~<Οk(  hRǞ]?7֊s=@J]P#|&g^;}ߚ>[ϯD  NxcWR4TDnnPONW_\G** +@ͼ@𡆊]v4ݙK/]4$N,\l(  袹%YzC:C}.s K_!Q  Jjq=`31 I5U:v-+7ލ72 S_nY45$+s1dgZW=sq妏 YXKI-	.4}@3M&YPE@#ZW/Cgcx4Q  PR}3v|i[?}ΊJț ͥ:jN5WTgN7/>
  * ?Wc{S*c> |ѼԘ әk;vauEe>  WgU{34 cЮ\v/b-e\?2 R_/O7}@@	!,]4ѹER^88wC  6Tޟ_ 3d騽C3Y*);'1N}B^[q(  [+]qeWwS$(3vY EF:|l2ayQ +'lN:֘
{dZCh>4L"bMs [̏ Jgx{-\] 4d-E4X 4F^Ngl]=+  @Sɯ⧏=RÎHhԅCUCv4-;)]0]Oe>  uxJ{O|1v%Y:a<|h$K1D~g\\Rt\  J_<]ׯpP%fS4dB<Te>  bRx\~M۵. 0X4$KQy<޸|  _J6ެ x$K4 .ҝMj7/iHXX  W?s#	O[ !KfQT49|Ve>  l?JMk+Au> VNOD. B/=r80{Je>  lJ;9@}IZ3 VUS4+̍   Rւє 4+gߎKU  P	*^MQ6j|` L"y@/8pd2  TxgAϥl m0dnV	S4ᅳ}S+[q Ǟ]?7PԜ||6EM.-~3ƖHeW  @71Z+Q9˫X2p+>pU@S\Vj2 W>:?R}6Rܕ U@Qd|  (	s jHu>pO|TMpui>..72]0]Oe>  J?#T$I>癘̏s%4  ݬVm=ڛ% m:/> Z;q-83;?)  '/Qs0ZS< /U@yy\e>  TGߌ_ڶr/|߽#	Rݱ?Ց8p  ؈D_n#*ӑ|
R X+U@mqytz]M.GU @4R?Aat	>	@ۨL*}&w
?)W  5SJ7Tk&L>PgG{W  zc+|Q X/U@-]]֕Z|Cgcx  jO{r%~O,P'uJwZoZ`T	>  MJ͗_/ h!z	u+wP7'.U f+_/O ž$KX/>!IU},GU  +ɯ*Y/S |`fx j|-Ņ#qpN  pU/&hMlXOuefߊ7.  j)q|
ȫG(>)E)u_KmW*y_?  =y?]R͗_/ ش)͵f	v,c&w|~3?Gϕ   Urбx.e;eb@-6MlZ;Mr?ٺ{f'%4  @!_*]`ӞO1%">	ŉJe  ڢLO[i I܀vJK1ٺӯsqZ4De>  veŋԁ|m@(&
ᅳ=&/U  tL+w?[0Pu,E]@[%Y:c@TJWI^  "WJ~5,$KUm%:!`2Y޾ٽS'.  Y|ߌw/n@h:A]Qd:8}r|ǿɡ1<|  g>Ty?޻RPag,h7>ŝ?Lyc"ƻq`  yTپ:YS3f@ynyeS   eJ*jJu>I| *_ǖK  ؈NU=l@t  o#wt\[N9W  հZM=Pa,=`@'	+1i7}
u%^}+6  P-yWc{M}y恪,(>-C@ Sye~rʋ    UWg?O?*ʯjs@7(TFN+7U  Gߌ_ڶJ}
,8>5INDl=/._  SV*nMtX]dIԁZ)օxyh\ZĮ Z+_x<]v߯PES ]#zakqg@%jew=  '17}gx ]P2mD7yCm>?uN	 _-v߻? h*'H@D<o@U[N  z1=+N=5?_?  =}./k*%@z,?j    =B$KDĠ-     c_zF>P
}6     -@YEĤm     e3u ='JShxP    nt=P|4,(N    @7<dIe|t܇    @L&YAe>PF    { (    ag(>PJ    C{;Rs>     m4d	|܇    @;(=>Pj    Ms(->Pz}6    Je|2wGl    up=PNd    X)U"f    X#"*x$     #	SDTN"b    p#I6j@%%Y3"     3CT A     
3ߎ{T [ßE     ޽@e	J+T!    +OZ7׿;"~`     4d	|,OO&    @L׭T -    ho[,v@mh*     c(	BJV    j$KZ3ן?mY    ZKT#+P;Nd`DL.    @L[+PG|/gl    6nMtJ:U<P    $K'+>PkŃv[    ,FjZ@_Pͦ    *i,R@94B1i     3{om@&R<    P3yxd}M xZ<    P~IN|Q![    (]IZ$|q,l    F,i=@F*Fl    t&5M%lx    f"bk4CV$"{S     s)	k 	|ђ,=[>    .N4^@s     , TwG    %YLC     tdD7 ,    謙ؒd9|JpAqK    @gB9B|    Jtn'ql     nW
pZ @_?g>     m1dQܝ 7A    L&Yܛ
}(3'    -p|Z<`    >31d鴹ܟ
}5$"&"a3    Xdq< kd院i     d` P<h    Htؘ N>F    $K`} 4ן9     n3d#X? T=     >3[`c 3X<    4LDlIt (>&[    @	@I`
    D[,yA`E    4$KX<	ڤ    hI[8@{<j:=f
    H>NY
    Ԙ di^?b    @MN3Tt@_hDf    DoItB	|,h    nFxY|*d   t
}.$"&"a    *f58r,=Sğ1o    b !W    T$KGm; ]TCf    T@[@xn    @OB|    ~Ђ O#E?b    @zHCŃ    (Ɉ	    (<ߒde CVJ`""`    @	J	|R<(    tˌ< %Q<    n D    @P(G""p~~    6 %d$     m&()>@IB|    KPbB|    ~@KPrB|      "+    ` !{}     >@   uT b    AT     }*JPQB|    . &0!>    p=@	*w#    4jZP}y.   q 5>@M#	    ">@   Q 5#!>    4 5$   ZԔ     PK{Ԙ    jExPs|   @-@ B|    4=@CB    $h>@   R #h!>    T $   R4     PJ{4X?    P
{{j5} 7ןRs    > +'#bQ    @OX!`    zBxg |F    ]%6| n#   !jZ_      F=oшxؔ    - ܓ 4"   `ӄ ܗ;$K'""??cR    a{ H	   `= kB5S    뒇[2 @Nf/DĤ   }	X7> dtQ/   !| M    4)` l-!>   { 6Ve l@_pDl3E    l5C F9%Y:#&	   @C	h'h   AF. i| j?ee    { J> mdi~vS   v	h7'舁0    58 m%cB|    jDx@(!>    51[,P : tT#1i    TqIN   I= "+n	GL   U#b   Pbc8 ]!'"9   F, M> =dn    { z	| zj?4"	    zl{Ö @蹁G#   $KG- ^P
}'`#    tQoIt5wP
IQI   K&  @_~6   ViC,t,m  IDAT   PFNPZ}yǆ    h,2P H@oRa   `'Y:l  4"   ؠLt (3> 0E   `f';
,ъ}   MF#{ 	| *g?l   piC* T@_`D=    b$Aj T@_^?"    I U$-BI   FIh  .> 7b   h"~ L@mhl   Q&#bK@	xV   a$A.&$KwG)<   v'G#b4"   j%?1d騵P7| jk#@D|   ja*"&Y:a ԑ m6   PicEx?m ԕ Fl   Fw@h-Ž:   @elOtغ h> 2hD   f"bhm /?   Jk2"4NX};#i?    2CIN[ M##b{   JaGxŽM   @oM d     4 pf   [s܋   ]   cw | [g>    m{ 'wF   )oa   l$K O k4Hq/   `M | X$Kpuo    XD<"s 6`0"   ]=d `-*   VI 
} ؠ-!   @L+9 m0׿3"6K   F"b(i?  q| h-Ef
   4L[8 l  h?+   Ps} !?0[   T@ۻ8m; x 0ʩLxpy4ipE>7Z̵"Iъsj|} ؒ/"bb>   003n\* l [TqY  [Dą => 쀕   @([ [$X    #> PYF3   $T`?=   mD\Y %4U}wV   ,K =    | 3 h*"]    {gD\[ %@MUi#w   ȲL9p ؿ/  r(ڈÕ    ;~/B<L@BMU_FMD   `Ok  TSe;   6de   5U4	   	 9	 MUG$"   Nˈg 	 MU՝   oTV?;0 Oi2"n"   t>v@ > PSq'   X(S Ek)?!   Pܖ_  =Ti?r   0Zˈgw> __ [YF?]%   CD &`@IDW   vz:ݸj  [   gϮ Cj2"nL  |g׮ GkL㟹g   vr:=J & FM<   [N+ &H  ^Z{ '4UN   ?ۍzU8 0BMUi   阺`L  @:`| 9   { @ b   = | o  `L   ?1   [g  4>   l{ | _5U}NDā  O1u + 4  w{+S    w>Ϯ > .e&":9   # J >ꋲV4>   ײsL kLs   eQ  ! Ty?r   в; | |t>ӈ0  ۈ8M0 lTSէe  `e% " [TUD\Gā  ``t7 $ [TayS  ` "j:=L `| `뚪>/!i  Cvt>qy 6}q  OˊA   ۈ8]0 TSmoq  Hl vB     oٵK vM    x(S.  ػK?q   A.j:9| `|  "Z}   v{Y}T  `G   `K Ԭ  ` R   zA zo   o`]> +> ;MU_|k  xͲʿv: @|q[ @LIDGğ.  5q* }d 赦ې?V  `ʺ _> 0}6Q  QYp?q @	 4UݮH>>  (|/oݿn `| `p>l.   (SϮ  OK>>  0x 4 /J>>  @?y  ۷񯽏  +޹ FC FFy  n= 0&> 0JMU_}   Ry(;  5U}^&~   {(߹ `| Be	G  `eƱ c' t4U}UBs  تeyf:8j   'MUk˗  ye  MUio  `#"R x %O"Y  |Cw|  & QSe"_  xE<t>s^  ' S	D  xբLO 	  Te  |v<  O o"Y  #,_  6]%  c]  `|  `Dn;. `3| -?/  00=   [Tq  L !  豇 O !!  葇2q  vC !  HL  `|    `| |  `{ $| D|  `{ d| |  `{ | Ą|  `~Dčp  B>  	e! & H	q  = @  =TaB>  N ) Ǆ|  XFĤq/  0 %_w)  FoJq  & LS՗B>  ޢ3q/  0PMU_g  cQ޷R  2/ @== 	  #Tq	9  Cwe  ' L	j  )ݖpz  C ;!   n7eUp 0B>  m̿,1i  -:  ߚ>/9  غ'  xMy'  l܏v~:;Z  |  ~N~u  '%{ W	  w Co 	  Ky'_  CsD   wېi>  GG {	  |Jy'""#i 0B a>  c>  #P޶x  6A `z `HѾk=Ϟ,  $ UMUB 57eޚ|  B `'>-! G~]  & SMUv9}  j'eޚ|  vF `o>/1T>  <h?q  샀 5U}\B|  vlYoL o>  4U}QBW7    L  HM  2|  >ȴ=    MU+S  ƢLOL >  Tyd[ Q o|  zL_	 0JM	/>   `4U}\B  vf:=n  @ `(! vEt>V  F `Ь Պ6?R  J `4 +  Qj<".K?)  H]?gw  W! `O:+_\  c% @Q˿,_ .   ^Q˿(o{/ `3]w g>  FSէ| Yv _ J̿*1 jw  F j|1 /?J8  x?  6@ FGg  >N  `|  "1   L  `|  1 Hj
q/ n	  gMUFeG رeg   Hw lɢDt>{t    I5U}܉g	 Τh  		  MUvbw7Ѿe_C |  衦W!߻ @ٷ~:8    zK(=){ @	  0 VhX  $ 5U}މw  I hn| ϔ=    #e: 1e  #'  ݷבS[&K7e  #'  ?i:! ؘZG
  t	  oY T}q    ukZ|  |  S>}06ޱ  6F  6J`kޱ  6F  J{  `g|  `} a(  $  {TZ?q# S;ް  F  i _.    Ti˵u  L  zvԔ> OXo>  G>  0kSEgz  `|  `ʔKnv=  0T>  0MUw&Wa_硄z Q QU  +  `+Qs5b=  ?	   o*8;W-+K  7|  Ohz5l?0BN.+}   >F  ذδ~79g:T=     ;R?Vު  -  `~wz*~`J_MԿ   %  $YſOFn_MO    C}Egiz    q?ԉ!    0"jzgye=     &a#ʿ}t>{v     {5U
UzP8
1}   x+  	~>Y"|g}tޠ79  	   USկ{Mx*љޜ  `_|   z^J  -:_:!  '>   |ϯ 6g=zn     >׬pgޮܿoOp         /.       O      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       H@      |       ط?,BJ|    IENDB`<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="./favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><link rel="apple-touch-icon" href="./icon.png"/><link rel="manifest" href="./manifest.json"/><script src="./env.js"></script><style>*,:after,:before{box-sizing:border-box}body{margin:0;background:0 0!important}.scroll_enabled{overflow:scroll}.scroll_enabled::-webkit-scrollbar{width:12px}.scroll_enabled::-webkit-scrollbar-corner{background:rgba(0,0,0,0)}.scroll_enabled::-webkit-scrollbar-thumb{background-color:#e861a3aa;border-radius:6px;border:4px solid transparent;background-clip:content-box}.scroll_enabled::-webkit-scrollbar-track{background-color:rgba(0,0,0,0)}</style><script defer="defer" src="./static/js/main.ff19a20a.js"></script></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>{
  "short_name": "Relay",
  "name": "Relay",
  "icons": [
    {
      "src": "icon.png",
      "sizes": "64x64 32x32 24x24 16x16",
      "type": "image/x-icon"
    },
    {
      "src": "icon.png",
      "type": "image/png",
      "sizes": "192x192"
    },
    {
      "src": "icon.png",
      "type": "image/png",
      "sizes": "512x512"
    }
  ],
  "start_url": ".",
  "display": "standalone",
  "theme_color": "#000000",
  "background_color": "#ffffff"
}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" enable-background="new 0 0 2032 2031" xml:space="preserve" viewBox="549.13 475.71 935.74 1081.71">
  <path 
    fill="none" 
    opacity="0.80" 
    stroke="#682c54" 
    stroke-width="15"
    d=" M1463.166016,760.192505   C1445.348633,831.218323 1413.649780,895.035217 1368.330444,951.877014   C1352.908325,971.220032 1336.252075,989.745972 1318.721191,1007.200317   C1294.658569,1031.158081 1268.282837,1052.499268 1239.894287,1071.376587   C1224.148560,1081.847046 1209.494263,1093.955933 1194.317261,1105.285278   C1180.206665,1115.818481 1166.017334,1126.246094 1151.931274,1136.811768   C1131.450317,1152.174072 1111.097534,1167.707520 1090.572998,1183.010986   C1034.940063,1224.491943 979.244507,1265.888672 923.575562,1307.321289   C889.266785,1332.856201 854.998352,1358.445312 820.646057,1383.921509   C762.101501,1427.338745 703.499939,1470.679077 644.934204,1514.067749   C631.030396,1524.368408 617.193787,1534.759644 603.274841,1545.039551   C601.056824,1546.677734 598.566895,1547.947632 595.332764,1549.917725   C590.647949,1539.167969 585.978699,1529.270264 581.976379,1519.109863   C571.884216,1493.489990 565.312866,1466.886597 561.245117,1439.701660   C557.023682,1411.489502 555.751770,1383.036621 557.201660,1354.584473   C560.231689,1295.123657 574.910522,1238.512695 600.049438,1184.542114   C618.149597,1145.683105 640.910095,1109.818481 668.491272,1077.050293   C678.662598,1064.966187 688.923584,1052.855713 700.179077,1041.812500   C713.186279,1029.050537 727.346680,1017.465149 740.987366,1005.347473   C776.379211,973.907288 815.862244,947.798889 853.515320,919.319946   C914.699097,873.043213 976.567688,827.672363 1038.112183,781.871887   C1091.379028,742.231323 1144.546387,702.456909 1197.849731,662.865662   C1259.703125,616.923828 1321.649414,571.107117 1383.572021,525.258423   C1400.958862,512.384827 1418.376221,499.552124 1435.839722,486.782776   C1440.858887,483.112610 1441.323730,483.320557 1444.103516,489.115662   C1458.081543,518.255554 1466.960693,548.915222 1472.150391,580.787781   C1477.014526,610.661621 1478.243774,640.708069 1476.792358,670.819824   C1475.343140,700.887146 1470.872070,730.604736 1463.166016,760.192505  z" 
  >
  </path>
  <path 
    fill="none" 
    opacity="0.80" 
    stroke="#73496b"
    stroke-width="15" 
    d=" M577.210449,518.455811   C580.463623,510.768555 583.458069,503.401733 586.668396,496.130219   C588.510315,491.958282 590.702698,487.941101 593.059814,483.206451   C595.259827,484.739502 596.856323,485.791351 598.389160,486.928894   C661.764893,533.959839 725.169678,580.951843 788.488953,628.058716   C814.804199,647.636230 841.194397,667.129089 867.052856,687.298523   C882.431824,699.294128 893.622314,714.851196 898.300232,734.087891   C902.316284,750.603210 900.258179,766.822632 893.143372,782.339844   C879.695068,811.669922 857.288757,833.280945 831.962646,852.032349   C782.458191,888.685242 732.594421,924.852905 682.872314,961.211731   C676.959167,965.535767 676.648743,965.541870 672.014282,959.882812   C644.580994,926.384399 621.173584,890.259949 603.358093,850.794861   C593.991699,830.046326 585.338196,808.831299 578.396301,787.175110   C571.882324,766.854187 567.390808,745.804016 563.257874,724.828735   C560.404602,710.347656 558.915100,695.485779 558.180298,680.726196   C557.132263,659.674316 556.484009,638.527771 557.288818,617.483765   C557.861206,602.514526 560.316956,587.482910 563.371094,572.777954   C566.939514,555.596619 572.076050,538.741089 576.516174,521.740051   C576.765625,520.784790 576.870178,519.791687 577.210449,518.455811  z" 
  >
  </path>
  <path 
    fill="none" 
    opacity="0.80" 
    stroke="#73496b"
    stroke-width="15" 
    d=" M1445.053467,1542.020752   C1443.638062,1544.648315 1442.351807,1546.924805 1440.730835,1549.794067   C1429.899048,1541.819824 1419.452393,1534.183105 1409.062012,1526.470581   C1332.054932,1469.311035 1255.042847,1412.158081 1178.072266,1354.949341   C1160.865112,1342.159912 1146.111572,1327.197021 1138.109253,1306.792603   C1133.508057,1295.060059 1131.929688,1283.149414 1134.569824,1270.386475   C1140.620728,1241.133911 1158.023193,1219.004883 1179.524414,1200.306885   C1200.578369,1181.997803 1223.335815,1165.600098 1245.776855,1148.944458   C1281.066406,1122.752686 1316.751587,1097.094238 1352.165894,1071.069336   C1355.921631,1068.309326 1358.213867,1068.371826 1361.247681,1072.074707   C1395.342529,1113.686768 1423.044678,1159.143188 1442.490112,1209.325806   C1450.167725,1229.139160 1456.780396,1249.488403 1462.110229,1270.051880   C1466.983398,1288.853027 1469.837036,1308.214722 1472.870361,1327.441528   C1474.635742,1338.632812 1475.352173,1350.027222 1475.913330,1361.361328   C1476.618408,1375.603271 1477.472534,1389.913940 1476.806763,1404.126831   C1476.097168,1419.276123 1474.246948,1434.434448 1471.866943,1449.425537   C1469.421875,1464.826416 1466.701172,1480.312988 1462.328125,1495.242676   C1457.701782,1511.037231 1450.985962,1526.219849 1445.053467,1542.020752  z"
  >
  </path>
</svg># https://www.robotstxt.org/robotstxt.html
User-agent: *
Disallow:
"use strict";(self.webpackChunkmedx_relay=self.webpackChunkmedx_relay||[]).push([[787],{787:function(e,t,n){n.r(t),n.d(t,{getCLS:function(){return y},getFCP:function(){return g},getFID:function(){return C},getLCP:function(){return P},getTTFB:function(){return D}});var i,r,a,o,u=function(e,t){return{name:e,value:void 0===t?-1:t,delta:0,entries:[],id:"v2-".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12)}},c=function(e,t){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){if("first-input"===e&&!("PerformanceEventTiming"in self))return;var n=new PerformanceObserver((function(e){return e.getEntries().map(t)}));return n.observe({type:e,buffered:!0}),n}}catch(e){}},f=function(e,t){var n=function n(i){"pagehide"!==i.type&&"hidden"!==document.visibilityState||(e(i),t&&(removeEventListener("visibilitychange",n,!0),removeEventListener("pagehide",n,!0)))};addEventListener("visibilitychange",n,!0),addEventListener("pagehide",n,!0)},s=function(e){addEventListener("pageshow",(function(t){t.persisted&&e(t)}),!0)},m=function(e,t,n){var i;return function(r){t.value>=0&&(r||n)&&(t.delta=t.value-(i||0),(t.delta||void 0===i)&&(i=t.value,e(t)))}},v=-1,d=function(){return"hidden"===document.visibilityState?0:1/0},p=function(){f((function(e){var t=e.timeStamp;v=t}),!0)},l=function(){return v<0&&(v=d(),p(),s((function(){setTimeout((function(){v=d(),p()}),0)}))),{get firstHiddenTime(){return v}}},g=function(e,t){var n,i=l(),r=u("FCP"),a=function(e){"first-contentful-paint"===e.name&&(f&&f.disconnect(),e.startTime<i.firstHiddenTime&&(r.value=e.startTime,r.entries.push(e),n(!0)))},o=window.performance&&performance.getEntriesByName&&performance.getEntriesByName("first-contentful-paint")[0],f=o?null:c("paint",a);(o||f)&&(n=m(e,r,t),o&&a(o),s((function(i){r=u("FCP"),n=m(e,r,t),requestAnimationFrame((function(){requestAnimationFrame((function(){r.value=performance.now()-i.timeStamp,n(!0)}))}))})))},h=!1,T=-1,y=function(e,t){h||(g((function(e){T=e.value})),h=!0);var n,i=function(t){T>-1&&e(t)},r=u("CLS",0),a=0,o=[],v=function(e){if(!e.hadRecentInput){var t=o[0],i=o[o.length-1];a&&e.startTime-i.startTime<1e3&&e.startTime-t.startTime<5e3?(a+=e.value,o.push(e)):(a=e.value,o=[e]),a>r.value&&(r.value=a,r.entries=o,n())}},d=c("layout-shift",v);d&&(n=m(i,r,t),f((function(){d.takeRecords().map(v),n(!0)})),s((function(){a=0,T=-1,r=u("CLS",0),n=m(i,r,t)})))},E={passive:!0,capture:!0},w=new Date,L=function(e,t){i||(i=t,r=e,a=new Date,F(removeEventListener),S())},S=function(){if(r>=0&&r<a-w){var e={entryType:"first-input",name:i.type,target:i.target,cancelable:i.cancelable,startTime:i.timeStamp,processingStart:i.timeStamp+r};o.forEach((function(t){t(e)})),o=[]}},b=function(e){if(e.cancelable){var t=(e.timeStamp>1e12?new Date:performance.now())-e.timeStamp;"pointerdown"==e.type?function(e,t){var n=function(){L(e,t),r()},i=function(){r()},r=function(){removeEventListener("pointerup",n,E),removeEventListener("pointercancel",i,E)};addEventListener("pointerup",n,E),addEventListener("pointercancel",i,E)}(t,e):L(t,e)}},F=function(e){["mousedown","keydown","touchstart","pointerdown"].forEach((function(t){return e(t,b,E)}))},C=function(e,t){var n,a=l(),v=u("FID"),d=function(e){e.startTime<a.firstHiddenTime&&(v.value=e.processingStart-e.startTime,v.entries.push(e),n(!0))},p=c("first-input",d);n=m(e,v,t),p&&f((function(){p.takeRecords().map(d),p.disconnect()}),!0),p&&s((function(){var a;v=u("FID"),n=m(e,v,t),o=[],r=-1,i=null,F(addEventListener),a=d,o.push(a),S()}))},k={},P=function(e,t){var n,i=l(),r=u("LCP"),a=function(e){var t=e.startTime;t<i.firstHiddenTime&&(r.value=t,r.entries.push(e),n())},o=c("largest-contentful-paint",a);if(o){n=m(e,r,t);var v=function(){k[r.id]||(o.takeRecords().map(a),o.disconnect(),k[r.id]=!0,n(!0))};["keydown","click"].forEach((function(e){addEventListener(e,v,{once:!0,capture:!0})})),f(v,!0),s((function(i){r=u("LCP"),n=m(e,r,t),requestAnimationFrame((function(){requestAnimationFrame((function(){r.value=performance.now()-i.timeStamp,k[r.id]=!0,n(!0)}))}))}))}},D=function(e){var t,n=u("TTFB");t=function(){try{var t=performance.getEntriesByType("navigation")[0]||function(){var e=performance.timing,t={entryType:"navigation",startTime:0};for(var n in e)"navigationStart"!==n&&"toJSON"!==n&&(t[n]=Math.max(e[n]-e.navigationStart,0));return t}();if(n.value=n.delta=t.responseStart,n.value<0||n.value>performance.now())return;n.entries=[t],e(n)}catch(e){}},"complete"===document.readyState?setTimeout(t,0):addEventListener("load",(function(){return setTimeout(t,0)}))}}}]);
//# sourceMappingURL=787.6fe45b4d.chunk.js.map/*! For license information please see main.ff19a20a.js.LICENSE.txt */
!function(){var e={6532:function(e,t){"use strict";var n,r=Symbol.for("react.element"),o=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),l=Symbol.for("react.profiler"),s=Symbol.for("react.provider"),u=Symbol.for("react.context"),c=Symbol.for("react.server_context"),d=Symbol.for("react.forward_ref"),f=Symbol.for("react.suspense"),p=Symbol.for("react.suspense_list"),h=Symbol.for("react.memo"),m=Symbol.for("react.lazy"),v=Symbol.for("react.offscreen");function g(e){if("object"===typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case i:case l:case a:case f:case p:return e;default:switch(e=e&&e.$$typeof){case c:case u:case d:case m:case h:case s:return e;default:return t}}case o:return t}}}n=Symbol.for("react.module.reference")},8457:function(e,t,n){"use strict";n(6532)},7408:function(e,t,n){var r=n(215).default,o=n(861).default,i=n(7061).default,a=n(7156).default,l=n(7424).default,s=n(1588).default,u=n(3808).default,c=n(1655).default,d=n(6389).default,f=n(2122).default,p=n(6690).default,h=n(9728).default,m=["refetchPage"],v=["pageParam"],g=["pageParam"];!function(e,t,n){"use strict";function y(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(n){if("default"!==n){var r=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,r.get?r:{enumerable:!0,get:function(){return e[n]}})}})),t.default=e,Object.freeze(t)}var x=y(t),b=function(){function e(){p(this,e),this.listeners=[],this.subscribe=this.subscribe.bind(this)}return h(e,[{key:"subscribe",value:function(e){var t=this;return this.listeners.push(e),this.onSubscribe(),function(){t.listeners=t.listeners.filter((function(t){return t!==e})),t.onUnsubscribe()}}},{key:"hasListeners",value:function(){return this.listeners.length>0}},{key:"onSubscribe",value:function(){}},{key:"onUnsubscribe",value:function(){}}]),e}(),w="undefined"==typeof window;function S(){}function j(e){return"number"==typeof e&&e>=0&&e!==1/0}function k(e,t){return e.filter((function(e){return-1===t.indexOf(e)}))}function C(e,t){return Math.max(e+(t||0)-Date.now(),0)}function R(e,t,n){return W(e)?"function"==typeof t?f(f({},n),{},{queryKey:e,queryFn:t}):f(f({},t),{},{queryKey:e}):e}function T(e,t,n){return W(e)?"function"==typeof t?f(f({},n),{},{mutationKey:e,mutationFn:t}):f(f({},t),{},{mutationKey:e}):"function"==typeof e?f(f({},t),{},{mutationFn:e}):f({},e)}function O(e,t,n){return W(e)?[f(f({},t),{},{queryKey:e}),n]:[e||{},t]}function P(e,t,n){return W(e)?[f(f({},t),{},{mutationKey:e}),n]:[e||{},t]}function E(e,t){var n=e.type,r=void 0===n?"all":n,o=e.exact,i=e.fetchStatus,a=e.predicate,l=e.queryKey,s=e.stale;if(W(l))if(o){if(t.queryHash!==_(l,t.options))return!1}else if(!I(t.queryKey,l))return!1;if("all"!==r){var u=t.isActive();if("active"===r&&!u)return!1;if("inactive"===r&&u)return!1}return("boolean"!=typeof s||t.isStale()===s)&&(void 0===i||i===t.state.fetchStatus)&&!(a&&!a(t))}function M(e,t){var n=e.exact,r=e.fetching,o=e.predicate,i=e.mutationKey;if(W(i)){if(!t.options.mutationKey)return!1;if(n){if(D(t.options.mutationKey)!==D(i))return!1}else if(!I(t.options.mutationKey,i))return!1}return("boolean"!=typeof r||"loading"===t.state.status===r)&&!(o&&!o(t))}function _(e,t){return((null==t?void 0:t.queryKeyHashFn)||D)(e)}function D(e){return JSON.stringify(e,(function(e,t){return z(t)?Object.keys(t).sort().reduce((function(e,n){return e[n]=t[n],e}),{}):t}))}function I(e,t){return A(e,t)}function A(e,t){return e===t||typeof e==typeof t&&!(!e||!t||"object"!=typeof e||"object"!=typeof t)&&!Object.keys(t).some((function(n){return!A(e[n],t[n])}))}function N(e,t){if(e===t)return e;var n=L(e)&&L(t);if(n||z(e)&&z(t)){for(var r=n?e.length:Object.keys(e).length,o=n?t:Object.keys(t),i=o.length,a=n?[]:{},l=0,s=0;s<i;s++){var u=n?s:o[s];a[u]=N(e[u],t[u]),a[u]===e[u]&&l++}return r===i&&l===r?e:a}return t}function L(e){return Array.isArray(e)&&e.length===Object.keys(e).length}function z(e){if(!F(e))return!1;var t=e.constructor;if(void 0===t)return!0;var n=t.prototype;return!!F(n)&&!!n.hasOwnProperty("isPrototypeOf")}function F(e){return"[object Object]"===Object.prototype.toString.call(e)}function W(e){return Array.isArray(e)}function B(e){return new Promise((function(t){setTimeout(t,e)}))}function V(e){B(0).then(e)}function q(e,t,n){return null!=n.isDataEqual&&n.isDataEqual(e,t)?e:!1!==n.structuralSharing?N(e,t):t}var H=new(function(e){c(n,e);var t=d(n);function n(){var e;return p(this,n),(e=t.call(this)).setup=function(e){if(!w&&window.addEventListener){var t=function(){return e()};return window.addEventListener("visibilitychange",t,!1),window.addEventListener("focus",t,!1),function(){window.removeEventListener("visibilitychange",t),window.removeEventListener("focus",t)}}},e}return h(n,[{key:"onSubscribe",value:function(){this.cleanup||this.setEventListener(this.setup)}},{key:"onUnsubscribe",value:function(){var e;this.hasListeners()||(null==(e=this.cleanup)||e.call(this),this.cleanup=void 0)}},{key:"setEventListener",value:function(e){var t,n=this;this.setup=e,null==(t=this.cleanup)||t.call(this),this.cleanup=e((function(e){"boolean"==typeof e?n.setFocused(e):n.onFocus()}))}},{key:"setFocused",value:function(e){this.focused=e,e&&this.onFocus()}},{key:"onFocus",value:function(){this.listeners.forEach((function(e){e()}))}},{key:"isFocused",value:function(){return"boolean"==typeof this.focused?this.focused:"undefined"==typeof document||[void 0,"visible","prerender"].includes(document.visibilityState)}}]),n}(b)),U=new(function(e){c(n,e);var t=d(n);function n(){var e;return p(this,n),(e=t.call(this)).setup=function(e){if(!w&&window.addEventListener){var t=function(){return e()};return window.addEventListener("online",t,!1),window.addEventListener("offline",t,!1),function(){window.removeEventListener("online",t),window.removeEventListener("offline",t)}}},e}return h(n,[{key:"onSubscribe",value:function(){this.cleanup||this.setEventListener(this.setup)}},{key:"onUnsubscribe",value:function(){var e;this.hasListeners()||(null==(e=this.cleanup)||e.call(this),this.cleanup=void 0)}},{key:"setEventListener",value:function(e){var t,n=this;this.setup=e,null==(t=this.cleanup)||t.call(this),this.cleanup=e((function(e){"boolean"==typeof e?n.setOnline(e):n.onOnline()}))}},{key:"setOnline",value:function(e){this.online=e,e&&this.onOnline()}},{key:"onOnline",value:function(){this.listeners.forEach((function(e){e()}))}},{key:"isOnline",value:function(){return"boolean"==typeof this.online?this.online:"undefined"==typeof navigator||void 0===navigator.onLine||navigator.onLine}}]),n}(b));function Y(e){return Math.min(1e3*Math.pow(2,e),3e4)}function G(e){return"online"!==(null!=e?e:"online")||U.isOnline()}var Q=h((function e(t){p(this,e),this.revert=null==t?void 0:t.revert,this.silent=null==t?void 0:t.silent}));function $(e){return e instanceof Q}function K(e){var t,n,r,o=!1,i=0,a=!1,l=new Promise((function(e,t){n=e,r=t})),s=function(){return!H.isFocused()||"always"!==e.networkMode&&!U.isOnline()},u=function(r){a||(a=!0,null==e.onSuccess||e.onSuccess(r),null==t||t(),n(r))},c=function(n){a||(a=!0,null==e.onError||e.onError(n),null==t||t(),r(n))},d=function(){return new Promise((function(n){t=function(e){if(a||!s())return n(e)},null==e.onPause||e.onPause()})).then((function(){t=void 0,a||null==e.onContinue||e.onContinue()}))},f=function t(){if(!a){var n;try{n=e.fn()}catch(e){n=Promise.reject(e)}Promise.resolve(n).then(u).catch((function(n){var r,l;if(!a){var u=null!=(r=e.retry)?r:3,f=null!=(l=e.retryDelay)?l:Y,p="function"==typeof f?f(i,n):f,h=!0===u||"number"==typeof u&&i<u||"function"==typeof u&&u(i,n);!o&&h?(i++,null==e.onFail||e.onFail(i,n),B(p).then((function(){if(s())return d()})).then((function(){o?c(n):t()}))):c(n)}}))}};return G(e.networkMode)?f():d().then(f),{promise:l,cancel:function(t){a||(c(new Q(t)),null==e.abort||e.abort())},continue:function(){null==t||t()},cancelRetry:function(){o=!0},continueRetry:function(){o=!1}}}var X=console,Z=function(){var e=[],t=0,n=function(e){e()},r=function(e){e()},o=function(r){t?e.push(r):V((function(){n(r)}))},i=function(){var t=e;e=[],t.length&&V((function(){r((function(){t.forEach((function(e){n(e)}))}))}))};return{batch:function(e){var n;t++;try{n=e()}finally{--t||i()}return n},batchCalls:function(e){return function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];o((function(){e.apply(void 0,n)}))}},schedule:o,setNotifyFunction:function(e){n=e},setBatchNotifyFunction:function(e){r=e}}}(),J=function(){function e(){p(this,e)}return h(e,[{key:"destroy",value:function(){this.clearGcTimeout()}},{key:"scheduleGc",value:function(){var e=this;this.clearGcTimeout(),j(this.cacheTime)&&(this.gcTimeout=setTimeout((function(){e.optionalRemove()}),this.cacheTime))}},{key:"updateCacheTime",value:function(e){this.cacheTime=Math.max(this.cacheTime||0,null!=e?e:w?1/0:3e5)}},{key:"clearGcTimeout",value:function(){this.gcTimeout&&(clearTimeout(this.gcTimeout),this.gcTimeout=void 0)}}]),e}(),ee=function(e){c(n,e);var t=d(n);function n(e){var r;return p(this,n),(r=t.call(this)).abortSignalConsumed=!1,r.defaultOptions=e.defaultOptions,r.setOptions(e.options),r.observers=[],r.cache=e.cache,r.logger=e.logger||X,r.queryKey=e.queryKey,r.queryHash=e.queryHash,r.initialState=e.state||function(e){var t="function"==typeof e.initialData?e.initialData():e.initialData,n=void 0!==e.initialData?"function"==typeof e.initialDataUpdatedAt?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0,r=void 0!==t;return{data:t,dataUpdateCount:0,dataUpdatedAt:r?null!=n?n:Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchMeta:null,isInvalidated:!1,status:r?"success":"loading",fetchStatus:"idle"}}(r.options),r.state=r.initialState,r.meta=e.meta,r}return h(n,[{key:"setOptions",value:function(e){this.options=f(f({},this.defaultOptions),e),this.meta=null==e?void 0:e.meta,this.updateCacheTime(this.options.cacheTime)}},{key:"optionalRemove",value:function(){this.observers.length||"idle"!==this.state.fetchStatus||this.cache.remove(this)}},{key:"setData",value:function(e,t){var n=q(this.state.data,e,this.options);return this.dispatch({data:n,type:"success",dataUpdatedAt:null==t?void 0:t.updatedAt,manual:null==t?void 0:t.manual}),n}},{key:"setState",value:function(e,t){this.dispatch({type:"setState",state:e,setStateOptions:t})}},{key:"cancel",value:function(e){var t,n=this.promise;return null==(t=this.retryer)||t.cancel(e),n?n.then(S).catch(S):Promise.resolve()}},{key:"destroy",value:function(){s(u(n.prototype),"destroy",this).call(this),this.cancel({silent:!0})}},{key:"reset",value:function(){this.destroy(),this.setState(this.initialState)}},{key:"isActive",value:function(){return this.observers.some((function(e){return!1!==e.options.enabled}))}},{key:"isDisabled",value:function(){return this.getObserversCount()>0&&!this.isActive()}},{key:"isStale",value:function(){return this.state.isInvalidated||!this.state.dataUpdatedAt||this.observers.some((function(e){return e.getCurrentResult().isStale}))}},{key:"isStaleByTime",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return this.state.isInvalidated||!this.state.dataUpdatedAt||!C(this.state.dataUpdatedAt,e)}},{key:"onFocus",value:function(){var e,t=this.observers.find((function(e){return e.shouldFetchOnWindowFocus()}));t&&t.refetch({cancelRefetch:!1}),null==(e=this.retryer)||e.continue()}},{key:"onOnline",value:function(){var e,t=this.observers.find((function(e){return e.shouldFetchOnReconnect()}));t&&t.refetch({cancelRefetch:!1}),null==(e=this.retryer)||e.continue()}},{key:"addObserver",value:function(e){-1===this.observers.indexOf(e)&&(this.observers.push(e),this.clearGcTimeout(),this.cache.notify({type:"observerAdded",query:this,observer:e}))}},{key:"removeObserver",value:function(e){-1!==this.observers.indexOf(e)&&(this.observers=this.observers.filter((function(t){return t!==e})),this.observers.length||(this.retryer&&(this.abortSignalConsumed?this.retryer.cancel({revert:!0}):this.retryer.cancelRetry()),this.scheduleGc()),this.cache.notify({type:"observerRemoved",query:this,observer:e}))}},{key:"getObserversCount",value:function(){return this.observers.length}},{key:"invalidate",value:function(){this.state.isInvalidated||this.dispatch({type:"invalidate"})}},{key:"fetch",value:function(e,t){var n,r,o=this;if("idle"!==this.state.fetchStatus)if(this.state.dataUpdatedAt&&null!=t&&t.cancelRefetch)this.cancel({silent:!0});else if(this.promise){var i;return null==(i=this.retryer)||i.continueRetry(),this.promise}if(e&&this.setOptions(e),!this.options.queryFn){var a=this.observers.find((function(e){return e.options.queryFn}));a&&this.setOptions(a.options)}Array.isArray(this.options.queryKey);var l=function(){if("function"==typeof AbortController)return new AbortController}(),s={queryKey:this.queryKey,pageParam:void 0,meta:this.meta},u=function(e){Object.defineProperty(e,"signal",{enumerable:!0,get:function(){if(l)return o.abortSignalConsumed=!0,l.signal}})};u(s);var c,d={fetchOptions:t,options:this.options,queryKey:this.queryKey,state:this.state,fetchFn:function(){return o.options.queryFn?(o.abortSignalConsumed=!1,o.options.queryFn(s)):Promise.reject("Missing queryFn")},meta:this.meta};u(d),null==(n=this.options.behavior)||n.onFetch(d),this.revertState=this.state,("idle"===this.state.fetchStatus||this.state.fetchMeta!==(null==(r=d.fetchOptions)?void 0:r.meta))&&this.dispatch({type:"fetch",meta:null==(c=d.fetchOptions)?void 0:c.meta});var f=function(e){var t,n;$(e)&&e.silent||o.dispatch({type:"error",error:e}),$(e)||null==(t=(n=o.cache.config).onError)||t.call(n,e,o),o.isFetchingOptimistic||o.scheduleGc(),o.isFetchingOptimistic=!1};return this.retryer=K({fn:d.fetchFn,abort:null==l?void 0:l.abort.bind(l),onSuccess:function(e){var t,n;void 0!==e?(o.setData(e),null==(t=(n=o.cache.config).onSuccess)||t.call(n,e,o),o.isFetchingOptimistic||o.scheduleGc(),o.isFetchingOptimistic=!1):f(new Error("Query data cannot be undefined"))},onError:f,onFail:function(){o.dispatch({type:"failed"})},onPause:function(){o.dispatch({type:"pause"})},onContinue:function(){o.dispatch({type:"continue"})},retry:d.options.retry,retryDelay:d.options.retryDelay,networkMode:d.options.networkMode}),this.promise=this.retryer.promise,this.promise}},{key:"dispatch",value:function(e){var t=this;this.state=function(n){var r,o;switch(e.type){case"failed":return f(f({},n),{},{fetchFailureCount:n.fetchFailureCount+1});case"pause":return f(f({},n),{},{fetchStatus:"paused"});case"continue":return f(f({},n),{},{fetchStatus:"fetching"});case"fetch":return f(f({},n),{},{fetchFailureCount:0,fetchMeta:null!=(r=e.meta)?r:null,fetchStatus:G(t.options.networkMode)?"fetching":"paused"},!n.dataUpdatedAt&&{error:null,status:"loading"});case"success":return f(f({},n),{},{data:e.data,dataUpdateCount:n.dataUpdateCount+1,dataUpdatedAt:null!=(o=e.dataUpdatedAt)?o:Date.now(),error:null,isInvalidated:!1,status:"success"},!e.manual&&{fetchStatus:"idle",fetchFailureCount:0});case"error":var i=e.error;return $(i)&&i.revert&&t.revertState?f({},t.revertState):f(f({},n),{},{error:i,errorUpdateCount:n.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:n.fetchFailureCount+1,fetchStatus:"idle",status:"error"});case"invalidate":return f(f({},n),{},{isInvalidated:!0});case"setState":return f(f({},n),e.state)}}(this.state),Z.batch((function(){t.observers.forEach((function(t){t.onQueryUpdate(e)})),t.cache.notify({query:t,type:"updated",action:e})}))}}]),n}(J),te=function(e){c(n,e);var t=d(n);function n(e){var r;return p(this,n),(r=t.call(this)).config=e||{},r.queries=[],r.queriesMap={},r}return h(n,[{key:"build",value:function(e,t,n){var r,o=t.queryKey,i=null!=(r=t.queryHash)?r:_(o,t),a=this.get(i);return a||(a=new ee({cache:this,logger:e.getLogger(),queryKey:o,queryHash:i,options:e.defaultQueryOptions(t),state:n,defaultOptions:e.getQueryDefaults(o),meta:t.meta}),this.add(a)),a}},{key:"add",value:function(e){this.queriesMap[e.queryHash]||(this.queriesMap[e.queryHash]=e,this.queries.push(e),this.notify({type:"added",query:e}))}},{key:"remove",value:function(e){var t=this.queriesMap[e.queryHash];t&&(e.destroy(),this.queries=this.queries.filter((function(t){return t!==e})),t===e&&delete this.queriesMap[e.queryHash],this.notify({type:"removed",query:e}))}},{key:"clear",value:function(){var e=this;Z.batch((function(){e.queries.forEach((function(t){e.remove(t)}))}))}},{key:"get",value:function(e){return this.queriesMap[e]}},{key:"getAll",value:function(){return this.queries}},{key:"find",value:function(e,t){var n=O(e,t),r=l(n,1)[0];return void 0===r.exact&&(r.exact=!0),this.queries.find((function(e){return E(r,e)}))}},{key:"findAll",value:function(e,t){var n=O(e,t),r=l(n,1)[0];return Object.keys(r).length>0?this.queries.filter((function(e){return E(r,e)})):this.queries}},{key:"notify",value:function(e){var t=this;Z.batch((function(){t.listeners.forEach((function(t){t(e)}))}))}},{key:"onFocus",value:function(){var e=this;Z.batch((function(){e.queries.forEach((function(e){e.onFocus()}))}))}},{key:"onOnline",value:function(){var e=this;Z.batch((function(){e.queries.forEach((function(e){e.onOnline()}))}))}}]),n}(b),ne=function(e){c(n,e);var t=d(n);function n(e){var r;return p(this,n),(r=t.call(this)).options=f(f({},e.defaultOptions),e.options),r.mutationId=e.mutationId,r.mutationCache=e.mutationCache,r.logger=e.logger||X,r.observers=[],r.state=e.state||re(),r.meta=e.meta,r.updateCacheTime(r.options.cacheTime),r.scheduleGc(),r}return h(n,[{key:"setState",value:function(e){this.dispatch({type:"setState",state:e})}},{key:"addObserver",value:function(e){-1===this.observers.indexOf(e)&&(this.observers.push(e),this.clearGcTimeout(),this.mutationCache.notify({type:"observerAdded",mutation:this,observer:e}))}},{key:"removeObserver",value:function(e){this.observers=this.observers.filter((function(t){return t!==e})),this.scheduleGc(),this.mutationCache.notify({type:"observerRemoved",mutation:this,observer:e})}},{key:"optionalRemove",value:function(){this.observers.length||("loading"===this.state.status?this.scheduleGc():this.mutationCache.remove(this))}},{key:"continue",value:function(){return this.retryer?(this.retryer.continue(),this.retryer.promise):this.execute()}},{key:"execute",value:function(){var e=a(i().mark((function e(){var t,n,r,o,a,l,s,u,c,d,f,p,h,m,v,g,y,x,b,w,S=this;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=function(){var e;return S.retryer=K({fn:function(){return S.options.mutationFn?S.options.mutationFn(S.state.variables):Promise.reject("No mutationFn found")},onFail:function(){S.dispatch({type:"failed"})},onPause:function(){S.dispatch({type:"pause"})},onContinue:function(){S.dispatch({type:"continue"})},retry:null!=(e=S.options.retry)?e:0,retryDelay:S.options.retryDelay,networkMode:S.options.networkMode}),S.retryer.promise},n="loading"===this.state.status,e.prev=1,n){e.next=8;break}return this.dispatch({type:"loading",variables:this.options.variables}),null==(c=(d=this.mutationCache.config).onMutate)||c.call(d,this.state.variables,this),e.next=6,null==(f=(p=this.options).onMutate)?void 0:f.call(p,this.state.variables);case 6:(h=e.sent)!==this.state.context&&this.dispatch({type:"loading",context:h,variables:this.state.variables});case 8:return e.next=10,t();case 10:return m=e.sent,null==(r=(o=this.mutationCache.config).onSuccess)||r.call(o,m,this.state.variables,this.state.context,this),e.next=14,null==(a=(l=this.options).onSuccess)?void 0:a.call(l,m,this.state.variables,this.state.context);case 14:return e.next=16,null==(s=(u=this.options).onSettled)?void 0:s.call(u,m,null,this.state.variables,this.state.context);case 16:return this.dispatch({type:"success",data:m}),e.abrupt("return",m);case 20:return e.prev=20,e.t0=e.catch(1),e.prev=22,null==(v=(g=this.mutationCache.config).onError)||v.call(g,e.t0,this.state.variables,this.state.context,this),e.next=26,null==(y=(x=this.options).onError)?void 0:y.call(x,e.t0,this.state.variables,this.state.context);case 26:return e.next=28,null==(b=(w=this.options).onSettled)?void 0:b.call(w,void 0,e.t0,this.state.variables,this.state.context);case 28:throw e.t0;case 29:return e.prev=29,this.dispatch({type:"error",error:e.t0}),e.finish(29);case 32:case"end":return e.stop()}}),e,this,[[1,20],[22,,29,32]])})));function t(){return e.apply(this,arguments)}return t}()},{key:"dispatch",value:function(e){var t=this;this.state=function(n){switch(e.type){case"failed":return f(f({},n),{},{failureCount:n.failureCount+1});case"pause":return f(f({},n),{},{isPaused:!0});case"continue":return f(f({},n),{},{isPaused:!1});case"loading":return f(f({},n),{},{context:e.context,data:void 0,error:null,isPaused:!G(t.options.networkMode),status:"loading",variables:e.variables});case"success":return f(f({},n),{},{data:e.data,error:null,status:"success",isPaused:!1});case"error":return f(f({},n),{},{data:void 0,error:e.error,failureCount:n.failureCount+1,isPaused:!1,status:"error"});case"setState":return f(f({},n),e.state)}}(this.state),Z.batch((function(){t.observers.forEach((function(t){t.onMutationUpdate(e)})),t.mutationCache.notify({mutation:t,type:"updated",action:e})}))}}]),n}(J);function re(){return{context:void 0,data:void 0,error:null,failureCount:0,isPaused:!1,status:"idle",variables:void 0}}var oe=function(e){c(n,e);var t=d(n);function n(e){var r;return p(this,n),(r=t.call(this)).config=e||{},r.mutations=[],r.mutationId=0,r}return h(n,[{key:"build",value:function(e,t,n){var r=new ne({mutationCache:this,logger:e.getLogger(),mutationId:++this.mutationId,options:e.defaultMutationOptions(t),state:n,defaultOptions:t.mutationKey?e.getMutationDefaults(t.mutationKey):void 0,meta:t.meta});return this.add(r),r}},{key:"add",value:function(e){this.mutations.push(e),this.notify({type:"added",mutation:e})}},{key:"remove",value:function(e){this.mutations=this.mutations.filter((function(t){return t!==e})),this.notify({type:"removed",mutation:e})}},{key:"clear",value:function(){var e=this;Z.batch((function(){e.mutations.forEach((function(t){e.remove(t)}))}))}},{key:"getAll",value:function(){return this.mutations}},{key:"find",value:function(e){return void 0===e.exact&&(e.exact=!0),this.mutations.find((function(t){return M(e,t)}))}},{key:"findAll",value:function(e){return this.mutations.filter((function(t){return M(e,t)}))}},{key:"notify",value:function(e){var t=this;Z.batch((function(){t.listeners.forEach((function(t){t(e)}))}))}},{key:"resumePausedMutations",value:function(){var e=this.mutations.filter((function(e){return e.state.isPaused}));return Z.batch((function(){return e.reduce((function(e,t){return e.then((function(){return t.continue().catch(S)}))}),Promise.resolve())}))}}]),n}(b);function ie(){return{onFetch:function(e){e.fetchFn=function(){var t,n,r,i,a,l,s,u=null==(t=e.fetchOptions)||null==(n=t.meta)?void 0:n.refetchPage,c=null==(r=e.fetchOptions)||null==(i=r.meta)?void 0:i.fetchMore,d=null==c?void 0:c.pageParam,f="forward"===(null==c?void 0:c.direction),p="backward"===(null==c?void 0:c.direction),h=(null==(a=e.state.data)?void 0:a.pages)||[],m=(null==(l=e.state.data)?void 0:l.pageParams)||[],v=m,g=!1,y=e.options.queryFn||function(){return Promise.reject("Missing queryFn")},x=function(e,t,n,r){return v=r?[t].concat(o(v)):[].concat(o(v),[t]),r?[n].concat(o(e)):[].concat(o(e),[n])},b=function(t,n,r,o){if(g)return Promise.reject("Cancelled");if(void 0===r&&!n&&t.length)return Promise.resolve(t);var i,a={queryKey:e.queryKey,pageParam:r,meta:e.meta};i=a,Object.defineProperty(i,"signal",{enumerable:!0,get:function(){var t,n;return null!=(t=e.signal)&&t.aborted?g=!0:null==(n=e.signal)||n.addEventListener("abort",(function(){g=!0})),e.signal}});var l=y(a);return Promise.resolve(l).then((function(e){return x(t,r,e,o)}))};if(h.length)if(f){var w=void 0!==d,S=w?d:ae(e.options,h);s=b(h,w,S)}else if(p){var j=void 0!==d,k=j?d:le(e.options,h);s=b(h,j,k,!0)}else!function(){v=[];var t=void 0===e.options.getNextPageParam;s=u&&h[0]&&!u(h[0],0,h)?Promise.resolve(x([],m[0],h[0])):b([],t,m[0]);for(var n=function(n){s=s.then((function(r){if(!u||!h[n]||u(h[n],n,h)){var o=t?m[n]:ae(e.options,r);return b(r,t,o)}return Promise.resolve(x(r,m[n],h[n]))}))},r=1;r<h.length;r++)n(r)}();else s=b([]);return s.then((function(e){return{pages:e,pageParams:v}}))}}}}function ae(e,t){return null==e.getNextPageParam?void 0:e.getNextPageParam(t[t.length-1],t)}function le(e,t){return null==e.getPreviousPageParam?void 0:e.getPreviousPageParam(t[0],t)}function se(e,t){if(e.getNextPageParam&&Array.isArray(t)){var n=ae(e,t);return null!=n&&!1!==n}}function ue(e,t){if(e.getPreviousPageParam&&Array.isArray(t)){var n=le(e,t);return null!=n&&!1!==n}}var ce=function(e){c(n,e);var t=d(n);function n(e,r){var o;return p(this,n),(o=t.call(this)).client=e,o.options=r,o.trackedProps=new Set,o.selectError=null,o.bindMethods(),o.setOptions(r),o}return h(n,[{key:"bindMethods",value:function(){this.remove=this.remove.bind(this),this.refetch=this.refetch.bind(this)}},{key:"onSubscribe",value:function(){1===this.listeners.length&&(this.currentQuery.addObserver(this),de(this.currentQuery,this.options)&&this.executeFetch(),this.updateTimers())}},{key:"onUnsubscribe",value:function(){this.listeners.length||this.destroy()}},{key:"shouldFetchOnReconnect",value:function(){return fe(this.currentQuery,this.options,this.options.refetchOnReconnect)}},{key:"shouldFetchOnWindowFocus",value:function(){return fe(this.currentQuery,this.options,this.options.refetchOnWindowFocus)}},{key:"destroy",value:function(){this.listeners=[],this.clearStaleTimeout(),this.clearRefetchInterval(),this.currentQuery.removeObserver(this)}},{key:"setOptions",value:function(e,t){var n=this.options,r=this.currentQuery;if(this.options=this.client.defaultQueryOptions(e),void 0!==this.options.enabled&&"boolean"!=typeof this.options.enabled)throw new Error("Expected enabled to be a boolean");this.options.queryKey||(this.options.queryKey=n.queryKey),this.updateQuery();var o=this.hasListeners();o&&pe(this.currentQuery,r,this.options,n)&&this.executeFetch(),this.updateResult(t),!o||this.currentQuery===r&&this.options.enabled===n.enabled&&this.options.staleTime===n.staleTime||this.updateStaleTimeout();var i=this.computeRefetchInterval();!o||this.currentQuery===r&&this.options.enabled===n.enabled&&i===this.currentRefetchInterval||this.updateRefetchInterval(i)}},{key:"getOptimisticResult",value:function(e){var t=this.client.getQueryCache().build(this.client,e);return this.createResult(t,e)}},{key:"getCurrentResult",value:function(){return this.currentResult}},{key:"trackResult",value:function(e){var t=this,n={};return Object.keys(e).forEach((function(r){Object.defineProperty(n,r,{configurable:!1,enumerable:!0,get:function(){return t.trackedProps.add(r),e[r]}})})),n}},{key:"getCurrentQuery",value:function(){return this.currentQuery}},{key:"remove",value:function(){this.client.getQueryCache().remove(this.currentQuery)}},{key:"refetch",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.refetchPage,n=r(e,m);return this.fetch(f(f({},n),{},{meta:{refetchPage:t}}))}},{key:"fetchOptimistic",value:function(e){var t=this,n=this.client.defaultQueryOptions(e),r=this.client.getQueryCache().build(this.client,n);return r.isFetchingOptimistic=!0,r.fetch().then((function(){return t.createResult(r,n)}))}},{key:"fetch",value:function(e){var t,n=this;return this.executeFetch(f(f({},e),{},{cancelRefetch:null==(t=e.cancelRefetch)||t})).then((function(){return n.updateResult(),n.currentResult}))}},{key:"executeFetch",value:function(e){this.updateQuery();var t=this.currentQuery.fetch(this.options,e);return null!=e&&e.throwOnError||(t=t.catch(S)),t}},{key:"updateStaleTimeout",value:function(){var e=this;if(this.clearStaleTimeout(),!w&&!this.currentResult.isStale&&j(this.options.staleTime)){var t=C(this.currentResult.dataUpdatedAt,this.options.staleTime)+1;this.staleTimeoutId=setTimeout((function(){e.currentResult.isStale||e.updateResult()}),t)}}},{key:"computeRefetchInterval",value:function(){var e;return"function"==typeof this.options.refetchInterval?this.options.refetchInterval(this.currentResult.data,this.currentQuery):null!=(e=this.options.refetchInterval)&&e}},{key:"updateRefetchInterval",value:function(e){var t=this;this.clearRefetchInterval(),this.currentRefetchInterval=e,!w&&!1!==this.options.enabled&&j(this.currentRefetchInterval)&&0!==this.currentRefetchInterval&&(this.refetchIntervalId=setInterval((function(){(t.options.refetchIntervalInBackground||H.isFocused())&&t.executeFetch()}),this.currentRefetchInterval))}},{key:"updateTimers",value:function(){this.updateStaleTimeout(),this.updateRefetchInterval(this.computeRefetchInterval())}},{key:"clearStaleTimeout",value:function(){this.staleTimeoutId&&(clearTimeout(this.staleTimeoutId),this.staleTimeoutId=void 0)}},{key:"clearRefetchInterval",value:function(){this.refetchIntervalId&&(clearInterval(this.refetchIntervalId),this.refetchIntervalId=void 0)}},{key:"createResult",value:function(e,t){var n,r=this.currentQuery,o=this.options,i=this.currentResult,a=this.currentResultState,l=this.currentResultOptions,s=e!==r,u=s?e.state:this.currentQueryInitialState,c=s?this.currentResult:this.previousQueryResult,d=e.state,f=d.dataUpdatedAt,p=d.error,h=d.errorUpdatedAt,m=d.fetchStatus,v=d.status,g=!1,y=!1;if(t._optimisticResults){var x=this.hasListeners(),b=!x&&de(e,t),w=x&&pe(e,r,t,o);(b||w)&&(m=G(e.options.networkMode)?"fetching":"paused",f||(v="loading")),"isRestoring"===t._optimisticResults&&(m="idle")}if(t.keepPreviousData&&!d.dataUpdateCount&&null!=c&&c.isSuccess&&"error"!==v)n=c.data,f=c.dataUpdatedAt,v=c.status,g=!0;else if(t.select&&void 0!==d.data)if(i&&d.data===(null==a?void 0:a.data)&&t.select===this.selectFn)n=this.selectResult;else try{this.selectFn=t.select,n=t.select(d.data),n=q(null==i?void 0:i.data,n,t),this.selectResult=n,this.selectError=null}catch(e){this.selectError=e}else n=d.data;if(void 0!==t.placeholderData&&void 0===n&&"loading"===v){var S;if(null!=i&&i.isPlaceholderData&&t.placeholderData===(null==l?void 0:l.placeholderData))S=i.data;else if(S="function"==typeof t.placeholderData?t.placeholderData():t.placeholderData,t.select&&void 0!==S)try{S=t.select(S),S=q(null==i?void 0:i.data,S,t),this.selectError=null}catch(e){this.selectError=e}void 0!==S&&(v="success",n=S,y=!0)}this.selectError&&(p=this.selectError,n=this.selectResult,h=Date.now(),v="error");var j="fetching"===m;return{status:v,fetchStatus:m,isLoading:"loading"===v,isSuccess:"success"===v,isError:"error"===v,data:n,dataUpdatedAt:f,error:p,errorUpdatedAt:h,failureCount:d.fetchFailureCount,errorUpdateCount:d.errorUpdateCount,isFetched:d.dataUpdateCount>0||d.errorUpdateCount>0,isFetchedAfterMount:d.dataUpdateCount>u.dataUpdateCount||d.errorUpdateCount>u.errorUpdateCount,isFetching:j,isRefetching:j&&"loading"!==v,isLoadingError:"error"===v&&0===d.dataUpdatedAt,isPaused:"paused"===m,isPlaceholderData:y,isPreviousData:g,isRefetchError:"error"===v&&0!==d.dataUpdatedAt,isStale:he(e,t),refetch:this.refetch,remove:this.remove}}},{key:"updateResult",value:function(e){var t=this,n=this.currentResult,r=this.createResult(this.currentQuery,this.options);if(this.currentResultState=this.currentQuery.state,this.currentResultOptions=this.options,!function(e,t){if(e&&!t||t&&!e)return!1;for(var n in e)if(e[n]!==t[n])return!1;return!0}(r,n)){this.currentResult=r;var o={cache:!0};!1!==(null==e?void 0:e.listeners)&&function(){if(!n)return!0;var e=t.options.notifyOnChangeProps;if("all"===e||!e&&!t.trackedProps.size)return!0;var r=new Set(null!=e?e:t.trackedProps);return t.options.useErrorBoundary&&r.add("error"),Object.keys(t.currentResult).some((function(e){var o=e;return t.currentResult[o]!==n[o]&&r.has(o)}))}()&&(o.listeners=!0),this.notify(f(f({},o),e))}}},{key:"updateQuery",value:function(){var e=this.client.getQueryCache().build(this.client,this.options);if(e!==this.currentQuery){var t=this.currentQuery;this.currentQuery=e,this.currentQueryInitialState=e.state,this.previousQueryResult=this.currentResult,this.hasListeners()&&(null==t||t.removeObserver(this),e.addObserver(this))}}},{key:"onQueryUpdate",value:function(e){var t={};"success"===e.type?t.onSuccess=!e.manual:"error"!==e.type||$(e.error)||(t.onError=!0),this.updateResult(t),this.hasListeners()&&this.updateTimers()}},{key:"notify",value:function(e){var t=this;Z.batch((function(){var n,r,o,i;if(e.onSuccess)null==(n=(r=t.options).onSuccess)||n.call(r,t.currentResult.data),null==(o=(i=t.options).onSettled)||o.call(i,t.currentResult.data,null);else if(e.onError){var a,l,s,u;null==(a=(l=t.options).onError)||a.call(l,t.currentResult.error),null==(s=(u=t.options).onSettled)||s.call(u,void 0,t.currentResult.error)}e.listeners&&t.listeners.forEach((function(e){e(t.currentResult)})),e.cache&&t.client.getQueryCache().notify({query:t.currentQuery,type:"observerResultsUpdated"})}))}}]),n}(b);function de(e,t){return function(e,t){return!(!1===t.enabled||e.state.dataUpdatedAt||"error"===e.state.status&&!1===t.retryOnMount)}(e,t)||e.state.dataUpdatedAt>0&&fe(e,t,t.refetchOnMount)}function fe(e,t,n){if(!1!==t.enabled){var r="function"==typeof n?n(e):n;return"always"===r||!1!==r&&he(e,t)}return!1}function pe(e,t,n,r){return!1!==n.enabled&&(e!==t||!1===r.enabled)&&(!n.suspense||"error"!==e.state.status)&&he(e,n)}function he(e,t){return e.isStaleByTime(t.staleTime)}var me=function(e){c(n,e);var t=d(n);function n(e,r){var o;return p(this,n),(o=t.call(this)).client=e,o.queries=[],o.result=[],o.observers=[],o.observersMap={},r&&o.setQueries(r),o}return h(n,[{key:"onSubscribe",value:function(){var e=this;1===this.listeners.length&&this.observers.forEach((function(t){t.subscribe((function(n){e.onUpdate(t,n)}))}))}},{key:"onUnsubscribe",value:function(){this.listeners.length||this.destroy()}},{key:"destroy",value:function(){this.listeners=[],this.observers.forEach((function(e){e.destroy()}))}},{key:"setQueries",value:function(e,t){var n=this;this.queries=e,Z.batch((function(){var e=n.observers,r=n.findMatchingObservers(n.queries);r.forEach((function(e){return e.observer.setOptions(e.defaultedQueryOptions,t)}));var o=r.map((function(e){return e.observer})),i=Object.fromEntries(o.map((function(e){return[e.options.queryHash,e]}))),a=o.map((function(e){return e.getCurrentResult()})),l=o.some((function(t,n){return t!==e[n]}));(e.length!==o.length||l)&&(n.observers=o,n.observersMap=i,n.result=a,n.hasListeners()&&(k(e,o).forEach((function(e){e.destroy()})),k(o,e).forEach((function(e){e.subscribe((function(t){n.onUpdate(e,t)}))})),n.notify()))}))}},{key:"getCurrentResult",value:function(){return this.result}},{key:"getOptimisticResult",value:function(e){return this.findMatchingObservers(e).map((function(e){return e.observer.getOptimisticResult(e.defaultedQueryOptions)}))}},{key:"findMatchingObservers",value:function(e){var t=this,n=this.observers,r=e.map((function(e){return t.client.defaultQueryOptions(e)})),o=r.flatMap((function(e){var t=n.find((function(t){return t.options.queryHash===e.queryHash}));return null!=t?[{defaultedQueryOptions:e,observer:t}]:[]})),i=o.map((function(e){return e.defaultedQueryOptions.queryHash})),a=r.filter((function(e){return!i.includes(e.queryHash)})),l=n.filter((function(e){return!o.some((function(t){return t.observer===e}))})),s=function(e){var n=t.client.defaultQueryOptions(e),r=t.observersMap[n.queryHash];return null!=r?r:new ce(t.client,n)},u=a.map((function(e,t){if(e.keepPreviousData){var n=l[t];if(void 0!==n)return{defaultedQueryOptions:e,observer:n}}return{defaultedQueryOptions:e,observer:s(e)}}));return o.concat(u).sort((function(e,t){return r.indexOf(e.defaultedQueryOptions)-r.indexOf(t.defaultedQueryOptions)}))}},{key:"onUpdate",value:function(e,t){var n=this.observers.indexOf(e);-1!==n&&(this.result=function(e,t,n){var r=e.slice(0);return r[t]=n,r}(this.result,n,t),this.notify())}},{key:"notify",value:function(){var e=this;Z.batch((function(){e.listeners.forEach((function(t){t(e.result)}))}))}}]),n}(b),ve=function(e){c(n,e);var t=d(n);function n(e,r){return p(this,n),t.call(this,e,r)}return h(n,[{key:"bindMethods",value:function(){s(u(n.prototype),"bindMethods",this).call(this),this.fetchNextPage=this.fetchNextPage.bind(this),this.fetchPreviousPage=this.fetchPreviousPage.bind(this)}},{key:"setOptions",value:function(e,t){s(u(n.prototype),"setOptions",this).call(this,f(f({},e),{},{behavior:ie()}),t)}},{key:"getOptimisticResult",value:function(e){return e.behavior=ie(),s(u(n.prototype),"getOptimisticResult",this).call(this,e)}},{key:"fetchNextPage",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.pageParam,n=r(e,v);return this.fetch(f(f({},n),{},{meta:{fetchMore:{direction:"forward",pageParam:t}}}))}},{key:"fetchPreviousPage",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.pageParam,n=r(e,g);return this.fetch(f(f({},n),{},{meta:{fetchMore:{direction:"backward",pageParam:t}}}))}},{key:"createResult",value:function(e,t){var r,o,i,a,l,c,d=e.state;return f(f({},s(u(n.prototype),"createResult",this).call(this,e,t)),{},{fetchNextPage:this.fetchNextPage,fetchPreviousPage:this.fetchPreviousPage,hasNextPage:se(t,null==(r=d.data)?void 0:r.pages),hasPreviousPage:ue(t,null==(o=d.data)?void 0:o.pages),isFetchingNextPage:"fetching"===d.fetchStatus&&"forward"===(null==(i=d.fetchMeta)||null==(a=i.fetchMore)?void 0:a.direction),isFetchingPreviousPage:"fetching"===d.fetchStatus&&"backward"===(null==(l=d.fetchMeta)||null==(c=l.fetchMore)?void 0:c.direction)})}}]),n}(ce),ge=function(e){c(n,e);var t=d(n);function n(e,r){var o;return p(this,n),(o=t.call(this)).client=e,o.setOptions(r),o.bindMethods(),o.updateResult(),o}return h(n,[{key:"bindMethods",value:function(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}},{key:"setOptions",value:function(e){this.options=this.client.defaultMutationOptions(e)}},{key:"onUnsubscribe",value:function(){var e;this.listeners.length||null==(e=this.currentMutation)||e.removeObserver(this)}},{key:"onMutationUpdate",value:function(e){this.updateResult();var t={listeners:!0};"success"===e.type?t.onSuccess=!0:"error"===e.type&&(t.onError=!0),this.notify(t)}},{key:"getCurrentResult",value:function(){return this.currentResult}},{key:"reset",value:function(){this.currentMutation=void 0,this.updateResult(),this.notify({listeners:!0})}},{key:"mutate",value:function(e,t){return this.mutateOptions=t,this.currentMutation&&this.currentMutation.removeObserver(this),this.currentMutation=this.client.getMutationCache().build(this.client,f(f({},this.options),{},{variables:void 0!==e?e:this.options.variables})),this.currentMutation.addObserver(this),this.currentMutation.execute()}},{key:"updateResult",value:function(){var e=this.currentMutation?this.currentMutation.state:{context:void 0,data:void 0,error:null,failureCount:0,isPaused:!1,status:"idle",variables:void 0},t=f(f({},e),{},{isLoading:"loading"===e.status,isSuccess:"success"===e.status,isError:"error"===e.status,isIdle:"idle"===e.status,mutate:this.mutate,reset:this.reset});this.currentResult=t}},{key:"notify",value:function(e){var t=this;Z.batch((function(){var n,r,o,i;if(t.mutateOptions)if(e.onSuccess)null==(n=(r=t.mutateOptions).onSuccess)||n.call(r,t.currentResult.data,t.currentResult.variables,t.currentResult.context),null==(o=(i=t.mutateOptions).onSettled)||o.call(i,t.currentResult.data,null,t.currentResult.variables,t.currentResult.context);else if(e.onError){var a,l,s,u;null==(a=(l=t.mutateOptions).onError)||a.call(l,t.currentResult.error,t.currentResult.variables,t.currentResult.context),null==(s=(u=t.mutateOptions).onSettled)||s.call(u,void 0,t.currentResult.error,t.currentResult.variables,t.currentResult.context)}e.listeners&&t.listeners.forEach((function(e){e(t.currentResult)}))}))}}]),n}(b);function ye(e){return e.state.isPaused}function xe(e){return"success"===e.state.status}function be(e,t,n){if("object"==typeof t&&null!==t){var r=e.getMutationCache(),o=e.getQueryCache(),i=t.mutations||[],a=t.queries||[];i.forEach((function(t){var o;r.build(e,f(f({},null==n||null==(o=n.defaultOptions)?void 0:o.mutations),{},{mutationKey:t.mutationKey}),t.state)})),a.forEach((function(t){var r,i=o.get(t.queryHash);i?i.state.dataUpdatedAt<t.state.dataUpdatedAt&&i.setState(t.state):o.build(e,f(f({},null==n||null==(r=n.defaultOptions)?void 0:r.queries),{},{queryKey:t.queryKey,queryHash:t.queryHash}),t.state)}))}}var we=x.createContext(void 0),Se=x.createContext(!1);function je(e,t){return e||(t&&"undefined"!=typeof window?(window.ReactQueryClientContext||(window.ReactQueryClientContext=we),window.ReactQueryClientContext):we)}var ke=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}).context,t=x.useContext(je(e,x.useContext(Se)));if(!t)throw new Error("No QueryClient set, use QueryClientProvider to set one");return t},Ce=x.createContext(!1),Re=function(){return x.useContext(Ce)},Te=Ce.Provider;function Oe(){var e=!1;return{clearReset:function(){e=!1},reset:function(){e=!0},isReset:function(){return e}}}var Pe=x.createContext(Oe()),Ee=function(){return x.useContext(Pe)};function Me(e,t){return"function"==typeof e?e.apply(void 0,o(t)):!!e}function _e(e,t){var r=ke({context:e.context}),o=Re(),i=Ee(),a=r.defaultQueryOptions(e);a._optimisticResults=o?"isRestoring":"optimistic",a.onError&&(a.onError=Z.batchCalls(a.onError)),a.onSuccess&&(a.onSuccess=Z.batchCalls(a.onSuccess)),a.onSettled&&(a.onSettled=Z.batchCalls(a.onSettled)),a.suspense&&"number"!=typeof a.staleTime&&(a.staleTime=1e3),(a.suspense||a.useErrorBoundary)&&(i.isReset()||(a.retryOnMount=!1));var s=x.useState((function(){return new t(r,a)})),u=l(s,1)[0],c=u.getOptimisticResult(a);if(n.useSyncExternalStore(x.useCallback((function(e){return o?function(){}:u.subscribe(Z.batchCalls(e))}),[u,o]),(function(){return u.getCurrentResult()}),(function(){return u.getCurrentResult()})),x.useEffect((function(){i.clearReset()}),[i]),x.useEffect((function(){u.setOptions(a,{listeners:!1})}),[a,u]),a.suspense&&c.isLoading&&c.isFetching&&!o)throw u.fetchOptimistic(a).then((function(e){var t=e.data;null==a.onSuccess||a.onSuccess(t),null==a.onSettled||a.onSettled(t,null)})).catch((function(e){i.clearReset(),null==a.onError||a.onError(e),null==a.onSettled||a.onSettled(void 0,e)}));if(c.isError&&!i.isReset()&&!c.isFetching&&Me(a.useErrorBoundary,[c.error,u.getCurrentQuery()]))throw c.error;return a.notifyOnChangeProps?c:u.trackResult(c)}function De(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=ke({context:t.context}),r=x.useRef(t);r.current=t,x.useMemo((function(){e&&be(n,e,r.current)}),[n,e])}function Ie(){}e.CancelledError=Q,e.Hydrate=function(e){var t=e.children,n=e.options;return De(e.state,n),t},e.InfiniteQueryObserver=ve,e.IsRestoringProvider=Te,e.MutationCache=oe,e.MutationObserver=ge,e.QueriesObserver=me,e.QueryCache=te,e.QueryClient=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};p(this,e),this.queryCache=t.queryCache||new te,this.mutationCache=t.mutationCache||new oe,this.logger=t.logger||X,this.defaultOptions=t.defaultOptions||{},this.queryDefaults=[],this.mutationDefaults=[]}return h(e,[{key:"mount",value:function(){var e=this;this.unsubscribeFocus=H.subscribe((function(){H.isFocused()&&(e.resumePausedMutations(),e.queryCache.onFocus())})),this.unsubscribeOnline=U.subscribe((function(){U.isOnline()&&(e.resumePausedMutations(),e.queryCache.onOnline())}))}},{key:"unmount",value:function(){var e,t;null==(e=this.unsubscribeFocus)||e.call(this),null==(t=this.unsubscribeOnline)||t.call(this)}},{key:"isFetching",value:function(e,t){var n=O(e,t),r=l(n,1)[0];return r.fetchStatus="fetching",this.queryCache.findAll(r).length}},{key:"isMutating",value:function(e){return this.mutationCache.findAll(f(f({},e),{},{fetching:!0})).length}},{key:"getQueryData",value:function(e,t){var n;return null==(n=this.queryCache.find(e,t))?void 0:n.state.data}},{key:"getQueriesData",value:function(e){return this.getQueryCache().findAll(e).map((function(e){return[e.queryKey,e.state.data]}))}},{key:"setQueryData",value:function(e,t,n){var r=this.queryCache.find(e),o=function(e,t){return"function"==typeof e?e(t):e}(t,null==r?void 0:r.state.data);if(void 0!==o){var i=R(e),a=this.defaultQueryOptions(i);return this.queryCache.build(this,a).setData(o,f(f({},n),{},{manual:!0}))}}},{key:"setQueriesData",value:function(e,t,n){var r=this;return Z.batch((function(){return r.getQueryCache().findAll(e).map((function(e){var o=e.queryKey;return[o,r.setQueryData(o,t,n)]}))}))}},{key:"getQueryState",value:function(e,t){var n;return null==(n=this.queryCache.find(e,t))?void 0:n.state}},{key:"removeQueries",value:function(e,t){var n=O(e,t),r=l(n,1)[0],o=this.queryCache;Z.batch((function(){o.findAll(r).forEach((function(e){o.remove(e)}))}))}},{key:"resetQueries",value:function(e,t,n){var r=this,o=O(e,t,n),i=l(o,2),a=i[0],s=i[1],u=this.queryCache,c=f({type:"active"},a);return Z.batch((function(){return u.findAll(a).forEach((function(e){e.reset()})),r.refetchQueries(c,s)}))}},{key:"cancelQueries",value:function(e,t,n){var r=this,o=O(e,t,n),i=l(o,2),a=i[0],s=i[1],u=void 0===s?{}:s;void 0===u.revert&&(u.revert=!0);var c=Z.batch((function(){return r.queryCache.findAll(a).map((function(e){return e.cancel(u)}))}));return Promise.all(c).then(S).catch(S)}},{key:"invalidateQueries",value:function(e,t,n){var r=this,o=O(e,t,n),i=l(o,2),a=i[0],s=i[1];return Z.batch((function(){var e,t;if(r.queryCache.findAll(a).forEach((function(e){e.invalidate()})),"none"===a.refetchType)return Promise.resolve();var n=f(f({},a),{},{type:null!=(e=null!=(t=a.refetchType)?t:a.type)?e:"active"});return r.refetchQueries(n,s)}))}},{key:"refetchQueries",value:function(e,t,n){var r=this,o=O(e,t,n),i=l(o,2),a=i[0],s=i[1],u=Z.batch((function(){return r.queryCache.findAll(a).filter((function(e){return!e.isDisabled()})).map((function(e){var t;return e.fetch(void 0,f(f({},s),{},{cancelRefetch:null==(t=null==s?void 0:s.cancelRefetch)||t,meta:{refetchPage:a.refetchPage}}))}))})),c=Promise.all(u).then(S);return null!=s&&s.throwOnError||(c=c.catch(S)),c}},{key:"fetchQuery",value:function(e,t,n){var r=R(e,t,n),o=this.defaultQueryOptions(r);void 0===o.retry&&(o.retry=!1);var i=this.queryCache.build(this,o);return i.isStaleByTime(o.staleTime)?i.fetch(o):Promise.resolve(i.state.data)}},{key:"prefetchQuery",value:function(e,t,n){return this.fetchQuery(e,t,n).then(S).catch(S)}},{key:"fetchInfiniteQuery",value:function(e,t,n){var r=R(e,t,n);return r.behavior=ie(),this.fetchQuery(r)}},{key:"prefetchInfiniteQuery",value:function(e,t,n){return this.fetchInfiniteQuery(e,t,n).then(S).catch(S)}},{key:"resumePausedMutations",value:function(){return this.mutationCache.resumePausedMutations()}},{key:"getQueryCache",value:function(){return this.queryCache}},{key:"getMutationCache",value:function(){return this.mutationCache}},{key:"getLogger",value:function(){return this.logger}},{key:"getDefaultOptions",value:function(){return this.defaultOptions}},{key:"setDefaultOptions",value:function(e){this.defaultOptions=e}},{key:"setQueryDefaults",value:function(e,t){var n=this.queryDefaults.find((function(t){return D(e)===D(t.queryKey)}));n?n.defaultOptions=t:this.queryDefaults.push({queryKey:e,defaultOptions:t})}},{key:"getQueryDefaults",value:function(e){if(e){var t=this.queryDefaults.find((function(t){return I(e,t.queryKey)}));return null==t?void 0:t.defaultOptions}}},{key:"setMutationDefaults",value:function(e,t){var n=this.mutationDefaults.find((function(t){return D(e)===D(t.mutationKey)}));n?n.defaultOptions=t:this.mutationDefaults.push({mutationKey:e,defaultOptions:t})}},{key:"getMutationDefaults",value:function(e){if(e){var t=this.mutationDefaults.find((function(t){return I(e,t.mutationKey)}));return null==t?void 0:t.defaultOptions}}},{key:"defaultQueryOptions",value:function(e){if(null!=e&&e._defaulted)return e;var t=f(f(f(f({},this.defaultOptions.queries),this.getQueryDefaults(null==e?void 0:e.queryKey)),e),{},{_defaulted:!0});return!t.queryHash&&t.queryKey&&(t.queryHash=_(t.queryKey,t)),void 0===t.refetchOnReconnect&&(t.refetchOnReconnect="always"!==t.networkMode),void 0===t.useErrorBoundary&&(t.useErrorBoundary=!!t.suspense),t}},{key:"defaultMutationOptions",value:function(e){return null!=e&&e._defaulted?e:f(f(f(f({},this.defaultOptions.mutations),this.getMutationDefaults(null==e?void 0:e.mutationKey)),e),{},{_defaulted:!0})}},{key:"clear",value:function(){this.queryCache.clear(),this.mutationCache.clear()}}]),e}(),e.QueryClientProvider=function(e){var t=e.client,n=e.children,r=e.context,o=e.contextSharing,i=void 0!==o&&o;x.useEffect((function(){return t.mount(),function(){t.unmount()}}),[t]);var a=je(r,i);return x.createElement(Se.Provider,{value:!r&&i},x.createElement(a.Provider,{value:t},n))},e.QueryErrorResetBoundary=function(e){var t=e.children,n=x.useState((function(){return Oe()})),r=l(n,1)[0];return x.createElement(Pe.Provider,{value:r},"function"==typeof t?t(r):t)},e.QueryObserver=ce,e.defaultContext=we,e.dehydrate=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=[],r=[];if(!1!==t.dehydrateMutations){var o=t.shouldDehydrateMutation||ye;e.getMutationCache().getAll().forEach((function(e){o(e)&&n.push(function(e){return{mutationKey:e.options.mutationKey,state:e.state}}(e))}))}if(!1!==t.dehydrateQueries){var i=t.shouldDehydrateQuery||xe;e.getQueryCache().getAll().forEach((function(e){i(e)&&r.push(function(e){return{state:e.state,queryKey:e.queryKey,queryHash:e.queryHash}}(e))}))}return{mutations:n,queries:r}},e.focusManager=H,e.hashQueryKey=D,e.hydrate=be,e.isCancelledError=$,e.isError=function(e){return e instanceof Error},e.notifyManager=Z,e.onlineManager=U,e.parseFilterArgs=O,e.parseMutationArgs=T,e.parseMutationFilterArgs=P,e.parseQueryArgs=R,e.useHydrate=De,e.useInfiniteQuery=function(e,t,n){return _e(R(e,t,n),ve)},e.useIsFetching=function(e,t,r){var o=O(e,t,r),i=l(o,2),a=i[0],s=i[1],u=ke({context:(void 0===s?{}:s).context}),c=u.getQueryCache();return n.useSyncExternalStore(x.useCallback((function(e){return c.subscribe(Z.batchCalls(e))}),[c]),(function(){return u.isFetching(a)}),(function(){return u.isFetching(a)}))},e.useIsMutating=function(e,t,r){var o=P(e,t,r),i=l(o,2),a=i[0],s=i[1],u=ke({context:(void 0===s?{}:s).context}),c=u.getMutationCache();return n.useSyncExternalStore(x.useCallback((function(e){return c.subscribe(Z.batchCalls(e))}),[c]),(function(){return u.isMutating(a)}),(function(){return u.isMutating(a)}))},e.useIsRestoring=Re,e.useMutation=function(e,t,r){var o=T(e,t,r),i=ke({context:o.context}),a=x.useState((function(){return new ge(i,o)})),s=l(a,1)[0];x.useEffect((function(){s.setOptions(o)}),[s,o]);var u=n.useSyncExternalStore(x.useCallback((function(e){return s.subscribe(Z.batchCalls(e))}),[s]),(function(){return s.getCurrentResult()}),(function(){return s.getCurrentResult()})),c=x.useCallback((function(e,t){s.mutate(e,t).catch(Ie)}),[s]);if(u.error&&Me(s.options.useErrorBoundary,[u.error]))throw u.error;return f(f({},u),{},{mutate:c,mutateAsync:u.mutate})},e.useQueries=function(e){var t=e.queries,r=e.context,o=ke({context:r}),i=Re(),a=x.useMemo((function(){return t.map((function(e){var t=o.defaultQueryOptions(e);return t._optimisticResults=i?"isRestoring":"optimistic",t}))}),[t,o,i]),s=x.useState((function(){return new me(o,a)})),u=l(s,1)[0],c=u.getOptimisticResult(a);return n.useSyncExternalStore(x.useCallback((function(e){return i?function(){}:u.subscribe(Z.batchCalls(e))}),[u,i]),(function(){return u.getCurrentResult()}),(function(){return u.getCurrentResult()})),x.useEffect((function(){u.setQueries(a,{listeners:!1})}),[a,u]),c},e.useQuery=function(e,t,n){return _e(R(e,t,n),ce)},e.useQueryClient=ke,e.useQueryErrorResetBoundary=Ee,Object.defineProperty(e,"__esModule",{value:!0})}(t,n(2791),n(7248))},4569:function(e,t,n){e.exports=n(8036)},3381:function(e,t,n){"use strict";var r=n(3589),o=n(7297),i=n(9301),a=n(9774),l=n(1804),s=n(9145),u=n(5411),c=n(6789),d=n(4531),f=n(6569),p=n(6261);e.exports=function(e){return new Promise((function(t,n){var h,m=e.data,v=e.headers,g=e.responseType;function y(){e.cancelToken&&e.cancelToken.unsubscribe(h),e.signal&&e.signal.removeEventListener("abort",h)}r.isFormData(m)&&r.isStandardBrowserEnv()&&delete v["Content-Type"];var x=new XMLHttpRequest;if(e.auth){var b=e.auth.username||"",w=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";v.Authorization="Basic "+btoa(b+":"+w)}var S=l(e.baseURL,e.url);function j(){if(x){var r="getAllResponseHeaders"in x?s(x.getAllResponseHeaders()):null,i={data:g&&"text"!==g&&"json"!==g?x.response:x.responseText,status:x.status,statusText:x.statusText,headers:r,config:e,request:x};o((function(e){t(e),y()}),(function(e){n(e),y()}),i),x=null}}if(x.open(e.method.toUpperCase(),a(S,e.params,e.paramsSerializer),!0),x.timeout=e.timeout,"onloadend"in x?x.onloadend=j:x.onreadystatechange=function(){x&&4===x.readyState&&(0!==x.status||x.responseURL&&0===x.responseURL.indexOf("file:"))&&setTimeout(j)},x.onabort=function(){x&&(n(new d("Request aborted",d.ECONNABORTED,e,x)),x=null)},x.onerror=function(){n(new d("Network Error",d.ERR_NETWORK,e,x,x)),x=null},x.ontimeout=function(){var t=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded",r=e.transitional||c;e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(new d(t,r.clarifyTimeoutError?d.ETIMEDOUT:d.ECONNABORTED,e,x)),x=null},r.isStandardBrowserEnv()){var k=(e.withCredentials||u(S))&&e.xsrfCookieName?i.read(e.xsrfCookieName):void 0;k&&(v[e.xsrfHeaderName]=k)}"setRequestHeader"in x&&r.forEach(v,(function(e,t){"undefined"===typeof m&&"content-type"===t.toLowerCase()?delete v[t]:x.setRequestHeader(t,e)})),r.isUndefined(e.withCredentials)||(x.withCredentials=!!e.withCredentials),g&&"json"!==g&&(x.responseType=e.responseType),"function"===typeof e.onDownloadProgress&&x.addEventListener("progress",e.onDownloadProgress),"function"===typeof e.onUploadProgress&&x.upload&&x.upload.addEventListener("progress",e.onUploadProgress),(e.cancelToken||e.signal)&&(h=function(e){x&&(n(!e||e&&e.type?new f:e),x.abort(),x=null)},e.cancelToken&&e.cancelToken.subscribe(h),e.signal&&(e.signal.aborted?h():e.signal.addEventListener("abort",h))),m||(m=null);var C=p(S);C&&-1===["http","https","file"].indexOf(C)?n(new d("Unsupported protocol "+C+":",d.ERR_BAD_REQUEST,e)):x.send(m)}))}},8036:function(e,t,n){"use strict";var r=n(3589),o=n(4049),i=n(3773),a=n(777);var l=function e(t){var n=new i(t),l=o(i.prototype.request,n);return r.extend(l,i.prototype,n),r.extend(l,n),l.create=function(n){return e(a(t,n))},l}(n(1709));l.Axios=i,l.CanceledError=n(6569),l.CancelToken=n(6857),l.isCancel=n(5517),l.VERSION=n(7600).version,l.toFormData=n(1397),l.AxiosError=n(4531),l.Cancel=l.CanceledError,l.all=function(e){return Promise.all(e)},l.spread=n(8089),l.isAxiosError=n(9580),e.exports=l,e.exports.default=l},6857:function(e,t,n){"use strict";var r=n(6569);function o(e){if("function"!==typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise((function(e){t=e}));var n=this;this.promise.then((function(e){if(n._listeners){var t,r=n._listeners.length;for(t=0;t<r;t++)n._listeners[t](e);n._listeners=null}})),this.promise.then=function(e){var t,r=new Promise((function(e){n.subscribe(e),t=e})).then(e);return r.cancel=function(){n.unsubscribe(t)},r},e((function(e){n.reason||(n.reason=new r(e),t(n.reason))}))}o.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},o.prototype.subscribe=function(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]},o.prototype.unsubscribe=function(e){if(this._listeners){var t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}},o.source=function(){var e;return{token:new o((function(t){e=t})),cancel:e}},e.exports=o},6569:function(e,t,n){"use strict";var r=n(4531);function o(e){r.call(this,null==e?"canceled":e,r.ERR_CANCELED),this.name="CanceledError"}n(3589).inherits(o,r,{__CANCEL__:!0}),e.exports=o},5517:function(e){"use strict";e.exports=function(e){return!(!e||!e.__CANCEL__)}},3773:function(e,t,n){"use strict";var r=n(3589),o=n(9774),i=n(7470),a=n(2733),l=n(777),s=n(1804),u=n(7835),c=u.validators;function d(e){this.defaults=e,this.interceptors={request:new i,response:new i}}d.prototype.request=function(e,t){"string"===typeof e?(t=t||{}).url=e:t=e||{},(t=l(this.defaults,t)).method?t.method=t.method.toLowerCase():this.defaults.method?t.method=this.defaults.method.toLowerCase():t.method="get";var n=t.transitional;void 0!==n&&u.assertOptions(n,{silentJSONParsing:c.transitional(c.boolean),forcedJSONParsing:c.transitional(c.boolean),clarifyTimeoutError:c.transitional(c.boolean)},!1);var r=[],o=!0;this.interceptors.request.forEach((function(e){"function"===typeof e.runWhen&&!1===e.runWhen(t)||(o=o&&e.synchronous,r.unshift(e.fulfilled,e.rejected))}));var i,s=[];if(this.interceptors.response.forEach((function(e){s.push(e.fulfilled,e.rejected)})),!o){var d=[a,void 0];for(Array.prototype.unshift.apply(d,r),d=d.concat(s),i=Promise.resolve(t);d.length;)i=i.then(d.shift(),d.shift());return i}for(var f=t;r.length;){var p=r.shift(),h=r.shift();try{f=p(f)}catch(m){h(m);break}}try{i=a(f)}catch(m){return Promise.reject(m)}for(;s.length;)i=i.then(s.shift(),s.shift());return i},d.prototype.getUri=function(e){e=l(this.defaults,e);var t=s(e.baseURL,e.url);return o(t,e.params,e.paramsSerializer)},r.forEach(["delete","get","head","options"],(function(e){d.prototype[e]=function(t,n){return this.request(l(n||{},{method:e,url:t,data:(n||{}).data}))}})),r.forEach(["post","put","patch"],(function(e){function t(t){return function(n,r,o){return this.request(l(o||{},{method:e,headers:t?{"Content-Type":"multipart/form-data"}:{},url:n,data:r}))}}d.prototype[e]=t(),d.prototype[e+"Form"]=t(!0)})),e.exports=d},4531:function(e,t,n){"use strict";var r=n(3589);function o(e,t,n,r,o){Error.call(this),this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),o&&(this.response=o)}r.inherits(o,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}}});var i=o.prototype,a={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED"].forEach((function(e){a[e]={value:e}})),Object.defineProperties(o,a),Object.defineProperty(i,"isAxiosError",{value:!0}),o.from=function(e,t,n,a,l,s){var u=Object.create(i);return r.toFlatObject(e,u,(function(e){return e!==Error.prototype})),o.call(u,e.message,t,n,a,l),u.name=e.name,s&&Object.assign(u,s),u},e.exports=o},7470:function(e,t,n){"use strict";var r=n(3589);function o(){this.handlers=[]}o.prototype.use=function(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1},o.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},o.prototype.forEach=function(e){r.forEach(this.handlers,(function(t){null!==t&&e(t)}))},e.exports=o},1804:function(e,t,n){"use strict";var r=n(4044),o=n(9549);e.exports=function(e,t){return e&&!r(t)?o(e,t):t}},2733:function(e,t,n){"use strict";var r=n(3589),o=n(2693),i=n(5517),a=n(1709),l=n(6569);function s(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new l}e.exports=function(e){return s(e),e.headers=e.headers||{},e.data=o.call(e,e.data,e.headers,e.transformRequest),e.headers=r.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),r.forEach(["delete","get","head","post","put","patch","common"],(function(t){delete e.headers[t]})),(e.adapter||a.adapter)(e).then((function(t){return s(e),t.data=o.call(e,t.data,t.headers,e.transformResponse),t}),(function(t){return i(t)||(s(e),t&&t.response&&(t.response.data=o.call(e,t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)}))}},777:function(e,t,n){"use strict";var r=n(3589);e.exports=function(e,t){t=t||{};var n={};function o(e,t){return r.isPlainObject(e)&&r.isPlainObject(t)?r.merge(e,t):r.isPlainObject(t)?r.merge({},t):r.isArray(t)?t.slice():t}function i(n){return r.isUndefined(t[n])?r.isUndefined(e[n])?void 0:o(void 0,e[n]):o(e[n],t[n])}function a(e){if(!r.isUndefined(t[e]))return o(void 0,t[e])}function l(n){return r.isUndefined(t[n])?r.isUndefined(e[n])?void 0:o(void 0,e[n]):o(void 0,t[n])}function s(n){return n in t?o(e[n],t[n]):n in e?o(void 0,e[n]):void 0}var u={url:a,method:a,data:a,baseURL:l,transformRequest:l,transformResponse:l,paramsSerializer:l,timeout:l,timeoutMessage:l,withCredentials:l,adapter:l,responseType:l,xsrfCookieName:l,xsrfHeaderName:l,onUploadProgress:l,onDownloadProgress:l,decompress:l,maxContentLength:l,maxBodyLength:l,beforeRedirect:l,transport:l,httpAgent:l,httpsAgent:l,cancelToken:l,socketPath:l,responseEncoding:l,validateStatus:s};return r.forEach(Object.keys(e).concat(Object.keys(t)),(function(e){var t=u[e]||i,o=t(e);r.isUndefined(o)&&t!==s||(n[e]=o)})),n}},7297:function(e,t,n){"use strict";var r=n(4531);e.exports=function(e,t,n){var o=n.config.validateStatus;n.status&&o&&!o(n.status)?t(new r("Request failed with status code "+n.status,[r.ERR_BAD_REQUEST,r.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n)):e(n)}},2693:function(e,t,n){"use strict";var r=n(3589),o=n(1709);e.exports=function(e,t,n){var i=this||o;return r.forEach(n,(function(n){e=n.call(i,e,t)})),e}},1709:function(e,t,n){"use strict";var r=n(3589),o=n(4341),i=n(4531),a=n(6789),l=n(1397),s={"Content-Type":"application/x-www-form-urlencoded"};function u(e,t){!r.isUndefined(e)&&r.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}var c={transitional:a,adapter:function(){var e;return("undefined"!==typeof XMLHttpRequest||"undefined"!==typeof process&&"[object process]"===Object.prototype.toString.call(process))&&(e=n(3381)),e}(),transformRequest:[function(e,t){if(o(t,"Accept"),o(t,"Content-Type"),r.isFormData(e)||r.isArrayBuffer(e)||r.isBuffer(e)||r.isStream(e)||r.isFile(e)||r.isBlob(e))return e;if(r.isArrayBufferView(e))return e.buffer;if(r.isURLSearchParams(e))return u(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString();var n,i=r.isObject(e),a=t&&t["Content-Type"];if((n=r.isFileList(e))||i&&"multipart/form-data"===a){var s=this.env&&this.env.FormData;return l(n?{"files[]":e}:e,s&&new s)}return i||"application/json"===a?(u(t,"application/json"),function(e,t,n){if(r.isString(e))try{return(t||JSON.parse)(e),r.trim(e)}catch(o){if("SyntaxError"!==o.name)throw o}return(n||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){var t=this.transitional||c.transitional,n=t&&t.silentJSONParsing,o=t&&t.forcedJSONParsing,a=!n&&"json"===this.responseType;if(a||o&&r.isString(e)&&e.length)try{return JSON.parse(e)}catch(l){if(a){if("SyntaxError"===l.name)throw i.from(l,i.ERR_BAD_RESPONSE,this,null,this.response);throw l}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:n(3035)},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};r.forEach(["delete","get","head"],(function(e){c.headers[e]={}})),r.forEach(["post","put","patch"],(function(e){c.headers[e]=r.merge(s)})),e.exports=c},6789:function(e){"use strict";e.exports={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1}},7600:function(e){e.exports={version:"0.27.2"}},4049:function(e){"use strict";e.exports=function(e,t){return function(){for(var n=new Array(arguments.length),r=0;r<n.length;r++)n[r]=arguments[r];return e.apply(t,n)}}},9774:function(e,t,n){"use strict";var r=n(3589);function o(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}e.exports=function(e,t,n){if(!t)return e;var i;if(n)i=n(t);else if(r.isURLSearchParams(t))i=t.toString();else{var a=[];r.forEach(t,(function(e,t){null!==e&&"undefined"!==typeof e&&(r.isArray(e)?t+="[]":e=[e],r.forEach(e,(function(e){r.isDate(e)?e=e.toISOString():r.isObject(e)&&(e=JSON.stringify(e)),a.push(o(t)+"="+o(e))})))})),i=a.join("&")}if(i){var l=e.indexOf("#");-1!==l&&(e=e.slice(0,l)),e+=(-1===e.indexOf("?")?"?":"&")+i}return e}},9549:function(e){"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},9301:function(e,t,n){"use strict";var r=n(3589);e.exports=r.isStandardBrowserEnv()?{write:function(e,t,n,o,i,a){var l=[];l.push(e+"="+encodeURIComponent(t)),r.isNumber(n)&&l.push("expires="+new Date(n).toGMTString()),r.isString(o)&&l.push("path="+o),r.isString(i)&&l.push("domain="+i),!0===a&&l.push("secure"),document.cookie=l.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},4044:function(e){"use strict";e.exports=function(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}},9580:function(e,t,n){"use strict";var r=n(3589);e.exports=function(e){return r.isObject(e)&&!0===e.isAxiosError}},5411:function(e,t,n){"use strict";var r=n(3589);e.exports=r.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function o(e){var r=e;return t&&(n.setAttribute("href",r),r=n.href),n.setAttribute("href",r),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return e=o(window.location.href),function(t){var n=r.isString(t)?o(t):t;return n.protocol===e.protocol&&n.host===e.host}}():function(){return!0}},4341:function(e,t,n){"use strict";var r=n(3589);e.exports=function(e,t){r.forEach(e,(function(n,r){r!==t&&r.toUpperCase()===t.toUpperCase()&&(e[t]=n,delete e[r])}))}},3035:function(e){e.exports=null},9145:function(e,t,n){"use strict";var r=n(3589),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,i,a={};return e?(r.forEach(e.split("\n"),(function(e){if(i=e.indexOf(":"),t=r.trim(e.substr(0,i)).toLowerCase(),n=r.trim(e.substr(i+1)),t){if(a[t]&&o.indexOf(t)>=0)return;a[t]="set-cookie"===t?(a[t]?a[t]:[]).concat([n]):a[t]?a[t]+", "+n:n}})),a):a}},6261:function(e){"use strict";e.exports=function(e){var t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}},8089:function(e){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},1397:function(e,t,n){"use strict";var r=n(3589);e.exports=function(e,t){t=t||new FormData;var n=[];function o(e){return null===e?"":r.isDate(e)?e.toISOString():r.isArrayBuffer(e)||r.isTypedArray(e)?"function"===typeof Blob?new Blob([e]):Buffer.from(e):e}return function e(i,a){if(r.isPlainObject(i)||r.isArray(i)){if(-1!==n.indexOf(i))throw Error("Circular reference detected in "+a);n.push(i),r.forEach(i,(function(n,i){if(!r.isUndefined(n)){var l,s=a?a+"."+i:i;if(n&&!a&&"object"===typeof n)if(r.endsWith(i,"{}"))n=JSON.stringify(n);else if(r.endsWith(i,"[]")&&(l=r.toArray(n)))return void l.forEach((function(e){!r.isUndefined(e)&&t.append(s,o(e))}));e(n,s)}})),n.pop()}else t.append(a,o(i))}(e),t}},7835:function(e,t,n){"use strict";var r=n(7600).version,o=n(4531),i={};["object","boolean","number","function","string","symbol"].forEach((function(e,t){i[e]=function(n){return typeof n===e||"a"+(t<1?"n ":" ")+e}}));var a={};i.transitional=function(e,t,n){function i(e,t){return"[Axios v"+r+"] Transitional option '"+e+"'"+t+(n?". "+n:"")}return function(n,r,l){if(!1===e)throw new o(i(r," has been removed"+(t?" in "+t:"")),o.ERR_DEPRECATED);return t&&!a[r]&&(a[r]=!0,console.warn(i(r," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(n,r,l)}},e.exports={assertOptions:function(e,t,n){if("object"!==typeof e)throw new o("options must be an object",o.ERR_BAD_OPTION_VALUE);for(var r=Object.keys(e),i=r.length;i-- >0;){var a=r[i],l=t[a];if(l){var s=e[a],u=void 0===s||l(s,a,e);if(!0!==u)throw new o("option "+a+" must be "+u,o.ERR_BAD_OPTION_VALUE)}else if(!0!==n)throw new o("Unknown option "+a,o.ERR_BAD_OPTION)}},validators:i}},3589:function(e,t,n){"use strict";var r,o=n(4049),i=Object.prototype.toString,a=(r=Object.create(null),function(e){var t=i.call(e);return r[t]||(r[t]=t.slice(8,-1).toLowerCase())});function l(e){return e=e.toLowerCase(),function(t){return a(t)===e}}function s(e){return Array.isArray(e)}function u(e){return"undefined"===typeof e}var c=l("ArrayBuffer");function d(e){return null!==e&&"object"===typeof e}function f(e){if("object"!==a(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}var p=l("Date"),h=l("File"),m=l("Blob"),v=l("FileList");function g(e){return"[object Function]"===i.call(e)}var y=l("URLSearchParams");function x(e,t){if(null!==e&&"undefined"!==typeof e)if("object"!==typeof e&&(e=[e]),s(e))for(var n=0,r=e.length;n<r;n++)t.call(null,e[n],n,e);else for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&t.call(null,e[o],o,e)}var b,w=(b="undefined"!==typeof Uint8Array&&Object.getPrototypeOf(Uint8Array),function(e){return b&&e instanceof b});e.exports={isArray:s,isArrayBuffer:c,isBuffer:function(e){return null!==e&&!u(e)&&null!==e.constructor&&!u(e.constructor)&&"function"===typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)},isFormData:function(e){var t="[object FormData]";return e&&("function"===typeof FormData&&e instanceof FormData||i.call(e)===t||g(e.toString)&&e.toString()===t)},isArrayBufferView:function(e){return"undefined"!==typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&c(e.buffer)},isString:function(e){return"string"===typeof e},isNumber:function(e){return"number"===typeof e},isObject:d,isPlainObject:f,isUndefined:u,isDate:p,isFile:h,isBlob:m,isFunction:g,isStream:function(e){return d(e)&&g(e.pipe)},isURLSearchParams:y,isStandardBrowserEnv:function(){return("undefined"===typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!==typeof window&&"undefined"!==typeof document)},forEach:x,merge:function e(){var t={};function n(n,r){f(t[r])&&f(n)?t[r]=e(t[r],n):f(n)?t[r]=e({},n):s(n)?t[r]=n.slice():t[r]=n}for(var r=0,o=arguments.length;r<o;r++)x(arguments[r],n);return t},extend:function(e,t,n){return x(t,(function(t,r){e[r]=n&&"function"===typeof t?o(t,n):t})),e},trim:function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")},stripBOM:function(e){return 65279===e.charCodeAt(0)&&(e=e.slice(1)),e},inherits:function(e,t,n,r){e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,n&&Object.assign(e.prototype,n)},toFlatObject:function(e,t,n){var r,o,i,a={};t=t||{};do{for(o=(r=Object.getOwnPropertyNames(e)).length;o-- >0;)a[i=r[o]]||(t[i]=e[i],a[i]=!0);e=Object.getPrototypeOf(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},kindOf:a,kindOfTest:l,endsWith:function(e,t,n){e=String(e),(void 0===n||n>e.length)&&(n=e.length),n-=t.length;var r=e.indexOf(t,n);return-1!==r&&r===n},toArray:function(e){if(!e)return null;var t=e.length;if(u(t))return null;for(var n=new Array(t);t-- >0;)n[t]=e[t];return n},isTypedArray:w,isFileList:v}},4037:function(e,t,n){"use strict";var r=n(2506),o=n(9722),i=o(r("String.prototype.indexOf"));e.exports=function(e,t){var n=r(e,!!t);return"function"===typeof n&&i(e,".prototype.")>-1?o(n):n}},9722:function(e,t,n){"use strict";var r=n(3350),o=n(2506),i=o("%Function.prototype.apply%"),a=o("%Function.prototype.call%"),l=o("%Reflect.apply%",!0)||r.call(a,i),s=o("%Object.getOwnPropertyDescriptor%",!0),u=o("%Object.defineProperty%",!0),c=o("%Math.max%");if(u)try{u({},"a",{value:1})}catch(f){u=null}e.exports=function(e){var t=l(r,a,arguments);if(s&&u){var n=s(t,"length");n.configurable&&u(t,"length",{value:1+c(0,e.length-(arguments.length-1))})}return t};var d=function(){return l(r,i,arguments)};u?u(e.exports,"apply",{value:d}):e.exports.apply=d},222:function(e){"use strict";var t="Function.prototype.bind called on incompatible ",n=Array.prototype.slice,r=Object.prototype.toString,o="[object Function]";e.exports=function(e){var i=this;if("function"!==typeof i||r.call(i)!==o)throw new TypeError(t+i);for(var a,l=n.call(arguments,1),s=function(){if(this instanceof a){var t=i.apply(this,l.concat(n.call(arguments)));return Object(t)===t?t:this}return i.apply(e,l.concat(n.call(arguments)))},u=Math.max(0,i.length-l.length),c=[],d=0;d<u;d++)c.push("$"+d);if(a=Function("binder","return function ("+c.join(",")+"){ return binder.apply(this,arguments); }")(s),i.prototype){var f=function(){};f.prototype=i.prototype,a.prototype=new f,f.prototype=null}return a}},3350:function(e,t,n){"use strict";var r=n(222);e.exports=Function.prototype.bind||r},2506:function(e,t,n){"use strict";var r,o=SyntaxError,i=Function,a=TypeError,l=function(e){try{return i('"use strict"; return ('+e+").constructor;")()}catch(t){}},s=Object.getOwnPropertyDescriptor;if(s)try{s({},"")}catch(P){s=null}var u=function(){throw new a},c=s?function(){try{return u}catch(e){try{return s(arguments,"callee").get}catch(t){return u}}}():u,d=n(697)(),f=Object.getPrototypeOf||function(e){return e.__proto__},p={},h="undefined"===typeof Uint8Array?r:f(Uint8Array),m={"%AggregateError%":"undefined"===typeof AggregateError?r:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"===typeof ArrayBuffer?r:ArrayBuffer,"%ArrayIteratorPrototype%":d?f([][Symbol.iterator]()):r,"%AsyncFromSyncIteratorPrototype%":r,"%AsyncFunction%":p,"%AsyncGenerator%":p,"%AsyncGeneratorFunction%":p,"%AsyncIteratorPrototype%":p,"%Atomics%":"undefined"===typeof Atomics?r:Atomics,"%BigInt%":"undefined"===typeof BigInt?r:BigInt,"%Boolean%":Boolean,"%DataView%":"undefined"===typeof DataView?r:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Error,"%eval%":eval,"%EvalError%":EvalError,"%Float32Array%":"undefined"===typeof Float32Array?r:Float32Array,"%Float64Array%":"undefined"===typeof Float64Array?r:Float64Array,"%FinalizationRegistry%":"undefined"===typeof FinalizationRegistry?r:FinalizationRegistry,"%Function%":i,"%GeneratorFunction%":p,"%Int8Array%":"undefined"===typeof Int8Array?r:Int8Array,"%Int16Array%":"undefined"===typeof Int16Array?r:Int16Array,"%Int32Array%":"undefined"===typeof Int32Array?r:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":d?f(f([][Symbol.iterator]())):r,"%JSON%":"object"===typeof JSON?JSON:r,"%Map%":"undefined"===typeof Map?r:Map,"%MapIteratorPrototype%":"undefined"!==typeof Map&&d?f((new Map)[Symbol.iterator]()):r,"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"===typeof Promise?r:Promise,"%Proxy%":"undefined"===typeof Proxy?r:Proxy,"%RangeError%":RangeError,"%ReferenceError%":ReferenceError,"%Reflect%":"undefined"===typeof Reflect?r:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"===typeof Set?r:Set,"%SetIteratorPrototype%":"undefined"!==typeof Set&&d?f((new Set)[Symbol.iterator]()):r,"%SharedArrayBuffer%":"undefined"===typeof SharedArrayBuffer?r:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":d?f(""[Symbol.iterator]()):r,"%Symbol%":d?Symbol:r,"%SyntaxError%":o,"%ThrowTypeError%":c,"%TypedArray%":h,"%TypeError%":a,"%Uint8Array%":"undefined"===typeof Uint8Array?r:Uint8Array,"%Uint8ClampedArray%":"undefined"===typeof Uint8ClampedArray?r:Uint8ClampedArray,"%Uint16Array%":"undefined"===typeof Uint16Array?r:Uint16Array,"%Uint32Array%":"undefined"===typeof Uint32Array?r:Uint32Array,"%URIError%":URIError,"%WeakMap%":"undefined"===typeof WeakMap?r:WeakMap,"%WeakRef%":"undefined"===typeof WeakRef?r:WeakRef,"%WeakSet%":"undefined"===typeof WeakSet?r:WeakSet},v=function e(t){var n;if("%AsyncFunction%"===t)n=l("async function () {}");else if("%GeneratorFunction%"===t)n=l("function* () {}");else if("%AsyncGeneratorFunction%"===t)n=l("async function* () {}");else if("%AsyncGenerator%"===t){var r=e("%AsyncGeneratorFunction%");r&&(n=r.prototype)}else if("%AsyncIteratorPrototype%"===t){var o=e("%AsyncGenerator%");o&&(n=f(o.prototype))}return m[t]=n,n},g={"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},y=n(3350),x=n(8316),b=y.call(Function.call,Array.prototype.concat),w=y.call(Function.apply,Array.prototype.splice),S=y.call(Function.call,String.prototype.replace),j=y.call(Function.call,String.prototype.slice),k=y.call(Function.call,RegExp.prototype.exec),C=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,R=/\\(\\)?/g,T=function(e){var t=j(e,0,1),n=j(e,-1);if("%"===t&&"%"!==n)throw new o("invalid intrinsic syntax, expected closing `%`");if("%"===n&&"%"!==t)throw new o("invalid intrinsic syntax, expected opening `%`");var r=[];return S(e,C,(function(e,t,n,o){r[r.length]=n?S(o,R,"$1"):t||e})),r},O=function(e,t){var n,r=e;if(x(g,r)&&(r="%"+(n=g[r])[0]+"%"),x(m,r)){var i=m[r];if(i===p&&(i=v(r)),"undefined"===typeof i&&!t)throw new a("intrinsic "+e+" exists, but is not available. Please file an issue!");return{alias:n,name:r,value:i}}throw new o("intrinsic "+e+" does not exist!")};e.exports=function(e,t){if("string"!==typeof e||0===e.length)throw new a("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!==typeof t)throw new a('"allowMissing" argument must be a boolean');if(null===k(/^%?[^%]*%?$/g,e))throw new o("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var n=T(e),r=n.length>0?n[0]:"",i=O("%"+r+"%",t),l=i.name,u=i.value,c=!1,d=i.alias;d&&(r=d[0],w(n,b([0,1],d)));for(var f=1,p=!0;f<n.length;f+=1){var h=n[f],v=j(h,0,1),g=j(h,-1);if(('"'===v||"'"===v||"`"===v||'"'===g||"'"===g||"`"===g)&&v!==g)throw new o("property names with quotes must have matching quotes");if("constructor"!==h&&p||(c=!0),x(m,l="%"+(r+="."+h)+"%"))u=m[l];else if(null!=u){if(!(h in u)){if(!t)throw new a("base intrinsic for "+e+" exists, but the property is not available.");return}if(s&&f+1>=n.length){var y=s(u,h);u=(p=!!y)&&"get"in y&&!("originalValue"in y.get)?y.get:u[h]}else p=x(u,h),u=u[h];p&&!c&&(m[l]=u)}}return u}},697:function(e,t,n){"use strict";var r="undefined"!==typeof Symbol&&Symbol,o=n(3297);e.exports=function(){return"function"===typeof r&&("function"===typeof Symbol&&("symbol"===typeof r("foo")&&("symbol"===typeof Symbol("bar")&&o())))}},3297:function(e){"use strict";e.exports=function(){if("function"!==typeof Symbol||"function"!==typeof Object.getOwnPropertySymbols)return!1;if("symbol"===typeof Symbol.iterator)return!0;var e={},t=Symbol("test"),n=Object(t);if("string"===typeof t)return!1;if("[object Symbol]"!==Object.prototype.toString.call(t))return!1;if("[object Symbol]"!==Object.prototype.toString.call(n))return!1;for(t in e[t]=42,e)return!1;if("function"===typeof Object.keys&&0!==Object.keys(e).length)return!1;if("function"===typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(e).length)return!1;var r=Object.getOwnPropertySymbols(e);if(1!==r.length||r[0]!==t)return!1;if(!Object.prototype.propertyIsEnumerable.call(e,t))return!1;if("function"===typeof Object.getOwnPropertyDescriptor){var o=Object.getOwnPropertyDescriptor(e,t);if(42!==o.value||!0!==o.enumerable)return!1}return!0}},8316:function(e,t,n){"use strict";var r=n(3350);e.exports=r.call(Function.call,Object.prototype.hasOwnProperty)},2110:function(e,t,n){"use strict";var r=n(8309),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},i={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},a={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?a:l[e.$$typeof]||o}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=a;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,h=Object.prototype;e.exports=function e(t,n,r){if("string"!==typeof n){if(h){var o=p(n);o&&o!==h&&e(t,o,r)}var a=c(n);d&&(a=a.concat(d(n)));for(var l=s(t),m=s(n),v=0;v<a.length;++v){var g=a[v];if(!i[g]&&(!r||!r[g])&&(!m||!m[g])&&(!l||!l[g])){var y=f(n,g);try{u(t,g,y)}catch(x){}}}}return t}},746:function(e,t){"use strict";var n="function"===typeof Symbol&&Symbol.for,r=n?Symbol.for("react.element"):60103,o=n?Symbol.for("react.portal"):60106,i=n?Symbol.for("react.fragment"):60107,a=n?Symbol.for("react.strict_mode"):60108,l=n?Symbol.for("react.profiler"):60114,s=n?Symbol.for("react.provider"):60109,u=n?Symbol.for("react.context"):60110,c=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,f=n?Symbol.for("react.forward_ref"):60112,p=n?Symbol.for("react.suspense"):60113,h=n?Symbol.for("react.suspense_list"):60120,m=n?Symbol.for("react.memo"):60115,v=n?Symbol.for("react.lazy"):60116,g=n?Symbol.for("react.block"):60121,y=n?Symbol.for("react.fundamental"):60117,x=n?Symbol.for("react.responder"):60118,b=n?Symbol.for("react.scope"):60119;function w(e){if("object"===typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case c:case d:case i:case l:case a:case p:return e;default:switch(e=e&&e.$$typeof){case u:case f:case v:case m:case s:return e;default:return t}}case o:return t}}}function S(e){return w(e)===d}t.AsyncMode=c,t.ConcurrentMode=d,t.ContextConsumer=u,t.ContextProvider=s,t.Element=r,t.ForwardRef=f,t.Fragment=i,t.Lazy=v,t.Memo=m,t.Portal=o,t.Profiler=l,t.StrictMode=a,t.Suspense=p,t.isAsyncMode=function(e){return S(e)||w(e)===c},t.isConcurrentMode=S,t.isContextConsumer=function(e){return w(e)===u},t.isContextProvider=function(e){return w(e)===s},t.isElement=function(e){return"object"===typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return w(e)===f},t.isFragment=function(e){return w(e)===i},t.isLazy=function(e){return w(e)===v},t.isMemo=function(e){return w(e)===m},t.isPortal=function(e){return w(e)===o},t.isProfiler=function(e){return w(e)===l},t.isStrictMode=function(e){return w(e)===a},t.isSuspense=function(e){return w(e)===p},t.isValidElementType=function(e){return"string"===typeof e||"function"===typeof e||e===i||e===d||e===l||e===a||e===p||e===h||"object"===typeof e&&null!==e&&(e.$$typeof===v||e.$$typeof===m||e.$$typeof===s||e.$$typeof===u||e.$$typeof===f||e.$$typeof===y||e.$$typeof===x||e.$$typeof===b||e.$$typeof===g)},t.typeOf=w},8309:function(e,t,n){"use strict";e.exports=n(746)},2426:function(e,t,n){(e=n.nmd(e)).exports=function(){"use strict";var t,n;function r(){return t.apply(null,arguments)}function o(e){t=e}function i(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function a(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function l(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function s(e){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(e).length;var t;for(t in e)if(l(e,t))return!1;return!0}function u(e){return void 0===e}function c(e){return"number"===typeof e||"[object Number]"===Object.prototype.toString.call(e)}function d(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function f(e,t){var n,r=[],o=e.length;for(n=0;n<o;++n)r.push(t(e[n],n));return r}function p(e,t){for(var n in t)l(t,n)&&(e[n]=t[n]);return l(t,"toString")&&(e.toString=t.toString),l(t,"valueOf")&&(e.valueOf=t.valueOf),e}function h(e,t,n,r){return Qn(e,t,n,r,!0).utc()}function m(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidEra:null,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],era:null,meridiem:null,rfc2822:!1,weekdayMismatch:!1}}function v(e){return null==e._pf&&(e._pf=m()),e._pf}function g(e){if(null==e._isValid){var t=v(e),r=n.call(t.parsedDateParts,(function(e){return null!=e})),o=!isNaN(e._d.getTime())&&t.overflow<0&&!t.empty&&!t.invalidEra&&!t.invalidMonth&&!t.invalidWeekday&&!t.weekdayMismatch&&!t.nullInput&&!t.invalidFormat&&!t.userInvalidated&&(!t.meridiem||t.meridiem&&r);if(e._strict&&(o=o&&0===t.charsLeftOver&&0===t.unusedTokens.length&&void 0===t.bigHour),null!=Object.isFrozen&&Object.isFrozen(e))return o;e._isValid=o}return e._isValid}function y(e){var t=h(NaN);return null!=e?p(v(t),e):v(t).userInvalidated=!0,t}n=Array.prototype.some?Array.prototype.some:function(e){var t,n=Object(this),r=n.length>>>0;for(t=0;t<r;t++)if(t in n&&e.call(this,n[t],t,n))return!0;return!1};var x=r.momentProperties=[],b=!1;function w(e,t){var n,r,o,i=x.length;if(u(t._isAMomentObject)||(e._isAMomentObject=t._isAMomentObject),u(t._i)||(e._i=t._i),u(t._f)||(e._f=t._f),u(t._l)||(e._l=t._l),u(t._strict)||(e._strict=t._strict),u(t._tzm)||(e._tzm=t._tzm),u(t._isUTC)||(e._isUTC=t._isUTC),u(t._offset)||(e._offset=t._offset),u(t._pf)||(e._pf=v(t)),u(t._locale)||(e._locale=t._locale),i>0)for(n=0;n<i;n++)u(o=t[r=x[n]])||(e[r]=o);return e}function S(e){w(this,e),this._d=new Date(null!=e._d?e._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===b&&(b=!0,r.updateOffset(this),b=!1)}function j(e){return e instanceof S||null!=e&&null!=e._isAMomentObject}function k(e){!1===r.suppressDeprecationWarnings&&"undefined"!==typeof console&&console.warn&&console.warn("Deprecation warning: "+e)}function C(e,t){var n=!0;return p((function(){if(null!=r.deprecationHandler&&r.deprecationHandler(null,e),n){var o,i,a,s=[],u=arguments.length;for(i=0;i<u;i++){if(o="","object"===typeof arguments[i]){for(a in o+="\n["+i+"] ",arguments[0])l(arguments[0],a)&&(o+=a+": "+arguments[0][a]+", ");o=o.slice(0,-2)}else o=arguments[i];s.push(o)}k(e+"\nArguments: "+Array.prototype.slice.call(s).join("")+"\n"+(new Error).stack),n=!1}return t.apply(this,arguments)}),t)}var R,T={};function O(e,t){null!=r.deprecationHandler&&r.deprecationHandler(e,t),T[e]||(k(t),T[e]=!0)}function P(e){return"undefined"!==typeof Function&&e instanceof Function||"[object Function]"===Object.prototype.toString.call(e)}function E(e){var t,n;for(n in e)l(e,n)&&(P(t=e[n])?this[n]=t:this["_"+n]=t);this._config=e,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)}function M(e,t){var n,r=p({},e);for(n in t)l(t,n)&&(a(e[n])&&a(t[n])?(r[n]={},p(r[n],e[n]),p(r[n],t[n])):null!=t[n]?r[n]=t[n]:delete r[n]);for(n in e)l(e,n)&&!l(t,n)&&a(e[n])&&(r[n]=p({},r[n]));return r}function _(e){null!=e&&this.set(e)}r.suppressDeprecationWarnings=!1,r.deprecationHandler=null,R=Object.keys?Object.keys:function(e){var t,n=[];for(t in e)l(e,t)&&n.push(t);return n};var D={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"};function I(e,t,n){var r=this._calendar[e]||this._calendar.sameElse;return P(r)?r.call(t,n):r}function A(e,t,n){var r=""+Math.abs(e),o=t-r.length;return(e>=0?n?"+":"":"-")+Math.pow(10,Math.max(0,o)).toString().substr(1)+r}var N=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,L=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,z={},F={};function W(e,t,n,r){var o=r;"string"===typeof r&&(o=function(){return this[r]()}),e&&(F[e]=o),t&&(F[t[0]]=function(){return A(o.apply(this,arguments),t[1],t[2])}),n&&(F[n]=function(){return this.localeData().ordinal(o.apply(this,arguments),e)})}function B(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"")}function V(e){var t,n,r=e.match(N);for(t=0,n=r.length;t<n;t++)F[r[t]]?r[t]=F[r[t]]:r[t]=B(r[t]);return function(t){var o,i="";for(o=0;o<n;o++)i+=P(r[o])?r[o].call(t,e):r[o];return i}}function q(e,t){return e.isValid()?(t=H(t,e.localeData()),z[t]=z[t]||V(t),z[t](e)):e.localeData().invalidDate()}function H(e,t){var n=5;function r(e){return t.longDateFormat(e)||e}for(L.lastIndex=0;n>=0&&L.test(e);)e=e.replace(L,r),L.lastIndex=0,n-=1;return e}var U={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"};function Y(e){var t=this._longDateFormat[e],n=this._longDateFormat[e.toUpperCase()];return t||!n?t:(this._longDateFormat[e]=n.match(N).map((function(e){return"MMMM"===e||"MM"===e||"DD"===e||"dddd"===e?e.slice(1):e})).join(""),this._longDateFormat[e])}var G="Invalid date";function Q(){return this._invalidDate}var $="%d",K=/\d{1,2}/;function X(e){return this._ordinal.replace("%d",e)}var Z={future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function J(e,t,n,r){var o=this._relativeTime[n];return P(o)?o(e,t,n,r):o.replace(/%d/i,e)}function ee(e,t){var n=this._relativeTime[e>0?"future":"past"];return P(n)?n(t):n.replace(/%s/i,t)}var te={};function ne(e,t){var n=e.toLowerCase();te[n]=te[n+"s"]=te[t]=e}function re(e){return"string"===typeof e?te[e]||te[e.toLowerCase()]:void 0}function oe(e){var t,n,r={};for(n in e)l(e,n)&&(t=re(n))&&(r[t]=e[n]);return r}var ie={};function ae(e,t){ie[e]=t}function le(e){var t,n=[];for(t in e)l(e,t)&&n.push({unit:t,priority:ie[t]});return n.sort((function(e,t){return e.priority-t.priority})),n}function se(e){return e%4===0&&e%100!==0||e%400===0}function ue(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function ce(e){var t=+e,n=0;return 0!==t&&isFinite(t)&&(n=ue(t)),n}function de(e,t){return function(n){return null!=n?(pe(this,e,n),r.updateOffset(this,t),this):fe(this,e)}}function fe(e,t){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+t]():NaN}function pe(e,t,n){e.isValid()&&!isNaN(n)&&("FullYear"===t&&se(e.year())&&1===e.month()&&29===e.date()?(n=ce(n),e._d["set"+(e._isUTC?"UTC":"")+t](n,e.month(),Je(n,e.month()))):e._d["set"+(e._isUTC?"UTC":"")+t](n))}function he(e){return P(this[e=re(e)])?this[e]():this}function me(e,t){if("object"===typeof e){var n,r=le(e=oe(e)),o=r.length;for(n=0;n<o;n++)this[r[n].unit](e[r[n].unit])}else if(P(this[e=re(e)]))return this[e](t);return this}var ve,ge=/\d/,ye=/\d\d/,xe=/\d{3}/,be=/\d{4}/,we=/[+-]?\d{6}/,Se=/\d\d?/,je=/\d\d\d\d?/,ke=/\d\d\d\d\d\d?/,Ce=/\d{1,3}/,Re=/\d{1,4}/,Te=/[+-]?\d{1,6}/,Oe=/\d+/,Pe=/[+-]?\d+/,Ee=/Z|[+-]\d\d:?\d\d/gi,Me=/Z|[+-]\d\d(?::?\d\d)?/gi,_e=/[+-]?\d+(\.\d{1,3})?/,De=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i;function Ie(e,t,n){ve[e]=P(t)?t:function(e,r){return e&&n?n:t}}function Ae(e,t){return l(ve,e)?ve[e](t._strict,t._locale):new RegExp(Ne(e))}function Ne(e){return Le(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,(function(e,t,n,r,o){return t||n||r||o})))}function Le(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}ve={};var ze={};function Fe(e,t){var n,r,o=t;for("string"===typeof e&&(e=[e]),c(t)&&(o=function(e,n){n[t]=ce(e)}),r=e.length,n=0;n<r;n++)ze[e[n]]=o}function We(e,t){Fe(e,(function(e,n,r,o){r._w=r._w||{},t(e,r._w,r,o)}))}function Be(e,t,n){null!=t&&l(ze,e)&&ze[e](t,n._a,n,e)}var Ve,qe=0,He=1,Ue=2,Ye=3,Ge=4,Qe=5,$e=6,Ke=7,Xe=8;function Ze(e,t){return(e%t+t)%t}function Je(e,t){if(isNaN(e)||isNaN(t))return NaN;var n=Ze(t,12);return e+=(t-n)/12,1===n?se(e)?29:28:31-n%7%2}Ve=Array.prototype.indexOf?Array.prototype.indexOf:function(e){var t;for(t=0;t<this.length;++t)if(this[t]===e)return t;return-1},W("M",["MM",2],"Mo",(function(){return this.month()+1})),W("MMM",0,0,(function(e){return this.localeData().monthsShort(this,e)})),W("MMMM",0,0,(function(e){return this.localeData().months(this,e)})),ne("month","M"),ae("month",8),Ie("M",Se),Ie("MM",Se,ye),Ie("MMM",(function(e,t){return t.monthsShortRegex(e)})),Ie("MMMM",(function(e,t){return t.monthsRegex(e)})),Fe(["M","MM"],(function(e,t){t[He]=ce(e)-1})),Fe(["MMM","MMMM"],(function(e,t,n,r){var o=n._locale.monthsParse(e,r,n._strict);null!=o?t[He]=o:v(n).invalidMonth=e}));var et="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),tt="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),nt=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,rt=De,ot=De;function it(e,t){return e?i(this._months)?this._months[e.month()]:this._months[(this._months.isFormat||nt).test(t)?"format":"standalone"][e.month()]:i(this._months)?this._months:this._months.standalone}function at(e,t){return e?i(this._monthsShort)?this._monthsShort[e.month()]:this._monthsShort[nt.test(t)?"format":"standalone"][e.month()]:i(this._monthsShort)?this._monthsShort:this._monthsShort.standalone}function lt(e,t,n){var r,o,i,a=e.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],r=0;r<12;++r)i=h([2e3,r]),this._shortMonthsParse[r]=this.monthsShort(i,"").toLocaleLowerCase(),this._longMonthsParse[r]=this.months(i,"").toLocaleLowerCase();return n?"MMM"===t?-1!==(o=Ve.call(this._shortMonthsParse,a))?o:null:-1!==(o=Ve.call(this._longMonthsParse,a))?o:null:"MMM"===t?-1!==(o=Ve.call(this._shortMonthsParse,a))||-1!==(o=Ve.call(this._longMonthsParse,a))?o:null:-1!==(o=Ve.call(this._longMonthsParse,a))||-1!==(o=Ve.call(this._shortMonthsParse,a))?o:null}function st(e,t,n){var r,o,i;if(this._monthsParseExact)return lt.call(this,e,t,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),r=0;r<12;r++){if(o=h([2e3,r]),n&&!this._longMonthsParse[r]&&(this._longMonthsParse[r]=new RegExp("^"+this.months(o,"").replace(".","")+"$","i"),this._shortMonthsParse[r]=new RegExp("^"+this.monthsShort(o,"").replace(".","")+"$","i")),n||this._monthsParse[r]||(i="^"+this.months(o,"")+"|^"+this.monthsShort(o,""),this._monthsParse[r]=new RegExp(i.replace(".",""),"i")),n&&"MMMM"===t&&this._longMonthsParse[r].test(e))return r;if(n&&"MMM"===t&&this._shortMonthsParse[r].test(e))return r;if(!n&&this._monthsParse[r].test(e))return r}}function ut(e,t){var n;if(!e.isValid())return e;if("string"===typeof t)if(/^\d+$/.test(t))t=ce(t);else if(!c(t=e.localeData().monthsParse(t)))return e;return n=Math.min(e.date(),Je(e.year(),t)),e._d["set"+(e._isUTC?"UTC":"")+"Month"](t,n),e}function ct(e){return null!=e?(ut(this,e),r.updateOffset(this,!0),this):fe(this,"Month")}function dt(){return Je(this.year(),this.month())}function ft(e){return this._monthsParseExact?(l(this,"_monthsRegex")||ht.call(this),e?this._monthsShortStrictRegex:this._monthsShortRegex):(l(this,"_monthsShortRegex")||(this._monthsShortRegex=rt),this._monthsShortStrictRegex&&e?this._monthsShortStrictRegex:this._monthsShortRegex)}function pt(e){return this._monthsParseExact?(l(this,"_monthsRegex")||ht.call(this),e?this._monthsStrictRegex:this._monthsRegex):(l(this,"_monthsRegex")||(this._monthsRegex=ot),this._monthsStrictRegex&&e?this._monthsStrictRegex:this._monthsRegex)}function ht(){function e(e,t){return t.length-e.length}var t,n,r=[],o=[],i=[];for(t=0;t<12;t++)n=h([2e3,t]),r.push(this.monthsShort(n,"")),o.push(this.months(n,"")),i.push(this.months(n,"")),i.push(this.monthsShort(n,""));for(r.sort(e),o.sort(e),i.sort(e),t=0;t<12;t++)r[t]=Le(r[t]),o[t]=Le(o[t]);for(t=0;t<24;t++)i[t]=Le(i[t]);this._monthsRegex=new RegExp("^("+i.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+o.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+r.join("|")+")","i")}function mt(e){return se(e)?366:365}W("Y",0,0,(function(){var e=this.year();return e<=9999?A(e,4):"+"+e})),W(0,["YY",2],0,(function(){return this.year()%100})),W(0,["YYYY",4],0,"year"),W(0,["YYYYY",5],0,"year"),W(0,["YYYYYY",6,!0],0,"year"),ne("year","y"),ae("year",1),Ie("Y",Pe),Ie("YY",Se,ye),Ie("YYYY",Re,be),Ie("YYYYY",Te,we),Ie("YYYYYY",Te,we),Fe(["YYYYY","YYYYYY"],qe),Fe("YYYY",(function(e,t){t[qe]=2===e.length?r.parseTwoDigitYear(e):ce(e)})),Fe("YY",(function(e,t){t[qe]=r.parseTwoDigitYear(e)})),Fe("Y",(function(e,t){t[qe]=parseInt(e,10)})),r.parseTwoDigitYear=function(e){return ce(e)+(ce(e)>68?1900:2e3)};var vt=de("FullYear",!0);function gt(){return se(this.year())}function yt(e,t,n,r,o,i,a){var l;return e<100&&e>=0?(l=new Date(e+400,t,n,r,o,i,a),isFinite(l.getFullYear())&&l.setFullYear(e)):l=new Date(e,t,n,r,o,i,a),l}function xt(e){var t,n;return e<100&&e>=0?((n=Array.prototype.slice.call(arguments))[0]=e+400,t=new Date(Date.UTC.apply(null,n)),isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e)):t=new Date(Date.UTC.apply(null,arguments)),t}function bt(e,t,n){var r=7+t-n;return-(7+xt(e,0,r).getUTCDay()-t)%7+r-1}function wt(e,t,n,r,o){var i,a,l=1+7*(t-1)+(7+n-r)%7+bt(e,r,o);return l<=0?a=mt(i=e-1)+l:l>mt(e)?(i=e+1,a=l-mt(e)):(i=e,a=l),{year:i,dayOfYear:a}}function St(e,t,n){var r,o,i=bt(e.year(),t,n),a=Math.floor((e.dayOfYear()-i-1)/7)+1;return a<1?r=a+jt(o=e.year()-1,t,n):a>jt(e.year(),t,n)?(r=a-jt(e.year(),t,n),o=e.year()+1):(o=e.year(),r=a),{week:r,year:o}}function jt(e,t,n){var r=bt(e,t,n),o=bt(e+1,t,n);return(mt(e)-r+o)/7}function kt(e){return St(e,this._week.dow,this._week.doy).week}W("w",["ww",2],"wo","week"),W("W",["WW",2],"Wo","isoWeek"),ne("week","w"),ne("isoWeek","W"),ae("week",5),ae("isoWeek",5),Ie("w",Se),Ie("ww",Se,ye),Ie("W",Se),Ie("WW",Se,ye),We(["w","ww","W","WW"],(function(e,t,n,r){t[r.substr(0,1)]=ce(e)}));var Ct={dow:0,doy:6};function Rt(){return this._week.dow}function Tt(){return this._week.doy}function Ot(e){var t=this.localeData().week(this);return null==e?t:this.add(7*(e-t),"d")}function Pt(e){var t=St(this,1,4).week;return null==e?t:this.add(7*(e-t),"d")}function Et(e,t){return"string"!==typeof e?e:isNaN(e)?"number"===typeof(e=t.weekdaysParse(e))?e:null:parseInt(e,10)}function Mt(e,t){return"string"===typeof e?t.weekdaysParse(e)%7||7:isNaN(e)?null:e}function _t(e,t){return e.slice(t,7).concat(e.slice(0,t))}W("d",0,"do","day"),W("dd",0,0,(function(e){return this.localeData().weekdaysMin(this,e)})),W("ddd",0,0,(function(e){return this.localeData().weekdaysShort(this,e)})),W("dddd",0,0,(function(e){return this.localeData().weekdays(this,e)})),W("e",0,0,"weekday"),W("E",0,0,"isoWeekday"),ne("day","d"),ne("weekday","e"),ne("isoWeekday","E"),ae("day",11),ae("weekday",11),ae("isoWeekday",11),Ie("d",Se),Ie("e",Se),Ie("E",Se),Ie("dd",(function(e,t){return t.weekdaysMinRegex(e)})),Ie("ddd",(function(e,t){return t.weekdaysShortRegex(e)})),Ie("dddd",(function(e,t){return t.weekdaysRegex(e)})),We(["dd","ddd","dddd"],(function(e,t,n,r){var o=n._locale.weekdaysParse(e,r,n._strict);null!=o?t.d=o:v(n).invalidWeekday=e})),We(["d","e","E"],(function(e,t,n,r){t[r]=ce(e)}));var Dt="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),It="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),At="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),Nt=De,Lt=De,zt=De;function Ft(e,t){var n=i(this._weekdays)?this._weekdays:this._weekdays[e&&!0!==e&&this._weekdays.isFormat.test(t)?"format":"standalone"];return!0===e?_t(n,this._week.dow):e?n[e.day()]:n}function Wt(e){return!0===e?_t(this._weekdaysShort,this._week.dow):e?this._weekdaysShort[e.day()]:this._weekdaysShort}function Bt(e){return!0===e?_t(this._weekdaysMin,this._week.dow):e?this._weekdaysMin[e.day()]:this._weekdaysMin}function Vt(e,t,n){var r,o,i,a=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],r=0;r<7;++r)i=h([2e3,1]).day(r),this._minWeekdaysParse[r]=this.weekdaysMin(i,"").toLocaleLowerCase(),this._shortWeekdaysParse[r]=this.weekdaysShort(i,"").toLocaleLowerCase(),this._weekdaysParse[r]=this.weekdays(i,"").toLocaleLowerCase();return n?"dddd"===t?-1!==(o=Ve.call(this._weekdaysParse,a))?o:null:"ddd"===t?-1!==(o=Ve.call(this._shortWeekdaysParse,a))?o:null:-1!==(o=Ve.call(this._minWeekdaysParse,a))?o:null:"dddd"===t?-1!==(o=Ve.call(this._weekdaysParse,a))||-1!==(o=Ve.call(this._shortWeekdaysParse,a))||-1!==(o=Ve.call(this._minWeekdaysParse,a))?o:null:"ddd"===t?-1!==(o=Ve.call(this._shortWeekdaysParse,a))||-1!==(o=Ve.call(this._weekdaysParse,a))||-1!==(o=Ve.call(this._minWeekdaysParse,a))?o:null:-1!==(o=Ve.call(this._minWeekdaysParse,a))||-1!==(o=Ve.call(this._weekdaysParse,a))||-1!==(o=Ve.call(this._shortWeekdaysParse,a))?o:null}function qt(e,t,n){var r,o,i;if(this._weekdaysParseExact)return Vt.call(this,e,t,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),r=0;r<7;r++){if(o=h([2e3,1]).day(r),n&&!this._fullWeekdaysParse[r]&&(this._fullWeekdaysParse[r]=new RegExp("^"+this.weekdays(o,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[r]=new RegExp("^"+this.weekdaysShort(o,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[r]=new RegExp("^"+this.weekdaysMin(o,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[r]||(i="^"+this.weekdays(o,"")+"|^"+this.weekdaysShort(o,"")+"|^"+this.weekdaysMin(o,""),this._weekdaysParse[r]=new RegExp(i.replace(".",""),"i")),n&&"dddd"===t&&this._fullWeekdaysParse[r].test(e))return r;if(n&&"ddd"===t&&this._shortWeekdaysParse[r].test(e))return r;if(n&&"dd"===t&&this._minWeekdaysParse[r].test(e))return r;if(!n&&this._weekdaysParse[r].test(e))return r}}function Ht(e){if(!this.isValid())return null!=e?this:NaN;var t=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=e?(e=Et(e,this.localeData()),this.add(e-t,"d")):t}function Ut(e){if(!this.isValid())return null!=e?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return null==e?t:this.add(e-t,"d")}function Yt(e){if(!this.isValid())return null!=e?this:NaN;if(null!=e){var t=Mt(e,this.localeData());return this.day(this.day()%7?t:t-7)}return this.day()||7}function Gt(e){return this._weekdaysParseExact?(l(this,"_weekdaysRegex")||Kt.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(l(this,"_weekdaysRegex")||(this._weekdaysRegex=Nt),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)}function Qt(e){return this._weekdaysParseExact?(l(this,"_weekdaysRegex")||Kt.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(l(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Lt),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function $t(e){return this._weekdaysParseExact?(l(this,"_weekdaysRegex")||Kt.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(l(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=zt),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Kt(){function e(e,t){return t.length-e.length}var t,n,r,o,i,a=[],l=[],s=[],u=[];for(t=0;t<7;t++)n=h([2e3,1]).day(t),r=Le(this.weekdaysMin(n,"")),o=Le(this.weekdaysShort(n,"")),i=Le(this.weekdays(n,"")),a.push(r),l.push(o),s.push(i),u.push(r),u.push(o),u.push(i);a.sort(e),l.sort(e),s.sort(e),u.sort(e),this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+a.join("|")+")","i")}function Xt(){return this.hours()%12||12}function Zt(){return this.hours()||24}function Jt(e,t){W(e,0,0,(function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)}))}function en(e,t){return t._meridiemParse}function tn(e){return"p"===(e+"").toLowerCase().charAt(0)}W("H",["HH",2],0,"hour"),W("h",["hh",2],0,Xt),W("k",["kk",2],0,Zt),W("hmm",0,0,(function(){return""+Xt.apply(this)+A(this.minutes(),2)})),W("hmmss",0,0,(function(){return""+Xt.apply(this)+A(this.minutes(),2)+A(this.seconds(),2)})),W("Hmm",0,0,(function(){return""+this.hours()+A(this.minutes(),2)})),W("Hmmss",0,0,(function(){return""+this.hours()+A(this.minutes(),2)+A(this.seconds(),2)})),Jt("a",!0),Jt("A",!1),ne("hour","h"),ae("hour",13),Ie("a",en),Ie("A",en),Ie("H",Se),Ie("h",Se),Ie("k",Se),Ie("HH",Se,ye),Ie("hh",Se,ye),Ie("kk",Se,ye),Ie("hmm",je),Ie("hmmss",ke),Ie("Hmm",je),Ie("Hmmss",ke),Fe(["H","HH"],Ye),Fe(["k","kk"],(function(e,t,n){var r=ce(e);t[Ye]=24===r?0:r})),Fe(["a","A"],(function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e})),Fe(["h","hh"],(function(e,t,n){t[Ye]=ce(e),v(n).bigHour=!0})),Fe("hmm",(function(e,t,n){var r=e.length-2;t[Ye]=ce(e.substr(0,r)),t[Ge]=ce(e.substr(r)),v(n).bigHour=!0})),Fe("hmmss",(function(e,t,n){var r=e.length-4,o=e.length-2;t[Ye]=ce(e.substr(0,r)),t[Ge]=ce(e.substr(r,2)),t[Qe]=ce(e.substr(o)),v(n).bigHour=!0})),Fe("Hmm",(function(e,t,n){var r=e.length-2;t[Ye]=ce(e.substr(0,r)),t[Ge]=ce(e.substr(r))})),Fe("Hmmss",(function(e,t,n){var r=e.length-4,o=e.length-2;t[Ye]=ce(e.substr(0,r)),t[Ge]=ce(e.substr(r,2)),t[Qe]=ce(e.substr(o))}));var nn=/[ap]\.?m?\.?/i,rn=de("Hours",!0);function on(e,t,n){return e>11?n?"pm":"PM":n?"am":"AM"}var an,ln={calendar:D,longDateFormat:U,invalidDate:G,ordinal:$,dayOfMonthOrdinalParse:K,relativeTime:Z,months:et,monthsShort:tt,week:Ct,weekdays:Dt,weekdaysMin:At,weekdaysShort:It,meridiemParse:nn},sn={},un={};function cn(e,t){var n,r=Math.min(e.length,t.length);for(n=0;n<r;n+=1)if(e[n]!==t[n])return n;return r}function dn(e){return e?e.toLowerCase().replace("_","-"):e}function fn(e){for(var t,n,r,o,i=0;i<e.length;){for(t=(o=dn(e[i]).split("-")).length,n=(n=dn(e[i+1]))?n.split("-"):null;t>0;){if(r=hn(o.slice(0,t).join("-")))return r;if(n&&n.length>=t&&cn(o,n)>=t-1)break;t--}i++}return an}function pn(e){return null!=e.match("^[^/\\\\]*$")}function hn(t){var n=null;if(void 0===sn[t]&&e&&e.exports&&pn(t))try{n=an._abbr,Object(function(){var e=new Error("Cannot find module 'undefined'");throw e.code="MODULE_NOT_FOUND",e}()),mn(n)}catch(r){sn[t]=null}return sn[t]}function mn(e,t){var n;return e&&((n=u(t)?yn(e):vn(e,t))?an=n:"undefined"!==typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),an._abbr}function vn(e,t){if(null!==t){var n,r=ln;if(t.abbr=e,null!=sn[e])O("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),r=sn[e]._config;else if(null!=t.parentLocale)if(null!=sn[t.parentLocale])r=sn[t.parentLocale]._config;else{if(null==(n=hn(t.parentLocale)))return un[t.parentLocale]||(un[t.parentLocale]=[]),un[t.parentLocale].push({name:e,config:t}),null;r=n._config}return sn[e]=new _(M(r,t)),un[e]&&un[e].forEach((function(e){vn(e.name,e.config)})),mn(e),sn[e]}return delete sn[e],null}function gn(e,t){if(null!=t){var n,r,o=ln;null!=sn[e]&&null!=sn[e].parentLocale?sn[e].set(M(sn[e]._config,t)):(null!=(r=hn(e))&&(o=r._config),t=M(o,t),null==r&&(t.abbr=e),(n=new _(t)).parentLocale=sn[e],sn[e]=n),mn(e)}else null!=sn[e]&&(null!=sn[e].parentLocale?(sn[e]=sn[e].parentLocale,e===mn()&&mn(e)):null!=sn[e]&&delete sn[e]);return sn[e]}function yn(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return an;if(!i(e)){if(t=hn(e))return t;e=[e]}return fn(e)}function xn(){return R(sn)}function bn(e){var t,n=e._a;return n&&-2===v(e).overflow&&(t=n[He]<0||n[He]>11?He:n[Ue]<1||n[Ue]>Je(n[qe],n[He])?Ue:n[Ye]<0||n[Ye]>24||24===n[Ye]&&(0!==n[Ge]||0!==n[Qe]||0!==n[$e])?Ye:n[Ge]<0||n[Ge]>59?Ge:n[Qe]<0||n[Qe]>59?Qe:n[$e]<0||n[$e]>999?$e:-1,v(e)._overflowDayOfYear&&(t<qe||t>Ue)&&(t=Ue),v(e)._overflowWeeks&&-1===t&&(t=Ke),v(e)._overflowWeekday&&-1===t&&(t=Xe),v(e).overflow=t),e}var wn=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Sn=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,jn=/Z|[+-]\d\d(?::?\d\d)?/,kn=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],Cn=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Rn=/^\/?Date\((-?\d+)/i,Tn=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,On={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function Pn(e){var t,n,r,o,i,a,l=e._i,s=wn.exec(l)||Sn.exec(l),u=kn.length,c=Cn.length;if(s){for(v(e).iso=!0,t=0,n=u;t<n;t++)if(kn[t][1].exec(s[1])){o=kn[t][0],r=!1!==kn[t][2];break}if(null==o)return void(e._isValid=!1);if(s[3]){for(t=0,n=c;t<n;t++)if(Cn[t][1].exec(s[3])){i=(s[2]||" ")+Cn[t][0];break}if(null==i)return void(e._isValid=!1)}if(!r&&null!=i)return void(e._isValid=!1);if(s[4]){if(!jn.exec(s[4]))return void(e._isValid=!1);a="Z"}e._f=o+(i||"")+(a||""),Bn(e)}else e._isValid=!1}function En(e,t,n,r,o,i){var a=[Mn(e),tt.indexOf(t),parseInt(n,10),parseInt(r,10),parseInt(o,10)];return i&&a.push(parseInt(i,10)),a}function Mn(e){var t=parseInt(e,10);return t<=49?2e3+t:t<=999?1900+t:t}function _n(e){return e.replace(/\([^()]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").replace(/^\s\s*/,"").replace(/\s\s*$/,"")}function Dn(e,t,n){return!e||It.indexOf(e)===new Date(t[0],t[1],t[2]).getDay()||(v(n).weekdayMismatch=!0,n._isValid=!1,!1)}function In(e,t,n){if(e)return On[e];if(t)return 0;var r=parseInt(n,10),o=r%100;return(r-o)/100*60+o}function An(e){var t,n=Tn.exec(_n(e._i));if(n){if(t=En(n[4],n[3],n[2],n[5],n[6],n[7]),!Dn(n[1],t,e))return;e._a=t,e._tzm=In(n[8],n[9],n[10]),e._d=xt.apply(null,e._a),e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),v(e).rfc2822=!0}else e._isValid=!1}function Nn(e){var t=Rn.exec(e._i);null===t?(Pn(e),!1===e._isValid&&(delete e._isValid,An(e),!1===e._isValid&&(delete e._isValid,e._strict?e._isValid=!1:r.createFromInputFallback(e)))):e._d=new Date(+t[1])}function Ln(e,t,n){return null!=e?e:null!=t?t:n}function zn(e){var t=new Date(r.now());return e._useUTC?[t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate()]:[t.getFullYear(),t.getMonth(),t.getDate()]}function Fn(e){var t,n,r,o,i,a=[];if(!e._d){for(r=zn(e),e._w&&null==e._a[Ue]&&null==e._a[He]&&Wn(e),null!=e._dayOfYear&&(i=Ln(e._a[qe],r[qe]),(e._dayOfYear>mt(i)||0===e._dayOfYear)&&(v(e)._overflowDayOfYear=!0),n=xt(i,0,e._dayOfYear),e._a[He]=n.getUTCMonth(),e._a[Ue]=n.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=a[t]=r[t];for(;t<7;t++)e._a[t]=a[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[Ye]&&0===e._a[Ge]&&0===e._a[Qe]&&0===e._a[$e]&&(e._nextDay=!0,e._a[Ye]=0),e._d=(e._useUTC?xt:yt).apply(null,a),o=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[Ye]=24),e._w&&"undefined"!==typeof e._w.d&&e._w.d!==o&&(v(e).weekdayMismatch=!0)}}function Wn(e){var t,n,r,o,i,a,l,s,u;null!=(t=e._w).GG||null!=t.W||null!=t.E?(i=1,a=4,n=Ln(t.GG,e._a[qe],St($n(),1,4).year),r=Ln(t.W,1),((o=Ln(t.E,1))<1||o>7)&&(s=!0)):(i=e._locale._week.dow,a=e._locale._week.doy,u=St($n(),i,a),n=Ln(t.gg,e._a[qe],u.year),r=Ln(t.w,u.week),null!=t.d?((o=t.d)<0||o>6)&&(s=!0):null!=t.e?(o=t.e+i,(t.e<0||t.e>6)&&(s=!0)):o=i),r<1||r>jt(n,i,a)?v(e)._overflowWeeks=!0:null!=s?v(e)._overflowWeekday=!0:(l=wt(n,r,o,i,a),e._a[qe]=l.year,e._dayOfYear=l.dayOfYear)}function Bn(e){if(e._f!==r.ISO_8601)if(e._f!==r.RFC_2822){e._a=[],v(e).empty=!0;var t,n,o,i,a,l,s,u=""+e._i,c=u.length,d=0;for(s=(o=H(e._f,e._locale).match(N)||[]).length,t=0;t<s;t++)i=o[t],(n=(u.match(Ae(i,e))||[])[0])&&((a=u.substr(0,u.indexOf(n))).length>0&&v(e).unusedInput.push(a),u=u.slice(u.indexOf(n)+n.length),d+=n.length),F[i]?(n?v(e).empty=!1:v(e).unusedTokens.push(i),Be(i,n,e)):e._strict&&!n&&v(e).unusedTokens.push(i);v(e).charsLeftOver=c-d,u.length>0&&v(e).unusedInput.push(u),e._a[Ye]<=12&&!0===v(e).bigHour&&e._a[Ye]>0&&(v(e).bigHour=void 0),v(e).parsedDateParts=e._a.slice(0),v(e).meridiem=e._meridiem,e._a[Ye]=Vn(e._locale,e._a[Ye],e._meridiem),null!==(l=v(e).era)&&(e._a[qe]=e._locale.erasConvertYear(l,e._a[qe])),Fn(e),bn(e)}else An(e);else Pn(e)}function Vn(e,t,n){var r;return null==n?t:null!=e.meridiemHour?e.meridiemHour(t,n):null!=e.isPM?((r=e.isPM(n))&&t<12&&(t+=12),r||12!==t||(t=0),t):t}function qn(e){var t,n,r,o,i,a,l=!1,s=e._f.length;if(0===s)return v(e).invalidFormat=!0,void(e._d=new Date(NaN));for(o=0;o<s;o++)i=0,a=!1,t=w({},e),null!=e._useUTC&&(t._useUTC=e._useUTC),t._f=e._f[o],Bn(t),g(t)&&(a=!0),i+=v(t).charsLeftOver,i+=10*v(t).unusedTokens.length,v(t).score=i,l?i<r&&(r=i,n=t):(null==r||i<r||a)&&(r=i,n=t,a&&(l=!0));p(e,n||t)}function Hn(e){if(!e._d){var t=oe(e._i),n=void 0===t.day?t.date:t.day;e._a=f([t.year,t.month,n,t.hour,t.minute,t.second,t.millisecond],(function(e){return e&&parseInt(e,10)})),Fn(e)}}function Un(e){var t=new S(bn(Yn(e)));return t._nextDay&&(t.add(1,"d"),t._nextDay=void 0),t}function Yn(e){var t=e._i,n=e._f;return e._locale=e._locale||yn(e._l),null===t||void 0===n&&""===t?y({nullInput:!0}):("string"===typeof t&&(e._i=t=e._locale.preparse(t)),j(t)?new S(bn(t)):(d(t)?e._d=t:i(n)?qn(e):n?Bn(e):Gn(e),g(e)||(e._d=null),e))}function Gn(e){var t=e._i;u(t)?e._d=new Date(r.now()):d(t)?e._d=new Date(t.valueOf()):"string"===typeof t?Nn(e):i(t)?(e._a=f(t.slice(0),(function(e){return parseInt(e,10)})),Fn(e)):a(t)?Hn(e):c(t)?e._d=new Date(t):r.createFromInputFallback(e)}function Qn(e,t,n,r,o){var l={};return!0!==t&&!1!==t||(r=t,t=void 0),!0!==n&&!1!==n||(r=n,n=void 0),(a(e)&&s(e)||i(e)&&0===e.length)&&(e=void 0),l._isAMomentObject=!0,l._useUTC=l._isUTC=o,l._l=n,l._i=e,l._f=t,l._strict=r,Un(l)}function $n(e,t,n,r){return Qn(e,t,n,r,!1)}r.createFromInputFallback=C("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",(function(e){e._d=new Date(e._i+(e._useUTC?" UTC":""))})),r.ISO_8601=function(){},r.RFC_2822=function(){};var Kn=C("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",(function(){var e=$n.apply(null,arguments);return this.isValid()&&e.isValid()?e<this?this:e:y()})),Xn=C("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",(function(){var e=$n.apply(null,arguments);return this.isValid()&&e.isValid()?e>this?this:e:y()}));function Zn(e,t){var n,r;if(1===t.length&&i(t[0])&&(t=t[0]),!t.length)return $n();for(n=t[0],r=1;r<t.length;++r)t[r].isValid()&&!t[r][e](n)||(n=t[r]);return n}function Jn(){return Zn("isBefore",[].slice.call(arguments,0))}function er(){return Zn("isAfter",[].slice.call(arguments,0))}var tr=function(){return Date.now?Date.now():+new Date},nr=["year","quarter","month","week","day","hour","minute","second","millisecond"];function rr(e){var t,n,r=!1,o=nr.length;for(t in e)if(l(e,t)&&(-1===Ve.call(nr,t)||null!=e[t]&&isNaN(e[t])))return!1;for(n=0;n<o;++n)if(e[nr[n]]){if(r)return!1;parseFloat(e[nr[n]])!==ce(e[nr[n]])&&(r=!0)}return!0}function or(){return this._isValid}function ir(){return Or(NaN)}function ar(e){var t=oe(e),n=t.year||0,r=t.quarter||0,o=t.month||0,i=t.week||t.isoWeek||0,a=t.day||0,l=t.hour||0,s=t.minute||0,u=t.second||0,c=t.millisecond||0;this._isValid=rr(t),this._milliseconds=+c+1e3*u+6e4*s+1e3*l*60*60,this._days=+a+7*i,this._months=+o+3*r+12*n,this._data={},this._locale=yn(),this._bubble()}function lr(e){return e instanceof ar}function sr(e){return e<0?-1*Math.round(-1*e):Math.round(e)}function ur(e,t,n){var r,o=Math.min(e.length,t.length),i=Math.abs(e.length-t.length),a=0;for(r=0;r<o;r++)(n&&e[r]!==t[r]||!n&&ce(e[r])!==ce(t[r]))&&a++;return a+i}function cr(e,t){W(e,0,0,(function(){var e=this.utcOffset(),n="+";return e<0&&(e=-e,n="-"),n+A(~~(e/60),2)+t+A(~~e%60,2)}))}cr("Z",":"),cr("ZZ",""),Ie("Z",Me),Ie("ZZ",Me),Fe(["Z","ZZ"],(function(e,t,n){n._useUTC=!0,n._tzm=fr(Me,e)}));var dr=/([\+\-]|\d\d)/gi;function fr(e,t){var n,r,o=(t||"").match(e);return null===o?null:0===(r=60*(n=((o[o.length-1]||[])+"").match(dr)||["-",0,0])[1]+ce(n[2]))?0:"+"===n[0]?r:-r}function pr(e,t){var n,o;return t._isUTC?(n=t.clone(),o=(j(e)||d(e)?e.valueOf():$n(e).valueOf())-n.valueOf(),n._d.setTime(n._d.valueOf()+o),r.updateOffset(n,!1),n):$n(e).local()}function hr(e){return-Math.round(e._d.getTimezoneOffset())}function mr(e,t,n){var o,i=this._offset||0;if(!this.isValid())return null!=e?this:NaN;if(null!=e){if("string"===typeof e){if(null===(e=fr(Me,e)))return this}else Math.abs(e)<16&&!n&&(e*=60);return!this._isUTC&&t&&(o=hr(this)),this._offset=e,this._isUTC=!0,null!=o&&this.add(o,"m"),i!==e&&(!t||this._changeInProgress?Dr(this,Or(e-i,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,r.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?i:hr(this)}function vr(e,t){return null!=e?("string"!==typeof e&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()}function gr(e){return this.utcOffset(0,e)}function yr(e){return this._isUTC&&(this.utcOffset(0,e),this._isUTC=!1,e&&this.subtract(hr(this),"m")),this}function xr(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"===typeof this._i){var e=fr(Ee,this._i);null!=e?this.utcOffset(e):this.utcOffset(0,!0)}return this}function br(e){return!!this.isValid()&&(e=e?$n(e).utcOffset():0,(this.utcOffset()-e)%60===0)}function wr(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Sr(){if(!u(this._isDSTShifted))return this._isDSTShifted;var e,t={};return w(t,this),(t=Yn(t))._a?(e=t._isUTC?h(t._a):$n(t._a),this._isDSTShifted=this.isValid()&&ur(t._a,e.toArray())>0):this._isDSTShifted=!1,this._isDSTShifted}function jr(){return!!this.isValid()&&!this._isUTC}function kr(){return!!this.isValid()&&this._isUTC}function Cr(){return!!this.isValid()&&this._isUTC&&0===this._offset}r.updateOffset=function(){};var Rr=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,Tr=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function Or(e,t){var n,r,o,i=e,a=null;return lr(e)?i={ms:e._milliseconds,d:e._days,M:e._months}:c(e)||!isNaN(+e)?(i={},t?i[t]=+e:i.milliseconds=+e):(a=Rr.exec(e))?(n="-"===a[1]?-1:1,i={y:0,d:ce(a[Ue])*n,h:ce(a[Ye])*n,m:ce(a[Ge])*n,s:ce(a[Qe])*n,ms:ce(sr(1e3*a[$e]))*n}):(a=Tr.exec(e))?(n="-"===a[1]?-1:1,i={y:Pr(a[2],n),M:Pr(a[3],n),w:Pr(a[4],n),d:Pr(a[5],n),h:Pr(a[6],n),m:Pr(a[7],n),s:Pr(a[8],n)}):null==i?i={}:"object"===typeof i&&("from"in i||"to"in i)&&(o=Mr($n(i.from),$n(i.to)),(i={}).ms=o.milliseconds,i.M=o.months),r=new ar(i),lr(e)&&l(e,"_locale")&&(r._locale=e._locale),lr(e)&&l(e,"_isValid")&&(r._isValid=e._isValid),r}function Pr(e,t){var n=e&&parseFloat(e.replace(",","."));return(isNaN(n)?0:n)*t}function Er(e,t){var n={};return n.months=t.month()-e.month()+12*(t.year()-e.year()),e.clone().add(n.months,"M").isAfter(t)&&--n.months,n.milliseconds=+t-+e.clone().add(n.months,"M"),n}function Mr(e,t){var n;return e.isValid()&&t.isValid()?(t=pr(t,e),e.isBefore(t)?n=Er(e,t):((n=Er(t,e)).milliseconds=-n.milliseconds,n.months=-n.months),n):{milliseconds:0,months:0}}function _r(e,t){return function(n,r){var o;return null===r||isNaN(+r)||(O(t,"moment()."+t+"(period, number) is deprecated. Please use moment()."+t+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),o=n,n=r,r=o),Dr(this,Or(n,r),e),this}}function Dr(e,t,n,o){var i=t._milliseconds,a=sr(t._days),l=sr(t._months);e.isValid()&&(o=null==o||o,l&&ut(e,fe(e,"Month")+l*n),a&&pe(e,"Date",fe(e,"Date")+a*n),i&&e._d.setTime(e._d.valueOf()+i*n),o&&r.updateOffset(e,a||l))}Or.fn=ar.prototype,Or.invalid=ir;var Ir=_r(1,"add"),Ar=_r(-1,"subtract");function Nr(e){return"string"===typeof e||e instanceof String}function Lr(e){return j(e)||d(e)||Nr(e)||c(e)||Fr(e)||zr(e)||null===e||void 0===e}function zr(e){var t,n,r=a(e)&&!s(e),o=!1,i=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],u=i.length;for(t=0;t<u;t+=1)n=i[t],o=o||l(e,n);return r&&o}function Fr(e){var t=i(e),n=!1;return t&&(n=0===e.filter((function(t){return!c(t)&&Nr(e)})).length),t&&n}function Wr(e){var t,n,r=a(e)&&!s(e),o=!1,i=["sameDay","nextDay","lastDay","nextWeek","lastWeek","sameElse"];for(t=0;t<i.length;t+=1)n=i[t],o=o||l(e,n);return r&&o}function Br(e,t){var n=e.diff(t,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"}function Vr(e,t){1===arguments.length&&(arguments[0]?Lr(arguments[0])?(e=arguments[0],t=void 0):Wr(arguments[0])&&(t=arguments[0],e=void 0):(e=void 0,t=void 0));var n=e||$n(),o=pr(n,this).startOf("day"),i=r.calendarFormat(this,o)||"sameElse",a=t&&(P(t[i])?t[i].call(this,n):t[i]);return this.format(a||this.localeData().calendar(i,this,$n(n)))}function qr(){return new S(this)}function Hr(e,t){var n=j(e)?e:$n(e);return!(!this.isValid()||!n.isValid())&&("millisecond"===(t=re(t)||"millisecond")?this.valueOf()>n.valueOf():n.valueOf()<this.clone().startOf(t).valueOf())}function Ur(e,t){var n=j(e)?e:$n(e);return!(!this.isValid()||!n.isValid())&&("millisecond"===(t=re(t)||"millisecond")?this.valueOf()<n.valueOf():this.clone().endOf(t).valueOf()<n.valueOf())}function Yr(e,t,n,r){var o=j(e)?e:$n(e),i=j(t)?t:$n(t);return!!(this.isValid()&&o.isValid()&&i.isValid())&&("("===(r=r||"()")[0]?this.isAfter(o,n):!this.isBefore(o,n))&&(")"===r[1]?this.isBefore(i,n):!this.isAfter(i,n))}function Gr(e,t){var n,r=j(e)?e:$n(e);return!(!this.isValid()||!r.isValid())&&("millisecond"===(t=re(t)||"millisecond")?this.valueOf()===r.valueOf():(n=r.valueOf(),this.clone().startOf(t).valueOf()<=n&&n<=this.clone().endOf(t).valueOf()))}function Qr(e,t){return this.isSame(e,t)||this.isAfter(e,t)}function $r(e,t){return this.isSame(e,t)||this.isBefore(e,t)}function Kr(e,t,n){var r,o,i;if(!this.isValid())return NaN;if(!(r=pr(e,this)).isValid())return NaN;switch(o=6e4*(r.utcOffset()-this.utcOffset()),t=re(t)){case"year":i=Xr(this,r)/12;break;case"month":i=Xr(this,r);break;case"quarter":i=Xr(this,r)/3;break;case"second":i=(this-r)/1e3;break;case"minute":i=(this-r)/6e4;break;case"hour":i=(this-r)/36e5;break;case"day":i=(this-r-o)/864e5;break;case"week":i=(this-r-o)/6048e5;break;default:i=this-r}return n?i:ue(i)}function Xr(e,t){if(e.date()<t.date())return-Xr(t,e);var n=12*(t.year()-e.year())+(t.month()-e.month()),r=e.clone().add(n,"months");return-(n+(t-r<0?(t-r)/(r-e.clone().add(n-1,"months")):(t-r)/(e.clone().add(n+1,"months")-r)))||0}function Zr(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function Jr(e){if(!this.isValid())return null;var t=!0!==e,n=t?this.clone().utc():this;return n.year()<0||n.year()>9999?q(n,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):P(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",q(n,"Z")):q(n,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function eo(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e,t,n,r,o="moment",i="";return this.isLocal()||(o=0===this.utcOffset()?"moment.utc":"moment.parseZone",i="Z"),e="["+o+'("]',t=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",n="-MM-DD[T]HH:mm:ss.SSS",r=i+'[")]',this.format(e+t+n+r)}function to(e){e||(e=this.isUtc()?r.defaultFormatUtc:r.defaultFormat);var t=q(this,e);return this.localeData().postformat(t)}function no(e,t){return this.isValid()&&(j(e)&&e.isValid()||$n(e).isValid())?Or({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function ro(e){return this.from($n(),e)}function oo(e,t){return this.isValid()&&(j(e)&&e.isValid()||$n(e).isValid())?Or({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function io(e){return this.to($n(),e)}function ao(e){var t;return void 0===e?this._locale._abbr:(null!=(t=yn(e))&&(this._locale=t),this)}r.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",r.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var lo=C("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",(function(e){return void 0===e?this.localeData():this.locale(e)}));function so(){return this._locale}var uo=1e3,co=60*uo,fo=60*co,po=3506328*fo;function ho(e,t){return(e%t+t)%t}function mo(e,t,n){return e<100&&e>=0?new Date(e+400,t,n)-po:new Date(e,t,n).valueOf()}function vo(e,t,n){return e<100&&e>=0?Date.UTC(e+400,t,n)-po:Date.UTC(e,t,n)}function go(e){var t,n;if(void 0===(e=re(e))||"millisecond"===e||!this.isValid())return this;switch(n=this._isUTC?vo:mo,e){case"year":t=n(this.year(),0,1);break;case"quarter":t=n(this.year(),this.month()-this.month()%3,1);break;case"month":t=n(this.year(),this.month(),1);break;case"week":t=n(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":t=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":t=n(this.year(),this.month(),this.date());break;case"hour":t=this._d.valueOf(),t-=ho(t+(this._isUTC?0:this.utcOffset()*co),fo);break;case"minute":t=this._d.valueOf(),t-=ho(t,co);break;case"second":t=this._d.valueOf(),t-=ho(t,uo)}return this._d.setTime(t),r.updateOffset(this,!0),this}function yo(e){var t,n;if(void 0===(e=re(e))||"millisecond"===e||!this.isValid())return this;switch(n=this._isUTC?vo:mo,e){case"year":t=n(this.year()+1,0,1)-1;break;case"quarter":t=n(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":t=n(this.year(),this.month()+1,1)-1;break;case"week":t=n(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":t=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":t=n(this.year(),this.month(),this.date()+1)-1;break;case"hour":t=this._d.valueOf(),t+=fo-ho(t+(this._isUTC?0:this.utcOffset()*co),fo)-1;break;case"minute":t=this._d.valueOf(),t+=co-ho(t,co)-1;break;case"second":t=this._d.valueOf(),t+=uo-ho(t,uo)-1}return this._d.setTime(t),r.updateOffset(this,!0),this}function xo(){return this._d.valueOf()-6e4*(this._offset||0)}function bo(){return Math.floor(this.valueOf()/1e3)}function wo(){return new Date(this.valueOf())}function So(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]}function jo(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}}function ko(){return this.isValid()?this.toISOString():null}function Co(){return g(this)}function Ro(){return p({},v(this))}function To(){return v(this).overflow}function Oo(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function Po(e,t){var n,o,i,a=this._eras||yn("en")._eras;for(n=0,o=a.length;n<o;++n)switch("string"===typeof a[n].since&&(i=r(a[n].since).startOf("day"),a[n].since=i.valueOf()),typeof a[n].until){case"undefined":a[n].until=1/0;break;case"string":i=r(a[n].until).startOf("day").valueOf(),a[n].until=i.valueOf()}return a}function Eo(e,t,n){var r,o,i,a,l,s=this.eras();for(e=e.toUpperCase(),r=0,o=s.length;r<o;++r)if(i=s[r].name.toUpperCase(),a=s[r].abbr.toUpperCase(),l=s[r].narrow.toUpperCase(),n)switch(t){case"N":case"NN":case"NNN":if(a===e)return s[r];break;case"NNNN":if(i===e)return s[r];break;case"NNNNN":if(l===e)return s[r]}else if([i,a,l].indexOf(e)>=0)return s[r]}function Mo(e,t){var n=e.since<=e.until?1:-1;return void 0===t?r(e.since).year():r(e.since).year()+(t-e.offset)*n}function _o(){var e,t,n,r=this.localeData().eras();for(e=0,t=r.length;e<t;++e){if(n=this.clone().startOf("day").valueOf(),r[e].since<=n&&n<=r[e].until)return r[e].name;if(r[e].until<=n&&n<=r[e].since)return r[e].name}return""}function Do(){var e,t,n,r=this.localeData().eras();for(e=0,t=r.length;e<t;++e){if(n=this.clone().startOf("day").valueOf(),r[e].since<=n&&n<=r[e].until)return r[e].narrow;if(r[e].until<=n&&n<=r[e].since)return r[e].narrow}return""}function Io(){var e,t,n,r=this.localeData().eras();for(e=0,t=r.length;e<t;++e){if(n=this.clone().startOf("day").valueOf(),r[e].since<=n&&n<=r[e].until)return r[e].abbr;if(r[e].until<=n&&n<=r[e].since)return r[e].abbr}return""}function Ao(){var e,t,n,o,i=this.localeData().eras();for(e=0,t=i.length;e<t;++e)if(n=i[e].since<=i[e].until?1:-1,o=this.clone().startOf("day").valueOf(),i[e].since<=o&&o<=i[e].until||i[e].until<=o&&o<=i[e].since)return(this.year()-r(i[e].since).year())*n+i[e].offset;return this.year()}function No(e){return l(this,"_erasNameRegex")||qo.call(this),e?this._erasNameRegex:this._erasRegex}function Lo(e){return l(this,"_erasAbbrRegex")||qo.call(this),e?this._erasAbbrRegex:this._erasRegex}function zo(e){return l(this,"_erasNarrowRegex")||qo.call(this),e?this._erasNarrowRegex:this._erasRegex}function Fo(e,t){return t.erasAbbrRegex(e)}function Wo(e,t){return t.erasNameRegex(e)}function Bo(e,t){return t.erasNarrowRegex(e)}function Vo(e,t){return t._eraYearOrdinalRegex||Oe}function qo(){var e,t,n=[],r=[],o=[],i=[],a=this.eras();for(e=0,t=a.length;e<t;++e)r.push(Le(a[e].name)),n.push(Le(a[e].abbr)),o.push(Le(a[e].narrow)),i.push(Le(a[e].name)),i.push(Le(a[e].abbr)),i.push(Le(a[e].narrow));this._erasRegex=new RegExp("^("+i.join("|")+")","i"),this._erasNameRegex=new RegExp("^("+r.join("|")+")","i"),this._erasAbbrRegex=new RegExp("^("+n.join("|")+")","i"),this._erasNarrowRegex=new RegExp("^("+o.join("|")+")","i")}function Ho(e,t){W(0,[e,e.length],0,t)}function Uo(e){return Xo.call(this,e,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function Yo(e){return Xo.call(this,e,this.isoWeek(),this.isoWeekday(),1,4)}function Go(){return jt(this.year(),1,4)}function Qo(){return jt(this.isoWeekYear(),1,4)}function $o(){var e=this.localeData()._week;return jt(this.year(),e.dow,e.doy)}function Ko(){var e=this.localeData()._week;return jt(this.weekYear(),e.dow,e.doy)}function Xo(e,t,n,r,o){var i;return null==e?St(this,r,o).year:(t>(i=jt(e,r,o))&&(t=i),Zo.call(this,e,t,n,r,o))}function Zo(e,t,n,r,o){var i=wt(e,t,n,r,o),a=xt(i.year,0,i.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}function Jo(e){return null==e?Math.ceil((this.month()+1)/3):this.month(3*(e-1)+this.month()%3)}W("N",0,0,"eraAbbr"),W("NN",0,0,"eraAbbr"),W("NNN",0,0,"eraAbbr"),W("NNNN",0,0,"eraName"),W("NNNNN",0,0,"eraNarrow"),W("y",["y",1],"yo","eraYear"),W("y",["yy",2],0,"eraYear"),W("y",["yyy",3],0,"eraYear"),W("y",["yyyy",4],0,"eraYear"),Ie("N",Fo),Ie("NN",Fo),Ie("NNN",Fo),Ie("NNNN",Wo),Ie("NNNNN",Bo),Fe(["N","NN","NNN","NNNN","NNNNN"],(function(e,t,n,r){var o=n._locale.erasParse(e,r,n._strict);o?v(n).era=o:v(n).invalidEra=e})),Ie("y",Oe),Ie("yy",Oe),Ie("yyy",Oe),Ie("yyyy",Oe),Ie("yo",Vo),Fe(["y","yy","yyy","yyyy"],qe),Fe(["yo"],(function(e,t,n,r){var o;n._locale._eraYearOrdinalRegex&&(o=e.match(n._locale._eraYearOrdinalRegex)),n._locale.eraYearOrdinalParse?t[qe]=n._locale.eraYearOrdinalParse(e,o):t[qe]=parseInt(e,10)})),W(0,["gg",2],0,(function(){return this.weekYear()%100})),W(0,["GG",2],0,(function(){return this.isoWeekYear()%100})),Ho("gggg","weekYear"),Ho("ggggg","weekYear"),Ho("GGGG","isoWeekYear"),Ho("GGGGG","isoWeekYear"),ne("weekYear","gg"),ne("isoWeekYear","GG"),ae("weekYear",1),ae("isoWeekYear",1),Ie("G",Pe),Ie("g",Pe),Ie("GG",Se,ye),Ie("gg",Se,ye),Ie("GGGG",Re,be),Ie("gggg",Re,be),Ie("GGGGG",Te,we),Ie("ggggg",Te,we),We(["gggg","ggggg","GGGG","GGGGG"],(function(e,t,n,r){t[r.substr(0,2)]=ce(e)})),We(["gg","GG"],(function(e,t,n,o){t[o]=r.parseTwoDigitYear(e)})),W("Q",0,"Qo","quarter"),ne("quarter","Q"),ae("quarter",7),Ie("Q",ge),Fe("Q",(function(e,t){t[He]=3*(ce(e)-1)})),W("D",["DD",2],"Do","date"),ne("date","D"),ae("date",9),Ie("D",Se),Ie("DD",Se,ye),Ie("Do",(function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient})),Fe(["D","DD"],Ue),Fe("Do",(function(e,t){t[Ue]=ce(e.match(Se)[0])}));var ei=de("Date",!0);function ti(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==e?t:this.add(e-t,"d")}W("DDD",["DDDD",3],"DDDo","dayOfYear"),ne("dayOfYear","DDD"),ae("dayOfYear",4),Ie("DDD",Ce),Ie("DDDD",xe),Fe(["DDD","DDDD"],(function(e,t,n){n._dayOfYear=ce(e)})),W("m",["mm",2],0,"minute"),ne("minute","m"),ae("minute",14),Ie("m",Se),Ie("mm",Se,ye),Fe(["m","mm"],Ge);var ni=de("Minutes",!1);W("s",["ss",2],0,"second"),ne("second","s"),ae("second",15),Ie("s",Se),Ie("ss",Se,ye),Fe(["s","ss"],Qe);var ri,oi,ii=de("Seconds",!1);for(W("S",0,0,(function(){return~~(this.millisecond()/100)})),W(0,["SS",2],0,(function(){return~~(this.millisecond()/10)})),W(0,["SSS",3],0,"millisecond"),W(0,["SSSS",4],0,(function(){return 10*this.millisecond()})),W(0,["SSSSS",5],0,(function(){return 100*this.millisecond()})),W(0,["SSSSSS",6],0,(function(){return 1e3*this.millisecond()})),W(0,["SSSSSSS",7],0,(function(){return 1e4*this.millisecond()})),W(0,["SSSSSSSS",8],0,(function(){return 1e5*this.millisecond()})),W(0,["SSSSSSSSS",9],0,(function(){return 1e6*this.millisecond()})),ne("millisecond","ms"),ae("millisecond",16),Ie("S",Ce,ge),Ie("SS",Ce,ye),Ie("SSS",Ce,xe),ri="SSSS";ri.length<=9;ri+="S")Ie(ri,Oe);function ai(e,t){t[$e]=ce(1e3*("0."+e))}for(ri="S";ri.length<=9;ri+="S")Fe(ri,ai);function li(){return this._isUTC?"UTC":""}function si(){return this._isUTC?"Coordinated Universal Time":""}oi=de("Milliseconds",!1),W("z",0,0,"zoneAbbr"),W("zz",0,0,"zoneName");var ui=S.prototype;function ci(e){return $n(1e3*e)}function di(){return $n.apply(null,arguments).parseZone()}function fi(e){return e}ui.add=Ir,ui.calendar=Vr,ui.clone=qr,ui.diff=Kr,ui.endOf=yo,ui.format=to,ui.from=no,ui.fromNow=ro,ui.to=oo,ui.toNow=io,ui.get=he,ui.invalidAt=To,ui.isAfter=Hr,ui.isBefore=Ur,ui.isBetween=Yr,ui.isSame=Gr,ui.isSameOrAfter=Qr,ui.isSameOrBefore=$r,ui.isValid=Co,ui.lang=lo,ui.locale=ao,ui.localeData=so,ui.max=Xn,ui.min=Kn,ui.parsingFlags=Ro,ui.set=me,ui.startOf=go,ui.subtract=Ar,ui.toArray=So,ui.toObject=jo,ui.toDate=wo,ui.toISOString=Jr,ui.inspect=eo,"undefined"!==typeof Symbol&&null!=Symbol.for&&(ui[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"}),ui.toJSON=ko,ui.toString=Zr,ui.unix=bo,ui.valueOf=xo,ui.creationData=Oo,ui.eraName=_o,ui.eraNarrow=Do,ui.eraAbbr=Io,ui.eraYear=Ao,ui.year=vt,ui.isLeapYear=gt,ui.weekYear=Uo,ui.isoWeekYear=Yo,ui.quarter=ui.quarters=Jo,ui.month=ct,ui.daysInMonth=dt,ui.week=ui.weeks=Ot,ui.isoWeek=ui.isoWeeks=Pt,ui.weeksInYear=$o,ui.weeksInWeekYear=Ko,ui.isoWeeksInYear=Go,ui.isoWeeksInISOWeekYear=Qo,ui.date=ei,ui.day=ui.days=Ht,ui.weekday=Ut,ui.isoWeekday=Yt,ui.dayOfYear=ti,ui.hour=ui.hours=rn,ui.minute=ui.minutes=ni,ui.second=ui.seconds=ii,ui.millisecond=ui.milliseconds=oi,ui.utcOffset=mr,ui.utc=gr,ui.local=yr,ui.parseZone=xr,ui.hasAlignedHourOffset=br,ui.isDST=wr,ui.isLocal=jr,ui.isUtcOffset=kr,ui.isUtc=Cr,ui.isUTC=Cr,ui.zoneAbbr=li,ui.zoneName=si,ui.dates=C("dates accessor is deprecated. Use date instead.",ei),ui.months=C("months accessor is deprecated. Use month instead",ct),ui.years=C("years accessor is deprecated. Use year instead",vt),ui.zone=C("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",vr),ui.isDSTShifted=C("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Sr);var pi=_.prototype;function hi(e,t,n,r){var o=yn(),i=h().set(r,t);return o[n](i,e)}function mi(e,t,n){if(c(e)&&(t=e,e=void 0),e=e||"",null!=t)return hi(e,t,n,"month");var r,o=[];for(r=0;r<12;r++)o[r]=hi(e,r,n,"month");return o}function vi(e,t,n,r){"boolean"===typeof e?(c(t)&&(n=t,t=void 0),t=t||""):(n=t=e,e=!1,c(t)&&(n=t,t=void 0),t=t||"");var o,i=yn(),a=e?i._week.dow:0,l=[];if(null!=n)return hi(t,(n+a)%7,r,"day");for(o=0;o<7;o++)l[o]=hi(t,(o+a)%7,r,"day");return l}function gi(e,t){return mi(e,t,"months")}function yi(e,t){return mi(e,t,"monthsShort")}function xi(e,t,n){return vi(e,t,n,"weekdays")}function bi(e,t,n){return vi(e,t,n,"weekdaysShort")}function wi(e,t,n){return vi(e,t,n,"weekdaysMin")}pi.calendar=I,pi.longDateFormat=Y,pi.invalidDate=Q,pi.ordinal=X,pi.preparse=fi,pi.postformat=fi,pi.relativeTime=J,pi.pastFuture=ee,pi.set=E,pi.eras=Po,pi.erasParse=Eo,pi.erasConvertYear=Mo,pi.erasAbbrRegex=Lo,pi.erasNameRegex=No,pi.erasNarrowRegex=zo,pi.months=it,pi.monthsShort=at,pi.monthsParse=st,pi.monthsRegex=pt,pi.monthsShortRegex=ft,pi.week=kt,pi.firstDayOfYear=Tt,pi.firstDayOfWeek=Rt,pi.weekdays=Ft,pi.weekdaysMin=Bt,pi.weekdaysShort=Wt,pi.weekdaysParse=qt,pi.weekdaysRegex=Gt,pi.weekdaysShortRegex=Qt,pi.weekdaysMinRegex=$t,pi.isPM=tn,pi.meridiem=on,mn("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10;return e+(1===ce(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}}),r.lang=C("moment.lang is deprecated. Use moment.locale instead.",mn),r.langData=C("moment.langData is deprecated. Use moment.localeData instead.",yn);var Si=Math.abs;function ji(){var e=this._data;return this._milliseconds=Si(this._milliseconds),this._days=Si(this._days),this._months=Si(this._months),e.milliseconds=Si(e.milliseconds),e.seconds=Si(e.seconds),e.minutes=Si(e.minutes),e.hours=Si(e.hours),e.months=Si(e.months),e.years=Si(e.years),this}function ki(e,t,n,r){var o=Or(t,n);return e._milliseconds+=r*o._milliseconds,e._days+=r*o._days,e._months+=r*o._months,e._bubble()}function Ci(e,t){return ki(this,e,t,1)}function Ri(e,t){return ki(this,e,t,-1)}function Ti(e){return e<0?Math.floor(e):Math.ceil(e)}function Oi(){var e,t,n,r,o,i=this._milliseconds,a=this._days,l=this._months,s=this._data;return i>=0&&a>=0&&l>=0||i<=0&&a<=0&&l<=0||(i+=864e5*Ti(Ei(l)+a),a=0,l=0),s.milliseconds=i%1e3,e=ue(i/1e3),s.seconds=e%60,t=ue(e/60),s.minutes=t%60,n=ue(t/60),s.hours=n%24,a+=ue(n/24),l+=o=ue(Pi(a)),a-=Ti(Ei(o)),r=ue(l/12),l%=12,s.days=a,s.months=l,s.years=r,this}function Pi(e){return 4800*e/146097}function Ei(e){return 146097*e/4800}function Mi(e){if(!this.isValid())return NaN;var t,n,r=this._milliseconds;if("month"===(e=re(e))||"quarter"===e||"year"===e)switch(t=this._days+r/864e5,n=this._months+Pi(t),e){case"month":return n;case"quarter":return n/3;case"year":return n/12}else switch(t=this._days+Math.round(Ei(this._months)),e){case"week":return t/7+r/6048e5;case"day":return t+r/864e5;case"hour":return 24*t+r/36e5;case"minute":return 1440*t+r/6e4;case"second":return 86400*t+r/1e3;case"millisecond":return Math.floor(864e5*t)+r;default:throw new Error("Unknown unit "+e)}}function _i(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*ce(this._months/12):NaN}function Di(e){return function(){return this.as(e)}}var Ii=Di("ms"),Ai=Di("s"),Ni=Di("m"),Li=Di("h"),zi=Di("d"),Fi=Di("w"),Wi=Di("M"),Bi=Di("Q"),Vi=Di("y");function qi(){return Or(this)}function Hi(e){return e=re(e),this.isValid()?this[e+"s"]():NaN}function Ui(e){return function(){return this.isValid()?this._data[e]:NaN}}var Yi=Ui("milliseconds"),Gi=Ui("seconds"),Qi=Ui("minutes"),$i=Ui("hours"),Ki=Ui("days"),Xi=Ui("months"),Zi=Ui("years");function Ji(){return ue(this.days()/7)}var ea=Math.round,ta={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function na(e,t,n,r,o){return o.relativeTime(t||1,!!n,e,r)}function ra(e,t,n,r){var o=Or(e).abs(),i=ea(o.as("s")),a=ea(o.as("m")),l=ea(o.as("h")),s=ea(o.as("d")),u=ea(o.as("M")),c=ea(o.as("w")),d=ea(o.as("y")),f=i<=n.ss&&["s",i]||i<n.s&&["ss",i]||a<=1&&["m"]||a<n.m&&["mm",a]||l<=1&&["h"]||l<n.h&&["hh",l]||s<=1&&["d"]||s<n.d&&["dd",s];return null!=n.w&&(f=f||c<=1&&["w"]||c<n.w&&["ww",c]),(f=f||u<=1&&["M"]||u<n.M&&["MM",u]||d<=1&&["y"]||["yy",d])[2]=t,f[3]=+e>0,f[4]=r,na.apply(null,f)}function oa(e){return void 0===e?ea:"function"===typeof e&&(ea=e,!0)}function ia(e,t){return void 0!==ta[e]&&(void 0===t?ta[e]:(ta[e]=t,"s"===e&&(ta.ss=t-1),!0))}function aa(e,t){if(!this.isValid())return this.localeData().invalidDate();var n,r,o=!1,i=ta;return"object"===typeof e&&(t=e,e=!1),"boolean"===typeof e&&(o=e),"object"===typeof t&&(i=Object.assign({},ta,t),null!=t.s&&null==t.ss&&(i.ss=t.s-1)),r=ra(this,!o,i,n=this.localeData()),o&&(r=n.pastFuture(+this,r)),n.postformat(r)}var la=Math.abs;function sa(e){return(e>0)-(e<0)||+e}function ua(){if(!this.isValid())return this.localeData().invalidDate();var e,t,n,r,o,i,a,l,s=la(this._milliseconds)/1e3,u=la(this._days),c=la(this._months),d=this.asSeconds();return d?(e=ue(s/60),t=ue(e/60),s%=60,e%=60,n=ue(c/12),c%=12,r=s?s.toFixed(3).replace(/\.?0+$/,""):"",o=d<0?"-":"",i=sa(this._months)!==sa(d)?"-":"",a=sa(this._days)!==sa(d)?"-":"",l=sa(this._milliseconds)!==sa(d)?"-":"",o+"P"+(n?i+n+"Y":"")+(c?i+c+"M":"")+(u?a+u+"D":"")+(t||e||s?"T":"")+(t?l+t+"H":"")+(e?l+e+"M":"")+(s?l+r+"S":"")):"P0D"}var ca=ar.prototype;return ca.isValid=or,ca.abs=ji,ca.add=Ci,ca.subtract=Ri,ca.as=Mi,ca.asMilliseconds=Ii,ca.asSeconds=Ai,ca.asMinutes=Ni,ca.asHours=Li,ca.asDays=zi,ca.asWeeks=Fi,ca.asMonths=Wi,ca.asQuarters=Bi,ca.asYears=Vi,ca.valueOf=_i,ca._bubble=Oi,ca.clone=qi,ca.get=Hi,ca.milliseconds=Yi,ca.seconds=Gi,ca.minutes=Qi,ca.hours=$i,ca.days=Ki,ca.weeks=Ji,ca.months=Xi,ca.years=Zi,ca.humanize=aa,ca.toISOString=ua,ca.toString=ua,ca.toJSON=ua,ca.locale=ao,ca.localeData=so,ca.toIsoString=C("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",ua),ca.lang=lo,W("X",0,0,"unix"),W("x",0,0,"valueOf"),Ie("x",Pe),Ie("X",_e),Fe("X",(function(e,t,n){n._d=new Date(1e3*parseFloat(e))})),Fe("x",(function(e,t,n){n._d=new Date(ce(e))})),r.version="2.29.4",o($n),r.fn=ui,r.min=Jn,r.max=er,r.now=tr,r.utc=h,r.unix=ci,r.months=gi,r.isDate=d,r.locale=mn,r.invalid=y,r.duration=Or,r.isMoment=j,r.weekdays=xi,r.parseZone=di,r.localeData=yn,r.isDuration=lr,r.monthsShort=yi,r.weekdaysMin=wi,r.defineLocale=vn,r.updateLocale=gn,r.locales=xn,r.weekdaysShort=bi,r.normalizeUnits=re,r.relativeTimeRounding=oa,r.relativeTimeThreshold=ia,r.calendarFormat=Br,r.prototype=ui,r.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},r}()},2584:function(e,t,n){var r="function"===typeof Map&&Map.prototype,o=Object.getOwnPropertyDescriptor&&r?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,i=r&&o&&"function"===typeof o.get?o.get:null,a=r&&Map.prototype.forEach,l="function"===typeof Set&&Set.prototype,s=Object.getOwnPropertyDescriptor&&l?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,u=l&&s&&"function"===typeof s.get?s.get:null,c=l&&Set.prototype.forEach,d="function"===typeof WeakMap&&WeakMap.prototype?WeakMap.prototype.has:null,f="function"===typeof WeakSet&&WeakSet.prototype?WeakSet.prototype.has:null,p="function"===typeof WeakRef&&WeakRef.prototype?WeakRef.prototype.deref:null,h=Boolean.prototype.valueOf,m=Object.prototype.toString,v=Function.prototype.toString,g=String.prototype.match,y=String.prototype.slice,x=String.prototype.replace,b=String.prototype.toUpperCase,w=String.prototype.toLowerCase,S=RegExp.prototype.test,j=Array.prototype.concat,k=Array.prototype.join,C=Array.prototype.slice,R=Math.floor,T="function"===typeof BigInt?BigInt.prototype.valueOf:null,O=Object.getOwnPropertySymbols,P="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?Symbol.prototype.toString:null,E="function"===typeof Symbol&&"object"===typeof Symbol.iterator,M="function"===typeof Symbol&&Symbol.toStringTag&&(typeof Symbol.toStringTag===E||"symbol")?Symbol.toStringTag:null,_=Object.prototype.propertyIsEnumerable,D=("function"===typeof Reflect?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(e){return e.__proto__}:null);function I(e,t){if(e===1/0||e===-1/0||e!==e||e&&e>-1e3&&e<1e3||S.call(/e/,t))return t;var n=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if("number"===typeof e){var r=e<0?-R(-e):R(e);if(r!==e){var o=String(r),i=y.call(t,o.length+1);return x.call(o,n,"$&_")+"."+x.call(x.call(i,/([0-9]{3})/g,"$&_"),/_$/,"")}}return x.call(t,n,"$&_")}var A=n(4654),N=A.custom,L=V(N)?N:null;function z(e,t,n){var r="double"===(n.quoteStyle||t)?'"':"'";return r+e+r}function F(e){return x.call(String(e),/"/g,"&quot;")}function W(e){return"[object Array]"===U(e)&&(!M||!("object"===typeof e&&M in e))}function B(e){return"[object RegExp]"===U(e)&&(!M||!("object"===typeof e&&M in e))}function V(e){if(E)return e&&"object"===typeof e&&e instanceof Symbol;if("symbol"===typeof e)return!0;if(!e||"object"!==typeof e||!P)return!1;try{return P.call(e),!0}catch(t){}return!1}e.exports=function e(t,n,r,o){var l=n||{};if(H(l,"quoteStyle")&&"single"!==l.quoteStyle&&"double"!==l.quoteStyle)throw new TypeError('option "quoteStyle" must be "single" or "double"');if(H(l,"maxStringLength")&&("number"===typeof l.maxStringLength?l.maxStringLength<0&&l.maxStringLength!==1/0:null!==l.maxStringLength))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var s=!H(l,"customInspect")||l.customInspect;if("boolean"!==typeof s&&"symbol"!==s)throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if(H(l,"indent")&&null!==l.indent&&"\t"!==l.indent&&!(parseInt(l.indent,10)===l.indent&&l.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if(H(l,"numericSeparator")&&"boolean"!==typeof l.numericSeparator)throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var m=l.numericSeparator;if("undefined"===typeof t)return"undefined";if(null===t)return"null";if("boolean"===typeof t)return t?"true":"false";if("string"===typeof t)return G(t,l);if("number"===typeof t){if(0===t)return 1/0/t>0?"0":"-0";var b=String(t);return m?I(t,b):b}if("bigint"===typeof t){var S=String(t)+"n";return m?I(t,S):S}var R="undefined"===typeof l.depth?5:l.depth;if("undefined"===typeof r&&(r=0),r>=R&&R>0&&"object"===typeof t)return W(t)?"[Array]":"[Object]";var O=function(e,t){var n;if("\t"===e.indent)n="\t";else{if(!("number"===typeof e.indent&&e.indent>0))return null;n=k.call(Array(e.indent+1)," ")}return{base:n,prev:k.call(Array(t+1),n)}}(l,r);if("undefined"===typeof o)o=[];else if(Y(o,t)>=0)return"[Circular]";function N(t,n,i){if(n&&(o=C.call(o)).push(n),i){var a={depth:l.depth};return H(l,"quoteStyle")&&(a.quoteStyle=l.quoteStyle),e(t,a,r+1,o)}return e(t,l,r+1,o)}if("function"===typeof t&&!B(t)){var q=function(e){if(e.name)return e.name;var t=g.call(v.call(e),/^function\s*([\w$]+)/);if(t)return t[1];return null}(t),Q=J(t,N);return"[Function"+(q?": "+q:" (anonymous)")+"]"+(Q.length>0?" { "+k.call(Q,", ")+" }":"")}if(V(t)){var ee=E?x.call(String(t),/^(Symbol\(.*\))_[^)]*$/,"$1"):P.call(t);return"object"!==typeof t||E?ee:$(ee)}if(function(e){if(!e||"object"!==typeof e)return!1;if("undefined"!==typeof HTMLElement&&e instanceof HTMLElement)return!0;return"string"===typeof e.nodeName&&"function"===typeof e.getAttribute}(t)){for(var te="<"+w.call(String(t.nodeName)),ne=t.attributes||[],re=0;re<ne.length;re++)te+=" "+ne[re].name+"="+z(F(ne[re].value),"double",l);return te+=">",t.childNodes&&t.childNodes.length&&(te+="..."),te+="</"+w.call(String(t.nodeName))+">"}if(W(t)){if(0===t.length)return"[]";var oe=J(t,N);return O&&!function(e){for(var t=0;t<e.length;t++)if(Y(e[t],"\n")>=0)return!1;return!0}(oe)?"["+Z(oe,O)+"]":"[ "+k.call(oe,", ")+" ]"}if(function(e){return"[object Error]"===U(e)&&(!M||!("object"===typeof e&&M in e))}(t)){var ie=J(t,N);return"cause"in Error.prototype||!("cause"in t)||_.call(t,"cause")?0===ie.length?"["+String(t)+"]":"{ ["+String(t)+"] "+k.call(ie,", ")+" }":"{ ["+String(t)+"] "+k.call(j.call("[cause]: "+N(t.cause),ie),", ")+" }"}if("object"===typeof t&&s){if(L&&"function"===typeof t[L]&&A)return A(t,{depth:R-r});if("symbol"!==s&&"function"===typeof t.inspect)return t.inspect()}if(function(e){if(!i||!e||"object"!==typeof e)return!1;try{i.call(e);try{u.call(e)}catch(te){return!0}return e instanceof Map}catch(t){}return!1}(t)){var ae=[];return a.call(t,(function(e,n){ae.push(N(n,t,!0)+" => "+N(e,t))})),X("Map",i.call(t),ae,O)}if(function(e){if(!u||!e||"object"!==typeof e)return!1;try{u.call(e);try{i.call(e)}catch(t){return!0}return e instanceof Set}catch(n){}return!1}(t)){var le=[];return c.call(t,(function(e){le.push(N(e,t))})),X("Set",u.call(t),le,O)}if(function(e){if(!d||!e||"object"!==typeof e)return!1;try{d.call(e,d);try{f.call(e,f)}catch(te){return!0}return e instanceof WeakMap}catch(t){}return!1}(t))return K("WeakMap");if(function(e){if(!f||!e||"object"!==typeof e)return!1;try{f.call(e,f);try{d.call(e,d)}catch(te){return!0}return e instanceof WeakSet}catch(t){}return!1}(t))return K("WeakSet");if(function(e){if(!p||!e||"object"!==typeof e)return!1;try{return p.call(e),!0}catch(t){}return!1}(t))return K("WeakRef");if(function(e){return"[object Number]"===U(e)&&(!M||!("object"===typeof e&&M in e))}(t))return $(N(Number(t)));if(function(e){if(!e||"object"!==typeof e||!T)return!1;try{return T.call(e),!0}catch(t){}return!1}(t))return $(N(T.call(t)));if(function(e){return"[object Boolean]"===U(e)&&(!M||!("object"===typeof e&&M in e))}(t))return $(h.call(t));if(function(e){return"[object String]"===U(e)&&(!M||!("object"===typeof e&&M in e))}(t))return $(N(String(t)));if(!function(e){return"[object Date]"===U(e)&&(!M||!("object"===typeof e&&M in e))}(t)&&!B(t)){var se=J(t,N),ue=D?D(t)===Object.prototype:t instanceof Object||t.constructor===Object,ce=t instanceof Object?"":"null prototype",de=!ue&&M&&Object(t)===t&&M in t?y.call(U(t),8,-1):ce?"Object":"",fe=(ue||"function"!==typeof t.constructor?"":t.constructor.name?t.constructor.name+" ":"")+(de||ce?"["+k.call(j.call([],de||[],ce||[]),": ")+"] ":"");return 0===se.length?fe+"{}":O?fe+"{"+Z(se,O)+"}":fe+"{ "+k.call(se,", ")+" }"}return String(t)};var q=Object.prototype.hasOwnProperty||function(e){return e in this};function H(e,t){return q.call(e,t)}function U(e){return m.call(e)}function Y(e,t){if(e.indexOf)return e.indexOf(t);for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1}function G(e,t){if(e.length>t.maxStringLength){var n=e.length-t.maxStringLength,r="... "+n+" more character"+(n>1?"s":"");return G(y.call(e,0,t.maxStringLength),t)+r}return z(x.call(x.call(e,/(['\\])/g,"\\$1"),/[\x00-\x1f]/g,Q),"single",t)}function Q(e){var t=e.charCodeAt(0),n={8:"b",9:"t",10:"n",12:"f",13:"r"}[t];return n?"\\"+n:"\\x"+(t<16?"0":"")+b.call(t.toString(16))}function $(e){return"Object("+e+")"}function K(e){return e+" { ? }"}function X(e,t,n,r){return e+" ("+t+") {"+(r?Z(n,r):k.call(n,", "))+"}"}function Z(e,t){if(0===e.length)return"";var n="\n"+t.prev+t.base;return n+k.call(e,","+n)+"\n"+t.prev}function J(e,t){var n=W(e),r=[];if(n){r.length=e.length;for(var o=0;o<e.length;o++)r[o]=H(e,o)?t(e[o],e):""}var i,a="function"===typeof O?O(e):[];if(E){i={};for(var l=0;l<a.length;l++)i["$"+a[l]]=a[l]}for(var s in e)H(e,s)&&(n&&String(Number(s))===s&&s<e.length||E&&i["$"+s]instanceof Symbol||(S.call(/[^\w$]/,s)?r.push(t(s,e)+": "+t(e[s],e)):r.push(s+": "+t(e[s],e))));if("function"===typeof O)for(var u=0;u<a.length;u++)_.call(e,a[u])&&r.push("["+t(a[u])+"]: "+t(e[a[u]],e));return r}},9874:function(e){"use strict";var t=String.prototype.replace,n=/%20/g,r="RFC1738",o="RFC3986";e.exports={default:o,formatters:{RFC1738:function(e){return t.call(e,n,"+")},RFC3986:function(e){return String(e)}},RFC1738:r,RFC3986:o}},2808:function(e,t,n){"use strict";var r=n(2334),o=n(4360),i=n(9874);e.exports={formats:i,parse:o,stringify:r}},4360:function(e,t,n){"use strict";var r=n(4184),o=Object.prototype.hasOwnProperty,i=Array.isArray,a={allowDots:!1,allowPrototypes:!1,allowSparse:!1,arrayLimit:20,charset:"utf-8",charsetSentinel:!1,comma:!1,decoder:r.decode,delimiter:"&",depth:5,ignoreQueryPrefix:!1,interpretNumericEntities:!1,parameterLimit:1e3,parseArrays:!0,plainObjects:!1,strictNullHandling:!1},l=function(e){return e.replace(/&#(\d+);/g,(function(e,t){return String.fromCharCode(parseInt(t,10))}))},s=function(e,t){return e&&"string"===typeof e&&t.comma&&e.indexOf(",")>-1?e.split(","):e},u=function(e,t,n,r){if(e){var i=n.allowDots?e.replace(/\.([^.[]+)/g,"[$1]"):e,a=/(\[[^[\]]*])/g,l=n.depth>0&&/(\[[^[\]]*])/.exec(i),u=l?i.slice(0,l.index):i,c=[];if(u){if(!n.plainObjects&&o.call(Object.prototype,u)&&!n.allowPrototypes)return;c.push(u)}for(var d=0;n.depth>0&&null!==(l=a.exec(i))&&d<n.depth;){if(d+=1,!n.plainObjects&&o.call(Object.prototype,l[1].slice(1,-1))&&!n.allowPrototypes)return;c.push(l[1])}return l&&c.push("["+i.slice(l.index)+"]"),function(e,t,n,r){for(var o=r?t:s(t,n),i=e.length-1;i>=0;--i){var a,l=e[i];if("[]"===l&&n.parseArrays)a=[].concat(o);else{a=n.plainObjects?Object.create(null):{};var u="["===l.charAt(0)&&"]"===l.charAt(l.length-1)?l.slice(1,-1):l,c=parseInt(u,10);n.parseArrays||""!==u?!isNaN(c)&&l!==u&&String(c)===u&&c>=0&&n.parseArrays&&c<=n.arrayLimit?(a=[])[c]=o:"__proto__"!==u&&(a[u]=o):a={0:o}}o=a}return o}(c,t,n,r)}};e.exports=function(e,t){var n=function(e){if(!e)return a;if(null!==e.decoder&&void 0!==e.decoder&&"function"!==typeof e.decoder)throw new TypeError("Decoder has to be a function.");if("undefined"!==typeof e.charset&&"utf-8"!==e.charset&&"iso-8859-1"!==e.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var t="undefined"===typeof e.charset?a.charset:e.charset;return{allowDots:"undefined"===typeof e.allowDots?a.allowDots:!!e.allowDots,allowPrototypes:"boolean"===typeof e.allowPrototypes?e.allowPrototypes:a.allowPrototypes,allowSparse:"boolean"===typeof e.allowSparse?e.allowSparse:a.allowSparse,arrayLimit:"number"===typeof e.arrayLimit?e.arrayLimit:a.arrayLimit,charset:t,charsetSentinel:"boolean"===typeof e.charsetSentinel?e.charsetSentinel:a.charsetSentinel,comma:"boolean"===typeof e.comma?e.comma:a.comma,decoder:"function"===typeof e.decoder?e.decoder:a.decoder,delimiter:"string"===typeof e.delimiter||r.isRegExp(e.delimiter)?e.delimiter:a.delimiter,depth:"number"===typeof e.depth||!1===e.depth?+e.depth:a.depth,ignoreQueryPrefix:!0===e.ignoreQueryPrefix,interpretNumericEntities:"boolean"===typeof e.interpretNumericEntities?e.interpretNumericEntities:a.interpretNumericEntities,parameterLimit:"number"===typeof e.parameterLimit?e.parameterLimit:a.parameterLimit,parseArrays:!1!==e.parseArrays,plainObjects:"boolean"===typeof e.plainObjects?e.plainObjects:a.plainObjects,strictNullHandling:"boolean"===typeof e.strictNullHandling?e.strictNullHandling:a.strictNullHandling}}(t);if(""===e||null===e||"undefined"===typeof e)return n.plainObjects?Object.create(null):{};for(var c="string"===typeof e?function(e,t){var n,u={},c=t.ignoreQueryPrefix?e.replace(/^\?/,""):e,d=t.parameterLimit===1/0?void 0:t.parameterLimit,f=c.split(t.delimiter,d),p=-1,h=t.charset;if(t.charsetSentinel)for(n=0;n<f.length;++n)0===f[n].indexOf("utf8=")&&("utf8=%E2%9C%93"===f[n]?h="utf-8":"utf8=%26%2310003%3B"===f[n]&&(h="iso-8859-1"),p=n,n=f.length);for(n=0;n<f.length;++n)if(n!==p){var m,v,g=f[n],y=g.indexOf("]="),x=-1===y?g.indexOf("="):y+1;-1===x?(m=t.decoder(g,a.decoder,h,"key"),v=t.strictNullHandling?null:""):(m=t.decoder(g.slice(0,x),a.decoder,h,"key"),v=r.maybeMap(s(g.slice(x+1),t),(function(e){return t.decoder(e,a.decoder,h,"value")}))),v&&t.interpretNumericEntities&&"iso-8859-1"===h&&(v=l(v)),g.indexOf("[]=")>-1&&(v=i(v)?[v]:v),o.call(u,m)?u[m]=r.combine(u[m],v):u[m]=v}return u}(e,n):e,d=n.plainObjects?Object.create(null):{},f=Object.keys(c),p=0;p<f.length;++p){var h=f[p],m=u(h,c[h],n,"string"===typeof e);d=r.merge(d,m,n)}return!0===n.allowSparse?d:r.compact(d)}},2334:function(e,t,n){"use strict";var r=n(581),o=n(4184),i=n(9874),a=Object.prototype.hasOwnProperty,l={brackets:function(e){return e+"[]"},comma:"comma",indices:function(e,t){return e+"["+t+"]"},repeat:function(e){return e}},s=Array.isArray,u=String.prototype.split,c=Array.prototype.push,d=function(e,t){c.apply(e,s(t)?t:[t])},f=Date.prototype.toISOString,p=i.default,h={addQueryPrefix:!1,allowDots:!1,charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encoder:o.encode,encodeValuesOnly:!1,format:p,formatter:i.formatters[p],indices:!1,serializeDate:function(e){return f.call(e)},skipNulls:!1,strictNullHandling:!1},m={},v=function e(t,n,i,a,l,c,f,p,v,g,y,x,b,w,S,j){for(var k,C=t,R=j,T=0,O=!1;void 0!==(R=R.get(m))&&!O;){var P=R.get(t);if(T+=1,"undefined"!==typeof P){if(P===T)throw new RangeError("Cyclic object value");O=!0}"undefined"===typeof R.get(m)&&(T=0)}if("function"===typeof p?C=p(n,C):C instanceof Date?C=y(C):"comma"===i&&s(C)&&(C=o.maybeMap(C,(function(e){return e instanceof Date?y(e):e}))),null===C){if(l)return f&&!w?f(n,h.encoder,S,"key",x):n;C=""}if("string"===typeof(k=C)||"number"===typeof k||"boolean"===typeof k||"symbol"===typeof k||"bigint"===typeof k||o.isBuffer(C)){if(f){var E=w?n:f(n,h.encoder,S,"key",x);if("comma"===i&&w){for(var M=u.call(String(C),","),_="",D=0;D<M.length;++D)_+=(0===D?"":",")+b(f(M[D],h.encoder,S,"value",x));return[b(E)+(a&&s(C)&&1===M.length?"[]":"")+"="+_]}return[b(E)+"="+b(f(C,h.encoder,S,"value",x))]}return[b(n)+"="+b(String(C))]}var I,A=[];if("undefined"===typeof C)return A;if("comma"===i&&s(C))I=[{value:C.length>0?C.join(",")||null:void 0}];else if(s(p))I=p;else{var N=Object.keys(C);I=v?N.sort(v):N}for(var L=a&&s(C)&&1===C.length?n+"[]":n,z=0;z<I.length;++z){var F=I[z],W="object"===typeof F&&"undefined"!==typeof F.value?F.value:C[F];if(!c||null!==W){var B=s(C)?"function"===typeof i?i(L,F):L:L+(g?"."+F:"["+F+"]");j.set(t,T);var V=r();V.set(m,j),d(A,e(W,B,i,a,l,c,f,p,v,g,y,x,b,w,S,V))}}return A};e.exports=function(e,t){var n,o=e,u=function(e){if(!e)return h;if(null!==e.encoder&&"undefined"!==typeof e.encoder&&"function"!==typeof e.encoder)throw new TypeError("Encoder has to be a function.");var t=e.charset||h.charset;if("undefined"!==typeof e.charset&&"utf-8"!==e.charset&&"iso-8859-1"!==e.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var n=i.default;if("undefined"!==typeof e.format){if(!a.call(i.formatters,e.format))throw new TypeError("Unknown format option provided.");n=e.format}var r=i.formatters[n],o=h.filter;return("function"===typeof e.filter||s(e.filter))&&(o=e.filter),{addQueryPrefix:"boolean"===typeof e.addQueryPrefix?e.addQueryPrefix:h.addQueryPrefix,allowDots:"undefined"===typeof e.allowDots?h.allowDots:!!e.allowDots,charset:t,charsetSentinel:"boolean"===typeof e.charsetSentinel?e.charsetSentinel:h.charsetSentinel,delimiter:"undefined"===typeof e.delimiter?h.delimiter:e.delimiter,encode:"boolean"===typeof e.encode?e.encode:h.encode,encoder:"function"===typeof e.encoder?e.encoder:h.encoder,encodeValuesOnly:"boolean"===typeof e.encodeValuesOnly?e.encodeValuesOnly:h.encodeValuesOnly,filter:o,format:n,formatter:r,serializeDate:"function"===typeof e.serializeDate?e.serializeDate:h.serializeDate,skipNulls:"boolean"===typeof e.skipNulls?e.skipNulls:h.skipNulls,sort:"function"===typeof e.sort?e.sort:null,strictNullHandling:"boolean"===typeof e.strictNullHandling?e.strictNullHandling:h.strictNullHandling}}(t);"function"===typeof u.filter?o=(0,u.filter)("",o):s(u.filter)&&(n=u.filter);var c,f=[];if("object"!==typeof o||null===o)return"";c=t&&t.arrayFormat in l?t.arrayFormat:t&&"indices"in t?t.indices?"indices":"repeat":"indices";var p=l[c];if(t&&"commaRoundTrip"in t&&"boolean"!==typeof t.commaRoundTrip)throw new TypeError("`commaRoundTrip` must be a boolean, or absent");var m="comma"===p&&t&&t.commaRoundTrip;n||(n=Object.keys(o)),u.sort&&n.sort(u.sort);for(var g=r(),y=0;y<n.length;++y){var x=n[y];u.skipNulls&&null===o[x]||d(f,v(o[x],x,p,m,u.strictNullHandling,u.skipNulls,u.encode?u.encoder:null,u.filter,u.sort,u.allowDots,u.serializeDate,u.format,u.formatter,u.encodeValuesOnly,u.charset,g))}var b=f.join(u.delimiter),w=!0===u.addQueryPrefix?"?":"";return u.charsetSentinel&&("iso-8859-1"===u.charset?w+="utf8=%26%2310003%3B&":w+="utf8=%E2%9C%93&"),b.length>0?w+b:""}},4184:function(e,t,n){"use strict";var r=n(9874),o=Object.prototype.hasOwnProperty,i=Array.isArray,a=function(){for(var e=[],t=0;t<256;++t)e.push("%"+((t<16?"0":"")+t.toString(16)).toUpperCase());return e}(),l=function(e,t){for(var n=t&&t.plainObjects?Object.create(null):{},r=0;r<e.length;++r)"undefined"!==typeof e[r]&&(n[r]=e[r]);return n};e.exports={arrayToObject:l,assign:function(e,t){return Object.keys(t).reduce((function(e,n){return e[n]=t[n],e}),e)},combine:function(e,t){return[].concat(e,t)},compact:function(e){for(var t=[{obj:{o:e},prop:"o"}],n=[],r=0;r<t.length;++r)for(var o=t[r],a=o.obj[o.prop],l=Object.keys(a),s=0;s<l.length;++s){var u=l[s],c=a[u];"object"===typeof c&&null!==c&&-1===n.indexOf(c)&&(t.push({obj:a,prop:u}),n.push(c))}return function(e){for(;e.length>1;){var t=e.pop(),n=t.obj[t.prop];if(i(n)){for(var r=[],o=0;o<n.length;++o)"undefined"!==typeof n[o]&&r.push(n[o]);t.obj[t.prop]=r}}}(t),e},decode:function(e,t,n){var r=e.replace(/\+/g," ");if("iso-8859-1"===n)return r.replace(/%[0-9a-f]{2}/gi,unescape);try{return decodeURIComponent(r)}catch(o){return r}},encode:function(e,t,n,o,i){if(0===e.length)return e;var l=e;if("symbol"===typeof e?l=Symbol.prototype.toString.call(e):"string"!==typeof e&&(l=String(e)),"iso-8859-1"===n)return escape(l).replace(/%u[0-9a-f]{4}/gi,(function(e){return"%26%23"+parseInt(e.slice(2),16)+"%3B"}));for(var s="",u=0;u<l.length;++u){var c=l.charCodeAt(u);45===c||46===c||95===c||126===c||c>=48&&c<=57||c>=65&&c<=90||c>=97&&c<=122||i===r.RFC1738&&(40===c||41===c)?s+=l.charAt(u):c<128?s+=a[c]:c<2048?s+=a[192|c>>6]+a[128|63&c]:c<55296||c>=57344?s+=a[224|c>>12]+a[128|c>>6&63]+a[128|63&c]:(u+=1,c=65536+((1023&c)<<10|1023&l.charCodeAt(u)),s+=a[240|c>>18]+a[128|c>>12&63]+a[128|c>>6&63]+a[128|63&c])}return s},isBuffer:function(e){return!(!e||"object"!==typeof e)&&!!(e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer(e))},isRegExp:function(e){return"[object RegExp]"===Object.prototype.toString.call(e)},maybeMap:function(e,t){if(i(e)){for(var n=[],r=0;r<e.length;r+=1)n.push(t(e[r]));return n}return t(e)},merge:function e(t,n,r){if(!n)return t;if("object"!==typeof n){if(i(t))t.push(n);else{if(!t||"object"!==typeof t)return[t,n];(r&&(r.plainObjects||r.allowPrototypes)||!o.call(Object.prototype,n))&&(t[n]=!0)}return t}if(!t||"object"!==typeof t)return[t].concat(n);var a=t;return i(t)&&!i(n)&&(a=l(t,r)),i(t)&&i(n)?(n.forEach((function(n,i){if(o.call(t,i)){var a=t[i];a&&"object"===typeof a&&n&&"object"===typeof n?t[i]=e(a,n,r):t.push(n)}else t[i]=n})),t):Object.keys(n).reduce((function(t,i){var a=n[i];return o.call(t,i)?t[i]=e(t[i],a,r):t[i]=a,t}),a)}}},4463:function(e,t,n){"use strict";var r=n(2791),o=n(5296);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var a=new Set,l={};function s(e,t){u(e,t),u(e+"Capture",t)}function u(e,t){for(l[e]=t,e=0;e<t.length;e++)a.add(t[e])}var c=!("undefined"===typeof window||"undefined"===typeof window.document||"undefined"===typeof window.document.createElement),d=Object.prototype.hasOwnProperty,f=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,p={},h={};function m(e,t,n,r,o,i,a){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=r,this.attributeNamespace=o,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=i,this.removeEmptyString=a}var v={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){v[e]=new m(e,0,!1,e,null,!1,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];v[t]=new m(t,1,!1,e[1],null,!1,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){v[e]=new m(e,2,!1,e.toLowerCase(),null,!1,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){v[e]=new m(e,2,!1,e,null,!1,!1)})),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach((function(e){v[e]=new m(e,3,!1,e.toLowerCase(),null,!1,!1)})),["checked","multiple","muted","selected"].forEach((function(e){v[e]=new m(e,3,!0,e,null,!1,!1)})),["capture","download"].forEach((function(e){v[e]=new m(e,4,!1,e,null,!1,!1)})),["cols","rows","size","span"].forEach((function(e){v[e]=new m(e,6,!1,e,null,!1,!1)})),["rowSpan","start"].forEach((function(e){v[e]=new m(e,5,!1,e.toLowerCase(),null,!1,!1)}));var g=/[\-:]([a-z])/g;function y(e){return e[1].toUpperCase()}function x(e,t,n,r){var o=v.hasOwnProperty(t)?v[t]:null;(null!==o?0!==o.type:r||!(2<t.length)||"o"!==t[0]&&"O"!==t[0]||"n"!==t[1]&&"N"!==t[1])&&(function(e,t,n,r){if(null===t||"undefined"===typeof t||function(e,t,n,r){if(null!==n&&0===n.type)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return!r&&(null!==n?!n.acceptsBooleans:"data-"!==(e=e.toLowerCase().slice(0,5))&&"aria-"!==e);default:return!1}}(e,t,n,r))return!0;if(r)return!1;if(null!==n)switch(n.type){case 3:return!t;case 4:return!1===t;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}(t,n,o,r)&&(n=null),r||null===o?function(e){return!!d.call(h,e)||!d.call(p,e)&&(f.test(e)?h[e]=!0:(p[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):o.mustUseProperty?e[o.propertyName]=null===n?3!==o.type&&"":n:(t=o.attributeName,r=o.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(o=o.type)||4===o&&!0===n?"":""+n,r?e.setAttributeNS(r,t,n):e.setAttribute(t,n))))}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach((function(e){var t=e.replace(g,y);v[t]=new m(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(g,y);v[t]=new m(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(g,y);v[t]=new m(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){v[e]=new m(e,1,!1,e.toLowerCase(),null,!1,!1)})),v.xlinkHref=new m("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){v[e]=new m(e,1,!1,e.toLowerCase(),null,!0,!0)}));var b=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,w=Symbol.for("react.element"),S=Symbol.for("react.portal"),j=Symbol.for("react.fragment"),k=Symbol.for("react.strict_mode"),C=Symbol.for("react.profiler"),R=Symbol.for("react.provider"),T=Symbol.for("react.context"),O=Symbol.for("react.forward_ref"),P=Symbol.for("react.suspense"),E=Symbol.for("react.suspense_list"),M=Symbol.for("react.memo"),_=Symbol.for("react.lazy");Symbol.for("react.scope"),Symbol.for("react.debug_trace_mode");var D=Symbol.for("react.offscreen");Symbol.for("react.legacy_hidden"),Symbol.for("react.cache"),Symbol.for("react.tracing_marker");var I=Symbol.iterator;function A(e){return null===e||"object"!==typeof e?null:"function"===typeof(e=I&&e[I]||e["@@iterator"])?e:null}var N,L=Object.assign;function z(e){if(void 0===N)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);N=t&&t[1]||""}return"\n"+N+e}var F=!1;function W(e,t){if(!e||F)return"";F=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),"object"===typeof Reflect&&Reflect.construct){try{Reflect.construct(t,[])}catch(u){var r=u}Reflect.construct(e,[],t)}else{try{t.call()}catch(u){r=u}e.call(t.prototype)}else{try{throw Error()}catch(u){r=u}e()}}catch(u){if(u&&r&&"string"===typeof u.stack){for(var o=u.stack.split("\n"),i=r.stack.split("\n"),a=o.length-1,l=i.length-1;1<=a&&0<=l&&o[a]!==i[l];)l--;for(;1<=a&&0<=l;a--,l--)if(o[a]!==i[l]){if(1!==a||1!==l)do{if(a--,0>--l||o[a]!==i[l]){var s="\n"+o[a].replace(" at new "," at ");return e.displayName&&s.includes("<anonymous>")&&(s=s.replace("<anonymous>",e.displayName)),s}}while(1<=a&&0<=l);break}}}finally{F=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?z(e):""}function B(e){switch(e.tag){case 5:return z(e.type);case 16:return z("Lazy");case 13:return z("Suspense");case 19:return z("SuspenseList");case 0:case 2:case 15:return e=W(e.type,!1);case 11:return e=W(e.type.render,!1);case 1:return e=W(e.type,!0);default:return""}}function V(e){if(null==e)return null;if("function"===typeof e)return e.displayName||e.name||null;if("string"===typeof e)return e;switch(e){case j:return"Fragment";case S:return"Portal";case C:return"Profiler";case k:return"StrictMode";case P:return"Suspense";case E:return"SuspenseList"}if("object"===typeof e)switch(e.$$typeof){case T:return(e.displayName||"Context")+".Consumer";case R:return(e._context.displayName||"Context")+".Provider";case O:var t=e.render;return(e=e.displayName)||(e=""!==(e=t.displayName||t.name||"")?"ForwardRef("+e+")":"ForwardRef"),e;case M:return null!==(t=e.displayName||null)?t:V(e.type)||"Memo";case _:t=e._payload,e=e._init;try{return V(e(t))}catch(n){}}return null}function q(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=(e=t.render).displayName||e.name||"",t.displayName||(""!==e?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return V(t);case 8:return t===k?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if("function"===typeof t)return t.displayName||t.name||null;if("string"===typeof t)return t}return null}function H(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":case"object":return e;default:return""}}function U(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function Y(e){e._valueTracker||(e._valueTracker=function(e){var t=U(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&"undefined"!==typeof n&&"function"===typeof n.get&&"function"===typeof n.set){var o=n.get,i=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(e){r=""+e,i.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function G(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=U(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function Q(e){if("undefined"===typeof(e=e||("undefined"!==typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function $(e,t){var n=t.checked;return L({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function K(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t.checked?t.checked:t.defaultChecked;n=H(null!=t.value?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function X(e,t){null!=(t=t.checked)&&x(e,"checked",t,!1)}function Z(e,t){X(e,t);var n=H(t.value),r=t.type;if(null!=n)"number"===r?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===r||"reset"===r)return void e.removeAttribute("value");t.hasOwnProperty("value")?ee(e,t.type,n):t.hasOwnProperty("defaultValue")&&ee(e,t.type,H(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function J(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!("submit"!==r&&"reset"!==r||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function ee(e,t,n){"number"===t&&Q(e.ownerDocument)===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var te=Array.isArray;function ne(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o<n.length;o++)t["$"+n[o]]=!0;for(n=0;n<e.length;n++)o=t.hasOwnProperty("$"+e[n].value),e[n].selected!==o&&(e[n].selected=o),o&&r&&(e[n].defaultSelected=!0)}else{for(n=""+H(n),t=null,o=0;o<e.length;o++){if(e[o].value===n)return e[o].selected=!0,void(r&&(e[o].defaultSelected=!0));null!==t||e[o].disabled||(t=e[o])}null!==t&&(t.selected=!0)}}function re(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(i(91));return L({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function oe(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(i(92));if(te(n)){if(1<n.length)throw Error(i(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:H(n)}}function ie(e,t){var n=H(t.value),r=H(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=r&&(e.defaultValue=""+r)}function ae(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}function le(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function se(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?le(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}var ue,ce,de=(ce=function(e,t){if("http://www.w3.org/2000/svg"!==e.namespaceURI||"innerHTML"in e)e.innerHTML=t;else{for((ue=ue||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=ue.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,r){MSApp.execUnsafeLocalFunction((function(){return ce(e,t)}))}:ce);function fe(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var pe={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},he=["Webkit","ms","Moz","O"];function me(e,t,n){return null==t||"boolean"===typeof t||""===t?"":n||"number"!==typeof t||0===t||pe.hasOwnProperty(e)&&pe[e]?(""+t).trim():t+"px"}function ve(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),o=me(n,t[n],r);"float"===n&&(n="cssFloat"),r?e.setProperty(n,o):e[n]=o}}Object.keys(pe).forEach((function(e){he.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),pe[t]=pe[e]}))}));var ge=L({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function ye(e,t){if(t){if(ge[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(i(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(i(60));if("object"!==typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(i(61))}if(null!=t.style&&"object"!==typeof t.style)throw Error(i(62))}}function xe(e,t){if(-1===e.indexOf("-"))return"string"===typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var be=null;function we(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var Se=null,je=null,ke=null;function Ce(e){if(e=bo(e)){if("function"!==typeof Se)throw Error(i(280));var t=e.stateNode;t&&(t=So(t),Se(e.stateNode,e.type,t))}}function Re(e){je?ke?ke.push(e):ke=[e]:je=e}function Te(){if(je){var e=je,t=ke;if(ke=je=null,Ce(e),t)for(e=0;e<t.length;e++)Ce(t[e])}}function Oe(e,t){return e(t)}function Pe(){}var Ee=!1;function Me(e,t,n){if(Ee)return e(t,n);Ee=!0;try{return Oe(e,t,n)}finally{Ee=!1,(null!==je||null!==ke)&&(Pe(),Te())}}function _e(e,t){var n=e.stateNode;if(null===n)return null;var r=So(n);if(null===r)return null;n=r[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(r=!r.disabled)||(r=!("button"===(e=e.type)||"input"===e||"select"===e||"textarea"===e)),e=!r;break e;default:e=!1}if(e)return null;if(n&&"function"!==typeof n)throw Error(i(231,t,typeof n));return n}var De=!1;if(c)try{var Ie={};Object.defineProperty(Ie,"passive",{get:function(){De=!0}}),window.addEventListener("test",Ie,Ie),window.removeEventListener("test",Ie,Ie)}catch(ce){De=!1}function Ae(e,t,n,r,o,i,a,l,s){var u=Array.prototype.slice.call(arguments,3);try{t.apply(n,u)}catch(c){this.onError(c)}}var Ne=!1,Le=null,ze=!1,Fe=null,We={onError:function(e){Ne=!0,Le=e}};function Be(e,t,n,r,o,i,a,l,s){Ne=!1,Le=null,Ae.apply(We,arguments)}function Ve(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do{0!==(4098&(t=e).flags)&&(n=t.return),e=t.return}while(e)}return 3===t.tag?n:null}function qe(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!==(e=e.alternate)&&(t=e.memoizedState)),null!==t)return t.dehydrated}return null}function He(e){if(Ve(e)!==e)throw Error(i(188))}function Ue(e){return null!==(e=function(e){var t=e.alternate;if(!t){if(null===(t=Ve(e)))throw Error(i(188));return t!==e?null:e}for(var n=e,r=t;;){var o=n.return;if(null===o)break;var a=o.alternate;if(null===a){if(null!==(r=o.return)){n=r;continue}break}if(o.child===a.child){for(a=o.child;a;){if(a===n)return He(o),e;if(a===r)return He(o),t;a=a.sibling}throw Error(i(188))}if(n.return!==r.return)n=o,r=a;else{for(var l=!1,s=o.child;s;){if(s===n){l=!0,n=o,r=a;break}if(s===r){l=!0,r=o,n=a;break}s=s.sibling}if(!l){for(s=a.child;s;){if(s===n){l=!0,n=a,r=o;break}if(s===r){l=!0,r=a,n=o;break}s=s.sibling}if(!l)throw Error(i(189))}}if(n.alternate!==r)throw Error(i(190))}if(3!==n.tag)throw Error(i(188));return n.stateNode.current===n?e:t}(e))?Ye(e):null}function Ye(e){if(5===e.tag||6===e.tag)return e;for(e=e.child;null!==e;){var t=Ye(e);if(null!==t)return t;e=e.sibling}return null}var Ge=o.unstable_scheduleCallback,Qe=o.unstable_cancelCallback,$e=o.unstable_shouldYield,Ke=o.unstable_requestPaint,Xe=o.unstable_now,Ze=o.unstable_getCurrentPriorityLevel,Je=o.unstable_ImmediatePriority,et=o.unstable_UserBlockingPriority,tt=o.unstable_NormalPriority,nt=o.unstable_LowPriority,rt=o.unstable_IdlePriority,ot=null,it=null;var at=Math.clz32?Math.clz32:function(e){return 0===(e>>>=0)?32:31-(lt(e)/st|0)|0},lt=Math.log,st=Math.LN2;var ut=64,ct=4194304;function dt(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return 4194240&e;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return 130023424&e;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function ft(e,t){var n=e.pendingLanes;if(0===n)return 0;var r=0,o=e.suspendedLanes,i=e.pingedLanes,a=268435455&n;if(0!==a){var l=a&~o;0!==l?r=dt(l):0!==(i&=a)&&(r=dt(i))}else 0!==(a=n&~o)?r=dt(a):0!==i&&(r=dt(i));if(0===r)return 0;if(0!==t&&t!==r&&0===(t&o)&&((o=r&-r)>=(i=t&-t)||16===o&&0!==(4194240&i)))return t;if(0!==(4&r)&&(r|=16&n),0!==(t=e.entangledLanes))for(e=e.entanglements,t&=r;0<t;)o=1<<(n=31-at(t)),r|=e[n],t&=~o;return r}function pt(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;default:return-1}}function ht(e){return 0!==(e=-1073741825&e.pendingLanes)?e:1073741824&e?1073741824:0}function mt(){var e=ut;return 0===(4194240&(ut<<=1))&&(ut=64),e}function vt(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function gt(e,t,n){e.pendingLanes|=t,536870912!==t&&(e.suspendedLanes=0,e.pingedLanes=0),(e=e.eventTimes)[t=31-at(t)]=n}function yt(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-at(n),o=1<<r;o&t|e[r]&t&&(e[r]|=t),n&=~o}}var xt=0;function bt(e){return 1<(e&=-e)?4<e?0!==(268435455&e)?16:536870912:4:1}var wt,St,jt,kt,Ct,Rt=!1,Tt=[],Ot=null,Pt=null,Et=null,Mt=new Map,_t=new Map,Dt=[],It="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function At(e,t){switch(e){case"focusin":case"focusout":Ot=null;break;case"dragenter":case"dragleave":Pt=null;break;case"mouseover":case"mouseout":Et=null;break;case"pointerover":case"pointerout":Mt.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":_t.delete(t.pointerId)}}function Nt(e,t,n,r,o,i){return null===e||e.nativeEvent!==i?(e={blockedOn:t,domEventName:n,eventSystemFlags:r,nativeEvent:i,targetContainers:[o]},null!==t&&(null!==(t=bo(t))&&St(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,null!==o&&-1===t.indexOf(o)&&t.push(o),e)}function Lt(e){var t=xo(e.target);if(null!==t){var n=Ve(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=qe(n)))return e.blockedOn=t,void Ct(e.priority,(function(){jt(n)}))}else if(3===t&&n.stateNode.current.memoizedState.isDehydrated)return void(e.blockedOn=3===n.tag?n.stateNode.containerInfo:null)}e.blockedOn=null}function zt(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=$t(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(null!==n)return null!==(t=bo(n))&&St(t),e.blockedOn=n,!1;var r=new(n=e.nativeEvent).constructor(n.type,n);be=r,n.target.dispatchEvent(r),be=null,t.shift()}return!0}function Ft(e,t,n){zt(e)&&n.delete(t)}function Wt(){Rt=!1,null!==Ot&&zt(Ot)&&(Ot=null),null!==Pt&&zt(Pt)&&(Pt=null),null!==Et&&zt(Et)&&(Et=null),Mt.forEach(Ft),_t.forEach(Ft)}function Bt(e,t){e.blockedOn===t&&(e.blockedOn=null,Rt||(Rt=!0,o.unstable_scheduleCallback(o.unstable_NormalPriority,Wt)))}function Vt(e){function t(t){return Bt(t,e)}if(0<Tt.length){Bt(Tt[0],e);for(var n=1;n<Tt.length;n++){var r=Tt[n];r.blockedOn===e&&(r.blockedOn=null)}}for(null!==Ot&&Bt(Ot,e),null!==Pt&&Bt(Pt,e),null!==Et&&Bt(Et,e),Mt.forEach(t),_t.forEach(t),n=0;n<Dt.length;n++)(r=Dt[n]).blockedOn===e&&(r.blockedOn=null);for(;0<Dt.length&&null===(n=Dt[0]).blockedOn;)Lt(n),null===n.blockedOn&&Dt.shift()}var qt=b.ReactCurrentBatchConfig,Ht=!0;function Ut(e,t,n,r){var o=xt,i=qt.transition;qt.transition=null;try{xt=1,Gt(e,t,n,r)}finally{xt=o,qt.transition=i}}function Yt(e,t,n,r){var o=xt,i=qt.transition;qt.transition=null;try{xt=4,Gt(e,t,n,r)}finally{xt=o,qt.transition=i}}function Gt(e,t,n,r){if(Ht){var o=$t(e,t,n,r);if(null===o)Hr(e,t,r,Qt,n),At(e,r);else if(function(e,t,n,r,o){switch(t){case"focusin":return Ot=Nt(Ot,e,t,n,r,o),!0;case"dragenter":return Pt=Nt(Pt,e,t,n,r,o),!0;case"mouseover":return Et=Nt(Et,e,t,n,r,o),!0;case"pointerover":var i=o.pointerId;return Mt.set(i,Nt(Mt.get(i)||null,e,t,n,r,o)),!0;case"gotpointercapture":return i=o.pointerId,_t.set(i,Nt(_t.get(i)||null,e,t,n,r,o)),!0}return!1}(o,e,t,n,r))r.stopPropagation();else if(At(e,r),4&t&&-1<It.indexOf(e)){for(;null!==o;){var i=bo(o);if(null!==i&&wt(i),null===(i=$t(e,t,n,r))&&Hr(e,t,r,Qt,n),i===o)break;o=i}null!==o&&r.stopPropagation()}else Hr(e,t,r,null,n)}}var Qt=null;function $t(e,t,n,r){if(Qt=null,null!==(e=xo(e=we(r))))if(null===(t=Ve(e)))e=null;else if(13===(n=t.tag)){if(null!==(e=qe(t)))return e;e=null}else if(3===n){if(t.stateNode.current.memoizedState.isDehydrated)return 3===t.tag?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return Qt=e,null}function Kt(e){switch(e){case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 1;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"toggle":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 4;case"message":switch(Ze()){case Je:return 1;case et:return 4;case tt:case nt:return 16;case rt:return 536870912;default:return 16}default:return 16}}var Xt=null,Zt=null,Jt=null;function en(){if(Jt)return Jt;var e,t,n=Zt,r=n.length,o="value"in Xt?Xt.value:Xt.textContent,i=o.length;for(e=0;e<r&&n[e]===o[e];e++);var a=r-e;for(t=1;t<=a&&n[r-t]===o[i-t];t++);return Jt=o.slice(e,1<t?1-t:void 0)}function tn(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function nn(){return!0}function rn(){return!1}function on(e){function t(t,n,r,o,i){for(var a in this._reactName=t,this._targetInst=r,this.type=n,this.nativeEvent=o,this.target=i,this.currentTarget=null,e)e.hasOwnProperty(a)&&(t=e[a],this[a]=t?t(o):o[a]);return this.isDefaultPrevented=(null!=o.defaultPrevented?o.defaultPrevented:!1===o.returnValue)?nn:rn,this.isPropagationStopped=rn,this}return L(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!==typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=nn)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!==typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=nn)},persist:function(){},isPersistent:nn}),t}var an,ln,sn,un={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},cn=on(un),dn=L({},un,{view:0,detail:0}),fn=on(dn),pn=L({},dn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Cn,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==sn&&(sn&&"mousemove"===e.type?(an=e.screenX-sn.screenX,ln=e.screenY-sn.screenY):ln=an=0,sn=e),an)},movementY:function(e){return"movementY"in e?e.movementY:ln}}),hn=on(pn),mn=on(L({},pn,{dataTransfer:0})),vn=on(L({},dn,{relatedTarget:0})),gn=on(L({},un,{animationName:0,elapsedTime:0,pseudoElement:0})),yn=L({},un,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),xn=on(yn),bn=on(L({},un,{data:0})),wn={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},Sn={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},jn={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function kn(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=jn[e])&&!!t[e]}function Cn(){return kn}var Rn=L({},dn,{key:function(e){if(e.key){var t=wn[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=tn(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?Sn[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:Cn,charCode:function(e){return"keypress"===e.type?tn(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?tn(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),Tn=on(Rn),On=on(L({},pn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),Pn=on(L({},dn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Cn})),En=on(L({},un,{propertyName:0,elapsedTime:0,pseudoElement:0})),Mn=L({},pn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),_n=on(Mn),Dn=[9,13,27,32],In=c&&"CompositionEvent"in window,An=null;c&&"documentMode"in document&&(An=document.documentMode);var Nn=c&&"TextEvent"in window&&!An,Ln=c&&(!In||An&&8<An&&11>=An),zn=String.fromCharCode(32),Fn=!1;function Wn(e,t){switch(e){case"keyup":return-1!==Dn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Bn(e){return"object"===typeof(e=e.detail)&&"data"in e?e.data:null}var Vn=!1;var qn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Hn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!qn[e.type]:"textarea"===t}function Un(e,t,n,r){Re(r),0<(t=Yr(t,"onChange")).length&&(n=new cn("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Yn=null,Gn=null;function Qn(e){zr(e,0)}function $n(e){if(G(wo(e)))return e}function Kn(e,t){if("change"===e)return t}var Xn=!1;if(c){var Zn;if(c){var Jn="oninput"in document;if(!Jn){var er=document.createElement("div");er.setAttribute("oninput","return;"),Jn="function"===typeof er.oninput}Zn=Jn}else Zn=!1;Xn=Zn&&(!document.documentMode||9<document.documentMode)}function tr(){Yn&&(Yn.detachEvent("onpropertychange",nr),Gn=Yn=null)}function nr(e){if("value"===e.propertyName&&$n(Gn)){var t=[];Un(t,Gn,e,we(e)),Me(Qn,t)}}function rr(e,t,n){"focusin"===e?(tr(),Gn=n,(Yn=t).attachEvent("onpropertychange",nr)):"focusout"===e&&tr()}function or(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return $n(Gn)}function ir(e,t){if("click"===e)return $n(t)}function ar(e,t){if("input"===e||"change"===e)return $n(t)}var lr="function"===typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e===1/t)||e!==e&&t!==t};function sr(e,t){if(lr(e,t))return!0;if("object"!==typeof e||null===e||"object"!==typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++){var o=n[r];if(!d.call(t,o)||!lr(e[o],t[o]))return!1}return!0}function ur(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function cr(e,t){var n,r=ur(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.textContent.length,e<=t&&n>=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=ur(r)}}function dr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?dr(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function fr(){for(var e=window,t=Q();t instanceof e.HTMLIFrameElement;){try{var n="string"===typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=Q((e=t.contentWindow).document)}return t}function pr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}function hr(e){var t=fr(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&dr(n.ownerDocument.documentElement,n)){if(null!==r&&pr(n))if(t=r.start,void 0===(e=r.end)&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if((e=(t=n.ownerDocument||document)&&t.defaultView||window).getSelection){e=e.getSelection();var o=n.textContent.length,i=Math.min(r.start,o);r=void 0===r.end?i:Math.min(r.end,o),!e.extend&&i>r&&(o=r,r=i,i=o),o=cr(n,i);var a=cr(n,r);o&&a&&(1!==e.rangeCount||e.anchorNode!==o.node||e.anchorOffset!==o.offset||e.focusNode!==a.node||e.focusOffset!==a.offset)&&((t=t.createRange()).setStart(o.node,o.offset),e.removeAllRanges(),i>r?(e.addRange(t),e.extend(a.node,a.offset)):(t.setEnd(a.node,a.offset),e.addRange(t)))}for(t=[],e=n;e=e.parentNode;)1===e.nodeType&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for("function"===typeof n.focus&&n.focus(),n=0;n<t.length;n++)(e=t[n]).element.scrollLeft=e.left,e.element.scrollTop=e.top}}var mr=c&&"documentMode"in document&&11>=document.documentMode,vr=null,gr=null,yr=null,xr=!1;function br(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;xr||null==vr||vr!==Q(r)||("selectionStart"in(r=vr)&&pr(r)?r={start:r.selectionStart,end:r.selectionEnd}:r={anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},yr&&sr(yr,r)||(yr=r,0<(r=Yr(gr,"onSelect")).length&&(t=new cn("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=vr)))}function wr(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var Sr={animationend:wr("Animation","AnimationEnd"),animationiteration:wr("Animation","AnimationIteration"),animationstart:wr("Animation","AnimationStart"),transitionend:wr("Transition","TransitionEnd")},jr={},kr={};function Cr(e){if(jr[e])return jr[e];if(!Sr[e])return e;var t,n=Sr[e];for(t in n)if(n.hasOwnProperty(t)&&t in kr)return jr[e]=n[t];return e}c&&(kr=document.createElement("div").style,"AnimationEvent"in window||(delete Sr.animationend.animation,delete Sr.animationiteration.animation,delete Sr.animationstart.animation),"TransitionEvent"in window||delete Sr.transitionend.transition);var Rr=Cr("animationend"),Tr=Cr("animationiteration"),Or=Cr("animationstart"),Pr=Cr("transitionend"),Er=new Map,Mr="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function _r(e,t){Er.set(e,t),s(t,[e])}for(var Dr=0;Dr<Mr.length;Dr++){var Ir=Mr[Dr];_r(Ir.toLowerCase(),"on"+(Ir[0].toUpperCase()+Ir.slice(1)))}_r(Rr,"onAnimationEnd"),_r(Tr,"onAnimationIteration"),_r(Or,"onAnimationStart"),_r("dblclick","onDoubleClick"),_r("focusin","onFocus"),_r("focusout","onBlur"),_r(Pr,"onTransitionEnd"),u("onMouseEnter",["mouseout","mouseover"]),u("onMouseLeave",["mouseout","mouseover"]),u("onPointerEnter",["pointerout","pointerover"]),u("onPointerLeave",["pointerout","pointerover"]),s("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),s("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),s("onBeforeInput",["compositionend","keypress","textInput","paste"]),s("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),s("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),s("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Ar="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Nr=new Set("cancel close invalid load scroll toggle".split(" ").concat(Ar));function Lr(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,function(e,t,n,r,o,a,l,s,u){if(Be.apply(this,arguments),Ne){if(!Ne)throw Error(i(198));var c=Le;Ne=!1,Le=null,ze||(ze=!0,Fe=c)}}(r,t,void 0,e),e.currentTarget=null}function zr(e,t){t=0!==(4&t);for(var n=0;n<e.length;n++){var r=e[n],o=r.event;r=r.listeners;e:{var i=void 0;if(t)for(var a=r.length-1;0<=a;a--){var l=r[a],s=l.instance,u=l.currentTarget;if(l=l.listener,s!==i&&o.isPropagationStopped())break e;Lr(o,l,u),i=s}else for(a=0;a<r.length;a++){if(s=(l=r[a]).instance,u=l.currentTarget,l=l.listener,s!==i&&o.isPropagationStopped())break e;Lr(o,l,u),i=s}}}if(ze)throw e=Fe,ze=!1,Fe=null,e}function Fr(e,t){var n=t[vo];void 0===n&&(n=t[vo]=new Set);var r=e+"__bubble";n.has(r)||(qr(t,e,2,!1),n.add(r))}function Wr(e,t,n){var r=0;t&&(r|=4),qr(n,e,r,t)}var Br="_reactListening"+Math.random().toString(36).slice(2);function Vr(e){if(!e[Br]){e[Br]=!0,a.forEach((function(t){"selectionchange"!==t&&(Nr.has(t)||Wr(t,!1,e),Wr(t,!0,e))}));var t=9===e.nodeType?e:e.ownerDocument;null===t||t[Br]||(t[Br]=!0,Wr("selectionchange",!1,t))}}function qr(e,t,n,r){switch(Kt(t)){case 1:var o=Ut;break;case 4:o=Yt;break;default:o=Gt}n=o.bind(null,t,n,e),o=void 0,!De||"touchstart"!==t&&"touchmove"!==t&&"wheel"!==t||(o=!0),r?void 0!==o?e.addEventListener(t,n,{capture:!0,passive:o}):e.addEventListener(t,n,!0):void 0!==o?e.addEventListener(t,n,{passive:o}):e.addEventListener(t,n,!1)}function Hr(e,t,n,r,o){var i=r;if(0===(1&t)&&0===(2&t)&&null!==r)e:for(;;){if(null===r)return;var a=r.tag;if(3===a||4===a){var l=r.stateNode.containerInfo;if(l===o||8===l.nodeType&&l.parentNode===o)break;if(4===a)for(a=r.return;null!==a;){var s=a.tag;if((3===s||4===s)&&((s=a.stateNode.containerInfo)===o||8===s.nodeType&&s.parentNode===o))return;a=a.return}for(;null!==l;){if(null===(a=xo(l)))return;if(5===(s=a.tag)||6===s){r=i=a;continue e}l=l.parentNode}}r=r.return}Me((function(){var r=i,o=we(n),a=[];e:{var l=Er.get(e);if(void 0!==l){var s=cn,u=e;switch(e){case"keypress":if(0===tn(n))break e;case"keydown":case"keyup":s=Tn;break;case"focusin":u="focus",s=vn;break;case"focusout":u="blur",s=vn;break;case"beforeblur":case"afterblur":s=vn;break;case"click":if(2===n.button)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":s=hn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":s=mn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":s=Pn;break;case Rr:case Tr:case Or:s=gn;break;case Pr:s=En;break;case"scroll":s=fn;break;case"wheel":s=_n;break;case"copy":case"cut":case"paste":s=xn;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":s=On}var c=0!==(4&t),d=!c&&"scroll"===e,f=c?null!==l?l+"Capture":null:l;c=[];for(var p,h=r;null!==h;){var m=(p=h).stateNode;if(5===p.tag&&null!==m&&(p=m,null!==f&&(null!=(m=_e(h,f))&&c.push(Ur(h,m,p)))),d)break;h=h.return}0<c.length&&(l=new s(l,u,null,n,o),a.push({event:l,listeners:c}))}}if(0===(7&t)){if(s="mouseout"===e||"pointerout"===e,(!(l="mouseover"===e||"pointerover"===e)||n===be||!(u=n.relatedTarget||n.fromElement)||!xo(u)&&!u[mo])&&(s||l)&&(l=o.window===o?o:(l=o.ownerDocument)?l.defaultView||l.parentWindow:window,s?(s=r,null!==(u=(u=n.relatedTarget||n.toElement)?xo(u):null)&&(u!==(d=Ve(u))||5!==u.tag&&6!==u.tag)&&(u=null)):(s=null,u=r),s!==u)){if(c=hn,m="onMouseLeave",f="onMouseEnter",h="mouse","pointerout"!==e&&"pointerover"!==e||(c=On,m="onPointerLeave",f="onPointerEnter",h="pointer"),d=null==s?l:wo(s),p=null==u?l:wo(u),(l=new c(m,h+"leave",s,n,o)).target=d,l.relatedTarget=p,m=null,xo(o)===r&&((c=new c(f,h+"enter",u,n,o)).target=p,c.relatedTarget=d,m=c),d=m,s&&u)e:{for(f=u,h=0,p=c=s;p;p=Gr(p))h++;for(p=0,m=f;m;m=Gr(m))p++;for(;0<h-p;)c=Gr(c),h--;for(;0<p-h;)f=Gr(f),p--;for(;h--;){if(c===f||null!==f&&c===f.alternate)break e;c=Gr(c),f=Gr(f)}c=null}else c=null;null!==s&&Qr(a,l,s,c,!1),null!==u&&null!==d&&Qr(a,d,u,c,!0)}if("select"===(s=(l=r?wo(r):window).nodeName&&l.nodeName.toLowerCase())||"input"===s&&"file"===l.type)var v=Kn;else if(Hn(l))if(Xn)v=ar;else{v=or;var g=rr}else(s=l.nodeName)&&"input"===s.toLowerCase()&&("checkbox"===l.type||"radio"===l.type)&&(v=ir);switch(v&&(v=v(e,r))?Un(a,v,n,o):(g&&g(e,l,r),"focusout"===e&&(g=l._wrapperState)&&g.controlled&&"number"===l.type&&ee(l,"number",l.value)),g=r?wo(r):window,e){case"focusin":(Hn(g)||"true"===g.contentEditable)&&(vr=g,gr=r,yr=null);break;case"focusout":yr=gr=vr=null;break;case"mousedown":xr=!0;break;case"contextmenu":case"mouseup":case"dragend":xr=!1,br(a,n,o);break;case"selectionchange":if(mr)break;case"keydown":case"keyup":br(a,n,o)}var y;if(In)e:{switch(e){case"compositionstart":var x="onCompositionStart";break e;case"compositionend":x="onCompositionEnd";break e;case"compositionupdate":x="onCompositionUpdate";break e}x=void 0}else Vn?Wn(e,n)&&(x="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(x="onCompositionStart");x&&(Ln&&"ko"!==n.locale&&(Vn||"onCompositionStart"!==x?"onCompositionEnd"===x&&Vn&&(y=en()):(Zt="value"in(Xt=o)?Xt.value:Xt.textContent,Vn=!0)),0<(g=Yr(r,x)).length&&(x=new bn(x,e,null,n,o),a.push({event:x,listeners:g}),y?x.data=y:null!==(y=Bn(n))&&(x.data=y))),(y=Nn?function(e,t){switch(e){case"compositionend":return Bn(t);case"keypress":return 32!==t.which?null:(Fn=!0,zn);case"textInput":return(e=t.data)===zn&&Fn?null:e;default:return null}}(e,n):function(e,t){if(Vn)return"compositionend"===e||!In&&Wn(e,t)?(e=en(),Jt=Zt=Xt=null,Vn=!1,e):null;switch(e){case"paste":default:return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return Ln&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(r=Yr(r,"onBeforeInput")).length&&(o=new bn("onBeforeInput","beforeinput",null,n,o),a.push({event:o,listeners:r}),o.data=y))}zr(a,t)}))}function Ur(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Yr(e,t){for(var n=t+"Capture",r=[];null!==e;){var o=e,i=o.stateNode;5===o.tag&&null!==i&&(o=i,null!=(i=_e(e,n))&&r.unshift(Ur(e,i,o)),null!=(i=_e(e,t))&&r.push(Ur(e,i,o))),e=e.return}return r}function Gr(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag);return e||null}function Qr(e,t,n,r,o){for(var i=t._reactName,a=[];null!==n&&n!==r;){var l=n,s=l.alternate,u=l.stateNode;if(null!==s&&s===r)break;5===l.tag&&null!==u&&(l=u,o?null!=(s=_e(n,i))&&a.unshift(Ur(n,s,l)):o||null!=(s=_e(n,i))&&a.push(Ur(n,s,l))),n=n.return}0!==a.length&&e.push({event:t,listeners:a})}var $r=/\r\n?/g,Kr=/\u0000|\uFFFD/g;function Xr(e){return("string"===typeof e?e:""+e).replace($r,"\n").replace(Kr,"")}function Zr(e,t,n){if(t=Xr(t),Xr(e)!==t&&n)throw Error(i(425))}function Jr(){}var eo=null,to=null;function no(e,t){return"textarea"===e||"noscript"===e||"string"===typeof t.children||"number"===typeof t.children||"object"===typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var ro="function"===typeof setTimeout?setTimeout:void 0,oo="function"===typeof clearTimeout?clearTimeout:void 0,io="function"===typeof Promise?Promise:void 0,ao="function"===typeof queueMicrotask?queueMicrotask:"undefined"!==typeof io?function(e){return io.resolve(null).then(e).catch(lo)}:ro;function lo(e){setTimeout((function(){throw e}))}function so(e,t){var n=t,r=0;do{var o=n.nextSibling;if(e.removeChild(n),o&&8===o.nodeType)if("/$"===(n=o.data)){if(0===r)return e.removeChild(o),void Vt(t);r--}else"$"!==n&&"$?"!==n&&"$!"!==n||r++;n=o}while(n);Vt(t)}function uo(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break;if(8===t){if("$"===(t=e.data)||"$!"===t||"$?"===t)break;if("/$"===t)return null}}return e}function co(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if("$"===n||"$!"===n||"$?"===n){if(0===t)return e;t--}else"/$"===n&&t++}e=e.previousSibling}return null}var fo=Math.random().toString(36).slice(2),po="__reactFiber$"+fo,ho="__reactProps$"+fo,mo="__reactContainer$"+fo,vo="__reactEvents$"+fo,go="__reactListeners$"+fo,yo="__reactHandles$"+fo;function xo(e){var t=e[po];if(t)return t;for(var n=e.parentNode;n;){if(t=n[mo]||n[po]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=co(e);null!==e;){if(n=e[po])return n;e=co(e)}return t}n=(e=n).parentNode}return null}function bo(e){return!(e=e[po]||e[mo])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function wo(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(i(33))}function So(e){return e[ho]||null}var jo=[],ko=-1;function Co(e){return{current:e}}function Ro(e){0>ko||(e.current=jo[ko],jo[ko]=null,ko--)}function To(e,t){ko++,jo[ko]=e.current,e.current=t}var Oo={},Po=Co(Oo),Eo=Co(!1),Mo=Oo;function _o(e,t){var n=e.type.contextTypes;if(!n)return Oo;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var o,i={};for(o in n)i[o]=t[o];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=i),i}function Do(e){return null!==(e=e.childContextTypes)&&void 0!==e}function Io(){Ro(Eo),Ro(Po)}function Ao(e,t,n){if(Po.current!==Oo)throw Error(i(168));To(Po,t),To(Eo,n)}function No(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,"function"!==typeof r.getChildContext)return n;for(var o in r=r.getChildContext())if(!(o in t))throw Error(i(108,q(e)||"Unknown",o));return L({},n,r)}function Lo(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Oo,Mo=Po.current,To(Po,e),To(Eo,Eo.current),!0}function zo(e,t,n){var r=e.stateNode;if(!r)throw Error(i(169));n?(e=No(e,t,Mo),r.__reactInternalMemoizedMergedChildContext=e,Ro(Eo),Ro(Po),To(Po,e)):Ro(Eo),To(Eo,n)}var Fo=null,Wo=!1,Bo=!1;function Vo(e){null===Fo?Fo=[e]:Fo.push(e)}function qo(){if(!Bo&&null!==Fo){Bo=!0;var e=0,t=xt;try{var n=Fo;for(xt=1;e<n.length;e++){var r=n[e];do{r=r(!0)}while(null!==r)}Fo=null,Wo=!1}catch(o){throw null!==Fo&&(Fo=Fo.slice(e+1)),Ge(Je,qo),o}finally{xt=t,Bo=!1}}return null}var Ho=[],Uo=0,Yo=null,Go=0,Qo=[],$o=0,Ko=null,Xo=1,Zo="";function Jo(e,t){Ho[Uo++]=Go,Ho[Uo++]=Yo,Yo=e,Go=t}function ei(e,t,n){Qo[$o++]=Xo,Qo[$o++]=Zo,Qo[$o++]=Ko,Ko=e;var r=Xo;e=Zo;var o=32-at(r)-1;r&=~(1<<o),n+=1;var i=32-at(t)+o;if(30<i){var a=o-o%5;i=(r&(1<<a)-1).toString(32),r>>=a,o-=a,Xo=1<<32-at(t)+o|n<<o|r,Zo=i+e}else Xo=1<<i|n<<o|r,Zo=e}function ti(e){null!==e.return&&(Jo(e,1),ei(e,1,0))}function ni(e){for(;e===Yo;)Yo=Ho[--Uo],Ho[Uo]=null,Go=Ho[--Uo],Ho[Uo]=null;for(;e===Ko;)Ko=Qo[--$o],Qo[$o]=null,Zo=Qo[--$o],Qo[$o]=null,Xo=Qo[--$o],Qo[$o]=null}var ri=null,oi=null,ii=!1,ai=null;function li(e,t){var n=Mu(5,null,null,0);n.elementType="DELETED",n.stateNode=t,n.return=e,null===(t=e.deletions)?(e.deletions=[n],e.flags|=16):t.push(n)}function si(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==t.nodeType||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t)&&(e.stateNode=t,ri=e,oi=uo(t.firstChild),!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,ri=e,oi=null,!0);case 13:return null!==(t=8!==t.nodeType?null:t)&&(n=null!==Ko?{id:Xo,overflow:Zo}:null,e.memoizedState={dehydrated:t,treeContext:n,retryLane:1073741824},(n=Mu(18,null,null,0)).stateNode=t,n.return=e,e.child=n,ri=e,oi=null,!0);default:return!1}}function ui(e){return 0!==(1&e.mode)&&0===(128&e.flags)}function ci(e){if(ii){var t=oi;if(t){var n=t;if(!si(e,t)){if(ui(e))throw Error(i(418));t=uo(n.nextSibling);var r=ri;t&&si(e,t)?li(r,n):(e.flags=-4097&e.flags|2,ii=!1,ri=e)}}else{if(ui(e))throw Error(i(418));e.flags=-4097&e.flags|2,ii=!1,ri=e}}}function di(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;ri=e}function fi(e){if(e!==ri)return!1;if(!ii)return di(e),ii=!0,!1;var t;if((t=3!==e.tag)&&!(t=5!==e.tag)&&(t="head"!==(t=e.type)&&"body"!==t&&!no(e.type,e.memoizedProps)),t&&(t=oi)){if(ui(e))throw pi(),Error(i(418));for(;t;)li(e,t),t=uo(t.nextSibling)}if(di(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(i(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){oi=uo(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}oi=null}}else oi=ri?uo(e.stateNode.nextSibling):null;return!0}function pi(){for(var e=oi;e;)e=uo(e.nextSibling)}function hi(){oi=ri=null,ii=!1}function mi(e){null===ai?ai=[e]:ai.push(e)}var vi=b.ReactCurrentBatchConfig;function gi(e,t){if(e&&e.defaultProps){for(var n in t=L({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}var yi=Co(null),xi=null,bi=null,wi=null;function Si(){wi=bi=xi=null}function ji(e){var t=yi.current;Ro(yi),e._currentValue=t}function ki(e,t,n){for(;null!==e;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,null!==r&&(r.childLanes|=t)):null!==r&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function Ci(e,t){xi=e,wi=bi=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(0!==(e.lanes&t)&&(bl=!0),e.firstContext=null)}function Ri(e){var t=e._currentValue;if(wi!==e)if(e={context:e,memoizedValue:t,next:null},null===bi){if(null===xi)throw Error(i(308));bi=e,xi.dependencies={lanes:0,firstContext:e}}else bi=bi.next=e;return t}var Ti=null;function Oi(e){null===Ti?Ti=[e]:Ti.push(e)}function Pi(e,t,n,r){var o=t.interleaved;return null===o?(n.next=n,Oi(t)):(n.next=o.next,o.next=n),t.interleaved=n,Ei(e,r)}function Ei(e,t){e.lanes|=t;var n=e.alternate;for(null!==n&&(n.lanes|=t),n=e,e=e.return;null!==e;)e.childLanes|=t,null!==(n=e.alternate)&&(n.childLanes|=t),n=e,e=e.return;return 3===n.tag?n.stateNode:null}var Mi=!1;function _i(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Di(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Ii(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Ai(e,t,n){var r=e.updateQueue;if(null===r)return null;if(r=r.shared,0!==(2&Os)){var o=r.pending;return null===o?t.next=t:(t.next=o.next,o.next=t),r.pending=t,Ei(e,n)}return null===(o=r.interleaved)?(t.next=t,Oi(r)):(t.next=o.next,o.next=t),r.interleaved=t,Ei(e,n)}function Ni(e,t,n){if(null!==(t=t.updateQueue)&&(t=t.shared,0!==(4194240&n))){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,yt(e,n)}}function Li(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var o=null,i=null;if(null!==(n=n.firstBaseUpdate)){do{var a={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};null===i?o=i=a:i=i.next=a,n=n.next}while(null!==n);null===i?o=i=t:i=i.next=t}else o=i=t;return n={baseState:r.baseState,firstBaseUpdate:o,lastBaseUpdate:i,shared:r.shared,effects:r.effects},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function zi(e,t,n,r){var o=e.updateQueue;Mi=!1;var i=o.firstBaseUpdate,a=o.lastBaseUpdate,l=o.shared.pending;if(null!==l){o.shared.pending=null;var s=l,u=s.next;s.next=null,null===a?i=u:a.next=u,a=s;var c=e.alternate;null!==c&&((l=(c=c.updateQueue).lastBaseUpdate)!==a&&(null===l?c.firstBaseUpdate=u:l.next=u,c.lastBaseUpdate=s))}if(null!==i){var d=o.baseState;for(a=0,c=u=s=null,l=i;;){var f=l.lane,p=l.eventTime;if((r&f)===f){null!==c&&(c=c.next={eventTime:p,lane:0,tag:l.tag,payload:l.payload,callback:l.callback,next:null});e:{var h=e,m=l;switch(f=t,p=n,m.tag){case 1:if("function"===typeof(h=m.payload)){d=h.call(p,d,f);break e}d=h;break e;case 3:h.flags=-65537&h.flags|128;case 0:if(null===(f="function"===typeof(h=m.payload)?h.call(p,d,f):h)||void 0===f)break e;d=L({},d,f);break e;case 2:Mi=!0}}null!==l.callback&&0!==l.lane&&(e.flags|=64,null===(f=o.effects)?o.effects=[l]:f.push(l))}else p={eventTime:p,lane:f,tag:l.tag,payload:l.payload,callback:l.callback,next:null},null===c?(u=c=p,s=d):c=c.next=p,a|=f;if(null===(l=l.next)){if(null===(l=o.shared.pending))break;l=(f=l).next,f.next=null,o.lastBaseUpdate=f,o.shared.pending=null}}if(null===c&&(s=d),o.baseState=s,o.firstBaseUpdate=u,o.lastBaseUpdate=c,null!==(t=o.shared.interleaved)){o=t;do{a|=o.lane,o=o.next}while(o!==t)}else null===i&&(o.shared.lanes=0);Ns|=a,e.lanes=a,e.memoizedState=d}}function Fi(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var r=e[t],o=r.callback;if(null!==o){if(r.callback=null,r=n,"function"!==typeof o)throw Error(i(191,o));o.call(r)}}}var Wi=(new r.Component).refs;function Bi(e,t,n,r){n=null===(n=n(r,t=e.memoizedState))||void 0===n?t:L({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var Vi={isMounted:function(e){return!!(e=e._reactInternals)&&Ve(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=eu(),o=tu(e),i=Ii(r,o);i.payload=t,void 0!==n&&null!==n&&(i.callback=n),null!==(t=Ai(e,i,o))&&(nu(t,e,o,r),Ni(t,e,o))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=eu(),o=tu(e),i=Ii(r,o);i.tag=1,i.payload=t,void 0!==n&&null!==n&&(i.callback=n),null!==(t=Ai(e,i,o))&&(nu(t,e,o,r),Ni(t,e,o))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=eu(),r=tu(e),o=Ii(n,r);o.tag=2,void 0!==t&&null!==t&&(o.callback=t),null!==(t=Ai(e,o,r))&&(nu(t,e,r,n),Ni(t,e,r))}};function qi(e,t,n,r,o,i,a){return"function"===typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,i,a):!t.prototype||!t.prototype.isPureReactComponent||(!sr(n,r)||!sr(o,i))}function Hi(e,t,n){var r=!1,o=Oo,i=t.contextType;return"object"===typeof i&&null!==i?i=Ri(i):(o=Do(t)?Mo:Po.current,i=(r=null!==(r=t.contextTypes)&&void 0!==r)?_o(e,o):Oo),t=new t(n,i),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=Vi,e.stateNode=t,t._reactInternals=e,r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=o,e.__reactInternalMemoizedMaskedChildContext=i),t}function Ui(e,t,n,r){e=t.state,"function"===typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,r),"function"===typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&Vi.enqueueReplaceState(t,t.state,null)}function Yi(e,t,n,r){var o=e.stateNode;o.props=n,o.state=e.memoizedState,o.refs=Wi,_i(e);var i=t.contextType;"object"===typeof i&&null!==i?o.context=Ri(i):(i=Do(t)?Mo:Po.current,o.context=_o(e,i)),o.state=e.memoizedState,"function"===typeof(i=t.getDerivedStateFromProps)&&(Bi(e,t,i,n),o.state=e.memoizedState),"function"===typeof t.getDerivedStateFromProps||"function"===typeof o.getSnapshotBeforeUpdate||"function"!==typeof o.UNSAFE_componentWillMount&&"function"!==typeof o.componentWillMount||(t=o.state,"function"===typeof o.componentWillMount&&o.componentWillMount(),"function"===typeof o.UNSAFE_componentWillMount&&o.UNSAFE_componentWillMount(),t!==o.state&&Vi.enqueueReplaceState(o,o.state,null),zi(e,n,o,r),o.state=e.memoizedState),"function"===typeof o.componentDidMount&&(e.flags|=4194308)}function Gi(e,t,n){if(null!==(e=n.ref)&&"function"!==typeof e&&"object"!==typeof e){if(n._owner){if(n=n._owner){if(1!==n.tag)throw Error(i(309));var r=n.stateNode}if(!r)throw Error(i(147,e));var o=r,a=""+e;return null!==t&&null!==t.ref&&"function"===typeof t.ref&&t.ref._stringRef===a?t.ref:(t=function(e){var t=o.refs;t===Wi&&(t=o.refs={}),null===e?delete t[a]:t[a]=e},t._stringRef=a,t)}if("string"!==typeof e)throw Error(i(284));if(!n._owner)throw Error(i(290,e))}return e}function Qi(e,t){throw e=Object.prototype.toString.call(t),Error(i(31,"[object Object]"===e?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function $i(e){return(0,e._init)(e._payload)}function Ki(e){function t(t,n){if(e){var r=t.deletions;null===r?(t.deletions=[n],t.flags|=16):r.push(n)}}function n(n,r){if(!e)return null;for(;null!==r;)t(n,r),r=r.sibling;return null}function r(e,t){for(e=new Map;null!==t;)null!==t.key?e.set(t.key,t):e.set(t.index,t),t=t.sibling;return e}function o(e,t){return(e=Du(e,t)).index=0,e.sibling=null,e}function a(t,n,r){return t.index=r,e?null!==(r=t.alternate)?(r=r.index)<n?(t.flags|=2,n):r:(t.flags|=2,n):(t.flags|=1048576,n)}function l(t){return e&&null===t.alternate&&(t.flags|=2),t}function s(e,t,n,r){return null===t||6!==t.tag?((t=Lu(n,e.mode,r)).return=e,t):((t=o(t,n)).return=e,t)}function u(e,t,n,r){var i=n.type;return i===j?d(e,t,n.props.children,r,n.key):null!==t&&(t.elementType===i||"object"===typeof i&&null!==i&&i.$$typeof===_&&$i(i)===t.type)?((r=o(t,n.props)).ref=Gi(e,t,n),r.return=e,r):((r=Iu(n.type,n.key,n.props,null,e.mode,r)).ref=Gi(e,t,n),r.return=e,r)}function c(e,t,n,r){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=zu(n,e.mode,r)).return=e,t):((t=o(t,n.children||[])).return=e,t)}function d(e,t,n,r,i){return null===t||7!==t.tag?((t=Au(n,e.mode,r,i)).return=e,t):((t=o(t,n)).return=e,t)}function f(e,t,n){if("string"===typeof t&&""!==t||"number"===typeof t)return(t=Lu(""+t,e.mode,n)).return=e,t;if("object"===typeof t&&null!==t){switch(t.$$typeof){case w:return(n=Iu(t.type,t.key,t.props,null,e.mode,n)).ref=Gi(e,null,t),n.return=e,n;case S:return(t=zu(t,e.mode,n)).return=e,t;case _:return f(e,(0,t._init)(t._payload),n)}if(te(t)||A(t))return(t=Au(t,e.mode,n,null)).return=e,t;Qi(e,t)}return null}function p(e,t,n,r){var o=null!==t?t.key:null;if("string"===typeof n&&""!==n||"number"===typeof n)return null!==o?null:s(e,t,""+n,r);if("object"===typeof n&&null!==n){switch(n.$$typeof){case w:return n.key===o?u(e,t,n,r):null;case S:return n.key===o?c(e,t,n,r):null;case _:return p(e,t,(o=n._init)(n._payload),r)}if(te(n)||A(n))return null!==o?null:d(e,t,n,r,null);Qi(e,n)}return null}function h(e,t,n,r,o){if("string"===typeof r&&""!==r||"number"===typeof r)return s(t,e=e.get(n)||null,""+r,o);if("object"===typeof r&&null!==r){switch(r.$$typeof){case w:return u(t,e=e.get(null===r.key?n:r.key)||null,r,o);case S:return c(t,e=e.get(null===r.key?n:r.key)||null,r,o);case _:return h(e,t,n,(0,r._init)(r._payload),o)}if(te(r)||A(r))return d(t,e=e.get(n)||null,r,o,null);Qi(t,r)}return null}function m(o,i,l,s){for(var u=null,c=null,d=i,m=i=0,v=null;null!==d&&m<l.length;m++){d.index>m?(v=d,d=null):v=d.sibling;var g=p(o,d,l[m],s);if(null===g){null===d&&(d=v);break}e&&d&&null===g.alternate&&t(o,d),i=a(g,i,m),null===c?u=g:c.sibling=g,c=g,d=v}if(m===l.length)return n(o,d),ii&&Jo(o,m),u;if(null===d){for(;m<l.length;m++)null!==(d=f(o,l[m],s))&&(i=a(d,i,m),null===c?u=d:c.sibling=d,c=d);return ii&&Jo(o,m),u}for(d=r(o,d);m<l.length;m++)null!==(v=h(d,o,m,l[m],s))&&(e&&null!==v.alternate&&d.delete(null===v.key?m:v.key),i=a(v,i,m),null===c?u=v:c.sibling=v,c=v);return e&&d.forEach((function(e){return t(o,e)})),ii&&Jo(o,m),u}function v(o,l,s,u){var c=A(s);if("function"!==typeof c)throw Error(i(150));if(null==(s=c.call(s)))throw Error(i(151));for(var d=c=null,m=l,v=l=0,g=null,y=s.next();null!==m&&!y.done;v++,y=s.next()){m.index>v?(g=m,m=null):g=m.sibling;var x=p(o,m,y.value,u);if(null===x){null===m&&(m=g);break}e&&m&&null===x.alternate&&t(o,m),l=a(x,l,v),null===d?c=x:d.sibling=x,d=x,m=g}if(y.done)return n(o,m),ii&&Jo(o,v),c;if(null===m){for(;!y.done;v++,y=s.next())null!==(y=f(o,y.value,u))&&(l=a(y,l,v),null===d?c=y:d.sibling=y,d=y);return ii&&Jo(o,v),c}for(m=r(o,m);!y.done;v++,y=s.next())null!==(y=h(m,o,v,y.value,u))&&(e&&null!==y.alternate&&m.delete(null===y.key?v:y.key),l=a(y,l,v),null===d?c=y:d.sibling=y,d=y);return e&&m.forEach((function(e){return t(o,e)})),ii&&Jo(o,v),c}return function e(r,i,a,s){if("object"===typeof a&&null!==a&&a.type===j&&null===a.key&&(a=a.props.children),"object"===typeof a&&null!==a){switch(a.$$typeof){case w:e:{for(var u=a.key,c=i;null!==c;){if(c.key===u){if((u=a.type)===j){if(7===c.tag){n(r,c.sibling),(i=o(c,a.props.children)).return=r,r=i;break e}}else if(c.elementType===u||"object"===typeof u&&null!==u&&u.$$typeof===_&&$i(u)===c.type){n(r,c.sibling),(i=o(c,a.props)).ref=Gi(r,c,a),i.return=r,r=i;break e}n(r,c);break}t(r,c),c=c.sibling}a.type===j?((i=Au(a.props.children,r.mode,s,a.key)).return=r,r=i):((s=Iu(a.type,a.key,a.props,null,r.mode,s)).ref=Gi(r,i,a),s.return=r,r=s)}return l(r);case S:e:{for(c=a.key;null!==i;){if(i.key===c){if(4===i.tag&&i.stateNode.containerInfo===a.containerInfo&&i.stateNode.implementation===a.implementation){n(r,i.sibling),(i=o(i,a.children||[])).return=r,r=i;break e}n(r,i);break}t(r,i),i=i.sibling}(i=zu(a,r.mode,s)).return=r,r=i}return l(r);case _:return e(r,i,(c=a._init)(a._payload),s)}if(te(a))return m(r,i,a,s);if(A(a))return v(r,i,a,s);Qi(r,a)}return"string"===typeof a&&""!==a||"number"===typeof a?(a=""+a,null!==i&&6===i.tag?(n(r,i.sibling),(i=o(i,a)).return=r,r=i):(n(r,i),(i=Lu(a,r.mode,s)).return=r,r=i),l(r)):n(r,i)}}var Xi=Ki(!0),Zi=Ki(!1),Ji={},ea=Co(Ji),ta=Co(Ji),na=Co(Ji);function ra(e){if(e===Ji)throw Error(i(174));return e}function oa(e,t){switch(To(na,t),To(ta,e),To(ea,Ji),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:se(null,"");break;default:t=se(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}Ro(ea),To(ea,t)}function ia(){Ro(ea),Ro(ta),Ro(na)}function aa(e){ra(na.current);var t=ra(ea.current),n=se(t,e.type);t!==n&&(To(ta,e),To(ea,n))}function la(e){ta.current===e&&(Ro(ea),Ro(ta))}var sa=Co(0);function ua(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||"$!"===n.data))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(0!==(128&t.flags))return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var ca=[];function da(){for(var e=0;e<ca.length;e++)ca[e]._workInProgressVersionPrimary=null;ca.length=0}var fa=b.ReactCurrentDispatcher,pa=b.ReactCurrentBatchConfig,ha=0,ma=null,va=null,ga=null,ya=!1,xa=!1,ba=0,wa=0;function Sa(){throw Error(i(321))}function ja(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!lr(e[n],t[n]))return!1;return!0}function ka(e,t,n,r,o,a){if(ha=a,ma=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,fa.current=null===e||null===e.memoizedState?ll:sl,e=n(r,o),xa){a=0;do{if(xa=!1,ba=0,25<=a)throw Error(i(301));a+=1,ga=va=null,t.updateQueue=null,fa.current=ul,e=n(r,o)}while(xa)}if(fa.current=al,t=null!==va&&null!==va.next,ha=0,ga=va=ma=null,ya=!1,t)throw Error(i(300));return e}function Ca(){var e=0!==ba;return ba=0,e}function Ra(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===ga?ma.memoizedState=ga=e:ga=ga.next=e,ga}function Ta(){if(null===va){var e=ma.alternate;e=null!==e?e.memoizedState:null}else e=va.next;var t=null===ga?ma.memoizedState:ga.next;if(null!==t)ga=t,va=e;else{if(null===e)throw Error(i(310));e={memoizedState:(va=e).memoizedState,baseState:va.baseState,baseQueue:va.baseQueue,queue:va.queue,next:null},null===ga?ma.memoizedState=ga=e:ga=ga.next=e}return ga}function Oa(e,t){return"function"===typeof t?t(e):t}function Pa(e){var t=Ta(),n=t.queue;if(null===n)throw Error(i(311));n.lastRenderedReducer=e;var r=va,o=r.baseQueue,a=n.pending;if(null!==a){if(null!==o){var l=o.next;o.next=a.next,a.next=l}r.baseQueue=o=a,n.pending=null}if(null!==o){a=o.next,r=r.baseState;var s=l=null,u=null,c=a;do{var d=c.lane;if((ha&d)===d)null!==u&&(u=u.next={lane:0,action:c.action,hasEagerState:c.hasEagerState,eagerState:c.eagerState,next:null}),r=c.hasEagerState?c.eagerState:e(r,c.action);else{var f={lane:d,action:c.action,hasEagerState:c.hasEagerState,eagerState:c.eagerState,next:null};null===u?(s=u=f,l=r):u=u.next=f,ma.lanes|=d,Ns|=d}c=c.next}while(null!==c&&c!==a);null===u?l=r:u.next=s,lr(r,t.memoizedState)||(bl=!0),t.memoizedState=r,t.baseState=l,t.baseQueue=u,n.lastRenderedState=r}if(null!==(e=n.interleaved)){o=e;do{a=o.lane,ma.lanes|=a,Ns|=a,o=o.next}while(o!==e)}else null===o&&(n.lanes=0);return[t.memoizedState,n.dispatch]}function Ea(e){var t=Ta(),n=t.queue;if(null===n)throw Error(i(311));n.lastRenderedReducer=e;var r=n.dispatch,o=n.pending,a=t.memoizedState;if(null!==o){n.pending=null;var l=o=o.next;do{a=e(a,l.action),l=l.next}while(l!==o);lr(a,t.memoizedState)||(bl=!0),t.memoizedState=a,null===t.baseQueue&&(t.baseState=a),n.lastRenderedState=a}return[a,r]}function Ma(){}function _a(e,t){var n=ma,r=Ta(),o=t(),a=!lr(r.memoizedState,o);if(a&&(r.memoizedState=o,bl=!0),r=r.queue,Ha(Aa.bind(null,n,r,e),[e]),r.getSnapshot!==t||a||null!==ga&&1&ga.memoizedState.tag){if(n.flags|=2048,Fa(9,Ia.bind(null,n,r,o,t),void 0,null),null===Ps)throw Error(i(349));0!==(30&ha)||Da(n,t,o)}return o}function Da(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},null===(t=ma.updateQueue)?(t={lastEffect:null,stores:null},ma.updateQueue=t,t.stores=[e]):null===(n=t.stores)?t.stores=[e]:n.push(e)}function Ia(e,t,n,r){t.value=n,t.getSnapshot=r,Na(t)&&La(e)}function Aa(e,t,n){return n((function(){Na(t)&&La(e)}))}function Na(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!lr(e,n)}catch(r){return!0}}function La(e){var t=Ei(e,1);null!==t&&nu(t,e,1,-1)}function za(e){var t=Ra();return"function"===typeof e&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:Oa,lastRenderedState:e},t.queue=e,e=e.dispatch=nl.bind(null,ma,e),[t.memoizedState,e]}function Fa(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},null===(t=ma.updateQueue)?(t={lastEffect:null,stores:null},ma.updateQueue=t,t.lastEffect=e.next=e):null===(n=t.lastEffect)?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e),e}function Wa(){return Ta().memoizedState}function Ba(e,t,n,r){var o=Ra();ma.flags|=e,o.memoizedState=Fa(1|t,n,void 0,void 0===r?null:r)}function Va(e,t,n,r){var o=Ta();r=void 0===r?null:r;var i=void 0;if(null!==va){var a=va.memoizedState;if(i=a.destroy,null!==r&&ja(r,a.deps))return void(o.memoizedState=Fa(t,n,i,r))}ma.flags|=e,o.memoizedState=Fa(1|t,n,i,r)}function qa(e,t){return Ba(8390656,8,e,t)}function Ha(e,t){return Va(2048,8,e,t)}function Ua(e,t){return Va(4,2,e,t)}function Ya(e,t){return Va(4,4,e,t)}function Ga(e,t){return"function"===typeof t?(e=e(),t(e),function(){t(null)}):null!==t&&void 0!==t?(e=e(),t.current=e,function(){t.current=null}):void 0}function Qa(e,t,n){return n=null!==n&&void 0!==n?n.concat([e]):null,Va(4,4,Ga.bind(null,t,e),n)}function $a(){}function Ka(e,t){var n=Ta();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&ja(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function Xa(e,t){var n=Ta();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&ja(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function Za(e,t,n){return 0===(21&ha)?(e.baseState&&(e.baseState=!1,bl=!0),e.memoizedState=n):(lr(n,t)||(n=mt(),ma.lanes|=n,Ns|=n,e.baseState=!0),t)}function Ja(e,t){var n=xt;xt=0!==n&&4>n?n:4,e(!0);var r=pa.transition;pa.transition={};try{e(!1),t()}finally{xt=n,pa.transition=r}}function el(){return Ta().memoizedState}function tl(e,t,n){var r=tu(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},rl(e))ol(t,n);else if(null!==(n=Pi(e,t,n,r))){nu(n,e,r,eu()),il(n,t,r)}}function nl(e,t,n){var r=tu(e),o={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(rl(e))ol(t,o);else{var i=e.alternate;if(0===e.lanes&&(null===i||0===i.lanes)&&null!==(i=t.lastRenderedReducer))try{var a=t.lastRenderedState,l=i(a,n);if(o.hasEagerState=!0,o.eagerState=l,lr(l,a)){var s=t.interleaved;return null===s?(o.next=o,Oi(t)):(o.next=s.next,s.next=o),void(t.interleaved=o)}}catch(u){}null!==(n=Pi(e,t,o,r))&&(nu(n,e,r,o=eu()),il(n,t,r))}}function rl(e){var t=e.alternate;return e===ma||null!==t&&t===ma}function ol(e,t){xa=ya=!0;var n=e.pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function il(e,t,n){if(0!==(4194240&n)){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,yt(e,n)}}var al={readContext:Ri,useCallback:Sa,useContext:Sa,useEffect:Sa,useImperativeHandle:Sa,useInsertionEffect:Sa,useLayoutEffect:Sa,useMemo:Sa,useReducer:Sa,useRef:Sa,useState:Sa,useDebugValue:Sa,useDeferredValue:Sa,useTransition:Sa,useMutableSource:Sa,useSyncExternalStore:Sa,useId:Sa,unstable_isNewReconciler:!1},ll={readContext:Ri,useCallback:function(e,t){return Ra().memoizedState=[e,void 0===t?null:t],e},useContext:Ri,useEffect:qa,useImperativeHandle:function(e,t,n){return n=null!==n&&void 0!==n?n.concat([e]):null,Ba(4194308,4,Ga.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Ba(4194308,4,e,t)},useInsertionEffect:function(e,t){return Ba(4,2,e,t)},useMemo:function(e,t){var n=Ra();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Ra();return t=void 0!==n?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=tl.bind(null,ma,e),[r.memoizedState,e]},useRef:function(e){return e={current:e},Ra().memoizedState=e},useState:za,useDebugValue:$a,useDeferredValue:function(e){return Ra().memoizedState=e},useTransition:function(){var e=za(!1),t=e[0];return e=Ja.bind(null,e[1]),Ra().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=ma,o=Ra();if(ii){if(void 0===n)throw Error(i(407));n=n()}else{if(n=t(),null===Ps)throw Error(i(349));0!==(30&ha)||Da(r,t,n)}o.memoizedState=n;var a={value:n,getSnapshot:t};return o.queue=a,qa(Aa.bind(null,r,a,e),[e]),r.flags|=2048,Fa(9,Ia.bind(null,r,a,n,t),void 0,null),n},useId:function(){var e=Ra(),t=Ps.identifierPrefix;if(ii){var n=Zo;t=":"+t+"R"+(n=(Xo&~(1<<32-at(Xo)-1)).toString(32)+n),0<(n=ba++)&&(t+="H"+n.toString(32)),t+=":"}else t=":"+t+"r"+(n=wa++).toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},sl={readContext:Ri,useCallback:Ka,useContext:Ri,useEffect:Ha,useImperativeHandle:Qa,useInsertionEffect:Ua,useLayoutEffect:Ya,useMemo:Xa,useReducer:Pa,useRef:Wa,useState:function(){return Pa(Oa)},useDebugValue:$a,useDeferredValue:function(e){return Za(Ta(),va.memoizedState,e)},useTransition:function(){return[Pa(Oa)[0],Ta().memoizedState]},useMutableSource:Ma,useSyncExternalStore:_a,useId:el,unstable_isNewReconciler:!1},ul={readContext:Ri,useCallback:Ka,useContext:Ri,useEffect:Ha,useImperativeHandle:Qa,useInsertionEffect:Ua,useLayoutEffect:Ya,useMemo:Xa,useReducer:Ea,useRef:Wa,useState:function(){return Ea(Oa)},useDebugValue:$a,useDeferredValue:function(e){var t=Ta();return null===va?t.memoizedState=e:Za(t,va.memoizedState,e)},useTransition:function(){return[Ea(Oa)[0],Ta().memoizedState]},useMutableSource:Ma,useSyncExternalStore:_a,useId:el,unstable_isNewReconciler:!1};function cl(e,t){try{var n="",r=t;do{n+=B(r),r=r.return}while(r);var o=n}catch(i){o="\nError generating stack: "+i.message+"\n"+i.stack}return{value:e,source:t,stack:o,digest:null}}function dl(e,t,n){return{value:e,source:null,stack:null!=n?n:null,digest:null!=t?t:null}}function fl(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}var pl="function"===typeof WeakMap?WeakMap:Map;function hl(e,t,n){(n=Ii(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Hs||(Hs=!0,Us=r),fl(0,t)},n}function ml(e,t,n){(n=Ii(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if("function"===typeof r){var o=t.value;n.payload=function(){return r(o)},n.callback=function(){fl(0,t)}}var i=e.stateNode;return null!==i&&"function"===typeof i.componentDidCatch&&(n.callback=function(){fl(0,t),"function"!==typeof r&&(null===Ys?Ys=new Set([this]):Ys.add(this));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}function vl(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new pl;var o=new Set;r.set(t,o)}else void 0===(o=r.get(t))&&(o=new Set,r.set(t,o));o.has(n)||(o.add(n),e=Cu.bind(null,e,t,n),t.then(e,e))}function gl(e){do{var t;if((t=13===e.tag)&&(t=null===(t=e.memoizedState)||null!==t.dehydrated),t)return e;e=e.return}while(null!==e);return null}function yl(e,t,n,r,o){return 0===(1&e.mode)?(e===t?e.flags|=65536:(e.flags|=128,n.flags|=131072,n.flags&=-52805,1===n.tag&&(null===n.alternate?n.tag=17:((t=Ii(-1,1)).tag=2,Ai(n,t,1))),n.lanes|=1),e):(e.flags|=65536,e.lanes=o,e)}var xl=b.ReactCurrentOwner,bl=!1;function wl(e,t,n,r){t.child=null===e?Zi(t,null,n,r):Xi(t,e.child,n,r)}function Sl(e,t,n,r,o){n=n.render;var i=t.ref;return Ci(t,o),r=ka(e,t,n,r,i,o),n=Ca(),null===e||bl?(ii&&n&&ti(t),t.flags|=1,wl(e,t,r,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Hl(e,t,o))}function jl(e,t,n,r,o){if(null===e){var i=n.type;return"function"!==typeof i||_u(i)||void 0!==i.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=Iu(n.type,null,r,t,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=i,kl(e,t,i,r,o))}if(i=e.child,0===(e.lanes&o)){var a=i.memoizedProps;if((n=null!==(n=n.compare)?n:sr)(a,r)&&e.ref===t.ref)return Hl(e,t,o)}return t.flags|=1,(e=Du(i,r)).ref=t.ref,e.return=t,t.child=e}function kl(e,t,n,r,o){if(null!==e){var i=e.memoizedProps;if(sr(i,r)&&e.ref===t.ref){if(bl=!1,t.pendingProps=r=i,0===(e.lanes&o))return t.lanes=e.lanes,Hl(e,t,o);0!==(131072&e.flags)&&(bl=!0)}}return Tl(e,t,n,r,o)}function Cl(e,t,n){var r=t.pendingProps,o=r.children,i=null!==e?e.memoizedState:null;if("hidden"===r.mode)if(0===(1&t.mode))t.memoizedState={baseLanes:0,cachePool:null,transitions:null},To(Ds,_s),_s|=n;else{if(0===(1073741824&n))return e=null!==i?i.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,To(Ds,_s),_s|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=null!==i?i.baseLanes:n,To(Ds,_s),_s|=r}else null!==i?(r=i.baseLanes|n,t.memoizedState=null):r=n,To(Ds,_s),_s|=r;return wl(e,t,o,n),t.child}function Rl(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function Tl(e,t,n,r,o){var i=Do(n)?Mo:Po.current;return i=_o(t,i),Ci(t,o),n=ka(e,t,n,r,i,o),r=Ca(),null===e||bl?(ii&&r&&ti(t),t.flags|=1,wl(e,t,n,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Hl(e,t,o))}function Ol(e,t,n,r,o){if(Do(n)){var i=!0;Lo(t)}else i=!1;if(Ci(t,o),null===t.stateNode)ql(e,t),Hi(t,n,r),Yi(t,n,r,o),r=!0;else if(null===e){var a=t.stateNode,l=t.memoizedProps;a.props=l;var s=a.context,u=n.contextType;"object"===typeof u&&null!==u?u=Ri(u):u=_o(t,u=Do(n)?Mo:Po.current);var c=n.getDerivedStateFromProps,d="function"===typeof c||"function"===typeof a.getSnapshotBeforeUpdate;d||"function"!==typeof a.UNSAFE_componentWillReceiveProps&&"function"!==typeof a.componentWillReceiveProps||(l!==r||s!==u)&&Ui(t,a,r,u),Mi=!1;var f=t.memoizedState;a.state=f,zi(t,r,a,o),s=t.memoizedState,l!==r||f!==s||Eo.current||Mi?("function"===typeof c&&(Bi(t,n,c,r),s=t.memoizedState),(l=Mi||qi(t,n,l,r,f,s,u))?(d||"function"!==typeof a.UNSAFE_componentWillMount&&"function"!==typeof a.componentWillMount||("function"===typeof a.componentWillMount&&a.componentWillMount(),"function"===typeof a.UNSAFE_componentWillMount&&a.UNSAFE_componentWillMount()),"function"===typeof a.componentDidMount&&(t.flags|=4194308)):("function"===typeof a.componentDidMount&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=s),a.props=r,a.state=s,a.context=u,r=l):("function"===typeof a.componentDidMount&&(t.flags|=4194308),r=!1)}else{a=t.stateNode,Di(e,t),l=t.memoizedProps,u=t.type===t.elementType?l:gi(t.type,l),a.props=u,d=t.pendingProps,f=a.context,"object"===typeof(s=n.contextType)&&null!==s?s=Ri(s):s=_o(t,s=Do(n)?Mo:Po.current);var p=n.getDerivedStateFromProps;(c="function"===typeof p||"function"===typeof a.getSnapshotBeforeUpdate)||"function"!==typeof a.UNSAFE_componentWillReceiveProps&&"function"!==typeof a.componentWillReceiveProps||(l!==d||f!==s)&&Ui(t,a,r,s),Mi=!1,f=t.memoizedState,a.state=f,zi(t,r,a,o);var h=t.memoizedState;l!==d||f!==h||Eo.current||Mi?("function"===typeof p&&(Bi(t,n,p,r),h=t.memoizedState),(u=Mi||qi(t,n,u,r,f,h,s)||!1)?(c||"function"!==typeof a.UNSAFE_componentWillUpdate&&"function"!==typeof a.componentWillUpdate||("function"===typeof a.componentWillUpdate&&a.componentWillUpdate(r,h,s),"function"===typeof a.UNSAFE_componentWillUpdate&&a.UNSAFE_componentWillUpdate(r,h,s)),"function"===typeof a.componentDidUpdate&&(t.flags|=4),"function"===typeof a.getSnapshotBeforeUpdate&&(t.flags|=1024)):("function"!==typeof a.componentDidUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!==typeof a.getSnapshotBeforeUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=h),a.props=r,a.state=h,a.context=s,r=u):("function"!==typeof a.componentDidUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!==typeof a.getSnapshotBeforeUpdate||l===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),r=!1)}return Pl(e,t,n,r,i,o)}function Pl(e,t,n,r,o,i){Rl(e,t);var a=0!==(128&t.flags);if(!r&&!a)return o&&zo(t,n,!1),Hl(e,t,i);r=t.stateNode,xl.current=t;var l=a&&"function"!==typeof n.getDerivedStateFromError?null:r.render();return t.flags|=1,null!==e&&a?(t.child=Xi(t,e.child,null,i),t.child=Xi(t,null,l,i)):wl(e,t,l,i),t.memoizedState=r.state,o&&zo(t,n,!0),t.child}function El(e){var t=e.stateNode;t.pendingContext?Ao(0,t.pendingContext,t.pendingContext!==t.context):t.context&&Ao(0,t.context,!1),oa(e,t.containerInfo)}function Ml(e,t,n,r,o){return hi(),mi(o),t.flags|=256,wl(e,t,n,r),t.child}var _l,Dl,Il,Al={dehydrated:null,treeContext:null,retryLane:0};function Nl(e){return{baseLanes:e,cachePool:null,transitions:null}}function Ll(e,t,n){var r,o=t.pendingProps,a=sa.current,l=!1,s=0!==(128&t.flags);if((r=s)||(r=(null===e||null!==e.memoizedState)&&0!==(2&a)),r?(l=!0,t.flags&=-129):null!==e&&null===e.memoizedState||(a|=1),To(sa,1&a),null===e)return ci(t),null!==(e=t.memoizedState)&&null!==(e=e.dehydrated)?(0===(1&t.mode)?t.lanes=1:"$!"===e.data?t.lanes=8:t.lanes=1073741824,null):(s=o.children,e=o.fallback,l?(o=t.mode,l=t.child,s={mode:"hidden",children:s},0===(1&o)&&null!==l?(l.childLanes=0,l.pendingProps=s):l=Nu(s,o,0,null),e=Au(e,o,n,null),l.return=t,e.return=t,l.sibling=e,t.child=l,t.child.memoizedState=Nl(n),t.memoizedState=Al,e):zl(t,s));if(null!==(a=e.memoizedState)&&null!==(r=a.dehydrated))return function(e,t,n,r,o,a,l){if(n)return 256&t.flags?(t.flags&=-257,Fl(e,t,l,r=dl(Error(i(422))))):null!==t.memoizedState?(t.child=e.child,t.flags|=128,null):(a=r.fallback,o=t.mode,r=Nu({mode:"visible",children:r.children},o,0,null),(a=Au(a,o,l,null)).flags|=2,r.return=t,a.return=t,r.sibling=a,t.child=r,0!==(1&t.mode)&&Xi(t,e.child,null,l),t.child.memoizedState=Nl(l),t.memoizedState=Al,a);if(0===(1&t.mode))return Fl(e,t,l,null);if("$!"===o.data){if(r=o.nextSibling&&o.nextSibling.dataset)var s=r.dgst;return r=s,Fl(e,t,l,r=dl(a=Error(i(419)),r,void 0))}if(s=0!==(l&e.childLanes),bl||s){if(null!==(r=Ps)){switch(l&-l){case 4:o=2;break;case 16:o=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:o=32;break;case 536870912:o=268435456;break;default:o=0}0!==(o=0!==(o&(r.suspendedLanes|l))?0:o)&&o!==a.retryLane&&(a.retryLane=o,Ei(e,o),nu(r,e,o,-1))}return mu(),Fl(e,t,l,r=dl(Error(i(421))))}return"$?"===o.data?(t.flags|=128,t.child=e.child,t=Tu.bind(null,e),o._reactRetry=t,null):(e=a.treeContext,oi=uo(o.nextSibling),ri=t,ii=!0,ai=null,null!==e&&(Qo[$o++]=Xo,Qo[$o++]=Zo,Qo[$o++]=Ko,Xo=e.id,Zo=e.overflow,Ko=t),(t=zl(t,r.children)).flags|=4096,t)}(e,t,s,o,r,a,n);if(l){l=o.fallback,s=t.mode,r=(a=e.child).sibling;var u={mode:"hidden",children:o.children};return 0===(1&s)&&t.child!==a?((o=t.child).childLanes=0,o.pendingProps=u,t.deletions=null):(o=Du(a,u)).subtreeFlags=14680064&a.subtreeFlags,null!==r?l=Du(r,l):(l=Au(l,s,n,null)).flags|=2,l.return=t,o.return=t,o.sibling=l,t.child=o,o=l,l=t.child,s=null===(s=e.child.memoizedState)?Nl(n):{baseLanes:s.baseLanes|n,cachePool:null,transitions:s.transitions},l.memoizedState=s,l.childLanes=e.childLanes&~n,t.memoizedState=Al,o}return e=(l=e.child).sibling,o=Du(l,{mode:"visible",children:o.children}),0===(1&t.mode)&&(o.lanes=n),o.return=t,o.sibling=null,null!==e&&(null===(n=t.deletions)?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=o,t.memoizedState=null,o}function zl(e,t){return(t=Nu({mode:"visible",children:t},e.mode,0,null)).return=e,e.child=t}function Fl(e,t,n,r){return null!==r&&mi(r),Xi(t,e.child,null,n),(e=zl(t,t.pendingProps.children)).flags|=2,t.memoizedState=null,e}function Wl(e,t,n){e.lanes|=t;var r=e.alternate;null!==r&&(r.lanes|=t),ki(e.return,t,n)}function Bl(e,t,n,r,o){var i=e.memoizedState;null===i?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:o}:(i.isBackwards=t,i.rendering=null,i.renderingStartTime=0,i.last=r,i.tail=n,i.tailMode=o)}function Vl(e,t,n){var r=t.pendingProps,o=r.revealOrder,i=r.tail;if(wl(e,t,r.children,n),0!==(2&(r=sa.current)))r=1&r|2,t.flags|=128;else{if(null!==e&&0!==(128&e.flags))e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&Wl(e,n,t);else if(19===e.tag)Wl(e,n,t);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(To(sa,r),0===(1&t.mode))t.memoizedState=null;else switch(o){case"forwards":for(n=t.child,o=null;null!==n;)null!==(e=n.alternate)&&null===ua(e)&&(o=n),n=n.sibling;null===(n=o)?(o=t.child,t.child=null):(o=n.sibling,n.sibling=null),Bl(t,!1,o,n,i);break;case"backwards":for(n=null,o=t.child,t.child=null;null!==o;){if(null!==(e=o.alternate)&&null===ua(e)){t.child=o;break}e=o.sibling,o.sibling=n,n=o,o=e}Bl(t,!0,n,null,i);break;case"together":Bl(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function ql(e,t){0===(1&t.mode)&&null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Hl(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Ns|=t.lanes,0===(n&t.childLanes))return null;if(null!==e&&t.child!==e.child)throw Error(i(153));if(null!==t.child){for(n=Du(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Du(e,e.pendingProps)).return=t;n.sibling=null}return t.child}function Ul(e,t){if(!ii)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;null!==n;)null!==n.alternate&&(r=n),n=n.sibling;null===r?t||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function Yl(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0,r=0;if(t)for(var o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=14680064&o.subtreeFlags,r|=14680064&o.flags,o.return=e,o=o.sibling;else for(o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=o.subtreeFlags,r|=o.flags,o.return=e,o=o.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function Gl(e,t,n){var r=t.pendingProps;switch(ni(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Yl(t),null;case 1:case 17:return Do(t.type)&&Io(),Yl(t),null;case 3:return r=t.stateNode,ia(),Ro(Eo),Ro(Po),da(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(fi(t)?t.flags|=4:null===e||e.memoizedState.isDehydrated&&0===(256&t.flags)||(t.flags|=1024,null!==ai&&(au(ai),ai=null))),Yl(t),null;case 5:la(t);var o=ra(na.current);if(n=t.type,null!==e&&null!=t.stateNode)Dl(e,t,n,r),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!r){if(null===t.stateNode)throw Error(i(166));return Yl(t),null}if(e=ra(ea.current),fi(t)){r=t.stateNode,n=t.type;var a=t.memoizedProps;switch(r[po]=t,r[ho]=a,e=0!==(1&t.mode),n){case"dialog":Fr("cancel",r),Fr("close",r);break;case"iframe":case"object":case"embed":Fr("load",r);break;case"video":case"audio":for(o=0;o<Ar.length;o++)Fr(Ar[o],r);break;case"source":Fr("error",r);break;case"img":case"image":case"link":Fr("error",r),Fr("load",r);break;case"details":Fr("toggle",r);break;case"input":K(r,a),Fr("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!a.multiple},Fr("invalid",r);break;case"textarea":oe(r,a),Fr("invalid",r)}for(var s in ye(n,a),o=null,a)if(a.hasOwnProperty(s)){var u=a[s];"children"===s?"string"===typeof u?r.textContent!==u&&(!0!==a.suppressHydrationWarning&&Zr(r.textContent,u,e),o=["children",u]):"number"===typeof u&&r.textContent!==""+u&&(!0!==a.suppressHydrationWarning&&Zr(r.textContent,u,e),o=["children",""+u]):l.hasOwnProperty(s)&&null!=u&&"onScroll"===s&&Fr("scroll",r)}switch(n){case"input":Y(r),J(r,a,!0);break;case"textarea":Y(r),ae(r);break;case"select":case"option":break;default:"function"===typeof a.onClick&&(r.onclick=Jr)}r=o,t.updateQueue=r,null!==r&&(t.flags|=4)}else{s=9===o.nodeType?o:o.ownerDocument,"http://www.w3.org/1999/xhtml"===e&&(e=le(n)),"http://www.w3.org/1999/xhtml"===e?"script"===n?((e=s.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"===typeof r.is?e=s.createElement(n,{is:r.is}):(e=s.createElement(n),"select"===n&&(s=e,r.multiple?s.multiple=!0:r.size&&(s.size=r.size))):e=s.createElementNS(e,n),e[po]=t,e[ho]=r,_l(e,t),t.stateNode=e;e:{switch(s=xe(n,r),n){case"dialog":Fr("cancel",e),Fr("close",e),o=r;break;case"iframe":case"object":case"embed":Fr("load",e),o=r;break;case"video":case"audio":for(o=0;o<Ar.length;o++)Fr(Ar[o],e);o=r;break;case"source":Fr("error",e),o=r;break;case"img":case"image":case"link":Fr("error",e),Fr("load",e),o=r;break;case"details":Fr("toggle",e),o=r;break;case"input":K(e,r),o=$(e,r),Fr("invalid",e);break;case"option":default:o=r;break;case"select":e._wrapperState={wasMultiple:!!r.multiple},o=L({},r,{value:void 0}),Fr("invalid",e);break;case"textarea":oe(e,r),o=re(e,r),Fr("invalid",e)}for(a in ye(n,o),u=o)if(u.hasOwnProperty(a)){var c=u[a];"style"===a?ve(e,c):"dangerouslySetInnerHTML"===a?null!=(c=c?c.__html:void 0)&&de(e,c):"children"===a?"string"===typeof c?("textarea"!==n||""!==c)&&fe(e,c):"number"===typeof c&&fe(e,""+c):"suppressContentEditableWarning"!==a&&"suppressHydrationWarning"!==a&&"autoFocus"!==a&&(l.hasOwnProperty(a)?null!=c&&"onScroll"===a&&Fr("scroll",e):null!=c&&x(e,a,c,s))}switch(n){case"input":Y(e),J(e,r,!1);break;case"textarea":Y(e),ae(e);break;case"option":null!=r.value&&e.setAttribute("value",""+H(r.value));break;case"select":e.multiple=!!r.multiple,null!=(a=r.value)?ne(e,!!r.multiple,a,!1):null!=r.defaultValue&&ne(e,!!r.multiple,r.defaultValue,!0);break;default:"function"===typeof o.onClick&&(e.onclick=Jr)}switch(n){case"button":case"input":case"select":case"textarea":r=!!r.autoFocus;break e;case"img":r=!0;break e;default:r=!1}}r&&(t.flags|=4)}null!==t.ref&&(t.flags|=512,t.flags|=2097152)}return Yl(t),null;case 6:if(e&&null!=t.stateNode)Il(0,t,e.memoizedProps,r);else{if("string"!==typeof r&&null===t.stateNode)throw Error(i(166));if(n=ra(na.current),ra(ea.current),fi(t)){if(r=t.stateNode,n=t.memoizedProps,r[po]=t,(a=r.nodeValue!==n)&&null!==(e=ri))switch(e.tag){case 3:Zr(r.nodeValue,n,0!==(1&e.mode));break;case 5:!0!==e.memoizedProps.suppressHydrationWarning&&Zr(r.nodeValue,n,0!==(1&e.mode))}a&&(t.flags|=4)}else(r=(9===n.nodeType?n:n.ownerDocument).createTextNode(r))[po]=t,t.stateNode=r}return Yl(t),null;case 13:if(Ro(sa),r=t.memoizedState,null===e||null!==e.memoizedState&&null!==e.memoizedState.dehydrated){if(ii&&null!==oi&&0!==(1&t.mode)&&0===(128&t.flags))pi(),hi(),t.flags|=98560,a=!1;else if(a=fi(t),null!==r&&null!==r.dehydrated){if(null===e){if(!a)throw Error(i(318));if(!(a=null!==(a=t.memoizedState)?a.dehydrated:null))throw Error(i(317));a[po]=t}else hi(),0===(128&t.flags)&&(t.memoizedState=null),t.flags|=4;Yl(t),a=!1}else null!==ai&&(au(ai),ai=null),a=!0;if(!a)return 65536&t.flags?t:null}return 0!==(128&t.flags)?(t.lanes=n,t):((r=null!==r)!==(null!==e&&null!==e.memoizedState)&&r&&(t.child.flags|=8192,0!==(1&t.mode)&&(null===e||0!==(1&sa.current)?0===Is&&(Is=3):mu())),null!==t.updateQueue&&(t.flags|=4),Yl(t),null);case 4:return ia(),null===e&&Vr(t.stateNode.containerInfo),Yl(t),null;case 10:return ji(t.type._context),Yl(t),null;case 19:if(Ro(sa),null===(a=t.memoizedState))return Yl(t),null;if(r=0!==(128&t.flags),null===(s=a.rendering))if(r)Ul(a,!1);else{if(0!==Is||null!==e&&0!==(128&e.flags))for(e=t.child;null!==e;){if(null!==(s=ua(e))){for(t.flags|=128,Ul(a,!1),null!==(r=s.updateQueue)&&(t.updateQueue=r,t.flags|=4),t.subtreeFlags=0,r=n,n=t.child;null!==n;)e=r,(a=n).flags&=14680066,null===(s=a.alternate)?(a.childLanes=0,a.lanes=e,a.child=null,a.subtreeFlags=0,a.memoizedProps=null,a.memoizedState=null,a.updateQueue=null,a.dependencies=null,a.stateNode=null):(a.childLanes=s.childLanes,a.lanes=s.lanes,a.child=s.child,a.subtreeFlags=0,a.deletions=null,a.memoizedProps=s.memoizedProps,a.memoizedState=s.memoizedState,a.updateQueue=s.updateQueue,a.type=s.type,e=s.dependencies,a.dependencies=null===e?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return To(sa,1&sa.current|2),t.child}e=e.sibling}null!==a.tail&&Xe()>Vs&&(t.flags|=128,r=!0,Ul(a,!1),t.lanes=4194304)}else{if(!r)if(null!==(e=ua(s))){if(t.flags|=128,r=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),Ul(a,!0),null===a.tail&&"hidden"===a.tailMode&&!s.alternate&&!ii)return Yl(t),null}else 2*Xe()-a.renderingStartTime>Vs&&1073741824!==n&&(t.flags|=128,r=!0,Ul(a,!1),t.lanes=4194304);a.isBackwards?(s.sibling=t.child,t.child=s):(null!==(n=a.last)?n.sibling=s:t.child=s,a.last=s)}return null!==a.tail?(t=a.tail,a.rendering=t,a.tail=t.sibling,a.renderingStartTime=Xe(),t.sibling=null,n=sa.current,To(sa,r?1&n|2:1&n),t):(Yl(t),null);case 22:case 23:return du(),r=null!==t.memoizedState,null!==e&&null!==e.memoizedState!==r&&(t.flags|=8192),r&&0!==(1&t.mode)?0!==(1073741824&_s)&&(Yl(t),6&t.subtreeFlags&&(t.flags|=8192)):Yl(t),null;case 24:case 25:return null}throw Error(i(156,t.tag))}function Ql(e,t){switch(ni(t),t.tag){case 1:return Do(t.type)&&Io(),65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 3:return ia(),Ro(Eo),Ro(Po),da(),0!==(65536&(e=t.flags))&&0===(128&e)?(t.flags=-65537&e|128,t):null;case 5:return la(t),null;case 13:if(Ro(sa),null!==(e=t.memoizedState)&&null!==e.dehydrated){if(null===t.alternate)throw Error(i(340));hi()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 19:return Ro(sa),null;case 4:return ia(),null;case 10:return ji(t.type._context),null;case 22:case 23:return du(),null;default:return null}}_l=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Dl=function(e,t,n,r){var o=e.memoizedProps;if(o!==r){e=t.stateNode,ra(ea.current);var i,a=null;switch(n){case"input":o=$(e,o),r=$(e,r),a=[];break;case"select":o=L({},o,{value:void 0}),r=L({},r,{value:void 0}),a=[];break;case"textarea":o=re(e,o),r=re(e,r),a=[];break;default:"function"!==typeof o.onClick&&"function"===typeof r.onClick&&(e.onclick=Jr)}for(c in ye(n,r),n=null,o)if(!r.hasOwnProperty(c)&&o.hasOwnProperty(c)&&null!=o[c])if("style"===c){var s=o[c];for(i in s)s.hasOwnProperty(i)&&(n||(n={}),n[i]="")}else"dangerouslySetInnerHTML"!==c&&"children"!==c&&"suppressContentEditableWarning"!==c&&"suppressHydrationWarning"!==c&&"autoFocus"!==c&&(l.hasOwnProperty(c)?a||(a=[]):(a=a||[]).push(c,null));for(c in r){var u=r[c];if(s=null!=o?o[c]:void 0,r.hasOwnProperty(c)&&u!==s&&(null!=u||null!=s))if("style"===c)if(s){for(i in s)!s.hasOwnProperty(i)||u&&u.hasOwnProperty(i)||(n||(n={}),n[i]="");for(i in u)u.hasOwnProperty(i)&&s[i]!==u[i]&&(n||(n={}),n[i]=u[i])}else n||(a||(a=[]),a.push(c,n)),n=u;else"dangerouslySetInnerHTML"===c?(u=u?u.__html:void 0,s=s?s.__html:void 0,null!=u&&s!==u&&(a=a||[]).push(c,u)):"children"===c?"string"!==typeof u&&"number"!==typeof u||(a=a||[]).push(c,""+u):"suppressContentEditableWarning"!==c&&"suppressHydrationWarning"!==c&&(l.hasOwnProperty(c)?(null!=u&&"onScroll"===c&&Fr("scroll",e),a||s===u||(a=[])):(a=a||[]).push(c,u))}n&&(a=a||[]).push("style",n);var c=a;(t.updateQueue=c)&&(t.flags|=4)}},Il=function(e,t,n,r){n!==r&&(t.flags|=4)};var $l=!1,Kl=!1,Xl="function"===typeof WeakSet?WeakSet:Set,Zl=null;function Jl(e,t){var n=e.ref;if(null!==n)if("function"===typeof n)try{n(null)}catch(r){ku(e,t,r)}else n.current=null}function es(e,t,n){try{n()}catch(r){ku(e,t,r)}}var ts=!1;function ns(e,t,n){var r=t.updateQueue;if(null!==(r=null!==r?r.lastEffect:null)){var o=r=r.next;do{if((o.tag&e)===e){var i=o.destroy;o.destroy=void 0,void 0!==i&&es(t,n,i)}o=o.next}while(o!==r)}}function rs(e,t){if(null!==(t=null!==(t=t.updateQueue)?t.lastEffect:null)){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function os(e){var t=e.ref;if(null!==t){var n=e.stateNode;e.tag,e=n,"function"===typeof t?t(e):t.current=e}}function is(e){var t=e.alternate;null!==t&&(e.alternate=null,is(t)),e.child=null,e.deletions=null,e.sibling=null,5===e.tag&&(null!==(t=e.stateNode)&&(delete t[po],delete t[ho],delete t[vo],delete t[go],delete t[yo])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function as(e){return 5===e.tag||3===e.tag||4===e.tag}function ls(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||as(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;5!==e.tag&&6!==e.tag&&18!==e.tag;){if(2&e.flags)continue e;if(null===e.child||4===e.tag)continue e;e.child.return=e,e=e.child}if(!(2&e.flags))return e.stateNode}}function ss(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?8===n.nodeType?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(8===n.nodeType?(t=n.parentNode).insertBefore(e,n):(t=n).appendChild(e),null!==(n=n._reactRootContainer)&&void 0!==n||null!==t.onclick||(t.onclick=Jr));else if(4!==r&&null!==(e=e.child))for(ss(e,t,n),e=e.sibling;null!==e;)ss(e,t,n),e=e.sibling}function us(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&null!==(e=e.child))for(us(e,t,n),e=e.sibling;null!==e;)us(e,t,n),e=e.sibling}var cs=null,ds=!1;function fs(e,t,n){for(n=n.child;null!==n;)ps(e,t,n),n=n.sibling}function ps(e,t,n){if(it&&"function"===typeof it.onCommitFiberUnmount)try{it.onCommitFiberUnmount(ot,n)}catch(l){}switch(n.tag){case 5:Kl||Jl(n,t);case 6:var r=cs,o=ds;cs=null,fs(e,t,n),ds=o,null!==(cs=r)&&(ds?(e=cs,n=n.stateNode,8===e.nodeType?e.parentNode.removeChild(n):e.removeChild(n)):cs.removeChild(n.stateNode));break;case 18:null!==cs&&(ds?(e=cs,n=n.stateNode,8===e.nodeType?so(e.parentNode,n):1===e.nodeType&&so(e,n),Vt(e)):so(cs,n.stateNode));break;case 4:r=cs,o=ds,cs=n.stateNode.containerInfo,ds=!0,fs(e,t,n),cs=r,ds=o;break;case 0:case 11:case 14:case 15:if(!Kl&&(null!==(r=n.updateQueue)&&null!==(r=r.lastEffect))){o=r=r.next;do{var i=o,a=i.destroy;i=i.tag,void 0!==a&&(0!==(2&i)||0!==(4&i))&&es(n,t,a),o=o.next}while(o!==r)}fs(e,t,n);break;case 1:if(!Kl&&(Jl(n,t),"function"===typeof(r=n.stateNode).componentWillUnmount))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(l){ku(n,t,l)}fs(e,t,n);break;case 21:fs(e,t,n);break;case 22:1&n.mode?(Kl=(r=Kl)||null!==n.memoizedState,fs(e,t,n),Kl=r):fs(e,t,n);break;default:fs(e,t,n)}}function hs(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new Xl),t.forEach((function(t){var r=Ou.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}function ms(e,t){var n=t.deletions;if(null!==n)for(var r=0;r<n.length;r++){var o=n[r];try{var a=e,l=t,s=l;e:for(;null!==s;){switch(s.tag){case 5:cs=s.stateNode,ds=!1;break e;case 3:case 4:cs=s.stateNode.containerInfo,ds=!0;break e}s=s.return}if(null===cs)throw Error(i(160));ps(a,l,o),cs=null,ds=!1;var u=o.alternate;null!==u&&(u.return=null),o.return=null}catch(c){ku(o,t,c)}}if(12854&t.subtreeFlags)for(t=t.child;null!==t;)vs(t,e),t=t.sibling}function vs(e,t){var n=e.alternate,r=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(ms(t,e),gs(e),4&r){try{ns(3,e,e.return),rs(3,e)}catch(v){ku(e,e.return,v)}try{ns(5,e,e.return)}catch(v){ku(e,e.return,v)}}break;case 1:ms(t,e),gs(e),512&r&&null!==n&&Jl(n,n.return);break;case 5:if(ms(t,e),gs(e),512&r&&null!==n&&Jl(n,n.return),32&e.flags){var o=e.stateNode;try{fe(o,"")}catch(v){ku(e,e.return,v)}}if(4&r&&null!=(o=e.stateNode)){var a=e.memoizedProps,l=null!==n?n.memoizedProps:a,s=e.type,u=e.updateQueue;if(e.updateQueue=null,null!==u)try{"input"===s&&"radio"===a.type&&null!=a.name&&X(o,a),xe(s,l);var c=xe(s,a);for(l=0;l<u.length;l+=2){var d=u[l],f=u[l+1];"style"===d?ve(o,f):"dangerouslySetInnerHTML"===d?de(o,f):"children"===d?fe(o,f):x(o,d,f,c)}switch(s){case"input":Z(o,a);break;case"textarea":ie(o,a);break;case"select":var p=o._wrapperState.wasMultiple;o._wrapperState.wasMultiple=!!a.multiple;var h=a.value;null!=h?ne(o,!!a.multiple,h,!1):p!==!!a.multiple&&(null!=a.defaultValue?ne(o,!!a.multiple,a.defaultValue,!0):ne(o,!!a.multiple,a.multiple?[]:"",!1))}o[ho]=a}catch(v){ku(e,e.return,v)}}break;case 6:if(ms(t,e),gs(e),4&r){if(null===e.stateNode)throw Error(i(162));o=e.stateNode,a=e.memoizedProps;try{o.nodeValue=a}catch(v){ku(e,e.return,v)}}break;case 3:if(ms(t,e),gs(e),4&r&&null!==n&&n.memoizedState.isDehydrated)try{Vt(t.containerInfo)}catch(v){ku(e,e.return,v)}break;case 4:default:ms(t,e),gs(e);break;case 13:ms(t,e),gs(e),8192&(o=e.child).flags&&(a=null!==o.memoizedState,o.stateNode.isHidden=a,!a||null!==o.alternate&&null!==o.alternate.memoizedState||(Bs=Xe())),4&r&&hs(e);break;case 22:if(d=null!==n&&null!==n.memoizedState,1&e.mode?(Kl=(c=Kl)||d,ms(t,e),Kl=c):ms(t,e),gs(e),8192&r){if(c=null!==e.memoizedState,(e.stateNode.isHidden=c)&&!d&&0!==(1&e.mode))for(Zl=e,d=e.child;null!==d;){for(f=Zl=d;null!==Zl;){switch(h=(p=Zl).child,p.tag){case 0:case 11:case 14:case 15:ns(4,p,p.return);break;case 1:Jl(p,p.return);var m=p.stateNode;if("function"===typeof m.componentWillUnmount){r=p,n=p.return;try{t=r,m.props=t.memoizedProps,m.state=t.memoizedState,m.componentWillUnmount()}catch(v){ku(r,n,v)}}break;case 5:Jl(p,p.return);break;case 22:if(null!==p.memoizedState){ws(f);continue}}null!==h?(h.return=p,Zl=h):ws(f)}d=d.sibling}e:for(d=null,f=e;;){if(5===f.tag){if(null===d){d=f;try{o=f.stateNode,c?"function"===typeof(a=o.style).setProperty?a.setProperty("display","none","important"):a.display="none":(s=f.stateNode,l=void 0!==(u=f.memoizedProps.style)&&null!==u&&u.hasOwnProperty("display")?u.display:null,s.style.display=me("display",l))}catch(v){ku(e,e.return,v)}}}else if(6===f.tag){if(null===d)try{f.stateNode.nodeValue=c?"":f.memoizedProps}catch(v){ku(e,e.return,v)}}else if((22!==f.tag&&23!==f.tag||null===f.memoizedState||f===e)&&null!==f.child){f.child.return=f,f=f.child;continue}if(f===e)break e;for(;null===f.sibling;){if(null===f.return||f.return===e)break e;d===f&&(d=null),f=f.return}d===f&&(d=null),f.sibling.return=f.return,f=f.sibling}}break;case 19:ms(t,e),gs(e),4&r&&hs(e);case 21:}}function gs(e){var t=e.flags;if(2&t){try{e:{for(var n=e.return;null!==n;){if(as(n)){var r=n;break e}n=n.return}throw Error(i(160))}switch(r.tag){case 5:var o=r.stateNode;32&r.flags&&(fe(o,""),r.flags&=-33),us(e,ls(e),o);break;case 3:case 4:var a=r.stateNode.containerInfo;ss(e,ls(e),a);break;default:throw Error(i(161))}}catch(l){ku(e,e.return,l)}e.flags&=-3}4096&t&&(e.flags&=-4097)}function ys(e,t,n){Zl=e,xs(e,t,n)}function xs(e,t,n){for(var r=0!==(1&e.mode);null!==Zl;){var o=Zl,i=o.child;if(22===o.tag&&r){var a=null!==o.memoizedState||$l;if(!a){var l=o.alternate,s=null!==l&&null!==l.memoizedState||Kl;l=$l;var u=Kl;if($l=a,(Kl=s)&&!u)for(Zl=o;null!==Zl;)s=(a=Zl).child,22===a.tag&&null!==a.memoizedState?Ss(o):null!==s?(s.return=a,Zl=s):Ss(o);for(;null!==i;)Zl=i,xs(i,t,n),i=i.sibling;Zl=o,$l=l,Kl=u}bs(e)}else 0!==(8772&o.subtreeFlags)&&null!==i?(i.return=o,Zl=i):bs(e)}}function bs(e){for(;null!==Zl;){var t=Zl;if(0!==(8772&t.flags)){var n=t.alternate;try{if(0!==(8772&t.flags))switch(t.tag){case 0:case 11:case 15:Kl||rs(5,t);break;case 1:var r=t.stateNode;if(4&t.flags&&!Kl)if(null===n)r.componentDidMount();else{var o=t.elementType===t.type?n.memoizedProps:gi(t.type,n.memoizedProps);r.componentDidUpdate(o,n.memoizedState,r.__reactInternalSnapshotBeforeUpdate)}var a=t.updateQueue;null!==a&&Fi(t,a,r);break;case 3:var l=t.updateQueue;if(null!==l){if(n=null,null!==t.child)switch(t.child.tag){case 5:case 1:n=t.child.stateNode}Fi(t,l,n)}break;case 5:var s=t.stateNode;if(null===n&&4&t.flags){n=s;var u=t.memoizedProps;switch(t.type){case"button":case"input":case"select":case"textarea":u.autoFocus&&n.focus();break;case"img":u.src&&(n.src=u.src)}}break;case 6:case 4:case 12:case 19:case 17:case 21:case 22:case 23:case 25:break;case 13:if(null===t.memoizedState){var c=t.alternate;if(null!==c){var d=c.memoizedState;if(null!==d){var f=d.dehydrated;null!==f&&Vt(f)}}}break;default:throw Error(i(163))}Kl||512&t.flags&&os(t)}catch(p){ku(t,t.return,p)}}if(t===e){Zl=null;break}if(null!==(n=t.sibling)){n.return=t.return,Zl=n;break}Zl=t.return}}function ws(e){for(;null!==Zl;){var t=Zl;if(t===e){Zl=null;break}var n=t.sibling;if(null!==n){n.return=t.return,Zl=n;break}Zl=t.return}}function Ss(e){for(;null!==Zl;){var t=Zl;try{switch(t.tag){case 0:case 11:case 15:var n=t.return;try{rs(4,t)}catch(s){ku(t,n,s)}break;case 1:var r=t.stateNode;if("function"===typeof r.componentDidMount){var o=t.return;try{r.componentDidMount()}catch(s){ku(t,o,s)}}var i=t.return;try{os(t)}catch(s){ku(t,i,s)}break;case 5:var a=t.return;try{os(t)}catch(s){ku(t,a,s)}}}catch(s){ku(t,t.return,s)}if(t===e){Zl=null;break}var l=t.sibling;if(null!==l){l.return=t.return,Zl=l;break}Zl=t.return}}var js,ks=Math.ceil,Cs=b.ReactCurrentDispatcher,Rs=b.ReactCurrentOwner,Ts=b.ReactCurrentBatchConfig,Os=0,Ps=null,Es=null,Ms=0,_s=0,Ds=Co(0),Is=0,As=null,Ns=0,Ls=0,zs=0,Fs=null,Ws=null,Bs=0,Vs=1/0,qs=null,Hs=!1,Us=null,Ys=null,Gs=!1,Qs=null,$s=0,Ks=0,Xs=null,Zs=-1,Js=0;function eu(){return 0!==(6&Os)?Xe():-1!==Zs?Zs:Zs=Xe()}function tu(e){return 0===(1&e.mode)?1:0!==(2&Os)&&0!==Ms?Ms&-Ms:null!==vi.transition?(0===Js&&(Js=mt()),Js):0!==(e=xt)?e:e=void 0===(e=window.event)?16:Kt(e.type)}function nu(e,t,n,r){if(50<Ks)throw Ks=0,Xs=null,Error(i(185));gt(e,n,r),0!==(2&Os)&&e===Ps||(e===Ps&&(0===(2&Os)&&(Ls|=n),4===Is&&lu(e,Ms)),ru(e,r),1===n&&0===Os&&0===(1&t.mode)&&(Vs=Xe()+500,Wo&&qo()))}function ru(e,t){var n=e.callbackNode;!function(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,o=e.expirationTimes,i=e.pendingLanes;0<i;){var a=31-at(i),l=1<<a,s=o[a];-1===s?0!==(l&n)&&0===(l&r)||(o[a]=pt(l,t)):s<=t&&(e.expiredLanes|=l),i&=~l}}(e,t);var r=ft(e,e===Ps?Ms:0);if(0===r)null!==n&&Qe(n),e.callbackNode=null,e.callbackPriority=0;else if(t=r&-r,e.callbackPriority!==t){if(null!=n&&Qe(n),1===t)0===e.tag?function(e){Wo=!0,Vo(e)}(su.bind(null,e)):Vo(su.bind(null,e)),ao((function(){0===(6&Os)&&qo()})),n=null;else{switch(bt(r)){case 1:n=Je;break;case 4:n=et;break;case 16:default:n=tt;break;case 536870912:n=rt}n=Pu(n,ou.bind(null,e))}e.callbackPriority=t,e.callbackNode=n}}function ou(e,t){if(Zs=-1,Js=0,0!==(6&Os))throw Error(i(327));var n=e.callbackNode;if(Su()&&e.callbackNode!==n)return null;var r=ft(e,e===Ps?Ms:0);if(0===r)return null;if(0!==(30&r)||0!==(r&e.expiredLanes)||t)t=vu(e,r);else{t=r;var o=Os;Os|=2;var a=hu();for(Ps===e&&Ms===t||(qs=null,Vs=Xe()+500,fu(e,t));;)try{yu();break}catch(s){pu(e,s)}Si(),Cs.current=a,Os=o,null!==Es?t=0:(Ps=null,Ms=0,t=Is)}if(0!==t){if(2===t&&(0!==(o=ht(e))&&(r=o,t=iu(e,o))),1===t)throw n=As,fu(e,0),lu(e,r),ru(e,Xe()),n;if(6===t)lu(e,r);else{if(o=e.current.alternate,0===(30&r)&&!function(e){for(var t=e;;){if(16384&t.flags){var n=t.updateQueue;if(null!==n&&null!==(n=n.stores))for(var r=0;r<n.length;r++){var o=n[r],i=o.getSnapshot;o=o.value;try{if(!lr(i(),o))return!1}catch(l){return!1}}}if(n=t.child,16384&t.subtreeFlags&&null!==n)n.return=t,t=n;else{if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}(o)&&(2===(t=vu(e,r))&&(0!==(a=ht(e))&&(r=a,t=iu(e,a))),1===t))throw n=As,fu(e,0),lu(e,r),ru(e,Xe()),n;switch(e.finishedWork=o,e.finishedLanes=r,t){case 0:case 1:throw Error(i(345));case 2:case 5:wu(e,Ws,qs);break;case 3:if(lu(e,r),(130023424&r)===r&&10<(t=Bs+500-Xe())){if(0!==ft(e,0))break;if(((o=e.suspendedLanes)&r)!==r){eu(),e.pingedLanes|=e.suspendedLanes&o;break}e.timeoutHandle=ro(wu.bind(null,e,Ws,qs),t);break}wu(e,Ws,qs);break;case 4:if(lu(e,r),(4194240&r)===r)break;for(t=e.eventTimes,o=-1;0<r;){var l=31-at(r);a=1<<l,(l=t[l])>o&&(o=l),r&=~a}if(r=o,10<(r=(120>(r=Xe()-r)?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*ks(r/1960))-r)){e.timeoutHandle=ro(wu.bind(null,e,Ws,qs),r);break}wu(e,Ws,qs);break;default:throw Error(i(329))}}}return ru(e,Xe()),e.callbackNode===n?ou.bind(null,e):null}function iu(e,t){var n=Fs;return e.current.memoizedState.isDehydrated&&(fu(e,t).flags|=256),2!==(e=vu(e,t))&&(t=Ws,Ws=n,null!==t&&au(t)),e}function au(e){null===Ws?Ws=e:Ws.push.apply(Ws,e)}function lu(e,t){for(t&=~zs,t&=~Ls,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-at(t),r=1<<n;e[n]=-1,t&=~r}}function su(e){if(0!==(6&Os))throw Error(i(327));Su();var t=ft(e,0);if(0===(1&t))return ru(e,Xe()),null;var n=vu(e,t);if(0!==e.tag&&2===n){var r=ht(e);0!==r&&(t=r,n=iu(e,r))}if(1===n)throw n=As,fu(e,0),lu(e,t),ru(e,Xe()),n;if(6===n)throw Error(i(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,wu(e,Ws,qs),ru(e,Xe()),null}function uu(e,t){var n=Os;Os|=1;try{return e(t)}finally{0===(Os=n)&&(Vs=Xe()+500,Wo&&qo())}}function cu(e){null!==Qs&&0===Qs.tag&&0===(6&Os)&&Su();var t=Os;Os|=1;var n=Ts.transition,r=xt;try{if(Ts.transition=null,xt=1,e)return e()}finally{xt=r,Ts.transition=n,0===(6&(Os=t))&&qo()}}function du(){_s=Ds.current,Ro(Ds)}function fu(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,oo(n)),null!==Es)for(n=Es.return;null!==n;){var r=n;switch(ni(r),r.tag){case 1:null!==(r=r.type.childContextTypes)&&void 0!==r&&Io();break;case 3:ia(),Ro(Eo),Ro(Po),da();break;case 5:la(r);break;case 4:ia();break;case 13:case 19:Ro(sa);break;case 10:ji(r.type._context);break;case 22:case 23:du()}n=n.return}if(Ps=e,Es=e=Du(e.current,null),Ms=_s=t,Is=0,As=null,zs=Ls=Ns=0,Ws=Fs=null,null!==Ti){for(t=0;t<Ti.length;t++)if(null!==(r=(n=Ti[t]).interleaved)){n.interleaved=null;var o=r.next,i=n.pending;if(null!==i){var a=i.next;i.next=o,r.next=a}n.pending=r}Ti=null}return e}function pu(e,t){for(;;){var n=Es;try{if(Si(),fa.current=al,ya){for(var r=ma.memoizedState;null!==r;){var o=r.queue;null!==o&&(o.pending=null),r=r.next}ya=!1}if(ha=0,ga=va=ma=null,xa=!1,ba=0,Rs.current=null,null===n||null===n.return){Is=1,As=t,Es=null;break}e:{var a=e,l=n.return,s=n,u=t;if(t=Ms,s.flags|=32768,null!==u&&"object"===typeof u&&"function"===typeof u.then){var c=u,d=s,f=d.tag;if(0===(1&d.mode)&&(0===f||11===f||15===f)){var p=d.alternate;p?(d.updateQueue=p.updateQueue,d.memoizedState=p.memoizedState,d.lanes=p.lanes):(d.updateQueue=null,d.memoizedState=null)}var h=gl(l);if(null!==h){h.flags&=-257,yl(h,l,s,0,t),1&h.mode&&vl(a,c,t),u=c;var m=(t=h).updateQueue;if(null===m){var v=new Set;v.add(u),t.updateQueue=v}else m.add(u);break e}if(0===(1&t)){vl(a,c,t),mu();break e}u=Error(i(426))}else if(ii&&1&s.mode){var g=gl(l);if(null!==g){0===(65536&g.flags)&&(g.flags|=256),yl(g,l,s,0,t),mi(cl(u,s));break e}}a=u=cl(u,s),4!==Is&&(Is=2),null===Fs?Fs=[a]:Fs.push(a),a=l;do{switch(a.tag){case 3:a.flags|=65536,t&=-t,a.lanes|=t,Li(a,hl(0,u,t));break e;case 1:s=u;var y=a.type,x=a.stateNode;if(0===(128&a.flags)&&("function"===typeof y.getDerivedStateFromError||null!==x&&"function"===typeof x.componentDidCatch&&(null===Ys||!Ys.has(x)))){a.flags|=65536,t&=-t,a.lanes|=t,Li(a,ml(a,s,t));break e}}a=a.return}while(null!==a)}bu(n)}catch(b){t=b,Es===n&&null!==n&&(Es=n=n.return);continue}break}}function hu(){var e=Cs.current;return Cs.current=al,null===e?al:e}function mu(){0!==Is&&3!==Is&&2!==Is||(Is=4),null===Ps||0===(268435455&Ns)&&0===(268435455&Ls)||lu(Ps,Ms)}function vu(e,t){var n=Os;Os|=2;var r=hu();for(Ps===e&&Ms===t||(qs=null,fu(e,t));;)try{gu();break}catch(o){pu(e,o)}if(Si(),Os=n,Cs.current=r,null!==Es)throw Error(i(261));return Ps=null,Ms=0,Is}function gu(){for(;null!==Es;)xu(Es)}function yu(){for(;null!==Es&&!$e();)xu(Es)}function xu(e){var t=js(e.alternate,e,_s);e.memoizedProps=e.pendingProps,null===t?bu(e):Es=t,Rs.current=null}function bu(e){var t=e;do{var n=t.alternate;if(e=t.return,0===(32768&t.flags)){if(null!==(n=Gl(n,t,_s)))return void(Es=n)}else{if(null!==(n=Ql(n,t)))return n.flags&=32767,void(Es=n);if(null===e)return Is=6,void(Es=null);e.flags|=32768,e.subtreeFlags=0,e.deletions=null}if(null!==(t=t.sibling))return void(Es=t);Es=t=e}while(null!==t);0===Is&&(Is=5)}function wu(e,t,n){var r=xt,o=Ts.transition;try{Ts.transition=null,xt=1,function(e,t,n,r){do{Su()}while(null!==Qs);if(0!==(6&Os))throw Error(i(327));n=e.finishedWork;var o=e.finishedLanes;if(null===n)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(i(177));e.callbackNode=null,e.callbackPriority=0;var a=n.lanes|n.childLanes;if(function(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0<n;){var o=31-at(n),i=1<<o;t[o]=0,r[o]=-1,e[o]=-1,n&=~i}}(e,a),e===Ps&&(Es=Ps=null,Ms=0),0===(2064&n.subtreeFlags)&&0===(2064&n.flags)||Gs||(Gs=!0,Pu(tt,(function(){return Su(),null}))),a=0!==(15990&n.flags),0!==(15990&n.subtreeFlags)||a){a=Ts.transition,Ts.transition=null;var l=xt;xt=1;var s=Os;Os|=4,Rs.current=null,function(e,t){if(eo=Ht,pr(e=fr())){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{var r=(n=(n=e.ownerDocument)&&n.defaultView||window).getSelection&&n.getSelection();if(r&&0!==r.rangeCount){n=r.anchorNode;var o=r.anchorOffset,a=r.focusNode;r=r.focusOffset;try{n.nodeType,a.nodeType}catch(w){n=null;break e}var l=0,s=-1,u=-1,c=0,d=0,f=e,p=null;t:for(;;){for(var h;f!==n||0!==o&&3!==f.nodeType||(s=l+o),f!==a||0!==r&&3!==f.nodeType||(u=l+r),3===f.nodeType&&(l+=f.nodeValue.length),null!==(h=f.firstChild);)p=f,f=h;for(;;){if(f===e)break t;if(p===n&&++c===o&&(s=l),p===a&&++d===r&&(u=l),null!==(h=f.nextSibling))break;p=(f=p).parentNode}f=h}n=-1===s||-1===u?null:{start:s,end:u}}else n=null}n=n||{start:0,end:0}}else n=null;for(to={focusedElem:e,selectionRange:n},Ht=!1,Zl=t;null!==Zl;)if(e=(t=Zl).child,0!==(1028&t.subtreeFlags)&&null!==e)e.return=t,Zl=e;else for(;null!==Zl;){t=Zl;try{var m=t.alternate;if(0!==(1024&t.flags))switch(t.tag){case 0:case 11:case 15:case 5:case 6:case 4:case 17:break;case 1:if(null!==m){var v=m.memoizedProps,g=m.memoizedState,y=t.stateNode,x=y.getSnapshotBeforeUpdate(t.elementType===t.type?v:gi(t.type,v),g);y.__reactInternalSnapshotBeforeUpdate=x}break;case 3:var b=t.stateNode.containerInfo;1===b.nodeType?b.textContent="":9===b.nodeType&&b.documentElement&&b.removeChild(b.documentElement);break;default:throw Error(i(163))}}catch(w){ku(t,t.return,w)}if(null!==(e=t.sibling)){e.return=t.return,Zl=e;break}Zl=t.return}m=ts,ts=!1}(e,n),vs(n,e),hr(to),Ht=!!eo,to=eo=null,e.current=n,ys(n,e,o),Ke(),Os=s,xt=l,Ts.transition=a}else e.current=n;if(Gs&&(Gs=!1,Qs=e,$s=o),0===(a=e.pendingLanes)&&(Ys=null),function(e){if(it&&"function"===typeof it.onCommitFiberRoot)try{it.onCommitFiberRoot(ot,e,void 0,128===(128&e.current.flags))}catch(t){}}(n.stateNode),ru(e,Xe()),null!==t)for(r=e.onRecoverableError,n=0;n<t.length;n++)r((o=t[n]).value,{componentStack:o.stack,digest:o.digest});if(Hs)throw Hs=!1,e=Us,Us=null,e;0!==(1&$s)&&0!==e.tag&&Su(),0!==(1&(a=e.pendingLanes))?e===Xs?Ks++:(Ks=0,Xs=e):Ks=0,qo()}(e,t,n,r)}finally{Ts.transition=o,xt=r}return null}function Su(){if(null!==Qs){var e=bt($s),t=Ts.transition,n=xt;try{if(Ts.transition=null,xt=16>e?16:e,null===Qs)var r=!1;else{if(e=Qs,Qs=null,$s=0,0!==(6&Os))throw Error(i(331));var o=Os;for(Os|=4,Zl=e.current;null!==Zl;){var a=Zl,l=a.child;if(0!==(16&Zl.flags)){var s=a.deletions;if(null!==s){for(var u=0;u<s.length;u++){var c=s[u];for(Zl=c;null!==Zl;){var d=Zl;switch(d.tag){case 0:case 11:case 15:ns(8,d,a)}var f=d.child;if(null!==f)f.return=d,Zl=f;else for(;null!==Zl;){var p=(d=Zl).sibling,h=d.return;if(is(d),d===c){Zl=null;break}if(null!==p){p.return=h,Zl=p;break}Zl=h}}}var m=a.alternate;if(null!==m){var v=m.child;if(null!==v){m.child=null;do{var g=v.sibling;v.sibling=null,v=g}while(null!==v)}}Zl=a}}if(0!==(2064&a.subtreeFlags)&&null!==l)l.return=a,Zl=l;else e:for(;null!==Zl;){if(0!==(2048&(a=Zl).flags))switch(a.tag){case 0:case 11:case 15:ns(9,a,a.return)}var y=a.sibling;if(null!==y){y.return=a.return,Zl=y;break e}Zl=a.return}}var x=e.current;for(Zl=x;null!==Zl;){var b=(l=Zl).child;if(0!==(2064&l.subtreeFlags)&&null!==b)b.return=l,Zl=b;else e:for(l=x;null!==Zl;){if(0!==(2048&(s=Zl).flags))try{switch(s.tag){case 0:case 11:case 15:rs(9,s)}}catch(S){ku(s,s.return,S)}if(s===l){Zl=null;break e}var w=s.sibling;if(null!==w){w.return=s.return,Zl=w;break e}Zl=s.return}}if(Os=o,qo(),it&&"function"===typeof it.onPostCommitFiberRoot)try{it.onPostCommitFiberRoot(ot,e)}catch(S){}r=!0}return r}finally{xt=n,Ts.transition=t}}return!1}function ju(e,t,n){e=Ai(e,t=hl(0,t=cl(n,t),1),1),t=eu(),null!==e&&(gt(e,1,t),ru(e,t))}function ku(e,t,n){if(3===e.tag)ju(e,e,n);else for(;null!==t;){if(3===t.tag){ju(t,e,n);break}if(1===t.tag){var r=t.stateNode;if("function"===typeof t.type.getDerivedStateFromError||"function"===typeof r.componentDidCatch&&(null===Ys||!Ys.has(r))){t=Ai(t,e=ml(t,e=cl(n,e),1),1),e=eu(),null!==t&&(gt(t,1,e),ru(t,e));break}}t=t.return}}function Cu(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),t=eu(),e.pingedLanes|=e.suspendedLanes&n,Ps===e&&(Ms&n)===n&&(4===Is||3===Is&&(130023424&Ms)===Ms&&500>Xe()-Bs?fu(e,0):zs|=n),ru(e,t)}function Ru(e,t){0===t&&(0===(1&e.mode)?t=1:(t=ct,0===(130023424&(ct<<=1))&&(ct=4194304)));var n=eu();null!==(e=Ei(e,t))&&(gt(e,t,n),ru(e,n))}function Tu(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),Ru(e,n)}function Ou(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,o=e.memoizedState;null!==o&&(n=o.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(i(314))}null!==r&&r.delete(t),Ru(e,n)}function Pu(e,t){return Ge(e,t)}function Eu(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Mu(e,t,n,r){return new Eu(e,t,n,r)}function _u(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Du(e,t){var n=e.alternate;return null===n?((n=Mu(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=14680064&e.flags,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Iu(e,t,n,r,o,a){var l=2;if(r=e,"function"===typeof e)_u(e)&&(l=1);else if("string"===typeof e)l=5;else e:switch(e){case j:return Au(n.children,o,a,t);case k:l=8,o|=8;break;case C:return(e=Mu(12,n,t,2|o)).elementType=C,e.lanes=a,e;case P:return(e=Mu(13,n,t,o)).elementType=P,e.lanes=a,e;case E:return(e=Mu(19,n,t,o)).elementType=E,e.lanes=a,e;case D:return Nu(n,o,a,t);default:if("object"===typeof e&&null!==e)switch(e.$$typeof){case R:l=10;break e;case T:l=9;break e;case O:l=11;break e;case M:l=14;break e;case _:l=16,r=null;break e}throw Error(i(130,null==e?e:typeof e,""))}return(t=Mu(l,n,t,o)).elementType=e,t.type=r,t.lanes=a,t}function Au(e,t,n,r){return(e=Mu(7,e,r,t)).lanes=n,e}function Nu(e,t,n,r){return(e=Mu(22,e,r,t)).elementType=D,e.lanes=n,e.stateNode={isHidden:!1},e}function Lu(e,t,n){return(e=Mu(6,e,null,t)).lanes=n,e}function zu(e,t,n){return(t=Mu(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Fu(e,t,n,r,o){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=vt(0),this.expirationTimes=vt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=vt(0),this.identifierPrefix=r,this.onRecoverableError=o,this.mutableSourceEagerHydrationData=null}function Wu(e,t,n,r,o,i,a,l,s){return e=new Fu(e,t,n,l,s),1===t?(t=1,!0===i&&(t|=8)):t=0,i=Mu(3,null,null,t),e.current=i,i.stateNode=e,i.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},_i(i),e}function Bu(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:S,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}function Vu(e){if(!e)return Oo;e:{if(Ve(e=e._reactInternals)!==e||1!==e.tag)throw Error(i(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(Do(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(null!==t);throw Error(i(171))}if(1===e.tag){var n=e.type;if(Do(n))return No(e,n,t)}return t}function qu(e,t,n,r,o,i,a,l,s){return(e=Wu(n,r,!0,e,0,i,0,l,s)).context=Vu(null),n=e.current,(i=Ii(r=eu(),o=tu(n))).callback=void 0!==t&&null!==t?t:null,Ai(n,i,o),e.current.lanes=o,gt(e,o,r),ru(e,r),e}function Hu(e,t,n,r){var o=t.current,i=eu(),a=tu(o);return n=Vu(n),null===t.context?t.context=n:t.pendingContext=n,(t=Ii(i,a)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),null!==(e=Ai(o,t,a))&&(nu(e,o,a,i),Ni(e,o,a)),a}function Uu(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function Yu(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function Gu(e,t){Yu(e,t),(e=e.alternate)&&Yu(e,t)}js=function(e,t,n){if(null!==e)if(e.memoizedProps!==t.pendingProps||Eo.current)bl=!0;else{if(0===(e.lanes&n)&&0===(128&t.flags))return bl=!1,function(e,t,n){switch(t.tag){case 3:El(t),hi();break;case 5:aa(t);break;case 1:Do(t.type)&&Lo(t);break;case 4:oa(t,t.stateNode.containerInfo);break;case 10:var r=t.type._context,o=t.memoizedProps.value;To(yi,r._currentValue),r._currentValue=o;break;case 13:if(null!==(r=t.memoizedState))return null!==r.dehydrated?(To(sa,1&sa.current),t.flags|=128,null):0!==(n&t.child.childLanes)?Ll(e,t,n):(To(sa,1&sa.current),null!==(e=Hl(e,t,n))?e.sibling:null);To(sa,1&sa.current);break;case 19:if(r=0!==(n&t.childLanes),0!==(128&e.flags)){if(r)return Vl(e,t,n);t.flags|=128}if(null!==(o=t.memoizedState)&&(o.rendering=null,o.tail=null,o.lastEffect=null),To(sa,sa.current),r)break;return null;case 22:case 23:return t.lanes=0,Cl(e,t,n)}return Hl(e,t,n)}(e,t,n);bl=0!==(131072&e.flags)}else bl=!1,ii&&0!==(1048576&t.flags)&&ei(t,Go,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;ql(e,t),e=t.pendingProps;var o=_o(t,Po.current);Ci(t,n),o=ka(null,t,r,e,o,n);var a=Ca();return t.flags|=1,"object"===typeof o&&null!==o&&"function"===typeof o.render&&void 0===o.$$typeof?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Do(r)?(a=!0,Lo(t)):a=!1,t.memoizedState=null!==o.state&&void 0!==o.state?o.state:null,_i(t),o.updater=Vi,t.stateNode=o,o._reactInternals=t,Yi(t,r,e,n),t=Pl(null,t,r,!0,a,n)):(t.tag=0,ii&&a&&ti(t),wl(null,t,o,n),t=t.child),t;case 16:r=t.elementType;e:{switch(ql(e,t),e=t.pendingProps,r=(o=r._init)(r._payload),t.type=r,o=t.tag=function(e){if("function"===typeof e)return _u(e)?1:0;if(void 0!==e&&null!==e){if((e=e.$$typeof)===O)return 11;if(e===M)return 14}return 2}(r),e=gi(r,e),o){case 0:t=Tl(null,t,r,e,n);break e;case 1:t=Ol(null,t,r,e,n);break e;case 11:t=Sl(null,t,r,e,n);break e;case 14:t=jl(null,t,r,gi(r.type,e),n);break e}throw Error(i(306,r,""))}return t;case 0:return r=t.type,o=t.pendingProps,Tl(e,t,r,o=t.elementType===r?o:gi(r,o),n);case 1:return r=t.type,o=t.pendingProps,Ol(e,t,r,o=t.elementType===r?o:gi(r,o),n);case 3:e:{if(El(t),null===e)throw Error(i(387));r=t.pendingProps,o=(a=t.memoizedState).element,Di(e,t),zi(t,r,null,n);var l=t.memoizedState;if(r=l.element,a.isDehydrated){if(a={element:r,isDehydrated:!1,cache:l.cache,pendingSuspenseBoundaries:l.pendingSuspenseBoundaries,transitions:l.transitions},t.updateQueue.baseState=a,t.memoizedState=a,256&t.flags){t=Ml(e,t,r,n,o=cl(Error(i(423)),t));break e}if(r!==o){t=Ml(e,t,r,n,o=cl(Error(i(424)),t));break e}for(oi=uo(t.stateNode.containerInfo.firstChild),ri=t,ii=!0,ai=null,n=Zi(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|4096,n=n.sibling}else{if(hi(),r===o){t=Hl(e,t,n);break e}wl(e,t,r,n)}t=t.child}return t;case 5:return aa(t),null===e&&ci(t),r=t.type,o=t.pendingProps,a=null!==e?e.memoizedProps:null,l=o.children,no(r,o)?l=null:null!==a&&no(r,a)&&(t.flags|=32),Rl(e,t),wl(e,t,l,n),t.child;case 6:return null===e&&ci(t),null;case 13:return Ll(e,t,n);case 4:return oa(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=Xi(t,null,r,n):wl(e,t,r,n),t.child;case 11:return r=t.type,o=t.pendingProps,Sl(e,t,r,o=t.elementType===r?o:gi(r,o),n);case 7:return wl(e,t,t.pendingProps,n),t.child;case 8:case 12:return wl(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,o=t.pendingProps,a=t.memoizedProps,l=o.value,To(yi,r._currentValue),r._currentValue=l,null!==a)if(lr(a.value,l)){if(a.children===o.children&&!Eo.current){t=Hl(e,t,n);break e}}else for(null!==(a=t.child)&&(a.return=t);null!==a;){var s=a.dependencies;if(null!==s){l=a.child;for(var u=s.firstContext;null!==u;){if(u.context===r){if(1===a.tag){(u=Ii(-1,n&-n)).tag=2;var c=a.updateQueue;if(null!==c){var d=(c=c.shared).pending;null===d?u.next=u:(u.next=d.next,d.next=u),c.pending=u}}a.lanes|=n,null!==(u=a.alternate)&&(u.lanes|=n),ki(a.return,n,t),s.lanes|=n;break}u=u.next}}else if(10===a.tag)l=a.type===t.type?null:a.child;else if(18===a.tag){if(null===(l=a.return))throw Error(i(341));l.lanes|=n,null!==(s=l.alternate)&&(s.lanes|=n),ki(l,n,t),l=a.sibling}else l=a.child;if(null!==l)l.return=a;else for(l=a;null!==l;){if(l===t){l=null;break}if(null!==(a=l.sibling)){a.return=l.return,l=a;break}l=l.return}a=l}wl(e,t,o.children,n),t=t.child}return t;case 9:return o=t.type,r=t.pendingProps.children,Ci(t,n),r=r(o=Ri(o)),t.flags|=1,wl(e,t,r,n),t.child;case 14:return o=gi(r=t.type,t.pendingProps),jl(e,t,r,o=gi(r.type,o),n);case 15:return kl(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:gi(r,o),ql(e,t),t.tag=1,Do(r)?(e=!0,Lo(t)):e=!1,Ci(t,n),Hi(t,r,o),Yi(t,r,o,n),Pl(null,t,r,!0,e,n);case 19:return Vl(e,t,n);case 22:return Cl(e,t,n)}throw Error(i(156,t.tag))};var Qu="function"===typeof reportError?reportError:function(e){console.error(e)};function $u(e){this._internalRoot=e}function Ku(e){this._internalRoot=e}function Xu(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType)}function Zu(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function Ju(){}function ec(e,t,n,r,o){var i=n._reactRootContainer;if(i){var a=i;if("function"===typeof o){var l=o;o=function(){var e=Uu(a);l.call(e)}}Hu(t,a,e,o)}else a=function(e,t,n,r,o){if(o){if("function"===typeof r){var i=r;r=function(){var e=Uu(a);i.call(e)}}var a=qu(t,r,e,0,null,!1,0,"",Ju);return e._reactRootContainer=a,e[mo]=a.current,Vr(8===e.nodeType?e.parentNode:e),cu(),a}for(;o=e.lastChild;)e.removeChild(o);if("function"===typeof r){var l=r;r=function(){var e=Uu(s);l.call(e)}}var s=Wu(e,0,!1,null,0,!1,0,"",Ju);return e._reactRootContainer=s,e[mo]=s.current,Vr(8===e.nodeType?e.parentNode:e),cu((function(){Hu(t,s,n,r)})),s}(n,t,e,o,r);return Uu(a)}Ku.prototype.render=$u.prototype.render=function(e){var t=this._internalRoot;if(null===t)throw Error(i(409));Hu(e,t,null,null)},Ku.prototype.unmount=$u.prototype.unmount=function(){var e=this._internalRoot;if(null!==e){this._internalRoot=null;var t=e.containerInfo;cu((function(){Hu(null,e,null,null)})),t[mo]=null}},Ku.prototype.unstable_scheduleHydration=function(e){if(e){var t=kt();e={blockedOn:null,target:e,priority:t};for(var n=0;n<Dt.length&&0!==t&&t<Dt[n].priority;n++);Dt.splice(n,0,e),0===n&&Lt(e)}},wt=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var n=dt(t.pendingLanes);0!==n&&(yt(t,1|n),ru(t,Xe()),0===(6&Os)&&(Vs=Xe()+500,qo()))}break;case 13:cu((function(){var t=Ei(e,1);if(null!==t){var n=eu();nu(t,e,1,n)}})),Gu(e,1)}},St=function(e){if(13===e.tag){var t=Ei(e,134217728);if(null!==t)nu(t,e,134217728,eu());Gu(e,134217728)}},jt=function(e){if(13===e.tag){var t=tu(e),n=Ei(e,t);if(null!==n)nu(n,e,t,eu());Gu(e,t)}},kt=function(){return xt},Ct=function(e,t){var n=xt;try{return xt=e,t()}finally{xt=n}},Se=function(e,t,n){switch(t){case"input":if(Z(e,n),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var o=So(r);if(!o)throw Error(i(90));G(r),Z(r,o)}}}break;case"textarea":ie(e,n);break;case"select":null!=(t=n.value)&&ne(e,!!n.multiple,t,!1)}},Oe=uu,Pe=cu;var tc={usingClientEntryPoint:!1,Events:[bo,wo,So,Re,Te,uu]},nc={findFiberByHostInstance:xo,bundleType:0,version:"18.2.0",rendererPackageName:"react-dom"},rc={bundleType:nc.bundleType,version:nc.version,rendererPackageName:nc.rendererPackageName,rendererConfig:nc.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:b.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=Ue(e))?null:e.stateNode},findFiberByHostInstance:nc.findFiberByHostInstance||function(){return null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.2.0-next-9e3b772b8-20220608"};if("undefined"!==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var oc=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!oc.isDisabled&&oc.supportsFiber)try{ot=oc.inject(rc),it=oc}catch(ce){}}t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=tc,t.createPortal=function(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!Xu(t))throw Error(i(200));return Bu(e,t,null,n)},t.createRoot=function(e,t){if(!Xu(e))throw Error(i(299));var n=!1,r="",o=Qu;return null!==t&&void 0!==t&&(!0===t.unstable_strictMode&&(n=!0),void 0!==t.identifierPrefix&&(r=t.identifierPrefix),void 0!==t.onRecoverableError&&(o=t.onRecoverableError)),t=Wu(e,1,!1,null,0,n,0,r,o),e[mo]=t.current,Vr(8===e.nodeType?e.parentNode:e),new $u(t)},t.findDOMNode=function(e){if(null==e)return null;if(1===e.nodeType)return e;var t=e._reactInternals;if(void 0===t){if("function"===typeof e.render)throw Error(i(188));throw e=Object.keys(e).join(","),Error(i(268,e))}return e=null===(e=Ue(t))?null:e.stateNode},t.flushSync=function(e){return cu(e)},t.hydrate=function(e,t,n){if(!Zu(t))throw Error(i(200));return ec(null,e,t,!0,n)},t.hydrateRoot=function(e,t,n){if(!Xu(e))throw Error(i(405));var r=null!=n&&n.hydratedSources||null,o=!1,a="",l=Qu;if(null!==n&&void 0!==n&&(!0===n.unstable_strictMode&&(o=!0),void 0!==n.identifierPrefix&&(a=n.identifierPrefix),void 0!==n.onRecoverableError&&(l=n.onRecoverableError)),t=qu(t,null,e,1,null!=n?n:null,o,0,a,l),e[mo]=t.current,Vr(e),r)for(e=0;e<r.length;e++)o=(o=(n=r[e])._getVersion)(n._source),null==t.mutableSourceEagerHydrationData?t.mutableSourceEagerHydrationData=[n,o]:t.mutableSourceEagerHydrationData.push(n,o);return new Ku(t)},t.render=function(e,t,n){if(!Zu(t))throw Error(i(200));return ec(null,e,t,!1,n)},t.unmountComponentAtNode=function(e){if(!Zu(e))throw Error(i(40));return!!e._reactRootContainer&&(cu((function(){ec(null,null,e,!1,(function(){e._reactRootContainer=null,e[mo]=null}))})),!0)},t.unstable_batchedUpdates=uu,t.unstable_renderSubtreeIntoContainer=function(e,t,n,r){if(!Zu(n))throw Error(i(200));if(null==e||void 0===e._reactInternals)throw Error(i(38));return ec(e,t,n,!1,r)},t.version="18.2.0-next-9e3b772b8-20220608"},1250:function(e,t,n){"use strict";var r=n(4164);t.createRoot=r.createRoot,t.hydrateRoot=r.hydrateRoot},4164:function(e,t,n){"use strict";!function e(){if("undefined"!==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(4463)},6374:function(e,t,n){"use strict";var r=n(2791),o=Symbol.for("react.element"),i=Symbol.for("react.fragment"),a=Object.prototype.hasOwnProperty,l=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,s={key:!0,ref:!0,__self:!0,__source:!0};function u(e,t,n){var r,i={},u=null,c=null;for(r in void 0!==n&&(u=""+n),void 0!==t.key&&(u=""+t.key),void 0!==t.ref&&(c=t.ref),t)a.call(t,r)&&!s.hasOwnProperty(r)&&(i[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===i[r]&&(i[r]=t[r]);return{$$typeof:o,type:e,key:u,ref:c,props:i,_owner:l.current}}t.Fragment=i,t.jsx=u,t.jsxs=u},9117:function(e,t){"use strict";var n=Symbol.for("react.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),i=Symbol.for("react.strict_mode"),a=Symbol.for("react.profiler"),l=Symbol.for("react.provider"),s=Symbol.for("react.context"),u=Symbol.for("react.forward_ref"),c=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),f=Symbol.for("react.lazy"),p=Symbol.iterator;var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},m=Object.assign,v={};function g(e,t,n){this.props=e,this.context=t,this.refs=v,this.updater=n||h}function y(){}function x(e,t,n){this.props=e,this.context=t,this.refs=v,this.updater=n||h}g.prototype.isReactComponent={},g.prototype.setState=function(e,t){if("object"!==typeof e&&"function"!==typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},g.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},y.prototype=g.prototype;var b=x.prototype=new y;b.constructor=x,m(b,g.prototype),b.isPureReactComponent=!0;var w=Array.isArray,S=Object.prototype.hasOwnProperty,j={current:null},k={key:!0,ref:!0,__self:!0,__source:!0};function C(e,t,r){var o,i={},a=null,l=null;if(null!=t)for(o in void 0!==t.ref&&(l=t.ref),void 0!==t.key&&(a=""+t.key),t)S.call(t,o)&&!k.hasOwnProperty(o)&&(i[o]=t[o]);var s=arguments.length-2;if(1===s)i.children=r;else if(1<s){for(var u=Array(s),c=0;c<s;c++)u[c]=arguments[c+2];i.children=u}if(e&&e.defaultProps)for(o in s=e.defaultProps)void 0===i[o]&&(i[o]=s[o]);return{$$typeof:n,type:e,key:a,ref:l,props:i,_owner:j.current}}function R(e){return"object"===typeof e&&null!==e&&e.$$typeof===n}var T=/\/+/g;function O(e,t){return"object"===typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function P(e,t,o,i,a){var l=typeof e;"undefined"!==l&&"boolean"!==l||(e=null);var s=!1;if(null===e)s=!0;else switch(l){case"string":case"number":s=!0;break;case"object":switch(e.$$typeof){case n:case r:s=!0}}if(s)return a=a(s=e),e=""===i?"."+O(s,0):i,w(a)?(o="",null!=e&&(o=e.replace(T,"$&/")+"/"),P(a,t,o,"",(function(e){return e}))):null!=a&&(R(a)&&(a=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(a,o+(!a.key||s&&s.key===a.key?"":(""+a.key).replace(T,"$&/")+"/")+e)),t.push(a)),1;if(s=0,i=""===i?".":i+":",w(e))for(var u=0;u<e.length;u++){var c=i+O(l=e[u],u);s+=P(l,t,o,c,a)}else if(c=function(e){return null===e||"object"!==typeof e?null:"function"===typeof(e=p&&e[p]||e["@@iterator"])?e:null}(e),"function"===typeof c)for(e=c.call(e),u=0;!(l=e.next()).done;)s+=P(l=l.value,t,o,c=i+O(l,u++),a);else if("object"===l)throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return s}function E(e,t,n){if(null==e)return e;var r=[],o=0;return P(e,r,"","",(function(e){return t.call(n,e,o++)})),r}function M(e){if(-1===e._status){var t=e._result;(t=t()).then((function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)}),(function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)})),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var _={current:null},D={transition:null},I={ReactCurrentDispatcher:_,ReactCurrentBatchConfig:D,ReactCurrentOwner:j};t.Children={map:E,forEach:function(e,t,n){E(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return E(e,(function(){t++})),t},toArray:function(e){return E(e,(function(e){return e}))||[]},only:function(e){if(!R(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=g,t.Fragment=o,t.Profiler=a,t.PureComponent=x,t.StrictMode=i,t.Suspense=c,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=I,t.cloneElement=function(e,t,r){if(null===e||void 0===e)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var o=m({},e.props),i=e.key,a=e.ref,l=e._owner;if(null!=t){if(void 0!==t.ref&&(a=t.ref,l=j.current),void 0!==t.key&&(i=""+t.key),e.type&&e.type.defaultProps)var s=e.type.defaultProps;for(u in t)S.call(t,u)&&!k.hasOwnProperty(u)&&(o[u]=void 0===t[u]&&void 0!==s?s[u]:t[u])}var u=arguments.length-2;if(1===u)o.children=r;else if(1<u){s=Array(u);for(var c=0;c<u;c++)s[c]=arguments[c+2];o.children=s}return{$$typeof:n,type:e.type,key:i,ref:a,props:o,_owner:l}},t.createContext=function(e){return(e={$$typeof:s,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null}).Provider={$$typeof:l,_context:e},e.Consumer=e},t.createElement=C,t.createFactory=function(e){var t=C.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:u,render:e}},t.isValidElement=R,t.lazy=function(e){return{$$typeof:f,_payload:{_status:-1,_result:e},_init:M}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=D.transition;D.transition={};try{e()}finally{D.transition=t}},t.unstable_act=function(){throw Error("act(...) is not supported in production builds of React.")},t.useCallback=function(e,t){return _.current.useCallback(e,t)},t.useContext=function(e){return _.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return _.current.useDeferredValue(e)},t.useEffect=function(e,t){return _.current.useEffect(e,t)},t.useId=function(){return _.current.useId()},t.useImperativeHandle=function(e,t,n){return _.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return _.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return _.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return _.current.useMemo(e,t)},t.useReducer=function(e,t,n){return _.current.useReducer(e,t,n)},t.useRef=function(e){return _.current.useRef(e)},t.useState=function(e){return _.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return _.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return _.current.useTransition()},t.version="18.2.0"},2791:function(e,t,n){"use strict";e.exports=n(9117)},184:function(e,t,n){"use strict";e.exports=n(6374)},6813:function(e,t){"use strict";function n(e,t){var n=e.length;e.push(t);e:for(;0<n;){var r=n-1>>>1,o=e[r];if(!(0<i(o,t)))break e;e[r]=t,e[n]=o,n=r}}function r(e){return 0===e.length?null:e[0]}function o(e){if(0===e.length)return null;var t=e[0],n=e.pop();if(n!==t){e[0]=n;e:for(var r=0,o=e.length,a=o>>>1;r<a;){var l=2*(r+1)-1,s=e[l],u=l+1,c=e[u];if(0>i(s,n))u<o&&0>i(c,s)?(e[r]=c,e[u]=n,r=u):(e[r]=s,e[l]=n,r=l);else{if(!(u<o&&0>i(c,n)))break e;e[r]=c,e[u]=n,r=u}}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if("object"===typeof performance&&"function"===typeof performance.now){var a=performance;t.unstable_now=function(){return a.now()}}else{var l=Date,s=l.now();t.unstable_now=function(){return l.now()-s}}var u=[],c=[],d=1,f=null,p=3,h=!1,m=!1,v=!1,g="function"===typeof setTimeout?setTimeout:null,y="function"===typeof clearTimeout?clearTimeout:null,x="undefined"!==typeof setImmediate?setImmediate:null;function b(e){for(var t=r(c);null!==t;){if(null===t.callback)o(c);else{if(!(t.startTime<=e))break;o(c),t.sortIndex=t.expirationTime,n(u,t)}t=r(c)}}function w(e){if(v=!1,b(e),!m)if(null!==r(u))m=!0,D(S);else{var t=r(c);null!==t&&I(w,t.startTime-e)}}function S(e,n){m=!1,v&&(v=!1,y(R),R=-1),h=!0;var i=p;try{for(b(n),f=r(u);null!==f&&(!(f.expirationTime>n)||e&&!P());){var a=f.callback;if("function"===typeof a){f.callback=null,p=f.priorityLevel;var l=a(f.expirationTime<=n);n=t.unstable_now(),"function"===typeof l?f.callback=l:f===r(u)&&o(u),b(n)}else o(u);f=r(u)}if(null!==f)var s=!0;else{var d=r(c);null!==d&&I(w,d.startTime-n),s=!1}return s}finally{f=null,p=i,h=!1}}"undefined"!==typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);var j,k=!1,C=null,R=-1,T=5,O=-1;function P(){return!(t.unstable_now()-O<T)}function E(){if(null!==C){var e=t.unstable_now();O=e;var n=!0;try{n=C(!0,e)}finally{n?j():(k=!1,C=null)}}else k=!1}if("function"===typeof x)j=function(){x(E)};else if("undefined"!==typeof MessageChannel){var M=new MessageChannel,_=M.port2;M.port1.onmessage=E,j=function(){_.postMessage(null)}}else j=function(){g(E,0)};function D(e){C=e,k||(k=!0,j())}function I(e,n){R=g((function(){e(t.unstable_now())}),n)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){m||h||(m=!0,D(S))},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):T=0<e?Math.floor(1e3/e):5},t.unstable_getCurrentPriorityLevel=function(){return p},t.unstable_getFirstCallbackNode=function(){return r(u)},t.unstable_next=function(e){switch(p){case 1:case 2:case 3:var t=3;break;default:t=p}var n=p;p=t;try{return e()}finally{p=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=function(){},t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=p;p=e;try{return t()}finally{p=n}},t.unstable_scheduleCallback=function(e,o,i){var a=t.unstable_now();switch("object"===typeof i&&null!==i?i="number"===typeof(i=i.delay)&&0<i?a+i:a:i=a,e){case 1:var l=-1;break;case 2:l=250;break;case 5:l=1073741823;break;case 4:l=1e4;break;default:l=5e3}return e={id:d++,callback:o,priorityLevel:e,startTime:i,expirationTime:l=i+l,sortIndex:-1},i>a?(e.sortIndex=i,n(c,e),null===r(u)&&e===r(c)&&(v?(y(R),R=-1):v=!0,I(w,i-a))):(e.sortIndex=l,n(u,e),m||h||(m=!0,D(S))),e},t.unstable_shouldYield=P,t.unstable_wrapCallback=function(e){var t=p;return function(){var n=p;p=t;try{return e.apply(this,arguments)}finally{p=n}}}},5296:function(e,t,n){"use strict";e.exports=n(6813)},581:function(e,t,n){"use strict";var r=n(2506),o=n(4037),i=n(2584),a=r("%TypeError%"),l=r("%WeakMap%",!0),s=r("%Map%",!0),u=o("WeakMap.prototype.get",!0),c=o("WeakMap.prototype.set",!0),d=o("WeakMap.prototype.has",!0),f=o("Map.prototype.get",!0),p=o("Map.prototype.set",!0),h=o("Map.prototype.has",!0),m=function(e,t){for(var n,r=e;null!==(n=r.next);r=n)if(n.key===t)return r.next=n.next,n.next=e.next,e.next=n,n};e.exports=function(){var e,t,n,r={assert:function(e){if(!r.has(e))throw new a("Side channel does not contain "+i(e))},get:function(r){if(l&&r&&("object"===typeof r||"function"===typeof r)){if(e)return u(e,r)}else if(s){if(t)return f(t,r)}else if(n)return function(e,t){var n=m(e,t);return n&&n.value}(n,r)},has:function(r){if(l&&r&&("object"===typeof r||"function"===typeof r)){if(e)return d(e,r)}else if(s){if(t)return h(t,r)}else if(n)return function(e,t){return!!m(e,t)}(n,r);return!1},set:function(r,o){l&&r&&("object"===typeof r||"function"===typeof r)?(e||(e=new l),c(e,r,o)):s?(t||(t=new s),p(t,r,o)):(n||(n={key:{},next:null}),function(e,t,n){var r=m(e,t);r?r.value=n:e.next={key:t,next:e.next,value:n}}(n,r,o))}};return r}},1561:function(e,t,n){"use strict";var r=n(2791);var o="function"===typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e===1/t)||e!==e&&t!==t},i=r.useState,a=r.useEffect,l=r.useLayoutEffect,s=r.useDebugValue;function u(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!o(e,n)}catch(r){return!0}}var c="undefined"===typeof window||"undefined"===typeof window.document||"undefined"===typeof window.document.createElement?function(e,t){return t()}:function(e,t){var n=t(),r=i({inst:{value:n,getSnapshot:t}}),o=r[0].inst,c=r[1];return l((function(){o.value=n,o.getSnapshot=t,u(o)&&c({inst:o})}),[e,n,t]),a((function(){return u(o)&&c({inst:o}),e((function(){u(o)&&c({inst:o})}))}),[e]),s(n),n};t.useSyncExternalStore=void 0!==r.useSyncExternalStore?r.useSyncExternalStore:c},7248:function(e,t,n){"use strict";e.exports=n(1561)},4654:function(){},3897:function(e){e.exports=function(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r},e.exports.__esModule=!0,e.exports.default=e.exports},5372:function(e){e.exports=function(e){if(Array.isArray(e))return e},e.exports.__esModule=!0,e.exports.default=e.exports},3405:function(e,t,n){var r=n(3897);e.exports=function(e){if(Array.isArray(e))return r(e)},e.exports.__esModule=!0,e.exports.default=e.exports},6115:function(e){e.exports=function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e},e.exports.__esModule=!0,e.exports.default=e.exports},7156:function(e){function t(e,t,n,r,o,i,a){try{var l=e[i](a),s=l.value}catch(u){return void n(u)}l.done?t(s):Promise.resolve(s).then(r,o)}e.exports=function(e){return function(){var n=this,r=arguments;return new Promise((function(o,i){var a=e.apply(n,r);function l(e){t(a,o,i,l,s,"next",e)}function s(e){t(a,o,i,l,s,"throw",e)}l(void 0)}))}},e.exports.__esModule=!0,e.exports.default=e.exports},6690:function(e){e.exports=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},e.exports.__esModule=!0,e.exports.default=e.exports},9728:function(e){function t(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}e.exports=function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e},e.exports.__esModule=!0,e.exports.default=e.exports},6389:function(e,t,n){var r=n(3808),o=n(9617),i=n(4993);e.exports=function(e){var t=o();return function(){var n,o=r(e);if(t){var a=r(this).constructor;n=Reflect.construct(o,arguments,a)}else n=o.apply(this,arguments);return i(this,n)}},e.exports.__esModule=!0,e.exports.default=e.exports},8416:function(e){e.exports=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e},e.exports.__esModule=!0,e.exports.default=e.exports},1588:function(e,t,n){var r=n(1753);function o(){return"undefined"!==typeof Reflect&&Reflect.get?(e.exports=o=Reflect.get.bind(),e.exports.__esModule=!0,e.exports.default=e.exports):(e.exports=o=function(e,t,n){var o=r(e,t);if(o){var i=Object.getOwnPropertyDescriptor(o,t);return i.get?i.get.call(arguments.length<3?e:n):i.value}},e.exports.__esModule=!0,e.exports.default=e.exports),o.apply(this,arguments)}e.exports=o,e.exports.__esModule=!0,e.exports.default=e.exports},3808:function(e){function t(n){return e.exports=t=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},e.exports.__esModule=!0,e.exports.default=e.exports,t(n)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},1655:function(e,t,n){var r=n(6015);e.exports=function(e,t){if("function"!==typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&r(e,t)},e.exports.__esModule=!0,e.exports.default=e.exports},9617:function(e){e.exports=function(){if("undefined"===typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"===typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}},e.exports.__esModule=!0,e.exports.default=e.exports},9498:function(e){e.exports=function(e){if("undefined"!==typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)},e.exports.__esModule=!0,e.exports.default=e.exports},8872:function(e){e.exports=function(e,t){var n=null==e?null:"undefined"!==typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,i=[],a=!0,l=!1;try{for(n=n.call(e);!(a=(r=n.next()).done)&&(i.push(r.value),!t||i.length!==t);a=!0);}catch(s){l=!0,o=s}finally{try{a||null==n.return||n.return()}finally{if(l)throw o}}return i}},e.exports.__esModule=!0,e.exports.default=e.exports},2218:function(e){e.exports=function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")},e.exports.__esModule=!0,e.exports.default=e.exports},2281:function(e){e.exports=function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")},e.exports.__esModule=!0,e.exports.default=e.exports},2122:function(e,t,n){var r=n(8416);function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}e.exports=function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach((function(t){r(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e},e.exports.__esModule=!0,e.exports.default=e.exports},215:function(e,t,n){var r=n(7071);e.exports=function(e,t){if(null==e)return{};var n,o,i=r(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)n=a[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i},e.exports.__esModule=!0,e.exports.default=e.exports},7071:function(e){e.exports=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o},e.exports.__esModule=!0,e.exports.default=e.exports},4993:function(e,t,n){var r=n(8698).default,o=n(6115);e.exports=function(e,t){if(t&&("object"===r(t)||"function"===typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return o(e)},e.exports.__esModule=!0,e.exports.default=e.exports},7061:function(e,t,n){var r=n(8698).default;function o(){"use strict";e.exports=o=function(){return t},e.exports.__esModule=!0,e.exports.default=e.exports;var t={},n=Object.prototype,i=n.hasOwnProperty,a="function"==typeof Symbol?Symbol:{},l=a.iterator||"@@iterator",s=a.asyncIterator||"@@asyncIterator",u=a.toStringTag||"@@toStringTag";function c(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{c({},"")}catch(P){c=function(e,t,n){return e[t]=n}}function d(e,t,n,r){var o=t&&t.prototype instanceof h?t:h,i=Object.create(o.prototype),a=new R(r||[]);return i._invoke=function(e,t,n){var r="suspendedStart";return function(o,i){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===o)throw i;return O()}for(n.method=o,n.arg=i;;){var a=n.delegate;if(a){var l=j(a,n);if(l){if(l===p)continue;return l}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===r)throw r="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r="executing";var s=f(e,t,n);if("normal"===s.type){if(r=n.done?"completed":"suspendedYield",s.arg===p)continue;return{value:s.arg,done:n.done}}"throw"===s.type&&(r="completed",n.method="throw",n.arg=s.arg)}}}(e,n,a),i}function f(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(P){return{type:"throw",arg:P}}}t.wrap=d;var p={};function h(){}function m(){}function v(){}var g={};c(g,l,(function(){return this}));var y=Object.getPrototypeOf,x=y&&y(y(T([])));x&&x!==n&&i.call(x,l)&&(g=x);var b=v.prototype=h.prototype=Object.create(g);function w(e){["next","throw","return"].forEach((function(t){c(e,t,(function(e){return this._invoke(t,e)}))}))}function S(e,t){function n(o,a,l,s){var u=f(e[o],e,a);if("throw"!==u.type){var c=u.arg,d=c.value;return d&&"object"==r(d)&&i.call(d,"__await")?t.resolve(d.__await).then((function(e){n("next",e,l,s)}),(function(e){n("throw",e,l,s)})):t.resolve(d).then((function(e){c.value=e,l(c)}),(function(e){return n("throw",e,l,s)}))}s(u.arg)}var o;this._invoke=function(e,r){function i(){return new t((function(t,o){n(e,r,t,o)}))}return o=o?o.then(i,i):i()}}function j(e,t){var n=e.iterator[t.method];if(void 0===n){if(t.delegate=null,"throw"===t.method){if(e.iterator.return&&(t.method="return",t.arg=void 0,j(e,t),"throw"===t.method))return p;t.method="throw",t.arg=new TypeError("The iterator does not provide a 'throw' method")}return p}var r=f(n,e.iterator,t.arg);if("throw"===r.type)return t.method="throw",t.arg=r.arg,t.delegate=null,p;var o=r.arg;return o?o.done?(t[e.resultName]=o.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=void 0),t.delegate=null,p):o:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,p)}function k(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function C(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function R(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(k,this),this.reset(!0)}function T(e){if(e){var t=e[l];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var n=-1,r=function t(){for(;++n<e.length;)if(i.call(e,n))return t.value=e[n],t.done=!1,t;return t.value=void 0,t.done=!0,t};return r.next=r}}return{next:O}}function O(){return{value:void 0,done:!0}}return m.prototype=v,c(b,"constructor",v),c(v,"constructor",m),m.displayName=c(v,u,"GeneratorFunction"),t.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===m||"GeneratorFunction"===(t.displayName||t.name))},t.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,v):(e.__proto__=v,c(e,u,"GeneratorFunction")),e.prototype=Object.create(b),e},t.awrap=function(e){return{__await:e}},w(S.prototype),c(S.prototype,s,(function(){return this})),t.AsyncIterator=S,t.async=function(e,n,r,o,i){void 0===i&&(i=Promise);var a=new S(d(e,n,r,o),i);return t.isGeneratorFunction(n)?a:a.next().then((function(e){return e.done?e.value:a.next()}))},w(b),c(b,u,"Generator"),c(b,l,(function(){return this})),c(b,"toString",(function(){return"[object Generator]"})),t.keys=function(e){var t=[];for(var n in e)t.push(n);return t.reverse(),function n(){for(;t.length;){var r=t.pop();if(r in e)return n.value=r,n.done=!1,n}return n.done=!0,n}},t.values=T,R.prototype={constructor:R,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,this.tryEntries.forEach(C),!e)for(var t in this)"t"===t.charAt(0)&&i.call(this,t)&&!isNaN(+t.slice(1))&&(this[t]=void 0)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var t=this;function n(n,r){return a.type="throw",a.arg=e,t.next=n,r&&(t.method="next",t.arg=void 0),!!r}for(var r=this.tryEntries.length-1;r>=0;--r){var o=this.tryEntries[r],a=o.completion;if("root"===o.tryLoc)return n("end");if(o.tryLoc<=this.prev){var l=i.call(o,"catchLoc"),s=i.call(o,"finallyLoc");if(l&&s){if(this.prev<o.catchLoc)return n(o.catchLoc,!0);if(this.prev<o.finallyLoc)return n(o.finallyLoc)}else if(l){if(this.prev<o.catchLoc)return n(o.catchLoc,!0)}else{if(!s)throw new Error("try statement without catch or finally");if(this.prev<o.finallyLoc)return n(o.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&i.call(r,"finallyLoc")&&this.prev<r.finallyLoc){var o=r;break}}o&&("break"===e||"continue"===e)&&o.tryLoc<=t&&t<=o.finallyLoc&&(o=null);var a=o?o.completion:{};return a.type=e,a.arg=t,o?(this.method="next",this.next=o.finallyLoc,p):this.complete(a)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),p},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),C(n),p}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var o=r.arg;C(n)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:T(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),p}},t}e.exports=o,e.exports.__esModule=!0,e.exports.default=e.exports},6015:function(e){function t(n,r){return e.exports=t=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},e.exports.__esModule=!0,e.exports.default=e.exports,t(n,r)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},7424:function(e,t,n){var r=n(5372),o=n(8872),i=n(6116),a=n(2218);e.exports=function(e,t){return r(e)||o(e,t)||i(e,t)||a()},e.exports.__esModule=!0,e.exports.default=e.exports},1753:function(e,t,n){var r=n(3808);e.exports=function(e,t){for(;!Object.prototype.hasOwnProperty.call(e,t)&&null!==(e=r(e)););return e},e.exports.__esModule=!0,e.exports.default=e.exports},861:function(e,t,n){var r=n(3405),o=n(9498),i=n(6116),a=n(2281);e.exports=function(e){return r(e)||o(e)||i(e)||a()},e.exports.__esModule=!0,e.exports.default=e.exports},8698:function(e){function t(n){return e.exports=t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.__esModule=!0,e.exports.default=e.exports,t(n)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},6116:function(e,t,n){var r=n(3897);e.exports=function(e,t){if(e){if("string"===typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(e,t):void 0}},e.exports.__esModule=!0,e.exports.default=e.exports}},t={};function n(r){var o=t[r];if(void 0!==o)return o.exports;var i=t[r]={id:r,loaded:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.loaded=!0,i.exports}n.m=e,n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,{a:t}),t},function(){var e,t=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__};n.t=function(r,o){if(1&o&&(r=this(r)),8&o)return r;if("object"===typeof r&&r){if(4&o&&r.__esModule)return r;if(16&o&&"function"===typeof r.then)return r}var i=Object.create(null);n.r(i);var a={};e=e||[null,t({}),t([]),t(t)];for(var l=2&o&&r;"object"==typeof l&&!~e.indexOf(l);l=t(l))Object.getOwnPropertyNames(l).forEach((function(e){a[e]=function(){return r[e]}}));return a.default=function(){return r},n.d(i,a),i}}(),n.d=function(e,t){for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.f={},n.e=function(e){return Promise.all(Object.keys(n.f).reduce((function(t,r){return n.f[r](e,t),t}),[]))},n.u=function(e){return"static/js/"+e+".6fe45b4d.chunk.js"},n.miniCssF=function(e){},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},function(){var e={},t="medx-relay:";n.l=function(r,o,i,a){if(e[r])e[r].push(o);else{var l,s;if(void 0!==i)for(var u=document.getElementsByTagName("script"),c=0;c<u.length;c++){var d=u[c];if(d.getAttribute("src")==r||d.getAttribute("data-webpack")==t+i){l=d;break}}l||(s=!0,(l=document.createElement("script")).charset="utf-8",l.timeout=120,n.nc&&l.setAttribute("nonce",n.nc),l.setAttribute("data-webpack",t+i),l.src=r),e[r]=[o];var f=function(t,n){l.onerror=l.onload=null,clearTimeout(p);var o=e[r];if(delete e[r],l.parentNode&&l.parentNode.removeChild(l),o&&o.forEach((function(e){return e(n)})),t)return t(n)},p=setTimeout(f.bind(null,void 0,{type:"timeout",target:l}),12e4);l.onerror=f.bind(null,l.onerror),l.onload=f.bind(null,l.onload),s&&document.head.appendChild(l)}}}(),n.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nmd=function(e){return e.paths=[],e.children||(e.children=[]),e},n.p="./",function(){var e={179:0};n.f.j=function(t,r){var o=n.o(e,t)?e[t]:void 0;if(0!==o)if(o)r.push(o[2]);else{var i=new Promise((function(n,r){o=e[t]=[n,r]}));r.push(o[2]=i);var a=n.p+n.u(t),l=new Error;n.l(a,(function(r){if(n.o(e,t)&&(0!==(o=e[t])&&(e[t]=void 0),o)){var i=r&&("load"===r.type?"missing":r.type),a=r&&r.target&&r.target.src;l.message="Loading chunk "+t+" failed.\n("+i+": "+a+")",l.name="ChunkLoadError",l.type=i,l.request=a,o[1](l)}}),"chunk-"+t,t)}};var t=function(t,r){var o,i,a=r[0],l=r[1],s=r[2],u=0;if(a.some((function(t){return 0!==e[t]}))){for(o in l)n.o(l,o)&&(n.m[o]=l[o]);if(s)s(n)}for(t&&t(r);u<a.length;u++)i=a[u],n.o(e,i)&&e[i]&&e[i][0](),e[i]=0},r=self.webpackChunkmedx_relay=self.webpackChunkmedx_relay||[];r.forEach(t.bind(null,0)),r.push=t.bind(null,r.push.bind(r))}(),function(){"use strict";var e=n(2791),t=n.t(e,2);function r(){return r=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},r.apply(this,arguments)}var o=e.createContext(null);function i(){return e.useContext(o)}var a="function"===typeof Symbol&&Symbol.for?Symbol.for("mui.nested"):"__THEME_NESTED__",l=n(184);var s=function(t){var n=t.children,s=t.theme,u=i(),c=e.useMemo((function(){var e=null===u?s:function(e,t){return"function"===typeof t?t(e):r({},e,t)}(u,s);return null!=e&&(e[a]=null!==u),e}),[s,u]);return(0,l.jsx)(o.Provider,{value:c,children:n})};var u=function(){function e(e){var t=this;this._insertTag=function(e){var n;n=0===t.tags.length?t.insertionPoint?t.insertionPoint.nextSibling:t.prepend?t.container.firstChild:t.before:t.tags[t.tags.length-1].nextSibling,t.container.insertBefore(e,n),t.tags.push(e)},this.isSpeedy=void 0===e.speedy||e.speedy,this.tags=[],this.ctr=0,this.nonce=e.nonce,this.key=e.key,this.container=e.container,this.prepend=e.prepend,this.insertionPoint=e.insertionPoint,this.before=null}var t=e.prototype;return t.hydrate=function(e){e.forEach(this._insertTag)},t.insert=function(e){this.ctr%(this.isSpeedy?65e3:1)===0&&this._insertTag(function(e){var t=document.createElement("style");return t.setAttribute("data-emotion",e.key),void 0!==e.nonce&&t.setAttribute("nonce",e.nonce),t.appendChild(document.createTextNode("")),t.setAttribute("data-s",""),t}(this));var t=this.tags[this.tags.length-1];if(this.isSpeedy){var n=function(e){if(e.sheet)return e.sheet;for(var t=0;t<document.styleSheets.length;t++)if(document.styleSheets[t].ownerNode===e)return document.styleSheets[t]}(t);try{n.insertRule(e,n.cssRules.length)}catch(r){0}}else t.appendChild(document.createTextNode(e));this.ctr++},t.flush=function(){this.tags.forEach((function(e){return e.parentNode&&e.parentNode.removeChild(e)})),this.tags=[],this.ctr=0},e}(),c=Math.abs,d=String.fromCharCode,f=Object.assign;function p(e){return e.trim()}function h(e,t,n){return e.replace(t,n)}function m(e,t){return e.indexOf(t)}function v(e,t){return 0|e.charCodeAt(t)}function g(e,t,n){return e.slice(t,n)}function y(e){return e.length}function x(e){return e.length}function b(e,t){return t.push(e),e}var w=1,S=1,j=0,k=0,C=0,R="";function T(e,t,n,r,o,i,a){return{value:e,root:t,parent:n,type:r,props:o,children:i,line:w,column:S,length:a,return:""}}function O(e,t){return f(T("",null,null,"",null,null,0),e,{length:-e.length},t)}function P(){return C=k>0?v(R,--k):0,S--,10===C&&(S=1,w--),C}function E(){return C=k<j?v(R,k++):0,S++,10===C&&(S=1,w++),C}function M(){return v(R,k)}function _(){return k}function D(e,t){return g(R,e,t)}function I(e){switch(e){case 0:case 9:case 10:case 13:case 32:return 5;case 33:case 43:case 44:case 47:case 62:case 64:case 126:case 59:case 123:case 125:return 4;case 58:return 3;case 34:case 39:case 40:case 91:return 2;case 41:case 93:return 1}return 0}function A(e){return w=S=1,j=y(R=e),k=0,[]}function N(e){return R="",e}function L(e){return p(D(k-1,W(91===e?e+2:40===e?e+1:e)))}function z(e){for(;(C=M())&&C<33;)E();return I(e)>2||I(C)>3?"":" "}function F(e,t){for(;--t&&E()&&!(C<48||C>102||C>57&&C<65||C>70&&C<97););return D(e,_()+(t<6&&32==M()&&32==E()))}function W(e){for(;E();)switch(C){case e:return k;case 34:case 39:34!==e&&39!==e&&W(C);break;case 40:41===e&&W(e);break;case 92:E()}return k}function B(e,t){for(;E()&&e+C!==57&&(e+C!==84||47!==M()););return"/*"+D(t,k-1)+"*"+d(47===e?e:E())}function V(e){for(;!I(M());)E();return D(e,k)}var q="-ms-",H="-moz-",U="-webkit-",Y="comm",G="rule",Q="decl",$="@keyframes";function K(e,t){for(var n="",r=x(e),o=0;o<r;o++)n+=t(e[o],o,e,t)||"";return n}function X(e,t,n,r){switch(e.type){case"@import":case Q:return e.return=e.return||e.value;case Y:return"";case $:return e.return=e.value+"{"+K(e.children,r)+"}";case G:e.value=e.props.join(",")}return y(n=K(e.children,r))?e.return=e.value+"{"+n+"}":""}function Z(e,t){switch(function(e,t){return(((t<<2^v(e,0))<<2^v(e,1))<<2^v(e,2))<<2^v(e,3)}(e,t)){case 5103:return U+"print-"+e+e;case 5737:case 4201:case 3177:case 3433:case 1641:case 4457:case 2921:case 5572:case 6356:case 5844:case 3191:case 6645:case 3005:case 6391:case 5879:case 5623:case 6135:case 4599:case 4855:case 4215:case 6389:case 5109:case 5365:case 5621:case 3829:return U+e+e;case 5349:case 4246:case 4810:case 6968:case 2756:return U+e+H+e+q+e+e;case 6828:case 4268:return U+e+q+e+e;case 6165:return U+e+q+"flex-"+e+e;case 5187:return U+e+h(e,/(\w+).+(:[^]+)/,"-webkit-box-$1$2-ms-flex-$1$2")+e;case 5443:return U+e+q+"flex-item-"+h(e,/flex-|-self/,"")+e;case 4675:return U+e+q+"flex-line-pack"+h(e,/align-content|flex-|-self/,"")+e;case 5548:return U+e+q+h(e,"shrink","negative")+e;case 5292:return U+e+q+h(e,"basis","preferred-size")+e;case 6060:return U+"box-"+h(e,"-grow","")+U+e+q+h(e,"grow","positive")+e;case 4554:return U+h(e,/([^-])(transform)/g,"$1-webkit-$2")+e;case 6187:return h(h(h(e,/(zoom-|grab)/,U+"$1"),/(image-set)/,U+"$1"),e,"")+e;case 5495:case 3959:return h(e,/(image-set\([^]*)/,U+"$1$`$1");case 4968:return h(h(e,/(.+:)(flex-)?(.*)/,"-webkit-box-pack:$3-ms-flex-pack:$3"),/s.+-b[^;]+/,"justify")+U+e+e;case 4095:case 3583:case 4068:case 2532:return h(e,/(.+)-inline(.+)/,U+"$1$2")+e;case 8116:case 7059:case 5753:case 5535:case 5445:case 5701:case 4933:case 4677:case 5533:case 5789:case 5021:case 4765:if(y(e)-1-t>6)switch(v(e,t+1)){case 109:if(45!==v(e,t+4))break;case 102:return h(e,/(.+:)(.+)-([^]+)/,"$1-webkit-$2-$3$1"+H+(108==v(e,t+3)?"$3":"$2-$3"))+e;case 115:return~m(e,"stretch")?Z(h(e,"stretch","fill-available"),t)+e:e}break;case 4949:if(115!==v(e,t+1))break;case 6444:switch(v(e,y(e)-3-(~m(e,"!important")&&10))){case 107:return h(e,":",":"+U)+e;case 101:return h(e,/(.+:)([^;!]+)(;|!.+)?/,"$1"+U+(45===v(e,14)?"inline-":"")+"box$3$1"+U+"$2$3$1"+q+"$2box$3")+e}break;case 5936:switch(v(e,t+11)){case 114:return U+e+q+h(e,/[svh]\w+-[tblr]{2}/,"tb")+e;case 108:return U+e+q+h(e,/[svh]\w+-[tblr]{2}/,"tb-rl")+e;case 45:return U+e+q+h(e,/[svh]\w+-[tblr]{2}/,"lr")+e}return U+e+q+e+e}return e}function J(e){return N(ee("",null,null,null,[""],e=A(e),0,[0],e))}function ee(e,t,n,r,o,i,a,l,s){for(var u=0,c=0,f=a,p=0,v=0,g=0,x=1,w=1,S=1,j=0,k="",C=o,R=i,T=r,O=k;w;)switch(g=j,j=E()){case 40:if(108!=g&&58==O.charCodeAt(f-1)){-1!=m(O+=h(L(j),"&","&\f"),"&\f")&&(S=-1);break}case 34:case 39:case 91:O+=L(j);break;case 9:case 10:case 13:case 32:O+=z(g);break;case 92:O+=F(_()-1,7);continue;case 47:switch(M()){case 42:case 47:b(ne(B(E(),_()),t,n),s);break;default:O+="/"}break;case 123*x:l[u++]=y(O)*S;case 125*x:case 59:case 0:switch(j){case 0:case 125:w=0;case 59+c:v>0&&y(O)-f&&b(v>32?re(O+";",r,n,f-1):re(h(O," ","")+";",r,n,f-2),s);break;case 59:O+=";";default:if(b(T=te(O,t,n,u,c,o,l,k,C=[],R=[],f),i),123===j)if(0===c)ee(O,t,T,T,C,i,f,l,R);else switch(p){case 100:case 109:case 115:ee(e,T,T,r&&b(te(e,T,T,0,0,o,l,k,o,C=[],f),R),o,R,f,l,r?C:R);break;default:ee(O,T,T,T,[""],R,0,l,R)}}u=c=v=0,x=S=1,k=O="",f=a;break;case 58:f=1+y(O),v=g;default:if(x<1)if(123==j)--x;else if(125==j&&0==x++&&125==P())continue;switch(O+=d(j),j*x){case 38:S=c>0?1:(O+="\f",-1);break;case 44:l[u++]=(y(O)-1)*S,S=1;break;case 64:45===M()&&(O+=L(E())),p=M(),c=f=y(k=O+=V(_())),j++;break;case 45:45===g&&2==y(O)&&(x=0)}}return i}function te(e,t,n,r,o,i,a,l,s,u,d){for(var f=o-1,m=0===o?i:[""],v=x(m),y=0,b=0,w=0;y<r;++y)for(var S=0,j=g(e,f+1,f=c(b=a[y])),k=e;S<v;++S)(k=p(b>0?m[S]+" "+j:h(j,/&\f/g,m[S])))&&(s[w++]=k);return T(e,t,n,0===o?G:l,s,u,d)}function ne(e,t,n){return T(e,t,n,Y,d(C),g(e,2,-2),0)}function re(e,t,n,r){return T(e,t,n,Q,g(e,0,r),g(e,r+1,-1),r)}var oe=function(e,t,n){for(var r=0,o=0;r=o,o=M(),38===r&&12===o&&(t[n]=1),!I(o);)E();return D(e,k)},ie=function(e,t){return N(function(e,t){var n=-1,r=44;do{switch(I(r)){case 0:38===r&&12===M()&&(t[n]=1),e[n]+=oe(k-1,t,n);break;case 2:e[n]+=L(r);break;case 4:if(44===r){e[++n]=58===M()?"&\f":"",t[n]=e[n].length;break}default:e[n]+=d(r)}}while(r=E());return e}(A(e),t))},ae=new WeakMap,le=function(e){if("rule"===e.type&&e.parent&&!(e.length<1)){for(var t=e.value,n=e.parent,r=e.column===n.column&&e.line===n.line;"rule"!==n.type;)if(!(n=n.parent))return;if((1!==e.props.length||58===t.charCodeAt(0)||ae.get(n))&&!r){ae.set(e,!0);for(var o=[],i=ie(t,o),a=n.props,l=0,s=0;l<i.length;l++)for(var u=0;u<a.length;u++,s++)e.props[s]=o[l]?i[l].replace(/&\f/g,a[u]):a[u]+" "+i[l]}}},se=function(e){if("decl"===e.type){var t=e.value;108===t.charCodeAt(0)&&98===t.charCodeAt(2)&&(e.return="",e.value="")}},ue=[function(e,t,n,r){if(e.length>-1&&!e.return)switch(e.type){case Q:e.return=Z(e.value,e.length);break;case $:return K([O(e,{value:h(e.value,"@","@"+U)})],r);case G:if(e.length)return function(e,t){return e.map(t).join("")}(e.props,(function(t){switch(function(e,t){return(e=t.exec(e))?e[0]:e}(t,/(::plac\w+|:read-\w+)/)){case":read-only":case":read-write":return K([O(e,{props:[h(t,/:(read-\w+)/,":-moz-$1")]})],r);case"::placeholder":return K([O(e,{props:[h(t,/:(plac\w+)/,":-webkit-input-$1")]}),O(e,{props:[h(t,/:(plac\w+)/,":-moz-$1")]}),O(e,{props:[h(t,/:(plac\w+)/,q+"input-$1")]})],r)}return""}))}}],ce=function(e){var t=e.key;if("css"===t){var n=document.querySelectorAll("style[data-emotion]:not([data-s])");Array.prototype.forEach.call(n,(function(e){-1!==e.getAttribute("data-emotion").indexOf(" ")&&(document.head.appendChild(e),e.setAttribute("data-s",""))}))}var r=e.stylisPlugins||ue;var o,i,a={},l=[];o=e.container||document.head,Array.prototype.forEach.call(document.querySelectorAll('style[data-emotion^="'+t+' "]'),(function(e){for(var t=e.getAttribute("data-emotion").split(" "),n=1;n<t.length;n++)a[t[n]]=!0;l.push(e)}));var s,c,d=[X,(c=function(e){s.insert(e)},function(e){e.root||(e=e.return)&&c(e)})],f=function(e){var t=x(e);return function(n,r,o,i){for(var a="",l=0;l<t;l++)a+=e[l](n,r,o,i)||"";return a}}([le,se].concat(r,d));i=function(e,t,n,r){s=n,function(e){K(J(e),f)}(e?e+"{"+t.styles+"}":t.styles),r&&(p.inserted[t.name]=!0)};var p={key:t,sheet:new u({key:t,container:o,nonce:e.nonce,speedy:e.speedy,prepend:e.prepend,insertionPoint:e.insertionPoint}),nonce:e.nonce,inserted:a,registered:{},insert:i};return p.sheet.hydrate(l),p};var de=function(e){for(var t,n=0,r=0,o=e.length;o>=4;++r,o-=4)t=1540483477*(65535&(t=255&e.charCodeAt(r)|(255&e.charCodeAt(++r))<<8|(255&e.charCodeAt(++r))<<16|(255&e.charCodeAt(++r))<<24))+(59797*(t>>>16)<<16),n=1540483477*(65535&(t^=t>>>24))+(59797*(t>>>16)<<16)^1540483477*(65535&n)+(59797*(n>>>16)<<16);switch(o){case 3:n^=(255&e.charCodeAt(r+2))<<16;case 2:n^=(255&e.charCodeAt(r+1))<<8;case 1:n=1540483477*(65535&(n^=255&e.charCodeAt(r)))+(59797*(n>>>16)<<16)}return(((n=1540483477*(65535&(n^=n>>>13))+(59797*(n>>>16)<<16))^n>>>15)>>>0).toString(36)},fe={animationIterationCount:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1};var pe=function(e){var t=Object.create(null);return function(n){return void 0===t[n]&&(t[n]=e(n)),t[n]}},he=/[A-Z]|^ms/g,me=/_EMO_([^_]+?)_([^]*?)_EMO_/g,ve=function(e){return 45===e.charCodeAt(1)},ge=function(e){return null!=e&&"boolean"!==typeof e},ye=pe((function(e){return ve(e)?e:e.replace(he,"-$&").toLowerCase()})),xe=function(e,t){switch(e){case"animation":case"animationName":if("string"===typeof t)return t.replace(me,(function(e,t,n){return we={name:t,styles:n,next:we},t}))}return 1===fe[e]||ve(e)||"number"!==typeof t||0===t?t:t+"px"};function be(e,t,n){if(null==n)return"";if(void 0!==n.__emotion_styles)return n;switch(typeof n){case"boolean":return"";case"object":if(1===n.anim)return we={name:n.name,styles:n.styles,next:we},n.name;if(void 0!==n.styles){var r=n.next;if(void 0!==r)for(;void 0!==r;)we={name:r.name,styles:r.styles,next:we},r=r.next;return n.styles+";"}return function(e,t,n){var r="";if(Array.isArray(n))for(var o=0;o<n.length;o++)r+=be(e,t,n[o])+";";else for(var i in n){var a=n[i];if("object"!==typeof a)null!=t&&void 0!==t[a]?r+=i+"{"+t[a]+"}":ge(a)&&(r+=ye(i)+":"+xe(i,a)+";");else if(!Array.isArray(a)||"string"!==typeof a[0]||null!=t&&void 0!==t[a[0]]){var l=be(e,t,a);switch(i){case"animation":case"animationName":r+=ye(i)+":"+l+";";break;default:r+=i+"{"+l+"}"}}else for(var s=0;s<a.length;s++)ge(a[s])&&(r+=ye(i)+":"+xe(i,a[s])+";")}return r}(e,t,n);case"function":if(void 0!==e){var o=we,i=n(e);return we=o,be(e,t,i)}}if(null==t)return n;var a=t[n];return void 0!==a?a:n}var we,Se=/label:\s*([^\s;\n{]+)\s*(;|$)/g;var je=function(e,t,n){if(1===e.length&&"object"===typeof e[0]&&null!==e[0]&&void 0!==e[0].styles)return e[0];var r=!0,o="";we=void 0;var i=e[0];null==i||void 0===i.raw?(r=!1,o+=be(n,t,i)):o+=i[0];for(var a=1;a<e.length;a++)o+=be(n,t,e[a]),r&&(o+=i[a]);Se.lastIndex=0;for(var l,s="";null!==(l=Se.exec(o));)s+="-"+l[1];return{name:de(o)+s,styles:o,next:we}},ke=(0,e.createContext)("undefined"!==typeof HTMLElement?ce({key:"css"}):null);ke.Provider;var Ce=function(t){return(0,e.forwardRef)((function(n,r){var o=(0,e.useContext)(ke);return t(n,o,r)}))},Re=(0,e.createContext)({});t.useInsertionEffect&&t.useInsertionEffect;function Te(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}function Oe(e){return null!==e&&"object"===typeof e&&e.constructor===Object}function Pe(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{clone:!0},o=n.clone?r({},e):e;return Oe(e)&&Oe(t)&&Object.keys(t).forEach((function(r){"__proto__"!==r&&(Oe(t[r])&&r in e&&Oe(e[r])?o[r]=Pe(e[r],t[r],n):o[r]=t[r])})),o}function Ee(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var Me=["values","unit","step"];function _e(e){var t=e.values,n=void 0===t?{xs:0,sm:600,md:900,lg:1200,xl:1536}:t,o=e.unit,i=void 0===o?"px":o,a=e.step,l=void 0===a?5:a,s=Te(e,Me),u=function(e){var t=Object.keys(e).map((function(t){return{key:t,val:e[t]}}))||[];return t.sort((function(e,t){return e.val-t.val})),t.reduce((function(e,t){return r({},e,Ee({},t.key,t.val))}),{})}(n),c=Object.keys(u);function d(e){var t="number"===typeof n[e]?n[e]:e;return"@media (min-width:".concat(t).concat(i,")")}function f(e){var t="number"===typeof n[e]?n[e]:e;return"@media (max-width:".concat(t-l/100).concat(i,")")}function p(e,t){var r=c.indexOf(t);return"@media (min-width:".concat("number"===typeof n[e]?n[e]:e).concat(i,") and ")+"(max-width:".concat((-1!==r&&"number"===typeof n[c[r]]?n[c[r]]:t)-l/100).concat(i,")")}return r({keys:c,values:u,up:d,down:f,between:p,only:function(e){return c.indexOf(e)+1<c.length?p(e,c[c.indexOf(e)+1]):d(e)},not:function(e){var t=c.indexOf(e);return 0===t?d(c[1]):t===c.length-1?f(c[t]):p(e,c[c.indexOf(e)+1]).replace("@media","@media not all and")},unit:i},s)}var De={borderRadius:4};function Ie(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function Ae(e,t){if(e){if("string"===typeof e)return Ie(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Ie(e,t):void 0}}function Ne(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!==typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,i=[],a=!0,l=!1;try{for(n=n.call(e);!(a=(r=n.next()).done)&&(i.push(r.value),!t||i.length!==t);a=!0);}catch(s){l=!0,o=s}finally{try{a||null==n.return||n.return()}finally{if(l)throw o}}return i}}(e,t)||Ae(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}var Le={xs:0,sm:600,md:900,lg:1200,xl:1536},ze={keys:["xs","sm","md","lg","xl"],up:function(e){return"@media (min-width:".concat(Le[e],"px)")}};function Fe(e,t,n){var r=e.theme||{};if(Array.isArray(t)){var o=r.breakpoints||ze;return t.reduce((function(e,r,i){return e[o.up(o.keys[i])]=n(t[i]),e}),{})}if("object"===typeof t){var i=r.breakpoints||ze;return Object.keys(t).reduce((function(e,r){if(-1!==Object.keys(i.values||Le).indexOf(r)){e[i.up(r)]=n(t[r],r)}else{var o=r;e[o]=t[o]}return e}),{})}return n(t)}function We(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=null==(e=t.keys)?void 0:e.reduce((function(e,n){return e[t.up(n)]={},e}),{});return n||{}}function Be(e,t){return e.reduce((function(e,t){var n=e[t];return(!n||0===Object.keys(n).length)&&delete e[t],e}),t)}function Ve(e){var t,n=e.values,r=e.breakpoints,o=e.base||function(e,t){if("object"!==typeof e)return{};var n={},r=Object.keys(t);return Array.isArray(e)?r.forEach((function(t,r){r<e.length&&(n[t]=!0)})):r.forEach((function(t){null!=e[t]&&(n[t]=!0)})),n}(n,r),i=Object.keys(o);return 0===i.length?n:i.reduce((function(e,r,o){return Array.isArray(n)?(e[r]=null!=n[o]?n[o]:n[t],t=o):"object"===typeof n?(e[r]=null!=n[r]?n[r]:n[t],t=r):e[r]=n,e}),{})}function qe(e){for(var t="https://mui.com/production-error/?code="+e,n=1;n<arguments.length;n+=1)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified MUI error #"+e+"; visit "+t+" for the full message."}function He(e){if("string"!==typeof e)throw new Error(qe(7));return e.charAt(0).toUpperCase()+e.slice(1)}function Ue(e,t){var n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(!t||"string"!==typeof t)return null;if(e&&e.vars&&n){var r="vars.".concat(t).split(".").reduce((function(e,t){return e&&e[t]?e[t]:null}),e);if(null!=r)return r}return t.split(".").reduce((function(e,t){return e&&null!=e[t]?e[t]:null}),e)}function Ye(e,t,n){var r,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:n;return r="function"===typeof e?e(n):Array.isArray(e)?e[n]||o:Ue(e,n)||o,t&&(r=t(r)),r}var Ge=function(e){var t=e.prop,n=e.cssProperty,r=void 0===n?e.prop:n,o=e.themeKey,i=e.transform,a=function(e){if(null==e[t])return null;var n=e[t],a=Ue(e.theme,o)||{};return Fe(e,n,(function(e){var n=Ye(a,i,e);return e===n&&"string"===typeof e&&(n=Ye(a,i,"".concat(t).concat("default"===e?"":He(e)),e)),!1===r?n:Ee({},r,n)}))};return a.propTypes={},a.filterProps=[t],a};var Qe=function(e,t){return t?Pe(e,t,{clone:!1}):e};var $e={m:"margin",p:"padding"},Ke={t:"Top",r:"Right",b:"Bottom",l:"Left",x:["Left","Right"],y:["Top","Bottom"]},Xe={marginX:"mx",marginY:"my",paddingX:"px",paddingY:"py"},Ze=function(e){var t={};return function(n){return void 0===t[n]&&(t[n]=e(n)),t[n]}}((function(e){if(e.length>2){if(!Xe[e])return[e];e=Xe[e]}var t=Ne(e.split(""),2),n=t[0],r=t[1],o=$e[n],i=Ke[r]||"";return Array.isArray(i)?i.map((function(e){return o+e})):[o+i]})),Je=["m","mt","mr","mb","ml","mx","my","margin","marginTop","marginRight","marginBottom","marginLeft","marginX","marginY","marginInline","marginInlineStart","marginInlineEnd","marginBlock","marginBlockStart","marginBlockEnd"],et=["p","pt","pr","pb","pl","px","py","padding","paddingTop","paddingRight","paddingBottom","paddingLeft","paddingX","paddingY","paddingInline","paddingInlineStart","paddingInlineEnd","paddingBlock","paddingBlockStart","paddingBlockEnd"],tt=[].concat(Je,et);function nt(e,t,n,r){var o,i=null!=(o=Ue(e,t,!1))?o:n;return"number"===typeof i?function(e){return"string"===typeof e?e:i*e}:Array.isArray(i)?function(e){return"string"===typeof e?e:i[e]}:"function"===typeof i?i:function(){}}function rt(e){return nt(e,"spacing",8)}function ot(e,t){if("string"===typeof t||null==t)return t;var n=e(Math.abs(t));return t>=0?n:"number"===typeof n?-n:"-".concat(n)}function it(e,t,n,r){if(-1===t.indexOf(n))return null;var o=function(e,t){return function(n){return e.reduce((function(e,r){return e[r]=ot(t,n),e}),{})}}(Ze(n),r);return Fe(e,e[n],o)}function at(e,t){var n=rt(e.theme);return Object.keys(e).map((function(r){return it(e,t,r,n)})).reduce(Qe,{})}function lt(e){return at(e,Je)}function st(e){return at(e,et)}function ut(e){return at(e,tt)}lt.propTypes={},lt.filterProps=Je,st.propTypes={},st.filterProps=et,ut.propTypes={},ut.filterProps=tt;var ct=ut;function dt(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:8;if(e.mui)return e;var t=rt({spacing:e}),n=function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];var o=0===n.length?[1]:n;return o.map((function(e){var n=t(e);return"number"===typeof n?"".concat(n,"px"):n})).join(" ")};return n.mui=!0,n}var ft=["breakpoints","palette","spacing","shape"];var pt=function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.breakpoints,n=void 0===t?{}:t,o=e.palette,i=void 0===o?{}:o,a=e.spacing,l=e.shape,s=void 0===l?{}:l,u=Te(e,ft),c=_e(n),d=dt(a),f=Pe({breakpoints:c,direction:"ltr",components:{},palette:r({mode:"light"},i),spacing:d,shape:r({},De,s)},u),p=arguments.length,h=new Array(p>1?p-1:0),m=1;m<p;m++)h[m-1]=arguments[m];return f=h.reduce((function(e,t){return Pe(e,t)}),f)};function ht(e){return 0===Object.keys(e).length}var mt=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=i();return!t||ht(t)?e:t},vt=pt();var gt=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:vt;return mt(e)};function yt(e){var t=gt();return(0,l.jsx)(Re.Provider,{value:"object"===typeof t?t:{},children:e.children})}var xt=function(e){var t=e.children,n=e.theme;return(0,l.jsx)(s,{theme:n,children:(0,l.jsx)(yt,{children:t})})};function bt(e,t){var n=r({},t);return Object.keys(e).forEach((function(t){void 0===n[t]&&(n[t]=e[t])})),n}function wt(e){var t=e.props,n=e.name,r=e.defaultTheme,o=function(e){var t=e.theme,n=e.name,r=e.props;return t&&t.components&&t.components[n]&&t.components[n].defaultProps?bt(t.components[n].defaultProps,r):r}({theme:gt(r),name:n,props:t});return o}function St(e,t){var n;return r({toolbar:(n={minHeight:56},Ee(n,e.up("xs"),{"@media (orientation: landscape)":{minHeight:48}}),Ee(n,e.up("sm"),{minHeight:64}),n)},t)}function jt(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;return Math.min(Math.max(t,e),n)}function kt(e){if(e.type)return e;if("#"===e.charAt(0))return kt(function(e){e=e.slice(1);var t=new RegExp(".{1,".concat(e.length>=6?2:1,"}"),"g"),n=e.match(t);return n&&1===n[0].length&&(n=n.map((function(e){return e+e}))),n?"rgb".concat(4===n.length?"a":"","(").concat(n.map((function(e,t){return t<3?parseInt(e,16):Math.round(parseInt(e,16)/255*1e3)/1e3})).join(", "),")"):""}(e));var t=e.indexOf("("),n=e.substring(0,t);if(-1===["rgb","rgba","hsl","hsla","color"].indexOf(n))throw new Error(qe(9,e));var r,o=e.substring(t+1,e.length-1);if("color"===n){if(r=(o=o.split(" ")).shift(),4===o.length&&"/"===o[3].charAt(0)&&(o[3]=o[3].slice(1)),-1===["srgb","display-p3","a98-rgb","prophoto-rgb","rec-2020"].indexOf(r))throw new Error(qe(10,r))}else o=o.split(",");return{type:n,values:o=o.map((function(e){return parseFloat(e)})),colorSpace:r}}function Ct(e){var t=e.type,n=e.colorSpace,r=e.values;return-1!==t.indexOf("rgb")?r=r.map((function(e,t){return t<3?parseInt(e,10):e})):-1!==t.indexOf("hsl")&&(r[1]="".concat(r[1],"%"),r[2]="".concat(r[2],"%")),r=-1!==t.indexOf("color")?"".concat(n," ").concat(r.join(" ")):"".concat(r.join(", ")),"".concat(t,"(").concat(r,")")}function Rt(e){var t="hsl"===(e=kt(e)).type?kt(function(e){var t=(e=kt(e)).values,n=t[0],r=t[1]/100,o=t[2]/100,i=r*Math.min(o,1-o),a=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:(e+n/30)%12;return o-i*Math.max(Math.min(t-3,9-t,1),-1)},l="rgb",s=[Math.round(255*a(0)),Math.round(255*a(8)),Math.round(255*a(4))];return"hsla"===e.type&&(l+="a",s.push(t[3])),Ct({type:l,values:s})}(e)).values:e.values;return t=t.map((function(t){return"color"!==e.type&&(t/=255),t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4)})),Number((.2126*t[0]+.7152*t[1]+.0722*t[2]).toFixed(3))}function Tt(e,t){return e=kt(e),t=jt(t),"rgb"!==e.type&&"hsl"!==e.type||(e.type+="a"),"color"===e.type?e.values[3]="/".concat(t):e.values[3]=t,Ct(e)}function Ot(e,t){if(e=kt(e),t=jt(t),-1!==e.type.indexOf("hsl"))e.values[2]*=1-t;else if(-1!==e.type.indexOf("rgb")||-1!==e.type.indexOf("color"))for(var n=0;n<3;n+=1)e.values[n]*=1-t;return Ct(e)}function Pt(e,t){if(e=kt(e),t=jt(t),-1!==e.type.indexOf("hsl"))e.values[2]+=(100-e.values[2])*t;else if(-1!==e.type.indexOf("rgb"))for(var n=0;n<3;n+=1)e.values[n]+=(255-e.values[n])*t;else if(-1!==e.type.indexOf("color"))for(var r=0;r<3;r+=1)e.values[r]+=(1-e.values[r])*t;return Ct(e)}var Et={black:"#000",white:"#fff"},Mt={50:"#fafafa",100:"#f5f5f5",200:"#eeeeee",300:"#e0e0e0",400:"#bdbdbd",500:"#9e9e9e",600:"#757575",700:"#616161",800:"#424242",900:"#212121",A100:"#f5f5f5",A200:"#eeeeee",A400:"#bdbdbd",A700:"#616161"},_t={50:"#f3e5f5",100:"#e1bee7",200:"#ce93d8",300:"#ba68c8",400:"#ab47bc",500:"#9c27b0",600:"#8e24aa",700:"#7b1fa2",800:"#6a1b9a",900:"#4a148c",A100:"#ea80fc",A200:"#e040fb",A400:"#d500f9",A700:"#aa00ff"},Dt={50:"#ffebee",100:"#ffcdd2",200:"#ef9a9a",300:"#e57373",400:"#ef5350",500:"#f44336",600:"#e53935",700:"#d32f2f",800:"#c62828",900:"#b71c1c",A100:"#ff8a80",A200:"#ff5252",A400:"#ff1744",A700:"#d50000"},It={50:"#fff3e0",100:"#ffe0b2",200:"#ffcc80",300:"#ffb74d",400:"#ffa726",500:"#ff9800",600:"#fb8c00",700:"#f57c00",800:"#ef6c00",900:"#e65100",A100:"#ffd180",A200:"#ffab40",A400:"#ff9100",A700:"#ff6d00"},At={50:"#e3f2fd",100:"#bbdefb",200:"#90caf9",300:"#64b5f6",400:"#42a5f5",500:"#2196f3",600:"#1e88e5",700:"#1976d2",800:"#1565c0",900:"#0d47a1",A100:"#82b1ff",A200:"#448aff",A400:"#2979ff",A700:"#2962ff"},Nt={50:"#e1f5fe",100:"#b3e5fc",200:"#81d4fa",300:"#4fc3f7",400:"#29b6f6",500:"#03a9f4",600:"#039be5",700:"#0288d1",800:"#0277bd",900:"#01579b",A100:"#80d8ff",A200:"#40c4ff",A400:"#00b0ff",A700:"#0091ea"},Lt={50:"#e8f5e9",100:"#c8e6c9",200:"#a5d6a7",300:"#81c784",400:"#66bb6a",500:"#4caf50",600:"#43a047",700:"#388e3c",800:"#2e7d32",900:"#1b5e20",A100:"#b9f6ca",A200:"#69f0ae",A400:"#00e676",A700:"#00c853"},zt=["mode","contrastThreshold","tonalOffset"],Ft={text:{primary:"rgba(0, 0, 0, 0.87)",secondary:"rgba(0, 0, 0, 0.6)",disabled:"rgba(0, 0, 0, 0.38)"},divider:"rgba(0, 0, 0, 0.12)",background:{paper:Et.white,default:Et.white},action:{active:"rgba(0, 0, 0, 0.54)",hover:"rgba(0, 0, 0, 0.04)",hoverOpacity:.04,selected:"rgba(0, 0, 0, 0.08)",selectedOpacity:.08,disabled:"rgba(0, 0, 0, 0.26)",disabledBackground:"rgba(0, 0, 0, 0.12)",disabledOpacity:.38,focus:"rgba(0, 0, 0, 0.12)",focusOpacity:.12,activatedOpacity:.12}},Wt={text:{primary:Et.white,secondary:"rgba(255, 255, 255, 0.7)",disabled:"rgba(255, 255, 255, 0.5)",icon:"rgba(255, 255, 255, 0.5)"},divider:"rgba(255, 255, 255, 0.12)",background:{paper:"#121212",default:"#121212"},action:{active:Et.white,hover:"rgba(255, 255, 255, 0.08)",hoverOpacity:.08,selected:"rgba(255, 255, 255, 0.16)",selectedOpacity:.16,disabled:"rgba(255, 255, 255, 0.3)",disabledBackground:"rgba(255, 255, 255, 0.12)",disabledOpacity:.38,focus:"rgba(255, 255, 255, 0.12)",focusOpacity:.12,activatedOpacity:.24}};function Bt(e,t,n,r){var o=r.light||r,i=r.dark||1.5*r;e[t]||(e.hasOwnProperty(n)?e[t]=e[n]:"light"===t?e.light=Pt(e.main,o):"dark"===t&&(e.dark=Ot(e.main,i)))}function Vt(e){var t=e.mode,n=void 0===t?"light":t,o=e.contrastThreshold,i=void 0===o?3:o,a=e.tonalOffset,l=void 0===a?.2:a,s=Te(e,zt),u=e.primary||function(){return"dark"===(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"light")?{main:At[200],light:At[50],dark:At[400]}:{main:At[700],light:At[400],dark:At[800]}}(n),c=e.secondary||function(){return"dark"===(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"light")?{main:_t[200],light:_t[50],dark:_t[400]}:{main:_t[500],light:_t[300],dark:_t[700]}}(n),d=e.error||function(){return"dark"===(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"light")?{main:Dt[500],light:Dt[300],dark:Dt[700]}:{main:Dt[700],light:Dt[400],dark:Dt[800]}}(n),f=e.info||function(){return"dark"===(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"light")?{main:Nt[400],light:Nt[300],dark:Nt[700]}:{main:Nt[700],light:Nt[500],dark:Nt[900]}}(n),p=e.success||function(){return"dark"===(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"light")?{main:Lt[400],light:Lt[300],dark:Lt[700]}:{main:Lt[800],light:Lt[500],dark:Lt[900]}}(n),h=e.warning||function(){return"dark"===(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"light")?{main:It[400],light:It[300],dark:It[700]}:{main:"#ed6c02",light:It[500],dark:It[900]}}(n);function m(e){var t=function(e,t){var n=Rt(e),r=Rt(t);return(Math.max(n,r)+.05)/(Math.min(n,r)+.05)}(e,Wt.text.primary)>=i?Wt.text.primary:Ft.text.primary;return t}var v=function(e){var t=e.color,n=e.name,o=e.mainShade,i=void 0===o?500:o,a=e.lightShade,s=void 0===a?300:a,u=e.darkShade,c=void 0===u?700:u;if(!(t=r({},t)).main&&t[i]&&(t.main=t[i]),!t.hasOwnProperty("main"))throw new Error(qe(11,n?" (".concat(n,")"):"",i));if("string"!==typeof t.main)throw new Error(qe(12,n?" (".concat(n,")"):"",JSON.stringify(t.main)));return Bt(t,"light",s,l),Bt(t,"dark",c,l),t.contrastText||(t.contrastText=m(t.main)),t},g={dark:Wt,light:Ft};return Pe(r({common:r({},Et),mode:n,primary:v({color:u,name:"primary"}),secondary:v({color:c,name:"secondary",mainShade:"A400",lightShade:"A200",darkShade:"A700"}),error:v({color:d,name:"error"}),warning:v({color:h,name:"warning"}),info:v({color:f,name:"info"}),success:v({color:p,name:"success"}),grey:Mt,contrastThreshold:i,getContrastText:m,augmentColor:v,tonalOffset:l},g[n]),s)}var qt=["fontFamily","fontSize","fontWeightLight","fontWeightRegular","fontWeightMedium","fontWeightBold","htmlFontSize","allVariants","pxToRem"];var Ht={textTransform:"uppercase"},Ut='"Roboto", "Helvetica", "Arial", sans-serif';function Yt(e,t){var n="function"===typeof t?t(e):t,o=n.fontFamily,i=void 0===o?Ut:o,a=n.fontSize,l=void 0===a?14:a,s=n.fontWeightLight,u=void 0===s?300:s,c=n.fontWeightRegular,d=void 0===c?400:c,f=n.fontWeightMedium,p=void 0===f?500:f,h=n.fontWeightBold,m=void 0===h?700:h,v=n.htmlFontSize,g=void 0===v?16:v,y=n.allVariants,x=n.pxToRem,b=Te(n,qt);var w=l/14,S=x||function(e){return"".concat(e/g*w,"rem")},j=function(e,t,n,o,a){return r({fontFamily:i,fontWeight:e,fontSize:S(t),lineHeight:n},i===Ut?{letterSpacing:"".concat((l=o/t,Math.round(1e5*l)/1e5),"em")}:{},a,y);var l},k={h1:j(u,96,1.167,-1.5),h2:j(u,60,1.2,-.5),h3:j(d,48,1.167,0),h4:j(d,34,1.235,.25),h5:j(d,24,1.334,0),h6:j(p,20,1.6,.15),subtitle1:j(d,16,1.75,.15),subtitle2:j(p,14,1.57,.1),body1:j(d,16,1.5,.15),body2:j(d,14,1.43,.15),button:j(p,14,1.75,.4,Ht),caption:j(d,12,1.66,.4),overline:j(d,12,2.66,1,Ht)};return Pe(r({htmlFontSize:g,pxToRem:S,fontFamily:i,fontSize:l,fontWeightLight:u,fontWeightRegular:d,fontWeightMedium:p,fontWeightBold:m},k),b,{clone:!1})}function Gt(){return["".concat(arguments.length<=0?void 0:arguments[0],"px ").concat(arguments.length<=1?void 0:arguments[1],"px ").concat(arguments.length<=2?void 0:arguments[2],"px ").concat(arguments.length<=3?void 0:arguments[3],"px rgba(0,0,0,").concat(.2,")"),"".concat(arguments.length<=4?void 0:arguments[4],"px ").concat(arguments.length<=5?void 0:arguments[5],"px ").concat(arguments.length<=6?void 0:arguments[6],"px ").concat(arguments.length<=7?void 0:arguments[7],"px rgba(0,0,0,").concat(.14,")"),"".concat(arguments.length<=8?void 0:arguments[8],"px ").concat(arguments.length<=9?void 0:arguments[9],"px ").concat(arguments.length<=10?void 0:arguments[10],"px ").concat(arguments.length<=11?void 0:arguments[11],"px rgba(0,0,0,").concat(.12,")")].join(",")}var Qt=["none",Gt(0,2,1,-1,0,1,1,0,0,1,3,0),Gt(0,3,1,-2,0,2,2,0,0,1,5,0),Gt(0,3,3,-2,0,3,4,0,0,1,8,0),Gt(0,2,4,-1,0,4,5,0,0,1,10,0),Gt(0,3,5,-1,0,5,8,0,0,1,14,0),Gt(0,3,5,-1,0,6,10,0,0,1,18,0),Gt(0,4,5,-2,0,7,10,1,0,2,16,1),Gt(0,5,5,-3,0,8,10,1,0,3,14,2),Gt(0,5,6,-3,0,9,12,1,0,3,16,2),Gt(0,6,6,-3,0,10,14,1,0,4,18,3),Gt(0,6,7,-4,0,11,15,1,0,4,20,3),Gt(0,7,8,-4,0,12,17,2,0,5,22,4),Gt(0,7,8,-4,0,13,19,2,0,5,24,4),Gt(0,7,9,-4,0,14,21,2,0,5,26,4),Gt(0,8,9,-5,0,15,22,2,0,6,28,5),Gt(0,8,10,-5,0,16,24,2,0,6,30,5),Gt(0,8,11,-5,0,17,26,2,0,6,32,5),Gt(0,9,11,-5,0,18,28,2,0,7,34,6),Gt(0,9,12,-6,0,19,29,2,0,7,36,6),Gt(0,10,13,-6,0,20,31,3,0,8,38,7),Gt(0,10,13,-6,0,21,33,3,0,8,40,7),Gt(0,10,14,-6,0,22,35,3,0,8,42,7),Gt(0,11,14,-7,0,23,36,3,0,9,44,8),Gt(0,11,15,-7,0,24,38,3,0,9,46,8)],$t=["duration","easing","delay"],Kt={easeInOut:"cubic-bezier(0.4, 0, 0.2, 1)",easeOut:"cubic-bezier(0.0, 0, 0.2, 1)",easeIn:"cubic-bezier(0.4, 0, 1, 1)",sharp:"cubic-bezier(0.4, 0, 0.6, 1)"},Xt={shortest:150,shorter:200,short:250,standard:300,complex:375,enteringScreen:225,leavingScreen:195};function Zt(e){return"".concat(Math.round(e),"ms")}function Jt(e){if(!e)return 0;var t=e/36;return Math.round(10*(4+15*Math.pow(t,.25)+t/5))}function en(e){var t=r({},Kt,e.easing),n=r({},Xt,e.duration);return r({getAutoHeightDuration:Jt,create:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["all"],r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=r.duration,i=void 0===o?n.standard:o,a=r.easing,l=void 0===a?t.easeInOut:a,s=r.delay,u=void 0===s?0:s;Te(r,$t);return(Array.isArray(e)?e:[e]).map((function(e){return"".concat(e," ").concat("string"===typeof i?i:Zt(i)," ").concat(l," ").concat("string"===typeof u?u:Zt(u))})).join(",")}},e,{easing:t,duration:n})}var tn={mobileStepper:1e3,fab:1050,speedDial:1050,appBar:1100,drawer:1200,modal:1300,snackbar:1400,tooltip:1500},nn=["breakpoints","mixins","spacing","palette","transitions","typography","shape"];function rn(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.mixins,n=void 0===t?{}:t,o=e.palette,i=void 0===o?{}:o,a=e.transitions,l=void 0===a?{}:a,s=e.typography,u=void 0===s?{}:s,c=Te(e,nn),d=Vt(i),f=pt(e),p=Pe(f,{mixins:St(f.breakpoints,n),palette:d,shadows:Qt.slice(),typography:Yt(d,u),transitions:en(l),zIndex:r({},tn)});p=Pe(p,c);for(var h=arguments.length,m=new Array(h>1?h-1:0),v=1;v<h;v++)m[v-1]=arguments[v];return p=m.reduce((function(e,t){return Pe(e,t)}),p)}var on=rn,an=on();function ln(e){return wt({props:e.props,name:e.name,defaultTheme:an})}n(2110);function sn(e,t,n){var r="";return n.split(" ").forEach((function(n){void 0!==e[n]?t.push(e[n]+";"):r+=n+" "})),r}var un=function(e,t,n){var r=e.key+"-"+t.name;!1===n&&void 0===e.registered[r]&&(e.registered[r]=t.styles)},cn=function(e,t,n){un(e,t,n);var r=e.key+"-"+t.name;if(void 0===e.inserted[t.name]){var o=t;do{e.insert(t===o?"."+r:"",o,e.sheet,!0);o=o.next}while(void 0!==o)}},dn=t.useInsertionEffect?t.useInsertionEffect:e.useLayoutEffect,fn=Ce((function(t,n){var r=t.styles,o=je([r],void 0,(0,e.useContext)(Re)),i=(0,e.useRef)();return dn((function(){var e=n.key+"-global",t=new n.sheet.constructor({key:e,nonce:n.sheet.nonce,container:n.sheet.container,speedy:n.sheet.isSpeedy}),r=!1,a=document.querySelector('style[data-emotion="'+e+" "+o.name+'"]');return n.sheet.tags.length&&(t.before=n.sheet.tags[0]),null!==a&&(r=!0,a.setAttribute("data-emotion",e),t.hydrate([a])),i.current=[t,r],function(){t.flush()}}),[n]),dn((function(){var e=i.current,t=e[0];if(e[1])e[1]=!1;else{if(void 0!==o.next&&cn(n,o.next,!0),t.tags.length){var r=t.tags[t.tags.length-1].nextElementSibling;t.before=r,t.flush()}n.insert("",o,t,!1)}}),[n,o.name]),null}));function pn(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return je(t)}var hn=function(){var e=pn.apply(void 0,arguments),t="animation-"+e.name;return{name:t,styles:"@keyframes "+t+"{"+e.styles+"}",anim:1,toString:function(){return"_EMO_"+this.name+"_"+this.styles+"_EMO_"}}};function mn(e){var t=e.styles,n=e.defaultTheme,r=void 0===n?{}:n,o="function"===typeof t?function(e){return t(void 0===(n=e)||null===n||0===Object.keys(n).length?r:e);var n}:t;return(0,l.jsx)(fn,{styles:o})}var vn=function(e){return(0,l.jsx)(mn,r({},e,{defaultTheme:an}))},gn=function(e,t){return r({WebkitFontSmoothing:"antialiased",MozOsxFontSmoothing:"grayscale",boxSizing:"border-box",WebkitTextSizeAdjust:"100%"},t&&{colorScheme:e.palette.mode})},yn=function(e){return r({color:(e.vars||e).palette.text.primary},e.typography.body1,{backgroundColor:(e.vars||e).palette.background.default,"@media print":{backgroundColor:(e.vars||e).palette.common.white}})};var xn=function(t){var n=ln({props:t,name:"MuiCssBaseline"}),o=n.children,i=n.enableColorScheme,a=void 0!==i&&i;return(0,l.jsxs)(e.Fragment,{children:[(0,l.jsx)(vn,{styles:function(e){return function(e){var t,n,o={html:gn(e,arguments.length>1&&void 0!==arguments[1]&&arguments[1]),"*, *::before, *::after":{boxSizing:"inherit"},"strong, b":{fontWeight:e.typography.fontWeightBold},body:r({margin:0},yn(e),{"&::backdrop":{backgroundColor:(e.vars||e).palette.background.default}})},i=null==(t=e.components)||null==(n=t.MuiCssBaseline)?void 0:n.styleOverrides;return i&&(o=[o,i]),o}(e,a)}}),o]})};function bn(e){var t,n,r="";if("string"==typeof e||"number"==typeof e)r+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(n=bn(e[t]))&&(r&&(r+=" "),r+=n);else for(t in e)e[t]&&(r&&(r+=" "),r+=t);return r}var wn=function(){for(var e,t,n=0,r="";n<arguments.length;)(e=arguments[n++])&&(t=bn(e))&&(r&&(r+=" "),r+=t);return r},Sn=/^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|download|draggable|encType|enterKeyHint|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/,jn=pe((function(e){return Sn.test(e)||111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&e.charCodeAt(2)<91})),kn=function(e){return"theme"!==e},Cn=function(e){return"string"===typeof e&&e.charCodeAt(0)>96?jn:kn},Rn=function(e,t,n){var r;if(t){var o=t.shouldForwardProp;r=e.__emotion_forwardProp&&o?function(t){return e.__emotion_forwardProp(t)&&o(t)}:o}return"function"!==typeof r&&n&&(r=e.__emotion_forwardProp),r},Tn=t.useInsertionEffect?t.useInsertionEffect:function(e){e()};var On=function(e){var t=e.cache,n=e.serialized,r=e.isStringTag;un(t,n,r);Tn((function(){return cn(t,n,r)}));return null},Pn=function t(n,o){var i,a,l=n.__emotion_real===n,s=l&&n.__emotion_base||n;void 0!==o&&(i=o.label,a=o.target);var u=Rn(n,o,l),c=u||Cn(s),d=!c("as");return function(){var f=arguments,p=l&&void 0!==n.__emotion_styles?n.__emotion_styles.slice(0):[];if(void 0!==i&&p.push("label:"+i+";"),null==f[0]||void 0===f[0].raw)p.push.apply(p,f);else{0,p.push(f[0][0]);for(var h=f.length,m=1;m<h;m++)p.push(f[m],f[0][m])}var v=Ce((function(t,n,r){var o=d&&t.as||s,i="",l=[],f=t;if(null==t.theme){for(var h in f={},t)f[h]=t[h];f.theme=(0,e.useContext)(Re)}"string"===typeof t.className?i=sn(n.registered,l,t.className):null!=t.className&&(i=t.className+" ");var m=je(p.concat(l),n.registered,f);i+=n.key+"-"+m.name,void 0!==a&&(i+=" "+a);var v=d&&void 0===u?Cn(o):c,g={};for(var y in t)d&&"as"===y||v(y)&&(g[y]=t[y]);return g.className=i,g.ref=r,(0,e.createElement)(e.Fragment,null,(0,e.createElement)(On,{cache:n,serialized:m,isStringTag:"string"===typeof o}),(0,e.createElement)(o,g))}));return v.displayName=void 0!==i?i:"Styled("+("string"===typeof s?s:s.displayName||s.name||"Component")+")",v.defaultProps=n.defaultProps,v.__emotion_real=v,v.__emotion_base=s,v.__emotion_styles=p,v.__emotion_forwardProp=u,Object.defineProperty(v,"toString",{value:function(){return"."+a}}),v.withComponent=function(e,n){return t(e,r({},o,n,{shouldForwardProp:Rn(v,n,!0)})).apply(void 0,p)},v}},En=Pn.bind();["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","marquee","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","tspan"].forEach((function(e){En[e]=En(e)}));var Mn=En;function _n(e,t){return Mn(e,t)}var Dn=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];var r=t.reduce((function(e,t){return t.filterProps.forEach((function(n){e[n]=t})),e}),{}),o=function(e){return Object.keys(e).reduce((function(t,n){return r[n]?Qe(t,r[n](e)):t}),{})};return o.propTypes={},o.filterProps=t.reduce((function(e,t){return e.concat(t.filterProps)}),[]),o};function In(e){return"number"!==typeof e?e:"".concat(e,"px solid")}var An=Ge({prop:"border",themeKey:"borders",transform:In}),Nn=Ge({prop:"borderTop",themeKey:"borders",transform:In}),Ln=Ge({prop:"borderRight",themeKey:"borders",transform:In}),zn=Ge({prop:"borderBottom",themeKey:"borders",transform:In}),Fn=Ge({prop:"borderLeft",themeKey:"borders",transform:In}),Wn=Ge({prop:"borderColor",themeKey:"palette"}),Bn=Ge({prop:"borderTopColor",themeKey:"palette"}),Vn=Ge({prop:"borderRightColor",themeKey:"palette"}),qn=Ge({prop:"borderBottomColor",themeKey:"palette"}),Hn=Ge({prop:"borderLeftColor",themeKey:"palette"}),Un=function(e){if(void 0!==e.borderRadius&&null!==e.borderRadius){var t=nt(e.theme,"shape.borderRadius",4);return Fe(e,e.borderRadius,(function(e){return{borderRadius:ot(t,e)}}))}return null};Un.propTypes={},Un.filterProps=["borderRadius"];var Yn=Dn(An,Nn,Ln,zn,Fn,Wn,Bn,Vn,qn,Hn,Un),Gn=Dn(Ge({prop:"displayPrint",cssProperty:!1,transform:function(e){return{"@media print":{display:e}}}}),Ge({prop:"display"}),Ge({prop:"overflow"}),Ge({prop:"textOverflow"}),Ge({prop:"visibility"}),Ge({prop:"whiteSpace"})),Qn=Dn(Ge({prop:"flexBasis"}),Ge({prop:"flexDirection"}),Ge({prop:"flexWrap"}),Ge({prop:"justifyContent"}),Ge({prop:"alignItems"}),Ge({prop:"alignContent"}),Ge({prop:"order"}),Ge({prop:"flex"}),Ge({prop:"flexGrow"}),Ge({prop:"flexShrink"}),Ge({prop:"alignSelf"}),Ge({prop:"justifyItems"}),Ge({prop:"justifySelf"})),$n=function(e){if(void 0!==e.gap&&null!==e.gap){var t=nt(e.theme,"spacing",8);return Fe(e,e.gap,(function(e){return{gap:ot(t,e)}}))}return null};$n.propTypes={},$n.filterProps=["gap"];var Kn=function(e){if(void 0!==e.columnGap&&null!==e.columnGap){var t=nt(e.theme,"spacing",8);return Fe(e,e.columnGap,(function(e){return{columnGap:ot(t,e)}}))}return null};Kn.propTypes={},Kn.filterProps=["columnGap"];var Xn=function(e){if(void 0!==e.rowGap&&null!==e.rowGap){var t=nt(e.theme,"spacing",8);return Fe(e,e.rowGap,(function(e){return{rowGap:ot(t,e)}}))}return null};Xn.propTypes={},Xn.filterProps=["rowGap"];var Zn=Dn($n,Kn,Xn,Ge({prop:"gridColumn"}),Ge({prop:"gridRow"}),Ge({prop:"gridAutoFlow"}),Ge({prop:"gridAutoColumns"}),Ge({prop:"gridAutoRows"}),Ge({prop:"gridTemplateColumns"}),Ge({prop:"gridTemplateRows"}),Ge({prop:"gridTemplateAreas"}),Ge({prop:"gridArea"})),Jn=Dn(Ge({prop:"position"}),Ge({prop:"zIndex",themeKey:"zIndex"}),Ge({prop:"top"}),Ge({prop:"right"}),Ge({prop:"bottom"}),Ge({prop:"left"})),er=Dn(Ge({prop:"color",themeKey:"palette"}),Ge({prop:"bgcolor",cssProperty:"backgroundColor",themeKey:"palette"}),Ge({prop:"backgroundColor",themeKey:"palette"})),tr=Ge({prop:"boxShadow",themeKey:"shadows"});function nr(e){return e<=1&&0!==e?"".concat(100*e,"%"):e}var rr=Ge({prop:"width",transform:nr}),or=function(e){if(void 0!==e.maxWidth&&null!==e.maxWidth){return Fe(e,e.maxWidth,(function(t){var n,r,o;return{maxWidth:(null==(n=e.theme)||null==(r=n.breakpoints)||null==(o=r.values)?void 0:o[t])||Le[t]||nr(t)}}))}return null};or.filterProps=["maxWidth"];var ir=Ge({prop:"minWidth",transform:nr}),ar=Ge({prop:"height",transform:nr}),lr=Ge({prop:"maxHeight",transform:nr}),sr=Ge({prop:"minHeight",transform:nr}),ur=(Ge({prop:"size",cssProperty:"width",transform:nr}),Ge({prop:"size",cssProperty:"height",transform:nr}),Dn(rr,or,ir,ar,lr,sr,Ge({prop:"boxSizing"}))),cr=Ge({prop:"fontFamily",themeKey:"typography"}),dr=Ge({prop:"fontSize",themeKey:"typography"}),fr=Ge({prop:"fontStyle",themeKey:"typography"}),pr=Ge({prop:"fontWeight",themeKey:"typography"}),hr=Ge({prop:"letterSpacing"}),mr=Ge({prop:"textTransform"}),vr=Ge({prop:"lineHeight"}),gr=Ge({prop:"textAlign"}),yr=Dn(Ge({prop:"typography",cssProperty:!1,themeKey:"typography"}),cr,dr,fr,pr,hr,vr,gr,mr),xr={borders:Yn.filterProps,display:Gn.filterProps,flexbox:Qn.filterProps,grid:Zn.filterProps,positions:Jn.filterProps,palette:er.filterProps,shadows:tr.filterProps,sizing:ur.filterProps,spacing:ct.filterProps,typography:yr.filterProps},br={borders:Yn,display:Gn,flexbox:Qn,grid:Zn,positions:Jn,palette:er,shadows:tr,sizing:ur,spacing:ct,typography:yr},wr=Object.keys(xr).reduce((function(e,t){return xr[t].forEach((function(n){e[n]=br[t]})),e}),{});function Sr(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];var r=t.reduce((function(e,t){return e.concat(Object.keys(t))}),[]),o=new Set(r);return t.every((function(e){return o.size===Object.keys(e).length}))}function jr(e,t){return"function"===typeof e?e(t):e}var kr=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:br,t=Object.keys(e).reduce((function(t,n){return e[n].filterProps.forEach((function(r){t[r]=e[n]})),t}),{});function n(e,n,r){var o,i=(Ee(o={},e,n),Ee(o,"theme",r),o),a=t[e];return a?a(i):Ee({},e,n)}function r(e){var o=e||{},i=o.sx,a=o.theme,l=void 0===a?{}:a;if(!i)return null;function s(e){var o=e;if("function"===typeof e)o=e(l);else if("object"!==typeof e)return e;if(!o)return null;var i=We(l.breakpoints),a=Object.keys(i),s=i;return Object.keys(o).forEach((function(e){var i=jr(o[e],l);if(null!==i&&void 0!==i)if("object"===typeof i)if(t[e])s=Qe(s,n(e,i,l));else{var a=Fe({theme:l},i,(function(t){return Ee({},e,t)}));Sr(a,i)?s[e]=r({sx:i,theme:l}):s=Qe(s,a)}else s=Qe(s,n(e,i,l))})),Be(a,s)}return Array.isArray(i)?i.map(s):s(i)}return r}();kr.filterProps=["sx"];var Cr=kr;function Rr(e){return function(e){if(Array.isArray(e))return Ie(e)}(e)||function(e){if("undefined"!==typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||Ae(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}var Tr=["sx"];function Or(e){var t,n=e.sx,o=function(e){var t={systemProps:{},otherProps:{}};return Object.keys(e).forEach((function(n){wr[n]?t.systemProps[n]=e[n]:t.otherProps[n]=e[n]})),t}(Te(e,Tr)),i=o.systemProps,a=o.otherProps;return t=Array.isArray(n)?[i].concat(Rr(n)):"function"===typeof n?function(){var e=n.apply(void 0,arguments);return Oe(e)?r({},i,e):i}:r({},i,n),r({},a,{sx:t})}var Pr=["className","component"];var Er,Mr=function(e){return e},_r=function(){var e=Mr;return{configure:function(t){e=t},generate:function(t){return e(t)},reset:function(){e=Mr}}}(),Dr=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=t.defaultTheme,o=t.defaultClassName,i=void 0===o?"MuiBox-root":o,a=t.generateClassName,s=t.styleFunctionSx,u=void 0===s?Cr:s,c=_n("div")(u),d=e.forwardRef((function(e,t){var o=gt(n),s=Or(e),u=s.className,d=s.component,f=void 0===d?"div":d,p=Te(s,Pr);return(0,l.jsx)(c,r({as:f,ref:t,className:wn(u,a?a(i):i),theme:o},p))}));return d}({defaultTheme:on(),defaultClassName:"MuiBox-root",generateClassName:_r.generate}),Ir=Dr,Ar=n(7408),Nr=n(1250);!function(e){e.Pop="POP",e.Push="PUSH",e.Replace="REPLACE"}(Er||(Er={}));var Lr=function(e){return e};var zr="beforeunload",Fr="popstate";function Wr(e){void 0===e&&(e={});var t=e.window,n=void 0===t?document.defaultView:t,o=n.history;function i(){var e=Ur(n.location.hash.substr(1)),t=e.pathname,r=void 0===t?"/":t,i=e.search,a=void 0===i?"":i,l=e.hash,s=void 0===l?"":l,u=o.state||{};return[u.idx,Lr({pathname:r,search:a,hash:s,state:u.usr||null,key:u.key||"default"})]}var a=null;function l(){if(a)p.call(a),a=null;else{var e=Er.Pop,t=i(),n=t[0],r=t[1];if(p.length){if(null!=n){var o=c-n;o&&(a={action:e,location:r,retry:function(){x(-1*o)}},x(o))}}else y(e)}}n.addEventListener(Fr,l),n.addEventListener("hashchange",(function(){Hr(i()[1])!==Hr(d)&&l()}));var s=Er.Pop,u=i(),c=u[0],d=u[1],f=Vr(),p=Vr();function h(e){return function(){var e=document.querySelector("base"),t="";if(e&&e.getAttribute("href")){var r=n.location.href,o=r.indexOf("#");t=-1===o?r:r.slice(0,o)}return t}()+"#"+("string"===typeof e?e:Hr(e))}function m(e,t){return void 0===t&&(t=null),Lr(r({pathname:d.pathname,hash:"",search:""},"string"===typeof e?Ur(e):e,{state:t,key:qr()}))}function v(e,t){return[{usr:e.state,key:e.key,idx:t},h(e)]}function g(e,t,n){return!p.length||(p.call({action:e,location:t,retry:n}),!1)}function y(e){s=e;var t=i();c=t[0],d=t[1],f.call({action:s,location:d})}function x(e){o.go(e)}null==c&&(c=0,o.replaceState(r({},o.state,{idx:c}),""));var b={get action(){return s},get location(){return d},createHref:h,push:function e(t,r){var i=Er.Push,a=m(t,r);if(g(i,a,(function(){e(t,r)}))){var l=v(a,c+1),s=l[0],u=l[1];try{o.pushState(s,"",u)}catch(d){n.location.assign(u)}y(i)}},replace:function e(t,n){var r=Er.Replace,i=m(t,n);if(g(r,i,(function(){e(t,n)}))){var a=v(i,c),l=a[0],s=a[1];o.replaceState(l,"",s),y(r)}},go:x,back:function(){x(-1)},forward:function(){x(1)},listen:function(e){return f.push(e)},block:function(e){var t=p.push(e);return 1===p.length&&n.addEventListener(zr,Br),function(){t(),p.length||n.removeEventListener(zr,Br)}}};return b}function Br(e){e.preventDefault(),e.returnValue=""}function Vr(){var e=[];return{get length(){return e.length},push:function(t){return e.push(t),function(){e=e.filter((function(e){return e!==t}))}},call:function(t){e.forEach((function(e){return e&&e(t)}))}}}function qr(){return Math.random().toString(36).substr(2,8)}function Hr(e){var t=e.pathname,n=void 0===t?"/":t,r=e.search,o=void 0===r?"":r,i=e.hash,a=void 0===i?"":i;return o&&"?"!==o&&(n+="?"===o.charAt(0)?o:"?"+o),a&&"#"!==a&&(n+="#"===a.charAt(0)?a:"#"+a),n}function Ur(e){var t={};if(e){var n=e.indexOf("#");n>=0&&(t.hash=e.substr(n),e=e.substr(0,n));var r=e.indexOf("?");r>=0&&(t.search=e.substr(r),e=e.substr(0,r)),e&&(t.pathname=e)}return t}var Yr=(0,e.createContext)(null);var Gr=(0,e.createContext)(null);var Qr=(0,e.createContext)({outlet:null,matches:[]});function $r(e,t){if(!e)throw new Error(t)}function Kr(e,t,n){void 0===n&&(n="/");var r=oo(("string"===typeof t?Ur(t):t).pathname||"/",n);if(null==r)return null;var o=Xr(e);!function(e){e.sort((function(e,t){return e.score!==t.score?t.score-e.score:function(e,t){var n=e.length===t.length&&e.slice(0,-1).every((function(e,n){return e===t[n]}));return n?e[e.length-1]-t[t.length-1]:0}(e.routesMeta.map((function(e){return e.childrenIndex})),t.routesMeta.map((function(e){return e.childrenIndex})))}))}(o);for(var i=null,a=0;null==i&&a<o.length;++a)i=to(o[a],r);return i}function Xr(e,t,n,r){return void 0===t&&(t=[]),void 0===n&&(n=[]),void 0===r&&(r=""),e.forEach((function(e,o){var i={relativePath:e.path||"",caseSensitive:!0===e.caseSensitive,childrenIndex:o,route:e};i.relativePath.startsWith("/")&&(i.relativePath.startsWith(r)||$r(!1),i.relativePath=i.relativePath.slice(r.length));var a=io([r,i.relativePath]),l=n.concat(i);e.children&&e.children.length>0&&(!0===e.index&&$r(!1),Xr(e.children,t,l,a)),(null!=e.path||e.index)&&t.push({path:a,score:eo(a,e.index),routesMeta:l})})),t}var Zr=/^:\w+$/,Jr=function(e){return"*"===e};function eo(e,t){var n=e.split("/"),r=n.length;return n.some(Jr)&&(r+=-2),t&&(r+=2),n.filter((function(e){return!Jr(e)})).reduce((function(e,t){return e+(Zr.test(t)?3:""===t?1:10)}),r)}function to(e,t){for(var n=e.routesMeta,r={},o="/",i=[],a=0;a<n.length;++a){var l=n[a],s=a===n.length-1,u="/"===o?t:t.slice(o.length)||"/",c=no({path:l.relativePath,caseSensitive:l.caseSensitive,end:s},u);if(!c)return null;Object.assign(r,c.params);var d=l.route;i.push({params:r,pathname:io([o,c.pathname]),pathnameBase:ao(io([o,c.pathnameBase])),route:d}),"/"!==c.pathnameBase&&(o=io([o,c.pathnameBase]))}return i}function no(e,t){"string"===typeof e&&(e={path:e,caseSensitive:!1,end:!0});var n=function(e,t,n){void 0===t&&(t=!1);void 0===n&&(n=!0);var r=[],o="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^$?{}|()[\]]/g,"\\$&").replace(/:(\w+)/g,(function(e,t){return r.push(t),"([^\\/]+)"}));e.endsWith("*")?(r.push("*"),o+="*"===e||"/*"===e?"(.*)$":"(?:\\/(.+)|\\/*)$"):o+=n?"\\/*$":"(?:(?=[.~-]|%[0-9A-F]{2})|\\b|\\/|$)";return[new RegExp(o,t?void 0:"i"),r]}(e.path,e.caseSensitive,e.end),r=Ne(n,2),o=r[0],i=r[1],a=t.match(o);if(!a)return null;var l=a[0],s=l.replace(/(.)\/+$/,"$1"),u=a.slice(1);return{params:i.reduce((function(e,t,n){if("*"===t){var r=u[n]||"";s=l.slice(0,l.length-r.length).replace(/(.)\/+$/,"$1")}return e[t]=function(e,t){try{return decodeURIComponent(e)}catch(n){return e}}(u[n]||""),e}),{}),pathname:l,pathnameBase:s,pattern:e}}function ro(e,t,n){var r,o="string"===typeof e?Ur(e):e,i=""===e||""===o.pathname?"/":o.pathname;if(null==i)r=n;else{var a=t.length-1;if(i.startsWith("..")){for(var l=i.split("/");".."===l[0];)l.shift(),a-=1;o.pathname=l.join("/")}r=a>=0?t[a]:"/"}var s=function(e,t){void 0===t&&(t="/");var n="string"===typeof e?Ur(e):e,r=n.pathname,o=n.search,i=void 0===o?"":o,a=n.hash,l=void 0===a?"":a,s=r?r.startsWith("/")?r:function(e,t){var n=t.replace(/\/+$/,"").split("/");return e.split("/").forEach((function(e){".."===e?n.length>1&&n.pop():"."!==e&&n.push(e)})),n.length>1?n.join("/"):"/"}(r,t):t;return{pathname:s,search:lo(i),hash:so(l)}}(o,r);return i&&"/"!==i&&i.endsWith("/")&&!s.pathname.endsWith("/")&&(s.pathname+="/"),s}function oo(e,t){if("/"===t)return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;var n=e.charAt(t.length);return n&&"/"!==n?null:e.slice(t.length)||"/"}var io=function(e){return e.join("/").replace(/\/\/+/g,"/")},ao=function(e){return e.replace(/\/+$/,"").replace(/^\/*/,"/")},lo=function(e){return e&&"?"!==e?e.startsWith("?")?e:"?"+e:""},so=function(e){return e&&"#"!==e?e.startsWith("#")?e:"#"+e:""};function uo(t){co()||$r(!1);var n=(0,e.useContext)(Yr),r=n.basename,o=n.navigator,i=vo(t),a=i.hash,l=i.pathname,s=i.search,u=l;if("/"!==r){var c=function(e){return""===e||""===e.pathname?"/":"string"===typeof e?Ur(e).pathname:e.pathname}(t),d=null!=c&&c.endsWith("/");u="/"===l?r+(d?"/":""):io([r,l])}return o.createHref({pathname:u,search:s,hash:a})}function co(){return null!=(0,e.useContext)(Gr)}function fo(){return co()||$r(!1),(0,e.useContext)(Gr).location}function po(){co()||$r(!1);var t=(0,e.useContext)(Yr),n=t.basename,r=t.navigator,o=(0,e.useContext)(Qr).matches,i=fo().pathname,a=JSON.stringify(o.map((function(e){return e.pathnameBase}))),l=(0,e.useRef)(!1);return(0,e.useEffect)((function(){l.current=!0})),(0,e.useCallback)((function(e,t){if(void 0===t&&(t={}),l.current)if("number"!==typeof e){var o=ro(e,JSON.parse(a),i);"/"!==n&&(o.pathname=io([n,o.pathname])),(t.replace?r.replace:r.push)(o,t.state)}else r.go(e)}),[n,r,a,i])}var ho=(0,e.createContext)(null);function mo(){var t=(0,e.useContext)(Qr).matches,n=t[t.length-1];return n?n.params:{}}function vo(t){var n=(0,e.useContext)(Qr).matches,r=fo().pathname,o=JSON.stringify(n.map((function(e){return e.pathnameBase})));return(0,e.useMemo)((function(){return ro(t,JSON.parse(o),r)}),[t,o,r])}function go(t,n){return void 0===n&&(n=[]),null==t?null:t.reduceRight((function(r,o,i){return(0,e.createElement)(Qr.Provider,{children:void 0!==o.route.element?o.route.element:r,value:{outlet:r,matches:n.concat(t.slice(0,i+1))}})}),null)}function yo(t){return function(t){var n=(0,e.useContext)(Qr).outlet;return n?(0,e.createElement)(ho.Provider,{value:t},n):n}(t.context)}function xo(e){$r(!1)}function bo(t){var n=t.basename,r=void 0===n?"/":n,o=t.children,i=void 0===o?null:o,a=t.location,l=t.navigationType,s=void 0===l?Er.Pop:l,u=t.navigator,c=t.static,d=void 0!==c&&c;co()&&$r(!1);var f=ao(r),p=(0,e.useMemo)((function(){return{basename:f,navigator:u,static:d}}),[f,u,d]);"string"===typeof a&&(a=Ur(a));var h=a,m=h.pathname,v=void 0===m?"/":m,g=h.search,y=void 0===g?"":g,x=h.hash,b=void 0===x?"":x,w=h.state,S=void 0===w?null:w,j=h.key,k=void 0===j?"default":j,C=(0,e.useMemo)((function(){var e=oo(v,f);return null==e?null:{pathname:e,search:y,hash:b,state:S,key:k}}),[f,v,y,b,S,k]);return null==C?null:(0,e.createElement)(Yr.Provider,{value:p},(0,e.createElement)(Gr.Provider,{children:i,value:{location:C,navigationType:s}}))}function wo(t){var n=t.children,r=t.location;return function(t,n){co()||$r(!1);var r,o=(0,e.useContext)(Qr).matches,i=o[o.length-1],a=i?i.params:{},l=(i&&i.pathname,i?i.pathnameBase:"/"),s=(i&&i.route,fo());if(n){var u,c="string"===typeof n?Ur(n):n;"/"===l||(null==(u=c.pathname)?void 0:u.startsWith(l))||$r(!1),r=c}else r=s;var d=r.pathname||"/",f=Kr(t,{pathname:"/"===l?d:d.slice(l.length)||"/"});return go(f&&f.map((function(e){return Object.assign({},e,{params:Object.assign({},a,e.params),pathname:io([l,e.pathname]),pathnameBase:"/"===e.pathnameBase?l:io([l,e.pathnameBase])})})),o)}(So(n),r)}function So(t){var n=[];return e.Children.forEach(t,(function(t){if((0,e.isValidElement)(t))if(t.type!==e.Fragment){t.type!==xo&&$r(!1);var r={caseSensitive:t.props.caseSensitive,element:t.props.element,index:t.props.index,path:t.props.path};t.props.children&&(r.children=So(t.props.children)),n.push(r)}else n.push.apply(n,So(t.props.children))})),n}function jo(){return jo=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},jo.apply(this,arguments)}function ko(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}var Co=["onClick","reloadDocument","replace","state","target","to"];function Ro(t){var n=t.basename,r=t.children,o=t.window,i=(0,e.useRef)();null==i.current&&(i.current=Wr({window:o}));var a=i.current,l=Ne((0,e.useState)({action:a.action,location:a.location}),2),s=l[0],u=l[1];return(0,e.useLayoutEffect)((function(){return a.listen(u)}),[a]),(0,e.createElement)(bo,{basename:n,children:r,location:s.location,navigationType:s.action,navigator:a})}var To=(0,e.forwardRef)((function(t,n){var r=t.onClick,o=t.reloadDocument,i=t.replace,a=void 0!==i&&i,l=t.state,s=t.target,u=t.to,c=ko(t,Co),d=uo(u),f=function(t,n){var r=void 0===n?{}:n,o=r.target,i=r.replace,a=r.state,l=po(),s=fo(),u=vo(t);return(0,e.useCallback)((function(e){if(0===e.button&&(!o||"_self"===o)&&!function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e)){e.preventDefault();var n=!!i||Hr(s)===Hr(u);l(t,{replace:n,state:a})}}),[s,l,u,i,a,o,t])}(u,{replace:a,state:l,target:s});return(0,e.createElement)("a",jo({},c,{href:d,onClick:function(e){r&&r(e),e.defaultPrevented||o||f(e)},ref:n,target:s}))}));function Oo(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function Po(e,t,n){var r={};return Object.keys(e).forEach((function(o){r[o]=e[o].reduce((function(e,r){return r&&(n&&n[r]&&e.push(n[r]),e.push(t(r))),e}),[]).join(" ")})),r}var Eo=He,Mo=["variant"];function _o(e){return 0===e.length}function Do(e){var t=e.variant,n=Te(e,Mo),r=t||"";return Object.keys(n).sort().forEach((function(t){r+="color"===t?_o(r)?e[t]:He(e[t]):"".concat(_o(r)?t:He(t)).concat(He(e[t].toString()))})),r}var Io=["name","slot","skipVariantsResolver","skipSx","overridesResolver"],Ao=["theme"],No=["theme"];function Lo(e){return 0===Object.keys(e).length}var zo=function(e,t){return t.components&&t.components[e]&&t.components[e].styleOverrides?t.components[e].styleOverrides:null},Fo=function(e,t){var n=[];t&&t.components&&t.components[e]&&t.components[e].variants&&(n=t.components[e].variants);var r={};return n.forEach((function(e){var t=Do(e.props);r[t]=e.style})),r},Wo=function(e,t,n,r){var o,i,a=e.ownerState,l=void 0===a?{}:a,s=[],u=null==n||null==(o=n.components)||null==(i=o[r])?void 0:i.variants;return u&&u.forEach((function(n){var r=!0;Object.keys(n.props).forEach((function(t){l[t]!==n.props[t]&&e[t]!==n.props[t]&&(r=!1)})),r&&s.push(t[Do(n.props)])})),s};function Bo(e){return"ownerState"!==e&&"theme"!==e&&"sx"!==e&&"as"!==e}var Vo=pt();var qo=function(e){return Bo(e)&&"classes"!==e},Ho=Bo,Uo=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.defaultTheme,n=void 0===t?Vo:t,o=e.rootShouldForwardProp,i=void 0===o?Bo:o,a=e.slotShouldForwardProp,l=void 0===a?Bo:a,s=e.styleFunctionSx,u=void 0===s?Cr:s;return function(e){var t,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=o.name,s=o.slot,c=o.skipVariantsResolver,d=o.skipSx,f=o.overridesResolver,p=Te(o,Io),h=void 0!==c?c:s&&"Root"!==s||!1,m=d||!1;var v=Bo;"Root"===s?v=i:s&&(v=l);var g=_n(e,r({shouldForwardProp:v,label:t},p)),y=function(e){for(var t=arguments.length,o=new Array(t>1?t-1:0),i=1;i<t;i++)o[i-1]=arguments[i];var l=o?o.map((function(e){return"function"===typeof e&&e.__emotion_real!==e?function(t){var o=t.theme,i=Te(t,Ao);return e(r({theme:Lo(o)?n:o},i))}:e})):[],s=e;a&&f&&l.push((function(e){var t=Lo(e.theme)?n:e.theme,o=zo(a,t);if(o){var i={};return Object.entries(o).forEach((function(n){var o=Ne(n,2),a=o[0],l=o[1];i[a]="function"===typeof l?l(r({},e,{theme:t})):l})),f(e,i)}return null})),a&&!h&&l.push((function(e){var t=Lo(e.theme)?n:e.theme;return Wo(e,Fo(a,t),t,a)})),m||l.push((function(e){var t=Lo(e.theme)?n:e.theme;return u(r({},e,{theme:t}))}));var c=l.length-o.length;if(Array.isArray(e)&&c>0){var d=new Array(c).fill("");(s=[].concat(Rr(e),Rr(d))).raw=[].concat(Rr(e.raw),Rr(d))}else"function"===typeof e&&e.__emotion_real!==e&&(s=function(t){var o=t.theme,i=Te(t,No);return e(r({theme:Lo(o)?n:o},i))});var p=g.apply(void 0,[s].concat(Rr(l)));return p};return g.withConfig&&(y.withConfig=g.withConfig),y}}({defaultTheme:an,rootShouldForwardProp:qo}),Yo=Uo,Go={active:"active",checked:"checked",completed:"completed",disabled:"disabled",error:"error",expanded:"expanded",focused:"focused",focusVisible:"focusVisible",required:"required",selected:"selected"};function Qo(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"Mui",r=Go[t];return r?"".concat(n,"-").concat(r):"".concat(_r.generate(e),"-").concat(t)}function $o(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"Mui",r={};return t.forEach((function(t){r[t]=Qo(e,t,n)})),r}function Ko(e){return Qo("MuiCircularProgress",e)}$o("MuiCircularProgress",["root","determinate","indeterminate","colorPrimary","colorSecondary","svg","circle","circleDeterminate","circleIndeterminate","circleDisableShrink"]);var Xo,Zo,Jo,ei,ti,ni,ri,oi,ii=["className","color","disableShrink","size","style","thickness","value","variant"],ai=44,li=hn(ti||(ti=Xo||(Xo=Oo(["\n  0% {\n    transform: rotate(0deg);\n  }\n\n  100% {\n    transform: rotate(360deg);\n  }\n"])))),si=hn(ni||(ni=Zo||(Zo=Oo(["\n  0% {\n    stroke-dasharray: 1px, 200px;\n    stroke-dashoffset: 0;\n  }\n\n  50% {\n    stroke-dasharray: 100px, 200px;\n    stroke-dashoffset: -15px;\n  }\n\n  100% {\n    stroke-dasharray: 100px, 200px;\n    stroke-dashoffset: -125px;\n  }\n"])))),ui=Yo("span",{name:"MuiCircularProgress",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,t[n.variant],t["color".concat(Eo(n.color))]]}})((function(e){var t=e.ownerState,n=e.theme;return r({display:"inline-block"},"determinate"===t.variant&&{transition:n.transitions.create("transform")},"inherit"!==t.color&&{color:(n.vars||n).palette[t.color].main})}),(function(e){return"indeterminate"===e.ownerState.variant&&pn(ri||(ri=Jo||(Jo=Oo(["\n      animation: "," 1.4s linear infinite;\n    "]))),li)})),ci=Yo("svg",{name:"MuiCircularProgress",slot:"Svg",overridesResolver:function(e,t){return t.svg}})({display:"block"}),di=Yo("circle",{name:"MuiCircularProgress",slot:"Circle",overridesResolver:function(e,t){var n=e.ownerState;return[t.circle,t["circle".concat(Eo(n.variant))],n.disableShrink&&t.circleDisableShrink]}})((function(e){var t=e.ownerState,n=e.theme;return r({stroke:"currentColor"},"determinate"===t.variant&&{transition:n.transitions.create("stroke-dashoffset")},"indeterminate"===t.variant&&{strokeDasharray:"80px, 200px",strokeDashoffset:0})}),(function(e){var t=e.ownerState;return"indeterminate"===t.variant&&!t.disableShrink&&pn(oi||(oi=ei||(ei=Oo(["\n      animation: "," 1.4s ease-in-out infinite;\n    "]))),si)})),fi=e.forwardRef((function(e,t){var n=ln({props:e,name:"MuiCircularProgress"}),o=n.className,i=n.color,a=void 0===i?"primary":i,s=n.disableShrink,u=void 0!==s&&s,c=n.size,d=void 0===c?40:c,f=n.style,p=n.thickness,h=void 0===p?3.6:p,m=n.value,v=void 0===m?0:m,g=n.variant,y=void 0===g?"indeterminate":g,x=Te(n,ii),b=r({},n,{color:a,disableShrink:u,size:d,thickness:h,value:v,variant:y}),w=function(e){var t=e.classes,n=e.variant,r=e.color,o=e.disableShrink;return Po({root:["root",n,"color".concat(Eo(r))],svg:["svg"],circle:["circle","circle".concat(Eo(n)),o&&"circleDisableShrink"]},Ko,t)}(b),S={},j={},k={};if("determinate"===y){var C=2*Math.PI*((ai-h)/2);S.strokeDasharray=C.toFixed(3),k["aria-valuenow"]=Math.round(v),S.strokeDashoffset="".concat(((100-v)/100*C).toFixed(3),"px"),j.transform="rotate(-90deg)"}return(0,l.jsx)(ui,r({className:wn(w.root,o),style:r({width:d,height:d},j,f),ownerState:b,ref:t,role:"progressbar"},k,x,{children:(0,l.jsx)(ci,{className:w.svg,ownerState:b,viewBox:"".concat(22," ").concat(22," ").concat(ai," ").concat(ai),children:(0,l.jsx)(di,{className:w.circle,style:S,ownerState:b,cx:ai,cy:ai,r:(ai-h)/2,fill:"none",strokeWidth:h})})}))})),pi=fi;function hi(){return gt(an)}var mi=e.createContext();function vi(e){return Qo("MuiGrid",e)}var gi=["auto",!0,1,2,3,4,5,6,7,8,9,10,11,12],yi=$o("MuiGrid",["root","container","item","zeroMinWidth"].concat(Rr([0,1,2,3,4,5,6,7,8,9,10].map((function(e){return"spacing-xs-".concat(e)}))),Rr(["column-reverse","column","row-reverse","row"].map((function(e){return"direction-xs-".concat(e)}))),Rr(["nowrap","wrap-reverse","wrap"].map((function(e){return"wrap-xs-".concat(e)}))),Rr(gi.map((function(e){return"grid-xs-".concat(e)}))),Rr(gi.map((function(e){return"grid-sm-".concat(e)}))),Rr(gi.map((function(e){return"grid-md-".concat(e)}))),Rr(gi.map((function(e){return"grid-lg-".concat(e)}))),Rr(gi.map((function(e){return"grid-xl-".concat(e)}))))),xi=yi,bi=["className","columns","columnSpacing","component","container","direction","item","rowSpacing","spacing","wrap","zeroMinWidth"];function wi(e){var t=parseFloat(e);return"".concat(t).concat(String(e).replace(String(t),"")||"px")}var Si=Yo("div",{name:"MuiGrid",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState,r=n.container,o=n.direction,i=n.item,a=n.spacing,l=n.wrap,s=n.zeroMinWidth,u=n.breakpoints,c=[];r&&(c=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(!e||e<=0)return[];if("string"===typeof e&&!Number.isNaN(Number(e))||"number"===typeof e)return[n["spacing-xs-".concat(String(e))]];var r=[];return t.forEach((function(t){var o=e[t];Number(o)>0&&r.push(n["spacing-".concat(t,"-").concat(String(o))])})),r}(a,u,t));var d=[];return u.forEach((function(e){var r=n[e];r&&d.push(t["grid-".concat(e,"-").concat(String(r))])})),[t.root,r&&t.container,i&&t.item,s&&t.zeroMinWidth].concat(Rr(c),["row"!==o&&t["direction-xs-".concat(String(o))],"wrap"!==l&&t["wrap-xs-".concat(String(l))]],d)}})((function(e){var t=e.ownerState;return r({boxSizing:"border-box"},t.container&&{display:"flex",flexWrap:"wrap",width:"100%"},t.item&&{margin:0},t.zeroMinWidth&&{minWidth:0},"wrap"!==t.wrap&&{flexWrap:t.wrap})}),(function(e){var t=e.theme;return Fe({theme:t},Ve({values:e.ownerState.direction,breakpoints:t.breakpoints.values}),(function(e){var t={flexDirection:e};return 0===e.indexOf("column")&&(t["& > .".concat(xi.item)]={maxWidth:"none"}),t}))}),(function(e){var t=e.theme,n=e.ownerState,r=n.container,o=n.rowSpacing,i={};if(r&&0!==o){var a=Ve({values:o,breakpoints:t.breakpoints.values});i=Fe({theme:t},a,(function(e){var n=t.spacing(e);return"0px"!==n?Ee({marginTop:"-".concat(wi(n))},"& > .".concat(xi.item),{paddingTop:wi(n)}):{}}))}return i}),(function(e){var t=e.theme,n=e.ownerState,r=n.container,o=n.columnSpacing,i={};if(r&&0!==o){var a=Ve({values:o,breakpoints:t.breakpoints.values});i=Fe({theme:t},a,(function(e){var n=t.spacing(e);return"0px"!==n?Ee({width:"calc(100% + ".concat(wi(n),")"),marginLeft:"-".concat(wi(n))},"& > .".concat(xi.item),{paddingLeft:wi(n)}):{}}))}return i}),(function(e){var t,n=e.theme,o=e.ownerState;return n.breakpoints.keys.reduce((function(e,i){var a={};if(o[i]&&(t=o[i]),!t)return e;if(!0===t)a={flexBasis:0,flexGrow:1,maxWidth:"100%"};else if("auto"===t)a={flexBasis:"auto",flexGrow:0,flexShrink:0,maxWidth:"none",width:"auto"};else{var l=Ve({values:o.columns,breakpoints:n.breakpoints.values}),s="object"===typeof l?l[i]:l;if(void 0===s||null===s)return e;var u="".concat(Math.round(t/s*1e8)/1e6,"%"),c={};if(o.container&&o.item&&0!==o.columnSpacing){var d=n.spacing(o.columnSpacing);if("0px"!==d){var f="calc(".concat(u," + ").concat(wi(d),")");c={flexBasis:f,maxWidth:f}}}a=r({flexBasis:u,flexGrow:0,maxWidth:u},c)}return 0===n.breakpoints.values[i]?Object.assign(e,a):e[n.breakpoints.up(i)]=a,e}),{})}));var ji=function(e){var t=e.classes,n=e.container,r=e.direction,o=e.item,i=e.spacing,a=e.wrap,l=e.zeroMinWidth,s=e.breakpoints,u=[];n&&(u=function(e,t){if(!e||e<=0)return[];if("string"===typeof e&&!Number.isNaN(Number(e))||"number"===typeof e)return["spacing-xs-".concat(String(e))];var n=[];return t.forEach((function(t){var r=e[t];if(Number(r)>0){var o="spacing-".concat(t,"-").concat(String(r));n.push(o)}})),n}(i,s));var c=[];return s.forEach((function(t){var n=e[t];n&&c.push("grid-".concat(t,"-").concat(String(n)))})),Po({root:["root",n&&"container",o&&"item",l&&"zeroMinWidth"].concat(Rr(u),["row"!==r&&"direction-xs-".concat(String(r)),"wrap"!==a&&"wrap-xs-".concat(String(a))],c)},vi,t)},ki=e.forwardRef((function(t,n){var o=ln({props:t,name:"MuiGrid"}),i=hi().breakpoints,a=Or(o),s=a.className,u=a.columns,c=a.columnSpacing,d=a.component,f=void 0===d?"div":d,p=a.container,h=void 0!==p&&p,m=a.direction,v=void 0===m?"row":m,g=a.item,y=void 0!==g&&g,x=a.rowSpacing,b=a.spacing,w=void 0===b?0:b,S=a.wrap,j=void 0===S?"wrap":S,k=a.zeroMinWidth,C=void 0!==k&&k,R=Te(a,bi),T=x||w,O=c||w,P=e.useContext(mi),E=h?u||12:P,M={},_=r({},R);i.keys.forEach((function(e){null!=R[e]&&(M[e]=R[e],delete _[e])}));var D=r({},a,{columns:E,container:h,direction:v,item:y,rowSpacing:T,columnSpacing:O,wrap:j,zeroMinWidth:C,spacing:w},M,{breakpoints:i.keys}),I=ji(D);return(0,l.jsx)(mi.Provider,{value:E,children:(0,l.jsx)(Si,r({ownerState:D,className:wn(I.root,s),as:f,ref:n},_))})})),Ci=ki,Ri=function(e){return(0,l.jsx)(Ir,{position:"fixed",top:"0",left:"0",width:"100%",height:"100%",display:"flex",flexDirection:"column",bgcolor:"secondary.main",children:e.children})},Ti=function(e){return(0,l.jsx)(Ir,{position:"fixed",top:"0",left:"0",width:"100%",height:"100%",display:"flex",flexDirection:"column",bgcolor:"secondary.main",style:{backgroundImage:"url(pattern.svg)",backgroundSize:"120vw 120vw",backgroundRepeat:"no-repeat",backgroundPosition:"50% 60%"},children:e.children})};function Oi(e){return Qo("MuiPaper",e)}$o("MuiPaper",["root","rounded","outlined","elevation","elevation0","elevation1","elevation2","elevation3","elevation4","elevation5","elevation6","elevation7","elevation8","elevation9","elevation10","elevation11","elevation12","elevation13","elevation14","elevation15","elevation16","elevation17","elevation18","elevation19","elevation20","elevation21","elevation22","elevation23","elevation24"]);var Pi=["className","component","elevation","square","variant"],Ei=function(e){return((e<1?5.11916*Math.pow(e,2):4.5*Math.log(e+1)+2)/100).toFixed(2)},Mi=Yo("div",{name:"MuiPaper",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,t[n.variant],!n.square&&t.rounded,"elevation"===n.variant&&t["elevation".concat(n.elevation)]]}})((function(e){var t,n=e.theme,o=e.ownerState;return r({backgroundColor:(n.vars||n).palette.background.paper,color:(n.vars||n).palette.text.primary,transition:n.transitions.create("box-shadow")},!o.square&&{borderRadius:n.shape.borderRadius},"outlined"===o.variant&&{border:"1px solid ".concat((n.vars||n).palette.divider)},"elevation"===o.variant&&r({boxShadow:(n.vars||n).shadows[o.elevation]},!n.vars&&"dark"===n.palette.mode&&{backgroundImage:"linear-gradient(".concat(Tt("#fff",Ei(o.elevation)),", ").concat(Tt("#fff",Ei(o.elevation)),")")},n.vars&&{backgroundImage:null==(t=n.vars.overlays)?void 0:t[o.elevation]}))})),_i=e.forwardRef((function(e,t){var n=ln({props:e,name:"MuiPaper"}),o=n.className,i=n.component,a=void 0===i?"div":i,s=n.elevation,u=void 0===s?1:s,c=n.square,d=void 0!==c&&c,f=n.variant,p=void 0===f?"elevation":f,h=Te(n,Pi),m=r({},n,{component:a,elevation:u,square:d,variant:p}),v=function(e){var t=e.square,n=e.elevation,r=e.variant,o=e.classes;return Po({root:["root",r,!t&&"rounded","elevation"===r&&"elevation".concat(n)]},Oi,o)}(m);return(0,l.jsx)(Mi,r({as:a,ownerState:m,className:wn(v.root,o),ref:t},h))})),Di=_i;function Ii(e){return Qo("MuiTypography",e)}$o("MuiTypography",["root","h1","h2","h3","h4","h5","h6","subtitle1","subtitle2","body1","body2","inherit","button","caption","overline","alignLeft","alignRight","alignCenter","alignJustify","noWrap","gutterBottom","paragraph"]);var Ai=["align","className","component","gutterBottom","noWrap","paragraph","variant","variantMapping"],Ni=Yo("span",{name:"MuiTypography",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,n.variant&&t[n.variant],"inherit"!==n.align&&t["align".concat(Eo(n.align))],n.noWrap&&t.noWrap,n.gutterBottom&&t.gutterBottom,n.paragraph&&t.paragraph]}})((function(e){var t=e.theme,n=e.ownerState;return r({margin:0},n.variant&&t.typography[n.variant],"inherit"!==n.align&&{textAlign:n.align},n.noWrap&&{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},n.gutterBottom&&{marginBottom:"0.35em"},n.paragraph&&{marginBottom:16})})),Li={h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",h6:"h6",subtitle1:"h6",subtitle2:"h6",body1:"p",body2:"p",inherit:"p"},zi={primary:"primary.main",textPrimary:"text.primary",secondary:"secondary.main",textSecondary:"text.secondary",error:"error.main"},Fi=e.forwardRef((function(e,t){var n=ln({props:e,name:"MuiTypography"}),o=function(e){return zi[e]||e}(n.color),i=Or(r({},n,{color:o})),a=i.align,s=void 0===a?"inherit":a,u=i.className,c=i.component,d=i.gutterBottom,f=void 0!==d&&d,p=i.noWrap,h=void 0!==p&&p,m=i.paragraph,v=void 0!==m&&m,g=i.variant,y=void 0===g?"body1":g,x=i.variantMapping,b=void 0===x?Li:x,w=Te(i,Ai),S=r({},i,{align:s,color:o,className:u,component:c,gutterBottom:f,noWrap:h,paragraph:v,variant:y,variantMapping:b}),j=c||(v?"p":b[y]||Li[y])||"span",k=function(e){var t=e.align,n=e.gutterBottom,r=e.noWrap,o=e.paragraph,i=e.variant,a=e.classes;return Po({root:["root",i,"inherit"!==e.align&&"align".concat(Eo(t)),n&&"gutterBottom",r&&"noWrap",o&&"paragraph"]},Ii,a)}(S);return(0,l.jsx)(Ni,r({as:j,ref:t,ownerState:S,className:wn(k.root,u)},w))})),Wi=Fi;function Bi(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return null===e||void 0===e?void 0:e.toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")}var Vi=function(e){var t=e.label,n=e.value;return(0,l.jsxs)(Ir,{component:Di,height:60,padding:1,display:"flex",flexDirection:"row",alignItems:"center",bgcolor:"#121212dd",justifyContent:"space-between",children:[(0,l.jsxs)(Ir,{display:"flex",flexDirection:"column",children:[(0,l.jsx)(Wi,{align:"left",variant:"h6",children:t}),(0,l.jsx)(Wi,{align:"left",color:"GrayText",variant:"caption",children:n?"Connected":"Disconnected"})]}),(0,l.jsx)(Ir,{bgcolor:n?"success.main":"red",height:"24px",width:"24px",borderRadius:"12px",marginRight:1})]})},qi=function(e){var t=e.direction,n=void 0===t?"up":t,r=e.label,o=e.uploaded,i=e.saved,a=e.total;return(0,l.jsxs)(Ir,{component:Di,height:120,width:"28vw",marginRight:1,padding:1,display:"flex",flexDirection:"column",justifyContent:"space-between",bgcolor:"#121212dd",children:[(0,l.jsxs)(Ir,{display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center",children:[(0,l.jsx)(Wi,{align:"left",variant:"body1",fontWeight:"bold",children:r}),(0,l.jsx)(Wi,{align:"left",color:"GrayText",variant:"caption",children:Bi(a)})]}),(0,l.jsxs)(Ir,{display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center",children:[(0,l.jsx)(Wi,{variant:"body1",color:a===i?"success.main":"red",fontWeight:"bold",children:i?Bi(i):"0"}),(0,l.jsx)(Wi,{variant:"caption",color:"GrayText",children:"Saved"})]}),(0,l.jsxs)(Ir,{display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center",children:[(0,l.jsx)(Wi,{variant:"body1",color:o===i?"success.main":"red",fontWeight:"bold",children:o?Bi(o):"0"}),(0,l.jsx)(Wi,{variant:"caption",color:"GrayText",children:"up"===n?"Uploaded":"Downloaded"})]})]})},Hi=n(4569),Ui=n.n(Hi),Yi=window.env,Gi=Yi.BACKEND_URL,Qi=Yi.SERVER_PORT||4411,$i=JSON.parse(Yi.BRAND||"{}"),Ki=(Boolean(JSON.parse(Yi.REQUIRE_PATIENT_DETAILS||"0")),Ui().create({baseURL:"http://localhost:".concat(Qi)})),Xi=Ui().create({baseURL:Gi});function Zi(e){return null!=e&&"object"===typeof e&&!0===e["@@functional/placeholder"]}function Ji(e){return function t(n){return 0===arguments.length||Zi(n)?t:e.apply(this,arguments)}}function ea(e){return function t(n,r){switch(arguments.length){case 0:return t;case 1:return Zi(n)?t:Ji((function(t){return e(n,t)}));default:return Zi(n)&&Zi(r)?t:Zi(n)?Ji((function(t){return e(t,r)})):Zi(r)?Ji((function(t){return e(n,t)})):e(n,r)}}}var ta=Array.isArray||function(e){return null!=e&&e.length>=0&&"[object Array]"===Object.prototype.toString.call(e)};function na(e){return null!=e&&"function"===typeof e["@@transducer/step"]}function ra(e,t,n){return function(){if(0===arguments.length)return n();var r=arguments[arguments.length-1];if(!ta(r)){for(var o=0;o<e.length;){if("function"===typeof r[e[o]])return r[e[o]].apply(r,Array.prototype.slice.call(arguments,0,-1));o+=1}if(na(r)){var i=t.apply(null,Array.prototype.slice.call(arguments,0,-1));return i(r)}}return n.apply(this,arguments)}}var oa={init:function(){return this.xf["@@transducer/init"]()},result:function(e){return this.xf["@@transducer/result"](e)}};function ia(e,t){for(var n=0,r=t.length,o=Array(r);n<r;)o[n]=e(t[n]),n+=1;return o}function aa(e){return"[object String]"===Object.prototype.toString.call(e)}var la=Ji((function(e){return!!ta(e)||!!e&&("object"===typeof e&&(!aa(e)&&(0===e.length||e.length>0&&(e.hasOwnProperty(0)&&e.hasOwnProperty(e.length-1)))))})),sa=function(){function e(e){this.f=e}return e.prototype["@@transducer/init"]=function(){throw new Error("init not implemented on XWrap")},e.prototype["@@transducer/result"]=function(e){return e},e.prototype["@@transducer/step"]=function(e,t){return this.f(e,t)},e}();function ua(e,t){switch(e){case 0:return function(){return t.apply(this,arguments)};case 1:return function(e){return t.apply(this,arguments)};case 2:return function(e,n){return t.apply(this,arguments)};case 3:return function(e,n,r){return t.apply(this,arguments)};case 4:return function(e,n,r,o){return t.apply(this,arguments)};case 5:return function(e,n,r,o,i){return t.apply(this,arguments)};case 6:return function(e,n,r,o,i,a){return t.apply(this,arguments)};case 7:return function(e,n,r,o,i,a,l){return t.apply(this,arguments)};case 8:return function(e,n,r,o,i,a,l,s){return t.apply(this,arguments)};case 9:return function(e,n,r,o,i,a,l,s,u){return t.apply(this,arguments)};case 10:return function(e,n,r,o,i,a,l,s,u,c){return t.apply(this,arguments)};default:throw new Error("First argument to _arity must be a non-negative integer no greater than ten")}}var ca=ea((function(e,t){return ua(e.length,(function(){return e.apply(t,arguments)}))})),da=ca;function fa(e,t,n){for(var r=n.next();!r.done;){if((t=e["@@transducer/step"](t,r.value))&&t["@@transducer/reduced"]){t=t["@@transducer/value"];break}r=n.next()}return e["@@transducer/result"](t)}function pa(e,t,n,r){return e["@@transducer/result"](n[r](da(e["@@transducer/step"],e),t))}var ha="undefined"!==typeof Symbol?Symbol.iterator:"@@iterator";function ma(e,t,n){if("function"===typeof e&&(e=function(e){return new sa(e)}(e)),la(n))return function(e,t,n){for(var r=0,o=n.length;r<o;){if((t=e["@@transducer/step"](t,n[r]))&&t["@@transducer/reduced"]){t=t["@@transducer/value"];break}r+=1}return e["@@transducer/result"](t)}(e,t,n);if("function"===typeof n["fantasy-land/reduce"])return pa(e,t,n,"fantasy-land/reduce");if(null!=n[ha])return fa(e,t,n[ha]());if("function"===typeof n.next)return fa(e,t,n);if("function"===typeof n.reduce)return pa(e,t,n,"reduce");throw new TypeError("reduce: list must be array or iterable")}var va=function(){function e(e,t){this.xf=t,this.f=e}return e.prototype["@@transducer/init"]=oa.init,e.prototype["@@transducer/result"]=oa.result,e.prototype["@@transducer/step"]=function(e,t){return this.xf["@@transducer/step"](e,this.f(t))},e}(),ga=ea((function(e,t){return new va(e,t)}));function ya(e,t,n){return function(){for(var r=[],o=0,i=e,a=0;a<t.length||o<arguments.length;){var l;a<t.length&&(!Zi(t[a])||o>=arguments.length)?l=t[a]:(l=arguments[o],o+=1),r[a]=l,Zi(l)||(i-=1),a+=1}return i<=0?n.apply(this,r):ua(i,ya(e,r,n))}}var xa=ea((function(e,t){return 1===e?Ji(t):ua(e,ya(e,[],t))}));function ba(e,t){return Object.prototype.hasOwnProperty.call(t,e)}var wa=Object.prototype.toString,Sa=function(){return"[object Arguments]"===wa.call(arguments)?function(e){return"[object Arguments]"===wa.call(e)}:function(e){return ba("callee",e)}}(),ja=Sa,ka=!{toString:null}.propertyIsEnumerable("toString"),Ca=["constructor","valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],Ra=function(){return arguments.propertyIsEnumerable("length")}(),Ta=function(e,t){for(var n=0;n<e.length;){if(e[n]===t)return!0;n+=1}return!1},Oa="function"!==typeof Object.keys||Ra?Ji((function(e){if(Object(e)!==e)return[];var t,n,r=[],o=Ra&&ja(e);for(t in e)!ba(t,e)||o&&"length"===t||(r[r.length]=t);if(ka)for(n=Ca.length-1;n>=0;)ba(t=Ca[n],e)&&!Ta(r,t)&&(r[r.length]=t),n-=1;return r})):Ji((function(e){return Object(e)!==e?[]:Object.keys(e)})),Pa=ea(ra(["fantasy-land/map","map"],ga,(function(e,t){switch(Object.prototype.toString.call(t)){case"[object Function]":return xa(t.length,(function(){return e.call(this,t.apply(this,arguments))}));case"[object Object]":return ma((function(n,r){return n[r]=e(t[r]),n}),{},Oa(t));default:return ia(e,t)}}))),Ea=Pa,Ma=Number.isInteger||function(e){return e<<0===e},_a=ea((function(e,t){var n=e<0?t.length+e:e;return aa(t)?t.charAt(n):t[n]})),Da=_a,Ia=ea((function(e,t){if(null!=t)return Ma(e)?Da(e,t):t[e]})),Aa=ea((function(e,t){return Ea(Ia(e),t)}));function Na(e){for(var t,n=[];!(t=e.next()).done;)n.push(t.value);return n}function La(e,t,n){for(var r=0,o=n.length;r<o;){if(e(t,n[r]))return!0;r+=1}return!1}var za="function"===typeof Object.is?Object.is:function(e,t){return e===t?0!==e||1/e===1/t:e!==e&&t!==t},Fa=Ji((function(e){return null===e?"Null":void 0===e?"Undefined":Object.prototype.toString.call(e).slice(8,-1)}));function Wa(e,t,n,r){var o=Na(e);function i(e,t){return Ba(e,t,n.slice(),r.slice())}return!La((function(e,t){return!La(i,t,e)}),Na(t),o)}function Ba(e,t,n,r){if(za(e,t))return!0;var o=Fa(e);if(o!==Fa(t))return!1;if("function"===typeof e["fantasy-land/equals"]||"function"===typeof t["fantasy-land/equals"])return"function"===typeof e["fantasy-land/equals"]&&e["fantasy-land/equals"](t)&&"function"===typeof t["fantasy-land/equals"]&&t["fantasy-land/equals"](e);if("function"===typeof e.equals||"function"===typeof t.equals)return"function"===typeof e.equals&&e.equals(t)&&"function"===typeof t.equals&&t.equals(e);switch(o){case"Arguments":case"Array":case"Object":if("function"===typeof e.constructor&&"Promise"===function(e){var t=String(e).match(/^function (\w*)/);return null==t?"":t[1]}(e.constructor))return e===t;break;case"Boolean":case"Number":case"String":if(typeof e!==typeof t||!za(e.valueOf(),t.valueOf()))return!1;break;case"Date":if(!za(e.valueOf(),t.valueOf()))return!1;break;case"Error":return e.name===t.name&&e.message===t.message;case"RegExp":if(e.source!==t.source||e.global!==t.global||e.ignoreCase!==t.ignoreCase||e.multiline!==t.multiline||e.sticky!==t.sticky||e.unicode!==t.unicode)return!1}for(var i=n.length-1;i>=0;){if(n[i]===e)return r[i]===t;i-=1}switch(o){case"Map":return e.size===t.size&&Wa(e.entries(),t.entries(),n.concat([e]),r.concat([t]));case"Set":return e.size===t.size&&Wa(e.values(),t.values(),n.concat([e]),r.concat([t]));case"Arguments":case"Array":case"Object":case"Boolean":case"Number":case"String":case"Date":case"Error":case"RegExp":case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"ArrayBuffer":break;default:return!1}var a=Oa(e);if(a.length!==Oa(t).length)return!1;var l=n.concat([e]),s=r.concat([t]);for(i=a.length-1;i>=0;){var u=a[i];if(!ba(u,t)||!Ba(t[u],e[u],l,s))return!1;i-=1}return!0}var Va=ea((function(e,t){return Ba(e,t,[],[])}));function qa(e,t){return function(e,t,n){var r,o;if("function"===typeof e.indexOf)switch(typeof t){case"number":if(0===t){for(r=1/t;n<e.length;){if(0===(o=e[n])&&1/o===r)return n;n+=1}return-1}if(t!==t){for(;n<e.length;){if("number"===typeof(o=e[n])&&o!==o)return n;n+=1}return-1}return e.indexOf(t,n);case"string":case"boolean":case"function":case"undefined":return e.indexOf(t,n);case"object":if(null===t)return e.indexOf(t,n)}for(;n<e.length;){if(Va(e[n],t))return n;n+=1}return-1}(t,e,0)>=0}var Ha=function(e){return(e<10?"0":"")+e};Date.prototype.toISOString;function Ua(e,t,n){var r,o=typeof e;switch(o){case"string":case"number":return 0===e&&1/e===-1/0?!!n._items["-0"]||(t&&(n._items["-0"]=!0),!1):null!==n._nativeSet?t?(r=n._nativeSet.size,n._nativeSet.add(e),n._nativeSet.size===r):n._nativeSet.has(e):o in n._items?e in n._items[o]||(t&&(n._items[o][e]=!0),!1):(t&&(n._items[o]={},n._items[o][e]=!0),!1);case"boolean":if(o in n._items){var i=e?1:0;return!!n._items[o][i]||(t&&(n._items[o][i]=!0),!1)}return t&&(n._items[o]=e?[!1,!0]:[!0,!1]),!1;case"function":return null!==n._nativeSet?t?(r=n._nativeSet.size,n._nativeSet.add(e),n._nativeSet.size===r):n._nativeSet.has(e):o in n._items?!!qa(e,n._items[o])||(t&&n._items[o].push(e),!1):(t&&(n._items[o]=[e]),!1);case"undefined":return!!n._items[o]||(t&&(n._items[o]=!0),!1);case"object":if(null===e)return!!n._items.null||(t&&(n._items.null=!0),!1);default:return(o=Object.prototype.toString.call(e))in n._items?!!qa(e,n._items[o])||(t&&n._items[o].push(e),!1):(t&&(n._items[o]=[e]),!1)}}var Ya=function(){function e(){this._nativeSet="function"===typeof Set?new Set:null,this._items={}}return e.prototype.add=function(e){return!Ua(e,!0,this)},e.prototype.has=function(e){return Ua(e,!1,this)},e}();function Ga(e){return e}var Qa=Ji(Ga),$a=function(){function e(e,t){this.xf=t,this.f=e,this.set=new Ya}return e.prototype["@@transducer/init"]=oa.init,e.prototype["@@transducer/result"]=oa.result,e.prototype["@@transducer/step"]=function(e,t){return this.set.add(this.f(t))?this.xf["@@transducer/step"](e,t):e},e}(),Ka=ea(ra([],ea((function(e,t){return new $a(e,t)})),(function(e,t){for(var n,r,o=new Ya,i=[],a=0;a<t.length;)n=e(r=t[a]),o.add(n)&&i.push(r),a+=1;return i}))),Xa=Ka(Qa);var Za="function"===typeof Object.assign?Object.assign:function(e){if(null==e)throw new TypeError("Cannot convert undefined or null to object");for(var t=Object(e),n=1,r=arguments.length;n<r;){var o=arguments[n];if(null!=o)for(var i in o)ba(i,o)&&(t[i]=o[i]);n+=1}return t};var Ja=Ji((function(e){return null==e})),el=Ji((function(e){return Za.apply(null,[{}].concat(e))}));var tl="\t\n\v\f\r \xa0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029\ufeff",nl=(String.prototype.trim,function(e){var t,n=e.sites,r=e.modules;return n.length?(0,l.jsxs)(Ir,{component:Di,padding:1,children:[(0,l.jsx)(Ir,{display:"flex",flexDirection:"row",justifyContent:"space-between",children:(0,l.jsx)(Wi,{variant:"h6",children:"Modules"})}),(0,l.jsx)(Ir,{paddingBottom:1}),(0,l.jsx)(Ci,{container:!0,spacing:1,children:null===n||void 0===n||null===(t=n.sort())||void 0===t?void 0:t.map((function(e){var t=r.find((function(t){return t.position===e&&!t.replaced}));return(0,l.jsx)(Ci,{xs:3,item:!0,children:(0,l.jsxs)(Ir,{component:Di,style:{padding:"4px",backgroundColor:Ja(t)?"gray":null!==t&&void 0!==t&&t.disabled?"red":"green"},children:[(0,l.jsxs)(Ir,{display:"flex",justifyContent:"space-between",alignItems:"center",children:[(0,l.jsx)(Wi,{variant:"caption",children:e}),t?(0,l.jsx)(Wi,{variant:"caption",children:t.serial}):null]}),(0,l.jsx)(Ir,{display:"flex",justifyContent:"space-between",alignItems:"center",children:(0,l.jsx)(Wi,{variant:"caption",children:Ja(t)?"EMPTY":null!==t&&void 0!==t&&t.disabled?"DISABLED":"ACTIVE"})})]})})}))})]}):(0,l.jsx)("div",{})});function rl(e){return Qo("MuiAppBar",e)}$o("MuiAppBar",["root","positionFixed","positionAbsolute","positionSticky","positionStatic","positionRelative","colorDefault","colorPrimary","colorSecondary","colorInherit","colorTransparent"]);var ol=["className","color","enableColorOnDark","position"],il=function(e,t){return"".concat(null==e?void 0:e.replace(")",""),", ").concat(t,")")},al=Yo(Di,{name:"MuiAppBar",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,t["position".concat(Eo(n.position))],t["color".concat(Eo(n.color))]]}})((function(e){var t=e.theme,n=e.ownerState,o="light"===t.palette.mode?t.palette.grey[100]:t.palette.grey[900];return r({display:"flex",flexDirection:"column",width:"100%",boxSizing:"border-box",flexShrink:0},"fixed"===n.position&&{position:"fixed",zIndex:(t.vars||t).zIndex.appBar,top:0,left:"auto",right:0,"@media print":{position:"absolute"}},"absolute"===n.position&&{position:"absolute",zIndex:(t.vars||t).zIndex.appBar,top:0,left:"auto",right:0},"sticky"===n.position&&{position:"sticky",zIndex:(t.vars||t).zIndex.appBar,top:0,left:"auto",right:0},"static"===n.position&&{position:"static"},"relative"===n.position&&{position:"relative"},!t.vars&&r({},"default"===n.color&&{backgroundColor:o,color:t.palette.getContrastText(o)},n.color&&"default"!==n.color&&"inherit"!==n.color&&"transparent"!==n.color&&{backgroundColor:t.palette[n.color].main,color:t.palette[n.color].contrastText},"inherit"===n.color&&{color:"inherit"},"dark"===t.palette.mode&&!n.enableColorOnDark&&{backgroundColor:null,color:null},"transparent"===n.color&&r({backgroundColor:"transparent",color:"inherit"},"dark"===t.palette.mode&&{backgroundImage:"none"})),t.vars&&r({},"default"===n.color&&{"--AppBar-background":n.enableColorOnDark?t.vars.palette.AppBar.defaultBg:il(t.vars.palette.AppBar.darkBg,t.vars.palette.AppBar.defaultBg),"--AppBar-color":n.enableColorOnDark?t.vars.palette.text.primary:il(t.vars.palette.AppBar.darkColor,t.vars.palette.text.primary)},n.color&&!n.color.match(/^(default|inherit|transparent)$/)&&{"--AppBar-background":n.enableColorOnDark?t.vars.palette[n.color].main:il(t.vars.palette.AppBar.darkBg,t.vars.palette[n.color].main),"--AppBar-color":n.enableColorOnDark?t.vars.palette[n.color].contrastText:il(t.vars.palette.AppBar.darkColor,t.vars.palette[n.color].contrastText)},{backgroundColor:"var(--AppBar-background)",color:"inherit"===n.color?"inherit":"var(--AppBar-color)"},"transparent"===n.color&&{backgroundImage:"none",backgroundColor:"transparent",color:"inherit"}))})),ll=e.forwardRef((function(e,t){var n=ln({props:e,name:"MuiAppBar"}),o=n.className,i=n.color,a=void 0===i?"primary":i,s=n.enableColorOnDark,u=void 0!==s&&s,c=n.position,d=void 0===c?"fixed":c,f=Te(n,ol),p=r({},n,{color:a,position:d,enableColorOnDark:u}),h=function(e){var t=e.color,n=e.position,r=e.classes;return Po({root:["root","color".concat(Eo(t)),"position".concat(Eo(n))]},rl,r)}(p);return(0,l.jsx)(al,r({square:!0,component:"header",ownerState:p,elevation:4,className:wn(h.root,o,"fixed"===d&&"mui-fixed"),ref:t},f))})),sl=ll;function ul(e){return Qo("MuiToolbar",e)}$o("MuiToolbar",["root","gutters","regular","dense"]);var cl=["className","component","disableGutters","variant"],dl=Yo("div",{name:"MuiToolbar",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,!n.disableGutters&&t.gutters,t[n.variant]]}})((function(e){var t=e.theme,n=e.ownerState;return r({position:"relative",display:"flex",alignItems:"center"},!n.disableGutters&&Ee({paddingLeft:t.spacing(2),paddingRight:t.spacing(2)},t.breakpoints.up("sm"),{paddingLeft:t.spacing(3),paddingRight:t.spacing(3)}),"dense"===n.variant&&{minHeight:48})}),(function(e){var t=e.theme;return"regular"===e.ownerState.variant&&t.mixins.toolbar})),fl=e.forwardRef((function(e,t){var n=ln({props:e,name:"MuiToolbar"}),o=n.className,i=n.component,a=void 0===i?"div":i,s=n.disableGutters,u=void 0!==s&&s,c=n.variant,d=void 0===c?"regular":c,f=Te(n,cl),p=r({},n,{component:a,disableGutters:u,variant:d}),h=function(e){var t=e.classes;return Po({root:["root",!e.disableGutters&&"gutters",e.variant]},ul,t)}(p);return(0,l.jsx)(dl,r({as:a,className:wn(h.root,o),ref:t,ownerState:p},f))})),pl=fl;n(8457);function hl(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:166;function r(){for(var r=this,o=arguments.length,i=new Array(o),a=0;a<o;a++)i[a]=arguments[a];var l=function(){e.apply(r,i)};clearTimeout(t),t=setTimeout(l,n)}return r.clear=function(){clearTimeout(t)},r}var ml,vl=hl;function gl(){if(ml)return ml;var e=document.createElement("div"),t=document.createElement("div");return t.style.width="10px",t.style.height="1px",e.appendChild(t),e.dir="rtl",e.style.fontSize="14px",e.style.width="4px",e.style.height="1px",e.style.position="absolute",e.style.top="-1000px",e.style.overflow="scroll",document.body.appendChild(e),ml="reverse",e.scrollLeft>0?ml="default":(e.scrollLeft=1,0===e.scrollLeft&&(ml="negative")),document.body.removeChild(e),ml}function yl(e,t){var n=e.scrollLeft;if("rtl"!==t)return n;switch(gl()){case"negative":return e.scrollWidth-e.clientWidth+n;case"reverse":return e.scrollWidth-e.clientWidth-n;default:return n}}function xl(e){return(1+Math.sin(Math.PI*e-Math.PI/2))/2}function bl(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:function(){},i=r.ease,a=void 0===i?xl:i,l=r.duration,s=void 0===l?300:l,u=null,c=t[e],d=!1,f=function(){d=!0},p=function r(i){if(d)o(new Error("Animation cancelled"));else{null===u&&(u=i);var l=Math.min(1,(i-u)/s);t[e]=a(l)*(n-c)+c,l>=1?requestAnimationFrame((function(){o(null)})):requestAnimationFrame(r)}};return c===n?(o(new Error("Element already at target position")),f):(requestAnimationFrame(p),f)}function wl(e){return e&&e.ownerDocument||document}function Sl(e){return wl(e).defaultView||window}var jl=Sl,kl=["onChange"],Cl={width:99,height:99,position:"absolute",top:-9999,overflow:"scroll"};function Rl(e){return Qo("MuiSvgIcon",e)}$o("MuiSvgIcon",["root","colorPrimary","colorSecondary","colorAction","colorError","colorDisabled","fontSizeInherit","fontSizeSmall","fontSizeMedium","fontSizeLarge"]);var Tl=["children","className","color","component","fontSize","htmlColor","inheritViewBox","titleAccess","viewBox"],Ol=Yo("svg",{name:"MuiSvgIcon",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,"inherit"!==n.color&&t["color".concat(Eo(n.color))],t["fontSize".concat(Eo(n.fontSize))]]}})((function(e){var t,n,r,o,i,a,l,s,u,c,d,f,p,h,m,v,g,y=e.theme,x=e.ownerState;return{userSelect:"none",width:"1em",height:"1em",display:"inline-block",fill:"currentColor",flexShrink:0,transition:null==(t=y.transitions)||null==(n=t.create)?void 0:n.call(t,"fill",{duration:null==(r=y.transitions)||null==(o=r.duration)?void 0:o.shorter}),fontSize:{inherit:"inherit",small:(null==(i=y.typography)||null==(a=i.pxToRem)?void 0:a.call(i,20))||"1.25rem",medium:(null==(l=y.typography)||null==(s=l.pxToRem)?void 0:s.call(l,24))||"1.5rem",large:(null==(u=y.typography)||null==(c=u.pxToRem)?void 0:c.call(u,35))||"2.1875"}[x.fontSize],color:null!=(d=null==(f=(y.vars||y).palette)||null==(p=f[x.color])?void 0:p.main)?d:{action:null==(h=(y.vars||y).palette)||null==(m=h.action)?void 0:m.active,disabled:null==(v=(y.vars||y).palette)||null==(g=v.action)?void 0:g.disabled,inherit:void 0}[x.color]}})),Pl=e.forwardRef((function(e,t){var n=ln({props:e,name:"MuiSvgIcon"}),o=n.children,i=n.className,a=n.color,s=void 0===a?"inherit":a,u=n.component,c=void 0===u?"svg":u,d=n.fontSize,f=void 0===d?"medium":d,p=n.htmlColor,h=n.inheritViewBox,m=void 0!==h&&h,v=n.titleAccess,g=n.viewBox,y=void 0===g?"0 0 24 24":g,x=Te(n,Tl),b=r({},n,{color:s,component:c,fontSize:f,instanceFontSize:e.fontSize,inheritViewBox:m,viewBox:y}),w={};m||(w.viewBox=y);var S=function(e){var t=e.color,n=e.fontSize,r=e.classes;return Po({root:["root","inherit"!==t&&"color".concat(Eo(t)),"fontSize".concat(Eo(n))]},Rl,r)}(b);return(0,l.jsxs)(Ol,r({as:c,className:wn(S.root,i),ownerState:b,focusable:"false",color:p,"aria-hidden":!v||void 0,role:v?"img":void 0,ref:t},w,x,{children:[o,v?(0,l.jsx)("title",{children:v}):null]}))}));Pl.muiName="SvgIcon";var El=Pl;function Ml(t,n){var o=function(e,o){return(0,l.jsx)(El,r({"data-testid":"".concat(n,"Icon"),ref:o},e,{children:t}))};return o.muiName=El.muiName,e.memo(e.forwardRef(o))}var _l=Ml((0,l.jsx)("path",{d:"M15.41 16.09l-4.58-4.59 4.58-4.59L14 5.5l-6 6 6 6z"}),"KeyboardArrowLeft"),Dl=Ml((0,l.jsx)("path",{d:"M8.59 16.34l4.58-4.59-4.58-4.59L10 5.75l6 6-6 6z"}),"KeyboardArrowRight");function Il(e,t){"function"===typeof e?e(t):e&&(e.current=t)}function Al(t,n){return e.useMemo((function(){return null==t&&null==n?null:function(e){Il(t,e),Il(n,e)}}),[t,n])}var Nl=Al,Ll="undefined"!==typeof window?e.useLayoutEffect:e.useEffect;function zl(t){var n=e.useRef(t);return Ll((function(){n.current=t})),e.useCallback((function(){return n.current.apply(void 0,arguments)}),[])}var Fl,Wl=zl,Bl=!0,Vl=!1,ql={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function Hl(e){e.metaKey||e.altKey||e.ctrlKey||(Bl=!0)}function Ul(){Bl=!1}function Yl(){"hidden"===this.visibilityState&&Vl&&(Bl=!0)}function Gl(e){var t=e.target;try{return t.matches(":focus-visible")}catch(n){}return Bl||function(e){var t=e.type,n=e.tagName;return!("INPUT"!==n||!ql[t]||e.readOnly)||"TEXTAREA"===n&&!e.readOnly||!!e.isContentEditable}(t)}var Ql=function(){var t=e.useCallback((function(e){var t;null!=e&&((t=e.ownerDocument).addEventListener("keydown",Hl,!0),t.addEventListener("mousedown",Ul,!0),t.addEventListener("pointerdown",Ul,!0),t.addEventListener("touchstart",Ul,!0),t.addEventListener("visibilitychange",Yl,!0))}),[]),n=e.useRef(!1);return{isFocusVisibleRef:n,onFocus:function(e){return!!Gl(e)&&(n.current=!0,!0)},onBlur:function(){return!!n.current&&(Vl=!0,window.clearTimeout(Fl),Fl=window.setTimeout((function(){Vl=!1}),100),n.current=!1,!0)},ref:t}};function $l(e,t){return $l=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},$l(e,t)}function Kl(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,$l(e,t)}var Xl=e.createContext(null);function Zl(t,n){var r=Object.create(null);return t&&e.Children.map(t,(function(e){return e})).forEach((function(t){r[t.key]=function(t){return n&&(0,e.isValidElement)(t)?n(t):t}(t)})),r}function Jl(e,t,n){return null!=n[t]?n[t]:e.props[t]}function es(t,n){return Zl(t.children,(function(r){return(0,e.cloneElement)(r,{onExited:n.bind(null,r),in:!0,appear:Jl(r,"appear",t),enter:Jl(r,"enter",t),exit:Jl(r,"exit",t)})}))}function ts(t,n,r){var o=Zl(t.children),i=function(e,t){function n(n){return n in t?t[n]:e[n]}e=e||{},t=t||{};var r,o=Object.create(null),i=[];for(var a in e)a in t?i.length&&(o[a]=i,i=[]):i.push(a);var l={};for(var s in t){if(o[s])for(r=0;r<o[s].length;r++){var u=o[s][r];l[o[s][r]]=n(u)}l[s]=n(s)}for(r=0;r<i.length;r++)l[i[r]]=n(i[r]);return l}(n,o);return Object.keys(i).forEach((function(a){var l=i[a];if((0,e.isValidElement)(l)){var s=a in n,u=a in o,c=n[a],d=(0,e.isValidElement)(c)&&!c.props.in;!u||s&&!d?u||!s||d?u&&s&&(0,e.isValidElement)(c)&&(i[a]=(0,e.cloneElement)(l,{onExited:r.bind(null,l),in:c.props.in,exit:Jl(l,"exit",t),enter:Jl(l,"enter",t)})):i[a]=(0,e.cloneElement)(l,{in:!1}):i[a]=(0,e.cloneElement)(l,{onExited:r.bind(null,l),in:!0,exit:Jl(l,"exit",t),enter:Jl(l,"enter",t)})}})),i}var ns=Object.values||function(e){return Object.keys(e).map((function(t){return e[t]}))},rs=function(t){function n(e,n){var r,o=(r=t.call(this,e,n)||this).handleExited.bind(function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(r));return r.state={contextValue:{isMounting:!0},handleExited:o,firstRender:!0},r}Kl(n,t);var o=n.prototype;return o.componentDidMount=function(){this.mounted=!0,this.setState({contextValue:{isMounting:!1}})},o.componentWillUnmount=function(){this.mounted=!1},n.getDerivedStateFromProps=function(e,t){var n=t.children,r=t.handleExited;return{children:t.firstRender?es(e,r):ts(e,n,r),firstRender:!1}},o.handleExited=function(e,t){var n=Zl(this.props.children);e.key in n||(e.props.onExited&&e.props.onExited(t),this.mounted&&this.setState((function(t){var n=r({},t.children);return delete n[e.key],{children:n}})))},o.render=function(){var t=this.props,n=t.component,r=t.childFactory,o=Te(t,["component","childFactory"]),i=this.state.contextValue,a=ns(this.state.children).map(r);return delete o.appear,delete o.enter,delete o.exit,null===n?e.createElement(Xl.Provider,{value:i},a):e.createElement(Xl.Provider,{value:i},e.createElement(n,o,a))},n}(e.Component);rs.propTypes={},rs.defaultProps={component:"div",childFactory:function(e){return e}};var os=rs;var is=function(t){var n=t.className,r=t.classes,o=t.pulsate,i=void 0!==o&&o,a=t.rippleX,s=t.rippleY,u=t.rippleSize,c=t.in,d=t.onExited,f=t.timeout,p=Ne(e.useState(!1),2),h=p[0],m=p[1],v=wn(n,r.ripple,r.rippleVisible,i&&r.ripplePulsate),g={width:u,height:u,top:-u/2+s,left:-u/2+a},y=wn(r.child,h&&r.childLeaving,i&&r.childPulsate);return c||h||m(!0),e.useEffect((function(){if(!c&&null!=d){var e=setTimeout(d,f);return function(){clearTimeout(e)}}}),[d,c,f]),(0,l.jsx)("span",{className:v,style:g,children:(0,l.jsx)("span",{className:y})})};var as,ls,ss,us,cs,ds,fs,ps,hs=$o("MuiTouchRipple",["root","ripple","rippleVisible","ripplePulsate","child","childLeaving","childPulsate"]),ms=["center","classes","className"],vs=hn(cs||(cs=as||(as=Oo(["\n  0% {\n    transform: scale(0);\n    opacity: 0.1;\n  }\n\n  100% {\n    transform: scale(1);\n    opacity: 0.3;\n  }\n"])))),gs=hn(ds||(ds=ls||(ls=Oo(["\n  0% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n  }\n"])))),ys=hn(fs||(fs=ss||(ss=Oo(["\n  0% {\n    transform: scale(1);\n  }\n\n  50% {\n    transform: scale(0.92);\n  }\n\n  100% {\n    transform: scale(1);\n  }\n"])))),xs=Yo("span",{name:"MuiTouchRipple",slot:"Root"})({overflow:"hidden",pointerEvents:"none",position:"absolute",zIndex:0,top:0,right:0,bottom:0,left:0,borderRadius:"inherit"}),bs=Yo(is,{name:"MuiTouchRipple",slot:"Ripple"})(ps||(ps=us||(us=Oo(["\n  opacity: 0;\n  position: absolute;\n\n  &."," {\n    opacity: 0.3;\n    transform: scale(1);\n    animation-name: ",";\n    animation-duration: ","ms;\n    animation-timing-function: ",";\n  }\n\n  &."," {\n    animation-duration: ","ms;\n  }\n\n  & ."," {\n    opacity: 1;\n    display: block;\n    width: 100%;\n    height: 100%;\n    border-radius: 50%;\n    background-color: currentColor;\n  }\n\n  & ."," {\n    opacity: 0;\n    animation-name: ",";\n    animation-duration: ","ms;\n    animation-timing-function: ",";\n  }\n\n  & ."," {\n    position: absolute;\n    /* @noflip */\n    left: 0px;\n    top: 0;\n    animation-name: ",";\n    animation-duration: 2500ms;\n    animation-timing-function: ",";\n    animation-iteration-count: infinite;\n    animation-delay: 200ms;\n  }\n"]))),hs.rippleVisible,vs,550,(function(e){return e.theme.transitions.easing.easeInOut}),hs.ripplePulsate,(function(e){return e.theme.transitions.duration.shorter}),hs.child,hs.childLeaving,gs,550,(function(e){return e.theme.transitions.easing.easeInOut}),hs.childPulsate,ys,(function(e){return e.theme.transitions.easing.easeInOut})),ws=e.forwardRef((function(t,n){var o=ln({props:t,name:"MuiTouchRipple"}),i=o.center,a=void 0!==i&&i,s=o.classes,u=void 0===s?{}:s,c=o.className,d=Te(o,ms),f=Ne(e.useState([]),2),p=f[0],h=f[1],m=e.useRef(0),v=e.useRef(null);e.useEffect((function(){v.current&&(v.current(),v.current=null)}),[p]);var g=e.useRef(!1),y=e.useRef(null),x=e.useRef(null),b=e.useRef(null);e.useEffect((function(){return function(){clearTimeout(y.current)}}),[]);var w=e.useCallback((function(e){var t=e.pulsate,n=e.rippleX,r=e.rippleY,o=e.rippleSize,i=e.cb;h((function(e){return[].concat(Rr(e),[(0,l.jsx)(bs,{classes:{ripple:wn(u.ripple,hs.ripple),rippleVisible:wn(u.rippleVisible,hs.rippleVisible),ripplePulsate:wn(u.ripplePulsate,hs.ripplePulsate),child:wn(u.child,hs.child),childLeaving:wn(u.childLeaving,hs.childLeaving),childPulsate:wn(u.childPulsate,hs.childPulsate)},timeout:550,pulsate:t,rippleX:n,rippleY:r,rippleSize:o},m.current)])})),m.current+=1,v.current=i}),[u]),S=e.useCallback((function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0,r=t.pulsate,o=void 0!==r&&r,i=t.center,l=void 0===i?a||t.pulsate:i,s=t.fakeElement,u=void 0!==s&&s;if("mousedown"===(null==e?void 0:e.type)&&g.current)g.current=!1;else{"touchstart"===(null==e?void 0:e.type)&&(g.current=!0);var c,d,f,p=u?null:b.current,h=p?p.getBoundingClientRect():{width:0,height:0,left:0,top:0};if(l||void 0===e||0===e.clientX&&0===e.clientY||!e.clientX&&!e.touches)c=Math.round(h.width/2),d=Math.round(h.height/2);else{var m=e.touches&&e.touches.length>0?e.touches[0]:e,v=m.clientX,S=m.clientY;c=Math.round(v-h.left),d=Math.round(S-h.top)}if(l)(f=Math.sqrt((2*Math.pow(h.width,2)+Math.pow(h.height,2))/3))%2===0&&(f+=1);else{var j=2*Math.max(Math.abs((p?p.clientWidth:0)-c),c)+2,k=2*Math.max(Math.abs((p?p.clientHeight:0)-d),d)+2;f=Math.sqrt(Math.pow(j,2)+Math.pow(k,2))}null!=e&&e.touches?null===x.current&&(x.current=function(){w({pulsate:o,rippleX:c,rippleY:d,rippleSize:f,cb:n})},y.current=setTimeout((function(){x.current&&(x.current(),x.current=null)}),80)):w({pulsate:o,rippleX:c,rippleY:d,rippleSize:f,cb:n})}}),[a,w]),j=e.useCallback((function(){S({},{pulsate:!0})}),[S]),k=e.useCallback((function(e,t){if(clearTimeout(y.current),"touchend"===(null==e?void 0:e.type)&&x.current)return x.current(),x.current=null,void(y.current=setTimeout((function(){k(e,t)})));x.current=null,h((function(e){return e.length>0?e.slice(1):e})),v.current=t}),[]);return e.useImperativeHandle(n,(function(){return{pulsate:j,start:S,stop:k}}),[j,S,k]),(0,l.jsx)(xs,r({className:wn(u.root,hs.root,c),ref:b},d,{children:(0,l.jsx)(os,{component:null,exit:!0,children:p})}))})),Ss=ws;function js(e){return Qo("MuiButtonBase",e)}var ks,Cs=$o("MuiButtonBase",["root","disabled","focusVisible"]),Rs=["action","centerRipple","children","className","component","disabled","disableRipple","disableTouchRipple","focusRipple","focusVisibleClassName","LinkComponent","onBlur","onClick","onContextMenu","onDragLeave","onFocus","onFocusVisible","onKeyDown","onKeyUp","onMouseDown","onMouseLeave","onMouseUp","onTouchEnd","onTouchMove","onTouchStart","tabIndex","TouchRippleProps","touchRippleRef","type"],Ts=Yo("button",{name:"MuiButtonBase",slot:"Root",overridesResolver:function(e,t){return t.root}})((Ee(ks={display:"inline-flex",alignItems:"center",justifyContent:"center",position:"relative",boxSizing:"border-box",WebkitTapHighlightColor:"transparent",backgroundColor:"transparent",outline:0,border:0,margin:0,borderRadius:0,padding:0,cursor:"pointer",userSelect:"none",verticalAlign:"middle",MozAppearance:"none",WebkitAppearance:"none",textDecoration:"none",color:"inherit","&::-moz-focus-inner":{borderStyle:"none"}},"&.".concat(Cs.disabled),{pointerEvents:"none",cursor:"default"}),Ee(ks,"@media print",{colorAdjust:"exact"}),ks)),Os=e.forwardRef((function(t,n){var o=ln({props:t,name:"MuiButtonBase"}),i=o.action,a=o.centerRipple,s=void 0!==a&&a,u=o.children,c=o.className,d=o.component,f=void 0===d?"button":d,p=o.disabled,h=void 0!==p&&p,m=o.disableRipple,v=void 0!==m&&m,g=o.disableTouchRipple,y=void 0!==g&&g,x=o.focusRipple,b=void 0!==x&&x,w=o.LinkComponent,S=void 0===w?"a":w,j=o.onBlur,k=o.onClick,C=o.onContextMenu,R=o.onDragLeave,T=o.onFocus,O=o.onFocusVisible,P=o.onKeyDown,E=o.onKeyUp,M=o.onMouseDown,_=o.onMouseLeave,D=o.onMouseUp,I=o.onTouchEnd,A=o.onTouchMove,N=o.onTouchStart,L=o.tabIndex,z=void 0===L?0:L,F=o.TouchRippleProps,W=o.touchRippleRef,B=o.type,V=Te(o,Rs),q=e.useRef(null),H=e.useRef(null),U=Nl(H,W),Y=Ql(),G=Y.isFocusVisibleRef,Q=Y.onFocus,$=Y.onBlur,K=Y.ref,X=Ne(e.useState(!1),2),Z=X[0],J=X[1];h&&Z&&J(!1),e.useImperativeHandle(i,(function(){return{focusVisible:function(){J(!0),q.current.focus()}}}),[]);var ee=Ne(e.useState(!1),2),te=ee[0],ne=ee[1];e.useEffect((function(){ne(!0)}),[]);var re=te&&!v&&!h;function oe(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:y;return Wl((function(r){return t&&t(r),!n&&H.current&&H.current[e](r),!0}))}e.useEffect((function(){Z&&b&&!v&&te&&H.current.pulsate()}),[v,b,Z,te]);var ie=oe("start",M),ae=oe("stop",C),le=oe("stop",R),se=oe("stop",D),ue=oe("stop",(function(e){Z&&e.preventDefault(),_&&_(e)})),ce=oe("start",N),de=oe("stop",I),fe=oe("stop",A),pe=oe("stop",(function(e){$(e),!1===G.current&&J(!1),j&&j(e)}),!1),he=Wl((function(e){q.current||(q.current=e.currentTarget),Q(e),!0===G.current&&(J(!0),O&&O(e)),T&&T(e)})),me=function(){var e=q.current;return f&&"button"!==f&&!("A"===e.tagName&&e.href)},ve=e.useRef(!1),ge=Wl((function(e){b&&!ve.current&&Z&&H.current&&" "===e.key&&(ve.current=!0,H.current.stop(e,(function(){H.current.start(e)}))),e.target===e.currentTarget&&me()&&" "===e.key&&e.preventDefault(),P&&P(e),e.target===e.currentTarget&&me()&&"Enter"===e.key&&!h&&(e.preventDefault(),k&&k(e))})),ye=Wl((function(e){b&&" "===e.key&&H.current&&Z&&!e.defaultPrevented&&(ve.current=!1,H.current.stop(e,(function(){H.current.pulsate(e)}))),E&&E(e),k&&e.target===e.currentTarget&&me()&&" "===e.key&&!e.defaultPrevented&&k(e)})),xe=f;"button"===xe&&(V.href||V.to)&&(xe=S);var be={};"button"===xe?(be.type=void 0===B?"button":B,be.disabled=h):(V.href||V.to||(be.role="button"),h&&(be["aria-disabled"]=h));var we=Nl(K,q),Se=Nl(n,we);var je=r({},o,{centerRipple:s,component:f,disabled:h,disableRipple:v,disableTouchRipple:y,focusRipple:b,tabIndex:z,focusVisible:Z}),ke=function(e){var t=e.disabled,n=e.focusVisible,r=e.focusVisibleClassName,o=Po({root:["root",t&&"disabled",n&&"focusVisible"]},js,e.classes);return n&&r&&(o.root+=" ".concat(r)),o}(je);return(0,l.jsxs)(Ts,r({as:xe,className:wn(ke.root,c),ownerState:je,onBlur:pe,onClick:k,onContextMenu:ae,onFocus:he,onKeyDown:ge,onKeyUp:ye,onMouseDown:ie,onMouseLeave:ue,onMouseUp:se,onDragLeave:le,onTouchEnd:de,onTouchMove:fe,onTouchStart:ce,ref:Se,tabIndex:h?-1:z,type:B},be,V,{children:[u,re?(0,l.jsx)(Ss,r({ref:U,center:s},F)):null]}))})),Ps=Os;function Es(e){return Qo("MuiTabScrollButton",e)}var Ms,_s,Ds=$o("MuiTabScrollButton",["root","vertical","horizontal","disabled"]),Is=["className","direction","orientation","disabled"],As=Yo(Ps,{name:"MuiTabScrollButton",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,n.orientation&&t[n.orientation]]}})((function(e){var t=e.ownerState;return r(Ee({width:40,flexShrink:0,opacity:.8},"&.".concat(Ds.disabled),{opacity:0}),"vertical"===t.orientation&&{width:"100%",height:40,"& svg":{transform:"rotate(".concat(t.isRtl?-90:90,"deg)")}})})),Ns=e.forwardRef((function(e,t){var n=ln({props:e,name:"MuiTabScrollButton"}),o=n.className,i=n.direction,a=Te(n,Is),s=r({isRtl:"rtl"===hi().direction},n),u=function(e){var t=e.classes;return Po({root:["root",e.orientation,e.disabled&&"disabled"]},Es,t)}(s);return(0,l.jsx)(As,r({component:"div",className:wn(u.root,o),ref:t,role:null,ownerState:s,tabIndex:null},a,{children:"left"===i?Ms||(Ms=(0,l.jsx)(_l,{fontSize:"small"})):_s||(_s=(0,l.jsx)(Dl,{fontSize:"small"}))}))})),Ls=Ns;function zs(e){return Qo("MuiTabs",e)}var Fs=$o("MuiTabs",["root","vertical","flexContainer","flexContainerVertical","centered","scroller","fixed","scrollableX","scrollableY","hideScrollbar","scrollButtons","scrollButtonsHideMobile","indicator"]),Ws=wl,Bs=["aria-label","aria-labelledby","action","centered","children","className","component","allowScrollButtonsMobile","indicatorColor","onChange","orientation","ScrollButtonComponent","scrollButtons","selectionFollowsFocus","TabIndicatorProps","TabScrollButtonProps","textColor","value","variant","visibleScrollbar"],Vs=function(e,t){return e===t?e.firstChild:t&&t.nextElementSibling?t.nextElementSibling:e.firstChild},qs=function(e,t){return e===t?e.lastChild:t&&t.previousElementSibling?t.previousElementSibling:e.lastChild},Hs=function(e,t,n){for(var r=!1,o=n(e,t);o;){if(o===e.firstChild){if(r)return;r=!0}var i=o.disabled||"true"===o.getAttribute("aria-disabled");if(o.hasAttribute("tabindex")&&!i)return void o.focus();o=n(e,o)}},Us=Yo("div",{name:"MuiTabs",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[Ee({},"& .".concat(Fs.scrollButtons),t.scrollButtons),Ee({},"& .".concat(Fs.scrollButtons),n.scrollButtonsHideMobile&&t.scrollButtonsHideMobile),t.root,n.vertical&&t.vertical]}})((function(e){var t=e.ownerState,n=e.theme;return r({overflow:"hidden",minHeight:48,WebkitOverflowScrolling:"touch",display:"flex"},t.vertical&&{flexDirection:"column"},t.scrollButtonsHideMobile&&Ee({},"& .".concat(Fs.scrollButtons),Ee({},n.breakpoints.down("sm"),{display:"none"})))})),Ys=Yo("div",{name:"MuiTabs",slot:"Scroller",overridesResolver:function(e,t){var n=e.ownerState;return[t.scroller,n.fixed&&t.fixed,n.hideScrollbar&&t.hideScrollbar,n.scrollableX&&t.scrollableX,n.scrollableY&&t.scrollableY]}})((function(e){var t=e.ownerState;return r({position:"relative",display:"inline-block",flex:"1 1 auto",whiteSpace:"nowrap"},t.fixed&&{overflowX:"hidden",width:"100%"},t.hideScrollbar&&{scrollbarWidth:"none","&::-webkit-scrollbar":{display:"none"}},t.scrollableX&&{overflowX:"auto",overflowY:"hidden"},t.scrollableY&&{overflowY:"auto",overflowX:"hidden"})})),Gs=Yo("div",{name:"MuiTabs",slot:"FlexContainer",overridesResolver:function(e,t){var n=e.ownerState;return[t.flexContainer,n.vertical&&t.flexContainerVertical,n.centered&&t.centered]}})((function(e){var t=e.ownerState;return r({display:"flex"},t.vertical&&{flexDirection:"column"},t.centered&&{justifyContent:"center"})})),Qs=Yo("span",{name:"MuiTabs",slot:"Indicator",overridesResolver:function(e,t){return t.indicator}})((function(e){var t=e.ownerState,n=e.theme;return r({position:"absolute",height:2,bottom:0,width:"100%",transition:n.transitions.create()},"primary"===t.indicatorColor&&{backgroundColor:(n.vars||n).palette.primary.main},"secondary"===t.indicatorColor&&{backgroundColor:(n.vars||n).palette.secondary.main},t.vertical&&{height:"100%",width:2,right:0})})),$s=Yo((function(t){var n=t.onChange,o=Te(t,kl),i=e.useRef(),a=e.useRef(null),s=function(){i.current=a.current.offsetHeight-a.current.clientHeight};return e.useEffect((function(){var e=vl((function(){var e=i.current;s(),e!==i.current&&n(i.current)})),t=jl(a.current);return t.addEventListener("resize",e),function(){e.clear(),t.removeEventListener("resize",e)}}),[n]),e.useEffect((function(){s(),n(i.current)}),[n]),(0,l.jsx)("div",r({style:Cl,ref:a},o))}),{name:"MuiTabs",slot:"ScrollbarSize"})({overflowX:"auto",overflowY:"hidden",scrollbarWidth:"none","&::-webkit-scrollbar":{display:"none"}}),Ks={},Xs=e.forwardRef((function(t,n){var o=ln({props:t,name:"MuiTabs"}),i=hi(),a="rtl"===i.direction,s=o["aria-label"],u=o["aria-labelledby"],c=o.action,d=o.centered,f=void 0!==d&&d,p=o.children,h=o.className,m=o.component,v=void 0===m?"div":m,g=o.allowScrollButtonsMobile,y=void 0!==g&&g,x=o.indicatorColor,b=void 0===x?"primary":x,w=o.onChange,S=o.orientation,j=void 0===S?"horizontal":S,k=o.ScrollButtonComponent,C=void 0===k?Ls:k,R=o.scrollButtons,T=void 0===R?"auto":R,O=o.selectionFollowsFocus,P=o.TabIndicatorProps,E=void 0===P?{}:P,M=o.TabScrollButtonProps,_=void 0===M?{}:M,D=o.textColor,I=void 0===D?"primary":D,A=o.value,N=o.variant,L=void 0===N?"standard":N,z=o.visibleScrollbar,F=void 0!==z&&z,W=Te(o,Bs),B="scrollable"===L,V="vertical"===j,q=V?"scrollTop":"scrollLeft",H=V?"top":"left",U=V?"bottom":"right",Y=V?"clientHeight":"clientWidth",G=V?"height":"width",Q=r({},o,{component:v,allowScrollButtonsMobile:y,indicatorColor:b,orientation:j,vertical:V,scrollButtons:T,textColor:I,variant:L,visibleScrollbar:F,fixed:!B,hideScrollbar:B&&!F,scrollableX:B&&!V,scrollableY:B&&V,centered:f&&!B,scrollButtonsHideMobile:!y}),$=function(e){var t=e.vertical,n=e.fixed,r=e.hideScrollbar,o=e.scrollableX;return Po({root:["root",t&&"vertical"],scroller:["scroller",n&&"fixed",r&&"hideScrollbar",o&&"scrollableX",e.scrollableY&&"scrollableY"],flexContainer:["flexContainer",t&&"flexContainerVertical",e.centered&&"centered"],indicator:["indicator"],scrollButtons:["scrollButtons",e.scrollButtonsHideMobile&&"scrollButtonsHideMobile"],scrollableX:[o&&"scrollableX"],hideScrollbar:[r&&"hideScrollbar"]},zs,e.classes)}(Q);var K=Ne(e.useState(!1),2),X=K[0],Z=K[1],J=Ne(e.useState(Ks),2),ee=J[0],te=J[1],ne=Ne(e.useState({start:!1,end:!1}),2),re=ne[0],oe=ne[1],ie=Ne(e.useState({overflow:"hidden",scrollbarWidth:0}),2),ae=ie[0],le=ie[1],se=new Map,ue=e.useRef(null),ce=e.useRef(null),de=function(){var e,t,n=ue.current;if(n){var r=n.getBoundingClientRect();e={clientWidth:n.clientWidth,scrollLeft:n.scrollLeft,scrollTop:n.scrollTop,scrollLeftNormalized:yl(n,i.direction),scrollWidth:n.scrollWidth,top:r.top,bottom:r.bottom,left:r.left,right:r.right}}if(n&&!1!==A){var o=ce.current.children;if(o.length>0){var a=o[se.get(A)];0,t=a?a.getBoundingClientRect():null}}return{tabsMeta:e,tabMeta:t}},fe=Wl((function(){var e,t,n=de(),r=n.tabsMeta,o=n.tabMeta,i=0;if(V)t="top",o&&r&&(i=o.top-r.top+r.scrollTop);else if(t=a?"right":"left",o&&r){var l=a?r.scrollLeftNormalized+r.clientWidth-r.scrollWidth:r.scrollLeft;i=(a?-1:1)*(o[t]-r[t]+l)}var s=(Ee(e={},t,i),Ee(e,G,o?o[G]:0),e);if(isNaN(ee[t])||isNaN(ee[G]))te(s);else{var u=Math.abs(ee[t]-s[t]),c=Math.abs(ee[G]-s[G]);(u>=1||c>=1)&&te(s)}})),pe=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.animation,r=void 0===n||n;r?bl(q,ue.current,e,{duration:i.transitions.duration.standard}):ue.current[q]=e},he=function(e){var t=ue.current[q];V?t+=e:(t+=e*(a?-1:1),t*=a&&"reverse"===gl()?-1:1),pe(t)},me=function(){for(var e=ue.current[Y],t=0,n=Array.from(ce.current.children),r=0;r<n.length;r+=1){var o=n[r];if(t+o[Y]>e){0===r&&(t=e);break}t+=o[Y]}return t},ve=function(){he(-1*me())},ge=function(){he(me())},ye=e.useCallback((function(e){le({overflow:null,scrollbarWidth:e})}),[]),xe=Wl((function(e){var t=de(),n=t.tabsMeta,r=t.tabMeta;if(r&&n)if(r[H]<n[H]){var o=n[q]+(r[H]-n[H]);pe(o,{animation:e})}else if(r[U]>n[U]){var i=n[q]+(r[U]-n[U]);pe(i,{animation:e})}})),be=Wl((function(){if(B&&!1!==T){var e,t,n=ue.current,r=n.scrollTop,o=n.scrollHeight,l=n.clientHeight,s=n.scrollWidth,u=n.clientWidth;if(V)e=r>1,t=r<o-l-1;else{var c=yl(ue.current,i.direction);e=a?c<s-u-1:c>1,t=a?c>1:c<s-u-1}e===re.start&&t===re.end||oe({start:e,end:t})}}));e.useEffect((function(){var e,t=vl((function(){ue.current&&(fe(),be())})),n=jl(ue.current);return n.addEventListener("resize",t),"undefined"!==typeof ResizeObserver&&(e=new ResizeObserver(t),Array.from(ce.current.children).forEach((function(t){e.observe(t)}))),function(){t.clear(),n.removeEventListener("resize",t),e&&e.disconnect()}}),[fe,be]);var we=e.useMemo((function(){return vl((function(){be()}))}),[be]);e.useEffect((function(){return function(){we.clear()}}),[we]),e.useEffect((function(){Z(!0)}),[]),e.useEffect((function(){fe(),be()})),e.useEffect((function(){xe(Ks!==ee)}),[xe,ee]),e.useImperativeHandle(c,(function(){return{updateIndicator:fe,updateScrollButtons:be}}),[fe,be]);var Se=(0,l.jsx)(Qs,r({},E,{className:wn($.indicator,E.className),ownerState:Q,style:r({},ee,E.style)})),je=0,ke=e.Children.map(p,(function(t){if(!e.isValidElement(t))return null;var n=void 0===t.props.value?je:t.props.value;se.set(n,je);var o=n===A;return je+=1,e.cloneElement(t,r({fullWidth:"fullWidth"===L,indicator:o&&!X&&Se,selected:o,selectionFollowsFocus:O,onChange:w,textColor:I,value:n},1!==je||!1!==A||t.props.tabIndex?{}:{tabIndex:0}))})),Ce=function(){var e={};e.scrollbarSizeListener=B?(0,l.jsx)($s,{onChange:ye,className:wn($.scrollableX,$.hideScrollbar)}):null;var t=re.start||re.end,n=B&&("auto"===T&&t||!0===T);return e.scrollButtonStart=n?(0,l.jsx)(C,r({orientation:j,direction:a?"right":"left",onClick:ve,disabled:!re.start},_,{className:wn($.scrollButtons,_.className)})):null,e.scrollButtonEnd=n?(0,l.jsx)(C,r({orientation:j,direction:a?"left":"right",onClick:ge,disabled:!re.end},_,{className:wn($.scrollButtons,_.className)})):null,e}();return(0,l.jsxs)(Us,r({className:wn($.root,h),ownerState:Q,ref:n,as:v},W,{children:[Ce.scrollButtonStart,Ce.scrollbarSizeListener,(0,l.jsxs)(Ys,{className:$.scroller,ownerState:Q,style:Ee({overflow:ae.overflow},V?"margin".concat(a?"Left":"Right"):"marginBottom",F?void 0:-ae.scrollbarWidth),ref:ue,onScroll:we,children:[(0,l.jsx)(Gs,{"aria-label":s,"aria-labelledby":u,"aria-orientation":"vertical"===j?"vertical":null,className:$.flexContainer,ownerState:Q,onKeyDown:function(e){var t=ce.current,n=Ws(t).activeElement;if("tab"===n.getAttribute("role")){var r="horizontal"===j?"ArrowLeft":"ArrowUp",o="horizontal"===j?"ArrowRight":"ArrowDown";switch("horizontal"===j&&a&&(r="ArrowRight",o="ArrowLeft"),e.key){case r:e.preventDefault(),Hs(t,n,qs);break;case o:e.preventDefault(),Hs(t,n,Vs);break;case"Home":e.preventDefault(),Hs(t,null,Vs);break;case"End":e.preventDefault(),Hs(t,null,qs)}}},ref:ce,role:"tablist",children:ke}),X&&Se]}),Ce.scrollButtonEnd]}))})),Zs=Xs;function Js(e){return Qo("MuiTab",e)}var eu=$o("MuiTab",["root","labelIcon","textColorInherit","textColorPrimary","textColorSecondary","selected","disabled","fullWidth","wrapped","iconWrapper"]),tu=["className","disabled","disableFocusRipple","fullWidth","icon","iconPosition","indicator","label","onChange","onClick","onFocus","selected","selectionFollowsFocus","textColor","value","wrapped"],nu=Yo(Ps,{name:"MuiTab",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,n.label&&n.icon&&t.labelIcon,t["textColor".concat(Eo(n.textColor))],n.fullWidth&&t.fullWidth,n.wrapped&&t.wrapped]}})((function(e){var t,n,o,i=e.theme,a=e.ownerState;return r({},i.typography.button,{maxWidth:360,minWidth:90,position:"relative",minHeight:48,flexShrink:0,padding:"12px 16px",overflow:"hidden",whiteSpace:"normal",textAlign:"center"},a.label&&{flexDirection:"top"===a.iconPosition||"bottom"===a.iconPosition?"column":"row"},{lineHeight:1.25},a.icon&&a.label&&Ee({minHeight:72,paddingTop:9,paddingBottom:9},"& > .".concat(eu.iconWrapper),r({},"top"===a.iconPosition&&{marginBottom:6},"bottom"===a.iconPosition&&{marginTop:6},"start"===a.iconPosition&&{marginRight:i.spacing(1)},"end"===a.iconPosition&&{marginLeft:i.spacing(1)})),"inherit"===a.textColor&&(Ee(t={color:"inherit",opacity:.6},"&.".concat(eu.selected),{opacity:1}),Ee(t,"&.".concat(eu.disabled),{opacity:(i.vars||i).palette.action.disabledOpacity}),t),"primary"===a.textColor&&(Ee(n={color:(i.vars||i).palette.text.secondary},"&.".concat(eu.selected),{color:(i.vars||i).palette.primary.main}),Ee(n,"&.".concat(eu.disabled),{color:(i.vars||i).palette.text.disabled}),n),"secondary"===a.textColor&&(Ee(o={color:(i.vars||i).palette.text.secondary},"&.".concat(eu.selected),{color:(i.vars||i).palette.secondary.main}),Ee(o,"&.".concat(eu.disabled),{color:(i.vars||i).palette.text.disabled}),o),a.fullWidth&&{flexShrink:1,flexGrow:1,flexBasis:0,maxWidth:"none"},a.wrapped&&{fontSize:i.typography.pxToRem(12)})})),ru=e.forwardRef((function(t,n){var o=ln({props:t,name:"MuiTab"}),i=o.className,a=o.disabled,s=void 0!==a&&a,u=o.disableFocusRipple,c=void 0!==u&&u,d=o.fullWidth,f=o.icon,p=o.iconPosition,h=void 0===p?"top":p,m=o.indicator,v=o.label,g=o.onChange,y=o.onClick,x=o.onFocus,b=o.selected,w=o.selectionFollowsFocus,S=o.textColor,j=void 0===S?"inherit":S,k=o.value,C=o.wrapped,R=void 0!==C&&C,T=Te(o,tu),O=r({},o,{disabled:s,disableFocusRipple:c,selected:b,icon:!!f,iconPosition:h,label:!!v,fullWidth:d,textColor:j,wrapped:R}),P=function(e){var t=e.classes,n=e.textColor,r=e.fullWidth,o=e.wrapped,i=e.icon,a=e.label,l=e.selected,s=e.disabled;return Po({root:["root",i&&a&&"labelIcon","textColor".concat(Eo(n)),r&&"fullWidth",o&&"wrapped",l&&"selected",s&&"disabled"],iconWrapper:["iconWrapper"]},Js,t)}(O),E=f&&v&&e.isValidElement(f)?e.cloneElement(f,{className:wn(P.iconWrapper,f.props.className)}):f;return(0,l.jsxs)(nu,r({focusRipple:!c,className:wn(P.root,i),ref:n,role:"tab","aria-selected":b,disabled:s,onClick:function(e){!b&&g&&g(e,k),y&&y(e)},onFocus:function(e){w&&!b&&g&&g(e,k),x&&x(e)},ownerState:O,tabIndex:b?0:-1},T,{children:["top"===h||"start"===h?(0,l.jsxs)(e.Fragment,{children:[E,v]}):(0,l.jsxs)(e.Fragment,{children:[v,E]}),m]}))})),ou=ru,iu={home:"/home",requests:"/requests",inventory:"/inventory",about:"/about",calibration:"/calibration",maintenance:"/service","summary-report":"/summary-report",eqa:"/eqa",pendingTests:"/pending-tests"},au=function(t){var n=Ne((0,e.useState)(t.active),2),r=n[0],o=n[1],i=po();return(0,e.useEffect)((function(){i(iu[r])}),[r]),(0,l.jsx)(sl,{position:"relative",children:(0,l.jsx)(pl,{variant:"dense",children:(0,l.jsxs)(Zs,{variant:"scrollable",value:r,onChange:function(e,t){return o(t)},children:[(0,l.jsx)(ou,{label:"Home",value:"home"}),(0,l.jsx)(ou,{label:"Test Details",value:"requests"}),(0,l.jsx)(ou,{label:"Maintenance",value:"maintenance"}),(0,l.jsx)(ou,{label:"Calibration",value:"calibration"}),(0,l.jsx)(ou,{label:"Summary Report",value:"summary-report"}),(0,l.jsx)(ou,{label:"EQA",value:"eqa"}),(0,l.jsx)(ou,{label:"Pending Approval",value:"pendingTests"}),(0,l.jsx)(ou,{label:"Help",value:"about"})]})})})};function lu(t,n){var r=Ne(e.useState(!1),2),o=r[0],i=r[1],a=Ne(e.useState(n),2),l=a[0],s=a[1];return{loading:o,value:l,fetch:function(){return i(!0),t.apply(void 0,arguments).then((function(e){return s(e),i(!1),e})).catch((function(e){return i(!1),Promise.reject(e)}))},reset:function(){s(n)}}}var su=Ml((0,l.jsx)("path",{d:"M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"}),"Launch"),uu=Ml((0,l.jsx)("path",{d:"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"}),"Close"),cu=Ml((0,l.jsx)("path",{d:"M8.59 16.59 13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.41z"}),"KeyboardArrowRight");function du(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.reduce((function(e,t){return null==t?e:function(){for(var n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];e.apply(this,r),t.apply(this,r)}}),(function(){}))}var fu=n(4164);var pu=e.forwardRef((function(t,n){var r=t.children,o=t.container,i=t.disablePortal,a=void 0!==i&&i,l=Ne(e.useState(null),2),s=l[0],u=l[1],c=Al(e.isValidElement(r)?r.ref:null,n);return Ll((function(){a||u(function(e){return"function"===typeof e?e():e}(o)||document.body)}),[o,a]),Ll((function(){if(s&&!a)return Il(n,s),function(){Il(n,null)}}),[n,s,a]),a?e.isValidElement(r)?e.cloneElement(r,{ref:c}):r:s?fu.createPortal(r,s):s}));var hu=pu;function mu(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function vu(e){var t=e.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}function gu(e,t){t?e.setAttribute("aria-hidden","true"):e.removeAttribute("aria-hidden")}function yu(e){return parseInt(Sl(e).getComputedStyle(e).paddingRight,10)||0}function xu(e){var t=-1!==["TEMPLATE","SCRIPT","STYLE","LINK","MAP","META","NOSCRIPT","PICTURE","COL","COLGROUP","PARAM","SLOT","SOURCE","TRACK"].indexOf(e.tagName),n="INPUT"===e.tagName&&"hidden"===e.getAttribute("type");return t||n}function bu(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],o=arguments.length>4?arguments[4]:void 0,i=[t,n].concat(Rr(r));[].forEach.call(e.children,(function(e){var t=-1===i.indexOf(e),n=!xu(e);t&&n&&gu(e,o)}))}function wu(e,t){var n=-1;return e.some((function(e,r){return!!t(e)&&(n=r,!0)})),n}function Su(e,t){var n=[],r=e.container;if(!t.disableScrollLock){if(function(e){var t=wl(e);return t.body===e?Sl(e).innerWidth>t.documentElement.clientWidth:e.scrollHeight>e.clientHeight}(r)){var o=vu(wl(r));n.push({value:r.style.paddingRight,property:"padding-right",el:r}),r.style.paddingRight="".concat(yu(r)+o,"px");var i=wl(r).querySelectorAll(".mui-fixed");[].forEach.call(i,(function(e){n.push({value:e.style.paddingRight,property:"padding-right",el:e}),e.style.paddingRight="".concat(yu(e)+o,"px")}))}var a;if(r.parentNode instanceof DocumentFragment)a=wl(r).body;else{var l=r.parentElement,s=Sl(r);a="HTML"===(null==l?void 0:l.nodeName)&&"scroll"===s.getComputedStyle(l).overflowY?l:r}n.push({value:a.style.overflow,property:"overflow",el:a},{value:a.style.overflowX,property:"overflow-x",el:a},{value:a.style.overflowY,property:"overflow-y",el:a}),a.style.overflow="hidden"}return function(){n.forEach((function(e){var t=e.value,n=e.el,r=e.property;t?n.style.setProperty(r,t):n.style.removeProperty(r)}))}}var ju=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.containers=void 0,this.modals=void 0,this.modals=[],this.containers=[]}var t,n,r;return t=e,n=[{key:"add",value:function(e,t){var n=this.modals.indexOf(e);if(-1!==n)return n;n=this.modals.length,this.modals.push(e),e.modalRef&&gu(e.modalRef,!1);var r=function(e){var t=[];return[].forEach.call(e.children,(function(e){"true"===e.getAttribute("aria-hidden")&&t.push(e)})),t}(t);bu(t,e.mount,e.modalRef,r,!0);var o=wu(this.containers,(function(e){return e.container===t}));return-1!==o?(this.containers[o].modals.push(e),n):(this.containers.push({modals:[e],container:t,restore:null,hiddenSiblings:r}),n)}},{key:"mount",value:function(e,t){var n=wu(this.containers,(function(t){return-1!==t.modals.indexOf(e)})),r=this.containers[n];r.restore||(r.restore=Su(r,t))}},{key:"remove",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=this.modals.indexOf(e);if(-1===n)return n;var r=wu(this.containers,(function(t){return-1!==t.modals.indexOf(e)})),o=this.containers[r];if(o.modals.splice(o.modals.indexOf(e),1),this.modals.splice(n,1),0===o.modals.length)o.restore&&o.restore(),e.modalRef&&gu(e.modalRef,t),bu(o.container,e.mount,e.modalRef,o.hiddenSiblings,!1),this.containers.splice(r,1);else{var i=o.modals[o.modals.length-1];i.modalRef&&gu(i.modalRef,!1)}return n}},{key:"isTopModal",value:function(e){return this.modals.length>0&&this.modals[this.modals.length-1]===e}}],n&&mu(t.prototype,n),r&&mu(t,r),Object.defineProperty(t,"prototype",{writable:!1}),e}(),ku=["input","select","textarea","a[href]","button","[tabindex]","audio[controls]","video[controls]",'[contenteditable]:not([contenteditable="false"])'].join(",");function Cu(e){var t=[],n=[];return Array.from(e.querySelectorAll(ku)).forEach((function(e,r){var o=function(e){var t=parseInt(e.getAttribute("tabindex"),10);return Number.isNaN(t)?"true"===e.contentEditable||("AUDIO"===e.nodeName||"VIDEO"===e.nodeName||"DETAILS"===e.nodeName)&&null===e.getAttribute("tabindex")?0:e.tabIndex:t}(e);-1!==o&&function(e){return!(e.disabled||"INPUT"===e.tagName&&"hidden"===e.type||function(e){if("INPUT"!==e.tagName||"radio"!==e.type)return!1;if(!e.name)return!1;var t=function(t){return e.ownerDocument.querySelector('input[type="radio"]'.concat(t))},n=t('[name="'.concat(e.name,'"]:checked'));return n||(n=t('[name="'.concat(e.name,'"]'))),n!==e}(e))}(e)&&(0===o?t.push(e):n.push({documentOrder:r,tabIndex:o,node:e}))})),n.sort((function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex})).map((function(e){return e.node})).concat(t)}function Ru(){return!0}var Tu=function(t){var n=t.children,r=t.disableAutoFocus,o=void 0!==r&&r,i=t.disableEnforceFocus,a=void 0!==i&&i,s=t.disableRestoreFocus,u=void 0!==s&&s,c=t.getTabbable,d=void 0===c?Cu:c,f=t.isEnabled,p=void 0===f?Ru:f,h=t.open,m=e.useRef(),v=e.useRef(null),g=e.useRef(null),y=e.useRef(null),x=e.useRef(null),b=e.useRef(!1),w=e.useRef(null),S=Al(n.ref,w),j=e.useRef(null);e.useEffect((function(){h&&w.current&&(b.current=!o)}),[o,h]),e.useEffect((function(){if(h&&w.current){var e=wl(w.current);return w.current.contains(e.activeElement)||(w.current.hasAttribute("tabIndex")||w.current.setAttribute("tabIndex",-1),b.current&&w.current.focus()),function(){u||(y.current&&y.current.focus&&(m.current=!0,y.current.focus()),y.current=null)}}}),[h]),e.useEffect((function(){if(h&&w.current){var e=wl(w.current),t=function(t){var n=w.current;if(null!==n)if(e.hasFocus()&&!a&&p()&&!m.current){if(!n.contains(e.activeElement)){if(t&&x.current!==t.target||e.activeElement!==x.current)x.current=null;else if(null!==x.current)return;if(!b.current)return;var r=[];if(e.activeElement!==v.current&&e.activeElement!==g.current||(r=d(w.current)),r.length>0){var o,i,l=Boolean((null==(o=j.current)?void 0:o.shiftKey)&&"Tab"===(null==(i=j.current)?void 0:i.key)),s=r[0],u=r[r.length-1];l?u.focus():s.focus()}else n.focus()}}else m.current=!1},n=function(t){j.current=t,!a&&p()&&"Tab"===t.key&&e.activeElement===w.current&&t.shiftKey&&(m.current=!0,g.current.focus())};e.addEventListener("focusin",t),e.addEventListener("keydown",n,!0);var r=setInterval((function(){"BODY"===e.activeElement.tagName&&t()}),50);return function(){clearInterval(r),e.removeEventListener("focusin",t),e.removeEventListener("keydown",n,!0)}}}),[o,a,u,p,h,d]);var k=function(e){null===y.current&&(y.current=e.relatedTarget),b.current=!0};return(0,l.jsxs)(e.Fragment,{children:[(0,l.jsx)("div",{tabIndex:0,onFocus:k,ref:v,"data-test":"sentinelStart"}),e.cloneElement(n,{ref:S,onFocus:function(e){null===y.current&&(y.current=e.relatedTarget),b.current=!0,x.current=e.target;var t=n.props.onFocus;t&&t(e)}}),(0,l.jsx)("div",{tabIndex:0,onFocus:k,ref:g,"data-test":"sentinelEnd"})]})};function Ou(e){return Qo("MuiModal",e)}$o("MuiModal",["root","hidden"]);var Pu=function(e){return"string"===typeof e};function Eu(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0;return Pu(e)?t:r({},t,{ownerState:r({},t.ownerState,n)})}function Mu(e){if(void 0===e)return{};var t={};return Object.keys(e).filter((function(t){return!(t.match(/^on[A-Z]/)&&"function"===typeof e[t])})).forEach((function(n){t[n]=e[n]})),t}function _u(e){var t=e.getSlotProps,n=e.additionalProps,o=e.externalSlotProps,i=e.externalForwardedProps,a=e.className;if(!t){var l=wn(null==i?void 0:i.className,null==o?void 0:o.className,a,null==n?void 0:n.className),s=r({},null==n?void 0:n.style,null==i?void 0:i.style,null==o?void 0:o.style),u=r({},n,i,o);return l.length>0&&(u.className=l),Object.keys(s).length>0&&(u.style=s),{props:u,internalRef:void 0}}var c=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];if(void 0===e)return{};var n={};return Object.keys(e).filter((function(n){return n.match(/^on[A-Z]/)&&"function"===typeof e[n]&&!t.includes(n)})).forEach((function(t){n[t]=e[t]})),n}(r({},i,o)),d=Mu(o),f=Mu(i),p=t(c),h=wn(null==p?void 0:p.className,null==n?void 0:n.className,a,null==i?void 0:i.className,null==o?void 0:o.className),m=r({},null==p?void 0:p.style,null==n?void 0:n.style,null==i?void 0:i.style,null==o?void 0:o.style),v=r({},p,n,f,d);return h.length>0&&(v.className=h),Object.keys(m).length>0&&(v.style=m),{props:v,internalRef:p.ref}}function Du(e,t){return"function"===typeof e?e(t):e}var Iu=["elementType","externalSlotProps","ownerState"];function Au(e){var t,n=e.elementType,o=e.externalSlotProps,i=e.ownerState,a=Te(e,Iu),l=Du(o,i),s=_u(r({},a,{externalSlotProps:l}));return Eu(n,r({},s.props,{ref:Al(s.internalRef,Al(null==l?void 0:l.ref,null==(t=e.additionalProps)?void 0:t.ref))}),i)}var Nu=["children","classes","closeAfterTransition","component","components","componentsProps","container","disableAutoFocus","disableEnforceFocus","disableEscapeKeyDown","disablePortal","disableRestoreFocus","disableScrollLock","hideBackdrop","keepMounted","manager","onBackdropClick","onClose","onKeyDown","open","onTransitionEnter","onTransitionExited"];var Lu=new ju,zu=e.forwardRef((function(t,n){var o,i=t.children,a=t.classes,s=t.closeAfterTransition,u=void 0!==s&&s,c=t.component,d=void 0===c?"div":c,f=t.components,p=void 0===f?{}:f,h=t.componentsProps,m=void 0===h?{}:h,v=t.container,g=t.disableAutoFocus,y=void 0!==g&&g,x=t.disableEnforceFocus,b=void 0!==x&&x,w=t.disableEscapeKeyDown,S=void 0!==w&&w,j=t.disablePortal,k=void 0!==j&&j,C=t.disableRestoreFocus,R=void 0!==C&&C,T=t.disableScrollLock,O=void 0!==T&&T,P=t.hideBackdrop,E=void 0!==P&&P,M=t.keepMounted,_=void 0!==M&&M,D=t.manager,I=void 0===D?Lu:D,A=t.onBackdropClick,N=t.onClose,L=t.onKeyDown,z=t.open,F=t.onTransitionEnter,W=t.onTransitionExited,B=Te(t,Nu),V=Ne(e.useState(!0),2),q=V[0],H=V[1],U=e.useRef({}),Y=e.useRef(null),G=e.useRef(null),Q=Al(G,n),$=function(e){return!!e.children&&e.children.props.hasOwnProperty("in")}(t),K=null==(o=t["aria-hidden"])||o,X=function(){return U.current.modalRef=G.current,U.current.mountNode=Y.current,U.current},Z=function(){I.mount(X(),{disableScrollLock:O}),G.current.scrollTop=0},J=zl((function(){var e=function(e){return"function"===typeof e?e():e}(v)||wl(Y.current).body;I.add(X(),e),G.current&&Z()})),ee=e.useCallback((function(){return I.isTopModal(X())}),[I]),te=zl((function(e){Y.current=e,e&&(z&&ee()?Z():gu(G.current,K))})),ne=e.useCallback((function(){I.remove(X(),K)}),[I,K]);e.useEffect((function(){return function(){ne()}}),[ne]),e.useEffect((function(){z?J():$&&u||ne()}),[z,ne,$,u,J]);var re=r({},t,{classes:a,closeAfterTransition:u,disableAutoFocus:y,disableEnforceFocus:b,disableEscapeKeyDown:S,disablePortal:k,disableRestoreFocus:R,disableScrollLock:O,exited:q,hideBackdrop:E,keepMounted:_}),oe=function(e){var t=e.open,n=e.exited;return Po({root:["root",!t&&n&&"hidden"]},Ou,e.classes)}(re),ie={};void 0===i.props.tabIndex&&(ie.tabIndex="-1"),$&&(ie.onEnter=du((function(){H(!1),F&&F()}),i.props.onEnter),ie.onExited=du((function(){H(!0),W&&W(),u&&ne()}),i.props.onExited));var ae=p.Root||d,le=Au({elementType:ae,externalSlotProps:m.root,externalForwardedProps:B,additionalProps:{ref:Q,role:"presentation",onKeyDown:function(e){L&&L(e),"Escape"===e.key&&ee()&&(S||(e.stopPropagation(),N&&N(e,"escapeKeyDown")))}},className:oe.root,ownerState:re}),se=p.Backdrop,ue=Au({elementType:se,externalSlotProps:m.backdrop,additionalProps:{"aria-hidden":!0,onClick:function(e){e.target===e.currentTarget&&(A&&A(e),N&&N(e,"backdropClick"))},open:z},ownerState:re});return _||z||$&&!q?(0,l.jsx)(hu,{ref:te,container:v,disablePortal:k,children:(0,l.jsxs)(ae,r({},le,{children:[!E&&se?(0,l.jsx)(se,r({},ue)):null,(0,l.jsx)(Tu,{disableEnforceFocus:b,disableAutoFocus:y,disableRestoreFocus:R,isEnabled:ee,open:z,children:e.cloneElement(i,ie)})]}))}):null})),Fu=zu,Wu=!1,Bu="unmounted",Vu="exited",qu="entering",Hu="entered",Uu="exiting",Yu=function(t){function n(e,n){var r;r=t.call(this,e,n)||this;var o,i=n&&!n.isMounting?e.enter:e.appear;return r.appearStatus=null,e.in?i?(o=Vu,r.appearStatus=qu):o=Hu:o=e.unmountOnExit||e.mountOnEnter?Bu:Vu,r.state={status:o},r.nextCallback=null,r}Kl(n,t),n.getDerivedStateFromProps=function(e,t){return e.in&&t.status===Bu?{status:Vu}:null};var r=n.prototype;return r.componentDidMount=function(){this.updateStatus(!0,this.appearStatus)},r.componentDidUpdate=function(e){var t=null;if(e!==this.props){var n=this.state.status;this.props.in?n!==qu&&n!==Hu&&(t=qu):n!==qu&&n!==Hu||(t=Uu)}this.updateStatus(!1,t)},r.componentWillUnmount=function(){this.cancelNextCallback()},r.getTimeouts=function(){var e,t,n,r=this.props.timeout;return e=t=n=r,null!=r&&"number"!==typeof r&&(e=r.exit,t=r.enter,n=void 0!==r.appear?r.appear:t),{exit:e,enter:t,appear:n}},r.updateStatus=function(e,t){if(void 0===e&&(e=!1),null!==t)if(this.cancelNextCallback(),t===qu){if(this.props.unmountOnExit||this.props.mountOnEnter){var n=this.props.nodeRef?this.props.nodeRef.current:fu.findDOMNode(this);n&&function(e){e.scrollTop}(n)}this.performEnter(e)}else this.performExit();else this.props.unmountOnExit&&this.state.status===Vu&&this.setState({status:Bu})},r.performEnter=function(e){var t=this,n=this.props.enter,r=this.context?this.context.isMounting:e,o=this.props.nodeRef?[r]:[fu.findDOMNode(this),r],i=o[0],a=o[1],l=this.getTimeouts(),s=r?l.appear:l.enter;!e&&!n||Wu?this.safeSetState({status:Hu},(function(){t.props.onEntered(i)})):(this.props.onEnter(i,a),this.safeSetState({status:qu},(function(){t.props.onEntering(i,a),t.onTransitionEnd(s,(function(){t.safeSetState({status:Hu},(function(){t.props.onEntered(i,a)}))}))})))},r.performExit=function(){var e=this,t=this.props.exit,n=this.getTimeouts(),r=this.props.nodeRef?void 0:fu.findDOMNode(this);t&&!Wu?(this.props.onExit(r),this.safeSetState({status:Uu},(function(){e.props.onExiting(r),e.onTransitionEnd(n.exit,(function(){e.safeSetState({status:Vu},(function(){e.props.onExited(r)}))}))}))):this.safeSetState({status:Vu},(function(){e.props.onExited(r)}))},r.cancelNextCallback=function(){null!==this.nextCallback&&(this.nextCallback.cancel(),this.nextCallback=null)},r.safeSetState=function(e,t){t=this.setNextCallback(t),this.setState(e,t)},r.setNextCallback=function(e){var t=this,n=!0;return this.nextCallback=function(r){n&&(n=!1,t.nextCallback=null,e(r))},this.nextCallback.cancel=function(){n=!1},this.nextCallback},r.onTransitionEnd=function(e,t){this.setNextCallback(t);var n=this.props.nodeRef?this.props.nodeRef.current:fu.findDOMNode(this),r=null==e&&!this.props.addEndListener;if(n&&!r){if(this.props.addEndListener){var o=this.props.nodeRef?[this.nextCallback]:[n,this.nextCallback],i=o[0],a=o[1];this.props.addEndListener(i,a)}null!=e&&setTimeout(this.nextCallback,e)}else setTimeout(this.nextCallback,0)},r.render=function(){var t=this.state.status;if(t===Bu)return null;var n=this.props,r=n.children,o=(n.in,n.mountOnEnter,n.unmountOnExit,n.appear,n.enter,n.exit,n.timeout,n.addEndListener,n.onEnter,n.onEntering,n.onEntered,n.onExit,n.onExiting,n.onExited,n.nodeRef,Te(n,["children","in","mountOnEnter","unmountOnExit","appear","enter","exit","timeout","addEndListener","onEnter","onEntering","onEntered","onExit","onExiting","onExited","nodeRef"]));return e.createElement(Xl.Provider,{value:null},"function"===typeof r?r(t,o):e.cloneElement(e.Children.only(r),o))},n}(e.Component);function Gu(){}Yu.contextType=Xl,Yu.propTypes={},Yu.defaultProps={in:!1,mountOnEnter:!1,unmountOnExit:!1,appear:!1,enter:!0,exit:!0,onEnter:Gu,onEntering:Gu,onEntered:Gu,onExit:Gu,onExiting:Gu,onExited:Gu},Yu.UNMOUNTED=Bu,Yu.EXITED=Vu,Yu.ENTERING=qu,Yu.ENTERED=Hu,Yu.EXITING=Uu;var Qu=Yu,$u=function(e){return e.scrollTop};function Ku(e,t){var n,r,o=e.timeout,i=e.easing,a=e.style,l=void 0===a?{}:a;return{duration:null!=(n=l.transitionDuration)?n:"number"===typeof o?o:o[t.mode]||0,easing:null!=(r=l.transitionTimingFunction)?r:"object"===typeof i?i[t.mode]:i,delay:l.transitionDelay}}var Xu=["addEndListener","appear","children","easing","in","onEnter","onEntered","onEntering","onExit","onExited","onExiting","style","timeout","TransitionComponent"],Zu={entering:{opacity:1},entered:{opacity:1}},Ju=e.forwardRef((function(t,n){var o=hi(),i={enter:o.transitions.duration.enteringScreen,exit:o.transitions.duration.leavingScreen},a=t.addEndListener,s=t.appear,u=void 0===s||s,c=t.children,d=t.easing,f=t.in,p=t.onEnter,h=t.onEntered,m=t.onEntering,v=t.onExit,g=t.onExited,y=t.onExiting,x=t.style,b=t.timeout,w=void 0===b?i:b,S=t.TransitionComponent,j=void 0===S?Qu:S,k=Te(t,Xu),C=e.useRef(null),R=Nl(c.ref,n),T=Nl(C,R),O=function(e){return function(t){if(e){var n=C.current;void 0===t?e(n):e(n,t)}}},P=O(m),E=O((function(e,t){$u(e);var n=Ku({style:x,timeout:w,easing:d},{mode:"enter"});e.style.webkitTransition=o.transitions.create("opacity",n),e.style.transition=o.transitions.create("opacity",n),p&&p(e,t)})),M=O(h),_=O(y),D=O((function(e){var t=Ku({style:x,timeout:w,easing:d},{mode:"exit"});e.style.webkitTransition=o.transitions.create("opacity",t),e.style.transition=o.transitions.create("opacity",t),v&&v(e)})),I=O(g);return(0,l.jsx)(j,r({appear:u,in:f,nodeRef:C,onEnter:E,onEntered:M,onEntering:P,onExit:D,onExited:I,onExiting:_,addEndListener:function(e){a&&a(C.current,e)},timeout:w},k,{children:function(t,n){return e.cloneElement(c,r({style:r({opacity:0,visibility:"exited"!==t||f?void 0:"hidden"},Zu[t],x,c.props.style),ref:T},n))}}))})),ec=Ju;function tc(e){return Qo("MuiBackdrop",e)}$o("MuiBackdrop",["root","invisible"]);var nc=["children","component","components","componentsProps","className","invisible","open","transitionDuration","TransitionComponent"],rc=Yo("div",{name:"MuiBackdrop",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,n.invisible&&t.invisible]}})((function(e){return r({position:"fixed",display:"flex",alignItems:"center",justifyContent:"center",right:0,bottom:0,top:0,left:0,backgroundColor:"rgba(0, 0, 0, 0.5)",WebkitTapHighlightColor:"transparent"},e.ownerState.invisible&&{backgroundColor:"transparent"})})),oc=e.forwardRef((function(e,t){var n,o,i=ln({props:e,name:"MuiBackdrop"}),a=i.children,s=i.component,u=void 0===s?"div":s,c=i.components,d=void 0===c?{}:c,f=i.componentsProps,p=void 0===f?{}:f,h=i.className,m=i.invisible,v=void 0!==m&&m,g=i.open,y=i.transitionDuration,x=i.TransitionComponent,b=void 0===x?ec:x,w=Te(i,nc),S=r({},i,{component:u,invisible:v}),j=function(e){var t=e.classes;return Po({root:["root",e.invisible&&"invisible"]},tc,t)}(S);return(0,l.jsx)(b,r({in:g,timeout:y},w,{children:(0,l.jsx)(rc,{"aria-hidden":!0,as:null!=(n=d.Root)?n:u,className:wn(j.root,h),ownerState:r({},S,null==(o=p.root)?void 0:o.ownerState),classes:j,ref:t,children:a})}))})),ic=oc,ac=["BackdropComponent","BackdropProps","closeAfterTransition","children","component","components","componentsProps","disableAutoFocus","disableEnforceFocus","disableEscapeKeyDown","disablePortal","disableRestoreFocus","disableScrollLock","hideBackdrop","keepMounted","theme"],lc=Yo("div",{name:"MuiModal",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,!n.open&&n.exited&&t.hidden]}})((function(e){var t=e.theme,n=e.ownerState;return r({position:"fixed",zIndex:(t.vars||t).zIndex.modal,right:0,bottom:0,top:0,left:0},!n.open&&n.exited&&{visibility:"hidden"})})),sc=Yo(ic,{name:"MuiModal",slot:"Backdrop",overridesResolver:function(e,t){return t.backdrop}})({zIndex:-1}),uc=e.forwardRef((function(t,n){var o,i,a=ln({name:"MuiModal",props:t}),s=a.BackdropComponent,u=void 0===s?sc:s,c=a.BackdropProps,d=a.closeAfterTransition,f=void 0!==d&&d,p=a.children,h=a.component,m=a.components,v=void 0===m?{}:m,g=a.componentsProps,y=void 0===g?{}:g,x=a.disableAutoFocus,b=void 0!==x&&x,w=a.disableEnforceFocus,S=void 0!==w&&w,j=a.disableEscapeKeyDown,k=void 0!==j&&j,C=a.disablePortal,R=void 0!==C&&C,T=a.disableRestoreFocus,O=void 0!==T&&T,P=a.disableScrollLock,E=void 0!==P&&P,M=a.hideBackdrop,_=void 0!==M&&M,D=a.keepMounted,I=void 0!==D&&D,A=a.theme,N=Te(a,ac),L=Ne(e.useState(!0),2),z=L[0],F=L[1],W={closeAfterTransition:f,disableAutoFocus:b,disableEnforceFocus:S,disableEscapeKeyDown:k,disablePortal:R,disableRestoreFocus:O,disableScrollLock:E,hideBackdrop:_,keepMounted:I},B=r({},a,W,{exited:z}),V=function(e){return e.classes}(B),q=null!=(o=null!=(i=v.Root)?i:h)?o:lc;return(0,l.jsx)(Fu,r({components:r({Root:q,Backdrop:u},v),componentsProps:{root:function(){return r({},Du(y.root,B),!Pu(q)&&{as:h,theme:A})},backdrop:function(){return r({},c,Du(y.backdrop,B))}},onTransitionEnter:function(){return F(!1)},onTransitionExited:function(){return F(!0)},ref:n},N,{classes:V},W,{children:p}))})),cc=uc;function dc(e){return Qo("MuiCard",e)}$o("MuiCard",["root"]);var fc=["className","raised"],pc=Yo(Di,{name:"MuiCard",slot:"Root",overridesResolver:function(e,t){return t.root}})((function(){return{overflow:"hidden"}})),hc=e.forwardRef((function(e,t){var n=ln({props:e,name:"MuiCard"}),o=n.className,i=n.raised,a=void 0!==i&&i,s=Te(n,fc),u=r({},n,{raised:a}),c=function(e){return Po({root:["root"]},dc,e.classes)}(u);return(0,l.jsx)(pc,r({className:wn(c.root,o),elevation:a?8:void 0,ref:t,ownerState:u},s))})),mc=hc;function vc(e){return Qo("MuiCardHeader",e)}var gc=$o("MuiCardHeader",["root","avatar","action","content","title","subheader"]),yc=["action","avatar","className","component","disableTypography","subheader","subheaderTypographyProps","title","titleTypographyProps"],xc=Yo("div",{name:"MuiCardHeader",slot:"Root",overridesResolver:function(e,t){var n;return r((Ee(n={},"& .".concat(gc.title),t.title),Ee(n,"& .".concat(gc.subheader),t.subheader),n),t.root)}})({display:"flex",alignItems:"center",padding:16}),bc=Yo("div",{name:"MuiCardHeader",slot:"Avatar",overridesResolver:function(e,t){return t.avatar}})({display:"flex",flex:"0 0 auto",marginRight:16}),wc=Yo("div",{name:"MuiCardHeader",slot:"Action",overridesResolver:function(e,t){return t.action}})({flex:"0 0 auto",alignSelf:"flex-start",marginTop:-4,marginRight:-8,marginBottom:-4}),Sc=Yo("div",{name:"MuiCardHeader",slot:"Content",overridesResolver:function(e,t){return t.content}})({flex:"1 1 auto"}),jc=e.forwardRef((function(e,t){var n=ln({props:e,name:"MuiCardHeader"}),o=n.action,i=n.avatar,a=n.className,s=n.component,u=void 0===s?"div":s,c=n.disableTypography,d=void 0!==c&&c,f=n.subheader,p=n.subheaderTypographyProps,h=n.title,m=n.titleTypographyProps,v=Te(n,yc),g=r({},n,{component:u,disableTypography:d}),y=function(e){return Po({root:["root"],avatar:["avatar"],action:["action"],content:["content"],title:["title"],subheader:["subheader"]},vc,e.classes)}(g),x=h;null==x||x.type===Wi||d||(x=(0,l.jsx)(Wi,r({variant:i?"body2":"h5",className:y.title,component:"span",display:"block"},m,{children:x})));var b=f;return null==b||b.type===Wi||d||(b=(0,l.jsx)(Wi,r({variant:i?"body2":"body1",className:y.subheader,color:"text.secondary",component:"span",display:"block"},p,{children:b}))),(0,l.jsxs)(xc,r({className:wn(y.root,a),as:u,ref:t,ownerState:g},v,{children:[i&&(0,l.jsx)(bc,{className:y.avatar,ownerState:g,children:i}),(0,l.jsxs)(Sc,{className:y.content,ownerState:g,children:[x,b]}),o&&(0,l.jsx)(wc,{className:y.action,ownerState:g,children:o})]}))})),kc=jc;function Cc(e){return Qo("MuiIconButton",e)}var Rc=$o("MuiIconButton",["root","disabled","colorInherit","colorPrimary","colorSecondary","edgeStart","edgeEnd","sizeSmall","sizeMedium","sizeLarge"]),Tc=["edge","children","className","color","disabled","disableFocusRipple","size"],Oc=Yo(Ps,{name:"MuiIconButton",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,"default"!==n.color&&t["color".concat(Eo(n.color))],n.edge&&t["edge".concat(Eo(n.edge))],t["size".concat(Eo(n.size))]]}})((function(e){var t=e.theme,n=e.ownerState;return r({textAlign:"center",flex:"0 0 auto",fontSize:t.typography.pxToRem(24),padding:8,borderRadius:"50%",overflow:"visible",color:(t.vars||t).palette.action.active,transition:t.transitions.create("background-color",{duration:t.transitions.duration.shortest})},!n.disableRipple&&{"&:hover":{backgroundColor:t.vars?"rgba(".concat(t.vars.palette.action.active," / ").concat(t.vars.palette.action.hoverOpacity,")"):Tt(t.palette.action.active,t.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:"transparent"}}},"start"===n.edge&&{marginLeft:"small"===n.size?-3:-12},"end"===n.edge&&{marginRight:"small"===n.size?-3:-12})}),(function(e){var t=e.theme,n=e.ownerState;return r({},"inherit"===n.color&&{color:"inherit"},"inherit"!==n.color&&"default"!==n.color&&r({color:(t.vars||t).palette[n.color].main},!n.disableRipple&&{"&:hover":{backgroundColor:t.vars?"rgba(".concat(t.vars.palette[n.color].mainChannel," / ").concat(t.vars.palette.action.hoverOpacity,")"):Tt(t.palette[n.color].main,t.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:"transparent"}}}),"small"===n.size&&{padding:5,fontSize:t.typography.pxToRem(18)},"large"===n.size&&{padding:12,fontSize:t.typography.pxToRem(28)},Ee({},"&.".concat(Rc.disabled),{backgroundColor:"transparent",color:(t.vars||t).palette.action.disabled}))})),Pc=e.forwardRef((function(e,t){var n=ln({props:e,name:"MuiIconButton"}),o=n.edge,i=void 0!==o&&o,a=n.children,s=n.className,u=n.color,c=void 0===u?"default":u,d=n.disabled,f=void 0!==d&&d,p=n.disableFocusRipple,h=void 0!==p&&p,m=n.size,v=void 0===m?"medium":m,g=Te(n,Tc),y=r({},n,{edge:i,color:c,disabled:f,disableFocusRipple:h,size:v}),x=function(e){var t=e.classes,n=e.disabled,r=e.color,o=e.edge,i=e.size;return Po({root:["root",n&&"disabled","default"!==r&&"color".concat(Eo(r)),o&&"edge".concat(Eo(o)),"size".concat(Eo(i))]},Cc,t)}(y);return(0,l.jsx)(Oc,r({className:wn(x.root,s),centerRipple:!0,focusRipple:!h,disabled:f,ref:t,ownerState:y},g,{children:a}))})),Ec=Pc,Mc=Ml((0,l.jsx)("path",{d:"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"}),"Person");function _c(e){return Qo("MuiAvatar",e)}$o("MuiAvatar",["root","colorDefault","circular","rounded","square","img","fallback"]);var Dc=["alt","children","className","component","imgProps","sizes","src","srcSet","variant"],Ic=Yo("div",{name:"MuiAvatar",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,t[n.variant],n.colorDefault&&t.colorDefault]}})((function(e){var t=e.theme,n=e.ownerState;return r({position:"relative",display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0,width:40,height:40,fontFamily:t.typography.fontFamily,fontSize:t.typography.pxToRem(20),lineHeight:1,borderRadius:"50%",overflow:"hidden",userSelect:"none"},"rounded"===n.variant&&{borderRadius:(t.vars||t).shape.borderRadius},"square"===n.variant&&{borderRadius:0},n.colorDefault&&r({color:(t.vars||t).palette.background.default},t.vars?{backgroundColor:t.vars.palette.Avatar.defaultBg}:{backgroundColor:"light"===t.palette.mode?t.palette.grey[400]:t.palette.grey[600]}))})),Ac=Yo("img",{name:"MuiAvatar",slot:"Img",overridesResolver:function(e,t){return t.img}})({width:"100%",height:"100%",textAlign:"center",objectFit:"cover",color:"transparent",textIndent:1e4}),Nc=Yo(Mc,{name:"MuiAvatar",slot:"Fallback",overridesResolver:function(e,t){return t.fallback}})({width:"75%",height:"75%"});var Lc=e.forwardRef((function(t,n){var o=ln({props:t,name:"MuiAvatar"}),i=o.alt,a=o.children,s=o.className,u=o.component,c=void 0===u?"div":u,d=o.imgProps,f=o.sizes,p=o.src,h=o.srcSet,m=o.variant,v=void 0===m?"circular":m,g=Te(o,Dc),y=null,x=function(t){var n=t.crossOrigin,r=t.referrerPolicy,o=t.src,i=t.srcSet,a=Ne(e.useState(!1),2),l=a[0],s=a[1];return e.useEffect((function(){if(o||i){s(!1);var e=!0,t=new Image;return t.onload=function(){e&&s("loaded")},t.onerror=function(){e&&s("error")},t.crossOrigin=n,t.referrerPolicy=r,t.src=o,i&&(t.srcset=i),function(){e=!1}}}),[n,r,o,i]),l}(r({},d,{src:p,srcSet:h})),b=p||h,w=b&&"error"!==x,S=r({},o,{colorDefault:!w,component:c,variant:v}),j=function(e){var t=e.classes;return Po({root:["root",e.variant,e.colorDefault&&"colorDefault"],img:["img"],fallback:["fallback"]},_c,t)}(S);return y=w?(0,l.jsx)(Ac,r({alt:i,src:p,srcSet:h,sizes:f,ownerState:S,className:j.img},d)):null!=a?a:b&&i?i[0]:(0,l.jsx)(Nc,{className:j.fallback}),(0,l.jsx)(Ic,r({as:c,ownerState:S,className:wn(j.root,s),ref:n},g,{children:y}))})),zc=Lc,Fc=function(t){var n,r=t.online,o=t.token,i=Ne((0,e.useState)(!1),2),a=i[0],s=i[1],u=lu((function(){return Ki.get("/users").then((function(e){return e.data}))}),[]);function c(){s(!1)}return(0,e.useEffect)((function(){u.fetch()}),[]),(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)(Ir,{component:Di,height:60,padding:1,display:"flex",bgcolor:r?"green":"red",justifyContent:"space-between",alignItems:"center",onClick:function(){r&&s(!0)},style:{cursor:r?"pointer":"progress"},children:[(0,l.jsx)(su,{}),(0,l.jsx)(Ir,{children:(0,l.jsx)(Wi,{variant:"caption",children:r?"GO TO DASHBOARD":"YOU ARE OFFLINE"})})]}),(0,l.jsx)(cc,{open:a,style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center"},onClose:c,children:(0,l.jsxs)(mc,{component:Ir,width:"80vw",height:"80vh",children:[(0,l.jsx)(kc,{title:"Select Your Account",action:(0,l.jsx)(Ec,{onClick:c,children:(0,l.jsx)(uu,{})})}),null===(n=u.value)||void 0===n?void 0:n.map((function(e){return(0,l.jsx)(Wc,{user:e,token:o,onClose:c})}))]})})]})},Wc=function(e){var t=e.user,n=e.token,r=e.onClose,o=lu((function(e,t){return Xi.get("/auth/relay/passcode/".concat(e),{headers:{"Relay-Token":t}}).then((function(e){return e.data}))}));return(0,l.jsxs)(Di,{square:!0,component:Ir,display:"flex",padding:2,alignItems:"center",style:{cursor:"pointer"},elevation:5,marginBottom:"2px",onClick:function(){return e=t.id,void(n&&o.fetch(e,n).then((function(e){null!==e&&void 0!==e&&e.url&&(window.API.openBrowser(e.url),r())})));var e},children:[(0,l.jsx)(zc,{}),(0,l.jsx)(Ir,{marginLeft:1,children:(0,l.jsx)(Wi,{children:t.name})}),(0,l.jsx)(Ir,{flexGrow:1}),o.loading?(0,l.jsx)(pi,{}):(0,l.jsx)(cu,{})]},t.id)};function Bc(e){return Bc="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Bc(e)}function Vc(){Vc=function(){return e};var e={},t=Object.prototype,n=t.hasOwnProperty,r="function"==typeof Symbol?Symbol:{},o=r.iterator||"@@iterator",i=r.asyncIterator||"@@asyncIterator",a=r.toStringTag||"@@toStringTag";function l(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{l({},"")}catch(R){l=function(e,t,n){return e[t]=n}}function s(e,t,n,r){var o=t&&t.prototype instanceof d?t:d,i=Object.create(o.prototype),a=new j(r||[]);return i._invoke=function(e,t,n){var r="suspendedStart";return function(o,i){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===o)throw i;return C()}for(n.method=o,n.arg=i;;){var a=n.delegate;if(a){var l=b(a,n);if(l){if(l===c)continue;return l}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===r)throw r="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r="executing";var s=u(e,t,n);if("normal"===s.type){if(r=n.done?"completed":"suspendedYield",s.arg===c)continue;return{value:s.arg,done:n.done}}"throw"===s.type&&(r="completed",n.method="throw",n.arg=s.arg)}}}(e,n,a),i}function u(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(R){return{type:"throw",arg:R}}}e.wrap=s;var c={};function d(){}function f(){}function p(){}var h={};l(h,o,(function(){return this}));var m=Object.getPrototypeOf,v=m&&m(m(k([])));v&&v!==t&&n.call(v,o)&&(h=v);var g=p.prototype=d.prototype=Object.create(h);function y(e){["next","throw","return"].forEach((function(t){l(e,t,(function(e){return this._invoke(t,e)}))}))}function x(e,t){function r(o,i,a,l){var s=u(e[o],e,i);if("throw"!==s.type){var c=s.arg,d=c.value;return d&&"object"==Bc(d)&&n.call(d,"__await")?t.resolve(d.__await).then((function(e){r("next",e,a,l)}),(function(e){r("throw",e,a,l)})):t.resolve(d).then((function(e){c.value=e,a(c)}),(function(e){return r("throw",e,a,l)}))}l(s.arg)}var o;this._invoke=function(e,n){function i(){return new t((function(t,o){r(e,n,t,o)}))}return o=o?o.then(i,i):i()}}function b(e,t){var n=e.iterator[t.method];if(void 0===n){if(t.delegate=null,"throw"===t.method){if(e.iterator.return&&(t.method="return",t.arg=void 0,b(e,t),"throw"===t.method))return c;t.method="throw",t.arg=new TypeError("The iterator does not provide a 'throw' method")}return c}var r=u(n,e.iterator,t.arg);if("throw"===r.type)return t.method="throw",t.arg=r.arg,t.delegate=null,c;var o=r.arg;return o?o.done?(t[e.resultName]=o.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=void 0),t.delegate=null,c):o:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,c)}function w(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function S(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function j(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(w,this),this.reset(!0)}function k(e){if(e){var t=e[o];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var r=-1,i=function t(){for(;++r<e.length;)if(n.call(e,r))return t.value=e[r],t.done=!1,t;return t.value=void 0,t.done=!0,t};return i.next=i}}return{next:C}}function C(){return{value:void 0,done:!0}}return f.prototype=p,l(g,"constructor",p),l(p,"constructor",f),f.displayName=l(p,a,"GeneratorFunction"),e.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===f||"GeneratorFunction"===(t.displayName||t.name))},e.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,p):(e.__proto__=p,l(e,a,"GeneratorFunction")),e.prototype=Object.create(g),e},e.awrap=function(e){return{__await:e}},y(x.prototype),l(x.prototype,i,(function(){return this})),e.AsyncIterator=x,e.async=function(t,n,r,o,i){void 0===i&&(i=Promise);var a=new x(s(t,n,r,o),i);return e.isGeneratorFunction(n)?a:a.next().then((function(e){return e.done?e.value:a.next()}))},y(g),l(g,a,"Generator"),l(g,o,(function(){return this})),l(g,"toString",(function(){return"[object Generator]"})),e.keys=function(e){var t=[];for(var n in e)t.push(n);return t.reverse(),function n(){for(;t.length;){var r=t.pop();if(r in e)return n.value=r,n.done=!1,n}return n.done=!0,n}},e.values=k,j.prototype={constructor:j,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,this.tryEntries.forEach(S),!e)for(var t in this)"t"===t.charAt(0)&&n.call(this,t)&&!isNaN(+t.slice(1))&&(this[t]=void 0)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var t=this;function r(n,r){return a.type="throw",a.arg=e,t.next=n,r&&(t.method="next",t.arg=void 0),!!r}for(var o=this.tryEntries.length-1;o>=0;--o){var i=this.tryEntries[o],a=i.completion;if("root"===i.tryLoc)return r("end");if(i.tryLoc<=this.prev){var l=n.call(i,"catchLoc"),s=n.call(i,"finallyLoc");if(l&&s){if(this.prev<i.catchLoc)return r(i.catchLoc,!0);if(this.prev<i.finallyLoc)return r(i.finallyLoc)}else if(l){if(this.prev<i.catchLoc)return r(i.catchLoc,!0)}else{if(!s)throw new Error("try statement without catch or finally");if(this.prev<i.finallyLoc)return r(i.finallyLoc)}}}},abrupt:function(e,t){for(var r=this.tryEntries.length-1;r>=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev<o.finallyLoc){var i=o;break}}i&&("break"===e||"continue"===e)&&i.tryLoc<=t&&t<=i.finallyLoc&&(i=null);var a=i?i.completion:{};return a.type=e,a.arg=t,i?(this.method="next",this.next=i.finallyLoc,c):this.complete(a)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),c},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),S(n),c}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var o=r.arg;S(n)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:k(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),c}},e}function qc(e,t,n,r,o,i,a){try{var l=e[i](a),s=l.value}catch(u){return void n(u)}l.done?t(s):Promise.resolve(s).then(r,o)}function Hc(e){return function(){var t=this,n=arguments;return new Promise((function(r,o){var i=e.apply(t,n);function a(e){qc(i,r,o,a,l,"next",e)}function l(e){qc(i,r,o,a,l,"throw",e)}a(void 0)}))}}var Uc=Ml((0,l.jsx)("circle",{cx:"12",cy:"12",r:"8"}),"FiberManualRecord"),Yc={animation:"blinker 1.2s linear infinite",color:"red"},Gc=function(){var t=Ne((0,e.useState)(null),2),n=t[0],r=t[1],o=function(){var e=Hc(Vc().mark((function e(){var t;return Vc().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,Ki.get("/requests/pending-requests/count");case 3:t=e.sent,r(t.data.count),e.next=10;break;case 7:e.prev=7,e.t0=e.catch(0),console.error("Failed to fetch pending tests count",e.t0);case 10:case"end":return e.stop()}}),e,null,[[0,7]])})));return function(){return e.apply(this,arguments)}}();return(0,e.useEffect)((function(){o();var e=setInterval(o,2e3);return function(){return clearInterval(e)}}),[]),(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("style",{children:"\n@keyframes blinker {\n  50% { opacity: 0; }\n}\n"}),(0,l.jsx)(To,{to:"/pending-tests",style:{textDecoration:"none",color:"white"},children:(0,l.jsxs)(Ir,{component:Di,height:60,padding:1,display:"flex",flexDirection:"row",alignItems:"center",bgcolor:"#121212dd",justifyContent:"space-between",children:[(0,l.jsxs)(Ir,{display:"flex",flexDirection:"column",children:[(0,l.jsx)(Wi,{align:"left",variant:"caption",children:(0,l.jsx)("strong",{children:"Pending Approval"})}),(0,l.jsx)(Wi,{align:"left",color:"GrayText",variant:"caption",children:null!==n&&n>0?"".concat(n," waiting approval"):"No approval request"})]}),(0,l.jsx)(Ir,{height:"24px",width:"24px",borderRadius:"12px",marginRight:1,children:null!=n&&n>0&&(0,l.jsx)(Uc,{fontSize:"large",style:Yc})})]})})]})};function Qc(){var t=Ne((0,e.useState)([]),2),n=t[0],r=t[1],o=Ne((0,e.useState)(!0),2),i=o[0],a=o[1],s=Ne((0,e.useState)(!1),2),u=s[0],c=s[1],d=(0,e.useRef)(null),f=lu((function(){return Ki.get("/contact-persons?isPrimaryContact=true").then((function(e){return e.data}))}));(0,e.useEffect)((function(){a(!0),f.fetch().then((function(e){r(null!==e&&void 0!==e?e:[]),a(!1)}))}),[]);var p=function(){c(!0),d.current&&clearTimeout(d.current),d.current=setTimeout((function(){return c(!1)}),2e3)};return(0,l.jsx)(Ir,{component:"footer",sx:{position:"fixed",bottom:0,left:0,width:"100%",bgcolor:"#121212dd",color:"white",py:1,px:2,display:"flex",justifyContent:"center",fontSize:"0.7rem"},children:(0,l.jsxs)(Ir,{sx:{display:"flex",alignItems:"center",gap:2,maxWidth:"100%"},children:[(0,l.jsx)(Wi,{variant:"caption",sx:{fontWeight:500,color:"rgba(255, 255, 255, 0.6)",flexShrink:0,whiteSpace:"nowrap"},children:"Support Contacts:"}),(0,l.jsx)(Ir,{onMouseEnter:function(){return p()},onMouseLeave:function(){return c(!1)},onScroll:function(){return p()},sx:{display:"flex",alignItems:"center",gap:3,overflowX:"auto",flexShrink:1,whiteSpace:"nowrap",scrollbarWidth:u?"thin":"none","&::-webkit-scrollbar":{height:"3px"},"&::-webkit-scrollbar-thumb":{backgroundColor:u?"#666":"transparent",borderRadius:"10px",opacity:u?1:0,transition:"background-color 0.3s ease, opacity 0.3s ease"},"&::-webkit-scrollbar-thumb:hover":{backgroundColor:"#888"},"&::-webkit-scrollbar-track":{backgroundColor:"transparent"}},children:i?(0,l.jsx)(Wi,{variant:"caption",sx:{color:"rgba(255,255,255,0.6)"},children:"Loading..."}):n.length>0?n.map((function(e){return(0,l.jsxs)(Ir,{sx:{display:"flex",flexDirection:"column",alignItems:"center",textAlign:"center",flexShrink:0,minWidth:"80px"},children:[(0,l.jsx)(Wi,{variant:"caption",sx:{fontWeight:500,color:"rgba(255,255,255,0.7)",fontSize:"0.7rem"},children:e.name}),(0,l.jsx)(Wi,{variant:"caption",sx:{color:"rgba(255,255,255,0.5)",fontSize:"0.65rem"},children:e.phone})]},e.id)})):(0,l.jsx)(Wi,{variant:"caption",sx:{color:"rgba(255,255,255,0.6)"},children:"No contacts available"})})]})})}var $c=function(){var t,n,r,o,i,a,s,u,c,d,f,p,h,m,v,g,y,x,b,w,S,j,k,C,R,T,O,P,E,M,_,D,I,A,N,L,z,F,W,B,V,q,H=Ne((0,e.useState)(0),2),U=H[0],Y=H[1],G=lu((function(){return Ki.get("/device").then((function(e){return e.data}))}));return(0,e.useEffect)((function(){var e;return G.fetch().then((function(){e=setTimeout((function(){return Y((function(e){return e+1}))}),5e3)})),function(){return clearTimeout(e)}}),[U]),(0,l.jsxs)(Ri,{children:[(0,l.jsx)(au,{active:"home"}),G.value?(0,l.jsx)(Ir,{display:"flex",flexDirection:"column",flexGrow:1,children:(0,l.jsx)(Ir,{margin:1,children:(0,l.jsxs)(Ci,{container:!0,spacing:1,children:[(0,l.jsx)(Ci,{item:!0,xs:3,children:(0,l.jsx)(Vi,{label:"Server",value:!0===(null===(t=G.value)||void 0===t?void 0:t.server)})}),(0,l.jsx)(Ci,{item:!0,xs:3,children:(0,l.jsx)(Vi,{label:"GeneXpert",value:!0===(null===(n=G.value)||void 0===n?void 0:n.database)})}),(0,l.jsx)(Ci,{item:!0,xs:3,children:(0,l.jsx)(Gc,{})}),(0,l.jsx)(Ci,{item:!0,xs:3,children:(0,l.jsx)(Fc,{online:!0===(null===(r=G.value)||void 0===r?void 0:r.server),token:null===(o=G.value)||void 0===o?void 0:o.registration_token})}),(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsx)(Ir,{display:"flex",flexDirection:"row",overflow:"auto",className:"scroll_enabled",children:(0,l.jsxs)(Ir,{display:"flex",flexDirection:"row",children:[(0,l.jsx)(qi,{label:"Tests",saved:(null===(i=G.value)||void 0===i?void 0:i.tests_saved)||0,total:(null===(a=G.value)||void 0===a?void 0:a.tests_total)||0,uploaded:(null===(s=G.value)||void 0===s?void 0:s.tests_uploaded)||0}),(0,l.jsx)(qi,{label:"Logs",saved:(null===(u=G.value)||void 0===u?void 0:u.logs_saved)||0,total:(null===(c=G.value)||void 0===c?void 0:c.logs_total)||0,uploaded:(null===(d=G.value)||void 0===d?void 0:d.logs_uploaded)||0}),(0,l.jsx)(qi,{label:"Status",saved:(null===(f=G.value)||void 0===f?void 0:f.status_saved)||0,total:(null===(p=G.value)||void 0===p?void 0:p.status_total)||0,uploaded:(null===(h=G.value)||void 0===h?void 0:h.status_uploaded)||0}),(0,l.jsx)(qi,{label:"Test Details",saved:(null===(m=G.value)||void 0===m?void 0:m.requests_saved)||0,total:(null===(v=G.value)||void 0===v?void 0:v.requests_total)||0,uploaded:(null===(g=G.value)||void 0===g?void 0:g.requests_uploaded)||0}),(0,l.jsx)(qi,{label:"Daily Summary",saved:(null===(y=G.value)||void 0===y?void 0:y.dailySummary_saved)||0,total:(null===(x=G.value)||void 0===x?void 0:x.dailySummary_total)||0,uploaded:(null===(b=G.value)||void 0===b?void 0:b.dailySummary_uploaded)||0}),(0,l.jsx)(qi,{label:"Monthly Summary",saved:(null===(w=G.value)||void 0===w?void 0:w.monthlySummary_saved)||0,total:(null===(S=G.value)||void 0===S?void 0:S.monthlySummary_total)||0,uploaded:(null===(j=G.value)||void 0===j?void 0:j.monthlySummary_uploaded)||0}),(0,l.jsx)(qi,{label:"EQA Summary",saved:(null===(k=G.value)||void 0===k?void 0:k.eqaSummary_saved)||0,total:(null===(C=G.value)||void 0===C?void 0:C.eqaSummary_total)||0,uploaded:(null===(R=G.value)||void 0===R?void 0:R.eqaSummary_uploaded)||0}),(0,l.jsx)(qi,{label:"Service Requests",direction:"up",saved:(null===(T=G.value)||void 0===T?void 0:T.maintenance_saved)||0,total:(null===(O=G.value)||void 0===O?void 0:O.maintenance_total)||0,uploaded:(null===(P=G.value)||void 0===P?void 0:P.maintenance_uploaded)||0}),(0,l.jsx)(qi,{label:"Service Updates",direction:"down",saved:(null===(E=G.value)||void 0===E?void 0:E.servicerequests_saved)||0,total:(null===(M=G.value)||void 0===M?void 0:M.servicerequests_total)||0,uploaded:(null===(_=G.value)||void 0===_?void 0:_.servicerequests_uploaded)||0}),(0,l.jsx)(qi,{label:"Calibrations",saved:(null===(D=G.value)||void 0===D?void 0:D.calibrations_saved)||0,total:(null===(I=G.value)||void 0===I?void 0:I.calibrations_total)||0,uploaded:(null===(A=G.value)||void 0===A?void 0:A.calibrations_uploaded)||0}),(0,l.jsx)(qi,{label:"Facilities",direction:"down",saved:(null===(N=G.value)||void 0===N?void 0:N.facilities_saved)||0,total:(null===(L=G.value)||void 0===L?void 0:L.facilities_total)||0,uploaded:(null===(z=G.value)||void 0===z?void 0:z.facilities_uploaded)||0}),(0,l.jsx)(qi,{label:"Users",direction:"down",saved:(null===(F=G.value)||void 0===F?void 0:F.users_saved)||0,total:(null===(W=G.value)||void 0===W?void 0:W.users_total)||0,uploaded:(null===(B=G.value)||void 0===B?void 0:B.users_uploaded)||0})]})})}),(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsx)(nl,{modules:(null===(V=G.value)||void 0===V?void 0:V.modules)||[],sites:(null===(q=G.value)||void 0===q?void 0:q.sites)||[]})})]})})}):(0,l.jsx)(Ir,{flexGrow:1,display:"flex",alignItems:"center",justifyContent:"center",children:(0,l.jsx)(pi,{})}),(0,l.jsx)(Qc,{})]})},Kc=function(){return(0,l.jsxs)(Ri,{children:[(0,l.jsx)(au,{active:"requests"}),(0,l.jsx)(yo,{})]})};function Xc(e){return Qo("MuiFab",e)}var Zc=$o("MuiFab",["root","primary","secondary","extended","circular","focusVisible","disabled","colorInherit","sizeSmall","sizeMedium","sizeLarge","info","error","warning","success"]),Jc=["children","className","color","component","disabled","disableFocusRipple","focusVisibleClassName","size","variant"],ed=Yo(Ps,{name:"MuiFab",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,t[n.variant],t["size".concat(Eo(n.size))],"inherit"===n.color&&t.colorInherit,t[Eo(n.size)],t[n.color]]}})((function(e){var t,n,o,i=e.theme,a=e.ownerState;return r({},i.typography.button,(Ee(t={minHeight:36,transition:i.transitions.create(["background-color","box-shadow","border-color"],{duration:i.transitions.duration.short}),borderRadius:"50%",padding:0,minWidth:0,width:56,height:56,zIndex:(i.vars||i).zIndex.fab,boxShadow:(i.vars||i).shadows[6],"&:active":{boxShadow:(i.vars||i).shadows[12]},color:i.vars?i.vars.palette.text.primary:null==(n=(o=i.palette).getContrastText)?void 0:n.call(o,i.palette.grey[300]),backgroundColor:(i.vars||i).palette.grey[300],"&:hover":{backgroundColor:(i.vars||i).palette.grey.A100,"@media (hover: none)":{backgroundColor:(i.vars||i).palette.grey[300]},textDecoration:"none"}},"&.".concat(Zc.focusVisible),{boxShadow:(i.vars||i).shadows[6]}),Ee(t,"&.".concat(Zc.disabled),{color:(i.vars||i).palette.action.disabled,boxShadow:(i.vars||i).shadows[0],backgroundColor:(i.vars||i).palette.action.disabledBackground}),t),"small"===a.size&&{width:40,height:40},"medium"===a.size&&{width:48,height:48},"extended"===a.variant&&{borderRadius:24,padding:"0 16px",width:"auto",minHeight:"auto",minWidth:48,height:48},"extended"===a.variant&&"small"===a.size&&{width:"auto",padding:"0 8px",borderRadius:17,minWidth:34,height:34},"extended"===a.variant&&"medium"===a.size&&{width:"auto",padding:"0 16px",borderRadius:20,minWidth:40,height:40},"inherit"===a.color&&{color:"inherit"})}),(function(e){var t=e.theme,n=e.ownerState;return r({},"inherit"!==n.color&&"default"!==n.color&&null!=(t.vars||t).palette[n.color]&&{color:(t.vars||t).palette[n.color].contrastText,backgroundColor:(t.vars||t).palette[n.color].main,"&:hover":{backgroundColor:(t.vars||t).palette[n.color].dark,"@media (hover: none)":{backgroundColor:(t.vars||t).palette[n.color].main}}})})),td=e.forwardRef((function(e,t){var n=ln({props:e,name:"MuiFab"}),o=n.children,i=n.className,a=n.color,s=void 0===a?"default":a,u=n.component,c=void 0===u?"button":u,d=n.disabled,f=void 0!==d&&d,p=n.disableFocusRipple,h=void 0!==p&&p,m=n.focusVisibleClassName,v=n.size,g=void 0===v?"large":v,y=n.variant,x=void 0===y?"circular":y,b=Te(n,Jc),w=r({},n,{color:s,component:c,disabled:f,disableFocusRipple:h,size:g,variant:x}),S=function(e){var t=e.color,n=e.variant,r=e.classes,o=e.size;return Po({root:["root",n,"size".concat(Eo(o)),"inherit"===t?"colorInherit":t]},Xc,r)}(w);return(0,l.jsx)(ed,r({className:wn(S.root,i),component:c,disabled:f,focusRipple:!h,focusVisibleClassName:wn(S.focusVisible,m),ownerState:w,ref:t},b,{children:o}))})),nd=td,rd=0;var od=t.useId;function id(t){if(void 0!==od){var n=od();return null!=t?t:n}return function(t){var n=Ne(e.useState(t),2),r=n[0],o=n[1],i=t||r;return e.useEffect((function(){null==r&&o("mui-".concat(rd+=1))}),[r]),i}(t)}function ad(e){return Qo("MuiDialog",e)}var ld=$o("MuiDialog",["root","scrollPaper","scrollBody","container","paper","paperScrollPaper","paperScrollBody","paperWidthFalse","paperWidthXs","paperWidthSm","paperWidthMd","paperWidthLg","paperWidthXl","paperFullWidth","paperFullScreen"]);var sd=(0,e.createContext)({}),ud=["aria-describedby","aria-labelledby","BackdropComponent","BackdropProps","children","className","disableEscapeKeyDown","fullScreen","fullWidth","maxWidth","onBackdropClick","onClose","open","PaperComponent","PaperProps","scroll","TransitionComponent","transitionDuration","TransitionProps"],cd=Yo(ic,{name:"MuiDialog",slot:"Backdrop",overrides:function(e,t){return t.backdrop}})({zIndex:-1}),dd=Yo(cc,{name:"MuiDialog",slot:"Root",overridesResolver:function(e,t){return t.root}})({"@media print":{position:"absolute !important"}}),fd=Yo("div",{name:"MuiDialog",slot:"Container",overridesResolver:function(e,t){var n=e.ownerState;return[t.container,t["scroll".concat(Eo(n.scroll))]]}})((function(e){var t=e.ownerState;return r({height:"100%","@media print":{height:"auto"},outline:0},"paper"===t.scroll&&{display:"flex",justifyContent:"center",alignItems:"center"},"body"===t.scroll&&{overflowY:"auto",overflowX:"hidden",textAlign:"center","&:after":{content:'""',display:"inline-block",verticalAlign:"middle",height:"100%",width:"0"}})})),pd=Yo(Di,{name:"MuiDialog",slot:"Paper",overridesResolver:function(e,t){var n=e.ownerState;return[t.paper,t["scrollPaper".concat(Eo(n.scroll))],t["paperWidth".concat(Eo(String(n.maxWidth)))],n.fullWidth&&t.paperFullWidth,n.fullScreen&&t.paperFullScreen]}})((function(e){var t=e.theme,n=e.ownerState;return r({margin:32,position:"relative",overflowY:"auto","@media print":{overflowY:"visible",boxShadow:"none"}},"paper"===n.scroll&&{display:"flex",flexDirection:"column",maxHeight:"calc(100% - 64px)"},"body"===n.scroll&&{display:"inline-block",verticalAlign:"middle",textAlign:"left"},!n.maxWidth&&{maxWidth:"calc(100% - 64px)"},"xs"===n.maxWidth&&Ee({maxWidth:"px"===t.breakpoints.unit?Math.max(t.breakpoints.values.xs,444):"".concat(t.breakpoints.values.xs).concat(t.breakpoints.unit)},"&.".concat(ld.paperScrollBody),Ee({},t.breakpoints.down(Math.max(t.breakpoints.values.xs,444)+64),{maxWidth:"calc(100% - 64px)"})),n.maxWidth&&"xs"!==n.maxWidth&&Ee({maxWidth:"".concat(t.breakpoints.values[n.maxWidth]).concat(t.breakpoints.unit)},"&.".concat(ld.paperScrollBody),Ee({},t.breakpoints.down(t.breakpoints.values[n.maxWidth]+64),{maxWidth:"calc(100% - 64px)"})),n.fullWidth&&{width:"calc(100% - 64px)"},n.fullScreen&&Ee({margin:0,width:"100%",maxWidth:"100%",height:"100%",maxHeight:"none",borderRadius:0},"&.".concat(ld.paperScrollBody),{margin:0,maxWidth:"100%"}))})),hd=e.forwardRef((function(t,n){var o=ln({props:t,name:"MuiDialog"}),i=hi(),a={enter:i.transitions.duration.enteringScreen,exit:i.transitions.duration.leavingScreen},s=o["aria-describedby"],u=o["aria-labelledby"],c=o.BackdropComponent,d=o.BackdropProps,f=o.children,p=o.className,h=o.disableEscapeKeyDown,m=void 0!==h&&h,v=o.fullScreen,g=void 0!==v&&v,y=o.fullWidth,x=void 0!==y&&y,b=o.maxWidth,w=void 0===b?"sm":b,S=o.onBackdropClick,j=o.onClose,k=o.open,C=o.PaperComponent,R=void 0===C?Di:C,T=o.PaperProps,O=void 0===T?{}:T,P=o.scroll,E=void 0===P?"paper":P,M=o.TransitionComponent,_=void 0===M?ec:M,D=o.transitionDuration,I=void 0===D?a:D,A=o.TransitionProps,N=Te(o,ud),L=r({},o,{disableEscapeKeyDown:m,fullScreen:g,fullWidth:x,maxWidth:w,scroll:E}),z=function(e){var t=e.classes,n=e.scroll,r=e.maxWidth,o=e.fullWidth,i=e.fullScreen;return Po({root:["root"],container:["container","scroll".concat(Eo(n))],paper:["paper","paperScroll".concat(Eo(n)),"paperWidth".concat(Eo(String(r))),o&&"paperFullWidth",i&&"paperFullScreen"]},ad,t)}(L),F=e.useRef(),W=id(u),B=e.useMemo((function(){return{titleId:W}}),[W]);return(0,l.jsx)(dd,r({className:wn(z.root,p),closeAfterTransition:!0,components:{Backdrop:cd},componentsProps:{backdrop:r({transitionDuration:I,as:c},d)},disableEscapeKeyDown:m,onClose:j,open:k,ref:n,onClick:function(e){F.current&&(F.current=null,S&&S(e),j&&j(e,"backdropClick"))},ownerState:L},N,{children:(0,l.jsx)(_,r({appear:!0,in:k,timeout:I,role:"presentation"},A,{children:(0,l.jsx)(fd,{className:wn(z.container),onMouseDown:function(e){F.current=e.target===e.currentTarget},ownerState:L,children:(0,l.jsx)(pd,r({as:R,elevation:24,role:"dialog","aria-describedby":s,"aria-labelledby":W},O,{className:wn(z.paper,O.className),ownerState:L,children:(0,l.jsx)(sd.Provider,{value:B,children:f})}))})}))}))})),md=hd;function vd(e){return Qo("MuiDialogTitle",e)}var gd=$o("MuiDialogTitle",["root"]),yd=["className","id"],xd=Yo(Wi,{name:"MuiDialogTitle",slot:"Root",overridesResolver:function(e,t){return t.root}})({padding:"16px 24px",flex:"0 0 auto"}),bd=e.forwardRef((function(t,n){var o=ln({props:t,name:"MuiDialogTitle"}),i=o.className,a=o.id,s=Te(o,yd),u=o,c=function(e){return Po({root:["root"]},vd,e.classes)}(u),d=e.useContext(sd).titleId,f=void 0===d?a:d;return(0,l.jsx)(xd,r({component:"h2",className:wn(c.root,i),ownerState:u,ref:n,variant:"h6",id:f},s))})),wd=bd;function Sd(e){return Qo("MuiDialogContent",e)}$o("MuiDialogContent",["root","dividers"]);var jd=["className","dividers"],kd=Yo("div",{name:"MuiDialogContent",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,n.dividers&&t.dividers]}})((function(e){var t=e.theme;return r({flex:"1 1 auto",WebkitOverflowScrolling:"touch",overflowY:"auto",padding:"20px 24px"},e.ownerState.dividers?{padding:"16px 24px",borderTop:"1px solid ".concat((t.vars||t).palette.divider),borderBottom:"1px solid ".concat((t.vars||t).palette.divider)}:Ee({},".".concat(gd.root," + &"),{paddingTop:0}))})),Cd=e.forwardRef((function(e,t){var n=ln({props:e,name:"MuiDialogContent"}),o=n.className,i=n.dividers,a=void 0!==i&&i,s=Te(n,jd),u=r({},n,{dividers:a}),c=function(e){var t=e.classes;return Po({root:["root",e.dividers&&"dividers"]},Sd,t)}(u);return(0,l.jsx)(kd,r({className:wn(c.root,o),ownerState:u,ref:t},s))})),Rd=Cd;function Td(e){return Qo("MuiFormGroup",e)}$o("MuiFormGroup",["root","row","error"]);var Od=e.createContext();function Pd(){return e.useContext(Od)}function Ed(e){var t=e.props,n=e.states,r=e.muiFormControl;return n.reduce((function(e,n){return e[n]=t[n],r&&"undefined"===typeof t[n]&&(e[n]=r[n]),e}),{})}var Md=["className","row"],_d=Yo("div",{name:"MuiFormGroup",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,n.row&&t.row]}})((function(e){return r({display:"flex",flexDirection:"column",flexWrap:"wrap"},e.ownerState.row&&{flexDirection:"row"})})),Dd=e.forwardRef((function(e,t){var n=ln({props:e,name:"MuiFormGroup"}),o=n.className,i=n.row,a=void 0!==i&&i,s=Te(n,Md),u=r({},n,{row:a,error:Ed({props:n,muiFormControl:Pd(),states:["error"]}).error}),c=function(e){var t=e.classes;return Po({root:["root",e.row&&"row",e.error&&"error"]},Td,t)}(u);return(0,l.jsx)(_d,r({className:wn(c.root,o),ownerState:u,ref:t},s))})),Id=Dd;function Ad(t){var n=t.controlled,r=t.default,o=(t.name,t.state,e.useRef(void 0!==n).current),i=Ne(e.useState(r),2),a=i[0],l=i[1];return[o?n:a,e.useCallback((function(e){o||l(e)}),[])]}var Nd=Ad;var Ld=e.createContext(void 0),zd=id,Fd=["actions","children","defaultValue","name","onChange","value"],Wd=e.forwardRef((function(t,n){var o=t.actions,i=t.children,a=t.defaultValue,s=t.name,u=t.onChange,c=t.value,d=Te(t,Fd),f=e.useRef(null),p=Ne(Nd({controlled:c,default:a,name:"RadioGroup"}),2),h=p[0],m=p[1];e.useImperativeHandle(o,(function(){return{focus:function(){var e=f.current.querySelector("input:not(:disabled):checked");e||(e=f.current.querySelector("input:not(:disabled)")),e&&e.focus()}}}),[]);var v=Nl(n,f),g=zd(s);return(0,l.jsx)(Ld.Provider,{value:{name:g,onChange:function(e){m(e.target.value),u&&u(e,e.target.value)},value:h},children:(0,l.jsx)(Id,r({role:"radiogroup",ref:v},d,{children:i}))})})),Bd=Wd;function Vd(e){return Qo("MuiFormControlLabel",e)}var qd=$o("MuiFormControlLabel",["root","labelPlacementStart","labelPlacementTop","labelPlacementBottom","disabled","label","error"]),Hd=["checked","className","componentsProps","control","disabled","disableTypography","inputRef","label","labelPlacement","name","onChange","value"],Ud=Yo("label",{name:"MuiFormControlLabel",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[Ee({},"& .".concat(qd.label),t.label),t.root,t["labelPlacement".concat(Eo(n.labelPlacement))]]}})((function(e){var t=e.theme,n=e.ownerState;return r(Ee({display:"inline-flex",alignItems:"center",cursor:"pointer",verticalAlign:"middle",WebkitTapHighlightColor:"transparent",marginLeft:-11,marginRight:16},"&.".concat(qd.disabled),{cursor:"default"}),"start"===n.labelPlacement&&{flexDirection:"row-reverse",marginLeft:16,marginRight:-11},"top"===n.labelPlacement&&{flexDirection:"column-reverse",marginLeft:16},"bottom"===n.labelPlacement&&{flexDirection:"column",marginLeft:16},Ee({},"& .".concat(qd.label),Ee({},"&.".concat(qd.disabled),{color:(t.vars||t).palette.text.disabled})))})),Yd=e.forwardRef((function(t,n){var o=ln({props:t,name:"MuiFormControlLabel"}),i=o.className,a=o.componentsProps,s=void 0===a?{}:a,u=o.control,c=o.disabled,d=o.disableTypography,f=o.label,p=o.labelPlacement,h=void 0===p?"end":p,m=Te(o,Hd),v=Pd(),g=c;"undefined"===typeof g&&"undefined"!==typeof u.props.disabled&&(g=u.props.disabled),"undefined"===typeof g&&v&&(g=v.disabled);var y={disabled:g};["checked","name","onChange","value","inputRef"].forEach((function(e){"undefined"===typeof u.props[e]&&"undefined"!==typeof o[e]&&(y[e]=o[e])}));var x=Ed({props:o,muiFormControl:v,states:["error"]}),b=r({},o,{disabled:g,labelPlacement:h,error:x.error}),w=function(e){var t=e.classes,n=e.disabled,r=e.labelPlacement,o=e.error;return Po({root:["root",n&&"disabled","labelPlacement".concat(Eo(r)),o&&"error"],label:["label",n&&"disabled"]},Vd,t)}(b),S=f;return null==S||S.type===Wi||d||(S=(0,l.jsx)(Wi,r({component:"span",className:w.label},s.typography,{children:S}))),(0,l.jsxs)(Ud,r({className:wn(w.root,i),ownerState:b,ref:n},m,{children:[e.cloneElement(u,y),S]}))})),Gd=Yd;function Qd(e){return Qo("PrivateSwitchBase",e)}$o("PrivateSwitchBase",["root","checked","disabled","input","edgeStart","edgeEnd"]);var $d=["autoFocus","checked","checkedIcon","className","defaultChecked","disabled","disableFocusRipple","edge","icon","id","inputProps","inputRef","name","onBlur","onChange","onFocus","readOnly","required","tabIndex","type","value"],Kd=Yo(Ps)((function(e){var t=e.ownerState;return r({padding:9,borderRadius:"50%"},"start"===t.edge&&{marginLeft:"small"===t.size?-3:-12},"end"===t.edge&&{marginRight:"small"===t.size?-3:-12})})),Xd=Yo("input")({cursor:"inherit",position:"absolute",opacity:0,width:"100%",height:"100%",top:0,left:0,margin:0,padding:0,zIndex:1}),Zd=e.forwardRef((function(e,t){var n=e.autoFocus,o=e.checked,i=e.checkedIcon,a=e.className,s=e.defaultChecked,u=e.disabled,c=e.disableFocusRipple,d=void 0!==c&&c,f=e.edge,p=void 0!==f&&f,h=e.icon,m=e.id,v=e.inputProps,g=e.inputRef,y=e.name,x=e.onBlur,b=e.onChange,w=e.onFocus,S=e.readOnly,j=e.required,k=e.tabIndex,C=e.type,R=e.value,T=Te(e,$d),O=Ne(Nd({controlled:o,default:Boolean(s),name:"SwitchBase",state:"checked"}),2),P=O[0],E=O[1],M=Pd(),_=u;M&&"undefined"===typeof _&&(_=M.disabled);var D="checkbox"===C||"radio"===C,I=r({},e,{checked:P,disabled:_,disableFocusRipple:d,edge:p}),A=function(e){var t=e.classes,n=e.checked,r=e.disabled,o=e.edge;return Po({root:["root",n&&"checked",r&&"disabled",o&&"edge".concat(Eo(o))],input:["input"]},Qd,t)}(I);return(0,l.jsxs)(Kd,r({component:"span",className:wn(A.root,a),centerRipple:!0,focusRipple:!d,disabled:_,tabIndex:null,role:void 0,onFocus:function(e){w&&w(e),M&&M.onFocus&&M.onFocus(e)},onBlur:function(e){x&&x(e),M&&M.onBlur&&M.onBlur(e)},ownerState:I,ref:t},T,{children:[(0,l.jsx)(Xd,r({autoFocus:n,checked:o,defaultChecked:s,className:A.input,disabled:_,id:D&&m,name:y,onChange:function(e){if(!e.nativeEvent.defaultPrevented){var t=e.target.checked;E(t),b&&b(e,t)}},readOnly:S,ref:g,required:j,ownerState:I,tabIndex:k,type:C},"checkbox"===C&&void 0===R?{}:{value:R},v)),P?i:h]}))})),Jd=Zd,ef=Ml((0,l.jsx)("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"}),"RadioButtonUnchecked"),tf=Ml((0,l.jsx)("path",{d:"M8.465 8.465C9.37 7.56 10.62 7 12 7C14.76 7 17 9.24 17 12C17 13.38 16.44 14.63 15.535 15.535C14.63 16.44 13.38 17 12 17C9.24 17 7 14.76 7 12C7 10.62 7.56 9.37 8.465 8.465Z"}),"RadioButtonChecked"),nf=Yo("span")({position:"relative",display:"flex"}),rf=Yo(ef)({transform:"scale(1)"}),of=Yo(tf)((function(e){var t=e.theme,n=e.ownerState;return r({left:0,position:"absolute",transform:"scale(0)",transition:t.transitions.create("transform",{easing:t.transitions.easing.easeIn,duration:t.transitions.duration.shortest})},n.checked&&{transform:"scale(1)",transition:t.transitions.create("transform",{easing:t.transitions.easing.easeOut,duration:t.transitions.duration.shortest})})}));var af=function(e){var t=e.checked,n=void 0!==t&&t,o=e.classes,i=void 0===o?{}:o,a=e.fontSize,s=r({},e,{checked:n});return(0,l.jsxs)(nf,{className:i.root,ownerState:s,children:[(0,l.jsx)(rf,{fontSize:a,className:i.background,ownerState:s}),(0,l.jsx)(of,{fontSize:a,className:i.dot,ownerState:s})]})},lf=du;function sf(e){return Qo("MuiRadio",e)}var uf=$o("MuiRadio",["root","checked","disabled","colorPrimary","colorSecondary"]),cf=["checked","checkedIcon","color","icon","name","onChange","size"],df=Yo(Jd,{shouldForwardProp:function(e){return qo(e)||"classes"===e},name:"MuiRadio",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,t["color".concat(Eo(n.color))]]}})((function(e){var t=e.theme,n=e.ownerState;return r({color:(t.vars||t).palette.text.secondary,"&:hover":{backgroundColor:t.vars?"rgba(".concat("default"===n.color?t.vars.palette.action.activeChannel:t.vars.palette[n.color].mainChannel," / ").concat(t.vars.palette.action.hoverOpacity,")"):Tt("default"===n.color?t.palette.action.active:t.palette[n.color].main,t.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:"transparent"}}},"default"!==n.color&&Ee({},"&.".concat(uf.checked),{color:(t.vars||t).palette[n.color].main}),Ee({},"&.".concat(uf.disabled),{color:(t.vars||t).palette.action.disabled}))}));var ff=(0,l.jsx)(af,{checked:!0}),pf=(0,l.jsx)(af,{}),hf=e.forwardRef((function(t,n){var o,i,a,s,u=ln({props:t,name:"MuiRadio"}),c=u.checked,d=u.checkedIcon,f=void 0===d?ff:d,p=u.color,h=void 0===p?"primary":p,m=u.icon,v=void 0===m?pf:m,g=u.name,y=u.onChange,x=u.size,b=void 0===x?"medium":x,w=Te(u,cf),S=r({},u,{color:h,size:b}),j=function(e){var t=e.classes,n=e.color;return r({},t,Po({root:["root","color".concat(Eo(n))]},sf,t))}(S),k=e.useContext(Ld),C=c,R=lf(y,k&&k.onChange),T=g;return k&&("undefined"===typeof C&&(a=k.value,C="object"===typeof(s=u.value)&&null!==s?a===s:String(a)===String(s)),"undefined"===typeof T&&(T=k.name)),(0,l.jsx)(df,r({type:"radio",icon:e.cloneElement(v,{fontSize:null!=(o=pf.props.fontSize)?o:b}),checkedIcon:e.cloneElement(f,{fontSize:null!=(i=ff.props.fontSize)?i:b}),ownerState:S,classes:j,name:T,checked:C,onChange:R,ref:n},w))})),mf=hf;function vf(e){return Qo("MuiDialogActions",e)}$o("MuiDialogActions",["root","spacing"]);var gf=["className","disableSpacing"],yf=Yo("div",{name:"MuiDialogActions",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,!n.disableSpacing&&t.spacing]}})((function(e){return r({display:"flex",alignItems:"center",padding:8,justifyContent:"flex-end",flex:"0 0 auto"},!e.ownerState.disableSpacing&&{"& > :not(:first-of-type)":{marginLeft:8}})})),xf=e.forwardRef((function(e,t){var n=ln({props:e,name:"MuiDialogActions"}),o=n.className,i=n.disableSpacing,a=void 0!==i&&i,s=Te(n,gf),u=r({},n,{disableSpacing:a}),c=function(e){var t=e.classes;return Po({root:["root",!e.disableSpacing&&"spacing"]},vf,t)}(u);return(0,l.jsx)(yf,r({className:wn(c.root,o),ownerState:u,ref:t},s))})),bf=xf;function wf(e){return Qo("MuiButton",e)}var Sf=$o("MuiButton",["root","text","textInherit","textPrimary","textSecondary","textSuccess","textError","textInfo","textWarning","outlined","outlinedInherit","outlinedPrimary","outlinedSecondary","outlinedSuccess","outlinedError","outlinedInfo","outlinedWarning","contained","containedInherit","containedPrimary","containedSecondary","containedSuccess","containedError","containedInfo","containedWarning","disableElevation","focusVisible","disabled","colorInherit","textSizeSmall","textSizeMedium","textSizeLarge","outlinedSizeSmall","outlinedSizeMedium","outlinedSizeLarge","containedSizeSmall","containedSizeMedium","containedSizeLarge","sizeMedium","sizeSmall","sizeLarge","fullWidth","startIcon","endIcon","iconSizeSmall","iconSizeMedium","iconSizeLarge"]);var jf=e.createContext({}),kf=["children","color","component","className","disabled","disableElevation","disableFocusRipple","endIcon","focusVisibleClassName","fullWidth","size","startIcon","type","variant"],Cf=function(e){return r({},"small"===e.size&&{"& > *:nth-of-type(1)":{fontSize:18}},"medium"===e.size&&{"& > *:nth-of-type(1)":{fontSize:20}},"large"===e.size&&{"& > *:nth-of-type(1)":{fontSize:22}})},Rf=Yo(Ps,{shouldForwardProp:function(e){return qo(e)||"classes"===e},name:"MuiButton",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,t[n.variant],t["".concat(n.variant).concat(Eo(n.color))],t["size".concat(Eo(n.size))],t["".concat(n.variant,"Size").concat(Eo(n.size))],"inherit"===n.color&&t.colorInherit,n.disableElevation&&t.disableElevation,n.fullWidth&&t.fullWidth]}})((function(e){var t,n,o,i=e.theme,a=e.ownerState;return r({},i.typography.button,(Ee(t={minWidth:64,padding:"6px 16px",borderRadius:(i.vars||i).shape.borderRadius,transition:i.transitions.create(["background-color","box-shadow","border-color","color"],{duration:i.transitions.duration.short}),"&:hover":r({textDecoration:"none",backgroundColor:i.vars?"rgba(".concat(i.vars.palette.text.primaryChannel," / ").concat(i.vars.palette.action.hoverOpacity,")"):Tt(i.palette.text.primary,i.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:"transparent"}},"text"===a.variant&&"inherit"!==a.color&&{backgroundColor:i.vars?"rgba(".concat(i.vars.palette[a.color].mainChannel," / ").concat(i.vars.palette.action.hoverOpacity,")"):Tt(i.palette[a.color].main,i.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:"transparent"}},"outlined"===a.variant&&"inherit"!==a.color&&{border:"1px solid ".concat((i.vars||i).palette[a.color].main),backgroundColor:i.vars?"rgba(".concat(i.vars.palette[a.color].mainChannel," / ").concat(i.vars.palette.action.hoverOpacity,")"):Tt(i.palette[a.color].main,i.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:"transparent"}},"contained"===a.variant&&{backgroundColor:(i.vars||i).palette.grey.A100,boxShadow:(i.vars||i).shadows[4],"@media (hover: none)":{boxShadow:(i.vars||i).shadows[2],backgroundColor:(i.vars||i).palette.grey[300]}},"contained"===a.variant&&"inherit"!==a.color&&{backgroundColor:(i.vars||i).palette[a.color].dark,"@media (hover: none)":{backgroundColor:(i.vars||i).palette[a.color].main}}),"&:active":r({},"contained"===a.variant&&{boxShadow:(i.vars||i).shadows[8]})},"&.".concat(Sf.focusVisible),r({},"contained"===a.variant&&{boxShadow:(i.vars||i).shadows[6]})),Ee(t,"&.".concat(Sf.disabled),r({color:(i.vars||i).palette.action.disabled},"outlined"===a.variant&&{border:"1px solid ".concat((i.vars||i).palette.action.disabledBackground)},"outlined"===a.variant&&"secondary"===a.color&&{border:"1px solid ".concat((i.vars||i).palette.action.disabled)},"contained"===a.variant&&{color:(i.vars||i).palette.action.disabled,boxShadow:(i.vars||i).shadows[0],backgroundColor:(i.vars||i).palette.action.disabledBackground})),t),"text"===a.variant&&{padding:"6px 8px"},"text"===a.variant&&"inherit"!==a.color&&{color:(i.vars||i).palette[a.color].main},"outlined"===a.variant&&{padding:"5px 15px",border:"1px solid currentColor"},"outlined"===a.variant&&"inherit"!==a.color&&{color:(i.vars||i).palette[a.color].main,border:i.vars?"1px solid rgba(".concat(i.vars.palette[a.color].mainChannel," / 0.5)"):"1px solid ".concat(Tt(i.palette[a.color].main,.5))},"contained"===a.variant&&{color:i.vars?i.vars.palette.text.primary:null==(n=(o=i.palette).getContrastText)?void 0:n.call(o,i.palette.grey[300]),backgroundColor:(i.vars||i).palette.grey[300],boxShadow:(i.vars||i).shadows[2]},"contained"===a.variant&&"inherit"!==a.color&&{color:(i.vars||i).palette[a.color].contrastText,backgroundColor:(i.vars||i).palette[a.color].main},"inherit"===a.color&&{color:"inherit",borderColor:"currentColor"},"small"===a.size&&"text"===a.variant&&{padding:"4px 5px",fontSize:i.typography.pxToRem(13)},"large"===a.size&&"text"===a.variant&&{padding:"8px 11px",fontSize:i.typography.pxToRem(15)},"small"===a.size&&"outlined"===a.variant&&{padding:"3px 9px",fontSize:i.typography.pxToRem(13)},"large"===a.size&&"outlined"===a.variant&&{padding:"7px 21px",fontSize:i.typography.pxToRem(15)},"small"===a.size&&"contained"===a.variant&&{padding:"4px 10px",fontSize:i.typography.pxToRem(13)},"large"===a.size&&"contained"===a.variant&&{padding:"8px 22px",fontSize:i.typography.pxToRem(15)},a.fullWidth&&{width:"100%"})}),(function(e){var t;return e.ownerState.disableElevation&&(Ee(t={boxShadow:"none","&:hover":{boxShadow:"none"}},"&.".concat(Sf.focusVisible),{boxShadow:"none"}),Ee(t,"&:active",{boxShadow:"none"}),Ee(t,"&.".concat(Sf.disabled),{boxShadow:"none"}),t)})),Tf=Yo("span",{name:"MuiButton",slot:"StartIcon",overridesResolver:function(e,t){var n=e.ownerState;return[t.startIcon,t["iconSize".concat(Eo(n.size))]]}})((function(e){var t=e.ownerState;return r({display:"inherit",marginRight:8,marginLeft:-4},"small"===t.size&&{marginLeft:-2},Cf(t))})),Of=Yo("span",{name:"MuiButton",slot:"EndIcon",overridesResolver:function(e,t){var n=e.ownerState;return[t.endIcon,t["iconSize".concat(Eo(n.size))]]}})((function(e){var t=e.ownerState;return r({display:"inherit",marginRight:-4,marginLeft:8},"small"===t.size&&{marginRight:-2},Cf(t))})),Pf=e.forwardRef((function(t,n){var o=e.useContext(jf),i=ln({props:bt(o,t),name:"MuiButton"}),a=i.children,s=i.color,u=void 0===s?"primary":s,c=i.component,d=void 0===c?"button":c,f=i.className,p=i.disabled,h=void 0!==p&&p,m=i.disableElevation,v=void 0!==m&&m,g=i.disableFocusRipple,y=void 0!==g&&g,x=i.endIcon,b=i.focusVisibleClassName,w=i.fullWidth,S=void 0!==w&&w,j=i.size,k=void 0===j?"medium":j,C=i.startIcon,R=i.type,T=i.variant,O=void 0===T?"text":T,P=Te(i,kf),E=r({},i,{color:u,component:d,disabled:h,disableElevation:v,disableFocusRipple:y,fullWidth:S,size:k,type:R,variant:O}),M=function(e){var t=e.color,n=e.disableElevation,o=e.fullWidth,i=e.size,a=e.variant,l=e.classes;return r({},l,Po({root:["root",a,"".concat(a).concat(Eo(t)),"size".concat(Eo(i)),"".concat(a,"Size").concat(Eo(i)),"inherit"===t&&"colorInherit",n&&"disableElevation",o&&"fullWidth"],label:["label"],startIcon:["startIcon","iconSize".concat(Eo(i))],endIcon:["endIcon","iconSize".concat(Eo(i))]},wf,l))}(E),_=C&&(0,l.jsx)(Tf,{className:M.startIcon,ownerState:E,children:C}),D=x&&(0,l.jsx)(Of,{className:M.endIcon,ownerState:E,children:x});return(0,l.jsxs)(Rf,r({ownerState:E,className:wn(f,o.className),component:d,disabled:h,focusRipple:!y,focusVisibleClassName:wn(M.focusVisible,b),ref:n,type:R},P,{classes:M,children:[_,a,D]}))})),Ef=Pf;var Mf=function(t,n){return e.isValidElement(t)&&-1!==n.indexOf(t.type.muiName)},_f=Ll;var Df=e.createContext({});function If(e){return Qo("MuiListItem",e)}var Af=$o("MuiListItem",["root","container","focusVisible","dense","alignItemsFlexStart","disabled","divider","gutters","padding","button","secondaryAction","selected"]);var Nf=$o("MuiListItemButton",["root","focusVisible","dense","alignItemsFlexStart","disabled","divider","gutters","selected"]);function Lf(e){return Qo("MuiListItemSecondaryAction",e)}$o("MuiListItemSecondaryAction",["root","disableGutters"]);var zf=["className"],Ff=Yo("div",{name:"MuiListItemSecondaryAction",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,n.disableGutters&&t.disableGutters]}})((function(e){return r({position:"absolute",right:16,top:"50%",transform:"translateY(-50%)"},e.ownerState.disableGutters&&{right:0})})),Wf=e.forwardRef((function(t,n){var o=ln({props:t,name:"MuiListItemSecondaryAction"}),i=o.className,a=Te(o,zf),s=r({},o,{disableGutters:e.useContext(Df).disableGutters}),u=function(e){return Po({root:["root",e.disableGutters&&"disableGutters"]},Lf,e.classes)}(s);return(0,l.jsx)(Ff,r({className:wn(u.root,i),ownerState:s,ref:n},a))}));Wf.muiName="ListItemSecondaryAction";var Bf=Wf,Vf=["className"],qf=["alignItems","autoFocus","button","children","className","component","components","componentsProps","ContainerComponent","ContainerProps","dense","disabled","disableGutters","disablePadding","divider","focusVisibleClassName","secondaryAction","selected"],Hf=Yo("div",{name:"MuiListItem",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,n.dense&&t.dense,"flex-start"===n.alignItems&&t.alignItemsFlexStart,n.divider&&t.divider,!n.disableGutters&&t.gutters,!n.disablePadding&&t.padding,n.button&&t.button,n.hasSecondaryAction&&t.secondaryAction]}})((function(e){var t,n=e.theme,o=e.ownerState;return r({display:"flex",justifyContent:"flex-start",alignItems:"center",position:"relative",textDecoration:"none",width:"100%",boxSizing:"border-box",textAlign:"left"},!o.disablePadding&&r({paddingTop:8,paddingBottom:8},o.dense&&{paddingTop:4,paddingBottom:4},!o.disableGutters&&{paddingLeft:16,paddingRight:16},!!o.secondaryAction&&{paddingRight:48}),!!o.secondaryAction&&Ee({},"& > .".concat(Nf.root),{paddingRight:48}),(Ee(t={},"&.".concat(Af.focusVisible),{backgroundColor:(n.vars||n).palette.action.focus}),Ee(t,"&.".concat(Af.selected),Ee({backgroundColor:n.vars?"rgba(".concat(n.vars.palette.primary.mainChannel," / ").concat(n.vars.palette.action.selectedOpacity,")"):Tt(n.palette.primary.main,n.palette.action.selectedOpacity)},"&.".concat(Af.focusVisible),{backgroundColor:n.vars?"rgba(".concat(n.vars.palette.primary.mainChannel," / calc(").concat(n.vars.palette.action.selectedOpacity," + ").concat(n.vars.palette.action.focusOpacity,"))"):Tt(n.palette.primary.main,n.palette.action.selectedOpacity+n.palette.action.focusOpacity)})),Ee(t,"&.".concat(Af.disabled),{opacity:(n.vars||n).palette.action.disabledOpacity}),t),"flex-start"===o.alignItems&&{alignItems:"flex-start"},o.divider&&{borderBottom:"1px solid ".concat((n.vars||n).palette.divider),backgroundClip:"padding-box"},o.button&&Ee({transition:n.transitions.create("background-color",{duration:n.transitions.duration.shortest}),"&:hover":{textDecoration:"none",backgroundColor:(n.vars||n).palette.action.hover,"@media (hover: none)":{backgroundColor:"transparent"}}},"&.".concat(Af.selected,":hover"),{backgroundColor:n.vars?"rgba(".concat(n.vars.palette.primary.mainChannel," / calc(").concat(n.vars.palette.action.selectedOpacity," + ").concat(n.vars.palette.action.hoverOpacity,"))"):Tt(n.palette.primary.main,n.palette.action.selectedOpacity+n.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:n.vars?"rgba(".concat(n.vars.palette.primary.mainChannel," / ").concat(n.vars.palette.action.selectedOpacity,")"):Tt(n.palette.primary.main,n.palette.action.selectedOpacity)}}),o.hasSecondaryAction&&{paddingRight:48})})),Uf=Yo("li",{name:"MuiListItem",slot:"Container",overridesResolver:function(e,t){return t.container}})({position:"relative"}),Yf=e.forwardRef((function(t,n){var o=ln({props:t,name:"MuiListItem"}),i=o.alignItems,a=void 0===i?"center":i,s=o.autoFocus,u=void 0!==s&&s,c=o.button,d=void 0!==c&&c,f=o.children,p=o.className,h=o.component,m=o.components,v=void 0===m?{}:m,g=o.componentsProps,y=void 0===g?{}:g,x=o.ContainerComponent,b=void 0===x?"li":x,w=o.ContainerProps,S=(w=void 0===w?{}:w).className,j=o.dense,k=void 0!==j&&j,C=o.disabled,R=void 0!==C&&C,T=o.disableGutters,O=void 0!==T&&T,P=o.disablePadding,E=void 0!==P&&P,M=o.divider,_=void 0!==M&&M,D=o.focusVisibleClassName,I=o.secondaryAction,A=o.selected,N=void 0!==A&&A,L=Te(o.ContainerProps,Vf),z=Te(o,qf),F=e.useContext(Df),W={dense:k||F.dense||!1,alignItems:a,disableGutters:O},B=e.useRef(null);_f((function(){u&&B.current&&B.current.focus()}),[u]);var V=e.Children.toArray(f),q=V.length&&Mf(V[V.length-1],["ListItemSecondaryAction"]),H=r({},o,{alignItems:a,autoFocus:u,button:d,dense:W.dense,disabled:R,disableGutters:O,disablePadding:E,divider:_,hasSecondaryAction:q,selected:N}),U=function(e){var t=e.alignItems,n=e.button,r=e.classes,o=e.dense,i=e.disabled;return Po({root:["root",o&&"dense",!e.disableGutters&&"gutters",!e.disablePadding&&"padding",e.divider&&"divider",i&&"disabled",n&&"button","flex-start"===t&&"alignItemsFlexStart",e.hasSecondaryAction&&"secondaryAction",e.selected&&"selected"],container:["container"]},If,r)}(H),Y=Nl(B,n),G=v.Root||Hf,Q=y.root||{},$=r({className:wn(U.root,Q.className,p),disabled:R},z),K=h||"li";return d&&($.component=h||"div",$.focusVisibleClassName=wn(Af.focusVisible,D),K=Ps),q?(K=$.component||h?K:"div","li"===b&&("li"===K?K="div":"li"===$.component&&($.component="div")),(0,l.jsx)(Df.Provider,{value:W,children:(0,l.jsxs)(Uf,r({as:b,className:wn(U.container,S),ref:Y,ownerState:H},L,{children:[(0,l.jsx)(G,r({},Q,!Pu(G)&&{as:K,ownerState:r({},H,Q.ownerState)},$,{children:V})),V.pop()]}))})):(0,l.jsx)(Df.Provider,{value:W,children:(0,l.jsxs)(G,r({},Q,{as:K,ref:Y,ownerState:H},!Pu(G)&&{ownerState:r({},H,Q.ownerState)},$,{children:[V,I&&(0,l.jsx)(Bf,{children:I})]}))})})),Gf=Yf;function Qf(e){return Qo("MuiListItemText",e)}var $f=$o("MuiListItemText",["root","multiline","dense","inset","primary","secondary"]),Kf=["children","className","disableTypography","inset","primary","primaryTypographyProps","secondary","secondaryTypographyProps"],Xf=Yo("div",{name:"MuiListItemText",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[Ee({},"& .".concat($f.primary),t.primary),Ee({},"& .".concat($f.secondary),t.secondary),t.root,n.inset&&t.inset,n.primary&&n.secondary&&t.multiline,n.dense&&t.dense]}})((function(e){var t=e.ownerState;return r({flex:"1 1 auto",minWidth:0,marginTop:4,marginBottom:4},t.primary&&t.secondary&&{marginTop:6,marginBottom:6},t.inset&&{paddingLeft:56})})),Zf=e.forwardRef((function(t,n){var o=ln({props:t,name:"MuiListItemText"}),i=o.children,a=o.className,s=o.disableTypography,u=void 0!==s&&s,c=o.inset,d=void 0!==c&&c,f=o.primary,p=o.primaryTypographyProps,h=o.secondary,m=o.secondaryTypographyProps,v=Te(o,Kf),g=e.useContext(Df).dense,y=null!=f?f:i,x=h,b=r({},o,{disableTypography:u,inset:d,primary:!!y,secondary:!!x,dense:g}),w=function(e){var t=e.classes,n=e.inset,r=e.primary,o=e.secondary;return Po({root:["root",n&&"inset",e.dense&&"dense",r&&o&&"multiline"],primary:["primary"],secondary:["secondary"]},Qf,t)}(b);return null==y||y.type===Wi||u||(y=(0,l.jsx)(Wi,r({variant:g?"body2":"body1",className:w.primary,component:"span",display:"block"},p,{children:y}))),null==x||x.type===Wi||u||(x=(0,l.jsx)(Wi,r({variant:"body2",className:w.secondary,color:"text.secondary",display:"block"},m,{children:x}))),(0,l.jsxs)(Xf,r({className:wn(w.root,a),ownerState:b,ref:n},v,{children:[y,x]}))})),Jf=Zf;function ep(e){return Qo("MuiDivider",e)}var tp=$o("MuiDivider",["root","absolute","fullWidth","inset","middle","flexItem","light","vertical","withChildren","withChildrenVertical","textAlignRight","textAlignLeft","wrapper","wrapperVertical"]),np=["absolute","children","className","component","flexItem","light","orientation","role","textAlign","variant"],rp=Yo("div",{name:"MuiDivider",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,n.absolute&&t.absolute,t[n.variant],n.light&&t.light,"vertical"===n.orientation&&t.vertical,n.flexItem&&t.flexItem,n.children&&t.withChildren,n.children&&"vertical"===n.orientation&&t.withChildrenVertical,"right"===n.textAlign&&"vertical"!==n.orientation&&t.textAlignRight,"left"===n.textAlign&&"vertical"!==n.orientation&&t.textAlignLeft]}})((function(e){var t=e.theme,n=e.ownerState;return r({margin:0,flexShrink:0,borderWidth:0,borderStyle:"solid",borderColor:(t.vars||t).palette.divider,borderBottomWidth:"thin"},n.absolute&&{position:"absolute",bottom:0,left:0,width:"100%"},n.light&&{borderColor:t.vars?"rgba(".concat(t.vars.palette.dividerChannel," / 0.08)"):Tt(t.palette.divider,.08)},"inset"===n.variant&&{marginLeft:72},"middle"===n.variant&&"horizontal"===n.orientation&&{marginLeft:t.spacing(2),marginRight:t.spacing(2)},"middle"===n.variant&&"vertical"===n.orientation&&{marginTop:t.spacing(1),marginBottom:t.spacing(1)},"vertical"===n.orientation&&{height:"100%",borderBottomWidth:0,borderRightWidth:"thin"},n.flexItem&&{alignSelf:"stretch",height:"auto"})}),(function(e){var t=e.theme;return r({},e.ownerState.children&&{display:"flex",whiteSpace:"nowrap",textAlign:"center",border:0,"&::before, &::after":{position:"relative",width:"100%",borderTop:"thin solid ".concat((t.vars||t).palette.divider),top:"50%",content:'""',transform:"translateY(50%)"}})}),(function(e){var t=e.theme,n=e.ownerState;return r({},n.children&&"vertical"===n.orientation&&{flexDirection:"column","&::before, &::after":{height:"100%",top:"0%",left:"50%",borderTop:0,borderLeft:"thin solid ".concat((t.vars||t).palette.divider),transform:"translateX(0%)"}})}),(function(e){var t=e.ownerState;return r({},"right"===t.textAlign&&"vertical"!==t.orientation&&{"&::before":{width:"90%"},"&::after":{width:"10%"}},"left"===t.textAlign&&"vertical"!==t.orientation&&{"&::before":{width:"10%"},"&::after":{width:"90%"}})})),op=Yo("span",{name:"MuiDivider",slot:"Wrapper",overridesResolver:function(e,t){var n=e.ownerState;return[t.wrapper,"vertical"===n.orientation&&t.wrapperVertical]}})((function(e){var t=e.theme,n=e.ownerState;return r({display:"inline-block",paddingLeft:"calc(".concat(t.spacing(1)," * 1.2)"),paddingRight:"calc(".concat(t.spacing(1)," * 1.2)")},"vertical"===n.orientation&&{paddingTop:"calc(".concat(t.spacing(1)," * 1.2)"),paddingBottom:"calc(".concat(t.spacing(1)," * 1.2)")})})),ip=e.forwardRef((function(e,t){var n=ln({props:e,name:"MuiDivider"}),o=n.absolute,i=void 0!==o&&o,a=n.children,s=n.className,u=n.component,c=void 0===u?a?"div":"hr":u,d=n.flexItem,f=void 0!==d&&d,p=n.light,h=void 0!==p&&p,m=n.orientation,v=void 0===m?"horizontal":m,g=n.role,y=void 0===g?"hr"!==c?"separator":void 0:g,x=n.textAlign,b=void 0===x?"center":x,w=n.variant,S=void 0===w?"fullWidth":w,j=Te(n,np),k=r({},n,{absolute:i,component:c,flexItem:f,light:h,orientation:v,role:y,textAlign:b,variant:S}),C=function(e){var t=e.absolute,n=e.children,r=e.classes,o=e.flexItem,i=e.light,a=e.orientation,l=e.textAlign;return Po({root:["root",t&&"absolute",e.variant,i&&"light","vertical"===a&&"vertical",o&&"flexItem",n&&"withChildren",n&&"vertical"===a&&"withChildrenVertical","right"===l&&"vertical"!==a&&"textAlignRight","left"===l&&"vertical"!==a&&"textAlignLeft"],wrapper:["wrapper","vertical"===a&&"wrapperVertical"]},ep,r)}(k);return(0,l.jsx)(rp,r({as:c,className:wn(C.root,s),role:y,ref:t,ownerState:k},j,{children:a?(0,l.jsx)(op,{className:C.wrapper,ownerState:k,children:a}):null}))})),ap=ip,lp=Ml((0,l.jsx)("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"}),"Add");function sp(e){return Qo("MuiList",e)}$o("MuiList",["root","padding","dense","subheader"]);var up=["children","className","component","dense","disablePadding","subheader"],cp=Yo("ul",{name:"MuiList",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,!n.disablePadding&&t.padding,n.dense&&t.dense,n.subheader&&t.subheader]}})((function(e){var t=e.ownerState;return r({listStyle:"none",margin:0,padding:0,position:"relative"},!t.disablePadding&&{paddingTop:8,paddingBottom:8},t.subheader&&{paddingTop:0})})),dp=e.forwardRef((function(t,n){var o=ln({props:t,name:"MuiList"}),i=o.children,a=o.className,s=o.component,u=void 0===s?"ul":s,c=o.dense,d=void 0!==c&&c,f=o.disablePadding,p=void 0!==f&&f,h=o.subheader,m=Te(o,up),v=e.useMemo((function(){return{dense:d}}),[d]),g=r({},o,{component:u,dense:d,disablePadding:p}),y=function(e){var t=e.classes;return Po({root:["root",!e.disablePadding&&"padding",e.dense&&"dense",e.subheader&&"subheader"]},sp,t)}(g);return(0,l.jsx)(Df.Provider,{value:v,children:(0,l.jsxs)(cp,r({as:u,className:wn(y.root,a),ref:n,ownerState:g},m,{children:[h,i]}))})})),fp=dp,pp=Ml((0,l.jsx)("path",{d:"M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z"}),"Cancel");function hp(e){return Qo("MuiChip",e)}var mp=$o("MuiChip",["root","sizeSmall","sizeMedium","colorPrimary","colorSecondary","disabled","clickable","clickableColorPrimary","clickableColorSecondary","deletable","deletableColorPrimary","deletableColorSecondary","outlined","filled","outlinedPrimary","outlinedSecondary","avatar","avatarSmall","avatarMedium","avatarColorPrimary","avatarColorSecondary","icon","iconSmall","iconMedium","iconColorPrimary","iconColorSecondary","label","labelSmall","labelMedium","deleteIcon","deleteIconSmall","deleteIconMedium","deleteIconColorPrimary","deleteIconColorSecondary","deleteIconOutlinedColorPrimary","deleteIconOutlinedColorSecondary","focusVisible"]),vp=["avatar","className","clickable","color","component","deleteIcon","disabled","icon","label","onClick","onDelete","onKeyDown","onKeyUp","size","variant"],gp=Yo("div",{name:"MuiChip",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState,r=n.color,o=n.clickable,i=n.onDelete,a=n.size,l=n.variant;return[Ee({},"& .".concat(mp.avatar),t.avatar),Ee({},"& .".concat(mp.avatar),t["avatar".concat(Eo(a))]),Ee({},"& .".concat(mp.avatar),t["avatarColor".concat(Eo(r))]),Ee({},"& .".concat(mp.icon),t.icon),Ee({},"& .".concat(mp.icon),t["icon".concat(Eo(a))]),Ee({},"& .".concat(mp.icon),t["iconColor".concat(Eo(r))]),Ee({},"& .".concat(mp.deleteIcon),t.deleteIcon),Ee({},"& .".concat(mp.deleteIcon),t["deleteIcon".concat(Eo(a))]),Ee({},"& .".concat(mp.deleteIcon),t["deleteIconColor".concat(Eo(r))]),Ee({},"& .".concat(mp.deleteIcon),t["deleteIconOutlinedColor".concat(Eo(r))]),t.root,t["size".concat(Eo(a))],t["color".concat(Eo(r))],o&&t.clickable,o&&"default"!==r&&t["clickableColor".concat(Eo(r),")")],i&&t.deletable,i&&"default"!==r&&t["deletableColor".concat(Eo(r))],t[l],"outlined"===l&&t["outlined".concat(Eo(r))]]}})((function(e){var t,n=e.theme,o=e.ownerState,i=Tt(n.palette.text.primary,.26),a="light"===n.palette.mode?n.palette.grey[700]:n.palette.grey[300];return r((Ee(t={maxWidth:"100%",fontFamily:n.typography.fontFamily,fontSize:n.typography.pxToRem(13),display:"inline-flex",alignItems:"center",justifyContent:"center",height:32,color:(n.vars||n).palette.text.primary,backgroundColor:(n.vars||n).palette.action.selected,borderRadius:16,whiteSpace:"nowrap",transition:n.transitions.create(["background-color","box-shadow"]),cursor:"default",outline:0,textDecoration:"none",border:0,padding:0,verticalAlign:"middle",boxSizing:"border-box"},"&.".concat(mp.disabled),{opacity:(n.vars||n).palette.action.disabledOpacity,pointerEvents:"none"}),Ee(t,"& .".concat(mp.avatar),{marginLeft:5,marginRight:-6,width:24,height:24,color:n.vars?n.vars.palette.Chip.defaultAvatarColor:a,fontSize:n.typography.pxToRem(12)}),Ee(t,"& .".concat(mp.avatarColorPrimary),{color:(n.vars||n).palette.primary.contrastText,backgroundColor:(n.vars||n).palette.primary.dark}),Ee(t,"& .".concat(mp.avatarColorSecondary),{color:(n.vars||n).palette.secondary.contrastText,backgroundColor:(n.vars||n).palette.secondary.dark}),Ee(t,"& .".concat(mp.avatarSmall),{marginLeft:4,marginRight:-4,width:18,height:18,fontSize:n.typography.pxToRem(10)}),Ee(t,"& .".concat(mp.icon),r({color:n.vars?n.vars.palette.Chip.defaultIconColor:a,marginLeft:5,marginRight:-6},"small"===o.size&&{fontSize:18,marginLeft:4,marginRight:-4},"default"!==o.color&&{color:"inherit"})),Ee(t,"& .".concat(mp.deleteIcon),r({WebkitTapHighlightColor:"transparent",color:n.vars?"rgba(".concat(n.vars.palette.text.primaryChannel," / 0.26)"):i,fontSize:22,cursor:"pointer",margin:"0 5px 0 -6px","&:hover":{color:n.vars?"rgba(".concat(n.vars.palette.text.primaryChannel," / 0.4)"):Tt(i,.4)}},"small"===o.size&&{fontSize:16,marginRight:4,marginLeft:-4},"default"!==o.color&&{color:n.vars?"rgba(".concat(n.vars.palette[o.color].contrastTextChannel," / 0.7)"):Tt(n.palette[o.color].contrastText,.7),"&:hover, &:active":{color:(n.vars||n).palette[o.color].contrastText}})),t),"small"===o.size&&{height:24},"default"!==o.color&&{backgroundColor:(n.vars||n).palette[o.color].main,color:(n.vars||n).palette[o.color].contrastText},o.onDelete&&Ee({},"&.".concat(mp.focusVisible),{backgroundColor:n.vars?"rgba(".concat(n.vars.palette.action.selectedChannel," / calc(").concat(n.vars.palette.action.selectedOpacity+n.vars.palette.action.focusOpacity,"))"):Tt(n.palette.action.selected,n.palette.action.selectedOpacity+n.palette.action.focusOpacity)}),o.onDelete&&"default"!==o.color&&Ee({},"&.".concat(mp.focusVisible),{backgroundColor:(n.vars||n).palette[o.color].dark}))}),(function(e){var t,n=e.theme,o=e.ownerState;return r({},o.clickable&&(Ee(t={userSelect:"none",WebkitTapHighlightColor:"transparent",cursor:"pointer","&:hover":{backgroundColor:n.vars?"rgba(".concat(n.vars.palette.action.selectedChannel," / calc(").concat(n.vars.palette.action.selectedOpacity+n.vars.palette.action.hoverOpacity,"))"):Tt(n.palette.action.selected,n.palette.action.selectedOpacity+n.palette.action.hoverOpacity)}},"&.".concat(mp.focusVisible),{backgroundColor:n.vars?"rgba(".concat(n.vars.palette.action.selectedChannel," / calc(").concat(n.vars.palette.action.selectedOpacity+n.vars.palette.action.focusOpacity,"))"):Tt(n.palette.action.selected,n.palette.action.selectedOpacity+n.palette.action.focusOpacity)}),Ee(t,"&:active",{boxShadow:(n.vars||n).shadows[1]}),t),o.clickable&&"default"!==o.color&&Ee({},"&:hover, &.".concat(mp.focusVisible),{backgroundColor:(n.vars||n).palette[o.color].dark}))}),(function(e){var t,n,o=e.theme,i=e.ownerState;return r({},"outlined"===i.variant&&(Ee(t={backgroundColor:"transparent",border:o.vars?"1px solid ".concat(o.vars.palette.Chip.defaultBorder):"1px solid ".concat("light"===o.palette.mode?o.palette.grey[400]:o.palette.grey[700])},"&.".concat(mp.clickable,":hover"),{backgroundColor:(o.vars||o).palette.action.hover}),Ee(t,"&.".concat(mp.focusVisible),{backgroundColor:(o.vars||o).palette.action.focus}),Ee(t,"& .".concat(mp.avatar),{marginLeft:4}),Ee(t,"& .".concat(mp.avatarSmall),{marginLeft:2}),Ee(t,"& .".concat(mp.icon),{marginLeft:4}),Ee(t,"& .".concat(mp.iconSmall),{marginLeft:2}),Ee(t,"& .".concat(mp.deleteIcon),{marginRight:5}),Ee(t,"& .".concat(mp.deleteIconSmall),{marginRight:3}),t),"outlined"===i.variant&&"default"!==i.color&&(Ee(n={color:(o.vars||o).palette[i.color].main,border:"1px solid ".concat(o.vars?"rgba(".concat(o.vars.palette[i.color].mainChannel," / 0.7)"):Tt(o.palette[i.color].main,.7))},"&.".concat(mp.clickable,":hover"),{backgroundColor:o.vars?"rgba(".concat(o.vars.palette[i.color].mainChannel," / ").concat(o.vars.palette.action.hoverOpacity,")"):Tt(o.palette[i.color].main,o.palette.action.hoverOpacity)}),Ee(n,"&.".concat(mp.focusVisible),{backgroundColor:o.vars?"rgba(".concat(o.vars.palette[i.color].mainChannel," / ").concat(o.vars.palette.action.focusOpacity,")"):Tt(o.palette[i.color].main,o.palette.action.focusOpacity)}),Ee(n,"& .".concat(mp.deleteIcon),{color:o.vars?"rgba(".concat(o.vars.palette[i.color].mainChannel," / 0.7)"):Tt(o.palette[i.color].main,.7),"&:hover, &:active":{color:(o.vars||o).palette[i.color].main}}),n))})),yp=Yo("span",{name:"MuiChip",slot:"Label",overridesResolver:function(e,t){var n=e.ownerState.size;return[t.label,t["label".concat(Eo(n))]]}})((function(e){return r({overflow:"hidden",textOverflow:"ellipsis",paddingLeft:12,paddingRight:12,whiteSpace:"nowrap"},"small"===e.ownerState.size&&{paddingLeft:8,paddingRight:8})}));function xp(e){return"Backspace"===e.key||"Delete"===e.key}var bp=e.forwardRef((function(t,n){var o=ln({props:t,name:"MuiChip"}),i=o.avatar,a=o.className,s=o.clickable,u=o.color,c=void 0===u?"default":u,d=o.component,f=o.deleteIcon,p=o.disabled,h=void 0!==p&&p,m=o.icon,v=o.label,g=o.onClick,y=o.onDelete,x=o.onKeyDown,b=o.onKeyUp,w=o.size,S=void 0===w?"medium":w,j=o.variant,k=void 0===j?"filled":j,C=Te(o,vp),R=e.useRef(null),T=Nl(R,n),O=function(e){e.stopPropagation(),y&&y(e)},P=!(!1===s||!g)||s,E="small"===S,M=P||y?Ps:d||"div",_=r({},o,{component:M,disabled:h,size:S,color:c,onDelete:!!y,clickable:P,variant:k}),D=function(e){var t=e.classes,n=e.disabled,r=e.size,o=e.color,i=e.onDelete,a=e.clickable,l=e.variant;return Po({root:["root",l,n&&"disabled","size".concat(Eo(r)),"color".concat(Eo(o)),a&&"clickable",a&&"clickableColor".concat(Eo(o)),i&&"deletable",i&&"deletableColor".concat(Eo(o)),"".concat(l).concat(Eo(o))],label:["label","label".concat(Eo(r))],avatar:["avatar","avatar".concat(Eo(r)),"avatarColor".concat(Eo(o))],icon:["icon","icon".concat(Eo(r)),"iconColor".concat(Eo(o))],deleteIcon:["deleteIcon","deleteIcon".concat(Eo(r)),"deleteIconColor".concat(Eo(o)),"deleteIconOutlinedColor".concat(Eo(o))]},hp,t)}(_),I=M===Ps?r({component:d||"div",focusVisibleClassName:D.focusVisible},y&&{disableRipple:!0}):{},A=null;if(y){var N=wn("default"!==c&&("outlined"===k?D["deleteIconOutlinedColor".concat(Eo(c))]:D["deleteIconColor".concat(Eo(c))]),E&&D.deleteIconSmall);A=f&&e.isValidElement(f)?e.cloneElement(f,{className:wn(f.props.className,D.deleteIcon,N),onClick:O}):(0,l.jsx)(pp,{className:wn(D.deleteIcon,N),onClick:O})}var L=null;i&&e.isValidElement(i)&&(L=e.cloneElement(i,{className:wn(D.avatar,i.props.className)}));var z=null;return m&&e.isValidElement(m)&&(z=e.cloneElement(m,{className:wn(D.icon,m.props.className)})),(0,l.jsxs)(gp,r({as:M,className:wn(D.root,a),disabled:!(!P||!h)||void 0,onClick:g,onKeyDown:function(e){e.currentTarget===e.target&&xp(e)&&e.preventDefault(),x&&x(e)},onKeyUp:function(e){e.currentTarget===e.target&&(y&&xp(e)?y(e):"Escape"===e.key&&R.current&&R.current.blur()),b&&b(e)},ref:T,ownerState:_},I,C,{children:[L||z,(0,l.jsx)(yp,{className:wn(D.label),ownerState:_,children:v}),A]}))})),wp=bp,Sp=n(2426),jp=n.n(Sp),kp=function(){var t=Ne((0,e.useState)([]),2),n=t[0],r=t[1],o=Ne((0,e.useState)(!1),2),i=o[0],a=o[1],s=Ne((0,e.useState)(""),2),u=s[0],c=s[1];(0,e.useEffect)((function(){Ki.get("/requests/").then((function(e){return e.data})).then((function(e){return r(e)}))}),[]);var d=po();var f=function(){a(!1),c("")},p=[{value:"TB",label:"Xpert MTB/RIF Ultra assay"},{value:"TB",label:"Xpert MTB/XDR assay"},{value:"EID",label:"Xpert HIV-1 Qual XC (EID) assay"},{value:"ViralLoad",label:"Xpert HIV-1 Viral Load assay"}];return(0,l.jsxs)(Ir,{display:"flex",flexDirection:"column",bgcolor:"#121212cc",flexGrow:1,overflow:"auto",children:[(0,l.jsx)(nd,{sx:{margin:0,top:"auto",right:20,bottom:20,left:"auto",position:"fixed"},onClick:function(){a(!0)},size:"large",children:(0,l.jsx)(lp,{})}),(0,l.jsxs)(md,{open:i,onClose:f,children:[(0,l.jsx)(wd,{children:"Select Assay Type"}),(0,l.jsx)(Rd,{children:(0,l.jsx)(Bd,{value:u,onChange:function(e){return c(e.target.value)},children:p.map((function(e){return(0,l.jsx)(Gd,{value:e.label,control:(0,l.jsx)(mf,{}),label:e.label},e.label)}))})}),(0,l.jsxs)(bf,{children:[(0,l.jsx)(Ef,{onClick:f,children:"Cancel"}),(0,l.jsx)(Ef,{onClick:function(){return function(e){var t=p.find((function(t){return t.label===e}));t&&(a(!1),d("/requests/create",{state:{diagnosisType:t.value}}))}(u)},disabled:!u,children:"Continue"})]})]}),0===n.length?(0,l.jsx)(Ir,{display:"flex",flexGrow:1,alignItems:"center",justifyContent:"center",children:(0,l.jsx)(Wi,{variant:"h5",children:"No Requests Available"})}):(0,l.jsx)(fp,{children:n.map((function(e){var t;return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(Gf,{onClick:function(){return t=e.sampleId,void d("/requests/".concat(t,"/show"));var t},children:(0,l.jsxs)(Jf,{children:[(0,l.jsxs)(Ir,{display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center",children:[(0,l.jsx)(Ci,{container:!0,spacing:1,children:[e.testType,e.sampleId,e.mrn].filter((function(e){return e})).map((function(e,t){return(0,l.jsx)(Ci,{item:!0,children:(0,l.jsx)(wp,{size:"small",label:e})},t)}))}),(0,l.jsx)(wp,{size:"small",label:jp()(e.createdAt).fromNow()})]}),"Patient"===e.testType?(0,l.jsx)(l.Fragment,{children:(0,l.jsxs)(Ir,{paddingTop:2,display:"flex",justifyContent:"space-between",alignItems:"center",children:[(0,l.jsx)(Wi,{variant:"body1",children:e.name}),(0,l.jsxs)(Wi,{variant:"caption",children:[null===(t=e.gender)||void 0===t?void 0:t.toUpperCase()," ",e.age]})]})}):null]})}),(0,l.jsx)(ap,{variant:"fullWidth",component:"li"})]})}))})]})};function Cp(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Rp(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Cp(Object(n),!0).forEach((function(t){Ee(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Cp(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function Tp(e){return null!=e&&!(Array.isArray(e)&&0===e.length)}function Op(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return e&&(Tp(e.value)&&""!==e.value||t&&Tp(e.defaultValue)&&""!==e.defaultValue)}function Pp(e){return Qo("MuiFormControl",e)}$o("MuiFormControl",["root","marginNone","marginNormal","marginDense","fullWidth","disabled"]);var Ep=["children","className","color","component","disabled","error","focused","fullWidth","hiddenLabel","margin","required","size","variant"],Mp=Yo("div",{name:"MuiFormControl",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return r({},t.root,t["margin".concat(Eo(n.margin))],n.fullWidth&&t.fullWidth)}})((function(e){var t=e.ownerState;return r({display:"inline-flex",flexDirection:"column",position:"relative",minWidth:0,padding:0,margin:0,border:0,verticalAlign:"top"},"normal"===t.margin&&{marginTop:16,marginBottom:8},"dense"===t.margin&&{marginTop:8,marginBottom:4},t.fullWidth&&{width:"100%"})})),_p=e.forwardRef((function(t,n){var o=ln({props:t,name:"MuiFormControl"}),i=o.children,a=o.className,s=o.color,u=void 0===s?"primary":s,c=o.component,d=void 0===c?"div":c,f=o.disabled,p=void 0!==f&&f,h=o.error,m=void 0!==h&&h,v=o.focused,g=o.fullWidth,y=void 0!==g&&g,x=o.hiddenLabel,b=void 0!==x&&x,w=o.margin,S=void 0===w?"none":w,j=o.required,k=void 0!==j&&j,C=o.size,R=void 0===C?"medium":C,T=o.variant,O=void 0===T?"outlined":T,P=Te(o,Ep),E=r({},o,{color:u,component:d,disabled:p,error:m,fullWidth:y,hiddenLabel:b,margin:S,required:k,size:R,variant:O}),M=function(e){var t=e.classes,n=e.margin,r=e.fullWidth;return Po({root:["root","none"!==n&&"margin".concat(Eo(n)),r&&"fullWidth"]},Pp,t)}(E),_=Ne(e.useState((function(){var t=!1;return i&&e.Children.forEach(i,(function(e){if(Mf(e,["Input","Select"])){var n=Mf(e,["Select"])?e.props.input:e;n&&n.props.startAdornment&&(t=!0)}})),t})),2),D=_[0],I=_[1],A=Ne(e.useState((function(){var t=!1;return i&&e.Children.forEach(i,(function(e){Mf(e,["Input","Select"])&&Op(e.props,!0)&&(t=!0)})),t})),2),N=A[0],L=A[1],z=Ne(e.useState(!1),2),F=z[0],W=z[1];p&&F&&W(!1);var B=void 0===v||p?F:v,V=e.useCallback((function(){L(!0)}),[]),q={adornedStart:D,setAdornedStart:I,color:u,disabled:p,error:m,filled:N,focused:B,fullWidth:y,hiddenLabel:b,size:R,onBlur:function(){W(!1)},onEmpty:e.useCallback((function(){L(!1)}),[]),onFilled:V,onFocus:function(){W(!0)},registerEffect:undefined,required:k,variant:O};return(0,l.jsx)(Od.Provider,{value:q,children:(0,l.jsx)(Mp,r({as:d,ownerState:E,className:wn(M.root,a),ref:n},P,{children:i}))})})),Dp=_p;function Ip(e){return Qo("MuiFormLabel",e)}var Ap=$o("MuiFormLabel",["root","colorSecondary","focused","disabled","error","filled","required","asterisk"]),Np=["children","className","color","component","disabled","error","filled","focused","required"],Lp=Yo("label",{name:"MuiFormLabel",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return r({},t.root,"secondary"===n.color&&t.colorSecondary,n.filled&&t.filled)}})((function(e){var t,n=e.theme,o=e.ownerState;return r({color:(n.vars||n).palette.text.secondary},n.typography.body1,(Ee(t={lineHeight:"1.4375em",padding:0,position:"relative"},"&.".concat(Ap.focused),{color:(n.vars||n).palette[o.color].main}),Ee(t,"&.".concat(Ap.disabled),{color:(n.vars||n).palette.text.disabled}),Ee(t,"&.".concat(Ap.error),{color:(n.vars||n).palette.error.main}),t))})),zp=Yo("span",{name:"MuiFormLabel",slot:"Asterisk",overridesResolver:function(e,t){return t.asterisk}})((function(e){var t=e.theme;return Ee({},"&.".concat(Ap.error),{color:(t.vars||t).palette.error.main})})),Fp=e.forwardRef((function(e,t){var n=ln({props:e,name:"MuiFormLabel"}),o=n.children,i=n.className,a=n.component,s=void 0===a?"label":a,u=Te(n,Np),c=Ed({props:n,muiFormControl:Pd(),states:["color","required","focused","disabled","error","filled"]}),d=r({},n,{color:c.color||"primary",component:s,disabled:c.disabled,error:c.error,filled:c.filled,focused:c.focused,required:c.required}),f=function(e){var t=e.classes,n=e.color,r=e.focused,o=e.disabled,i=e.error,a=e.filled,l=e.required;return Po({root:["root","color".concat(Eo(n)),o&&"disabled",i&&"error",a&&"filled",r&&"focused",l&&"required"],asterisk:["asterisk",i&&"error"]},Ip,t)}(d);return(0,l.jsxs)(Lp,r({as:s,ownerState:d,className:wn(f.root,i),ref:t},u,{children:[o,c.required&&(0,l.jsxs)(zp,{ownerState:d,"aria-hidden":!0,className:f.asterisk,children:["\u2009","*"]})]}))})),Wp=Fp;function Bp(e){return Qo("MuiInputLabel",e)}$o("MuiInputLabel",["root","focused","disabled","error","required","asterisk","formControl","sizeSmall","shrink","animated","standard","filled","outlined"]);var Vp=["disableAnimation","margin","shrink","variant"],qp=Yo(Wp,{shouldForwardProp:function(e){return qo(e)||"classes"===e},name:"MuiInputLabel",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[Ee({},"& .".concat(Ap.asterisk),t.asterisk),t.root,n.formControl&&t.formControl,"small"===n.size&&t.sizeSmall,n.shrink&&t.shrink,!n.disableAnimation&&t.animated,t[n.variant]]}})((function(e){var t=e.theme,n=e.ownerState;return r({display:"block",transformOrigin:"top left",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis",maxWidth:"100%"},n.formControl&&{position:"absolute",left:0,top:0,transform:"translate(0, 20px) scale(1)"},"small"===n.size&&{transform:"translate(0, 17px) scale(1)"},n.shrink&&{transform:"translate(0, -1.5px) scale(0.75)",transformOrigin:"top left",maxWidth:"133%"},!n.disableAnimation&&{transition:t.transitions.create(["color","transform","max-width"],{duration:t.transitions.duration.shorter,easing:t.transitions.easing.easeOut})},"filled"===n.variant&&r({zIndex:1,pointerEvents:"none",transform:"translate(12px, 16px) scale(1)",maxWidth:"calc(100% - 24px)"},"small"===n.size&&{transform:"translate(12px, 13px) scale(1)"},n.shrink&&r({userSelect:"none",pointerEvents:"auto",transform:"translate(12px, 7px) scale(0.75)",maxWidth:"calc(133% - 24px)"},"small"===n.size&&{transform:"translate(12px, 4px) scale(0.75)"})),"outlined"===n.variant&&r({zIndex:1,pointerEvents:"none",transform:"translate(14px, 16px) scale(1)",maxWidth:"calc(100% - 24px)"},"small"===n.size&&{transform:"translate(14px, 9px) scale(1)"},n.shrink&&{userSelect:"none",pointerEvents:"auto",maxWidth:"calc(133% - 24px)",transform:"translate(14px, -9px) scale(0.75)"}))})),Hp=e.forwardRef((function(e,t){var n=ln({name:"MuiInputLabel",props:e}),o=n.disableAnimation,i=void 0!==o&&o,a=n.shrink,s=Te(n,Vp),u=Pd(),c=a;"undefined"===typeof c&&u&&(c=u.filled||u.focused||u.adornedStart);var d=Ed({props:n,muiFormControl:u,states:["size","variant","required"]}),f=r({},n,{disableAnimation:i,formControl:u,shrink:c,size:d.size,variant:d.variant,required:d.required}),p=function(e){var t=e.classes,n=e.formControl,o=e.size,i=e.shrink;return r({},t,Po({root:["root",n&&"formControl",!e.disableAnimation&&"animated",i&&"shrink","small"===o&&"sizeSmall",e.variant],asterisk:[e.required&&"asterisk"]},Bp,t))}(f);return(0,l.jsx)(qp,r({"data-shrink":c,ownerState:f,ref:t},s,{classes:p}))})),Up=Hp,Yp=vu,Gp=["actions","autoFocus","autoFocusItem","children","className","disabledItemsFocusable","disableListWrap","onKeyDown","variant"];function Qp(e,t,n){return e===t?e.firstChild:t&&t.nextElementSibling?t.nextElementSibling:n?null:e.firstChild}function $p(e,t,n){return e===t?n?e.firstChild:e.lastChild:t&&t.previousElementSibling?t.previousElementSibling:n?null:e.lastChild}function Kp(e,t){if(void 0===t)return!0;var n=e.innerText;return void 0===n&&(n=e.textContent),0!==(n=n.trim().toLowerCase()).length&&(t.repeating?n[0]===t.keys[0]:0===n.indexOf(t.keys.join("")))}function Xp(e,t,n,r,o,i){for(var a=!1,l=o(e,t,!!t&&n);l;){if(l===e.firstChild){if(a)return!1;a=!0}var s=!r&&(l.disabled||"true"===l.getAttribute("aria-disabled"));if(l.hasAttribute("tabindex")&&Kp(l,i)&&!s)return l.focus(),!0;l=o(e,l,n)}return!1}var Zp=e.forwardRef((function(t,n){var o=t.actions,i=t.autoFocus,a=void 0!==i&&i,s=t.autoFocusItem,u=void 0!==s&&s,c=t.children,d=t.className,f=t.disabledItemsFocusable,p=void 0!==f&&f,h=t.disableListWrap,m=void 0!==h&&h,v=t.onKeyDown,g=t.variant,y=void 0===g?"selectedMenu":g,x=Te(t,Gp),b=e.useRef(null),w=e.useRef({keys:[],repeating:!0,previousKeyMatched:!0,lastTime:null});_f((function(){a&&b.current.focus()}),[a]),e.useImperativeHandle(o,(function(){return{adjustStyleForScrollbar:function(e,t){var n=!b.current.style.width;if(e.clientHeight<b.current.clientHeight&&n){var r="".concat(Yp(Ws(e)),"px");b.current.style["rtl"===t.direction?"paddingLeft":"paddingRight"]=r,b.current.style.width="calc(100% + ".concat(r,")")}return b.current}}}),[]);var S=Nl(b,n),j=-1;e.Children.forEach(c,(function(t,n){e.isValidElement(t)&&(t.props.disabled||("selectedMenu"===y&&t.props.selected||-1===j)&&(j=n))}));var k=e.Children.map(c,(function(t,n){if(n===j){var r={};return u&&(r.autoFocus=!0),void 0===t.props.tabIndex&&"selectedMenu"===y&&(r.tabIndex=0),e.cloneElement(t,r)}return t}));return(0,l.jsx)(fp,r({role:"menu",ref:S,className:d,onKeyDown:function(e){var t=b.current,n=e.key,r=Ws(t).activeElement;if("ArrowDown"===n)e.preventDefault(),Xp(t,r,m,p,Qp);else if("ArrowUp"===n)e.preventDefault(),Xp(t,r,m,p,$p);else if("Home"===n)e.preventDefault(),Xp(t,null,m,p,Qp);else if("End"===n)e.preventDefault(),Xp(t,null,m,p,$p);else if(1===n.length){var o=w.current,i=n.toLowerCase(),a=performance.now();o.keys.length>0&&(a-o.lastTime>500?(o.keys=[],o.repeating=!0,o.previousKeyMatched=!0):o.repeating&&i!==o.keys[0]&&(o.repeating=!1)),o.lastTime=a,o.keys.push(i);var l=r&&!o.repeating&&Kp(r,o);o.previousKeyMatched&&(l||Xp(t,r,!1,p,Qp,o))?e.preventDefault():o.previousKeyMatched=!1}v&&v(e)},tabIndex:a?0:-1},x,{children:k}))})),Jp=Zp,eh=["addEndListener","appear","children","easing","in","onEnter","onEntered","onEntering","onExit","onExited","onExiting","style","timeout","TransitionComponent"];function th(e){return"scale(".concat(e,", ").concat(Math.pow(e,2),")")}var nh={entering:{opacity:1,transform:th(1)},entered:{opacity:1,transform:"none"}},rh="undefined"!==typeof navigator&&/^((?!chrome|android).)*(safari|mobile)/i.test(navigator.userAgent)&&/(os |version\/)15(.|_)4/i.test(navigator.userAgent),oh=e.forwardRef((function(t,n){var o=t.addEndListener,i=t.appear,a=void 0===i||i,s=t.children,u=t.easing,c=t.in,d=t.onEnter,f=t.onEntered,p=t.onEntering,h=t.onExit,m=t.onExited,v=t.onExiting,g=t.style,y=t.timeout,x=void 0===y?"auto":y,b=t.TransitionComponent,w=void 0===b?Qu:b,S=Te(t,eh),j=e.useRef(),k=e.useRef(),C=hi(),R=e.useRef(null),T=Nl(s.ref,n),O=Nl(R,T),P=function(e){return function(t){if(e){var n=R.current;void 0===t?e(n):e(n,t)}}},E=P(p),M=P((function(e,t){$u(e);var n,r=Ku({style:g,timeout:x,easing:u},{mode:"enter"}),o=r.duration,i=r.delay,a=r.easing;"auto"===x?(n=C.transitions.getAutoHeightDuration(e.clientHeight),k.current=n):n=o,e.style.transition=[C.transitions.create("opacity",{duration:n,delay:i}),C.transitions.create("transform",{duration:rh?n:.666*n,delay:i,easing:a})].join(","),d&&d(e,t)})),_=P(f),D=P(v),I=P((function(e){var t,n=Ku({style:g,timeout:x,easing:u},{mode:"exit"}),r=n.duration,o=n.delay,i=n.easing;"auto"===x?(t=C.transitions.getAutoHeightDuration(e.clientHeight),k.current=t):t=r,e.style.transition=[C.transitions.create("opacity",{duration:t,delay:o}),C.transitions.create("transform",{duration:rh?t:.666*t,delay:rh?o:o||.333*t,easing:i})].join(","),e.style.opacity=0,e.style.transform=th(.75),h&&h(e)})),A=P(m);return e.useEffect((function(){return function(){clearTimeout(j.current)}}),[]),(0,l.jsx)(w,r({appear:a,in:c,nodeRef:R,onEnter:M,onEntered:_,onEntering:E,onExit:I,onExited:A,onExiting:D,addEndListener:function(e){"auto"===x&&(j.current=setTimeout(e,k.current||0)),o&&o(R.current,e)},timeout:"auto"===x?null:x},S,{children:function(t,n){return e.cloneElement(s,r({style:r({opacity:0,transform:th(.75),visibility:"exited"!==t||c?void 0:"hidden"},nh[t],g,s.props.style),ref:O},n))}}))}));oh.muiSupportAuto=!0;var ih=oh;function ah(e){return Qo("MuiPopover",e)}$o("MuiPopover",["root","paper"]);var lh=["onEntering"],sh=["action","anchorEl","anchorOrigin","anchorPosition","anchorReference","children","className","container","elevation","marginThreshold","open","PaperProps","transformOrigin","TransitionComponent","transitionDuration","TransitionProps"];function uh(e,t){var n=0;return"number"===typeof t?n=t:"center"===t?n=e.height/2:"bottom"===t&&(n=e.height),n}function ch(e,t){var n=0;return"number"===typeof t?n=t:"center"===t?n=e.width/2:"right"===t&&(n=e.width),n}function dh(e){return[e.horizontal,e.vertical].map((function(e){return"number"===typeof e?"".concat(e,"px"):e})).join(" ")}function fh(e){return"function"===typeof e?e():e}var ph=Yo(cc,{name:"MuiPopover",slot:"Root",overridesResolver:function(e,t){return t.root}})({}),hh=Yo(Di,{name:"MuiPopover",slot:"Paper",overridesResolver:function(e,t){return t.paper}})({position:"absolute",overflowY:"auto",overflowX:"hidden",minWidth:16,minHeight:16,maxWidth:"calc(100% - 32px)",maxHeight:"calc(100% - 32px)",outline:0}),mh=e.forwardRef((function(t,n){var o=ln({props:t,name:"MuiPopover"}),i=o.action,a=o.anchorEl,s=o.anchorOrigin,u=void 0===s?{vertical:"top",horizontal:"left"}:s,c=o.anchorPosition,d=o.anchorReference,f=void 0===d?"anchorEl":d,p=o.children,h=o.className,m=o.container,v=o.elevation,g=void 0===v?8:v,y=o.marginThreshold,x=void 0===y?16:y,b=o.open,w=o.PaperProps,S=void 0===w?{}:w,j=o.transformOrigin,k=void 0===j?{vertical:"top",horizontal:"left"}:j,C=o.TransitionComponent,R=void 0===C?ih:C,T=o.transitionDuration,O=void 0===T?"auto":T,P=o.TransitionProps,E=(P=void 0===P?{}:P).onEntering,M=Te(o.TransitionProps,lh),_=Te(o,sh),D=e.useRef(),I=Nl(D,S.ref),A=r({},o,{anchorOrigin:u,anchorReference:f,elevation:g,marginThreshold:x,PaperProps:S,transformOrigin:k,TransitionComponent:R,transitionDuration:O,TransitionProps:M}),N=function(e){return Po({root:["root"],paper:["paper"]},ah,e.classes)}(A),L=e.useCallback((function(){if("anchorPosition"===f)return c;var e=fh(a),t=(e&&1===e.nodeType?e:Ws(D.current).body).getBoundingClientRect();return{top:t.top+uh(t,u.vertical),left:t.left+ch(t,u.horizontal)}}),[a,u.horizontal,u.vertical,c,f]),z=e.useCallback((function(e){return{vertical:uh(e,k.vertical),horizontal:ch(e,k.horizontal)}}),[k.horizontal,k.vertical]),F=e.useCallback((function(e){var t={width:e.offsetWidth,height:e.offsetHeight},n=z(t);if("none"===f)return{top:null,left:null,transformOrigin:dh(n)};var r=L(),o=r.top-n.vertical,i=r.left-n.horizontal,l=o+t.height,s=i+t.width,u=jl(fh(a)),c=u.innerHeight-x,d=u.innerWidth-x;if(o<x){var p=o-x;o-=p,n.vertical+=p}else if(l>c){var h=l-c;o-=h,n.vertical+=h}if(i<x){var m=i-x;i-=m,n.horizontal+=m}else if(s>d){var v=s-d;i-=v,n.horizontal+=v}return{top:"".concat(Math.round(o),"px"),left:"".concat(Math.round(i),"px"),transformOrigin:dh(n)}}),[a,f,L,z,x]),W=e.useCallback((function(){var e=D.current;if(e){var t=F(e);null!==t.top&&(e.style.top=t.top),null!==t.left&&(e.style.left=t.left),e.style.transformOrigin=t.transformOrigin}}),[F]);e.useEffect((function(){b&&W()})),e.useImperativeHandle(i,(function(){return b?{updatePosition:function(){W()}}:null}),[b,W]),e.useEffect((function(){if(b){var e=vl((function(){W()})),t=jl(a);return t.addEventListener("resize",e),function(){e.clear(),t.removeEventListener("resize",e)}}}),[a,b,W]);var B=O;"auto"!==O||R.muiSupportAuto||(B=void 0);var V=m||(a?Ws(fh(a)).body:void 0);return(0,l.jsx)(ph,r({BackdropProps:{invisible:!0},className:wn(N.root,h),container:V,open:b,ref:n,ownerState:A},_,{children:(0,l.jsx)(R,r({appear:!0,in:b,onEntering:function(e,t){E&&E(e,t),W()},timeout:B},M,{children:(0,l.jsx)(hh,r({elevation:g},S,{ref:I,className:wn(N.paper,S.className),children:p}))}))}))})),vh=mh;function gh(e){return Qo("MuiMenu",e)}$o("MuiMenu",["root","paper","list"]);var yh=["onEntering"],xh=["autoFocus","children","disableAutoFocusItem","MenuListProps","onClose","open","PaperProps","PopoverClasses","transitionDuration","TransitionProps","variant"],bh={vertical:"top",horizontal:"right"},wh={vertical:"top",horizontal:"left"},Sh=Yo(vh,{shouldForwardProp:function(e){return qo(e)||"classes"===e},name:"MuiMenu",slot:"Root",overridesResolver:function(e,t){return t.root}})({}),jh=Yo(Di,{name:"MuiMenu",slot:"Paper",overridesResolver:function(e,t){return t.paper}})({maxHeight:"calc(100% - 96px)",WebkitOverflowScrolling:"touch"}),kh=Yo(Jp,{name:"MuiMenu",slot:"List",overridesResolver:function(e,t){return t.list}})({outline:0}),Ch=e.forwardRef((function(t,n){var o=ln({props:t,name:"MuiMenu"}),i=o.autoFocus,a=void 0===i||i,s=o.children,u=o.disableAutoFocusItem,c=void 0!==u&&u,d=o.MenuListProps,f=void 0===d?{}:d,p=o.onClose,h=o.open,m=o.PaperProps,v=void 0===m?{}:m,g=o.PopoverClasses,y=o.transitionDuration,x=void 0===y?"auto":y,b=o.TransitionProps,w=(b=void 0===b?{}:b).onEntering,S=o.variant,j=void 0===S?"selectedMenu":S,k=Te(o.TransitionProps,yh),C=Te(o,xh),R=hi(),T="rtl"===R.direction,O=r({},o,{autoFocus:a,disableAutoFocusItem:c,MenuListProps:f,onEntering:w,PaperProps:v,transitionDuration:x,TransitionProps:k,variant:j}),P=function(e){return Po({root:["root"],paper:["paper"],list:["list"]},gh,e.classes)}(O),E=a&&!c&&h,M=e.useRef(null),_=-1;return e.Children.map(s,(function(t,n){e.isValidElement(t)&&(t.props.disabled||("selectedMenu"===j&&t.props.selected||-1===_)&&(_=n))})),(0,l.jsx)(Sh,r({classes:g,onClose:p,anchorOrigin:{vertical:"bottom",horizontal:T?"right":"left"},transformOrigin:T?bh:wh,PaperProps:r({component:jh},v,{classes:r({},v.classes,{root:P.paper})}),className:P.root,open:h,ref:n,transitionDuration:x,TransitionProps:r({onEntering:function(e,t){M.current&&M.current.adjustStyleForScrollbar(e,R),w&&w(e,t)}},k),ownerState:O},C,{children:(0,l.jsx)(kh,r({onKeyDown:function(e){"Tab"===e.key&&(e.preventDefault(),p&&p(e,"tabKeyDown"))},actions:M,autoFocus:a&&(-1===_||c),autoFocusItem:E,variant:j},f,{className:wn(P.list,f.className),children:s}))}))})),Rh=Ch;function Th(e){return Qo("MuiNativeSelect",e)}var Oh=$o("MuiNativeSelect",["root","select","multiple","filled","outlined","standard","disabled","icon","iconOpen","iconFilled","iconOutlined","iconStandard","nativeInput"]),Ph=["className","disabled","IconComponent","inputRef","variant"],Eh=function(e){var t,n=e.ownerState,o=e.theme;return r((Ee(t={MozAppearance:"none",WebkitAppearance:"none",userSelect:"none",borderRadius:0,cursor:"pointer","&:focus":{backgroundColor:"light"===o.palette.mode?"rgba(0, 0, 0, 0.05)":"rgba(255, 255, 255, 0.05)",borderRadius:0},"&::-ms-expand":{display:"none"}},"&.".concat(Oh.disabled),{cursor:"default"}),Ee(t,"&[multiple]",{height:"auto"}),Ee(t,"&:not([multiple]) option, &:not([multiple]) optgroup",{backgroundColor:o.palette.background.paper}),Ee(t,"&&&",{paddingRight:24,minWidth:16}),t),"filled"===n.variant&&{"&&&":{paddingRight:32}},"outlined"===n.variant&&{borderRadius:o.shape.borderRadius,"&:focus":{borderRadius:o.shape.borderRadius},"&&&":{paddingRight:32}})},Mh=Yo("select",{name:"MuiNativeSelect",slot:"Select",shouldForwardProp:qo,overridesResolver:function(e,t){var n=e.ownerState;return[t.select,t[n.variant],Ee({},"&.".concat(Oh.multiple),t.multiple)]}})(Eh),_h=function(e){var t=e.ownerState,n=e.theme;return r(Ee({position:"absolute",right:0,top:"calc(50% - .5em)",pointerEvents:"none",color:n.palette.action.active},"&.".concat(Oh.disabled),{color:n.palette.action.disabled}),t.open&&{transform:"rotate(180deg)"},"filled"===t.variant&&{right:7},"outlined"===t.variant&&{right:7})},Dh=Yo("svg",{name:"MuiNativeSelect",slot:"Icon",overridesResolver:function(e,t){var n=e.ownerState;return[t.icon,n.variant&&t["icon".concat(Eo(n.variant))],n.open&&t.iconOpen]}})(_h),Ih=e.forwardRef((function(t,n){var o=t.className,i=t.disabled,a=t.IconComponent,s=t.inputRef,u=t.variant,c=void 0===u?"standard":u,d=Te(t,Ph),f=r({},t,{disabled:i,variant:c}),p=function(e){var t=e.classes,n=e.variant,r=e.disabled,o=e.multiple,i=e.open;return Po({select:["select",n,r&&"disabled",o&&"multiple"],icon:["icon","icon".concat(Eo(n)),i&&"iconOpen",r&&"disabled"]},Th,t)}(f);return(0,l.jsxs)(e.Fragment,{children:[(0,l.jsx)(Mh,r({ownerState:f,className:wn(p.select,o),disabled:i,ref:s||n},d)),t.multiple?null:(0,l.jsx)(Dh,{as:a,ownerState:f,className:p.icon})]})})),Ah=Ih;function Nh(e){return Qo("MuiSelect",e)}var Lh,zh=$o("MuiSelect",["select","multiple","filled","outlined","standard","disabled","focused","icon","iconOpen","iconFilled","iconOutlined","iconStandard","nativeInput"]),Fh=["aria-describedby","aria-label","autoFocus","autoWidth","children","className","defaultOpen","defaultValue","disabled","displayEmpty","IconComponent","inputRef","labelId","MenuProps","multiple","name","onBlur","onChange","onClose","onFocus","onOpen","open","readOnly","renderValue","SelectDisplayProps","tabIndex","type","value","variant"],Wh=Yo("div",{name:"MuiSelect",slot:"Select",overridesResolver:function(e,t){var n=e.ownerState;return[Ee({},"&.".concat(zh.select),t.select),Ee({},"&.".concat(zh.select),t[n.variant]),Ee({},"&.".concat(zh.multiple),t.multiple)]}})(Eh,Ee({},"&.".concat(zh.select),{height:"auto",minHeight:"1.4375em",textOverflow:"ellipsis",whiteSpace:"nowrap",overflow:"hidden"})),Bh=Yo("svg",{name:"MuiSelect",slot:"Icon",overridesResolver:function(e,t){var n=e.ownerState;return[t.icon,n.variant&&t["icon".concat(Eo(n.variant))],n.open&&t.iconOpen]}})(_h),Vh=Yo("input",{shouldForwardProp:function(e){return Ho(e)&&"classes"!==e},name:"MuiSelect",slot:"NativeInput",overridesResolver:function(e,t){return t.nativeInput}})({bottom:0,left:0,position:"absolute",opacity:0,pointerEvents:"none",width:"100%",boxSizing:"border-box"});function qh(e,t){return"object"===typeof t&&null!==t?e===t:String(e)===String(t)}function Hh(e){return null==e||"string"===typeof e&&!e.trim()}var Uh=e.forwardRef((function(t,n){var o=t["aria-describedby"],i=t["aria-label"],a=t.autoFocus,s=t.autoWidth,u=t.children,c=t.className,d=t.defaultOpen,f=t.defaultValue,p=t.disabled,h=t.displayEmpty,m=t.IconComponent,v=t.inputRef,g=t.labelId,y=t.MenuProps,x=void 0===y?{}:y,b=t.multiple,w=t.name,S=t.onBlur,j=t.onChange,k=t.onClose,C=t.onFocus,R=t.onOpen,T=t.open,O=t.readOnly,P=t.renderValue,E=t.SelectDisplayProps,M=void 0===E?{}:E,_=t.tabIndex,D=t.value,I=t.variant,A=void 0===I?"standard":I,N=Te(t,Fh),L=Ne(Nd({controlled:D,default:f,name:"Select"}),2),z=L[0],F=L[1],W=Ne(Nd({controlled:T,default:d,name:"Select"}),2),B=W[0],V=W[1],q=e.useRef(null),H=e.useRef(null),U=Ne(e.useState(null),2),Y=U[0],G=U[1],Q=e.useRef(null!=T).current,$=Ne(e.useState(),2),K=$[0],X=$[1],Z=Nl(n,v),J=e.useCallback((function(e){H.current=e,e&&G(e)}),[]);e.useImperativeHandle(Z,(function(){return{focus:function(){H.current.focus()},node:q.current,value:z}}),[z]),e.useEffect((function(){d&&B&&Y&&!Q&&(X(s?null:Y.clientWidth),H.current.focus())}),[Y,s]),e.useEffect((function(){a&&H.current.focus()}),[a]),e.useEffect((function(){if(g){var e=Ws(H.current).getElementById(g);if(e){var t=function(){getSelection().isCollapsed&&H.current.focus()};return e.addEventListener("click",t),function(){e.removeEventListener("click",t)}}}}),[g]);var ee,te,ne=function(e,t){e?R&&R(t):k&&k(t),Q||(X(s?null:Y.clientWidth),V(e))},re=e.Children.toArray(u),oe=function(e){return function(t){var n;if(t.currentTarget.hasAttribute("tabindex")){if(b){n=Array.isArray(z)?z.slice():[];var r=z.indexOf(e.props.value);-1===r?n.push(e.props.value):n.splice(r,1)}else n=e.props.value;if(e.props.onClick&&e.props.onClick(t),z!==n&&(F(n),j)){var o=t.nativeEvent||t,i=new o.constructor(o.type,o);Object.defineProperty(i,"target",{writable:!0,value:{value:n,name:w}}),j(i,e)}b||ne(!1,t)}}},ie=null!==Y&&B;delete N["aria-invalid"];var ae=[],le=!1;(Op({value:z})||h)&&(P?ee=P(z):le=!0);var se=re.map((function(t,n,r){if(!e.isValidElement(t))return null;var o;if(b){if(!Array.isArray(z))throw new Error(qe(2));(o=z.some((function(e){return qh(e,t.props.value)})))&&le&&ae.push(t.props.children)}else(o=qh(z,t.props.value))&&le&&(te=t.props.children);if(o&&!0,void 0===t.props.value)return e.cloneElement(t,{"aria-readonly":!0,role:"option"});return e.cloneElement(t,{"aria-selected":o?"true":"false",onClick:oe(t),onKeyUp:function(e){" "===e.key&&e.preventDefault(),t.props.onKeyUp&&t.props.onKeyUp(e)},role:"option",selected:void 0===r[0].props.value||!0===r[0].props.disabled?function(){if(z)return o;var e=r.find((function(e){return void 0!==e.props.value&&!0!==e.props.disabled}));return t===e||o}():o,value:void 0,"data-value":t.props.value})}));le&&(ee=b?0===ae.length?null:ae.reduce((function(e,t,n){return e.push(t),n<ae.length-1&&e.push(", "),e}),[]):te);var ue,ce=K;!s&&Q&&Y&&(ce=Y.clientWidth),ue="undefined"!==typeof _?_:p?null:0;var de=M.id||(w?"mui-component-select-".concat(w):void 0),fe=r({},t,{variant:A,value:z,open:ie}),pe=function(e){var t=e.classes,n=e.variant,r=e.disabled,o=e.multiple,i=e.open;return Po({select:["select",n,r&&"disabled",o&&"multiple"],icon:["icon","icon".concat(Eo(n)),i&&"iconOpen",r&&"disabled"],nativeInput:["nativeInput"]},Nh,t)}(fe);return(0,l.jsxs)(e.Fragment,{children:[(0,l.jsx)(Wh,r({ref:J,tabIndex:ue,role:"button","aria-disabled":p?"true":void 0,"aria-expanded":ie?"true":"false","aria-haspopup":"listbox","aria-label":i,"aria-labelledby":[g,de].filter(Boolean).join(" ")||void 0,"aria-describedby":o,onKeyDown:function(e){if(!O){-1!==[" ","ArrowUp","ArrowDown","Enter"].indexOf(e.key)&&(e.preventDefault(),ne(!0,e))}},onMouseDown:p||O?null:function(e){0===e.button&&(e.preventDefault(),H.current.focus(),ne(!0,e))},onBlur:function(e){!ie&&S&&(Object.defineProperty(e,"target",{writable:!0,value:{value:z,name:w}}),S(e))},onFocus:C},M,{ownerState:fe,className:wn(pe.select,c,M.className),id:de,children:Hh(ee)?Lh||(Lh=(0,l.jsx)("span",{className:"notranslate",children:"\u200b"})):ee})),(0,l.jsx)(Vh,r({value:Array.isArray(z)?z.join(","):z,name:w,ref:q,"aria-hidden":!0,onChange:function(e){var t=re.map((function(e){return e.props.value})).indexOf(e.target.value);if(-1!==t){var n=re[t];F(n.props.value),j&&j(e,n)}},tabIndex:-1,disabled:p,className:pe.nativeInput,autoFocus:a,ownerState:fe},N)),(0,l.jsx)(Bh,{as:m,className:pe.icon,ownerState:fe}),(0,l.jsx)(Rh,r({id:"menu-".concat(w||""),anchorEl:Y,open:ie,onClose:function(e){ne(!1,e)},anchorOrigin:{vertical:"bottom",horizontal:"center"},transformOrigin:{vertical:"top",horizontal:"center"}},x,{MenuListProps:r({"aria-labelledby":g,role:"listbox",disableListWrap:!0},x.MenuListProps),PaperProps:r({},x.PaperProps,{style:r({minWidth:ce},null!=x.PaperProps?x.PaperProps.style:null)}),children:se}))]})})),Yh=Uh,Gh=Ml((0,l.jsx)("path",{d:"M7 10l5 5 5-5z"}),"ArrowDropDown"),Qh=["onChange","maxRows","minRows","style","value"];function $h(e,t){return parseInt(e[t],10)||0}var Kh={visibility:"hidden",position:"absolute",overflow:"hidden",height:0,top:0,left:0,transform:"translateZ(0)"};function Xh(e){return void 0===e||null===e||0===Object.keys(e).length}var Zh=e.forwardRef((function(t,n){var o=t.onChange,i=t.maxRows,a=t.minRows,s=void 0===a?1:a,u=t.style,c=t.value,d=Te(t,Qh),f=e.useRef(null!=c).current,p=e.useRef(null),h=Al(n,p),m=e.useRef(null),v=e.useRef(0),g=Ne(e.useState({}),2),y=g[0],x=g[1],b=e.useCallback((function(){var e=p.current,n=Sl(e).getComputedStyle(e);if("0px"===n.width)return{};var r=m.current;r.style.width=n.width,r.value=e.value||t.placeholder||"x","\n"===r.value.slice(-1)&&(r.value+=" ");var o=n["box-sizing"],a=$h(n,"padding-bottom")+$h(n,"padding-top"),l=$h(n,"border-bottom-width")+$h(n,"border-top-width"),u=r.scrollHeight;r.value="x";var c=r.scrollHeight,d=u;return s&&(d=Math.max(Number(s)*c,d)),i&&(d=Math.min(Number(i)*c,d)),{outerHeightStyle:(d=Math.max(d,c))+("border-box"===o?a+l:0),overflow:Math.abs(d-u)<=1}}),[i,s,t.placeholder]),w=function(e,t){var n=t.outerHeightStyle,r=t.overflow;return v.current<20&&(n>0&&Math.abs((e.outerHeightStyle||0)-n)>1||e.overflow!==r)?(v.current+=1,{overflow:r,outerHeightStyle:n}):e},S=e.useCallback((function(){var e=b();Xh(e)||x((function(t){return w(t,e)}))}),[b]);e.useEffect((function(){var e,t=hl((function(){v.current=0,p.current&&function(){var e=b();Xh(e)||(0,fu.flushSync)((function(){x((function(t){return w(t,e)}))}))}()})),n=Sl(p.current);return n.addEventListener("resize",t),"undefined"!==typeof ResizeObserver&&(e=new ResizeObserver(t)).observe(p.current),function(){t.clear(),n.removeEventListener("resize",t),e&&e.disconnect()}})),Ll((function(){S()})),e.useEffect((function(){v.current=0}),[c]);return(0,l.jsxs)(e.Fragment,{children:[(0,l.jsx)("textarea",r({value:c,onChange:function(e){v.current=0,f||S(),o&&o(e)},ref:h,rows:s,style:r({height:y.outerHeightStyle,overflow:y.overflow?"hidden":null},u)},d)),(0,l.jsx)("textarea",{"aria-hidden":!0,className:t.className,readOnly:!0,ref:m,tabIndex:-1,style:r({},Kh,u,{padding:0})})]})})),Jh=Zh;function em(e){return Qo("MuiInputBase",e)}var tm=$o("MuiInputBase",["root","formControl","focused","disabled","adornedStart","adornedEnd","error","sizeSmall","multiline","colorSecondary","fullWidth","hiddenLabel","input","inputSizeSmall","inputMultiline","inputTypeSearch","inputAdornedStart","inputAdornedEnd","inputHiddenLabel"]),nm=["aria-describedby","autoComplete","autoFocus","className","color","components","componentsProps","defaultValue","disabled","disableInjectingGlobalStyles","endAdornment","error","fullWidth","id","inputComponent","inputProps","inputRef","margin","maxRows","minRows","multiline","name","onBlur","onChange","onClick","onFocus","onKeyDown","onKeyUp","placeholder","readOnly","renderSuffix","rows","size","startAdornment","type","value"],rm=function(e,t){var n=e.ownerState;return[t.root,n.formControl&&t.formControl,n.startAdornment&&t.adornedStart,n.endAdornment&&t.adornedEnd,n.error&&t.error,"small"===n.size&&t.sizeSmall,n.multiline&&t.multiline,n.color&&t["color".concat(Eo(n.color))],n.fullWidth&&t.fullWidth,n.hiddenLabel&&t.hiddenLabel]},om=function(e,t){var n=e.ownerState;return[t.input,"small"===n.size&&t.inputSizeSmall,n.multiline&&t.inputMultiline,"search"===n.type&&t.inputTypeSearch,n.startAdornment&&t.inputAdornedStart,n.endAdornment&&t.inputAdornedEnd,n.hiddenLabel&&t.inputHiddenLabel]},im=Yo("div",{name:"MuiInputBase",slot:"Root",overridesResolver:rm})((function(e){var t=e.theme,n=e.ownerState;return r({},t.typography.body1,Ee({color:(t.vars||t).palette.text.primary,lineHeight:"1.4375em",boxSizing:"border-box",position:"relative",cursor:"text",display:"inline-flex",alignItems:"center"},"&.".concat(tm.disabled),{color:(t.vars||t).palette.text.disabled,cursor:"default"}),n.multiline&&r({padding:"4px 0 5px"},"small"===n.size&&{paddingTop:1}),n.fullWidth&&{width:"100%"})})),am=Yo("input",{name:"MuiInputBase",slot:"Input",overridesResolver:om})((function(e){var t,n=e.theme,o=e.ownerState,i="light"===n.palette.mode,a=r({color:"currentColor"},n.vars?{opacity:n.vars.opacity.inputPlaceholder}:{opacity:i?.42:.5},{transition:n.transitions.create("opacity",{duration:n.transitions.duration.shorter})}),l={opacity:"0 !important"},s=n.vars?{opacity:n.vars.opacity.inputPlaceholder}:{opacity:i?.42:.5};return r((Ee(t={font:"inherit",letterSpacing:"inherit",color:"currentColor",padding:"4px 0 5px",border:0,boxSizing:"content-box",background:"none",height:"1.4375em",margin:0,WebkitTapHighlightColor:"transparent",display:"block",minWidth:0,width:"100%",animationName:"mui-auto-fill-cancel",animationDuration:"10ms","&::-webkit-input-placeholder":a,"&::-moz-placeholder":a,"&:-ms-input-placeholder":a,"&::-ms-input-placeholder":a,"&:focus":{outline:0},"&:invalid":{boxShadow:"none"},"&::-webkit-search-decoration":{WebkitAppearance:"none"}},"label[data-shrink=false] + .".concat(tm.formControl," &"),{"&::-webkit-input-placeholder":l,"&::-moz-placeholder":l,"&:-ms-input-placeholder":l,"&::-ms-input-placeholder":l,"&:focus::-webkit-input-placeholder":s,"&:focus::-moz-placeholder":s,"&:focus:-ms-input-placeholder":s,"&:focus::-ms-input-placeholder":s}),Ee(t,"&.".concat(tm.disabled),{opacity:1,WebkitTextFillColor:(n.vars||n).palette.text.disabled}),Ee(t,"&:-webkit-autofill",{animationDuration:"5000s",animationName:"mui-auto-fill"}),t),"small"===o.size&&{paddingTop:1},o.multiline&&{height:"auto",resize:"none",padding:0,paddingTop:0},"search"===o.type&&{MozAppearance:"textfield"})})),lm=(0,l.jsx)(vn,{styles:{"@keyframes mui-auto-fill":{from:{display:"block"}},"@keyframes mui-auto-fill-cancel":{from:{display:"block"}}}}),sm=e.forwardRef((function(t,n){var o=ln({props:t,name:"MuiInputBase"}),i=o["aria-describedby"],a=o.autoComplete,s=o.autoFocus,u=o.className,c=o.components,d=void 0===c?{}:c,f=o.componentsProps,p=void 0===f?{}:f,h=o.defaultValue,m=o.disabled,v=o.disableInjectingGlobalStyles,g=o.endAdornment,y=o.fullWidth,x=void 0!==y&&y,b=o.id,w=o.inputComponent,S=void 0===w?"input":w,j=o.inputProps,k=void 0===j?{}:j,C=o.inputRef,R=o.maxRows,T=o.minRows,O=o.multiline,P=void 0!==O&&O,E=o.name,M=o.onBlur,_=o.onChange,D=o.onClick,I=o.onFocus,A=o.onKeyDown,N=o.onKeyUp,L=o.placeholder,z=o.readOnly,F=o.renderSuffix,W=o.rows,B=o.startAdornment,V=o.type,q=void 0===V?"text":V,H=o.value,U=Te(o,nm),Y=null!=k.value?k.value:H,G=e.useRef(null!=Y).current,Q=e.useRef(),$=e.useCallback((function(e){0}),[]),K=Nl(k.ref,$),X=Nl(C,K),Z=Nl(Q,X),J=Ne(e.useState(!1),2),ee=J[0],te=J[1],ne=Pd();var re=Ed({props:o,muiFormControl:ne,states:["color","disabled","error","hiddenLabel","size","required","filled"]});re.focused=ne?ne.focused:ee,e.useEffect((function(){!ne&&m&&ee&&(te(!1),M&&M())}),[ne,m,ee,M]);var oe=ne&&ne.onFilled,ie=ne&&ne.onEmpty,ae=e.useCallback((function(e){Op(e)?oe&&oe():ie&&ie()}),[oe,ie]);_f((function(){G&&ae({value:Y})}),[Y,ae,G]);e.useEffect((function(){ae(Q.current)}),[]);var le=S,se=k;P&&"input"===le&&(se=r(W?{type:void 0,minRows:W,maxRows:W}:{type:void 0,maxRows:R,minRows:T},se),le=Jh);e.useEffect((function(){ne&&ne.setAdornedStart(Boolean(B))}),[ne,B]);var ue=r({},o,{color:re.color||"primary",disabled:re.disabled,endAdornment:g,error:re.error,focused:re.focused,formControl:ne,fullWidth:x,hiddenLabel:re.hiddenLabel,multiline:P,size:re.size,startAdornment:B,type:q}),ce=function(e){var t=e.classes,n=e.color,r=e.disabled,o=e.error,i=e.endAdornment,a=e.focused,l=e.formControl,s=e.fullWidth,u=e.hiddenLabel,c=e.multiline,d=e.size,f=e.startAdornment,p=e.type;return Po({root:["root","color".concat(Eo(n)),r&&"disabled",o&&"error",s&&"fullWidth",a&&"focused",l&&"formControl","small"===d&&"sizeSmall",c&&"multiline",f&&"adornedStart",i&&"adornedEnd",u&&"hiddenLabel"],input:["input",r&&"disabled","search"===p&&"inputTypeSearch",c&&"inputMultiline","small"===d&&"inputSizeSmall",u&&"inputHiddenLabel",f&&"inputAdornedStart",i&&"inputAdornedEnd"]},em,t)}(ue),de=d.Root||im,fe=p.root||{},pe=d.Input||am;return se=r({},se,p.input),(0,l.jsxs)(e.Fragment,{children:[!v&&lm,(0,l.jsxs)(de,r({},fe,!Pu(de)&&{ownerState:r({},ue,fe.ownerState)},{ref:n,onClick:function(e){Q.current&&e.currentTarget===e.target&&Q.current.focus(),D&&D(e)}},U,{className:wn(ce.root,fe.className,u),children:[B,(0,l.jsx)(Od.Provider,{value:null,children:(0,l.jsx)(pe,r({ownerState:ue,"aria-invalid":re.error,"aria-describedby":i,autoComplete:a,autoFocus:s,defaultValue:h,disabled:re.disabled,id:b,onAnimationStart:function(e){ae("mui-auto-fill-cancel"===e.animationName?Q.current:{value:"x"})},name:E,placeholder:L,readOnly:z,required:re.required,rows:W,value:Y,onKeyDown:A,onKeyUp:N,type:q},se,!Pu(pe)&&{as:le,ownerState:r({},ue,se.ownerState)},{ref:Z,className:wn(ce.input,se.className),onBlur:function(e){M&&M(e),k.onBlur&&k.onBlur(e),ne&&ne.onBlur?ne.onBlur(e):te(!1)},onChange:function(e){if(!G){var t=e.target||Q.current;if(null==t)throw new Error(qe(1));ae({value:t.value})}for(var n=arguments.length,r=new Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];k.onChange&&k.onChange.apply(k,[e].concat(r)),_&&_.apply(void 0,[e].concat(r))},onFocus:function(e){re.disabled?e.stopPropagation():(I&&I(e),k.onFocus&&k.onFocus(e),ne&&ne.onFocus?ne.onFocus(e):te(!0))}}))}),g,F?F(r({},re,{startAdornment:B})):null]}))]})})),um=sm;function cm(e){return Qo("MuiInput",e)}var dm=r({},tm,$o("MuiInput",["root","underline","input"])),fm=["disableUnderline","components","componentsProps","fullWidth","inputComponent","multiline","type"],pm=Yo(im,{shouldForwardProp:function(e){return qo(e)||"classes"===e},name:"MuiInput",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[].concat(Rr(rm(e,t)),[!n.disableUnderline&&t.underline])}})((function(e){var t,n=e.theme,o=e.ownerState,i="light"===n.palette.mode?"rgba(0, 0, 0, 0.42)":"rgba(255, 255, 255, 0.7)";return n.vars&&(i="rgba(".concat(n.vars.palette.common.onBackgroundChannel," / ").concat(n.vars.opacity.inputUnderline,")")),r({position:"relative"},o.formControl&&{"label + &":{marginTop:16}},!o.disableUnderline&&(Ee(t={"&:after":{borderBottom:"2px solid ".concat((n.vars||n).palette[o.color].main),left:0,bottom:0,content:'""',position:"absolute",right:0,transform:"scaleX(0)",transition:n.transitions.create("transform",{duration:n.transitions.duration.shorter,easing:n.transitions.easing.easeOut}),pointerEvents:"none"}},"&.".concat(dm.focused,":after"),{transform:"scaleX(1) translateX(0)"}),Ee(t,"&.".concat(dm.error,":after"),{borderBottomColor:(n.vars||n).palette.error.main,transform:"scaleX(1)"}),Ee(t,"&:before",{borderBottom:"1px solid ".concat(i),left:0,bottom:0,content:'"\\00a0"',position:"absolute",right:0,transition:n.transitions.create("border-bottom-color",{duration:n.transitions.duration.shorter}),pointerEvents:"none"}),Ee(t,"&:hover:not(.".concat(dm.disabled,"):before"),{borderBottom:"2px solid ".concat((n.vars||n).palette.text.primary),"@media (hover: none)":{borderBottom:"1px solid ".concat(i)}}),Ee(t,"&.".concat(dm.disabled,":before"),{borderBottomStyle:"dotted"}),t))})),hm=Yo(am,{name:"MuiInput",slot:"Input",overridesResolver:om})({}),mm=e.forwardRef((function(e,t){var n=ln({props:e,name:"MuiInput"}),o=n.disableUnderline,i=n.components,a=void 0===i?{}:i,s=n.componentsProps,u=n.fullWidth,c=void 0!==u&&u,d=n.inputComponent,f=void 0===d?"input":d,p=n.multiline,h=void 0!==p&&p,m=n.type,v=void 0===m?"text":m,g=Te(n,fm),y=function(e){var t=e.classes;return r({},t,Po({root:["root",!e.disableUnderline&&"underline"],input:["input"]},cm,t))}(n),x={root:{ownerState:{disableUnderline:o}}},b=s?Pe(s,x):x;return(0,l.jsx)(um,r({components:r({Root:pm,Input:hm},a),componentsProps:b,fullWidth:c,inputComponent:f,multiline:h,ref:t,type:v},g,{classes:y}))}));mm.muiName="Input";var vm=mm;function gm(e){return Qo("MuiFilledInput",e)}var ym=r({},tm,$o("MuiFilledInput",["root","underline","input"])),xm=["disableUnderline","components","componentsProps","fullWidth","hiddenLabel","inputComponent","multiline","type"],bm=Yo(im,{shouldForwardProp:function(e){return qo(e)||"classes"===e},name:"MuiFilledInput",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[].concat(Rr(rm(e,t)),[!n.disableUnderline&&t.underline])}})((function(e){var t,n,o,i=e.theme,a=e.ownerState,l="light"===i.palette.mode,s=l?"rgba(0, 0, 0, 0.42)":"rgba(255, 255, 255, 0.7)",u=l?"rgba(0, 0, 0, 0.06)":"rgba(255, 255, 255, 0.09)",c=l?"rgba(0, 0, 0, 0.09)":"rgba(255, 255, 255, 0.13)",d=l?"rgba(0, 0, 0, 0.12)":"rgba(255, 255, 255, 0.12)";return r((Ee(t={position:"relative",backgroundColor:i.vars?i.vars.palette.FilledInput.bg:u,borderTopLeftRadius:(i.vars||i).shape.borderRadius,borderTopRightRadius:(i.vars||i).shape.borderRadius,transition:i.transitions.create("background-color",{duration:i.transitions.duration.shorter,easing:i.transitions.easing.easeOut}),"&:hover":{backgroundColor:i.vars?i.vars.palette.FilledInput.hoverBg:c,"@media (hover: none)":{backgroundColor:i.vars?i.vars.palette.FilledInput.bg:u}}},"&.".concat(ym.focused),{backgroundColor:i.vars?i.vars.palette.FilledInput.bg:u}),Ee(t,"&.".concat(ym.disabled),{backgroundColor:i.vars?i.vars.palette.FilledInput.disabledBg:d}),t),!a.disableUnderline&&(Ee(n={"&:after":{borderBottom:"2px solid ".concat(null==(o=(i.vars||i).palette[a.color||"primary"])?void 0:o.main),left:0,bottom:0,content:'""',position:"absolute",right:0,transform:"scaleX(0)",transition:i.transitions.create("transform",{duration:i.transitions.duration.shorter,easing:i.transitions.easing.easeOut}),pointerEvents:"none"}},"&.".concat(ym.focused,":after"),{transform:"scaleX(1) translateX(0)"}),Ee(n,"&.".concat(ym.error,":after"),{borderBottomColor:(i.vars||i).palette.error.main,transform:"scaleX(1)"}),Ee(n,"&:before",{borderBottom:"1px solid ".concat(i.vars?"rgba(".concat(i.vars.palette.common.onBackgroundChannel," / ").concat(i.vars.opacity.inputUnderline,")"):s),left:0,bottom:0,content:'"\\00a0"',position:"absolute",right:0,transition:i.transitions.create("border-bottom-color",{duration:i.transitions.duration.shorter}),pointerEvents:"none"}),Ee(n,"&:hover:not(.".concat(ym.disabled,"):before"),{borderBottom:"1px solid ".concat((i.vars||i).palette.text.primary)}),Ee(n,"&.".concat(ym.disabled,":before"),{borderBottomStyle:"dotted"}),n),a.startAdornment&&{paddingLeft:12},a.endAdornment&&{paddingRight:12},a.multiline&&r({padding:"25px 12px 8px"},"small"===a.size&&{paddingTop:21,paddingBottom:4},a.hiddenLabel&&{paddingTop:16,paddingBottom:17}))})),wm=Yo(am,{name:"MuiFilledInput",slot:"Input",overridesResolver:om})((function(e){var t=e.theme,n=e.ownerState;return r({paddingTop:25,paddingRight:12,paddingBottom:8,paddingLeft:12},!t.vars&&{"&:-webkit-autofill":{WebkitBoxShadow:"light"===t.palette.mode?null:"0 0 0 100px #266798 inset",WebkitTextFillColor:"light"===t.palette.mode?null:"#fff",caretColor:"light"===t.palette.mode?null:"#fff",borderTopLeftRadius:"inherit",borderTopRightRadius:"inherit"}},t.vars&&Ee({"&:-webkit-autofill":{borderTopLeftRadius:"inherit",borderTopRightRadius:"inherit"}},t.getColorSchemeSelector("dark"),{"&:-webkit-autofill":{WebkitBoxShadow:"0 0 0 100px #266798 inset",WebkitTextFillColor:"#fff",caretColor:"#fff"}}),"small"===n.size&&{paddingTop:21,paddingBottom:4},n.hiddenLabel&&{paddingTop:16,paddingBottom:17},n.multiline&&{paddingTop:0,paddingBottom:0,paddingLeft:0,paddingRight:0},n.startAdornment&&{paddingLeft:0},n.endAdornment&&{paddingRight:0},n.hiddenLabel&&"small"===n.size&&{paddingTop:8,paddingBottom:9})})),Sm=e.forwardRef((function(e,t){var n=ln({props:e,name:"MuiFilledInput"}),o=n.components,i=void 0===o?{}:o,a=n.componentsProps,s=n.fullWidth,u=void 0!==s&&s,c=n.inputComponent,d=void 0===c?"input":c,f=n.multiline,p=void 0!==f&&f,h=n.type,m=void 0===h?"text":h,v=Te(n,xm),g=r({},n,{fullWidth:u,inputComponent:d,multiline:p,type:m}),y=function(e){var t=e.classes;return r({},t,Po({root:["root",!e.disableUnderline&&"underline"],input:["input"]},gm,t))}(n),x={root:{ownerState:g},input:{ownerState:g}},b=a?Pe(a,x):x;return(0,l.jsx)(um,r({components:r({Root:bm,Input:wm},i),componentsProps:b,fullWidth:u,inputComponent:d,multiline:p,ref:t,type:m},v,{classes:y}))}));Sm.muiName="Input";var jm,km=Sm,Cm=["children","classes","className","label","notched"],Rm=Yo("fieldset")({textAlign:"left",position:"absolute",bottom:0,right:0,top:-5,left:0,margin:0,padding:"0 8px",pointerEvents:"none",borderRadius:"inherit",borderStyle:"solid",borderWidth:1,overflow:"hidden",minWidth:"0%"}),Tm=Yo("legend")((function(e){var t=e.ownerState,n=e.theme;return r({float:"unset",overflow:"hidden"},!t.withLabel&&{padding:0,lineHeight:"11px",transition:n.transitions.create("width",{duration:150,easing:n.transitions.easing.easeOut})},t.withLabel&&r({display:"block",width:"auto",padding:0,height:11,fontSize:"0.75em",visibility:"hidden",maxWidth:.01,transition:n.transitions.create("max-width",{duration:50,easing:n.transitions.easing.easeOut}),whiteSpace:"nowrap","& > span":{paddingLeft:5,paddingRight:5,display:"inline-block",opacity:0,visibility:"visible"}},t.notched&&{maxWidth:"100%",transition:n.transitions.create("max-width",{duration:100,easing:n.transitions.easing.easeOut,delay:50})}))}));function Om(e){return Qo("MuiOutlinedInput",e)}var Pm=r({},tm,$o("MuiOutlinedInput",["root","notchedOutline","input"])),Em=["components","fullWidth","inputComponent","label","multiline","notched","type"],Mm=Yo(im,{shouldForwardProp:function(e){return qo(e)||"classes"===e},name:"MuiOutlinedInput",slot:"Root",overridesResolver:rm})((function(e){var t,n=e.theme,o=e.ownerState,i="light"===n.palette.mode?"rgba(0, 0, 0, 0.23)":"rgba(255, 255, 255, 0.23)";return r((Ee(t={position:"relative",borderRadius:(n.vars||n).shape.borderRadius},"&:hover .".concat(Pm.notchedOutline),{borderColor:(n.vars||n).palette.text.primary}),Ee(t,"@media (hover: none)",Ee({},"&:hover .".concat(Pm.notchedOutline),{borderColor:n.vars?"rgba(".concat(n.vars.palette.common.onBackgroundChannel," / 0.23)"):i})),Ee(t,"&.".concat(Pm.focused," .").concat(Pm.notchedOutline),{borderColor:(n.vars||n).palette[o.color].main,borderWidth:2}),Ee(t,"&.".concat(Pm.error," .").concat(Pm.notchedOutline),{borderColor:(n.vars||n).palette.error.main}),Ee(t,"&.".concat(Pm.disabled," .").concat(Pm.notchedOutline),{borderColor:(n.vars||n).palette.action.disabled}),t),o.startAdornment&&{paddingLeft:14},o.endAdornment&&{paddingRight:14},o.multiline&&r({padding:"16.5px 14px"},"small"===o.size&&{padding:"8.5px 14px"}))})),_m=Yo((function(e){var t=e.className,n=e.label,o=e.notched,i=Te(e,Cm),a=null!=n&&""!==n,s=r({},e,{notched:o,withLabel:a});return(0,l.jsx)(Rm,r({"aria-hidden":!0,className:t,ownerState:s},i,{children:(0,l.jsx)(Tm,{ownerState:s,children:a?(0,l.jsx)("span",{children:n}):jm||(jm=(0,l.jsx)("span",{className:"notranslate",children:"\u200b"}))})}))}),{name:"MuiOutlinedInput",slot:"NotchedOutline",overridesResolver:function(e,t){return t.notchedOutline}})((function(e){var t=e.theme,n="light"===t.palette.mode?"rgba(0, 0, 0, 0.23)":"rgba(255, 255, 255, 0.23)";return{borderColor:t.vars?"rgba(".concat(t.vars.palette.common.onBackgroundChannel," / 0.23)"):n}})),Dm=Yo(am,{name:"MuiOutlinedInput",slot:"Input",overridesResolver:om})((function(e){var t=e.theme,n=e.ownerState;return r({padding:"16.5px 14px"},!t.vars&&{"&:-webkit-autofill":{WebkitBoxShadow:"light"===t.palette.mode?null:"0 0 0 100px #266798 inset",WebkitTextFillColor:"light"===t.palette.mode?null:"#fff",caretColor:"light"===t.palette.mode?null:"#fff",borderRadius:"inherit"}},t.vars&&Ee({"&:-webkit-autofill":{borderRadius:"inherit"}},t.getColorSchemeSelector("dark"),{"&:-webkit-autofill":{WebkitBoxShadow:"0 0 0 100px #266798 inset",WebkitTextFillColor:"#fff",caretColor:"#fff"}}),"small"===n.size&&{padding:"8.5px 14px"},n.multiline&&{padding:0},n.startAdornment&&{paddingLeft:0},n.endAdornment&&{paddingRight:0})})),Im=e.forwardRef((function(t,n){var o,i=ln({props:t,name:"MuiOutlinedInput"}),a=i.components,s=void 0===a?{}:a,u=i.fullWidth,c=void 0!==u&&u,d=i.inputComponent,f=void 0===d?"input":d,p=i.label,h=i.multiline,m=void 0!==h&&h,v=i.notched,g=i.type,y=void 0===g?"text":g,x=Te(i,Em),b=function(e){var t=e.classes;return r({},t,Po({root:["root"],notchedOutline:["notchedOutline"],input:["input"]},Om,t))}(i),w=Pd(),S=Ed({props:i,muiFormControl:w,states:["required"]}),j=r({},i,{color:S.color||"primary",disabled:S.disabled,error:S.error,focused:S.focused,formControl:w,fullWidth:c,hiddenLabel:S.hiddenLabel,multiline:m,size:S.size,type:y});return(0,l.jsx)(um,r({components:r({Root:Mm,Input:Dm},s),renderSuffix:function(t){return(0,l.jsx)(_m,{ownerState:j,className:b.notchedOutline,label:null!=p&&""!==p&&S.required?o||(o=(0,l.jsxs)(e.Fragment,{children:[p,"\xa0","*"]})):p,notched:"undefined"!==typeof v?v:Boolean(t.startAdornment||t.filled||t.focused)})},fullWidth:c,inputComponent:f,multiline:m,ref:n,type:y},x,{classes:r({},b,{notchedOutline:null})}))}));Im.muiName="Input";var Am,Nm,Lm=Im,zm=["autoWidth","children","classes","className","defaultOpen","displayEmpty","IconComponent","id","input","inputProps","label","labelId","MenuProps","multiple","native","onClose","onOpen","open","renderValue","SelectDisplayProps","variant"],Fm={name:"MuiSelect",overridesResolver:function(e,t){return t.root},shouldForwardProp:function(e){return qo(e)&&"variant"!==e},slot:"Root"},Wm=Yo(vm,Fm)(""),Bm=Yo(Lm,Fm)(""),Vm=Yo(km,Fm)(""),qm=e.forwardRef((function(t,n){var o=ln({name:"MuiSelect",props:t}),i=o.autoWidth,a=void 0!==i&&i,s=o.children,u=o.classes,c=void 0===u?{}:u,d=o.className,f=o.defaultOpen,p=void 0!==f&&f,h=o.displayEmpty,m=void 0!==h&&h,v=o.IconComponent,g=void 0===v?Gh:v,y=o.id,x=o.input,b=o.inputProps,w=o.label,S=o.labelId,j=o.MenuProps,k=o.multiple,C=void 0!==k&&k,R=o.native,T=void 0!==R&&R,O=o.onClose,P=o.onOpen,E=o.open,M=o.renderValue,_=o.SelectDisplayProps,D=o.variant,I=void 0===D?"outlined":D,A=Te(o,zm),N=T?Ah:Yh,L=Ed({props:o,muiFormControl:Pd(),states:["variant"]}).variant||I,z=x||{standard:Am||(Am=(0,l.jsx)(Wm,{})),outlined:(0,l.jsx)(Bm,{label:w}),filled:Nm||(Nm=(0,l.jsx)(Vm,{}))}[L],F=function(e){return e.classes}(r({},o,{variant:L,classes:c})),W=Nl(n,z.ref);return e.cloneElement(z,r({inputComponent:N,inputProps:r({children:s,IconComponent:g,variant:L,type:void 0,multiple:C},T?{id:y}:{autoWidth:a,defaultOpen:p,displayEmpty:m,labelId:S,MenuProps:j,onClose:O,onOpen:P,open:E,renderValue:M,SelectDisplayProps:r({id:y},_)},b,{classes:b?Pe(F,b.classes):F},x?x.props.inputProps:{})},C&&T&&"outlined"===L?{notched:!0}:{},{ref:W,className:wn(z.props.className,d),variant:L},A))}));qm.muiName="Select";var Hm=qm;function Um(e){return Qo("MuiListItemIcon",e)}var Ym=$o("MuiListItemIcon",["root","alignItemsFlexStart"]);function Gm(e){return Qo("MuiMenuItem",e)}var Qm=$o("MuiMenuItem",["root","focusVisible","dense","disabled","divider","gutters","selected"]),$m=["autoFocus","component","dense","divider","disableGutters","focusVisibleClassName","role","tabIndex"],Km=Yo(Ps,{shouldForwardProp:function(e){return qo(e)||"classes"===e},name:"MuiMenuItem",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,n.dense&&t.dense,n.divider&&t.divider,!n.disableGutters&&t.gutters]}})((function(e){var t,n=e.theme,o=e.ownerState;return r({},n.typography.body1,{display:"flex",justifyContent:"flex-start",alignItems:"center",position:"relative",textDecoration:"none",minHeight:48,paddingTop:6,paddingBottom:6,boxSizing:"border-box",whiteSpace:"nowrap"},!o.disableGutters&&{paddingLeft:16,paddingRight:16},o.divider&&{borderBottom:"1px solid ".concat((n.vars||n).palette.divider),backgroundClip:"padding-box"},(Ee(t={"&:hover":{textDecoration:"none",backgroundColor:(n.vars||n).palette.action.hover,"@media (hover: none)":{backgroundColor:"transparent"}}},"&.".concat(Qm.selected),Ee({backgroundColor:n.vars?"rgba(".concat(n.vars.palette.primary.mainChannel," / ").concat(n.vars.palette.action.selectedOpacity,")"):Tt(n.palette.primary.main,n.palette.action.selectedOpacity)},"&.".concat(Qm.focusVisible),{backgroundColor:n.vars?"rgba(".concat(n.vars.palette.primary.mainChannel," / calc(").concat(n.vars.palette.action.selectedOpacity," + ").concat(n.vars.palette.action.focusOpacity,"))"):Tt(n.palette.primary.main,n.palette.action.selectedOpacity+n.palette.action.focusOpacity)})),Ee(t,"&.".concat(Qm.selected,":hover"),{backgroundColor:n.vars?"rgba(".concat(n.vars.palette.primary.mainChannel," / calc(").concat(n.vars.palette.action.selectedOpacity," + ").concat(n.vars.palette.action.hoverOpacity,"))"):Tt(n.palette.primary.main,n.palette.action.selectedOpacity+n.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:n.vars?"rgba(".concat(n.vars.palette.primary.mainChannel," / ").concat(n.vars.palette.action.selectedOpacity,")"):Tt(n.palette.primary.main,n.palette.action.selectedOpacity)}}),Ee(t,"&.".concat(Qm.focusVisible),{backgroundColor:(n.vars||n).palette.action.focus}),Ee(t,"&.".concat(Qm.disabled),{opacity:(n.vars||n).palette.action.disabledOpacity}),Ee(t,"& + .".concat(tp.root),{marginTop:n.spacing(1),marginBottom:n.spacing(1)}),Ee(t,"& + .".concat(tp.inset),{marginLeft:52}),Ee(t,"& .".concat($f.root),{marginTop:0,marginBottom:0}),Ee(t,"& .".concat($f.inset),{paddingLeft:36}),Ee(t,"& .".concat(Ym.root),{minWidth:36}),t),!o.dense&&Ee({},n.breakpoints.up("sm"),{minHeight:"auto"}),o.dense&&r({minHeight:32,paddingTop:4,paddingBottom:4},n.typography.body2,Ee({},"& .".concat(Ym.root," svg"),{fontSize:"1.25rem"})))})),Xm=e.forwardRef((function(t,n){var o=ln({props:t,name:"MuiMenuItem"}),i=o.autoFocus,a=void 0!==i&&i,s=o.component,u=void 0===s?"li":s,c=o.dense,d=void 0!==c&&c,f=o.divider,p=void 0!==f&&f,h=o.disableGutters,m=void 0!==h&&h,v=o.focusVisibleClassName,g=o.role,y=void 0===g?"menuitem":g,x=o.tabIndex,b=Te(o,$m),w=e.useContext(Df),S={dense:d||w.dense||!1,disableGutters:m},j=e.useRef(null);_f((function(){a&&j.current&&j.current.focus()}),[a]);var k,C=r({},o,{dense:S.dense,divider:p,disableGutters:m}),R=function(e){var t=e.disabled,n=e.dense,o=e.divider,i=e.disableGutters,a=e.selected,l=e.classes;return r({},l,Po({root:["root",n&&"dense",t&&"disabled",!i&&"gutters",o&&"divider",a&&"selected"]},Gm,l))}(o),T=Nl(j,n);return o.disabled||(k=void 0!==x?x:-1),(0,l.jsx)(Df.Provider,{value:S,children:(0,l.jsx)(Km,r({ref:T,role:y,tabIndex:k,component:u,focusVisibleClassName:wn(R.focusVisible,v)},b,{ownerState:C,classes:R}))})})),Zm=Xm;function Jm(e){return Qo("MuiFormHelperText",e)}var ev,tv=$o("MuiFormHelperText",["root","error","disabled","sizeSmall","sizeMedium","contained","focused","filled","required"]),nv=["children","className","component","disabled","error","filled","focused","margin","required","variant"],rv=Yo("p",{name:"MuiFormHelperText",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,n.size&&t["size".concat(Eo(n.size))],n.contained&&t.contained,n.filled&&t.filled]}})((function(e){var t,n=e.theme,o=e.ownerState;return r({color:(n.vars||n).palette.text.secondary},n.typography.caption,(Ee(t={textAlign:"left",marginTop:3,marginRight:0,marginBottom:0,marginLeft:0},"&.".concat(tv.disabled),{color:(n.vars||n).palette.text.disabled}),Ee(t,"&.".concat(tv.error),{color:(n.vars||n).palette.error.main}),t),"small"===o.size&&{marginTop:4},o.contained&&{marginLeft:14,marginRight:14})})),ov=e.forwardRef((function(e,t){var n=ln({props:e,name:"MuiFormHelperText"}),o=n.children,i=n.className,a=n.component,s=void 0===a?"p":a,u=Te(n,nv),c=Ed({props:n,muiFormControl:Pd(),states:["variant","size","disabled","error","filled","focused","required"]}),d=r({},n,{component:s,contained:"filled"===c.variant||"outlined"===c.variant,variant:c.variant,size:c.size,disabled:c.disabled,error:c.error,filled:c.filled,focused:c.focused,required:c.required}),f=function(e){var t=e.classes,n=e.contained,r=e.size,o=e.disabled,i=e.error,a=e.filled,l=e.focused,s=e.required;return Po({root:["root",o&&"disabled",i&&"error",r&&"size".concat(Eo(r)),n&&"contained",l&&"focused",a&&"filled",s&&"required"]},Jm,t)}(d);return(0,l.jsx)(rv,r({as:s,ownerState:d,className:wn(f.root,i),ref:t},u,{children:" "===o?ev||(ev=(0,l.jsx)("span",{className:"notranslate",children:"\u200b"})):o}))})),iv=ov;function av(e){return Qo("MuiTextField",e)}$o("MuiTextField",["root"]);var lv=["autoComplete","autoFocus","children","className","color","defaultValue","disabled","error","FormHelperTextProps","fullWidth","helperText","id","InputLabelProps","inputProps","InputProps","inputRef","label","maxRows","minRows","multiline","name","onBlur","onChange","onFocus","placeholder","required","rows","select","SelectProps","type","value","variant"],sv={standard:vm,filled:km,outlined:Lm},uv=Yo(Dp,{name:"MuiTextField",slot:"Root",overridesResolver:function(e,t){return t.root}})({}),cv=e.forwardRef((function(e,t){var n=ln({props:e,name:"MuiTextField"}),o=n.autoComplete,i=n.autoFocus,a=void 0!==i&&i,s=n.children,u=n.className,c=n.color,d=void 0===c?"primary":c,f=n.defaultValue,p=n.disabled,h=void 0!==p&&p,m=n.error,v=void 0!==m&&m,g=n.FormHelperTextProps,y=n.fullWidth,x=void 0!==y&&y,b=n.helperText,w=n.id,S=n.InputLabelProps,j=n.inputProps,k=n.InputProps,C=n.inputRef,R=n.label,T=n.maxRows,O=n.minRows,P=n.multiline,E=void 0!==P&&P,M=n.name,_=n.onBlur,D=n.onChange,I=n.onFocus,A=n.placeholder,N=n.required,L=void 0!==N&&N,z=n.rows,F=n.select,W=void 0!==F&&F,B=n.SelectProps,V=n.type,q=n.value,H=n.variant,U=void 0===H?"outlined":H,Y=Te(n,lv),G=r({},n,{autoFocus:a,color:d,disabled:h,error:v,fullWidth:x,multiline:E,required:L,select:W,variant:U}),Q=function(e){return Po({root:["root"]},av,e.classes)}(G);var $={};"outlined"===U&&(S&&"undefined"!==typeof S.shrink&&($.notched=S.shrink),$.label=R),W&&(B&&B.native||($.id=void 0),$["aria-describedby"]=void 0);var K=id(w),X=b&&K?"".concat(K,"-helper-text"):void 0,Z=R&&K?"".concat(K,"-label"):void 0,J=sv[U],ee=(0,l.jsx)(J,r({"aria-describedby":X,autoComplete:o,autoFocus:a,defaultValue:f,fullWidth:x,multiline:E,name:M,rows:z,maxRows:T,minRows:O,type:V,value:q,id:K,inputRef:C,onBlur:_,onChange:D,onFocus:I,placeholder:A,inputProps:j},$,k));return(0,l.jsxs)(uv,r({className:wn(Q.root,u),disabled:h,error:v,fullWidth:x,ref:t,required:L,color:d,variant:U,ownerState:G},Y,{children:[null!=R&&""!==R&&(0,l.jsx)(Up,r({htmlFor:K,id:Z},S,{children:R})),W?(0,l.jsx)(Hm,r({"aria-describedby":X,id:K,labelId:Z,value:q,input:ee},B,{children:s})):ee,b&&(0,l.jsx)(iv,r({id:X},g,{children:b}))]}))})),dv=cv;function fv(e){return Qo("MuiInputAdornment",e)}var pv,hv=$o("MuiInputAdornment",["root","filled","standard","outlined","positionStart","positionEnd","disablePointerEvents","hiddenLabel","sizeSmall"]),mv=["children","className","component","disablePointerEvents","disableTypography","position","variant"],vv=Yo("div",{name:"MuiInputAdornment",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,t["position".concat(Eo(n.position))],!0===n.disablePointerEvents&&t.disablePointerEvents,t[n.variant]]}})((function(e){var t=e.theme,n=e.ownerState;return r({display:"flex",height:"0.01em",maxHeight:"2em",alignItems:"center",whiteSpace:"nowrap",color:(t.vars||t).palette.action.active},"filled"===n.variant&&Ee({},"&.".concat(hv.positionStart,"&:not(.").concat(hv.hiddenLabel,")"),{marginTop:16}),"start"===n.position&&{marginRight:8},"end"===n.position&&{marginLeft:8},!0===n.disablePointerEvents&&{pointerEvents:"none"})})),gv=e.forwardRef((function(t,n){var o=ln({props:t,name:"MuiInputAdornment"}),i=o.children,a=o.className,s=o.component,u=void 0===s?"div":s,c=o.disablePointerEvents,d=void 0!==c&&c,f=o.disableTypography,p=void 0!==f&&f,h=o.position,m=o.variant,v=Te(o,mv),g=Pd()||{},y=m;m&&g.variant,g&&!y&&(y=g.variant);var x=r({},o,{hiddenLabel:g.hiddenLabel,size:g.size,disablePointerEvents:d,position:h,variant:y}),b=function(e){var t=e.classes,n=e.disablePointerEvents,r=e.hiddenLabel,o=e.position,i=e.size,a=e.variant;return Po({root:["root",n&&"disablePointerEvents",o&&"position".concat(Eo(o)),a,r&&"hiddenLabel",i&&"size".concat(Eo(i))]},fv,t)}(x);return(0,l.jsx)(Od.Provider,{value:null,children:(0,l.jsx)(vv,r({as:u,ownerState:x,className:wn(b.root,a),ref:n},v,{children:"string"!==typeof i||p?(0,l.jsxs)(e.Fragment,{children:["start"===h?pv||(pv=(0,l.jsx)("span",{className:"notranslate",children:"\u200b"})):null,i]}):(0,l.jsx)(Wi,{color:"text.secondary",children:i})}))})})),yv=gv,xv=Ml((0,l.jsx)("path",{d:"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z"}),"ArrowBack"),bv=Ml((0,l.jsx)("path",{d:"M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z"}),"Cancel"),wv=Ml((0,l.jsx)("path",{d:"m12 4-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z"}),"ArrowForward");function Sv(e,t){var n="undefined"!==typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=Ae(e))||t&&e&&"number"===typeof e.length){n&&(e=n);var r=0,o=function(){};return{s:o,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,l=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return a=e.done,e},e:function(e){l=!0,i=e},f:function(){try{a||null==n.return||n.return()}finally{if(l)throw i}}}}function jv(e,t){if(null==e)return{};var n,r,o=Te(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var kv=["name"],Cv=["_f"],Rv=["_f"],Tv=function(e){return"checkbox"===e.type},Ov=function(e){return e instanceof Date},Pv=function(e){return null==e},Ev=function(e){return"object"===typeof e},Mv=function(e){return!Pv(e)&&!Array.isArray(e)&&Ev(e)&&!Ov(e)},_v=function(e){return Mv(e)&&e.target?Tv(e.target)?e.target.checked:e.target.value:e},Dv=function(e,t){return e.has(function(e){return e.substring(0,e.search(/\.\d+(\.|$)/))||e}(t))},Iv=function(e){return Array.isArray(e)?e.filter(Boolean):[]},Av=function(e){return void 0===e},Nv=function(e,t,n){if(!t||!Mv(e))return n;var r=Iv(t.split(/[,[\].]+?/)).reduce((function(e,t){return Pv(e)?e:e[t]}),e);return Av(r)||r===e?Av(e[t])?n:e[t]:r},Lv="blur",zv="focusout",Fv="change",Wv="onBlur",Bv="onChange",Vv="onSubmit",qv="onTouched",Hv="all",Uv="max",Yv="min",Gv="maxLength",Qv="minLength",$v="pattern",Kv="required",Xv="validate",Zv=e.createContext(null),Jv=function(){return e.useContext(Zv)},eg=function(e,t,n){var r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],o={defaultValues:t._defaultValues},i=function(i){Object.defineProperty(o,i,{get:function(){var o=i;return t._proxyFormState[o]!==Hv&&(t._proxyFormState[o]=!r||Hv),n&&(n[o]=!0),e[o]}})};for(var a in e)i(a);return o},tg=function(e){return Mv(e)&&!Object.keys(e).length},ng=function(e,t,n){e.name;var r=jv(e,kv);return tg(r)||Object.keys(r).length>=Object.keys(t).length||Object.keys(r).find((function(e){return t[e]===(!n||Hv)}))},rg=function(e){return Array.isArray(e)?e:[e]},og=function(e,t,n){return n&&t?e===t:!e||!t||e===t||rg(e).some((function(e){return e&&(e.startsWith(t)||t.startsWith(e))}))};function ig(t){var n=e.useRef(t);n.current=t,e.useEffect((function(){var e=!t.disabled&&n.current.subject.subscribe({next:n.current.callback});return function(){e&&e.unsubscribe()}}),[t.disabled])}var ag=function(e){return"string"===typeof e},lg=function(e,t,n,r){var o=Array.isArray(e);return ag(e)?(r&&t.watch.add(e),Nv(n,e)):o?e.map((function(e){return r&&t.watch.add(e),Nv(n,e)})):(r&&(t.watchAll=!0),n)},sg=function(e){return"function"===typeof e},ug=function(e){for(var t in e)if(sg(e[t]))return!0;return!1};function cg(t){var n=Jv(),r=t||{},o=r.control,i=void 0===o?n.control:o,a=r.name,l=r.defaultValue,s=r.disabled,u=r.exact,c=e.useRef(a);c.current=a,ig({disabled:s,subject:i._subjects.watch,callback:e.useCallback((function(e){if(og(c.current,e.name,u)){var t=lg(c.current,i._names,e.values||i._formValues);p(Av(c.current)||Mv(t)&&!ug(t)?Rp({},t):Array.isArray(t)?Rr(t):Av(t)?l:t)}}),[i,u,l])});var d=Ne(e.useState(Av(l)?i._getWatch(a):l),2),f=d[0],p=d[1];return e.useEffect((function(){return i._removeUnmounted()})),f}function dg(t){var n=Jv(),r=t.name,o=t.control,i=void 0===o?n.control:o,a=t.shouldUnregister,l=Dv(i._names.array,r),s=cg({control:i,name:r,defaultValue:Nv(i._formValues,r,Nv(i._defaultValues,r,t.defaultValue)),exact:!0}),u=function(t){var n=Jv(),r=t||{},o=r.control,i=void 0===o?n.control:o,a=r.disabled,l=r.name,s=r.exact,u=Ne(e.useState(i._formState),2),c=u[0],d=u[1],f=e.useRef(!0),p=e.useRef({isDirty:!1,dirtyFields:!1,touchedFields:!1,isValidating:!1,isValid:!1,errors:!1}),h=e.useRef(l);return h.current=l,ig({disabled:a,callback:e.useCallback((function(e){return f.current&&og(h.current,e.name,s)&&ng(e,p.current)&&d(Rp(Rp({},i._formState),e))}),[i,s]),subject:i._subjects.state}),e.useEffect((function(){return f.current=!0,function(){f.current=!1}}),[]),eg(c,i,p.current,!1)}({control:i,name:r}),c=e.useRef(i.register(r,Rp(Rp({},t.rules),{},{value:s})));return e.useEffect((function(){var e=function(e,t){var n=Nv(i._fields,e);n&&(n._f.mount=t)};return e(r,!0),function(){var t=i._options.shouldUnregister||a;(l?t&&!i._stateFlags.action:t)?i.unregister(r):e(r,!1)}}),[r,i,l,a]),{field:{name:r,value:s,onChange:e.useCallback((function(e){return c.current.onChange({target:{value:_v(e),name:r},type:Fv})}),[r]),onBlur:e.useCallback((function(){return c.current.onBlur({target:{value:Nv(i._formValues,r),name:r},type:Lv})}),[r,i]),ref:function(e){var t=Nv(i._fields,r);t&&e&&(t._f.ref={focus:function(){return e.focus()},select:function(){return e.select()},setCustomValidity:function(t){return e.setCustomValidity(t)},reportValidity:function(){return e.reportValidity()}})}},formState:u,fieldState:Object.defineProperties({},{invalid:{enumerable:!0,get:function(){return!!Nv(u.errors,r)}},isDirty:{enumerable:!0,get:function(){return!!Nv(u.dirtyFields,r)}},isTouched:{enumerable:!0,get:function(){return!!Nv(u.touchedFields,r)}},error:{enumerable:!0,get:function(){return Nv(u.errors,r)}}})}}var fg=function(e){return e.render(dg(e))},pg=function(e,t,n,r,o){return t?Rp(Rp({},n[e]),{},{types:Rp(Rp({},n[e]&&n[e].types?n[e].types:{}),{},Ee({},r,o||!0))}):{}},hg=function(e){return/^\w*$/.test(e)},mg=function(e){return Iv(e.replace(/["|']|\]/g,"").split(/\.|\[/))};function vg(e,t,n){for(var r=-1,o=hg(t)?[t]:mg(t),i=o.length,a=i-1;++r<i;){var l=o[r],s=n;if(r!==a){var u=e[l];s=Mv(u)||Array.isArray(u)?u:isNaN(+o[r+1])?{}:[]}e[l]=s,e=e[l]}return e}var gg=function e(t,n,r){var o,i=Sv(r||Object.keys(t));try{for(i.s();!(o=i.n()).done;){var a=o.value,l=Nv(t,a);if(l){var s=l._f,u=jv(l,Cv);if(s&&n(s.name)){if(s.ref.focus){s.ref.focus();break}if(s.refs&&s.refs[0].focus){s.refs[0].focus();break}}else Mv(u)&&e(u,n)}}}catch(c){i.e(c)}finally{i.f()}},yg=function(e,t,n){return!n&&(t.watchAll||t.watch.has(e)||Rr(t.watch).some((function(t){return e.startsWith(t)&&/^\.\w+/.test(e.slice(t.length))})))},xg=function(e,t,n){var r=Iv(Nv(e,n));return vg(r,"root",t[n]),vg(e,n,r),e},bg=function(e){return"boolean"===typeof e},wg=function(e){return"file"===e.type},Sg=function(t){return ag(t)||e.isValidElement(t)},jg=function(e){return"radio"===e.type},kg=function(e){return e instanceof RegExp},Cg={value:!1,isValid:!1},Rg={value:!0,isValid:!0},Tg=function(e){if(Array.isArray(e)){if(e.length>1){var t=e.filter((function(e){return e&&e.checked&&!e.disabled})).map((function(e){return e.value}));return{value:t,isValid:!!t.length}}return e[0].checked&&!e[0].disabled?e[0].attributes&&!Av(e[0].attributes.value)?Av(e[0].value)||""===e[0].value?Rg:{value:e[0].value,isValid:!0}:Rg:Cg}return Cg},Og={isValid:!1,value:null},Pg=function(e){return Array.isArray(e)?e.reduce((function(e,t){return t&&t.checked&&!t.disabled?{isValid:!0,value:t.value}:e}),Og):Og};function Eg(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"validate";if(Sg(e)||Array.isArray(e)&&e.every(Sg)||bg(e)&&!e)return{type:n,message:Sg(e)?e:"",ref:t}}var Mg=function(e){return Mv(e)&&!kg(e)?e:{value:e,message:""}},_g=function(){var e=Hc(Vc().mark((function e(t,n,r,o,i){var a,l,s,u,c,d,f,p,h,m,v,g,y,x,b,w,S,j,k,C,R,T,O,P,E,M,_,D,I,A,N,L,z,F,W,B,V,q,H,U,Y,G,Q,$,K,X,Z;return Vc().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=t._f,l=a.ref,s=a.refs,u=a.required,c=a.maxLength,d=a.minLength,f=a.min,p=a.max,h=a.pattern,m=a.validate,v=a.name,g=a.valueAsNumber,y=a.mount,x=a.disabled,y&&!x){e.next=3;break}return e.abrupt("return",{});case 3:if(b=s?s[0]:l,w=function(e){o&&b.reportValidity&&(b.setCustomValidity(bg(e)?"":e||" "),b.reportValidity())},S={},j=jg(l),k=Tv(l),C=j||k,R=(g||wg(l))&&!l.value||""===n||Array.isArray(n)&&!n.length,T=pg.bind(null,v,r,S),O=function(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:Gv,o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:Qv,i=e?t:n;S[v]=Rp({type:e?r:o,message:i,ref:l},T(e?r:o,i))},!(i?!Array.isArray(n)||!n.length:u&&(!C&&(R||Pv(n))||bg(n)&&!n||k&&!Tg(s).isValid||j&&!Pg(s).isValid))){e.next=19;break}if(P=Sg(u)?{value:!!u,message:u}:Mg(u),E=P.value,M=P.message,!E){e.next=19;break}if(S[v]=Rp({type:Kv,message:M,ref:b},T(Kv,M)),r){e.next=19;break}return w(M),e.abrupt("return",S);case 19:if(R||Pv(f)&&Pv(p)){e.next=28;break}if(I=Mg(p),A=Mg(f),Pv(n)||isNaN(n)?(L=l.valueAsDate||new Date(n),z=function(e){return new Date((new Date).toDateString()+" "+e)},F="time"==l.type,W="week"==l.type,ag(I.value)&&n&&(_=F?z(n)>z(I.value):W?n>I.value:L>new Date(I.value)),ag(A.value)&&n&&(D=F?z(n)<z(A.value):W?n<A.value:L<new Date(A.value))):(N=l.valueAsNumber||(n?+n:n),Pv(I.value)||(_=N>I.value),Pv(A.value)||(D=N<A.value)),!_&&!D){e.next=28;break}if(O(!!_,I.message,A.message,Uv,Yv),r){e.next=28;break}return w(S[v].message),e.abrupt("return",S);case 28:if(!c&&!d||R||!(ag(n)||i&&Array.isArray(n))){e.next=38;break}if(B=Mg(c),V=Mg(d),q=!Pv(B.value)&&n.length>B.value,H=!Pv(V.value)&&n.length<V.value,!q&&!H){e.next=38;break}if(O(q,B.message,V.message),r){e.next=38;break}return w(S[v].message),e.abrupt("return",S);case 38:if(!h||R||!ag(n)){e.next=45;break}if(U=Mg(h),Y=U.value,G=U.message,!kg(Y)||n.match(Y)){e.next=45;break}if(S[v]=Rp({type:$v,message:G,ref:l},T($v,G)),r){e.next=45;break}return w(G),e.abrupt("return",S);case 45:if(!m){e.next=79;break}if(!sg(m)){e.next=58;break}return e.next=49,m(n);case 49:if(Q=e.sent,!($=Eg(Q,b))){e.next=56;break}if(S[v]=Rp(Rp({},$),T(Xv,$.message)),r){e.next=56;break}return w($.message),e.abrupt("return",S);case 56:e.next=79;break;case 58:if(!Mv(m)){e.next=79;break}K={},e.t0=Vc().keys(m);case 61:if((e.t1=e.t0()).done){e.next=75;break}if(X=e.t1.value,tg(K)||r){e.next=65;break}return e.abrupt("break",75);case 65:return e.t2=Eg,e.next=68,m[X](n);case 68:e.t3=e.sent,e.t4=b,e.t5=X,(Z=(0,e.t2)(e.t3,e.t4,e.t5))&&(K=Rp(Rp({},Z),T(X,Z.message)),w(Z.message),r&&(S[v]=K)),e.next=61;break;case 75:if(tg(K)){e.next=79;break}if(S[v]=Rp({ref:b},K),r){e.next=79;break}return e.abrupt("return",S);case 79:return w(!0),e.abrupt("return",S);case 81:case"end":return e.stop()}}),e)})));return function(t,n,r,o,i){return e.apply(this,arguments)}}();var Dg="undefined"!==typeof window&&"undefined"!==typeof window.HTMLElement&&"undefined"!==typeof document;function Ig(e){var t,n=Array.isArray(e);if(e instanceof Date)t=new Date(e);else if(e instanceof Set)t=new Set(e);else{if(Dg&&(e instanceof Blob||e instanceof FileList)||!n&&!Mv(e))return e;if(t=n?[]:{},Array.isArray(e)||function(e){var t=e.constructor&&e.constructor.prototype;return Mv(t)&&t.hasOwnProperty("isPrototypeOf")}(e))for(var r in e)t[r]=Ig(e[r]);else t=e}return t}var Ag=function(e){return{isOnSubmit:!e||e===Vv,isOnBlur:e===Wv,isOnChange:e===Bv,isOnAll:e===Hv,isOnTouch:e===qv}};function Ng(e){for(var t in e)if(!Av(e[t]))return!1;return!0}function Lg(e,t){var n,r=hg(t)?[t]:mg(t),o=1==r.length?e:function(e,t){for(var n=t.slice(0,-1).length,r=0;r<n;)e=Av(e)?r++:e[t[r++]];return e}(e,r),i=r[r.length-1];o&&delete o[i];for(var a=0;a<r.slice(0,-1).length;a++){var l=-1,s=void 0,u=r.slice(0,-(a+1)),c=u.length-1;for(a>0&&(n=e);++l<u.length;){var d=u[l];s=s?s[d]:e[d],c===l&&(Mv(s)&&tg(s)||Array.isArray(s)&&Ng(s))&&(n?delete n[d]:delete e[d]),n=s}}return e}function zg(){var e=[];return{get observers(){return e},next:function(t){var n,r=Sv(e);try{for(r.s();!(n=r.n()).done;){n.value.next(t)}}catch(o){r.e(o)}finally{r.f()}},subscribe:function(t){return e.push(t),{unsubscribe:function(){e=e.filter((function(e){return e!==t}))}}},unsubscribe:function(){e=[]}}}var Fg=function(e){return Pv(e)||!Ev(e)};function Wg(e,t){if(Fg(e)||Fg(t))return e===t;if(Ov(e)&&Ov(t))return e.getTime()===t.getTime();var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(var o=0,i=n;o<i.length;o++){var a=i[o],l=e[a];if(!r.includes(a))return!1;if("ref"!==a){var s=t[a];if(Ov(l)&&Ov(s)||Mv(l)&&Mv(s)||Array.isArray(l)&&Array.isArray(s)?!Wg(l,s):l!==s)return!1}}return!0}var Bg=function(e){var t=e?e.ownerDocument:0;return e instanceof(t&&t.defaultView?t.defaultView.HTMLElement:HTMLElement)},Vg=function(e){return"select-multiple"===e.type},qg=function(e){return jg(e)||Tv(e)},Hg=function(e){return Bg(e)&&e.isConnected};function Ug(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=Array.isArray(e);if(Mv(e)||n)for(var r in e)Array.isArray(e[r])||Mv(e[r])&&!ug(e[r])?(t[r]=Array.isArray(e[r])?[]:{},Ug(e[r],t[r])):Pv(e[r])||(t[r]=!0);return t}function Yg(e,t,n){var r=Array.isArray(e);if(Mv(e)||r)for(var o in e)Array.isArray(e[o])||Mv(e[o])&&!ug(e[o])?Av(t)||Fg(n[o])?n[o]=Array.isArray(e[o])?Ug(e[o],[]):Rp({},Ug(e[o])):Yg(e[o],Pv(t)?{}:t[o],n[o]):n[o]=!Wg(e[o],t[o]);return n}var Gg=function(e,t){return Yg(e,t,Ug(t))},Qg=function(e,t){var n=t.valueAsNumber,r=t.valueAsDate,o=t.setValueAs;return Av(e)?e:n?""===e?NaN:e?+e:e:r&&ag(e)?new Date(e):o?o(e):e};function $g(e){var t=e.ref;if(!(e.refs?e.refs.every((function(e){return e.disabled})):t.disabled))return wg(t)?t.files:jg(t)?Pg(e.refs).value:Vg(t)?Rr(t.selectedOptions).map((function(e){return e.value})):Tv(t)?Tg(e.refs).value:Qg(Av(t.value)?e.ref.value:t.value,e)}var Kg=function(e,t,n,r){var o,i={},a=Sv(e);try{for(a.s();!(o=a.n()).done;){var l=o.value,s=Nv(t,l);s&&vg(i,l,s._f)}}catch(u){a.e(u)}finally{a.f()}return{criteriaMode:n,names:Rr(e),fields:i,shouldUseNativeValidation:r}},Xg=function(e){return Av(e)?void 0:kg(e)?e.source:Mv(e)?kg(e.value)?e.value.source:e.value:e},Zg=function(e){return e.mount&&(e.required||e.min||e.max||e.maxLength||e.minLength||e.pattern||e.validate)};function Jg(e,t,n){var r=Nv(e,n);if(r||hg(n))return{error:r,name:n};for(var o=n.split(".");o.length;){var i=o.join("."),a=Nv(t,i),l=Nv(e,i);if(a&&!Array.isArray(a)&&n!==i)return{name:n};if(l&&l.type)return{name:i,error:l};o.pop()}return{name:n}}var ey=function(e,t,n,r,o){return!o.isOnAll&&(!n&&o.isOnTouch?!(t||e):(n?r.isOnBlur:o.isOnBlur)?!e:!(n?r.isOnChange:o.isOnChange)||e)},ty=function(e,t){return!Iv(Nv(e,t)).length&&Lg(e,t)},ny={mode:Vv,reValidateMode:Bv,shouldFocusError:!0};function ry(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=Rp(Rp({},ny),t),r={submitCount:0,isDirty:!1,isValidating:!1,isSubmitted:!1,isSubmitting:!1,isSubmitSuccessful:!1,isValid:!1,touchedFields:{},dirtyFields:{},errors:{}},o={},i=Ig(n.defaultValues)||{},a=n.shouldUnregister?{}:Ig(i),l={action:!1,mount:!1,watch:!1},s={mount:new Set,unMount:new Set,array:new Set,watch:new Set},u=0,c={},d={isDirty:!1,dirtyFields:!1,touchedFields:!1,isValidating:!1,isValid:!1,errors:!1},f={watch:zg(),array:zg(),state:zg()},p=Ag(n.mode),h=Ag(n.reValidateMode),m=n.criteriaMode===Hv,v=function(e){return function(t){clearTimeout(u),u=window.setTimeout(e,t)}},g=function(){var e=Hc(Vc().mark((function e(t){var i;return Vc().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(i=!1,!d.isValid){e.next=15;break}if(!n.resolver){e.next=10;break}return e.t1=tg,e.next=6,j();case 6:e.t2=e.sent.errors,e.t0=(0,e.t1)(e.t2),e.next=13;break;case 10:return e.next=12,C(o,!0);case 12:e.t0=e.sent;case 13:i=e.t0,t||i===r.isValid||(r.isValid=i,f.state.next({isValid:i}));case 15:return e.abrupt("return",i);case 16:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),y=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2?arguments[2]:void 0,s=arguments.length>3?arguments[3]:void 0,u=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],c=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];if(s&&n){if(l.action=!0,c&&Array.isArray(Nv(o,e))){var p=n(Nv(o,e),s.argA,s.argB);u&&vg(o,e,p)}if(d.errors&&c&&Array.isArray(Nv(r.errors,e))){var h=n(Nv(r.errors,e),s.argA,s.argB);u&&vg(r.errors,e,h),ty(r.errors,e)}if(d.touchedFields&&c&&Array.isArray(Nv(r.touchedFields,e))){var m=n(Nv(r.touchedFields,e),s.argA,s.argB);u&&vg(r.touchedFields,e,m)}d.dirtyFields&&(r.dirtyFields=Gg(i,a)),f.state.next({isDirty:T(e,t),dirtyFields:r.dirtyFields,errors:r.errors,isValid:r.isValid})}else vg(a,e,t)},x=function(e,t){vg(r.errors,e,t),f.state.next({errors:r.errors})},b=function(e,t,n,r){var s=Nv(o,e);if(s){var u=Nv(a,e,Av(n)?Nv(i,e):n);Av(u)||r&&r.defaultChecked||t?vg(a,e,t?u:$g(s._f)):E(e,u),l.mount&&g()}},w=function(e,t,n,o,a){var l=!1,s={name:e},u=Nv(r.touchedFields,e);if(d.isDirty){var c=r.isDirty;r.isDirty=s.isDirty=T(),l=c!==s.isDirty}if(d.dirtyFields&&(!n||o)){var p=Nv(r.dirtyFields,e);Wg(Nv(i,e),t)?Lg(r.dirtyFields,e):vg(r.dirtyFields,e,!0),s.dirtyFields=r.dirtyFields,l=l||p!==Nv(r.dirtyFields,e)}return n&&!u&&(vg(r.touchedFields,e,n),s.touchedFields=r.touchedFields,l=l||d.touchedFields&&u!==n),l&&a&&f.state.next(s),l?s:{}},S=function(){var n=Hc(Vc().mark((function n(o,i,a,l){var s,p,h;return Vc().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:s=Nv(r.errors,o),p=d.isValid&&r.isValid!==i,t.delayError&&a?(e=v((function(){return x(o,a)})))(t.delayError):(clearTimeout(u),e=null,a?vg(r.errors,o,a):Lg(r.errors,o)),(a?Wg(s,a):!s)&&tg(l)&&!p||(h=Rp(Rp(Rp({},l),p?{isValid:i}:{}),{},{errors:r.errors,name:o}),r=Rp(Rp({},r),h),f.state.next(h)),c[o]--,d.isValidating&&!Object.values(c).some((function(e){return e}))&&(f.state.next({isValidating:!1}),c={});case 6:case"end":return n.stop()}}),n)})));return function(e,t,r,o){return n.apply(this,arguments)}}(),j=function(){var e=Hc(Vc().mark((function e(t){return Vc().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!n.resolver){e.next=6;break}return e.next=3,n.resolver(Rp({},a),n.context,Kg(t||s.mount,o,n.criteriaMode,n.shouldUseNativeValidation));case 3:e.t0=e.sent,e.next=7;break;case 6:e.t0={};case 7:return e.abrupt("return",e.t0);case 8:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),k=function(){var e=Hc(Vc().mark((function e(t){var n,o,i,a,l,s;return Vc().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,j();case 2:if(n=e.sent,o=n.errors,t){i=Sv(t);try{for(i.s();!(a=i.n()).done;)l=a.value,(s=Nv(o,l))?vg(r.errors,l,s):Lg(r.errors,l)}catch(u){i.e(u)}finally{i.f()}}else r.errors=o;return e.abrupt("return",o);case 6:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),C=function(){var e=Hc(Vc().mark((function e(t,o){var i,l,u,c,d,f,p,h=arguments;return Vc().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=h.length>2&&void 0!==h[2]?h[2]:{valid:!0},e.t0=Vc().keys(t);case 2:if((e.t1=e.t0()).done){e.next=23;break}if(l=e.t1.value,!(u=t[l])){e.next=21;break}if(c=u._f,d=jv(u,Rv),!c){e.next=17;break}return f=s.array.has(c.name),e.next=11,_g(u,Nv(a,c.name),m,n.shouldUseNativeValidation,f);case 11:if(!(p=e.sent)[c.name]){e.next=16;break}if(i.valid=!1,!o){e.next=16;break}return e.abrupt("break",23);case 16:!o&&(Nv(p,c.name)?f?xg(r.errors,p,c.name):vg(r.errors,c.name,p[c.name]):Lg(r.errors,c.name));case 17:if(e.t2=d,!e.t2){e.next=21;break}return e.next=21,C(d,o,i);case 21:e.next=2;break;case 23:return e.abrupt("return",i.valid);case 24:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),R=function(){var e,t=Sv(s.unMount);try{for(t.s();!(e=t.n()).done;){var n=e.value,r=Nv(o,n);r&&(r._f.refs?r._f.refs.every((function(e){return!Hg(e)})):!Hg(r._f.ref))&&W(n)}}catch(i){t.e(i)}finally{t.f()}s.unMount=new Set},T=function(e,t){return e&&t&&vg(a,e,t),!Wg(A(),i)},O=function(e,t,n){var r=Rp({},l.mount?a:Av(t)?i:ag(e)?Ee({},e,t):t);return lg(e,s,r,n)},P=function(e){return Iv(Nv(l.mount?a:i,e,t.shouldUnregister?Nv(i,e,[]):[]))},E=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=Nv(o,e),i=t;if(r){var l=r._f;l&&(!l.disabled&&vg(a,e,Qg(t,l)),i=Dg&&Bg(l.ref)&&Pv(t)?"":t,Vg(l.ref)?Rr(l.ref.options).forEach((function(e){return e.selected=i.includes(e.value)})):l.refs?Tv(l.ref)?l.refs.length>1?l.refs.forEach((function(e){return(!e.defaultChecked||!e.disabled)&&(e.checked=Array.isArray(i)?!!i.find((function(t){return t===e.value})):i===e.value)})):l.refs[0]&&(l.refs[0].checked=!!i):l.refs.forEach((function(e){return e.checked=e.value===i})):wg(l.ref)?l.ref.value="":(l.ref.value=i,l.ref.type||f.watch.next({name:e})))}(n.shouldDirty||n.shouldTouch)&&w(e,i,n.shouldTouch,n.shouldDirty,!0),n.shouldValidate&&I(e)},M=function e(t,n,r){for(var i in n){var a=n[i],l="".concat(t,".").concat(i),u=Nv(o,l);!s.array.has(t)&&Fg(a)&&(!u||u._f)||Ov(a)?E(l,a,r):e(l,a,r)}},_=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},l=Nv(o,e),u=s.array.has(e),c=Ig(t);vg(a,e,c),u?(f.array.next({name:e,values:a}),(d.isDirty||d.dirtyFields)&&n.shouldDirty&&(r.dirtyFields=Gg(i,a),f.state.next({name:e,dirtyFields:r.dirtyFields,isDirty:T(e,c)}))):!l||l._f||Pv(c)?E(e,c,n):M(e,c,n),yg(e,s)&&f.state.next({}),f.watch.next({name:e})},D=function(){var t=Hc(Vc().mark((function t(i){var l,u,d,v,y,x,b,k,C,R,T,O,P,E,M;return Vc().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(l=i.target,u=l.name,!(d=Nv(o,u))){t.next=39;break}if(x=l.type?$g(d._f):_v(i),b=i.type===Lv||i.type===zv,k=!Zg(d._f)&&!n.resolver&&!Nv(r.errors,u)&&!d._f.deps||ey(b,Nv(r.touchedFields,u),r.isSubmitted,h,p),C=yg(u,s,b),vg(a,u,x),b?(d._f.onBlur&&d._f.onBlur(i),e&&e(0)):d._f.onChange&&d._f.onChange(i),R=w(u,x,b,!1),T=!tg(R)||C,!b&&f.watch.next({name:u,type:i.type}),!k){t.next=15;break}return t.abrupt("return",T&&f.state.next(Rp({name:u},C?{}:R)));case 15:if(!b&&C&&f.state.next({}),c[u]=(c[u],1),f.state.next({isValidating:!0}),!n.resolver){t.next=30;break}return t.next=21,j([u]);case 21:O=t.sent,P=O.errors,E=Jg(r.errors,o,u),M=Jg(P,o,E.name||u),v=M.error,u=M.name,y=tg(P),t.next=37;break;case 30:return t.next=32,_g(d,Nv(a,u),m,n.shouldUseNativeValidation);case 32:return t.t0=u,v=t.sent[t.t0],t.next=36,g(!0);case 36:y=t.sent;case 37:d._f.deps&&I(d._f.deps),S(u,y,v,R);case 39:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}(),I=function(){var e=Hc(Vc().mark((function e(t){var i,a,l,u,c,p=arguments;return Vc().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(i=p.length>1&&void 0!==p[1]?p[1]:{},u=rg(t),f.state.next({isValidating:!0}),!n.resolver){e.next=11;break}return e.next=6,k(Av(t)?t:u);case 6:c=e.sent,a=tg(c),l=t?!u.some((function(e){return Nv(c,e)})):a,e.next=21;break;case 11:if(!t){e.next=18;break}return e.next=14,Promise.all(u.map(function(){var e=Hc(Vc().mark((function e(t){var n;return Vc().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=Nv(o,t),e.next=3,C(n&&n._f?Ee({},t,n):n);case 3:return e.abrupt("return",e.sent);case 4:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()));case 14:((l=e.sent.every(Boolean))||r.isValid)&&g(),e.next=21;break;case 18:return e.next=20,C(o);case 20:l=a=e.sent;case 21:return f.state.next(Rp(Rp(Rp({},!ag(t)||d.isValid&&a!==r.isValid?{}:{name:t}),n.resolver||!t?{isValid:a}:{}),{},{errors:r.errors,isValidating:!1})),i.shouldFocus&&!l&&gg(o,(function(e){return e&&Nv(r.errors,e)}),t?u:s.mount),e.abrupt("return",l);case 24:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),A=function(e){var t=Rp(Rp({},i),l.mount?a:{});return Av(e)?t:ag(e)?Nv(t,e):e.map((function(e){return Nv(t,e)}))},N=function(e,t){return{invalid:!!Nv((t||r).errors,e),isDirty:!!Nv((t||r).dirtyFields,e),isTouched:!!Nv((t||r).touchedFields,e),error:Nv((t||r).errors,e)}},L=function(e){e?rg(e).forEach((function(e){return Lg(r.errors,e)})):r.errors={},f.state.next({errors:r.errors})},z=function(e,t,n){var i=(Nv(o,e,{_f:{}})._f||{}).ref;vg(r.errors,e,Rp(Rp({},t),{},{ref:i})),f.state.next({name:e,errors:r.errors,isValid:!1}),n&&n.shouldFocus&&i&&i.focus&&i.focus()},F=function(e,t){return sg(e)?f.watch.subscribe({next:function(n){return e(O(void 0,t),n)}}):O(e,t,!0)},W=function(e){var t,l=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},u=Sv(e?rg(e):s.mount);try{for(u.s();!(t=u.n()).done;){var c=t.value;s.mount.delete(c),s.array.delete(c),Nv(o,c)&&(l.keepValue||(Lg(o,c),Lg(a,c)),!l.keepError&&Lg(r.errors,c),!l.keepDirty&&Lg(r.dirtyFields,c),!l.keepTouched&&Lg(r.touchedFields,c),!n.shouldUnregister&&!l.keepDefaultValue&&Lg(i,c))}}catch(d){u.e(d)}finally{u.f()}f.watch.next({}),f.state.next(Rp(Rp({},r),l.keepDirty?{isDirty:T()}:{})),!l.keepIsValid&&g()},B=function e(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},u=Nv(o,t),c=bg(r.disabled);return vg(o,t,Rp(Rp({},u||{}),{},{_f:Rp(Rp({},u&&u._f?u._f:{ref:{name:t}}),{},{name:t,mount:!0},r)})),s.mount.add(t),u?c&&vg(a,t,r.disabled?void 0:Nv(a,t,$g(u._f))):b(t,!0,r.value),Rp(Rp(Rp({},c?{disabled:r.disabled}:{}),n.shouldUseNativeValidation?{required:!!r.required,min:Xg(r.min),max:Xg(r.max),minLength:Xg(r.minLength),maxLength:Xg(r.maxLength),pattern:Xg(r.pattern)}:{}),{},{name:t,onChange:D,onBlur:D,ref:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(a){if(a){e(t,r),u=Nv(o,t);var c=Av(a.value)&&a.querySelectorAll&&a.querySelectorAll("input,select,textarea")[0]||a,d=qg(c),f=u._f.refs||[];if(d?f.find((function(e){return e===c})):c===u._f.ref)return;vg(o,t,{_f:Rp(Rp({},u._f),d?{refs:[].concat(Rr(f.filter(Hg)),[c],Rr(Array.isArray(Nv(i,t))?[{}]:[])),ref:{type:c.type,name:t}}:{ref:c})}),b(t,!1,void 0,c)}else(u=Nv(o,t,{}))._f&&(u._f.mount=!1),(n.shouldUnregister||r.shouldUnregister)&&(!Dv(s.array,t)||!l.action)&&s.unMount.add(t)}))})},V=function(){return n.shouldFocusError&&gg(o,(function(e){return e&&Nv(r.errors,e)}),s.mount)},q=function(e,t){return function(){var i=Hc(Vc().mark((function i(l){var s,u,c,d,p;return Vc().wrap((function(i){for(;;)switch(i.prev=i.next){case 0:if(l&&(l.preventDefault&&l.preventDefault(),l.persist&&l.persist()),s=!0,u=Ig(a),f.state.next({isSubmitting:!0}),i.prev=4,!n.resolver){i.next=15;break}return i.next=8,j();case 8:c=i.sent,d=c.errors,p=c.values,r.errors=d,u=p,i.next=17;break;case 15:return i.next=17,C(o);case 17:if(!tg(r.errors)){i.next=23;break}return f.state.next({errors:{},isSubmitting:!0}),i.next=21,e(u,l);case 21:i.next=27;break;case 23:if(!t){i.next=26;break}return i.next=26,t(Rp({},r.errors),l);case 26:V();case 27:i.next=33;break;case 29:throw i.prev=29,i.t0=i.catch(4),s=!1,i.t0;case 33:return i.prev=33,r.isSubmitted=!0,f.state.next({isSubmitted:!0,isSubmitting:!1,isSubmitSuccessful:tg(r.errors)&&s,submitCount:r.submitCount+1,errors:r.errors}),i.finish(33);case 37:case"end":return i.stop()}}),i,null,[[4,29,33,37]])})));return function(e){return i.apply(this,arguments)}}()},H=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};Nv(o,e)&&(Av(t.defaultValue)?_(e,Nv(i,e)):(_(e,t.defaultValue),vg(i,e,t.defaultValue)),t.keepTouched||Lg(r.touchedFields,e),t.keepDirty||(Lg(r.dirtyFields,e),r.isDirty=t.defaultValue?T(e,Nv(i,e)):T()),t.keepError||(Lg(r.errors,e),d.isValid&&g()),f.state.next(Rp({},r)))},U=function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},u=e||i,c=Ig(u),p=e&&!tg(e)?c:i;if(n.keepDefaultValues||(i=u),!n.keepValues){if(n.keepDirtyValues){var h,m=Sv(s.mount);try{for(m.s();!(h=m.n()).done;){var v=h.value;Nv(r.dirtyFields,v)?vg(p,v,Nv(a,v)):_(v,Nv(p,v))}}catch(S){m.e(S)}finally{m.f()}}else{if(Dg&&Av(e)){var g,y=Sv(s.mount);try{for(y.s();!(g=y.n()).done;){var x=g.value,b=Nv(o,x);if(b&&b._f){var w=Array.isArray(b._f.refs)?b._f.refs[0]:b._f.ref;try{if(Bg(w)){w.closest("form").reset();break}}catch(j){}}}}catch(S){y.e(S)}finally{y.f()}}o={}}a=t.shouldUnregister?n.keepDefaultValues?Ig(i):{}:c,f.array.next({values:p}),f.watch.next({values:p})}s={mount:new Set,unMount:new Set,array:new Set,watch:new Set,watchAll:!1,focus:""},l.mount=!d.isValid||!!n.keepIsValid,l.watch=!!t.shouldUnregister,f.state.next({submitCount:n.keepSubmitCount?r.submitCount:0,isDirty:n.keepDirty||n.keepDirtyValues?r.isDirty:!(!n.keepDefaultValues||Wg(e,i)),isSubmitted:!!n.keepIsSubmitted&&r.isSubmitted,dirtyFields:n.keepDirty||n.keepDirtyValues?r.dirtyFields:n.keepDefaultValues&&e?Gg(i,e):{},touchedFields:n.keepTouched?r.touchedFields:{},errors:n.keepErrors?r.errors:{},isSubmitting:!1,isSubmitSuccessful:!1})},Y=function(e,t){return U(sg(e)?e(a):e,t)},G=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=Nv(o,e),r=n&&n._f;if(r){var i=r.refs?r.refs[0]:r.ref;i.focus&&(i.focus(),t.shouldSelect&&i.select())}};return{control:{register:B,unregister:W,getFieldState:N,_executeSchema:j,_focusError:V,_getWatch:O,_getDirty:T,_updateValid:g,_removeUnmounted:R,_updateFieldArray:y,_getFieldArray:P,_subjects:f,_proxyFormState:d,get _fields(){return o},get _formValues(){return a},get _stateFlags(){return l},set _stateFlags(e){l=e},get _defaultValues(){return i},get _names(){return s},set _names(e){s=e},get _formState(){return r},set _formState(e){r=e},get _options(){return n},set _options(e){n=Rp(Rp({},n),e)}},trigger:I,register:B,handleSubmit:q,watch:F,setValue:_,getValues:A,reset:Y,resetField:H,clearErrors:L,unregister:W,setError:z,setFocus:G,getFieldState:N}}function oy(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.useRef(),r=e.useState({isDirty:!1,isValidating:!1,isSubmitted:!1,isSubmitting:!1,isSubmitSuccessful:!1,isValid:!1,submitCount:0,dirtyFields:{},touchedFields:{},errors:{},defaultValues:t.defaultValues}),o=Ne(r,2),i=o[0],a=o[1];n.current||(n.current=Rp(Rp({},ry(t)),{},{formState:i}));var l=n.current.control;return l._options=t,ig({subject:l._subjects.state,callback:e.useCallback((function(e){ng(e,l._proxyFormState,!0)&&(l._formState=Rp(Rp({},l._formState),e),a(Rp({},l._formState)))}),[l])}),e.useEffect((function(){l._stateFlags.mount||(l._proxyFormState.isValid&&l._updateValid(),l._stateFlags.mount=!0),l._stateFlags.watch&&(l._stateFlags.watch=!1,l._subjects.state.next({})),l._removeUnmounted()})),e.useEffect((function(){i.submitCount&&l._focusError()}),[l,i.submitCount]),n.current.formState=eg(i,l),n.current}var iy=["Panel","Patient","Research","Verification"],ay=["Female","Male"],ly=["Extra Pulmonary","Pulmonary"],sy=["Negative","Positive","Unknown"],uy=["On Site","Off Site"],cy=["First Line","Second Line"],dy=["New","Relapse","Failure","DR-TB","Loss to follow up","Contact/KVPs","Other/Unknown"],fy=["Yes","No"],py=["CDC","EPHI","OneWorld Accuracy"],hy=["Xpert MTB XDR","Xpert MTB/RIF/Ultra"],my=["Instrument","Method","Lot-to-lot"],vy=/(\+\d{1,2}\s?)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}/.source,gy=new RegExp("^(".concat(vy,")(,(").concat(vy,"))*$")),yy=["Presumptive TB","Presumptive RR/MDR TB","Presumptive Pre-XDR/XDR","Presumptive INH Resistant TB","ZN/FM Smear Negative","ZN/FM Smear Positive"],xy=["Initial/Diagnostic - at 6 weeks","Confirmatory for Positive","At 9 months of age for previous Negative"],by=["Newly initiated","Known on ART","Not on ART","Unknown maternal HIV status"],wy=["Sputum","CSF","Ascitic fluid","Pleural fluid","Peritoneal fluid","Pericardial fluid","Lymph node aspirate","Stool","Urine","Blood","Bronchoalveolar lavage (BAL)","Tissue","Gastric aspirate & Gastric lavage","Endotracheal tube extraction","Tracheal aspirate","Others"],Sy=["Whole Blood","DBS"],jy=["Whole Blood","DBS","Plasma","DPS"],ky=["Routine","Targeted"],Cy=["Patients other than pregnant & breastfeeding","Pregnant mother","Breastfeeding mother","VL after EAC Support"],Ry=["At 6 months post ART","At 12 months post ART","Annual VL test","At 3 months post ART","At first ANC visit (on ART before conception)","At 34\u201336 weeks gestation (or at delivery)","Three months after delivery","Six months after first VL at postnatal period","Every six months until MTCT ends","Repeat VL (Initial VL >50 to \u22641000 copies/ml)","Confirmatory VL (Initial VL >1000 copies/ml)"],Ty=["Suspected ART Failure"],Oy=["First Line Regimen","Second Line Regimen","Third Line Regimen"],Py=function(e){var t=e.when,n=e.elseRender,r=e.render;return(0,l.jsx)(l.Fragment,{children:t?r():null===n||void 0===n?void 0:n()})};function Ey(e){return"undefined"!==typeof e.normalize?e.normalize("NFD").replace(/[\u0300-\u036f]/g,""):e}function My(e,t){for(var n=0;n<e.length;n+=1)if(t(e[n]))return n;return-1}var _y=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.ignoreAccents,n=void 0===t||t,r=e.ignoreCase,o=void 0===r||r,i=e.limit,a=e.matchFrom,l=void 0===a?"any":a,s=e.stringify,u=e.trim,c=void 0!==u&&u;return function(e,t){var r=t.inputValue,a=t.getOptionLabel,u=c?r.trim():r;o&&(u=u.toLowerCase()),n&&(u=Ey(u));var d=e.filter((function(e){var t=(s||a)(e);return o&&(t=t.toLowerCase()),n&&(t=Ey(t)),"start"===l?0===t.indexOf(u):t.indexOf(u)>-1}));return"number"===typeof i?d.slice(0,i):d}}();function Dy(t){var n,o=t.autoComplete,i=void 0!==o&&o,a=t.autoHighlight,l=void 0!==a&&a,s=t.autoSelect,u=void 0!==s&&s,c=t.blurOnSelect,d=void 0!==c&&c,f=t.clearOnBlur,p=void 0===f?!t.freeSolo:f,h=t.clearOnEscape,m=void 0!==h&&h,v=t.componentName,g=void 0===v?"useAutocomplete":v,y=t.defaultValue,x=void 0===y?t.multiple?[]:null:y,b=t.disableClearable,w=void 0!==b&&b,S=t.disableCloseOnSelect,j=void 0!==S&&S,k=t.disabled,C=t.disabledItemsFocusable,R=void 0!==C&&C,T=t.disableListWrap,O=void 0!==T&&T,P=t.filterOptions,E=void 0===P?_y:P,M=t.filterSelectedOptions,_=void 0!==M&&M,D=t.freeSolo,I=void 0!==D&&D,A=t.getOptionDisabled,N=t.getOptionLabel,L=void 0===N?function(e){var t;return null!=(t=e.label)?t:e}:N,z=t.groupBy,F=t.handleHomeEndKeys,W=void 0===F?!t.freeSolo:F,B=t.id,V=t.includeInputInList,q=void 0!==V&&V,H=t.inputValue,U=t.isOptionEqualToValue,Y=void 0===U?function(e,t){return e===t}:U,G=t.multiple,Q=void 0!==G&&G,$=t.onChange,K=t.onClose,X=t.onHighlightChange,Z=t.onInputChange,J=t.onOpen,ee=t.open,te=t.openOnFocus,ne=void 0!==te&&te,re=t.options,oe=t.readOnly,ie=void 0!==oe&&oe,ae=t.selectOnFocus,le=void 0===ae?!t.freeSolo:ae,se=t.value,ue=id(B);n=function(e){var t=L(e);return"string"!==typeof t?String(t):t};var ce=e.useRef(!1),de=e.useRef(!0),fe=e.useRef(null),pe=e.useRef(null),he=Ne(e.useState(null),2),me=he[0],ve=he[1],ge=Ne(e.useState(-1),2),ye=ge[0],xe=ge[1],be=l?0:-1,we=e.useRef(be),Se=Ne(Ad({controlled:se,default:x,name:g}),2),je=Se[0],ke=Se[1],Ce=Ne(Ad({controlled:H,default:"",name:g,state:"inputValue"}),2),Re=Ce[0],Te=Ce[1],Oe=Ne(e.useState(!1),2),Pe=Oe[0],Ee=Oe[1],Me=e.useCallback((function(e,t){if((Q?je.length<t.length:null!==t)||p){var r;if(Q)r="";else if(null==t)r="";else{var o=n(t);r="string"===typeof o?o:""}Re!==r&&(Te(r),Z&&Z(e,r,"reset"))}}),[n,Re,Q,Z,Te,p,je]),_e=e.useRef();e.useEffect((function(){var e=je!==_e.current;_e.current=je,Pe&&!e||I&&!e||Me(null,je)}),[je,Me,Pe,_e,I]);var De=Ne(Ad({controlled:ee,default:!1,name:g,state:"open"}),2),Ie=De[0],Ae=De[1],Le=Ne(e.useState(!0),2),ze=Le[0],Fe=Le[1],We=!Q&&null!=je&&Re===n(je),Be=Ie&&!ie,Ve=Be?E(re.filter((function(e){return!_||!(Q?je:[je]).some((function(t){return null!==t&&Y(e,t)}))})),{inputValue:We&&ze?"":Re,getOptionLabel:n}):[],qe=Ie&&Ve.length>0&&!ie,He=zl((function(e){-1===e?fe.current.focus():me.querySelector('[data-tag-index="'.concat(e,'"]')).focus()}));e.useEffect((function(){Q&&ye>je.length-1&&(xe(-1),He(-1))}),[je,Q,ye,He]);var Ue=zl((function(e){var t=e.event,n=e.index,r=e.reason,o=void 0===r?"auto":r;if(we.current=n,-1===n?fe.current.removeAttribute("aria-activedescendant"):fe.current.setAttribute("aria-activedescendant","".concat(ue,"-option-").concat(n)),X&&X(t,-1===n?null:Ve[n],o),pe.current){var i=pe.current.querySelector('[role="option"].Mui-focused');i&&(i.classList.remove("Mui-focused"),i.classList.remove("Mui-focusVisible"));var a=pe.current.parentElement.querySelector('[role="listbox"]');if(a)if(-1!==n){var l=pe.current.querySelector('[data-option-index="'.concat(n,'"]'));if(l&&(l.classList.add("Mui-focused"),"keyboard"===o&&l.classList.add("Mui-focusVisible"),a.scrollHeight>a.clientHeight&&"mouse"!==o)){var s=l,u=a.clientHeight+a.scrollTop,c=s.offsetTop+s.offsetHeight;c>u?a.scrollTop=c-a.clientHeight:s.offsetTop-s.offsetHeight*(z?1.3:0)<a.scrollTop&&(a.scrollTop=s.offsetTop-s.offsetHeight*(z?1.3:0))}}else a.scrollTop=0}})),Ye=zl((function(e){var t=e.event,r=e.diff,o=e.direction,a=void 0===o?"next":o,l=e.reason,s=void 0===l?"auto":l;if(Be){var u=function(e,t){if(!pe.current||-1===e)return-1;for(var n=e;;){if("next"===t&&n===Ve.length||"previous"===t&&-1===n)return-1;var r=pe.current.querySelector('[data-option-index="'.concat(n,'"]')),o=!R&&(!r||r.disabled||"true"===r.getAttribute("aria-disabled"));if(!(r&&!r.hasAttribute("tabindex")||o))return n;n+="next"===t?1:-1}}(function(){var e=Ve.length-1;if("reset"===r)return be;if("start"===r)return 0;if("end"===r)return e;var t=we.current+r;return t<0?-1===t&&q?-1:O&&-1!==we.current||Math.abs(r)>1?0:e:t>e?t===e+1&&q?-1:O||Math.abs(r)>1?e:0:t}(),a);if(Ue({index:u,reason:s,event:t}),i&&"reset"!==r)if(-1===u)fe.current.value=Re;else{var c=n(Ve[u]);fe.current.value=c,0===c.toLowerCase().indexOf(Re.toLowerCase())&&Re.length>0&&fe.current.setSelectionRange(Re.length,c.length)}}})),Ge=e.useCallback((function(){if(Be){var e=Q?je[0]:je;if(0!==Ve.length&&null!=e){if(pe.current)if(null==e)we.current>=Ve.length-1?Ue({index:Ve.length-1}):Ue({index:we.current});else{var t=Ve[we.current];if(Q&&t&&-1!==My(je,(function(e){return Y(t,e)})))return;var n=My(Ve,(function(t){return Y(t,e)}));-1===n?Ye({diff:"reset"}):Ue({index:n})}}else Ye({diff:"reset"})}}),[Ve.length,!Q&&je,_,Ye,Ue,Be,Re,Q]),Qe=zl((function(e){Il(pe,e),e&&Ge()}));e.useEffect((function(){Ge()}),[Ge]);var $e=function(e){Ie||(Ae(!0),Fe(!0),J&&J(e))},Ke=function(e,t){Ie&&(Ae(!1),K&&K(e,t))},Xe=function(e,t,n,r){if(Q){if(je.length===t.length&&je.every((function(e,n){return e===t[n]})))return}else if(je===t)return;$&&$(e,t,n,r),ke(t)},Ze=e.useRef(!1),Je=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"selectOption",r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"options",o=n,i=t;if(Q){var a=My(i=Array.isArray(je)?je.slice():[],(function(e){return Y(t,e)}));-1===a?i.push(t):"freeSolo"!==r&&(i.splice(a,1),o="removeOption")}Me(e,i),Xe(e,i,o,{option:t}),j||e&&(e.ctrlKey||e.metaKey)||Ke(e,o),(!0===d||"touch"===d&&Ze.current||"mouse"===d&&!Ze.current)&&fe.current.blur()};var et=function(e,t){if(Q){""===Re&&Ke(e,"toggleInput");var n=ye;-1===ye?""===Re&&"previous"===t&&(n=je.length-1):((n+="next"===t?1:-1)<0&&(n=0),n===je.length&&(n=-1)),n=function(e,t){if(-1===e)return-1;for(var n=e;;){if("next"===t&&n===je.length||"previous"===t&&-1===n)return-1;var r=me.querySelector('[data-tag-index="'.concat(n,'"]'));if(r&&r.hasAttribute("tabindex")&&!r.disabled&&"true"!==r.getAttribute("aria-disabled"))return n;n+="next"===t?1:-1}}(n,t),xe(n),He(n)}},tt=function(e){ce.current=!0,Te(""),Z&&Z(e,"","clear"),Xe(e,Q?[]:null,"clear")},nt=function(e){return function(t){if(e.onKeyDown&&e.onKeyDown(t),!t.defaultMuiPrevented&&(-1!==ye&&-1===["ArrowLeft","ArrowRight"].indexOf(t.key)&&(xe(-1),He(-1)),229!==t.which))switch(t.key){case"Home":Be&&W&&(t.preventDefault(),Ye({diff:"start",direction:"next",reason:"keyboard",event:t}));break;case"End":Be&&W&&(t.preventDefault(),Ye({diff:"end",direction:"previous",reason:"keyboard",event:t}));break;case"PageUp":t.preventDefault(),Ye({diff:-5,direction:"previous",reason:"keyboard",event:t}),$e(t);break;case"PageDown":t.preventDefault(),Ye({diff:5,direction:"next",reason:"keyboard",event:t}),$e(t);break;case"ArrowDown":t.preventDefault(),Ye({diff:1,direction:"next",reason:"keyboard",event:t}),$e(t);break;case"ArrowUp":t.preventDefault(),Ye({diff:-1,direction:"previous",reason:"keyboard",event:t}),$e(t);break;case"ArrowLeft":et(t,"previous");break;case"ArrowRight":et(t,"next");break;case"Enter":if(-1!==we.current&&Be){var n=Ve[we.current],r=!!A&&A(n);if(t.preventDefault(),r)return;Je(t,n,"selectOption"),i&&fe.current.setSelectionRange(fe.current.value.length,fe.current.value.length)}else I&&""!==Re&&!1===We&&(Q&&t.preventDefault(),Je(t,Re,"createOption","freeSolo"));break;case"Escape":Be?(t.preventDefault(),t.stopPropagation(),Ke(t,"escape")):m&&(""!==Re||Q&&je.length>0)&&(t.preventDefault(),t.stopPropagation(),tt(t));break;case"Backspace":if(Q&&!ie&&""===Re&&je.length>0){var o=-1===ye?je.length-1:ye,a=je.slice();a.splice(o,1),Xe(t,a,"removeOption",{option:je[o]})}}}},rt=function(e){Ee(!0),ne&&!ce.current&&$e(e)},ot=function(e){null!==pe.current&&pe.current.parentElement.contains(document.activeElement)?fe.current.focus():(Ee(!1),de.current=!0,ce.current=!1,u&&-1!==we.current&&Be?Je(e,Ve[we.current],"blur"):u&&I&&""!==Re?Je(e,Re,"blur","freeSolo"):p&&Me(e,je),Ke(e,"blur"))},it=function(e){var t=e.target.value;Re!==t&&(Te(t),Fe(!1),Z&&Z(e,t,"input")),""===t?w||Q||Xe(e,null,"clear"):$e(e)},at=function(e){Ue({event:e,index:Number(e.currentTarget.getAttribute("data-option-index")),reason:"mouse"})},lt=function(){Ze.current=!0},st=function(e){var t=Number(e.currentTarget.getAttribute("data-option-index"));Je(e,Ve[t],"selectOption"),Ze.current=!1},ut=function(e){return function(t){var n=je.slice();n.splice(e,1),Xe(t,n,"removeOption",{option:je[e]})}},ct=function(e){Ie?Ke(e,"toggleInput"):$e(e)},dt=function(e){e.target.getAttribute("id")!==ue&&e.preventDefault()},ft=function(){fe.current.focus(),le&&de.current&&fe.current.selectionEnd-fe.current.selectionStart===0&&fe.current.select(),de.current=!1},pt=function(e){""!==Re&&Ie||ct(e)},ht=I&&Re.length>0;ht=ht||(Q?je.length>0:null!==je);var mt=Ve;if(z){new Map;mt=Ve.reduce((function(e,t,n){var r=z(t);return e.length>0&&e[e.length-1].group===r?e[e.length-1].options.push(t):e.push({key:n,index:n,group:r,options:[t]}),e}),[])}return k&&Pe&&ot(),{getRootProps:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return r({"aria-owns":qe?"".concat(ue,"-listbox"):null},e,{onKeyDown:nt(e),onMouseDown:dt,onClick:ft})},getInputLabelProps:function(){return{id:"".concat(ue,"-label"),htmlFor:ue}},getInputProps:function(){return{id:ue,value:Re,onBlur:ot,onFocus:rt,onChange:it,onMouseDown:pt,"aria-activedescendant":Be?"":null,"aria-autocomplete":i?"both":"list","aria-controls":qe?"".concat(ue,"-listbox"):void 0,"aria-expanded":qe,autoComplete:"off",ref:fe,autoCapitalize:"none",spellCheck:"false",role:"combobox"}},getClearProps:function(){return{tabIndex:-1,onClick:tt}},getPopupIndicatorProps:function(){return{tabIndex:-1,onClick:ct}},getTagProps:function(e){var t=e.index;return r({key:t,"data-tag-index":t,tabIndex:-1},!ie&&{onDelete:ut(t)})},getListboxProps:function(){return{role:"listbox",id:"".concat(ue,"-listbox"),"aria-labelledby":"".concat(ue,"-label"),ref:Qe,onMouseDown:function(e){e.preventDefault()}}},getOptionProps:function(e){var t=e.index,r=e.option,o=(Q?je:[je]).some((function(e){return null!=e&&Y(r,e)})),i=!!A&&A(r);return{key:n(r),tabIndex:-1,role:"option",id:"".concat(ue,"-option-").concat(t),onMouseOver:at,onClick:st,onTouchStart:lt,"data-option-index":t,"aria-disabled":i,"aria-selected":o}},id:ue,inputValue:Re,value:je,dirty:ht,popupOpen:Be,focused:Pe||-1!==ye,anchorEl:me,setAnchorEl:ve,focusedTag:ye,groupedOptions:mt}}function Iy(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function Ay(e){return e instanceof Iy(e).Element||e instanceof Element}function Ny(e){return e instanceof Iy(e).HTMLElement||e instanceof HTMLElement}function Ly(e){return"undefined"!==typeof ShadowRoot&&(e instanceof Iy(e).ShadowRoot||e instanceof ShadowRoot)}var zy=Math.max,Fy=Math.min,Wy=Math.round;function By(e,t){void 0===t&&(t=!1);var n=e.getBoundingClientRect(),r=1,o=1;if(Ny(e)&&t){var i=e.offsetHeight,a=e.offsetWidth;a>0&&(r=Wy(n.width)/a||1),i>0&&(o=Wy(n.height)/i||1)}return{width:n.width/r,height:n.height/o,top:n.top/o,right:n.right/r,bottom:n.bottom/o,left:n.left/r,x:n.left/r,y:n.top/o}}function Vy(e){var t=Iy(e);return{scrollLeft:t.pageXOffset,scrollTop:t.pageYOffset}}function qy(e){return e?(e.nodeName||"").toLowerCase():null}function Hy(e){return((Ay(e)?e.ownerDocument:e.document)||window.document).documentElement}function Uy(e){return By(Hy(e)).left+Vy(e).scrollLeft}function Yy(e){return Iy(e).getComputedStyle(e)}function Gy(e){var t=Yy(e),n=t.overflow,r=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+r)}function Qy(e,t,n){void 0===n&&(n=!1);var r=Ny(t),o=Ny(t)&&function(e){var t=e.getBoundingClientRect(),n=Wy(t.width)/e.offsetWidth||1,r=Wy(t.height)/e.offsetHeight||1;return 1!==n||1!==r}(t),i=Hy(t),a=By(e,o),l={scrollLeft:0,scrollTop:0},s={x:0,y:0};return(r||!r&&!n)&&(("body"!==qy(t)||Gy(i))&&(l=function(e){return e!==Iy(e)&&Ny(e)?{scrollLeft:(t=e).scrollLeft,scrollTop:t.scrollTop}:Vy(e);var t}(t)),Ny(t)?((s=By(t,!0)).x+=t.clientLeft,s.y+=t.clientTop):i&&(s.x=Uy(i))),{x:a.left+l.scrollLeft-s.x,y:a.top+l.scrollTop-s.y,width:a.width,height:a.height}}function $y(e){var t=By(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function Ky(e){return"html"===qy(e)?e:e.assignedSlot||e.parentNode||(Ly(e)?e.host:null)||Hy(e)}function Xy(e){return["html","body","#document"].indexOf(qy(e))>=0?e.ownerDocument.body:Ny(e)&&Gy(e)?e:Xy(Ky(e))}function Zy(e,t){var n;void 0===t&&(t=[]);var r=Xy(e),o=r===(null==(n=e.ownerDocument)?void 0:n.body),i=Iy(r),a=o?[i].concat(i.visualViewport||[],Gy(r)?r:[]):r,l=t.concat(a);return o?l:l.concat(Zy(Ky(a)))}function Jy(e){return["table","td","th"].indexOf(qy(e))>=0}function ex(e){return Ny(e)&&"fixed"!==Yy(e).position?e.offsetParent:null}function tx(e){for(var t=Iy(e),n=ex(e);n&&Jy(n)&&"static"===Yy(n).position;)n=ex(n);return n&&("html"===qy(n)||"body"===qy(n)&&"static"===Yy(n).position)?t:n||function(e){var t=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&Ny(e)&&"fixed"===Yy(e).position)return null;var n=Ky(e);for(Ly(n)&&(n=n.host);Ny(n)&&["html","body"].indexOf(qy(n))<0;){var r=Yy(n);if("none"!==r.transform||"none"!==r.perspective||"paint"===r.contain||-1!==["transform","perspective"].indexOf(r.willChange)||t&&"filter"===r.willChange||t&&r.filter&&"none"!==r.filter)return n;n=n.parentNode}return null}(e)||t}var nx="top",rx="bottom",ox="right",ix="left",ax="auto",lx=[nx,rx,ox,ix],sx="start",ux="end",cx="viewport",dx="popper",fx=lx.reduce((function(e,t){return e.concat([t+"-"+sx,t+"-"+ux])}),[]),px=[].concat(lx,[ax]).reduce((function(e,t){return e.concat([t,t+"-"+sx,t+"-"+ux])}),[]),hx=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function mx(e){var t=new Map,n=new Set,r=[];function o(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var r=t.get(e);r&&o(r)}})),r.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||o(e)})),r}function vx(e){var t;return function(){return t||(t=new Promise((function(n){Promise.resolve().then((function(){t=void 0,n(e())}))}))),t}}var gx={placement:"bottom",modifiers:[],strategy:"absolute"};function yx(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return!t.some((function(e){return!(e&&"function"===typeof e.getBoundingClientRect)}))}function xx(e){void 0===e&&(e={});var t=e,n=t.defaultModifiers,r=void 0===n?[]:n,o=t.defaultOptions,i=void 0===o?gx:o;return function(e,t,n){void 0===n&&(n=i);var o={placement:"bottom",orderedModifiers:[],options:Object.assign({},gx,i),modifiersData:{},elements:{reference:e,popper:t},attributes:{},styles:{}},a=[],l=!1,s={state:o,setOptions:function(n){var l="function"===typeof n?n(o.options):n;u(),o.options=Object.assign({},i,o.options,l),o.scrollParents={reference:Ay(e)?Zy(e):e.contextElement?Zy(e.contextElement):[],popper:Zy(t)};var c=function(e){var t=mx(e);return hx.reduce((function(e,n){return e.concat(t.filter((function(e){return e.phase===n})))}),[])}(function(e){var t=e.reduce((function(e,t){var n=e[t.name];return e[t.name]=n?Object.assign({},n,t,{options:Object.assign({},n.options,t.options),data:Object.assign({},n.data,t.data)}):t,e}),{});return Object.keys(t).map((function(e){return t[e]}))}([].concat(r,o.options.modifiers)));return o.orderedModifiers=c.filter((function(e){return e.enabled})),o.orderedModifiers.forEach((function(e){var t=e.name,n=e.options,r=void 0===n?{}:n,i=e.effect;if("function"===typeof i){var l=i({state:o,name:t,instance:s,options:r}),u=function(){};a.push(l||u)}})),s.update()},forceUpdate:function(){if(!l){var e=o.elements,t=e.reference,n=e.popper;if(yx(t,n)){o.rects={reference:Qy(t,tx(n),"fixed"===o.options.strategy),popper:$y(n)},o.reset=!1,o.placement=o.options.placement,o.orderedModifiers.forEach((function(e){return o.modifiersData[e.name]=Object.assign({},e.data)}));for(var r=0;r<o.orderedModifiers.length;r++)if(!0!==o.reset){var i=o.orderedModifiers[r],a=i.fn,u=i.options,c=void 0===u?{}:u,d=i.name;"function"===typeof a&&(o=a({state:o,options:c,name:d,instance:s})||o)}else o.reset=!1,r=-1}}},update:vx((function(){return new Promise((function(e){s.forceUpdate(),e(o)}))})),destroy:function(){u(),l=!0}};if(!yx(e,t))return s;function u(){a.forEach((function(e){return e()})),a=[]}return s.setOptions(n).then((function(e){!l&&n.onFirstUpdate&&n.onFirstUpdate(e)})),s}}var bx={passive:!0};function wx(e){return e.split("-")[0]}function Sx(e){return e.split("-")[1]}function jx(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function kx(e){var t,n=e.reference,r=e.element,o=e.placement,i=o?wx(o):null,a=o?Sx(o):null,l=n.x+n.width/2-r.width/2,s=n.y+n.height/2-r.height/2;switch(i){case nx:t={x:l,y:n.y-r.height};break;case rx:t={x:l,y:n.y+n.height};break;case ox:t={x:n.x+n.width,y:s};break;case ix:t={x:n.x-r.width,y:s};break;default:t={x:n.x,y:n.y}}var u=i?jx(i):null;if(null!=u){var c="y"===u?"height":"width";switch(a){case sx:t[u]=t[u]-(n[c]/2-r[c]/2);break;case ux:t[u]=t[u]+(n[c]/2-r[c]/2)}}return t}var Cx={top:"auto",right:"auto",bottom:"auto",left:"auto"};function Rx(e){var t,n=e.popper,r=e.popperRect,o=e.placement,i=e.variation,a=e.offsets,l=e.position,s=e.gpuAcceleration,u=e.adaptive,c=e.roundOffsets,d=e.isFixed,f=a.x,p=void 0===f?0:f,h=a.y,m=void 0===h?0:h,v="function"===typeof c?c({x:p,y:m}):{x:p,y:m};p=v.x,m=v.y;var g=a.hasOwnProperty("x"),y=a.hasOwnProperty("y"),x=ix,b=nx,w=window;if(u){var S=tx(n),j="clientHeight",k="clientWidth";if(S===Iy(n)&&"static"!==Yy(S=Hy(n)).position&&"absolute"===l&&(j="scrollHeight",k="scrollWidth"),o===nx||(o===ix||o===ox)&&i===ux)b=rx,m-=(d&&S===w&&w.visualViewport?w.visualViewport.height:S[j])-r.height,m*=s?1:-1;if(o===ix||(o===nx||o===rx)&&i===ux)x=ox,p-=(d&&S===w&&w.visualViewport?w.visualViewport.width:S[k])-r.width,p*=s?1:-1}var C,R=Object.assign({position:l},u&&Cx),T=!0===c?function(e){var t=e.x,n=e.y,r=window.devicePixelRatio||1;return{x:Wy(t*r)/r||0,y:Wy(n*r)/r||0}}({x:p,y:m}):{x:p,y:m};return p=T.x,m=T.y,s?Object.assign({},R,((C={})[b]=y?"0":"",C[x]=g?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+p+"px, "+m+"px)":"translate3d("+p+"px, "+m+"px, 0)",C)):Object.assign({},R,((t={})[b]=y?m+"px":"",t[x]=g?p+"px":"",t.transform="",t))}var Tx={name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},r=t.attributes[e]||{},o=t.elements[e];Ny(o)&&qy(o)&&(Object.assign(o.style,n),Object.keys(r).forEach((function(e){var t=r[e];!1===t?o.removeAttribute(e):o.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var r=t.elements[e],o=t.attributes[e]||{},i=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{});Ny(r)&&qy(r)&&(Object.assign(r.style,i),Object.keys(o).forEach((function(e){r.removeAttribute(e)})))}))}},requires:["computeStyles"]};var Ox={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.offset,i=void 0===o?[0,0]:o,a=px.reduce((function(e,n){return e[n]=function(e,t,n){var r=wx(e),o=[ix,nx].indexOf(r)>=0?-1:1,i="function"===typeof n?n(Object.assign({},t,{placement:e})):n,a=i[0],l=i[1];return a=a||0,l=(l||0)*o,[ix,ox].indexOf(r)>=0?{x:l,y:a}:{x:a,y:l}}(n,t.rects,i),e}),{}),l=a[t.placement],s=l.x,u=l.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=s,t.modifiersData.popperOffsets.y+=u),t.modifiersData[r]=a}},Px={left:"right",right:"left",bottom:"top",top:"bottom"};function Ex(e){return e.replace(/left|right|bottom|top/g,(function(e){return Px[e]}))}var Mx={start:"end",end:"start"};function _x(e){return e.replace(/start|end/g,(function(e){return Mx[e]}))}function Dx(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&Ly(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function Ix(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function Ax(e,t){return t===cx?Ix(function(e){var t=Iy(e),n=Hy(e),r=t.visualViewport,o=n.clientWidth,i=n.clientHeight,a=0,l=0;return r&&(o=r.width,i=r.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(a=r.offsetLeft,l=r.offsetTop)),{width:o,height:i,x:a+Uy(e),y:l}}(e)):Ay(t)?function(e){var t=By(e);return t.top=t.top+e.clientTop,t.left=t.left+e.clientLeft,t.bottom=t.top+e.clientHeight,t.right=t.left+e.clientWidth,t.width=e.clientWidth,t.height=e.clientHeight,t.x=t.left,t.y=t.top,t}(t):Ix(function(e){var t,n=Hy(e),r=Vy(e),o=null==(t=e.ownerDocument)?void 0:t.body,i=zy(n.scrollWidth,n.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),a=zy(n.scrollHeight,n.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),l=-r.scrollLeft+Uy(e),s=-r.scrollTop;return"rtl"===Yy(o||n).direction&&(l+=zy(n.clientWidth,o?o.clientWidth:0)-i),{width:i,height:a,x:l,y:s}}(Hy(e)))}function Nx(e,t,n){var r="clippingParents"===t?function(e){var t=Zy(Ky(e)),n=["absolute","fixed"].indexOf(Yy(e).position)>=0&&Ny(e)?tx(e):e;return Ay(n)?t.filter((function(e){return Ay(e)&&Dx(e,n)&&"body"!==qy(e)})):[]}(e):[].concat(t),o=[].concat(r,[n]),i=o[0],a=o.reduce((function(t,n){var r=Ax(e,n);return t.top=zy(r.top,t.top),t.right=Fy(r.right,t.right),t.bottom=Fy(r.bottom,t.bottom),t.left=zy(r.left,t.left),t}),Ax(e,i));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}function Lx(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function zx(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function Fx(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=void 0===r?e.placement:r,i=n.boundary,a=void 0===i?"clippingParents":i,l=n.rootBoundary,s=void 0===l?cx:l,u=n.elementContext,c=void 0===u?dx:u,d=n.altBoundary,f=void 0!==d&&d,p=n.padding,h=void 0===p?0:p,m=Lx("number"!==typeof h?h:zx(h,lx)),v=c===dx?"reference":dx,g=e.rects.popper,y=e.elements[f?v:c],x=Nx(Ay(y)?y:y.contextElement||Hy(e.elements.popper),a,s),b=By(e.elements.reference),w=kx({reference:b,element:g,strategy:"absolute",placement:o}),S=Ix(Object.assign({},g,w)),j=c===dx?S:b,k={top:x.top-j.top+m.top,bottom:j.bottom-x.bottom+m.bottom,left:x.left-j.left+m.left,right:j.right-x.right+m.right},C=e.modifiersData.offset;if(c===dx&&C){var R=C[o];Object.keys(k).forEach((function(e){var t=[ox,rx].indexOf(e)>=0?1:-1,n=[nx,rx].indexOf(e)>=0?"y":"x";k[e]+=R[n]*t}))}return k}var Wx={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var o=n.mainAxis,i=void 0===o||o,a=n.altAxis,l=void 0===a||a,s=n.fallbackPlacements,u=n.padding,c=n.boundary,d=n.rootBoundary,f=n.altBoundary,p=n.flipVariations,h=void 0===p||p,m=n.allowedAutoPlacements,v=t.options.placement,g=wx(v),y=s||(g===v||!h?[Ex(v)]:function(e){if(wx(e)===ax)return[];var t=Ex(e);return[_x(e),t,_x(t)]}(v)),x=[v].concat(y).reduce((function(e,n){return e.concat(wx(n)===ax?function(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=n.boundary,i=n.rootBoundary,a=n.padding,l=n.flipVariations,s=n.allowedAutoPlacements,u=void 0===s?px:s,c=Sx(r),d=c?l?fx:fx.filter((function(e){return Sx(e)===c})):lx,f=d.filter((function(e){return u.indexOf(e)>=0}));0===f.length&&(f=d);var p=f.reduce((function(t,n){return t[n]=Fx(e,{placement:n,boundary:o,rootBoundary:i,padding:a})[wx(n)],t}),{});return Object.keys(p).sort((function(e,t){return p[e]-p[t]}))}(t,{placement:n,boundary:c,rootBoundary:d,padding:u,flipVariations:h,allowedAutoPlacements:m}):n)}),[]),b=t.rects.reference,w=t.rects.popper,S=new Map,j=!0,k=x[0],C=0;C<x.length;C++){var R=x[C],T=wx(R),O=Sx(R)===sx,P=[nx,rx].indexOf(T)>=0,E=P?"width":"height",M=Fx(t,{placement:R,boundary:c,rootBoundary:d,altBoundary:f,padding:u}),_=P?O?ox:ix:O?rx:nx;b[E]>w[E]&&(_=Ex(_));var D=Ex(_),I=[];if(i&&I.push(M[T]<=0),l&&I.push(M[_]<=0,M[D]<=0),I.every((function(e){return e}))){k=R,j=!1;break}S.set(R,I)}if(j)for(var A=function(e){var t=x.find((function(t){var n=S.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return k=t,"break"},N=h?3:1;N>0;N--){if("break"===A(N))break}t.placement!==k&&(t.modifiersData[r]._skip=!0,t.placement=k,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function Bx(e,t,n){return zy(e,Fy(t,n))}var Vx={name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.mainAxis,i=void 0===o||o,a=n.altAxis,l=void 0!==a&&a,s=n.boundary,u=n.rootBoundary,c=n.altBoundary,d=n.padding,f=n.tether,p=void 0===f||f,h=n.tetherOffset,m=void 0===h?0:h,v=Fx(t,{boundary:s,rootBoundary:u,padding:d,altBoundary:c}),g=wx(t.placement),y=Sx(t.placement),x=!y,b=jx(g),w="x"===b?"y":"x",S=t.modifiersData.popperOffsets,j=t.rects.reference,k=t.rects.popper,C="function"===typeof m?m(Object.assign({},t.rects,{placement:t.placement})):m,R="number"===typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),T=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,O={x:0,y:0};if(S){if(i){var P,E="y"===b?nx:ix,M="y"===b?rx:ox,_="y"===b?"height":"width",D=S[b],I=D+v[E],A=D-v[M],N=p?-k[_]/2:0,L=y===sx?j[_]:k[_],z=y===sx?-k[_]:-j[_],F=t.elements.arrow,W=p&&F?$y(F):{width:0,height:0},B=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},V=B[E],q=B[M],H=Bx(0,j[_],W[_]),U=x?j[_]/2-N-H-V-R.mainAxis:L-H-V-R.mainAxis,Y=x?-j[_]/2+N+H+q+R.mainAxis:z+H+q+R.mainAxis,G=t.elements.arrow&&tx(t.elements.arrow),Q=G?"y"===b?G.clientTop||0:G.clientLeft||0:0,$=null!=(P=null==T?void 0:T[b])?P:0,K=D+Y-$,X=Bx(p?Fy(I,D+U-$-Q):I,D,p?zy(A,K):A);S[b]=X,O[b]=X-D}if(l){var Z,J="x"===b?nx:ix,ee="x"===b?rx:ox,te=S[w],ne="y"===w?"height":"width",re=te+v[J],oe=te-v[ee],ie=-1!==[nx,ix].indexOf(g),ae=null!=(Z=null==T?void 0:T[w])?Z:0,le=ie?re:te-j[ne]-k[ne]-ae+R.altAxis,se=ie?te+j[ne]+k[ne]-ae-R.altAxis:oe,ue=p&&ie?function(e,t,n){var r=Bx(e,t,n);return r>n?n:r}(le,te,se):Bx(p?le:re,te,p?se:oe);S[w]=ue,O[w]=ue-te}t.modifiersData[r]=O}},requiresIfExists:["offset"]};var qx={name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,r=e.name,o=e.options,i=n.elements.arrow,a=n.modifiersData.popperOffsets,l=wx(n.placement),s=jx(l),u=[ix,ox].indexOf(l)>=0?"height":"width";if(i&&a){var c=function(e,t){return Lx("number"!==typeof(e="function"===typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e)?e:zx(e,lx))}(o.padding,n),d=$y(i),f="y"===s?nx:ix,p="y"===s?rx:ox,h=n.rects.reference[u]+n.rects.reference[s]-a[s]-n.rects.popper[u],m=a[s]-n.rects.reference[s],v=tx(i),g=v?"y"===s?v.clientHeight||0:v.clientWidth||0:0,y=h/2-m/2,x=c[f],b=g-d[u]-c[p],w=g/2-d[u]/2+y,S=Bx(x,w,b),j=s;n.modifiersData[r]=((t={})[j]=S,t.centerOffset=S-w,t)}},effect:function(e){var t=e.state,n=e.options.element,r=void 0===n?"[data-popper-arrow]":n;null!=r&&("string"!==typeof r||(r=t.elements.popper.querySelector(r)))&&Dx(t.elements.popper,r)&&(t.elements.arrow=r)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Hx(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function Ux(e){return[nx,ox,rx,ix].some((function(t){return e[t]>=0}))}var Yx=xx({defaultModifiers:[{name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(e){var t=e.state,n=e.instance,r=e.options,o=r.scroll,i=void 0===o||o,a=r.resize,l=void 0===a||a,s=Iy(t.elements.popper),u=[].concat(t.scrollParents.reference,t.scrollParents.popper);return i&&u.forEach((function(e){e.addEventListener("scroll",n.update,bx)})),l&&s.addEventListener("resize",n.update,bx),function(){i&&u.forEach((function(e){e.removeEventListener("scroll",n.update,bx)})),l&&s.removeEventListener("resize",n.update,bx)}},data:{}},{name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state,n=e.name;t.modifiersData[n]=kx({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}},{name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options,r=n.gpuAcceleration,o=void 0===r||r,i=n.adaptive,a=void 0===i||i,l=n.roundOffsets,s=void 0===l||l,u={placement:wx(t.placement),variation:Sx(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:o,isFixed:"fixed"===t.options.strategy};null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign({},t.styles.popper,Rx(Object.assign({},u,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:a,roundOffsets:s})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign({},t.styles.arrow,Rx(Object.assign({},u,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:s})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})},data:{}},Tx,Ox,Wx,Vx,qx,{name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,r=t.rects.reference,o=t.rects.popper,i=t.modifiersData.preventOverflow,a=Fx(t,{elementContext:"reference"}),l=Fx(t,{altBoundary:!0}),s=Hx(a,r),u=Hx(l,o,i),c=Ux(s),d=Ux(u);t.modifiersData[n]={referenceClippingOffsets:s,popperEscapeOffsets:u,isReferenceHidden:c,hasPopperEscaped:d},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":c,"data-popper-escaped":d})}}]});function Gx(e){return Qo("MuiPopperUnstyled",e)}$o("MuiPopperUnstyled",["root"]);var Qx=["anchorEl","children","component","components","componentsProps","direction","disablePortal","modifiers","open","ownerState","placement","popperOptions","popperRef","TransitionProps"],$x=["anchorEl","children","container","direction","disablePortal","keepMounted","modifiers","open","placement","popperOptions","popperRef","style","transition"];function Kx(e){return"function"===typeof e?e():e}var Xx={},Zx=e.forwardRef((function(t,n){var o,i=t.anchorEl,a=t.children,s=t.component,u=t.components,c=void 0===u?{}:u,d=t.componentsProps,f=void 0===d?{}:d,p=t.direction,h=t.disablePortal,m=t.modifiers,v=t.open,g=t.ownerState,y=t.placement,x=t.popperOptions,b=t.popperRef,w=t.TransitionProps,S=Te(t,Qx),j=e.useRef(null),k=Al(j,n),C=e.useRef(null),R=Al(C,b),T=e.useRef(R);Ll((function(){T.current=R}),[R]),e.useImperativeHandle(b,(function(){return C.current}),[]);var O=function(e,t){if("ltr"===t)return e;switch(e){case"bottom-end":return"bottom-start";case"bottom-start":return"bottom-end";case"top-end":return"top-start";case"top-start":return"top-end";default:return e}}(y,p),P=Ne(e.useState(O),2),E=P[0],M=P[1];e.useEffect((function(){C.current&&C.current.forceUpdate()})),Ll((function(){if(i&&v){Kx(i);var e=[{name:"preventOverflow",options:{altBoundary:h}},{name:"flip",options:{altBoundary:h}},{name:"onUpdate",enabled:!0,phase:"afterWrite",fn:function(e){var t=e.state;M(t.placement)}}];null!=m&&(e=e.concat(m)),x&&null!=x.modifiers&&(e=e.concat(x.modifiers));var t=Yx(Kx(i),j.current,r({placement:O},x,{modifiers:e}));return T.current(t),function(){t.destroy(),T.current(null)}}}),[i,h,m,v,x,O]);var _={placement:E};null!==w&&(_.TransitionProps=w);var D=Po({root:["root"]},Gx,{}),I=null!=(o=null!=s?s:c.Root)?o:"div",A=Au({elementType:I,externalSlotProps:f.root,externalForwardedProps:S,additionalProps:{role:"tooltip",ref:k},ownerState:r({},t,g),className:D.root});return(0,l.jsx)(I,r({},A,{children:"function"===typeof a?a(_):a}))})),Jx=e.forwardRef((function(t,n){var o=t.anchorEl,i=t.children,a=t.container,s=t.direction,u=void 0===s?"ltr":s,c=t.disablePortal,d=void 0!==c&&c,f=t.keepMounted,p=void 0!==f&&f,h=t.modifiers,m=t.open,v=t.placement,g=void 0===v?"bottom":v,y=t.popperOptions,x=void 0===y?Xx:y,b=t.popperRef,w=t.style,S=t.transition,j=void 0!==S&&S,k=Te(t,$x),C=Ne(e.useState(!0),2),R=C[0],T=C[1];if(!p&&!m&&(!j||R))return null;var O=a||(o?wl(Kx(o)).body:void 0);return(0,l.jsx)(hu,{disablePortal:d,container:O,children:(0,l.jsx)(Zx,r({anchorEl:o,direction:u,disablePortal:d,modifiers:h,ref:n,open:j?!R:m,placement:g,popperOptions:x,popperRef:b},k,{style:r({position:"fixed",top:0,left:0,display:m||!p||j&&!R?null:"none"},w),TransitionProps:j?{in:m,onEnter:function(){T(!1)},onExited:function(){T(!0)}}:null,children:i}))})})),eb=Yo(Jx,{name:"MuiPopper",slot:"Root",overridesResolver:function(e,t){return t.root}})({}),tb=e.forwardRef((function(e,t){var n=mt(),o=ln({props:e,name:"MuiPopper"});return(0,l.jsx)(eb,r({direction:null==n?void 0:n.direction},o,{ref:t}))})),nb=tb;function rb(e){return Qo("MuiListSubheader",e)}$o("MuiListSubheader",["root","colorPrimary","colorInherit","gutters","inset","sticky"]);var ob=["className","color","component","disableGutters","disableSticky","inset"],ib=Yo("li",{name:"MuiListSubheader",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,"default"!==n.color&&t["color".concat(Eo(n.color))],!n.disableGutters&&t.gutters,n.inset&&t.inset,!n.disableSticky&&t.sticky]}})((function(e){var t=e.theme,n=e.ownerState;return r({boxSizing:"border-box",lineHeight:"48px",listStyle:"none",color:(t.vars||t).palette.text.secondary,fontFamily:t.typography.fontFamily,fontWeight:t.typography.fontWeightMedium,fontSize:t.typography.pxToRem(14)},"primary"===n.color&&{color:(t.vars||t).palette.primary.main},"inherit"===n.color&&{color:"inherit"},!n.disableGutters&&{paddingLeft:16,paddingRight:16},n.inset&&{paddingLeft:72},!n.disableSticky&&{position:"sticky",top:0,zIndex:1,backgroundColor:(t.vars||t).palette.background.paper})})),ab=e.forwardRef((function(e,t){var n=ln({props:e,name:"MuiListSubheader"}),o=n.className,i=n.color,a=void 0===i?"default":i,s=n.component,u=void 0===s?"li":s,c=n.disableGutters,d=void 0!==c&&c,f=n.disableSticky,p=void 0!==f&&f,h=n.inset,m=void 0!==h&&h,v=Te(n,ob),g=r({},n,{color:a,component:u,disableGutters:d,disableSticky:p,inset:m}),y=function(e){var t=e.classes,n=e.color,r=e.disableGutters,o=e.inset,i=e.disableSticky;return Po({root:["root","default"!==n&&"color".concat(Eo(n)),!r&&"gutters",o&&"inset",!i&&"sticky"]},rb,t)}(g);return(0,l.jsx)(ib,r({as:u,className:wn(y.root,o),ref:t,ownerState:g},v))})),lb=ab,sb=Ml((0,l.jsx)("path",{d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"}),"Close");function ub(e){return Qo("MuiAutocomplete",e)}var cb,db,fb=$o("MuiAutocomplete",["root","fullWidth","focused","focusVisible","tag","tagSizeSmall","tagSizeMedium","hasPopupIcon","hasClearIcon","inputRoot","input","inputFocused","endAdornment","clearIndicator","popupIndicator","popupIndicatorOpen","popper","popperDisablePortal","paper","listbox","loading","noOptions","option","groupLabel","groupUl"]),pb=["autoComplete","autoHighlight","autoSelect","blurOnSelect","ChipProps","className","clearIcon","clearOnBlur","clearOnEscape","clearText","closeText","componentsProps","defaultValue","disableClearable","disableCloseOnSelect","disabled","disabledItemsFocusable","disableListWrap","disablePortal","filterOptions","filterSelectedOptions","forcePopupIcon","freeSolo","fullWidth","getLimitTagsText","getOptionDisabled","getOptionLabel","isOptionEqualToValue","groupBy","handleHomeEndKeys","id","includeInputInList","inputValue","limitTags","ListboxComponent","ListboxProps","loading","loadingText","multiple","noOptionsText","onChange","onClose","onHighlightChange","onInputChange","onOpen","open","openOnFocus","openText","options","PaperComponent","PopperComponent","popupIcon","readOnly","renderGroup","renderInput","renderOption","renderTags","selectOnFocus","size","value"],hb=Yo("div",{name:"MuiAutocomplete",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState,r=n.fullWidth,o=n.hasClearIcon,i=n.hasPopupIcon,a=n.inputFocused,l=n.size;return[Ee({},"& .".concat(fb.tag),t.tag),Ee({},"& .".concat(fb.tag),t["tagSize".concat(Eo(l))]),Ee({},"& .".concat(fb.inputRoot),t.inputRoot),Ee({},"& .".concat(fb.input),t.input),Ee({},"& .".concat(fb.input),a&&t.inputFocused),t.root,r&&t.fullWidth,i&&t.hasPopupIcon,o&&t.hasClearIcon]}})((function(e){var t,n,o,i,a,l=e.ownerState;return r((Ee(t={},"&.".concat(fb.focused," .").concat(fb.clearIndicator),{visibility:"visible"}),Ee(t,"@media (pointer: fine)",Ee({},"&:hover .".concat(fb.clearIndicator),{visibility:"visible"})),t),l.fullWidth&&{width:"100%"},(Ee(a={},"& .".concat(fb.tag),r({margin:3,maxWidth:"calc(100% - 6px)"},"small"===l.size&&{margin:2,maxWidth:"calc(100% - 4px)"})),Ee(a,"& .".concat(fb.inputRoot),(Ee(n={flexWrap:"wrap"},".".concat(fb.hasPopupIcon,"&, .").concat(fb.hasClearIcon,"&"),{paddingRight:30}),Ee(n,".".concat(fb.hasPopupIcon,".").concat(fb.hasClearIcon,"&"),{paddingRight:56}),Ee(n,"& .".concat(fb.input),{width:0,minWidth:30}),n)),Ee(a,"& .".concat(dm.root),{paddingBottom:1,"& .MuiInput-input":{padding:"4px 4px 4px 0px"}}),Ee(a,"& .".concat(dm.root,".").concat(tm.sizeSmall),Ee({},"& .".concat(dm.input),{padding:"2px 4px 3px 0"})),Ee(a,"& .".concat(Pm.root),(Ee(o={padding:9},".".concat(fb.hasPopupIcon,"&, .").concat(fb.hasClearIcon,"&"),{paddingRight:39}),Ee(o,".".concat(fb.hasPopupIcon,".").concat(fb.hasClearIcon,"&"),{paddingRight:65}),Ee(o,"& .".concat(fb.input),{padding:"7.5px 4px 7.5px 6px"}),Ee(o,"& .".concat(fb.endAdornment),{right:9}),o)),Ee(a,"& .".concat(Pm.root,".").concat(tm.sizeSmall),Ee({padding:6},"& .".concat(fb.input),{padding:"2.5px 4px 2.5px 6px"})),Ee(a,"& .".concat(ym.root),(Ee(i={paddingTop:19,paddingLeft:8},".".concat(fb.hasPopupIcon,"&, .").concat(fb.hasClearIcon,"&"),{paddingRight:39}),Ee(i,".".concat(fb.hasPopupIcon,".").concat(fb.hasClearIcon,"&"),{paddingRight:65}),Ee(i,"& .".concat(ym.input),{padding:"7px 4px"}),Ee(i,"& .".concat(fb.endAdornment),{right:9}),i)),Ee(a,"& .".concat(ym.root,".").concat(tm.sizeSmall),Ee({paddingBottom:1},"& .".concat(ym.input),{padding:"2.5px 4px"})),Ee(a,"& .".concat(tm.hiddenLabel),{paddingTop:8}),Ee(a,"& .".concat(fb.input),r({flexGrow:1,textOverflow:"ellipsis",opacity:0},l.inputFocused&&{opacity:1})),a))})),mb=Yo("div",{name:"MuiAutocomplete",slot:"EndAdornment",overridesResolver:function(e,t){return t.endAdornment}})({position:"absolute",right:0,top:"calc(50% - 14px)"}),vb=Yo(Ec,{name:"MuiAutocomplete",slot:"ClearIndicator",overridesResolver:function(e,t){return t.clearIndicator}})({marginRight:-2,padding:4,visibility:"hidden"}),gb=Yo(Ec,{name:"MuiAutocomplete",slot:"PopupIndicator",overridesResolver:function(e,t){var n=e.ownerState;return r({},t.popupIndicator,n.popupOpen&&t.popupIndicatorOpen)}})((function(e){return r({padding:2,marginRight:-2},e.ownerState.popupOpen&&{transform:"rotate(180deg)"})})),yb=Yo(nb,{name:"MuiAutocomplete",slot:"Popper",overridesResolver:function(e,t){var n=e.ownerState;return[Ee({},"& .".concat(fb.option),t.option),t.popper,n.disablePortal&&t.popperDisablePortal]}})((function(e){var t=e.theme,n=e.ownerState;return r({zIndex:(t.vars||t).zIndex.modal},n.disablePortal&&{position:"absolute"})})),xb=Yo(Di,{name:"MuiAutocomplete",slot:"Paper",overridesResolver:function(e,t){return t.paper}})((function(e){return r({},e.theme.typography.body1,{overflow:"auto"})})),bb=Yo("div",{name:"MuiAutocomplete",slot:"Loading",overridesResolver:function(e,t){return t.loading}})((function(e){var t=e.theme;return{color:(t.vars||t).palette.text.secondary,padding:"14px 16px"}})),wb=Yo("div",{name:"MuiAutocomplete",slot:"NoOptions",overridesResolver:function(e,t){return t.noOptions}})((function(e){var t=e.theme;return{color:(t.vars||t).palette.text.secondary,padding:"14px 16px"}})),Sb=Yo("div",{name:"MuiAutocomplete",slot:"Listbox",overridesResolver:function(e,t){return t.listbox}})((function(e){var t,n,r=e.theme;return Ee({listStyle:"none",margin:0,padding:"8px 0",maxHeight:"40vh",overflow:"auto"},"& .".concat(fb.option),(Ee(n={minHeight:48,display:"flex",overflow:"hidden",justifyContent:"flex-start",alignItems:"center",cursor:"pointer",paddingTop:6,boxSizing:"border-box",outline:"0",WebkitTapHighlightColor:"transparent",paddingBottom:6,paddingLeft:16,paddingRight:16},r.breakpoints.up("sm"),{minHeight:"auto"}),Ee(n,"&.".concat(fb.focused),{backgroundColor:(r.vars||r).palette.action.hover,"@media (hover: none)":{backgroundColor:"transparent"}}),Ee(n,'&[aria-disabled="true"]',{opacity:(r.vars||r).palette.action.disabledOpacity,pointerEvents:"none"}),Ee(n,"&.".concat(fb.focusVisible),{backgroundColor:(r.vars||r).palette.action.focus}),Ee(n,'&[aria-selected="true"]',(Ee(t={backgroundColor:r.vars?"rgba(".concat(r.vars.palette.primary.mainChannel," / ").concat(r.vars.palette.action.selectedOpacity,")"):Tt(r.palette.primary.main,r.palette.action.selectedOpacity)},"&.".concat(fb.focused),{backgroundColor:r.vars?"rgba(".concat(r.vars.palette.primary.mainChannel," / calc(").concat(r.vars.palette.action.selectedOpacity," + ").concat(r.vars.palette.action.hoverOpacity,"))"):Tt(r.palette.primary.main,r.palette.action.selectedOpacity+r.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:(r.vars||r).palette.action.selected}}),Ee(t,"&.".concat(fb.focusVisible),{backgroundColor:r.vars?"rgba(".concat(r.vars.palette.primary.mainChannel," / calc(").concat(r.vars.palette.action.selectedOpacity," + ").concat(r.vars.palette.action.focusOpacity,"))"):Tt(r.palette.primary.main,r.palette.action.selectedOpacity+r.palette.action.focusOpacity)}),t)),n))})),jb=Yo(lb,{name:"MuiAutocomplete",slot:"GroupLabel",overridesResolver:function(e,t){return t.groupLabel}})((function(e){var t=e.theme;return{backgroundColor:(t.vars||t).palette.background.paper,top:-8}})),kb=Yo("ul",{name:"MuiAutocomplete",slot:"GroupUl",overridesResolver:function(e,t){return t.groupUl}})(Ee({padding:0},"& .".concat(fb.option),{paddingLeft:24})),Cb=e.forwardRef((function(t,n){var o,i,a,s,u,c=ln({props:t,name:"MuiAutocomplete"}),d=(c.autoComplete,c.autoHighlight,c.autoSelect,c.blurOnSelect,c.ChipProps),f=c.className,p=c.clearIcon,h=void 0===p?cb||(cb=(0,l.jsx)(sb,{fontSize:"small"})):p,m=c.clearOnBlur,v=(void 0===m&&c.freeSolo,c.clearOnEscape,c.clearText),g=void 0===v?"Clear":v,y=c.closeText,x=void 0===y?"Close":y,b=c.componentsProps,w=void 0===b?{}:b,S=c.defaultValue,j=(void 0===S&&c.multiple,c.disableClearable),k=void 0!==j&&j,C=(c.disableCloseOnSelect,c.disabled),R=void 0!==C&&C,T=(c.disabledItemsFocusable,c.disableListWrap,c.disablePortal),O=void 0!==T&&T,P=(c.filterSelectedOptions,c.forcePopupIcon),E=void 0===P?"auto":P,M=c.freeSolo,_=void 0!==M&&M,D=c.fullWidth,I=void 0!==D&&D,A=c.getLimitTagsText,N=void 0===A?function(e){return"+".concat(e)}:A,L=c.getOptionLabel,z=void 0===L?function(e){var t;return null!=(t=e.label)?t:e}:L,F=c.groupBy,W=c.handleHomeEndKeys,B=(void 0===W&&c.freeSolo,c.includeInputInList,c.limitTags),V=void 0===B?-1:B,q=c.ListboxComponent,H=void 0===q?"ul":q,U=c.ListboxProps,Y=c.loading,G=void 0!==Y&&Y,Q=c.loadingText,$=void 0===Q?"Loading\u2026":Q,K=c.multiple,X=void 0!==K&&K,Z=c.noOptionsText,J=void 0===Z?"No options":Z,ee=(c.openOnFocus,c.openText),te=void 0===ee?"Open":ee,ne=c.PaperComponent,re=void 0===ne?Di:ne,oe=c.PopperComponent,ie=void 0===oe?nb:oe,ae=c.popupIcon,le=void 0===ae?db||(db=(0,l.jsx)(Gh,{})):ae,se=c.readOnly,ue=void 0!==se&&se,ce=c.renderGroup,de=c.renderInput,fe=c.renderOption,pe=c.renderTags,he=c.selectOnFocus,me=(void 0===he&&c.freeSolo,c.size),ve=void 0===me?"medium":me,ge=Te(c,pb),ye=Dy(r({},c,{componentName:"Autocomplete"})),xe=ye.getRootProps,be=ye.getInputProps,we=ye.getInputLabelProps,Se=ye.getPopupIndicatorProps,je=ye.getClearProps,ke=ye.getTagProps,Ce=ye.getListboxProps,Re=ye.getOptionProps,Oe=ye.value,Pe=ye.dirty,Ee=ye.id,Me=ye.popupOpen,_e=ye.focused,De=ye.focusedTag,Ie=ye.anchorEl,Ae=ye.setAnchorEl,Ne=ye.inputValue,Le=ye.groupedOptions,ze=!k&&!R&&Pe&&!ue,Fe=(!_||!0===E)&&!1!==E,We=r({},c,{disablePortal:O,focused:_e,fullWidth:I,hasClearIcon:ze,hasPopupIcon:Fe,inputFocused:-1===De,popupOpen:Me,size:ve}),Be=function(e){var t=e.classes,n=e.disablePortal,r=e.focused,o=e.fullWidth,i=e.hasClearIcon,a=e.hasPopupIcon,l=e.inputFocused,s=e.popupOpen,u=e.size;return Po({root:["root",r&&"focused",o&&"fullWidth",i&&"hasClearIcon",a&&"hasPopupIcon"],inputRoot:["inputRoot"],input:["input",l&&"inputFocused"],tag:["tag","tagSize".concat(Eo(u))],endAdornment:["endAdornment"],clearIndicator:["clearIndicator"],popupIndicator:["popupIndicator",s&&"popupIndicatorOpen"],popper:["popper",n&&"popperDisablePortal"],paper:["paper"],listbox:["listbox"],loading:["loading"],noOptions:["noOptions"],option:["option"],groupLabel:["groupLabel"],groupUl:["groupUl"]},ub,t)}(We);if(X&&Oe.length>0){var Ve=function(e){return r({className:Be.tag,disabled:R},ke(e))};u=pe?pe(Oe,Ve,We):Oe.map((function(e,t){return(0,l.jsx)(wp,r({label:z(e),size:ve},Ve({index:t}),d))}))}if(V>-1&&Array.isArray(u)){var qe=u.length-V;!_e&&qe>0&&(u=u.splice(0,V)).push((0,l.jsx)("span",{className:Be.tag,children:N(qe)},u.length))}var He=ce||function(e){return(0,l.jsxs)("li",{children:[(0,l.jsx)(jb,{className:Be.groupLabel,ownerState:We,component:"div",children:e.group}),(0,l.jsx)(kb,{className:Be.groupUl,ownerState:We,children:e.children})]},e.key)},Ue=fe||function(e,t){return(0,l.jsx)("li",r({},e,{children:z(t)}))},Ye=function(e,t){var n=Re({option:e,index:t});return Ue(r({},n,{className:Be.option}),e,{selected:n["aria-selected"],inputValue:Ne})};return(0,l.jsxs)(e.Fragment,{children:[(0,l.jsx)(hb,r({ref:n,className:wn(Be.root,f),ownerState:We},xe(ge),{children:de({id:Ee,disabled:R,fullWidth:!0,size:"small"===ve?"small":void 0,InputLabelProps:we(),InputProps:r({ref:Ae,className:Be.inputRoot,startAdornment:u},(ze||Fe)&&{endAdornment:(0,l.jsxs)(mb,{className:Be.endAdornment,ownerState:We,children:[ze?(0,l.jsx)(vb,r({},je(),{"aria-label":g,title:g,ownerState:We},w.clearIndicator,{className:wn(Be.clearIndicator,null==(o=w.clearIndicator)?void 0:o.className),children:h})):null,Fe?(0,l.jsx)(gb,r({},Se(),{disabled:R,"aria-label":Me?x:te,title:Me?x:te,ownerState:We},w.popupIndicator,{className:wn(Be.popupIndicator,null==(i=w.popupIndicator)?void 0:i.className),children:le})):null]})}),inputProps:r({className:Be.input,disabled:R,readOnly:ue},be())})})),Me&&Ie?(0,l.jsx)(yb,r({as:ie,disablePortal:O,style:{width:Ie?Ie.clientWidth:null},ownerState:We,role:"presentation",anchorEl:Ie,open:!0},w.popper,{className:wn(Be.popper,null==(a=w.popper)?void 0:a.className),children:(0,l.jsxs)(xb,r({ownerState:We,as:re},w.paper,{className:wn(Be.paper,null==(s=w.paper)?void 0:s.className),children:[G&&0===Le.length?(0,l.jsx)(bb,{className:Be.loading,ownerState:We,children:$}):null,0!==Le.length||_||G?null:(0,l.jsx)(wb,{className:Be.noOptions,ownerState:We,role:"presentation",onMouseDown:function(e){e.preventDefault()},children:J}),Le.length>0?(0,l.jsx)(Sb,r({as:H,className:Be.listbox,ownerState:We},Ce(),U,{children:Le.map((function(e,t){return F?He({key:e.key,group:e.group,children:e.options.map((function(t,n){return Ye(t,e.index+n)}))}):Ye(e,t)}))})):null]}))})):null]})})),Rb=Cb,Tb=function(t){var n=t.label,r=t.value,o=t.onChange,i=t.helperText,a=Ne(e.useState(""),2),s=a[0],u=a[1],c=lu((function(e){return Ki.get("/facilities?q=".concat(s)).then((function(e){return e.data}))}),[]),d=lu((function(e){return Ki.get("/facilities/".concat(e)).then((function(e){return e.data}))}),null);return e.useEffect((function(){s&&c.fetch(s)}),[s]),e.useEffect((function(){r?d.fetch(r):d.reset()}),[r]),(0,l.jsx)(Rb,{getOptionLabel:function(e){return e.name},options:c.value||[],loading:c.loading,value:d.value,onInputChange:function(e,t,n){if("reset"===n)return o();u(t)},onChange:function(e){function t(t,n){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e,t){return t&&o(null===t||void 0===t?void 0:t.id)})),fullWidth:!0,renderInput:function(e){return(0,l.jsx)(dv,Rp(Rp({},e),{},{variant:"outlined",size:"small",InputLabelProps:{shrink:!0},value:s,onChange:function(e){return u(e.target.value)},label:n,helperText:i,fullWidth:!0}))}})},Ob=function(t){var n,r=t.request,o=t.onSuccess,i=t.onCancel,a=po(),s=fo().state,u=null===s||void 0===s?void 0:s.diagnosisType,c=null!==(n=null!==u&&void 0!==u?u:null===r||void 0===r?void 0:r.diagnosisType)&&void 0!==n?n:"TB",d=oy({defaultValues:Rp({testType:"Patient",diagnosisType:c||"TB"},r)}),f=d.control,p=d.handleSubmit,h=d.reset,m=(d.formState.errors,Ne(e.useState(!1),2)),v=m[0],g=m[1],y=cg({control:f,name:"testType"}),x=(cg({control:f,name:"sampleType"}),cg({control:f,name:"sampleCollectionSiteType"})),b=(cg({control:f,name:"verificationType"}),cg({control:f,name:"patientRegistrationGroup"})),w=cg({control:f,name:"viralLoad.cd4Info.cd4TestDoneInLast12Months"}),S=cg({control:f,name:"viralLoad.reasonForTestCategory"}),j="Off Site"===x;return(0,l.jsxs)(Ir,{display:"flex",flexDirection:"column",bgcolor:"#121212cc",component:"form",onSubmit:p((function(e){Ki.post("/requests",e).then((function(){o?o():a("/requests")}))})),flexGrow:1,overflow:"auto",children:[(0,l.jsx)(Ir,{overflow:"auto",className:"scroll_enabled",p:2,flexGrow:1,children:(0,l.jsxs)(Ci,{container:!0,spacing:2,children:[(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"testType",control:f,rules:{required:"Select a test type"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",required:!0,fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"Type Of Test"}),(0,l.jsx)(Hm,Rp(Rp({label:"Type of Test"},n),{},{notched:!0,children:iy.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{error:!0,children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"sampleId",control:f,rules:{required:"required to identify the sample"},render:function(e){var t,n=e.field,o=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Sample Identifier",size:"small",fullWidth:!0,disabled:!Ja(null===r||void 0===r?void 0:r.sampleId),InputLabelProps:{shrink:!0},helperText:null===(t=o.error)||void 0===t?void 0:t.message},n))}})}),(0,l.jsx)(Py,{when:"Verification"===y,render:function(){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"verificationType",control:f,rules:{required:"Verification type is required"},render:function(e){var t,n=e.field,r=n.value,o=n.onChange,i=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",variant:"outlined",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"Verification Type"}),(0,l.jsx)(Hm,{label:"Verification Type",value:r,onChange:o,notched:!0,children:my.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))}),(0,l.jsx)(iv,{children:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(t=i.error)||void 0===t?void 0:t.message})})]})}})}),(0,l.jsx)(Py,{when:"Verification"===y,render:function(){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"laboratoryName",control:f,rules:{required:"Laboratory name is required"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Laboratory Name",variant:"outlined",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(t=r.error)||void 0===t?void 0:t.message})},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"address",control:f,rules:{required:"Address is required"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Address",variant:"outlined",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(t=r.error)||void 0===t?void 0:t.message})},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"verificationDate",control:f,rules:{required:"Verification date is required"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Date of Verification Performed",variant:"outlined",size:"small",type:"date",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(t=r.error)||void 0===t?void 0:t.message})},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"testScheme",control:f,rules:{required:"Test scheme is required"},render:function(e){var t,n=e.field,r=n.value,o=n.onChange,i=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",variant:"outlined",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"Type of Test or Scheme"}),(0,l.jsx)(Hm,{label:"Type of Test or Scheme",value:r,onChange:o,notched:!0,children:["Xpert MTB/RIF Ultra","Xpert MTB/RIF XDR","Xpert HIV-1 VL","Xpert HIV-1 Qual"].map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))}),(0,l.jsx)(iv,{children:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(t=i.error)||void 0===t?void 0:t.message})})]})}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"instrumentSn",control:f,rules:{required:"Instrument serial number is required"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Instrument Serial Number",variant:"outlined",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(t=r.error)||void 0===t?void 0:t.message})},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"moduleName",control:f,rules:{required:"Module name is required"},render:function(e){var t,n=e.field,r=n.value,o=n.onChange,i=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",variant:"outlined",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"Module Name"}),(0,l.jsx)(Hm,{label:"Module Name",value:r,onChange:o,notched:!0,children:["A1","A2","A3","A4","B1","B2","B3","B4"].map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))}),(0,l.jsx)(iv,{children:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(t=i.error)||void 0===t?void 0:t.message})})]})}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"moduleSn",control:f,rules:{required:"Module serial number is required"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Module Serial Number",variant:"outlined",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(t=r.error)||void 0===t?void 0:t.message})},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsx)(fg,{name:"sampleLotNo",control:f,rules:{required:"Sample lot number is required"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Sample Lot Number",variant:"outlined",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(t=r.error)||void 0===t?void 0:t.message})},n))}})})]})}})]})}}),(0,l.jsx)(Py,{when:"Panel"===y,render:function(){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsx)(fg,{name:"panelProvider",control:f,rules:{required:"required"},render:function(e){var t,n=e.field,r=n.value,o=n.onChange,i=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",variant:"outlined",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"Panel Provider"}),(0,l.jsx)(Hm,{label:"Panel Provider",value:r,onChange:o,notched:!0,children:py.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))}),(0,l.jsx)(iv,{children:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(t=i.error)||void 0===t?void 0:t.message})})]})}})}),(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsx)(fg,{name:"panelScheme",control:f,rules:{required:"required"},render:function(e){var t,n=e.field,r=n.value,o=n.onChange,i=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",variant:"outlined",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"Scheme"}),(0,l.jsx)(Hm,{label:"Scheme",value:r,onChange:o,notched:!0,children:hy.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))}),(0,l.jsx)(iv,{children:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(t=i.error)||void 0===t?void 0:t.message})})]})}})}),(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsx)(fg,{name:"panelYear",control:f,rules:{required:"required"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Year",variant:"outlined",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(t=r.error)||void 0===t?void 0:t.message})},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsx)(fg,{name:"panelRound",control:f,rules:{required:"required"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Round",variant:"outlined",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(t=r.error)||void 0===t?void 0:t.message})},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsx)(fg,{name:"panelPtId",control:f,rules:{required:"required"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"PT Id",variant:"outlined",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(t=r.error)||void 0===t?void 0:t.message})},n))}})})]})}}),(0,l.jsx)(Py,{when:"Research"===y,render:function(){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsx)(fg,{name:"researchName",control:f,rules:{required:"required"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Research Name",variant:"outlined",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(t=r.error)||void 0===t?void 0:t.message})},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsx)(fg,{name:"mrn",control:f,rules:{required:"required"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Participant ID",variant:"outlined",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(t=r.error)||void 0===t?void 0:t.message})},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsx)(fg,{name:"gender",control:f,rules:{required:"required for statistics"},render:function(e){var t,n=e.field,r=n.value,o=n.onChange,i=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",variant:"outlined",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"Gender"}),(0,l.jsx)(Hm,{label:"Gender",value:r,onChange:o,notched:!0,children:ay.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))}),(0,l.jsx)(iv,{children:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(t=i.error)||void 0===t?void 0:t.message})})]})}})}),(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsx)(fg,{name:"age",control:f,rules:{required:"required for statistics",validate:function(e){return parseInt(e,10)>=0||"Must be a number, use zero(0) for age under 1 year"}},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({type:"number",label:"Age (Yrs)",variant:"outlined",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(t=r.error)||void 0===t?void 0:t.message})},n))}})})]})}}),(0,l.jsx)(Py,{when:"Patient"===y,render:function(){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(Ci,{item:!0,xs:3,children:(0,l.jsx)(fg,{name:"mrn",control:f,rules:{required:"required to identify the patient"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"MRN",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:null===(t=r.error)||void 0===t?void 0:t.message},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"name",control:f,rules:{required:"required to identify the patient"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Name",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:null===(t=r.error)||void 0===t?void 0:t.message},n))}})}),("TB"===c||"ViralLoad"===c)&&(0,l.jsx)(Ci,{item:!0,xs:3,children:(0,l.jsx)(fg,{name:"age",control:f,rules:{required:"required for statistics",validate:function(e){return Number(e)>=0||"Must be a number, use zero(0) for age under 1 year"}},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({type:"number",label:"Age (Yrs)",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:null===(t=r.error)||void 0===t?void 0:t.message},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"gender",control:f,rules:{required:"required for statistics"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"Gender"}),(0,l.jsx)(Hm,Rp(Rp({label:"Gender"},n),{},{notched:!0,children:ay.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{error:!0,children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"sampleType",control:f,rules:{required:"required for statistics",validate:function(e){return e&&""!==e.trim()||"Please specify sample type"}},render:function(e){var t,n,r=e.field,o=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,error:!!o.error,children:[(0,l.jsx)(Up,{shrink:!0,children:"Sample Type"}),v?(0,l.jsx)(dv,{size:"small",placeholder:"Specify sample type",value:null!==(t=r.value)&&void 0!==t?t:"",onChange:function(e){return r.onChange(e.target.value)},InputProps:{endAdornment:(0,l.jsx)(yv,{position:"end",children:(0,l.jsx)(Ec,{size:"small","aria-label":"Back to sample type list",onClick:function(){g(!1),r.onChange("")},children:(0,l.jsx)(xv,{fontSize:"small"})})})}}):(0,l.jsx)(Hm,Rp(Rp({},r),{},{label:"Sample Type",notched:!0,onChange:function(e){var t=e.target.value;"Others"===t?(g(!0),r.onChange("")):r.onChange(t)},children:("TB"===c?wy:"EID"===c?Sy:jy).map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{children:null===(n=o.error)||void 0===n?void 0:n.message})]})}})}),"TB"===c&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"patientRegistrationGroup",control:f,rules:{required:"required for statistics"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"Patient Registration Group"}),(0,l.jsx)(Hm,Rp(Rp({label:"Patient Registration Group"},n),{},{notched:!0,children:dy.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{error:!0,children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})}),"New"!==b&&(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"previouslyTreated",control:f,rules:{required:"required for statistics"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"Treatment History"}),(0,l.jsx)(Hm,Rp(Rp({label:"Treatment History"},n),{},{notched:!0,children:cy.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{error:!0,children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})})]}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"sampleCollectionSiteType",control:f,rules:{required:"required for statistics"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"Where was the sample collected?"}),(0,l.jsx)(Hm,Rp(Rp({label:"Where was the sample collected?"},n),{},{notched:!0,children:uy.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{error:!0,children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})}),j&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"sampleCollectionSiteId",control:f,rules:{required:"required for statistics"},render:function(e){var t,n,r=e.field,o=e.fieldState;return(0,l.jsx)(Tb,{label:"Which facility was the sample collected?",helperText:null===(t=o.error)||void 0===t?void 0:t.message,value:null!==(n=r.value)&&void 0!==n?n:"",onChange:r.onChange})}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"referringLabContacts",control:f,rules:{required:"required for statistics",validate:function(e){return gy.test(e)||"Invalid phone"}},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Referring Lab Phone No",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:null===(t=r.error)||void 0===t?void 0:t.message},n))}})})]}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"reasonForDiagnosis",control:f,rules:{required:"required for statistics"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"Reason for diagnosis"}),(0,l.jsx)(Hm,Rp(Rp({label:"Reason for diagnosis"},n),{},{notched:!0,children:("TB"===c?yy:"EID"===c?xy:ky).map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{error:!0,children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"patientContacts",control:f,rules:{validate:function(e){return!e||gy.test(e)||"Invalid phone"}},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Patient Phone No (If Available)",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:null===(t=r.error)||void 0===t?void 0:t.message},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"clinicianContacts",control:f,rules:{required:"required for statistics",validate:function(e){return gy.test(e)||"Invalid phone"}},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Clinician Phone No",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:null===(t=r.error)||void 0===t?void 0:t.message},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"hivStatus",control:f,rules:{required:"required for statistics"},render:function(e){var t,n=e.field,r=n.value,o=n.onChange,i=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",variant:"outlined",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,id:"hiv-status",children:"HIV Status"}),(0,l.jsx)(Hm,{label:"HIV Status",value:r,onChange:o,notched:!0,children:sy.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))}),(0,l.jsx)(iv,{children:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(t=i.error)||void 0===t?void 0:t.message})})]})}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"sampleCollectedAt",control:f,rules:{required:"required for statistics"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,{label:"When was the sample collected?",type:"date",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:null===(t=r.error)||void 0===t?void 0:t.message,value:n.value?new Date(n.value).toISOString().split("T")[0]:"",onChange:function(e){return n.onChange(e.target.value)}})}})}),"TB"===c&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"isRepeatedRifResitanceTest",control:f,render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"Repeat Confirmatory RR test?"}),(0,l.jsx)(Hm,Rp(Rp({label:"Repeat Confirmatory RR test?"},n),{},{notched:!0,children:fy.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{error:!0,children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"isRepeatedConfirmatoryRifTest",control:f,render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"Repeat confirmatory MTB detected Trace (TT) test?"}),(0,l.jsx)(Hm,Rp(Rp({label:"Repeat confirmatory MTB detected Trace (TT) test?"},n),{},{notched:!0,children:fy.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{error:!0,children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"infectionSite",control:f,rules:{required:"required for statistics"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"Site of Infection"}),(0,l.jsx)(Hm,Rp(Rp({label:"Site of Infection"},n),{},{notched:!0,children:ly.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{error:!0,children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})})]}),"EID"===c&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"eid.heiCode",control:f,rules:{required:!0},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"HEI Code",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:null===(t=r.error)||void 0===t?void 0:t.message},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"eid.dob",control:f,rules:{required:!0},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Date of Birth",type:"date",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:null===(t=r.error)||void 0===t?void 0:t.message},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"eid.specimenCollectorPhone",control:f,rules:{required:!0,validate:function(e){return gy.test(e)||"Invalid phone"}},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Specimen Collector (PMTCT) Phone",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:null===(t=r.error)||void 0===t?void 0:t.message},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"eid.specimenArrivalDate",control:f,rules:{required:!0},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Specimen Arrival Date",type:"date",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:null===(t=r.error)||void 0===t?void 0:t.message},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"eid.breastfeeding",control:f,rules:{required:!0},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"Infant on breastfeeding"}),(0,l.jsx)(Hm,Rp(Rp({label:"Infant on breastfeeding"},n),{},{notched:!0,children:fy.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{error:!0,children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"eid.arvProphylaxisFor",control:f,rules:{required:!0},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"ARV prophylaxis for HEI"}),(0,l.jsx)(Hm,Rp(Rp({label:"ARV prophylaxis for HEI"},n),{},{notched:!0,children:fy.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{error:!0,children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"eid.nvpAZTfor6Weeks",control:f,rules:{required:!0},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"NVP + AZT for 6 weeks"}),(0,l.jsx)(Hm,Rp(Rp({label:"NVP + AZT for 6 weeks"},n),{},{notched:!0,children:fy.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{error:!0,children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"eid.dateOfNVPAZTstarted",control:f,render:function(e){var t=e.field;return(0,l.jsx)(dv,Rp({label:"Date NVP + AZT started",type:"date",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0}},t))}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"eid.maternalArtStatus",control:f,rules:{required:!0},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"Maternal ART Status"}),(0,l.jsx)(Hm,Rp(Rp({label:"Maternal ART Status"},n),{},{notched:!0,children:by.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{error:!0,children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})})]}),"ViralLoad"===c&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"viralLoad.requesterName",control:f,rules:{required:!0},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Requester Name",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:null===(t=r.error)||void 0===t?void 0:t.message},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"viralLoad.requesterPhone",control:f,rules:{required:!0,validate:function(e){return gy.test(e)||"Invalid phone"}},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Requester Phone",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:null===(t=r.error)||void 0===t?void 0:t.message},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"viralLoad.patientMobilePhone",control:f,rules:{required:!0,validate:function(e){return gy.test(e)||"Invalid phone"}},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Patient Mobile Phone",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:null===(t=r.error)||void 0===t?void 0:t.message},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"viralLoad.uniqueArtId",control:f,rules:{required:!0},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Unique ART ID",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:null===(t=r.error)||void 0===t?void 0:t.message},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"viralLoad.ageInMonths",control:f,render:function(e){var t=e.field;return(0,l.jsx)(dv,Rp({label:"Age (Months) \u2013 optional",type:"number",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0}},t))}})}),(0,l.jsx)(Ci,{item:!0,xs:4,children:(0,l.jsx)(fg,{name:"viralLoad.artRegimen.regimenType",control:f,rules:{required:!0},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"Regimen Type"}),(0,l.jsx)(Hm,Rp(Rp({label:"Regimen Type"},n),{},{notched:!0,children:Oy.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{error:!0,children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})}),(0,l.jsx)(Ci,{item:!0,xs:4,children:(0,l.jsx)(fg,{name:"viralLoad.artRegimen.regimenName",control:f,rules:{required:!0},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Regimen (drug list)",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:null===(t=r.error)||void 0===t?void 0:t.message},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:4,children:(0,l.jsx)(fg,{name:"viralLoad.artRegimen.dateInitiated",control:f,rules:{required:!0},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Date Initiated",type:"date",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:null===(t=r.error)||void 0===t?void 0:t.message},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsx)(fg,{name:"viralLoad.cd4Info.cd4TestDoneInLast12Months",control:f,rules:{required:!0},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"CD4 Test Done in last 12 months?"}),(0,l.jsx)(Hm,Rp(Rp({},n),{},{notched:!0,children:fy.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{error:!0,children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})}),"Yes"===w&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"viralLoad.cd4Info.mostRecentCD4Count",control:f,rules:{required:!0},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Most Recent CD4 Count",type:"number",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:null===(t=r.error)||void 0===t?void 0:t.message},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"viralLoad.cd4Info.dateOfMostRecentCD4Count",control:f,rules:{required:!0},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Date of Most Recent CD4",type:"date",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:null===(t=r.error)||void 0===t?void 0:t.message},n))}})})]}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"viralLoad.reasonForTestCategory",control:f,rules:{required:!0},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"Reason Category"}),(0,l.jsx)(Hm,Rp(Rp({label:"Reason Category"},n),{},{notched:!0,children:ky.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{error:!0,children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})}),"Routine"===S&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"viralLoad.routineReasongr",control:f,render:function(e){var t=e.field;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"Routine Group"}),(0,l.jsx)(Hm,Rp(Rp({label:"Routine Group"},t),{},{notched:!0,children:Cy.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))}))]})}})}),(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsx)(fg,{name:"viralLoad.routineReasonOpt",control:f,render:function(e){var t=e.field;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"Routine Reason"}),(0,l.jsx)(Hm,Rp(Rp({label:"Routine Reason"},t),{},{notched:!0,children:Ry.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))}))]})}})})]}),"Targeted"===S&&(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsx)(fg,{name:"viralLoad.targetedReason",control:f,render:function(e){var t=e.field;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"Targeted Reason"}),(0,l.jsx)(Hm,Rp(Rp({label:"Targeted Reason"},t),{},{notched:!0,children:Ty.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))}))]})}})})]})]})}})]})}),(0,l.jsxs)(Ir,{display:"flex",justifyContent:"space-between",p:2,component:Di,bgcolor:"#121212cc",children:[(0,l.jsx)(Ef,{endIcon:(0,l.jsx)(bv,{}),onClick:function(){h(),i?i():a("/requests")},children:"Cancel"}),(0,l.jsx)(Ef,{variant:"contained",endIcon:(0,l.jsx)(wv,{}),type:"submit",children:"Save"})]})]})},Pb=Ml((0,l.jsx)("path",{d:"M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34a.9959.9959 0 0 0-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z"}),"Edit"),Eb=function(){var t=mo().sampleId,n=Ne((0,e.useState)(!1),2),r=n[0],o=n[1],i=Ne((0,e.useState)(!0),2),a=i[0],s=i[1],u=Ne((0,e.useState)({}),2),c=u[0],d=u[1];return(0,e.useEffect)((function(){Ki.get("/requests/".concat(t)).then((function(e){d(e.data),s(!1)}))}),[t,r]),a?(0,l.jsx)(Ri,{children:(0,l.jsx)(Ir,{flexGrow:1,display:"flex",alignItems:"center",justifyContent:"center",children:(0,l.jsx)(pi,{})})}):(0,l.jsxs)(Ir,{display:"flex",flexDirection:"column",flexGrow:1,children:[(0,l.jsxs)(Ir,{display:"flex",flexDirection:"column",component:Di,padding:2,bgcolor:"#121212cc",flexGrow:1,children:[(0,l.jsxs)(Ir,{display:"flex",alignItems:"center",justifyContent:"space-between",children:[(0,l.jsxs)(Ir,{display:"flex",alignItems:"center",children:[(0,l.jsx)(To,{to:"/requests/",children:(0,l.jsx)(Ec,{children:(0,l.jsx)(xv,{})})}),(0,l.jsx)(Ir,{marginRight:1}),(0,l.jsx)(Wi,{children:c.sampleId})]}),(0,l.jsx)(Ec,{onClick:function(){return o(!0)},children:(0,l.jsx)(Pb,{})})]}),(0,l.jsx)(Ir,{marginBottom:1}),(0,l.jsx)(Di,{component:Ir,padding:1,children:(0,l.jsxs)(Ci,{container:!0,spacing:2,children:[(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Type"}),(0,l.jsx)(Wi,{variant:"body1",children:c.testType})]}),(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Created At"}),(0,l.jsx)(Wi,{variant:"body1",children:jp()(c.createdAt).fromNow()})]})]})}),(0,l.jsx)(Ir,{marginBottom:2}),"Patient"===c.testType?(0,l.jsx)(Di,{component:Ir,padding:1,children:(0,l.jsxs)(Ci,{container:!0,spacing:2,children:[(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"MRN"}),(0,l.jsx)(Wi,{variant:"body1",children:c.mrn})]}),(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Name"}),(0,l.jsx)(Wi,{variant:"body1",children:c.name})]}),(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Age"}),(0,l.jsx)(Wi,{variant:"body1",children:c.age})]}),(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Gender"}),(0,l.jsx)(Wi,{variant:"body1",children:c.gender})]}),(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Reason for Diagnosis"}),(0,l.jsx)(Wi,{variant:"body1",children:c.reasonForDiagnosis})]}),(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"HIV Status"}),(0,l.jsx)(Wi,{variant:"body1",children:c.hivStatus})]}),(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Site of Infection"}),(0,l.jsx)(Wi,{variant:"body1",children:c.infectionSite})]}),(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Treatment History"}),(0,l.jsx)(Wi,{variant:"body1",children:c.previouslyTreated})]}),(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Sample type"}),(0,l.jsx)(Wi,{variant:"body1",children:c.sampleType})]}),(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Date of Sample Collection"}),(0,l.jsx)(Wi,{variant:"body1",children:c.sampleCollectedAt&&jp()(c.sampleCollectedAt).format("Do MMMM YYYY")})]}),(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Sample Collection Site"}),(0,l.jsx)(Wi,{variant:"body1",children:c.sampleCollectionSiteType})]}),(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Patient Contacts"}),(0,l.jsx)(Wi,{variant:"body1",children:c.patientContacts||"None"})]}),(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Clinician Contacts"}),(0,l.jsx)(Wi,{variant:"body1",children:c.clinicianContacts||"None"})]}),(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Referring Lab Contacts"}),(0,l.jsx)(Wi,{variant:"body1",children:c.referringLabContacts||"None"})]})]})}):null,"Panel"===c.testType?(0,l.jsx)(Di,{component:Ir,padding:1,children:(0,l.jsxs)(Ci,{container:!0,spacing:2,children:[(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Panel Provider"}),(0,l.jsx)(Wi,{variant:"body1",children:c.panelProvider})]}),(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Panel Scheme"}),(0,l.jsx)(Wi,{variant:"body1",children:c.panelScheme})]}),(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Panel Year"}),(0,l.jsx)(Wi,{variant:"body1",children:c.panelYear})]}),(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Panel Round"}),(0,l.jsx)(Wi,{variant:"body1",children:c.panelRound})]}),(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"PT Id"}),(0,l.jsx)(Wi,{variant:"body1",children:c.panelPtId})]})]})}):null,"Research"===c.testType?(0,l.jsx)(Di,{component:Ir,padding:1,children:(0,l.jsxs)(Ci,{container:!0,spacing:2,children:[(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Research Name"}),(0,l.jsx)(Wi,{variant:"body1",children:c.researchName})]}),(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Participant ID"}),(0,l.jsx)(Wi,{variant:"body1",children:c.mrn})]}),(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Age"}),(0,l.jsx)(Wi,{variant:"body1",children:c.age})]}),(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Gender"}),(0,l.jsx)(Wi,{variant:"body1",children:c.gender})]})]})}):null]}),(0,l.jsx)(cc,{open:r,style:{display:"flex"},children:(0,l.jsx)(Ir,{bgcolor:"#242424cc",marginY:1,maxWidth:"480px",display:"flex",flexDirection:"column",flexGrow:1,marginX:"auto",children:(0,l.jsx)(Ob,{request:c,onSuccess:function(){return o(!1)},onCancel:function(){return o(!1)}})})})]})},Mb=function(e){var t=e.trim().toLowerCase();return"xpert_hiv-1 qual"===t||"xpert hiv-1 qual xc dbs"==t?"EID":"xpert mtb-rif assay g4"===t||"xpert mtb-rif ultra"===t||"xpert mtb-xdr"===t?"TB":"xpert_hiv-1 viral load"===t?"ViralLoad":"UNKNOWN"},_b=function(){var t,n,r=mo().hours,o=Ne((0,e.useState)(),2),i=o[0],a=o[1],s=Ne((0,e.useState)(),2),u=s[0],c=s[1],d=Ne((0,e.useState)(0),2),f=d[0],p=d[1];return(0,e.useEffect)((function(){Ki.get("/tests?hours=".concat(r)).then((function(e){return e.data})).then((function(e){if(console.log("Tests needing details:",e),0===e.length)return function(){var e;window.API.closeKiosk(),null===(e=window.API)||void 0===e||e.close()}();a(e)}))}),[f,r]),Ja(i)?(0,l.jsx)(Ri,{children:(0,l.jsx)(Ir,{flexGrow:1,display:"flex",alignItems:"center",justifyContent:"center",children:(0,l.jsx)(pi,{})})}):(0,l.jsxs)(Ti,{id:"next_tests_prompt_at",warning:"Test details are required to enable realtime epidemiology and SMS to doctors and patients",children:[(0,l.jsx)(Ci,{container:!0,component:Ir,margin:2,children:(0,l.jsxs)(Ci,{item:!0,md:8,children:[(0,l.jsx)(Wi,{variant:"h4",fontWeight:300,children:"Provide Test Details"}),(0,l.jsxs)(Wi,{variant:"body1",fontWeight:200,children:["\u12a5\u1263\u12ad\u12ce \u12a8\u1273\u127d \u12e8\u1270\u12d8\u1228\u12d8\u1228\u12cd\u1295 \u1218\u1228\u1303 \u1233\u12ed\u121e\u1209 \u12a0\u12ed\u1208\u1349\u1361\u1361 \u12ed\u1205\u121d \u12e8\u1272\u1262 GeneXpert \u121d\u122d\u1218\u122b \u12cd\u1324\u1275 \u1260\u1240\u1325\u1273 \u1208\u1205\u12ad\u121d\u1293 \u1263\u1208\u1219\u12eb \u1260\u1218\u120b\u12ad \u12e8\u12cd\u1324\u1275 \u1218\u12d8\u130d\u12e8\u1275\u1295 \u12eb\u1235\u1240\u122b\u120d \u12a5\u1295\u12f2\u1201\u121d \u12e8\u1270\u121f\u120b \u12e8\u1272\u1262 \u121d\u122d\u1218\u122b \u1218\u1228\u1303 \u1208\u121b\u130d\u1298\u1275 \u12eb\u1235\u127d\u120b\u120d\u1361\u1361 (\u1324\u1293 \u121a\u1292\u1235\u1274\u122d \u12a5\u1293 \u12e8\u12a2\u1275\u12ee\u1335\u12eb \u1205\u1265\u1228\u1270\u1230\u1265 \u1324\u1293 \u12a2\u1295\u1235\u1272\u1275\u12e9\u1275)",(0,l.jsx)("br",{}),(0,l.jsx)("br",{}),"This is for the Ministry of Health to track all TB cases across the country and to enable sending of SMS to doctors or patients when the tests are completed for improved TAT. Click a test below to fill in the required information"]})]})}),(0,l.jsx)(Ir,{component:Di,className:"scroll_enabled",overflow:"auto",padding:2,margin:2,marginTop:0,flexGrow:1,children:(0,l.jsx)(Ci,{container:!0,spacing:1,children:i.map((function(e){return(0,l.jsx)(Ci,{item:!0,sm:6,md:4,children:(0,l.jsxs)(Ir,{component:Di,padding:1,display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center",style:{cursor:"pointer"},onClick:function(){return c(e.sampleId)},borderRadius:1,variant:"outlined",children:[(0,l.jsxs)(Ir,{children:[(0,l.jsxs)(Ir,{display:"flex",flexDirection:"row",marginBottom:1,children:[(0,l.jsx)(wp,{label:e.assay,size:"small"}),(0,l.jsx)(Ir,{paddingLeft:1}),(0,l.jsx)(wp,{label:e.sampleId,size:"small"})]}),(0,l.jsx)(Wi,{variant:"caption",children:jp()(e.startedAt).fromNow()})]}),(0,l.jsx)(cu,{})]})})}))})}),(0,l.jsxs)(md,{open:!Ja(u),children:[(0,l.jsx)(wd,{children:u}),(0,l.jsx)(Ob,{request:{sampleId:u,diagnosisType:Mb(null!==(t=null===(n=i.find((function(e){return e.sampleId===u})))||void 0===n?void 0:n.assay)&&void 0!==t?t:"")},onSuccess:function(){c(void 0),p((function(e){return e+1}))},onCancel:function(){return c(void 0)}})]})]})},Db={requests:"/tests/0",inventory:"/stock",lab:"/lab"};var Ib=function(){return(0,l.jsxs)(Ri,{children:[(0,l.jsx)(au,{active:"calibration"}),(0,l.jsx)(yo,{})]})},Ab=["className"],Nb=Yo("div",{name:"MuiListItemIcon",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,"flex-start"===n.alignItems&&t.alignItemsFlexStart]}})((function(e){var t=e.theme,n=e.ownerState;return r({minWidth:56,color:(t.vars||t).palette.action.active,flexShrink:0,display:"inline-flex"},"flex-start"===n.alignItems&&{marginTop:8})})),Lb=e.forwardRef((function(t,n){var o=ln({props:t,name:"MuiListItemIcon"}),i=o.className,a=Te(o,Ab),s=r({},o,{alignItems:e.useContext(Df).alignItems}),u=function(e){return Po({root:["root","flex-start"===e.alignItems&&"alignItemsFlexStart"]},Um,e.classes)}(s);return(0,l.jsx)(Nb,r({className:wn(u.root,i),ownerState:s,ref:n},a))})),zb=Lb,Fb=Ml((0,l.jsx)("path",{d:"M20 2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-8.5 7.5c0 .83-.67 1.5-1.5 1.5H9v2H7.5V7H10c.83 0 1.5.67 1.5 1.5v1zm5 2c0 .83-.67 1.5-1.5 1.5h-2.5V7H15c.83 0 1.5.67 1.5 1.5v3zm4-3H19v1h1.5V11H19v2h-1.5V7h3v1.5zM9 9.5h1v-1H9v1zM4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm10 5.5h1v-3h-1v3z"}),"PictureAsPdf"),Wb=function(){var t,n,r=lu((function(){return Ki.get("/calibrations/").then((function(e){return e.data}))}),[]),o=lu((function(e){return function(e){return Ki.post("/calibrations/",e).then((function(e){return e.data}))}(e)}));function i(e){var t,n=Ne(Array.from(null===(t=e.target)||void 0===t?void 0:t.files),1)[0];o.fetch({name:n.name,path:n.path}).then((function(){return r.fetch()}))}return(0,e.useEffect)((function(){r.fetch()}),[]),(0,l.jsxs)(Ir,{display:"flex",flexDirection:"column",bgcolor:"#121212cc",flexGrow:1,overflow:"auto",children:[(0,l.jsx)(nd,{sx:{margin:0,top:"auto",right:20,bottom:20,left:"auto",position:"fixed"},size:"large",onClick:function(){var e=document.createElement("input");e.type="file",e.accept="application/pdf",e.onchange=i,e.click()},children:(0,l.jsx)(lp,{})}),0===(null===(t=r.value)||void 0===t?void 0:t.length)?(0,l.jsx)(Ir,{display:"flex",flexGrow:1,alignItems:"center",justifyContent:"center",children:(0,l.jsx)(Wi,{variant:"h5",children:"No Calibration Reports Found"})}):(0,l.jsx)(fp,{children:null===(n=r.value)||void 0===n?void 0:n.map((function(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)(Gf,{style:{cursor:"pointer"},onClick:function(){return function(e){window.API.openFile(e.path)}(e)},children:[(0,l.jsx)(zb,{children:(0,l.jsx)(Fb,{})}),(0,l.jsx)(Jf,{children:e.name})]}),(0,l.jsx)(ap,{variant:"fullWidth",component:"li"})]})}))})]})};function Bb(e){return Qo("MuiTableContainer",e)}$o("MuiTableContainer",["root"]);var Vb=["className","component"],qb=Yo("div",{name:"MuiTableContainer",slot:"Root",overridesResolver:function(e,t){return t.root}})({width:"100%",overflowX:"auto"}),Hb=e.forwardRef((function(e,t){var n=ln({props:e,name:"MuiTableContainer"}),o=n.className,i=n.component,a=void 0===i?"div":i,s=Te(n,Vb),u=r({},n,{component:a}),c=function(e){return Po({root:["root"]},Bb,e.classes)}(u);return(0,l.jsx)(qb,r({ref:t,as:a,className:wn(c.root,o),ownerState:u},s))})),Ub=Hb;var Yb=e.createContext();function Gb(e){return Qo("MuiTable",e)}$o("MuiTable",["root","stickyHeader"]);var Qb=["className","component","padding","size","stickyHeader"],$b=Yo("table",{name:"MuiTable",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,n.stickyHeader&&t.stickyHeader]}})((function(e){var t=e.theme,n=e.ownerState;return r({display:"table",width:"100%",borderCollapse:"collapse",borderSpacing:0,"& caption":r({},t.typography.body2,{padding:t.spacing(2),color:(t.vars||t).palette.text.secondary,textAlign:"left",captionSide:"bottom"})},n.stickyHeader&&{borderCollapse:"separate"})})),Kb="table",Xb=e.forwardRef((function(t,n){var o=ln({props:t,name:"MuiTable"}),i=o.className,a=o.component,s=void 0===a?Kb:a,u=o.padding,c=void 0===u?"normal":u,d=o.size,f=void 0===d?"medium":d,p=o.stickyHeader,h=void 0!==p&&p,m=Te(o,Qb),v=r({},o,{component:s,padding:c,size:f,stickyHeader:h}),g=function(e){var t=e.classes;return Po({root:["root",e.stickyHeader&&"stickyHeader"]},Gb,t)}(v),y=e.useMemo((function(){return{padding:c,size:f,stickyHeader:h}}),[c,f,h]);return(0,l.jsx)(Yb.Provider,{value:y,children:(0,l.jsx)($b,r({as:s,role:s===Kb?null:"table",ref:n,className:wn(g.root,i),ownerState:v},m))})})),Zb=Xb;var Jb=e.createContext();function ew(e){return Qo("MuiTableHead",e)}$o("MuiTableHead",["root"]);var tw=["className","component"],nw=Yo("thead",{name:"MuiTableHead",slot:"Root",overridesResolver:function(e,t){return t.root}})({display:"table-header-group"}),rw={variant:"head"},ow="thead",iw=e.forwardRef((function(e,t){var n=ln({props:e,name:"MuiTableHead"}),o=n.className,i=n.component,a=void 0===i?ow:i,s=Te(n,tw),u=r({},n,{component:a}),c=function(e){return Po({root:["root"]},ew,e.classes)}(u);return(0,l.jsx)(Jb.Provider,{value:rw,children:(0,l.jsx)(nw,r({as:a,className:wn(c.root,o),ref:t,role:a===ow?null:"rowgroup",ownerState:u},s))})})),aw=iw;function lw(e){return Qo("MuiTableRow",e)}var sw=$o("MuiTableRow",["root","selected","hover","head","footer"]),uw=["className","component","hover","selected"],cw=Yo("tr",{name:"MuiTableRow",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,n.head&&t.head,n.footer&&t.footer]}})((function(e){var t,n=e.theme;return Ee(t={color:"inherit",display:"table-row",verticalAlign:"middle",outline:0},"&.".concat(sw.hover,":hover"),{backgroundColor:(n.vars||n).palette.action.hover}),Ee(t,"&.".concat(sw.selected),{backgroundColor:n.vars?"rgba(".concat(n.vars.palette.primary.mainChannel," / ").concat(n.vars.palette.action.selectedOpacity,")"):Tt(n.palette.primary.main,n.palette.action.selectedOpacity),"&:hover":{backgroundColor:n.vars?"rgba(".concat(n.vars.palette.primary.mainChannel," / calc(").concat(n.vars.palette.action.selectedOpacity," + ").concat(n.vars.palette.action.hoverOpacity,"))"):Tt(n.palette.primary.main,n.palette.action.selectedOpacity+n.palette.action.hoverOpacity)}}),t})),dw=e.forwardRef((function(t,n){var o=ln({props:t,name:"MuiTableRow"}),i=o.className,a=o.component,s=void 0===a?"tr":a,u=o.hover,c=void 0!==u&&u,d=o.selected,f=void 0!==d&&d,p=Te(o,uw),h=e.useContext(Jb),m=r({},o,{component:s,hover:c,selected:f,head:h&&"head"===h.variant,footer:h&&"footer"===h.variant}),v=function(e){var t=e.classes;return Po({root:["root",e.selected&&"selected",e.hover&&"hover",e.head&&"head",e.footer&&"footer"]},lw,t)}(m);return(0,l.jsx)(cw,r({as:s,ref:n,className:wn(v.root,i),role:"tr"===s?null:"row",ownerState:m},p))})),fw=dw;function pw(e){return Qo("MuiTableCell",e)}var hw=$o("MuiTableCell",["root","head","body","footer","sizeSmall","sizeMedium","paddingCheckbox","paddingNone","alignLeft","alignCenter","alignRight","alignJustify","stickyHeader"]),mw=["align","className","component","padding","scope","size","sortDirection","variant"],vw=Yo("td",{name:"MuiTableCell",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,t[n.variant],t["size".concat(Eo(n.size))],"normal"!==n.padding&&t["padding".concat(Eo(n.padding))],"inherit"!==n.align&&t["align".concat(Eo(n.align))],n.stickyHeader&&t.stickyHeader]}})((function(e){var t=e.theme,n=e.ownerState;return r({},t.typography.body2,{display:"table-cell",verticalAlign:"inherit",borderBottom:t.vars?"1px solid ".concat(t.vars.palette.TableCell.border):"1px solid\n    ".concat("light"===t.palette.mode?Pt(Tt(t.palette.divider,1),.88):Ot(Tt(t.palette.divider,1),.68)),textAlign:"left",padding:16},"head"===n.variant&&{color:(t.vars||t).palette.text.primary,lineHeight:t.typography.pxToRem(24),fontWeight:t.typography.fontWeightMedium},"body"===n.variant&&{color:(t.vars||t).palette.text.primary},"footer"===n.variant&&{color:(t.vars||t).palette.text.secondary,lineHeight:t.typography.pxToRem(21),fontSize:t.typography.pxToRem(12)},"small"===n.size&&Ee({padding:"6px 16px"},"&.".concat(hw.paddingCheckbox),{width:24,padding:"0 12px 0 16px","& > *":{padding:0}}),"checkbox"===n.padding&&{width:48,padding:"0 0 0 4px"},"none"===n.padding&&{padding:0},"left"===n.align&&{textAlign:"left"},"center"===n.align&&{textAlign:"center"},"right"===n.align&&{textAlign:"right",flexDirection:"row-reverse"},"justify"===n.align&&{textAlign:"justify"},n.stickyHeader&&{position:"sticky",top:0,zIndex:2,backgroundColor:(t.vars||t).palette.background.default})})),gw=e.forwardRef((function(t,n){var o,i=ln({props:t,name:"MuiTableCell"}),a=i.align,s=void 0===a?"inherit":a,u=i.className,c=i.component,d=i.padding,f=i.scope,p=i.size,h=i.sortDirection,m=i.variant,v=Te(i,mw),g=e.useContext(Yb),y=e.useContext(Jb),x=y&&"head"===y.variant;o=c||(x?"th":"td");var b=f;!b&&x&&(b="col");var w=m||y&&y.variant,S=r({},i,{align:s,component:o,padding:d||(g&&g.padding?g.padding:"normal"),size:p||(g&&g.size?g.size:"medium"),sortDirection:h,stickyHeader:"head"===w&&g&&g.stickyHeader,variant:w}),j=function(e){var t=e.classes,n=e.variant,r=e.align,o=e.padding,i=e.size;return Po({root:["root",n,e.stickyHeader&&"stickyHeader","inherit"!==r&&"align".concat(Eo(r)),"normal"!==o&&"padding".concat(Eo(o)),"size".concat(Eo(i))]},pw,t)}(S),k=null;return h&&(k="asc"===h?"ascending":"descending"),(0,l.jsx)(vw,r({as:o,ref:n,className:wn(j.root,u),"aria-sort":k,scope:b,ownerState:S},v))})),yw=gw;function xw(e){return Qo("MuiTableBody",e)}$o("MuiTableBody",["root"]);var bw,ww,Sw,jw=["className","component"],kw=Yo("tbody",{name:"MuiTableBody",slot:"Root",overridesResolver:function(e,t){return t.root}})({display:"table-row-group"}),Cw={variant:"body"},Rw="tbody",Tw=e.forwardRef((function(e,t){var n=ln({props:e,name:"MuiTableBody"}),o=n.className,i=n.component,a=void 0===i?Rw:i,s=Te(n,jw),u=r({},n,{component:a}),c=function(e){return Po({root:["root"]},xw,e.classes)}(u);return(0,l.jsx)(Jb.Provider,{value:Cw,children:(0,l.jsx)(kw,r({className:wn(c.root,o),as:a,ref:t,role:a===Rw?null:"rowgroup",ownerState:u},s))})})),Ow=Tw,Pw="2.0.3",Ew=Ml((0,l.jsx)("path",{d:"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-6.99 15c-.7 0-1.26-.56-1.26-1.26 0-.71.56-1.25 1.26-1.25.71 0 1.25.54 1.25 1.25-.01.69-.54 1.26-1.25 1.26zm3.01-7.4c-.76 1.11-1.48 1.46-1.87 2.17-.16.29-.22.48-.22 1.41h-1.82c0-.49-.08-1.29.31-1.98.49-.87 1.42-1.39 1.96-2.16.57-.81.25-2.33-1.37-2.33-1.06 0-1.58.8-1.8 1.48l-1.65-.7C9.01 7.15 10.22 6 11.99 6c1.48 0 2.49.67 3.01 1.52.44.72.7 2.07.02 3.08z"}),"HelpCenter"),Mw=Ml((0,l.jsx)("path",{d:"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2z"}),"ChatBubble"),_w=Ml((0,l.jsx)("path",{d:"M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-5 14H4v-4h11v4zm0-5H4V9h11v4zm5 5h-4V9h4v9z"}),"Web"),Dw=[{label:"Visit Help Center",icon:(0,l.jsx)(Ew,{}),link:null===(bw=$i.links)||void 0===bw?void 0:bw.helpcenter},{label:"Chat Support",icon:(0,l.jsx)(Mw,{}),link:null===(ww=$i.links)||void 0===ww?void 0:ww.support},{label:"Website",icon:(0,l.jsx)(_w,{}),link:null===(Sw=$i.links)||void 0===Sw?void 0:Sw.website}].filter((function(e){return e.link})),Iw=function(){var t,n,r=lu((function(){return Ki.get("/labs/current").then((function(e){return e.data}))})),o=Ne((0,e.useState)(!0),2),i=o[0],a=o[1],s=Ne(e.useState([]),2),u=s[0],c=s[1];return(0,e.useEffect)((function(){r.fetch(),Ki.get("/contact-persons").then((function(e){c(e.data),a(!1)}))}),[]),i?(0,l.jsx)(Ri,{children:(0,l.jsx)(Ir,{flexGrow:1,display:"flex",alignItems:"center",justifyContent:"center",children:(0,l.jsx)(pi,{})})}):(0,l.jsxs)(Ri,{children:[(0,l.jsx)(au,{active:"about"}),(0,l.jsxs)(Ir,{component:Di,padding:2,margin:1,flexGrow:1,display:"flex",flexDirection:"column",overflow:"auto",className:"scroll_enabled",justifyContent:"space-between",children:[(0,l.jsxs)(Ir,{display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"flex-start",children:[(0,l.jsxs)(Ir,{display:"flex",children:[(0,l.jsx)(Wi,{variant:"h4",fontWeight:900,color:"primary",children:"Relay"}),(0,l.jsxs)(Wi,{variant:"body2",fontWeight:500,color:"primary",children:["v",Pw]})]}),(0,l.jsxs)(Ir,{children:[(0,l.jsx)(Wi,{variant:"h6",fontWeight:700,color:"primary",align:"right",children:null===(t=r.value)||void 0===t?void 0:t.name}),(0,l.jsx)(Wi,{variant:"caption",color:"gray",align:"right",children:null===(n=r.value)||void 0===n?void 0:n.address})]})]}),(0,l.jsxs)(Ir,{marginBottom:5,children:[(0,l.jsxs)(Ub,{component:Di,sx:{maxWidth:800,margin:"auto",mt:1},children:[(0,l.jsx)(Wi,{variant:"overline",align:"center",sx:{py:2,display:"block"},children:"Support Contacts"}),(0,l.jsxs)(Zb,{children:[(0,l.jsx)(aw,{children:(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{children:"Name"}),(0,l.jsx)(yw,{children:"Phone"}),(0,l.jsx)(yw,{children:"Email"})]})}),(0,l.jsx)(Ow,{children:u.map((function(e){return(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{children:e.name}),(0,l.jsx)(yw,{children:e.phone}),(0,l.jsx)(yw,{children:e.email})]},e.id)}))})]})]}),(0,l.jsx)(Ir,{marginTop:3,sx:{display:"flex",justifyContent:"center",gap:2,py:1},children:Dw.map((function(e){return(0,l.jsx)(Ef,{startIcon:e.icon,disabled:e.disabled,onClick:function(){return!e.disabled&&window.API.openBrowser(e.link)},sx:{color:"white",textTransform:"none"},children:e.label},e.link)}))})]}),(0,l.jsxs)(Ir,{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",children:[(0,l.jsx)(Py,{when:Boolean($i.logo),render:function(){return(0,l.jsx)("img",{src:$i.logo,alt:$i.publisher,height:"96px"})}}),(0,l.jsxs)(Wi,{variant:"caption",fontWeight:700,color:"gray",children:["\xa9 ",jp()().format("YYYY")," ",$i.publisher,". All Rights Reserved"]})]})]})]})},Aw=Ml((0,l.jsx)("path",{d:"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"}),"Search"),Nw=n(2808),Lw=function(){var t,n=po(),r=Ne((0,e.useState)(),2),o=r[0],i=r[1],a=Ne((0,e.useState)(""),2),s=a[0],u=a[1],c=lu((function(){return Ki.get("/labs/current").then((function(){return!0})).catch((function(){return!1}))})),d=lu(zw),f=lu((function(e){return function(e){return Ki.get("/labs?".concat((0,Nw.stringify)({name:e}))).then((function(e){return e.data}))}(e)}));return(0,e.useEffect)((function(){c.fetch().then((function(e){e&&n("/home")}))}),[]),(0,e.useEffect)((function(){f.fetch(s)}),[s]),c.loading||c.value?(0,l.jsx)(Ri,{children:(0,l.jsx)(Ir,{flexGrow:1,display:"flex",flexDirection:"column",padding:2,overflow:"auto",alignItems:"center",justifyContent:"center",children:(0,l.jsx)(pi,{})})}):(0,l.jsx)(Ti,{id:"next_lab_prompt_at",warning:"We need to associate this machine with a lab",children:(0,l.jsxs)(Ir,{flexGrow:1,display:"flex",flexDirection:"column",padding:2,overflow:"auto",children:[(0,l.jsx)(Ci,{container:!0,children:(0,l.jsx)(Ci,{item:!0,md:8,children:(0,l.jsxs)(Ir,{children:[(0,l.jsx)(Wi,{variant:"h4",fontWeight:300,children:"Select Your Lab"}),(0,l.jsx)(Wi,{variant:"body1",fontWeight:100,children:"Looks like your machine is not associated with a facility in the system. Search and select the lab in which this computer is installed. Results from this computer will be associated with the lab you select"})]})})}),(0,l.jsxs)(Ir,{component:Di,marginTop:2,marginBottom:1,sx:{p:"2px 4px",display:"flex",alignItems:"center"},children:[(0,l.jsx)(um,{sx:{ml:1,flex:1},placeholder:"Search",value:s,onChange:function(e){return u(e.target.value)}}),(0,l.jsx)(Ec,{type:"submit",sx:{p:"10px"},"aria-label":"search",children:f.loading?(0,l.jsx)(pi,{size:"24px"}):(0,l.jsx)(Aw,{})})]}),(0,l.jsx)(Ir,{flexGrow:1,component:Di,overflow:"auto",className:"scroll_enabled",children:(0,l.jsx)(fp,{children:null===(t=f.value)||void 0===t?void 0:t.map((function(e){return(0,l.jsxs)(Gf,{divider:!0,onClick:function(){return i(e)},children:[(0,l.jsx)(zb,{children:(0,l.jsx)(mf,{checked:(null===o||void 0===o?void 0:o.id)===e.id})}),(0,l.jsx)(Jf,{primary:e.name,secondary:e.address})]})}))})}),(0,l.jsx)(Ir,{marginTop:2,justifyContent:"flex-end",alignItems:"flex-end",display:"flex",children:(0,l.jsx)(Ef,{variant:"contained",disabled:!o||d.loading,onClick:function(){o&&d.fetch(o).then((function(){window.API.closeKiosk(),n("/register")}))},endIcon:d.loading?(0,l.jsx)(pi,{size:24}):(0,l.jsx)(wv,{}),children:"Continue"})})]})})};function zw(e){return Ki.post("/labs",e).then((function(e){return e.data}))}var Fw=Ml((0,l.jsx)("path",{d:"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"}),"CheckBoxOutlineBlank"),Ww=Ml((0,l.jsx)("path",{d:"M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"}),"CheckBox"),Bw=Ml((0,l.jsx)("path",{d:"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-2 10H7v-2h10v2z"}),"IndeterminateCheckBox");function Vw(e){return Qo("MuiCheckbox",e)}var qw=$o("MuiCheckbox",["root","checked","disabled","indeterminate","colorPrimary","colorSecondary"]),Hw=["checkedIcon","color","icon","indeterminate","indeterminateIcon","inputProps","size"],Uw=Yo(Jd,{shouldForwardProp:function(e){return qo(e)||"classes"===e},name:"MuiCheckbox",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,n.indeterminate&&t.indeterminate,"default"!==n.color&&t["color".concat(Eo(n.color))]]}})((function(e){var t,n=e.theme,o=e.ownerState;return r({color:(n.vars||n).palette.text.secondary},!o.disableRipple&&{"&:hover":{backgroundColor:n.vars?"rgba(".concat("default"===o.color?n.vars.palette.action.activeChannel:n.vars.palette.primary.mainChannel," / ").concat(n.vars.palette.action.hoverOpacity,")"):Tt("default"===o.color?n.palette.action.active:n.palette[o.color].main,n.palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:"transparent"}}},"default"!==o.color&&(Ee(t={},"&.".concat(qw.checked,", &.").concat(qw.indeterminate),{color:(n.vars||n).palette[o.color].main}),Ee(t,"&.".concat(qw.disabled),{color:(n.vars||n).palette.action.disabled}),t))})),Yw=(0,l.jsx)(Ww,{}),Gw=(0,l.jsx)(Fw,{}),Qw=(0,l.jsx)(Bw,{}),$w=e.forwardRef((function(t,n){var o,i,a=ln({props:t,name:"MuiCheckbox"}),s=a.checkedIcon,u=void 0===s?Yw:s,c=a.color,d=void 0===c?"primary":c,f=a.icon,p=void 0===f?Gw:f,h=a.indeterminate,m=void 0!==h&&h,v=a.indeterminateIcon,g=void 0===v?Qw:v,y=a.inputProps,x=a.size,b=void 0===x?"medium":x,w=Te(a,Hw),S=m?g:p,j=m?g:u,k=r({},a,{color:d,indeterminate:m,size:b}),C=function(e){var t=e.classes,n=e.indeterminate,o=e.color;return r({},t,Po({root:["root",n&&"indeterminate","color".concat(Eo(o))]},Vw,t))}(k);return(0,l.jsx)(Uw,r({type:"checkbox",inputProps:r({"data-indeterminate":m},y),icon:e.cloneElement(S,{fontSize:null!=(o=S.props.fontSize)?o:b}),checkedIcon:e.cloneElement(j,{fontSize:null!=(i=j.props.fontSize)?i:b}),ownerState:k,ref:n},w,{classes:C}))})),Kw=$w,Xw=function(){var t,n,r=Ne((0,e.useState)([]),2),o=r[0],i=r[1],a=po(),s=lu((function(){return Ki.get("/instruments").then((function(e){return e.data.filter((function(e){return e.active})).map((function(e){return e.serial}))}))})),u=lu((function(){return Ki.get("/device").then((function(e){return e.data}))})),c=lu((function(e){return Ki.post("/instruments",e)})),d=(null===(t=u.value)||void 0===t?void 0:t.modules)||[];return(0,e.useEffect)((function(){u.fetch(),s.fetch().then((function(e){return i(e)}))}),[]),(0,l.jsx)(Ri,{children:(0,l.jsxs)(Ir,{flexGrow:1,display:"flex",flexDirection:"column",padding:2,overflow:"auto",children:[(0,l.jsxs)(Ir,{padding:2,children:[(0,l.jsx)(Wi,{align:"center",variant:"h4",fontWeight:100,children:"Select Connected Instruments"}),(0,l.jsxs)(Wi,{align:"center",variant:"body1",display:"block",fontWeight:100,children:[Xa(Aa("instrument",(null===(n=u.value)||void 0===n?void 0:n.modules)||[])).length," ","instruments have been detected but some of these instruments may not be in use anymore. Please generate an installation qualification report and select only instruments present in the report"]})]}),(0,l.jsx)(Ir,{children:Xa(Aa("instrument",d)).map((function(e){var t=d.filter((function(t){return t.instrument===e}));return{serial:e,lastSeen:Math.max.apply(Math,Rr(t.map((function(e){return jp()(e.lastLoggedAt).toDate().getTime()})))),modules:el(t.map((function(e){return Ee({},e.position,e.serial)})))}})).map((function(e){return(0,l.jsxs)(Di,{component:Ir,marginBottom:1,display:"flex",flexDirection:"row",alignItems:"center",overflow:"auto",children:[(0,l.jsx)(Kw,{checked:o.includes(e.serial),onChange:function(){return function(e){i((function(t){return t.includes(e)?t.filter((function(t){return t!==e})):[].concat(Rr(t),[e])}))}(e.serial)}}),(0,l.jsxs)(Ir,{marginRight:"16px",width:96,children:[(0,l.jsx)(Wi,{variant:"caption",children:e.serial}),(0,l.jsx)(Ir,{children:(0,l.jsx)(Wi,{variant:"caption",color:"#aaa",fontSize:"10px",display:"block",children:jp()(e.lastSeen).fromNow()})})]}),(0,l.jsx)(Ir,{display:"flex",flexDirection:"row",overflow:"auto",children:Object.keys(e.modules).map((function(t){return(0,l.jsx)(Ir,{border:"1px solid #eeeeee55",marginRight:"4px",padding:"0 4px",width:84,children:(0,l.jsxs)(Ir,{display:"flex",alignItems:"center",flexDirection:"row",justifyContent:"space-between",children:[(0,l.jsx)(Wi,{variant:"caption",fontWeight:"bold",color:"primary",children:t}),(0,l.jsx)(Wi,{variant:"caption",children:e.modules[t]})]})})}))})]})}))}),(0,l.jsx)(Ir,{marginY:2,justifyContent:"flex-end",alignItems:"flex-end",display:"flex",children:(0,l.jsx)(Ef,{disabled:0===o.length,endIcon:(0,l.jsx)(wv,{}),onClick:function(){c.fetch(Xa(d.map((function(e){return e.instrument}))).map((function(e){return{serial:e,active:o.includes(e)}}))).then((function(){return a("/register")}))},children:"Continue"})})]})})},Zw=function(){var t=Ne((0,e.useState)(0),2),n=t[0],r=t[1],o=po(),i=lu((function(){return Ki.get("/device").then((function(e){return e.data}))}));return(0,e.useEffect)((function(){i.fetch().then((function(){o("/home")}))}),[n]),(0,e.useEffect)((function(){var e=setInterval((function(){return r((function(e){return e++}))}),5e3);return function(){return clearInterval(e)}}),[]),(0,l.jsx)(Ri,{children:(0,l.jsx)(Ir,{flexGrow:1,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",padding:8,children:(0,l.jsx)(pi,{size:64})})})},Jw=function(){var t=po(),n=lu((function(){return Ki.post("/device/register").then((function(e){return e.data}))}));return(0,e.useEffect)((function(){n.fetch().then((function(){t("/")}))}),[]),(0,l.jsx)(Ri,{children:(0,l.jsxs)(Ir,{flexGrow:1,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",padding:8,children:[(0,l.jsx)(pi,{size:64}),(0,l.jsx)(Ir,{marginTop:1}),(0,l.jsx)(Wi,{variant:"h6",fontWeight:100,children:"Saving Your Configuration"})]})})};function eS(e){return Qo("MuiTooltip",e)}var tS=$o("MuiTooltip",["popper","popperInteractive","popperArrow","popperClose","tooltip","tooltipArrow","touch","tooltipPlacementLeft","tooltipPlacementRight","tooltipPlacementTop","tooltipPlacementBottom","arrow"]),nS=["arrow","children","classes","components","componentsProps","describeChild","disableFocusListener","disableHoverListener","disableInteractive","disableTouchListener","enterDelay","enterNextDelay","enterTouchDelay","followCursor","id","leaveDelay","leaveTouchDelay","onClose","onOpen","open","placement","PopperComponent","PopperProps","title","TransitionComponent","TransitionProps"];var rS=Yo(nb,{name:"MuiTooltip",slot:"Popper",overridesResolver:function(e,t){var n=e.ownerState;return[t.popper,!n.disableInteractive&&t.popperInteractive,n.arrow&&t.popperArrow,!n.open&&t.popperClose]}})((function(e){var t,n=e.theme,o=e.ownerState,i=e.open;return r({zIndex:(n.vars||n).zIndex.tooltip,pointerEvents:"none"},!o.disableInteractive&&{pointerEvents:"auto"},!i&&{pointerEvents:"none"},o.arrow&&(Ee(t={},'&[data-popper-placement*="bottom"] .'.concat(tS.arrow),{top:0,marginTop:"-0.71em","&::before":{transformOrigin:"0 100%"}}),Ee(t,'&[data-popper-placement*="top"] .'.concat(tS.arrow),{bottom:0,marginBottom:"-0.71em","&::before":{transformOrigin:"100% 0"}}),Ee(t,'&[data-popper-placement*="right"] .'.concat(tS.arrow),r({},o.isRtl?{right:0,marginRight:"-0.71em"}:{left:0,marginLeft:"-0.71em"},{height:"1em",width:"0.71em","&::before":{transformOrigin:"100% 100%"}})),Ee(t,'&[data-popper-placement*="left"] .'.concat(tS.arrow),r({},o.isRtl?{left:0,marginLeft:"-0.71em"}:{right:0,marginRight:"-0.71em"},{height:"1em",width:"0.71em","&::before":{transformOrigin:"0 0"}})),t))})),oS=Yo("div",{name:"MuiTooltip",slot:"Tooltip",overridesResolver:function(e,t){var n=e.ownerState;return[t.tooltip,n.touch&&t.touch,n.arrow&&t.tooltipArrow,t["tooltipPlacement".concat(Eo(n.placement.split("-")[0]))]]}})((function(e){var t,n,o=e.theme,i=e.ownerState;return r({backgroundColor:o.vars?o.vars.palette.Tooltip.bg:Tt(o.palette.grey[700],.92),borderRadius:(o.vars||o).shape.borderRadius,color:(o.vars||o).palette.common.white,fontFamily:o.typography.fontFamily,padding:"4px 8px",fontSize:o.typography.pxToRem(11),maxWidth:300,margin:2,wordWrap:"break-word",fontWeight:o.typography.fontWeightMedium},i.arrow&&{position:"relative",margin:0},i.touch&&{padding:"8px 16px",fontSize:o.typography.pxToRem(14),lineHeight:"".concat((n=16/14,Math.round(1e5*n)/1e5),"em"),fontWeight:o.typography.fontWeightRegular},(Ee(t={},".".concat(tS.popper,'[data-popper-placement*="left"] &'),r({transformOrigin:"right center"},i.isRtl?r({marginLeft:"14px"},i.touch&&{marginLeft:"24px"}):r({marginRight:"14px"},i.touch&&{marginRight:"24px"}))),Ee(t,".".concat(tS.popper,'[data-popper-placement*="right"] &'),r({transformOrigin:"left center"},i.isRtl?r({marginRight:"14px"},i.touch&&{marginRight:"24px"}):r({marginLeft:"14px"},i.touch&&{marginLeft:"24px"}))),Ee(t,".".concat(tS.popper,'[data-popper-placement*="top"] &'),r({transformOrigin:"center bottom",marginBottom:"14px"},i.touch&&{marginBottom:"24px"})),Ee(t,".".concat(tS.popper,'[data-popper-placement*="bottom"] &'),r({transformOrigin:"center top",marginTop:"14px"},i.touch&&{marginTop:"24px"})),t))})),iS=Yo("span",{name:"MuiTooltip",slot:"Arrow",overridesResolver:function(e,t){return t.arrow}})((function(e){var t=e.theme;return{overflow:"hidden",position:"absolute",width:"1em",height:"0.71em",boxSizing:"border-box",color:t.vars?"rgba(".concat(t.vars.palette.grey.darkChannel," / 0.9)"):Tt(t.palette.grey[700],.9),"&::before":{content:'""',margin:"auto",display:"block",width:"100%",height:"100%",backgroundColor:"currentColor",transform:"rotate(45deg)"}}})),aS=!1,lS=null;function sS(e,t){return function(n){t&&t(n),e(n)}}var uS=e.forwardRef((function(t,n){var o,i,a,s,u,c,d=ln({props:t,name:"MuiTooltip"}),f=d.arrow,p=void 0!==f&&f,h=d.children,m=d.components,v=void 0===m?{}:m,g=d.componentsProps,y=void 0===g?{}:g,x=d.describeChild,b=void 0!==x&&x,w=d.disableFocusListener,S=void 0!==w&&w,j=d.disableHoverListener,k=void 0!==j&&j,C=d.disableInteractive,R=void 0!==C&&C,T=d.disableTouchListener,O=void 0!==T&&T,P=d.enterDelay,E=void 0===P?100:P,M=d.enterNextDelay,_=void 0===M?0:M,D=d.enterTouchDelay,I=void 0===D?700:D,A=d.followCursor,N=void 0!==A&&A,L=d.id,z=d.leaveDelay,F=void 0===z?0:z,W=d.leaveTouchDelay,B=void 0===W?1500:W,V=d.onClose,q=d.onOpen,H=d.open,U=d.placement,Y=void 0===U?"bottom":U,G=d.PopperComponent,Q=d.PopperProps,$=void 0===Q?{}:Q,K=d.title,X=d.TransitionComponent,Z=void 0===X?ih:X,J=d.TransitionProps,ee=Te(d,nS),te=hi(),ne="rtl"===te.direction,re=Ne(e.useState(),2),oe=re[0],ie=re[1],ae=Ne(e.useState(null),2),le=ae[0],se=ae[1],ue=e.useRef(!1),ce=R||N,de=e.useRef(),fe=e.useRef(),pe=e.useRef(),he=e.useRef(),me=Ne(Nd({controlled:H,default:!1,name:"Tooltip",state:"open"}),2),ve=me[0],ge=me[1],ye=ve,xe=zd(L),be=e.useRef(),we=e.useCallback((function(){void 0!==be.current&&(document.body.style.WebkitUserSelect=be.current,be.current=void 0),clearTimeout(he.current)}),[]);e.useEffect((function(){return function(){clearTimeout(de.current),clearTimeout(fe.current),clearTimeout(pe.current),we()}}),[we]);var Se=function(e){clearTimeout(lS),aS=!0,ge(!0),q&&!ye&&q(e)},je=Wl((function(e){clearTimeout(lS),lS=setTimeout((function(){aS=!1}),800+F),ge(!1),V&&ye&&V(e),clearTimeout(de.current),de.current=setTimeout((function(){ue.current=!1}),te.transitions.duration.shortest)})),ke=function(e){ue.current&&"touchstart"!==e.type||(oe&&oe.removeAttribute("title"),clearTimeout(fe.current),clearTimeout(pe.current),E||aS&&_?fe.current=setTimeout((function(){Se(e)}),aS?_:E):Se(e))},Ce=function(e){clearTimeout(fe.current),clearTimeout(pe.current),pe.current=setTimeout((function(){je(e)}),F)},Re=Ql(),Oe=Re.isFocusVisibleRef,Pe=Re.onBlur,Ee=Re.onFocus,Me=Re.ref,_e=Ne(e.useState(!1),2)[1],De=function(e){Pe(e),!1===Oe.current&&(_e(!1),Ce(e))},Ie=function(e){oe||ie(e.currentTarget),Ee(e),!0===Oe.current&&(_e(!0),ke(e))},Ae=function(e){ue.current=!0;var t=h.props;t.onTouchStart&&t.onTouchStart(e)},Le=ke,ze=Ce;e.useEffect((function(){if(ye)return document.addEventListener("keydown",e),function(){document.removeEventListener("keydown",e)};function e(e){"Escape"!==e.key&&"Esc"!==e.key||je(e)}}),[je,ye]);var Fe=Nl(ie,n),We=Nl(Me,Fe),Be=Nl(h.ref,We);""===K&&(ye=!1);var Ve=e.useRef({x:0,y:0}),qe=e.useRef(),He={},Ue="string"===typeof K;b?(He.title=ye||!Ue||k?null:K,He["aria-describedby"]=ye?xe:null):(He["aria-label"]=Ue?K:null,He["aria-labelledby"]=ye&&!Ue?xe:null);var Ye=r({},He,ee,h.props,{className:wn(ee.className,h.props.className),onTouchStart:Ae,ref:Be},N?{onMouseMove:function(e){var t=h.props;t.onMouseMove&&t.onMouseMove(e),Ve.current={x:e.clientX,y:e.clientY},qe.current&&qe.current.update()}}:{});var Ge={};O||(Ye.onTouchStart=function(e){Ae(e),clearTimeout(pe.current),clearTimeout(de.current),we(),be.current=document.body.style.WebkitUserSelect,document.body.style.WebkitUserSelect="none",he.current=setTimeout((function(){document.body.style.WebkitUserSelect=be.current,ke(e)}),I)},Ye.onTouchEnd=function(e){h.props.onTouchEnd&&h.props.onTouchEnd(e),we(),clearTimeout(pe.current),pe.current=setTimeout((function(){je(e)}),B)}),k||(Ye.onMouseOver=sS(Le,Ye.onMouseOver),Ye.onMouseLeave=sS(ze,Ye.onMouseLeave),ce||(Ge.onMouseOver=Le,Ge.onMouseLeave=ze)),S||(Ye.onFocus=sS(Ie,Ye.onFocus),Ye.onBlur=sS(De,Ye.onBlur),ce||(Ge.onFocus=Ie,Ge.onBlur=De));var Qe=e.useMemo((function(){var e,t=[{name:"arrow",enabled:Boolean(le),options:{element:le,padding:4}}];return null!=(e=$.popperOptions)&&e.modifiers&&(t=t.concat($.popperOptions.modifiers)),r({},$.popperOptions,{modifiers:t})}),[le,$]),$e=r({},d,{isRtl:ne,arrow:p,disableInteractive:ce,placement:Y,PopperComponentProp:G,touch:ue.current}),Ke=function(e){var t=e.classes,n=e.disableInteractive,r=e.arrow,o=e.touch,i=e.placement;return Po({popper:["popper",!n&&"popperInteractive",r&&"popperArrow"],tooltip:["tooltip",r&&"tooltipArrow",o&&"touch","tooltipPlacement".concat(Eo(i.split("-")[0]))],arrow:["arrow"]},eS,t)}($e),Xe=null!=(o=v.Popper)?o:rS,Ze=null!=(i=null!=(a=v.Transition)?a:Z)?i:ih,Je=null!=(s=v.Tooltip)?s:oS,et=null!=(u=v.Arrow)?u:iS,tt=Eu(Xe,r({},$,y.popper),$e),nt=Eu(Ze,r({},J,y.transition),$e),rt=Eu(Je,r({},y.tooltip),$e),ot=Eu(et,r({},y.arrow),$e);return(0,l.jsxs)(e.Fragment,{children:[e.cloneElement(h,Ye),(0,l.jsx)(Xe,r({as:null!=G?G:nb,placement:Y,anchorEl:N?{getBoundingClientRect:function(){return{top:Ve.current.y,left:Ve.current.x,right:Ve.current.x,bottom:Ve.current.y,width:0,height:0}}}:oe,popperRef:qe,open:!!oe&&ye,id:xe,transition:!0},Ge,tt,{className:wn(Ke.popper,null==$?void 0:$.className,null==(c=y.popper)?void 0:c.className),popperOptions:Qe,children:function(e){var t,n,o=e.TransitionProps;return(0,l.jsx)(Ze,r({timeout:te.transitions.duration.shorter},o,nt,{children:(0,l.jsxs)(Je,r({},rt,{className:wn(Ke.tooltip,null==(t=y.tooltip)?void 0:t.className),children:[K,p?(0,l.jsx)(et,r({},ot,{className:wn(Ke.arrow,null==(n=y.arrow)?void 0:n.className),ref:se})):null]}))}))}}))]})})),cS=uS,dS=Ml((0,l.jsx)("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 17h-2v-2h2v2zm2.07-7.75-.9.92C13.45 12.9 13 13.5 13 15h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25z"}),"Help"),fS=["computer","module","software","barcode scanner","cartridge stuck on the module","module not detected","other"],pS=["value"],hS=["value"],mS=["value"],vS=function(t){var n=t.request,r=t.onSuccess,o=t.onCancel,i=po(),a=lu((function(){return Ki.get("/device").then((function(e){return e.data}))})),s=oy({defaultValues:Rp({},n||{})}),u=s.control,c=s.handleSubmit,d=s.reset,f=s.resetField,p=cg({control:u,name:"issueType"}),h=cg({control:u,name:"serialNumber"});return(0,e.useEffect)((function(){a.fetch()}),[]),(0,e.useEffect)((function(){f("failedModuleSerialNumber")}),[h]),(0,l.jsxs)(Ir,{display:"flex",flexDirection:"column",bgcolor:"#121212cc",component:"form",onSubmit:c((function(e){Ki.post("/service",e).then((function(){r?r():i("/service")}))})),flexGrow:1,overflow:"auto",children:[(0,l.jsx)(Ir,{overflow:"auto",className:"scroll_enabled",padding:2,flexGrow:1,children:(0,l.jsxs)(Ci,{container:!0,spacing:2,children:[(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsx)(fg,{name:"issueType",control:u,rules:{required:"Required for routing"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",required:!0,fullWidth:!0,children:[(0,l.jsx)(Wp,{children:"Type of Maintenance"}),(0,l.jsx)(Bd,Rp(Rp({},n),{},{value:n.value||null,row:!0,children:fS.map((function(e){return(0,l.jsx)(Gd,{value:e,control:(0,l.jsx)(mf,{}),label:e})}))})),(0,l.jsx)(iv,{children:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(t=r.error)||void 0===t?void 0:t.message})})]})}})}),(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsx)(fg,{name:"description",control:u,rules:{required:"Additional details are required"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Description",variant:"outlined",size:"small",InputLabelProps:{shrink:!0},fullWidth:!0,multiline:!0,rows:2,helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(t=r.error)||void 0===t?void 0:t.message})},n))}})}),(0,l.jsx)(Py,{when:["computer","software"].includes(p),render:function(){return(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsx)(fg,{name:"computerSerialNumber",control:u,rules:{required:"Required to identify the computer"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Computer Serial Number",variant:"outlined",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(t=r.error)||void 0===t?void 0:t.message})},n))}})})}}),(0,l.jsx)(Py,{when:["barcode scanner","software"].includes(p),render:function(){return(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsx)(fg,{name:"machineSerialNumber",control:u,rules:{required:"Required to identify the GenXpert Serial Number"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"GenXpert Serial Number",variant:"outlined",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(t=r.error)||void 0===t?void 0:t.message})},n))}})})}}),(0,l.jsx)(Py,{when:["module","other","module not detected","cartridge stuck on the module"].includes(p),render:function(){return(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsx)(fg,{name:"serialNumber",control:u,rules:{required:"required to identify the instrument"},render:function(e){var t,n,r=e.field,o=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",required:!0,fullWidth:!0,children:[(0,l.jsx)(Wp,{children:"Instrument"}),(0,l.jsx)(Bd,Rp(Rp({row:!0},r),{},{value:r.value||null,children:null===(t=a.value)||void 0===t?void 0:t.instruments.map((function(e){return(0,l.jsx)(Gd,{value:e,control:(0,l.jsx)(mf,{}),label:e})}))})),(0,l.jsx)(iv,{children:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(n=o.error)||void 0===n?void 0:n.message})})]})}})})}}),(0,l.jsx)(Py,{when:["module","cartridge stuck on the module"].includes(p),render:function(){return(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsx)(fg,{name:"failedModuleSerialNumber",control:u,rules:{required:"required to identify failed modules"},render:function(e){var t,n,r=e.field,o=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",required:!0,fullWidth:!0,children:[(0,l.jsx)(Wp,{children:"cartridge stuck on the module"===p?"Indicate the module where the cartridge is stuck":"Failed Modules"}),(0,l.jsx)(Bd,Rp(Rp({row:!0},r),{},{value:r.value||null,children:null===(t=a.value)||void 0===t?void 0:t.modules.filter((function(e){return e.instrument===h})).map((function(e){return(0,l.jsx)(Gd,{value:e.serial,control:(0,l.jsx)(mf,{}),label:e.serial})}))})),(0,l.jsx)(iv,{children:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(n=o.error)||void 0===n?void 0:n.message})})]})}})})}}),(0,l.jsx)(Py,{when:["computer","software","other","barcode scanner","cartridge stuck on the module","module not detected"].includes(p),render:function(){return(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsx)(fg,{name:"photo",control:u,rules:{required:"photo / screenshot needed for clarification"},render:function(e){var t,n=e.field,r=(n.value,jv(n,pS)),o=e.fieldState;return(0,l.jsx)(dv,Rp(Rp({},r),{},{label:"Photo / Screenshot",variant:"outlined",size:"small",type:"file",InputLabelProps:{shrink:!0},fullWidth:!0,inputProps:{multiple:!0,accept:"image/*"},onChange:function(e){return gS(e).then((function(e){return r.onChange(e)}))},helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(t=o.error)||void 0===t?void 0:t.message})}))}})})}}),(0,l.jsx)(Py,{when:["module","module not detected"].includes(p),render:function(){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsx)(fg,{name:"installationQualificationReport",control:u,rules:{required:"Installation Qualification Report required to investigate the issue"},render:function(e){var t,n=e.field,r=(n.value,jv(n,hS)),o=e.fieldState;return(0,l.jsx)(dv,Rp(Rp({},r),{},{label:"Installation Qualification Report",variant:"outlined",size:"small",type:"file",InputLabelProps:{shrink:!0},fullWidth:!0,onChange:function(e){return gS(e).then(yS).then((function(e){return r.onChange(e)}))},helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(t=o.error)||void 0===t?void 0:t.message}),InputProps:{endAdornment:(0,l.jsx)(yv,{position:"end",children:(0,l.jsx)(cS,{title:"In the GeneXpert Dx System window, on the Reports menu, click Installation Qualification. The Adobe\xae Reader window appears and displays the System Installation Qualification Report. Save the pdf file in to the location you specify.",children:(0,l.jsx)(Ec,{edge:"end",children:(0,l.jsx)(dS,{})})})})}}))}})}),(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsx)(fg,{name:"systemLogReport",control:u,rules:{required:"System Log Report required to investigate the issue"},render:function(e){var t,n=e.field,r=(n.value,jv(n,mS)),o=e.fieldState;return(0,l.jsx)(dv,Rp(Rp({},r),{},{label:"System Log Report",variant:"outlined",size:"small",type:"file",InputLabelProps:{shrink:!0},fullWidth:!0,onChange:function(e){return gS(e).then(yS).then((function(e){return r.onChange(e)}))},helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:null===(t=o.error)||void 0===t?void 0:t.message}),InputProps:{endAdornment:(0,l.jsx)(yv,{position:"end",children:(0,l.jsx)(cS,{title:"In the GeneXpert Dx System, go to Reports > System Log, the System Log Report window appears. Select the log criteria as follows; Date Range: All, Modules: Currently Connected Modules\u2014 select the failed module, Select Errors Only. When you finish selecting the log criteria, click Generate Report File\u2014Creates a PDF file and saves it to the location you specify.",children:(0,l.jsx)(Ec,{edge:"end",children:(0,l.jsx)(dS,{})})})})}}))}})})]})}})]})}),(0,l.jsxs)(Ir,{display:"flex",flexDirection:"row",component:Di,padding:2,justifyContent:"space-between",bgcolor:"#121212cc",flexGrow:0,children:[(0,l.jsx)(Ef,{endIcon:(0,l.jsx)(bv,{}),onClick:function(){d(),o?o():i("/requests")},type:"button",children:"Cancel"}),(0,l.jsx)(Ef,{variant:"contained",endIcon:(0,l.jsx)(wv,{}),type:"submit",children:"Save"})]})]})};function gS(e){var t=Array.from(e.target.files||[]);return Promise.all(t.map((function(e){return new Promise((function(t,n){var r=new FileReader;r.readAsDataURL(e),r.onload=function(){return t(r.result)},r.onerror=function(){return n(r.error)}}))})))}function yS(e){return Ne(e,1)[0]}var xS=function(){return(0,l.jsxs)(Ri,{children:[(0,l.jsx)(au,{active:"maintenance"}),(0,l.jsx)(yo,{})]})},bS=function(){var t=Ne((0,e.useState)([]),2),n=t[0],r=t[1];(0,e.useEffect)((function(){Ki.get("/service/").then((function(e){return e.data})).then((function(e){return r(e)}))}),[]);var o=po();return(0,l.jsxs)(Ir,{display:"flex",flexDirection:"column",bgcolor:"#121212cc",flexGrow:1,overflow:"auto",children:[(0,l.jsx)(nd,{sx:{margin:0,top:"auto",right:20,bottom:20,left:"auto",position:"fixed"},component:To,to:"/service/create",size:"large",children:(0,l.jsx)(lp,{})}),0===n.length?(0,l.jsx)(Ir,{display:"flex",flexGrow:1,alignItems:"center",justifyContent:"center",children:(0,l.jsx)(Wi,{variant:"h5",children:"No Service Requests Available"})}):(0,l.jsx)(fp,{children:n.map((function(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(Gf,{onClick:function(){return t=e.id,void o("/service/".concat(t,"/show"));var t},children:(0,l.jsx)(Jf,{children:(0,l.jsxs)(Ir,{display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center",children:[(0,l.jsx)(Ci,{container:!0,spacing:1,children:[e.maintenanceNumber&&"#".concat(e.maintenanceNumber),e.issueType,e.status].filter((function(e){return e})).map((function(e,t){return(0,l.jsx)(Ci,{item:!0,children:(0,l.jsx)(wp,{size:"small",label:e})},t)}))}),(0,l.jsx)(wp,{size:"small",label:jp()(e.createdAt).fromNow()})]})})}),(0,l.jsx)(ap,{variant:"fullWidth",component:"li"})]})}))})]})};var wS=function(){var t,n,r,o=mo().id,i=Ne((0,e.useState)(!1),2),a=i[0],s=i[1],u=Ne((0,e.useState)(!0),2),c=u[0],d=u[1],f=Ne((0,e.useState)({}),2),p=f[0],h=f[1];return(0,e.useEffect)((function(){Ki.get("/service/".concat(o)).then((function(e){h(e.data),d(!1)}))}),[o,a]),c?(0,l.jsx)(Ri,{children:(0,l.jsx)(Ir,{flexGrow:1,display:"flex",alignItems:"center",justifyContent:"center",children:(0,l.jsx)(pi,{})})}):(0,l.jsx)(Ir,{display:"flex",flexDirection:"column",flexGrow:1,style:{overflowY:"auto"},className:"scroll_enabled",children:(0,l.jsxs)(Ir,{display:"flex",flexDirection:"column",component:Di,padding:2,bgcolor:"#121212cc",flexGrow:1,children:[(0,l.jsxs)(Ir,{display:"flex",alignItems:"center",justifyContent:"space-between",children:[(0,l.jsxs)(Ir,{display:"flex",alignItems:"center",children:[(0,l.jsx)(To,{to:"/service/",children:(0,l.jsx)(Ec,{children:(0,l.jsx)(xv,{})})}),(0,l.jsx)(Ir,{marginRight:1}),(0,l.jsx)(Wi,{children:p.maintenanceNumber})]}),(0,l.jsx)(Ec,{onClick:function(){return s(!0)},children:(0,l.jsx)(Pb,{})})]}),(0,l.jsx)(Ir,{marginBottom:1}),(0,l.jsx)(Di,{component:Ir,padding:1,marginBottom:2,children:(0,l.jsxs)(Ci,{container:!0,spacing:2,children:[(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Status"}),(0,l.jsx)(Wi,{variant:"body1",children:p.status.toUpperCase()})]}),(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Type"}),(0,l.jsx)(Wi,{variant:"body1",children:p.issueType})]}),(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Created At"}),(0,l.jsx)(Wi,{variant:"body1",children:jp()(p.createdAt).fromNow()})]}),(0,l.jsx)(Py,{when:!Ja(p.serialNumber),render:function(){return(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Instrument"}),(0,l.jsx)(Wi,{variant:"body1",children:p.serialNumber})]})}}),(0,l.jsx)(Py,{when:!Ja(p.failedModuleSerialNumber),render:function(){return(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Failed Module"}),(0,l.jsx)(Wi,{variant:"body1",children:p.failedModuleSerialNumber})]})}}),(0,l.jsx)(Py,{when:!Ja(p.computerSerialNumber),render:function(){return(0,l.jsxs)(Ci,{item:!0,xs:4,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Computer"}),(0,l.jsx)(Wi,{variant:"body1",children:p.computerSerialNumber})]})}})]})}),(0,l.jsx)(Py,{when:((null===(t=p.photo)||void 0===t?void 0:t.length)||0)>0,render:function(){var e;return(0,l.jsxs)(Di,{component:Ir,padding:1,marginBottom:2,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Photo"}),(0,l.jsx)(Ir,{marginBottom:2}),(0,l.jsx)(Ci,{container:!0,spacing:1,children:null===(e=p.photo)||void 0===e?void 0:e.map((function(e){return(0,l.jsx)(Ci,{item:!0,xs:4,children:(0,l.jsx)("img",{src:e,style:{display:"block",width:"100%"},alt:"Screenshot"})})}))})]})}}),(0,l.jsx)(Py,{when:((null===(n=p.description)||void 0===n?void 0:n.length)||0)>0,render:function(){return(0,l.jsxs)(Di,{component:Ir,padding:1,marginBottom:2,children:[(0,l.jsx)(Wi,{variant:"caption",children:"Description"}),(0,l.jsx)(Ir,{marginBottom:2}),(0,l.jsx)(Wi,{variant:"body1",children:p.description})]})}}),(0,l.jsx)(Py,{when:((null===(r=p.machineSerialNumber)||void 0===r?void 0:r.length)||0)>0,render:function(){return(0,l.jsxs)(Di,{component:Ir,padding:1,marginBottom:2,children:[(0,l.jsx)(Wi,{variant:"caption",children:"GenXpert Serial Number"}),(0,l.jsx)(Ir,{marginBottom:2}),(0,l.jsx)(Wi,{variant:"body1",children:p.machineSerialNumber})]})}})]})})};function SS(e){return Qo("MuiCardContent",e)}$o("MuiCardContent",["root"]);var jS=["className","component"],kS=Yo("div",{name:"MuiCardContent",slot:"Root",overridesResolver:function(e,t){return t.root}})((function(){return{padding:16,"&:last-child":{paddingBottom:24}}})),CS=e.forwardRef((function(e,t){var n=ln({props:e,name:"MuiCardContent"}),o=n.className,i=n.component,a=void 0===i?"div":i,s=Te(n,jS),u=r({},n,{component:a}),c=function(e){return Po({root:["root"]},SS,e.classes)}(u);return(0,l.jsx)(kS,r({as:a,className:wn(c.root,o),ownerState:u,ref:t},s))})),RS=CS,TS=function(){var t=po(),n=fo(),r=Ne((0,e.useState)(!1),2),o=r[0],i=r[1],a=Ne((0,e.useState)("daily"),2),s=a[0],u=a[1],c=Ne((0,e.useState)("TB"),2),d=c[0],f=c[1],p=Ne((0,e.useState)("Xpert HIV-1 VIRAL LOAD"),2),h=p[0],m=p[1],v=Ne((0,e.useState)("TB"),2),g=v[0],y=v[1],x=function(e){u(e),f("TB"),m("Xpert HIV-1 VIRAL LOAD"),y("TB"),i(!0)},b=!n.pathname.match(/\/summary-report\/[^/]+\/(new|monthly\/new)$/);return(0,l.jsxs)(Ri,{children:[(0,l.jsx)(au,{active:"summary-report"}),(0,l.jsxs)(Ir,{bgcolor:"#121212cc",sx:{p:2,flexGrow:1,overflowY:"auto"},children:[b&&(0,l.jsxs)(Ir,{display:"flex",gap:2,mb:2,children:[(0,l.jsx)(mc,{sx:{bgcolor:"#1c2526",color:"white",flex:1},children:(0,l.jsxs)(RS,{children:[(0,l.jsx)(Wi,{variant:"h6",children:"Daily Summary Report"}),(0,l.jsx)(Wi,{variant:"body1",sx:{mb:2},children:"Create a new daily report for TB, Viral Load, or EID."}),(0,l.jsx)(Ef,{variant:"contained",color:"primary",onClick:function(){return x("daily")},children:"Create Daily Report"})]})}),(0,l.jsx)(mc,{sx:{bgcolor:"#1c2526",color:"white",flex:1},children:(0,l.jsxs)(RS,{children:[(0,l.jsx)(Wi,{variant:"h6",children:"Monthly Summary Report"}),(0,l.jsx)(Wi,{variant:"body2",sx:{mb:2},children:"Create a new monthly report for TB or HIV."}),(0,l.jsx)(Ef,{variant:"contained",color:"primary",onClick:function(){return x("monthly")},children:"Create Monthly Report"})]})})]}),(0,l.jsx)(yo,{}),(0,l.jsxs)(md,{open:o,onClose:function(){return i(!1)},fullWidth:!0,maxWidth:"xs",children:[(0,l.jsx)(wd,{children:"Select Report Category"}),(0,l.jsxs)(Rd,{sx:{pt:1},children:["daily"===s&&(0,l.jsxs)(Dp,{fullWidth:!0,size:"small",sx:{mb:2},children:[(0,l.jsx)(Up,{sx:{backgroundColor:"rgb(45,45,45)",px:"4px"},shrink:!0,children:"Category"}),(0,l.jsxs)(Hm,{value:d,onChange:function(e){var t=e.target.value;f(t),"TB"===t&&y("TB")},label:"Category",children:[(0,l.jsx)(Zm,{value:"TB",children:"TB"}),(0,l.jsx)(Zm,{value:"HIV",children:"HIV (Xpert)"})]})]}),"daily"===s&&"HIV"===d&&(0,l.jsxs)(Dp,{fullWidth:!0,size:"small",children:[(0,l.jsx)(Up,{shrink:!0,children:"HIV Test Type"}),(0,l.jsxs)(Hm,{value:h,onChange:function(e){return m(e.target.value)},label:"HIV Test Type",children:[(0,l.jsx)(Zm,{value:"Xpert HIV-1 VIRAL LOAD",children:"Xpert HIV-1 VIRAL LOAD"}),(0,l.jsx)(Zm,{value:"Xpert HIV-1 Qual",children:"Xpert HIV-1 Qual (EID)"})]})]}),"monthly"===s&&(0,l.jsxs)(Dp,{fullWidth:!0,size:"small",children:[(0,l.jsx)(Up,{shrink:!0,children:"Report Type"}),(0,l.jsxs)(Hm,{value:g,onChange:function(e){return y(e.target.value)},label:"Report Type",children:[(0,l.jsx)(Zm,{value:"TB",children:"TB"}),(0,l.jsx)(Zm,{value:"HIV",children:"HIV"})]})]})]}),(0,l.jsxs)(bf,{children:[(0,l.jsx)(Ef,{onClick:function(){return i(!1)},children:"Cancel"}),(0,l.jsx)(Ef,{onClick:function(){t("daily"===s?"/summary-report/".concat("TB"===d?"tb":"Xpert HIV-1 VIRAL LOAD"===h?"vl":"eid","/new"):"/summary-report/".concat("TB"===g?"tb":"hiv","/monthly/new")),i(!1)},variant:"contained",disabled:"daily"===s&&"HIV"===d&&!h,children:"Confirm"})]})]})]})]})},OS=function(e){var t=e.open,n=e.onClose,r=e.successMessage,o=e.onOkNavigate;return(0,l.jsxs)(md,{open:t,onClose:n,children:[(0,l.jsx)(wd,{children:"Success"}),(0,l.jsx)(Rd,{children:(0,l.jsx)(Wi,{children:r})}),(0,l.jsx)(bf,{children:(0,l.jsx)(Ef,{onClick:function(){n(),o&&o()},color:"primary",children:"OK"})})]})},PS={fontSize:"0.9rem",color:"white"},ES=function(e){var t,n,r,o,i,a,s=e.report,u=e.onChange,c=e.category,d=function(e,t){if(""!==t){var n=Number(t);!isNaN(n)&&n>=0&&u(e,n)}else u(e,void 0)},f=function(e){return void 0===e||null===e},p="TB"===c;return(0,l.jsxs)(Ci,{container:!0,spacing:2,children:[(0,l.jsx)(Ci,{item:!0,xs:12,sm:6,md:3,children:(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,required:!0,children:[(0,l.jsx)(Up,{sx:{fontSize:"0.9rem",color:"white"},shrink:!0,children:"Samples Received"}),(0,l.jsx)(dv,{type:"number",value:null!==(t=s.numberOfSamplesReceived)&&void 0!==t?t:"",onChange:function(e){return d("numberOfSamplesReceived",e.target.value)},fullWidth:!0,size:"small",inputProps:{style:PS,min:0},helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:f(s.numberOfSamplesReceived)?"Required":""})})]})}),(0,l.jsx)(Ci,{item:!0,xs:12,sm:6,md:3,children:(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,required:!0,children:[(0,l.jsx)(Up,{sx:{fontSize:"0.9rem",color:"white"},shrink:!0,children:"Samples Done"}),(0,l.jsx)(dv,{type:"number",value:null!==(n=s.numberOfSamplesDone)&&void 0!==n?n:"",onChange:function(e){return d("numberOfSamplesDone",e.target.value)},fullWidth:!0,size:"small",inputProps:{style:PS,min:0},helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:f(s.numberOfSamplesDone)?"Required":""})})]})}),(0,l.jsx)(Ci,{item:!0,xs:12,sm:6,md:3,children:(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,required:!0,children:[(0,l.jsx)(Up,{sx:{fontSize:"0.9rem",color:"white"},shrink:!0,children:"Backlog Samples"}),(0,l.jsx)(dv,{type:"number",value:null!==(r=s.numberOfBacklogSamples)&&void 0!==r?r:"",onChange:function(e){return d("numberOfBacklogSamples",e.target.value)},fullWidth:!0,size:"small",inputProps:{style:PS,min:0},helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:f(s.numberOfBacklogSamples)?"Required":""})})]})}),(0,l.jsx)(Ci,{item:!0,xs:12,sm:6,md:3,children:(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,required:!0,children:[(0,l.jsx)(Up,{sx:{fontSize:"0.9rem",color:"white"},shrink:!0,children:"Rejected Samples"}),(0,l.jsx)(dv,{type:"number",value:null!==(o=s.numberOfRejectedSamples)&&void 0!==o?o:"",onChange:function(e){return d("numberOfRejectedSamples",e.target.value)},fullWidth:!0,size:"small",inputProps:{style:PS,min:0},helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:f(s.numberOfRejectedSamples)?"Required":""})})]})}),"TB"===c&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(Ci,{item:!0,xs:12,sm:6,md:3,children:(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,required:p,children:[(0,l.jsx)(Up,{sx:{fontSize:"0.9rem",color:"white"},shrink:!0,children:"Tests Referred"}),(0,l.jsx)(dv,{type:"number",value:null!==(i=s.numberOfTestsReferred)&&void 0!==i?i:"",onChange:function(e){return d("numberOfTestsReferred",e.target.value)},fullWidth:!0,size:"small",inputProps:{style:PS,min:0},helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:f(s.numberOfTestsReferred)&&p?"Required":""})})]})}),(0,l.jsx)(Ci,{item:!0,xs:12,sm:6,md:3,children:(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,required:p,children:[(0,l.jsx)(Up,{sx:{fontSize:"0.9rem",color:"white"},shrink:!0,children:"Referred Results Returned"}),(0,l.jsx)(dv,{type:"number",value:null!==(a=s.numberOfReferredTestResultsReturned)&&void 0!==a?a:"",onChange:function(e){return d("numberOfReferredTestResultsReturned",e.target.value)},fullWidth:!0,size:"small",inputProps:{style:PS,min:0},helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:f(s.numberOfReferredTestResultsReturned)&&p?"Required":""})})]})})]}),(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,required:!0,children:[(0,l.jsx)(Up,{sx:{fontSize:"0.9rem",color:"white"},shrink:!0,children:"Report Date"}),(0,l.jsx)(dv,{type:"date",value:jp()(s.reportDate).format("YYYY-MM-DD"),onChange:function(e){return u("reportDate",new Date(e.target.value))},fullWidth:!0,size:"small",inputProps:{style:PS,max:jp()().format("YYYY-MM-DD")},sx:{"& input[type='date']::-webkit-calendar-picker-indicator":{filter:"invert(1)"}}})]})})]})},MS=["Contamination","No sample with request","Insufficient Sample","Mismatch identification between request form and specimen","Others"],_S=["No Request","Poor sample condition","Inappropriate identification","No sample with request","Insufficient sample","Others"],DS=["GeneXpert","Culture","AFB"],IS=function(e){var t=e.category,n=e.details,r=e.updateDetail,o={fontSize:"0.9rem",color:"white"},i="XPERT HIV-1 QUAL"===t?"PMTCT Phone Number":"XPERT HIV-1 VIRAL LOAD"===t?"Requestor Phone Number":"Referring Phone No";return(0,l.jsxs)(Ir,{mt:4,children:[(0,l.jsx)(Wi,{variant:"h6",gutterBottom:!0,sx:{color:"white",fontSize:"1.1rem"},children:"Rejection Details"}),(0,l.jsx)(Ub,{component:Di,sx:{bgcolor:"#121212cc"},children:(0,l.jsxs)(Zb,{children:[(0,l.jsx)(aw,{children:(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{sx:{color:"white",fontSize:"0.9rem"},children:"#"}),"XPERT HIV-1 VIRAL LOAD"!==t&&(0,l.jsx)(yw,{sx:{color:"white",fontSize:"0.9rem"},children:"MRN"}),"TB"===t&&(0,l.jsx)(yw,{sx:{color:"white",fontSize:"0.9rem"},children:"Type"}),"XPERT HIV-1 QUAL"===t&&(0,l.jsx)(yw,{sx:{color:"white",fontSize:"0.9rem"},children:"HEI Code"}),"XPERT HIV-1 VIRAL LOAD"===t&&(0,l.jsx)(yw,{sx:{color:"white",fontSize:"0.9rem"},children:"ART ID"}),(0,l.jsx)(yw,{sx:{color:"white",fontSize:"0.9rem"},children:"Reason"}),"TB"===t&&(0,l.jsx)(yw,{sx:{color:"white",fontSize:"0.9rem"},children:"Referring site"}),(0,l.jsx)(yw,{sx:{color:"white",fontSize:"0.9rem"},children:i})]})}),(0,l.jsx)(Ow,{children:n.map((function(e,n){return(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{sx:{color:"white",fontSize:"0.9rem"},children:n+1}),"XPERT HIV-1 VIRAL LOAD"!==t&&(0,l.jsx)(yw,{children:(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,required:!0,children:[(0,l.jsx)(Up,{sx:{fontSize:"0.9rem",color:"white"},shrink:!0,children:"MRN"}),(0,l.jsx)(dv,{value:e.mrn||"",onChange:function(e){return r(n,"mrn",e.target.value)},size:"small",InputLabelProps:{sx:{fontSize:"0.9rem",color:"white"}},inputProps:{style:o},helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:e.mrn?"":"Required"})})]})}),"TB"===t&&(0,l.jsx)(yw,{children:(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,required:!0,children:[(0,l.jsx)(Up,{sx:{fontSize:"0.9rem",color:"white"},shrink:!0,children:"Type"}),(0,l.jsxs)(Hm,{value:e.type||"",onChange:function(e){return r(n,"type",e.target.value)},size:"small",sx:{fontSize:"0.9rem",color:"white",maxWidth:200},MenuProps:{PaperProps:{sx:{bgcolor:"#121212cc"}}},children:[(0,l.jsx)(Zm,{value:"",sx:{fontSize:"0.9rem",color:"white",paddingLeft:2},children:"Select Type"}),DS.map((function(e){return(0,l.jsx)(Zm,{value:e,sx:{fontSize:"0.9rem",color:"white",paddingLeft:2},children:e},e)}))]}),(0,l.jsx)(iv,{children:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:e.type?"":"Required"})})]})}),"XPERT HIV-1 QUAL"===t&&(0,l.jsx)(yw,{children:(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,required:!0,children:[(0,l.jsx)(Up,{sx:{fontSize:"0.9rem",color:"white"},shrink:!0,children:"HEI Code"}),(0,l.jsx)(dv,{value:e.heiCode||"",onChange:function(e){return r(n,"heiCode",e.target.value)},size:"small",InputLabelProps:{sx:{fontSize:"0.9rem",color:"white"}},inputProps:{style:o},helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:e.heiCode?"":"Required"})})]})}),"XPERT HIV-1 VIRAL LOAD"===t&&(0,l.jsx)(yw,{children:(0,l.jsxs)(Dp,{size:"small",required:!0,children:[(0,l.jsx)(Up,{sx:{fontSize:"0.9rem",color:"white"},shrink:!0,children:"ART ID"}),(0,l.jsx)(dv,{value:e.artId||"",onChange:function(e){return r(n,"artId",e.target.value)},size:"small",InputLabelProps:{sx:{fontSize:"0.9rem",color:"white"}},inputProps:{style:o},helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:e.artId?"":"Required"})})]})}),(0,l.jsx)(yw,{children:(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,required:!0,children:[(0,l.jsx)(Up,{sx:{fontSize:"0.9rem",color:"white",textOverflow:"ellipsis"},shrink:!0,children:"Reason"}),(0,l.jsxs)(Hm,{value:e.reason||"",onChange:function(e){return r(n,"reason",e.target.value)},size:"small",sx:{fontSize:"0.9rem",color:"white",maxWidth:300},MenuProps:{PaperProps:{sx:{bgcolor:"#121212cc"}}},children:[(0,l.jsx)(Zm,{value:"",sx:{fontSize:"0.9rem",color:"white",paddingLeft:2},children:"Select Reason"}),("TB"===t?MS:_S).map((function(e){return(0,l.jsx)(Zm,{value:e,sx:{fontSize:"0.9rem",color:"white",paddingLeft:2},children:e},e)}))]}),(0,l.jsx)(iv,{children:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:e.reason?"":"Required"})})]})}),"TB"===t&&(0,l.jsx)(yw,{children:(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,children:[(0,l.jsx)(Up,{sx:{fontSize:"0.9rem",color:"white"},shrink:!0,children:"Referring Site"}),(0,l.jsx)(dv,{value:e.referringSite||"",onChange:function(e){return r(n,"referringSite",e.target.value)},size:"small",InputLabelProps:{sx:{fontSize:"0.9rem",color:"white"}},inputProps:{style:o},placeholder:"Optional"})]})}),(0,l.jsx)(yw,{children:(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,children:[(0,l.jsx)(Up,{sx:{fontSize:"0.9rem",color:"white"},shrink:!0,children:i}),(0,l.jsx)(dv,{value:e.phoneNumber||"",onChange:function(e){return r(n,"phoneNumber",e.target.value)},size:"small",InputLabelProps:{sx:{fontSize:"0.9rem",color:"white"}},inputProps:{style:o},placeholder:"Optional"})]})})]},n)}))})]})})]})},AS={"& input":{color:"white",fontSize:"0.75rem",textAlign:"center",p:.4},"& .MuiOutlinedInput-root":{height:26,"& fieldset":{borderColor:"#444"},"&:hover fieldset":{borderColor:"#777"}}},NS=function(e){var t,n,r=e.referrals,o=e.updateReferral,i=Object.keys(null!==(t=r.specimenType)&&void 0!==t?t:{}),a=Object.keys(null!==(n=r.testType)&&void 0!==n?n:{}),s=function(e,t){return t.map((function(t){var n,i,a=null!==(n=null===(i=r[e])||void 0===i?void 0:i[t])&&void 0!==n?n:{},s=a.total,u=a.returned;return(0,l.jsxs)(fw,{sx:{"&:last-child td":{border:0},height:30},children:[(0,l.jsx)(yw,{sx:{color:"white",textTransform:"capitalize",fontSize:"0.75rem",py:.5,borderColor:"#333"},children:t.replace(/([A-Z])/g," $1").trim()}),(0,l.jsx)(yw,{sx:{py:.3,borderColor:"#333"},children:(0,l.jsx)(dv,{type:"number",inputProps:{min:0},size:"small",value:null!==s&&void 0!==s?s:"",onChange:function(n){return o(e,t,"total",Number(n.target.value))},fullWidth:!0,sx:AS})}),(0,l.jsx)(yw,{sx:{py:.3,borderColor:"#333"},children:(0,l.jsx)(dv,{type:"number",inputProps:{min:0},size:"small",value:null!==u&&void 0!==u?u:"",onChange:function(n){return o(e,t,"returned",Number(n.target.value))},fullWidth:!0,sx:AS})})]},"".concat(e,"-").concat(t))}))};return(0,l.jsx)(Ir,{mt:2,children:(0,l.jsx)(Di,{sx:{bgcolor:"#121212cc",mx:"auto"},children:(0,l.jsxs)(Zb,{size:"small",sx:{color:"white",borderCollapse:"collapse"},children:[(0,l.jsx)(aw,{children:(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{sx:{color:"#ccc",fontWeight:600},children:"Type"}),(0,l.jsx)(yw,{sx:{color:"#ccc",fontWeight:600},children:"Total"}),(0,l.jsx)(yw,{sx:{color:"#ccc",fontWeight:600,fontSize:"0.8rem"},children:"Returned"})]})}),(0,l.jsxs)(Ow,{children:[(0,l.jsx)(fw,{children:(0,l.jsx)(yw,{colSpan:3,sx:{color:"#888",fontWeight:600,pt:1,pb:.3,fontSize:"0.75rem"},children:"Test Type"})}),s("testType",a),(0,l.jsx)(fw,{children:(0,l.jsx)(yw,{colSpan:3,sx:{color:"#888",fontWeight:600,pt:1,pb:.3,fontSize:"0.75rem"},children:"Specimen Type"})}),s("specimenType",i)]})]})})})},LS=function(){var t,n=mo().category,r=function(){if(n){var e=n.toLowerCase();return"tb"===e?"TB":"vl"===e?"XPERT HIV-1 VIRAL LOAD":"eid"===e?"XPERT HIV-1 QUAL":void 0}}(),o=po(),i=Ne((0,e.useState)({title:"",message:""}),2),a=i[0],s=i[1],u=!!a.title||!!a.message,c=Ne((0,e.useState)(!1),2),d=c[0],f=c[1],p=Ne((0,e.useState)({category:r,reportDate:new Date,isDraft:!0,numberOfRejectedSamples:0,numberOfTestsReferred:0,numberOfReferredTestResultsReturned:0}),2),h=p[0],m=p[1],v=Ne((0,e.useState)([]),2),g=v[0],y=v[1],x=Ne((0,e.useState)({specimenType:{sputum:{total:0,returned:0},stool:{total:0,returned:0},bodyFluid:{total:0,returned:0},tissue:{total:0,returned:0},isolate:{total:0,returned:0},other:{total:0,returned:0}},testType:{geneXpert:{total:0,returned:0},flDST:{total:0,returned:0},slDST:{total:0,returned:0},genomeSequencing:{total:0,returned:0},tbCulture:{total:0,returned:0}}}),2),b=x[0],w=x[1],S=Ne((0,e.useState)(null),2),j=S[0],k=S[1],C=Ne((0,e.useState)(null),2),R=C[0],T=C[1],O=Ne((0,e.useState)(!0),2),P=O[0],E=O[1];(0,e.useEffect)((function(){var e=function(){var e=Hc(Vc().mark((function e(){var t,n,o,i;return Vc().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,Ki.get("/daily-summaries/drafts?category=".concat(r));case 3:(t=e.sent).data&&Array.isArray(t.data)&&t.data.length>0?(n=t.data.sort((function(e,t){return new Date(t.createdAt).getTime()-new Date(e.createdAt).getTime()}))[0],m(Rp(Rp({},n),{},{reportDate:new Date(n.reportDate)})),o=n.sampleRejections||Array(n.numberOfRejectedSamples||0).fill({mrn:"XPERT HIV-1 VIRAL LOAD"!==r?"":void 0,type:"TB"===r?"":void 0,reason:"",phoneNumber:"",heiCode:"XPERT HIV-1 QUAL"===r?"":void 0,artId:"XPERT HIV-1 VIRAL LOAD"===r?"":void 0}),y(o),i=n.referrals||{specimenType:{sputum:{total:0,returned:0},stool:{total:0,returned:0},bodyFluid:{total:0,returned:0},tissue:{total:0,returned:0},isolate:{total:0,returned:0},other:{total:0,returned:0}},testType:{geneXpert:{total:0,returned:0},flDST:{total:0,returned:0},slDST:{total:0,returned:0},genomeSequencing:{total:0,returned:0},tbCulture:{total:0,returned:0}}},w(i),n&&s({title:"Draft Found",message:"You have a draft. Previous data has been loaded."})):console.log("No draft found for category, using default state"),e.next=11;break;case 7:e.prev=7,e.t0=e.catch(0),console.error("Error fetching draft:",e.t0),k("Failed to load draft");case 11:return e.prev=11,E(!1),e.finish(11);case 14:case"end":return e.stop()}}),e,null,[[0,7,11,14]])})));return function(){return e.apply(this,arguments)}}();e()}),[r]),(0,e.useEffect)((function(){console.log("Validation check:",{report:h,rejectionDetails:g,referralDetails:b,isFull:_()})}),[h,g,b]);var M=function(e,t){m((function(n){return Rp(Rp({},n),{},Ee({},e,t))}))},_=function(){if(void 0===h.numberOfSamplesReceived||void 0===h.numberOfSamplesDone||void 0===h.numberOfBacklogSamples||!h.reportDate||void 0===h.numberOfRejectedSamples||void 0===h.numberOfTestsReferred||void 0===h.numberOfReferredTestResultsReturned)return!1;if(console.log("Checking rejections and referrals completeness",g,b,h),h.numberOfRejectedSamples>0)return g.length===h.numberOfRejectedSamples&&g.every((function(e){return"TB"===r?e.mrn&&e.type&&e.reason:"XPERT HIV-1 QUAL"===r?e.mrn&&e.heiCode&&e.reason:"XPERT HIV-1 VIRAL LOAD"===r&&(e.artId&&e.reason)}));if(h.numberOfTestsReferred>0){if(!b)return!1;var e=Object.values(b.specimenType||{}).reduce((function(e,t){return e+(t.total||0)}),0)+Object.values(b.testType||{}).reduce((function(e,t){return e+(t.total||0)}),0);return console.log("Referral count check:",{totalReferred:e,expected:h.numberOfTestsReferred,referralDetails:b}),e!==h.numberOfTestsReferred?!1:b&&b.specimenType&&b.testType}return!0},D=function(){var e=Hc(Vc().mark((function e(){var t,n,r,o,i,a;return Vc().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,h){e.next=4;break}return k("Report data is not initialized"),e.abrupt("return");case 4:if(t={report:h,rejectionDetails:g,referralDetails:b},!h.id){e.next=11;break}return e.next=8,Ki.put("/daily-summaries/".concat(h.id),t);case 8:n=e.sent,e.next=15;break;case 11:return e.next=13,Ki.post("/daily-summaries",t);case 13:n=e.sent,m((function(e){return Rp(Rp({},e),{},{id:n.data.id})}));case 15:T("Draft saved successfully"),k(null),e.next=27;break;case 19:e.prev=19,e.t0=e.catch(0),console.log(e.t0),i=null===(r=e.t0.response)||void 0===r||null===(o=r.data)||void 0===o?void 0:o.error,a=i||e.t0.message||"Unknown error",console.log(a),a.includes("Report exists for the chosen date and category")?k("A report for this date and category already exists. Please choose a different date."):k("Failed to save draft"),T(null);case 27:case"end":return e.stop()}}),e,null,[[0,19]])})));return function(){return e.apply(this,arguments)}}(),I=function(){var e=Hc(Vc().mark((function e(){var t,n,r,o,i;return Vc().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(_()){e.next=3;break}return k("Please fill all required fields"),e.abrupt("return");case 3:if(e.prev=3,t={report:h,rejectionDetails:g,referralDetails:b},console.log("Submitting report with payload:",t),h.id){e.next=11;break}return e.next=9,Ki.post("/daily-summaries/null/complete",t);case 9:e.next=13;break;case 11:return e.next=13,Ki.post("/daily-summaries/".concat(h.id,"/complete"),t);case 13:T("Report submitted successfully"),k(null),f(!0),e.next=26;break;case 18:e.prev=18,e.t0=e.catch(3),console.log(e.t0),o=null===(n=e.t0.response)||void 0===n||null===(r=n.data)||void 0===r?void 0:r.error,i=o||e.t0.message||"Unknown error",console.log(i),i.includes("Report exists for the chosen date and category")?k("A report for this date and category already exists. Please choose a different date."):k("Failed to submit report"),T(null);case 26:case"end":return e.stop()}}),e,null,[[3,18]])})));return function(){return e.apply(this,arguments)}}();return P?(0,l.jsx)(Ir,{display:"flex",flexDirection:"column",bgcolor:"#121212cc",flexGrow:1,overflow:"auto",padding:2,children:(0,l.jsx)(Wi,{sx:{color:"white"},children:"Loading draft..."})}):h?(0,l.jsxs)(Ir,{display:"flex",flexDirection:"column",bgcolor:"#121212cc",overflow:"auto",children:[(0,l.jsxs)(md,{open:u,onClose:function(){return s({title:"",message:""})},children:[(0,l.jsx)(wd,{children:a.title||"Notice"}),(0,l.jsx)(Rd,{children:(0,l.jsx)(Wi,{children:a.message})}),(0,l.jsx)(bf,{children:(0,l.jsx)(Ef,{onClick:function(){return s({title:"",message:""})},color:"primary",children:"OK"})})]}),(0,l.jsx)(OS,{open:d,onClose:function(){return f(!1)},successMessage:R,onOkNavigate:function(){return o("/summary-report")}}),(0,l.jsxs)(Ir,{overflow:"auto",className:"scroll_enabled",padding:2,flexGrow:1,children:[(0,l.jsxs)(Wi,{gutterBottom:!0,sx:{color:"white"},children:["Create Daily Summary Report - ",r]}),(0,l.jsx)(ES,{report:h,category:r,onChange:function(e,t){"numberOfRejectedSamples"===e?function(e){M("numberOfRejectedSamples",e);for(var t=Rr(g).slice(0,e);t.length<e;)t.push({mrn:"XPERT HIV-1 VIRAL LOAD"!==r?"":void 0,type:"TB"===r?"":void 0,reason:"",phoneNumber:"",heiCode:"XPERT HIV-1 QUAL"===r?"":void 0,artId:"XPERT HIV-1 VIRAL LOAD"===r?"":void 0});y(t)}(t):"numberOfTestsReferred"===e?function(e){M("numberOfTestsReferred",e),w((function(e){return e?Rp(Rp({},e),{},{specimenType:{sputum:{total:0,returned:0},stool:{total:0,returned:0},bodyFluid:{total:0,returned:0},tissue:{total:0,returned:0},isolate:{total:0,returned:0},other:{total:0,returned:0}},testType:{tbCulture:{total:0,returned:0},flDST:{total:0,returned:0},slDST:{total:0,returned:0},genomeSequencing:{total:0,returned:0},geneXpert:{total:0,returned:0}}}):e}))}(t):M(e,t)}}),(0,l.jsx)(IS,{category:r,details:g,updateDetail:function(e,t,n){var r=Rr(g);r[e]=Rp(Rp({},r[e]),{},Ee({},t,n)),y(r)}}),(0,l.jsx)(Wi,{variant:"subtitle1",sx:{color:"white",mb:1,fontWeight:600},children:"Referral Details"}),(null!==(t=h.numberOfTestsReferred)&&void 0!==t?t:0)>0&&(0,l.jsx)(NS,{referrals:b,updateReferral:function(e,t,n,r){w((function(o){var i;if(!o){var a,l="specimenType"===e?{sputum:{total:0,returned:0},stool:{total:0,returned:0},bodyFluid:{total:0,returned:0},tissue:{total:0,returned:0},isolate:{total:0,returned:0},other:{total:0,returned:0}}:{tbCulture:{total:0,returned:0},flDST:{total:0,returned:0},slDST:{total:0,returned:0},genomeSequencing:{total:0,returned:0},geneXpert:{total:0,returned:0}},s=Rp(Rp({},null!==(a=l[t])&&void 0!==a?a:{total:0,returned:0}),{},Ee({},n,r));return{specimenType:"specimenType"===e?Rp(Rp({},l),{},Ee({},t,s)):l,testType:"testType"===e?Rp(Rp({},l),{},Ee({},t,s)):l}}var u=o[e];return Rp(Rp({},o),{},Ee({},e,Rp(Rp({},u),{},Ee({},t,Rp(Rp({},null!==(i=null===u||void 0===u?void 0:u[t])&&void 0!==i?i:{total:0,returned:0}),{},Ee({},n,r))))))}))}}),j&&(0,l.jsx)(Wi,{color:"error",sx:{mt:2,fontSize:"0.9rem"},children:j}),R&&(0,l.jsx)(Wi,{color:"success.main",sx:{mt:2,fontSize:"0.9rem"},children:R})]}),(0,l.jsxs)(Ir,{display:"flex",flexDirection:"row",component:Di,padding:2,justifyContent:"space-between",bgcolor:"#121212cc",flexGrow:0,children:[(0,l.jsx)(Ef,{variant:"outlined",onClick:function(){o("/summary-report")},type:"button",endIcon:(0,l.jsx)(bv,{}),sx:{backgroundColor:"white",color:"black",borderColor:"black",fontWeight:"bold",borderWidth:2,"&:hover":{backgroundColor:"#f5f5f5",borderColor:"black"}},children:"Cancel"}),(0,l.jsxs)(Ir,{display:"flex",gap:2,children:[(0,l.jsx)(Ef,{variant:"contained",color:"secondary",onClick:D,type:"button",endIcon:(0,l.jsx)(wv,{}),children:"Save Draft"}),(0,l.jsx)(Ef,{variant:"contained",color:"primary",onClick:I,endIcon:(0,l.jsx)(wv,{}),type:"button",children:"Submit Report"})]})]})]}):(0,l.jsx)(Ir,{display:"flex",flexDirection:"column",bgcolor:"#121212cc",flexGrow:1,overflow:"auto",padding:2,children:(0,l.jsx)(Wi,{sx:{color:"white"},children:"Error: Unable to load report data"})})},zS={lt5:"<5","5to14":"5-14","15to24":"15-24","25to34":"25-34","35to44":"35-44","45to54":"45-54","55to64":"55-64",gt65:"65+"},FS={tbSymptomaticInpatient:"TB symptomatic PLHIV inpatients irrespective of CD4 count",tbSymptomaticOutpatient:"TB symptomatic PLHIV outpatients irrespective of CD4 count",ahdInpatient:"Inpatient HIV positive clients with AHD or CD4 < 200",ahdOutpatient:"Outpatient HIV positive clients with CD4 < 100 or stage 3/4"},WS=function(e,t,n,r){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(fw,{children:(0,l.jsx)(yw,{colSpan:4,sx:{fontWeight:"bold",backgroundColor:"transparent"},children:t})}),Object.entries(n).map((function(t){var n,o,i,a,s=Ne(t,2),u=s[0],c=s[1],d="age"===e?zS[u]:"indication"===e?FS[u]:u.charAt(0).toUpperCase()+u.slice(1);return(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{sx:{fontWeight:500},children:d}),(0,l.jsx)(yw,{align:"center",children:(0,l.jsx)(dv,{type:"number",inputProps:{min:0},value:null!==(n=c.pos)&&void 0!==n?n:"",onChange:function(t){return r(e,u,"pos",t.target.value?parseInt(t.target.value):void 0)},size:"small",sx:{width:80}})}),(0,l.jsx)(yw,{align:"center",children:(0,l.jsx)(dv,{type:"number",inputProps:{min:0},value:null!==(o=c.neg)&&void 0!==o?o:"",onChange:function(t){return r(e,u,"neg",t.target.value?parseInt(t.target.value):void 0)},size:"small",sx:{width:80}})}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:600},children:(null!==(i=c.pos)&&void 0!==i?i:0)+(null!==(a=c.neg)&&void 0!==a?a:0)})]},"".concat(e,"-").concat(u))}))]})},BS=function(e){var t=e.lflamData,n=e.handleLflamChange;return(0,l.jsx)(Ir,{sx:{display:"flex",justifyContent:"center",mt:3},children:(0,l.jsxs)(Ub,{component:Di,sx:{maxWidth:700,boxShadow:"none",backgroundColor:"transparent"},children:[(0,l.jsx)(Wi,{variant:"h6",sx:{p:2,textAlign:"center",fontWeight:"bold"},children:"LF-LAM Summary"}),(0,l.jsxs)(Zb,{size:"small",sx:{border:"1px solid #ddd"},children:[(0,l.jsx)(aw,{children:(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{sx:{fontWeight:"bold"},children:"Category"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"Positive +"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"Negative -"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"Total"})]})}),(0,l.jsxs)(Ow,{children:[WS("indication","i. Indication",t.indication,n),WS("sex","ii. Sex",t.sex,n),WS("age","iii. Age",t.age,n)]})]})]})})},VS=function(e,t,n,r){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(fw,{children:(0,l.jsx)(yw,{colSpan:10,sx:{fontWeight:"bold"},children:t})}),Object.entries(n).map((function(t){var n,o,i,a,s,u,c,d,f,p,h,m,v,g,y,x,b=Ne(t,2),w=b[0],S=b[1],j=w.toUpperCase();"method"===e?j="solid"===w?"Solid (LJ)":"Liquid (MGIT)":"sex"===e?j=w.charAt(0).toUpperCase()+w.slice(1):"hiv"===e?j="positive"===w?"Positive":"negative"===w?"Negative":"Unknown":"reason"===e?"PresumptiveRRMDR"===w?j="Presumptive RR/MDR TB":"inhResistant"===w?j="Presumptive INH-Resistant TB":"preXDR"===w&&(j="Presumptive Pre-XDR/XDR"):"patientGroup"===e&&("new"===w?j="New":"relapse"===w?j="Relapse":"failure"===w?j="Failure":"drTB"===w?j="DR-TB":"lossToFollowUp"===w?j="Loss to follow up":"contact"===w?j="Contact/KVPs":"other"===w&&(j="Other/Unknown"));var k=(null!==(n=S.positive)&&void 0!==n?n:0)+(null!==(o=S.negative)&&void 0!==o?o:0)+(null!==(i=S.pos0)&&void 0!==i?i:0)+(null!==(a=S.neg0)&&void 0!==a?a:0)+(null!==(s=S.pos5)&&void 0!==s?s:0)+(null!==(u=S.neg5)&&void 0!==u?u:0)+(null!==(c=S.ntm)&&void 0!==c?c:0)+(null!==(d=S.cont)&&void 0!==d?d:0);return S.total!==k&&r(e,w,"total",k),(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{sx:{fontWeight:500},children:j}),(0,l.jsx)(yw,{align:"center",children:(0,l.jsx)(dv,{type:"number",inputProps:{min:0},value:null!==(f=S.positive)&&void 0!==f?f:"",onChange:function(t){return r(e,w,"positive",t.target.value?parseInt(t.target.value):void 0)},size:"small",sx:{width:80}})}),(0,l.jsx)(yw,{align:"center",children:(0,l.jsx)(dv,{type:"number",value:null!==(p=S.negative)&&void 0!==p?p:"",inputProps:{min:0},onChange:function(t){return r(e,w,"negative",t.target.value?parseInt(t.target.value):void 0)},size:"small",sx:{width:80}})}),(0,l.jsx)(yw,{align:"center",children:(0,l.jsx)(dv,{type:"number",value:null!==(h=S.pos0)&&void 0!==h?h:"",inputProps:{min:0},onChange:function(t){return r(e,w,"pos0",t.target.value?parseInt(t.target.value):void 0)},size:"small",sx:{width:80}})}),(0,l.jsx)(yw,{align:"center",children:(0,l.jsx)(dv,{type:"number",value:null!==(m=S.neg0)&&void 0!==m?m:"",inputProps:{min:0},onChange:function(t){return r(e,w,"neg0",t.target.value?parseInt(t.target.value):void 0)},size:"small",sx:{width:80}})}),(0,l.jsx)(yw,{align:"center",children:(0,l.jsx)(dv,{type:"number",value:null!==(v=S.pos5)&&void 0!==v?v:"",inputProps:{min:0},onChange:function(t){return r(e,w,"pos5",t.target.value?parseInt(t.target.value):void 0)},size:"small",sx:{width:80}})}),(0,l.jsx)(yw,{align:"center",children:(0,l.jsx)(dv,{type:"number",value:null!==(g=S.neg5)&&void 0!==g?g:"",inputProps:{min:0},onChange:function(t){return r(e,w,"neg5",t.target.value?parseInt(t.target.value):void 0)},size:"small",sx:{width:80}})}),(0,l.jsx)(yw,{align:"center",children:(0,l.jsx)(dv,{type:"number",value:null!==(y=S.ntm)&&void 0!==y?y:"",inputProps:{min:0},onChange:function(t){return r(e,w,"ntm",t.target.value?parseInt(t.target.value):void 0)},size:"small",sx:{width:80}})}),(0,l.jsx)(yw,{align:"center",children:(0,l.jsx)(dv,{type:"number",value:null!==(x=S.cont)&&void 0!==x?x:"",inputProps:{min:0},onChange:function(t){return r(e,w,"cont",t.target.value?parseInt(t.target.value):void 0)},size:"small",sx:{width:80}})}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:600},children:k})]},"".concat(e,"-").concat(w))}))]})},qS=function(e){var t=e.cultureDisagg,n=e.handleCultureDisaggChange;return(0,l.jsx)(Ir,{sx:{display:"flex",justifyContent:"center",mt:3},children:(0,l.jsxs)(Ub,{component:Di,sx:{maxWidth:1200},children:[(0,l.jsx)(Wi,{variant:"h6",sx:{p:2,textAlign:"center",fontWeight:"bold"},children:"TB culture Summary: For TB culture testing sites and TIC"}),(0,l.jsxs)(Zb,{size:"small",children:[(0,l.jsx)(aw,{children:(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{sx:{fontWeight:"bold"},children:"Category"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"Positive"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"Negative"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"Positive at 0 months"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"Negative at 0 months"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"Positive at 5 months"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"Negative at 5 months"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"NTM"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"Contaminated"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"Total"})]})}),(0,l.jsxs)(Ow,{children:[VS("method","i. Method",t.method,n),VS("sex","ii. Sex",t.sex,n),VS("hiv","iii. HIV Status",t.hiv,n),VS("reason","iv. Reason",t.reason,n),VS("patientGroup","v. Patient Registration Group",t.patientGroup,n)]})]})]})})},HS=function(e,t,n,r){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(fw,{children:(0,l.jsx)(yw,{colSpan:4,sx:{fontWeight:"bold"},children:t})}),Object.entries(n).map((function(t){var n,o,i,a,s=Ne(t,2),u=s[0],c=s[1];return(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{sx:{fontWeight:500},children:u.toUpperCase()}),(0,l.jsx)(yw,{align:"center",children:(0,l.jsx)(dv,{type:"number",inputProps:{min:0},value:null!==(n=c.susc)&&void 0!==n?n:"",onChange:function(t){return r(e,u,"susc",t.target.value?parseInt(t.target.value):void 0)},size:"small",sx:{width:80}})}),(0,l.jsx)(yw,{align:"center",children:(0,l.jsx)(dv,{type:"number",inputProps:{min:0},value:null!==(o=c.res)&&void 0!==o?o:"",onChange:function(t){return r(e,u,"res",t.target.value?parseInt(t.target.value):void 0)},size:"small",sx:{width:80}})}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:600},children:(null!==(i=c.susc)&&void 0!==i?i:0)+(null!==(a=c.res)&&void 0!==a?a:0)})]},"".concat(e,"-").concat(u))}))]})},US=function(e){var t=e.dstData,n=e.handleDstChange;return(0,l.jsx)(Ir,{sx:{display:"flex",justifyContent:"center",mt:3},children:(0,l.jsxs)(Ub,{component:Di,sx:{maxWidth:700},children:[(0,l.jsx)(Wi,{variant:"h6",sx:{p:2,textAlign:"center",fontWeight:"bold"},children:"Drug Susceptibility Testing (DST)"}),(0,l.jsxs)(Zb,{size:"small",children:[(0,l.jsx)(aw,{children:(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{sx:{fontWeight:"bold"},children:"Drug"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"Susceptible"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"Resistant"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"Total"})]})}),(0,l.jsxs)(Ow,{children:[HS("fl","FL - Phenotypic DST",t.fl,n),HS("sl","SL - Phenotypic DST",t.sl,n)]})]})]})})},YS={lt5:"<5","5to14":"5-14","15to24":"15-24","25to34":"25-34","35to44":"35-44","45to54":"45-54","55to64":"55-64",gt65:"65+"},GS=function(e,t,n,r){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(fw,{children:(0,l.jsx)(yw,{colSpan:4,sx:{fontWeight:"bold"},children:t})}),Object.entries(n).map((function(t){var n,o,i,a,s=Ne(t,2),u=s[0],c=s[1],d=u.toUpperCase();return"age"===e?d=YS[u]:"sex"===e?d=u.charAt(0).toUpperCase()+u.slice(1):"hiv"===e?d="positive"===u?"Positive":"unknown"===u?"Unknown":"Negative":"reason"===e?"diagnosis"===u?d="Diagnosis":"followup"===u&&(d="Follow-up"):"method"===e&&("zn"===u?d="ZN":"fm"===u&&(d="FM")),(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{sx:{fontWeight:500},children:d}),(0,l.jsx)(yw,{align:"center",children:(0,l.jsx)(dv,{type:"number",inputProps:{min:0},value:null!==(n=c.pos)&&void 0!==n?n:"",onChange:function(t){return r(e,u,"pos",t.target.value?parseInt(t.target.value):void 0)},size:"small",sx:{width:80}})}),(0,l.jsx)(yw,{align:"center",children:(0,l.jsx)(dv,{type:"number",inputProps:{min:0},value:null!==(o=c.neg)&&void 0!==o?o:"",onChange:function(t){return r(e,u,"neg",t.target.value?parseInt(t.target.value):void 0)},size:"small",sx:{width:80}})}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:600},children:(null!==(i=c.pos)&&void 0!==i?i:0)+(null!==(a=c.neg)&&void 0!==a?a:0)})]},"".concat(e,"-").concat(u))}))]})},QS=function(e){var t=e.data,n=e.handleChange;return(0,l.jsx)(Ir,{sx:{display:"flex",justifyContent:"center",mt:3},children:(0,l.jsxs)(Ub,{component:Di,sx:{maxWidth:700},children:[(0,l.jsx)(Wi,{variant:"h6",sx:{p:2,textAlign:"center",fontWeight:"bold"},children:"AFB Microscopy Summary"}),(0,l.jsxs)(Zb,{size:"small",children:[(0,l.jsx)(aw,{children:(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{sx:{fontWeight:"bold"},children:"Category"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"Positive +"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"Negative -"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"Total"})]})}),(0,l.jsxs)(Ow,{children:[GS("sex","i. Sex",t.sex,n),GS("age","ii. Age",t.age,n),GS("reason","iv. Reason",t.reason,n),GS("method","v. Method",t.method,n),GS("hiv","iii. HIV Status",t.hiv,n)]})]})]})})},$S={lt15:"<15","15to24":"15-24","25to49":"25-49",gte50:"\u226550"},KS={firstLine:"First Line",secondLine:"Second Line",thirdLine:"Third Line"},XS={routine:"Routine",targeted:"Targeted"},ZS={yes:"Pregnant",no:"Not Pregnant"},JS={yes:"Breastfeeding",no:"Not Breastfeeding"},ej={abbott:"Abbott",roche:"Roche"},tj=function(e,t,n,r){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(fw,{children:(0,l.jsx)(yw,{colSpan:5,sx:{fontWeight:"bold"},children:t})}),Object.entries(n).map((function(t){var n,o,i,a,s=Ne(t,2),u=s[0],c=s[1],d=u;return"age"===e?d=$S[u]:"sex"===e?d=u.charAt(0).toUpperCase()+u.slice(1):"artRegimen"===e?d=KS[u]:"indication"===e?d=XS[u]:"pregnancy"===e?d=ZS[u]:"breastFeeding"===e?d=JS[u]:"platform"===e&&(d=ej[u]),(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{sx:{fontWeight:500},children:d}),(0,l.jsx)(yw,{align:"center",children:(0,l.jsx)(dv,{type:"number",inputProps:{min:0},value:null!==(n=c.lt50)&&void 0!==n?n:"",onChange:function(t){return r(e,u,"lt50",t.target.value?parseInt(t.target.value):void 0)},size:"small",sx:{width:80}})}),(0,l.jsx)(yw,{align:"center",children:(0,l.jsx)(dv,{type:"number",inputProps:{min:0},value:null!==(o=c["50to999"])&&void 0!==o?o:"",onChange:function(t){return r(e,u,"50to999",t.target.value?parseInt(t.target.value):void 0)},size:"small",sx:{width:80}})}),(0,l.jsx)(yw,{align:"center",children:(0,l.jsx)(dv,{type:"number",inputProps:{min:0},value:null!==(i=c.gte1000)&&void 0!==i?i:"",onChange:function(t){return r(e,u,"gte1000",t.target.value?parseInt(t.target.value):void 0)},size:"small",sx:{width:80}})}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:600},children:null!==(a=c.total)&&void 0!==a?a:0})]},"".concat(e,"-").concat(u))}))]})},nj=function(e){var t=e.data,n=e.handleChange;return(0,l.jsx)(Ir,{sx:{display:"flex",justifyContent:"center",mt:3},children:(0,l.jsxs)(Ub,{component:Di,sx:{maxWidth:850},children:[(0,l.jsx)(Wi,{variant:"h6",sx:{p:2,textAlign:"center",fontWeight:"bold"},children:"Conventional Viral Load Summary"}),(0,l.jsxs)(Zb,{size:"small",children:[(0,l.jsx)(aw,{children:(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{sx:{fontWeight:"bold"},children:"Category"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"<50"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"50-999"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"\u22651000"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"Total"})]})}),(0,l.jsxs)(Ow,{children:[tj("platform","i. Platform",t.platform,n),tj("sex","ii. Sex",t.sex,n),tj("age","iii. Age",t.age,n),tj("artRegimen","iv. ART Regimen",t.artRegimen,n),tj("indication","v. Indication",t.indication,n),tj("pregnancy","vi. Pregnancy",t.pregnancy,n),tj("breastFeeding","vii. Breastfeeding",t.breastFeeding,n)]})]})]})})},rj={lt2m:"<2m","2to18m":"2-18m",gt18m:">18m"},oj={initial:"Initial",confirmatory:"Confirmatory"},ij={abbott:"Abbott",roche:"Roche"},aj=function(e,t,n,r){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(fw,{children:(0,l.jsx)(yw,{colSpan:7,sx:{fontWeight:"bold"},children:t})}),Object.entries(n).map((function(t){var n,o,i,a,s,u,c,d,f,p,h=Ne(t,2),m=h[0],v=h[1],g=m;return"age"===e?g=rj[m]:"testType"===e?g=oj[m]:"platform"===e&&(g=ij[m]),(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{sx:{fontWeight:500},children:g}),(0,l.jsx)(yw,{align:"center",children:(0,l.jsx)(dv,{type:"number",inputProps:{min:0},value:null!==(n=v.notDetected)&&void 0!==n?n:"",onChange:function(t){return r(e,m,"notDetected",t.target.value?parseInt(t.target.value):void 0)},size:"small",sx:{width:80}})}),(0,l.jsx)(yw,{align:"center",children:(0,l.jsx)(dv,{type:"number",inputProps:{min:0},value:null!==(o=v.detected)&&void 0!==o?o:"",onChange:function(t){return r(e,m,"detected",t.target.value?parseInt(t.target.value):void 0)},size:"small",sx:{width:80}})}),(0,l.jsx)(yw,{align:"center",children:(0,l.jsx)(dv,{type:"number",inputProps:{min:0},value:null!==(i=v.indeterminate)&&void 0!==i?i:"",onChange:function(t){return r(e,m,"indeterminate",t.target.value?parseInt(t.target.value):void 0)},size:"small",sx:{width:80}})}),(0,l.jsx)(yw,{align:"center",children:(0,l.jsx)(dv,{type:"number",inputProps:{min:0},value:null!==(a=v.error)&&void 0!==a?a:"",onChange:function(t){return r(e,m,"error",t.target.value?parseInt(t.target.value):void 0)},size:"small",sx:{width:80}})}),(0,l.jsx)(yw,{align:"center",children:(0,l.jsx)(dv,{type:"number",inputProps:{min:0},value:null!==(s=v.invalid)&&void 0!==s?s:"",onChange:function(t){return r(e,m,"invalid",t.target.value?parseInt(t.target.value):void 0)},size:"small",sx:{width:80}})}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:600},children:(null!==(u=v.notDetected)&&void 0!==u?u:0)+(null!==(c=v.detected)&&void 0!==c?c:0)+(null!==(d=v.indeterminate)&&void 0!==d?d:0)+(null!==(f=v.error)&&void 0!==f?f:0)+(null!==(p=v.invalid)&&void 0!==p?p:0)})]},"".concat(e,"-").concat(m))}))]})},lj=function(e){var t=e.data,n=e.handleChange;return(0,l.jsx)(Ir,{sx:{display:"flex",justifyContent:"center",mt:3},children:(0,l.jsxs)(Ub,{component:Di,sx:{maxWidth:900},children:[(0,l.jsx)(Wi,{variant:"h6",sx:{p:2,textAlign:"center",fontWeight:"bold"},children:"Conventional Early Infant Diagnosis (EID) Summary"}),(0,l.jsxs)(Zb,{size:"small",children:[(0,l.jsx)(aw,{children:(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{sx:{fontWeight:"bold"},children:"Category"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"Not Detected"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"Detected"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"Indeterminate"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"Error"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"Invalid"}),(0,l.jsx)(yw,{align:"center",sx:{fontWeight:"bold"},children:"Total"})]})}),(0,l.jsxs)(Ow,{children:[aj("platform","i. Platform",t.platform,n),aj("age","ii. Age",t.age,n),aj("testType","iii. Test Type",t.testType,n)]})]})]})})},sj={pos:void 0,neg:void 0},uj={sex:{male:Rp({},sj),female:Rp({},sj)},age:{lt5:Rp({},sj),"5to14":Rp({},sj),"15to24":Rp({},sj),"25to34":Rp({},sj),"35to44":Rp({},sj),"45to54":Rp({},sj),"55to64":Rp({},sj),gt65:Rp({},sj)},reason:{diagnosis:Rp({},sj),followup:Rp({},sj)},method:{zn:Rp({},sj),fm:Rp({},sj)},hiv:{positive:Rp({},sj),negative:Rp({},sj),unknown:Rp({},sj)}},cj={sex:{male:Rp({},sj),female:Rp({},sj)},age:{lt5:Rp({},sj),"5to14":Rp({},sj),"15to24":Rp({},sj),"25to34":Rp({},sj),"35to44":Rp({},sj),"45to54":Rp({},sj),"55to64":Rp({},sj),gt65:Rp({},sj)},indication:{tbSymptomaticInpatient:Rp({},sj),tbSymptomaticOutpatient:Rp({},sj),ahdInpatient:Rp({},sj),ahdOutpatient:Rp({},sj)}},dj={total:0,positive:0,negative:0,pos0:0,neg0:0,pos5:0,neg5:0,ntm:0,cont:0},fj={method:{solid:Rp({},dj),liquid:Rp({},dj)},reason:{PresumptiveRRMDR:Rp({},dj),inhResistant:Rp({},dj),preXDR:Rp({},dj)},sex:{male:Rp({},dj),female:Rp({},dj)},patientGroup:{new:Rp({},dj),relapse:Rp({},dj),failure:Rp({},dj),drTB:Rp({},dj),lossToFollowUp:Rp({},dj),contact:Rp({},dj),other:Rp({},dj)},hiv:{positive:Rp({},dj),negative:Rp({},dj),unknown:Rp({},dj)}},pj={susc:0,res:0},hj={fl:{inh:Rp({},pj),rif:Rp({},pj),emb:Rp({},pj),pyz:Rp({},pj)},sl:{dlm:Rp({},pj),bdq:Rp({},pj),lev:Rp({},pj),mxf:Rp({},pj),ofl:Rp({},pj),cap:Rp({},pj),cfz:Rp({},pj),lzd:Rp({},pj)}},mj={total:0,lt50:0,"50to999":0,gte1000:0},vj={platform:{abbott:Rp({},mj),roche:Rp({},mj)},sex:{male:Rp({},mj),female:Rp({},mj)},age:{lt15:Rp({},mj),"15to24":Rp({},mj),"25to49":Rp({},mj),gte50:Rp({},mj)},artRegimen:{firstLine:Rp({},mj),secondLine:Rp({},mj),thirdLine:Rp({},mj)},indication:{routine:Rp({},mj),targeted:Rp({},mj)},pregnancy:{no:Rp({},mj),yes:Rp({},mj)},breastFeeding:{no:Rp({},mj),yes:Rp({},mj)}},gj={notDetected:0,detected:0,indeterminate:0,error:0,invalid:0,total:0},yj={platform:{abbott:Rp({},gj),roche:Rp({},gj)},age:{lt2m:Rp({},gj),"2to18m":Rp({},gj),gt18m:Rp({},gj)},testType:{initial:Rp({},gj),confirmatory:Rp({},gj)}};function xj(e){return void 0!==e&&("object"!==typeof e||null===e||Object.values(e).every(xj))}function bj(e){return void 0!==e&&null!==e&&("number"===typeof e?!Number.isNaN(e):"object"!==typeof e||Object.values(e).every(bj))}var wj=function(){var t,n,r=mo().category,o=null===r||void 0===r?void 0:r.toUpperCase(),i=Ne((0,e.useState)(0),2),a=i[0],s=i[1],u=po(),c=Ne((0,e.useState)(!1),2),d=c[0],f=c[1],p=(new Date).getFullYear(),h=Ne((0,e.useState)(uj),2),m=h[0],v=h[1],g=Ne((0,e.useState)(cj),2),y=g[0],x=g[1],b=Ne((0,e.useState)(fj),2),w=b[0],S=b[1],j=Ne((0,e.useState)(hj),2),k=j[0],C=j[1],R=Ne((0,e.useState)(!0),2),T=R[0],O=R[1],P=Ne((0,e.useState)(vj),2),E=P[0],M=P[1],_=Ne((0,e.useState)(yj),2),D=_[0],I=_[1],A=Ne((0,e.useState)(null),2),N=A[0],L=A[1],z=Ne((0,e.useState)(null),2),F=z[0],W=z[1],B=Ne((0,e.useState)(!0),2),V=B[0],q=B[1],H=Ne((0,e.useState)({title:"",message:""}),2),U=H[0],Y=H[1],G=!!U.title||!!U.message,Q=["January","February","March","April","May","June","July","August","September","October","November","December"],$=Ne((0,e.useState)({category:o,reportMonth:function(){var e=new Date,t=new Date(e.getFullYear(),e.getMonth()-1,1);return Q[t.getMonth()]}(),reportYear:p,isDraft:!0}),2),K=$[0],X=$[1];(0,e.useEffect)((function(){var e=function(){var e=Hc(Vc().mark((function e(){var t,n;return Vc().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,Ki.get("/monthly-summary/drafts?category=".concat(o));case 3:t=e.sent,console.log("draft logs"+t),t.data&&Array.isArray(t.data)&&t.data.length>0?(n=t.data.sort((function(e,t){return new Date(t.createdAt).getTime()-new Date(e.createdAt).getTime()}))[0],X(Rp(Rp({},n),{},{reportMonth:n.reportMonth,reportYear:n.reportYear})),"HIV"===o?(M(n.vlData||vj),I(n.eidData||yj)):(v(n.afbData||uj),x(n.lflamData||cj),S(n.cultureData||fj),C(n.dstData||hj)),O(!1),n&&Y({title:"Draft Found",message:"You have a draft. Previous data has been loaded."})):(console.log("No draft found for category, using default state"),O(!0)),e.next=13;break;case 8:e.prev=8,e.t0=e.catch(0),console.error("Error fetching draft:",e.t0),L("Failed to load draft"),O(!0);case 13:return e.prev=13,q(!1),e.finish(13);case 16:case"end":return e.stop()}}),e,null,[[0,8,13,16]])})));return function(){return e.apply(this,arguments)}}();e()}),[r]);var Z=function(e,t){X((function(n){return Rp(Rp({},n),{},Ee({},e,t))}))},J=function(){var e=Hc(Vc().mark((function e(){var t,n,r,i,a,l;return Vc().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(console.log("saving draft >>>>>>>>>."),e.prev=1,t={report:K},"HIV"===o?(t.vlData=E,t.eidData=D):(t.afbData=m,t.lflamData=y,t.cultureData=w,t.dstData=k),console.log("saving draft"),!K.id){e.next=11;break}return e.next=8,Ki.put("/monthly-summary/".concat(K.id),t);case 8:n=e.sent,e.next=17;break;case 11:return console.log("saving draft to backend",t),e.next=14,Ki.post("/monthly-summary",t);case 14:n=e.sent,console.log("response id:",n.data.id),X((function(e){return Rp(Rp({},e),{},{id:n.data.id})}));case 17:W("Draft saved successfully"),L(null),e.next=29;break;case 21:e.prev=21,e.t0=e.catch(1),console.log(e.t0),a=null===(r=e.t0.response)||void 0===r||null===(i=r.data)||void 0===i?void 0:i.error,l=a||e.t0.message||"Unknown error",console.log(l),l.includes("Report exists for the chosen month and category")?L("A report for this month and category already exists. Please choose a different month."):L("Failed to save draft"),W(null);case 29:case"end":return e.stop()}}),e,null,[[1,21]])})));return function(){return e.apply(this,arguments)}}(),ee=function(){var e=Hc(Vc().mark((function e(){var t,n,r,i,a,l,s,u;return Vc().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=[],"TB"===o?(xj(m)||t.push("AFB Microscopy"),console.log(!bj(y)),console.log(!bj(y)),bj(y)||t.push("LF-LAM"),xj(w)||t.push("TB Culture"),xj(k)||t.push("DST")):"HIV"===o&&(xj(E)||t.push("Conventional Viral Load"),xj(D)||t.push("Conventional EID")),K.reportMonth&&K.reportYear){e.next=5;break}return L("Please select both Report Month and Report Year."),e.abrupt("return");case 5:if(!(t.length>0)){e.next=10;break}return n=t.join(", "),r=t.length>1,L("Please fill all required details of ".concat(n,". ")+(r?"These reports sections have missing values.":"This report section has missing values.")),e.abrupt("return");case 10:if(e.prev=10,i={report:K},"HIV"===o?(i.vlData=E,i.eidData=D):(i.afbData=m,i.lflamData=y,i.cultureData=w,i.dstData=k),K.id){e.next=18;break}return e.next=16,Ki.post("/monthly-summary/null/complete",i);case 16:e.next=20;break;case 18:return e.next=20,Ki.post("/monthly-summary/".concat(K.id,"/complete"),i);case 20:W("Report submitted successfully"),L(null),f(!0),e.next=33;break;case 25:e.prev=25,e.t0=e.catch(10),console.log(e.t0),s=null===(a=e.t0.response)||void 0===a||null===(l=a.data)||void 0===l?void 0:l.error,u=s||e.t0.message||"Unknown error",console.log(u),u.includes("Report exists for the chosen month and category")?L("A report for this month and category already exists. Please choose a different month."):L("Failed to submit report"),W(null);case 33:case"end":return e.stop()}}),e,null,[[10,25]])})));return function(){return e.apply(this,arguments)}}(),te=function(){u("/summary-report")};return V?(0,l.jsx)(Ir,{display:"flex",flexDirection:"column",bgcolor:"#121212cc",flexGrow:1,overflow:"auto",padding:2,children:(0,l.jsx)(Wi,{sx:{color:"white"},children:"Loading draft..."})}):K?(0,l.jsxs)(Ir,{display:"flex",flexDirection:"column",bgcolor:"#121212cc",overflow:"auto",children:[(0,l.jsxs)(md,{open:d,onClose:function(){return f(!1)},children:[(0,l.jsx)(wd,{children:"Success"}),(0,l.jsx)(Rd,{children:(0,l.jsx)(Wi,{children:F})}),(0,l.jsx)(bf,{children:(0,l.jsx)(Ef,{onClick:function(){f(!1),u("/summary-report")},color:"primary",children:"OK"})})]}),(0,l.jsxs)(md,{open:G,onClose:function(){return Y({title:"",message:""})},children:[(0,l.jsx)(wd,{children:U.title||"Notice"}),(0,l.jsx)(Rd,{children:(0,l.jsx)(Wi,{children:U.message})}),(0,l.jsx)(bf,{children:(0,l.jsx)(Ef,{onClick:function(){return Y({title:"",message:""})},color:"primary",children:"OK"})})]}),(0,l.jsxs)(md,{open:T&&!V,onClose:function(){return O(!1)},maxWidth:"sm",fullWidth:!0,children:[(0,l.jsx)(wd,{sx:{fontWeight:"bold"},children:"Important: New Monthly Summary Report"}),(0,l.jsxs)(Rd,{dividers:!0,children:[(0,l.jsxs)(Wi,{variant:"body1",paragraph:!0,children:["You are creating a ",(0,l.jsx)("strong",{children:"new report"})," for ",o,"."]}),(0,l.jsxs)(Wi,{variant:"body1",paragraph:!0,children:["\u2022 To ",(0,l.jsx)("strong",{children:"Submit Report"}),", ",(0,l.jsx)("strong",{children:"all sections must be completely filled"})," with valid numbers."]}),(0,l.jsxs)(Wi,{variant:"body1",paragraph:!0,children:["\u2022 If ",(0,l.jsx)("strong",{children:"no tests were performed"})," in a section (e.g., no AFB Microscopy, no cultures, no viral loads, etc.), please enter ",(0,l.jsx)("strong",{children:"0"})," in the relevant fields instead of leaving them blank."]}),(0,l.jsx)(Wi,{variant:"body1",children:"This ensures accurate reporting and successful submission."})]}),(0,l.jsxs)(bf,{children:[(0,l.jsx)(Ef,{onClick:te,color:"inherit",variant:"outlined",children:"Cancel"}),(0,l.jsx)(Ef,{onClick:function(){return O(!1)},color:"primary",variant:"contained",autoFocus:!0,children:"Continue"})]})]}),(0,l.jsxs)(Ir,{overflow:"auto",className:"scroll_enabled",padding:2,flexGrow:1,children:[(0,l.jsxs)(Wi,{gutterBottom:!0,sx:{color:"white"},children:["Create Monthly Summary Report - ",o]}),(0,l.jsxs)(Ci,{container:!0,spacing:2,children:[(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,required:!0,children:[(0,l.jsx)(Up,{sx:{fontSize:"0.9rem",color:"white"},shrink:!0,children:"Report Month"}),(0,l.jsx)(Hm,{value:null!==(t=K.reportMonth)&&void 0!==t?t:"",onChange:function(e){return Z("reportMonth",e.target.value||void 0)},label:"Report Month",size:"small",sx:{color:"white"},children:Q.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))}),(0,l.jsx)(iv,{children:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:void 0===K.reportMonth?"Required":""})})]})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(Dp,{size:"small",fullWidth:!0,required:!0,children:(0,l.jsx)(dv,{label:"Report Year",type:"number",value:null!==(n=K.reportYear)&&void 0!==n?n:"",onChange:function(e){return Z("reportYear",parseInt(e.target.value)||void 0)},fullWidth:!0,size:"small",InputLabelProps:{sx:{fontSize:"0.9rem",color:"white"}},inputProps:{style:{fontSize:"0.9rem",color:"white"}},helperText:(0,l.jsx)(Wi,{variant:"caption",color:"red",children:void 0===K.reportYear?"Required":""})})})})]}),(0,l.jsx)(Zs,{value:a,onChange:function(e,t){return s(t)},textColor:"inherit",indicatorColor:"secondary",variant:"fullWidth",sx:{mt:2,mb:2},children:("HIV"===o?["Conventional Viral Load","Conventional EID"]:["AFB Microscopy","LF-LAM","TB Culture","DST"]).map((function(e,t){return(0,l.jsx)(ou,{label:e,sx:{color:a===t?"secondary.main":"inherit",fontWeight:a===t?"bold":"normal"}},e)}))}),"HIV"===o?(0,l.jsxs)(l.Fragment,{children:[0===a&&(0,l.jsx)(nj,{data:E,handleChange:function(e,t,n,r){M((function(o){return Rp(Rp({},o),{},Ee({},e,Rp(Rp({},o[e]),{},Ee({},t,Rp(Rp({},o[e][t]),{},Ee({},n,r))))))}))}}),1===a&&(0,l.jsx)(lj,{data:D,handleChange:function(e,t,n,r){I((function(o){return Rp(Rp({},o),{},Ee({},e,Rp(Rp({},o[e]),{},Ee({},t,Rp(Rp({},o[e][t]),{},Ee({},n,r))))))}))}})]}):(0,l.jsxs)(l.Fragment,{children:[0===a&&(0,l.jsx)(QS,{data:m,handleChange:function(e,t,n,r){v((function(o){return Rp(Rp({},o),{},Ee({},e,Rp(Rp({},o[e]),{},Ee({},t,Rp(Rp({},o[e][t]),{},Ee({},n,r))))))}))}}),1===a&&(0,l.jsx)(BS,{lflamData:y,handleLflamChange:function(e,t,n,r){x((function(o){return Rp(Rp({},o),{},Ee({},e,Rp(Rp({},o[e]),{},Ee({},t,Rp(Rp({},o[e][t]),{},Ee({},n,r))))))}))}}),2===a&&(0,l.jsx)(qS,{cultureDisagg:w,handleCultureDisaggChange:function(e,t,n,r){S((function(o){return Rp(Rp({},o),{},Ee({},e,Rp(Rp({},o[e]),{},Ee({},t,Rp(Rp({},o[e][t]),{},Ee({},n,r))))))}))}}),3===a&&(0,l.jsx)(US,{dstData:k,handleDstChange:function(e,t,n,r){C((function(o){return Rp(Rp({},o),{},Ee({},e,Rp(Rp({},o[e]),{},Ee({},t,Rp(Rp({},o[e][t]),{},Ee({},n,r))))))}))}})]}),N&&(0,l.jsx)(Wi,{color:"error",sx:{mt:2,fontSize:"0.9rem"},children:N}),F&&(0,l.jsx)(Wi,{color:"success.main",sx:{mt:2,fontSize:"0.9rem"},children:F})]}),(0,l.jsxs)(Ir,{display:"flex",flexDirection:"row",component:Di,padding:2,justifyContent:"space-between",bgcolor:"#121212cc",flexGrow:0,children:[(0,l.jsx)(Ef,{variant:"outlined",onClick:te,type:"button",endIcon:(0,l.jsx)(bv,{}),sx:{backgroundColor:"white",color:"black",borderColor:"black",fontWeight:"bold",borderWidth:2,"&:hover":{backgroundColor:"#f5f5f5",borderColor:"black"}},children:"Cancel"}),(0,l.jsxs)(Ir,{display:"flex",gap:2,children:[(0,l.jsx)(Ef,{variant:"contained",color:"secondary",onClick:J,type:"button",endIcon:(0,l.jsx)(wv,{}),children:"Save Draft"}),(0,l.jsx)(Ef,{variant:"contained",color:"primary",onClick:ee,endIcon:(0,l.jsx)(wv,{}),type:"button",children:"Submit Report"})]})]})]}):(0,l.jsx)(Ir,{display:"flex",flexDirection:"column",bgcolor:"#121212cc",flexGrow:1,overflow:"auto",padding:2,children:(0,l.jsx)(Wi,{sx:{color:"white"},children:"Error: Unable to load report data"})})};function Sj(e){return e.substring(2).toLowerCase()}var jj=function(t){var n=t.children,r=t.disableReactTree,o=void 0!==r&&r,i=t.mouseEvent,a=void 0===i?"onClick":i,s=t.onClickAway,u=t.touchEvent,c=void 0===u?"onTouchEnd":u,d=e.useRef(!1),f=e.useRef(null),p=e.useRef(!1),h=e.useRef(!1);e.useEffect((function(){return setTimeout((function(){p.current=!0}),0),function(){p.current=!1}}),[]);var m=Al(n.ref,f),v=zl((function(e){var t=h.current;h.current=!1;var n=wl(f.current);!p.current||!f.current||"clientX"in e&&function(e,t){return t.documentElement.clientWidth<e.clientX||t.documentElement.clientHeight<e.clientY}(e,n)||(d.current?d.current=!1:(e.composedPath?e.composedPath().indexOf(f.current)>-1:!n.documentElement.contains(e.target)||f.current.contains(e.target))||!o&&t||s(e))})),g=function(e){return function(t){h.current=!0;var r=n.props[e];r&&r(t)}},y={ref:m};return!1!==c&&(y[c]=g(c)),e.useEffect((function(){if(!1!==c){var e=Sj(c),t=wl(f.current),n=function(){d.current=!0};return t.addEventListener(e,v),t.addEventListener("touchmove",n),function(){t.removeEventListener(e,v),t.removeEventListener("touchmove",n)}}}),[v,c]),!1!==a&&(y[a]=g(a)),e.useEffect((function(){if(!1!==a){var e=Sj(a),t=wl(f.current);return t.addEventListener(e,v),function(){t.removeEventListener(e,v)}}}),[v,a]),(0,l.jsx)(e.Fragment,{children:e.cloneElement(n,y)})};function kj(e){return Qo("MuiSnackbarContent",e)}$o("MuiSnackbarContent",["root","message","action"]);var Cj=["action","className","message","role"],Rj=Yo(Di,{name:"MuiSnackbarContent",slot:"Root",overridesResolver:function(e,t){return t.root}})((function(e){var t=e.theme,n="light"===t.palette.mode?.8:.98,o=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:.15;return Rt(e)>.5?Ot(e,t):Pt(e,t)}(t.palette.background.default,n);return r({},t.typography.body2,Ee({color:t.vars?t.vars.palette.SnackbarContent.color:t.palette.getContrastText(o),backgroundColor:t.vars?t.vars.palette.SnackbarContent.bg:o,display:"flex",alignItems:"center",flexWrap:"wrap",padding:"6px 16px",borderRadius:(t.vars||t).shape.borderRadius,flexGrow:1},t.breakpoints.up("sm"),{flexGrow:"initial",minWidth:288}))})),Tj=Yo("div",{name:"MuiSnackbarContent",slot:"Message",overridesResolver:function(e,t){return t.message}})({padding:"8px 0"}),Oj=Yo("div",{name:"MuiSnackbarContent",slot:"Action",overridesResolver:function(e,t){return t.action}})({display:"flex",alignItems:"center",marginLeft:"auto",paddingLeft:16,marginRight:-8}),Pj=e.forwardRef((function(e,t){var n=ln({props:e,name:"MuiSnackbarContent"}),o=n.action,i=n.className,a=n.message,s=n.role,u=void 0===s?"alert":s,c=Te(n,Cj),d=n,f=function(e){return Po({root:["root"],action:["action"],message:["message"]},kj,e.classes)}(d);return(0,l.jsxs)(Rj,r({role:u,square:!0,elevation:6,className:wn(f.root,i),ownerState:d,ref:t},c,{children:[(0,l.jsx)(Tj,{className:f.message,ownerState:d,children:a}),o?(0,l.jsx)(Oj,{className:f.action,ownerState:d,children:o}):null]}))})),Ej=Pj;function Mj(e){return Qo("MuiSnackbar",e)}$o("MuiSnackbar",["root","anchorOriginTopCenter","anchorOriginBottomCenter","anchorOriginTopRight","anchorOriginBottomRight","anchorOriginTopLeft","anchorOriginBottomLeft"]);var _j=["onEnter","onExited"],Dj=["action","anchorOrigin","autoHideDuration","children","className","ClickAwayListenerProps","ContentProps","disableWindowBlurListener","message","onBlur","onClose","onFocus","onMouseEnter","onMouseLeave","open","resumeHideDuration","TransitionComponent","transitionDuration","TransitionProps"],Ij=Yo("div",{name:"MuiSnackbar",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,t["anchorOrigin".concat(Eo(n.anchorOrigin.vertical)).concat(Eo(n.anchorOrigin.horizontal))]]}})((function(e){var t=e.theme,n=e.ownerState;return r({zIndex:(t.vars||t).zIndex.snackbar,position:"fixed",display:"flex",left:8,right:8,justifyContent:"center",alignItems:"center"},"top"===n.anchorOrigin.vertical?{top:8}:{bottom:8},"left"===n.anchorOrigin.horizontal&&{justifyContent:"flex-start"},"right"===n.anchorOrigin.horizontal&&{justifyContent:"flex-end"},Ee({},t.breakpoints.up("sm"),r({},"top"===n.anchorOrigin.vertical?{top:24}:{bottom:24},"center"===n.anchorOrigin.horizontal&&{left:"50%",right:"auto",transform:"translateX(-50%)"},"left"===n.anchorOrigin.horizontal&&{left:24,right:"auto"},"right"===n.anchorOrigin.horizontal&&{right:24,left:"auto"})))})),Aj=e.forwardRef((function(t,n){var o=ln({props:t,name:"MuiSnackbar"}),i=hi(),a={enter:i.transitions.duration.enteringScreen,exit:i.transitions.duration.leavingScreen},s=o.action,u=o.anchorOrigin,c=(u=void 0===u?{vertical:"bottom",horizontal:"left"}:u).vertical,d=u.horizontal,f=o.autoHideDuration,p=void 0===f?null:f,h=o.children,m=o.className,v=o.ClickAwayListenerProps,g=o.ContentProps,y=o.disableWindowBlurListener,x=void 0!==y&&y,b=o.message,w=o.onBlur,S=o.onClose,j=o.onFocus,k=o.onMouseEnter,C=o.onMouseLeave,R=o.open,T=o.resumeHideDuration,O=o.TransitionComponent,P=void 0===O?ih:O,E=o.transitionDuration,M=void 0===E?a:E,_=o.TransitionProps,D=(_=void 0===_?{}:_).onEnter,I=_.onExited,A=Te(o.TransitionProps,_j),N=Te(o,Dj),L=r({},o,{anchorOrigin:{vertical:c,horizontal:d}}),z=function(e){var t=e.classes,n=e.anchorOrigin;return Po({root:["root","anchorOrigin".concat(Eo(n.vertical)).concat(Eo(n.horizontal))]},Mj,t)}(L),F=e.useRef(),W=Ne(e.useState(!0),2),B=W[0],V=W[1],q=Wl((function(){S&&S.apply(void 0,arguments)})),H=Wl((function(e){S&&null!=e&&(clearTimeout(F.current),F.current=setTimeout((function(){q(null,"timeout")}),e))}));e.useEffect((function(){return R&&H(p),function(){clearTimeout(F.current)}}),[R,p,H]);var U=function(){clearTimeout(F.current)},Y=e.useCallback((function(){null!=p&&H(null!=T?T:.5*p)}),[p,T,H]);return e.useEffect((function(){if(!x&&R)return window.addEventListener("focus",Y),window.addEventListener("blur",U),function(){window.removeEventListener("focus",Y),window.removeEventListener("blur",U)}}),[x,Y,R]),e.useEffect((function(){if(R)return document.addEventListener("keydown",e),function(){document.removeEventListener("keydown",e)};function e(e){e.defaultPrevented||"Escape"!==e.key&&"Esc"!==e.key||S&&S(e,"escapeKeyDown")}}),[B,R,S]),!R&&B?null:(0,l.jsx)(jj,r({onClickAway:function(e){S&&S(e,"clickaway")}},v,{children:(0,l.jsx)(Ij,r({className:wn(z.root,m),onBlur:function(e){w&&w(e),Y()},onFocus:function(e){j&&j(e),U()},onMouseEnter:function(e){k&&k(e),U()},onMouseLeave:function(e){C&&C(e),Y()},ownerState:L,ref:n,role:"presentation"},N,{children:(0,l.jsx)(P,r({appear:!0,in:R,timeout:M,direction:"top"===c?"down":"up",onEnter:function(e,t){V(!1),D&&D(e,t)},onExited:function(e){V(!0),I&&I(e)}},A,{children:h||(0,l.jsx)(Ej,r({message:b,action:s},g))}))}))}))})),Nj=Aj;function Lj(e){return Qo("MuiAlert",e)}var zj,Fj=$o("MuiAlert",["root","action","icon","message","filled","filledSuccess","filledInfo","filledWarning","filledError","outlined","outlinedSuccess","outlinedInfo","outlinedWarning","outlinedError","standard","standardSuccess","standardInfo","standardWarning","standardError"]),Wj=Ml((0,l.jsx)("path",{d:"M20,12A8,8 0 0,1 12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4C12.76,4 13.5,4.11 14.2, 4.31L15.77,2.74C14.61,2.26 13.34,2 12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0, 0 22,12M7.91,10.08L6.5,11.5L11,16L21,6L19.59,4.58L11,13.17L7.91,10.08Z"}),"SuccessOutlined"),Bj=Ml((0,l.jsx)("path",{d:"M12 5.99L19.53 19H4.47L12 5.99M12 2L1 21h22L12 2zm1 14h-2v2h2v-2zm0-6h-2v4h2v-4z"}),"ReportProblemOutlined"),Vj=Ml((0,l.jsx)("path",{d:"M11 15h2v2h-2zm0-8h2v6h-2zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"}),"ErrorOutline"),qj=Ml((0,l.jsx)("path",{d:"M11,9H13V7H11M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20, 12C20,16.41 16.41,20 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10, 10 0 0,0 12,2M11,17H13V11H11V17Z"}),"InfoOutlined"),Hj=["action","children","className","closeText","color","icon","iconMapping","onClose","role","severity","variant"],Uj=Yo(Di,{name:"MuiAlert",slot:"Root",overridesResolver:function(e,t){var n=e.ownerState;return[t.root,t[n.variant],t["".concat(n.variant).concat(Eo(n.color||n.severity))]]}})((function(e){var t=e.theme,n=e.ownerState,o="light"===t.palette.mode?Ot:Pt,i="light"===t.palette.mode?Pt:Ot,a=n.color||n.severity;return r({},t.typography.body2,{backgroundColor:"transparent",display:"flex",padding:"6px 16px"},a&&"standard"===n.variant&&Ee({color:t.vars?t.vars.palette.Alert["".concat(a,"Color")]:o(t.palette[a].light,.6),backgroundColor:t.vars?t.vars.palette.Alert["".concat(a,"StandardBg")]:i(t.palette[a].light,.9)},"& .".concat(Fj.icon),t.vars?{color:t.vars.palette.Alert["".concat(a,"IconColor")]}:{color:"dark"===t.palette.mode?t.palette[a].main:t.palette[a].light}),a&&"outlined"===n.variant&&Ee({color:t.vars?t.vars.palette.Alert["".concat(a,"Color")]:o(t.palette[a].light,.6),border:"1px solid ".concat((t.vars||t).palette[a].light)},"& .".concat(Fj.icon),t.vars?{color:t.vars.palette.Alert["".concat(a,"IconColor")]}:{color:"dark"===t.palette.mode?t.palette[a].main:t.palette[a].light}),a&&"filled"===n.variant&&r({fontWeight:t.typography.fontWeightMedium},t.vars?{color:t.vars.palette.Alert["".concat(a,"FilledColor")],backgroundColor:t.vars.palette.Alert["".concat(a,"FilledBg")]}:{backgroundColor:"dark"===t.palette.mode?t.palette[a].dark:t.palette[a].main,color:t.palette.getContrastText("dark"===t.palette.mode?t.palette[a].dark:t.palette[a].main)}))})),Yj=Yo("div",{name:"MuiAlert",slot:"Icon",overridesResolver:function(e,t){return t.icon}})({marginRight:12,padding:"7px 0",display:"flex",fontSize:22,opacity:.9}),Gj=Yo("div",{name:"MuiAlert",slot:"Message",overridesResolver:function(e,t){return t.message}})({padding:"8px 0",minWidth:0,overflow:"auto"}),Qj=Yo("div",{name:"MuiAlert",slot:"Action",overridesResolver:function(e,t){return t.action}})({display:"flex",alignItems:"flex-start",padding:"4px 0 0 16px",marginLeft:"auto",marginRight:-8}),$j={success:(0,l.jsx)(Wj,{fontSize:"inherit"}),warning:(0,l.jsx)(Bj,{fontSize:"inherit"}),error:(0,l.jsx)(Vj,{fontSize:"inherit"}),info:(0,l.jsx)(qj,{fontSize:"inherit"})},Kj=e.forwardRef((function(e,t){var n=ln({props:e,name:"MuiAlert"}),o=n.action,i=n.children,a=n.className,s=n.closeText,u=void 0===s?"Close":s,c=n.color,d=n.icon,f=n.iconMapping,p=void 0===f?$j:f,h=n.onClose,m=n.role,v=void 0===m?"alert":m,g=n.severity,y=void 0===g?"success":g,x=n.variant,b=void 0===x?"standard":x,w=Te(n,Hj),S=r({},n,{color:c,severity:y,variant:b}),j=function(e){var t=e.variant,n=e.color,r=e.severity,o=e.classes;return Po({root:["root","".concat(t).concat(Eo(n||r)),"".concat(t)],icon:["icon"],message:["message"],action:["action"]},Lj,o)}(S);return(0,l.jsxs)(Uj,r({role:v,elevation:0,ownerState:S,className:wn(j.root,a),ref:t},w,{children:[!1!==d?(0,l.jsx)(Yj,{ownerState:S,className:j.icon,children:d||p[y]||$j[y]}):null,(0,l.jsx)(Gj,{ownerState:S,className:j.message,children:i}),null!=o?(0,l.jsx)(Qj,{ownerState:S,className:j.action,children:o}):null,null==o&&h?(0,l.jsx)(Qj,{ownerState:S,className:j.action,children:(0,l.jsx)(Ec,{size:"small","aria-label":u,title:u,color:"inherit",onClick:h,children:zj||(zj=(0,l.jsx)(sb,{fontSize:"small"}))})}):null]}))})),Xj=Kj,Zj=function(){var t,n,r=po(),o=mo().sampleId,i=Ne((0,e.useState)(!0),2),a=i[0],s=i[1],u=Ne((0,e.useState)([]),2),c=u[0],d=u[1],f=Ne((0,e.useState)(null),2),p=f[0],h=f[1],m=Ne((0,e.useState)(!1),2),v=m[0],g=m[1],y=Ne((0,e.useState)(null),2),x=y[0],b=y[1],w=Ne((0,e.useState)(!1),2),S=w[0],j=w[1],k=Ne((0,e.useState)(!1),2),C=k[0],R=k[1],T=oy({defaultValues:{testType:"Patient",diagnosisType:"TB"}}),O=T.control,P=T.handleSubmit,E=T.setValue,M=T.reset,_=(T.watch,T.formState.errors,cg({control:O,name:"testType"})),D=cg({control:O,name:"diagnosisType"}),I=(cg({control:O,name:"sampleType"}),cg({control:O,name:"sampleCollectionSiteType"})),A=cg({control:O,name:"viralLoad.reasonForTestCategory"}),N=cg({control:O,name:"viralLoad.cd4Info.cd4TestDoneInLast12Months"}),L=cg({control:O,name:"patientRegistrationGroup"}),z="Off Site"===I;(0,e.useEffect)((function(){function e(){return(e=Hc(Vc().mark((function e(){var t,n,r,i,a,l,u,c,f,p,m;return Vc().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,Promise.all([Ki.get("/users"),Ki.get("/requests/get-detail/".concat(o))]);case 3:u=e.sent,c=Ne(u,2),f=c[0],p=c[1],d(f.data),(m=p.data).sampleCollectedAt&&(m.sampleCollectedAt=new Date(m.sampleCollectedAt).toISOString().split("T")[0]),null!==m&&void 0!==m&&null!==(t=m.eid)&&void 0!==t&&t.dob&&(m.eid.dob=new Date(m.eid.dob).toISOString().split("T")[0]),null!==m&&void 0!==m&&null!==(n=m.eid)&&void 0!==n&&n.specimenArrivalDate&&(m.eid.specimenArrivalDate=new Date(m.eid.specimenArrivalDate).toISOString().split("T")[0]),null!==m&&void 0!==m&&null!==(r=m.viralLoad)&&void 0!==r&&null!==(i=r.artRegimen)&&void 0!==i&&i.dateInitiated&&(m.viralLoad.artRegimen.dateInitiated=new Date(m.viralLoad.artRegimen.dateInitiated).toISOString().split("T")[0]),null!==m&&void 0!==m&&null!==(a=m.viralLoad)&&void 0!==a&&null!==(l=a.cd4Info)&&void 0!==l&&l.dateOfMostRecentCD4Count&&(m.viralLoad.cd4Info.dateOfMostRecentCD4Count=new Date(m.viralLoad.cd4Info.dateOfMostRecentCD4Count).toISOString().split("T")[0]),M(m),h(m),s(!1),e.next=24;break;case 19:e.prev=19,e.t0=e.catch(0),console.error(e.t0),b("Could not load request data"),s(!1);case 24:case"end":return e.stop()}}),e,null,[[0,19]])})))).apply(this,arguments)}!function(){e.apply(this,arguments)}()}),[o,M]);var F=function(){var e=Hc(Vc().mark((function e(t){var n,o;return Vc().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return g(!0),e.prev=1,e.next=4,Ki.post("/requests/approve",t);case 4:r("/pending-tests"),e.next=11;break;case 7:e.prev=7,e.t0=e.catch(1),b((null===e.t0||void 0===e.t0||null===(n=e.t0.response)||void 0===n||null===(o=n.data)||void 0===o?void 0:o.message)||"Approval failed"),g(!1);case 11:case"end":return e.stop()}}),e,null,[[1,7]])})));return function(t){return e.apply(this,arguments)}}();return a?(0,l.jsx)(pi,{}):(0,l.jsxs)(Ir,{component:"form",onSubmit:P((function(){return j(!0)})),display:"flex",flexDirection:"column",flexGrow:1,overflow:"auto",bgcolor:"#121212cc",children:[(0,l.jsx)(Nj,{open:!!x,autoHideDuration:6e3,onClose:function(){return b(null)},children:(0,l.jsx)(Xj,{severity:"error",onClose:function(){return b(null)},children:x})}),(0,l.jsxs)(Ir,{p:2,flexGrow:1,overflow:"auto",className:"scroll_enabled",children:[(0,l.jsx)(Wi,{variant:"h5",fontWeight:"bold",gutterBottom:!0,children:"Approve test detail and result"}),(0,l.jsxs)(Wi,{variant:"body1",color:"textSecondary",gutterBottom:!0,sx:{pb:2},children:["Please review the test details information and result, and approve it.",(0,l.jsx)("br",{}),"By approving, you confirm that all the information is correct and authorize us to proceed."]}),(0,l.jsxs)(Ir,{mb:3,children:[(0,l.jsx)(Wi,{variant:"subtitle1",fontWeight:"bold",children:"Result:"})," ",null!==p&&void 0!==p&&null!==(t=p.test)&&void 0!==t&&t.result_text?(0,l.jsx)(wp,{label:null===p||void 0===p||null===(n=p.test)||void 0===n?void 0:n.result_text,color:"primary",size:"medium"}):(0,l.jsx)(Wi,{component:"span",color:"text.secondary",children:"(no result yet)"})]}),(0,l.jsxs)(Ci,{container:!0,spacing:2,children:[(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"testType",control:O,rules:{required:"Select a test type"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,required:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"Type Of Test"}),(0,l.jsx)(Hm,Rp(Rp({},n),{},{label:"Type of Test",notched:!0,children:iy.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{error:!0,children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"sampleId",control:O,render:function(e){var t=e.field;return(0,l.jsx)(dv,Rp({label:"Sample Identifier",size:"small",fullWidth:!0,disabled:!0,InputLabelProps:{shrink:!0}},t))}})}),(0,l.jsx)(Py,{when:"Patient"===_,render:function(){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(Ci,{item:!0,xs:3,children:(0,l.jsx)(fg,{name:"mrn",control:O,rules:{required:"required to identify the patient"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"MRN",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},error:!!r.error,helperText:null===(t=r.error)||void 0===t?void 0:t.message},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"name",control:O,rules:{required:"required to identify the patient"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Name",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},error:!!r.error,helperText:null===(t=r.error)||void 0===t?void 0:t.message},n))}})}),("TB"===D||"ViralLoad"===D)&&(0,l.jsx)(Ci,{item:!0,xs:3,children:(0,l.jsx)(fg,{name:"age",control:O,rules:{required:"required for statistics",min:{value:0,message:"Age must be \u2265 0"}},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({type:"number",label:"Age (Yrs)",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},error:!!r.error,helperText:null===(t=r.error)||void 0===t?void 0:t.message},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"gender",control:O,rules:{required:"required for statistics"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,error:!!r.error,children:[(0,l.jsx)(Up,{shrink:!0,children:"Gender"}),(0,l.jsx)(Hm,Rp(Rp({},n),{},{label:"Gender",notched:!0,children:ay.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"sampleType",control:O,rules:{required:"required for statistics"},render:function(e){var t,n,r=e.field,o=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,error:!!o.error,children:[(0,l.jsx)(Up,{shrink:!0,children:"Sample Type"}),C?(0,l.jsx)(dv,{size:"small",placeholder:"Specify other sample type",value:null!==(t=r.value)&&void 0!==t?t:"",onChange:function(e){return r.onChange(e.target.value)},InputProps:{endAdornment:(0,l.jsx)(yv,{position:"end",children:(0,l.jsx)(Ec,{size:"small",onClick:function(){R(!1),r.onChange("")},children:(0,l.jsx)(xv,{fontSize:"small"})})})}}):(0,l.jsxs)(Hm,Rp(Rp({},r),{},{label:"Sample Type",notched:!0,onChange:function(e){var t=e.target.value;"Others"===t?(R(!0),r.onChange("")):r.onChange(t)},children:[("TB"===D?wy:"EID"===D?Sy:jy).map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)})),(0,l.jsx)(Zm,{value:"Others",children:"Others"})]})),(0,l.jsx)(iv,{children:null===(n=o.error)||void 0===n?void 0:n.message})]})}})}),"TB"===D&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"patientRegistrationGroup",control:O,rules:{required:"required for statistics"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,error:!!r.error,children:[(0,l.jsx)(Up,{shrink:!0,children:"Patient Registration Group"}),(0,l.jsx)(Hm,Rp(Rp({},n),{},{label:"Patient Registration Group",notched:!0,children:dy.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})}),"New"!==L&&(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"previouslyTreated",control:O,rules:{required:"required for statistics"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,error:!!r.error,children:[(0,l.jsx)(Up,{shrink:!0,children:"Treatment History"}),(0,l.jsx)(Hm,Rp(Rp({},n),{},{label:"Treatment History",notched:!0,children:cy.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})})]}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"sampleCollectionSiteType",control:O,rules:{required:"required for statistics"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,error:!!r.error,children:[(0,l.jsx)(Up,{shrink:!0,children:"Where was the sample collected?"}),(0,l.jsx)(Hm,Rp(Rp({},n),{},{label:"Where was the sample collected?",notched:!0,children:uy.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})}),z&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"sampleCollectionSiteId",control:O,rules:{required:"required for statistics"},render:function(e){var t,n,r=e.field,o=e.fieldState;return(0,l.jsx)(Tb,{label:"Which facility was the sample collected?",value:null!==(t=r.value)&&void 0!==t?t:"",onChange:r.onChange,helperText:null===(n=o.error)||void 0===n?void 0:n.message})}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"referringLabContacts",control:O,rules:{required:"required for statistics",pattern:{value:gy,message:"Invalid phone"}},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Referring Lab Phone No",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},error:!!r.error,helperText:null===(t=r.error)||void 0===t?void 0:t.message},n))}})})]}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"reasonForDiagnosis",control:O,rules:{required:"required for statistics"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,error:!!r.error,children:[(0,l.jsx)(Up,{shrink:!0,children:"Reason for diagnosis"}),(0,l.jsx)(Hm,Rp(Rp({},n),{},{label:"Reason for diagnosis",notched:!0,children:("TB"===D?yy:"EID"===D?xy:ky).map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"patientContacts",control:O,rules:{pattern:{value:gy,message:"Invalid phone"}},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Patient Phone No (If Available)",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},error:!!r.error,helperText:null===(t=r.error)||void 0===t?void 0:t.message},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"clinicianContacts",control:O,rules:{required:"required for statistics",pattern:{value:gy,message:"Invalid phone"}},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Clinician Phone No",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},error:!!r.error,helperText:null===(t=r.error)||void 0===t?void 0:t.message},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:4,children:(0,l.jsx)(fg,{name:"hivStatus",control:O,rules:{required:"required for statistics"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,error:!!r.error,children:[(0,l.jsx)(Up,{shrink:!0,children:"HIV Status"}),(0,l.jsx)(Hm,Rp(Rp({},n),{},{label:"HIV Status",notched:!0,children:sy.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"sampleCollectedAt",control:O,rules:{required:"required for statistics"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"When was the sample collected?",type:"date",size:"small",fullWidth:!0,InputLabelProps:{shrink:!0},error:!!r.error,helperText:null===(t=r.error)||void 0===t?void 0:t.message},n))}})}),"TB"===D&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"isRepeatedRifResitanceTest",control:O,render:function(e){var t=e.field;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"Repeat Confirmatory RR test?"}),(0,l.jsx)(Hm,Rp(Rp({},t),{},{label:"Repeat Confirmatory RR test?",notched:!0,children:fy.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))}))]})}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"infectionSite",control:O,rules:{required:"required for statistics"},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,error:!!r.error,children:[(0,l.jsx)(Up,{shrink:!0,children:"Site of Infection"}),(0,l.jsx)(Hm,Rp(Rp({},n),{},{label:"Site of Infection",notched:!0,children:ly.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})})]}),"EID"===D&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"eid.heiCode",control:O,rules:{required:!0},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"HEI Code",size:"small",fullWidth:!0,error:!!r.error,helperText:null===(t=r.error)||void 0===t?void 0:t.message,InputLabelProps:{shrink:!0}},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"eid.dob",control:O,rules:{required:!0},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Date of Birth",type:"date",size:"small",fullWidth:!0,error:!!r.error,helperText:null===(t=r.error)||void 0===t?void 0:t.message,InputLabelProps:{shrink:!0}},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"eid.maternalArtStatus",control:O,rules:{required:!0},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,error:!!r.error,children:[(0,l.jsx)(Up,{shrink:!0,children:"Maternal ART Status"}),(0,l.jsx)(Hm,Rp(Rp({},n),{},{label:"Maternal ART Status",notched:!0,children:by.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})})]}),"ViralLoad"===D&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"viralLoad.uniqueArtId",control:O,rules:{required:!0},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Unique ART ID",size:"small",fullWidth:!0,error:!!r.error,helperText:null===(t=r.error)||void 0===t?void 0:t.message,InputLabelProps:{shrink:!0}},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:4,children:(0,l.jsx)(fg,{name:"viralLoad.artRegimen.regimenType",control:O,rules:{required:!0},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,error:!!r.error,children:[(0,l.jsx)(Up,{shrink:!0,children:"Regimen Type"}),(0,l.jsx)(Hm,Rp(Rp({},n),{},{label:"Regimen Type",notched:!0,children:Oy.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})}),(0,l.jsx)(Ci,{item:!0,xs:4,children:(0,l.jsx)(fg,{name:"viralLoad.artRegimen.regimenName",control:O,rules:{required:!0},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Regimen (drug list)",size:"small",fullWidth:!0,error:!!r.error,helperText:null===(t=r.error)||void 0===t?void 0:t.message,InputLabelProps:{shrink:!0}},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:4,children:(0,l.jsx)(fg,{name:"viralLoad.artRegimen.dateInitiated",control:O,rules:{required:!0},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Date Initiated",type:"date",size:"small",fullWidth:!0,error:!!r.error,helperText:null===(t=r.error)||void 0===t?void 0:t.message,InputLabelProps:{shrink:!0}},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsx)(fg,{name:"viralLoad.cd4Info.cd4TestDoneInLast12Months",control:O,rules:{required:!0},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,error:!!r.error,children:[(0,l.jsx)(Up,{shrink:!0,children:"CD4 Test Done in last 12 months?"}),(0,l.jsx)(Hm,Rp(Rp({},n),{},{label:"CD4 Test Done in last 12 months?",notched:!0,children:fy.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})}),"Yes"===N&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"viralLoad.cd4Info.mostRecentCD4Count",control:O,rules:{required:!0},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Most Recent CD4 Count",type:"number",size:"small",fullWidth:!0,error:!!r.error,helperText:null===(t=r.error)||void 0===t?void 0:t.message,InputLabelProps:{shrink:!0}},n))}})}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"viralLoad.cd4Info.dateOfMostRecentCD4Count",control:O,rules:{required:!0},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsx)(dv,Rp({label:"Date of Most Recent CD4",type:"date",size:"small",fullWidth:!0,error:!!r.error,helperText:null===(t=r.error)||void 0===t?void 0:t.message,InputLabelProps:{shrink:!0}},n))}})})]}),(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"viralLoad.reasonForTestCategory",control:O,rules:{required:!0},render:function(e){var t,n=e.field,r=e.fieldState;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,error:!!r.error,children:[(0,l.jsx)(Up,{shrink:!0,children:"Reason Category"}),(0,l.jsx)(Hm,Rp(Rp({},n),{},{label:"Reason Category",notched:!0,children:ky.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})),(0,l.jsx)(iv,{children:null===(t=r.error)||void 0===t?void 0:t.message})]})}})}),"Routine"===A&&(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(Ci,{item:!0,xs:6,children:(0,l.jsx)(fg,{name:"viralLoad.routineReasongr",control:O,render:function(e){var t=e.field;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"Routine Group"}),(0,l.jsx)(Hm,Rp(Rp({},t),{},{label:"Routine Group",notched:!0,children:Cy.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))}))]})}})}),(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsx)(fg,{name:"viralLoad.routineReasonOpt",control:O,render:function(e){var t=e.field;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"Routine Reason"}),(0,l.jsx)(Hm,Rp(Rp({},t),{},{label:"Routine Reason",notched:!0,children:Ry.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))}))]})}})})]}),"Targeted"===A&&(0,l.jsx)(Ci,{item:!0,xs:12,children:(0,l.jsx)(fg,{name:"viralLoad.targetedReason",control:O,render:function(e){var t=e.field;return(0,l.jsxs)(Dp,{size:"small",fullWidth:!0,children:[(0,l.jsx)(Up,{shrink:!0,children:"Targeted Reason"}),(0,l.jsx)(Hm,Rp(Rp({},t),{},{label:"Targeted Reason",notched:!0,children:Ty.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))}))]})}})})]})]})}})]})]}),(0,l.jsxs)(Ir,{component:Di,p:2,display:"flex",justifyContent:"space-between",bgcolor:"#121212cc",children:[(0,l.jsx)(Ef,{startIcon:(0,l.jsx)(bv,{}),onClick:function(){return r("/pending-tests")},variant:"outlined",children:"Cancel"}),(0,l.jsx)(Ef,{variant:"contained",endIcon:(0,l.jsx)(wv,{}),type:"submit",disabled:v,children:v?"Approving...":"Verify and Approve"})]}),(0,l.jsxs)(md,{open:S,onClose:function(){return j(!1)},fullWidth:!0,maxWidth:"sm",children:[(0,l.jsx)(wd,{children:"Confirm Approval"}),(0,l.jsx)(Rd,{children:(0,l.jsx)(fg,{name:"approvedById",control:O,rules:{required:"Approver is required"},render:function(e){var t,n=e.field,r=n.value,o=n.onChange,i=e.fieldState;return(0,l.jsxs)(Dp,{fullWidth:!0,error:!!i.error,sx:{mt:2},children:[(0,l.jsx)(Up,{children:"Approved By"}),(0,l.jsx)(Hm,{value:r||"",label:"Approved By",onChange:function(e){var t=e.target.value;o(t);var n=c.find((function(e){return e.id===t}));n&&E("approvedByName",n.name)},children:c.map((function(e){return(0,l.jsx)(Zm,{value:e.id,children:e.name},e.id)}))}),(0,l.jsx)(iv,{children:null===(t=i.error)||void 0===t?void 0:t.message})]})}})}),(0,l.jsxs)(bf,{children:[(0,l.jsx)(Ef,{onClick:function(){return j(!1)},children:"Cancel"}),(0,l.jsx)(Ef,{variant:"contained",onClick:P(F),disabled:v,children:v?"Approving...":"Approve"})]})]})]})},Jj=Ml((0,l.jsx)("path",{d:"M19 4H5c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h4v-2H5V8h14v10h-4v2h4c1.1 0 2-.9 2-2V6c0-1.1-.89-2-2-2zm-7 6-4 4h3v6h2v-6h3l-4-4z"}),"OpenInBrowser"),ek=function(){var t=po(),n=Ne((0,e.useState)([]),2),r=n[0],o=n[1],i=Ne((0,e.useState)(!0),2),a=i[0],s=i[1],u=Ne((0,e.useState)(null),2),c=u[0],d=u[1],f=function(){var e=Hc(Vc().mark((function e(){var t;return Vc().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,s(!0),e.next=4,Ki.get("/requests/pending-requests/fetch");case 4:t=e.sent,o(t.data),d(null),e.next=13;break;case 9:e.prev=9,e.t0=e.catch(0),console.error("Failed to fetch pending tests count",e.t0),d("No Approval Request Found.");case 13:return e.prev=13,s(!1),e.finish(13);case 16:case"end":return e.stop()}}),e,null,[[0,9,13,16]])})));return function(){return e.apply(this,arguments)}}();return(0,e.useEffect)((function(){f();var e=setInterval(f,6e4);return function(){return clearInterval(e)}}),[]),a?(0,l.jsx)("div",{className:"flex justify-center items-center mt-8",children:(0,l.jsx)(pi,{})}):c?(0,l.jsx)(Wi,{color:"error",variant:"body1",children:c}):r&&0!==r.length?(0,l.jsx)(Ub,{component:Di,className:"mt-4",children:(0,l.jsxs)(Zb,{children:[(0,l.jsx)(aw,{children:(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{children:"Sample ID"}),(0,l.jsx)(yw,{children:"Name"}),(0,l.jsx)(yw,{children:"MRN"}),(0,l.jsx)(yw,{children:"Age"}),(0,l.jsx)(yw,{children:"Gender"}),(0,l.jsx)(yw,{children:"Test Type"}),(0,l.jsx)(yw,{children:"Created At"}),(0,l.jsx)(yw,{children:"Action"})]})}),(0,l.jsx)(Ow,{children:r.map((function(e){return(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{children:e.sampleId}),(0,l.jsx)(yw,{children:e.name}),(0,l.jsx)(yw,{children:e.mrn}),(0,l.jsx)(yw,{children:e.age}),(0,l.jsx)(yw,{children:e.gender}),(0,l.jsx)(yw,{children:e.testType}),(0,l.jsx)(yw,{children:new Date(e.createdAt).toLocaleString()}),(0,l.jsx)(yw,{children:(0,l.jsx)(Ef,{variant:"outlined",size:"small",className:"cursor-pointer",startIcon:(0,l.jsx)(Jj,{}),onClick:function(){return t("/pending-tests/".concat(e.sampleId))},children:"View Detail"})})]},e.id)}))})]})}):(0,l.jsx)(Wi,{variant:"h6",align:"center",className:"mt-8 text-gray-500",children:"No Pending Test Requests"})},tk=function(){return(0,l.jsxs)(Ri,{children:[(0,l.jsx)(au,{active:"pendingTests"}),(0,l.jsx)(yo,{})]})},nk={"Xpert MTB | RIF Ultra":2,"Truenat MTB | RIF Dx":2,"Xpert MTB | XDR Assay":2,AFB:2,"LF-LAM":2,Culture:1,PDST:1,"Xpert HIV-1 Qual Assay (EID)":2,"Xpert HIV-1 Viral Load (VL)":2},rk=function(e){return e in nk},ok=function(){var t,n=po(),r=fo(),o=(new Date).getFullYear(),i=o+10,a=Ne((0,e.useState)(!1),2),s=a[0],u=a[1],c=Ne((0,e.useState)({selectedType:"TB",selectedSubType:"",selectedYear:o,selectedRound:null}),2),d=c[0],f=c[1],p=function(e,t){f((function(n){return Rp(Rp({},n),{},Ee({},e,t),"selectedType"===e||"selectedSubType"===e?{selectedRound:null}:{})}))},h=(0,e.useMemo)((function(){switch(d.selectedType){case"TB":return["Xpert MTB | RIF Ultra","Truenat MTB | RIF Dx","Xpert MTB | XDR Assay","AFB","LF-LAM","Culture","PDST"];case"HIV":return["Xpert HIV-1 Qual Assay (EID)","Xpert HIV-1 Viral Load (VL)"];default:return[]}}),[d.selectedType]),m=(0,e.useCallback)((function(){var e=d.selectedType,t=d.selectedSubType,r=d.selectedRound,o=d.selectedYear;if(e&&rk(t)&&r){var i=e.toLowerCase();u(!1),n("/eqa/report/".concat(i,"/").concat(encodeURIComponent(t),"/").concat(o,"/").concat(r))}}),[n,d.selectedType,d.selectedSubType,d.selectedRound,d.selectedYear]),v=(0,e.useMemo)((function(){return!r.pathname.match(/\/eqa\/report\/[a-z]+/i)}),[r.pathname]);return(0,l.jsxs)(Ri,{children:[(0,l.jsx)(au,{active:"eqa"}),(0,l.jsxs)(Ir,{bgcolor:"#121212cc",sx:{p:2,flexGrow:1,overflowY:"auto"},children:[v&&(0,l.jsx)(Ir,{display:"flex",gap:2,mb:2,children:(0,l.jsx)(mc,{sx:{bgcolor:"#1c2526",color:"white"},children:(0,l.jsxs)(RS,{children:[(0,l.jsx)(Wi,{variant:"h6",children:"EQA Summary Report"}),(0,l.jsx)(Wi,{variant:"body2",sx:{mb:2},children:"EQA Summary report for TB, HIV."}),(0,l.jsx)(Ef,{variant:"contained",color:"primary",onClick:function(){return u(!0)},children:"Create Report"})]})})}),(0,l.jsx)(yo,{}),(0,l.jsxs)(md,{open:s,onClose:function(){return u(!1)},children:[(0,l.jsx)(wd,{children:"Select Report Category"}),(0,l.jsxs)(Rd,{children:[(0,l.jsxs)(Dp,{fullWidth:!0,size:"small",sx:{my:2},children:[(0,l.jsx)(Up,{children:"Category"}),(0,l.jsxs)(Hm,{value:d.selectedType,onChange:function(e){return p("selectedType",e.target.value)},label:"Category",children:[(0,l.jsx)(Zm,{value:"TB",children:"TB"}),(0,l.jsx)(Zm,{value:"HIV",children:"HIV"})]})]}),(0,l.jsx)(Dp,{fullWidth:!0,size:"small",sx:{my:2},children:(0,l.jsx)(dv,{label:"Year",type:"number",value:null!==(t=d.selectedYear)&&void 0!==t?t:"",onChange:function(e){var t=e.target.value;if(""!==t){var n=Number(t);isNaN(n)||p("selectedYear",n)}else p("selectedYear",0)},onBlur:function(){var e,t=null!==(e=d.selectedYear)&&void 0!==e?e:o;t<2e3&&(t=o),t>i&&(t=o),p("selectedYear",t)},inputProps:{min:2e3,max:i}})}),d.selectedType&&(0,l.jsxs)(Dp,{fullWidth:!0,size:"small",sx:{my:2},children:[(0,l.jsx)(Up,{id:"test-type-label",children:"Test Type"}),(0,l.jsx)(Hm,{labelId:"test-type-label",value:d.selectedSubType,onChange:function(e){return p("selectedSubType",e.target.value)},label:"Test Type",children:h.map((function(e){return(0,l.jsx)(Zm,{value:e,children:e},e)}))})]}),rk(d.selectedSubType)&&(0,l.jsxs)(Dp,{component:"fieldset",sx:{width:"100%",maxWidth:400},children:[(0,l.jsx)(Wi,{sx:{fontSize:"1rem",fontWeight:600,color:"white",mb:1},children:"Report Round"}),(0,l.jsx)(Id,{row:!0,children:Array.from({length:nk[d.selectedSubType]}).map((function(e,t){var n=t+1;return(0,l.jsx)(Gd,{control:(0,l.jsx)(Kw,{checked:d.selectedRound===n,onChange:function(){return p("selectedRound",d.selectedRound===n?null:n)},sx:{color:"white","&.Mui-checked":{color:"#d05286"}}}),label:"Round ".concat(n)},n)}))})]})]}),(0,l.jsxs)(bf,{children:[(0,l.jsx)(Ef,{onClick:function(){return u(!1)},children:"Cancel"}),(0,l.jsx)(Ef,{disabled:!d.selectedSubType||!d.selectedYear||!d.selectedRound,onClick:m,variant:"contained",children:"Confirm"})]})]})]})]})},ik={flex:1,"& input":{color:"white"},"& input::-webkit-calendar-picker-indicator":{filter:"invert(1)",cursor:"pointer"},"& .MuiOutlinedInput-root":{"& fieldset":{borderColor:"#777"},"&:hover fieldset":{borderColor:"#d05286"},"&.Mui-focused fieldset":{borderColor:"#d05286"}}},ak=function(t){var n=t.roundData,r=t.reportTestTypeData,o=(t.viewFeedbackHandler,t.items),i=t.handleReportTestTypeDataChange,a=e.useMemo((function(){return[{label:"Sample Received Date",key:"sampleReceivedDate"},{label:"Result Reported Date",key:"resultReportedDate"}]}),[]);return(0,l.jsx)(Ir,{sx:{py:2},children:(0,l.jsxs)(Ci,{container:!0,spacing:2,sx:{backgroundColor:"#1e1e1e",borderRadius:2,px:{xs:2,sm:4},py:{xs:2,sm:3},color:"white",flexWrap:"wrap",flexDirection:{xs:"column",sm:"column",md:"row",lg:"row"},"@media (max-width:1032px)":{flexDirection:"column"}},children:[(0,l.jsx)(Ci,{item:!0,xs:12,sm:12,md:"auto",sx:{flex:{xs:"1 1 100%",sm:"1 1 100%",md:"1 1 45%"},minWidth:300,display:"flex",justifyContent:{xs:"center",sm:"flex-start",md:"flex-start"},mb:{xs:2,sm:2,md:0}},children:(0,l.jsxs)(Dp,{component:"fieldset",sx:{width:"100%",maxWidth:400},children:[(0,l.jsx)(Wi,{sx:{fontSize:"1rem",fontWeight:600,color:"white",mb:1,textAlign:{xs:"center",sm:"left",md:"left"}},children:"Report Round"}),(0,l.jsx)(Id,{sx:{display:"flex",flexDirection:{xs:"column",sm:"column",md:"row"},justifyContent:{xs:"center",sm:"flex-start",md:"flex-start"},flexWrap:"wrap",gap:1},children:Rr(Array(o)).map((function(e,t){var r=t+1;return(0,l.jsx)(Gd,{control:(0,l.jsx)(Kw,{required:!0,checked:n===r,disabled:!0,sx:{color:"white","&.Mui-checked":{color:"#d05286"}}}),label:"Round ".concat(r),sx:{width:{xs:"100%",sm:"100%",md:"auto"}}},r)}))})]})}),(0,l.jsx)(Ci,{item:!0,xs:12,sm:12,md:"auto",sx:{flex:{xs:"1 1 100%",sm:"1 1 100%",md:"1 1 45%"},minWidth:300,display:"flex",justifyContent:{xs:"center",sm:"flex-end",md:"flex-end"},mt:{xs:2,sm:0}},children:(0,l.jsxs)(Ir,{sx:{color:"white",width:"100%",display:"flex",flexDirection:{xs:"column",sm:"column",md:"row"},gap:2,justifyContent:{xs:"center",sm:"flex-start",md:"flex-end"},alignItems:{xs:"stretch",sm:"flex-start",md:"center"},flexWrap:{xs:"wrap",sm:"wrap",md:"nowrap"}},children:[a.map((function(e){return(0,l.jsxs)(Ir,{sx:{display:"flex",flexDirection:"column",alignItems:{xs:"stretch",sm:"stretch",md:"center"},width:{xs:"100%",sm:"100%",md:"auto"},minWidth:{md:180}},children:[(0,l.jsx)(Wi,{sx:{mb:1,fontSize:"0.9rem",textAlign:{xs:"left",sm:"left",md:"center"}},children:e.label}),(0,l.jsx)(dv,{required:!0,type:"date",size:"small",value:r[e.key],onChange:function(t){return i(e.key,t.target.value)},sx:Rp(Rp({},ik),{},{width:"100%"})})]},e.key)})),(0,l.jsxs)(Ir,{sx:{display:"flex",flexDirection:"column",alignItems:{xs:"stretch",sm:"stretch",md:"center"},width:{xs:"100%",sm:"100%",md:"auto"},minWidth:{md:180}},children:[(0,l.jsx)(Wi,{sx:{mb:1,fontSize:"0.9rem",textAlign:{xs:"left",sm:"left",md:"center"}},children:"Feedback Sent Date"}),(0,l.jsx)(dv,{required:!0,type:"date",size:"small",value:r.feedbackSentDate,disabled:!0,sx:{flex:1,"& input":{color:"white"},width:"100%"}})]})]})})]})})},lk=e.memo(ak),sk={fontSize:"0.75rem"},uk=[{field:"probeErpoB1",header:"rpoB1"},{field:"probeDrpoB2",header:"rpoB2"},{field:"probeCrpoB3",header:"rpoB3"},{field:"probeBrpoB4",header:"rpoB4"},{field:"probeArpoIS1081_IS6110",header:"IS1081-IS6110"},{field:"SPC",header:"SPC"}],ck={N:"MTB not detected (N)",T:"MTB Detected, Rif resistance not detected (T)",RR:"MTB detected, RIF resistance detected (RR)",TI:"MTB detected, RIF resistance indeterminate (TI)",TT:"MTB detected Trace, RIF resistance indeterminate (TT)",E:"Error (E)",I:"Invalid (I)",NR:"No Result (NR)"};var dk=function(t){t.subType;var n=t.roundData,r=t.reportTestTypeData,o=t.viewFeedbackHandler,i=t.handleReportTestTypeDataChange,a=(0,e.useMemo)((function(){return Object.entries(ck).map((function(e){var t=Ne(e,2);return{key:t[0],value:t[1]}}))}),[]);return(0,l.jsx)(Ir,{children:(0,l.jsxs)(Ir,{sx:{padding:3,color:"white"},children:[(0,l.jsxs)(Wi,{variant:"h5",component:"h5",gutterBottom:!0,sx:{color:"white",textTransform:"uppercase"},children:["(Round ",n,") Xpert MTB | RIF Ultra Assay"]}),(0,l.jsxs)(Ir,{sx:{my:3,backgroundColor:"#1e1e1e",borderRadius:2,px:4,py:3,color:"white"},children:[(0,l.jsx)(lk,{items:2,viewFeedbackHandler:o,roundData:n,reportTestTypeData:r,handleReportTestTypeDataChange:i}),(0,l.jsx)(Ub,{component:Di,children:(0,l.jsxs)(Zb,{size:"small",children:[(0,l.jsxs)(aw,{children:[(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{sx:sk,rowSpan:2,children:"Sample"}),(0,l.jsx)(yw,{sx:sk,rowSpan:2,children:"Result"}),(0,l.jsx)(yw,{sx:sk,align:"center",colSpan:uk.length,children:"Ct Value"})]}),(0,l.jsx)(fw,{children:uk.map((function(e){var t=e.field,n=e.header;return(0,l.jsx)(yw,{sx:sk,align:"center",children:n},t)}))})]}),(0,l.jsx)(Ow,{children:Object.values(r.sampleData).map((function(e,t){var n;return(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{children:e.sample}),(0,l.jsx)(yw,{children:(0,l.jsx)(Dp,{fullWidth:!0,size:"small",children:(0,l.jsx)(Hm,{value:(null===(n=e.result)||void 0===n?void 0:n.key)||"",required:!0,displayEmpty:!0,sx:{minWidth:150,maxWidth:200},renderValue:function(e){var t=a.find((function(t){return t.key===e}));return t&&"string"===typeof t.value?t.value.length>20?t.value.substring(0,20)+"...":t.value:""},onChange:function(t){var n,r,o,l=a.find((function(e){return e.key===t.target.value}));l&&(n=e.sample,r=l.key,o=l.value,i("sampleData",(function(e){return Rp(Rp({},e),{},Ee({},n,Rp(Rp({},e[n]),{},{result:{key:r,value:o}})))})))},children:a.map((function(e){return(0,l.jsx)(Zm,{value:e.key,sx:{whiteSpace:"normal",overflow:"hidden",textOverflow:"ellipsis"},children:e.value},e.key)}))})})}),uk.map((function(t){var n,r,o=t.field;return(0,l.jsx)(yw,{children:(0,l.jsx)(dv,{required:!0,size:"small",type:"number",value:null!==(n=null===(r=e.mtbUltraCycleThresholds)||void 0===r?void 0:r[o])&&void 0!==n?n:"",onChange:function(t){return function(e,t,n){var r=""===n?"":Number(n);(""===r||!isNaN(r)&&r>=0)&&i("sampleData",(function(n){var o;return Rp(Rp({},n),{},Ee({},e,Rp(Rp({},n[e]),{},{mtbUltraCycleThresholds:Rp(Rp({},null===(o=n[e])||void 0===o?void 0:o.mtbUltraCycleThresholds),{},Ee({},t,r))})))}))}(e.sample,o,t.target.value)},inputProps:{min:0,step:.1},fullWidth:!0})},o)}))]},e.sample||t)}))})]})})]})]})})},fk={fontSize:"0.75rem"},pk={N:"MTB not detected (N)",T:"MTB Detected, Rif resistance not detected (T)",RR:"MTB detected, RIF resistance detected (RR)",TI:"MTB detected, RIF resistance indeterminate (TI)",E:"Error (E)",I:"Invalid (I)"};var hk=function(t){t.subType;var n=t.viewFeedbackHandler,r=t.roundData,o=t.reportTestTypeData,i=t.handleReportTestTypeDataChange,a=(0,e.useMemo)((function(){return Object.entries(pk).map((function(e){var t=Ne(e,2);return{key:t[0],value:t[1]}}))}),[]);return(0,l.jsx)(Ir,{children:(0,l.jsxs)(Ir,{sx:{padding:3,color:"white"},children:[(0,l.jsxs)(Wi,{variant:"h5",component:"h5",gutterBottom:!0,sx:{color:"white",textTransform:"uppercase"},children:["(Round ",r,") Truenat MTB | RIF Dx"]}),(0,l.jsxs)(Ir,{sx:{my:3,backgroundColor:"#1e1e1e",borderRadius:2,px:4,py:3,color:"white"},children:[(0,l.jsx)(lk,{items:2,viewFeedbackHandler:n,roundData:r,reportTestTypeData:o,handleReportTestTypeDataChange:i}),(0,l.jsx)(Ub,{component:Di,children:(0,l.jsxs)(Zb,{size:"small",children:[(0,l.jsx)(aw,{children:(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{sx:fk,rowSpan:2,children:"Sample"}),(0,l.jsx)(yw,{sx:fk,rowSpan:2,children:"Result"})]})}),(0,l.jsx)(Ow,{children:Object.values(o.sampleData).map((function(e,t){var n;return(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{children:e.sample}),(0,l.jsx)(yw,{children:(0,l.jsx)(Dp,{fullWidth:!0,size:"small",children:(0,l.jsx)(Hm,{value:(null===(n=e.result)||void 0===n?void 0:n.key)||"",required:!0,displayEmpty:!0,sx:{minWidth:150,maxWidth:200},renderValue:function(e){var t=a.find((function(t){return t.key===e}));return t&&"string"===typeof t.value?t.value.length>20?t.value.substring(0,20)+"...":t.value:""},onChange:function(t){var n,r,o,l=a.find((function(e){return e.key===t.target.value}));l&&(n=e.sample,r=l.key,o=l.value,i("sampleData",(function(e){return Rp(Rp({},e),{},Ee({},n,Rp(Rp({},e[n]),{},{result:{key:r,value:o}})))})))},children:a.map((function(e){return(0,l.jsx)(Zm,{value:e.key,sx:{whiteSpace:"normal",overflow:"hidden",textOverflow:"ellipsis"},children:e.value},e.key)}))})})})]},e.sample||t)}))})]})})]})]})})},mk=Ml((0,l.jsx)("path",{d:"M13 7h-2v4H7v2h4v4h2v-4h4v-2h-4V7zm-1-5C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"}),"AddCircleOutline"),vk={fontSize:"0.75rem"},gk=[{key:"inhA_melt",value:"inhA-melt"},{key:"katG_melt",value:"katG-melt"},{key:"fabG1_melt",value:"fabG1-melt"},{key:"ahpC_melt",value:"ahpC-melt"},{key:"gyrA1_melt",value:"gyrA1-melt"},{key:"gyrA2_melt",value:"gyrA2-melt"},{key:"gyrA3_melt",value:"gyrA3-melt"},{key:"gyrB2_melt",value:"gyrB2-melt"},{key:"rrs_melt",value:"rrs-melt"},{key:"eis_melt",value:"eis-melt"},{key:"inhA_mut_melt",value:"inhA-mut melt"},{key:"katG_mut_melt",value:"katG-mut melt"},{key:"fabG1_mut_melt",value:"fabG1-mut melt"},{key:"ahpC_mut_melt",value:"ahpC-mut melt"},{key:"gyrA1_mutA_melt",value:"gyrA1-mutA melt"},{key:"gyrA1_mutB_melt",value:"gyrA1-mutB melt"},{key:"gyrA1_mutC_melt",value:"gyrA1-mutC melt"},{key:"gyrA2_mutA_melt",value:"gyrA2-mutA melt"},{key:"gyrA2_mutB_melt",value:"gyrA2-mutB melt"},{key:"gyrA2_mutC_melt",value:"gyrA2-mutC melt"},{key:"gyrA3_mutA_melt",value:"gyrA3-mutA melt"},{key:"gyrA3_mutB_melt",value:"gyrA3-mutB melt"},{key:"gyrA3_mutC_melt",value:"gyrA3-mutC melt"},{key:"gyrB2_mut_melt",value:"gyrB2-mut melt"},{key:"rrs_mut_melt",value:"rrs-mut melt"},{key:"eis_mutA_melt",value:"eis-mutA melt"},{key:"eis_mutB_melt",value:"eis-mutB melt"}],yk=[{key:"mtb",value:"MTB"},{key:"inh_res",value:"INH res"},{key:"low_inh_res",value:"Low INH res"},{key:"low_fql_res",value:"Low FQL res"},{key:"fql_resistance",value:"FQL resistance"},{key:"amk_rests",value:"AMK rests"},{key:"kan",value:"KAN"},{key:"can",value:"CAN"},{key:"eth",value:"ETH"}];var xk=function(t){t.subType;var n=t.roundData,r=t.reportTestTypeData,o=t.viewFeedbackHandler,i=t.handleReportTestTypeDataChange,a=Ne((0,e.useState)(!1),2),s=a[0],u=a[1],c=(0,e.useCallback)((function(){u(!1)}),[]);return(0,l.jsxs)(Ir,{children:[(0,l.jsxs)(Ir,{sx:{padding:3,color:"white"},children:[(0,l.jsxs)(Wi,{variant:"h5",component:"h5",gutterBottom:!0,sx:{color:"white",textTransform:"uppercase"},children:["(Round ",n,") Xpert MTB | XDR Assay"]}),(0,l.jsxs)(Ir,{sx:{my:3,backgroundColor:"#1e1e1e",borderRadius:2,px:4,py:3,color:"white"},children:[(0,l.jsx)(lk,{items:2,viewFeedbackHandler:o,roundData:n,reportTestTypeData:r,handleReportTestTypeDataChange:i}),(0,l.jsx)(Ub,{component:Di,children:(0,l.jsxs)(Zb,{size:"small",children:[(0,l.jsx)(aw,{children:(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{sx:vk,children:"Sample"}),(0,l.jsx)(yw,{sx:vk,children:"Result"}),(0,l.jsx)(yw,{sx:vk,children:"Detected"}),(0,l.jsx)(yw,{sx:vk,children:"Not Detected"})]})}),Object.values(r.sampleData).map((function(e,t){var n=yk;return(0,l.jsxs)(Ow,{children:[n.map((function(t,r){var o=t.key,i=t.value;return(0,l.jsxs)(fw,{children:[0===r&&(0,l.jsx)(yw,{rowSpan:n.length+1,sx:{width:80,verticalAlign:"top",textAlign:"center"},children:(0,l.jsx)(Ir,{sx:{width:45,height:45,borderRadius:"50%",backgroundColor:"primary.main",color:"white",display:"flex",alignItems:"center",justifyContent:"center",mx:"auto",fontWeight:"bold"},children:e.sample})}),(0,l.jsx)(yw,{children:i}),(0,l.jsx)(yw,{children:(0,l.jsx)(Kw,{color:"primary"})}),(0,l.jsx)(yw,{children:(0,l.jsx)(Kw,{color:"primary"})}),(0,l.jsx)(yw,{})]},o)})),(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{colSpan:4,children:(0,l.jsxs)(Ef,{variant:"contained",color:"primary",startIcon:(0,l.jsx)(mk,{}),onClick:function(){u(!0)},sx:{mt:1,borderStyle:"dashed",textTransform:"none",fontWeight:"bold"},children:["Add ",e.sample," Multi Peak"]})}),(0,l.jsx)(yw,{})]})]},t)}))]})})]})]}),(0,l.jsx)(cc,{open:s,onClose:c,"aria-labelledby":"view-feedback","aria-describedby":"modal to view report feedback",children:(0,l.jsxs)(Ir,{sx:{border:"1px solid #000",position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",width:"80vw",maxHeight:"80vh",bgcolor:"background.paper",overflowY:"auto",p:4,borderRadius:2},children:[(0,l.jsx)(Ef,{onClick:c,variant:"contained",color:"primary",sx:{position:"absolute",top:16,right:16,zIndex:1201},children:"Close"}),(0,l.jsx)(Wi,{id:"simple-modal-title",variant:"h6",component:"h2",align:"center",sx:{mb:2},children:"Melt Peak Temprature"}),(0,l.jsx)(Ci,{container:!0,spacing:2,children:gk.map((function(e,t){return(0,l.jsx)(Ci,{item:!0,xs:12,sm:6,md:4,lg:2.4,sx:{flexBasis:{lg:"20%"}},children:(0,l.jsxs)(Ir,{sx:{bgcolor:"background.paper",borderRadius:3,boxShadow:3,p:2,display:"flex",flexDirection:"column",gap:1,transition:"transform 0.2s","&:hover":{transform:"translateY(-2px)",boxShadow:6}},children:[(0,l.jsxs)(Wi,{sx:{fontWeight:600,fontSize:"0.9rem",color:"text.primary"},children:[t+1,". ",e.value]}),(0,l.jsx)(dv,{fullWidth:!0,type:"number",size:"small",variant:"outlined"})]})},e.key)}))})]})})]})},bk={fontSize:"0.75rem"},wk={Negative:"Negative",Scanty:"Scanty","+1":"+1","+2":"+2","+3":"+3"};var Sk=function(t){t.subType;var n=t.roundData,r=t.viewFeedbackHandler,o=t.reportTestTypeData,i=t.handleReportTestTypeDataChange,a=(0,e.useMemo)((function(){return Object.entries(wk).map((function(e){var t=Ne(e,2);return{key:t[0],value:t[1]}}))}),[]);return(0,l.jsx)(Ir,{children:(0,l.jsxs)(Ir,{sx:{padding:3,color:"white"},children:[(0,l.jsxs)(Wi,{variant:"h5",component:"h5",gutterBottom:!0,sx:{color:"white",textTransform:"uppercase"},children:["(Round ",n,") AFB"]}),(0,l.jsxs)(Ir,{sx:{my:3,backgroundColor:"#1e1e1e",borderRadius:2,px:4,py:3,color:"white"},children:[(0,l.jsx)(lk,{items:2,viewFeedbackHandler:r,roundData:n,reportTestTypeData:o,handleReportTestTypeDataChange:i}),(0,l.jsx)(Ub,{component:Di,children:(0,l.jsxs)(Zb,{size:"small",children:[(0,l.jsx)(aw,{children:(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{sx:bk,rowSpan:2,children:"Sample"}),(0,l.jsx)(yw,{sx:bk,rowSpan:2,children:"Method"}),(0,l.jsx)(yw,{sx:bk,rowSpan:2,children:"Result"})]})}),(0,l.jsx)(Ow,{children:Object.values(o.sampleData).map((function(e,t){var n;return(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{children:e.sample}),(0,l.jsx)(yw,{children:(0,l.jsx)(Dp,{fullWidth:!0,size:"small",children:(0,l.jsxs)(Hm,{value:(null===e||void 0===e?void 0:e.method)||"",required:!0,onChange:function(t){var n=t.target.value;!function(e,t){i("sampleData",(function(n){return Rp(Rp({},n),{},Ee({},e,Rp(Rp({},n[e]),{},{method:t})))}))}(e.sample,n)},children:[(0,l.jsx)(Zm,{value:"ZN",children:"ZN"}),(0,l.jsx)(Zm,{value:"FM",children:"FM"})]})})}),(0,l.jsx)(yw,{children:(0,l.jsx)(Dp,{fullWidth:!0,size:"small",children:(0,l.jsx)(Hm,{value:(null===(n=e.result)||void 0===n?void 0:n.key)||"",required:!0,displayEmpty:!0,sx:{minWidth:150,maxWidth:200},renderValue:function(e){var t=a.find((function(t){return t.key===e}));return t&&"string"===typeof t.value?t.value.length>20?t.value.substring(0,20)+"...":t.value:""},onChange:function(t){var n,r,o,l=a.find((function(e){return e.key===t.target.value}));l&&(n=e.sample,r=l.key,o=l.value,i("sampleData",(function(e){return Rp(Rp({},e),{},Ee({},n,Rp(Rp({},e[n]),{},{result:{key:r,value:o}})))})))},children:a.map((function(e){return(0,l.jsx)(Zm,{value:e.key,sx:{whiteSpace:"normal",overflow:"hidden",textOverflow:"ellipsis"},children:e.value},e.key)}))})})})]},e.sample||t)}))})]})})]})]})})},jk={fontSize:"0.75rem"},kk={Negative:"Negative",Positive:"Positive"};var Ck=function(t){t.subType;var n=t.roundData,r=t.viewFeedbackHandler,o=t.reportTestTypeData,i=t.handleReportTestTypeDataChange,a=(0,e.useMemo)((function(){return Object.entries(kk).map((function(e){var t=Ne(e,2);return{key:t[0],value:t[1]}}))}),[]);return(0,l.jsx)(Ir,{children:(0,l.jsxs)(Ir,{sx:{padding:3,color:"white"},children:[(0,l.jsxs)(Wi,{variant:"h5",component:"h5",gutterBottom:!0,sx:{color:"white",textTransform:"uppercase"},children:["(Round ",n,") LF-LAM"]}),(0,l.jsxs)(Ir,{sx:{my:3,backgroundColor:"#1e1e1e",borderRadius:2,px:4,py:3,color:"white"},children:[(0,l.jsx)(lk,{items:2,viewFeedbackHandler:r,roundData:n,reportTestTypeData:o,handleReportTestTypeDataChange:i}),(0,l.jsx)(Ub,{component:Di,children:(0,l.jsxs)(Zb,{size:"small",children:[(0,l.jsx)(aw,{children:(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{sx:jk,rowSpan:2,children:"Sample"}),(0,l.jsx)(yw,{sx:jk,rowSpan:2,children:"Result"})]})}),(0,l.jsx)(Ow,{children:Object.values(o.sampleData).map((function(e,t){var n;return(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{children:e.sample}),(0,l.jsx)(yw,{children:(0,l.jsx)(Dp,{fullWidth:!0,size:"small",children:(0,l.jsx)(Hm,{value:(null===(n=e.result)||void 0===n?void 0:n.key)||"",required:!0,displayEmpty:!0,sx:{minWidth:150,maxWidth:200},renderValue:function(e){var t=a.find((function(t){return t.key===e}));return t&&"string"===typeof t.value?t.value.length>20?t.value.substring(0,20)+"...":t.value:""},onChange:function(t){var n,r,o,l=a.find((function(e){return e.key===t.target.value}));l&&(n=e.sample,r=l.key,o=l.value,i("sampleData",(function(e){return Rp(Rp({},e),{},Ee({},n,Rp(Rp({},e[n]),{},{result:{key:r,value:o}})))})))},children:a.map((function(e){return(0,l.jsx)(Zm,{value:e.key,sx:{whiteSpace:"normal",overflow:"hidden",textOverflow:"ellipsis"},children:e.value},e.key)}))})})})]},e.sample||t)}))})]})})]})]})})},Rk={fontSize:"0.75rem"},Tk={MTBT:"MTBT",NTM:"NTM",MTB_Negative:"MTB Negative",Contamination:"Contamination"};var Ok=function(t){t.subType;var n=t.roundData,r=t.viewFeedbackHandler,o=t.reportTestTypeData,i=t.handleReportTestTypeDataChange,a=(0,e.useMemo)((function(){return Object.entries(Tk).map((function(e){var t=Ne(e,2);return{key:t[0],value:t[1]}}))}),[]);return(0,l.jsx)(Ir,{children:(0,l.jsxs)(Ir,{sx:{padding:3,color:"white"},children:[(0,l.jsxs)(Wi,{variant:"h5",component:"h5",gutterBottom:!0,sx:{color:"white",textTransform:"uppercase"},children:["(Round ",n,") Culture"]}),(0,l.jsxs)(Ir,{sx:{my:3,backgroundColor:"#1e1e1e",borderRadius:2,px:4,py:3,color:"white"},children:[(0,l.jsx)(lk,{items:1,viewFeedbackHandler:r,roundData:n,reportTestTypeData:o,handleReportTestTypeDataChange:i}),(0,l.jsx)(Ub,{component:Di,children:(0,l.jsxs)(Zb,{size:"small",children:[(0,l.jsx)(aw,{children:(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{sx:Rk,rowSpan:2,children:"Sample"}),(0,l.jsx)(yw,{sx:Rk,rowSpan:2,children:"Result"})]})}),(0,l.jsx)(Ow,{children:Object.values(o.sampleData).map((function(e,t){var n;return(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{children:"CUL ".concat(t+1)}),(0,l.jsx)(yw,{children:(0,l.jsx)(Dp,{fullWidth:!0,size:"small",children:(0,l.jsx)(Hm,{value:(null===(n=e.result)||void 0===n?void 0:n.key)||"",required:!0,displayEmpty:!0,sx:{minWidth:150,maxWidth:200},renderValue:function(e){var t=a.find((function(t){return t.key===e}));return t&&"string"===typeof t.value?t.value.length>20?t.value.substring(0,20)+"...":t.value:""},onChange:function(t){var n,r,o,l=a.find((function(e){return e.key===t.target.value}));l&&(n=e.sample,r=l.key,o=l.value,i("sampleData",(function(e){return Rp(Rp({},e),{},Ee({},n,Rp(Rp({},e[n]),{},{result:{key:r,value:o}})))})))},children:a.map((function(e){return(0,l.jsx)(Zm,{value:e.key,sx:{whiteSpace:"normal",overflow:"hidden",textOverflow:"ellipsis"},children:e.value},e.key)}))})})})]},e.sample)}))})]})})]})]})})},Pk=Ml((0,l.jsx)("path",{d:"m14.06 9.02.92.92L5.92 19H5v-.92l9.06-9.06M17.66 3c-.25 0-.51.1-.7.29l-1.83 1.83 3.75 3.75 1.83-1.83c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.2-.2-.45-.29-.71-.29zm-3.6 3.19L3 17.25V21h3.75L17.81 9.94l-3.75-3.75z"}),"EditOutlined"),Ek=[{key:"INH",value:"INH 0.1 ug/ml"},{key:"INH_High",value:"INH High 0.4 ug/ml"},{key:"RMP",value:"RMP 0.5 ug/ml"},{key:"RMP_High",value:"RMP 1.0 ug/ml"},{key:"STM",value:"STM 1.0 ug/ml"},{key:"EMB",value:"EMB 5.0 ug/ml"},{key:"PZA",value:"PZA 100 ug/ml"}],Mk=[{key:"OFL",value:"OFL 2.0 ug/ml"},{key:"LFX",value:"LFX 1.0 ug/ml"},{key:"MFX_Low",value:"MFX 0.25 ug/ml"},{key:"MFX_High",value:"MFX 1.0 ug/ml"},{key:"AM",value:"AM 1.0 ug/ml"},{key:"BDQ",value:"BDQ 1.0 ug/ml"},{key:"DLM",value:"DLM 0.06 ug/ml"},{key:"CFZ",value:"CFZ 1.0 ug/ml"},{key:"LZD",value:"LZD 1.0 ug/ml"},{key:"Eto",value:"Eto 5.0 ug/ml"},{key:"PA",value:"PA"}],_k=(0,e.memo)((function(e){var t=e.drug,n=e.selected,r=e.sampleKey,o=e.handleChange;return(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{children:t.value}),(0,l.jsx)(yw,{children:(0,l.jsx)(Dp,{size:"small",fullWidth:!0,children:(0,l.jsxs)(Hm,{value:n.pdst,onChange:function(e){return o(r,t.key,"pdst",e.target.value)},children:[(0,l.jsx)(Zm,{value:"S",children:"S"}),(0,l.jsx)(Zm,{value:"R",children:"R"}),(0,l.jsx)(Zm,{value:"C",children:"C"}),(0,l.jsx)(Zm,{value:"ND",children:"ND"})]})})}),(0,l.jsx)(yw,{children:(0,l.jsx)(Dp,{size:"small",fullWidth:!0,children:(0,l.jsxs)(Hm,{value:n.tNGS,onChange:function(e){return o(r,t.key,"tNGS",e.target.value)},children:[(0,l.jsx)(Zm,{value:"S",children:"S"}),(0,l.jsx)(Zm,{value:"R",children:"R"}),(0,l.jsx)(Zm,{value:"C",children:"C"}),(0,l.jsx)(Zm,{value:"ND",children:"ND"})]})})})]})}));var Dk=function(t){t.subType;var n=t.roundData,r=t.viewFeedbackHandler,o=t.reportTestTypeData,i=t.handleReportTestTypeDataChange,a=Ne((0,e.useState)({open:!1,type:0}),2),s=a[0],u=a[1],c=function(e,t){return u({open:!0,type:e,sampleKey:t})},d=(0,e.useCallback)((function(){return u({open:!1,type:0})}),[]),f=(0,e.useCallback)((function(e,t,n,r){i("sampleData",(function(o){var i,a,l=o[e];return Rp(Rp({},o),{},Ee({},e,Rp(Rp({},l),{},{pdstDrugConcentrations:Rp(Rp({},null===l||void 0===l?void 0:l.pdstDrugConcentrations),{},Ee({},t,Rp(Rp({},null!==(i=null===l||void 0===l||null===(a=l.pdstDrugConcentrations)||void 0===a?void 0:a[t])&&void 0!==i?i:{pdst:"",tNGS:""}),{},Ee({},n,r))))})))}))}),[i]),p=1===s.type?Ek:Mk,h=s.sampleKey&&o.sampleData[s.sampleKey],m=((0,e.useCallback)((function(e,t){var n,r=null!==(n=t.pdstDrugConcentrations)&&void 0!==n?n:{};return e.every((function(e){var t=e.key,n=r[t];return n&&""!==n.pdst&&""!==n.tNGS}))}),[]),function(e,t){var n,r=null!==(n=t.pdstDrugConcentrations)&&void 0!==n?n:{};return e.some((function(e){var t=e.key,n=r[t];return n&&(""!==n.pdst||""!==n.tNGS)}))});return(0,l.jsxs)(Ir,{children:[(0,l.jsxs)(Ir,{sx:{padding:3,color:"white"},children:[(0,l.jsxs)(Wi,{variant:"h5",gutterBottom:!0,sx:{color:"white",textTransform:"uppercase"},children:["(Round ",n,") Phenotypic DST"]}),(0,l.jsxs)(Ir,{sx:{my:3,backgroundColor:"#1e1e1e",borderRadius:2,px:4,py:3,color:"white"},children:[(0,l.jsx)(lk,{items:1,viewFeedbackHandler:r,roundData:n,reportTestTypeData:o,handleReportTestTypeDataChange:i}),(0,l.jsx)(Ub,{component:Di,children:(0,l.jsxs)(Zb,{size:"small",children:[(0,l.jsx)(aw,{children:(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{children:"Sample"}),(0,l.jsx)(yw,{children:"1st Line Drugs"}),(0,l.jsx)(yw,{children:"2nd Line Drugs"})]})}),(0,l.jsx)(Ow,{children:Object.values(o.sampleData).map((function(e){var t=m(Ek,e),n=m(Mk,e);return(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{children:e.sample}),(0,l.jsxs)(yw,{children:[(0,l.jsx)(Ec,{disabled:t,onClick:function(){return c(1,e.sample)},children:(0,l.jsx)(mk,{})}),(0,l.jsx)(Ec,{color:"primary",disabled:!t,onClick:function(){return c(1,e.sample)},children:(0,l.jsx)(Pk,{})})]}),(0,l.jsxs)(yw,{children:[(0,l.jsx)(Ec,{disabled:n,onClick:function(){return c(2,e.sample)},children:(0,l.jsx)(mk,{})}),(0,l.jsxs)(Ec,{color:"primary",disabled:!n,onClick:function(){return c(2,e.sample)},children:[(0,l.jsx)(Pk,{})," "]})]})]},e.sample)}))})]})})]})]}),(0,l.jsx)(cc,{open:s.open,onClose:d,children:(0,l.jsxs)(Ir,{sx:{border:"1px solid #fff",position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",width:"80vw",maxHeight:"80vh",bgcolor:"background.paper",overflowY:"auto",p:4,borderRadius:2},children:[(0,l.jsxs)(Ef,{onClick:d,variant:"contained",sx:{position:"absolute",top:16,right:16},children:[(0,l.jsx)(uu,{})," Close"]}),(0,l.jsxs)(Wi,{variant:"h6",align:"center",sx:{mb:2},children:["PDST Drug Concentrations \u2014 Sample ",s.sampleKey]}),h&&(0,l.jsx)(Ub,{children:(0,l.jsxs)(Zb,{size:"small",children:[(0,l.jsx)(aw,{children:(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{children:"Drug"}),(0,l.jsx)(yw,{children:"PDST"}),(0,l.jsx)(yw,{children:"tNGS"})]})}),(0,l.jsx)(Ow,{children:p.map((function(e){var t,n,r=null!==(t=null===(n=h.pdstDrugConcentrations)||void 0===n?void 0:n[e.key])&&void 0!==t?t:{pdst:"",tNGS:""};return(0,l.jsx)(_k,{drug:e,selected:r,sampleKey:s.sampleKey,handleChange:f},e.key)}))})]})})]})})]})},Ik={fontSize:"0.75rem"},Ak={D:"Detected",ND:"Not Detected",IN:"Invalid",E:"Error",IM:"Indeterminate"};var Nk=function(t){t.subType;var n=t.roundData,r=t.reportTestTypeData,o=t.viewFeedbackHandler,i=t.handleReportTestTypeDataChange,a=(0,e.useMemo)((function(){return Object.entries(Ak).map((function(e){var t=Ne(e,2);return{key:t[0],value:t[1]}}))}),[]);return(0,l.jsx)(Ir,{children:(0,l.jsxs)(Ir,{sx:{padding:3,color:"white"},children:[(0,l.jsxs)(Wi,{variant:"h5",component:"h5",gutterBottom:!0,sx:{color:"white",textTransform:"uppercase"},children:["(Round ",n,") Xpert HIV-1 Qual Assay (EID)"]}),(0,l.jsxs)(Ir,{sx:{my:3,backgroundColor:"#1e1e1e",borderRadius:2,px:4,py:3,color:"white"},children:[(0,l.jsx)(lk,{items:2,viewFeedbackHandler:o,roundData:n,reportTestTypeData:r,handleReportTestTypeDataChange:i}),(0,l.jsx)(Ub,{component:Di,children:(0,l.jsxs)(Zb,{size:"small",children:[(0,l.jsx)(aw,{children:(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{sx:Ik,rowSpan:2,children:"Sample"}),(0,l.jsx)(yw,{sx:Ik,rowSpan:2,children:"Result"}),(0,l.jsx)(yw,{sx:Ik,rowSpan:2,children:"Ct Value"})]})}),(0,l.jsx)(Ow,{children:Object.values(r.sampleData).map((function(e,t){var n;return(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{children:e.sample}),(0,l.jsx)(yw,{children:(0,l.jsx)(Dp,{fullWidth:!0,size:"small",children:(0,l.jsx)(Hm,{value:(null===(n=e.result)||void 0===n?void 0:n.key)||"",required:!0,displayEmpty:!0,sx:{minWidth:150,maxWidth:200},renderValue:function(e){var t=a.find((function(t){return t.key===e}));return t&&"string"===typeof t.value?t.value.length>20?t.value.substring(0,20)+"...":t.value:""},onChange:function(t){var n,r,o,l=a.find((function(e){return e.key===t.target.value}));l&&(n=e.sample,r=l.key,o=l.value,i("sampleData",(function(e){return Rp(Rp({},e),{},Ee({},n,Rp(Rp({},e[n]),{},{result:{key:r,value:o}})))})))},children:a.map((function(e){return(0,l.jsx)(Zm,{value:e.key,sx:{whiteSpace:"normal",overflow:"hidden",textOverflow:"ellipsis"},children:e.value},e.key)}))})})}),(0,l.jsx)(yw,{children:(0,l.jsx)(dv,{required:!0,size:"small",type:"number",value:e.ctValue,onChange:function(t){return function(e,t){var n=""===t?void 0:Number(t);(void 0===n||!isNaN(n)&&n>=0)&&i("sampleData",(function(t){return Rp(Rp({},t),{},Ee({},e,Rp(Rp({},t[e]),{},{ctValue:n})))}))}(e.sample,t.target.value)},inputProps:{min:0,step:.1},fullWidth:!0})})]},e.sample)}))})]})})]})]})})},Lk={fontSize:"0.75rem"},zk={lessThan50:"< 50",between50And999:"50 - 999",greaterThanAndEqualTo1000:">= 1000"};var Fk=function(t){t.subType;var n=t.roundData,r=t.viewFeedbackHandler,o=t.reportTestTypeData,i=t.handleReportTestTypeDataChange,a=(0,e.useMemo)((function(){return Object.entries(zk).map((function(e){var t=Ne(e,2);return{key:t[0],value:t[1]}}))}),[]);return(0,l.jsx)(Ir,{children:(0,l.jsxs)(Ir,{sx:{padding:3,color:"white"},children:[(0,l.jsxs)(Wi,{variant:"h5",component:"h5",gutterBottom:!0,sx:{color:"white",textTransform:"uppercase"},children:["(Round ",n,") Xpert HIV-1 Viral Load (VL)"]}),(0,l.jsxs)(Ir,{sx:{my:3,backgroundColor:"#1e1e1e",borderRadius:2,px:4,py:3,color:"white"},children:[(0,l.jsx)(lk,{items:2,viewFeedbackHandler:r,roundData:n,reportTestTypeData:o,handleReportTestTypeDataChange:i}),(0,l.jsx)(Ub,{component:Di,children:(0,l.jsxs)(Zb,{size:"small",children:[(0,l.jsx)(aw,{children:(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{sx:Lk,rowSpan:2,children:"Sample"}),(0,l.jsx)(yw,{sx:Lk,rowSpan:2,children:"Result"}),(0,l.jsx)(yw,{sx:Lk,rowSpan:2,children:"Ct Value"})]})}),(0,l.jsx)(Ow,{children:Object.values(o.sampleData).map((function(e,t){var n;return(0,l.jsxs)(fw,{children:[(0,l.jsx)(yw,{children:e.sample}),(0,l.jsx)(yw,{children:(0,l.jsx)(Dp,{fullWidth:!0,size:"small",children:(0,l.jsx)(Hm,{value:(null===(n=e.result)||void 0===n?void 0:n.key)||"",required:!0,displayEmpty:!0,sx:{minWidth:150,maxWidth:200},renderValue:function(e){var t=a.find((function(t){return t.key===e}));return t&&"string"===typeof t.value?t.value.length>20?t.value.substring(0,20)+"...":t.value:""},onChange:function(t){var n,r,o,l=a.find((function(e){return e.key===t.target.value}));l&&(n=e.sample,r=l.key,o=l.value,i("sampleData",(function(e){return Rp(Rp({},e),{},Ee({},n,Rp(Rp({},e[n]),{},{result:{key:r,value:o}})))})))},children:a.map((function(e){return(0,l.jsx)(Zm,{value:e.key,sx:{whiteSpace:"normal",overflow:"hidden",textOverflow:"ellipsis"},children:e.value},e.key)}))})})}),(0,l.jsx)(yw,{children:(0,l.jsx)(dv,{required:!0,size:"small",type:"number",value:e.ctValue,onChange:function(t){return function(e,t){var n=""===t?void 0:Number(t);(void 0===n||!isNaN(n)&&n>=0)&&i("sampleData",(function(t){return Rp(Rp({},t),{},Ee({},e,Rp(Rp({},t[e]),{},{ctValue:n})))}))}(e.sample,t.target.value)},inputProps:{min:0,step:.1},fullWidth:!0})})]},e.sample)}))})]})})]})]})})};var Wk=function(e){var t=e.handleSaveDraft,n=e.handleSubmit,r=po();return(0,l.jsxs)(Ir,{display:"flex",flexDirection:"row",component:Di,padding:2,justifyContent:"space-between",bgcolor:"#121212cc",flexGrow:0,children:[(0,l.jsx)(Ef,{variant:"outlined",onClick:function(){r("/eqa")},type:"button",endIcon:(0,l.jsx)(bv,{}),sx:{backgroundColor:"white",color:"black",borderColor:"black",fontWeight:"bold",borderWidth:2,"&:hover":{backgroundColor:"#f5f5f5",borderColor:"black"}},children:"Cancel"}),(0,l.jsxs)(Ir,{display:"flex",gap:2,children:[(0,l.jsx)(Ef,{variant:"contained",color:"secondary",onClick:t,type:"button",endIcon:(0,l.jsx)(wv,{}),children:"Save Draft"}),(0,l.jsx)(Ef,{variant:"contained",color:"primary",onClick:n,endIcon:(0,l.jsx)(wv,{}),type:"button",children:"Submit Report"})]})]})},Bk=function(e){for(var t={},n=1;n<=e;n++){var r="T".concat(n);t[r]={sample:r,result:null,ctValue:0}}return t},Vk={"Xpert MTB | RIF Ultra":"xpertMTBUltraData","Truenat MTB | RIF Dx":"truenatMTB","Xpert MTB | XDR Assay":"xpertMTBXdrData",AFB:"afbData","LF-LAM":"lflamData",Culture:"cultureData",PDST:"pdstData","Xpert HIV-1 Qual Assay (EID)":"xpertHIV1QualAssay","Xpert HIV-1 Viral Load (VL)":"xpertHIV1ViralLoad",undefined:"undefined"},qk={"Xpert MTB | RIF Ultra":{sampleQty:4,component:dk},"Truenat MTB | RIF Dx":{sampleQty:2,component:hk},"Xpert MTB | XDR Assay":{sampleQty:4,component:xk},AFB:{sampleQty:5,component:Sk},"LF-LAM":{sampleQty:2,component:Ck},Culture:{sampleQty:10,component:Ok},PDST:{sampleQty:10,component:Dk},"Xpert HIV-1 Qual Assay (EID)":{sampleQty:5,component:Nk},"Xpert HIV-1 Viral Load (VL)":{sampleQty:3,component:Fk}};var Hk,Uk,Yk=e.memo((function(e){var t=e.subType,n=e.roundData,r=e.reportTestTypeData,o=e.handleReportDataChange,i=e.viewFeedbackHandler,a=qk[t||""].component;return a?(0,l.jsx)(a,{viewFeedbackHandler:i,subType:t,roundData:n,reportTestTypeData:r,handleReportTestTypeDataChange:o}):(0,l.jsx)(Ir,{children:(0,l.jsx)(Wi,{sx:{color:"white"},children:"Error: Unknown Test Type"})})})),Gk=function(){var t,n,r,o,i=mo().round,a="string"===typeof i?parseInt(i,10):i,s=mo().category,u=mo().subType,c=mo().year,d="string"===typeof c?parseInt(c,10):c,f=Ne((0,e.useState)(!1),2),p=(f[0],f[1]),h=Ne((0,e.useState)(null),2),m=h[0],v=h[1],g=Ne((0,e.useState)(null),2),y=g[0],x=g[1],b=Ne((0,e.useState)({title:"",message:""}),2),w=b[0],S=b[1],j=!!w.title||!!w.message,k=Ne((0,e.useState)(!0),2),C=k[0],R=k[1],T=Ne((0,e.useState)(!1),2),O=T[0],P=T[1],E=po(),M=Ne((0,e.useState)({round:null!==a&&void 0!==a?a:0,reportYear:d}),2),_=M[0],D=M[1],I=null!==(t=null===(n=qk[null!==u&&void 0!==u?u:""])||void 0===n?void 0:n.sampleQty)&&void 0!==t?t:0,A=(0,e.useMemo)((function(){return{round:null,sampleReceivedDate:"",resultReportedDate:"",feedback:"",category:"",sampleData:Bk(I)}}),[I]),N=Ne((0,e.useState)({sampleReceivedDate:"",resultReportedDate:"",feedbackSentDate:"",category:null!==s&&void 0!==s?s:"unknown",sampleData:Bk(null!==(r=null===(o=qk[null!==u&&void 0!==u?u:""])||void 0===o?void 0:o.sampleQty)&&void 0!==r?r:0),isDraft:!0}),2),L=N[0],z=N[1],F=(0,e.useCallback)((function(){p(!0)}),[]),W=(0,e.useCallback)((function(e,t){z((function(n){return Rp(Rp({},n),{},Ee({},e,"function"===typeof t?t(n[e]):t))}))}),[]),B=(0,e.useCallback)((function(){if(!_.round||!_.reportYear)return{valid:!1,message:"Round or report year is missing."};var e=L.sampleReceivedDate,t=L.resultReportedDate,n=L.category,r=L.sampleData;if(null===e||void 0===e||!e.trim())return{valid:!1,message:"Sample Received Date is required."};if(null===t||void 0===t||!t.trim())return{valid:!1,message:"Result Reported Date is required."};if(null===n||void 0===n||!n.trim())return{valid:!1,message:"Category is required."};if(r&&"object"===typeof r){for(var o=!1,i=0,a=Object.entries(r);i<a.length;i++){var l,s=Ne(a[i],2),u=s[0],c=s[1],d="object"===typeof c.result?null===c||void 0===c||null===(l=c.result)||void 0===l?void 0:l.value:c.result;if(d&&""!==d.trim()&&(o=!0,null===c.ctValue||void 0===c.ctValue))return{valid:!1,message:"CT Value is required for sample ".concat(u," because a result is provided.")}}if(!o)return{valid:!1,message:"At least one sample result must be provided."}}return{valid:!0,message:""}}),[_,L]),V=(0,e.useCallback)(Hc(Vc().mark((function e(){return Vc().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:v(null),x(null),S({title:"",message:""}),console.log(L);case 4:case"end":return e.stop()}}),e)}))),[L]),q=(0,e.useCallback)(Hc(Vc().mark((function e(){var t,n,r,o,i,l,s;return Vc().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(v(null),x(null),"undefined"!==(t=Vk[null!==u&&void 0!==u?u:"undefined"])){e.next=5;break}return e.abrupt("return");case 5:if((n=B()).valid){e.next=9;break}return v(n.message),e.abrupt("return");case 9:if(e.prev=9,r=Ee({testType:t,round:a,reportYear:d,xpertMTBUltraData:null,truenatMTB:null,xpertMTBXdrData:null,afbData:null,lflamData:null,cultureData:null,pdstData:null,xpertHIV1QualAssay:null,xpertHIV1ViralLoad:null},t,Rp(Rp({},L),{},{isDraft:!1})),_.id){e.next=16;break}return e.next=14,Ki.post("/eqa/null/complete",r);case 14:e.next=18;break;case 16:return e.next=18,Ki.post("/eqa/".concat(_.id,"/complete"),r);case 18:x("Report submitted successfully"),v(null),P(!0),e.next=29;break;case 23:e.prev=23,e.t0=e.catch(9),l=null===(o=e.t0.response)||void 0===o||null===(i=o.data)||void 0===i?void 0:i.error,(s=l||e.t0.message||"Unknown error").includes("Report exists for the chosen round and year")?v("A report for this round and year already exists. Please choose a different year or round."):v(s||"Failed to submit report"),x(null);case 29:case"end":return e.stop()}}),e,null,[[9,23]])}))),[L,_]);return(0,e.useEffect)((function(){var e=!0,t=function(){var t=Hc(Vc().mark((function t(){var n,r,o;return Vc().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(t.prev=0,"undefined"!==(n=Vk[null!==u&&void 0!==u?u:"undefined"])){t.next=4;break}return t.abrupt("return");case 4:return t.next=6,Ki.get("/eqa/drafts?reportYear=".concat(d,"&round=").concat(i,"&subType=").concat(n));case 6:(r=t.sent).data&&Array.isArray(r.data)&&r.data.length>0?(o=r.data.sort((function(e,t){return new Date(t.createdAt).getTime()-new Date(e.createdAt).getTime()}))[0],e&&(0,fu.unstable_batchedUpdates)((function(){D(Rp(Rp({},o),{},{reportYear:o.reportYear})),z(o[n]||A),o&&o[n].isDraft&&S({title:"Draft Found",message:"You have a draft. Previous data has been loaded."})}))):console.log("No draft found for ".concat(null!==s&&void 0!==s?s:"test type"," category, using default state")),t.next=13;break;case 10:t.prev=10,t.t0=t.catch(0),e&&v("Failed to load draft");case 13:return t.prev=13,e&&R(!1),t.finish(13);case 16:case"end":return t.stop()}}),t,null,[[0,10,13,16]])})));return function(){return t.apply(this,arguments)}}();return t(),function(){e=!1}}),[]),C?(0,l.jsx)(Ir,{display:"flex",flexDirection:"column",bgcolor:"#121212cc",flexGrow:1,overflow:"auto",padding:2,children:(0,l.jsx)(Wi,{sx:{color:"white"},children:"Loading draft..."})}):L?(0,l.jsxs)(Ir,{display:"flex",flexDirection:"column",bgcolor:"#121212cc",overflow:"auto",children:[(0,l.jsxs)(md,{open:O,onClose:function(){return P(!1)},children:[(0,l.jsx)(wd,{children:"Success"}),(0,l.jsx)(Rd,{children:(0,l.jsx)(Wi,{children:y})}),(0,l.jsx)(bf,{children:(0,l.jsx)(Ef,{onClick:function(){P(!1),E("/eqa")},color:"primary",children:"OK"})})]}),(0,l.jsxs)(md,{open:j,onClose:function(){return S({title:"",message:""})},children:[(0,l.jsx)(wd,{children:w.title||"Notice"}),(0,l.jsx)(Rd,{children:(0,l.jsx)(Wi,{children:w.message})}),(0,l.jsx)(bf,{children:(0,l.jsx)(Ef,{onClick:function(){return S({title:"",message:""})},color:"primary",children:"OK"})})]}),(0,l.jsxs)(Ir,{overflow:"auto",className:"scroll_enabled",padding:2,flexGrow:1,children:[(0,l.jsxs)(Wi,{gutterBottom:!0,sx:{color:"white",mb:5,textAlign:"center"},variant:"h5",children:["EQA Summary Report - ",null===s||void 0===s?void 0:s.toUpperCase()," (",d,")"]}),(0,l.jsx)(Yk,{subType:u,roundData:a,reportTestTypeData:L,handleReportDataChange:W,viewFeedbackHandler:F}),m&&(0,l.jsx)(Wi,{color:"error",sx:{mt:2,fontSize:"0.9rem"},children:m}),y&&(0,l.jsx)(Wi,{color:"success.main",sx:{mt:2,fontSize:"0.9rem"},children:y})]}),(0,l.jsx)(Wk,{handleSaveDraft:V,handleSubmit:q})]}):(0,l.jsx)(Ir,{display:"flex",flexDirection:"column",bgcolor:"#121212cc",flexGrow:1,overflow:"auto",padding:2,children:(0,l.jsx)(Wi,{sx:{color:"white"},children:"Error: Unable to load report data"})})},Qk=function(){return function(){var t=po();(0,e.useEffect)((function(){var e;null===(e=window.API)||void 0===e||e.navigate((function(e){if(Object.values(Db).every((function(e){return!new RegExp(e).test(window.location.hash)}))){var n=Db[e];return n?t(n):void 0}}))}),[])}(),(0,l.jsxs)(wo,{children:[(0,l.jsx)(xo,{path:"/",element:(0,l.jsx)(Zw,{})}),(0,l.jsx)(xo,{path:"/lab",element:(0,l.jsx)(Lw,{})}),(0,l.jsx)(xo,{path:"/machine",element:(0,l.jsx)(Xw,{})}),(0,l.jsx)(xo,{path:"/register",element:(0,l.jsx)(Jw,{})}),(0,l.jsx)(xo,{path:"/home",element:(0,l.jsx)($c,{})}),(0,l.jsxs)(xo,{path:"/requests",element:(0,l.jsx)(Kc,{}),children:[(0,l.jsx)(xo,{index:!0,element:(0,l.jsx)(kp,{})}),(0,l.jsx)(xo,{path:"create",element:(0,l.jsx)(Ob,{})}),(0,l.jsx)(xo,{path:":sampleId/show",element:(0,l.jsx)(Eb,{})})]}),(0,l.jsxs)(xo,{path:"/service",element:(0,l.jsx)(xS,{}),children:[(0,l.jsx)(xo,{index:!0,element:(0,l.jsx)(bS,{})}),(0,l.jsx)(xo,{path:"create",element:(0,l.jsx)(vS,{})}),(0,l.jsx)(xo,{path:":id/show",element:(0,l.jsx)(wS,{})})]}),(0,l.jsx)(xo,{path:"/calibration",element:(0,l.jsx)(Ib,{}),children:(0,l.jsx)(xo,{index:!0,element:(0,l.jsx)(Wb,{})})}),(0,l.jsx)(xo,{path:"/tests/:hours",element:(0,l.jsx)(_b,{})}),(0,l.jsxs)(xo,{path:"/pending-tests",element:(0,l.jsx)(tk,{}),children:[(0,l.jsx)(xo,{index:!0,element:(0,l.jsx)(ek,{})}),(0,l.jsx)(xo,{path:":sampleId",element:(0,l.jsx)(Zj,{})})]}),(0,l.jsxs)(xo,{path:"/summary-report",element:(0,l.jsx)(TS,{}),children:[(0,l.jsx)(xo,{path:":category/new",element:(0,l.jsx)(LS,{})}),(0,l.jsx)(xo,{path:":category/monthly/new",element:(0,l.jsx)(wj,{})})]}),(0,l.jsx)(xo,{path:"/eqa",element:(0,l.jsx)(ok,{}),children:(0,l.jsx)(xo,{path:"report/:category/:subType/:year/:round",element:(0,l.jsx)(Gk,{})})}),(0,l.jsx)(xo,{path:"/about",element:(0,l.jsx)(Iw,{})})]})},$k=function(e){e&&e instanceof Function&&n.e(787).then(n.bind(n,787)).then((function(t){var n=t.getCLS,r=t.getFID,o=t.getFCP,i=t.getLCP,a=t.getTTFB;n(e),r(e),o(e),i(e),a(e)}))},Kk=on({palette:{mode:"dark",primary:{main:(null===(Hk=$i.colors)||void 0===Hk?void 0:Hk.primary)||"#d05286"},secondary:{main:(null===(Uk=$i.colors)||void 0===Uk?void 0:Uk.secondary)||"#572345"}}}),Xk=Nr.createRoot(document.getElementById("root")),Zk=new Ar.QueryClient;Xk.render((0,l.jsx)(e.StrictMode,{children:(0,l.jsxs)(xt,{theme:Kk,children:[(0,l.jsx)(xn,{}),(0,l.jsx)(Ro,{children:(0,l.jsx)(Ar.QueryClientProvider,{client:Zk,children:(0,l.jsx)(Ir,{style:{userSelect:"none"},children:(0,l.jsx)(Qk,{})})})})]})})),$k()}()}();
//# sourceMappingURL=main.ff19a20a.js.map/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */

/**
     * query-core
     *
     * Copyright (c) TanStack
     *
     * This source code is licensed under the MIT license found in the
     * LICENSE.md file in the root directory of this source tree.
     *
     * @license MIT
     */

/**
 * @license React
 * react-dom.production.min.js
 *
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

/**
 * @license React
 * react-is.production.min.js
 *
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

/**
 * @license React
 * react-jsx-runtime.production.min.js
 *
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

/**
 * @license React
 * react.production.min.js
 *
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

/**
 * @license React
 * scheduler.production.min.js
 *
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

/**
 * @license React
 * use-sync-external-store-shim.production.min.js
 *
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

/**
 * React Router DOM v6.3.0
 *
 * Copyright (c) Remix Software Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE.md file in the root directory of this source tree.
 *
 * @license MIT
 */

/**
 * React Router v6.3.0
 *
 * Copyright (c) Remix Software Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE.md file in the root directory of this source tree.
 *
 * @license MIT
 */

/** @license MUI v5.8.7
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

/** @license React v16.13.1
 * react-is.production.min.js
 *
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

//! moment.js
The MIT License (MIT)

Copyright (c) 2020 Microsoft

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": "@azure/abort-controller",
  "sdk-type": "client",
  "version": "1.1.0",
  "description": "Microsoft Azure SDK for JavaScript - Aborter",
  "main": "./dist/index.js",
  "module": "dist-esm/src/index.js",
  "types": "./types/src/index.d.ts",
  "typesVersions": {
    "<3.6": {
      "types/src/*": [
        "types/3.1/*"
      ]
    }
  },
  "files": [
    "dist/",
    "dist-esm/src/",
    "shims-public.d.ts",
    "types/src",
    "types/3.1",
    "README.md",
    "LICENSE"
  ],
  "engines": {
    "node": ">=12.0.0"
  },
  "repository": "github:Azure/azure-sdk-for-js",
  "author": "Microsoft Corporation",
  "license": "MIT",
  "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/core/abort-controller/README.md",
  "sideEffects": false,
  "dependencies": {
    "tslib": "^2.2.0"
  },
  "devDependencies": {
    "@azure/dev-tool": "^1.0.0",
    "@azure/eslint-plugin-azure-sdk": "^3.0.0",
    "@microsoft/api-extractor": "7.18.11",
    "@types/chai": "^4.1.6",
    "@types/mocha": "^7.0.2",
    "@types/node": "^12.0.0",
    "chai": "^4.2.0",
    "cross-env": "^7.0.2",
    "downlevel-dts": "^0.8.0",
    "eslint": "^7.15.0",
    "karma": "^6.2.0",
    "karma-chrome-launcher": "^3.0.0",
    "karma-coverage": "^2.0.0",
    "karma-edge-launcher": "^0.4.2",
    "karma-env-preprocessor": "^0.1.1",
    "karma-firefox-launcher": "^1.1.0",
    "karma-ie-launcher": "^1.0.0",
    "karma-junit-reporter": "^2.0.1",
    "karma-mocha": "^2.0.1",
    "karma-mocha-reporter": "^2.2.5",
    "karma-sourcemap-loader": "^0.3.8",
    "mocha": "^7.1.1",
    "mocha-junit-reporter": "^2.0.0",
    "nyc": "^15.0.0",
    "prettier": "^2.5.1",
    "rimraf": "^3.0.0",
    "ts-node": "^10.0.0",
    "typescript": "~4.6.0"
  }
}// This file is read by tools that parse documentation comments conforming to the TSDoc standard.
// It should be published with your NPM package.  It should not be tracked by Git.
{
  "tsdocVersion": "0.12",
  "toolPackages": [
    {
      "packageName": "@microsoft/api-extractor",
      "packageVersion": "7.18.11"
    }
  ]
}
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { AbortSignal, abortSignal } from "./AbortSignal";
/**
 * This error is thrown when an asynchronous operation has been aborted.
 * Check for this error by testing the `name` that the name property of the
 * error matches `"AbortError"`.
 *
 * @example
 * ```ts
 * const controller = new AbortController();
 * controller.abort();
 * try {
 *   doAsyncWork(controller.signal)
 * } catch (e) {
 *   if (e.name === 'AbortError') {
 *     // handle abort error here.
 *   }
 * }
 * ```
 */
export class AbortError extends Error {
    constructor(message) {
        super(message);
        this.name = "AbortError";
    }
}
/**
 * An AbortController provides an AbortSignal and the associated controls to signal
 * that an asynchronous operation should be aborted.
 *
 * @example
 * Abort an operation when another event fires
 * ```ts
 * const controller = new AbortController();
 * const signal = controller.signal;
 * doAsyncWork(signal);
 * button.addEventListener('click', () => controller.abort());
 * ```
 *
 * @example
 * Share aborter cross multiple operations in 30s
 * ```ts
 * // Upload the same data to 2 different data centers at the same time,
 * // abort another when any of them is finished
 * const controller = AbortController.withTimeout(30 * 1000);
 * doAsyncWork(controller.signal).then(controller.abort);
 * doAsyncWork(controller.signal).then(controller.abort);
 *```
 *
 * @example
 * Cascaded aborting
 * ```ts
 * // All operations can't take more than 30 seconds
 * const aborter = Aborter.timeout(30 * 1000);
 *
 * // Following 2 operations can't take more than 25 seconds
 * await doAsyncWork(aborter.withTimeout(25 * 1000));
 * await doAsyncWork(aborter.withTimeout(25 * 1000));
 * ```
 */
export class AbortController {
    // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
    constructor(parentSignals) {
        this._signal = new AbortSignal();
        if (!parentSignals) {
            return;
        }
        // coerce parentSignals into an array
        if (!Array.isArray(parentSignals)) {
            // eslint-disable-next-line prefer-rest-params
            parentSignals = arguments;
        }
        for (const parentSignal of parentSignals) {
            // if the parent signal has already had abort() called,
            // then call abort on this signal as well.
            if (parentSignal.aborted) {
                this.abort();
            }
            else {
                // when the parent signal aborts, this signal should as well.
                parentSignal.addEventListener("abort", () => {
                    this.abort();
                });
            }
        }
    }
    /**
     * The AbortSignal associated with this controller that will signal aborted
     * when the abort method is called on this controller.
     *
     * @readonly
     */
    get signal() {
        return this._signal;
    }
    /**
     * Signal that any operations passed this controller's associated abort signal
     * to cancel any remaining work and throw an `AbortError`.
     */
    abort() {
        abortSignal(this._signal);
    }
    /**
     * Creates a new AbortSignal instance that will abort after the provided ms.
     * @param ms - Elapsed time in milliseconds to trigger an abort.
     */
    static timeout(ms) {
        const signal = new AbortSignal();
        const timer = setTimeout(abortSignal, ms, signal);
        // Prevent the active Timer from keeping the Node.js event loop active.
        if (typeof timer.unref === "function") {
            timer.unref();
        }
        return signal;
    }
}
//# sourceMappingURL=AbortController.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/// <reference path="../shims-public.d.ts" />
const listenersMap = new WeakMap();
const abortedMap = new WeakMap();
/**
 * An aborter instance implements AbortSignal interface, can abort HTTP requests.
 *
 * - Call AbortSignal.none to create a new AbortSignal instance that cannot be cancelled.
 * Use `AbortSignal.none` when you are required to pass a cancellation token but the operation
 * cannot or will not ever be cancelled.
 *
 * @example
 * Abort without timeout
 * ```ts
 * await doAsyncWork(AbortSignal.none);
 * ```
 */
export class AbortSignal {
    constructor() {
        /**
         * onabort event listener.
         */
        this.onabort = null;
        listenersMap.set(this, []);
        abortedMap.set(this, false);
    }
    /**
     * Status of whether aborted or not.
     *
     * @readonly
     */
    get aborted() {
        if (!abortedMap.has(this)) {
            throw new TypeError("Expected `this` to be an instance of AbortSignal.");
        }
        return abortedMap.get(this);
    }
    /**
     * Creates a new AbortSignal instance that will never be aborted.
     *
     * @readonly
     */
    static get none() {
        return new AbortSignal();
    }
    /**
     * Added new "abort" event listener, only support "abort" event.
     *
     * @param _type - Only support "abort" event
     * @param listener - The listener to be added
     */
    addEventListener(
    // tslint:disable-next-line:variable-name
    _type, listener) {
        if (!listenersMap.has(this)) {
            throw new TypeError("Expected `this` to be an instance of AbortSignal.");
        }
        const listeners = listenersMap.get(this);
        listeners.push(listener);
    }
    /**
     * Remove "abort" event listener, only support "abort" event.
     *
     * @param _type - Only support "abort" event
     * @param listener - The listener to be removed
     */
    removeEventListener(
    // tslint:disable-next-line:variable-name
    _type, listener) {
        if (!listenersMap.has(this)) {
            throw new TypeError("Expected `this` to be an instance of AbortSignal.");
        }
        const listeners = listenersMap.get(this);
        const index = listeners.indexOf(listener);
        if (index > -1) {
            listeners.splice(index, 1);
        }
    }
    /**
     * Dispatches a synthetic event to the AbortSignal.
     */
    dispatchEvent(_event) {
        throw new Error("This is a stub dispatchEvent implementation that should not be used.  It only exists for type-checking purposes.");
    }
}
/**
 * Helper to trigger an abort event immediately, the onabort and all abort event listeners will be triggered.
 * Will try to trigger abort event for all linked AbortSignal nodes.
 *
 * - If there is a timeout, the timer will be cancelled.
 * - If aborted is true, nothing will happen.
 *
 * @internal
 */
// eslint-disable-next-line @azure/azure-sdk/ts-use-interface-parameters
export function abortSignal(signal) {
    if (signal.aborted) {
        return;
    }
    if (signal.onabort) {
        signal.onabort.call(signal);
    }
    const listeners = listenersMap.get(signal);
    if (listeners) {
        // Create a copy of listeners so mutations to the array
        // (e.g. via removeListener calls) don't affect the listeners
        // we invoke.
        listeners.slice().forEach((listener) => {
            listener.call(signal, { type: "abort" });
        });
    }
    abortedMap.set(signal, true);
}
//# sourceMappingURL=AbortSignal.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
// Changes to Aborter
// * Rename Aborter to AbortSignal
// * Remove withValue and getValue - async context should be solved differently/wholistically, not tied to cancellation
// * Remove withTimeout, it's moved to the controller
// * AbortSignal constructor no longer takes a parent. Cancellation graphs are created from the controller.
// Potential changes to align with DOM Spec
// * dispatchEvent on Signal
export { AbortController, AbortError } from "./AbortController";
export { AbortSignal } from "./AbortSignal";
//# sourceMappingURL=index.js.map'use strict';

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

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/// <reference path="../shims-public.d.ts" />
const listenersMap = new WeakMap();
const abortedMap = new WeakMap();
/**
 * An aborter instance implements AbortSignal interface, can abort HTTP requests.
 *
 * - Call AbortSignal.none to create a new AbortSignal instance that cannot be cancelled.
 * Use `AbortSignal.none` when you are required to pass a cancellation token but the operation
 * cannot or will not ever be cancelled.
 *
 * @example
 * Abort without timeout
 * ```ts
 * await doAsyncWork(AbortSignal.none);
 * ```
 */
class AbortSignal {
    constructor() {
        /**
         * onabort event listener.
         */
        this.onabort = null;
        listenersMap.set(this, []);
        abortedMap.set(this, false);
    }
    /**
     * Status of whether aborted or not.
     *
     * @readonly
     */
    get aborted() {
        if (!abortedMap.has(this)) {
            throw new TypeError("Expected `this` to be an instance of AbortSignal.");
        }
        return abortedMap.get(this);
    }
    /**
     * Creates a new AbortSignal instance that will never be aborted.
     *
     * @readonly
     */
    static get none() {
        return new AbortSignal();
    }
    /**
     * Added new "abort" event listener, only support "abort" event.
     *
     * @param _type - Only support "abort" event
     * @param listener - The listener to be added
     */
    addEventListener(
    // tslint:disable-next-line:variable-name
    _type, listener) {
        if (!listenersMap.has(this)) {
            throw new TypeError("Expected `this` to be an instance of AbortSignal.");
        }
        const listeners = listenersMap.get(this);
        listeners.push(listener);
    }
    /**
     * Remove "abort" event listener, only support "abort" event.
     *
     * @param _type - Only support "abort" event
     * @param listener - The listener to be removed
     */
    removeEventListener(
    // tslint:disable-next-line:variable-name
    _type, listener) {
        if (!listenersMap.has(this)) {
            throw new TypeError("Expected `this` to be an instance of AbortSignal.");
        }
        const listeners = listenersMap.get(this);
        const index = listeners.indexOf(listener);
        if (index > -1) {
            listeners.splice(index, 1);
        }
    }
    /**
     * Dispatches a synthetic event to the AbortSignal.
     */
    dispatchEvent(_event) {
        throw new Error("This is a stub dispatchEvent implementation that should not be used.  It only exists for type-checking purposes.");
    }
}
/**
 * Helper to trigger an abort event immediately, the onabort and all abort event listeners will be triggered.
 * Will try to trigger abort event for all linked AbortSignal nodes.
 *
 * - If there is a timeout, the timer will be cancelled.
 * - If aborted is true, nothing will happen.
 *
 * @internal
 */
// eslint-disable-next-line @azure/azure-sdk/ts-use-interface-parameters
function abortSignal(signal) {
    if (signal.aborted) {
        return;
    }
    if (signal.onabort) {
        signal.onabort.call(signal);
    }
    const listeners = listenersMap.get(signal);
    if (listeners) {
        // Create a copy of listeners so mutations to the array
        // (e.g. via removeListener calls) don't affect the listeners
        // we invoke.
        listeners.slice().forEach((listener) => {
            listener.call(signal, { type: "abort" });
        });
    }
    abortedMap.set(signal, true);
}

// Copyright (c) Microsoft Corporation.
/**
 * This error is thrown when an asynchronous operation has been aborted.
 * Check for this error by testing the `name` that the name property of the
 * error matches `"AbortError"`.
 *
 * @example
 * ```ts
 * const controller = new AbortController();
 * controller.abort();
 * try {
 *   doAsyncWork(controller.signal)
 * } catch (e) {
 *   if (e.name === 'AbortError') {
 *     // handle abort error here.
 *   }
 * }
 * ```
 */
class AbortError extends Error {
    constructor(message) {
        super(message);
        this.name = "AbortError";
    }
}
/**
 * An AbortController provides an AbortSignal and the associated controls to signal
 * that an asynchronous operation should be aborted.
 *
 * @example
 * Abort an operation when another event fires
 * ```ts
 * const controller = new AbortController();
 * const signal = controller.signal;
 * doAsyncWork(signal);
 * button.addEventListener('click', () => controller.abort());
 * ```
 *
 * @example
 * Share aborter cross multiple operations in 30s
 * ```ts
 * // Upload the same data to 2 different data centers at the same time,
 * // abort another when any of them is finished
 * const controller = AbortController.withTimeout(30 * 1000);
 * doAsyncWork(controller.signal).then(controller.abort);
 * doAsyncWork(controller.signal).then(controller.abort);
 *```
 *
 * @example
 * Cascaded aborting
 * ```ts
 * // All operations can't take more than 30 seconds
 * const aborter = Aborter.timeout(30 * 1000);
 *
 * // Following 2 operations can't take more than 25 seconds
 * await doAsyncWork(aborter.withTimeout(25 * 1000));
 * await doAsyncWork(aborter.withTimeout(25 * 1000));
 * ```
 */
class AbortController {
    // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
    constructor(parentSignals) {
        this._signal = new AbortSignal();
        if (!parentSignals) {
            return;
        }
        // coerce parentSignals into an array
        if (!Array.isArray(parentSignals)) {
            // eslint-disable-next-line prefer-rest-params
            parentSignals = arguments;
        }
        for (const parentSignal of parentSignals) {
            // if the parent signal has already had abort() called,
            // then call abort on this signal as well.
            if (parentSignal.aborted) {
                this.abort();
            }
            else {
                // when the parent signal aborts, this signal should as well.
                parentSignal.addEventListener("abort", () => {
                    this.abort();
                });
            }
        }
    }
    /**
     * The AbortSignal associated with this controller that will signal aborted
     * when the abort method is called on this controller.
     *
     * @readonly
     */
    get signal() {
        return this._signal;
    }
    /**
     * Signal that any operations passed this controller's associated abort signal
     * to cancel any remaining work and throw an `AbortError`.
     */
    abort() {
        abortSignal(this._signal);
    }
    /**
     * Creates a new AbortSignal instance that will abort after the provided ms.
     * @param ms - Elapsed time in milliseconds to trigger an abort.
     */
    static timeout(ms) {
        const signal = new AbortSignal();
        const timer = setTimeout(abortSignal, ms, signal);
        // Prevent the active Timer from keeping the Node.js event loop active.
        if (typeof timer.unref === "function") {
            timer.unref();
        }
        return signal;
    }
}

exports.AbortController = AbortController;
exports.AbortError = AbortError;
exports.AbortSignal = AbortSignal;
//# sourceMappingURL=index.js.map
The MIT License (MIT)

Copyright (c) 2020 Microsoft

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": "@azure/core-auth",
  "version": "1.3.2",
  "description": "Provides low-level interfaces and helper methods for authentication in Azure SDK",
  "sdk-type": "client",
  "main": "dist/index.js",
  "module": "dist-esm/src/index.js",
  "types": "./types/latest/core-auth.d.ts",
  "typesVersions": {
    "<3.6": {
      "types/latest/*": [
        "types/3.1/*"
      ]
    }
  },
  "files": [
    "dist/",
    "dist-esm/src/",
    "types/latest/core-auth.d.ts",
    "types/3.1",
    "README.md",
    "LICENSE"
  ],
  "repository": "github:Azure/azure-sdk-for-js",
  "author": "Microsoft Corporation",
  "license": "MIT",
  "engines": {
    "node": ">=12.0.0"
  },
  "homepage": "https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/core/core-auth/README.md",
  "sideEffects": false,
  "dependencies": {
    "@azure/abort-controller": "^1.0.0",
    "tslib": "^2.2.0"
  },
  "devDependencies": {
    "@azure/eslint-plugin-azure-sdk": "^3.0.0",
    "@microsoft/api-extractor": "7.7.11",
    "@rollup/plugin-commonjs": "11.0.2",
    "@rollup/plugin-json": "^4.0.0",
    "@rollup/plugin-multi-entry": "^3.0.0",
    "@rollup/plugin-node-resolve": "^8.0.0",
    "@rollup/plugin-replace": "^2.2.0",
    "@types/mocha": "^7.0.2",
    "@types/node": "^12.0.0",
    "assert": "^1.4.1",
    "cross-env": "^7.0.2",
    "downlevel-dts": "~0.4.0",
    "eslint": "^7.15.0",
    "inherits": "^2.0.3",
    "mocha": "^7.1.1",
    "mocha-junit-reporter": "^1.18.0",
    "prettier": "^1.16.4",
    "rimraf": "^3.0.0",
    "rollup": "^1.16.3",
    "rollup-plugin-sourcemaps": "^0.4.2",
    "rollup-plugin-terser": "^5.1.1",
    "rollup-plugin-visualizer": "^4.0.4",
    "typescript": "~4.2.0",
    "util": "^0.12.1",
    "typedoc": "0.15.2"
  }
}// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * A static-key-based credential that supports updating
 * the underlying key value.
 */
export class AzureKeyCredential {
    /**
     * Create an instance of an AzureKeyCredential for use
     * with a service client.
     *
     * @param key - The initial value of the key to use in authentication
     */
    constructor(key) {
        if (!key) {
            throw new Error("key must be a non-empty string");
        }
        this._key = key;
    }
    /**
     * The value of the key to be used in authentication
     */
    get key() {
        return this._key;
    }
    /**
     * Change the value of the key.
     *
     * Updates will take effect upon the next request after
     * updating the key value.
     *
     * @param newKey - The new key value to be used
     */
    update(newKey) {
        this._key = newKey;
    }
}
//# sourceMappingURL=azureKeyCredential.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { isObjectWithProperties } from "./typeguards";
/**
 * A static name/key-based credential that supports updating
 * the underlying name and key values.
 */
export class AzureNamedKeyCredential {
    /**
     * Create an instance of an AzureNamedKeyCredential for use
     * with a service client.
     *
     * @param name - The initial value of the name to use in authentication.
     * @param key - The initial value of the key to use in authentication.
     */
    constructor(name, key) {
        if (!name || !key) {
            throw new TypeError("name and key must be non-empty strings");
        }
        this._name = name;
        this._key = key;
    }
    /**
     * The value of the key to be used in authentication.
     */
    get key() {
        return this._key;
    }
    /**
     * The value of the name to be used in authentication.
     */
    get name() {
        return this._name;
    }
    /**
     * Change the value of the key.
     *
     * Updates will take effect upon the next request after
     * updating the key value.
     *
     * @param newName - The new name value to be used.
     * @param newKey - The new key value to be used.
     */
    update(newName, newKey) {
        if (!newName || !newKey) {
            throw new TypeError("newName and newKey must be non-empty strings");
        }
        this._name = newName;
        this._key = newKey;
    }
}
/**
 * Tests an object to determine whether it implements NamedKeyCredential.
 *
 * @param credential - The assumed NamedKeyCredential to be tested.
 */
export function isNamedKeyCredential(credential) {
    return (isObjectWithProperties(credential, ["name", "key"]) &&
        typeof credential.key === "string" &&
        typeof credential.name === "string");
}
//# sourceMappingURL=azureNamedKeyCredential.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { isObjectWithProperties } from "./typeguards";
/**
 * A static-signature-based credential that supports updating
 * the underlying signature value.
 */
export class AzureSASCredential {
    /**
     * Create an instance of an AzureSASCredential for use
     * with a service client.
     *
     * @param signature - The initial value of the shared access signature to use in authentication
     */
    constructor(signature) {
        if (!signature) {
            throw new Error("shared access signature must be a non-empty string");
        }
        this._signature = signature;
    }
    /**
     * The value of the shared access signature to be used in authentication
     */
    get signature() {
        return this._signature;
    }
    /**
     * Change the value of the signature.
     *
     * Updates will take effect upon the next request after
     * updating the signature value.
     *
     * @param newSignature - The new shared access signature value to be used
     */
    update(newSignature) {
        if (!newSignature) {
            throw new Error("shared access signature must be a non-empty string");
        }
        this._signature = newSignature;
    }
}
/**
 * Tests an object to determine whether it implements SASCredential.
 *
 * @param credential - The assumed SASCredential to be tested.
 */
export function isSASCredential(credential) {
    return (isObjectWithProperties(credential, ["signature"]) && typeof credential.signature === "string");
}
//# sourceMappingURL=azureSASCredential.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export { AzureKeyCredential } from "./azureKeyCredential";
export { AzureNamedKeyCredential, isNamedKeyCredential } from "./azureNamedKeyCredential";
export { AzureSASCredential, isSASCredential } from "./azureSASCredential";
export { isTokenCredential } from "./tokenCredential";
//# sourceMappingURL=index.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Tests an object to determine whether it implements TokenCredential.
 *
 * @param credential - The assumed TokenCredential to be tested.
 */
export function isTokenCredential(credential) {
    // Check for an object with a 'getToken' function and possibly with
    // a 'signRequest' function.  We do this check to make sure that
    // a ServiceClientCredentials implementor (like TokenClientCredentials
    // in ms-rest-nodeauth) doesn't get mistaken for a TokenCredential if
    // it doesn't actually implement TokenCredential also.
    const castCredential = credential;
    return (castCredential &&
        typeof castCredential.getToken === "function" &&
        (castCredential.signRequest === undefined || castCredential.getToken.length > 0));
}
//# sourceMappingURL=tokenCredential.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=tracing.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Helper TypeGuard that checks if something is defined or not.
 * @param thing - Anything
 * @internal
 */
function isDefined(thing) {
    return typeof thing !== "undefined" && thing !== null;
}
/**
 * Helper TypeGuard that checks if the input is an object with the specified properties.
 * Note: The properties may be inherited.
 * @param thing - Anything.
 * @param properties - The name of the properties that should appear in the object.
 * @internal
 */
export function isObjectWithProperties(thing, properties) {
    if (!isDefined(thing) || typeof thing !== "object") {
        return false;
    }
    for (const property of properties) {
        if (!objectHasProperty(thing, property)) {
            return false;
        }
    }
    return true;
}
/**
 * Helper TypeGuard that checks if the input is an object with the specified property.
 * Note: The property may be inherited.
 * @param thing - Any object.
 * @param property - The name of the property that should appear in the object.
 * @internal
 */
function objectHasProperty(thing, property) {
    return typeof thing === "object" && property in thing;
}
//# sourceMappingURL=typeguards.js.map'use strict';

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

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * A static-key-based credential that supports updating
 * the underlying key value.
 */
class AzureKeyCredential {
    /**
     * Create an instance of an AzureKeyCredential for use
     * with a service client.
     *
     * @param key - The initial value of the key to use in authentication
     */
    constructor(key) {
        if (!key) {
            throw new Error("key must be a non-empty string");
        }
        this._key = key;
    }
    /**
     * The value of the key to be used in authentication
     */
    get key() {
        return this._key;
    }
    /**
     * Change the value of the key.
     *
     * Updates will take effect upon the next request after
     * updating the key value.
     *
     * @param newKey - The new key value to be used
     */
    update(newKey) {
        this._key = newKey;
    }
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Helper TypeGuard that checks if something is defined or not.
 * @param thing - Anything
 * @internal
 */
function isDefined(thing) {
    return typeof thing !== "undefined" && thing !== null;
}
/**
 * Helper TypeGuard that checks if the input is an object with the specified properties.
 * Note: The properties may be inherited.
 * @param thing - Anything.
 * @param properties - The name of the properties that should appear in the object.
 * @internal
 */
function isObjectWithProperties(thing, properties) {
    if (!isDefined(thing) || typeof thing !== "object") {
        return false;
    }
    for (const property of properties) {
        if (!objectHasProperty(thing, property)) {
            return false;
        }
    }
    return true;
}
/**
 * Helper TypeGuard that checks if the input is an object with the specified property.
 * Note: The property may be inherited.
 * @param thing - Any object.
 * @param property - The name of the property that should appear in the object.
 * @internal
 */
function objectHasProperty(thing, property) {
    return typeof thing === "object" && property in thing;
}

// Copyright (c) Microsoft Corporation.
/**
 * A static name/key-based credential that supports updating
 * the underlying name and key values.
 */
class AzureNamedKeyCredential {
    /**
     * Create an instance of an AzureNamedKeyCredential for use
     * with a service client.
     *
     * @param name - The initial value of the name to use in authentication.
     * @param key - The initial value of the key to use in authentication.
     */
    constructor(name, key) {
        if (!name || !key) {
            throw new TypeError("name and key must be non-empty strings");
        }
        this._name = name;
        this._key = key;
    }
    /**
     * The value of the key to be used in authentication.
     */
    get key() {
        return this._key;
    }
    /**
     * The value of the name to be used in authentication.
     */
    get name() {
        return this._name;
    }
    /**
     * Change the value of the key.
     *
     * Updates will take effect upon the next request after
     * updating the key value.
     *
     * @param newName - The new name value to be used.
     * @param newKey - The new key value to be used.
     */
    update(newName, newKey) {
        if (!newName || !newKey) {
            throw new TypeError("newName and newKey must be non-empty strings");
        }
        this._name = newName;
        this._key = newKey;
    }
}
/**
 * Tests an object to determine whether it implements NamedKeyCredential.
 *
 * @param credential - The assumed NamedKeyCredential to be tested.
 */
function isNamedKeyCredential(credential) {
    return (isObjectWithProperties(credential, ["name", "key"]) &&
        typeof credential.key === "string" &&
        typeof credential.name === "string");
}

// Copyright (c) Microsoft Corporation.
/**
 * A static-signature-based credential that supports updating
 * the underlying signature value.
 */
class AzureSASCredential {
    /**
     * Create an instance of an AzureSASCredential for use
     * with a service client.
     *
     * @param signature - The initial value of the shared access signature to use in authentication
     */
    constructor(signature) {
        if (!signature) {
            throw new Error("shared access signature must be a non-empty string");
        }
        this._signature = signature;
    }
    /**
     * The value of the shared access signature to be used in authentication
     */
    get signature() {
        return this._signature;
    }
    /**
     * Change the value of the signature.
     *
     * Updates will take effect upon the next request after
     * updating the signature value.
     *
     * @param newSignature - The new shared access signature value to be used
     */
    update(newSignature) {
        if (!newSignature) {
            throw new Error("shared access signature must be a non-empty string");
        }
        this._signature = newSignature;
    }
}
/**
 * Tests an object to determine whether it implements SASCredential.
 *
 * @param credential - The assumed SASCredential to be tested.
 */
function isSASCredential(credential) {
    return (isObjectWithProperties(credential, ["signature"]) && typeof credential.signature === "string");
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Tests an object to determine whether it implements TokenCredential.
 *
 * @param credential - The assumed TokenCredential to be tested.
 */
function isTokenCredential(credential) {
    // Check for an object with a 'getToken' function and possibly with
    // a 'signRequest' function.  We do this check to make sure that
    // a ServiceClientCredentials implementor (like TokenClientCredentials
    // in ms-rest-nodeauth) doesn't get mistaken for a TokenCredential if
    // it doesn't actually implement TokenCredential also.
    const castCredential = credential;
    return (castCredential &&
        typeof castCredential.getToken === "function" &&
        (castCredential.signRequest === undefined || castCredential.getToken.length > 0));
}

exports.AzureKeyCredential = AzureKeyCredential;
exports.AzureNamedKeyCredential = AzureNamedKeyCredential;
exports.AzureSASCredential = AzureSASCredential;
exports.isNamedKeyCredential = isNamedKeyCredential;
exports.isSASCredential = isSASCredential;
exports.isTokenCredential = isTokenCredential;
//# sourceMappingURL=index.js.map
The MIT License (MIT)

Copyright (c) 2020 Microsoft

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": "@azure/core-client",
  "version": "1.6.0",
  "description": "Core library for interfacing with AutoRest generated code",
  "sdk-type": "client",
  "main": "dist/index.js",
  "module": "dist-esm/src/index.js",
  "browser": {
    "./dist-esm/src/base64.js": "./dist-esm/src/base64.browser.js"
  },
  "react-native": {
    "./dist/index.js": "./dist-esm/src/index.js"
  },
  "types": "types/latest/core-client.d.ts",
  "typesVersions": {
    "<3.6": {
      "types/latest/*": [
        "types/3.1/*"
      ]
    }
  },
  "files": [
    "dist/",
    "dist-esm/src/",
    "types/latest/core-client.d.ts",
    "types/3.1/core-client.d.ts",
    "README.md",
    "LICENSE"
  ],
  "repository": "github:Azure/azure-sdk-for-js",
  "author": "Microsoft Corporation",
  "license": "MIT",
  "engines": {
    "node": ">=12.0.0"
  },
  "homepage": "https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/core/core-client/",
  "sideEffects": false,
  "prettier": "@azure/eslint-plugin-azure-sdk/prettier.json",
  "dependencies": {
    "@azure/abort-controller": "^1.0.0",
    "@azure/core-auth": "^1.3.0",
    "@azure/core-rest-pipeline": "^1.5.0",
    "@azure/core-tracing": "^1.0.0",
    "@azure/core-util": "^1.0.0",
    "@azure/logger": "^1.0.0",
    "tslib": "^2.2.0"
  },
  "devDependencies": {
    "@azure/core-xml": "^1.0.0",
    "@microsoft/api-extractor": "7.18.11",
    "@types/chai": "^4.1.6",
    "@types/mocha": "^7.0.2",
    "@types/node": "^12.0.0",
    "@types/sinon": "^9.0.4",
    "@azure/eslint-plugin-azure-sdk": "^3.0.0",
    "@azure/dev-tool": "^1.0.0",
    "chai": "^4.2.0",
    "downlevel-dts": "^0.8.0",
    "cross-env": "^7.0.2",
    "eslint": "^7.15.0",
    "inherits": "^2.0.3",
    "karma": "^6.2.0",
    "karma-chrome-launcher": "^3.0.0",
    "karma-coverage": "^2.0.0",
    "karma-edge-launcher": "^0.4.2",
    "karma-env-preprocessor": "^0.1.1",
    "karma-firefox-launcher": "^1.1.0",
    "karma-ie-launcher": "^1.0.0",
    "karma-junit-reporter": "^2.0.1",
    "karma-mocha": "^2.0.1",
    "karma-mocha-reporter": "^2.2.5",
    "karma-sourcemap-loader": "^0.3.8",
    "mocha": "^7.1.1",
    "mocha-junit-reporter": "^2.0.0",
    "prettier": "^2.5.1",
    "rimraf": "^3.0.0",
    "sinon": "^9.0.2",
    "ts-node": "^10.0.0",
    "typescript": "~4.6.0",
    "util": "^0.12.1"
  }
}// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { logger as coreClientLogger } from "./log";
import { decodeStringToString } from "./base64";
/**
 * Converts: `Bearer a="b", c="d", Bearer d="e", f="g"`.
 * Into: `[ { a: 'b', c: 'd' }, { d: 'e', f: 'g' } ]`.
 *
 * @internal
 */
export function parseCAEChallenge(challenges) {
    const bearerChallenges = `, ${challenges.trim()}`.split(", Bearer ").filter((x) => x);
    return bearerChallenges.map((challenge) => {
        const challengeParts = `${challenge.trim()}, `.split('", ').filter((x) => x);
        const keyValuePairs = challengeParts.map((keyValue) => (([key, value]) => ({ [key]: value }))(keyValue.trim().split('="')));
        // Key-value pairs to plain object:
        return keyValuePairs.reduce((a, b) => (Object.assign(Object.assign({}, a), b)), {});
    });
}
/**
 * This function can be used as a callback for the `bearerTokenAuthenticationPolicy` of `@azure/core-rest-pipeline`, to support CAE challenges:
 * [Continuous Access Evaluation](https://docs.microsoft.com/azure/active-directory/conditional-access/concept-continuous-access-evaluation).
 *
 * Call the `bearerTokenAuthenticationPolicy` with the following options:
 *
 * ```ts
 * import { bearerTokenAuthenticationPolicy } from "@azure/core-rest-pipeline";
 * import { authorizeRequestOnClaimChallenge } from "@azure/core-client";
 *
 * const bearerTokenAuthenticationPolicy = bearerTokenAuthenticationPolicy({
 *   authorizeRequestOnChallenge: authorizeRequestOnClaimChallenge
 * });
 * ```
 *
 * Once provided, the `bearerTokenAuthenticationPolicy` policy will internally handle Continuous Access Evaluation (CAE) challenges.
 * When it can't complete a challenge it will return the 401 (unauthorized) response from ARM.
 *
 * Example challenge with claims:
 *
 * ```
 * Bearer authorization_uri="https://login.windows-ppe.net/", error="invalid_token",
 * error_description="User session has been revoked",
 * claims="eyJhY2Nlc3NfdG9rZW4iOnsibmJmIjp7ImVzc2VudGlhbCI6dHJ1ZSwgInZhbHVlIjoiMTYwMzc0MjgwMCJ9fX0="
 * ```
 */
export async function authorizeRequestOnClaimChallenge(onChallengeOptions) {
    const { scopes, response } = onChallengeOptions;
    const logger = onChallengeOptions.logger || coreClientLogger;
    const challenge = response.headers.get("WWW-Authenticate");
    if (!challenge) {
        logger.info(`The WWW-Authenticate header was missing. Failed to perform the Continuous Access Evaluation authentication flow.`);
        return false;
    }
    const challenges = parseCAEChallenge(challenge) || [];
    const parsedChallenge = challenges.find((x) => x.claims);
    if (!parsedChallenge) {
        logger.info(`The WWW-Authenticate header was missing the necessary "claims" to perform the Continuous Access Evaluation authentication flow.`);
        return false;
    }
    const accessToken = await onChallengeOptions.getAccessToken(parsedChallenge.scope ? [parsedChallenge.scope] : scopes, {
        claims: decodeStringToString(parsedChallenge.claims),
    });
    if (!accessToken) {
        return false;
    }
    onChallengeOptions.request.headers.set("Authorization", `Bearer ${accessToken.token}`);
    return true;
}
//# sourceMappingURL=authorizeRequestOnClaimChallenge.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * A set of constants used internally when processing requests.
 */
const Constants = {
    DefaultScope: "/.default",
    /**
     * Defines constants for use with HTTP headers.
     */
    HeaderConstants: {
        /**
         * The Authorization header.
         */
        AUTHORIZATION: "authorization",
    },
};
/**
 * Defines a callback to handle auth challenge for Storage APIs.
 * This implements the bearer challenge process described here: https://docs.microsoft.com/rest/api/storageservices/authorize-with-azure-active-directory#bearer-challenge
 * Handling has specific features for storage that departs to the general AAD challenge docs.
 **/
export const authorizeRequestOnTenantChallenge = async (challengeOptions) => {
    const requestOptions = requestToOptions(challengeOptions.request);
    const challenge = getChallenge(challengeOptions.response);
    if (challenge) {
        const challengeInfo = parseChallenge(challenge);
        const challengeScopes = buildScopes(challengeOptions, challengeInfo);
        const tenantId = extractTenantId(challengeInfo);
        const accessToken = await challengeOptions.getAccessToken(challengeScopes, Object.assign(Object.assign({}, requestOptions), { tenantId }));
        if (!accessToken) {
            return false;
        }
        challengeOptions.request.headers.set(Constants.HeaderConstants.AUTHORIZATION, `Bearer ${accessToken.token}`);
        return true;
    }
    return false;
};
/**
 * Extracts the tenant id from the challenge information
 * The tenant id is contained in the authorization_uri as the first
 * path part.
 */
function extractTenantId(challengeInfo) {
    const parsedAuthUri = new URL(challengeInfo.authorization_uri);
    const pathSegments = parsedAuthUri.pathname.split("/");
    const tenantId = pathSegments[1];
    return tenantId;
}
/**
 * Builds the authentication scopes based on the information that comes in the
 * challenge information. Scopes url is present in the resource_id, if it is empty
 * we keep using the original scopes.
 */
function buildScopes(challengeOptions, challengeInfo) {
    if (!challengeInfo.resource_uri) {
        return challengeOptions.scopes;
    }
    const challengeScopes = new URL(challengeInfo.resource_uri);
    challengeScopes.pathname = Constants.DefaultScope;
    return [challengeScopes.toString()];
}
/**
 * We will retrieve the challenge only if the response status code was 401,
 * and if the response contained the header "WWW-Authenticate" with a non-empty value.
 */
function getChallenge(response) {
    const challenge = response.headers.get("WWW-Authenticate");
    if (response.status === 401 && challenge) {
        return challenge;
    }
    return;
}
/**
 * Converts: `Bearer a="b" c="d"`.
 * Into: `[ { a: 'b', c: 'd' }]`.
 *
 * @internal
 */
function parseChallenge(challenge) {
    const bearerChallenge = challenge.slice("Bearer ".length);
    const challengeParts = `${bearerChallenge.trim()} `.split(" ").filter((x) => x);
    const keyValuePairs = challengeParts.map((keyValue) => (([key, value]) => ({ [key]: value }))(keyValue.trim().split("=")));
    // Key-value pairs to plain object:
    return keyValuePairs.reduce((a, b) => (Object.assign(Object.assign({}, a), b)), {});
}
/**
 * Extracts the options form a Pipeline Request for later re-use
 */
function requestToOptions(request) {
    return {
        abortSignal: request.abortSignal,
        requestOptions: {
            timeout: request.timeout,
        },
        tracingOptions: request.tracingOptions,
    };
}
//# sourceMappingURL=authorizeRequestOnTenantChallenge.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Encodes a string in base64 format.
 * @param value - the string to encode
 */
export function encodeString(value) {
    return btoa(value);
}
/**
 * Encodes a byte array in base64 format.
 * @param value - the Uint8Aray to encode
 */
export function encodeByteArray(value) {
    let str = "";
    for (let i = 0; i < value.length; i++) {
        str += String.fromCharCode(value[i]);
    }
    return btoa(str);
}
/**
 * Decodes a base64 string into a byte array.
 * @param value - the base64 string to decode
 */
export function decodeString(value) {
    const byteString = atob(value);
    const arr = new Uint8Array(byteString.length);
    for (let i = 0; i < byteString.length; i++) {
        arr[i] = byteString.charCodeAt(i);
    }
    return arr;
}
/**
 * Decodes a base64 string into a string.
 * @param value - the base64 string to decode
 */
export function decodeStringToString(value) {
    return atob(value);
}
//# sourceMappingURL=base64.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Encodes a string in base64 format.
 * @param value - the string to encode
 * @internal
 */
export function encodeString(value) {
    return Buffer.from(value).toString("base64");
}
/**
 * Encodes a byte array in base64 format.
 * @param value - the Uint8Aray to encode
 * @internal
 */
export function encodeByteArray(value) {
    // Buffer.from accepts <ArrayBuffer> | <SharedArrayBuffer>-- the TypeScript definition is off here
    // https://nodejs.org/api/buffer.html#buffer_class_method_buffer_from_arraybuffer_byteoffset_length
    const bufferValue = value instanceof Buffer ? value : Buffer.from(value.buffer);
    return bufferValue.toString("base64");
}
/**
 * Decodes a base64 string into a byte array.
 * @param value - the base64 string to decode
 * @internal
 */
export function decodeString(value) {
    return Buffer.from(value, "base64");
}
/**
 * Decodes a base64 string into a string.
 * @param value - the base64 string to decode
 * @internal
 */
export function decodeStringToString(value) {
    return Buffer.from(value, "base64").toString();
}
//# sourceMappingURL=base64.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { XML_CHARKEY, } from "./interfaces";
import { RestError, } from "@azure/core-rest-pipeline";
import { MapperTypeNames } from "./serializer";
import { getOperationRequestInfo } from "./operationHelpers";
const defaultJsonContentTypes = ["application/json", "text/json"];
const defaultXmlContentTypes = ["application/xml", "application/atom+xml"];
/**
 * The programmatic identifier of the deserializationPolicy.
 */
export const deserializationPolicyName = "deserializationPolicy";
/**
 * This policy handles parsing out responses according to OperationSpecs on the request.
 */
export function deserializationPolicy(options = {}) {
    var _a, _b, _c, _d, _e, _f, _g;
    const jsonContentTypes = (_b = (_a = options.expectedContentTypes) === null || _a === void 0 ? void 0 : _a.json) !== null && _b !== void 0 ? _b : defaultJsonContentTypes;
    const xmlContentTypes = (_d = (_c = options.expectedContentTypes) === null || _c === void 0 ? void 0 : _c.xml) !== null && _d !== void 0 ? _d : defaultXmlContentTypes;
    const parseXML = options.parseXML;
    const serializerOptions = options.serializerOptions;
    const updatedOptions = {
        xml: {
            rootName: (_e = serializerOptions === null || serializerOptions === void 0 ? void 0 : serializerOptions.xml.rootName) !== null && _e !== void 0 ? _e : "",
            includeRoot: (_f = serializerOptions === null || serializerOptions === void 0 ? void 0 : serializerOptions.xml.includeRoot) !== null && _f !== void 0 ? _f : false,
            xmlCharKey: (_g = serializerOptions === null || serializerOptions === void 0 ? void 0 : serializerOptions.xml.xmlCharKey) !== null && _g !== void 0 ? _g : XML_CHARKEY,
        },
    };
    return {
        name: deserializationPolicyName,
        async sendRequest(request, next) {
            const response = await next(request);
            return deserializeResponseBody(jsonContentTypes, xmlContentTypes, response, updatedOptions, parseXML);
        },
    };
}
function getOperationResponseMap(parsedResponse) {
    let result;
    const request = parsedResponse.request;
    const operationInfo = getOperationRequestInfo(request);
    const operationSpec = operationInfo === null || operationInfo === void 0 ? void 0 : operationInfo.operationSpec;
    if (operationSpec) {
        if (!(operationInfo === null || operationInfo === void 0 ? void 0 : operationInfo.operationResponseGetter)) {
            result = operationSpec.responses[parsedResponse.status];
        }
        else {
            result = operationInfo === null || operationInfo === void 0 ? void 0 : operationInfo.operationResponseGetter(operationSpec, parsedResponse);
        }
    }
    return result;
}
function shouldDeserializeResponse(parsedResponse) {
    const request = parsedResponse.request;
    const operationInfo = getOperationRequestInfo(request);
    const shouldDeserialize = operationInfo === null || operationInfo === void 0 ? void 0 : operationInfo.shouldDeserialize;
    let result;
    if (shouldDeserialize === undefined) {
        result = true;
    }
    else if (typeof shouldDeserialize === "boolean") {
        result = shouldDeserialize;
    }
    else {
        result = shouldDeserialize(parsedResponse);
    }
    return result;
}
async function deserializeResponseBody(jsonContentTypes, xmlContentTypes, response, options, parseXML) {
    const parsedResponse = await parse(jsonContentTypes, xmlContentTypes, response, options, parseXML);
    if (!shouldDeserializeResponse(parsedResponse)) {
        return parsedResponse;
    }
    const operationInfo = getOperationRequestInfo(parsedResponse.request);
    const operationSpec = operationInfo === null || operationInfo === void 0 ? void 0 : operationInfo.operationSpec;
    if (!operationSpec || !operationSpec.responses) {
        return parsedResponse;
    }
    const responseSpec = getOperationResponseMap(parsedResponse);
    const { error, shouldReturnResponse } = handleErrorResponse(parsedResponse, operationSpec, responseSpec);
    if (error) {
        throw error;
    }
    else if (shouldReturnResponse) {
        return parsedResponse;
    }
    // An operation response spec does exist for current status code, so
    // use it to deserialize the response.
    if (responseSpec) {
        if (responseSpec.bodyMapper) {
            let valueToDeserialize = parsedResponse.parsedBody;
            if (operationSpec.isXML && responseSpec.bodyMapper.type.name === MapperTypeNames.Sequence) {
                valueToDeserialize =
                    typeof valueToDeserialize === "object"
                        ? valueToDeserialize[responseSpec.bodyMapper.xmlElementName]
                        : [];
            }
            try {
                parsedResponse.parsedBody = operationSpec.serializer.deserialize(responseSpec.bodyMapper, valueToDeserialize, "operationRes.parsedBody");
            }
            catch (deserializeError) {
                const restError = new RestError(`Error ${deserializeError} occurred in deserializing the responseBody - ${parsedResponse.bodyAsText}`, {
                    statusCode: parsedResponse.status,
                    request: parsedResponse.request,
                    response: parsedResponse,
                });
                throw restError;
            }
        }
        else if (operationSpec.httpMethod === "HEAD") {
            // head methods never have a body, but we return a boolean to indicate presence/absence of the resource
            parsedResponse.parsedBody = response.status >= 200 && response.status < 300;
        }
        if (responseSpec.headersMapper) {
            parsedResponse.parsedHeaders = operationSpec.serializer.deserialize(responseSpec.headersMapper, parsedResponse.headers.toJSON(), "operationRes.parsedHeaders");
        }
    }
    return parsedResponse;
}
function isOperationSpecEmpty(operationSpec) {
    const expectedStatusCodes = Object.keys(operationSpec.responses);
    return (expectedStatusCodes.length === 0 ||
        (expectedStatusCodes.length === 1 && expectedStatusCodes[0] === "default"));
}
function handleErrorResponse(parsedResponse, operationSpec, responseSpec) {
    var _a;
    const isSuccessByStatus = 200 <= parsedResponse.status && parsedResponse.status < 300;
    const isExpectedStatusCode = isOperationSpecEmpty(operationSpec)
        ? isSuccessByStatus
        : !!responseSpec;
    if (isExpectedStatusCode) {
        if (responseSpec) {
            if (!responseSpec.isError) {
                return { error: null, shouldReturnResponse: false };
            }
        }
        else {
            return { error: null, shouldReturnResponse: false };
        }
    }
    const errorResponseSpec = responseSpec !== null && responseSpec !== void 0 ? responseSpec : operationSpec.responses.default;
    const initialErrorMessage = ((_a = parsedResponse.request.streamResponseStatusCodes) === null || _a === void 0 ? void 0 : _a.has(parsedResponse.status))
        ? `Unexpected status code: ${parsedResponse.status}`
        : parsedResponse.bodyAsText;
    const error = new RestError(initialErrorMessage, {
        statusCode: parsedResponse.status,
        request: parsedResponse.request,
        response: parsedResponse,
    });
    // If the item failed but there's no error spec or default spec to deserialize the error,
    // we should fail so we just throw the parsed response
    if (!errorResponseSpec) {
        throw error;
    }
    const defaultBodyMapper = errorResponseSpec.bodyMapper;
    const defaultHeadersMapper = errorResponseSpec.headersMapper;
    try {
        // If error response has a body, try to deserialize it using default body mapper.
        // Then try to extract error code & message from it
        if (parsedResponse.parsedBody) {
            const parsedBody = parsedResponse.parsedBody;
            let deserializedError;
            if (defaultBodyMapper) {
                let valueToDeserialize = parsedBody;
                if (operationSpec.isXML && defaultBodyMapper.type.name === MapperTypeNames.Sequence) {
                    valueToDeserialize = [];
                    const elementName = defaultBodyMapper.xmlElementName;
                    if (typeof parsedBody === "object" && elementName) {
                        valueToDeserialize = parsedBody[elementName];
                    }
                }
                deserializedError = operationSpec.serializer.deserialize(defaultBodyMapper, valueToDeserialize, "error.response.parsedBody");
            }
            const internalError = parsedBody.error || deserializedError || parsedBody;
            error.code = internalError.code;
            if (internalError.message) {
                error.message = internalError.message;
            }
            if (defaultBodyMapper) {
                error.response.parsedBody = deserializedError;
            }
        }
        // If error response has headers, try to deserialize it using default header mapper
        if (parsedResponse.headers && defaultHeadersMapper) {
            error.response.parsedHeaders =
                operationSpec.serializer.deserialize(defaultHeadersMapper, parsedResponse.headers.toJSON(), "operationRes.parsedHeaders");
        }
    }
    catch (defaultError) {
        error.message = `Error "${defaultError.message}" occurred in deserializing the responseBody - "${parsedResponse.bodyAsText}" for the default response.`;
    }
    return { error, shouldReturnResponse: false };
}
async function parse(jsonContentTypes, xmlContentTypes, operationResponse, opts, parseXML) {
    var _a;
    if (!((_a = operationResponse.request.streamResponseStatusCodes) === null || _a === void 0 ? void 0 : _a.has(operationResponse.status)) &&
        operationResponse.bodyAsText) {
        const text = operationResponse.bodyAsText;
        const contentType = operationResponse.headers.get("Content-Type") || "";
        const contentComponents = !contentType
            ? []
            : contentType.split(";").map((component) => component.toLowerCase());
        try {
            if (contentComponents.length === 0 ||
                contentComponents.some((component) => jsonContentTypes.indexOf(component) !== -1)) {
                operationResponse.parsedBody = JSON.parse(text);
                return operationResponse;
            }
            else if (contentComponents.some((component) => xmlContentTypes.indexOf(component) !== -1)) {
                if (!parseXML) {
                    throw new Error("Parsing XML not supported.");
                }
                const body = await parseXML(text, opts.xml);
                operationResponse.parsedBody = body;
                return operationResponse;
            }
        }
        catch (err) {
            const msg = `Error "${err}" occurred while parsing the response body - ${operationResponse.bodyAsText}.`;
            const errCode = err.code || RestError.PARSE_ERROR;
            const e = new RestError(msg, {
                code: errCode,
                statusCode: operationResponse.status,
                request: operationResponse.request,
                response: operationResponse,
            });
            throw e;
        }
    }
    return operationResponse;
}
//# sourceMappingURL=deserializationPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createDefaultHttpClient } from "@azure/core-rest-pipeline";
let cachedHttpClient;
export function getCachedDefaultHttpClient() {
    if (!cachedHttpClient) {
        cachedHttpClient = createDefaultHttpClient();
    }
    return cachedHttpClient;
}
//# sourceMappingURL=httpClientCache.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export { createSerializer, MapperTypeNames } from "./serializer";
export { ServiceClient } from "./serviceClient";
export { createClientPipeline } from "./pipeline";
export { XML_ATTRKEY, XML_CHARKEY, } from "./interfaces";
export { deserializationPolicy, deserializationPolicyName, } from "./deserializationPolicy";
export { serializationPolicy, serializationPolicyName, } from "./serializationPolicy";
export { authorizeRequestOnClaimChallenge } from "./authorizeRequestOnClaimChallenge";
export { authorizeRequestOnTenantChallenge } from "./authorizeRequestOnTenantChallenge";
//# sourceMappingURL=index.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { MapperTypeNames } from "./serializer";
/**
 * Gets the list of status codes for streaming responses.
 * @internal
 */
export function getStreamingResponseStatusCodes(operationSpec) {
    const result = new Set();
    for (const statusCode in operationSpec.responses) {
        const operationResponse = operationSpec.responses[statusCode];
        if (operationResponse.bodyMapper &&
            operationResponse.bodyMapper.type.name === MapperTypeNames.Stream) {
            result.add(Number(statusCode));
        }
    }
    return result;
}
/**
 * Get the path to this parameter's value as a dotted string (a.b.c).
 * @param parameter - The parameter to get the path string for.
 * @returns The path to this parameter's value as a dotted string.
 * @internal
 */
export function getPathStringFromParameter(parameter) {
    const { parameterPath, mapper } = parameter;
    let result;
    if (typeof parameterPath === "string") {
        result = parameterPath;
    }
    else if (Array.isArray(parameterPath)) {
        result = parameterPath.join(".");
    }
    else {
        result = mapper.serializedName;
    }
    return result;
}
//# sourceMappingURL=interfaceHelpers.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Default key used to access the XML attributes.
 */
export const XML_ATTRKEY = "$";
/**
 * Default key used to access the XML value content.
 */
export const XML_CHARKEY = "_";
//# sourceMappingURL=interfaces.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createClientLogger } from "@azure/logger";
export const logger = createClientLogger("core-client");
//# sourceMappingURL=log.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * @internal
 * Retrieves the value to use for a given operation argument
 * @param operationArguments - The arguments passed from the generated client
 * @param parameter - The parameter description
 * @param fallbackObject - If something isn't found in the arguments bag, look here.
 *  Generally used to look at the service client properties.
 */
export function getOperationArgumentValueFromParameter(operationArguments, parameter, fallbackObject) {
    let parameterPath = parameter.parameterPath;
    const parameterMapper = parameter.mapper;
    let value;
    if (typeof parameterPath === "string") {
        parameterPath = [parameterPath];
    }
    if (Array.isArray(parameterPath)) {
        if (parameterPath.length > 0) {
            if (parameterMapper.isConstant) {
                value = parameterMapper.defaultValue;
            }
            else {
                let propertySearchResult = getPropertyFromParameterPath(operationArguments, parameterPath);
                if (!propertySearchResult.propertyFound && fallbackObject) {
                    propertySearchResult = getPropertyFromParameterPath(fallbackObject, parameterPath);
                }
                let useDefaultValue = false;
                if (!propertySearchResult.propertyFound) {
                    useDefaultValue =
                        parameterMapper.required ||
                            (parameterPath[0] === "options" && parameterPath.length === 2);
                }
                value = useDefaultValue ? parameterMapper.defaultValue : propertySearchResult.propertyValue;
            }
        }
    }
    else {
        if (parameterMapper.required) {
            value = {};
        }
        for (const propertyName in parameterPath) {
            const propertyMapper = parameterMapper.type.modelProperties[propertyName];
            const propertyPath = parameterPath[propertyName];
            const propertyValue = getOperationArgumentValueFromParameter(operationArguments, {
                parameterPath: propertyPath,
                mapper: propertyMapper,
            }, fallbackObject);
            if (propertyValue !== undefined) {
                if (!value) {
                    value = {};
                }
                value[propertyName] = propertyValue;
            }
        }
    }
    return value;
}
function getPropertyFromParameterPath(parent, parameterPath) {
    const result = { propertyFound: false };
    let i = 0;
    for (; i < parameterPath.length; ++i) {
        const parameterPathPart = parameterPath[i];
        // Make sure to check inherited properties too, so don't use hasOwnProperty().
        if (parent && parameterPathPart in parent) {
            parent = parent[parameterPathPart];
        }
        else {
            break;
        }
    }
    if (i === parameterPath.length) {
        result.propertyValue = parent;
        result.propertyFound = true;
    }
    return result;
}
const operationRequestMap = new WeakMap();
export function getOperationRequestInfo(request) {
    let info = operationRequestMap.get(request);
    if (!info) {
        info = {};
        operationRequestMap.set(request, info);
    }
    return info;
}
//# sourceMappingURL=operationHelpers.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { deserializationPolicy } from "./deserializationPolicy";
import { bearerTokenAuthenticationPolicy, createPipelineFromOptions, } from "@azure/core-rest-pipeline";
import { serializationPolicy } from "./serializationPolicy";
/**
 * Creates a new Pipeline for use with a Service Client.
 * Adds in deserializationPolicy by default.
 * Also adds in bearerTokenAuthenticationPolicy if passed a TokenCredential.
 * @param options - Options to customize the created pipeline.
 */
export function createClientPipeline(options = {}) {
    const pipeline = createPipelineFromOptions(options !== null && options !== void 0 ? options : {});
    if (options.credentialOptions) {
        pipeline.addPolicy(bearerTokenAuthenticationPolicy({
            credential: options.credentialOptions.credential,
            scopes: options.credentialOptions.credentialScopes,
        }));
    }
    pipeline.addPolicy(serializationPolicy(options.serializationOptions), { phase: "Serialize" });
    pipeline.addPolicy(deserializationPolicy(options.deserializationOptions), {
        phase: "Deserialize",
    });
    return pipeline;
}
//# sourceMappingURL=pipeline.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { XML_ATTRKEY, XML_CHARKEY, } from "./interfaces";
import { getOperationArgumentValueFromParameter, getOperationRequestInfo, } from "./operationHelpers";
import { MapperTypeNames } from "./serializer";
import { getPathStringFromParameter } from "./interfaceHelpers";
/**
 * The programmatic identifier of the serializationPolicy.
 */
export const serializationPolicyName = "serializationPolicy";
/**
 * This policy handles assembling the request body and headers using
 * an OperationSpec and OperationArguments on the request.
 */
export function serializationPolicy(options = {}) {
    const stringifyXML = options.stringifyXML;
    return {
        name: serializationPolicyName,
        async sendRequest(request, next) {
            const operationInfo = getOperationRequestInfo(request);
            const operationSpec = operationInfo === null || operationInfo === void 0 ? void 0 : operationInfo.operationSpec;
            const operationArguments = operationInfo === null || operationInfo === void 0 ? void 0 : operationInfo.operationArguments;
            if (operationSpec && operationArguments) {
                serializeHeaders(request, operationArguments, operationSpec);
                serializeRequestBody(request, operationArguments, operationSpec, stringifyXML);
            }
            return next(request);
        },
    };
}
/**
 * @internal
 */
export function serializeHeaders(request, operationArguments, operationSpec) {
    var _a, _b;
    if (operationSpec.headerParameters) {
        for (const headerParameter of operationSpec.headerParameters) {
            let headerValue = getOperationArgumentValueFromParameter(operationArguments, headerParameter);
            if ((headerValue !== null && headerValue !== undefined) || headerParameter.mapper.required) {
                headerValue = operationSpec.serializer.serialize(headerParameter.mapper, headerValue, getPathStringFromParameter(headerParameter));
                const headerCollectionPrefix = headerParameter.mapper
                    .headerCollectionPrefix;
                if (headerCollectionPrefix) {
                    for (const key of Object.keys(headerValue)) {
                        request.headers.set(headerCollectionPrefix + key, headerValue[key]);
                    }
                }
                else {
                    request.headers.set(headerParameter.mapper.serializedName || getPathStringFromParameter(headerParameter), headerValue);
                }
            }
        }
    }
    const customHeaders = (_b = (_a = operationArguments.options) === null || _a === void 0 ? void 0 : _a.requestOptions) === null || _b === void 0 ? void 0 : _b.customHeaders;
    if (customHeaders) {
        for (const customHeaderName of Object.keys(customHeaders)) {
            request.headers.set(customHeaderName, customHeaders[customHeaderName]);
        }
    }
}
/**
 * @internal
 */
export function serializeRequestBody(request, operationArguments, operationSpec, stringifyXML = function () {
    throw new Error("XML serialization unsupported!");
}) {
    var _a, _b, _c, _d, _e;
    const serializerOptions = (_a = operationArguments.options) === null || _a === void 0 ? void 0 : _a.serializerOptions;
    const updatedOptions = {
        xml: {
            rootName: (_b = serializerOptions === null || serializerOptions === void 0 ? void 0 : serializerOptions.xml.rootName) !== null && _b !== void 0 ? _b : "",
            includeRoot: (_c = serializerOptions === null || serializerOptions === void 0 ? void 0 : serializerOptions.xml.includeRoot) !== null && _c !== void 0 ? _c : false,
            xmlCharKey: (_d = serializerOptions === null || serializerOptions === void 0 ? void 0 : serializerOptions.xml.xmlCharKey) !== null && _d !== void 0 ? _d : XML_CHARKEY,
        },
    };
    const xmlCharKey = updatedOptions.xml.xmlCharKey;
    if (operationSpec.requestBody && operationSpec.requestBody.mapper) {
        request.body = getOperationArgumentValueFromParameter(operationArguments, operationSpec.requestBody);
        const bodyMapper = operationSpec.requestBody.mapper;
        const { required, serializedName, xmlName, xmlElementName, xmlNamespace, xmlNamespacePrefix, nullable, } = bodyMapper;
        const typeName = bodyMapper.type.name;
        try {
            if ((request.body !== undefined && request.body !== null) ||
                (nullable && request.body === null) ||
                required) {
                const requestBodyParameterPathString = getPathStringFromParameter(operationSpec.requestBody);
                request.body = operationSpec.serializer.serialize(bodyMapper, request.body, requestBodyParameterPathString, updatedOptions);
                const isStream = typeName === MapperTypeNames.Stream;
                if (operationSpec.isXML) {
                    const xmlnsKey = xmlNamespacePrefix ? `xmlns:${xmlNamespacePrefix}` : "xmlns";
                    const value = getXmlValueWithNamespace(xmlNamespace, xmlnsKey, typeName, request.body, updatedOptions);
                    if (typeName === MapperTypeNames.Sequence) {
                        request.body = stringifyXML(prepareXMLRootList(value, xmlElementName || xmlName || serializedName, xmlnsKey, xmlNamespace), { rootName: xmlName || serializedName, xmlCharKey });
                    }
                    else if (!isStream) {
                        request.body = stringifyXML(value, {
                            rootName: xmlName || serializedName,
                            xmlCharKey,
                        });
                    }
                }
                else if (typeName === MapperTypeNames.String &&
                    (((_e = operationSpec.contentType) === null || _e === void 0 ? void 0 : _e.match("text/plain")) || operationSpec.mediaType === "text")) {
                    // the String serializer has validated that request body is a string
                    // so just send the string.
                    return;
                }
                else if (!isStream) {
                    request.body = JSON.stringify(request.body);
                }
            }
        }
        catch (error) {
            throw new Error(`Error "${error.message}" occurred in serializing the payload - ${JSON.stringify(serializedName, undefined, "  ")}.`);
        }
    }
    else if (operationSpec.formDataParameters && operationSpec.formDataParameters.length > 0) {
        request.formData = {};
        for (const formDataParameter of operationSpec.formDataParameters) {
            const formDataParameterValue = getOperationArgumentValueFromParameter(operationArguments, formDataParameter);
            if (formDataParameterValue !== undefined && formDataParameterValue !== null) {
                const formDataParameterPropertyName = formDataParameter.mapper.serializedName || getPathStringFromParameter(formDataParameter);
                request.formData[formDataParameterPropertyName] = operationSpec.serializer.serialize(formDataParameter.mapper, formDataParameterValue, getPathStringFromParameter(formDataParameter), updatedOptions);
            }
        }
    }
}
/**
 * Adds an xml namespace to the xml serialized object if needed, otherwise it just returns the value itself
 */
function getXmlValueWithNamespace(xmlNamespace, xmlnsKey, typeName, serializedValue, options) {
    // Composite and Sequence schemas already got their root namespace set during serialization
    // We just need to add xmlns to the other schema types
    if (xmlNamespace && !["Composite", "Sequence", "Dictionary"].includes(typeName)) {
        const result = {};
        result[options.xml.xmlCharKey] = serializedValue;
        result[XML_ATTRKEY] = { [xmlnsKey]: xmlNamespace };
        return result;
    }
    return serializedValue;
}
function prepareXMLRootList(obj, elementName, xmlNamespaceKey, xmlNamespace) {
    if (!Array.isArray(obj)) {
        obj = [obj];
    }
    if (!xmlNamespaceKey || !xmlNamespace) {
        return { [elementName]: obj };
    }
    const result = { [elementName]: obj };
    result[XML_ATTRKEY] = { [xmlNamespaceKey]: xmlNamespace };
    return result;
}
//# sourceMappingURL=serializationPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import * as base64 from "./base64";
import { XML_ATTRKEY, XML_CHARKEY, } from "./interfaces";
import { isDuration, isValidUuid } from "./utils";
class SerializerImpl {
    constructor(modelMappers = {}, isXML = false) {
        this.modelMappers = modelMappers;
        this.isXML = isXML;
    }
    validateConstraints(mapper, value, objectName) {
        const failValidation = (constraintName, constraintValue) => {
            throw new Error(`"${objectName}" with value "${value}" should satisfy the constraint "${constraintName}": ${constraintValue}.`);
        };
        if (mapper.constraints && value !== undefined && value !== null) {
            const { ExclusiveMaximum, ExclusiveMinimum, InclusiveMaximum, InclusiveMinimum, MaxItems, MaxLength, MinItems, MinLength, MultipleOf, Pattern, UniqueItems, } = mapper.constraints;
            if (ExclusiveMaximum !== undefined && value >= ExclusiveMaximum) {
                failValidation("ExclusiveMaximum", ExclusiveMaximum);
            }
            if (ExclusiveMinimum !== undefined && value <= ExclusiveMinimum) {
                failValidation("ExclusiveMinimum", ExclusiveMinimum);
            }
            if (InclusiveMaximum !== undefined && value > InclusiveMaximum) {
                failValidation("InclusiveMaximum", InclusiveMaximum);
            }
            if (InclusiveMinimum !== undefined && value < InclusiveMinimum) {
                failValidation("InclusiveMinimum", InclusiveMinimum);
            }
            if (MaxItems !== undefined && value.length > MaxItems) {
                failValidation("MaxItems", MaxItems);
            }
            if (MaxLength !== undefined && value.length > MaxLength) {
                failValidation("MaxLength", MaxLength);
            }
            if (MinItems !== undefined && value.length < MinItems) {
                failValidation("MinItems", MinItems);
            }
            if (MinLength !== undefined && value.length < MinLength) {
                failValidation("MinLength", MinLength);
            }
            if (MultipleOf !== undefined && value % MultipleOf !== 0) {
                failValidation("MultipleOf", MultipleOf);
            }
            if (Pattern) {
                const pattern = typeof Pattern === "string" ? new RegExp(Pattern) : Pattern;
                if (typeof value !== "string" || value.match(pattern) === null) {
                    failValidation("Pattern", Pattern);
                }
            }
            if (UniqueItems &&
                value.some((item, i, ar) => ar.indexOf(item) !== i)) {
                failValidation("UniqueItems", UniqueItems);
            }
        }
    }
    /**
     * Serialize the given object based on its metadata defined in the mapper
     *
     * @param mapper - The mapper which defines the metadata of the serializable object
     *
     * @param object - A valid Javascript object to be serialized
     *
     * @param objectName - Name of the serialized object
     *
     * @param options - additional options to serialization
     *
     * @returns A valid serialized Javascript object
     */
    serialize(mapper, object, objectName, options = { xml: {} }) {
        var _a, _b, _c;
        const updatedOptions = {
            xml: {
                rootName: (_a = options.xml.rootName) !== null && _a !== void 0 ? _a : "",
                includeRoot: (_b = options.xml.includeRoot) !== null && _b !== void 0 ? _b : false,
                xmlCharKey: (_c = options.xml.xmlCharKey) !== null && _c !== void 0 ? _c : XML_CHARKEY,
            },
        };
        let payload = {};
        const mapperType = mapper.type.name;
        if (!objectName) {
            objectName = mapper.serializedName;
        }
        if (mapperType.match(/^Sequence$/i) !== null) {
            payload = [];
        }
        if (mapper.isConstant) {
            object = mapper.defaultValue;
        }
        // This table of allowed values should help explain
        // the mapper.required and mapper.nullable properties.
        // X means "neither undefined or null are allowed".
        //           || required
        //           || true      | false
        //  nullable || ==========================
        //      true || null      | undefined/null
        //     false || X         | undefined
        // undefined || X         | undefined/null
        const { required, nullable } = mapper;
        if (required && nullable && object === undefined) {
            throw new Error(`${objectName} cannot be undefined.`);
        }
        if (required && !nullable && (object === undefined || object === null)) {
            throw new Error(`${objectName} cannot be null or undefined.`);
        }
        if (!required && nullable === false && object === null) {
            throw new Error(`${objectName} cannot be null.`);
        }
        if (object === undefined || object === null) {
            payload = object;
        }
        else {
            // Validate Constraints if any
            this.validateConstraints(mapper, object, objectName);
            if (mapperType.match(/^any$/i) !== null) {
                payload = object;
            }
            else if (mapperType.match(/^(Number|String|Boolean|Object|Stream|Uuid)$/i) !== null) {
                payload = serializeBasicTypes(mapperType, objectName, object);
            }
            else if (mapperType.match(/^Enum$/i) !== null) {
                const enumMapper = mapper;
                payload = serializeEnumType(objectName, enumMapper.type.allowedValues, object);
            }
            else if (mapperType.match(/^(Date|DateTime|TimeSpan|DateTimeRfc1123|UnixTime)$/i) !== null) {
                payload = serializeDateTypes(mapperType, object, objectName);
            }
            else if (mapperType.match(/^ByteArray$/i) !== null) {
                payload = serializeByteArrayType(objectName, object);
            }
            else if (mapperType.match(/^Base64Url$/i) !== null) {
                payload = serializeBase64UrlType(objectName, object);
            }
            else if (mapperType.match(/^Sequence$/i) !== null) {
                payload = serializeSequenceType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions);
            }
            else if (mapperType.match(/^Dictionary$/i) !== null) {
                payload = serializeDictionaryType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions);
            }
            else if (mapperType.match(/^Composite$/i) !== null) {
                payload = serializeCompositeType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions);
            }
        }
        return payload;
    }
    /**
     * Deserialize the given object based on its metadata defined in the mapper
     *
     * @param mapper - The mapper which defines the metadata of the serializable object
     *
     * @param responseBody - A valid Javascript entity to be deserialized
     *
     * @param objectName - Name of the deserialized object
     *
     * @param options - Controls behavior of XML parser and builder.
     *
     * @returns A valid deserialized Javascript object
     */
    deserialize(mapper, responseBody, objectName, options = { xml: {} }) {
        var _a, _b, _c;
        const updatedOptions = {
            xml: {
                rootName: (_a = options.xml.rootName) !== null && _a !== void 0 ? _a : "",
                includeRoot: (_b = options.xml.includeRoot) !== null && _b !== void 0 ? _b : false,
                xmlCharKey: (_c = options.xml.xmlCharKey) !== null && _c !== void 0 ? _c : XML_CHARKEY,
            },
        };
        if (responseBody === undefined || responseBody === null) {
            if (this.isXML && mapper.type.name === "Sequence" && !mapper.xmlIsWrapped) {
                // Edge case for empty XML non-wrapped lists. xml2js can't distinguish
                // between the list being empty versus being missing,
                // so let's do the more user-friendly thing and return an empty list.
                responseBody = [];
            }
            // specifically check for undefined as default value can be a falsey value `0, "", false, null`
            if (mapper.defaultValue !== undefined) {
                responseBody = mapper.defaultValue;
            }
            return responseBody;
        }
        let payload;
        const mapperType = mapper.type.name;
        if (!objectName) {
            objectName = mapper.serializedName;
        }
        if (mapperType.match(/^Composite$/i) !== null) {
            payload = deserializeCompositeType(this, mapper, responseBody, objectName, updatedOptions);
        }
        else {
            if (this.isXML) {
                const xmlCharKey = updatedOptions.xml.xmlCharKey;
                /**
                 * If the mapper specifies this as a non-composite type value but the responseBody contains
                 * both header ("$" i.e., XML_ATTRKEY) and body ("#" i.e., XML_CHARKEY) properties,
                 * then just reduce the responseBody value to the body ("#" i.e., XML_CHARKEY) property.
                 */
                if (responseBody[XML_ATTRKEY] !== undefined && responseBody[xmlCharKey] !== undefined) {
                    responseBody = responseBody[xmlCharKey];
                }
            }
            if (mapperType.match(/^Number$/i) !== null) {
                payload = parseFloat(responseBody);
                if (isNaN(payload)) {
                    payload = responseBody;
                }
            }
            else if (mapperType.match(/^Boolean$/i) !== null) {
                if (responseBody === "true") {
                    payload = true;
                }
                else if (responseBody === "false") {
                    payload = false;
                }
                else {
                    payload = responseBody;
                }
            }
            else if (mapperType.match(/^(String|Enum|Object|Stream|Uuid|TimeSpan|any)$/i) !== null) {
                payload = responseBody;
            }
            else if (mapperType.match(/^(Date|DateTime|DateTimeRfc1123)$/i) !== null) {
                payload = new Date(responseBody);
            }
            else if (mapperType.match(/^UnixTime$/i) !== null) {
                payload = unixTimeToDate(responseBody);
            }
            else if (mapperType.match(/^ByteArray$/i) !== null) {
                payload = base64.decodeString(responseBody);
            }
            else if (mapperType.match(/^Base64Url$/i) !== null) {
                payload = base64UrlToByteArray(responseBody);
            }
            else if (mapperType.match(/^Sequence$/i) !== null) {
                payload = deserializeSequenceType(this, mapper, responseBody, objectName, updatedOptions);
            }
            else if (mapperType.match(/^Dictionary$/i) !== null) {
                payload = deserializeDictionaryType(this, mapper, responseBody, objectName, updatedOptions);
            }
        }
        if (mapper.isConstant) {
            payload = mapper.defaultValue;
        }
        return payload;
    }
}
/**
 * Method that creates and returns a Serializer.
 * @param modelMappers - Known models to map
 * @param isXML - If XML should be supported
 */
export function createSerializer(modelMappers = {}, isXML = false) {
    return new SerializerImpl(modelMappers, isXML);
}
function trimEnd(str, ch) {
    let len = str.length;
    while (len - 1 >= 0 && str[len - 1] === ch) {
        --len;
    }
    return str.substr(0, len);
}
function bufferToBase64Url(buffer) {
    if (!buffer) {
        return undefined;
    }
    if (!(buffer instanceof Uint8Array)) {
        throw new Error(`Please provide an input of type Uint8Array for converting to Base64Url.`);
    }
    // Uint8Array to Base64.
    const str = base64.encodeByteArray(buffer);
    // Base64 to Base64Url.
    return trimEnd(str, "=").replace(/\+/g, "-").replace(/\//g, "_");
}
function base64UrlToByteArray(str) {
    if (!str) {
        return undefined;
    }
    if (str && typeof str.valueOf() !== "string") {
        throw new Error("Please provide an input of type string for converting to Uint8Array");
    }
    // Base64Url to Base64.
    str = str.replace(/-/g, "+").replace(/_/g, "/");
    // Base64 to Uint8Array.
    return base64.decodeString(str);
}
function splitSerializeName(prop) {
    const classes = [];
    let partialclass = "";
    if (prop) {
        const subwords = prop.split(".");
        for (const item of subwords) {
            if (item.charAt(item.length - 1) === "\\") {
                partialclass += item.substr(0, item.length - 1) + ".";
            }
            else {
                partialclass += item;
                classes.push(partialclass);
                partialclass = "";
            }
        }
    }
    return classes;
}
function dateToUnixTime(d) {
    if (!d) {
        return undefined;
    }
    if (typeof d.valueOf() === "string") {
        d = new Date(d);
    }
    return Math.floor(d.getTime() / 1000);
}
function unixTimeToDate(n) {
    if (!n) {
        return undefined;
    }
    return new Date(n * 1000);
}
function serializeBasicTypes(typeName, objectName, value) {
    if (value !== null && value !== undefined) {
        if (typeName.match(/^Number$/i) !== null) {
            if (typeof value !== "number") {
                throw new Error(`${objectName} with value ${value} must be of type number.`);
            }
        }
        else if (typeName.match(/^String$/i) !== null) {
            if (typeof value.valueOf() !== "string") {
                throw new Error(`${objectName} with value "${value}" must be of type string.`);
            }
        }
        else if (typeName.match(/^Uuid$/i) !== null) {
            if (!(typeof value.valueOf() === "string" && isValidUuid(value))) {
                throw new Error(`${objectName} with value "${value}" must be of type string and a valid uuid.`);
            }
        }
        else if (typeName.match(/^Boolean$/i) !== null) {
            if (typeof value !== "boolean") {
                throw new Error(`${objectName} with value ${value} must be of type boolean.`);
            }
        }
        else if (typeName.match(/^Stream$/i) !== null) {
            const objectType = typeof value;
            if (objectType !== "string" &&
                typeof value.pipe !== "function" &&
                !(value instanceof ArrayBuffer) &&
                !ArrayBuffer.isView(value) &&
                // File objects count as a type of Blob, so we want to use instanceof explicitly
                !((typeof Blob === "function" || typeof Blob === "object") && value instanceof Blob)) {
                throw new Error(`${objectName} must be a string, Blob, ArrayBuffer, ArrayBufferView, or NodeJS.ReadableStream.`);
            }
        }
    }
    return value;
}
function serializeEnumType(objectName, allowedValues, value) {
    if (!allowedValues) {
        throw new Error(`Please provide a set of allowedValues to validate ${objectName} as an Enum Type.`);
    }
    const isPresent = allowedValues.some((item) => {
        if (typeof item.valueOf() === "string") {
            return item.toLowerCase() === value.toLowerCase();
        }
        return item === value;
    });
    if (!isPresent) {
        throw new Error(`${value} is not a valid value for ${objectName}. The valid values are: ${JSON.stringify(allowedValues)}.`);
    }
    return value;
}
function serializeByteArrayType(objectName, value) {
    if (value !== undefined && value !== null) {
        if (!(value instanceof Uint8Array)) {
            throw new Error(`${objectName} must be of type Uint8Array.`);
        }
        value = base64.encodeByteArray(value);
    }
    return value;
}
function serializeBase64UrlType(objectName, value) {
    if (value !== undefined && value !== null) {
        if (!(value instanceof Uint8Array)) {
            throw new Error(`${objectName} must be of type Uint8Array.`);
        }
        value = bufferToBase64Url(value);
    }
    return value;
}
function serializeDateTypes(typeName, value, objectName) {
    if (value !== undefined && value !== null) {
        if (typeName.match(/^Date$/i) !== null) {
            if (!(value instanceof Date ||
                (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
                throw new Error(`${objectName} must be an instanceof Date or a string in ISO8601 format.`);
            }
            value =
                value instanceof Date
                    ? value.toISOString().substring(0, 10)
                    : new Date(value).toISOString().substring(0, 10);
        }
        else if (typeName.match(/^DateTime$/i) !== null) {
            if (!(value instanceof Date ||
                (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
                throw new Error(`${objectName} must be an instanceof Date or a string in ISO8601 format.`);
            }
            value = value instanceof Date ? value.toISOString() : new Date(value).toISOString();
        }
        else if (typeName.match(/^DateTimeRfc1123$/i) !== null) {
            if (!(value instanceof Date ||
                (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
                throw new Error(`${objectName} must be an instanceof Date or a string in RFC-1123 format.`);
            }
            value = value instanceof Date ? value.toUTCString() : new Date(value).toUTCString();
        }
        else if (typeName.match(/^UnixTime$/i) !== null) {
            if (!(value instanceof Date ||
                (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
                throw new Error(`${objectName} must be an instanceof Date or a string in RFC-1123/ISO8601 format ` +
                    `for it to be serialized in UnixTime/Epoch format.`);
            }
            value = dateToUnixTime(value);
        }
        else if (typeName.match(/^TimeSpan$/i) !== null) {
            if (!isDuration(value)) {
                throw new Error(`${objectName} must be a string in ISO 8601 format. Instead was "${value}".`);
            }
        }
    }
    return value;
}
function serializeSequenceType(serializer, mapper, object, objectName, isXml, options) {
    var _a;
    if (!Array.isArray(object)) {
        throw new Error(`${objectName} must be of type Array.`);
    }
    let elementType = mapper.type.element;
    if (!elementType || typeof elementType !== "object") {
        throw new Error(`element" metadata for an Array must be defined in the ` +
            `mapper and it must of type "object" in ${objectName}.`);
    }
    // Quirk: Composite mappers referenced by `element` might
    // not have *all* properties declared (like uberParent),
    // so let's try to look up the full definition by name.
    if (elementType.type.name === "Composite" && elementType.type.className) {
        elementType = (_a = serializer.modelMappers[elementType.type.className]) !== null && _a !== void 0 ? _a : elementType;
    }
    const tempArray = [];
    for (let i = 0; i < object.length; i++) {
        const serializedValue = serializer.serialize(elementType, object[i], objectName, options);
        if (isXml && elementType.xmlNamespace) {
            const xmlnsKey = elementType.xmlNamespacePrefix
                ? `xmlns:${elementType.xmlNamespacePrefix}`
                : "xmlns";
            if (elementType.type.name === "Composite") {
                tempArray[i] = Object.assign({}, serializedValue);
                tempArray[i][XML_ATTRKEY] = { [xmlnsKey]: elementType.xmlNamespace };
            }
            else {
                tempArray[i] = {};
                tempArray[i][options.xml.xmlCharKey] = serializedValue;
                tempArray[i][XML_ATTRKEY] = { [xmlnsKey]: elementType.xmlNamespace };
            }
        }
        else {
            tempArray[i] = serializedValue;
        }
    }
    return tempArray;
}
function serializeDictionaryType(serializer, mapper, object, objectName, isXml, options) {
    if (typeof object !== "object") {
        throw new Error(`${objectName} must be of type object.`);
    }
    const valueType = mapper.type.value;
    if (!valueType || typeof valueType !== "object") {
        throw new Error(`"value" metadata for a Dictionary must be defined in the ` +
            `mapper and it must of type "object" in ${objectName}.`);
    }
    const tempDictionary = {};
    for (const key of Object.keys(object)) {
        const serializedValue = serializer.serialize(valueType, object[key], objectName, options);
        // If the element needs an XML namespace we need to add it within the $ property
        tempDictionary[key] = getXmlObjectValue(valueType, serializedValue, isXml, options);
    }
    // Add the namespace to the root element if needed
    if (isXml && mapper.xmlNamespace) {
        const xmlnsKey = mapper.xmlNamespacePrefix ? `xmlns:${mapper.xmlNamespacePrefix}` : "xmlns";
        const result = tempDictionary;
        result[XML_ATTRKEY] = { [xmlnsKey]: mapper.xmlNamespace };
        return result;
    }
    return tempDictionary;
}
/**
 * Resolves the additionalProperties property from a referenced mapper
 * @param serializer - the serializer containing the entire set of mappers
 * @param mapper - the composite mapper to resolve
 * @param objectName - name of the object being serialized
 */
function resolveAdditionalProperties(serializer, mapper, objectName) {
    const additionalProperties = mapper.type.additionalProperties;
    if (!additionalProperties && mapper.type.className) {
        const modelMapper = resolveReferencedMapper(serializer, mapper, objectName);
        return modelMapper === null || modelMapper === void 0 ? void 0 : modelMapper.type.additionalProperties;
    }
    return additionalProperties;
}
/**
 * Finds the mapper referenced by className
 * @param serializer - the serializer containing the entire set of mappers
 * @param mapper - the composite mapper to resolve
 * @param objectName - name of the object being serialized
 */
function resolveReferencedMapper(serializer, mapper, objectName) {
    const className = mapper.type.className;
    if (!className) {
        throw new Error(`Class name for model "${objectName}" is not provided in the mapper "${JSON.stringify(mapper, undefined, 2)}".`);
    }
    return serializer.modelMappers[className];
}
/**
 * Resolves a composite mapper's modelProperties.
 * @param serializer - the serializer containing the entire set of mappers
 * @param mapper - the composite mapper to resolve
 */
function resolveModelProperties(serializer, mapper, objectName) {
    let modelProps = mapper.type.modelProperties;
    if (!modelProps) {
        const modelMapper = resolveReferencedMapper(serializer, mapper, objectName);
        if (!modelMapper) {
            throw new Error(`mapper() cannot be null or undefined for model "${mapper.type.className}".`);
        }
        modelProps = modelMapper === null || modelMapper === void 0 ? void 0 : modelMapper.type.modelProperties;
        if (!modelProps) {
            throw new Error(`modelProperties cannot be null or undefined in the ` +
                `mapper "${JSON.stringify(modelMapper)}" of type "${mapper.type.className}" for object "${objectName}".`);
        }
    }
    return modelProps;
}
function serializeCompositeType(serializer, mapper, object, objectName, isXml, options) {
    if (getPolymorphicDiscriminatorRecursively(serializer, mapper)) {
        mapper = getPolymorphicMapper(serializer, mapper, object, "clientName");
    }
    if (object !== undefined && object !== null) {
        const payload = {};
        const modelProps = resolveModelProperties(serializer, mapper, objectName);
        for (const key of Object.keys(modelProps)) {
            const propertyMapper = modelProps[key];
            if (propertyMapper.readOnly) {
                continue;
            }
            let propName;
            let parentObject = payload;
            if (serializer.isXML) {
                if (propertyMapper.xmlIsWrapped) {
                    propName = propertyMapper.xmlName;
                }
                else {
                    propName = propertyMapper.xmlElementName || propertyMapper.xmlName;
                }
            }
            else {
                const paths = splitSerializeName(propertyMapper.serializedName);
                propName = paths.pop();
                for (const pathName of paths) {
                    const childObject = parentObject[pathName];
                    if ((childObject === undefined || childObject === null) &&
                        ((object[key] !== undefined && object[key] !== null) ||
                            propertyMapper.defaultValue !== undefined)) {
                        parentObject[pathName] = {};
                    }
                    parentObject = parentObject[pathName];
                }
            }
            if (parentObject !== undefined && parentObject !== null) {
                if (isXml && mapper.xmlNamespace) {
                    const xmlnsKey = mapper.xmlNamespacePrefix
                        ? `xmlns:${mapper.xmlNamespacePrefix}`
                        : "xmlns";
                    parentObject[XML_ATTRKEY] = Object.assign(Object.assign({}, parentObject[XML_ATTRKEY]), { [xmlnsKey]: mapper.xmlNamespace });
                }
                const propertyObjectName = propertyMapper.serializedName !== ""
                    ? objectName + "." + propertyMapper.serializedName
                    : objectName;
                let toSerialize = object[key];
                const polymorphicDiscriminator = getPolymorphicDiscriminatorRecursively(serializer, mapper);
                if (polymorphicDiscriminator &&
                    polymorphicDiscriminator.clientName === key &&
                    (toSerialize === undefined || toSerialize === null)) {
                    toSerialize = mapper.serializedName;
                }
                const serializedValue = serializer.serialize(propertyMapper, toSerialize, propertyObjectName, options);
                if (serializedValue !== undefined && propName !== undefined && propName !== null) {
                    const value = getXmlObjectValue(propertyMapper, serializedValue, isXml, options);
                    if (isXml && propertyMapper.xmlIsAttribute) {
                        // XML_ATTRKEY, i.e., $ is the key attributes are kept under in xml2js.
                        // This keeps things simple while preventing name collision
                        // with names in user documents.
                        parentObject[XML_ATTRKEY] = parentObject[XML_ATTRKEY] || {};
                        parentObject[XML_ATTRKEY][propName] = serializedValue;
                    }
                    else if (isXml && propertyMapper.xmlIsWrapped) {
                        parentObject[propName] = { [propertyMapper.xmlElementName]: value };
                    }
                    else {
                        parentObject[propName] = value;
                    }
                }
            }
        }
        const additionalPropertiesMapper = resolveAdditionalProperties(serializer, mapper, objectName);
        if (additionalPropertiesMapper) {
            const propNames = Object.keys(modelProps);
            for (const clientPropName in object) {
                const isAdditionalProperty = propNames.every((pn) => pn !== clientPropName);
                if (isAdditionalProperty) {
                    payload[clientPropName] = serializer.serialize(additionalPropertiesMapper, object[clientPropName], objectName + '["' + clientPropName + '"]', options);
                }
            }
        }
        return payload;
    }
    return object;
}
function getXmlObjectValue(propertyMapper, serializedValue, isXml, options) {
    if (!isXml || !propertyMapper.xmlNamespace) {
        return serializedValue;
    }
    const xmlnsKey = propertyMapper.xmlNamespacePrefix
        ? `xmlns:${propertyMapper.xmlNamespacePrefix}`
        : "xmlns";
    const xmlNamespace = { [xmlnsKey]: propertyMapper.xmlNamespace };
    if (["Composite"].includes(propertyMapper.type.name)) {
        if (serializedValue[XML_ATTRKEY]) {
            return serializedValue;
        }
        else {
            const result = Object.assign({}, serializedValue);
            result[XML_ATTRKEY] = xmlNamespace;
            return result;
        }
    }
    const result = {};
    result[options.xml.xmlCharKey] = serializedValue;
    result[XML_ATTRKEY] = xmlNamespace;
    return result;
}
function isSpecialXmlProperty(propertyName, options) {
    return [XML_ATTRKEY, options.xml.xmlCharKey].includes(propertyName);
}
function deserializeCompositeType(serializer, mapper, responseBody, objectName, options) {
    var _a;
    if (getPolymorphicDiscriminatorRecursively(serializer, mapper)) {
        mapper = getPolymorphicMapper(serializer, mapper, responseBody, "serializedName");
    }
    const modelProps = resolveModelProperties(serializer, mapper, objectName);
    let instance = {};
    const handledPropertyNames = [];
    for (const key of Object.keys(modelProps)) {
        const propertyMapper = modelProps[key];
        const paths = splitSerializeName(modelProps[key].serializedName);
        handledPropertyNames.push(paths[0]);
        const { serializedName, xmlName, xmlElementName } = propertyMapper;
        let propertyObjectName = objectName;
        if (serializedName !== "" && serializedName !== undefined) {
            propertyObjectName = objectName + "." + serializedName;
        }
        const headerCollectionPrefix = propertyMapper.headerCollectionPrefix;
        if (headerCollectionPrefix) {
            const dictionary = {};
            for (const headerKey of Object.keys(responseBody)) {
                if (headerKey.startsWith(headerCollectionPrefix)) {
                    dictionary[headerKey.substring(headerCollectionPrefix.length)] = serializer.deserialize(propertyMapper.type.value, responseBody[headerKey], propertyObjectName, options);
                }
                handledPropertyNames.push(headerKey);
            }
            instance[key] = dictionary;
        }
        else if (serializer.isXML) {
            if (propertyMapper.xmlIsAttribute && responseBody[XML_ATTRKEY]) {
                instance[key] = serializer.deserialize(propertyMapper, responseBody[XML_ATTRKEY][xmlName], propertyObjectName, options);
            }
            else {
                const propertyName = xmlElementName || xmlName || serializedName;
                if (propertyMapper.xmlIsWrapped) {
                    /* a list of <xmlElementName> wrapped by <xmlName>
                      For the xml example below
                        <Cors>
                          <CorsRule>...</CorsRule>
                          <CorsRule>...</CorsRule>
                        </Cors>
                      the responseBody has
                        {
                          Cors: {
                            CorsRule: [{...}, {...}]
                          }
                        }
                      xmlName is "Cors" and xmlElementName is"CorsRule".
                    */
                    const wrapped = responseBody[xmlName];
                    const elementList = (_a = wrapped === null || wrapped === void 0 ? void 0 : wrapped[xmlElementName]) !== null && _a !== void 0 ? _a : [];
                    instance[key] = serializer.deserialize(propertyMapper, elementList, propertyObjectName, options);
                }
                else {
                    const property = responseBody[propertyName];
                    instance[key] = serializer.deserialize(propertyMapper, property, propertyObjectName, options);
                }
            }
        }
        else {
            // deserialize the property if it is present in the provided responseBody instance
            let propertyInstance;
            let res = responseBody;
            // traversing the object step by step.
            for (const item of paths) {
                if (!res)
                    break;
                res = res[item];
            }
            propertyInstance = res;
            const polymorphicDiscriminator = mapper.type.polymorphicDiscriminator;
            // checking that the model property name (key)(ex: "fishtype") and the
            // clientName of the polymorphicDiscriminator {metadata} (ex: "fishtype")
            // instead of the serializedName of the polymorphicDiscriminator (ex: "fish.type")
            // is a better approach. The generator is not consistent with escaping '\.' in the
            // serializedName of the property (ex: "fish\.type") that is marked as polymorphic discriminator
            // and the serializedName of the metadata polymorphicDiscriminator (ex: "fish.type"). However,
            // the clientName transformation of the polymorphicDiscriminator (ex: "fishtype") and
            // the transformation of model property name (ex: "fishtype") is done consistently.
            // Hence, it is a safer bet to rely on the clientName of the polymorphicDiscriminator.
            if (polymorphicDiscriminator &&
                key === polymorphicDiscriminator.clientName &&
                (propertyInstance === undefined || propertyInstance === null)) {
                propertyInstance = mapper.serializedName;
            }
            let serializedValue;
            // paging
            if (Array.isArray(responseBody[key]) && modelProps[key].serializedName === "") {
                propertyInstance = responseBody[key];
                const arrayInstance = serializer.deserialize(propertyMapper, propertyInstance, propertyObjectName, options);
                // Copy over any properties that have already been added into the instance, where they do
                // not exist on the newly de-serialized array
                for (const [k, v] of Object.entries(instance)) {
                    if (!Object.prototype.hasOwnProperty.call(arrayInstance, k)) {
                        arrayInstance[k] = v;
                    }
                }
                instance = arrayInstance;
            }
            else if (propertyInstance !== undefined || propertyMapper.defaultValue !== undefined) {
                serializedValue = serializer.deserialize(propertyMapper, propertyInstance, propertyObjectName, options);
                instance[key] = serializedValue;
            }
        }
    }
    const additionalPropertiesMapper = mapper.type.additionalProperties;
    if (additionalPropertiesMapper) {
        const isAdditionalProperty = (responsePropName) => {
            for (const clientPropName in modelProps) {
                const paths = splitSerializeName(modelProps[clientPropName].serializedName);
                if (paths[0] === responsePropName) {
                    return false;
                }
            }
            return true;
        };
        for (const responsePropName in responseBody) {
            if (isAdditionalProperty(responsePropName)) {
                instance[responsePropName] = serializer.deserialize(additionalPropertiesMapper, responseBody[responsePropName], objectName + '["' + responsePropName + '"]', options);
            }
        }
    }
    else if (responseBody) {
        for (const key of Object.keys(responseBody)) {
            if (instance[key] === undefined &&
                !handledPropertyNames.includes(key) &&
                !isSpecialXmlProperty(key, options)) {
                instance[key] = responseBody[key];
            }
        }
    }
    return instance;
}
function deserializeDictionaryType(serializer, mapper, responseBody, objectName, options) {
    /* jshint validthis: true */
    const value = mapper.type.value;
    if (!value || typeof value !== "object") {
        throw new Error(`"value" metadata for a Dictionary must be defined in the ` +
            `mapper and it must of type "object" in ${objectName}`);
    }
    if (responseBody) {
        const tempDictionary = {};
        for (const key of Object.keys(responseBody)) {
            tempDictionary[key] = serializer.deserialize(value, responseBody[key], objectName, options);
        }
        return tempDictionary;
    }
    return responseBody;
}
function deserializeSequenceType(serializer, mapper, responseBody, objectName, options) {
    var _a;
    let element = mapper.type.element;
    if (!element || typeof element !== "object") {
        throw new Error(`element" metadata for an Array must be defined in the ` +
            `mapper and it must of type "object" in ${objectName}`);
    }
    if (responseBody) {
        if (!Array.isArray(responseBody)) {
            // xml2js will interpret a single element array as just the element, so force it to be an array
            responseBody = [responseBody];
        }
        // Quirk: Composite mappers referenced by `element` might
        // not have *all* properties declared (like uberParent),
        // so let's try to look up the full definition by name.
        if (element.type.name === "Composite" && element.type.className) {
            element = (_a = serializer.modelMappers[element.type.className]) !== null && _a !== void 0 ? _a : element;
        }
        const tempArray = [];
        for (let i = 0; i < responseBody.length; i++) {
            tempArray[i] = serializer.deserialize(element, responseBody[i], `${objectName}[${i}]`, options);
        }
        return tempArray;
    }
    return responseBody;
}
function getPolymorphicMapper(serializer, mapper, object, polymorphicPropertyName) {
    const polymorphicDiscriminator = getPolymorphicDiscriminatorRecursively(serializer, mapper);
    if (polymorphicDiscriminator) {
        let discriminatorName = polymorphicDiscriminator[polymorphicPropertyName];
        if (discriminatorName) {
            // The serializedName might have \\, which we just want to ignore
            if (polymorphicPropertyName === "serializedName") {
                discriminatorName = discriminatorName.replace(/\\/gi, "");
            }
            const discriminatorValue = object[discriminatorName];
            if (discriminatorValue !== undefined && discriminatorValue !== null) {
                const typeName = mapper.type.uberParent || mapper.type.className;
                const indexDiscriminator = discriminatorValue === typeName
                    ? discriminatorValue
                    : typeName + "." + discriminatorValue;
                const polymorphicMapper = serializer.modelMappers.discriminators[indexDiscriminator];
                if (polymorphicMapper) {
                    mapper = polymorphicMapper;
                }
            }
        }
    }
    return mapper;
}
function getPolymorphicDiscriminatorRecursively(serializer, mapper) {
    return (mapper.type.polymorphicDiscriminator ||
        getPolymorphicDiscriminatorSafely(serializer, mapper.type.uberParent) ||
        getPolymorphicDiscriminatorSafely(serializer, mapper.type.className));
}
function getPolymorphicDiscriminatorSafely(serializer, typeName) {
    return (typeName &&
        serializer.modelMappers[typeName] &&
        serializer.modelMappers[typeName].type.polymorphicDiscriminator);
}
/**
 * Known types of Mappers
 */
export const MapperTypeNames = {
    Base64Url: "Base64Url",
    Boolean: "Boolean",
    ByteArray: "ByteArray",
    Composite: "Composite",
    Date: "Date",
    DateTime: "DateTime",
    DateTimeRfc1123: "DateTimeRfc1123",
    Dictionary: "Dictionary",
    Enum: "Enum",
    Number: "Number",
    Object: "Object",
    Sequence: "Sequence",
    String: "String",
    Stream: "Stream",
    TimeSpan: "TimeSpan",
    UnixTime: "UnixTime",
};
//# sourceMappingURL=serializer.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createPipelineRequest, } from "@azure/core-rest-pipeline";
import { createClientPipeline } from "./pipeline";
import { flattenResponse } from "./utils";
import { getCachedDefaultHttpClient } from "./httpClientCache";
import { getOperationRequestInfo } from "./operationHelpers";
import { getRequestUrl } from "./urlHelpers";
import { getStreamingResponseStatusCodes } from "./interfaceHelpers";
import { logger } from "./log";
/**
 * Initializes a new instance of the ServiceClient.
 */
export class ServiceClient {
    /**
     * The ServiceClient constructor
     * @param credential - The credentials used for authentication with the service.
     * @param options - The service client options that govern the behavior of the client.
     */
    constructor(options = {}) {
        var _a, _b;
        this._requestContentType = options.requestContentType;
        this._endpoint = (_a = options.endpoint) !== null && _a !== void 0 ? _a : options.baseUri;
        if (options.baseUri) {
            logger.warning("The baseUri option for SDK Clients has been deprecated, please use endpoint instead.");
        }
        this._allowInsecureConnection = options.allowInsecureConnection;
        this._httpClient = options.httpClient || getCachedDefaultHttpClient();
        this.pipeline = options.pipeline || createDefaultPipeline(options);
        if ((_b = options.additionalPolicies) === null || _b === void 0 ? void 0 : _b.length) {
            for (const { policy, position } of options.additionalPolicies) {
                // Sign happens after Retry and is commonly needed to occur
                // before policies that intercept post-retry.
                const afterPhase = position === "perRetry" ? "Sign" : undefined;
                this.pipeline.addPolicy(policy, {
                    afterPhase,
                });
            }
        }
    }
    /**
     * Send the provided httpRequest.
     */
    async sendRequest(request) {
        return this.pipeline.sendRequest(this._httpClient, request);
    }
    /**
     * Send an HTTP request that is populated using the provided OperationSpec.
     * @typeParam T - The typed result of the request, based on the OperationSpec.
     * @param operationArguments - The arguments that the HTTP request's templated values will be populated from.
     * @param operationSpec - The OperationSpec to use to populate the httpRequest.
     */
    async sendOperationRequest(operationArguments, operationSpec) {
        const endpoint = operationSpec.baseUrl || this._endpoint;
        if (!endpoint) {
            throw new Error("If operationSpec.baseUrl is not specified, then the ServiceClient must have a endpoint string property that contains the base URL to use.");
        }
        // Templatized URLs sometimes reference properties on the ServiceClient child class,
        // so we have to pass `this` below in order to search these properties if they're
        // not part of OperationArguments
        const url = getRequestUrl(endpoint, operationSpec, operationArguments, this);
        const request = createPipelineRequest({
            url,
        });
        request.method = operationSpec.httpMethod;
        const operationInfo = getOperationRequestInfo(request);
        operationInfo.operationSpec = operationSpec;
        operationInfo.operationArguments = operationArguments;
        const contentType = operationSpec.contentType || this._requestContentType;
        if (contentType && operationSpec.requestBody) {
            request.headers.set("Content-Type", contentType);
        }
        const options = operationArguments.options;
        if (options) {
            const requestOptions = options.requestOptions;
            if (requestOptions) {
                if (requestOptions.timeout) {
                    request.timeout = requestOptions.timeout;
                }
                if (requestOptions.onUploadProgress) {
                    request.onUploadProgress = requestOptions.onUploadProgress;
                }
                if (requestOptions.onDownloadProgress) {
                    request.onDownloadProgress = requestOptions.onDownloadProgress;
                }
                if (requestOptions.shouldDeserialize !== undefined) {
                    operationInfo.shouldDeserialize = requestOptions.shouldDeserialize;
                }
                if (requestOptions.allowInsecureConnection) {
                    request.allowInsecureConnection = true;
                }
            }
            if (options.abortSignal) {
                request.abortSignal = options.abortSignal;
            }
            if (options.tracingOptions) {
                request.tracingOptions = options.tracingOptions;
            }
        }
        if (this._allowInsecureConnection) {
            request.allowInsecureConnection = true;
        }
        if (request.streamResponseStatusCodes === undefined) {
            request.streamResponseStatusCodes = getStreamingResponseStatusCodes(operationSpec);
        }
        try {
            const rawResponse = await this.sendRequest(request);
            const flatResponse = flattenResponse(rawResponse, operationSpec.responses[rawResponse.status]);
            if (options === null || options === void 0 ? void 0 : options.onResponse) {
                options.onResponse(rawResponse, flatResponse);
            }
            return flatResponse;
        }
        catch (error) {
            if (typeof error === "object" && (error === null || error === void 0 ? void 0 : error.response)) {
                const rawResponse = error.response;
                const flatResponse = flattenResponse(rawResponse, operationSpec.responses[error.statusCode] || operationSpec.responses["default"]);
                error.details = flatResponse;
                if (options === null || options === void 0 ? void 0 : options.onResponse) {
                    options.onResponse(rawResponse, flatResponse, error);
                }
            }
            throw error;
        }
    }
}
function createDefaultPipeline(options) {
    const credentialScopes = getCredentialScopes(options);
    const credentialOptions = options.credential && credentialScopes
        ? { credentialScopes, credential: options.credential }
        : undefined;
    return createClientPipeline(Object.assign(Object.assign({}, options), { credentialOptions }));
}
function getCredentialScopes(options) {
    if (options.credentialScopes) {
        const scopes = options.credentialScopes;
        return Array.isArray(scopes)
            ? scopes.map((scope) => new URL(scope).toString())
            : new URL(scopes).toString();
    }
    if (options.endpoint) {
        return `${options.endpoint}/.default`;
    }
    if (options.baseUri) {
        return `${options.baseUri}/.default`;
    }
    if (options.credential && !options.credentialScopes) {
        throw new Error(`When using credentials, the ServiceClientOptions must contain either a endpoint or a credentialScopes. Unable to create a bearerTokenAuthenticationPolicy`);
    }
    return undefined;
}
//# sourceMappingURL=serviceClient.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { getOperationArgumentValueFromParameter } from "./operationHelpers";
import { getPathStringFromParameter } from "./interfaceHelpers";
const CollectionFormatToDelimiterMap = {
    CSV: ",",
    SSV: " ",
    Multi: "Multi",
    TSV: "\t",
    Pipes: "|",
};
export function getRequestUrl(baseUri, operationSpec, operationArguments, fallbackObject) {
    const urlReplacements = calculateUrlReplacements(operationSpec, operationArguments, fallbackObject);
    let isAbsolutePath = false;
    let requestUrl = replaceAll(baseUri, urlReplacements);
    if (operationSpec.path) {
        let path = replaceAll(operationSpec.path, urlReplacements);
        // QUIRK: sometimes we get a path component like /{nextLink}
        // which may be a fully formed URL with a leading /. In that case, we should
        // remove the leading /
        if (operationSpec.path === "/{nextLink}" && path.startsWith("/")) {
            path = path.substring(1);
        }
        // QUIRK: sometimes we get a path component like {nextLink}
        // which may be a fully formed URL. In that case, we should
        // ignore the baseUri.
        if (isAbsoluteUrl(path)) {
            requestUrl = path;
            isAbsolutePath = true;
        }
        else {
            requestUrl = appendPath(requestUrl, path);
        }
    }
    const { queryParams, sequenceParams } = calculateQueryParameters(operationSpec, operationArguments, fallbackObject);
    /**
     * Notice that this call sets the `noOverwrite` parameter to true if the `requestUrl`
     * is an absolute path. This ensures that existing query parameter values in `requestUrl`
     * do not get overwritten. On the other hand when `requestUrl` is not absolute path, it
     * is still being built so there is nothing to overwrite.
     */
    requestUrl = appendQueryParams(requestUrl, queryParams, sequenceParams, isAbsolutePath);
    return requestUrl;
}
function replaceAll(input, replacements) {
    let result = input;
    for (const [searchValue, replaceValue] of replacements) {
        result = result.split(searchValue).join(replaceValue);
    }
    return result;
}
function calculateUrlReplacements(operationSpec, operationArguments, fallbackObject) {
    var _a;
    const result = new Map();
    if ((_a = operationSpec.urlParameters) === null || _a === void 0 ? void 0 : _a.length) {
        for (const urlParameter of operationSpec.urlParameters) {
            let urlParameterValue = getOperationArgumentValueFromParameter(operationArguments, urlParameter, fallbackObject);
            const parameterPathString = getPathStringFromParameter(urlParameter);
            urlParameterValue = operationSpec.serializer.serialize(urlParameter.mapper, urlParameterValue, parameterPathString);
            if (!urlParameter.skipEncoding) {
                urlParameterValue = encodeURIComponent(urlParameterValue);
            }
            result.set(`{${urlParameter.mapper.serializedName || parameterPathString}}`, urlParameterValue);
        }
    }
    return result;
}
function isAbsoluteUrl(url) {
    return url.includes("://");
}
function appendPath(url, pathToAppend) {
    if (!pathToAppend) {
        return url;
    }
    const parsedUrl = new URL(url);
    let newPath = parsedUrl.pathname;
    if (!newPath.endsWith("/")) {
        newPath = `${newPath}/`;
    }
    if (pathToAppend.startsWith("/")) {
        pathToAppend = pathToAppend.substring(1);
    }
    const searchStart = pathToAppend.indexOf("?");
    if (searchStart !== -1) {
        const path = pathToAppend.substring(0, searchStart);
        const search = pathToAppend.substring(searchStart + 1);
        newPath = newPath + path;
        if (search) {
            parsedUrl.search = parsedUrl.search ? `${parsedUrl.search}&${search}` : search;
        }
    }
    else {
        newPath = newPath + pathToAppend;
    }
    parsedUrl.pathname = newPath;
    return parsedUrl.toString();
}
function calculateQueryParameters(operationSpec, operationArguments, fallbackObject) {
    var _a;
    const result = new Map();
    const sequenceParams = new Set();
    if ((_a = operationSpec.queryParameters) === null || _a === void 0 ? void 0 : _a.length) {
        for (const queryParameter of operationSpec.queryParameters) {
            if (queryParameter.mapper.type.name === "Sequence" && queryParameter.mapper.serializedName) {
                sequenceParams.add(queryParameter.mapper.serializedName);
            }
            let queryParameterValue = getOperationArgumentValueFromParameter(operationArguments, queryParameter, fallbackObject);
            if ((queryParameterValue !== undefined && queryParameterValue !== null) ||
                queryParameter.mapper.required) {
                queryParameterValue = operationSpec.serializer.serialize(queryParameter.mapper, queryParameterValue, getPathStringFromParameter(queryParameter));
                const delimiter = queryParameter.collectionFormat
                    ? CollectionFormatToDelimiterMap[queryParameter.collectionFormat]
                    : "";
                if (Array.isArray(queryParameterValue)) {
                    // replace null and undefined
                    queryParameterValue = queryParameterValue.map((item) => {
                        if (item === null || item === undefined) {
                            return "";
                        }
                        return item;
                    });
                }
                if (queryParameter.collectionFormat === "Multi" && queryParameterValue.length === 0) {
                    continue;
                }
                else if (Array.isArray(queryParameterValue) &&
                    (queryParameter.collectionFormat === "SSV" || queryParameter.collectionFormat === "TSV")) {
                    queryParameterValue = queryParameterValue.join(delimiter);
                }
                if (!queryParameter.skipEncoding) {
                    if (Array.isArray(queryParameterValue)) {
                        queryParameterValue = queryParameterValue.map((item) => {
                            return encodeURIComponent(item);
                        });
                    }
                    else {
                        queryParameterValue = encodeURIComponent(queryParameterValue);
                    }
                }
                // Join pipes and CSV *after* encoding, or the server will be upset.
                if (Array.isArray(queryParameterValue) &&
                    (queryParameter.collectionFormat === "CSV" || queryParameter.collectionFormat === "Pipes")) {
                    queryParameterValue = queryParameterValue.join(delimiter);
                }
                result.set(queryParameter.mapper.serializedName || getPathStringFromParameter(queryParameter), queryParameterValue);
            }
        }
    }
    return {
        queryParams: result,
        sequenceParams,
    };
}
function simpleParseQueryParams(queryString) {
    const result = new Map();
    if (!queryString || queryString[0] !== "?") {
        return result;
    }
    // remove the leading ?
    queryString = queryString.slice(1);
    const pairs = queryString.split("&");
    for (const pair of pairs) {
        const [name, value] = pair.split("=", 2);
        const existingValue = result.get(name);
        if (existingValue) {
            if (Array.isArray(existingValue)) {
                existingValue.push(value);
            }
            else {
                result.set(name, [existingValue, value]);
            }
        }
        else {
            result.set(name, value);
        }
    }
    return result;
}
/** @internal */
export function appendQueryParams(url, queryParams, sequenceParams, noOverwrite = false) {
    if (queryParams.size === 0) {
        return url;
    }
    const parsedUrl = new URL(url);
    // QUIRK: parsedUrl.searchParams will have their name/value pairs decoded, which
    // can change their meaning to the server, such as in the case of a SAS signature.
    // To avoid accidentally un-encoding a query param, we parse the key/values ourselves
    const combinedParams = simpleParseQueryParams(parsedUrl.search);
    for (const [name, value] of queryParams) {
        const existingValue = combinedParams.get(name);
        if (Array.isArray(existingValue)) {
            if (Array.isArray(value)) {
                existingValue.push(...value);
                const valueSet = new Set(existingValue);
                combinedParams.set(name, Array.from(valueSet));
            }
            else {
                existingValue.push(value);
            }
        }
        else if (existingValue) {
            if (Array.isArray(value)) {
                value.unshift(existingValue);
            }
            else if (sequenceParams.has(name)) {
                combinedParams.set(name, [existingValue, value]);
            }
            if (!noOverwrite) {
                combinedParams.set(name, value);
            }
        }
        else {
            combinedParams.set(name, value);
        }
    }
    const searchPieces = [];
    for (const [name, value] of combinedParams) {
        if (typeof value === "string") {
            searchPieces.push(`${name}=${value}`);
        }
        else if (Array.isArray(value)) {
            // QUIRK: If we get an array of values, include multiple key/value pairs
            for (const subValue of value) {
                searchPieces.push(`${name}=${subValue}`);
            }
        }
        else {
            searchPieces.push(`${name}=${value}`);
        }
    }
    // QUIRK: we have to set search manually as searchParams will encode comma when it shouldn't.
    parsedUrl.search = searchPieces.length ? `?${searchPieces.join("&")}` : "";
    return parsedUrl.toString();
}
//# sourceMappingURL=urlHelpers.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * A type guard for a primitive response body.
 * @param value - Value to test
 *
 * @internal
 */
export function isPrimitiveBody(value, mapperTypeName) {
    return (mapperTypeName !== "Composite" &&
        mapperTypeName !== "Dictionary" &&
        (typeof value === "string" ||
            typeof value === "number" ||
            typeof value === "boolean" ||
            (mapperTypeName === null || mapperTypeName === void 0 ? void 0 : mapperTypeName.match(/^(Date|DateTime|DateTimeRfc1123|UnixTime|ByteArray|Base64Url)$/i)) !==
                null ||
            value === undefined ||
            value === null));
}
const validateISODuration = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;
/**
 * Returns true if the given string is in ISO 8601 format.
 * @param value - The value to be validated for ISO 8601 duration format.
 * @internal
 */
export function isDuration(value) {
    return validateISODuration.test(value);
}
const validUuidRegex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/i;
/**
 * Returns true if the provided uuid is valid.
 *
 * @param uuid - The uuid that needs to be validated.
 *
 * @internal
 */
export function isValidUuid(uuid) {
    return validUuidRegex.test(uuid);
}
/**
 * Maps the response as follows:
 * - wraps the response body if needed (typically if its type is primitive).
 * - returns null if the combination of the headers and the body is empty.
 * - otherwise, returns the combination of the headers and the body.
 *
 * @param responseObject - a representation of the parsed response
 * @returns the response that will be returned to the user which can be null and/or wrapped
 *
 * @internal
 */
function handleNullableResponseAndWrappableBody(responseObject) {
    const combinedHeadersAndBody = Object.assign(Object.assign({}, responseObject.headers), responseObject.body);
    if (responseObject.hasNullableType &&
        Object.getOwnPropertyNames(combinedHeadersAndBody).length === 0) {
        return responseObject.shouldWrapBody ? { body: null } : null;
    }
    else {
        return responseObject.shouldWrapBody
            ? Object.assign(Object.assign({}, responseObject.headers), { body: responseObject.body }) : combinedHeadersAndBody;
    }
}
/**
 * Take a `FullOperationResponse` and turn it into a flat
 * response object to hand back to the consumer.
 * @param fullResponse - The processed response from the operation request
 * @param responseSpec - The response map from the OperationSpec
 *
 * @internal
 */
export function flattenResponse(fullResponse, responseSpec) {
    var _a, _b;
    const parsedHeaders = fullResponse.parsedHeaders;
    // head methods never have a body, but we return a boolean set to body property
    // to indicate presence/absence of the resource
    if (fullResponse.request.method === "HEAD") {
        return Object.assign(Object.assign({}, parsedHeaders), { body: fullResponse.parsedBody });
    }
    const bodyMapper = responseSpec && responseSpec.bodyMapper;
    const isNullable = Boolean(bodyMapper === null || bodyMapper === void 0 ? void 0 : bodyMapper.nullable);
    const expectedBodyTypeName = bodyMapper === null || bodyMapper === void 0 ? void 0 : bodyMapper.type.name;
    /** If the body is asked for, we look at the expected body type to handle it */
    if (expectedBodyTypeName === "Stream") {
        return Object.assign(Object.assign({}, parsedHeaders), { blobBody: fullResponse.blobBody, readableStreamBody: fullResponse.readableStreamBody });
    }
    const modelProperties = (expectedBodyTypeName === "Composite" &&
        bodyMapper.type.modelProperties) ||
        {};
    const isPageableResponse = Object.keys(modelProperties).some((k) => modelProperties[k].serializedName === "");
    if (expectedBodyTypeName === "Sequence" || isPageableResponse) {
        const arrayResponse = (_a = fullResponse.parsedBody) !== null && _a !== void 0 ? _a : [];
        for (const key of Object.keys(modelProperties)) {
            if (modelProperties[key].serializedName) {
                arrayResponse[key] = (_b = fullResponse.parsedBody) === null || _b === void 0 ? void 0 : _b[key];
            }
        }
        if (parsedHeaders) {
            for (const key of Object.keys(parsedHeaders)) {
                arrayResponse[key] = parsedHeaders[key];
            }
        }
        return isNullable &&
            !fullResponse.parsedBody &&
            !parsedHeaders &&
            Object.getOwnPropertyNames(modelProperties).length === 0
            ? null
            : arrayResponse;
    }
    return handleNullableResponseAndWrappableBody({
        body: fullResponse.parsedBody,
        headers: parsedHeaders,
        hasNullableType: isNullable,
        shouldWrapBody: isPrimitiveBody(fullResponse.parsedBody, expectedBodyTypeName),
    });
}
//# sourceMappingURL=utils.js.map'use strict';

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

var coreRestPipeline = require('@azure/core-rest-pipeline');
var logger$1 = require('@azure/logger');

// Copyright (c) Microsoft Corporation.
/**
 * Encodes a byte array in base64 format.
 * @param value - the Uint8Aray to encode
 * @internal
 */
function encodeByteArray(value) {
    // Buffer.from accepts <ArrayBuffer> | <SharedArrayBuffer>-- the TypeScript definition is off here
    // https://nodejs.org/api/buffer.html#buffer_class_method_buffer_from_arraybuffer_byteoffset_length
    const bufferValue = value instanceof Buffer ? value : Buffer.from(value.buffer);
    return bufferValue.toString("base64");
}
/**
 * Decodes a base64 string into a byte array.
 * @param value - the base64 string to decode
 * @internal
 */
function decodeString(value) {
    return Buffer.from(value, "base64");
}
/**
 * Decodes a base64 string into a string.
 * @param value - the base64 string to decode
 * @internal
 */
function decodeStringToString(value) {
    return Buffer.from(value, "base64").toString();
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Default key used to access the XML attributes.
 */
const XML_ATTRKEY = "$";
/**
 * Default key used to access the XML value content.
 */
const XML_CHARKEY = "_";

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * A type guard for a primitive response body.
 * @param value - Value to test
 *
 * @internal
 */
function isPrimitiveBody(value, mapperTypeName) {
    return (mapperTypeName !== "Composite" &&
        mapperTypeName !== "Dictionary" &&
        (typeof value === "string" ||
            typeof value === "number" ||
            typeof value === "boolean" ||
            (mapperTypeName === null || mapperTypeName === void 0 ? void 0 : mapperTypeName.match(/^(Date|DateTime|DateTimeRfc1123|UnixTime|ByteArray|Base64Url)$/i)) !==
                null ||
            value === undefined ||
            value === null));
}
const validateISODuration = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;
/**
 * Returns true if the given string is in ISO 8601 format.
 * @param value - The value to be validated for ISO 8601 duration format.
 * @internal
 */
function isDuration(value) {
    return validateISODuration.test(value);
}
const validUuidRegex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/i;
/**
 * Returns true if the provided uuid is valid.
 *
 * @param uuid - The uuid that needs to be validated.
 *
 * @internal
 */
function isValidUuid(uuid) {
    return validUuidRegex.test(uuid);
}
/**
 * Maps the response as follows:
 * - wraps the response body if needed (typically if its type is primitive).
 * - returns null if the combination of the headers and the body is empty.
 * - otherwise, returns the combination of the headers and the body.
 *
 * @param responseObject - a representation of the parsed response
 * @returns the response that will be returned to the user which can be null and/or wrapped
 *
 * @internal
 */
function handleNullableResponseAndWrappableBody(responseObject) {
    const combinedHeadersAndBody = Object.assign(Object.assign({}, responseObject.headers), responseObject.body);
    if (responseObject.hasNullableType &&
        Object.getOwnPropertyNames(combinedHeadersAndBody).length === 0) {
        return responseObject.shouldWrapBody ? { body: null } : null;
    }
    else {
        return responseObject.shouldWrapBody
            ? Object.assign(Object.assign({}, responseObject.headers), { body: responseObject.body }) : combinedHeadersAndBody;
    }
}
/**
 * Take a `FullOperationResponse` and turn it into a flat
 * response object to hand back to the consumer.
 * @param fullResponse - The processed response from the operation request
 * @param responseSpec - The response map from the OperationSpec
 *
 * @internal
 */
function flattenResponse(fullResponse, responseSpec) {
    var _a, _b;
    const parsedHeaders = fullResponse.parsedHeaders;
    // head methods never have a body, but we return a boolean set to body property
    // to indicate presence/absence of the resource
    if (fullResponse.request.method === "HEAD") {
        return Object.assign(Object.assign({}, parsedHeaders), { body: fullResponse.parsedBody });
    }
    const bodyMapper = responseSpec && responseSpec.bodyMapper;
    const isNullable = Boolean(bodyMapper === null || bodyMapper === void 0 ? void 0 : bodyMapper.nullable);
    const expectedBodyTypeName = bodyMapper === null || bodyMapper === void 0 ? void 0 : bodyMapper.type.name;
    /** If the body is asked for, we look at the expected body type to handle it */
    if (expectedBodyTypeName === "Stream") {
        return Object.assign(Object.assign({}, parsedHeaders), { blobBody: fullResponse.blobBody, readableStreamBody: fullResponse.readableStreamBody });
    }
    const modelProperties = (expectedBodyTypeName === "Composite" &&
        bodyMapper.type.modelProperties) ||
        {};
    const isPageableResponse = Object.keys(modelProperties).some((k) => modelProperties[k].serializedName === "");
    if (expectedBodyTypeName === "Sequence" || isPageableResponse) {
        const arrayResponse = (_a = fullResponse.parsedBody) !== null && _a !== void 0 ? _a : [];
        for (const key of Object.keys(modelProperties)) {
            if (modelProperties[key].serializedName) {
                arrayResponse[key] = (_b = fullResponse.parsedBody) === null || _b === void 0 ? void 0 : _b[key];
            }
        }
        if (parsedHeaders) {
            for (const key of Object.keys(parsedHeaders)) {
                arrayResponse[key] = parsedHeaders[key];
            }
        }
        return isNullable &&
            !fullResponse.parsedBody &&
            !parsedHeaders &&
            Object.getOwnPropertyNames(modelProperties).length === 0
            ? null
            : arrayResponse;
    }
    return handleNullableResponseAndWrappableBody({
        body: fullResponse.parsedBody,
        headers: parsedHeaders,
        hasNullableType: isNullable,
        shouldWrapBody: isPrimitiveBody(fullResponse.parsedBody, expectedBodyTypeName),
    });
}

// Copyright (c) Microsoft Corporation.
class SerializerImpl {
    constructor(modelMappers = {}, isXML = false) {
        this.modelMappers = modelMappers;
        this.isXML = isXML;
    }
    validateConstraints(mapper, value, objectName) {
        const failValidation = (constraintName, constraintValue) => {
            throw new Error(`"${objectName}" with value "${value}" should satisfy the constraint "${constraintName}": ${constraintValue}.`);
        };
        if (mapper.constraints && value !== undefined && value !== null) {
            const { ExclusiveMaximum, ExclusiveMinimum, InclusiveMaximum, InclusiveMinimum, MaxItems, MaxLength, MinItems, MinLength, MultipleOf, Pattern, UniqueItems, } = mapper.constraints;
            if (ExclusiveMaximum !== undefined && value >= ExclusiveMaximum) {
                failValidation("ExclusiveMaximum", ExclusiveMaximum);
            }
            if (ExclusiveMinimum !== undefined && value <= ExclusiveMinimum) {
                failValidation("ExclusiveMinimum", ExclusiveMinimum);
            }
            if (InclusiveMaximum !== undefined && value > InclusiveMaximum) {
                failValidation("InclusiveMaximum", InclusiveMaximum);
            }
            if (InclusiveMinimum !== undefined && value < InclusiveMinimum) {
                failValidation("InclusiveMinimum", InclusiveMinimum);
            }
            if (MaxItems !== undefined && value.length > MaxItems) {
                failValidation("MaxItems", MaxItems);
            }
            if (MaxLength !== undefined && value.length > MaxLength) {
                failValidation("MaxLength", MaxLength);
            }
            if (MinItems !== undefined && value.length < MinItems) {
                failValidation("MinItems", MinItems);
            }
            if (MinLength !== undefined && value.length < MinLength) {
                failValidation("MinLength", MinLength);
            }
            if (MultipleOf !== undefined && value % MultipleOf !== 0) {
                failValidation("MultipleOf", MultipleOf);
            }
            if (Pattern) {
                const pattern = typeof Pattern === "string" ? new RegExp(Pattern) : Pattern;
                if (typeof value !== "string" || value.match(pattern) === null) {
                    failValidation("Pattern", Pattern);
                }
            }
            if (UniqueItems &&
                value.some((item, i, ar) => ar.indexOf(item) !== i)) {
                failValidation("UniqueItems", UniqueItems);
            }
        }
    }
    /**
     * Serialize the given object based on its metadata defined in the mapper
     *
     * @param mapper - The mapper which defines the metadata of the serializable object
     *
     * @param object - A valid Javascript object to be serialized
     *
     * @param objectName - Name of the serialized object
     *
     * @param options - additional options to serialization
     *
     * @returns A valid serialized Javascript object
     */
    serialize(mapper, object, objectName, options = { xml: {} }) {
        var _a, _b, _c;
        const updatedOptions = {
            xml: {
                rootName: (_a = options.xml.rootName) !== null && _a !== void 0 ? _a : "",
                includeRoot: (_b = options.xml.includeRoot) !== null && _b !== void 0 ? _b : false,
                xmlCharKey: (_c = options.xml.xmlCharKey) !== null && _c !== void 0 ? _c : XML_CHARKEY,
            },
        };
        let payload = {};
        const mapperType = mapper.type.name;
        if (!objectName) {
            objectName = mapper.serializedName;
        }
        if (mapperType.match(/^Sequence$/i) !== null) {
            payload = [];
        }
        if (mapper.isConstant) {
            object = mapper.defaultValue;
        }
        // This table of allowed values should help explain
        // the mapper.required and mapper.nullable properties.
        // X means "neither undefined or null are allowed".
        //           || required
        //           || true      | false
        //  nullable || ==========================
        //      true || null      | undefined/null
        //     false || X         | undefined
        // undefined || X         | undefined/null
        const { required, nullable } = mapper;
        if (required && nullable && object === undefined) {
            throw new Error(`${objectName} cannot be undefined.`);
        }
        if (required && !nullable && (object === undefined || object === null)) {
            throw new Error(`${objectName} cannot be null or undefined.`);
        }
        if (!required && nullable === false && object === null) {
            throw new Error(`${objectName} cannot be null.`);
        }
        if (object === undefined || object === null) {
            payload = object;
        }
        else {
            // Validate Constraints if any
            this.validateConstraints(mapper, object, objectName);
            if (mapperType.match(/^any$/i) !== null) {
                payload = object;
            }
            else if (mapperType.match(/^(Number|String|Boolean|Object|Stream|Uuid)$/i) !== null) {
                payload = serializeBasicTypes(mapperType, objectName, object);
            }
            else if (mapperType.match(/^Enum$/i) !== null) {
                const enumMapper = mapper;
                payload = serializeEnumType(objectName, enumMapper.type.allowedValues, object);
            }
            else if (mapperType.match(/^(Date|DateTime|TimeSpan|DateTimeRfc1123|UnixTime)$/i) !== null) {
                payload = serializeDateTypes(mapperType, object, objectName);
            }
            else if (mapperType.match(/^ByteArray$/i) !== null) {
                payload = serializeByteArrayType(objectName, object);
            }
            else if (mapperType.match(/^Base64Url$/i) !== null) {
                payload = serializeBase64UrlType(objectName, object);
            }
            else if (mapperType.match(/^Sequence$/i) !== null) {
                payload = serializeSequenceType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions);
            }
            else if (mapperType.match(/^Dictionary$/i) !== null) {
                payload = serializeDictionaryType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions);
            }
            else if (mapperType.match(/^Composite$/i) !== null) {
                payload = serializeCompositeType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions);
            }
        }
        return payload;
    }
    /**
     * Deserialize the given object based on its metadata defined in the mapper
     *
     * @param mapper - The mapper which defines the metadata of the serializable object
     *
     * @param responseBody - A valid Javascript entity to be deserialized
     *
     * @param objectName - Name of the deserialized object
     *
     * @param options - Controls behavior of XML parser and builder.
     *
     * @returns A valid deserialized Javascript object
     */
    deserialize(mapper, responseBody, objectName, options = { xml: {} }) {
        var _a, _b, _c;
        const updatedOptions = {
            xml: {
                rootName: (_a = options.xml.rootName) !== null && _a !== void 0 ? _a : "",
                includeRoot: (_b = options.xml.includeRoot) !== null && _b !== void 0 ? _b : false,
                xmlCharKey: (_c = options.xml.xmlCharKey) !== null && _c !== void 0 ? _c : XML_CHARKEY,
            },
        };
        if (responseBody === undefined || responseBody === null) {
            if (this.isXML && mapper.type.name === "Sequence" && !mapper.xmlIsWrapped) {
                // Edge case for empty XML non-wrapped lists. xml2js can't distinguish
                // between the list being empty versus being missing,
                // so let's do the more user-friendly thing and return an empty list.
                responseBody = [];
            }
            // specifically check for undefined as default value can be a falsey value `0, "", false, null`
            if (mapper.defaultValue !== undefined) {
                responseBody = mapper.defaultValue;
            }
            return responseBody;
        }
        let payload;
        const mapperType = mapper.type.name;
        if (!objectName) {
            objectName = mapper.serializedName;
        }
        if (mapperType.match(/^Composite$/i) !== null) {
            payload = deserializeCompositeType(this, mapper, responseBody, objectName, updatedOptions);
        }
        else {
            if (this.isXML) {
                const xmlCharKey = updatedOptions.xml.xmlCharKey;
                /**
                 * If the mapper specifies this as a non-composite type value but the responseBody contains
                 * both header ("$" i.e., XML_ATTRKEY) and body ("#" i.e., XML_CHARKEY) properties,
                 * then just reduce the responseBody value to the body ("#" i.e., XML_CHARKEY) property.
                 */
                if (responseBody[XML_ATTRKEY] !== undefined && responseBody[xmlCharKey] !== undefined) {
                    responseBody = responseBody[xmlCharKey];
                }
            }
            if (mapperType.match(/^Number$/i) !== null) {
                payload = parseFloat(responseBody);
                if (isNaN(payload)) {
                    payload = responseBody;
                }
            }
            else if (mapperType.match(/^Boolean$/i) !== null) {
                if (responseBody === "true") {
                    payload = true;
                }
                else if (responseBody === "false") {
                    payload = false;
                }
                else {
                    payload = responseBody;
                }
            }
            else if (mapperType.match(/^(String|Enum|Object|Stream|Uuid|TimeSpan|any)$/i) !== null) {
                payload = responseBody;
            }
            else if (mapperType.match(/^(Date|DateTime|DateTimeRfc1123)$/i) !== null) {
                payload = new Date(responseBody);
            }
            else if (mapperType.match(/^UnixTime$/i) !== null) {
                payload = unixTimeToDate(responseBody);
            }
            else if (mapperType.match(/^ByteArray$/i) !== null) {
                payload = decodeString(responseBody);
            }
            else if (mapperType.match(/^Base64Url$/i) !== null) {
                payload = base64UrlToByteArray(responseBody);
            }
            else if (mapperType.match(/^Sequence$/i) !== null) {
                payload = deserializeSequenceType(this, mapper, responseBody, objectName, updatedOptions);
            }
            else if (mapperType.match(/^Dictionary$/i) !== null) {
                payload = deserializeDictionaryType(this, mapper, responseBody, objectName, updatedOptions);
            }
        }
        if (mapper.isConstant) {
            payload = mapper.defaultValue;
        }
        return payload;
    }
}
/**
 * Method that creates and returns a Serializer.
 * @param modelMappers - Known models to map
 * @param isXML - If XML should be supported
 */
function createSerializer(modelMappers = {}, isXML = false) {
    return new SerializerImpl(modelMappers, isXML);
}
function trimEnd(str, ch) {
    let len = str.length;
    while (len - 1 >= 0 && str[len - 1] === ch) {
        --len;
    }
    return str.substr(0, len);
}
function bufferToBase64Url(buffer) {
    if (!buffer) {
        return undefined;
    }
    if (!(buffer instanceof Uint8Array)) {
        throw new Error(`Please provide an input of type Uint8Array for converting to Base64Url.`);
    }
    // Uint8Array to Base64.
    const str = encodeByteArray(buffer);
    // Base64 to Base64Url.
    return trimEnd(str, "=").replace(/\+/g, "-").replace(/\//g, "_");
}
function base64UrlToByteArray(str) {
    if (!str) {
        return undefined;
    }
    if (str && typeof str.valueOf() !== "string") {
        throw new Error("Please provide an input of type string for converting to Uint8Array");
    }
    // Base64Url to Base64.
    str = str.replace(/-/g, "+").replace(/_/g, "/");
    // Base64 to Uint8Array.
    return decodeString(str);
}
function splitSerializeName(prop) {
    const classes = [];
    let partialclass = "";
    if (prop) {
        const subwords = prop.split(".");
        for (const item of subwords) {
            if (item.charAt(item.length - 1) === "\\") {
                partialclass += item.substr(0, item.length - 1) + ".";
            }
            else {
                partialclass += item;
                classes.push(partialclass);
                partialclass = "";
            }
        }
    }
    return classes;
}
function dateToUnixTime(d) {
    if (!d) {
        return undefined;
    }
    if (typeof d.valueOf() === "string") {
        d = new Date(d);
    }
    return Math.floor(d.getTime() / 1000);
}
function unixTimeToDate(n) {
    if (!n) {
        return undefined;
    }
    return new Date(n * 1000);
}
function serializeBasicTypes(typeName, objectName, value) {
    if (value !== null && value !== undefined) {
        if (typeName.match(/^Number$/i) !== null) {
            if (typeof value !== "number") {
                throw new Error(`${objectName} with value ${value} must be of type number.`);
            }
        }
        else if (typeName.match(/^String$/i) !== null) {
            if (typeof value.valueOf() !== "string") {
                throw new Error(`${objectName} with value "${value}" must be of type string.`);
            }
        }
        else if (typeName.match(/^Uuid$/i) !== null) {
            if (!(typeof value.valueOf() === "string" && isValidUuid(value))) {
                throw new Error(`${objectName} with value "${value}" must be of type string and a valid uuid.`);
            }
        }
        else if (typeName.match(/^Boolean$/i) !== null) {
            if (typeof value !== "boolean") {
                throw new Error(`${objectName} with value ${value} must be of type boolean.`);
            }
        }
        else if (typeName.match(/^Stream$/i) !== null) {
            const objectType = typeof value;
            if (objectType !== "string" &&
                typeof value.pipe !== "function" &&
                !(value instanceof ArrayBuffer) &&
                !ArrayBuffer.isView(value) &&
                // File objects count as a type of Blob, so we want to use instanceof explicitly
                !((typeof Blob === "function" || typeof Blob === "object") && value instanceof Blob)) {
                throw new Error(`${objectName} must be a string, Blob, ArrayBuffer, ArrayBufferView, or NodeJS.ReadableStream.`);
            }
        }
    }
    return value;
}
function serializeEnumType(objectName, allowedValues, value) {
    if (!allowedValues) {
        throw new Error(`Please provide a set of allowedValues to validate ${objectName} as an Enum Type.`);
    }
    const isPresent = allowedValues.some((item) => {
        if (typeof item.valueOf() === "string") {
            return item.toLowerCase() === value.toLowerCase();
        }
        return item === value;
    });
    if (!isPresent) {
        throw new Error(`${value} is not a valid value for ${objectName}. The valid values are: ${JSON.stringify(allowedValues)}.`);
    }
    return value;
}
function serializeByteArrayType(objectName, value) {
    if (value !== undefined && value !== null) {
        if (!(value instanceof Uint8Array)) {
            throw new Error(`${objectName} must be of type Uint8Array.`);
        }
        value = encodeByteArray(value);
    }
    return value;
}
function serializeBase64UrlType(objectName, value) {
    if (value !== undefined && value !== null) {
        if (!(value instanceof Uint8Array)) {
            throw new Error(`${objectName} must be of type Uint8Array.`);
        }
        value = bufferToBase64Url(value);
    }
    return value;
}
function serializeDateTypes(typeName, value, objectName) {
    if (value !== undefined && value !== null) {
        if (typeName.match(/^Date$/i) !== null) {
            if (!(value instanceof Date ||
                (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
                throw new Error(`${objectName} must be an instanceof Date or a string in ISO8601 format.`);
            }
            value =
                value instanceof Date
                    ? value.toISOString().substring(0, 10)
                    : new Date(value).toISOString().substring(0, 10);
        }
        else if (typeName.match(/^DateTime$/i) !== null) {
            if (!(value instanceof Date ||
                (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
                throw new Error(`${objectName} must be an instanceof Date or a string in ISO8601 format.`);
            }
            value = value instanceof Date ? value.toISOString() : new Date(value).toISOString();
        }
        else if (typeName.match(/^DateTimeRfc1123$/i) !== null) {
            if (!(value instanceof Date ||
                (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
                throw new Error(`${objectName} must be an instanceof Date or a string in RFC-1123 format.`);
            }
            value = value instanceof Date ? value.toUTCString() : new Date(value).toUTCString();
        }
        else if (typeName.match(/^UnixTime$/i) !== null) {
            if (!(value instanceof Date ||
                (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
                throw new Error(`${objectName} must be an instanceof Date or a string in RFC-1123/ISO8601 format ` +
                    `for it to be serialized in UnixTime/Epoch format.`);
            }
            value = dateToUnixTime(value);
        }
        else if (typeName.match(/^TimeSpan$/i) !== null) {
            if (!isDuration(value)) {
                throw new Error(`${objectName} must be a string in ISO 8601 format. Instead was "${value}".`);
            }
        }
    }
    return value;
}
function serializeSequenceType(serializer, mapper, object, objectName, isXml, options) {
    var _a;
    if (!Array.isArray(object)) {
        throw new Error(`${objectName} must be of type Array.`);
    }
    let elementType = mapper.type.element;
    if (!elementType || typeof elementType !== "object") {
        throw new Error(`element" metadata for an Array must be defined in the ` +
            `mapper and it must of type "object" in ${objectName}.`);
    }
    // Quirk: Composite mappers referenced by `element` might
    // not have *all* properties declared (like uberParent),
    // so let's try to look up the full definition by name.
    if (elementType.type.name === "Composite" && elementType.type.className) {
        elementType = (_a = serializer.modelMappers[elementType.type.className]) !== null && _a !== void 0 ? _a : elementType;
    }
    const tempArray = [];
    for (let i = 0; i < object.length; i++) {
        const serializedValue = serializer.serialize(elementType, object[i], objectName, options);
        if (isXml && elementType.xmlNamespace) {
            const xmlnsKey = elementType.xmlNamespacePrefix
                ? `xmlns:${elementType.xmlNamespacePrefix}`
                : "xmlns";
            if (elementType.type.name === "Composite") {
                tempArray[i] = Object.assign({}, serializedValue);
                tempArray[i][XML_ATTRKEY] = { [xmlnsKey]: elementType.xmlNamespace };
            }
            else {
                tempArray[i] = {};
                tempArray[i][options.xml.xmlCharKey] = serializedValue;
                tempArray[i][XML_ATTRKEY] = { [xmlnsKey]: elementType.xmlNamespace };
            }
        }
        else {
            tempArray[i] = serializedValue;
        }
    }
    return tempArray;
}
function serializeDictionaryType(serializer, mapper, object, objectName, isXml, options) {
    if (typeof object !== "object") {
        throw new Error(`${objectName} must be of type object.`);
    }
    const valueType = mapper.type.value;
    if (!valueType || typeof valueType !== "object") {
        throw new Error(`"value" metadata for a Dictionary must be defined in the ` +
            `mapper and it must of type "object" in ${objectName}.`);
    }
    const tempDictionary = {};
    for (const key of Object.keys(object)) {
        const serializedValue = serializer.serialize(valueType, object[key], objectName, options);
        // If the element needs an XML namespace we need to add it within the $ property
        tempDictionary[key] = getXmlObjectValue(valueType, serializedValue, isXml, options);
    }
    // Add the namespace to the root element if needed
    if (isXml && mapper.xmlNamespace) {
        const xmlnsKey = mapper.xmlNamespacePrefix ? `xmlns:${mapper.xmlNamespacePrefix}` : "xmlns";
        const result = tempDictionary;
        result[XML_ATTRKEY] = { [xmlnsKey]: mapper.xmlNamespace };
        return result;
    }
    return tempDictionary;
}
/**
 * Resolves the additionalProperties property from a referenced mapper
 * @param serializer - the serializer containing the entire set of mappers
 * @param mapper - the composite mapper to resolve
 * @param objectName - name of the object being serialized
 */
function resolveAdditionalProperties(serializer, mapper, objectName) {
    const additionalProperties = mapper.type.additionalProperties;
    if (!additionalProperties && mapper.type.className) {
        const modelMapper = resolveReferencedMapper(serializer, mapper, objectName);
        return modelMapper === null || modelMapper === void 0 ? void 0 : modelMapper.type.additionalProperties;
    }
    return additionalProperties;
}
/**
 * Finds the mapper referenced by className
 * @param serializer - the serializer containing the entire set of mappers
 * @param mapper - the composite mapper to resolve
 * @param objectName - name of the object being serialized
 */
function resolveReferencedMapper(serializer, mapper, objectName) {
    const className = mapper.type.className;
    if (!className) {
        throw new Error(`Class name for model "${objectName}" is not provided in the mapper "${JSON.stringify(mapper, undefined, 2)}".`);
    }
    return serializer.modelMappers[className];
}
/**
 * Resolves a composite mapper's modelProperties.
 * @param serializer - the serializer containing the entire set of mappers
 * @param mapper - the composite mapper to resolve
 */
function resolveModelProperties(serializer, mapper, objectName) {
    let modelProps = mapper.type.modelProperties;
    if (!modelProps) {
        const modelMapper = resolveReferencedMapper(serializer, mapper, objectName);
        if (!modelMapper) {
            throw new Error(`mapper() cannot be null or undefined for model "${mapper.type.className}".`);
        }
        modelProps = modelMapper === null || modelMapper === void 0 ? void 0 : modelMapper.type.modelProperties;
        if (!modelProps) {
            throw new Error(`modelProperties cannot be null or undefined in the ` +
                `mapper "${JSON.stringify(modelMapper)}" of type "${mapper.type.className}" for object "${objectName}".`);
        }
    }
    return modelProps;
}
function serializeCompositeType(serializer, mapper, object, objectName, isXml, options) {
    if (getPolymorphicDiscriminatorRecursively(serializer, mapper)) {
        mapper = getPolymorphicMapper(serializer, mapper, object, "clientName");
    }
    if (object !== undefined && object !== null) {
        const payload = {};
        const modelProps = resolveModelProperties(serializer, mapper, objectName);
        for (const key of Object.keys(modelProps)) {
            const propertyMapper = modelProps[key];
            if (propertyMapper.readOnly) {
                continue;
            }
            let propName;
            let parentObject = payload;
            if (serializer.isXML) {
                if (propertyMapper.xmlIsWrapped) {
                    propName = propertyMapper.xmlName;
                }
                else {
                    propName = propertyMapper.xmlElementName || propertyMapper.xmlName;
                }
            }
            else {
                const paths = splitSerializeName(propertyMapper.serializedName);
                propName = paths.pop();
                for (const pathName of paths) {
                    const childObject = parentObject[pathName];
                    if ((childObject === undefined || childObject === null) &&
                        ((object[key] !== undefined && object[key] !== null) ||
                            propertyMapper.defaultValue !== undefined)) {
                        parentObject[pathName] = {};
                    }
                    parentObject = parentObject[pathName];
                }
            }
            if (parentObject !== undefined && parentObject !== null) {
                if (isXml && mapper.xmlNamespace) {
                    const xmlnsKey = mapper.xmlNamespacePrefix
                        ? `xmlns:${mapper.xmlNamespacePrefix}`
                        : "xmlns";
                    parentObject[XML_ATTRKEY] = Object.assign(Object.assign({}, parentObject[XML_ATTRKEY]), { [xmlnsKey]: mapper.xmlNamespace });
                }
                const propertyObjectName = propertyMapper.serializedName !== ""
                    ? objectName + "." + propertyMapper.serializedName
                    : objectName;
                let toSerialize = object[key];
                const polymorphicDiscriminator = getPolymorphicDiscriminatorRecursively(serializer, mapper);
                if (polymorphicDiscriminator &&
                    polymorphicDiscriminator.clientName === key &&
                    (toSerialize === undefined || toSerialize === null)) {
                    toSerialize = mapper.serializedName;
                }
                const serializedValue = serializer.serialize(propertyMapper, toSerialize, propertyObjectName, options);
                if (serializedValue !== undefined && propName !== undefined && propName !== null) {
                    const value = getXmlObjectValue(propertyMapper, serializedValue, isXml, options);
                    if (isXml && propertyMapper.xmlIsAttribute) {
                        // XML_ATTRKEY, i.e., $ is the key attributes are kept under in xml2js.
                        // This keeps things simple while preventing name collision
                        // with names in user documents.
                        parentObject[XML_ATTRKEY] = parentObject[XML_ATTRKEY] || {};
                        parentObject[XML_ATTRKEY][propName] = serializedValue;
                    }
                    else if (isXml && propertyMapper.xmlIsWrapped) {
                        parentObject[propName] = { [propertyMapper.xmlElementName]: value };
                    }
                    else {
                        parentObject[propName] = value;
                    }
                }
            }
        }
        const additionalPropertiesMapper = resolveAdditionalProperties(serializer, mapper, objectName);
        if (additionalPropertiesMapper) {
            const propNames = Object.keys(modelProps);
            for (const clientPropName in object) {
                const isAdditionalProperty = propNames.every((pn) => pn !== clientPropName);
                if (isAdditionalProperty) {
                    payload[clientPropName] = serializer.serialize(additionalPropertiesMapper, object[clientPropName], objectName + '["' + clientPropName + '"]', options);
                }
            }
        }
        return payload;
    }
    return object;
}
function getXmlObjectValue(propertyMapper, serializedValue, isXml, options) {
    if (!isXml || !propertyMapper.xmlNamespace) {
        return serializedValue;
    }
    const xmlnsKey = propertyMapper.xmlNamespacePrefix
        ? `xmlns:${propertyMapper.xmlNamespacePrefix}`
        : "xmlns";
    const xmlNamespace = { [xmlnsKey]: propertyMapper.xmlNamespace };
    if (["Composite"].includes(propertyMapper.type.name)) {
        if (serializedValue[XML_ATTRKEY]) {
            return serializedValue;
        }
        else {
            const result = Object.assign({}, serializedValue);
            result[XML_ATTRKEY] = xmlNamespace;
            return result;
        }
    }
    const result = {};
    result[options.xml.xmlCharKey] = serializedValue;
    result[XML_ATTRKEY] = xmlNamespace;
    return result;
}
function isSpecialXmlProperty(propertyName, options) {
    return [XML_ATTRKEY, options.xml.xmlCharKey].includes(propertyName);
}
function deserializeCompositeType(serializer, mapper, responseBody, objectName, options) {
    var _a;
    if (getPolymorphicDiscriminatorRecursively(serializer, mapper)) {
        mapper = getPolymorphicMapper(serializer, mapper, responseBody, "serializedName");
    }
    const modelProps = resolveModelProperties(serializer, mapper, objectName);
    let instance = {};
    const handledPropertyNames = [];
    for (const key of Object.keys(modelProps)) {
        const propertyMapper = modelProps[key];
        const paths = splitSerializeName(modelProps[key].serializedName);
        handledPropertyNames.push(paths[0]);
        const { serializedName, xmlName, xmlElementName } = propertyMapper;
        let propertyObjectName = objectName;
        if (serializedName !== "" && serializedName !== undefined) {
            propertyObjectName = objectName + "." + serializedName;
        }
        const headerCollectionPrefix = propertyMapper.headerCollectionPrefix;
        if (headerCollectionPrefix) {
            const dictionary = {};
            for (const headerKey of Object.keys(responseBody)) {
                if (headerKey.startsWith(headerCollectionPrefix)) {
                    dictionary[headerKey.substring(headerCollectionPrefix.length)] = serializer.deserialize(propertyMapper.type.value, responseBody[headerKey], propertyObjectName, options);
                }
                handledPropertyNames.push(headerKey);
            }
            instance[key] = dictionary;
        }
        else if (serializer.isXML) {
            if (propertyMapper.xmlIsAttribute && responseBody[XML_ATTRKEY]) {
                instance[key] = serializer.deserialize(propertyMapper, responseBody[XML_ATTRKEY][xmlName], propertyObjectName, options);
            }
            else {
                const propertyName = xmlElementName || xmlName || serializedName;
                if (propertyMapper.xmlIsWrapped) {
                    /* a list of <xmlElementName> wrapped by <xmlName>
                      For the xml example below
                        <Cors>
                          <CorsRule>...</CorsRule>
                          <CorsRule>...</CorsRule>
                        </Cors>
                      the responseBody has
                        {
                          Cors: {
                            CorsRule: [{...}, {...}]
                          }
                        }
                      xmlName is "Cors" and xmlElementName is"CorsRule".
                    */
                    const wrapped = responseBody[xmlName];
                    const elementList = (_a = wrapped === null || wrapped === void 0 ? void 0 : wrapped[xmlElementName]) !== null && _a !== void 0 ? _a : [];
                    instance[key] = serializer.deserialize(propertyMapper, elementList, propertyObjectName, options);
                }
                else {
                    const property = responseBody[propertyName];
                    instance[key] = serializer.deserialize(propertyMapper, property, propertyObjectName, options);
                }
            }
        }
        else {
            // deserialize the property if it is present in the provided responseBody instance
            let propertyInstance;
            let res = responseBody;
            // traversing the object step by step.
            for (const item of paths) {
                if (!res)
                    break;
                res = res[item];
            }
            propertyInstance = res;
            const polymorphicDiscriminator = mapper.type.polymorphicDiscriminator;
            // checking that the model property name (key)(ex: "fishtype") and the
            // clientName of the polymorphicDiscriminator {metadata} (ex: "fishtype")
            // instead of the serializedName of the polymorphicDiscriminator (ex: "fish.type")
            // is a better approach. The generator is not consistent with escaping '\.' in the
            // serializedName of the property (ex: "fish\.type") that is marked as polymorphic discriminator
            // and the serializedName of the metadata polymorphicDiscriminator (ex: "fish.type"). However,
            // the clientName transformation of the polymorphicDiscriminator (ex: "fishtype") and
            // the transformation of model property name (ex: "fishtype") is done consistently.
            // Hence, it is a safer bet to rely on the clientName of the polymorphicDiscriminator.
            if (polymorphicDiscriminator &&
                key === polymorphicDiscriminator.clientName &&
                (propertyInstance === undefined || propertyInstance === null)) {
                propertyInstance = mapper.serializedName;
            }
            let serializedValue;
            // paging
            if (Array.isArray(responseBody[key]) && modelProps[key].serializedName === "") {
                propertyInstance = responseBody[key];
                const arrayInstance = serializer.deserialize(propertyMapper, propertyInstance, propertyObjectName, options);
                // Copy over any properties that have already been added into the instance, where they do
                // not exist on the newly de-serialized array
                for (const [k, v] of Object.entries(instance)) {
                    if (!Object.prototype.hasOwnProperty.call(arrayInstance, k)) {
                        arrayInstance[k] = v;
                    }
                }
                instance = arrayInstance;
            }
            else if (propertyInstance !== undefined || propertyMapper.defaultValue !== undefined) {
                serializedValue = serializer.deserialize(propertyMapper, propertyInstance, propertyObjectName, options);
                instance[key] = serializedValue;
            }
        }
    }
    const additionalPropertiesMapper = mapper.type.additionalProperties;
    if (additionalPropertiesMapper) {
        const isAdditionalProperty = (responsePropName) => {
            for (const clientPropName in modelProps) {
                const paths = splitSerializeName(modelProps[clientPropName].serializedName);
                if (paths[0] === responsePropName) {
                    return false;
                }
            }
            return true;
        };
        for (const responsePropName in responseBody) {
            if (isAdditionalProperty(responsePropName)) {
                instance[responsePropName] = serializer.deserialize(additionalPropertiesMapper, responseBody[responsePropName], objectName + '["' + responsePropName + '"]', options);
            }
        }
    }
    else if (responseBody) {
        for (const key of Object.keys(responseBody)) {
            if (instance[key] === undefined &&
                !handledPropertyNames.includes(key) &&
                !isSpecialXmlProperty(key, options)) {
                instance[key] = responseBody[key];
            }
        }
    }
    return instance;
}
function deserializeDictionaryType(serializer, mapper, responseBody, objectName, options) {
    /* jshint validthis: true */
    const value = mapper.type.value;
    if (!value || typeof value !== "object") {
        throw new Error(`"value" metadata for a Dictionary must be defined in the ` +
            `mapper and it must of type "object" in ${objectName}`);
    }
    if (responseBody) {
        const tempDictionary = {};
        for (const key of Object.keys(responseBody)) {
            tempDictionary[key] = serializer.deserialize(value, responseBody[key], objectName, options);
        }
        return tempDictionary;
    }
    return responseBody;
}
function deserializeSequenceType(serializer, mapper, responseBody, objectName, options) {
    var _a;
    let element = mapper.type.element;
    if (!element || typeof element !== "object") {
        throw new Error(`element" metadata for an Array must be defined in the ` +
            `mapper and it must of type "object" in ${objectName}`);
    }
    if (responseBody) {
        if (!Array.isArray(responseBody)) {
            // xml2js will interpret a single element array as just the element, so force it to be an array
            responseBody = [responseBody];
        }
        // Quirk: Composite mappers referenced by `element` might
        // not have *all* properties declared (like uberParent),
        // so let's try to look up the full definition by name.
        if (element.type.name === "Composite" && element.type.className) {
            element = (_a = serializer.modelMappers[element.type.className]) !== null && _a !== void 0 ? _a : element;
        }
        const tempArray = [];
        for (let i = 0; i < responseBody.length; i++) {
            tempArray[i] = serializer.deserialize(element, responseBody[i], `${objectName}[${i}]`, options);
        }
        return tempArray;
    }
    return responseBody;
}
function getPolymorphicMapper(serializer, mapper, object, polymorphicPropertyName) {
    const polymorphicDiscriminator = getPolymorphicDiscriminatorRecursively(serializer, mapper);
    if (polymorphicDiscriminator) {
        let discriminatorName = polymorphicDiscriminator[polymorphicPropertyName];
        if (discriminatorName) {
            // The serializedName might have \\, which we just want to ignore
            if (polymorphicPropertyName === "serializedName") {
                discriminatorName = discriminatorName.replace(/\\/gi, "");
            }
            const discriminatorValue = object[discriminatorName];
            if (discriminatorValue !== undefined && discriminatorValue !== null) {
                const typeName = mapper.type.uberParent || mapper.type.className;
                const indexDiscriminator = discriminatorValue === typeName
                    ? discriminatorValue
                    : typeName + "." + discriminatorValue;
                const polymorphicMapper = serializer.modelMappers.discriminators[indexDiscriminator];
                if (polymorphicMapper) {
                    mapper = polymorphicMapper;
                }
            }
        }
    }
    return mapper;
}
function getPolymorphicDiscriminatorRecursively(serializer, mapper) {
    return (mapper.type.polymorphicDiscriminator ||
        getPolymorphicDiscriminatorSafely(serializer, mapper.type.uberParent) ||
        getPolymorphicDiscriminatorSafely(serializer, mapper.type.className));
}
function getPolymorphicDiscriminatorSafely(serializer, typeName) {
    return (typeName &&
        serializer.modelMappers[typeName] &&
        serializer.modelMappers[typeName].type.polymorphicDiscriminator);
}
/**
 * Known types of Mappers
 */
const MapperTypeNames = {
    Base64Url: "Base64Url",
    Boolean: "Boolean",
    ByteArray: "ByteArray",
    Composite: "Composite",
    Date: "Date",
    DateTime: "DateTime",
    DateTimeRfc1123: "DateTimeRfc1123",
    Dictionary: "Dictionary",
    Enum: "Enum",
    Number: "Number",
    Object: "Object",
    Sequence: "Sequence",
    String: "String",
    Stream: "Stream",
    TimeSpan: "TimeSpan",
    UnixTime: "UnixTime",
};

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * @internal
 * Retrieves the value to use for a given operation argument
 * @param operationArguments - The arguments passed from the generated client
 * @param parameter - The parameter description
 * @param fallbackObject - If something isn't found in the arguments bag, look here.
 *  Generally used to look at the service client properties.
 */
function getOperationArgumentValueFromParameter(operationArguments, parameter, fallbackObject) {
    let parameterPath = parameter.parameterPath;
    const parameterMapper = parameter.mapper;
    let value;
    if (typeof parameterPath === "string") {
        parameterPath = [parameterPath];
    }
    if (Array.isArray(parameterPath)) {
        if (parameterPath.length > 0) {
            if (parameterMapper.isConstant) {
                value = parameterMapper.defaultValue;
            }
            else {
                let propertySearchResult = getPropertyFromParameterPath(operationArguments, parameterPath);
                if (!propertySearchResult.propertyFound && fallbackObject) {
                    propertySearchResult = getPropertyFromParameterPath(fallbackObject, parameterPath);
                }
                let useDefaultValue = false;
                if (!propertySearchResult.propertyFound) {
                    useDefaultValue =
                        parameterMapper.required ||
                            (parameterPath[0] === "options" && parameterPath.length === 2);
                }
                value = useDefaultValue ? parameterMapper.defaultValue : propertySearchResult.propertyValue;
            }
        }
    }
    else {
        if (parameterMapper.required) {
            value = {};
        }
        for (const propertyName in parameterPath) {
            const propertyMapper = parameterMapper.type.modelProperties[propertyName];
            const propertyPath = parameterPath[propertyName];
            const propertyValue = getOperationArgumentValueFromParameter(operationArguments, {
                parameterPath: propertyPath,
                mapper: propertyMapper,
            }, fallbackObject);
            if (propertyValue !== undefined) {
                if (!value) {
                    value = {};
                }
                value[propertyName] = propertyValue;
            }
        }
    }
    return value;
}
function getPropertyFromParameterPath(parent, parameterPath) {
    const result = { propertyFound: false };
    let i = 0;
    for (; i < parameterPath.length; ++i) {
        const parameterPathPart = parameterPath[i];
        // Make sure to check inherited properties too, so don't use hasOwnProperty().
        if (parent && parameterPathPart in parent) {
            parent = parent[parameterPathPart];
        }
        else {
            break;
        }
    }
    if (i === parameterPath.length) {
        result.propertyValue = parent;
        result.propertyFound = true;
    }
    return result;
}
const operationRequestMap = new WeakMap();
function getOperationRequestInfo(request) {
    let info = operationRequestMap.get(request);
    if (!info) {
        info = {};
        operationRequestMap.set(request, info);
    }
    return info;
}

// Copyright (c) Microsoft Corporation.
const defaultJsonContentTypes = ["application/json", "text/json"];
const defaultXmlContentTypes = ["application/xml", "application/atom+xml"];
/**
 * The programmatic identifier of the deserializationPolicy.
 */
const deserializationPolicyName = "deserializationPolicy";
/**
 * This policy handles parsing out responses according to OperationSpecs on the request.
 */
function deserializationPolicy(options = {}) {
    var _a, _b, _c, _d, _e, _f, _g;
    const jsonContentTypes = (_b = (_a = options.expectedContentTypes) === null || _a === void 0 ? void 0 : _a.json) !== null && _b !== void 0 ? _b : defaultJsonContentTypes;
    const xmlContentTypes = (_d = (_c = options.expectedContentTypes) === null || _c === void 0 ? void 0 : _c.xml) !== null && _d !== void 0 ? _d : defaultXmlContentTypes;
    const parseXML = options.parseXML;
    const serializerOptions = options.serializerOptions;
    const updatedOptions = {
        xml: {
            rootName: (_e = serializerOptions === null || serializerOptions === void 0 ? void 0 : serializerOptions.xml.rootName) !== null && _e !== void 0 ? _e : "",
            includeRoot: (_f = serializerOptions === null || serializerOptions === void 0 ? void 0 : serializerOptions.xml.includeRoot) !== null && _f !== void 0 ? _f : false,
            xmlCharKey: (_g = serializerOptions === null || serializerOptions === void 0 ? void 0 : serializerOptions.xml.xmlCharKey) !== null && _g !== void 0 ? _g : XML_CHARKEY,
        },
    };
    return {
        name: deserializationPolicyName,
        async sendRequest(request, next) {
            const response = await next(request);
            return deserializeResponseBody(jsonContentTypes, xmlContentTypes, response, updatedOptions, parseXML);
        },
    };
}
function getOperationResponseMap(parsedResponse) {
    let result;
    const request = parsedResponse.request;
    const operationInfo = getOperationRequestInfo(request);
    const operationSpec = operationInfo === null || operationInfo === void 0 ? void 0 : operationInfo.operationSpec;
    if (operationSpec) {
        if (!(operationInfo === null || operationInfo === void 0 ? void 0 : operationInfo.operationResponseGetter)) {
            result = operationSpec.responses[parsedResponse.status];
        }
        else {
            result = operationInfo === null || operationInfo === void 0 ? void 0 : operationInfo.operationResponseGetter(operationSpec, parsedResponse);
        }
    }
    return result;
}
function shouldDeserializeResponse(parsedResponse) {
    const request = parsedResponse.request;
    const operationInfo = getOperationRequestInfo(request);
    const shouldDeserialize = operationInfo === null || operationInfo === void 0 ? void 0 : operationInfo.shouldDeserialize;
    let result;
    if (shouldDeserialize === undefined) {
        result = true;
    }
    else if (typeof shouldDeserialize === "boolean") {
        result = shouldDeserialize;
    }
    else {
        result = shouldDeserialize(parsedResponse);
    }
    return result;
}
async function deserializeResponseBody(jsonContentTypes, xmlContentTypes, response, options, parseXML) {
    const parsedResponse = await parse(jsonContentTypes, xmlContentTypes, response, options, parseXML);
    if (!shouldDeserializeResponse(parsedResponse)) {
        return parsedResponse;
    }
    const operationInfo = getOperationRequestInfo(parsedResponse.request);
    const operationSpec = operationInfo === null || operationInfo === void 0 ? void 0 : operationInfo.operationSpec;
    if (!operationSpec || !operationSpec.responses) {
        return parsedResponse;
    }
    const responseSpec = getOperationResponseMap(parsedResponse);
    const { error, shouldReturnResponse } = handleErrorResponse(parsedResponse, operationSpec, responseSpec);
    if (error) {
        throw error;
    }
    else if (shouldReturnResponse) {
        return parsedResponse;
    }
    // An operation response spec does exist for current status code, so
    // use it to deserialize the response.
    if (responseSpec) {
        if (responseSpec.bodyMapper) {
            let valueToDeserialize = parsedResponse.parsedBody;
            if (operationSpec.isXML && responseSpec.bodyMapper.type.name === MapperTypeNames.Sequence) {
                valueToDeserialize =
                    typeof valueToDeserialize === "object"
                        ? valueToDeserialize[responseSpec.bodyMapper.xmlElementName]
                        : [];
            }
            try {
                parsedResponse.parsedBody = operationSpec.serializer.deserialize(responseSpec.bodyMapper, valueToDeserialize, "operationRes.parsedBody");
            }
            catch (deserializeError) {
                const restError = new coreRestPipeline.RestError(`Error ${deserializeError} occurred in deserializing the responseBody - ${parsedResponse.bodyAsText}`, {
                    statusCode: parsedResponse.status,
                    request: parsedResponse.request,
                    response: parsedResponse,
                });
                throw restError;
            }
        }
        else if (operationSpec.httpMethod === "HEAD") {
            // head methods never have a body, but we return a boolean to indicate presence/absence of the resource
            parsedResponse.parsedBody = response.status >= 200 && response.status < 300;
        }
        if (responseSpec.headersMapper) {
            parsedResponse.parsedHeaders = operationSpec.serializer.deserialize(responseSpec.headersMapper, parsedResponse.headers.toJSON(), "operationRes.parsedHeaders");
        }
    }
    return parsedResponse;
}
function isOperationSpecEmpty(operationSpec) {
    const expectedStatusCodes = Object.keys(operationSpec.responses);
    return (expectedStatusCodes.length === 0 ||
        (expectedStatusCodes.length === 1 && expectedStatusCodes[0] === "default"));
}
function handleErrorResponse(parsedResponse, operationSpec, responseSpec) {
    var _a;
    const isSuccessByStatus = 200 <= parsedResponse.status && parsedResponse.status < 300;
    const isExpectedStatusCode = isOperationSpecEmpty(operationSpec)
        ? isSuccessByStatus
        : !!responseSpec;
    if (isExpectedStatusCode) {
        if (responseSpec) {
            if (!responseSpec.isError) {
                return { error: null, shouldReturnResponse: false };
            }
        }
        else {
            return { error: null, shouldReturnResponse: false };
        }
    }
    const errorResponseSpec = responseSpec !== null && responseSpec !== void 0 ? responseSpec : operationSpec.responses.default;
    const initialErrorMessage = ((_a = parsedResponse.request.streamResponseStatusCodes) === null || _a === void 0 ? void 0 : _a.has(parsedResponse.status))
        ? `Unexpected status code: ${parsedResponse.status}`
        : parsedResponse.bodyAsText;
    const error = new coreRestPipeline.RestError(initialErrorMessage, {
        statusCode: parsedResponse.status,
        request: parsedResponse.request,
        response: parsedResponse,
    });
    // If the item failed but there's no error spec or default spec to deserialize the error,
    // we should fail so we just throw the parsed response
    if (!errorResponseSpec) {
        throw error;
    }
    const defaultBodyMapper = errorResponseSpec.bodyMapper;
    const defaultHeadersMapper = errorResponseSpec.headersMapper;
    try {
        // If error response has a body, try to deserialize it using default body mapper.
        // Then try to extract error code & message from it
        if (parsedResponse.parsedBody) {
            const parsedBody = parsedResponse.parsedBody;
            let deserializedError;
            if (defaultBodyMapper) {
                let valueToDeserialize = parsedBody;
                if (operationSpec.isXML && defaultBodyMapper.type.name === MapperTypeNames.Sequence) {
                    valueToDeserialize = [];
                    const elementName = defaultBodyMapper.xmlElementName;
                    if (typeof parsedBody === "object" && elementName) {
                        valueToDeserialize = parsedBody[elementName];
                    }
                }
                deserializedError = operationSpec.serializer.deserialize(defaultBodyMapper, valueToDeserialize, "error.response.parsedBody");
            }
            const internalError = parsedBody.error || deserializedError || parsedBody;
            error.code = internalError.code;
            if (internalError.message) {
                error.message = internalError.message;
            }
            if (defaultBodyMapper) {
                error.response.parsedBody = deserializedError;
            }
        }
        // If error response has headers, try to deserialize it using default header mapper
        if (parsedResponse.headers && defaultHeadersMapper) {
            error.response.parsedHeaders =
                operationSpec.serializer.deserialize(defaultHeadersMapper, parsedResponse.headers.toJSON(), "operationRes.parsedHeaders");
        }
    }
    catch (defaultError) {
        error.message = `Error "${defaultError.message}" occurred in deserializing the responseBody - "${parsedResponse.bodyAsText}" for the default response.`;
    }
    return { error, shouldReturnResponse: false };
}
async function parse(jsonContentTypes, xmlContentTypes, operationResponse, opts, parseXML) {
    var _a;
    if (!((_a = operationResponse.request.streamResponseStatusCodes) === null || _a === void 0 ? void 0 : _a.has(operationResponse.status)) &&
        operationResponse.bodyAsText) {
        const text = operationResponse.bodyAsText;
        const contentType = operationResponse.headers.get("Content-Type") || "";
        const contentComponents = !contentType
            ? []
            : contentType.split(";").map((component) => component.toLowerCase());
        try {
            if (contentComponents.length === 0 ||
                contentComponents.some((component) => jsonContentTypes.indexOf(component) !== -1)) {
                operationResponse.parsedBody = JSON.parse(text);
                return operationResponse;
            }
            else if (contentComponents.some((component) => xmlContentTypes.indexOf(component) !== -1)) {
                if (!parseXML) {
                    throw new Error("Parsing XML not supported.");
                }
                const body = await parseXML(text, opts.xml);
                operationResponse.parsedBody = body;
                return operationResponse;
            }
        }
        catch (err) {
            const msg = `Error "${err}" occurred while parsing the response body - ${operationResponse.bodyAsText}.`;
            const errCode = err.code || coreRestPipeline.RestError.PARSE_ERROR;
            const e = new coreRestPipeline.RestError(msg, {
                code: errCode,
                statusCode: operationResponse.status,
                request: operationResponse.request,
                response: operationResponse,
            });
            throw e;
        }
    }
    return operationResponse;
}

// Copyright (c) Microsoft Corporation.
/**
 * Gets the list of status codes for streaming responses.
 * @internal
 */
function getStreamingResponseStatusCodes(operationSpec) {
    const result = new Set();
    for (const statusCode in operationSpec.responses) {
        const operationResponse = operationSpec.responses[statusCode];
        if (operationResponse.bodyMapper &&
            operationResponse.bodyMapper.type.name === MapperTypeNames.Stream) {
            result.add(Number(statusCode));
        }
    }
    return result;
}
/**
 * Get the path to this parameter's value as a dotted string (a.b.c).
 * @param parameter - The parameter to get the path string for.
 * @returns The path to this parameter's value as a dotted string.
 * @internal
 */
function getPathStringFromParameter(parameter) {
    const { parameterPath, mapper } = parameter;
    let result;
    if (typeof parameterPath === "string") {
        result = parameterPath;
    }
    else if (Array.isArray(parameterPath)) {
        result = parameterPath.join(".");
    }
    else {
        result = mapper.serializedName;
    }
    return result;
}

// Copyright (c) Microsoft Corporation.
/**
 * The programmatic identifier of the serializationPolicy.
 */
const serializationPolicyName = "serializationPolicy";
/**
 * This policy handles assembling the request body and headers using
 * an OperationSpec and OperationArguments on the request.
 */
function serializationPolicy(options = {}) {
    const stringifyXML = options.stringifyXML;
    return {
        name: serializationPolicyName,
        async sendRequest(request, next) {
            const operationInfo = getOperationRequestInfo(request);
            const operationSpec = operationInfo === null || operationInfo === void 0 ? void 0 : operationInfo.operationSpec;
            const operationArguments = operationInfo === null || operationInfo === void 0 ? void 0 : operationInfo.operationArguments;
            if (operationSpec && operationArguments) {
                serializeHeaders(request, operationArguments, operationSpec);
                serializeRequestBody(request, operationArguments, operationSpec, stringifyXML);
            }
            return next(request);
        },
    };
}
/**
 * @internal
 */
function serializeHeaders(request, operationArguments, operationSpec) {
    var _a, _b;
    if (operationSpec.headerParameters) {
        for (const headerParameter of operationSpec.headerParameters) {
            let headerValue = getOperationArgumentValueFromParameter(operationArguments, headerParameter);
            if ((headerValue !== null && headerValue !== undefined) || headerParameter.mapper.required) {
                headerValue = operationSpec.serializer.serialize(headerParameter.mapper, headerValue, getPathStringFromParameter(headerParameter));
                const headerCollectionPrefix = headerParameter.mapper
                    .headerCollectionPrefix;
                if (headerCollectionPrefix) {
                    for (const key of Object.keys(headerValue)) {
                        request.headers.set(headerCollectionPrefix + key, headerValue[key]);
                    }
                }
                else {
                    request.headers.set(headerParameter.mapper.serializedName || getPathStringFromParameter(headerParameter), headerValue);
                }
            }
        }
    }
    const customHeaders = (_b = (_a = operationArguments.options) === null || _a === void 0 ? void 0 : _a.requestOptions) === null || _b === void 0 ? void 0 : _b.customHeaders;
    if (customHeaders) {
        for (const customHeaderName of Object.keys(customHeaders)) {
            request.headers.set(customHeaderName, customHeaders[customHeaderName]);
        }
    }
}
/**
 * @internal
 */
function serializeRequestBody(request, operationArguments, operationSpec, stringifyXML = function () {
    throw new Error("XML serialization unsupported!");
}) {
    var _a, _b, _c, _d, _e;
    const serializerOptions = (_a = operationArguments.options) === null || _a === void 0 ? void 0 : _a.serializerOptions;
    const updatedOptions = {
        xml: {
            rootName: (_b = serializerOptions === null || serializerOptions === void 0 ? void 0 : serializerOptions.xml.rootName) !== null && _b !== void 0 ? _b : "",
            includeRoot: (_c = serializerOptions === null || serializerOptions === void 0 ? void 0 : serializerOptions.xml.includeRoot) !== null && _c !== void 0 ? _c : false,
            xmlCharKey: (_d = serializerOptions === null || serializerOptions === void 0 ? void 0 : serializerOptions.xml.xmlCharKey) !== null && _d !== void 0 ? _d : XML_CHARKEY,
        },
    };
    const xmlCharKey = updatedOptions.xml.xmlCharKey;
    if (operationSpec.requestBody && operationSpec.requestBody.mapper) {
        request.body = getOperationArgumentValueFromParameter(operationArguments, operationSpec.requestBody);
        const bodyMapper = operationSpec.requestBody.mapper;
        const { required, serializedName, xmlName, xmlElementName, xmlNamespace, xmlNamespacePrefix, nullable, } = bodyMapper;
        const typeName = bodyMapper.type.name;
        try {
            if ((request.body !== undefined && request.body !== null) ||
                (nullable && request.body === null) ||
                required) {
                const requestBodyParameterPathString = getPathStringFromParameter(operationSpec.requestBody);
                request.body = operationSpec.serializer.serialize(bodyMapper, request.body, requestBodyParameterPathString, updatedOptions);
                const isStream = typeName === MapperTypeNames.Stream;
                if (operationSpec.isXML) {
                    const xmlnsKey = xmlNamespacePrefix ? `xmlns:${xmlNamespacePrefix}` : "xmlns";
                    const value = getXmlValueWithNamespace(xmlNamespace, xmlnsKey, typeName, request.body, updatedOptions);
                    if (typeName === MapperTypeNames.Sequence) {
                        request.body = stringifyXML(prepareXMLRootList(value, xmlElementName || xmlName || serializedName, xmlnsKey, xmlNamespace), { rootName: xmlName || serializedName, xmlCharKey });
                    }
                    else if (!isStream) {
                        request.body = stringifyXML(value, {
                            rootName: xmlName || serializedName,
                            xmlCharKey,
                        });
                    }
                }
                else if (typeName === MapperTypeNames.String &&
                    (((_e = operationSpec.contentType) === null || _e === void 0 ? void 0 : _e.match("text/plain")) || operationSpec.mediaType === "text")) {
                    // the String serializer has validated that request body is a string
                    // so just send the string.
                    return;
                }
                else if (!isStream) {
                    request.body = JSON.stringify(request.body);
                }
            }
        }
        catch (error) {
            throw new Error(`Error "${error.message}" occurred in serializing the payload - ${JSON.stringify(serializedName, undefined, "  ")}.`);
        }
    }
    else if (operationSpec.formDataParameters && operationSpec.formDataParameters.length > 0) {
        request.formData = {};
        for (const formDataParameter of operationSpec.formDataParameters) {
            const formDataParameterValue = getOperationArgumentValueFromParameter(operationArguments, formDataParameter);
            if (formDataParameterValue !== undefined && formDataParameterValue !== null) {
                const formDataParameterPropertyName = formDataParameter.mapper.serializedName || getPathStringFromParameter(formDataParameter);
                request.formData[formDataParameterPropertyName] = operationSpec.serializer.serialize(formDataParameter.mapper, formDataParameterValue, getPathStringFromParameter(formDataParameter), updatedOptions);
            }
        }
    }
}
/**
 * Adds an xml namespace to the xml serialized object if needed, otherwise it just returns the value itself
 */
function getXmlValueWithNamespace(xmlNamespace, xmlnsKey, typeName, serializedValue, options) {
    // Composite and Sequence schemas already got their root namespace set during serialization
    // We just need to add xmlns to the other schema types
    if (xmlNamespace && !["Composite", "Sequence", "Dictionary"].includes(typeName)) {
        const result = {};
        result[options.xml.xmlCharKey] = serializedValue;
        result[XML_ATTRKEY] = { [xmlnsKey]: xmlNamespace };
        return result;
    }
    return serializedValue;
}
function prepareXMLRootList(obj, elementName, xmlNamespaceKey, xmlNamespace) {
    if (!Array.isArray(obj)) {
        obj = [obj];
    }
    if (!xmlNamespaceKey || !xmlNamespace) {
        return { [elementName]: obj };
    }
    const result = { [elementName]: obj };
    result[XML_ATTRKEY] = { [xmlNamespaceKey]: xmlNamespace };
    return result;
}

// Copyright (c) Microsoft Corporation.
/**
 * Creates a new Pipeline for use with a Service Client.
 * Adds in deserializationPolicy by default.
 * Also adds in bearerTokenAuthenticationPolicy if passed a TokenCredential.
 * @param options - Options to customize the created pipeline.
 */
function createClientPipeline(options = {}) {
    const pipeline = coreRestPipeline.createPipelineFromOptions(options !== null && options !== void 0 ? options : {});
    if (options.credentialOptions) {
        pipeline.addPolicy(coreRestPipeline.bearerTokenAuthenticationPolicy({
            credential: options.credentialOptions.credential,
            scopes: options.credentialOptions.credentialScopes,
        }));
    }
    pipeline.addPolicy(serializationPolicy(options.serializationOptions), { phase: "Serialize" });
    pipeline.addPolicy(deserializationPolicy(options.deserializationOptions), {
        phase: "Deserialize",
    });
    return pipeline;
}

// Copyright (c) Microsoft Corporation.
let cachedHttpClient;
function getCachedDefaultHttpClient() {
    if (!cachedHttpClient) {
        cachedHttpClient = coreRestPipeline.createDefaultHttpClient();
    }
    return cachedHttpClient;
}

// Copyright (c) Microsoft Corporation.
const CollectionFormatToDelimiterMap = {
    CSV: ",",
    SSV: " ",
    Multi: "Multi",
    TSV: "\t",
    Pipes: "|",
};
function getRequestUrl(baseUri, operationSpec, operationArguments, fallbackObject) {
    const urlReplacements = calculateUrlReplacements(operationSpec, operationArguments, fallbackObject);
    let isAbsolutePath = false;
    let requestUrl = replaceAll(baseUri, urlReplacements);
    if (operationSpec.path) {
        let path = replaceAll(operationSpec.path, urlReplacements);
        // QUIRK: sometimes we get a path component like /{nextLink}
        // which may be a fully formed URL with a leading /. In that case, we should
        // remove the leading /
        if (operationSpec.path === "/{nextLink}" && path.startsWith("/")) {
            path = path.substring(1);
        }
        // QUIRK: sometimes we get a path component like {nextLink}
        // which may be a fully formed URL. In that case, we should
        // ignore the baseUri.
        if (isAbsoluteUrl(path)) {
            requestUrl = path;
            isAbsolutePath = true;
        }
        else {
            requestUrl = appendPath(requestUrl, path);
        }
    }
    const { queryParams, sequenceParams } = calculateQueryParameters(operationSpec, operationArguments, fallbackObject);
    /**
     * Notice that this call sets the `noOverwrite` parameter to true if the `requestUrl`
     * is an absolute path. This ensures that existing query parameter values in `requestUrl`
     * do not get overwritten. On the other hand when `requestUrl` is not absolute path, it
     * is still being built so there is nothing to overwrite.
     */
    requestUrl = appendQueryParams(requestUrl, queryParams, sequenceParams, isAbsolutePath);
    return requestUrl;
}
function replaceAll(input, replacements) {
    let result = input;
    for (const [searchValue, replaceValue] of replacements) {
        result = result.split(searchValue).join(replaceValue);
    }
    return result;
}
function calculateUrlReplacements(operationSpec, operationArguments, fallbackObject) {
    var _a;
    const result = new Map();
    if ((_a = operationSpec.urlParameters) === null || _a === void 0 ? void 0 : _a.length) {
        for (const urlParameter of operationSpec.urlParameters) {
            let urlParameterValue = getOperationArgumentValueFromParameter(operationArguments, urlParameter, fallbackObject);
            const parameterPathString = getPathStringFromParameter(urlParameter);
            urlParameterValue = operationSpec.serializer.serialize(urlParameter.mapper, urlParameterValue, parameterPathString);
            if (!urlParameter.skipEncoding) {
                urlParameterValue = encodeURIComponent(urlParameterValue);
            }
            result.set(`{${urlParameter.mapper.serializedName || parameterPathString}}`, urlParameterValue);
        }
    }
    return result;
}
function isAbsoluteUrl(url) {
    return url.includes("://");
}
function appendPath(url, pathToAppend) {
    if (!pathToAppend) {
        return url;
    }
    const parsedUrl = new URL(url);
    let newPath = parsedUrl.pathname;
    if (!newPath.endsWith("/")) {
        newPath = `${newPath}/`;
    }
    if (pathToAppend.startsWith("/")) {
        pathToAppend = pathToAppend.substring(1);
    }
    const searchStart = pathToAppend.indexOf("?");
    if (searchStart !== -1) {
        const path = pathToAppend.substring(0, searchStart);
        const search = pathToAppend.substring(searchStart + 1);
        newPath = newPath + path;
        if (search) {
            parsedUrl.search = parsedUrl.search ? `${parsedUrl.search}&${search}` : search;
        }
    }
    else {
        newPath = newPath + pathToAppend;
    }
    parsedUrl.pathname = newPath;
    return parsedUrl.toString();
}
function calculateQueryParameters(operationSpec, operationArguments, fallbackObject) {
    var _a;
    const result = new Map();
    const sequenceParams = new Set();
    if ((_a = operationSpec.queryParameters) === null || _a === void 0 ? void 0 : _a.length) {
        for (const queryParameter of operationSpec.queryParameters) {
            if (queryParameter.mapper.type.name === "Sequence" && queryParameter.mapper.serializedName) {
                sequenceParams.add(queryParameter.mapper.serializedName);
            }
            let queryParameterValue = getOperationArgumentValueFromParameter(operationArguments, queryParameter, fallbackObject);
            if ((queryParameterValue !== undefined && queryParameterValue !== null) ||
                queryParameter.mapper.required) {
                queryParameterValue = operationSpec.serializer.serialize(queryParameter.mapper, queryParameterValue, getPathStringFromParameter(queryParameter));
                const delimiter = queryParameter.collectionFormat
                    ? CollectionFormatToDelimiterMap[queryParameter.collectionFormat]
                    : "";
                if (Array.isArray(queryParameterValue)) {
                    // replace null and undefined
                    queryParameterValue = queryParameterValue.map((item) => {
                        if (item === null || item === undefined) {
                            return "";
                        }
                        return item;
                    });
                }
                if (queryParameter.collectionFormat === "Multi" && queryParameterValue.length === 0) {
                    continue;
                }
                else if (Array.isArray(queryParameterValue) &&
                    (queryParameter.collectionFormat === "SSV" || queryParameter.collectionFormat === "TSV")) {
                    queryParameterValue = queryParameterValue.join(delimiter);
                }
                if (!queryParameter.skipEncoding) {
                    if (Array.isArray(queryParameterValue)) {
                        queryParameterValue = queryParameterValue.map((item) => {
                            return encodeURIComponent(item);
                        });
                    }
                    else {
                        queryParameterValue = encodeURIComponent(queryParameterValue);
                    }
                }
                // Join pipes and CSV *after* encoding, or the server will be upset.
                if (Array.isArray(queryParameterValue) &&
                    (queryParameter.collectionFormat === "CSV" || queryParameter.collectionFormat === "Pipes")) {
                    queryParameterValue = queryParameterValue.join(delimiter);
                }
                result.set(queryParameter.mapper.serializedName || getPathStringFromParameter(queryParameter), queryParameterValue);
            }
        }
    }
    return {
        queryParams: result,
        sequenceParams,
    };
}
function simpleParseQueryParams(queryString) {
    const result = new Map();
    if (!queryString || queryString[0] !== "?") {
        return result;
    }
    // remove the leading ?
    queryString = queryString.slice(1);
    const pairs = queryString.split("&");
    for (const pair of pairs) {
        const [name, value] = pair.split("=", 2);
        const existingValue = result.get(name);
        if (existingValue) {
            if (Array.isArray(existingValue)) {
                existingValue.push(value);
            }
            else {
                result.set(name, [existingValue, value]);
            }
        }
        else {
            result.set(name, value);
        }
    }
    return result;
}
/** @internal */
function appendQueryParams(url, queryParams, sequenceParams, noOverwrite = false) {
    if (queryParams.size === 0) {
        return url;
    }
    const parsedUrl = new URL(url);
    // QUIRK: parsedUrl.searchParams will have their name/value pairs decoded, which
    // can change their meaning to the server, such as in the case of a SAS signature.
    // To avoid accidentally un-encoding a query param, we parse the key/values ourselves
    const combinedParams = simpleParseQueryParams(parsedUrl.search);
    for (const [name, value] of queryParams) {
        const existingValue = combinedParams.get(name);
        if (Array.isArray(existingValue)) {
            if (Array.isArray(value)) {
                existingValue.push(...value);
                const valueSet = new Set(existingValue);
                combinedParams.set(name, Array.from(valueSet));
            }
            else {
                existingValue.push(value);
            }
        }
        else if (existingValue) {
            if (Array.isArray(value)) {
                value.unshift(existingValue);
            }
            else if (sequenceParams.has(name)) {
                combinedParams.set(name, [existingValue, value]);
            }
            if (!noOverwrite) {
                combinedParams.set(name, value);
            }
        }
        else {
            combinedParams.set(name, value);
        }
    }
    const searchPieces = [];
    for (const [name, value] of combinedParams) {
        if (typeof value === "string") {
            searchPieces.push(`${name}=${value}`);
        }
        else if (Array.isArray(value)) {
            // QUIRK: If we get an array of values, include multiple key/value pairs
            for (const subValue of value) {
                searchPieces.push(`${name}=${subValue}`);
            }
        }
        else {
            searchPieces.push(`${name}=${value}`);
        }
    }
    // QUIRK: we have to set search manually as searchParams will encode comma when it shouldn't.
    parsedUrl.search = searchPieces.length ? `?${searchPieces.join("&")}` : "";
    return parsedUrl.toString();
}

// Copyright (c) Microsoft Corporation.
const logger = logger$1.createClientLogger("core-client");

// Copyright (c) Microsoft Corporation.
/**
 * Initializes a new instance of the ServiceClient.
 */
class ServiceClient {
    /**
     * The ServiceClient constructor
     * @param credential - The credentials used for authentication with the service.
     * @param options - The service client options that govern the behavior of the client.
     */
    constructor(options = {}) {
        var _a, _b;
        this._requestContentType = options.requestContentType;
        this._endpoint = (_a = options.endpoint) !== null && _a !== void 0 ? _a : options.baseUri;
        if (options.baseUri) {
            logger.warning("The baseUri option for SDK Clients has been deprecated, please use endpoint instead.");
        }
        this._allowInsecureConnection = options.allowInsecureConnection;
        this._httpClient = options.httpClient || getCachedDefaultHttpClient();
        this.pipeline = options.pipeline || createDefaultPipeline(options);
        if ((_b = options.additionalPolicies) === null || _b === void 0 ? void 0 : _b.length) {
            for (const { policy, position } of options.additionalPolicies) {
                // Sign happens after Retry and is commonly needed to occur
                // before policies that intercept post-retry.
                const afterPhase = position === "perRetry" ? "Sign" : undefined;
                this.pipeline.addPolicy(policy, {
                    afterPhase,
                });
            }
        }
    }
    /**
     * Send the provided httpRequest.
     */
    async sendRequest(request) {
        return this.pipeline.sendRequest(this._httpClient, request);
    }
    /**
     * Send an HTTP request that is populated using the provided OperationSpec.
     * @typeParam T - The typed result of the request, based on the OperationSpec.
     * @param operationArguments - The arguments that the HTTP request's templated values will be populated from.
     * @param operationSpec - The OperationSpec to use to populate the httpRequest.
     */
    async sendOperationRequest(operationArguments, operationSpec) {
        const endpoint = operationSpec.baseUrl || this._endpoint;
        if (!endpoint) {
            throw new Error("If operationSpec.baseUrl is not specified, then the ServiceClient must have a endpoint string property that contains the base URL to use.");
        }
        // Templatized URLs sometimes reference properties on the ServiceClient child class,
        // so we have to pass `this` below in order to search these properties if they're
        // not part of OperationArguments
        const url = getRequestUrl(endpoint, operationSpec, operationArguments, this);
        const request = coreRestPipeline.createPipelineRequest({
            url,
        });
        request.method = operationSpec.httpMethod;
        const operationInfo = getOperationRequestInfo(request);
        operationInfo.operationSpec = operationSpec;
        operationInfo.operationArguments = operationArguments;
        const contentType = operationSpec.contentType || this._requestContentType;
        if (contentType && operationSpec.requestBody) {
            request.headers.set("Content-Type", contentType);
        }
        const options = operationArguments.options;
        if (options) {
            const requestOptions = options.requestOptions;
            if (requestOptions) {
                if (requestOptions.timeout) {
                    request.timeout = requestOptions.timeout;
                }
                if (requestOptions.onUploadProgress) {
                    request.onUploadProgress = requestOptions.onUploadProgress;
                }
                if (requestOptions.onDownloadProgress) {
                    request.onDownloadProgress = requestOptions.onDownloadProgress;
                }
                if (requestOptions.shouldDeserialize !== undefined) {
                    operationInfo.shouldDeserialize = requestOptions.shouldDeserialize;
                }
                if (requestOptions.allowInsecureConnection) {
                    request.allowInsecureConnection = true;
                }
            }
            if (options.abortSignal) {
                request.abortSignal = options.abortSignal;
            }
            if (options.tracingOptions) {
                request.tracingOptions = options.tracingOptions;
            }
        }
        if (this._allowInsecureConnection) {
            request.allowInsecureConnection = true;
        }
        if (request.streamResponseStatusCodes === undefined) {
            request.streamResponseStatusCodes = getStreamingResponseStatusCodes(operationSpec);
        }
        try {
            const rawResponse = await this.sendRequest(request);
            const flatResponse = flattenResponse(rawResponse, operationSpec.responses[rawResponse.status]);
            if (options === null || options === void 0 ? void 0 : options.onResponse) {
                options.onResponse(rawResponse, flatResponse);
            }
            return flatResponse;
        }
        catch (error) {
            if (typeof error === "object" && (error === null || error === void 0 ? void 0 : error.response)) {
                const rawResponse = error.response;
                const flatResponse = flattenResponse(rawResponse, operationSpec.responses[error.statusCode] || operationSpec.responses["default"]);
                error.details = flatResponse;
                if (options === null || options === void 0 ? void 0 : options.onResponse) {
                    options.onResponse(rawResponse, flatResponse, error);
                }
            }
            throw error;
        }
    }
}
function createDefaultPipeline(options) {
    const credentialScopes = getCredentialScopes(options);
    const credentialOptions = options.credential && credentialScopes
        ? { credentialScopes, credential: options.credential }
        : undefined;
    return createClientPipeline(Object.assign(Object.assign({}, options), { credentialOptions }));
}
function getCredentialScopes(options) {
    if (options.credentialScopes) {
        const scopes = options.credentialScopes;
        return Array.isArray(scopes)
            ? scopes.map((scope) => new URL(scope).toString())
            : new URL(scopes).toString();
    }
    if (options.endpoint) {
        return `${options.endpoint}/.default`;
    }
    if (options.baseUri) {
        return `${options.baseUri}/.default`;
    }
    if (options.credential && !options.credentialScopes) {
        throw new Error(`When using credentials, the ServiceClientOptions must contain either a endpoint or a credentialScopes. Unable to create a bearerTokenAuthenticationPolicy`);
    }
    return undefined;
}

// Copyright (c) Microsoft Corporation.
/**
 * Converts: `Bearer a="b", c="d", Bearer d="e", f="g"`.
 * Into: `[ { a: 'b', c: 'd' }, { d: 'e', f: 'g' } ]`.
 *
 * @internal
 */
function parseCAEChallenge(challenges) {
    const bearerChallenges = `, ${challenges.trim()}`.split(", Bearer ").filter((x) => x);
    return bearerChallenges.map((challenge) => {
        const challengeParts = `${challenge.trim()}, `.split('", ').filter((x) => x);
        const keyValuePairs = challengeParts.map((keyValue) => (([key, value]) => ({ [key]: value }))(keyValue.trim().split('="')));
        // Key-value pairs to plain object:
        return keyValuePairs.reduce((a, b) => (Object.assign(Object.assign({}, a), b)), {});
    });
}
/**
 * This function can be used as a callback for the `bearerTokenAuthenticationPolicy` of `@azure/core-rest-pipeline`, to support CAE challenges:
 * [Continuous Access Evaluation](https://docs.microsoft.com/azure/active-directory/conditional-access/concept-continuous-access-evaluation).
 *
 * Call the `bearerTokenAuthenticationPolicy` with the following options:
 *
 * ```ts
 * import { bearerTokenAuthenticationPolicy } from "@azure/core-rest-pipeline";
 * import { authorizeRequestOnClaimChallenge } from "@azure/core-client";
 *
 * const bearerTokenAuthenticationPolicy = bearerTokenAuthenticationPolicy({
 *   authorizeRequestOnChallenge: authorizeRequestOnClaimChallenge
 * });
 * ```
 *
 * Once provided, the `bearerTokenAuthenticationPolicy` policy will internally handle Continuous Access Evaluation (CAE) challenges.
 * When it can't complete a challenge it will return the 401 (unauthorized) response from ARM.
 *
 * Example challenge with claims:
 *
 * ```
 * Bearer authorization_uri="https://login.windows-ppe.net/", error="invalid_token",
 * error_description="User session has been revoked",
 * claims="eyJhY2Nlc3NfdG9rZW4iOnsibmJmIjp7ImVzc2VudGlhbCI6dHJ1ZSwgInZhbHVlIjoiMTYwMzc0MjgwMCJ9fX0="
 * ```
 */
async function authorizeRequestOnClaimChallenge(onChallengeOptions) {
    const { scopes, response } = onChallengeOptions;
    const logger$1 = onChallengeOptions.logger || logger;
    const challenge = response.headers.get("WWW-Authenticate");
    if (!challenge) {
        logger$1.info(`The WWW-Authenticate header was missing. Failed to perform the Continuous Access Evaluation authentication flow.`);
        return false;
    }
    const challenges = parseCAEChallenge(challenge) || [];
    const parsedChallenge = challenges.find((x) => x.claims);
    if (!parsedChallenge) {
        logger$1.info(`The WWW-Authenticate header was missing the necessary "claims" to perform the Continuous Access Evaluation authentication flow.`);
        return false;
    }
    const accessToken = await onChallengeOptions.getAccessToken(parsedChallenge.scope ? [parsedChallenge.scope] : scopes, {
        claims: decodeStringToString(parsedChallenge.claims),
    });
    if (!accessToken) {
        return false;
    }
    onChallengeOptions.request.headers.set("Authorization", `Bearer ${accessToken.token}`);
    return true;
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * A set of constants used internally when processing requests.
 */
const Constants = {
    DefaultScope: "/.default",
    /**
     * Defines constants for use with HTTP headers.
     */
    HeaderConstants: {
        /**
         * The Authorization header.
         */
        AUTHORIZATION: "authorization",
    },
};
/**
 * Defines a callback to handle auth challenge for Storage APIs.
 * This implements the bearer challenge process described here: https://docs.microsoft.com/rest/api/storageservices/authorize-with-azure-active-directory#bearer-challenge
 * Handling has specific features for storage that departs to the general AAD challenge docs.
 **/
const authorizeRequestOnTenantChallenge = async (challengeOptions) => {
    const requestOptions = requestToOptions(challengeOptions.request);
    const challenge = getChallenge(challengeOptions.response);
    if (challenge) {
        const challengeInfo = parseChallenge(challenge);
        const challengeScopes = buildScopes(challengeOptions, challengeInfo);
        const tenantId = extractTenantId(challengeInfo);
        const accessToken = await challengeOptions.getAccessToken(challengeScopes, Object.assign(Object.assign({}, requestOptions), { tenantId }));
        if (!accessToken) {
            return false;
        }
        challengeOptions.request.headers.set(Constants.HeaderConstants.AUTHORIZATION, `Bearer ${accessToken.token}`);
        return true;
    }
    return false;
};
/**
 * Extracts the tenant id from the challenge information
 * The tenant id is contained in the authorization_uri as the first
 * path part.
 */
function extractTenantId(challengeInfo) {
    const parsedAuthUri = new URL(challengeInfo.authorization_uri);
    const pathSegments = parsedAuthUri.pathname.split("/");
    const tenantId = pathSegments[1];
    return tenantId;
}
/**
 * Builds the authentication scopes based on the information that comes in the
 * challenge information. Scopes url is present in the resource_id, if it is empty
 * we keep using the original scopes.
 */
function buildScopes(challengeOptions, challengeInfo) {
    if (!challengeInfo.resource_uri) {
        return challengeOptions.scopes;
    }
    const challengeScopes = new URL(challengeInfo.resource_uri);
    challengeScopes.pathname = Constants.DefaultScope;
    return [challengeScopes.toString()];
}
/**
 * We will retrieve the challenge only if the response status code was 401,
 * and if the response contained the header "WWW-Authenticate" with a non-empty value.
 */
function getChallenge(response) {
    const challenge = response.headers.get("WWW-Authenticate");
    if (response.status === 401 && challenge) {
        return challenge;
    }
    return;
}
/**
 * Converts: `Bearer a="b" c="d"`.
 * Into: `[ { a: 'b', c: 'd' }]`.
 *
 * @internal
 */
function parseChallenge(challenge) {
    const bearerChallenge = challenge.slice("Bearer ".length);
    const challengeParts = `${bearerChallenge.trim()} `.split(" ").filter((x) => x);
    const keyValuePairs = challengeParts.map((keyValue) => (([key, value]) => ({ [key]: value }))(keyValue.trim().split("=")));
    // Key-value pairs to plain object:
    return keyValuePairs.reduce((a, b) => (Object.assign(Object.assign({}, a), b)), {});
}
/**
 * Extracts the options form a Pipeline Request for later re-use
 */
function requestToOptions(request) {
    return {
        abortSignal: request.abortSignal,
        requestOptions: {
            timeout: request.timeout,
        },
        tracingOptions: request.tracingOptions,
    };
}

exports.MapperTypeNames = MapperTypeNames;
exports.ServiceClient = ServiceClient;
exports.XML_ATTRKEY = XML_ATTRKEY;
exports.XML_CHARKEY = XML_CHARKEY;
exports.authorizeRequestOnClaimChallenge = authorizeRequestOnClaimChallenge;
exports.authorizeRequestOnTenantChallenge = authorizeRequestOnTenantChallenge;
exports.createClientPipeline = createClientPipeline;
exports.createSerializer = createSerializer;
exports.deserializationPolicy = deserializationPolicy;
exports.deserializationPolicyName = deserializationPolicyName;
exports.serializationPolicy = serializationPolicy;
exports.serializationPolicyName = serializationPolicyName;
//# sourceMappingURL=index.js.map
The MIT License (MIT)

Copyright (c) 2020 Microsoft

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": "@azure/core-http",
  "sdk-type": "client",
  "author": "Microsoft Corporation",
  "version": "2.2.5",
  "description": "Isomorphic client Runtime for Typescript/node.js/browser javascript client libraries generated using AutoRest",
  "engines": {
    "node": ">=12.0.0"
  },
  "main": "dist/index.js",
  "module": "./dist-esm/src/coreHttp.js",
  "types": "./types/latest/src/coreHttp.d.ts",
  "typesVersions": {
    "<3.6": {
      "types/latest/src/*": [
        "types/3.1/src/*"
      ]
    }
  },
  "files": [
    "dist/",
    "dist-esm/src/",
    "dom-shim.d.ts",
    "types/*/src/**/*.d.ts",
    "types/*/src/**/*.d.ts.map",
    "README.md",
    "LICENSE"
  ],
  "browser": {
    "./dist-esm/src/policies/msRestUserAgentPolicy.js": "./dist-esm/src/policies/msRestUserAgentPolicy.browser.js",
    "./dist-esm/src/policies/disableResponseDecompressionPolicy.js": "./dist-esm/src/policies/disableResponseDecompressionPolicy.browser.js",
    "./dist-esm/src/policies/proxyPolicy.js": "./dist-esm/src/policies/proxyPolicy.browser.js",
    "./dist-esm/src/util/base64.js": "./dist-esm/src/util/base64.browser.js",
    "./dist-esm/src/util/xml.js": "./dist-esm/src/util/xml.browser.js",
    "./dist-esm/src/defaultHttpClient.js": "./dist-esm/src/defaultHttpClient.browser.js",
    "./dist-esm/src/util/inspect.js": "./dist-esm/src/util/inspect.browser.js"
  },
  "react-native": {
    "./dist/index.js": "./dist-esm/src/coreHttp.js",
    "./dist-esm/src/util/xml.js": "./dist-esm/src/util/xml.js",
    "./dist-esm/src/policies/msRestUserAgentPolicy.js": "./dist-esm/src/policies/msRestUserAgentPolicy.native.js"
  },
  "license": "MIT",
  "homepage": "https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/core/core-http/README.md",
  "repository": "github:Azure/azure-sdk-for-js",
  "sideEffects": false,
  "//metadata": {
    "constantPaths": [
      {
        "path": "src/util/constants.ts",
        "prefix": "coreHttpVersion"
      }
    ]
  },
  "dependencies": {
    "@azure/abort-controller": "^1.0.0",
    "@azure/core-auth": "^1.3.0",
    "@azure/core-tracing": "1.0.0-preview.13",
    "@azure/logger": "^1.0.0",
    "@types/node-fetch": "^2.5.0",
    "@types/tunnel": "^0.0.3",
    "form-data": "^4.0.0",
    "node-fetch": "^2.6.7",
    "process": "^0.11.10",
    "tough-cookie": "^4.0.0",
    "tslib": "^2.2.0",
    "tunnel": "^0.0.6",
    "uuid": "^8.3.0",
    "xml2js": "^0.4.19"
  },
  "devDependencies": {
    "@azure/eslint-plugin-azure-sdk": "^3.0.0",
    "@azure/dev-tool": "^1.0.0",
    "@azure/logger-js": "^1.0.2",
    "@microsoft/api-extractor": "7.18.11",
    "@opentelemetry/api": "^1.0.1",
    "@types/chai": "^4.1.6",
    "@types/express": "^4.16.0",
    "@types/glob": "^7.1.1",
    "@types/mocha": "^7.0.2",
    "@types/node": "^12.0.0",
    "@types/sinon": "^9.0.4",
    "@types/tough-cookie": "^4.0.0",
    "@types/uuid": "^8.0.0",
    "@types/xml2js": "^0.4.11",
    "chai": "^4.2.0",
    "cross-env": "^7.0.2",
    "downlevel-dts": "^0.8.0",
    "eslint": "^7.15.0",
    "express": "^4.16.3",
    "fetch-mock": "^9.10.1",
    "glob": "^7.1.2",
    "karma": "^6.2.0",
    "karma-chai": "^0.1.0",
    "karma-chrome-launcher": "^3.0.0",
    "karma-edge-launcher": "^0.4.2",
    "karma-firefox-launcher": "^1.1.0",
    "karma-mocha": "^2.0.1",
    "karma-sourcemap-loader": "^0.3.8",
    "mocha": "^7.1.1",
    "mocha-junit-reporter": "^2.0.0",
    "npm-run-all": "^4.1.5",
    "nyc": "^15.0.0",
    "prettier": "^2.5.1",
    "puppeteer": "^13.5.1",
    "regenerator-runtime": "^0.13.3",
    "rimraf": "^3.0.0",
    "shx": "^0.3.2",
    "sinon": "^9.0.2",
    "ts-node": "^10.0.0",
    "typescript": "~4.6.0",
    "uglify-js": "^3.4.9",
    "xhr-mock": "^2.4.1"
  }
}// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/* eslint-disable-next-line @typescript-eslint/triple-slash-reference */
/// <reference path="../dom-shim.d.ts" />
export { WebResource, } from "./webResource";
export { DefaultHttpClient } from "./defaultHttpClient";
export { HttpHeaders } from "./httpHeaders";
export { HttpPipelineLogLevel } from "./httpPipelineLogLevel";
export { RestError } from "./restError";
export { operationOptionsToRequestOptionsBase, } from "./operationOptions";
export { ServiceClient, flattenResponse, createPipelineFromOptions, } from "./serviceClient";
export { QueryCollectionFormat } from "./queryCollectionFormat";
export { Constants } from "./util/constants";
export { bearerTokenAuthenticationPolicy } from "./policies/bearerTokenAuthenticationPolicy";
export { logPolicy } from "./policies/logPolicy";
export { BaseRequestPolicy, RequestPolicyOptions, } from "./policies/requestPolicy";
export { generateClientRequestIdPolicy } from "./policies/generateClientRequestIdPolicy";
export { exponentialRetryPolicy, RetryMode } from "./policies/exponentialRetryPolicy";
export { systemErrorRetryPolicy } from "./policies/systemErrorRetryPolicy";
export { throttlingRetryPolicy } from "./policies/throttlingRetryPolicy";
export { getDefaultProxySettings, proxyPolicy } from "./policies/proxyPolicy";
export { redirectPolicy } from "./policies/redirectPolicy";
export { keepAlivePolicy } from "./policies/keepAlivePolicy";
export { disableResponseDecompressionPolicy } from "./policies/disableResponseDecompressionPolicy";
export { signingPolicy } from "./policies/signingPolicy";
export { userAgentPolicy, getDefaultUserAgentValue, } from "./policies/userAgentPolicy";
export { deserializationPolicy, deserializeResponseBody, } from "./policies/deserializationPolicy";
export { tracingPolicy } from "./policies/tracingPolicy";
export { MapperType, Serializer, serializeObject, } from "./serializer";
export { stripRequest, stripResponse, executePromisesSequentially, generateUuid, encodeUri, promiseToCallback, promiseToServiceCallback, isValidUuid, applyMixins, isNode, isDuration, } from "./util/utils";
export { URLBuilder, URLQuery } from "./url";
export { delay } from "./util/delay";
// legacy exports. Use core-tracing instead (and remove on next major version update of core-http).
export { createSpanFunction } from "./createSpanLegacy";
// Credentials
export { isTokenCredential } from "@azure/core-auth";
export { ExpiringAccessTokenCache } from "./credentials/accessTokenCache";
export { AccessTokenRefresher } from "./credentials/accessTokenRefresher";
export { BasicAuthenticationCredentials } from "./credentials/basicAuthenticationCredentials";
export { ApiKeyCredentials } from "./credentials/apiKeyCredentials";
export { TopicCredentials } from "./credentials/topicCredentials";
export { parseXML, stringifyXML } from "./util/xml";
export { XML_ATTRKEY, XML_CHARKEY } from "./util/serializer.common";
//# sourceMappingURL=coreHttp.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
// NOTE: we've moved this code into core-tracing but these functions
// were a part of the GA'd library and can't be removed until the next major
// release. They currently get called always, even if tracing is not enabled.
import { createSpanFunction as coreTracingCreateSpanFunction } from "@azure/core-tracing";
/**
 * This function is only here for compatibility. Use createSpanFunction in core-tracing.
 *
 * @deprecated This function is only here for compatibility. Use createSpanFunction in core-tracing.
 * @hidden

 * @param spanConfig - The name of the operation being performed.
 * @param tracingOptions - The options for the underlying http request.
 */
export function createSpanFunction(args) {
    return coreTracingCreateSpanFunction(args);
}
//# sourceMappingURL=createSpanLegacy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export { XhrHttpClient as DefaultHttpClient } from "./xhrHttpClient";
//# sourceMappingURL=defaultHttpClient.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export { NodeFetchHttpClient as DefaultHttpClient } from "./nodeFetchHttpClient";
//# sourceMappingURL=defaultHttpClient.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=httpClient.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { DefaultHttpClient } from "./defaultHttpClient";
let cachedHttpClient;
export function getCachedDefaultHttpClient() {
    if (!cachedHttpClient) {
        cachedHttpClient = new DefaultHttpClient();
    }
    return cachedHttpClient;
}
//# sourceMappingURL=httpClientCache.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * A collection of HttpHeaders that can be sent with a HTTP request.
 */
function getHeaderKey(headerName) {
    return headerName.toLowerCase();
}
export function isHttpHeadersLike(object) {
    if (object && typeof object === "object") {
        const castObject = object;
        if (typeof castObject.rawHeaders === "function" &&
            typeof castObject.clone === "function" &&
            typeof castObject.get === "function" &&
            typeof castObject.set === "function" &&
            typeof castObject.contains === "function" &&
            typeof castObject.remove === "function" &&
            typeof castObject.headersArray === "function" &&
            typeof castObject.headerValues === "function" &&
            typeof castObject.headerNames === "function" &&
            typeof castObject.toJson === "function") {
            return true;
        }
    }
    return false;
}
/**
 * A collection of HTTP header key/value pairs.
 */
export class HttpHeaders {
    constructor(rawHeaders) {
        this._headersMap = {};
        if (rawHeaders) {
            for (const headerName in rawHeaders) {
                this.set(headerName, rawHeaders[headerName]);
            }
        }
    }
    /**
     * Set a header in this collection with the provided name and value. The name is
     * case-insensitive.
     * @param headerName - The name of the header to set. This value is case-insensitive.
     * @param headerValue - The value of the header to set.
     */
    set(headerName, headerValue) {
        this._headersMap[getHeaderKey(headerName)] = {
            name: headerName,
            value: headerValue.toString(),
        };
    }
    /**
     * Get the header value for the provided header name, or undefined if no header exists in this
     * collection with the provided name.
     * @param headerName - The name of the header.
     */
    get(headerName) {
        const header = this._headersMap[getHeaderKey(headerName)];
        return !header ? undefined : header.value;
    }
    /**
     * Get whether or not this header collection contains a header entry for the provided header name.
     */
    contains(headerName) {
        return !!this._headersMap[getHeaderKey(headerName)];
    }
    /**
     * Remove the header with the provided headerName. Return whether or not the header existed and
     * was removed.
     * @param headerName - The name of the header to remove.
     */
    remove(headerName) {
        const result = this.contains(headerName);
        delete this._headersMap[getHeaderKey(headerName)];
        return result;
    }
    /**
     * Get the headers that are contained this collection as an object.
     */
    rawHeaders() {
        return this.toJson({ preserveCase: true });
    }
    /**
     * Get the headers that are contained in this collection as an array.
     */
    headersArray() {
        const headers = [];
        for (const headerKey in this._headersMap) {
            headers.push(this._headersMap[headerKey]);
        }
        return headers;
    }
    /**
     * Get the header names that are contained in this collection.
     */
    headerNames() {
        const headerNames = [];
        const headers = this.headersArray();
        for (let i = 0; i < headers.length; ++i) {
            headerNames.push(headers[i].name);
        }
        return headerNames;
    }
    /**
     * Get the header values that are contained in this collection.
     */
    headerValues() {
        const headerValues = [];
        const headers = this.headersArray();
        for (let i = 0; i < headers.length; ++i) {
            headerValues.push(headers[i].value);
        }
        return headerValues;
    }
    /**
     * Get the JSON object representation of this HTTP header collection.
     */
    toJson(options = {}) {
        const result = {};
        if (options.preserveCase) {
            for (const headerKey in this._headersMap) {
                const header = this._headersMap[headerKey];
                result[header.name] = header.value;
            }
        }
        else {
            for (const headerKey in this._headersMap) {
                const header = this._headersMap[headerKey];
                result[getHeaderKey(header.name)] = header.value;
            }
        }
        return result;
    }
    /**
     * Get the string representation of this HTTP header collection.
     */
    toString() {
        return JSON.stringify(this.toJson({ preserveCase: true }));
    }
    /**
     * Create a deep clone/copy of this HttpHeaders collection.
     */
    clone() {
        const resultPreservingCasing = {};
        for (const headerKey in this._headersMap) {
            const header = this._headersMap[headerKey];
            resultPreservingCasing[header.name] = header.value;
        }
        return new HttpHeaders(resultPreservingCasing);
    }
}
//# sourceMappingURL=httpHeaders.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=httpOperationResponse.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * The different levels of logs that can be used with the HttpPipelineLogger.
 */
export var HttpPipelineLogLevel;
(function (HttpPipelineLogLevel) {
    /**
     * A log level that indicates that no logs will be logged.
     */
    HttpPipelineLogLevel[HttpPipelineLogLevel["OFF"] = 0] = "OFF";
    /**
     * An error log.
     */
    HttpPipelineLogLevel[HttpPipelineLogLevel["ERROR"] = 1] = "ERROR";
    /**
     * A warning log.
     */
    HttpPipelineLogLevel[HttpPipelineLogLevel["WARNING"] = 2] = "WARNING";
    /**
     * An information log.
     */
    HttpPipelineLogLevel[HttpPipelineLogLevel["INFO"] = 3] = "INFO";
})(HttpPipelineLogLevel || (HttpPipelineLogLevel = {}));
//# sourceMappingURL=httpPipelineLogLevel.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { HttpPipelineLogLevel } from "./httpPipelineLogLevel";
/**
 * A HttpPipelineLogger that will send its logs to the console.
 */
export class ConsoleHttpPipelineLogger {
    /**
     * Create a new ConsoleHttpPipelineLogger.
     * @param minimumLogLevel - The log level threshold for what logs will be logged.
     */
    constructor(minimumLogLevel) {
        this.minimumLogLevel = minimumLogLevel;
    }
    /**
     * Log the provided message.
     * @param logLevel - The HttpLogDetailLevel associated with this message.
     * @param message - The message to log.
     */
    log(logLevel, message) {
        const logMessage = `${HttpPipelineLogLevel[logLevel]}: ${message}`;
        switch (logLevel) {
            case HttpPipelineLogLevel.ERROR:
                console.error(logMessage);
                break;
            case HttpPipelineLogLevel.WARNING:
                console.warn(logMessage);
                break;
            case HttpPipelineLogLevel.INFO:
                console.log(logMessage);
                break;
        }
    }
}
//# sourceMappingURL=httpPipelineLogger.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createClientLogger } from "@azure/logger";
export const logger = createClientLogger("core-http");
//# sourceMappingURL=log.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import * as http from "http";
import * as https from "https";
import * as tough from "tough-cookie";
import { AbortController, AbortError } from "@azure/abort-controller";
import { HttpHeaders } from "./httpHeaders";
import { createProxyAgent, isUrlHttps } from "./proxyAgent";
import { Transform } from "stream";
import FormData from "form-data";
import { RestError } from "./restError";
import { logger } from "./log";
import node_fetch from "node-fetch";
function getCachedAgent(isHttps, agentCache) {
    return isHttps ? agentCache.httpsAgent : agentCache.httpAgent;
}
export class ReportTransform extends Transform {
    constructor(progressCallback) {
        super();
        this.progressCallback = progressCallback;
        this.loadedBytes = 0;
    }
    _transform(chunk, _encoding, callback) {
        this.push(chunk);
        this.loadedBytes += chunk.length;
        this.progressCallback({ loadedBytes: this.loadedBytes });
        callback(undefined);
    }
}
function isReadableStream(body) {
    return body && typeof body.pipe === "function";
}
function isStreamComplete(stream, aborter) {
    return new Promise((resolve) => {
        stream.once("close", () => {
            aborter === null || aborter === void 0 ? void 0 : aborter.abort();
            resolve();
        });
        stream.once("end", resolve);
        stream.once("error", resolve);
    });
}
/**
 * Transforms a set of headers into the key/value pair defined by {@link HttpHeadersLike}
 */
export function parseHeaders(headers) {
    const httpHeaders = new HttpHeaders();
    headers.forEach((value, key) => {
        httpHeaders.set(key, value);
    });
    return httpHeaders;
}
/**
 * An HTTP client that uses `node-fetch`.
 */
export class NodeFetchHttpClient {
    constructor() {
        // a mapping of proxy settings string `${host}:${port}:${username}:${password}` to agent
        this.proxyAgentMap = new Map();
        this.keepAliveAgents = {};
        this.cookieJar = new tough.CookieJar(undefined, { looseMode: true });
    }
    /**
     * Provides minimum viable error handling and the logic that executes the abstract methods.
     * @param httpRequest - Object representing the outgoing HTTP request.
     * @returns An object representing the incoming HTTP response.
     */
    async sendRequest(httpRequest) {
        var _a;
        if (!httpRequest && typeof httpRequest !== "object") {
            throw new Error("'httpRequest' (WebResourceLike) cannot be null or undefined and must be of type object.");
        }
        const abortController = new AbortController();
        let abortListener;
        if (httpRequest.abortSignal) {
            if (httpRequest.abortSignal.aborted) {
                throw new AbortError("The operation was aborted.");
            }
            abortListener = (event) => {
                if (event.type === "abort") {
                    abortController.abort();
                }
            };
            httpRequest.abortSignal.addEventListener("abort", abortListener);
        }
        if (httpRequest.timeout) {
            setTimeout(() => {
                abortController.abort();
            }, httpRequest.timeout);
        }
        if (httpRequest.formData) {
            const formData = httpRequest.formData;
            const requestForm = new FormData();
            const appendFormValue = (key, value) => {
                // value function probably returns a stream so we can provide a fresh stream on each retry
                if (typeof value === "function") {
                    value = value();
                }
                if (value &&
                    Object.prototype.hasOwnProperty.call(value, "value") &&
                    Object.prototype.hasOwnProperty.call(value, "options")) {
                    requestForm.append(key, value.value, value.options);
                }
                else {
                    requestForm.append(key, value);
                }
            };
            for (const formKey of Object.keys(formData)) {
                const formValue = formData[formKey];
                if (Array.isArray(formValue)) {
                    for (let j = 0; j < formValue.length; j++) {
                        appendFormValue(formKey, formValue[j]);
                    }
                }
                else {
                    appendFormValue(formKey, formValue);
                }
            }
            httpRequest.body = requestForm;
            httpRequest.formData = undefined;
            const contentType = httpRequest.headers.get("Content-Type");
            if (contentType && contentType.indexOf("multipart/form-data") !== -1) {
                if (typeof requestForm.getBoundary === "function") {
                    httpRequest.headers.set("Content-Type", `multipart/form-data; boundary=${requestForm.getBoundary()}`);
                }
                else {
                    // browser will automatically apply a suitable content-type header
                    httpRequest.headers.remove("Content-Type");
                }
            }
        }
        let body = httpRequest.body
            ? typeof httpRequest.body === "function"
                ? httpRequest.body()
                : httpRequest.body
            : undefined;
        if (httpRequest.onUploadProgress && httpRequest.body) {
            const onUploadProgress = httpRequest.onUploadProgress;
            const uploadReportStream = new ReportTransform(onUploadProgress);
            if (isReadableStream(body)) {
                body.pipe(uploadReportStream);
            }
            else {
                uploadReportStream.end(body);
            }
            body = uploadReportStream;
        }
        const platformSpecificRequestInit = await this.prepareRequest(httpRequest);
        const requestInit = Object.assign({ body: body, headers: httpRequest.headers.rawHeaders(), method: httpRequest.method, signal: abortController.signal, redirect: "manual" }, platformSpecificRequestInit);
        let operationResponse;
        try {
            const response = await this.fetch(httpRequest.url, requestInit);
            const headers = parseHeaders(response.headers);
            const streaming = ((_a = httpRequest.streamResponseStatusCodes) === null || _a === void 0 ? void 0 : _a.has(response.status)) ||
                httpRequest.streamResponseBody;
            operationResponse = {
                headers: headers,
                request: httpRequest,
                status: response.status,
                readableStreamBody: streaming
                    ? response.body
                    : undefined,
                bodyAsText: !streaming ? await response.text() : undefined,
            };
            const onDownloadProgress = httpRequest.onDownloadProgress;
            if (onDownloadProgress) {
                const responseBody = response.body || undefined;
                if (isReadableStream(responseBody)) {
                    const downloadReportStream = new ReportTransform(onDownloadProgress);
                    responseBody.pipe(downloadReportStream);
                    operationResponse.readableStreamBody = downloadReportStream;
                }
                else {
                    const length = parseInt(headers.get("Content-Length")) || undefined;
                    if (length) {
                        // Calling callback for non-stream response for consistency with browser
                        onDownloadProgress({ loadedBytes: length });
                    }
                }
            }
            await this.processRequest(operationResponse);
            return operationResponse;
        }
        catch (error) {
            const fetchError = error;
            if (fetchError.code === "ENOTFOUND") {
                throw new RestError(fetchError.message, RestError.REQUEST_SEND_ERROR, undefined, httpRequest);
            }
            else if (fetchError.type === "aborted") {
                throw new AbortError("The operation was aborted.");
            }
            throw fetchError;
        }
        finally {
            // clean up event listener
            if (httpRequest.abortSignal && abortListener) {
                let uploadStreamDone = Promise.resolve();
                if (isReadableStream(body)) {
                    uploadStreamDone = isStreamComplete(body);
                }
                let downloadStreamDone = Promise.resolve();
                if (isReadableStream(operationResponse === null || operationResponse === void 0 ? void 0 : operationResponse.readableStreamBody)) {
                    downloadStreamDone = isStreamComplete(operationResponse.readableStreamBody, abortController);
                }
                Promise.all([uploadStreamDone, downloadStreamDone])
                    .then(() => {
                    var _a;
                    (_a = httpRequest.abortSignal) === null || _a === void 0 ? void 0 : _a.removeEventListener("abort", abortListener);
                    return;
                })
                    .catch((e) => {
                    logger.warning("Error when cleaning up abortListener on httpRequest", e);
                });
            }
        }
    }
    getOrCreateAgent(httpRequest) {
        var _a;
        const isHttps = isUrlHttps(httpRequest.url);
        // At the moment, proxy settings and keepAlive are mutually
        // exclusive because the 'tunnel' library currently lacks the
        // ability to create a proxy with keepAlive turned on.
        if (httpRequest.proxySettings) {
            const { host, port, username, password } = httpRequest.proxySettings;
            const key = `${host}:${port}:${username}:${password}`;
            const proxyAgents = (_a = this.proxyAgentMap.get(key)) !== null && _a !== void 0 ? _a : {};
            let agent = getCachedAgent(isHttps, proxyAgents);
            if (agent) {
                return agent;
            }
            const tunnel = createProxyAgent(httpRequest.url, httpRequest.proxySettings, httpRequest.headers);
            agent = tunnel.agent;
            if (tunnel.isHttps) {
                proxyAgents.httpsAgent = tunnel.agent;
            }
            else {
                proxyAgents.httpAgent = tunnel.agent;
            }
            this.proxyAgentMap.set(key, proxyAgents);
            return agent;
        }
        else if (httpRequest.keepAlive) {
            let agent = getCachedAgent(isHttps, this.keepAliveAgents);
            if (agent) {
                return agent;
            }
            const agentOptions = {
                keepAlive: httpRequest.keepAlive,
            };
            if (isHttps) {
                agent = this.keepAliveAgents.httpsAgent = new https.Agent(agentOptions);
            }
            else {
                agent = this.keepAliveAgents.httpAgent = new http.Agent(agentOptions);
            }
            return agent;
        }
        else {
            return isHttps ? https.globalAgent : http.globalAgent;
        }
    }
    /**
     * Uses `node-fetch` to perform the request.
     */
    // eslint-disable-next-line @azure/azure-sdk/ts-apisurface-standardized-verbs
    async fetch(input, init) {
        return node_fetch(input, init);
    }
    /**
     * Prepares a request based on the provided web resource.
     */
    async prepareRequest(httpRequest) {
        const requestInit = {};
        if (this.cookieJar && !httpRequest.headers.get("Cookie")) {
            const cookieString = await new Promise((resolve, reject) => {
                this.cookieJar.getCookieString(httpRequest.url, (err, cookie) => {
                    if (err) {
                        reject(err);
                    }
                    else {
                        resolve(cookie);
                    }
                });
            });
            httpRequest.headers.set("Cookie", cookieString);
        }
        // Set the http(s) agent
        requestInit.agent = this.getOrCreateAgent(httpRequest);
        requestInit.compress = httpRequest.decompressResponse;
        return requestInit;
    }
    /**
     * Process an HTTP response. Handles persisting a cookie for subsequent requests if the response has a "Set-Cookie" header.
     */
    async processRequest(operationResponse) {
        if (this.cookieJar) {
            const setCookieHeader = operationResponse.headers.get("Set-Cookie");
            if (setCookieHeader !== undefined) {
                await new Promise((resolve, reject) => {
                    this.cookieJar.setCookie(setCookieHeader, operationResponse.request.url, { ignoreError: true }, (err) => {
                        if (err) {
                            reject(err);
                        }
                        else {
                            resolve();
                        }
                    });
                });
            }
        }
    }
}
//# sourceMappingURL=nodeFetchHttpClient.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=operationArguments.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { __rest } from "tslib";
/**
 * Converts an OperationOptions to a RequestOptionsBase
 *
 * @param opts - OperationOptions object to convert to RequestOptionsBase
 */
export function operationOptionsToRequestOptionsBase(opts) {
    const { requestOptions, tracingOptions } = opts, additionalOptions = __rest(opts, ["requestOptions", "tracingOptions"]);
    let result = additionalOptions;
    if (requestOptions) {
        result = Object.assign(Object.assign({}, result), requestOptions);
    }
    if (tracingOptions) {
        result.tracingContext = tracingOptions.tracingContext;
        // By passing spanOptions if they exist at runtime, we're backwards compatible with @azure/core-tracing@preview.13 and earlier.
        result.spanOptions = tracingOptions === null || tracingOptions === void 0 ? void 0 : tracingOptions.spanOptions;
    }
    return result;
}
//# sourceMappingURL=operationOptions.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Get the path to this parameter's value as a dotted string (a.b.c).
 * @param parameter - The parameter to get the path string for.
 * @returns The path to this parameter's value as a dotted string.
 */
export function getPathStringFromParameter(parameter) {
    return getPathStringFromParameterPath(parameter.parameterPath, parameter.mapper);
}
export function getPathStringFromParameterPath(parameterPath, mapper) {
    let result;
    if (typeof parameterPath === "string") {
        result = parameterPath;
    }
    else if (Array.isArray(parameterPath)) {
        result = parameterPath.join(".");
    }
    else {
        result = mapper.serializedName;
    }
    return result;
}
//# sourceMappingURL=operationParameter.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=operationResponse.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { MapperType } from "./serializer";
/**
 * Gets the list of status codes for streaming responses.
 * @internal
 */
export function getStreamResponseStatusCodes(operationSpec) {
    const result = new Set();
    for (const statusCode in operationSpec.responses) {
        const operationResponse = operationSpec.responses[statusCode];
        if (operationResponse.bodyMapper &&
            operationResponse.bodyMapper.type.name === MapperType.Stream) {
            result.add(Number(statusCode));
        }
    }
    return result;
}
//# sourceMappingURL=operationSpec.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=pipelineOptions.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import * as tunnel from "tunnel";
import { URLBuilder } from "./url";
export function createProxyAgent(requestUrl, proxySettings, headers) {
    const host = URLBuilder.parse(proxySettings.host).getHost();
    if (!host) {
        throw new Error("Expecting a non-empty host in proxy settings.");
    }
    if (!isValidPort(proxySettings.port)) {
        throw new Error("Expecting a valid port number in the range of [0, 65535] in proxy settings.");
    }
    const tunnelOptions = {
        proxy: {
            host: host,
            port: proxySettings.port,
            headers: (headers && headers.rawHeaders()) || {},
        },
    };
    if (proxySettings.username && proxySettings.password) {
        tunnelOptions.proxy.proxyAuth = `${proxySettings.username}:${proxySettings.password}`;
    }
    else if (proxySettings.username) {
        tunnelOptions.proxy.proxyAuth = `${proxySettings.username}`;
    }
    const isRequestHttps = isUrlHttps(requestUrl);
    const isProxyHttps = isUrlHttps(proxySettings.host);
    const proxyAgent = {
        isHttps: isRequestHttps,
        agent: createTunnel(isRequestHttps, isProxyHttps, tunnelOptions),
    };
    return proxyAgent;
}
export function isUrlHttps(url) {
    const urlScheme = URLBuilder.parse(url).getScheme() || "";
    return urlScheme.toLowerCase() === "https";
}
export function createTunnel(isRequestHttps, isProxyHttps, tunnelOptions) {
    if (isRequestHttps && isProxyHttps) {
        return tunnel.httpsOverHttps(tunnelOptions);
    }
    else if (isRequestHttps && !isProxyHttps) {
        return tunnel.httpsOverHttp(tunnelOptions);
    }
    else if (!isRequestHttps && isProxyHttps) {
        return tunnel.httpOverHttps(tunnelOptions);
    }
    else {
        return tunnel.httpOverHttp(tunnelOptions);
    }
}
function isValidPort(port) {
    // any port in 0-65535 range is valid (RFC 793) even though almost all implementations
    // will reserve 0 for a specific purpose, and a range of numbers for ephemeral ports
    return 0 <= port && port <= 65535;
}
//# sourceMappingURL=proxyAgent.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * The format that will be used to join an array of values together for a query parameter value.
 */
export var QueryCollectionFormat;
(function (QueryCollectionFormat) {
    /**
     * CSV: Each pair of segments joined by a single comma.
     */
    QueryCollectionFormat["Csv"] = ",";
    /**
     * SSV: Each pair of segments joined by a single space character.
     */
    QueryCollectionFormat["Ssv"] = " ";
    /**
     * TSV: Each pair of segments joined by a single tab character.
     */
    QueryCollectionFormat["Tsv"] = "\t";
    /**
     * Pipes: Each pair of segments joined by a single pipe character.
     */
    QueryCollectionFormat["Pipes"] = "|";
    /**
     * Denotes this is an array of values that should be passed to the server in multiple key/value pairs, e.g. `?queryParam=value1&queryParam=value2`
     */
    QueryCollectionFormat["Multi"] = "Multi";
})(QueryCollectionFormat || (QueryCollectionFormat = {}));
//# sourceMappingURL=queryCollectionFormat.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { Sanitizer } from "./util/sanitizer";
import { custom } from "./util/inspect";
const errorSanitizer = new Sanitizer();
/**
 * An error resulting from an HTTP request to a service endpoint.
 */
export class RestError extends Error {
    constructor(message, code, statusCode, request, response) {
        super(message);
        this.name = "RestError";
        this.code = code;
        this.statusCode = statusCode;
        this.request = request;
        this.response = response;
        Object.setPrototypeOf(this, RestError.prototype);
    }
    /**
     * Logging method for util.inspect in Node
     */
    [custom]() {
        return `RestError: ${this.message} \n ${errorSanitizer.sanitize(this)}`;
    }
}
/**
 * A constant string to identify errors that may arise when making an HTTP request that indicates an issue with the transport layer (e.g. the hostname of the URL cannot be resolved via DNS.)
 */
RestError.REQUEST_SEND_ERROR = "REQUEST_SEND_ERROR";
/**
 * A constant string to identify errors that may arise from parsing an incoming HTTP response. Usually indicates a malformed HTTP body, such as an encoded JSON payload that is incomplete.
 */
RestError.PARSE_ERROR = "PARSE_ERROR";
//# sourceMappingURL=restError.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/* eslint-disable eqeqeq */
import * as base64 from "./util/base64";
import * as utils from "./util/utils";
import { XML_ATTRKEY, XML_CHARKEY } from "./util/serializer.common";
// This file contains utility code to serialize and deserialize network operations according to `OperationSpec` objects generated by AutoRest.TypeScript from OpenAPI specifications.
/**
 * Used to map raw response objects to final shapes.
 * Helps packing and unpacking Dates and other encoded types that are not intrinsic to JSON.
 * Also allows pulling values from headers, as well as inserting default values and constants.
 */
export class Serializer {
    constructor(
    /**
     * The provided model mapper.
     */
    modelMappers = {}, 
    /**
     * Whether the contents are XML or not.
     */
    isXML) {
        this.modelMappers = modelMappers;
        this.isXML = isXML;
    }
    /**
     * Validates constraints, if any. This function will throw if the provided value does not respect those constraints.
     * @param mapper - The definition of data models.
     * @param value - The value.
     * @param objectName - Name of the object. Used in the error messages.
     */
    validateConstraints(mapper, value, objectName) {
        const failValidation = (constraintName, constraintValue) => {
            throw new Error(`"${objectName}" with value "${value}" should satisfy the constraint "${constraintName}": ${constraintValue}.`);
        };
        if (mapper.constraints && value != undefined) {
            const valueAsNumber = value;
            const { ExclusiveMaximum, ExclusiveMinimum, InclusiveMaximum, InclusiveMinimum, MaxItems, MaxLength, MinItems, MinLength, MultipleOf, Pattern, UniqueItems, } = mapper.constraints;
            if (ExclusiveMaximum != undefined && valueAsNumber >= ExclusiveMaximum) {
                failValidation("ExclusiveMaximum", ExclusiveMaximum);
            }
            if (ExclusiveMinimum != undefined && valueAsNumber <= ExclusiveMinimum) {
                failValidation("ExclusiveMinimum", ExclusiveMinimum);
            }
            if (InclusiveMaximum != undefined && valueAsNumber > InclusiveMaximum) {
                failValidation("InclusiveMaximum", InclusiveMaximum);
            }
            if (InclusiveMinimum != undefined && valueAsNumber < InclusiveMinimum) {
                failValidation("InclusiveMinimum", InclusiveMinimum);
            }
            const valueAsArray = value;
            if (MaxItems != undefined && valueAsArray.length > MaxItems) {
                failValidation("MaxItems", MaxItems);
            }
            if (MaxLength != undefined && valueAsArray.length > MaxLength) {
                failValidation("MaxLength", MaxLength);
            }
            if (MinItems != undefined && valueAsArray.length < MinItems) {
                failValidation("MinItems", MinItems);
            }
            if (MinLength != undefined && valueAsArray.length < MinLength) {
                failValidation("MinLength", MinLength);
            }
            if (MultipleOf != undefined && valueAsNumber % MultipleOf !== 0) {
                failValidation("MultipleOf", MultipleOf);
            }
            if (Pattern) {
                const pattern = typeof Pattern === "string" ? new RegExp(Pattern) : Pattern;
                if (typeof value !== "string" || value.match(pattern) === null) {
                    failValidation("Pattern", Pattern);
                }
            }
            if (UniqueItems &&
                valueAsArray.some((item, i, ar) => ar.indexOf(item) !== i)) {
                failValidation("UniqueItems", UniqueItems);
            }
        }
    }
    /**
     * Serialize the given object based on its metadata defined in the mapper.
     *
     * @param mapper - The mapper which defines the metadata of the serializable object.
     * @param object - A valid Javascript object to be serialized.
     * @param objectName - Name of the serialized object.
     * @param options - additional options to deserialization.
     * @returns A valid serialized Javascript object.
     */
    serialize(mapper, object, objectName, options = {}) {
        var _a, _b, _c;
        const updatedOptions = {
            rootName: (_a = options.rootName) !== null && _a !== void 0 ? _a : "",
            includeRoot: (_b = options.includeRoot) !== null && _b !== void 0 ? _b : false,
            xmlCharKey: (_c = options.xmlCharKey) !== null && _c !== void 0 ? _c : XML_CHARKEY,
        };
        let payload = {};
        const mapperType = mapper.type.name;
        if (!objectName) {
            objectName = mapper.serializedName;
        }
        if (mapperType.match(/^Sequence$/i) !== null) {
            payload = [];
        }
        if (mapper.isConstant) {
            object = mapper.defaultValue;
        }
        // This table of allowed values should help explain
        // the mapper.required and mapper.nullable properties.
        // X means "neither undefined or null are allowed".
        //           || required
        //           || true      | false
        //  nullable || ==========================
        //      true || null      | undefined/null
        //     false || X         | undefined
        // undefined || X         | undefined/null
        const { required, nullable } = mapper;
        if (required && nullable && object === undefined) {
            throw new Error(`${objectName} cannot be undefined.`);
        }
        if (required && !nullable && object == undefined) {
            throw new Error(`${objectName} cannot be null or undefined.`);
        }
        if (!required && nullable === false && object === null) {
            throw new Error(`${objectName} cannot be null.`);
        }
        if (object == undefined) {
            payload = object;
        }
        else {
            // Validate Constraints if any
            this.validateConstraints(mapper, object, objectName);
            if (mapperType.match(/^any$/i) !== null) {
                payload = object;
            }
            else if (mapperType.match(/^(Number|String|Boolean|Object|Stream|Uuid)$/i) !== null) {
                payload = serializeBasicTypes(mapperType, objectName, object);
            }
            else if (mapperType.match(/^Enum$/i) !== null) {
                const enumMapper = mapper;
                payload = serializeEnumType(objectName, enumMapper.type.allowedValues, object);
            }
            else if (mapperType.match(/^(Date|DateTime|TimeSpan|DateTimeRfc1123|UnixTime)$/i) !== null) {
                payload = serializeDateTypes(mapperType, object, objectName);
            }
            else if (mapperType.match(/^ByteArray$/i) !== null) {
                payload = serializeByteArrayType(objectName, object);
            }
            else if (mapperType.match(/^Base64Url$/i) !== null) {
                payload = serializeBase64UrlType(objectName, object);
            }
            else if (mapperType.match(/^Sequence$/i) !== null) {
                payload = serializeSequenceType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions);
            }
            else if (mapperType.match(/^Dictionary$/i) !== null) {
                payload = serializeDictionaryType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions);
            }
            else if (mapperType.match(/^Composite$/i) !== null) {
                payload = serializeCompositeType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions);
            }
        }
        return payload;
    }
    /**
     * Deserialize the given object based on its metadata defined in the mapper.
     *
     * @param mapper - The mapper which defines the metadata of the serializable object.
     * @param responseBody - A valid Javascript entity to be deserialized.
     * @param objectName - Name of the deserialized object.
     * @param options - Controls behavior of XML parser and builder.
     * @returns A valid deserialized Javascript object.
     */
    deserialize(mapper, responseBody, objectName, options = {}) {
        var _a, _b, _c;
        const updatedOptions = {
            rootName: (_a = options.rootName) !== null && _a !== void 0 ? _a : "",
            includeRoot: (_b = options.includeRoot) !== null && _b !== void 0 ? _b : false,
            xmlCharKey: (_c = options.xmlCharKey) !== null && _c !== void 0 ? _c : XML_CHARKEY,
        };
        if (responseBody == undefined) {
            if (this.isXML && mapper.type.name === "Sequence" && !mapper.xmlIsWrapped) {
                // Edge case for empty XML non-wrapped lists. xml2js can't distinguish
                // between the list being empty versus being missing,
                // so let's do the more user-friendly thing and return an empty list.
                responseBody = [];
            }
            // specifically check for undefined as default value can be a falsey value `0, "", false, null`
            if (mapper.defaultValue !== undefined) {
                responseBody = mapper.defaultValue;
            }
            return responseBody;
        }
        let payload;
        const mapperType = mapper.type.name;
        if (!objectName) {
            objectName = mapper.serializedName;
        }
        if (mapperType.match(/^Composite$/i) !== null) {
            payload = deserializeCompositeType(this, mapper, responseBody, objectName, updatedOptions);
        }
        else {
            if (this.isXML) {
                const xmlCharKey = updatedOptions.xmlCharKey;
                const castResponseBody = responseBody;
                /**
                 * If the mapper specifies this as a non-composite type value but the responseBody contains
                 * both header ("$" i.e., XML_ATTRKEY) and body ("#" i.e., XML_CHARKEY) properties,
                 * then just reduce the responseBody value to the body ("#" i.e., XML_CHARKEY) property.
                 */
                if (castResponseBody[XML_ATTRKEY] != undefined &&
                    castResponseBody[xmlCharKey] != undefined) {
                    responseBody = castResponseBody[xmlCharKey];
                }
            }
            if (mapperType.match(/^Number$/i) !== null) {
                payload = parseFloat(responseBody);
                if (isNaN(payload)) {
                    payload = responseBody;
                }
            }
            else if (mapperType.match(/^Boolean$/i) !== null) {
                if (responseBody === "true") {
                    payload = true;
                }
                else if (responseBody === "false") {
                    payload = false;
                }
                else {
                    payload = responseBody;
                }
            }
            else if (mapperType.match(/^(String|Enum|Object|Stream|Uuid|TimeSpan|any)$/i) !== null) {
                payload = responseBody;
            }
            else if (mapperType.match(/^(Date|DateTime|DateTimeRfc1123)$/i) !== null) {
                payload = new Date(responseBody);
            }
            else if (mapperType.match(/^UnixTime$/i) !== null) {
                payload = unixTimeToDate(responseBody);
            }
            else if (mapperType.match(/^ByteArray$/i) !== null) {
                payload = base64.decodeString(responseBody);
            }
            else if (mapperType.match(/^Base64Url$/i) !== null) {
                payload = base64UrlToByteArray(responseBody);
            }
            else if (mapperType.match(/^Sequence$/i) !== null) {
                payload = deserializeSequenceType(this, mapper, responseBody, objectName, updatedOptions);
            }
            else if (mapperType.match(/^Dictionary$/i) !== null) {
                payload = deserializeDictionaryType(this, mapper, responseBody, objectName, updatedOptions);
            }
        }
        if (mapper.isConstant) {
            payload = mapper.defaultValue;
        }
        return payload;
    }
}
function trimEnd(str, ch) {
    let len = str.length;
    while (len - 1 >= 0 && str[len - 1] === ch) {
        --len;
    }
    return str.substr(0, len);
}
function bufferToBase64Url(buffer) {
    if (!buffer) {
        return undefined;
    }
    if (!(buffer instanceof Uint8Array)) {
        throw new Error(`Please provide an input of type Uint8Array for converting to Base64Url.`);
    }
    // Uint8Array to Base64.
    const str = base64.encodeByteArray(buffer);
    // Base64 to Base64Url.
    return trimEnd(str, "=").replace(/\+/g, "-").replace(/\//g, "_");
}
function base64UrlToByteArray(str) {
    if (!str) {
        return undefined;
    }
    if (str && typeof str.valueOf() !== "string") {
        throw new Error("Please provide an input of type string for converting to Uint8Array");
    }
    // Base64Url to Base64.
    str = str.replace(/-/g, "+").replace(/_/g, "/");
    // Base64 to Uint8Array.
    return base64.decodeString(str);
}
function splitSerializeName(prop) {
    const classes = [];
    let partialclass = "";
    if (prop) {
        const subwords = prop.split(".");
        for (const item of subwords) {
            if (item.charAt(item.length - 1) === "\\") {
                partialclass += item.substr(0, item.length - 1) + ".";
            }
            else {
                partialclass += item;
                classes.push(partialclass);
                partialclass = "";
            }
        }
    }
    return classes;
}
function dateToUnixTime(d) {
    if (!d) {
        return undefined;
    }
    if (typeof d.valueOf() === "string") {
        d = new Date(d);
    }
    return Math.floor(d.getTime() / 1000);
}
function unixTimeToDate(n) {
    if (!n) {
        return undefined;
    }
    return new Date(n * 1000);
}
function serializeBasicTypes(typeName, objectName, value) {
    if (value !== null && value !== undefined) {
        if (typeName.match(/^Number$/i) !== null) {
            if (typeof value !== "number") {
                throw new Error(`${objectName} with value ${value} must be of type number.`);
            }
        }
        else if (typeName.match(/^String$/i) !== null) {
            if (typeof value.valueOf() !== "string") {
                throw new Error(`${objectName} with value "${value}" must be of type string.`);
            }
        }
        else if (typeName.match(/^Uuid$/i) !== null) {
            if (!(typeof value.valueOf() === "string" && utils.isValidUuid(value))) {
                throw new Error(`${objectName} with value "${value}" must be of type string and a valid uuid.`);
            }
        }
        else if (typeName.match(/^Boolean$/i) !== null) {
            if (typeof value !== "boolean") {
                throw new Error(`${objectName} with value ${value} must be of type boolean.`);
            }
        }
        else if (typeName.match(/^Stream$/i) !== null) {
            const objectType = typeof value;
            if (objectType !== "string" &&
                objectType !== "function" &&
                !(value instanceof ArrayBuffer) &&
                !ArrayBuffer.isView(value) &&
                !((typeof Blob === "function" || typeof Blob === "object") && value instanceof Blob)) {
                throw new Error(`${objectName} must be a string, Blob, ArrayBuffer, ArrayBufferView, or a function returning NodeJS.ReadableStream.`);
            }
        }
    }
    return value;
}
function serializeEnumType(objectName, allowedValues, value) {
    if (!allowedValues) {
        throw new Error(`Please provide a set of allowedValues to validate ${objectName} as an Enum Type.`);
    }
    const isPresent = allowedValues.some((item) => {
        if (typeof item.valueOf() === "string") {
            return item.toLowerCase() === value.toLowerCase();
        }
        return item === value;
    });
    if (!isPresent) {
        throw new Error(`${value} is not a valid value for ${objectName}. The valid values are: ${JSON.stringify(allowedValues)}.`);
    }
    return value;
}
function serializeByteArrayType(objectName, value) {
    let returnValue = "";
    if (value != undefined) {
        if (!(value instanceof Uint8Array)) {
            throw new Error(`${objectName} must be of type Uint8Array.`);
        }
        returnValue = base64.encodeByteArray(value);
    }
    return returnValue;
}
function serializeBase64UrlType(objectName, value) {
    let returnValue = "";
    if (value != undefined) {
        if (!(value instanceof Uint8Array)) {
            throw new Error(`${objectName} must be of type Uint8Array.`);
        }
        returnValue = bufferToBase64Url(value) || "";
    }
    return returnValue;
}
function serializeDateTypes(typeName, value, objectName) {
    if (value != undefined) {
        if (typeName.match(/^Date$/i) !== null) {
            if (!(value instanceof Date ||
                (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
                throw new Error(`${objectName} must be an instanceof Date or a string in ISO8601 format.`);
            }
            value =
                value instanceof Date
                    ? value.toISOString().substring(0, 10)
                    : new Date(value).toISOString().substring(0, 10);
        }
        else if (typeName.match(/^DateTime$/i) !== null) {
            if (!(value instanceof Date ||
                (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
                throw new Error(`${objectName} must be an instanceof Date or a string in ISO8601 format.`);
            }
            value = value instanceof Date ? value.toISOString() : new Date(value).toISOString();
        }
        else if (typeName.match(/^DateTimeRfc1123$/i) !== null) {
            if (!(value instanceof Date ||
                (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
                throw new Error(`${objectName} must be an instanceof Date or a string in RFC-1123 format.`);
            }
            value = value instanceof Date ? value.toUTCString() : new Date(value).toUTCString();
        }
        else if (typeName.match(/^UnixTime$/i) !== null) {
            if (!(value instanceof Date ||
                (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
                throw new Error(`${objectName} must be an instanceof Date or a string in RFC-1123/ISO8601 format ` +
                    `for it to be serialized in UnixTime/Epoch format.`);
            }
            value = dateToUnixTime(value);
        }
        else if (typeName.match(/^TimeSpan$/i) !== null) {
            if (!utils.isDuration(value)) {
                throw new Error(`${objectName} must be a string in ISO 8601 format. Instead was "${value}".`);
            }
        }
    }
    return value;
}
function serializeSequenceType(serializer, mapper, object, objectName, isXml, options) {
    if (!Array.isArray(object)) {
        throw new Error(`${objectName} must be of type Array.`);
    }
    const elementType = mapper.type.element;
    if (!elementType || typeof elementType !== "object") {
        throw new Error(`element" metadata for an Array must be defined in the ` +
            `mapper and it must of type "object" in ${objectName}.`);
    }
    const tempArray = [];
    for (let i = 0; i < object.length; i++) {
        const serializedValue = serializer.serialize(elementType, object[i], objectName, options);
        if (isXml && elementType.xmlNamespace) {
            const xmlnsKey = elementType.xmlNamespacePrefix
                ? `xmlns:${elementType.xmlNamespacePrefix}`
                : "xmlns";
            if (elementType.type.name === "Composite") {
                tempArray[i] = Object.assign({}, serializedValue);
                tempArray[i][XML_ATTRKEY] = { [xmlnsKey]: elementType.xmlNamespace };
            }
            else {
                tempArray[i] = {};
                tempArray[i][options.xmlCharKey] = serializedValue;
                tempArray[i][XML_ATTRKEY] = { [xmlnsKey]: elementType.xmlNamespace };
            }
        }
        else {
            tempArray[i] = serializedValue;
        }
    }
    return tempArray;
}
function serializeDictionaryType(serializer, mapper, object, objectName, isXml, options) {
    if (typeof object !== "object") {
        throw new Error(`${objectName} must be of type object.`);
    }
    const valueType = mapper.type.value;
    if (!valueType || typeof valueType !== "object") {
        throw new Error(`"value" metadata for a Dictionary must be defined in the ` +
            `mapper and it must of type "object" in ${objectName}.`);
    }
    const tempDictionary = {};
    for (const key of Object.keys(object)) {
        const serializedValue = serializer.serialize(valueType, object[key], objectName, options);
        // If the element needs an XML namespace we need to add it within the $ property
        tempDictionary[key] = getXmlObjectValue(valueType, serializedValue, isXml, options);
    }
    // Add the namespace to the root element if needed
    if (isXml && mapper.xmlNamespace) {
        const xmlnsKey = mapper.xmlNamespacePrefix ? `xmlns:${mapper.xmlNamespacePrefix}` : "xmlns";
        const result = tempDictionary;
        result[XML_ATTRKEY] = { [xmlnsKey]: mapper.xmlNamespace };
        return result;
    }
    return tempDictionary;
}
/**
 * Resolves the additionalProperties property from a referenced mapper.
 * @param serializer - The serializer containing the entire set of mappers.
 * @param mapper - The composite mapper to resolve.
 * @param objectName - Name of the object being serialized.
 */
function resolveAdditionalProperties(serializer, mapper, objectName) {
    const additionalProperties = mapper.type.additionalProperties;
    if (!additionalProperties && mapper.type.className) {
        const modelMapper = resolveReferencedMapper(serializer, mapper, objectName);
        return modelMapper === null || modelMapper === void 0 ? void 0 : modelMapper.type.additionalProperties;
    }
    return additionalProperties;
}
/**
 * Finds the mapper referenced by `className`.
 * @param serializer - The serializer containing the entire set of mappers
 * @param mapper - The composite mapper to resolve
 * @param objectName - Name of the object being serialized
 */
function resolveReferencedMapper(serializer, mapper, objectName) {
    const className = mapper.type.className;
    if (!className) {
        throw new Error(`Class name for model "${objectName}" is not provided in the mapper "${JSON.stringify(mapper, undefined, 2)}".`);
    }
    return serializer.modelMappers[className];
}
/**
 * Resolves a composite mapper's modelProperties.
 * @param serializer - The serializer containing the entire set of mappers
 * @param mapper - The composite mapper to resolve
 */
function resolveModelProperties(serializer, mapper, objectName) {
    let modelProps = mapper.type.modelProperties;
    if (!modelProps) {
        const modelMapper = resolveReferencedMapper(serializer, mapper, objectName);
        if (!modelMapper) {
            throw new Error(`mapper() cannot be null or undefined for model "${mapper.type.className}".`);
        }
        modelProps = modelMapper === null || modelMapper === void 0 ? void 0 : modelMapper.type.modelProperties;
        if (!modelProps) {
            throw new Error(`modelProperties cannot be null or undefined in the ` +
                `mapper "${JSON.stringify(modelMapper)}" of type "${mapper.type.className}" for object "${objectName}".`);
        }
    }
    return modelProps;
}
function serializeCompositeType(serializer, mapper, object, objectName, isXml, options) {
    if (getPolymorphicDiscriminatorRecursively(serializer, mapper)) {
        mapper = getPolymorphicMapper(serializer, mapper, object, "clientName");
    }
    if (object != undefined) {
        const payload = {};
        const modelProps = resolveModelProperties(serializer, mapper, objectName);
        for (const key of Object.keys(modelProps)) {
            const propertyMapper = modelProps[key];
            if (propertyMapper.readOnly) {
                continue;
            }
            let propName;
            let parentObject = payload;
            if (serializer.isXML) {
                if (propertyMapper.xmlIsWrapped) {
                    propName = propertyMapper.xmlName;
                }
                else {
                    propName = propertyMapper.xmlElementName || propertyMapper.xmlName;
                }
            }
            else {
                const paths = splitSerializeName(propertyMapper.serializedName);
                propName = paths.pop();
                for (const pathName of paths) {
                    const childObject = parentObject[pathName];
                    if (childObject == undefined &&
                        (object[key] != undefined || propertyMapper.defaultValue !== undefined)) {
                        parentObject[pathName] = {};
                    }
                    parentObject = parentObject[pathName];
                }
            }
            if (parentObject != undefined) {
                if (isXml && mapper.xmlNamespace) {
                    const xmlnsKey = mapper.xmlNamespacePrefix
                        ? `xmlns:${mapper.xmlNamespacePrefix}`
                        : "xmlns";
                    parentObject[XML_ATTRKEY] = Object.assign(Object.assign({}, parentObject[XML_ATTRKEY]), { [xmlnsKey]: mapper.xmlNamespace });
                }
                const propertyObjectName = propertyMapper.serializedName !== ""
                    ? objectName + "." + propertyMapper.serializedName
                    : objectName;
                let toSerialize = object[key];
                const polymorphicDiscriminator = getPolymorphicDiscriminatorRecursively(serializer, mapper);
                if (polymorphicDiscriminator &&
                    polymorphicDiscriminator.clientName === key &&
                    toSerialize == undefined) {
                    toSerialize = mapper.serializedName;
                }
                const serializedValue = serializer.serialize(propertyMapper, toSerialize, propertyObjectName, options);
                if (serializedValue !== undefined && propName != undefined) {
                    const value = getXmlObjectValue(propertyMapper, serializedValue, isXml, options);
                    if (isXml && propertyMapper.xmlIsAttribute) {
                        // XML_ATTRKEY, i.e., $ is the key attributes are kept under in xml2js.
                        // This keeps things simple while preventing name collision
                        // with names in user documents.
                        parentObject[XML_ATTRKEY] = parentObject[XML_ATTRKEY] || {};
                        parentObject[XML_ATTRKEY][propName] = serializedValue;
                    }
                    else if (isXml && propertyMapper.xmlIsWrapped) {
                        parentObject[propName] = { [propertyMapper.xmlElementName]: value };
                    }
                    else {
                        parentObject[propName] = value;
                    }
                }
            }
        }
        const additionalPropertiesMapper = resolveAdditionalProperties(serializer, mapper, objectName);
        if (additionalPropertiesMapper) {
            const propNames = Object.keys(modelProps);
            for (const clientPropName in object) {
                const isAdditionalProperty = propNames.every((pn) => pn !== clientPropName);
                if (isAdditionalProperty) {
                    payload[clientPropName] = serializer.serialize(additionalPropertiesMapper, object[clientPropName], objectName + '["' + clientPropName + '"]', options);
                }
            }
        }
        return payload;
    }
    return object;
}
function getXmlObjectValue(propertyMapper, serializedValue, isXml, options) {
    if (!isXml || !propertyMapper.xmlNamespace) {
        return serializedValue;
    }
    const xmlnsKey = propertyMapper.xmlNamespacePrefix
        ? `xmlns:${propertyMapper.xmlNamespacePrefix}`
        : "xmlns";
    const xmlNamespace = { [xmlnsKey]: propertyMapper.xmlNamespace };
    if (["Composite"].includes(propertyMapper.type.name)) {
        if (serializedValue[XML_ATTRKEY]) {
            return serializedValue;
        }
        else {
            const result = Object.assign({}, serializedValue);
            result[XML_ATTRKEY] = xmlNamespace;
            return result;
        }
    }
    const result = {};
    result[options.xmlCharKey] = serializedValue;
    result[XML_ATTRKEY] = xmlNamespace;
    return result;
}
function isSpecialXmlProperty(propertyName, options) {
    return [XML_ATTRKEY, options.xmlCharKey].includes(propertyName);
}
function deserializeCompositeType(serializer, mapper, responseBody, objectName, options) {
    var _a;
    if (getPolymorphicDiscriminatorRecursively(serializer, mapper)) {
        mapper = getPolymorphicMapper(serializer, mapper, responseBody, "serializedName");
    }
    const modelProps = resolveModelProperties(serializer, mapper, objectName);
    let instance = {};
    const handledPropertyNames = [];
    for (const key of Object.keys(modelProps)) {
        const propertyMapper = modelProps[key];
        const paths = splitSerializeName(modelProps[key].serializedName);
        handledPropertyNames.push(paths[0]);
        const { serializedName, xmlName, xmlElementName } = propertyMapper;
        let propertyObjectName = objectName;
        if (serializedName !== "" && serializedName !== undefined) {
            propertyObjectName = objectName + "." + serializedName;
        }
        const headerCollectionPrefix = propertyMapper.headerCollectionPrefix;
        if (headerCollectionPrefix) {
            const dictionary = {};
            for (const headerKey of Object.keys(responseBody)) {
                if (headerKey.startsWith(headerCollectionPrefix)) {
                    dictionary[headerKey.substring(headerCollectionPrefix.length)] = serializer.deserialize(propertyMapper.type.value, responseBody[headerKey], propertyObjectName, options);
                }
                handledPropertyNames.push(headerKey);
            }
            instance[key] = dictionary;
        }
        else if (serializer.isXML) {
            if (propertyMapper.xmlIsAttribute && responseBody[XML_ATTRKEY]) {
                instance[key] = serializer.deserialize(propertyMapper, responseBody[XML_ATTRKEY][xmlName], propertyObjectName, options);
            }
            else {
                const propertyName = xmlElementName || xmlName || serializedName;
                if (propertyMapper.xmlIsWrapped) {
                    /* a list of <xmlElementName> wrapped by <xmlName>
                      For the xml example below
                        <Cors>
                          <CorsRule>...</CorsRule>
                          <CorsRule>...</CorsRule>
                        </Cors>
                      the responseBody has
                        {
                          Cors: {
                            CorsRule: [{...}, {...}]
                          }
                        }
                      xmlName is "Cors" and xmlElementName is"CorsRule".
                    */
                    const wrapped = responseBody[xmlName];
                    const elementList = (_a = wrapped === null || wrapped === void 0 ? void 0 : wrapped[xmlElementName]) !== null && _a !== void 0 ? _a : [];
                    instance[key] = serializer.deserialize(propertyMapper, elementList, propertyObjectName, options);
                }
                else {
                    const property = responseBody[propertyName];
                    instance[key] = serializer.deserialize(propertyMapper, property, propertyObjectName, options);
                }
            }
        }
        else {
            // deserialize the property if it is present in the provided responseBody instance
            let propertyInstance;
            let res = responseBody;
            // traversing the object step by step.
            for (const item of paths) {
                if (!res)
                    break;
                res = res[item];
            }
            propertyInstance = res;
            const polymorphicDiscriminator = mapper.type.polymorphicDiscriminator;
            // checking that the model property name (key)(ex: "fishtype") and the
            // clientName of the polymorphicDiscriminator {metadata} (ex: "fishtype")
            // instead of the serializedName of the polymorphicDiscriminator (ex: "fish.type")
            // is a better approach. The generator is not consistent with escaping '\.' in the
            // serializedName of the property (ex: "fish\.type") that is marked as polymorphic discriminator
            // and the serializedName of the metadata polymorphicDiscriminator (ex: "fish.type"). However,
            // the clientName transformation of the polymorphicDiscriminator (ex: "fishtype") and
            // the transformation of model property name (ex: "fishtype") is done consistently.
            // Hence, it is a safer bet to rely on the clientName of the polymorphicDiscriminator.
            if (polymorphicDiscriminator &&
                key === polymorphicDiscriminator.clientName &&
                propertyInstance == undefined) {
                propertyInstance = mapper.serializedName;
            }
            let serializedValue;
            // paging
            if (Array.isArray(responseBody[key]) && modelProps[key].serializedName === "") {
                propertyInstance = responseBody[key];
                const arrayInstance = serializer.deserialize(propertyMapper, propertyInstance, propertyObjectName, options);
                // Copy over any properties that have already been added into the instance, where they do
                // not exist on the newly de-serialized array
                for (const [k, v] of Object.entries(instance)) {
                    if (!Object.prototype.hasOwnProperty.call(arrayInstance, k)) {
                        arrayInstance[k] = v;
                    }
                }
                instance = arrayInstance;
            }
            else if (propertyInstance !== undefined || propertyMapper.defaultValue !== undefined) {
                serializedValue = serializer.deserialize(propertyMapper, propertyInstance, propertyObjectName, options);
                instance[key] = serializedValue;
            }
        }
    }
    const additionalPropertiesMapper = mapper.type.additionalProperties;
    if (additionalPropertiesMapper) {
        const isAdditionalProperty = (responsePropName) => {
            for (const clientPropName in modelProps) {
                const paths = splitSerializeName(modelProps[clientPropName].serializedName);
                if (paths[0] === responsePropName) {
                    return false;
                }
            }
            return true;
        };
        for (const responsePropName in responseBody) {
            if (isAdditionalProperty(responsePropName)) {
                instance[responsePropName] = serializer.deserialize(additionalPropertiesMapper, responseBody[responsePropName], objectName + '["' + responsePropName + '"]', options);
            }
        }
    }
    else if (responseBody) {
        for (const key of Object.keys(responseBody)) {
            if (instance[key] === undefined &&
                !handledPropertyNames.includes(key) &&
                !isSpecialXmlProperty(key, options)) {
                instance[key] = responseBody[key];
            }
        }
    }
    return instance;
}
function deserializeDictionaryType(serializer, mapper, responseBody, objectName, options) {
    const value = mapper.type.value;
    if (!value || typeof value !== "object") {
        throw new Error(`"value" metadata for a Dictionary must be defined in the ` +
            `mapper and it must of type "object" in ${objectName}`);
    }
    if (responseBody) {
        const tempDictionary = {};
        for (const key of Object.keys(responseBody)) {
            tempDictionary[key] = serializer.deserialize(value, responseBody[key], objectName, options);
        }
        return tempDictionary;
    }
    return responseBody;
}
function deserializeSequenceType(serializer, mapper, responseBody, objectName, options) {
    const element = mapper.type.element;
    if (!element || typeof element !== "object") {
        throw new Error(`element" metadata for an Array must be defined in the ` +
            `mapper and it must of type "object" in ${objectName}`);
    }
    if (responseBody) {
        if (!Array.isArray(responseBody)) {
            // xml2js will interpret a single element array as just the element, so force it to be an array
            responseBody = [responseBody];
        }
        const tempArray = [];
        for (let i = 0; i < responseBody.length; i++) {
            tempArray[i] = serializer.deserialize(element, responseBody[i], `${objectName}[${i}]`, options);
        }
        return tempArray;
    }
    return responseBody;
}
function getPolymorphicMapper(serializer, mapper, object, polymorphicPropertyName) {
    const polymorphicDiscriminator = getPolymorphicDiscriminatorRecursively(serializer, mapper);
    if (polymorphicDiscriminator) {
        const discriminatorName = polymorphicDiscriminator[polymorphicPropertyName];
        if (discriminatorName != undefined) {
            const discriminatorValue = object[discriminatorName];
            if (discriminatorValue != undefined) {
                const typeName = mapper.type.uberParent || mapper.type.className;
                const indexDiscriminator = discriminatorValue === typeName
                    ? discriminatorValue
                    : typeName + "." + discriminatorValue;
                const polymorphicMapper = serializer.modelMappers.discriminators[indexDiscriminator];
                if (polymorphicMapper) {
                    mapper = polymorphicMapper;
                }
            }
        }
    }
    return mapper;
}
function getPolymorphicDiscriminatorRecursively(serializer, mapper) {
    return (mapper.type.polymorphicDiscriminator ||
        getPolymorphicDiscriminatorSafely(serializer, mapper.type.uberParent) ||
        getPolymorphicDiscriminatorSafely(serializer, mapper.type.className));
}
function getPolymorphicDiscriminatorSafely(serializer, typeName) {
    return (typeName &&
        serializer.modelMappers[typeName] &&
        serializer.modelMappers[typeName].type.polymorphicDiscriminator);
}
/**
 * Utility function that serializes an object that might contain binary information into a plain object, array or a string.
 */
export function serializeObject(toSerialize) {
    const castToSerialize = toSerialize;
    if (toSerialize == undefined)
        return undefined;
    if (toSerialize instanceof Uint8Array) {
        toSerialize = base64.encodeByteArray(toSerialize);
        return toSerialize;
    }
    else if (toSerialize instanceof Date) {
        return toSerialize.toISOString();
    }
    else if (Array.isArray(toSerialize)) {
        const array = [];
        for (let i = 0; i < toSerialize.length; i++) {
            array.push(serializeObject(toSerialize[i]));
        }
        return array;
    }
    else if (typeof toSerialize === "object") {
        const dictionary = {};
        for (const property in toSerialize) {
            dictionary[property] = serializeObject(castToSerialize[property]);
        }
        return dictionary;
    }
    return toSerialize;
}
/**
 * Utility function to create a K:V from a list of strings
 */
function strEnum(o) {
    const result = {};
    for (const key of o) {
        result[key] = key;
    }
    return result;
}
/**
 * String enum containing the string types of property mappers.
 */
// eslint-disable-next-line @typescript-eslint/no-redeclare
export const MapperType = strEnum([
    "Base64Url",
    "Boolean",
    "ByteArray",
    "Composite",
    "Date",
    "DateTime",
    "DateTimeRfc1123",
    "Dictionary",
    "Enum",
    "Number",
    "Object",
    "Sequence",
    "String",
    "Stream",
    "TimeSpan",
    "UnixTime",
]);
//# sourceMappingURL=serializer.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import * as utils from "./util/utils";
import { MapperType } from "./serializer";
import { DefaultDeserializationOptions, deserializationPolicy, } from "./policies/deserializationPolicy";
import { DefaultKeepAliveOptions, keepAlivePolicy } from "./policies/keepAlivePolicy";
import { DefaultRedirectOptions, redirectPolicy } from "./policies/redirectPolicy";
import { DefaultRetryOptions, exponentialRetryPolicy } from "./policies/exponentialRetryPolicy";
import { logPolicy } from "./policies/logPolicy";
import { getPathStringFromParameter, getPathStringFromParameterPath, } from "./operationParameter";
import { getStreamResponseStatusCodes } from "./operationSpec";
import { WebResource, isWebResourceLike, } from "./webResource";
import { RequestPolicyOptions, } from "./policies/requestPolicy";
import { XML_ATTRKEY, XML_CHARKEY } from "./util/serializer.common";
import { isNode } from "./util/utils";
import { isTokenCredential } from "@azure/core-auth";
import { getDefaultUserAgentHeaderName, getDefaultUserAgentValue, userAgentPolicy, } from "./policies/userAgentPolicy";
import { QueryCollectionFormat } from "./queryCollectionFormat";
import { URLBuilder } from "./url";
import { bearerTokenAuthenticationPolicy } from "./policies/bearerTokenAuthenticationPolicy";
import { disableResponseDecompressionPolicy } from "./policies/disableResponseDecompressionPolicy";
import { generateClientRequestIdPolicy } from "./policies/generateClientRequestIdPolicy";
import { getCachedDefaultHttpClient } from "./httpClientCache";
import { logger } from "./log";
import { ndJsonPolicy } from "./policies/ndJsonPolicy";
import { proxyPolicy } from "./policies/proxyPolicy";
import { rpRegistrationPolicy } from "./policies/rpRegistrationPolicy";
import { signingPolicy } from "./policies/signingPolicy";
import { stringifyXML } from "./util/xml";
import { systemErrorRetryPolicy } from "./policies/systemErrorRetryPolicy";
import { throttlingRetryPolicy } from "./policies/throttlingRetryPolicy";
import { tracingPolicy } from "./policies/tracingPolicy";
/**
 * ServiceClient sends service requests and receives responses.
 */
export class ServiceClient {
    /**
     * The ServiceClient constructor
     * @param credentials - The credentials used for authentication with the service.
     * @param options - The service client options that govern the behavior of the client.
     */
    constructor(credentials, 
    /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */
    options) {
        if (!options) {
            options = {};
        }
        this._withCredentials = options.withCredentials || false;
        this._httpClient = options.httpClient || getCachedDefaultHttpClient();
        this._requestPolicyOptions = new RequestPolicyOptions(options.httpPipelineLogger);
        let requestPolicyFactories;
        if (Array.isArray(options.requestPolicyFactories)) {
            logger.info("ServiceClient: using custom request policies");
            requestPolicyFactories = options.requestPolicyFactories;
        }
        else {
            let authPolicyFactory = undefined;
            if (isTokenCredential(credentials)) {
                logger.info("ServiceClient: creating bearer token authentication policy from provided credentials");
                // Create a wrapped RequestPolicyFactory here so that we can provide the
                // correct scope to the BearerTokenAuthenticationPolicy at the first time
                // one is requested.  This is needed because generated ServiceClient
                // implementations do not set baseUri until after ServiceClient's constructor
                // is finished, leaving baseUri empty at the time when it is needed to
                // build the correct scope name.
                const wrappedPolicyFactory = () => {
                    let bearerTokenPolicyFactory = undefined;
                    // eslint-disable-next-line @typescript-eslint/no-this-alias
                    const serviceClient = this;
                    const serviceClientOptions = options;
                    return {
                        create(nextPolicy, createOptions) {
                            const credentialScopes = getCredentialScopes(serviceClientOptions, serviceClient.baseUri);
                            if (!credentialScopes) {
                                throw new Error(`When using credential, the ServiceClient must contain a baseUri or a credentialScopes in ServiceClientOptions. Unable to create a bearerTokenAuthenticationPolicy`);
                            }
                            if (bearerTokenPolicyFactory === undefined || bearerTokenPolicyFactory === null) {
                                bearerTokenPolicyFactory = bearerTokenAuthenticationPolicy(credentials, credentialScopes);
                            }
                            return bearerTokenPolicyFactory.create(nextPolicy, createOptions);
                        },
                    };
                };
                authPolicyFactory = wrappedPolicyFactory();
            }
            else if (credentials && typeof credentials.signRequest === "function") {
                logger.info("ServiceClient: creating signing policy from provided credentials");
                authPolicyFactory = signingPolicy(credentials);
            }
            else if (credentials !== undefined && credentials !== null) {
                throw new Error("The credentials argument must implement the TokenCredential interface");
            }
            logger.info("ServiceClient: using default request policies");
            requestPolicyFactories = createDefaultRequestPolicyFactories(authPolicyFactory, options);
            if (options.requestPolicyFactories) {
                // options.requestPolicyFactories can also be a function that manipulates
                // the default requestPolicyFactories array
                const newRequestPolicyFactories = options.requestPolicyFactories(requestPolicyFactories);
                if (newRequestPolicyFactories) {
                    requestPolicyFactories = newRequestPolicyFactories;
                }
            }
        }
        this._requestPolicyFactories = requestPolicyFactories;
    }
    /**
     * Send the provided httpRequest.
     */
    sendRequest(options) {
        if (options === null || options === undefined || typeof options !== "object") {
            throw new Error("options cannot be null or undefined and it must be of type object.");
        }
        let httpRequest;
        try {
            if (isWebResourceLike(options)) {
                options.validateRequestProperties();
                httpRequest = options;
            }
            else {
                httpRequest = new WebResource();
                httpRequest = httpRequest.prepare(options);
            }
        }
        catch (error) {
            return Promise.reject(error);
        }
        let httpPipeline = this._httpClient;
        if (this._requestPolicyFactories && this._requestPolicyFactories.length > 0) {
            for (let i = this._requestPolicyFactories.length - 1; i >= 0; --i) {
                httpPipeline = this._requestPolicyFactories[i].create(httpPipeline, this._requestPolicyOptions);
            }
        }
        return httpPipeline.sendRequest(httpRequest);
    }
    /**
     * Send an HTTP request that is populated using the provided OperationSpec.
     * @param operationArguments - The arguments that the HTTP request's templated values will be populated from.
     * @param operationSpec - The OperationSpec to use to populate the httpRequest.
     * @param callback - The callback to call when the response is received.
     */
    async sendOperationRequest(operationArguments, operationSpec, callback) {
        var _a;
        if (typeof operationArguments.options === "function") {
            callback = operationArguments.options;
            operationArguments.options = undefined;
        }
        const serializerOptions = (_a = operationArguments.options) === null || _a === void 0 ? void 0 : _a.serializerOptions;
        const httpRequest = new WebResource();
        let result;
        try {
            const baseUri = operationSpec.baseUrl || this.baseUri;
            if (!baseUri) {
                throw new Error("If operationSpec.baseUrl is not specified, then the ServiceClient must have a baseUri string property that contains the base URL to use.");
            }
            httpRequest.method = operationSpec.httpMethod;
            httpRequest.operationSpec = operationSpec;
            const requestUrl = URLBuilder.parse(baseUri);
            if (operationSpec.path) {
                requestUrl.appendPath(operationSpec.path);
            }
            if (operationSpec.urlParameters && operationSpec.urlParameters.length > 0) {
                for (const urlParameter of operationSpec.urlParameters) {
                    let urlParameterValue = getOperationArgumentValueFromParameter(this, operationArguments, urlParameter, operationSpec.serializer);
                    urlParameterValue = operationSpec.serializer.serialize(urlParameter.mapper, urlParameterValue, getPathStringFromParameter(urlParameter), serializerOptions);
                    if (!urlParameter.skipEncoding) {
                        urlParameterValue = encodeURIComponent(urlParameterValue);
                    }
                    requestUrl.replaceAll(`{${urlParameter.mapper.serializedName || getPathStringFromParameter(urlParameter)}}`, urlParameterValue);
                }
            }
            if (operationSpec.queryParameters && operationSpec.queryParameters.length > 0) {
                for (const queryParameter of operationSpec.queryParameters) {
                    let queryParameterValue = getOperationArgumentValueFromParameter(this, operationArguments, queryParameter, operationSpec.serializer);
                    if (queryParameterValue !== undefined && queryParameterValue !== null) {
                        queryParameterValue = operationSpec.serializer.serialize(queryParameter.mapper, queryParameterValue, getPathStringFromParameter(queryParameter), serializerOptions);
                        if (queryParameter.collectionFormat !== undefined &&
                            queryParameter.collectionFormat !== null) {
                            if (queryParameter.collectionFormat === QueryCollectionFormat.Multi) {
                                if (queryParameterValue.length === 0) {
                                    // The collection is empty, no need to try serializing the current queryParam
                                    continue;
                                }
                                else {
                                    for (const index in queryParameterValue) {
                                        const item = queryParameterValue[index];
                                        queryParameterValue[index] =
                                            item === undefined || item === null ? "" : item.toString();
                                    }
                                }
                            }
                            else if (queryParameter.collectionFormat === QueryCollectionFormat.Ssv ||
                                queryParameter.collectionFormat === QueryCollectionFormat.Tsv) {
                                queryParameterValue = queryParameterValue.join(queryParameter.collectionFormat);
                            }
                        }
                        if (!queryParameter.skipEncoding) {
                            if (Array.isArray(queryParameterValue)) {
                                for (const index in queryParameterValue) {
                                    if (queryParameterValue[index] !== undefined &&
                                        queryParameterValue[index] !== null) {
                                        queryParameterValue[index] = encodeURIComponent(queryParameterValue[index]);
                                    }
                                }
                            }
                            else {
                                queryParameterValue = encodeURIComponent(queryParameterValue);
                            }
                        }
                        if (queryParameter.collectionFormat !== undefined &&
                            queryParameter.collectionFormat !== null &&
                            queryParameter.collectionFormat !== QueryCollectionFormat.Multi &&
                            queryParameter.collectionFormat !== QueryCollectionFormat.Ssv &&
                            queryParameter.collectionFormat !== QueryCollectionFormat.Tsv) {
                            queryParameterValue = queryParameterValue.join(queryParameter.collectionFormat);
                        }
                        requestUrl.setQueryParameter(queryParameter.mapper.serializedName || getPathStringFromParameter(queryParameter), queryParameterValue);
                    }
                }
            }
            httpRequest.url = requestUrl.toString();
            const contentType = operationSpec.contentType || this.requestContentType;
            if (contentType && operationSpec.requestBody) {
                httpRequest.headers.set("Content-Type", contentType);
            }
            if (operationSpec.headerParameters) {
                for (const headerParameter of operationSpec.headerParameters) {
                    let headerValue = getOperationArgumentValueFromParameter(this, operationArguments, headerParameter, operationSpec.serializer);
                    if (headerValue !== undefined && headerValue !== null) {
                        headerValue = operationSpec.serializer.serialize(headerParameter.mapper, headerValue, getPathStringFromParameter(headerParameter), serializerOptions);
                        const headerCollectionPrefix = headerParameter.mapper
                            .headerCollectionPrefix;
                        if (headerCollectionPrefix) {
                            for (const key of Object.keys(headerValue)) {
                                httpRequest.headers.set(headerCollectionPrefix + key, headerValue[key]);
                            }
                        }
                        else {
                            httpRequest.headers.set(headerParameter.mapper.serializedName ||
                                getPathStringFromParameter(headerParameter), headerValue);
                        }
                    }
                }
            }
            const options = operationArguments.options;
            if (options) {
                if (options.customHeaders) {
                    for (const customHeaderName in options.customHeaders) {
                        httpRequest.headers.set(customHeaderName, options.customHeaders[customHeaderName]);
                    }
                }
                if (options.abortSignal) {
                    httpRequest.abortSignal = options.abortSignal;
                }
                if (options.timeout) {
                    httpRequest.timeout = options.timeout;
                }
                if (options.onUploadProgress) {
                    httpRequest.onUploadProgress = options.onUploadProgress;
                }
                if (options.onDownloadProgress) {
                    httpRequest.onDownloadProgress = options.onDownloadProgress;
                }
                if (options.spanOptions) {
                    // By passing spanOptions if they exist at runtime, we're backwards compatible with @azure/core-tracing@preview.13 and earlier.
                    httpRequest.spanOptions = options.spanOptions;
                }
                if (options.tracingContext) {
                    httpRequest.tracingContext = options.tracingContext;
                }
                if (options.shouldDeserialize !== undefined && options.shouldDeserialize !== null) {
                    httpRequest.shouldDeserialize = options.shouldDeserialize;
                }
            }
            httpRequest.withCredentials = this._withCredentials;
            serializeRequestBody(this, httpRequest, operationArguments, operationSpec);
            if (httpRequest.streamResponseStatusCodes === undefined) {
                httpRequest.streamResponseStatusCodes = getStreamResponseStatusCodes(operationSpec);
            }
            let rawResponse;
            let sendRequestError;
            try {
                rawResponse = await this.sendRequest(httpRequest);
            }
            catch (error) {
                sendRequestError = error;
            }
            if (sendRequestError) {
                if (sendRequestError.response) {
                    sendRequestError.details = flattenResponse(sendRequestError.response, operationSpec.responses[sendRequestError.statusCode] ||
                        operationSpec.responses["default"]);
                }
                result = Promise.reject(sendRequestError);
            }
            else {
                result = Promise.resolve(flattenResponse(rawResponse, operationSpec.responses[rawResponse.status]));
            }
        }
        catch (error) {
            result = Promise.reject(error);
        }
        const cb = callback;
        if (cb) {
            result
                .then((res) => cb(null, res._response.parsedBody, res._response.request, res._response))
                .catch((err) => cb(err));
        }
        return result;
    }
}
export function serializeRequestBody(serviceClient, httpRequest, operationArguments, operationSpec) {
    var _a, _b, _c, _d, _e, _f;
    const serializerOptions = (_b = (_a = operationArguments.options) === null || _a === void 0 ? void 0 : _a.serializerOptions) !== null && _b !== void 0 ? _b : {};
    const updatedOptions = {
        rootName: (_c = serializerOptions.rootName) !== null && _c !== void 0 ? _c : "",
        includeRoot: (_d = serializerOptions.includeRoot) !== null && _d !== void 0 ? _d : false,
        xmlCharKey: (_e = serializerOptions.xmlCharKey) !== null && _e !== void 0 ? _e : XML_CHARKEY,
    };
    const xmlCharKey = serializerOptions.xmlCharKey;
    if (operationSpec.requestBody && operationSpec.requestBody.mapper) {
        httpRequest.body = getOperationArgumentValueFromParameter(serviceClient, operationArguments, operationSpec.requestBody, operationSpec.serializer);
        const bodyMapper = operationSpec.requestBody.mapper;
        const { required, xmlName, xmlElementName, serializedName, xmlNamespace, xmlNamespacePrefix } = bodyMapper;
        const typeName = bodyMapper.type.name;
        try {
            if ((httpRequest.body !== undefined && httpRequest.body !== null) || required) {
                const requestBodyParameterPathString = getPathStringFromParameter(operationSpec.requestBody);
                httpRequest.body = operationSpec.serializer.serialize(bodyMapper, httpRequest.body, requestBodyParameterPathString, updatedOptions);
                const isStream = typeName === MapperType.Stream;
                if (operationSpec.isXML) {
                    const xmlnsKey = xmlNamespacePrefix ? `xmlns:${xmlNamespacePrefix}` : "xmlns";
                    const value = getXmlValueWithNamespace(xmlNamespace, xmlnsKey, typeName, httpRequest.body, updatedOptions);
                    if (typeName === MapperType.Sequence) {
                        httpRequest.body = stringifyXML(utils.prepareXMLRootList(value, xmlElementName || xmlName || serializedName, xmlnsKey, xmlNamespace), {
                            rootName: xmlName || serializedName,
                            xmlCharKey,
                        });
                    }
                    else if (!isStream) {
                        httpRequest.body = stringifyXML(value, {
                            rootName: xmlName || serializedName,
                            xmlCharKey,
                        });
                    }
                }
                else if (typeName === MapperType.String &&
                    (((_f = operationSpec.contentType) === null || _f === void 0 ? void 0 : _f.match("text/plain")) || operationSpec.mediaType === "text")) {
                    // the String serializer has validated that request body is a string
                    // so just send the string.
                    return;
                }
                else if (!isStream) {
                    httpRequest.body = JSON.stringify(httpRequest.body);
                }
            }
        }
        catch (error) {
            throw new Error(`Error "${error.message}" occurred in serializing the payload - ${JSON.stringify(serializedName, undefined, "  ")}.`);
        }
    }
    else if (operationSpec.formDataParameters && operationSpec.formDataParameters.length > 0) {
        httpRequest.formData = {};
        for (const formDataParameter of operationSpec.formDataParameters) {
            const formDataParameterValue = getOperationArgumentValueFromParameter(serviceClient, operationArguments, formDataParameter, operationSpec.serializer);
            if (formDataParameterValue !== undefined && formDataParameterValue !== null) {
                const formDataParameterPropertyName = formDataParameter.mapper.serializedName || getPathStringFromParameter(formDataParameter);
                httpRequest.formData[formDataParameterPropertyName] = operationSpec.serializer.serialize(formDataParameter.mapper, formDataParameterValue, getPathStringFromParameter(formDataParameter), updatedOptions);
            }
        }
    }
}
/**
 * Adds an xml namespace to the xml serialized object if needed, otherwise it just returns the value itself
 */
function getXmlValueWithNamespace(xmlNamespace, xmlnsKey, typeName, serializedValue, options) {
    // Composite and Sequence schemas already got their root namespace set during serialization
    // We just need to add xmlns to the other schema types
    if (xmlNamespace && !["Composite", "Sequence", "Dictionary"].includes(typeName)) {
        const result = {};
        result[options.xmlCharKey] = serializedValue;
        result[XML_ATTRKEY] = { [xmlnsKey]: xmlNamespace };
        return result;
    }
    return serializedValue;
}
function getValueOrFunctionResult(value, defaultValueCreator) {
    let result;
    if (typeof value === "string") {
        result = value;
    }
    else {
        result = defaultValueCreator();
        if (typeof value === "function") {
            result = value(result);
        }
    }
    return result;
}
function createDefaultRequestPolicyFactories(authPolicyFactory, options) {
    const factories = [];
    if (options.generateClientRequestIdHeader) {
        factories.push(generateClientRequestIdPolicy(options.clientRequestIdHeaderName));
    }
    if (authPolicyFactory) {
        factories.push(authPolicyFactory);
    }
    const userAgentHeaderName = getValueOrFunctionResult(options.userAgentHeaderName, getDefaultUserAgentHeaderName);
    const userAgentHeaderValue = getValueOrFunctionResult(options.userAgent, getDefaultUserAgentValue);
    if (userAgentHeaderName && userAgentHeaderValue) {
        factories.push(userAgentPolicy({ key: userAgentHeaderName, value: userAgentHeaderValue }));
    }
    factories.push(redirectPolicy());
    factories.push(rpRegistrationPolicy(options.rpRegistrationRetryTimeout));
    if (!options.noRetryPolicy) {
        factories.push(exponentialRetryPolicy());
        factories.push(systemErrorRetryPolicy());
        factories.push(throttlingRetryPolicy());
    }
    factories.push(deserializationPolicy(options.deserializationContentTypes));
    if (isNode) {
        factories.push(proxyPolicy(options.proxySettings));
    }
    factories.push(logPolicy({ logger: logger.info }));
    return factories;
}
/**
 * Creates an HTTP pipeline based on the given options.
 * @param pipelineOptions - Defines options that are used to configure policies in the HTTP pipeline for an SDK client.
 * @param authPolicyFactory - An optional authentication policy factory to use for signing requests.
 * @returns A set of options that can be passed to create a new {@link ServiceClient}.
 */
export function createPipelineFromOptions(pipelineOptions, authPolicyFactory) {
    const requestPolicyFactories = [];
    if (pipelineOptions.sendStreamingJson) {
        requestPolicyFactories.push(ndJsonPolicy());
    }
    let userAgentValue = undefined;
    if (pipelineOptions.userAgentOptions && pipelineOptions.userAgentOptions.userAgentPrefix) {
        const userAgentInfo = [];
        userAgentInfo.push(pipelineOptions.userAgentOptions.userAgentPrefix);
        // Add the default user agent value if it isn't already specified
        // by the userAgentPrefix option.
        const defaultUserAgentInfo = getDefaultUserAgentValue();
        if (userAgentInfo.indexOf(defaultUserAgentInfo) === -1) {
            userAgentInfo.push(defaultUserAgentInfo);
        }
        userAgentValue = userAgentInfo.join(" ");
    }
    const keepAliveOptions = Object.assign(Object.assign({}, DefaultKeepAliveOptions), pipelineOptions.keepAliveOptions);
    const retryOptions = Object.assign(Object.assign({}, DefaultRetryOptions), pipelineOptions.retryOptions);
    const redirectOptions = Object.assign(Object.assign({}, DefaultRedirectOptions), pipelineOptions.redirectOptions);
    if (isNode) {
        requestPolicyFactories.push(proxyPolicy(pipelineOptions.proxyOptions));
    }
    const deserializationOptions = Object.assign(Object.assign({}, DefaultDeserializationOptions), pipelineOptions.deserializationOptions);
    const loggingOptions = Object.assign({}, pipelineOptions.loggingOptions);
    requestPolicyFactories.push(tracingPolicy({ userAgent: userAgentValue }), keepAlivePolicy(keepAliveOptions), userAgentPolicy({ value: userAgentValue }), generateClientRequestIdPolicy(), deserializationPolicy(deserializationOptions.expectedContentTypes), throttlingRetryPolicy(), systemErrorRetryPolicy(), exponentialRetryPolicy(retryOptions.maxRetries, retryOptions.retryDelayInMs, retryOptions.maxRetryDelayInMs));
    if (redirectOptions.handleRedirects) {
        requestPolicyFactories.push(redirectPolicy(redirectOptions.maxRetries));
    }
    if (authPolicyFactory) {
        requestPolicyFactories.push(authPolicyFactory);
    }
    requestPolicyFactories.push(logPolicy(loggingOptions));
    if (isNode && pipelineOptions.decompressResponse === false) {
        requestPolicyFactories.push(disableResponseDecompressionPolicy());
    }
    return {
        httpClient: pipelineOptions.httpClient,
        requestPolicyFactories,
    };
}
/**
 * Get the property parent for the property at the provided path when starting with the provided
 * parent object.
 */
export function getPropertyParent(parent, propertyPath) {
    if (parent && propertyPath) {
        const propertyPathLength = propertyPath.length;
        for (let i = 0; i < propertyPathLength - 1; ++i) {
            const propertyName = propertyPath[i];
            if (!parent[propertyName]) {
                parent[propertyName] = {};
            }
            parent = parent[propertyName];
        }
    }
    return parent;
}
function getOperationArgumentValueFromParameter(serviceClient, operationArguments, parameter, serializer) {
    return getOperationArgumentValueFromParameterPath(serviceClient, operationArguments, parameter.parameterPath, parameter.mapper, serializer);
}
export function getOperationArgumentValueFromParameterPath(serviceClient, operationArguments, parameterPath, parameterMapper, serializer) {
    var _a;
    let value;
    if (typeof parameterPath === "string") {
        parameterPath = [parameterPath];
    }
    const serializerOptions = (_a = operationArguments.options) === null || _a === void 0 ? void 0 : _a.serializerOptions;
    if (Array.isArray(parameterPath)) {
        if (parameterPath.length > 0) {
            if (parameterMapper.isConstant) {
                value = parameterMapper.defaultValue;
            }
            else {
                let propertySearchResult = getPropertyFromParameterPath(operationArguments, parameterPath);
                if (!propertySearchResult.propertyFound) {
                    propertySearchResult = getPropertyFromParameterPath(serviceClient, parameterPath);
                }
                let useDefaultValue = false;
                if (!propertySearchResult.propertyFound) {
                    useDefaultValue =
                        parameterMapper.required ||
                            (parameterPath[0] === "options" && parameterPath.length === 2);
                }
                value = useDefaultValue ? parameterMapper.defaultValue : propertySearchResult.propertyValue;
            }
            // Serialize just for validation purposes.
            const parameterPathString = getPathStringFromParameterPath(parameterPath, parameterMapper);
            serializer.serialize(parameterMapper, value, parameterPathString, serializerOptions);
        }
    }
    else {
        if (parameterMapper.required) {
            value = {};
        }
        for (const propertyName in parameterPath) {
            const propertyMapper = parameterMapper.type.modelProperties[propertyName];
            const propertyPath = parameterPath[propertyName];
            const propertyValue = getOperationArgumentValueFromParameterPath(serviceClient, operationArguments, propertyPath, propertyMapper, serializer);
            // Serialize just for validation purposes.
            const propertyPathString = getPathStringFromParameterPath(propertyPath, propertyMapper);
            serializer.serialize(propertyMapper, propertyValue, propertyPathString, serializerOptions);
            if (propertyValue !== undefined && propertyValue !== null) {
                if (!value) {
                    value = {};
                }
                value[propertyName] = propertyValue;
            }
        }
    }
    return value;
}
function getPropertyFromParameterPath(parent, parameterPath) {
    const result = { propertyFound: false };
    let i = 0;
    for (; i < parameterPath.length; ++i) {
        const parameterPathPart = parameterPath[i];
        // Make sure to check inherited properties too, so don't use hasOwnProperty().
        if (parent !== undefined && parent !== null && parameterPathPart in parent) {
            parent = parent[parameterPathPart];
        }
        else {
            break;
        }
    }
    if (i === parameterPath.length) {
        result.propertyValue = parent;
        result.propertyFound = true;
    }
    return result;
}
/**
 * Parses an {@link HttpOperationResponse} into a normalized HTTP response object ({@link RestResponse}).
 * @param _response - Wrapper object for http response.
 * @param responseSpec - Mappers for how to parse the response properties.
 * @returns - A normalized response object.
 */
export function flattenResponse(_response, responseSpec) {
    const parsedHeaders = _response.parsedHeaders;
    const bodyMapper = responseSpec && responseSpec.bodyMapper;
    const addOperationResponse = (obj) => {
        return Object.defineProperty(obj, "_response", {
            value: _response,
        });
    };
    if (bodyMapper) {
        const typeName = bodyMapper.type.name;
        if (typeName === "Stream") {
            return addOperationResponse(Object.assign(Object.assign({}, parsedHeaders), { blobBody: _response.blobBody, readableStreamBody: _response.readableStreamBody }));
        }
        const modelProperties = (typeName === "Composite" && bodyMapper.type.modelProperties) || {};
        const isPageableResponse = Object.keys(modelProperties).some((k) => modelProperties[k].serializedName === "");
        if (typeName === "Sequence" || isPageableResponse) {
            const arrayResponse = [...(_response.parsedBody || [])];
            for (const key of Object.keys(modelProperties)) {
                if (modelProperties[key].serializedName) {
                    arrayResponse[key] = _response.parsedBody[key];
                }
            }
            if (parsedHeaders) {
                for (const key of Object.keys(parsedHeaders)) {
                    arrayResponse[key] = parsedHeaders[key];
                }
            }
            addOperationResponse(arrayResponse);
            return arrayResponse;
        }
        if (typeName === "Composite" || typeName === "Dictionary") {
            return addOperationResponse(Object.assign(Object.assign({}, parsedHeaders), _response.parsedBody));
        }
    }
    if (bodyMapper ||
        _response.request.method === "HEAD" ||
        utils.isPrimitiveType(_response.parsedBody)) {
        // primitive body types and HEAD booleans
        return addOperationResponse(Object.assign(Object.assign({}, parsedHeaders), { body: _response.parsedBody }));
    }
    return addOperationResponse(Object.assign(Object.assign({}, parsedHeaders), _response.parsedBody));
}
function getCredentialScopes(options, baseUri) {
    if (options === null || options === void 0 ? void 0 : options.credentialScopes) {
        const scopes = options.credentialScopes;
        return Array.isArray(scopes)
            ? scopes.map((scope) => new URL(scope).toString())
            : new URL(scopes).toString();
    }
    if (baseUri) {
        return `${baseUri}/.default`;
    }
    return undefined;
}
//# sourceMappingURL=serviceClient.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { replaceAll } from "./util/utils";
/**
 * A class that handles the query portion of a URLBuilder.
 */
export class URLQuery {
    constructor() {
        this._rawQuery = {};
    }
    /**
     * Get whether or not there any query parameters in this URLQuery.
     */
    any() {
        return Object.keys(this._rawQuery).length > 0;
    }
    /**
     * Get the keys of the query string.
     */
    keys() {
        return Object.keys(this._rawQuery);
    }
    /**
     * Set a query parameter with the provided name and value. If the parameterValue is undefined or
     * empty, then this will attempt to remove an existing query parameter with the provided
     * parameterName.
     */
    set(parameterName, parameterValue) {
        const caseParameterValue = parameterValue;
        if (parameterName) {
            if (caseParameterValue !== undefined && caseParameterValue !== null) {
                const newValue = Array.isArray(caseParameterValue)
                    ? caseParameterValue
                    : caseParameterValue.toString();
                this._rawQuery[parameterName] = newValue;
            }
            else {
                delete this._rawQuery[parameterName];
            }
        }
    }
    /**
     * Get the value of the query parameter with the provided name. If no parameter exists with the
     * provided parameter name, then undefined will be returned.
     */
    get(parameterName) {
        return parameterName ? this._rawQuery[parameterName] : undefined;
    }
    /**
     * Get the string representation of this query. The return value will not start with a "?".
     */
    toString() {
        let result = "";
        for (const parameterName in this._rawQuery) {
            if (result) {
                result += "&";
            }
            const parameterValue = this._rawQuery[parameterName];
            if (Array.isArray(parameterValue)) {
                const parameterStrings = [];
                for (const parameterValueElement of parameterValue) {
                    parameterStrings.push(`${parameterName}=${parameterValueElement}`);
                }
                result += parameterStrings.join("&");
            }
            else {
                result += `${parameterName}=${parameterValue}`;
            }
        }
        return result;
    }
    /**
     * Parse a URLQuery from the provided text.
     */
    static parse(text) {
        const result = new URLQuery();
        if (text) {
            if (text.startsWith("?")) {
                text = text.substring(1);
            }
            let currentState = "ParameterName";
            let parameterName = "";
            let parameterValue = "";
            for (let i = 0; i < text.length; ++i) {
                const currentCharacter = text[i];
                switch (currentState) {
                    case "ParameterName":
                        switch (currentCharacter) {
                            case "=":
                                currentState = "ParameterValue";
                                break;
                            case "&":
                                parameterName = "";
                                parameterValue = "";
                                break;
                            default:
                                parameterName += currentCharacter;
                                break;
                        }
                        break;
                    case "ParameterValue":
                        switch (currentCharacter) {
                            case "&":
                                result.set(parameterName, parameterValue);
                                parameterName = "";
                                parameterValue = "";
                                currentState = "ParameterName";
                                break;
                            default:
                                parameterValue += currentCharacter;
                                break;
                        }
                        break;
                    default:
                        throw new Error("Unrecognized URLQuery parse state: " + currentState);
                }
            }
            if (currentState === "ParameterValue") {
                result.set(parameterName, parameterValue);
            }
        }
        return result;
    }
}
/**
 * A class that handles creating, modifying, and parsing URLs.
 */
export class URLBuilder {
    /**
     * Set the scheme/protocol for this URL. If the provided scheme contains other parts of a URL
     * (such as a host, port, path, or query), those parts will be added to this URL as well.
     */
    setScheme(scheme) {
        if (!scheme) {
            this._scheme = undefined;
        }
        else {
            this.set(scheme, "SCHEME");
        }
    }
    /**
     * Get the scheme that has been set in this URL.
     */
    getScheme() {
        return this._scheme;
    }
    /**
     * Set the host for this URL. If the provided host contains other parts of a URL (such as a
     * port, path, or query), those parts will be added to this URL as well.
     */
    setHost(host) {
        if (!host) {
            this._host = undefined;
        }
        else {
            this.set(host, "SCHEME_OR_HOST");
        }
    }
    /**
     * Get the host that has been set in this URL.
     */
    getHost() {
        return this._host;
    }
    /**
     * Set the port for this URL. If the provided port contains other parts of a URL (such as a
     * path or query), those parts will be added to this URL as well.
     */
    setPort(port) {
        if (port === undefined || port === null || port === "") {
            this._port = undefined;
        }
        else {
            this.set(port.toString(), "PORT");
        }
    }
    /**
     * Get the port that has been set in this URL.
     */
    getPort() {
        return this._port;
    }
    /**
     * Set the path for this URL. If the provided path contains a query, then it will be added to
     * this URL as well.
     */
    setPath(path) {
        if (!path) {
            this._path = undefined;
        }
        else {
            const schemeIndex = path.indexOf("://");
            if (schemeIndex !== -1) {
                const schemeStart = path.lastIndexOf("/", schemeIndex);
                // Make sure to only grab the URL part of the path before setting the state back to SCHEME
                // this will handle cases such as "/a/b/c/https://microsoft.com" => "https://microsoft.com"
                this.set(schemeStart === -1 ? path : path.substr(schemeStart + 1), "SCHEME");
            }
            else {
                this.set(path, "PATH");
            }
        }
    }
    /**
     * Append the provided path to this URL's existing path. If the provided path contains a query,
     * then it will be added to this URL as well.
     */
    appendPath(path) {
        if (path) {
            let currentPath = this.getPath();
            if (currentPath) {
                if (!currentPath.endsWith("/")) {
                    currentPath += "/";
                }
                if (path.startsWith("/")) {
                    path = path.substring(1);
                }
                path = currentPath + path;
            }
            this.set(path, "PATH");
        }
    }
    /**
     * Get the path that has been set in this URL.
     */
    getPath() {
        return this._path;
    }
    /**
     * Set the query in this URL.
     */
    setQuery(query) {
        if (!query) {
            this._query = undefined;
        }
        else {
            this._query = URLQuery.parse(query);
        }
    }
    /**
     * Set a query parameter with the provided name and value in this URL's query. If the provided
     * query parameter value is undefined or empty, then the query parameter will be removed if it
     * existed.
     */
    setQueryParameter(queryParameterName, queryParameterValue) {
        if (queryParameterName) {
            if (!this._query) {
                this._query = new URLQuery();
            }
            this._query.set(queryParameterName, queryParameterValue);
        }
    }
    /**
     * Get the value of the query parameter with the provided query parameter name. If no query
     * parameter exists with the provided name, then undefined will be returned.
     */
    getQueryParameterValue(queryParameterName) {
        return this._query ? this._query.get(queryParameterName) : undefined;
    }
    /**
     * Get the query in this URL.
     */
    getQuery() {
        return this._query ? this._query.toString() : undefined;
    }
    /**
     * Set the parts of this URL by parsing the provided text using the provided startState.
     */
    set(text, startState) {
        const tokenizer = new URLTokenizer(text, startState);
        while (tokenizer.next()) {
            const token = tokenizer.current();
            let tokenPath;
            if (token) {
                switch (token.type) {
                    case "SCHEME":
                        this._scheme = token.text || undefined;
                        break;
                    case "HOST":
                        this._host = token.text || undefined;
                        break;
                    case "PORT":
                        this._port = token.text || undefined;
                        break;
                    case "PATH":
                        tokenPath = token.text || undefined;
                        if (!this._path || this._path === "/" || tokenPath !== "/") {
                            this._path = tokenPath;
                        }
                        break;
                    case "QUERY":
                        this._query = URLQuery.parse(token.text);
                        break;
                    default:
                        throw new Error(`Unrecognized URLTokenType: ${token.type}`);
                }
            }
        }
    }
    /**
     * Serializes the URL as a string.
     * @returns the URL as a string.
     */
    toString() {
        let result = "";
        if (this._scheme) {
            result += `${this._scheme}://`;
        }
        if (this._host) {
            result += this._host;
        }
        if (this._port) {
            result += `:${this._port}`;
        }
        if (this._path) {
            if (!this._path.startsWith("/")) {
                result += "/";
            }
            result += this._path;
        }
        if (this._query && this._query.any()) {
            result += `?${this._query.toString()}`;
        }
        return result;
    }
    /**
     * If the provided searchValue is found in this URLBuilder, then replace it with the provided
     * replaceValue.
     */
    replaceAll(searchValue, replaceValue) {
        if (searchValue) {
            this.setScheme(replaceAll(this.getScheme(), searchValue, replaceValue));
            this.setHost(replaceAll(this.getHost(), searchValue, replaceValue));
            this.setPort(replaceAll(this.getPort(), searchValue, replaceValue));
            this.setPath(replaceAll(this.getPath(), searchValue, replaceValue));
            this.setQuery(replaceAll(this.getQuery(), searchValue, replaceValue));
        }
    }
    /**
     * Parses a given string URL into a new {@link URLBuilder}.
     */
    static parse(text) {
        const result = new URLBuilder();
        result.set(text, "SCHEME_OR_HOST");
        return result;
    }
}
export class URLToken {
    constructor(text, type) {
        this.text = text;
        this.type = type;
    }
    static scheme(text) {
        return new URLToken(text, "SCHEME");
    }
    static host(text) {
        return new URLToken(text, "HOST");
    }
    static port(text) {
        return new URLToken(text, "PORT");
    }
    static path(text) {
        return new URLToken(text, "PATH");
    }
    static query(text) {
        return new URLToken(text, "QUERY");
    }
}
/**
 * Get whether or not the provided character (single character string) is an alphanumeric (letter or
 * digit) character.
 */
export function isAlphaNumericCharacter(character) {
    const characterCode = character.charCodeAt(0);
    return ((48 /* '0' */ <= characterCode && characterCode <= 57) /* '9' */ ||
        (65 /* 'A' */ <= characterCode && characterCode <= 90) /* 'Z' */ ||
        (97 /* 'a' */ <= characterCode && characterCode <= 122) /* 'z' */);
}
/**
 * A class that tokenizes URL strings.
 */
export class URLTokenizer {
    constructor(_text, state) {
        this._text = _text;
        this._textLength = _text ? _text.length : 0;
        this._currentState = state !== undefined && state !== null ? state : "SCHEME_OR_HOST";
        this._currentIndex = 0;
    }
    /**
     * Get the current URLToken this URLTokenizer is pointing at, or undefined if the URLTokenizer
     * hasn't started or has finished tokenizing.
     */
    current() {
        return this._currentToken;
    }
    /**
     * Advance to the next URLToken and return whether or not a URLToken was found.
     */
    next() {
        if (!hasCurrentCharacter(this)) {
            this._currentToken = undefined;
        }
        else {
            switch (this._currentState) {
                case "SCHEME":
                    nextScheme(this);
                    break;
                case "SCHEME_OR_HOST":
                    nextSchemeOrHost(this);
                    break;
                case "HOST":
                    nextHost(this);
                    break;
                case "PORT":
                    nextPort(this);
                    break;
                case "PATH":
                    nextPath(this);
                    break;
                case "QUERY":
                    nextQuery(this);
                    break;
                default:
                    throw new Error(`Unrecognized URLTokenizerState: ${this._currentState}`);
            }
        }
        return !!this._currentToken;
    }
}
/**
 * Read the remaining characters from this Tokenizer's character stream.
 */
function readRemaining(tokenizer) {
    let result = "";
    if (tokenizer._currentIndex < tokenizer._textLength) {
        result = tokenizer._text.substring(tokenizer._currentIndex);
        tokenizer._currentIndex = tokenizer._textLength;
    }
    return result;
}
/**
 * Whether or not this URLTokenizer has a current character.
 */
function hasCurrentCharacter(tokenizer) {
    return tokenizer._currentIndex < tokenizer._textLength;
}
/**
 * Get the character in the text string at the current index.
 */
function getCurrentCharacter(tokenizer) {
    return tokenizer._text[tokenizer._currentIndex];
}
/**
 * Advance to the character in text that is "step" characters ahead. If no step value is provided,
 * then step will default to 1.
 */
function nextCharacter(tokenizer, step) {
    if (hasCurrentCharacter(tokenizer)) {
        if (!step) {
            step = 1;
        }
        tokenizer._currentIndex += step;
    }
}
/**
 * Starting with the current character, peek "charactersToPeek" number of characters ahead in this
 * Tokenizer's stream of characters.
 */
function peekCharacters(tokenizer, charactersToPeek) {
    let endIndex = tokenizer._currentIndex + charactersToPeek;
    if (tokenizer._textLength < endIndex) {
        endIndex = tokenizer._textLength;
    }
    return tokenizer._text.substring(tokenizer._currentIndex, endIndex);
}
/**
 * Read characters from this Tokenizer until the end of the stream or until the provided condition
 * is false when provided the current character.
 */
function readWhile(tokenizer, condition) {
    let result = "";
    while (hasCurrentCharacter(tokenizer)) {
        const currentCharacter = getCurrentCharacter(tokenizer);
        if (!condition(currentCharacter)) {
            break;
        }
        else {
            result += currentCharacter;
            nextCharacter(tokenizer);
        }
    }
    return result;
}
/**
 * Read characters from this Tokenizer until a non-alphanumeric character or the end of the
 * character stream is reached.
 */
function readWhileLetterOrDigit(tokenizer) {
    return readWhile(tokenizer, (character) => isAlphaNumericCharacter(character));
}
/**
 * Read characters from this Tokenizer until one of the provided terminating characters is read or
 * the end of the character stream is reached.
 */
function readUntilCharacter(tokenizer, ...terminatingCharacters) {
    return readWhile(tokenizer, (character) => terminatingCharacters.indexOf(character) === -1);
}
function nextScheme(tokenizer) {
    const scheme = readWhileLetterOrDigit(tokenizer);
    tokenizer._currentToken = URLToken.scheme(scheme);
    if (!hasCurrentCharacter(tokenizer)) {
        tokenizer._currentState = "DONE";
    }
    else {
        tokenizer._currentState = "HOST";
    }
}
function nextSchemeOrHost(tokenizer) {
    const schemeOrHost = readUntilCharacter(tokenizer, ":", "/", "?");
    if (!hasCurrentCharacter(tokenizer)) {
        tokenizer._currentToken = URLToken.host(schemeOrHost);
        tokenizer._currentState = "DONE";
    }
    else if (getCurrentCharacter(tokenizer) === ":") {
        if (peekCharacters(tokenizer, 3) === "://") {
            tokenizer._currentToken = URLToken.scheme(schemeOrHost);
            tokenizer._currentState = "HOST";
        }
        else {
            tokenizer._currentToken = URLToken.host(schemeOrHost);
            tokenizer._currentState = "PORT";
        }
    }
    else {
        tokenizer._currentToken = URLToken.host(schemeOrHost);
        if (getCurrentCharacter(tokenizer) === "/") {
            tokenizer._currentState = "PATH";
        }
        else {
            tokenizer._currentState = "QUERY";
        }
    }
}
function nextHost(tokenizer) {
    if (peekCharacters(tokenizer, 3) === "://") {
        nextCharacter(tokenizer, 3);
    }
    const host = readUntilCharacter(tokenizer, ":", "/", "?");
    tokenizer._currentToken = URLToken.host(host);
    if (!hasCurrentCharacter(tokenizer)) {
        tokenizer._currentState = "DONE";
    }
    else if (getCurrentCharacter(tokenizer) === ":") {
        tokenizer._currentState = "PORT";
    }
    else if (getCurrentCharacter(tokenizer) === "/") {
        tokenizer._currentState = "PATH";
    }
    else {
        tokenizer._currentState = "QUERY";
    }
}
function nextPort(tokenizer) {
    if (getCurrentCharacter(tokenizer) === ":") {
        nextCharacter(tokenizer);
    }
    const port = readUntilCharacter(tokenizer, "/", "?");
    tokenizer._currentToken = URLToken.port(port);
    if (!hasCurrentCharacter(tokenizer)) {
        tokenizer._currentState = "DONE";
    }
    else if (getCurrentCharacter(tokenizer) === "/") {
        tokenizer._currentState = "PATH";
    }
    else {
        tokenizer._currentState = "QUERY";
    }
}
function nextPath(tokenizer) {
    const path = readUntilCharacter(tokenizer, "?");
    tokenizer._currentToken = URLToken.path(path);
    if (!hasCurrentCharacter(tokenizer)) {
        tokenizer._currentState = "DONE";
    }
    else {
        tokenizer._currentState = "QUERY";
    }
}
function nextQuery(tokenizer) {
    if (getCurrentCharacter(tokenizer) === "?") {
        nextCharacter(tokenizer);
    }
    const query = readRemaining(tokenizer);
    tokenizer._currentToken = URLToken.query(query);
    tokenizer._currentState = "DONE";
}
//# sourceMappingURL=url.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { HttpHeaders, isHttpHeadersLike } from "./httpHeaders";
import { Serializer } from "./serializer";
import { generateUuid } from "./util/utils";
export function isWebResourceLike(object) {
    if (object && typeof object === "object") {
        const castObject = object;
        if (typeof castObject.url === "string" &&
            typeof castObject.method === "string" &&
            typeof castObject.headers === "object" &&
            isHttpHeadersLike(castObject.headers) &&
            typeof castObject.validateRequestProperties === "function" &&
            typeof castObject.prepare === "function" &&
            typeof castObject.clone === "function") {
            return true;
        }
    }
    return false;
}
/**
 * Creates a new WebResource object.
 *
 * This class provides an abstraction over a REST call by being library / implementation agnostic and wrapping the necessary
 * properties to initiate a request.
 */
export class WebResource {
    constructor(url, method, body, query, headers, streamResponseBody, withCredentials, abortSignal, timeout, onUploadProgress, onDownloadProgress, proxySettings, keepAlive, decompressResponse, streamResponseStatusCodes) {
        this.streamResponseBody = streamResponseBody;
        this.streamResponseStatusCodes = streamResponseStatusCodes;
        this.url = url || "";
        this.method = method || "GET";
        this.headers = isHttpHeadersLike(headers) ? headers : new HttpHeaders(headers);
        this.body = body;
        this.query = query;
        this.formData = undefined;
        this.withCredentials = withCredentials || false;
        this.abortSignal = abortSignal;
        this.timeout = timeout || 0;
        this.onUploadProgress = onUploadProgress;
        this.onDownloadProgress = onDownloadProgress;
        this.proxySettings = proxySettings;
        this.keepAlive = keepAlive;
        this.decompressResponse = decompressResponse;
        this.requestId = this.headers.get("x-ms-client-request-id") || generateUuid();
    }
    /**
     * Validates that the required properties such as method, url, headers["Content-Type"],
     * headers["accept-language"] are defined. It will throw an error if one of the above
     * mentioned properties are not defined.
     */
    validateRequestProperties() {
        if (!this.method) {
            throw new Error("WebResource.method is required.");
        }
        if (!this.url) {
            throw new Error("WebResource.url is required.");
        }
    }
    /**
     * Prepares the request.
     * @param options - Options to provide for preparing the request.
     * @returns Returns the prepared WebResource (HTTP Request) object that needs to be given to the request pipeline.
     */
    prepare(options) {
        if (!options) {
            throw new Error("options object is required");
        }
        if (options.method === undefined ||
            options.method === null ||
            typeof options.method.valueOf() !== "string") {
            throw new Error("options.method must be a string.");
        }
        if (options.url && options.pathTemplate) {
            throw new Error("options.url and options.pathTemplate are mutually exclusive. Please provide exactly one of them.");
        }
        if ((options.pathTemplate === undefined ||
            options.pathTemplate === null ||
            typeof options.pathTemplate.valueOf() !== "string") &&
            (options.url === undefined ||
                options.url === null ||
                typeof options.url.valueOf() !== "string")) {
            throw new Error("Please provide exactly one of options.pathTemplate or options.url.");
        }
        // set the url if it is provided.
        if (options.url) {
            if (typeof options.url !== "string") {
                throw new Error('options.url must be of type "string".');
            }
            this.url = options.url;
        }
        // set the method
        if (options.method) {
            const validMethods = ["GET", "PUT", "HEAD", "DELETE", "OPTIONS", "POST", "PATCH", "TRACE"];
            if (validMethods.indexOf(options.method.toUpperCase()) === -1) {
                throw new Error('The provided method "' +
                    options.method +
                    '" is invalid. Supported HTTP methods are: ' +
                    JSON.stringify(validMethods));
            }
        }
        this.method = options.method.toUpperCase();
        // construct the url if path template is provided
        if (options.pathTemplate) {
            const { pathTemplate, pathParameters } = options;
            if (typeof pathTemplate !== "string") {
                throw new Error('options.pathTemplate must be of type "string".');
            }
            if (!options.baseUrl) {
                options.baseUrl = "https://management.azure.com";
            }
            const baseUrl = options.baseUrl;
            let url = baseUrl +
                (baseUrl.endsWith("/") ? "" : "/") +
                (pathTemplate.startsWith("/") ? pathTemplate.slice(1) : pathTemplate);
            const segments = url.match(/({[\w-]*\s*[\w-]*})/gi);
            if (segments && segments.length) {
                if (!pathParameters) {
                    throw new Error(`pathTemplate: ${pathTemplate} has been provided. Hence, options.pathParameters must also be provided.`);
                }
                segments.forEach(function (item) {
                    const pathParamName = item.slice(1, -1);
                    const pathParam = pathParameters[pathParamName];
                    if (pathParam === null ||
                        pathParam === undefined ||
                        !(typeof pathParam === "string" || typeof pathParam === "object")) {
                        const stringifiedPathParameters = JSON.stringify(pathParameters, undefined, 2);
                        throw new Error(`pathTemplate: ${pathTemplate} contains the path parameter ${pathParamName}` +
                            ` however, it is not present in parameters: ${stringifiedPathParameters}.` +
                            `The value of the path parameter can either be a "string" of the form { ${pathParamName}: "some sample value" } or ` +
                            `it can be an "object" of the form { "${pathParamName}": { value: "some sample value", skipUrlEncoding: true } }.`);
                    }
                    if (typeof pathParam.valueOf() === "string") {
                        url = url.replace(item, encodeURIComponent(pathParam));
                    }
                    if (typeof pathParam.valueOf() === "object") {
                        if (!pathParam.value) {
                            throw new Error(`options.pathParameters[${pathParamName}] is of type "object" but it does not contain a "value" property.`);
                        }
                        if (pathParam.skipUrlEncoding) {
                            url = url.replace(item, pathParam.value);
                        }
                        else {
                            url = url.replace(item, encodeURIComponent(pathParam.value));
                        }
                    }
                });
            }
            this.url = url;
        }
        // append query parameters to the url if they are provided. They can be provided with pathTemplate or url option.
        if (options.queryParameters) {
            const queryParameters = options.queryParameters;
            if (typeof queryParameters !== "object") {
                throw new Error(`options.queryParameters must be of type object. It should be a JSON object ` +
                    `of "query-parameter-name" as the key and the "query-parameter-value" as the value. ` +
                    `The "query-parameter-value" may be fo type "string" or an "object" of the form { value: "query-parameter-value", skipUrlEncoding: true }.`);
            }
            // append question mark if it is not present in the url
            if (this.url && this.url.indexOf("?") === -1) {
                this.url += "?";
            }
            // construct queryString
            const queryParams = [];
            // We need to populate this.query as a dictionary if the request is being used for Sway's validateRequest().
            this.query = {};
            for (const queryParamName in queryParameters) {
                const queryParam = queryParameters[queryParamName];
                if (queryParam) {
                    if (typeof queryParam === "string") {
                        queryParams.push(queryParamName + "=" + encodeURIComponent(queryParam));
                        this.query[queryParamName] = encodeURIComponent(queryParam);
                    }
                    else if (typeof queryParam === "object") {
                        if (!queryParam.value) {
                            throw new Error(`options.queryParameters[${queryParamName}] is of type "object" but it does not contain a "value" property.`);
                        }
                        if (queryParam.skipUrlEncoding) {
                            queryParams.push(queryParamName + "=" + queryParam.value);
                            this.query[queryParamName] = queryParam.value;
                        }
                        else {
                            queryParams.push(queryParamName + "=" + encodeURIComponent(queryParam.value));
                            this.query[queryParamName] = encodeURIComponent(queryParam.value);
                        }
                    }
                }
            } // end-of-for
            // append the queryString
            this.url += queryParams.join("&");
        }
        // add headers to the request if they are provided
        if (options.headers) {
            const headers = options.headers;
            for (const headerName of Object.keys(options.headers)) {
                this.headers.set(headerName, headers[headerName]);
            }
        }
        // ensure accept-language is set correctly
        if (!this.headers.get("accept-language")) {
            this.headers.set("accept-language", "en-US");
        }
        // ensure the request-id is set correctly
        if (!this.headers.get("x-ms-client-request-id") && !options.disableClientRequestId) {
            this.headers.set("x-ms-client-request-id", this.requestId);
        }
        // default
        if (!this.headers.get("Content-Type")) {
            this.headers.set("Content-Type", "application/json; charset=utf-8");
        }
        // set the request body. request.js automatically sets the Content-Length request header, so we need not set it explicitly
        this.body = options.body;
        if (options.body !== undefined && options.body !== null) {
            // body as a stream special case. set the body as-is and check for some special request headers specific to sending a stream.
            if (options.bodyIsStream) {
                if (!this.headers.get("Transfer-Encoding")) {
                    this.headers.set("Transfer-Encoding", "chunked");
                }
                if (this.headers.get("Content-Type") !== "application/octet-stream") {
                    this.headers.set("Content-Type", "application/octet-stream");
                }
            }
            else {
                if (options.serializationMapper) {
                    this.body = new Serializer(options.mappers).serialize(options.serializationMapper, options.body, "requestBody");
                }
                if (!options.disableJsonStringifyOnBody) {
                    this.body = JSON.stringify(options.body);
                }
            }
        }
        if (options.spanOptions) {
            this.spanOptions = options.spanOptions;
        }
        if (options.tracingContext) {
            this.tracingContext = options.tracingContext;
        }
        this.abortSignal = options.abortSignal;
        this.onDownloadProgress = options.onDownloadProgress;
        this.onUploadProgress = options.onUploadProgress;
        return this;
    }
    /**
     * Clone this WebResource HTTP request object.
     * @returns The clone of this WebResource HTTP request object.
     */
    clone() {
        const result = new WebResource(this.url, this.method, this.body, this.query, this.headers && this.headers.clone(), this.streamResponseBody, this.withCredentials, this.abortSignal, this.timeout, this.onUploadProgress, this.onDownloadProgress, this.proxySettings, this.keepAlive, this.decompressResponse, this.streamResponseStatusCodes);
        if (this.formData) {
            result.formData = this.formData;
        }
        if (this.operationSpec) {
            result.operationSpec = this.operationSpec;
        }
        if (this.shouldDeserialize) {
            result.shouldDeserialize = this.shouldDeserialize;
        }
        if (this.operationResponseGetter) {
            result.operationResponseGetter = this.operationResponseGetter;
        }
        return result;
    }
}
//# sourceMappingURL=webResource.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { HttpHeaders } from "./httpHeaders";
import { AbortError } from "@azure/abort-controller";
import { RestError } from "./restError";
/**
 * A HttpClient implementation that uses XMLHttpRequest to send HTTP requests.
 */
export class XhrHttpClient {
    sendRequest(request) {
        var _a;
        const xhr = new XMLHttpRequest();
        if (request.proxySettings) {
            throw new Error("HTTP proxy is not supported in browser environment");
        }
        const abortSignal = request.abortSignal;
        if (abortSignal) {
            if (abortSignal.aborted) {
                return Promise.reject(new AbortError("The operation was aborted."));
            }
            const listener = () => {
                xhr.abort();
            };
            abortSignal.addEventListener("abort", listener);
            xhr.addEventListener("readystatechange", () => {
                if (xhr.readyState === XMLHttpRequest.DONE) {
                    abortSignal.removeEventListener("abort", listener);
                }
            });
        }
        addProgressListener(xhr.upload, request.onUploadProgress);
        addProgressListener(xhr, request.onDownloadProgress);
        if (request.formData) {
            const formData = request.formData;
            const requestForm = new FormData();
            const appendFormValue = (key, value) => {
                if (value &&
                    Object.prototype.hasOwnProperty.call(value, "value") &&
                    Object.prototype.hasOwnProperty.call(value, "options")) {
                    requestForm.append(key, value.value, value.options);
                }
                else {
                    requestForm.append(key, value);
                }
            };
            for (const formKey of Object.keys(formData)) {
                const formValue = formData[formKey];
                if (Array.isArray(formValue)) {
                    for (let j = 0; j < formValue.length; j++) {
                        appendFormValue(formKey, formValue[j]);
                    }
                }
                else {
                    appendFormValue(formKey, formValue);
                }
            }
            request.body = requestForm;
            request.formData = undefined;
            const contentType = request.headers.get("Content-Type");
            if (contentType && contentType.indexOf("multipart/form-data") !== -1) {
                // browser will automatically apply a suitable content-type header
                request.headers.remove("Content-Type");
            }
        }
        xhr.open(request.method, request.url);
        xhr.timeout = request.timeout;
        xhr.withCredentials = request.withCredentials;
        for (const header of request.headers.headersArray()) {
            xhr.setRequestHeader(header.name, header.value);
        }
        xhr.responseType =
            ((_a = request.streamResponseStatusCodes) === null || _a === void 0 ? void 0 : _a.size) || request.streamResponseBody ? "blob" : "text";
        // tslint:disable-next-line:no-null-keyword
        xhr.send(request.body === undefined ? null : request.body);
        if (xhr.responseType === "blob") {
            return new Promise((resolve, reject) => {
                handleBlobResponse(xhr, request, resolve, reject);
                rejectOnTerminalEvent(request, xhr, reject);
            });
        }
        else {
            return new Promise(function (resolve, reject) {
                xhr.addEventListener("load", () => resolve({
                    request,
                    status: xhr.status,
                    headers: parseHeaders(xhr),
                    bodyAsText: xhr.responseText,
                }));
                rejectOnTerminalEvent(request, xhr, reject);
            });
        }
    }
}
function handleBlobResponse(xhr, request, res, rej) {
    xhr.addEventListener("readystatechange", () => {
        var _a;
        // Resolve as soon as headers are loaded
        if (xhr.readyState === XMLHttpRequest.HEADERS_RECEIVED) {
            if (request.streamResponseBody || ((_a = request.streamResponseStatusCodes) === null || _a === void 0 ? void 0 : _a.has(xhr.status))) {
                const blobBody = new Promise((resolve, reject) => {
                    xhr.addEventListener("load", () => {
                        resolve(xhr.response);
                    });
                    rejectOnTerminalEvent(request, xhr, reject);
                });
                res({
                    request,
                    status: xhr.status,
                    headers: parseHeaders(xhr),
                    blobBody,
                });
            }
            else {
                xhr.addEventListener("load", () => {
                    // xhr.response is of Blob type if the request is sent with xhr.responseType === "blob"
                    // but the status code is not one of the stream response status codes,
                    // so treat it as text and convert from Blob to text
                    if (xhr.response) {
                        // Blob.text() is not supported in IE so using FileReader instead
                        const reader = new FileReader();
                        reader.onload = function (e) {
                            var _a;
                            const text = (_a = e.target) === null || _a === void 0 ? void 0 : _a.result;
                            res({
                                request,
                                status: xhr.status,
                                headers: parseHeaders(xhr),
                                bodyAsText: text,
                            });
                        };
                        reader.onerror = function (_e) {
                            rej(reader.error);
                        };
                        reader.readAsText(xhr.response, "UTF-8");
                    }
                    else {
                        res({
                            request,
                            status: xhr.status,
                            headers: parseHeaders(xhr),
                        });
                    }
                });
            }
        }
    });
}
function addProgressListener(xhr, listener) {
    if (listener) {
        xhr.addEventListener("progress", (rawEvent) => listener({
            loadedBytes: rawEvent.loaded,
        }));
    }
}
// exported locally for testing
export function parseHeaders(xhr) {
    const responseHeaders = new HttpHeaders();
    const headerLines = xhr
        .getAllResponseHeaders()
        .trim()
        .split(/[\r\n]+/);
    for (const line of headerLines) {
        const index = line.indexOf(":");
        const headerName = line.slice(0, index);
        const headerValue = line.slice(index + 2);
        responseHeaders.set(headerName, headerValue);
    }
    return responseHeaders;
}
function rejectOnTerminalEvent(request, xhr, reject) {
    xhr.addEventListener("error", () => reject(new RestError(`Failed to send request to ${request.url}`, RestError.REQUEST_SEND_ERROR, undefined, request)));
    const abortError = new AbortError("The operation was aborted.");
    xhr.addEventListener("abort", () => reject(abortError));
    xhr.addEventListener("timeout", () => reject(abortError));
}
//# sourceMappingURL=xhrHttpClient.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Encodes a string in base64 format.
 * @param value - The string to encode
 */
export function encodeString(value) {
    return btoa(value);
}
/**
 * Encodes a byte array in base64 format.
 * @param value - The Uint8Aray to encode
 */
export function encodeByteArray(value) {
    let str = "";
    for (let i = 0; i < value.length; i++) {
        str += String.fromCharCode(value[i]);
    }
    return btoa(str);
}
/**
 * Decodes a base64 string into a byte array.
 * @param value - The base64 string to decode
 */
export function decodeString(value) {
    const byteString = atob(value);
    const arr = new Uint8Array(byteString.length);
    for (let i = 0; i < byteString.length; i++) {
        arr[i] = byteString.charCodeAt(i);
    }
    return arr;
}
//# sourceMappingURL=base64.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Encodes a string in base64 format.
 * @param value - The string to encode
 */
export function encodeString(value) {
    return Buffer.from(value).toString("base64");
}
/**
 * Encodes a byte array in base64 format.
 * @param value - The Uint8Aray to encode
 */
export function encodeByteArray(value) {
    // Buffer.from accepts <ArrayBuffer> | <SharedArrayBuffer>-- the TypeScript definition is off here
    // https://nodejs.org/api/buffer.html#buffer_class_method_buffer_from_arraybuffer_byteoffset_length
    const bufferValue = value instanceof Buffer ? value : Buffer.from(value.buffer);
    return bufferValue.toString("base64");
}
/**
 * Decodes a base64 string into a byte array.
 * @param value - The base64 string to decode
 */
export function decodeString(value) {
    return Buffer.from(value, "base64");
}
//# sourceMappingURL=base64.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * A set of constants used internally when processing requests.
 */
export const Constants = {
    /**
     * The core-http version
     */
    coreHttpVersion: "2.2.5",
    /**
     * Specifies HTTP.
     */
    HTTP: "http:",
    /**
     * Specifies HTTPS.
     */
    HTTPS: "https:",
    /**
     * Specifies HTTP Proxy.
     */
    HTTP_PROXY: "HTTP_PROXY",
    /**
     * Specifies HTTPS Proxy.
     */
    HTTPS_PROXY: "HTTPS_PROXY",
    /**
     * Specifies NO Proxy.
     */
    NO_PROXY: "NO_PROXY",
    /**
     * Specifies ALL Proxy.
     */
    ALL_PROXY: "ALL_PROXY",
    HttpConstants: {
        /**
         * Http Verbs
         */
        HttpVerbs: {
            PUT: "PUT",
            GET: "GET",
            DELETE: "DELETE",
            POST: "POST",
            MERGE: "MERGE",
            HEAD: "HEAD",
            PATCH: "PATCH",
        },
        StatusCodes: {
            TooManyRequests: 429,
            ServiceUnavailable: 503,
        },
    },
    /**
     * Defines constants for use with HTTP headers.
     */
    HeaderConstants: {
        /**
         * The Authorization header.
         */
        AUTHORIZATION: "authorization",
        AUTHORIZATION_SCHEME: "Bearer",
        /**
         * The Retry-After response-header field can be used with a 503 (Service
         * Unavailable) or 349 (Too Many Requests) responses to indicate how long
         * the service is expected to be unavailable to the requesting client.
         */
        RETRY_AFTER: "Retry-After",
        /**
         * The UserAgent header.
         */
        USER_AGENT: "User-Agent",
    },
};
//# sourceMappingURL=constants.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { AbortError } from "@azure/abort-controller";
import { isDefined } from "./typeguards";
const StandardAbortMessage = "The operation was aborted.";
/**
 * A wrapper for setTimeout that resolves a promise after delayInMs milliseconds.
 * @param delayInMs - The number of milliseconds to be delayed.
 * @param value - The value to be resolved with after a timeout of t milliseconds.
 * @param options - The options for delay - currently abort options
 *   @param abortSignal - The abortSignal associated with containing operation.
 *   @param abortErrorMsg - The abort error message associated with containing operation.
 * @returns - Resolved promise
 */
export function delay(delayInMs, value, options) {
    return new Promise((resolve, reject) => {
        let timer = undefined;
        let onAborted = undefined;
        const rejectOnAbort = () => {
            return reject(new AbortError((options === null || options === void 0 ? void 0 : options.abortErrorMsg) ? options === null || options === void 0 ? void 0 : options.abortErrorMsg : StandardAbortMessage));
        };
        const removeListeners = () => {
            if ((options === null || options === void 0 ? void 0 : options.abortSignal) && onAborted) {
                options.abortSignal.removeEventListener("abort", onAborted);
            }
        };
        onAborted = () => {
            if (isDefined(timer)) {
                clearTimeout(timer);
            }
            removeListeners();
            return rejectOnAbort();
        };
        if ((options === null || options === void 0 ? void 0 : options.abortSignal) && options.abortSignal.aborted) {
            return rejectOnAbort();
        }
        timer = setTimeout(() => {
            removeListeners();
            resolve(value);
        }, delayInMs);
        if (options === null || options === void 0 ? void 0 : options.abortSignal) {
            options.abortSignal.addEventListener("abort", onAborted);
        }
    });
}
//# sourceMappingURL=delay.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export const DEFAULT_CLIENT_RETRY_COUNT = 3;
// intervals are in ms
export const DEFAULT_CLIENT_RETRY_INTERVAL = 1000 * 30;
export const DEFAULT_CLIENT_MAX_RETRY_INTERVAL = 1000 * 90;
export const DEFAULT_CLIENT_MIN_RETRY_INTERVAL = 1000 * 3;
export function isNumber(n) {
    return typeof n === "number";
}
/**
 * @internal
 * Determines if the operation should be retried.
 *
 * @param retryLimit - Specifies the max number of retries.
 * @param predicate - Initial chekck on whether to retry based on given responses or errors
 * @param retryData -  The retry data.
 * @returns True if the operation qualifies for a retry; false otherwise.
 */
export function shouldRetry(retryLimit, predicate, retryData, response, error) {
    if (!predicate(response, error)) {
        return false;
    }
    return retryData.retryCount < retryLimit;
}
/**
 * @internal
 * Updates the retry data for the next attempt.
 *
 * @param retryOptions - specifies retry interval, and its lower bound and upper bound.
 * @param retryData -  The retry data.
 * @param err - The operation"s error, if any.
 */
export function updateRetryData(retryOptions, retryData = { retryCount: 0, retryInterval: 0 }, err) {
    if (err) {
        if (retryData.error) {
            err.innerError = retryData.error;
        }
        retryData.error = err;
    }
    // Adjust retry count
    retryData.retryCount++;
    // Adjust retry interval
    let incrementDelta = Math.pow(2, retryData.retryCount - 1) - 1;
    const boundedRandDelta = retryOptions.retryInterval * 0.8 +
        Math.floor(Math.random() * (retryOptions.retryInterval * 0.4));
    incrementDelta *= boundedRandDelta;
    retryData.retryInterval = Math.min(retryOptions.minRetryInterval + incrementDelta, retryOptions.maxRetryInterval);
    return retryData;
}
//# sourceMappingURL=exponentialBackoffStrategy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export const custom = {};
//# sourceMappingURL=inspect.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { inspect } from "util";
export const custom = inspect.custom;
//# sourceMappingURL=inspect.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { URLBuilder, URLQuery } from "../url";
import { isObject } from "./utils";
const RedactedString = "REDACTED";
const defaultAllowedHeaderNames = [
    "x-ms-client-request-id",
    "x-ms-return-client-request-id",
    "x-ms-useragent",
    "x-ms-correlation-request-id",
    "x-ms-request-id",
    "client-request-id",
    "ms-cv",
    "return-client-request-id",
    "traceparent",
    "Access-Control-Allow-Credentials",
    "Access-Control-Allow-Headers",
    "Access-Control-Allow-Methods",
    "Access-Control-Allow-Origin",
    "Access-Control-Expose-Headers",
    "Access-Control-Max-Age",
    "Access-Control-Request-Headers",
    "Access-Control-Request-Method",
    "Origin",
    "Accept",
    "Accept-Encoding",
    "Cache-Control",
    "Connection",
    "Content-Length",
    "Content-Type",
    "Date",
    "ETag",
    "Expires",
    "If-Match",
    "If-Modified-Since",
    "If-None-Match",
    "If-Unmodified-Since",
    "Last-Modified",
    "Pragma",
    "Request-Id",
    "Retry-After",
    "Server",
    "Transfer-Encoding",
    "User-Agent",
    "WWW-Authenticate",
];
const defaultAllowedQueryParameters = ["api-version"];
export class Sanitizer {
    constructor({ allowedHeaderNames = [], allowedQueryParameters = [] } = {}) {
        allowedHeaderNames = Array.isArray(allowedHeaderNames)
            ? defaultAllowedHeaderNames.concat(allowedHeaderNames)
            : defaultAllowedHeaderNames;
        allowedQueryParameters = Array.isArray(allowedQueryParameters)
            ? defaultAllowedQueryParameters.concat(allowedQueryParameters)
            : defaultAllowedQueryParameters;
        this.allowedHeaderNames = new Set(allowedHeaderNames.map((n) => n.toLowerCase()));
        this.allowedQueryParameters = new Set(allowedQueryParameters.map((p) => p.toLowerCase()));
    }
    sanitize(obj) {
        const seen = new Set();
        return JSON.stringify(obj, (key, value) => {
            // Ensure Errors include their interesting non-enumerable members
            if (value instanceof Error) {
                return Object.assign(Object.assign({}, value), { name: value.name, message: value.message });
            }
            if (key === "_headersMap") {
                return this.sanitizeHeaders(value);
            }
            else if (key === "url") {
                return this.sanitizeUrl(value);
            }
            else if (key === "query") {
                return this.sanitizeQuery(value);
            }
            else if (key === "body") {
                // Don't log the request body
                return undefined;
            }
            else if (key === "response") {
                // Don't log response again
                return undefined;
            }
            else if (key === "operationSpec") {
                // When using sendOperationRequest, the request carries a massive
                // field with the autorest spec. No need to log it.
                return undefined;
            }
            else if (Array.isArray(value) || isObject(value)) {
                if (seen.has(value)) {
                    return "[Circular]";
                }
                seen.add(value);
            }
            return value;
        }, 2);
    }
    sanitizeHeaders(value) {
        return this.sanitizeObject(value, this.allowedHeaderNames, (v, k) => v[k].value);
    }
    sanitizeQuery(value) {
        return this.sanitizeObject(value, this.allowedQueryParameters, (v, k) => v[k]);
    }
    sanitizeObject(value, allowedKeys, accessor) {
        if (typeof value !== "object" || value === null) {
            return value;
        }
        const sanitized = {};
        for (const k of Object.keys(value)) {
            if (allowedKeys.has(k.toLowerCase())) {
                sanitized[k] = accessor(value, k);
            }
            else {
                sanitized[k] = RedactedString;
            }
        }
        return sanitized;
    }
    sanitizeUrl(value) {
        if (typeof value !== "string" || value === null) {
            return value;
        }
        const urlBuilder = URLBuilder.parse(value);
        const queryString = urlBuilder.getQuery();
        if (!queryString) {
            return value;
        }
        const query = URLQuery.parse(queryString);
        for (const k of query.keys()) {
            if (!this.allowedQueryParameters.has(k.toLowerCase())) {
                query.set(k, RedactedString);
            }
        }
        urlBuilder.setQuery(query.toString());
        return urlBuilder.toString();
    }
}
//# sourceMappingURL=sanitizer.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Default key used to access the XML attributes.
 */
export const XML_ATTRKEY = "$";
/**
 * Default key used to access the XML value content.
 */
export const XML_CHARKEY = "_";
//# sourceMappingURL=serializer.common.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Maximum number of retries for the throttling retry policy
 */
export const DEFAULT_CLIENT_MAX_RETRY_COUNT = 3;
//# sourceMappingURL=throttlingRetryStrategy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Helper TypeGuard that checks if the value is not null or undefined.
 * @param thing - Anything
 * @internal
 */
export function isDefined(thing) {
    return typeof thing !== "undefined" && thing !== null;
}
//# sourceMappingURL=typeguards.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { Constants } from "./constants";
import { XML_ATTRKEY } from "./serializer.common";
import { v4 as uuidv4 } from "uuid";
const validUuidRegex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/i;
/**
 * A constant that indicates whether the environment is node.js or browser based.
 */
export const isNode = typeof process !== "undefined" &&
    !!process.version &&
    !!process.versions &&
    !!process.versions.node;
/**
 * Checks if a parsed URL is HTTPS
 *
 * @param urlToCheck - The url to check
 * @returns True if the URL is HTTPS; false otherwise.
 */
export function urlIsHTTPS(urlToCheck) {
    return urlToCheck.protocol.toLowerCase() === Constants.HTTPS;
}
/**
 * Encodes an URI.
 *
 * @param uri - The URI to be encoded.
 * @returns The encoded URI.
 */
export function encodeUri(uri) {
    return encodeURIComponent(uri)
        .replace(/!/g, "%21")
        .replace(/"/g, "%27")
        .replace(/\(/g, "%28")
        .replace(/\)/g, "%29")
        .replace(/\*/g, "%2A");
}
/**
 * Returns a stripped version of the Http Response which only contains body,
 * headers and the status.
 *
 * @param response - The Http Response
 * @returns The stripped version of Http Response.
 */
export function stripResponse(response) {
    const strippedResponse = {};
    strippedResponse.body = response.bodyAsText;
    strippedResponse.headers = response.headers;
    strippedResponse.status = response.status;
    return strippedResponse;
}
/**
 * Returns a stripped version of the Http Request that does not contain the
 * Authorization header.
 *
 * @param request - The Http Request object
 * @returns The stripped version of Http Request.
 */
export function stripRequest(request) {
    const strippedRequest = request.clone();
    if (strippedRequest.headers) {
        strippedRequest.headers.remove("authorization");
    }
    return strippedRequest;
}
/**
 * Validates the given uuid as a string
 *
 * @param uuid - The uuid as a string that needs to be validated
 * @returns True if the uuid is valid; false otherwise.
 */
export function isValidUuid(uuid) {
    return validUuidRegex.test(uuid);
}
/**
 * Generated UUID
 *
 * @returns RFC4122 v4 UUID.
 */
export function generateUuid() {
    return uuidv4();
}
/**
 * Executes an array of promises sequentially. Inspiration of this method is here:
 * https://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html. An awesome blog on promises!
 *
 * @param promiseFactories - An array of promise factories(A function that return a promise)
 * @param kickstart - Input to the first promise that is used to kickstart the promise chain.
 * If not provided then the promise chain starts with undefined.
 * @returns A chain of resolved or rejected promises
 */
export function executePromisesSequentially(promiseFactories, kickstart) {
    let result = Promise.resolve(kickstart);
    promiseFactories.forEach((promiseFactory) => {
        result = result.then(promiseFactory);
    });
    return result;
}
/**
 * Converts a Promise to a callback.
 * @param promise - The Promise to be converted to a callback
 * @returns A function that takes the callback `(cb: Function) => void`
 * @deprecated generated code should instead depend on responseToBody
 */
// eslint-disable-next-line @typescript-eslint/ban-types
export function promiseToCallback(promise) {
    if (typeof promise.then !== "function") {
        throw new Error("The provided input is not a Promise.");
    }
    // eslint-disable-next-line @typescript-eslint/ban-types
    return (cb) => {
        promise
            .then((data) => {
            // eslint-disable-next-line promise/no-callback-in-promise
            return cb(undefined, data);
        })
            .catch((err) => {
            // eslint-disable-next-line promise/no-callback-in-promise
            cb(err);
        });
    };
}
/**
 * Converts a Promise to a service callback.
 * @param promise - The Promise of HttpOperationResponse to be converted to a service callback
 * @returns A function that takes the service callback (cb: ServiceCallback<T>): void
 */
export function promiseToServiceCallback(promise) {
    if (typeof promise.then !== "function") {
        throw new Error("The provided input is not a Promise.");
    }
    return (cb) => {
        promise
            .then((data) => {
            return process.nextTick(cb, undefined, data.parsedBody, data.request, data);
        })
            .catch((err) => {
            process.nextTick(cb, err);
        });
    };
}
export function prepareXMLRootList(obj, elementName, xmlNamespaceKey, xmlNamespace) {
    if (!Array.isArray(obj)) {
        obj = [obj];
    }
    if (!xmlNamespaceKey || !xmlNamespace) {
        return { [elementName]: obj };
    }
    const result = { [elementName]: obj };
    result[XML_ATTRKEY] = { [xmlNamespaceKey]: xmlNamespace };
    return result;
}
/**
 * Applies the properties on the prototype of sourceCtors to the prototype of targetCtor
 * @param targetCtor - The target object on which the properties need to be applied.
 * @param sourceCtors - An array of source objects from which the properties need to be taken.
 */
export function applyMixins(targetCtorParam, sourceCtors) {
    const castTargetCtorParam = targetCtorParam;
    sourceCtors.forEach((sourceCtor) => {
        Object.getOwnPropertyNames(sourceCtor.prototype).forEach((name) => {
            castTargetCtorParam.prototype[name] = sourceCtor.prototype[name];
        });
    });
}
const validateISODuration = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;
/**
 * Indicates whether the given string is in ISO 8601 format.
 * @param value - The value to be validated for ISO 8601 duration format.
 * @returns `true` if valid, `false` otherwise.
 */
export function isDuration(value) {
    return validateISODuration.test(value);
}
/**
 * Replace all of the instances of searchValue in value with the provided replaceValue.
 * @param value - The value to search and replace in.
 * @param searchValue - The value to search for in the value argument.
 * @param replaceValue - The value to replace searchValue with in the value argument.
 * @returns The value where each instance of searchValue was replaced with replacedValue.
 */
export function replaceAll(value, searchValue, replaceValue) {
    return !value || !searchValue ? value : value.split(searchValue).join(replaceValue || "");
}
/**
 * Determines whether the given entity is a basic/primitive type
 * (string, number, boolean, null, undefined).
 * @param value - Any entity
 * @returns true is it is primitive type, false otherwise.
 */
export function isPrimitiveType(value) {
    return (typeof value !== "object" && typeof value !== "function") || value === null;
}
export function getEnvironmentValue(name) {
    if (process.env[name]) {
        return process.env[name];
    }
    else if (process.env[name.toLowerCase()]) {
        return process.env[name.toLowerCase()];
    }
    return undefined;
}
/**
 * @internal
 * @returns true when input is an object type that is not null, Array, RegExp, or Date.
 */
export function isObject(input) {
    return (typeof input === "object" &&
        input !== null &&
        !Array.isArray(input) &&
        !(input instanceof RegExp) &&
        !(input instanceof Date));
}
//# sourceMappingURL=utils.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { XML_ATTRKEY, XML_CHARKEY } from "./serializer.common";
if (!self.document || !self.DOMParser || !self.Node || !self.XMLSerializer) {
    throw new Error(`This library depends on the following DOM objects: ["document", "DOMParser", "Node", "XMLSerializer"] to parse XML, but some of these are undefined. You may provide a polyfill to make these globally available in order to support your environment. For more information, please refer to https://aka.ms/azsdk/js/web-workers. `);
}
let cachedDoc;
function getDoc() {
    if (!cachedDoc) {
        cachedDoc = document.implementation.createDocument(null, null, null);
    }
    return cachedDoc;
}
let cachedParser;
function getParser() {
    if (!cachedParser) {
        cachedParser = new DOMParser();
    }
    return cachedParser;
}
let cachedSerializer;
function getSerializer() {
    if (!cachedSerializer) {
        cachedSerializer = new XMLSerializer();
    }
    return cachedSerializer;
}
export function parseXML(str, opts = {}) {
    var _a, _b, _c;
    try {
        const updatedOptions = {
            rootName: (_a = opts.rootName) !== null && _a !== void 0 ? _a : "",
            includeRoot: (_b = opts.includeRoot) !== null && _b !== void 0 ? _b : false,
            xmlCharKey: (_c = opts.xmlCharKey) !== null && _c !== void 0 ? _c : XML_CHARKEY,
        };
        const dom = getParser().parseFromString(str, "application/xml");
        throwIfError(dom);
        let obj;
        if (updatedOptions.includeRoot) {
            obj = domToObject(dom, updatedOptions);
        }
        else {
            obj = domToObject(dom.childNodes[0], updatedOptions);
        }
        return Promise.resolve(obj);
    }
    catch (err) {
        return Promise.reject(err);
    }
}
let errorNS;
function getErrorNamespace() {
    var _a;
    if (errorNS === undefined) {
        try {
            errorNS =
                (_a = getParser().parseFromString("INVALID", "text/xml").getElementsByTagName("parsererror")[0]
                    .namespaceURI) !== null && _a !== void 0 ? _a : "";
        }
        catch (ignored) {
            // Most browsers will return a document containing <parsererror>, but IE will throw.
            errorNS = "";
        }
    }
    return errorNS;
}
function throwIfError(dom) {
    const parserErrors = dom.getElementsByTagName("parsererror");
    if (parserErrors.length > 0 && getErrorNamespace()) {
        for (let i = 0; i < parserErrors.length; i++) {
            if (parserErrors[i].namespaceURI === errorNS) {
                throw new Error(parserErrors[i].innerHTML);
            }
        }
    }
}
function isElement(node) {
    return !!node.attributes;
}
/**
 * Get the Element-typed version of the provided Node if the provided node is an element with
 * attributes. If it isn't, then undefined is returned.
 */
function asElementWithAttributes(node) {
    return isElement(node) && node.hasAttributes() ? node : undefined;
}
function domToObject(node, options) {
    let result = {};
    const childNodeCount = node.childNodes.length;
    const firstChildNode = node.childNodes[0];
    const onlyChildTextValue = (firstChildNode &&
        childNodeCount === 1 &&
        firstChildNode.nodeType === Node.TEXT_NODE &&
        firstChildNode.nodeValue) ||
        undefined;
    const elementWithAttributes = asElementWithAttributes(node);
    if (elementWithAttributes) {
        result[XML_ATTRKEY] = {};
        for (let i = 0; i < elementWithAttributes.attributes.length; i++) {
            const attr = elementWithAttributes.attributes[i];
            result[XML_ATTRKEY][attr.nodeName] = attr.nodeValue;
        }
        if (onlyChildTextValue) {
            result[options.xmlCharKey] = onlyChildTextValue;
        }
    }
    else if (childNodeCount === 0) {
        result = "";
    }
    else if (onlyChildTextValue) {
        result = onlyChildTextValue;
    }
    if (!onlyChildTextValue) {
        for (let i = 0; i < childNodeCount; i++) {
            const child = node.childNodes[i];
            // Ignore leading/trailing whitespace nodes
            if (child.nodeType !== Node.TEXT_NODE) {
                const childObject = domToObject(child, options);
                if (!result[child.nodeName]) {
                    result[child.nodeName] = childObject;
                }
                else if (Array.isArray(result[child.nodeName])) {
                    result[child.nodeName].push(childObject);
                }
                else {
                    result[child.nodeName] = [result[child.nodeName], childObject];
                }
            }
        }
    }
    return result;
}
export function stringifyXML(content, opts = {}) {
    var _a, _b, _c;
    const updatedOptions = {
        rootName: (_a = opts.rootName) !== null && _a !== void 0 ? _a : "root",
        includeRoot: (_b = opts.includeRoot) !== null && _b !== void 0 ? _b : false,
        xmlCharKey: (_c = opts.xmlCharKey) !== null && _c !== void 0 ? _c : XML_CHARKEY,
    };
    const dom = buildNode(content, updatedOptions.rootName, updatedOptions)[0];
    return ('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' +
        getSerializer().serializeToString(dom));
}
function buildAttributes(attrs) {
    const result = [];
    for (const key of Object.keys(attrs)) {
        const attr = getDoc().createAttribute(key);
        attr.value = attrs[key].toString();
        result.push(attr);
    }
    return result;
}
function buildNode(obj, elementName, options) {
    if (obj === undefined ||
        obj === null ||
        typeof obj === "string" ||
        typeof obj === "number" ||
        typeof obj === "boolean") {
        const elem = getDoc().createElement(elementName);
        elem.textContent = obj === undefined || obj === null ? "" : obj.toString();
        return [elem];
    }
    else if (Array.isArray(obj)) {
        const result = [];
        for (const arrayElem of obj) {
            for (const child of buildNode(arrayElem, elementName, options)) {
                result.push(child);
            }
        }
        return result;
    }
    else if (typeof obj === "object") {
        const elem = getDoc().createElement(elementName);
        for (const key of Object.keys(obj)) {
            if (key === XML_ATTRKEY) {
                for (const attr of buildAttributes(obj[key])) {
                    elem.attributes.setNamedItem(attr);
                }
            }
            else if (key === options.xmlCharKey) {
                elem.textContent = obj[key].toString();
            }
            else {
                for (const child of buildNode(obj[key], key, options)) {
                    elem.appendChild(child);
                }
            }
        }
        return [elem];
    }
    else {
        throw new Error(`Illegal value passed to buildObject: ${obj}`);
    }
}
//# sourceMappingURL=xml.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import * as xml2js from "xml2js";
import { XML_ATTRKEY, XML_CHARKEY } from "./serializer.common";
// Note: The reason we re-define all of the xml2js default settings (version 2.0) here is because the default settings object exposed
// by the xm2js library is mutable. See https://github.com/Leonidas-from-XIV/node-xml2js/issues/536
// By creating a new copy of the settings each time we instantiate the parser,
// we are safeguarding against the possibility of the default settings being mutated elsewhere unintentionally.
const xml2jsDefaultOptionsV2 = {
    explicitCharkey: false,
    trim: false,
    normalize: false,
    normalizeTags: false,
    attrkey: XML_ATTRKEY,
    explicitArray: true,
    ignoreAttrs: false,
    mergeAttrs: false,
    explicitRoot: true,
    validator: undefined,
    xmlns: false,
    explicitChildren: false,
    preserveChildrenOrder: false,
    childkey: "$$",
    charsAsChildren: false,
    includeWhiteChars: false,
    async: false,
    strict: true,
    attrNameProcessors: undefined,
    attrValueProcessors: undefined,
    tagNameProcessors: undefined,
    valueProcessors: undefined,
    rootName: "root",
    xmldec: {
        version: "1.0",
        encoding: "UTF-8",
        standalone: true,
    },
    doctype: undefined,
    renderOpts: {
        pretty: true,
        indent: "  ",
        newline: "\n",
    },
    headless: false,
    chunkSize: 10000,
    emptyTag: "",
    cdata: false,
};
// The xml2js settings for general XML parsing operations.
const xml2jsParserSettings = Object.assign({}, xml2jsDefaultOptionsV2);
xml2jsParserSettings.explicitArray = false;
// The xml2js settings for general XML building operations.
const xml2jsBuilderSettings = Object.assign({}, xml2jsDefaultOptionsV2);
xml2jsBuilderSettings.explicitArray = false;
xml2jsBuilderSettings.renderOpts = {
    pretty: false,
};
/**
 * Converts given JSON object to XML string
 * @param obj - JSON object to be converted into XML string
 * @param opts - Options that govern the parsing of given JSON object
 */
export function stringifyXML(obj, opts = {}) {
    var _a;
    xml2jsBuilderSettings.rootName = opts.rootName;
    xml2jsBuilderSettings.charkey = (_a = opts.xmlCharKey) !== null && _a !== void 0 ? _a : XML_CHARKEY;
    const builder = new xml2js.Builder(xml2jsBuilderSettings);
    return builder.buildObject(obj);
}
/**
 * Converts given XML string into JSON
 * @param str - String containing the XML content to be parsed into JSON
 * @param opts - Options that govern the parsing of given xml string
 */
export function parseXML(str, opts = {}) {
    var _a;
    xml2jsParserSettings.explicitRoot = !!opts.includeRoot;
    xml2jsParserSettings.charkey = (_a = opts.xmlCharKey) !== null && _a !== void 0 ? _a : XML_CHARKEY;
    const xmlParser = new xml2js.Parser(xml2jsParserSettings);
    return new Promise((resolve, reject) => {
        if (!str) {
            reject(new Error("Document is empty"));
        }
        else {
            xmlParser.parseString(str, (err, res) => {
                if (err) {
                    reject(err);
                }
                else {
                    resolve(res);
                }
            });
        }
    });
}
//# sourceMappingURL=xml.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { BaseRequestPolicy, } from "../policies/requestPolicy";
import { Constants } from "../util/constants";
import { delay } from "../util/delay";
// Default options for the cycler if none are provided
export const DEFAULT_CYCLER_OPTIONS = {
    forcedRefreshWindowInMs: 1000,
    retryIntervalInMs: 3000,
    refreshWindowInMs: 1000 * 60 * 2, // Start refreshing 2m before expiry
};
/**
 * Converts an an unreliable access token getter (which may resolve with null)
 * into an AccessTokenGetter by retrying the unreliable getter in a regular
 * interval.
 *
 * @param getAccessToken - a function that produces a promise of an access
 * token that may fail by returning null
 * @param retryIntervalInMs - the time (in milliseconds) to wait between retry
 * attempts
 * @param timeoutInMs - the timestamp after which the refresh attempt will fail,
 * throwing an exception
 * @returns - a promise that, if it resolves, will resolve with an access token
 */
async function beginRefresh(getAccessToken, retryIntervalInMs, timeoutInMs) {
    // This wrapper handles exceptions gracefully as long as we haven't exceeded
    // the timeout.
    async function tryGetAccessToken() {
        if (Date.now() < timeoutInMs) {
            try {
                return await getAccessToken();
            }
            catch (_a) {
                return null;
            }
        }
        else {
            const finalToken = await getAccessToken();
            // Timeout is up, so throw if it's still null
            if (finalToken === null) {
                throw new Error("Failed to refresh access token.");
            }
            return finalToken;
        }
    }
    let token = await tryGetAccessToken();
    while (token === null) {
        await delay(retryIntervalInMs);
        token = await tryGetAccessToken();
    }
    return token;
}
/**
 * Creates a token cycler from a credential, scopes, and optional settings.
 *
 * A token cycler represents a way to reliably retrieve a valid access token
 * from a TokenCredential. It will handle initializing the token, refreshing it
 * when it nears expiration, and synchronizes refresh attempts to avoid
 * concurrency hazards.
 *
 * @param credential - the underlying TokenCredential that provides the access
 * token
 * @param scopes - the scopes to request authorization for
 * @param tokenCyclerOptions - optionally override default settings for the cycler
 *
 * @returns - a function that reliably produces a valid access token
 */
function createTokenCycler(credential, scopes, tokenCyclerOptions) {
    let refreshWorker = null;
    let token = null;
    const options = Object.assign(Object.assign({}, DEFAULT_CYCLER_OPTIONS), tokenCyclerOptions);
    /**
     * This little holder defines several predicates that we use to construct
     * the rules of refreshing the token.
     */
    const cycler = {
        /**
         * Produces true if a refresh job is currently in progress.
         */
        get isRefreshing() {
            return refreshWorker !== null;
        },
        /**
         * Produces true if the cycler SHOULD refresh (we are within the refresh
         * window and not already refreshing)
         */
        get shouldRefresh() {
            var _a;
            return (!cycler.isRefreshing &&
                ((_a = token === null || token === void 0 ? void 0 : token.expiresOnTimestamp) !== null && _a !== void 0 ? _a : 0) - options.refreshWindowInMs < Date.now());
        },
        /**
         * Produces true if the cycler MUST refresh (null or nearly-expired
         * token).
         */
        get mustRefresh() {
            return (token === null || token.expiresOnTimestamp - options.forcedRefreshWindowInMs < Date.now());
        },
    };
    /**
     * Starts a refresh job or returns the existing job if one is already
     * running.
     */
    function refresh(getTokenOptions) {
        var _a;
        if (!cycler.isRefreshing) {
            // We bind `scopes` here to avoid passing it around a lot
            const tryGetAccessToken = () => credential.getToken(scopes, getTokenOptions);
            // Take advantage of promise chaining to insert an assignment to `token`
            // before the refresh can be considered done.
            refreshWorker = beginRefresh(tryGetAccessToken, options.retryIntervalInMs, 
            // If we don't have a token, then we should timeout immediately
            (_a = token === null || token === void 0 ? void 0 : token.expiresOnTimestamp) !== null && _a !== void 0 ? _a : Date.now())
                .then((_token) => {
                refreshWorker = null;
                token = _token;
                return token;
            })
                .catch((reason) => {
                // We also should reset the refresher if we enter a failed state.  All
                // existing awaiters will throw, but subsequent requests will start a
                // new retry chain.
                refreshWorker = null;
                token = null;
                throw reason;
            });
        }
        return refreshWorker;
    }
    return async (tokenOptions) => {
        //
        // Simple rules:
        // - If we MUST refresh, then return the refresh task, blocking
        //   the pipeline until a token is available.
        // - If we SHOULD refresh, then run refresh but don't return it
        //   (we can still use the cached token).
        // - Return the token, since it's fine if we didn't return in
        //   step 1.
        //
        if (cycler.mustRefresh)
            return refresh(tokenOptions);
        if (cycler.shouldRefresh) {
            refresh(tokenOptions);
        }
        return token;
    };
}
// #endregion
/**
 * Creates a new factory for a RequestPolicy that applies a bearer token to
 * the requests' `Authorization` headers.
 *
 * @param credential - The TokenCredential implementation that can supply the bearer token.
 * @param scopes - The scopes for which the bearer token applies.
 */
export function bearerTokenAuthenticationPolicy(credential, scopes) {
    // This simple function encapsulates the entire process of reliably retrieving the token
    const getToken = createTokenCycler(credential, scopes /* , options */);
    class BearerTokenAuthenticationPolicy extends BaseRequestPolicy {
        constructor(nextPolicy, options) {
            super(nextPolicy, options);
        }
        async sendRequest(webResource) {
            if (!webResource.url.toLowerCase().startsWith("https://")) {
                throw new Error("Bearer token authentication is not permitted for non-TLS protected (non-https) URLs.");
            }
            const { token } = await getToken({
                abortSignal: webResource.abortSignal,
                tracingOptions: {
                    tracingContext: webResource.tracingContext,
                },
            });
            webResource.headers.set(Constants.HeaderConstants.AUTHORIZATION, `Bearer ${token}`);
            return this._nextPolicy.sendRequest(webResource);
        }
    }
    return {
        create: (nextPolicy, options) => {
            return new BearerTokenAuthenticationPolicy(nextPolicy, options);
        },
    };
}
//# sourceMappingURL=bearerTokenAuthenticationPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { BaseRequestPolicy, } from "./requestPolicy";
import { XML_CHARKEY } from "../util/serializer.common";
import { MapperType } from "../serializer";
import { RestError } from "../restError";
import { parseXML } from "../util/xml";
/**
 * Create a new serialization RequestPolicyCreator that will serialized HTTP request bodies as they
 * pass through the HTTP pipeline.
 */
export function deserializationPolicy(deserializationContentTypes, parsingOptions) {
    return {
        create: (nextPolicy, options) => {
            return new DeserializationPolicy(nextPolicy, options, deserializationContentTypes, parsingOptions);
        },
    };
}
export const defaultJsonContentTypes = ["application/json", "text/json"];
export const defaultXmlContentTypes = ["application/xml", "application/atom+xml"];
export const DefaultDeserializationOptions = {
    expectedContentTypes: {
        json: defaultJsonContentTypes,
        xml: defaultXmlContentTypes,
    },
};
/**
 * A RequestPolicy that will deserialize HTTP response bodies and headers as they pass through the
 * HTTP pipeline.
 */
export class DeserializationPolicy extends BaseRequestPolicy {
    constructor(nextPolicy, requestPolicyOptions, deserializationContentTypes, parsingOptions = {}) {
        var _a;
        super(nextPolicy, requestPolicyOptions);
        this.jsonContentTypes =
            (deserializationContentTypes && deserializationContentTypes.json) || defaultJsonContentTypes;
        this.xmlContentTypes =
            (deserializationContentTypes && deserializationContentTypes.xml) || defaultXmlContentTypes;
        this.xmlCharKey = (_a = parsingOptions.xmlCharKey) !== null && _a !== void 0 ? _a : XML_CHARKEY;
    }
    async sendRequest(request) {
        return this._nextPolicy.sendRequest(request).then((response) => deserializeResponseBody(this.jsonContentTypes, this.xmlContentTypes, response, {
            xmlCharKey: this.xmlCharKey,
        }));
    }
}
function getOperationResponse(parsedResponse) {
    let result;
    const request = parsedResponse.request;
    const operationSpec = request.operationSpec;
    if (operationSpec) {
        const operationResponseGetter = request.operationResponseGetter;
        if (!operationResponseGetter) {
            result = operationSpec.responses[parsedResponse.status];
        }
        else {
            result = operationResponseGetter(operationSpec, parsedResponse);
        }
    }
    return result;
}
function shouldDeserializeResponse(parsedResponse) {
    const shouldDeserialize = parsedResponse.request.shouldDeserialize;
    let result;
    if (shouldDeserialize === undefined) {
        result = true;
    }
    else if (typeof shouldDeserialize === "boolean") {
        result = shouldDeserialize;
    }
    else {
        result = shouldDeserialize(parsedResponse);
    }
    return result;
}
/**
 * Given a particular set of content types to parse as either JSON or XML, consumes the HTTP response to produce the result object defined by the request's {@link OperationSpec}.
 * @param jsonContentTypes - Response content types to parse the body as JSON.
 * @param xmlContentTypes  - Response content types to parse the body as XML.
 * @param response - HTTP Response from the pipeline.
 * @param options  - Options to the serializer, mostly for configuring the XML parser if needed.
 * @returns A parsed {@link HttpOperationResponse} object that can be returned by the {@link ServiceClient}.
 */
export function deserializeResponseBody(jsonContentTypes, xmlContentTypes, response, options = {}) {
    var _a, _b, _c;
    const updatedOptions = {
        rootName: (_a = options.rootName) !== null && _a !== void 0 ? _a : "",
        includeRoot: (_b = options.includeRoot) !== null && _b !== void 0 ? _b : false,
        xmlCharKey: (_c = options.xmlCharKey) !== null && _c !== void 0 ? _c : XML_CHARKEY,
    };
    return parse(jsonContentTypes, xmlContentTypes, response, updatedOptions).then((parsedResponse) => {
        if (!shouldDeserializeResponse(parsedResponse)) {
            return parsedResponse;
        }
        const operationSpec = parsedResponse.request.operationSpec;
        if (!operationSpec || !operationSpec.responses) {
            return parsedResponse;
        }
        const responseSpec = getOperationResponse(parsedResponse);
        const { error, shouldReturnResponse } = handleErrorResponse(parsedResponse, operationSpec, responseSpec);
        if (error) {
            throw error;
        }
        else if (shouldReturnResponse) {
            return parsedResponse;
        }
        // An operation response spec does exist for current status code, so
        // use it to deserialize the response.
        if (responseSpec) {
            if (responseSpec.bodyMapper) {
                let valueToDeserialize = parsedResponse.parsedBody;
                if (operationSpec.isXML && responseSpec.bodyMapper.type.name === MapperType.Sequence) {
                    valueToDeserialize =
                        typeof valueToDeserialize === "object"
                            ? valueToDeserialize[responseSpec.bodyMapper.xmlElementName]
                            : [];
                }
                try {
                    parsedResponse.parsedBody = operationSpec.serializer.deserialize(responseSpec.bodyMapper, valueToDeserialize, "operationRes.parsedBody", options);
                }
                catch (innerError) {
                    const restError = new RestError(`Error ${innerError} occurred in deserializing the responseBody - ${parsedResponse.bodyAsText}`, undefined, parsedResponse.status, parsedResponse.request, parsedResponse);
                    throw restError;
                }
            }
            else if (operationSpec.httpMethod === "HEAD") {
                // head methods never have a body, but we return a boolean to indicate presence/absence of the resource
                parsedResponse.parsedBody = response.status >= 200 && response.status < 300;
            }
            if (responseSpec.headersMapper) {
                parsedResponse.parsedHeaders = operationSpec.serializer.deserialize(responseSpec.headersMapper, parsedResponse.headers.rawHeaders(), "operationRes.parsedHeaders", options);
            }
        }
        return parsedResponse;
    });
}
function isOperationSpecEmpty(operationSpec) {
    const expectedStatusCodes = Object.keys(operationSpec.responses);
    return (expectedStatusCodes.length === 0 ||
        (expectedStatusCodes.length === 1 && expectedStatusCodes[0] === "default"));
}
function handleErrorResponse(parsedResponse, operationSpec, responseSpec) {
    var _a;
    const isSuccessByStatus = 200 <= parsedResponse.status && parsedResponse.status < 300;
    const isExpectedStatusCode = isOperationSpecEmpty(operationSpec)
        ? isSuccessByStatus
        : !!responseSpec;
    if (isExpectedStatusCode) {
        if (responseSpec) {
            if (!responseSpec.isError) {
                return { error: null, shouldReturnResponse: false };
            }
        }
        else {
            return { error: null, shouldReturnResponse: false };
        }
    }
    const errorResponseSpec = responseSpec !== null && responseSpec !== void 0 ? responseSpec : operationSpec.responses.default;
    const streaming = ((_a = parsedResponse.request.streamResponseStatusCodes) === null || _a === void 0 ? void 0 : _a.has(parsedResponse.status)) ||
        parsedResponse.request.streamResponseBody;
    const initialErrorMessage = streaming
        ? `Unexpected status code: ${parsedResponse.status}`
        : parsedResponse.bodyAsText;
    const error = new RestError(initialErrorMessage, undefined, parsedResponse.status, parsedResponse.request, parsedResponse);
    // If the item failed but there's no error spec or default spec to deserialize the error,
    // we should fail so we just throw the parsed response
    if (!errorResponseSpec) {
        throw error;
    }
    const defaultBodyMapper = errorResponseSpec.bodyMapper;
    const defaultHeadersMapper = errorResponseSpec.headersMapper;
    try {
        // If error response has a body, try to deserialize it using default body mapper.
        // Then try to extract error code & message from it
        if (parsedResponse.parsedBody) {
            const parsedBody = parsedResponse.parsedBody;
            let parsedError;
            if (defaultBodyMapper) {
                let valueToDeserialize = parsedBody;
                if (operationSpec.isXML && defaultBodyMapper.type.name === MapperType.Sequence) {
                    valueToDeserialize =
                        typeof parsedBody === "object" ? parsedBody[defaultBodyMapper.xmlElementName] : [];
                }
                parsedError = operationSpec.serializer.deserialize(defaultBodyMapper, valueToDeserialize, "error.response.parsedBody");
            }
            const internalError = parsedBody.error || parsedError || parsedBody;
            error.code = internalError.code;
            if (internalError.message) {
                error.message = internalError.message;
            }
            if (defaultBodyMapper) {
                error.response.parsedBody = parsedError;
            }
        }
        // If error response has headers, try to deserialize it using default header mapper
        if (parsedResponse.headers && defaultHeadersMapper) {
            error.response.parsedHeaders = operationSpec.serializer.deserialize(defaultHeadersMapper, parsedResponse.headers.rawHeaders(), "operationRes.parsedHeaders");
        }
    }
    catch (defaultError) {
        error.message = `Error "${defaultError.message}" occurred in deserializing the responseBody - "${parsedResponse.bodyAsText}" for the default response.`;
    }
    return { error, shouldReturnResponse: false };
}
function parse(jsonContentTypes, xmlContentTypes, operationResponse, opts) {
    var _a;
    const errorHandler = (err) => {
        const msg = `Error "${err}" occurred while parsing the response body - ${operationResponse.bodyAsText}.`;
        const errCode = err.code || RestError.PARSE_ERROR;
        const e = new RestError(msg, errCode, operationResponse.status, operationResponse.request, operationResponse);
        return Promise.reject(e);
    };
    const streaming = ((_a = operationResponse.request.streamResponseStatusCodes) === null || _a === void 0 ? void 0 : _a.has(operationResponse.status)) ||
        operationResponse.request.streamResponseBody;
    if (!streaming && operationResponse.bodyAsText) {
        const text = operationResponse.bodyAsText;
        const contentType = operationResponse.headers.get("Content-Type") || "";
        const contentComponents = !contentType
            ? []
            : contentType.split(";").map((component) => component.toLowerCase());
        if (contentComponents.length === 0 ||
            contentComponents.some((component) => jsonContentTypes.indexOf(component) !== -1)) {
            return new Promise((resolve) => {
                operationResponse.parsedBody = JSON.parse(text);
                resolve(operationResponse);
            }).catch(errorHandler);
        }
        else if (contentComponents.some((component) => xmlContentTypes.indexOf(component) !== -1)) {
            return parseXML(text, opts)
                .then((body) => {
                operationResponse.parsedBody = body;
                return operationResponse;
            })
                .catch(errorHandler);
        }
    }
    return Promise.resolve(operationResponse);
}
//# sourceMappingURL=deserializationPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/*
 * NOTE: When moving this file, please update "browser" section in package.json
 */
import { BaseRequestPolicy, } from "./requestPolicy";
const DisbleResponseDecompressionNotSupportedInBrowser = new Error("DisableResponseDecompressionPolicy is not supported in browser environment");
/**
 * {@link DisableResponseDecompressionPolicy} is not supported in browser and attempting
 * to use it will results in error being thrown.
 */
export function disableResponseDecompressionPolicy() {
    return {
        create: (_nextPolicy, _options) => {
            throw DisbleResponseDecompressionNotSupportedInBrowser;
        },
    };
}
export class DisableResponseDecompressionPolicy extends BaseRequestPolicy {
    constructor(nextPolicy, options) {
        super(nextPolicy, options);
        throw DisbleResponseDecompressionNotSupportedInBrowser;
    }
    async sendRequest(_request) {
        throw DisbleResponseDecompressionNotSupportedInBrowser;
    }
}
//# sourceMappingURL=disableResponseDecompressionPolicy.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { BaseRequestPolicy, } from "./requestPolicy";
/**
 * Returns a request policy factory that can be used to create an instance of
 * {@link DisableResponseDecompressionPolicy}.
 */
export function disableResponseDecompressionPolicy() {
    return {
        create: (nextPolicy, options) => {
            return new DisableResponseDecompressionPolicy(nextPolicy, options);
        },
    };
}
/**
 * A policy to disable response decompression according to Accept-Encoding header
 * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding
 */
export class DisableResponseDecompressionPolicy extends BaseRequestPolicy {
    /**
     * Creates an instance of DisableResponseDecompressionPolicy.
     *
     * @param nextPolicy -
     * @param options -
     */
    // The parent constructor is protected.
    /* eslint-disable-next-line @typescript-eslint/no-useless-constructor */
    constructor(nextPolicy, options) {
        super(nextPolicy, options);
    }
    /**
     * Sends out request.
     *
     * @param request -
     * @returns
     */
    async sendRequest(request) {
        request.decompressResponse = false;
        return this._nextPolicy.sendRequest(request);
    }
}
//# sourceMappingURL=disableResponseDecompressionPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { BaseRequestPolicy, } from "./requestPolicy";
import { DEFAULT_CLIENT_MAX_RETRY_INTERVAL, DEFAULT_CLIENT_RETRY_COUNT, DEFAULT_CLIENT_RETRY_INTERVAL, isNumber, shouldRetry, updateRetryData, } from "../util/exponentialBackoffStrategy";
import { Constants } from "../util/constants";
import { RestError } from "../restError";
import { delay } from "../util/delay";
import { logger } from "../log";
/**
 * Policy that retries the request as many times as configured for as long as the max retry time interval specified, each retry waiting longer to begin than the last time.
 * @param retryCount - Maximum number of retries.
 * @param retryInterval - Base time between retries.
 * @param maxRetryInterval - Maximum time to wait between retries.
 */
export function exponentialRetryPolicy(retryCount, retryInterval, maxRetryInterval) {
    return {
        create: (nextPolicy, options) => {
            return new ExponentialRetryPolicy(nextPolicy, options, retryCount, retryInterval, maxRetryInterval);
        },
    };
}
/**
 * Describes the Retry Mode type. Currently supporting only Exponential.
 */
export var RetryMode;
(function (RetryMode) {
    /**
     * Currently supported retry mode.
     * Each time a retry happens, it will take exponentially more time than the last time.
     */
    RetryMode[RetryMode["Exponential"] = 0] = "Exponential";
})(RetryMode || (RetryMode = {}));
export const DefaultRetryOptions = {
    maxRetries: DEFAULT_CLIENT_RETRY_COUNT,
    retryDelayInMs: DEFAULT_CLIENT_RETRY_INTERVAL,
    maxRetryDelayInMs: DEFAULT_CLIENT_MAX_RETRY_INTERVAL,
};
/**
 * Instantiates a new "ExponentialRetryPolicyFilter" instance.
 */
export class ExponentialRetryPolicy extends BaseRequestPolicy {
    /**
     * @param nextPolicy - The next RequestPolicy in the pipeline chain.
     * @param options - The options for this RequestPolicy.
     * @param retryCount - The client retry count.
     * @param retryInterval - The client retry interval, in milliseconds.
     * @param minRetryInterval - The minimum retry interval, in milliseconds.
     * @param maxRetryInterval - The maximum retry interval, in milliseconds.
     */
    constructor(nextPolicy, options, retryCount, retryInterval, maxRetryInterval) {
        super(nextPolicy, options);
        this.retryCount = isNumber(retryCount) ? retryCount : DEFAULT_CLIENT_RETRY_COUNT;
        this.retryInterval = isNumber(retryInterval) ? retryInterval : DEFAULT_CLIENT_RETRY_INTERVAL;
        this.maxRetryInterval = isNumber(maxRetryInterval)
            ? maxRetryInterval
            : DEFAULT_CLIENT_MAX_RETRY_INTERVAL;
    }
    sendRequest(request) {
        return this._nextPolicy
            .sendRequest(request.clone())
            .then((response) => retry(this, request, response))
            .catch((error) => retry(this, request, error.response, undefined, error));
    }
}
async function retry(policy, request, response, retryData, requestError) {
    function shouldPolicyRetry(responseParam) {
        const statusCode = responseParam === null || responseParam === void 0 ? void 0 : responseParam.status;
        if (statusCode === 503 && (response === null || response === void 0 ? void 0 : response.headers.get(Constants.HeaderConstants.RETRY_AFTER))) {
            return false;
        }
        if (statusCode === undefined ||
            (statusCode < 500 && statusCode !== 408) ||
            statusCode === 501 ||
            statusCode === 505) {
            return false;
        }
        return true;
    }
    retryData = updateRetryData({
        retryInterval: policy.retryInterval,
        minRetryInterval: 0,
        maxRetryInterval: policy.maxRetryInterval,
    }, retryData, requestError);
    const isAborted = request.abortSignal && request.abortSignal.aborted;
    if (!isAborted && shouldRetry(policy.retryCount, shouldPolicyRetry, retryData, response)) {
        logger.info(`Retrying request in ${retryData.retryInterval}`);
        try {
            await delay(retryData.retryInterval);
            const res = await policy._nextPolicy.sendRequest(request.clone());
            return retry(policy, request, res, retryData);
        }
        catch (err) {
            return retry(policy, request, response, retryData, err);
        }
    }
    else if (isAborted || requestError || !response) {
        // If the operation failed in the end, return all errors instead of just the last one
        const err = retryData.error ||
            new RestError("Failed to send the request.", RestError.REQUEST_SEND_ERROR, response && response.status, response && response.request, response);
        throw err;
    }
    else {
        return response;
    }
}
//# sourceMappingURL=exponentialRetryPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { BaseRequestPolicy, } from "./requestPolicy";
/**
 * Creates a policy that assigns a unique request id to outgoing requests.
 * @param requestIdHeaderName - The name of the header to use when assigning the unique id to the request.
 */
export function generateClientRequestIdPolicy(requestIdHeaderName = "x-ms-client-request-id") {
    return {
        create: (nextPolicy, options) => {
            return new GenerateClientRequestIdPolicy(nextPolicy, options, requestIdHeaderName);
        },
    };
}
export class GenerateClientRequestIdPolicy extends BaseRequestPolicy {
    constructor(nextPolicy, options, _requestIdHeaderName) {
        super(nextPolicy, options);
        this._requestIdHeaderName = _requestIdHeaderName;
    }
    sendRequest(request) {
        if (!request.headers.contains(this._requestIdHeaderName)) {
            request.headers.set(this._requestIdHeaderName, request.requestId);
        }
        return this._nextPolicy.sendRequest(request);
    }
}
//# sourceMappingURL=generateClientRequestIdPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { BaseRequestPolicy, } from "./requestPolicy";
/**
 * By default, HTTP connections are maintained for future requests.
 */
export const DefaultKeepAliveOptions = {
    enable: true,
};
/**
 * Creates a policy that controls whether HTTP connections are maintained on future requests.
 * @param keepAliveOptions - Keep alive options. By default, HTTP connections are maintained for future requests.
 * @returns An instance of the {@link KeepAlivePolicy}
 */
export function keepAlivePolicy(keepAliveOptions) {
    return {
        create: (nextPolicy, options) => {
            return new KeepAlivePolicy(nextPolicy, options, keepAliveOptions || DefaultKeepAliveOptions);
        },
    };
}
/**
 * KeepAlivePolicy is a policy used to control keep alive settings for every request.
 */
export class KeepAlivePolicy extends BaseRequestPolicy {
    /**
     * Creates an instance of KeepAlivePolicy.
     *
     * @param nextPolicy -
     * @param options -
     * @param keepAliveOptions -
     */
    constructor(nextPolicy, options, keepAliveOptions) {
        super(nextPolicy, options);
        this.keepAliveOptions = keepAliveOptions;
    }
    /**
     * Sends out request.
     *
     * @param request -
     * @returns
     */
    async sendRequest(request) {
        request.keepAlive = this.keepAliveOptions.enable;
        return this._nextPolicy.sendRequest(request);
    }
}
//# sourceMappingURL=keepAlivePolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { BaseRequestPolicy, } from "./requestPolicy";
import { Sanitizer } from "../util/sanitizer";
import { logger as coreLogger } from "../log";
/**
 * Creates a policy that logs information about the outgoing request and the incoming responses.
 * @param loggingOptions - Logging options.
 * @returns An instance of the {@link LogPolicy}
 */
export function logPolicy(loggingOptions = {}) {
    return {
        create: (nextPolicy, options) => {
            return new LogPolicy(nextPolicy, options, loggingOptions);
        },
    };
}
/**
 * A policy that logs information about the outgoing request and the incoming responses.
 */
export class LogPolicy extends BaseRequestPolicy {
    constructor(nextPolicy, options, { logger = coreLogger.info, allowedHeaderNames = [], allowedQueryParameters = [], } = {}) {
        super(nextPolicy, options);
        this.logger = logger;
        this.sanitizer = new Sanitizer({ allowedHeaderNames, allowedQueryParameters });
    }
    /**
     * Header names whose values will be logged when logging is enabled. Defaults to
     * Date, traceparent, x-ms-client-request-id, and x-ms-request id.  Any headers
     * specified in this field will be added to that list.  Any other values will
     * be written to logs as "REDACTED".
     * @deprecated Pass these into the constructor instead.
     */
    get allowedHeaderNames() {
        return this.sanitizer.allowedHeaderNames;
    }
    /**
     * Header names whose values will be logged when logging is enabled. Defaults to
     * Date, traceparent, x-ms-client-request-id, and x-ms-request id.  Any headers
     * specified in this field will be added to that list.  Any other values will
     * be written to logs as "REDACTED".
     * @deprecated Pass these into the constructor instead.
     */
    set allowedHeaderNames(allowedHeaderNames) {
        this.sanitizer.allowedHeaderNames = allowedHeaderNames;
    }
    /**
     * Query string names whose values will be logged when logging is enabled. By default no
     * query string values are logged.
     * @deprecated Pass these into the constructor instead.
     */
    get allowedQueryParameters() {
        return this.sanitizer.allowedQueryParameters;
    }
    /**
     * Query string names whose values will be logged when logging is enabled. By default no
     * query string values are logged.
     * @deprecated Pass these into the constructor instead.
     */
    set allowedQueryParameters(allowedQueryParameters) {
        this.sanitizer.allowedQueryParameters = allowedQueryParameters;
    }
    sendRequest(request) {
        if (!this.logger.enabled)
            return this._nextPolicy.sendRequest(request);
        this.logRequest(request);
        return this._nextPolicy.sendRequest(request).then((response) => this.logResponse(response));
    }
    logRequest(request) {
        this.logger(`Request: ${this.sanitizer.sanitize(request)}`);
    }
    logResponse(response) {
        this.logger(`Response status code: ${response.status}`);
        this.logger(`Headers: ${this.sanitizer.sanitize(response.headers)}`);
        return response;
    }
}
//# sourceMappingURL=logPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export function getDefaultUserAgentKey() {
    return "x-ms-useragent";
}
export function getPlatformSpecificData() {
    const navigator = self.navigator;
    const osInfo = {
        key: "OS",
        value: (navigator.oscpu || navigator.platform).replace(" ", ""),
    };
    return [osInfo];
}
//# sourceMappingURL=msRestUserAgentPolicy.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import * as os from "os";
import { Constants } from "../util/constants";
export function getDefaultUserAgentKey() {
    return Constants.HeaderConstants.USER_AGENT;
}
export function getPlatformSpecificData() {
    const runtimeInfo = {
        key: "Node",
        value: process.version,
    };
    const osInfo = {
        key: "OS",
        value: `(${os.arch()}-${os.type()}-${os.release()})`,
    };
    return [runtimeInfo, osInfo];
}
//# sourceMappingURL=msRestUserAgentPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
const { Platform } = require("react-native"); // eslint-disable-line import/no-extraneous-dependencies, @typescript-eslint/no-require-imports
export function getDefaultUserAgentKey() {
    return "x-ms-useragent";
}
export function getPlatformSpecificData() {
    const { major, minor, patch } = Platform.constants.reactNativeVersion;
    const runtimeInfo = {
        key: "react-native",
        value: `${major}.${minor}.${patch}`,
    };
    const osInfo = {
        key: "OS",
        value: `${Platform.OS}-${Platform.Version}`,
    };
    return [runtimeInfo, osInfo];
}
//# sourceMappingURL=msRestUserAgentPolicy.native.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
// BaseRequestPolicy has a protected constructor.
/* eslint-disable @typescript-eslint/no-useless-constructor */
import { BaseRequestPolicy, } from "./requestPolicy";
export function ndJsonPolicy() {
    return {
        create: (nextPolicy, options) => {
            return new NdJsonPolicy(nextPolicy, options);
        },
    };
}
/**
 * NdJsonPolicy that formats a JSON array as newline-delimited JSON
 */
class NdJsonPolicy extends BaseRequestPolicy {
    /**
     * Creates an instance of KeepAlivePolicy.
     */
    constructor(nextPolicy, options) {
        super(nextPolicy, options);
    }
    /**
     * Sends a request.
     */
    async sendRequest(request) {
        // There currently isn't a good way to bypass the serializer
        if (typeof request.body === "string" && request.body.startsWith("[")) {
            const body = JSON.parse(request.body);
            if (Array.isArray(body)) {
                request.body = body.map((item) => JSON.stringify(item) + "\n").join("");
            }
        }
        return this._nextPolicy.sendRequest(request);
    }
}
//# sourceMappingURL=ndJsonPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { BaseRequestPolicy, } from "./requestPolicy";
const proxyNotSupportedInBrowser = new Error("ProxyPolicy is not supported in browser environment");
export function getDefaultProxySettings(_proxyUrl) {
    return undefined;
}
export function proxyPolicy(_proxySettings) {
    return {
        create: (_nextPolicy, _options) => {
            throw proxyNotSupportedInBrowser;
        },
    };
}
export class ProxyPolicy extends BaseRequestPolicy {
    constructor(nextPolicy, options) {
        super(nextPolicy, options);
        throw proxyNotSupportedInBrowser;
    }
    sendRequest(_request) {
        throw proxyNotSupportedInBrowser;
    }
}
//# sourceMappingURL=proxyPolicy.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { BaseRequestPolicy, } from "./requestPolicy";
import { Constants } from "../util/constants";
import { URLBuilder } from "../url";
import { getEnvironmentValue } from "../util/utils";
/**
 * Stores the patterns specified in NO_PROXY environment variable.
 * @internal
 */
export const globalNoProxyList = [];
let noProxyListLoaded = false;
/** A cache of whether a host should bypass the proxy. */
const globalBypassedMap = new Map();
function loadEnvironmentProxyValue() {
    if (!process) {
        return undefined;
    }
    const httpsProxy = getEnvironmentValue(Constants.HTTPS_PROXY);
    const allProxy = getEnvironmentValue(Constants.ALL_PROXY);
    const httpProxy = getEnvironmentValue(Constants.HTTP_PROXY);
    return httpsProxy || allProxy || httpProxy;
}
/**
 * Check whether the host of a given `uri` matches any pattern in the no proxy list.
 * If there's a match, any request sent to the same host shouldn't have the proxy settings set.
 * This implementation is a port of https://github.com/Azure/azure-sdk-for-net/blob/8cca811371159e527159c7eb65602477898683e2/sdk/core/Azure.Core/src/Pipeline/Internal/HttpEnvironmentProxy.cs#L210
 */
function isBypassed(uri, noProxyList, bypassedMap) {
    if (noProxyList.length === 0) {
        return false;
    }
    const host = URLBuilder.parse(uri).getHost();
    if (bypassedMap === null || bypassedMap === void 0 ? void 0 : bypassedMap.has(host)) {
        return bypassedMap.get(host);
    }
    let isBypassedFlag = false;
    for (const pattern of noProxyList) {
        if (pattern[0] === ".") {
            // This should match either domain it self or any subdomain or host
            // .foo.com will match foo.com it self or *.foo.com
            if (host.endsWith(pattern)) {
                isBypassedFlag = true;
            }
            else {
                if (host.length === pattern.length - 1 && host === pattern.slice(1)) {
                    isBypassedFlag = true;
                }
            }
        }
        else {
            if (host === pattern) {
                isBypassedFlag = true;
            }
        }
    }
    bypassedMap === null || bypassedMap === void 0 ? void 0 : bypassedMap.set(host, isBypassedFlag);
    return isBypassedFlag;
}
/**
 * @internal
 */
export function loadNoProxy() {
    const noProxy = getEnvironmentValue(Constants.NO_PROXY);
    noProxyListLoaded = true;
    if (noProxy) {
        return noProxy
            .split(",")
            .map((item) => item.trim())
            .filter((item) => item.length);
    }
    return [];
}
/**
 * Converts a given URL of a proxy server into `ProxySettings` or attempts to retrieve `ProxySettings` from the current environment if one is not passed.
 * @param proxyUrl - URL of the proxy
 * @returns The default proxy settings, or undefined.
 */
export function getDefaultProxySettings(proxyUrl) {
    if (!proxyUrl) {
        proxyUrl = loadEnvironmentProxyValue();
        if (!proxyUrl) {
            return undefined;
        }
    }
    const { username, password, urlWithoutAuth } = extractAuthFromUrl(proxyUrl);
    const parsedUrl = URLBuilder.parse(urlWithoutAuth);
    const schema = parsedUrl.getScheme() ? parsedUrl.getScheme() + "://" : "";
    return {
        host: schema + parsedUrl.getHost(),
        port: Number.parseInt(parsedUrl.getPort() || "80"),
        username,
        password,
    };
}
/**
 * A policy that allows one to apply proxy settings to all requests.
 * If not passed static settings, they will be retrieved from the HTTPS_PROXY
 * or HTTP_PROXY environment variables.
 * @param proxySettings - ProxySettings to use on each request.
 * @param options - additional settings, for example, custom NO_PROXY patterns
 */
export function proxyPolicy(proxySettings, options) {
    if (!proxySettings) {
        proxySettings = getDefaultProxySettings();
    }
    if (!noProxyListLoaded) {
        globalNoProxyList.push(...loadNoProxy());
    }
    return {
        create: (nextPolicy, requestPolicyOptions) => {
            return new ProxyPolicy(nextPolicy, requestPolicyOptions, proxySettings, options === null || options === void 0 ? void 0 : options.customNoProxyList);
        },
    };
}
function extractAuthFromUrl(url) {
    const atIndex = url.indexOf("@");
    if (atIndex === -1) {
        return { urlWithoutAuth: url };
    }
    const schemeIndex = url.indexOf("://");
    const authStart = schemeIndex !== -1 ? schemeIndex + 3 : 0;
    const auth = url.substring(authStart, atIndex);
    const colonIndex = auth.indexOf(":");
    const hasPassword = colonIndex !== -1;
    const username = hasPassword ? auth.substring(0, colonIndex) : auth;
    const password = hasPassword ? auth.substring(colonIndex + 1) : undefined;
    const urlWithoutAuth = url.substring(0, authStart) + url.substring(atIndex + 1);
    return {
        username,
        password,
        urlWithoutAuth,
    };
}
export class ProxyPolicy extends BaseRequestPolicy {
    constructor(nextPolicy, options, proxySettings, customNoProxyList) {
        super(nextPolicy, options);
        this.proxySettings = proxySettings;
        this.customNoProxyList = customNoProxyList;
    }
    sendRequest(request) {
        var _a;
        if (!request.proxySettings &&
            !isBypassed(request.url, (_a = this.customNoProxyList) !== null && _a !== void 0 ? _a : globalNoProxyList, this.customNoProxyList ? undefined : globalBypassedMap)) {
            request.proxySettings = this.proxySettings;
        }
        return this._nextPolicy.sendRequest(request);
    }
}
//# sourceMappingURL=proxyPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { BaseRequestPolicy, } from "./requestPolicy";
import { URLBuilder } from "../url";
/**
 * Methods that are allowed to follow redirects 301 and 302
 */
const allowedRedirect = ["GET", "HEAD"];
export const DefaultRedirectOptions = {
    handleRedirects: true,
    maxRetries: 20,
};
/**
 * Creates a redirect policy, which sends a repeats the request to a new destination if a response arrives with a "location" header, and a status code between 300 and 307.
 * @param maximumRetries - Maximum number of redirects to follow.
 * @returns An instance of the {@link RedirectPolicy}
 */
export function redirectPolicy(maximumRetries = 20) {
    return {
        create: (nextPolicy, options) => {
            return new RedirectPolicy(nextPolicy, options, maximumRetries);
        },
    };
}
/**
 * Resends the request to a new destination if a response arrives with a "location" header, and a status code between 300 and 307.
 */
export class RedirectPolicy extends BaseRequestPolicy {
    constructor(nextPolicy, options, maxRetries = 20) {
        super(nextPolicy, options);
        this.maxRetries = maxRetries;
    }
    sendRequest(request) {
        return this._nextPolicy
            .sendRequest(request)
            .then((response) => handleRedirect(this, response, 0));
    }
}
function handleRedirect(policy, response, currentRetries) {
    const { request, status } = response;
    const locationHeader = response.headers.get("location");
    if (locationHeader &&
        (status === 300 ||
            (status === 301 && allowedRedirect.includes(request.method)) ||
            (status === 302 && allowedRedirect.includes(request.method)) ||
            (status === 303 && request.method === "POST") ||
            status === 307) &&
        (!policy.maxRetries || currentRetries < policy.maxRetries)) {
        const builder = URLBuilder.parse(request.url);
        builder.setPath(locationHeader);
        request.url = builder.toString();
        // POST request with Status code 303 should be converted into a
        // redirected GET request if the redirect url is present in the location header
        if (status === 303) {
            request.method = "GET";
            delete request.body;
        }
        return policy._nextPolicy
            .sendRequest(request)
            .then((res) => handleRedirect(policy, res, currentRetries + 1));
    }
    return Promise.resolve(response);
}
//# sourceMappingURL=redirectPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { HttpPipelineLogLevel } from "../httpPipelineLogLevel";
/**
 * The base class from which all request policies derive.
 */
export class BaseRequestPolicy {
    /**
     * The main method to implement that manipulates a request/response.
     */
    constructor(
    /**
     * The next policy in the pipeline. Each policy is responsible for executing the next one if the request is to continue through the pipeline.
     */
    _nextPolicy, 
    /**
     * The options that can be passed to a given request policy.
     */
    _options) {
        this._nextPolicy = _nextPolicy;
        this._options = _options;
    }
    /**
     * Get whether or not a log with the provided log level should be logged.
     * @param logLevel - The log level of the log that will be logged.
     * @returns Whether or not a log with the provided log level should be logged.
     */
    shouldLog(logLevel) {
        return this._options.shouldLog(logLevel);
    }
    /**
     * Attempt to log the provided message to the provided logger. If no logger was provided or if
     * the log level does not meat the logger's threshold, then nothing will be logged.
     * @param logLevel - The log level of this log.
     * @param message - The message of this log.
     */
    log(logLevel, message) {
        this._options.log(logLevel, message);
    }
}
/**
 * Optional properties that can be used when creating a RequestPolicy.
 */
export class RequestPolicyOptions {
    constructor(_logger) {
        this._logger = _logger;
    }
    /**
     * Get whether or not a log with the provided log level should be logged.
     * @param logLevel - The log level of the log that will be logged.
     * @returns Whether or not a log with the provided log level should be logged.
     */
    shouldLog(logLevel) {
        return (!!this._logger &&
            logLevel !== HttpPipelineLogLevel.OFF &&
            logLevel <= this._logger.minimumLogLevel);
    }
    /**
     * Attempt to log the provided message to the provided logger. If no logger was provided or if
     * the log level does not meet the logger's threshold, then nothing will be logged.
     * @param logLevel - The log level of this log.
     * @param message - The message of this log.
     */
    log(logLevel, message) {
        if (this._logger && this.shouldLog(logLevel)) {
            this._logger.log(logLevel, message);
        }
    }
}
//# sourceMappingURL=requestPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import * as utils from "../util/utils";
import { BaseRequestPolicy, } from "./requestPolicy";
import { delay } from "../util/delay";
export function rpRegistrationPolicy(retryTimeout = 30) {
    return {
        create: (nextPolicy, options) => {
            return new RPRegistrationPolicy(nextPolicy, options, retryTimeout);
        },
    };
}
export class RPRegistrationPolicy extends BaseRequestPolicy {
    constructor(nextPolicy, options, _retryTimeout = 30) {
        super(nextPolicy, options);
        this._retryTimeout = _retryTimeout;
    }
    sendRequest(request) {
        return this._nextPolicy
            .sendRequest(request.clone())
            .then((response) => registerIfNeeded(this, request, response));
    }
}
function registerIfNeeded(policy, request, response) {
    if (response.status === 409) {
        const rpName = checkRPNotRegisteredError(response.bodyAsText);
        if (rpName) {
            const urlPrefix = extractSubscriptionUrl(request.url);
            return (registerRP(policy, urlPrefix, rpName, request)
                // Autoregistration of ${provider} failed for some reason. We will not return this error
                // instead will return the initial response with 409 status code back to the user.
                // do nothing here as we are returning the original response at the end of this method.
                .catch(() => false)
                .then((registrationStatus) => {
                if (registrationStatus) {
                    // Retry the original request. We have to change the x-ms-client-request-id
                    // otherwise Azure endpoint will return the initial 409 (cached) response.
                    request.headers.set("x-ms-client-request-id", utils.generateUuid());
                    return policy._nextPolicy.sendRequest(request.clone());
                }
                return response;
            }));
        }
    }
    return Promise.resolve(response);
}
/**
 * Reuses the headers of the original request and url (if specified).
 * @param originalRequest - The original request
 * @param reuseUrlToo - Should the url from the original request be reused as well. Default false.
 * @returns A new request object with desired headers.
 */
function getRequestEssentials(originalRequest, reuseUrlToo = false) {
    const reqOptions = originalRequest.clone();
    if (reuseUrlToo) {
        reqOptions.url = originalRequest.url;
    }
    // We have to change the x-ms-client-request-id otherwise Azure endpoint
    // will return the initial 409 (cached) response.
    reqOptions.headers.set("x-ms-client-request-id", utils.generateUuid());
    // Set content-type to application/json
    reqOptions.headers.set("Content-Type", "application/json; charset=utf-8");
    return reqOptions;
}
/**
 * Validates the error code and message associated with 409 response status code. If it matches to that of
 * RP not registered then it returns the name of the RP else returns undefined.
 * @param body - The response body received after making the original request.
 * @returns The name of the RP if condition is satisfied else undefined.
 */
function checkRPNotRegisteredError(body) {
    let result, responseBody;
    if (body) {
        try {
            responseBody = JSON.parse(body);
        }
        catch (err) {
            // do nothing;
        }
        if (responseBody &&
            responseBody.error &&
            responseBody.error.message &&
            responseBody.error.code &&
            responseBody.error.code === "MissingSubscriptionRegistration") {
            const matchRes = responseBody.error.message.match(/.*'(.*)'/i);
            if (matchRes) {
                result = matchRes.pop();
            }
        }
    }
    return result;
}
/**
 * Extracts the first part of the URL, just after subscription:
 * https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/
 * @param url - The original request url
 * @returns The url prefix as explained above.
 */
function extractSubscriptionUrl(url) {
    let result;
    const matchRes = url.match(/.*\/subscriptions\/[a-f0-9-]+\//gi);
    if (matchRes && matchRes[0]) {
        result = matchRes[0];
    }
    else {
        throw new Error(`Unable to extract subscriptionId from the given url - ${url}.`);
    }
    return result;
}
/**
 * Registers the given provider.
 * @param policy - The RPRegistrationPolicy this function is being called against.
 * @param urlPrefix - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/
 * @param provider - The provider name to be registered.
 * @param originalRequest - The original request sent by the user that returned a 409 response
 * with a message that the provider is not registered.
 */
async function registerRP(policy, urlPrefix, provider, originalRequest) {
    const postUrl = `${urlPrefix}providers/${provider}/register?api-version=2016-02-01`;
    const getUrl = `${urlPrefix}providers/${provider}?api-version=2016-02-01`;
    const reqOptions = getRequestEssentials(originalRequest);
    reqOptions.method = "POST";
    reqOptions.url = postUrl;
    const response = await policy._nextPolicy.sendRequest(reqOptions);
    if (response.status !== 200) {
        throw new Error(`Autoregistration of ${provider} failed. Please try registering manually.`);
    }
    return getRegistrationStatus(policy, getUrl, originalRequest);
}
/**
 * Polls the registration status of the provider that was registered. Polling happens at an interval of 30 seconds.
 * Polling will happen till the registrationState property of the response body is "Registered".
 * @param policy - The RPRegistrationPolicy this function is being called against.
 * @param url - The request url for polling
 * @param originalRequest - The original request sent by the user that returned a 409 response
 * with a message that the provider is not registered.
 * @returns True if RP Registration is successful.
 */
async function getRegistrationStatus(policy, url, originalRequest) {
    const reqOptions = getRequestEssentials(originalRequest);
    reqOptions.url = url;
    reqOptions.method = "GET";
    const res = await policy._nextPolicy.sendRequest(reqOptions);
    const obj = res.parsedBody;
    if (res.parsedBody && obj.registrationState && obj.registrationState === "Registered") {
        return true;
    }
    else {
        await delay(policy._retryTimeout * 1000);
        return getRegistrationStatus(policy, url, originalRequest);
    }
}
//# sourceMappingURL=rpRegistrationPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { BaseRequestPolicy, } from "./requestPolicy";
/**
 * Creates a policy that signs outgoing requests by calling to the provided `authenticationProvider`'s `signRequest` method.
 * @param authenticationProvider - The authentication provider.
 * @returns An instance of the {@link SigningPolicy}.
 */
export function signingPolicy(authenticationProvider) {
    return {
        create: (nextPolicy, options) => {
            return new SigningPolicy(nextPolicy, options, authenticationProvider);
        },
    };
}
/**
 * A policy that signs outgoing requests by calling to the provided `authenticationProvider`'s `signRequest` method.
 */
export class SigningPolicy extends BaseRequestPolicy {
    constructor(nextPolicy, options, authenticationProvider) {
        super(nextPolicy, options);
        this.authenticationProvider = authenticationProvider;
    }
    signRequest(request) {
        return this.authenticationProvider.signRequest(request);
    }
    sendRequest(request) {
        return this.signRequest(request).then((nextRequest) => this._nextPolicy.sendRequest(nextRequest));
    }
}
//# sourceMappingURL=signingPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { BaseRequestPolicy, } from "./requestPolicy";
import { DEFAULT_CLIENT_MAX_RETRY_INTERVAL, DEFAULT_CLIENT_MIN_RETRY_INTERVAL, DEFAULT_CLIENT_RETRY_COUNT, DEFAULT_CLIENT_RETRY_INTERVAL, isNumber, shouldRetry, updateRetryData, } from "../util/exponentialBackoffStrategy";
import { delay } from "../util/delay";
/**
 * A policy that retries when there's a system error, identified by the codes "ETIMEDOUT", "ESOCKETTIMEDOUT", "ECONNREFUSED", "ECONNRESET" or "ENOENT".
 * @param retryCount - Maximum number of retries.
 * @param retryInterval - The client retry interval, in milliseconds.
 * @param minRetryInterval - The minimum retry interval, in milliseconds.
 * @param maxRetryInterval - The maximum retry interval, in milliseconds.
 * @returns An instance of the {@link SystemErrorRetryPolicy}
 */
export function systemErrorRetryPolicy(retryCount, retryInterval, minRetryInterval, maxRetryInterval) {
    return {
        create: (nextPolicy, options) => {
            return new SystemErrorRetryPolicy(nextPolicy, options, retryCount, retryInterval, minRetryInterval, maxRetryInterval);
        },
    };
}
/**
 * A policy that retries when there's a system error, identified by the codes "ETIMEDOUT", "ESOCKETTIMEDOUT", "ECONNREFUSED", "ECONNRESET" or "ENOENT".
 * @param retryCount - The client retry count.
 * @param retryInterval - The client retry interval, in milliseconds.
 * @param minRetryInterval - The minimum retry interval, in milliseconds.
 * @param maxRetryInterval - The maximum retry interval, in milliseconds.
 */
export class SystemErrorRetryPolicy extends BaseRequestPolicy {
    constructor(nextPolicy, options, retryCount, retryInterval, minRetryInterval, maxRetryInterval) {
        super(nextPolicy, options);
        this.retryCount = isNumber(retryCount) ? retryCount : DEFAULT_CLIENT_RETRY_COUNT;
        this.retryInterval = isNumber(retryInterval) ? retryInterval : DEFAULT_CLIENT_RETRY_INTERVAL;
        this.minRetryInterval = isNumber(minRetryInterval)
            ? minRetryInterval
            : DEFAULT_CLIENT_MIN_RETRY_INTERVAL;
        this.maxRetryInterval = isNumber(maxRetryInterval)
            ? maxRetryInterval
            : DEFAULT_CLIENT_MAX_RETRY_INTERVAL;
    }
    sendRequest(request) {
        return this._nextPolicy
            .sendRequest(request.clone())
            .catch((error) => retry(this, request, error.response, error));
    }
}
async function retry(policy, request, operationResponse, err, retryData) {
    retryData = updateRetryData(policy, retryData, err);
    function shouldPolicyRetry(_response, error) {
        if (error &&
            error.code &&
            (error.code === "ETIMEDOUT" ||
                error.code === "ESOCKETTIMEDOUT" ||
                error.code === "ECONNREFUSED" ||
                error.code === "ECONNRESET" ||
                error.code === "ENOENT")) {
            return true;
        }
        return false;
    }
    if (shouldRetry(policy.retryCount, shouldPolicyRetry, retryData, operationResponse, err)) {
        // If previous operation ended with an error and the policy allows a retry, do that
        try {
            await delay(retryData.retryInterval);
            return policy._nextPolicy.sendRequest(request.clone());
        }
        catch (nestedErr) {
            return retry(policy, request, operationResponse, nestedErr, retryData);
        }
    }
    else {
        if (err) {
            // If the operation failed in the end, return all errors instead of just the last one
            return Promise.reject(retryData.error);
        }
        return operationResponse;
    }
}
//# sourceMappingURL=systemErrorRetryPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { BaseRequestPolicy, } from "./requestPolicy";
import { AbortError } from "@azure/abort-controller";
import { Constants } from "../util/constants";
import { DEFAULT_CLIENT_MAX_RETRY_COUNT } from "../util/throttlingRetryStrategy";
import { delay } from "../util/delay";
const StatusCodes = Constants.HttpConstants.StatusCodes;
/**
 * Creates a policy that re-sends the request if the response indicates the request failed because of throttling reasons.
 * For example, if the response contains a `Retry-After` header, it will retry sending the request based on the value of that header.
 *
 * To learn more, please refer to
 * https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-manager-request-limits,
 * https://docs.microsoft.com/en-us/azure/azure-subscription-service-limits and
 * https://docs.microsoft.com/en-us/azure/virtual-machines/troubleshooting/troubleshooting-throttling-errors
 * @returns
 */
export function throttlingRetryPolicy() {
    return {
        create: (nextPolicy, options) => {
            return new ThrottlingRetryPolicy(nextPolicy, options);
        },
    };
}
const StandardAbortMessage = "The operation was aborted.";
/**
 * Creates a policy that re-sends the request if the response indicates the request failed because of throttling reasons.
 * For example, if the response contains a `Retry-After` header, it will retry sending the request based on the value of that header.
 *
 * To learn more, please refer to
 * https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-manager-request-limits,
 * https://docs.microsoft.com/en-us/azure/azure-subscription-service-limits and
 * https://docs.microsoft.com/en-us/azure/virtual-machines/troubleshooting/troubleshooting-throttling-errors
 */
export class ThrottlingRetryPolicy extends BaseRequestPolicy {
    constructor(nextPolicy, options, _handleResponse) {
        super(nextPolicy, options);
        this.numberOfRetries = 0;
        this._handleResponse = _handleResponse || this._defaultResponseHandler;
    }
    async sendRequest(httpRequest) {
        const response = await this._nextPolicy.sendRequest(httpRequest.clone());
        if (response.status !== StatusCodes.TooManyRequests &&
            response.status !== StatusCodes.ServiceUnavailable) {
            return response;
        }
        else {
            return this._handleResponse(httpRequest, response);
        }
    }
    async _defaultResponseHandler(httpRequest, httpResponse) {
        var _a;
        const retryAfterHeader = httpResponse.headers.get(Constants.HeaderConstants.RETRY_AFTER);
        if (retryAfterHeader) {
            const delayInMs = ThrottlingRetryPolicy.parseRetryAfterHeader(retryAfterHeader);
            if (delayInMs) {
                this.numberOfRetries += 1;
                await delay(delayInMs, undefined, {
                    abortSignal: httpRequest.abortSignal,
                    abortErrorMsg: StandardAbortMessage,
                });
                if ((_a = httpRequest.abortSignal) === null || _a === void 0 ? void 0 : _a.aborted) {
                    throw new AbortError(StandardAbortMessage);
                }
                if (this.numberOfRetries < DEFAULT_CLIENT_MAX_RETRY_COUNT) {
                    return this.sendRequest(httpRequest);
                }
                else {
                    return this._nextPolicy.sendRequest(httpRequest);
                }
            }
        }
        return httpResponse;
    }
    static parseRetryAfterHeader(headerValue) {
        const retryAfterInSeconds = Number(headerValue);
        if (Number.isNaN(retryAfterInSeconds)) {
            return ThrottlingRetryPolicy.parseDateRetryAfterHeader(headerValue);
        }
        else {
            return retryAfterInSeconds * 1000;
        }
    }
    static parseDateRetryAfterHeader(headerValue) {
        try {
            const now = Date.now();
            const date = Date.parse(headerValue);
            const diff = date - now;
            return Number.isNaN(diff) ? undefined : diff;
        }
        catch (error) {
            return undefined;
        }
    }
}
//# sourceMappingURL=throttlingRetryPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { BaseRequestPolicy, } from "./requestPolicy";
import { SpanKind, SpanStatusCode, createSpanFunction, getTraceParentHeader, isSpanContextValid, } from "@azure/core-tracing";
import { logger } from "../log";
const createSpan = createSpanFunction({
    packagePrefix: "",
    namespace: "",
});
/**
 * Creates a policy that wraps outgoing requests with a tracing span.
 * @param tracingOptions - Tracing options.
 * @returns An instance of the {@link TracingPolicy} class.
 */
export function tracingPolicy(tracingOptions = {}) {
    return {
        create(nextPolicy, options) {
            return new TracingPolicy(nextPolicy, options, tracingOptions);
        },
    };
}
/**
 * A policy that wraps outgoing requests with a tracing span.
 */
export class TracingPolicy extends BaseRequestPolicy {
    constructor(nextPolicy, options, tracingOptions) {
        super(nextPolicy, options);
        this.userAgent = tracingOptions.userAgent;
    }
    async sendRequest(request) {
        if (!request.tracingContext) {
            return this._nextPolicy.sendRequest(request);
        }
        const span = this.tryCreateSpan(request);
        if (!span) {
            return this._nextPolicy.sendRequest(request);
        }
        try {
            const response = await this._nextPolicy.sendRequest(request);
            this.tryProcessResponse(span, response);
            return response;
        }
        catch (err) {
            this.tryProcessError(span, err);
            throw err;
        }
    }
    tryCreateSpan(request) {
        var _a;
        try {
            // Passing spanOptions as part of tracingOptions to maintain compatibility @azure/core-tracing@preview.13 and earlier.
            // We can pass this as a separate parameter once we upgrade to the latest core-tracing.
            const { span } = createSpan(`HTTP ${request.method}`, {
                tracingOptions: {
                    spanOptions: Object.assign(Object.assign({}, request.spanOptions), { kind: SpanKind.CLIENT }),
                    tracingContext: request.tracingContext,
                },
            });
            // If the span is not recording, don't do any more work.
            if (!span.isRecording()) {
                span.end();
                return undefined;
            }
            const namespaceFromContext = (_a = request.tracingContext) === null || _a === void 0 ? void 0 : _a.getValue(Symbol.for("az.namespace"));
            if (typeof namespaceFromContext === "string") {
                span.setAttribute("az.namespace", namespaceFromContext);
            }
            span.setAttributes({
                "http.method": request.method,
                "http.url": request.url,
                requestId: request.requestId,
            });
            if (this.userAgent) {
                span.setAttribute("http.user_agent", this.userAgent);
            }
            // set headers
            const spanContext = span.spanContext();
            const traceParentHeader = getTraceParentHeader(spanContext);
            if (traceParentHeader && isSpanContextValid(spanContext)) {
                request.headers.set("traceparent", traceParentHeader);
                const traceState = spanContext.traceState && spanContext.traceState.serialize();
                // if tracestate is set, traceparent MUST be set, so only set tracestate after traceparent
                if (traceState) {
                    request.headers.set("tracestate", traceState);
                }
            }
            return span;
        }
        catch (error) {
            logger.warning(`Skipping creating a tracing span due to an error: ${error.message}`);
            return undefined;
        }
    }
    tryProcessError(span, err) {
        try {
            span.setStatus({
                code: SpanStatusCode.ERROR,
                message: err.message,
            });
            if (err.statusCode) {
                span.setAttribute("http.status_code", err.statusCode);
            }
            span.end();
        }
        catch (error) {
            logger.warning(`Skipping tracing span processing due to an error: ${error.message}`);
        }
    }
    tryProcessResponse(span, response) {
        try {
            span.setAttribute("http.status_code", response.status);
            const serviceRequestId = response.headers.get("x-ms-request-id");
            if (serviceRequestId) {
                span.setAttribute("serviceRequestId", serviceRequestId);
            }
            span.setStatus({
                code: SpanStatusCode.OK,
            });
            span.end();
        }
        catch (error) {
            logger.warning(`Skipping tracing span processing due to an error: ${error.message}`);
        }
    }
}
//# sourceMappingURL=tracingPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { BaseRequestPolicy, } from "./requestPolicy";
import { getDefaultUserAgentKey, getPlatformSpecificData } from "./msRestUserAgentPolicy";
import { Constants } from "../util/constants";
import { HttpHeaders } from "../httpHeaders";
function getRuntimeInfo() {
    const msRestRuntime = {
        key: "core-http",
        value: Constants.coreHttpVersion,
    };
    return [msRestRuntime];
}
function getUserAgentString(telemetryInfo, keySeparator = " ", valueSeparator = "/") {
    return telemetryInfo
        .map((info) => {
        const value = info.value ? `${valueSeparator}${info.value}` : "";
        return `${info.key}${value}`;
    })
        .join(keySeparator);
}
export const getDefaultUserAgentHeaderName = getDefaultUserAgentKey;
/**
 * The default approach to generate user agents.
 * Uses static information from this package, plus system information available from the runtime.
 */
export function getDefaultUserAgentValue() {
    const runtimeInfo = getRuntimeInfo();
    const platformSpecificData = getPlatformSpecificData();
    const userAgent = getUserAgentString(runtimeInfo.concat(platformSpecificData));
    return userAgent;
}
/**
 * Returns a policy that adds the user agent header to outgoing requests based on the given {@link TelemetryInfo}.
 * @param userAgentData - Telemetry information.
 * @returns A new {@link UserAgentPolicy}.
 */
export function userAgentPolicy(userAgentData) {
    const key = !userAgentData || userAgentData.key === undefined || userAgentData.key === null
        ? getDefaultUserAgentKey()
        : userAgentData.key;
    const value = !userAgentData || userAgentData.value === undefined || userAgentData.value === null
        ? getDefaultUserAgentValue()
        : userAgentData.value;
    return {
        create: (nextPolicy, options) => {
            return new UserAgentPolicy(nextPolicy, options, key, value);
        },
    };
}
/**
 * A policy that adds the user agent header to outgoing requests based on the given {@link TelemetryInfo}.
 */
export class UserAgentPolicy extends BaseRequestPolicy {
    constructor(_nextPolicy, _options, headerKey, headerValue) {
        super(_nextPolicy, _options);
        this._nextPolicy = _nextPolicy;
        this._options = _options;
        this.headerKey = headerKey;
        this.headerValue = headerValue;
    }
    sendRequest(request) {
        this.addUserAgentHeader(request);
        return this._nextPolicy.sendRequest(request);
    }
    /**
     * Adds the user agent header to the outgoing request.
     */
    addUserAgentHeader(request) {
        if (!request.headers) {
            request.headers = new HttpHeaders();
        }
        if (!request.headers.get(this.headerKey) && this.headerValue) {
            request.headers.set(this.headerKey, this.headerValue);
        }
    }
}
//# sourceMappingURL=userAgentPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Defines the default token refresh buffer duration.
 */
export const TokenRefreshBufferMs = 2 * 60 * 1000; // 2 Minutes
/**
 * Provides an {@link AccessTokenCache} implementation which clears
 * the cached {@link AccessToken}'s after the expiresOnTimestamp has
 * passed.
 *
 * @deprecated No longer used in the bearer authorization policy.
 */
export class ExpiringAccessTokenCache {
    /**
     * Constructs an instance of {@link ExpiringAccessTokenCache} with
     * an optional expiration buffer time.
     */
    constructor(tokenRefreshBufferMs = TokenRefreshBufferMs) {
        this.cachedToken = undefined;
        this.tokenRefreshBufferMs = tokenRefreshBufferMs;
    }
    /**
     * Saves an access token into the internal in-memory cache.
     * @param accessToken - Access token or undefined to clear the cache.
     */
    setCachedToken(accessToken) {
        this.cachedToken = accessToken;
    }
    /**
     * Returns the cached access token, or `undefined` if one is not cached or the cached one is expiring soon.
     */
    getCachedToken() {
        if (this.cachedToken &&
            Date.now() + this.tokenRefreshBufferMs >= this.cachedToken.expiresOnTimestamp) {
            this.cachedToken = undefined;
        }
        return this.cachedToken;
    }
}
//# sourceMappingURL=accessTokenCache.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Helps the core-http token authentication policies with requesting a new token if we're not currently waiting for a new token.
 *
 * @deprecated No longer used in the bearer authorization policy.
 */
export class AccessTokenRefresher {
    constructor(credential, scopes, requiredMillisecondsBeforeNewRefresh = 30000) {
        this.credential = credential;
        this.scopes = scopes;
        this.requiredMillisecondsBeforeNewRefresh = requiredMillisecondsBeforeNewRefresh;
        this.lastCalled = 0;
    }
    /**
     * Returns true if the required milliseconds(defaulted to 30000) have been passed signifying
     * that we are ready for a new refresh.
     */
    isReady() {
        // We're only ready for a new refresh if the required milliseconds have passed.
        return (!this.lastCalled || Date.now() - this.lastCalled > this.requiredMillisecondsBeforeNewRefresh);
    }
    /**
     * Stores the time in which it is called,
     * then requests a new token,
     * then sets this.promise to undefined,
     * then returns the token.
     */
    async getToken(options) {
        this.lastCalled = Date.now();
        const token = await this.credential.getToken(this.scopes, options);
        this.promise = undefined;
        return token || undefined;
    }
    /**
     * Requests a new token if we're not currently waiting for a new token.
     * Returns null if the required time between each call hasn't been reached.
     */
    refresh(options) {
        if (!this.promise) {
            this.promise = this.getToken(options);
        }
        return this.promise;
    }
}
//# sourceMappingURL=accessTokenRefresher.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { HttpHeaders } from "../httpHeaders";
/**
 * Authenticates to a service using an API key.
 */
export class ApiKeyCredentials {
    /**
     * @param options - Specifies the options to be provided for auth. Either header or query needs to be provided.
     */
    constructor(options) {
        if (!options || (options && !options.inHeader && !options.inQuery)) {
            throw new Error(`options cannot be null or undefined. Either "inHeader" or "inQuery" property of the options object needs to be provided.`);
        }
        this.inHeader = options.inHeader;
        this.inQuery = options.inQuery;
    }
    /**
     * Signs a request with the values provided in the inHeader and inQuery parameter.
     *
     * @param webResource - The WebResourceLike to be signed.
     * @returns The signed request object.
     */
    signRequest(webResource) {
        if (!webResource) {
            return Promise.reject(new Error(`webResource cannot be null or undefined and must be of type "object".`));
        }
        if (this.inHeader) {
            if (!webResource.headers) {
                webResource.headers = new HttpHeaders();
            }
            for (const headerName in this.inHeader) {
                webResource.headers.set(headerName, this.inHeader[headerName]);
            }
        }
        if (this.inQuery) {
            if (!webResource.url) {
                return Promise.reject(new Error(`url cannot be null in the request object.`));
            }
            if (webResource.url.indexOf("?") < 0) {
                webResource.url += "?";
            }
            for (const key in this.inQuery) {
                if (!webResource.url.endsWith("?")) {
                    webResource.url += "&";
                }
                webResource.url += `${key}=${this.inQuery[key]}`;
            }
        }
        return Promise.resolve(webResource);
    }
}
//# sourceMappingURL=apiKeyCredentials.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import * as base64 from "../util/base64";
import { Constants } from "../util/constants";
import { HttpHeaders } from "../httpHeaders";
const HeaderConstants = Constants.HeaderConstants;
const DEFAULT_AUTHORIZATION_SCHEME = "Basic";
/**
 * A simple {@link ServiceClientCredential} that authenticates with a username and a password.
 */
export class BasicAuthenticationCredentials {
    /**
     * Creates a new BasicAuthenticationCredentials object.
     *
     * @param userName - User name.
     * @param password - Password.
     * @param authorizationScheme - The authorization scheme.
     */
    constructor(userName, password, authorizationScheme = DEFAULT_AUTHORIZATION_SCHEME) {
        /**
         * Authorization scheme. Defaults to "Basic".
         * More information about authorization schemes is available here: https://developer.mozilla.org/docs/Web/HTTP/Authentication#authentication_schemes
         */
        this.authorizationScheme = DEFAULT_AUTHORIZATION_SCHEME;
        if (userName === null || userName === undefined || typeof userName.valueOf() !== "string") {
            throw new Error("userName cannot be null or undefined and must be of type string.");
        }
        if (password === null || password === undefined || typeof password.valueOf() !== "string") {
            throw new Error("password cannot be null or undefined and must be of type string.");
        }
        this.userName = userName;
        this.password = password;
        this.authorizationScheme = authorizationScheme;
    }
    /**
     * Signs a request with the Authentication header.
     *
     * @param webResource - The WebResourceLike to be signed.
     * @returns The signed request object.
     */
    signRequest(webResource) {
        const credentials = `${this.userName}:${this.password}`;
        const encodedCredentials = `${this.authorizationScheme} ${base64.encodeString(credentials)}`;
        if (!webResource.headers)
            webResource.headers = new HttpHeaders();
        webResource.headers.set(HeaderConstants.AUTHORIZATION, encodedCredentials);
        return Promise.resolve(webResource);
    }
}
//# sourceMappingURL=basicAuthenticationCredentials.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=credentials.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=serviceClientCredentials.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { ApiKeyCredentials } from "./apiKeyCredentials";
/**
 * A {@link TopicCredentials} object used for Azure Event Grid.
 */
export class TopicCredentials extends ApiKeyCredentials {
    /**
     * Creates a new EventGrid TopicCredentials object.
     *
     * @param topicKey - The EventGrid topic key
     */
    constructor(topicKey) {
        if (!topicKey || (topicKey && typeof topicKey !== "string")) {
            throw new Error("topicKey cannot be null or undefined and must be of type string.");
        }
        const options = {
            inHeader: {
                "aeg-sas-key": topicKey,
            },
        };
        super(options);
    }
}
//# sourceMappingURL=topicCredentials.js.map'use strict';

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

var uuid = require('uuid');
var util = require('util');
var tslib = require('tslib');
var xml2js = require('xml2js');
var abortController = require('@azure/abort-controller');
var logger$1 = require('@azure/logger');
var coreAuth = require('@azure/core-auth');
var os = require('os');
var http = require('http');
var https = require('https');
var tough = require('tough-cookie');
var tunnel = require('tunnel');
var stream = require('stream');
var FormData = require('form-data');
var node_fetch = require('node-fetch');
var coreTracing = require('@azure/core-tracing');

function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }

function _interopNamespace(e) {
    if (e && e.__esModule) return e;
    var n = Object.create(null);
    if (e) {
        Object.keys(e).forEach(function (k) {
            if (k !== 'default') {
                var d = Object.getOwnPropertyDescriptor(e, k);
                Object.defineProperty(n, k, d.get ? d : {
                    enumerable: true,
                    get: function () { return e[k]; }
                });
            }
        });
    }
    n["default"] = e;
    return Object.freeze(n);
}

var xml2js__namespace = /*#__PURE__*/_interopNamespace(xml2js);
var os__namespace = /*#__PURE__*/_interopNamespace(os);
var http__namespace = /*#__PURE__*/_interopNamespace(http);
var https__namespace = /*#__PURE__*/_interopNamespace(https);
var tough__namespace = /*#__PURE__*/_interopNamespace(tough);
var tunnel__namespace = /*#__PURE__*/_interopNamespace(tunnel);
var FormData__default = /*#__PURE__*/_interopDefaultLegacy(FormData);
var node_fetch__default = /*#__PURE__*/_interopDefaultLegacy(node_fetch);

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * A collection of HttpHeaders that can be sent with a HTTP request.
 */
function getHeaderKey(headerName) {
    return headerName.toLowerCase();
}
function isHttpHeadersLike(object) {
    if (object && typeof object === "object") {
        const castObject = object;
        if (typeof castObject.rawHeaders === "function" &&
            typeof castObject.clone === "function" &&
            typeof castObject.get === "function" &&
            typeof castObject.set === "function" &&
            typeof castObject.contains === "function" &&
            typeof castObject.remove === "function" &&
            typeof castObject.headersArray === "function" &&
            typeof castObject.headerValues === "function" &&
            typeof castObject.headerNames === "function" &&
            typeof castObject.toJson === "function") {
            return true;
        }
    }
    return false;
}
/**
 * A collection of HTTP header key/value pairs.
 */
class HttpHeaders {
    constructor(rawHeaders) {
        this._headersMap = {};
        if (rawHeaders) {
            for (const headerName in rawHeaders) {
                this.set(headerName, rawHeaders[headerName]);
            }
        }
    }
    /**
     * Set a header in this collection with the provided name and value. The name is
     * case-insensitive.
     * @param headerName - The name of the header to set. This value is case-insensitive.
     * @param headerValue - The value of the header to set.
     */
    set(headerName, headerValue) {
        this._headersMap[getHeaderKey(headerName)] = {
            name: headerName,
            value: headerValue.toString(),
        };
    }
    /**
     * Get the header value for the provided header name, or undefined if no header exists in this
     * collection with the provided name.
     * @param headerName - The name of the header.
     */
    get(headerName) {
        const header = this._headersMap[getHeaderKey(headerName)];
        return !header ? undefined : header.value;
    }
    /**
     * Get whether or not this header collection contains a header entry for the provided header name.
     */
    contains(headerName) {
        return !!this._headersMap[getHeaderKey(headerName)];
    }
    /**
     * Remove the header with the provided headerName. Return whether or not the header existed and
     * was removed.
     * @param headerName - The name of the header to remove.
     */
    remove(headerName) {
        const result = this.contains(headerName);
        delete this._headersMap[getHeaderKey(headerName)];
        return result;
    }
    /**
     * Get the headers that are contained this collection as an object.
     */
    rawHeaders() {
        return this.toJson({ preserveCase: true });
    }
    /**
     * Get the headers that are contained in this collection as an array.
     */
    headersArray() {
        const headers = [];
        for (const headerKey in this._headersMap) {
            headers.push(this._headersMap[headerKey]);
        }
        return headers;
    }
    /**
     * Get the header names that are contained in this collection.
     */
    headerNames() {
        const headerNames = [];
        const headers = this.headersArray();
        for (let i = 0; i < headers.length; ++i) {
            headerNames.push(headers[i].name);
        }
        return headerNames;
    }
    /**
     * Get the header values that are contained in this collection.
     */
    headerValues() {
        const headerValues = [];
        const headers = this.headersArray();
        for (let i = 0; i < headers.length; ++i) {
            headerValues.push(headers[i].value);
        }
        return headerValues;
    }
    /**
     * Get the JSON object representation of this HTTP header collection.
     */
    toJson(options = {}) {
        const result = {};
        if (options.preserveCase) {
            for (const headerKey in this._headersMap) {
                const header = this._headersMap[headerKey];
                result[header.name] = header.value;
            }
        }
        else {
            for (const headerKey in this._headersMap) {
                const header = this._headersMap[headerKey];
                result[getHeaderKey(header.name)] = header.value;
            }
        }
        return result;
    }
    /**
     * Get the string representation of this HTTP header collection.
     */
    toString() {
        return JSON.stringify(this.toJson({ preserveCase: true }));
    }
    /**
     * Create a deep clone/copy of this HttpHeaders collection.
     */
    clone() {
        const resultPreservingCasing = {};
        for (const headerKey in this._headersMap) {
            const header = this._headersMap[headerKey];
            resultPreservingCasing[header.name] = header.value;
        }
        return new HttpHeaders(resultPreservingCasing);
    }
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Encodes a string in base64 format.
 * @param value - The string to encode
 */
function encodeString(value) {
    return Buffer.from(value).toString("base64");
}
/**
 * Encodes a byte array in base64 format.
 * @param value - The Uint8Aray to encode
 */
function encodeByteArray(value) {
    // Buffer.from accepts <ArrayBuffer> | <SharedArrayBuffer>-- the TypeScript definition is off here
    // https://nodejs.org/api/buffer.html#buffer_class_method_buffer_from_arraybuffer_byteoffset_length
    const bufferValue = value instanceof Buffer ? value : Buffer.from(value.buffer);
    return bufferValue.toString("base64");
}
/**
 * Decodes a base64 string into a byte array.
 * @param value - The base64 string to decode
 */
function decodeString(value) {
    return Buffer.from(value, "base64");
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * A set of constants used internally when processing requests.
 */
const Constants = {
    /**
     * The core-http version
     */
    coreHttpVersion: "2.2.5",
    /**
     * Specifies HTTP.
     */
    HTTP: "http:",
    /**
     * Specifies HTTPS.
     */
    HTTPS: "https:",
    /**
     * Specifies HTTP Proxy.
     */
    HTTP_PROXY: "HTTP_PROXY",
    /**
     * Specifies HTTPS Proxy.
     */
    HTTPS_PROXY: "HTTPS_PROXY",
    /**
     * Specifies NO Proxy.
     */
    NO_PROXY: "NO_PROXY",
    /**
     * Specifies ALL Proxy.
     */
    ALL_PROXY: "ALL_PROXY",
    HttpConstants: {
        /**
         * Http Verbs
         */
        HttpVerbs: {
            PUT: "PUT",
            GET: "GET",
            DELETE: "DELETE",
            POST: "POST",
            MERGE: "MERGE",
            HEAD: "HEAD",
            PATCH: "PATCH",
        },
        StatusCodes: {
            TooManyRequests: 429,
            ServiceUnavailable: 503,
        },
    },
    /**
     * Defines constants for use with HTTP headers.
     */
    HeaderConstants: {
        /**
         * The Authorization header.
         */
        AUTHORIZATION: "authorization",
        AUTHORIZATION_SCHEME: "Bearer",
        /**
         * The Retry-After response-header field can be used with a 503 (Service
         * Unavailable) or 349 (Too Many Requests) responses to indicate how long
         * the service is expected to be unavailable to the requesting client.
         */
        RETRY_AFTER: "Retry-After",
        /**
         * The UserAgent header.
         */
        USER_AGENT: "User-Agent",
    },
};

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Default key used to access the XML attributes.
 */
const XML_ATTRKEY = "$";
/**
 * Default key used to access the XML value content.
 */
const XML_CHARKEY = "_";

// Copyright (c) Microsoft Corporation.
const validUuidRegex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/i;
/**
 * A constant that indicates whether the environment is node.js or browser based.
 */
const isNode = typeof process !== "undefined" &&
    !!process.version &&
    !!process.versions &&
    !!process.versions.node;
/**
 * Encodes an URI.
 *
 * @param uri - The URI to be encoded.
 * @returns The encoded URI.
 */
function encodeUri(uri) {
    return encodeURIComponent(uri)
        .replace(/!/g, "%21")
        .replace(/"/g, "%27")
        .replace(/\(/g, "%28")
        .replace(/\)/g, "%29")
        .replace(/\*/g, "%2A");
}
/**
 * Returns a stripped version of the Http Response which only contains body,
 * headers and the status.
 *
 * @param response - The Http Response
 * @returns The stripped version of Http Response.
 */
function stripResponse(response) {
    const strippedResponse = {};
    strippedResponse.body = response.bodyAsText;
    strippedResponse.headers = response.headers;
    strippedResponse.status = response.status;
    return strippedResponse;
}
/**
 * Returns a stripped version of the Http Request that does not contain the
 * Authorization header.
 *
 * @param request - The Http Request object
 * @returns The stripped version of Http Request.
 */
function stripRequest(request) {
    const strippedRequest = request.clone();
    if (strippedRequest.headers) {
        strippedRequest.headers.remove("authorization");
    }
    return strippedRequest;
}
/**
 * Validates the given uuid as a string
 *
 * @param uuid - The uuid as a string that needs to be validated
 * @returns True if the uuid is valid; false otherwise.
 */
function isValidUuid(uuid) {
    return validUuidRegex.test(uuid);
}
/**
 * Generated UUID
 *
 * @returns RFC4122 v4 UUID.
 */
function generateUuid() {
    return uuid.v4();
}
/**
 * Executes an array of promises sequentially. Inspiration of this method is here:
 * https://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html. An awesome blog on promises!
 *
 * @param promiseFactories - An array of promise factories(A function that return a promise)
 * @param kickstart - Input to the first promise that is used to kickstart the promise chain.
 * If not provided then the promise chain starts with undefined.
 * @returns A chain of resolved or rejected promises
 */
function executePromisesSequentially(promiseFactories, kickstart) {
    let result = Promise.resolve(kickstart);
    promiseFactories.forEach((promiseFactory) => {
        result = result.then(promiseFactory);
    });
    return result;
}
/**
 * Converts a Promise to a callback.
 * @param promise - The Promise to be converted to a callback
 * @returns A function that takes the callback `(cb: Function) => void`
 * @deprecated generated code should instead depend on responseToBody
 */
// eslint-disable-next-line @typescript-eslint/ban-types
function promiseToCallback(promise) {
    if (typeof promise.then !== "function") {
        throw new Error("The provided input is not a Promise.");
    }
    // eslint-disable-next-line @typescript-eslint/ban-types
    return (cb) => {
        promise
            .then((data) => {
            // eslint-disable-next-line promise/no-callback-in-promise
            return cb(undefined, data);
        })
            .catch((err) => {
            // eslint-disable-next-line promise/no-callback-in-promise
            cb(err);
        });
    };
}
/**
 * Converts a Promise to a service callback.
 * @param promise - The Promise of HttpOperationResponse to be converted to a service callback
 * @returns A function that takes the service callback (cb: ServiceCallback<T>): void
 */
function promiseToServiceCallback(promise) {
    if (typeof promise.then !== "function") {
        throw new Error("The provided input is not a Promise.");
    }
    return (cb) => {
        promise
            .then((data) => {
            return process.nextTick(cb, undefined, data.parsedBody, data.request, data);
        })
            .catch((err) => {
            process.nextTick(cb, err);
        });
    };
}
function prepareXMLRootList(obj, elementName, xmlNamespaceKey, xmlNamespace) {
    if (!Array.isArray(obj)) {
        obj = [obj];
    }
    if (!xmlNamespaceKey || !xmlNamespace) {
        return { [elementName]: obj };
    }
    const result = { [elementName]: obj };
    result[XML_ATTRKEY] = { [xmlNamespaceKey]: xmlNamespace };
    return result;
}
/**
 * Applies the properties on the prototype of sourceCtors to the prototype of targetCtor
 * @param targetCtor - The target object on which the properties need to be applied.
 * @param sourceCtors - An array of source objects from which the properties need to be taken.
 */
function applyMixins(targetCtorParam, sourceCtors) {
    const castTargetCtorParam = targetCtorParam;
    sourceCtors.forEach((sourceCtor) => {
        Object.getOwnPropertyNames(sourceCtor.prototype).forEach((name) => {
            castTargetCtorParam.prototype[name] = sourceCtor.prototype[name];
        });
    });
}
const validateISODuration = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;
/**
 * Indicates whether the given string is in ISO 8601 format.
 * @param value - The value to be validated for ISO 8601 duration format.
 * @returns `true` if valid, `false` otherwise.
 */
function isDuration(value) {
    return validateISODuration.test(value);
}
/**
 * Replace all of the instances of searchValue in value with the provided replaceValue.
 * @param value - The value to search and replace in.
 * @param searchValue - The value to search for in the value argument.
 * @param replaceValue - The value to replace searchValue with in the value argument.
 * @returns The value where each instance of searchValue was replaced with replacedValue.
 */
function replaceAll(value, searchValue, replaceValue) {
    return !value || !searchValue ? value : value.split(searchValue).join(replaceValue || "");
}
/**
 * Determines whether the given entity is a basic/primitive type
 * (string, number, boolean, null, undefined).
 * @param value - Any entity
 * @returns true is it is primitive type, false otherwise.
 */
function isPrimitiveType(value) {
    return (typeof value !== "object" && typeof value !== "function") || value === null;
}
function getEnvironmentValue(name) {
    if (process.env[name]) {
        return process.env[name];
    }
    else if (process.env[name.toLowerCase()]) {
        return process.env[name.toLowerCase()];
    }
    return undefined;
}
/**
 * @internal
 * @returns true when input is an object type that is not null, Array, RegExp, or Date.
 */
function isObject(input) {
    return (typeof input === "object" &&
        input !== null &&
        !Array.isArray(input) &&
        !(input instanceof RegExp) &&
        !(input instanceof Date));
}

// Copyright (c) Microsoft Corporation.
// This file contains utility code to serialize and deserialize network operations according to `OperationSpec` objects generated by AutoRest.TypeScript from OpenAPI specifications.
/**
 * Used to map raw response objects to final shapes.
 * Helps packing and unpacking Dates and other encoded types that are not intrinsic to JSON.
 * Also allows pulling values from headers, as well as inserting default values and constants.
 */
class Serializer {
    constructor(
    /**
     * The provided model mapper.
     */
    modelMappers = {}, 
    /**
     * Whether the contents are XML or not.
     */
    isXML) {
        this.modelMappers = modelMappers;
        this.isXML = isXML;
    }
    /**
     * Validates constraints, if any. This function will throw if the provided value does not respect those constraints.
     * @param mapper - The definition of data models.
     * @param value - The value.
     * @param objectName - Name of the object. Used in the error messages.
     */
    validateConstraints(mapper, value, objectName) {
        const failValidation = (constraintName, constraintValue) => {
            throw new Error(`"${objectName}" with value "${value}" should satisfy the constraint "${constraintName}": ${constraintValue}.`);
        };
        if (mapper.constraints && value != undefined) {
            const valueAsNumber = value;
            const { ExclusiveMaximum, ExclusiveMinimum, InclusiveMaximum, InclusiveMinimum, MaxItems, MaxLength, MinItems, MinLength, MultipleOf, Pattern, UniqueItems, } = mapper.constraints;
            if (ExclusiveMaximum != undefined && valueAsNumber >= ExclusiveMaximum) {
                failValidation("ExclusiveMaximum", ExclusiveMaximum);
            }
            if (ExclusiveMinimum != undefined && valueAsNumber <= ExclusiveMinimum) {
                failValidation("ExclusiveMinimum", ExclusiveMinimum);
            }
            if (InclusiveMaximum != undefined && valueAsNumber > InclusiveMaximum) {
                failValidation("InclusiveMaximum", InclusiveMaximum);
            }
            if (InclusiveMinimum != undefined && valueAsNumber < InclusiveMinimum) {
                failValidation("InclusiveMinimum", InclusiveMinimum);
            }
            const valueAsArray = value;
            if (MaxItems != undefined && valueAsArray.length > MaxItems) {
                failValidation("MaxItems", MaxItems);
            }
            if (MaxLength != undefined && valueAsArray.length > MaxLength) {
                failValidation("MaxLength", MaxLength);
            }
            if (MinItems != undefined && valueAsArray.length < MinItems) {
                failValidation("MinItems", MinItems);
            }
            if (MinLength != undefined && valueAsArray.length < MinLength) {
                failValidation("MinLength", MinLength);
            }
            if (MultipleOf != undefined && valueAsNumber % MultipleOf !== 0) {
                failValidation("MultipleOf", MultipleOf);
            }
            if (Pattern) {
                const pattern = typeof Pattern === "string" ? new RegExp(Pattern) : Pattern;
                if (typeof value !== "string" || value.match(pattern) === null) {
                    failValidation("Pattern", Pattern);
                }
            }
            if (UniqueItems &&
                valueAsArray.some((item, i, ar) => ar.indexOf(item) !== i)) {
                failValidation("UniqueItems", UniqueItems);
            }
        }
    }
    /**
     * Serialize the given object based on its metadata defined in the mapper.
     *
     * @param mapper - The mapper which defines the metadata of the serializable object.
     * @param object - A valid Javascript object to be serialized.
     * @param objectName - Name of the serialized object.
     * @param options - additional options to deserialization.
     * @returns A valid serialized Javascript object.
     */
    serialize(mapper, object, objectName, options = {}) {
        var _a, _b, _c;
        const updatedOptions = {
            rootName: (_a = options.rootName) !== null && _a !== void 0 ? _a : "",
            includeRoot: (_b = options.includeRoot) !== null && _b !== void 0 ? _b : false,
            xmlCharKey: (_c = options.xmlCharKey) !== null && _c !== void 0 ? _c : XML_CHARKEY,
        };
        let payload = {};
        const mapperType = mapper.type.name;
        if (!objectName) {
            objectName = mapper.serializedName;
        }
        if (mapperType.match(/^Sequence$/i) !== null) {
            payload = [];
        }
        if (mapper.isConstant) {
            object = mapper.defaultValue;
        }
        // This table of allowed values should help explain
        // the mapper.required and mapper.nullable properties.
        // X means "neither undefined or null are allowed".
        //           || required
        //           || true      | false
        //  nullable || ==========================
        //      true || null      | undefined/null
        //     false || X         | undefined
        // undefined || X         | undefined/null
        const { required, nullable } = mapper;
        if (required && nullable && object === undefined) {
            throw new Error(`${objectName} cannot be undefined.`);
        }
        if (required && !nullable && object == undefined) {
            throw new Error(`${objectName} cannot be null or undefined.`);
        }
        if (!required && nullable === false && object === null) {
            throw new Error(`${objectName} cannot be null.`);
        }
        if (object == undefined) {
            payload = object;
        }
        else {
            // Validate Constraints if any
            this.validateConstraints(mapper, object, objectName);
            if (mapperType.match(/^any$/i) !== null) {
                payload = object;
            }
            else if (mapperType.match(/^(Number|String|Boolean|Object|Stream|Uuid)$/i) !== null) {
                payload = serializeBasicTypes(mapperType, objectName, object);
            }
            else if (mapperType.match(/^Enum$/i) !== null) {
                const enumMapper = mapper;
                payload = serializeEnumType(objectName, enumMapper.type.allowedValues, object);
            }
            else if (mapperType.match(/^(Date|DateTime|TimeSpan|DateTimeRfc1123|UnixTime)$/i) !== null) {
                payload = serializeDateTypes(mapperType, object, objectName);
            }
            else if (mapperType.match(/^ByteArray$/i) !== null) {
                payload = serializeByteArrayType(objectName, object);
            }
            else if (mapperType.match(/^Base64Url$/i) !== null) {
                payload = serializeBase64UrlType(objectName, object);
            }
            else if (mapperType.match(/^Sequence$/i) !== null) {
                payload = serializeSequenceType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions);
            }
            else if (mapperType.match(/^Dictionary$/i) !== null) {
                payload = serializeDictionaryType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions);
            }
            else if (mapperType.match(/^Composite$/i) !== null) {
                payload = serializeCompositeType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions);
            }
        }
        return payload;
    }
    /**
     * Deserialize the given object based on its metadata defined in the mapper.
     *
     * @param mapper - The mapper which defines the metadata of the serializable object.
     * @param responseBody - A valid Javascript entity to be deserialized.
     * @param objectName - Name of the deserialized object.
     * @param options - Controls behavior of XML parser and builder.
     * @returns A valid deserialized Javascript object.
     */
    deserialize(mapper, responseBody, objectName, options = {}) {
        var _a, _b, _c;
        const updatedOptions = {
            rootName: (_a = options.rootName) !== null && _a !== void 0 ? _a : "",
            includeRoot: (_b = options.includeRoot) !== null && _b !== void 0 ? _b : false,
            xmlCharKey: (_c = options.xmlCharKey) !== null && _c !== void 0 ? _c : XML_CHARKEY,
        };
        if (responseBody == undefined) {
            if (this.isXML && mapper.type.name === "Sequence" && !mapper.xmlIsWrapped) {
                // Edge case for empty XML non-wrapped lists. xml2js can't distinguish
                // between the list being empty versus being missing,
                // so let's do the more user-friendly thing and return an empty list.
                responseBody = [];
            }
            // specifically check for undefined as default value can be a falsey value `0, "", false, null`
            if (mapper.defaultValue !== undefined) {
                responseBody = mapper.defaultValue;
            }
            return responseBody;
        }
        let payload;
        const mapperType = mapper.type.name;
        if (!objectName) {
            objectName = mapper.serializedName;
        }
        if (mapperType.match(/^Composite$/i) !== null) {
            payload = deserializeCompositeType(this, mapper, responseBody, objectName, updatedOptions);
        }
        else {
            if (this.isXML) {
                const xmlCharKey = updatedOptions.xmlCharKey;
                const castResponseBody = responseBody;
                /**
                 * If the mapper specifies this as a non-composite type value but the responseBody contains
                 * both header ("$" i.e., XML_ATTRKEY) and body ("#" i.e., XML_CHARKEY) properties,
                 * then just reduce the responseBody value to the body ("#" i.e., XML_CHARKEY) property.
                 */
                if (castResponseBody[XML_ATTRKEY] != undefined &&
                    castResponseBody[xmlCharKey] != undefined) {
                    responseBody = castResponseBody[xmlCharKey];
                }
            }
            if (mapperType.match(/^Number$/i) !== null) {
                payload = parseFloat(responseBody);
                if (isNaN(payload)) {
                    payload = responseBody;
                }
            }
            else if (mapperType.match(/^Boolean$/i) !== null) {
                if (responseBody === "true") {
                    payload = true;
                }
                else if (responseBody === "false") {
                    payload = false;
                }
                else {
                    payload = responseBody;
                }
            }
            else if (mapperType.match(/^(String|Enum|Object|Stream|Uuid|TimeSpan|any)$/i) !== null) {
                payload = responseBody;
            }
            else if (mapperType.match(/^(Date|DateTime|DateTimeRfc1123)$/i) !== null) {
                payload = new Date(responseBody);
            }
            else if (mapperType.match(/^UnixTime$/i) !== null) {
                payload = unixTimeToDate(responseBody);
            }
            else if (mapperType.match(/^ByteArray$/i) !== null) {
                payload = decodeString(responseBody);
            }
            else if (mapperType.match(/^Base64Url$/i) !== null) {
                payload = base64UrlToByteArray(responseBody);
            }
            else if (mapperType.match(/^Sequence$/i) !== null) {
                payload = deserializeSequenceType(this, mapper, responseBody, objectName, updatedOptions);
            }
            else if (mapperType.match(/^Dictionary$/i) !== null) {
                payload = deserializeDictionaryType(this, mapper, responseBody, objectName, updatedOptions);
            }
        }
        if (mapper.isConstant) {
            payload = mapper.defaultValue;
        }
        return payload;
    }
}
function trimEnd(str, ch) {
    let len = str.length;
    while (len - 1 >= 0 && str[len - 1] === ch) {
        --len;
    }
    return str.substr(0, len);
}
function bufferToBase64Url(buffer) {
    if (!buffer) {
        return undefined;
    }
    if (!(buffer instanceof Uint8Array)) {
        throw new Error(`Please provide an input of type Uint8Array for converting to Base64Url.`);
    }
    // Uint8Array to Base64.
    const str = encodeByteArray(buffer);
    // Base64 to Base64Url.
    return trimEnd(str, "=").replace(/\+/g, "-").replace(/\//g, "_");
}
function base64UrlToByteArray(str) {
    if (!str) {
        return undefined;
    }
    if (str && typeof str.valueOf() !== "string") {
        throw new Error("Please provide an input of type string for converting to Uint8Array");
    }
    // Base64Url to Base64.
    str = str.replace(/-/g, "+").replace(/_/g, "/");
    // Base64 to Uint8Array.
    return decodeString(str);
}
function splitSerializeName(prop) {
    const classes = [];
    let partialclass = "";
    if (prop) {
        const subwords = prop.split(".");
        for (const item of subwords) {
            if (item.charAt(item.length - 1) === "\\") {
                partialclass += item.substr(0, item.length - 1) + ".";
            }
            else {
                partialclass += item;
                classes.push(partialclass);
                partialclass = "";
            }
        }
    }
    return classes;
}
function dateToUnixTime(d) {
    if (!d) {
        return undefined;
    }
    if (typeof d.valueOf() === "string") {
        d = new Date(d);
    }
    return Math.floor(d.getTime() / 1000);
}
function unixTimeToDate(n) {
    if (!n) {
        return undefined;
    }
    return new Date(n * 1000);
}
function serializeBasicTypes(typeName, objectName, value) {
    if (value !== null && value !== undefined) {
        if (typeName.match(/^Number$/i) !== null) {
            if (typeof value !== "number") {
                throw new Error(`${objectName} with value ${value} must be of type number.`);
            }
        }
        else if (typeName.match(/^String$/i) !== null) {
            if (typeof value.valueOf() !== "string") {
                throw new Error(`${objectName} with value "${value}" must be of type string.`);
            }
        }
        else if (typeName.match(/^Uuid$/i) !== null) {
            if (!(typeof value.valueOf() === "string" && isValidUuid(value))) {
                throw new Error(`${objectName} with value "${value}" must be of type string and a valid uuid.`);
            }
        }
        else if (typeName.match(/^Boolean$/i) !== null) {
            if (typeof value !== "boolean") {
                throw new Error(`${objectName} with value ${value} must be of type boolean.`);
            }
        }
        else if (typeName.match(/^Stream$/i) !== null) {
            const objectType = typeof value;
            if (objectType !== "string" &&
                objectType !== "function" &&
                !(value instanceof ArrayBuffer) &&
                !ArrayBuffer.isView(value) &&
                !((typeof Blob === "function" || typeof Blob === "object") && value instanceof Blob)) {
                throw new Error(`${objectName} must be a string, Blob, ArrayBuffer, ArrayBufferView, or a function returning NodeJS.ReadableStream.`);
            }
        }
    }
    return value;
}
function serializeEnumType(objectName, allowedValues, value) {
    if (!allowedValues) {
        throw new Error(`Please provide a set of allowedValues to validate ${objectName} as an Enum Type.`);
    }
    const isPresent = allowedValues.some((item) => {
        if (typeof item.valueOf() === "string") {
            return item.toLowerCase() === value.toLowerCase();
        }
        return item === value;
    });
    if (!isPresent) {
        throw new Error(`${value} is not a valid value for ${objectName}. The valid values are: ${JSON.stringify(allowedValues)}.`);
    }
    return value;
}
function serializeByteArrayType(objectName, value) {
    let returnValue = "";
    if (value != undefined) {
        if (!(value instanceof Uint8Array)) {
            throw new Error(`${objectName} must be of type Uint8Array.`);
        }
        returnValue = encodeByteArray(value);
    }
    return returnValue;
}
function serializeBase64UrlType(objectName, value) {
    let returnValue = "";
    if (value != undefined) {
        if (!(value instanceof Uint8Array)) {
            throw new Error(`${objectName} must be of type Uint8Array.`);
        }
        returnValue = bufferToBase64Url(value) || "";
    }
    return returnValue;
}
function serializeDateTypes(typeName, value, objectName) {
    if (value != undefined) {
        if (typeName.match(/^Date$/i) !== null) {
            if (!(value instanceof Date ||
                (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
                throw new Error(`${objectName} must be an instanceof Date or a string in ISO8601 format.`);
            }
            value =
                value instanceof Date
                    ? value.toISOString().substring(0, 10)
                    : new Date(value).toISOString().substring(0, 10);
        }
        else if (typeName.match(/^DateTime$/i) !== null) {
            if (!(value instanceof Date ||
                (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
                throw new Error(`${objectName} must be an instanceof Date or a string in ISO8601 format.`);
            }
            value = value instanceof Date ? value.toISOString() : new Date(value).toISOString();
        }
        else if (typeName.match(/^DateTimeRfc1123$/i) !== null) {
            if (!(value instanceof Date ||
                (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
                throw new Error(`${objectName} must be an instanceof Date or a string in RFC-1123 format.`);
            }
            value = value instanceof Date ? value.toUTCString() : new Date(value).toUTCString();
        }
        else if (typeName.match(/^UnixTime$/i) !== null) {
            if (!(value instanceof Date ||
                (typeof value.valueOf() === "string" && !isNaN(Date.parse(value))))) {
                throw new Error(`${objectName} must be an instanceof Date or a string in RFC-1123/ISO8601 format ` +
                    `for it to be serialized in UnixTime/Epoch format.`);
            }
            value = dateToUnixTime(value);
        }
        else if (typeName.match(/^TimeSpan$/i) !== null) {
            if (!isDuration(value)) {
                throw new Error(`${objectName} must be a string in ISO 8601 format. Instead was "${value}".`);
            }
        }
    }
    return value;
}
function serializeSequenceType(serializer, mapper, object, objectName, isXml, options) {
    if (!Array.isArray(object)) {
        throw new Error(`${objectName} must be of type Array.`);
    }
    const elementType = mapper.type.element;
    if (!elementType || typeof elementType !== "object") {
        throw new Error(`element" metadata for an Array must be defined in the ` +
            `mapper and it must of type "object" in ${objectName}.`);
    }
    const tempArray = [];
    for (let i = 0; i < object.length; i++) {
        const serializedValue = serializer.serialize(elementType, object[i], objectName, options);
        if (isXml && elementType.xmlNamespace) {
            const xmlnsKey = elementType.xmlNamespacePrefix
                ? `xmlns:${elementType.xmlNamespacePrefix}`
                : "xmlns";
            if (elementType.type.name === "Composite") {
                tempArray[i] = Object.assign({}, serializedValue);
                tempArray[i][XML_ATTRKEY] = { [xmlnsKey]: elementType.xmlNamespace };
            }
            else {
                tempArray[i] = {};
                tempArray[i][options.xmlCharKey] = serializedValue;
                tempArray[i][XML_ATTRKEY] = { [xmlnsKey]: elementType.xmlNamespace };
            }
        }
        else {
            tempArray[i] = serializedValue;
        }
    }
    return tempArray;
}
function serializeDictionaryType(serializer, mapper, object, objectName, isXml, options) {
    if (typeof object !== "object") {
        throw new Error(`${objectName} must be of type object.`);
    }
    const valueType = mapper.type.value;
    if (!valueType || typeof valueType !== "object") {
        throw new Error(`"value" metadata for a Dictionary must be defined in the ` +
            `mapper and it must of type "object" in ${objectName}.`);
    }
    const tempDictionary = {};
    for (const key of Object.keys(object)) {
        const serializedValue = serializer.serialize(valueType, object[key], objectName, options);
        // If the element needs an XML namespace we need to add it within the $ property
        tempDictionary[key] = getXmlObjectValue(valueType, serializedValue, isXml, options);
    }
    // Add the namespace to the root element if needed
    if (isXml && mapper.xmlNamespace) {
        const xmlnsKey = mapper.xmlNamespacePrefix ? `xmlns:${mapper.xmlNamespacePrefix}` : "xmlns";
        const result = tempDictionary;
        result[XML_ATTRKEY] = { [xmlnsKey]: mapper.xmlNamespace };
        return result;
    }
    return tempDictionary;
}
/**
 * Resolves the additionalProperties property from a referenced mapper.
 * @param serializer - The serializer containing the entire set of mappers.
 * @param mapper - The composite mapper to resolve.
 * @param objectName - Name of the object being serialized.
 */
function resolveAdditionalProperties(serializer, mapper, objectName) {
    const additionalProperties = mapper.type.additionalProperties;
    if (!additionalProperties && mapper.type.className) {
        const modelMapper = resolveReferencedMapper(serializer, mapper, objectName);
        return modelMapper === null || modelMapper === void 0 ? void 0 : modelMapper.type.additionalProperties;
    }
    return additionalProperties;
}
/**
 * Finds the mapper referenced by `className`.
 * @param serializer - The serializer containing the entire set of mappers
 * @param mapper - The composite mapper to resolve
 * @param objectName - Name of the object being serialized
 */
function resolveReferencedMapper(serializer, mapper, objectName) {
    const className = mapper.type.className;
    if (!className) {
        throw new Error(`Class name for model "${objectName}" is not provided in the mapper "${JSON.stringify(mapper, undefined, 2)}".`);
    }
    return serializer.modelMappers[className];
}
/**
 * Resolves a composite mapper's modelProperties.
 * @param serializer - The serializer containing the entire set of mappers
 * @param mapper - The composite mapper to resolve
 */
function resolveModelProperties(serializer, mapper, objectName) {
    let modelProps = mapper.type.modelProperties;
    if (!modelProps) {
        const modelMapper = resolveReferencedMapper(serializer, mapper, objectName);
        if (!modelMapper) {
            throw new Error(`mapper() cannot be null or undefined for model "${mapper.type.className}".`);
        }
        modelProps = modelMapper === null || modelMapper === void 0 ? void 0 : modelMapper.type.modelProperties;
        if (!modelProps) {
            throw new Error(`modelProperties cannot be null or undefined in the ` +
                `mapper "${JSON.stringify(modelMapper)}" of type "${mapper.type.className}" for object "${objectName}".`);
        }
    }
    return modelProps;
}
function serializeCompositeType(serializer, mapper, object, objectName, isXml, options) {
    if (getPolymorphicDiscriminatorRecursively(serializer, mapper)) {
        mapper = getPolymorphicMapper(serializer, mapper, object, "clientName");
    }
    if (object != undefined) {
        const payload = {};
        const modelProps = resolveModelProperties(serializer, mapper, objectName);
        for (const key of Object.keys(modelProps)) {
            const propertyMapper = modelProps[key];
            if (propertyMapper.readOnly) {
                continue;
            }
            let propName;
            let parentObject = payload;
            if (serializer.isXML) {
                if (propertyMapper.xmlIsWrapped) {
                    propName = propertyMapper.xmlName;
                }
                else {
                    propName = propertyMapper.xmlElementName || propertyMapper.xmlName;
                }
            }
            else {
                const paths = splitSerializeName(propertyMapper.serializedName);
                propName = paths.pop();
                for (const pathName of paths) {
                    const childObject = parentObject[pathName];
                    if (childObject == undefined &&
                        (object[key] != undefined || propertyMapper.defaultValue !== undefined)) {
                        parentObject[pathName] = {};
                    }
                    parentObject = parentObject[pathName];
                }
            }
            if (parentObject != undefined) {
                if (isXml && mapper.xmlNamespace) {
                    const xmlnsKey = mapper.xmlNamespacePrefix
                        ? `xmlns:${mapper.xmlNamespacePrefix}`
                        : "xmlns";
                    parentObject[XML_ATTRKEY] = Object.assign(Object.assign({}, parentObject[XML_ATTRKEY]), { [xmlnsKey]: mapper.xmlNamespace });
                }
                const propertyObjectName = propertyMapper.serializedName !== ""
                    ? objectName + "." + propertyMapper.serializedName
                    : objectName;
                let toSerialize = object[key];
                const polymorphicDiscriminator = getPolymorphicDiscriminatorRecursively(serializer, mapper);
                if (polymorphicDiscriminator &&
                    polymorphicDiscriminator.clientName === key &&
                    toSerialize == undefined) {
                    toSerialize = mapper.serializedName;
                }
                const serializedValue = serializer.serialize(propertyMapper, toSerialize, propertyObjectName, options);
                if (serializedValue !== undefined && propName != undefined) {
                    const value = getXmlObjectValue(propertyMapper, serializedValue, isXml, options);
                    if (isXml && propertyMapper.xmlIsAttribute) {
                        // XML_ATTRKEY, i.e., $ is the key attributes are kept under in xml2js.
                        // This keeps things simple while preventing name collision
                        // with names in user documents.
                        parentObject[XML_ATTRKEY] = parentObject[XML_ATTRKEY] || {};
                        parentObject[XML_ATTRKEY][propName] = serializedValue;
                    }
                    else if (isXml && propertyMapper.xmlIsWrapped) {
                        parentObject[propName] = { [propertyMapper.xmlElementName]: value };
                    }
                    else {
                        parentObject[propName] = value;
                    }
                }
            }
        }
        const additionalPropertiesMapper = resolveAdditionalProperties(serializer, mapper, objectName);
        if (additionalPropertiesMapper) {
            const propNames = Object.keys(modelProps);
            for (const clientPropName in object) {
                const isAdditionalProperty = propNames.every((pn) => pn !== clientPropName);
                if (isAdditionalProperty) {
                    payload[clientPropName] = serializer.serialize(additionalPropertiesMapper, object[clientPropName], objectName + '["' + clientPropName + '"]', options);
                }
            }
        }
        return payload;
    }
    return object;
}
function getXmlObjectValue(propertyMapper, serializedValue, isXml, options) {
    if (!isXml || !propertyMapper.xmlNamespace) {
        return serializedValue;
    }
    const xmlnsKey = propertyMapper.xmlNamespacePrefix
        ? `xmlns:${propertyMapper.xmlNamespacePrefix}`
        : "xmlns";
    const xmlNamespace = { [xmlnsKey]: propertyMapper.xmlNamespace };
    if (["Composite"].includes(propertyMapper.type.name)) {
        if (serializedValue[XML_ATTRKEY]) {
            return serializedValue;
        }
        else {
            const result = Object.assign({}, serializedValue);
            result[XML_ATTRKEY] = xmlNamespace;
            return result;
        }
    }
    const result = {};
    result[options.xmlCharKey] = serializedValue;
    result[XML_ATTRKEY] = xmlNamespace;
    return result;
}
function isSpecialXmlProperty(propertyName, options) {
    return [XML_ATTRKEY, options.xmlCharKey].includes(propertyName);
}
function deserializeCompositeType(serializer, mapper, responseBody, objectName, options) {
    var _a;
    if (getPolymorphicDiscriminatorRecursively(serializer, mapper)) {
        mapper = getPolymorphicMapper(serializer, mapper, responseBody, "serializedName");
    }
    const modelProps = resolveModelProperties(serializer, mapper, objectName);
    let instance = {};
    const handledPropertyNames = [];
    for (const key of Object.keys(modelProps)) {
        const propertyMapper = modelProps[key];
        const paths = splitSerializeName(modelProps[key].serializedName);
        handledPropertyNames.push(paths[0]);
        const { serializedName, xmlName, xmlElementName } = propertyMapper;
        let propertyObjectName = objectName;
        if (serializedName !== "" && serializedName !== undefined) {
            propertyObjectName = objectName + "." + serializedName;
        }
        const headerCollectionPrefix = propertyMapper.headerCollectionPrefix;
        if (headerCollectionPrefix) {
            const dictionary = {};
            for (const headerKey of Object.keys(responseBody)) {
                if (headerKey.startsWith(headerCollectionPrefix)) {
                    dictionary[headerKey.substring(headerCollectionPrefix.length)] = serializer.deserialize(propertyMapper.type.value, responseBody[headerKey], propertyObjectName, options);
                }
                handledPropertyNames.push(headerKey);
            }
            instance[key] = dictionary;
        }
        else if (serializer.isXML) {
            if (propertyMapper.xmlIsAttribute && responseBody[XML_ATTRKEY]) {
                instance[key] = serializer.deserialize(propertyMapper, responseBody[XML_ATTRKEY][xmlName], propertyObjectName, options);
            }
            else {
                const propertyName = xmlElementName || xmlName || serializedName;
                if (propertyMapper.xmlIsWrapped) {
                    /* a list of <xmlElementName> wrapped by <xmlName>
                      For the xml example below
                        <Cors>
                          <CorsRule>...</CorsRule>
                          <CorsRule>...</CorsRule>
                        </Cors>
                      the responseBody has
                        {
                          Cors: {
                            CorsRule: [{...}, {...}]
                          }
                        }
                      xmlName is "Cors" and xmlElementName is"CorsRule".
                    */
                    const wrapped = responseBody[xmlName];
                    const elementList = (_a = wrapped === null || wrapped === void 0 ? void 0 : wrapped[xmlElementName]) !== null && _a !== void 0 ? _a : [];
                    instance[key] = serializer.deserialize(propertyMapper, elementList, propertyObjectName, options);
                }
                else {
                    const property = responseBody[propertyName];
                    instance[key] = serializer.deserialize(propertyMapper, property, propertyObjectName, options);
                }
            }
        }
        else {
            // deserialize the property if it is present in the provided responseBody instance
            let propertyInstance;
            let res = responseBody;
            // traversing the object step by step.
            for (const item of paths) {
                if (!res)
                    break;
                res = res[item];
            }
            propertyInstance = res;
            const polymorphicDiscriminator = mapper.type.polymorphicDiscriminator;
            // checking that the model property name (key)(ex: "fishtype") and the
            // clientName of the polymorphicDiscriminator {metadata} (ex: "fishtype")
            // instead of the serializedName of the polymorphicDiscriminator (ex: "fish.type")
            // is a better approach. The generator is not consistent with escaping '\.' in the
            // serializedName of the property (ex: "fish\.type") that is marked as polymorphic discriminator
            // and the serializedName of the metadata polymorphicDiscriminator (ex: "fish.type"). However,
            // the clientName transformation of the polymorphicDiscriminator (ex: "fishtype") and
            // the transformation of model property name (ex: "fishtype") is done consistently.
            // Hence, it is a safer bet to rely on the clientName of the polymorphicDiscriminator.
            if (polymorphicDiscriminator &&
                key === polymorphicDiscriminator.clientName &&
                propertyInstance == undefined) {
                propertyInstance = mapper.serializedName;
            }
            let serializedValue;
            // paging
            if (Array.isArray(responseBody[key]) && modelProps[key].serializedName === "") {
                propertyInstance = responseBody[key];
                const arrayInstance = serializer.deserialize(propertyMapper, propertyInstance, propertyObjectName, options);
                // Copy over any properties that have already been added into the instance, where they do
                // not exist on the newly de-serialized array
                for (const [k, v] of Object.entries(instance)) {
                    if (!Object.prototype.hasOwnProperty.call(arrayInstance, k)) {
                        arrayInstance[k] = v;
                    }
                }
                instance = arrayInstance;
            }
            else if (propertyInstance !== undefined || propertyMapper.defaultValue !== undefined) {
                serializedValue = serializer.deserialize(propertyMapper, propertyInstance, propertyObjectName, options);
                instance[key] = serializedValue;
            }
        }
    }
    const additionalPropertiesMapper = mapper.type.additionalProperties;
    if (additionalPropertiesMapper) {
        const isAdditionalProperty = (responsePropName) => {
            for (const clientPropName in modelProps) {
                const paths = splitSerializeName(modelProps[clientPropName].serializedName);
                if (paths[0] === responsePropName) {
                    return false;
                }
            }
            return true;
        };
        for (const responsePropName in responseBody) {
            if (isAdditionalProperty(responsePropName)) {
                instance[responsePropName] = serializer.deserialize(additionalPropertiesMapper, responseBody[responsePropName], objectName + '["' + responsePropName + '"]', options);
            }
        }
    }
    else if (responseBody) {
        for (const key of Object.keys(responseBody)) {
            if (instance[key] === undefined &&
                !handledPropertyNames.includes(key) &&
                !isSpecialXmlProperty(key, options)) {
                instance[key] = responseBody[key];
            }
        }
    }
    return instance;
}
function deserializeDictionaryType(serializer, mapper, responseBody, objectName, options) {
    const value = mapper.type.value;
    if (!value || typeof value !== "object") {
        throw new Error(`"value" metadata for a Dictionary must be defined in the ` +
            `mapper and it must of type "object" in ${objectName}`);
    }
    if (responseBody) {
        const tempDictionary = {};
        for (const key of Object.keys(responseBody)) {
            tempDictionary[key] = serializer.deserialize(value, responseBody[key], objectName, options);
        }
        return tempDictionary;
    }
    return responseBody;
}
function deserializeSequenceType(serializer, mapper, responseBody, objectName, options) {
    const element = mapper.type.element;
    if (!element || typeof element !== "object") {
        throw new Error(`element" metadata for an Array must be defined in the ` +
            `mapper and it must of type "object" in ${objectName}`);
    }
    if (responseBody) {
        if (!Array.isArray(responseBody)) {
            // xml2js will interpret a single element array as just the element, so force it to be an array
            responseBody = [responseBody];
        }
        const tempArray = [];
        for (let i = 0; i < responseBody.length; i++) {
            tempArray[i] = serializer.deserialize(element, responseBody[i], `${objectName}[${i}]`, options);
        }
        return tempArray;
    }
    return responseBody;
}
function getPolymorphicMapper(serializer, mapper, object, polymorphicPropertyName) {
    const polymorphicDiscriminator = getPolymorphicDiscriminatorRecursively(serializer, mapper);
    if (polymorphicDiscriminator) {
        const discriminatorName = polymorphicDiscriminator[polymorphicPropertyName];
        if (discriminatorName != undefined) {
            const discriminatorValue = object[discriminatorName];
            if (discriminatorValue != undefined) {
                const typeName = mapper.type.uberParent || mapper.type.className;
                const indexDiscriminator = discriminatorValue === typeName
                    ? discriminatorValue
                    : typeName + "." + discriminatorValue;
                const polymorphicMapper = serializer.modelMappers.discriminators[indexDiscriminator];
                if (polymorphicMapper) {
                    mapper = polymorphicMapper;
                }
            }
        }
    }
    return mapper;
}
function getPolymorphicDiscriminatorRecursively(serializer, mapper) {
    return (mapper.type.polymorphicDiscriminator ||
        getPolymorphicDiscriminatorSafely(serializer, mapper.type.uberParent) ||
        getPolymorphicDiscriminatorSafely(serializer, mapper.type.className));
}
function getPolymorphicDiscriminatorSafely(serializer, typeName) {
    return (typeName &&
        serializer.modelMappers[typeName] &&
        serializer.modelMappers[typeName].type.polymorphicDiscriminator);
}
/**
 * Utility function that serializes an object that might contain binary information into a plain object, array or a string.
 */
function serializeObject(toSerialize) {
    const castToSerialize = toSerialize;
    if (toSerialize == undefined)
        return undefined;
    if (toSerialize instanceof Uint8Array) {
        toSerialize = encodeByteArray(toSerialize);
        return toSerialize;
    }
    else if (toSerialize instanceof Date) {
        return toSerialize.toISOString();
    }
    else if (Array.isArray(toSerialize)) {
        const array = [];
        for (let i = 0; i < toSerialize.length; i++) {
            array.push(serializeObject(toSerialize[i]));
        }
        return array;
    }
    else if (typeof toSerialize === "object") {
        const dictionary = {};
        for (const property in toSerialize) {
            dictionary[property] = serializeObject(castToSerialize[property]);
        }
        return dictionary;
    }
    return toSerialize;
}
/**
 * Utility function to create a K:V from a list of strings
 */
function strEnum(o) {
    const result = {};
    for (const key of o) {
        result[key] = key;
    }
    return result;
}
/**
 * String enum containing the string types of property mappers.
 */
// eslint-disable-next-line @typescript-eslint/no-redeclare
const MapperType = strEnum([
    "Base64Url",
    "Boolean",
    "ByteArray",
    "Composite",
    "Date",
    "DateTime",
    "DateTimeRfc1123",
    "Dictionary",
    "Enum",
    "Number",
    "Object",
    "Sequence",
    "String",
    "Stream",
    "TimeSpan",
    "UnixTime",
]);

// Copyright (c) Microsoft Corporation.
function isWebResourceLike(object) {
    if (object && typeof object === "object") {
        const castObject = object;
        if (typeof castObject.url === "string" &&
            typeof castObject.method === "string" &&
            typeof castObject.headers === "object" &&
            isHttpHeadersLike(castObject.headers) &&
            typeof castObject.validateRequestProperties === "function" &&
            typeof castObject.prepare === "function" &&
            typeof castObject.clone === "function") {
            return true;
        }
    }
    return false;
}
/**
 * Creates a new WebResource object.
 *
 * This class provides an abstraction over a REST call by being library / implementation agnostic and wrapping the necessary
 * properties to initiate a request.
 */
class WebResource {
    constructor(url, method, body, query, headers, streamResponseBody, withCredentials, abortSignal, timeout, onUploadProgress, onDownloadProgress, proxySettings, keepAlive, decompressResponse, streamResponseStatusCodes) {
        this.streamResponseBody = streamResponseBody;
        this.streamResponseStatusCodes = streamResponseStatusCodes;
        this.url = url || "";
        this.method = method || "GET";
        this.headers = isHttpHeadersLike(headers) ? headers : new HttpHeaders(headers);
        this.body = body;
        this.query = query;
        this.formData = undefined;
        this.withCredentials = withCredentials || false;
        this.abortSignal = abortSignal;
        this.timeout = timeout || 0;
        this.onUploadProgress = onUploadProgress;
        this.onDownloadProgress = onDownloadProgress;
        this.proxySettings = proxySettings;
        this.keepAlive = keepAlive;
        this.decompressResponse = decompressResponse;
        this.requestId = this.headers.get("x-ms-client-request-id") || generateUuid();
    }
    /**
     * Validates that the required properties such as method, url, headers["Content-Type"],
     * headers["accept-language"] are defined. It will throw an error if one of the above
     * mentioned properties are not defined.
     */
    validateRequestProperties() {
        if (!this.method) {
            throw new Error("WebResource.method is required.");
        }
        if (!this.url) {
            throw new Error("WebResource.url is required.");
        }
    }
    /**
     * Prepares the request.
     * @param options - Options to provide for preparing the request.
     * @returns Returns the prepared WebResource (HTTP Request) object that needs to be given to the request pipeline.
     */
    prepare(options) {
        if (!options) {
            throw new Error("options object is required");
        }
        if (options.method === undefined ||
            options.method === null ||
            typeof options.method.valueOf() !== "string") {
            throw new Error("options.method must be a string.");
        }
        if (options.url && options.pathTemplate) {
            throw new Error("options.url and options.pathTemplate are mutually exclusive. Please provide exactly one of them.");
        }
        if ((options.pathTemplate === undefined ||
            options.pathTemplate === null ||
            typeof options.pathTemplate.valueOf() !== "string") &&
            (options.url === undefined ||
                options.url === null ||
                typeof options.url.valueOf() !== "string")) {
            throw new Error("Please provide exactly one of options.pathTemplate or options.url.");
        }
        // set the url if it is provided.
        if (options.url) {
            if (typeof options.url !== "string") {
                throw new Error('options.url must be of type "string".');
            }
            this.url = options.url;
        }
        // set the method
        if (options.method) {
            const validMethods = ["GET", "PUT", "HEAD", "DELETE", "OPTIONS", "POST", "PATCH", "TRACE"];
            if (validMethods.indexOf(options.method.toUpperCase()) === -1) {
                throw new Error('The provided method "' +
                    options.method +
                    '" is invalid. Supported HTTP methods are: ' +
                    JSON.stringify(validMethods));
            }
        }
        this.method = options.method.toUpperCase();
        // construct the url if path template is provided
        if (options.pathTemplate) {
            const { pathTemplate, pathParameters } = options;
            if (typeof pathTemplate !== "string") {
                throw new Error('options.pathTemplate must be of type "string".');
            }
            if (!options.baseUrl) {
                options.baseUrl = "https://management.azure.com";
            }
            const baseUrl = options.baseUrl;
            let url = baseUrl +
                (baseUrl.endsWith("/") ? "" : "/") +
                (pathTemplate.startsWith("/") ? pathTemplate.slice(1) : pathTemplate);
            const segments = url.match(/({[\w-]*\s*[\w-]*})/gi);
            if (segments && segments.length) {
                if (!pathParameters) {
                    throw new Error(`pathTemplate: ${pathTemplate} has been provided. Hence, options.pathParameters must also be provided.`);
                }
                segments.forEach(function (item) {
                    const pathParamName = item.slice(1, -1);
                    const pathParam = pathParameters[pathParamName];
                    if (pathParam === null ||
                        pathParam === undefined ||
                        !(typeof pathParam === "string" || typeof pathParam === "object")) {
                        const stringifiedPathParameters = JSON.stringify(pathParameters, undefined, 2);
                        throw new Error(`pathTemplate: ${pathTemplate} contains the path parameter ${pathParamName}` +
                            ` however, it is not present in parameters: ${stringifiedPathParameters}.` +
                            `The value of the path parameter can either be a "string" of the form { ${pathParamName}: "some sample value" } or ` +
                            `it can be an "object" of the form { "${pathParamName}": { value: "some sample value", skipUrlEncoding: true } }.`);
                    }
                    if (typeof pathParam.valueOf() === "string") {
                        url = url.replace(item, encodeURIComponent(pathParam));
                    }
                    if (typeof pathParam.valueOf() === "object") {
                        if (!pathParam.value) {
                            throw new Error(`options.pathParameters[${pathParamName}] is of type "object" but it does not contain a "value" property.`);
                        }
                        if (pathParam.skipUrlEncoding) {
                            url = url.replace(item, pathParam.value);
                        }
                        else {
                            url = url.replace(item, encodeURIComponent(pathParam.value));
                        }
                    }
                });
            }
            this.url = url;
        }
        // append query parameters to the url if they are provided. They can be provided with pathTemplate or url option.
        if (options.queryParameters) {
            const queryParameters = options.queryParameters;
            if (typeof queryParameters !== "object") {
                throw new Error(`options.queryParameters must be of type object. It should be a JSON object ` +
                    `of "query-parameter-name" as the key and the "query-parameter-value" as the value. ` +
                    `The "query-parameter-value" may be fo type "string" or an "object" of the form { value: "query-parameter-value", skipUrlEncoding: true }.`);
            }
            // append question mark if it is not present in the url
            if (this.url && this.url.indexOf("?") === -1) {
                this.url += "?";
            }
            // construct queryString
            const queryParams = [];
            // We need to populate this.query as a dictionary if the request is being used for Sway's validateRequest().
            this.query = {};
            for (const queryParamName in queryParameters) {
                const queryParam = queryParameters[queryParamName];
                if (queryParam) {
                    if (typeof queryParam === "string") {
                        queryParams.push(queryParamName + "=" + encodeURIComponent(queryParam));
                        this.query[queryParamName] = encodeURIComponent(queryParam);
                    }
                    else if (typeof queryParam === "object") {
                        if (!queryParam.value) {
                            throw new Error(`options.queryParameters[${queryParamName}] is of type "object" but it does not contain a "value" property.`);
                        }
                        if (queryParam.skipUrlEncoding) {
                            queryParams.push(queryParamName + "=" + queryParam.value);
                            this.query[queryParamName] = queryParam.value;
                        }
                        else {
                            queryParams.push(queryParamName + "=" + encodeURIComponent(queryParam.value));
                            this.query[queryParamName] = encodeURIComponent(queryParam.value);
                        }
                    }
                }
            } // end-of-for
            // append the queryString
            this.url += queryParams.join("&");
        }
        // add headers to the request if they are provided
        if (options.headers) {
            const headers = options.headers;
            for (const headerName of Object.keys(options.headers)) {
                this.headers.set(headerName, headers[headerName]);
            }
        }
        // ensure accept-language is set correctly
        if (!this.headers.get("accept-language")) {
            this.headers.set("accept-language", "en-US");
        }
        // ensure the request-id is set correctly
        if (!this.headers.get("x-ms-client-request-id") && !options.disableClientRequestId) {
            this.headers.set("x-ms-client-request-id", this.requestId);
        }
        // default
        if (!this.headers.get("Content-Type")) {
            this.headers.set("Content-Type", "application/json; charset=utf-8");
        }
        // set the request body. request.js automatically sets the Content-Length request header, so we need not set it explicitly
        this.body = options.body;
        if (options.body !== undefined && options.body !== null) {
            // body as a stream special case. set the body as-is and check for some special request headers specific to sending a stream.
            if (options.bodyIsStream) {
                if (!this.headers.get("Transfer-Encoding")) {
                    this.headers.set("Transfer-Encoding", "chunked");
                }
                if (this.headers.get("Content-Type") !== "application/octet-stream") {
                    this.headers.set("Content-Type", "application/octet-stream");
                }
            }
            else {
                if (options.serializationMapper) {
                    this.body = new Serializer(options.mappers).serialize(options.serializationMapper, options.body, "requestBody");
                }
                if (!options.disableJsonStringifyOnBody) {
                    this.body = JSON.stringify(options.body);
                }
            }
        }
        if (options.spanOptions) {
            this.spanOptions = options.spanOptions;
        }
        if (options.tracingContext) {
            this.tracingContext = options.tracingContext;
        }
        this.abortSignal = options.abortSignal;
        this.onDownloadProgress = options.onDownloadProgress;
        this.onUploadProgress = options.onUploadProgress;
        return this;
    }
    /**
     * Clone this WebResource HTTP request object.
     * @returns The clone of this WebResource HTTP request object.
     */
    clone() {
        const result = new WebResource(this.url, this.method, this.body, this.query, this.headers && this.headers.clone(), this.streamResponseBody, this.withCredentials, this.abortSignal, this.timeout, this.onUploadProgress, this.onDownloadProgress, this.proxySettings, this.keepAlive, this.decompressResponse, this.streamResponseStatusCodes);
        if (this.formData) {
            result.formData = this.formData;
        }
        if (this.operationSpec) {
            result.operationSpec = this.operationSpec;
        }
        if (this.shouldDeserialize) {
            result.shouldDeserialize = this.shouldDeserialize;
        }
        if (this.operationResponseGetter) {
            result.operationResponseGetter = this.operationResponseGetter;
        }
        return result;
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * A class that handles the query portion of a URLBuilder.
 */
class URLQuery {
    constructor() {
        this._rawQuery = {};
    }
    /**
     * Get whether or not there any query parameters in this URLQuery.
     */
    any() {
        return Object.keys(this._rawQuery).length > 0;
    }
    /**
     * Get the keys of the query string.
     */
    keys() {
        return Object.keys(this._rawQuery);
    }
    /**
     * Set a query parameter with the provided name and value. If the parameterValue is undefined or
     * empty, then this will attempt to remove an existing query parameter with the provided
     * parameterName.
     */
    set(parameterName, parameterValue) {
        const caseParameterValue = parameterValue;
        if (parameterName) {
            if (caseParameterValue !== undefined && caseParameterValue !== null) {
                const newValue = Array.isArray(caseParameterValue)
                    ? caseParameterValue
                    : caseParameterValue.toString();
                this._rawQuery[parameterName] = newValue;
            }
            else {
                delete this._rawQuery[parameterName];
            }
        }
    }
    /**
     * Get the value of the query parameter with the provided name. If no parameter exists with the
     * provided parameter name, then undefined will be returned.
     */
    get(parameterName) {
        return parameterName ? this._rawQuery[parameterName] : undefined;
    }
    /**
     * Get the string representation of this query. The return value will not start with a "?".
     */
    toString() {
        let result = "";
        for (const parameterName in this._rawQuery) {
            if (result) {
                result += "&";
            }
            const parameterValue = this._rawQuery[parameterName];
            if (Array.isArray(parameterValue)) {
                const parameterStrings = [];
                for (const parameterValueElement of parameterValue) {
                    parameterStrings.push(`${parameterName}=${parameterValueElement}`);
                }
                result += parameterStrings.join("&");
            }
            else {
                result += `${parameterName}=${parameterValue}`;
            }
        }
        return result;
    }
    /**
     * Parse a URLQuery from the provided text.
     */
    static parse(text) {
        const result = new URLQuery();
        if (text) {
            if (text.startsWith("?")) {
                text = text.substring(1);
            }
            let currentState = "ParameterName";
            let parameterName = "";
            let parameterValue = "";
            for (let i = 0; i < text.length; ++i) {
                const currentCharacter = text[i];
                switch (currentState) {
                    case "ParameterName":
                        switch (currentCharacter) {
                            case "=":
                                currentState = "ParameterValue";
                                break;
                            case "&":
                                parameterName = "";
                                parameterValue = "";
                                break;
                            default:
                                parameterName += currentCharacter;
                                break;
                        }
                        break;
                    case "ParameterValue":
                        switch (currentCharacter) {
                            case "&":
                                result.set(parameterName, parameterValue);
                                parameterName = "";
                                parameterValue = "";
                                currentState = "ParameterName";
                                break;
                            default:
                                parameterValue += currentCharacter;
                                break;
                        }
                        break;
                    default:
                        throw new Error("Unrecognized URLQuery parse state: " + currentState);
                }
            }
            if (currentState === "ParameterValue") {
                result.set(parameterName, parameterValue);
            }
        }
        return result;
    }
}
/**
 * A class that handles creating, modifying, and parsing URLs.
 */
class URLBuilder {
    /**
     * Set the scheme/protocol for this URL. If the provided scheme contains other parts of a URL
     * (such as a host, port, path, or query), those parts will be added to this URL as well.
     */
    setScheme(scheme) {
        if (!scheme) {
            this._scheme = undefined;
        }
        else {
            this.set(scheme, "SCHEME");
        }
    }
    /**
     * Get the scheme that has been set in this URL.
     */
    getScheme() {
        return this._scheme;
    }
    /**
     * Set the host for this URL. If the provided host contains other parts of a URL (such as a
     * port, path, or query), those parts will be added to this URL as well.
     */
    setHost(host) {
        if (!host) {
            this._host = undefined;
        }
        else {
            this.set(host, "SCHEME_OR_HOST");
        }
    }
    /**
     * Get the host that has been set in this URL.
     */
    getHost() {
        return this._host;
    }
    /**
     * Set the port for this URL. If the provided port contains other parts of a URL (such as a
     * path or query), those parts will be added to this URL as well.
     */
    setPort(port) {
        if (port === undefined || port === null || port === "") {
            this._port = undefined;
        }
        else {
            this.set(port.toString(), "PORT");
        }
    }
    /**
     * Get the port that has been set in this URL.
     */
    getPort() {
        return this._port;
    }
    /**
     * Set the path for this URL. If the provided path contains a query, then it will be added to
     * this URL as well.
     */
    setPath(path) {
        if (!path) {
            this._path = undefined;
        }
        else {
            const schemeIndex = path.indexOf("://");
            if (schemeIndex !== -1) {
                const schemeStart = path.lastIndexOf("/", schemeIndex);
                // Make sure to only grab the URL part of the path before setting the state back to SCHEME
                // this will handle cases such as "/a/b/c/https://microsoft.com" => "https://microsoft.com"
                this.set(schemeStart === -1 ? path : path.substr(schemeStart + 1), "SCHEME");
            }
            else {
                this.set(path, "PATH");
            }
        }
    }
    /**
     * Append the provided path to this URL's existing path. If the provided path contains a query,
     * then it will be added to this URL as well.
     */
    appendPath(path) {
        if (path) {
            let currentPath = this.getPath();
            if (currentPath) {
                if (!currentPath.endsWith("/")) {
                    currentPath += "/";
                }
                if (path.startsWith("/")) {
                    path = path.substring(1);
                }
                path = currentPath + path;
            }
            this.set(path, "PATH");
        }
    }
    /**
     * Get the path that has been set in this URL.
     */
    getPath() {
        return this._path;
    }
    /**
     * Set the query in this URL.
     */
    setQuery(query) {
        if (!query) {
            this._query = undefined;
        }
        else {
            this._query = URLQuery.parse(query);
        }
    }
    /**
     * Set a query parameter with the provided name and value in this URL's query. If the provided
     * query parameter value is undefined or empty, then the query parameter will be removed if it
     * existed.
     */
    setQueryParameter(queryParameterName, queryParameterValue) {
        if (queryParameterName) {
            if (!this._query) {
                this._query = new URLQuery();
            }
            this._query.set(queryParameterName, queryParameterValue);
        }
    }
    /**
     * Get the value of the query parameter with the provided query parameter name. If no query
     * parameter exists with the provided name, then undefined will be returned.
     */
    getQueryParameterValue(queryParameterName) {
        return this._query ? this._query.get(queryParameterName) : undefined;
    }
    /**
     * Get the query in this URL.
     */
    getQuery() {
        return this._query ? this._query.toString() : undefined;
    }
    /**
     * Set the parts of this URL by parsing the provided text using the provided startState.
     */
    set(text, startState) {
        const tokenizer = new URLTokenizer(text, startState);
        while (tokenizer.next()) {
            const token = tokenizer.current();
            let tokenPath;
            if (token) {
                switch (token.type) {
                    case "SCHEME":
                        this._scheme = token.text || undefined;
                        break;
                    case "HOST":
                        this._host = token.text || undefined;
                        break;
                    case "PORT":
                        this._port = token.text || undefined;
                        break;
                    case "PATH":
                        tokenPath = token.text || undefined;
                        if (!this._path || this._path === "/" || tokenPath !== "/") {
                            this._path = tokenPath;
                        }
                        break;
                    case "QUERY":
                        this._query = URLQuery.parse(token.text);
                        break;
                    default:
                        throw new Error(`Unrecognized URLTokenType: ${token.type}`);
                }
            }
        }
    }
    /**
     * Serializes the URL as a string.
     * @returns the URL as a string.
     */
    toString() {
        let result = "";
        if (this._scheme) {
            result += `${this._scheme}://`;
        }
        if (this._host) {
            result += this._host;
        }
        if (this._port) {
            result += `:${this._port}`;
        }
        if (this._path) {
            if (!this._path.startsWith("/")) {
                result += "/";
            }
            result += this._path;
        }
        if (this._query && this._query.any()) {
            result += `?${this._query.toString()}`;
        }
        return result;
    }
    /**
     * If the provided searchValue is found in this URLBuilder, then replace it with the provided
     * replaceValue.
     */
    replaceAll(searchValue, replaceValue) {
        if (searchValue) {
            this.setScheme(replaceAll(this.getScheme(), searchValue, replaceValue));
            this.setHost(replaceAll(this.getHost(), searchValue, replaceValue));
            this.setPort(replaceAll(this.getPort(), searchValue, replaceValue));
            this.setPath(replaceAll(this.getPath(), searchValue, replaceValue));
            this.setQuery(replaceAll(this.getQuery(), searchValue, replaceValue));
        }
    }
    /**
     * Parses a given string URL into a new {@link URLBuilder}.
     */
    static parse(text) {
        const result = new URLBuilder();
        result.set(text, "SCHEME_OR_HOST");
        return result;
    }
}
class URLToken {
    constructor(text, type) {
        this.text = text;
        this.type = type;
    }
    static scheme(text) {
        return new URLToken(text, "SCHEME");
    }
    static host(text) {
        return new URLToken(text, "HOST");
    }
    static port(text) {
        return new URLToken(text, "PORT");
    }
    static path(text) {
        return new URLToken(text, "PATH");
    }
    static query(text) {
        return new URLToken(text, "QUERY");
    }
}
/**
 * Get whether or not the provided character (single character string) is an alphanumeric (letter or
 * digit) character.
 */
function isAlphaNumericCharacter(character) {
    const characterCode = character.charCodeAt(0);
    return ((48 /* '0' */ <= characterCode && characterCode <= 57) /* '9' */ ||
        (65 /* 'A' */ <= characterCode && characterCode <= 90) /* 'Z' */ ||
        (97 /* 'a' */ <= characterCode && characterCode <= 122) /* 'z' */);
}
/**
 * A class that tokenizes URL strings.
 */
class URLTokenizer {
    constructor(_text, state) {
        this._text = _text;
        this._textLength = _text ? _text.length : 0;
        this._currentState = state !== undefined && state !== null ? state : "SCHEME_OR_HOST";
        this._currentIndex = 0;
    }
    /**
     * Get the current URLToken this URLTokenizer is pointing at, or undefined if the URLTokenizer
     * hasn't started or has finished tokenizing.
     */
    current() {
        return this._currentToken;
    }
    /**
     * Advance to the next URLToken and return whether or not a URLToken was found.
     */
    next() {
        if (!hasCurrentCharacter(this)) {
            this._currentToken = undefined;
        }
        else {
            switch (this._currentState) {
                case "SCHEME":
                    nextScheme(this);
                    break;
                case "SCHEME_OR_HOST":
                    nextSchemeOrHost(this);
                    break;
                case "HOST":
                    nextHost(this);
                    break;
                case "PORT":
                    nextPort(this);
                    break;
                case "PATH":
                    nextPath(this);
                    break;
                case "QUERY":
                    nextQuery(this);
                    break;
                default:
                    throw new Error(`Unrecognized URLTokenizerState: ${this._currentState}`);
            }
        }
        return !!this._currentToken;
    }
}
/**
 * Read the remaining characters from this Tokenizer's character stream.
 */
function readRemaining(tokenizer) {
    let result = "";
    if (tokenizer._currentIndex < tokenizer._textLength) {
        result = tokenizer._text.substring(tokenizer._currentIndex);
        tokenizer._currentIndex = tokenizer._textLength;
    }
    return result;
}
/**
 * Whether or not this URLTokenizer has a current character.
 */
function hasCurrentCharacter(tokenizer) {
    return tokenizer._currentIndex < tokenizer._textLength;
}
/**
 * Get the character in the text string at the current index.
 */
function getCurrentCharacter(tokenizer) {
    return tokenizer._text[tokenizer._currentIndex];
}
/**
 * Advance to the character in text that is "step" characters ahead. If no step value is provided,
 * then step will default to 1.
 */
function nextCharacter(tokenizer, step) {
    if (hasCurrentCharacter(tokenizer)) {
        if (!step) {
            step = 1;
        }
        tokenizer._currentIndex += step;
    }
}
/**
 * Starting with the current character, peek "charactersToPeek" number of characters ahead in this
 * Tokenizer's stream of characters.
 */
function peekCharacters(tokenizer, charactersToPeek) {
    let endIndex = tokenizer._currentIndex + charactersToPeek;
    if (tokenizer._textLength < endIndex) {
        endIndex = tokenizer._textLength;
    }
    return tokenizer._text.substring(tokenizer._currentIndex, endIndex);
}
/**
 * Read characters from this Tokenizer until the end of the stream or until the provided condition
 * is false when provided the current character.
 */
function readWhile(tokenizer, condition) {
    let result = "";
    while (hasCurrentCharacter(tokenizer)) {
        const currentCharacter = getCurrentCharacter(tokenizer);
        if (!condition(currentCharacter)) {
            break;
        }
        else {
            result += currentCharacter;
            nextCharacter(tokenizer);
        }
    }
    return result;
}
/**
 * Read characters from this Tokenizer until a non-alphanumeric character or the end of the
 * character stream is reached.
 */
function readWhileLetterOrDigit(tokenizer) {
    return readWhile(tokenizer, (character) => isAlphaNumericCharacter(character));
}
/**
 * Read characters from this Tokenizer until one of the provided terminating characters is read or
 * the end of the character stream is reached.
 */
function readUntilCharacter(tokenizer, ...terminatingCharacters) {
    return readWhile(tokenizer, (character) => terminatingCharacters.indexOf(character) === -1);
}
function nextScheme(tokenizer) {
    const scheme = readWhileLetterOrDigit(tokenizer);
    tokenizer._currentToken = URLToken.scheme(scheme);
    if (!hasCurrentCharacter(tokenizer)) {
        tokenizer._currentState = "DONE";
    }
    else {
        tokenizer._currentState = "HOST";
    }
}
function nextSchemeOrHost(tokenizer) {
    const schemeOrHost = readUntilCharacter(tokenizer, ":", "/", "?");
    if (!hasCurrentCharacter(tokenizer)) {
        tokenizer._currentToken = URLToken.host(schemeOrHost);
        tokenizer._currentState = "DONE";
    }
    else if (getCurrentCharacter(tokenizer) === ":") {
        if (peekCharacters(tokenizer, 3) === "://") {
            tokenizer._currentToken = URLToken.scheme(schemeOrHost);
            tokenizer._currentState = "HOST";
        }
        else {
            tokenizer._currentToken = URLToken.host(schemeOrHost);
            tokenizer._currentState = "PORT";
        }
    }
    else {
        tokenizer._currentToken = URLToken.host(schemeOrHost);
        if (getCurrentCharacter(tokenizer) === "/") {
            tokenizer._currentState = "PATH";
        }
        else {
            tokenizer._currentState = "QUERY";
        }
    }
}
function nextHost(tokenizer) {
    if (peekCharacters(tokenizer, 3) === "://") {
        nextCharacter(tokenizer, 3);
    }
    const host = readUntilCharacter(tokenizer, ":", "/", "?");
    tokenizer._currentToken = URLToken.host(host);
    if (!hasCurrentCharacter(tokenizer)) {
        tokenizer._currentState = "DONE";
    }
    else if (getCurrentCharacter(tokenizer) === ":") {
        tokenizer._currentState = "PORT";
    }
    else if (getCurrentCharacter(tokenizer) === "/") {
        tokenizer._currentState = "PATH";
    }
    else {
        tokenizer._currentState = "QUERY";
    }
}
function nextPort(tokenizer) {
    if (getCurrentCharacter(tokenizer) === ":") {
        nextCharacter(tokenizer);
    }
    const port = readUntilCharacter(tokenizer, "/", "?");
    tokenizer._currentToken = URLToken.port(port);
    if (!hasCurrentCharacter(tokenizer)) {
        tokenizer._currentState = "DONE";
    }
    else if (getCurrentCharacter(tokenizer) === "/") {
        tokenizer._currentState = "PATH";
    }
    else {
        tokenizer._currentState = "QUERY";
    }
}
function nextPath(tokenizer) {
    const path = readUntilCharacter(tokenizer, "?");
    tokenizer._currentToken = URLToken.path(path);
    if (!hasCurrentCharacter(tokenizer)) {
        tokenizer._currentState = "DONE";
    }
    else {
        tokenizer._currentState = "QUERY";
    }
}
function nextQuery(tokenizer) {
    if (getCurrentCharacter(tokenizer) === "?") {
        nextCharacter(tokenizer);
    }
    const query = readRemaining(tokenizer);
    tokenizer._currentToken = URLToken.query(query);
    tokenizer._currentState = "DONE";
}

// Copyright (c) Microsoft Corporation.
function createProxyAgent(requestUrl, proxySettings, headers) {
    const host = URLBuilder.parse(proxySettings.host).getHost();
    if (!host) {
        throw new Error("Expecting a non-empty host in proxy settings.");
    }
    if (!isValidPort(proxySettings.port)) {
        throw new Error("Expecting a valid port number in the range of [0, 65535] in proxy settings.");
    }
    const tunnelOptions = {
        proxy: {
            host: host,
            port: proxySettings.port,
            headers: (headers && headers.rawHeaders()) || {},
        },
    };
    if (proxySettings.username && proxySettings.password) {
        tunnelOptions.proxy.proxyAuth = `${proxySettings.username}:${proxySettings.password}`;
    }
    else if (proxySettings.username) {
        tunnelOptions.proxy.proxyAuth = `${proxySettings.username}`;
    }
    const isRequestHttps = isUrlHttps(requestUrl);
    const isProxyHttps = isUrlHttps(proxySettings.host);
    const proxyAgent = {
        isHttps: isRequestHttps,
        agent: createTunnel(isRequestHttps, isProxyHttps, tunnelOptions),
    };
    return proxyAgent;
}
function isUrlHttps(url) {
    const urlScheme = URLBuilder.parse(url).getScheme() || "";
    return urlScheme.toLowerCase() === "https";
}
function createTunnel(isRequestHttps, isProxyHttps, tunnelOptions) {
    if (isRequestHttps && isProxyHttps) {
        return tunnel__namespace.httpsOverHttps(tunnelOptions);
    }
    else if (isRequestHttps && !isProxyHttps) {
        return tunnel__namespace.httpsOverHttp(tunnelOptions);
    }
    else if (!isRequestHttps && isProxyHttps) {
        return tunnel__namespace.httpOverHttps(tunnelOptions);
    }
    else {
        return tunnel__namespace.httpOverHttp(tunnelOptions);
    }
}
function isValidPort(port) {
    // any port in 0-65535 range is valid (RFC 793) even though almost all implementations
    // will reserve 0 for a specific purpose, and a range of numbers for ephemeral ports
    return 0 <= port && port <= 65535;
}

// Copyright (c) Microsoft Corporation.
const RedactedString = "REDACTED";
const defaultAllowedHeaderNames = [
    "x-ms-client-request-id",
    "x-ms-return-client-request-id",
    "x-ms-useragent",
    "x-ms-correlation-request-id",
    "x-ms-request-id",
    "client-request-id",
    "ms-cv",
    "return-client-request-id",
    "traceparent",
    "Access-Control-Allow-Credentials",
    "Access-Control-Allow-Headers",
    "Access-Control-Allow-Methods",
    "Access-Control-Allow-Origin",
    "Access-Control-Expose-Headers",
    "Access-Control-Max-Age",
    "Access-Control-Request-Headers",
    "Access-Control-Request-Method",
    "Origin",
    "Accept",
    "Accept-Encoding",
    "Cache-Control",
    "Connection",
    "Content-Length",
    "Content-Type",
    "Date",
    "ETag",
    "Expires",
    "If-Match",
    "If-Modified-Since",
    "If-None-Match",
    "If-Unmodified-Since",
    "Last-Modified",
    "Pragma",
    "Request-Id",
    "Retry-After",
    "Server",
    "Transfer-Encoding",
    "User-Agent",
    "WWW-Authenticate",
];
const defaultAllowedQueryParameters = ["api-version"];
class Sanitizer {
    constructor({ allowedHeaderNames = [], allowedQueryParameters = [] } = {}) {
        allowedHeaderNames = Array.isArray(allowedHeaderNames)
            ? defaultAllowedHeaderNames.concat(allowedHeaderNames)
            : defaultAllowedHeaderNames;
        allowedQueryParameters = Array.isArray(allowedQueryParameters)
            ? defaultAllowedQueryParameters.concat(allowedQueryParameters)
            : defaultAllowedQueryParameters;
        this.allowedHeaderNames = new Set(allowedHeaderNames.map((n) => n.toLowerCase()));
        this.allowedQueryParameters = new Set(allowedQueryParameters.map((p) => p.toLowerCase()));
    }
    sanitize(obj) {
        const seen = new Set();
        return JSON.stringify(obj, (key, value) => {
            // Ensure Errors include their interesting non-enumerable members
            if (value instanceof Error) {
                return Object.assign(Object.assign({}, value), { name: value.name, message: value.message });
            }
            if (key === "_headersMap") {
                return this.sanitizeHeaders(value);
            }
            else if (key === "url") {
                return this.sanitizeUrl(value);
            }
            else if (key === "query") {
                return this.sanitizeQuery(value);
            }
            else if (key === "body") {
                // Don't log the request body
                return undefined;
            }
            else if (key === "response") {
                // Don't log response again
                return undefined;
            }
            else if (key === "operationSpec") {
                // When using sendOperationRequest, the request carries a massive
                // field with the autorest spec. No need to log it.
                return undefined;
            }
            else if (Array.isArray(value) || isObject(value)) {
                if (seen.has(value)) {
                    return "[Circular]";
                }
                seen.add(value);
            }
            return value;
        }, 2);
    }
    sanitizeHeaders(value) {
        return this.sanitizeObject(value, this.allowedHeaderNames, (v, k) => v[k].value);
    }
    sanitizeQuery(value) {
        return this.sanitizeObject(value, this.allowedQueryParameters, (v, k) => v[k]);
    }
    sanitizeObject(value, allowedKeys, accessor) {
        if (typeof value !== "object" || value === null) {
            return value;
        }
        const sanitized = {};
        for (const k of Object.keys(value)) {
            if (allowedKeys.has(k.toLowerCase())) {
                sanitized[k] = accessor(value, k);
            }
            else {
                sanitized[k] = RedactedString;
            }
        }
        return sanitized;
    }
    sanitizeUrl(value) {
        if (typeof value !== "string" || value === null) {
            return value;
        }
        const urlBuilder = URLBuilder.parse(value);
        const queryString = urlBuilder.getQuery();
        if (!queryString) {
            return value;
        }
        const query = URLQuery.parse(queryString);
        for (const k of query.keys()) {
            if (!this.allowedQueryParameters.has(k.toLowerCase())) {
                query.set(k, RedactedString);
            }
        }
        urlBuilder.setQuery(query.toString());
        return urlBuilder.toString();
    }
}

// Copyright (c) Microsoft Corporation.
const custom = util.inspect.custom;

// Copyright (c) Microsoft Corporation.
const errorSanitizer = new Sanitizer();
/**
 * An error resulting from an HTTP request to a service endpoint.
 */
class RestError extends Error {
    constructor(message, code, statusCode, request, response) {
        super(message);
        this.name = "RestError";
        this.code = code;
        this.statusCode = statusCode;
        this.request = request;
        this.response = response;
        Object.setPrototypeOf(this, RestError.prototype);
    }
    /**
     * Logging method for util.inspect in Node
     */
    [custom]() {
        return `RestError: ${this.message} \n ${errorSanitizer.sanitize(this)}`;
    }
}
/**
 * A constant string to identify errors that may arise when making an HTTP request that indicates an issue with the transport layer (e.g. the hostname of the URL cannot be resolved via DNS.)
 */
RestError.REQUEST_SEND_ERROR = "REQUEST_SEND_ERROR";
/**
 * A constant string to identify errors that may arise from parsing an incoming HTTP response. Usually indicates a malformed HTTP body, such as an encoded JSON payload that is incomplete.
 */
RestError.PARSE_ERROR = "PARSE_ERROR";

// Copyright (c) Microsoft Corporation.
const logger = logger$1.createClientLogger("core-http");

// Copyright (c) Microsoft Corporation.
function getCachedAgent(isHttps, agentCache) {
    return isHttps ? agentCache.httpsAgent : agentCache.httpAgent;
}
class ReportTransform extends stream.Transform {
    constructor(progressCallback) {
        super();
        this.progressCallback = progressCallback;
        this.loadedBytes = 0;
    }
    _transform(chunk, _encoding, callback) {
        this.push(chunk);
        this.loadedBytes += chunk.length;
        this.progressCallback({ loadedBytes: this.loadedBytes });
        callback(undefined);
    }
}
function isReadableStream(body) {
    return body && typeof body.pipe === "function";
}
function isStreamComplete(stream, aborter) {
    return new Promise((resolve) => {
        stream.once("close", () => {
            aborter === null || aborter === void 0 ? void 0 : aborter.abort();
            resolve();
        });
        stream.once("end", resolve);
        stream.once("error", resolve);
    });
}
/**
 * Transforms a set of headers into the key/value pair defined by {@link HttpHeadersLike}
 */
function parseHeaders(headers) {
    const httpHeaders = new HttpHeaders();
    headers.forEach((value, key) => {
        httpHeaders.set(key, value);
    });
    return httpHeaders;
}
/**
 * An HTTP client that uses `node-fetch`.
 */
class NodeFetchHttpClient {
    constructor() {
        // a mapping of proxy settings string `${host}:${port}:${username}:${password}` to agent
        this.proxyAgentMap = new Map();
        this.keepAliveAgents = {};
        this.cookieJar = new tough__namespace.CookieJar(undefined, { looseMode: true });
    }
    /**
     * Provides minimum viable error handling and the logic that executes the abstract methods.
     * @param httpRequest - Object representing the outgoing HTTP request.
     * @returns An object representing the incoming HTTP response.
     */
    async sendRequest(httpRequest) {
        var _a;
        if (!httpRequest && typeof httpRequest !== "object") {
            throw new Error("'httpRequest' (WebResourceLike) cannot be null or undefined and must be of type object.");
        }
        const abortController$1 = new abortController.AbortController();
        let abortListener;
        if (httpRequest.abortSignal) {
            if (httpRequest.abortSignal.aborted) {
                throw new abortController.AbortError("The operation was aborted.");
            }
            abortListener = (event) => {
                if (event.type === "abort") {
                    abortController$1.abort();
                }
            };
            httpRequest.abortSignal.addEventListener("abort", abortListener);
        }
        if (httpRequest.timeout) {
            setTimeout(() => {
                abortController$1.abort();
            }, httpRequest.timeout);
        }
        if (httpRequest.formData) {
            const formData = httpRequest.formData;
            const requestForm = new FormData__default["default"]();
            const appendFormValue = (key, value) => {
                // value function probably returns a stream so we can provide a fresh stream on each retry
                if (typeof value === "function") {
                    value = value();
                }
                if (value &&
                    Object.prototype.hasOwnProperty.call(value, "value") &&
                    Object.prototype.hasOwnProperty.call(value, "options")) {
                    requestForm.append(key, value.value, value.options);
                }
                else {
                    requestForm.append(key, value);
                }
            };
            for (const formKey of Object.keys(formData)) {
                const formValue = formData[formKey];
                if (Array.isArray(formValue)) {
                    for (let j = 0; j < formValue.length; j++) {
                        appendFormValue(formKey, formValue[j]);
                    }
                }
                else {
                    appendFormValue(formKey, formValue);
                }
            }
            httpRequest.body = requestForm;
            httpRequest.formData = undefined;
            const contentType = httpRequest.headers.get("Content-Type");
            if (contentType && contentType.indexOf("multipart/form-data") !== -1) {
                if (typeof requestForm.getBoundary === "function") {
                    httpRequest.headers.set("Content-Type", `multipart/form-data; boundary=${requestForm.getBoundary()}`);
                }
                else {
                    // browser will automatically apply a suitable content-type header
                    httpRequest.headers.remove("Content-Type");
                }
            }
        }
        let body = httpRequest.body
            ? typeof httpRequest.body === "function"
                ? httpRequest.body()
                : httpRequest.body
            : undefined;
        if (httpRequest.onUploadProgress && httpRequest.body) {
            const onUploadProgress = httpRequest.onUploadProgress;
            const uploadReportStream = new ReportTransform(onUploadProgress);
            if (isReadableStream(body)) {
                body.pipe(uploadReportStream);
            }
            else {
                uploadReportStream.end(body);
            }
            body = uploadReportStream;
        }
        const platformSpecificRequestInit = await this.prepareRequest(httpRequest);
        const requestInit = Object.assign({ body: body, headers: httpRequest.headers.rawHeaders(), method: httpRequest.method, signal: abortController$1.signal, redirect: "manual" }, platformSpecificRequestInit);
        let operationResponse;
        try {
            const response = await this.fetch(httpRequest.url, requestInit);
            const headers = parseHeaders(response.headers);
            const streaming = ((_a = httpRequest.streamResponseStatusCodes) === null || _a === void 0 ? void 0 : _a.has(response.status)) ||
                httpRequest.streamResponseBody;
            operationResponse = {
                headers: headers,
                request: httpRequest,
                status: response.status,
                readableStreamBody: streaming
                    ? response.body
                    : undefined,
                bodyAsText: !streaming ? await response.text() : undefined,
            };
            const onDownloadProgress = httpRequest.onDownloadProgress;
            if (onDownloadProgress) {
                const responseBody = response.body || undefined;
                if (isReadableStream(responseBody)) {
                    const downloadReportStream = new ReportTransform(onDownloadProgress);
                    responseBody.pipe(downloadReportStream);
                    operationResponse.readableStreamBody = downloadReportStream;
                }
                else {
                    const length = parseInt(headers.get("Content-Length")) || undefined;
                    if (length) {
                        // Calling callback for non-stream response for consistency with browser
                        onDownloadProgress({ loadedBytes: length });
                    }
                }
            }
            await this.processRequest(operationResponse);
            return operationResponse;
        }
        catch (error) {
            const fetchError = error;
            if (fetchError.code === "ENOTFOUND") {
                throw new RestError(fetchError.message, RestError.REQUEST_SEND_ERROR, undefined, httpRequest);
            }
            else if (fetchError.type === "aborted") {
                throw new abortController.AbortError("The operation was aborted.");
            }
            throw fetchError;
        }
        finally {
            // clean up event listener
            if (httpRequest.abortSignal && abortListener) {
                let uploadStreamDone = Promise.resolve();
                if (isReadableStream(body)) {
                    uploadStreamDone = isStreamComplete(body);
                }
                let downloadStreamDone = Promise.resolve();
                if (isReadableStream(operationResponse === null || operationResponse === void 0 ? void 0 : operationResponse.readableStreamBody)) {
                    downloadStreamDone = isStreamComplete(operationResponse.readableStreamBody, abortController$1);
                }
                Promise.all([uploadStreamDone, downloadStreamDone])
                    .then(() => {
                    var _a;
                    (_a = httpRequest.abortSignal) === null || _a === void 0 ? void 0 : _a.removeEventListener("abort", abortListener);
                    return;
                })
                    .catch((e) => {
                    logger.warning("Error when cleaning up abortListener on httpRequest", e);
                });
            }
        }
    }
    getOrCreateAgent(httpRequest) {
        var _a;
        const isHttps = isUrlHttps(httpRequest.url);
        // At the moment, proxy settings and keepAlive are mutually
        // exclusive because the 'tunnel' library currently lacks the
        // ability to create a proxy with keepAlive turned on.
        if (httpRequest.proxySettings) {
            const { host, port, username, password } = httpRequest.proxySettings;
            const key = `${host}:${port}:${username}:${password}`;
            const proxyAgents = (_a = this.proxyAgentMap.get(key)) !== null && _a !== void 0 ? _a : {};
            let agent = getCachedAgent(isHttps, proxyAgents);
            if (agent) {
                return agent;
            }
            const tunnel = createProxyAgent(httpRequest.url, httpRequest.proxySettings, httpRequest.headers);
            agent = tunnel.agent;
            if (tunnel.isHttps) {
                proxyAgents.httpsAgent = tunnel.agent;
            }
            else {
                proxyAgents.httpAgent = tunnel.agent;
            }
            this.proxyAgentMap.set(key, proxyAgents);
            return agent;
        }
        else if (httpRequest.keepAlive) {
            let agent = getCachedAgent(isHttps, this.keepAliveAgents);
            if (agent) {
                return agent;
            }
            const agentOptions = {
                keepAlive: httpRequest.keepAlive,
            };
            if (isHttps) {
                agent = this.keepAliveAgents.httpsAgent = new https__namespace.Agent(agentOptions);
            }
            else {
                agent = this.keepAliveAgents.httpAgent = new http__namespace.Agent(agentOptions);
            }
            return agent;
        }
        else {
            return isHttps ? https__namespace.globalAgent : http__namespace.globalAgent;
        }
    }
    /**
     * Uses `node-fetch` to perform the request.
     */
    // eslint-disable-next-line @azure/azure-sdk/ts-apisurface-standardized-verbs
    async fetch(input, init) {
        return node_fetch__default["default"](input, init);
    }
    /**
     * Prepares a request based on the provided web resource.
     */
    async prepareRequest(httpRequest) {
        const requestInit = {};
        if (this.cookieJar && !httpRequest.headers.get("Cookie")) {
            const cookieString = await new Promise((resolve, reject) => {
                this.cookieJar.getCookieString(httpRequest.url, (err, cookie) => {
                    if (err) {
                        reject(err);
                    }
                    else {
                        resolve(cookie);
                    }
                });
            });
            httpRequest.headers.set("Cookie", cookieString);
        }
        // Set the http(s) agent
        requestInit.agent = this.getOrCreateAgent(httpRequest);
        requestInit.compress = httpRequest.decompressResponse;
        return requestInit;
    }
    /**
     * Process an HTTP response. Handles persisting a cookie for subsequent requests if the response has a "Set-Cookie" header.
     */
    async processRequest(operationResponse) {
        if (this.cookieJar) {
            const setCookieHeader = operationResponse.headers.get("Set-Cookie");
            if (setCookieHeader !== undefined) {
                await new Promise((resolve, reject) => {
                    this.cookieJar.setCookie(setCookieHeader, operationResponse.request.url, { ignoreError: true }, (err) => {
                        if (err) {
                            reject(err);
                        }
                        else {
                            resolve();
                        }
                    });
                });
            }
        }
    }
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * The different levels of logs that can be used with the HttpPipelineLogger.
 */
exports.HttpPipelineLogLevel = void 0;
(function (HttpPipelineLogLevel) {
    /**
     * A log level that indicates that no logs will be logged.
     */
    HttpPipelineLogLevel[HttpPipelineLogLevel["OFF"] = 0] = "OFF";
    /**
     * An error log.
     */
    HttpPipelineLogLevel[HttpPipelineLogLevel["ERROR"] = 1] = "ERROR";
    /**
     * A warning log.
     */
    HttpPipelineLogLevel[HttpPipelineLogLevel["WARNING"] = 2] = "WARNING";
    /**
     * An information log.
     */
    HttpPipelineLogLevel[HttpPipelineLogLevel["INFO"] = 3] = "INFO";
})(exports.HttpPipelineLogLevel || (exports.HttpPipelineLogLevel = {}));

// Copyright (c) Microsoft Corporation.
/**
 * Converts an OperationOptions to a RequestOptionsBase
 *
 * @param opts - OperationOptions object to convert to RequestOptionsBase
 */
function operationOptionsToRequestOptionsBase(opts) {
    const { requestOptions, tracingOptions } = opts, additionalOptions = tslib.__rest(opts, ["requestOptions", "tracingOptions"]);
    let result = additionalOptions;
    if (requestOptions) {
        result = Object.assign(Object.assign({}, result), requestOptions);
    }
    if (tracingOptions) {
        result.tracingContext = tracingOptions.tracingContext;
        // By passing spanOptions if they exist at runtime, we're backwards compatible with @azure/core-tracing@preview.13 and earlier.
        result.spanOptions = tracingOptions === null || tracingOptions === void 0 ? void 0 : tracingOptions.spanOptions;
    }
    return result;
}

// Copyright (c) Microsoft Corporation.
/**
 * The base class from which all request policies derive.
 */
class BaseRequestPolicy {
    /**
     * The main method to implement that manipulates a request/response.
     */
    constructor(
    /**
     * The next policy in the pipeline. Each policy is responsible for executing the next one if the request is to continue through the pipeline.
     */
    _nextPolicy, 
    /**
     * The options that can be passed to a given request policy.
     */
    _options) {
        this._nextPolicy = _nextPolicy;
        this._options = _options;
    }
    /**
     * Get whether or not a log with the provided log level should be logged.
     * @param logLevel - The log level of the log that will be logged.
     * @returns Whether or not a log with the provided log level should be logged.
     */
    shouldLog(logLevel) {
        return this._options.shouldLog(logLevel);
    }
    /**
     * Attempt to log the provided message to the provided logger. If no logger was provided or if
     * the log level does not meat the logger's threshold, then nothing will be logged.
     * @param logLevel - The log level of this log.
     * @param message - The message of this log.
     */
    log(logLevel, message) {
        this._options.log(logLevel, message);
    }
}
/**
 * Optional properties that can be used when creating a RequestPolicy.
 */
class RequestPolicyOptions {
    constructor(_logger) {
        this._logger = _logger;
    }
    /**
     * Get whether or not a log with the provided log level should be logged.
     * @param logLevel - The log level of the log that will be logged.
     * @returns Whether or not a log with the provided log level should be logged.
     */
    shouldLog(logLevel) {
        return (!!this._logger &&
            logLevel !== exports.HttpPipelineLogLevel.OFF &&
            logLevel <= this._logger.minimumLogLevel);
    }
    /**
     * Attempt to log the provided message to the provided logger. If no logger was provided or if
     * the log level does not meet the logger's threshold, then nothing will be logged.
     * @param logLevel - The log level of this log.
     * @param message - The message of this log.
     */
    log(logLevel, message) {
        if (this._logger && this.shouldLog(logLevel)) {
            this._logger.log(logLevel, message);
        }
    }
}

// Copyright (c) Microsoft Corporation.
// Note: The reason we re-define all of the xml2js default settings (version 2.0) here is because the default settings object exposed
// by the xm2js library is mutable. See https://github.com/Leonidas-from-XIV/node-xml2js/issues/536
// By creating a new copy of the settings each time we instantiate the parser,
// we are safeguarding against the possibility of the default settings being mutated elsewhere unintentionally.
const xml2jsDefaultOptionsV2 = {
    explicitCharkey: false,
    trim: false,
    normalize: false,
    normalizeTags: false,
    attrkey: XML_ATTRKEY,
    explicitArray: true,
    ignoreAttrs: false,
    mergeAttrs: false,
    explicitRoot: true,
    validator: undefined,
    xmlns: false,
    explicitChildren: false,
    preserveChildrenOrder: false,
    childkey: "$$",
    charsAsChildren: false,
    includeWhiteChars: false,
    async: false,
    strict: true,
    attrNameProcessors: undefined,
    attrValueProcessors: undefined,
    tagNameProcessors: undefined,
    valueProcessors: undefined,
    rootName: "root",
    xmldec: {
        version: "1.0",
        encoding: "UTF-8",
        standalone: true,
    },
    doctype: undefined,
    renderOpts: {
        pretty: true,
        indent: "  ",
        newline: "\n",
    },
    headless: false,
    chunkSize: 10000,
    emptyTag: "",
    cdata: false,
};
// The xml2js settings for general XML parsing operations.
const xml2jsParserSettings = Object.assign({}, xml2jsDefaultOptionsV2);
xml2jsParserSettings.explicitArray = false;
// The xml2js settings for general XML building operations.
const xml2jsBuilderSettings = Object.assign({}, xml2jsDefaultOptionsV2);
xml2jsBuilderSettings.explicitArray = false;
xml2jsBuilderSettings.renderOpts = {
    pretty: false,
};
/**
 * Converts given JSON object to XML string
 * @param obj - JSON object to be converted into XML string
 * @param opts - Options that govern the parsing of given JSON object
 */
function stringifyXML(obj, opts = {}) {
    var _a;
    xml2jsBuilderSettings.rootName = opts.rootName;
    xml2jsBuilderSettings.charkey = (_a = opts.xmlCharKey) !== null && _a !== void 0 ? _a : XML_CHARKEY;
    const builder = new xml2js__namespace.Builder(xml2jsBuilderSettings);
    return builder.buildObject(obj);
}
/**
 * Converts given XML string into JSON
 * @param str - String containing the XML content to be parsed into JSON
 * @param opts - Options that govern the parsing of given xml string
 */
function parseXML(str, opts = {}) {
    var _a;
    xml2jsParserSettings.explicitRoot = !!opts.includeRoot;
    xml2jsParserSettings.charkey = (_a = opts.xmlCharKey) !== null && _a !== void 0 ? _a : XML_CHARKEY;
    const xmlParser = new xml2js__namespace.Parser(xml2jsParserSettings);
    return new Promise((resolve, reject) => {
        if (!str) {
            reject(new Error("Document is empty"));
        }
        else {
            xmlParser.parseString(str, (err, res) => {
                if (err) {
                    reject(err);
                }
                else {
                    resolve(res);
                }
            });
        }
    });
}

// Copyright (c) Microsoft Corporation.
/**
 * Create a new serialization RequestPolicyCreator that will serialized HTTP request bodies as they
 * pass through the HTTP pipeline.
 */
function deserializationPolicy(deserializationContentTypes, parsingOptions) {
    return {
        create: (nextPolicy, options) => {
            return new DeserializationPolicy(nextPolicy, options, deserializationContentTypes, parsingOptions);
        },
    };
}
const defaultJsonContentTypes = ["application/json", "text/json"];
const defaultXmlContentTypes = ["application/xml", "application/atom+xml"];
const DefaultDeserializationOptions = {
    expectedContentTypes: {
        json: defaultJsonContentTypes,
        xml: defaultXmlContentTypes,
    },
};
/**
 * A RequestPolicy that will deserialize HTTP response bodies and headers as they pass through the
 * HTTP pipeline.
 */
class DeserializationPolicy extends BaseRequestPolicy {
    constructor(nextPolicy, requestPolicyOptions, deserializationContentTypes, parsingOptions = {}) {
        var _a;
        super(nextPolicy, requestPolicyOptions);
        this.jsonContentTypes =
            (deserializationContentTypes && deserializationContentTypes.json) || defaultJsonContentTypes;
        this.xmlContentTypes =
            (deserializationContentTypes && deserializationContentTypes.xml) || defaultXmlContentTypes;
        this.xmlCharKey = (_a = parsingOptions.xmlCharKey) !== null && _a !== void 0 ? _a : XML_CHARKEY;
    }
    async sendRequest(request) {
        return this._nextPolicy.sendRequest(request).then((response) => deserializeResponseBody(this.jsonContentTypes, this.xmlContentTypes, response, {
            xmlCharKey: this.xmlCharKey,
        }));
    }
}
function getOperationResponse(parsedResponse) {
    let result;
    const request = parsedResponse.request;
    const operationSpec = request.operationSpec;
    if (operationSpec) {
        const operationResponseGetter = request.operationResponseGetter;
        if (!operationResponseGetter) {
            result = operationSpec.responses[parsedResponse.status];
        }
        else {
            result = operationResponseGetter(operationSpec, parsedResponse);
        }
    }
    return result;
}
function shouldDeserializeResponse(parsedResponse) {
    const shouldDeserialize = parsedResponse.request.shouldDeserialize;
    let result;
    if (shouldDeserialize === undefined) {
        result = true;
    }
    else if (typeof shouldDeserialize === "boolean") {
        result = shouldDeserialize;
    }
    else {
        result = shouldDeserialize(parsedResponse);
    }
    return result;
}
/**
 * Given a particular set of content types to parse as either JSON or XML, consumes the HTTP response to produce the result object defined by the request's {@link OperationSpec}.
 * @param jsonContentTypes - Response content types to parse the body as JSON.
 * @param xmlContentTypes  - Response content types to parse the body as XML.
 * @param response - HTTP Response from the pipeline.
 * @param options  - Options to the serializer, mostly for configuring the XML parser if needed.
 * @returns A parsed {@link HttpOperationResponse} object that can be returned by the {@link ServiceClient}.
 */
function deserializeResponseBody(jsonContentTypes, xmlContentTypes, response, options = {}) {
    var _a, _b, _c;
    const updatedOptions = {
        rootName: (_a = options.rootName) !== null && _a !== void 0 ? _a : "",
        includeRoot: (_b = options.includeRoot) !== null && _b !== void 0 ? _b : false,
        xmlCharKey: (_c = options.xmlCharKey) !== null && _c !== void 0 ? _c : XML_CHARKEY,
    };
    return parse(jsonContentTypes, xmlContentTypes, response, updatedOptions).then((parsedResponse) => {
        if (!shouldDeserializeResponse(parsedResponse)) {
            return parsedResponse;
        }
        const operationSpec = parsedResponse.request.operationSpec;
        if (!operationSpec || !operationSpec.responses) {
            return parsedResponse;
        }
        const responseSpec = getOperationResponse(parsedResponse);
        const { error, shouldReturnResponse } = handleErrorResponse(parsedResponse, operationSpec, responseSpec);
        if (error) {
            throw error;
        }
        else if (shouldReturnResponse) {
            return parsedResponse;
        }
        // An operation response spec does exist for current status code, so
        // use it to deserialize the response.
        if (responseSpec) {
            if (responseSpec.bodyMapper) {
                let valueToDeserialize = parsedResponse.parsedBody;
                if (operationSpec.isXML && responseSpec.bodyMapper.type.name === MapperType.Sequence) {
                    valueToDeserialize =
                        typeof valueToDeserialize === "object"
                            ? valueToDeserialize[responseSpec.bodyMapper.xmlElementName]
                            : [];
                }
                try {
                    parsedResponse.parsedBody = operationSpec.serializer.deserialize(responseSpec.bodyMapper, valueToDeserialize, "operationRes.parsedBody", options);
                }
                catch (innerError) {
                    const restError = new RestError(`Error ${innerError} occurred in deserializing the responseBody - ${parsedResponse.bodyAsText}`, undefined, parsedResponse.status, parsedResponse.request, parsedResponse);
                    throw restError;
                }
            }
            else if (operationSpec.httpMethod === "HEAD") {
                // head methods never have a body, but we return a boolean to indicate presence/absence of the resource
                parsedResponse.parsedBody = response.status >= 200 && response.status < 300;
            }
            if (responseSpec.headersMapper) {
                parsedResponse.parsedHeaders = operationSpec.serializer.deserialize(responseSpec.headersMapper, parsedResponse.headers.rawHeaders(), "operationRes.parsedHeaders", options);
            }
        }
        return parsedResponse;
    });
}
function isOperationSpecEmpty(operationSpec) {
    const expectedStatusCodes = Object.keys(operationSpec.responses);
    return (expectedStatusCodes.length === 0 ||
        (expectedStatusCodes.length === 1 && expectedStatusCodes[0] === "default"));
}
function handleErrorResponse(parsedResponse, operationSpec, responseSpec) {
    var _a;
    const isSuccessByStatus = 200 <= parsedResponse.status && parsedResponse.status < 300;
    const isExpectedStatusCode = isOperationSpecEmpty(operationSpec)
        ? isSuccessByStatus
        : !!responseSpec;
    if (isExpectedStatusCode) {
        if (responseSpec) {
            if (!responseSpec.isError) {
                return { error: null, shouldReturnResponse: false };
            }
        }
        else {
            return { error: null, shouldReturnResponse: false };
        }
    }
    const errorResponseSpec = responseSpec !== null && responseSpec !== void 0 ? responseSpec : operationSpec.responses.default;
    const streaming = ((_a = parsedResponse.request.streamResponseStatusCodes) === null || _a === void 0 ? void 0 : _a.has(parsedResponse.status)) ||
        parsedResponse.request.streamResponseBody;
    const initialErrorMessage = streaming
        ? `Unexpected status code: ${parsedResponse.status}`
        : parsedResponse.bodyAsText;
    const error = new RestError(initialErrorMessage, undefined, parsedResponse.status, parsedResponse.request, parsedResponse);
    // If the item failed but there's no error spec or default spec to deserialize the error,
    // we should fail so we just throw the parsed response
    if (!errorResponseSpec) {
        throw error;
    }
    const defaultBodyMapper = errorResponseSpec.bodyMapper;
    const defaultHeadersMapper = errorResponseSpec.headersMapper;
    try {
        // If error response has a body, try to deserialize it using default body mapper.
        // Then try to extract error code & message from it
        if (parsedResponse.parsedBody) {
            const parsedBody = parsedResponse.parsedBody;
            let parsedError;
            if (defaultBodyMapper) {
                let valueToDeserialize = parsedBody;
                if (operationSpec.isXML && defaultBodyMapper.type.name === MapperType.Sequence) {
                    valueToDeserialize =
                        typeof parsedBody === "object" ? parsedBody[defaultBodyMapper.xmlElementName] : [];
                }
                parsedError = operationSpec.serializer.deserialize(defaultBodyMapper, valueToDeserialize, "error.response.parsedBody");
            }
            const internalError = parsedBody.error || parsedError || parsedBody;
            error.code = internalError.code;
            if (internalError.message) {
                error.message = internalError.message;
            }
            if (defaultBodyMapper) {
                error.response.parsedBody = parsedError;
            }
        }
        // If error response has headers, try to deserialize it using default header mapper
        if (parsedResponse.headers && defaultHeadersMapper) {
            error.response.parsedHeaders = operationSpec.serializer.deserialize(defaultHeadersMapper, parsedResponse.headers.rawHeaders(), "operationRes.parsedHeaders");
        }
    }
    catch (defaultError) {
        error.message = `Error "${defaultError.message}" occurred in deserializing the responseBody - "${parsedResponse.bodyAsText}" for the default response.`;
    }
    return { error, shouldReturnResponse: false };
}
function parse(jsonContentTypes, xmlContentTypes, operationResponse, opts) {
    var _a;
    const errorHandler = (err) => {
        const msg = `Error "${err}" occurred while parsing the response body - ${operationResponse.bodyAsText}.`;
        const errCode = err.code || RestError.PARSE_ERROR;
        const e = new RestError(msg, errCode, operationResponse.status, operationResponse.request, operationResponse);
        return Promise.reject(e);
    };
    const streaming = ((_a = operationResponse.request.streamResponseStatusCodes) === null || _a === void 0 ? void 0 : _a.has(operationResponse.status)) ||
        operationResponse.request.streamResponseBody;
    if (!streaming && operationResponse.bodyAsText) {
        const text = operationResponse.bodyAsText;
        const contentType = operationResponse.headers.get("Content-Type") || "";
        const contentComponents = !contentType
            ? []
            : contentType.split(";").map((component) => component.toLowerCase());
        if (contentComponents.length === 0 ||
            contentComponents.some((component) => jsonContentTypes.indexOf(component) !== -1)) {
            return new Promise((resolve) => {
                operationResponse.parsedBody = JSON.parse(text);
                resolve(operationResponse);
            }).catch(errorHandler);
        }
        else if (contentComponents.some((component) => xmlContentTypes.indexOf(component) !== -1)) {
            return parseXML(text, opts)
                .then((body) => {
                operationResponse.parsedBody = body;
                return operationResponse;
            })
                .catch(errorHandler);
        }
    }
    return Promise.resolve(operationResponse);
}

// Copyright (c) Microsoft Corporation.
/**
 * By default, HTTP connections are maintained for future requests.
 */
const DefaultKeepAliveOptions = {
    enable: true,
};
/**
 * Creates a policy that controls whether HTTP connections are maintained on future requests.
 * @param keepAliveOptions - Keep alive options. By default, HTTP connections are maintained for future requests.
 * @returns An instance of the {@link KeepAlivePolicy}
 */
function keepAlivePolicy(keepAliveOptions) {
    return {
        create: (nextPolicy, options) => {
            return new KeepAlivePolicy(nextPolicy, options, keepAliveOptions || DefaultKeepAliveOptions);
        },
    };
}
/**
 * KeepAlivePolicy is a policy used to control keep alive settings for every request.
 */
class KeepAlivePolicy extends BaseRequestPolicy {
    /**
     * Creates an instance of KeepAlivePolicy.
     *
     * @param nextPolicy -
     * @param options -
     * @param keepAliveOptions -
     */
    constructor(nextPolicy, options, keepAliveOptions) {
        super(nextPolicy, options);
        this.keepAliveOptions = keepAliveOptions;
    }
    /**
     * Sends out request.
     *
     * @param request -
     * @returns
     */
    async sendRequest(request) {
        request.keepAlive = this.keepAliveOptions.enable;
        return this._nextPolicy.sendRequest(request);
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * Methods that are allowed to follow redirects 301 and 302
 */
const allowedRedirect = ["GET", "HEAD"];
const DefaultRedirectOptions = {
    handleRedirects: true,
    maxRetries: 20,
};
/**
 * Creates a redirect policy, which sends a repeats the request to a new destination if a response arrives with a "location" header, and a status code between 300 and 307.
 * @param maximumRetries - Maximum number of redirects to follow.
 * @returns An instance of the {@link RedirectPolicy}
 */
function redirectPolicy(maximumRetries = 20) {
    return {
        create: (nextPolicy, options) => {
            return new RedirectPolicy(nextPolicy, options, maximumRetries);
        },
    };
}
/**
 * Resends the request to a new destination if a response arrives with a "location" header, and a status code between 300 and 307.
 */
class RedirectPolicy extends BaseRequestPolicy {
    constructor(nextPolicy, options, maxRetries = 20) {
        super(nextPolicy, options);
        this.maxRetries = maxRetries;
    }
    sendRequest(request) {
        return this._nextPolicy
            .sendRequest(request)
            .then((response) => handleRedirect(this, response, 0));
    }
}
function handleRedirect(policy, response, currentRetries) {
    const { request, status } = response;
    const locationHeader = response.headers.get("location");
    if (locationHeader &&
        (status === 300 ||
            (status === 301 && allowedRedirect.includes(request.method)) ||
            (status === 302 && allowedRedirect.includes(request.method)) ||
            (status === 303 && request.method === "POST") ||
            status === 307) &&
        (!policy.maxRetries || currentRetries < policy.maxRetries)) {
        const builder = URLBuilder.parse(request.url);
        builder.setPath(locationHeader);
        request.url = builder.toString();
        // POST request with Status code 303 should be converted into a
        // redirected GET request if the redirect url is present in the location header
        if (status === 303) {
            request.method = "GET";
            delete request.body;
        }
        return policy._nextPolicy
            .sendRequest(request)
            .then((res) => handleRedirect(policy, res, currentRetries + 1));
    }
    return Promise.resolve(response);
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
const DEFAULT_CLIENT_RETRY_COUNT = 3;
// intervals are in ms
const DEFAULT_CLIENT_RETRY_INTERVAL = 1000 * 30;
const DEFAULT_CLIENT_MAX_RETRY_INTERVAL = 1000 * 90;
const DEFAULT_CLIENT_MIN_RETRY_INTERVAL = 1000 * 3;
function isNumber(n) {
    return typeof n === "number";
}
/**
 * @internal
 * Determines if the operation should be retried.
 *
 * @param retryLimit - Specifies the max number of retries.
 * @param predicate - Initial chekck on whether to retry based on given responses or errors
 * @param retryData -  The retry data.
 * @returns True if the operation qualifies for a retry; false otherwise.
 */
function shouldRetry(retryLimit, predicate, retryData, response, error) {
    if (!predicate(response, error)) {
        return false;
    }
    return retryData.retryCount < retryLimit;
}
/**
 * @internal
 * Updates the retry data for the next attempt.
 *
 * @param retryOptions - specifies retry interval, and its lower bound and upper bound.
 * @param retryData -  The retry data.
 * @param err - The operation"s error, if any.
 */
function updateRetryData(retryOptions, retryData = { retryCount: 0, retryInterval: 0 }, err) {
    if (err) {
        if (retryData.error) {
            err.innerError = retryData.error;
        }
        retryData.error = err;
    }
    // Adjust retry count
    retryData.retryCount++;
    // Adjust retry interval
    let incrementDelta = Math.pow(2, retryData.retryCount - 1) - 1;
    const boundedRandDelta = retryOptions.retryInterval * 0.8 +
        Math.floor(Math.random() * (retryOptions.retryInterval * 0.4));
    incrementDelta *= boundedRandDelta;
    retryData.retryInterval = Math.min(retryOptions.minRetryInterval + incrementDelta, retryOptions.maxRetryInterval);
    return retryData;
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Helper TypeGuard that checks if the value is not null or undefined.
 * @param thing - Anything
 * @internal
 */
function isDefined(thing) {
    return typeof thing !== "undefined" && thing !== null;
}

// Copyright (c) Microsoft Corporation.
const StandardAbortMessage$1 = "The operation was aborted.";
/**
 * A wrapper for setTimeout that resolves a promise after delayInMs milliseconds.
 * @param delayInMs - The number of milliseconds to be delayed.
 * @param value - The value to be resolved with after a timeout of t milliseconds.
 * @param options - The options for delay - currently abort options
 *   @param abortSignal - The abortSignal associated with containing operation.
 *   @param abortErrorMsg - The abort error message associated with containing operation.
 * @returns - Resolved promise
 */
function delay(delayInMs, value, options) {
    return new Promise((resolve, reject) => {
        let timer = undefined;
        let onAborted = undefined;
        const rejectOnAbort = () => {
            return reject(new abortController.AbortError((options === null || options === void 0 ? void 0 : options.abortErrorMsg) ? options === null || options === void 0 ? void 0 : options.abortErrorMsg : StandardAbortMessage$1));
        };
        const removeListeners = () => {
            if ((options === null || options === void 0 ? void 0 : options.abortSignal) && onAborted) {
                options.abortSignal.removeEventListener("abort", onAborted);
            }
        };
        onAborted = () => {
            if (isDefined(timer)) {
                clearTimeout(timer);
            }
            removeListeners();
            return rejectOnAbort();
        };
        if ((options === null || options === void 0 ? void 0 : options.abortSignal) && options.abortSignal.aborted) {
            return rejectOnAbort();
        }
        timer = setTimeout(() => {
            removeListeners();
            resolve(value);
        }, delayInMs);
        if (options === null || options === void 0 ? void 0 : options.abortSignal) {
            options.abortSignal.addEventListener("abort", onAborted);
        }
    });
}

// Copyright (c) Microsoft Corporation.
/**
 * Policy that retries the request as many times as configured for as long as the max retry time interval specified, each retry waiting longer to begin than the last time.
 * @param retryCount - Maximum number of retries.
 * @param retryInterval - Base time between retries.
 * @param maxRetryInterval - Maximum time to wait between retries.
 */
function exponentialRetryPolicy(retryCount, retryInterval, maxRetryInterval) {
    return {
        create: (nextPolicy, options) => {
            return new ExponentialRetryPolicy(nextPolicy, options, retryCount, retryInterval, maxRetryInterval);
        },
    };
}
/**
 * Describes the Retry Mode type. Currently supporting only Exponential.
 */
exports.RetryMode = void 0;
(function (RetryMode) {
    /**
     * Currently supported retry mode.
     * Each time a retry happens, it will take exponentially more time than the last time.
     */
    RetryMode[RetryMode["Exponential"] = 0] = "Exponential";
})(exports.RetryMode || (exports.RetryMode = {}));
const DefaultRetryOptions = {
    maxRetries: DEFAULT_CLIENT_RETRY_COUNT,
    retryDelayInMs: DEFAULT_CLIENT_RETRY_INTERVAL,
    maxRetryDelayInMs: DEFAULT_CLIENT_MAX_RETRY_INTERVAL,
};
/**
 * Instantiates a new "ExponentialRetryPolicyFilter" instance.
 */
class ExponentialRetryPolicy extends BaseRequestPolicy {
    /**
     * @param nextPolicy - The next RequestPolicy in the pipeline chain.
     * @param options - The options for this RequestPolicy.
     * @param retryCount - The client retry count.
     * @param retryInterval - The client retry interval, in milliseconds.
     * @param minRetryInterval - The minimum retry interval, in milliseconds.
     * @param maxRetryInterval - The maximum retry interval, in milliseconds.
     */
    constructor(nextPolicy, options, retryCount, retryInterval, maxRetryInterval) {
        super(nextPolicy, options);
        this.retryCount = isNumber(retryCount) ? retryCount : DEFAULT_CLIENT_RETRY_COUNT;
        this.retryInterval = isNumber(retryInterval) ? retryInterval : DEFAULT_CLIENT_RETRY_INTERVAL;
        this.maxRetryInterval = isNumber(maxRetryInterval)
            ? maxRetryInterval
            : DEFAULT_CLIENT_MAX_RETRY_INTERVAL;
    }
    sendRequest(request) {
        return this._nextPolicy
            .sendRequest(request.clone())
            .then((response) => retry$1(this, request, response))
            .catch((error) => retry$1(this, request, error.response, undefined, error));
    }
}
async function retry$1(policy, request, response, retryData, requestError) {
    function shouldPolicyRetry(responseParam) {
        const statusCode = responseParam === null || responseParam === void 0 ? void 0 : responseParam.status;
        if (statusCode === 503 && (response === null || response === void 0 ? void 0 : response.headers.get(Constants.HeaderConstants.RETRY_AFTER))) {
            return false;
        }
        if (statusCode === undefined ||
            (statusCode < 500 && statusCode !== 408) ||
            statusCode === 501 ||
            statusCode === 505) {
            return false;
        }
        return true;
    }
    retryData = updateRetryData({
        retryInterval: policy.retryInterval,
        minRetryInterval: 0,
        maxRetryInterval: policy.maxRetryInterval,
    }, retryData, requestError);
    const isAborted = request.abortSignal && request.abortSignal.aborted;
    if (!isAborted && shouldRetry(policy.retryCount, shouldPolicyRetry, retryData, response)) {
        logger.info(`Retrying request in ${retryData.retryInterval}`);
        try {
            await delay(retryData.retryInterval);
            const res = await policy._nextPolicy.sendRequest(request.clone());
            return retry$1(policy, request, res, retryData);
        }
        catch (err) {
            return retry$1(policy, request, response, retryData, err);
        }
    }
    else if (isAborted || requestError || !response) {
        // If the operation failed in the end, return all errors instead of just the last one
        const err = retryData.error ||
            new RestError("Failed to send the request.", RestError.REQUEST_SEND_ERROR, response && response.status, response && response.request, response);
        throw err;
    }
    else {
        return response;
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * Creates a policy that logs information about the outgoing request and the incoming responses.
 * @param loggingOptions - Logging options.
 * @returns An instance of the {@link LogPolicy}
 */
function logPolicy(loggingOptions = {}) {
    return {
        create: (nextPolicy, options) => {
            return new LogPolicy(nextPolicy, options, loggingOptions);
        },
    };
}
/**
 * A policy that logs information about the outgoing request and the incoming responses.
 */
class LogPolicy extends BaseRequestPolicy {
    constructor(nextPolicy, options, { logger: logger$1 = logger.info, allowedHeaderNames = [], allowedQueryParameters = [], } = {}) {
        super(nextPolicy, options);
        this.logger = logger$1;
        this.sanitizer = new Sanitizer({ allowedHeaderNames, allowedQueryParameters });
    }
    /**
     * Header names whose values will be logged when logging is enabled. Defaults to
     * Date, traceparent, x-ms-client-request-id, and x-ms-request id.  Any headers
     * specified in this field will be added to that list.  Any other values will
     * be written to logs as "REDACTED".
     * @deprecated Pass these into the constructor instead.
     */
    get allowedHeaderNames() {
        return this.sanitizer.allowedHeaderNames;
    }
    /**
     * Header names whose values will be logged when logging is enabled. Defaults to
     * Date, traceparent, x-ms-client-request-id, and x-ms-request id.  Any headers
     * specified in this field will be added to that list.  Any other values will
     * be written to logs as "REDACTED".
     * @deprecated Pass these into the constructor instead.
     */
    set allowedHeaderNames(allowedHeaderNames) {
        this.sanitizer.allowedHeaderNames = allowedHeaderNames;
    }
    /**
     * Query string names whose values will be logged when logging is enabled. By default no
     * query string values are logged.
     * @deprecated Pass these into the constructor instead.
     */
    get allowedQueryParameters() {
        return this.sanitizer.allowedQueryParameters;
    }
    /**
     * Query string names whose values will be logged when logging is enabled. By default no
     * query string values are logged.
     * @deprecated Pass these into the constructor instead.
     */
    set allowedQueryParameters(allowedQueryParameters) {
        this.sanitizer.allowedQueryParameters = allowedQueryParameters;
    }
    sendRequest(request) {
        if (!this.logger.enabled)
            return this._nextPolicy.sendRequest(request);
        this.logRequest(request);
        return this._nextPolicy.sendRequest(request).then((response) => this.logResponse(response));
    }
    logRequest(request) {
        this.logger(`Request: ${this.sanitizer.sanitize(request)}`);
    }
    logResponse(response) {
        this.logger(`Response status code: ${response.status}`);
        this.logger(`Headers: ${this.sanitizer.sanitize(response.headers)}`);
        return response;
    }
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Get the path to this parameter's value as a dotted string (a.b.c).
 * @param parameter - The parameter to get the path string for.
 * @returns The path to this parameter's value as a dotted string.
 */
function getPathStringFromParameter(parameter) {
    return getPathStringFromParameterPath(parameter.parameterPath, parameter.mapper);
}
function getPathStringFromParameterPath(parameterPath, mapper) {
    let result;
    if (typeof parameterPath === "string") {
        result = parameterPath;
    }
    else if (Array.isArray(parameterPath)) {
        result = parameterPath.join(".");
    }
    else {
        result = mapper.serializedName;
    }
    return result;
}

// Copyright (c) Microsoft Corporation.
/**
 * Gets the list of status codes for streaming responses.
 * @internal
 */
function getStreamResponseStatusCodes(operationSpec) {
    const result = new Set();
    for (const statusCode in operationSpec.responses) {
        const operationResponse = operationSpec.responses[statusCode];
        if (operationResponse.bodyMapper &&
            operationResponse.bodyMapper.type.name === MapperType.Stream) {
            result.add(Number(statusCode));
        }
    }
    return result;
}

// Copyright (c) Microsoft Corporation.
function getDefaultUserAgentKey() {
    return Constants.HeaderConstants.USER_AGENT;
}
function getPlatformSpecificData() {
    const runtimeInfo = {
        key: "Node",
        value: process.version,
    };
    const osInfo = {
        key: "OS",
        value: `(${os__namespace.arch()}-${os__namespace.type()}-${os__namespace.release()})`,
    };
    return [runtimeInfo, osInfo];
}

// Copyright (c) Microsoft Corporation.
function getRuntimeInfo() {
    const msRestRuntime = {
        key: "core-http",
        value: Constants.coreHttpVersion,
    };
    return [msRestRuntime];
}
function getUserAgentString(telemetryInfo, keySeparator = " ", valueSeparator = "/") {
    return telemetryInfo
        .map((info) => {
        const value = info.value ? `${valueSeparator}${info.value}` : "";
        return `${info.key}${value}`;
    })
        .join(keySeparator);
}
const getDefaultUserAgentHeaderName = getDefaultUserAgentKey;
/**
 * The default approach to generate user agents.
 * Uses static information from this package, plus system information available from the runtime.
 */
function getDefaultUserAgentValue() {
    const runtimeInfo = getRuntimeInfo();
    const platformSpecificData = getPlatformSpecificData();
    const userAgent = getUserAgentString(runtimeInfo.concat(platformSpecificData));
    return userAgent;
}
/**
 * Returns a policy that adds the user agent header to outgoing requests based on the given {@link TelemetryInfo}.
 * @param userAgentData - Telemetry information.
 * @returns A new {@link UserAgentPolicy}.
 */
function userAgentPolicy(userAgentData) {
    const key = !userAgentData || userAgentData.key === undefined || userAgentData.key === null
        ? getDefaultUserAgentKey()
        : userAgentData.key;
    const value = !userAgentData || userAgentData.value === undefined || userAgentData.value === null
        ? getDefaultUserAgentValue()
        : userAgentData.value;
    return {
        create: (nextPolicy, options) => {
            return new UserAgentPolicy(nextPolicy, options, key, value);
        },
    };
}
/**
 * A policy that adds the user agent header to outgoing requests based on the given {@link TelemetryInfo}.
 */
class UserAgentPolicy extends BaseRequestPolicy {
    constructor(_nextPolicy, _options, headerKey, headerValue) {
        super(_nextPolicy, _options);
        this._nextPolicy = _nextPolicy;
        this._options = _options;
        this.headerKey = headerKey;
        this.headerValue = headerValue;
    }
    sendRequest(request) {
        this.addUserAgentHeader(request);
        return this._nextPolicy.sendRequest(request);
    }
    /**
     * Adds the user agent header to the outgoing request.
     */
    addUserAgentHeader(request) {
        if (!request.headers) {
            request.headers = new HttpHeaders();
        }
        if (!request.headers.get(this.headerKey) && this.headerValue) {
            request.headers.set(this.headerKey, this.headerValue);
        }
    }
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * The format that will be used to join an array of values together for a query parameter value.
 */
exports.QueryCollectionFormat = void 0;
(function (QueryCollectionFormat) {
    /**
     * CSV: Each pair of segments joined by a single comma.
     */
    QueryCollectionFormat["Csv"] = ",";
    /**
     * SSV: Each pair of segments joined by a single space character.
     */
    QueryCollectionFormat["Ssv"] = " ";
    /**
     * TSV: Each pair of segments joined by a single tab character.
     */
    QueryCollectionFormat["Tsv"] = "\t";
    /**
     * Pipes: Each pair of segments joined by a single pipe character.
     */
    QueryCollectionFormat["Pipes"] = "|";
    /**
     * Denotes this is an array of values that should be passed to the server in multiple key/value pairs, e.g. `?queryParam=value1&queryParam=value2`
     */
    QueryCollectionFormat["Multi"] = "Multi";
})(exports.QueryCollectionFormat || (exports.QueryCollectionFormat = {}));

// Copyright (c) Microsoft Corporation.
// Default options for the cycler if none are provided
const DEFAULT_CYCLER_OPTIONS = {
    forcedRefreshWindowInMs: 1000,
    retryIntervalInMs: 3000,
    refreshWindowInMs: 1000 * 60 * 2, // Start refreshing 2m before expiry
};
/**
 * Converts an an unreliable access token getter (which may resolve with null)
 * into an AccessTokenGetter by retrying the unreliable getter in a regular
 * interval.
 *
 * @param getAccessToken - a function that produces a promise of an access
 * token that may fail by returning null
 * @param retryIntervalInMs - the time (in milliseconds) to wait between retry
 * attempts
 * @param timeoutInMs - the timestamp after which the refresh attempt will fail,
 * throwing an exception
 * @returns - a promise that, if it resolves, will resolve with an access token
 */
async function beginRefresh(getAccessToken, retryIntervalInMs, timeoutInMs) {
    // This wrapper handles exceptions gracefully as long as we haven't exceeded
    // the timeout.
    async function tryGetAccessToken() {
        if (Date.now() < timeoutInMs) {
            try {
                return await getAccessToken();
            }
            catch (_a) {
                return null;
            }
        }
        else {
            const finalToken = await getAccessToken();
            // Timeout is up, so throw if it's still null
            if (finalToken === null) {
                throw new Error("Failed to refresh access token.");
            }
            return finalToken;
        }
    }
    let token = await tryGetAccessToken();
    while (token === null) {
        await delay(retryIntervalInMs);
        token = await tryGetAccessToken();
    }
    return token;
}
/**
 * Creates a token cycler from a credential, scopes, and optional settings.
 *
 * A token cycler represents a way to reliably retrieve a valid access token
 * from a TokenCredential. It will handle initializing the token, refreshing it
 * when it nears expiration, and synchronizes refresh attempts to avoid
 * concurrency hazards.
 *
 * @param credential - the underlying TokenCredential that provides the access
 * token
 * @param scopes - the scopes to request authorization for
 * @param tokenCyclerOptions - optionally override default settings for the cycler
 *
 * @returns - a function that reliably produces a valid access token
 */
function createTokenCycler(credential, scopes, tokenCyclerOptions) {
    let refreshWorker = null;
    let token = null;
    const options = Object.assign(Object.assign({}, DEFAULT_CYCLER_OPTIONS), tokenCyclerOptions);
    /**
     * This little holder defines several predicates that we use to construct
     * the rules of refreshing the token.
     */
    const cycler = {
        /**
         * Produces true if a refresh job is currently in progress.
         */
        get isRefreshing() {
            return refreshWorker !== null;
        },
        /**
         * Produces true if the cycler SHOULD refresh (we are within the refresh
         * window and not already refreshing)
         */
        get shouldRefresh() {
            var _a;
            return (!cycler.isRefreshing &&
                ((_a = token === null || token === void 0 ? void 0 : token.expiresOnTimestamp) !== null && _a !== void 0 ? _a : 0) - options.refreshWindowInMs < Date.now());
        },
        /**
         * Produces true if the cycler MUST refresh (null or nearly-expired
         * token).
         */
        get mustRefresh() {
            return (token === null || token.expiresOnTimestamp - options.forcedRefreshWindowInMs < Date.now());
        },
    };
    /**
     * Starts a refresh job or returns the existing job if one is already
     * running.
     */
    function refresh(getTokenOptions) {
        var _a;
        if (!cycler.isRefreshing) {
            // We bind `scopes` here to avoid passing it around a lot
            const tryGetAccessToken = () => credential.getToken(scopes, getTokenOptions);
            // Take advantage of promise chaining to insert an assignment to `token`
            // before the refresh can be considered done.
            refreshWorker = beginRefresh(tryGetAccessToken, options.retryIntervalInMs, 
            // If we don't have a token, then we should timeout immediately
            (_a = token === null || token === void 0 ? void 0 : token.expiresOnTimestamp) !== null && _a !== void 0 ? _a : Date.now())
                .then((_token) => {
                refreshWorker = null;
                token = _token;
                return token;
            })
                .catch((reason) => {
                // We also should reset the refresher if we enter a failed state.  All
                // existing awaiters will throw, but subsequent requests will start a
                // new retry chain.
                refreshWorker = null;
                token = null;
                throw reason;
            });
        }
        return refreshWorker;
    }
    return async (tokenOptions) => {
        //
        // Simple rules:
        // - If we MUST refresh, then return the refresh task, blocking
        //   the pipeline until a token is available.
        // - If we SHOULD refresh, then run refresh but don't return it
        //   (we can still use the cached token).
        // - Return the token, since it's fine if we didn't return in
        //   step 1.
        //
        if (cycler.mustRefresh)
            return refresh(tokenOptions);
        if (cycler.shouldRefresh) {
            refresh(tokenOptions);
        }
        return token;
    };
}
// #endregion
/**
 * Creates a new factory for a RequestPolicy that applies a bearer token to
 * the requests' `Authorization` headers.
 *
 * @param credential - The TokenCredential implementation that can supply the bearer token.
 * @param scopes - The scopes for which the bearer token applies.
 */
function bearerTokenAuthenticationPolicy(credential, scopes) {
    // This simple function encapsulates the entire process of reliably retrieving the token
    const getToken = createTokenCycler(credential, scopes /* , options */);
    class BearerTokenAuthenticationPolicy extends BaseRequestPolicy {
        constructor(nextPolicy, options) {
            super(nextPolicy, options);
        }
        async sendRequest(webResource) {
            if (!webResource.url.toLowerCase().startsWith("https://")) {
                throw new Error("Bearer token authentication is not permitted for non-TLS protected (non-https) URLs.");
            }
            const { token } = await getToken({
                abortSignal: webResource.abortSignal,
                tracingOptions: {
                    tracingContext: webResource.tracingContext,
                },
            });
            webResource.headers.set(Constants.HeaderConstants.AUTHORIZATION, `Bearer ${token}`);
            return this._nextPolicy.sendRequest(webResource);
        }
    }
    return {
        create: (nextPolicy, options) => {
            return new BearerTokenAuthenticationPolicy(nextPolicy, options);
        },
    };
}

// Copyright (c) Microsoft Corporation.
/**
 * Returns a request policy factory that can be used to create an instance of
 * {@link DisableResponseDecompressionPolicy}.
 */
function disableResponseDecompressionPolicy() {
    return {
        create: (nextPolicy, options) => {
            return new DisableResponseDecompressionPolicy(nextPolicy, options);
        },
    };
}
/**
 * A policy to disable response decompression according to Accept-Encoding header
 * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding
 */
class DisableResponseDecompressionPolicy extends BaseRequestPolicy {
    /**
     * Creates an instance of DisableResponseDecompressionPolicy.
     *
     * @param nextPolicy -
     * @param options -
     */
    // The parent constructor is protected.
    /* eslint-disable-next-line @typescript-eslint/no-useless-constructor */
    constructor(nextPolicy, options) {
        super(nextPolicy, options);
    }
    /**
     * Sends out request.
     *
     * @param request -
     * @returns
     */
    async sendRequest(request) {
        request.decompressResponse = false;
        return this._nextPolicy.sendRequest(request);
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * Creates a policy that assigns a unique request id to outgoing requests.
 * @param requestIdHeaderName - The name of the header to use when assigning the unique id to the request.
 */
function generateClientRequestIdPolicy(requestIdHeaderName = "x-ms-client-request-id") {
    return {
        create: (nextPolicy, options) => {
            return new GenerateClientRequestIdPolicy(nextPolicy, options, requestIdHeaderName);
        },
    };
}
class GenerateClientRequestIdPolicy extends BaseRequestPolicy {
    constructor(nextPolicy, options, _requestIdHeaderName) {
        super(nextPolicy, options);
        this._requestIdHeaderName = _requestIdHeaderName;
    }
    sendRequest(request) {
        if (!request.headers.contains(this._requestIdHeaderName)) {
            request.headers.set(this._requestIdHeaderName, request.requestId);
        }
        return this._nextPolicy.sendRequest(request);
    }
}

// Copyright (c) Microsoft Corporation.
let cachedHttpClient;
function getCachedDefaultHttpClient() {
    if (!cachedHttpClient) {
        cachedHttpClient = new NodeFetchHttpClient();
    }
    return cachedHttpClient;
}

// Copyright (c) Microsoft Corporation.
function ndJsonPolicy() {
    return {
        create: (nextPolicy, options) => {
            return new NdJsonPolicy(nextPolicy, options);
        },
    };
}
/**
 * NdJsonPolicy that formats a JSON array as newline-delimited JSON
 */
class NdJsonPolicy extends BaseRequestPolicy {
    /**
     * Creates an instance of KeepAlivePolicy.
     */
    constructor(nextPolicy, options) {
        super(nextPolicy, options);
    }
    /**
     * Sends a request.
     */
    async sendRequest(request) {
        // There currently isn't a good way to bypass the serializer
        if (typeof request.body === "string" && request.body.startsWith("[")) {
            const body = JSON.parse(request.body);
            if (Array.isArray(body)) {
                request.body = body.map((item) => JSON.stringify(item) + "\n").join("");
            }
        }
        return this._nextPolicy.sendRequest(request);
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * Stores the patterns specified in NO_PROXY environment variable.
 * @internal
 */
const globalNoProxyList = [];
let noProxyListLoaded = false;
/** A cache of whether a host should bypass the proxy. */
const globalBypassedMap = new Map();
function loadEnvironmentProxyValue() {
    if (!process) {
        return undefined;
    }
    const httpsProxy = getEnvironmentValue(Constants.HTTPS_PROXY);
    const allProxy = getEnvironmentValue(Constants.ALL_PROXY);
    const httpProxy = getEnvironmentValue(Constants.HTTP_PROXY);
    return httpsProxy || allProxy || httpProxy;
}
/**
 * Check whether the host of a given `uri` matches any pattern in the no proxy list.
 * If there's a match, any request sent to the same host shouldn't have the proxy settings set.
 * This implementation is a port of https://github.com/Azure/azure-sdk-for-net/blob/8cca811371159e527159c7eb65602477898683e2/sdk/core/Azure.Core/src/Pipeline/Internal/HttpEnvironmentProxy.cs#L210
 */
function isBypassed(uri, noProxyList, bypassedMap) {
    if (noProxyList.length === 0) {
        return false;
    }
    const host = URLBuilder.parse(uri).getHost();
    if (bypassedMap === null || bypassedMap === void 0 ? void 0 : bypassedMap.has(host)) {
        return bypassedMap.get(host);
    }
    let isBypassedFlag = false;
    for (const pattern of noProxyList) {
        if (pattern[0] === ".") {
            // This should match either domain it self or any subdomain or host
            // .foo.com will match foo.com it self or *.foo.com
            if (host.endsWith(pattern)) {
                isBypassedFlag = true;
            }
            else {
                if (host.length === pattern.length - 1 && host === pattern.slice(1)) {
                    isBypassedFlag = true;
                }
            }
        }
        else {
            if (host === pattern) {
                isBypassedFlag = true;
            }
        }
    }
    bypassedMap === null || bypassedMap === void 0 ? void 0 : bypassedMap.set(host, isBypassedFlag);
    return isBypassedFlag;
}
/**
 * @internal
 */
function loadNoProxy() {
    const noProxy = getEnvironmentValue(Constants.NO_PROXY);
    noProxyListLoaded = true;
    if (noProxy) {
        return noProxy
            .split(",")
            .map((item) => item.trim())
            .filter((item) => item.length);
    }
    return [];
}
/**
 * Converts a given URL of a proxy server into `ProxySettings` or attempts to retrieve `ProxySettings` from the current environment if one is not passed.
 * @param proxyUrl - URL of the proxy
 * @returns The default proxy settings, or undefined.
 */
function getDefaultProxySettings(proxyUrl) {
    if (!proxyUrl) {
        proxyUrl = loadEnvironmentProxyValue();
        if (!proxyUrl) {
            return undefined;
        }
    }
    const { username, password, urlWithoutAuth } = extractAuthFromUrl(proxyUrl);
    const parsedUrl = URLBuilder.parse(urlWithoutAuth);
    const schema = parsedUrl.getScheme() ? parsedUrl.getScheme() + "://" : "";
    return {
        host: schema + parsedUrl.getHost(),
        port: Number.parseInt(parsedUrl.getPort() || "80"),
        username,
        password,
    };
}
/**
 * A policy that allows one to apply proxy settings to all requests.
 * If not passed static settings, they will be retrieved from the HTTPS_PROXY
 * or HTTP_PROXY environment variables.
 * @param proxySettings - ProxySettings to use on each request.
 * @param options - additional settings, for example, custom NO_PROXY patterns
 */
function proxyPolicy(proxySettings, options) {
    if (!proxySettings) {
        proxySettings = getDefaultProxySettings();
    }
    if (!noProxyListLoaded) {
        globalNoProxyList.push(...loadNoProxy());
    }
    return {
        create: (nextPolicy, requestPolicyOptions) => {
            return new ProxyPolicy(nextPolicy, requestPolicyOptions, proxySettings, options === null || options === void 0 ? void 0 : options.customNoProxyList);
        },
    };
}
function extractAuthFromUrl(url) {
    const atIndex = url.indexOf("@");
    if (atIndex === -1) {
        return { urlWithoutAuth: url };
    }
    const schemeIndex = url.indexOf("://");
    const authStart = schemeIndex !== -1 ? schemeIndex + 3 : 0;
    const auth = url.substring(authStart, atIndex);
    const colonIndex = auth.indexOf(":");
    const hasPassword = colonIndex !== -1;
    const username = hasPassword ? auth.substring(0, colonIndex) : auth;
    const password = hasPassword ? auth.substring(colonIndex + 1) : undefined;
    const urlWithoutAuth = url.substring(0, authStart) + url.substring(atIndex + 1);
    return {
        username,
        password,
        urlWithoutAuth,
    };
}
class ProxyPolicy extends BaseRequestPolicy {
    constructor(nextPolicy, options, proxySettings, customNoProxyList) {
        super(nextPolicy, options);
        this.proxySettings = proxySettings;
        this.customNoProxyList = customNoProxyList;
    }
    sendRequest(request) {
        var _a;
        if (!request.proxySettings &&
            !isBypassed(request.url, (_a = this.customNoProxyList) !== null && _a !== void 0 ? _a : globalNoProxyList, this.customNoProxyList ? undefined : globalBypassedMap)) {
            request.proxySettings = this.proxySettings;
        }
        return this._nextPolicy.sendRequest(request);
    }
}

// Copyright (c) Microsoft Corporation.
function rpRegistrationPolicy(retryTimeout = 30) {
    return {
        create: (nextPolicy, options) => {
            return new RPRegistrationPolicy(nextPolicy, options, retryTimeout);
        },
    };
}
class RPRegistrationPolicy extends BaseRequestPolicy {
    constructor(nextPolicy, options, _retryTimeout = 30) {
        super(nextPolicy, options);
        this._retryTimeout = _retryTimeout;
    }
    sendRequest(request) {
        return this._nextPolicy
            .sendRequest(request.clone())
            .then((response) => registerIfNeeded(this, request, response));
    }
}
function registerIfNeeded(policy, request, response) {
    if (response.status === 409) {
        const rpName = checkRPNotRegisteredError(response.bodyAsText);
        if (rpName) {
            const urlPrefix = extractSubscriptionUrl(request.url);
            return (registerRP(policy, urlPrefix, rpName, request)
                // Autoregistration of ${provider} failed for some reason. We will not return this error
                // instead will return the initial response with 409 status code back to the user.
                // do nothing here as we are returning the original response at the end of this method.
                .catch(() => false)
                .then((registrationStatus) => {
                if (registrationStatus) {
                    // Retry the original request. We have to change the x-ms-client-request-id
                    // otherwise Azure endpoint will return the initial 409 (cached) response.
                    request.headers.set("x-ms-client-request-id", generateUuid());
                    return policy._nextPolicy.sendRequest(request.clone());
                }
                return response;
            }));
        }
    }
    return Promise.resolve(response);
}
/**
 * Reuses the headers of the original request and url (if specified).
 * @param originalRequest - The original request
 * @param reuseUrlToo - Should the url from the original request be reused as well. Default false.
 * @returns A new request object with desired headers.
 */
function getRequestEssentials(originalRequest, reuseUrlToo = false) {
    const reqOptions = originalRequest.clone();
    if (reuseUrlToo) {
        reqOptions.url = originalRequest.url;
    }
    // We have to change the x-ms-client-request-id otherwise Azure endpoint
    // will return the initial 409 (cached) response.
    reqOptions.headers.set("x-ms-client-request-id", generateUuid());
    // Set content-type to application/json
    reqOptions.headers.set("Content-Type", "application/json; charset=utf-8");
    return reqOptions;
}
/**
 * Validates the error code and message associated with 409 response status code. If it matches to that of
 * RP not registered then it returns the name of the RP else returns undefined.
 * @param body - The response body received after making the original request.
 * @returns The name of the RP if condition is satisfied else undefined.
 */
function checkRPNotRegisteredError(body) {
    let result, responseBody;
    if (body) {
        try {
            responseBody = JSON.parse(body);
        }
        catch (err) {
            // do nothing;
        }
        if (responseBody &&
            responseBody.error &&
            responseBody.error.message &&
            responseBody.error.code &&
            responseBody.error.code === "MissingSubscriptionRegistration") {
            const matchRes = responseBody.error.message.match(/.*'(.*)'/i);
            if (matchRes) {
                result = matchRes.pop();
            }
        }
    }
    return result;
}
/**
 * Extracts the first part of the URL, just after subscription:
 * https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/
 * @param url - The original request url
 * @returns The url prefix as explained above.
 */
function extractSubscriptionUrl(url) {
    let result;
    const matchRes = url.match(/.*\/subscriptions\/[a-f0-9-]+\//gi);
    if (matchRes && matchRes[0]) {
        result = matchRes[0];
    }
    else {
        throw new Error(`Unable to extract subscriptionId from the given url - ${url}.`);
    }
    return result;
}
/**
 * Registers the given provider.
 * @param policy - The RPRegistrationPolicy this function is being called against.
 * @param urlPrefix - https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/
 * @param provider - The provider name to be registered.
 * @param originalRequest - The original request sent by the user that returned a 409 response
 * with a message that the provider is not registered.
 */
async function registerRP(policy, urlPrefix, provider, originalRequest) {
    const postUrl = `${urlPrefix}providers/${provider}/register?api-version=2016-02-01`;
    const getUrl = `${urlPrefix}providers/${provider}?api-version=2016-02-01`;
    const reqOptions = getRequestEssentials(originalRequest);
    reqOptions.method = "POST";
    reqOptions.url = postUrl;
    const response = await policy._nextPolicy.sendRequest(reqOptions);
    if (response.status !== 200) {
        throw new Error(`Autoregistration of ${provider} failed. Please try registering manually.`);
    }
    return getRegistrationStatus(policy, getUrl, originalRequest);
}
/**
 * Polls the registration status of the provider that was registered. Polling happens at an interval of 30 seconds.
 * Polling will happen till the registrationState property of the response body is "Registered".
 * @param policy - The RPRegistrationPolicy this function is being called against.
 * @param url - The request url for polling
 * @param originalRequest - The original request sent by the user that returned a 409 response
 * with a message that the provider is not registered.
 * @returns True if RP Registration is successful.
 */
async function getRegistrationStatus(policy, url, originalRequest) {
    const reqOptions = getRequestEssentials(originalRequest);
    reqOptions.url = url;
    reqOptions.method = "GET";
    const res = await policy._nextPolicy.sendRequest(reqOptions);
    const obj = res.parsedBody;
    if (res.parsedBody && obj.registrationState && obj.registrationState === "Registered") {
        return true;
    }
    else {
        await delay(policy._retryTimeout * 1000);
        return getRegistrationStatus(policy, url, originalRequest);
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * Creates a policy that signs outgoing requests by calling to the provided `authenticationProvider`'s `signRequest` method.
 * @param authenticationProvider - The authentication provider.
 * @returns An instance of the {@link SigningPolicy}.
 */
function signingPolicy(authenticationProvider) {
    return {
        create: (nextPolicy, options) => {
            return new SigningPolicy(nextPolicy, options, authenticationProvider);
        },
    };
}
/**
 * A policy that signs outgoing requests by calling to the provided `authenticationProvider`'s `signRequest` method.
 */
class SigningPolicy extends BaseRequestPolicy {
    constructor(nextPolicy, options, authenticationProvider) {
        super(nextPolicy, options);
        this.authenticationProvider = authenticationProvider;
    }
    signRequest(request) {
        return this.authenticationProvider.signRequest(request);
    }
    sendRequest(request) {
        return this.signRequest(request).then((nextRequest) => this._nextPolicy.sendRequest(nextRequest));
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * A policy that retries when there's a system error, identified by the codes "ETIMEDOUT", "ESOCKETTIMEDOUT", "ECONNREFUSED", "ECONNRESET" or "ENOENT".
 * @param retryCount - Maximum number of retries.
 * @param retryInterval - The client retry interval, in milliseconds.
 * @param minRetryInterval - The minimum retry interval, in milliseconds.
 * @param maxRetryInterval - The maximum retry interval, in milliseconds.
 * @returns An instance of the {@link SystemErrorRetryPolicy}
 */
function systemErrorRetryPolicy(retryCount, retryInterval, minRetryInterval, maxRetryInterval) {
    return {
        create: (nextPolicy, options) => {
            return new SystemErrorRetryPolicy(nextPolicy, options, retryCount, retryInterval, minRetryInterval, maxRetryInterval);
        },
    };
}
/**
 * A policy that retries when there's a system error, identified by the codes "ETIMEDOUT", "ESOCKETTIMEDOUT", "ECONNREFUSED", "ECONNRESET" or "ENOENT".
 * @param retryCount - The client retry count.
 * @param retryInterval - The client retry interval, in milliseconds.
 * @param minRetryInterval - The minimum retry interval, in milliseconds.
 * @param maxRetryInterval - The maximum retry interval, in milliseconds.
 */
class SystemErrorRetryPolicy extends BaseRequestPolicy {
    constructor(nextPolicy, options, retryCount, retryInterval, minRetryInterval, maxRetryInterval) {
        super(nextPolicy, options);
        this.retryCount = isNumber(retryCount) ? retryCount : DEFAULT_CLIENT_RETRY_COUNT;
        this.retryInterval = isNumber(retryInterval) ? retryInterval : DEFAULT_CLIENT_RETRY_INTERVAL;
        this.minRetryInterval = isNumber(minRetryInterval)
            ? minRetryInterval
            : DEFAULT_CLIENT_MIN_RETRY_INTERVAL;
        this.maxRetryInterval = isNumber(maxRetryInterval)
            ? maxRetryInterval
            : DEFAULT_CLIENT_MAX_RETRY_INTERVAL;
    }
    sendRequest(request) {
        return this._nextPolicy
            .sendRequest(request.clone())
            .catch((error) => retry(this, request, error.response, error));
    }
}
async function retry(policy, request, operationResponse, err, retryData) {
    retryData = updateRetryData(policy, retryData, err);
    function shouldPolicyRetry(_response, error) {
        if (error &&
            error.code &&
            (error.code === "ETIMEDOUT" ||
                error.code === "ESOCKETTIMEDOUT" ||
                error.code === "ECONNREFUSED" ||
                error.code === "ECONNRESET" ||
                error.code === "ENOENT")) {
            return true;
        }
        return false;
    }
    if (shouldRetry(policy.retryCount, shouldPolicyRetry, retryData, operationResponse, err)) {
        // If previous operation ended with an error and the policy allows a retry, do that
        try {
            await delay(retryData.retryInterval);
            return policy._nextPolicy.sendRequest(request.clone());
        }
        catch (nestedErr) {
            return retry(policy, request, operationResponse, nestedErr, retryData);
        }
    }
    else {
        if (err) {
            // If the operation failed in the end, return all errors instead of just the last one
            return Promise.reject(retryData.error);
        }
        return operationResponse;
    }
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Maximum number of retries for the throttling retry policy
 */
const DEFAULT_CLIENT_MAX_RETRY_COUNT = 3;

// Copyright (c) Microsoft Corporation.
const StatusCodes = Constants.HttpConstants.StatusCodes;
/**
 * Creates a policy that re-sends the request if the response indicates the request failed because of throttling reasons.
 * For example, if the response contains a `Retry-After` header, it will retry sending the request based on the value of that header.
 *
 * To learn more, please refer to
 * https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-manager-request-limits,
 * https://docs.microsoft.com/en-us/azure/azure-subscription-service-limits and
 * https://docs.microsoft.com/en-us/azure/virtual-machines/troubleshooting/troubleshooting-throttling-errors
 * @returns
 */
function throttlingRetryPolicy() {
    return {
        create: (nextPolicy, options) => {
            return new ThrottlingRetryPolicy(nextPolicy, options);
        },
    };
}
const StandardAbortMessage = "The operation was aborted.";
/**
 * Creates a policy that re-sends the request if the response indicates the request failed because of throttling reasons.
 * For example, if the response contains a `Retry-After` header, it will retry sending the request based on the value of that header.
 *
 * To learn more, please refer to
 * https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-manager-request-limits,
 * https://docs.microsoft.com/en-us/azure/azure-subscription-service-limits and
 * https://docs.microsoft.com/en-us/azure/virtual-machines/troubleshooting/troubleshooting-throttling-errors
 */
class ThrottlingRetryPolicy extends BaseRequestPolicy {
    constructor(nextPolicy, options, _handleResponse) {
        super(nextPolicy, options);
        this.numberOfRetries = 0;
        this._handleResponse = _handleResponse || this._defaultResponseHandler;
    }
    async sendRequest(httpRequest) {
        const response = await this._nextPolicy.sendRequest(httpRequest.clone());
        if (response.status !== StatusCodes.TooManyRequests &&
            response.status !== StatusCodes.ServiceUnavailable) {
            return response;
        }
        else {
            return this._handleResponse(httpRequest, response);
        }
    }
    async _defaultResponseHandler(httpRequest, httpResponse) {
        var _a;
        const retryAfterHeader = httpResponse.headers.get(Constants.HeaderConstants.RETRY_AFTER);
        if (retryAfterHeader) {
            const delayInMs = ThrottlingRetryPolicy.parseRetryAfterHeader(retryAfterHeader);
            if (delayInMs) {
                this.numberOfRetries += 1;
                await delay(delayInMs, undefined, {
                    abortSignal: httpRequest.abortSignal,
                    abortErrorMsg: StandardAbortMessage,
                });
                if ((_a = httpRequest.abortSignal) === null || _a === void 0 ? void 0 : _a.aborted) {
                    throw new abortController.AbortError(StandardAbortMessage);
                }
                if (this.numberOfRetries < DEFAULT_CLIENT_MAX_RETRY_COUNT) {
                    return this.sendRequest(httpRequest);
                }
                else {
                    return this._nextPolicy.sendRequest(httpRequest);
                }
            }
        }
        return httpResponse;
    }
    static parseRetryAfterHeader(headerValue) {
        const retryAfterInSeconds = Number(headerValue);
        if (Number.isNaN(retryAfterInSeconds)) {
            return ThrottlingRetryPolicy.parseDateRetryAfterHeader(headerValue);
        }
        else {
            return retryAfterInSeconds * 1000;
        }
    }
    static parseDateRetryAfterHeader(headerValue) {
        try {
            const now = Date.now();
            const date = Date.parse(headerValue);
            const diff = date - now;
            return Number.isNaN(diff) ? undefined : diff;
        }
        catch (error) {
            return undefined;
        }
    }
}

// Copyright (c) Microsoft Corporation.
const createSpan = coreTracing.createSpanFunction({
    packagePrefix: "",
    namespace: "",
});
/**
 * Creates a policy that wraps outgoing requests with a tracing span.
 * @param tracingOptions - Tracing options.
 * @returns An instance of the {@link TracingPolicy} class.
 */
function tracingPolicy(tracingOptions = {}) {
    return {
        create(nextPolicy, options) {
            return new TracingPolicy(nextPolicy, options, tracingOptions);
        },
    };
}
/**
 * A policy that wraps outgoing requests with a tracing span.
 */
class TracingPolicy extends BaseRequestPolicy {
    constructor(nextPolicy, options, tracingOptions) {
        super(nextPolicy, options);
        this.userAgent = tracingOptions.userAgent;
    }
    async sendRequest(request) {
        if (!request.tracingContext) {
            return this._nextPolicy.sendRequest(request);
        }
        const span = this.tryCreateSpan(request);
        if (!span) {
            return this._nextPolicy.sendRequest(request);
        }
        try {
            const response = await this._nextPolicy.sendRequest(request);
            this.tryProcessResponse(span, response);
            return response;
        }
        catch (err) {
            this.tryProcessError(span, err);
            throw err;
        }
    }
    tryCreateSpan(request) {
        var _a;
        try {
            // Passing spanOptions as part of tracingOptions to maintain compatibility @azure/core-tracing@preview.13 and earlier.
            // We can pass this as a separate parameter once we upgrade to the latest core-tracing.
            const { span } = createSpan(`HTTP ${request.method}`, {
                tracingOptions: {
                    spanOptions: Object.assign(Object.assign({}, request.spanOptions), { kind: coreTracing.SpanKind.CLIENT }),
                    tracingContext: request.tracingContext,
                },
            });
            // If the span is not recording, don't do any more work.
            if (!span.isRecording()) {
                span.end();
                return undefined;
            }
            const namespaceFromContext = (_a = request.tracingContext) === null || _a === void 0 ? void 0 : _a.getValue(Symbol.for("az.namespace"));
            if (typeof namespaceFromContext === "string") {
                span.setAttribute("az.namespace", namespaceFromContext);
            }
            span.setAttributes({
                "http.method": request.method,
                "http.url": request.url,
                requestId: request.requestId,
            });
            if (this.userAgent) {
                span.setAttribute("http.user_agent", this.userAgent);
            }
            // set headers
            const spanContext = span.spanContext();
            const traceParentHeader = coreTracing.getTraceParentHeader(spanContext);
            if (traceParentHeader && coreTracing.isSpanContextValid(spanContext)) {
                request.headers.set("traceparent", traceParentHeader);
                const traceState = spanContext.traceState && spanContext.traceState.serialize();
                // if tracestate is set, traceparent MUST be set, so only set tracestate after traceparent
                if (traceState) {
                    request.headers.set("tracestate", traceState);
                }
            }
            return span;
        }
        catch (error) {
            logger.warning(`Skipping creating a tracing span due to an error: ${error.message}`);
            return undefined;
        }
    }
    tryProcessError(span, err) {
        try {
            span.setStatus({
                code: coreTracing.SpanStatusCode.ERROR,
                message: err.message,
            });
            if (err.statusCode) {
                span.setAttribute("http.status_code", err.statusCode);
            }
            span.end();
        }
        catch (error) {
            logger.warning(`Skipping tracing span processing due to an error: ${error.message}`);
        }
    }
    tryProcessResponse(span, response) {
        try {
            span.setAttribute("http.status_code", response.status);
            const serviceRequestId = response.headers.get("x-ms-request-id");
            if (serviceRequestId) {
                span.setAttribute("serviceRequestId", serviceRequestId);
            }
            span.setStatus({
                code: coreTracing.SpanStatusCode.OK,
            });
            span.end();
        }
        catch (error) {
            logger.warning(`Skipping tracing span processing due to an error: ${error.message}`);
        }
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * ServiceClient sends service requests and receives responses.
 */
class ServiceClient {
    /**
     * The ServiceClient constructor
     * @param credentials - The credentials used for authentication with the service.
     * @param options - The service client options that govern the behavior of the client.
     */
    constructor(credentials, 
    /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */
    options) {
        if (!options) {
            options = {};
        }
        this._withCredentials = options.withCredentials || false;
        this._httpClient = options.httpClient || getCachedDefaultHttpClient();
        this._requestPolicyOptions = new RequestPolicyOptions(options.httpPipelineLogger);
        let requestPolicyFactories;
        if (Array.isArray(options.requestPolicyFactories)) {
            logger.info("ServiceClient: using custom request policies");
            requestPolicyFactories = options.requestPolicyFactories;
        }
        else {
            let authPolicyFactory = undefined;
            if (coreAuth.isTokenCredential(credentials)) {
                logger.info("ServiceClient: creating bearer token authentication policy from provided credentials");
                // Create a wrapped RequestPolicyFactory here so that we can provide the
                // correct scope to the BearerTokenAuthenticationPolicy at the first time
                // one is requested.  This is needed because generated ServiceClient
                // implementations do not set baseUri until after ServiceClient's constructor
                // is finished, leaving baseUri empty at the time when it is needed to
                // build the correct scope name.
                const wrappedPolicyFactory = () => {
                    let bearerTokenPolicyFactory = undefined;
                    // eslint-disable-next-line @typescript-eslint/no-this-alias
                    const serviceClient = this;
                    const serviceClientOptions = options;
                    return {
                        create(nextPolicy, createOptions) {
                            const credentialScopes = getCredentialScopes(serviceClientOptions, serviceClient.baseUri);
                            if (!credentialScopes) {
                                throw new Error(`When using credential, the ServiceClient must contain a baseUri or a credentialScopes in ServiceClientOptions. Unable to create a bearerTokenAuthenticationPolicy`);
                            }
                            if (bearerTokenPolicyFactory === undefined || bearerTokenPolicyFactory === null) {
                                bearerTokenPolicyFactory = bearerTokenAuthenticationPolicy(credentials, credentialScopes);
                            }
                            return bearerTokenPolicyFactory.create(nextPolicy, createOptions);
                        },
                    };
                };
                authPolicyFactory = wrappedPolicyFactory();
            }
            else if (credentials && typeof credentials.signRequest === "function") {
                logger.info("ServiceClient: creating signing policy from provided credentials");
                authPolicyFactory = signingPolicy(credentials);
            }
            else if (credentials !== undefined && credentials !== null) {
                throw new Error("The credentials argument must implement the TokenCredential interface");
            }
            logger.info("ServiceClient: using default request policies");
            requestPolicyFactories = createDefaultRequestPolicyFactories(authPolicyFactory, options);
            if (options.requestPolicyFactories) {
                // options.requestPolicyFactories can also be a function that manipulates
                // the default requestPolicyFactories array
                const newRequestPolicyFactories = options.requestPolicyFactories(requestPolicyFactories);
                if (newRequestPolicyFactories) {
                    requestPolicyFactories = newRequestPolicyFactories;
                }
            }
        }
        this._requestPolicyFactories = requestPolicyFactories;
    }
    /**
     * Send the provided httpRequest.
     */
    sendRequest(options) {
        if (options === null || options === undefined || typeof options !== "object") {
            throw new Error("options cannot be null or undefined and it must be of type object.");
        }
        let httpRequest;
        try {
            if (isWebResourceLike(options)) {
                options.validateRequestProperties();
                httpRequest = options;
            }
            else {
                httpRequest = new WebResource();
                httpRequest = httpRequest.prepare(options);
            }
        }
        catch (error) {
            return Promise.reject(error);
        }
        let httpPipeline = this._httpClient;
        if (this._requestPolicyFactories && this._requestPolicyFactories.length > 0) {
            for (let i = this._requestPolicyFactories.length - 1; i >= 0; --i) {
                httpPipeline = this._requestPolicyFactories[i].create(httpPipeline, this._requestPolicyOptions);
            }
        }
        return httpPipeline.sendRequest(httpRequest);
    }
    /**
     * Send an HTTP request that is populated using the provided OperationSpec.
     * @param operationArguments - The arguments that the HTTP request's templated values will be populated from.
     * @param operationSpec - The OperationSpec to use to populate the httpRequest.
     * @param callback - The callback to call when the response is received.
     */
    async sendOperationRequest(operationArguments, operationSpec, callback) {
        var _a;
        if (typeof operationArguments.options === "function") {
            callback = operationArguments.options;
            operationArguments.options = undefined;
        }
        const serializerOptions = (_a = operationArguments.options) === null || _a === void 0 ? void 0 : _a.serializerOptions;
        const httpRequest = new WebResource();
        let result;
        try {
            const baseUri = operationSpec.baseUrl || this.baseUri;
            if (!baseUri) {
                throw new Error("If operationSpec.baseUrl is not specified, then the ServiceClient must have a baseUri string property that contains the base URL to use.");
            }
            httpRequest.method = operationSpec.httpMethod;
            httpRequest.operationSpec = operationSpec;
            const requestUrl = URLBuilder.parse(baseUri);
            if (operationSpec.path) {
                requestUrl.appendPath(operationSpec.path);
            }
            if (operationSpec.urlParameters && operationSpec.urlParameters.length > 0) {
                for (const urlParameter of operationSpec.urlParameters) {
                    let urlParameterValue = getOperationArgumentValueFromParameter(this, operationArguments, urlParameter, operationSpec.serializer);
                    urlParameterValue = operationSpec.serializer.serialize(urlParameter.mapper, urlParameterValue, getPathStringFromParameter(urlParameter), serializerOptions);
                    if (!urlParameter.skipEncoding) {
                        urlParameterValue = encodeURIComponent(urlParameterValue);
                    }
                    requestUrl.replaceAll(`{${urlParameter.mapper.serializedName || getPathStringFromParameter(urlParameter)}}`, urlParameterValue);
                }
            }
            if (operationSpec.queryParameters && operationSpec.queryParameters.length > 0) {
                for (const queryParameter of operationSpec.queryParameters) {
                    let queryParameterValue = getOperationArgumentValueFromParameter(this, operationArguments, queryParameter, operationSpec.serializer);
                    if (queryParameterValue !== undefined && queryParameterValue !== null) {
                        queryParameterValue = operationSpec.serializer.serialize(queryParameter.mapper, queryParameterValue, getPathStringFromParameter(queryParameter), serializerOptions);
                        if (queryParameter.collectionFormat !== undefined &&
                            queryParameter.collectionFormat !== null) {
                            if (queryParameter.collectionFormat === exports.QueryCollectionFormat.Multi) {
                                if (queryParameterValue.length === 0) {
                                    // The collection is empty, no need to try serializing the current queryParam
                                    continue;
                                }
                                else {
                                    for (const index in queryParameterValue) {
                                        const item = queryParameterValue[index];
                                        queryParameterValue[index] =
                                            item === undefined || item === null ? "" : item.toString();
                                    }
                                }
                            }
                            else if (queryParameter.collectionFormat === exports.QueryCollectionFormat.Ssv ||
                                queryParameter.collectionFormat === exports.QueryCollectionFormat.Tsv) {
                                queryParameterValue = queryParameterValue.join(queryParameter.collectionFormat);
                            }
                        }
                        if (!queryParameter.skipEncoding) {
                            if (Array.isArray(queryParameterValue)) {
                                for (const index in queryParameterValue) {
                                    if (queryParameterValue[index] !== undefined &&
                                        queryParameterValue[index] !== null) {
                                        queryParameterValue[index] = encodeURIComponent(queryParameterValue[index]);
                                    }
                                }
                            }
                            else {
                                queryParameterValue = encodeURIComponent(queryParameterValue);
                            }
                        }
                        if (queryParameter.collectionFormat !== undefined &&
                            queryParameter.collectionFormat !== null &&
                            queryParameter.collectionFormat !== exports.QueryCollectionFormat.Multi &&
                            queryParameter.collectionFormat !== exports.QueryCollectionFormat.Ssv &&
                            queryParameter.collectionFormat !== exports.QueryCollectionFormat.Tsv) {
                            queryParameterValue = queryParameterValue.join(queryParameter.collectionFormat);
                        }
                        requestUrl.setQueryParameter(queryParameter.mapper.serializedName || getPathStringFromParameter(queryParameter), queryParameterValue);
                    }
                }
            }
            httpRequest.url = requestUrl.toString();
            const contentType = operationSpec.contentType || this.requestContentType;
            if (contentType && operationSpec.requestBody) {
                httpRequest.headers.set("Content-Type", contentType);
            }
            if (operationSpec.headerParameters) {
                for (const headerParameter of operationSpec.headerParameters) {
                    let headerValue = getOperationArgumentValueFromParameter(this, operationArguments, headerParameter, operationSpec.serializer);
                    if (headerValue !== undefined && headerValue !== null) {
                        headerValue = operationSpec.serializer.serialize(headerParameter.mapper, headerValue, getPathStringFromParameter(headerParameter), serializerOptions);
                        const headerCollectionPrefix = headerParameter.mapper
                            .headerCollectionPrefix;
                        if (headerCollectionPrefix) {
                            for (const key of Object.keys(headerValue)) {
                                httpRequest.headers.set(headerCollectionPrefix + key, headerValue[key]);
                            }
                        }
                        else {
                            httpRequest.headers.set(headerParameter.mapper.serializedName ||
                                getPathStringFromParameter(headerParameter), headerValue);
                        }
                    }
                }
            }
            const options = operationArguments.options;
            if (options) {
                if (options.customHeaders) {
                    for (const customHeaderName in options.customHeaders) {
                        httpRequest.headers.set(customHeaderName, options.customHeaders[customHeaderName]);
                    }
                }
                if (options.abortSignal) {
                    httpRequest.abortSignal = options.abortSignal;
                }
                if (options.timeout) {
                    httpRequest.timeout = options.timeout;
                }
                if (options.onUploadProgress) {
                    httpRequest.onUploadProgress = options.onUploadProgress;
                }
                if (options.onDownloadProgress) {
                    httpRequest.onDownloadProgress = options.onDownloadProgress;
                }
                if (options.spanOptions) {
                    // By passing spanOptions if they exist at runtime, we're backwards compatible with @azure/core-tracing@preview.13 and earlier.
                    httpRequest.spanOptions = options.spanOptions;
                }
                if (options.tracingContext) {
                    httpRequest.tracingContext = options.tracingContext;
                }
                if (options.shouldDeserialize !== undefined && options.shouldDeserialize !== null) {
                    httpRequest.shouldDeserialize = options.shouldDeserialize;
                }
            }
            httpRequest.withCredentials = this._withCredentials;
            serializeRequestBody(this, httpRequest, operationArguments, operationSpec);
            if (httpRequest.streamResponseStatusCodes === undefined) {
                httpRequest.streamResponseStatusCodes = getStreamResponseStatusCodes(operationSpec);
            }
            let rawResponse;
            let sendRequestError;
            try {
                rawResponse = await this.sendRequest(httpRequest);
            }
            catch (error) {
                sendRequestError = error;
            }
            if (sendRequestError) {
                if (sendRequestError.response) {
                    sendRequestError.details = flattenResponse(sendRequestError.response, operationSpec.responses[sendRequestError.statusCode] ||
                        operationSpec.responses["default"]);
                }
                result = Promise.reject(sendRequestError);
            }
            else {
                result = Promise.resolve(flattenResponse(rawResponse, operationSpec.responses[rawResponse.status]));
            }
        }
        catch (error) {
            result = Promise.reject(error);
        }
        const cb = callback;
        if (cb) {
            result
                .then((res) => cb(null, res._response.parsedBody, res._response.request, res._response))
                .catch((err) => cb(err));
        }
        return result;
    }
}
function serializeRequestBody(serviceClient, httpRequest, operationArguments, operationSpec) {
    var _a, _b, _c, _d, _e, _f;
    const serializerOptions = (_b = (_a = operationArguments.options) === null || _a === void 0 ? void 0 : _a.serializerOptions) !== null && _b !== void 0 ? _b : {};
    const updatedOptions = {
        rootName: (_c = serializerOptions.rootName) !== null && _c !== void 0 ? _c : "",
        includeRoot: (_d = serializerOptions.includeRoot) !== null && _d !== void 0 ? _d : false,
        xmlCharKey: (_e = serializerOptions.xmlCharKey) !== null && _e !== void 0 ? _e : XML_CHARKEY,
    };
    const xmlCharKey = serializerOptions.xmlCharKey;
    if (operationSpec.requestBody && operationSpec.requestBody.mapper) {
        httpRequest.body = getOperationArgumentValueFromParameter(serviceClient, operationArguments, operationSpec.requestBody, operationSpec.serializer);
        const bodyMapper = operationSpec.requestBody.mapper;
        const { required, xmlName, xmlElementName, serializedName, xmlNamespace, xmlNamespacePrefix } = bodyMapper;
        const typeName = bodyMapper.type.name;
        try {
            if ((httpRequest.body !== undefined && httpRequest.body !== null) || required) {
                const requestBodyParameterPathString = getPathStringFromParameter(operationSpec.requestBody);
                httpRequest.body = operationSpec.serializer.serialize(bodyMapper, httpRequest.body, requestBodyParameterPathString, updatedOptions);
                const isStream = typeName === MapperType.Stream;
                if (operationSpec.isXML) {
                    const xmlnsKey = xmlNamespacePrefix ? `xmlns:${xmlNamespacePrefix}` : "xmlns";
                    const value = getXmlValueWithNamespace(xmlNamespace, xmlnsKey, typeName, httpRequest.body, updatedOptions);
                    if (typeName === MapperType.Sequence) {
                        httpRequest.body = stringifyXML(prepareXMLRootList(value, xmlElementName || xmlName || serializedName, xmlnsKey, xmlNamespace), {
                            rootName: xmlName || serializedName,
                            xmlCharKey,
                        });
                    }
                    else if (!isStream) {
                        httpRequest.body = stringifyXML(value, {
                            rootName: xmlName || serializedName,
                            xmlCharKey,
                        });
                    }
                }
                else if (typeName === MapperType.String &&
                    (((_f = operationSpec.contentType) === null || _f === void 0 ? void 0 : _f.match("text/plain")) || operationSpec.mediaType === "text")) {
                    // the String serializer has validated that request body is a string
                    // so just send the string.
                    return;
                }
                else if (!isStream) {
                    httpRequest.body = JSON.stringify(httpRequest.body);
                }
            }
        }
        catch (error) {
            throw new Error(`Error "${error.message}" occurred in serializing the payload - ${JSON.stringify(serializedName, undefined, "  ")}.`);
        }
    }
    else if (operationSpec.formDataParameters && operationSpec.formDataParameters.length > 0) {
        httpRequest.formData = {};
        for (const formDataParameter of operationSpec.formDataParameters) {
            const formDataParameterValue = getOperationArgumentValueFromParameter(serviceClient, operationArguments, formDataParameter, operationSpec.serializer);
            if (formDataParameterValue !== undefined && formDataParameterValue !== null) {
                const formDataParameterPropertyName = formDataParameter.mapper.serializedName || getPathStringFromParameter(formDataParameter);
                httpRequest.formData[formDataParameterPropertyName] = operationSpec.serializer.serialize(formDataParameter.mapper, formDataParameterValue, getPathStringFromParameter(formDataParameter), updatedOptions);
            }
        }
    }
}
/**
 * Adds an xml namespace to the xml serialized object if needed, otherwise it just returns the value itself
 */
function getXmlValueWithNamespace(xmlNamespace, xmlnsKey, typeName, serializedValue, options) {
    // Composite and Sequence schemas already got their root namespace set during serialization
    // We just need to add xmlns to the other schema types
    if (xmlNamespace && !["Composite", "Sequence", "Dictionary"].includes(typeName)) {
        const result = {};
        result[options.xmlCharKey] = serializedValue;
        result[XML_ATTRKEY] = { [xmlnsKey]: xmlNamespace };
        return result;
    }
    return serializedValue;
}
function getValueOrFunctionResult(value, defaultValueCreator) {
    let result;
    if (typeof value === "string") {
        result = value;
    }
    else {
        result = defaultValueCreator();
        if (typeof value === "function") {
            result = value(result);
        }
    }
    return result;
}
function createDefaultRequestPolicyFactories(authPolicyFactory, options) {
    const factories = [];
    if (options.generateClientRequestIdHeader) {
        factories.push(generateClientRequestIdPolicy(options.clientRequestIdHeaderName));
    }
    if (authPolicyFactory) {
        factories.push(authPolicyFactory);
    }
    const userAgentHeaderName = getValueOrFunctionResult(options.userAgentHeaderName, getDefaultUserAgentHeaderName);
    const userAgentHeaderValue = getValueOrFunctionResult(options.userAgent, getDefaultUserAgentValue);
    if (userAgentHeaderName && userAgentHeaderValue) {
        factories.push(userAgentPolicy({ key: userAgentHeaderName, value: userAgentHeaderValue }));
    }
    factories.push(redirectPolicy());
    factories.push(rpRegistrationPolicy(options.rpRegistrationRetryTimeout));
    if (!options.noRetryPolicy) {
        factories.push(exponentialRetryPolicy());
        factories.push(systemErrorRetryPolicy());
        factories.push(throttlingRetryPolicy());
    }
    factories.push(deserializationPolicy(options.deserializationContentTypes));
    if (isNode) {
        factories.push(proxyPolicy(options.proxySettings));
    }
    factories.push(logPolicy({ logger: logger.info }));
    return factories;
}
/**
 * Creates an HTTP pipeline based on the given options.
 * @param pipelineOptions - Defines options that are used to configure policies in the HTTP pipeline for an SDK client.
 * @param authPolicyFactory - An optional authentication policy factory to use for signing requests.
 * @returns A set of options that can be passed to create a new {@link ServiceClient}.
 */
function createPipelineFromOptions(pipelineOptions, authPolicyFactory) {
    const requestPolicyFactories = [];
    if (pipelineOptions.sendStreamingJson) {
        requestPolicyFactories.push(ndJsonPolicy());
    }
    let userAgentValue = undefined;
    if (pipelineOptions.userAgentOptions && pipelineOptions.userAgentOptions.userAgentPrefix) {
        const userAgentInfo = [];
        userAgentInfo.push(pipelineOptions.userAgentOptions.userAgentPrefix);
        // Add the default user agent value if it isn't already specified
        // by the userAgentPrefix option.
        const defaultUserAgentInfo = getDefaultUserAgentValue();
        if (userAgentInfo.indexOf(defaultUserAgentInfo) === -1) {
            userAgentInfo.push(defaultUserAgentInfo);
        }
        userAgentValue = userAgentInfo.join(" ");
    }
    const keepAliveOptions = Object.assign(Object.assign({}, DefaultKeepAliveOptions), pipelineOptions.keepAliveOptions);
    const retryOptions = Object.assign(Object.assign({}, DefaultRetryOptions), pipelineOptions.retryOptions);
    const redirectOptions = Object.assign(Object.assign({}, DefaultRedirectOptions), pipelineOptions.redirectOptions);
    if (isNode) {
        requestPolicyFactories.push(proxyPolicy(pipelineOptions.proxyOptions));
    }
    const deserializationOptions = Object.assign(Object.assign({}, DefaultDeserializationOptions), pipelineOptions.deserializationOptions);
    const loggingOptions = Object.assign({}, pipelineOptions.loggingOptions);
    requestPolicyFactories.push(tracingPolicy({ userAgent: userAgentValue }), keepAlivePolicy(keepAliveOptions), userAgentPolicy({ value: userAgentValue }), generateClientRequestIdPolicy(), deserializationPolicy(deserializationOptions.expectedContentTypes), throttlingRetryPolicy(), systemErrorRetryPolicy(), exponentialRetryPolicy(retryOptions.maxRetries, retryOptions.retryDelayInMs, retryOptions.maxRetryDelayInMs));
    if (redirectOptions.handleRedirects) {
        requestPolicyFactories.push(redirectPolicy(redirectOptions.maxRetries));
    }
    if (authPolicyFactory) {
        requestPolicyFactories.push(authPolicyFactory);
    }
    requestPolicyFactories.push(logPolicy(loggingOptions));
    if (isNode && pipelineOptions.decompressResponse === false) {
        requestPolicyFactories.push(disableResponseDecompressionPolicy());
    }
    return {
        httpClient: pipelineOptions.httpClient,
        requestPolicyFactories,
    };
}
function getOperationArgumentValueFromParameter(serviceClient, operationArguments, parameter, serializer) {
    return getOperationArgumentValueFromParameterPath(serviceClient, operationArguments, parameter.parameterPath, parameter.mapper, serializer);
}
function getOperationArgumentValueFromParameterPath(serviceClient, operationArguments, parameterPath, parameterMapper, serializer) {
    var _a;
    let value;
    if (typeof parameterPath === "string") {
        parameterPath = [parameterPath];
    }
    const serializerOptions = (_a = operationArguments.options) === null || _a === void 0 ? void 0 : _a.serializerOptions;
    if (Array.isArray(parameterPath)) {
        if (parameterPath.length > 0) {
            if (parameterMapper.isConstant) {
                value = parameterMapper.defaultValue;
            }
            else {
                let propertySearchResult = getPropertyFromParameterPath(operationArguments, parameterPath);
                if (!propertySearchResult.propertyFound) {
                    propertySearchResult = getPropertyFromParameterPath(serviceClient, parameterPath);
                }
                let useDefaultValue = false;
                if (!propertySearchResult.propertyFound) {
                    useDefaultValue =
                        parameterMapper.required ||
                            (parameterPath[0] === "options" && parameterPath.length === 2);
                }
                value = useDefaultValue ? parameterMapper.defaultValue : propertySearchResult.propertyValue;
            }
            // Serialize just for validation purposes.
            const parameterPathString = getPathStringFromParameterPath(parameterPath, parameterMapper);
            serializer.serialize(parameterMapper, value, parameterPathString, serializerOptions);
        }
    }
    else {
        if (parameterMapper.required) {
            value = {};
        }
        for (const propertyName in parameterPath) {
            const propertyMapper = parameterMapper.type.modelProperties[propertyName];
            const propertyPath = parameterPath[propertyName];
            const propertyValue = getOperationArgumentValueFromParameterPath(serviceClient, operationArguments, propertyPath, propertyMapper, serializer);
            // Serialize just for validation purposes.
            const propertyPathString = getPathStringFromParameterPath(propertyPath, propertyMapper);
            serializer.serialize(propertyMapper, propertyValue, propertyPathString, serializerOptions);
            if (propertyValue !== undefined && propertyValue !== null) {
                if (!value) {
                    value = {};
                }
                value[propertyName] = propertyValue;
            }
        }
    }
    return value;
}
function getPropertyFromParameterPath(parent, parameterPath) {
    const result = { propertyFound: false };
    let i = 0;
    for (; i < parameterPath.length; ++i) {
        const parameterPathPart = parameterPath[i];
        // Make sure to check inherited properties too, so don't use hasOwnProperty().
        if (parent !== undefined && parent !== null && parameterPathPart in parent) {
            parent = parent[parameterPathPart];
        }
        else {
            break;
        }
    }
    if (i === parameterPath.length) {
        result.propertyValue = parent;
        result.propertyFound = true;
    }
    return result;
}
/**
 * Parses an {@link HttpOperationResponse} into a normalized HTTP response object ({@link RestResponse}).
 * @param _response - Wrapper object for http response.
 * @param responseSpec - Mappers for how to parse the response properties.
 * @returns - A normalized response object.
 */
function flattenResponse(_response, responseSpec) {
    const parsedHeaders = _response.parsedHeaders;
    const bodyMapper = responseSpec && responseSpec.bodyMapper;
    const addOperationResponse = (obj) => {
        return Object.defineProperty(obj, "_response", {
            value: _response,
        });
    };
    if (bodyMapper) {
        const typeName = bodyMapper.type.name;
        if (typeName === "Stream") {
            return addOperationResponse(Object.assign(Object.assign({}, parsedHeaders), { blobBody: _response.blobBody, readableStreamBody: _response.readableStreamBody }));
        }
        const modelProperties = (typeName === "Composite" && bodyMapper.type.modelProperties) || {};
        const isPageableResponse = Object.keys(modelProperties).some((k) => modelProperties[k].serializedName === "");
        if (typeName === "Sequence" || isPageableResponse) {
            const arrayResponse = [...(_response.parsedBody || [])];
            for (const key of Object.keys(modelProperties)) {
                if (modelProperties[key].serializedName) {
                    arrayResponse[key] = _response.parsedBody[key];
                }
            }
            if (parsedHeaders) {
                for (const key of Object.keys(parsedHeaders)) {
                    arrayResponse[key] = parsedHeaders[key];
                }
            }
            addOperationResponse(arrayResponse);
            return arrayResponse;
        }
        if (typeName === "Composite" || typeName === "Dictionary") {
            return addOperationResponse(Object.assign(Object.assign({}, parsedHeaders), _response.parsedBody));
        }
    }
    if (bodyMapper ||
        _response.request.method === "HEAD" ||
        isPrimitiveType(_response.parsedBody)) {
        // primitive body types and HEAD booleans
        return addOperationResponse(Object.assign(Object.assign({}, parsedHeaders), { body: _response.parsedBody }));
    }
    return addOperationResponse(Object.assign(Object.assign({}, parsedHeaders), _response.parsedBody));
}
function getCredentialScopes(options, baseUri) {
    if (options === null || options === void 0 ? void 0 : options.credentialScopes) {
        const scopes = options.credentialScopes;
        return Array.isArray(scopes)
            ? scopes.map((scope) => new URL(scope).toString())
            : new URL(scopes).toString();
    }
    if (baseUri) {
        return `${baseUri}/.default`;
    }
    return undefined;
}

// Copyright (c) Microsoft Corporation.
/**
 * This function is only here for compatibility. Use createSpanFunction in core-tracing.
 *
 * @deprecated This function is only here for compatibility. Use createSpanFunction in core-tracing.
 * @hidden

 * @param spanConfig - The name of the operation being performed.
 * @param tracingOptions - The options for the underlying http request.
 */
function createSpanFunction(args) {
    return coreTracing.createSpanFunction(args);
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Defines the default token refresh buffer duration.
 */
const TokenRefreshBufferMs = 2 * 60 * 1000; // 2 Minutes
/**
 * Provides an {@link AccessTokenCache} implementation which clears
 * the cached {@link AccessToken}'s after the expiresOnTimestamp has
 * passed.
 *
 * @deprecated No longer used in the bearer authorization policy.
 */
class ExpiringAccessTokenCache {
    /**
     * Constructs an instance of {@link ExpiringAccessTokenCache} with
     * an optional expiration buffer time.
     */
    constructor(tokenRefreshBufferMs = TokenRefreshBufferMs) {
        this.cachedToken = undefined;
        this.tokenRefreshBufferMs = tokenRefreshBufferMs;
    }
    /**
     * Saves an access token into the internal in-memory cache.
     * @param accessToken - Access token or undefined to clear the cache.
     */
    setCachedToken(accessToken) {
        this.cachedToken = accessToken;
    }
    /**
     * Returns the cached access token, or `undefined` if one is not cached or the cached one is expiring soon.
     */
    getCachedToken() {
        if (this.cachedToken &&
            Date.now() + this.tokenRefreshBufferMs >= this.cachedToken.expiresOnTimestamp) {
            this.cachedToken = undefined;
        }
        return this.cachedToken;
    }
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Helps the core-http token authentication policies with requesting a new token if we're not currently waiting for a new token.
 *
 * @deprecated No longer used in the bearer authorization policy.
 */
class AccessTokenRefresher {
    constructor(credential, scopes, requiredMillisecondsBeforeNewRefresh = 30000) {
        this.credential = credential;
        this.scopes = scopes;
        this.requiredMillisecondsBeforeNewRefresh = requiredMillisecondsBeforeNewRefresh;
        this.lastCalled = 0;
    }
    /**
     * Returns true if the required milliseconds(defaulted to 30000) have been passed signifying
     * that we are ready for a new refresh.
     */
    isReady() {
        // We're only ready for a new refresh if the required milliseconds have passed.
        return (!this.lastCalled || Date.now() - this.lastCalled > this.requiredMillisecondsBeforeNewRefresh);
    }
    /**
     * Stores the time in which it is called,
     * then requests a new token,
     * then sets this.promise to undefined,
     * then returns the token.
     */
    async getToken(options) {
        this.lastCalled = Date.now();
        const token = await this.credential.getToken(this.scopes, options);
        this.promise = undefined;
        return token || undefined;
    }
    /**
     * Requests a new token if we're not currently waiting for a new token.
     * Returns null if the required time between each call hasn't been reached.
     */
    refresh(options) {
        if (!this.promise) {
            this.promise = this.getToken(options);
        }
        return this.promise;
    }
}

// Copyright (c) Microsoft Corporation.
const HeaderConstants = Constants.HeaderConstants;
const DEFAULT_AUTHORIZATION_SCHEME = "Basic";
/**
 * A simple {@link ServiceClientCredential} that authenticates with a username and a password.
 */
class BasicAuthenticationCredentials {
    /**
     * Creates a new BasicAuthenticationCredentials object.
     *
     * @param userName - User name.
     * @param password - Password.
     * @param authorizationScheme - The authorization scheme.
     */
    constructor(userName, password, authorizationScheme = DEFAULT_AUTHORIZATION_SCHEME) {
        /**
         * Authorization scheme. Defaults to "Basic".
         * More information about authorization schemes is available here: https://developer.mozilla.org/docs/Web/HTTP/Authentication#authentication_schemes
         */
        this.authorizationScheme = DEFAULT_AUTHORIZATION_SCHEME;
        if (userName === null || userName === undefined || typeof userName.valueOf() !== "string") {
            throw new Error("userName cannot be null or undefined and must be of type string.");
        }
        if (password === null || password === undefined || typeof password.valueOf() !== "string") {
            throw new Error("password cannot be null or undefined and must be of type string.");
        }
        this.userName = userName;
        this.password = password;
        this.authorizationScheme = authorizationScheme;
    }
    /**
     * Signs a request with the Authentication header.
     *
     * @param webResource - The WebResourceLike to be signed.
     * @returns The signed request object.
     */
    signRequest(webResource) {
        const credentials = `${this.userName}:${this.password}`;
        const encodedCredentials = `${this.authorizationScheme} ${encodeString(credentials)}`;
        if (!webResource.headers)
            webResource.headers = new HttpHeaders();
        webResource.headers.set(HeaderConstants.AUTHORIZATION, encodedCredentials);
        return Promise.resolve(webResource);
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * Authenticates to a service using an API key.
 */
class ApiKeyCredentials {
    /**
     * @param options - Specifies the options to be provided for auth. Either header or query needs to be provided.
     */
    constructor(options) {
        if (!options || (options && !options.inHeader && !options.inQuery)) {
            throw new Error(`options cannot be null or undefined. Either "inHeader" or "inQuery" property of the options object needs to be provided.`);
        }
        this.inHeader = options.inHeader;
        this.inQuery = options.inQuery;
    }
    /**
     * Signs a request with the values provided in the inHeader and inQuery parameter.
     *
     * @param webResource - The WebResourceLike to be signed.
     * @returns The signed request object.
     */
    signRequest(webResource) {
        if (!webResource) {
            return Promise.reject(new Error(`webResource cannot be null or undefined and must be of type "object".`));
        }
        if (this.inHeader) {
            if (!webResource.headers) {
                webResource.headers = new HttpHeaders();
            }
            for (const headerName in this.inHeader) {
                webResource.headers.set(headerName, this.inHeader[headerName]);
            }
        }
        if (this.inQuery) {
            if (!webResource.url) {
                return Promise.reject(new Error(`url cannot be null in the request object.`));
            }
            if (webResource.url.indexOf("?") < 0) {
                webResource.url += "?";
            }
            for (const key in this.inQuery) {
                if (!webResource.url.endsWith("?")) {
                    webResource.url += "&";
                }
                webResource.url += `${key}=${this.inQuery[key]}`;
            }
        }
        return Promise.resolve(webResource);
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * A {@link TopicCredentials} object used for Azure Event Grid.
 */
class TopicCredentials extends ApiKeyCredentials {
    /**
     * Creates a new EventGrid TopicCredentials object.
     *
     * @param topicKey - The EventGrid topic key
     */
    constructor(topicKey) {
        if (!topicKey || (topicKey && typeof topicKey !== "string")) {
            throw new Error("topicKey cannot be null or undefined and must be of type string.");
        }
        const options = {
            inHeader: {
                "aeg-sas-key": topicKey,
            },
        };
        super(options);
    }
}

Object.defineProperty(exports, 'isTokenCredential', {
    enumerable: true,
    get: function () { return coreAuth.isTokenCredential; }
});
exports.AccessTokenRefresher = AccessTokenRefresher;
exports.ApiKeyCredentials = ApiKeyCredentials;
exports.BaseRequestPolicy = BaseRequestPolicy;
exports.BasicAuthenticationCredentials = BasicAuthenticationCredentials;
exports.Constants = Constants;
exports.DefaultHttpClient = NodeFetchHttpClient;
exports.ExpiringAccessTokenCache = ExpiringAccessTokenCache;
exports.HttpHeaders = HttpHeaders;
exports.MapperType = MapperType;
exports.RequestPolicyOptions = RequestPolicyOptions;
exports.RestError = RestError;
exports.Serializer = Serializer;
exports.ServiceClient = ServiceClient;
exports.TopicCredentials = TopicCredentials;
exports.URLBuilder = URLBuilder;
exports.URLQuery = URLQuery;
exports.WebResource = WebResource;
exports.XML_ATTRKEY = XML_ATTRKEY;
exports.XML_CHARKEY = XML_CHARKEY;
exports.applyMixins = applyMixins;
exports.bearerTokenAuthenticationPolicy = bearerTokenAuthenticationPolicy;
exports.createPipelineFromOptions = createPipelineFromOptions;
exports.createSpanFunction = createSpanFunction;
exports.delay = delay;
exports.deserializationPolicy = deserializationPolicy;
exports.deserializeResponseBody = deserializeResponseBody;
exports.disableResponseDecompressionPolicy = disableResponseDecompressionPolicy;
exports.encodeUri = encodeUri;
exports.executePromisesSequentially = executePromisesSequentially;
exports.exponentialRetryPolicy = exponentialRetryPolicy;
exports.flattenResponse = flattenResponse;
exports.generateClientRequestIdPolicy = generateClientRequestIdPolicy;
exports.generateUuid = generateUuid;
exports.getDefaultProxySettings = getDefaultProxySettings;
exports.getDefaultUserAgentValue = getDefaultUserAgentValue;
exports.isDuration = isDuration;
exports.isNode = isNode;
exports.isValidUuid = isValidUuid;
exports.keepAlivePolicy = keepAlivePolicy;
exports.logPolicy = logPolicy;
exports.operationOptionsToRequestOptionsBase = operationOptionsToRequestOptionsBase;
exports.parseXML = parseXML;
exports.promiseToCallback = promiseToCallback;
exports.promiseToServiceCallback = promiseToServiceCallback;
exports.proxyPolicy = proxyPolicy;
exports.redirectPolicy = redirectPolicy;
exports.serializeObject = serializeObject;
exports.signingPolicy = signingPolicy;
exports.stringifyXML = stringifyXML;
exports.stripRequest = stripRequest;
exports.stripResponse = stripResponse;
exports.systemErrorRetryPolicy = systemErrorRetryPolicy;
exports.throttlingRetryPolicy = throttlingRetryPolicy;
exports.tracingPolicy = tracingPolicy;
exports.userAgentPolicy = userAgentPolicy;
//# sourceMappingURL=index.js.map
The MIT License (MIT)

Copyright (c) 2020 Microsoft

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": "@azure/core-lro",
  "author": "Microsoft Corporation",
  "sdk-type": "client",
  "version": "2.2.4",
  "description": "Isomorphic client library for supporting long-running operations in node.js and browser.",
  "main": "./dist/index.js",
  "module": "dist-esm/src/index.js",
  "types": "./types/core-lro.d.ts",
  "files": [
    "types/core-lro.d.ts",
    "dist-esm/src",
    "dist/",
    "README.md",
    "LICENSE"
  ],
  "engines": {
    "node": ">=12.0.0"
  },
  "browser": {
    "os": false,
    "process": false
  },
  "react-native": {
    "./dist/index.js": "./dist-esm/src/index.js"
  },
  "license": "MIT",
  "homepage": "https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/core/core-lro/README.md",
  "repository": "github:Azure/azure-sdk-for-js",
  "sideEffects": false,
  "dependencies": {
    "@azure/abort-controller": "^1.0.0",
    "@azure/core-tracing": "1.0.0-preview.13",
    "@azure/logger": "^1.0.0",
    "tslib": "^2.2.0"
  },
  "devDependencies": {
    "@azure/core-http": "^2.0.0",
    "@azure/core-rest-pipeline": "^1.1.0",
    "@azure/eslint-plugin-azure-sdk": "^3.0.0",
    "@azure/dev-tool": "^1.0.0",
    "@azure/test-utils": "^1.0.0",
    "@microsoft/api-extractor": "^7.18.11",
    "@types/chai": "^4.1.6",
    "@types/mocha": "^7.0.2",
    "@types/node": "^12.0.0",
    "chai": "^4.2.0",
    "cross-env": "^7.0.2",
    "eslint": "^7.15.0",
    "karma": "^6.2.0",
    "karma-chrome-launcher": "^3.0.0",
    "karma-coverage": "^2.0.0",
    "karma-edge-launcher": "^0.4.2",
    "karma-env-preprocessor": "^0.1.1",
    "karma-firefox-launcher": "^1.1.0",
    "karma-ie-launcher": "^1.0.0",
    "karma-junit-reporter": "^2.0.1",
    "karma-mocha": "^2.0.1",
    "karma-mocha-reporter": "^2.2.5",
    "karma-sourcemap-loader": "^0.3.8",
    "mocha": "^7.1.1",
    "mocha-junit-reporter": "^2.0.0",
    "npm-run-all": "^4.1.5",
    "nyc": "^15.0.0",
    "prettier": "^2.5.1",
    "rimraf": "^3.0.0",
    "ts-node": "^10.0.0",
    "typescript": "~4.2.0",
    "uglify-js": "^3.4.9"
  }
}// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export * from "./pollOperation";
export * from "./poller";
export * from "./lroEngine";
//# sourceMappingURL=index.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=pollOperation.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * When a poller is manually stopped through the `stopPolling` method,
 * the poller will be rejected with an instance of the PollerStoppedError.
 */
export class PollerStoppedError extends Error {
    constructor(message) {
        super(message);
        this.name = "PollerStoppedError";
        Object.setPrototypeOf(this, PollerStoppedError.prototype);
    }
}
/**
 * When a poller is cancelled through the `cancelOperation` method,
 * the poller will be rejected with an instance of the PollerCancelledError.
 */
export class PollerCancelledError extends Error {
    constructor(message) {
        super(message);
        this.name = "PollerCancelledError";
        Object.setPrototypeOf(this, PollerCancelledError.prototype);
    }
}
/**
 * A class that represents the definition of a program that polls through consecutive requests
 * until it reaches a state of completion.
 *
 * A poller can be executed manually, by polling request by request by calling to the `poll()` method repeatedly, until its operation is completed.
 * It also provides a way to wait until the operation completes, by calling `pollUntilDone()` and waiting until the operation finishes.
 * Pollers can also request the cancellation of the ongoing process to whom is providing the underlying long running operation.
 *
 * ```ts
 * const poller = new MyPoller();
 *
 * // Polling just once:
 * await poller.poll();
 *
 * // We can try to cancel the request here, by calling:
 * //
 * //     await poller.cancelOperation();
 * //
 *
 * // Getting the final result:
 * const result = await poller.pollUntilDone();
 * ```
 *
 * The Poller is defined by two types, a type representing the state of the poller, which
 * must include a basic set of properties from `PollOperationState<TResult>`,
 * and a return type defined by `TResult`, which can be anything.
 *
 * The Poller class implements the `PollerLike` interface, which allows poller implementations to avoid having
 * to export the Poller's class directly, and instead only export the already instantiated poller with the PollerLike type.
 *
 * ```ts
 * class Client {
 *   public async makePoller: PollerLike<MyOperationState, MyResult> {
 *     const poller = new MyPoller({});
 *     // It might be preferred to return the poller after the first request is made,
 *     // so that some information can be obtained right away.
 *     await poller.poll();
 *     return poller;
 *   }
 * }
 *
 * const poller: PollerLike<MyOperationState, MyResult> = myClient.makePoller();
 * ```
 *
 * A poller can be created through its constructor, then it can be polled until it's completed.
 * At any point in time, the state of the poller can be obtained without delay through the getOperationState method.
 * At any point in time, the intermediate forms of the result type can be requested without delay.
 * Once the underlying operation is marked as completed, the poller will stop and the final value will be returned.
 *
 * ```ts
 * const poller = myClient.makePoller();
 * const state: MyOperationState = poller.getOperationState();
 *
 * // The intermediate result can be obtained at any time.
 * const result: MyResult | undefined = poller.getResult();
 *
 * // The final result can only be obtained after the poller finishes.
 * const result: MyResult = await poller.pollUntilDone();
 * ```
 *
 */
// eslint-disable-next-line no-use-before-define
export class Poller {
    /**
     * A poller needs to be initialized by passing in at least the basic properties of the `PollOperation<TState, TResult>`.
     *
     * When writing an implementation of a Poller, this implementation needs to deal with the initialization
     * of any custom state beyond the basic definition of the poller. The basic poller assumes that the poller's
     * operation has already been defined, at least its basic properties. The code below shows how to approach
     * the definition of the constructor of a new custom poller.
     *
     * ```ts
     * export class MyPoller extends Poller<MyOperationState, string> {
     *   constructor({
     *     // Anything you might need outside of the basics
     *   }) {
     *     let state: MyOperationState = {
     *       privateProperty: private,
     *       publicProperty: public,
     *     };
     *
     *     const operation = {
     *       state,
     *       update,
     *       cancel,
     *       toString
     *     }
     *
     *     // Sending the operation to the parent's constructor.
     *     super(operation);
     *
     *     // You can assign more local properties here.
     *   }
     * }
     * ```
     *
     * Inside of this constructor, a new promise is created. This will be used to
     * tell the user when the poller finishes (see `pollUntilDone()`). The promise's
     * resolve and reject methods are also used internally to control when to resolve
     * or reject anyone waiting for the poller to finish.
     *
     * The constructor of a custom implementation of a poller is where any serialized version of
     * a previous poller's operation should be deserialized into the operation sent to the
     * base constructor. For example:
     *
     * ```ts
     * export class MyPoller extends Poller<MyOperationState, string> {
     *   constructor(
     *     baseOperation: string | undefined
     *   ) {
     *     let state: MyOperationState = {};
     *     if (baseOperation) {
     *       state = {
     *         ...JSON.parse(baseOperation).state,
     *         ...state
     *       };
     *     }
     *     const operation = {
     *       state,
     *       // ...
     *     }
     *     super(operation);
     *   }
     * }
     * ```
     *
     * @param operation - Must contain the basic properties of `PollOperation<State, TResult>`.
     */
    constructor(operation) {
        this.stopped = true;
        this.pollProgressCallbacks = [];
        this.operation = operation;
        this.promise = new Promise((resolve, reject) => {
            this.resolve = resolve;
            this.reject = reject;
        });
        // This prevents the UnhandledPromiseRejectionWarning in node.js from being thrown.
        // The above warning would get thrown if `poller.poll` is called, it returns an error,
        // and pullUntilDone did not have a .catch or await try/catch on it's return value.
        this.promise.catch(() => {
            /* intentionally blank */
        });
    }
    /**
     * Starts a loop that will break only if the poller is done
     * or if the poller is stopped.
     */
    async startPolling() {
        if (this.stopped) {
            this.stopped = false;
        }
        while (!this.isStopped() && !this.isDone()) {
            await this.poll();
            await this.delay();
        }
    }
    /**
     * pollOnce does one polling, by calling to the update method of the underlying
     * poll operation to make any relevant change effective.
     *
     * It only optionally receives an object with an abortSignal property, from \@azure/abort-controller's AbortSignalLike.
     *
     * @param options - Optional properties passed to the operation's update method.
     */
    async pollOnce(options = {}) {
        try {
            if (!this.isDone()) {
                this.operation = await this.operation.update({
                    abortSignal: options.abortSignal,
                    fireProgress: this.fireProgress.bind(this),
                });
                if (this.isDone() && this.resolve) {
                    // If the poller has finished polling, this means we now have a result.
                    // However, it can be the case that TResult is instantiated to void, so
                    // we are not expecting a result anyway. To assert that we might not
                    // have a result eventually after finishing polling, we cast the result
                    // to TResult.
                    this.resolve(this.operation.state.result);
                }
            }
        }
        catch (e) {
            this.operation.state.error = e;
            if (this.reject) {
                this.reject(e);
            }
            throw e;
        }
    }
    /**
     * fireProgress calls the functions passed in via onProgress the method of the poller.
     *
     * It loops over all of the callbacks received from onProgress, and executes them, sending them
     * the current operation state.
     *
     * @param state - The current operation state.
     */
    fireProgress(state) {
        for (const callback of this.pollProgressCallbacks) {
            callback(state);
        }
    }
    /**
     * Invokes the underlying operation's cancel method, and rejects the
     * pollUntilDone promise.
     */
    async cancelOnce(options = {}) {
        this.operation = await this.operation.cancel(options);
        if (this.reject) {
            this.reject(new PollerCancelledError("Poller cancelled"));
        }
    }
    /**
     * Returns a promise that will resolve once a single polling request finishes.
     * It does this by calling the update method of the Poller's operation.
     *
     * It only optionally receives an object with an abortSignal property, from \@azure/abort-controller's AbortSignalLike.
     *
     * @param options - Optional properties passed to the operation's update method.
     */
    poll(options = {}) {
        if (!this.pollOncePromise) {
            this.pollOncePromise = this.pollOnce(options);
            const clearPollOncePromise = () => {
                this.pollOncePromise = undefined;
            };
            this.pollOncePromise.then(clearPollOncePromise, clearPollOncePromise).catch(this.reject);
        }
        return this.pollOncePromise;
    }
    /**
     * Returns a promise that will resolve once the underlying operation is completed.
     */
    async pollUntilDone() {
        if (this.stopped) {
            this.startPolling().catch(this.reject);
        }
        return this.promise;
    }
    /**
     * Invokes the provided callback after each polling is completed,
     * sending the current state of the poller's operation.
     *
     * It returns a method that can be used to stop receiving updates on the given callback function.
     */
    onProgress(callback) {
        this.pollProgressCallbacks.push(callback);
        return () => {
            this.pollProgressCallbacks = this.pollProgressCallbacks.filter((c) => c !== callback);
        };
    }
    /**
     * Returns true if the poller has finished polling.
     */
    isDone() {
        const state = this.operation.state;
        return Boolean(state.isCompleted || state.isCancelled || state.error);
    }
    /**
     * Stops the poller from continuing to poll.
     */
    stopPolling() {
        if (!this.stopped) {
            this.stopped = true;
            if (this.reject) {
                this.reject(new PollerStoppedError("This poller is already stopped"));
            }
        }
    }
    /**
     * Returns true if the poller is stopped.
     */
    isStopped() {
        return this.stopped;
    }
    /**
     * Attempts to cancel the underlying operation.
     *
     * It only optionally receives an object with an abortSignal property, from \@azure/abort-controller's AbortSignalLike.
     *
     * If it's called again before it finishes, it will throw an error.
     *
     * @param options - Optional properties passed to the operation's update method.
     */
    cancelOperation(options = {}) {
        if (!this.stopped) {
            this.stopped = true;
        }
        if (!this.cancelPromise) {
            this.cancelPromise = this.cancelOnce(options);
        }
        else if (options.abortSignal) {
            throw new Error("A cancel request is currently pending");
        }
        return this.cancelPromise;
    }
    /**
     * Returns the state of the operation.
     *
     * Even though TState will be the same type inside any of the methods of any extension of the Poller class,
     * implementations of the pollers can customize what's shared with the public by writing their own
     * version of the `getOperationState` method, and by defining two types, one representing the internal state of the poller
     * and a public type representing a safe to share subset of the properties of the internal state.
     * Their definition of getOperationState can then return their public type.
     *
     * Example:
     *
     * ```ts
     * // Let's say we have our poller's operation state defined as:
     * interface MyOperationState extends PollOperationState<ResultType> {
     *   privateProperty?: string;
     *   publicProperty?: string;
     * }
     *
     * // To allow us to have a true separation of public and private state, we have to define another interface:
     * interface PublicState extends PollOperationState<ResultType> {
     *   publicProperty?: string;
     * }
     *
     * // Then, we define our Poller as follows:
     * export class MyPoller extends Poller<MyOperationState, ResultType> {
     *   // ... More content is needed here ...
     *
     *   public getOperationState(): PublicState {
     *     const state: PublicState = this.operation.state;
     *     return {
     *       // Properties from PollOperationState<TResult>
     *       isStarted: state.isStarted,
     *       isCompleted: state.isCompleted,
     *       isCancelled: state.isCancelled,
     *       error: state.error,
     *       result: state.result,
     *
     *       // The only other property needed by PublicState.
     *       publicProperty: state.publicProperty
     *     }
     *   }
     * }
     * ```
     *
     * You can see this in the tests of this repository, go to the file:
     * `../test/utils/testPoller.ts`
     * and look for the getOperationState implementation.
     */
    getOperationState() {
        return this.operation.state;
    }
    /**
     * Returns the result value of the operation,
     * regardless of the state of the poller.
     * It can return undefined or an incomplete form of the final TResult value
     * depending on the implementation.
     */
    getResult() {
        const state = this.operation.state;
        return state.result;
    }
    /**
     * Returns a serialized version of the poller's operation
     * by invoking the operation's toString method.
     */
    toString() {
        return this.operation.toString();
    }
}
//# sourceMappingURL=poller.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { failureStates, successStates, } from "./models";
import { isUnexpectedPollingResponse } from "./requestUtils";
function getProvisioningState(rawResponse) {
    var _a, _b;
    const { properties, provisioningState } = (_a = rawResponse.body) !== null && _a !== void 0 ? _a : {};
    const state = (_b = properties === null || properties === void 0 ? void 0 : properties.provisioningState) !== null && _b !== void 0 ? _b : provisioningState;
    return typeof state === "string" ? state.toLowerCase() : "succeeded";
}
export function isBodyPollingDone(rawResponse) {
    const state = getProvisioningState(rawResponse);
    if (isUnexpectedPollingResponse(rawResponse) || failureStates.includes(state)) {
        throw new Error(`The long running operation has failed. The provisioning state: ${state}.`);
    }
    return successStates.includes(state);
}
/**
 * Creates a polling strategy based on BodyPolling which uses the provisioning state
 * from the result to determine the current operation state
 */
export function processBodyPollingOperationResult(response) {
    return Object.assign(Object.assign({}, response), { done: isBodyPollingDone(response.rawResponse) });
}
//# sourceMappingURL=bodyPolling.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export { LroEngine } from "./lroEngine";
//# sourceMappingURL=index.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { failureStates, successStates, } from "./models";
import { isUnexpectedPollingResponse } from "./requestUtils";
function isPollingDone(rawResponse) {
    var _a;
    if (isUnexpectedPollingResponse(rawResponse) || rawResponse.statusCode === 202) {
        return false;
    }
    const { status } = (_a = rawResponse.body) !== null && _a !== void 0 ? _a : {};
    const state = typeof status === "string" ? status.toLowerCase() : "succeeded";
    if (isUnexpectedPollingResponse(rawResponse) || failureStates.includes(state)) {
        throw new Error(`The long running operation has failed. The provisioning state: ${state}.`);
    }
    return successStates.includes(state);
}
/**
 * Sends a request to the URI of the provisioned resource if needed.
 */
async function sendFinalRequest(lro, resourceLocation, lroResourceLocationConfig) {
    switch (lroResourceLocationConfig) {
        case "original-uri":
            return lro.sendPollRequest(lro.requestPath);
        case "azure-async-operation":
            return undefined;
        case "location":
        default:
            return lro.sendPollRequest(resourceLocation !== null && resourceLocation !== void 0 ? resourceLocation : lro.requestPath);
    }
}
export function processLocationPollingOperationResult(lro, resourceLocation, lroResourceLocationConfig) {
    return (response) => {
        if (isPollingDone(response.rawResponse)) {
            if (resourceLocation === undefined) {
                return Object.assign(Object.assign({}, response), { done: true });
            }
            else {
                return Object.assign(Object.assign({}, response), { done: false, next: async () => {
                        const finalResponse = await sendFinalRequest(lro, resourceLocation, lroResourceLocationConfig);
                        return Object.assign(Object.assign({}, (finalResponse !== null && finalResponse !== void 0 ? finalResponse : response)), { done: true });
                    } });
            }
        }
        return Object.assign(Object.assign({}, response), { done: false });
    };
}
//# sourceMappingURL=locationPolling.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createClientLogger } from "@azure/logger";
/**
 * The `@azure/logger` configuration for this package.
 * @internal
 */
export const logger = createClientLogger("core-lro");
//# sourceMappingURL=logger.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { GenericPollOperation } from "./operation";
import { Poller } from "../poller";
function deserializeState(serializedState) {
    try {
        return JSON.parse(serializedState).state;
    }
    catch (e) {
        throw new Error(`LroEngine: Unable to deserialize state: ${serializedState}`);
    }
}
/**
 * The LRO Engine, a class that performs polling.
 */
export class LroEngine extends Poller {
    constructor(lro, options) {
        const { intervalInMs = 2000, resumeFrom } = options || {};
        const state = resumeFrom
            ? deserializeState(resumeFrom)
            : {};
        const operation = new GenericPollOperation(state, lro, options === null || options === void 0 ? void 0 : options.lroResourceLocationConfig, options === null || options === void 0 ? void 0 : options.processResult, options === null || options === void 0 ? void 0 : options.updateState, options === null || options === void 0 ? void 0 : options.isDone);
        super(operation);
        this.config = { intervalInMs: intervalInMs };
        operation.setPollerConfig(this.config);
    }
    /**
     * The method used by the poller to wait before attempting to update its operation.
     */
    delay() {
        return new Promise((resolve) => setTimeout(() => resolve(), this.config.intervalInMs));
    }
}
//# sourceMappingURL=lroEngine.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export const successStates = ["succeeded"];
export const failureStates = ["failed", "canceled", "cancelled"];
/**
 * The LRO states that signal that the LRO has completed.
 */
export const terminalStates = successStates.concat(failureStates);
//# sourceMappingURL=models.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createGetLroStatusFromResponse, createInitializeState, createPoll } from "./stateMachine";
import { getPollingUrl } from "./requestUtils";
import { logger } from "./logger";
export class GenericPollOperation {
    constructor(state, lro, lroResourceLocationConfig, processResult, updateState, isDone) {
        this.state = state;
        this.lro = lro;
        this.lroResourceLocationConfig = lroResourceLocationConfig;
        this.processResult = processResult;
        this.updateState = updateState;
        this.isDone = isDone;
    }
    setPollerConfig(pollerConfig) {
        this.pollerConfig = pollerConfig;
    }
    /**
     * General update function for LROPoller, the general process is as follows
     * 1. Check initial operation result to determine the strategy to use
     *  - Strategies: Location, Azure-AsyncOperation, Original Uri
     * 2. Check if the operation result has a terminal state
     *  - Terminal state will be determined by each strategy
     *  2.1 If it is terminal state Check if a final GET request is required, if so
     *      send final GET request and return result from operation. If no final GET
     *      is required, just return the result from operation.
     *      - Determining what to call for final request is responsibility of each strategy
     *  2.2 If it is not terminal state, call the polling operation and go to step 1
     *      - Determining what to call for polling is responsibility of each strategy
     *      - Strategies will always use the latest URI for polling if provided otherwise
     *        the last known one
     */
    async update(options) {
        var _a, _b, _c;
        const state = this.state;
        let lastResponse = undefined;
        if (!state.isStarted) {
            const initializeState = createInitializeState(state, this.lro.requestPath, this.lro.requestMethod);
            lastResponse = await this.lro.sendInitialRequest();
            initializeState(lastResponse);
        }
        if (!state.isCompleted) {
            if (!this.poll || !this.getLroStatusFromResponse) {
                if (!state.config) {
                    throw new Error("Bad state: LRO mode is undefined. Please check if the serialized state is well-formed.");
                }
                const isDone = this.isDone;
                this.getLroStatusFromResponse = isDone
                    ? (response) => (Object.assign(Object.assign({}, response), { done: isDone(response.flatResponse, this.state) }))
                    : createGetLroStatusFromResponse(this.lro, state.config, this.lroResourceLocationConfig);
                this.poll = createPoll(this.lro);
            }
            if (!state.pollingURL) {
                throw new Error("Bad state: polling URL is undefined. Please check if the serialized state is well-formed.");
            }
            const currentState = await this.poll(state.pollingURL, this.pollerConfig, this.getLroStatusFromResponse);
            logger.verbose(`LRO: polling response: ${JSON.stringify(currentState.rawResponse)}`);
            if (currentState.done) {
                state.result = this.processResult
                    ? this.processResult(currentState.flatResponse, state)
                    : currentState.flatResponse;
                state.isCompleted = true;
            }
            else {
                this.poll = (_a = currentState.next) !== null && _a !== void 0 ? _a : this.poll;
                state.pollingURL = getPollingUrl(currentState.rawResponse, state.pollingURL);
            }
            lastResponse = currentState;
        }
        logger.verbose(`LRO: current state: ${JSON.stringify(state)}`);
        if (lastResponse) {
            (_b = this.updateState) === null || _b === void 0 ? void 0 : _b.call(this, state, lastResponse === null || lastResponse === void 0 ? void 0 : lastResponse.rawResponse);
        }
        else {
            logger.error(`LRO: no response was received`);
        }
        (_c = options === null || options === void 0 ? void 0 : options.fireProgress) === null || _c === void 0 ? void 0 : _c.call(options, state);
        return this;
    }
    async cancel() {
        this.state.isCancelled = true;
        return this;
    }
    /**
     * Serializes the Poller operation.
     */
    toString() {
        return JSON.stringify({
            state: this.state,
        });
    }
}
//# sourceMappingURL=operation.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export function processPassthroughOperationResult(response) {
    return Object.assign(Object.assign({}, response), { done: true });
}
//# sourceMappingURL=passthrough.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Detects where the continuation token is and returns it. Notice that azure-asyncoperation
 * must be checked first before the other location headers because there are scenarios
 * where both azure-asyncoperation and location could be present in the same response but
 * azure-asyncoperation should be the one to use for polling.
 */
export function getPollingUrl(rawResponse, defaultPath) {
    var _a, _b, _c;
    return ((_c = (_b = (_a = getAzureAsyncOperation(rawResponse)) !== null && _a !== void 0 ? _a : getOperationLocation(rawResponse)) !== null && _b !== void 0 ? _b : getLocation(rawResponse)) !== null && _c !== void 0 ? _c : defaultPath);
}
function getLocation(rawResponse) {
    return rawResponse.headers["location"];
}
function getOperationLocation(rawResponse) {
    return rawResponse.headers["operation-location"];
}
function getAzureAsyncOperation(rawResponse) {
    return rawResponse.headers["azure-asyncoperation"];
}
function findResourceLocation(requestMethod, rawResponse, requestPath) {
    switch (requestMethod) {
        case "PUT": {
            return requestPath;
        }
        case "POST":
        case "PATCH": {
            return getLocation(rawResponse);
        }
        default: {
            return undefined;
        }
    }
}
export function inferLroMode(requestPath, requestMethod, rawResponse) {
    if (getAzureAsyncOperation(rawResponse) !== undefined ||
        getOperationLocation(rawResponse) !== undefined) {
        return {
            mode: "Location",
            resourceLocation: findResourceLocation(requestMethod, rawResponse, requestPath),
        };
    }
    else if (getLocation(rawResponse) !== undefined) {
        return {
            mode: "Location",
        };
    }
    else if (["PUT", "PATCH"].includes(requestMethod)) {
        return {
            mode: "Body",
        };
    }
    return {};
}
class SimpleRestError extends Error {
    constructor(message, statusCode) {
        super(message);
        this.name = "RestError";
        this.statusCode = statusCode;
        Object.setPrototypeOf(this, SimpleRestError.prototype);
    }
}
export function isUnexpectedInitialResponse(rawResponse) {
    const code = rawResponse.statusCode;
    if (![203, 204, 202, 201, 200, 500].includes(code)) {
        throw new SimpleRestError(`Received unexpected HTTP status code ${code} in the initial response. This may indicate a server issue.`, code);
    }
    return false;
}
export function isUnexpectedPollingResponse(rawResponse) {
    const code = rawResponse.statusCode;
    if (![202, 201, 200, 500].includes(code)) {
        throw new SimpleRestError(`Received unexpected HTTP status code ${code} while polling. This may indicate a server issue.`, code);
    }
    return false;
}
//# sourceMappingURL=requestUtils.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { getPollingUrl, inferLroMode, isUnexpectedInitialResponse } from "./requestUtils";
import { isBodyPollingDone, processBodyPollingOperationResult } from "./bodyPolling";
import { logger } from "./logger";
import { processLocationPollingOperationResult } from "./locationPolling";
import { processPassthroughOperationResult } from "./passthrough";
/**
 * creates a stepping function that maps an LRO state to another.
 */
export function createGetLroStatusFromResponse(lroPrimitives, config, lroResourceLocationConfig) {
    switch (config.mode) {
        case "Location": {
            return processLocationPollingOperationResult(lroPrimitives, config.resourceLocation, lroResourceLocationConfig);
        }
        case "Body": {
            return processBodyPollingOperationResult;
        }
        default: {
            return processPassthroughOperationResult;
        }
    }
}
/**
 * Creates a polling operation.
 */
export function createPoll(lroPrimitives) {
    return async (path, pollerConfig, getLroStatusFromResponse) => {
        const response = await lroPrimitives.sendPollRequest(path);
        const retryAfter = response.rawResponse.headers["retry-after"];
        if (retryAfter !== undefined) {
            // Retry-After header value is either in HTTP date format, or in seconds
            const retryAfterInSeconds = parseInt(retryAfter);
            pollerConfig.intervalInMs = isNaN(retryAfterInSeconds)
                ? calculatePollingIntervalFromDate(new Date(retryAfter), pollerConfig.intervalInMs)
                : retryAfterInSeconds * 1000;
        }
        return getLroStatusFromResponse(response);
    };
}
function calculatePollingIntervalFromDate(retryAfterDate, defaultIntervalInMs) {
    const timeNow = Math.floor(new Date().getTime());
    const retryAfterTime = retryAfterDate.getTime();
    if (timeNow < retryAfterTime) {
        return retryAfterTime - timeNow;
    }
    return defaultIntervalInMs;
}
/**
 * Creates a callback to be used to initialize the polling operation state.
 * @param state - of the polling operation
 * @param operationSpec - of the LRO
 * @param callback - callback to be called when the operation is done
 * @returns callback that initializes the state of the polling operation
 */
export function createInitializeState(state, requestPath, requestMethod) {
    return (response) => {
        if (isUnexpectedInitialResponse(response.rawResponse))
            return true;
        state.initialRawResponse = response.rawResponse;
        state.isStarted = true;
        state.pollingURL = getPollingUrl(state.initialRawResponse, requestPath);
        state.config = inferLroMode(requestPath, requestMethod, state.initialRawResponse);
        /** short circuit polling if body polling is done in the initial request */
        if (state.config.mode === undefined ||
            (state.config.mode === "Body" && isBodyPollingDone(state.initialRawResponse))) {
            state.result = response.flatResponse;
            state.isCompleted = true;
        }
        logger.verbose(`LRO: initial state: ${JSON.stringify(state)}`);
        return Boolean(state.isCompleted);
    };
}
//# sourceMappingURL=stateMachine.js.map'use strict';

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

var logger$1 = require('@azure/logger');

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * When a poller is manually stopped through the `stopPolling` method,
 * the poller will be rejected with an instance of the PollerStoppedError.
 */
class PollerStoppedError extends Error {
    constructor(message) {
        super(message);
        this.name = "PollerStoppedError";
        Object.setPrototypeOf(this, PollerStoppedError.prototype);
    }
}
/**
 * When a poller is cancelled through the `cancelOperation` method,
 * the poller will be rejected with an instance of the PollerCancelledError.
 */
class PollerCancelledError extends Error {
    constructor(message) {
        super(message);
        this.name = "PollerCancelledError";
        Object.setPrototypeOf(this, PollerCancelledError.prototype);
    }
}
/**
 * A class that represents the definition of a program that polls through consecutive requests
 * until it reaches a state of completion.
 *
 * A poller can be executed manually, by polling request by request by calling to the `poll()` method repeatedly, until its operation is completed.
 * It also provides a way to wait until the operation completes, by calling `pollUntilDone()` and waiting until the operation finishes.
 * Pollers can also request the cancellation of the ongoing process to whom is providing the underlying long running operation.
 *
 * ```ts
 * const poller = new MyPoller();
 *
 * // Polling just once:
 * await poller.poll();
 *
 * // We can try to cancel the request here, by calling:
 * //
 * //     await poller.cancelOperation();
 * //
 *
 * // Getting the final result:
 * const result = await poller.pollUntilDone();
 * ```
 *
 * The Poller is defined by two types, a type representing the state of the poller, which
 * must include a basic set of properties from `PollOperationState<TResult>`,
 * and a return type defined by `TResult`, which can be anything.
 *
 * The Poller class implements the `PollerLike` interface, which allows poller implementations to avoid having
 * to export the Poller's class directly, and instead only export the already instantiated poller with the PollerLike type.
 *
 * ```ts
 * class Client {
 *   public async makePoller: PollerLike<MyOperationState, MyResult> {
 *     const poller = new MyPoller({});
 *     // It might be preferred to return the poller after the first request is made,
 *     // so that some information can be obtained right away.
 *     await poller.poll();
 *     return poller;
 *   }
 * }
 *
 * const poller: PollerLike<MyOperationState, MyResult> = myClient.makePoller();
 * ```
 *
 * A poller can be created through its constructor, then it can be polled until it's completed.
 * At any point in time, the state of the poller can be obtained without delay through the getOperationState method.
 * At any point in time, the intermediate forms of the result type can be requested without delay.
 * Once the underlying operation is marked as completed, the poller will stop and the final value will be returned.
 *
 * ```ts
 * const poller = myClient.makePoller();
 * const state: MyOperationState = poller.getOperationState();
 *
 * // The intermediate result can be obtained at any time.
 * const result: MyResult | undefined = poller.getResult();
 *
 * // The final result can only be obtained after the poller finishes.
 * const result: MyResult = await poller.pollUntilDone();
 * ```
 *
 */
// eslint-disable-next-line no-use-before-define
class Poller {
    /**
     * A poller needs to be initialized by passing in at least the basic properties of the `PollOperation<TState, TResult>`.
     *
     * When writing an implementation of a Poller, this implementation needs to deal with the initialization
     * of any custom state beyond the basic definition of the poller. The basic poller assumes that the poller's
     * operation has already been defined, at least its basic properties. The code below shows how to approach
     * the definition of the constructor of a new custom poller.
     *
     * ```ts
     * export class MyPoller extends Poller<MyOperationState, string> {
     *   constructor({
     *     // Anything you might need outside of the basics
     *   }) {
     *     let state: MyOperationState = {
     *       privateProperty: private,
     *       publicProperty: public,
     *     };
     *
     *     const operation = {
     *       state,
     *       update,
     *       cancel,
     *       toString
     *     }
     *
     *     // Sending the operation to the parent's constructor.
     *     super(operation);
     *
     *     // You can assign more local properties here.
     *   }
     * }
     * ```
     *
     * Inside of this constructor, a new promise is created. This will be used to
     * tell the user when the poller finishes (see `pollUntilDone()`). The promise's
     * resolve and reject methods are also used internally to control when to resolve
     * or reject anyone waiting for the poller to finish.
     *
     * The constructor of a custom implementation of a poller is where any serialized version of
     * a previous poller's operation should be deserialized into the operation sent to the
     * base constructor. For example:
     *
     * ```ts
     * export class MyPoller extends Poller<MyOperationState, string> {
     *   constructor(
     *     baseOperation: string | undefined
     *   ) {
     *     let state: MyOperationState = {};
     *     if (baseOperation) {
     *       state = {
     *         ...JSON.parse(baseOperation).state,
     *         ...state
     *       };
     *     }
     *     const operation = {
     *       state,
     *       // ...
     *     }
     *     super(operation);
     *   }
     * }
     * ```
     *
     * @param operation - Must contain the basic properties of `PollOperation<State, TResult>`.
     */
    constructor(operation) {
        this.stopped = true;
        this.pollProgressCallbacks = [];
        this.operation = operation;
        this.promise = new Promise((resolve, reject) => {
            this.resolve = resolve;
            this.reject = reject;
        });
        // This prevents the UnhandledPromiseRejectionWarning in node.js from being thrown.
        // The above warning would get thrown if `poller.poll` is called, it returns an error,
        // and pullUntilDone did not have a .catch or await try/catch on it's return value.
        this.promise.catch(() => {
            /* intentionally blank */
        });
    }
    /**
     * Starts a loop that will break only if the poller is done
     * or if the poller is stopped.
     */
    async startPolling() {
        if (this.stopped) {
            this.stopped = false;
        }
        while (!this.isStopped() && !this.isDone()) {
            await this.poll();
            await this.delay();
        }
    }
    /**
     * pollOnce does one polling, by calling to the update method of the underlying
     * poll operation to make any relevant change effective.
     *
     * It only optionally receives an object with an abortSignal property, from \@azure/abort-controller's AbortSignalLike.
     *
     * @param options - Optional properties passed to the operation's update method.
     */
    async pollOnce(options = {}) {
        try {
            if (!this.isDone()) {
                this.operation = await this.operation.update({
                    abortSignal: options.abortSignal,
                    fireProgress: this.fireProgress.bind(this),
                });
                if (this.isDone() && this.resolve) {
                    // If the poller has finished polling, this means we now have a result.
                    // However, it can be the case that TResult is instantiated to void, so
                    // we are not expecting a result anyway. To assert that we might not
                    // have a result eventually after finishing polling, we cast the result
                    // to TResult.
                    this.resolve(this.operation.state.result);
                }
            }
        }
        catch (e) {
            this.operation.state.error = e;
            if (this.reject) {
                this.reject(e);
            }
            throw e;
        }
    }
    /**
     * fireProgress calls the functions passed in via onProgress the method of the poller.
     *
     * It loops over all of the callbacks received from onProgress, and executes them, sending them
     * the current operation state.
     *
     * @param state - The current operation state.
     */
    fireProgress(state) {
        for (const callback of this.pollProgressCallbacks) {
            callback(state);
        }
    }
    /**
     * Invokes the underlying operation's cancel method, and rejects the
     * pollUntilDone promise.
     */
    async cancelOnce(options = {}) {
        this.operation = await this.operation.cancel(options);
        if (this.reject) {
            this.reject(new PollerCancelledError("Poller cancelled"));
        }
    }
    /**
     * Returns a promise that will resolve once a single polling request finishes.
     * It does this by calling the update method of the Poller's operation.
     *
     * It only optionally receives an object with an abortSignal property, from \@azure/abort-controller's AbortSignalLike.
     *
     * @param options - Optional properties passed to the operation's update method.
     */
    poll(options = {}) {
        if (!this.pollOncePromise) {
            this.pollOncePromise = this.pollOnce(options);
            const clearPollOncePromise = () => {
                this.pollOncePromise = undefined;
            };
            this.pollOncePromise.then(clearPollOncePromise, clearPollOncePromise).catch(this.reject);
        }
        return this.pollOncePromise;
    }
    /**
     * Returns a promise that will resolve once the underlying operation is completed.
     */
    async pollUntilDone() {
        if (this.stopped) {
            this.startPolling().catch(this.reject);
        }
        return this.promise;
    }
    /**
     * Invokes the provided callback after each polling is completed,
     * sending the current state of the poller's operation.
     *
     * It returns a method that can be used to stop receiving updates on the given callback function.
     */
    onProgress(callback) {
        this.pollProgressCallbacks.push(callback);
        return () => {
            this.pollProgressCallbacks = this.pollProgressCallbacks.filter((c) => c !== callback);
        };
    }
    /**
     * Returns true if the poller has finished polling.
     */
    isDone() {
        const state = this.operation.state;
        return Boolean(state.isCompleted || state.isCancelled || state.error);
    }
    /**
     * Stops the poller from continuing to poll.
     */
    stopPolling() {
        if (!this.stopped) {
            this.stopped = true;
            if (this.reject) {
                this.reject(new PollerStoppedError("This poller is already stopped"));
            }
        }
    }
    /**
     * Returns true if the poller is stopped.
     */
    isStopped() {
        return this.stopped;
    }
    /**
     * Attempts to cancel the underlying operation.
     *
     * It only optionally receives an object with an abortSignal property, from \@azure/abort-controller's AbortSignalLike.
     *
     * If it's called again before it finishes, it will throw an error.
     *
     * @param options - Optional properties passed to the operation's update method.
     */
    cancelOperation(options = {}) {
        if (!this.stopped) {
            this.stopped = true;
        }
        if (!this.cancelPromise) {
            this.cancelPromise = this.cancelOnce(options);
        }
        else if (options.abortSignal) {
            throw new Error("A cancel request is currently pending");
        }
        return this.cancelPromise;
    }
    /**
     * Returns the state of the operation.
     *
     * Even though TState will be the same type inside any of the methods of any extension of the Poller class,
     * implementations of the pollers can customize what's shared with the public by writing their own
     * version of the `getOperationState` method, and by defining two types, one representing the internal state of the poller
     * and a public type representing a safe to share subset of the properties of the internal state.
     * Their definition of getOperationState can then return their public type.
     *
     * Example:
     *
     * ```ts
     * // Let's say we have our poller's operation state defined as:
     * interface MyOperationState extends PollOperationState<ResultType> {
     *   privateProperty?: string;
     *   publicProperty?: string;
     * }
     *
     * // To allow us to have a true separation of public and private state, we have to define another interface:
     * interface PublicState extends PollOperationState<ResultType> {
     *   publicProperty?: string;
     * }
     *
     * // Then, we define our Poller as follows:
     * export class MyPoller extends Poller<MyOperationState, ResultType> {
     *   // ... More content is needed here ...
     *
     *   public getOperationState(): PublicState {
     *     const state: PublicState = this.operation.state;
     *     return {
     *       // Properties from PollOperationState<TResult>
     *       isStarted: state.isStarted,
     *       isCompleted: state.isCompleted,
     *       isCancelled: state.isCancelled,
     *       error: state.error,
     *       result: state.result,
     *
     *       // The only other property needed by PublicState.
     *       publicProperty: state.publicProperty
     *     }
     *   }
     * }
     * ```
     *
     * You can see this in the tests of this repository, go to the file:
     * `../test/utils/testPoller.ts`
     * and look for the getOperationState implementation.
     */
    getOperationState() {
        return this.operation.state;
    }
    /**
     * Returns the result value of the operation,
     * regardless of the state of the poller.
     * It can return undefined or an incomplete form of the final TResult value
     * depending on the implementation.
     */
    getResult() {
        const state = this.operation.state;
        return state.result;
    }
    /**
     * Returns a serialized version of the poller's operation
     * by invoking the operation's toString method.
     */
    toString() {
        return this.operation.toString();
    }
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Detects where the continuation token is and returns it. Notice that azure-asyncoperation
 * must be checked first before the other location headers because there are scenarios
 * where both azure-asyncoperation and location could be present in the same response but
 * azure-asyncoperation should be the one to use for polling.
 */
function getPollingUrl(rawResponse, defaultPath) {
    var _a, _b, _c;
    return ((_c = (_b = (_a = getAzureAsyncOperation(rawResponse)) !== null && _a !== void 0 ? _a : getOperationLocation(rawResponse)) !== null && _b !== void 0 ? _b : getLocation(rawResponse)) !== null && _c !== void 0 ? _c : defaultPath);
}
function getLocation(rawResponse) {
    return rawResponse.headers["location"];
}
function getOperationLocation(rawResponse) {
    return rawResponse.headers["operation-location"];
}
function getAzureAsyncOperation(rawResponse) {
    return rawResponse.headers["azure-asyncoperation"];
}
function findResourceLocation(requestMethod, rawResponse, requestPath) {
    switch (requestMethod) {
        case "PUT": {
            return requestPath;
        }
        case "POST":
        case "PATCH": {
            return getLocation(rawResponse);
        }
        default: {
            return undefined;
        }
    }
}
function inferLroMode(requestPath, requestMethod, rawResponse) {
    if (getAzureAsyncOperation(rawResponse) !== undefined ||
        getOperationLocation(rawResponse) !== undefined) {
        return {
            mode: "Location",
            resourceLocation: findResourceLocation(requestMethod, rawResponse, requestPath),
        };
    }
    else if (getLocation(rawResponse) !== undefined) {
        return {
            mode: "Location",
        };
    }
    else if (["PUT", "PATCH"].includes(requestMethod)) {
        return {
            mode: "Body",
        };
    }
    return {};
}
class SimpleRestError extends Error {
    constructor(message, statusCode) {
        super(message);
        this.name = "RestError";
        this.statusCode = statusCode;
        Object.setPrototypeOf(this, SimpleRestError.prototype);
    }
}
function isUnexpectedInitialResponse(rawResponse) {
    const code = rawResponse.statusCode;
    if (![203, 204, 202, 201, 200, 500].includes(code)) {
        throw new SimpleRestError(`Received unexpected HTTP status code ${code} in the initial response. This may indicate a server issue.`, code);
    }
    return false;
}
function isUnexpectedPollingResponse(rawResponse) {
    const code = rawResponse.statusCode;
    if (![202, 201, 200, 500].includes(code)) {
        throw new SimpleRestError(`Received unexpected HTTP status code ${code} while polling. This may indicate a server issue.`, code);
    }
    return false;
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
const successStates = ["succeeded"];
const failureStates = ["failed", "canceled", "cancelled"];

// Copyright (c) Microsoft Corporation.
function getProvisioningState(rawResponse) {
    var _a, _b;
    const { properties, provisioningState } = (_a = rawResponse.body) !== null && _a !== void 0 ? _a : {};
    const state = (_b = properties === null || properties === void 0 ? void 0 : properties.provisioningState) !== null && _b !== void 0 ? _b : provisioningState;
    return typeof state === "string" ? state.toLowerCase() : "succeeded";
}
function isBodyPollingDone(rawResponse) {
    const state = getProvisioningState(rawResponse);
    if (isUnexpectedPollingResponse(rawResponse) || failureStates.includes(state)) {
        throw new Error(`The long running operation has failed. The provisioning state: ${state}.`);
    }
    return successStates.includes(state);
}
/**
 * Creates a polling strategy based on BodyPolling which uses the provisioning state
 * from the result to determine the current operation state
 */
function processBodyPollingOperationResult(response) {
    return Object.assign(Object.assign({}, response), { done: isBodyPollingDone(response.rawResponse) });
}

// Copyright (c) Microsoft Corporation.
/**
 * The `@azure/logger` configuration for this package.
 * @internal
 */
const logger = logger$1.createClientLogger("core-lro");

// Copyright (c) Microsoft Corporation.
function isPollingDone(rawResponse) {
    var _a;
    if (isUnexpectedPollingResponse(rawResponse) || rawResponse.statusCode === 202) {
        return false;
    }
    const { status } = (_a = rawResponse.body) !== null && _a !== void 0 ? _a : {};
    const state = typeof status === "string" ? status.toLowerCase() : "succeeded";
    if (isUnexpectedPollingResponse(rawResponse) || failureStates.includes(state)) {
        throw new Error(`The long running operation has failed. The provisioning state: ${state}.`);
    }
    return successStates.includes(state);
}
/**
 * Sends a request to the URI of the provisioned resource if needed.
 */
async function sendFinalRequest(lro, resourceLocation, lroResourceLocationConfig) {
    switch (lroResourceLocationConfig) {
        case "original-uri":
            return lro.sendPollRequest(lro.requestPath);
        case "azure-async-operation":
            return undefined;
        case "location":
        default:
            return lro.sendPollRequest(resourceLocation !== null && resourceLocation !== void 0 ? resourceLocation : lro.requestPath);
    }
}
function processLocationPollingOperationResult(lro, resourceLocation, lroResourceLocationConfig) {
    return (response) => {
        if (isPollingDone(response.rawResponse)) {
            if (resourceLocation === undefined) {
                return Object.assign(Object.assign({}, response), { done: true });
            }
            else {
                return Object.assign(Object.assign({}, response), { done: false, next: async () => {
                        const finalResponse = await sendFinalRequest(lro, resourceLocation, lroResourceLocationConfig);
                        return Object.assign(Object.assign({}, (finalResponse !== null && finalResponse !== void 0 ? finalResponse : response)), { done: true });
                    } });
            }
        }
        return Object.assign(Object.assign({}, response), { done: false });
    };
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
function processPassthroughOperationResult(response) {
    return Object.assign(Object.assign({}, response), { done: true });
}

// Copyright (c) Microsoft Corporation.
/**
 * creates a stepping function that maps an LRO state to another.
 */
function createGetLroStatusFromResponse(lroPrimitives, config, lroResourceLocationConfig) {
    switch (config.mode) {
        case "Location": {
            return processLocationPollingOperationResult(lroPrimitives, config.resourceLocation, lroResourceLocationConfig);
        }
        case "Body": {
            return processBodyPollingOperationResult;
        }
        default: {
            return processPassthroughOperationResult;
        }
    }
}
/**
 * Creates a polling operation.
 */
function createPoll(lroPrimitives) {
    return async (path, pollerConfig, getLroStatusFromResponse) => {
        const response = await lroPrimitives.sendPollRequest(path);
        const retryAfter = response.rawResponse.headers["retry-after"];
        if (retryAfter !== undefined) {
            // Retry-After header value is either in HTTP date format, or in seconds
            const retryAfterInSeconds = parseInt(retryAfter);
            pollerConfig.intervalInMs = isNaN(retryAfterInSeconds)
                ? calculatePollingIntervalFromDate(new Date(retryAfter), pollerConfig.intervalInMs)
                : retryAfterInSeconds * 1000;
        }
        return getLroStatusFromResponse(response);
    };
}
function calculatePollingIntervalFromDate(retryAfterDate, defaultIntervalInMs) {
    const timeNow = Math.floor(new Date().getTime());
    const retryAfterTime = retryAfterDate.getTime();
    if (timeNow < retryAfterTime) {
        return retryAfterTime - timeNow;
    }
    return defaultIntervalInMs;
}
/**
 * Creates a callback to be used to initialize the polling operation state.
 * @param state - of the polling operation
 * @param operationSpec - of the LRO
 * @param callback - callback to be called when the operation is done
 * @returns callback that initializes the state of the polling operation
 */
function createInitializeState(state, requestPath, requestMethod) {
    return (response) => {
        if (isUnexpectedInitialResponse(response.rawResponse))
            ;
        state.initialRawResponse = response.rawResponse;
        state.isStarted = true;
        state.pollingURL = getPollingUrl(state.initialRawResponse, requestPath);
        state.config = inferLroMode(requestPath, requestMethod, state.initialRawResponse);
        /** short circuit polling if body polling is done in the initial request */
        if (state.config.mode === undefined ||
            (state.config.mode === "Body" && isBodyPollingDone(state.initialRawResponse))) {
            state.result = response.flatResponse;
            state.isCompleted = true;
        }
        logger.verbose(`LRO: initial state: ${JSON.stringify(state)}`);
        return Boolean(state.isCompleted);
    };
}

// Copyright (c) Microsoft Corporation.
class GenericPollOperation {
    constructor(state, lro, lroResourceLocationConfig, processResult, updateState, isDone) {
        this.state = state;
        this.lro = lro;
        this.lroResourceLocationConfig = lroResourceLocationConfig;
        this.processResult = processResult;
        this.updateState = updateState;
        this.isDone = isDone;
    }
    setPollerConfig(pollerConfig) {
        this.pollerConfig = pollerConfig;
    }
    /**
     * General update function for LROPoller, the general process is as follows
     * 1. Check initial operation result to determine the strategy to use
     *  - Strategies: Location, Azure-AsyncOperation, Original Uri
     * 2. Check if the operation result has a terminal state
     *  - Terminal state will be determined by each strategy
     *  2.1 If it is terminal state Check if a final GET request is required, if so
     *      send final GET request and return result from operation. If no final GET
     *      is required, just return the result from operation.
     *      - Determining what to call for final request is responsibility of each strategy
     *  2.2 If it is not terminal state, call the polling operation and go to step 1
     *      - Determining what to call for polling is responsibility of each strategy
     *      - Strategies will always use the latest URI for polling if provided otherwise
     *        the last known one
     */
    async update(options) {
        var _a, _b, _c;
        const state = this.state;
        let lastResponse = undefined;
        if (!state.isStarted) {
            const initializeState = createInitializeState(state, this.lro.requestPath, this.lro.requestMethod);
            lastResponse = await this.lro.sendInitialRequest();
            initializeState(lastResponse);
        }
        if (!state.isCompleted) {
            if (!this.poll || !this.getLroStatusFromResponse) {
                if (!state.config) {
                    throw new Error("Bad state: LRO mode is undefined. Please check if the serialized state is well-formed.");
                }
                const isDone = this.isDone;
                this.getLroStatusFromResponse = isDone
                    ? (response) => (Object.assign(Object.assign({}, response), { done: isDone(response.flatResponse, this.state) }))
                    : createGetLroStatusFromResponse(this.lro, state.config, this.lroResourceLocationConfig);
                this.poll = createPoll(this.lro);
            }
            if (!state.pollingURL) {
                throw new Error("Bad state: polling URL is undefined. Please check if the serialized state is well-formed.");
            }
            const currentState = await this.poll(state.pollingURL, this.pollerConfig, this.getLroStatusFromResponse);
            logger.verbose(`LRO: polling response: ${JSON.stringify(currentState.rawResponse)}`);
            if (currentState.done) {
                state.result = this.processResult
                    ? this.processResult(currentState.flatResponse, state)
                    : currentState.flatResponse;
                state.isCompleted = true;
            }
            else {
                this.poll = (_a = currentState.next) !== null && _a !== void 0 ? _a : this.poll;
                state.pollingURL = getPollingUrl(currentState.rawResponse, state.pollingURL);
            }
            lastResponse = currentState;
        }
        logger.verbose(`LRO: current state: ${JSON.stringify(state)}`);
        if (lastResponse) {
            (_b = this.updateState) === null || _b === void 0 ? void 0 : _b.call(this, state, lastResponse === null || lastResponse === void 0 ? void 0 : lastResponse.rawResponse);
        }
        else {
            logger.error(`LRO: no response was received`);
        }
        (_c = options === null || options === void 0 ? void 0 : options.fireProgress) === null || _c === void 0 ? void 0 : _c.call(options, state);
        return this;
    }
    async cancel() {
        this.state.isCancelled = true;
        return this;
    }
    /**
     * Serializes the Poller operation.
     */
    toString() {
        return JSON.stringify({
            state: this.state,
        });
    }
}

// Copyright (c) Microsoft Corporation.
function deserializeState(serializedState) {
    try {
        return JSON.parse(serializedState).state;
    }
    catch (e) {
        throw new Error(`LroEngine: Unable to deserialize state: ${serializedState}`);
    }
}
/**
 * The LRO Engine, a class that performs polling.
 */
class LroEngine extends Poller {
    constructor(lro, options) {
        const { intervalInMs = 2000, resumeFrom } = options || {};
        const state = resumeFrom
            ? deserializeState(resumeFrom)
            : {};
        const operation = new GenericPollOperation(state, lro, options === null || options === void 0 ? void 0 : options.lroResourceLocationConfig, options === null || options === void 0 ? void 0 : options.processResult, options === null || options === void 0 ? void 0 : options.updateState, options === null || options === void 0 ? void 0 : options.isDone);
        super(operation);
        this.config = { intervalInMs: intervalInMs };
        operation.setPollerConfig(this.config);
    }
    /**
     * The method used by the poller to wait before attempting to update its operation.
     */
    delay() {
        return new Promise((resolve) => setTimeout(() => resolve(), this.config.intervalInMs));
    }
}

exports.LroEngine = LroEngine;
exports.Poller = Poller;
exports.PollerCancelledError = PollerCancelledError;
exports.PollerStoppedError = PollerStoppedError;
//# sourceMappingURL=index.js.map
The MIT License (MIT)

Copyright (c) 2020 Microsoft

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": "@azure/core-paging",
  "author": "Microsoft Corporation",
  "sdk-type": "client",
  "version": "1.3.0",
  "description": "Core types for paging async iterable iterators",
  "main": "dist/index.js",
  "module": "dist-esm/src/index.js",
  "types": "./types/latest/core-paging.d.ts",
  "typesVersions": {
    "<3.6": {
      "types/latest/*": [
        "types/3.1/*"
      ]
    }
  },
  "files": [
    "types/latest/core-paging.d.ts",
    "types/3.1",
    "dist/",
    "dist-esm/src/",
    "LICENSE",
    "README.md"
  ],
  "engines": {
    "node": ">=12.0.0"
  },
  "license": "MIT",
  "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/core/core-paging/README.md",
  "repository": "github:Azure/azure-sdk-for-js",
  "sideEffects": true,
  "private": false,
  "dependencies": {
    "tslib": "^2.2.0"
  },
  "devDependencies": {
    "@azure/dev-tool": "^1.0.0",
    "@microsoft/api-extractor": "7.18.11",
    "@azure/eslint-plugin-azure-sdk": "^3.0.0",
    "@types/chai": "^4.1.6",
    "@types/mocha": "^7.0.2",
    "@types/node": "^12.0.0",
    "chai": "^4.2.0",
    "downlevel-dts": "^0.8.0",
    "eslint": "^7.15.0",
    "karma": "^6.2.0",
    "karma-chrome-launcher": "^3.0.0",
    "karma-coverage": "^2.0.0",
    "karma-edge-launcher": "^0.4.2",
    "karma-env-preprocessor": "^0.1.1",
    "karma-firefox-launcher": "^1.1.0",
    "karma-ie-launcher": "^1.0.0",
    "karma-junit-reporter": "^2.0.1",
    "karma-mocha": "^2.0.1",
    "karma-mocha-reporter": "^2.2.5",
    "karma-sourcemap-loader": "^0.3.8",
    "mocha": "^7.1.1",
    "mocha-junit-reporter": "^2.0.0",
    "prettier": "^2.5.1",
    "rimraf": "^3.0.0",
    "typescript": "~4.6.0"
  },
  "//sampleConfiguration": {
    "skipFolder": true,
    "disableDocsMs": true,
    "productName": "Azure SDK Core",
    "productSlugs": [
      "azure"
    ]
  }
}// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { __asyncDelegator, __asyncGenerator, __asyncValues, __await } from "tslib";
/**
 * returns an async iterator that iterates over results. It also has a `byPage`
 * method that returns pages of items at once.
 *
 * @param pagedResult - an object that specifies how to get pages.
 * @returns a paged async iterator that iterates over results.
 */
export function getPagedAsyncIterator(pagedResult) {
    var _a;
    const iter = getItemAsyncIterator(pagedResult);
    return {
        next() {
            return iter.next();
        },
        [Symbol.asyncIterator]() {
            return this;
        },
        byPage: (_a = pagedResult === null || pagedResult === void 0 ? void 0 : pagedResult.byPage) !== null && _a !== void 0 ? _a : ((settings) => {
            const { continuationToken, maxPageSize } = settings !== null && settings !== void 0 ? settings : {};
            return getPageAsyncIterator(pagedResult, {
                pageLink: continuationToken,
                maxPageSize,
            });
        }),
    };
}
function getItemAsyncIterator(pagedResult) {
    return __asyncGenerator(this, arguments, function* getItemAsyncIterator_1() {
        var e_1, _a;
        const pages = getPageAsyncIterator(pagedResult);
        const firstVal = yield __await(pages.next());
        // if the result does not have an array shape, i.e. TPage = TElement, then we return it as is
        if (!Array.isArray(firstVal.value)) {
            yield yield __await(firstVal.value);
            // `pages` is of type `AsyncIterableIterator<TPage>` but TPage = TElement in this case
            yield __await(yield* __asyncDelegator(__asyncValues(pages)));
        }
        else {
            yield __await(yield* __asyncDelegator(__asyncValues(firstVal.value)));
            try {
                for (var pages_1 = __asyncValues(pages), pages_1_1; pages_1_1 = yield __await(pages_1.next()), !pages_1_1.done;) {
                    const page = pages_1_1.value;
                    // pages is of type `AsyncIterableIterator<TPage>` so `page` is of type `TPage`. In this branch,
                    // it must be the case that `TPage = TElement[]`
                    yield __await(yield* __asyncDelegator(__asyncValues(page)));
                }
            }
            catch (e_1_1) { e_1 = { error: e_1_1 }; }
            finally {
                try {
                    if (pages_1_1 && !pages_1_1.done && (_a = pages_1.return)) yield __await(_a.call(pages_1));
                }
                finally { if (e_1) throw e_1.error; }
            }
        }
    });
}
function getPageAsyncIterator(pagedResult, options = {}) {
    return __asyncGenerator(this, arguments, function* getPageAsyncIterator_1() {
        const { pageLink, maxPageSize } = options;
        let response = yield __await(pagedResult.getPage(pageLink !== null && pageLink !== void 0 ? pageLink : pagedResult.firstPageLink, maxPageSize));
        yield yield __await(response.page);
        while (response.nextPageLink) {
            response = yield __await(pagedResult.getPage(response.nextPageLink, maxPageSize));
            yield yield __await(response.page);
        }
    });
}
//# sourceMappingURL=getPagedAsyncIterator.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export * from "./models";
export * from "./getPagedAsyncIterator";
//# sourceMappingURL=index.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=models.js.map'use strict';

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

var tslib = require('tslib');

// Copyright (c) Microsoft Corporation.
/**
 * returns an async iterator that iterates over results. It also has a `byPage`
 * method that returns pages of items at once.
 *
 * @param pagedResult - an object that specifies how to get pages.
 * @returns a paged async iterator that iterates over results.
 */
function getPagedAsyncIterator(pagedResult) {
    var _a;
    const iter = getItemAsyncIterator(pagedResult);
    return {
        next() {
            return iter.next();
        },
        [Symbol.asyncIterator]() {
            return this;
        },
        byPage: (_a = pagedResult === null || pagedResult === void 0 ? void 0 : pagedResult.byPage) !== null && _a !== void 0 ? _a : ((settings) => {
            const { continuationToken, maxPageSize } = settings !== null && settings !== void 0 ? settings : {};
            return getPageAsyncIterator(pagedResult, {
                pageLink: continuationToken,
                maxPageSize,
            });
        }),
    };
}
function getItemAsyncIterator(pagedResult) {
    return tslib.__asyncGenerator(this, arguments, function* getItemAsyncIterator_1() {
        var e_1, _a;
        const pages = getPageAsyncIterator(pagedResult);
        const firstVal = yield tslib.__await(pages.next());
        // if the result does not have an array shape, i.e. TPage = TElement, then we return it as is
        if (!Array.isArray(firstVal.value)) {
            yield yield tslib.__await(firstVal.value);
            // `pages` is of type `AsyncIterableIterator<TPage>` but TPage = TElement in this case
            yield tslib.__await(yield* tslib.__asyncDelegator(tslib.__asyncValues(pages)));
        }
        else {
            yield tslib.__await(yield* tslib.__asyncDelegator(tslib.__asyncValues(firstVal.value)));
            try {
                for (var pages_1 = tslib.__asyncValues(pages), pages_1_1; pages_1_1 = yield tslib.__await(pages_1.next()), !pages_1_1.done;) {
                    const page = pages_1_1.value;
                    // pages is of type `AsyncIterableIterator<TPage>` so `page` is of type `TPage`. In this branch,
                    // it must be the case that `TPage = TElement[]`
                    yield tslib.__await(yield* tslib.__asyncDelegator(tslib.__asyncValues(page)));
                }
            }
            catch (e_1_1) { e_1 = { error: e_1_1 }; }
            finally {
                try {
                    if (pages_1_1 && !pages_1_1.done && (_a = pages_1.return)) yield tslib.__await(_a.call(pages_1));
                }
                finally { if (e_1) throw e_1.error; }
            }
        }
    });
}
function getPageAsyncIterator(pagedResult, options = {}) {
    return tslib.__asyncGenerator(this, arguments, function* getPageAsyncIterator_1() {
        const { pageLink, maxPageSize } = options;
        let response = yield tslib.__await(pagedResult.getPage(pageLink !== null && pageLink !== void 0 ? pageLink : pagedResult.firstPageLink, maxPageSize));
        yield yield tslib.__await(response.page);
        while (response.nextPageLink) {
            response = yield tslib.__await(pagedResult.getPage(response.nextPageLink, maxPageSize));
            yield yield tslib.__await(response.page);
        }
    });
}

exports.getPagedAsyncIterator = getPagedAsyncIterator;
//# sourceMappingURL=index.js.map
The MIT License (MIT)

Copyright (c) 2020 Microsoft

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": "@azure/core-rest-pipeline",
  "version": "1.9.0",
  "description": "Isomorphic client library for making HTTP requests in node.js and browser.",
  "sdk-type": "client",
  "main": "dist/index.js",
  "module": "dist-esm/src/index.js",
  "browser": {
    "./dist-esm/src/defaultHttpClient.js": "./dist-esm/src/defaultHttpClient.browser.js",
    "./dist-esm/src/policies/decompressResponsePolicy.js": "./dist-esm/src/policies/decompressResponsePolicy.browser.js",
    "./dist-esm/src/policies/formDataPolicy.js": "./dist-esm/src/policies/formDataPolicy.browser.js",
    "./dist-esm/src/policies/proxyPolicy.js": "./dist-esm/src/policies/proxyPolicy.browser.js",
    "./dist-esm/src/util/inspect.js": "./dist-esm/src/util/inspect.browser.js",
    "./dist-esm/src/util/userAgentPlatform.js": "./dist-esm/src/util/userAgentPlatform.browser.js"
  },
  "react-native": {
    "./dist/index.js": "./dist-esm/src/index.js",
    "./dist-esm/src/defaultHttpClient.js": "./dist-esm/src/defaultHttpClient.native.js",
    "./dist-esm/src/util/userAgentPlatform.js": "./dist-esm/src/util/userAgentPlatform.native.js"
  },
  "types": "core-rest-pipeline.shims.d.ts",
  "typesVersions": {
    "<3.6": {
      "core-rest-pipeline.shims.d.ts": [
        "core-rest-pipeline.shims-3_1.d.ts"
      ]
    }
  },
  "files": [
    "dist/",
    "dist-esm/src/",
    "types/3.1/core-rest-pipeline.d.ts",
    "types/latest/core-rest-pipeline.d.ts",
    "core-rest-pipeline.shims.d.ts",
    "core-rest-pipeline.shims-3_1.d.ts",
    "LICENSE",
    "README.md"
  ],
  "repository": "github:Azure/azure-sdk-for-js",
  "author": "Microsoft Corporation",
  "license": "MIT",
  "engines": {
    "node": ">=12.0.0"
  },
  "homepage": "https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/core/core-rest-pipeline/",
  "sideEffects": false,
  "prettier": "@azure/eslint-plugin-azure-sdk/prettier.json",
  "//metadata": {
    "constantPaths": [
      {
        "path": "src/constants.ts",
        "prefix": "SDK_VERSION"
      }
    ]
  },
  "dependencies": {
    "@azure/abort-controller": "^1.0.0",
    "@azure/core-auth": "^1.3.0",
    "@azure/core-tracing": "^1.0.1",
    "@azure/core-util": "^1.0.0",
    "@azure/logger": "^1.0.0",
    "form-data": "^4.0.0",
    "tslib": "^2.2.0",
    "http-proxy-agent": "^4.0.1",
    "https-proxy-agent": "^5.0.0",
    "uuid": "^8.3.0"
  },
  "devDependencies": {
    "@azure/dev-tool": "^1.0.0",
    "@azure/eslint-plugin-azure-sdk": "^3.0.0",
    "@microsoft/api-extractor": "7.18.11",
    "@opentelemetry/api": "^1.0.1",
    "@types/chai": "^4.1.6",
    "@types/chai-as-promised": "^7.1.0",
    "@types/mocha": "^7.0.2",
    "@types/node": "^12.0.0",
    "@types/sinon": "^9.0.4",
    "@types/uuid": "^8.0.0",
    "chai": "^4.2.0",
    "chai-as-promised": "^7.1.1",
    "downlevel-dts": "^0.8.0",
    "cross-env": "^7.0.2",
    "eslint": "^8.0.0",
    "inherits": "^2.0.3",
    "karma-chrome-launcher": "^3.1.0",
    "karma-coverage": "^2.0.0",
    "karma-edge-launcher": "^0.4.2",
    "karma-env-preprocessor": "^0.1.1",
    "karma-firefox-launcher": "^1.1.0",
    "karma-ie-launcher": "^1.0.0",
    "karma-junit-reporter": "^2.0.1",
    "karma-mocha-reporter": "^2.2.5",
    "karma-mocha": "^2.0.1",
    "karma-sourcemap-loader": "^0.3.8",
    "karma": "^6.3.0",
    "mocha-junit-reporter": "^2.0.0",
    "mocha": "^7.1.1",
    "prettier": "^2.5.1",
    "puppeteer": "^14.0.0",
    "rimraf": "^3.0.0",
    "sinon": "^9.0.2",
    "source-map-support": "^0.5.9",
    "typescript": "~4.6.0",
    "util": "^0.12.1"
  },
  "//sampleConfiguration": {
    "skipFolder": true,
    "disableDocsMs": true,
    "productName": "Azure SDK Core",
    "productSlugs": [
      "azure"
    ]
  }
}// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Defines the default token refresh buffer duration.
 */
export const DefaultTokenRefreshBufferMs = 2 * 60 * 1000; // 2 Minutes
/**
 * Provides an AccessTokenCache implementation which clears
 * the cached AccessToken's after the expiresOnTimestamp has
 * passed.
 * @internal
 */
export class ExpiringAccessTokenCache {
    /**
     * Constructs an instance of ExpiringAccessTokenCache with
     * an optional expiration buffer time.
     */
    constructor(tokenRefreshBufferMs = DefaultTokenRefreshBufferMs) {
        this.tokenRefreshBufferMs = tokenRefreshBufferMs;
    }
    setCachedToken(accessToken) {
        this.cachedToken = accessToken;
    }
    getCachedToken() {
        if (this.cachedToken &&
            Date.now() + this.tokenRefreshBufferMs >= this.cachedToken.expiresOnTimestamp) {
            this.cachedToken = undefined;
        }
        return this.cachedToken;
    }
}
//# sourceMappingURL=accessTokenCache.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export const SDK_VERSION = "1.9.0";
export const DEFAULT_RETRY_POLICY_COUNT = 3;
//# sourceMappingURL=constants.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { logPolicy } from "./policies/logPolicy";
import { createEmptyPipeline } from "./pipeline";
import { redirectPolicy } from "./policies/redirectPolicy";
import { userAgentPolicy } from "./policies/userAgentPolicy";
import { decompressResponsePolicy } from "./policies/decompressResponsePolicy";
import { defaultRetryPolicy } from "./policies/defaultRetryPolicy";
import { formDataPolicy } from "./policies/formDataPolicy";
import { isNode } from "@azure/core-util";
import { proxyPolicy } from "./policies/proxyPolicy";
import { setClientRequestIdPolicy } from "./policies/setClientRequestIdPolicy";
import { tlsPolicy } from "./policies/tlsPolicy";
import { tracingPolicy } from "./policies/tracingPolicy";
/**
 * Create a new pipeline with a default set of customizable policies.
 * @param options - Options to configure a custom pipeline.
 */
export function createPipelineFromOptions(options) {
    const pipeline = createEmptyPipeline();
    if (isNode) {
        if (options.tlsOptions) {
            pipeline.addPolicy(tlsPolicy(options.tlsOptions));
        }
        pipeline.addPolicy(proxyPolicy(options.proxyOptions));
        pipeline.addPolicy(decompressResponsePolicy());
    }
    pipeline.addPolicy(formDataPolicy());
    pipeline.addPolicy(userAgentPolicy(options.userAgentOptions));
    pipeline.addPolicy(setClientRequestIdPolicy());
    pipeline.addPolicy(defaultRetryPolicy(options.retryOptions), { phase: "Retry" });
    pipeline.addPolicy(tracingPolicy(options.userAgentOptions), { afterPhase: "Retry" });
    if (isNode) {
        // Both XHR and Fetch expect to handle redirects automatically,
        // so only include this policy when we're in Node.
        pipeline.addPolicy(redirectPolicy(options.redirectOptions), { afterPhase: "Retry" });
    }
    pipeline.addPolicy(logPolicy(options.loggingOptions), { afterPhase: "Retry" });
    return pipeline;
}
//# sourceMappingURL=createPipelineFromOptions.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createFetchHttpClient } from "./fetchHttpClient";
/**
 * Create the correct HttpClient for the current environment.
 */
export function createDefaultHttpClient() {
    return createFetchHttpClient();
}
//# sourceMappingURL=defaultHttpClient.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createNodeHttpClient } from "./nodeHttpClient";
/**
 * Create the correct HttpClient for the current environment.
 */
export function createDefaultHttpClient() {
    return createNodeHttpClient();
}
//# sourceMappingURL=defaultHttpClient.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createXhrHttpClient } from "./xhrHttpClient";
/**
 * Create the correct HttpClient for the current environment.
 */
export function createDefaultHttpClient() {
    return createXhrHttpClient();
}
//# sourceMappingURL=defaultHttpClient.native.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { AbortError } from "@azure/abort-controller";
import { RestError } from "./restError";
import { createHttpHeaders } from "./httpHeaders";
/**
 * Checks if the body is a NodeReadable stream which is not supported in Browsers
 */
function isNodeReadableStream(body) {
    return body && typeof body.pipe === "function";
}
/**
 * Checks if the body is a ReadableStream supported by browsers
 */
function isReadableStream(body) {
    return Boolean(body &&
        typeof body.getReader === "function" &&
        typeof body.tee === "function");
}
/**
 * A HttpClient implementation that uses window.fetch to send HTTP requests.
 * @internal
 */
class FetchHttpClient {
    /**
     * Makes a request over an underlying transport layer and returns the response.
     * @param request - The request to be made.
     */
    async sendRequest(request) {
        const url = new URL(request.url);
        const isInsecure = url.protocol !== "https:";
        if (isInsecure && !request.allowInsecureConnection) {
            throw new Error(`Cannot connect to ${request.url} while allowInsecureConnection is false.`);
        }
        if (request.proxySettings) {
            throw new Error("HTTP proxy is not supported in browser environment");
        }
        try {
            return await makeRequest(request);
        }
        catch (e) {
            throw getError(e, request);
        }
    }
}
/**
 * Sends a request
 */
async function makeRequest(request) {
    const { abortController, abortControllerCleanup } = setupAbortSignal(request);
    try {
        const headers = buildFetchHeaders(request.headers);
        const requestBody = buildRequestBody(request);
        /**
         * Developers of the future:
         * Do not set redirect: "manual" as part
         * of request options.
         * It will not work as you expect.
         */
        const response = await fetch(request.url, {
            body: requestBody,
            method: request.method,
            headers: headers,
            signal: abortController.signal,
            credentials: request.withCredentials ? "include" : "same-origin",
            cache: "no-store",
        });
        return buildPipelineResponse(response, request);
    }
    finally {
        if (abortControllerCleanup) {
            abortControllerCleanup();
        }
    }
}
/**
 * Creates a pipeline response from a Fetch response;
 */
async function buildPipelineResponse(httpResponse, request) {
    var _a, _b;
    const headers = buildPipelineHeaders(httpResponse);
    const response = {
        request,
        headers,
        status: httpResponse.status,
    };
    const bodyStream = isReadableStream(httpResponse.body)
        ? buildBodyStream(httpResponse.body, request.onDownloadProgress)
        : httpResponse.body;
    if (
    // Value of POSITIVE_INFINITY in streamResponseStatusCodes is considered as any status code
    ((_a = request.streamResponseStatusCodes) === null || _a === void 0 ? void 0 : _a.has(Number.POSITIVE_INFINITY)) ||
        ((_b = request.streamResponseStatusCodes) === null || _b === void 0 ? void 0 : _b.has(response.status))) {
        if (request.enableBrowserStreams) {
            response.browserStreamBody = bodyStream !== null && bodyStream !== void 0 ? bodyStream : undefined;
        }
        else {
            const responseStream = new Response(bodyStream);
            response.blobBody = responseStream.blob();
        }
    }
    else {
        const responseStream = new Response(bodyStream);
        response.bodyAsText = await responseStream.text();
    }
    return response;
}
function setupAbortSignal(request) {
    const abortController = new AbortController();
    // Cleanup function
    let abortControllerCleanup;
    /**
     * Attach an abort listener to the request
     */
    let abortListener;
    if (request.abortSignal) {
        if (request.abortSignal.aborted) {
            throw new AbortError("The operation was aborted.");
        }
        abortListener = (event) => {
            if (event.type === "abort") {
                abortController.abort();
            }
        };
        request.abortSignal.addEventListener("abort", abortListener);
        abortControllerCleanup = () => {
            var _a;
            if (abortListener) {
                (_a = request.abortSignal) === null || _a === void 0 ? void 0 : _a.removeEventListener("abort", abortListener);
            }
        };
    }
    // If a timeout was passed, call the abort signal once the time elapses
    if (request.timeout > 0) {
        setTimeout(() => {
            abortController.abort();
        }, request.timeout);
    }
    return { abortController, abortControllerCleanup };
}
/**
 * Gets the specific error
 */
function getError(e, request) {
    var _a;
    if (e && (e === null || e === void 0 ? void 0 : e.name) === "AbortError") {
        return e;
    }
    else {
        return new RestError(`Error sending request: ${e.message}`, {
            code: (_a = e === null || e === void 0 ? void 0 : e.code) !== null && _a !== void 0 ? _a : RestError.REQUEST_SEND_ERROR,
            request,
        });
    }
}
/**
 * Converts PipelineRequest headers to Fetch headers
 */
function buildFetchHeaders(pipelineHeaders) {
    const headers = new Headers();
    for (const [name, value] of pipelineHeaders) {
        headers.append(name, value);
    }
    return headers;
}
function buildPipelineHeaders(httpResponse) {
    const responseHeaders = createHttpHeaders();
    for (const [name, value] of httpResponse.headers) {
        responseHeaders.set(name, value);
    }
    return responseHeaders;
}
function buildRequestBody(request) {
    const body = typeof request.body === "function" ? request.body() : request.body;
    if (isNodeReadableStream(body)) {
        throw new Error("Node streams are not supported in browser environment.");
    }
    return isReadableStream(body) ? buildBodyStream(body, request.onUploadProgress) : body;
}
/**
 * Reads the request/response original stream and stream it through a new
 * ReadableStream, this is done to be able to report progress in a way that
 * all modern browsers support. TransformStreams would be an alternative,
 * however they are not yet supported by all browsers i.e Firefox
 */
function buildBodyStream(readableStream, onProgress) {
    let loadedBytes = 0;
    // If the current browser supports pipeThrough we use a TransformStream
    // to report progress
    if (isTransformStreamSupported(readableStream)) {
        return readableStream.pipeThrough(new TransformStream({
            transform(chunk, controller) {
                if (chunk === null) {
                    controller.terminate();
                    return;
                }
                controller.enqueue(chunk);
                loadedBytes += chunk.length;
                if (onProgress) {
                    onProgress({ loadedBytes });
                }
            },
        }));
    }
    else {
        // If we can't use transform streams, wrap the original stream in a new readable stream
        // and use pull to enqueue each chunk and report progress.
        const reader = readableStream.getReader();
        return new ReadableStream({
            async pull(controller) {
                var _a;
                const { done, value } = await reader.read();
                // When no more data needs to be consumed, break the reading
                if (done || !value) {
                    // Close the stream
                    controller.close();
                    reader.releaseLock();
                    return;
                }
                loadedBytes += (_a = value === null || value === void 0 ? void 0 : value.length) !== null && _a !== void 0 ? _a : 0;
                // Enqueue the next data chunk into our target stream
                controller.enqueue(value);
                if (onProgress) {
                    onProgress({ loadedBytes });
                }
            },
        });
    }
}
/**
 * Create a new HttpClient instance for the browser environment.
 * @internal
 */
export function createFetchHttpClient() {
    return new FetchHttpClient();
}
function isTransformStreamSupported(readableStream) {
    return readableStream.pipeThrough !== undefined && self.TransformStream !== undefined;
}
//# sourceMappingURL=fetchHttpClient.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
function normalizeName(name) {
    return name.toLowerCase();
}
function* headerIterator(map) {
    for (const entry of map.values()) {
        yield [entry.name, entry.value];
    }
}
class HttpHeadersImpl {
    constructor(rawHeaders) {
        this._headersMap = new Map();
        if (rawHeaders) {
            for (const headerName of Object.keys(rawHeaders)) {
                this.set(headerName, rawHeaders[headerName]);
            }
        }
    }
    /**
     * Set a header in this collection with the provided name and value. The name is
     * case-insensitive.
     * @param name - The name of the header to set. This value is case-insensitive.
     * @param value - The value of the header to set.
     */
    set(name, value) {
        this._headersMap.set(normalizeName(name), { name, value: String(value) });
    }
    /**
     * Get the header value for the provided header name, or undefined if no header exists in this
     * collection with the provided name.
     * @param name - The name of the header. This value is case-insensitive.
     */
    get(name) {
        var _a;
        return (_a = this._headersMap.get(normalizeName(name))) === null || _a === void 0 ? void 0 : _a.value;
    }
    /**
     * Get whether or not this header collection contains a header entry for the provided header name.
     * @param name - The name of the header to set. This value is case-insensitive.
     */
    has(name) {
        return this._headersMap.has(normalizeName(name));
    }
    /**
     * Remove the header with the provided headerName.
     * @param name - The name of the header to remove.
     */
    delete(name) {
        this._headersMap.delete(normalizeName(name));
    }
    /**
     * Get the JSON object representation of this HTTP header collection.
     */
    toJSON(options = {}) {
        const result = {};
        if (options.preserveCase) {
            for (const entry of this._headersMap.values()) {
                result[entry.name] = entry.value;
            }
        }
        else {
            for (const [normalizedName, entry] of this._headersMap) {
                result[normalizedName] = entry.value;
            }
        }
        return result;
    }
    /**
     * Get the string representation of this HTTP header collection.
     */
    toString() {
        return JSON.stringify(this.toJSON({ preserveCase: true }));
    }
    /**
     * Iterate over tuples of header [name, value] pairs.
     */
    [Symbol.iterator]() {
        return headerIterator(this._headersMap);
    }
}
/**
 * Creates an object that satisfies the `HttpHeaders` interface.
 * @param rawHeaders - A simple object representing initial headers
 */
export function createHttpHeaders(rawHeaders) {
    return new HttpHeadersImpl(rawHeaders);
}
//# sourceMappingURL=httpHeaders.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export { createEmptyPipeline, } from "./pipeline";
export { createPipelineFromOptions, } from "./createPipelineFromOptions";
export { createDefaultHttpClient } from "./defaultHttpClient";
export { createHttpHeaders } from "./httpHeaders";
export { createPipelineRequest } from "./pipelineRequest";
export { RestError, isRestError } from "./restError";
export { decompressResponsePolicy, decompressResponsePolicyName, } from "./policies/decompressResponsePolicy";
export { exponentialRetryPolicy, exponentialRetryPolicyName, } from "./policies/exponentialRetryPolicy";
export { setClientRequestIdPolicy, setClientRequestIdPolicyName, } from "./policies/setClientRequestIdPolicy";
export { logPolicy, logPolicyName } from "./policies/logPolicy";
export { proxyPolicy, proxyPolicyName, getDefaultProxySettings } from "./policies/proxyPolicy";
export { redirectPolicy, redirectPolicyName, } from "./policies/redirectPolicy";
export { systemErrorRetryPolicy, systemErrorRetryPolicyName, } from "./policies/systemErrorRetryPolicy";
export { throttlingRetryPolicy, throttlingRetryPolicyName, } from "./policies/throttlingRetryPolicy";
export { retryPolicy } from "./policies/retryPolicy";
export { tracingPolicy, tracingPolicyName } from "./policies/tracingPolicy";
export { defaultRetryPolicy } from "./policies/defaultRetryPolicy";
export { userAgentPolicy, userAgentPolicyName, } from "./policies/userAgentPolicy";
export { tlsPolicy, tlsPolicyName } from "./policies/tlsPolicy";
export { formDataPolicy, formDataPolicyName } from "./policies/formDataPolicy";
export { bearerTokenAuthenticationPolicy, bearerTokenAuthenticationPolicyName, } from "./policies/bearerTokenAuthenticationPolicy";
export { ndJsonPolicy, ndJsonPolicyName } from "./policies/ndJsonPolicy";
//# sourceMappingURL=index.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=interfaces.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createClientLogger } from "@azure/logger";
export const logger = createClientLogger("core-rest-pipeline");
//# sourceMappingURL=log.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import * as http from "http";
import * as https from "https";
import * as zlib from "zlib";
import { Transform } from "stream";
import { AbortController, AbortError } from "@azure/abort-controller";
import { createHttpHeaders } from "./httpHeaders";
import { RestError } from "./restError";
import { logger } from "./log";
const DEFAULT_TLS_SETTINGS = {};
function isReadableStream(body) {
    return body && typeof body.pipe === "function";
}
function isStreamComplete(stream) {
    return new Promise((resolve) => {
        stream.on("close", resolve);
        stream.on("end", resolve);
        stream.on("error", resolve);
    });
}
function isArrayBuffer(body) {
    return body && typeof body.byteLength === "number";
}
class ReportTransform extends Transform {
    constructor(progressCallback) {
        super();
        this.loadedBytes = 0;
        this.progressCallback = progressCallback;
    }
    // eslint-disable-next-line @typescript-eslint/ban-types
    _transform(chunk, _encoding, callback) {
        this.push(chunk);
        this.loadedBytes += chunk.length;
        try {
            this.progressCallback({ loadedBytes: this.loadedBytes });
            callback();
        }
        catch (e) {
            callback(e);
        }
    }
}
/**
 * A HttpClient implementation that uses Node's "https" module to send HTTPS requests.
 * @internal
 */
class NodeHttpClient {
    constructor() {
        this.cachedHttpsAgents = new WeakMap();
    }
    /**
     * Makes a request over an underlying transport layer and returns the response.
     * @param request - The request to be made.
     */
    async sendRequest(request) {
        var _a, _b, _c;
        const abortController = new AbortController();
        let abortListener;
        if (request.abortSignal) {
            if (request.abortSignal.aborted) {
                throw new AbortError("The operation was aborted.");
            }
            abortListener = (event) => {
                if (event.type === "abort") {
                    abortController.abort();
                }
            };
            request.abortSignal.addEventListener("abort", abortListener);
        }
        if (request.timeout > 0) {
            setTimeout(() => {
                abortController.abort();
            }, request.timeout);
        }
        const acceptEncoding = request.headers.get("Accept-Encoding");
        const shouldDecompress = (acceptEncoding === null || acceptEncoding === void 0 ? void 0 : acceptEncoding.includes("gzip")) || (acceptEncoding === null || acceptEncoding === void 0 ? void 0 : acceptEncoding.includes("deflate"));
        let body = typeof request.body === "function" ? request.body() : request.body;
        if (body && !request.headers.has("Content-Length")) {
            const bodyLength = getBodyLength(body);
            if (bodyLength !== null) {
                request.headers.set("Content-Length", bodyLength);
            }
        }
        let responseStream;
        try {
            if (body && request.onUploadProgress) {
                const onUploadProgress = request.onUploadProgress;
                const uploadReportStream = new ReportTransform(onUploadProgress);
                uploadReportStream.on("error", (e) => {
                    logger.error("Error in upload progress", e);
                });
                if (isReadableStream(body)) {
                    body.pipe(uploadReportStream);
                }
                else {
                    uploadReportStream.end(body);
                }
                body = uploadReportStream;
            }
            const res = await this.makeRequest(request, abortController, body);
            const headers = getResponseHeaders(res);
            const status = (_a = res.statusCode) !== null && _a !== void 0 ? _a : 0;
            const response = {
                status,
                headers,
                request,
            };
            // Responses to HEAD must not have a body.
            // If they do return a body, that body must be ignored.
            if (request.method === "HEAD") {
                res.destroy();
                return response;
            }
            responseStream = shouldDecompress ? getDecodedResponseStream(res, headers) : res;
            const onDownloadProgress = request.onDownloadProgress;
            if (onDownloadProgress) {
                const downloadReportStream = new ReportTransform(onDownloadProgress);
                downloadReportStream.on("error", (e) => {
                    logger.error("Error in download progress", e);
                });
                responseStream.pipe(downloadReportStream);
                responseStream = downloadReportStream;
            }
            if (
            // Value of POSITIVE_INFINITY in streamResponseStatusCodes is considered as any status code
            ((_b = request.streamResponseStatusCodes) === null || _b === void 0 ? void 0 : _b.has(Number.POSITIVE_INFINITY)) ||
                ((_c = request.streamResponseStatusCodes) === null || _c === void 0 ? void 0 : _c.has(response.status))) {
                response.readableStreamBody = responseStream;
            }
            else {
                response.bodyAsText = await streamToText(responseStream);
            }
            return response;
        }
        finally {
            // clean up event listener
            if (request.abortSignal && abortListener) {
                let uploadStreamDone = Promise.resolve();
                if (isReadableStream(body)) {
                    uploadStreamDone = isStreamComplete(body);
                }
                let downloadStreamDone = Promise.resolve();
                if (isReadableStream(responseStream)) {
                    downloadStreamDone = isStreamComplete(responseStream);
                }
                Promise.all([uploadStreamDone, downloadStreamDone])
                    .then(() => {
                    var _a;
                    // eslint-disable-next-line promise/always-return
                    if (abortListener) {
                        (_a = request.abortSignal) === null || _a === void 0 ? void 0 : _a.removeEventListener("abort", abortListener);
                    }
                })
                    .catch((e) => {
                    logger.warning("Error when cleaning up abortListener on httpRequest", e);
                });
            }
        }
    }
    makeRequest(request, abortController, body) {
        var _a;
        const url = new URL(request.url);
        const isInsecure = url.protocol !== "https:";
        if (isInsecure && !request.allowInsecureConnection) {
            throw new Error(`Cannot connect to ${request.url} while allowInsecureConnection is false.`);
        }
        const agent = (_a = request.agent) !== null && _a !== void 0 ? _a : this.getOrCreateAgent(request, isInsecure);
        const options = {
            agent,
            hostname: url.hostname,
            path: `${url.pathname}${url.search}`,
            port: url.port,
            method: request.method,
            headers: request.headers.toJSON({ preserveCase: true }),
        };
        return new Promise((resolve, reject) => {
            const req = isInsecure ? http.request(options, resolve) : https.request(options, resolve);
            req.once("error", (err) => {
                var _a;
                reject(new RestError(err.message, { code: (_a = err.code) !== null && _a !== void 0 ? _a : RestError.REQUEST_SEND_ERROR, request }));
            });
            abortController.signal.addEventListener("abort", () => {
                const abortError = new AbortError("The operation was aborted.");
                req.destroy(abortError);
                reject(abortError);
            });
            if (body && isReadableStream(body)) {
                body.pipe(req);
            }
            else if (body) {
                if (typeof body === "string" || Buffer.isBuffer(body)) {
                    req.end(body);
                }
                else if (isArrayBuffer(body)) {
                    req.end(ArrayBuffer.isView(body) ? Buffer.from(body.buffer) : Buffer.from(body));
                }
                else {
                    logger.error("Unrecognized body type", body);
                    reject(new RestError("Unrecognized body type"));
                }
            }
            else {
                // streams don't like "undefined" being passed as data
                req.end();
            }
        });
    }
    getOrCreateAgent(request, isInsecure) {
        var _a;
        const disableKeepAlive = request.disableKeepAlive;
        // Handle Insecure requests first
        if (isInsecure) {
            if (disableKeepAlive) {
                // keepAlive:false is the default so we don't need a custom Agent
                return http.globalAgent;
            }
            if (!this.cachedHttpAgent) {
                // If there is no cached agent create a new one and cache it.
                this.cachedHttpAgent = new http.Agent({ keepAlive: true });
            }
            return this.cachedHttpAgent;
        }
        else {
            if (disableKeepAlive && !request.tlsSettings) {
                // When there are no tlsSettings and keepAlive is false
                // we don't need a custom agent
                return https.globalAgent;
            }
            // We use the tlsSettings to index cached clients
            const tlsSettings = (_a = request.tlsSettings) !== null && _a !== void 0 ? _a : DEFAULT_TLS_SETTINGS;
            // Get the cached agent or create a new one with the
            // provided values for keepAlive and tlsSettings
            let agent = this.cachedHttpsAgents.get(tlsSettings);
            if (agent && agent.options.keepAlive === !disableKeepAlive) {
                return agent;
            }
            logger.info("No cached TLS Agent exist, creating a new Agent");
            agent = new https.Agent(Object.assign({ 
                // keepAlive is true if disableKeepAlive is false.
                keepAlive: !disableKeepAlive }, tlsSettings));
            this.cachedHttpsAgents.set(tlsSettings, agent);
            return agent;
        }
    }
}
function getResponseHeaders(res) {
    const headers = createHttpHeaders();
    for (const header of Object.keys(res.headers)) {
        const value = res.headers[header];
        if (Array.isArray(value)) {
            if (value.length > 0) {
                headers.set(header, value[0]);
            }
        }
        else if (value) {
            headers.set(header, value);
        }
    }
    return headers;
}
function getDecodedResponseStream(stream, headers) {
    const contentEncoding = headers.get("Content-Encoding");
    if (contentEncoding === "gzip") {
        const unzip = zlib.createGunzip();
        stream.pipe(unzip);
        return unzip;
    }
    else if (contentEncoding === "deflate") {
        const inflate = zlib.createInflate();
        stream.pipe(inflate);
        return inflate;
    }
    return stream;
}
function streamToText(stream) {
    return new Promise((resolve, reject) => {
        const buffer = [];
        stream.on("data", (chunk) => {
            if (Buffer.isBuffer(chunk)) {
                buffer.push(chunk);
            }
            else {
                buffer.push(Buffer.from(chunk));
            }
        });
        stream.on("end", () => {
            resolve(Buffer.concat(buffer).toString("utf8"));
        });
        stream.on("error", (e) => {
            if (e && (e === null || e === void 0 ? void 0 : e.name) === "AbortError") {
                reject(e);
            }
            else {
                reject(new RestError(`Error reading response as text: ${e.message}`, {
                    code: RestError.PARSE_ERROR,
                }));
            }
        });
    });
}
/** @internal */
export function getBodyLength(body) {
    if (!body) {
        return 0;
    }
    else if (Buffer.isBuffer(body)) {
        return body.length;
    }
    else if (isReadableStream(body)) {
        return null;
    }
    else if (isArrayBuffer(body)) {
        return body.byteLength;
    }
    else if (typeof body === "string") {
        return Buffer.from(body).length;
    }
    else {
        return null;
    }
}
/**
 * Create a new HttpClient instance for the NodeJS environment.
 * @internal
 */
export function createNodeHttpClient() {
    return new NodeHttpClient();
}
//# sourceMappingURL=nodeHttpClient.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
const ValidPhaseNames = new Set(["Deserialize", "Serialize", "Retry", "Sign"]);
/**
 * A private implementation of Pipeline.
 * Do not export this class from the package.
 * @internal
 */
class HttpPipeline {
    constructor(policies = []) {
        this._policies = [];
        this._policies = policies;
        this._orderedPolicies = undefined;
    }
    addPolicy(policy, options = {}) {
        if (options.phase && options.afterPhase) {
            throw new Error("Policies inside a phase cannot specify afterPhase.");
        }
        if (options.phase && !ValidPhaseNames.has(options.phase)) {
            throw new Error(`Invalid phase name: ${options.phase}`);
        }
        if (options.afterPhase && !ValidPhaseNames.has(options.afterPhase)) {
            throw new Error(`Invalid afterPhase name: ${options.afterPhase}`);
        }
        this._policies.push({
            policy,
            options,
        });
        this._orderedPolicies = undefined;
    }
    removePolicy(options) {
        const removedPolicies = [];
        this._policies = this._policies.filter((policyDescriptor) => {
            if ((options.name && policyDescriptor.policy.name === options.name) ||
                (options.phase && policyDescriptor.options.phase === options.phase)) {
                removedPolicies.push(policyDescriptor.policy);
                return false;
            }
            else {
                return true;
            }
        });
        this._orderedPolicies = undefined;
        return removedPolicies;
    }
    sendRequest(httpClient, request) {
        const policies = this.getOrderedPolicies();
        const pipeline = policies.reduceRight((next, policy) => {
            return (req) => {
                return policy.sendRequest(req, next);
            };
        }, (req) => httpClient.sendRequest(req));
        return pipeline(request);
    }
    getOrderedPolicies() {
        if (!this._orderedPolicies) {
            this._orderedPolicies = this.orderPolicies();
        }
        return this._orderedPolicies;
    }
    clone() {
        return new HttpPipeline(this._policies);
    }
    static create() {
        return new HttpPipeline();
    }
    orderPolicies() {
        /**
         * The goal of this method is to reliably order pipeline policies
         * based on their declared requirements when they were added.
         *
         * Order is first determined by phase:
         *
         * 1. Serialize Phase
         * 2. Policies not in a phase
         * 3. Deserialize Phase
         * 4. Retry Phase
         * 5. Sign Phase
         *
         * Within each phase, policies are executed in the order
         * they were added unless they were specified to execute
         * before/after other policies or after a particular phase.
         *
         * To determine the final order, we will walk the policy list
         * in phase order multiple times until all dependencies are
         * satisfied.
         *
         * `afterPolicies` are the set of policies that must be
         * executed before a given policy. This requirement is
         * considered satisfied when each of the listed policies
         * have been scheduled.
         *
         * `beforePolicies` are the set of policies that must be
         * executed after a given policy. Since this dependency
         * can be expressed by converting it into a equivalent
         * `afterPolicies` declarations, they are normalized
         * into that form for simplicity.
         *
         * An `afterPhase` dependency is considered satisfied when all
         * policies in that phase have scheduled.
         *
         */
        const result = [];
        // Track all policies we know about.
        const policyMap = new Map();
        function createPhase(name) {
            return {
                name,
                policies: new Set(),
                hasRun: false,
            };
        }
        // Track policies for each phase.
        const serializePhase = createPhase("Serialize");
        const noPhase = createPhase("None");
        const deserializePhase = createPhase("Deserialize");
        const retryPhase = createPhase("Retry");
        const signPhase = createPhase("Sign");
        // a list of phases in order
        const orderedPhases = [serializePhase, noPhase, deserializePhase, retryPhase, signPhase];
        // Small helper function to map phase name to each Phase
        function getPhase(phase) {
            if (phase === "Retry") {
                return retryPhase;
            }
            else if (phase === "Serialize") {
                return serializePhase;
            }
            else if (phase === "Deserialize") {
                return deserializePhase;
            }
            else if (phase === "Sign") {
                return signPhase;
            }
            else {
                return noPhase;
            }
        }
        // First walk each policy and create a node to track metadata.
        for (const descriptor of this._policies) {
            const policy = descriptor.policy;
            const options = descriptor.options;
            const policyName = policy.name;
            if (policyMap.has(policyName)) {
                throw new Error("Duplicate policy names not allowed in pipeline");
            }
            const node = {
                policy,
                dependsOn: new Set(),
                dependants: new Set(),
            };
            if (options.afterPhase) {
                node.afterPhase = getPhase(options.afterPhase);
            }
            policyMap.set(policyName, node);
            const phase = getPhase(options.phase);
            phase.policies.add(node);
        }
        // Now that each policy has a node, connect dependency references.
        for (const descriptor of this._policies) {
            const { policy, options } = descriptor;
            const policyName = policy.name;
            const node = policyMap.get(policyName);
            if (!node) {
                throw new Error(`Missing node for policy ${policyName}`);
            }
            if (options.afterPolicies) {
                for (const afterPolicyName of options.afterPolicies) {
                    const afterNode = policyMap.get(afterPolicyName);
                    if (afterNode) {
                        // Linking in both directions helps later
                        // when we want to notify dependants.
                        node.dependsOn.add(afterNode);
                        afterNode.dependants.add(node);
                    }
                }
            }
            if (options.beforePolicies) {
                for (const beforePolicyName of options.beforePolicies) {
                    const beforeNode = policyMap.get(beforePolicyName);
                    if (beforeNode) {
                        // To execute before another node, make it
                        // depend on the current node.
                        beforeNode.dependsOn.add(node);
                        node.dependants.add(beforeNode);
                    }
                }
            }
        }
        function walkPhase(phase) {
            phase.hasRun = true;
            // Sets iterate in insertion order
            for (const node of phase.policies) {
                if (node.afterPhase && (!node.afterPhase.hasRun || node.afterPhase.policies.size)) {
                    // If this node is waiting on a phase to complete,
                    // we need to skip it for now.
                    // Even if the phase is empty, we should wait for it
                    // to be walked to avoid re-ordering policies.
                    continue;
                }
                if (node.dependsOn.size === 0) {
                    // If there's nothing else we're waiting for, we can
                    // add this policy to the result list.
                    result.push(node.policy);
                    // Notify anything that depends on this policy that
                    // the policy has been scheduled.
                    for (const dependant of node.dependants) {
                        dependant.dependsOn.delete(node);
                    }
                    policyMap.delete(node.policy.name);
                    phase.policies.delete(node);
                }
            }
        }
        function walkPhases() {
            for (const phase of orderedPhases) {
                walkPhase(phase);
                // if the phase isn't complete
                if (phase.policies.size > 0 && phase !== noPhase) {
                    if (!noPhase.hasRun) {
                        // Try running noPhase to see if that unblocks this phase next tick.
                        // This can happen if a phase that happens before noPhase
                        // is waiting on a noPhase policy to complete.
                        walkPhase(noPhase);
                    }
                    // Don't proceed to the next phase until this phase finishes.
                    return;
                }
            }
        }
        // Iterate until we've put every node in the result list.
        let iteration = 0;
        while (policyMap.size > 0) {
            iteration++;
            const initialResultLength = result.length;
            // Keep walking each phase in order until we can order every node.
            walkPhases();
            // The result list *should* get at least one larger each time
            // after the first full pass.
            // Otherwise, we're going to loop forever.
            if (result.length <= initialResultLength && iteration > 1) {
                throw new Error("Cannot satisfy policy dependencies due to requirements cycle.");
            }
        }
        return result;
    }
}
/**
 * Creates a totally empty pipeline.
 * Useful for testing or creating a custom one.
 */
export function createEmptyPipeline() {
    return HttpPipeline.create();
}
//# sourceMappingURL=pipeline.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createHttpHeaders } from "./httpHeaders";
import { generateUuid } from "./util/uuid";
class PipelineRequestImpl {
    constructor(options) {
        var _a, _b, _c, _d, _e, _f, _g;
        this.url = options.url;
        this.body = options.body;
        this.headers = (_a = options.headers) !== null && _a !== void 0 ? _a : createHttpHeaders();
        this.method = (_b = options.method) !== null && _b !== void 0 ? _b : "GET";
        this.timeout = (_c = options.timeout) !== null && _c !== void 0 ? _c : 0;
        this.formData = options.formData;
        this.disableKeepAlive = (_d = options.disableKeepAlive) !== null && _d !== void 0 ? _d : false;
        this.proxySettings = options.proxySettings;
        this.streamResponseStatusCodes = options.streamResponseStatusCodes;
        this.withCredentials = (_e = options.withCredentials) !== null && _e !== void 0 ? _e : false;
        this.abortSignal = options.abortSignal;
        this.tracingOptions = options.tracingOptions;
        this.onUploadProgress = options.onUploadProgress;
        this.onDownloadProgress = options.onDownloadProgress;
        this.requestId = options.requestId || generateUuid();
        this.allowInsecureConnection = (_f = options.allowInsecureConnection) !== null && _f !== void 0 ? _f : false;
        this.enableBrowserStreams = (_g = options.enableBrowserStreams) !== null && _g !== void 0 ? _g : false;
    }
}
/**
 * Creates a new pipeline request with the given options.
 * This method is to allow for the easy setting of default values and not required.
 * @param options - The options to create the request with.
 */
export function createPipelineRequest(options) {
    return new PipelineRequestImpl(options);
}
//# sourceMappingURL=pipelineRequest.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { isError } from "@azure/core-util";
import { custom } from "./util/inspect";
import { Sanitizer } from "./util/sanitizer";
const errorSanitizer = new Sanitizer();
/**
 * A custom error type for failed pipeline requests.
 */
export class RestError extends Error {
    constructor(message, options = {}) {
        super(message);
        this.name = "RestError";
        this.code = options.code;
        this.statusCode = options.statusCode;
        this.request = options.request;
        this.response = options.response;
        Object.setPrototypeOf(this, RestError.prototype);
    }
    /**
     * Logging method for util.inspect in Node
     */
    [custom]() {
        return `RestError: ${this.message} \n ${errorSanitizer.sanitize(this)}`;
    }
}
/**
 * Something went wrong when making the request.
 * This means the actual request failed for some reason,
 * such as a DNS issue or the connection being lost.
 */
RestError.REQUEST_SEND_ERROR = "REQUEST_SEND_ERROR";
/**
 * This means that parsing the response from the server failed.
 * It may have been malformed.
 */
RestError.PARSE_ERROR = "PARSE_ERROR";
/**
 * Typeguard for RestError
 * @param e - Something caught by a catch clause.
 */
export function isRestError(e) {
    if (e instanceof RestError) {
        return true;
    }
    return isError(e) && e.name === "RestError";
}
//# sourceMappingURL=restError.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { AbortError } from "@azure/abort-controller";
import { createHttpHeaders } from "./httpHeaders";
import { RestError } from "./restError";
function isNodeReadableStream(body) {
    return body && typeof body.pipe === "function";
}
/**
 * Checks if the body is a ReadableStream supported by browsers
 */
function isReadableStream(body) {
    return Boolean(body &&
        typeof body.getReader === "function" &&
        typeof body.tee === "function");
}
/**
 * A HttpClient implementation that uses XMLHttpRequest to send HTTP requests.
 * @internal
 */
class XhrHttpClient {
    /**
     * Makes a request over an underlying transport layer and returns the response.
     * @param request - The request to be made.
     */
    async sendRequest(request) {
        var _a;
        const url = new URL(request.url);
        const isInsecure = url.protocol !== "https:";
        if (isInsecure && !request.allowInsecureConnection) {
            throw new Error(`Cannot connect to ${request.url} while allowInsecureConnection is false.`);
        }
        const xhr = new XMLHttpRequest();
        if (request.proxySettings) {
            throw new Error("HTTP proxy is not supported in browser environment");
        }
        const abortSignal = request.abortSignal;
        if (abortSignal) {
            if (abortSignal.aborted) {
                throw new AbortError("The operation was aborted.");
            }
            const listener = () => {
                xhr.abort();
            };
            abortSignal.addEventListener("abort", listener);
            xhr.addEventListener("readystatechange", () => {
                if (xhr.readyState === XMLHttpRequest.DONE) {
                    abortSignal.removeEventListener("abort", listener);
                }
            });
        }
        addProgressListener(xhr.upload, request.onUploadProgress);
        addProgressListener(xhr, request.onDownloadProgress);
        xhr.open(request.method, request.url);
        xhr.timeout = request.timeout;
        xhr.withCredentials = request.withCredentials;
        for (const [name, value] of request.headers) {
            xhr.setRequestHeader(name, value);
        }
        xhr.responseType = ((_a = request.streamResponseStatusCodes) === null || _a === void 0 ? void 0 : _a.size) ? "blob" : "text";
        const body = typeof request.body === "function" ? request.body() : request.body;
        if (isNodeReadableStream(body) || isReadableStream(body)) {
            throw new Error("streams are not supported in XhrHttpClient.");
        }
        xhr.send(body === undefined ? null : body);
        if (xhr.responseType === "blob") {
            return new Promise((resolve, reject) => {
                handleBlobResponse(xhr, request, resolve, reject);
                rejectOnTerminalEvent(request, xhr, reject);
            });
        }
        else {
            return new Promise(function (resolve, reject) {
                xhr.addEventListener("load", () => resolve({
                    request,
                    status: xhr.status,
                    headers: parseHeaders(xhr),
                    bodyAsText: xhr.responseText,
                }));
                rejectOnTerminalEvent(request, xhr, reject);
            });
        }
    }
}
function handleBlobResponse(xhr, request, res, rej) {
    xhr.addEventListener("readystatechange", () => {
        var _a, _b;
        // Resolve as soon as headers are loaded
        if (xhr.readyState === XMLHttpRequest.HEADERS_RECEIVED) {
            if (
            // Value of POSITIVE_INFINITY in streamResponseStatusCodes is considered as any status code
            ((_a = request.streamResponseStatusCodes) === null || _a === void 0 ? void 0 : _a.has(Number.POSITIVE_INFINITY)) ||
                ((_b = request.streamResponseStatusCodes) === null || _b === void 0 ? void 0 : _b.has(xhr.status))) {
                const blobBody = new Promise((resolve, reject) => {
                    xhr.addEventListener("load", () => {
                        resolve(xhr.response);
                    });
                    rejectOnTerminalEvent(request, xhr, reject);
                });
                res({
                    request,
                    status: xhr.status,
                    headers: parseHeaders(xhr),
                    blobBody,
                });
            }
            else {
                xhr.addEventListener("load", () => {
                    // xhr.response is of Blob type if the request is sent with xhr.responseType === "blob"
                    // but the status code is not one of the stream response status codes,
                    // so treat it as text and convert from Blob to text
                    if (xhr.response) {
                        xhr.response
                            .text()
                            .then((text) => {
                            res({
                                request: request,
                                status: xhr.status,
                                headers: parseHeaders(xhr),
                                bodyAsText: text,
                            });
                            return;
                        })
                            .catch((e) => {
                            rej(e);
                        });
                    }
                    else {
                        res({
                            request,
                            status: xhr.status,
                            headers: parseHeaders(xhr),
                        });
                    }
                });
            }
        }
    });
}
function addProgressListener(xhr, listener) {
    if (listener) {
        xhr.addEventListener("progress", (rawEvent) => listener({
            loadedBytes: rawEvent.loaded,
        }));
    }
}
function parseHeaders(xhr) {
    const responseHeaders = createHttpHeaders();
    const headerLines = xhr
        .getAllResponseHeaders()
        .trim()
        .split(/[\r\n]+/);
    for (const line of headerLines) {
        const index = line.indexOf(":");
        const headerName = line.slice(0, index);
        const headerValue = line.slice(index + 2);
        responseHeaders.set(headerName, headerValue);
    }
    return responseHeaders;
}
function rejectOnTerminalEvent(request, xhr, reject) {
    xhr.addEventListener("error", () => reject(new RestError(`Failed to send request to ${request.url}`, {
        code: RestError.REQUEST_SEND_ERROR,
        request,
    })));
    const abortError = new AbortError("The operation was aborted.");
    xhr.addEventListener("abort", () => reject(abortError));
    xhr.addEventListener("timeout", () => reject(abortError));
}
/**
 * Create a new HttpClient instance for the browser environment.
 * @internal
 */
export function createXhrHttpClient() {
    return new XhrHttpClient();
}
//# sourceMappingURL=xhrHttpClient.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { AbortError } from "@azure/abort-controller";
const StandardAbortMessage = "The operation was aborted.";
/**
 * A wrapper for setTimeout that resolves a promise after delayInMs milliseconds.
 * @param delayInMs - The number of milliseconds to be delayed.
 * @param value - The value to be resolved with after a timeout of t milliseconds.
 * @param options - The options for delay - currently abort options
 *                  - abortSignal - The abortSignal associated with containing operation.
 *                  - abortErrorMsg - The abort error message associated with containing operation.
 * @returns Resolved promise
 */
export function delay(delayInMs, value, options) {
    return new Promise((resolve, reject) => {
        let timer = undefined;
        let onAborted = undefined;
        const rejectOnAbort = () => {
            return reject(new AbortError((options === null || options === void 0 ? void 0 : options.abortErrorMsg) ? options === null || options === void 0 ? void 0 : options.abortErrorMsg : StandardAbortMessage));
        };
        const removeListeners = () => {
            if ((options === null || options === void 0 ? void 0 : options.abortSignal) && onAborted) {
                options.abortSignal.removeEventListener("abort", onAborted);
            }
        };
        onAborted = () => {
            if (timer) {
                clearTimeout(timer);
            }
            removeListeners();
            return rejectOnAbort();
        };
        if ((options === null || options === void 0 ? void 0 : options.abortSignal) && options.abortSignal.aborted) {
            return rejectOnAbort();
        }
        timer = setTimeout(() => {
            removeListeners();
            resolve(value);
        }, delayInMs);
        if (options === null || options === void 0 ? void 0 : options.abortSignal) {
            options.abortSignal.addEventListener("abort", onAborted);
        }
    });
}
/**
 * @internal
 * @returns the parsed value or undefined if the parsed value is invalid.
 */
export function parseHeaderValueAsNumber(response, headerName) {
    const value = response.headers.get(headerName);
    if (!value)
        return;
    const valueAsNum = Number(value);
    if (Number.isNaN(valueAsNum))
        return;
    return valueAsNum;
}
//# sourceMappingURL=helpers.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export const custom = {};
//# sourceMappingURL=inspect.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { inspect } from "util";
export const custom = inspect.custom;
//# sourceMappingURL=inspect.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { isObject } from "@azure/core-util";
const RedactedString = "REDACTED";
// Make sure this list is up-to-date with the one under core/logger/Readme#Keyconcepts
const defaultAllowedHeaderNames = [
    "x-ms-client-request-id",
    "x-ms-return-client-request-id",
    "x-ms-useragent",
    "x-ms-correlation-request-id",
    "x-ms-request-id",
    "client-request-id",
    "ms-cv",
    "return-client-request-id",
    "traceparent",
    "Access-Control-Allow-Credentials",
    "Access-Control-Allow-Headers",
    "Access-Control-Allow-Methods",
    "Access-Control-Allow-Origin",
    "Access-Control-Expose-Headers",
    "Access-Control-Max-Age",
    "Access-Control-Request-Headers",
    "Access-Control-Request-Method",
    "Origin",
    "Accept",
    "Accept-Encoding",
    "Cache-Control",
    "Connection",
    "Content-Length",
    "Content-Type",
    "Date",
    "ETag",
    "Expires",
    "If-Match",
    "If-Modified-Since",
    "If-None-Match",
    "If-Unmodified-Since",
    "Last-Modified",
    "Pragma",
    "Request-Id",
    "Retry-After",
    "Server",
    "Transfer-Encoding",
    "User-Agent",
    "WWW-Authenticate",
];
const defaultAllowedQueryParameters = ["api-version"];
/**
 * @internal
 */
export class Sanitizer {
    constructor({ additionalAllowedHeaderNames: allowedHeaderNames = [], additionalAllowedQueryParameters: allowedQueryParameters = [], } = {}) {
        allowedHeaderNames = defaultAllowedHeaderNames.concat(allowedHeaderNames);
        allowedQueryParameters = defaultAllowedQueryParameters.concat(allowedQueryParameters);
        this.allowedHeaderNames = new Set(allowedHeaderNames.map((n) => n.toLowerCase()));
        this.allowedQueryParameters = new Set(allowedQueryParameters.map((p) => p.toLowerCase()));
    }
    sanitize(obj) {
        const seen = new Set();
        return JSON.stringify(obj, (key, value) => {
            // Ensure Errors include their interesting non-enumerable members
            if (value instanceof Error) {
                return Object.assign(Object.assign({}, value), { name: value.name, message: value.message });
            }
            if (key === "headers") {
                return this.sanitizeHeaders(value);
            }
            else if (key === "url") {
                return this.sanitizeUrl(value);
            }
            else if (key === "query") {
                return this.sanitizeQuery(value);
            }
            else if (key === "body") {
                // Don't log the request body
                return undefined;
            }
            else if (key === "response") {
                // Don't log response again
                return undefined;
            }
            else if (key === "operationSpec") {
                // When using sendOperationRequest, the request carries a massive
                // field with the autorest spec. No need to log it.
                return undefined;
            }
            else if (Array.isArray(value) || isObject(value)) {
                if (seen.has(value)) {
                    return "[Circular]";
                }
                seen.add(value);
            }
            return value;
        }, 2);
    }
    sanitizeHeaders(obj) {
        const sanitized = {};
        for (const key of Object.keys(obj)) {
            if (this.allowedHeaderNames.has(key.toLowerCase())) {
                sanitized[key] = obj[key];
            }
            else {
                sanitized[key] = RedactedString;
            }
        }
        return sanitized;
    }
    sanitizeQuery(value) {
        if (typeof value !== "object" || value === null) {
            return value;
        }
        const sanitized = {};
        for (const k of Object.keys(value)) {
            if (this.allowedQueryParameters.has(k.toLowerCase())) {
                sanitized[k] = value[k];
            }
            else {
                sanitized[k] = RedactedString;
            }
        }
        return sanitized;
    }
    sanitizeUrl(value) {
        if (typeof value !== "string" || value === null) {
            return value;
        }
        const url = new URL(value);
        if (!url.search) {
            return value;
        }
        for (const [key] of url.searchParams) {
            if (!this.allowedQueryParameters.has(key.toLowerCase())) {
                url.searchParams.set(key, RedactedString);
            }
        }
        return url.toString();
    }
}
//# sourceMappingURL=sanitizer.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { delay } from "./helpers";
// Default options for the cycler if none are provided
export const DEFAULT_CYCLER_OPTIONS = {
    forcedRefreshWindowInMs: 1000,
    retryIntervalInMs: 3000,
    refreshWindowInMs: 1000 * 60 * 2, // Start refreshing 2m before expiry
};
/**
 * Converts an an unreliable access token getter (which may resolve with null)
 * into an AccessTokenGetter by retrying the unreliable getter in a regular
 * interval.
 *
 * @param getAccessToken - A function that produces a promise of an access token that may fail by returning null.
 * @param retryIntervalInMs - The time (in milliseconds) to wait between retry attempts.
 * @param refreshTimeout - The timestamp after which the refresh attempt will fail, throwing an exception.
 * @returns - A promise that, if it resolves, will resolve with an access token.
 */
async function beginRefresh(getAccessToken, retryIntervalInMs, refreshTimeout) {
    // This wrapper handles exceptions gracefully as long as we haven't exceeded
    // the timeout.
    async function tryGetAccessToken() {
        if (Date.now() < refreshTimeout) {
            try {
                return await getAccessToken();
            }
            catch (_a) {
                return null;
            }
        }
        else {
            const finalToken = await getAccessToken();
            // Timeout is up, so throw if it's still null
            if (finalToken === null) {
                throw new Error("Failed to refresh access token.");
            }
            return finalToken;
        }
    }
    let token = await tryGetAccessToken();
    while (token === null) {
        await delay(retryIntervalInMs);
        token = await tryGetAccessToken();
    }
    return token;
}
/**
 * Creates a token cycler from a credential, scopes, and optional settings.
 *
 * A token cycler represents a way to reliably retrieve a valid access token
 * from a TokenCredential. It will handle initializing the token, refreshing it
 * when it nears expiration, and synchronizes refresh attempts to avoid
 * concurrency hazards.
 *
 * @param credential - the underlying TokenCredential that provides the access
 * token
 * @param tokenCyclerOptions - optionally override default settings for the cycler
 *
 * @returns - a function that reliably produces a valid access token
 */
export function createTokenCycler(credential, tokenCyclerOptions) {
    let refreshWorker = null;
    let token = null;
    let tenantId;
    const options = Object.assign(Object.assign({}, DEFAULT_CYCLER_OPTIONS), tokenCyclerOptions);
    /**
     * This little holder defines several predicates that we use to construct
     * the rules of refreshing the token.
     */
    const cycler = {
        /**
         * Produces true if a refresh job is currently in progress.
         */
        get isRefreshing() {
            return refreshWorker !== null;
        },
        /**
         * Produces true if the cycler SHOULD refresh (we are within the refresh
         * window and not already refreshing)
         */
        get shouldRefresh() {
            var _a;
            return (!cycler.isRefreshing &&
                ((_a = token === null || token === void 0 ? void 0 : token.expiresOnTimestamp) !== null && _a !== void 0 ? _a : 0) - options.refreshWindowInMs < Date.now());
        },
        /**
         * Produces true if the cycler MUST refresh (null or nearly-expired
         * token).
         */
        get mustRefresh() {
            return (token === null || token.expiresOnTimestamp - options.forcedRefreshWindowInMs < Date.now());
        },
    };
    /**
     * Starts a refresh job or returns the existing job if one is already
     * running.
     */
    function refresh(scopes, getTokenOptions) {
        var _a;
        if (!cycler.isRefreshing) {
            // We bind `scopes` here to avoid passing it around a lot
            const tryGetAccessToken = () => credential.getToken(scopes, getTokenOptions);
            // Take advantage of promise chaining to insert an assignment to `token`
            // before the refresh can be considered done.
            refreshWorker = beginRefresh(tryGetAccessToken, options.retryIntervalInMs, 
            // If we don't have a token, then we should timeout immediately
            (_a = token === null || token === void 0 ? void 0 : token.expiresOnTimestamp) !== null && _a !== void 0 ? _a : Date.now())
                .then((_token) => {
                refreshWorker = null;
                token = _token;
                tenantId = getTokenOptions.tenantId;
                return token;
            })
                .catch((reason) => {
                // We also should reset the refresher if we enter a failed state.  All
                // existing awaiters will throw, but subsequent requests will start a
                // new retry chain.
                refreshWorker = null;
                token = null;
                tenantId = undefined;
                throw reason;
            });
        }
        return refreshWorker;
    }
    return async (scopes, tokenOptions) => {
        //
        // Simple rules:
        // - If we MUST refresh, then return the refresh task, blocking
        //   the pipeline until a token is available.
        // - If we SHOULD refresh, then run refresh but don't return it
        //   (we can still use the cached token).
        // - Return the token, since it's fine if we didn't return in
        //   step 1.
        //
        // IF the tenantId passed in token options is different to the one we have, we need to
        // refresh the token with the new tenantId.
        const mustRefresh = tenantId !== tokenOptions.tenantId || cycler.mustRefresh;
        if (mustRefresh)
            return refresh(scopes, tokenOptions);
        if (cycler.shouldRefresh) {
            refresh(scopes, tokenOptions);
        }
        return token;
    };
}
//# sourceMappingURL=tokenCycler.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { getHeaderName, setPlatformSpecificData } from "./userAgentPlatform";
import { SDK_VERSION } from "../constants";
function getUserAgentString(telemetryInfo) {
    const parts = [];
    for (const [key, value] of telemetryInfo) {
        const token = value ? `${key}/${value}` : key;
        parts.push(token);
    }
    return parts.join(" ");
}
/**
 * @internal
 */
export function getUserAgentHeaderName() {
    return getHeaderName();
}
/**
 * @internal
 */
export function getUserAgentValue(prefix) {
    const runtimeInfo = new Map();
    runtimeInfo.set("core-rest-pipeline", SDK_VERSION);
    setPlatformSpecificData(runtimeInfo);
    const defaultAgent = getUserAgentString(runtimeInfo);
    const userAgentValue = prefix ? `${prefix} ${defaultAgent}` : defaultAgent;
    return userAgentValue;
}
//# sourceMappingURL=userAgent.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/*
 * NOTE: When moving this file, please update "browser" section in package.json.
 */
/**
 * @internal
 */
export function getHeaderName() {
    return "x-ms-useragent";
}
/**
 * @internal
 */
export function setPlatformSpecificData(map) {
    const navigator = self.navigator;
    map.set("OS", (navigator.oscpu || navigator.platform).replace(" ", ""));
}
//# sourceMappingURL=userAgentPlatform.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import * as os from "os";
/**
 * @internal
 */
export function getHeaderName() {
    return "User-Agent";
}
/**
 * @internal
 */
export function setPlatformSpecificData(map) {
    map.set("Node", process.version);
    map.set("OS", `(${os.arch()}-${os.type()}-${os.release()})`);
}
//# sourceMappingURL=userAgentPlatform.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/*
 * NOTE: When moving this file, please update "react-native" section in package.json.
 */
const { Platform } = require("react-native"); // eslint-disable-line import/no-extraneous-dependencies, @typescript-eslint/no-require-imports
/**
 * @internal
 */
export function getHeaderName() {
    return "x-ms-useragent";
}
/**
 * @internal
 */
export function setPlatformSpecificData(map) {
    const { major, minor, patch } = Platform.constants.reactNativeVersion;
    map.set("react-native", `${major}.${minor}.${patch}`);
    map.set("OS", `${Platform.OS}-${Platform.Version}`);
}
//# sourceMappingURL=userAgentPlatform.native.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { v4 as uuidv4 } from "uuid";
/**
 * Generated Universally Unique Identifier
 *
 * @returns RFC4122 v4 UUID.
 * @internal
 */
export function generateUuid() {
    return uuidv4();
}
//# sourceMappingURL=uuid.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { getRandomIntegerInclusive } from "@azure/core-util";
import { isThrottlingRetryResponse } from "./throttlingRetryStrategy";
// intervals are in milliseconds
const DEFAULT_CLIENT_RETRY_INTERVAL = 1000;
const DEFAULT_CLIENT_MAX_RETRY_INTERVAL = 1000 * 64;
/**
 * A retry strategy that retries with an exponentially increasing delay in these two cases:
 * - When there are errors in the underlying transport layer (e.g. DNS lookup failures).
 * - Or otherwise if the outgoing request fails (408, greater or equal than 500, except for 501 and 505).
 */
export function exponentialRetryStrategy(options = {}) {
    var _a, _b;
    const retryInterval = (_a = options.retryDelayInMs) !== null && _a !== void 0 ? _a : DEFAULT_CLIENT_RETRY_INTERVAL;
    const maxRetryInterval = (_b = options.maxRetryDelayInMs) !== null && _b !== void 0 ? _b : DEFAULT_CLIENT_MAX_RETRY_INTERVAL;
    let retryAfterInMs = retryInterval;
    return {
        name: "exponentialRetryStrategy",
        retry({ retryCount, response, responseError }) {
            const matchedSystemError = isSystemError(responseError);
            const ignoreSystemErrors = matchedSystemError && options.ignoreSystemErrors;
            const isExponential = isExponentialRetryResponse(response);
            const ignoreExponentialResponse = isExponential && options.ignoreHttpStatusCodes;
            const unknownResponse = response && (isThrottlingRetryResponse(response) || !isExponential);
            if (unknownResponse || ignoreExponentialResponse || ignoreSystemErrors) {
                return { skipStrategy: true };
            }
            if (responseError && !matchedSystemError && !isExponential) {
                return { errorToThrow: responseError };
            }
            // Exponentially increase the delay each time
            const exponentialDelay = retryAfterInMs * Math.pow(2, retryCount);
            // Don't let the delay exceed the maximum
            const clampedExponentialDelay = Math.min(maxRetryInterval, exponentialDelay);
            // Allow the final value to have some "jitter" (within 50% of the delay size) so
            // that retries across multiple clients don't occur simultaneously.
            retryAfterInMs =
                clampedExponentialDelay / 2 + getRandomIntegerInclusive(0, clampedExponentialDelay / 2);
            return { retryAfterInMs };
        },
    };
}
/**
 * A response is a retry response if it has status codes:
 * - 408, or
 * - Greater or equal than 500, except for 501 and 505.
 */
export function isExponentialRetryResponse(response) {
    return Boolean(response &&
        response.status !== undefined &&
        (response.status >= 500 || response.status === 408) &&
        response.status !== 501 &&
        response.status !== 505);
}
/**
 * Determines whether an error from a pipeline response was triggered in the network layer.
 */
export function isSystemError(err) {
    if (!err) {
        return false;
    }
    return (err.code === "ETIMEDOUT" ||
        err.code === "ESOCKETTIMEDOUT" ||
        err.code === "ECONNREFUSED" ||
        err.code === "ECONNRESET" ||
        err.code === "ENOENT");
}
//# sourceMappingURL=exponentialRetryStrategy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=retryStrategy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { parseHeaderValueAsNumber } from "../util/helpers";
/**
 * The header that comes back from Azure services representing
 * the amount of time (minimum) to wait to retry (in seconds or timestamp after which we can retry).
 */
const RetryAfterHeader = "Retry-After";
/**
 * The headers that come back from Azure services representing
 * the amount of time (minimum) to wait to retry.
 *
 * "retry-after-ms", "x-ms-retry-after-ms" : milliseconds
 * "Retry-After" : seconds or timestamp
 */
const AllRetryAfterHeaders = ["retry-after-ms", "x-ms-retry-after-ms", RetryAfterHeader];
/**
 * A response is a throttling retry response if it has a throttling status code (429 or 503),
 * as long as one of the [ "Retry-After" or "retry-after-ms" or "x-ms-retry-after-ms" ] headers has a valid value.
 *
 * Returns the `retryAfterInMs` value if the response is a throttling retry response.
 * If not throttling retry response, returns `undefined`.
 *
 * @internal
 */
function getRetryAfterInMs(response) {
    if (!(response && [429, 503].includes(response.status)))
        return undefined;
    try {
        // Headers: "retry-after-ms", "x-ms-retry-after-ms", "Retry-After"
        for (const header of AllRetryAfterHeaders) {
            const retryAfterValue = parseHeaderValueAsNumber(response, header);
            if (retryAfterValue === 0 || retryAfterValue) {
                // "Retry-After" header ==> seconds
                // "retry-after-ms", "x-ms-retry-after-ms" headers ==> milli-seconds
                const multiplyingFactor = header === RetryAfterHeader ? 1000 : 1;
                return retryAfterValue * multiplyingFactor; // in milli-seconds
            }
        }
        // RetryAfterHeader ("Retry-After") has a special case where it might be formatted as a date instead of a number of seconds
        const retryAfterHeader = response.headers.get(RetryAfterHeader);
        if (!retryAfterHeader)
            return;
        const date = Date.parse(retryAfterHeader);
        const diff = date - Date.now();
        // negative diff would mean a date in the past, so retry asap with 0 milliseconds
        return Number.isFinite(diff) ? Math.max(0, diff) : undefined;
    }
    catch (e) {
        return undefined;
    }
}
/**
 * A response is a retry response if it has a throttling status code (429 or 503),
 * as long as one of the [ "Retry-After" or "retry-after-ms" or "x-ms-retry-after-ms" ] headers has a valid value.
 */
export function isThrottlingRetryResponse(response) {
    return Number.isFinite(getRetryAfterInMs(response));
}
export function throttlingRetryStrategy() {
    return {
        name: "throttlingRetryStrategy",
        retry({ response }) {
            const retryAfterInMs = getRetryAfterInMs(response);
            if (!Number.isFinite(retryAfterInMs)) {
                return { skipStrategy: true };
            }
            return {
                retryAfterInMs,
            };
        },
    };
}
//# sourceMappingURL=throttlingRetryStrategy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createTokenCycler } from "../util/tokenCycler";
/**
 * The programmatic identifier of the bearerTokenAuthenticationPolicy.
 */
export const bearerTokenAuthenticationPolicyName = "bearerTokenAuthenticationPolicy";
/**
 * Default authorize request handler
 */
async function defaultAuthorizeRequest(options) {
    const { scopes, getAccessToken, request } = options;
    const getTokenOptions = {
        abortSignal: request.abortSignal,
        tracingOptions: request.tracingOptions,
    };
    const accessToken = await getAccessToken(scopes, getTokenOptions);
    if (accessToken) {
        options.request.headers.set("Authorization", `Bearer ${accessToken.token}`);
    }
}
/**
 * We will retrieve the challenge only if the response status code was 401,
 * and if the response contained the header "WWW-Authenticate" with a non-empty value.
 */
function getChallenge(response) {
    const challenge = response.headers.get("WWW-Authenticate");
    if (response.status === 401 && challenge) {
        return challenge;
    }
    return;
}
/**
 * A policy that can request a token from a TokenCredential implementation and
 * then apply it to the Authorization header of a request as a Bearer token.
 */
export function bearerTokenAuthenticationPolicy(options) {
    var _a;
    const { credential, scopes, challengeCallbacks, logger } = options;
    const callbacks = Object.assign({ authorizeRequest: (_a = challengeCallbacks === null || challengeCallbacks === void 0 ? void 0 : challengeCallbacks.authorizeRequest) !== null && _a !== void 0 ? _a : defaultAuthorizeRequest, authorizeRequestOnChallenge: challengeCallbacks === null || challengeCallbacks === void 0 ? void 0 : challengeCallbacks.authorizeRequestOnChallenge }, challengeCallbacks);
    // This function encapsulates the entire process of reliably retrieving the token
    // The options are left out of the public API until there's demand to configure this.
    // Remember to extend `BearerTokenAuthenticationPolicyOptions` with `TokenCyclerOptions`
    // in order to pass through the `options` object.
    const getAccessToken = credential
        ? createTokenCycler(credential /* , options */)
        : () => Promise.resolve(null);
    return {
        name: bearerTokenAuthenticationPolicyName,
        /**
         * If there's no challenge parameter:
         * - It will try to retrieve the token using the cache, or the credential's getToken.
         * - Then it will try the next policy with or without the retrieved token.
         *
         * It uses the challenge parameters to:
         * - Skip a first attempt to get the token from the credential if there's no cached token,
         *   since it expects the token to be retrievable only after the challenge.
         * - Prepare the outgoing request if the `prepareRequest` method has been provided.
         * - Send an initial request to receive the challenge if it fails.
         * - Process a challenge if the response contains it.
         * - Retrieve a token with the challenge information, then re-send the request.
         */
        async sendRequest(request, next) {
            if (!request.url.toLowerCase().startsWith("https://")) {
                throw new Error("Bearer token authentication is not permitted for non-TLS protected (non-https) URLs.");
            }
            await callbacks.authorizeRequest({
                scopes: Array.isArray(scopes) ? scopes : [scopes],
                request,
                getAccessToken,
                logger,
            });
            let response;
            let error;
            try {
                response = await next(request);
            }
            catch (err) {
                error = err;
                response = err.response;
            }
            if (callbacks.authorizeRequestOnChallenge &&
                (response === null || response === void 0 ? void 0 : response.status) === 401 &&
                getChallenge(response)) {
                // processes challenge
                const shouldSendRequest = await callbacks.authorizeRequestOnChallenge({
                    scopes: Array.isArray(scopes) ? scopes : [scopes],
                    request,
                    response,
                    getAccessToken,
                    logger,
                });
                if (shouldSendRequest) {
                    return next(request);
                }
            }
            if (error) {
                throw error;
            }
            else {
                return response;
            }
        },
    };
}
//# sourceMappingURL=bearerTokenAuthenticationPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/*
 * NOTE: When moving this file, please update "browser" section in package.json
 */
const NotSupported = new Error("decompressResponsePolicy is not supported in browser environment");
export const decompressResponsePolicyName = "decompressResponsePolicy";
/**
 * decompressResponsePolicy is not supported in the browser and attempting
 * to use it will raise an error.
 */
export function decompressResponsePolicy() {
    throw NotSupported;
}
//# sourceMappingURL=decompressResponsePolicy.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * The programmatic identifier of the decompressResponsePolicy.
 */
export const decompressResponsePolicyName = "decompressResponsePolicy";
/**
 * A policy to enable response decompression according to Accept-Encoding header
 * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding
 */
export function decompressResponsePolicy() {
    return {
        name: decompressResponsePolicyName,
        async sendRequest(request, next) {
            // HEAD requests have no body
            if (request.method !== "HEAD") {
                request.headers.set("Accept-Encoding", "gzip,deflate");
            }
            return next(request);
        },
    };
}
//# sourceMappingURL=decompressResponsePolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { exponentialRetryStrategy } from "../retryStrategies/exponentialRetryStrategy";
import { throttlingRetryStrategy } from "../retryStrategies/throttlingRetryStrategy";
import { retryPolicy } from "./retryPolicy";
import { DEFAULT_RETRY_POLICY_COUNT } from "../constants";
/**
 * Name of the {@link defaultRetryPolicy}
 */
export const defaultRetryPolicyName = "defaultRetryPolicy";
/**
 * A policy that retries according to three strategies:
 * - When the server sends a 429 response with a Retry-After header.
 * - When there are errors in the underlying transport layer (e.g. DNS lookup failures).
 * - Or otherwise if the outgoing request fails, it will retry with an exponentially increasing delay.
 */
export function defaultRetryPolicy(options = {}) {
    var _a;
    return {
        name: defaultRetryPolicyName,
        sendRequest: retryPolicy([throttlingRetryStrategy(), exponentialRetryStrategy(options)], {
            maxRetries: (_a = options.maxRetries) !== null && _a !== void 0 ? _a : DEFAULT_RETRY_POLICY_COUNT,
        }).sendRequest,
    };
}
//# sourceMappingURL=defaultRetryPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { exponentialRetryStrategy } from "../retryStrategies/exponentialRetryStrategy";
import { retryPolicy } from "./retryPolicy";
import { DEFAULT_RETRY_POLICY_COUNT } from "../constants";
/**
 * The programmatic identifier of the exponentialRetryPolicy.
 */
export const exponentialRetryPolicyName = "exponentialRetryPolicy";
/**
 * A policy that attempts to retry requests while introducing an exponentially increasing delay.
 * @param options - Options that configure retry logic.
 */
export function exponentialRetryPolicy(options = {}) {
    var _a;
    return retryPolicy([
        exponentialRetryStrategy(Object.assign(Object.assign({}, options), { ignoreSystemErrors: true })),
    ], {
        maxRetries: (_a = options.maxRetries) !== null && _a !== void 0 ? _a : DEFAULT_RETRY_POLICY_COUNT,
    });
}
//# sourceMappingURL=exponentialRetryPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * The programmatic identifier of the formDataPolicy.
 */
export const formDataPolicyName = "formDataPolicy";
/**
 * A policy that encodes FormData on the request into the body.
 */
export function formDataPolicy() {
    return {
        name: formDataPolicyName,
        async sendRequest(request, next) {
            if (request.formData) {
                const formData = request.formData;
                const requestForm = new FormData();
                for (const formKey of Object.keys(formData)) {
                    const formValue = formData[formKey];
                    if (Array.isArray(formValue)) {
                        for (const subValue of formValue) {
                            requestForm.append(formKey, subValue);
                        }
                    }
                    else {
                        requestForm.append(formKey, formValue);
                    }
                }
                request.body = requestForm;
                request.formData = undefined;
                const contentType = request.headers.get("Content-Type");
                if (contentType && contentType.indexOf("application/x-www-form-urlencoded") !== -1) {
                    request.body = new URLSearchParams(requestForm).toString();
                }
                else if (contentType && contentType.indexOf("multipart/form-data") !== -1) {
                    // browser will automatically apply a suitable content-type header
                    request.headers.delete("Content-Type");
                }
            }
            return next(request);
        },
    };
}
//# sourceMappingURL=formDataPolicy.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import FormData from "form-data";
/**
 * The programmatic identifier of the formDataPolicy.
 */
export const formDataPolicyName = "formDataPolicy";
/**
 * A policy that encodes FormData on the request into the body.
 */
export function formDataPolicy() {
    return {
        name: formDataPolicyName,
        async sendRequest(request, next) {
            if (request.formData) {
                const contentType = request.headers.get("Content-Type");
                if (contentType && contentType.indexOf("application/x-www-form-urlencoded") !== -1) {
                    request.body = wwwFormUrlEncode(request.formData);
                    request.formData = undefined;
                }
                else {
                    prepareFormData(request.formData, request);
                }
            }
            return next(request);
        },
    };
}
function wwwFormUrlEncode(formData) {
    const urlSearchParams = new URLSearchParams();
    for (const [key, value] of Object.entries(formData)) {
        if (Array.isArray(value)) {
            for (const subValue of value) {
                urlSearchParams.append(key, subValue.toString());
            }
        }
        else {
            urlSearchParams.append(key, value.toString());
        }
    }
    return urlSearchParams.toString();
}
async function prepareFormData(formData, request) {
    const requestForm = new FormData();
    for (const formKey of Object.keys(formData)) {
        const formValue = formData[formKey];
        if (Array.isArray(formValue)) {
            for (const subValue of formValue) {
                requestForm.append(formKey, subValue);
            }
        }
        else {
            requestForm.append(formKey, formValue);
        }
    }
    request.body = requestForm;
    request.formData = undefined;
    const contentType = request.headers.get("Content-Type");
    if (contentType && contentType.indexOf("multipart/form-data") !== -1) {
        request.headers.set("Content-Type", `multipart/form-data; boundary=${requestForm.getBoundary()}`);
    }
    try {
        const contentLength = await new Promise((resolve, reject) => {
            requestForm.getLength((err, length) => {
                if (err) {
                    reject(err);
                }
                else {
                    resolve(length);
                }
            });
        });
        request.headers.set("Content-Length", contentLength);
    }
    catch (e) {
        // ignore setting the length if this fails
    }
}
//# sourceMappingURL=formDataPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { logger as coreLogger } from "../log";
import { Sanitizer } from "../util/sanitizer";
/**
 * The programmatic identifier of the logPolicy.
 */
export const logPolicyName = "logPolicy";
/**
 * A policy that logs all requests and responses.
 * @param options - Options to configure logPolicy.
 */
export function logPolicy(options = {}) {
    var _a;
    const logger = (_a = options.logger) !== null && _a !== void 0 ? _a : coreLogger.info;
    const sanitizer = new Sanitizer({
        additionalAllowedHeaderNames: options.additionalAllowedHeaderNames,
        additionalAllowedQueryParameters: options.additionalAllowedQueryParameters,
    });
    return {
        name: logPolicyName,
        async sendRequest(request, next) {
            if (!logger.enabled) {
                return next(request);
            }
            logger(`Request: ${sanitizer.sanitize(request)}`);
            const response = await next(request);
            logger(`Response status code: ${response.status}`);
            logger(`Headers: ${sanitizer.sanitize(response.headers)}`);
            return response;
        },
    };
}
//# sourceMappingURL=logPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * The programmatic identifier of the ndJsonPolicy.
 */
export const ndJsonPolicyName = "ndJsonPolicy";
/**
 * ndJsonPolicy is a policy used to control keep alive settings for every request.
 */
export function ndJsonPolicy() {
    return {
        name: ndJsonPolicyName,
        async sendRequest(request, next) {
            // There currently isn't a good way to bypass the serializer
            if (typeof request.body === "string" && request.body.startsWith("[")) {
                const body = JSON.parse(request.body);
                if (Array.isArray(body)) {
                    request.body = body.map((item) => JSON.stringify(item) + "\n").join("");
                }
            }
            return next(request);
        },
    };
}
//# sourceMappingURL=ndJsonPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/*
 * NOTE: When moving this file, please update "browser" section in package.json
 */
const NotSupported = new Error("proxyPolicy is not supported in browser environment");
export const proxyPolicyName = "proxyPolicy";
export function getDefaultProxySettings() {
    throw NotSupported;
}
/**
 * proxyPolicy is not supported in the browser and attempting
 * to use it will raise an error.
 */
export function proxyPolicy() {
    throw NotSupported;
}
/**
 * A function to reset the cached agents.
 * proxyPolicy is not supported in the browser and attempting
 * to use it will raise an error.
 * @internal
 */
export function resetCachedProxyAgents() {
    throw NotSupported;
}
//# sourceMappingURL=proxyPolicy.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { HttpsProxyAgent } from "https-proxy-agent";
import { HttpProxyAgent } from "http-proxy-agent";
import { logger } from "../log";
const HTTPS_PROXY = "HTTPS_PROXY";
const HTTP_PROXY = "HTTP_PROXY";
const ALL_PROXY = "ALL_PROXY";
const NO_PROXY = "NO_PROXY";
/**
 * The programmatic identifier of the proxyPolicy.
 */
export const proxyPolicyName = "proxyPolicy";
/**
 * Stores the patterns specified in NO_PROXY environment variable.
 * @internal
 */
export const globalNoProxyList = [];
let noProxyListLoaded = false;
/** A cache of whether a host should bypass the proxy. */
const globalBypassedMap = new Map();
function getEnvironmentValue(name) {
    if (process.env[name]) {
        return process.env[name];
    }
    else if (process.env[name.toLowerCase()]) {
        return process.env[name.toLowerCase()];
    }
    return undefined;
}
function loadEnvironmentProxyValue() {
    if (!process) {
        return undefined;
    }
    const httpsProxy = getEnvironmentValue(HTTPS_PROXY);
    const allProxy = getEnvironmentValue(ALL_PROXY);
    const httpProxy = getEnvironmentValue(HTTP_PROXY);
    return httpsProxy || allProxy || httpProxy;
}
/**
 * Check whether the host of a given `uri` matches any pattern in the no proxy list.
 * If there's a match, any request sent to the same host shouldn't have the proxy settings set.
 * This implementation is a port of https://github.com/Azure/azure-sdk-for-net/blob/8cca811371159e527159c7eb65602477898683e2/sdk/core/Azure.Core/src/Pipeline/Internal/HttpEnvironmentProxy.cs#L210
 */
function isBypassed(uri, noProxyList, bypassedMap) {
    if (noProxyList.length === 0) {
        return false;
    }
    const host = new URL(uri).hostname;
    if (bypassedMap === null || bypassedMap === void 0 ? void 0 : bypassedMap.has(host)) {
        return bypassedMap.get(host);
    }
    let isBypassedFlag = false;
    for (const pattern of noProxyList) {
        if (pattern[0] === ".") {
            // This should match either domain it self or any subdomain or host
            // .foo.com will match foo.com it self or *.foo.com
            if (host.endsWith(pattern)) {
                isBypassedFlag = true;
            }
            else {
                if (host.length === pattern.length - 1 && host === pattern.slice(1)) {
                    isBypassedFlag = true;
                }
            }
        }
        else {
            if (host === pattern) {
                isBypassedFlag = true;
            }
        }
    }
    bypassedMap === null || bypassedMap === void 0 ? void 0 : bypassedMap.set(host, isBypassedFlag);
    return isBypassedFlag;
}
export function loadNoProxy() {
    const noProxy = getEnvironmentValue(NO_PROXY);
    noProxyListLoaded = true;
    if (noProxy) {
        return noProxy
            .split(",")
            .map((item) => item.trim())
            .filter((item) => item.length);
    }
    return [];
}
/**
 * This method converts a proxy url into `ProxySettings` for use with ProxyPolicy.
 * If no argument is given, it attempts to parse a proxy URL from the environment
 * variables `HTTPS_PROXY` or `HTTP_PROXY`.
 * @param proxyUrl - The url of the proxy to use. May contain authentication information.
 */
export function getDefaultProxySettings(proxyUrl) {
    if (!proxyUrl) {
        proxyUrl = loadEnvironmentProxyValue();
        if (!proxyUrl) {
            return undefined;
        }
    }
    const parsedUrl = new URL(proxyUrl);
    const schema = parsedUrl.protocol ? parsedUrl.protocol + "//" : "";
    return {
        host: schema + parsedUrl.hostname,
        port: Number.parseInt(parsedUrl.port || "80"),
        username: parsedUrl.username,
        password: parsedUrl.password,
    };
}
/**
 * @internal
 */
export function getProxyAgentOptions(proxySettings, { headers, tlsSettings }) {
    let parsedProxyUrl;
    try {
        parsedProxyUrl = new URL(proxySettings.host);
    }
    catch (_error) {
        throw new Error(`Expecting a valid host string in proxy settings, but found "${proxySettings.host}".`);
    }
    if (tlsSettings) {
        logger.warning("TLS settings are not supported in combination with custom Proxy, certificates provided to the client will be ignored.");
    }
    const proxyAgentOptions = {
        hostname: parsedProxyUrl.hostname,
        port: proxySettings.port,
        protocol: parsedProxyUrl.protocol,
        headers: headers.toJSON(),
    };
    if (proxySettings.username && proxySettings.password) {
        proxyAgentOptions.auth = `${proxySettings.username}:${proxySettings.password}`;
    }
    else if (proxySettings.username) {
        proxyAgentOptions.auth = `${proxySettings.username}`;
    }
    return proxyAgentOptions;
}
function setProxyAgentOnRequest(request, cachedAgents) {
    // Custom Agent should take precedence so if one is present
    // we should skip to avoid overwriting it.
    if (request.agent) {
        return;
    }
    const url = new URL(request.url);
    const isInsecure = url.protocol !== "https:";
    const proxySettings = request.proxySettings;
    if (proxySettings) {
        if (isInsecure) {
            if (!cachedAgents.httpProxyAgent) {
                const proxyAgentOptions = getProxyAgentOptions(proxySettings, request);
                cachedAgents.httpProxyAgent = new HttpProxyAgent(proxyAgentOptions);
            }
            request.agent = cachedAgents.httpProxyAgent;
        }
        else {
            if (!cachedAgents.httpsProxyAgent) {
                const proxyAgentOptions = getProxyAgentOptions(proxySettings, request);
                cachedAgents.httpsProxyAgent = new HttpsProxyAgent(proxyAgentOptions);
            }
            request.agent = cachedAgents.httpsProxyAgent;
        }
    }
}
/**
 * A policy that allows one to apply proxy settings to all requests.
 * If not passed static settings, they will be retrieved from the HTTPS_PROXY
 * or HTTP_PROXY environment variables.
 * @param proxySettings - ProxySettings to use on each request.
 * @param options - additional settings, for example, custom NO_PROXY patterns
 */
export function proxyPolicy(proxySettings = getDefaultProxySettings(), options) {
    if (!noProxyListLoaded) {
        globalNoProxyList.push(...loadNoProxy());
    }
    const cachedAgents = {};
    return {
        name: proxyPolicyName,
        async sendRequest(request, next) {
            var _a;
            if (!request.proxySettings &&
                !isBypassed(request.url, (_a = options === null || options === void 0 ? void 0 : options.customNoProxyList) !== null && _a !== void 0 ? _a : globalNoProxyList, (options === null || options === void 0 ? void 0 : options.customNoProxyList) ? undefined : globalBypassedMap)) {
                request.proxySettings = proxySettings;
            }
            if (request.proxySettings) {
                setProxyAgentOnRequest(request, cachedAgents);
            }
            return next(request);
        },
    };
}
//# sourceMappingURL=proxyPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * The programmatic identifier of the redirectPolicy.
 */
export const redirectPolicyName = "redirectPolicy";
/**
 * Methods that are allowed to follow redirects 301 and 302
 */
const allowedRedirect = ["GET", "HEAD"];
/**
 * A policy to follow Location headers from the server in order
 * to support server-side redirection.
 * In the browser, this policy is not used.
 * @param options - Options to control policy behavior.
 */
export function redirectPolicy(options = {}) {
    const { maxRetries = 20 } = options;
    return {
        name: redirectPolicyName,
        async sendRequest(request, next) {
            const response = await next(request);
            return handleRedirect(next, response, maxRetries);
        },
    };
}
async function handleRedirect(next, response, maxRetries, currentRetries = 0) {
    const { request, status, headers } = response;
    const locationHeader = headers.get("location");
    if (locationHeader &&
        (status === 300 ||
            (status === 301 && allowedRedirect.includes(request.method)) ||
            (status === 302 && allowedRedirect.includes(request.method)) ||
            (status === 303 && request.method === "POST") ||
            status === 307) &&
        currentRetries < maxRetries) {
        const url = new URL(locationHeader, request.url);
        request.url = url.toString();
        // POST request with Status code 303 should be converted into a
        // redirected GET request if the redirect url is present in the location header
        if (status === 303) {
            request.method = "GET";
            request.headers.delete("Content-Length");
            delete request.body;
        }
        request.headers.delete("Authorization");
        const res = await next(request);
        return handleRedirect(next, res, maxRetries, currentRetries + 1);
    }
    return response;
}
//# sourceMappingURL=redirectPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { delay } from "../util/helpers";
import { createClientLogger } from "@azure/logger";
import { AbortError } from "@azure/abort-controller";
import { DEFAULT_RETRY_POLICY_COUNT } from "../constants";
const retryPolicyLogger = createClientLogger("core-rest-pipeline retryPolicy");
/**
 * The programmatic identifier of the retryPolicy.
 */
const retryPolicyName = "retryPolicy";
/**
 * retryPolicy is a generic policy to enable retrying requests when certain conditions are met
 */
export function retryPolicy(strategies, options = { maxRetries: DEFAULT_RETRY_POLICY_COUNT }) {
    const logger = options.logger || retryPolicyLogger;
    return {
        name: retryPolicyName,
        async sendRequest(request, next) {
            var _a, _b;
            let response;
            let responseError;
            let retryCount = -1;
            // eslint-disable-next-line no-constant-condition
            retryRequest: while (true) {
                retryCount += 1;
                response = undefined;
                responseError = undefined;
                try {
                    logger.info(`Retry ${retryCount}: Attempting to send request`, request.requestId);
                    response = await next(request);
                    logger.info(`Retry ${retryCount}: Received a response from request`, request.requestId);
                }
                catch (e) {
                    logger.error(`Retry ${retryCount}: Received an error from request`, request.requestId);
                    // RestErrors are valid targets for the retry strategies.
                    // If none of the retry strategies can work with them, they will be thrown later in this policy.
                    // If the received error is not a RestError, it is immediately thrown.
                    responseError = e;
                    if (!e || responseError.name !== "RestError") {
                        throw e;
                    }
                    response = responseError.response;
                }
                if ((_a = request.abortSignal) === null || _a === void 0 ? void 0 : _a.aborted) {
                    logger.error(`Retry ${retryCount}: Request aborted.`);
                    const abortError = new AbortError();
                    throw abortError;
                }
                if (retryCount >= ((_b = options.maxRetries) !== null && _b !== void 0 ? _b : DEFAULT_RETRY_POLICY_COUNT)) {
                    logger.info(`Retry ${retryCount}: Maximum retries reached. Returning the last received response, or throwing the last received error.`);
                    if (responseError) {
                        throw responseError;
                    }
                    else if (response) {
                        return response;
                    }
                    else {
                        throw new Error("Maximum retries reached with no response or error to throw");
                    }
                }
                logger.info(`Retry ${retryCount}: Processing ${strategies.length} retry strategies.`);
                strategiesLoop: for (const strategy of strategies) {
                    const strategyLogger = strategy.logger || retryPolicyLogger;
                    strategyLogger.info(`Retry ${retryCount}: Processing retry strategy ${strategy.name}.`);
                    const modifiers = strategy.retry({
                        retryCount,
                        response,
                        responseError,
                    });
                    if (modifiers.skipStrategy) {
                        strategyLogger.info(`Retry ${retryCount}: Skipped.`);
                        continue strategiesLoop;
                    }
                    const { errorToThrow, retryAfterInMs, redirectTo } = modifiers;
                    if (errorToThrow) {
                        strategyLogger.error(`Retry ${retryCount}: Retry strategy ${strategy.name} throws error:`, errorToThrow);
                        throw errorToThrow;
                    }
                    if (retryAfterInMs || retryAfterInMs === 0) {
                        strategyLogger.info(`Retry ${retryCount}: Retry strategy ${strategy.name} retries after ${retryAfterInMs}`);
                        await delay(retryAfterInMs, undefined, { abortSignal: request.abortSignal });
                        continue retryRequest;
                    }
                    if (redirectTo) {
                        strategyLogger.info(`Retry ${retryCount}: Retry strategy ${strategy.name} redirects to ${redirectTo}`);
                        request.url = redirectTo;
                        continue retryRequest;
                    }
                }
                if (responseError) {
                    logger.info(`None of the retry strategies could work with the received error. Throwing it.`);
                    throw responseError;
                }
                if (response) {
                    logger.info(`None of the retry strategies could work with the received response. Returning it.`);
                    return response;
                }
                // If all the retries skip and there's no response,
                // we're still in the retry loop, so a new request will be sent
                // until `maxRetries` is reached.
            }
        },
    };
}
//# sourceMappingURL=retryPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * The programmatic identifier of the setClientRequestIdPolicy.
 */
export const setClientRequestIdPolicyName = "setClientRequestIdPolicy";
/**
 * Each PipelineRequest gets a unique id upon creation.
 * This policy passes that unique id along via an HTTP header to enable better
 * telemetry and tracing.
 * @param requestIdHeaderName - The name of the header to pass the request ID to.
 */
export function setClientRequestIdPolicy(requestIdHeaderName = "x-ms-client-request-id") {
    return {
        name: setClientRequestIdPolicyName,
        async sendRequest(request, next) {
            if (!request.headers.has(requestIdHeaderName)) {
                request.headers.set(requestIdHeaderName, request.requestId);
            }
            return next(request);
        },
    };
}
//# sourceMappingURL=setClientRequestIdPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { exponentialRetryStrategy } from "../retryStrategies/exponentialRetryStrategy";
import { retryPolicy } from "./retryPolicy";
import { DEFAULT_RETRY_POLICY_COUNT } from "../constants";
/**
 * Name of the {@link systemErrorRetryPolicy}
 */
export const systemErrorRetryPolicyName = "systemErrorRetryPolicy";
/**
 * A retry policy that specifically seeks to handle errors in the
 * underlying transport layer (e.g. DNS lookup failures) rather than
 * retryable error codes from the server itself.
 * @param options - Options that customize the policy.
 */
export function systemErrorRetryPolicy(options = {}) {
    var _a;
    return {
        name: systemErrorRetryPolicyName,
        sendRequest: retryPolicy([
            exponentialRetryStrategy(Object.assign(Object.assign({}, options), { ignoreHttpStatusCodes: true })),
        ], {
            maxRetries: (_a = options.maxRetries) !== null && _a !== void 0 ? _a : DEFAULT_RETRY_POLICY_COUNT,
        }).sendRequest,
    };
}
//# sourceMappingURL=systemErrorRetryPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { throttlingRetryStrategy } from "../retryStrategies/throttlingRetryStrategy";
import { retryPolicy } from "./retryPolicy";
import { DEFAULT_RETRY_POLICY_COUNT } from "../constants";
/**
 * Name of the {@link throttlingRetryPolicy}
 */
export const throttlingRetryPolicyName = "throttlingRetryPolicy";
/**
 * A policy that retries when the server sends a 429 response with a Retry-After header.
 *
 * To learn more, please refer to
 * https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-manager-request-limits,
 * https://docs.microsoft.com/en-us/azure/azure-subscription-service-limits and
 * https://docs.microsoft.com/en-us/azure/virtual-machines/troubleshooting/troubleshooting-throttling-errors
 *
 * @param options - Options that configure retry logic.
 */
export function throttlingRetryPolicy(options = {}) {
    var _a;
    return {
        name: throttlingRetryPolicyName,
        sendRequest: retryPolicy([throttlingRetryStrategy()], {
            maxRetries: (_a = options.maxRetries) !== null && _a !== void 0 ? _a : DEFAULT_RETRY_POLICY_COUNT,
        }).sendRequest,
    };
}
//# sourceMappingURL=throttlingRetryPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Name of the TLS Policy
 */
export const tlsPolicyName = "tlsPolicy";
/**
 * Gets a pipeline policy that adds the client certificate to the HttpClient agent for authentication.
 */
export function tlsPolicy(tlsSettings) {
    return {
        name: tlsPolicyName,
        sendRequest: async (req, next) => {
            // Users may define a request tlsSettings, honor those over the client level one
            if (!req.tlsSettings) {
                req.tlsSettings = tlsSettings;
            }
            return next(req);
        },
    };
}
//# sourceMappingURL=tlsPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createTracingClient, } from "@azure/core-tracing";
import { SDK_VERSION } from "../constants";
import { getUserAgentValue } from "../util/userAgent";
import { logger } from "../log";
import { getErrorMessage, isError } from "@azure/core-util";
import { isRestError } from "../restError";
/**
 * The programmatic identifier of the tracingPolicy.
 */
export const tracingPolicyName = "tracingPolicy";
/**
 * A simple policy to create OpenTelemetry Spans for each request made by the pipeline
 * that has SpanOptions with a parent.
 * Requests made without a parent Span will not be recorded.
 * @param options - Options to configure the telemetry logged by the tracing policy.
 */
export function tracingPolicy(options = {}) {
    const userAgent = getUserAgentValue(options.userAgentPrefix);
    const tracingClient = tryCreateTracingClient();
    return {
        name: tracingPolicyName,
        async sendRequest(request, next) {
            var _a, _b;
            if (!tracingClient || !((_a = request.tracingOptions) === null || _a === void 0 ? void 0 : _a.tracingContext)) {
                return next(request);
            }
            const { span, tracingContext } = (_b = tryCreateSpan(tracingClient, request, userAgent)) !== null && _b !== void 0 ? _b : {};
            if (!span || !tracingContext) {
                return next(request);
            }
            try {
                const response = await tracingClient.withContext(tracingContext, next, request);
                tryProcessResponse(span, response);
                return response;
            }
            catch (err) {
                tryProcessError(span, err);
                throw err;
            }
        },
    };
}
function tryCreateTracingClient() {
    try {
        return createTracingClient({
            namespace: "",
            packageName: "@azure/core-rest-pipeline",
            packageVersion: SDK_VERSION,
        });
    }
    catch (e) {
        logger.warning(`Error when creating the TracingClient: ${getErrorMessage(e)}`);
        return undefined;
    }
}
function tryCreateSpan(tracingClient, request, userAgent) {
    try {
        // As per spec, we do not need to differentiate between HTTP and HTTPS in span name.
        const { span, updatedOptions } = tracingClient.startSpan(`HTTP ${request.method}`, { tracingOptions: request.tracingOptions }, {
            spanKind: "client",
            spanAttributes: {
                "http.method": request.method,
                "http.url": request.url,
                requestId: request.requestId,
            },
        });
        // If the span is not recording, don't do any more work.
        if (!span.isRecording()) {
            span.end();
            return undefined;
        }
        if (userAgent) {
            span.setAttribute("http.user_agent", userAgent);
        }
        // set headers
        const headers = tracingClient.createRequestHeaders(updatedOptions.tracingOptions.tracingContext);
        for (const [key, value] of Object.entries(headers)) {
            request.headers.set(key, value);
        }
        return { span, tracingContext: updatedOptions.tracingOptions.tracingContext };
    }
    catch (e) {
        logger.warning(`Skipping creating a tracing span due to an error: ${getErrorMessage(e)}`);
        return undefined;
    }
}
function tryProcessError(span, error) {
    try {
        span.setStatus({
            status: "error",
            error: isError(error) ? error : undefined,
        });
        if (isRestError(error) && error.statusCode) {
            span.setAttribute("http.status_code", error.statusCode);
        }
        span.end();
    }
    catch (e) {
        logger.warning(`Skipping tracing span processing due to an error: ${getErrorMessage(e)}`);
    }
}
function tryProcessResponse(span, response) {
    try {
        span.setAttribute("http.status_code", response.status);
        const serviceRequestId = response.headers.get("x-ms-request-id");
        if (serviceRequestId) {
            span.setAttribute("serviceRequestId", serviceRequestId);
        }
        span.setStatus({
            status: "success",
        });
        span.end();
    }
    catch (e) {
        logger.warning(`Skipping tracing span processing due to an error: ${getErrorMessage(e)}`);
    }
}
//# sourceMappingURL=tracingPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { getUserAgentHeaderName, getUserAgentValue } from "../util/userAgent";
const UserAgentHeaderName = getUserAgentHeaderName();
/**
 * The programmatic identifier of the userAgentPolicy.
 */
export const userAgentPolicyName = "userAgentPolicy";
/**
 * A policy that sets the User-Agent header (or equivalent) to reflect
 * the library version.
 * @param options - Options to customize the user agent value.
 */
export function userAgentPolicy(options = {}) {
    const userAgentValue = getUserAgentValue(options.userAgentPrefix);
    return {
        name: userAgentPolicyName,
        async sendRequest(request, next) {
            if (!request.headers.has(UserAgentHeaderName)) {
                request.headers.set(UserAgentHeaderName, userAgentValue);
            }
            return next(request);
        },
    };
}
//# sourceMappingURL=userAgentPolicy.js.map'use strict';

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

var logger$1 = require('@azure/logger');
var coreUtil = require('@azure/core-util');
var os = require('os');
var abortController = require('@azure/abort-controller');
var FormData = require('form-data');
var httpsProxyAgent = require('https-proxy-agent');
var httpProxyAgent = require('http-proxy-agent');
var coreTracing = require('@azure/core-tracing');
var util = require('util');
var http = require('http');
var https = require('https');
var zlib = require('zlib');
var stream = require('stream');
var uuid = require('uuid');

function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }

function _interopNamespace(e) {
    if (e && e.__esModule) return e;
    var n = Object.create(null);
    if (e) {
        Object.keys(e).forEach(function (k) {
            if (k !== 'default') {
                var d = Object.getOwnPropertyDescriptor(e, k);
                Object.defineProperty(n, k, d.get ? d : {
                    enumerable: true,
                    get: function () { return e[k]; }
                });
            }
        });
    }
    n["default"] = e;
    return Object.freeze(n);
}

var os__namespace = /*#__PURE__*/_interopNamespace(os);
var FormData__default = /*#__PURE__*/_interopDefaultLegacy(FormData);
var http__namespace = /*#__PURE__*/_interopNamespace(http);
var https__namespace = /*#__PURE__*/_interopNamespace(https);
var zlib__namespace = /*#__PURE__*/_interopNamespace(zlib);

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
const ValidPhaseNames = new Set(["Deserialize", "Serialize", "Retry", "Sign"]);
/**
 * A private implementation of Pipeline.
 * Do not export this class from the package.
 * @internal
 */
class HttpPipeline {
    constructor(policies = []) {
        this._policies = [];
        this._policies = policies;
        this._orderedPolicies = undefined;
    }
    addPolicy(policy, options = {}) {
        if (options.phase && options.afterPhase) {
            throw new Error("Policies inside a phase cannot specify afterPhase.");
        }
        if (options.phase && !ValidPhaseNames.has(options.phase)) {
            throw new Error(`Invalid phase name: ${options.phase}`);
        }
        if (options.afterPhase && !ValidPhaseNames.has(options.afterPhase)) {
            throw new Error(`Invalid afterPhase name: ${options.afterPhase}`);
        }
        this._policies.push({
            policy,
            options,
        });
        this._orderedPolicies = undefined;
    }
    removePolicy(options) {
        const removedPolicies = [];
        this._policies = this._policies.filter((policyDescriptor) => {
            if ((options.name && policyDescriptor.policy.name === options.name) ||
                (options.phase && policyDescriptor.options.phase === options.phase)) {
                removedPolicies.push(policyDescriptor.policy);
                return false;
            }
            else {
                return true;
            }
        });
        this._orderedPolicies = undefined;
        return removedPolicies;
    }
    sendRequest(httpClient, request) {
        const policies = this.getOrderedPolicies();
        const pipeline = policies.reduceRight((next, policy) => {
            return (req) => {
                return policy.sendRequest(req, next);
            };
        }, (req) => httpClient.sendRequest(req));
        return pipeline(request);
    }
    getOrderedPolicies() {
        if (!this._orderedPolicies) {
            this._orderedPolicies = this.orderPolicies();
        }
        return this._orderedPolicies;
    }
    clone() {
        return new HttpPipeline(this._policies);
    }
    static create() {
        return new HttpPipeline();
    }
    orderPolicies() {
        /**
         * The goal of this method is to reliably order pipeline policies
         * based on their declared requirements when they were added.
         *
         * Order is first determined by phase:
         *
         * 1. Serialize Phase
         * 2. Policies not in a phase
         * 3. Deserialize Phase
         * 4. Retry Phase
         * 5. Sign Phase
         *
         * Within each phase, policies are executed in the order
         * they were added unless they were specified to execute
         * before/after other policies or after a particular phase.
         *
         * To determine the final order, we will walk the policy list
         * in phase order multiple times until all dependencies are
         * satisfied.
         *
         * `afterPolicies` are the set of policies that must be
         * executed before a given policy. This requirement is
         * considered satisfied when each of the listed policies
         * have been scheduled.
         *
         * `beforePolicies` are the set of policies that must be
         * executed after a given policy. Since this dependency
         * can be expressed by converting it into a equivalent
         * `afterPolicies` declarations, they are normalized
         * into that form for simplicity.
         *
         * An `afterPhase` dependency is considered satisfied when all
         * policies in that phase have scheduled.
         *
         */
        const result = [];
        // Track all policies we know about.
        const policyMap = new Map();
        function createPhase(name) {
            return {
                name,
                policies: new Set(),
                hasRun: false,
            };
        }
        // Track policies for each phase.
        const serializePhase = createPhase("Serialize");
        const noPhase = createPhase("None");
        const deserializePhase = createPhase("Deserialize");
        const retryPhase = createPhase("Retry");
        const signPhase = createPhase("Sign");
        // a list of phases in order
        const orderedPhases = [serializePhase, noPhase, deserializePhase, retryPhase, signPhase];
        // Small helper function to map phase name to each Phase
        function getPhase(phase) {
            if (phase === "Retry") {
                return retryPhase;
            }
            else if (phase === "Serialize") {
                return serializePhase;
            }
            else if (phase === "Deserialize") {
                return deserializePhase;
            }
            else if (phase === "Sign") {
                return signPhase;
            }
            else {
                return noPhase;
            }
        }
        // First walk each policy and create a node to track metadata.
        for (const descriptor of this._policies) {
            const policy = descriptor.policy;
            const options = descriptor.options;
            const policyName = policy.name;
            if (policyMap.has(policyName)) {
                throw new Error("Duplicate policy names not allowed in pipeline");
            }
            const node = {
                policy,
                dependsOn: new Set(),
                dependants: new Set(),
            };
            if (options.afterPhase) {
                node.afterPhase = getPhase(options.afterPhase);
            }
            policyMap.set(policyName, node);
            const phase = getPhase(options.phase);
            phase.policies.add(node);
        }
        // Now that each policy has a node, connect dependency references.
        for (const descriptor of this._policies) {
            const { policy, options } = descriptor;
            const policyName = policy.name;
            const node = policyMap.get(policyName);
            if (!node) {
                throw new Error(`Missing node for policy ${policyName}`);
            }
            if (options.afterPolicies) {
                for (const afterPolicyName of options.afterPolicies) {
                    const afterNode = policyMap.get(afterPolicyName);
                    if (afterNode) {
                        // Linking in both directions helps later
                        // when we want to notify dependants.
                        node.dependsOn.add(afterNode);
                        afterNode.dependants.add(node);
                    }
                }
            }
            if (options.beforePolicies) {
                for (const beforePolicyName of options.beforePolicies) {
                    const beforeNode = policyMap.get(beforePolicyName);
                    if (beforeNode) {
                        // To execute before another node, make it
                        // depend on the current node.
                        beforeNode.dependsOn.add(node);
                        node.dependants.add(beforeNode);
                    }
                }
            }
        }
        function walkPhase(phase) {
            phase.hasRun = true;
            // Sets iterate in insertion order
            for (const node of phase.policies) {
                if (node.afterPhase && (!node.afterPhase.hasRun || node.afterPhase.policies.size)) {
                    // If this node is waiting on a phase to complete,
                    // we need to skip it for now.
                    // Even if the phase is empty, we should wait for it
                    // to be walked to avoid re-ordering policies.
                    continue;
                }
                if (node.dependsOn.size === 0) {
                    // If there's nothing else we're waiting for, we can
                    // add this policy to the result list.
                    result.push(node.policy);
                    // Notify anything that depends on this policy that
                    // the policy has been scheduled.
                    for (const dependant of node.dependants) {
                        dependant.dependsOn.delete(node);
                    }
                    policyMap.delete(node.policy.name);
                    phase.policies.delete(node);
                }
            }
        }
        function walkPhases() {
            for (const phase of orderedPhases) {
                walkPhase(phase);
                // if the phase isn't complete
                if (phase.policies.size > 0 && phase !== noPhase) {
                    if (!noPhase.hasRun) {
                        // Try running noPhase to see if that unblocks this phase next tick.
                        // This can happen if a phase that happens before noPhase
                        // is waiting on a noPhase policy to complete.
                        walkPhase(noPhase);
                    }
                    // Don't proceed to the next phase until this phase finishes.
                    return;
                }
            }
        }
        // Iterate until we've put every node in the result list.
        let iteration = 0;
        while (policyMap.size > 0) {
            iteration++;
            const initialResultLength = result.length;
            // Keep walking each phase in order until we can order every node.
            walkPhases();
            // The result list *should* get at least one larger each time
            // after the first full pass.
            // Otherwise, we're going to loop forever.
            if (result.length <= initialResultLength && iteration > 1) {
                throw new Error("Cannot satisfy policy dependencies due to requirements cycle.");
            }
        }
        return result;
    }
}
/**
 * Creates a totally empty pipeline.
 * Useful for testing or creating a custom one.
 */
function createEmptyPipeline() {
    return HttpPipeline.create();
}

// Copyright (c) Microsoft Corporation.
const logger = logger$1.createClientLogger("core-rest-pipeline");

// Copyright (c) Microsoft Corporation.
const RedactedString = "REDACTED";
// Make sure this list is up-to-date with the one under core/logger/Readme#Keyconcepts
const defaultAllowedHeaderNames = [
    "x-ms-client-request-id",
    "x-ms-return-client-request-id",
    "x-ms-useragent",
    "x-ms-correlation-request-id",
    "x-ms-request-id",
    "client-request-id",
    "ms-cv",
    "return-client-request-id",
    "traceparent",
    "Access-Control-Allow-Credentials",
    "Access-Control-Allow-Headers",
    "Access-Control-Allow-Methods",
    "Access-Control-Allow-Origin",
    "Access-Control-Expose-Headers",
    "Access-Control-Max-Age",
    "Access-Control-Request-Headers",
    "Access-Control-Request-Method",
    "Origin",
    "Accept",
    "Accept-Encoding",
    "Cache-Control",
    "Connection",
    "Content-Length",
    "Content-Type",
    "Date",
    "ETag",
    "Expires",
    "If-Match",
    "If-Modified-Since",
    "If-None-Match",
    "If-Unmodified-Since",
    "Last-Modified",
    "Pragma",
    "Request-Id",
    "Retry-After",
    "Server",
    "Transfer-Encoding",
    "User-Agent",
    "WWW-Authenticate",
];
const defaultAllowedQueryParameters = ["api-version"];
/**
 * @internal
 */
class Sanitizer {
    constructor({ additionalAllowedHeaderNames: allowedHeaderNames = [], additionalAllowedQueryParameters: allowedQueryParameters = [], } = {}) {
        allowedHeaderNames = defaultAllowedHeaderNames.concat(allowedHeaderNames);
        allowedQueryParameters = defaultAllowedQueryParameters.concat(allowedQueryParameters);
        this.allowedHeaderNames = new Set(allowedHeaderNames.map((n) => n.toLowerCase()));
        this.allowedQueryParameters = new Set(allowedQueryParameters.map((p) => p.toLowerCase()));
    }
    sanitize(obj) {
        const seen = new Set();
        return JSON.stringify(obj, (key, value) => {
            // Ensure Errors include their interesting non-enumerable members
            if (value instanceof Error) {
                return Object.assign(Object.assign({}, value), { name: value.name, message: value.message });
            }
            if (key === "headers") {
                return this.sanitizeHeaders(value);
            }
            else if (key === "url") {
                return this.sanitizeUrl(value);
            }
            else if (key === "query") {
                return this.sanitizeQuery(value);
            }
            else if (key === "body") {
                // Don't log the request body
                return undefined;
            }
            else if (key === "response") {
                // Don't log response again
                return undefined;
            }
            else if (key === "operationSpec") {
                // When using sendOperationRequest, the request carries a massive
                // field with the autorest spec. No need to log it.
                return undefined;
            }
            else if (Array.isArray(value) || coreUtil.isObject(value)) {
                if (seen.has(value)) {
                    return "[Circular]";
                }
                seen.add(value);
            }
            return value;
        }, 2);
    }
    sanitizeHeaders(obj) {
        const sanitized = {};
        for (const key of Object.keys(obj)) {
            if (this.allowedHeaderNames.has(key.toLowerCase())) {
                sanitized[key] = obj[key];
            }
            else {
                sanitized[key] = RedactedString;
            }
        }
        return sanitized;
    }
    sanitizeQuery(value) {
        if (typeof value !== "object" || value === null) {
            return value;
        }
        const sanitized = {};
        for (const k of Object.keys(value)) {
            if (this.allowedQueryParameters.has(k.toLowerCase())) {
                sanitized[k] = value[k];
            }
            else {
                sanitized[k] = RedactedString;
            }
        }
        return sanitized;
    }
    sanitizeUrl(value) {
        if (typeof value !== "string" || value === null) {
            return value;
        }
        const url = new URL(value);
        if (!url.search) {
            return value;
        }
        for (const [key] of url.searchParams) {
            if (!this.allowedQueryParameters.has(key.toLowerCase())) {
                url.searchParams.set(key, RedactedString);
            }
        }
        return url.toString();
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * The programmatic identifier of the logPolicy.
 */
const logPolicyName = "logPolicy";
/**
 * A policy that logs all requests and responses.
 * @param options - Options to configure logPolicy.
 */
function logPolicy(options = {}) {
    var _a;
    const logger$1 = (_a = options.logger) !== null && _a !== void 0 ? _a : logger.info;
    const sanitizer = new Sanitizer({
        additionalAllowedHeaderNames: options.additionalAllowedHeaderNames,
        additionalAllowedQueryParameters: options.additionalAllowedQueryParameters,
    });
    return {
        name: logPolicyName,
        async sendRequest(request, next) {
            if (!logger$1.enabled) {
                return next(request);
            }
            logger$1(`Request: ${sanitizer.sanitize(request)}`);
            const response = await next(request);
            logger$1(`Response status code: ${response.status}`);
            logger$1(`Headers: ${sanitizer.sanitize(response.headers)}`);
            return response;
        },
    };
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * The programmatic identifier of the redirectPolicy.
 */
const redirectPolicyName = "redirectPolicy";
/**
 * Methods that are allowed to follow redirects 301 and 302
 */
const allowedRedirect = ["GET", "HEAD"];
/**
 * A policy to follow Location headers from the server in order
 * to support server-side redirection.
 * In the browser, this policy is not used.
 * @param options - Options to control policy behavior.
 */
function redirectPolicy(options = {}) {
    const { maxRetries = 20 } = options;
    return {
        name: redirectPolicyName,
        async sendRequest(request, next) {
            const response = await next(request);
            return handleRedirect(next, response, maxRetries);
        },
    };
}
async function handleRedirect(next, response, maxRetries, currentRetries = 0) {
    const { request, status, headers } = response;
    const locationHeader = headers.get("location");
    if (locationHeader &&
        (status === 300 ||
            (status === 301 && allowedRedirect.includes(request.method)) ||
            (status === 302 && allowedRedirect.includes(request.method)) ||
            (status === 303 && request.method === "POST") ||
            status === 307) &&
        currentRetries < maxRetries) {
        const url = new URL(locationHeader, request.url);
        request.url = url.toString();
        // POST request with Status code 303 should be converted into a
        // redirected GET request if the redirect url is present in the location header
        if (status === 303) {
            request.method = "GET";
            request.headers.delete("Content-Length");
            delete request.body;
        }
        request.headers.delete("Authorization");
        const res = await next(request);
        return handleRedirect(next, res, maxRetries, currentRetries + 1);
    }
    return response;
}

// Copyright (c) Microsoft Corporation.
/**
 * @internal
 */
function getHeaderName() {
    return "User-Agent";
}
/**
 * @internal
 */
function setPlatformSpecificData(map) {
    map.set("Node", process.version);
    map.set("OS", `(${os__namespace.arch()}-${os__namespace.type()}-${os__namespace.release()})`);
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
const SDK_VERSION = "1.9.0";
const DEFAULT_RETRY_POLICY_COUNT = 3;

// Copyright (c) Microsoft Corporation.
function getUserAgentString(telemetryInfo) {
    const parts = [];
    for (const [key, value] of telemetryInfo) {
        const token = value ? `${key}/${value}` : key;
        parts.push(token);
    }
    return parts.join(" ");
}
/**
 * @internal
 */
function getUserAgentHeaderName() {
    return getHeaderName();
}
/**
 * @internal
 */
function getUserAgentValue(prefix) {
    const runtimeInfo = new Map();
    runtimeInfo.set("core-rest-pipeline", SDK_VERSION);
    setPlatformSpecificData(runtimeInfo);
    const defaultAgent = getUserAgentString(runtimeInfo);
    const userAgentValue = prefix ? `${prefix} ${defaultAgent}` : defaultAgent;
    return userAgentValue;
}

// Copyright (c) Microsoft Corporation.
const UserAgentHeaderName = getUserAgentHeaderName();
/**
 * The programmatic identifier of the userAgentPolicy.
 */
const userAgentPolicyName = "userAgentPolicy";
/**
 * A policy that sets the User-Agent header (or equivalent) to reflect
 * the library version.
 * @param options - Options to customize the user agent value.
 */
function userAgentPolicy(options = {}) {
    const userAgentValue = getUserAgentValue(options.userAgentPrefix);
    return {
        name: userAgentPolicyName,
        async sendRequest(request, next) {
            if (!request.headers.has(UserAgentHeaderName)) {
                request.headers.set(UserAgentHeaderName, userAgentValue);
            }
            return next(request);
        },
    };
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * The programmatic identifier of the decompressResponsePolicy.
 */
const decompressResponsePolicyName = "decompressResponsePolicy";
/**
 * A policy to enable response decompression according to Accept-Encoding header
 * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding
 */
function decompressResponsePolicy() {
    return {
        name: decompressResponsePolicyName,
        async sendRequest(request, next) {
            // HEAD requests have no body
            if (request.method !== "HEAD") {
                request.headers.set("Accept-Encoding", "gzip,deflate");
            }
            return next(request);
        },
    };
}

// Copyright (c) Microsoft Corporation.
const StandardAbortMessage = "The operation was aborted.";
/**
 * A wrapper for setTimeout that resolves a promise after delayInMs milliseconds.
 * @param delayInMs - The number of milliseconds to be delayed.
 * @param value - The value to be resolved with after a timeout of t milliseconds.
 * @param options - The options for delay - currently abort options
 *                  - abortSignal - The abortSignal associated with containing operation.
 *                  - abortErrorMsg - The abort error message associated with containing operation.
 * @returns Resolved promise
 */
function delay(delayInMs, value, options) {
    return new Promise((resolve, reject) => {
        let timer = undefined;
        let onAborted = undefined;
        const rejectOnAbort = () => {
            return reject(new abortController.AbortError((options === null || options === void 0 ? void 0 : options.abortErrorMsg) ? options === null || options === void 0 ? void 0 : options.abortErrorMsg : StandardAbortMessage));
        };
        const removeListeners = () => {
            if ((options === null || options === void 0 ? void 0 : options.abortSignal) && onAborted) {
                options.abortSignal.removeEventListener("abort", onAborted);
            }
        };
        onAborted = () => {
            if (timer) {
                clearTimeout(timer);
            }
            removeListeners();
            return rejectOnAbort();
        };
        if ((options === null || options === void 0 ? void 0 : options.abortSignal) && options.abortSignal.aborted) {
            return rejectOnAbort();
        }
        timer = setTimeout(() => {
            removeListeners();
            resolve(value);
        }, delayInMs);
        if (options === null || options === void 0 ? void 0 : options.abortSignal) {
            options.abortSignal.addEventListener("abort", onAborted);
        }
    });
}
/**
 * @internal
 * @returns the parsed value or undefined if the parsed value is invalid.
 */
function parseHeaderValueAsNumber(response, headerName) {
    const value = response.headers.get(headerName);
    if (!value)
        return;
    const valueAsNum = Number(value);
    if (Number.isNaN(valueAsNum))
        return;
    return valueAsNum;
}

// Copyright (c) Microsoft Corporation.
/**
 * The header that comes back from Azure services representing
 * the amount of time (minimum) to wait to retry (in seconds or timestamp after which we can retry).
 */
const RetryAfterHeader = "Retry-After";
/**
 * The headers that come back from Azure services representing
 * the amount of time (minimum) to wait to retry.
 *
 * "retry-after-ms", "x-ms-retry-after-ms" : milliseconds
 * "Retry-After" : seconds or timestamp
 */
const AllRetryAfterHeaders = ["retry-after-ms", "x-ms-retry-after-ms", RetryAfterHeader];
/**
 * A response is a throttling retry response if it has a throttling status code (429 or 503),
 * as long as one of the [ "Retry-After" or "retry-after-ms" or "x-ms-retry-after-ms" ] headers has a valid value.
 *
 * Returns the `retryAfterInMs` value if the response is a throttling retry response.
 * If not throttling retry response, returns `undefined`.
 *
 * @internal
 */
function getRetryAfterInMs(response) {
    if (!(response && [429, 503].includes(response.status)))
        return undefined;
    try {
        // Headers: "retry-after-ms", "x-ms-retry-after-ms", "Retry-After"
        for (const header of AllRetryAfterHeaders) {
            const retryAfterValue = parseHeaderValueAsNumber(response, header);
            if (retryAfterValue === 0 || retryAfterValue) {
                // "Retry-After" header ==> seconds
                // "retry-after-ms", "x-ms-retry-after-ms" headers ==> milli-seconds
                const multiplyingFactor = header === RetryAfterHeader ? 1000 : 1;
                return retryAfterValue * multiplyingFactor; // in milli-seconds
            }
        }
        // RetryAfterHeader ("Retry-After") has a special case where it might be formatted as a date instead of a number of seconds
        const retryAfterHeader = response.headers.get(RetryAfterHeader);
        if (!retryAfterHeader)
            return;
        const date = Date.parse(retryAfterHeader);
        const diff = date - Date.now();
        // negative diff would mean a date in the past, so retry asap with 0 milliseconds
        return Number.isFinite(diff) ? Math.max(0, diff) : undefined;
    }
    catch (e) {
        return undefined;
    }
}
/**
 * A response is a retry response if it has a throttling status code (429 or 503),
 * as long as one of the [ "Retry-After" or "retry-after-ms" or "x-ms-retry-after-ms" ] headers has a valid value.
 */
function isThrottlingRetryResponse(response) {
    return Number.isFinite(getRetryAfterInMs(response));
}
function throttlingRetryStrategy() {
    return {
        name: "throttlingRetryStrategy",
        retry({ response }) {
            const retryAfterInMs = getRetryAfterInMs(response);
            if (!Number.isFinite(retryAfterInMs)) {
                return { skipStrategy: true };
            }
            return {
                retryAfterInMs,
            };
        },
    };
}

// Copyright (c) Microsoft Corporation.
// intervals are in milliseconds
const DEFAULT_CLIENT_RETRY_INTERVAL = 1000;
const DEFAULT_CLIENT_MAX_RETRY_INTERVAL = 1000 * 64;
/**
 * A retry strategy that retries with an exponentially increasing delay in these two cases:
 * - When there are errors in the underlying transport layer (e.g. DNS lookup failures).
 * - Or otherwise if the outgoing request fails (408, greater or equal than 500, except for 501 and 505).
 */
function exponentialRetryStrategy(options = {}) {
    var _a, _b;
    const retryInterval = (_a = options.retryDelayInMs) !== null && _a !== void 0 ? _a : DEFAULT_CLIENT_RETRY_INTERVAL;
    const maxRetryInterval = (_b = options.maxRetryDelayInMs) !== null && _b !== void 0 ? _b : DEFAULT_CLIENT_MAX_RETRY_INTERVAL;
    let retryAfterInMs = retryInterval;
    return {
        name: "exponentialRetryStrategy",
        retry({ retryCount, response, responseError }) {
            const matchedSystemError = isSystemError(responseError);
            const ignoreSystemErrors = matchedSystemError && options.ignoreSystemErrors;
            const isExponential = isExponentialRetryResponse(response);
            const ignoreExponentialResponse = isExponential && options.ignoreHttpStatusCodes;
            const unknownResponse = response && (isThrottlingRetryResponse(response) || !isExponential);
            if (unknownResponse || ignoreExponentialResponse || ignoreSystemErrors) {
                return { skipStrategy: true };
            }
            if (responseError && !matchedSystemError && !isExponential) {
                return { errorToThrow: responseError };
            }
            // Exponentially increase the delay each time
            const exponentialDelay = retryAfterInMs * Math.pow(2, retryCount);
            // Don't let the delay exceed the maximum
            const clampedExponentialDelay = Math.min(maxRetryInterval, exponentialDelay);
            // Allow the final value to have some "jitter" (within 50% of the delay size) so
            // that retries across multiple clients don't occur simultaneously.
            retryAfterInMs =
                clampedExponentialDelay / 2 + coreUtil.getRandomIntegerInclusive(0, clampedExponentialDelay / 2);
            return { retryAfterInMs };
        },
    };
}
/**
 * A response is a retry response if it has status codes:
 * - 408, or
 * - Greater or equal than 500, except for 501 and 505.
 */
function isExponentialRetryResponse(response) {
    return Boolean(response &&
        response.status !== undefined &&
        (response.status >= 500 || response.status === 408) &&
        response.status !== 501 &&
        response.status !== 505);
}
/**
 * Determines whether an error from a pipeline response was triggered in the network layer.
 */
function isSystemError(err) {
    if (!err) {
        return false;
    }
    return (err.code === "ETIMEDOUT" ||
        err.code === "ESOCKETTIMEDOUT" ||
        err.code === "ECONNREFUSED" ||
        err.code === "ECONNRESET" ||
        err.code === "ENOENT");
}

// Copyright (c) Microsoft Corporation.
const retryPolicyLogger = logger$1.createClientLogger("core-rest-pipeline retryPolicy");
/**
 * The programmatic identifier of the retryPolicy.
 */
const retryPolicyName = "retryPolicy";
/**
 * retryPolicy is a generic policy to enable retrying requests when certain conditions are met
 */
function retryPolicy(strategies, options = { maxRetries: DEFAULT_RETRY_POLICY_COUNT }) {
    const logger = options.logger || retryPolicyLogger;
    return {
        name: retryPolicyName,
        async sendRequest(request, next) {
            var _a, _b;
            let response;
            let responseError;
            let retryCount = -1;
            // eslint-disable-next-line no-constant-condition
            retryRequest: while (true) {
                retryCount += 1;
                response = undefined;
                responseError = undefined;
                try {
                    logger.info(`Retry ${retryCount}: Attempting to send request`, request.requestId);
                    response = await next(request);
                    logger.info(`Retry ${retryCount}: Received a response from request`, request.requestId);
                }
                catch (e) {
                    logger.error(`Retry ${retryCount}: Received an error from request`, request.requestId);
                    // RestErrors are valid targets for the retry strategies.
                    // If none of the retry strategies can work with them, they will be thrown later in this policy.
                    // If the received error is not a RestError, it is immediately thrown.
                    responseError = e;
                    if (!e || responseError.name !== "RestError") {
                        throw e;
                    }
                    response = responseError.response;
                }
                if ((_a = request.abortSignal) === null || _a === void 0 ? void 0 : _a.aborted) {
                    logger.error(`Retry ${retryCount}: Request aborted.`);
                    const abortError = new abortController.AbortError();
                    throw abortError;
                }
                if (retryCount >= ((_b = options.maxRetries) !== null && _b !== void 0 ? _b : DEFAULT_RETRY_POLICY_COUNT)) {
                    logger.info(`Retry ${retryCount}: Maximum retries reached. Returning the last received response, or throwing the last received error.`);
                    if (responseError) {
                        throw responseError;
                    }
                    else if (response) {
                        return response;
                    }
                    else {
                        throw new Error("Maximum retries reached with no response or error to throw");
                    }
                }
                logger.info(`Retry ${retryCount}: Processing ${strategies.length} retry strategies.`);
                strategiesLoop: for (const strategy of strategies) {
                    const strategyLogger = strategy.logger || retryPolicyLogger;
                    strategyLogger.info(`Retry ${retryCount}: Processing retry strategy ${strategy.name}.`);
                    const modifiers = strategy.retry({
                        retryCount,
                        response,
                        responseError,
                    });
                    if (modifiers.skipStrategy) {
                        strategyLogger.info(`Retry ${retryCount}: Skipped.`);
                        continue strategiesLoop;
                    }
                    const { errorToThrow, retryAfterInMs, redirectTo } = modifiers;
                    if (errorToThrow) {
                        strategyLogger.error(`Retry ${retryCount}: Retry strategy ${strategy.name} throws error:`, errorToThrow);
                        throw errorToThrow;
                    }
                    if (retryAfterInMs || retryAfterInMs === 0) {
                        strategyLogger.info(`Retry ${retryCount}: Retry strategy ${strategy.name} retries after ${retryAfterInMs}`);
                        await delay(retryAfterInMs, undefined, { abortSignal: request.abortSignal });
                        continue retryRequest;
                    }
                    if (redirectTo) {
                        strategyLogger.info(`Retry ${retryCount}: Retry strategy ${strategy.name} redirects to ${redirectTo}`);
                        request.url = redirectTo;
                        continue retryRequest;
                    }
                }
                if (responseError) {
                    logger.info(`None of the retry strategies could work with the received error. Throwing it.`);
                    throw responseError;
                }
                if (response) {
                    logger.info(`None of the retry strategies could work with the received response. Returning it.`);
                    return response;
                }
                // If all the retries skip and there's no response,
                // we're still in the retry loop, so a new request will be sent
                // until `maxRetries` is reached.
            }
        },
    };
}

// Copyright (c) Microsoft Corporation.
/**
 * Name of the {@link defaultRetryPolicy}
 */
const defaultRetryPolicyName = "defaultRetryPolicy";
/**
 * A policy that retries according to three strategies:
 * - When the server sends a 429 response with a Retry-After header.
 * - When there are errors in the underlying transport layer (e.g. DNS lookup failures).
 * - Or otherwise if the outgoing request fails, it will retry with an exponentially increasing delay.
 */
function defaultRetryPolicy(options = {}) {
    var _a;
    return {
        name: defaultRetryPolicyName,
        sendRequest: retryPolicy([throttlingRetryStrategy(), exponentialRetryStrategy(options)], {
            maxRetries: (_a = options.maxRetries) !== null && _a !== void 0 ? _a : DEFAULT_RETRY_POLICY_COUNT,
        }).sendRequest,
    };
}

// Copyright (c) Microsoft Corporation.
/**
 * The programmatic identifier of the formDataPolicy.
 */
const formDataPolicyName = "formDataPolicy";
/**
 * A policy that encodes FormData on the request into the body.
 */
function formDataPolicy() {
    return {
        name: formDataPolicyName,
        async sendRequest(request, next) {
            if (request.formData) {
                const contentType = request.headers.get("Content-Type");
                if (contentType && contentType.indexOf("application/x-www-form-urlencoded") !== -1) {
                    request.body = wwwFormUrlEncode(request.formData);
                    request.formData = undefined;
                }
                else {
                    prepareFormData(request.formData, request);
                }
            }
            return next(request);
        },
    };
}
function wwwFormUrlEncode(formData) {
    const urlSearchParams = new URLSearchParams();
    for (const [key, value] of Object.entries(formData)) {
        if (Array.isArray(value)) {
            for (const subValue of value) {
                urlSearchParams.append(key, subValue.toString());
            }
        }
        else {
            urlSearchParams.append(key, value.toString());
        }
    }
    return urlSearchParams.toString();
}
async function prepareFormData(formData, request) {
    const requestForm = new FormData__default["default"]();
    for (const formKey of Object.keys(formData)) {
        const formValue = formData[formKey];
        if (Array.isArray(formValue)) {
            for (const subValue of formValue) {
                requestForm.append(formKey, subValue);
            }
        }
        else {
            requestForm.append(formKey, formValue);
        }
    }
    request.body = requestForm;
    request.formData = undefined;
    const contentType = request.headers.get("Content-Type");
    if (contentType && contentType.indexOf("multipart/form-data") !== -1) {
        request.headers.set("Content-Type", `multipart/form-data; boundary=${requestForm.getBoundary()}`);
    }
    try {
        const contentLength = await new Promise((resolve, reject) => {
            requestForm.getLength((err, length) => {
                if (err) {
                    reject(err);
                }
                else {
                    resolve(length);
                }
            });
        });
        request.headers.set("Content-Length", contentLength);
    }
    catch (e) {
        // ignore setting the length if this fails
    }
}

// Copyright (c) Microsoft Corporation.
const HTTPS_PROXY = "HTTPS_PROXY";
const HTTP_PROXY = "HTTP_PROXY";
const ALL_PROXY = "ALL_PROXY";
const NO_PROXY = "NO_PROXY";
/**
 * The programmatic identifier of the proxyPolicy.
 */
const proxyPolicyName = "proxyPolicy";
/**
 * Stores the patterns specified in NO_PROXY environment variable.
 * @internal
 */
const globalNoProxyList = [];
let noProxyListLoaded = false;
/** A cache of whether a host should bypass the proxy. */
const globalBypassedMap = new Map();
function getEnvironmentValue(name) {
    if (process.env[name]) {
        return process.env[name];
    }
    else if (process.env[name.toLowerCase()]) {
        return process.env[name.toLowerCase()];
    }
    return undefined;
}
function loadEnvironmentProxyValue() {
    if (!process) {
        return undefined;
    }
    const httpsProxy = getEnvironmentValue(HTTPS_PROXY);
    const allProxy = getEnvironmentValue(ALL_PROXY);
    const httpProxy = getEnvironmentValue(HTTP_PROXY);
    return httpsProxy || allProxy || httpProxy;
}
/**
 * Check whether the host of a given `uri` matches any pattern in the no proxy list.
 * If there's a match, any request sent to the same host shouldn't have the proxy settings set.
 * This implementation is a port of https://github.com/Azure/azure-sdk-for-net/blob/8cca811371159e527159c7eb65602477898683e2/sdk/core/Azure.Core/src/Pipeline/Internal/HttpEnvironmentProxy.cs#L210
 */
function isBypassed(uri, noProxyList, bypassedMap) {
    if (noProxyList.length === 0) {
        return false;
    }
    const host = new URL(uri).hostname;
    if (bypassedMap === null || bypassedMap === void 0 ? void 0 : bypassedMap.has(host)) {
        return bypassedMap.get(host);
    }
    let isBypassedFlag = false;
    for (const pattern of noProxyList) {
        if (pattern[0] === ".") {
            // This should match either domain it self or any subdomain or host
            // .foo.com will match foo.com it self or *.foo.com
            if (host.endsWith(pattern)) {
                isBypassedFlag = true;
            }
            else {
                if (host.length === pattern.length - 1 && host === pattern.slice(1)) {
                    isBypassedFlag = true;
                }
            }
        }
        else {
            if (host === pattern) {
                isBypassedFlag = true;
            }
        }
    }
    bypassedMap === null || bypassedMap === void 0 ? void 0 : bypassedMap.set(host, isBypassedFlag);
    return isBypassedFlag;
}
function loadNoProxy() {
    const noProxy = getEnvironmentValue(NO_PROXY);
    noProxyListLoaded = true;
    if (noProxy) {
        return noProxy
            .split(",")
            .map((item) => item.trim())
            .filter((item) => item.length);
    }
    return [];
}
/**
 * This method converts a proxy url into `ProxySettings` for use with ProxyPolicy.
 * If no argument is given, it attempts to parse a proxy URL from the environment
 * variables `HTTPS_PROXY` or `HTTP_PROXY`.
 * @param proxyUrl - The url of the proxy to use. May contain authentication information.
 */
function getDefaultProxySettings(proxyUrl) {
    if (!proxyUrl) {
        proxyUrl = loadEnvironmentProxyValue();
        if (!proxyUrl) {
            return undefined;
        }
    }
    const parsedUrl = new URL(proxyUrl);
    const schema = parsedUrl.protocol ? parsedUrl.protocol + "//" : "";
    return {
        host: schema + parsedUrl.hostname,
        port: Number.parseInt(parsedUrl.port || "80"),
        username: parsedUrl.username,
        password: parsedUrl.password,
    };
}
/**
 * @internal
 */
function getProxyAgentOptions(proxySettings, { headers, tlsSettings }) {
    let parsedProxyUrl;
    try {
        parsedProxyUrl = new URL(proxySettings.host);
    }
    catch (_error) {
        throw new Error(`Expecting a valid host string in proxy settings, but found "${proxySettings.host}".`);
    }
    if (tlsSettings) {
        logger.warning("TLS settings are not supported in combination with custom Proxy, certificates provided to the client will be ignored.");
    }
    const proxyAgentOptions = {
        hostname: parsedProxyUrl.hostname,
        port: proxySettings.port,
        protocol: parsedProxyUrl.protocol,
        headers: headers.toJSON(),
    };
    if (proxySettings.username && proxySettings.password) {
        proxyAgentOptions.auth = `${proxySettings.username}:${proxySettings.password}`;
    }
    else if (proxySettings.username) {
        proxyAgentOptions.auth = `${proxySettings.username}`;
    }
    return proxyAgentOptions;
}
function setProxyAgentOnRequest(request, cachedAgents) {
    // Custom Agent should take precedence so if one is present
    // we should skip to avoid overwriting it.
    if (request.agent) {
        return;
    }
    const url = new URL(request.url);
    const isInsecure = url.protocol !== "https:";
    const proxySettings = request.proxySettings;
    if (proxySettings) {
        if (isInsecure) {
            if (!cachedAgents.httpProxyAgent) {
                const proxyAgentOptions = getProxyAgentOptions(proxySettings, request);
                cachedAgents.httpProxyAgent = new httpProxyAgent.HttpProxyAgent(proxyAgentOptions);
            }
            request.agent = cachedAgents.httpProxyAgent;
        }
        else {
            if (!cachedAgents.httpsProxyAgent) {
                const proxyAgentOptions = getProxyAgentOptions(proxySettings, request);
                cachedAgents.httpsProxyAgent = new httpsProxyAgent.HttpsProxyAgent(proxyAgentOptions);
            }
            request.agent = cachedAgents.httpsProxyAgent;
        }
    }
}
/**
 * A policy that allows one to apply proxy settings to all requests.
 * If not passed static settings, they will be retrieved from the HTTPS_PROXY
 * or HTTP_PROXY environment variables.
 * @param proxySettings - ProxySettings to use on each request.
 * @param options - additional settings, for example, custom NO_PROXY patterns
 */
function proxyPolicy(proxySettings = getDefaultProxySettings(), options) {
    if (!noProxyListLoaded) {
        globalNoProxyList.push(...loadNoProxy());
    }
    const cachedAgents = {};
    return {
        name: proxyPolicyName,
        async sendRequest(request, next) {
            var _a;
            if (!request.proxySettings &&
                !isBypassed(request.url, (_a = options === null || options === void 0 ? void 0 : options.customNoProxyList) !== null && _a !== void 0 ? _a : globalNoProxyList, (options === null || options === void 0 ? void 0 : options.customNoProxyList) ? undefined : globalBypassedMap)) {
                request.proxySettings = proxySettings;
            }
            if (request.proxySettings) {
                setProxyAgentOnRequest(request, cachedAgents);
            }
            return next(request);
        },
    };
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * The programmatic identifier of the setClientRequestIdPolicy.
 */
const setClientRequestIdPolicyName = "setClientRequestIdPolicy";
/**
 * Each PipelineRequest gets a unique id upon creation.
 * This policy passes that unique id along via an HTTP header to enable better
 * telemetry and tracing.
 * @param requestIdHeaderName - The name of the header to pass the request ID to.
 */
function setClientRequestIdPolicy(requestIdHeaderName = "x-ms-client-request-id") {
    return {
        name: setClientRequestIdPolicyName,
        async sendRequest(request, next) {
            if (!request.headers.has(requestIdHeaderName)) {
                request.headers.set(requestIdHeaderName, request.requestId);
            }
            return next(request);
        },
    };
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Name of the TLS Policy
 */
const tlsPolicyName = "tlsPolicy";
/**
 * Gets a pipeline policy that adds the client certificate to the HttpClient agent for authentication.
 */
function tlsPolicy(tlsSettings) {
    return {
        name: tlsPolicyName,
        sendRequest: async (req, next) => {
            // Users may define a request tlsSettings, honor those over the client level one
            if (!req.tlsSettings) {
                req.tlsSettings = tlsSettings;
            }
            return next(req);
        },
    };
}

// Copyright (c) Microsoft Corporation.
const custom = util.inspect.custom;

// Copyright (c) Microsoft Corporation.
const errorSanitizer = new Sanitizer();
/**
 * A custom error type for failed pipeline requests.
 */
class RestError extends Error {
    constructor(message, options = {}) {
        super(message);
        this.name = "RestError";
        this.code = options.code;
        this.statusCode = options.statusCode;
        this.request = options.request;
        this.response = options.response;
        Object.setPrototypeOf(this, RestError.prototype);
    }
    /**
     * Logging method for util.inspect in Node
     */
    [custom]() {
        return `RestError: ${this.message} \n ${errorSanitizer.sanitize(this)}`;
    }
}
/**
 * Something went wrong when making the request.
 * This means the actual request failed for some reason,
 * such as a DNS issue or the connection being lost.
 */
RestError.REQUEST_SEND_ERROR = "REQUEST_SEND_ERROR";
/**
 * This means that parsing the response from the server failed.
 * It may have been malformed.
 */
RestError.PARSE_ERROR = "PARSE_ERROR";
/**
 * Typeguard for RestError
 * @param e - Something caught by a catch clause.
 */
function isRestError(e) {
    if (e instanceof RestError) {
        return true;
    }
    return coreUtil.isError(e) && e.name === "RestError";
}

// Copyright (c) Microsoft Corporation.
/**
 * The programmatic identifier of the tracingPolicy.
 */
const tracingPolicyName = "tracingPolicy";
/**
 * A simple policy to create OpenTelemetry Spans for each request made by the pipeline
 * that has SpanOptions with a parent.
 * Requests made without a parent Span will not be recorded.
 * @param options - Options to configure the telemetry logged by the tracing policy.
 */
function tracingPolicy(options = {}) {
    const userAgent = getUserAgentValue(options.userAgentPrefix);
    const tracingClient = tryCreateTracingClient();
    return {
        name: tracingPolicyName,
        async sendRequest(request, next) {
            var _a, _b;
            if (!tracingClient || !((_a = request.tracingOptions) === null || _a === void 0 ? void 0 : _a.tracingContext)) {
                return next(request);
            }
            const { span, tracingContext } = (_b = tryCreateSpan(tracingClient, request, userAgent)) !== null && _b !== void 0 ? _b : {};
            if (!span || !tracingContext) {
                return next(request);
            }
            try {
                const response = await tracingClient.withContext(tracingContext, next, request);
                tryProcessResponse(span, response);
                return response;
            }
            catch (err) {
                tryProcessError(span, err);
                throw err;
            }
        },
    };
}
function tryCreateTracingClient() {
    try {
        return coreTracing.createTracingClient({
            namespace: "",
            packageName: "@azure/core-rest-pipeline",
            packageVersion: SDK_VERSION,
        });
    }
    catch (e) {
        logger.warning(`Error when creating the TracingClient: ${coreUtil.getErrorMessage(e)}`);
        return undefined;
    }
}
function tryCreateSpan(tracingClient, request, userAgent) {
    try {
        // As per spec, we do not need to differentiate between HTTP and HTTPS in span name.
        const { span, updatedOptions } = tracingClient.startSpan(`HTTP ${request.method}`, { tracingOptions: request.tracingOptions }, {
            spanKind: "client",
            spanAttributes: {
                "http.method": request.method,
                "http.url": request.url,
                requestId: request.requestId,
            },
        });
        // If the span is not recording, don't do any more work.
        if (!span.isRecording()) {
            span.end();
            return undefined;
        }
        if (userAgent) {
            span.setAttribute("http.user_agent", userAgent);
        }
        // set headers
        const headers = tracingClient.createRequestHeaders(updatedOptions.tracingOptions.tracingContext);
        for (const [key, value] of Object.entries(headers)) {
            request.headers.set(key, value);
        }
        return { span, tracingContext: updatedOptions.tracingOptions.tracingContext };
    }
    catch (e) {
        logger.warning(`Skipping creating a tracing span due to an error: ${coreUtil.getErrorMessage(e)}`);
        return undefined;
    }
}
function tryProcessError(span, error) {
    try {
        span.setStatus({
            status: "error",
            error: coreUtil.isError(error) ? error : undefined,
        });
        if (isRestError(error) && error.statusCode) {
            span.setAttribute("http.status_code", error.statusCode);
        }
        span.end();
    }
    catch (e) {
        logger.warning(`Skipping tracing span processing due to an error: ${coreUtil.getErrorMessage(e)}`);
    }
}
function tryProcessResponse(span, response) {
    try {
        span.setAttribute("http.status_code", response.status);
        const serviceRequestId = response.headers.get("x-ms-request-id");
        if (serviceRequestId) {
            span.setAttribute("serviceRequestId", serviceRequestId);
        }
        span.setStatus({
            status: "success",
        });
        span.end();
    }
    catch (e) {
        logger.warning(`Skipping tracing span processing due to an error: ${coreUtil.getErrorMessage(e)}`);
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * Create a new pipeline with a default set of customizable policies.
 * @param options - Options to configure a custom pipeline.
 */
function createPipelineFromOptions(options) {
    const pipeline = createEmptyPipeline();
    if (coreUtil.isNode) {
        if (options.tlsOptions) {
            pipeline.addPolicy(tlsPolicy(options.tlsOptions));
        }
        pipeline.addPolicy(proxyPolicy(options.proxyOptions));
        pipeline.addPolicy(decompressResponsePolicy());
    }
    pipeline.addPolicy(formDataPolicy());
    pipeline.addPolicy(userAgentPolicy(options.userAgentOptions));
    pipeline.addPolicy(setClientRequestIdPolicy());
    pipeline.addPolicy(defaultRetryPolicy(options.retryOptions), { phase: "Retry" });
    pipeline.addPolicy(tracingPolicy(options.userAgentOptions), { afterPhase: "Retry" });
    if (coreUtil.isNode) {
        // Both XHR and Fetch expect to handle redirects automatically,
        // so only include this policy when we're in Node.
        pipeline.addPolicy(redirectPolicy(options.redirectOptions), { afterPhase: "Retry" });
    }
    pipeline.addPolicy(logPolicy(options.loggingOptions), { afterPhase: "Retry" });
    return pipeline;
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
function normalizeName(name) {
    return name.toLowerCase();
}
function* headerIterator(map) {
    for (const entry of map.values()) {
        yield [entry.name, entry.value];
    }
}
class HttpHeadersImpl {
    constructor(rawHeaders) {
        this._headersMap = new Map();
        if (rawHeaders) {
            for (const headerName of Object.keys(rawHeaders)) {
                this.set(headerName, rawHeaders[headerName]);
            }
        }
    }
    /**
     * Set a header in this collection with the provided name and value. The name is
     * case-insensitive.
     * @param name - The name of the header to set. This value is case-insensitive.
     * @param value - The value of the header to set.
     */
    set(name, value) {
        this._headersMap.set(normalizeName(name), { name, value: String(value) });
    }
    /**
     * Get the header value for the provided header name, or undefined if no header exists in this
     * collection with the provided name.
     * @param name - The name of the header. This value is case-insensitive.
     */
    get(name) {
        var _a;
        return (_a = this._headersMap.get(normalizeName(name))) === null || _a === void 0 ? void 0 : _a.value;
    }
    /**
     * Get whether or not this header collection contains a header entry for the provided header name.
     * @param name - The name of the header to set. This value is case-insensitive.
     */
    has(name) {
        return this._headersMap.has(normalizeName(name));
    }
    /**
     * Remove the header with the provided headerName.
     * @param name - The name of the header to remove.
     */
    delete(name) {
        this._headersMap.delete(normalizeName(name));
    }
    /**
     * Get the JSON object representation of this HTTP header collection.
     */
    toJSON(options = {}) {
        const result = {};
        if (options.preserveCase) {
            for (const entry of this._headersMap.values()) {
                result[entry.name] = entry.value;
            }
        }
        else {
            for (const [normalizedName, entry] of this._headersMap) {
                result[normalizedName] = entry.value;
            }
        }
        return result;
    }
    /**
     * Get the string representation of this HTTP header collection.
     */
    toString() {
        return JSON.stringify(this.toJSON({ preserveCase: true }));
    }
    /**
     * Iterate over tuples of header [name, value] pairs.
     */
    [Symbol.iterator]() {
        return headerIterator(this._headersMap);
    }
}
/**
 * Creates an object that satisfies the `HttpHeaders` interface.
 * @param rawHeaders - A simple object representing initial headers
 */
function createHttpHeaders(rawHeaders) {
    return new HttpHeadersImpl(rawHeaders);
}

// Copyright (c) Microsoft Corporation.
const DEFAULT_TLS_SETTINGS = {};
function isReadableStream(body) {
    return body && typeof body.pipe === "function";
}
function isStreamComplete(stream) {
    return new Promise((resolve) => {
        stream.on("close", resolve);
        stream.on("end", resolve);
        stream.on("error", resolve);
    });
}
function isArrayBuffer(body) {
    return body && typeof body.byteLength === "number";
}
class ReportTransform extends stream.Transform {
    constructor(progressCallback) {
        super();
        this.loadedBytes = 0;
        this.progressCallback = progressCallback;
    }
    // eslint-disable-next-line @typescript-eslint/ban-types
    _transform(chunk, _encoding, callback) {
        this.push(chunk);
        this.loadedBytes += chunk.length;
        try {
            this.progressCallback({ loadedBytes: this.loadedBytes });
            callback();
        }
        catch (e) {
            callback(e);
        }
    }
}
/**
 * A HttpClient implementation that uses Node's "https" module to send HTTPS requests.
 * @internal
 */
class NodeHttpClient {
    constructor() {
        this.cachedHttpsAgents = new WeakMap();
    }
    /**
     * Makes a request over an underlying transport layer and returns the response.
     * @param request - The request to be made.
     */
    async sendRequest(request) {
        var _a, _b, _c;
        const abortController$1 = new abortController.AbortController();
        let abortListener;
        if (request.abortSignal) {
            if (request.abortSignal.aborted) {
                throw new abortController.AbortError("The operation was aborted.");
            }
            abortListener = (event) => {
                if (event.type === "abort") {
                    abortController$1.abort();
                }
            };
            request.abortSignal.addEventListener("abort", abortListener);
        }
        if (request.timeout > 0) {
            setTimeout(() => {
                abortController$1.abort();
            }, request.timeout);
        }
        const acceptEncoding = request.headers.get("Accept-Encoding");
        const shouldDecompress = (acceptEncoding === null || acceptEncoding === void 0 ? void 0 : acceptEncoding.includes("gzip")) || (acceptEncoding === null || acceptEncoding === void 0 ? void 0 : acceptEncoding.includes("deflate"));
        let body = typeof request.body === "function" ? request.body() : request.body;
        if (body && !request.headers.has("Content-Length")) {
            const bodyLength = getBodyLength(body);
            if (bodyLength !== null) {
                request.headers.set("Content-Length", bodyLength);
            }
        }
        let responseStream;
        try {
            if (body && request.onUploadProgress) {
                const onUploadProgress = request.onUploadProgress;
                const uploadReportStream = new ReportTransform(onUploadProgress);
                uploadReportStream.on("error", (e) => {
                    logger.error("Error in upload progress", e);
                });
                if (isReadableStream(body)) {
                    body.pipe(uploadReportStream);
                }
                else {
                    uploadReportStream.end(body);
                }
                body = uploadReportStream;
            }
            const res = await this.makeRequest(request, abortController$1, body);
            const headers = getResponseHeaders(res);
            const status = (_a = res.statusCode) !== null && _a !== void 0 ? _a : 0;
            const response = {
                status,
                headers,
                request,
            };
            // Responses to HEAD must not have a body.
            // If they do return a body, that body must be ignored.
            if (request.method === "HEAD") {
                res.destroy();
                return response;
            }
            responseStream = shouldDecompress ? getDecodedResponseStream(res, headers) : res;
            const onDownloadProgress = request.onDownloadProgress;
            if (onDownloadProgress) {
                const downloadReportStream = new ReportTransform(onDownloadProgress);
                downloadReportStream.on("error", (e) => {
                    logger.error("Error in download progress", e);
                });
                responseStream.pipe(downloadReportStream);
                responseStream = downloadReportStream;
            }
            if (
            // Value of POSITIVE_INFINITY in streamResponseStatusCodes is considered as any status code
            ((_b = request.streamResponseStatusCodes) === null || _b === void 0 ? void 0 : _b.has(Number.POSITIVE_INFINITY)) ||
                ((_c = request.streamResponseStatusCodes) === null || _c === void 0 ? void 0 : _c.has(response.status))) {
                response.readableStreamBody = responseStream;
            }
            else {
                response.bodyAsText = await streamToText(responseStream);
            }
            return response;
        }
        finally {
            // clean up event listener
            if (request.abortSignal && abortListener) {
                let uploadStreamDone = Promise.resolve();
                if (isReadableStream(body)) {
                    uploadStreamDone = isStreamComplete(body);
                }
                let downloadStreamDone = Promise.resolve();
                if (isReadableStream(responseStream)) {
                    downloadStreamDone = isStreamComplete(responseStream);
                }
                Promise.all([uploadStreamDone, downloadStreamDone])
                    .then(() => {
                    var _a;
                    // eslint-disable-next-line promise/always-return
                    if (abortListener) {
                        (_a = request.abortSignal) === null || _a === void 0 ? void 0 : _a.removeEventListener("abort", abortListener);
                    }
                })
                    .catch((e) => {
                    logger.warning("Error when cleaning up abortListener on httpRequest", e);
                });
            }
        }
    }
    makeRequest(request, abortController$1, body) {
        var _a;
        const url = new URL(request.url);
        const isInsecure = url.protocol !== "https:";
        if (isInsecure && !request.allowInsecureConnection) {
            throw new Error(`Cannot connect to ${request.url} while allowInsecureConnection is false.`);
        }
        const agent = (_a = request.agent) !== null && _a !== void 0 ? _a : this.getOrCreateAgent(request, isInsecure);
        const options = {
            agent,
            hostname: url.hostname,
            path: `${url.pathname}${url.search}`,
            port: url.port,
            method: request.method,
            headers: request.headers.toJSON({ preserveCase: true }),
        };
        return new Promise((resolve, reject) => {
            const req = isInsecure ? http__namespace.request(options, resolve) : https__namespace.request(options, resolve);
            req.once("error", (err) => {
                var _a;
                reject(new RestError(err.message, { code: (_a = err.code) !== null && _a !== void 0 ? _a : RestError.REQUEST_SEND_ERROR, request }));
            });
            abortController$1.signal.addEventListener("abort", () => {
                const abortError = new abortController.AbortError("The operation was aborted.");
                req.destroy(abortError);
                reject(abortError);
            });
            if (body && isReadableStream(body)) {
                body.pipe(req);
            }
            else if (body) {
                if (typeof body === "string" || Buffer.isBuffer(body)) {
                    req.end(body);
                }
                else if (isArrayBuffer(body)) {
                    req.end(ArrayBuffer.isView(body) ? Buffer.from(body.buffer) : Buffer.from(body));
                }
                else {
                    logger.error("Unrecognized body type", body);
                    reject(new RestError("Unrecognized body type"));
                }
            }
            else {
                // streams don't like "undefined" being passed as data
                req.end();
            }
        });
    }
    getOrCreateAgent(request, isInsecure) {
        var _a;
        const disableKeepAlive = request.disableKeepAlive;
        // Handle Insecure requests first
        if (isInsecure) {
            if (disableKeepAlive) {
                // keepAlive:false is the default so we don't need a custom Agent
                return http__namespace.globalAgent;
            }
            if (!this.cachedHttpAgent) {
                // If there is no cached agent create a new one and cache it.
                this.cachedHttpAgent = new http__namespace.Agent({ keepAlive: true });
            }
            return this.cachedHttpAgent;
        }
        else {
            if (disableKeepAlive && !request.tlsSettings) {
                // When there are no tlsSettings and keepAlive is false
                // we don't need a custom agent
                return https__namespace.globalAgent;
            }
            // We use the tlsSettings to index cached clients
            const tlsSettings = (_a = request.tlsSettings) !== null && _a !== void 0 ? _a : DEFAULT_TLS_SETTINGS;
            // Get the cached agent or create a new one with the
            // provided values for keepAlive and tlsSettings
            let agent = this.cachedHttpsAgents.get(tlsSettings);
            if (agent && agent.options.keepAlive === !disableKeepAlive) {
                return agent;
            }
            logger.info("No cached TLS Agent exist, creating a new Agent");
            agent = new https__namespace.Agent(Object.assign({ 
                // keepAlive is true if disableKeepAlive is false.
                keepAlive: !disableKeepAlive }, tlsSettings));
            this.cachedHttpsAgents.set(tlsSettings, agent);
            return agent;
        }
    }
}
function getResponseHeaders(res) {
    const headers = createHttpHeaders();
    for (const header of Object.keys(res.headers)) {
        const value = res.headers[header];
        if (Array.isArray(value)) {
            if (value.length > 0) {
                headers.set(header, value[0]);
            }
        }
        else if (value) {
            headers.set(header, value);
        }
    }
    return headers;
}
function getDecodedResponseStream(stream, headers) {
    const contentEncoding = headers.get("Content-Encoding");
    if (contentEncoding === "gzip") {
        const unzip = zlib__namespace.createGunzip();
        stream.pipe(unzip);
        return unzip;
    }
    else if (contentEncoding === "deflate") {
        const inflate = zlib__namespace.createInflate();
        stream.pipe(inflate);
        return inflate;
    }
    return stream;
}
function streamToText(stream) {
    return new Promise((resolve, reject) => {
        const buffer = [];
        stream.on("data", (chunk) => {
            if (Buffer.isBuffer(chunk)) {
                buffer.push(chunk);
            }
            else {
                buffer.push(Buffer.from(chunk));
            }
        });
        stream.on("end", () => {
            resolve(Buffer.concat(buffer).toString("utf8"));
        });
        stream.on("error", (e) => {
            if (e && (e === null || e === void 0 ? void 0 : e.name) === "AbortError") {
                reject(e);
            }
            else {
                reject(new RestError(`Error reading response as text: ${e.message}`, {
                    code: RestError.PARSE_ERROR,
                }));
            }
        });
    });
}
/** @internal */
function getBodyLength(body) {
    if (!body) {
        return 0;
    }
    else if (Buffer.isBuffer(body)) {
        return body.length;
    }
    else if (isReadableStream(body)) {
        return null;
    }
    else if (isArrayBuffer(body)) {
        return body.byteLength;
    }
    else if (typeof body === "string") {
        return Buffer.from(body).length;
    }
    else {
        return null;
    }
}
/**
 * Create a new HttpClient instance for the NodeJS environment.
 * @internal
 */
function createNodeHttpClient() {
    return new NodeHttpClient();
}

// Copyright (c) Microsoft Corporation.
/**
 * Create the correct HttpClient for the current environment.
 */
function createDefaultHttpClient() {
    return createNodeHttpClient();
}

// Copyright (c) Microsoft Corporation.
/**
 * Generated Universally Unique Identifier
 *
 * @returns RFC4122 v4 UUID.
 * @internal
 */
function generateUuid() {
    return uuid.v4();
}

// Copyright (c) Microsoft Corporation.
class PipelineRequestImpl {
    constructor(options) {
        var _a, _b, _c, _d, _e, _f, _g;
        this.url = options.url;
        this.body = options.body;
        this.headers = (_a = options.headers) !== null && _a !== void 0 ? _a : createHttpHeaders();
        this.method = (_b = options.method) !== null && _b !== void 0 ? _b : "GET";
        this.timeout = (_c = options.timeout) !== null && _c !== void 0 ? _c : 0;
        this.formData = options.formData;
        this.disableKeepAlive = (_d = options.disableKeepAlive) !== null && _d !== void 0 ? _d : false;
        this.proxySettings = options.proxySettings;
        this.streamResponseStatusCodes = options.streamResponseStatusCodes;
        this.withCredentials = (_e = options.withCredentials) !== null && _e !== void 0 ? _e : false;
        this.abortSignal = options.abortSignal;
        this.tracingOptions = options.tracingOptions;
        this.onUploadProgress = options.onUploadProgress;
        this.onDownloadProgress = options.onDownloadProgress;
        this.requestId = options.requestId || generateUuid();
        this.allowInsecureConnection = (_f = options.allowInsecureConnection) !== null && _f !== void 0 ? _f : false;
        this.enableBrowserStreams = (_g = options.enableBrowserStreams) !== null && _g !== void 0 ? _g : false;
    }
}
/**
 * Creates a new pipeline request with the given options.
 * This method is to allow for the easy setting of default values and not required.
 * @param options - The options to create the request with.
 */
function createPipelineRequest(options) {
    return new PipelineRequestImpl(options);
}

// Copyright (c) Microsoft Corporation.
/**
 * The programmatic identifier of the exponentialRetryPolicy.
 */
const exponentialRetryPolicyName = "exponentialRetryPolicy";
/**
 * A policy that attempts to retry requests while introducing an exponentially increasing delay.
 * @param options - Options that configure retry logic.
 */
function exponentialRetryPolicy(options = {}) {
    var _a;
    return retryPolicy([
        exponentialRetryStrategy(Object.assign(Object.assign({}, options), { ignoreSystemErrors: true })),
    ], {
        maxRetries: (_a = options.maxRetries) !== null && _a !== void 0 ? _a : DEFAULT_RETRY_POLICY_COUNT,
    });
}

// Copyright (c) Microsoft Corporation.
/**
 * Name of the {@link systemErrorRetryPolicy}
 */
const systemErrorRetryPolicyName = "systemErrorRetryPolicy";
/**
 * A retry policy that specifically seeks to handle errors in the
 * underlying transport layer (e.g. DNS lookup failures) rather than
 * retryable error codes from the server itself.
 * @param options - Options that customize the policy.
 */
function systemErrorRetryPolicy(options = {}) {
    var _a;
    return {
        name: systemErrorRetryPolicyName,
        sendRequest: retryPolicy([
            exponentialRetryStrategy(Object.assign(Object.assign({}, options), { ignoreHttpStatusCodes: true })),
        ], {
            maxRetries: (_a = options.maxRetries) !== null && _a !== void 0 ? _a : DEFAULT_RETRY_POLICY_COUNT,
        }).sendRequest,
    };
}

// Copyright (c) Microsoft Corporation.
/**
 * Name of the {@link throttlingRetryPolicy}
 */
const throttlingRetryPolicyName = "throttlingRetryPolicy";
/**
 * A policy that retries when the server sends a 429 response with a Retry-After header.
 *
 * To learn more, please refer to
 * https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-manager-request-limits,
 * https://docs.microsoft.com/en-us/azure/azure-subscription-service-limits and
 * https://docs.microsoft.com/en-us/azure/virtual-machines/troubleshooting/troubleshooting-throttling-errors
 *
 * @param options - Options that configure retry logic.
 */
function throttlingRetryPolicy(options = {}) {
    var _a;
    return {
        name: throttlingRetryPolicyName,
        sendRequest: retryPolicy([throttlingRetryStrategy()], {
            maxRetries: (_a = options.maxRetries) !== null && _a !== void 0 ? _a : DEFAULT_RETRY_POLICY_COUNT,
        }).sendRequest,
    };
}

// Copyright (c) Microsoft Corporation.
// Default options for the cycler if none are provided
const DEFAULT_CYCLER_OPTIONS = {
    forcedRefreshWindowInMs: 1000,
    retryIntervalInMs: 3000,
    refreshWindowInMs: 1000 * 60 * 2, // Start refreshing 2m before expiry
};
/**
 * Converts an an unreliable access token getter (which may resolve with null)
 * into an AccessTokenGetter by retrying the unreliable getter in a regular
 * interval.
 *
 * @param getAccessToken - A function that produces a promise of an access token that may fail by returning null.
 * @param retryIntervalInMs - The time (in milliseconds) to wait between retry attempts.
 * @param refreshTimeout - The timestamp after which the refresh attempt will fail, throwing an exception.
 * @returns - A promise that, if it resolves, will resolve with an access token.
 */
async function beginRefresh(getAccessToken, retryIntervalInMs, refreshTimeout) {
    // This wrapper handles exceptions gracefully as long as we haven't exceeded
    // the timeout.
    async function tryGetAccessToken() {
        if (Date.now() < refreshTimeout) {
            try {
                return await getAccessToken();
            }
            catch (_a) {
                return null;
            }
        }
        else {
            const finalToken = await getAccessToken();
            // Timeout is up, so throw if it's still null
            if (finalToken === null) {
                throw new Error("Failed to refresh access token.");
            }
            return finalToken;
        }
    }
    let token = await tryGetAccessToken();
    while (token === null) {
        await delay(retryIntervalInMs);
        token = await tryGetAccessToken();
    }
    return token;
}
/**
 * Creates a token cycler from a credential, scopes, and optional settings.
 *
 * A token cycler represents a way to reliably retrieve a valid access token
 * from a TokenCredential. It will handle initializing the token, refreshing it
 * when it nears expiration, and synchronizes refresh attempts to avoid
 * concurrency hazards.
 *
 * @param credential - the underlying TokenCredential that provides the access
 * token
 * @param tokenCyclerOptions - optionally override default settings for the cycler
 *
 * @returns - a function that reliably produces a valid access token
 */
function createTokenCycler(credential, tokenCyclerOptions) {
    let refreshWorker = null;
    let token = null;
    let tenantId;
    const options = Object.assign(Object.assign({}, DEFAULT_CYCLER_OPTIONS), tokenCyclerOptions);
    /**
     * This little holder defines several predicates that we use to construct
     * the rules of refreshing the token.
     */
    const cycler = {
        /**
         * Produces true if a refresh job is currently in progress.
         */
        get isRefreshing() {
            return refreshWorker !== null;
        },
        /**
         * Produces true if the cycler SHOULD refresh (we are within the refresh
         * window and not already refreshing)
         */
        get shouldRefresh() {
            var _a;
            return (!cycler.isRefreshing &&
                ((_a = token === null || token === void 0 ? void 0 : token.expiresOnTimestamp) !== null && _a !== void 0 ? _a : 0) - options.refreshWindowInMs < Date.now());
        },
        /**
         * Produces true if the cycler MUST refresh (null or nearly-expired
         * token).
         */
        get mustRefresh() {
            return (token === null || token.expiresOnTimestamp - options.forcedRefreshWindowInMs < Date.now());
        },
    };
    /**
     * Starts a refresh job or returns the existing job if one is already
     * running.
     */
    function refresh(scopes, getTokenOptions) {
        var _a;
        if (!cycler.isRefreshing) {
            // We bind `scopes` here to avoid passing it around a lot
            const tryGetAccessToken = () => credential.getToken(scopes, getTokenOptions);
            // Take advantage of promise chaining to insert an assignment to `token`
            // before the refresh can be considered done.
            refreshWorker = beginRefresh(tryGetAccessToken, options.retryIntervalInMs, 
            // If we don't have a token, then we should timeout immediately
            (_a = token === null || token === void 0 ? void 0 : token.expiresOnTimestamp) !== null && _a !== void 0 ? _a : Date.now())
                .then((_token) => {
                refreshWorker = null;
                token = _token;
                tenantId = getTokenOptions.tenantId;
                return token;
            })
                .catch((reason) => {
                // We also should reset the refresher if we enter a failed state.  All
                // existing awaiters will throw, but subsequent requests will start a
                // new retry chain.
                refreshWorker = null;
                token = null;
                tenantId = undefined;
                throw reason;
            });
        }
        return refreshWorker;
    }
    return async (scopes, tokenOptions) => {
        //
        // Simple rules:
        // - If we MUST refresh, then return the refresh task, blocking
        //   the pipeline until a token is available.
        // - If we SHOULD refresh, then run refresh but don't return it
        //   (we can still use the cached token).
        // - Return the token, since it's fine if we didn't return in
        //   step 1.
        //
        // IF the tenantId passed in token options is different to the one we have, we need to
        // refresh the token with the new tenantId.
        const mustRefresh = tenantId !== tokenOptions.tenantId || cycler.mustRefresh;
        if (mustRefresh)
            return refresh(scopes, tokenOptions);
        if (cycler.shouldRefresh) {
            refresh(scopes, tokenOptions);
        }
        return token;
    };
}

// Copyright (c) Microsoft Corporation.
/**
 * The programmatic identifier of the bearerTokenAuthenticationPolicy.
 */
const bearerTokenAuthenticationPolicyName = "bearerTokenAuthenticationPolicy";
/**
 * Default authorize request handler
 */
async function defaultAuthorizeRequest(options) {
    const { scopes, getAccessToken, request } = options;
    const getTokenOptions = {
        abortSignal: request.abortSignal,
        tracingOptions: request.tracingOptions,
    };
    const accessToken = await getAccessToken(scopes, getTokenOptions);
    if (accessToken) {
        options.request.headers.set("Authorization", `Bearer ${accessToken.token}`);
    }
}
/**
 * We will retrieve the challenge only if the response status code was 401,
 * and if the response contained the header "WWW-Authenticate" with a non-empty value.
 */
function getChallenge(response) {
    const challenge = response.headers.get("WWW-Authenticate");
    if (response.status === 401 && challenge) {
        return challenge;
    }
    return;
}
/**
 * A policy that can request a token from a TokenCredential implementation and
 * then apply it to the Authorization header of a request as a Bearer token.
 */
function bearerTokenAuthenticationPolicy(options) {
    var _a;
    const { credential, scopes, challengeCallbacks, logger } = options;
    const callbacks = Object.assign({ authorizeRequest: (_a = challengeCallbacks === null || challengeCallbacks === void 0 ? void 0 : challengeCallbacks.authorizeRequest) !== null && _a !== void 0 ? _a : defaultAuthorizeRequest, authorizeRequestOnChallenge: challengeCallbacks === null || challengeCallbacks === void 0 ? void 0 : challengeCallbacks.authorizeRequestOnChallenge }, challengeCallbacks);
    // This function encapsulates the entire process of reliably retrieving the token
    // The options are left out of the public API until there's demand to configure this.
    // Remember to extend `BearerTokenAuthenticationPolicyOptions` with `TokenCyclerOptions`
    // in order to pass through the `options` object.
    const getAccessToken = credential
        ? createTokenCycler(credential /* , options */)
        : () => Promise.resolve(null);
    return {
        name: bearerTokenAuthenticationPolicyName,
        /**
         * If there's no challenge parameter:
         * - It will try to retrieve the token using the cache, or the credential's getToken.
         * - Then it will try the next policy with or without the retrieved token.
         *
         * It uses the challenge parameters to:
         * - Skip a first attempt to get the token from the credential if there's no cached token,
         *   since it expects the token to be retrievable only after the challenge.
         * - Prepare the outgoing request if the `prepareRequest` method has been provided.
         * - Send an initial request to receive the challenge if it fails.
         * - Process a challenge if the response contains it.
         * - Retrieve a token with the challenge information, then re-send the request.
         */
        async sendRequest(request, next) {
            if (!request.url.toLowerCase().startsWith("https://")) {
                throw new Error("Bearer token authentication is not permitted for non-TLS protected (non-https) URLs.");
            }
            await callbacks.authorizeRequest({
                scopes: Array.isArray(scopes) ? scopes : [scopes],
                request,
                getAccessToken,
                logger,
            });
            let response;
            let error;
            try {
                response = await next(request);
            }
            catch (err) {
                error = err;
                response = err.response;
            }
            if (callbacks.authorizeRequestOnChallenge &&
                (response === null || response === void 0 ? void 0 : response.status) === 401 &&
                getChallenge(response)) {
                // processes challenge
                const shouldSendRequest = await callbacks.authorizeRequestOnChallenge({
                    scopes: Array.isArray(scopes) ? scopes : [scopes],
                    request,
                    response,
                    getAccessToken,
                    logger,
                });
                if (shouldSendRequest) {
                    return next(request);
                }
            }
            if (error) {
                throw error;
            }
            else {
                return response;
            }
        },
    };
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * The programmatic identifier of the ndJsonPolicy.
 */
const ndJsonPolicyName = "ndJsonPolicy";
/**
 * ndJsonPolicy is a policy used to control keep alive settings for every request.
 */
function ndJsonPolicy() {
    return {
        name: ndJsonPolicyName,
        async sendRequest(request, next) {
            // There currently isn't a good way to bypass the serializer
            if (typeof request.body === "string" && request.body.startsWith("[")) {
                const body = JSON.parse(request.body);
                if (Array.isArray(body)) {
                    request.body = body.map((item) => JSON.stringify(item) + "\n").join("");
                }
            }
            return next(request);
        },
    };
}

exports.RestError = RestError;
exports.bearerTokenAuthenticationPolicy = bearerTokenAuthenticationPolicy;
exports.bearerTokenAuthenticationPolicyName = bearerTokenAuthenticationPolicyName;
exports.createDefaultHttpClient = createDefaultHttpClient;
exports.createEmptyPipeline = createEmptyPipeline;
exports.createHttpHeaders = createHttpHeaders;
exports.createPipelineFromOptions = createPipelineFromOptions;
exports.createPipelineRequest = createPipelineRequest;
exports.decompressResponsePolicy = decompressResponsePolicy;
exports.decompressResponsePolicyName = decompressResponsePolicyName;
exports.defaultRetryPolicy = defaultRetryPolicy;
exports.exponentialRetryPolicy = exponentialRetryPolicy;
exports.exponentialRetryPolicyName = exponentialRetryPolicyName;
exports.formDataPolicy = formDataPolicy;
exports.formDataPolicyName = formDataPolicyName;
exports.getDefaultProxySettings = getDefaultProxySettings;
exports.isRestError = isRestError;
exports.logPolicy = logPolicy;
exports.logPolicyName = logPolicyName;
exports.ndJsonPolicy = ndJsonPolicy;
exports.ndJsonPolicyName = ndJsonPolicyName;
exports.proxyPolicy = proxyPolicy;
exports.proxyPolicyName = proxyPolicyName;
exports.redirectPolicy = redirectPolicy;
exports.redirectPolicyName = redirectPolicyName;
exports.retryPolicy = retryPolicy;
exports.setClientRequestIdPolicy = setClientRequestIdPolicy;
exports.setClientRequestIdPolicyName = setClientRequestIdPolicyName;
exports.systemErrorRetryPolicy = systemErrorRetryPolicy;
exports.systemErrorRetryPolicyName = systemErrorRetryPolicyName;
exports.throttlingRetryPolicy = throttlingRetryPolicy;
exports.throttlingRetryPolicyName = throttlingRetryPolicyName;
exports.tlsPolicy = tlsPolicy;
exports.tlsPolicyName = tlsPolicyName;
exports.tracingPolicy = tracingPolicy;
exports.tracingPolicyName = tracingPolicyName;
exports.userAgentPolicy = userAgentPolicy;
exports.userAgentPolicyName = userAgentPolicyName;
//# sourceMappingURL=index.js.map
The MIT License (MIT)

Copyright (c) 2020 Microsoft

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": "@azure/core-tracing",
  "version": "1.0.1",
  "description": "Provides low-level interfaces and helper methods for tracing in Azure SDK",
  "sdk-type": "client",
  "main": "dist/index.js",
  "module": "dist-esm/src/index.js",
  "browser": {},
  "react-native": {
    "./dist/index.js": "./dist-esm/src/index.js"
  },
  "types": "types/core-tracing.d.ts",
  "files": [
    "dist/",
    "dist-esm/src/",
    "types/core-tracing.d.ts",
    "README.md",
    "LICENSE"
  ],
  "repository": "github:Azure/azure-sdk-for-js",
  "author": "Microsoft Corporation",
  "license": "MIT",
  "engines": {
    "node": ">=12.0.0"
  },
  "homepage": "https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/core/core-tracing/README.md",
  "sideEffects": false,
  "dependencies": {
    "tslib": "^2.2.0"
  },
  "devDependencies": {
    "@azure/core-auth": "^1.3.0",
    "@azure/dev-tool": "^1.0.0",
    "@azure/eslint-plugin-azure-sdk": "^3.0.0",
    "@microsoft/api-extractor": "7.18.11",
    "@types/chai": "^4.1.6",
    "@types/mocha": "^7.0.2",
    "@types/node": "^12.0.0",
    "chai": "^4.2.0",
    "cross-env": "^7.0.2",
    "eslint": "^7.15.0",
    "inherits": "^2.0.3",
    "karma": "^6.2.0",
    "karma-chrome-launcher": "^3.0.0",
    "karma-coverage": "^2.0.0",
    "karma-edge-launcher": "^0.4.2",
    "karma-env-preprocessor": "^0.1.1",
    "karma-firefox-launcher": "^1.1.0",
    "karma-ie-launcher": "^1.0.0",
    "karma-junit-reporter": "^2.0.1",
    "karma-mocha": "^2.0.1",
    "karma-mocha-reporter": "^2.2.5",
    "karma-sourcemap-loader": "^0.3.8",
    "mocha": "^7.1.1",
    "mocha-junit-reporter": "^2.0.0",
    "prettier": "^2.5.1",
    "rimraf": "^3.0.0",
    "typescript": "~4.6.0",
    "util": "^0.12.1",
    "sinon": "^9.0.2",
    "@types/sinon": "^9.0.4"
  },
  "//sampleConfiguration": {
    "disableDocsMs": true,
    "productName": "Azure SDK Core",
    "productSlugs": [
      "azure"
    ]
  }
}// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export { useInstrumenter } from "./instrumenter";
export { createTracingClient } from "./tracingClient";
//# sourceMappingURL=index.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createTracingContext } from "./tracingContext";
export function createDefaultTracingSpan() {
    return {
        end: () => {
            // noop
        },
        isRecording: () => false,
        recordException: () => {
            // noop
        },
        setAttribute: () => {
            // noop
        },
        setStatus: () => {
            // noop
        },
    };
}
export function createDefaultInstrumenter() {
    return {
        createRequestHeaders: () => {
            return {};
        },
        parseTraceparentHeader: () => {
            return undefined;
        },
        startSpan: (_name, spanOptions) => {
            return {
                span: createDefaultTracingSpan(),
                tracingContext: createTracingContext({ parentContext: spanOptions.tracingContext }),
            };
        },
        withContext(_context, callback, ...callbackArgs) {
            return callback(...callbackArgs);
        },
    };
}
/** @internal */
let instrumenterImplementation;
/**
 * Extends the Azure SDK with support for a given instrumenter implementation.
 *
 * @param instrumenter - The instrumenter implementation to use.
 */
export function useInstrumenter(instrumenter) {
    instrumenterImplementation = instrumenter;
}
/**
 * Gets the currently set instrumenter, a No-Op instrumenter by default.
 *
 * @returns The currently set instrumenter
 */
export function getInstrumenter() {
    if (!instrumenterImplementation) {
        instrumenterImplementation = createDefaultInstrumenter();
    }
    return instrumenterImplementation;
}
//# sourceMappingURL=instrumenter.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=interfaces.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { getInstrumenter } from "./instrumenter";
import { knownContextKeys } from "./tracingContext";
/**
 * Creates a new tracing client.
 *
 * @param options - Options used to configure the tracing client.
 * @returns - An instance of {@link TracingClient}.
 */
export function createTracingClient(options) {
    const { namespace, packageName, packageVersion } = options;
    function startSpan(name, operationOptions, spanOptions) {
        var _a;
        const startSpanResult = getInstrumenter().startSpan(name, Object.assign(Object.assign({}, spanOptions), { packageName: packageName, packageVersion: packageVersion, tracingContext: (_a = operationOptions === null || operationOptions === void 0 ? void 0 : operationOptions.tracingOptions) === null || _a === void 0 ? void 0 : _a.tracingContext }));
        let tracingContext = startSpanResult.tracingContext;
        const span = startSpanResult.span;
        if (!tracingContext.getValue(knownContextKeys.namespace)) {
            tracingContext = tracingContext.setValue(knownContextKeys.namespace, namespace);
        }
        span.setAttribute("az.namespace", tracingContext.getValue(knownContextKeys.namespace));
        const updatedOptions = Object.assign({}, operationOptions, {
            tracingOptions: Object.assign(Object.assign({}, operationOptions === null || operationOptions === void 0 ? void 0 : operationOptions.tracingOptions), { tracingContext }),
        });
        return {
            span,
            updatedOptions,
        };
    }
    async function withSpan(name, operationOptions, callback, spanOptions) {
        const { span, updatedOptions } = startSpan(name, operationOptions, spanOptions);
        try {
            const result = await withContext(updatedOptions.tracingOptions.tracingContext, () => Promise.resolve(callback(updatedOptions, span)));
            span.setStatus({ status: "success" });
            return result;
        }
        catch (err) {
            span.setStatus({ status: "error", error: err });
            throw err;
        }
        finally {
            span.end();
        }
    }
    function withContext(context, callback, ...callbackArgs) {
        return getInstrumenter().withContext(context, callback, ...callbackArgs);
    }
    /**
     * Parses a traceparent header value into a span identifier.
     *
     * @param traceparentHeader - The traceparent header to parse.
     * @returns An implementation-specific identifier for the span.
     */
    function parseTraceparentHeader(traceparentHeader) {
        return getInstrumenter().parseTraceparentHeader(traceparentHeader);
    }
    /**
     * Creates a set of request headers to propagate tracing information to a backend.
     *
     * @param tracingContext - The context containing the span to serialize.
     * @returns The set of headers to add to a request.
     */
    function createRequestHeaders(tracingContext) {
        return getInstrumenter().createRequestHeaders(tracingContext);
    }
    return {
        startSpan,
        withSpan,
        withContext,
        parseTraceparentHeader,
        createRequestHeaders,
    };
}
//# sourceMappingURL=tracingClient.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/** @internal */
export const knownContextKeys = {
    span: Symbol.for("@azure/core-tracing span"),
    namespace: Symbol.for("@azure/core-tracing namespace"),
};
/**
 * Creates a new {@link TracingContext} with the given options.
 * @param options - A set of known keys that may be set on the context.
 * @returns A new {@link TracingContext} with the given options.
 *
 * @internal
 */
export function createTracingContext(options = {}) {
    let context = new TracingContextImpl(options.parentContext);
    if (options.span) {
        context = context.setValue(knownContextKeys.span, options.span);
    }
    if (options.namespace) {
        context = context.setValue(knownContextKeys.namespace, options.namespace);
    }
    return context;
}
/** @internal */
export class TracingContextImpl {
    constructor(initialContext) {
        this._contextMap =
            initialContext instanceof TracingContextImpl
                ? new Map(initialContext._contextMap)
                : new Map();
    }
    setValue(key, value) {
        const newContext = new TracingContextImpl(this);
        newContext._contextMap.set(key, value);
        return newContext;
    }
    getValue(key) {
        return this._contextMap.get(key);
    }
    deleteValue(key) {
        const newContext = new TracingContextImpl(this);
        newContext._contextMap.delete(key);
        return newContext;
    }
}
//# sourceMappingURL=tracingContext.js.map'use strict';

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

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/** @internal */
const knownContextKeys = {
    span: Symbol.for("@azure/core-tracing span"),
    namespace: Symbol.for("@azure/core-tracing namespace"),
};
/**
 * Creates a new {@link TracingContext} with the given options.
 * @param options - A set of known keys that may be set on the context.
 * @returns A new {@link TracingContext} with the given options.
 *
 * @internal
 */
function createTracingContext(options = {}) {
    let context = new TracingContextImpl(options.parentContext);
    if (options.span) {
        context = context.setValue(knownContextKeys.span, options.span);
    }
    if (options.namespace) {
        context = context.setValue(knownContextKeys.namespace, options.namespace);
    }
    return context;
}
/** @internal */
class TracingContextImpl {
    constructor(initialContext) {
        this._contextMap =
            initialContext instanceof TracingContextImpl
                ? new Map(initialContext._contextMap)
                : new Map();
    }
    setValue(key, value) {
        const newContext = new TracingContextImpl(this);
        newContext._contextMap.set(key, value);
        return newContext;
    }
    getValue(key) {
        return this._contextMap.get(key);
    }
    deleteValue(key) {
        const newContext = new TracingContextImpl(this);
        newContext._contextMap.delete(key);
        return newContext;
    }
}

// Copyright (c) Microsoft Corporation.
function createDefaultTracingSpan() {
    return {
        end: () => {
            // noop
        },
        isRecording: () => false,
        recordException: () => {
            // noop
        },
        setAttribute: () => {
            // noop
        },
        setStatus: () => {
            // noop
        },
    };
}
function createDefaultInstrumenter() {
    return {
        createRequestHeaders: () => {
            return {};
        },
        parseTraceparentHeader: () => {
            return undefined;
        },
        startSpan: (_name, spanOptions) => {
            return {
                span: createDefaultTracingSpan(),
                tracingContext: createTracingContext({ parentContext: spanOptions.tracingContext }),
            };
        },
        withContext(_context, callback, ...callbackArgs) {
            return callback(...callbackArgs);
        },
    };
}
/** @internal */
let instrumenterImplementation;
/**
 * Extends the Azure SDK with support for a given instrumenter implementation.
 *
 * @param instrumenter - The instrumenter implementation to use.
 */
function useInstrumenter(instrumenter) {
    instrumenterImplementation = instrumenter;
}
/**
 * Gets the currently set instrumenter, a No-Op instrumenter by default.
 *
 * @returns The currently set instrumenter
 */
function getInstrumenter() {
    if (!instrumenterImplementation) {
        instrumenterImplementation = createDefaultInstrumenter();
    }
    return instrumenterImplementation;
}

// Copyright (c) Microsoft Corporation.
/**
 * Creates a new tracing client.
 *
 * @param options - Options used to configure the tracing client.
 * @returns - An instance of {@link TracingClient}.
 */
function createTracingClient(options) {
    const { namespace, packageName, packageVersion } = options;
    function startSpan(name, operationOptions, spanOptions) {
        var _a;
        const startSpanResult = getInstrumenter().startSpan(name, Object.assign(Object.assign({}, spanOptions), { packageName: packageName, packageVersion: packageVersion, tracingContext: (_a = operationOptions === null || operationOptions === void 0 ? void 0 : operationOptions.tracingOptions) === null || _a === void 0 ? void 0 : _a.tracingContext }));
        let tracingContext = startSpanResult.tracingContext;
        const span = startSpanResult.span;
        if (!tracingContext.getValue(knownContextKeys.namespace)) {
            tracingContext = tracingContext.setValue(knownContextKeys.namespace, namespace);
        }
        span.setAttribute("az.namespace", tracingContext.getValue(knownContextKeys.namespace));
        const updatedOptions = Object.assign({}, operationOptions, {
            tracingOptions: Object.assign(Object.assign({}, operationOptions === null || operationOptions === void 0 ? void 0 : operationOptions.tracingOptions), { tracingContext }),
        });
        return {
            span,
            updatedOptions,
        };
    }
    async function withSpan(name, operationOptions, callback, spanOptions) {
        const { span, updatedOptions } = startSpan(name, operationOptions, spanOptions);
        try {
            const result = await withContext(updatedOptions.tracingOptions.tracingContext, () => Promise.resolve(callback(updatedOptions, span)));
            span.setStatus({ status: "success" });
            return result;
        }
        catch (err) {
            span.setStatus({ status: "error", error: err });
            throw err;
        }
        finally {
            span.end();
        }
    }
    function withContext(context, callback, ...callbackArgs) {
        return getInstrumenter().withContext(context, callback, ...callbackArgs);
    }
    /**
     * Parses a traceparent header value into a span identifier.
     *
     * @param traceparentHeader - The traceparent header to parse.
     * @returns An implementation-specific identifier for the span.
     */
    function parseTraceparentHeader(traceparentHeader) {
        return getInstrumenter().parseTraceparentHeader(traceparentHeader);
    }
    /**
     * Creates a set of request headers to propagate tracing information to a backend.
     *
     * @param tracingContext - The context containing the span to serialize.
     * @returns The set of headers to add to a request.
     */
    function createRequestHeaders(tracingContext) {
        return getInstrumenter().createRequestHeaders(tracingContext);
    }
    return {
        startSpan,
        withSpan,
        withContext,
        parseTraceparentHeader,
        createRequestHeaders,
    };
}

exports.createTracingClient = createTracingClient;
exports.useInstrumenter = useInstrumenter;
//# sourceMappingURL=index.js.map
The MIT License (MIT)

Copyright (c) 2020 Microsoft

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": "@azure/core-util",
  "version": "1.0.0",
  "description": "Core library for shared utility methods",
  "sdk-type": "client",
  "main": "dist/index.js",
  "module": "dist-esm/src/index.js",
  "browser": {
    "./dist-esm/src/isNode.js": "./dist-esm/src/isNode.browser.js",
    "./dist-esm/src/sha256.js": "./dist-esm/src/sha256.browser.js"
  },
  "react-native": {
    "./dist/index.js": "./dist-esm/src/index.js"
  },
  "types": "types/latest/core-util.d.ts",
  "typesVersions": {
    "<3.6": {
      "types/latest/*": [
        "types/3.1/*"
      ]
    }
  },
  "files": [
    "dist/",
    "dist-esm/src/",
    "types/latest/core-util.d.ts",
    "types/3.1/core-util.d.ts",
    "README.md",
    "LICENSE"
  ],
  "repository": "github:Azure/azure-sdk-for-js",
  "author": "Microsoft Corporation",
  "license": "MIT",
  "engines": {
    "node": ">=12.0.0"
  },
  "homepage": "https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/core/core-util/",
  "sideEffects": false,
  "prettier": "@azure/eslint-plugin-azure-sdk/prettier.json",
  "dependencies": {
    "tslib": "^2.2.0"
  },
  "devDependencies": {
    "@azure/dev-tool": "^1.0.0",
    "@microsoft/api-extractor": "7.18.11",
    "@types/chai": "^4.1.6",
    "@types/mocha": "^7.0.2",
    "@types/node": "^12.0.0",
    "@types/sinon": "^9.0.4",
    "@azure/eslint-plugin-azure-sdk": "^3.0.0",
    "chai": "^4.2.0",
    "downlevel-dts": "^0.8.0",
    "cross-env": "^7.0.2",
    "eslint": "^7.15.0",
    "inherits": "^2.0.3",
    "karma": "^6.2.0",
    "karma-chrome-launcher": "^3.0.0",
    "karma-coverage": "^2.0.0",
    "karma-edge-launcher": "^0.4.2",
    "karma-env-preprocessor": "^0.1.1",
    "karma-firefox-launcher": "^1.1.0",
    "karma-ie-launcher": "^1.0.0",
    "karma-junit-reporter": "^2.0.1",
    "karma-mocha": "^2.0.1",
    "karma-mocha-reporter": "^2.2.5",
    "karma-sourcemap-loader": "^0.3.8",
    "mocha": "^7.1.1",
    "mocha-junit-reporter": "^2.0.0",
    "prettier": "^2.5.1",
    "rimraf": "^3.0.0",
    "sinon": "^9.0.2",
    "typescript": "~4.6.0",
    "util": "^0.12.1"
  }
}// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Converts a base64 string into a byte array.
 * @param content - The base64 string to convert.
 * @internal
 */
export function base64ToBytes(content) {
    if (typeof atob !== "function") {
        throw new Error(`Your browser environment is missing the global "atob" function.`);
    }
    const binary = atob(content);
    const bytes = new Uint8Array(binary.length);
    for (let i = 0; i < binary.length; i++) {
        bytes[i] = binary.charCodeAt(i);
    }
    return bytes;
}
/**
 * Converts an ArrayBuffer to base64 string.
 * @param buffer - Raw binary data.
 * @internal
 */
export function bufferToBase64(buffer) {
    if (typeof btoa !== "function") {
        throw new Error(`Your browser environment is missing the global "btoa" function.`);
    }
    const bytes = new Uint8Array(buffer);
    let binary = "";
    for (const byte of bytes) {
        binary += String.fromCharCode(byte);
    }
    return btoa(binary);
}
//# sourceMappingURL=base64.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * A wrapper for setTimeout that resolves a promise after timeInMs milliseconds.
 * @param timeInMs - The number of milliseconds to be delayed.
 * @returns Promise that is resolved after timeInMs
 */
export function delay(timeInMs) {
    return new Promise((resolve) => setTimeout(() => resolve(), timeInMs));
}
//# sourceMappingURL=delay.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { isObject } from "./object";
/**
 * Typeguard for an error object shape (has name and message)
 * @param e - Something caught by a catch clause.
 */
export function isError(e) {
    if (isObject(e)) {
        const hasName = typeof e.name === "string";
        const hasMessage = typeof e.message === "string";
        return hasName && hasMessage;
    }
    return false;
}
/**
 * Given what is thought to be an error object, return the message if possible.
 * If the message is missing, returns a stringified version of the input.
 * @param e - Something thrown from a try block
 * @returns The error message or a string of the input
 */
export function getErrorMessage(e) {
    if (isError(e)) {
        return e.message;
    }
    else {
        let stringified;
        try {
            if (typeof e === "object" && e) {
                stringified = JSON.stringify(e);
            }
            else {
                stringified = String(e);
            }
        }
        catch (err) {
            stringified = "[unable to stringify input]";
        }
        return `Unknown error ${stringified}`;
    }
}
//# sourceMappingURL=error.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Converts an ArrayBuffer to a hexadecimal string.
 * @param buffer - Raw binary data.
 * @internal
 */
export function bufferToHex(buffer) {
    const bytes = new Uint8Array(buffer);
    return Array.prototype.map.call(bytes, byteToHex).join("");
}
/**
 * Converts a byte to a hexadecimal string.
 * @param byte - An integer representation of a byte.
 * @internal
 */
function byteToHex(byte) {
    const hex = byte.toString(16);
    return hex.length === 2 ? hex : `0${hex}`;
}
//# sourceMappingURL=hex.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export { isNode } from "./isNode";
export { delay } from "./delay";
export { getRandomIntegerInclusive } from "./random";
export { isObject } from "./object";
export { isError, getErrorMessage } from "./error";
export { computeSha256Hash, computeSha256Hmac } from "./sha256";
//# sourceMappingURL=index.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * A constant that indicates whether the environment the code is running is Node.JS.
 */
export const isNode = false;
//# sourceMappingURL=isNode.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
var _a;
/**
 * A constant that indicates whether the environment the code is running is Node.JS.
 */
export const isNode = typeof process !== "undefined" && Boolean(process.version) && Boolean((_a = process.versions) === null || _a === void 0 ? void 0 : _a.node);
//# sourceMappingURL=isNode.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Helper to determine when an input is a generic JS object.
 * @returns true when input is an object type that is not null, Array, RegExp, or Date.
 */
export function isObject(input) {
    return (typeof input === "object" &&
        input !== null &&
        !Array.isArray(input) &&
        !(input instanceof RegExp) &&
        !(input instanceof Date));
}
//# sourceMappingURL=object.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Returns a random integer value between a lower and upper bound,
 * inclusive of both bounds.
 * Note that this uses Math.random and isn't secure. If you need to use
 * this for any kind of security purpose, find a better source of random.
 * @param min - The smallest integer value allowed.
 * @param max - The largest integer value allowed.
 */
export function getRandomIntegerInclusive(min, max) {
    // Make sure inputs are integers.
    min = Math.ceil(min);
    max = Math.floor(max);
    // Pick a random offset from zero to the size of the range.
    // Since Math.random() can never return 1, we have to make the range one larger
    // in order to be inclusive of the maximum value after we take the floor.
    const offset = Math.floor(Math.random() * (max - min + 1));
    return offset + min;
}
//# sourceMappingURL=random.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { base64ToBytes, bufferToBase64 } from "./base64.browser";
import { bufferToHex } from "./hex";
import { utf8ToBytes } from "./utf8.browser";
let subtleCrypto;
/**
 * Returns a cached reference to the Web API crypto.subtle object.
 * @internal
 */
function getCrypto() {
    if (subtleCrypto) {
        return subtleCrypto;
    }
    if (!self.crypto || !self.crypto.subtle) {
        throw new Error("Your browser environment does not support cryptography functions.");
    }
    subtleCrypto = self.crypto.subtle;
    return subtleCrypto;
}
/**
 * Generates a SHA-256 HMAC signature.
 * @param key - The HMAC key represented as a base64 string, used to generate the cryptographic HMAC hash.
 * @param stringToSign - The data to be signed.
 * @param encoding - The textual encoding to use for the returned HMAC digest.
 */
export async function computeSha256Hmac(key, stringToSign, encoding) {
    const crypto = getCrypto();
    const keyBytes = base64ToBytes(key);
    const stringToSignBytes = utf8ToBytes(stringToSign);
    const cryptoKey = await crypto.importKey("raw", keyBytes, {
        name: "HMAC",
        hash: { name: "SHA-256" },
    }, false, ["sign"]);
    const signature = await crypto.sign({
        name: "HMAC",
        hash: { name: "SHA-256" },
    }, cryptoKey, stringToSignBytes);
    switch (encoding) {
        case "base64":
            return bufferToBase64(signature);
        case "hex":
            return bufferToHex(signature);
    }
}
/**
 * Generates a SHA-256 hash.
 * @param content - The data to be included in the hash.
 * @param encoding - The textual encoding to use for the returned hash.
 */
export async function computeSha256Hash(content, encoding) {
    const contentBytes = utf8ToBytes(content);
    const digest = await getCrypto().digest({ name: "SHA-256" }, contentBytes);
    switch (encoding) {
        case "base64":
            return bufferToBase64(digest);
        case "hex":
            return bufferToHex(digest);
    }
}
//# sourceMappingURL=sha256.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createHash, createHmac } from "crypto";
/**
 * Generates a SHA-256 HMAC signature.
 * @param key - The HMAC key represented as a base64 string, used to generate the cryptographic HMAC hash.
 * @param stringToSign - The data to be signed.
 * @param encoding - The textual encoding to use for the returned HMAC digest.
 */
export async function computeSha256Hmac(key, stringToSign, encoding) {
    const decodedKey = Buffer.from(key, "base64");
    return createHmac("sha256", decodedKey).update(stringToSign).digest(encoding);
}
/**
 * Generates a SHA-256 hash.
 * @param content - The data to be included in the hash.
 * @param encoding - The textual encoding to use for the returned hash.
 */
export async function computeSha256Hash(content, encoding) {
    return createHash("sha256").update(content).digest(encoding);
}
//# sourceMappingURL=sha256.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
let encoder;
/**
 * Returns a cached TextEncoder.
 * @internal
 */
function getTextEncoder() {
    if (encoder) {
        return encoder;
    }
    if (typeof TextEncoder === "undefined") {
        throw new Error(`Your browser environment is missing "TextEncoder".`);
    }
    encoder = new TextEncoder();
    return encoder;
}
/**
 * Converts a utf8 string into a byte array.
 * @param content - The utf8 string to convert.
 * @internal
 */
export function utf8ToBytes(content) {
    return getTextEncoder().encode(content);
}
//# sourceMappingURL=utf8.browser.js.map'use strict';

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

var crypto = require('crypto');

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
var _a;
/**
 * A constant that indicates whether the environment the code is running is Node.JS.
 */
const isNode = typeof process !== "undefined" && Boolean(process.version) && Boolean((_a = process.versions) === null || _a === void 0 ? void 0 : _a.node);

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * A wrapper for setTimeout that resolves a promise after timeInMs milliseconds.
 * @param timeInMs - The number of milliseconds to be delayed.
 * @returns Promise that is resolved after timeInMs
 */
function delay(timeInMs) {
    return new Promise((resolve) => setTimeout(() => resolve(), timeInMs));
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Returns a random integer value between a lower and upper bound,
 * inclusive of both bounds.
 * Note that this uses Math.random and isn't secure. If you need to use
 * this for any kind of security purpose, find a better source of random.
 * @param min - The smallest integer value allowed.
 * @param max - The largest integer value allowed.
 */
function getRandomIntegerInclusive(min, max) {
    // Make sure inputs are integers.
    min = Math.ceil(min);
    max = Math.floor(max);
    // Pick a random offset from zero to the size of the range.
    // Since Math.random() can never return 1, we have to make the range one larger
    // in order to be inclusive of the maximum value after we take the floor.
    const offset = Math.floor(Math.random() * (max - min + 1));
    return offset + min;
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Helper to determine when an input is a generic JS object.
 * @returns true when input is an object type that is not null, Array, RegExp, or Date.
 */
function isObject(input) {
    return (typeof input === "object" &&
        input !== null &&
        !Array.isArray(input) &&
        !(input instanceof RegExp) &&
        !(input instanceof Date));
}

// Copyright (c) Microsoft Corporation.
/**
 * Typeguard for an error object shape (has name and message)
 * @param e - Something caught by a catch clause.
 */
function isError(e) {
    if (isObject(e)) {
        const hasName = typeof e.name === "string";
        const hasMessage = typeof e.message === "string";
        return hasName && hasMessage;
    }
    return false;
}
/**
 * Given what is thought to be an error object, return the message if possible.
 * If the message is missing, returns a stringified version of the input.
 * @param e - Something thrown from a try block
 * @returns The error message or a string of the input
 */
function getErrorMessage(e) {
    if (isError(e)) {
        return e.message;
    }
    else {
        let stringified;
        try {
            if (typeof e === "object" && e) {
                stringified = JSON.stringify(e);
            }
            else {
                stringified = String(e);
            }
        }
        catch (err) {
            stringified = "[unable to stringify input]";
        }
        return `Unknown error ${stringified}`;
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * Generates a SHA-256 HMAC signature.
 * @param key - The HMAC key represented as a base64 string, used to generate the cryptographic HMAC hash.
 * @param stringToSign - The data to be signed.
 * @param encoding - The textual encoding to use for the returned HMAC digest.
 */
async function computeSha256Hmac(key, stringToSign, encoding) {
    const decodedKey = Buffer.from(key, "base64");
    return crypto.createHmac("sha256", decodedKey).update(stringToSign).digest(encoding);
}
/**
 * Generates a SHA-256 hash.
 * @param content - The data to be included in the hash.
 * @param encoding - The textual encoding to use for the returned hash.
 */
async function computeSha256Hash(content, encoding) {
    return crypto.createHash("sha256").update(content).digest(encoding);
}

exports.computeSha256Hash = computeSha256Hash;
exports.computeSha256Hmac = computeSha256Hmac;
exports.delay = delay;
exports.getErrorMessage = getErrorMessage;
exports.getRandomIntegerInclusive = getRandomIntegerInclusive;
exports.isError = isError;
exports.isNode = isNode;
exports.isObject = isObject;
//# sourceMappingURL=index.js.map
The MIT License (MIT)

Copyright (c) 2020 Microsoft

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": "@azure/identity",
  "sdk-type": "client",
  "version": "2.1.0",
  "description": "Provides credential implementations for Azure SDK libraries that can authenticate with Azure Active Directory",
  "main": "dist/index.js",
  "module": "dist-esm/src/index.js",
  "types": "./types/identity.d.ts",
  "browser": {
    "os": false,
    "process": false,
    "./dist-esm/src/credentials/azureCliCredential.js": "./dist-esm/src/credentials/azureCliCredential.browser.js",
    "./dist-esm/src/credentials/environmentCredential.js": "./dist-esm/src/credentials/environmentCredential.browser.js",
    "./dist-esm/src/credentials/managedIdentityCredential/index.js": "./dist-esm/src/credentials/managedIdentityCredential/index.browser.js",
    "./dist-esm/src/credentials/clientCertificateCredential.js": "./dist-esm/src/credentials/clientCertificateCredential.browser.js",
    "./dist-esm/src/credentials/clientSecretCredential.js": "./dist-esm/src/credentials/clientSecretCredential.browser.js",
    "./dist-esm/src/credentials/clientAssertionCredential.js": "./dist-esm/src/credentials/clientAssertionCredential.browser.js",
    "./dist-esm/src/credentials/deviceCodeCredential.js": "./dist-esm/src/credentials/deviceCodeCredential.browser.js",
    "./dist-esm/src/credentials/defaultAzureCredential.js": "./dist-esm/src/credentials/defaultAzureCredential.browser.js",
    "./dist-esm/src/credentials/authorizationCodeCredential.js": "./dist-esm/src/credentials/authorizationCodeCredential.browser.js",
    "./dist-esm/src/credentials/interactiveBrowserCredential.js": "./dist-esm/src/credentials/interactiveBrowserCredential.browser.js",
    "./dist-esm/src/credentials/visualStudioCodeCredential.js": "./dist-esm/src/credentials/visualStudioCodeCredential.browser.js",
    "./dist-esm/src/credentials/usernamePasswordCredential.js": "./dist-esm/src/credentials/usernamePasswordCredential.browser.js",
    "./dist-esm/src/credentials/azurePowerShellCredential.js": "./dist-esm/src/credentials/azurePowerShellCredential.browser.js",
    "./dist-esm/src/credentials/azureApplicationCredential.js": "./dist-esm/src/credentials/azureApplicationCredential.browser.js",
    "./dist-esm/src/credentials/onBehalfOfCredential.js": "./dist-esm/src/credentials/onBehalfOfCredential.browser.js",
    "./dist-esm/src/util/authHostEnv.js": "./dist-esm/src/util/authHostEnv.browser.js",
    "./dist-esm/src/util/validateMultiTenant.js": "./dist-esm/src/util/validateMultiTenant.browser.js",
    "./dist-esm/src/tokenCache/TokenCachePersistence.js": "./dist-esm/src/tokenCache/TokenCachePersistence.browser.js",
    "./dist-esm/src/plugins/consumer.js": "./dist-esm/src/plugins/consumer.browser.js",
    "./dist-esm/test/httpRequests.js": "./dist-esm/test/httpRequests.browser.js"
  },
  "//sampleConfiguration": {
    "productName": "Azure Identity",
    "productSlugs": [
      "azure",
      "azure-active-directory"
    ],
    "requiredResources": {
      "Azure Active Directory App Registration": "https://docs.microsoft.com/azure/active-directory/develop/quickstart-register-app",
      "Azure Key Vault": "https://docs.microsoft.com/azure/key-vault/quick-create-portal"
    }
  },
  "files": [
    "dist/",
    "dist-esm/src/",
    "types/identity.d.ts",
    "README.md",
    "LICENSE"
  ],
  "//metadata": {
    "constantPaths": [
      {
        "path": "src/constants.ts",
        "prefix": "SDK_VERSION"
      }
    ]
  },
  "engines": {
    "node": ">=12.0.0"
  },
  "repository": "github:Azure/azure-sdk-for-js",
  "author": "Microsoft Corporation",
  "license": "MIT",
  "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/identity/identity/README.md",
  "sideEffects": false,
  "dependencies": {
    "@azure/abort-controller": "^1.0.0",
    "@azure/core-auth": "^1.3.0",
    "@azure/core-client": "^1.4.0",
    "@azure/core-rest-pipeline": "^1.1.0",
    "@azure/core-tracing": "^1.0.0",
    "@azure/core-util": "^1.0.0",
    "@azure/logger": "^1.0.0",
    "@azure/msal-browser": "^2.26.0",
    "@azure/msal-common": "^7.0.0",
    "@azure/msal-node": "^1.10.0",
    "events": "^3.0.0",
    "jws": "^4.0.0",
    "open": "^8.0.0",
    "stoppable": "^1.1.0",
    "tslib": "^2.2.0",
    "uuid": "^8.3.0"
  },
  "devDependencies": {
    "@azure-tools/test-recorder": "^2.0.0",
    "@azure/dev-tool": "^1.0.0",
    "@azure/eslint-plugin-azure-sdk": "^3.0.0",
    "@azure/keyvault-keys": "4.2.0",
    "@azure/test-utils": "^1.0.0",
    "@microsoft/api-extractor": "7.18.11",
    "@types/chai": "^4.1.6",
    "@types/jsonwebtoken": "~8.5.0",
    "@types/jws": "^3.2.2",
    "@types/mocha": "^7.0.2",
    "@types/ms": "^0.7.31",
    "@types/node": "^12.0.0",
    "@types/sinon": "^9.0.4",
    "@types/stoppable": "^1.1.0",
    "@types/uuid": "^8.0.0",
    "chai": "^4.2.0",
    "cross-env": "^7.0.2",
    "dotenv": "^8.2.0",
    "eslint": "^8.0.0",
    "inherits": "^2.0.3",
    "jsonwebtoken": "^8.5.1",
    "karma": "^6.2.0",
    "karma-chrome-launcher": "^3.0.0",
    "karma-coverage": "^2.0.0",
    "karma-env-preprocessor": "^0.1.1",
    "karma-junit-reporter": "^2.0.1",
    "karma-mocha": "^2.0.1",
    "karma-mocha-reporter": "^2.2.5",
    "karma-sourcemap-loader": "^0.3.8",
    "mocha": "^7.1.1",
    "mocha-junit-reporter": "^2.0.0",
    "ms": "^2.1.3",
    "nyc": "^15.0.0",
    "prettier": "^2.5.1",
    "puppeteer": "^14.0.0",
    "rimraf": "^3.0.0",
    "sinon": "^9.0.2",
    "typescript": "~4.6.0",
    "util": "^0.12.1",
    "uuid": "^8.3.2"
  }
}// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Current version of the `@azure/identity` package.
 */
export const SDK_VERSION = `2.1.0`;
/**
 * The default client ID for authentication
 * @internal
 */
// TODO: temporary - this is the Azure CLI clientID - we'll replace it when
// Developer Sign On application is available
// https://github.com/Azure/azure-sdk-for-net/blob/main/sdk/identity/Azure.Identity/src/Constants.cs#L9
export const DeveloperSignOnClientId = "04b07795-8ddb-461a-bbee-02f9e1bf7b46";
/**
 * The default tenant for authentication
 * @internal
 */
export const DefaultTenantId = "common";
/**
 * A list of known Azure authority hosts
 */
export var AzureAuthorityHosts;
(function (AzureAuthorityHosts) {
    /**
     * China-based Azure Authority Host
     */
    AzureAuthorityHosts["AzureChina"] = "https://login.chinacloudapi.cn";
    /**
     * Germany-based Azure Authority Host
     */
    AzureAuthorityHosts["AzureGermany"] = "https://login.microsoftonline.de";
    /**
     * US Government Azure Authority Host
     */
    AzureAuthorityHosts["AzureGovernment"] = "https://login.microsoftonline.us";
    /**
     * Public Cloud Azure Authority Host
     */
    AzureAuthorityHosts["AzurePublicCloud"] = "https://login.microsoftonline.com";
})(AzureAuthorityHosts || (AzureAuthorityHosts = {}));
/**
 * The default authority host.
 */
export const DefaultAuthorityHost = AzureAuthorityHosts.AzurePublicCloud;
//# sourceMappingURL=constants.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
function isErrorResponse(errorResponse) {
    return (errorResponse &&
        typeof errorResponse.error === "string" &&
        typeof errorResponse.error_description === "string");
}
/**
 * The Error.name value of an CredentialUnavailable
 */
export const CredentialUnavailableErrorName = "CredentialUnavailableError";
/**
 * This signifies that the credential that was tried in a chained credential
 * was not available to be used as the credential. Rather than treating this as
 * an error that should halt the chain, it's caught and the chain continues
 */
export class CredentialUnavailableError extends Error {
    constructor(message) {
        super(message);
        this.name = CredentialUnavailableErrorName;
    }
}
/**
 * The Error.name value of an AuthenticationError
 */
export const AuthenticationErrorName = "AuthenticationError";
/**
 * Provides details about a failure to authenticate with Azure Active
 * Directory.  The `errorResponse` field contains more details about
 * the specific failure.
 */
export class AuthenticationError extends Error {
    // eslint-disable-next-line @typescript-eslint/ban-types
    constructor(statusCode, errorBody) {
        let errorResponse = {
            error: "unknown",
            errorDescription: "An unknown error occurred and no additional details are available.",
        };
        if (isErrorResponse(errorBody)) {
            errorResponse = convertOAuthErrorResponseToErrorResponse(errorBody);
        }
        else if (typeof errorBody === "string") {
            try {
                // Most error responses will contain JSON-formatted error details
                // in the response body
                const oauthErrorResponse = JSON.parse(errorBody);
                errorResponse = convertOAuthErrorResponseToErrorResponse(oauthErrorResponse);
            }
            catch (e) {
                if (statusCode === 400) {
                    errorResponse = {
                        error: "authority_not_found",
                        errorDescription: "The specified authority URL was not found.",
                    };
                }
                else {
                    errorResponse = {
                        error: "unknown_error",
                        errorDescription: `An unknown error has occurred. Response body:\n\n${errorBody}`,
                    };
                }
            }
        }
        else {
            errorResponse = {
                error: "unknown_error",
                errorDescription: "An unknown error occurred and no additional details are available.",
            };
        }
        super(`${errorResponse.error} Status code: ${statusCode}\nMore details:\n${errorResponse.errorDescription}`);
        this.statusCode = statusCode;
        this.errorResponse = errorResponse;
        // Ensure that this type reports the correct name
        this.name = AuthenticationErrorName;
    }
}
/**
 * The Error.name value of an AggregateAuthenticationError
 */
export const AggregateAuthenticationErrorName = "AggregateAuthenticationError";
/**
 * Provides an `errors` array containing {@link AuthenticationError} instance
 * for authentication failures from credentials in a {@link ChainedTokenCredential}.
 */
export class AggregateAuthenticationError extends Error {
    constructor(errors, errorMessage) {
        const errorDetail = errors.join("\n");
        super(`${errorMessage}\n${errorDetail}`);
        this.errors = errors;
        // Ensure that this type reports the correct name
        this.name = AggregateAuthenticationErrorName;
    }
}
function convertOAuthErrorResponseToErrorResponse(errorBody) {
    return {
        error: errorBody.error,
        errorDescription: errorBody.error_description,
        correlationId: errorBody.correlation_id,
        errorCodes: errorBody.error_codes,
        timestamp: errorBody.timestamp,
        traceId: errorBody.trace_id,
    };
}
/**
 * Error used to enforce authentication after trying to retrieve a token silently.
 */
export class AuthenticationRequiredError extends Error {
    constructor(
    /**
     * Optional parameters. A message can be specified. The {@link GetTokenOptions} of the request can also be specified to more easily associate the error with the received parameters.
     */
    options) {
        super(options.message);
        this.scopes = options.scopes;
        this.getTokenOptions = options.getTokenOptions;
        this.name = "AuthenticationRequiredError";
    }
}
//# sourceMappingURL=errors.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export * from "./plugins/consumer";
import { DefaultAzureCredential } from "./credentials/defaultAzureCredential";
export { AuthenticationError, AggregateAuthenticationError, AuthenticationErrorName, AggregateAuthenticationErrorName, CredentialUnavailableError, CredentialUnavailableErrorName, AuthenticationRequiredError, } from "./errors";
export { serializeAuthenticationRecord, deserializeAuthenticationRecord } from "./msal/utils";
export { ChainedTokenCredential } from "./credentials/chainedTokenCredential";
export { DefaultAzureCredential, } from "./credentials/defaultAzureCredential";
export { EnvironmentCredential, } from "./credentials/environmentCredential";
export { ClientSecretCredential } from "./credentials/clientSecretCredential";
export { ClientCertificateCredential, } from "./credentials/clientCertificateCredential";
export { ClientAssertionCredential } from "./credentials/clientAssertionCredential";
export { AzureCliCredential } from "./credentials/azureCliCredential";
export { InteractiveBrowserCredential } from "./credentials/interactiveBrowserCredential";
export { ManagedIdentityCredential, } from "./credentials/managedIdentityCredential";
export { DeviceCodeCredential } from "./credentials/deviceCodeCredential";
export { UsernamePasswordCredential } from "./credentials/usernamePasswordCredential";
export { AuthorizationCodeCredential } from "./credentials/authorizationCodeCredential";
export { AzurePowerShellCredential } from "./credentials/azurePowerShellCredential";
export { VisualStudioCodeCredential, } from "./credentials/visualStudioCodeCredential";
export { OnBehalfOfCredential } from "./credentials/onBehalfOfCredential";
export { logger } from "./util/logging";
export { AzureAuthorityHosts } from "./constants";
/**
 * Returns a new instance of the {@link DefaultAzureCredential}.
 */
export function getDefaultAzureCredential() {
    return new DefaultAzureCredential();
}
//# sourceMappingURL=index.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Helps specify a regional authority, or "AutoDiscoverRegion" to auto-detect the region.
 */
export var RegionalAuthority;
(function (RegionalAuthority) {
    /** Instructs MSAL to attempt to discover the region */
    RegionalAuthority["AutoDiscoverRegion"] = "AutoDiscoverRegion";
    /** Uses the {@link RegionalAuthority} for the Azure 'westus' region. */
    RegionalAuthority["USWest"] = "westus";
    /** Uses the {@link RegionalAuthority} for the Azure 'westus2' region. */
    RegionalAuthority["USWest2"] = "westus2";
    /** Uses the {@link RegionalAuthority} for the Azure 'centralus' region. */
    RegionalAuthority["USCentral"] = "centralus";
    /** Uses the {@link RegionalAuthority} for the Azure 'eastus' region. */
    RegionalAuthority["USEast"] = "eastus";
    /** Uses the {@link RegionalAuthority} for the Azure 'eastus2' region. */
    RegionalAuthority["USEast2"] = "eastus2";
    /** Uses the {@link RegionalAuthority} for the Azure 'northcentralus' region. */
    RegionalAuthority["USNorthCentral"] = "northcentralus";
    /** Uses the {@link RegionalAuthority} for the Azure 'southcentralus' region. */
    RegionalAuthority["USSouthCentral"] = "southcentralus";
    /** Uses the {@link RegionalAuthority} for the Azure 'westcentralus' region. */
    RegionalAuthority["USWestCentral"] = "westcentralus";
    /** Uses the {@link RegionalAuthority} for the Azure 'canadacentral' region. */
    RegionalAuthority["CanadaCentral"] = "canadacentral";
    /** Uses the {@link RegionalAuthority} for the Azure 'canadaeast' region. */
    RegionalAuthority["CanadaEast"] = "canadaeast";
    /** Uses the {@link RegionalAuthority} for the Azure 'brazilsouth' region. */
    RegionalAuthority["BrazilSouth"] = "brazilsouth";
    /** Uses the {@link RegionalAuthority} for the Azure 'northeurope' region. */
    RegionalAuthority["EuropeNorth"] = "northeurope";
    /** Uses the {@link RegionalAuthority} for the Azure 'westeurope' region. */
    RegionalAuthority["EuropeWest"] = "westeurope";
    /** Uses the {@link RegionalAuthority} for the Azure 'uksouth' region. */
    RegionalAuthority["UKSouth"] = "uksouth";
    /** Uses the {@link RegionalAuthority} for the Azure 'ukwest' region. */
    RegionalAuthority["UKWest"] = "ukwest";
    /** Uses the {@link RegionalAuthority} for the Azure 'francecentral' region. */
    RegionalAuthority["FranceCentral"] = "francecentral";
    /** Uses the {@link RegionalAuthority} for the Azure 'francesouth' region. */
    RegionalAuthority["FranceSouth"] = "francesouth";
    /** Uses the {@link RegionalAuthority} for the Azure 'switzerlandnorth' region. */
    RegionalAuthority["SwitzerlandNorth"] = "switzerlandnorth";
    /** Uses the {@link RegionalAuthority} for the Azure 'switzerlandwest' region. */
    RegionalAuthority["SwitzerlandWest"] = "switzerlandwest";
    /** Uses the {@link RegionalAuthority} for the Azure 'germanynorth' region. */
    RegionalAuthority["GermanyNorth"] = "germanynorth";
    /** Uses the {@link RegionalAuthority} for the Azure 'germanywestcentral' region. */
    RegionalAuthority["GermanyWestCentral"] = "germanywestcentral";
    /** Uses the {@link RegionalAuthority} for the Azure 'norwaywest' region. */
    RegionalAuthority["NorwayWest"] = "norwaywest";
    /** Uses the {@link RegionalAuthority} for the Azure 'norwayeast' region. */
    RegionalAuthority["NorwayEast"] = "norwayeast";
    /** Uses the {@link RegionalAuthority} for the Azure 'eastasia' region. */
    RegionalAuthority["AsiaEast"] = "eastasia";
    /** Uses the {@link RegionalAuthority} for the Azure 'southeastasia' region. */
    RegionalAuthority["AsiaSouthEast"] = "southeastasia";
    /** Uses the {@link RegionalAuthority} for the Azure 'japaneast' region. */
    RegionalAuthority["JapanEast"] = "japaneast";
    /** Uses the {@link RegionalAuthority} for the Azure 'japanwest' region. */
    RegionalAuthority["JapanWest"] = "japanwest";
    /** Uses the {@link RegionalAuthority} for the Azure 'australiaeast' region. */
    RegionalAuthority["AustraliaEast"] = "australiaeast";
    /** Uses the {@link RegionalAuthority} for the Azure 'australiasoutheast' region. */
    RegionalAuthority["AustraliaSouthEast"] = "australiasoutheast";
    /** Uses the {@link RegionalAuthority} for the Azure 'australiacentral' region. */
    RegionalAuthority["AustraliaCentral"] = "australiacentral";
    /** Uses the {@link RegionalAuthority} for the Azure 'australiacentral2' region. */
    RegionalAuthority["AustraliaCentral2"] = "australiacentral2";
    /** Uses the {@link RegionalAuthority} for the Azure 'centralindia' region. */
    RegionalAuthority["IndiaCentral"] = "centralindia";
    /** Uses the {@link RegionalAuthority} for the Azure 'southindia' region. */
    RegionalAuthority["IndiaSouth"] = "southindia";
    /** Uses the {@link RegionalAuthority} for the Azure 'westindia' region. */
    RegionalAuthority["IndiaWest"] = "westindia";
    /** Uses the {@link RegionalAuthority} for the Azure 'koreasouth' region. */
    RegionalAuthority["KoreaSouth"] = "koreasouth";
    /** Uses the {@link RegionalAuthority} for the Azure 'koreacentral' region. */
    RegionalAuthority["KoreaCentral"] = "koreacentral";
    /** Uses the {@link RegionalAuthority} for the Azure 'uaecentral' region. */
    RegionalAuthority["UAECentral"] = "uaecentral";
    /** Uses the {@link RegionalAuthority} for the Azure 'uaenorth' region. */
    RegionalAuthority["UAENorth"] = "uaenorth";
    /** Uses the {@link RegionalAuthority} for the Azure 'southafricanorth' region. */
    RegionalAuthority["SouthAfricaNorth"] = "southafricanorth";
    /** Uses the {@link RegionalAuthority} for the Azure 'southafricawest' region. */
    RegionalAuthority["SouthAfricaWest"] = "southafricawest";
    /** Uses the {@link RegionalAuthority} for the Azure 'chinanorth' region. */
    RegionalAuthority["ChinaNorth"] = "chinanorth";
    /** Uses the {@link RegionalAuthority} for the Azure 'chinaeast' region. */
    RegionalAuthority["ChinaEast"] = "chinaeast";
    /** Uses the {@link RegionalAuthority} for the Azure 'chinanorth2' region. */
    RegionalAuthority["ChinaNorth2"] = "chinanorth2";
    /** Uses the {@link RegionalAuthority} for the Azure 'chinaeast2' region. */
    RegionalAuthority["ChinaEast2"] = "chinaeast2";
    /** Uses the {@link RegionalAuthority} for the Azure 'germanycentral' region. */
    RegionalAuthority["GermanyCentral"] = "germanycentral";
    /** Uses the {@link RegionalAuthority} for the Azure 'germanynortheast' region. */
    RegionalAuthority["GermanyNorthEast"] = "germanynortheast";
    /** Uses the {@link RegionalAuthority} for the Azure 'usgovvirginia' region. */
    RegionalAuthority["GovernmentUSVirginia"] = "usgovvirginia";
    /** Uses the {@link RegionalAuthority} for the Azure 'usgoviowa' region. */
    RegionalAuthority["GovernmentUSIowa"] = "usgoviowa";
    /** Uses the {@link RegionalAuthority} for the Azure 'usgovarizona' region. */
    RegionalAuthority["GovernmentUSArizona"] = "usgovarizona";
    /** Uses the {@link RegionalAuthority} for the Azure 'usgovtexas' region. */
    RegionalAuthority["GovernmentUSTexas"] = "usgovtexas";
    /** Uses the {@link RegionalAuthority} for the Azure 'usdodeast' region. */
    RegionalAuthority["GovernmentUSDodEast"] = "usdodeast";
    /** Uses the {@link RegionalAuthority} for the Azure 'usdodcentral' region. */
    RegionalAuthority["GovernmentUSDodCentral"] = "usdodcentral";
})(RegionalAuthority || (RegionalAuthority = {}));
//# sourceMappingURL=regionalAuthority.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=tokenCredentialOptions.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
const BrowserNotSupportedError = new Error("getAuthorityHostEnvironment is not supported in the browser.");
export function getAuthorityHostEnvironment() {
    throw BrowserNotSupportedError;
}
//# sourceMappingURL=authHostEnv.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { formatError } from "../util/logging";
export function checkTenantId(logger, tenantId) {
    if (!tenantId.match(/^[0-9a-zA-Z-.:/]+$/)) {
        const error = new Error("Invalid tenant id provided. You can locate your tenant id by following the instructions listed here: https://docs.microsoft.com/partner-center/find-ids-and-domain-names.");
        logger.info(formatError("", error));
        throw error;
    }
}
//# sourceMappingURL=checkTenantId.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export function getIdentityTokenEndpointSuffix(tenantId) {
    if (tenantId === "adfs") {
        return "oauth2/token";
    }
    else {
        return "oauth2/v2.0/token";
    }
}
//# sourceMappingURL=identityTokenEndpoint.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createClientLogger } from "@azure/logger";
/**
 * The AzureLogger used for all clients within the identity package
 */
export const logger = createClientLogger("identity");
/**
 * Separates a list of environment variable names into a plain object with two arrays: an array of missing environment variables and another array with assigned environment variables.
 * @param supportedEnvVars - List of environment variable names
 */
export function processEnvVars(supportedEnvVars) {
    return supportedEnvVars.reduce((acc, envVariable) => {
        if (process.env[envVariable]) {
            acc.assigned.push(envVariable);
        }
        else {
            acc.missing.push(envVariable);
        }
        return acc;
    }, { missing: [], assigned: [] });
}
/**
 * Based on a given list of environment variable names,
 * logs the environment variables currently assigned during the usage of a credential that goes by the given name.
 * @param credentialName - Name of the credential in use
 * @param supportedEnvVars - List of environment variables supported by that credential
 */
export function logEnvVars(credentialName, supportedEnvVars) {
    const { assigned } = processEnvVars(supportedEnvVars);
    logger.info(`${credentialName} => Found the following environment variables: ${assigned.join(", ")}`);
}
/**
 * Formatting the success event on the credentials
 */
export function formatSuccess(scope) {
    return `SUCCESS. Scopes: ${Array.isArray(scope) ? scope.join(", ") : scope}.`;
}
/**
 * Formatting the success event on the credentials
 */
export function formatError(scope, error) {
    let message = "ERROR.";
    if (scope === null || scope === void 0 ? void 0 : scope.length) {
        message += ` Scopes: ${Array.isArray(scope) ? scope.join(", ") : scope}.`;
    }
    return `${message} Error message: ${typeof error === "string" ? error : error.message}.`;
}
/**
 * Generates a CredentialLoggerInstance.
 *
 * It logs with the format:
 *
 *   `[title] => [message]`
 *
 */
export function credentialLoggerInstance(title, parent, log = logger) {
    const fullTitle = parent ? `${parent.fullTitle} ${title}` : title;
    function info(message) {
        log.info(`${fullTitle} =>`, message);
    }
    function warning(message) {
        log.warning(`${fullTitle} =>`, message);
    }
    return {
        title,
        fullTitle,
        info,
        warning,
    };
}
/**
 * Generates a CredentialLogger, which is a logger declared at the credential's constructor, and used at any point in the credential.
 * It has all the properties of a CredentialLoggerInstance, plus other logger instances, one per method.
 *
 * It logs with the format:
 *
 *   `[title] => [message]`
 *   `[title] => getToken() => [message]`
 *
 */
export function credentialLogger(title, log = logger) {
    const credLogger = credentialLoggerInstance(title, undefined, log);
    return Object.assign(Object.assign({}, credLogger), { parent: log, getToken: credentialLoggerInstance("=> getToken()", credLogger, log) });
}
//# sourceMappingURL=logging.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import * as childProcess from "child_process";
/**
 * Easy to mock childProcess utils.
 * @internal
 */
export const processUtils = {
    /**
     * Promisifying childProcess.execFile
     * @internal
     */
    execFile(file, params, options) {
        return new Promise((resolve, reject) => {
            childProcess.execFile(file, params, options, (error, stdout, stderr) => {
                if (Buffer.isBuffer(stdout)) {
                    stdout = stdout.toString("utf8");
                }
                if (Buffer.isBuffer(stderr)) {
                    stderr = stderr.toString("utf8");
                }
                if (stderr || error) {
                    reject(stderr ? new Error(stderr) : error);
                }
                else {
                    resolve(stdout);
                }
            });
        });
    },
};
//# sourceMappingURL=processUtils.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { DeveloperSignOnClientId } from "../constants";
import { checkTenantId } from "./checkTenantId";
export function resolveTenantId(logger, tenantId, clientId) {
    if (tenantId) {
        checkTenantId(logger, tenantId);
        return tenantId;
    }
    if (!clientId) {
        clientId = DeveloperSignOnClientId;
    }
    if (clientId !== DeveloperSignOnClientId) {
        return "common";
    }
    return "organizations";
}
//# sourceMappingURL=resolveTenantId.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { formatError } from "./logging";
/**
 * Throws if the received scope is not valid.
 * @internal
 */
export function ensureValidScope(scope, logger) {
    if (!scope.match(/^[0-9a-zA-Z-.:/]+$/)) {
        const error = new Error("Invalid scope was specified by the user or calling client");
        logger.getToken.info(formatError(scope, error));
        throw error;
    }
}
/**
 * Returns the resource out of a scope.
 * @internal
 */
export function getScopeResource(scope) {
    return scope.replace(/\/.default$/, "");
}
//# sourceMappingURL=scopeUtils.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createTracingClient } from "@azure/core-tracing";
import { SDK_VERSION } from "../constants";
/**
 * Creates a span using the global tracer.
 * @internal
 */
export const tracingClient = createTracingClient({
    namespace: "Microsoft.AAD",
    packageName: "@azure/identity",
    packageVersion: SDK_VERSION,
});
//# sourceMappingURL=tracing.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * @internal
 */
export const multiTenantADFSErrorMessage = "A new tenant Id can't be assigned through the GetTokenOptions when a credential has been originally configured to use the tenant `adfs`.";
/**
 * Of getToken contains a tenantId, this functions allows picking this tenantId as the appropriate for authentication,
 * unless multitenant authentication has been disabled through the AZURE_IDENTITY_DISABLE_MULTITENANTAUTH (on Node.js),
 * or unless the original tenant Id is `adfs`.
 * @internal
 */
export function processMultiTenantRequest(tenantId, getTokenOptions) {
    if (!(getTokenOptions === null || getTokenOptions === void 0 ? void 0 : getTokenOptions.tenantId)) {
        return tenantId;
    }
    if (tenantId === "adfs") {
        throw new Error(multiTenantADFSErrorMessage);
    }
    return getTokenOptions === null || getTokenOptions === void 0 ? void 0 : getTokenOptions.tenantId;
}
//# sourceMappingURL=validateMultiTenant.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * @internal
 */
export const multiTenantDisabledErrorMessage = "A getToken request was attempted with a tenant different than the tenant configured at the initialization of the credential, but multi-tenant authentication has been disabled by the environment variable AZURE_IDENTITY_DISABLE_MULTITENANTAUTH.";
/**
 * @internal
 */
export const multiTenantADFSErrorMessage = "A new tenant Id can't be assigned through the GetTokenOptions when a credential has been originally configured to use the tenant `adfs`.";
/**
 * Of getToken contains a tenantId, this functions allows picking this tenantId as the appropriate for authentication,
 * unless multitenant authentication has been disabled through the AZURE_IDENTITY_DISABLE_MULTITENANTAUTH (on Node.js),
 * or unless the original tenant Id is `adfs`.
 * @internal
 */
export function processMultiTenantRequest(tenantId, getTokenOptions) {
    if (!(getTokenOptions === null || getTokenOptions === void 0 ? void 0 : getTokenOptions.tenantId)) {
        return tenantId;
    }
    if (process.env.AZURE_IDENTITY_DISABLE_MULTITENANTAUTH) {
        throw new Error(multiTenantDisabledErrorMessage);
    }
    if (tenantId === "adfs") {
        throw new Error(multiTenantADFSErrorMessage);
    }
    return getTokenOptions === null || getTokenOptions === void 0 ? void 0 : getTokenOptions.tenantId;
}
//# sourceMappingURL=validateMultiTenant.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
// This module is a shim for the plugin consumer in the browser
export function useIdentityPlugin(_plugin) {
    throw new Error("Identity plugins are not supported in browser environments.");
}
//# sourceMappingURL=consumer.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { msalNodeFlowCacheControl } from "../msal/nodeFlows/msalNodeCommon";
import { vsCodeCredentialControl } from "../credentials/visualStudioCodeCredential";
/**
 * The context passed to an Identity plugin. This contains objects that
 * plugins can use to set backend implementations.
 * @internal
 */
const pluginContext = {
    cachePluginControl: msalNodeFlowCacheControl,
    vsCodeCredentialControl: vsCodeCredentialControl,
};
/**
 * Extend Azure Identity with additional functionality. Pass a plugin from
 * a plugin package, such as:
 *
 * - `@azure/identity-cache-persistence`: provides persistent token caching
 * - `@azure/identity-vscode`: provides the dependencies of
 *   `VisualStudioCodeCredential` and enables it
 *
 * Example:
 *
 * ```javascript
 * import { cachePersistencePlugin } from "@azure/identity-cache-persistence";
 *
 * import { useIdentityPlugin, DefaultAzureCredential } from "@azure/identity";
 * useIdentityPlugin(cachePersistencePlugin);
 *
 * // The plugin has the capability to extend `DefaultAzureCredential` and to
 * // add middleware to the underlying credentials, such as persistence.
 * const credential = new DefaultAzureCredential({
 *   tokenCachePersistenceOptions: {
 *     enabled: true
 *   }
 * });
 * ```
 *
 * @param plugin - the plugin to register
 */
export function useIdentityPlugin(plugin) {
    plugin(pluginContext);
}
//# sourceMappingURL=consumer.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=provider.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=credentials.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=flows.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=types.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import * as msalCommon from "@azure/msal-common";
import { isNode } from "@azure/core-util";
import { AbortError } from "@azure/abort-controller";
import { v4 as uuidv4 } from "uuid";
import { formatError, formatSuccess } from "../util/logging";
import { AuthenticationRequiredError, CredentialUnavailableError } from "../errors";
import { DefaultAuthorityHost, DefaultTenantId } from "../constants";
/**
 * Latest AuthenticationRecord version
 * @internal
 */
const LatestAuthenticationRecordVersion = "1.0";
/**
 * Ensures the validity of the MSAL token
 * @internal
 */
export function ensureValidMsalToken(scopes, logger, msalToken, getTokenOptions) {
    const error = (message) => {
        logger.getToken.info(message);
        return new AuthenticationRequiredError({
            scopes: Array.isArray(scopes) ? scopes : [scopes],
            getTokenOptions,
            message,
        });
    };
    if (!msalToken) {
        throw error("No response");
    }
    if (!msalToken.expiresOn) {
        throw error(`Response had no "expiresOn" property.`);
    }
    if (!msalToken.accessToken) {
        throw error(`Response had no "accessToken" property.`);
    }
}
/**
 * Generates a valid authority by combining a host with a tenantId.
 * @internal
 */
export function getAuthority(tenantId, host) {
    if (!host) {
        host = DefaultAuthorityHost;
    }
    if (new RegExp(`${tenantId}/?$`).test(host)) {
        return host;
    }
    if (host.endsWith("/")) {
        return host + tenantId;
    }
    else {
        return `${host}/${tenantId}`;
    }
}
/**
 * Generates the known authorities.
 * If the Tenant Id is `adfs`, the authority can't be validated since the format won't match the expected one.
 * For that reason, we have to force MSAL to disable validating the authority
 * by sending it within the known authorities in the MSAL configuration.
 * @internal
 */
export function getKnownAuthorities(tenantId, authorityHost) {
    if (tenantId === "adfs" && authorityHost) {
        return [authorityHost];
    }
    return [];
}
/**
 * Generates a logger that can be passed to the MSAL clients.
 * @param logger - The logger of the credential.
 * @internal
 */
export const defaultLoggerCallback = (logger, platform = isNode ? "Node" : "Browser") => (level, message, containsPii) => {
    if (containsPii) {
        return;
    }
    switch (level) {
        case msalCommon.LogLevel.Error:
            logger.info(`MSAL ${platform} V2 error: ${message}`);
            return;
        case msalCommon.LogLevel.Info:
            logger.info(`MSAL ${platform} V2 info message: ${message}`);
            return;
        case msalCommon.LogLevel.Verbose:
            logger.info(`MSAL ${platform} V2 verbose message: ${message}`);
            return;
        case msalCommon.LogLevel.Warning:
            logger.info(`MSAL ${platform} V2 warning: ${message}`);
            return;
    }
};
/**
 * The common utility functions for the MSAL clients.
 * Defined as a class so that the classes extending this one can have access to its methods and protected properties.
 *
 * It keeps track of a logger and an in-memory copy of the AuthenticationRecord.
 *
 * @internal
 */
export class MsalBaseUtilities {
    constructor(options) {
        this.logger = options.logger;
        this.account = options.authenticationRecord;
    }
    /**
     * Generates a UUID
     */
    generateUuid() {
        return uuidv4();
    }
    /**
     * Handles the MSAL authentication result.
     * If the result has an account, we update the local account reference.
     * If the token received is invalid, an error will be thrown depending on what's missing.
     */
    handleResult(scopes, clientId, result, getTokenOptions) {
        if (result === null || result === void 0 ? void 0 : result.account) {
            this.account = msalToPublic(clientId, result.account);
        }
        ensureValidMsalToken(scopes, this.logger, result, getTokenOptions);
        this.logger.getToken.info(formatSuccess(scopes));
        return {
            token: result.accessToken,
            expiresOnTimestamp: result.expiresOn.getTime(),
        };
    }
    /**
     * Handles MSAL errors.
     */
    handleError(scopes, error, getTokenOptions) {
        if (error.name === "AuthError" ||
            error.name === "ClientAuthError" ||
            error.name === "BrowserAuthError") {
            const msalError = error;
            switch (msalError.errorCode) {
                case "endpoints_resolution_error":
                    this.logger.info(formatError(scopes, error.message));
                    return new CredentialUnavailableError(error.message);
                case "device_code_polling_cancelled":
                    return new AbortError("The authentication has been aborted by the caller.");
                case "consent_required":
                case "interaction_required":
                case "login_required":
                    this.logger.info(formatError(scopes, `Authentication returned errorCode ${msalError.errorCode}`));
                    break;
                default:
                    this.logger.info(formatError(scopes, `Failed to acquire token: ${error.message}`));
                    break;
            }
        }
        if (error.name === "ClientConfigurationError" ||
            error.name === "BrowserConfigurationAuthError" ||
            error.name === "AbortError") {
            return error;
        }
        return new AuthenticationRequiredError({ scopes, getTokenOptions, message: error.message });
    }
}
// transformations.ts
export function publicToMsal(account) {
    const [environment] = account.authority.match(/([a-z]*\.[a-z]*\.[a-z]*)/) || [];
    return Object.assign(Object.assign({}, account), { localAccountId: account.homeAccountId, environment });
}
export function msalToPublic(clientId, account) {
    const record = {
        authority: getAuthority(account.tenantId, account.environment),
        homeAccountId: account.homeAccountId,
        tenantId: account.tenantId || DefaultTenantId,
        username: account.username,
        clientId,
        version: LatestAuthenticationRecordVersion,
    };
    return record;
}
/**
 * Serializes an `AuthenticationRecord` into a string.
 *
 * The output of a serialized authentication record will contain the following properties:
 *
 * - "authority"
 * - "homeAccountId"
 * - "clientId"
 * - "tenantId"
 * - "username"
 * - "version"
 *
 * To later convert this string to a serialized `AuthenticationRecord`, please use the exported function `deserializeAuthenticationRecord()`.
 */
export function serializeAuthenticationRecord(record) {
    return JSON.stringify(record);
}
/**
 * Deserializes a previously serialized authentication record from a string into an object.
 *
 * The input string must contain the following properties:
 *
 * - "authority"
 * - "homeAccountId"
 * - "clientId"
 * - "tenantId"
 * - "username"
 * - "version"
 *
 * If the version we receive is unsupported, an error will be thrown.
 *
 * At the moment, the only available version is: "1.0", which is always set when the authentication record is serialized.
 *
 * @param serializedRecord - Authentication record previously serialized into string.
 * @returns AuthenticationRecord.
 */
export function deserializeAuthenticationRecord(serializedRecord) {
    const parsed = JSON.parse(serializedRecord);
    if (parsed.version && parsed.version !== LatestAuthenticationRecordVersion) {
        throw Error("Unsupported AuthenticationRecord version");
    }
    return parsed;
}
//# sourceMappingURL=utils.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { credentialLogger } from "../../util/logging";
import { MsalNode } from "./msalNodeCommon";
/**
 * This MSAL client sets up a web server to listen for redirect callbacks, then calls to the MSAL's public application's `acquireTokenByDeviceCode` during `doGetToken`
 * to trigger the authentication flow, and then respond based on the values obtained from the redirect callback
 * @internal
 */
export class MsalAuthorizationCode extends MsalNode {
    constructor(options) {
        super(options);
        this.logger = credentialLogger("Node.js MSAL Authorization Code");
        this.redirectUri = options.redirectUri;
        this.authorizationCode = options.authorizationCode;
        if (options.clientSecret) {
            this.msalConfig.auth.clientSecret = options.clientSecret;
        }
    }
    async getAuthCodeUrl(options) {
        await this.init();
        return (this.confidentialApp || this.publicApp).getAuthCodeUrl(options);
    }
    async doGetToken(scopes, options) {
        var _a;
        try {
            const result = await ((_a = (this.confidentialApp || this.publicApp)) === null || _a === void 0 ? void 0 : _a.acquireTokenByCode({
                scopes,
                redirectUri: this.redirectUri,
                code: this.authorizationCode,
                correlationId: options === null || options === void 0 ? void 0 : options.correlationId,
                authority: options === null || options === void 0 ? void 0 : options.authority,
                claims: options === null || options === void 0 ? void 0 : options.claims,
            }));
            // The Client Credential flow does not return an account,
            // so each time getToken gets called, we will have to acquire a new token through the service.
            return this.handleResult(scopes, this.clientId, result || undefined);
        }
        catch (err) {
            throw this.handleError(scopes, err, options);
        }
    }
}
//# sourceMappingURL=msalAuthorizationCode.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { isError } from "@azure/core-util";
import { MsalNode } from "./msalNodeCommon";
/**
 * MSAL client assertion client. Calls to MSAL's confidential application's `acquireTokenByClientCredential` during `doGetToken`.
 * @internal
 */
export class MsalClientAssertion extends MsalNode {
    constructor(options) {
        super(options);
        this.requiresConfidential = true;
        this.getAssertion = options.getAssertion;
    }
    async doGetToken(scopes, options = {}) {
        try {
            const assertion = await this.getAssertion();
            const result = await this.confidentialApp.acquireTokenByClientCredential({
                scopes,
                correlationId: options.correlationId,
                azureRegion: this.azureRegion,
                authority: options.authority,
                claims: options.claims,
                clientAssertion: assertion,
            });
            // The Client Credential flow does not return an account,
            // so each time getToken gets called, we will have to acquire a new token through the service.
            return this.handleResult(scopes, this.clientId, result || undefined);
        }
        catch (err) {
            let err2 = err;
            if (err === null || err === undefined) {
                err2 = new Error(JSON.stringify(err));
            }
            else {
                err2 = isError(err) ? err : new Error(String(err));
            }
            throw this.handleError(scopes, err2, options);
        }
    }
}
//# sourceMappingURL=msalClientAssertion.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { readFile } from "fs";
import { createHash } from "crypto";
import { promisify } from "util";
import { MsalNode } from "./msalNodeCommon";
import { formatError } from "../../util/logging";
const readFileAsync = promisify(readFile);
/**
 * Tries to asynchronously load a certificate from the given path.
 *
 * @param configuration - Either the PEM value or the path to the certificate.
 * @param sendCertificateChain - Option to include x5c header for SubjectName and Issuer name authorization.
 * @returns - The certificate parts, or `undefined` if the certificate could not be loaded.
 * @internal
 */
export async function parseCertificate(configuration, sendCertificateChain) {
    const certificateParts = {};
    const certificate = configuration
        .certificate;
    const certificatePath = configuration
        .certificatePath;
    certificateParts.certificateContents =
        certificate || (await readFileAsync(certificatePath, "utf8"));
    if (sendCertificateChain) {
        certificateParts.x5c = certificateParts.certificateContents;
    }
    const certificatePattern = /(-+BEGIN CERTIFICATE-+)(\n\r?|\r\n?)([A-Za-z0-9+/\n\r]+=*)(\n\r?|\r\n?)(-+END CERTIFICATE-+)/g;
    const publicKeys = [];
    // Match all possible certificates, in the order they are in the file. These will form the chain that is used for x5c
    let match;
    do {
        match = certificatePattern.exec(certificateParts.certificateContents);
        if (match) {
            publicKeys.push(match[3]);
        }
    } while (match);
    if (publicKeys.length === 0) {
        throw new Error("The file at the specified path does not contain a PEM-encoded certificate.");
    }
    certificateParts.thumbprint = createHash("sha1")
        .update(Buffer.from(publicKeys[0], "base64"))
        .digest("hex")
        .toUpperCase();
    return certificateParts;
}
/**
 * MSAL client certificate client. Calls to MSAL's confidential application's `acquireTokenByClientCredential` during `doGetToken`.
 * @internal
 */
export class MsalClientCertificate extends MsalNode {
    constructor(options) {
        super(options);
        this.requiresConfidential = true;
        this.configuration = options.configuration;
        this.sendCertificateChain = options.sendCertificateChain;
    }
    // Changing the MSAL configuration asynchronously
    async init(options) {
        try {
            const parts = await parseCertificate(this.configuration, this.sendCertificateChain);
            this.msalConfig.auth.clientCertificate = {
                thumbprint: parts.thumbprint,
                privateKey: parts.certificateContents,
                x5c: parts.x5c,
            };
        }
        catch (error) {
            this.logger.info(formatError("", error));
            throw error;
        }
        return super.init(options);
    }
    async doGetToken(scopes, options = {}) {
        try {
            const clientCredReq = {
                scopes,
                correlationId: options.correlationId,
                azureRegion: this.azureRegion,
                authority: options.authority,
                claims: options.claims,
            };
            const result = await this.confidentialApp.acquireTokenByClientCredential(clientCredReq);
            // Even though we're providing the same default in memory persistence cache that we use for DeviceCodeCredential,
            // The Client Credential flow does not return the account information from the authentication service,
            // so each time getToken gets called, we will have to acquire a new token through the service.
            return this.handleResult(scopes, this.clientId, result || undefined);
        }
        catch (err) {
            throw this.handleError(scopes, err, options);
        }
    }
}
//# sourceMappingURL=msalClientCertificate.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { MsalNode } from "./msalNodeCommon";
/**
 * MSAL client secret client. Calls to MSAL's confidential application's `acquireTokenByClientCredential` during `doGetToken`.
 * @internal
 */
export class MsalClientSecret extends MsalNode {
    constructor(options) {
        super(options);
        this.requiresConfidential = true;
        this.msalConfig.auth.clientSecret = options.clientSecret;
    }
    async doGetToken(scopes, options = {}) {
        try {
            const result = await this.confidentialApp.acquireTokenByClientCredential({
                scopes,
                correlationId: options.correlationId,
                azureRegion: this.azureRegion,
                authority: options.authority,
                claims: options.claims,
            });
            // The Client Credential flow does not return an account,
            // so each time getToken gets called, we will have to acquire a new token through the service.
            return this.handleResult(scopes, this.clientId, result || undefined);
        }
        catch (err) {
            throw this.handleError(scopes, err, options);
        }
    }
}
//# sourceMappingURL=msalClientSecret.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { MsalNode } from "./msalNodeCommon";
/**
 * MSAL device code client. Calls to the MSAL's public application's `acquireTokenByDeviceCode` during `doGetToken`.
 * @internal
 */
export class MsalDeviceCode extends MsalNode {
    constructor(options) {
        super(options);
        this.userPromptCallback = options.userPromptCallback;
    }
    async doGetToken(scopes, options) {
        try {
            const requestOptions = {
                deviceCodeCallback: this.userPromptCallback,
                scopes,
                cancel: false,
                correlationId: options === null || options === void 0 ? void 0 : options.correlationId,
                authority: options === null || options === void 0 ? void 0 : options.authority,
                claims: options === null || options === void 0 ? void 0 : options.claims,
            };
            const promise = this.publicApp.acquireTokenByDeviceCode(requestOptions);
            const deviceResponse = await this.withCancellation(promise, options === null || options === void 0 ? void 0 : options.abortSignal, () => {
                requestOptions.cancel = true;
            });
            return this.handleResult(scopes, this.clientId, deviceResponse || undefined);
        }
        catch (error) {
            throw this.handleError(scopes, error, options);
        }
    }
}
//# sourceMappingURL=msalDeviceCode.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import * as msalNode from "@azure/msal-node";
import { IdentityClient } from "../../client/identityClient";
import { DeveloperSignOnClientId } from "../../constants";
import { resolveTenantId } from "../../util/resolveTenantId";
import { AuthenticationRequiredError } from "../../errors";
import { MsalBaseUtilities, defaultLoggerCallback, getAuthority, getKnownAuthorities, msalToPublic, publicToMsal, } from "../utils";
import { processMultiTenantRequest } from "../../util/validateMultiTenant";
import { RegionalAuthority } from "../../regionalAuthority";
/**
 * The current persistence provider, undefined by default.
 * @internal
 */
let persistenceProvider = undefined;
/**
 * An object that allows setting the persistence provider.
 * @internal
 */
export const msalNodeFlowCacheControl = {
    setPersistence(pluginProvider) {
        persistenceProvider = pluginProvider;
    },
};
/**
 * MSAL partial base client for Node.js.
 *
 * It completes the input configuration with some default values.
 * It also provides with utility protected methods that can be used from any of the clients,
 * which includes handlers for successful responses and errors.
 *
 * @internal
 */
export class MsalNode extends MsalBaseUtilities {
    constructor(options) {
        var _a, _b, _c;
        super(options);
        this.requiresConfidential = false;
        this.msalConfig = this.defaultNodeMsalConfig(options);
        this.tenantId = resolveTenantId(options.logger, options.tenantId, options.clientId);
        this.clientId = this.msalConfig.auth.clientId;
        if (options === null || options === void 0 ? void 0 : options.getAssertion) {
            this.getAssertion = options.getAssertion;
        }
        // If persistence has been configured
        if (persistenceProvider !== undefined && ((_a = options.tokenCachePersistenceOptions) === null || _a === void 0 ? void 0 : _a.enabled)) {
            this.createCachePlugin = () => persistenceProvider(options.tokenCachePersistenceOptions);
        }
        else if ((_b = options.tokenCachePersistenceOptions) === null || _b === void 0 ? void 0 : _b.enabled) {
            throw new Error([
                "Persistent token caching was requested, but no persistence provider was configured.",
                "You must install the identity-cache-persistence plugin package (`npm install --save @azure/identity-cache-persistence`)",
                "and enable it by importing `useIdentityPlugin` from `@azure/identity` and calling",
                "`useIdentityPlugin(cachePersistencePlugin)` before using `tokenCachePersistenceOptions`.",
            ].join(" "));
        }
        this.azureRegion = (_c = options.regionalAuthority) !== null && _c !== void 0 ? _c : process.env.AZURE_REGIONAL_AUTHORITY_NAME;
        if (this.azureRegion === RegionalAuthority.AutoDiscoverRegion) {
            this.azureRegion = "AUTO_DISCOVER";
        }
    }
    /**
     * Generates a MSAL configuration that generally works for Node.js
     */
    defaultNodeMsalConfig(options) {
        const clientId = options.clientId || DeveloperSignOnClientId;
        const tenantId = resolveTenantId(options.logger, options.tenantId, options.clientId);
        this.authorityHost = options.authorityHost || process.env.AZURE_AUTHORITY_HOST;
        const authority = getAuthority(tenantId, this.authorityHost);
        this.identityClient = new IdentityClient(Object.assign(Object.assign({}, options.tokenCredentialOptions), { authorityHost: authority, loggingOptions: options.loggingOptions }));
        let clientCapabilities = ["cp1"];
        if (process.env.AZURE_IDENTITY_DISABLE_CP1) {
            clientCapabilities = [];
        }
        return {
            auth: {
                clientId,
                authority,
                knownAuthorities: getKnownAuthorities(tenantId, authority),
                clientCapabilities,
            },
            // Cache is defined in this.prepare();
            system: {
                networkClient: this.identityClient,
                loggerOptions: {
                    loggerCallback: defaultLoggerCallback(options.logger),
                },
            },
        };
    }
    /**
     * Prepares the MSAL applications.
     */
    async init(options) {
        if (options === null || options === void 0 ? void 0 : options.abortSignal) {
            options.abortSignal.addEventListener("abort", () => {
                // This will abort any pending request in the IdentityClient,
                // based on the received or generated correlationId
                this.identityClient.abortRequests(options.correlationId);
            });
        }
        if (this.publicApp || this.confidentialApp) {
            return;
        }
        if (this.createCachePlugin !== undefined) {
            this.msalConfig.cache = {
                cachePlugin: await this.createCachePlugin(),
            };
        }
        this.publicApp = new msalNode.PublicClientApplication(this.msalConfig);
        if (this.getAssertion) {
            this.msalConfig.auth.clientAssertion = await this.getAssertion();
        }
        // The confidential client requires either a secret, assertion or certificate.
        if (this.msalConfig.auth.clientSecret ||
            this.msalConfig.auth.clientAssertion ||
            this.msalConfig.auth.clientCertificate) {
            this.confidentialApp = new msalNode.ConfidentialClientApplication(this.msalConfig);
        }
        else {
            if (this.requiresConfidential) {
                throw new Error("Unable to generate the MSAL confidential client. Missing either the client's secret, certificate or assertion.");
            }
        }
    }
    /**
     * Allows the cancellation of a MSAL request.
     */
    withCancellation(promise, abortSignal, onCancel) {
        return new Promise((resolve, reject) => {
            promise
                .then((msalToken) => {
                return resolve(msalToken);
            })
                .catch(reject);
            if (abortSignal) {
                abortSignal.addEventListener("abort", () => {
                    onCancel === null || onCancel === void 0 ? void 0 : onCancel();
                });
            }
        });
    }
    /**
     * Returns the existing account, attempts to load the account from MSAL.
     */
    async getActiveAccount() {
        var _a, _b, _c;
        if (this.account) {
            return this.account;
        }
        const cache = (_b = (_a = this.confidentialApp) === null || _a === void 0 ? void 0 : _a.getTokenCache()) !== null && _b !== void 0 ? _b : (_c = this.publicApp) === null || _c === void 0 ? void 0 : _c.getTokenCache();
        const accountsByTenant = await (cache === null || cache === void 0 ? void 0 : cache.getAllAccounts());
        if (!accountsByTenant) {
            return;
        }
        if (accountsByTenant.length === 1) {
            this.account = msalToPublic(this.clientId, accountsByTenant[0]);
        }
        else {
            this.logger
                .info(`More than one account was found authenticated for this Client ID and Tenant ID.
However, no "authenticationRecord" has been provided for this credential,
therefore we're unable to pick between these accounts.
A new login attempt will be requested, to ensure the correct account is picked.
To work with multiple accounts for the same Client ID and Tenant ID, please provide an "authenticationRecord" when initializing a credential to prevent this from happening.`);
            return;
        }
        return this.account;
    }
    /**
     * Attempts to retrieve a token from cache.
     */
    async getTokenSilent(scopes, options) {
        var _a, _b;
        await this.getActiveAccount();
        if (!this.account) {
            throw new AuthenticationRequiredError({
                scopes,
                getTokenOptions: options,
                message: "Silent authentication failed. We couldn't retrieve an active account from the cache.",
            });
        }
        const silentRequest = {
            // To be able to re-use the account, the Token Cache must also have been provided.
            account: publicToMsal(this.account),
            correlationId: options === null || options === void 0 ? void 0 : options.correlationId,
            scopes,
            authority: options === null || options === void 0 ? void 0 : options.authority,
            claims: options === null || options === void 0 ? void 0 : options.claims,
        };
        try {
            this.logger.info("Attempting to acquire token silently");
            const response = (_b = (await ((_a = this.confidentialApp) === null || _a === void 0 ? void 0 : _a.acquireTokenSilent(silentRequest)))) !== null && _b !== void 0 ? _b : (await this.publicApp.acquireTokenSilent(silentRequest));
            return this.handleResult(scopes, this.clientId, response || undefined);
        }
        catch (err) {
            throw this.handleError(scopes, err, options);
        }
    }
    /**
     * Wrapper around each MSAL flow get token operation: doGetToken.
     * If disableAutomaticAuthentication is sent through the constructor, it will prevent MSAL from requesting the user input.
     */
    async getToken(scopes, options = {}) {
        const tenantId = processMultiTenantRequest(this.tenantId, options) || this.tenantId;
        options.authority = getAuthority(tenantId, this.authorityHost);
        options.correlationId = (options === null || options === void 0 ? void 0 : options.correlationId) || this.generateUuid();
        await this.init(options);
        try {
            // MSAL now caches tokens based on their claims,
            // so now one has to keep track fo claims in order to retrieve the newer tokens from acquireTokenSilent
            // This update happened on PR: https://github.com/AzureAD/microsoft-authentication-library-for-js/pull/4533
            const optionsClaims = options.claims;
            if (optionsClaims) {
                this.cachedClaims = optionsClaims;
            }
            if (this.cachedClaims && !optionsClaims) {
                options.claims = this.cachedClaims;
            }
            // We don't return the promise since we want to catch errors right here.
            return await this.getTokenSilent(scopes, options);
        }
        catch (err) {
            if (err.name !== "AuthenticationRequiredError") {
                throw err;
            }
            if (options === null || options === void 0 ? void 0 : options.disableAutomaticAuthentication) {
                throw new AuthenticationRequiredError({
                    scopes,
                    getTokenOptions: options,
                    message: "Automatic authentication has been disabled. You may call the authentication() method.",
                });
            }
            this.logger.info(`Silent authentication failed, falling back to interactive method.`);
            return this.doGetToken(scopes, options);
        }
    }
}
//# sourceMappingURL=msalNodeCommon.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { formatError } from "../../util/logging";
import { parseCertificate } from "./msalClientCertificate";
import { MsalNode } from "./msalNodeCommon";
/**
 * MSAL on behalf of flow. Calls to MSAL's confidential application's `acquireTokenOnBehalfOf` during `doGetToken`.
 * @internal
 */
export class MsalOnBehalfOf extends MsalNode {
    constructor(options) {
        super(options);
        this.logger.info("Initialized MSAL's On-Behalf-Of flow");
        this.requiresConfidential = true;
        this.userAssertionToken = options.userAssertionToken;
        this.certificatePath = options.certificatePath;
        this.sendCertificateChain = options.sendCertificateChain;
        this.clientSecret = options.clientSecret;
    }
    // Changing the MSAL configuration asynchronously
    async init(options) {
        if (this.certificatePath) {
            try {
                const parts = await parseCertificate({ certificatePath: this.certificatePath }, this.sendCertificateChain);
                this.msalConfig.auth.clientCertificate = {
                    thumbprint: parts.thumbprint,
                    privateKey: parts.certificateContents,
                    x5c: parts.x5c,
                };
            }
            catch (error) {
                this.logger.info(formatError("", error));
                throw error;
            }
        }
        else {
            this.msalConfig.auth.clientSecret = this.clientSecret;
        }
        return super.init(options);
    }
    async doGetToken(scopes, options = {}) {
        try {
            const result = await this.confidentialApp.acquireTokenOnBehalfOf({
                scopes,
                correlationId: options.correlationId,
                authority: options.authority,
                claims: options.claims,
                oboAssertion: this.userAssertionToken,
            });
            return this.handleResult(scopes, this.clientId, result || undefined);
        }
        catch (err) {
            throw this.handleError(scopes, err, options);
        }
    }
}
//# sourceMappingURL=msalOnBehalfOf.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import * as msalNode from "@azure/msal-node";
import http from "http";
import open from "open";
import stoppable from "stoppable";
import { credentialLogger, formatError, formatSuccess } from "../../util/logging";
import { CredentialUnavailableError } from "../../errors";
import { MsalNode } from "./msalNodeCommon";
import { msalToPublic } from "../utils";
/**
 * A call to open(), but mockable
 * @internal
 */
export const interactiveBrowserMockable = {
    open,
};
/**
 * This MSAL client sets up a web server to listen for redirect callbacks, then calls to the MSAL's public application's `acquireTokenByDeviceCode` during `doGetToken`
 * to trigger the authentication flow, and then respond based on the values obtained from the redirect callback
 * @internal
 */
export class MsalOpenBrowser extends MsalNode {
    constructor(options) {
        super(options);
        this.logger = credentialLogger("Node.js MSAL Open Browser");
        this.redirectUri = options.redirectUri;
        this.loginHint = options.loginHint;
        const url = new URL(this.redirectUri);
        this.port = parseInt(url.port);
        if (isNaN(this.port)) {
            this.port = 80;
        }
        this.hostname = url.hostname;
    }
    async acquireTokenByCode(request) {
        return this.publicApp.acquireTokenByCode(request);
    }
    doGetToken(scopes, options) {
        return new Promise((resolve, reject) => {
            const socketToDestroy = [];
            const requestListener = (req, res) => {
                var _a;
                if (!req.url) {
                    reject(new Error(`Interactive Browser Authentication Error "Did not receive token with a valid expiration"`));
                    return;
                }
                let url;
                try {
                    url = new URL(req.url, this.redirectUri);
                }
                catch (e) {
                    reject(new Error(`Interactive Browser Authentication Error "Did not receive token with a valid expiration"`));
                    return;
                }
                const tokenRequest = {
                    code: url.searchParams.get("code"),
                    redirectUri: this.redirectUri,
                    scopes: scopes,
                    authority: options === null || options === void 0 ? void 0 : options.authority,
                    codeVerifier: (_a = this.pkceCodes) === null || _a === void 0 ? void 0 : _a.verifier,
                };
                this.acquireTokenByCode(tokenRequest)
                    .then((authResponse) => {
                    if (authResponse === null || authResponse === void 0 ? void 0 : authResponse.account) {
                        this.account = msalToPublic(this.clientId, authResponse.account);
                    }
                    const successMessage = `Authentication Complete. You can close the browser and return to the application.`;
                    if (authResponse && authResponse.expiresOn) {
                        const expiresOnTimestamp = authResponse === null || authResponse === void 0 ? void 0 : authResponse.expiresOn.valueOf();
                        res.writeHead(200);
                        res.end(successMessage);
                        this.logger.getToken.info(formatSuccess(scopes));
                        resolve({
                            expiresOnTimestamp,
                            token: authResponse.accessToken,
                        });
                    }
                    else {
                        const errorMessage = formatError(scopes, `${url.searchParams.get("error")}. ${url.searchParams.get("error_description")}`);
                        res.writeHead(500);
                        res.end(errorMessage);
                        this.logger.getToken.info(errorMessage);
                        reject(new Error(`Interactive Browser Authentication Error "Did not receive token with a valid expiration"`));
                    }
                    cleanup();
                    return;
                })
                    .catch(() => {
                    const errorMessage = formatError(scopes, `${url.searchParams.get("error")}. ${url.searchParams.get("error_description")}`);
                    res.writeHead(500);
                    res.end(errorMessage);
                    this.logger.getToken.info(errorMessage);
                    reject(new Error(`Interactive Browser Authentication Error "Did not receive token with a valid expiration"`));
                    cleanup();
                });
            };
            const app = http.createServer(requestListener);
            const server = stoppable(app);
            const listen = app.listen(this.port, this.hostname, () => this.logger.info(`InteractiveBrowserCredential listening on port ${this.port}!`));
            function cleanup() {
                if (listen) {
                    listen.close();
                }
                for (const socket of socketToDestroy) {
                    socket.destroy();
                }
                if (server) {
                    server.close();
                    server.stop();
                }
            }
            app.on("connection", (socket) => socketToDestroy.push(socket));
            app.on("error", (err) => {
                cleanup();
                const code = err.code;
                if (code === "EACCES" || code === "EADDRINUSE") {
                    reject(new CredentialUnavailableError([
                        `InteractiveBrowserCredential: Access denied to port ${this.port}.`,
                        `Try sending a redirect URI with a different port, as follows:`,
                        '`new InteractiveBrowserCredential({ redirectUri: "http://localhost:1337" })`',
                    ].join(" ")));
                }
                else {
                    reject(new CredentialUnavailableError(`InteractiveBrowserCredential: Failed to start the necessary web server. Error: ${err.message}`));
                }
            });
            app.on("listening", () => {
                const openPromise = this.openAuthCodeUrl(scopes, options);
                const abortSignal = options === null || options === void 0 ? void 0 : options.abortSignal;
                if (abortSignal) {
                    abortSignal.addEventListener("abort", () => {
                        cleanup();
                        reject(new Error("Aborted"));
                    });
                }
                openPromise.then().catch((e) => {
                    cleanup();
                    reject(e);
                });
            });
        });
    }
    async openAuthCodeUrl(scopeArray, options) {
        // Initialize CryptoProvider instance
        const cryptoProvider = new msalNode.CryptoProvider();
        // Generate PKCE Codes before starting the authorization flow
        this.pkceCodes = await cryptoProvider.generatePkceCodes();
        const authCodeUrlParameters = {
            scopes: scopeArray,
            correlationId: options === null || options === void 0 ? void 0 : options.correlationId,
            redirectUri: this.redirectUri,
            authority: options === null || options === void 0 ? void 0 : options.authority,
            claims: options === null || options === void 0 ? void 0 : options.claims,
            loginHint: this.loginHint,
            codeChallenge: this.pkceCodes.challenge,
            codeChallengeMethod: "S256", // Use SHA256 Algorithm
        };
        const response = await this.publicApp.getAuthCodeUrl(authCodeUrlParameters);
        try {
            // A new instance on macOS only which allows it to not hang, does not fix the issue on linux
            await interactiveBrowserMockable.open(response, { wait: true, newInstance: true });
        }
        catch (e) {
            throw new CredentialUnavailableError(`InteractiveBrowserCredential: Could not open a browser window. Error: ${e.message}`);
        }
    }
}
//# sourceMappingURL=msalOpenBrowser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { MsalNode } from "./msalNodeCommon";
/**
 * MSAL username and password client. Calls to the MSAL's public application's `acquireTokenByUsernamePassword` during `doGetToken`.
 * @internal
 */
export class MsalUsernamePassword extends MsalNode {
    constructor(options) {
        super(options);
        this.username = options.username;
        this.password = options.password;
    }
    async doGetToken(scopes, options) {
        try {
            const requestOptions = {
                scopes,
                username: this.username,
                password: this.password,
                correlationId: options === null || options === void 0 ? void 0 : options.correlationId,
                authority: options === null || options === void 0 ? void 0 : options.authority,
                claims: options === null || options === void 0 ? void 0 : options.claims,
            };
            const result = await this.publicApp.acquireTokenByUsernamePassword(requestOptions);
            return this.handleResult(scopes, this.clientId, result || undefined);
        }
        catch (error) {
            throw this.handleError(scopes, error, options);
        }
    }
}
//# sourceMappingURL=msalUsernamePassword.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=tokenCachePersistenceOptions.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import * as msalBrowser from "@azure/msal-browser";
import { AuthenticationRequiredError } from "../../errors";
import { defaultLoggerCallback, msalToPublic, publicToMsal } from "../utils";
import { MsalBrowser } from "./msalBrowserCommon";
// We keep a copy of the redirect hash.
const redirectHash = self.location.hash;
/**
 * Uses MSAL Browser 2.X for browser authentication,
 * which uses the [Auth Code Flow](https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow).
 * @internal
 */
export class MSALAuthCode extends MsalBrowser {
    /**
     * Sets up an MSAL object based on the given parameters.
     * MSAL with Auth Code allows sending a previously obtained `authenticationRecord` through the optional parameters,
     * which is set to be the active account.
     * @param options - Parameters necessary and otherwise used to create the MSAL object.
     */
    constructor(options) {
        super(options);
        this.loginHint = options.loginHint;
        this.msalConfig.cache = {
            cacheLocation: "sessionStorage",
            storeAuthStateInCookie: true, // Set to true to improve the experience on IE11 and Edge.
        };
        this.msalConfig.system = {
            loggerOptions: {
                loggerCallback: defaultLoggerCallback(this.logger, "Browser"),
            },
        };
        // Preparing the MSAL application.
        this.app = new msalBrowser.PublicClientApplication(this.msalConfig);
        if (this.account) {
            this.app.setActiveAccount(publicToMsal(this.account));
        }
    }
    /**
     * Loads the account based on the result of the authentication.
     * If no result was received, tries to load the account from the cache.
     * @param result - Result object received from MSAL.
     */
    async handleBrowserResult(result) {
        try {
            if (result && result.account) {
                this.logger.info(`MSAL Browser V2 authentication successful.`);
                this.app.setActiveAccount(result.account);
                return msalToPublic(this.clientId, result.account);
            }
            // If by this point we happen to have an active account, we should stop trying to parse this.
            const activeAccount = await this.app.getActiveAccount();
            if (activeAccount) {
                return msalToPublic(this.clientId, activeAccount);
            }
            // If we don't have an active account, we try to activate it from all the already loaded accounts.
            const accounts = this.app.getAllAccounts();
            if (accounts.length > 1) {
                // If there's more than one account in memory, we force the user to authenticate again.
                // At this point we can't identify which account should this credential work with,
                // since at this point the user won't have provided enough information.
                // We log a message in case that helps.
                this.logger.info(`More than one account was found authenticated for this Client ID and Tenant ID.
However, no "authenticationRecord" has been provided for this credential,
therefore we're unable to pick between these accounts.
A new login attempt will be requested, to ensure the correct account is picked.
To work with multiple accounts for the same Client ID and Tenant ID, please provide an "authenticationRecord" when initializing "InteractiveBrowserCredential".`);
                // To safely trigger a new login, we're also ensuring the local cache is cleared up for this MSAL object.
                // However, we want to avoid kicking the user out of their authentication on the Azure side.
                // We do this by calling to logout while specifying a `onRedirectNavigate` that returns false.
                await this.app.logout({
                    onRedirectNavigate: () => false,
                });
                return;
            }
            // If there's only one account for this MSAL object, we can safely activate it.
            if (accounts.length === 1) {
                const account = accounts[0];
                this.app.setActiveAccount(account);
                return msalToPublic(this.clientId, account);
            }
            this.logger.info(`No accounts were found through MSAL.`);
        }
        catch (e) {
            this.logger.info(`Failed to acquire token through MSAL. ${e.message}`);
        }
        return;
    }
    /**
     * Uses MSAL to handle the redirect.
     */
    async handleRedirect() {
        return this.handleBrowserResult((await this.app.handleRedirectPromise(redirectHash)) || undefined);
    }
    /**
     * Uses MSAL to trigger a redirect or a popup login.
     */
    async login(scopes = []) {
        const arrayScopes = Array.isArray(scopes) ? scopes : [scopes];
        const loginRequest = {
            scopes: arrayScopes,
            loginHint: this.loginHint,
        };
        switch (this.loginStyle) {
            case "redirect": {
                await this.app.loginRedirect(loginRequest);
                return;
            }
            case "popup":
                return this.handleBrowserResult(await this.app.loginPopup(loginRequest));
        }
    }
    /**
     * Uses MSAL to retrieve the active account.
     */
    async getActiveAccount() {
        const account = this.app.getActiveAccount();
        if (!account) {
            return;
        }
        return msalToPublic(this.clientId, account);
    }
    /**
     * Attempts to retrieve a token from cache.
     */
    async getTokenSilent(scopes, options) {
        const account = await this.getActiveAccount();
        if (!account) {
            throw new AuthenticationRequiredError({
                scopes,
                getTokenOptions: options,
                message: "Silent authentication failed. We couldn't retrieve an active account from the cache.",
            });
        }
        const parameters = {
            authority: (options === null || options === void 0 ? void 0 : options.authority) || this.msalConfig.auth.authority,
            correlationId: options === null || options === void 0 ? void 0 : options.correlationId,
            claims: options === null || options === void 0 ? void 0 : options.claims,
            account: publicToMsal(account),
            forceRefresh: false,
            scopes,
        };
        try {
            this.logger.info("Attempting to acquire token silently");
            const response = await this.app.acquireTokenSilent(parameters);
            return this.handleResult(scopes, this.clientId, response);
        }
        catch (err) {
            throw this.handleError(scopes, err, options);
        }
    }
    /**
     * Attempts to retrieve the token in the browser.
     */
    async doGetToken(scopes, options) {
        const account = await this.getActiveAccount();
        if (!account) {
            throw new AuthenticationRequiredError({
                scopes,
                getTokenOptions: options,
                message: "Silent authentication failed. We couldn't retrieve an active account from the cache.",
            });
        }
        const parameters = {
            authority: (options === null || options === void 0 ? void 0 : options.authority) || this.msalConfig.auth.authority,
            correlationId: options === null || options === void 0 ? void 0 : options.correlationId,
            claims: options === null || options === void 0 ? void 0 : options.claims,
            account: publicToMsal(account),
            loginHint: this.loginHint,
            scopes,
        };
        switch (this.loginStyle) {
            case "redirect":
                // This will go out of the page.
                // Once the InteractiveBrowserCredential is initialized again,
                // we'll load the MSAL account in the constructor.
                await this.app.acquireTokenRedirect(parameters);
                return { token: "", expiresOnTimestamp: 0 };
            case "popup":
                return this.handleResult(scopes, this.clientId, await this.app.acquireTokenPopup(parameters));
        }
    }
}
//# sourceMappingURL=msalAuthCode.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { DefaultTenantId } from "../../constants";
import { resolveTenantId } from "../../util/resolveTenantId";
import { processMultiTenantRequest } from "../../util/validateMultiTenant";
import { AuthenticationRequiredError, CredentialUnavailableError } from "../../errors";
import { MsalBaseUtilities, getAuthority, getKnownAuthorities } from "../utils";
/**
 * Generates a MSAL configuration that generally works for browsers
 * @internal
 */
export function defaultBrowserMsalConfig(options) {
    const tenantId = options.tenantId || DefaultTenantId;
    const authority = getAuthority(tenantId, options.authorityHost);
    return {
        auth: {
            clientId: options.clientId,
            authority,
            knownAuthorities: getKnownAuthorities(tenantId, authority),
            // If the users picked redirect as their login style,
            // but they didn't provide a redirectUri,
            // we can try to use the current page we're in as a default value.
            redirectUri: options.redirectUri || self.location.origin,
        },
    };
}
/**
 * MSAL partial base client for the browsers.
 *
 * It completes the input configuration with some default values.
 * It also provides with utility protected methods that can be used from any of the clients,
 * which includes handlers for successful responses and errors.
 *
 * @internal
 */
export class MsalBrowser extends MsalBaseUtilities {
    constructor(options) {
        super(options);
        this.logger = options.logger;
        this.loginStyle = options.loginStyle;
        if (!options.clientId) {
            throw new CredentialUnavailableError("A client ID is required in browsers");
        }
        this.clientId = options.clientId;
        this.tenantId = resolveTenantId(this.logger, options.tenantId, options.clientId);
        this.authorityHost = options.authorityHost;
        this.msalConfig = defaultBrowserMsalConfig(options);
        this.disableAutomaticAuthentication = options.disableAutomaticAuthentication;
        if (options.authenticationRecord) {
            this.account = Object.assign(Object.assign({}, options.authenticationRecord), { tenantId: this.tenantId });
        }
    }
    /**
     * In the browsers we don't need to init()
     */
    async init() {
        // Nothing to do here.
    }
    /**
     * Clears MSAL's cache.
     */
    async logout() {
        var _a;
        (_a = this.app) === null || _a === void 0 ? void 0 : _a.logout();
    }
    /**
     * Attempts to retrieve an authenticated token from MSAL.
     */
    async getToken(scopes, options = {}) {
        const tenantId = processMultiTenantRequest(this.tenantId, options) || this.tenantId;
        if (!options.authority) {
            options.authority = getAuthority(tenantId, this.authorityHost);
        }
        // We ensure that redirection is handled at this point.
        await this.handleRedirect();
        if (!(await this.getActiveAccount()) && !this.disableAutomaticAuthentication) {
            await this.login(scopes);
        }
        return this.getTokenSilent(scopes).catch((err) => {
            if (err.name !== "AuthenticationRequiredError") {
                throw err;
            }
            if (options === null || options === void 0 ? void 0 : options.disableAutomaticAuthentication) {
                throw new AuthenticationRequiredError({
                    scopes,
                    getTokenOptions: options,
                    message: "Automatic authentication has been disabled. You may call the authentication() method.",
                });
            }
            this.logger.info(`Silent authentication failed, falling back to interactive method ${this.loginStyle}`);
            return this.doGetToken(scopes);
        });
    }
}
//# sourceMappingURL=msalBrowserCommon.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { credentialLogger, formatError } from "../util/logging";
const BrowserNotSupportedError = new Error("AuthorizationCodeCredential is not supported in the browser. InteractiveBrowserCredential is more appropriate for this use case.");
const logger = credentialLogger("AuthorizationCodeCredential");
export class AuthorizationCodeCredential {
    constructor() {
        logger.info(formatError("", BrowserNotSupportedError));
        throw BrowserNotSupportedError;
    }
    getToken() {
        logger.getToken.info(formatError("", BrowserNotSupportedError));
        throw BrowserNotSupportedError;
    }
}
//# sourceMappingURL=authorizationCodeCredential.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { credentialLogger } from "../util/logging";
import { checkTenantId } from "../util/checkTenantId";
import { MsalAuthorizationCode } from "../msal/nodeFlows/msalAuthorizationCode";
import { tracingClient } from "../util/tracing";
const logger = credentialLogger("AuthorizationCodeCredential");
/**
 * Enables authentication to Azure Active Directory using an authorization code
 * that was obtained through the authorization code flow, described in more detail
 * in the Azure Active Directory documentation:
 *
 * https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow
 */
export class AuthorizationCodeCredential {
    /**
     * @hidden
     * @internal
     */
    constructor(tenantId, clientId, clientSecretOrAuthorizationCode, authorizationCodeOrRedirectUri, redirectUriOrOptions, options) {
        checkTenantId(logger, tenantId);
        let clientSecret = clientSecretOrAuthorizationCode;
        if (typeof redirectUriOrOptions === "string") {
            // the clientId+clientSecret constructor
            this.authorizationCode = authorizationCodeOrRedirectUri;
            this.redirectUri = redirectUriOrOptions;
            // in this case, options are good as they come
        }
        else {
            // clientId only
            this.authorizationCode = clientSecretOrAuthorizationCode;
            this.redirectUri = authorizationCodeOrRedirectUri;
            clientSecret = undefined;
            options = redirectUriOrOptions;
        }
        this.msalFlow = new MsalAuthorizationCode(Object.assign(Object.assign({}, options), { clientSecret,
            clientId,
            tenantId, tokenCredentialOptions: options || {}, logger, redirectUri: this.redirectUri, authorizationCode: this.authorizationCode }));
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If authentication fails, a {@link CredentialUnavailableError} will be thrown with the details of the failure.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                TokenCredential implementation might make.
     */
    async getToken(scopes, options = {}) {
        return tracingClient.withSpan(`${this.constructor.name}.getToken`, options, async (newOptions) => {
            const arrayScopes = Array.isArray(scopes) ? scopes : [scopes];
            return this.msalFlow.getToken(arrayScopes, Object.assign(Object.assign({}, newOptions), { disableAutomaticAuthentication: this.disableAutomaticAuthentication }));
        });
    }
}
//# sourceMappingURL=authorizationCodeCredential.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { credentialLogger, formatError } from "../util/logging";
import { ChainedTokenCredential } from "./chainedTokenCredential";
const BrowserNotSupportedError = new Error("ApplicationCredential is not supported in the browser. Use InteractiveBrowserCredential instead.");
const logger = credentialLogger("ApplicationCredential");
/**
 * Provides a default {@link ChainedTokenCredential} configuration for
 * applications that will be deployed to Azure.
 *
 * Only available in Node.js
 */
export class AzureApplicationCredential extends ChainedTokenCredential {
    /**
     * Creates an instance of the AzureApplicationCredential class.
     *
     * The AzureApplicationCredential provides a default {@link ChainedTokenCredential} configuration for
     * applications that will be deployed to Azure.
     *
     * Only available in Node.js
     *
     * @param options - Options for configuring the client which makes the authentication request.
     */
    constructor(_tokenCredentialOptions) {
        super();
        logger.info(formatError("", BrowserNotSupportedError));
        throw BrowserNotSupportedError;
    }
    getToken() {
        logger.getToken.info(formatError("", BrowserNotSupportedError));
        throw BrowserNotSupportedError;
    }
}
//# sourceMappingURL=azureApplicationCredential.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { ChainedTokenCredential } from "./chainedTokenCredential";
import { EnvironmentCredential } from "./environmentCredential";
import { DefaultManagedIdentityCredential } from "./defaultAzureCredential";
export const AzureApplicationCredentials = [
    EnvironmentCredential,
    DefaultManagedIdentityCredential,
];
/**
 * Provides a default {@link ChainedTokenCredential} configuration that should
 * work for most applications that use the Azure SDK.
 */
export class AzureApplicationCredential extends ChainedTokenCredential {
    /**
     * Creates an instance of the AzureApplicationCredential class.
     *
     * The AzureApplicationCredential provides a default {@link ChainedTokenCredential} configuration that should
     * work for most applications deployed on Azure. The following credential types will be tried, in order:
     *
     * - {@link EnvironmentCredential}
     * - {@link ManagedIdentityCredential}
     *
     * Consult the documentation of these credential types for more information
     * on how they attempt authentication.
     *
     * @param options - Optional parameters. See {@link AzureApplicationCredentialOptions}.
     */
    constructor(options) {
        super(...AzureApplicationCredentials.map((ctor) => new ctor(options)));
        this.UnavailableMessage =
            "ApplicationCredential => failed to retrieve a token from the included credentials. To troubleshoot, visit https://aka.ms/azsdk/js/identity/applicationcredential/troubleshoot.";
    }
}
//# sourceMappingURL=azureApplicationCredential.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { credentialLogger, formatError } from "../util/logging";
const BrowserNotSupportedError = new Error("AzureCliCredential is not supported in the browser.");
const logger = credentialLogger("AzureCliCredential");
/**
 * This credential will use the currently logged-in user login information
 * via the Azure CLI ('az') commandline tool.
 */
export class AzureCliCredential {
    /**
     * Only available in Node.js
     */
    constructor() {
        logger.info(formatError("", BrowserNotSupportedError));
        throw BrowserNotSupportedError;
    }
    getToken() {
        logger.getToken.info(formatError("", BrowserNotSupportedError));
        throw BrowserNotSupportedError;
    }
}
//# sourceMappingURL=azureCliCredential.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { tracingClient } from "../util/tracing";
import { CredentialUnavailableError } from "../errors";
import { credentialLogger, formatError, formatSuccess } from "../util/logging";
import child_process from "child_process";
import { ensureValidScope, getScopeResource } from "../util/scopeUtils";
import { processMultiTenantRequest } from "../util/validateMultiTenant";
import { checkTenantId } from "../util/checkTenantId";
/**
 * Mockable reference to the CLI credential cliCredentialFunctions
 * @internal
 */
export const cliCredentialInternals = {
    /**
     * @internal
     */
    getSafeWorkingDir() {
        if (process.platform === "win32") {
            if (!process.env.SystemRoot) {
                throw new Error("Azure CLI credential expects a 'SystemRoot' environment variable");
            }
            return process.env.SystemRoot;
        }
        else {
            return "/bin";
        }
    },
    /**
     * Gets the access token from Azure CLI
     * @param resource - The resource to use when getting the token
     * @internal
     */
    async getAzureCliAccessToken(resource, tenantId) {
        let tenantSection = [];
        if (tenantId) {
            tenantSection = ["--tenant", tenantId];
        }
        return new Promise((resolve, reject) => {
            try {
                child_process.execFile("az", [
                    "account",
                    "get-access-token",
                    "--output",
                    "json",
                    "--resource",
                    resource,
                    ...tenantSection,
                ], { cwd: cliCredentialInternals.getSafeWorkingDir(), shell: true }, (error, stdout, stderr) => {
                    resolve({ stdout: stdout, stderr: stderr, error });
                });
            }
            catch (err) {
                reject(err);
            }
        });
    },
};
const logger = credentialLogger("AzureCliCredential");
/**
 * This credential will use the currently logged-in user login information
 * via the Azure CLI ('az') commandline tool.
 * To do so, it will read the user access token and expire time
 * with Azure CLI command "az account get-access-token".
 */
export class AzureCliCredential {
    /**
     * Creates an instance of the {@link AzureCliCredential}.
     *
     * To use this credential, ensure that you have already logged
     * in via the 'az' tool using the command "az login" from the commandline.
     *
     * @param options - Options, to optionally allow multi-tenant requests.
     */
    constructor(options) {
        this.tenantId = options === null || options === void 0 ? void 0 : options.tenantId;
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If authentication fails, a {@link CredentialUnavailableError} will be thrown with the details of the failure.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                TokenCredential implementation might make.
     */
    async getToken(scopes, options = {}) {
        const tenantId = processMultiTenantRequest(this.tenantId, options);
        if (tenantId) {
            checkTenantId(logger, tenantId);
        }
        const scope = typeof scopes === "string" ? scopes : scopes[0];
        logger.getToken.info(`Using the scope ${scope}`);
        ensureValidScope(scope, logger);
        const resource = getScopeResource(scope);
        return tracingClient.withSpan(`${this.constructor.name}.getToken`, options, async () => {
            var _a, _b, _c, _d;
            try {
                const obj = await cliCredentialInternals.getAzureCliAccessToken(resource, tenantId);
                const specificScope = (_a = obj.stderr) === null || _a === void 0 ? void 0 : _a.match("(.*)az login --scope(.*)");
                const isLoginError = ((_b = obj.stderr) === null || _b === void 0 ? void 0 : _b.match("(.*)az login(.*)")) && !specificScope;
                const isNotInstallError = ((_c = obj.stderr) === null || _c === void 0 ? void 0 : _c.match("az:(.*)not found")) || ((_d = obj.stderr) === null || _d === void 0 ? void 0 : _d.startsWith("'az' is not recognized"));
                if (isNotInstallError) {
                    const error = new CredentialUnavailableError("Azure CLI could not be found. Please visit https://aka.ms/azure-cli for installation instructions and then, once installed, authenticate to your Azure account using 'az login'.");
                    logger.getToken.info(formatError(scopes, error));
                    throw error;
                }
                if (isLoginError) {
                    const error = new CredentialUnavailableError("Please run 'az login' from a command prompt to authenticate before using this credential.");
                    logger.getToken.info(formatError(scopes, error));
                    throw error;
                }
                try {
                    const responseData = obj.stdout;
                    const response = JSON.parse(responseData);
                    logger.getToken.info(formatSuccess(scopes));
                    const returnValue = {
                        token: response.accessToken,
                        expiresOnTimestamp: new Date(response.expiresOn).getTime(),
                    };
                    return returnValue;
                }
                catch (e) {
                    if (obj.stderr) {
                        throw new CredentialUnavailableError(obj.stderr);
                    }
                    throw e;
                }
            }
            catch (err) {
                const error = err.name === "CredentialUnavailableError"
                    ? err
                    : new CredentialUnavailableError(err.message || "Unknown error while trying to retrieve the access token");
                logger.getToken.info(formatError(scopes, error));
                throw error;
            }
        });
    }
}
//# sourceMappingURL=azureCliCredential.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=azureCliCredentialOptions.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { credentialLogger, formatError } from "../util/logging";
const BrowserNotSupportedError = new Error("AzurePowerShellCredential is not supported in the browser.");
const logger = credentialLogger("AzurePowerShellCredential");
/**
 * This credential will use the currently-logged-in user's login information via the Azure Power Shell command line tool.
 */
export class AzurePowerShellCredential {
    /**
     * Only available in Node.js
     */
    constructor() {
        logger.info(formatError("", BrowserNotSupportedError));
        throw BrowserNotSupportedError;
    }
    getToken() {
        logger.getToken.info(formatError("", BrowserNotSupportedError));
        throw BrowserNotSupportedError;
    }
}
//# sourceMappingURL=azurePowerShellCredential.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { CredentialUnavailableError } from "../errors";
import { credentialLogger, formatError, formatSuccess } from "../util/logging";
import { tracingClient } from "../util/tracing";
import { ensureValidScope, getScopeResource } from "../util/scopeUtils";
import { processUtils } from "../util/processUtils";
import { processMultiTenantRequest } from "../util/validateMultiTenant";
import { checkTenantId } from "../util/checkTenantId";
const logger = credentialLogger("AzurePowerShellCredential");
const isWindows = process.platform === "win32";
/**
 * Returns a platform-appropriate command name by appending ".exe" on Windows.
 *
 * @internal
 */
export function formatCommand(commandName) {
    if (isWindows) {
        return `${commandName}.exe`;
    }
    else {
        return commandName;
    }
}
/**
 * Receives a list of commands to run, executes them, then returns the outputs.
 * If anything fails, an error is thrown.
 * @internal
 */
async function runCommands(commands) {
    const results = [];
    for (const command of commands) {
        const [file, ...parameters] = command;
        const result = (await processUtils.execFile(file, parameters, { encoding: "utf8" }));
        results.push(result);
    }
    return results;
}
/**
 * Known PowerShell errors
 * @internal
 */
export const powerShellErrors = {
    login: "Run Connect-AzAccount to login",
    installed: "The specified module 'Az.Accounts' with version '2.2.0' was not loaded because no valid module file was found in any module directory",
};
/**
 * Messages to use when throwing in this credential.
 * @internal
 */
export const powerShellPublicErrorMessages = {
    login: "Please run 'Connect-AzAccount' from PowerShell to authenticate before using this credential.",
    installed: `The 'Az.Account' module >= 2.2.0 is not installed. Install the Azure Az PowerShell module with: "Install-Module -Name Az -Scope CurrentUser -Repository PSGallery -Force".`,
    troubleshoot: `To troubleshoot, visit https://aka.ms/azsdk/js/identity/powershellcredential/troubleshoot.`,
};
// PowerShell Azure User not logged in error check.
const isLoginError = (err) => err.message.match(`(.*)${powerShellErrors.login}(.*)`);
// Az Module not Installed in Azure PowerShell check.
const isNotInstalledError = (err) => err.message.match(powerShellErrors.installed);
/**
 * The PowerShell commands to be tried, in order.
 *
 * @internal
 */
export const commandStack = [formatCommand("pwsh")];
if (isWindows) {
    commandStack.push(formatCommand("powershell"));
}
/**
 * This credential will use the currently logged-in user information from the
 * Azure PowerShell module. To do so, it will read the user access token and
 * expire time with Azure PowerShell command `Get-AzAccessToken -ResourceUrl {ResourceScope}`
 */
export class AzurePowerShellCredential {
    /**
     * Creates an instance of the {@link AzurePowerShellCredential}.
     *
     * To use this credential:
     * - Install the Azure Az PowerShell module with:
     *   `Install-Module -Name Az -Scope CurrentUser -Repository PSGallery -Force`.
     * - You have already logged in to Azure PowerShell using the command
     * `Connect-AzAccount` from the command line.
     *
     * @param options - Options, to optionally allow multi-tenant requests.
     */
    constructor(options) {
        this.tenantId = options === null || options === void 0 ? void 0 : options.tenantId;
    }
    /**
     * Gets the access token from Azure PowerShell
     * @param resource - The resource to use when getting the token
     */
    async getAzurePowerShellAccessToken(resource, tenantId) {
        // Clone the stack to avoid mutating it while iterating
        for (const powerShellCommand of [...commandStack]) {
            try {
                await runCommands([[powerShellCommand, "/?"]]);
            }
            catch (e) {
                // Remove this credential from the original stack so that we don't try it again.
                commandStack.shift();
                continue;
            }
            let tenantSection = "";
            if (tenantId) {
                tenantSection = `-TenantId "${tenantId}"`;
            }
            const results = await runCommands([
                [
                    powerShellCommand,
                    "-Command",
                    "Import-Module Az.Accounts -MinimumVersion 2.2.0 -PassThru",
                ],
                [
                    powerShellCommand,
                    "-Command",
                    `Get-AzAccessToken ${tenantSection} -ResourceUrl "${resource}" | ConvertTo-Json`,
                ],
            ]);
            const result = results[1];
            try {
                return JSON.parse(result);
            }
            catch (e) {
                throw new Error(`Unable to parse the output of PowerShell. Received output: ${result}`);
            }
        }
        throw new Error(`Unable to execute PowerShell. Ensure that it is installed in your system`);
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If the authentication cannot be performed through PowerShell, a {@link CredentialUnavailableError} will be thrown.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this TokenCredential implementation might make.
     */
    async getToken(scopes, options = {}) {
        return tracingClient.withSpan(`${this.constructor.name}.getToken`, options, async () => {
            const tenantId = processMultiTenantRequest(this.tenantId, options);
            if (tenantId) {
                checkTenantId(logger, tenantId);
            }
            const scope = typeof scopes === "string" ? scopes : scopes[0];
            ensureValidScope(scope, logger);
            logger.getToken.info(`Using the scope ${scope}`);
            const resource = getScopeResource(scope);
            try {
                const response = await this.getAzurePowerShellAccessToken(resource, tenantId);
                logger.getToken.info(formatSuccess(scopes));
                return {
                    token: response.Token,
                    expiresOnTimestamp: new Date(response.ExpiresOn).getTime(),
                };
            }
            catch (err) {
                if (isNotInstalledError(err)) {
                    const error = new CredentialUnavailableError(powerShellPublicErrorMessages.installed);
                    logger.getToken.info(formatError(scope, error));
                    throw error;
                }
                else if (isLoginError(err)) {
                    const error = new CredentialUnavailableError(powerShellPublicErrorMessages.login);
                    logger.getToken.info(formatError(scope, error));
                    throw error;
                }
                const error = new CredentialUnavailableError(`${err}. ${powerShellPublicErrorMessages.troubleshoot}`);
                logger.getToken.info(formatError(scope, error));
                throw error;
            }
        });
    }
}
//# sourceMappingURL=azurePowerShellCredential.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=azurePowerShellCredentialOptions.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { AggregateAuthenticationError, CredentialUnavailableError } from "../errors";
import { tracingClient } from "../util/tracing";
import { credentialLogger, formatError, formatSuccess } from "../util/logging";
/**
 * @internal
 */
export const logger = credentialLogger("ChainedTokenCredential");
/**
 * Enables multiple `TokenCredential` implementations to be tried in order
 * until one of the getToken methods returns an access token.
 */
export class ChainedTokenCredential {
    /**
     * Creates an instance of ChainedTokenCredential using the given credentials.
     *
     * @param sources - `TokenCredential` implementations to be tried in order.
     *
     * Example usage:
     * ```javascript
     * const firstCredential = new ClientSecretCredential(tenantId, clientId, clientSecret);
     * const secondCredential = new ClientSecretCredential(tenantId, anotherClientId, anotherSecret);
     * const credentialChain = new ChainedTokenCredential(firstCredential, secondCredential);
     * ```
     */
    constructor(...sources) {
        /**
         * The message to use when the chained token fails to get a token
         */
        this.UnavailableMessage = "ChainedTokenCredential => failed to retrieve a token from the included credentials";
        this._sources = [];
        this._sources = sources;
    }
    /**
     * Returns the first access token returned by one of the chained
     * `TokenCredential` implementations.  Throws an {@link AggregateAuthenticationError}
     * when one or more credentials throws an {@link AuthenticationError} and
     * no credentials have returned an access token.
     *
     * This method is called automatically by Azure SDK client libraries. You may call this method
     * directly, but you must also handle token caching and token refreshing.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                `TokenCredential` implementation might make.
     */
    async getToken(scopes, options = {}) {
        let token = null;
        let successfulCredentialName = "";
        const errors = [];
        return tracingClient.withSpan("ChainedTokenCredential.getToken", options, async (updatedOptions) => {
            for (let i = 0; i < this._sources.length && token === null; i++) {
                try {
                    token = await this._sources[i].getToken(scopes, updatedOptions);
                    successfulCredentialName = this._sources[i].constructor.name;
                }
                catch (err) {
                    if (err.name === "CredentialUnavailableError" ||
                        err.name === "AuthenticationRequiredError") {
                        errors.push(err);
                    }
                    else {
                        logger.getToken.info(formatError(scopes, err));
                        throw err;
                    }
                }
            }
            if (!token && errors.length > 0) {
                const err = new AggregateAuthenticationError(errors, "ChainedTokenCredential authentication failed.");
                logger.getToken.info(formatError(scopes, err));
                throw err;
            }
            logger.getToken.info(`Result for ${successfulCredentialName}: ${formatSuccess(scopes)}`);
            if (token === null) {
                throw new CredentialUnavailableError("Failed to retrieve a valid token");
            }
            return token;
        });
    }
}
//# sourceMappingURL=chainedTokenCredential.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { credentialLogger, formatError } from "../util/logging";
const BrowserNotSupportedError = new Error("ClientAssertionCredential is not supported in the browser.");
const logger = credentialLogger("ClientAssertionCredential");
/**
 * Authenticates a service principal with a JWT assertion.
 */
export class ClientAssertionCredential {
    /**
     * Only available in Node.js
     */
    constructor() {
        logger.info(formatError("", BrowserNotSupportedError));
        throw BrowserNotSupportedError;
    }
    getToken() {
        logger.getToken.info(formatError("", BrowserNotSupportedError));
        throw BrowserNotSupportedError;
    }
}
//# sourceMappingURL=clientAssertionCredential.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { credentialLogger } from "../util/logging";
import { tracingClient } from "../util/tracing";
import { MsalClientAssertion } from "../msal/nodeFlows/msalClientAssertion";
const logger = credentialLogger("ClientAssertionCredential");
/**
 * Authenticates a service principal with a JWT assertion.
 */
export class ClientAssertionCredential {
    /**
     * Creates an instance of the ClientAssertionCredential with the details
     * needed to authenticate against Azure Active Directory with a client
     * assertion provided by the developer through the `getAssertion` function parameter.
     *
     * @param tenantId - The Azure Active Directory tenant (directory) ID.
     * @param clientId - The client (application) ID of an App Registration in the tenant.
     * @param getAssertion - A function that retrieves the assertion for the credential to use.
     * @param options - Options for configuring the client which makes the authentication request.
     */
    constructor(tenantId, clientId, getAssertion, options = {}) {
        if (!tenantId || !clientId || !getAssertion) {
            throw new Error("ClientAssertionCredential: tenantId, clientId, and clientAssertion are required parameters.");
        }
        this.tenantId = tenantId;
        this.clientId = clientId;
        this.options = options;
        this.msalFlow = new MsalClientAssertion(Object.assign(Object.assign({}, options), { logger, clientId: this.clientId, tenantId: this.tenantId, tokenCredentialOptions: this.options, getAssertion }));
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If authentication fails, a {@link CredentialUnavailableError} will be thrown with the details of the failure.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                TokenCredential implementation might make.
     */
    async getToken(scopes, options = {}) {
        return tracingClient.withSpan(`${this.constructor.name}.getToken`, options, async (newOptions) => {
            const arrayScopes = Array.isArray(scopes) ? scopes : [scopes];
            return this.msalFlow.getToken(arrayScopes, newOptions);
        });
    }
}
//# sourceMappingURL=clientAssertionCredential.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { credentialLogger, formatError } from "../util/logging";
const BrowserNotSupportedError = new Error("ClientCertificateCredential is not supported in the browser.");
const logger = credentialLogger("ClientCertificateCredential");
/**
 * Enables authentication to Azure Active Directory using a PEM-encoded
 * certificate that is assigned to an App Registration.
 */
export class ClientCertificateCredential {
    /**
     * Only available in Node.js
     */
    constructor() {
        logger.info(formatError("", BrowserNotSupportedError));
        throw BrowserNotSupportedError;
    }
    getToken() {
        logger.getToken.info(formatError("", BrowserNotSupportedError));
        throw BrowserNotSupportedError;
    }
}
//# sourceMappingURL=clientCertificateCredential.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { MsalClientCertificate } from "../msal/nodeFlows/msalClientCertificate";
import { credentialLogger } from "../util/logging";
import { tracingClient } from "../util/tracing";
const credentialName = "ClientCertificateCredential";
const logger = credentialLogger(credentialName);
/**
 * Enables authentication to Azure Active Directory using a PEM-encoded
 * certificate that is assigned to an App Registration. More information
 * on how to configure certificate authentication can be found here:
 *
 * https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-certificate-credentials#register-your-certificate-with-azure-ad
 *
 */
export class ClientCertificateCredential {
    constructor(tenantId, clientId, certificatePathOrConfiguration, options = {}) {
        if (!tenantId || !clientId) {
            throw new Error(`${credentialName}: tenantId and clientId are required parameters.`);
        }
        const configuration = Object.assign({}, (typeof certificatePathOrConfiguration === "string"
            ? {
                certificatePath: certificatePathOrConfiguration,
            }
            : certificatePathOrConfiguration));
        const certificate = configuration
            .certificate;
        const certificatePath = configuration.certificatePath;
        if (!configuration || !(certificate || certificatePath)) {
            throw new Error(`${credentialName}: Provide either a PEM certificate in string form, or the path to that certificate in the filesystem. To troubleshoot, visit https://aka.ms/azsdk/js/identity/serviceprincipalauthentication/troubleshoot.`);
        }
        if (certificate && certificatePath) {
            throw new Error(`${credentialName}: To avoid unexpected behaviors, providing both the contents of a PEM certificate and the path to a PEM certificate is forbidden. To troubleshoot, visit https://aka.ms/azsdk/js/identity/serviceprincipalauthentication/troubleshoot.`);
        }
        this.msalFlow = new MsalClientCertificate(Object.assign(Object.assign({}, options), { configuration,
            logger,
            clientId,
            tenantId, sendCertificateChain: options.sendCertificateChain, tokenCredentialOptions: options }));
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If authentication fails, a {@link CredentialUnavailableError} will be thrown with the details of the failure.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                TokenCredential implementation might make.
     */
    async getToken(scopes, options = {}) {
        return tracingClient.withSpan(`${credentialName}.getToken`, options, async (newOptions) => {
            const arrayScopes = Array.isArray(scopes) ? scopes : [scopes];
            return this.msalFlow.getToken(arrayScopes, newOptions);
        });
    }
}
//# sourceMappingURL=clientCertificateCredential.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=clientCertificateCredentialOptions.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createHttpHeaders, createPipelineRequest } from "@azure/core-rest-pipeline";
import { credentialLogger, formatError, formatSuccess } from "../util/logging";
import { getIdentityTokenEndpointSuffix } from "../util/identityTokenEndpoint";
import { IdentityClient } from "../client/identityClient";
import { tracingClient } from "../util/tracing";
const logger = credentialLogger("ClientSecretCredential");
// This credential is exported on browser bundles for development purposes.
// For this credential to work in browsers, browsers would need to have security features disabled.
// Please do not disable your browser security features.
/**
 * Enables authentication to Azure Active Directory using a client secret
 * that was generated for an App Registration.  More information on how
 * to configure a client secret can be found here:
 *
 * https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-configure-app-access-web-apis#add-credentials-to-your-web-application
 *
 */
export class ClientSecretCredential {
    /**
     * Creates an instance of the ClientSecretCredential with the details
     * needed to authenticate against Azure Active Directory with a client
     * secret.
     *
     * @param tenantId - The Azure Active Directory tenant (directory) ID.
     * @param clientId - The client (application) ID of an App Registration in the tenant.
     * @param clientSecret - A client secret that was generated for the App Registration.
     * @param options - Options for configuring the client which makes the authentication request.
     */
    constructor(tenantId, clientId, clientSecret, options) {
        this.identityClient = new IdentityClient(options);
        this.tenantId = tenantId;
        this.clientId = clientId;
        this.clientSecret = clientSecret;
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if
     * successful.  If authentication cannot be performed at this time, this method may
     * return null.  If an error occurs during authentication, an {@link AuthenticationError}
     * containing failure details will be thrown.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                TokenCredential implementation might make.
     */
    async getToken(scopes, options = {}) {
        return tracingClient.withSpan(`${this.constructor.name}.getToken`, options, async (newOptions) => {
            const query = new URLSearchParams({
                response_type: "token",
                grant_type: "client_credentials",
                client_id: this.clientId,
                client_secret: this.clientSecret,
                scope: typeof scopes === "string" ? scopes : scopes.join(" "),
            });
            try {
                const urlSuffix = getIdentityTokenEndpointSuffix(this.tenantId);
                const request = createPipelineRequest({
                    url: `${this.identityClient.authorityHost}/${this.tenantId}/${urlSuffix}`,
                    method: "POST",
                    body: query.toString(),
                    headers: createHttpHeaders({
                        Accept: "application/json",
                        "Content-Type": "application/x-www-form-urlencoded",
                    }),
                    abortSignal: options && options.abortSignal,
                    tracingOptions: newOptions === null || newOptions === void 0 ? void 0 : newOptions.tracingOptions,
                });
                const tokenResponse = await this.identityClient.sendTokenRequest(request);
                logger.getToken.info(formatSuccess(scopes));
                return (tokenResponse && tokenResponse.accessToken) || null;
            }
            catch (err) {
                logger.getToken.info(formatError(scopes, err));
                throw err;
            }
        });
    }
}
//# sourceMappingURL=clientSecretCredential.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { MsalClientSecret } from "../msal/nodeFlows/msalClientSecret";
import { credentialLogger } from "../util/logging";
import { tracingClient } from "../util/tracing";
const logger = credentialLogger("ClientSecretCredential");
/**
 * Enables authentication to Azure Active Directory using a client secret
 * that was generated for an App Registration. More information on how
 * to configure a client secret can be found here:
 *
 * https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-configure-app-access-web-apis#add-credentials-to-your-web-application
 *
 */
export class ClientSecretCredential {
    /**
     * Creates an instance of the ClientSecretCredential with the details
     * needed to authenticate against Azure Active Directory with a client
     * secret.
     *
     * @param tenantId - The Azure Active Directory tenant (directory) ID.
     * @param clientId - The client (application) ID of an App Registration in the tenant.
     * @param clientSecret - A client secret that was generated for the App Registration.
     * @param options - Options for configuring the client which makes the authentication request.
     */
    constructor(tenantId, clientId, clientSecret, options = {}) {
        if (!tenantId || !clientId || !clientSecret) {
            throw new Error("ClientSecretCredential: tenantId, clientId, and clientSecret are required parameters. To troubleshoot, visit https://aka.ms/azsdk/js/identity/serviceprincipalauthentication/troubleshoot.");
        }
        this.msalFlow = new MsalClientSecret(Object.assign(Object.assign({}, options), { logger,
            clientId,
            tenantId,
            clientSecret, tokenCredentialOptions: options }));
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If authentication fails, a {@link CredentialUnavailableError} will be thrown with the details of the failure.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                TokenCredential implementation might make.
     */
    async getToken(scopes, options = {}) {
        return tracingClient.withSpan(`${this.constructor.name}.getToken`, options, async (newOptions) => {
            const arrayScopes = Array.isArray(scopes) ? scopes : [scopes];
            return this.msalFlow.getToken(arrayScopes, newOptions);
        });
    }
}
//# sourceMappingURL=clientSecretCredential.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=clientSecretCredentialOptions.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=credentialPersistenceOptions.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { credentialLogger, formatError } from "../util/logging";
import { ChainedTokenCredential } from "./chainedTokenCredential";
const BrowserNotSupportedError = new Error("DefaultAzureCredential is not supported in the browser. Use InteractiveBrowserCredential instead.");
const logger = credentialLogger("DefaultAzureCredential");
/**
 * Provides a default {@link ChainedTokenCredential} configuration for
 * applications that will be deployed to Azure.
 *
 * Only available in Node.js.
 */
export class DefaultAzureCredential extends ChainedTokenCredential {
    /**
     * Creates an instance of the DefaultAzureCredential class.
     *
     * @param options - Options for configuring the client which makes the authentication request.
     */
    constructor(_tokenCredentialOptions) {
        super();
        logger.info(formatError("", BrowserNotSupportedError));
        throw BrowserNotSupportedError;
    }
    getToken() {
        logger.getToken.info(formatError("", BrowserNotSupportedError));
        throw BrowserNotSupportedError;
    }
}
//# sourceMappingURL=defaultAzureCredential.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { ChainedTokenCredential } from "./chainedTokenCredential";
import { AzureCliCredential } from "./azureCliCredential";
import { AzurePowerShellCredential } from "./azurePowerShellCredential";
import { EnvironmentCredential } from "./environmentCredential";
import { ManagedIdentityCredential, } from "./managedIdentityCredential";
import { VisualStudioCodeCredential } from "./visualStudioCodeCredential";
/**
 * A shim around ManagedIdentityCredential that adapts it to accept
 * `DefaultAzureCredentialOptions`.
 *
 * @internal
 */
export class DefaultManagedIdentityCredential extends ManagedIdentityCredential {
    // Constructor overload with just the other default options
    // Last constructor overload with Union of all options not required since the above two constructor overloads have optional properties
    constructor(options) {
        var _a;
        const managedIdentityClientId = (_a = options === null || options === void 0 ? void 0 : options.managedIdentityClientId) !== null && _a !== void 0 ? _a : process.env.AZURE_CLIENT_ID;
        const managedResourceId = options === null || options === void 0 ? void 0 : options.managedIdentityResourceId;
        // ManagedIdentityCredential throws if both the resourceId and the clientId are provided.
        if (managedResourceId) {
            const managedIdentityResourceIdOptions = Object.assign(Object.assign({}, options), { resourceId: managedResourceId });
            super(managedIdentityResourceIdOptions);
        }
        else if (managedIdentityClientId) {
            const managedIdentityClientOptions = Object.assign(Object.assign({}, options), { clientId: managedIdentityClientId });
            super(managedIdentityClientOptions);
        }
        else {
            super(options);
        }
    }
}
export const defaultCredentials = [
    EnvironmentCredential,
    DefaultManagedIdentityCredential,
    VisualStudioCodeCredential,
    AzureCliCredential,
    AzurePowerShellCredential,
];
/**
 * Provides a default {@link ChainedTokenCredential} configuration that should
 * work for most applications that use the Azure SDK.
 */
export class DefaultAzureCredential extends ChainedTokenCredential {
    constructor(options) {
        super(...defaultCredentials.map((ctor) => new ctor(options)));
        this.UnavailableMessage =
            "DefaultAzureCredential => failed to retrieve a token from the included credentials. To troubleshoot, visit https://aka.ms/azsdk/js/identity/defaultazurecredential/troubleshoot.";
    }
}
//# sourceMappingURL=defaultAzureCredential.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { credentialLogger, formatError } from "../util/logging";
const BrowserNotSupportedError = new Error("DeviceCodeCredential is not supported in the browser.");
const logger = credentialLogger("DeviceCodeCredential");
/**
 * Enables authentication to Azure Active Directory using a device code
 * that the user can enter into https://microsoft.com/devicelogin.
 */
export class DeviceCodeCredential {
    /**
     * Only available in Node.js
     */
    constructor() {
        logger.info(formatError("", BrowserNotSupportedError));
        throw BrowserNotSupportedError;
    }
    getToken() {
        logger.getToken.info(formatError("", BrowserNotSupportedError));
        throw BrowserNotSupportedError;
    }
}
//# sourceMappingURL=deviceCodeCredential.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { credentialLogger } from "../util/logging";
import { MsalDeviceCode } from "../msal/nodeFlows/msalDeviceCode";
import { tracingClient } from "../util/tracing";
const logger = credentialLogger("DeviceCodeCredential");
/**
 * Method that logs the user code from the DeviceCodeCredential.
 * @param deviceCodeInfo - The device code.
 */
export function defaultDeviceCodePromptCallback(deviceCodeInfo) {
    console.log(deviceCodeInfo.message);
}
/**
 * Enables authentication to Azure Active Directory using a device code
 * that the user can enter into https://microsoft.com/devicelogin.
 */
export class DeviceCodeCredential {
    /**
     * Creates an instance of DeviceCodeCredential with the details needed
     * to initiate the device code authorization flow with Azure Active Directory.
     *
     * A message will be logged, giving users a code that they can use to authenticate once they go to https://microsoft.com/devicelogin
     *
     * Developers can configure how this message is shown by passing a custom `userPromptCallback`:
     *
     * ```js
     * const credential = new DeviceCodeCredential({
     *   tenantId: env.AZURE_TENANT_ID,
     *   clientId: env.AZURE_CLIENT_ID,
     *   userPromptCallback: (info) => {
     *     console.log("CUSTOMIZED PROMPT CALLBACK", info.message);
     *   }
     * });
     * ```
     *
     * @param options - Options for configuring the client which makes the authentication requests.
     */
    constructor(options) {
        this.msalFlow = new MsalDeviceCode(Object.assign(Object.assign({}, options), { logger, userPromptCallback: (options === null || options === void 0 ? void 0 : options.userPromptCallback) || defaultDeviceCodePromptCallback, tokenCredentialOptions: options || {} }));
        this.disableAutomaticAuthentication = options === null || options === void 0 ? void 0 : options.disableAutomaticAuthentication;
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If authentication fails, a {@link CredentialUnavailableError} will be thrown with the details of the failure.
     *
     * If the user provided the option `disableAutomaticAuthentication`,
     * once the token can't be retrieved silently,
     * this method won't attempt to request user interaction to retrieve the token.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                TokenCredential implementation might make.
     */
    async getToken(scopes, options = {}) {
        return tracingClient.withSpan(`${this.constructor.name}.getToken`, options, async (newOptions) => {
            const arrayScopes = Array.isArray(scopes) ? scopes : [scopes];
            return this.msalFlow.getToken(arrayScopes, Object.assign(Object.assign({}, newOptions), { disableAutomaticAuthentication: this.disableAutomaticAuthentication }));
        });
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If authentication fails, a {@link CredentialUnavailableError} will be thrown with the details of the failure.
     *
     * If the token can't be retrieved silently, this method will require user interaction to retrieve the token.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                  TokenCredential implementation might make.
     */
    async authenticate(scopes, options = {}) {
        return tracingClient.withSpan(`${this.constructor.name}.authenticate`, options, async (newOptions) => {
            const arrayScopes = Array.isArray(scopes) ? scopes : [scopes];
            await this.msalFlow.getToken(arrayScopes, newOptions);
            return this.msalFlow.getActiveAccount();
        });
    }
}
//# sourceMappingURL=deviceCodeCredential.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=deviceCodeCredentialOptions.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { credentialLogger, formatError } from "../util/logging";
const BrowserNotSupportedError = new Error("EnvironmentCredential is not supported in the browser.");
const logger = credentialLogger("EnvironmentCredential");
/**
 * Enables authentication to Azure Active Directory using client secret
 * details configured in environment variables
 */
export class EnvironmentCredential {
    /**
     * Only available in Node.js
     */
    constructor() {
        logger.info(formatError("", BrowserNotSupportedError));
        throw BrowserNotSupportedError;
    }
    getToken() {
        logger.getToken.info(formatError("", BrowserNotSupportedError));
        throw BrowserNotSupportedError;
    }
}
//# sourceMappingURL=environmentCredential.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { credentialLogger, formatError, formatSuccess, processEnvVars } from "../util/logging";
import { ClientSecretCredential } from "./clientSecretCredential";
import { AuthenticationError, CredentialUnavailableError } from "../errors";
import { checkTenantId } from "../util/checkTenantId";
import { tracingClient } from "../util/tracing";
import { ClientCertificateCredential } from "./clientCertificateCredential";
import { UsernamePasswordCredential } from "./usernamePasswordCredential";
/**
 * Contains the list of all supported environment variable names so that an
 * appropriate error message can be generated when no credentials can be
 * configured.
 *
 * @internal
 */
export const AllSupportedEnvironmentVariables = [
    "AZURE_TENANT_ID",
    "AZURE_CLIENT_ID",
    "AZURE_CLIENT_SECRET",
    "AZURE_CLIENT_CERTIFICATE_PATH",
    "AZURE_USERNAME",
    "AZURE_PASSWORD",
];
const credentialName = "EnvironmentCredential";
const logger = credentialLogger(credentialName);
/**
 * Enables authentication to Azure Active Directory using client secret
 * details configured in environment variables
 */
export class EnvironmentCredential {
    /**
     * Creates an instance of the EnvironmentCredential class and decides what credential to use depending on the available environment variables.
     *
     * Required environment variables:
     * - `AZURE_TENANT_ID`: The Azure Active Directory tenant (directory) ID.
     * - `AZURE_CLIENT_ID`: The client (application) ID of an App Registration in the tenant.
     *
     * Environment variables used for client credential authentication:
     * - `AZURE_CLIENT_SECRET`: A client secret that was generated for the App Registration.
     * - `AZURE_CLIENT_CERTIFICATE_PATH`: The path to a PEM certificate to use during the authentication, instead of the client secret.
     *
     * Alternatively, users can provide environment variables for username and password authentication:
     * - `AZURE_USERNAME`: Username to authenticate with.
     * - `AZURE_PASSWORD`: Password to authenticate with.
     *
     * If the environment variables required to perform the authentication are missing, a {@link CredentialUnavailableError} will be thrown.
     * If the authentication fails, or if there's an unknown error, an {@link AuthenticationError} will be thrown.
     *
     * @param options - Options for configuring the client which makes the authentication request.
     */
    constructor(options) {
        // Keep track of any missing environment variables for error details
        this._credential = undefined;
        const assigned = processEnvVars(AllSupportedEnvironmentVariables).assigned.join(", ");
        logger.info(`Found the following environment variables: ${assigned}`);
        const tenantId = process.env.AZURE_TENANT_ID, clientId = process.env.AZURE_CLIENT_ID, clientSecret = process.env.AZURE_CLIENT_SECRET;
        if (tenantId) {
            checkTenantId(logger, tenantId);
        }
        if (tenantId && clientId && clientSecret) {
            logger.info(`Invoking ClientSecretCredential with tenant ID: ${tenantId}, clientId: ${clientId} and clientSecret: [REDACTED]`);
            this._credential = new ClientSecretCredential(tenantId, clientId, clientSecret, options);
            return;
        }
        const certificatePath = process.env.AZURE_CLIENT_CERTIFICATE_PATH;
        if (tenantId && clientId && certificatePath) {
            logger.info(`Invoking ClientCertificateCredential with tenant ID: ${tenantId}, clientId: ${clientId} and certificatePath: ${certificatePath}`);
            this._credential = new ClientCertificateCredential(tenantId, clientId, { certificatePath }, options);
            return;
        }
        const username = process.env.AZURE_USERNAME;
        const password = process.env.AZURE_PASSWORD;
        if (tenantId && clientId && username && password) {
            logger.info(`Invoking UsernamePasswordCredential with tenant ID: ${tenantId}, clientId: ${clientId} and username: ${username}`);
            this._credential = new UsernamePasswordCredential(tenantId, clientId, username, password, options);
        }
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - Optional parameters. See {@link GetTokenOptions}.
     */
    async getToken(scopes, options = {}) {
        return tracingClient.withSpan(`${credentialName}.getToken`, options, async (newOptions) => {
            if (this._credential) {
                try {
                    const result = await this._credential.getToken(scopes, newOptions);
                    logger.getToken.info(formatSuccess(scopes));
                    return result;
                }
                catch (err) {
                    const authenticationError = new AuthenticationError(400, {
                        error: `${credentialName} authentication failed. To troubleshoot, visit https://aka.ms/azsdk/js/identity/environmentcredential/troubleshoot.`,
                        error_description: err.message.toString().split("More details:").join(""),
                    });
                    logger.getToken.info(formatError(scopes, authenticationError));
                    throw authenticationError;
                }
            }
            throw new CredentialUnavailableError(`${credentialName} is unavailable. No underlying credential could be used. To troubleshoot, visit https://aka.ms/azsdk/js/identity/environmentcredential/troubleshoot.`);
        });
    }
}
//# sourceMappingURL=environmentCredential.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { credentialLogger, formatError } from "../util/logging";
import { tracingClient } from "../util/tracing";
import { MSALAuthCode } from "../msal/browserFlows/msalAuthCode";
const logger = credentialLogger("InteractiveBrowserCredential");
/**
 * Enables authentication to Azure Active Directory inside of the web browser
 * using the interactive login flow.
 */
export class InteractiveBrowserCredential {
    /**
     * Creates an instance of the InteractiveBrowserCredential with the
     * details needed to authenticate against Azure Active Directory with
     * a user identity.
     *
     * This credential uses the [Authorization Code Flow](https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow).
     * On Node.js, it will open a browser window while it listens for a redirect response from the authentication service.
     * On browsers, it authenticates via popups. The `loginStyle` optional parameter can be set to `redirect` to authenticate by redirecting the user to an Azure secure login page, which then will redirect the user back to the web application where the authentication started.
     *
     * It's recommended that the AAD Applications used are configured to authenticate using Single Page Applications.
     * More information here: [link](https://docs.microsoft.com/en-us/azure/active-directory/develop/scenario-spa-app-registration#redirect-uri-msaljs-20-with-auth-code-flow).
     *
     * @param options - Options for configuring the client which makes the authentication request.
     */
    constructor(options) {
        if (!(options === null || options === void 0 ? void 0 : options.clientId)) {
            const error = new Error("The parameter `clientId` cannot be left undefined for the `InteractiveBrowserCredential`");
            logger.info(formatError("", error));
            throw error;
        }
        const browserOptions = options;
        const loginStyle = browserOptions.loginStyle || "popup";
        const loginStyles = ["redirect", "popup"];
        if (loginStyles.indexOf(loginStyle) === -1) {
            const error = new Error(`Invalid loginStyle: ${browserOptions.loginStyle}. Should be any of the following: ${loginStyles.join(", ")}.`);
            logger.info(formatError("", error));
            throw error;
        }
        const msalOptions = Object.assign(Object.assign({}, options), { logger, loginStyle: loginStyle, redirectUri: typeof options.redirectUri === "function" ? options.redirectUri() : options.redirectUri });
        this.msalFlow = new MSALAuthCode(msalOptions);
        this.disableAutomaticAuthentication = options === null || options === void 0 ? void 0 : options.disableAutomaticAuthentication;
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If authentication fails, a {@link CredentialUnavailableError} will be thrown with the details of the failure.
     *
     * If the user provided the option `disableAutomaticAuthentication`,
     * once the token can't be retrieved silently,
     * this method won't attempt to request user interaction to retrieve the token.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                TokenCredential implementation might make.
     */
    async getToken(scopes, options = {}) {
        return tracingClient.withSpan(`${this.constructor.name}.getToken`, options, async (newOptions) => {
            const arrayScopes = Array.isArray(scopes) ? scopes : [scopes];
            return this.msalFlow.getToken(arrayScopes, Object.assign(Object.assign({}, newOptions), { disableAutomaticAuthentication: this.disableAutomaticAuthentication }));
        });
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If authentication fails, a {@link CredentialUnavailableError} will be thrown with the details of the failure.
     *
     * If the token can't be retrieved silently, this method will require user interaction to retrieve the token.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                  TokenCredential implementation might make.
     */
    async authenticate(scopes, options = {}) {
        return tracingClient.withSpan(`${this.constructor.name}.authenticate`, options, async (newOptions) => {
            const arrayScopes = Array.isArray(scopes) ? scopes : [scopes];
            await this.msalFlow.getToken(arrayScopes, newOptions);
            return this.msalFlow.getActiveAccount();
        });
    }
}
//# sourceMappingURL=interactiveBrowserCredential.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { credentialLogger } from "../util/logging";
import { tracingClient } from "../util/tracing";
import { MsalOpenBrowser } from "../msal/nodeFlows/msalOpenBrowser";
const logger = credentialLogger("InteractiveBrowserCredential");
/**
 * Enables authentication to Azure Active Directory inside of the web browser
 * using the interactive login flow.
 */
export class InteractiveBrowserCredential {
    /**
     * Creates an instance of InteractiveBrowserCredential with the details needed.
     *
     * This credential uses the [Authorization Code Flow](https://docs.microsoft.com/azure/active-directory/develop/v2-oauth2-auth-code-flow).
     * On Node.js, it will open a browser window while it listens for a redirect response from the authentication service.
     * On browsers, it authenticates via popups. The `loginStyle` optional parameter can be set to `redirect` to authenticate by redirecting the user to an Azure secure login page, which then will redirect the user back to the web application where the authentication started.
     *
     * For Node.js, if a `clientId` is provided, the Azure Active Directory application will need to be configured to have a "Mobile and desktop applications" redirect endpoint.
     * Follow our guide on [setting up Redirect URIs for Desktop apps that calls to web APIs](https://docs.microsoft.com/azure/active-directory/develop/scenario-desktop-app-registration#redirect-uris).
     *
     * @param options - Options for configuring the client which makes the authentication requests.
     */
    constructor(options = {}) {
        const redirectUri = typeof options.redirectUri === "function"
            ? options.redirectUri()
            : options.redirectUri || "http://localhost";
        this.msalFlow = new MsalOpenBrowser(Object.assign(Object.assign({}, options), { tokenCredentialOptions: options, logger,
            redirectUri }));
        this.disableAutomaticAuthentication = options === null || options === void 0 ? void 0 : options.disableAutomaticAuthentication;
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If authentication fails, a {@link CredentialUnavailableError} will be thrown with the details of the failure.
     *
     * If the user provided the option `disableAutomaticAuthentication`,
     * once the token can't be retrieved silently,
     * this method won't attempt to request user interaction to retrieve the token.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                TokenCredential implementation might make.
     */
    async getToken(scopes, options = {}) {
        return tracingClient.withSpan(`${this.constructor.name}.getToken`, options, async (newOptions) => {
            const arrayScopes = Array.isArray(scopes) ? scopes : [scopes];
            return this.msalFlow.getToken(arrayScopes, Object.assign(Object.assign({}, newOptions), { disableAutomaticAuthentication: this.disableAutomaticAuthentication }));
        });
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If authentication fails, a {@link CredentialUnavailableError} will be thrown with the details of the failure.
     *
     * If the token can't be retrieved silently, this method will require user interaction to retrieve the token.
     *
     * On Node.js, this credential has [Proof Key for Code Exchange (PKCE)](https://datatracker.ietf.org/doc/html/rfc7636) enabled by default.
     * PKCE is a security feature that mitigates authentication code interception attacks.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                  TokenCredential implementation might make.
     */
    async authenticate(scopes, options = {}) {
        return tracingClient.withSpan(`${this.constructor.name}.authenticate`, options, async (newOptions) => {
            const arrayScopes = Array.isArray(scopes) ? scopes : [scopes];
            await this.msalFlow.getToken(arrayScopes, newOptions);
            return this.msalFlow.getActiveAccount();
        });
    }
}
//# sourceMappingURL=interactiveBrowserCredential.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=interactiveBrowserCredentialOptions.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=interactiveCredentialOptions.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { credentialLogger, formatError } from "../util/logging";
const credentialName = "OnBehalfOfCredential";
const BrowserNotSupportedError = new Error(`${credentialName}: Not supported in the browser.`);
const logger = credentialLogger(credentialName);
/**
 * Enables authentication to Azure Active Directory using the [On Behalf Of flow](https://docs.microsoft.com/azure/active-directory/develop/v2-oauth2-on-behalf-of-flow).
 */
export class OnBehalfOfCredential {
    /**
     * Only available in Node.js
     */
    constructor() {
        logger.info(formatError("", BrowserNotSupportedError));
        throw BrowserNotSupportedError;
    }
    getToken() {
        logger.getToken.info(formatError("", BrowserNotSupportedError));
        throw BrowserNotSupportedError;
    }
}
//# sourceMappingURL=onBehalfOfCredential.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { MsalOnBehalfOf } from "../msal/nodeFlows/msalOnBehalfOf";
import { credentialLogger } from "../util/logging";
import { tracingClient } from "../util/tracing";
const credentialName = "OnBehalfOfCredential";
const logger = credentialLogger(credentialName);
/**
 * Enables authentication to Azure Active Directory using the [On Behalf Of flow](https://docs.microsoft.com/azure/active-directory/develop/v2-oauth2-on-behalf-of-flow).
 */
export class OnBehalfOfCredential {
    constructor(options) {
        this.options = options;
        const { clientSecret } = options;
        const { certificatePath } = options;
        const { tenantId, clientId, userAssertionToken } = options;
        if (!tenantId || !clientId || !(clientSecret || certificatePath) || !userAssertionToken) {
            throw new Error(`${credentialName}: tenantId, clientId, clientSecret (or certificatePath) and userAssertionToken are required parameters.`);
        }
        this.msalFlow = new MsalOnBehalfOf(Object.assign(Object.assign({}, this.options), { logger, tokenCredentialOptions: this.options }));
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If authentication fails, a {@link CredentialUnavailableError} will be thrown with the details of the failure.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure the underlying network requests.
     */
    async getToken(scopes, options = {}) {
        return tracingClient.withSpan(`${credentialName}.getToken`, options, async (newOptions) => {
            const arrayScopes = Array.isArray(scopes) ? scopes : [scopes];
            return this.msalFlow.getToken(arrayScopes, newOptions);
        });
    }
}
//# sourceMappingURL=onBehalfOfCredential.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=onBehalfOfCredentialOptions.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createHttpHeaders, createPipelineRequest } from "@azure/core-rest-pipeline";
import { IdentityClient } from "../client/identityClient";
import { credentialLogger, formatError, formatSuccess } from "../util/logging";
import { getIdentityTokenEndpointSuffix } from "../util/identityTokenEndpoint";
import { tracingClient } from "../util/tracing";
import { checkTenantId } from "../util/checkTenantId";
const logger = credentialLogger("UsernamePasswordCredential");
/**
 * Enables authentication to Azure Active Directory with a user's
 * username and password. This credential requires a high degree of
 * trust so you should only use it when other, more secure credential
 * types can't be used.
 */
export class UsernamePasswordCredential {
    /**
     * Creates an instance of the UsernamePasswordCredential with the details
     * needed to authenticate against Azure Active Directory with a username
     * and password.
     *
     * @param tenantIdOrName - The Azure Active Directory tenant (directory) ID or name.
     * @param clientId - The client (application) ID of an App Registration in the tenant.
     * @param username - The user account's e-mail address (user name).
     * @param password - The user account's account password
     * @param options - Options for configuring the client which makes the authentication request.
     */
    constructor(tenantIdOrName, clientId, username, password, options) {
        checkTenantId(logger, tenantIdOrName);
        this.identityClient = new IdentityClient(options);
        this.tenantId = tenantIdOrName;
        this.clientId = clientId;
        this.username = username;
        this.password = password;
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if
     * successful.  If authentication cannot be performed at this time, this method may
     * return null.  If an error occurs during authentication, an {@link AuthenticationError}
     * containing failure details will be thrown.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                TokenCredential implementation might make.
     */
    async getToken(scopes, options) {
        const { span, updatedOptions: newOptions } = tracingClient.startSpan("UsernamePasswordCredential.getToken", options);
        try {
            const urlSuffix = getIdentityTokenEndpointSuffix(this.tenantId);
            const params = new URLSearchParams({
                response_type: "token",
                grant_type: "password",
                client_id: this.clientId,
                username: this.username,
                password: this.password,
                scope: typeof scopes === "string" ? scopes : scopes.join(" "),
            });
            const webResource = createPipelineRequest({
                url: `${this.identityClient.authorityHost}/${this.tenantId}/${urlSuffix}`,
                method: "POST",
                body: params.toString(),
                headers: createHttpHeaders({
                    Accept: "application/json",
                    "Content-Type": "application/x-www-form-urlencoded",
                }),
                abortSignal: options && options.abortSignal,
                tracingOptions: newOptions.tracingOptions,
            });
            const tokenResponse = await this.identityClient.sendTokenRequest(webResource);
            logger.getToken.info(formatSuccess(scopes));
            return (tokenResponse && tokenResponse.accessToken) || null;
        }
        catch (err) {
            span.setStatus({
                status: "error",
                error: err,
            });
            logger.getToken.info(formatError(scopes, err));
            throw err;
        }
        finally {
            span.end();
        }
    }
}
//# sourceMappingURL=usernamePasswordCredential.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { credentialLogger } from "../util/logging";
import { MsalUsernamePassword } from "../msal/nodeFlows/msalUsernamePassword";
import { tracingClient } from "../util/tracing";
const logger = credentialLogger("UsernamePasswordCredential");
/**
 * Enables authentication to Azure Active Directory with a user's
 * username and password. This credential requires a high degree of
 * trust so you should only use it when other, more secure credential
 * types can't be used.
 */
export class UsernamePasswordCredential {
    /**
     * Creates an instance of the UsernamePasswordCredential with the details
     * needed to authenticate against Azure Active Directory with a username
     * and password.
     *
     * @param tenantId - The Azure Active Directory tenant (directory).
     * @param clientId - The client (application) ID of an App Registration in the tenant.
     * @param username - The user account's e-mail address (user name).
     * @param password - The user account's account password
     * @param options - Options for configuring the client which makes the authentication request.
     */
    constructor(tenantId, clientId, username, password, options = {}) {
        if (!tenantId || !clientId || !username || !password) {
            throw new Error("UsernamePasswordCredential: tenantId, clientId, username and password are required parameters. To troubleshoot, visit https://aka.ms/azsdk/js/identity/usernamepasswordcredential/troubleshoot.");
        }
        this.msalFlow = new MsalUsernamePassword(Object.assign(Object.assign({}, options), { logger,
            clientId,
            tenantId,
            username,
            password, tokenCredentialOptions: options || {} }));
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If authentication fails, a {@link CredentialUnavailableError} will be thrown with the details of the failure.
     *
     * If the user provided the option `disableAutomaticAuthentication`,
     * once the token can't be retrieved silently,
     * this method won't attempt to request user interaction to retrieve the token.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                TokenCredential implementation might make.
     */
    async getToken(scopes, options = {}) {
        return tracingClient.withSpan(`${this.constructor.name}.getToken`, options, async (newOptions) => {
            const arrayScopes = Array.isArray(scopes) ? scopes : [scopes];
            return this.msalFlow.getToken(arrayScopes, newOptions);
        });
    }
}
//# sourceMappingURL=usernamePasswordCredential.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=usernamePasswordCredentialOptions.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { credentialLogger, formatError } from "../util/logging";
const BrowserNotSupportedError = new Error("VisualStudioCodeCredential is not supported in the browser.");
const logger = credentialLogger("VisualStudioCodeCredential");
export const vsCodeCredentialControl = {
    set vsCodeCredentialFinder(_finder) {
        throw new Error("Attempted to register a VisualStudioCodeCredential provider plugin in the browser. This environment is not supported by VisualStudioCodeCredential.");
    },
};
/**
 * Connects to Azure using the credential provided by the VSCode extension 'Azure Account'.
 */
export class VisualStudioCodeCredential {
    /**
     * Only available in Node.js
     */
    constructor() {
        logger.info(formatError("", BrowserNotSupportedError));
        throw BrowserNotSupportedError;
    }
    getToken() {
        logger.getToken.info(formatError("", BrowserNotSupportedError));
        throw BrowserNotSupportedError;
    }
}
//# sourceMappingURL=visualStudioCodeCredential.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import fs from "fs";
import os from "os";
import path from "path";
import { AzureAuthorityHosts } from "../constants";
import { checkTenantId } from "../util/checkTenantId";
import { CredentialUnavailableError } from "../errors";
import { IdentityClient } from "../client/identityClient";
import { processMultiTenantRequest } from "../util/validateMultiTenant";
import { credentialLogger, formatError, formatSuccess } from "../util/logging";
const CommonTenantId = "common";
const AzureAccountClientId = "aebc6443-996d-45c2-90f0-388ff96faa56"; // VSC: 'aebc6443-996d-45c2-90f0-388ff96faa56'
const logger = credentialLogger("VisualStudioCodeCredential");
let findCredentials = undefined;
export const vsCodeCredentialControl = {
    setVsCodeCredentialFinder(finder) {
        findCredentials = finder;
    },
};
// Map of unsupported Tenant IDs and the errors we will be throwing.
const unsupportedTenantIds = {
    adfs: "The VisualStudioCodeCredential does not support authentication with ADFS tenants.",
};
function checkUnsupportedTenant(tenantId) {
    // If the Tenant ID isn't supported, we throw.
    const unsupportedTenantError = unsupportedTenantIds[tenantId];
    if (unsupportedTenantError) {
        throw new CredentialUnavailableError(unsupportedTenantError);
    }
}
const mapVSCodeAuthorityHosts = {
    AzureCloud: AzureAuthorityHosts.AzurePublicCloud,
    AzureChina: AzureAuthorityHosts.AzureChina,
    AzureGermanCloud: AzureAuthorityHosts.AzureGermany,
    AzureUSGovernment: AzureAuthorityHosts.AzureGovernment,
};
/**
 * Attempts to load a specific property from the VSCode configurations of the current OS.
 * If it fails at any point, returns undefined.
 */
export function getPropertyFromVSCode(property) {
    const settingsPath = ["User", "settings.json"];
    // Eventually we can add more folders for more versions of VSCode.
    const vsCodeFolder = "Code";
    const homedir = os.homedir();
    function loadProperty(...pathSegments) {
        const fullPath = path.join(...pathSegments, vsCodeFolder, ...settingsPath);
        const settings = JSON.parse(fs.readFileSync(fullPath, { encoding: "utf8" }));
        return settings[property];
    }
    try {
        let appData;
        switch (process.platform) {
            case "win32":
                appData = process.env.APPDATA;
                return appData ? loadProperty(appData) : undefined;
            case "darwin":
                return loadProperty(homedir, "Library", "Application Support");
            case "linux":
                return loadProperty(homedir, ".config");
            default:
                return;
        }
    }
    catch (e) {
        logger.info(`Failed to load the Visual Studio Code configuration file. Error: ${e.message}`);
        return;
    }
}
/**
 * Connects to Azure using the credential provided by the VSCode extension 'Azure Account'.
 * Once the user has logged in via the extension, this credential can share the same refresh token
 * that is cached by the extension.
 */
export class VisualStudioCodeCredential {
    /**
     * Creates an instance of VisualStudioCodeCredential to use for automatically authenticating via VSCode.
     *
     * **Note**: `VisualStudioCodeCredential` is provided by a plugin package:
     * `@azure/identity-vscode`. If this package is not installed and registered
     * using the plugin API (`useIdentityPlugin`), then authentication using
     * `VisualStudioCodeCredential` will not be available.
     *
     * @param options - Options for configuring the client which makes the authentication request.
     */
    constructor(options) {
        // We want to make sure we use the one assigned by the user on the VSCode settings.
        // Or just `AzureCloud` by default.
        this.cloudName = (getPropertyFromVSCode("azure.cloud") || "AzureCloud");
        // Picking an authority host based on the cloud name.
        const authorityHost = mapVSCodeAuthorityHosts[this.cloudName];
        this.identityClient = new IdentityClient(Object.assign({ authorityHost }, options));
        if (options && options.tenantId) {
            checkTenantId(logger, options.tenantId);
            this.tenantId = options.tenantId;
        }
        else {
            this.tenantId = CommonTenantId;
        }
        checkUnsupportedTenant(this.tenantId);
    }
    /**
     * Runs preparations for any further getToken request.
     */
    async prepare() {
        // Attempts to load the tenant from the VSCode configuration file.
        const settingsTenant = getPropertyFromVSCode("azure.tenant");
        if (settingsTenant) {
            this.tenantId = settingsTenant;
        }
        checkUnsupportedTenant(this.tenantId);
    }
    /**
     * Runs preparations for any further getToken, but only once.
     */
    prepareOnce() {
        if (!this.preparePromise) {
            this.preparePromise = this.prepare();
        }
        return this.preparePromise;
    }
    /**
     * Returns the token found by searching VSCode's authentication cache or
     * returns null if no token could be found.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                `TokenCredential` implementation might make.
     */
    async getToken(scopes, options) {
        var _a, _b;
        await this.prepareOnce();
        const tenantId = processMultiTenantRequest(this.tenantId, options) || this.tenantId;
        if (findCredentials === undefined) {
            throw new CredentialUnavailableError([
                "No implementation of `VisualStudioCodeCredential` is available.",
                "You must install the identity-vscode plugin package (`npm install --save-dev @azure/identity-vscode`)",
                "and enable it by importing `useIdentityPlugin` from `@azure/identity` and calling",
                "`useIdentityPlugin(vsCodePlugin)` before creating a `VisualStudioCodeCredential`.",
            ].join(" "));
        }
        let scopeString = typeof scopes === "string" ? scopes : scopes.join(" ");
        // Check to make sure the scope we get back is a valid scope
        if (!scopeString.match(/^[0-9a-zA-Z-.:/]+$/)) {
            const error = new Error("Invalid scope was specified by the user or calling client");
            logger.getToken.info(formatError(scopes, error));
            throw error;
        }
        if (scopeString.indexOf("offline_access") < 0) {
            scopeString += " offline_access";
        }
        // findCredentials returns an array similar to:
        // [
        //   {
        //     account: "",
        //     password: "",
        //   },
        //   /* ... */
        // ]
        const credentials = await findCredentials();
        // If we can't find the credential based on the name, we'll pick the first one available.
        const { password: refreshToken } = (_b = (_a = credentials.find(({ account }) => account === this.cloudName)) !== null && _a !== void 0 ? _a : credentials[0]) !== null && _b !== void 0 ? _b : {};
        if (refreshToken) {
            const tokenResponse = await this.identityClient.refreshAccessToken(tenantId, AzureAccountClientId, scopeString, refreshToken, undefined);
            if (tokenResponse) {
                logger.getToken.info(formatSuccess(scopes));
                return tokenResponse.accessToken;
            }
            else {
                const error = new CredentialUnavailableError("Could not retrieve the token associated with Visual Studio Code. Have you connected using the 'Azure Account' extension recently? To troubleshoot, visit https://aka.ms/azsdk/js/identity/vscodecredential/troubleshoot.");
                logger.getToken.info(formatError(scopes, error));
                throw error;
            }
        }
        else {
            const error = new CredentialUnavailableError("Could not retrieve the token associated with Visual Studio Code. Did you connect using the 'Azure Account' extension? To troubleshoot, visit https://aka.ms/azsdk/js/identity/vscodecredential/troubleshoot.");
            logger.getToken.info(formatError(scopes, error));
            throw error;
        }
    }
}
//# sourceMappingURL=visualStudioCodeCredential.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=visualStudioCodeCredentialPlugin.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createHttpHeaders, createPipelineRequest, } from "@azure/core-rest-pipeline";
import { credentialLogger } from "../../util/logging";
import { mapScopesToResource } from "./utils";
const msiName = "ManagedIdentityCredential - AppServiceMSI 2017";
const logger = credentialLogger(msiName);
/**
 * Formats the expiration date of the received token into the number of milliseconds between that date and midnight, January 1, 1970.
 */
function expiresOnParser(requestBody) {
    // App Service always returns string expires_on values.
    return Date.parse(requestBody.expires_on);
}
/**
 * Generates the options used on the request for an access token.
 */
function prepareRequestOptions(scopes, clientId) {
    const resource = mapScopesToResource(scopes);
    if (!resource) {
        throw new Error(`${msiName}: Multiple scopes are not supported.`);
    }
    const queryParameters = {
        resource,
        "api-version": "2017-09-01",
    };
    if (clientId) {
        queryParameters.clientid = clientId;
    }
    const query = new URLSearchParams(queryParameters);
    // This error should not bubble up, since we verify that this environment variable is defined in the isAvailable() method defined below.
    if (!process.env.MSI_ENDPOINT) {
        throw new Error(`${msiName}: Missing environment variable: MSI_ENDPOINT`);
    }
    if (!process.env.MSI_SECRET) {
        throw new Error(`${msiName}: Missing environment variable: MSI_SECRET`);
    }
    return {
        url: `${process.env.MSI_ENDPOINT}?${query.toString()}`,
        method: "GET",
        headers: createHttpHeaders({
            Accept: "application/json",
            secret: process.env.MSI_SECRET,
        }),
    };
}
/**
 * Defines how to determine whether the Azure App Service MSI is available, and also how to retrieve a token from the Azure App Service MSI.
 */
export const appServiceMsi2017 = {
    async isAvailable({ scopes }) {
        const resource = mapScopesToResource(scopes);
        if (!resource) {
            logger.info(`${msiName}: Unavailable. Multiple scopes are not supported.`);
            return false;
        }
        const env = process.env;
        const result = Boolean(env.MSI_ENDPOINT && env.MSI_SECRET);
        if (!result) {
            logger.info(`${msiName}: Unavailable. The environment variables needed are: MSI_ENDPOINT and MSI_SECRET.`);
        }
        return result;
    },
    async getToken(configuration, getTokenOptions = {}) {
        const { identityClient, scopes, clientId, resourceId } = configuration;
        if (resourceId) {
            logger.warning(`${msiName}: managed Identity by resource Id is not supported. Argument resourceId might be ignored by the service.`);
        }
        logger.info(`${msiName}: Using the endpoint and the secret coming form the environment variables: MSI_ENDPOINT=${process.env.MSI_ENDPOINT} and MSI_SECRET=[REDACTED].`);
        const request = createPipelineRequest(Object.assign(Object.assign({ abortSignal: getTokenOptions.abortSignal }, prepareRequestOptions(scopes, clientId)), { 
            // Generally, MSI endpoints use the HTTP protocol, without transport layer security (TLS).
            allowInsecureConnection: true }));
        const tokenResponse = await identityClient.sendTokenRequest(request, expiresOnParser);
        return (tokenResponse && tokenResponse.accessToken) || null;
    },
};
//# sourceMappingURL=appServiceMsi2017.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createHttpHeaders, createPipelineRequest, } from "@azure/core-rest-pipeline";
import { credentialLogger } from "../../util/logging";
import { mapScopesToResource } from "./utils";
const msiName = "ManagedIdentityCredential - AppServiceMSI 2019";
const logger = credentialLogger(msiName);
/**
 * Formats the expiration date of the received token into the number of milliseconds between that date and midnight, January 1, 1970.
 */
function expiresOnParser(requestBody) {
    // App Service always returns string expires_on values.
    return Date.parse(requestBody.expires_on);
}
/**
 * Generates the options used on the request for an access token.
 */
function prepareRequestOptions(scopes, clientId, resourceId) {
    const resource = mapScopesToResource(scopes);
    if (!resource) {
        throw new Error(`${msiName}: Multiple scopes are not supported.`);
    }
    const queryParameters = {
        resource,
        "api-version": "2019-08-01",
    };
    if (clientId) {
        queryParameters.client_id = clientId;
    }
    if (resourceId) {
        queryParameters.mi_res_id = resourceId;
    }
    const query = new URLSearchParams(queryParameters);
    // This error should not bubble up, since we verify that this environment variable is defined in the isAvailable() method defined below.
    if (!process.env.IDENTITY_ENDPOINT) {
        throw new Error(`${msiName}: Missing environment variable: IDENTITY_ENDPOINT`);
    }
    if (!process.env.IDENTITY_HEADER) {
        throw new Error(`${msiName}: Missing environment variable: IDENTITY_HEADER`);
    }
    return {
        url: `${process.env.IDENTITY_ENDPOINT}?${query.toString()}`,
        method: "GET",
        headers: createHttpHeaders({
            Accept: "application/json",
            "X-IDENTITY-HEADER": process.env.IDENTITY_HEADER,
        }),
    };
}
/**
 * Defines how to determine whether the Azure App Service MSI is available, and also how to retrieve a token from the Azure App Service MSI.
 */
export const appServiceMsi2019 = {
    async isAvailable({ scopes }) {
        const resource = mapScopesToResource(scopes);
        if (!resource) {
            logger.info(`${msiName}: Unavailable. Multiple scopes are not supported.`);
            return false;
        }
        const env = process.env;
        const result = Boolean(env.IDENTITY_ENDPOINT && env.IDENTITY_HEADER);
        if (!result) {
            logger.info(`${msiName}: Unavailable. The environment variables needed are: IDENTITY_ENDPOINT and IDENTITY_HEADER.`);
        }
        return result;
    },
    async getToken(configuration, getTokenOptions = {}) {
        const { identityClient, scopes, clientId, resourceId } = configuration;
        logger.info(`${msiName}: Using the endpoint and the secret coming form the environment variables: IDENTITY_ENDPOINT=${process.env.IDENTITY_ENDPOINT} and IDENTITY_HEADER=[REDACTED].`);
        const request = createPipelineRequest(Object.assign(Object.assign({ abortSignal: getTokenOptions.abortSignal }, prepareRequestOptions(scopes, clientId, resourceId)), { 
            // Generally, MSI endpoints use the HTTP protocol, without transport layer security (TLS).
            allowInsecureConnection: true }));
        const tokenResponse = await identityClient.sendTokenRequest(request, expiresOnParser);
        return (tokenResponse && tokenResponse.accessToken) || null;
    },
};
//# sourceMappingURL=appServiceMsi2019.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createHttpHeaders, createPipelineRequest, } from "@azure/core-rest-pipeline";
import { readFile } from "fs";
import { AuthenticationError } from "../../errors";
import { credentialLogger } from "../../util/logging";
import { mapScopesToResource } from "./utils";
import { azureArcAPIVersion } from "./constants";
const msiName = "ManagedIdentityCredential - Azure Arc MSI";
const logger = credentialLogger(msiName);
/**
 * Generates the options used on the request for an access token.
 */
function prepareRequestOptions(scopes, clientId, resourceId) {
    const resource = mapScopesToResource(scopes);
    if (!resource) {
        throw new Error(`${msiName}: Multiple scopes are not supported.`);
    }
    const queryParameters = {
        resource,
        "api-version": azureArcAPIVersion,
    };
    if (clientId) {
        queryParameters.client_id = clientId;
    }
    if (resourceId) {
        queryParameters.msi_res_id = resourceId;
    }
    // This error should not bubble up, since we verify that this environment variable is defined in the isAvailable() method defined below.
    if (!process.env.IDENTITY_ENDPOINT) {
        throw new Error(`${msiName}: Missing environment variable: IDENTITY_ENDPOINT`);
    }
    const query = new URLSearchParams(queryParameters);
    return createPipelineRequest({
        // Should be similar to: http://localhost:40342/metadata/identity/oauth2/token
        url: `${process.env.IDENTITY_ENDPOINT}?${query.toString()}`,
        method: "GET",
        headers: createHttpHeaders({
            Accept: "application/json",
            Metadata: "true",
        }),
    });
}
/**
 * Retrieves the file contents at the given path using promises.
 * Useful since `fs`'s readFileSync locks the thread, and to avoid extra dependencies.
 */
function readFileAsync(path, options) {
    return new Promise((resolve, reject) => readFile(path, options, (err, data) => {
        if (err) {
            reject(err);
        }
        resolve(data);
    }));
}
/**
 * Does a request to the authentication provider that results in a file path.
 */
async function filePathRequest(identityClient, requestPrepareOptions) {
    const response = await identityClient.sendRequest(createPipelineRequest(requestPrepareOptions));
    if (response.status !== 401) {
        let message = "";
        if (response.bodyAsText) {
            message = ` Response: ${response.bodyAsText}`;
        }
        throw new AuthenticationError(response.status, `${msiName}: To authenticate with Azure Arc MSI, status code 401 is expected on the first request. ${message}`);
    }
    const authHeader = response.headers.get("www-authenticate") || "";
    try {
        return authHeader.split("=").slice(1)[0];
    }
    catch (e) {
        throw Error(`Invalid www-authenticate header format: ${authHeader}`);
    }
}
/**
 * Defines how to determine whether the Azure Arc MSI is available, and also how to retrieve a token from the Azure Arc MSI.
 */
export const arcMsi = {
    async isAvailable({ scopes }) {
        const resource = mapScopesToResource(scopes);
        if (!resource) {
            logger.info(`${msiName}: Unavailable. Multiple scopes are not supported.`);
            return false;
        }
        const result = Boolean(process.env.IMDS_ENDPOINT && process.env.IDENTITY_ENDPOINT);
        if (!result) {
            logger.info(`${msiName}: The environment variables needed are: IMDS_ENDPOINT and IDENTITY_ENDPOINT`);
        }
        return result;
    },
    async getToken(configuration, getTokenOptions = {}) {
        var _a;
        const { identityClient, scopes, clientId, resourceId } = configuration;
        if (clientId) {
            logger.warning(`${msiName}: user-assigned identities not supported. The argument clientId might be ignored by the service.`);
        }
        if (resourceId) {
            logger.warning(`${msiName}: user defined managed Identity by resource Id is not supported. Argument resourceId will be ignored.`);
        }
        logger.info(`${msiName}: Authenticating.`);
        const requestOptions = Object.assign(Object.assign({ disableJsonStringifyOnBody: true, deserializationMapper: undefined, abortSignal: getTokenOptions.abortSignal }, prepareRequestOptions(scopes, clientId, resourceId)), { allowInsecureConnection: true });
        const filePath = await filePathRequest(identityClient, requestOptions);
        if (!filePath) {
            throw new Error(`${msiName}: Failed to find the token file.`);
        }
        const key = await readFileAsync(filePath, { encoding: "utf-8" });
        (_a = requestOptions.headers) === null || _a === void 0 ? void 0 : _a.set("Authorization", `Basic ${key}`);
        const request = createPipelineRequest(Object.assign(Object.assign({}, requestOptions), { 
            // Generally, MSI endpoints use the HTTP protocol, without transport layer security (TLS).
            allowInsecureConnection: true }));
        const tokenResponse = await identityClient.sendTokenRequest(request);
        return (tokenResponse && tokenResponse.accessToken) || null;
    },
};
//# sourceMappingURL=arcMsi.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createHttpHeaders, createPipelineRequest, } from "@azure/core-rest-pipeline";
import { credentialLogger } from "../../util/logging";
import { mapScopesToResource } from "./utils";
const msiName = "ManagedIdentityCredential - CloudShellMSI";
export const logger = credentialLogger(msiName);
/**
 * Generates the options used on the request for an access token.
 */
function prepareRequestOptions(scopes, clientId, resourceId) {
    const resource = mapScopesToResource(scopes);
    if (!resource) {
        throw new Error(`${msiName}: Multiple scopes are not supported.`);
    }
    const body = {
        resource,
    };
    if (clientId) {
        body.client_id = clientId;
    }
    if (resourceId) {
        body.msi_res_id = resourceId;
    }
    // This error should not bubble up, since we verify that this environment variable is defined in the isAvailable() method defined below.
    if (!process.env.MSI_ENDPOINT) {
        throw new Error(`${msiName}: Missing environment variable: MSI_ENDPOINT`);
    }
    const params = new URLSearchParams(body);
    return {
        url: process.env.MSI_ENDPOINT,
        method: "POST",
        body: params.toString(),
        headers: createHttpHeaders({
            Accept: "application/json",
            Metadata: "true",
            "Content-Type": "application/x-www-form-urlencoded",
        }),
    };
}
/**
 * Defines how to determine whether the Azure Cloud Shell MSI is available, and also how to retrieve a token from the Azure Cloud Shell MSI.
 * Since Azure Managed Identities aren't available in the Azure Cloud Shell, we log a warning for users that try to access cloud shell using user assigned identity.
 */
export const cloudShellMsi = {
    async isAvailable({ scopes }) {
        const resource = mapScopesToResource(scopes);
        if (!resource) {
            logger.info(`${msiName}: Unavailable. Multiple scopes are not supported.`);
            return false;
        }
        const result = Boolean(process.env.MSI_ENDPOINT);
        if (!result) {
            logger.info(`${msiName}: Unavailable. The environment variable MSI_ENDPOINT is needed.`);
        }
        return result;
    },
    async getToken(configuration, getTokenOptions = {}) {
        const { identityClient, scopes, clientId, resourceId } = configuration;
        if (clientId) {
            logger.warning(`${msiName}: user-assigned identities not supported. The argument clientId might be ignored by the service.`);
        }
        if (resourceId) {
            logger.warning(`${msiName}: user defined managed Identity by resource Id not supported. The argument resourceId might be ignored by the service.`);
        }
        logger.info(`${msiName}: Using the endpoint coming form the environment variable MSI_ENDPOINT = ${process.env.MSI_ENDPOINT}.`);
        const request = createPipelineRequest(Object.assign(Object.assign({ abortSignal: getTokenOptions.abortSignal }, prepareRequestOptions(scopes, clientId, resourceId)), { 
            // Generally, MSI endpoints use the HTTP protocol, without transport layer security (TLS).
            allowInsecureConnection: true }));
        const tokenResponse = await identityClient.sendTokenRequest(request);
        return (tokenResponse && tokenResponse.accessToken) || null;
    },
};
//# sourceMappingURL=cloudShellMsi.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export const DefaultScopeSuffix = "/.default";
export const imdsHost = "http://169.254.169.254";
export const imdsEndpointPath = "/metadata/identity/oauth2/token";
export const imdsApiVersion = "2018-02-01";
export const azureArcAPIVersion = "2019-11-01";
export const azureFabricVersion = "2019-07-01-preview";
//# sourceMappingURL=constants.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import https from "https";
import { createHttpHeaders, createPipelineRequest, } from "@azure/core-rest-pipeline";
import { credentialLogger } from "../../util/logging";
import { mapScopesToResource } from "./utils";
import { azureFabricVersion } from "./constants";
// This MSI can be easily tested by deploying a container to Azure Service Fabric with the Dockerfile:
//
//   FROM node:12
//   RUN wget https://host.any/path/bash.sh
//   CMD ["bash", "bash.sh"]
//
// Where the bash script contains:
//
//   curl --insecure $IDENTITY_ENDPOINT'?api-version=2019-07-01-preview&resource=https://vault.azure.net/' -H "Secret: $IDENTITY_HEADER"
//
const msiName = "ManagedIdentityCredential - Fabric MSI";
const logger = credentialLogger(msiName);
/**
 * Formats the expiration date of the received token into the number of milliseconds between that date and midnight, January 1, 1970.
 */
function expiresOnParser(requestBody) {
    // Parses a string representation of the milliseconds since epoch into a number value
    return Number(requestBody.expires_on);
}
/**
 * Generates the options used on the request for an access token.
 */
function prepareRequestOptions(scopes, clientId, resourceId) {
    const resource = mapScopesToResource(scopes);
    if (!resource) {
        throw new Error(`${msiName}: Multiple scopes are not supported.`);
    }
    const queryParameters = {
        resource,
        "api-version": azureFabricVersion,
    };
    if (clientId) {
        queryParameters.client_id = clientId;
    }
    if (resourceId) {
        queryParameters.msi_res_id = resourceId;
    }
    const query = new URLSearchParams(queryParameters);
    // This error should not bubble up, since we verify that this environment variable is defined in the isAvailable() method defined below.
    if (!process.env.IDENTITY_ENDPOINT) {
        throw new Error("Missing environment variable: IDENTITY_ENDPOINT");
    }
    if (!process.env.IDENTITY_HEADER) {
        throw new Error("Missing environment variable: IDENTITY_HEADER");
    }
    return {
        url: `${process.env.IDENTITY_ENDPOINT}?${query.toString()}`,
        method: "GET",
        headers: createHttpHeaders({
            Accept: "application/json",
            secret: process.env.IDENTITY_HEADER,
        }),
    };
}
/**
 * Defines how to determine whether the Azure Service Fabric MSI is available, and also how to retrieve a token from the Azure Service Fabric MSI.
 */
export const fabricMsi = {
    async isAvailable({ scopes }) {
        const resource = mapScopesToResource(scopes);
        if (!resource) {
            logger.info(`${msiName}: Unavailable. Multiple scopes are not supported.`);
            return false;
        }
        const env = process.env;
        const result = Boolean(env.IDENTITY_ENDPOINT && env.IDENTITY_HEADER && env.IDENTITY_SERVER_THUMBPRINT);
        if (!result) {
            logger.info(`${msiName}: Unavailable. The environment variables needed are: IDENTITY_ENDPOINT, IDENTITY_HEADER and IDENTITY_SERVER_THUMBPRINT`);
        }
        return result;
    },
    async getToken(configuration, getTokenOptions = {}) {
        const { scopes, identityClient, clientId, resourceId } = configuration;
        if (resourceId) {
            logger.warning(`${msiName}: user defined managed Identity by resource Id is not supported. Argument resourceId might be ignored by the service.`);
        }
        logger.info([
            `${msiName}:`,
            "Using the endpoint and the secret coming from the environment variables:",
            `IDENTITY_ENDPOINT=${process.env.IDENTITY_ENDPOINT},`,
            "IDENTITY_HEADER=[REDACTED] and",
            "IDENTITY_SERVER_THUMBPRINT=[REDACTED].",
        ].join(" "));
        const request = createPipelineRequest(Object.assign({ abortSignal: getTokenOptions.abortSignal }, prepareRequestOptions(scopes, clientId, resourceId)));
        request.agent = new https.Agent({
            // This is necessary because Service Fabric provides a self-signed certificate.
            // The alternative path is to verify the certificate using the IDENTITY_SERVER_THUMBPRINT env variable.
            rejectUnauthorized: false,
        });
        const tokenResponse = await identityClient.sendTokenRequest(request, expiresOnParser);
        return (tokenResponse && tokenResponse.accessToken) || null;
    },
};
//# sourceMappingURL=fabricMsi.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { delay } from "@azure/core-util";
import { RestError, createHttpHeaders, createPipelineRequest, } from "@azure/core-rest-pipeline";
import { credentialLogger } from "../../util/logging";
import { AuthenticationError } from "../../errors";
import { tracingClient } from "../../util/tracing";
import { imdsApiVersion, imdsEndpointPath, imdsHost } from "./constants";
import { mapScopesToResource } from "./utils";
const msiName = "ManagedIdentityCredential - IMDS";
const logger = credentialLogger(msiName);
/**
 * Formats the expiration date of the received token into the number of milliseconds between that date and midnight, January 1, 1970.
 */
function expiresOnParser(requestBody) {
    if (requestBody.expires_on) {
        // Use the expires_on timestamp if it's available
        const expires = +requestBody.expires_on * 1000;
        logger.info(`${msiName}: Using expires_on: ${expires} (original value: ${requestBody.expires_on})`);
        return expires;
    }
    else {
        // If these aren't possible, use expires_in and calculate a timestamp
        const expires = Date.now() + requestBody.expires_in * 1000;
        logger.info(`${msiName}: IMDS using expires_in: ${expires} (original value: ${requestBody.expires_in})`);
        return expires;
    }
}
/**
 * Generates the options used on the request for an access token.
 */
function prepareRequestOptions(scopes, clientId, resourceId, options) {
    var _a;
    const resource = mapScopesToResource(scopes);
    if (!resource) {
        throw new Error(`${msiName}: Multiple scopes are not supported.`);
    }
    const { skipQuery, skipMetadataHeader } = options || {};
    let query = "";
    // Pod Identity will try to process this request even if the Metadata header is missing.
    // We can exclude the request query to ensure no IMDS endpoint tries to process the ping request.
    if (!skipQuery) {
        const queryParameters = {
            resource,
            "api-version": imdsApiVersion,
        };
        if (clientId) {
            queryParameters.client_id = clientId;
        }
        if (resourceId) {
            queryParameters.msi_res_id = resourceId;
        }
        const params = new URLSearchParams(queryParameters);
        query = `?${params.toString()}`;
    }
    const url = new URL(imdsEndpointPath, (_a = process.env.AZURE_POD_IDENTITY_AUTHORITY_HOST) !== null && _a !== void 0 ? _a : imdsHost);
    const rawHeaders = {
        Accept: "application/json",
        Metadata: "true",
    };
    // Remove the Metadata header to invoke a request error from some IMDS endpoints.
    if (skipMetadataHeader) {
        delete rawHeaders.Metadata;
    }
    return {
        // In this case, the `?` should be added in the "query" variable `skipQuery` is not set.
        url: `${url}${query}`,
        method: "GET",
        headers: createHttpHeaders(rawHeaders),
    };
}
// 800ms -> 1600ms -> 3200ms
export const imdsMsiRetryConfig = {
    maxRetries: 3,
    startDelayInMs: 800,
    intervalIncrement: 2,
};
/**
 * Defines how to determine whether the Azure IMDS MSI is available, and also how to retrieve a token from the Azure IMDS MSI.
 */
export const imdsMsi = {
    async isAvailable({ scopes, identityClient, clientId, resourceId, getTokenOptions = {}, }) {
        const resource = mapScopesToResource(scopes);
        if (!resource) {
            logger.info(`${msiName}: Unavailable. Multiple scopes are not supported.`);
            return false;
        }
        // if the PodIdentityEndpoint environment variable was set no need to probe the endpoint, it can be assumed to exist
        if (process.env.AZURE_POD_IDENTITY_AUTHORITY_HOST) {
            return true;
        }
        if (!identityClient) {
            throw new Error("Missing IdentityClient");
        }
        const requestOptions = prepareRequestOptions(resource, clientId, resourceId, {
            skipMetadataHeader: true,
            skipQuery: true,
        });
        return tracingClient.withSpan("ManagedIdentityCredential-pingImdsEndpoint", getTokenOptions, async (options) => {
            var _a, _b;
            requestOptions.tracingOptions = options.tracingOptions;
            try {
                // Create a request with a timeout since we expect that
                // not having a "Metadata" header should cause an error to be
                // returned quickly from the endpoint, proving its availability.
                const request = createPipelineRequest(requestOptions);
                request.timeout = (_b = (_a = options.requestOptions) === null || _a === void 0 ? void 0 : _a.timeout) !== null && _b !== void 0 ? _b : 300;
                // This MSI uses the imdsEndpoint to get the token, which only uses http://
                request.allowInsecureConnection = true;
                try {
                    logger.info(`${msiName}: Pinging the Azure IMDS endpoint`);
                    await identityClient.sendRequest(request);
                }
                catch (err) {
                    if ((err.name === "RestError" && err.code === RestError.REQUEST_SEND_ERROR) ||
                        err.name === "AbortError" ||
                        err.code === "ENETUNREACH" || // Network unreachable
                        err.code === "ECONNREFUSED" || // connection refused
                        err.code === "EHOSTDOWN" // host is down
                    ) {
                        // If the request failed, or Node.js was unable to establish a connection,
                        // or the host was down, we'll assume the IMDS endpoint isn't available.
                        logger.info(`${msiName}: The Azure IMDS endpoint is unavailable`);
                        return false;
                    }
                }
                // If we received any response, the endpoint is available
                logger.info(`${msiName}: The Azure IMDS endpoint is available`);
                return true;
            }
            catch (err) {
                // createWebResource failed.
                // This error should bubble up to the user.
                logger.info(`${msiName}: Error when creating the WebResource for the Azure IMDS endpoint: ${err.message}`);
                throw err;
            }
        });
    },
    async getToken(configuration, getTokenOptions = {}) {
        const { identityClient, scopes, clientId, resourceId } = configuration;
        logger.info(`${msiName}: Using the Azure IMDS endpoint coming from the environment variable MSI_ENDPOINT=${process.env.MSI_ENDPOINT}, and using the cloud shell to proceed with the authentication.`);
        let nextDelayInMs = imdsMsiRetryConfig.startDelayInMs;
        for (let retries = 0; retries < imdsMsiRetryConfig.maxRetries; retries++) {
            try {
                const request = createPipelineRequest(Object.assign(Object.assign({ abortSignal: getTokenOptions.abortSignal }, prepareRequestOptions(scopes, clientId, resourceId)), { allowInsecureConnection: true }));
                const tokenResponse = await identityClient.sendTokenRequest(request, expiresOnParser);
                return (tokenResponse && tokenResponse.accessToken) || null;
            }
            catch (error) {
                if (error.statusCode === 404) {
                    await delay(nextDelayInMs);
                    nextDelayInMs *= imdsMsiRetryConfig.intervalIncrement;
                    continue;
                }
                throw error;
            }
        }
        throw new AuthenticationError(404, `${msiName}: Failed to retrieve IMDS token after ${imdsMsiRetryConfig.maxRetries} retries.`);
    },
};
//# sourceMappingURL=imdsMsi.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { credentialLogger, formatError } from "../../util/logging";
const BrowserNotSupportedError = new Error("ManagedIdentityCredential is not supported in the browser.");
const logger = credentialLogger("ManagedIdentityCredential");
export class ManagedIdentityCredential {
    constructor() {
        logger.info(formatError("", BrowserNotSupportedError));
        throw BrowserNotSupportedError;
    }
    async getToken() {
        logger.getToken.info(formatError("", BrowserNotSupportedError));
        throw BrowserNotSupportedError;
    }
}
//# sourceMappingURL=index.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { IdentityClient } from "../../client/identityClient";
import { AuthenticationError, CredentialUnavailableError } from "../../errors";
import { credentialLogger, formatError, formatSuccess } from "../../util/logging";
import { appServiceMsi2017 } from "./appServiceMsi2017";
import { tracingClient } from "../../util/tracing";
import { cloudShellMsi } from "./cloudShellMsi";
import { imdsMsi } from "./imdsMsi";
import { arcMsi } from "./arcMsi";
import { tokenExchangeMsi } from "./tokenExchangeMsi";
import { fabricMsi } from "./fabricMsi";
import { appServiceMsi2019 } from "./appServiceMsi2019";
const logger = credentialLogger("ManagedIdentityCredential");
/**
 * Attempts authentication using a managed identity available at the deployment environment.
 * This authentication type works in Azure VMs, App Service instances, Azure Functions applications,
 * Azure Kubernetes Services, Azure Service Fabric instances and inside of the Azure Cloud Shell.
 *
 * More information about configuring managed identities can be found here:
 * https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview
 */
export class ManagedIdentityCredential {
    /**
     * @internal
     * @hidden
     */
    constructor(clientIdOrOptions, options) {
        this.isEndpointUnavailable = null;
        let _options;
        if (typeof clientIdOrOptions === "string") {
            this.clientId = clientIdOrOptions;
            _options = options;
        }
        else {
            this.clientId = clientIdOrOptions === null || clientIdOrOptions === void 0 ? void 0 : clientIdOrOptions.clientId;
            _options = clientIdOrOptions;
        }
        this.resourceId = _options === null || _options === void 0 ? void 0 : _options.resourceId;
        // For JavaScript users.
        if (this.clientId && this.resourceId) {
            throw new Error(`${ManagedIdentityCredential.name} - Client Id and Resource Id can't be provided at the same time.`);
        }
        this.identityClient = new IdentityClient(_options);
        this.isAvailableIdentityClient = new IdentityClient(Object.assign(Object.assign({}, _options), { retryOptions: {
                maxRetries: 0,
            } }));
    }
    async cachedAvailableMSI(scopes, getTokenOptions) {
        if (this.cachedMSI) {
            return this.cachedMSI;
        }
        const MSIs = [
            arcMsi,
            fabricMsi,
            appServiceMsi2019,
            appServiceMsi2017,
            cloudShellMsi,
            tokenExchangeMsi(),
            imdsMsi,
        ];
        for (const msi of MSIs) {
            if (await msi.isAvailable({
                scopes,
                identityClient: this.isAvailableIdentityClient,
                clientId: this.clientId,
                resourceId: this.resourceId,
                getTokenOptions,
            })) {
                this.cachedMSI = msi;
                return msi;
            }
        }
        throw new CredentialUnavailableError(`${ManagedIdentityCredential.name} - No MSI credential available`);
    }
    async authenticateManagedIdentity(scopes, getTokenOptions) {
        const { span, updatedOptions } = tracingClient.startSpan(`${ManagedIdentityCredential.name}.authenticateManagedIdentity`, getTokenOptions);
        try {
            // Determining the available MSI, and avoiding checking for other MSIs while the program is running.
            const availableMSI = await this.cachedAvailableMSI(scopes, updatedOptions);
            return availableMSI.getToken({
                identityClient: this.identityClient,
                scopes,
                clientId: this.clientId,
                resourceId: this.resourceId,
            }, updatedOptions);
        }
        catch (err) {
            span.setStatus({
                status: "error",
                error: err,
            });
            throw err;
        }
        finally {
            span.end();
        }
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If authentication fails, a {@link CredentialUnavailableError} will be thrown with the details of the failure.
     * If an unexpected error occurs, an {@link AuthenticationError} will be thrown with the details of the failure.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                TokenCredential implementation might make.
     */
    async getToken(scopes, options) {
        let result = null;
        const { span, updatedOptions } = tracingClient.startSpan(`${ManagedIdentityCredential.name}.getToken`, options);
        try {
            // isEndpointAvailable can be true, false, or null,
            // If it's null, it means we don't yet know whether
            // the endpoint is available and need to check for it.
            if (this.isEndpointUnavailable !== true) {
                result = await this.authenticateManagedIdentity(scopes, updatedOptions);
                if (result === null) {
                    // If authenticateManagedIdentity returns null,
                    // it means no MSI endpoints are available.
                    // If so, we avoid trying to reach to them in future requests.
                    this.isEndpointUnavailable = true;
                    // It also means that the endpoint answered with either 200 or 201 (see the sendTokenRequest method),
                    // yet we had no access token. For this reason, we'll throw once with a specific message:
                    const error = new CredentialUnavailableError("The managed identity endpoint was reached, yet no tokens were received.");
                    logger.getToken.info(formatError(scopes, error));
                    throw error;
                }
                // Since `authenticateManagedIdentity` didn't throw, and the result was not null,
                // We will assume that this endpoint is reachable from this point forward,
                // and avoid pinging again to it.
                this.isEndpointUnavailable = false;
            }
            else {
                // We've previously determined that the endpoint was unavailable,
                // either because it was unreachable or permanently unable to authenticate.
                const error = new CredentialUnavailableError("The managed identity endpoint is not currently available");
                logger.getToken.info(formatError(scopes, error));
                throw error;
            }
            logger.getToken.info(formatSuccess(scopes));
            return result;
        }
        catch (err) {
            // CredentialUnavailable errors are expected to reach here.
            // We intend them to bubble up, so that DefaultAzureCredential can catch them.
            if (err.name === "AuthenticationRequiredError") {
                throw err;
            }
            // Expected errors to reach this point:
            // - Errors coming from a method unexpectedly breaking.
            // - When identityClient.sendTokenRequest throws, in which case
            //   if the status code was 400, it means that the endpoint is working,
            //   but no identity is available.
            span.setStatus({
                status: "error",
                error: err,
            });
            // If either the network is unreachable,
            // we can safely assume the credential is unavailable.
            if (err.code === "ENETUNREACH") {
                const error = new CredentialUnavailableError(`${ManagedIdentityCredential.name}: Unavailable. Network unreachable. Message: ${err.message}`);
                logger.getToken.info(formatError(scopes, error));
                throw error;
            }
            // If either the host was unreachable,
            // we can safely assume the credential is unavailable.
            if (err.code === "EHOSTUNREACH") {
                const error = new CredentialUnavailableError(`${ManagedIdentityCredential.name}: Unavailable. No managed identity endpoint found. Message: ${err.message}`);
                logger.getToken.info(formatError(scopes, error));
                throw error;
            }
            // If err.statusCode has a value of 400, it comes from sendTokenRequest,
            // and it means that the endpoint is working, but that no identity is available.
            if (err.statusCode === 400) {
                throw new CredentialUnavailableError(`${ManagedIdentityCredential.name}: The managed identity endpoint is indicating there's no available identity. Message: ${err.message}`);
            }
            // If the error has no status code, we can assume there was no available identity.
            // This will throw silently during any ChainedTokenCredential.
            if (err.statusCode === undefined) {
                throw new CredentialUnavailableError(`${ManagedIdentityCredential.name}: Authentication failed. Message ${err.message}`);
            }
            // Any other error should break the chain.
            throw new AuthenticationError(err.statusCode, {
                error: `${ManagedIdentityCredential.name} authentication failed.`,
                error_description: err.message,
            });
        }
        finally {
            // Finally is always called, both if we return and if we throw in the above try/catch.
            span.end();
        }
    }
}
//# sourceMappingURL=index.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=models.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import fs from "fs";
import { createHttpHeaders, createPipelineRequest, } from "@azure/core-rest-pipeline";
import { promisify } from "util";
import { DefaultAuthorityHost } from "../../constants";
import { credentialLogger } from "../../util/logging";
const msiName = "ManagedIdentityCredential - Token Exchange";
const logger = credentialLogger(msiName);
const readFileAsync = promisify(fs.readFile);
/**
 * Generates the options used on the request for an access token.
 */
function prepareRequestOptions(scopes, clientAssertion, clientId) {
    var _a;
    const bodyParams = {
        scope: Array.isArray(scopes) ? scopes.join(" ") : scopes,
        client_assertion: clientAssertion,
        client_assertion_type: "urn:ietf:params:oauth:client-assertion-type:jwt-bearer",
        client_id: clientId,
        grant_type: "client_credentials",
    };
    const urlParams = new URLSearchParams(bodyParams);
    const url = new URL(`${process.env.AZURE_TENANT_ID}/oauth2/v2.0/token`, (_a = process.env.AZURE_AUTHORITY_HOST) !== null && _a !== void 0 ? _a : DefaultAuthorityHost);
    return {
        url: url.toString(),
        method: "POST",
        body: urlParams.toString(),
        headers: createHttpHeaders({
            Accept: "application/json",
        }),
    };
}
/**
 * Defines how to determine whether the token exchange MSI is available, and also how to retrieve a token from the token exchange MSI.
 */
export function tokenExchangeMsi() {
    const azureFederatedTokenFilePath = process.env.AZURE_FEDERATED_TOKEN_FILE;
    let azureFederatedTokenFileContent = undefined;
    let cacheDate = undefined;
    // Only reads from the assertion file once every 5 minutes
    async function readAssertion() {
        // Cached assertions expire after 5 minutes
        if (cacheDate !== undefined && Date.now() - cacheDate >= 1000 * 60 * 5) {
            azureFederatedTokenFileContent = undefined;
        }
        if (!azureFederatedTokenFileContent) {
            const file = await readFileAsync(azureFederatedTokenFilePath, "utf8");
            const value = file.trim();
            if (!value) {
                throw new Error(`No content on the file ${azureFederatedTokenFilePath}, indicated by the environment variable AZURE_FEDERATED_TOKEN_FILE`);
            }
            else {
                azureFederatedTokenFileContent = value;
                cacheDate = Date.now();
            }
        }
        return azureFederatedTokenFileContent;
    }
    return {
        async isAvailable({ clientId }) {
            const env = process.env;
            const result = Boolean((clientId || env.AZURE_CLIENT_ID) && env.AZURE_TENANT_ID && azureFederatedTokenFilePath);
            if (!result) {
                logger.info(`${msiName}: Unavailable. The environment variables needed are: AZURE_CLIENT_ID (or the client ID sent through the parameters), AZURE_TENANT_ID and AZURE_FEDERATED_TOKEN_FILE`);
            }
            return result;
        },
        async getToken(configuration, getTokenOptions = {}) {
            const { identityClient, scopes, clientId } = configuration;
            logger.info(`${msiName}: Using the client assertion coming from environment variables.`);
            let assertion;
            try {
                assertion = await readAssertion();
            }
            catch (err) {
                throw new Error(`${msiName}: Failed to read ${azureFederatedTokenFilePath}, indicated by the environment variable AZURE_FEDERATED_TOKEN_FILE`);
            }
            const request = createPipelineRequest(Object.assign(Object.assign({ abortSignal: getTokenOptions.abortSignal }, prepareRequestOptions(scopes, assertion, clientId || process.env.AZURE_CLIENT_ID)), { 
                // Generally, MSI endpoints use the HTTP protocol, without transport layer security (TLS).
                allowInsecureConnection: true }));
            const tokenResponse = await identityClient.sendTokenRequest(request);
            return (tokenResponse && tokenResponse.accessToken) || null;
        },
    };
}
//# sourceMappingURL=tokenExchangeMsi.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { DefaultScopeSuffix } from "./constants";
/**
 * Most MSIs send requests to the IMDS endpoint, or a similar endpoint.
 * These are GET requests that require sending a `resource` parameter on the query.
 * This resource can be derived from the scopes received through the getToken call, as long as only one scope is received.
 * Multiple scopes assume that the resulting token will have access to multiple resources, which won't be the case.
 *
 * For that reason, when we encounter multiple scopes, we return undefined.
 * It's up to the individual MSI implementations to throw the errors (which helps us provide less generic errors).
 */
export function mapScopesToResource(scopes) {
    let scope = "";
    if (Array.isArray(scopes)) {
        if (scopes.length !== 1) {
            return;
        }
        scope = scopes[0];
    }
    else if (typeof scopes === "string") {
        scope = scopes;
    }
    if (!scope.endsWith(DefaultScopeSuffix)) {
        return scope;
    }
    return scope.substr(0, scope.lastIndexOf(DefaultScopeSuffix));
}
//# sourceMappingURL=utils.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { ServiceClient } from "@azure/core-client";
import { isNode } from "@azure/core-util";
import { createHttpHeaders, createPipelineRequest, } from "@azure/core-rest-pipeline";
import { AbortController } from "@azure/abort-controller";
import { AuthenticationError, AuthenticationErrorName } from "../errors";
import { getIdentityTokenEndpointSuffix } from "../util/identityTokenEndpoint";
import { DefaultAuthorityHost, SDK_VERSION } from "../constants";
import { tracingClient } from "../util/tracing";
import { logger } from "../util/logging";
const noCorrelationId = "noCorrelationId";
/**
 * @internal
 */
export function getIdentityClientAuthorityHost(options) {
    // The authorityHost can come from options or from the AZURE_AUTHORITY_HOST environment variable.
    let authorityHost = options === null || options === void 0 ? void 0 : options.authorityHost;
    // The AZURE_AUTHORITY_HOST environment variable can only be provided in Node.js.
    if (isNode) {
        authorityHost = authorityHost !== null && authorityHost !== void 0 ? authorityHost : process.env.AZURE_AUTHORITY_HOST;
    }
    // If the authorityHost is not provided, we use the default one from the public cloud: https://login.microsoftonline.com
    return authorityHost !== null && authorityHost !== void 0 ? authorityHost : DefaultAuthorityHost;
}
/**
 * The network module used by the Identity credentials.
 *
 * It allows for credentials to abort any pending request independently of the MSAL flow,
 * by calling to the `abortRequests()` method.
 *
 */
export class IdentityClient extends ServiceClient {
    constructor(options) {
        var _a, _b;
        const packageDetails = `azsdk-js-identity/${SDK_VERSION}`;
        const userAgentPrefix = ((_a = options === null || options === void 0 ? void 0 : options.userAgentOptions) === null || _a === void 0 ? void 0 : _a.userAgentPrefix)
            ? `${options.userAgentOptions.userAgentPrefix} ${packageDetails}`
            : `${packageDetails}`;
        const baseUri = getIdentityClientAuthorityHost(options);
        if (!baseUri.startsWith("https:")) {
            throw new Error("The authorityHost address must use the 'https' protocol.");
        }
        super(Object.assign(Object.assign({ requestContentType: "application/json; charset=utf-8", retryOptions: {
                maxRetries: 3,
            } }, options), { userAgentOptions: {
                userAgentPrefix,
            }, baseUri }));
        this.authorityHost = baseUri;
        this.abortControllers = new Map();
        this.allowLoggingAccountIdentifiers = (_b = options === null || options === void 0 ? void 0 : options.loggingOptions) === null || _b === void 0 ? void 0 : _b.allowLoggingAccountIdentifiers;
    }
    async sendTokenRequest(request, expiresOnParser) {
        logger.info(`IdentityClient: sending token request to [${request.url}]`);
        const response = await this.sendRequest(request);
        expiresOnParser =
            expiresOnParser ||
                ((responseBody) => {
                    return Date.now() + responseBody.expires_in * 1000;
                });
        if (response.bodyAsText && (response.status === 200 || response.status === 201)) {
            const parsedBody = JSON.parse(response.bodyAsText);
            if (!parsedBody.access_token) {
                return null;
            }
            this.logIdentifiers(response);
            const token = {
                accessToken: {
                    token: parsedBody.access_token,
                    expiresOnTimestamp: expiresOnParser(parsedBody),
                },
                refreshToken: parsedBody.refresh_token,
            };
            logger.info(`IdentityClient: [${request.url}] token acquired, expires on ${token.accessToken.expiresOnTimestamp}`);
            return token;
        }
        else {
            const error = new AuthenticationError(response.status, response.bodyAsText);
            logger.warning(`IdentityClient: authentication error. HTTP status: ${response.status}, ${error.errorResponse.errorDescription}`);
            throw error;
        }
    }
    async refreshAccessToken(tenantId, clientId, scopes, refreshToken, clientSecret, expiresOnParser, options = {}) {
        if (refreshToken === undefined) {
            return null;
        }
        logger.info(`IdentityClient: refreshing access token with client ID: ${clientId}, scopes: ${scopes} started`);
        const refreshParams = {
            grant_type: "refresh_token",
            client_id: clientId,
            refresh_token: refreshToken,
            scope: scopes,
        };
        if (clientSecret !== undefined) {
            refreshParams.client_secret = clientSecret;
        }
        const query = new URLSearchParams(refreshParams);
        return tracingClient.withSpan("IdentityClient.refreshAccessToken", options, async (updatedOptions) => {
            try {
                const urlSuffix = getIdentityTokenEndpointSuffix(tenantId);
                const request = createPipelineRequest({
                    url: `${this.authorityHost}/${tenantId}/${urlSuffix}`,
                    method: "POST",
                    body: query.toString(),
                    abortSignal: options.abortSignal,
                    headers: createHttpHeaders({
                        Accept: "application/json",
                        "Content-Type": "application/x-www-form-urlencoded",
                    }),
                    tracingOptions: updatedOptions.tracingOptions,
                });
                const response = await this.sendTokenRequest(request, expiresOnParser);
                logger.info(`IdentityClient: refreshed token for client ID: ${clientId}`);
                return response;
            }
            catch (err) {
                if (err.name === AuthenticationErrorName &&
                    err.errorResponse.error === "interaction_required") {
                    // It's likely that the refresh token has expired, so
                    // return null so that the credential implementation will
                    // initiate the authentication flow again.
                    logger.info(`IdentityClient: interaction required for client ID: ${clientId}`);
                    return null;
                }
                else {
                    logger.warning(`IdentityClient: failed refreshing token for client ID: ${clientId}: ${err}`);
                    throw err;
                }
            }
        });
    }
    // Here is a custom layer that allows us to abort requests that go through MSAL,
    // since MSAL doesn't allow us to pass options all the way through.
    generateAbortSignal(correlationId) {
        const controller = new AbortController();
        const controllers = this.abortControllers.get(correlationId) || [];
        controllers.push(controller);
        this.abortControllers.set(correlationId, controllers);
        const existingOnAbort = controller.signal.onabort;
        controller.signal.onabort = (...params) => {
            this.abortControllers.set(correlationId, undefined);
            if (existingOnAbort) {
                existingOnAbort(...params);
            }
        };
        return controller.signal;
    }
    abortRequests(correlationId) {
        const key = correlationId || noCorrelationId;
        const controllers = [
            ...(this.abortControllers.get(key) || []),
            // MSAL passes no correlation ID to the get requests...
            ...(this.abortControllers.get(noCorrelationId) || []),
        ];
        if (!controllers.length) {
            return;
        }
        for (const controller of controllers) {
            controller.abort();
        }
        this.abortControllers.set(key, undefined);
    }
    getCorrelationId(options) {
        var _a;
        const parameter = (_a = options === null || options === void 0 ? void 0 : options.body) === null || _a === void 0 ? void 0 : _a.split("&").map((part) => part.split("=")).find(([key]) => key === "client-request-id");
        return parameter && parameter.length ? parameter[1] || noCorrelationId : noCorrelationId;
    }
    // The MSAL network module methods follow
    async sendGetRequestAsync(url, options) {
        const request = createPipelineRequest({
            url,
            method: "GET",
            body: options === null || options === void 0 ? void 0 : options.body,
            headers: createHttpHeaders(options === null || options === void 0 ? void 0 : options.headers),
            abortSignal: this.generateAbortSignal(noCorrelationId),
        });
        const response = await this.sendRequest(request);
        this.logIdentifiers(response);
        return {
            body: response.bodyAsText ? JSON.parse(response.bodyAsText) : undefined,
            headers: response.headers.toJSON(),
            status: response.status,
        };
    }
    async sendPostRequestAsync(url, options) {
        const request = createPipelineRequest({
            url,
            method: "POST",
            body: options === null || options === void 0 ? void 0 : options.body,
            headers: createHttpHeaders(options === null || options === void 0 ? void 0 : options.headers),
            // MSAL doesn't send the correlation ID on the get requests.
            abortSignal: this.generateAbortSignal(this.getCorrelationId(options)),
        });
        const response = await this.sendRequest(request);
        this.logIdentifiers(response);
        return {
            body: response.bodyAsText ? JSON.parse(response.bodyAsText) : undefined,
            headers: response.headers.toJSON(),
            status: response.status,
        };
    }
    /**
     * If allowLoggingAccountIdentifiers was set on the constructor options
     * we try to log the account identifiers by parsing the received access token.
     *
     * The account identifiers we try to log are:
     * - `appid`: The application or Client Identifier.
     * - `upn`: User Principal Name.
     *   - It might not be available in some authentication scenarios.
     *   - If it's not available, we put a placeholder: "No User Principal Name available".
     * - `tid`: Tenant Identifier.
     * - `oid`: Object Identifier of the authenticated user.
     */
    logIdentifiers(response) {
        if (!this.allowLoggingAccountIdentifiers || !response.bodyAsText) {
            return;
        }
        const unavailableUpn = "No User Principal Name available";
        try {
            const parsed = response.parsedBody || JSON.parse(response.bodyAsText);
            const accessToken = parsed.access_token;
            if (!accessToken) {
                // Without an access token allowLoggingAccountIdentifiers isn't useful.
                return;
            }
            const base64Metadata = accessToken.split(".")[1];
            const { appid, upn, tid, oid } = JSON.parse(Buffer.from(base64Metadata, "base64").toString("utf8"));
            logger.info(`[Authenticated account] Client ID: ${appid}. Tenant ID: ${tid}. User Principal Name: ${upn || unavailableUpn}. Object ID (user): ${oid}`);
        }
        catch (e) {
            logger.warning("allowLoggingAccountIdentifiers was set, but we couldn't log the account information. Error:", e.message);
        }
    }
}
//# sourceMappingURL=identityClient.js.map'use strict';

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

var msalNode = require('@azure/msal-node');
var coreClient = require('@azure/core-client');
var coreUtil = require('@azure/core-util');
var coreRestPipeline = require('@azure/core-rest-pipeline');
var abortController = require('@azure/abort-controller');
var coreTracing = require('@azure/core-tracing');
var logger$m = require('@azure/logger');
var msalCommon = require('@azure/msal-common');
var uuid = require('uuid');
var fs = require('fs');
var os = require('os');
var path = require('path');
var child_process = require('child_process');
var crypto = require('crypto');
var util = require('util');
var https = require('https');
var http = require('http');
var open = require('open');
var stoppable = require('stoppable');

function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }

function _interopNamespace(e) {
    if (e && e.__esModule) return e;
    var n = Object.create(null);
    if (e) {
        Object.keys(e).forEach(function (k) {
            if (k !== 'default') {
                var d = Object.getOwnPropertyDescriptor(e, k);
                Object.defineProperty(n, k, d.get ? d : {
                    enumerable: true,
                    get: function () { return e[k]; }
                });
            }
        });
    }
    n["default"] = e;
    return Object.freeze(n);
}

var msalNode__namespace = /*#__PURE__*/_interopNamespace(msalNode);
var msalCommon__namespace = /*#__PURE__*/_interopNamespace(msalCommon);
var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
var os__default = /*#__PURE__*/_interopDefaultLegacy(os);
var path__default = /*#__PURE__*/_interopDefaultLegacy(path);
var child_process__default = /*#__PURE__*/_interopDefaultLegacy(child_process);
var child_process__namespace = /*#__PURE__*/_interopNamespace(child_process);
var https__default = /*#__PURE__*/_interopDefaultLegacy(https);
var http__default = /*#__PURE__*/_interopDefaultLegacy(http);
var open__default = /*#__PURE__*/_interopDefaultLegacy(open);
var stoppable__default = /*#__PURE__*/_interopDefaultLegacy(stoppable);

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
function isErrorResponse(errorResponse) {
    return (errorResponse &&
        typeof errorResponse.error === "string" &&
        typeof errorResponse.error_description === "string");
}
/**
 * The Error.name value of an CredentialUnavailable
 */
const CredentialUnavailableErrorName = "CredentialUnavailableError";
/**
 * This signifies that the credential that was tried in a chained credential
 * was not available to be used as the credential. Rather than treating this as
 * an error that should halt the chain, it's caught and the chain continues
 */
class CredentialUnavailableError extends Error {
    constructor(message) {
        super(message);
        this.name = CredentialUnavailableErrorName;
    }
}
/**
 * The Error.name value of an AuthenticationError
 */
const AuthenticationErrorName = "AuthenticationError";
/**
 * Provides details about a failure to authenticate with Azure Active
 * Directory.  The `errorResponse` field contains more details about
 * the specific failure.
 */
class AuthenticationError extends Error {
    // eslint-disable-next-line @typescript-eslint/ban-types
    constructor(statusCode, errorBody) {
        let errorResponse = {
            error: "unknown",
            errorDescription: "An unknown error occurred and no additional details are available.",
        };
        if (isErrorResponse(errorBody)) {
            errorResponse = convertOAuthErrorResponseToErrorResponse(errorBody);
        }
        else if (typeof errorBody === "string") {
            try {
                // Most error responses will contain JSON-formatted error details
                // in the response body
                const oauthErrorResponse = JSON.parse(errorBody);
                errorResponse = convertOAuthErrorResponseToErrorResponse(oauthErrorResponse);
            }
            catch (e) {
                if (statusCode === 400) {
                    errorResponse = {
                        error: "authority_not_found",
                        errorDescription: "The specified authority URL was not found.",
                    };
                }
                else {
                    errorResponse = {
                        error: "unknown_error",
                        errorDescription: `An unknown error has occurred. Response body:\n\n${errorBody}`,
                    };
                }
            }
        }
        else {
            errorResponse = {
                error: "unknown_error",
                errorDescription: "An unknown error occurred and no additional details are available.",
            };
        }
        super(`${errorResponse.error} Status code: ${statusCode}\nMore details:\n${errorResponse.errorDescription}`);
        this.statusCode = statusCode;
        this.errorResponse = errorResponse;
        // Ensure that this type reports the correct name
        this.name = AuthenticationErrorName;
    }
}
/**
 * The Error.name value of an AggregateAuthenticationError
 */
const AggregateAuthenticationErrorName = "AggregateAuthenticationError";
/**
 * Provides an `errors` array containing {@link AuthenticationError} instance
 * for authentication failures from credentials in a {@link ChainedTokenCredential}.
 */
class AggregateAuthenticationError extends Error {
    constructor(errors, errorMessage) {
        const errorDetail = errors.join("\n");
        super(`${errorMessage}\n${errorDetail}`);
        this.errors = errors;
        // Ensure that this type reports the correct name
        this.name = AggregateAuthenticationErrorName;
    }
}
function convertOAuthErrorResponseToErrorResponse(errorBody) {
    return {
        error: errorBody.error,
        errorDescription: errorBody.error_description,
        correlationId: errorBody.correlation_id,
        errorCodes: errorBody.error_codes,
        timestamp: errorBody.timestamp,
        traceId: errorBody.trace_id,
    };
}
/**
 * Error used to enforce authentication after trying to retrieve a token silently.
 */
class AuthenticationRequiredError extends Error {
    constructor(
    /**
     * Optional parameters. A message can be specified. The {@link GetTokenOptions} of the request can also be specified to more easily associate the error with the received parameters.
     */
    options) {
        super(options.message);
        this.scopes = options.scopes;
        this.getTokenOptions = options.getTokenOptions;
        this.name = "AuthenticationRequiredError";
    }
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
function getIdentityTokenEndpointSuffix(tenantId) {
    if (tenantId === "adfs") {
        return "oauth2/token";
    }
    else {
        return "oauth2/v2.0/token";
    }
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Current version of the `@azure/identity` package.
 */
const SDK_VERSION = `2.1.0`;
/**
 * The default client ID for authentication
 * @internal
 */
// TODO: temporary - this is the Azure CLI clientID - we'll replace it when
// Developer Sign On application is available
// https://github.com/Azure/azure-sdk-for-net/blob/main/sdk/identity/Azure.Identity/src/Constants.cs#L9
const DeveloperSignOnClientId = "04b07795-8ddb-461a-bbee-02f9e1bf7b46";
/**
 * The default tenant for authentication
 * @internal
 */
const DefaultTenantId = "common";
/**
 * A list of known Azure authority hosts
 */
exports.AzureAuthorityHosts = void 0;
(function (AzureAuthorityHosts) {
    /**
     * China-based Azure Authority Host
     */
    AzureAuthorityHosts["AzureChina"] = "https://login.chinacloudapi.cn";
    /**
     * Germany-based Azure Authority Host
     */
    AzureAuthorityHosts["AzureGermany"] = "https://login.microsoftonline.de";
    /**
     * US Government Azure Authority Host
     */
    AzureAuthorityHosts["AzureGovernment"] = "https://login.microsoftonline.us";
    /**
     * Public Cloud Azure Authority Host
     */
    AzureAuthorityHosts["AzurePublicCloud"] = "https://login.microsoftonline.com";
})(exports.AzureAuthorityHosts || (exports.AzureAuthorityHosts = {}));
/**
 * The default authority host.
 */
const DefaultAuthorityHost = exports.AzureAuthorityHosts.AzurePublicCloud;

// Copyright (c) Microsoft Corporation.
/**
 * Creates a span using the global tracer.
 * @internal
 */
const tracingClient = coreTracing.createTracingClient({
    namespace: "Microsoft.AAD",
    packageName: "@azure/identity",
    packageVersion: SDK_VERSION,
});

// Copyright (c) Microsoft Corporation.
/**
 * The AzureLogger used for all clients within the identity package
 */
const logger$l = logger$m.createClientLogger("identity");
/**
 * Separates a list of environment variable names into a plain object with two arrays: an array of missing environment variables and another array with assigned environment variables.
 * @param supportedEnvVars - List of environment variable names
 */
function processEnvVars(supportedEnvVars) {
    return supportedEnvVars.reduce((acc, envVariable) => {
        if (process.env[envVariable]) {
            acc.assigned.push(envVariable);
        }
        else {
            acc.missing.push(envVariable);
        }
        return acc;
    }, { missing: [], assigned: [] });
}
/**
 * Formatting the success event on the credentials
 */
function formatSuccess(scope) {
    return `SUCCESS. Scopes: ${Array.isArray(scope) ? scope.join(", ") : scope}.`;
}
/**
 * Formatting the success event on the credentials
 */
function formatError(scope, error) {
    let message = "ERROR.";
    if (scope === null || scope === void 0 ? void 0 : scope.length) {
        message += ` Scopes: ${Array.isArray(scope) ? scope.join(", ") : scope}.`;
    }
    return `${message} Error message: ${typeof error === "string" ? error : error.message}.`;
}
/**
 * Generates a CredentialLoggerInstance.
 *
 * It logs with the format:
 *
 *   `[title] => [message]`
 *
 */
function credentialLoggerInstance(title, parent, log = logger$l) {
    const fullTitle = parent ? `${parent.fullTitle} ${title}` : title;
    function info(message) {
        log.info(`${fullTitle} =>`, message);
    }
    function warning(message) {
        log.warning(`${fullTitle} =>`, message);
    }
    return {
        title,
        fullTitle,
        info,
        warning,
    };
}
/**
 * Generates a CredentialLogger, which is a logger declared at the credential's constructor, and used at any point in the credential.
 * It has all the properties of a CredentialLoggerInstance, plus other logger instances, one per method.
 *
 * It logs with the format:
 *
 *   `[title] => [message]`
 *   `[title] => getToken() => [message]`
 *
 */
function credentialLogger(title, log = logger$l) {
    const credLogger = credentialLoggerInstance(title, undefined, log);
    return Object.assign(Object.assign({}, credLogger), { parent: log, getToken: credentialLoggerInstance("=> getToken()", credLogger, log) });
}

// Copyright (c) Microsoft Corporation.
const noCorrelationId = "noCorrelationId";
/**
 * @internal
 */
function getIdentityClientAuthorityHost(options) {
    // The authorityHost can come from options or from the AZURE_AUTHORITY_HOST environment variable.
    let authorityHost = options === null || options === void 0 ? void 0 : options.authorityHost;
    // The AZURE_AUTHORITY_HOST environment variable can only be provided in Node.js.
    if (coreUtil.isNode) {
        authorityHost = authorityHost !== null && authorityHost !== void 0 ? authorityHost : process.env.AZURE_AUTHORITY_HOST;
    }
    // If the authorityHost is not provided, we use the default one from the public cloud: https://login.microsoftonline.com
    return authorityHost !== null && authorityHost !== void 0 ? authorityHost : DefaultAuthorityHost;
}
/**
 * The network module used by the Identity credentials.
 *
 * It allows for credentials to abort any pending request independently of the MSAL flow,
 * by calling to the `abortRequests()` method.
 *
 */
class IdentityClient extends coreClient.ServiceClient {
    constructor(options) {
        var _a, _b;
        const packageDetails = `azsdk-js-identity/${SDK_VERSION}`;
        const userAgentPrefix = ((_a = options === null || options === void 0 ? void 0 : options.userAgentOptions) === null || _a === void 0 ? void 0 : _a.userAgentPrefix)
            ? `${options.userAgentOptions.userAgentPrefix} ${packageDetails}`
            : `${packageDetails}`;
        const baseUri = getIdentityClientAuthorityHost(options);
        if (!baseUri.startsWith("https:")) {
            throw new Error("The authorityHost address must use the 'https' protocol.");
        }
        super(Object.assign(Object.assign({ requestContentType: "application/json; charset=utf-8", retryOptions: {
                maxRetries: 3,
            } }, options), { userAgentOptions: {
                userAgentPrefix,
            }, baseUri }));
        this.authorityHost = baseUri;
        this.abortControllers = new Map();
        this.allowLoggingAccountIdentifiers = (_b = options === null || options === void 0 ? void 0 : options.loggingOptions) === null || _b === void 0 ? void 0 : _b.allowLoggingAccountIdentifiers;
    }
    async sendTokenRequest(request, expiresOnParser) {
        logger$l.info(`IdentityClient: sending token request to [${request.url}]`);
        const response = await this.sendRequest(request);
        expiresOnParser =
            expiresOnParser ||
                ((responseBody) => {
                    return Date.now() + responseBody.expires_in * 1000;
                });
        if (response.bodyAsText && (response.status === 200 || response.status === 201)) {
            const parsedBody = JSON.parse(response.bodyAsText);
            if (!parsedBody.access_token) {
                return null;
            }
            this.logIdentifiers(response);
            const token = {
                accessToken: {
                    token: parsedBody.access_token,
                    expiresOnTimestamp: expiresOnParser(parsedBody),
                },
                refreshToken: parsedBody.refresh_token,
            };
            logger$l.info(`IdentityClient: [${request.url}] token acquired, expires on ${token.accessToken.expiresOnTimestamp}`);
            return token;
        }
        else {
            const error = new AuthenticationError(response.status, response.bodyAsText);
            logger$l.warning(`IdentityClient: authentication error. HTTP status: ${response.status}, ${error.errorResponse.errorDescription}`);
            throw error;
        }
    }
    async refreshAccessToken(tenantId, clientId, scopes, refreshToken, clientSecret, expiresOnParser, options = {}) {
        if (refreshToken === undefined) {
            return null;
        }
        logger$l.info(`IdentityClient: refreshing access token with client ID: ${clientId}, scopes: ${scopes} started`);
        const refreshParams = {
            grant_type: "refresh_token",
            client_id: clientId,
            refresh_token: refreshToken,
            scope: scopes,
        };
        if (clientSecret !== undefined) {
            refreshParams.client_secret = clientSecret;
        }
        const query = new URLSearchParams(refreshParams);
        return tracingClient.withSpan("IdentityClient.refreshAccessToken", options, async (updatedOptions) => {
            try {
                const urlSuffix = getIdentityTokenEndpointSuffix(tenantId);
                const request = coreRestPipeline.createPipelineRequest({
                    url: `${this.authorityHost}/${tenantId}/${urlSuffix}`,
                    method: "POST",
                    body: query.toString(),
                    abortSignal: options.abortSignal,
                    headers: coreRestPipeline.createHttpHeaders({
                        Accept: "application/json",
                        "Content-Type": "application/x-www-form-urlencoded",
                    }),
                    tracingOptions: updatedOptions.tracingOptions,
                });
                const response = await this.sendTokenRequest(request, expiresOnParser);
                logger$l.info(`IdentityClient: refreshed token for client ID: ${clientId}`);
                return response;
            }
            catch (err) {
                if (err.name === AuthenticationErrorName &&
                    err.errorResponse.error === "interaction_required") {
                    // It's likely that the refresh token has expired, so
                    // return null so that the credential implementation will
                    // initiate the authentication flow again.
                    logger$l.info(`IdentityClient: interaction required for client ID: ${clientId}`);
                    return null;
                }
                else {
                    logger$l.warning(`IdentityClient: failed refreshing token for client ID: ${clientId}: ${err}`);
                    throw err;
                }
            }
        });
    }
    // Here is a custom layer that allows us to abort requests that go through MSAL,
    // since MSAL doesn't allow us to pass options all the way through.
    generateAbortSignal(correlationId) {
        const controller = new abortController.AbortController();
        const controllers = this.abortControllers.get(correlationId) || [];
        controllers.push(controller);
        this.abortControllers.set(correlationId, controllers);
        const existingOnAbort = controller.signal.onabort;
        controller.signal.onabort = (...params) => {
            this.abortControllers.set(correlationId, undefined);
            if (existingOnAbort) {
                existingOnAbort(...params);
            }
        };
        return controller.signal;
    }
    abortRequests(correlationId) {
        const key = correlationId || noCorrelationId;
        const controllers = [
            ...(this.abortControllers.get(key) || []),
            // MSAL passes no correlation ID to the get requests...
            ...(this.abortControllers.get(noCorrelationId) || []),
        ];
        if (!controllers.length) {
            return;
        }
        for (const controller of controllers) {
            controller.abort();
        }
        this.abortControllers.set(key, undefined);
    }
    getCorrelationId(options) {
        var _a;
        const parameter = (_a = options === null || options === void 0 ? void 0 : options.body) === null || _a === void 0 ? void 0 : _a.split("&").map((part) => part.split("=")).find(([key]) => key === "client-request-id");
        return parameter && parameter.length ? parameter[1] || noCorrelationId : noCorrelationId;
    }
    // The MSAL network module methods follow
    async sendGetRequestAsync(url, options) {
        const request = coreRestPipeline.createPipelineRequest({
            url,
            method: "GET",
            body: options === null || options === void 0 ? void 0 : options.body,
            headers: coreRestPipeline.createHttpHeaders(options === null || options === void 0 ? void 0 : options.headers),
            abortSignal: this.generateAbortSignal(noCorrelationId),
        });
        const response = await this.sendRequest(request);
        this.logIdentifiers(response);
        return {
            body: response.bodyAsText ? JSON.parse(response.bodyAsText) : undefined,
            headers: response.headers.toJSON(),
            status: response.status,
        };
    }
    async sendPostRequestAsync(url, options) {
        const request = coreRestPipeline.createPipelineRequest({
            url,
            method: "POST",
            body: options === null || options === void 0 ? void 0 : options.body,
            headers: coreRestPipeline.createHttpHeaders(options === null || options === void 0 ? void 0 : options.headers),
            // MSAL doesn't send the correlation ID on the get requests.
            abortSignal: this.generateAbortSignal(this.getCorrelationId(options)),
        });
        const response = await this.sendRequest(request);
        this.logIdentifiers(response);
        return {
            body: response.bodyAsText ? JSON.parse(response.bodyAsText) : undefined,
            headers: response.headers.toJSON(),
            status: response.status,
        };
    }
    /**
     * If allowLoggingAccountIdentifiers was set on the constructor options
     * we try to log the account identifiers by parsing the received access token.
     *
     * The account identifiers we try to log are:
     * - `appid`: The application or Client Identifier.
     * - `upn`: User Principal Name.
     *   - It might not be available in some authentication scenarios.
     *   - If it's not available, we put a placeholder: "No User Principal Name available".
     * - `tid`: Tenant Identifier.
     * - `oid`: Object Identifier of the authenticated user.
     */
    logIdentifiers(response) {
        if (!this.allowLoggingAccountIdentifiers || !response.bodyAsText) {
            return;
        }
        const unavailableUpn = "No User Principal Name available";
        try {
            const parsed = response.parsedBody || JSON.parse(response.bodyAsText);
            const accessToken = parsed.access_token;
            if (!accessToken) {
                // Without an access token allowLoggingAccountIdentifiers isn't useful.
                return;
            }
            const base64Metadata = accessToken.split(".")[1];
            const { appid, upn, tid, oid } = JSON.parse(Buffer.from(base64Metadata, "base64").toString("utf8"));
            logger$l.info(`[Authenticated account] Client ID: ${appid}. Tenant ID: ${tid}. User Principal Name: ${upn || unavailableUpn}. Object ID (user): ${oid}`);
        }
        catch (e) {
            logger$l.warning("allowLoggingAccountIdentifiers was set, but we couldn't log the account information. Error:", e.message);
        }
    }
}

// Copyright (c) Microsoft Corporation.
function checkTenantId(logger, tenantId) {
    if (!tenantId.match(/^[0-9a-zA-Z-.:/]+$/)) {
        const error = new Error("Invalid tenant id provided. You can locate your tenant id by following the instructions listed here: https://docs.microsoft.com/partner-center/find-ids-and-domain-names.");
        logger.info(formatError("", error));
        throw error;
    }
}

// Copyright (c) Microsoft Corporation.
function resolveTenantId(logger, tenantId, clientId) {
    if (tenantId) {
        checkTenantId(logger, tenantId);
        return tenantId;
    }
    if (!clientId) {
        clientId = DeveloperSignOnClientId;
    }
    if (clientId !== DeveloperSignOnClientId) {
        return "common";
    }
    return "organizations";
}

// Copyright (c) Microsoft Corporation.
/**
 * Latest AuthenticationRecord version
 * @internal
 */
const LatestAuthenticationRecordVersion = "1.0";
/**
 * Ensures the validity of the MSAL token
 * @internal
 */
function ensureValidMsalToken(scopes, logger, msalToken, getTokenOptions) {
    const error = (message) => {
        logger.getToken.info(message);
        return new AuthenticationRequiredError({
            scopes: Array.isArray(scopes) ? scopes : [scopes],
            getTokenOptions,
            message,
        });
    };
    if (!msalToken) {
        throw error("No response");
    }
    if (!msalToken.expiresOn) {
        throw error(`Response had no "expiresOn" property.`);
    }
    if (!msalToken.accessToken) {
        throw error(`Response had no "accessToken" property.`);
    }
}
/**
 * Generates a valid authority by combining a host with a tenantId.
 * @internal
 */
function getAuthority(tenantId, host) {
    if (!host) {
        host = DefaultAuthorityHost;
    }
    if (new RegExp(`${tenantId}/?$`).test(host)) {
        return host;
    }
    if (host.endsWith("/")) {
        return host + tenantId;
    }
    else {
        return `${host}/${tenantId}`;
    }
}
/**
 * Generates the known authorities.
 * If the Tenant Id is `adfs`, the authority can't be validated since the format won't match the expected one.
 * For that reason, we have to force MSAL to disable validating the authority
 * by sending it within the known authorities in the MSAL configuration.
 * @internal
 */
function getKnownAuthorities(tenantId, authorityHost) {
    if (tenantId === "adfs" && authorityHost) {
        return [authorityHost];
    }
    return [];
}
/**
 * Generates a logger that can be passed to the MSAL clients.
 * @param logger - The logger of the credential.
 * @internal
 */
const defaultLoggerCallback = (logger, platform = coreUtil.isNode ? "Node" : "Browser") => (level, message, containsPii) => {
    if (containsPii) {
        return;
    }
    switch (level) {
        case msalCommon__namespace.LogLevel.Error:
            logger.info(`MSAL ${platform} V2 error: ${message}`);
            return;
        case msalCommon__namespace.LogLevel.Info:
            logger.info(`MSAL ${platform} V2 info message: ${message}`);
            return;
        case msalCommon__namespace.LogLevel.Verbose:
            logger.info(`MSAL ${platform} V2 verbose message: ${message}`);
            return;
        case msalCommon__namespace.LogLevel.Warning:
            logger.info(`MSAL ${platform} V2 warning: ${message}`);
            return;
    }
};
/**
 * The common utility functions for the MSAL clients.
 * Defined as a class so that the classes extending this one can have access to its methods and protected properties.
 *
 * It keeps track of a logger and an in-memory copy of the AuthenticationRecord.
 *
 * @internal
 */
class MsalBaseUtilities {
    constructor(options) {
        this.logger = options.logger;
        this.account = options.authenticationRecord;
    }
    /**
     * Generates a UUID
     */
    generateUuid() {
        return uuid.v4();
    }
    /**
     * Handles the MSAL authentication result.
     * If the result has an account, we update the local account reference.
     * If the token received is invalid, an error will be thrown depending on what's missing.
     */
    handleResult(scopes, clientId, result, getTokenOptions) {
        if (result === null || result === void 0 ? void 0 : result.account) {
            this.account = msalToPublic(clientId, result.account);
        }
        ensureValidMsalToken(scopes, this.logger, result, getTokenOptions);
        this.logger.getToken.info(formatSuccess(scopes));
        return {
            token: result.accessToken,
            expiresOnTimestamp: result.expiresOn.getTime(),
        };
    }
    /**
     * Handles MSAL errors.
     */
    handleError(scopes, error, getTokenOptions) {
        if (error.name === "AuthError" ||
            error.name === "ClientAuthError" ||
            error.name === "BrowserAuthError") {
            const msalError = error;
            switch (msalError.errorCode) {
                case "endpoints_resolution_error":
                    this.logger.info(formatError(scopes, error.message));
                    return new CredentialUnavailableError(error.message);
                case "device_code_polling_cancelled":
                    return new abortController.AbortError("The authentication has been aborted by the caller.");
                case "consent_required":
                case "interaction_required":
                case "login_required":
                    this.logger.info(formatError(scopes, `Authentication returned errorCode ${msalError.errorCode}`));
                    break;
                default:
                    this.logger.info(formatError(scopes, `Failed to acquire token: ${error.message}`));
                    break;
            }
        }
        if (error.name === "ClientConfigurationError" ||
            error.name === "BrowserConfigurationAuthError" ||
            error.name === "AbortError") {
            return error;
        }
        return new AuthenticationRequiredError({ scopes, getTokenOptions, message: error.message });
    }
}
// transformations.ts
function publicToMsal(account) {
    const [environment] = account.authority.match(/([a-z]*\.[a-z]*\.[a-z]*)/) || [];
    return Object.assign(Object.assign({}, account), { localAccountId: account.homeAccountId, environment });
}
function msalToPublic(clientId, account) {
    const record = {
        authority: getAuthority(account.tenantId, account.environment),
        homeAccountId: account.homeAccountId,
        tenantId: account.tenantId || DefaultTenantId,
        username: account.username,
        clientId,
        version: LatestAuthenticationRecordVersion,
    };
    return record;
}
/**
 * Serializes an `AuthenticationRecord` into a string.
 *
 * The output of a serialized authentication record will contain the following properties:
 *
 * - "authority"
 * - "homeAccountId"
 * - "clientId"
 * - "tenantId"
 * - "username"
 * - "version"
 *
 * To later convert this string to a serialized `AuthenticationRecord`, please use the exported function `deserializeAuthenticationRecord()`.
 */
function serializeAuthenticationRecord(record) {
    return JSON.stringify(record);
}
/**
 * Deserializes a previously serialized authentication record from a string into an object.
 *
 * The input string must contain the following properties:
 *
 * - "authority"
 * - "homeAccountId"
 * - "clientId"
 * - "tenantId"
 * - "username"
 * - "version"
 *
 * If the version we receive is unsupported, an error will be thrown.
 *
 * At the moment, the only available version is: "1.0", which is always set when the authentication record is serialized.
 *
 * @param serializedRecord - Authentication record previously serialized into string.
 * @returns AuthenticationRecord.
 */
function deserializeAuthenticationRecord(serializedRecord) {
    const parsed = JSON.parse(serializedRecord);
    if (parsed.version && parsed.version !== LatestAuthenticationRecordVersion) {
        throw Error("Unsupported AuthenticationRecord version");
    }
    return parsed;
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * @internal
 */
const multiTenantDisabledErrorMessage = "A getToken request was attempted with a tenant different than the tenant configured at the initialization of the credential, but multi-tenant authentication has been disabled by the environment variable AZURE_IDENTITY_DISABLE_MULTITENANTAUTH.";
/**
 * @internal
 */
const multiTenantADFSErrorMessage = "A new tenant Id can't be assigned through the GetTokenOptions when a credential has been originally configured to use the tenant `adfs`.";
/**
 * Of getToken contains a tenantId, this functions allows picking this tenantId as the appropriate for authentication,
 * unless multitenant authentication has been disabled through the AZURE_IDENTITY_DISABLE_MULTITENANTAUTH (on Node.js),
 * or unless the original tenant Id is `adfs`.
 * @internal
 */
function processMultiTenantRequest(tenantId, getTokenOptions) {
    if (!(getTokenOptions === null || getTokenOptions === void 0 ? void 0 : getTokenOptions.tenantId)) {
        return tenantId;
    }
    if (process.env.AZURE_IDENTITY_DISABLE_MULTITENANTAUTH) {
        throw new Error(multiTenantDisabledErrorMessage);
    }
    if (tenantId === "adfs") {
        throw new Error(multiTenantADFSErrorMessage);
    }
    return getTokenOptions === null || getTokenOptions === void 0 ? void 0 : getTokenOptions.tenantId;
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * Helps specify a regional authority, or "AutoDiscoverRegion" to auto-detect the region.
 */
var RegionalAuthority;
(function (RegionalAuthority) {
    /** Instructs MSAL to attempt to discover the region */
    RegionalAuthority["AutoDiscoverRegion"] = "AutoDiscoverRegion";
    /** Uses the {@link RegionalAuthority} for the Azure 'westus' region. */
    RegionalAuthority["USWest"] = "westus";
    /** Uses the {@link RegionalAuthority} for the Azure 'westus2' region. */
    RegionalAuthority["USWest2"] = "westus2";
    /** Uses the {@link RegionalAuthority} for the Azure 'centralus' region. */
    RegionalAuthority["USCentral"] = "centralus";
    /** Uses the {@link RegionalAuthority} for the Azure 'eastus' region. */
    RegionalAuthority["USEast"] = "eastus";
    /** Uses the {@link RegionalAuthority} for the Azure 'eastus2' region. */
    RegionalAuthority["USEast2"] = "eastus2";
    /** Uses the {@link RegionalAuthority} for the Azure 'northcentralus' region. */
    RegionalAuthority["USNorthCentral"] = "northcentralus";
    /** Uses the {@link RegionalAuthority} for the Azure 'southcentralus' region. */
    RegionalAuthority["USSouthCentral"] = "southcentralus";
    /** Uses the {@link RegionalAuthority} for the Azure 'westcentralus' region. */
    RegionalAuthority["USWestCentral"] = "westcentralus";
    /** Uses the {@link RegionalAuthority} for the Azure 'canadacentral' region. */
    RegionalAuthority["CanadaCentral"] = "canadacentral";
    /** Uses the {@link RegionalAuthority} for the Azure 'canadaeast' region. */
    RegionalAuthority["CanadaEast"] = "canadaeast";
    /** Uses the {@link RegionalAuthority} for the Azure 'brazilsouth' region. */
    RegionalAuthority["BrazilSouth"] = "brazilsouth";
    /** Uses the {@link RegionalAuthority} for the Azure 'northeurope' region. */
    RegionalAuthority["EuropeNorth"] = "northeurope";
    /** Uses the {@link RegionalAuthority} for the Azure 'westeurope' region. */
    RegionalAuthority["EuropeWest"] = "westeurope";
    /** Uses the {@link RegionalAuthority} for the Azure 'uksouth' region. */
    RegionalAuthority["UKSouth"] = "uksouth";
    /** Uses the {@link RegionalAuthority} for the Azure 'ukwest' region. */
    RegionalAuthority["UKWest"] = "ukwest";
    /** Uses the {@link RegionalAuthority} for the Azure 'francecentral' region. */
    RegionalAuthority["FranceCentral"] = "francecentral";
    /** Uses the {@link RegionalAuthority} for the Azure 'francesouth' region. */
    RegionalAuthority["FranceSouth"] = "francesouth";
    /** Uses the {@link RegionalAuthority} for the Azure 'switzerlandnorth' region. */
    RegionalAuthority["SwitzerlandNorth"] = "switzerlandnorth";
    /** Uses the {@link RegionalAuthority} for the Azure 'switzerlandwest' region. */
    RegionalAuthority["SwitzerlandWest"] = "switzerlandwest";
    /** Uses the {@link RegionalAuthority} for the Azure 'germanynorth' region. */
    RegionalAuthority["GermanyNorth"] = "germanynorth";
    /** Uses the {@link RegionalAuthority} for the Azure 'germanywestcentral' region. */
    RegionalAuthority["GermanyWestCentral"] = "germanywestcentral";
    /** Uses the {@link RegionalAuthority} for the Azure 'norwaywest' region. */
    RegionalAuthority["NorwayWest"] = "norwaywest";
    /** Uses the {@link RegionalAuthority} for the Azure 'norwayeast' region. */
    RegionalAuthority["NorwayEast"] = "norwayeast";
    /** Uses the {@link RegionalAuthority} for the Azure 'eastasia' region. */
    RegionalAuthority["AsiaEast"] = "eastasia";
    /** Uses the {@link RegionalAuthority} for the Azure 'southeastasia' region. */
    RegionalAuthority["AsiaSouthEast"] = "southeastasia";
    /** Uses the {@link RegionalAuthority} for the Azure 'japaneast' region. */
    RegionalAuthority["JapanEast"] = "japaneast";
    /** Uses the {@link RegionalAuthority} for the Azure 'japanwest' region. */
    RegionalAuthority["JapanWest"] = "japanwest";
    /** Uses the {@link RegionalAuthority} for the Azure 'australiaeast' region. */
    RegionalAuthority["AustraliaEast"] = "australiaeast";
    /** Uses the {@link RegionalAuthority} for the Azure 'australiasoutheast' region. */
    RegionalAuthority["AustraliaSouthEast"] = "australiasoutheast";
    /** Uses the {@link RegionalAuthority} for the Azure 'australiacentral' region. */
    RegionalAuthority["AustraliaCentral"] = "australiacentral";
    /** Uses the {@link RegionalAuthority} for the Azure 'australiacentral2' region. */
    RegionalAuthority["AustraliaCentral2"] = "australiacentral2";
    /** Uses the {@link RegionalAuthority} for the Azure 'centralindia' region. */
    RegionalAuthority["IndiaCentral"] = "centralindia";
    /** Uses the {@link RegionalAuthority} for the Azure 'southindia' region. */
    RegionalAuthority["IndiaSouth"] = "southindia";
    /** Uses the {@link RegionalAuthority} for the Azure 'westindia' region. */
    RegionalAuthority["IndiaWest"] = "westindia";
    /** Uses the {@link RegionalAuthority} for the Azure 'koreasouth' region. */
    RegionalAuthority["KoreaSouth"] = "koreasouth";
    /** Uses the {@link RegionalAuthority} for the Azure 'koreacentral' region. */
    RegionalAuthority["KoreaCentral"] = "koreacentral";
    /** Uses the {@link RegionalAuthority} for the Azure 'uaecentral' region. */
    RegionalAuthority["UAECentral"] = "uaecentral";
    /** Uses the {@link RegionalAuthority} for the Azure 'uaenorth' region. */
    RegionalAuthority["UAENorth"] = "uaenorth";
    /** Uses the {@link RegionalAuthority} for the Azure 'southafricanorth' region. */
    RegionalAuthority["SouthAfricaNorth"] = "southafricanorth";
    /** Uses the {@link RegionalAuthority} for the Azure 'southafricawest' region. */
    RegionalAuthority["SouthAfricaWest"] = "southafricawest";
    /** Uses the {@link RegionalAuthority} for the Azure 'chinanorth' region. */
    RegionalAuthority["ChinaNorth"] = "chinanorth";
    /** Uses the {@link RegionalAuthority} for the Azure 'chinaeast' region. */
    RegionalAuthority["ChinaEast"] = "chinaeast";
    /** Uses the {@link RegionalAuthority} for the Azure 'chinanorth2' region. */
    RegionalAuthority["ChinaNorth2"] = "chinanorth2";
    /** Uses the {@link RegionalAuthority} for the Azure 'chinaeast2' region. */
    RegionalAuthority["ChinaEast2"] = "chinaeast2";
    /** Uses the {@link RegionalAuthority} for the Azure 'germanycentral' region. */
    RegionalAuthority["GermanyCentral"] = "germanycentral";
    /** Uses the {@link RegionalAuthority} for the Azure 'germanynortheast' region. */
    RegionalAuthority["GermanyNorthEast"] = "germanynortheast";
    /** Uses the {@link RegionalAuthority} for the Azure 'usgovvirginia' region. */
    RegionalAuthority["GovernmentUSVirginia"] = "usgovvirginia";
    /** Uses the {@link RegionalAuthority} for the Azure 'usgoviowa' region. */
    RegionalAuthority["GovernmentUSIowa"] = "usgoviowa";
    /** Uses the {@link RegionalAuthority} for the Azure 'usgovarizona' region. */
    RegionalAuthority["GovernmentUSArizona"] = "usgovarizona";
    /** Uses the {@link RegionalAuthority} for the Azure 'usgovtexas' region. */
    RegionalAuthority["GovernmentUSTexas"] = "usgovtexas";
    /** Uses the {@link RegionalAuthority} for the Azure 'usdodeast' region. */
    RegionalAuthority["GovernmentUSDodEast"] = "usdodeast";
    /** Uses the {@link RegionalAuthority} for the Azure 'usdodcentral' region. */
    RegionalAuthority["GovernmentUSDodCentral"] = "usdodcentral";
})(RegionalAuthority || (RegionalAuthority = {}));

// Copyright (c) Microsoft Corporation.
/**
 * The current persistence provider, undefined by default.
 * @internal
 */
let persistenceProvider = undefined;
/**
 * An object that allows setting the persistence provider.
 * @internal
 */
const msalNodeFlowCacheControl = {
    setPersistence(pluginProvider) {
        persistenceProvider = pluginProvider;
    },
};
/**
 * MSAL partial base client for Node.js.
 *
 * It completes the input configuration with some default values.
 * It also provides with utility protected methods that can be used from any of the clients,
 * which includes handlers for successful responses and errors.
 *
 * @internal
 */
class MsalNode extends MsalBaseUtilities {
    constructor(options) {
        var _a, _b, _c;
        super(options);
        this.requiresConfidential = false;
        this.msalConfig = this.defaultNodeMsalConfig(options);
        this.tenantId = resolveTenantId(options.logger, options.tenantId, options.clientId);
        this.clientId = this.msalConfig.auth.clientId;
        if (options === null || options === void 0 ? void 0 : options.getAssertion) {
            this.getAssertion = options.getAssertion;
        }
        // If persistence has been configured
        if (persistenceProvider !== undefined && ((_a = options.tokenCachePersistenceOptions) === null || _a === void 0 ? void 0 : _a.enabled)) {
            this.createCachePlugin = () => persistenceProvider(options.tokenCachePersistenceOptions);
        }
        else if ((_b = options.tokenCachePersistenceOptions) === null || _b === void 0 ? void 0 : _b.enabled) {
            throw new Error([
                "Persistent token caching was requested, but no persistence provider was configured.",
                "You must install the identity-cache-persistence plugin package (`npm install --save @azure/identity-cache-persistence`)",
                "and enable it by importing `useIdentityPlugin` from `@azure/identity` and calling",
                "`useIdentityPlugin(cachePersistencePlugin)` before using `tokenCachePersistenceOptions`.",
            ].join(" "));
        }
        this.azureRegion = (_c = options.regionalAuthority) !== null && _c !== void 0 ? _c : process.env.AZURE_REGIONAL_AUTHORITY_NAME;
        if (this.azureRegion === RegionalAuthority.AutoDiscoverRegion) {
            this.azureRegion = "AUTO_DISCOVER";
        }
    }
    /**
     * Generates a MSAL configuration that generally works for Node.js
     */
    defaultNodeMsalConfig(options) {
        const clientId = options.clientId || DeveloperSignOnClientId;
        const tenantId = resolveTenantId(options.logger, options.tenantId, options.clientId);
        this.authorityHost = options.authorityHost || process.env.AZURE_AUTHORITY_HOST;
        const authority = getAuthority(tenantId, this.authorityHost);
        this.identityClient = new IdentityClient(Object.assign(Object.assign({}, options.tokenCredentialOptions), { authorityHost: authority, loggingOptions: options.loggingOptions }));
        let clientCapabilities = ["cp1"];
        if (process.env.AZURE_IDENTITY_DISABLE_CP1) {
            clientCapabilities = [];
        }
        return {
            auth: {
                clientId,
                authority,
                knownAuthorities: getKnownAuthorities(tenantId, authority),
                clientCapabilities,
            },
            // Cache is defined in this.prepare();
            system: {
                networkClient: this.identityClient,
                loggerOptions: {
                    loggerCallback: defaultLoggerCallback(options.logger),
                },
            },
        };
    }
    /**
     * Prepares the MSAL applications.
     */
    async init(options) {
        if (options === null || options === void 0 ? void 0 : options.abortSignal) {
            options.abortSignal.addEventListener("abort", () => {
                // This will abort any pending request in the IdentityClient,
                // based on the received or generated correlationId
                this.identityClient.abortRequests(options.correlationId);
            });
        }
        if (this.publicApp || this.confidentialApp) {
            return;
        }
        if (this.createCachePlugin !== undefined) {
            this.msalConfig.cache = {
                cachePlugin: await this.createCachePlugin(),
            };
        }
        this.publicApp = new msalNode__namespace.PublicClientApplication(this.msalConfig);
        if (this.getAssertion) {
            this.msalConfig.auth.clientAssertion = await this.getAssertion();
        }
        // The confidential client requires either a secret, assertion or certificate.
        if (this.msalConfig.auth.clientSecret ||
            this.msalConfig.auth.clientAssertion ||
            this.msalConfig.auth.clientCertificate) {
            this.confidentialApp = new msalNode__namespace.ConfidentialClientApplication(this.msalConfig);
        }
        else {
            if (this.requiresConfidential) {
                throw new Error("Unable to generate the MSAL confidential client. Missing either the client's secret, certificate or assertion.");
            }
        }
    }
    /**
     * Allows the cancellation of a MSAL request.
     */
    withCancellation(promise, abortSignal, onCancel) {
        return new Promise((resolve, reject) => {
            promise
                .then((msalToken) => {
                return resolve(msalToken);
            })
                .catch(reject);
            if (abortSignal) {
                abortSignal.addEventListener("abort", () => {
                    onCancel === null || onCancel === void 0 ? void 0 : onCancel();
                });
            }
        });
    }
    /**
     * Returns the existing account, attempts to load the account from MSAL.
     */
    async getActiveAccount() {
        var _a, _b, _c;
        if (this.account) {
            return this.account;
        }
        const cache = (_b = (_a = this.confidentialApp) === null || _a === void 0 ? void 0 : _a.getTokenCache()) !== null && _b !== void 0 ? _b : (_c = this.publicApp) === null || _c === void 0 ? void 0 : _c.getTokenCache();
        const accountsByTenant = await (cache === null || cache === void 0 ? void 0 : cache.getAllAccounts());
        if (!accountsByTenant) {
            return;
        }
        if (accountsByTenant.length === 1) {
            this.account = msalToPublic(this.clientId, accountsByTenant[0]);
        }
        else {
            this.logger
                .info(`More than one account was found authenticated for this Client ID and Tenant ID.
However, no "authenticationRecord" has been provided for this credential,
therefore we're unable to pick between these accounts.
A new login attempt will be requested, to ensure the correct account is picked.
To work with multiple accounts for the same Client ID and Tenant ID, please provide an "authenticationRecord" when initializing a credential to prevent this from happening.`);
            return;
        }
        return this.account;
    }
    /**
     * Attempts to retrieve a token from cache.
     */
    async getTokenSilent(scopes, options) {
        var _a, _b;
        await this.getActiveAccount();
        if (!this.account) {
            throw new AuthenticationRequiredError({
                scopes,
                getTokenOptions: options,
                message: "Silent authentication failed. We couldn't retrieve an active account from the cache.",
            });
        }
        const silentRequest = {
            // To be able to re-use the account, the Token Cache must also have been provided.
            account: publicToMsal(this.account),
            correlationId: options === null || options === void 0 ? void 0 : options.correlationId,
            scopes,
            authority: options === null || options === void 0 ? void 0 : options.authority,
            claims: options === null || options === void 0 ? void 0 : options.claims,
        };
        try {
            this.logger.info("Attempting to acquire token silently");
            const response = (_b = (await ((_a = this.confidentialApp) === null || _a === void 0 ? void 0 : _a.acquireTokenSilent(silentRequest)))) !== null && _b !== void 0 ? _b : (await this.publicApp.acquireTokenSilent(silentRequest));
            return this.handleResult(scopes, this.clientId, response || undefined);
        }
        catch (err) {
            throw this.handleError(scopes, err, options);
        }
    }
    /**
     * Wrapper around each MSAL flow get token operation: doGetToken.
     * If disableAutomaticAuthentication is sent through the constructor, it will prevent MSAL from requesting the user input.
     */
    async getToken(scopes, options = {}) {
        const tenantId = processMultiTenantRequest(this.tenantId, options) || this.tenantId;
        options.authority = getAuthority(tenantId, this.authorityHost);
        options.correlationId = (options === null || options === void 0 ? void 0 : options.correlationId) || this.generateUuid();
        await this.init(options);
        try {
            // MSAL now caches tokens based on their claims,
            // so now one has to keep track fo claims in order to retrieve the newer tokens from acquireTokenSilent
            // This update happened on PR: https://github.com/AzureAD/microsoft-authentication-library-for-js/pull/4533
            const optionsClaims = options.claims;
            if (optionsClaims) {
                this.cachedClaims = optionsClaims;
            }
            if (this.cachedClaims && !optionsClaims) {
                options.claims = this.cachedClaims;
            }
            // We don't return the promise since we want to catch errors right here.
            return await this.getTokenSilent(scopes, options);
        }
        catch (err) {
            if (err.name !== "AuthenticationRequiredError") {
                throw err;
            }
            if (options === null || options === void 0 ? void 0 : options.disableAutomaticAuthentication) {
                throw new AuthenticationRequiredError({
                    scopes,
                    getTokenOptions: options,
                    message: "Automatic authentication has been disabled. You may call the authentication() method.",
                });
            }
            this.logger.info(`Silent authentication failed, falling back to interactive method.`);
            return this.doGetToken(scopes, options);
        }
    }
}

// Copyright (c) Microsoft Corporation.
const CommonTenantId = "common";
const AzureAccountClientId = "aebc6443-996d-45c2-90f0-388ff96faa56"; // VSC: 'aebc6443-996d-45c2-90f0-388ff96faa56'
const logger$k = credentialLogger("VisualStudioCodeCredential");
let findCredentials = undefined;
const vsCodeCredentialControl = {
    setVsCodeCredentialFinder(finder) {
        findCredentials = finder;
    },
};
// Map of unsupported Tenant IDs and the errors we will be throwing.
const unsupportedTenantIds = {
    adfs: "The VisualStudioCodeCredential does not support authentication with ADFS tenants.",
};
function checkUnsupportedTenant(tenantId) {
    // If the Tenant ID isn't supported, we throw.
    const unsupportedTenantError = unsupportedTenantIds[tenantId];
    if (unsupportedTenantError) {
        throw new CredentialUnavailableError(unsupportedTenantError);
    }
}
const mapVSCodeAuthorityHosts = {
    AzureCloud: exports.AzureAuthorityHosts.AzurePublicCloud,
    AzureChina: exports.AzureAuthorityHosts.AzureChina,
    AzureGermanCloud: exports.AzureAuthorityHosts.AzureGermany,
    AzureUSGovernment: exports.AzureAuthorityHosts.AzureGovernment,
};
/**
 * Attempts to load a specific property from the VSCode configurations of the current OS.
 * If it fails at any point, returns undefined.
 */
function getPropertyFromVSCode(property) {
    const settingsPath = ["User", "settings.json"];
    // Eventually we can add more folders for more versions of VSCode.
    const vsCodeFolder = "Code";
    const homedir = os__default["default"].homedir();
    function loadProperty(...pathSegments) {
        const fullPath = path__default["default"].join(...pathSegments, vsCodeFolder, ...settingsPath);
        const settings = JSON.parse(fs__default["default"].readFileSync(fullPath, { encoding: "utf8" }));
        return settings[property];
    }
    try {
        let appData;
        switch (process.platform) {
            case "win32":
                appData = process.env.APPDATA;
                return appData ? loadProperty(appData) : undefined;
            case "darwin":
                return loadProperty(homedir, "Library", "Application Support");
            case "linux":
                return loadProperty(homedir, ".config");
            default:
                return;
        }
    }
    catch (e) {
        logger$k.info(`Failed to load the Visual Studio Code configuration file. Error: ${e.message}`);
        return;
    }
}
/**
 * Connects to Azure using the credential provided by the VSCode extension 'Azure Account'.
 * Once the user has logged in via the extension, this credential can share the same refresh token
 * that is cached by the extension.
 */
class VisualStudioCodeCredential {
    /**
     * Creates an instance of VisualStudioCodeCredential to use for automatically authenticating via VSCode.
     *
     * **Note**: `VisualStudioCodeCredential` is provided by a plugin package:
     * `@azure/identity-vscode`. If this package is not installed and registered
     * using the plugin API (`useIdentityPlugin`), then authentication using
     * `VisualStudioCodeCredential` will not be available.
     *
     * @param options - Options for configuring the client which makes the authentication request.
     */
    constructor(options) {
        // We want to make sure we use the one assigned by the user on the VSCode settings.
        // Or just `AzureCloud` by default.
        this.cloudName = (getPropertyFromVSCode("azure.cloud") || "AzureCloud");
        // Picking an authority host based on the cloud name.
        const authorityHost = mapVSCodeAuthorityHosts[this.cloudName];
        this.identityClient = new IdentityClient(Object.assign({ authorityHost }, options));
        if (options && options.tenantId) {
            checkTenantId(logger$k, options.tenantId);
            this.tenantId = options.tenantId;
        }
        else {
            this.tenantId = CommonTenantId;
        }
        checkUnsupportedTenant(this.tenantId);
    }
    /**
     * Runs preparations for any further getToken request.
     */
    async prepare() {
        // Attempts to load the tenant from the VSCode configuration file.
        const settingsTenant = getPropertyFromVSCode("azure.tenant");
        if (settingsTenant) {
            this.tenantId = settingsTenant;
        }
        checkUnsupportedTenant(this.tenantId);
    }
    /**
     * Runs preparations for any further getToken, but only once.
     */
    prepareOnce() {
        if (!this.preparePromise) {
            this.preparePromise = this.prepare();
        }
        return this.preparePromise;
    }
    /**
     * Returns the token found by searching VSCode's authentication cache or
     * returns null if no token could be found.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                `TokenCredential` implementation might make.
     */
    async getToken(scopes, options) {
        var _a, _b;
        await this.prepareOnce();
        const tenantId = processMultiTenantRequest(this.tenantId, options) || this.tenantId;
        if (findCredentials === undefined) {
            throw new CredentialUnavailableError([
                "No implementation of `VisualStudioCodeCredential` is available.",
                "You must install the identity-vscode plugin package (`npm install --save-dev @azure/identity-vscode`)",
                "and enable it by importing `useIdentityPlugin` from `@azure/identity` and calling",
                "`useIdentityPlugin(vsCodePlugin)` before creating a `VisualStudioCodeCredential`.",
            ].join(" "));
        }
        let scopeString = typeof scopes === "string" ? scopes : scopes.join(" ");
        // Check to make sure the scope we get back is a valid scope
        if (!scopeString.match(/^[0-9a-zA-Z-.:/]+$/)) {
            const error = new Error("Invalid scope was specified by the user or calling client");
            logger$k.getToken.info(formatError(scopes, error));
            throw error;
        }
        if (scopeString.indexOf("offline_access") < 0) {
            scopeString += " offline_access";
        }
        // findCredentials returns an array similar to:
        // [
        //   {
        //     account: "",
        //     password: "",
        //   },
        //   /* ... */
        // ]
        const credentials = await findCredentials();
        // If we can't find the credential based on the name, we'll pick the first one available.
        const { password: refreshToken } = (_b = (_a = credentials.find(({ account }) => account === this.cloudName)) !== null && _a !== void 0 ? _a : credentials[0]) !== null && _b !== void 0 ? _b : {};
        if (refreshToken) {
            const tokenResponse = await this.identityClient.refreshAccessToken(tenantId, AzureAccountClientId, scopeString, refreshToken, undefined);
            if (tokenResponse) {
                logger$k.getToken.info(formatSuccess(scopes));
                return tokenResponse.accessToken;
            }
            else {
                const error = new CredentialUnavailableError("Could not retrieve the token associated with Visual Studio Code. Have you connected using the 'Azure Account' extension recently? To troubleshoot, visit https://aka.ms/azsdk/js/identity/vscodecredential/troubleshoot.");
                logger$k.getToken.info(formatError(scopes, error));
                throw error;
            }
        }
        else {
            const error = new CredentialUnavailableError("Could not retrieve the token associated with Visual Studio Code. Did you connect using the 'Azure Account' extension? To troubleshoot, visit https://aka.ms/azsdk/js/identity/vscodecredential/troubleshoot.");
            logger$k.getToken.info(formatError(scopes, error));
            throw error;
        }
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * The context passed to an Identity plugin. This contains objects that
 * plugins can use to set backend implementations.
 * @internal
 */
const pluginContext = {
    cachePluginControl: msalNodeFlowCacheControl,
    vsCodeCredentialControl: vsCodeCredentialControl,
};
/**
 * Extend Azure Identity with additional functionality. Pass a plugin from
 * a plugin package, such as:
 *
 * - `@azure/identity-cache-persistence`: provides persistent token caching
 * - `@azure/identity-vscode`: provides the dependencies of
 *   `VisualStudioCodeCredential` and enables it
 *
 * Example:
 *
 * ```javascript
 * import { cachePersistencePlugin } from "@azure/identity-cache-persistence";
 *
 * import { useIdentityPlugin, DefaultAzureCredential } from "@azure/identity";
 * useIdentityPlugin(cachePersistencePlugin);
 *
 * // The plugin has the capability to extend `DefaultAzureCredential` and to
 * // add middleware to the underlying credentials, such as persistence.
 * const credential = new DefaultAzureCredential({
 *   tokenCachePersistenceOptions: {
 *     enabled: true
 *   }
 * });
 * ```
 *
 * @param plugin - the plugin to register
 */
function useIdentityPlugin(plugin) {
    plugin(pluginContext);
}

// Copyright (c) Microsoft Corporation.
/**
 * @internal
 */
const logger$j = credentialLogger("ChainedTokenCredential");
/**
 * Enables multiple `TokenCredential` implementations to be tried in order
 * until one of the getToken methods returns an access token.
 */
class ChainedTokenCredential {
    /**
     * Creates an instance of ChainedTokenCredential using the given credentials.
     *
     * @param sources - `TokenCredential` implementations to be tried in order.
     *
     * Example usage:
     * ```javascript
     * const firstCredential = new ClientSecretCredential(tenantId, clientId, clientSecret);
     * const secondCredential = new ClientSecretCredential(tenantId, anotherClientId, anotherSecret);
     * const credentialChain = new ChainedTokenCredential(firstCredential, secondCredential);
     * ```
     */
    constructor(...sources) {
        /**
         * The message to use when the chained token fails to get a token
         */
        this.UnavailableMessage = "ChainedTokenCredential => failed to retrieve a token from the included credentials";
        this._sources = [];
        this._sources = sources;
    }
    /**
     * Returns the first access token returned by one of the chained
     * `TokenCredential` implementations.  Throws an {@link AggregateAuthenticationError}
     * when one or more credentials throws an {@link AuthenticationError} and
     * no credentials have returned an access token.
     *
     * This method is called automatically by Azure SDK client libraries. You may call this method
     * directly, but you must also handle token caching and token refreshing.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                `TokenCredential` implementation might make.
     */
    async getToken(scopes, options = {}) {
        let token = null;
        let successfulCredentialName = "";
        const errors = [];
        return tracingClient.withSpan("ChainedTokenCredential.getToken", options, async (updatedOptions) => {
            for (let i = 0; i < this._sources.length && token === null; i++) {
                try {
                    token = await this._sources[i].getToken(scopes, updatedOptions);
                    successfulCredentialName = this._sources[i].constructor.name;
                }
                catch (err) {
                    if (err.name === "CredentialUnavailableError" ||
                        err.name === "AuthenticationRequiredError") {
                        errors.push(err);
                    }
                    else {
                        logger$j.getToken.info(formatError(scopes, err));
                        throw err;
                    }
                }
            }
            if (!token && errors.length > 0) {
                const err = new AggregateAuthenticationError(errors, "ChainedTokenCredential authentication failed.");
                logger$j.getToken.info(formatError(scopes, err));
                throw err;
            }
            logger$j.getToken.info(`Result for ${successfulCredentialName}: ${formatSuccess(scopes)}`);
            if (token === null) {
                throw new CredentialUnavailableError("Failed to retrieve a valid token");
            }
            return token;
        });
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * Throws if the received scope is not valid.
 * @internal
 */
function ensureValidScope(scope, logger) {
    if (!scope.match(/^[0-9a-zA-Z-.:/]+$/)) {
        const error = new Error("Invalid scope was specified by the user or calling client");
        logger.getToken.info(formatError(scope, error));
        throw error;
    }
}
/**
 * Returns the resource out of a scope.
 * @internal
 */
function getScopeResource(scope) {
    return scope.replace(/\/.default$/, "");
}

// Copyright (c) Microsoft Corporation.
/**
 * Mockable reference to the CLI credential cliCredentialFunctions
 * @internal
 */
const cliCredentialInternals = {
    /**
     * @internal
     */
    getSafeWorkingDir() {
        if (process.platform === "win32") {
            if (!process.env.SystemRoot) {
                throw new Error("Azure CLI credential expects a 'SystemRoot' environment variable");
            }
            return process.env.SystemRoot;
        }
        else {
            return "/bin";
        }
    },
    /**
     * Gets the access token from Azure CLI
     * @param resource - The resource to use when getting the token
     * @internal
     */
    async getAzureCliAccessToken(resource, tenantId) {
        let tenantSection = [];
        if (tenantId) {
            tenantSection = ["--tenant", tenantId];
        }
        return new Promise((resolve, reject) => {
            try {
                child_process__default["default"].execFile("az", [
                    "account",
                    "get-access-token",
                    "--output",
                    "json",
                    "--resource",
                    resource,
                    ...tenantSection,
                ], { cwd: cliCredentialInternals.getSafeWorkingDir(), shell: true }, (error, stdout, stderr) => {
                    resolve({ stdout: stdout, stderr: stderr, error });
                });
            }
            catch (err) {
                reject(err);
            }
        });
    },
};
const logger$i = credentialLogger("AzureCliCredential");
/**
 * This credential will use the currently logged-in user login information
 * via the Azure CLI ('az') commandline tool.
 * To do so, it will read the user access token and expire time
 * with Azure CLI command "az account get-access-token".
 */
class AzureCliCredential {
    /**
     * Creates an instance of the {@link AzureCliCredential}.
     *
     * To use this credential, ensure that you have already logged
     * in via the 'az' tool using the command "az login" from the commandline.
     *
     * @param options - Options, to optionally allow multi-tenant requests.
     */
    constructor(options) {
        this.tenantId = options === null || options === void 0 ? void 0 : options.tenantId;
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If authentication fails, a {@link CredentialUnavailableError} will be thrown with the details of the failure.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                TokenCredential implementation might make.
     */
    async getToken(scopes, options = {}) {
        const tenantId = processMultiTenantRequest(this.tenantId, options);
        if (tenantId) {
            checkTenantId(logger$i, tenantId);
        }
        const scope = typeof scopes === "string" ? scopes : scopes[0];
        logger$i.getToken.info(`Using the scope ${scope}`);
        ensureValidScope(scope, logger$i);
        const resource = getScopeResource(scope);
        return tracingClient.withSpan(`${this.constructor.name}.getToken`, options, async () => {
            var _a, _b, _c, _d;
            try {
                const obj = await cliCredentialInternals.getAzureCliAccessToken(resource, tenantId);
                const specificScope = (_a = obj.stderr) === null || _a === void 0 ? void 0 : _a.match("(.*)az login --scope(.*)");
                const isLoginError = ((_b = obj.stderr) === null || _b === void 0 ? void 0 : _b.match("(.*)az login(.*)")) && !specificScope;
                const isNotInstallError = ((_c = obj.stderr) === null || _c === void 0 ? void 0 : _c.match("az:(.*)not found")) || ((_d = obj.stderr) === null || _d === void 0 ? void 0 : _d.startsWith("'az' is not recognized"));
                if (isNotInstallError) {
                    const error = new CredentialUnavailableError("Azure CLI could not be found. Please visit https://aka.ms/azure-cli for installation instructions and then, once installed, authenticate to your Azure account using 'az login'.");
                    logger$i.getToken.info(formatError(scopes, error));
                    throw error;
                }
                if (isLoginError) {
                    const error = new CredentialUnavailableError("Please run 'az login' from a command prompt to authenticate before using this credential.");
                    logger$i.getToken.info(formatError(scopes, error));
                    throw error;
                }
                try {
                    const responseData = obj.stdout;
                    const response = JSON.parse(responseData);
                    logger$i.getToken.info(formatSuccess(scopes));
                    const returnValue = {
                        token: response.accessToken,
                        expiresOnTimestamp: new Date(response.expiresOn).getTime(),
                    };
                    return returnValue;
                }
                catch (e) {
                    if (obj.stderr) {
                        throw new CredentialUnavailableError(obj.stderr);
                    }
                    throw e;
                }
            }
            catch (err) {
                const error = err.name === "CredentialUnavailableError"
                    ? err
                    : new CredentialUnavailableError(err.message || "Unknown error while trying to retrieve the access token");
                logger$i.getToken.info(formatError(scopes, error));
                throw error;
            }
        });
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * Easy to mock childProcess utils.
 * @internal
 */
const processUtils = {
    /**
     * Promisifying childProcess.execFile
     * @internal
     */
    execFile(file, params, options) {
        return new Promise((resolve, reject) => {
            child_process__namespace.execFile(file, params, options, (error, stdout, stderr) => {
                if (Buffer.isBuffer(stdout)) {
                    stdout = stdout.toString("utf8");
                }
                if (Buffer.isBuffer(stderr)) {
                    stderr = stderr.toString("utf8");
                }
                if (stderr || error) {
                    reject(stderr ? new Error(stderr) : error);
                }
                else {
                    resolve(stdout);
                }
            });
        });
    },
};

// Copyright (c) Microsoft Corporation.
const logger$h = credentialLogger("AzurePowerShellCredential");
const isWindows = process.platform === "win32";
/**
 * Returns a platform-appropriate command name by appending ".exe" on Windows.
 *
 * @internal
 */
function formatCommand(commandName) {
    if (isWindows) {
        return `${commandName}.exe`;
    }
    else {
        return commandName;
    }
}
/**
 * Receives a list of commands to run, executes them, then returns the outputs.
 * If anything fails, an error is thrown.
 * @internal
 */
async function runCommands(commands) {
    const results = [];
    for (const command of commands) {
        const [file, ...parameters] = command;
        const result = (await processUtils.execFile(file, parameters, { encoding: "utf8" }));
        results.push(result);
    }
    return results;
}
/**
 * Known PowerShell errors
 * @internal
 */
const powerShellErrors = {
    login: "Run Connect-AzAccount to login",
    installed: "The specified module 'Az.Accounts' with version '2.2.0' was not loaded because no valid module file was found in any module directory",
};
/**
 * Messages to use when throwing in this credential.
 * @internal
 */
const powerShellPublicErrorMessages = {
    login: "Please run 'Connect-AzAccount' from PowerShell to authenticate before using this credential.",
    installed: `The 'Az.Account' module >= 2.2.0 is not installed. Install the Azure Az PowerShell module with: "Install-Module -Name Az -Scope CurrentUser -Repository PSGallery -Force".`,
    troubleshoot: `To troubleshoot, visit https://aka.ms/azsdk/js/identity/powershellcredential/troubleshoot.`,
};
// PowerShell Azure User not logged in error check.
const isLoginError = (err) => err.message.match(`(.*)${powerShellErrors.login}(.*)`);
// Az Module not Installed in Azure PowerShell check.
const isNotInstalledError = (err) => err.message.match(powerShellErrors.installed);
/**
 * The PowerShell commands to be tried, in order.
 *
 * @internal
 */
const commandStack = [formatCommand("pwsh")];
if (isWindows) {
    commandStack.push(formatCommand("powershell"));
}
/**
 * This credential will use the currently logged-in user information from the
 * Azure PowerShell module. To do so, it will read the user access token and
 * expire time with Azure PowerShell command `Get-AzAccessToken -ResourceUrl {ResourceScope}`
 */
class AzurePowerShellCredential {
    /**
     * Creates an instance of the {@link AzurePowerShellCredential}.
     *
     * To use this credential:
     * - Install the Azure Az PowerShell module with:
     *   `Install-Module -Name Az -Scope CurrentUser -Repository PSGallery -Force`.
     * - You have already logged in to Azure PowerShell using the command
     * `Connect-AzAccount` from the command line.
     *
     * @param options - Options, to optionally allow multi-tenant requests.
     */
    constructor(options) {
        this.tenantId = options === null || options === void 0 ? void 0 : options.tenantId;
    }
    /**
     * Gets the access token from Azure PowerShell
     * @param resource - The resource to use when getting the token
     */
    async getAzurePowerShellAccessToken(resource, tenantId) {
        // Clone the stack to avoid mutating it while iterating
        for (const powerShellCommand of [...commandStack]) {
            try {
                await runCommands([[powerShellCommand, "/?"]]);
            }
            catch (e) {
                // Remove this credential from the original stack so that we don't try it again.
                commandStack.shift();
                continue;
            }
            let tenantSection = "";
            if (tenantId) {
                tenantSection = `-TenantId "${tenantId}"`;
            }
            const results = await runCommands([
                [
                    powerShellCommand,
                    "-Command",
                    "Import-Module Az.Accounts -MinimumVersion 2.2.0 -PassThru",
                ],
                [
                    powerShellCommand,
                    "-Command",
                    `Get-AzAccessToken ${tenantSection} -ResourceUrl "${resource}" | ConvertTo-Json`,
                ],
            ]);
            const result = results[1];
            try {
                return JSON.parse(result);
            }
            catch (e) {
                throw new Error(`Unable to parse the output of PowerShell. Received output: ${result}`);
            }
        }
        throw new Error(`Unable to execute PowerShell. Ensure that it is installed in your system`);
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If the authentication cannot be performed through PowerShell, a {@link CredentialUnavailableError} will be thrown.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this TokenCredential implementation might make.
     */
    async getToken(scopes, options = {}) {
        return tracingClient.withSpan(`${this.constructor.name}.getToken`, options, async () => {
            const tenantId = processMultiTenantRequest(this.tenantId, options);
            if (tenantId) {
                checkTenantId(logger$h, tenantId);
            }
            const scope = typeof scopes === "string" ? scopes : scopes[0];
            ensureValidScope(scope, logger$h);
            logger$h.getToken.info(`Using the scope ${scope}`);
            const resource = getScopeResource(scope);
            try {
                const response = await this.getAzurePowerShellAccessToken(resource, tenantId);
                logger$h.getToken.info(formatSuccess(scopes));
                return {
                    token: response.Token,
                    expiresOnTimestamp: new Date(response.ExpiresOn).getTime(),
                };
            }
            catch (err) {
                if (isNotInstalledError(err)) {
                    const error = new CredentialUnavailableError(powerShellPublicErrorMessages.installed);
                    logger$h.getToken.info(formatError(scope, error));
                    throw error;
                }
                else if (isLoginError(err)) {
                    const error = new CredentialUnavailableError(powerShellPublicErrorMessages.login);
                    logger$h.getToken.info(formatError(scope, error));
                    throw error;
                }
                const error = new CredentialUnavailableError(`${err}. ${powerShellPublicErrorMessages.troubleshoot}`);
                logger$h.getToken.info(formatError(scope, error));
                throw error;
            }
        });
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * MSAL client secret client. Calls to MSAL's confidential application's `acquireTokenByClientCredential` during `doGetToken`.
 * @internal
 */
class MsalClientSecret extends MsalNode {
    constructor(options) {
        super(options);
        this.requiresConfidential = true;
        this.msalConfig.auth.clientSecret = options.clientSecret;
    }
    async doGetToken(scopes, options = {}) {
        try {
            const result = await this.confidentialApp.acquireTokenByClientCredential({
                scopes,
                correlationId: options.correlationId,
                azureRegion: this.azureRegion,
                authority: options.authority,
                claims: options.claims,
            });
            // The Client Credential flow does not return an account,
            // so each time getToken gets called, we will have to acquire a new token through the service.
            return this.handleResult(scopes, this.clientId, result || undefined);
        }
        catch (err) {
            throw this.handleError(scopes, err, options);
        }
    }
}

// Copyright (c) Microsoft Corporation.
const logger$g = credentialLogger("ClientSecretCredential");
/**
 * Enables authentication to Azure Active Directory using a client secret
 * that was generated for an App Registration. More information on how
 * to configure a client secret can be found here:
 *
 * https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-configure-app-access-web-apis#add-credentials-to-your-web-application
 *
 */
class ClientSecretCredential {
    /**
     * Creates an instance of the ClientSecretCredential with the details
     * needed to authenticate against Azure Active Directory with a client
     * secret.
     *
     * @param tenantId - The Azure Active Directory tenant (directory) ID.
     * @param clientId - The client (application) ID of an App Registration in the tenant.
     * @param clientSecret - A client secret that was generated for the App Registration.
     * @param options - Options for configuring the client which makes the authentication request.
     */
    constructor(tenantId, clientId, clientSecret, options = {}) {
        if (!tenantId || !clientId || !clientSecret) {
            throw new Error("ClientSecretCredential: tenantId, clientId, and clientSecret are required parameters. To troubleshoot, visit https://aka.ms/azsdk/js/identity/serviceprincipalauthentication/troubleshoot.");
        }
        this.msalFlow = new MsalClientSecret(Object.assign(Object.assign({}, options), { logger: logger$g,
            clientId,
            tenantId,
            clientSecret, tokenCredentialOptions: options }));
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If authentication fails, a {@link CredentialUnavailableError} will be thrown with the details of the failure.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                TokenCredential implementation might make.
     */
    async getToken(scopes, options = {}) {
        return tracingClient.withSpan(`${this.constructor.name}.getToken`, options, async (newOptions) => {
            const arrayScopes = Array.isArray(scopes) ? scopes : [scopes];
            return this.msalFlow.getToken(arrayScopes, newOptions);
        });
    }
}

// Copyright (c) Microsoft Corporation.
const readFileAsync$2 = util.promisify(fs.readFile);
/**
 * Tries to asynchronously load a certificate from the given path.
 *
 * @param configuration - Either the PEM value or the path to the certificate.
 * @param sendCertificateChain - Option to include x5c header for SubjectName and Issuer name authorization.
 * @returns - The certificate parts, or `undefined` if the certificate could not be loaded.
 * @internal
 */
async function parseCertificate(configuration, sendCertificateChain) {
    const certificateParts = {};
    const certificate = configuration
        .certificate;
    const certificatePath = configuration
        .certificatePath;
    certificateParts.certificateContents =
        certificate || (await readFileAsync$2(certificatePath, "utf8"));
    if (sendCertificateChain) {
        certificateParts.x5c = certificateParts.certificateContents;
    }
    const certificatePattern = /(-+BEGIN CERTIFICATE-+)(\n\r?|\r\n?)([A-Za-z0-9+/\n\r]+=*)(\n\r?|\r\n?)(-+END CERTIFICATE-+)/g;
    const publicKeys = [];
    // Match all possible certificates, in the order they are in the file. These will form the chain that is used for x5c
    let match;
    do {
        match = certificatePattern.exec(certificateParts.certificateContents);
        if (match) {
            publicKeys.push(match[3]);
        }
    } while (match);
    if (publicKeys.length === 0) {
        throw new Error("The file at the specified path does not contain a PEM-encoded certificate.");
    }
    certificateParts.thumbprint = crypto.createHash("sha1")
        .update(Buffer.from(publicKeys[0], "base64"))
        .digest("hex")
        .toUpperCase();
    return certificateParts;
}
/**
 * MSAL client certificate client. Calls to MSAL's confidential application's `acquireTokenByClientCredential` during `doGetToken`.
 * @internal
 */
class MsalClientCertificate extends MsalNode {
    constructor(options) {
        super(options);
        this.requiresConfidential = true;
        this.configuration = options.configuration;
        this.sendCertificateChain = options.sendCertificateChain;
    }
    // Changing the MSAL configuration asynchronously
    async init(options) {
        try {
            const parts = await parseCertificate(this.configuration, this.sendCertificateChain);
            this.msalConfig.auth.clientCertificate = {
                thumbprint: parts.thumbprint,
                privateKey: parts.certificateContents,
                x5c: parts.x5c,
            };
        }
        catch (error) {
            this.logger.info(formatError("", error));
            throw error;
        }
        return super.init(options);
    }
    async doGetToken(scopes, options = {}) {
        try {
            const clientCredReq = {
                scopes,
                correlationId: options.correlationId,
                azureRegion: this.azureRegion,
                authority: options.authority,
                claims: options.claims,
            };
            const result = await this.confidentialApp.acquireTokenByClientCredential(clientCredReq);
            // Even though we're providing the same default in memory persistence cache that we use for DeviceCodeCredential,
            // The Client Credential flow does not return the account information from the authentication service,
            // so each time getToken gets called, we will have to acquire a new token through the service.
            return this.handleResult(scopes, this.clientId, result || undefined);
        }
        catch (err) {
            throw this.handleError(scopes, err, options);
        }
    }
}

// Copyright (c) Microsoft Corporation.
const credentialName$2 = "ClientCertificateCredential";
const logger$f = credentialLogger(credentialName$2);
/**
 * Enables authentication to Azure Active Directory using a PEM-encoded
 * certificate that is assigned to an App Registration. More information
 * on how to configure certificate authentication can be found here:
 *
 * https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-certificate-credentials#register-your-certificate-with-azure-ad
 *
 */
class ClientCertificateCredential {
    constructor(tenantId, clientId, certificatePathOrConfiguration, options = {}) {
        if (!tenantId || !clientId) {
            throw new Error(`${credentialName$2}: tenantId and clientId are required parameters.`);
        }
        const configuration = Object.assign({}, (typeof certificatePathOrConfiguration === "string"
            ? {
                certificatePath: certificatePathOrConfiguration,
            }
            : certificatePathOrConfiguration));
        const certificate = configuration
            .certificate;
        const certificatePath = configuration.certificatePath;
        if (!configuration || !(certificate || certificatePath)) {
            throw new Error(`${credentialName$2}: Provide either a PEM certificate in string form, or the path to that certificate in the filesystem. To troubleshoot, visit https://aka.ms/azsdk/js/identity/serviceprincipalauthentication/troubleshoot.`);
        }
        if (certificate && certificatePath) {
            throw new Error(`${credentialName$2}: To avoid unexpected behaviors, providing both the contents of a PEM certificate and the path to a PEM certificate is forbidden. To troubleshoot, visit https://aka.ms/azsdk/js/identity/serviceprincipalauthentication/troubleshoot.`);
        }
        this.msalFlow = new MsalClientCertificate(Object.assign(Object.assign({}, options), { configuration,
            logger: logger$f,
            clientId,
            tenantId, sendCertificateChain: options.sendCertificateChain, tokenCredentialOptions: options }));
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If authentication fails, a {@link CredentialUnavailableError} will be thrown with the details of the failure.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                TokenCredential implementation might make.
     */
    async getToken(scopes, options = {}) {
        return tracingClient.withSpan(`${credentialName$2}.getToken`, options, async (newOptions) => {
            const arrayScopes = Array.isArray(scopes) ? scopes : [scopes];
            return this.msalFlow.getToken(arrayScopes, newOptions);
        });
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * MSAL username and password client. Calls to the MSAL's public application's `acquireTokenByUsernamePassword` during `doGetToken`.
 * @internal
 */
class MsalUsernamePassword extends MsalNode {
    constructor(options) {
        super(options);
        this.username = options.username;
        this.password = options.password;
    }
    async doGetToken(scopes, options) {
        try {
            const requestOptions = {
                scopes,
                username: this.username,
                password: this.password,
                correlationId: options === null || options === void 0 ? void 0 : options.correlationId,
                authority: options === null || options === void 0 ? void 0 : options.authority,
                claims: options === null || options === void 0 ? void 0 : options.claims,
            };
            const result = await this.publicApp.acquireTokenByUsernamePassword(requestOptions);
            return this.handleResult(scopes, this.clientId, result || undefined);
        }
        catch (error) {
            throw this.handleError(scopes, error, options);
        }
    }
}

// Copyright (c) Microsoft Corporation.
const logger$e = credentialLogger("UsernamePasswordCredential");
/**
 * Enables authentication to Azure Active Directory with a user's
 * username and password. This credential requires a high degree of
 * trust so you should only use it when other, more secure credential
 * types can't be used.
 */
class UsernamePasswordCredential {
    /**
     * Creates an instance of the UsernamePasswordCredential with the details
     * needed to authenticate against Azure Active Directory with a username
     * and password.
     *
     * @param tenantId - The Azure Active Directory tenant (directory).
     * @param clientId - The client (application) ID of an App Registration in the tenant.
     * @param username - The user account's e-mail address (user name).
     * @param password - The user account's account password
     * @param options - Options for configuring the client which makes the authentication request.
     */
    constructor(tenantId, clientId, username, password, options = {}) {
        if (!tenantId || !clientId || !username || !password) {
            throw new Error("UsernamePasswordCredential: tenantId, clientId, username and password are required parameters. To troubleshoot, visit https://aka.ms/azsdk/js/identity/usernamepasswordcredential/troubleshoot.");
        }
        this.msalFlow = new MsalUsernamePassword(Object.assign(Object.assign({}, options), { logger: logger$e,
            clientId,
            tenantId,
            username,
            password, tokenCredentialOptions: options || {} }));
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If authentication fails, a {@link CredentialUnavailableError} will be thrown with the details of the failure.
     *
     * If the user provided the option `disableAutomaticAuthentication`,
     * once the token can't be retrieved silently,
     * this method won't attempt to request user interaction to retrieve the token.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                TokenCredential implementation might make.
     */
    async getToken(scopes, options = {}) {
        return tracingClient.withSpan(`${this.constructor.name}.getToken`, options, async (newOptions) => {
            const arrayScopes = Array.isArray(scopes) ? scopes : [scopes];
            return this.msalFlow.getToken(arrayScopes, newOptions);
        });
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * Contains the list of all supported environment variable names so that an
 * appropriate error message can be generated when no credentials can be
 * configured.
 *
 * @internal
 */
const AllSupportedEnvironmentVariables = [
    "AZURE_TENANT_ID",
    "AZURE_CLIENT_ID",
    "AZURE_CLIENT_SECRET",
    "AZURE_CLIENT_CERTIFICATE_PATH",
    "AZURE_USERNAME",
    "AZURE_PASSWORD",
];
const credentialName$1 = "EnvironmentCredential";
const logger$d = credentialLogger(credentialName$1);
/**
 * Enables authentication to Azure Active Directory using client secret
 * details configured in environment variables
 */
class EnvironmentCredential {
    /**
     * Creates an instance of the EnvironmentCredential class and decides what credential to use depending on the available environment variables.
     *
     * Required environment variables:
     * - `AZURE_TENANT_ID`: The Azure Active Directory tenant (directory) ID.
     * - `AZURE_CLIENT_ID`: The client (application) ID of an App Registration in the tenant.
     *
     * Environment variables used for client credential authentication:
     * - `AZURE_CLIENT_SECRET`: A client secret that was generated for the App Registration.
     * - `AZURE_CLIENT_CERTIFICATE_PATH`: The path to a PEM certificate to use during the authentication, instead of the client secret.
     *
     * Alternatively, users can provide environment variables for username and password authentication:
     * - `AZURE_USERNAME`: Username to authenticate with.
     * - `AZURE_PASSWORD`: Password to authenticate with.
     *
     * If the environment variables required to perform the authentication are missing, a {@link CredentialUnavailableError} will be thrown.
     * If the authentication fails, or if there's an unknown error, an {@link AuthenticationError} will be thrown.
     *
     * @param options - Options for configuring the client which makes the authentication request.
     */
    constructor(options) {
        // Keep track of any missing environment variables for error details
        this._credential = undefined;
        const assigned = processEnvVars(AllSupportedEnvironmentVariables).assigned.join(", ");
        logger$d.info(`Found the following environment variables: ${assigned}`);
        const tenantId = process.env.AZURE_TENANT_ID, clientId = process.env.AZURE_CLIENT_ID, clientSecret = process.env.AZURE_CLIENT_SECRET;
        if (tenantId) {
            checkTenantId(logger$d, tenantId);
        }
        if (tenantId && clientId && clientSecret) {
            logger$d.info(`Invoking ClientSecretCredential with tenant ID: ${tenantId}, clientId: ${clientId} and clientSecret: [REDACTED]`);
            this._credential = new ClientSecretCredential(tenantId, clientId, clientSecret, options);
            return;
        }
        const certificatePath = process.env.AZURE_CLIENT_CERTIFICATE_PATH;
        if (tenantId && clientId && certificatePath) {
            logger$d.info(`Invoking ClientCertificateCredential with tenant ID: ${tenantId}, clientId: ${clientId} and certificatePath: ${certificatePath}`);
            this._credential = new ClientCertificateCredential(tenantId, clientId, { certificatePath }, options);
            return;
        }
        const username = process.env.AZURE_USERNAME;
        const password = process.env.AZURE_PASSWORD;
        if (tenantId && clientId && username && password) {
            logger$d.info(`Invoking UsernamePasswordCredential with tenant ID: ${tenantId}, clientId: ${clientId} and username: ${username}`);
            this._credential = new UsernamePasswordCredential(tenantId, clientId, username, password, options);
        }
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - Optional parameters. See {@link GetTokenOptions}.
     */
    async getToken(scopes, options = {}) {
        return tracingClient.withSpan(`${credentialName$1}.getToken`, options, async (newOptions) => {
            if (this._credential) {
                try {
                    const result = await this._credential.getToken(scopes, newOptions);
                    logger$d.getToken.info(formatSuccess(scopes));
                    return result;
                }
                catch (err) {
                    const authenticationError = new AuthenticationError(400, {
                        error: `${credentialName$1} authentication failed. To troubleshoot, visit https://aka.ms/azsdk/js/identity/environmentcredential/troubleshoot.`,
                        error_description: err.message.toString().split("More details:").join(""),
                    });
                    logger$d.getToken.info(formatError(scopes, authenticationError));
                    throw authenticationError;
                }
            }
            throw new CredentialUnavailableError(`${credentialName$1} is unavailable. No underlying credential could be used. To troubleshoot, visit https://aka.ms/azsdk/js/identity/environmentcredential/troubleshoot.`);
        });
    }
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
const DefaultScopeSuffix = "/.default";
const imdsHost = "http://169.254.169.254";
const imdsEndpointPath = "/metadata/identity/oauth2/token";
const imdsApiVersion = "2018-02-01";
const azureArcAPIVersion = "2019-11-01";
const azureFabricVersion = "2019-07-01-preview";

// Copyright (c) Microsoft Corporation.
/**
 * Most MSIs send requests to the IMDS endpoint, or a similar endpoint.
 * These are GET requests that require sending a `resource` parameter on the query.
 * This resource can be derived from the scopes received through the getToken call, as long as only one scope is received.
 * Multiple scopes assume that the resulting token will have access to multiple resources, which won't be the case.
 *
 * For that reason, when we encounter multiple scopes, we return undefined.
 * It's up to the individual MSI implementations to throw the errors (which helps us provide less generic errors).
 */
function mapScopesToResource(scopes) {
    let scope = "";
    if (Array.isArray(scopes)) {
        if (scopes.length !== 1) {
            return;
        }
        scope = scopes[0];
    }
    else if (typeof scopes === "string") {
        scope = scopes;
    }
    if (!scope.endsWith(DefaultScopeSuffix)) {
        return scope;
    }
    return scope.substr(0, scope.lastIndexOf(DefaultScopeSuffix));
}

// Copyright (c) Microsoft Corporation.
const msiName$6 = "ManagedIdentityCredential - AppServiceMSI 2017";
const logger$c = credentialLogger(msiName$6);
/**
 * Formats the expiration date of the received token into the number of milliseconds between that date and midnight, January 1, 1970.
 */
function expiresOnParser$3(requestBody) {
    // App Service always returns string expires_on values.
    return Date.parse(requestBody.expires_on);
}
/**
 * Generates the options used on the request for an access token.
 */
function prepareRequestOptions$6(scopes, clientId) {
    const resource = mapScopesToResource(scopes);
    if (!resource) {
        throw new Error(`${msiName$6}: Multiple scopes are not supported.`);
    }
    const queryParameters = {
        resource,
        "api-version": "2017-09-01",
    };
    if (clientId) {
        queryParameters.clientid = clientId;
    }
    const query = new URLSearchParams(queryParameters);
    // This error should not bubble up, since we verify that this environment variable is defined in the isAvailable() method defined below.
    if (!process.env.MSI_ENDPOINT) {
        throw new Error(`${msiName$6}: Missing environment variable: MSI_ENDPOINT`);
    }
    if (!process.env.MSI_SECRET) {
        throw new Error(`${msiName$6}: Missing environment variable: MSI_SECRET`);
    }
    return {
        url: `${process.env.MSI_ENDPOINT}?${query.toString()}`,
        method: "GET",
        headers: coreRestPipeline.createHttpHeaders({
            Accept: "application/json",
            secret: process.env.MSI_SECRET,
        }),
    };
}
/**
 * Defines how to determine whether the Azure App Service MSI is available, and also how to retrieve a token from the Azure App Service MSI.
 */
const appServiceMsi2017 = {
    async isAvailable({ scopes }) {
        const resource = mapScopesToResource(scopes);
        if (!resource) {
            logger$c.info(`${msiName$6}: Unavailable. Multiple scopes are not supported.`);
            return false;
        }
        const env = process.env;
        const result = Boolean(env.MSI_ENDPOINT && env.MSI_SECRET);
        if (!result) {
            logger$c.info(`${msiName$6}: Unavailable. The environment variables needed are: MSI_ENDPOINT and MSI_SECRET.`);
        }
        return result;
    },
    async getToken(configuration, getTokenOptions = {}) {
        const { identityClient, scopes, clientId, resourceId } = configuration;
        if (resourceId) {
            logger$c.warning(`${msiName$6}: managed Identity by resource Id is not supported. Argument resourceId might be ignored by the service.`);
        }
        logger$c.info(`${msiName$6}: Using the endpoint and the secret coming form the environment variables: MSI_ENDPOINT=${process.env.MSI_ENDPOINT} and MSI_SECRET=[REDACTED].`);
        const request = coreRestPipeline.createPipelineRequest(Object.assign(Object.assign({ abortSignal: getTokenOptions.abortSignal }, prepareRequestOptions$6(scopes, clientId)), { 
            // Generally, MSI endpoints use the HTTP protocol, without transport layer security (TLS).
            allowInsecureConnection: true }));
        const tokenResponse = await identityClient.sendTokenRequest(request, expiresOnParser$3);
        return (tokenResponse && tokenResponse.accessToken) || null;
    },
};

// Copyright (c) Microsoft Corporation.
const msiName$5 = "ManagedIdentityCredential - CloudShellMSI";
const logger$b = credentialLogger(msiName$5);
/**
 * Generates the options used on the request for an access token.
 */
function prepareRequestOptions$5(scopes, clientId, resourceId) {
    const resource = mapScopesToResource(scopes);
    if (!resource) {
        throw new Error(`${msiName$5}: Multiple scopes are not supported.`);
    }
    const body = {
        resource,
    };
    if (clientId) {
        body.client_id = clientId;
    }
    if (resourceId) {
        body.msi_res_id = resourceId;
    }
    // This error should not bubble up, since we verify that this environment variable is defined in the isAvailable() method defined below.
    if (!process.env.MSI_ENDPOINT) {
        throw new Error(`${msiName$5}: Missing environment variable: MSI_ENDPOINT`);
    }
    const params = new URLSearchParams(body);
    return {
        url: process.env.MSI_ENDPOINT,
        method: "POST",
        body: params.toString(),
        headers: coreRestPipeline.createHttpHeaders({
            Accept: "application/json",
            Metadata: "true",
            "Content-Type": "application/x-www-form-urlencoded",
        }),
    };
}
/**
 * Defines how to determine whether the Azure Cloud Shell MSI is available, and also how to retrieve a token from the Azure Cloud Shell MSI.
 * Since Azure Managed Identities aren't available in the Azure Cloud Shell, we log a warning for users that try to access cloud shell using user assigned identity.
 */
const cloudShellMsi = {
    async isAvailable({ scopes }) {
        const resource = mapScopesToResource(scopes);
        if (!resource) {
            logger$b.info(`${msiName$5}: Unavailable. Multiple scopes are not supported.`);
            return false;
        }
        const result = Boolean(process.env.MSI_ENDPOINT);
        if (!result) {
            logger$b.info(`${msiName$5}: Unavailable. The environment variable MSI_ENDPOINT is needed.`);
        }
        return result;
    },
    async getToken(configuration, getTokenOptions = {}) {
        const { identityClient, scopes, clientId, resourceId } = configuration;
        if (clientId) {
            logger$b.warning(`${msiName$5}: user-assigned identities not supported. The argument clientId might be ignored by the service.`);
        }
        if (resourceId) {
            logger$b.warning(`${msiName$5}: user defined managed Identity by resource Id not supported. The argument resourceId might be ignored by the service.`);
        }
        logger$b.info(`${msiName$5}: Using the endpoint coming form the environment variable MSI_ENDPOINT = ${process.env.MSI_ENDPOINT}.`);
        const request = coreRestPipeline.createPipelineRequest(Object.assign(Object.assign({ abortSignal: getTokenOptions.abortSignal }, prepareRequestOptions$5(scopes, clientId, resourceId)), { 
            // Generally, MSI endpoints use the HTTP protocol, without transport layer security (TLS).
            allowInsecureConnection: true }));
        const tokenResponse = await identityClient.sendTokenRequest(request);
        return (tokenResponse && tokenResponse.accessToken) || null;
    },
};

// Copyright (c) Microsoft Corporation.
const msiName$4 = "ManagedIdentityCredential - IMDS";
const logger$a = credentialLogger(msiName$4);
/**
 * Formats the expiration date of the received token into the number of milliseconds between that date and midnight, January 1, 1970.
 */
function expiresOnParser$2(requestBody) {
    if (requestBody.expires_on) {
        // Use the expires_on timestamp if it's available
        const expires = +requestBody.expires_on * 1000;
        logger$a.info(`${msiName$4}: Using expires_on: ${expires} (original value: ${requestBody.expires_on})`);
        return expires;
    }
    else {
        // If these aren't possible, use expires_in and calculate a timestamp
        const expires = Date.now() + requestBody.expires_in * 1000;
        logger$a.info(`${msiName$4}: IMDS using expires_in: ${expires} (original value: ${requestBody.expires_in})`);
        return expires;
    }
}
/**
 * Generates the options used on the request for an access token.
 */
function prepareRequestOptions$4(scopes, clientId, resourceId, options) {
    var _a;
    const resource = mapScopesToResource(scopes);
    if (!resource) {
        throw new Error(`${msiName$4}: Multiple scopes are not supported.`);
    }
    const { skipQuery, skipMetadataHeader } = options || {};
    let query = "";
    // Pod Identity will try to process this request even if the Metadata header is missing.
    // We can exclude the request query to ensure no IMDS endpoint tries to process the ping request.
    if (!skipQuery) {
        const queryParameters = {
            resource,
            "api-version": imdsApiVersion,
        };
        if (clientId) {
            queryParameters.client_id = clientId;
        }
        if (resourceId) {
            queryParameters.msi_res_id = resourceId;
        }
        const params = new URLSearchParams(queryParameters);
        query = `?${params.toString()}`;
    }
    const url = new URL(imdsEndpointPath, (_a = process.env.AZURE_POD_IDENTITY_AUTHORITY_HOST) !== null && _a !== void 0 ? _a : imdsHost);
    const rawHeaders = {
        Accept: "application/json",
        Metadata: "true",
    };
    // Remove the Metadata header to invoke a request error from some IMDS endpoints.
    if (skipMetadataHeader) {
        delete rawHeaders.Metadata;
    }
    return {
        // In this case, the `?` should be added in the "query" variable `skipQuery` is not set.
        url: `${url}${query}`,
        method: "GET",
        headers: coreRestPipeline.createHttpHeaders(rawHeaders),
    };
}
// 800ms -> 1600ms -> 3200ms
const imdsMsiRetryConfig = {
    maxRetries: 3,
    startDelayInMs: 800,
    intervalIncrement: 2,
};
/**
 * Defines how to determine whether the Azure IMDS MSI is available, and also how to retrieve a token from the Azure IMDS MSI.
 */
const imdsMsi = {
    async isAvailable({ scopes, identityClient, clientId, resourceId, getTokenOptions = {}, }) {
        const resource = mapScopesToResource(scopes);
        if (!resource) {
            logger$a.info(`${msiName$4}: Unavailable. Multiple scopes are not supported.`);
            return false;
        }
        // if the PodIdentityEndpoint environment variable was set no need to probe the endpoint, it can be assumed to exist
        if (process.env.AZURE_POD_IDENTITY_AUTHORITY_HOST) {
            return true;
        }
        if (!identityClient) {
            throw new Error("Missing IdentityClient");
        }
        const requestOptions = prepareRequestOptions$4(resource, clientId, resourceId, {
            skipMetadataHeader: true,
            skipQuery: true,
        });
        return tracingClient.withSpan("ManagedIdentityCredential-pingImdsEndpoint", getTokenOptions, async (options) => {
            var _a, _b;
            requestOptions.tracingOptions = options.tracingOptions;
            try {
                // Create a request with a timeout since we expect that
                // not having a "Metadata" header should cause an error to be
                // returned quickly from the endpoint, proving its availability.
                const request = coreRestPipeline.createPipelineRequest(requestOptions);
                request.timeout = (_b = (_a = options.requestOptions) === null || _a === void 0 ? void 0 : _a.timeout) !== null && _b !== void 0 ? _b : 300;
                // This MSI uses the imdsEndpoint to get the token, which only uses http://
                request.allowInsecureConnection = true;
                try {
                    logger$a.info(`${msiName$4}: Pinging the Azure IMDS endpoint`);
                    await identityClient.sendRequest(request);
                }
                catch (err) {
                    if ((err.name === "RestError" && err.code === coreRestPipeline.RestError.REQUEST_SEND_ERROR) ||
                        err.name === "AbortError" ||
                        err.code === "ENETUNREACH" || // Network unreachable
                        err.code === "ECONNREFUSED" || // connection refused
                        err.code === "EHOSTDOWN" // host is down
                    ) {
                        // If the request failed, or Node.js was unable to establish a connection,
                        // or the host was down, we'll assume the IMDS endpoint isn't available.
                        logger$a.info(`${msiName$4}: The Azure IMDS endpoint is unavailable`);
                        return false;
                    }
                }
                // If we received any response, the endpoint is available
                logger$a.info(`${msiName$4}: The Azure IMDS endpoint is available`);
                return true;
            }
            catch (err) {
                // createWebResource failed.
                // This error should bubble up to the user.
                logger$a.info(`${msiName$4}: Error when creating the WebResource for the Azure IMDS endpoint: ${err.message}`);
                throw err;
            }
        });
    },
    async getToken(configuration, getTokenOptions = {}) {
        const { identityClient, scopes, clientId, resourceId } = configuration;
        logger$a.info(`${msiName$4}: Using the Azure IMDS endpoint coming from the environment variable MSI_ENDPOINT=${process.env.MSI_ENDPOINT}, and using the cloud shell to proceed with the authentication.`);
        let nextDelayInMs = imdsMsiRetryConfig.startDelayInMs;
        for (let retries = 0; retries < imdsMsiRetryConfig.maxRetries; retries++) {
            try {
                const request = coreRestPipeline.createPipelineRequest(Object.assign(Object.assign({ abortSignal: getTokenOptions.abortSignal }, prepareRequestOptions$4(scopes, clientId, resourceId)), { allowInsecureConnection: true }));
                const tokenResponse = await identityClient.sendTokenRequest(request, expiresOnParser$2);
                return (tokenResponse && tokenResponse.accessToken) || null;
            }
            catch (error) {
                if (error.statusCode === 404) {
                    await coreUtil.delay(nextDelayInMs);
                    nextDelayInMs *= imdsMsiRetryConfig.intervalIncrement;
                    continue;
                }
                throw error;
            }
        }
        throw new AuthenticationError(404, `${msiName$4}: Failed to retrieve IMDS token after ${imdsMsiRetryConfig.maxRetries} retries.`);
    },
};

// Copyright (c) Microsoft Corporation.
const msiName$3 = "ManagedIdentityCredential - Azure Arc MSI";
const logger$9 = credentialLogger(msiName$3);
/**
 * Generates the options used on the request for an access token.
 */
function prepareRequestOptions$3(scopes, clientId, resourceId) {
    const resource = mapScopesToResource(scopes);
    if (!resource) {
        throw new Error(`${msiName$3}: Multiple scopes are not supported.`);
    }
    const queryParameters = {
        resource,
        "api-version": azureArcAPIVersion,
    };
    if (clientId) {
        queryParameters.client_id = clientId;
    }
    if (resourceId) {
        queryParameters.msi_res_id = resourceId;
    }
    // This error should not bubble up, since we verify that this environment variable is defined in the isAvailable() method defined below.
    if (!process.env.IDENTITY_ENDPOINT) {
        throw new Error(`${msiName$3}: Missing environment variable: IDENTITY_ENDPOINT`);
    }
    const query = new URLSearchParams(queryParameters);
    return coreRestPipeline.createPipelineRequest({
        // Should be similar to: http://localhost:40342/metadata/identity/oauth2/token
        url: `${process.env.IDENTITY_ENDPOINT}?${query.toString()}`,
        method: "GET",
        headers: coreRestPipeline.createHttpHeaders({
            Accept: "application/json",
            Metadata: "true",
        }),
    });
}
/**
 * Retrieves the file contents at the given path using promises.
 * Useful since `fs`'s readFileSync locks the thread, and to avoid extra dependencies.
 */
function readFileAsync$1(path, options) {
    return new Promise((resolve, reject) => fs.readFile(path, options, (err, data) => {
        if (err) {
            reject(err);
        }
        resolve(data);
    }));
}
/**
 * Does a request to the authentication provider that results in a file path.
 */
async function filePathRequest(identityClient, requestPrepareOptions) {
    const response = await identityClient.sendRequest(coreRestPipeline.createPipelineRequest(requestPrepareOptions));
    if (response.status !== 401) {
        let message = "";
        if (response.bodyAsText) {
            message = ` Response: ${response.bodyAsText}`;
        }
        throw new AuthenticationError(response.status, `${msiName$3}: To authenticate with Azure Arc MSI, status code 401 is expected on the first request. ${message}`);
    }
    const authHeader = response.headers.get("www-authenticate") || "";
    try {
        return authHeader.split("=").slice(1)[0];
    }
    catch (e) {
        throw Error(`Invalid www-authenticate header format: ${authHeader}`);
    }
}
/**
 * Defines how to determine whether the Azure Arc MSI is available, and also how to retrieve a token from the Azure Arc MSI.
 */
const arcMsi = {
    async isAvailable({ scopes }) {
        const resource = mapScopesToResource(scopes);
        if (!resource) {
            logger$9.info(`${msiName$3}: Unavailable. Multiple scopes are not supported.`);
            return false;
        }
        const result = Boolean(process.env.IMDS_ENDPOINT && process.env.IDENTITY_ENDPOINT);
        if (!result) {
            logger$9.info(`${msiName$3}: The environment variables needed are: IMDS_ENDPOINT and IDENTITY_ENDPOINT`);
        }
        return result;
    },
    async getToken(configuration, getTokenOptions = {}) {
        var _a;
        const { identityClient, scopes, clientId, resourceId } = configuration;
        if (clientId) {
            logger$9.warning(`${msiName$3}: user-assigned identities not supported. The argument clientId might be ignored by the service.`);
        }
        if (resourceId) {
            logger$9.warning(`${msiName$3}: user defined managed Identity by resource Id is not supported. Argument resourceId will be ignored.`);
        }
        logger$9.info(`${msiName$3}: Authenticating.`);
        const requestOptions = Object.assign(Object.assign({ disableJsonStringifyOnBody: true, deserializationMapper: undefined, abortSignal: getTokenOptions.abortSignal }, prepareRequestOptions$3(scopes, clientId, resourceId)), { allowInsecureConnection: true });
        const filePath = await filePathRequest(identityClient, requestOptions);
        if (!filePath) {
            throw new Error(`${msiName$3}: Failed to find the token file.`);
        }
        const key = await readFileAsync$1(filePath, { encoding: "utf-8" });
        (_a = requestOptions.headers) === null || _a === void 0 ? void 0 : _a.set("Authorization", `Basic ${key}`);
        const request = coreRestPipeline.createPipelineRequest(Object.assign(Object.assign({}, requestOptions), { 
            // Generally, MSI endpoints use the HTTP protocol, without transport layer security (TLS).
            allowInsecureConnection: true }));
        const tokenResponse = await identityClient.sendTokenRequest(request);
        return (tokenResponse && tokenResponse.accessToken) || null;
    },
};

// Copyright (c) Microsoft Corporation.
const msiName$2 = "ManagedIdentityCredential - Token Exchange";
const logger$8 = credentialLogger(msiName$2);
const readFileAsync = util.promisify(fs__default["default"].readFile);
/**
 * Generates the options used on the request for an access token.
 */
function prepareRequestOptions$2(scopes, clientAssertion, clientId) {
    var _a;
    const bodyParams = {
        scope: Array.isArray(scopes) ? scopes.join(" ") : scopes,
        client_assertion: clientAssertion,
        client_assertion_type: "urn:ietf:params:oauth:client-assertion-type:jwt-bearer",
        client_id: clientId,
        grant_type: "client_credentials",
    };
    const urlParams = new URLSearchParams(bodyParams);
    const url = new URL(`${process.env.AZURE_TENANT_ID}/oauth2/v2.0/token`, (_a = process.env.AZURE_AUTHORITY_HOST) !== null && _a !== void 0 ? _a : DefaultAuthorityHost);
    return {
        url: url.toString(),
        method: "POST",
        body: urlParams.toString(),
        headers: coreRestPipeline.createHttpHeaders({
            Accept: "application/json",
        }),
    };
}
/**
 * Defines how to determine whether the token exchange MSI is available, and also how to retrieve a token from the token exchange MSI.
 */
function tokenExchangeMsi() {
    const azureFederatedTokenFilePath = process.env.AZURE_FEDERATED_TOKEN_FILE;
    let azureFederatedTokenFileContent = undefined;
    let cacheDate = undefined;
    // Only reads from the assertion file once every 5 minutes
    async function readAssertion() {
        // Cached assertions expire after 5 minutes
        if (cacheDate !== undefined && Date.now() - cacheDate >= 1000 * 60 * 5) {
            azureFederatedTokenFileContent = undefined;
        }
        if (!azureFederatedTokenFileContent) {
            const file = await readFileAsync(azureFederatedTokenFilePath, "utf8");
            const value = file.trim();
            if (!value) {
                throw new Error(`No content on the file ${azureFederatedTokenFilePath}, indicated by the environment variable AZURE_FEDERATED_TOKEN_FILE`);
            }
            else {
                azureFederatedTokenFileContent = value;
                cacheDate = Date.now();
            }
        }
        return azureFederatedTokenFileContent;
    }
    return {
        async isAvailable({ clientId }) {
            const env = process.env;
            const result = Boolean((clientId || env.AZURE_CLIENT_ID) && env.AZURE_TENANT_ID && azureFederatedTokenFilePath);
            if (!result) {
                logger$8.info(`${msiName$2}: Unavailable. The environment variables needed are: AZURE_CLIENT_ID (or the client ID sent through the parameters), AZURE_TENANT_ID and AZURE_FEDERATED_TOKEN_FILE`);
            }
            return result;
        },
        async getToken(configuration, getTokenOptions = {}) {
            const { identityClient, scopes, clientId } = configuration;
            logger$8.info(`${msiName$2}: Using the client assertion coming from environment variables.`);
            let assertion;
            try {
                assertion = await readAssertion();
            }
            catch (err) {
                throw new Error(`${msiName$2}: Failed to read ${azureFederatedTokenFilePath}, indicated by the environment variable AZURE_FEDERATED_TOKEN_FILE`);
            }
            const request = coreRestPipeline.createPipelineRequest(Object.assign(Object.assign({ abortSignal: getTokenOptions.abortSignal }, prepareRequestOptions$2(scopes, assertion, clientId || process.env.AZURE_CLIENT_ID)), { 
                // Generally, MSI endpoints use the HTTP protocol, without transport layer security (TLS).
                allowInsecureConnection: true }));
            const tokenResponse = await identityClient.sendTokenRequest(request);
            return (tokenResponse && tokenResponse.accessToken) || null;
        },
    };
}

// Copyright (c) Microsoft Corporation.
// This MSI can be easily tested by deploying a container to Azure Service Fabric with the Dockerfile:
//
//   FROM node:12
//   RUN wget https://host.any/path/bash.sh
//   CMD ["bash", "bash.sh"]
//
// Where the bash script contains:
//
//   curl --insecure $IDENTITY_ENDPOINT'?api-version=2019-07-01-preview&resource=https://vault.azure.net/' -H "Secret: $IDENTITY_HEADER"
//
const msiName$1 = "ManagedIdentityCredential - Fabric MSI";
const logger$7 = credentialLogger(msiName$1);
/**
 * Formats the expiration date of the received token into the number of milliseconds between that date and midnight, January 1, 1970.
 */
function expiresOnParser$1(requestBody) {
    // Parses a string representation of the milliseconds since epoch into a number value
    return Number(requestBody.expires_on);
}
/**
 * Generates the options used on the request for an access token.
 */
function prepareRequestOptions$1(scopes, clientId, resourceId) {
    const resource = mapScopesToResource(scopes);
    if (!resource) {
        throw new Error(`${msiName$1}: Multiple scopes are not supported.`);
    }
    const queryParameters = {
        resource,
        "api-version": azureFabricVersion,
    };
    if (clientId) {
        queryParameters.client_id = clientId;
    }
    if (resourceId) {
        queryParameters.msi_res_id = resourceId;
    }
    const query = new URLSearchParams(queryParameters);
    // This error should not bubble up, since we verify that this environment variable is defined in the isAvailable() method defined below.
    if (!process.env.IDENTITY_ENDPOINT) {
        throw new Error("Missing environment variable: IDENTITY_ENDPOINT");
    }
    if (!process.env.IDENTITY_HEADER) {
        throw new Error("Missing environment variable: IDENTITY_HEADER");
    }
    return {
        url: `${process.env.IDENTITY_ENDPOINT}?${query.toString()}`,
        method: "GET",
        headers: coreRestPipeline.createHttpHeaders({
            Accept: "application/json",
            secret: process.env.IDENTITY_HEADER,
        }),
    };
}
/**
 * Defines how to determine whether the Azure Service Fabric MSI is available, and also how to retrieve a token from the Azure Service Fabric MSI.
 */
const fabricMsi = {
    async isAvailable({ scopes }) {
        const resource = mapScopesToResource(scopes);
        if (!resource) {
            logger$7.info(`${msiName$1}: Unavailable. Multiple scopes are not supported.`);
            return false;
        }
        const env = process.env;
        const result = Boolean(env.IDENTITY_ENDPOINT && env.IDENTITY_HEADER && env.IDENTITY_SERVER_THUMBPRINT);
        if (!result) {
            logger$7.info(`${msiName$1}: Unavailable. The environment variables needed are: IDENTITY_ENDPOINT, IDENTITY_HEADER and IDENTITY_SERVER_THUMBPRINT`);
        }
        return result;
    },
    async getToken(configuration, getTokenOptions = {}) {
        const { scopes, identityClient, clientId, resourceId } = configuration;
        if (resourceId) {
            logger$7.warning(`${msiName$1}: user defined managed Identity by resource Id is not supported. Argument resourceId might be ignored by the service.`);
        }
        logger$7.info([
            `${msiName$1}:`,
            "Using the endpoint and the secret coming from the environment variables:",
            `IDENTITY_ENDPOINT=${process.env.IDENTITY_ENDPOINT},`,
            "IDENTITY_HEADER=[REDACTED] and",
            "IDENTITY_SERVER_THUMBPRINT=[REDACTED].",
        ].join(" "));
        const request = coreRestPipeline.createPipelineRequest(Object.assign({ abortSignal: getTokenOptions.abortSignal }, prepareRequestOptions$1(scopes, clientId, resourceId)));
        request.agent = new https__default["default"].Agent({
            // This is necessary because Service Fabric provides a self-signed certificate.
            // The alternative path is to verify the certificate using the IDENTITY_SERVER_THUMBPRINT env variable.
            rejectUnauthorized: false,
        });
        const tokenResponse = await identityClient.sendTokenRequest(request, expiresOnParser$1);
        return (tokenResponse && tokenResponse.accessToken) || null;
    },
};

// Copyright (c) Microsoft Corporation.
const msiName = "ManagedIdentityCredential - AppServiceMSI 2019";
const logger$6 = credentialLogger(msiName);
/**
 * Formats the expiration date of the received token into the number of milliseconds between that date and midnight, January 1, 1970.
 */
function expiresOnParser(requestBody) {
    // App Service always returns string expires_on values.
    return Date.parse(requestBody.expires_on);
}
/**
 * Generates the options used on the request for an access token.
 */
function prepareRequestOptions(scopes, clientId, resourceId) {
    const resource = mapScopesToResource(scopes);
    if (!resource) {
        throw new Error(`${msiName}: Multiple scopes are not supported.`);
    }
    const queryParameters = {
        resource,
        "api-version": "2019-08-01",
    };
    if (clientId) {
        queryParameters.client_id = clientId;
    }
    if (resourceId) {
        queryParameters.mi_res_id = resourceId;
    }
    const query = new URLSearchParams(queryParameters);
    // This error should not bubble up, since we verify that this environment variable is defined in the isAvailable() method defined below.
    if (!process.env.IDENTITY_ENDPOINT) {
        throw new Error(`${msiName}: Missing environment variable: IDENTITY_ENDPOINT`);
    }
    if (!process.env.IDENTITY_HEADER) {
        throw new Error(`${msiName}: Missing environment variable: IDENTITY_HEADER`);
    }
    return {
        url: `${process.env.IDENTITY_ENDPOINT}?${query.toString()}`,
        method: "GET",
        headers: coreRestPipeline.createHttpHeaders({
            Accept: "application/json",
            "X-IDENTITY-HEADER": process.env.IDENTITY_HEADER,
        }),
    };
}
/**
 * Defines how to determine whether the Azure App Service MSI is available, and also how to retrieve a token from the Azure App Service MSI.
 */
const appServiceMsi2019 = {
    async isAvailable({ scopes }) {
        const resource = mapScopesToResource(scopes);
        if (!resource) {
            logger$6.info(`${msiName}: Unavailable. Multiple scopes are not supported.`);
            return false;
        }
        const env = process.env;
        const result = Boolean(env.IDENTITY_ENDPOINT && env.IDENTITY_HEADER);
        if (!result) {
            logger$6.info(`${msiName}: Unavailable. The environment variables needed are: IDENTITY_ENDPOINT and IDENTITY_HEADER.`);
        }
        return result;
    },
    async getToken(configuration, getTokenOptions = {}) {
        const { identityClient, scopes, clientId, resourceId } = configuration;
        logger$6.info(`${msiName}: Using the endpoint and the secret coming form the environment variables: IDENTITY_ENDPOINT=${process.env.IDENTITY_ENDPOINT} and IDENTITY_HEADER=[REDACTED].`);
        const request = coreRestPipeline.createPipelineRequest(Object.assign(Object.assign({ abortSignal: getTokenOptions.abortSignal }, prepareRequestOptions(scopes, clientId, resourceId)), { 
            // Generally, MSI endpoints use the HTTP protocol, without transport layer security (TLS).
            allowInsecureConnection: true }));
        const tokenResponse = await identityClient.sendTokenRequest(request, expiresOnParser);
        return (tokenResponse && tokenResponse.accessToken) || null;
    },
};

// Copyright (c) Microsoft Corporation.
const logger$5 = credentialLogger("ManagedIdentityCredential");
/**
 * Attempts authentication using a managed identity available at the deployment environment.
 * This authentication type works in Azure VMs, App Service instances, Azure Functions applications,
 * Azure Kubernetes Services, Azure Service Fabric instances and inside of the Azure Cloud Shell.
 *
 * More information about configuring managed identities can be found here:
 * https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview
 */
class ManagedIdentityCredential {
    /**
     * @internal
     * @hidden
     */
    constructor(clientIdOrOptions, options) {
        this.isEndpointUnavailable = null;
        let _options;
        if (typeof clientIdOrOptions === "string") {
            this.clientId = clientIdOrOptions;
            _options = options;
        }
        else {
            this.clientId = clientIdOrOptions === null || clientIdOrOptions === void 0 ? void 0 : clientIdOrOptions.clientId;
            _options = clientIdOrOptions;
        }
        this.resourceId = _options === null || _options === void 0 ? void 0 : _options.resourceId;
        // For JavaScript users.
        if (this.clientId && this.resourceId) {
            throw new Error(`${ManagedIdentityCredential.name} - Client Id and Resource Id can't be provided at the same time.`);
        }
        this.identityClient = new IdentityClient(_options);
        this.isAvailableIdentityClient = new IdentityClient(Object.assign(Object.assign({}, _options), { retryOptions: {
                maxRetries: 0,
            } }));
    }
    async cachedAvailableMSI(scopes, getTokenOptions) {
        if (this.cachedMSI) {
            return this.cachedMSI;
        }
        const MSIs = [
            arcMsi,
            fabricMsi,
            appServiceMsi2019,
            appServiceMsi2017,
            cloudShellMsi,
            tokenExchangeMsi(),
            imdsMsi,
        ];
        for (const msi of MSIs) {
            if (await msi.isAvailable({
                scopes,
                identityClient: this.isAvailableIdentityClient,
                clientId: this.clientId,
                resourceId: this.resourceId,
                getTokenOptions,
            })) {
                this.cachedMSI = msi;
                return msi;
            }
        }
        throw new CredentialUnavailableError(`${ManagedIdentityCredential.name} - No MSI credential available`);
    }
    async authenticateManagedIdentity(scopes, getTokenOptions) {
        const { span, updatedOptions } = tracingClient.startSpan(`${ManagedIdentityCredential.name}.authenticateManagedIdentity`, getTokenOptions);
        try {
            // Determining the available MSI, and avoiding checking for other MSIs while the program is running.
            const availableMSI = await this.cachedAvailableMSI(scopes, updatedOptions);
            return availableMSI.getToken({
                identityClient: this.identityClient,
                scopes,
                clientId: this.clientId,
                resourceId: this.resourceId,
            }, updatedOptions);
        }
        catch (err) {
            span.setStatus({
                status: "error",
                error: err,
            });
            throw err;
        }
        finally {
            span.end();
        }
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If authentication fails, a {@link CredentialUnavailableError} will be thrown with the details of the failure.
     * If an unexpected error occurs, an {@link AuthenticationError} will be thrown with the details of the failure.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                TokenCredential implementation might make.
     */
    async getToken(scopes, options) {
        let result = null;
        const { span, updatedOptions } = tracingClient.startSpan(`${ManagedIdentityCredential.name}.getToken`, options);
        try {
            // isEndpointAvailable can be true, false, or null,
            // If it's null, it means we don't yet know whether
            // the endpoint is available and need to check for it.
            if (this.isEndpointUnavailable !== true) {
                result = await this.authenticateManagedIdentity(scopes, updatedOptions);
                if (result === null) {
                    // If authenticateManagedIdentity returns null,
                    // it means no MSI endpoints are available.
                    // If so, we avoid trying to reach to them in future requests.
                    this.isEndpointUnavailable = true;
                    // It also means that the endpoint answered with either 200 or 201 (see the sendTokenRequest method),
                    // yet we had no access token. For this reason, we'll throw once with a specific message:
                    const error = new CredentialUnavailableError("The managed identity endpoint was reached, yet no tokens were received.");
                    logger$5.getToken.info(formatError(scopes, error));
                    throw error;
                }
                // Since `authenticateManagedIdentity` didn't throw, and the result was not null,
                // We will assume that this endpoint is reachable from this point forward,
                // and avoid pinging again to it.
                this.isEndpointUnavailable = false;
            }
            else {
                // We've previously determined that the endpoint was unavailable,
                // either because it was unreachable or permanently unable to authenticate.
                const error = new CredentialUnavailableError("The managed identity endpoint is not currently available");
                logger$5.getToken.info(formatError(scopes, error));
                throw error;
            }
            logger$5.getToken.info(formatSuccess(scopes));
            return result;
        }
        catch (err) {
            // CredentialUnavailable errors are expected to reach here.
            // We intend them to bubble up, so that DefaultAzureCredential can catch them.
            if (err.name === "AuthenticationRequiredError") {
                throw err;
            }
            // Expected errors to reach this point:
            // - Errors coming from a method unexpectedly breaking.
            // - When identityClient.sendTokenRequest throws, in which case
            //   if the status code was 400, it means that the endpoint is working,
            //   but no identity is available.
            span.setStatus({
                status: "error",
                error: err,
            });
            // If either the network is unreachable,
            // we can safely assume the credential is unavailable.
            if (err.code === "ENETUNREACH") {
                const error = new CredentialUnavailableError(`${ManagedIdentityCredential.name}: Unavailable. Network unreachable. Message: ${err.message}`);
                logger$5.getToken.info(formatError(scopes, error));
                throw error;
            }
            // If either the host was unreachable,
            // we can safely assume the credential is unavailable.
            if (err.code === "EHOSTUNREACH") {
                const error = new CredentialUnavailableError(`${ManagedIdentityCredential.name}: Unavailable. No managed identity endpoint found. Message: ${err.message}`);
                logger$5.getToken.info(formatError(scopes, error));
                throw error;
            }
            // If err.statusCode has a value of 400, it comes from sendTokenRequest,
            // and it means that the endpoint is working, but that no identity is available.
            if (err.statusCode === 400) {
                throw new CredentialUnavailableError(`${ManagedIdentityCredential.name}: The managed identity endpoint is indicating there's no available identity. Message: ${err.message}`);
            }
            // If the error has no status code, we can assume there was no available identity.
            // This will throw silently during any ChainedTokenCredential.
            if (err.statusCode === undefined) {
                throw new CredentialUnavailableError(`${ManagedIdentityCredential.name}: Authentication failed. Message ${err.message}`);
            }
            // Any other error should break the chain.
            throw new AuthenticationError(err.statusCode, {
                error: `${ManagedIdentityCredential.name} authentication failed.`,
                error_description: err.message,
            });
        }
        finally {
            // Finally is always called, both if we return and if we throw in the above try/catch.
            span.end();
        }
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * A shim around ManagedIdentityCredential that adapts it to accept
 * `DefaultAzureCredentialOptions`.
 *
 * @internal
 */
class DefaultManagedIdentityCredential extends ManagedIdentityCredential {
    // Constructor overload with just the other default options
    // Last constructor overload with Union of all options not required since the above two constructor overloads have optional properties
    constructor(options) {
        var _a;
        const managedIdentityClientId = (_a = options === null || options === void 0 ? void 0 : options.managedIdentityClientId) !== null && _a !== void 0 ? _a : process.env.AZURE_CLIENT_ID;
        const managedResourceId = options === null || options === void 0 ? void 0 : options.managedIdentityResourceId;
        // ManagedIdentityCredential throws if both the resourceId and the clientId are provided.
        if (managedResourceId) {
            const managedIdentityResourceIdOptions = Object.assign(Object.assign({}, options), { resourceId: managedResourceId });
            super(managedIdentityResourceIdOptions);
        }
        else if (managedIdentityClientId) {
            const managedIdentityClientOptions = Object.assign(Object.assign({}, options), { clientId: managedIdentityClientId });
            super(managedIdentityClientOptions);
        }
        else {
            super(options);
        }
    }
}
const defaultCredentials = [
    EnvironmentCredential,
    DefaultManagedIdentityCredential,
    VisualStudioCodeCredential,
    AzureCliCredential,
    AzurePowerShellCredential,
];
/**
 * Provides a default {@link ChainedTokenCredential} configuration that should
 * work for most applications that use the Azure SDK.
 */
class DefaultAzureCredential extends ChainedTokenCredential {
    constructor(options) {
        super(...defaultCredentials.map((ctor) => new ctor(options)));
        this.UnavailableMessage =
            "DefaultAzureCredential => failed to retrieve a token from the included credentials. To troubleshoot, visit https://aka.ms/azsdk/js/identity/defaultazurecredential/troubleshoot.";
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * MSAL client assertion client. Calls to MSAL's confidential application's `acquireTokenByClientCredential` during `doGetToken`.
 * @internal
 */
class MsalClientAssertion extends MsalNode {
    constructor(options) {
        super(options);
        this.requiresConfidential = true;
        this.getAssertion = options.getAssertion;
    }
    async doGetToken(scopes, options = {}) {
        try {
            const assertion = await this.getAssertion();
            const result = await this.confidentialApp.acquireTokenByClientCredential({
                scopes,
                correlationId: options.correlationId,
                azureRegion: this.azureRegion,
                authority: options.authority,
                claims: options.claims,
                clientAssertion: assertion,
            });
            // The Client Credential flow does not return an account,
            // so each time getToken gets called, we will have to acquire a new token through the service.
            return this.handleResult(scopes, this.clientId, result || undefined);
        }
        catch (err) {
            let err2 = err;
            if (err === null || err === undefined) {
                err2 = new Error(JSON.stringify(err));
            }
            else {
                err2 = coreUtil.isError(err) ? err : new Error(String(err));
            }
            throw this.handleError(scopes, err2, options);
        }
    }
}

// Copyright (c) Microsoft Corporation.
const logger$4 = credentialLogger("ClientAssertionCredential");
/**
 * Authenticates a service principal with a JWT assertion.
 */
class ClientAssertionCredential {
    /**
     * Creates an instance of the ClientAssertionCredential with the details
     * needed to authenticate against Azure Active Directory with a client
     * assertion provided by the developer through the `getAssertion` function parameter.
     *
     * @param tenantId - The Azure Active Directory tenant (directory) ID.
     * @param clientId - The client (application) ID of an App Registration in the tenant.
     * @param getAssertion - A function that retrieves the assertion for the credential to use.
     * @param options - Options for configuring the client which makes the authentication request.
     */
    constructor(tenantId, clientId, getAssertion, options = {}) {
        if (!tenantId || !clientId || !getAssertion) {
            throw new Error("ClientAssertionCredential: tenantId, clientId, and clientAssertion are required parameters.");
        }
        this.tenantId = tenantId;
        this.clientId = clientId;
        this.options = options;
        this.msalFlow = new MsalClientAssertion(Object.assign(Object.assign({}, options), { logger: logger$4, clientId: this.clientId, tenantId: this.tenantId, tokenCredentialOptions: this.options, getAssertion }));
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If authentication fails, a {@link CredentialUnavailableError} will be thrown with the details of the failure.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                TokenCredential implementation might make.
     */
    async getToken(scopes, options = {}) {
        return tracingClient.withSpan(`${this.constructor.name}.getToken`, options, async (newOptions) => {
            const arrayScopes = Array.isArray(scopes) ? scopes : [scopes];
            return this.msalFlow.getToken(arrayScopes, newOptions);
        });
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * A call to open(), but mockable
 * @internal
 */
const interactiveBrowserMockable = {
    open: open__default["default"],
};
/**
 * This MSAL client sets up a web server to listen for redirect callbacks, then calls to the MSAL's public application's `acquireTokenByDeviceCode` during `doGetToken`
 * to trigger the authentication flow, and then respond based on the values obtained from the redirect callback
 * @internal
 */
class MsalOpenBrowser extends MsalNode {
    constructor(options) {
        super(options);
        this.logger = credentialLogger("Node.js MSAL Open Browser");
        this.redirectUri = options.redirectUri;
        this.loginHint = options.loginHint;
        const url = new URL(this.redirectUri);
        this.port = parseInt(url.port);
        if (isNaN(this.port)) {
            this.port = 80;
        }
        this.hostname = url.hostname;
    }
    async acquireTokenByCode(request) {
        return this.publicApp.acquireTokenByCode(request);
    }
    doGetToken(scopes, options) {
        return new Promise((resolve, reject) => {
            const socketToDestroy = [];
            const requestListener = (req, res) => {
                var _a;
                if (!req.url) {
                    reject(new Error(`Interactive Browser Authentication Error "Did not receive token with a valid expiration"`));
                    return;
                }
                let url;
                try {
                    url = new URL(req.url, this.redirectUri);
                }
                catch (e) {
                    reject(new Error(`Interactive Browser Authentication Error "Did not receive token with a valid expiration"`));
                    return;
                }
                const tokenRequest = {
                    code: url.searchParams.get("code"),
                    redirectUri: this.redirectUri,
                    scopes: scopes,
                    authority: options === null || options === void 0 ? void 0 : options.authority,
                    codeVerifier: (_a = this.pkceCodes) === null || _a === void 0 ? void 0 : _a.verifier,
                };
                this.acquireTokenByCode(tokenRequest)
                    .then((authResponse) => {
                    if (authResponse === null || authResponse === void 0 ? void 0 : authResponse.account) {
                        this.account = msalToPublic(this.clientId, authResponse.account);
                    }
                    const successMessage = `Authentication Complete. You can close the browser and return to the application.`;
                    if (authResponse && authResponse.expiresOn) {
                        const expiresOnTimestamp = authResponse === null || authResponse === void 0 ? void 0 : authResponse.expiresOn.valueOf();
                        res.writeHead(200);
                        res.end(successMessage);
                        this.logger.getToken.info(formatSuccess(scopes));
                        resolve({
                            expiresOnTimestamp,
                            token: authResponse.accessToken,
                        });
                    }
                    else {
                        const errorMessage = formatError(scopes, `${url.searchParams.get("error")}. ${url.searchParams.get("error_description")}`);
                        res.writeHead(500);
                        res.end(errorMessage);
                        this.logger.getToken.info(errorMessage);
                        reject(new Error(`Interactive Browser Authentication Error "Did not receive token with a valid expiration"`));
                    }
                    cleanup();
                    return;
                })
                    .catch(() => {
                    const errorMessage = formatError(scopes, `${url.searchParams.get("error")}. ${url.searchParams.get("error_description")}`);
                    res.writeHead(500);
                    res.end(errorMessage);
                    this.logger.getToken.info(errorMessage);
                    reject(new Error(`Interactive Browser Authentication Error "Did not receive token with a valid expiration"`));
                    cleanup();
                });
            };
            const app = http__default["default"].createServer(requestListener);
            const server = stoppable__default["default"](app);
            const listen = app.listen(this.port, this.hostname, () => this.logger.info(`InteractiveBrowserCredential listening on port ${this.port}!`));
            function cleanup() {
                if (listen) {
                    listen.close();
                }
                for (const socket of socketToDestroy) {
                    socket.destroy();
                }
                if (server) {
                    server.close();
                    server.stop();
                }
            }
            app.on("connection", (socket) => socketToDestroy.push(socket));
            app.on("error", (err) => {
                cleanup();
                const code = err.code;
                if (code === "EACCES" || code === "EADDRINUSE") {
                    reject(new CredentialUnavailableError([
                        `InteractiveBrowserCredential: Access denied to port ${this.port}.`,
                        `Try sending a redirect URI with a different port, as follows:`,
                        '`new InteractiveBrowserCredential({ redirectUri: "http://localhost:1337" })`',
                    ].join(" ")));
                }
                else {
                    reject(new CredentialUnavailableError(`InteractiveBrowserCredential: Failed to start the necessary web server. Error: ${err.message}`));
                }
            });
            app.on("listening", () => {
                const openPromise = this.openAuthCodeUrl(scopes, options);
                const abortSignal = options === null || options === void 0 ? void 0 : options.abortSignal;
                if (abortSignal) {
                    abortSignal.addEventListener("abort", () => {
                        cleanup();
                        reject(new Error("Aborted"));
                    });
                }
                openPromise.then().catch((e) => {
                    cleanup();
                    reject(e);
                });
            });
        });
    }
    async openAuthCodeUrl(scopeArray, options) {
        // Initialize CryptoProvider instance
        const cryptoProvider = new msalNode__namespace.CryptoProvider();
        // Generate PKCE Codes before starting the authorization flow
        this.pkceCodes = await cryptoProvider.generatePkceCodes();
        const authCodeUrlParameters = {
            scopes: scopeArray,
            correlationId: options === null || options === void 0 ? void 0 : options.correlationId,
            redirectUri: this.redirectUri,
            authority: options === null || options === void 0 ? void 0 : options.authority,
            claims: options === null || options === void 0 ? void 0 : options.claims,
            loginHint: this.loginHint,
            codeChallenge: this.pkceCodes.challenge,
            codeChallengeMethod: "S256", // Use SHA256 Algorithm
        };
        const response = await this.publicApp.getAuthCodeUrl(authCodeUrlParameters);
        try {
            // A new instance on macOS only which allows it to not hang, does not fix the issue on linux
            await interactiveBrowserMockable.open(response, { wait: true, newInstance: true });
        }
        catch (e) {
            throw new CredentialUnavailableError(`InteractiveBrowserCredential: Could not open a browser window. Error: ${e.message}`);
        }
    }
}

// Copyright (c) Microsoft Corporation.
const logger$3 = credentialLogger("InteractiveBrowserCredential");
/**
 * Enables authentication to Azure Active Directory inside of the web browser
 * using the interactive login flow.
 */
class InteractiveBrowserCredential {
    /**
     * Creates an instance of InteractiveBrowserCredential with the details needed.
     *
     * This credential uses the [Authorization Code Flow](https://docs.microsoft.com/azure/active-directory/develop/v2-oauth2-auth-code-flow).
     * On Node.js, it will open a browser window while it listens for a redirect response from the authentication service.
     * On browsers, it authenticates via popups. The `loginStyle` optional parameter can be set to `redirect` to authenticate by redirecting the user to an Azure secure login page, which then will redirect the user back to the web application where the authentication started.
     *
     * For Node.js, if a `clientId` is provided, the Azure Active Directory application will need to be configured to have a "Mobile and desktop applications" redirect endpoint.
     * Follow our guide on [setting up Redirect URIs for Desktop apps that calls to web APIs](https://docs.microsoft.com/azure/active-directory/develop/scenario-desktop-app-registration#redirect-uris).
     *
     * @param options - Options for configuring the client which makes the authentication requests.
     */
    constructor(options = {}) {
        const redirectUri = typeof options.redirectUri === "function"
            ? options.redirectUri()
            : options.redirectUri || "http://localhost";
        this.msalFlow = new MsalOpenBrowser(Object.assign(Object.assign({}, options), { tokenCredentialOptions: options, logger: logger$3,
            redirectUri }));
        this.disableAutomaticAuthentication = options === null || options === void 0 ? void 0 : options.disableAutomaticAuthentication;
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If authentication fails, a {@link CredentialUnavailableError} will be thrown with the details of the failure.
     *
     * If the user provided the option `disableAutomaticAuthentication`,
     * once the token can't be retrieved silently,
     * this method won't attempt to request user interaction to retrieve the token.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                TokenCredential implementation might make.
     */
    async getToken(scopes, options = {}) {
        return tracingClient.withSpan(`${this.constructor.name}.getToken`, options, async (newOptions) => {
            const arrayScopes = Array.isArray(scopes) ? scopes : [scopes];
            return this.msalFlow.getToken(arrayScopes, Object.assign(Object.assign({}, newOptions), { disableAutomaticAuthentication: this.disableAutomaticAuthentication }));
        });
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If authentication fails, a {@link CredentialUnavailableError} will be thrown with the details of the failure.
     *
     * If the token can't be retrieved silently, this method will require user interaction to retrieve the token.
     *
     * On Node.js, this credential has [Proof Key for Code Exchange (PKCE)](https://datatracker.ietf.org/doc/html/rfc7636) enabled by default.
     * PKCE is a security feature that mitigates authentication code interception attacks.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                  TokenCredential implementation might make.
     */
    async authenticate(scopes, options = {}) {
        return tracingClient.withSpan(`${this.constructor.name}.authenticate`, options, async (newOptions) => {
            const arrayScopes = Array.isArray(scopes) ? scopes : [scopes];
            await this.msalFlow.getToken(arrayScopes, newOptions);
            return this.msalFlow.getActiveAccount();
        });
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * MSAL device code client. Calls to the MSAL's public application's `acquireTokenByDeviceCode` during `doGetToken`.
 * @internal
 */
class MsalDeviceCode extends MsalNode {
    constructor(options) {
        super(options);
        this.userPromptCallback = options.userPromptCallback;
    }
    async doGetToken(scopes, options) {
        try {
            const requestOptions = {
                deviceCodeCallback: this.userPromptCallback,
                scopes,
                cancel: false,
                correlationId: options === null || options === void 0 ? void 0 : options.correlationId,
                authority: options === null || options === void 0 ? void 0 : options.authority,
                claims: options === null || options === void 0 ? void 0 : options.claims,
            };
            const promise = this.publicApp.acquireTokenByDeviceCode(requestOptions);
            const deviceResponse = await this.withCancellation(promise, options === null || options === void 0 ? void 0 : options.abortSignal, () => {
                requestOptions.cancel = true;
            });
            return this.handleResult(scopes, this.clientId, deviceResponse || undefined);
        }
        catch (error) {
            throw this.handleError(scopes, error, options);
        }
    }
}

// Copyright (c) Microsoft Corporation.
const logger$2 = credentialLogger("DeviceCodeCredential");
/**
 * Method that logs the user code from the DeviceCodeCredential.
 * @param deviceCodeInfo - The device code.
 */
function defaultDeviceCodePromptCallback(deviceCodeInfo) {
    console.log(deviceCodeInfo.message);
}
/**
 * Enables authentication to Azure Active Directory using a device code
 * that the user can enter into https://microsoft.com/devicelogin.
 */
class DeviceCodeCredential {
    /**
     * Creates an instance of DeviceCodeCredential with the details needed
     * to initiate the device code authorization flow with Azure Active Directory.
     *
     * A message will be logged, giving users a code that they can use to authenticate once they go to https://microsoft.com/devicelogin
     *
     * Developers can configure how this message is shown by passing a custom `userPromptCallback`:
     *
     * ```js
     * const credential = new DeviceCodeCredential({
     *   tenantId: env.AZURE_TENANT_ID,
     *   clientId: env.AZURE_CLIENT_ID,
     *   userPromptCallback: (info) => {
     *     console.log("CUSTOMIZED PROMPT CALLBACK", info.message);
     *   }
     * });
     * ```
     *
     * @param options - Options for configuring the client which makes the authentication requests.
     */
    constructor(options) {
        this.msalFlow = new MsalDeviceCode(Object.assign(Object.assign({}, options), { logger: logger$2, userPromptCallback: (options === null || options === void 0 ? void 0 : options.userPromptCallback) || defaultDeviceCodePromptCallback, tokenCredentialOptions: options || {} }));
        this.disableAutomaticAuthentication = options === null || options === void 0 ? void 0 : options.disableAutomaticAuthentication;
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If authentication fails, a {@link CredentialUnavailableError} will be thrown with the details of the failure.
     *
     * If the user provided the option `disableAutomaticAuthentication`,
     * once the token can't be retrieved silently,
     * this method won't attempt to request user interaction to retrieve the token.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                TokenCredential implementation might make.
     */
    async getToken(scopes, options = {}) {
        return tracingClient.withSpan(`${this.constructor.name}.getToken`, options, async (newOptions) => {
            const arrayScopes = Array.isArray(scopes) ? scopes : [scopes];
            return this.msalFlow.getToken(arrayScopes, Object.assign(Object.assign({}, newOptions), { disableAutomaticAuthentication: this.disableAutomaticAuthentication }));
        });
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If authentication fails, a {@link CredentialUnavailableError} will be thrown with the details of the failure.
     *
     * If the token can't be retrieved silently, this method will require user interaction to retrieve the token.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                  TokenCredential implementation might make.
     */
    async authenticate(scopes, options = {}) {
        return tracingClient.withSpan(`${this.constructor.name}.authenticate`, options, async (newOptions) => {
            const arrayScopes = Array.isArray(scopes) ? scopes : [scopes];
            await this.msalFlow.getToken(arrayScopes, newOptions);
            return this.msalFlow.getActiveAccount();
        });
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * This MSAL client sets up a web server to listen for redirect callbacks, then calls to the MSAL's public application's `acquireTokenByDeviceCode` during `doGetToken`
 * to trigger the authentication flow, and then respond based on the values obtained from the redirect callback
 * @internal
 */
class MsalAuthorizationCode extends MsalNode {
    constructor(options) {
        super(options);
        this.logger = credentialLogger("Node.js MSAL Authorization Code");
        this.redirectUri = options.redirectUri;
        this.authorizationCode = options.authorizationCode;
        if (options.clientSecret) {
            this.msalConfig.auth.clientSecret = options.clientSecret;
        }
    }
    async getAuthCodeUrl(options) {
        await this.init();
        return (this.confidentialApp || this.publicApp).getAuthCodeUrl(options);
    }
    async doGetToken(scopes, options) {
        var _a;
        try {
            const result = await ((_a = (this.confidentialApp || this.publicApp)) === null || _a === void 0 ? void 0 : _a.acquireTokenByCode({
                scopes,
                redirectUri: this.redirectUri,
                code: this.authorizationCode,
                correlationId: options === null || options === void 0 ? void 0 : options.correlationId,
                authority: options === null || options === void 0 ? void 0 : options.authority,
                claims: options === null || options === void 0 ? void 0 : options.claims,
            }));
            // The Client Credential flow does not return an account,
            // so each time getToken gets called, we will have to acquire a new token through the service.
            return this.handleResult(scopes, this.clientId, result || undefined);
        }
        catch (err) {
            throw this.handleError(scopes, err, options);
        }
    }
}

// Copyright (c) Microsoft Corporation.
const logger$1 = credentialLogger("AuthorizationCodeCredential");
/**
 * Enables authentication to Azure Active Directory using an authorization code
 * that was obtained through the authorization code flow, described in more detail
 * in the Azure Active Directory documentation:
 *
 * https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow
 */
class AuthorizationCodeCredential {
    /**
     * @hidden
     * @internal
     */
    constructor(tenantId, clientId, clientSecretOrAuthorizationCode, authorizationCodeOrRedirectUri, redirectUriOrOptions, options) {
        checkTenantId(logger$1, tenantId);
        let clientSecret = clientSecretOrAuthorizationCode;
        if (typeof redirectUriOrOptions === "string") {
            // the clientId+clientSecret constructor
            this.authorizationCode = authorizationCodeOrRedirectUri;
            this.redirectUri = redirectUriOrOptions;
            // in this case, options are good as they come
        }
        else {
            // clientId only
            this.authorizationCode = clientSecretOrAuthorizationCode;
            this.redirectUri = authorizationCodeOrRedirectUri;
            clientSecret = undefined;
            options = redirectUriOrOptions;
        }
        this.msalFlow = new MsalAuthorizationCode(Object.assign(Object.assign({}, options), { clientSecret,
            clientId,
            tenantId, tokenCredentialOptions: options || {}, logger: logger$1, redirectUri: this.redirectUri, authorizationCode: this.authorizationCode }));
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If authentication fails, a {@link CredentialUnavailableError} will be thrown with the details of the failure.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure any requests this
     *                TokenCredential implementation might make.
     */
    async getToken(scopes, options = {}) {
        return tracingClient.withSpan(`${this.constructor.name}.getToken`, options, async (newOptions) => {
            const arrayScopes = Array.isArray(scopes) ? scopes : [scopes];
            return this.msalFlow.getToken(arrayScopes, Object.assign(Object.assign({}, newOptions), { disableAutomaticAuthentication: this.disableAutomaticAuthentication }));
        });
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * MSAL on behalf of flow. Calls to MSAL's confidential application's `acquireTokenOnBehalfOf` during `doGetToken`.
 * @internal
 */
class MsalOnBehalfOf extends MsalNode {
    constructor(options) {
        super(options);
        this.logger.info("Initialized MSAL's On-Behalf-Of flow");
        this.requiresConfidential = true;
        this.userAssertionToken = options.userAssertionToken;
        this.certificatePath = options.certificatePath;
        this.sendCertificateChain = options.sendCertificateChain;
        this.clientSecret = options.clientSecret;
    }
    // Changing the MSAL configuration asynchronously
    async init(options) {
        if (this.certificatePath) {
            try {
                const parts = await parseCertificate({ certificatePath: this.certificatePath }, this.sendCertificateChain);
                this.msalConfig.auth.clientCertificate = {
                    thumbprint: parts.thumbprint,
                    privateKey: parts.certificateContents,
                    x5c: parts.x5c,
                };
            }
            catch (error) {
                this.logger.info(formatError("", error));
                throw error;
            }
        }
        else {
            this.msalConfig.auth.clientSecret = this.clientSecret;
        }
        return super.init(options);
    }
    async doGetToken(scopes, options = {}) {
        try {
            const result = await this.confidentialApp.acquireTokenOnBehalfOf({
                scopes,
                correlationId: options.correlationId,
                authority: options.authority,
                claims: options.claims,
                oboAssertion: this.userAssertionToken,
            });
            return this.handleResult(scopes, this.clientId, result || undefined);
        }
        catch (err) {
            throw this.handleError(scopes, err, options);
        }
    }
}

// Copyright (c) Microsoft Corporation.
const credentialName = "OnBehalfOfCredential";
const logger = credentialLogger(credentialName);
/**
 * Enables authentication to Azure Active Directory using the [On Behalf Of flow](https://docs.microsoft.com/azure/active-directory/develop/v2-oauth2-on-behalf-of-flow).
 */
class OnBehalfOfCredential {
    constructor(options) {
        this.options = options;
        const { clientSecret } = options;
        const { certificatePath } = options;
        const { tenantId, clientId, userAssertionToken } = options;
        if (!tenantId || !clientId || !(clientSecret || certificatePath) || !userAssertionToken) {
            throw new Error(`${credentialName}: tenantId, clientId, clientSecret (or certificatePath) and userAssertionToken are required parameters.`);
        }
        this.msalFlow = new MsalOnBehalfOf(Object.assign(Object.assign({}, this.options), { logger, tokenCredentialOptions: this.options }));
    }
    /**
     * Authenticates with Azure Active Directory and returns an access token if successful.
     * If authentication fails, a {@link CredentialUnavailableError} will be thrown with the details of the failure.
     *
     * @param scopes - The list of scopes for which the token will have access.
     * @param options - The options used to configure the underlying network requests.
     */
    async getToken(scopes, options = {}) {
        return tracingClient.withSpan(`${credentialName}.getToken`, options, async (newOptions) => {
            const arrayScopes = Array.isArray(scopes) ? scopes : [scopes];
            return this.msalFlow.getToken(arrayScopes, newOptions);
        });
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * Returns a new instance of the {@link DefaultAzureCredential}.
 */
function getDefaultAzureCredential() {
    return new DefaultAzureCredential();
}

exports.AggregateAuthenticationError = AggregateAuthenticationError;
exports.AggregateAuthenticationErrorName = AggregateAuthenticationErrorName;
exports.AuthenticationError = AuthenticationError;
exports.AuthenticationErrorName = AuthenticationErrorName;
exports.AuthenticationRequiredError = AuthenticationRequiredError;
exports.AuthorizationCodeCredential = AuthorizationCodeCredential;
exports.AzureCliCredential = AzureCliCredential;
exports.AzurePowerShellCredential = AzurePowerShellCredential;
exports.ChainedTokenCredential = ChainedTokenCredential;
exports.ClientAssertionCredential = ClientAssertionCredential;
exports.ClientCertificateCredential = ClientCertificateCredential;
exports.ClientSecretCredential = ClientSecretCredential;
exports.CredentialUnavailableError = CredentialUnavailableError;
exports.CredentialUnavailableErrorName = CredentialUnavailableErrorName;
exports.DefaultAzureCredential = DefaultAzureCredential;
exports.DeviceCodeCredential = DeviceCodeCredential;
exports.EnvironmentCredential = EnvironmentCredential;
exports.InteractiveBrowserCredential = InteractiveBrowserCredential;
exports.ManagedIdentityCredential = ManagedIdentityCredential;
exports.OnBehalfOfCredential = OnBehalfOfCredential;
exports.UsernamePasswordCredential = UsernamePasswordCredential;
exports.VisualStudioCodeCredential = VisualStudioCodeCredential;
exports.deserializeAuthenticationRecord = deserializeAuthenticationRecord;
exports.getDefaultAzureCredential = getDefaultAzureCredential;
exports.logger = logger$l;
exports.serializeAuthenticationRecord = serializeAuthenticationRecord;
exports.useIdentityPlugin = useIdentityPlugin;
//# sourceMappingURL=index.js.map
The MIT License (MIT)

Copyright (c) 2020 Microsoft

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": "@azure/keyvault-keys",
  "sdk-type": "client",
  "author": "Microsoft Corporation",
  "version": "4.4.0",
  "license": "MIT",
  "description": "Isomorphic client library for Azure KeyVault's keys.",
  "homepage": "https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/keyvault/keyvault-keys/README.md",
  "repository": "github:Azure/azure-sdk-for-js",
  "main": "./dist/index.js",
  "module": "dist-esm/keyvault-keys/src/index.js",
  "types": "./types/keyvault-keys.d.ts",
  "engines": {
    "node": ">=12.0.0"
  },
  "files": [
    "types/keyvault-keys.d.ts",
    "dist/",
    "dist-esm/keyvault-keys/src",
    "dist-esm/keyvault-common/src",
    "README.md",
    "LICENSE"
  ],
  "browser": {
    "os": false,
    "process": false,
    "./dist-esm/keyvault-keys/src/cryptography/crypto.js": "./dist-esm/keyvault-keys/src/cryptography/crypto.browser.js",
    "./dist-esm/keyvault-keys/src/cryptography/rsaCryptographyProvider.js": "./dist-esm/keyvault-keys/src/cryptography/rsaCryptographyProvider.browser.js",
    "./dist-esm/keyvault-keys/src/cryptography/aesCryptographyProvider.js": "./dist-esm/keyvault-keys/src/cryptography/aesCryptographyProvider.browser.js",
    "./dist-esm/keyvault-keys/test/utils/base64url.js": "./dist-esm/keyvault-keys/test/utils/base64url.browser.js"
  },
  "sideEffects": false,
  "//metadata": {
    "constantPaths": [
      {
        "path": "src/generated/keyVaultClientContext.ts",
        "prefix": "packageVersion"
      },
      {
        "path": "src/constants.ts",
        "prefix": "SDK_VERSION"
      },
      {
        "path": "swagger/README.md",
        "prefix": "package-version"
      }
    ]
  },
  "//sampleConfiguration": {
    "productName": "Azure Key Vault Keys",
    "productSlugs": [
      "azure",
      "azure-key-vault"
    ],
    "requiredResources": {
      "Azure Key Vault": "https://docs.microsoft.com/azure/key-vault/quick-create-portal"
    },
    "customSnippets": {
      "prerequisites": "samples-dev/snippets/_prerequisites.md"
    }
  },
  "dependencies": {
    "@azure/abort-controller": "^1.0.0",
    "@azure/core-http": "^2.0.0",
    "@azure/core-lro": "^2.2.0",
    "@azure/core-paging": "^1.1.1",
    "@azure/core-tracing": "1.0.0-preview.13",
    "@azure/logger": "^1.0.0",
    "tslib": "^2.2.0"
  },
  "devDependencies": {
    "@azure/dev-tool": "^1.0.0",
    "@azure/eslint-plugin-azure-sdk": "^3.0.0",
    "@azure/identity": "^2.0.1",
    "@azure/test-utils": "^1.0.0",
    "@azure-tools/test-recorder": "^1.0.0",
    "@microsoft/api-extractor": "^7.18.11",
    "@types/mocha": "^7.0.2",
    "@types/node": "^12.0.0",
    "@types/sinon": "^9.0.4",
    "cross-env": "^7.0.2",
    "dayjs": "^1.10.7",
    "dotenv": "^8.2.0",
    "eslint": "^7.15.0",
    "esm": "^3.2.18",
    "karma": "^6.2.0",
    "karma-chrome-launcher": "^3.0.0",
    "karma-coverage": "^2.0.0",
    "karma-edge-launcher": "^0.4.2",
    "karma-env-preprocessor": "^0.1.1",
    "karma-firefox-launcher": "^1.1.0",
    "karma-ie-launcher": "^1.0.0",
    "karma-json-preprocessor": "^0.3.3",
    "karma-json-to-file-reporter": "^1.0.1",
    "karma-junit-reporter": "^2.0.1",
    "karma-mocha": "^2.0.1",
    "karma-mocha-reporter": "^2.2.5",
    "karma-sourcemap-loader": "^0.3.8",
    "mocha": "^7.1.1",
    "mocha-junit-reporter": "^2.0.0",
    "nyc": "^15.0.0",
    "prettier": "^2.5.1",
    "puppeteer": "^13.5.1",
    "rimraf": "^3.0.0",
    "sinon": "^9.0.2",
    "source-map-support": "^0.5.9",
    "typescript": "~4.2.0",
    "url": "^0.11.0"
  }
}// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export const SDK_VERSION = "4.4.0";
//# sourceMappingURL=constants.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { KnownKeyOperations, } from "./keysModels";
import { RemoteCryptographyProvider } from "./cryptography/remoteCryptographyProvider";
import { randomBytes } from "./cryptography/crypto";
import { RsaCryptographyProvider } from "./cryptography/rsaCryptographyProvider";
import { AesCryptographyProvider } from "./cryptography/aesCryptographyProvider";
import { createTraceFunction } from "../../keyvault-common/src";
const withTrace = createTraceFunction("Azure.KeyVault.Keys.CryptographyClient");
/**
 * A client used to perform cryptographic operations on an Azure Key vault key
 * or a local {@link JsonWebKey}.
 */
export class CryptographyClient {
    /**
     * Internal constructor implementation for either local or Key Vault backed keys.
     * @param key - The key to use during cryptography tasks.
     * @param credential - Teh credential to use when constructing a Key Vault Cryptography client.
     */
    constructor(key, credential, pipelineOptions = {}) {
        if (typeof key === "string") {
            // Key URL for remote-local operations.
            this.key = {
                kind: "identifier",
                value: key,
            };
            this.remoteProvider = new RemoteCryptographyProvider(key, credential, pipelineOptions);
        }
        else if ("name" in key) {
            // KeyVault key for remote-local operations.
            this.key = {
                kind: "KeyVaultKey",
                value: key,
            };
            this.remoteProvider = new RemoteCryptographyProvider(key, credential, pipelineOptions);
        }
        else {
            // JsonWebKey for local-only operations.
            this.key = {
                kind: "JsonWebKey",
                value: key,
            };
        }
    }
    /**
     * The base URL to the vault. If a local {@link JsonWebKey} is used vaultUrl will be empty.
     */
    get vaultUrl() {
        var _a;
        return ((_a = this.remoteProvider) === null || _a === void 0 ? void 0 : _a.vaultUrl) || "";
    }
    /**
     * The ID of the key used to perform cryptographic operations for the client.
     */
    get keyID() {
        if (this.key.kind === "identifier") {
            return this.key.value;
        }
        else if (this.key.kind === "KeyVaultKey") {
            return this.key.value.id;
        }
        else {
            return this.key.value.kid;
        }
    }
    encrypt(...args) {
        const [parameters, options] = this.disambiguateEncryptArguments(args);
        return withTrace("encrypt", options, async (updatedOptions) => {
            this.ensureValid(await this.fetchKey(updatedOptions), KnownKeyOperations.Encrypt);
            this.initializeIV(parameters);
            const provider = await this.getProvider("encrypt", parameters.algorithm, updatedOptions);
            try {
                return provider.encrypt(parameters, updatedOptions);
            }
            catch (error) {
                if (this.remoteProvider) {
                    return this.remoteProvider.encrypt(parameters, updatedOptions);
                }
                throw error;
            }
        });
    }
    initializeIV(parameters) {
        // For AES-GCM the service **must** generate the IV, so we only populate it for AES-CBC
        const algorithmsRequiringIV = [
            "A128CBC",
            "A128CBCPAD",
            "A192CBC",
            "A192CBCPAD",
            "A256CBC",
            "A256CBCPAD",
        ];
        if (parameters.algorithm in algorithmsRequiringIV) {
            try {
                const cbcParams = parameters;
                if (!cbcParams.iv) {
                    cbcParams.iv = randomBytes(16);
                }
            }
            catch (e) {
                throw new Error(`Unable to initialize IV for algorithm ${parameters.algorithm}. You may pass a valid IV to avoid this error. Error: ${e.message}`);
            }
        }
    }
    /**
     * Standardizes the arguments of multiple overloads into a single shape.
     * @param args - The encrypt arguments
     */
    disambiguateEncryptArguments(args) {
        if (typeof args[0] === "string") {
            // Sample shape: ["RSA1_5", buffer, options]
            return [
                {
                    algorithm: args[0],
                    plaintext: args[1],
                },
                args[2] || {},
            ];
        }
        else {
            // Sample shape: [{ algorithm: "RSA1_5", plaintext: buffer }, options]
            return [args[0], (args[1] || {})];
        }
    }
    decrypt(...args) {
        const [parameters, options] = this.disambiguateDecryptArguments(args);
        return withTrace("decrypt", options, async (updatedOptions) => {
            this.ensureValid(await this.fetchKey(updatedOptions), KnownKeyOperations.Decrypt);
            const provider = await this.getProvider("decrypt", parameters.algorithm, updatedOptions);
            try {
                return provider.decrypt(parameters, updatedOptions);
            }
            catch (error) {
                if (this.remoteProvider) {
                    return this.remoteProvider.decrypt(parameters, updatedOptions);
                }
                throw error;
            }
        });
    }
    /**
     * Standardizes the arguments of multiple overloads into a single shape.
     * @param args - The decrypt arguments
     */
    disambiguateDecryptArguments(args) {
        if (typeof args[0] === "string") {
            // Sample shape: ["RSA1_5", encryptedBuffer, options]
            return [
                {
                    algorithm: args[0],
                    ciphertext: args[1],
                },
                args[2] || {},
            ];
        }
        else {
            // Sample shape: [{ algorithm: "RSA1_5", ciphertext: encryptedBuffer }, options]
            return [args[0], (args[1] || {})];
        }
    }
    /**
     * Wraps the given key using the specified cryptography algorithm
     *
     * Example usage:
     * ```ts
     * let client = new CryptographyClient(keyVaultKey, credentials);
     * let result = await client.wrapKey("RSA1_5", keyToWrap);
     * ```
     * @param algorithm - The encryption algorithm to use to wrap the given key.
     * @param key - The key to wrap.
     * @param options - Additional options.
     */
    wrapKey(algorithm, key, options = {}) {
        return withTrace("wrapKey", options, async (updatedOptions) => {
            this.ensureValid(await this.fetchKey(updatedOptions), KnownKeyOperations.WrapKey);
            const provider = await this.getProvider("wrapKey", algorithm, updatedOptions);
            try {
                return provider.wrapKey(algorithm, key, updatedOptions);
            }
            catch (err) {
                if (this.remoteProvider) {
                    return this.remoteProvider.wrapKey(algorithm, key, options);
                }
                throw err;
            }
        });
    }
    /**
     * Unwraps the given wrapped key using the specified cryptography algorithm
     *
     * Example usage:
     * ```ts
     * let client = new CryptographyClient(keyVaultKey, credentials);
     * let result = await client.unwrapKey("RSA1_5", keyToUnwrap);
     * ```
     * @param algorithm - The decryption algorithm to use to unwrap the key.
     * @param encryptedKey - The encrypted key to unwrap.
     * @param options - Additional options.
     */
    unwrapKey(algorithm, encryptedKey, options = {}) {
        return withTrace("unwrapKey", options, async (updatedOptions) => {
            this.ensureValid(await this.fetchKey(updatedOptions), KnownKeyOperations.UnwrapKey);
            const provider = await this.getProvider("unwrapKey", algorithm, updatedOptions);
            try {
                return provider.unwrapKey(algorithm, encryptedKey, updatedOptions);
            }
            catch (err) {
                if (this.remoteProvider) {
                    return this.remoteProvider.unwrapKey(algorithm, encryptedKey, options);
                }
                throw err;
            }
        });
    }
    /**
     * Cryptographically sign the digest of a message
     *
     * Example usage:
     * ```ts
     * let client = new CryptographyClient(keyVaultKey, credentials);
     * let result = await client.sign("RS256", digest);
     * ```
     * @param algorithm - The signing algorithm to use.
     * @param digest - The digest of the data to sign.
     * @param options - Additional options.
     */
    sign(algorithm, digest, options = {}) {
        return withTrace("sign", options, async (updatedOptions) => {
            this.ensureValid(await this.fetchKey(updatedOptions), KnownKeyOperations.Sign);
            const provider = await this.getProvider("sign", algorithm, updatedOptions);
            try {
                return provider.sign(algorithm, digest, updatedOptions);
            }
            catch (err) {
                if (this.remoteProvider) {
                    return this.remoteProvider.sign(algorithm, digest, updatedOptions);
                }
                throw err;
            }
        });
    }
    /**
     * Verify the signed message digest
     *
     * Example usage:
     * ```ts
     * let client = new CryptographyClient(keyVaultKey, credentials);
     * let result = await client.verify("RS256", signedDigest, signature);
     * ```
     * @param algorithm - The signing algorithm to use to verify with.
     * @param digest - The digest to verify.
     * @param signature - The signature to verify the digest against.
     * @param options - Additional options.
     */
    verify(algorithm, digest, signature, options = {}) {
        return withTrace("verify", options, async (updatedOptions) => {
            this.ensureValid(await this.fetchKey(updatedOptions), KnownKeyOperations.Verify);
            const provider = await this.getProvider("verify", algorithm, updatedOptions);
            try {
                return provider.verify(algorithm, digest, signature, updatedOptions);
            }
            catch (err) {
                if (this.remoteProvider) {
                    return this.remoteProvider.verify(algorithm, digest, signature, updatedOptions);
                }
                throw err;
            }
        });
    }
    /**
     * Cryptographically sign a block of data
     *
     * Example usage:
     * ```ts
     * let client = new CryptographyClient(keyVaultKey, credentials);
     * let result = await client.signData("RS256", message);
     * ```
     * @param algorithm - The signing algorithm to use.
     * @param data - The data to sign.
     * @param options - Additional options.
     */
    signData(algorithm, data, options = {}) {
        return withTrace("signData", options, async (updatedOptions) => {
            this.ensureValid(await this.fetchKey(updatedOptions), KnownKeyOperations.Sign);
            const provider = await this.getProvider("signData", algorithm, updatedOptions);
            try {
                return provider.signData(algorithm, data, updatedOptions);
            }
            catch (err) {
                if (this.remoteProvider) {
                    return this.remoteProvider.signData(algorithm, data, options);
                }
                throw err;
            }
        });
    }
    /**
     * Verify the signed block of data
     *
     * Example usage:
     * ```ts
     * let client = new CryptographyClient(keyVaultKey, credentials);
     * let result = await client.verifyData("RS256", signedMessage, signature);
     * ```
     * @param algorithm - The algorithm to use to verify with.
     * @param data - The signed block of data to verify.
     * @param signature - The signature to verify the block against.
     * @param options - Additional options.
     */
    verifyData(algorithm, data, signature, options = {}) {
        return withTrace("verifyData", options, async (updatedOptions) => {
            this.ensureValid(await this.fetchKey(updatedOptions), KnownKeyOperations.Verify);
            const provider = await this.getProvider("verifyData", algorithm, updatedOptions);
            try {
                return provider.verifyData(algorithm, data, signature, updatedOptions);
            }
            catch (err) {
                if (this.remoteProvider) {
                    return this.remoteProvider.verifyData(algorithm, data, signature, updatedOptions);
                }
                throw err;
            }
        });
    }
    /**
     * Retrieves the {@link JsonWebKey} from the Key Vault.
     *
     * Example usage:
     * ```ts
     * let client = new CryptographyClient(keyVaultKey, credentials);
     * let result = await client.getKeyMaterial();
     * ```
     */
    async getKeyMaterial(options) {
        const key = await this.fetchKey(options);
        switch (key.kind) {
            case "JsonWebKey":
                return key.value;
            case "KeyVaultKey":
                return key.value.key;
            default:
                throw new Error("Failed to exchange Key ID for an actual KeyVault Key.");
        }
    }
    /**
     * Returns the underlying key used for cryptographic operations.
     * If needed, fetches the key from KeyVault and exchanges the ID for the actual key.
     * @param options - The additional options.
     */
    async fetchKey(options) {
        if (this.key.kind === "identifier") {
            // Exchange the identifier with the actual key when needed
            const key = await this.remoteProvider.getKey(options);
            this.key = { kind: "KeyVaultKey", value: key };
        }
        return this.key;
    }
    /**
     * Gets the provider that support this algorithm and operation.
     * The available providers are ordered by priority such that the first provider that supports this
     * operation is the one we should use.
     * @param operation - The {@link KeyOperation}.
     * @param algorithm - The algorithm to use.
     */
    async getProvider(operation, algorithm, options) {
        if (!this.providers) {
            const keyMaterial = await this.getKeyMaterial(options);
            // Add local crypto providers as needed
            this.providers = [
                new RsaCryptographyProvider(keyMaterial),
                new AesCryptographyProvider(keyMaterial),
            ];
            // If the remote provider exists, we're in hybrid-mode. Otherwise we're in local-only mode.
            // If we're in hybrid mode the remote provider is used as a catch-all and should be last in the list.
            if (this.remoteProvider) {
                this.providers.push(this.remoteProvider);
            }
        }
        const providers = this.providers.filter((p) => p.isSupported(algorithm, operation));
        if (providers.length === 0) {
            throw new Error(`Unable to support operation: "${operation}" with algorithm: "${algorithm}" ${this.key.kind === "JsonWebKey" ? "using a local JsonWebKey" : ""}`);
        }
        // Return the first provider that supports this request
        return providers[0];
    }
    ensureValid(key, operation) {
        var _a;
        if (key.kind === "KeyVaultKey") {
            const keyOps = key.value.keyOperations;
            const { notBefore, expiresOn } = key.value.properties;
            const now = new Date();
            // Check KeyVault Key Expiration
            if (notBefore && now < notBefore) {
                throw new Error(`Key ${key.value.id} can't be used before ${notBefore.toISOString()}`);
            }
            if (expiresOn && now > expiresOn) {
                throw new Error(`Key ${key.value.id} expired at ${expiresOn.toISOString()}`);
            }
            // Check Key operations
            if (operation && keyOps && !(keyOps === null || keyOps === void 0 ? void 0 : keyOps.includes(operation))) {
                throw new Error(`Operation ${operation} is not supported on key ${key.value.id}`);
            }
        }
        else if (key.kind === "JsonWebKey") {
            // Check JsonWebKey Key operations
            if (operation && key.value.keyOps && !((_a = key.value.keyOps) === null || _a === void 0 ? void 0 : _a.includes(operation))) {
                throw new Error(`Operation ${operation} is not supported on key ${key.value.kid}`);
            }
        }
    }
}
//# sourceMappingURL=cryptographyClient.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { KnownJsonWebKeyCurveName as KnownKeyCurveNames, KnownJsonWebKeySignatureAlgorithm as KnownSignatureAlgorithms, } from "./generated/models";
export { KnownKeyCurveNames, KnownSignatureAlgorithms, };
/** Known values of {@link EncryptionAlgorithm} that the service accepts. */
export var KnownEncryptionAlgorithms;
(function (KnownEncryptionAlgorithms) {
    /** Encryption Algorithm - RSA-OAEP */
    KnownEncryptionAlgorithms["RSAOaep"] = "RSA-OAEP";
    /** Encryption Algorithm - RSA-OAEP-256 */
    KnownEncryptionAlgorithms["RSAOaep256"] = "RSA-OAEP-256";
    /** Encryption Algorithm - RSA1_5 */
    KnownEncryptionAlgorithms["RSA15"] = "RSA1_5";
    /** Encryption Algorithm - A128GCM */
    KnownEncryptionAlgorithms["A128GCM"] = "A128GCM";
    /** Encryption Algorithm - A192GCM */
    KnownEncryptionAlgorithms["A192GCM"] = "A192GCM";
    /** Encryption Algorithm - A256GCM */
    KnownEncryptionAlgorithms["A256GCM"] = "A256GCM";
    /** Encryption Algorithm - A128KW */
    KnownEncryptionAlgorithms["A128KW"] = "A128KW";
    /** Encryption Algorithm - A192KW */
    KnownEncryptionAlgorithms["A192KW"] = "A192KW";
    /** Encryption Algorithm - A256KW */
    KnownEncryptionAlgorithms["A256KW"] = "A256KW";
    /** Encryption Algorithm - A128CBC */
    KnownEncryptionAlgorithms["A128CBC"] = "A128CBC";
    /** Encryption Algorithm - A192CBC */
    KnownEncryptionAlgorithms["A192CBC"] = "A192CBC";
    /** Encryption Algorithm - A256CBC */
    KnownEncryptionAlgorithms["A256CBC"] = "A256CBC";
    /** Encryption Algorithm - A128CBCPAD */
    KnownEncryptionAlgorithms["A128Cbcpad"] = "A128CBCPAD";
    /** Encryption Algorithm - A192CBCPAD */
    KnownEncryptionAlgorithms["A192Cbcpad"] = "A192CBCPAD";
    /** Encryption Algorithm - A256CBCPAD */
    KnownEncryptionAlgorithms["A256Cbcpad"] = "A256CBCPAD";
})(KnownEncryptionAlgorithms || (KnownEncryptionAlgorithms = {}));
//# sourceMappingURL=cryptographyClientModels.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { parseKeyvaultIdentifier } from "../../keyvault-common/src";
/**
 * Parses the given Key Vault Key Id. An example is:
 *
 *   https://<keyvault-name>.vault.azure.net/keys/<key-name>/<unique-version-id>
 *
 * On parsing the above Id, this function returns:
 *```ts
 *   {
 *      sourceId: "https://<keyvault-name>.vault.azure.net/keys/<key-name>/<unique-version-id>",
 *      vaultUrl: "https://<keyvault-name>.vault.azure.net",
 *      version: "<unique-version-id>",
 *      name: "<key-name>"
 *   }
 *```
 * @param id - The Id of the Key Vault Key.
 */
export function parseKeyVaultKeyIdentifier(id) {
    const urlParts = id.split("/");
    const collection = urlParts[3];
    return Object.assign({ sourceId: id }, parseKeyvaultIdentifier(collection, id));
}
//# sourceMappingURL=identifier.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/* eslint @typescript-eslint/member-ordering: 0 */
/// <reference lib="esnext.asynciterable" />
import { __asyncGenerator, __asyncValues, __await, __rest } from "tslib";
import { createPipelineFromOptions, isTokenCredential, signingPolicy, } from "@azure/core-http";
import { logger } from "./log";
import "@azure/core-paging";
import { KnownDeletionRecoveryLevel, KnownJsonWebKeyType, } from "./generated/models";
import { KeyVaultClient } from "./generated/keyVaultClient";
import { SDK_VERSION } from "./constants";
import { challengeBasedAuthenticationPolicy } from "../../keyvault-common/src";
import { DeleteKeyPoller } from "./lro/delete/poller";
import { RecoverDeletedKeyPoller } from "./lro/recover/poller";
import { KnownKeyOperations, KnownKeyTypes, KnownKeyExportEncryptionAlgorithm, LATEST_API_VERSION, } from "./keysModels";
import { CryptographyClient } from "./cryptographyClient";
import { KnownKeyCurveNames, KnownEncryptionAlgorithms, KnownSignatureAlgorithms, } from "./cryptographyClientModels";
import { parseKeyVaultKeyIdentifier } from "./identifier";
import { getDeletedKeyFromDeletedKeyItem, getKeyFromKeyBundle, getKeyPropertiesFromKeyItem, keyRotationTransformations, } from "./transformations";
import { createTraceFunction } from "../../keyvault-common/src";
export { CryptographyClient, KnownDeletionRecoveryLevel, KnownKeyCurveNames, KnownKeyExportEncryptionAlgorithm, KnownEncryptionAlgorithms, KnownKeyOperations, KnownKeyTypes, KnownSignatureAlgorithms, parseKeyVaultKeyIdentifier, logger, };
const withTrace = createTraceFunction("Azure.KeyVault.Keys.KeyClient");
/**
 * The KeyClient provides methods to manage {@link KeyVaultKey} in the
 * Azure Key Vault. The client supports creating, retrieving, updating,
 * deleting, purging, backing up, restoring and listing KeyVaultKeys. The
 * client also supports listing {@link DeletedKey} for a soft-delete enabled Azure Key
 * Vault.
 */
export class KeyClient {
    /**
     * Creates an instance of KeyClient.
     *
     * Example usage:
     * ```ts
     * import { KeyClient } from "@azure/keyvault-keys";
     * import { DefaultAzureCredential } from "@azure/identity";
     *
     * let vaultUrl = `https://<MY KEYVAULT HERE>.vault.azure.net`;
     * let credentials = new DefaultAzureCredential();
     *
     * let client = new KeyClient(vaultUrl, credentials);
     * ```
     * @param vaultUrl - the URL of the Key Vault. It should have this shape: `https://${your-key-vault-name}.vault.azure.net`
     * @param credential - An object that implements the `TokenCredential` interface used to authenticate requests to the service. Use the \@azure/identity package to create a credential that suits your needs.
     * @param pipelineOptions - Pipeline options used to configure Key Vault API requests. Omit this parameter to use the default pipeline configuration.
     */
    constructor(vaultUrl, credential, pipelineOptions = {}) {
        this.vaultUrl = vaultUrl;
        const libInfo = `azsdk-js-keyvault-keys/${SDK_VERSION}`;
        const userAgentOptions = pipelineOptions.userAgentOptions;
        pipelineOptions.userAgentOptions = {
            userAgentPrefix: userAgentOptions && userAgentOptions.userAgentPrefix
                ? `${userAgentOptions.userAgentPrefix} ${libInfo}`
                : libInfo,
        };
        const authPolicy = isTokenCredential(credential)
            ? challengeBasedAuthenticationPolicy(credential)
            : signingPolicy(credential);
        const internalPipelineOptions = Object.assign(Object.assign({}, pipelineOptions), { loggingOptions: {
                logger: logger.info,
                allowedHeaderNames: [
                    "x-ms-keyvault-region",
                    "x-ms-keyvault-network-info",
                    "x-ms-keyvault-service-version",
                ],
            } });
        this.credential = credential;
        this.client = new KeyVaultClient(pipelineOptions.serviceVersion || LATEST_API_VERSION, createPipelineFromOptions(internalPipelineOptions, authPolicy));
    }
    /**
     * The create key operation can be used to create any key type in Azure Key Vault. If the named key
     * already exists, Azure Key Vault creates a new version of the key. It requires the keys/create
     * permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(url, credentials);
     * // Create an elliptic-curve key:
     * let result = await client.createKey("MyKey", "EC");
     * ```
     * Creates a new key, stores it, then returns key parameters and properties to the client.
     * @param name - The name of the key.
     * @param keyType - The type of the key. One of the following: 'EC', 'EC-HSM', 'RSA', 'RSA-HSM', 'oct'.
     * @param options - The optional parameters.
     */
    createKey(name, keyType, options) {
        let unflattenedOptions = {};
        if (options) {
            const { enabled, notBefore, expiresOn: expires, exportable } = options, remainingOptions = __rest(options, ["enabled", "notBefore", "expiresOn", "exportable"]);
            unflattenedOptions = Object.assign(Object.assign({}, remainingOptions), { keyAttributes: {
                    enabled,
                    notBefore,
                    expires,
                    exportable,
                } });
        }
        return withTrace("createKey", unflattenedOptions, async (updatedOptions) => {
            const response = await this.client.createKey(this.vaultUrl, name, keyType, updatedOptions);
            return getKeyFromKeyBundle(response);
        });
    }
    /**
     * The createEcKey method creates a new elliptic curve key in Azure Key Vault. If the named key
     * already exists, Azure Key Vault creates a new version of the key. It requires the keys/create
     * permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(url, credentials);
     * let result = await client.createEcKey("MyKey", { curve: "P-256" });
     * ```
     * Creates a new key, stores it, then returns key parameters and properties to the client.
     * @param name - The name of the key.
     * @param options - The optional parameters.
     */
    async createEcKey(name, options) {
        const keyType = (options === null || options === void 0 ? void 0 : options.hsm) ? KnownJsonWebKeyType.ECHSM : KnownJsonWebKeyType.EC;
        return this.createKey(name, keyType, options);
    }
    /**
     * The createRSAKey method creates a new RSA key in Azure Key Vault. If the named key
     * already exists, Azure Key Vault creates a new version of the key. It requires the keys/create
     * permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(url, credentials);
     * let result = await client.createRsaKey("MyKey", { keySize: 2048 });
     * ```
     * Creates a new key, stores it, then returns key parameters and properties to the client.
     * @param name - The name of the key.
     * @param options - The optional parameters.
     */
    async createRsaKey(name, options) {
        const keyType = (options === null || options === void 0 ? void 0 : options.hsm) ? KnownJsonWebKeyType.RSAHSM : KnownJsonWebKeyType.RSA;
        return this.createKey(name, keyType, options);
    }
    /**
     * The createOctKey method creates a new OCT key in Azure Key Vault. If the named key
     * already exists, Azure Key Vault creates a new version of the key. It requires the keys/create
     * permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(url, credentials);
     * let result = await client.createOctKey("MyKey", { hsm: true });
     * ```
     * Creates a new key, stores it, then returns key parameters and properties to the client.
     * @param name - The name of the key.
     * @param options - The optional parameters.
     */
    async createOctKey(name, options) {
        const keyType = (options === null || options === void 0 ? void 0 : options.hsm) ? KnownJsonWebKeyType.OctHSM : KnownJsonWebKeyType.Oct;
        return this.createKey(name, keyType, options);
    }
    /**
     * The import key operation may be used to import any key type into an Azure Key Vault. If the
     * named key already exists, Azure Key Vault creates a new version of the key. This operation
     * requires the keys/import permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(url, credentials);
     * // Key contents in myKeyContents
     * let result = await client.importKey("MyKey", myKeyContents);
     * ```
     * Imports an externally created key, stores it, and returns key parameters and properties
     * to the client.
     * @param name - Name for the imported key.
     * @param key - The JSON web key.
     * @param options - The optional parameters.
     */
    importKey(name, key, options) {
        let unflattenedOptions = {};
        if (options) {
            const { enabled, notBefore, exportable, expiresOn: expires, hardwareProtected: hsm } = options, remainingOptions = __rest(options, ["enabled", "notBefore", "exportable", "expiresOn", "hardwareProtected"]);
            unflattenedOptions = Object.assign(Object.assign({}, remainingOptions), { keyAttributes: {
                    enabled,
                    notBefore,
                    expires,
                    hsm,
                    exportable,
                } });
        }
        return withTrace(`importKey`, unflattenedOptions, async (updatedOptions) => {
            const response = await this.client.importKey(this.vaultUrl, name, key, updatedOptions);
            return getKeyFromKeyBundle(response);
        });
    }
    /**
     * Gets a {@link CryptographyClient} for the given key.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(url, credentials);
     * // get a cryptography client for a given key
     * let cryptographyClient = client.getCryptographyClient("MyKey");
     * ```
     * @param name - The name of the key used to perform cryptographic operations.
     * @param version - Optional version of the key used to perform cryptographic operations.
     * @returns - A {@link CryptographyClient} using the same options, credentials, and http client as this {@link KeyClient}
     */
    getCryptographyClient(keyName, options) {
        const keyUrl = new URL(["keys", keyName, options === null || options === void 0 ? void 0 : options.keyVersion].filter(Boolean).join("/"), this.vaultUrl);
        // The goals of this method are discoverability and performance (by sharing a client and pipeline).
        // The existing cryptography client does not accept a pipeline as an argument, nor does it expose it.
        // In order to avoid publicly exposing the pipeline we will pass in the underlying client as an undocumented
        // property to the constructor so that crypto providers downstream can use it.
        const constructorOptions = {
            generatedClient: this.client,
        };
        const cryptoClient = new CryptographyClient(keyUrl.toString(), this.credential, constructorOptions);
        return cryptoClient;
    }
    /**
     * The delete operation applies to any key stored in Azure Key Vault. Individual versions
     * of a key can not be deleted, only all versions of a given key at once.
     *
     * This function returns a Long Running Operation poller that allows you to wait indefinitely until the key is deleted.
     *
     * This operation requires the keys/delete permission.
     *
     * Example usage:
     * ```ts
     * const client = new KeyClient(url, credentials);
     * await client.createKey("MyKey", "EC");
     * const poller = await client.beginDeleteKey("MyKey");
     *
     * // Serializing the poller
     * const serialized = poller.toString();
     * // A new poller can be created with:
     * // await client.beginDeleteKey("MyKey", { resumeFrom: serialized });
     *
     * // Waiting until it's done
     * const deletedKey = await poller.pollUntilDone();
     * console.log(deletedKey);
     * ```
     * Deletes a key from a specified key vault.
     * @param name - The name of the key.
     * @param options - The optional parameters.
     */
    async beginDeleteKey(name, options = {}) {
        const poller = new DeleteKeyPoller({
            name,
            vaultUrl: this.vaultUrl,
            client: this.client,
            intervalInMs: options.intervalInMs,
            resumeFrom: options.resumeFrom,
            operationOptions: options,
        });
        // This will initialize the poller's operation (the deletion of the key).
        await poller.poll();
        return poller;
    }
    updateKeyProperties(...args) {
        const [name, keyVersion, options] = this.disambiguateUpdateKeyPropertiesArgs(args);
        return withTrace(`updateKeyProperties`, options, async (updatedOptions) => {
            const { enabled, notBefore, expiresOn: expires } = updatedOptions, remainingOptions = __rest(updatedOptions, ["enabled", "notBefore", "expiresOn"]);
            const unflattenedOptions = Object.assign(Object.assign({}, remainingOptions), { keyAttributes: {
                    enabled,
                    notBefore,
                    expires,
                } });
            const response = await this.client.updateKey(this.vaultUrl, name, keyVersion, unflattenedOptions);
            return getKeyFromKeyBundle(response);
        });
    }
    /**
     * Standardizes an overloaded arguments collection for the updateKeyProperties method.
     *
     * @param args - The arguments collection.
     * @returns - The standardized arguments collection.
     */
    disambiguateUpdateKeyPropertiesArgs(args) {
        if (typeof args[1] === "string") {
            // [name, keyVersion, options?] => [name, keyVersion, options || {}]
            return [args[0], args[1], args[2] || {}];
        }
        else {
            // [name, options?] => [name , "", options || {}]
            return [args[0], "", args[1] || {}];
        }
    }
    /**
     * The getKey method gets a specified key and is applicable to any key stored in Azure Key Vault.
     * This operation requires the keys/get permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(url, credentials);
     * let key = await client.getKey("MyKey");
     * ```
     * Get a specified key from a given key vault.
     * @param name - The name of the key.
     * @param options - The optional parameters.
     */
    getKey(name, options = {}) {
        return withTrace(`getKey`, options, async (updatedOptions) => {
            const response = await this.client.getKey(this.vaultUrl, name, options && options.version ? options.version : "", updatedOptions);
            return getKeyFromKeyBundle(response);
        });
    }
    /**
     * The getDeletedKey method returns the specified deleted key along with its properties.
     * This operation requires the keys/get permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(url, credentials);
     * let key = await client.getDeletedKey("MyDeletedKey");
     * ```
     * Gets the specified deleted key.
     * @param name - The name of the key.
     * @param options - The optional parameters.
     */
    getDeletedKey(name, options = {}) {
        return withTrace(`getDeletedKey`, options, async (updatedOptions) => {
            const response = await this.client.getDeletedKey(this.vaultUrl, name, updatedOptions);
            return getKeyFromKeyBundle(response);
        });
    }
    /**
     * The purge deleted key operation removes the key permanently, without the possibility of
     * recovery. This operation can only be enabled on a soft-delete enabled vault. This operation
     * requires the keys/purge permission.
     *
     * Example usage:
     * ```ts
     * const client = new KeyClient(url, credentials);
     * const deletePoller = await client.beginDeleteKey("MyKey")
     * await deletePoller.pollUntilDone();
     * await client.purgeDeletedKey("MyKey");
     * ```
     * Permanently deletes the specified key.
     * @param name - The name of the key.
     * @param options - The optional parameters.
     */
    purgeDeletedKey(name, options = {}) {
        return withTrace(`purgeDeletedKey`, options, async (updatedOptions) => {
            await this.client.purgeDeletedKey(this.vaultUrl, name, updatedOptions);
        });
    }
    /**
     * Recovers the deleted key in the specified vault. This operation can only be performed on a
     * soft-delete enabled vault.
     *
     * This function returns a Long Running Operation poller that allows you to wait indefinitely until the deleted key is recovered.
     *
     * This operation requires the keys/recover permission.
     *
     * Example usage:
     * ```ts
     * const client = new KeyClient(url, credentials);
     * await client.createKey("MyKey", "EC");
     * const deletePoller = await client.beginDeleteKey("MyKey");
     * await deletePoller.pollUntilDone();
     * const poller = await client.beginRecoverDeletedKey("MyKey");
     *
     * // Serializing the poller
     * const serialized = poller.toString();
     * // A new poller can be created with:
     * // await client.beginRecoverDeletedKey("MyKey", { resumeFrom: serialized });
     *
     * // Waiting until it's done
     * const key = await poller.pollUntilDone();
     * console.log(key);
     * ```
     * Recovers the deleted key to the latest version.
     * @param name - The name of the deleted key.
     * @param options - The optional parameters.
     */
    async beginRecoverDeletedKey(name, options = {}) {
        const poller = new RecoverDeletedKeyPoller({
            name,
            vaultUrl: this.vaultUrl,
            client: this.client,
            intervalInMs: options.intervalInMs,
            resumeFrom: options.resumeFrom,
            operationOptions: options,
        });
        // This will initialize the poller's operation (the deletion of the key).
        await poller.poll();
        return poller;
    }
    /**
     * Requests that a backup of the specified key be downloaded to the client. All versions of the
     * key will be downloaded. This operation requires the keys/backup permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(url, credentials);
     * let backupContents = await client.backupKey("MyKey");
     * ```
     * Backs up the specified key.
     * @param name - The name of the key.
     * @param options - The optional parameters.
     */
    backupKey(name, options = {}) {
        return withTrace(`backupKey`, options, async (updatedOptions) => {
            const response = await this.client.backupKey(this.vaultUrl, name, updatedOptions);
            return response.value;
        });
    }
    /**
     * Restores a backed up key, and all its versions, to a vault. This operation requires the
     * keys/restore permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(url, credentials);
     * let backupContents = await client.backupKey("MyKey");
     * // ...
     * let key = await client.restoreKeyBackup(backupContents);
     * ```
     * Restores a backed up key to a vault.
     * @param backup - The backup blob associated with a key bundle.
     * @param options - The optional parameters.
     */
    async restoreKeyBackup(backup, options = {}) {
        return withTrace(`restoreKeyBackup`, options, async (updatedOptions) => {
            const response = await this.client.restoreKey(this.vaultUrl, backup, updatedOptions);
            return getKeyFromKeyBundle(response);
        });
    }
    /**
     * Gets the requested number of bytes containing random values from a managed HSM.
     * This operation requires the managedHsm/rng permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(vaultUrl, credentials);
     * let { bytes } = await client.getRandomBytes(10);
     * ```
     * @param count - The number of bytes to generate between 1 and 128 inclusive.
     * @param options - The optional parameters.
     */
    getRandomBytes(count, options = {}) {
        return withTrace("getRandomBytes", options, async (updatedOptions) => {
            const response = await this.client.getRandomBytes(this.vaultUrl, count, updatedOptions);
            return response.value;
        });
    }
    /**
     * Rotates the key based on the key policy by generating a new version of the key. This operation requires the keys/rotate permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(vaultUrl, credentials);
     * let key = await client.rotateKey("MyKey");
     * ```
     *
     * @param name - The name of the key to rotate.
     * @param options - The optional parameters.
     */
    rotateKey(name, options = {}) {
        return withTrace("rotateKey", options, async (updatedOptions) => {
            const key = await this.client.rotateKey(this.vaultUrl, name, updatedOptions);
            return getKeyFromKeyBundle(key);
        });
    }
    /**
     * Releases a key from a managed HSM.
     *
     * The release key operation is applicable to all key types. The operation requires the key to be marked exportable and the keys/release permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(vaultUrl, credentials);
     * let result = await client.releaseKey("myKey", target)
     * ```
     *
     * @param name - The name of the key.
     * @param targetAttestationToken - The attestation assertion for the target of the key release.
     * @param options - The optional parameters.
     */
    releaseKey(name, targetAttestationToken, options = {}) {
        return withTrace("releaseKey", options, async (updatedOptions) => {
            const { nonce, algorithm } = updatedOptions, rest = __rest(updatedOptions, ["nonce", "algorithm"]);
            const result = await this.client.release(this.vaultUrl, name, (options === null || options === void 0 ? void 0 : options.version) || "", targetAttestationToken, Object.assign({ enc: algorithm, nonce }, rest));
            return { value: result.value };
        });
    }
    /**
     * Gets the rotation policy of a Key Vault Key.
     * By default, all keys have a policy that will notify 30 days before expiry.
     *
     * This operation requires the keys/get permission.
     * Example usage:
     * ```ts
     * let client = new KeyClient(vaultUrl, credentials);
     * let result = await client.getKeyRotationPolicy("myKey");
     * ```
     *
     * @param keyName - The name of the key.
     * @param options - The optional parameters.
     */
    getKeyRotationPolicy(keyName, options = {}) {
        return withTrace("getKeyRotationPolicy", options, async () => {
            const policy = await this.client.getKeyRotationPolicy(this.vaultUrl, keyName);
            return keyRotationTransformations.generatedToPublic(policy);
        });
    }
    /**
     * Updates the rotation policy of a Key Vault Key.
     * This operation requires the keys/update permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(vaultUrl, credentials);
     * const setPolicy = await client.updateKeyRotationPolicy("MyKey", myPolicy);
     * ```
     *
     * @param keyName - The name of the key.
     * @param policyProperties - The {@link KeyRotationPolicyProperties} for the policy.
     * @param options - The optional parameters.
     */
    updateKeyRotationPolicy(keyName, policy, options = {}) {
        return withTrace("updateKeyRotationPolicy", options, async (updatedOptions) => {
            const result = await this.client.updateKeyRotationPolicy(this.vaultUrl, keyName, keyRotationTransformations.propertiesToGenerated(policy), updatedOptions);
            return keyRotationTransformations.generatedToPublic(result);
        });
    }
    /**
     * Deals with the pagination of {@link listPropertiesOfKeyVersions}.
     * @param name - The name of the Key Vault Key.
     * @param continuationState - An object that indicates the position of the paginated request.
     * @param options - Common options for the iterative endpoints.
     */
    listPropertiesOfKeyVersionsPage(name, continuationState, options) {
        return __asyncGenerator(this, arguments, function* listPropertiesOfKeyVersionsPage_1() {
            if (continuationState.continuationToken == null) {
                const optionsComplete = Object.assign({ maxresults: continuationState.maxPageSize }, options);
                const currentSetResponse = yield __await(withTrace("listPropertiesOfKeyVersionsPage", optionsComplete, async (updatedOptions) => this.client.getKeyVersions(this.vaultUrl, name, updatedOptions)));
                continuationState.continuationToken = currentSetResponse.nextLink;
                if (currentSetResponse.value) {
                    yield yield __await(currentSetResponse.value.map(getKeyPropertiesFromKeyItem, this));
                }
            }
            while (continuationState.continuationToken) {
                const currentSetResponse = yield __await(withTrace("listPropertiesOfKeyVersionsPage", options || {}, async (updatedOptions) => this.client.getKeyVersions(continuationState.continuationToken, name, updatedOptions)));
                continuationState.continuationToken = currentSetResponse.nextLink;
                if (currentSetResponse.value) {
                    yield yield __await(currentSetResponse.value.map(getKeyPropertiesFromKeyItem, this));
                }
                else {
                    break;
                }
            }
        });
    }
    /**
     * Deals with the iteration of all the available results of {@link listPropertiesOfKeyVersions}.
     * @param name - The name of the Key Vault Key.
     * @param options - Common options for the iterative endpoints.
     */
    listPropertiesOfKeyVersionsAll(name, options) {
        return __asyncGenerator(this, arguments, function* listPropertiesOfKeyVersionsAll_1() {
            var e_1, _a;
            const f = {};
            try {
                for (var _b = __asyncValues(this.listPropertiesOfKeyVersionsPage(name, f, options)), _c; _c = yield __await(_b.next()), !_c.done;) {
                    const page = _c.value;
                    for (const item of page) {
                        yield yield __await(item);
                    }
                }
            }
            catch (e_1_1) { e_1 = { error: e_1_1 }; }
            finally {
                try {
                    if (_c && !_c.done && (_a = _b.return)) yield __await(_a.call(_b));
                }
                finally { if (e_1) throw e_1.error; }
            }
        });
    }
    /**
     * Iterates all versions of the given key in the vault. The full key identifier, properties, and tags are provided
     * in the response. This operation requires the keys/list permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(url, credentials);
     * for await (const keyProperties of client.listPropertiesOfKeyVersions("MyKey")) {
     *   const key = await client.getKey(keyProperties.name);
     *   console.log("key version: ", key);
     * }
     * ```
     * @param name - Name of the key to fetch versions for
     * @param options - The optional parameters.
     */
    listPropertiesOfKeyVersions(name, options = {}) {
        const iter = this.listPropertiesOfKeyVersionsAll(name, options);
        return {
            next() {
                return iter.next();
            },
            [Symbol.asyncIterator]() {
                return this;
            },
            byPage: (settings = {}) => this.listPropertiesOfKeyVersionsPage(name, settings, options),
        };
    }
    /**
     * Deals with the pagination of {@link listPropertiesOfKeys}.
     * @param continuationState - An object that indicates the position of the paginated request.
     * @param options - Common options for the iterative endpoints.
     */
    listPropertiesOfKeysPage(continuationState, options) {
        return __asyncGenerator(this, arguments, function* listPropertiesOfKeysPage_1() {
            if (continuationState.continuationToken == null) {
                const optionsComplete = Object.assign({ maxresults: continuationState.maxPageSize }, options);
                const currentSetResponse = yield __await(withTrace("listPropertiesOfKeysPage", optionsComplete, async (updatedOptions) => this.client.getKeys(this.vaultUrl, updatedOptions)));
                continuationState.continuationToken = currentSetResponse.nextLink;
                if (currentSetResponse.value) {
                    yield yield __await(currentSetResponse.value.map(getKeyPropertiesFromKeyItem, this));
                }
            }
            while (continuationState.continuationToken) {
                const currentSetResponse = yield __await(withTrace("KeysClient.listPropertiesOfKeysPage", options || {}, async (updatedOptions) => this.client.getKeys(continuationState.continuationToken, updatedOptions)));
                continuationState.continuationToken = currentSetResponse.nextLink;
                if (currentSetResponse.value) {
                    yield yield __await(currentSetResponse.value.map(getKeyPropertiesFromKeyItem, this));
                }
                else {
                    break;
                }
            }
        });
    }
    /**
     * Deals with the iteration of all the available results of {@link listPropertiesOfKeys}.
     * @param options - Common options for the iterative endpoints.
     */
    listPropertiesOfKeysAll(options) {
        return __asyncGenerator(this, arguments, function* listPropertiesOfKeysAll_1() {
            var e_2, _a;
            const f = {};
            try {
                for (var _b = __asyncValues(this.listPropertiesOfKeysPage(f, options)), _c; _c = yield __await(_b.next()), !_c.done;) {
                    const page = _c.value;
                    for (const item of page) {
                        yield yield __await(item);
                    }
                }
            }
            catch (e_2_1) { e_2 = { error: e_2_1 }; }
            finally {
                try {
                    if (_c && !_c.done && (_a = _b.return)) yield __await(_a.call(_b));
                }
                finally { if (e_2) throw e_2.error; }
            }
        });
    }
    /**
     * Iterates the latest version of all keys in the vault.  The full key identifier and properties are provided
     * in the response. No values are returned for the keys. This operations requires the keys/list permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(url, credentials);
     * for await (const keyProperties of client.listPropertiesOfKeys()) {
     *   const key = await client.getKey(keyProperties.name);
     *   console.log("key: ", key);
     * }
     * ```
     * List all keys in the vault
     * @param options - The optional parameters.
     */
    listPropertiesOfKeys(options = {}) {
        const iter = this.listPropertiesOfKeysAll(options);
        return {
            next() {
                return iter.next();
            },
            [Symbol.asyncIterator]() {
                return this;
            },
            byPage: (settings = {}) => this.listPropertiesOfKeysPage(settings, options),
        };
    }
    /**
     * Deals with the pagination of {@link listDeletedKeys}.
     * @param continuationState - An object that indicates the position of the paginated request.
     * @param options - Common options for the iterative endpoints.
     */
    listDeletedKeysPage(continuationState, options) {
        return __asyncGenerator(this, arguments, function* listDeletedKeysPage_1() {
            if (continuationState.continuationToken == null) {
                const optionsComplete = Object.assign({ maxresults: continuationState.maxPageSize }, options);
                const currentSetResponse = yield __await(withTrace("listDeletedKeysPage", optionsComplete, async (updatedOptions) => this.client.getDeletedKeys(this.vaultUrl, updatedOptions)));
                continuationState.continuationToken = currentSetResponse.nextLink;
                if (currentSetResponse.value) {
                    yield yield __await(currentSetResponse.value.map(getDeletedKeyFromDeletedKeyItem, this));
                }
            }
            while (continuationState.continuationToken) {
                const currentSetResponse = yield __await(withTrace("listDeletedKeysPage", options || {}, async (updatedOptions) => this.client.getDeletedKeys(continuationState.continuationToken, updatedOptions)));
                continuationState.continuationToken = currentSetResponse.nextLink;
                if (currentSetResponse.value) {
                    yield yield __await(currentSetResponse.value.map(getDeletedKeyFromDeletedKeyItem, this));
                }
                else {
                    break;
                }
            }
        });
    }
    /**
     * Deals with the iteration of all the available results of {@link listDeletedKeys}.
     * @param options - Common options for the iterative endpoints.
     */
    listDeletedKeysAll(options) {
        return __asyncGenerator(this, arguments, function* listDeletedKeysAll_1() {
            var e_3, _a;
            const f = {};
            try {
                for (var _b = __asyncValues(this.listDeletedKeysPage(f, options)), _c; _c = yield __await(_b.next()), !_c.done;) {
                    const page = _c.value;
                    for (const item of page) {
                        yield yield __await(item);
                    }
                }
            }
            catch (e_3_1) { e_3 = { error: e_3_1 }; }
            finally {
                try {
                    if (_c && !_c.done && (_a = _b.return)) yield __await(_a.call(_b));
                }
                finally { if (e_3) throw e_3.error; }
            }
        });
    }
    /**
     * Iterates the deleted keys in the vault.  The full key identifier and properties are provided
     * in the response. No values are returned for the keys. This operations requires the keys/list permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(url, credentials);
     * for await (const deletedKey of client.listDeletedKeys()) {
     *   console.log("deleted key: ", deletedKey);
     * }
     * ```
     * List all keys in the vault
     * @param options - The optional parameters.
     */
    listDeletedKeys(options = {}) {
        const iter = this.listDeletedKeysAll(options);
        return {
            next() {
                return iter.next();
            },
            [Symbol.asyncIterator]() {
                return this;
            },
            byPage: (settings = {}) => this.listDeletedKeysPage(settings, options),
        };
    }
}
//# sourceMappingURL=index.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { KnownJsonWebKeyType as KnownKeyTypes, } from "./generated/models";
export { KnownKeyTypes };
/**
 * The latest supported Key Vault service API version
 */
export const LATEST_API_VERSION = "7.3";
/** Known values of {@link KeyOperation} that the service accepts. */
export var KnownKeyOperations;
(function (KnownKeyOperations) {
    /** Key operation - encrypt */
    KnownKeyOperations["Encrypt"] = "encrypt";
    /** Key operation - decrypt */
    KnownKeyOperations["Decrypt"] = "decrypt";
    /** Key operation - sign */
    KnownKeyOperations["Sign"] = "sign";
    /** Key operation - verify */
    KnownKeyOperations["Verify"] = "verify";
    /** Key operation - wrapKey */
    KnownKeyOperations["WrapKey"] = "wrapKey";
    /** Key operation - unwrapKey */
    KnownKeyOperations["UnwrapKey"] = "unwrapKey";
    /** Key operation - import */
    KnownKeyOperations["Import"] = "import";
})(KnownKeyOperations || (KnownKeyOperations = {}));
/** Known values of {@link KeyExportEncryptionAlgorithm} that the service accepts. */
export var KnownKeyExportEncryptionAlgorithm;
(function (KnownKeyExportEncryptionAlgorithm) {
    /** CKM_RSA_AES_KEY_WRAP Key Export Encryption Algorithm */
    KnownKeyExportEncryptionAlgorithm["CkmRsaAesKeyWrap"] = "CKM_RSA_AES_KEY_WRAP";
    /** RSA_AES_KEY_WRAP_256 Key Export Encryption Algorithm */
    KnownKeyExportEncryptionAlgorithm["RsaAesKeyWrap256"] = "RSA_AES_KEY_WRAP_256";
    /** RSA_AES_KEY_WRAP_384 Key Export Encryption Algorithm */
    KnownKeyExportEncryptionAlgorithm["RsaAesKeyWrap384"] = "RSA_AES_KEY_WRAP_384";
})(KnownKeyExportEncryptionAlgorithm || (KnownKeyExportEncryptionAlgorithm = {}));
//# sourceMappingURL=keysModels.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createClientLogger } from "@azure/logger";
/**
 * The \@azure/logger configuration for this package.
 */
export const logger = createClientLogger("keyvault-keys");
//# sourceMappingURL=log.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { parseKeyVaultKeyIdentifier } from "./identifier";
/**
 * @internal
 * Shapes the exposed {@link KeyVaultKey} based on either a received key bundle or deleted key bundle.
 */
export function getKeyFromKeyBundle(bundle) {
    const keyBundle = bundle;
    const deletedKeyBundle = bundle;
    const parsedId = parseKeyVaultKeyIdentifier(keyBundle.key.kid);
    const attributes = keyBundle.attributes || {};
    delete keyBundle.attributes;
    const resultObject = {
        key: keyBundle.key,
        id: keyBundle.key ? keyBundle.key.kid : undefined,
        name: parsedId.name,
        keyOperations: keyBundle.key ? keyBundle.key.keyOps : undefined,
        keyType: keyBundle.key ? keyBundle.key.kty : undefined,
        properties: {
            tags: keyBundle.tags,
            enabled: attributes.enabled,
            notBefore: attributes.notBefore,
            expiresOn: attributes.expires,
            createdOn: attributes.created,
            updatedOn: attributes.updated,
            recoverableDays: attributes.recoverableDays,
            recoveryLevel: attributes.recoveryLevel,
            exportable: attributes.exportable,
            releasePolicy: keyBundle.releasePolicy,
            vaultUrl: parsedId.vaultUrl,
            version: parsedId.version,
            name: parsedId.name,
            managed: keyBundle.managed,
            id: keyBundle.key ? keyBundle.key.kid : undefined,
        },
    };
    if (deletedKeyBundle.recoveryId) {
        resultObject.properties.recoveryId = deletedKeyBundle.recoveryId;
        resultObject.properties.scheduledPurgeDate = deletedKeyBundle.scheduledPurgeDate;
        resultObject.properties.deletedOn = deletedKeyBundle.deletedDate;
    }
    return resultObject;
}
/**
 * @internal
 * Shapes the exposed {@link DeletedKey} based on a received KeyItem.
 */
export function getDeletedKeyFromDeletedKeyItem(keyItem) {
    const commonProperties = getKeyPropertiesFromKeyItem(keyItem);
    return {
        key: {
            kid: keyItem.kid,
        },
        id: keyItem.kid,
        name: commonProperties.name,
        properties: Object.assign(Object.assign({}, commonProperties), { recoveryId: keyItem.recoveryId, scheduledPurgeDate: keyItem.scheduledPurgeDate, deletedOn: keyItem.deletedDate }),
    };
}
/**
 * @internal
 * Shapes the exposed {@link KeyProperties} based on a received KeyItem.
 */
export function getKeyPropertiesFromKeyItem(keyItem) {
    const parsedId = parseKeyVaultKeyIdentifier(keyItem.kid);
    const attributes = keyItem.attributes || {};
    const resultObject = {
        createdOn: attributes.created,
        enabled: attributes === null || attributes === void 0 ? void 0 : attributes.enabled,
        expiresOn: attributes === null || attributes === void 0 ? void 0 : attributes.expires,
        id: keyItem.kid,
        managed: keyItem.managed,
        name: parsedId.name,
        notBefore: attributes === null || attributes === void 0 ? void 0 : attributes.notBefore,
        recoverableDays: attributes === null || attributes === void 0 ? void 0 : attributes.recoverableDays,
        recoveryLevel: attributes === null || attributes === void 0 ? void 0 : attributes.recoveryLevel,
        tags: keyItem.tags,
        updatedOn: attributes.updated,
        vaultUrl: parsedId.vaultUrl,
        version: parsedId.version,
    };
    return resultObject;
}
/**
 * @internal
 */
export const keyRotationTransformations = {
    propertiesToGenerated: function (parameters) {
        var _a;
        const policy = {
            attributes: {
                expiryTime: parameters.expiresIn,
            },
            lifetimeActions: (_a = parameters.lifetimeActions) === null || _a === void 0 ? void 0 : _a.map((action) => {
                const generatedAction = {
                    action: { type: action.action },
                    trigger: {},
                };
                if (action.timeAfterCreate) {
                    generatedAction.trigger.timeAfterCreate = action.timeAfterCreate;
                }
                if (action.timeBeforeExpiry) {
                    generatedAction.trigger.timeBeforeExpiry = action.timeBeforeExpiry;
                }
                return generatedAction;
            }),
        };
        return policy;
    },
    generatedToPublic(generated) {
        var _a, _b, _c, _d;
        const policy = {
            id: generated.id,
            createdOn: (_a = generated.attributes) === null || _a === void 0 ? void 0 : _a.created,
            updatedOn: (_b = generated.attributes) === null || _b === void 0 ? void 0 : _b.updated,
            expiresIn: (_c = generated.attributes) === null || _c === void 0 ? void 0 : _c.expiryTime,
            lifetimeActions: (_d = generated.lifetimeActions) === null || _d === void 0 ? void 0 : _d.map((action) => {
                var _a, _b;
                return {
                    action: action.action.type,
                    timeAfterCreate: (_a = action.trigger) === null || _a === void 0 ? void 0 : _a.timeAfterCreate,
                    timeBeforeExpiry: (_b = action.trigger) === null || _b === void 0 ? void 0 : _b.timeBeforeExpiry,
                };
            }),
        };
        return policy;
    },
};
//# sourceMappingURL=transformations.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { delay } from "@azure/core-http";
import { Poller } from "@azure/core-lro";
/**
 * Common properties and methods of the Key Vault Key Pollers.
 */
export class KeyVaultKeyPoller extends Poller {
    constructor() {
        super(...arguments);
        /**
         * Defines how much time the poller is going to wait before making a new request to the service.
         */
        this.intervalInMs = 2000;
    }
    /**
     * The method used by the poller to wait before attempting to update its operation.
     */
    async delay() {
        return delay(this.intervalInMs);
    }
}
/**
 * Common properties and methods of the Key Vault Key Poller operations.
 */
export class KeyVaultKeyPollOperation {
    constructor(state, options = {}) {
        this.state = state;
        this.cancelMessage = "";
        if (options.cancelMessage) {
            this.cancelMessage = options.cancelMessage;
        }
    }
    /**
     * Meant to reach to the service and update the Poller operation.
     */
    async update() {
        throw new Error("Operation not supported.");
    }
    /**
     * Meant to reach to the service and cancel the Poller operation.
     */
    async cancel() {
        throw new Error(this.cancelMessage);
    }
    /**
     * Serializes the Poller operation.
     */
    toString() {
        return JSON.stringify({
            state: this.state,
        });
    }
}
//# sourceMappingURL=keyVaultKeyPoller.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { getKeyFromKeyBundle } from "../../transformations";
import { KeyVaultKeyPollOperation } from "../keyVaultKeyPoller";
import { createTraceFunction } from "../../../../keyvault-common/src";
/**
 * @internal
 */
const withTrace = createTraceFunction("Azure.KeyVault.Keys.RecoverDeletedKeyPoller");
export class RecoverDeletedKeyPollOperation extends KeyVaultKeyPollOperation {
    constructor(state, vaultUrl, client, operationOptions = {}) {
        super(state, { cancelMessage: "Canceling the recovery of a deleted key is not supported." });
        this.state = state;
        this.vaultUrl = vaultUrl;
        this.client = client;
        this.operationOptions = operationOptions;
    }
    /**
     * The getKey method gets a specified key and is applicable to any key stored in Azure Key Vault.
     * This operation requires the keys/get permission.
     */
    getKey(name, options = {}) {
        return withTrace("generatedClient.getKey", options, async (updatedOptions) => {
            const response = await this.client.getKey(this.vaultUrl, name, (updatedOptions === null || updatedOptions === void 0 ? void 0 : updatedOptions.version) || "", updatedOptions);
            return getKeyFromKeyBundle(response);
        });
    }
    /**
     * Sends a request to recover a deleted Key Vault Key based on the given name.
     * Since the Key Vault Key won't be immediately recover the deleted key, we have {@link beginRecoverDeletedKey}.
     */
    async recoverDeletedKey(name, options = {}) {
        return withTrace("generatedClient.recoverDeleteKey", options, async (updatedOptions) => {
            const response = await this.client.recoverDeletedKey(this.vaultUrl, name, updatedOptions);
            return getKeyFromKeyBundle(response);
        });
    }
    /**
     * Reaches to the service and updates the delete key's poll operation.
     */
    async update(options = {}) {
        const state = this.state;
        const { name } = state;
        const operationOptions = this.operationOptions;
        if (options.abortSignal) {
            operationOptions.abortSignal = options.abortSignal;
        }
        if (!state.isStarted) {
            try {
                state.result = await this.getKey(name, operationOptions);
                state.isCompleted = true;
            }
            catch (_a) {
                // Nothing to do here.
            }
            if (!state.isCompleted) {
                state.result = await this.recoverDeletedKey(name, operationOptions);
                state.isStarted = true;
            }
        }
        if (!state.isCompleted) {
            try {
                state.result = await this.getKey(name, operationOptions);
                state.isCompleted = true;
            }
            catch (error) {
                if (error.statusCode === 403) {
                    // At this point, the resource exists but the user doesn't have access to it.
                    state.isCompleted = true;
                }
                else if (error.statusCode !== 404) {
                    state.error = error;
                    state.isCompleted = true;
                    throw error;
                }
            }
        }
        return this;
    }
}
//# sourceMappingURL=operation.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { RecoverDeletedKeyPollOperation } from "./operation";
import { KeyVaultKeyPoller } from "../keyVaultKeyPoller";
/**
 * Class that deletes a poller that waits until a key finishes being deleted
 */
export class RecoverDeletedKeyPoller extends KeyVaultKeyPoller {
    constructor(options) {
        const { vaultUrl, client, name, operationOptions, intervalInMs = 2000, resumeFrom } = options;
        let state;
        if (resumeFrom) {
            state = JSON.parse(resumeFrom).state;
        }
        const operation = new RecoverDeletedKeyPollOperation(Object.assign(Object.assign({}, state), { name }), vaultUrl, client, operationOptions);
        super(operation);
        this.intervalInMs = intervalInMs;
    }
}
//# sourceMappingURL=poller.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { getKeyFromKeyBundle } from "../../transformations";
import { KeyVaultKeyPollOperation } from "../keyVaultKeyPoller";
import { createTraceFunction } from "../../../../keyvault-common/src";
/**
 * @internal
 */
const withTrace = createTraceFunction("Azure.KeyVault.Keys.DeleteKeyPoller");
export class DeleteKeyPollOperation extends KeyVaultKeyPollOperation {
    constructor(state, vaultUrl, client, operationOptions = {}) {
        super(state, { cancelMessage: "Canceling the deletion of a key is not supported." });
        this.state = state;
        this.vaultUrl = vaultUrl;
        this.client = client;
        this.operationOptions = operationOptions;
    }
    /**
     * Sends a delete request for the given Key Vault Key's name to the Key Vault service.
     * Since the Key Vault Key won't be immediately deleted, we have {@link beginDeleteKey}.
     */
    deleteKey(name, options = {}) {
        return withTrace("deleteKey", options, async (updatedOptions) => {
            const response = await this.client.deleteKey(this.vaultUrl, name, updatedOptions);
            return getKeyFromKeyBundle(response);
        });
    }
    /**
     * The getDeletedKey method returns the specified deleted key along with its properties.
     * This operation requires the keys/get permission.
     */
    getDeletedKey(name, options = {}) {
        return withTrace("getDeletedKey", options, async (updatedOptions) => {
            const response = await this.client.getDeletedKey(this.vaultUrl, name, updatedOptions);
            return getKeyFromKeyBundle(response);
        });
    }
    /**
     * Reaches to the service and updates the delete key's poll operation.
     */
    async update(options = {}) {
        const state = this.state;
        const { name } = state;
        if (options.abortSignal) {
            this.operationOptions.abortSignal = options.abortSignal;
        }
        if (!state.isStarted) {
            const deletedKey = await this.deleteKey(name, this.operationOptions);
            state.isStarted = true;
            state.result = deletedKey;
            if (!deletedKey.properties.recoveryId) {
                state.isCompleted = true;
            }
        }
        if (!state.isCompleted) {
            try {
                state.result = await this.getDeletedKey(name, this.operationOptions);
                state.isCompleted = true;
            }
            catch (error) {
                if (error.statusCode === 403) {
                    // At this point, the resource exists but the user doesn't have access to it.
                    state.isCompleted = true;
                }
                else if (error.statusCode !== 404) {
                    state.error = error;
                    state.isCompleted = true;
                    throw error;
                }
            }
        }
        return this;
    }
}
//# sourceMappingURL=operation.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { DeleteKeyPollOperation } from "./operation";
import { KeyVaultKeyPoller } from "../keyVaultKeyPoller";
/**
 * Class that creates a poller that waits until a key finishes being deleted.
 */
export class DeleteKeyPoller extends KeyVaultKeyPoller {
    constructor(options) {
        const { vaultUrl, client, name, operationOptions, intervalInMs = 2000, resumeFrom } = options;
        let state;
        if (resumeFrom) {
            state = JSON.parse(resumeFrom).state;
        }
        const operation = new DeleteKeyPollOperation(Object.assign(Object.assign({}, state), { name }), vaultUrl, client, operationOptions);
        super(operation);
        this.intervalInMs = intervalInMs;
    }
}
//# sourceMappingURL=poller.js.map/*
 * Copyright (c) Microsoft Corporation.
 * Licensed under the MIT License.
 *
 * Code generated by Microsoft (R) AutoRest Code Generator.
 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
 */
export * from "./models";
export { KeyVaultClient } from "./keyVaultClient";
export { KeyVaultClientContext } from "./keyVaultClientContext";
//# sourceMappingURL=index.js.map/*
 * Copyright (c) Microsoft Corporation.
 * Licensed under the MIT License.
 *
 * Code generated by Microsoft (R) AutoRest Code Generator.
 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
 */
import * as coreHttp from "@azure/core-http";
import * as Parameters from "./models/parameters";
import * as Mappers from "./models/mappers";
import { KeyVaultClientContext } from "./keyVaultClientContext";
export class KeyVaultClient extends KeyVaultClientContext {
    /**
     * Initializes a new instance of the KeyVaultClient class.
     * @param apiVersion Api Version
     * @param options The parameter options
     */
    constructor(apiVersion, options) {
        super(apiVersion, options);
    }
    /**
     * The create key operation can be used to create any key type in Azure Key Vault. If the named key
     * already exists, Azure Key Vault creates a new version of the key. It requires the keys/create
     * permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name for the new key. The system will generate the version name for the new key.
     * @param kty The type of key to create. For valid values, see JsonWebKeyType.
     * @param options The options parameters.
     */
    createKey(vaultBaseUrl, keyName, kty, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            kty,
            options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, createKeyOperationSpec);
    }
    /**
     * The operation will rotate the key based on the key policy. It requires the keys/rotate permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of key to be rotated. The system will generate a new version in the
     *                specified key.
     * @param options The options parameters.
     */
    rotateKey(vaultBaseUrl, keyName, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, rotateKeyOperationSpec);
    }
    /**
     * The import key operation may be used to import any key type into an Azure Key Vault. If the named
     * key already exists, Azure Key Vault creates a new version of the key. This operation requires the
     * keys/import permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName Name for the imported key.
     * @param key The Json web key
     * @param options The options parameters.
     */
    importKey(vaultBaseUrl, keyName, key, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            key,
            options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, importKeyOperationSpec);
    }
    /**
     * The delete key operation cannot be used to remove individual versions of a key. This operation
     * removes the cryptographic material associated with the key, which means the key is not usable for
     * Sign/Verify, Wrap/Unwrap or Encrypt/Decrypt operations. This operation requires the keys/delete
     * permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key to delete.
     * @param options The options parameters.
     */
    deleteKey(vaultBaseUrl, keyName, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, deleteKeyOperationSpec);
    }
    /**
     * In order to perform this operation, the key must already exist in the Key Vault. Note: The
     * cryptographic material of a key itself cannot be changed. This operation requires the keys/update
     * permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of key to update.
     * @param keyVersion The version of the key to update.
     * @param options The options parameters.
     */
    updateKey(vaultBaseUrl, keyName, keyVersion, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            keyVersion,
            options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, updateKeyOperationSpec);
    }
    /**
     * The get key operation is applicable to all key types. If the requested key is symmetric, then no key
     * material is released in the response. This operation requires the keys/get permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key to get.
     * @param keyVersion Adding the version parameter retrieves a specific version of a key. This URI
     *                   fragment is optional. If not specified, the latest version of the key is returned.
     * @param options The options parameters.
     */
    getKey(vaultBaseUrl, keyName, keyVersion, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            keyVersion,
            options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, getKeyOperationSpec);
    }
    /**
     * The full key identifier, attributes, and tags are provided in the response. This operation requires
     * the keys/list permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key.
     * @param options The options parameters.
     */
    getKeyVersions(vaultBaseUrl, keyName, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, getKeyVersionsOperationSpec);
    }
    /**
     * Retrieves a list of the keys in the Key Vault as JSON Web Key structures that contain the public
     * part of a stored key. The LIST operation is applicable to all key types, however only the base key
     * identifier, attributes, and tags are provided in the response. Individual versions of a key are not
     * listed in the response. This operation requires the keys/list permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param options The options parameters.
     */
    getKeys(vaultBaseUrl, options) {
        const operationArguments = {
            vaultBaseUrl,
            options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, getKeysOperationSpec);
    }
    /**
     * The Key Backup operation exports a key from Azure Key Vault in a protected form. Note that this
     * operation does NOT return key material in a form that can be used outside the Azure Key Vault
     * system, the returned key material is either protected to a Azure Key Vault HSM or to Azure Key Vault
     * itself. The intent of this operation is to allow a client to GENERATE a key in one Azure Key Vault
     * instance, BACKUP the key, and then RESTORE it into another Azure Key Vault instance. The BACKUP
     * operation may be used to export, in protected form, any key type from Azure Key Vault. Individual
     * versions of a key cannot be backed up. BACKUP / RESTORE can be performed within geographical
     * boundaries only; meaning that a BACKUP from one geographical area cannot be restored to another
     * geographical area. For example, a backup from the US geographical area cannot be restored in an EU
     * geographical area. This operation requires the key/backup permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key.
     * @param options The options parameters.
     */
    backupKey(vaultBaseUrl, keyName, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, backupKeyOperationSpec);
    }
    /**
     * Imports a previously backed up key into Azure Key Vault, restoring the key, its key identifier,
     * attributes and access control policies. The RESTORE operation may be used to import a previously
     * backed up key. Individual versions of a key cannot be restored. The key is restored in its entirety
     * with the same key name as it had when it was backed up. If the key name is not available in the
     * target Key Vault, the RESTORE operation will be rejected. While the key name is retained during
     * restore, the final key identifier will change if the key is restored to a different vault. Restore
     * will restore all versions and preserve version identifiers. The RESTORE operation is subject to
     * security constraints: The target Key Vault must be owned by the same Microsoft Azure Subscription as
     * the source Key Vault The user must have RESTORE permission in the target Key Vault. This operation
     * requires the keys/restore permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyBundleBackup The backup blob associated with a key bundle.
     * @param options The options parameters.
     */
    restoreKey(vaultBaseUrl, keyBundleBackup, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyBundleBackup,
            options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, restoreKeyOperationSpec);
    }
    /**
     * The ENCRYPT operation encrypts an arbitrary sequence of bytes using an encryption key that is stored
     * in Azure Key Vault. Note that the ENCRYPT operation only supports a single block of data, the size
     * of which is dependent on the target key and the encryption algorithm to be used. The ENCRYPT
     * operation is only strictly necessary for symmetric keys stored in Azure Key Vault since protection
     * with an asymmetric key can be performed using public portion of the key. This operation is supported
     * for asymmetric keys as a convenience for callers that have a key-reference but do not have access to
     * the public key material. This operation requires the keys/encrypt permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key.
     * @param keyVersion The version of the key.
     * @param algorithm algorithm identifier
     * @param value
     * @param options The options parameters.
     */
    encrypt(vaultBaseUrl, keyName, keyVersion, algorithm, value, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            keyVersion,
            algorithm,
            value,
            options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, encryptOperationSpec);
    }
    /**
     * The DECRYPT operation decrypts a well-formed block of ciphertext using the target encryption key and
     * specified algorithm. This operation is the reverse of the ENCRYPT operation; only a single block of
     * data may be decrypted, the size of this block is dependent on the target key and the algorithm to be
     * used. The DECRYPT operation applies to asymmetric and symmetric keys stored in Azure Key Vault since
     * it uses the private portion of the key. This operation requires the keys/decrypt permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key.
     * @param keyVersion The version of the key.
     * @param algorithm algorithm identifier
     * @param value
     * @param options The options parameters.
     */
    decrypt(vaultBaseUrl, keyName, keyVersion, algorithm, value, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            keyVersion,
            algorithm,
            value,
            options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, decryptOperationSpec);
    }
    /**
     * The SIGN operation is applicable to asymmetric and symmetric keys stored in Azure Key Vault since
     * this operation uses the private portion of the key. This operation requires the keys/sign
     * permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key.
     * @param keyVersion The version of the key.
     * @param algorithm The signing/verification algorithm identifier. For more information on possible
     *                  algorithm types, see JsonWebKeySignatureAlgorithm.
     * @param value
     * @param options The options parameters.
     */
    sign(vaultBaseUrl, keyName, keyVersion, algorithm, value, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            keyVersion,
            algorithm,
            value,
            options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, signOperationSpec);
    }
    /**
     * The VERIFY operation is applicable to symmetric keys stored in Azure Key Vault. VERIFY is not
     * strictly necessary for asymmetric keys stored in Azure Key Vault since signature verification can be
     * performed using the public portion of the key but this operation is supported as a convenience for
     * callers that only have a key-reference and not the public portion of the key. This operation
     * requires the keys/verify permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key.
     * @param keyVersion The version of the key.
     * @param algorithm The signing/verification algorithm. For more information on possible algorithm
     *                  types, see JsonWebKeySignatureAlgorithm.
     * @param digest The digest used for signing.
     * @param signature The signature to be verified.
     * @param options The options parameters.
     */
    verify(vaultBaseUrl, keyName, keyVersion, algorithm, digest, signature, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            keyVersion,
            algorithm,
            digest,
            signature,
            options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, verifyOperationSpec);
    }
    /**
     * The WRAP operation supports encryption of a symmetric key using a key encryption key that has
     * previously been stored in an Azure Key Vault. The WRAP operation is only strictly necessary for
     * symmetric keys stored in Azure Key Vault since protection with an asymmetric key can be performed
     * using the public portion of the key. This operation is supported for asymmetric keys as a
     * convenience for callers that have a key-reference but do not have access to the public key material.
     * This operation requires the keys/wrapKey permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key.
     * @param keyVersion The version of the key.
     * @param algorithm algorithm identifier
     * @param value
     * @param options The options parameters.
     */
    wrapKey(vaultBaseUrl, keyName, keyVersion, algorithm, value, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            keyVersion,
            algorithm,
            value,
            options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, wrapKeyOperationSpec);
    }
    /**
     * The UNWRAP operation supports decryption of a symmetric key using the target key encryption key.
     * This operation is the reverse of the WRAP operation. The UNWRAP operation applies to asymmetric and
     * symmetric keys stored in Azure Key Vault since it uses the private portion of the key. This
     * operation requires the keys/unwrapKey permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key.
     * @param keyVersion The version of the key.
     * @param algorithm algorithm identifier
     * @param value
     * @param options The options parameters.
     */
    unwrapKey(vaultBaseUrl, keyName, keyVersion, algorithm, value, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            keyVersion,
            algorithm,
            value,
            options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, unwrapKeyOperationSpec);
    }
    /**
     * The release key operation is applicable to all key types. The target key must be marked exportable.
     * This operation requires the keys/release permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key to get.
     * @param keyVersion Adding the version parameter retrieves a specific version of a key.
     * @param targetAttestationToken The attestation assertion for the target of the key release.
     * @param options The options parameters.
     */
    release(vaultBaseUrl, keyName, keyVersion, targetAttestationToken, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            keyVersion,
            targetAttestationToken,
            options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, releaseOperationSpec);
    }
    /**
     * Retrieves a list of the keys in the Key Vault as JSON Web Key structures that contain the public
     * part of a deleted key. This operation includes deletion-specific information. The Get Deleted Keys
     * operation is applicable for vaults enabled for soft-delete. While the operation can be invoked on
     * any vault, it will return an error if invoked on a non soft-delete enabled vault. This operation
     * requires the keys/list permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param options The options parameters.
     */
    getDeletedKeys(vaultBaseUrl, options) {
        const operationArguments = {
            vaultBaseUrl,
            options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, getDeletedKeysOperationSpec);
    }
    /**
     * The Get Deleted Key operation is applicable for soft-delete enabled vaults. While the operation can
     * be invoked on any vault, it will return an error if invoked on a non soft-delete enabled vault. This
     * operation requires the keys/get permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key.
     * @param options The options parameters.
     */
    getDeletedKey(vaultBaseUrl, keyName, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, getDeletedKeyOperationSpec);
    }
    /**
     * The Purge Deleted Key operation is applicable for soft-delete enabled vaults. While the operation
     * can be invoked on any vault, it will return an error if invoked on a non soft-delete enabled vault.
     * This operation requires the keys/purge permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key
     * @param options The options parameters.
     */
    purgeDeletedKey(vaultBaseUrl, keyName, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, purgeDeletedKeyOperationSpec);
    }
    /**
     * The Recover Deleted Key operation is applicable for deleted keys in soft-delete enabled vaults. It
     * recovers the deleted key back to its latest version under /keys. An attempt to recover an
     * non-deleted key will return an error. Consider this the inverse of the delete operation on
     * soft-delete enabled vaults. This operation requires the keys/recover permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the deleted key.
     * @param options The options parameters.
     */
    recoverDeletedKey(vaultBaseUrl, keyName, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, recoverDeletedKeyOperationSpec);
    }
    /**
     * The GetKeyRotationPolicy operation returns the specified key policy resources in the specified key
     * vault. This operation requires the keys/get permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key in a given key vault.
     * @param options The options parameters.
     */
    getKeyRotationPolicy(vaultBaseUrl, keyName, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, getKeyRotationPolicyOperationSpec);
    }
    /**
     * Set specified members in the key policy. Leave others as undefined. This operation requires the
     * keys/update permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key in the given vault.
     * @param keyRotationPolicy The policy for the key.
     * @param options The options parameters.
     */
    updateKeyRotationPolicy(vaultBaseUrl, keyName, keyRotationPolicy, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            keyRotationPolicy,
            options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, updateKeyRotationPolicyOperationSpec);
    }
    /**
     * Get the requested number of bytes containing random values from a managed HSM.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param count The requested number of random bytes.
     * @param options The options parameters.
     */
    getRandomBytes(vaultBaseUrl, count, options) {
        const operationArguments = {
            vaultBaseUrl,
            count,
            options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, getRandomBytesOperationSpec);
    }
    /**
     * GetKeyVersionsNext
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key.
     * @param nextLink The nextLink from the previous successful call to the GetKeyVersions method.
     * @param options The options parameters.
     */
    getKeyVersionsNext(vaultBaseUrl, keyName, nextLink, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            nextLink,
            options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, getKeyVersionsNextOperationSpec);
    }
    /**
     * GetKeysNext
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param nextLink The nextLink from the previous successful call to the GetKeys method.
     * @param options The options parameters.
     */
    getKeysNext(vaultBaseUrl, nextLink, options) {
        const operationArguments = {
            vaultBaseUrl,
            nextLink,
            options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, getKeysNextOperationSpec);
    }
    /**
     * GetDeletedKeysNext
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param nextLink The nextLink from the previous successful call to the GetDeletedKeys method.
     * @param options The options parameters.
     */
    getDeletedKeysNext(vaultBaseUrl, nextLink, options) {
        const operationArguments = {
            vaultBaseUrl,
            nextLink,
            options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, getDeletedKeysNextOperationSpec);
    }
}
// Operation Specifications
const serializer = new coreHttp.Serializer(Mappers, /* isXml */ false);
const createKeyOperationSpec = {
    path: "/keys/{key-name}/create",
    httpMethod: "POST",
    responses: {
        200: {
            bodyMapper: Mappers.KeyBundle
        },
        default: {
            bodyMapper: Mappers.KeyVaultError
        }
    },
    requestBody: {
        parameterPath: {
            kty: ["kty"],
            keySize: ["options", "keySize"],
            publicExponent: ["options", "publicExponent"],
            keyOps: ["options", "keyOps"],
            keyAttributes: ["options", "keyAttributes"],
            tags: ["options", "tags"],
            curve: ["options", "curve"],
            releasePolicy: ["options", "releasePolicy"]
        },
        mapper: Object.assign(Object.assign({}, Mappers.KeyCreateParameters), { required: true })
    },
    queryParameters: [Parameters.apiVersion],
    urlParameters: [Parameters.vaultBaseUrl, Parameters.keyName],
    headerParameters: [Parameters.contentType, Parameters.accept],
    mediaType: "json",
    serializer
};
const rotateKeyOperationSpec = {
    path: "/keys/{key-name}/rotate",
    httpMethod: "POST",
    responses: {
        200: {
            bodyMapper: Mappers.KeyBundle
        },
        default: {
            bodyMapper: Mappers.KeyVaultError
        }
    },
    queryParameters: [Parameters.apiVersion],
    urlParameters: [Parameters.vaultBaseUrl, Parameters.keyName],
    headerParameters: [Parameters.accept],
    serializer
};
const importKeyOperationSpec = {
    path: "/keys/{key-name}",
    httpMethod: "PUT",
    responses: {
        200: {
            bodyMapper: Mappers.KeyBundle
        },
        default: {
            bodyMapper: Mappers.KeyVaultError
        }
    },
    requestBody: {
        parameterPath: {
            hsm: ["options", "hsm"],
            key: ["key"],
            keyAttributes: ["options", "keyAttributes"],
            tags: ["options", "tags"],
            releasePolicy: ["options", "releasePolicy"]
        },
        mapper: Object.assign(Object.assign({}, Mappers.KeyImportParameters), { required: true })
    },
    queryParameters: [Parameters.apiVersion],
    urlParameters: [Parameters.vaultBaseUrl, Parameters.keyName],
    headerParameters: [Parameters.contentType, Parameters.accept],
    mediaType: "json",
    serializer
};
const deleteKeyOperationSpec = {
    path: "/keys/{key-name}",
    httpMethod: "DELETE",
    responses: {
        200: {
            bodyMapper: Mappers.DeletedKeyBundle
        },
        default: {
            bodyMapper: Mappers.KeyVaultError
        }
    },
    queryParameters: [Parameters.apiVersion],
    urlParameters: [Parameters.vaultBaseUrl, Parameters.keyName1],
    headerParameters: [Parameters.accept],
    serializer
};
const updateKeyOperationSpec = {
    path: "/keys/{key-name}/{key-version}",
    httpMethod: "PATCH",
    responses: {
        200: {
            bodyMapper: Mappers.KeyBundle
        },
        default: {
            bodyMapper: Mappers.KeyVaultError
        }
    },
    requestBody: {
        parameterPath: {
            keyOps: ["options", "keyOps"],
            keyAttributes: ["options", "keyAttributes"],
            tags: ["options", "tags"],
            releasePolicy: ["options", "releasePolicy"]
        },
        mapper: Object.assign(Object.assign({}, Mappers.KeyUpdateParameters), { required: true })
    },
    queryParameters: [Parameters.apiVersion],
    urlParameters: [
        Parameters.vaultBaseUrl,
        Parameters.keyName1,
        Parameters.keyVersion
    ],
    headerParameters: [Parameters.contentType, Parameters.accept],
    mediaType: "json",
    serializer
};
const getKeyOperationSpec = {
    path: "/keys/{key-name}/{key-version}",
    httpMethod: "GET",
    responses: {
        200: {
            bodyMapper: Mappers.KeyBundle
        },
        default: {
            bodyMapper: Mappers.KeyVaultError
        }
    },
    queryParameters: [Parameters.apiVersion],
    urlParameters: [
        Parameters.vaultBaseUrl,
        Parameters.keyName1,
        Parameters.keyVersion
    ],
    headerParameters: [Parameters.accept],
    serializer
};
const getKeyVersionsOperationSpec = {
    path: "/keys/{key-name}/versions",
    httpMethod: "GET",
    responses: {
        200: {
            bodyMapper: Mappers.KeyListResult
        },
        default: {
            bodyMapper: Mappers.KeyVaultError
        }
    },
    queryParameters: [Parameters.apiVersion, Parameters.maxresults],
    urlParameters: [Parameters.vaultBaseUrl, Parameters.keyName1],
    headerParameters: [Parameters.accept],
    serializer
};
const getKeysOperationSpec = {
    path: "/keys",
    httpMethod: "GET",
    responses: {
        200: {
            bodyMapper: Mappers.KeyListResult
        },
        default: {
            bodyMapper: Mappers.KeyVaultError
        }
    },
    queryParameters: [Parameters.apiVersion, Parameters.maxresults],
    urlParameters: [Parameters.vaultBaseUrl],
    headerParameters: [Parameters.accept],
    serializer
};
const backupKeyOperationSpec = {
    path: "/keys/{key-name}/backup",
    httpMethod: "POST",
    responses: {
        200: {
            bodyMapper: Mappers.BackupKeyResult
        },
        default: {
            bodyMapper: Mappers.KeyVaultError
        }
    },
    queryParameters: [Parameters.apiVersion],
    urlParameters: [Parameters.vaultBaseUrl, Parameters.keyName1],
    headerParameters: [Parameters.accept],
    serializer
};
const restoreKeyOperationSpec = {
    path: "/keys/restore",
    httpMethod: "POST",
    responses: {
        200: {
            bodyMapper: Mappers.KeyBundle
        },
        default: {
            bodyMapper: Mappers.KeyVaultError
        }
    },
    requestBody: {
        parameterPath: { keyBundleBackup: ["keyBundleBackup"] },
        mapper: Object.assign(Object.assign({}, Mappers.KeyRestoreParameters), { required: true })
    },
    queryParameters: [Parameters.apiVersion],
    urlParameters: [Parameters.vaultBaseUrl],
    headerParameters: [Parameters.contentType, Parameters.accept],
    mediaType: "json",
    serializer
};
const encryptOperationSpec = {
    path: "/keys/{key-name}/{key-version}/encrypt",
    httpMethod: "POST",
    responses: {
        200: {
            bodyMapper: Mappers.KeyOperationResult
        },
        default: {
            bodyMapper: Mappers.KeyVaultError
        }
    },
    requestBody: {
        parameterPath: {
            algorithm: ["algorithm"],
            value: ["value"],
            iv: ["options", "iv"],
            additionalAuthenticatedData: ["options", "additionalAuthenticatedData"],
            authenticationTag: ["options", "authenticationTag"]
        },
        mapper: Object.assign(Object.assign({}, Mappers.KeyOperationsParameters), { required: true })
    },
    queryParameters: [Parameters.apiVersion],
    urlParameters: [
        Parameters.vaultBaseUrl,
        Parameters.keyName1,
        Parameters.keyVersion
    ],
    headerParameters: [Parameters.contentType, Parameters.accept],
    mediaType: "json",
    serializer
};
const decryptOperationSpec = {
    path: "/keys/{key-name}/{key-version}/decrypt",
    httpMethod: "POST",
    responses: {
        200: {
            bodyMapper: Mappers.KeyOperationResult
        },
        default: {
            bodyMapper: Mappers.KeyVaultError
        }
    },
    requestBody: {
        parameterPath: {
            algorithm: ["algorithm"],
            value: ["value"],
            iv: ["options", "iv"],
            additionalAuthenticatedData: ["options", "additionalAuthenticatedData"],
            authenticationTag: ["options", "authenticationTag"]
        },
        mapper: Object.assign(Object.assign({}, Mappers.KeyOperationsParameters), { required: true })
    },
    queryParameters: [Parameters.apiVersion],
    urlParameters: [
        Parameters.vaultBaseUrl,
        Parameters.keyName1,
        Parameters.keyVersion
    ],
    headerParameters: [Parameters.contentType, Parameters.accept],
    mediaType: "json",
    serializer
};
const signOperationSpec = {
    path: "/keys/{key-name}/{key-version}/sign",
    httpMethod: "POST",
    responses: {
        200: {
            bodyMapper: Mappers.KeyOperationResult
        },
        default: {
            bodyMapper: Mappers.KeyVaultError
        }
    },
    requestBody: {
        parameterPath: { algorithm: ["algorithm"], value: ["value"] },
        mapper: Object.assign(Object.assign({}, Mappers.KeySignParameters), { required: true })
    },
    queryParameters: [Parameters.apiVersion],
    urlParameters: [
        Parameters.vaultBaseUrl,
        Parameters.keyName1,
        Parameters.keyVersion
    ],
    headerParameters: [Parameters.contentType, Parameters.accept],
    mediaType: "json",
    serializer
};
const verifyOperationSpec = {
    path: "/keys/{key-name}/{key-version}/verify",
    httpMethod: "POST",
    responses: {
        200: {
            bodyMapper: Mappers.KeyVerifyResult
        },
        default: {
            bodyMapper: Mappers.KeyVaultError
        }
    },
    requestBody: {
        parameterPath: {
            algorithm: ["algorithm"],
            digest: ["digest"],
            signature: ["signature"]
        },
        mapper: Object.assign(Object.assign({}, Mappers.KeyVerifyParameters), { required: true })
    },
    queryParameters: [Parameters.apiVersion],
    urlParameters: [
        Parameters.vaultBaseUrl,
        Parameters.keyName1,
        Parameters.keyVersion
    ],
    headerParameters: [Parameters.contentType, Parameters.accept],
    mediaType: "json",
    serializer
};
const wrapKeyOperationSpec = {
    path: "/keys/{key-name}/{key-version}/wrapkey",
    httpMethod: "POST",
    responses: {
        200: {
            bodyMapper: Mappers.KeyOperationResult
        },
        default: {
            bodyMapper: Mappers.KeyVaultError
        }
    },
    requestBody: {
        parameterPath: {
            algorithm: ["algorithm"],
            value: ["value"],
            iv: ["options", "iv"],
            additionalAuthenticatedData: ["options", "additionalAuthenticatedData"],
            authenticationTag: ["options", "authenticationTag"]
        },
        mapper: Object.assign(Object.assign({}, Mappers.KeyOperationsParameters), { required: true })
    },
    queryParameters: [Parameters.apiVersion],
    urlParameters: [
        Parameters.vaultBaseUrl,
        Parameters.keyName1,
        Parameters.keyVersion
    ],
    headerParameters: [Parameters.contentType, Parameters.accept],
    mediaType: "json",
    serializer
};
const unwrapKeyOperationSpec = {
    path: "/keys/{key-name}/{key-version}/unwrapkey",
    httpMethod: "POST",
    responses: {
        200: {
            bodyMapper: Mappers.KeyOperationResult
        },
        default: {
            bodyMapper: Mappers.KeyVaultError
        }
    },
    requestBody: {
        parameterPath: {
            algorithm: ["algorithm"],
            value: ["value"],
            iv: ["options", "iv"],
            additionalAuthenticatedData: ["options", "additionalAuthenticatedData"],
            authenticationTag: ["options", "authenticationTag"]
        },
        mapper: Object.assign(Object.assign({}, Mappers.KeyOperationsParameters), { required: true })
    },
    queryParameters: [Parameters.apiVersion],
    urlParameters: [
        Parameters.vaultBaseUrl,
        Parameters.keyName1,
        Parameters.keyVersion
    ],
    headerParameters: [Parameters.contentType, Parameters.accept],
    mediaType: "json",
    serializer
};
const releaseOperationSpec = {
    path: "/keys/{key-name}/{key-version}/release",
    httpMethod: "POST",
    responses: {
        200: {
            bodyMapper: Mappers.KeyReleaseResult
        },
        default: {
            bodyMapper: Mappers.KeyVaultError
        }
    },
    requestBody: {
        parameterPath: {
            targetAttestationToken: ["targetAttestationToken"],
            nonce: ["options", "nonce"],
            enc: ["options", "enc"]
        },
        mapper: Object.assign(Object.assign({}, Mappers.KeyReleaseParameters), { required: true })
    },
    queryParameters: [Parameters.apiVersion],
    urlParameters: [
        Parameters.vaultBaseUrl,
        Parameters.keyName1,
        Parameters.keyVersion
    ],
    headerParameters: [Parameters.contentType, Parameters.accept],
    mediaType: "json",
    serializer
};
const getDeletedKeysOperationSpec = {
    path: "/deletedkeys",
    httpMethod: "GET",
    responses: {
        200: {
            bodyMapper: Mappers.DeletedKeyListResult
        },
        default: {
            bodyMapper: Mappers.KeyVaultError
        }
    },
    queryParameters: [Parameters.apiVersion, Parameters.maxresults],
    urlParameters: [Parameters.vaultBaseUrl],
    headerParameters: [Parameters.accept],
    serializer
};
const getDeletedKeyOperationSpec = {
    path: "/deletedkeys/{key-name}",
    httpMethod: "GET",
    responses: {
        200: {
            bodyMapper: Mappers.DeletedKeyBundle
        },
        default: {
            bodyMapper: Mappers.KeyVaultError
        }
    },
    queryParameters: [Parameters.apiVersion],
    urlParameters: [Parameters.vaultBaseUrl, Parameters.keyName1],
    headerParameters: [Parameters.accept],
    serializer
};
const purgeDeletedKeyOperationSpec = {
    path: "/deletedkeys/{key-name}",
    httpMethod: "DELETE",
    responses: {
        204: {},
        default: {
            bodyMapper: Mappers.KeyVaultError
        }
    },
    queryParameters: [Parameters.apiVersion],
    urlParameters: [Parameters.vaultBaseUrl, Parameters.keyName1],
    headerParameters: [Parameters.accept],
    serializer
};
const recoverDeletedKeyOperationSpec = {
    path: "/deletedkeys/{key-name}/recover",
    httpMethod: "POST",
    responses: {
        200: {
            bodyMapper: Mappers.KeyBundle
        },
        default: {
            bodyMapper: Mappers.KeyVaultError
        }
    },
    queryParameters: [Parameters.apiVersion],
    urlParameters: [Parameters.vaultBaseUrl, Parameters.keyName1],
    headerParameters: [Parameters.accept],
    serializer
};
const getKeyRotationPolicyOperationSpec = {
    path: "/keys/{key-name}/rotationpolicy",
    httpMethod: "GET",
    responses: {
        200: {
            bodyMapper: Mappers.KeyRotationPolicy
        },
        default: {
            bodyMapper: Mappers.KeyVaultError
        }
    },
    queryParameters: [Parameters.apiVersion],
    urlParameters: [Parameters.vaultBaseUrl, Parameters.keyName1],
    headerParameters: [Parameters.accept],
    serializer
};
const updateKeyRotationPolicyOperationSpec = {
    path: "/keys/{key-name}/rotationpolicy",
    httpMethod: "PUT",
    responses: {
        200: {
            bodyMapper: Mappers.KeyRotationPolicy
        },
        default: {
            bodyMapper: Mappers.KeyVaultError
        }
    },
    requestBody: Parameters.keyRotationPolicy,
    queryParameters: [Parameters.apiVersion],
    urlParameters: [Parameters.vaultBaseUrl, Parameters.keyName1],
    headerParameters: [Parameters.contentType, Parameters.accept],
    mediaType: "json",
    serializer
};
const getRandomBytesOperationSpec = {
    path: "/rng",
    httpMethod: "POST",
    responses: {
        200: {
            bodyMapper: Mappers.RandomBytes
        },
        default: {
            bodyMapper: Mappers.KeyVaultError
        }
    },
    requestBody: {
        parameterPath: { count: ["count"] },
        mapper: Object.assign(Object.assign({}, Mappers.GetRandomBytesRequest), { required: true })
    },
    queryParameters: [Parameters.apiVersion],
    urlParameters: [Parameters.vaultBaseUrl],
    headerParameters: [Parameters.contentType, Parameters.accept],
    mediaType: "json",
    serializer
};
const getKeyVersionsNextOperationSpec = {
    path: "{nextLink}",
    httpMethod: "GET",
    responses: {
        200: {
            bodyMapper: Mappers.KeyListResult
        },
        default: {
            bodyMapper: Mappers.KeyVaultError
        }
    },
    queryParameters: [Parameters.apiVersion, Parameters.maxresults],
    urlParameters: [
        Parameters.vaultBaseUrl,
        Parameters.keyName1,
        Parameters.nextLink
    ],
    headerParameters: [Parameters.accept],
    serializer
};
const getKeysNextOperationSpec = {
    path: "{nextLink}",
    httpMethod: "GET",
    responses: {
        200: {
            bodyMapper: Mappers.KeyListResult
        },
        default: {
            bodyMapper: Mappers.KeyVaultError
        }
    },
    queryParameters: [Parameters.apiVersion, Parameters.maxresults],
    urlParameters: [Parameters.vaultBaseUrl, Parameters.nextLink],
    headerParameters: [Parameters.accept],
    serializer
};
const getDeletedKeysNextOperationSpec = {
    path: "{nextLink}",
    httpMethod: "GET",
    responses: {
        200: {
            bodyMapper: Mappers.DeletedKeyListResult
        },
        default: {
            bodyMapper: Mappers.KeyVaultError
        }
    },
    queryParameters: [Parameters.apiVersion, Parameters.maxresults],
    urlParameters: [Parameters.vaultBaseUrl, Parameters.nextLink],
    headerParameters: [Parameters.accept],
    serializer
};
//# sourceMappingURL=keyVaultClient.js.map/*
 * Copyright (c) Microsoft Corporation.
 * Licensed under the MIT License.
 *
 * Code generated by Microsoft (R) AutoRest Code Generator.
 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
 */
import * as coreHttp from "@azure/core-http";
const packageName = "@azure/keyvault-keys";
export const packageVersion = "4.4.0";
export class KeyVaultClientContext extends coreHttp.ServiceClient {
    /**
     * Initializes a new instance of the KeyVaultClientContext class.
     * @param apiVersion Api Version
     * @param options The parameter options
     */
    constructor(apiVersion, options) {
        if (apiVersion === undefined) {
            throw new Error("'apiVersion' cannot be null");
        }
        // Initializing default values for options
        if (!options) {
            options = {};
        }
        const defaultUserAgent = `azsdk-js-${packageName.replace(/@.*\//, "")}/${packageVersion} ${coreHttp.getDefaultUserAgentValue()}`;
        super(undefined, Object.assign(Object.assign({}, options), { userAgent: options.userAgent
                ? `${options.userAgent} ${defaultUserAgent}`
                : `${defaultUserAgent}` }));
        this.requestContentType = "application/json; charset=utf-8";
        this.baseUri = options.endpoint || "{vaultBaseUrl}";
        // Parameter assignments
        this.apiVersion = apiVersion;
    }
}
//# sourceMappingURL=keyVaultClientContext.js.map/*
 * Copyright (c) Microsoft Corporation.
 * Licensed under the MIT License.
 *
 * Code generated by Microsoft (R) AutoRest Code Generator.
 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
 */
/** Known values of {@link ApiVersion73} that the service accepts. */
export var KnownApiVersion73;
(function (KnownApiVersion73) {
    /** Api Version '7.3' */
    KnownApiVersion73["Seven3"] = "7.3";
})(KnownApiVersion73 || (KnownApiVersion73 = {}));
/** Known values of {@link JsonWebKeyType} that the service accepts. */
export var KnownJsonWebKeyType;
(function (KnownJsonWebKeyType) {
    /** Elliptic Curve. */
    KnownJsonWebKeyType["EC"] = "EC";
    /** Elliptic Curve with a private key which is stored in the HSM. */
    KnownJsonWebKeyType["ECHSM"] = "EC-HSM";
    /** RSA (https://tools.ietf.org/html/rfc3447) */
    KnownJsonWebKeyType["RSA"] = "RSA";
    /** RSA with a private key which is stored in the HSM. */
    KnownJsonWebKeyType["RSAHSM"] = "RSA-HSM";
    /** Octet sequence (used to represent symmetric keys) */
    KnownJsonWebKeyType["Oct"] = "oct";
    /** Octet sequence (used to represent symmetric keys) which is stored the HSM. */
    KnownJsonWebKeyType["OctHSM"] = "oct-HSM";
})(KnownJsonWebKeyType || (KnownJsonWebKeyType = {}));
/** Known values of {@link JsonWebKeyOperation} that the service accepts. */
export var KnownJsonWebKeyOperation;
(function (KnownJsonWebKeyOperation) {
    KnownJsonWebKeyOperation["Encrypt"] = "encrypt";
    KnownJsonWebKeyOperation["Decrypt"] = "decrypt";
    KnownJsonWebKeyOperation["Sign"] = "sign";
    KnownJsonWebKeyOperation["Verify"] = "verify";
    KnownJsonWebKeyOperation["WrapKey"] = "wrapKey";
    KnownJsonWebKeyOperation["UnwrapKey"] = "unwrapKey";
    KnownJsonWebKeyOperation["Import"] = "import";
    KnownJsonWebKeyOperation["Export"] = "export";
})(KnownJsonWebKeyOperation || (KnownJsonWebKeyOperation = {}));
/** Known values of {@link DeletionRecoveryLevel} that the service accepts. */
export var KnownDeletionRecoveryLevel;
(function (KnownDeletionRecoveryLevel) {
    /** Denotes a vault state in which deletion is an irreversible operation, without the possibility for recovery. This level corresponds to no protection being available against a Delete operation; the data is irretrievably lost upon accepting a Delete operation at the entity level or higher (vault, resource group, subscription etc.) */
    KnownDeletionRecoveryLevel["Purgeable"] = "Purgeable";
    /** Denotes a vault state in which deletion is recoverable, and which also permits immediate and permanent deletion (i.e. purge). This level guarantees the recoverability of the deleted entity during the retention interval (90 days), unless a Purge operation is requested, or the subscription is cancelled. System wil permanently delete it after 90 days, if not recovered */
    KnownDeletionRecoveryLevel["RecoverablePurgeable"] = "Recoverable+Purgeable";
    /** Denotes a vault state in which deletion is recoverable without the possibility for immediate and permanent deletion (i.e. purge). This level guarantees the recoverability of the deleted entity during the retention interval(90 days) and while the subscription is still available. System wil permanently delete it after 90 days, if not recovered */
    KnownDeletionRecoveryLevel["Recoverable"] = "Recoverable";
    /** Denotes a vault and subscription state in which deletion is recoverable within retention interval (90 days), immediate and permanent deletion (i.e. purge) is not permitted, and in which the subscription itself  cannot be permanently canceled. System wil permanently delete it after 90 days, if not recovered */
    KnownDeletionRecoveryLevel["RecoverableProtectedSubscription"] = "Recoverable+ProtectedSubscription";
    /** Denotes a vault state in which deletion is recoverable, and which also permits immediate and permanent deletion (i.e. purge when 7<= SoftDeleteRetentionInDays < 90). This level guarantees the recoverability of the deleted entity during the retention interval, unless a Purge operation is requested, or the subscription is cancelled. */
    KnownDeletionRecoveryLevel["CustomizedRecoverablePurgeable"] = "CustomizedRecoverable+Purgeable";
    /** Denotes a vault state in which deletion is recoverable without the possibility for immediate and permanent deletion (i.e. purge when 7<= SoftDeleteRetentionInDays < 90).This level guarantees the recoverability of the deleted entity during the retention interval and while the subscription is still available. */
    KnownDeletionRecoveryLevel["CustomizedRecoverable"] = "CustomizedRecoverable";
    /** Denotes a vault and subscription state in which deletion is recoverable, immediate and permanent deletion (i.e. purge) is not permitted, and in which the subscription itself cannot be permanently canceled when 7<= SoftDeleteRetentionInDays < 90. This level guarantees the recoverability of the deleted entity during the retention interval, and also reflects the fact that the subscription itself cannot be cancelled. */
    KnownDeletionRecoveryLevel["CustomizedRecoverableProtectedSubscription"] = "CustomizedRecoverable+ProtectedSubscription";
})(KnownDeletionRecoveryLevel || (KnownDeletionRecoveryLevel = {}));
/** Known values of {@link JsonWebKeyCurveName} that the service accepts. */
export var KnownJsonWebKeyCurveName;
(function (KnownJsonWebKeyCurveName) {
    /** The NIST P-256 elliptic curve, AKA SECG curve SECP256R1. */
    KnownJsonWebKeyCurveName["P256"] = "P-256";
    /** The NIST P-384 elliptic curve, AKA SECG curve SECP384R1. */
    KnownJsonWebKeyCurveName["P384"] = "P-384";
    /** The NIST P-521 elliptic curve, AKA SECG curve SECP521R1. */
    KnownJsonWebKeyCurveName["P521"] = "P-521";
    /** The SECG SECP256K1 elliptic curve. */
    KnownJsonWebKeyCurveName["P256K"] = "P-256K";
})(KnownJsonWebKeyCurveName || (KnownJsonWebKeyCurveName = {}));
/** Known values of {@link JsonWebKeyEncryptionAlgorithm} that the service accepts. */
export var KnownJsonWebKeyEncryptionAlgorithm;
(function (KnownJsonWebKeyEncryptionAlgorithm) {
    KnownJsonWebKeyEncryptionAlgorithm["RSAOaep"] = "RSA-OAEP";
    KnownJsonWebKeyEncryptionAlgorithm["RSAOaep256"] = "RSA-OAEP-256";
    KnownJsonWebKeyEncryptionAlgorithm["RSA15"] = "RSA1_5";
    KnownJsonWebKeyEncryptionAlgorithm["A128GCM"] = "A128GCM";
    KnownJsonWebKeyEncryptionAlgorithm["A192GCM"] = "A192GCM";
    KnownJsonWebKeyEncryptionAlgorithm["A256GCM"] = "A256GCM";
    KnownJsonWebKeyEncryptionAlgorithm["A128KW"] = "A128KW";
    KnownJsonWebKeyEncryptionAlgorithm["A192KW"] = "A192KW";
    KnownJsonWebKeyEncryptionAlgorithm["A256KW"] = "A256KW";
    KnownJsonWebKeyEncryptionAlgorithm["A128CBC"] = "A128CBC";
    KnownJsonWebKeyEncryptionAlgorithm["A192CBC"] = "A192CBC";
    KnownJsonWebKeyEncryptionAlgorithm["A256CBC"] = "A256CBC";
    KnownJsonWebKeyEncryptionAlgorithm["A128Cbcpad"] = "A128CBCPAD";
    KnownJsonWebKeyEncryptionAlgorithm["A192Cbcpad"] = "A192CBCPAD";
    KnownJsonWebKeyEncryptionAlgorithm["A256Cbcpad"] = "A256CBCPAD";
})(KnownJsonWebKeyEncryptionAlgorithm || (KnownJsonWebKeyEncryptionAlgorithm = {}));
/** Known values of {@link JsonWebKeySignatureAlgorithm} that the service accepts. */
export var KnownJsonWebKeySignatureAlgorithm;
(function (KnownJsonWebKeySignatureAlgorithm) {
    /** RSASSA-PSS using SHA-256 and MGF1 with SHA-256, as described in https://tools.ietf.org/html/rfc7518 */
    KnownJsonWebKeySignatureAlgorithm["PS256"] = "PS256";
    /** RSASSA-PSS using SHA-384 and MGF1 with SHA-384, as described in https://tools.ietf.org/html/rfc7518 */
    KnownJsonWebKeySignatureAlgorithm["PS384"] = "PS384";
    /** RSASSA-PSS using SHA-512 and MGF1 with SHA-512, as described in https://tools.ietf.org/html/rfc7518 */
    KnownJsonWebKeySignatureAlgorithm["PS512"] = "PS512";
    /** RSASSA-PKCS1-v1_5 using SHA-256, as described in https://tools.ietf.org/html/rfc7518 */
    KnownJsonWebKeySignatureAlgorithm["RS256"] = "RS256";
    /** RSASSA-PKCS1-v1_5 using SHA-384, as described in https://tools.ietf.org/html/rfc7518 */
    KnownJsonWebKeySignatureAlgorithm["RS384"] = "RS384";
    /** RSASSA-PKCS1-v1_5 using SHA-512, as described in https://tools.ietf.org/html/rfc7518 */
    KnownJsonWebKeySignatureAlgorithm["RS512"] = "RS512";
    /** Reserved */
    KnownJsonWebKeySignatureAlgorithm["Rsnull"] = "RSNULL";
    /** ECDSA using P-256 and SHA-256, as described in https://tools.ietf.org/html/rfc7518. */
    KnownJsonWebKeySignatureAlgorithm["ES256"] = "ES256";
    /** ECDSA using P-384 and SHA-384, as described in https://tools.ietf.org/html/rfc7518 */
    KnownJsonWebKeySignatureAlgorithm["ES384"] = "ES384";
    /** ECDSA using P-521 and SHA-512, as described in https://tools.ietf.org/html/rfc7518 */
    KnownJsonWebKeySignatureAlgorithm["ES512"] = "ES512";
    /** ECDSA using P-256K and SHA-256, as described in https://tools.ietf.org/html/rfc7518 */
    KnownJsonWebKeySignatureAlgorithm["ES256K"] = "ES256K";
})(KnownJsonWebKeySignatureAlgorithm || (KnownJsonWebKeySignatureAlgorithm = {}));
/** Known values of {@link KeyEncryptionAlgorithm} that the service accepts. */
export var KnownKeyEncryptionAlgorithm;
(function (KnownKeyEncryptionAlgorithm) {
    KnownKeyEncryptionAlgorithm["CKMRSAAESKEYWrap"] = "CKM_RSA_AES_KEY_WRAP";
    KnownKeyEncryptionAlgorithm["RSAAESKEYWrap256"] = "RSA_AES_KEY_WRAP_256";
    KnownKeyEncryptionAlgorithm["RSAAESKEYWrap384"] = "RSA_AES_KEY_WRAP_384";
})(KnownKeyEncryptionAlgorithm || (KnownKeyEncryptionAlgorithm = {}));
//# sourceMappingURL=index.js.map/*
 * Copyright (c) Microsoft Corporation.
 * Licensed under the MIT License.
 *
 * Code generated by Microsoft (R) AutoRest Code Generator.
 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
 */
export const KeyCreateParameters = {
    type: {
        name: "Composite",
        className: "KeyCreateParameters",
        modelProperties: {
            kty: {
                serializedName: "kty",
                required: true,
                type: {
                    name: "String"
                }
            },
            keySize: {
                serializedName: "key_size",
                type: {
                    name: "Number"
                }
            },
            publicExponent: {
                serializedName: "public_exponent",
                type: {
                    name: "Number"
                }
            },
            keyOps: {
                serializedName: "key_ops",
                type: {
                    name: "Sequence",
                    element: {
                        type: {
                            name: "String"
                        }
                    }
                }
            },
            keyAttributes: {
                serializedName: "attributes",
                type: {
                    name: "Composite",
                    className: "KeyAttributes"
                }
            },
            tags: {
                serializedName: "tags",
                type: {
                    name: "Dictionary",
                    value: { type: { name: "String" } }
                }
            },
            curve: {
                serializedName: "crv",
                type: {
                    name: "String"
                }
            },
            releasePolicy: {
                serializedName: "release_policy",
                type: {
                    name: "Composite",
                    className: "KeyReleasePolicy"
                }
            }
        }
    }
};
export const Attributes = {
    type: {
        name: "Composite",
        className: "Attributes",
        modelProperties: {
            enabled: {
                serializedName: "enabled",
                type: {
                    name: "Boolean"
                }
            },
            notBefore: {
                serializedName: "nbf",
                type: {
                    name: "UnixTime"
                }
            },
            expires: {
                serializedName: "exp",
                type: {
                    name: "UnixTime"
                }
            },
            created: {
                serializedName: "created",
                readOnly: true,
                type: {
                    name: "UnixTime"
                }
            },
            updated: {
                serializedName: "updated",
                readOnly: true,
                type: {
                    name: "UnixTime"
                }
            }
        }
    }
};
export const KeyReleasePolicy = {
    type: {
        name: "Composite",
        className: "KeyReleasePolicy",
        modelProperties: {
            contentType: {
                defaultValue: "application/json; charset=utf-8",
                serializedName: "contentType",
                type: {
                    name: "String"
                }
            },
            immutable: {
                serializedName: "immutable",
                type: {
                    name: "Boolean"
                }
            },
            encodedPolicy: {
                serializedName: "data",
                type: {
                    name: "Base64Url"
                }
            }
        }
    }
};
export const KeyBundle = {
    type: {
        name: "Composite",
        className: "KeyBundle",
        modelProperties: {
            key: {
                serializedName: "key",
                type: {
                    name: "Composite",
                    className: "JsonWebKey"
                }
            },
            attributes: {
                serializedName: "attributes",
                type: {
                    name: "Composite",
                    className: "KeyAttributes"
                }
            },
            tags: {
                serializedName: "tags",
                type: {
                    name: "Dictionary",
                    value: { type: { name: "String" } }
                }
            },
            managed: {
                serializedName: "managed",
                readOnly: true,
                type: {
                    name: "Boolean"
                }
            },
            releasePolicy: {
                serializedName: "release_policy",
                type: {
                    name: "Composite",
                    className: "KeyReleasePolicy"
                }
            }
        }
    }
};
export const JsonWebKey = {
    type: {
        name: "Composite",
        className: "JsonWebKey",
        modelProperties: {
            kid: {
                serializedName: "kid",
                type: {
                    name: "String"
                }
            },
            kty: {
                serializedName: "kty",
                type: {
                    name: "String"
                }
            },
            keyOps: {
                serializedName: "key_ops",
                type: {
                    name: "Sequence",
                    element: {
                        type: {
                            name: "String"
                        }
                    }
                }
            },
            n: {
                serializedName: "n",
                type: {
                    name: "Base64Url"
                }
            },
            e: {
                serializedName: "e",
                type: {
                    name: "Base64Url"
                }
            },
            d: {
                serializedName: "d",
                type: {
                    name: "Base64Url"
                }
            },
            dp: {
                serializedName: "dp",
                type: {
                    name: "Base64Url"
                }
            },
            dq: {
                serializedName: "dq",
                type: {
                    name: "Base64Url"
                }
            },
            qi: {
                serializedName: "qi",
                type: {
                    name: "Base64Url"
                }
            },
            p: {
                serializedName: "p",
                type: {
                    name: "Base64Url"
                }
            },
            q: {
                serializedName: "q",
                type: {
                    name: "Base64Url"
                }
            },
            k: {
                serializedName: "k",
                type: {
                    name: "Base64Url"
                }
            },
            t: {
                serializedName: "key_hsm",
                type: {
                    name: "Base64Url"
                }
            },
            crv: {
                serializedName: "crv",
                type: {
                    name: "String"
                }
            },
            x: {
                serializedName: "x",
                type: {
                    name: "Base64Url"
                }
            },
            y: {
                serializedName: "y",
                type: {
                    name: "Base64Url"
                }
            }
        }
    }
};
export const KeyVaultError = {
    type: {
        name: "Composite",
        className: "KeyVaultError",
        modelProperties: {
            error: {
                serializedName: "error",
                type: {
                    name: "Composite",
                    className: "ErrorModel"
                }
            }
        }
    }
};
export const ErrorModel = {
    type: {
        name: "Composite",
        className: "ErrorModel",
        modelProperties: {
            code: {
                serializedName: "code",
                readOnly: true,
                type: {
                    name: "String"
                }
            },
            message: {
                serializedName: "message",
                readOnly: true,
                type: {
                    name: "String"
                }
            },
            innerError: {
                serializedName: "innererror",
                type: {
                    name: "Composite",
                    className: "ErrorModel"
                }
            }
        }
    }
};
export const KeyImportParameters = {
    type: {
        name: "Composite",
        className: "KeyImportParameters",
        modelProperties: {
            hsm: {
                serializedName: "Hsm",
                type: {
                    name: "Boolean"
                }
            },
            key: {
                serializedName: "key",
                type: {
                    name: "Composite",
                    className: "JsonWebKey"
                }
            },
            keyAttributes: {
                serializedName: "attributes",
                type: {
                    name: "Composite",
                    className: "KeyAttributes"
                }
            },
            tags: {
                serializedName: "tags",
                type: {
                    name: "Dictionary",
                    value: { type: { name: "String" } }
                }
            },
            releasePolicy: {
                serializedName: "release_policy",
                type: {
                    name: "Composite",
                    className: "KeyReleasePolicy"
                }
            }
        }
    }
};
export const KeyUpdateParameters = {
    type: {
        name: "Composite",
        className: "KeyUpdateParameters",
        modelProperties: {
            keyOps: {
                serializedName: "key_ops",
                type: {
                    name: "Sequence",
                    element: {
                        type: {
                            name: "String"
                        }
                    }
                }
            },
            keyAttributes: {
                serializedName: "attributes",
                type: {
                    name: "Composite",
                    className: "KeyAttributes"
                }
            },
            tags: {
                serializedName: "tags",
                type: {
                    name: "Dictionary",
                    value: { type: { name: "String" } }
                }
            },
            releasePolicy: {
                serializedName: "release_policy",
                type: {
                    name: "Composite",
                    className: "KeyReleasePolicy"
                }
            }
        }
    }
};
export const KeyListResult = {
    type: {
        name: "Composite",
        className: "KeyListResult",
        modelProperties: {
            value: {
                serializedName: "value",
                readOnly: true,
                type: {
                    name: "Sequence",
                    element: {
                        type: {
                            name: "Composite",
                            className: "KeyItem"
                        }
                    }
                }
            },
            nextLink: {
                serializedName: "nextLink",
                readOnly: true,
                type: {
                    name: "String"
                }
            }
        }
    }
};
export const KeyItem = {
    type: {
        name: "Composite",
        className: "KeyItem",
        modelProperties: {
            kid: {
                serializedName: "kid",
                type: {
                    name: "String"
                }
            },
            attributes: {
                serializedName: "attributes",
                type: {
                    name: "Composite",
                    className: "KeyAttributes"
                }
            },
            tags: {
                serializedName: "tags",
                type: {
                    name: "Dictionary",
                    value: { type: { name: "String" } }
                }
            },
            managed: {
                serializedName: "managed",
                readOnly: true,
                type: {
                    name: "Boolean"
                }
            }
        }
    }
};
export const BackupKeyResult = {
    type: {
        name: "Composite",
        className: "BackupKeyResult",
        modelProperties: {
            value: {
                serializedName: "value",
                readOnly: true,
                type: {
                    name: "Base64Url"
                }
            }
        }
    }
};
export const KeyRestoreParameters = {
    type: {
        name: "Composite",
        className: "KeyRestoreParameters",
        modelProperties: {
            keyBundleBackup: {
                serializedName: "value",
                required: true,
                type: {
                    name: "Base64Url"
                }
            }
        }
    }
};
export const KeyOperationsParameters = {
    type: {
        name: "Composite",
        className: "KeyOperationsParameters",
        modelProperties: {
            algorithm: {
                serializedName: "alg",
                required: true,
                type: {
                    name: "String"
                }
            },
            value: {
                serializedName: "value",
                required: true,
                type: {
                    name: "Base64Url"
                }
            },
            iv: {
                serializedName: "iv",
                type: {
                    name: "Base64Url"
                }
            },
            additionalAuthenticatedData: {
                serializedName: "aad",
                type: {
                    name: "Base64Url"
                }
            },
            authenticationTag: {
                serializedName: "tag",
                type: {
                    name: "Base64Url"
                }
            }
        }
    }
};
export const KeyOperationResult = {
    type: {
        name: "Composite",
        className: "KeyOperationResult",
        modelProperties: {
            kid: {
                serializedName: "kid",
                readOnly: true,
                type: {
                    name: "String"
                }
            },
            result: {
                serializedName: "value",
                readOnly: true,
                type: {
                    name: "Base64Url"
                }
            },
            iv: {
                serializedName: "iv",
                readOnly: true,
                type: {
                    name: "Base64Url"
                }
            },
            authenticationTag: {
                serializedName: "tag",
                readOnly: true,
                type: {
                    name: "Base64Url"
                }
            },
            additionalAuthenticatedData: {
                serializedName: "aad",
                readOnly: true,
                type: {
                    name: "Base64Url"
                }
            }
        }
    }
};
export const KeySignParameters = {
    type: {
        name: "Composite",
        className: "KeySignParameters",
        modelProperties: {
            algorithm: {
                serializedName: "alg",
                required: true,
                type: {
                    name: "String"
                }
            },
            value: {
                serializedName: "value",
                required: true,
                type: {
                    name: "Base64Url"
                }
            }
        }
    }
};
export const KeyVerifyParameters = {
    type: {
        name: "Composite",
        className: "KeyVerifyParameters",
        modelProperties: {
            algorithm: {
                serializedName: "alg",
                required: true,
                type: {
                    name: "String"
                }
            },
            digest: {
                serializedName: "digest",
                required: true,
                type: {
                    name: "Base64Url"
                }
            },
            signature: {
                serializedName: "value",
                required: true,
                type: {
                    name: "Base64Url"
                }
            }
        }
    }
};
export const KeyVerifyResult = {
    type: {
        name: "Composite",
        className: "KeyVerifyResult",
        modelProperties: {
            value: {
                serializedName: "value",
                readOnly: true,
                type: {
                    name: "Boolean"
                }
            }
        }
    }
};
export const KeyReleaseParameters = {
    type: {
        name: "Composite",
        className: "KeyReleaseParameters",
        modelProperties: {
            targetAttestationToken: {
                constraints: {
                    MinLength: 1
                },
                serializedName: "target",
                required: true,
                type: {
                    name: "String"
                }
            },
            nonce: {
                serializedName: "nonce",
                type: {
                    name: "String"
                }
            },
            enc: {
                serializedName: "enc",
                type: {
                    name: "String"
                }
            }
        }
    }
};
export const KeyReleaseResult = {
    type: {
        name: "Composite",
        className: "KeyReleaseResult",
        modelProperties: {
            value: {
                serializedName: "value",
                readOnly: true,
                type: {
                    name: "String"
                }
            }
        }
    }
};
export const DeletedKeyListResult = {
    type: {
        name: "Composite",
        className: "DeletedKeyListResult",
        modelProperties: {
            value: {
                serializedName: "value",
                readOnly: true,
                type: {
                    name: "Sequence",
                    element: {
                        type: {
                            name: "Composite",
                            className: "DeletedKeyItem"
                        }
                    }
                }
            },
            nextLink: {
                serializedName: "nextLink",
                readOnly: true,
                type: {
                    name: "String"
                }
            }
        }
    }
};
export const KeyRotationPolicy = {
    type: {
        name: "Composite",
        className: "KeyRotationPolicy",
        modelProperties: {
            id: {
                serializedName: "id",
                readOnly: true,
                type: {
                    name: "String"
                }
            },
            lifetimeActions: {
                serializedName: "lifetimeActions",
                type: {
                    name: "Sequence",
                    element: {
                        type: {
                            name: "Composite",
                            className: "LifetimeActions"
                        }
                    }
                }
            },
            attributes: {
                serializedName: "attributes",
                type: {
                    name: "Composite",
                    className: "KeyRotationPolicyAttributes"
                }
            }
        }
    }
};
export const LifetimeActions = {
    type: {
        name: "Composite",
        className: "LifetimeActions",
        modelProperties: {
            trigger: {
                serializedName: "trigger",
                type: {
                    name: "Composite",
                    className: "LifetimeActionsTrigger"
                }
            },
            action: {
                serializedName: "action",
                type: {
                    name: "Composite",
                    className: "LifetimeActionsType"
                }
            }
        }
    }
};
export const LifetimeActionsTrigger = {
    type: {
        name: "Composite",
        className: "LifetimeActionsTrigger",
        modelProperties: {
            timeAfterCreate: {
                serializedName: "timeAfterCreate",
                type: {
                    name: "String"
                }
            },
            timeBeforeExpiry: {
                serializedName: "timeBeforeExpiry",
                type: {
                    name: "String"
                }
            }
        }
    }
};
export const LifetimeActionsType = {
    type: {
        name: "Composite",
        className: "LifetimeActionsType",
        modelProperties: {
            type: {
                serializedName: "type",
                type: {
                    name: "Enum",
                    allowedValues: ["Rotate", "Notify"]
                }
            }
        }
    }
};
export const KeyRotationPolicyAttributes = {
    type: {
        name: "Composite",
        className: "KeyRotationPolicyAttributes",
        modelProperties: {
            expiryTime: {
                serializedName: "expiryTime",
                type: {
                    name: "String"
                }
            },
            created: {
                serializedName: "created",
                readOnly: true,
                type: {
                    name: "UnixTime"
                }
            },
            updated: {
                serializedName: "updated",
                readOnly: true,
                type: {
                    name: "UnixTime"
                }
            }
        }
    }
};
export const GetRandomBytesRequest = {
    type: {
        name: "Composite",
        className: "GetRandomBytesRequest",
        modelProperties: {
            count: {
                constraints: {
                    InclusiveMaximum: 128,
                    InclusiveMinimum: 1
                },
                serializedName: "count",
                required: true,
                type: {
                    name: "Number"
                }
            }
        }
    }
};
export const RandomBytes = {
    type: {
        name: "Composite",
        className: "RandomBytes",
        modelProperties: {
            value: {
                serializedName: "value",
                required: true,
                type: {
                    name: "Base64Url"
                }
            }
        }
    }
};
export const KeyProperties = {
    type: {
        name: "Composite",
        className: "KeyProperties",
        modelProperties: {
            exportable: {
                serializedName: "exportable",
                type: {
                    name: "Boolean"
                }
            },
            keyType: {
                serializedName: "kty",
                type: {
                    name: "String"
                }
            },
            keySize: {
                serializedName: "key_size",
                type: {
                    name: "Number"
                }
            },
            reuseKey: {
                serializedName: "reuse_key",
                type: {
                    name: "Boolean"
                }
            },
            curve: {
                serializedName: "crv",
                type: {
                    name: "String"
                }
            }
        }
    }
};
export const KeyExportParameters = {
    type: {
        name: "Composite",
        className: "KeyExportParameters",
        modelProperties: {
            wrappingKey: {
                serializedName: "wrappingKey",
                type: {
                    name: "Composite",
                    className: "JsonWebKey"
                }
            },
            wrappingKid: {
                serializedName: "wrappingKid",
                type: {
                    name: "String"
                }
            },
            enc: {
                serializedName: "enc",
                type: {
                    name: "String"
                }
            }
        }
    }
};
export const KeyAttributes = {
    type: {
        name: "Composite",
        className: "KeyAttributes",
        modelProperties: Object.assign(Object.assign({}, Attributes.type.modelProperties), { recoverableDays: {
                serializedName: "recoverableDays",
                readOnly: true,
                type: {
                    name: "Number"
                }
            }, recoveryLevel: {
                serializedName: "recoveryLevel",
                readOnly: true,
                type: {
                    name: "String"
                }
            }, exportable: {
                serializedName: "exportable",
                type: {
                    name: "Boolean"
                }
            } })
    }
};
export const DeletedKeyBundle = {
    type: {
        name: "Composite",
        className: "DeletedKeyBundle",
        modelProperties: Object.assign(Object.assign({}, KeyBundle.type.modelProperties), { recoveryId: {
                serializedName: "recoveryId",
                type: {
                    name: "String"
                }
            }, scheduledPurgeDate: {
                serializedName: "scheduledPurgeDate",
                readOnly: true,
                type: {
                    name: "UnixTime"
                }
            }, deletedDate: {
                serializedName: "deletedDate",
                readOnly: true,
                type: {
                    name: "UnixTime"
                }
            } })
    }
};
export const DeletedKeyItem = {
    type: {
        name: "Composite",
        className: "DeletedKeyItem",
        modelProperties: Object.assign(Object.assign({}, KeyItem.type.modelProperties), { recoveryId: {
                serializedName: "recoveryId",
                type: {
                    name: "String"
                }
            }, scheduledPurgeDate: {
                serializedName: "scheduledPurgeDate",
                readOnly: true,
                type: {
                    name: "UnixTime"
                }
            }, deletedDate: {
                serializedName: "deletedDate",
                readOnly: true,
                type: {
                    name: "UnixTime"
                }
            } })
    }
};
//# sourceMappingURL=mappers.js.map/*
 * Copyright (c) Microsoft Corporation.
 * Licensed under the MIT License.
 *
 * Code generated by Microsoft (R) AutoRest Code Generator.
 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
 */
import { KeyCreateParameters as KeyCreateParametersMapper, KeyImportParameters as KeyImportParametersMapper, KeyUpdateParameters as KeyUpdateParametersMapper, KeyRestoreParameters as KeyRestoreParametersMapper, KeyOperationsParameters as KeyOperationsParametersMapper, KeySignParameters as KeySignParametersMapper, KeyVerifyParameters as KeyVerifyParametersMapper, KeyReleaseParameters as KeyReleaseParametersMapper, KeyRotationPolicy as KeyRotationPolicyMapper, GetRandomBytesRequest as GetRandomBytesRequestMapper } from "../models/mappers";
export const contentType = {
    parameterPath: ["options", "contentType"],
    mapper: {
        defaultValue: "application/json",
        isConstant: true,
        serializedName: "Content-Type",
        type: {
            name: "String"
        }
    }
};
export const accept = {
    parameterPath: "accept",
    mapper: {
        defaultValue: "application/json",
        isConstant: true,
        serializedName: "Accept",
        type: {
            name: "String"
        }
    }
};
export const kty = {
    parameterPath: "kty",
    mapper: KeyCreateParametersMapper
};
export const keySize = {
    parameterPath: ["options", "keySize"],
    mapper: KeyCreateParametersMapper
};
export const publicExponent = {
    parameterPath: ["options", "publicExponent"],
    mapper: KeyCreateParametersMapper
};
export const keyOps = {
    parameterPath: ["options", "keyOps"],
    mapper: KeyCreateParametersMapper
};
export const keyAttributes = {
    parameterPath: ["options", "keyAttributes"],
    mapper: KeyCreateParametersMapper
};
export const tags = {
    parameterPath: ["options", "tags"],
    mapper: KeyCreateParametersMapper
};
export const curve = {
    parameterPath: ["options", "curve"],
    mapper: KeyCreateParametersMapper
};
export const releasePolicy = {
    parameterPath: ["options", "releasePolicy"],
    mapper: KeyCreateParametersMapper
};
export const vaultBaseUrl = {
    parameterPath: "vaultBaseUrl",
    mapper: {
        serializedName: "vaultBaseUrl",
        required: true,
        type: {
            name: "String"
        }
    },
    skipEncoding: true
};
export const keyName = {
    parameterPath: "keyName",
    mapper: {
        constraints: {
            Pattern: new RegExp("^[0-9a-zA-Z-]+$")
        },
        serializedName: "key-name",
        required: true,
        type: {
            name: "String"
        }
    }
};
export const apiVersion = {
    parameterPath: "apiVersion",
    mapper: {
        serializedName: "api-version",
        required: true,
        type: {
            name: "String"
        }
    }
};
export const hsm = {
    parameterPath: ["options", "hsm"],
    mapper: KeyImportParametersMapper
};
export const key = {
    parameterPath: "key",
    mapper: KeyImportParametersMapper
};
export const keyAttributes1 = {
    parameterPath: ["options", "keyAttributes"],
    mapper: KeyImportParametersMapper
};
export const tags1 = {
    parameterPath: ["options", "tags"],
    mapper: KeyImportParametersMapper
};
export const releasePolicy1 = {
    parameterPath: ["options", "releasePolicy"],
    mapper: KeyImportParametersMapper
};
export const keyName1 = {
    parameterPath: "keyName",
    mapper: {
        serializedName: "key-name",
        required: true,
        type: {
            name: "String"
        }
    }
};
export const keyOps1 = {
    parameterPath: ["options", "keyOps"],
    mapper: KeyUpdateParametersMapper
};
export const keyAttributes2 = {
    parameterPath: ["options", "keyAttributes"],
    mapper: KeyUpdateParametersMapper
};
export const tags2 = {
    parameterPath: ["options", "tags"],
    mapper: KeyUpdateParametersMapper
};
export const releasePolicy2 = {
    parameterPath: ["options", "releasePolicy"],
    mapper: KeyUpdateParametersMapper
};
export const keyVersion = {
    parameterPath: "keyVersion",
    mapper: {
        serializedName: "key-version",
        required: true,
        type: {
            name: "String"
        }
    }
};
export const maxresults = {
    parameterPath: ["options", "maxresults"],
    mapper: {
        constraints: {
            InclusiveMaximum: 25,
            InclusiveMinimum: 1
        },
        serializedName: "maxresults",
        type: {
            name: "Number"
        }
    }
};
export const keyBundleBackup = {
    parameterPath: "keyBundleBackup",
    mapper: KeyRestoreParametersMapper
};
export const algorithm = {
    parameterPath: "algorithm",
    mapper: KeyOperationsParametersMapper
};
export const value = {
    parameterPath: "value",
    mapper: KeyOperationsParametersMapper
};
export const iv = {
    parameterPath: ["options", "iv"],
    mapper: KeyOperationsParametersMapper
};
export const additionalAuthenticatedData = {
    parameterPath: ["options", "additionalAuthenticatedData"],
    mapper: KeyOperationsParametersMapper
};
export const authenticationTag = {
    parameterPath: ["options", "authenticationTag"],
    mapper: KeyOperationsParametersMapper
};
export const algorithm1 = {
    parameterPath: "algorithm",
    mapper: KeySignParametersMapper
};
export const value1 = {
    parameterPath: "value",
    mapper: KeySignParametersMapper
};
export const algorithm2 = {
    parameterPath: "algorithm",
    mapper: KeyVerifyParametersMapper
};
export const digest = {
    parameterPath: "digest",
    mapper: KeyVerifyParametersMapper
};
export const signature = {
    parameterPath: "signature",
    mapper: KeyVerifyParametersMapper
};
export const targetAttestationToken = {
    parameterPath: "targetAttestationToken",
    mapper: KeyReleaseParametersMapper
};
export const nonce = {
    parameterPath: ["options", "nonce"],
    mapper: KeyReleaseParametersMapper
};
export const enc = {
    parameterPath: ["options", "enc"],
    mapper: KeyReleaseParametersMapper
};
export const keyRotationPolicy = {
    parameterPath: "keyRotationPolicy",
    mapper: KeyRotationPolicyMapper
};
export const count = {
    parameterPath: "count",
    mapper: GetRandomBytesRequestMapper
};
export const nextLink = {
    parameterPath: "nextLink",
    mapper: {
        serializedName: "nextLink",
        required: true,
        type: {
            name: "String"
        }
    },
    skipEncoding: true
};
//# sourceMappingURL=parameters.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { LocalCryptographyUnsupportedError } from "./models";
/**
 * The browser replacement of the AesCryptographyProvider. Since we do not
 * support local cryptography in the browser this replacement always returns false
 * for `supportsAlgorithm` and `supportsOperation` so that these methods should
 * never be called.
 */
export class AesCryptographyProvider {
    encrypt() {
        throw new LocalCryptographyUnsupportedError("AES Local cryptography is not supported in the browser.");
    }
    decrypt() {
        throw new LocalCryptographyUnsupportedError("AES Local cryptography is not supported in the browser.");
    }
    /**
     * Browser RSA provider does not support any algorithms or operations.
     */
    isSupported() {
        return false;
    }
    wrapKey() {
        throw new LocalCryptographyUnsupportedError("AES Local cryptography is not supported in the browser.");
    }
    unwrapKey() {
        throw new LocalCryptographyUnsupportedError("AES Local cryptography is not supported in the browser.");
    }
    sign() {
        throw new LocalCryptographyUnsupportedError("AES Local cryptography is not supported in the browser.");
    }
    signData() {
        throw new LocalCryptographyUnsupportedError("AES Local cryptography is not supported in the browser.");
    }
    verify() {
        throw new LocalCryptographyUnsupportedError("AES Local cryptography is not supported in the browser.");
    }
    verifyData() {
        throw new LocalCryptographyUnsupportedError("AES Local cryptography is not supported in the browser.");
    }
}
//# sourceMappingURL=aesCryptographyProvider.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import * as crypto from "crypto";
import { LocalCryptographyUnsupportedError, } from "./models";
/**
 * An AES cryptography provider supporting AES algorithms.
 * @internal
 */
export class AesCryptographyProvider {
    constructor(key) {
        /**
         * The set of algorithms this provider supports.
         * For AES encryption, the values include the underlying algorithm used in crypto
         * as well as the key size in bytes.
         *
         * We start with support for A[SIZE]CBCPAD which uses the PKCS padding (the default padding scheme in node crypto)
         */
        this.supportedAlgorithms = {
            A128CBCPAD: {
                algorithm: "aes-128-cbc",
                keySizeInBytes: 128 >> 3,
            },
            A192CBCPAD: {
                algorithm: "aes-192-cbc",
                keySizeInBytes: 192 >> 3,
            },
            A256CBCPAD: {
                algorithm: "aes-256-cbc",
                keySizeInBytes: 256 >> 3,
            },
        };
        this.supportedOperations = ["encrypt", "decrypt"];
        this.key = key;
    }
    encrypt(encryptParameters, _options) {
        const { algorithm, keySizeInBytes } = this.supportedAlgorithms[encryptParameters.algorithm];
        const iv = encryptParameters.iv || crypto.randomBytes(16);
        this.ensureValid(keySizeInBytes);
        const cipher = crypto.createCipheriv(algorithm, this.key.k.subarray(0, keySizeInBytes), iv);
        let encrypted = cipher.update(Buffer.from(encryptParameters.plaintext));
        encrypted = Buffer.concat([encrypted, cipher.final()]);
        return Promise.resolve({
            algorithm: encryptParameters.algorithm,
            result: encrypted,
            iv: iv,
        });
    }
    decrypt(decryptParameters, _options) {
        const { algorithm, keySizeInBytes } = this.supportedAlgorithms[decryptParameters.algorithm];
        this.ensureValid(keySizeInBytes);
        const decipher = crypto.createDecipheriv(algorithm, this.key.k.subarray(0, keySizeInBytes), decryptParameters.iv);
        let dec = decipher.update(Buffer.from(decryptParameters.ciphertext));
        dec = Buffer.concat([dec, decipher.final()]);
        return Promise.resolve({
            algorithm: decryptParameters.algorithm,
            result: dec,
        });
    }
    isSupported(algorithm, operation) {
        if (!this.key.k) {
            return false;
        }
        if (!Object.keys(this.supportedAlgorithms).includes(algorithm)) {
            return false;
        }
        if (!this.supportedOperations.includes(operation)) {
            return false;
        }
        return true;
    }
    wrapKey(_algorithm, _keyToWrap, _options) {
        throw new LocalCryptographyUnsupportedError("Wrapping a key using a local JsonWebKey is not supported for AES.");
    }
    unwrapKey(_algorithm, _encryptedKey, _options) {
        throw new LocalCryptographyUnsupportedError("Unwrapping a key using a local JsonWebKey is not supported for AES.");
    }
    sign(_algorithm, _digest, _options) {
        throw new LocalCryptographyUnsupportedError("Signing using a local JsonWebKey is not supported for AES.");
    }
    signData(_algorithm, _data, _options) {
        throw new LocalCryptographyUnsupportedError("Signing using a local JsonWebKey is not supported for AES.");
    }
    verify(_algorithm, _digest, _signature, _options) {
        throw new LocalCryptographyUnsupportedError("Verifying using a local JsonWebKey is not supported for AES.");
    }
    verifyData(_algorithm, _data, _signature, _updatedOptions) {
        throw new LocalCryptographyUnsupportedError("Verifying using a local JsonWebKey is not supported for AES.");
    }
    ensureValid(keySizeInBytes) {
        var _a, _b;
        if (this.key &&
            ((_a = this.key.kty) === null || _a === void 0 ? void 0 : _a.toUpperCase()) !== "OCT" &&
            ((_b = this.key.kty) === null || _b === void 0 ? void 0 : _b.toUpperCase()) !== "OCT-HSM") {
            throw new Error("Key type does not match the key type oct or oct-hsm");
        }
        if (!this.key.k) {
            throw new Error("Symmetric key is required");
        }
        if (this.key.k.length < keySizeInBytes) {
            throw new Error(`Key must be at least ${keySizeInBytes << 3} bits`);
        }
    }
}
//# sourceMappingURL=aesCryptographyProvider.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * @internal
 * Encodes a length of a packet in DER format
 */
function encodeLength(length) {
    if (length <= 127) {
        return Uint8Array.of(length);
    }
    else if (length < 256) {
        return Uint8Array.of(0x81, length);
    }
    else if (length < 65536) {
        return Uint8Array.of(0x82, length >> 8, length & 0xff);
    }
    else {
        throw new Error("Unsupported length to encode");
    }
}
/**
 * @internal
 * Encodes a buffer for DER, as sets the id to the given id
 */
function encodeBuffer(buffer, bufferId) {
    if (buffer.length === 0) {
        return buffer;
    }
    let result = new Uint8Array(buffer);
    // If the high bit is set, prepend a 0
    if (result[0] & 0x80) {
        const array = new Uint8Array(result.length + 1);
        array[0] = 0;
        array.set(result, 1);
        result = array;
    }
    // Prepend the DER header for this buffer
    const encodedLength = encodeLength(result.length);
    const totalLength = 1 + encodedLength.length + result.length;
    const outputBuffer = new Uint8Array(totalLength);
    outputBuffer[0] = bufferId;
    outputBuffer.set(encodedLength, 1);
    outputBuffer.set(result, 1 + encodedLength.length);
    return outputBuffer;
}
function makeSequence(encodedParts) {
    const totalLength = encodedParts.reduce((sum, part) => sum + part.length, 0);
    const sequence = new Uint8Array(totalLength);
    for (let i = 0; i < encodedParts.length; i++) {
        const previousLength = i > 0 ? encodedParts[i - 1].length : 0;
        sequence.set(encodedParts[i], previousLength);
    }
    const full_encoded = encodeBuffer(sequence, 0x30); // SEQUENCE
    return Buffer.from(full_encoded).toString("base64");
}
/**
 * Fill in the PEM with 64 character lines as per RFC:
 *
 * "To represent the encapsulated text of a PEM message, the encoding
 * function's output is delimited into text lines (using local
 * conventions), with each line except the last containing exactly 64
 * printable characters and the final line containing 64 or fewer
 * printable characters."
 */
function formatBase64Sequence(base64Sequence) {
    const lines = base64Sequence.match(/.{1,64}/g);
    let result = "";
    if (lines) {
        for (const line of lines) {
            result += line;
            result += "\n";
        }
    }
    else {
        throw new Error("Could not create correct PEM");
    }
    return result;
}
/**
 * @internal
 * Encode a JWK to PEM format. To do so, it internally repackages the JWK as a DER
 * that is then encoded as a PEM.
 */
export function convertJWKtoPEM(key) {
    let result = "";
    if (key.n && key.e) {
        const parts = [key.n, key.e];
        const encodedParts = parts.map((part) => encodeBuffer(part, 0x2)); // INTEGER
        const base64Sequence = makeSequence(encodedParts);
        result += "-----BEGIN RSA PUBLIC KEY-----\n";
        result += formatBase64Sequence(base64Sequence);
        result += "-----END RSA PUBLIC KEY-----\n";
    }
    if (!result.length) {
        throw new Error("Unsupported key format for local operations");
    }
    return result.slice(0, -1); // Removing the last new line
}
//# sourceMappingURL=conversions.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { LocalCryptographyUnsupportedError } from "./models";
/**
 * @internal
 * Use the platform-local hashing functionality
 */
export async function createHash(_algorithm, _data) {
    throw new LocalCryptographyUnsupportedError("Our libraries don't currently support browser hashing");
}
/**
 * @internal
 * Use the platform-local verify functionality
 */
export function createVerify(_algorithm, _data) {
    throw new LocalCryptographyUnsupportedError("Our libraries don't currently support browser hashing");
}
/**
 * @internal
 * Use the platform-local randomBytes functionality
 */
export function randomBytes(_length) {
    throw new LocalCryptographyUnsupportedError("Our libraries don't currently support browser crypto");
}
//# sourceMappingURL=crypto.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createHash as cryptoCreateHash, createVerify as cryptoCreateVerify, randomBytes as cryptoRandomBytes, } from "crypto";
/**
 * @internal
 * Mapping between signature algorithms and their corresponding hash algorithms. Externally used for testing.
 **/
const algorithmToHashAlgorithm = {
    ES256: "SHA256",
    ES256K: "SHA256",
    PS256: "SHA256",
    RS256: "SHA256",
    ES384: "SHA384",
    PS384: "SHA384",
    RS384: "SHA384",
    ES512: "SHA512",
    PS512: "SHA512",
    RS512: "SHA512",
};
/**
 * @internal
 * Use the platform-local hashing functionality
 */
export async function createHash(algorithm, data) {
    const hashAlgorithm = algorithmToHashAlgorithm[algorithm];
    if (!hashAlgorithm) {
        throw new Error(`Invalid algorithm ${algorithm} passed to createHash. Supported algorithms: ${Object.keys(algorithmToHashAlgorithm).join(", ")}`);
    }
    const hash = cryptoCreateHash(hashAlgorithm);
    hash.update(Buffer.from(data));
    const digest = hash.digest();
    return digest;
}
/**
 * @internal
 * Use the platform-local verify functionality
 */
export function createVerify(algorithm, data) {
    const verifyAlgorithm = algorithmToHashAlgorithm[algorithm];
    if (!verifyAlgorithm) {
        throw new Error(`Invalid algorithm ${algorithm} passed to createHash. Supported algorithms: ${Object.keys(algorithmToHashAlgorithm).join(", ")}`);
    }
    const verifier = cryptoCreateVerify(verifyAlgorithm);
    verifier.update(Buffer.from(data));
    verifier.end();
    return verifier;
}
/**
 * @internal
 * Use the platform-local randomBytes functionality
 */
export function randomBytes(length) {
    return cryptoRandomBytes(length);
}
//# sourceMappingURL=crypto.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export class LocalCryptographyUnsupportedError extends Error {
}
//# sourceMappingURL=models.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { __rest } from "tslib";
import { createPipelineFromOptions, isTokenCredential, signingPolicy, } from "@azure/core-http";
import { SDK_VERSION } from "../constants";
import { KeyVaultClient } from "../generated";
import { parseKeyVaultKeyIdentifier } from "../identifier";
import { LATEST_API_VERSION, } from "../keysModels";
import { getKeyFromKeyBundle } from "../transformations";
import { createHash } from "./crypto";
import { logger } from "../log";
import { createTraceFunction, challengeBasedAuthenticationPolicy, } from "../../../keyvault-common/src";
const withTrace = createTraceFunction("Azure.KeyVault.Keys.RemoteCryptographyProvider");
/**
 * The remote cryptography provider is used to run crypto operations against KeyVault.
 * @internal
 */
export class RemoteCryptographyProvider {
    constructor(key, credential, pipelineOptions = {}) {
        var _a;
        this.client = getOrInitializeClient(credential, pipelineOptions);
        this.key = key;
        let keyId;
        if (typeof key === "string") {
            keyId = key;
        }
        else {
            keyId = key.id;
        }
        try {
            const parsed = parseKeyVaultKeyIdentifier(keyId);
            if (parsed.name === "") {
                throw new Error("Could not find 'name' of key in key URL");
            }
            if (!parsed.vaultUrl || parsed.vaultUrl === "") {
                throw new Error("Could not find 'vaultUrl' of key in key URL");
            }
            this.vaultUrl = parsed.vaultUrl;
            this.name = parsed.name;
            this.version = (_a = parsed.version) !== null && _a !== void 0 ? _a : "";
        }
        catch (err) {
            logger.error(err);
            throw new Error(`${keyId} is not a valid Key Vault key ID`);
        }
    }
    // The remote client supports all algorithms and all operations.
    isSupported(_algorithm, _operation) {
        return true;
    }
    encrypt(encryptParameters, options = {}) {
        const { algorithm, plaintext } = encryptParameters, params = __rest(encryptParameters, ["algorithm", "plaintext"]);
        const requestOptions = Object.assign(Object.assign({}, options), params);
        return withTrace("encrypt", requestOptions, async (updatedOptions) => {
            const result = await this.client.encrypt(this.vaultUrl, this.name, this.version, algorithm, plaintext, updatedOptions);
            return {
                algorithm: encryptParameters.algorithm,
                result: result.result,
                keyID: this.getKeyID(),
                additionalAuthenticatedData: result.additionalAuthenticatedData,
                authenticationTag: result.authenticationTag,
                iv: result.iv,
            };
        });
    }
    decrypt(decryptParameters, options = {}) {
        const { algorithm, ciphertext } = decryptParameters, params = __rest(decryptParameters, ["algorithm", "ciphertext"]);
        const requestOptions = Object.assign(Object.assign({}, options), params);
        return withTrace("decrypt", requestOptions, async (updatedOptions) => {
            const result = await this.client.decrypt(this.vaultUrl, this.name, this.version, algorithm, ciphertext, updatedOptions);
            return {
                result: result.result,
                keyID: this.getKeyID(),
                algorithm,
            };
        });
    }
    wrapKey(algorithm, keyToWrap, options = {}) {
        return withTrace("wrapKey", options, async (updatedOptions) => {
            const result = await this.client.wrapKey(this.vaultUrl, this.name, this.version, algorithm, keyToWrap, updatedOptions);
            return {
                result: result.result,
                algorithm,
                keyID: this.getKeyID(),
            };
        });
    }
    unwrapKey(algorithm, encryptedKey, options = {}) {
        return withTrace("unwrapKey", options, async (updatedOptions) => {
            const result = await this.client.unwrapKey(this.vaultUrl, this.name, this.version, algorithm, encryptedKey, updatedOptions);
            return {
                result: result.result,
                algorithm,
                keyID: this.getKeyID(),
            };
        });
    }
    sign(algorithm, digest, options = {}) {
        return withTrace("sign", options, async (updatedOptions) => {
            const result = await this.client.sign(this.vaultUrl, this.name, this.version, algorithm, digest, updatedOptions);
            return { result: result.result, algorithm, keyID: this.getKeyID() };
        });
    }
    verifyData(algorithm, data, signature, options = {}) {
        return withTrace("verifyData", options, async (updatedOptions) => {
            const hash = await createHash(algorithm, data);
            return this.verify(algorithm, hash, signature, updatedOptions);
        });
    }
    verify(algorithm, digest, signature, options = {}) {
        return withTrace("verify", options, async (updatedOptions) => {
            const response = await this.client.verify(this.vaultUrl, this.name, this.version, algorithm, digest, signature, updatedOptions);
            return {
                result: response.value ? response.value : false,
                keyID: this.getKeyID(),
            };
        });
    }
    signData(algorithm, data, options = {}) {
        return withTrace("signData", options, async (updatedOptions) => {
            const digest = await createHash(algorithm, data);
            const result = await this.client.sign(this.vaultUrl, this.name, this.version, algorithm, digest, updatedOptions);
            return { result: result.result, algorithm, keyID: this.getKeyID() };
        });
    }
    /**
     * The ID of the key used to perform cryptographic operations for the client.
     */
    get keyId() {
        return this.getKeyID();
    }
    /**
     * Gets the {@link KeyVaultKey} used for cryptography operations, fetching it
     * from KeyVault if necessary.
     * @param options - Additional options.
     */
    getKey(options = {}) {
        return withTrace("getKey", options, async (updatedOptions) => {
            if (typeof this.key === "string") {
                if (!this.name || this.name === "") {
                    throw new Error("getKey requires a key with a name");
                }
                const response = await this.client.getKey(this.vaultUrl, this.name, options && options.version ? options.version : this.version ? this.version : "", updatedOptions);
                this.key = getKeyFromKeyBundle(response);
            }
            return this.key;
        });
    }
    /**
     * Attempts to retrieve the ID of the key.
     */
    getKeyID() {
        let kid;
        if (typeof this.key !== "string") {
            kid = this.key.id;
        }
        else {
            kid = this.key;
        }
        return kid;
    }
}
/**
 * A helper method to either get the passed down generated client or initialize a new one.
 * An already constructed generated client may be passed down from {@link KeyClient} in which case we should reuse it.
 *
 * @internal
 * @param credential - The credential to use when initializing a new client.
 * @param options - The options for constructing a client or the underlying client if one already exists.
 * @returns - A generated client instance
 */
function getOrInitializeClient(credential, options) {
    if (options.generatedClient) {
        return options.generatedClient;
    }
    const libInfo = `azsdk-js-keyvault-keys/${SDK_VERSION}`;
    const userAgentOptions = options.userAgentOptions;
    options.userAgentOptions = {
        userAgentPrefix: userAgentOptions && userAgentOptions.userAgentPrefix
            ? `${userAgentOptions.userAgentPrefix} ${libInfo}`
            : libInfo,
    };
    const authPolicy = isTokenCredential(credential)
        ? challengeBasedAuthenticationPolicy(credential)
        : signingPolicy(credential);
    const internalPipelineOptions = Object.assign(Object.assign({}, options), { loggingOptions: {
            logger: logger.info,
            allowedHeaderNames: [
                "x-ms-keyvault-region",
                "x-ms-keyvault-network-info",
                "x-ms-keyvault-service-version",
            ],
        } });
    return new KeyVaultClient(options.serviceVersion || LATEST_API_VERSION, createPipelineFromOptions(internalPipelineOptions, authPolicy));
}
//# sourceMappingURL=remoteCryptographyProvider.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { LocalCryptographyUnsupportedError } from "./models";
/**
 * The browser replacement of the RsaCryptographyProvider. Since we do not
 * support local cryptography in the browser this replacement always returns false
 * for `supportsAlgorithm` and `supportsOperation` so that these methods should
 * never be called.
 */
export class RsaCryptographyProvider {
    encrypt() {
        throw new LocalCryptographyUnsupportedError("RSA Local cryptography is not supported in the browser.");
    }
    decrypt() {
        throw new LocalCryptographyUnsupportedError("RSA Local cryptography is not supported in the browser.");
    }
    /**
     * Browser RSA Provider does not support any algorithms or operations.
     */
    isSupported() {
        return false;
    }
    wrapKey() {
        throw new LocalCryptographyUnsupportedError("RSA Local cryptography is not supported in the browser.");
    }
    unwrapKey() {
        throw new LocalCryptographyUnsupportedError("RSA Local cryptography is not supported in the browser.");
    }
    sign() {
        throw new LocalCryptographyUnsupportedError("RSA Local cryptography is not supported in the browser.");
    }
    signData() {
        throw new LocalCryptographyUnsupportedError("RSA Local cryptography is not supported in the browser.");
    }
    verify() {
        throw new LocalCryptographyUnsupportedError("RSA Local cryptography is not supported in the browser.");
    }
    verifyData() {
        throw new LocalCryptographyUnsupportedError("RSA Local cryptography is not supported in the browser.");
    }
}
//# sourceMappingURL=rsaCryptographyProvider.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { RSA_PKCS1_OAEP_PADDING, RSA_PKCS1_PADDING } from "constants";
import { publicEncrypt } from "crypto";
import { createVerify } from "./crypto";
import { convertJWKtoPEM } from "./conversions";
import { LocalCryptographyUnsupportedError, } from "./models";
/**
 * An RSA cryptography provider supporting RSA algorithms.
 */
export class RsaCryptographyProvider {
    constructor(key) {
        /**
         * The set of algorithms this provider supports
         */
        this.applicableAlgorithms = [
            "RSA1_5",
            "RSA-OAEP",
            "PS256",
            "RS256",
            "PS384",
            "RS384",
            "PS512",
            "RS512",
        ];
        /**
         * The set of operations this provider supports
         */
        this.applicableOperations = [
            "encrypt",
            "wrapKey",
            "verifyData",
        ];
        /**
         * Mapping between signature algorithms and their corresponding hash algorithms. Externally used for testing.
         * @internal
         */
        this.signatureAlgorithmToHashAlgorithm = {
            PS256: "SHA256",
            RS256: "SHA256",
            PS384: "SHA384",
            RS384: "SHA384",
            PS512: "SHA512",
            RS512: "SHA512",
        };
        this.key = key;
    }
    isSupported(algorithm, operation) {
        return (this.applicableAlgorithms.includes(algorithm) && this.applicableOperations.includes(operation));
    }
    encrypt(encryptParameters, _options) {
        this.ensureValid();
        const keyPEM = convertJWKtoPEM(this.key);
        const padding = encryptParameters.algorithm === "RSA1_5" ? RSA_PKCS1_PADDING : RSA_PKCS1_OAEP_PADDING;
        return Promise.resolve({
            algorithm: encryptParameters.algorithm,
            keyID: this.key.kid,
            result: publicEncrypt({ key: keyPEM, padding: padding }, Buffer.from(encryptParameters.plaintext)),
        });
    }
    decrypt(_decryptParameters, _options) {
        throw new LocalCryptographyUnsupportedError("Decrypting using a local JsonWebKey is not supported.");
    }
    wrapKey(algorithm, keyToWrap, _options) {
        this.ensureValid();
        const keyPEM = convertJWKtoPEM(this.key);
        const padding = algorithm === "RSA1_5" ? RSA_PKCS1_PADDING : RSA_PKCS1_OAEP_PADDING;
        return Promise.resolve({
            algorithm: algorithm,
            result: publicEncrypt({ key: keyPEM, padding }, Buffer.from(keyToWrap)),
            keyID: this.key.kid,
        });
    }
    unwrapKey(_algorithm, _encryptedKey, _options) {
        throw new LocalCryptographyUnsupportedError("Unwrapping a key using a local JsonWebKey is not supported.");
    }
    sign(_algorithm, _digest, _options) {
        throw new LocalCryptographyUnsupportedError("Signing a digest using a local JsonWebKey is not supported.");
    }
    signData(_algorithm, _data, _options) {
        throw new LocalCryptographyUnsupportedError("Signing a block of data using a local JsonWebKey is not supported.");
    }
    async verify(_algorithm, _digest, _signature, _options) {
        throw new LocalCryptographyUnsupportedError("Verifying a digest using a local JsonWebKey is not supported.");
    }
    verifyData(algorithm, data, signature, _options) {
        this.ensureValid();
        const keyPEM = convertJWKtoPEM(this.key);
        const verifier = createVerify(algorithm, data);
        return Promise.resolve({
            result: verifier.verify(keyPEM, Buffer.from(signature)),
            keyID: this.key.kid,
        });
    }
    ensureValid() {
        var _a, _b;
        if (this.key &&
            ((_a = this.key.kty) === null || _a === void 0 ? void 0 : _a.toUpperCase()) !== "RSA" &&
            ((_b = this.key.kty) === null || _b === void 0 ? void 0 : _b.toUpperCase()) !== "RSA-HSM") {
            throw new Error("Key type does not match the algorithm RSA");
        }
    }
}
//# sourceMappingURL=rsaCryptographyProvider.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/* eslint-disable @azure/azure-sdk/ts-use-interface-parameters */
import { ExpiringAccessTokenCache } from "@azure/core-http";
import { BaseRequestPolicy, } from "@azure/core-http";
import { parseWWWAuthenticate } from "./parseWWWAuthenticate";
import { Constants } from "@azure/core-http";
/**
 * Representation of the Authentication Challenge
 */
export class AuthenticationChallenge {
    constructor(authorization, scope, tenantId) {
        this.authorization = authorization;
        this.scope = scope;
        this.tenantId = tenantId;
    }
    /**
     * Checks that this AuthenticationChallenge is equal to another one given.
     * Only compares the scope.
     * This is exactly what C# is doing, as we can see here:
     * https://github.com/Azure/azure-sdk-for-net/blob/70e54b878ff1d01a45266fb3674a396b4ab9c1d2/sdk/keyvault/Azure.Security.KeyVault.Shared/src/ChallengeBasedAuthenticationPolicy.cs#L143-L147
     * @param other - The other AuthenticationChallenge
     */
    equalTo(other) {
        var _a, _b;
        return other
            ? this.scope.toLowerCase() === other.scope.toLowerCase() &&
                this.authorization.toLowerCase() === other.authorization.toLowerCase() &&
                ((_a = this.tenantId) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === ((_b = other.tenantId) === null || _b === void 0 ? void 0 : _b.toLowerCase())
            : false;
    }
}
/**
 * Helps keep a copy of any previous authentication challenges,
 * so that we can compare on any further request.
 */
export class AuthenticationChallengeCache {
    setCachedChallenge(challenge) {
        this.challenge = challenge;
    }
}
/**
 * Creates a new ChallengeBasedAuthenticationPolicy factory.
 *
 * @param credential - The TokenCredential implementation that can supply the challenge token.
 */
export function challengeBasedAuthenticationPolicy(credential) {
    const tokenCache = new ExpiringAccessTokenCache();
    const challengeCache = new AuthenticationChallengeCache();
    return {
        create: (nextPolicy, options) => {
            return new ChallengeBasedAuthenticationPolicy(nextPolicy, options, credential, tokenCache, challengeCache);
        },
    };
}
/**
 *
 * Provides a RequestPolicy that can request a token from a TokenCredential
 * implementation and then apply it to the Authorization header of a request
 * as a Bearer token.
 *
 */
export class ChallengeBasedAuthenticationPolicy extends BaseRequestPolicy {
    /**
     * Creates a new ChallengeBasedAuthenticationPolicy object.
     *
     * @param nextPolicy - The next RequestPolicy in the request pipeline.
     * @param options - Options for this RequestPolicy.
     * @param credential - The TokenCredential implementation that can supply the bearer token.
     * @param tokenCache - The cache for the most recent AccessToken returned by the TokenCredential.
     */
    constructor(nextPolicy, options, credential, tokenCache, challengeCache) {
        super(nextPolicy, options);
        this.credential = credential;
        this.tokenCache = tokenCache;
        this.challengeCache = challengeCache;
        this.parseWWWAuthenticate = parseWWWAuthenticate;
    }
    /**
     * Gets or updates the token from the token cache into the headers of the received web resource.
     */
    async loadToken(webResource) {
        let accessToken = this.tokenCache.getCachedToken();
        // If there's no cached token in the cache, we try to get a new one.
        if (accessToken === undefined) {
            const receivedToken = await this.credential.getToken(this.challengeCache.challenge.scope, {
                tenantId: this.challengeCache.challenge.tenantId,
            });
            accessToken = receivedToken || undefined;
            this.tokenCache.setCachedToken(accessToken);
        }
        if (accessToken) {
            webResource.headers.set(Constants.HeaderConstants.AUTHORIZATION, `Bearer ${accessToken.token}`);
        }
    }
    /**
     * Parses the given WWW-Authenticate header, generates a new AuthenticationChallenge,
     * then if the challenge is different from the one cached, resets the token and forces
     * a re-authentication, otherwise continues with the existing challenge and token.
     * @param wwwAuthenticate - Value of the incoming WWW-Authenticate header.
     * @param webResource - Ongoing HTTP request.
     */
    async regenerateChallenge(wwwAuthenticate, webResource) {
        var _a;
        // The challenge based authentication will contain both:
        // - An authorization URI with a token,
        // - The resource to which that token is valid against (also called the scope).
        const parsedWWWAuth = this.parseWWWAuthenticate(wwwAuthenticate);
        const authorization = parsedWWWAuth.authorization;
        const resource = parsedWWWAuth.resource || parsedWWWAuth.scope;
        const tenantId = parsedWWWAuth.tenantId;
        if (!(authorization && resource)) {
            return this._nextPolicy.sendRequest(webResource);
        }
        const challenge = new AuthenticationChallenge(authorization, resource + "/.default", tenantId);
        // Either if there's no cached challenge at this point (could have happen in parallel),
        // or if the cached challenge has a different scope,
        // we store the just received challenge and reset the cached token, to force a re-authentication.
        if (!((_a = this.challengeCache.challenge) === null || _a === void 0 ? void 0 : _a.equalTo(challenge))) {
            this.challengeCache.setCachedChallenge(challenge);
            this.tokenCache.setCachedToken(undefined);
        }
        await this.loadToken(webResource);
        return this._nextPolicy.sendRequest(webResource);
    }
    /**
     * Applies the Bearer token to the request through the Authorization header.
     * @param webResource - Ongoing HTTP request.
     */
    async sendRequest(webResource) {
        // Ensure that we're about to use a secure connection.
        if (!webResource.url.startsWith("https:")) {
            throw new Error("The resource address for authorization must use the 'https' protocol.");
        }
        // The next request will happen differently whether we have a challenge or not.
        let response;
        if (this.challengeCache.challenge === undefined ||
            this.challengeCache.challenge === undefined) {
            // If there's no challenge in cache, a blank body will start the challenge.
            const originalBody = webResource.body;
            webResource.body = "";
            try {
                response = await this._nextPolicy.sendRequest(webResource);
            }
            finally {
                webResource.body = originalBody;
            }
        }
        else {
            // If we did have a challenge in memory,
            // we attempt to load the token from the cache into the request before we try to send the request.
            await this.loadToken(webResource);
            response = await this._nextPolicy.sendRequest(webResource);
        }
        // If we don't receive a response with a 401 status code,
        // then we can assume this response has nothing to do with the challenge authentication process.
        if (response.status !== 401) {
            return response;
        }
        // If the response status is 401, we only re-authenticate if the WWW-Authenticate header is present.
        const wwwAuthenticate = response.headers.get("WWW-Authenticate");
        if (!wwwAuthenticate) {
            return response;
        }
        // We re-generate the challenge and see if we have to re-authenticate.
        return this.regenerateChallenge(wwwAuthenticate, webResource);
    }
}
//# sourceMappingURL=challengeBasedAuthenticationPolicy.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export * from "./challengeBasedAuthenticationPolicy";
export * from "./parseKeyvaultIdentifier";
export * from "./tracingHelpers";
export * from "./parseWWWAuthenticate";
//# sourceMappingURL=index.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import * as url from "url";
export function parseKeyvaultIdentifier(collection, identifier) {
    if (typeof collection !== "string" || !(collection = collection.trim())) {
        throw new Error("Invalid collection argument");
    }
    if (typeof identifier !== "string" || !(identifier = identifier.trim())) {
        throw new Error("Invalid identifier argument");
    }
    let baseUri;
    try {
        baseUri = url.parse(identifier, true, true);
    }
    catch (e) {
        throw new Error(`Invalid ${collection} identifier: ${identifier}. Not a valid URI`);
    }
    // Path is of the form '/collection/name[/version]'
    const segments = (baseUri.pathname || "").split("/");
    if (segments.length !== 3 && segments.length !== 4) {
        throw new Error(`Invalid ${collection} identifier: ${identifier}. Bad number of segments: ${segments.length}`);
    }
    if (collection !== segments[1]) {
        throw new Error(`Invalid ${collection} identifier: ${identifier}. segment [1] should be "${collection}", found "${segments[1]}"`);
    }
    const vaultUrl = `${baseUri.protocol}//${baseUri.host}`;
    const name = segments[2];
    const version = segments.length === 4 ? segments[3] : undefined;
    return {
        vaultUrl,
        name,
        version,
    };
}
//# sourceMappingURL=parseKeyvaultIdentifier.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * @internal
 *
 * Valid key names in WWW-Authenticate header.
 */
const validParsedWWWAuthenticateProperties = [
    "authorization",
    "authorization_url",
    "resource",
    "scope",
    "tenantId",
];
/**
 * Parses an WWW-Authenticate response.
 * This transforms a string value like:
 * `Bearer authorization="https://some.url/tenantId", resource="https://some.url"`
 * into an object like:
 * `{ authorization: "https://some.url/tenantId", resource: "https://some.url" }`
 * @param wwwAuthenticate - String value in the WWW-Authenticate header
 */
export function parseWWWAuthenticate(wwwAuthenticate) {
    const pairDelimiter = /,? +/;
    const parsed = wwwAuthenticate
        .split(pairDelimiter)
        .reduce((kvPairs, p) => {
        if (p.match(/\w="/)) {
            // 'sampleKey="sample_value"' -> [sampleKey, "sample_value"] -> { sampleKey: sample_value }
            const [key, value] = p.split("=");
            if (validParsedWWWAuthenticateProperties.includes(key)) {
                // The values will be wrapped in quotes, which need to be stripped out.
                return Object.assign(Object.assign({}, kvPairs), { [key]: value.slice(1, -1) });
            }
        }
        return kvPairs;
    }, {});
    // Finally, we pull the tenantId from the authorization header to support multi-tenant authentication.
    if (parsed.authorization) {
        try {
            const tenantId = new URL(parsed.authorization).pathname.substring(1);
            if (tenantId) {
                parsed.tenantId = tenantId;
            }
        }
        catch (_) {
            throw new Error(`The challenge authorization URI '${parsed.authorization}' is invalid.`);
        }
    }
    return parsed;
}
//# sourceMappingURL=parseWWWAuthenticate.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { SpanStatusCode, createSpanFunction } from "@azure/core-tracing";
/**
 * Returns a function that can be used for tracing options.
 *
 * @param prefix - The prefix to use, likely the name of the class / client.
 *
 * @example const withTrace = createTraceFunction("Azure.KeyVault.Certificates.CertificateClient")
 *
 * @internal
 */
export function createTraceFunction(prefix) {
    const createSpan = createSpanFunction({
        namespace: "Microsoft.KeyVault",
        packagePrefix: prefix,
    });
    return async function (operationName, options, cb) {
        const { updatedOptions, span } = createSpan(operationName, options);
        try {
            // NOTE: we really do need to await on this function here so we can handle any exceptions thrown and properly
            // close the span.
            const result = await cb(updatedOptions, span);
            // otel 0.16+ needs this or else the code ends up being set as UNSET
            span.setStatus({
                code: SpanStatusCode.OK,
            });
            return result;
        }
        catch (err) {
            span.setStatus({
                code: SpanStatusCode.ERROR,
                message: err.message,
            });
            throw err;
        }
        finally {
            span.end();
        }
    };
}
//# sourceMappingURL=tracingHelpers.js.map'use strict';

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

var tslib = require('tslib');
var coreHttp = require('@azure/core-http');
var logger$1 = require('@azure/logger');
require('@azure/core-paging');
var url = require('url');
var coreLro = require('@azure/core-lro');
var coreTracing = require('@azure/core-tracing');
var crypto = require('crypto');
var constants = require('constants');

function _interopNamespace(e) {
    if (e && e.__esModule) return e;
    var n = Object.create(null);
    if (e) {
        Object.keys(e).forEach(function (k) {
            if (k !== 'default') {
                var d = Object.getOwnPropertyDescriptor(e, k);
                Object.defineProperty(n, k, d.get ? d : {
                    enumerable: true,
                    get: function () { return e[k]; }
                });
            }
        });
    }
    n["default"] = e;
    return Object.freeze(n);
}

var coreHttp__namespace = /*#__PURE__*/_interopNamespace(coreHttp);
var url__namespace = /*#__PURE__*/_interopNamespace(url);
var crypto__namespace = /*#__PURE__*/_interopNamespace(crypto);

// Copyright (c) Microsoft Corporation.
/**
 * The \@azure/logger configuration for this package.
 */
const logger = logger$1.createClientLogger("keyvault-keys");

/*
 * Copyright (c) Microsoft Corporation.
 * Licensed under the MIT License.
 *
 * Code generated by Microsoft (R) AutoRest Code Generator.
 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
 */
/** Known values of {@link ApiVersion73} that the service accepts. */
var KnownApiVersion73;
(function (KnownApiVersion73) {
    /** Api Version '7.3' */
    KnownApiVersion73["Seven3"] = "7.3";
})(KnownApiVersion73 || (KnownApiVersion73 = {}));
/** Known values of {@link JsonWebKeyType} that the service accepts. */
exports.KnownKeyTypes = void 0;
(function (KnownJsonWebKeyType) {
    /** Elliptic Curve. */
    KnownJsonWebKeyType["EC"] = "EC";
    /** Elliptic Curve with a private key which is stored in the HSM. */
    KnownJsonWebKeyType["ECHSM"] = "EC-HSM";
    /** RSA (https://tools.ietf.org/html/rfc3447) */
    KnownJsonWebKeyType["RSA"] = "RSA";
    /** RSA with a private key which is stored in the HSM. */
    KnownJsonWebKeyType["RSAHSM"] = "RSA-HSM";
    /** Octet sequence (used to represent symmetric keys) */
    KnownJsonWebKeyType["Oct"] = "oct";
    /** Octet sequence (used to represent symmetric keys) which is stored the HSM. */
    KnownJsonWebKeyType["OctHSM"] = "oct-HSM";
})(exports.KnownKeyTypes || (exports.KnownKeyTypes = {}));
/** Known values of {@link JsonWebKeyOperation} that the service accepts. */
var KnownJsonWebKeyOperation;
(function (KnownJsonWebKeyOperation) {
    KnownJsonWebKeyOperation["Encrypt"] = "encrypt";
    KnownJsonWebKeyOperation["Decrypt"] = "decrypt";
    KnownJsonWebKeyOperation["Sign"] = "sign";
    KnownJsonWebKeyOperation["Verify"] = "verify";
    KnownJsonWebKeyOperation["WrapKey"] = "wrapKey";
    KnownJsonWebKeyOperation["UnwrapKey"] = "unwrapKey";
    KnownJsonWebKeyOperation["Import"] = "import";
    KnownJsonWebKeyOperation["Export"] = "export";
})(KnownJsonWebKeyOperation || (KnownJsonWebKeyOperation = {}));
/** Known values of {@link DeletionRecoveryLevel} that the service accepts. */
exports.KnownDeletionRecoveryLevel = void 0;
(function (KnownDeletionRecoveryLevel) {
    /** Denotes a vault state in which deletion is an irreversible operation, without the possibility for recovery. This level corresponds to no protection being available against a Delete operation; the data is irretrievably lost upon accepting a Delete operation at the entity level or higher (vault, resource group, subscription etc.) */
    KnownDeletionRecoveryLevel["Purgeable"] = "Purgeable";
    /** Denotes a vault state in which deletion is recoverable, and which also permits immediate and permanent deletion (i.e. purge). This level guarantees the recoverability of the deleted entity during the retention interval (90 days), unless a Purge operation is requested, or the subscription is cancelled. System wil permanently delete it after 90 days, if not recovered */
    KnownDeletionRecoveryLevel["RecoverablePurgeable"] = "Recoverable+Purgeable";
    /** Denotes a vault state in which deletion is recoverable without the possibility for immediate and permanent deletion (i.e. purge). This level guarantees the recoverability of the deleted entity during the retention interval(90 days) and while the subscription is still available. System wil permanently delete it after 90 days, if not recovered */
    KnownDeletionRecoveryLevel["Recoverable"] = "Recoverable";
    /** Denotes a vault and subscription state in which deletion is recoverable within retention interval (90 days), immediate and permanent deletion (i.e. purge) is not permitted, and in which the subscription itself  cannot be permanently canceled. System wil permanently delete it after 90 days, if not recovered */
    KnownDeletionRecoveryLevel["RecoverableProtectedSubscription"] = "Recoverable+ProtectedSubscription";
    /** Denotes a vault state in which deletion is recoverable, and which also permits immediate and permanent deletion (i.e. purge when 7<= SoftDeleteRetentionInDays < 90). This level guarantees the recoverability of the deleted entity during the retention interval, unless a Purge operation is requested, or the subscription is cancelled. */
    KnownDeletionRecoveryLevel["CustomizedRecoverablePurgeable"] = "CustomizedRecoverable+Purgeable";
    /** Denotes a vault state in which deletion is recoverable without the possibility for immediate and permanent deletion (i.e. purge when 7<= SoftDeleteRetentionInDays < 90).This level guarantees the recoverability of the deleted entity during the retention interval and while the subscription is still available. */
    KnownDeletionRecoveryLevel["CustomizedRecoverable"] = "CustomizedRecoverable";
    /** Denotes a vault and subscription state in which deletion is recoverable, immediate and permanent deletion (i.e. purge) is not permitted, and in which the subscription itself cannot be permanently canceled when 7<= SoftDeleteRetentionInDays < 90. This level guarantees the recoverability of the deleted entity during the retention interval, and also reflects the fact that the subscription itself cannot be cancelled. */
    KnownDeletionRecoveryLevel["CustomizedRecoverableProtectedSubscription"] = "CustomizedRecoverable+ProtectedSubscription";
})(exports.KnownDeletionRecoveryLevel || (exports.KnownDeletionRecoveryLevel = {}));
/** Known values of {@link JsonWebKeyCurveName} that the service accepts. */
exports.KnownKeyCurveNames = void 0;
(function (KnownJsonWebKeyCurveName) {
    /** The NIST P-256 elliptic curve, AKA SECG curve SECP256R1. */
    KnownJsonWebKeyCurveName["P256"] = "P-256";
    /** The NIST P-384 elliptic curve, AKA SECG curve SECP384R1. */
    KnownJsonWebKeyCurveName["P384"] = "P-384";
    /** The NIST P-521 elliptic curve, AKA SECG curve SECP521R1. */
    KnownJsonWebKeyCurveName["P521"] = "P-521";
    /** The SECG SECP256K1 elliptic curve. */
    KnownJsonWebKeyCurveName["P256K"] = "P-256K";
})(exports.KnownKeyCurveNames || (exports.KnownKeyCurveNames = {}));
/** Known values of {@link JsonWebKeyEncryptionAlgorithm} that the service accepts. */
var KnownJsonWebKeyEncryptionAlgorithm;
(function (KnownJsonWebKeyEncryptionAlgorithm) {
    KnownJsonWebKeyEncryptionAlgorithm["RSAOaep"] = "RSA-OAEP";
    KnownJsonWebKeyEncryptionAlgorithm["RSAOaep256"] = "RSA-OAEP-256";
    KnownJsonWebKeyEncryptionAlgorithm["RSA15"] = "RSA1_5";
    KnownJsonWebKeyEncryptionAlgorithm["A128GCM"] = "A128GCM";
    KnownJsonWebKeyEncryptionAlgorithm["A192GCM"] = "A192GCM";
    KnownJsonWebKeyEncryptionAlgorithm["A256GCM"] = "A256GCM";
    KnownJsonWebKeyEncryptionAlgorithm["A128KW"] = "A128KW";
    KnownJsonWebKeyEncryptionAlgorithm["A192KW"] = "A192KW";
    KnownJsonWebKeyEncryptionAlgorithm["A256KW"] = "A256KW";
    KnownJsonWebKeyEncryptionAlgorithm["A128CBC"] = "A128CBC";
    KnownJsonWebKeyEncryptionAlgorithm["A192CBC"] = "A192CBC";
    KnownJsonWebKeyEncryptionAlgorithm["A256CBC"] = "A256CBC";
    KnownJsonWebKeyEncryptionAlgorithm["A128Cbcpad"] = "A128CBCPAD";
    KnownJsonWebKeyEncryptionAlgorithm["A192Cbcpad"] = "A192CBCPAD";
    KnownJsonWebKeyEncryptionAlgorithm["A256Cbcpad"] = "A256CBCPAD";
})(KnownJsonWebKeyEncryptionAlgorithm || (KnownJsonWebKeyEncryptionAlgorithm = {}));
/** Known values of {@link JsonWebKeySignatureAlgorithm} that the service accepts. */
exports.KnownSignatureAlgorithms = void 0;
(function (KnownJsonWebKeySignatureAlgorithm) {
    /** RSASSA-PSS using SHA-256 and MGF1 with SHA-256, as described in https://tools.ietf.org/html/rfc7518 */
    KnownJsonWebKeySignatureAlgorithm["PS256"] = "PS256";
    /** RSASSA-PSS using SHA-384 and MGF1 with SHA-384, as described in https://tools.ietf.org/html/rfc7518 */
    KnownJsonWebKeySignatureAlgorithm["PS384"] = "PS384";
    /** RSASSA-PSS using SHA-512 and MGF1 with SHA-512, as described in https://tools.ietf.org/html/rfc7518 */
    KnownJsonWebKeySignatureAlgorithm["PS512"] = "PS512";
    /** RSASSA-PKCS1-v1_5 using SHA-256, as described in https://tools.ietf.org/html/rfc7518 */
    KnownJsonWebKeySignatureAlgorithm["RS256"] = "RS256";
    /** RSASSA-PKCS1-v1_5 using SHA-384, as described in https://tools.ietf.org/html/rfc7518 */
    KnownJsonWebKeySignatureAlgorithm["RS384"] = "RS384";
    /** RSASSA-PKCS1-v1_5 using SHA-512, as described in https://tools.ietf.org/html/rfc7518 */
    KnownJsonWebKeySignatureAlgorithm["RS512"] = "RS512";
    /** Reserved */
    KnownJsonWebKeySignatureAlgorithm["Rsnull"] = "RSNULL";
    /** ECDSA using P-256 and SHA-256, as described in https://tools.ietf.org/html/rfc7518. */
    KnownJsonWebKeySignatureAlgorithm["ES256"] = "ES256";
    /** ECDSA using P-384 and SHA-384, as described in https://tools.ietf.org/html/rfc7518 */
    KnownJsonWebKeySignatureAlgorithm["ES384"] = "ES384";
    /** ECDSA using P-521 and SHA-512, as described in https://tools.ietf.org/html/rfc7518 */
    KnownJsonWebKeySignatureAlgorithm["ES512"] = "ES512";
    /** ECDSA using P-256K and SHA-256, as described in https://tools.ietf.org/html/rfc7518 */
    KnownJsonWebKeySignatureAlgorithm["ES256K"] = "ES256K";
})(exports.KnownSignatureAlgorithms || (exports.KnownSignatureAlgorithms = {}));
/** Known values of {@link KeyEncryptionAlgorithm} that the service accepts. */
var KnownKeyEncryptionAlgorithm;
(function (KnownKeyEncryptionAlgorithm) {
    KnownKeyEncryptionAlgorithm["CKMRSAAESKEYWrap"] = "CKM_RSA_AES_KEY_WRAP";
    KnownKeyEncryptionAlgorithm["RSAAESKEYWrap256"] = "RSA_AES_KEY_WRAP_256";
    KnownKeyEncryptionAlgorithm["RSAAESKEYWrap384"] = "RSA_AES_KEY_WRAP_384";
})(KnownKeyEncryptionAlgorithm || (KnownKeyEncryptionAlgorithm = {}));

/*
 * Copyright (c) Microsoft Corporation.
 * Licensed under the MIT License.
 *
 * Code generated by Microsoft (R) AutoRest Code Generator.
 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
 */
const KeyCreateParameters = {
    type: {
        name: "Composite",
        className: "KeyCreateParameters",
        modelProperties: {
            kty: {
                serializedName: "kty",
                required: true,
                type: {
                    name: "String"
                }
            },
            keySize: {
                serializedName: "key_size",
                type: {
                    name: "Number"
                }
            },
            publicExponent: {
                serializedName: "public_exponent",
                type: {
                    name: "Number"
                }
            },
            keyOps: {
                serializedName: "key_ops",
                type: {
                    name: "Sequence",
                    element: {
                        type: {
                            name: "String"
                        }
                    }
                }
            },
            keyAttributes: {
                serializedName: "attributes",
                type: {
                    name: "Composite",
                    className: "KeyAttributes"
                }
            },
            tags: {
                serializedName: "tags",
                type: {
                    name: "Dictionary",
                    value: { type: { name: "String" } }
                }
            },
            curve: {
                serializedName: "crv",
                type: {
                    name: "String"
                }
            },
            releasePolicy: {
                serializedName: "release_policy",
                type: {
                    name: "Composite",
                    className: "KeyReleasePolicy"
                }
            }
        }
    }
};
const Attributes = {
    type: {
        name: "Composite",
        className: "Attributes",
        modelProperties: {
            enabled: {
                serializedName: "enabled",
                type: {
                    name: "Boolean"
                }
            },
            notBefore: {
                serializedName: "nbf",
                type: {
                    name: "UnixTime"
                }
            },
            expires: {
                serializedName: "exp",
                type: {
                    name: "UnixTime"
                }
            },
            created: {
                serializedName: "created",
                readOnly: true,
                type: {
                    name: "UnixTime"
                }
            },
            updated: {
                serializedName: "updated",
                readOnly: true,
                type: {
                    name: "UnixTime"
                }
            }
        }
    }
};
const KeyReleasePolicy = {
    type: {
        name: "Composite",
        className: "KeyReleasePolicy",
        modelProperties: {
            contentType: {
                defaultValue: "application/json; charset=utf-8",
                serializedName: "contentType",
                type: {
                    name: "String"
                }
            },
            immutable: {
                serializedName: "immutable",
                type: {
                    name: "Boolean"
                }
            },
            encodedPolicy: {
                serializedName: "data",
                type: {
                    name: "Base64Url"
                }
            }
        }
    }
};
const KeyBundle = {
    type: {
        name: "Composite",
        className: "KeyBundle",
        modelProperties: {
            key: {
                serializedName: "key",
                type: {
                    name: "Composite",
                    className: "JsonWebKey"
                }
            },
            attributes: {
                serializedName: "attributes",
                type: {
                    name: "Composite",
                    className: "KeyAttributes"
                }
            },
            tags: {
                serializedName: "tags",
                type: {
                    name: "Dictionary",
                    value: { type: { name: "String" } }
                }
            },
            managed: {
                serializedName: "managed",
                readOnly: true,
                type: {
                    name: "Boolean"
                }
            },
            releasePolicy: {
                serializedName: "release_policy",
                type: {
                    name: "Composite",
                    className: "KeyReleasePolicy"
                }
            }
        }
    }
};
const JsonWebKey = {
    type: {
        name: "Composite",
        className: "JsonWebKey",
        modelProperties: {
            kid: {
                serializedName: "kid",
                type: {
                    name: "String"
                }
            },
            kty: {
                serializedName: "kty",
                type: {
                    name: "String"
                }
            },
            keyOps: {
                serializedName: "key_ops",
                type: {
                    name: "Sequence",
                    element: {
                        type: {
                            name: "String"
                        }
                    }
                }
            },
            n: {
                serializedName: "n",
                type: {
                    name: "Base64Url"
                }
            },
            e: {
                serializedName: "e",
                type: {
                    name: "Base64Url"
                }
            },
            d: {
                serializedName: "d",
                type: {
                    name: "Base64Url"
                }
            },
            dp: {
                serializedName: "dp",
                type: {
                    name: "Base64Url"
                }
            },
            dq: {
                serializedName: "dq",
                type: {
                    name: "Base64Url"
                }
            },
            qi: {
                serializedName: "qi",
                type: {
                    name: "Base64Url"
                }
            },
            p: {
                serializedName: "p",
                type: {
                    name: "Base64Url"
                }
            },
            q: {
                serializedName: "q",
                type: {
                    name: "Base64Url"
                }
            },
            k: {
                serializedName: "k",
                type: {
                    name: "Base64Url"
                }
            },
            t: {
                serializedName: "key_hsm",
                type: {
                    name: "Base64Url"
                }
            },
            crv: {
                serializedName: "crv",
                type: {
                    name: "String"
                }
            },
            x: {
                serializedName: "x",
                type: {
                    name: "Base64Url"
                }
            },
            y: {
                serializedName: "y",
                type: {
                    name: "Base64Url"
                }
            }
        }
    }
};
const KeyVaultError = {
    type: {
        name: "Composite",
        className: "KeyVaultError",
        modelProperties: {
            error: {
                serializedName: "error",
                type: {
                    name: "Composite",
                    className: "ErrorModel"
                }
            }
        }
    }
};
const ErrorModel = {
    type: {
        name: "Composite",
        className: "ErrorModel",
        modelProperties: {
            code: {
                serializedName: "code",
                readOnly: true,
                type: {
                    name: "String"
                }
            },
            message: {
                serializedName: "message",
                readOnly: true,
                type: {
                    name: "String"
                }
            },
            innerError: {
                serializedName: "innererror",
                type: {
                    name: "Composite",
                    className: "ErrorModel"
                }
            }
        }
    }
};
const KeyImportParameters = {
    type: {
        name: "Composite",
        className: "KeyImportParameters",
        modelProperties: {
            hsm: {
                serializedName: "Hsm",
                type: {
                    name: "Boolean"
                }
            },
            key: {
                serializedName: "key",
                type: {
                    name: "Composite",
                    className: "JsonWebKey"
                }
            },
            keyAttributes: {
                serializedName: "attributes",
                type: {
                    name: "Composite",
                    className: "KeyAttributes"
                }
            },
            tags: {
                serializedName: "tags",
                type: {
                    name: "Dictionary",
                    value: { type: { name: "String" } }
                }
            },
            releasePolicy: {
                serializedName: "release_policy",
                type: {
                    name: "Composite",
                    className: "KeyReleasePolicy"
                }
            }
        }
    }
};
const KeyUpdateParameters = {
    type: {
        name: "Composite",
        className: "KeyUpdateParameters",
        modelProperties: {
            keyOps: {
                serializedName: "key_ops",
                type: {
                    name: "Sequence",
                    element: {
                        type: {
                            name: "String"
                        }
                    }
                }
            },
            keyAttributes: {
                serializedName: "attributes",
                type: {
                    name: "Composite",
                    className: "KeyAttributes"
                }
            },
            tags: {
                serializedName: "tags",
                type: {
                    name: "Dictionary",
                    value: { type: { name: "String" } }
                }
            },
            releasePolicy: {
                serializedName: "release_policy",
                type: {
                    name: "Composite",
                    className: "KeyReleasePolicy"
                }
            }
        }
    }
};
const KeyListResult = {
    type: {
        name: "Composite",
        className: "KeyListResult",
        modelProperties: {
            value: {
                serializedName: "value",
                readOnly: true,
                type: {
                    name: "Sequence",
                    element: {
                        type: {
                            name: "Composite",
                            className: "KeyItem"
                        }
                    }
                }
            },
            nextLink: {
                serializedName: "nextLink",
                readOnly: true,
                type: {
                    name: "String"
                }
            }
        }
    }
};
const KeyItem = {
    type: {
        name: "Composite",
        className: "KeyItem",
        modelProperties: {
            kid: {
                serializedName: "kid",
                type: {
                    name: "String"
                }
            },
            attributes: {
                serializedName: "attributes",
                type: {
                    name: "Composite",
                    className: "KeyAttributes"
                }
            },
            tags: {
                serializedName: "tags",
                type: {
                    name: "Dictionary",
                    value: { type: { name: "String" } }
                }
            },
            managed: {
                serializedName: "managed",
                readOnly: true,
                type: {
                    name: "Boolean"
                }
            }
        }
    }
};
const BackupKeyResult = {
    type: {
        name: "Composite",
        className: "BackupKeyResult",
        modelProperties: {
            value: {
                serializedName: "value",
                readOnly: true,
                type: {
                    name: "Base64Url"
                }
            }
        }
    }
};
const KeyRestoreParameters = {
    type: {
        name: "Composite",
        className: "KeyRestoreParameters",
        modelProperties: {
            keyBundleBackup: {
                serializedName: "value",
                required: true,
                type: {
                    name: "Base64Url"
                }
            }
        }
    }
};
const KeyOperationsParameters = {
    type: {
        name: "Composite",
        className: "KeyOperationsParameters",
        modelProperties: {
            algorithm: {
                serializedName: "alg",
                required: true,
                type: {
                    name: "String"
                }
            },
            value: {
                serializedName: "value",
                required: true,
                type: {
                    name: "Base64Url"
                }
            },
            iv: {
                serializedName: "iv",
                type: {
                    name: "Base64Url"
                }
            },
            additionalAuthenticatedData: {
                serializedName: "aad",
                type: {
                    name: "Base64Url"
                }
            },
            authenticationTag: {
                serializedName: "tag",
                type: {
                    name: "Base64Url"
                }
            }
        }
    }
};
const KeyOperationResult = {
    type: {
        name: "Composite",
        className: "KeyOperationResult",
        modelProperties: {
            kid: {
                serializedName: "kid",
                readOnly: true,
                type: {
                    name: "String"
                }
            },
            result: {
                serializedName: "value",
                readOnly: true,
                type: {
                    name: "Base64Url"
                }
            },
            iv: {
                serializedName: "iv",
                readOnly: true,
                type: {
                    name: "Base64Url"
                }
            },
            authenticationTag: {
                serializedName: "tag",
                readOnly: true,
                type: {
                    name: "Base64Url"
                }
            },
            additionalAuthenticatedData: {
                serializedName: "aad",
                readOnly: true,
                type: {
                    name: "Base64Url"
                }
            }
        }
    }
};
const KeySignParameters = {
    type: {
        name: "Composite",
        className: "KeySignParameters",
        modelProperties: {
            algorithm: {
                serializedName: "alg",
                required: true,
                type: {
                    name: "String"
                }
            },
            value: {
                serializedName: "value",
                required: true,
                type: {
                    name: "Base64Url"
                }
            }
        }
    }
};
const KeyVerifyParameters = {
    type: {
        name: "Composite",
        className: "KeyVerifyParameters",
        modelProperties: {
            algorithm: {
                serializedName: "alg",
                required: true,
                type: {
                    name: "String"
                }
            },
            digest: {
                serializedName: "digest",
                required: true,
                type: {
                    name: "Base64Url"
                }
            },
            signature: {
                serializedName: "value",
                required: true,
                type: {
                    name: "Base64Url"
                }
            }
        }
    }
};
const KeyVerifyResult = {
    type: {
        name: "Composite",
        className: "KeyVerifyResult",
        modelProperties: {
            value: {
                serializedName: "value",
                readOnly: true,
                type: {
                    name: "Boolean"
                }
            }
        }
    }
};
const KeyReleaseParameters = {
    type: {
        name: "Composite",
        className: "KeyReleaseParameters",
        modelProperties: {
            targetAttestationToken: {
                constraints: {
                    MinLength: 1
                },
                serializedName: "target",
                required: true,
                type: {
                    name: "String"
                }
            },
            nonce: {
                serializedName: "nonce",
                type: {
                    name: "String"
                }
            },
            enc: {
                serializedName: "enc",
                type: {
                    name: "String"
                }
            }
        }
    }
};
const KeyReleaseResult = {
    type: {
        name: "Composite",
        className: "KeyReleaseResult",
        modelProperties: {
            value: {
                serializedName: "value",
                readOnly: true,
                type: {
                    name: "String"
                }
            }
        }
    }
};
const DeletedKeyListResult = {
    type: {
        name: "Composite",
        className: "DeletedKeyListResult",
        modelProperties: {
            value: {
                serializedName: "value",
                readOnly: true,
                type: {
                    name: "Sequence",
                    element: {
                        type: {
                            name: "Composite",
                            className: "DeletedKeyItem"
                        }
                    }
                }
            },
            nextLink: {
                serializedName: "nextLink",
                readOnly: true,
                type: {
                    name: "String"
                }
            }
        }
    }
};
const KeyRotationPolicy = {
    type: {
        name: "Composite",
        className: "KeyRotationPolicy",
        modelProperties: {
            id: {
                serializedName: "id",
                readOnly: true,
                type: {
                    name: "String"
                }
            },
            lifetimeActions: {
                serializedName: "lifetimeActions",
                type: {
                    name: "Sequence",
                    element: {
                        type: {
                            name: "Composite",
                            className: "LifetimeActions"
                        }
                    }
                }
            },
            attributes: {
                serializedName: "attributes",
                type: {
                    name: "Composite",
                    className: "KeyRotationPolicyAttributes"
                }
            }
        }
    }
};
const LifetimeActions = {
    type: {
        name: "Composite",
        className: "LifetimeActions",
        modelProperties: {
            trigger: {
                serializedName: "trigger",
                type: {
                    name: "Composite",
                    className: "LifetimeActionsTrigger"
                }
            },
            action: {
                serializedName: "action",
                type: {
                    name: "Composite",
                    className: "LifetimeActionsType"
                }
            }
        }
    }
};
const LifetimeActionsTrigger = {
    type: {
        name: "Composite",
        className: "LifetimeActionsTrigger",
        modelProperties: {
            timeAfterCreate: {
                serializedName: "timeAfterCreate",
                type: {
                    name: "String"
                }
            },
            timeBeforeExpiry: {
                serializedName: "timeBeforeExpiry",
                type: {
                    name: "String"
                }
            }
        }
    }
};
const LifetimeActionsType = {
    type: {
        name: "Composite",
        className: "LifetimeActionsType",
        modelProperties: {
            type: {
                serializedName: "type",
                type: {
                    name: "Enum",
                    allowedValues: ["Rotate", "Notify"]
                }
            }
        }
    }
};
const KeyRotationPolicyAttributes = {
    type: {
        name: "Composite",
        className: "KeyRotationPolicyAttributes",
        modelProperties: {
            expiryTime: {
                serializedName: "expiryTime",
                type: {
                    name: "String"
                }
            },
            created: {
                serializedName: "created",
                readOnly: true,
                type: {
                    name: "UnixTime"
                }
            },
            updated: {
                serializedName: "updated",
                readOnly: true,
                type: {
                    name: "UnixTime"
                }
            }
        }
    }
};
const GetRandomBytesRequest = {
    type: {
        name: "Composite",
        className: "GetRandomBytesRequest",
        modelProperties: {
            count: {
                constraints: {
                    InclusiveMaximum: 128,
                    InclusiveMinimum: 1
                },
                serializedName: "count",
                required: true,
                type: {
                    name: "Number"
                }
            }
        }
    }
};
const RandomBytes = {
    type: {
        name: "Composite",
        className: "RandomBytes",
        modelProperties: {
            value: {
                serializedName: "value",
                required: true,
                type: {
                    name: "Base64Url"
                }
            }
        }
    }
};
const KeyProperties = {
    type: {
        name: "Composite",
        className: "KeyProperties",
        modelProperties: {
            exportable: {
                serializedName: "exportable",
                type: {
                    name: "Boolean"
                }
            },
            keyType: {
                serializedName: "kty",
                type: {
                    name: "String"
                }
            },
            keySize: {
                serializedName: "key_size",
                type: {
                    name: "Number"
                }
            },
            reuseKey: {
                serializedName: "reuse_key",
                type: {
                    name: "Boolean"
                }
            },
            curve: {
                serializedName: "crv",
                type: {
                    name: "String"
                }
            }
        }
    }
};
const KeyExportParameters = {
    type: {
        name: "Composite",
        className: "KeyExportParameters",
        modelProperties: {
            wrappingKey: {
                serializedName: "wrappingKey",
                type: {
                    name: "Composite",
                    className: "JsonWebKey"
                }
            },
            wrappingKid: {
                serializedName: "wrappingKid",
                type: {
                    name: "String"
                }
            },
            enc: {
                serializedName: "enc",
                type: {
                    name: "String"
                }
            }
        }
    }
};
const KeyAttributes = {
    type: {
        name: "Composite",
        className: "KeyAttributes",
        modelProperties: Object.assign(Object.assign({}, Attributes.type.modelProperties), { recoverableDays: {
                serializedName: "recoverableDays",
                readOnly: true,
                type: {
                    name: "Number"
                }
            }, recoveryLevel: {
                serializedName: "recoveryLevel",
                readOnly: true,
                type: {
                    name: "String"
                }
            }, exportable: {
                serializedName: "exportable",
                type: {
                    name: "Boolean"
                }
            } })
    }
};
const DeletedKeyBundle = {
    type: {
        name: "Composite",
        className: "DeletedKeyBundle",
        modelProperties: Object.assign(Object.assign({}, KeyBundle.type.modelProperties), { recoveryId: {
                serializedName: "recoveryId",
                type: {
                    name: "String"
                }
            }, scheduledPurgeDate: {
                serializedName: "scheduledPurgeDate",
                readOnly: true,
                type: {
                    name: "UnixTime"
                }
            }, deletedDate: {
                serializedName: "deletedDate",
                readOnly: true,
                type: {
                    name: "UnixTime"
                }
            } })
    }
};
const DeletedKeyItem = {
    type: {
        name: "Composite",
        className: "DeletedKeyItem",
        modelProperties: Object.assign(Object.assign({}, KeyItem.type.modelProperties), { recoveryId: {
                serializedName: "recoveryId",
                type: {
                    name: "String"
                }
            }, scheduledPurgeDate: {
                serializedName: "scheduledPurgeDate",
                readOnly: true,
                type: {
                    name: "UnixTime"
                }
            }, deletedDate: {
                serializedName: "deletedDate",
                readOnly: true,
                type: {
                    name: "UnixTime"
                }
            } })
    }
};

var Mappers = /*#__PURE__*/Object.freeze({
    __proto__: null,
    KeyCreateParameters: KeyCreateParameters,
    Attributes: Attributes,
    KeyReleasePolicy: KeyReleasePolicy,
    KeyBundle: KeyBundle,
    JsonWebKey: JsonWebKey,
    KeyVaultError: KeyVaultError,
    ErrorModel: ErrorModel,
    KeyImportParameters: KeyImportParameters,
    KeyUpdateParameters: KeyUpdateParameters,
    KeyListResult: KeyListResult,
    KeyItem: KeyItem,
    BackupKeyResult: BackupKeyResult,
    KeyRestoreParameters: KeyRestoreParameters,
    KeyOperationsParameters: KeyOperationsParameters,
    KeyOperationResult: KeyOperationResult,
    KeySignParameters: KeySignParameters,
    KeyVerifyParameters: KeyVerifyParameters,
    KeyVerifyResult: KeyVerifyResult,
    KeyReleaseParameters: KeyReleaseParameters,
    KeyReleaseResult: KeyReleaseResult,
    DeletedKeyListResult: DeletedKeyListResult,
    KeyRotationPolicy: KeyRotationPolicy,
    LifetimeActions: LifetimeActions,
    LifetimeActionsTrigger: LifetimeActionsTrigger,
    LifetimeActionsType: LifetimeActionsType,
    KeyRotationPolicyAttributes: KeyRotationPolicyAttributes,
    GetRandomBytesRequest: GetRandomBytesRequest,
    RandomBytes: RandomBytes,
    KeyProperties: KeyProperties,
    KeyExportParameters: KeyExportParameters,
    KeyAttributes: KeyAttributes,
    DeletedKeyBundle: DeletedKeyBundle,
    DeletedKeyItem: DeletedKeyItem
});

/*
 * Copyright (c) Microsoft Corporation.
 * Licensed under the MIT License.
 *
 * Code generated by Microsoft (R) AutoRest Code Generator.
 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
 */
const contentType = {
    parameterPath: ["options", "contentType"],
    mapper: {
        defaultValue: "application/json",
        isConstant: true,
        serializedName: "Content-Type",
        type: {
            name: "String"
        }
    }
};
const accept = {
    parameterPath: "accept",
    mapper: {
        defaultValue: "application/json",
        isConstant: true,
        serializedName: "Accept",
        type: {
            name: "String"
        }
    }
};
const vaultBaseUrl = {
    parameterPath: "vaultBaseUrl",
    mapper: {
        serializedName: "vaultBaseUrl",
        required: true,
        type: {
            name: "String"
        }
    },
    skipEncoding: true
};
const keyName = {
    parameterPath: "keyName",
    mapper: {
        constraints: {
            Pattern: new RegExp("^[0-9a-zA-Z-]+$")
        },
        serializedName: "key-name",
        required: true,
        type: {
            name: "String"
        }
    }
};
const apiVersion = {
    parameterPath: "apiVersion",
    mapper: {
        serializedName: "api-version",
        required: true,
        type: {
            name: "String"
        }
    }
};
const keyName1 = {
    parameterPath: "keyName",
    mapper: {
        serializedName: "key-name",
        required: true,
        type: {
            name: "String"
        }
    }
};
const keyVersion = {
    parameterPath: "keyVersion",
    mapper: {
        serializedName: "key-version",
        required: true,
        type: {
            name: "String"
        }
    }
};
const maxresults = {
    parameterPath: ["options", "maxresults"],
    mapper: {
        constraints: {
            InclusiveMaximum: 25,
            InclusiveMinimum: 1
        },
        serializedName: "maxresults",
        type: {
            name: "Number"
        }
    }
};
const keyRotationPolicy = {
    parameterPath: "keyRotationPolicy",
    mapper: KeyRotationPolicy
};
const nextLink = {
    parameterPath: "nextLink",
    mapper: {
        serializedName: "nextLink",
        required: true,
        type: {
            name: "String"
        }
    },
    skipEncoding: true
};

/*
 * Copyright (c) Microsoft Corporation.
 * Licensed under the MIT License.
 *
 * Code generated by Microsoft (R) AutoRest Code Generator.
 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
 */
const packageName = "@azure/keyvault-keys";
const packageVersion = "4.4.0";
class KeyVaultClientContext extends coreHttp__namespace.ServiceClient {
    /**
     * Initializes a new instance of the KeyVaultClientContext class.
     * @param apiVersion Api Version
     * @param options The parameter options
     */
    constructor(apiVersion, options) {
        if (apiVersion === undefined) {
            throw new Error("'apiVersion' cannot be null");
        }
        // Initializing default values for options
        if (!options) {
            options = {};
        }
        const defaultUserAgent = `azsdk-js-${packageName.replace(/@.*\//, "")}/${packageVersion} ${coreHttp__namespace.getDefaultUserAgentValue()}`;
        super(undefined, Object.assign(Object.assign({}, options), { userAgent: options.userAgent
                ? `${options.userAgent} ${defaultUserAgent}`
                : `${defaultUserAgent}` }));
        this.requestContentType = "application/json; charset=utf-8";
        this.baseUri = options.endpoint || "{vaultBaseUrl}";
        // Parameter assignments
        this.apiVersion = apiVersion;
    }
}

/*
 * Copyright (c) Microsoft Corporation.
 * Licensed under the MIT License.
 *
 * Code generated by Microsoft (R) AutoRest Code Generator.
 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
 */
class KeyVaultClient extends KeyVaultClientContext {
    /**
     * Initializes a new instance of the KeyVaultClient class.
     * @param apiVersion Api Version
     * @param options The parameter options
     */
    constructor(apiVersion, options) {
        super(apiVersion, options);
    }
    /**
     * The create key operation can be used to create any key type in Azure Key Vault. If the named key
     * already exists, Azure Key Vault creates a new version of the key. It requires the keys/create
     * permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name for the new key. The system will generate the version name for the new key.
     * @param kty The type of key to create. For valid values, see JsonWebKeyType.
     * @param options The options parameters.
     */
    createKey(vaultBaseUrl, keyName, kty, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            kty,
            options: coreHttp__namespace.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, createKeyOperationSpec);
    }
    /**
     * The operation will rotate the key based on the key policy. It requires the keys/rotate permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of key to be rotated. The system will generate a new version in the
     *                specified key.
     * @param options The options parameters.
     */
    rotateKey(vaultBaseUrl, keyName, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            options: coreHttp__namespace.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, rotateKeyOperationSpec);
    }
    /**
     * The import key operation may be used to import any key type into an Azure Key Vault. If the named
     * key already exists, Azure Key Vault creates a new version of the key. This operation requires the
     * keys/import permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName Name for the imported key.
     * @param key The Json web key
     * @param options The options parameters.
     */
    importKey(vaultBaseUrl, keyName, key, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            key,
            options: coreHttp__namespace.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, importKeyOperationSpec);
    }
    /**
     * The delete key operation cannot be used to remove individual versions of a key. This operation
     * removes the cryptographic material associated with the key, which means the key is not usable for
     * Sign/Verify, Wrap/Unwrap or Encrypt/Decrypt operations. This operation requires the keys/delete
     * permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key to delete.
     * @param options The options parameters.
     */
    deleteKey(vaultBaseUrl, keyName, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            options: coreHttp__namespace.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, deleteKeyOperationSpec);
    }
    /**
     * In order to perform this operation, the key must already exist in the Key Vault. Note: The
     * cryptographic material of a key itself cannot be changed. This operation requires the keys/update
     * permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of key to update.
     * @param keyVersion The version of the key to update.
     * @param options The options parameters.
     */
    updateKey(vaultBaseUrl, keyName, keyVersion, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            keyVersion,
            options: coreHttp__namespace.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, updateKeyOperationSpec);
    }
    /**
     * The get key operation is applicable to all key types. If the requested key is symmetric, then no key
     * material is released in the response. This operation requires the keys/get permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key to get.
     * @param keyVersion Adding the version parameter retrieves a specific version of a key. This URI
     *                   fragment is optional. If not specified, the latest version of the key is returned.
     * @param options The options parameters.
     */
    getKey(vaultBaseUrl, keyName, keyVersion, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            keyVersion,
            options: coreHttp__namespace.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, getKeyOperationSpec);
    }
    /**
     * The full key identifier, attributes, and tags are provided in the response. This operation requires
     * the keys/list permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key.
     * @param options The options parameters.
     */
    getKeyVersions(vaultBaseUrl, keyName, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            options: coreHttp__namespace.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, getKeyVersionsOperationSpec);
    }
    /**
     * Retrieves a list of the keys in the Key Vault as JSON Web Key structures that contain the public
     * part of a stored key. The LIST operation is applicable to all key types, however only the base key
     * identifier, attributes, and tags are provided in the response. Individual versions of a key are not
     * listed in the response. This operation requires the keys/list permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param options The options parameters.
     */
    getKeys(vaultBaseUrl, options) {
        const operationArguments = {
            vaultBaseUrl,
            options: coreHttp__namespace.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, getKeysOperationSpec);
    }
    /**
     * The Key Backup operation exports a key from Azure Key Vault in a protected form. Note that this
     * operation does NOT return key material in a form that can be used outside the Azure Key Vault
     * system, the returned key material is either protected to a Azure Key Vault HSM or to Azure Key Vault
     * itself. The intent of this operation is to allow a client to GENERATE a key in one Azure Key Vault
     * instance, BACKUP the key, and then RESTORE it into another Azure Key Vault instance. The BACKUP
     * operation may be used to export, in protected form, any key type from Azure Key Vault. Individual
     * versions of a key cannot be backed up. BACKUP / RESTORE can be performed within geographical
     * boundaries only; meaning that a BACKUP from one geographical area cannot be restored to another
     * geographical area. For example, a backup from the US geographical area cannot be restored in an EU
     * geographical area. This operation requires the key/backup permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key.
     * @param options The options parameters.
     */
    backupKey(vaultBaseUrl, keyName, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            options: coreHttp__namespace.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, backupKeyOperationSpec);
    }
    /**
     * Imports a previously backed up key into Azure Key Vault, restoring the key, its key identifier,
     * attributes and access control policies. The RESTORE operation may be used to import a previously
     * backed up key. Individual versions of a key cannot be restored. The key is restored in its entirety
     * with the same key name as it had when it was backed up. If the key name is not available in the
     * target Key Vault, the RESTORE operation will be rejected. While the key name is retained during
     * restore, the final key identifier will change if the key is restored to a different vault. Restore
     * will restore all versions and preserve version identifiers. The RESTORE operation is subject to
     * security constraints: The target Key Vault must be owned by the same Microsoft Azure Subscription as
     * the source Key Vault The user must have RESTORE permission in the target Key Vault. This operation
     * requires the keys/restore permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyBundleBackup The backup blob associated with a key bundle.
     * @param options The options parameters.
     */
    restoreKey(vaultBaseUrl, keyBundleBackup, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyBundleBackup,
            options: coreHttp__namespace.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, restoreKeyOperationSpec);
    }
    /**
     * The ENCRYPT operation encrypts an arbitrary sequence of bytes using an encryption key that is stored
     * in Azure Key Vault. Note that the ENCRYPT operation only supports a single block of data, the size
     * of which is dependent on the target key and the encryption algorithm to be used. The ENCRYPT
     * operation is only strictly necessary for symmetric keys stored in Azure Key Vault since protection
     * with an asymmetric key can be performed using public portion of the key. This operation is supported
     * for asymmetric keys as a convenience for callers that have a key-reference but do not have access to
     * the public key material. This operation requires the keys/encrypt permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key.
     * @param keyVersion The version of the key.
     * @param algorithm algorithm identifier
     * @param value
     * @param options The options parameters.
     */
    encrypt(vaultBaseUrl, keyName, keyVersion, algorithm, value, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            keyVersion,
            algorithm,
            value,
            options: coreHttp__namespace.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, encryptOperationSpec);
    }
    /**
     * The DECRYPT operation decrypts a well-formed block of ciphertext using the target encryption key and
     * specified algorithm. This operation is the reverse of the ENCRYPT operation; only a single block of
     * data may be decrypted, the size of this block is dependent on the target key and the algorithm to be
     * used. The DECRYPT operation applies to asymmetric and symmetric keys stored in Azure Key Vault since
     * it uses the private portion of the key. This operation requires the keys/decrypt permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key.
     * @param keyVersion The version of the key.
     * @param algorithm algorithm identifier
     * @param value
     * @param options The options parameters.
     */
    decrypt(vaultBaseUrl, keyName, keyVersion, algorithm, value, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            keyVersion,
            algorithm,
            value,
            options: coreHttp__namespace.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, decryptOperationSpec);
    }
    /**
     * The SIGN operation is applicable to asymmetric and symmetric keys stored in Azure Key Vault since
     * this operation uses the private portion of the key. This operation requires the keys/sign
     * permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key.
     * @param keyVersion The version of the key.
     * @param algorithm The signing/verification algorithm identifier. For more information on possible
     *                  algorithm types, see JsonWebKeySignatureAlgorithm.
     * @param value
     * @param options The options parameters.
     */
    sign(vaultBaseUrl, keyName, keyVersion, algorithm, value, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            keyVersion,
            algorithm,
            value,
            options: coreHttp__namespace.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, signOperationSpec);
    }
    /**
     * The VERIFY operation is applicable to symmetric keys stored in Azure Key Vault. VERIFY is not
     * strictly necessary for asymmetric keys stored in Azure Key Vault since signature verification can be
     * performed using the public portion of the key but this operation is supported as a convenience for
     * callers that only have a key-reference and not the public portion of the key. This operation
     * requires the keys/verify permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key.
     * @param keyVersion The version of the key.
     * @param algorithm The signing/verification algorithm. For more information on possible algorithm
     *                  types, see JsonWebKeySignatureAlgorithm.
     * @param digest The digest used for signing.
     * @param signature The signature to be verified.
     * @param options The options parameters.
     */
    verify(vaultBaseUrl, keyName, keyVersion, algorithm, digest, signature, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            keyVersion,
            algorithm,
            digest,
            signature,
            options: coreHttp__namespace.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, verifyOperationSpec);
    }
    /**
     * The WRAP operation supports encryption of a symmetric key using a key encryption key that has
     * previously been stored in an Azure Key Vault. The WRAP operation is only strictly necessary for
     * symmetric keys stored in Azure Key Vault since protection with an asymmetric key can be performed
     * using the public portion of the key. This operation is supported for asymmetric keys as a
     * convenience for callers that have a key-reference but do not have access to the public key material.
     * This operation requires the keys/wrapKey permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key.
     * @param keyVersion The version of the key.
     * @param algorithm algorithm identifier
     * @param value
     * @param options The options parameters.
     */
    wrapKey(vaultBaseUrl, keyName, keyVersion, algorithm, value, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            keyVersion,
            algorithm,
            value,
            options: coreHttp__namespace.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, wrapKeyOperationSpec);
    }
    /**
     * The UNWRAP operation supports decryption of a symmetric key using the target key encryption key.
     * This operation is the reverse of the WRAP operation. The UNWRAP operation applies to asymmetric and
     * symmetric keys stored in Azure Key Vault since it uses the private portion of the key. This
     * operation requires the keys/unwrapKey permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key.
     * @param keyVersion The version of the key.
     * @param algorithm algorithm identifier
     * @param value
     * @param options The options parameters.
     */
    unwrapKey(vaultBaseUrl, keyName, keyVersion, algorithm, value, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            keyVersion,
            algorithm,
            value,
            options: coreHttp__namespace.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, unwrapKeyOperationSpec);
    }
    /**
     * The release key operation is applicable to all key types. The target key must be marked exportable.
     * This operation requires the keys/release permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key to get.
     * @param keyVersion Adding the version parameter retrieves a specific version of a key.
     * @param targetAttestationToken The attestation assertion for the target of the key release.
     * @param options The options parameters.
     */
    release(vaultBaseUrl, keyName, keyVersion, targetAttestationToken, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            keyVersion,
            targetAttestationToken,
            options: coreHttp__namespace.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, releaseOperationSpec);
    }
    /**
     * Retrieves a list of the keys in the Key Vault as JSON Web Key structures that contain the public
     * part of a deleted key. This operation includes deletion-specific information. The Get Deleted Keys
     * operation is applicable for vaults enabled for soft-delete. While the operation can be invoked on
     * any vault, it will return an error if invoked on a non soft-delete enabled vault. This operation
     * requires the keys/list permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param options The options parameters.
     */
    getDeletedKeys(vaultBaseUrl, options) {
        const operationArguments = {
            vaultBaseUrl,
            options: coreHttp__namespace.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, getDeletedKeysOperationSpec);
    }
    /**
     * The Get Deleted Key operation is applicable for soft-delete enabled vaults. While the operation can
     * be invoked on any vault, it will return an error if invoked on a non soft-delete enabled vault. This
     * operation requires the keys/get permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key.
     * @param options The options parameters.
     */
    getDeletedKey(vaultBaseUrl, keyName, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            options: coreHttp__namespace.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, getDeletedKeyOperationSpec);
    }
    /**
     * The Purge Deleted Key operation is applicable for soft-delete enabled vaults. While the operation
     * can be invoked on any vault, it will return an error if invoked on a non soft-delete enabled vault.
     * This operation requires the keys/purge permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key
     * @param options The options parameters.
     */
    purgeDeletedKey(vaultBaseUrl, keyName, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            options: coreHttp__namespace.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, purgeDeletedKeyOperationSpec);
    }
    /**
     * The Recover Deleted Key operation is applicable for deleted keys in soft-delete enabled vaults. It
     * recovers the deleted key back to its latest version under /keys. An attempt to recover an
     * non-deleted key will return an error. Consider this the inverse of the delete operation on
     * soft-delete enabled vaults. This operation requires the keys/recover permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the deleted key.
     * @param options The options parameters.
     */
    recoverDeletedKey(vaultBaseUrl, keyName, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            options: coreHttp__namespace.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, recoverDeletedKeyOperationSpec);
    }
    /**
     * The GetKeyRotationPolicy operation returns the specified key policy resources in the specified key
     * vault. This operation requires the keys/get permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key in a given key vault.
     * @param options The options parameters.
     */
    getKeyRotationPolicy(vaultBaseUrl, keyName, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            options: coreHttp__namespace.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, getKeyRotationPolicyOperationSpec);
    }
    /**
     * Set specified members in the key policy. Leave others as undefined. This operation requires the
     * keys/update permission.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key in the given vault.
     * @param keyRotationPolicy The policy for the key.
     * @param options The options parameters.
     */
    updateKeyRotationPolicy(vaultBaseUrl, keyName, keyRotationPolicy, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            keyRotationPolicy,
            options: coreHttp__namespace.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, updateKeyRotationPolicyOperationSpec);
    }
    /**
     * Get the requested number of bytes containing random values from a managed HSM.
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param count The requested number of random bytes.
     * @param options The options parameters.
     */
    getRandomBytes(vaultBaseUrl, count, options) {
        const operationArguments = {
            vaultBaseUrl,
            count,
            options: coreHttp__namespace.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, getRandomBytesOperationSpec);
    }
    /**
     * GetKeyVersionsNext
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param keyName The name of the key.
     * @param nextLink The nextLink from the previous successful call to the GetKeyVersions method.
     * @param options The options parameters.
     */
    getKeyVersionsNext(vaultBaseUrl, keyName, nextLink, options) {
        const operationArguments = {
            vaultBaseUrl,
            keyName,
            nextLink,
            options: coreHttp__namespace.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, getKeyVersionsNextOperationSpec);
    }
    /**
     * GetKeysNext
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param nextLink The nextLink from the previous successful call to the GetKeys method.
     * @param options The options parameters.
     */
    getKeysNext(vaultBaseUrl, nextLink, options) {
        const operationArguments = {
            vaultBaseUrl,
            nextLink,
            options: coreHttp__namespace.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, getKeysNextOperationSpec);
    }
    /**
     * GetDeletedKeysNext
     * @param vaultBaseUrl The vault name, for example https://myvault.vault.azure.net.
     * @param nextLink The nextLink from the previous successful call to the GetDeletedKeys method.
     * @param options The options parameters.
     */
    getDeletedKeysNext(vaultBaseUrl, nextLink, options) {
        const operationArguments = {
            vaultBaseUrl,
            nextLink,
            options: coreHttp__namespace.operationOptionsToRequestOptionsBase(options || {})
        };
        return this.sendOperationRequest(operationArguments, getDeletedKeysNextOperationSpec);
    }
}
// Operation Specifications
const serializer = new coreHttp__namespace.Serializer(Mappers, /* isXml */ false);
const createKeyOperationSpec = {
    path: "/keys/{key-name}/create",
    httpMethod: "POST",
    responses: {
        200: {
            bodyMapper: KeyBundle
        },
        default: {
            bodyMapper: KeyVaultError
        }
    },
    requestBody: {
        parameterPath: {
            kty: ["kty"],
            keySize: ["options", "keySize"],
            publicExponent: ["options", "publicExponent"],
            keyOps: ["options", "keyOps"],
            keyAttributes: ["options", "keyAttributes"],
            tags: ["options", "tags"],
            curve: ["options", "curve"],
            releasePolicy: ["options", "releasePolicy"]
        },
        mapper: Object.assign(Object.assign({}, KeyCreateParameters), { required: true })
    },
    queryParameters: [apiVersion],
    urlParameters: [vaultBaseUrl, keyName],
    headerParameters: [contentType, accept],
    mediaType: "json",
    serializer
};
const rotateKeyOperationSpec = {
    path: "/keys/{key-name}/rotate",
    httpMethod: "POST",
    responses: {
        200: {
            bodyMapper: KeyBundle
        },
        default: {
            bodyMapper: KeyVaultError
        }
    },
    queryParameters: [apiVersion],
    urlParameters: [vaultBaseUrl, keyName],
    headerParameters: [accept],
    serializer
};
const importKeyOperationSpec = {
    path: "/keys/{key-name}",
    httpMethod: "PUT",
    responses: {
        200: {
            bodyMapper: KeyBundle
        },
        default: {
            bodyMapper: KeyVaultError
        }
    },
    requestBody: {
        parameterPath: {
            hsm: ["options", "hsm"],
            key: ["key"],
            keyAttributes: ["options", "keyAttributes"],
            tags: ["options", "tags"],
            releasePolicy: ["options", "releasePolicy"]
        },
        mapper: Object.assign(Object.assign({}, KeyImportParameters), { required: true })
    },
    queryParameters: [apiVersion],
    urlParameters: [vaultBaseUrl, keyName],
    headerParameters: [contentType, accept],
    mediaType: "json",
    serializer
};
const deleteKeyOperationSpec = {
    path: "/keys/{key-name}",
    httpMethod: "DELETE",
    responses: {
        200: {
            bodyMapper: DeletedKeyBundle
        },
        default: {
            bodyMapper: KeyVaultError
        }
    },
    queryParameters: [apiVersion],
    urlParameters: [vaultBaseUrl, keyName1],
    headerParameters: [accept],
    serializer
};
const updateKeyOperationSpec = {
    path: "/keys/{key-name}/{key-version}",
    httpMethod: "PATCH",
    responses: {
        200: {
            bodyMapper: KeyBundle
        },
        default: {
            bodyMapper: KeyVaultError
        }
    },
    requestBody: {
        parameterPath: {
            keyOps: ["options", "keyOps"],
            keyAttributes: ["options", "keyAttributes"],
            tags: ["options", "tags"],
            releasePolicy: ["options", "releasePolicy"]
        },
        mapper: Object.assign(Object.assign({}, KeyUpdateParameters), { required: true })
    },
    queryParameters: [apiVersion],
    urlParameters: [
        vaultBaseUrl,
        keyName1,
        keyVersion
    ],
    headerParameters: [contentType, accept],
    mediaType: "json",
    serializer
};
const getKeyOperationSpec = {
    path: "/keys/{key-name}/{key-version}",
    httpMethod: "GET",
    responses: {
        200: {
            bodyMapper: KeyBundle
        },
        default: {
            bodyMapper: KeyVaultError
        }
    },
    queryParameters: [apiVersion],
    urlParameters: [
        vaultBaseUrl,
        keyName1,
        keyVersion
    ],
    headerParameters: [accept],
    serializer
};
const getKeyVersionsOperationSpec = {
    path: "/keys/{key-name}/versions",
    httpMethod: "GET",
    responses: {
        200: {
            bodyMapper: KeyListResult
        },
        default: {
            bodyMapper: KeyVaultError
        }
    },
    queryParameters: [apiVersion, maxresults],
    urlParameters: [vaultBaseUrl, keyName1],
    headerParameters: [accept],
    serializer
};
const getKeysOperationSpec = {
    path: "/keys",
    httpMethod: "GET",
    responses: {
        200: {
            bodyMapper: KeyListResult
        },
        default: {
            bodyMapper: KeyVaultError
        }
    },
    queryParameters: [apiVersion, maxresults],
    urlParameters: [vaultBaseUrl],
    headerParameters: [accept],
    serializer
};
const backupKeyOperationSpec = {
    path: "/keys/{key-name}/backup",
    httpMethod: "POST",
    responses: {
        200: {
            bodyMapper: BackupKeyResult
        },
        default: {
            bodyMapper: KeyVaultError
        }
    },
    queryParameters: [apiVersion],
    urlParameters: [vaultBaseUrl, keyName1],
    headerParameters: [accept],
    serializer
};
const restoreKeyOperationSpec = {
    path: "/keys/restore",
    httpMethod: "POST",
    responses: {
        200: {
            bodyMapper: KeyBundle
        },
        default: {
            bodyMapper: KeyVaultError
        }
    },
    requestBody: {
        parameterPath: { keyBundleBackup: ["keyBundleBackup"] },
        mapper: Object.assign(Object.assign({}, KeyRestoreParameters), { required: true })
    },
    queryParameters: [apiVersion],
    urlParameters: [vaultBaseUrl],
    headerParameters: [contentType, accept],
    mediaType: "json",
    serializer
};
const encryptOperationSpec = {
    path: "/keys/{key-name}/{key-version}/encrypt",
    httpMethod: "POST",
    responses: {
        200: {
            bodyMapper: KeyOperationResult
        },
        default: {
            bodyMapper: KeyVaultError
        }
    },
    requestBody: {
        parameterPath: {
            algorithm: ["algorithm"],
            value: ["value"],
            iv: ["options", "iv"],
            additionalAuthenticatedData: ["options", "additionalAuthenticatedData"],
            authenticationTag: ["options", "authenticationTag"]
        },
        mapper: Object.assign(Object.assign({}, KeyOperationsParameters), { required: true })
    },
    queryParameters: [apiVersion],
    urlParameters: [
        vaultBaseUrl,
        keyName1,
        keyVersion
    ],
    headerParameters: [contentType, accept],
    mediaType: "json",
    serializer
};
const decryptOperationSpec = {
    path: "/keys/{key-name}/{key-version}/decrypt",
    httpMethod: "POST",
    responses: {
        200: {
            bodyMapper: KeyOperationResult
        },
        default: {
            bodyMapper: KeyVaultError
        }
    },
    requestBody: {
        parameterPath: {
            algorithm: ["algorithm"],
            value: ["value"],
            iv: ["options", "iv"],
            additionalAuthenticatedData: ["options", "additionalAuthenticatedData"],
            authenticationTag: ["options", "authenticationTag"]
        },
        mapper: Object.assign(Object.assign({}, KeyOperationsParameters), { required: true })
    },
    queryParameters: [apiVersion],
    urlParameters: [
        vaultBaseUrl,
        keyName1,
        keyVersion
    ],
    headerParameters: [contentType, accept],
    mediaType: "json",
    serializer
};
const signOperationSpec = {
    path: "/keys/{key-name}/{key-version}/sign",
    httpMethod: "POST",
    responses: {
        200: {
            bodyMapper: KeyOperationResult
        },
        default: {
            bodyMapper: KeyVaultError
        }
    },
    requestBody: {
        parameterPath: { algorithm: ["algorithm"], value: ["value"] },
        mapper: Object.assign(Object.assign({}, KeySignParameters), { required: true })
    },
    queryParameters: [apiVersion],
    urlParameters: [
        vaultBaseUrl,
        keyName1,
        keyVersion
    ],
    headerParameters: [contentType, accept],
    mediaType: "json",
    serializer
};
const verifyOperationSpec = {
    path: "/keys/{key-name}/{key-version}/verify",
    httpMethod: "POST",
    responses: {
        200: {
            bodyMapper: KeyVerifyResult
        },
        default: {
            bodyMapper: KeyVaultError
        }
    },
    requestBody: {
        parameterPath: {
            algorithm: ["algorithm"],
            digest: ["digest"],
            signature: ["signature"]
        },
        mapper: Object.assign(Object.assign({}, KeyVerifyParameters), { required: true })
    },
    queryParameters: [apiVersion],
    urlParameters: [
        vaultBaseUrl,
        keyName1,
        keyVersion
    ],
    headerParameters: [contentType, accept],
    mediaType: "json",
    serializer
};
const wrapKeyOperationSpec = {
    path: "/keys/{key-name}/{key-version}/wrapkey",
    httpMethod: "POST",
    responses: {
        200: {
            bodyMapper: KeyOperationResult
        },
        default: {
            bodyMapper: KeyVaultError
        }
    },
    requestBody: {
        parameterPath: {
            algorithm: ["algorithm"],
            value: ["value"],
            iv: ["options", "iv"],
            additionalAuthenticatedData: ["options", "additionalAuthenticatedData"],
            authenticationTag: ["options", "authenticationTag"]
        },
        mapper: Object.assign(Object.assign({}, KeyOperationsParameters), { required: true })
    },
    queryParameters: [apiVersion],
    urlParameters: [
        vaultBaseUrl,
        keyName1,
        keyVersion
    ],
    headerParameters: [contentType, accept],
    mediaType: "json",
    serializer
};
const unwrapKeyOperationSpec = {
    path: "/keys/{key-name}/{key-version}/unwrapkey",
    httpMethod: "POST",
    responses: {
        200: {
            bodyMapper: KeyOperationResult
        },
        default: {
            bodyMapper: KeyVaultError
        }
    },
    requestBody: {
        parameterPath: {
            algorithm: ["algorithm"],
            value: ["value"],
            iv: ["options", "iv"],
            additionalAuthenticatedData: ["options", "additionalAuthenticatedData"],
            authenticationTag: ["options", "authenticationTag"]
        },
        mapper: Object.assign(Object.assign({}, KeyOperationsParameters), { required: true })
    },
    queryParameters: [apiVersion],
    urlParameters: [
        vaultBaseUrl,
        keyName1,
        keyVersion
    ],
    headerParameters: [contentType, accept],
    mediaType: "json",
    serializer
};
const releaseOperationSpec = {
    path: "/keys/{key-name}/{key-version}/release",
    httpMethod: "POST",
    responses: {
        200: {
            bodyMapper: KeyReleaseResult
        },
        default: {
            bodyMapper: KeyVaultError
        }
    },
    requestBody: {
        parameterPath: {
            targetAttestationToken: ["targetAttestationToken"],
            nonce: ["options", "nonce"],
            enc: ["options", "enc"]
        },
        mapper: Object.assign(Object.assign({}, KeyReleaseParameters), { required: true })
    },
    queryParameters: [apiVersion],
    urlParameters: [
        vaultBaseUrl,
        keyName1,
        keyVersion
    ],
    headerParameters: [contentType, accept],
    mediaType: "json",
    serializer
};
const getDeletedKeysOperationSpec = {
    path: "/deletedkeys",
    httpMethod: "GET",
    responses: {
        200: {
            bodyMapper: DeletedKeyListResult
        },
        default: {
            bodyMapper: KeyVaultError
        }
    },
    queryParameters: [apiVersion, maxresults],
    urlParameters: [vaultBaseUrl],
    headerParameters: [accept],
    serializer
};
const getDeletedKeyOperationSpec = {
    path: "/deletedkeys/{key-name}",
    httpMethod: "GET",
    responses: {
        200: {
            bodyMapper: DeletedKeyBundle
        },
        default: {
            bodyMapper: KeyVaultError
        }
    },
    queryParameters: [apiVersion],
    urlParameters: [vaultBaseUrl, keyName1],
    headerParameters: [accept],
    serializer
};
const purgeDeletedKeyOperationSpec = {
    path: "/deletedkeys/{key-name}",
    httpMethod: "DELETE",
    responses: {
        204: {},
        default: {
            bodyMapper: KeyVaultError
        }
    },
    queryParameters: [apiVersion],
    urlParameters: [vaultBaseUrl, keyName1],
    headerParameters: [accept],
    serializer
};
const recoverDeletedKeyOperationSpec = {
    path: "/deletedkeys/{key-name}/recover",
    httpMethod: "POST",
    responses: {
        200: {
            bodyMapper: KeyBundle
        },
        default: {
            bodyMapper: KeyVaultError
        }
    },
    queryParameters: [apiVersion],
    urlParameters: [vaultBaseUrl, keyName1],
    headerParameters: [accept],
    serializer
};
const getKeyRotationPolicyOperationSpec = {
    path: "/keys/{key-name}/rotationpolicy",
    httpMethod: "GET",
    responses: {
        200: {
            bodyMapper: KeyRotationPolicy
        },
        default: {
            bodyMapper: KeyVaultError
        }
    },
    queryParameters: [apiVersion],
    urlParameters: [vaultBaseUrl, keyName1],
    headerParameters: [accept],
    serializer
};
const updateKeyRotationPolicyOperationSpec = {
    path: "/keys/{key-name}/rotationpolicy",
    httpMethod: "PUT",
    responses: {
        200: {
            bodyMapper: KeyRotationPolicy
        },
        default: {
            bodyMapper: KeyVaultError
        }
    },
    requestBody: keyRotationPolicy,
    queryParameters: [apiVersion],
    urlParameters: [vaultBaseUrl, keyName1],
    headerParameters: [contentType, accept],
    mediaType: "json",
    serializer
};
const getRandomBytesOperationSpec = {
    path: "/rng",
    httpMethod: "POST",
    responses: {
        200: {
            bodyMapper: RandomBytes
        },
        default: {
            bodyMapper: KeyVaultError
        }
    },
    requestBody: {
        parameterPath: { count: ["count"] },
        mapper: Object.assign(Object.assign({}, GetRandomBytesRequest), { required: true })
    },
    queryParameters: [apiVersion],
    urlParameters: [vaultBaseUrl],
    headerParameters: [contentType, accept],
    mediaType: "json",
    serializer
};
const getKeyVersionsNextOperationSpec = {
    path: "{nextLink}",
    httpMethod: "GET",
    responses: {
        200: {
            bodyMapper: KeyListResult
        },
        default: {
            bodyMapper: KeyVaultError
        }
    },
    queryParameters: [apiVersion, maxresults],
    urlParameters: [
        vaultBaseUrl,
        keyName1,
        nextLink
    ],
    headerParameters: [accept],
    serializer
};
const getKeysNextOperationSpec = {
    path: "{nextLink}",
    httpMethod: "GET",
    responses: {
        200: {
            bodyMapper: KeyListResult
        },
        default: {
            bodyMapper: KeyVaultError
        }
    },
    queryParameters: [apiVersion, maxresults],
    urlParameters: [vaultBaseUrl, nextLink],
    headerParameters: [accept],
    serializer
};
const getDeletedKeysNextOperationSpec = {
    path: "{nextLink}",
    httpMethod: "GET",
    responses: {
        200: {
            bodyMapper: DeletedKeyListResult
        },
        default: {
            bodyMapper: KeyVaultError
        }
    },
    queryParameters: [apiVersion, maxresults],
    urlParameters: [vaultBaseUrl, nextLink],
    headerParameters: [accept],
    serializer
};

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
const SDK_VERSION = "4.4.0";

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * @internal
 *
 * Valid key names in WWW-Authenticate header.
 */
const validParsedWWWAuthenticateProperties = [
    "authorization",
    "authorization_url",
    "resource",
    "scope",
    "tenantId",
];
/**
 * Parses an WWW-Authenticate response.
 * This transforms a string value like:
 * `Bearer authorization="https://some.url/tenantId", resource="https://some.url"`
 * into an object like:
 * `{ authorization: "https://some.url/tenantId", resource: "https://some.url" }`
 * @param wwwAuthenticate - String value in the WWW-Authenticate header
 */
function parseWWWAuthenticate(wwwAuthenticate) {
    const pairDelimiter = /,? +/;
    const parsed = wwwAuthenticate
        .split(pairDelimiter)
        .reduce((kvPairs, p) => {
        if (p.match(/\w="/)) {
            // 'sampleKey="sample_value"' -> [sampleKey, "sample_value"] -> { sampleKey: sample_value }
            const [key, value] = p.split("=");
            if (validParsedWWWAuthenticateProperties.includes(key)) {
                // The values will be wrapped in quotes, which need to be stripped out.
                return Object.assign(Object.assign({}, kvPairs), { [key]: value.slice(1, -1) });
            }
        }
        return kvPairs;
    }, {});
    // Finally, we pull the tenantId from the authorization header to support multi-tenant authentication.
    if (parsed.authorization) {
        try {
            const tenantId = new URL(parsed.authorization).pathname.substring(1);
            if (tenantId) {
                parsed.tenantId = tenantId;
            }
        }
        catch (_) {
            throw new Error(`The challenge authorization URI '${parsed.authorization}' is invalid.`);
        }
    }
    return parsed;
}

// Copyright (c) Microsoft Corporation.
/**
 * Representation of the Authentication Challenge
 */
class AuthenticationChallenge {
    constructor(authorization, scope, tenantId) {
        this.authorization = authorization;
        this.scope = scope;
        this.tenantId = tenantId;
    }
    /**
     * Checks that this AuthenticationChallenge is equal to another one given.
     * Only compares the scope.
     * This is exactly what C# is doing, as we can see here:
     * https://github.com/Azure/azure-sdk-for-net/blob/70e54b878ff1d01a45266fb3674a396b4ab9c1d2/sdk/keyvault/Azure.Security.KeyVault.Shared/src/ChallengeBasedAuthenticationPolicy.cs#L143-L147
     * @param other - The other AuthenticationChallenge
     */
    equalTo(other) {
        var _a, _b;
        return other
            ? this.scope.toLowerCase() === other.scope.toLowerCase() &&
                this.authorization.toLowerCase() === other.authorization.toLowerCase() &&
                ((_a = this.tenantId) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === ((_b = other.tenantId) === null || _b === void 0 ? void 0 : _b.toLowerCase())
            : false;
    }
}
/**
 * Helps keep a copy of any previous authentication challenges,
 * so that we can compare on any further request.
 */
class AuthenticationChallengeCache {
    setCachedChallenge(challenge) {
        this.challenge = challenge;
    }
}
/**
 * Creates a new ChallengeBasedAuthenticationPolicy factory.
 *
 * @param credential - The TokenCredential implementation that can supply the challenge token.
 */
function challengeBasedAuthenticationPolicy(credential) {
    const tokenCache = new coreHttp.ExpiringAccessTokenCache();
    const challengeCache = new AuthenticationChallengeCache();
    return {
        create: (nextPolicy, options) => {
            return new ChallengeBasedAuthenticationPolicy(nextPolicy, options, credential, tokenCache, challengeCache);
        },
    };
}
/**
 *
 * Provides a RequestPolicy that can request a token from a TokenCredential
 * implementation and then apply it to the Authorization header of a request
 * as a Bearer token.
 *
 */
class ChallengeBasedAuthenticationPolicy extends coreHttp.BaseRequestPolicy {
    /**
     * Creates a new ChallengeBasedAuthenticationPolicy object.
     *
     * @param nextPolicy - The next RequestPolicy in the request pipeline.
     * @param options - Options for this RequestPolicy.
     * @param credential - The TokenCredential implementation that can supply the bearer token.
     * @param tokenCache - The cache for the most recent AccessToken returned by the TokenCredential.
     */
    constructor(nextPolicy, options, credential, tokenCache, challengeCache) {
        super(nextPolicy, options);
        this.credential = credential;
        this.tokenCache = tokenCache;
        this.challengeCache = challengeCache;
        this.parseWWWAuthenticate = parseWWWAuthenticate;
    }
    /**
     * Gets or updates the token from the token cache into the headers of the received web resource.
     */
    async loadToken(webResource) {
        let accessToken = this.tokenCache.getCachedToken();
        // If there's no cached token in the cache, we try to get a new one.
        if (accessToken === undefined) {
            const receivedToken = await this.credential.getToken(this.challengeCache.challenge.scope, {
                tenantId: this.challengeCache.challenge.tenantId,
            });
            accessToken = receivedToken || undefined;
            this.tokenCache.setCachedToken(accessToken);
        }
        if (accessToken) {
            webResource.headers.set(coreHttp.Constants.HeaderConstants.AUTHORIZATION, `Bearer ${accessToken.token}`);
        }
    }
    /**
     * Parses the given WWW-Authenticate header, generates a new AuthenticationChallenge,
     * then if the challenge is different from the one cached, resets the token and forces
     * a re-authentication, otherwise continues with the existing challenge and token.
     * @param wwwAuthenticate - Value of the incoming WWW-Authenticate header.
     * @param webResource - Ongoing HTTP request.
     */
    async regenerateChallenge(wwwAuthenticate, webResource) {
        var _a;
        // The challenge based authentication will contain both:
        // - An authorization URI with a token,
        // - The resource to which that token is valid against (also called the scope).
        const parsedWWWAuth = this.parseWWWAuthenticate(wwwAuthenticate);
        const authorization = parsedWWWAuth.authorization;
        const resource = parsedWWWAuth.resource || parsedWWWAuth.scope;
        const tenantId = parsedWWWAuth.tenantId;
        if (!(authorization && resource)) {
            return this._nextPolicy.sendRequest(webResource);
        }
        const challenge = new AuthenticationChallenge(authorization, resource + "/.default", tenantId);
        // Either if there's no cached challenge at this point (could have happen in parallel),
        // or if the cached challenge has a different scope,
        // we store the just received challenge and reset the cached token, to force a re-authentication.
        if (!((_a = this.challengeCache.challenge) === null || _a === void 0 ? void 0 : _a.equalTo(challenge))) {
            this.challengeCache.setCachedChallenge(challenge);
            this.tokenCache.setCachedToken(undefined);
        }
        await this.loadToken(webResource);
        return this._nextPolicy.sendRequest(webResource);
    }
    /**
     * Applies the Bearer token to the request through the Authorization header.
     * @param webResource - Ongoing HTTP request.
     */
    async sendRequest(webResource) {
        // Ensure that we're about to use a secure connection.
        if (!webResource.url.startsWith("https:")) {
            throw new Error("The resource address for authorization must use the 'https' protocol.");
        }
        // The next request will happen differently whether we have a challenge or not.
        let response;
        if (this.challengeCache.challenge === undefined ||
            this.challengeCache.challenge === undefined) {
            // If there's no challenge in cache, a blank body will start the challenge.
            const originalBody = webResource.body;
            webResource.body = "";
            try {
                response = await this._nextPolicy.sendRequest(webResource);
            }
            finally {
                webResource.body = originalBody;
            }
        }
        else {
            // If we did have a challenge in memory,
            // we attempt to load the token from the cache into the request before we try to send the request.
            await this.loadToken(webResource);
            response = await this._nextPolicy.sendRequest(webResource);
        }
        // If we don't receive a response with a 401 status code,
        // then we can assume this response has nothing to do with the challenge authentication process.
        if (response.status !== 401) {
            return response;
        }
        // If the response status is 401, we only re-authenticate if the WWW-Authenticate header is present.
        const wwwAuthenticate = response.headers.get("WWW-Authenticate");
        if (!wwwAuthenticate) {
            return response;
        }
        // We re-generate the challenge and see if we have to re-authenticate.
        return this.regenerateChallenge(wwwAuthenticate, webResource);
    }
}

// Copyright (c) Microsoft Corporation.
function parseKeyvaultIdentifier(collection, identifier) {
    if (typeof collection !== "string" || !(collection = collection.trim())) {
        throw new Error("Invalid collection argument");
    }
    if (typeof identifier !== "string" || !(identifier = identifier.trim())) {
        throw new Error("Invalid identifier argument");
    }
    let baseUri;
    try {
        baseUri = url__namespace.parse(identifier, true, true);
    }
    catch (e) {
        throw new Error(`Invalid ${collection} identifier: ${identifier}. Not a valid URI`);
    }
    // Path is of the form '/collection/name[/version]'
    const segments = (baseUri.pathname || "").split("/");
    if (segments.length !== 3 && segments.length !== 4) {
        throw new Error(`Invalid ${collection} identifier: ${identifier}. Bad number of segments: ${segments.length}`);
    }
    if (collection !== segments[1]) {
        throw new Error(`Invalid ${collection} identifier: ${identifier}. segment [1] should be "${collection}", found "${segments[1]}"`);
    }
    const vaultUrl = `${baseUri.protocol}//${baseUri.host}`;
    const name = segments[2];
    const version = segments.length === 4 ? segments[3] : undefined;
    return {
        vaultUrl,
        name,
        version,
    };
}

// Copyright (c) Microsoft Corporation.
/**
 * Returns a function that can be used for tracing options.
 *
 * @param prefix - The prefix to use, likely the name of the class / client.
 *
 * @example const withTrace = createTraceFunction("Azure.KeyVault.Certificates.CertificateClient")
 *
 * @internal
 */
function createTraceFunction(prefix) {
    const createSpan = coreTracing.createSpanFunction({
        namespace: "Microsoft.KeyVault",
        packagePrefix: prefix,
    });
    return async function (operationName, options, cb) {
        const { updatedOptions, span } = createSpan(operationName, options);
        try {
            // NOTE: we really do need to await on this function here so we can handle any exceptions thrown and properly
            // close the span.
            const result = await cb(updatedOptions, span);
            // otel 0.16+ needs this or else the code ends up being set as UNSET
            span.setStatus({
                code: coreTracing.SpanStatusCode.OK,
            });
            return result;
        }
        catch (err) {
            span.setStatus({
                code: coreTracing.SpanStatusCode.ERROR,
                message: err.message,
            });
            throw err;
        }
        finally {
            span.end();
        }
    };
}

// Copyright (c) Microsoft Corporation.
/**
 * Parses the given Key Vault Key Id. An example is:
 *
 *   https://<keyvault-name>.vault.azure.net/keys/<key-name>/<unique-version-id>
 *
 * On parsing the above Id, this function returns:
 *```ts
 *   {
 *      sourceId: "https://<keyvault-name>.vault.azure.net/keys/<key-name>/<unique-version-id>",
 *      vaultUrl: "https://<keyvault-name>.vault.azure.net",
 *      version: "<unique-version-id>",
 *      name: "<key-name>"
 *   }
 *```
 * @param id - The Id of the Key Vault Key.
 */
function parseKeyVaultKeyIdentifier(id) {
    const urlParts = id.split("/");
    const collection = urlParts[3];
    return Object.assign({ sourceId: id }, parseKeyvaultIdentifier(collection, id));
}

// Copyright (c) Microsoft Corporation.
/**
 * @internal
 * Shapes the exposed {@link KeyVaultKey} based on either a received key bundle or deleted key bundle.
 */
function getKeyFromKeyBundle(bundle) {
    const keyBundle = bundle;
    const deletedKeyBundle = bundle;
    const parsedId = parseKeyVaultKeyIdentifier(keyBundle.key.kid);
    const attributes = keyBundle.attributes || {};
    delete keyBundle.attributes;
    const resultObject = {
        key: keyBundle.key,
        id: keyBundle.key ? keyBundle.key.kid : undefined,
        name: parsedId.name,
        keyOperations: keyBundle.key ? keyBundle.key.keyOps : undefined,
        keyType: keyBundle.key ? keyBundle.key.kty : undefined,
        properties: {
            tags: keyBundle.tags,
            enabled: attributes.enabled,
            notBefore: attributes.notBefore,
            expiresOn: attributes.expires,
            createdOn: attributes.created,
            updatedOn: attributes.updated,
            recoverableDays: attributes.recoverableDays,
            recoveryLevel: attributes.recoveryLevel,
            exportable: attributes.exportable,
            releasePolicy: keyBundle.releasePolicy,
            vaultUrl: parsedId.vaultUrl,
            version: parsedId.version,
            name: parsedId.name,
            managed: keyBundle.managed,
            id: keyBundle.key ? keyBundle.key.kid : undefined,
        },
    };
    if (deletedKeyBundle.recoveryId) {
        resultObject.properties.recoveryId = deletedKeyBundle.recoveryId;
        resultObject.properties.scheduledPurgeDate = deletedKeyBundle.scheduledPurgeDate;
        resultObject.properties.deletedOn = deletedKeyBundle.deletedDate;
    }
    return resultObject;
}
/**
 * @internal
 * Shapes the exposed {@link DeletedKey} based on a received KeyItem.
 */
function getDeletedKeyFromDeletedKeyItem(keyItem) {
    const commonProperties = getKeyPropertiesFromKeyItem(keyItem);
    return {
        key: {
            kid: keyItem.kid,
        },
        id: keyItem.kid,
        name: commonProperties.name,
        properties: Object.assign(Object.assign({}, commonProperties), { recoveryId: keyItem.recoveryId, scheduledPurgeDate: keyItem.scheduledPurgeDate, deletedOn: keyItem.deletedDate }),
    };
}
/**
 * @internal
 * Shapes the exposed {@link KeyProperties} based on a received KeyItem.
 */
function getKeyPropertiesFromKeyItem(keyItem) {
    const parsedId = parseKeyVaultKeyIdentifier(keyItem.kid);
    const attributes = keyItem.attributes || {};
    const resultObject = {
        createdOn: attributes.created,
        enabled: attributes === null || attributes === void 0 ? void 0 : attributes.enabled,
        expiresOn: attributes === null || attributes === void 0 ? void 0 : attributes.expires,
        id: keyItem.kid,
        managed: keyItem.managed,
        name: parsedId.name,
        notBefore: attributes === null || attributes === void 0 ? void 0 : attributes.notBefore,
        recoverableDays: attributes === null || attributes === void 0 ? void 0 : attributes.recoverableDays,
        recoveryLevel: attributes === null || attributes === void 0 ? void 0 : attributes.recoveryLevel,
        tags: keyItem.tags,
        updatedOn: attributes.updated,
        vaultUrl: parsedId.vaultUrl,
        version: parsedId.version,
    };
    return resultObject;
}
/**
 * @internal
 */
const keyRotationTransformations = {
    propertiesToGenerated: function (parameters) {
        var _a;
        const policy = {
            attributes: {
                expiryTime: parameters.expiresIn,
            },
            lifetimeActions: (_a = parameters.lifetimeActions) === null || _a === void 0 ? void 0 : _a.map((action) => {
                const generatedAction = {
                    action: { type: action.action },
                    trigger: {},
                };
                if (action.timeAfterCreate) {
                    generatedAction.trigger.timeAfterCreate = action.timeAfterCreate;
                }
                if (action.timeBeforeExpiry) {
                    generatedAction.trigger.timeBeforeExpiry = action.timeBeforeExpiry;
                }
                return generatedAction;
            }),
        };
        return policy;
    },
    generatedToPublic(generated) {
        var _a, _b, _c, _d;
        const policy = {
            id: generated.id,
            createdOn: (_a = generated.attributes) === null || _a === void 0 ? void 0 : _a.created,
            updatedOn: (_b = generated.attributes) === null || _b === void 0 ? void 0 : _b.updated,
            expiresIn: (_c = generated.attributes) === null || _c === void 0 ? void 0 : _c.expiryTime,
            lifetimeActions: (_d = generated.lifetimeActions) === null || _d === void 0 ? void 0 : _d.map((action) => {
                var _a, _b;
                return {
                    action: action.action.type,
                    timeAfterCreate: (_a = action.trigger) === null || _a === void 0 ? void 0 : _a.timeAfterCreate,
                    timeBeforeExpiry: (_b = action.trigger) === null || _b === void 0 ? void 0 : _b.timeBeforeExpiry,
                };
            }),
        };
        return policy;
    },
};

// Copyright (c) Microsoft Corporation.
/**
 * Common properties and methods of the Key Vault Key Pollers.
 */
class KeyVaultKeyPoller extends coreLro.Poller {
    constructor() {
        super(...arguments);
        /**
         * Defines how much time the poller is going to wait before making a new request to the service.
         */
        this.intervalInMs = 2000;
    }
    /**
     * The method used by the poller to wait before attempting to update its operation.
     */
    async delay() {
        return coreHttp.delay(this.intervalInMs);
    }
}
/**
 * Common properties and methods of the Key Vault Key Poller operations.
 */
class KeyVaultKeyPollOperation {
    constructor(state, options = {}) {
        this.state = state;
        this.cancelMessage = "";
        if (options.cancelMessage) {
            this.cancelMessage = options.cancelMessage;
        }
    }
    /**
     * Meant to reach to the service and update the Poller operation.
     */
    async update() {
        throw new Error("Operation not supported.");
    }
    /**
     * Meant to reach to the service and cancel the Poller operation.
     */
    async cancel() {
        throw new Error(this.cancelMessage);
    }
    /**
     * Serializes the Poller operation.
     */
    toString() {
        return JSON.stringify({
            state: this.state,
        });
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * @internal
 */
const withTrace$4 = createTraceFunction("Azure.KeyVault.Keys.DeleteKeyPoller");
class DeleteKeyPollOperation extends KeyVaultKeyPollOperation {
    constructor(state, vaultUrl, client, operationOptions = {}) {
        super(state, { cancelMessage: "Canceling the deletion of a key is not supported." });
        this.state = state;
        this.vaultUrl = vaultUrl;
        this.client = client;
        this.operationOptions = operationOptions;
    }
    /**
     * Sends a delete request for the given Key Vault Key's name to the Key Vault service.
     * Since the Key Vault Key won't be immediately deleted, we have {@link beginDeleteKey}.
     */
    deleteKey(name, options = {}) {
        return withTrace$4("deleteKey", options, async (updatedOptions) => {
            const response = await this.client.deleteKey(this.vaultUrl, name, updatedOptions);
            return getKeyFromKeyBundle(response);
        });
    }
    /**
     * The getDeletedKey method returns the specified deleted key along with its properties.
     * This operation requires the keys/get permission.
     */
    getDeletedKey(name, options = {}) {
        return withTrace$4("getDeletedKey", options, async (updatedOptions) => {
            const response = await this.client.getDeletedKey(this.vaultUrl, name, updatedOptions);
            return getKeyFromKeyBundle(response);
        });
    }
    /**
     * Reaches to the service and updates the delete key's poll operation.
     */
    async update(options = {}) {
        const state = this.state;
        const { name } = state;
        if (options.abortSignal) {
            this.operationOptions.abortSignal = options.abortSignal;
        }
        if (!state.isStarted) {
            const deletedKey = await this.deleteKey(name, this.operationOptions);
            state.isStarted = true;
            state.result = deletedKey;
            if (!deletedKey.properties.recoveryId) {
                state.isCompleted = true;
            }
        }
        if (!state.isCompleted) {
            try {
                state.result = await this.getDeletedKey(name, this.operationOptions);
                state.isCompleted = true;
            }
            catch (error) {
                if (error.statusCode === 403) {
                    // At this point, the resource exists but the user doesn't have access to it.
                    state.isCompleted = true;
                }
                else if (error.statusCode !== 404) {
                    state.error = error;
                    state.isCompleted = true;
                    throw error;
                }
            }
        }
        return this;
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * Class that creates a poller that waits until a key finishes being deleted.
 */
class DeleteKeyPoller extends KeyVaultKeyPoller {
    constructor(options) {
        const { vaultUrl, client, name, operationOptions, intervalInMs = 2000, resumeFrom } = options;
        let state;
        if (resumeFrom) {
            state = JSON.parse(resumeFrom).state;
        }
        const operation = new DeleteKeyPollOperation(Object.assign(Object.assign({}, state), { name }), vaultUrl, client, operationOptions);
        super(operation);
        this.intervalInMs = intervalInMs;
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * @internal
 */
const withTrace$3 = createTraceFunction("Azure.KeyVault.Keys.RecoverDeletedKeyPoller");
class RecoverDeletedKeyPollOperation extends KeyVaultKeyPollOperation {
    constructor(state, vaultUrl, client, operationOptions = {}) {
        super(state, { cancelMessage: "Canceling the recovery of a deleted key is not supported." });
        this.state = state;
        this.vaultUrl = vaultUrl;
        this.client = client;
        this.operationOptions = operationOptions;
    }
    /**
     * The getKey method gets a specified key and is applicable to any key stored in Azure Key Vault.
     * This operation requires the keys/get permission.
     */
    getKey(name, options = {}) {
        return withTrace$3("generatedClient.getKey", options, async (updatedOptions) => {
            const response = await this.client.getKey(this.vaultUrl, name, (updatedOptions === null || updatedOptions === void 0 ? void 0 : updatedOptions.version) || "", updatedOptions);
            return getKeyFromKeyBundle(response);
        });
    }
    /**
     * Sends a request to recover a deleted Key Vault Key based on the given name.
     * Since the Key Vault Key won't be immediately recover the deleted key, we have {@link beginRecoverDeletedKey}.
     */
    async recoverDeletedKey(name, options = {}) {
        return withTrace$3("generatedClient.recoverDeleteKey", options, async (updatedOptions) => {
            const response = await this.client.recoverDeletedKey(this.vaultUrl, name, updatedOptions);
            return getKeyFromKeyBundle(response);
        });
    }
    /**
     * Reaches to the service and updates the delete key's poll operation.
     */
    async update(options = {}) {
        const state = this.state;
        const { name } = state;
        const operationOptions = this.operationOptions;
        if (options.abortSignal) {
            operationOptions.abortSignal = options.abortSignal;
        }
        if (!state.isStarted) {
            try {
                state.result = await this.getKey(name, operationOptions);
                state.isCompleted = true;
            }
            catch (_a) {
                // Nothing to do here.
            }
            if (!state.isCompleted) {
                state.result = await this.recoverDeletedKey(name, operationOptions);
                state.isStarted = true;
            }
        }
        if (!state.isCompleted) {
            try {
                state.result = await this.getKey(name, operationOptions);
                state.isCompleted = true;
            }
            catch (error) {
                if (error.statusCode === 403) {
                    // At this point, the resource exists but the user doesn't have access to it.
                    state.isCompleted = true;
                }
                else if (error.statusCode !== 404) {
                    state.error = error;
                    state.isCompleted = true;
                    throw error;
                }
            }
        }
        return this;
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * Class that deletes a poller that waits until a key finishes being deleted
 */
class RecoverDeletedKeyPoller extends KeyVaultKeyPoller {
    constructor(options) {
        const { vaultUrl, client, name, operationOptions, intervalInMs = 2000, resumeFrom } = options;
        let state;
        if (resumeFrom) {
            state = JSON.parse(resumeFrom).state;
        }
        const operation = new RecoverDeletedKeyPollOperation(Object.assign(Object.assign({}, state), { name }), vaultUrl, client, operationOptions);
        super(operation);
        this.intervalInMs = intervalInMs;
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * The latest supported Key Vault service API version
 */
const LATEST_API_VERSION = "7.3";
/** Known values of {@link KeyOperation} that the service accepts. */
exports.KnownKeyOperations = void 0;
(function (KnownKeyOperations) {
    /** Key operation - encrypt */
    KnownKeyOperations["Encrypt"] = "encrypt";
    /** Key operation - decrypt */
    KnownKeyOperations["Decrypt"] = "decrypt";
    /** Key operation - sign */
    KnownKeyOperations["Sign"] = "sign";
    /** Key operation - verify */
    KnownKeyOperations["Verify"] = "verify";
    /** Key operation - wrapKey */
    KnownKeyOperations["WrapKey"] = "wrapKey";
    /** Key operation - unwrapKey */
    KnownKeyOperations["UnwrapKey"] = "unwrapKey";
    /** Key operation - import */
    KnownKeyOperations["Import"] = "import";
})(exports.KnownKeyOperations || (exports.KnownKeyOperations = {}));
/** Known values of {@link KeyExportEncryptionAlgorithm} that the service accepts. */
exports.KnownKeyExportEncryptionAlgorithm = void 0;
(function (KnownKeyExportEncryptionAlgorithm) {
    /** CKM_RSA_AES_KEY_WRAP Key Export Encryption Algorithm */
    KnownKeyExportEncryptionAlgorithm["CkmRsaAesKeyWrap"] = "CKM_RSA_AES_KEY_WRAP";
    /** RSA_AES_KEY_WRAP_256 Key Export Encryption Algorithm */
    KnownKeyExportEncryptionAlgorithm["RsaAesKeyWrap256"] = "RSA_AES_KEY_WRAP_256";
    /** RSA_AES_KEY_WRAP_384 Key Export Encryption Algorithm */
    KnownKeyExportEncryptionAlgorithm["RsaAesKeyWrap384"] = "RSA_AES_KEY_WRAP_384";
})(exports.KnownKeyExportEncryptionAlgorithm || (exports.KnownKeyExportEncryptionAlgorithm = {}));

// Copyright (c) Microsoft Corporation.
/**
 * @internal
 * Mapping between signature algorithms and their corresponding hash algorithms. Externally used for testing.
 **/
const algorithmToHashAlgorithm = {
    ES256: "SHA256",
    ES256K: "SHA256",
    PS256: "SHA256",
    RS256: "SHA256",
    ES384: "SHA384",
    PS384: "SHA384",
    RS384: "SHA384",
    ES512: "SHA512",
    PS512: "SHA512",
    RS512: "SHA512",
};
/**
 * @internal
 * Use the platform-local hashing functionality
 */
async function createHash(algorithm, data) {
    const hashAlgorithm = algorithmToHashAlgorithm[algorithm];
    if (!hashAlgorithm) {
        throw new Error(`Invalid algorithm ${algorithm} passed to createHash. Supported algorithms: ${Object.keys(algorithmToHashAlgorithm).join(", ")}`);
    }
    const hash = crypto.createHash(hashAlgorithm);
    hash.update(Buffer.from(data));
    const digest = hash.digest();
    return digest;
}
/**
 * @internal
 * Use the platform-local verify functionality
 */
function createVerify(algorithm, data) {
    const verifyAlgorithm = algorithmToHashAlgorithm[algorithm];
    if (!verifyAlgorithm) {
        throw new Error(`Invalid algorithm ${algorithm} passed to createHash. Supported algorithms: ${Object.keys(algorithmToHashAlgorithm).join(", ")}`);
    }
    const verifier = crypto.createVerify(verifyAlgorithm);
    verifier.update(Buffer.from(data));
    verifier.end();
    return verifier;
}
/**
 * @internal
 * Use the platform-local randomBytes functionality
 */
function randomBytes(length) {
    return crypto.randomBytes(length);
}

// Copyright (c) Microsoft Corporation.
const withTrace$2 = createTraceFunction("Azure.KeyVault.Keys.RemoteCryptographyProvider");
/**
 * The remote cryptography provider is used to run crypto operations against KeyVault.
 * @internal
 */
class RemoteCryptographyProvider {
    constructor(key, credential, pipelineOptions = {}) {
        var _a;
        this.client = getOrInitializeClient(credential, pipelineOptions);
        this.key = key;
        let keyId;
        if (typeof key === "string") {
            keyId = key;
        }
        else {
            keyId = key.id;
        }
        try {
            const parsed = parseKeyVaultKeyIdentifier(keyId);
            if (parsed.name === "") {
                throw new Error("Could not find 'name' of key in key URL");
            }
            if (!parsed.vaultUrl || parsed.vaultUrl === "") {
                throw new Error("Could not find 'vaultUrl' of key in key URL");
            }
            this.vaultUrl = parsed.vaultUrl;
            this.name = parsed.name;
            this.version = (_a = parsed.version) !== null && _a !== void 0 ? _a : "";
        }
        catch (err) {
            logger.error(err);
            throw new Error(`${keyId} is not a valid Key Vault key ID`);
        }
    }
    // The remote client supports all algorithms and all operations.
    isSupported(_algorithm, _operation) {
        return true;
    }
    encrypt(encryptParameters, options = {}) {
        const { algorithm, plaintext } = encryptParameters, params = tslib.__rest(encryptParameters, ["algorithm", "plaintext"]);
        const requestOptions = Object.assign(Object.assign({}, options), params);
        return withTrace$2("encrypt", requestOptions, async (updatedOptions) => {
            const result = await this.client.encrypt(this.vaultUrl, this.name, this.version, algorithm, plaintext, updatedOptions);
            return {
                algorithm: encryptParameters.algorithm,
                result: result.result,
                keyID: this.getKeyID(),
                additionalAuthenticatedData: result.additionalAuthenticatedData,
                authenticationTag: result.authenticationTag,
                iv: result.iv,
            };
        });
    }
    decrypt(decryptParameters, options = {}) {
        const { algorithm, ciphertext } = decryptParameters, params = tslib.__rest(decryptParameters, ["algorithm", "ciphertext"]);
        const requestOptions = Object.assign(Object.assign({}, options), params);
        return withTrace$2("decrypt", requestOptions, async (updatedOptions) => {
            const result = await this.client.decrypt(this.vaultUrl, this.name, this.version, algorithm, ciphertext, updatedOptions);
            return {
                result: result.result,
                keyID: this.getKeyID(),
                algorithm,
            };
        });
    }
    wrapKey(algorithm, keyToWrap, options = {}) {
        return withTrace$2("wrapKey", options, async (updatedOptions) => {
            const result = await this.client.wrapKey(this.vaultUrl, this.name, this.version, algorithm, keyToWrap, updatedOptions);
            return {
                result: result.result,
                algorithm,
                keyID: this.getKeyID(),
            };
        });
    }
    unwrapKey(algorithm, encryptedKey, options = {}) {
        return withTrace$2("unwrapKey", options, async (updatedOptions) => {
            const result = await this.client.unwrapKey(this.vaultUrl, this.name, this.version, algorithm, encryptedKey, updatedOptions);
            return {
                result: result.result,
                algorithm,
                keyID: this.getKeyID(),
            };
        });
    }
    sign(algorithm, digest, options = {}) {
        return withTrace$2("sign", options, async (updatedOptions) => {
            const result = await this.client.sign(this.vaultUrl, this.name, this.version, algorithm, digest, updatedOptions);
            return { result: result.result, algorithm, keyID: this.getKeyID() };
        });
    }
    verifyData(algorithm, data, signature, options = {}) {
        return withTrace$2("verifyData", options, async (updatedOptions) => {
            const hash = await createHash(algorithm, data);
            return this.verify(algorithm, hash, signature, updatedOptions);
        });
    }
    verify(algorithm, digest, signature, options = {}) {
        return withTrace$2("verify", options, async (updatedOptions) => {
            const response = await this.client.verify(this.vaultUrl, this.name, this.version, algorithm, digest, signature, updatedOptions);
            return {
                result: response.value ? response.value : false,
                keyID: this.getKeyID(),
            };
        });
    }
    signData(algorithm, data, options = {}) {
        return withTrace$2("signData", options, async (updatedOptions) => {
            const digest = await createHash(algorithm, data);
            const result = await this.client.sign(this.vaultUrl, this.name, this.version, algorithm, digest, updatedOptions);
            return { result: result.result, algorithm, keyID: this.getKeyID() };
        });
    }
    /**
     * The ID of the key used to perform cryptographic operations for the client.
     */
    get keyId() {
        return this.getKeyID();
    }
    /**
     * Gets the {@link KeyVaultKey} used for cryptography operations, fetching it
     * from KeyVault if necessary.
     * @param options - Additional options.
     */
    getKey(options = {}) {
        return withTrace$2("getKey", options, async (updatedOptions) => {
            if (typeof this.key === "string") {
                if (!this.name || this.name === "") {
                    throw new Error("getKey requires a key with a name");
                }
                const response = await this.client.getKey(this.vaultUrl, this.name, options && options.version ? options.version : this.version ? this.version : "", updatedOptions);
                this.key = getKeyFromKeyBundle(response);
            }
            return this.key;
        });
    }
    /**
     * Attempts to retrieve the ID of the key.
     */
    getKeyID() {
        let kid;
        if (typeof this.key !== "string") {
            kid = this.key.id;
        }
        else {
            kid = this.key;
        }
        return kid;
    }
}
/**
 * A helper method to either get the passed down generated client or initialize a new one.
 * An already constructed generated client may be passed down from {@link KeyClient} in which case we should reuse it.
 *
 * @internal
 * @param credential - The credential to use when initializing a new client.
 * @param options - The options for constructing a client or the underlying client if one already exists.
 * @returns - A generated client instance
 */
function getOrInitializeClient(credential, options) {
    if (options.generatedClient) {
        return options.generatedClient;
    }
    const libInfo = `azsdk-js-keyvault-keys/${SDK_VERSION}`;
    const userAgentOptions = options.userAgentOptions;
    options.userAgentOptions = {
        userAgentPrefix: userAgentOptions && userAgentOptions.userAgentPrefix
            ? `${userAgentOptions.userAgentPrefix} ${libInfo}`
            : libInfo,
    };
    const authPolicy = coreHttp.isTokenCredential(credential)
        ? challengeBasedAuthenticationPolicy(credential)
        : coreHttp.signingPolicy(credential);
    const internalPipelineOptions = Object.assign(Object.assign({}, options), { loggingOptions: {
            logger: logger.info,
            allowedHeaderNames: [
                "x-ms-keyvault-region",
                "x-ms-keyvault-network-info",
                "x-ms-keyvault-service-version",
            ],
        } });
    return new KeyVaultClient(options.serviceVersion || LATEST_API_VERSION, coreHttp.createPipelineFromOptions(internalPipelineOptions, authPolicy));
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
 * @internal
 * Encodes a length of a packet in DER format
 */
function encodeLength(length) {
    if (length <= 127) {
        return Uint8Array.of(length);
    }
    else if (length < 256) {
        return Uint8Array.of(0x81, length);
    }
    else if (length < 65536) {
        return Uint8Array.of(0x82, length >> 8, length & 0xff);
    }
    else {
        throw new Error("Unsupported length to encode");
    }
}
/**
 * @internal
 * Encodes a buffer for DER, as sets the id to the given id
 */
function encodeBuffer(buffer, bufferId) {
    if (buffer.length === 0) {
        return buffer;
    }
    let result = new Uint8Array(buffer);
    // If the high bit is set, prepend a 0
    if (result[0] & 0x80) {
        const array = new Uint8Array(result.length + 1);
        array[0] = 0;
        array.set(result, 1);
        result = array;
    }
    // Prepend the DER header for this buffer
    const encodedLength = encodeLength(result.length);
    const totalLength = 1 + encodedLength.length + result.length;
    const outputBuffer = new Uint8Array(totalLength);
    outputBuffer[0] = bufferId;
    outputBuffer.set(encodedLength, 1);
    outputBuffer.set(result, 1 + encodedLength.length);
    return outputBuffer;
}
function makeSequence(encodedParts) {
    const totalLength = encodedParts.reduce((sum, part) => sum + part.length, 0);
    const sequence = new Uint8Array(totalLength);
    for (let i = 0; i < encodedParts.length; i++) {
        const previousLength = i > 0 ? encodedParts[i - 1].length : 0;
        sequence.set(encodedParts[i], previousLength);
    }
    const full_encoded = encodeBuffer(sequence, 0x30); // SEQUENCE
    return Buffer.from(full_encoded).toString("base64");
}
/**
 * Fill in the PEM with 64 character lines as per RFC:
 *
 * "To represent the encapsulated text of a PEM message, the encoding
 * function's output is delimited into text lines (using local
 * conventions), with each line except the last containing exactly 64
 * printable characters and the final line containing 64 or fewer
 * printable characters."
 */
function formatBase64Sequence(base64Sequence) {
    const lines = base64Sequence.match(/.{1,64}/g);
    let result = "";
    if (lines) {
        for (const line of lines) {
            result += line;
            result += "\n";
        }
    }
    else {
        throw new Error("Could not create correct PEM");
    }
    return result;
}
/**
 * @internal
 * Encode a JWK to PEM format. To do so, it internally repackages the JWK as a DER
 * that is then encoded as a PEM.
 */
function convertJWKtoPEM(key) {
    let result = "";
    if (key.n && key.e) {
        const parts = [key.n, key.e];
        const encodedParts = parts.map((part) => encodeBuffer(part, 0x2)); // INTEGER
        const base64Sequence = makeSequence(encodedParts);
        result += "-----BEGIN RSA PUBLIC KEY-----\n";
        result += formatBase64Sequence(base64Sequence);
        result += "-----END RSA PUBLIC KEY-----\n";
    }
    if (!result.length) {
        throw new Error("Unsupported key format for local operations");
    }
    return result.slice(0, -1); // Removing the last new line
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
class LocalCryptographyUnsupportedError extends Error {
}

// Copyright (c) Microsoft Corporation.
/**
 * An RSA cryptography provider supporting RSA algorithms.
 */
class RsaCryptographyProvider {
    constructor(key) {
        /**
         * The set of algorithms this provider supports
         */
        this.applicableAlgorithms = [
            "RSA1_5",
            "RSA-OAEP",
            "PS256",
            "RS256",
            "PS384",
            "RS384",
            "PS512",
            "RS512",
        ];
        /**
         * The set of operations this provider supports
         */
        this.applicableOperations = [
            "encrypt",
            "wrapKey",
            "verifyData",
        ];
        /**
         * Mapping between signature algorithms and their corresponding hash algorithms. Externally used for testing.
         * @internal
         */
        this.signatureAlgorithmToHashAlgorithm = {
            PS256: "SHA256",
            RS256: "SHA256",
            PS384: "SHA384",
            RS384: "SHA384",
            PS512: "SHA512",
            RS512: "SHA512",
        };
        this.key = key;
    }
    isSupported(algorithm, operation) {
        return (this.applicableAlgorithms.includes(algorithm) && this.applicableOperations.includes(operation));
    }
    encrypt(encryptParameters, _options) {
        this.ensureValid();
        const keyPEM = convertJWKtoPEM(this.key);
        const padding = encryptParameters.algorithm === "RSA1_5" ? constants.RSA_PKCS1_PADDING : constants.RSA_PKCS1_OAEP_PADDING;
        return Promise.resolve({
            algorithm: encryptParameters.algorithm,
            keyID: this.key.kid,
            result: crypto.publicEncrypt({ key: keyPEM, padding: padding }, Buffer.from(encryptParameters.plaintext)),
        });
    }
    decrypt(_decryptParameters, _options) {
        throw new LocalCryptographyUnsupportedError("Decrypting using a local JsonWebKey is not supported.");
    }
    wrapKey(algorithm, keyToWrap, _options) {
        this.ensureValid();
        const keyPEM = convertJWKtoPEM(this.key);
        const padding = algorithm === "RSA1_5" ? constants.RSA_PKCS1_PADDING : constants.RSA_PKCS1_OAEP_PADDING;
        return Promise.resolve({
            algorithm: algorithm,
            result: crypto.publicEncrypt({ key: keyPEM, padding }, Buffer.from(keyToWrap)),
            keyID: this.key.kid,
        });
    }
    unwrapKey(_algorithm, _encryptedKey, _options) {
        throw new LocalCryptographyUnsupportedError("Unwrapping a key using a local JsonWebKey is not supported.");
    }
    sign(_algorithm, _digest, _options) {
        throw new LocalCryptographyUnsupportedError("Signing a digest using a local JsonWebKey is not supported.");
    }
    signData(_algorithm, _data, _options) {
        throw new LocalCryptographyUnsupportedError("Signing a block of data using a local JsonWebKey is not supported.");
    }
    async verify(_algorithm, _digest, _signature, _options) {
        throw new LocalCryptographyUnsupportedError("Verifying a digest using a local JsonWebKey is not supported.");
    }
    verifyData(algorithm, data, signature, _options) {
        this.ensureValid();
        const keyPEM = convertJWKtoPEM(this.key);
        const verifier = createVerify(algorithm, data);
        return Promise.resolve({
            result: verifier.verify(keyPEM, Buffer.from(signature)),
            keyID: this.key.kid,
        });
    }
    ensureValid() {
        var _a, _b;
        if (this.key &&
            ((_a = this.key.kty) === null || _a === void 0 ? void 0 : _a.toUpperCase()) !== "RSA" &&
            ((_b = this.key.kty) === null || _b === void 0 ? void 0 : _b.toUpperCase()) !== "RSA-HSM") {
            throw new Error("Key type does not match the algorithm RSA");
        }
    }
}

// Copyright (c) Microsoft Corporation.
/**
 * An AES cryptography provider supporting AES algorithms.
 * @internal
 */
class AesCryptographyProvider {
    constructor(key) {
        /**
         * The set of algorithms this provider supports.
         * For AES encryption, the values include the underlying algorithm used in crypto
         * as well as the key size in bytes.
         *
         * We start with support for A[SIZE]CBCPAD which uses the PKCS padding (the default padding scheme in node crypto)
         */
        this.supportedAlgorithms = {
            A128CBCPAD: {
                algorithm: "aes-128-cbc",
                keySizeInBytes: 128 >> 3,
            },
            A192CBCPAD: {
                algorithm: "aes-192-cbc",
                keySizeInBytes: 192 >> 3,
            },
            A256CBCPAD: {
                algorithm: "aes-256-cbc",
                keySizeInBytes: 256 >> 3,
            },
        };
        this.supportedOperations = ["encrypt", "decrypt"];
        this.key = key;
    }
    encrypt(encryptParameters, _options) {
        const { algorithm, keySizeInBytes } = this.supportedAlgorithms[encryptParameters.algorithm];
        const iv = encryptParameters.iv || crypto__namespace.randomBytes(16);
        this.ensureValid(keySizeInBytes);
        const cipher = crypto__namespace.createCipheriv(algorithm, this.key.k.subarray(0, keySizeInBytes), iv);
        let encrypted = cipher.update(Buffer.from(encryptParameters.plaintext));
        encrypted = Buffer.concat([encrypted, cipher.final()]);
        return Promise.resolve({
            algorithm: encryptParameters.algorithm,
            result: encrypted,
            iv: iv,
        });
    }
    decrypt(decryptParameters, _options) {
        const { algorithm, keySizeInBytes } = this.supportedAlgorithms[decryptParameters.algorithm];
        this.ensureValid(keySizeInBytes);
        const decipher = crypto__namespace.createDecipheriv(algorithm, this.key.k.subarray(0, keySizeInBytes), decryptParameters.iv);
        let dec = decipher.update(Buffer.from(decryptParameters.ciphertext));
        dec = Buffer.concat([dec, decipher.final()]);
        return Promise.resolve({
            algorithm: decryptParameters.algorithm,
            result: dec,
        });
    }
    isSupported(algorithm, operation) {
        if (!this.key.k) {
            return false;
        }
        if (!Object.keys(this.supportedAlgorithms).includes(algorithm)) {
            return false;
        }
        if (!this.supportedOperations.includes(operation)) {
            return false;
        }
        return true;
    }
    wrapKey(_algorithm, _keyToWrap, _options) {
        throw new LocalCryptographyUnsupportedError("Wrapping a key using a local JsonWebKey is not supported for AES.");
    }
    unwrapKey(_algorithm, _encryptedKey, _options) {
        throw new LocalCryptographyUnsupportedError("Unwrapping a key using a local JsonWebKey is not supported for AES.");
    }
    sign(_algorithm, _digest, _options) {
        throw new LocalCryptographyUnsupportedError("Signing using a local JsonWebKey is not supported for AES.");
    }
    signData(_algorithm, _data, _options) {
        throw new LocalCryptographyUnsupportedError("Signing using a local JsonWebKey is not supported for AES.");
    }
    verify(_algorithm, _digest, _signature, _options) {
        throw new LocalCryptographyUnsupportedError("Verifying using a local JsonWebKey is not supported for AES.");
    }
    verifyData(_algorithm, _data, _signature, _updatedOptions) {
        throw new LocalCryptographyUnsupportedError("Verifying using a local JsonWebKey is not supported for AES.");
    }
    ensureValid(keySizeInBytes) {
        var _a, _b;
        if (this.key &&
            ((_a = this.key.kty) === null || _a === void 0 ? void 0 : _a.toUpperCase()) !== "OCT" &&
            ((_b = this.key.kty) === null || _b === void 0 ? void 0 : _b.toUpperCase()) !== "OCT-HSM") {
            throw new Error("Key type does not match the key type oct or oct-hsm");
        }
        if (!this.key.k) {
            throw new Error("Symmetric key is required");
        }
        if (this.key.k.length < keySizeInBytes) {
            throw new Error(`Key must be at least ${keySizeInBytes << 3} bits`);
        }
    }
}

// Copyright (c) Microsoft Corporation.
const withTrace$1 = createTraceFunction("Azure.KeyVault.Keys.CryptographyClient");
/**
 * A client used to perform cryptographic operations on an Azure Key vault key
 * or a local {@link JsonWebKey}.
 */
class CryptographyClient {
    /**
     * Internal constructor implementation for either local or Key Vault backed keys.
     * @param key - The key to use during cryptography tasks.
     * @param credential - Teh credential to use when constructing a Key Vault Cryptography client.
     */
    constructor(key, credential, pipelineOptions = {}) {
        if (typeof key === "string") {
            // Key URL for remote-local operations.
            this.key = {
                kind: "identifier",
                value: key,
            };
            this.remoteProvider = new RemoteCryptographyProvider(key, credential, pipelineOptions);
        }
        else if ("name" in key) {
            // KeyVault key for remote-local operations.
            this.key = {
                kind: "KeyVaultKey",
                value: key,
            };
            this.remoteProvider = new RemoteCryptographyProvider(key, credential, pipelineOptions);
        }
        else {
            // JsonWebKey for local-only operations.
            this.key = {
                kind: "JsonWebKey",
                value: key,
            };
        }
    }
    /**
     * The base URL to the vault. If a local {@link JsonWebKey} is used vaultUrl will be empty.
     */
    get vaultUrl() {
        var _a;
        return ((_a = this.remoteProvider) === null || _a === void 0 ? void 0 : _a.vaultUrl) || "";
    }
    /**
     * The ID of the key used to perform cryptographic operations for the client.
     */
    get keyID() {
        if (this.key.kind === "identifier") {
            return this.key.value;
        }
        else if (this.key.kind === "KeyVaultKey") {
            return this.key.value.id;
        }
        else {
            return this.key.value.kid;
        }
    }
    encrypt(...args) {
        const [parameters, options] = this.disambiguateEncryptArguments(args);
        return withTrace$1("encrypt", options, async (updatedOptions) => {
            this.ensureValid(await this.fetchKey(updatedOptions), exports.KnownKeyOperations.Encrypt);
            this.initializeIV(parameters);
            const provider = await this.getProvider("encrypt", parameters.algorithm, updatedOptions);
            try {
                return provider.encrypt(parameters, updatedOptions);
            }
            catch (error) {
                if (this.remoteProvider) {
                    return this.remoteProvider.encrypt(parameters, updatedOptions);
                }
                throw error;
            }
        });
    }
    initializeIV(parameters) {
        // For AES-GCM the service **must** generate the IV, so we only populate it for AES-CBC
        const algorithmsRequiringIV = [
            "A128CBC",
            "A128CBCPAD",
            "A192CBC",
            "A192CBCPAD",
            "A256CBC",
            "A256CBCPAD",
        ];
        if (parameters.algorithm in algorithmsRequiringIV) {
            try {
                const cbcParams = parameters;
                if (!cbcParams.iv) {
                    cbcParams.iv = randomBytes(16);
                }
            }
            catch (e) {
                throw new Error(`Unable to initialize IV for algorithm ${parameters.algorithm}. You may pass a valid IV to avoid this error. Error: ${e.message}`);
            }
        }
    }
    /**
     * Standardizes the arguments of multiple overloads into a single shape.
     * @param args - The encrypt arguments
     */
    disambiguateEncryptArguments(args) {
        if (typeof args[0] === "string") {
            // Sample shape: ["RSA1_5", buffer, options]
            return [
                {
                    algorithm: args[0],
                    plaintext: args[1],
                },
                args[2] || {},
            ];
        }
        else {
            // Sample shape: [{ algorithm: "RSA1_5", plaintext: buffer }, options]
            return [args[0], (args[1] || {})];
        }
    }
    decrypt(...args) {
        const [parameters, options] = this.disambiguateDecryptArguments(args);
        return withTrace$1("decrypt", options, async (updatedOptions) => {
            this.ensureValid(await this.fetchKey(updatedOptions), exports.KnownKeyOperations.Decrypt);
            const provider = await this.getProvider("decrypt", parameters.algorithm, updatedOptions);
            try {
                return provider.decrypt(parameters, updatedOptions);
            }
            catch (error) {
                if (this.remoteProvider) {
                    return this.remoteProvider.decrypt(parameters, updatedOptions);
                }
                throw error;
            }
        });
    }
    /**
     * Standardizes the arguments of multiple overloads into a single shape.
     * @param args - The decrypt arguments
     */
    disambiguateDecryptArguments(args) {
        if (typeof args[0] === "string") {
            // Sample shape: ["RSA1_5", encryptedBuffer, options]
            return [
                {
                    algorithm: args[0],
                    ciphertext: args[1],
                },
                args[2] || {},
            ];
        }
        else {
            // Sample shape: [{ algorithm: "RSA1_5", ciphertext: encryptedBuffer }, options]
            return [args[0], (args[1] || {})];
        }
    }
    /**
     * Wraps the given key using the specified cryptography algorithm
     *
     * Example usage:
     * ```ts
     * let client = new CryptographyClient(keyVaultKey, credentials);
     * let result = await client.wrapKey("RSA1_5", keyToWrap);
     * ```
     * @param algorithm - The encryption algorithm to use to wrap the given key.
     * @param key - The key to wrap.
     * @param options - Additional options.
     */
    wrapKey(algorithm, key, options = {}) {
        return withTrace$1("wrapKey", options, async (updatedOptions) => {
            this.ensureValid(await this.fetchKey(updatedOptions), exports.KnownKeyOperations.WrapKey);
            const provider = await this.getProvider("wrapKey", algorithm, updatedOptions);
            try {
                return provider.wrapKey(algorithm, key, updatedOptions);
            }
            catch (err) {
                if (this.remoteProvider) {
                    return this.remoteProvider.wrapKey(algorithm, key, options);
                }
                throw err;
            }
        });
    }
    /**
     * Unwraps the given wrapped key using the specified cryptography algorithm
     *
     * Example usage:
     * ```ts
     * let client = new CryptographyClient(keyVaultKey, credentials);
     * let result = await client.unwrapKey("RSA1_5", keyToUnwrap);
     * ```
     * @param algorithm - The decryption algorithm to use to unwrap the key.
     * @param encryptedKey - The encrypted key to unwrap.
     * @param options - Additional options.
     */
    unwrapKey(algorithm, encryptedKey, options = {}) {
        return withTrace$1("unwrapKey", options, async (updatedOptions) => {
            this.ensureValid(await this.fetchKey(updatedOptions), exports.KnownKeyOperations.UnwrapKey);
            const provider = await this.getProvider("unwrapKey", algorithm, updatedOptions);
            try {
                return provider.unwrapKey(algorithm, encryptedKey, updatedOptions);
            }
            catch (err) {
                if (this.remoteProvider) {
                    return this.remoteProvider.unwrapKey(algorithm, encryptedKey, options);
                }
                throw err;
            }
        });
    }
    /**
     * Cryptographically sign the digest of a message
     *
     * Example usage:
     * ```ts
     * let client = new CryptographyClient(keyVaultKey, credentials);
     * let result = await client.sign("RS256", digest);
     * ```
     * @param algorithm - The signing algorithm to use.
     * @param digest - The digest of the data to sign.
     * @param options - Additional options.
     */
    sign(algorithm, digest, options = {}) {
        return withTrace$1("sign", options, async (updatedOptions) => {
            this.ensureValid(await this.fetchKey(updatedOptions), exports.KnownKeyOperations.Sign);
            const provider = await this.getProvider("sign", algorithm, updatedOptions);
            try {
                return provider.sign(algorithm, digest, updatedOptions);
            }
            catch (err) {
                if (this.remoteProvider) {
                    return this.remoteProvider.sign(algorithm, digest, updatedOptions);
                }
                throw err;
            }
        });
    }
    /**
     * Verify the signed message digest
     *
     * Example usage:
     * ```ts
     * let client = new CryptographyClient(keyVaultKey, credentials);
     * let result = await client.verify("RS256", signedDigest, signature);
     * ```
     * @param algorithm - The signing algorithm to use to verify with.
     * @param digest - The digest to verify.
     * @param signature - The signature to verify the digest against.
     * @param options - Additional options.
     */
    verify(algorithm, digest, signature, options = {}) {
        return withTrace$1("verify", options, async (updatedOptions) => {
            this.ensureValid(await this.fetchKey(updatedOptions), exports.KnownKeyOperations.Verify);
            const provider = await this.getProvider("verify", algorithm, updatedOptions);
            try {
                return provider.verify(algorithm, digest, signature, updatedOptions);
            }
            catch (err) {
                if (this.remoteProvider) {
                    return this.remoteProvider.verify(algorithm, digest, signature, updatedOptions);
                }
                throw err;
            }
        });
    }
    /**
     * Cryptographically sign a block of data
     *
     * Example usage:
     * ```ts
     * let client = new CryptographyClient(keyVaultKey, credentials);
     * let result = await client.signData("RS256", message);
     * ```
     * @param algorithm - The signing algorithm to use.
     * @param data - The data to sign.
     * @param options - Additional options.
     */
    signData(algorithm, data, options = {}) {
        return withTrace$1("signData", options, async (updatedOptions) => {
            this.ensureValid(await this.fetchKey(updatedOptions), exports.KnownKeyOperations.Sign);
            const provider = await this.getProvider("signData", algorithm, updatedOptions);
            try {
                return provider.signData(algorithm, data, updatedOptions);
            }
            catch (err) {
                if (this.remoteProvider) {
                    return this.remoteProvider.signData(algorithm, data, options);
                }
                throw err;
            }
        });
    }
    /**
     * Verify the signed block of data
     *
     * Example usage:
     * ```ts
     * let client = new CryptographyClient(keyVaultKey, credentials);
     * let result = await client.verifyData("RS256", signedMessage, signature);
     * ```
     * @param algorithm - The algorithm to use to verify with.
     * @param data - The signed block of data to verify.
     * @param signature - The signature to verify the block against.
     * @param options - Additional options.
     */
    verifyData(algorithm, data, signature, options = {}) {
        return withTrace$1("verifyData", options, async (updatedOptions) => {
            this.ensureValid(await this.fetchKey(updatedOptions), exports.KnownKeyOperations.Verify);
            const provider = await this.getProvider("verifyData", algorithm, updatedOptions);
            try {
                return provider.verifyData(algorithm, data, signature, updatedOptions);
            }
            catch (err) {
                if (this.remoteProvider) {
                    return this.remoteProvider.verifyData(algorithm, data, signature, updatedOptions);
                }
                throw err;
            }
        });
    }
    /**
     * Retrieves the {@link JsonWebKey} from the Key Vault.
     *
     * Example usage:
     * ```ts
     * let client = new CryptographyClient(keyVaultKey, credentials);
     * let result = await client.getKeyMaterial();
     * ```
     */
    async getKeyMaterial(options) {
        const key = await this.fetchKey(options);
        switch (key.kind) {
            case "JsonWebKey":
                return key.value;
            case "KeyVaultKey":
                return key.value.key;
            default:
                throw new Error("Failed to exchange Key ID for an actual KeyVault Key.");
        }
    }
    /**
     * Returns the underlying key used for cryptographic operations.
     * If needed, fetches the key from KeyVault and exchanges the ID for the actual key.
     * @param options - The additional options.
     */
    async fetchKey(options) {
        if (this.key.kind === "identifier") {
            // Exchange the identifier with the actual key when needed
            const key = await this.remoteProvider.getKey(options);
            this.key = { kind: "KeyVaultKey", value: key };
        }
        return this.key;
    }
    /**
     * Gets the provider that support this algorithm and operation.
     * The available providers are ordered by priority such that the first provider that supports this
     * operation is the one we should use.
     * @param operation - The {@link KeyOperation}.
     * @param algorithm - The algorithm to use.
     */
    async getProvider(operation, algorithm, options) {
        if (!this.providers) {
            const keyMaterial = await this.getKeyMaterial(options);
            // Add local crypto providers as needed
            this.providers = [
                new RsaCryptographyProvider(keyMaterial),
                new AesCryptographyProvider(keyMaterial),
            ];
            // If the remote provider exists, we're in hybrid-mode. Otherwise we're in local-only mode.
            // If we're in hybrid mode the remote provider is used as a catch-all and should be last in the list.
            if (this.remoteProvider) {
                this.providers.push(this.remoteProvider);
            }
        }
        const providers = this.providers.filter((p) => p.isSupported(algorithm, operation));
        if (providers.length === 0) {
            throw new Error(`Unable to support operation: "${operation}" with algorithm: "${algorithm}" ${this.key.kind === "JsonWebKey" ? "using a local JsonWebKey" : ""}`);
        }
        // Return the first provider that supports this request
        return providers[0];
    }
    ensureValid(key, operation) {
        var _a;
        if (key.kind === "KeyVaultKey") {
            const keyOps = key.value.keyOperations;
            const { notBefore, expiresOn } = key.value.properties;
            const now = new Date();
            // Check KeyVault Key Expiration
            if (notBefore && now < notBefore) {
                throw new Error(`Key ${key.value.id} can't be used before ${notBefore.toISOString()}`);
            }
            if (expiresOn && now > expiresOn) {
                throw new Error(`Key ${key.value.id} expired at ${expiresOn.toISOString()}`);
            }
            // Check Key operations
            if (operation && keyOps && !(keyOps === null || keyOps === void 0 ? void 0 : keyOps.includes(operation))) {
                throw new Error(`Operation ${operation} is not supported on key ${key.value.id}`);
            }
        }
        else if (key.kind === "JsonWebKey") {
            // Check JsonWebKey Key operations
            if (operation && key.value.keyOps && !((_a = key.value.keyOps) === null || _a === void 0 ? void 0 : _a.includes(operation))) {
                throw new Error(`Operation ${operation} is not supported on key ${key.value.kid}`);
            }
        }
    }
}

// Copyright (c) Microsoft Corporation.
/** Known values of {@link EncryptionAlgorithm} that the service accepts. */
exports.KnownEncryptionAlgorithms = void 0;
(function (KnownEncryptionAlgorithms) {
    /** Encryption Algorithm - RSA-OAEP */
    KnownEncryptionAlgorithms["RSAOaep"] = "RSA-OAEP";
    /** Encryption Algorithm - RSA-OAEP-256 */
    KnownEncryptionAlgorithms["RSAOaep256"] = "RSA-OAEP-256";
    /** Encryption Algorithm - RSA1_5 */
    KnownEncryptionAlgorithms["RSA15"] = "RSA1_5";
    /** Encryption Algorithm - A128GCM */
    KnownEncryptionAlgorithms["A128GCM"] = "A128GCM";
    /** Encryption Algorithm - A192GCM */
    KnownEncryptionAlgorithms["A192GCM"] = "A192GCM";
    /** Encryption Algorithm - A256GCM */
    KnownEncryptionAlgorithms["A256GCM"] = "A256GCM";
    /** Encryption Algorithm - A128KW */
    KnownEncryptionAlgorithms["A128KW"] = "A128KW";
    /** Encryption Algorithm - A192KW */
    KnownEncryptionAlgorithms["A192KW"] = "A192KW";
    /** Encryption Algorithm - A256KW */
    KnownEncryptionAlgorithms["A256KW"] = "A256KW";
    /** Encryption Algorithm - A128CBC */
    KnownEncryptionAlgorithms["A128CBC"] = "A128CBC";
    /** Encryption Algorithm - A192CBC */
    KnownEncryptionAlgorithms["A192CBC"] = "A192CBC";
    /** Encryption Algorithm - A256CBC */
    KnownEncryptionAlgorithms["A256CBC"] = "A256CBC";
    /** Encryption Algorithm - A128CBCPAD */
    KnownEncryptionAlgorithms["A128Cbcpad"] = "A128CBCPAD";
    /** Encryption Algorithm - A192CBCPAD */
    KnownEncryptionAlgorithms["A192Cbcpad"] = "A192CBCPAD";
    /** Encryption Algorithm - A256CBCPAD */
    KnownEncryptionAlgorithms["A256Cbcpad"] = "A256CBCPAD";
})(exports.KnownEncryptionAlgorithms || (exports.KnownEncryptionAlgorithms = {}));

// Copyright (c) Microsoft Corporation.
const withTrace = createTraceFunction("Azure.KeyVault.Keys.KeyClient");
/**
 * The KeyClient provides methods to manage {@link KeyVaultKey} in the
 * Azure Key Vault. The client supports creating, retrieving, updating,
 * deleting, purging, backing up, restoring and listing KeyVaultKeys. The
 * client also supports listing {@link DeletedKey} for a soft-delete enabled Azure Key
 * Vault.
 */
class KeyClient {
    /**
     * Creates an instance of KeyClient.
     *
     * Example usage:
     * ```ts
     * import { KeyClient } from "@azure/keyvault-keys";
     * import { DefaultAzureCredential } from "@azure/identity";
     *
     * let vaultUrl = `https://<MY KEYVAULT HERE>.vault.azure.net`;
     * let credentials = new DefaultAzureCredential();
     *
     * let client = new KeyClient(vaultUrl, credentials);
     * ```
     * @param vaultUrl - the URL of the Key Vault. It should have this shape: `https://${your-key-vault-name}.vault.azure.net`
     * @param credential - An object that implements the `TokenCredential` interface used to authenticate requests to the service. Use the \@azure/identity package to create a credential that suits your needs.
     * @param pipelineOptions - Pipeline options used to configure Key Vault API requests. Omit this parameter to use the default pipeline configuration.
     */
    constructor(vaultUrl, credential, pipelineOptions = {}) {
        this.vaultUrl = vaultUrl;
        const libInfo = `azsdk-js-keyvault-keys/${SDK_VERSION}`;
        const userAgentOptions = pipelineOptions.userAgentOptions;
        pipelineOptions.userAgentOptions = {
            userAgentPrefix: userAgentOptions && userAgentOptions.userAgentPrefix
                ? `${userAgentOptions.userAgentPrefix} ${libInfo}`
                : libInfo,
        };
        const authPolicy = coreHttp.isTokenCredential(credential)
            ? challengeBasedAuthenticationPolicy(credential)
            : coreHttp.signingPolicy(credential);
        const internalPipelineOptions = Object.assign(Object.assign({}, pipelineOptions), { loggingOptions: {
                logger: logger.info,
                allowedHeaderNames: [
                    "x-ms-keyvault-region",
                    "x-ms-keyvault-network-info",
                    "x-ms-keyvault-service-version",
                ],
            } });
        this.credential = credential;
        this.client = new KeyVaultClient(pipelineOptions.serviceVersion || LATEST_API_VERSION, coreHttp.createPipelineFromOptions(internalPipelineOptions, authPolicy));
    }
    /**
     * The create key operation can be used to create any key type in Azure Key Vault. If the named key
     * already exists, Azure Key Vault creates a new version of the key. It requires the keys/create
     * permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(url, credentials);
     * // Create an elliptic-curve key:
     * let result = await client.createKey("MyKey", "EC");
     * ```
     * Creates a new key, stores it, then returns key parameters and properties to the client.
     * @param name - The name of the key.
     * @param keyType - The type of the key. One of the following: 'EC', 'EC-HSM', 'RSA', 'RSA-HSM', 'oct'.
     * @param options - The optional parameters.
     */
    createKey(name, keyType, options) {
        let unflattenedOptions = {};
        if (options) {
            const { enabled, notBefore, expiresOn: expires, exportable } = options, remainingOptions = tslib.__rest(options, ["enabled", "notBefore", "expiresOn", "exportable"]);
            unflattenedOptions = Object.assign(Object.assign({}, remainingOptions), { keyAttributes: {
                    enabled,
                    notBefore,
                    expires,
                    exportable,
                } });
        }
        return withTrace("createKey", unflattenedOptions, async (updatedOptions) => {
            const response = await this.client.createKey(this.vaultUrl, name, keyType, updatedOptions);
            return getKeyFromKeyBundle(response);
        });
    }
    /**
     * The createEcKey method creates a new elliptic curve key in Azure Key Vault. If the named key
     * already exists, Azure Key Vault creates a new version of the key. It requires the keys/create
     * permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(url, credentials);
     * let result = await client.createEcKey("MyKey", { curve: "P-256" });
     * ```
     * Creates a new key, stores it, then returns key parameters and properties to the client.
     * @param name - The name of the key.
     * @param options - The optional parameters.
     */
    async createEcKey(name, options) {
        const keyType = (options === null || options === void 0 ? void 0 : options.hsm) ? exports.KnownKeyTypes.ECHSM : exports.KnownKeyTypes.EC;
        return this.createKey(name, keyType, options);
    }
    /**
     * The createRSAKey method creates a new RSA key in Azure Key Vault. If the named key
     * already exists, Azure Key Vault creates a new version of the key. It requires the keys/create
     * permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(url, credentials);
     * let result = await client.createRsaKey("MyKey", { keySize: 2048 });
     * ```
     * Creates a new key, stores it, then returns key parameters and properties to the client.
     * @param name - The name of the key.
     * @param options - The optional parameters.
     */
    async createRsaKey(name, options) {
        const keyType = (options === null || options === void 0 ? void 0 : options.hsm) ? exports.KnownKeyTypes.RSAHSM : exports.KnownKeyTypes.RSA;
        return this.createKey(name, keyType, options);
    }
    /**
     * The createOctKey method creates a new OCT key in Azure Key Vault. If the named key
     * already exists, Azure Key Vault creates a new version of the key. It requires the keys/create
     * permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(url, credentials);
     * let result = await client.createOctKey("MyKey", { hsm: true });
     * ```
     * Creates a new key, stores it, then returns key parameters and properties to the client.
     * @param name - The name of the key.
     * @param options - The optional parameters.
     */
    async createOctKey(name, options) {
        const keyType = (options === null || options === void 0 ? void 0 : options.hsm) ? exports.KnownKeyTypes.OctHSM : exports.KnownKeyTypes.Oct;
        return this.createKey(name, keyType, options);
    }
    /**
     * The import key operation may be used to import any key type into an Azure Key Vault. If the
     * named key already exists, Azure Key Vault creates a new version of the key. This operation
     * requires the keys/import permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(url, credentials);
     * // Key contents in myKeyContents
     * let result = await client.importKey("MyKey", myKeyContents);
     * ```
     * Imports an externally created key, stores it, and returns key parameters and properties
     * to the client.
     * @param name - Name for the imported key.
     * @param key - The JSON web key.
     * @param options - The optional parameters.
     */
    importKey(name, key, options) {
        let unflattenedOptions = {};
        if (options) {
            const { enabled, notBefore, exportable, expiresOn: expires, hardwareProtected: hsm } = options, remainingOptions = tslib.__rest(options, ["enabled", "notBefore", "exportable", "expiresOn", "hardwareProtected"]);
            unflattenedOptions = Object.assign(Object.assign({}, remainingOptions), { keyAttributes: {
                    enabled,
                    notBefore,
                    expires,
                    hsm,
                    exportable,
                } });
        }
        return withTrace(`importKey`, unflattenedOptions, async (updatedOptions) => {
            const response = await this.client.importKey(this.vaultUrl, name, key, updatedOptions);
            return getKeyFromKeyBundle(response);
        });
    }
    /**
     * Gets a {@link CryptographyClient} for the given key.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(url, credentials);
     * // get a cryptography client for a given key
     * let cryptographyClient = client.getCryptographyClient("MyKey");
     * ```
     * @param name - The name of the key used to perform cryptographic operations.
     * @param version - Optional version of the key used to perform cryptographic operations.
     * @returns - A {@link CryptographyClient} using the same options, credentials, and http client as this {@link KeyClient}
     */
    getCryptographyClient(keyName, options) {
        const keyUrl = new URL(["keys", keyName, options === null || options === void 0 ? void 0 : options.keyVersion].filter(Boolean).join("/"), this.vaultUrl);
        // The goals of this method are discoverability and performance (by sharing a client and pipeline).
        // The existing cryptography client does not accept a pipeline as an argument, nor does it expose it.
        // In order to avoid publicly exposing the pipeline we will pass in the underlying client as an undocumented
        // property to the constructor so that crypto providers downstream can use it.
        const constructorOptions = {
            generatedClient: this.client,
        };
        const cryptoClient = new CryptographyClient(keyUrl.toString(), this.credential, constructorOptions);
        return cryptoClient;
    }
    /**
     * The delete operation applies to any key stored in Azure Key Vault. Individual versions
     * of a key can not be deleted, only all versions of a given key at once.
     *
     * This function returns a Long Running Operation poller that allows you to wait indefinitely until the key is deleted.
     *
     * This operation requires the keys/delete permission.
     *
     * Example usage:
     * ```ts
     * const client = new KeyClient(url, credentials);
     * await client.createKey("MyKey", "EC");
     * const poller = await client.beginDeleteKey("MyKey");
     *
     * // Serializing the poller
     * const serialized = poller.toString();
     * // A new poller can be created with:
     * // await client.beginDeleteKey("MyKey", { resumeFrom: serialized });
     *
     * // Waiting until it's done
     * const deletedKey = await poller.pollUntilDone();
     * console.log(deletedKey);
     * ```
     * Deletes a key from a specified key vault.
     * @param name - The name of the key.
     * @param options - The optional parameters.
     */
    async beginDeleteKey(name, options = {}) {
        const poller = new DeleteKeyPoller({
            name,
            vaultUrl: this.vaultUrl,
            client: this.client,
            intervalInMs: options.intervalInMs,
            resumeFrom: options.resumeFrom,
            operationOptions: options,
        });
        // This will initialize the poller's operation (the deletion of the key).
        await poller.poll();
        return poller;
    }
    updateKeyProperties(...args) {
        const [name, keyVersion, options] = this.disambiguateUpdateKeyPropertiesArgs(args);
        return withTrace(`updateKeyProperties`, options, async (updatedOptions) => {
            const { enabled, notBefore, expiresOn: expires } = updatedOptions, remainingOptions = tslib.__rest(updatedOptions, ["enabled", "notBefore", "expiresOn"]);
            const unflattenedOptions = Object.assign(Object.assign({}, remainingOptions), { keyAttributes: {
                    enabled,
                    notBefore,
                    expires,
                } });
            const response = await this.client.updateKey(this.vaultUrl, name, keyVersion, unflattenedOptions);
            return getKeyFromKeyBundle(response);
        });
    }
    /**
     * Standardizes an overloaded arguments collection for the updateKeyProperties method.
     *
     * @param args - The arguments collection.
     * @returns - The standardized arguments collection.
     */
    disambiguateUpdateKeyPropertiesArgs(args) {
        if (typeof args[1] === "string") {
            // [name, keyVersion, options?] => [name, keyVersion, options || {}]
            return [args[0], args[1], args[2] || {}];
        }
        else {
            // [name, options?] => [name , "", options || {}]
            return [args[0], "", args[1] || {}];
        }
    }
    /**
     * The getKey method gets a specified key and is applicable to any key stored in Azure Key Vault.
     * This operation requires the keys/get permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(url, credentials);
     * let key = await client.getKey("MyKey");
     * ```
     * Get a specified key from a given key vault.
     * @param name - The name of the key.
     * @param options - The optional parameters.
     */
    getKey(name, options = {}) {
        return withTrace(`getKey`, options, async (updatedOptions) => {
            const response = await this.client.getKey(this.vaultUrl, name, options && options.version ? options.version : "", updatedOptions);
            return getKeyFromKeyBundle(response);
        });
    }
    /**
     * The getDeletedKey method returns the specified deleted key along with its properties.
     * This operation requires the keys/get permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(url, credentials);
     * let key = await client.getDeletedKey("MyDeletedKey");
     * ```
     * Gets the specified deleted key.
     * @param name - The name of the key.
     * @param options - The optional parameters.
     */
    getDeletedKey(name, options = {}) {
        return withTrace(`getDeletedKey`, options, async (updatedOptions) => {
            const response = await this.client.getDeletedKey(this.vaultUrl, name, updatedOptions);
            return getKeyFromKeyBundle(response);
        });
    }
    /**
     * The purge deleted key operation removes the key permanently, without the possibility of
     * recovery. This operation can only be enabled on a soft-delete enabled vault. This operation
     * requires the keys/purge permission.
     *
     * Example usage:
     * ```ts
     * const client = new KeyClient(url, credentials);
     * const deletePoller = await client.beginDeleteKey("MyKey")
     * await deletePoller.pollUntilDone();
     * await client.purgeDeletedKey("MyKey");
     * ```
     * Permanently deletes the specified key.
     * @param name - The name of the key.
     * @param options - The optional parameters.
     */
    purgeDeletedKey(name, options = {}) {
        return withTrace(`purgeDeletedKey`, options, async (updatedOptions) => {
            await this.client.purgeDeletedKey(this.vaultUrl, name, updatedOptions);
        });
    }
    /**
     * Recovers the deleted key in the specified vault. This operation can only be performed on a
     * soft-delete enabled vault.
     *
     * This function returns a Long Running Operation poller that allows you to wait indefinitely until the deleted key is recovered.
     *
     * This operation requires the keys/recover permission.
     *
     * Example usage:
     * ```ts
     * const client = new KeyClient(url, credentials);
     * await client.createKey("MyKey", "EC");
     * const deletePoller = await client.beginDeleteKey("MyKey");
     * await deletePoller.pollUntilDone();
     * const poller = await client.beginRecoverDeletedKey("MyKey");
     *
     * // Serializing the poller
     * const serialized = poller.toString();
     * // A new poller can be created with:
     * // await client.beginRecoverDeletedKey("MyKey", { resumeFrom: serialized });
     *
     * // Waiting until it's done
     * const key = await poller.pollUntilDone();
     * console.log(key);
     * ```
     * Recovers the deleted key to the latest version.
     * @param name - The name of the deleted key.
     * @param options - The optional parameters.
     */
    async beginRecoverDeletedKey(name, options = {}) {
        const poller = new RecoverDeletedKeyPoller({
            name,
            vaultUrl: this.vaultUrl,
            client: this.client,
            intervalInMs: options.intervalInMs,
            resumeFrom: options.resumeFrom,
            operationOptions: options,
        });
        // This will initialize the poller's operation (the deletion of the key).
        await poller.poll();
        return poller;
    }
    /**
     * Requests that a backup of the specified key be downloaded to the client. All versions of the
     * key will be downloaded. This operation requires the keys/backup permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(url, credentials);
     * let backupContents = await client.backupKey("MyKey");
     * ```
     * Backs up the specified key.
     * @param name - The name of the key.
     * @param options - The optional parameters.
     */
    backupKey(name, options = {}) {
        return withTrace(`backupKey`, options, async (updatedOptions) => {
            const response = await this.client.backupKey(this.vaultUrl, name, updatedOptions);
            return response.value;
        });
    }
    /**
     * Restores a backed up key, and all its versions, to a vault. This operation requires the
     * keys/restore permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(url, credentials);
     * let backupContents = await client.backupKey("MyKey");
     * // ...
     * let key = await client.restoreKeyBackup(backupContents);
     * ```
     * Restores a backed up key to a vault.
     * @param backup - The backup blob associated with a key bundle.
     * @param options - The optional parameters.
     */
    async restoreKeyBackup(backup, options = {}) {
        return withTrace(`restoreKeyBackup`, options, async (updatedOptions) => {
            const response = await this.client.restoreKey(this.vaultUrl, backup, updatedOptions);
            return getKeyFromKeyBundle(response);
        });
    }
    /**
     * Gets the requested number of bytes containing random values from a managed HSM.
     * This operation requires the managedHsm/rng permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(vaultUrl, credentials);
     * let { bytes } = await client.getRandomBytes(10);
     * ```
     * @param count - The number of bytes to generate between 1 and 128 inclusive.
     * @param options - The optional parameters.
     */
    getRandomBytes(count, options = {}) {
        return withTrace("getRandomBytes", options, async (updatedOptions) => {
            const response = await this.client.getRandomBytes(this.vaultUrl, count, updatedOptions);
            return response.value;
        });
    }
    /**
     * Rotates the key based on the key policy by generating a new version of the key. This operation requires the keys/rotate permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(vaultUrl, credentials);
     * let key = await client.rotateKey("MyKey");
     * ```
     *
     * @param name - The name of the key to rotate.
     * @param options - The optional parameters.
     */
    rotateKey(name, options = {}) {
        return withTrace("rotateKey", options, async (updatedOptions) => {
            const key = await this.client.rotateKey(this.vaultUrl, name, updatedOptions);
            return getKeyFromKeyBundle(key);
        });
    }
    /**
     * Releases a key from a managed HSM.
     *
     * The release key operation is applicable to all key types. The operation requires the key to be marked exportable and the keys/release permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(vaultUrl, credentials);
     * let result = await client.releaseKey("myKey", target)
     * ```
     *
     * @param name - The name of the key.
     * @param targetAttestationToken - The attestation assertion for the target of the key release.
     * @param options - The optional parameters.
     */
    releaseKey(name, targetAttestationToken, options = {}) {
        return withTrace("releaseKey", options, async (updatedOptions) => {
            const { nonce, algorithm } = updatedOptions, rest = tslib.__rest(updatedOptions, ["nonce", "algorithm"]);
            const result = await this.client.release(this.vaultUrl, name, (options === null || options === void 0 ? void 0 : options.version) || "", targetAttestationToken, Object.assign({ enc: algorithm, nonce }, rest));
            return { value: result.value };
        });
    }
    /**
     * Gets the rotation policy of a Key Vault Key.
     * By default, all keys have a policy that will notify 30 days before expiry.
     *
     * This operation requires the keys/get permission.
     * Example usage:
     * ```ts
     * let client = new KeyClient(vaultUrl, credentials);
     * let result = await client.getKeyRotationPolicy("myKey");
     * ```
     *
     * @param keyName - The name of the key.
     * @param options - The optional parameters.
     */
    getKeyRotationPolicy(keyName, options = {}) {
        return withTrace("getKeyRotationPolicy", options, async () => {
            const policy = await this.client.getKeyRotationPolicy(this.vaultUrl, keyName);
            return keyRotationTransformations.generatedToPublic(policy);
        });
    }
    /**
     * Updates the rotation policy of a Key Vault Key.
     * This operation requires the keys/update permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(vaultUrl, credentials);
     * const setPolicy = await client.updateKeyRotationPolicy("MyKey", myPolicy);
     * ```
     *
     * @param keyName - The name of the key.
     * @param policyProperties - The {@link KeyRotationPolicyProperties} for the policy.
     * @param options - The optional parameters.
     */
    updateKeyRotationPolicy(keyName, policy, options = {}) {
        return withTrace("updateKeyRotationPolicy", options, async (updatedOptions) => {
            const result = await this.client.updateKeyRotationPolicy(this.vaultUrl, keyName, keyRotationTransformations.propertiesToGenerated(policy), updatedOptions);
            return keyRotationTransformations.generatedToPublic(result);
        });
    }
    /**
     * Deals with the pagination of {@link listPropertiesOfKeyVersions}.
     * @param name - The name of the Key Vault Key.
     * @param continuationState - An object that indicates the position of the paginated request.
     * @param options - Common options for the iterative endpoints.
     */
    listPropertiesOfKeyVersionsPage(name, continuationState, options) {
        return tslib.__asyncGenerator(this, arguments, function* listPropertiesOfKeyVersionsPage_1() {
            if (continuationState.continuationToken == null) {
                const optionsComplete = Object.assign({ maxresults: continuationState.maxPageSize }, options);
                const currentSetResponse = yield tslib.__await(withTrace("listPropertiesOfKeyVersionsPage", optionsComplete, async (updatedOptions) => this.client.getKeyVersions(this.vaultUrl, name, updatedOptions)));
                continuationState.continuationToken = currentSetResponse.nextLink;
                if (currentSetResponse.value) {
                    yield yield tslib.__await(currentSetResponse.value.map(getKeyPropertiesFromKeyItem, this));
                }
            }
            while (continuationState.continuationToken) {
                const currentSetResponse = yield tslib.__await(withTrace("listPropertiesOfKeyVersionsPage", options || {}, async (updatedOptions) => this.client.getKeyVersions(continuationState.continuationToken, name, updatedOptions)));
                continuationState.continuationToken = currentSetResponse.nextLink;
                if (currentSetResponse.value) {
                    yield yield tslib.__await(currentSetResponse.value.map(getKeyPropertiesFromKeyItem, this));
                }
                else {
                    break;
                }
            }
        });
    }
    /**
     * Deals with the iteration of all the available results of {@link listPropertiesOfKeyVersions}.
     * @param name - The name of the Key Vault Key.
     * @param options - Common options for the iterative endpoints.
     */
    listPropertiesOfKeyVersionsAll(name, options) {
        return tslib.__asyncGenerator(this, arguments, function* listPropertiesOfKeyVersionsAll_1() {
            var e_1, _a;
            const f = {};
            try {
                for (var _b = tslib.__asyncValues(this.listPropertiesOfKeyVersionsPage(name, f, options)), _c; _c = yield tslib.__await(_b.next()), !_c.done;) {
                    const page = _c.value;
                    for (const item of page) {
                        yield yield tslib.__await(item);
                    }
                }
            }
            catch (e_1_1) { e_1 = { error: e_1_1 }; }
            finally {
                try {
                    if (_c && !_c.done && (_a = _b.return)) yield tslib.__await(_a.call(_b));
                }
                finally { if (e_1) throw e_1.error; }
            }
        });
    }
    /**
     * Iterates all versions of the given key in the vault. The full key identifier, properties, and tags are provided
     * in the response. This operation requires the keys/list permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(url, credentials);
     * for await (const keyProperties of client.listPropertiesOfKeyVersions("MyKey")) {
     *   const key = await client.getKey(keyProperties.name);
     *   console.log("key version: ", key);
     * }
     * ```
     * @param name - Name of the key to fetch versions for
     * @param options - The optional parameters.
     */
    listPropertiesOfKeyVersions(name, options = {}) {
        const iter = this.listPropertiesOfKeyVersionsAll(name, options);
        return {
            next() {
                return iter.next();
            },
            [Symbol.asyncIterator]() {
                return this;
            },
            byPage: (settings = {}) => this.listPropertiesOfKeyVersionsPage(name, settings, options),
        };
    }
    /**
     * Deals with the pagination of {@link listPropertiesOfKeys}.
     * @param continuationState - An object that indicates the position of the paginated request.
     * @param options - Common options for the iterative endpoints.
     */
    listPropertiesOfKeysPage(continuationState, options) {
        return tslib.__asyncGenerator(this, arguments, function* listPropertiesOfKeysPage_1() {
            if (continuationState.continuationToken == null) {
                const optionsComplete = Object.assign({ maxresults: continuationState.maxPageSize }, options);
                const currentSetResponse = yield tslib.__await(withTrace("listPropertiesOfKeysPage", optionsComplete, async (updatedOptions) => this.client.getKeys(this.vaultUrl, updatedOptions)));
                continuationState.continuationToken = currentSetResponse.nextLink;
                if (currentSetResponse.value) {
                    yield yield tslib.__await(currentSetResponse.value.map(getKeyPropertiesFromKeyItem, this));
                }
            }
            while (continuationState.continuationToken) {
                const currentSetResponse = yield tslib.__await(withTrace("KeysClient.listPropertiesOfKeysPage", options || {}, async (updatedOptions) => this.client.getKeys(continuationState.continuationToken, updatedOptions)));
                continuationState.continuationToken = currentSetResponse.nextLink;
                if (currentSetResponse.value) {
                    yield yield tslib.__await(currentSetResponse.value.map(getKeyPropertiesFromKeyItem, this));
                }
                else {
                    break;
                }
            }
        });
    }
    /**
     * Deals with the iteration of all the available results of {@link listPropertiesOfKeys}.
     * @param options - Common options for the iterative endpoints.
     */
    listPropertiesOfKeysAll(options) {
        return tslib.__asyncGenerator(this, arguments, function* listPropertiesOfKeysAll_1() {
            var e_2, _a;
            const f = {};
            try {
                for (var _b = tslib.__asyncValues(this.listPropertiesOfKeysPage(f, options)), _c; _c = yield tslib.__await(_b.next()), !_c.done;) {
                    const page = _c.value;
                    for (const item of page) {
                        yield yield tslib.__await(item);
                    }
                }
            }
            catch (e_2_1) { e_2 = { error: e_2_1 }; }
            finally {
                try {
                    if (_c && !_c.done && (_a = _b.return)) yield tslib.__await(_a.call(_b));
                }
                finally { if (e_2) throw e_2.error; }
            }
        });
    }
    /**
     * Iterates the latest version of all keys in the vault.  The full key identifier and properties are provided
     * in the response. No values are returned for the keys. This operations requires the keys/list permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(url, credentials);
     * for await (const keyProperties of client.listPropertiesOfKeys()) {
     *   const key = await client.getKey(keyProperties.name);
     *   console.log("key: ", key);
     * }
     * ```
     * List all keys in the vault
     * @param options - The optional parameters.
     */
    listPropertiesOfKeys(options = {}) {
        const iter = this.listPropertiesOfKeysAll(options);
        return {
            next() {
                return iter.next();
            },
            [Symbol.asyncIterator]() {
                return this;
            },
            byPage: (settings = {}) => this.listPropertiesOfKeysPage(settings, options),
        };
    }
    /**
     * Deals with the pagination of {@link listDeletedKeys}.
     * @param continuationState - An object that indicates the position of the paginated request.
     * @param options - Common options for the iterative endpoints.
     */
    listDeletedKeysPage(continuationState, options) {
        return tslib.__asyncGenerator(this, arguments, function* listDeletedKeysPage_1() {
            if (continuationState.continuationToken == null) {
                const optionsComplete = Object.assign({ maxresults: continuationState.maxPageSize }, options);
                const currentSetResponse = yield tslib.__await(withTrace("listDeletedKeysPage", optionsComplete, async (updatedOptions) => this.client.getDeletedKeys(this.vaultUrl, updatedOptions)));
                continuationState.continuationToken = currentSetResponse.nextLink;
                if (currentSetResponse.value) {
                    yield yield tslib.__await(currentSetResponse.value.map(getDeletedKeyFromDeletedKeyItem, this));
                }
            }
            while (continuationState.continuationToken) {
                const currentSetResponse = yield tslib.__await(withTrace("listDeletedKeysPage", options || {}, async (updatedOptions) => this.client.getDeletedKeys(continuationState.continuationToken, updatedOptions)));
                continuationState.continuationToken = currentSetResponse.nextLink;
                if (currentSetResponse.value) {
                    yield yield tslib.__await(currentSetResponse.value.map(getDeletedKeyFromDeletedKeyItem, this));
                }
                else {
                    break;
                }
            }
        });
    }
    /**
     * Deals with the iteration of all the available results of {@link listDeletedKeys}.
     * @param options - Common options for the iterative endpoints.
     */
    listDeletedKeysAll(options) {
        return tslib.__asyncGenerator(this, arguments, function* listDeletedKeysAll_1() {
            var e_3, _a;
            const f = {};
            try {
                for (var _b = tslib.__asyncValues(this.listDeletedKeysPage(f, options)), _c; _c = yield tslib.__await(_b.next()), !_c.done;) {
                    const page = _c.value;
                    for (const item of page) {
                        yield yield tslib.__await(item);
                    }
                }
            }
            catch (e_3_1) { e_3 = { error: e_3_1 }; }
            finally {
                try {
                    if (_c && !_c.done && (_a = _b.return)) yield tslib.__await(_a.call(_b));
                }
                finally { if (e_3) throw e_3.error; }
            }
        });
    }
    /**
     * Iterates the deleted keys in the vault.  The full key identifier and properties are provided
     * in the response. No values are returned for the keys. This operations requires the keys/list permission.
     *
     * Example usage:
     * ```ts
     * let client = new KeyClient(url, credentials);
     * for await (const deletedKey of client.listDeletedKeys()) {
     *   console.log("deleted key: ", deletedKey);
     * }
     * ```
     * List all keys in the vault
     * @param options - The optional parameters.
     */
    listDeletedKeys(options = {}) {
        const iter = this.listDeletedKeysAll(options);
        return {
            next() {
                return iter.next();
            },
            [Symbol.asyncIterator]() {
                return this;
            },
            byPage: (settings = {}) => this.listDeletedKeysPage(settings, options),
        };
    }
}

exports.CryptographyClient = CryptographyClient;
exports.KeyClient = KeyClient;
exports.logger = logger;
exports.parseKeyVaultKeyIdentifier = parseKeyVaultKeyIdentifier;
//# sourceMappingURL=index.js.map
The MIT License (MIT)

Copyright (c) 2020 Microsoft

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": "@azure/logger",
  "sdk-type": "client",
  "version": "1.0.3",
  "description": "Microsoft Azure SDK for JavaScript - Logger",
  "main": "./dist/index.js",
  "module": "dist-esm/src/index.js",
  "browser": {
    "./dist-esm/src/log.js": "./dist-esm/src/log.browser.js",
    "process": false
  },
  "react-native": {
    "./dist/index.js": "./dist-esm/src/index.js"
  },
  "engines": {
    "node": ">=12.0.0"
  },
  "types": "./types/logger.d.ts",
  "files": [
    "dist/",
    "dist-esm/src/",
    "types/logger.d.ts",
    "README.md",
    "LICENSE"
  ],
  "repository": "github:Azure/azure-sdk-for-js",
  "author": "Microsoft Corporation",
  "license": "MIT",
  "homepage": "https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/core/logger/README.md",
  "sideEffects": false,
  "dependencies": {
    "tslib": "^2.2.0"
  },
  "devDependencies": {
    "@azure/dev-tool": "^1.0.0",
    "@azure/eslint-plugin-azure-sdk": "^3.0.0",
    "@microsoft/api-extractor": "^7.18.11",
    "@types/chai": "^4.1.6",
    "@types/mocha": "^7.0.2",
    "@types/node": "^12.0.0",
    "@types/sinon": "^9.0.4",
    "chai": "^4.2.0",
    "cross-env": "^7.0.2",
    "delay": "^4.2.0",
    "dotenv": "^8.2.0",
    "eslint": "^7.15.0",
    "karma": "^6.2.0",
    "karma-chrome-launcher": "^3.0.0",
    "karma-coverage": "^2.0.0",
    "karma-edge-launcher": "^0.4.2",
    "karma-env-preprocessor": "^0.1.1",
    "karma-firefox-launcher": "^1.1.0",
    "karma-ie-launcher": "^1.0.0",
    "karma-junit-reporter": "^2.0.1",
    "karma-mocha": "^2.0.1",
    "karma-mocha-reporter": "^2.2.5",
    "karma-sourcemap-loader": "^0.3.8",
    "mocha": "^7.1.1",
    "mocha-junit-reporter": "^1.18.0",
    "nyc": "^14.0.0",
    "prettier": "^1.16.4",
    "puppeteer": "^10.2.0",
    "rimraf": "^3.0.0",
    "rollup": "^1.16.3",
    "sinon": "^9.0.2",
    "ts-node": "^10.0.0",
    "typescript": "~4.2.0",
    "typedoc": "0.15.2"
  }
}// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { log } from "./log";
const debugEnvVariable = (typeof process !== "undefined" && process.env && process.env.DEBUG) || undefined;
let enabledString;
let enabledNamespaces = [];
let skippedNamespaces = [];
const debuggers = [];
if (debugEnvVariable) {
    enable(debugEnvVariable);
}
const debugObj = Object.assign((namespace) => {
    return createDebugger(namespace);
}, {
    enable,
    enabled,
    disable,
    log
});
function enable(namespaces) {
    enabledString = namespaces;
    enabledNamespaces = [];
    skippedNamespaces = [];
    const wildcard = /\*/g;
    const namespaceList = namespaces.split(",").map((ns) => ns.trim().replace(wildcard, ".*?"));
    for (const ns of namespaceList) {
        if (ns.startsWith("-")) {
            skippedNamespaces.push(new RegExp(`^${ns.substr(1)}$`));
        }
        else {
            enabledNamespaces.push(new RegExp(`^${ns}$`));
        }
    }
    for (const instance of debuggers) {
        instance.enabled = enabled(instance.namespace);
    }
}
function enabled(namespace) {
    if (namespace.endsWith("*")) {
        return true;
    }
    for (const skipped of skippedNamespaces) {
        if (skipped.test(namespace)) {
            return false;
        }
    }
    for (const enabledNamespace of enabledNamespaces) {
        if (enabledNamespace.test(namespace)) {
            return true;
        }
    }
    return false;
}
function disable() {
    const result = enabledString || "";
    enable("");
    return result;
}
function createDebugger(namespace) {
    const newDebugger = Object.assign(debug, {
        enabled: enabled(namespace),
        destroy,
        log: debugObj.log,
        namespace,
        extend
    });
    function debug(...args) {
        if (!newDebugger.enabled) {
            return;
        }
        if (args.length > 0) {
            args[0] = `${namespace} ${args[0]}`;
        }
        newDebugger.log(...args);
    }
    debuggers.push(newDebugger);
    return newDebugger;
}
function destroy() {
    const index = debuggers.indexOf(this);
    if (index >= 0) {
        debuggers.splice(index, 1);
        return true;
    }
    return false;
}
function extend(namespace) {
    const newDebugger = createDebugger(`${this.namespace}:${namespace}`);
    newDebugger.log = this.log;
    return newDebugger;
}
export default debugObj;
//# sourceMappingURL=debug.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import debug from "./debug";
const registeredLoggers = new Set();
const logLevelFromEnv = (typeof process !== "undefined" && process.env && process.env.AZURE_LOG_LEVEL) || undefined;
let azureLogLevel;
/**
 * The AzureLogger provides a mechanism for overriding where logs are output to.
 * By default, logs are sent to stderr.
 * Override the `log` method to redirect logs to another location.
 */
export const AzureLogger = debug("azure");
AzureLogger.log = (...args) => {
    debug.log(...args);
};
const AZURE_LOG_LEVELS = ["verbose", "info", "warning", "error"];
if (logLevelFromEnv) {
    // avoid calling setLogLevel because we don't want a mis-set environment variable to crash
    if (isAzureLogLevel(logLevelFromEnv)) {
        setLogLevel(logLevelFromEnv);
    }
    else {
        console.error(`AZURE_LOG_LEVEL set to unknown log level '${logLevelFromEnv}'; logging is not enabled. Acceptable values: ${AZURE_LOG_LEVELS.join(", ")}.`);
    }
}
/**
 * Immediately enables logging at the specified log level.
 * @param level - The log level to enable for logging.
 * Options from most verbose to least verbose are:
 * - verbose
 * - info
 * - warning
 * - error
 */
export function setLogLevel(level) {
    if (level && !isAzureLogLevel(level)) {
        throw new Error(`Unknown log level '${level}'. Acceptable values: ${AZURE_LOG_LEVELS.join(",")}`);
    }
    azureLogLevel = level;
    const enabledNamespaces = [];
    for (const logger of registeredLoggers) {
        if (shouldEnable(logger)) {
            enabledNamespaces.push(logger.namespace);
        }
    }
    debug.enable(enabledNamespaces.join(","));
}
/**
 * Retrieves the currently specified log level.
 */
export function getLogLevel() {
    return azureLogLevel;
}
const levelMap = {
    verbose: 400,
    info: 300,
    warning: 200,
    error: 100
};
/**
 * Creates a logger for use by the Azure SDKs that inherits from `AzureLogger`.
 * @param namespace - The name of the SDK package.
 * @hidden
 */
export function createClientLogger(namespace) {
    const clientRootLogger = AzureLogger.extend(namespace);
    patchLogMethod(AzureLogger, clientRootLogger);
    return {
        error: createLogger(clientRootLogger, "error"),
        warning: createLogger(clientRootLogger, "warning"),
        info: createLogger(clientRootLogger, "info"),
        verbose: createLogger(clientRootLogger, "verbose")
    };
}
function patchLogMethod(parent, child) {
    child.log = (...args) => {
        parent.log(...args);
    };
}
function createLogger(parent, level) {
    const logger = Object.assign(parent.extend(level), {
        level
    });
    patchLogMethod(parent, logger);
    if (shouldEnable(logger)) {
        const enabledNamespaces = debug.disable();
        debug.enable(enabledNamespaces + "," + logger.namespace);
    }
    registeredLoggers.add(logger);
    return logger;
}
function shouldEnable(logger) {
    if (azureLogLevel && levelMap[logger.level] <= levelMap[azureLogLevel]) {
        return true;
    }
    else {
        return false;
    }
}
function isAzureLogLevel(logLevel) {
    return AZURE_LOG_LEVELS.includes(logLevel);
}
//# sourceMappingURL=index.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export function log(...args) {
    if (args.length > 0) {
        const firstArg = String(args[0]);
        if (firstArg.includes(":error")) {
            console.error(...args);
        }
        else if (firstArg.includes(":warning")) {
            console.warn(...args);
        }
        else if (firstArg.includes(":info")) {
            console.info(...args);
        }
        else if (firstArg.includes(":verbose")) {
            console.debug(...args);
        }
        else {
            console.debug(...args);
        }
    }
}
//# sourceMappingURL=log.browser.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import util from "util";
import { EOL } from "os";
export function log(message, ...args) {
    process.stderr.write(`${util.format(message, ...args)}${EOL}`);
}
//# sourceMappingURL=log.js.map'use strict';

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

function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }

var util = _interopDefault(require('util'));
var os = require('os');

// Copyright (c) Microsoft Corporation.
function log(message, ...args) {
    process.stderr.write(`${util.format(message, ...args)}${os.EOL}`);
}

// Copyright (c) Microsoft Corporation.
const debugEnvVariable = (typeof process !== "undefined" && process.env && process.env.DEBUG) || undefined;
let enabledString;
let enabledNamespaces = [];
let skippedNamespaces = [];
const debuggers = [];
if (debugEnvVariable) {
    enable(debugEnvVariable);
}
const debugObj = Object.assign((namespace) => {
    return createDebugger(namespace);
}, {
    enable,
    enabled,
    disable,
    log
});
function enable(namespaces) {
    enabledString = namespaces;
    enabledNamespaces = [];
    skippedNamespaces = [];
    const wildcard = /\*/g;
    const namespaceList = namespaces.split(",").map((ns) => ns.trim().replace(wildcard, ".*?"));
    for (const ns of namespaceList) {
        if (ns.startsWith("-")) {
            skippedNamespaces.push(new RegExp(`^${ns.substr(1)}$`));
        }
        else {
            enabledNamespaces.push(new RegExp(`^${ns}$`));
        }
    }
    for (const instance of debuggers) {
        instance.enabled = enabled(instance.namespace);
    }
}
function enabled(namespace) {
    if (namespace.endsWith("*")) {
        return true;
    }
    for (const skipped of skippedNamespaces) {
        if (skipped.test(namespace)) {
            return false;
        }
    }
    for (const enabledNamespace of enabledNamespaces) {
        if (enabledNamespace.test(namespace)) {
            return true;
        }
    }
    return false;
}
function disable() {
    const result = enabledString || "";
    enable("");
    return result;
}
function createDebugger(namespace) {
    const newDebugger = Object.assign(debug, {
        enabled: enabled(namespace),
        destroy,
        log: debugObj.log,
        namespace,
        extend
    });
    function debug(...args) {
        if (!newDebugger.enabled) {
            return;
        }
        if (args.length > 0) {
            args[0] = `${namespace} ${args[0]}`;
        }
        newDebugger.log(...args);
    }
    debuggers.push(newDebugger);
    return newDebugger;
}
function destroy() {
    const index = debuggers.indexOf(this);
    if (index >= 0) {
        debuggers.splice(index, 1);
        return true;
    }
    return false;
}
function extend(namespace) {
    const newDebugger = createDebugger(`${this.namespace}:${namespace}`);
    newDebugger.log = this.log;
    return newDebugger;
}

// Copyright (c) Microsoft Corporation.
const registeredLoggers = new Set();
const logLevelFromEnv = (typeof process !== "undefined" && process.env && process.env.AZURE_LOG_LEVEL) || undefined;
let azureLogLevel;
/**
 * The AzureLogger provides a mechanism for overriding where logs are output to.
 * By default, logs are sent to stderr.
 * Override the `log` method to redirect logs to another location.
 */
const AzureLogger = debugObj("azure");
AzureLogger.log = (...args) => {
    debugObj.log(...args);
};
const AZURE_LOG_LEVELS = ["verbose", "info", "warning", "error"];
if (logLevelFromEnv) {
    // avoid calling setLogLevel because we don't want a mis-set environment variable to crash
    if (isAzureLogLevel(logLevelFromEnv)) {
        setLogLevel(logLevelFromEnv);
    }
    else {
        console.error(`AZURE_LOG_LEVEL set to unknown log level '${logLevelFromEnv}'; logging is not enabled. Acceptable values: ${AZURE_LOG_LEVELS.join(", ")}.`);
    }
}
/**
 * Immediately enables logging at the specified log level.
 * @param level - The log level to enable for logging.
 * Options from most verbose to least verbose are:
 * - verbose
 * - info
 * - warning
 * - error
 */
function setLogLevel(level) {
    if (level && !isAzureLogLevel(level)) {
        throw new Error(`Unknown log level '${level}'. Acceptable values: ${AZURE_LOG_LEVELS.join(",")}`);
    }
    azureLogLevel = level;
    const enabledNamespaces = [];
    for (const logger of registeredLoggers) {
        if (shouldEnable(logger)) {
            enabledNamespaces.push(logger.namespace);
        }
    }
    debugObj.enable(enabledNamespaces.join(","));
}
/**
 * Retrieves the currently specified log level.
 */
function getLogLevel() {
    return azureLogLevel;
}
const levelMap = {
    verbose: 400,
    info: 300,
    warning: 200,
    error: 100
};
/**
 * Creates a logger for use by the Azure SDKs that inherits from `AzureLogger`.
 * @param namespace - The name of the SDK package.
 * @hidden
 */
function createClientLogger(namespace) {
    const clientRootLogger = AzureLogger.extend(namespace);
    patchLogMethod(AzureLogger, clientRootLogger);
    return {
        error: createLogger(clientRootLogger, "error"),
        warning: createLogger(clientRootLogger, "warning"),
        info: createLogger(clientRootLogger, "info"),
        verbose: createLogger(clientRootLogger, "verbose")
    };
}
function patchLogMethod(parent, child) {
    child.log = (...args) => {
        parent.log(...args);
    };
}
function createLogger(parent, level) {
    const logger = Object.assign(parent.extend(level), {
        level
    });
    patchLogMethod(parent, logger);
    if (shouldEnable(logger)) {
        const enabledNamespaces = debugObj.disable();
        debugObj.enable(enabledNamespaces + "," + logger.namespace);
    }
    registeredLoggers.add(logger);
    return logger;
}
function shouldEnable(logger) {
    if (azureLogLevel && levelMap[logger.level] <= levelMap[azureLogLevel]) {
        return true;
    }
    else {
        return false;
    }
}
function isAzureLogLevel(logLevel) {
    return AZURE_LOG_LEVELS.includes(logLevel);
}

exports.AzureLogger = AzureLogger;
exports.createClientLogger = createClientLogger;
exports.getLogLevel = getLogLevel;
exports.setLogLevel = setLogLevel;
//# sourceMappingURL=index.js.map
MIT License

Copyright (c) Microsoft Corporation. All rights reserved.

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": "@azure/msal-browser",
  "author": {
    "name": "Microsoft",
    "email": "nugetaad@microsoft.com",
    "url": "https://www.microsoft.com"
  },
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/AzureAD/microsoft-authentication-library-for-js.git"
  },
  "version": "2.28.1",
  "description": "Microsoft Authentication Library for js",
  "sideEffects": false,
  "main": "./dist/index.cjs.js",
  "module": "./dist/index.js",
  "types": "./dist/index.d.ts",
  "engines": {
    "node": ">=0.8.0"
  },
  "beachball": {
    "disallowedChangeTypes": [
      "major"
    ]
  },
  "directories": {
    "test": "test"
  },
  "files": [
    "dist",
    "lib/msal-browser.js",
    "lib/msal-browser.js.map",
    "lib/msal-browser.min.js"
  ],
  "devDependencies": {
    "@azure/storage-blob": "^12.2.1",
    "@babel/core": "^7.7.2",
    "@babel/plugin-proposal-class-properties": "^7.7.0",
    "@babel/plugin-proposal-object-rest-spread": "^7.6.2",
    "@babel/preset-env": "^7.7.1",
    "@babel/preset-typescript": "^7.7.2",
    "@rollup/plugin-node-resolve": "^11.2.1",
    "@types/jest": "^26.0.23",
    "@types/sinon": "^7.5.0",
    "dotenv": "^8.2.0",
    "fake-indexeddb": "^3.1.3",
    "husky": "^3.0.9",
    "jest": "^27.0.4",
    "jsdom": "^20.0.0",
    "jsdom-global": "^3.0.2",
    "rimraf": "^3.0.0",
    "rollup": "^2.46.0",
    "rollup-plugin-terser": "^7.0.2",
    "rollup-plugin-typescript2": "^0.29.0",
    "shx": "^0.3.2",
    "sinon": "^7.5.0",
    "ssri": "^8.0.1",
    "ts-jest": "^27.0.2",
    "tslib": "^1.10.0",
    "tslint": "^5.20.0",
    "typescript": "^3.8.3"
  },
  "dependencies": {
    "@azure/msal-common": "^7.3.0"
  }
}/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
(function (global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
    typeof define === 'function' && define.amd ? define(['exports'], factory) :
    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.msal = {}));
}(this, (function (exports) { 'use strict';

    /*! *****************************************************************************
    Copyright (c) Microsoft Corporation.

    Permission to use, copy, modify, and/or distribute this software for any
    purpose with or without fee is hereby granted.

    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.
    ***************************************************************************** */
    /* global Reflect, Promise */

    var extendStatics$1 = function(d, b) {
        extendStatics$1 = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics$1(d, b);
    };

    function __extends$1(d, b) {
        extendStatics$1(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    }

    var __assign$1 = function() {
        __assign$1 = Object.assign || function __assign(t) {
            for (var s, i = 1, n = arguments.length; i < n; i++) {
                s = arguments[i];
                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
            }
            return t;
        };
        return __assign$1.apply(this, arguments);
    };

    function __rest(s, e) {
        var t = {};
        for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
            t[p] = s[p];
        if (s != null && typeof Object.getOwnPropertySymbols === "function")
            for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
                if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
                    t[p[i]] = s[p[i]];
            }
        return t;
    }

    function __awaiter$1(thisArg, _arguments, P, generator) {
        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
        return new (P || (P = Promise))(function (resolve, reject) {
            function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
            function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
            step((generator = generator.apply(thisArg, _arguments || [])).next());
        });
    }

    function __generator$1(thisArg, body) {
        var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
        return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
        function verb(n) { return function (v) { return step([n, v]); }; }
        function step(op) {
            if (f) throw new TypeError("Generator is already executing.");
            while (_) try {
                if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
                if (y = 0, t) op = [op[0] & 2, t.value];
                switch (op[0]) {
                    case 0: case 1: t = op; break;
                    case 4: _.label++; return { value: op[1], done: false };
                    case 5: _.label++; y = op[1]; op = [0]; continue;
                    case 7: op = _.ops.pop(); _.trys.pop(); continue;
                    default:
                        if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                        if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                        if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                        if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                        if (t[2]) _.ops.pop();
                        _.trys.pop(); continue;
                }
                op = body.call(thisArg, _);
            } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
            if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
        }
    }

    function __read(o, n) {
        var m = typeof Symbol === "function" && o[Symbol.iterator];
        if (!m) return o;
        var i = m.call(o), r, ar = [], e;
        try {
            while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
        }
        catch (error) { e = { error: error }; }
        finally {
            try {
                if (r && !r.done && (m = i["return"])) m.call(i);
            }
            finally { if (e) throw e.error; }
        }
        return ar;
    }

    function __spread() {
        for (var ar = [], i = 0; i < arguments.length; i++)
            ar = ar.concat(__read(arguments[i]));
        return ar;
    }

    /*! @azure/msal-common v7.3.0 2022-08-01 */
    /*! *****************************************************************************
    Copyright (c) Microsoft Corporation.

    Permission to use, copy, modify, and/or distribute this software for any
    purpose with or without fee is hereby granted.

    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.
    ***************************************************************************** */
    /* global Reflect, Promise */

    var extendStatics = function(d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };

    function __extends(d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    }

    var __assign = function() {
        __assign = Object.assign || function __assign(t) {
            for (var s, i = 1, n = arguments.length; i < n; i++) {
                s = arguments[i];
                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
            }
            return t;
        };
        return __assign.apply(this, arguments);
    };

    function __awaiter(thisArg, _arguments, P, generator) {
        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
        return new (P || (P = Promise))(function (resolve, reject) {
            function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
            function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
            step((generator = generator.apply(thisArg, _arguments || [])).next());
        });
    }

    function __generator(thisArg, body) {
        var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
        return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
        function verb(n) { return function (v) { return step([n, v]); }; }
        function step(op) {
            if (f) throw new TypeError("Generator is already executing.");
            while (_) try {
                if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
                if (y = 0, t) op = [op[0] & 2, t.value];
                switch (op[0]) {
                    case 0: case 1: t = op; break;
                    case 4: _.label++; return { value: op[1], done: false };
                    case 5: _.label++; y = op[1]; op = [0]; continue;
                    case 7: op = _.ops.pop(); _.trys.pop(); continue;
                    default:
                        if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                        if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                        if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                        if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                        if (t[2]) _.ops.pop();
                        _.trys.pop(); continue;
                }
                op = body.call(thisArg, _);
            } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
            if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
        }
    }

    function __spreadArrays() {
        for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
        for (var r = Array(s), k = 0, i = 0; i < il; i++)
            for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
                r[k] = a[j];
        return r;
    }

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var Constants = {
        LIBRARY_NAME: "MSAL.JS",
        SKU: "msal.js.common",
        // Prefix for all library cache entries
        CACHE_PREFIX: "msal",
        // default authority
        DEFAULT_AUTHORITY: "https://login.microsoftonline.com/common/",
        DEFAULT_AUTHORITY_HOST: "login.microsoftonline.com",
        DEFAULT_COMMON_TENANT: "common",
        // ADFS String
        ADFS: "adfs",
        // Default AAD Instance Discovery Endpoint
        AAD_INSTANCE_DISCOVERY_ENDPT: "https://login.microsoftonline.com/common/discovery/instance?api-version=1.1&authorization_endpoint=",
        // Resource delimiter - used for certain cache entries
        RESOURCE_DELIM: "|",
        // Placeholder for non-existent account ids/objects
        NO_ACCOUNT: "NO_ACCOUNT",
        // Claims
        CLAIMS: "claims",
        // Consumer UTID
        CONSUMER_UTID: "9188040d-6c67-4c5b-b112-36a304b66dad",
        // Default scopes
        OPENID_SCOPE: "openid",
        PROFILE_SCOPE: "profile",
        OFFLINE_ACCESS_SCOPE: "offline_access",
        EMAIL_SCOPE: "email",
        // Default response type for authorization code flow
        CODE_RESPONSE_TYPE: "code",
        CODE_GRANT_TYPE: "authorization_code",
        RT_GRANT_TYPE: "refresh_token",
        FRAGMENT_RESPONSE_MODE: "fragment",
        S256_CODE_CHALLENGE_METHOD: "S256",
        URL_FORM_CONTENT_TYPE: "application/x-www-form-urlencoded;charset=utf-8",
        AUTHORIZATION_PENDING: "authorization_pending",
        NOT_DEFINED: "not_defined",
        EMPTY_STRING: "",
        FORWARD_SLASH: "/",
        IMDS_ENDPOINT: "http://169.254.169.254/metadata/instance/compute/location",
        IMDS_VERSION: "2020-06-01",
        IMDS_TIMEOUT: 2000,
        AZURE_REGION_AUTO_DISCOVER_FLAG: "TryAutoDetect",
        REGIONAL_AUTH_PUBLIC_CLOUD_SUFFIX: "login.microsoft.com",
        KNOWN_PUBLIC_CLOUDS: ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"],
        TOKEN_RESPONSE_TYPE: "token",
        ID_TOKEN_RESPONSE_TYPE: "id_token",
        SHR_NONCE_VALIDITY: 240,
    };
    var OIDC_DEFAULT_SCOPES = [
        Constants.OPENID_SCOPE,
        Constants.PROFILE_SCOPE,
        Constants.OFFLINE_ACCESS_SCOPE
    ];
    var OIDC_SCOPES = __spreadArrays(OIDC_DEFAULT_SCOPES, [
        Constants.EMAIL_SCOPE
    ]);
    /**
     * Request header names
     */
    var HeaderNames;
    (function (HeaderNames) {
        HeaderNames["CONTENT_TYPE"] = "Content-Type";
        HeaderNames["RETRY_AFTER"] = "Retry-After";
        HeaderNames["CCS_HEADER"] = "X-AnchorMailbox";
        HeaderNames["WWWAuthenticate"] = "WWW-Authenticate";
        HeaderNames["AuthenticationInfo"] = "Authentication-Info";
    })(HeaderNames || (HeaderNames = {}));
    /**
     * Persistent cache keys MSAL which stay while user is logged in.
     */
    var PersistentCacheKeys;
    (function (PersistentCacheKeys) {
        PersistentCacheKeys["ID_TOKEN"] = "idtoken";
        PersistentCacheKeys["CLIENT_INFO"] = "client.info";
        PersistentCacheKeys["ADAL_ID_TOKEN"] = "adal.idtoken";
        PersistentCacheKeys["ERROR"] = "error";
        PersistentCacheKeys["ERROR_DESC"] = "error.description";
        PersistentCacheKeys["ACTIVE_ACCOUNT"] = "active-account";
        PersistentCacheKeys["ACTIVE_ACCOUNT_FILTERS"] = "active-account-filters"; // new cache entry for active_account for a more robust version for browser
    })(PersistentCacheKeys || (PersistentCacheKeys = {}));
    /**
     * String constants related to AAD Authority
     */
    var AADAuthorityConstants;
    (function (AADAuthorityConstants) {
        AADAuthorityConstants["COMMON"] = "common";
        AADAuthorityConstants["ORGANIZATIONS"] = "organizations";
        AADAuthorityConstants["CONSUMERS"] = "consumers";
    })(AADAuthorityConstants || (AADAuthorityConstants = {}));
    /**
     * Keys in the hashParams sent by AAD Server
     */
    var AADServerParamKeys;
    (function (AADServerParamKeys) {
        AADServerParamKeys["CLIENT_ID"] = "client_id";
        AADServerParamKeys["REDIRECT_URI"] = "redirect_uri";
        AADServerParamKeys["RESPONSE_TYPE"] = "response_type";
        AADServerParamKeys["RESPONSE_MODE"] = "response_mode";
        AADServerParamKeys["GRANT_TYPE"] = "grant_type";
        AADServerParamKeys["CLAIMS"] = "claims";
        AADServerParamKeys["SCOPE"] = "scope";
        AADServerParamKeys["ERROR"] = "error";
        AADServerParamKeys["ERROR_DESCRIPTION"] = "error_description";
        AADServerParamKeys["ACCESS_TOKEN"] = "access_token";
        AADServerParamKeys["ID_TOKEN"] = "id_token";
        AADServerParamKeys["REFRESH_TOKEN"] = "refresh_token";
        AADServerParamKeys["EXPIRES_IN"] = "expires_in";
        AADServerParamKeys["STATE"] = "state";
        AADServerParamKeys["NONCE"] = "nonce";
        AADServerParamKeys["PROMPT"] = "prompt";
        AADServerParamKeys["SESSION_STATE"] = "session_state";
        AADServerParamKeys["CLIENT_INFO"] = "client_info";
        AADServerParamKeys["CODE"] = "code";
        AADServerParamKeys["CODE_CHALLENGE"] = "code_challenge";
        AADServerParamKeys["CODE_CHALLENGE_METHOD"] = "code_challenge_method";
        AADServerParamKeys["CODE_VERIFIER"] = "code_verifier";
        AADServerParamKeys["CLIENT_REQUEST_ID"] = "client-request-id";
        AADServerParamKeys["X_CLIENT_SKU"] = "x-client-SKU";
        AADServerParamKeys["X_CLIENT_VER"] = "x-client-VER";
        AADServerParamKeys["X_CLIENT_OS"] = "x-client-OS";
        AADServerParamKeys["X_CLIENT_CPU"] = "x-client-CPU";
        AADServerParamKeys["X_CLIENT_CURR_TELEM"] = "x-client-current-telemetry";
        AADServerParamKeys["X_CLIENT_LAST_TELEM"] = "x-client-last-telemetry";
        AADServerParamKeys["X_MS_LIB_CAPABILITY"] = "x-ms-lib-capability";
        AADServerParamKeys["X_APP_NAME"] = "x-app-name";
        AADServerParamKeys["X_APP_VER"] = "x-app-ver";
        AADServerParamKeys["POST_LOGOUT_URI"] = "post_logout_redirect_uri";
        AADServerParamKeys["ID_TOKEN_HINT"] = "id_token_hint";
        AADServerParamKeys["DEVICE_CODE"] = "device_code";
        AADServerParamKeys["CLIENT_SECRET"] = "client_secret";
        AADServerParamKeys["CLIENT_ASSERTION"] = "client_assertion";
        AADServerParamKeys["CLIENT_ASSERTION_TYPE"] = "client_assertion_type";
        AADServerParamKeys["TOKEN_TYPE"] = "token_type";
        AADServerParamKeys["REQ_CNF"] = "req_cnf";
        AADServerParamKeys["OBO_ASSERTION"] = "assertion";
        AADServerParamKeys["REQUESTED_TOKEN_USE"] = "requested_token_use";
        AADServerParamKeys["ON_BEHALF_OF"] = "on_behalf_of";
        AADServerParamKeys["FOCI"] = "foci";
        AADServerParamKeys["CCS_HEADER"] = "X-AnchorMailbox";
        AADServerParamKeys["RETURN_SPA_CODE"] = "return_spa_code";
        AADServerParamKeys["NATIVE_BROKER"] = "nativebroker";
        AADServerParamKeys["LOGOUT_HINT"] = "logout_hint";
    })(AADServerParamKeys || (AADServerParamKeys = {}));
    /**
     * Claims request keys
     */
    var ClaimsRequestKeys;
    (function (ClaimsRequestKeys) {
        ClaimsRequestKeys["ACCESS_TOKEN"] = "access_token";
        ClaimsRequestKeys["XMS_CC"] = "xms_cc";
    })(ClaimsRequestKeys || (ClaimsRequestKeys = {}));
    /**
     * we considered making this "enum" in the request instead of string, however it looks like the allowed list of
     * prompt values kept changing over past couple of years. There are some undocumented prompt values for some
     * internal partners too, hence the choice of generic "string" type instead of the "enum"
     */
    var PromptValue = {
        LOGIN: "login",
        SELECT_ACCOUNT: "select_account",
        CONSENT: "consent",
        NONE: "none",
        CREATE: "create"
    };
    /**
     * SSO Types - generated to populate hints
     */
    var SSOTypes;
    (function (SSOTypes) {
        SSOTypes["ACCOUNT"] = "account";
        SSOTypes["SID"] = "sid";
        SSOTypes["LOGIN_HINT"] = "login_hint";
        SSOTypes["ID_TOKEN"] = "id_token";
        SSOTypes["DOMAIN_HINT"] = "domain_hint";
        SSOTypes["ORGANIZATIONS"] = "organizations";
        SSOTypes["CONSUMERS"] = "consumers";
        SSOTypes["ACCOUNT_ID"] = "accountIdentifier";
        SSOTypes["HOMEACCOUNT_ID"] = "homeAccountIdentifier";
    })(SSOTypes || (SSOTypes = {}));
    /**
     * allowed values for codeVerifier
     */
    var CodeChallengeMethodValues = {
        PLAIN: "plain",
        S256: "S256"
    };
    /**
     * allowed values for response_mode
     */
    var ResponseMode;
    (function (ResponseMode) {
        ResponseMode["QUERY"] = "query";
        ResponseMode["FRAGMENT"] = "fragment";
        ResponseMode["FORM_POST"] = "form_post";
    })(ResponseMode || (ResponseMode = {}));
    /**
     * allowed grant_type
     */
    var GrantType;
    (function (GrantType) {
        GrantType["IMPLICIT_GRANT"] = "implicit";
        GrantType["AUTHORIZATION_CODE_GRANT"] = "authorization_code";
        GrantType["CLIENT_CREDENTIALS_GRANT"] = "client_credentials";
        GrantType["RESOURCE_OWNER_PASSWORD_GRANT"] = "password";
        GrantType["REFRESH_TOKEN_GRANT"] = "refresh_token";
        GrantType["DEVICE_CODE_GRANT"] = "device_code";
        GrantType["JWT_BEARER"] = "urn:ietf:params:oauth:grant-type:jwt-bearer";
    })(GrantType || (GrantType = {}));
    /**
     * Account types in Cache
     */
    var CacheAccountType;
    (function (CacheAccountType) {
        CacheAccountType["MSSTS_ACCOUNT_TYPE"] = "MSSTS";
        CacheAccountType["ADFS_ACCOUNT_TYPE"] = "ADFS";
        CacheAccountType["MSAV1_ACCOUNT_TYPE"] = "MSA";
        CacheAccountType["GENERIC_ACCOUNT_TYPE"] = "Generic"; // NTLM, Kerberos, FBA, Basic etc
    })(CacheAccountType || (CacheAccountType = {}));
    /**
     * Separators used in cache
     */
    var Separators;
    (function (Separators) {
        Separators["CACHE_KEY_SEPARATOR"] = "-";
        Separators["CLIENT_INFO_SEPARATOR"] = ".";
    })(Separators || (Separators = {}));
    /**
     * Credential Type stored in the cache
     */
    var CredentialType;
    (function (CredentialType) {
        CredentialType["ID_TOKEN"] = "IdToken";
        CredentialType["ACCESS_TOKEN"] = "AccessToken";
        CredentialType["ACCESS_TOKEN_WITH_AUTH_SCHEME"] = "AccessToken_With_AuthScheme";
        CredentialType["REFRESH_TOKEN"] = "RefreshToken";
    })(CredentialType || (CredentialType = {}));
    /**
     * Credential Type stored in the cache
     */
    var CacheSchemaType;
    (function (CacheSchemaType) {
        CacheSchemaType["ACCOUNT"] = "Account";
        CacheSchemaType["CREDENTIAL"] = "Credential";
        CacheSchemaType["ID_TOKEN"] = "IdToken";
        CacheSchemaType["ACCESS_TOKEN"] = "AccessToken";
        CacheSchemaType["REFRESH_TOKEN"] = "RefreshToken";
        CacheSchemaType["APP_METADATA"] = "AppMetadata";
        CacheSchemaType["TEMPORARY"] = "TempCache";
        CacheSchemaType["TELEMETRY"] = "Telemetry";
        CacheSchemaType["UNDEFINED"] = "Undefined";
        CacheSchemaType["THROTTLING"] = "Throttling";
    })(CacheSchemaType || (CacheSchemaType = {}));
    /**
     * Combine all cache types
     */
    var CacheType;
    (function (CacheType) {
        CacheType[CacheType["ADFS"] = 1001] = "ADFS";
        CacheType[CacheType["MSA"] = 1002] = "MSA";
        CacheType[CacheType["MSSTS"] = 1003] = "MSSTS";
        CacheType[CacheType["GENERIC"] = 1004] = "GENERIC";
        CacheType[CacheType["ACCESS_TOKEN"] = 2001] = "ACCESS_TOKEN";
        CacheType[CacheType["REFRESH_TOKEN"] = 2002] = "REFRESH_TOKEN";
        CacheType[CacheType["ID_TOKEN"] = 2003] = "ID_TOKEN";
        CacheType[CacheType["APP_METADATA"] = 3001] = "APP_METADATA";
        CacheType[CacheType["UNDEFINED"] = 9999] = "UNDEFINED";
    })(CacheType || (CacheType = {}));
    /**
     * More Cache related constants
     */
    var APP_METADATA = "appmetadata";
    var CLIENT_INFO = "client_info";
    var THE_FAMILY_ID = "1";
    var AUTHORITY_METADATA_CONSTANTS = {
        CACHE_KEY: "authority-metadata",
        REFRESH_TIME_SECONDS: 3600 * 24 // 24 Hours
    };
    var AuthorityMetadataSource;
    (function (AuthorityMetadataSource) {
        AuthorityMetadataSource["CONFIG"] = "config";
        AuthorityMetadataSource["CACHE"] = "cache";
        AuthorityMetadataSource["NETWORK"] = "network";
        AuthorityMetadataSource["HARDCODED_VALUES"] = "hardcoded_values";
    })(AuthorityMetadataSource || (AuthorityMetadataSource = {}));
    var SERVER_TELEM_CONSTANTS = {
        SCHEMA_VERSION: 5,
        MAX_CUR_HEADER_BYTES: 80,
        MAX_LAST_HEADER_BYTES: 330,
        MAX_CACHED_ERRORS: 50,
        CACHE_KEY: "server-telemetry",
        CATEGORY_SEPARATOR: "|",
        VALUE_SEPARATOR: ",",
        OVERFLOW_TRUE: "1",
        OVERFLOW_FALSE: "0",
        UNKNOWN_ERROR: "unknown_error"
    };
    /**
     * Type of the authentication request
     */
    exports.AuthenticationScheme = void 0;
    (function (AuthenticationScheme) {
        AuthenticationScheme["BEARER"] = "Bearer";
        AuthenticationScheme["POP"] = "pop";
        AuthenticationScheme["SSH"] = "ssh-cert";
    })(exports.AuthenticationScheme || (exports.AuthenticationScheme = {}));
    /**
     * Constants related to throttling
     */
    var ThrottlingConstants = {
        // Default time to throttle RequestThumbprint in seconds
        DEFAULT_THROTTLE_TIME_SECONDS: 60,
        // Default maximum time to throttle in seconds, overrides what the server sends back
        DEFAULT_MAX_THROTTLE_TIME_SECONDS: 3600,
        // Prefix for storing throttling entries
        THROTTLING_PREFIX: "throttling",
        // Value assigned to the x-ms-lib-capability header to indicate to the server the library supports throttling
        X_MS_LIB_CAPABILITY_VALUE: "retry-after, h429"
    };
    var Errors = {
        INVALID_GRANT_ERROR: "invalid_grant",
        CLIENT_MISMATCH_ERROR: "client_mismatch",
    };
    /**
     * Password grant parameters
     */
    var PasswordGrantConstants;
    (function (PasswordGrantConstants) {
        PasswordGrantConstants["username"] = "username";
        PasswordGrantConstants["password"] = "password";
    })(PasswordGrantConstants || (PasswordGrantConstants = {}));
    /**
     * Response codes
     */
    var ResponseCodes;
    (function (ResponseCodes) {
        ResponseCodes[ResponseCodes["httpSuccess"] = 200] = "httpSuccess";
        ResponseCodes[ResponseCodes["httpBadRequest"] = 400] = "httpBadRequest";
    })(ResponseCodes || (ResponseCodes = {}));
    /**
     * Region Discovery Sources
     */
    var RegionDiscoverySources;
    (function (RegionDiscoverySources) {
        RegionDiscoverySources["FAILED_AUTO_DETECTION"] = "1";
        RegionDiscoverySources["INTERNAL_CACHE"] = "2";
        RegionDiscoverySources["ENVIRONMENT_VARIABLE"] = "3";
        RegionDiscoverySources["IMDS"] = "4";
    })(RegionDiscoverySources || (RegionDiscoverySources = {}));
    /**
     * Region Discovery Outcomes
     */
    var RegionDiscoveryOutcomes;
    (function (RegionDiscoveryOutcomes) {
        RegionDiscoveryOutcomes["CONFIGURED_MATCHES_DETECTED"] = "1";
        RegionDiscoveryOutcomes["CONFIGURED_NO_AUTO_DETECTION"] = "2";
        RegionDiscoveryOutcomes["CONFIGURED_NOT_DETECTED"] = "3";
        RegionDiscoveryOutcomes["AUTO_DETECTION_REQUESTED_SUCCESSFUL"] = "4";
        RegionDiscoveryOutcomes["AUTO_DETECTION_REQUESTED_FAILED"] = "5";
    })(RegionDiscoveryOutcomes || (RegionDiscoveryOutcomes = {}));
    var CacheOutcome;
    (function (CacheOutcome) {
        CacheOutcome["NO_CACHE_HIT"] = "0";
        CacheOutcome["FORCE_REFRESH"] = "1";
        CacheOutcome["NO_CACHED_ACCESS_TOKEN"] = "2";
        CacheOutcome["CACHED_ACCESS_TOKEN_EXPIRED"] = "3";
        CacheOutcome["REFRESH_CACHED_ACCESS_TOKEN"] = "4";
    })(CacheOutcome || (CacheOutcome = {}));
    var JsonTypes;
    (function (JsonTypes) {
        JsonTypes["Jwt"] = "JWT";
        JsonTypes["Jwk"] = "JWK";
    })(JsonTypes || (JsonTypes = {}));

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * AuthErrorMessage class containing string constants used by error codes and messages.
     */
    var AuthErrorMessage = {
        unexpectedError: {
            code: "unexpected_error",
            desc: "Unexpected error in authentication."
        },
        postRequestFailed: {
            code: "post_request_failed",
            desc: "Post request failed from the network, could be a 4xx/5xx or a network unavailability. Please check the exact error code for details."
        }
    };
    /**
     * General error class thrown by the MSAL.js library.
     */
    var AuthError = /** @class */ (function (_super) {
        __extends(AuthError, _super);
        function AuthError(errorCode, errorMessage, suberror) {
            var _this = this;
            var errorString = errorMessage ? errorCode + ": " + errorMessage : errorCode;
            _this = _super.call(this, errorString) || this;
            Object.setPrototypeOf(_this, AuthError.prototype);
            _this.errorCode = errorCode || Constants.EMPTY_STRING;
            _this.errorMessage = errorMessage || Constants.EMPTY_STRING;
            _this.subError = suberror || Constants.EMPTY_STRING;
            _this.name = "AuthError";
            return _this;
        }
        AuthError.prototype.setCorrelationId = function (correlationId) {
            this.correlationId = correlationId;
        };
        /**
         * Creates an error that is thrown when something unexpected happens in the library.
         * @param errDesc
         */
        AuthError.createUnexpectedError = function (errDesc) {
            return new AuthError(AuthErrorMessage.unexpectedError.code, AuthErrorMessage.unexpectedError.desc + ": " + errDesc);
        };
        /**
         * Creates an error for post request failures.
         * @param errDesc
         * @returns
         */
        AuthError.createPostRequestFailed = function (errDesc) {
            return new AuthError(AuthErrorMessage.postRequestFailed.code, AuthErrorMessage.postRequestFailed.desc + ": " + errDesc);
        };
        return AuthError;
    }(Error));

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var DEFAULT_CRYPTO_IMPLEMENTATION = {
        createNewGuid: function () {
            var notImplErr = "Crypto interface - createNewGuid() has not been implemented";
            throw AuthError.createUnexpectedError(notImplErr);
        },
        base64Decode: function () {
            var notImplErr = "Crypto interface - base64Decode() has not been implemented";
            throw AuthError.createUnexpectedError(notImplErr);
        },
        base64Encode: function () {
            var notImplErr = "Crypto interface - base64Encode() has not been implemented";
            throw AuthError.createUnexpectedError(notImplErr);
        },
        generatePkceCodes: function () {
            return __awaiter(this, void 0, void 0, function () {
                var notImplErr;
                return __generator(this, function (_a) {
                    notImplErr = "Crypto interface - generatePkceCodes() has not been implemented";
                    throw AuthError.createUnexpectedError(notImplErr);
                });
            });
        },
        getPublicKeyThumbprint: function () {
            return __awaiter(this, void 0, void 0, function () {
                var notImplErr;
                return __generator(this, function (_a) {
                    notImplErr = "Crypto interface - getPublicKeyThumbprint() has not been implemented";
                    throw AuthError.createUnexpectedError(notImplErr);
                });
            });
        },
        removeTokenBindingKey: function () {
            return __awaiter(this, void 0, void 0, function () {
                var notImplErr;
                return __generator(this, function (_a) {
                    notImplErr = "Crypto interface - removeTokenBindingKey() has not been implemented";
                    throw AuthError.createUnexpectedError(notImplErr);
                });
            });
        },
        clearKeystore: function () {
            return __awaiter(this, void 0, void 0, function () {
                var notImplErr;
                return __generator(this, function (_a) {
                    notImplErr = "Crypto interface - clearKeystore() has not been implemented";
                    throw AuthError.createUnexpectedError(notImplErr);
                });
            });
        },
        signJwt: function () {
            return __awaiter(this, void 0, void 0, function () {
                var notImplErr;
                return __generator(this, function (_a) {
                    notImplErr = "Crypto interface - signJwt() has not been implemented";
                    throw AuthError.createUnexpectedError(notImplErr);
                });
            });
        },
        hashString: function () {
            return __awaiter(this, void 0, void 0, function () {
                var notImplErr;
                return __generator(this, function (_a) {
                    notImplErr = "Crypto interface - hashString() has not been implemented";
                    throw AuthError.createUnexpectedError(notImplErr);
                });
            });
        }
    };

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * ClientAuthErrorMessage class containing string constants used by error codes and messages.
     */
    var ClientAuthErrorMessage = {
        clientInfoDecodingError: {
            code: "client_info_decoding_error",
            desc: "The client info could not be parsed/decoded correctly. Please review the trace to determine the root cause."
        },
        clientInfoEmptyError: {
            code: "client_info_empty_error",
            desc: "The client info was empty. Please review the trace to determine the root cause."
        },
        tokenParsingError: {
            code: "token_parsing_error",
            desc: "Token cannot be parsed. Please review stack trace to determine root cause."
        },
        nullOrEmptyToken: {
            code: "null_or_empty_token",
            desc: "The token is null or empty. Please review the trace to determine the root cause."
        },
        endpointResolutionError: {
            code: "endpoints_resolution_error",
            desc: "Error: could not resolve endpoints. Please check network and try again."
        },
        networkError: {
            code: "network_error",
            desc: "Network request failed. Please check network trace to determine root cause."
        },
        unableToGetOpenidConfigError: {
            code: "openid_config_error",
            desc: "Could not retrieve endpoints. Check your authority and verify the .well-known/openid-configuration endpoint returns the required endpoints."
        },
        hashNotDeserialized: {
            code: "hash_not_deserialized",
            desc: "The hash parameters could not be deserialized. Please review the trace to determine the root cause."
        },
        blankGuidGenerated: {
            code: "blank_guid_generated",
            desc: "The guid generated was blank. Please review the trace to determine the root cause."
        },
        invalidStateError: {
            code: "invalid_state",
            desc: "State was not the expected format. Please check the logs to determine whether the request was sent using ProtocolUtils.setRequestState()."
        },
        stateMismatchError: {
            code: "state_mismatch",
            desc: "State mismatch error. Please check your network. Continued requests may cause cache overflow."
        },
        stateNotFoundError: {
            code: "state_not_found",
            desc: "State not found"
        },
        nonceMismatchError: {
            code: "nonce_mismatch",
            desc: "Nonce mismatch error. This may be caused by a race condition in concurrent requests."
        },
        nonceNotFoundError: {
            code: "nonce_not_found",
            desc: "nonce not found"
        },
        noTokensFoundError: {
            code: "no_tokens_found",
            desc: "No tokens were found for the given scopes, and no authorization code was passed to acquireToken. You must retrieve an authorization code before making a call to acquireToken()."
        },
        multipleMatchingTokens: {
            code: "multiple_matching_tokens",
            desc: "The cache contains multiple tokens satisfying the requirements. " +
                "Call AcquireToken again providing more requirements such as authority or account."
        },
        multipleMatchingAccounts: {
            code: "multiple_matching_accounts",
            desc: "The cache contains multiple accounts satisfying the given parameters. Please pass more info to obtain the correct account"
        },
        multipleMatchingAppMetadata: {
            code: "multiple_matching_appMetadata",
            desc: "The cache contains multiple appMetadata satisfying the given parameters. Please pass more info to obtain the correct appMetadata"
        },
        tokenRequestCannotBeMade: {
            code: "request_cannot_be_made",
            desc: "Token request cannot be made without authorization code or refresh token."
        },
        appendEmptyScopeError: {
            code: "cannot_append_empty_scope",
            desc: "Cannot append null or empty scope to ScopeSet. Please check the stack trace for more info."
        },
        removeEmptyScopeError: {
            code: "cannot_remove_empty_scope",
            desc: "Cannot remove null or empty scope from ScopeSet. Please check the stack trace for more info."
        },
        appendScopeSetError: {
            code: "cannot_append_scopeset",
            desc: "Cannot append ScopeSet due to error."
        },
        emptyInputScopeSetError: {
            code: "empty_input_scopeset",
            desc: "Empty input ScopeSet cannot be processed."
        },
        DeviceCodePollingCancelled: {
            code: "device_code_polling_cancelled",
            desc: "Caller has cancelled token endpoint polling during device code flow by setting DeviceCodeRequest.cancel = true."
        },
        DeviceCodeExpired: {
            code: "device_code_expired",
            desc: "Device code is expired."
        },
        DeviceCodeUnknownError: {
            code: "device_code_unknown_error",
            desc: "Device code stopped polling for unknown reasons."
        },
        NoAccountInSilentRequest: {
            code: "no_account_in_silent_request",
            desc: "Please pass an account object, silent flow is not supported without account information"
        },
        invalidCacheRecord: {
            code: "invalid_cache_record",
            desc: "Cache record object was null or undefined."
        },
        invalidCacheEnvironment: {
            code: "invalid_cache_environment",
            desc: "Invalid environment when attempting to create cache entry"
        },
        noAccountFound: {
            code: "no_account_found",
            desc: "No account found in cache for given key."
        },
        CachePluginError: {
            code: "no cache plugin set on CacheManager",
            desc: "ICachePlugin needs to be set before using readFromStorage or writeFromStorage"
        },
        noCryptoObj: {
            code: "no_crypto_object",
            desc: "No crypto object detected. This is required for the following operation: "
        },
        invalidCacheType: {
            code: "invalid_cache_type",
            desc: "Invalid cache type"
        },
        unexpectedAccountType: {
            code: "unexpected_account_type",
            desc: "Unexpected account type."
        },
        unexpectedCredentialType: {
            code: "unexpected_credential_type",
            desc: "Unexpected credential type."
        },
        invalidAssertion: {
            code: "invalid_assertion",
            desc: "Client assertion must meet requirements described in https://tools.ietf.org/html/rfc7515"
        },
        invalidClientCredential: {
            code: "invalid_client_credential",
            desc: "Client credential (secret, certificate, or assertion) must not be empty when creating a confidential client. An application should at most have one credential"
        },
        tokenRefreshRequired: {
            code: "token_refresh_required",
            desc: "Cannot return token from cache because it must be refreshed. This may be due to one of the following reasons: forceRefresh parameter is set to true, claims have been requested, there is no cached access token or it is expired."
        },
        userTimeoutReached: {
            code: "user_timeout_reached",
            desc: "User defined timeout for device code polling reached",
        },
        tokenClaimsRequired: {
            code: "token_claims_cnf_required_for_signedjwt",
            desc: "Cannot generate a POP jwt if the token_claims are not populated"
        },
        noAuthorizationCodeFromServer: {
            code: "authorization_code_missing_from_server_response",
            desc: "Server response does not contain an authorization code to proceed"
        },
        noAzureRegionDetected: {
            code: "no_azure_region_detected",
            desc: "No azure region was detected and no fallback was made available"
        },
        accessTokenEntityNullError: {
            code: "access_token_entity_null",
            desc: "Access token entity is null, please check logs and cache to ensure a valid access token is present."
        },
        bindingKeyNotRemovedError: {
            code: "binding_key_not_removed",
            desc: "Could not remove the credential's binding key from storage."
        },
        logoutNotSupported: {
            code: "end_session_endpoint_not_supported",
            desc: "Provided authority does not support logout."
        },
        keyIdMissing: {
            code: "key_id_missing",
            desc: "A keyId value is missing from the requested bound token's cache record and is required to match the token to it's stored binding key."
        }
    };
    /**
     * Error thrown when there is an error in the client code running on the browser.
     */
    var ClientAuthError = /** @class */ (function (_super) {
        __extends(ClientAuthError, _super);
        function ClientAuthError(errorCode, errorMessage) {
            var _this = _super.call(this, errorCode, errorMessage) || this;
            _this.name = "ClientAuthError";
            Object.setPrototypeOf(_this, ClientAuthError.prototype);
            return _this;
        }
        /**
         * Creates an error thrown when client info object doesn't decode correctly.
         * @param caughtError
         */
        ClientAuthError.createClientInfoDecodingError = function (caughtError) {
            return new ClientAuthError(ClientAuthErrorMessage.clientInfoDecodingError.code, ClientAuthErrorMessage.clientInfoDecodingError.desc + " Failed with error: " + caughtError);
        };
        /**
         * Creates an error thrown if the client info is empty.
         * @param rawClientInfo
         */
        ClientAuthError.createClientInfoEmptyError = function () {
            return new ClientAuthError(ClientAuthErrorMessage.clientInfoEmptyError.code, "" + ClientAuthErrorMessage.clientInfoEmptyError.desc);
        };
        /**
         * Creates an error thrown when the id token extraction errors out.
         * @param err
         */
        ClientAuthError.createTokenParsingError = function (caughtExtractionError) {
            return new ClientAuthError(ClientAuthErrorMessage.tokenParsingError.code, ClientAuthErrorMessage.tokenParsingError.desc + " Failed with error: " + caughtExtractionError);
        };
        /**
         * Creates an error thrown when the id token string is null or empty.
         * @param invalidRawTokenString
         */
        ClientAuthError.createTokenNullOrEmptyError = function (invalidRawTokenString) {
            return new ClientAuthError(ClientAuthErrorMessage.nullOrEmptyToken.code, ClientAuthErrorMessage.nullOrEmptyToken.desc + " Raw Token Value: " + invalidRawTokenString);
        };
        /**
         * Creates an error thrown when the endpoint discovery doesn't complete correctly.
         */
        ClientAuthError.createEndpointDiscoveryIncompleteError = function (errDetail) {
            return new ClientAuthError(ClientAuthErrorMessage.endpointResolutionError.code, ClientAuthErrorMessage.endpointResolutionError.desc + " Detail: " + errDetail);
        };
        /**
         * Creates an error thrown when the fetch client throws
         */
        ClientAuthError.createNetworkError = function (endpoint, errDetail) {
            return new ClientAuthError(ClientAuthErrorMessage.networkError.code, ClientAuthErrorMessage.networkError.desc + " | Fetch client threw: " + errDetail + " | Attempted to reach: " + endpoint.split("?")[0]);
        };
        /**
         * Creates an error thrown when the openid-configuration endpoint cannot be reached or does not contain the required data
         */
        ClientAuthError.createUnableToGetOpenidConfigError = function (errDetail) {
            return new ClientAuthError(ClientAuthErrorMessage.unableToGetOpenidConfigError.code, ClientAuthErrorMessage.unableToGetOpenidConfigError.desc + " Attempted to retrieve endpoints from: " + errDetail);
        };
        /**
         * Creates an error thrown when the hash cannot be deserialized.
         * @param hashParamObj
         */
        ClientAuthError.createHashNotDeserializedError = function (hashParamObj) {
            return new ClientAuthError(ClientAuthErrorMessage.hashNotDeserialized.code, ClientAuthErrorMessage.hashNotDeserialized.desc + " Given Object: " + hashParamObj);
        };
        /**
         * Creates an error thrown when the state cannot be parsed.
         * @param invalidState
         */
        ClientAuthError.createInvalidStateError = function (invalidState, errorString) {
            return new ClientAuthError(ClientAuthErrorMessage.invalidStateError.code, ClientAuthErrorMessage.invalidStateError.desc + " Invalid State: " + invalidState + ", Root Err: " + errorString);
        };
        /**
         * Creates an error thrown when two states do not match.
         */
        ClientAuthError.createStateMismatchError = function () {
            return new ClientAuthError(ClientAuthErrorMessage.stateMismatchError.code, ClientAuthErrorMessage.stateMismatchError.desc);
        };
        /**
         * Creates an error thrown when the state is not present
         * @param missingState
         */
        ClientAuthError.createStateNotFoundError = function (missingState) {
            return new ClientAuthError(ClientAuthErrorMessage.stateNotFoundError.code, ClientAuthErrorMessage.stateNotFoundError.desc + ":  " + missingState);
        };
        /**
         * Creates an error thrown when the nonce does not match.
         */
        ClientAuthError.createNonceMismatchError = function () {
            return new ClientAuthError(ClientAuthErrorMessage.nonceMismatchError.code, ClientAuthErrorMessage.nonceMismatchError.desc);
        };
        /**
         * Creates an error thrown when the mnonce is not present
         * @param missingNonce
         */
        ClientAuthError.createNonceNotFoundError = function (missingNonce) {
            return new ClientAuthError(ClientAuthErrorMessage.nonceNotFoundError.code, ClientAuthErrorMessage.nonceNotFoundError.desc + ":  " + missingNonce);
        };
        /**
         * Throws error when multiple tokens are in cache.
         */
        ClientAuthError.createMultipleMatchingTokensInCacheError = function () {
            return new ClientAuthError(ClientAuthErrorMessage.multipleMatchingTokens.code, ClientAuthErrorMessage.multipleMatchingTokens.desc + ".");
        };
        /**
         * Throws error when multiple accounts are in cache for the given params
         */
        ClientAuthError.createMultipleMatchingAccountsInCacheError = function () {
            return new ClientAuthError(ClientAuthErrorMessage.multipleMatchingAccounts.code, ClientAuthErrorMessage.multipleMatchingAccounts.desc);
        };
        /**
         * Throws error when multiple appMetada are in cache for the given clientId.
         */
        ClientAuthError.createMultipleMatchingAppMetadataInCacheError = function () {
            return new ClientAuthError(ClientAuthErrorMessage.multipleMatchingAppMetadata.code, ClientAuthErrorMessage.multipleMatchingAppMetadata.desc);
        };
        /**
         * Throws error when no auth code or refresh token is given to ServerTokenRequestParameters.
         */
        ClientAuthError.createTokenRequestCannotBeMadeError = function () {
            return new ClientAuthError(ClientAuthErrorMessage.tokenRequestCannotBeMade.code, ClientAuthErrorMessage.tokenRequestCannotBeMade.desc);
        };
        /**
         * Throws error when attempting to append a null, undefined or empty scope to a set
         * @param givenScope
         */
        ClientAuthError.createAppendEmptyScopeToSetError = function (givenScope) {
            return new ClientAuthError(ClientAuthErrorMessage.appendEmptyScopeError.code, ClientAuthErrorMessage.appendEmptyScopeError.desc + " Given Scope: " + givenScope);
        };
        /**
         * Throws error when attempting to append a null, undefined or empty scope to a set
         * @param givenScope
         */
        ClientAuthError.createRemoveEmptyScopeFromSetError = function (givenScope) {
            return new ClientAuthError(ClientAuthErrorMessage.removeEmptyScopeError.code, ClientAuthErrorMessage.removeEmptyScopeError.desc + " Given Scope: " + givenScope);
        };
        /**
         * Throws error when attempting to append null or empty ScopeSet.
         * @param appendError
         */
        ClientAuthError.createAppendScopeSetError = function (appendError) {
            return new ClientAuthError(ClientAuthErrorMessage.appendScopeSetError.code, ClientAuthErrorMessage.appendScopeSetError.desc + " Detail Error: " + appendError);
        };
        /**
         * Throws error if ScopeSet is null or undefined.
         * @param givenScopeSet
         */
        ClientAuthError.createEmptyInputScopeSetError = function () {
            return new ClientAuthError(ClientAuthErrorMessage.emptyInputScopeSetError.code, "" + ClientAuthErrorMessage.emptyInputScopeSetError.desc);
        };
        /**
         * Throws error if user sets CancellationToken.cancel = true during polling of token endpoint during device code flow
         */
        ClientAuthError.createDeviceCodeCancelledError = function () {
            return new ClientAuthError(ClientAuthErrorMessage.DeviceCodePollingCancelled.code, "" + ClientAuthErrorMessage.DeviceCodePollingCancelled.desc);
        };
        /**
         * Throws error if device code is expired
         */
        ClientAuthError.createDeviceCodeExpiredError = function () {
            return new ClientAuthError(ClientAuthErrorMessage.DeviceCodeExpired.code, "" + ClientAuthErrorMessage.DeviceCodeExpired.desc);
        };
        /**
         * Throws error if device code is expired
         */
        ClientAuthError.createDeviceCodeUnknownError = function () {
            return new ClientAuthError(ClientAuthErrorMessage.DeviceCodeUnknownError.code, "" + ClientAuthErrorMessage.DeviceCodeUnknownError.desc);
        };
        /**
         * Throws error when silent requests are made without an account object
         */
        ClientAuthError.createNoAccountInSilentRequestError = function () {
            return new ClientAuthError(ClientAuthErrorMessage.NoAccountInSilentRequest.code, "" + ClientAuthErrorMessage.NoAccountInSilentRequest.desc);
        };
        /**
         * Throws error when cache record is null or undefined.
         */
        ClientAuthError.createNullOrUndefinedCacheRecord = function () {
            return new ClientAuthError(ClientAuthErrorMessage.invalidCacheRecord.code, ClientAuthErrorMessage.invalidCacheRecord.desc);
        };
        /**
         * Throws error when provided environment is not part of the CloudDiscoveryMetadata object
         */
        ClientAuthError.createInvalidCacheEnvironmentError = function () {
            return new ClientAuthError(ClientAuthErrorMessage.invalidCacheEnvironment.code, ClientAuthErrorMessage.invalidCacheEnvironment.desc);
        };
        /**
         * Throws error when account is not found in cache.
         */
        ClientAuthError.createNoAccountFoundError = function () {
            return new ClientAuthError(ClientAuthErrorMessage.noAccountFound.code, ClientAuthErrorMessage.noAccountFound.desc);
        };
        /**
         * Throws error if ICachePlugin not set on CacheManager.
         */
        ClientAuthError.createCachePluginError = function () {
            return new ClientAuthError(ClientAuthErrorMessage.CachePluginError.code, "" + ClientAuthErrorMessage.CachePluginError.desc);
        };
        /**
         * Throws error if crypto object not found.
         * @param operationName
         */
        ClientAuthError.createNoCryptoObjectError = function (operationName) {
            return new ClientAuthError(ClientAuthErrorMessage.noCryptoObj.code, "" + ClientAuthErrorMessage.noCryptoObj.desc + operationName);
        };
        /**
         * Throws error if cache type is invalid.
         */
        ClientAuthError.createInvalidCacheTypeError = function () {
            return new ClientAuthError(ClientAuthErrorMessage.invalidCacheType.code, "" + ClientAuthErrorMessage.invalidCacheType.desc);
        };
        /**
         * Throws error if unexpected account type.
         */
        ClientAuthError.createUnexpectedAccountTypeError = function () {
            return new ClientAuthError(ClientAuthErrorMessage.unexpectedAccountType.code, "" + ClientAuthErrorMessage.unexpectedAccountType.desc);
        };
        /**
         * Throws error if unexpected credential type.
         */
        ClientAuthError.createUnexpectedCredentialTypeError = function () {
            return new ClientAuthError(ClientAuthErrorMessage.unexpectedCredentialType.code, "" + ClientAuthErrorMessage.unexpectedCredentialType.desc);
        };
        /**
         * Throws error if client assertion is not valid.
         */
        ClientAuthError.createInvalidAssertionError = function () {
            return new ClientAuthError(ClientAuthErrorMessage.invalidAssertion.code, "" + ClientAuthErrorMessage.invalidAssertion.desc);
        };
        /**
         * Throws error if client assertion is not valid.
         */
        ClientAuthError.createInvalidCredentialError = function () {
            return new ClientAuthError(ClientAuthErrorMessage.invalidClientCredential.code, "" + ClientAuthErrorMessage.invalidClientCredential.desc);
        };
        /**
         * Throws error if token cannot be retrieved from cache due to refresh being required.
         */
        ClientAuthError.createRefreshRequiredError = function () {
            return new ClientAuthError(ClientAuthErrorMessage.tokenRefreshRequired.code, ClientAuthErrorMessage.tokenRefreshRequired.desc);
        };
        /**
         * Throws error if the user defined timeout is reached.
         */
        ClientAuthError.createUserTimeoutReachedError = function () {
            return new ClientAuthError(ClientAuthErrorMessage.userTimeoutReached.code, ClientAuthErrorMessage.userTimeoutReached.desc);
        };
        /*
         * Throws error if token claims are not populated for a signed jwt generation
         */
        ClientAuthError.createTokenClaimsRequiredError = function () {
            return new ClientAuthError(ClientAuthErrorMessage.tokenClaimsRequired.code, ClientAuthErrorMessage.tokenClaimsRequired.desc);
        };
        /**
         * Throws error when the authorization code is missing from the server response
         */
        ClientAuthError.createNoAuthCodeInServerResponseError = function () {
            return new ClientAuthError(ClientAuthErrorMessage.noAuthorizationCodeFromServer.code, ClientAuthErrorMessage.noAuthorizationCodeFromServer.desc);
        };
        ClientAuthError.createBindingKeyNotRemovedError = function () {
            return new ClientAuthError(ClientAuthErrorMessage.bindingKeyNotRemovedError.code, ClientAuthErrorMessage.bindingKeyNotRemovedError.desc);
        };
        /**
         * Thrown when logout is attempted for an authority that doesnt have an end_session_endpoint
         */
        ClientAuthError.createLogoutNotSupportedError = function () {
            return new ClientAuthError(ClientAuthErrorMessage.logoutNotSupported.code, ClientAuthErrorMessage.logoutNotSupported.desc);
        };
        /**
         * Create an error when kid attribute is missing from a PoP token's cache record
         */
        ClientAuthError.createKeyIdMissingError = function () {
            return new ClientAuthError(ClientAuthErrorMessage.keyIdMissing.code, ClientAuthErrorMessage.keyIdMissing.desc);
        };
        return ClientAuthError;
    }(AuthError));

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * @hidden
     */
    var StringUtils = /** @class */ (function () {
        function StringUtils() {
        }
        /**
         * decode a JWT
         *
         * @param authToken
         */
        StringUtils.decodeAuthToken = function (authToken) {
            if (StringUtils.isEmpty(authToken)) {
                throw ClientAuthError.createTokenNullOrEmptyError(authToken);
            }
            var tokenPartsRegex = /^([^\.\s]*)\.([^\.\s]+)\.([^\.\s]*)$/;
            var matches = tokenPartsRegex.exec(authToken);
            if (!matches || matches.length < 4) {
                throw ClientAuthError.createTokenParsingError("Given token is malformed: " + JSON.stringify(authToken));
            }
            var crackedToken = {
                header: matches[1],
                JWSPayload: matches[2],
                JWSSig: matches[3]
            };
            return crackedToken;
        };
        /**
         * Check if a string is empty.
         *
         * @param str
         */
        StringUtils.isEmpty = function (str) {
            return (typeof str === "undefined" || !str || 0 === str.length);
        };
        /**
         * Check if stringified object is empty
         * @param strObj
         */
        StringUtils.isEmptyObj = function (strObj) {
            if (strObj && !StringUtils.isEmpty(strObj)) {
                try {
                    var obj = JSON.parse(strObj);
                    return Object.keys(obj).length === 0;
                }
                catch (e) { }
            }
            return true;
        };
        StringUtils.startsWith = function (str, search) {
            return str.indexOf(search) === 0;
        };
        StringUtils.endsWith = function (str, search) {
            return (str.length >= search.length) && (str.lastIndexOf(search) === (str.length - search.length));
        };
        /**
         * Parses string into an object.
         *
         * @param query
         */
        StringUtils.queryStringToObject = function (query) {
            var obj = {};
            var params = query.split("&");
            var decode = function (s) { return decodeURIComponent(s.replace(/\+/g, " ")); };
            params.forEach(function (pair) {
                if (pair.trim()) {
                    var _a = pair.split(/=(.+)/g, 2), key = _a[0], value = _a[1]; // Split on the first occurence of the '=' character
                    if (key && value) {
                        obj[decode(key)] = decode(value);
                    }
                }
            });
            return obj;
        };
        /**
         * Trims entries in an array.
         *
         * @param arr
         */
        StringUtils.trimArrayEntries = function (arr) {
            return arr.map(function (entry) { return entry.trim(); });
        };
        /**
         * Removes empty strings from array
         * @param arr
         */
        StringUtils.removeEmptyStringsFromArray = function (arr) {
            return arr.filter(function (entry) {
                return !StringUtils.isEmpty(entry);
            });
        };
        /**
         * Attempts to parse a string into JSON
         * @param str
         */
        StringUtils.jsonParseHelper = function (str) {
            try {
                return JSON.parse(str);
            }
            catch (e) {
                return null;
            }
        };
        /**
         * Tests if a given string matches a given pattern, with support for wildcards and queries.
         * @param pattern Wildcard pattern to string match. Supports "*" for wildcards and "?" for queries
         * @param input String to match against
         */
        StringUtils.matchPattern = function (pattern, input) {
            /**
             * Wildcard support: https://stackoverflow.com/a/3117248/4888559
             * Queries: replaces "?" in string with escaped "\?" for regex test
             */
            var regex = new RegExp(pattern.replace(/\\/g, "\\\\").replace(/\*/g, "[^ ]*").replace(/\?/g, "\\\?")); // eslint-disable-line security/detect-non-literal-regexp
            return regex.test(input);
        };
        return StringUtils;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * Log message level.
     */
    exports.LogLevel = void 0;
    (function (LogLevel) {
        LogLevel[LogLevel["Error"] = 0] = "Error";
        LogLevel[LogLevel["Warning"] = 1] = "Warning";
        LogLevel[LogLevel["Info"] = 2] = "Info";
        LogLevel[LogLevel["Verbose"] = 3] = "Verbose";
        LogLevel[LogLevel["Trace"] = 4] = "Trace";
    })(exports.LogLevel || (exports.LogLevel = {}));
    /**
     * Class which facilitates logging of messages to a specific place.
     */
    var Logger = /** @class */ (function () {
        function Logger(loggerOptions, packageName, packageVersion) {
            // Current log level, defaults to info.
            this.level = exports.LogLevel.Info;
            var defaultLoggerCallback = function () {
                return;
            };
            this.localCallback = loggerOptions.loggerCallback || defaultLoggerCallback;
            this.piiLoggingEnabled = loggerOptions.piiLoggingEnabled || false;
            this.level = typeof (loggerOptions.logLevel) === "number" ? loggerOptions.logLevel : exports.LogLevel.Info;
            this.correlationId = loggerOptions.correlationId || Constants.EMPTY_STRING;
            this.packageName = packageName || Constants.EMPTY_STRING;
            this.packageVersion = packageVersion || Constants.EMPTY_STRING;
        }
        /**
         * Create new Logger with existing configurations.
         */
        Logger.prototype.clone = function (packageName, packageVersion, correlationId) {
            return new Logger({ loggerCallback: this.localCallback, piiLoggingEnabled: this.piiLoggingEnabled, logLevel: this.level, correlationId: correlationId || this.correlationId }, packageName, packageVersion);
        };
        /**
         * Log message with required options.
         */
        Logger.prototype.logMessage = function (logMessage, options) {
            if ((options.logLevel > this.level) || (!this.piiLoggingEnabled && options.containsPii)) {
                return;
            }
            var timestamp = new Date().toUTCString();
            // Add correlationId to logs if set, correlationId provided on log messages take precedence
            var logHeader;
            if (!StringUtils.isEmpty(options.correlationId)) {
                logHeader = "[" + timestamp + "] : [" + options.correlationId + "]";
            }
            else if (!StringUtils.isEmpty(this.correlationId)) {
                logHeader = "[" + timestamp + "] : [" + this.correlationId + "]";
            }
            else {
                logHeader = "[" + timestamp + "]";
            }
            var log = logHeader + " : " + this.packageName + "@" + this.packageVersion + " : " + exports.LogLevel[options.logLevel] + " - " + logMessage;
            // debug(`msal:${LogLevel[options.logLevel]}${options.containsPii ? "-Pii": Constants.EMPTY_STRING}${options.context ? `:${options.context}` : Constants.EMPTY_STRING}`)(logMessage);
            this.executeCallback(options.logLevel, log, options.containsPii || false);
        };
        /**
         * Execute callback with message.
         */
        Logger.prototype.executeCallback = function (level, message, containsPii) {
            if (this.localCallback) {
                this.localCallback(level, message, containsPii);
            }
        };
        /**
         * Logs error messages.
         */
        Logger.prototype.error = function (message, correlationId) {
            this.logMessage(message, {
                logLevel: exports.LogLevel.Error,
                containsPii: false,
                correlationId: correlationId || Constants.EMPTY_STRING
            });
        };
        /**
         * Logs error messages with PII.
         */
        Logger.prototype.errorPii = function (message, correlationId) {
            this.logMessage(message, {
                logLevel: exports.LogLevel.Error,
                containsPii: true,
                correlationId: correlationId || Constants.EMPTY_STRING
            });
        };
        /**
         * Logs warning messages.
         */
        Logger.prototype.warning = function (message, correlationId) {
            this.logMessage(message, {
                logLevel: exports.LogLevel.Warning,
                containsPii: false,
                correlationId: correlationId || Constants.EMPTY_STRING
            });
        };
        /**
         * Logs warning messages with PII.
         */
        Logger.prototype.warningPii = function (message, correlationId) {
            this.logMessage(message, {
                logLevel: exports.LogLevel.Warning,
                containsPii: true,
                correlationId: correlationId || Constants.EMPTY_STRING
            });
        };
        /**
         * Logs info messages.
         */
        Logger.prototype.info = function (message, correlationId) {
            this.logMessage(message, {
                logLevel: exports.LogLevel.Info,
                containsPii: false,
                correlationId: correlationId || Constants.EMPTY_STRING
            });
        };
        /**
         * Logs info messages with PII.
         */
        Logger.prototype.infoPii = function (message, correlationId) {
            this.logMessage(message, {
                logLevel: exports.LogLevel.Info,
                containsPii: true,
                correlationId: correlationId || Constants.EMPTY_STRING
            });
        };
        /**
         * Logs verbose messages.
         */
        Logger.prototype.verbose = function (message, correlationId) {
            this.logMessage(message, {
                logLevel: exports.LogLevel.Verbose,
                containsPii: false,
                correlationId: correlationId || Constants.EMPTY_STRING
            });
        };
        /**
         * Logs verbose messages with PII.
         */
        Logger.prototype.verbosePii = function (message, correlationId) {
            this.logMessage(message, {
                logLevel: exports.LogLevel.Verbose,
                containsPii: true,
                correlationId: correlationId || Constants.EMPTY_STRING
            });
        };
        /**
         * Logs trace messages.
         */
        Logger.prototype.trace = function (message, correlationId) {
            this.logMessage(message, {
                logLevel: exports.LogLevel.Trace,
                containsPii: false,
                correlationId: correlationId || Constants.EMPTY_STRING
            });
        };
        /**
         * Logs trace messages with PII.
         */
        Logger.prototype.tracePii = function (message, correlationId) {
            this.logMessage(message, {
                logLevel: exports.LogLevel.Trace,
                containsPii: true,
                correlationId: correlationId || Constants.EMPTY_STRING
            });
        };
        /**
         * Returns whether PII Logging is enabled or not.
         */
        Logger.prototype.isPiiLoggingEnabled = function () {
            return this.piiLoggingEnabled || false;
        };
        return Logger;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */
    /* eslint-disable header/header */
    var name$1 = "@azure/msal-common";
    var version$1 = "7.3.0";

    /*! @azure/msal-common v7.3.0 2022-08-01 */
    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    exports.AzureCloudInstance = void 0;
    (function (AzureCloudInstance) {
        // AzureCloudInstance is not specified.
        AzureCloudInstance[AzureCloudInstance["None"] = 0] = "None";
        // Microsoft Azure public cloud
        AzureCloudInstance["AzurePublic"] = "https://login.microsoftonline.com";
        // Microsoft PPE
        AzureCloudInstance["AzurePpe"] = "https://login.windows-ppe.net";
        // Microsoft Chinese national cloud
        AzureCloudInstance["AzureChina"] = "https://login.chinacloudapi.cn";
        // Microsoft German national cloud ("Black Forest")
        AzureCloudInstance["AzureGermany"] = "https://login.microsoftonline.de";
        // US Government cloud
        AzureCloudInstance["AzureUsGovernment"] = "https://login.microsoftonline.us";
    })(exports.AzureCloudInstance || (exports.AzureCloudInstance = {}));

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * Base type for credentials to be stored in the cache: eg: ACCESS_TOKEN, ID_TOKEN etc
     *
     * Key:Value Schema:
     *
     * Key: <home_account_id*>-<environment>-<credential_type>-<client_id>-<realm*>-<target*>-<requestedClaims*>-<scheme*>
     *
     * Value Schema:
     * {
     *      homeAccountId: home account identifier for the auth scheme,
     *      environment: entity that issued the token, represented as a full host
     *      credentialType: Type of credential as a string, can be one of the following: RefreshToken, AccessToken, IdToken, Password, Cookie, Certificate, Other
     *      clientId: client ID of the application
     *      secret: Actual credential as a string
     *      familyId: Family ID identifier, usually only used for refresh tokens
     *      realm: Full tenant or organizational identifier that the account belongs to
     *      target: Permissions that are included in the token, or for refresh tokens, the resource identifier.
     *      tokenType: Matches the authentication scheme for which the token was issued (i.e. Bearer or pop)
     *      requestedClaimsHash: Matches the SHA 256 hash of the claims object included in the token request
     *      userAssertionHash: Matches the SHA 256 hash of the obo_assertion for the OBO flow
     * }
     */
    var CredentialEntity = /** @class */ (function () {
        function CredentialEntity() {
        }
        /**
         * Generate Account Id key component as per the schema: <home_account_id>-<environment>
         */
        CredentialEntity.prototype.generateAccountId = function () {
            return CredentialEntity.generateAccountIdForCacheKey(this.homeAccountId, this.environment);
        };
        /**
         * Generate Credential Id key component as per the schema: <credential_type>-<client_id>-<realm>
         */
        CredentialEntity.prototype.generateCredentialId = function () {
            return CredentialEntity.generateCredentialIdForCacheKey(this.credentialType, this.clientId, this.realm, this.familyId);
        };
        /**
         * Generate target key component as per schema: <target>
         */
        CredentialEntity.prototype.generateTarget = function () {
            return CredentialEntity.generateTargetForCacheKey(this.target);
        };
        /**
         * generates credential key
         */
        CredentialEntity.prototype.generateCredentialKey = function () {
            return CredentialEntity.generateCredentialCacheKey(this.homeAccountId, this.environment, this.credentialType, this.clientId, this.realm, this.target, this.familyId, this.tokenType, this.requestedClaimsHash);
        };
        /**
         * returns the type of the cache (in this case credential)
         */
        CredentialEntity.prototype.generateType = function () {
            switch (this.credentialType) {
                case CredentialType.ID_TOKEN:
                    return CacheType.ID_TOKEN;
                case CredentialType.ACCESS_TOKEN:
                case CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME:
                    return CacheType.ACCESS_TOKEN;
                case CredentialType.REFRESH_TOKEN:
                    return CacheType.REFRESH_TOKEN;
                default: {
                    throw ClientAuthError.createUnexpectedCredentialTypeError();
                }
            }
        };
        /**
         * helper function to return `CredentialType`
         * @param key
         */
        CredentialEntity.getCredentialType = function (key) {
            // First keyword search will match all "AccessToken" and "AccessToken_With_AuthScheme" credentials
            if (key.indexOf(CredentialType.ACCESS_TOKEN.toLowerCase()) !== -1) {
                // Perform second search to differentiate between "AccessToken" and "AccessToken_With_AuthScheme" credential types
                if (key.indexOf(CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME.toLowerCase()) !== -1) {
                    return CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME;
                }
                return CredentialType.ACCESS_TOKEN;
            }
            else if (key.indexOf(CredentialType.ID_TOKEN.toLowerCase()) !== -1) {
                return CredentialType.ID_TOKEN;
            }
            else if (key.indexOf(CredentialType.REFRESH_TOKEN.toLowerCase()) !== -1) {
                return CredentialType.REFRESH_TOKEN;
            }
            return Constants.NOT_DEFINED;
        };
        /**
         * generates credential key
         * <home_account_id*>-\<environment>-<credential_type>-<client_id>-<realm\*>-<target\*>-<scheme\*>
         */
        CredentialEntity.generateCredentialCacheKey = function (homeAccountId, environment, credentialType, clientId, realm, target, familyId, tokenType, requestedClaimsHash) {
            var credentialKey = [
                this.generateAccountIdForCacheKey(homeAccountId, environment),
                this.generateCredentialIdForCacheKey(credentialType, clientId, realm, familyId),
                this.generateTargetForCacheKey(target),
                this.generateClaimsHashForCacheKey(requestedClaimsHash),
                this.generateSchemeForCacheKey(tokenType)
            ];
            return credentialKey.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();
        };
        /**
         * generates Account Id for keys
         * @param homeAccountId
         * @param environment
         */
        CredentialEntity.generateAccountIdForCacheKey = function (homeAccountId, environment) {
            var accountId = [homeAccountId, environment];
            return accountId.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();
        };
        /**
         * Generates Credential Id for keys
         * @param credentialType
         * @param realm
         * @param clientId
         * @param familyId
         */
        CredentialEntity.generateCredentialIdForCacheKey = function (credentialType, clientId, realm, familyId) {
            var clientOrFamilyId = credentialType === CredentialType.REFRESH_TOKEN
                ? familyId || clientId
                : clientId;
            var credentialId = [
                credentialType,
                clientOrFamilyId,
                realm || Constants.EMPTY_STRING,
            ];
            return credentialId.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();
        };
        /**
         * Generate target key component as per schema: <target>
         */
        CredentialEntity.generateTargetForCacheKey = function (scopes) {
            return (scopes || Constants.EMPTY_STRING).toLowerCase();
        };
        /**
         * Generate requested claims key component as per schema: <requestedClaims>
         */
        CredentialEntity.generateClaimsHashForCacheKey = function (requestedClaimsHash) {
            return (requestedClaimsHash || Constants.EMPTY_STRING).toLowerCase();
        };
        /**
         * Generate scheme key componenet as per schema: <scheme>
         */
        CredentialEntity.generateSchemeForCacheKey = function (tokenType) {
            /*
             * PoP Tokens and SSH certs include scheme in cache key
             * Cast to lowercase to handle "bearer" from ADFS
             */
            return (tokenType && tokenType.toLowerCase() !== exports.AuthenticationScheme.BEARER.toLowerCase()) ? tokenType.toLowerCase() : Constants.EMPTY_STRING;
        };
        return CredentialEntity;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * ClientConfigurationErrorMessage class containing string constants used by error codes and messages.
     */
    var ClientConfigurationErrorMessage = {
        redirectUriNotSet: {
            code: "redirect_uri_empty",
            desc: "A redirect URI is required for all calls, and none has been set."
        },
        postLogoutUriNotSet: {
            code: "post_logout_uri_empty",
            desc: "A post logout redirect has not been set."
        },
        claimsRequestParsingError: {
            code: "claims_request_parsing_error",
            desc: "Could not parse the given claims request object."
        },
        authorityUriInsecure: {
            code: "authority_uri_insecure",
            desc: "Authority URIs must use https.  Please see here for valid authority configuration options: https://docs.microsoft.com/en-us/azure/active-directory/develop/msal-js-initializing-client-applications#configuration-options"
        },
        urlParseError: {
            code: "url_parse_error",
            desc: "URL could not be parsed into appropriate segments."
        },
        urlEmptyError: {
            code: "empty_url_error",
            desc: "URL was empty or null."
        },
        emptyScopesError: {
            code: "empty_input_scopes_error",
            desc: "Scopes cannot be passed as null, undefined or empty array because they are required to obtain an access token."
        },
        nonArrayScopesError: {
            code: "nonarray_input_scopes_error",
            desc: "Scopes cannot be passed as non-array."
        },
        clientIdSingleScopeError: {
            code: "clientid_input_scopes_error",
            desc: "Client ID can only be provided as a single scope."
        },
        invalidPrompt: {
            code: "invalid_prompt_value",
            desc: "Supported prompt values are 'login', 'select_account', 'consent', 'create' and 'none'.  Please see here for valid configuration options: https://azuread.github.io/microsoft-authentication-library-for-js/ref/modules/_azure_msal_common.html#commonauthorizationurlrequest",
        },
        invalidClaimsRequest: {
            code: "invalid_claims",
            desc: "Given claims parameter must be a stringified JSON object."
        },
        tokenRequestEmptyError: {
            code: "token_request_empty",
            desc: "Token request was empty and not found in cache."
        },
        logoutRequestEmptyError: {
            code: "logout_request_empty",
            desc: "The logout request was null or undefined."
        },
        invalidCodeChallengeMethod: {
            code: "invalid_code_challenge_method",
            desc: "code_challenge_method passed is invalid. Valid values are \"plain\" and \"S256\"."
        },
        invalidCodeChallengeParams: {
            code: "pkce_params_missing",
            desc: "Both params: code_challenge and code_challenge_method are to be passed if to be sent in the request"
        },
        invalidCloudDiscoveryMetadata: {
            code: "invalid_cloud_discovery_metadata",
            desc: "Invalid cloudDiscoveryMetadata provided. Must be a stringified JSON object containing tenant_discovery_endpoint and metadata fields"
        },
        invalidAuthorityMetadata: {
            code: "invalid_authority_metadata",
            desc: "Invalid authorityMetadata provided. Must by a stringified JSON object containing authorization_endpoint, token_endpoint, issuer fields."
        },
        untrustedAuthority: {
            code: "untrusted_authority",
            desc: "The provided authority is not a trusted authority. Please include this authority in the knownAuthorities config parameter."
        },
        invalidAzureCloudInstance: {
            code: "invalid_azure_cloud_instance",
            desc: "Invalid AzureCloudInstance provided. Please refer MSAL JS docs: aks.ms/msaljs/azure_cloud_instance for valid values"
        },
        missingSshJwk: {
            code: "missing_ssh_jwk",
            desc: "Missing sshJwk in SSH certificate request. A stringified JSON Web Key is required when using the SSH authentication scheme."
        },
        missingSshKid: {
            code: "missing_ssh_kid",
            desc: "Missing sshKid in SSH certificate request. A string that uniquely identifies the public SSH key is required when using the SSH authentication scheme."
        },
        missingNonceAuthenticationHeader: {
            code: "missing_nonce_authentication_header",
            desc: "Unable to find an authentication header containing server nonce. Either the Authentication-Info or WWW-Authenticate headers must be present in order to obtain a server nonce."
        },
        invalidAuthenticationHeader: {
            code: "invalid_authentication_header",
            desc: "Invalid authentication header provided"
        }
    };
    /**
     * Error thrown when there is an error in configuration of the MSAL.js library.
     */
    var ClientConfigurationError = /** @class */ (function (_super) {
        __extends(ClientConfigurationError, _super);
        function ClientConfigurationError(errorCode, errorMessage) {
            var _this = _super.call(this, errorCode, errorMessage) || this;
            _this.name = "ClientConfigurationError";
            Object.setPrototypeOf(_this, ClientConfigurationError.prototype);
            return _this;
        }
        /**
         * Creates an error thrown when the redirect uri is empty (not set by caller)
         */
        ClientConfigurationError.createRedirectUriEmptyError = function () {
            return new ClientConfigurationError(ClientConfigurationErrorMessage.redirectUriNotSet.code, ClientConfigurationErrorMessage.redirectUriNotSet.desc);
        };
        /**
         * Creates an error thrown when the post-logout redirect uri is empty (not set by caller)
         */
        ClientConfigurationError.createPostLogoutRedirectUriEmptyError = function () {
            return new ClientConfigurationError(ClientConfigurationErrorMessage.postLogoutUriNotSet.code, ClientConfigurationErrorMessage.postLogoutUriNotSet.desc);
        };
        /**
         * Creates an error thrown when the claims request could not be successfully parsed
         */
        ClientConfigurationError.createClaimsRequestParsingError = function (claimsRequestParseError) {
            return new ClientConfigurationError(ClientConfigurationErrorMessage.claimsRequestParsingError.code, ClientConfigurationErrorMessage.claimsRequestParsingError.desc + " Given value: " + claimsRequestParseError);
        };
        /**
         * Creates an error thrown if authority uri is given an insecure protocol.
         * @param urlString
         */
        ClientConfigurationError.createInsecureAuthorityUriError = function (urlString) {
            return new ClientConfigurationError(ClientConfigurationErrorMessage.authorityUriInsecure.code, ClientConfigurationErrorMessage.authorityUriInsecure.desc + " Given URI: " + urlString);
        };
        /**
         * Creates an error thrown if URL string does not parse into separate segments.
         * @param urlString
         */
        ClientConfigurationError.createUrlParseError = function (urlParseError) {
            return new ClientConfigurationError(ClientConfigurationErrorMessage.urlParseError.code, ClientConfigurationErrorMessage.urlParseError.desc + " Given Error: " + urlParseError);
        };
        /**
         * Creates an error thrown if URL string is empty or null.
         * @param urlString
         */
        ClientConfigurationError.createUrlEmptyError = function () {
            return new ClientConfigurationError(ClientConfigurationErrorMessage.urlEmptyError.code, ClientConfigurationErrorMessage.urlEmptyError.desc);
        };
        /**
         * Error thrown when scopes are empty.
         * @param scopesValue
         */
        ClientConfigurationError.createEmptyScopesArrayError = function () {
            return new ClientConfigurationError(ClientConfigurationErrorMessage.emptyScopesError.code, "" + ClientConfigurationErrorMessage.emptyScopesError.desc);
        };
        /**
         * Error thrown when client id scope is not provided as single scope.
         * @param inputScopes
         */
        ClientConfigurationError.createClientIdSingleScopeError = function (inputScopes) {
            return new ClientConfigurationError(ClientConfigurationErrorMessage.clientIdSingleScopeError.code, ClientConfigurationErrorMessage.clientIdSingleScopeError.desc + " Given Scopes: " + inputScopes);
        };
        /**
         * Error thrown when prompt is not an allowed type.
         * @param promptValue
         */
        ClientConfigurationError.createInvalidPromptError = function (promptValue) {
            return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidPrompt.code, ClientConfigurationErrorMessage.invalidPrompt.desc + " Given value: " + promptValue);
        };
        /**
         * Creates error thrown when claims parameter is not a stringified JSON object
         */
        ClientConfigurationError.createInvalidClaimsRequestError = function () {
            return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidClaimsRequest.code, ClientConfigurationErrorMessage.invalidClaimsRequest.desc);
        };
        /**
         * Throws error when token request is empty and nothing cached in storage.
         */
        ClientConfigurationError.createEmptyLogoutRequestError = function () {
            return new ClientConfigurationError(ClientConfigurationErrorMessage.logoutRequestEmptyError.code, ClientConfigurationErrorMessage.logoutRequestEmptyError.desc);
        };
        /**
         * Throws error when token request is empty and nothing cached in storage.
         */
        ClientConfigurationError.createEmptyTokenRequestError = function () {
            return new ClientConfigurationError(ClientConfigurationErrorMessage.tokenRequestEmptyError.code, ClientConfigurationErrorMessage.tokenRequestEmptyError.desc);
        };
        /**
         * Throws error when an invalid code_challenge_method is passed by the user
         */
        ClientConfigurationError.createInvalidCodeChallengeMethodError = function () {
            return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidCodeChallengeMethod.code, ClientConfigurationErrorMessage.invalidCodeChallengeMethod.desc);
        };
        /**
         * Throws error when both params: code_challenge and code_challenge_method are not passed together
         */
        ClientConfigurationError.createInvalidCodeChallengeParamsError = function () {
            return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidCodeChallengeParams.code, ClientConfigurationErrorMessage.invalidCodeChallengeParams.desc);
        };
        /**
         * Throws an error when the user passes invalid cloudDiscoveryMetadata
         */
        ClientConfigurationError.createInvalidCloudDiscoveryMetadataError = function () {
            return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidCloudDiscoveryMetadata.code, ClientConfigurationErrorMessage.invalidCloudDiscoveryMetadata.desc);
        };
        /**
         * Throws an error when the user passes invalid cloudDiscoveryMetadata
         */
        ClientConfigurationError.createInvalidAuthorityMetadataError = function () {
            return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidAuthorityMetadata.code, ClientConfigurationErrorMessage.invalidAuthorityMetadata.desc);
        };
        /**
         * Throws error when provided authority is not a member of the trusted host list
         */
        ClientConfigurationError.createUntrustedAuthorityError = function () {
            return new ClientConfigurationError(ClientConfigurationErrorMessage.untrustedAuthority.code, ClientConfigurationErrorMessage.untrustedAuthority.desc);
        };
        /**
         * Throws error when the AzureCloudInstance is set to an invalid value
         */
        ClientConfigurationError.createInvalidAzureCloudInstanceError = function () {
            return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidAzureCloudInstance.code, ClientConfigurationErrorMessage.invalidAzureCloudInstance.desc);
        };
        /**
         * Throws an error when the authentication scheme is set to SSH but the SSH public key is omitted from the request
         */
        ClientConfigurationError.createMissingSshJwkError = function () {
            return new ClientConfigurationError(ClientConfigurationErrorMessage.missingSshJwk.code, ClientConfigurationErrorMessage.missingSshJwk.desc);
        };
        /**
         * Throws an error when the authentication scheme is set to SSH but the SSH public key ID is omitted from the request
         */
        ClientConfigurationError.createMissingSshKidError = function () {
            return new ClientConfigurationError(ClientConfigurationErrorMessage.missingSshKid.code, ClientConfigurationErrorMessage.missingSshKid.desc);
        };
        /**
         * Throws error when provided headers don't contain a header that a server nonce can be extracted from
         */
        ClientConfigurationError.createMissingNonceAuthenticationHeadersError = function () {
            return new ClientConfigurationError(ClientConfigurationErrorMessage.missingNonceAuthenticationHeader.code, ClientConfigurationErrorMessage.missingNonceAuthenticationHeader.desc);
        };
        /**
         * Throws error when a provided header is invalid in any way
         */
        ClientConfigurationError.createInvalidAuthenticationHeaderError = function (invalidHeaderName, details) {
            return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidAuthenticationHeader.code, ClientConfigurationErrorMessage.invalidAuthenticationHeader.desc + ". Invalid header: " + invalidHeaderName + ". Details: " + details);
        };
        return ClientConfigurationError;
    }(ClientAuthError));

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * The ScopeSet class creates a set of scopes. Scopes are case-insensitive, unique values, so the Set object in JS makes
     * the most sense to implement for this class. All scopes are trimmed and converted to lower case strings in intersection and union functions
     * to ensure uniqueness of strings.
     */
    var ScopeSet = /** @class */ (function () {
        function ScopeSet(inputScopes) {
            var _this = this;
            // Filter empty string and null/undefined array items
            var scopeArr = inputScopes ? StringUtils.trimArrayEntries(__spreadArrays(inputScopes)) : [];
            var filteredInput = scopeArr ? StringUtils.removeEmptyStringsFromArray(scopeArr) : [];
            // Validate and filter scopes (validate function throws if validation fails)
            this.validateInputScopes(filteredInput);
            this.scopes = new Set(); // Iterator in constructor not supported by IE11
            filteredInput.forEach(function (scope) { return _this.scopes.add(scope); });
        }
        /**
         * Factory method to create ScopeSet from space-delimited string
         * @param inputScopeString
         * @param appClientId
         * @param scopesRequired
         */
        ScopeSet.fromString = function (inputScopeString) {
            var scopeString = inputScopeString || Constants.EMPTY_STRING;
            var inputScopes = scopeString.split(" ");
            return new ScopeSet(inputScopes);
        };
        /**
         * Used to validate the scopes input parameter requested  by the developer.
         * @param {Array<string>} inputScopes - Developer requested permissions. Not all scopes are guaranteed to be included in the access token returned.
         * @param {boolean} scopesRequired - Boolean indicating whether the scopes array is required or not
         */
        ScopeSet.prototype.validateInputScopes = function (inputScopes) {
            // Check if scopes are required but not given or is an empty array
            if (!inputScopes || inputScopes.length < 1) {
                throw ClientConfigurationError.createEmptyScopesArrayError();
            }
        };
        /**
         * Check if a given scope is present in this set of scopes.
         * @param scope
         */
        ScopeSet.prototype.containsScope = function (scope) {
            var lowerCaseScopes = this.printScopesLowerCase().split(" ");
            var lowerCaseScopesSet = new ScopeSet(lowerCaseScopes);
            // compare lowercase scopes
            return !StringUtils.isEmpty(scope) ? lowerCaseScopesSet.scopes.has(scope.toLowerCase()) : false;
        };
        /**
         * Check if a set of scopes is present in this set of scopes.
         * @param scopeSet
         */
        ScopeSet.prototype.containsScopeSet = function (scopeSet) {
            var _this = this;
            if (!scopeSet || scopeSet.scopes.size <= 0) {
                return false;
            }
            return (this.scopes.size >= scopeSet.scopes.size && scopeSet.asArray().every(function (scope) { return _this.containsScope(scope); }));
        };
        /**
         * Check if set of scopes contains only the defaults
         */
        ScopeSet.prototype.containsOnlyOIDCScopes = function () {
            var _this = this;
            var defaultScopeCount = 0;
            OIDC_SCOPES.forEach(function (defaultScope) {
                if (_this.containsScope(defaultScope)) {
                    defaultScopeCount += 1;
                }
            });
            return this.scopes.size === defaultScopeCount;
        };
        /**
         * Appends single scope if passed
         * @param newScope
         */
        ScopeSet.prototype.appendScope = function (newScope) {
            if (!StringUtils.isEmpty(newScope)) {
                this.scopes.add(newScope.trim());
            }
        };
        /**
         * Appends multiple scopes if passed
         * @param newScopes
         */
        ScopeSet.prototype.appendScopes = function (newScopes) {
            var _this = this;
            try {
                newScopes.forEach(function (newScope) { return _this.appendScope(newScope); });
            }
            catch (e) {
                throw ClientAuthError.createAppendScopeSetError(e);
            }
        };
        /**
         * Removes element from set of scopes.
         * @param scope
         */
        ScopeSet.prototype.removeScope = function (scope) {
            if (StringUtils.isEmpty(scope)) {
                throw ClientAuthError.createRemoveEmptyScopeFromSetError(scope);
            }
            this.scopes.delete(scope.trim());
        };
        /**
         * Removes default scopes from set of scopes
         * Primarily used to prevent cache misses if the default scopes are not returned from the server
         */
        ScopeSet.prototype.removeOIDCScopes = function () {
            var _this = this;
            OIDC_SCOPES.forEach(function (defaultScope) {
                _this.scopes.delete(defaultScope);
            });
        };
        /**
         * Combines an array of scopes with the current set of scopes.
         * @param otherScopes
         */
        ScopeSet.prototype.unionScopeSets = function (otherScopes) {
            if (!otherScopes) {
                throw ClientAuthError.createEmptyInputScopeSetError();
            }
            var unionScopes = new Set(); // Iterator in constructor not supported in IE11
            otherScopes.scopes.forEach(function (scope) { return unionScopes.add(scope.toLowerCase()); });
            this.scopes.forEach(function (scope) { return unionScopes.add(scope.toLowerCase()); });
            return unionScopes;
        };
        /**
         * Check if scopes intersect between this set and another.
         * @param otherScopes
         */
        ScopeSet.prototype.intersectingScopeSets = function (otherScopes) {
            if (!otherScopes) {
                throw ClientAuthError.createEmptyInputScopeSetError();
            }
            // Do not allow OIDC scopes to be the only intersecting scopes
            if (!otherScopes.containsOnlyOIDCScopes()) {
                otherScopes.removeOIDCScopes();
            }
            var unionScopes = this.unionScopeSets(otherScopes);
            var sizeOtherScopes = otherScopes.getScopeCount();
            var sizeThisScopes = this.getScopeCount();
            var sizeUnionScopes = unionScopes.size;
            return sizeUnionScopes < (sizeThisScopes + sizeOtherScopes);
        };
        /**
         * Returns size of set of scopes.
         */
        ScopeSet.prototype.getScopeCount = function () {
            return this.scopes.size;
        };
        /**
         * Returns the scopes as an array of string values
         */
        ScopeSet.prototype.asArray = function () {
            var array = [];
            this.scopes.forEach(function (val) { return array.push(val); });
            return array;
        };
        /**
         * Prints scopes into a space-delimited string
         */
        ScopeSet.prototype.printScopes = function () {
            if (this.scopes) {
                var scopeArr = this.asArray();
                return scopeArr.join(" ");
            }
            return Constants.EMPTY_STRING;
        };
        /**
         * Prints scopes into a space-delimited lower-case string (used for caching)
         */
        ScopeSet.prototype.printScopesLowerCase = function () {
            return this.printScopes().toLowerCase();
        };
        return ScopeSet;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * Function to build a client info object from server clientInfo string
     * @param rawClientInfo
     * @param crypto
     */
    function buildClientInfo(rawClientInfo, crypto) {
        if (StringUtils.isEmpty(rawClientInfo)) {
            throw ClientAuthError.createClientInfoEmptyError();
        }
        try {
            var decodedClientInfo = crypto.base64Decode(rawClientInfo);
            return JSON.parse(decodedClientInfo);
        }
        catch (e) {
            throw ClientAuthError.createClientInfoDecodingError(e);
        }
    }
    /**
     * Function to build a client info object from cached homeAccountId string
     * @param homeAccountId
     */
    function buildClientInfoFromHomeAccountId(homeAccountId) {
        if (StringUtils.isEmpty(homeAccountId)) {
            throw ClientAuthError.createClientInfoDecodingError("Home account ID was empty.");
        }
        var clientInfoParts = homeAccountId.split(Separators.CLIENT_INFO_SEPARATOR, 2);
        return {
            uid: clientInfoParts[0],
            utid: clientInfoParts.length < 2 ? Constants.EMPTY_STRING : clientInfoParts[1]
        };
    }

    /*! @azure/msal-common v7.3.0 2022-08-01 */
    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * Authority types supported by MSAL.
     */
    var AuthorityType;
    (function (AuthorityType) {
        AuthorityType[AuthorityType["Default"] = 0] = "Default";
        AuthorityType[AuthorityType["Adfs"] = 1] = "Adfs";
    })(AuthorityType || (AuthorityType = {}));

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * Type that defines required and optional parameters for an Account field (based on universal cache schema implemented by all MSALs).
     *
     * Key : Value Schema
     *
     * Key: <home_account_id>-<environment>-<realm*>
     *
     * Value Schema:
     * {
     *      homeAccountId: home account identifier for the auth scheme,
     *      environment: entity that issued the token, represented as a full host
     *      realm: Full tenant or organizational identifier that the account belongs to
     *      localAccountId: Original tenant-specific accountID, usually used for legacy cases
     *      username: primary username that represents the user, usually corresponds to preferred_username in the v2 endpt
     *      authorityType: Accounts authority type as a string
     *      name: Full name for the account, including given name and family name,
     *      clientInfo: Full base64 encoded client info received from ESTS
     *      lastModificationTime: last time this entity was modified in the cache
     *      lastModificationApp:
     *      idTokenClaims: Object containing claims parsed from ID token
     *      nativeAccountId: Account identifier on the native device
     * }
     */
    var AccountEntity = /** @class */ (function () {
        function AccountEntity() {
        }
        /**
         * Generate Account Id key component as per the schema: <home_account_id>-<environment>
         */
        AccountEntity.prototype.generateAccountId = function () {
            var accountId = [this.homeAccountId, this.environment];
            return accountId.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();
        };
        /**
         * Generate Account Cache Key as per the schema: <home_account_id>-<environment>-<realm*>
         */
        AccountEntity.prototype.generateAccountKey = function () {
            return AccountEntity.generateAccountCacheKey({
                homeAccountId: this.homeAccountId,
                environment: this.environment,
                tenantId: this.realm,
                username: this.username,
                localAccountId: this.localAccountId
            });
        };
        /**
         * returns the type of the cache (in this case account)
         */
        AccountEntity.prototype.generateType = function () {
            switch (this.authorityType) {
                case CacheAccountType.ADFS_ACCOUNT_TYPE:
                    return CacheType.ADFS;
                case CacheAccountType.MSAV1_ACCOUNT_TYPE:
                    return CacheType.MSA;
                case CacheAccountType.MSSTS_ACCOUNT_TYPE:
                    return CacheType.MSSTS;
                case CacheAccountType.GENERIC_ACCOUNT_TYPE:
                    return CacheType.GENERIC;
                default: {
                    throw ClientAuthError.createUnexpectedAccountTypeError();
                }
            }
        };
        /**
         * Returns the AccountInfo interface for this account.
         */
        AccountEntity.prototype.getAccountInfo = function () {
            return {
                homeAccountId: this.homeAccountId,
                environment: this.environment,
                tenantId: this.realm,
                username: this.username,
                localAccountId: this.localAccountId,
                name: this.name,
                idTokenClaims: this.idTokenClaims,
                nativeAccountId: this.nativeAccountId
            };
        };
        /**
         * Generates account key from interface
         * @param accountInterface
         */
        AccountEntity.generateAccountCacheKey = function (accountInterface) {
            var accountKey = [
                accountInterface.homeAccountId,
                accountInterface.environment || Constants.EMPTY_STRING,
                accountInterface.tenantId || Constants.EMPTY_STRING,
            ];
            return accountKey.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();
        };
        /**
         * Build Account cache from IdToken, clientInfo and authority/policy. Associated with AAD.
         * @param clientInfo
         * @param authority
         * @param idToken
         * @param policy
         */
        AccountEntity.createAccount = function (clientInfo, homeAccountId, idToken, authority, cloudGraphHostName, msGraphHost, environment, nativeAccountId) {
            var _a, _b, _c, _d, _e, _f;
            var account = new AccountEntity();
            account.authorityType = CacheAccountType.MSSTS_ACCOUNT_TYPE;
            account.clientInfo = clientInfo;
            account.homeAccountId = homeAccountId;
            account.nativeAccountId = nativeAccountId;
            var env = environment || (authority && authority.getPreferredCache());
            if (!env) {
                throw ClientAuthError.createInvalidCacheEnvironmentError();
            }
            account.environment = env;
            // non AAD scenarios can have empty realm
            account.realm = ((_a = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _a === void 0 ? void 0 : _a.tid) || Constants.EMPTY_STRING;
            if (idToken) {
                account.idTokenClaims = idToken.claims;
                // How do you account for MSA CID here?
                account.localAccountId = ((_b = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _b === void 0 ? void 0 : _b.oid) || ((_c = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _c === void 0 ? void 0 : _c.sub) || Constants.EMPTY_STRING;
                /*
                 * In B2C scenarios the emails claim is used instead of preferred_username and it is an array. In most cases it will contain a single email.
                 * This field should not be relied upon if a custom policy is configured to return more than 1 email.
                 */
                account.username = ((_d = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _d === void 0 ? void 0 : _d.preferred_username) || (((_e = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _e === void 0 ? void 0 : _e.emails) ? idToken.claims.emails[0] : Constants.EMPTY_STRING);
                account.name = (_f = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _f === void 0 ? void 0 : _f.name;
            }
            account.cloudGraphHostName = cloudGraphHostName;
            account.msGraphHost = msGraphHost;
            return account;
        };
        /**
         * Builds non-AAD/ADFS account.
         * @param authority
         * @param idToken
         */
        AccountEntity.createGenericAccount = function (homeAccountId, idToken, authority, cloudGraphHostName, msGraphHost, environment) {
            var _a, _b, _c, _d;
            var account = new AccountEntity();
            account.authorityType = (authority && authority.authorityType === AuthorityType.Adfs) ? CacheAccountType.ADFS_ACCOUNT_TYPE : CacheAccountType.GENERIC_ACCOUNT_TYPE;
            account.homeAccountId = homeAccountId;
            // non AAD scenarios can have empty realm
            account.realm = Constants.EMPTY_STRING;
            var env = environment || authority && authority.getPreferredCache();
            if (!env) {
                throw ClientAuthError.createInvalidCacheEnvironmentError();
            }
            if (idToken) {
                // How do you account for MSA CID here?
                account.localAccountId = ((_a = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _a === void 0 ? void 0 : _a.oid) || ((_b = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _b === void 0 ? void 0 : _b.sub) || Constants.EMPTY_STRING;
                // upn claim for most ADFS scenarios
                account.username = ((_c = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _c === void 0 ? void 0 : _c.upn) || Constants.EMPTY_STRING;
                account.name = ((_d = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _d === void 0 ? void 0 : _d.name) || Constants.EMPTY_STRING;
                account.idTokenClaims = idToken === null || idToken === void 0 ? void 0 : idToken.claims;
            }
            account.environment = env;
            account.cloudGraphHostName = cloudGraphHostName;
            account.msGraphHost = msGraphHost;
            /*
             * add uniqueName to claims
             * account.name = idToken.claims.uniqueName;
             */
            return account;
        };
        /**
         * Generate HomeAccountId from server response
         * @param serverClientInfo
         * @param authType
         */
        AccountEntity.generateHomeAccountId = function (serverClientInfo, authType, logger, cryptoObj, idToken) {
            var _a;
            var accountId = ((_a = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _a === void 0 ? void 0 : _a.sub) ? idToken.claims.sub : Constants.EMPTY_STRING;
            // since ADFS does not have tid and does not set client_info
            if (authType === AuthorityType.Adfs) {
                return accountId;
            }
            // for cases where there is clientInfo
            if (serverClientInfo) {
                try {
                    var clientInfo = buildClientInfo(serverClientInfo, cryptoObj);
                    if (!StringUtils.isEmpty(clientInfo.uid) && !StringUtils.isEmpty(clientInfo.utid)) {
                        return "" + clientInfo.uid + Separators.CLIENT_INFO_SEPARATOR + clientInfo.utid;
                    }
                }
                catch (e) { }
            }
            // default to "sub" claim
            logger.verbose("No client info in response");
            return accountId;
        };
        /**
         * Validates an entity: checks for all expected params
         * @param entity
         */
        AccountEntity.isAccountEntity = function (entity) {
            if (!entity) {
                return false;
            }
            return (entity.hasOwnProperty("homeAccountId") &&
                entity.hasOwnProperty("environment") &&
                entity.hasOwnProperty("realm") &&
                entity.hasOwnProperty("localAccountId") &&
                entity.hasOwnProperty("username") &&
                entity.hasOwnProperty("authorityType"));
        };
        /**
         * Helper function to determine whether 2 accountInfo objects represent the same account
         * @param accountA
         * @param accountB
         * @param compareClaims - If set to true idTokenClaims will also be compared to determine account equality
         */
        AccountEntity.accountInfoIsEqual = function (accountA, accountB, compareClaims) {
            if (!accountA || !accountB) {
                return false;
            }
            var claimsMatch = true; // default to true so as to not fail comparison below if compareClaims: false
            if (compareClaims) {
                var accountAClaims = (accountA.idTokenClaims || {});
                var accountBClaims = (accountB.idTokenClaims || {});
                // issued at timestamp and nonce are expected to change each time a new id token is acquired
                claimsMatch = (accountAClaims.iat === accountBClaims.iat) &&
                    (accountAClaims.nonce === accountBClaims.nonce);
            }
            return (accountA.homeAccountId === accountB.homeAccountId) &&
                (accountA.localAccountId === accountB.localAccountId) &&
                (accountA.username === accountB.username) &&
                (accountA.tenantId === accountB.tenantId) &&
                (accountA.environment === accountB.environment) &&
                (accountA.nativeAccountId === accountB.nativeAccountId) &&
                claimsMatch;
        };
        return AccountEntity;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * JWT Token representation class. Parses token string and generates claims object.
     */
    var AuthToken = /** @class */ (function () {
        function AuthToken(rawToken, crypto) {
            if (StringUtils.isEmpty(rawToken)) {
                throw ClientAuthError.createTokenNullOrEmptyError(rawToken);
            }
            this.rawToken = rawToken;
            this.claims = AuthToken.extractTokenClaims(rawToken, crypto);
        }
        /**
         * Extract token by decoding the rawToken
         *
         * @param encodedToken
         */
        AuthToken.extractTokenClaims = function (encodedToken, crypto) {
            var decodedToken = StringUtils.decodeAuthToken(encodedToken);
            // token will be decoded to get the username
            try {
                var base64TokenPayload = decodedToken.JWSPayload;
                // base64Decode() should throw an error if there is an issue
                var base64Decoded = crypto.base64Decode(base64TokenPayload);
                return JSON.parse(base64Decoded);
            }
            catch (err) {
                throw ClientAuthError.createTokenParsingError(err);
            }
        };
        return AuthToken;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * Interface class which implement cache storage functions used by MSAL to perform validity checks, and store tokens.
     */
    var CacheManager = /** @class */ (function () {
        function CacheManager(clientId, cryptoImpl) {
            this.clientId = clientId;
            this.cryptoImpl = cryptoImpl;
        }
        /**
         * Returns all accounts in cache
         */
        CacheManager.prototype.getAllAccounts = function () {
            var _this = this;
            var currentAccounts = this.getAccountsFilteredBy();
            var accountValues = Object.keys(currentAccounts).map(function (accountKey) { return currentAccounts[accountKey]; });
            var numAccounts = accountValues.length;
            if (numAccounts < 1) {
                return [];
            }
            else {
                var allAccounts = accountValues.map(function (value) {
                    var accountEntity = CacheManager.toObject(new AccountEntity(), value);
                    var accountInfo = accountEntity.getAccountInfo();
                    var idToken = _this.readIdTokenFromCache(_this.clientId, accountInfo);
                    if (idToken && !accountInfo.idTokenClaims) {
                        accountInfo.idTokenClaims = new AuthToken(idToken.secret, _this.cryptoImpl).claims;
                    }
                    return accountInfo;
                });
                return allAccounts;
            }
        };
        /**
         * saves a cache record
         * @param cacheRecord
         */
        CacheManager.prototype.saveCacheRecord = function (cacheRecord) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            if (!cacheRecord) {
                                throw ClientAuthError.createNullOrUndefinedCacheRecord();
                            }
                            if (!!cacheRecord.account) {
                                this.setAccount(cacheRecord.account);
                            }
                            if (!!cacheRecord.idToken) {
                                this.setIdTokenCredential(cacheRecord.idToken);
                            }
                            if (!!!cacheRecord.accessToken) return [3 /*break*/, 2];
                            return [4 /*yield*/, this.saveAccessToken(cacheRecord.accessToken)];
                        case 1:
                            _a.sent();
                            _a.label = 2;
                        case 2:
                            if (!!cacheRecord.refreshToken) {
                                this.setRefreshTokenCredential(cacheRecord.refreshToken);
                            }
                            if (!!cacheRecord.appMetadata) {
                                this.setAppMetadata(cacheRecord.appMetadata);
                            }
                            return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * saves access token credential
         * @param credential
         */
        CacheManager.prototype.saveAccessToken = function (credential) {
            return __awaiter(this, void 0, void 0, function () {
                var currentTokenCache, currentScopes, currentAccessTokens, removedAccessTokens_1;
                var _this = this;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            currentTokenCache = this.getCredentialsFilteredBy({
                                clientId: credential.clientId,
                                credentialType: credential.credentialType,
                                environment: credential.environment,
                                homeAccountId: credential.homeAccountId,
                                realm: credential.realm,
                                tokenType: credential.tokenType,
                                requestedClaimsHash: credential.requestedClaimsHash
                            });
                            currentScopes = ScopeSet.fromString(credential.target);
                            currentAccessTokens = Object.keys(currentTokenCache.accessTokens).map(function (key) { return currentTokenCache.accessTokens[key]; });
                            if (!currentAccessTokens) return [3 /*break*/, 2];
                            removedAccessTokens_1 = [];
                            currentAccessTokens.forEach(function (tokenEntity) {
                                var tokenScopeSet = ScopeSet.fromString(tokenEntity.target);
                                if (tokenScopeSet.intersectingScopeSets(currentScopes)) {
                                    removedAccessTokens_1.push(_this.removeCredential(tokenEntity));
                                }
                            });
                            return [4 /*yield*/, Promise.all(removedAccessTokens_1)];
                        case 1:
                            _a.sent();
                            _a.label = 2;
                        case 2:
                            this.setAccessTokenCredential(credential);
                            return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * retrieve accounts matching all provided filters; if no filter is set, get all accounts
         * not checking for casing as keys are all generated in lower case, remember to convert to lower case if object properties are compared
         * @param homeAccountId
         * @param environment
         * @param realm
         */
        CacheManager.prototype.getAccountsFilteredBy = function (accountFilter) {
            return this.getAccountsFilteredByInternal(accountFilter ? accountFilter.homeAccountId : Constants.EMPTY_STRING, accountFilter ? accountFilter.environment : Constants.EMPTY_STRING, accountFilter ? accountFilter.realm : Constants.EMPTY_STRING, accountFilter ? accountFilter.nativeAccountId : Constants.EMPTY_STRING);
        };
        /**
         * retrieve accounts matching all provided filters; if no filter is set, get all accounts
         * not checking for casing as keys are all generated in lower case, remember to convert to lower case if object properties are compared
         * @param homeAccountId
         * @param environment
         * @param realm
         */
        CacheManager.prototype.getAccountsFilteredByInternal = function (homeAccountId, environment, realm, nativeAccountId) {
            var _this = this;
            var allCacheKeys = this.getKeys();
            var matchingAccounts = {};
            allCacheKeys.forEach(function (cacheKey) {
                var entity = _this.getAccount(cacheKey);
                if (!entity) {
                    return;
                }
                if (!!homeAccountId && !_this.matchHomeAccountId(entity, homeAccountId)) {
                    return;
                }
                if (!!environment && !_this.matchEnvironment(entity, environment)) {
                    return;
                }
                if (!!realm && !_this.matchRealm(entity, realm)) {
                    return;
                }
                if (!!nativeAccountId && !_this.matchNativeAccountId(entity, nativeAccountId)) {
                    return;
                }
                matchingAccounts[cacheKey] = entity;
            });
            return matchingAccounts;
        };
        /**
         * retrieve credentails matching all provided filters; if no filter is set, get all credentials
         * @param homeAccountId
         * @param environment
         * @param credentialType
         * @param clientId
         * @param realm
         * @param target
         */
        CacheManager.prototype.getCredentialsFilteredBy = function (filter) {
            return this.getCredentialsFilteredByInternal(filter.homeAccountId, filter.environment, filter.credentialType, filter.clientId, filter.familyId, filter.realm, filter.target, filter.userAssertionHash, filter.tokenType, filter.keyId, filter.requestedClaimsHash);
        };
        /**
         * Support function to help match credentials
         * @param homeAccountId
         * @param environment
         * @param credentialType
         * @param clientId
         * @param realm
         * @param target
         * @param userAssertionHash
         * @param tokenType
         */
        CacheManager.prototype.getCredentialsFilteredByInternal = function (homeAccountId, environment, credentialType, clientId, familyId, realm, target, userAssertionHash, tokenType, keyId, requestedClaimsHash) {
            var _this = this;
            var allCacheKeys = this.getKeys();
            var matchingCredentials = {
                idTokens: {},
                accessTokens: {},
                refreshTokens: {},
            };
            allCacheKeys.forEach(function (cacheKey) {
                // don't parse any non-credential type cache entities
                var credType = CredentialEntity.getCredentialType(cacheKey);
                if (credType === Constants.NOT_DEFINED) {
                    return;
                }
                // Attempt retrieval
                var entity = _this.getSpecificCredential(cacheKey, credType);
                if (!entity) {
                    return;
                }
                if (!!userAssertionHash && !_this.matchUserAssertionHash(entity, userAssertionHash)) {
                    return;
                }
                if (!!homeAccountId && !_this.matchHomeAccountId(entity, homeAccountId)) {
                    return;
                }
                if (!!environment && !_this.matchEnvironment(entity, environment)) {
                    return;
                }
                if (!!realm && !_this.matchRealm(entity, realm)) {
                    return;
                }
                if (!!credentialType && !_this.matchCredentialType(entity, credentialType)) {
                    return;
                }
                if (!!clientId && !_this.matchClientId(entity, clientId)) {
                    return;
                }
                if (!!familyId && !_this.matchFamilyId(entity, familyId)) {
                    return;
                }
                /*
                 * idTokens do not have "target", target specific refreshTokens do exist for some types of authentication
                 * Resource specific refresh tokens case will be added when the support is deemed necessary
                 */
                if (!!target && !_this.matchTarget(entity, target)) {
                    return;
                }
                // If request OR cached entity has requested Claims Hash, check if they match
                if (requestedClaimsHash || entity.requestedClaimsHash) {
                    // Don't match if either is undefined or they are different
                    if (entity.requestedClaimsHash !== requestedClaimsHash) {
                        return;
                    }
                }
                // Access Token with Auth Scheme specific matching
                if (credentialType === CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME) {
                    if (!!tokenType && !_this.matchTokenType(entity, tokenType)) {
                        return;
                    }
                    // KeyId (sshKid) in request must match cached SSH certificate keyId because SSH cert is bound to a specific key
                    if (tokenType === exports.AuthenticationScheme.SSH) {
                        if (keyId && !_this.matchKeyId(entity, keyId)) {
                            return;
                        }
                    }
                }
                // At this point, the entity matches the request, update cache key if key schema has changed
                var updatedCacheKey = _this.updateCredentialCacheKey(cacheKey, entity);
                switch (credType) {
                    case CredentialType.ID_TOKEN:
                        matchingCredentials.idTokens[updatedCacheKey] = entity;
                        break;
                    case CredentialType.ACCESS_TOKEN:
                    case CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME:
                        matchingCredentials.accessTokens[updatedCacheKey] = entity;
                        break;
                    case CredentialType.REFRESH_TOKEN:
                        matchingCredentials.refreshTokens[updatedCacheKey] = entity;
                        break;
                }
            });
            return matchingCredentials;
        };
        /**
         * retrieve appMetadata matching all provided filters; if no filter is set, get all appMetadata
         * @param filter
         */
        CacheManager.prototype.getAppMetadataFilteredBy = function (filter) {
            return this.getAppMetadataFilteredByInternal(filter.environment, filter.clientId);
        };
        /**
         * Support function to help match appMetadata
         * @param environment
         * @param clientId
         */
        CacheManager.prototype.getAppMetadataFilteredByInternal = function (environment, clientId) {
            var _this = this;
            var allCacheKeys = this.getKeys();
            var matchingAppMetadata = {};
            allCacheKeys.forEach(function (cacheKey) {
                // don't parse any non-appMetadata type cache entities
                if (!_this.isAppMetadata(cacheKey)) {
                    return;
                }
                // Attempt retrieval
                var entity = _this.getAppMetadata(cacheKey);
                if (!entity) {
                    return;
                }
                if (!!environment && !_this.matchEnvironment(entity, environment)) {
                    return;
                }
                if (!!clientId && !_this.matchClientId(entity, clientId)) {
                    return;
                }
                matchingAppMetadata[cacheKey] = entity;
            });
            return matchingAppMetadata;
        };
        /**
         * retrieve authorityMetadata that contains a matching alias
         * @param filter
         */
        CacheManager.prototype.getAuthorityMetadataByAlias = function (host) {
            var _this = this;
            var allCacheKeys = this.getAuthorityMetadataKeys();
            var matchedEntity = null;
            allCacheKeys.forEach(function (cacheKey) {
                // don't parse any non-authorityMetadata type cache entities
                if (!_this.isAuthorityMetadata(cacheKey) || cacheKey.indexOf(_this.clientId) === -1) {
                    return;
                }
                // Attempt retrieval
                var entity = _this.getAuthorityMetadata(cacheKey);
                if (!entity) {
                    return;
                }
                if (entity.aliases.indexOf(host) === -1) {
                    return;
                }
                matchedEntity = entity;
            });
            return matchedEntity;
        };
        /**
         * Removes all accounts and related tokens from cache.
         */
        CacheManager.prototype.removeAllAccounts = function () {
            return __awaiter(this, void 0, void 0, function () {
                var allCacheKeys, removedAccounts;
                var _this = this;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            allCacheKeys = this.getKeys();
                            removedAccounts = [];
                            allCacheKeys.forEach(function (cacheKey) {
                                var entity = _this.getAccount(cacheKey);
                                if (!entity) {
                                    return;
                                }
                                removedAccounts.push(_this.removeAccount(cacheKey));
                            });
                            return [4 /*yield*/, Promise.all(removedAccounts)];
                        case 1:
                            _a.sent();
                            return [2 /*return*/, true];
                    }
                });
            });
        };
        /**
         * returns a boolean if the given account is removed
         * @param account
         */
        CacheManager.prototype.removeAccount = function (accountKey) {
            return __awaiter(this, void 0, void 0, function () {
                var account;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            account = this.getAccount(accountKey);
                            if (!account) {
                                throw ClientAuthError.createNoAccountFoundError();
                            }
                            return [4 /*yield*/, this.removeAccountContext(account)];
                        case 1: return [2 /*return*/, ((_a.sent()) && this.removeItem(accountKey, CacheSchemaType.ACCOUNT))];
                    }
                });
            });
        };
        /**
         * Removes credentials associated with the provided account
         * @param account
         */
        CacheManager.prototype.removeAccountContext = function (account) {
            return __awaiter(this, void 0, void 0, function () {
                var allCacheKeys, accountId, removedCredentials;
                var _this = this;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            allCacheKeys = this.getKeys();
                            accountId = account.generateAccountId();
                            removedCredentials = [];
                            allCacheKeys.forEach(function (cacheKey) {
                                // don't parse any non-credential type cache entities
                                var credType = CredentialEntity.getCredentialType(cacheKey);
                                if (credType === Constants.NOT_DEFINED) {
                                    return;
                                }
                                var cacheEntity = _this.getSpecificCredential(cacheKey, credType);
                                if (!!cacheEntity && accountId === cacheEntity.generateAccountId()) {
                                    removedCredentials.push(_this.removeCredential(cacheEntity));
                                }
                            });
                            return [4 /*yield*/, Promise.all(removedCredentials)];
                        case 1:
                            _a.sent();
                            return [2 /*return*/, true];
                    }
                });
            });
        };
        /**
         * returns a boolean if the given credential is removed
         * @param credential
         */
        CacheManager.prototype.removeCredential = function (credential) {
            return __awaiter(this, void 0, void 0, function () {
                var key, accessTokenWithAuthSchemeEntity, kid;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            key = credential.generateCredentialKey();
                            if (!(credential.credentialType.toLowerCase() === CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME.toLowerCase())) return [3 /*break*/, 4];
                            if (!(credential.tokenType === exports.AuthenticationScheme.POP)) return [3 /*break*/, 4];
                            accessTokenWithAuthSchemeEntity = credential;
                            kid = accessTokenWithAuthSchemeEntity.keyId;
                            if (!kid) return [3 /*break*/, 4];
                            _a.label = 1;
                        case 1:
                            _a.trys.push([1, 3, , 4]);
                            return [4 /*yield*/, this.cryptoImpl.removeTokenBindingKey(kid)];
                        case 2:
                            _a.sent();
                            return [3 /*break*/, 4];
                        case 3:
                            _a.sent();
                            throw ClientAuthError.createBindingKeyNotRemovedError();
                        case 4: return [2 /*return*/, this.removeItem(key, CacheSchemaType.CREDENTIAL)];
                    }
                });
            });
        };
        /**
         * Removes all app metadata objects from cache.
         */
        CacheManager.prototype.removeAppMetadata = function () {
            var _this = this;
            var allCacheKeys = this.getKeys();
            allCacheKeys.forEach(function (cacheKey) {
                if (_this.isAppMetadata(cacheKey)) {
                    _this.removeItem(cacheKey, CacheSchemaType.APP_METADATA);
                }
            });
            return true;
        };
        /**
         * Retrieve the cached credentials into a cacherecord
         * @param account
         * @param clientId
         * @param scopes
         * @param environment
         * @param authScheme
         */
        CacheManager.prototype.readCacheRecord = function (account, clientId, request, environment) {
            var cachedAccount = this.readAccountFromCache(account);
            var cachedIdToken = this.readIdTokenFromCache(clientId, account);
            var cachedAccessToken = this.readAccessTokenFromCache(clientId, account, request);
            var cachedRefreshToken = this.readRefreshTokenFromCache(clientId, account, false);
            var cachedAppMetadata = this.readAppMetadataFromCache(environment, clientId);
            if (cachedAccount && cachedIdToken) {
                cachedAccount.idTokenClaims = new AuthToken(cachedIdToken.secret, this.cryptoImpl).claims;
            }
            return {
                account: cachedAccount,
                idToken: cachedIdToken,
                accessToken: cachedAccessToken,
                refreshToken: cachedRefreshToken,
                appMetadata: cachedAppMetadata,
            };
        };
        /**
         * Retrieve AccountEntity from cache
         * @param account
         */
        CacheManager.prototype.readAccountFromCache = function (account) {
            var accountKey = AccountEntity.generateAccountCacheKey(account);
            return this.getAccount(accountKey);
        };
        /**
         * Retrieve AccountEntity from cache
         * @param nativeAccountId
         * @returns AccountEntity or Null
         */
        CacheManager.prototype.readAccountFromCacheWithNativeAccountId = function (nativeAccountId) {
            // fetch account from memory
            var accountFilter = {
                nativeAccountId: nativeAccountId
            };
            var accountCache = this.getAccountsFilteredBy(accountFilter);
            var accounts = Object.keys(accountCache).map(function (key) { return accountCache[key]; });
            if (accounts.length < 1) {
                return null;
            }
            else if (accounts.length > 1) {
                throw ClientAuthError.createMultipleMatchingAccountsInCacheError();
            }
            return accountCache[0];
        };
        /**
         * Retrieve IdTokenEntity from cache
         * @param clientId
         * @param account
         * @param inputRealm
         */
        CacheManager.prototype.readIdTokenFromCache = function (clientId, account) {
            var idTokenFilter = {
                homeAccountId: account.homeAccountId,
                environment: account.environment,
                credentialType: CredentialType.ID_TOKEN,
                clientId: clientId,
                realm: account.tenantId,
            };
            var credentialCache = this.getCredentialsFilteredBy(idTokenFilter);
            var idTokens = Object.keys(credentialCache.idTokens).map(function (key) { return credentialCache.idTokens[key]; });
            var numIdTokens = idTokens.length;
            if (numIdTokens < 1) {
                return null;
            }
            else if (numIdTokens > 1) {
                throw ClientAuthError.createMultipleMatchingTokensInCacheError();
            }
            return idTokens[0];
        };
        /**
         * Retrieve AccessTokenEntity from cache
         * @param clientId
         * @param account
         * @param scopes
         * @param authScheme
         */
        CacheManager.prototype.readAccessTokenFromCache = function (clientId, account, request) {
            var scopes = new ScopeSet(request.scopes || []);
            var authScheme = request.authenticationScheme || exports.AuthenticationScheme.BEARER;
            /*
             * Distinguish between Bearer and PoP/SSH token cache types
             * Cast to lowercase to handle "bearer" from ADFS
             */
            var credentialType = (authScheme && authScheme.toLowerCase() !== exports.AuthenticationScheme.BEARER.toLowerCase()) ? CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME : CredentialType.ACCESS_TOKEN;
            var accessTokenFilter = {
                homeAccountId: account.homeAccountId,
                environment: account.environment,
                credentialType: credentialType,
                clientId: clientId,
                realm: account.tenantId,
                target: scopes.printScopesLowerCase(),
                tokenType: authScheme,
                keyId: request.sshKid,
                requestedClaimsHash: request.requestedClaimsHash,
            };
            var credentialCache = this.getCredentialsFilteredBy(accessTokenFilter);
            var accessTokens = Object.keys(credentialCache.accessTokens).map(function (key) { return credentialCache.accessTokens[key]; });
            var numAccessTokens = accessTokens.length;
            if (numAccessTokens < 1) {
                return null;
            }
            else if (numAccessTokens > 1) {
                throw ClientAuthError.createMultipleMatchingTokensInCacheError();
            }
            return accessTokens[0];
        };
        /**
         * Helper to retrieve the appropriate refresh token from cache
         * @param clientId
         * @param account
         * @param familyRT
         */
        CacheManager.prototype.readRefreshTokenFromCache = function (clientId, account, familyRT) {
            var id = familyRT ? THE_FAMILY_ID : undefined;
            var refreshTokenFilter = {
                homeAccountId: account.homeAccountId,
                environment: account.environment,
                credentialType: CredentialType.REFRESH_TOKEN,
                clientId: clientId,
                familyId: id,
            };
            var credentialCache = this.getCredentialsFilteredBy(refreshTokenFilter);
            var refreshTokens = Object.keys(credentialCache.refreshTokens).map(function (key) { return credentialCache.refreshTokens[key]; });
            var numRefreshTokens = refreshTokens.length;
            if (numRefreshTokens < 1) {
                return null;
            }
            // address the else case after remove functions address environment aliases
            return refreshTokens[0];
        };
        /**
         * Retrieve AppMetadataEntity from cache
         */
        CacheManager.prototype.readAppMetadataFromCache = function (environment, clientId) {
            var appMetadataFilter = {
                environment: environment,
                clientId: clientId,
            };
            var appMetadata = this.getAppMetadataFilteredBy(appMetadataFilter);
            var appMetadataEntries = Object.keys(appMetadata).map(function (key) { return appMetadata[key]; });
            var numAppMetadata = appMetadataEntries.length;
            if (numAppMetadata < 1) {
                return null;
            }
            else if (numAppMetadata > 1) {
                throw ClientAuthError.createMultipleMatchingAppMetadataInCacheError();
            }
            return appMetadataEntries[0];
        };
        /**
         * Return the family_id value associated  with FOCI
         * @param environment
         * @param clientId
         */
        CacheManager.prototype.isAppMetadataFOCI = function (environment, clientId) {
            var appMetadata = this.readAppMetadataFromCache(environment, clientId);
            return !!(appMetadata && appMetadata.familyId === THE_FAMILY_ID);
        };
        /**
         * helper to match account ids
         * @param value
         * @param homeAccountId
         */
        CacheManager.prototype.matchHomeAccountId = function (entity, homeAccountId) {
            return !!(entity.homeAccountId && homeAccountId === entity.homeAccountId);
        };
        /**
         * helper to match assertion
         * @param value
         * @param oboAssertion
         */
        CacheManager.prototype.matchUserAssertionHash = function (entity, userAssertionHash) {
            return !!(entity.userAssertionHash && userAssertionHash === entity.userAssertionHash);
        };
        /**
         * helper to match environment
         * @param value
         * @param environment
         */
        CacheManager.prototype.matchEnvironment = function (entity, environment) {
            var cloudMetadata = this.getAuthorityMetadataByAlias(environment);
            if (cloudMetadata && cloudMetadata.aliases.indexOf(entity.environment) > -1) {
                return true;
            }
            return false;
        };
        /**
         * helper to match credential type
         * @param entity
         * @param credentialType
         */
        CacheManager.prototype.matchCredentialType = function (entity, credentialType) {
            return (entity.credentialType && credentialType.toLowerCase() === entity.credentialType.toLowerCase());
        };
        /**
         * helper to match client ids
         * @param entity
         * @param clientId
         */
        CacheManager.prototype.matchClientId = function (entity, clientId) {
            return !!(entity.clientId && clientId === entity.clientId);
        };
        /**
         * helper to match family ids
         * @param entity
         * @param familyId
         */
        CacheManager.prototype.matchFamilyId = function (entity, familyId) {
            return !!(entity.familyId && familyId === entity.familyId);
        };
        /**
         * helper to match realm
         * @param entity
         * @param realm
         */
        CacheManager.prototype.matchRealm = function (entity, realm) {
            return !!(entity.realm && realm === entity.realm);
        };
        /**
         * helper to match nativeAccountId
         * @param entity
         * @param nativeAccountId
         * @returns boolean indicating the match result
         */
        CacheManager.prototype.matchNativeAccountId = function (entity, nativeAccountId) {
            return !!(entity.nativeAccountId && nativeAccountId === entity.nativeAccountId);
        };
        /**
         * Returns true if the target scopes are a subset of the current entity's scopes, false otherwise.
         * @param entity
         * @param target
         */
        CacheManager.prototype.matchTarget = function (entity, target) {
            var isNotAccessTokenCredential = (entity.credentialType !== CredentialType.ACCESS_TOKEN && entity.credentialType !== CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME);
            if (isNotAccessTokenCredential || !entity.target) {
                return false;
            }
            var entityScopeSet = ScopeSet.fromString(entity.target);
            var requestTargetScopeSet = ScopeSet.fromString(target);
            if (!requestTargetScopeSet.containsOnlyOIDCScopes()) {
                requestTargetScopeSet.removeOIDCScopes(); // ignore OIDC scopes
            }
            else {
                requestTargetScopeSet.removeScope(Constants.OFFLINE_ACCESS_SCOPE);
            }
            return entityScopeSet.containsScopeSet(requestTargetScopeSet);
        };
        /**
         * Returns true if the credential's tokenType or Authentication Scheme matches the one in the request, false otherwise
         * @param entity
         * @param tokenType
         */
        CacheManager.prototype.matchTokenType = function (entity, tokenType) {
            return !!(entity.tokenType && entity.tokenType === tokenType);
        };
        /**
         * Returns true if the credential's keyId matches the one in the request, false otherwise
         * @param entity
         * @param tokenType
         */
        CacheManager.prototype.matchKeyId = function (entity, keyId) {
            return !!(entity.keyId && entity.keyId === keyId);
        };
        /**
         * returns if a given cache entity is of the type appmetadata
         * @param key
         */
        CacheManager.prototype.isAppMetadata = function (key) {
            return key.indexOf(APP_METADATA) !== -1;
        };
        /**
         * returns if a given cache entity is of the type authoritymetadata
         * @param key
         */
        CacheManager.prototype.isAuthorityMetadata = function (key) {
            return key.indexOf(AUTHORITY_METADATA_CONSTANTS.CACHE_KEY) !== -1;
        };
        /**
         * returns cache key used for cloud instance metadata
         */
        CacheManager.prototype.generateAuthorityMetadataCacheKey = function (authority) {
            return AUTHORITY_METADATA_CONSTANTS.CACHE_KEY + "-" + this.clientId + "-" + authority;
        };
        /**
         * Returns the specific credential (IdToken/AccessToken/RefreshToken) from the cache
         * @param key
         * @param credType
         */
        CacheManager.prototype.getSpecificCredential = function (key, credType) {
            switch (credType) {
                case CredentialType.ID_TOKEN: {
                    return this.getIdTokenCredential(key);
                }
                case CredentialType.ACCESS_TOKEN:
                case CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME: {
                    return this.getAccessTokenCredential(key);
                }
                case CredentialType.REFRESH_TOKEN: {
                    return this.getRefreshTokenCredential(key);
                }
                default:
                    return null;
            }
        };
        /**
         * Helper to convert serialized data to object
         * @param obj
         * @param json
         */
        CacheManager.toObject = function (obj, json) {
            for (var propertyName in json) {
                obj[propertyName] = json[propertyName];
            }
            return obj;
        };
        return CacheManager;
    }());
    var DefaultStorageClass = /** @class */ (function (_super) {
        __extends(DefaultStorageClass, _super);
        function DefaultStorageClass() {
            return _super !== null && _super.apply(this, arguments) || this;
        }
        DefaultStorageClass.prototype.setAccount = function () {
            var notImplErr = "Storage interface - setAccount() has not been implemented for the cacheStorage interface.";
            throw AuthError.createUnexpectedError(notImplErr);
        };
        DefaultStorageClass.prototype.getAccount = function () {
            var notImplErr = "Storage interface - getAccount() has not been implemented for the cacheStorage interface.";
            throw AuthError.createUnexpectedError(notImplErr);
        };
        DefaultStorageClass.prototype.setIdTokenCredential = function () {
            var notImplErr = "Storage interface - setIdTokenCredential() has not been implemented for the cacheStorage interface.";
            throw AuthError.createUnexpectedError(notImplErr);
        };
        DefaultStorageClass.prototype.getIdTokenCredential = function () {
            var notImplErr = "Storage interface - getIdTokenCredential() has not been implemented for the cacheStorage interface.";
            throw AuthError.createUnexpectedError(notImplErr);
        };
        DefaultStorageClass.prototype.setAccessTokenCredential = function () {
            var notImplErr = "Storage interface - setAccessTokenCredential() has not been implemented for the cacheStorage interface.";
            throw AuthError.createUnexpectedError(notImplErr);
        };
        DefaultStorageClass.prototype.getAccessTokenCredential = function () {
            var notImplErr = "Storage interface - getAccessTokenCredential() has not been implemented for the cacheStorage interface.";
            throw AuthError.createUnexpectedError(notImplErr);
        };
        DefaultStorageClass.prototype.setRefreshTokenCredential = function () {
            var notImplErr = "Storage interface - setRefreshTokenCredential() has not been implemented for the cacheStorage interface.";
            throw AuthError.createUnexpectedError(notImplErr);
        };
        DefaultStorageClass.prototype.getRefreshTokenCredential = function () {
            var notImplErr = "Storage interface - getRefreshTokenCredential() has not been implemented for the cacheStorage interface.";
            throw AuthError.createUnexpectedError(notImplErr);
        };
        DefaultStorageClass.prototype.setAppMetadata = function () {
            var notImplErr = "Storage interface - setAppMetadata() has not been implemented for the cacheStorage interface.";
            throw AuthError.createUnexpectedError(notImplErr);
        };
        DefaultStorageClass.prototype.getAppMetadata = function () {
            var notImplErr = "Storage interface - getAppMetadata() has not been implemented for the cacheStorage interface.";
            throw AuthError.createUnexpectedError(notImplErr);
        };
        DefaultStorageClass.prototype.setServerTelemetry = function () {
            var notImplErr = "Storage interface - setServerTelemetry() has not been implemented for the cacheStorage interface.";
            throw AuthError.createUnexpectedError(notImplErr);
        };
        DefaultStorageClass.prototype.getServerTelemetry = function () {
            var notImplErr = "Storage interface - getServerTelemetry() has not been implemented for the cacheStorage interface.";
            throw AuthError.createUnexpectedError(notImplErr);
        };
        DefaultStorageClass.prototype.setAuthorityMetadata = function () {
            var notImplErr = "Storage interface - setAuthorityMetadata() has not been implemented for the cacheStorage interface.";
            throw AuthError.createUnexpectedError(notImplErr);
        };
        DefaultStorageClass.prototype.getAuthorityMetadata = function () {
            var notImplErr = "Storage interface - getAuthorityMetadata() has not been implemented for the cacheStorage interface.";
            throw AuthError.createUnexpectedError(notImplErr);
        };
        DefaultStorageClass.prototype.getAuthorityMetadataKeys = function () {
            var notImplErr = "Storage interface - getAuthorityMetadataKeys() has not been implemented for the cacheStorage interface.";
            throw AuthError.createUnexpectedError(notImplErr);
        };
        DefaultStorageClass.prototype.setThrottlingCache = function () {
            var notImplErr = "Storage interface - setThrottlingCache() has not been implemented for the cacheStorage interface.";
            throw AuthError.createUnexpectedError(notImplErr);
        };
        DefaultStorageClass.prototype.getThrottlingCache = function () {
            var notImplErr = "Storage interface - getThrottlingCache() has not been implemented for the cacheStorage interface.";
            throw AuthError.createUnexpectedError(notImplErr);
        };
        DefaultStorageClass.prototype.removeItem = function () {
            var notImplErr = "Storage interface - removeItem() has not been implemented for the cacheStorage interface.";
            throw AuthError.createUnexpectedError(notImplErr);
        };
        DefaultStorageClass.prototype.containsKey = function () {
            var notImplErr = "Storage interface - containsKey() has not been implemented for the cacheStorage interface.";
            throw AuthError.createUnexpectedError(notImplErr);
        };
        DefaultStorageClass.prototype.getKeys = function () {
            var notImplErr = "Storage interface - getKeys() has not been implemented for the cacheStorage interface.";
            throw AuthError.createUnexpectedError(notImplErr);
        };
        DefaultStorageClass.prototype.clear = function () {
            return __awaiter(this, void 0, void 0, function () {
                var notImplErr;
                return __generator(this, function (_a) {
                    notImplErr = "Storage interface - clear() has not been implemented for the cacheStorage interface.";
                    throw AuthError.createUnexpectedError(notImplErr);
                });
            });
        };
        DefaultStorageClass.prototype.updateCredentialCacheKey = function () {
            var notImplErr = "Storage interface - updateCredentialCacheKey() has not been implemented for the cacheStorage interface.";
            throw AuthError.createUnexpectedError(notImplErr);
        };
        return DefaultStorageClass;
    }(CacheManager));

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    // Token renewal offset default in seconds
    var DEFAULT_TOKEN_RENEWAL_OFFSET_SEC = 300;
    var DEFAULT_SYSTEM_OPTIONS = {
        tokenRenewalOffsetSeconds: DEFAULT_TOKEN_RENEWAL_OFFSET_SEC,
        preventCorsPreflight: false,
        proxyUrl: Constants.EMPTY_STRING
    };
    var DEFAULT_LOGGER_IMPLEMENTATION = {
        loggerCallback: function () {
            // allow users to not set loggerCallback
        },
        piiLoggingEnabled: false,
        logLevel: exports.LogLevel.Info,
        correlationId: Constants.EMPTY_STRING
    };
    var DEFAULT_NETWORK_IMPLEMENTATION = {
        sendGetRequestAsync: function () {
            return __awaiter(this, void 0, void 0, function () {
                var notImplErr;
                return __generator(this, function (_a) {
                    notImplErr = "Network interface - sendGetRequestAsync() has not been implemented";
                    throw AuthError.createUnexpectedError(notImplErr);
                });
            });
        },
        sendPostRequestAsync: function () {
            return __awaiter(this, void 0, void 0, function () {
                var notImplErr;
                return __generator(this, function (_a) {
                    notImplErr = "Network interface - sendPostRequestAsync() has not been implemented";
                    throw AuthError.createUnexpectedError(notImplErr);
                });
            });
        }
    };
    var DEFAULT_LIBRARY_INFO = {
        sku: Constants.SKU,
        version: version$1,
        cpu: Constants.EMPTY_STRING,
        os: Constants.EMPTY_STRING
    };
    var DEFAULT_CLIENT_CREDENTIALS = {
        clientSecret: Constants.EMPTY_STRING,
        clientAssertion: undefined
    };
    var DEFAULT_AZURE_CLOUD_OPTIONS = {
        azureCloudInstance: exports.AzureCloudInstance.None,
        tenant: "" + Constants.DEFAULT_COMMON_TENANT
    };
    var DEFAULT_TELEMETRY_OPTIONS = {
        application: {
            appName: "",
            appVersion: ""
        }
    };
    /**
     * Function that sets the default options when not explicitly configured from app developer
     *
     * @param Configuration
     *
     * @returns Configuration
     */
    function buildClientConfiguration(_a) {
        var userAuthOptions = _a.authOptions, userSystemOptions = _a.systemOptions, userLoggerOption = _a.loggerOptions, storageImplementation = _a.storageInterface, networkImplementation = _a.networkInterface, cryptoImplementation = _a.cryptoInterface, clientCredentials = _a.clientCredentials, libraryInfo = _a.libraryInfo, telemetry = _a.telemetry, serverTelemetryManager = _a.serverTelemetryManager, persistencePlugin = _a.persistencePlugin, serializableCache = _a.serializableCache;
        var loggerOptions = __assign(__assign({}, DEFAULT_LOGGER_IMPLEMENTATION), userLoggerOption);
        return {
            authOptions: buildAuthOptions(userAuthOptions),
            systemOptions: __assign(__assign({}, DEFAULT_SYSTEM_OPTIONS), userSystemOptions),
            loggerOptions: loggerOptions,
            storageInterface: storageImplementation || new DefaultStorageClass(userAuthOptions.clientId, DEFAULT_CRYPTO_IMPLEMENTATION),
            networkInterface: networkImplementation || DEFAULT_NETWORK_IMPLEMENTATION,
            cryptoInterface: cryptoImplementation || DEFAULT_CRYPTO_IMPLEMENTATION,
            clientCredentials: clientCredentials || DEFAULT_CLIENT_CREDENTIALS,
            libraryInfo: __assign(__assign({}, DEFAULT_LIBRARY_INFO), libraryInfo),
            telemetry: __assign(__assign({}, DEFAULT_TELEMETRY_OPTIONS), telemetry),
            serverTelemetryManager: serverTelemetryManager || null,
            persistencePlugin: persistencePlugin || null,
            serializableCache: serializableCache || null,
        };
    }
    /**
     * Construct authoptions from the client and platform passed values
     * @param authOptions
     */
    function buildAuthOptions(authOptions) {
        return __assign({ clientCapabilities: [], azureCloudOptions: DEFAULT_AZURE_CLOUD_OPTIONS, skipAuthorityMetadataCache: false }, authOptions);
    }

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * Error thrown when there is an error with the server code, for example, unavailability.
     */
    var ServerError = /** @class */ (function (_super) {
        __extends(ServerError, _super);
        function ServerError(errorCode, errorMessage, subError) {
            var _this = _super.call(this, errorCode, errorMessage, subError) || this;
            _this.name = "ServerError";
            Object.setPrototypeOf(_this, ServerError.prototype);
            return _this;
        }
        return ServerError;
    }(AuthError));

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var ThrottlingUtils = /** @class */ (function () {
        function ThrottlingUtils() {
        }
        /**
         * Prepares a RequestThumbprint to be stored as a key.
         * @param thumbprint
         */
        ThrottlingUtils.generateThrottlingStorageKey = function (thumbprint) {
            return ThrottlingConstants.THROTTLING_PREFIX + "." + JSON.stringify(thumbprint);
        };
        /**
         * Performs necessary throttling checks before a network request.
         * @param cacheManager
         * @param thumbprint
         */
        ThrottlingUtils.preProcess = function (cacheManager, thumbprint) {
            var _a;
            var key = ThrottlingUtils.generateThrottlingStorageKey(thumbprint);
            var value = cacheManager.getThrottlingCache(key);
            if (value) {
                if (value.throttleTime < Date.now()) {
                    cacheManager.removeItem(key, CacheSchemaType.THROTTLING);
                    return;
                }
                throw new ServerError(((_a = value.errorCodes) === null || _a === void 0 ? void 0 : _a.join(" ")) || Constants.EMPTY_STRING, value.errorMessage, value.subError);
            }
        };
        /**
         * Performs necessary throttling checks after a network request.
         * @param cacheManager
         * @param thumbprint
         * @param response
         */
        ThrottlingUtils.postProcess = function (cacheManager, thumbprint, response) {
            if (ThrottlingUtils.checkResponseStatus(response) || ThrottlingUtils.checkResponseForRetryAfter(response)) {
                var thumbprintValue = {
                    throttleTime: ThrottlingUtils.calculateThrottleTime(parseInt(response.headers[HeaderNames.RETRY_AFTER])),
                    error: response.body.error,
                    errorCodes: response.body.error_codes,
                    errorMessage: response.body.error_description,
                    subError: response.body.suberror
                };
                cacheManager.setThrottlingCache(ThrottlingUtils.generateThrottlingStorageKey(thumbprint), thumbprintValue);
            }
        };
        /**
         * Checks a NetworkResponse object's status codes against 429 or 5xx
         * @param response
         */
        ThrottlingUtils.checkResponseStatus = function (response) {
            return response.status === 429 || response.status >= 500 && response.status < 600;
        };
        /**
         * Checks a NetworkResponse object's RetryAfter header
         * @param response
         */
        ThrottlingUtils.checkResponseForRetryAfter = function (response) {
            if (response.headers) {
                return response.headers.hasOwnProperty(HeaderNames.RETRY_AFTER) && (response.status < 200 || response.status >= 300);
            }
            return false;
        };
        /**
         * Calculates the Unix-time value for a throttle to expire given throttleTime in seconds.
         * @param throttleTime
         */
        ThrottlingUtils.calculateThrottleTime = function (throttleTime) {
            var time = throttleTime <= 0 ? 0 : throttleTime;
            var currentSeconds = Date.now() / 1000;
            return Math.floor(Math.min(currentSeconds + (time || ThrottlingConstants.DEFAULT_THROTTLE_TIME_SECONDS), currentSeconds + ThrottlingConstants.DEFAULT_MAX_THROTTLE_TIME_SECONDS) * 1000);
        };
        ThrottlingUtils.removeThrottle = function (cacheManager, clientId, request, homeAccountIdentifier) {
            var thumbprint = {
                clientId: clientId,
                authority: request.authority,
                scopes: request.scopes,
                homeAccountIdentifier: homeAccountIdentifier,
                claims: request.claims,
                authenticationScheme: request.authenticationScheme,
                resourceRequestMethod: request.resourceRequestMethod,
                resourceRequestUri: request.resourceRequestUri,
                shrClaims: request.shrClaims,
                sshKid: request.sshKid
            };
            var key = this.generateThrottlingStorageKey(thumbprint);
            return cacheManager.removeItem(key, CacheSchemaType.THROTTLING);
        };
        return ThrottlingUtils;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var NetworkManager = /** @class */ (function () {
        function NetworkManager(networkClient, cacheManager) {
            this.networkClient = networkClient;
            this.cacheManager = cacheManager;
        }
        /**
         * Wraps sendPostRequestAsync with necessary preflight and postflight logic
         * @param thumbprint
         * @param tokenEndpoint
         * @param options
         */
        NetworkManager.prototype.sendPostRequest = function (thumbprint, tokenEndpoint, options) {
            return __awaiter(this, void 0, void 0, function () {
                var response, e_1;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            ThrottlingUtils.preProcess(this.cacheManager, thumbprint);
                            _a.label = 1;
                        case 1:
                            _a.trys.push([1, 3, , 4]);
                            return [4 /*yield*/, this.networkClient.sendPostRequestAsync(tokenEndpoint, options)];
                        case 2:
                            response = _a.sent();
                            return [3 /*break*/, 4];
                        case 3:
                            e_1 = _a.sent();
                            if (e_1 instanceof AuthError) {
                                throw e_1;
                            }
                            else {
                                throw ClientAuthError.createNetworkError(tokenEndpoint, e_1);
                            }
                        case 4:
                            ThrottlingUtils.postProcess(this.cacheManager, thumbprint, response);
                            return [2 /*return*/, response];
                    }
                });
            });
        };
        return NetworkManager;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */
    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var CcsCredentialType;
    (function (CcsCredentialType) {
        CcsCredentialType["HOME_ACCOUNT_ID"] = "home_account_id";
        CcsCredentialType["UPN"] = "UPN";
    })(CcsCredentialType || (CcsCredentialType = {}));

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * Base application class which will construct requests to send to and handle responses from the Microsoft STS using the authorization code flow.
     */
    var BaseClient = /** @class */ (function () {
        function BaseClient(configuration, performanceClient) {
            // Set the configuration
            this.config = buildClientConfiguration(configuration);
            // Initialize the logger
            this.logger = new Logger(this.config.loggerOptions, name$1, version$1);
            // Initialize crypto
            this.cryptoUtils = this.config.cryptoInterface;
            // Initialize storage interface
            this.cacheManager = this.config.storageInterface;
            // Set the network interface
            this.networkClient = this.config.networkInterface;
            // Set the NetworkManager
            this.networkManager = new NetworkManager(this.networkClient, this.cacheManager);
            // Set TelemetryManager
            this.serverTelemetryManager = this.config.serverTelemetryManager;
            // set Authority
            this.authority = this.config.authOptions.authority;
            // set performance telemetry client
            this.performanceClient = performanceClient;
        }
        /**
         * Creates default headers for requests to token endpoint
         */
        BaseClient.prototype.createTokenRequestHeaders = function (ccsCred) {
            var headers = {};
            headers[HeaderNames.CONTENT_TYPE] = Constants.URL_FORM_CONTENT_TYPE;
            if (!this.config.systemOptions.preventCorsPreflight && ccsCred) {
                switch (ccsCred.type) {
                    case CcsCredentialType.HOME_ACCOUNT_ID:
                        try {
                            var clientInfo = buildClientInfoFromHomeAccountId(ccsCred.credential);
                            headers[HeaderNames.CCS_HEADER] = "Oid:" + clientInfo.uid + "@" + clientInfo.utid;
                        }
                        catch (e) {
                            this.logger.verbose("Could not parse home account ID for CCS Header: " + e);
                        }
                        break;
                    case CcsCredentialType.UPN:
                        headers[HeaderNames.CCS_HEADER] = "UPN: " + ccsCred.credential;
                        break;
                }
            }
            return headers;
        };
        /**
         * Http post to token endpoint
         * @param tokenEndpoint
         * @param queryString
         * @param headers
         * @param thumbprint
         */
        BaseClient.prototype.executePostToTokenEndpoint = function (tokenEndpoint, queryString, headers, thumbprint) {
            return __awaiter(this, void 0, void 0, function () {
                var response;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.networkManager.sendPostRequest(thumbprint, tokenEndpoint, { body: queryString, headers: headers, proxyUrl: this.config.systemOptions.proxyUrl })];
                        case 1:
                            response = _a.sent();
                            if (this.config.serverTelemetryManager && response.status < 500 && response.status !== 429) {
                                // Telemetry data successfully logged by server, clear Telemetry cache
                                this.config.serverTelemetryManager.clearTelemetryCache();
                            }
                            return [2 /*return*/, response];
                    }
                });
            });
        };
        /**
         * Updates the authority object of the client. Endpoint discovery must be completed.
         * @param updatedAuthority
         */
        BaseClient.prototype.updateAuthority = function (updatedAuthority) {
            if (!updatedAuthority.discoveryComplete()) {
                throw ClientAuthError.createEndpointDiscoveryIncompleteError("Updated authority has not completed endpoint discovery.");
            }
            this.authority = updatedAuthority;
        };
        return BaseClient;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * Validates server consumable params from the "request" objects
     */
    var RequestValidator = /** @class */ (function () {
        function RequestValidator() {
        }
        /**
         * Utility to check if the `redirectUri` in the request is a non-null value
         * @param redirectUri
         */
        RequestValidator.validateRedirectUri = function (redirectUri) {
            if (StringUtils.isEmpty(redirectUri)) {
                throw ClientConfigurationError.createRedirectUriEmptyError();
            }
        };
        /**
         * Utility to validate prompt sent by the user in the request
         * @param prompt
         */
        RequestValidator.validatePrompt = function (prompt) {
            var promptValues = [];
            for (var value in PromptValue) {
                promptValues.push(PromptValue[value]);
            }
            if (promptValues.indexOf(prompt) < 0) {
                throw ClientConfigurationError.createInvalidPromptError(prompt);
            }
        };
        RequestValidator.validateClaims = function (claims) {
            try {
                JSON.parse(claims);
            }
            catch (e) {
                throw ClientConfigurationError.createInvalidClaimsRequestError();
            }
        };
        /**
         * Utility to validate code_challenge and code_challenge_method
         * @param codeChallenge
         * @param codeChallengeMethod
         */
        RequestValidator.validateCodeChallengeParams = function (codeChallenge, codeChallengeMethod) {
            if (StringUtils.isEmpty(codeChallenge) || StringUtils.isEmpty(codeChallengeMethod)) {
                throw ClientConfigurationError.createInvalidCodeChallengeParamsError();
            }
            else {
                this.validateCodeChallengeMethod(codeChallengeMethod);
            }
        };
        /**
         * Utility to validate code_challenge_method
         * @param codeChallengeMethod
         */
        RequestValidator.validateCodeChallengeMethod = function (codeChallengeMethod) {
            if ([
                CodeChallengeMethodValues.PLAIN,
                CodeChallengeMethodValues.S256
            ].indexOf(codeChallengeMethod) < 0) {
                throw ClientConfigurationError.createInvalidCodeChallengeMethodError();
            }
        };
        /**
         * Removes unnecessary or duplicate query parameters from extraQueryParameters
         * @param request
         */
        RequestValidator.sanitizeEQParams = function (eQParams, queryParams) {
            if (!eQParams) {
                return {};
            }
            // Remove any query parameters already included in SSO params
            queryParams.forEach(function (value, key) {
                if (eQParams[key]) {
                    delete eQParams[key];
                }
            });
            return eQParams;
        };
        return RequestValidator;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var RequestParameterBuilder = /** @class */ (function () {
        function RequestParameterBuilder() {
            this.parameters = new Map();
        }
        /**
         * add response_type = code
         */
        RequestParameterBuilder.prototype.addResponseTypeCode = function () {
            this.parameters.set(AADServerParamKeys.RESPONSE_TYPE, encodeURIComponent(Constants.CODE_RESPONSE_TYPE));
        };
        /**
         * add response_type = token id_token
         */
        RequestParameterBuilder.prototype.addResponseTypeForTokenAndIdToken = function () {
            this.parameters.set(AADServerParamKeys.RESPONSE_TYPE, encodeURIComponent(Constants.TOKEN_RESPONSE_TYPE + " " + Constants.ID_TOKEN_RESPONSE_TYPE));
        };
        /**
         * add response_mode. defaults to query.
         * @param responseMode
         */
        RequestParameterBuilder.prototype.addResponseMode = function (responseMode) {
            this.parameters.set(AADServerParamKeys.RESPONSE_MODE, encodeURIComponent((responseMode) ? responseMode : ResponseMode.QUERY));
        };
        /**
         * Add flag to indicate STS should attempt to use WAM if available
         */
        RequestParameterBuilder.prototype.addNativeBroker = function () {
            this.parameters.set(AADServerParamKeys.NATIVE_BROKER, encodeURIComponent("1"));
        };
        /**
         * add scopes. set addOidcScopes to false to prevent default scopes in non-user scenarios
         * @param scopeSet
         * @param addOidcScopes
         */
        RequestParameterBuilder.prototype.addScopes = function (scopes, addOidcScopes) {
            if (addOidcScopes === void 0) { addOidcScopes = true; }
            var requestScopes = addOidcScopes ? __spreadArrays(scopes || [], OIDC_DEFAULT_SCOPES) : scopes || [];
            var scopeSet = new ScopeSet(requestScopes);
            this.parameters.set(AADServerParamKeys.SCOPE, encodeURIComponent(scopeSet.printScopes()));
        };
        /**
         * add clientId
         * @param clientId
         */
        RequestParameterBuilder.prototype.addClientId = function (clientId) {
            this.parameters.set(AADServerParamKeys.CLIENT_ID, encodeURIComponent(clientId));
        };
        /**
         * add redirect_uri
         * @param redirectUri
         */
        RequestParameterBuilder.prototype.addRedirectUri = function (redirectUri) {
            RequestValidator.validateRedirectUri(redirectUri);
            this.parameters.set(AADServerParamKeys.REDIRECT_URI, encodeURIComponent(redirectUri));
        };
        /**
         * add post logout redirectUri
         * @param redirectUri
         */
        RequestParameterBuilder.prototype.addPostLogoutRedirectUri = function (redirectUri) {
            RequestValidator.validateRedirectUri(redirectUri);
            this.parameters.set(AADServerParamKeys.POST_LOGOUT_URI, encodeURIComponent(redirectUri));
        };
        /**
         * add id_token_hint to logout request
         * @param idTokenHint
         */
        RequestParameterBuilder.prototype.addIdTokenHint = function (idTokenHint) {
            this.parameters.set(AADServerParamKeys.ID_TOKEN_HINT, encodeURIComponent(idTokenHint));
        };
        /**
         * add domain_hint
         * @param domainHint
         */
        RequestParameterBuilder.prototype.addDomainHint = function (domainHint) {
            this.parameters.set(SSOTypes.DOMAIN_HINT, encodeURIComponent(domainHint));
        };
        /**
         * add login_hint
         * @param loginHint
         */
        RequestParameterBuilder.prototype.addLoginHint = function (loginHint) {
            this.parameters.set(SSOTypes.LOGIN_HINT, encodeURIComponent(loginHint));
        };
        /**
         * Adds the CCS (Cache Credential Service) query parameter for login_hint
         * @param loginHint
         */
        RequestParameterBuilder.prototype.addCcsUpn = function (loginHint) {
            this.parameters.set(HeaderNames.CCS_HEADER, encodeURIComponent("UPN:" + loginHint));
        };
        /**
         * Adds the CCS (Cache Credential Service) query parameter for account object
         * @param loginHint
         */
        RequestParameterBuilder.prototype.addCcsOid = function (clientInfo) {
            this.parameters.set(HeaderNames.CCS_HEADER, encodeURIComponent("Oid:" + clientInfo.uid + "@" + clientInfo.utid));
        };
        /**
         * add sid
         * @param sid
         */
        RequestParameterBuilder.prototype.addSid = function (sid) {
            this.parameters.set(SSOTypes.SID, encodeURIComponent(sid));
        };
        /**
         * add claims
         * @param claims
         */
        RequestParameterBuilder.prototype.addClaims = function (claims, clientCapabilities) {
            var mergedClaims = this.addClientCapabilitiesToClaims(claims, clientCapabilities);
            RequestValidator.validateClaims(mergedClaims);
            this.parameters.set(AADServerParamKeys.CLAIMS, encodeURIComponent(mergedClaims));
        };
        /**
         * add correlationId
         * @param correlationId
         */
        RequestParameterBuilder.prototype.addCorrelationId = function (correlationId) {
            this.parameters.set(AADServerParamKeys.CLIENT_REQUEST_ID, encodeURIComponent(correlationId));
        };
        /**
         * add library info query params
         * @param libraryInfo
         */
        RequestParameterBuilder.prototype.addLibraryInfo = function (libraryInfo) {
            // Telemetry Info
            this.parameters.set(AADServerParamKeys.X_CLIENT_SKU, libraryInfo.sku);
            this.parameters.set(AADServerParamKeys.X_CLIENT_VER, libraryInfo.version);
            if (libraryInfo.os) {
                this.parameters.set(AADServerParamKeys.X_CLIENT_OS, libraryInfo.os);
            }
            if (libraryInfo.cpu) {
                this.parameters.set(AADServerParamKeys.X_CLIENT_CPU, libraryInfo.cpu);
            }
        };
        /**
         * Add client telemetry parameters
         * @param appTelemetry
         */
        RequestParameterBuilder.prototype.addApplicationTelemetry = function (appTelemetry) {
            if (appTelemetry === null || appTelemetry === void 0 ? void 0 : appTelemetry.appName) {
                this.parameters.set(AADServerParamKeys.X_APP_NAME, appTelemetry.appName);
            }
            if (appTelemetry === null || appTelemetry === void 0 ? void 0 : appTelemetry.appVersion) {
                this.parameters.set(AADServerParamKeys.X_APP_VER, appTelemetry.appVersion);
            }
        };
        /**
         * add prompt
         * @param prompt
         */
        RequestParameterBuilder.prototype.addPrompt = function (prompt) {
            RequestValidator.validatePrompt(prompt);
            this.parameters.set("" + AADServerParamKeys.PROMPT, encodeURIComponent(prompt));
        };
        /**
         * add state
         * @param state
         */
        RequestParameterBuilder.prototype.addState = function (state) {
            if (!StringUtils.isEmpty(state)) {
                this.parameters.set(AADServerParamKeys.STATE, encodeURIComponent(state));
            }
        };
        /**
         * add nonce
         * @param nonce
         */
        RequestParameterBuilder.prototype.addNonce = function (nonce) {
            this.parameters.set(AADServerParamKeys.NONCE, encodeURIComponent(nonce));
        };
        /**
         * add code_challenge and code_challenge_method
         * - throw if either of them are not passed
         * @param codeChallenge
         * @param codeChallengeMethod
         */
        RequestParameterBuilder.prototype.addCodeChallengeParams = function (codeChallenge, codeChallengeMethod) {
            RequestValidator.validateCodeChallengeParams(codeChallenge, codeChallengeMethod);
            if (codeChallenge && codeChallengeMethod) {
                this.parameters.set(AADServerParamKeys.CODE_CHALLENGE, encodeURIComponent(codeChallenge));
                this.parameters.set(AADServerParamKeys.CODE_CHALLENGE_METHOD, encodeURIComponent(codeChallengeMethod));
            }
            else {
                throw ClientConfigurationError.createInvalidCodeChallengeParamsError();
            }
        };
        /**
         * add the `authorization_code` passed by the user to exchange for a token
         * @param code
         */
        RequestParameterBuilder.prototype.addAuthorizationCode = function (code) {
            this.parameters.set(AADServerParamKeys.CODE, encodeURIComponent(code));
        };
        /**
         * add the `authorization_code` passed by the user to exchange for a token
         * @param code
         */
        RequestParameterBuilder.prototype.addDeviceCode = function (code) {
            this.parameters.set(AADServerParamKeys.DEVICE_CODE, encodeURIComponent(code));
        };
        /**
         * add the `refreshToken` passed by the user
         * @param refreshToken
         */
        RequestParameterBuilder.prototype.addRefreshToken = function (refreshToken) {
            this.parameters.set(AADServerParamKeys.REFRESH_TOKEN, encodeURIComponent(refreshToken));
        };
        /**
         * add the `code_verifier` passed by the user to exchange for a token
         * @param codeVerifier
         */
        RequestParameterBuilder.prototype.addCodeVerifier = function (codeVerifier) {
            this.parameters.set(AADServerParamKeys.CODE_VERIFIER, encodeURIComponent(codeVerifier));
        };
        /**
         * add client_secret
         * @param clientSecret
         */
        RequestParameterBuilder.prototype.addClientSecret = function (clientSecret) {
            this.parameters.set(AADServerParamKeys.CLIENT_SECRET, encodeURIComponent(clientSecret));
        };
        /**
         * add clientAssertion for confidential client flows
         * @param clientAssertion
         */
        RequestParameterBuilder.prototype.addClientAssertion = function (clientAssertion) {
            if (!StringUtils.isEmpty(clientAssertion)) {
                this.parameters.set(AADServerParamKeys.CLIENT_ASSERTION, encodeURIComponent(clientAssertion));
            }
        };
        /**
         * add clientAssertionType for confidential client flows
         * @param clientAssertionType
         */
        RequestParameterBuilder.prototype.addClientAssertionType = function (clientAssertionType) {
            if (!StringUtils.isEmpty(clientAssertionType)) {
                this.parameters.set(AADServerParamKeys.CLIENT_ASSERTION_TYPE, encodeURIComponent(clientAssertionType));
            }
        };
        /**
         * add OBO assertion for confidential client flows
         * @param clientAssertion
         */
        RequestParameterBuilder.prototype.addOboAssertion = function (oboAssertion) {
            this.parameters.set(AADServerParamKeys.OBO_ASSERTION, encodeURIComponent(oboAssertion));
        };
        /**
         * add grant type
         * @param grantType
         */
        RequestParameterBuilder.prototype.addRequestTokenUse = function (tokenUse) {
            this.parameters.set(AADServerParamKeys.REQUESTED_TOKEN_USE, encodeURIComponent(tokenUse));
        };
        /**
         * add grant type
         * @param grantType
         */
        RequestParameterBuilder.prototype.addGrantType = function (grantType) {
            this.parameters.set(AADServerParamKeys.GRANT_TYPE, encodeURIComponent(grantType));
        };
        /**
         * add client info
         *
         */
        RequestParameterBuilder.prototype.addClientInfo = function () {
            this.parameters.set(CLIENT_INFO, "1");
        };
        /**
         * add extraQueryParams
         * @param eQparams
         */
        RequestParameterBuilder.prototype.addExtraQueryParameters = function (eQparams) {
            var _this = this;
            RequestValidator.sanitizeEQParams(eQparams, this.parameters);
            Object.keys(eQparams).forEach(function (key) {
                _this.parameters.set(key, eQparams[key]);
            });
        };
        RequestParameterBuilder.prototype.addClientCapabilitiesToClaims = function (claims, clientCapabilities) {
            var mergedClaims;
            // Parse provided claims into JSON object or initialize empty object
            if (!claims) {
                mergedClaims = {};
            }
            else {
                try {
                    mergedClaims = JSON.parse(claims);
                }
                catch (e) {
                    throw ClientConfigurationError.createInvalidClaimsRequestError();
                }
            }
            if (clientCapabilities && clientCapabilities.length > 0) {
                if (!mergedClaims.hasOwnProperty(ClaimsRequestKeys.ACCESS_TOKEN)) {
                    // Add access_token key to claims object
                    mergedClaims[ClaimsRequestKeys.ACCESS_TOKEN] = {};
                }
                // Add xms_cc claim with provided clientCapabilities to access_token key
                mergedClaims[ClaimsRequestKeys.ACCESS_TOKEN][ClaimsRequestKeys.XMS_CC] = {
                    values: clientCapabilities
                };
            }
            return JSON.stringify(mergedClaims);
        };
        /**
         * adds `username` for Password Grant flow
         * @param username
         */
        RequestParameterBuilder.prototype.addUsername = function (username) {
            this.parameters.set(PasswordGrantConstants.username, encodeURIComponent(username));
        };
        /**
         * adds `password` for Password Grant flow
         * @param password
         */
        RequestParameterBuilder.prototype.addPassword = function (password) {
            this.parameters.set(PasswordGrantConstants.password, encodeURIComponent(password));
        };
        /**
         * add pop_jwk to query params
         * @param cnfString
         */
        RequestParameterBuilder.prototype.addPopToken = function (cnfString) {
            if (!StringUtils.isEmpty(cnfString)) {
                this.parameters.set(AADServerParamKeys.TOKEN_TYPE, exports.AuthenticationScheme.POP);
                this.parameters.set(AADServerParamKeys.REQ_CNF, encodeURIComponent(cnfString));
            }
        };
        /**
         * add SSH JWK and key ID to query params
         */
        RequestParameterBuilder.prototype.addSshJwk = function (sshJwkString) {
            if (!StringUtils.isEmpty(sshJwkString)) {
                this.parameters.set(AADServerParamKeys.TOKEN_TYPE, exports.AuthenticationScheme.SSH);
                this.parameters.set(AADServerParamKeys.REQ_CNF, encodeURIComponent(sshJwkString));
            }
        };
        /**
         * add server telemetry fields
         * @param serverTelemetryManager
         */
        RequestParameterBuilder.prototype.addServerTelemetry = function (serverTelemetryManager) {
            this.parameters.set(AADServerParamKeys.X_CLIENT_CURR_TELEM, serverTelemetryManager.generateCurrentRequestHeaderValue());
            this.parameters.set(AADServerParamKeys.X_CLIENT_LAST_TELEM, serverTelemetryManager.generateLastRequestHeaderValue());
        };
        /**
         * Adds parameter that indicates to the server that throttling is supported
         */
        RequestParameterBuilder.prototype.addThrottling = function () {
            this.parameters.set(AADServerParamKeys.X_MS_LIB_CAPABILITY, ThrottlingConstants.X_MS_LIB_CAPABILITY_VALUE);
        };
        /**
         * Adds logout_hint parameter for "silent" logout which prevent server account picker
         */
        RequestParameterBuilder.prototype.addLogoutHint = function (logoutHint) {
            this.parameters.set(AADServerParamKeys.LOGOUT_HINT, encodeURIComponent(logoutHint));
        };
        /**
         * Utility to create a URL from the params map
         */
        RequestParameterBuilder.prototype.createQueryString = function () {
            var queryParameterArray = new Array();
            this.parameters.forEach(function (value, key) {
                queryParameterArray.push(key + "=" + value);
            });
            return queryParameterArray.join("&");
        };
        return RequestParameterBuilder;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * ID_TOKEN Cache
     *
     * Key:Value Schema:
     *
     * Key Example: uid.utid-login.microsoftonline.com-idtoken-clientId-contoso.com-
     *
     * Value Schema:
     * {
     *      homeAccountId: home account identifier for the auth scheme,
     *      environment: entity that issued the token, represented as a full host
     *      credentialType: Type of credential as a string, can be one of the following: RefreshToken, AccessToken, IdToken, Password, Cookie, Certificate, Other
     *      clientId: client ID of the application
     *      secret: Actual credential as a string
     *      realm: Full tenant or organizational identifier that the account belongs to
     * }
     */
    var IdTokenEntity = /** @class */ (function (_super) {
        __extends(IdTokenEntity, _super);
        function IdTokenEntity() {
            return _super !== null && _super.apply(this, arguments) || this;
        }
        /**
         * Create IdTokenEntity
         * @param homeAccountId
         * @param authenticationResult
         * @param clientId
         * @param authority
         */
        IdTokenEntity.createIdTokenEntity = function (homeAccountId, environment, idToken, clientId, tenantId) {
            var idTokenEntity = new IdTokenEntity();
            idTokenEntity.credentialType = CredentialType.ID_TOKEN;
            idTokenEntity.homeAccountId = homeAccountId;
            idTokenEntity.environment = environment;
            idTokenEntity.clientId = clientId;
            idTokenEntity.secret = idToken;
            idTokenEntity.realm = tenantId;
            return idTokenEntity;
        };
        /**
         * Validates an entity: checks for all expected params
         * @param entity
         */
        IdTokenEntity.isIdTokenEntity = function (entity) {
            if (!entity) {
                return false;
            }
            return (entity.hasOwnProperty("homeAccountId") &&
                entity.hasOwnProperty("environment") &&
                entity.hasOwnProperty("credentialType") &&
                entity.hasOwnProperty("realm") &&
                entity.hasOwnProperty("clientId") &&
                entity.hasOwnProperty("secret") &&
                entity["credentialType"] === CredentialType.ID_TOKEN);
        };
        return IdTokenEntity;
    }(CredentialEntity));

    /*! @azure/msal-common v7.3.0 2022-08-01 */
    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * Utility class which exposes functions for managing date and time operations.
     */
    var TimeUtils = /** @class */ (function () {
        function TimeUtils() {
        }
        /**
         * return the current time in Unix time (seconds).
         */
        TimeUtils.nowSeconds = function () {
            // Date.getTime() returns in milliseconds.
            return Math.round(new Date().getTime() / 1000.0);
        };
        /**
         * check if a token is expired based on given UTC time in seconds.
         * @param expiresOn
         */
        TimeUtils.isTokenExpired = function (expiresOn, offset) {
            // check for access token expiry
            var expirationSec = Number(expiresOn) || 0;
            var offsetCurrentTimeSec = TimeUtils.nowSeconds() + offset;
            // If current time + offset is greater than token expiration time, then token is expired.
            return (offsetCurrentTimeSec > expirationSec);
        };
        /**
         * If the current time is earlier than the time that a token was cached at, we must discard the token
         * i.e. The system clock was turned back after acquiring the cached token
         * @param cachedAt
         * @param offset
         */
        TimeUtils.wasClockTurnedBack = function (cachedAt) {
            var cachedAtSec = Number(cachedAt);
            return cachedAtSec > TimeUtils.nowSeconds();
        };
        /**
         * Waits for t number of milliseconds
         * @param t number
         * @param value T
         */
        TimeUtils.delay = function (t, value) {
            return new Promise(function (resolve) { return setTimeout(function () { return resolve(value); }, t); });
        };
        return TimeUtils;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * ACCESS_TOKEN Credential Type
     *
     * Key:Value Schema:
     *
     * Key Example: uid.utid-login.microsoftonline.com-accesstoken-clientId-contoso.com-user.read
     *
     * Value Schema:
     * {
     *      homeAccountId: home account identifier for the auth scheme,
     *      environment: entity that issued the token, represented as a full host
     *      credentialType: Type of credential as a string, can be one of the following: RefreshToken, AccessToken, IdToken, Password, Cookie, Certificate, Other
     *      clientId: client ID of the application
     *      secret: Actual credential as a string
     *      familyId: Family ID identifier, usually only used for refresh tokens
     *      realm: Full tenant or organizational identifier that the account belongs to
     *      target: Permissions that are included in the token, or for refresh tokens, the resource identifier.
     *      cachedAt: Absolute device time when entry was created in the cache.
     *      expiresOn: Token expiry time, calculated based on current UTC time in seconds. Represented as a string.
     *      extendedExpiresOn: Additional extended expiry time until when token is valid in case of server-side outage. Represented as string in UTC seconds.
     *      keyId: used for POP and SSH tokenTypes
     *      tokenType: Type of the token issued. Usually "Bearer"
     * }
     */
    var AccessTokenEntity = /** @class */ (function (_super) {
        __extends(AccessTokenEntity, _super);
        function AccessTokenEntity() {
            return _super !== null && _super.apply(this, arguments) || this;
        }
        /**
         * Create AccessTokenEntity
         * @param homeAccountId
         * @param environment
         * @param accessToken
         * @param clientId
         * @param tenantId
         * @param scopes
         * @param expiresOn
         * @param extExpiresOn
         */
        AccessTokenEntity.createAccessTokenEntity = function (homeAccountId, environment, accessToken, clientId, tenantId, scopes, expiresOn, extExpiresOn, cryptoUtils, refreshOn, tokenType, userAssertionHash, keyId, requestedClaims, requestedClaimsHash) {
            var _a, _b;
            var atEntity = new AccessTokenEntity();
            atEntity.homeAccountId = homeAccountId;
            atEntity.credentialType = CredentialType.ACCESS_TOKEN;
            atEntity.secret = accessToken;
            var currentTime = TimeUtils.nowSeconds();
            atEntity.cachedAt = currentTime.toString();
            /*
             * Token expiry time.
             * This value should be  calculated based on the current UTC time measured locally and the value  expires_in Represented as a string in JSON.
             */
            atEntity.expiresOn = expiresOn.toString();
            atEntity.extendedExpiresOn = extExpiresOn.toString();
            if (refreshOn) {
                atEntity.refreshOn = refreshOn.toString();
            }
            atEntity.environment = environment;
            atEntity.clientId = clientId;
            atEntity.realm = tenantId;
            atEntity.target = scopes;
            atEntity.userAssertionHash = userAssertionHash;
            atEntity.tokenType = StringUtils.isEmpty(tokenType) ? exports.AuthenticationScheme.BEARER : tokenType;
            if (requestedClaims) {
                atEntity.requestedClaims = requestedClaims;
                atEntity.requestedClaimsHash = requestedClaimsHash;
            }
            /*
             * Create Access Token With Auth Scheme instead of regular access token
             * Cast to lower to handle "bearer" from ADFS
             */
            if (((_a = atEntity.tokenType) === null || _a === void 0 ? void 0 : _a.toLowerCase()) !== exports.AuthenticationScheme.BEARER.toLowerCase()) {
                atEntity.credentialType = CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME;
                switch (atEntity.tokenType) {
                    case exports.AuthenticationScheme.POP:
                        // Make sure keyId is present and add it to credential
                        var tokenClaims = AuthToken.extractTokenClaims(accessToken, cryptoUtils);
                        if (!((_b = tokenClaims === null || tokenClaims === void 0 ? void 0 : tokenClaims.cnf) === null || _b === void 0 ? void 0 : _b.kid)) {
                            throw ClientAuthError.createTokenClaimsRequiredError();
                        }
                        atEntity.keyId = tokenClaims.cnf.kid;
                        break;
                    case exports.AuthenticationScheme.SSH:
                        atEntity.keyId = keyId;
                }
            }
            return atEntity;
        };
        /**
         * Validates an entity: checks for all expected params
         * @param entity
         */
        AccessTokenEntity.isAccessTokenEntity = function (entity) {
            if (!entity) {
                return false;
            }
            return (entity.hasOwnProperty("homeAccountId") &&
                entity.hasOwnProperty("environment") &&
                entity.hasOwnProperty("credentialType") &&
                entity.hasOwnProperty("realm") &&
                entity.hasOwnProperty("clientId") &&
                entity.hasOwnProperty("secret") &&
                entity.hasOwnProperty("target") &&
                (entity["credentialType"] === CredentialType.ACCESS_TOKEN || entity["credentialType"] === CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME));
        };
        return AccessTokenEntity;
    }(CredentialEntity));

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * REFRESH_TOKEN Cache
     *
     * Key:Value Schema:
     *
     * Key Example: uid.utid-login.microsoftonline.com-refreshtoken-clientId--
     *
     * Value:
     * {
     *      homeAccountId: home account identifier for the auth scheme,
     *      environment: entity that issued the token, represented as a full host
     *      credentialType: Type of credential as a string, can be one of the following: RefreshToken, AccessToken, IdToken, Password, Cookie, Certificate, Other
     *      clientId: client ID of the application
     *      secret: Actual credential as a string
     *      familyId: Family ID identifier, '1' represents Microsoft Family
     *      realm: Full tenant or organizational identifier that the account belongs to
     *      target: Permissions that are included in the token, or for refresh tokens, the resource identifier.
     * }
     */
    var RefreshTokenEntity = /** @class */ (function (_super) {
        __extends(RefreshTokenEntity, _super);
        function RefreshTokenEntity() {
            return _super !== null && _super.apply(this, arguments) || this;
        }
        /**
         * Create RefreshTokenEntity
         * @param homeAccountId
         * @param authenticationResult
         * @param clientId
         * @param authority
         */
        RefreshTokenEntity.createRefreshTokenEntity = function (homeAccountId, environment, refreshToken, clientId, familyId, userAssertionHash) {
            var rtEntity = new RefreshTokenEntity();
            rtEntity.clientId = clientId;
            rtEntity.credentialType = CredentialType.REFRESH_TOKEN;
            rtEntity.environment = environment;
            rtEntity.homeAccountId = homeAccountId;
            rtEntity.secret = refreshToken;
            rtEntity.userAssertionHash = userAssertionHash;
            if (familyId)
                rtEntity.familyId = familyId;
            return rtEntity;
        };
        /**
         * Validates an entity: checks for all expected params
         * @param entity
         */
        RefreshTokenEntity.isRefreshTokenEntity = function (entity) {
            if (!entity) {
                return false;
            }
            return (entity.hasOwnProperty("homeAccountId") &&
                entity.hasOwnProperty("environment") &&
                entity.hasOwnProperty("credentialType") &&
                entity.hasOwnProperty("clientId") &&
                entity.hasOwnProperty("secret") &&
                entity["credentialType"] === CredentialType.REFRESH_TOKEN);
        };
        return RefreshTokenEntity;
    }(CredentialEntity));

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * InteractionRequiredServerErrorMessage contains string constants used by error codes and messages returned by the server indicating interaction is required
     */
    var InteractionRequiredServerErrorMessage = [
        "interaction_required",
        "consent_required",
        "login_required"
    ];
    var InteractionRequiredAuthSubErrorMessage = [
        "message_only",
        "additional_action",
        "basic_action",
        "user_password_expired",
        "consent_required"
    ];
    /**
     * Interaction required errors defined by the SDK
     */
    var InteractionRequiredAuthErrorMessage = {
        noTokensFoundError: {
            code: "no_tokens_found",
            desc: "No refresh token found in the cache. Please sign-in."
        },
        native_account_unavailable: {
            code: "native_account_unavailable",
            desc: "The requested account is not available in the native broker. It may have been deleted or logged out. Please sign-in again using an interactive API."
        }
    };
    /**
     * Error thrown when user interaction is required.
     */
    var InteractionRequiredAuthError = /** @class */ (function (_super) {
        __extends(InteractionRequiredAuthError, _super);
        function InteractionRequiredAuthError(errorCode, errorMessage, subError) {
            var _this = _super.call(this, errorCode, errorMessage, subError) || this;
            _this.name = "InteractionRequiredAuthError";
            Object.setPrototypeOf(_this, InteractionRequiredAuthError.prototype);
            return _this;
        }
        /**
         * Helper function used to determine if an error thrown by the server requires interaction to resolve
         * @param errorCode
         * @param errorString
         * @param subError
         */
        InteractionRequiredAuthError.isInteractionRequiredError = function (errorCode, errorString, subError) {
            var isInteractionRequiredErrorCode = !!errorCode && InteractionRequiredServerErrorMessage.indexOf(errorCode) > -1;
            var isInteractionRequiredSubError = !!subError && InteractionRequiredAuthSubErrorMessage.indexOf(subError) > -1;
            var isInteractionRequiredErrorDesc = !!errorString && InteractionRequiredServerErrorMessage.some(function (irErrorCode) {
                return errorString.indexOf(irErrorCode) > -1;
            });
            return isInteractionRequiredErrorCode || isInteractionRequiredErrorDesc || isInteractionRequiredSubError;
        };
        /**
         * Creates an error thrown when the authorization code required for a token request is null or empty.
         */
        InteractionRequiredAuthError.createNoTokensFoundError = function () {
            return new InteractionRequiredAuthError(InteractionRequiredAuthErrorMessage.noTokensFoundError.code, InteractionRequiredAuthErrorMessage.noTokensFoundError.desc);
        };
        /**
         * Creates an error thrown when the native broker returns ACCOUNT_UNAVAILABLE status, indicating that the account was removed and interactive sign-in is required
         * @returns
         */
        InteractionRequiredAuthError.createNativeAccountUnavailableError = function () {
            return new InteractionRequiredAuthError(InteractionRequiredAuthErrorMessage.native_account_unavailable.code, InteractionRequiredAuthErrorMessage.native_account_unavailable.desc);
        };
        return InteractionRequiredAuthError;
    }(AuthError));

    /*! @azure/msal-common v7.3.0 2022-08-01 */
    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var CacheRecord = /** @class */ (function () {
        function CacheRecord(accountEntity, idTokenEntity, accessTokenEntity, refreshTokenEntity, appMetadataEntity) {
            this.account = accountEntity || null;
            this.idToken = idTokenEntity || null;
            this.accessToken = accessTokenEntity || null;
            this.refreshToken = refreshTokenEntity || null;
            this.appMetadata = appMetadataEntity || null;
        }
        return CacheRecord;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * Class which provides helpers for OAuth 2.0 protocol specific values
     */
    var ProtocolUtils = /** @class */ (function () {
        function ProtocolUtils() {
        }
        /**
         * Appends user state with random guid, or returns random guid.
         * @param userState
         * @param randomGuid
         */
        ProtocolUtils.setRequestState = function (cryptoObj, userState, meta) {
            var libraryState = ProtocolUtils.generateLibraryState(cryptoObj, meta);
            return !StringUtils.isEmpty(userState) ? "" + libraryState + Constants.RESOURCE_DELIM + userState : libraryState;
        };
        /**
         * Generates the state value used by the common library.
         * @param randomGuid
         * @param cryptoObj
         */
        ProtocolUtils.generateLibraryState = function (cryptoObj, meta) {
            if (!cryptoObj) {
                throw ClientAuthError.createNoCryptoObjectError("generateLibraryState");
            }
            // Create a state object containing a unique id and the timestamp of the request creation
            var stateObj = {
                id: cryptoObj.createNewGuid()
            };
            if (meta) {
                stateObj.meta = meta;
            }
            var stateString = JSON.stringify(stateObj);
            return cryptoObj.base64Encode(stateString);
        };
        /**
         * Parses the state into the RequestStateObject, which contains the LibraryState info and the state passed by the user.
         * @param state
         * @param cryptoObj
         */
        ProtocolUtils.parseRequestState = function (cryptoObj, state) {
            if (!cryptoObj) {
                throw ClientAuthError.createNoCryptoObjectError("parseRequestState");
            }
            if (StringUtils.isEmpty(state)) {
                throw ClientAuthError.createInvalidStateError(state, "Null, undefined or empty state");
            }
            try {
                // Split the state between library state and user passed state and decode them separately
                var splitState = state.split(Constants.RESOURCE_DELIM);
                var libraryState = splitState[0];
                var userState = splitState.length > 1 ? splitState.slice(1).join(Constants.RESOURCE_DELIM) : Constants.EMPTY_STRING;
                var libraryStateString = cryptoObj.base64Decode(libraryState);
                var libraryStateObj = JSON.parse(libraryStateString);
                return {
                    userRequestState: !StringUtils.isEmpty(userState) ? userState : Constants.EMPTY_STRING,
                    libraryState: libraryStateObj
                };
            }
            catch (e) {
                throw ClientAuthError.createInvalidStateError(state, e);
            }
        };
        return ProtocolUtils;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * Url object class which can perform various transformations on url strings.
     */
    var UrlString = /** @class */ (function () {
        function UrlString(url) {
            this._urlString = url;
            if (StringUtils.isEmpty(this._urlString)) {
                // Throws error if url is empty
                throw ClientConfigurationError.createUrlEmptyError();
            }
            if (StringUtils.isEmpty(this.getHash())) {
                this._urlString = UrlString.canonicalizeUri(url);
            }
        }
        Object.defineProperty(UrlString.prototype, "urlString", {
            get: function () {
                return this._urlString;
            },
            enumerable: false,
            configurable: true
        });
        /**
         * Ensure urls are lower case and end with a / character.
         * @param url
         */
        UrlString.canonicalizeUri = function (url) {
            if (url) {
                var lowerCaseUrl = url.toLowerCase();
                if (StringUtils.endsWith(lowerCaseUrl, "?")) {
                    lowerCaseUrl = lowerCaseUrl.slice(0, -1);
                }
                else if (StringUtils.endsWith(lowerCaseUrl, "?/")) {
                    lowerCaseUrl = lowerCaseUrl.slice(0, -2);
                }
                if (!StringUtils.endsWith(lowerCaseUrl, "/")) {
                    lowerCaseUrl += "/";
                }
                return lowerCaseUrl;
            }
            return url;
        };
        /**
         * Throws if urlString passed is not a valid authority URI string.
         */
        UrlString.prototype.validateAsUri = function () {
            // Attempts to parse url for uri components
            var components;
            try {
                components = this.getUrlComponents();
            }
            catch (e) {
                throw ClientConfigurationError.createUrlParseError(e);
            }
            // Throw error if URI or path segments are not parseable.
            if (!components.HostNameAndPort || !components.PathSegments) {
                throw ClientConfigurationError.createUrlParseError("Given url string: " + this.urlString);
            }
            // Throw error if uri is insecure.
            if (!components.Protocol || components.Protocol.toLowerCase() !== "https:") {
                throw ClientConfigurationError.createInsecureAuthorityUriError(this.urlString);
            }
        };
        /**
         * Given a url and a query string return the url with provided query string appended
         * @param url
         * @param queryString
         */
        UrlString.appendQueryString = function (url, queryString) {
            if (StringUtils.isEmpty(queryString)) {
                return url;
            }
            return url.indexOf("?") < 0 ? url + "?" + queryString : url + "&" + queryString;
        };
        /**
         * Returns a url with the hash removed
         * @param url
         */
        UrlString.removeHashFromUrl = function (url) {
            return UrlString.canonicalizeUri(url.split("#")[0]);
        };
        /**
         * Given a url like https://a:b/common/d?e=f#g, and a tenantId, returns https://a:b/tenantId/d
         * @param href The url
         * @param tenantId The tenant id to replace
         */
        UrlString.prototype.replaceTenantPath = function (tenantId) {
            var urlObject = this.getUrlComponents();
            var pathArray = urlObject.PathSegments;
            if (tenantId && (pathArray.length !== 0 && (pathArray[0] === AADAuthorityConstants.COMMON || pathArray[0] === AADAuthorityConstants.ORGANIZATIONS))) {
                pathArray[0] = tenantId;
            }
            return UrlString.constructAuthorityUriFromObject(urlObject);
        };
        /**
         * Returns the anchor part(#) of the URL
         */
        UrlString.prototype.getHash = function () {
            return UrlString.parseHash(this.urlString);
        };
        /**
         * Parses out the components from a url string.
         * @returns An object with the various components. Please cache this value insted of calling this multiple times on the same url.
         */
        UrlString.prototype.getUrlComponents = function () {
            // https://gist.github.com/curtisz/11139b2cfcaef4a261e0
            var regEx = RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?");
            // If url string does not match regEx, we throw an error
            var match = this.urlString.match(regEx);
            if (!match) {
                throw ClientConfigurationError.createUrlParseError("Given url string: " + this.urlString);
            }
            // Url component object
            var urlComponents = {
                Protocol: match[1],
                HostNameAndPort: match[4],
                AbsolutePath: match[5],
                QueryString: match[7]
            };
            var pathSegments = urlComponents.AbsolutePath.split("/");
            pathSegments = pathSegments.filter(function (val) { return val && val.length > 0; }); // remove empty elements
            urlComponents.PathSegments = pathSegments;
            if (!StringUtils.isEmpty(urlComponents.QueryString) && urlComponents.QueryString.endsWith("/")) {
                urlComponents.QueryString = urlComponents.QueryString.substring(0, urlComponents.QueryString.length - 1);
            }
            return urlComponents;
        };
        UrlString.getDomainFromUrl = function (url) {
            var regEx = RegExp("^([^:/?#]+://)?([^/?#]*)");
            var match = url.match(regEx);
            if (!match) {
                throw ClientConfigurationError.createUrlParseError("Given url string: " + url);
            }
            return match[2];
        };
        UrlString.getAbsoluteUrl = function (relativeUrl, baseUrl) {
            if (relativeUrl[0] === Constants.FORWARD_SLASH) {
                var url = new UrlString(baseUrl);
                var baseComponents = url.getUrlComponents();
                return baseComponents.Protocol + "//" + baseComponents.HostNameAndPort + relativeUrl;
            }
            return relativeUrl;
        };
        /**
         * Parses hash string from given string. Returns empty string if no hash symbol is found.
         * @param hashString
         */
        UrlString.parseHash = function (hashString) {
            var hashIndex1 = hashString.indexOf("#");
            var hashIndex2 = hashString.indexOf("#/");
            if (hashIndex2 > -1) {
                return hashString.substring(hashIndex2 + 2);
            }
            else if (hashIndex1 > -1) {
                return hashString.substring(hashIndex1 + 1);
            }
            return Constants.EMPTY_STRING;
        };
        UrlString.constructAuthorityUriFromObject = function (urlObject) {
            return new UrlString(urlObject.Protocol + "//" + urlObject.HostNameAndPort + "/" + urlObject.PathSegments.join("/"));
        };
        /**
         * Returns URL hash as server auth code response object.
         */
        UrlString.getDeserializedHash = function (hash) {
            // Check if given hash is empty
            if (StringUtils.isEmpty(hash)) {
                return {};
            }
            // Strip the # symbol if present
            var parsedHash = UrlString.parseHash(hash);
            // If # symbol was not present, above will return empty string, so give original hash value
            var deserializedHash = StringUtils.queryStringToObject(StringUtils.isEmpty(parsedHash) ? hash : parsedHash);
            // Check if deserialization didn't work
            if (!deserializedHash) {
                throw ClientAuthError.createHashNotDeserializedError(JSON.stringify(deserializedHash));
            }
            return deserializedHash;
        };
        /**
         * Check if the hash of the URL string contains known properties
         */
        UrlString.hashContainsKnownProperties = function (hash) {
            if (StringUtils.isEmpty(hash) || hash.indexOf("=") < 0) {
                // Hash doesn't contain key/value pairs
                return false;
            }
            var parameters = UrlString.getDeserializedHash(hash);
            return !!(parameters.code ||
                parameters.error_description ||
                parameters.error ||
                parameters.state);
        };
        return UrlString;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var KeyLocation;
    (function (KeyLocation) {
        KeyLocation["SW"] = "sw";
        KeyLocation["UHW"] = "uhw";
    })(KeyLocation || (KeyLocation = {}));
    var PopTokenGenerator = /** @class */ (function () {
        function PopTokenGenerator(cryptoUtils) {
            this.cryptoUtils = cryptoUtils;
        }
        /**
         * Generates the req_cnf validated at the RP in the POP protocol for SHR parameters
         * and returns an object containing the keyid, the full req_cnf string and the req_cnf string hash
         * @param request
         * @returns
         */
        PopTokenGenerator.prototype.generateCnf = function (request) {
            return __awaiter(this, void 0, void 0, function () {
                var reqCnf, reqCnfString, _a;
                return __generator(this, function (_b) {
                    switch (_b.label) {
                        case 0: return [4 /*yield*/, this.generateKid(request)];
                        case 1:
                            reqCnf = _b.sent();
                            reqCnfString = this.cryptoUtils.base64Encode(JSON.stringify(reqCnf));
                            _a = {
                                kid: reqCnf.kid,
                                reqCnfString: reqCnfString
                            };
                            return [4 /*yield*/, this.cryptoUtils.hashString(reqCnfString)];
                        case 2: return [2 /*return*/, (_a.reqCnfHash = _b.sent(),
                                _a)];
                    }
                });
            });
        };
        /**
         * Generates key_id for a SHR token request
         * @param request
         * @returns
         */
        PopTokenGenerator.prototype.generateKid = function (request) {
            return __awaiter(this, void 0, void 0, function () {
                var kidThumbprint;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.cryptoUtils.getPublicKeyThumbprint(request)];
                        case 1:
                            kidThumbprint = _a.sent();
                            return [2 /*return*/, {
                                    kid: kidThumbprint,
                                    xms_ksl: KeyLocation.SW
                                }];
                    }
                });
            });
        };
        /**
         * Signs the POP access_token with the local generated key-pair
         * @param accessToken
         * @param request
         * @returns
         */
        PopTokenGenerator.prototype.signPopToken = function (accessToken, keyId, request) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    return [2 /*return*/, this.signPayload(accessToken, keyId, request)];
                });
            });
        };
        /**
         * Utility function to generate the signed JWT for an access_token
         * @param payload
         * @param kid
         * @param request
         * @param claims
         * @returns
         */
        PopTokenGenerator.prototype.signPayload = function (payload, keyId, request, claims) {
            return __awaiter(this, void 0, void 0, function () {
                var resourceRequestMethod, resourceRequestUri, shrClaims, shrNonce, resourceUrlString, resourceUrlComponents;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            resourceRequestMethod = request.resourceRequestMethod, resourceRequestUri = request.resourceRequestUri, shrClaims = request.shrClaims, shrNonce = request.shrNonce;
                            resourceUrlString = (resourceRequestUri) ? new UrlString(resourceRequestUri) : undefined;
                            resourceUrlComponents = resourceUrlString === null || resourceUrlString === void 0 ? void 0 : resourceUrlString.getUrlComponents();
                            return [4 /*yield*/, this.cryptoUtils.signJwt(__assign({ at: payload, ts: TimeUtils.nowSeconds(), m: resourceRequestMethod === null || resourceRequestMethod === void 0 ? void 0 : resourceRequestMethod.toUpperCase(), u: resourceUrlComponents === null || resourceUrlComponents === void 0 ? void 0 : resourceUrlComponents.HostNameAndPort, nonce: shrNonce || this.cryptoUtils.createNewGuid(), p: resourceUrlComponents === null || resourceUrlComponents === void 0 ? void 0 : resourceUrlComponents.AbsolutePath, q: (resourceUrlComponents === null || resourceUrlComponents === void 0 ? void 0 : resourceUrlComponents.QueryString) ? [[], resourceUrlComponents.QueryString] : undefined, client_claims: shrClaims || undefined }, claims), keyId, request.correlationId)];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        return PopTokenGenerator;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * APP_METADATA Cache
     *
     * Key:Value Schema:
     *
     * Key: appmetadata-<environment>-<client_id>
     *
     * Value:
     * {
     *      clientId: client ID of the application
     *      environment: entity that issued the token, represented as a full host
     *      familyId: Family ID identifier, '1' represents Microsoft Family
     * }
     */
    var AppMetadataEntity = /** @class */ (function () {
        function AppMetadataEntity() {
        }
        /**
         * Generate AppMetadata Cache Key as per the schema: appmetadata-<environment>-<client_id>
         */
        AppMetadataEntity.prototype.generateAppMetadataKey = function () {
            return AppMetadataEntity.generateAppMetadataCacheKey(this.environment, this.clientId);
        };
        /**
         * Generate AppMetadata Cache Key
         */
        AppMetadataEntity.generateAppMetadataCacheKey = function (environment, clientId) {
            var appMetaDataKeyArray = [
                APP_METADATA,
                environment,
                clientId,
            ];
            return appMetaDataKeyArray.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();
        };
        /**
         * Creates AppMetadataEntity
         * @param clientId
         * @param environment
         * @param familyId
         */
        AppMetadataEntity.createAppMetadataEntity = function (clientId, environment, familyId) {
            var appMetadata = new AppMetadataEntity();
            appMetadata.clientId = clientId;
            appMetadata.environment = environment;
            if (familyId) {
                appMetadata.familyId = familyId;
            }
            return appMetadata;
        };
        /**
         * Validates an entity: checks for all expected params
         * @param entity
         */
        AppMetadataEntity.isAppMetadataEntity = function (key, entity) {
            if (!entity) {
                return false;
            }
            return (key.indexOf(APP_METADATA) === 0 &&
                entity.hasOwnProperty("clientId") &&
                entity.hasOwnProperty("environment"));
        };
        return AppMetadataEntity;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */
    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * This class instance helps track the memory changes facilitating
     * decisions to read from and write to the persistent cache
     */ var TokenCacheContext = /** @class */ (function () {
        function TokenCacheContext(tokenCache, hasChanged) {
            this.cache = tokenCache;
            this.hasChanged = hasChanged;
        }
        Object.defineProperty(TokenCacheContext.prototype, "cacheHasChanged", {
            /**
             * boolean which indicates the changes in cache
             */
            get: function () {
                return this.hasChanged;
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(TokenCacheContext.prototype, "tokenCache", {
            /**
             * function to retrieve the token cache
             */
            get: function () {
                return this.cache;
            },
            enumerable: false,
            configurable: true
        });
        return TokenCacheContext;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * Class that handles response parsing.
     */
    var ResponseHandler = /** @class */ (function () {
        function ResponseHandler(clientId, cacheStorage, cryptoObj, logger, serializableCache, persistencePlugin) {
            this.clientId = clientId;
            this.cacheStorage = cacheStorage;
            this.cryptoObj = cryptoObj;
            this.logger = logger;
            this.serializableCache = serializableCache;
            this.persistencePlugin = persistencePlugin;
        }
        /**
         * Function which validates server authorization code response.
         * @param serverResponseHash
         * @param cachedState
         * @param cryptoObj
         */
        ResponseHandler.prototype.validateServerAuthorizationCodeResponse = function (serverResponseHash, cachedState, cryptoObj) {
            if (!serverResponseHash.state || !cachedState) {
                throw !serverResponseHash.state ? ClientAuthError.createStateNotFoundError("Server State") : ClientAuthError.createStateNotFoundError("Cached State");
            }
            if (decodeURIComponent(serverResponseHash.state) !== decodeURIComponent(cachedState)) {
                throw ClientAuthError.createStateMismatchError();
            }
            // Check for error
            if (serverResponseHash.error || serverResponseHash.error_description || serverResponseHash.suberror) {
                if (InteractionRequiredAuthError.isInteractionRequiredError(serverResponseHash.error, serverResponseHash.error_description, serverResponseHash.suberror)) {
                    throw new InteractionRequiredAuthError(serverResponseHash.error || Constants.EMPTY_STRING, serverResponseHash.error_description, serverResponseHash.suberror);
                }
                throw new ServerError(serverResponseHash.error || Constants.EMPTY_STRING, serverResponseHash.error_description, serverResponseHash.suberror);
            }
            if (serverResponseHash.client_info) {
                buildClientInfo(serverResponseHash.client_info, cryptoObj);
            }
        };
        /**
         * Function which validates server authorization token response.
         * @param serverResponse
         */
        ResponseHandler.prototype.validateTokenResponse = function (serverResponse) {
            // Check for error
            if (serverResponse.error || serverResponse.error_description || serverResponse.suberror) {
                if (InteractionRequiredAuthError.isInteractionRequiredError(serverResponse.error, serverResponse.error_description, serverResponse.suberror)) {
                    throw new InteractionRequiredAuthError(serverResponse.error, serverResponse.error_description, serverResponse.suberror);
                }
                var errString = serverResponse.error_codes + " - [" + serverResponse.timestamp + "]: " + serverResponse.error_description + " - Correlation ID: " + serverResponse.correlation_id + " - Trace ID: " + serverResponse.trace_id;
                throw new ServerError(serverResponse.error, errString, serverResponse.suberror);
            }
        };
        /**
         * Returns a constructed token response based on given string. Also manages the cache updates and cleanups.
         * @param serverTokenResponse
         * @param authority
         */
        ResponseHandler.prototype.handleServerTokenResponse = function (serverTokenResponse, authority, reqTimestamp, request, authCodePayload, userAssertionHash, handlingRefreshTokenResponse, forceCacheRefreshTokenResponse) {
            return __awaiter(this, void 0, void 0, function () {
                var idTokenObj, requestStateObj, cacheRecord, cacheContext, key, account;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            if (serverTokenResponse.id_token) {
                                idTokenObj = new AuthToken(serverTokenResponse.id_token || Constants.EMPTY_STRING, this.cryptoObj);
                                // token nonce check (TODO: Add a warning if no nonce is given?)
                                if (authCodePayload && !StringUtils.isEmpty(authCodePayload.nonce)) {
                                    if (idTokenObj.claims.nonce !== authCodePayload.nonce) {
                                        throw ClientAuthError.createNonceMismatchError();
                                    }
                                }
                            }
                            // generate homeAccountId
                            this.homeAccountIdentifier = AccountEntity.generateHomeAccountId(serverTokenResponse.client_info || Constants.EMPTY_STRING, authority.authorityType, this.logger, this.cryptoObj, idTokenObj);
                            if (!!authCodePayload && !!authCodePayload.state) {
                                requestStateObj = ProtocolUtils.parseRequestState(this.cryptoObj, authCodePayload.state);
                            }
                            // Add keyId from request to serverTokenResponse if defined
                            serverTokenResponse.key_id = serverTokenResponse.key_id || request.sshKid || undefined;
                            cacheRecord = this.generateCacheRecord(serverTokenResponse, authority, reqTimestamp, request, idTokenObj, userAssertionHash, authCodePayload);
                            _a.label = 1;
                        case 1:
                            _a.trys.push([1, , 5, 8]);
                            if (!(this.persistencePlugin && this.serializableCache)) return [3 /*break*/, 3];
                            this.logger.verbose("Persistence enabled, calling beforeCacheAccess");
                            cacheContext = new TokenCacheContext(this.serializableCache, true);
                            return [4 /*yield*/, this.persistencePlugin.beforeCacheAccess(cacheContext)];
                        case 2:
                            _a.sent();
                            _a.label = 3;
                        case 3:
                            /*
                             * When saving a refreshed tokens to the cache, it is expected that the account that was used is present in the cache.
                             * If not present, we should return null, as it's the case that another application called removeAccount in between
                             * the calls to getAllAccounts and acquireTokenSilent. We should not overwrite that removal, unless explicitly flagged by
                             * the developer, as in the case of refresh token flow used in ADAL Node to MSAL Node migration.
                             */
                            if (handlingRefreshTokenResponse && !forceCacheRefreshTokenResponse && cacheRecord.account) {
                                key = cacheRecord.account.generateAccountKey();
                                account = this.cacheStorage.getAccount(key);
                                if (!account) {
                                    this.logger.warning("Account used to refresh tokens not in persistence, refreshed tokens will not be stored in the cache");
                                    return [2 /*return*/, ResponseHandler.generateAuthenticationResult(this.cryptoObj, authority, cacheRecord, false, request, idTokenObj, requestStateObj, undefined)];
                                }
                            }
                            return [4 /*yield*/, this.cacheStorage.saveCacheRecord(cacheRecord)];
                        case 4:
                            _a.sent();
                            return [3 /*break*/, 8];
                        case 5:
                            if (!(this.persistencePlugin && this.serializableCache && cacheContext)) return [3 /*break*/, 7];
                            this.logger.verbose("Persistence enabled, calling afterCacheAccess");
                            return [4 /*yield*/, this.persistencePlugin.afterCacheAccess(cacheContext)];
                        case 6:
                            _a.sent();
                            _a.label = 7;
                        case 7: return [7 /*endfinally*/];
                        case 8: return [2 /*return*/, ResponseHandler.generateAuthenticationResult(this.cryptoObj, authority, cacheRecord, false, request, idTokenObj, requestStateObj, serverTokenResponse.spa_code)];
                    }
                });
            });
        };
        /**
         * Generates CacheRecord
         * @param serverTokenResponse
         * @param idTokenObj
         * @param authority
         */
        ResponseHandler.prototype.generateCacheRecord = function (serverTokenResponse, authority, reqTimestamp, request, idTokenObj, userAssertionHash, authCodePayload) {
            var env = authority.getPreferredCache();
            if (StringUtils.isEmpty(env)) {
                throw ClientAuthError.createInvalidCacheEnvironmentError();
            }
            // IdToken: non AAD scenarios can have empty realm
            var cachedIdToken;
            var cachedAccount;
            if (!StringUtils.isEmpty(serverTokenResponse.id_token) && !!idTokenObj) {
                cachedIdToken = IdTokenEntity.createIdTokenEntity(this.homeAccountIdentifier, env, serverTokenResponse.id_token || Constants.EMPTY_STRING, this.clientId, idTokenObj.claims.tid || Constants.EMPTY_STRING);
                cachedAccount = this.generateAccountEntity(serverTokenResponse, idTokenObj, authority, authCodePayload);
            }
            // AccessToken
            var cachedAccessToken = null;
            if (!StringUtils.isEmpty(serverTokenResponse.access_token)) {
                // If scopes not returned in server response, use request scopes
                var responseScopes = serverTokenResponse.scope ? ScopeSet.fromString(serverTokenResponse.scope) : new ScopeSet(request.scopes || []);
                /*
                 * Use timestamp calculated before request
                 * Server may return timestamps as strings, parse to numbers if so.
                 */
                var expiresIn = (typeof serverTokenResponse.expires_in === "string" ? parseInt(serverTokenResponse.expires_in, 10) : serverTokenResponse.expires_in) || 0;
                var extExpiresIn = (typeof serverTokenResponse.ext_expires_in === "string" ? parseInt(serverTokenResponse.ext_expires_in, 10) : serverTokenResponse.ext_expires_in) || 0;
                var refreshIn = (typeof serverTokenResponse.refresh_in === "string" ? parseInt(serverTokenResponse.refresh_in, 10) : serverTokenResponse.refresh_in) || undefined;
                var tokenExpirationSeconds = reqTimestamp + expiresIn;
                var extendedTokenExpirationSeconds = tokenExpirationSeconds + extExpiresIn;
                var refreshOnSeconds = refreshIn && refreshIn > 0 ? reqTimestamp + refreshIn : undefined;
                // non AAD scenarios can have empty realm
                cachedAccessToken = AccessTokenEntity.createAccessTokenEntity(this.homeAccountIdentifier, env, serverTokenResponse.access_token || Constants.EMPTY_STRING, this.clientId, idTokenObj ? idTokenObj.claims.tid || Constants.EMPTY_STRING : authority.tenant, responseScopes.printScopes(), tokenExpirationSeconds, extendedTokenExpirationSeconds, this.cryptoObj, refreshOnSeconds, serverTokenResponse.token_type, userAssertionHash, serverTokenResponse.key_id, request.claims, request.requestedClaimsHash);
            }
            // refreshToken
            var cachedRefreshToken = null;
            if (!StringUtils.isEmpty(serverTokenResponse.refresh_token)) {
                cachedRefreshToken = RefreshTokenEntity.createRefreshTokenEntity(this.homeAccountIdentifier, env, serverTokenResponse.refresh_token || Constants.EMPTY_STRING, this.clientId, serverTokenResponse.foci, userAssertionHash);
            }
            // appMetadata
            var cachedAppMetadata = null;
            if (!StringUtils.isEmpty(serverTokenResponse.foci)) {
                cachedAppMetadata = AppMetadataEntity.createAppMetadataEntity(this.clientId, env, serverTokenResponse.foci);
            }
            return new CacheRecord(cachedAccount, cachedIdToken, cachedAccessToken, cachedRefreshToken, cachedAppMetadata);
        };
        /**
         * Generate Account
         * @param serverTokenResponse
         * @param idToken
         * @param authority
         */
        ResponseHandler.prototype.generateAccountEntity = function (serverTokenResponse, idToken, authority, authCodePayload) {
            var authorityType = authority.authorityType;
            var cloudGraphHostName = authCodePayload ? authCodePayload.cloud_graph_host_name : Constants.EMPTY_STRING;
            var msGraphhost = authCodePayload ? authCodePayload.msgraph_host : Constants.EMPTY_STRING;
            // ADFS does not require client_info in the response
            if (authorityType === AuthorityType.Adfs) {
                this.logger.verbose("Authority type is ADFS, creating ADFS account");
                return AccountEntity.createGenericAccount(this.homeAccountIdentifier, idToken, authority, cloudGraphHostName, msGraphhost);
            }
            // This fallback applies to B2C as well as they fall under an AAD account type.
            if (StringUtils.isEmpty(serverTokenResponse.client_info) && authority.protocolMode === "AAD") {
                throw ClientAuthError.createClientInfoEmptyError();
            }
            return serverTokenResponse.client_info ?
                AccountEntity.createAccount(serverTokenResponse.client_info, this.homeAccountIdentifier, idToken, authority, cloudGraphHostName, msGraphhost) :
                AccountEntity.createGenericAccount(this.homeAccountIdentifier, idToken, authority, cloudGraphHostName, msGraphhost);
        };
        /**
         * Creates an @AuthenticationResult from @CacheRecord , @IdToken , and a boolean that states whether or not the result is from cache.
         *
         * Optionally takes a state string that is set as-is in the response.
         *
         * @param cacheRecord
         * @param idTokenObj
         * @param fromTokenCache
         * @param stateString
         */
        ResponseHandler.generateAuthenticationResult = function (cryptoObj, authority, cacheRecord, fromTokenCache, request, idTokenObj, requestState, code) {
            var _a, _b, _c;
            return __awaiter(this, void 0, void 0, function () {
                var accessToken, responseScopes, expiresOn, extExpiresOn, familyId, popTokenGenerator, _d, secret, keyId, uid, tid;
                return __generator(this, function (_e) {
                    switch (_e.label) {
                        case 0:
                            accessToken = Constants.EMPTY_STRING;
                            responseScopes = [];
                            expiresOn = null;
                            familyId = Constants.EMPTY_STRING;
                            if (!cacheRecord.accessToken) return [3 /*break*/, 4];
                            if (!(cacheRecord.accessToken.tokenType === exports.AuthenticationScheme.POP)) return [3 /*break*/, 2];
                            popTokenGenerator = new PopTokenGenerator(cryptoObj);
                            _d = cacheRecord.accessToken, secret = _d.secret, keyId = _d.keyId;
                            if (!keyId) {
                                throw ClientAuthError.createKeyIdMissingError();
                            }
                            return [4 /*yield*/, popTokenGenerator.signPopToken(secret, keyId, request)];
                        case 1:
                            accessToken = _e.sent();
                            return [3 /*break*/, 3];
                        case 2:
                            accessToken = cacheRecord.accessToken.secret;
                            _e.label = 3;
                        case 3:
                            responseScopes = ScopeSet.fromString(cacheRecord.accessToken.target).asArray();
                            expiresOn = new Date(Number(cacheRecord.accessToken.expiresOn) * 1000);
                            extExpiresOn = new Date(Number(cacheRecord.accessToken.extendedExpiresOn) * 1000);
                            _e.label = 4;
                        case 4:
                            if (cacheRecord.appMetadata) {
                                familyId = cacheRecord.appMetadata.familyId === THE_FAMILY_ID ? THE_FAMILY_ID : Constants.EMPTY_STRING;
                            }
                            uid = (idTokenObj === null || idTokenObj === void 0 ? void 0 : idTokenObj.claims.oid) || (idTokenObj === null || idTokenObj === void 0 ? void 0 : idTokenObj.claims.sub) || Constants.EMPTY_STRING;
                            tid = (idTokenObj === null || idTokenObj === void 0 ? void 0 : idTokenObj.claims.tid) || Constants.EMPTY_STRING;
                            return [2 /*return*/, {
                                    authority: authority.canonicalAuthority,
                                    uniqueId: uid,
                                    tenantId: tid,
                                    scopes: responseScopes,
                                    account: cacheRecord.account ? cacheRecord.account.getAccountInfo() : null,
                                    idToken: idTokenObj ? idTokenObj.rawToken : Constants.EMPTY_STRING,
                                    idTokenClaims: idTokenObj ? idTokenObj.claims : {},
                                    accessToken: accessToken,
                                    fromCache: fromTokenCache,
                                    expiresOn: expiresOn,
                                    correlationId: request.correlationId,
                                    extExpiresOn: extExpiresOn,
                                    familyId: familyId,
                                    tokenType: ((_a = cacheRecord.accessToken) === null || _a === void 0 ? void 0 : _a.tokenType) || Constants.EMPTY_STRING,
                                    state: requestState ? requestState.userRequestState : Constants.EMPTY_STRING,
                                    cloudGraphHostName: ((_b = cacheRecord.account) === null || _b === void 0 ? void 0 : _b.cloudGraphHostName) || Constants.EMPTY_STRING,
                                    msGraphHost: ((_c = cacheRecord.account) === null || _c === void 0 ? void 0 : _c.msGraphHost) || Constants.EMPTY_STRING,
                                    code: code,
                                    fromNativeBroker: false
                                }];
                    }
                });
            });
        };
        return ResponseHandler;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * Oauth2.0 Authorization Code client
     */
    var AuthorizationCodeClient = /** @class */ (function (_super) {
        __extends(AuthorizationCodeClient, _super);
        function AuthorizationCodeClient(configuration) {
            var _this = _super.call(this, configuration) || this;
            // Flag to indicate if client is for hybrid spa auth code redemption
            _this.includeRedirectUri = true;
            return _this;
        }
        /**
         * Creates the URL of the authorization request letting the user input credentials and consent to the
         * application. The URL target the /authorize endpoint of the authority configured in the
         * application object.
         *
         * Once the user inputs their credentials and consents, the authority will send a response to the redirect URI
         * sent in the request and should contain an authorization code, which can then be used to acquire tokens via
         * acquireToken(AuthorizationCodeRequest)
         * @param request
         */
        AuthorizationCodeClient.prototype.getAuthCodeUrl = function (request) {
            return __awaiter(this, void 0, void 0, function () {
                var queryString;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.createAuthCodeUrlQueryString(request)];
                        case 1:
                            queryString = _a.sent();
                            return [2 /*return*/, UrlString.appendQueryString(this.authority.authorizationEndpoint, queryString)];
                    }
                });
            });
        };
        /**
         * API to acquire a token in exchange of 'authorization_code` acquired by the user in the first leg of the
         * authorization_code_grant
         * @param request
         */
        AuthorizationCodeClient.prototype.acquireToken = function (request, authCodePayload) {
            return __awaiter(this, void 0, void 0, function () {
                var reqTimestamp, response, responseHandler;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            this.logger.info("in acquireToken call");
                            if (!request || StringUtils.isEmpty(request.code)) {
                                throw ClientAuthError.createTokenRequestCannotBeMadeError();
                            }
                            reqTimestamp = TimeUtils.nowSeconds();
                            return [4 /*yield*/, this.executeTokenRequest(this.authority, request)];
                        case 1:
                            response = _a.sent();
                            responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, this.config.serializableCache, this.config.persistencePlugin);
                            // Validate response. This function throws a server error if an error is returned by the server.
                            responseHandler.validateTokenResponse(response.body);
                            return [4 /*yield*/, responseHandler.handleServerTokenResponse(response.body, this.authority, reqTimestamp, request, authCodePayload)];
                        case 2: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        /**
         * Handles the hash fragment response from public client code request. Returns a code response used by
         * the client to exchange for a token in acquireToken.
         * @param hashFragment
         */
        AuthorizationCodeClient.prototype.handleFragmentResponse = function (hashFragment, cachedState) {
            // Handle responses.
            var responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, null, null);
            // Deserialize hash fragment response parameters.
            var hashUrlString = new UrlString(hashFragment);
            // Deserialize hash fragment response parameters.
            var serverParams = UrlString.getDeserializedHash(hashUrlString.getHash());
            // Get code response
            responseHandler.validateServerAuthorizationCodeResponse(serverParams, cachedState, this.cryptoUtils);
            // throw when there is no auth code in the response
            if (!serverParams.code) {
                throw ClientAuthError.createNoAuthCodeInServerResponseError();
            }
            return __assign(__assign({}, serverParams), { 
                // Code param is optional in ServerAuthorizationCodeResponse but required in AuthorizationCodePaylod
                code: serverParams.code });
        };
        /**
         * Used to log out the current user, and redirect the user to the postLogoutRedirectUri.
         * Default behaviour is to redirect the user to `window.location.href`.
         * @param authorityUri
         */
        AuthorizationCodeClient.prototype.getLogoutUri = function (logoutRequest) {
            // Throw error if logoutRequest is null/undefined
            if (!logoutRequest) {
                throw ClientConfigurationError.createEmptyLogoutRequestError();
            }
            var queryString = this.createLogoutUrlQueryString(logoutRequest);
            // Construct logout URI
            return UrlString.appendQueryString(this.authority.endSessionEndpoint, queryString);
        };
        /**
         * Executes POST request to token endpoint
         * @param authority
         * @param request
         */
        AuthorizationCodeClient.prototype.executeTokenRequest = function (authority, request) {
            return __awaiter(this, void 0, void 0, function () {
                var thumbprint, requestBody, queryParameters, ccsCredential, clientInfo, headers, endpoint;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            thumbprint = {
                                clientId: this.config.authOptions.clientId,
                                authority: authority.canonicalAuthority,
                                scopes: request.scopes,
                                claims: request.claims,
                                authenticationScheme: request.authenticationScheme,
                                resourceRequestMethod: request.resourceRequestMethod,
                                resourceRequestUri: request.resourceRequestUri,
                                shrClaims: request.shrClaims,
                                sshKid: request.sshKid
                            };
                            return [4 /*yield*/, this.createTokenRequestBody(request)];
                        case 1:
                            requestBody = _a.sent();
                            queryParameters = this.createTokenQueryParameters(request);
                            ccsCredential = undefined;
                            if (request.clientInfo) {
                                try {
                                    clientInfo = buildClientInfo(request.clientInfo, this.cryptoUtils);
                                    ccsCredential = {
                                        credential: "" + clientInfo.uid + Separators.CLIENT_INFO_SEPARATOR + clientInfo.utid,
                                        type: CcsCredentialType.HOME_ACCOUNT_ID
                                    };
                                }
                                catch (e) {
                                    this.logger.verbose("Could not parse client info for CCS Header: " + e);
                                }
                            }
                            headers = this.createTokenRequestHeaders(ccsCredential || request.ccsCredential);
                            endpoint = StringUtils.isEmpty(queryParameters) ? authority.tokenEndpoint : authority.tokenEndpoint + "?" + queryParameters;
                            return [2 /*return*/, this.executePostToTokenEndpoint(endpoint, requestBody, headers, thumbprint)];
                    }
                });
            });
        };
        /**
         * Creates query string for the /token request
         * @param request
         */
        AuthorizationCodeClient.prototype.createTokenQueryParameters = function (request) {
            var parameterBuilder = new RequestParameterBuilder();
            if (request.tokenQueryParameters) {
                parameterBuilder.addExtraQueryParameters(request.tokenQueryParameters);
            }
            return parameterBuilder.createQueryString();
        };
        /**
         * Generates a map for all the params to be sent to the service
         * @param request
         */
        AuthorizationCodeClient.prototype.createTokenRequestBody = function (request) {
            return __awaiter(this, void 0, void 0, function () {
                var parameterBuilder, clientAssertion, popTokenGenerator, reqCnfData, correlationId, ccsCred, clientInfo, clientInfo;
                var _a;
                return __generator(this, function (_b) {
                    switch (_b.label) {
                        case 0:
                            parameterBuilder = new RequestParameterBuilder();
                            parameterBuilder.addClientId(this.config.authOptions.clientId);
                            /*
                             * For hybrid spa flow, there will be a code but no verifier
                             * In this scenario, don't include redirect uri as auth code will not be bound to redirect URI
                             */
                            if (!this.includeRedirectUri) {
                                // Just validate
                                RequestValidator.validateRedirectUri(request.redirectUri);
                            }
                            else {
                                // Validate and include redirect uri
                                parameterBuilder.addRedirectUri(request.redirectUri);
                            }
                            // Add scope array, parameter builder will add default scopes and dedupe
                            parameterBuilder.addScopes(request.scopes);
                            // add code: user set, not validated
                            parameterBuilder.addAuthorizationCode(request.code);
                            // Add library metadata
                            parameterBuilder.addLibraryInfo(this.config.libraryInfo);
                            parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);
                            parameterBuilder.addThrottling();
                            if (this.serverTelemetryManager) {
                                parameterBuilder.addServerTelemetry(this.serverTelemetryManager);
                            }
                            // add code_verifier if passed
                            if (request.codeVerifier) {
                                parameterBuilder.addCodeVerifier(request.codeVerifier);
                            }
                            if (this.config.clientCredentials.clientSecret) {
                                parameterBuilder.addClientSecret(this.config.clientCredentials.clientSecret);
                            }
                            if (this.config.clientCredentials.clientAssertion) {
                                clientAssertion = this.config.clientCredentials.clientAssertion;
                                parameterBuilder.addClientAssertion(clientAssertion.assertion);
                                parameterBuilder.addClientAssertionType(clientAssertion.assertionType);
                            }
                            parameterBuilder.addGrantType(GrantType.AUTHORIZATION_CODE_GRANT);
                            parameterBuilder.addClientInfo();
                            if (!(request.authenticationScheme === exports.AuthenticationScheme.POP)) return [3 /*break*/, 2];
                            popTokenGenerator = new PopTokenGenerator(this.cryptoUtils);
                            return [4 /*yield*/, popTokenGenerator.generateCnf(request)];
                        case 1:
                            reqCnfData = _b.sent();
                            // SPA PoP requires full Base64Url encoded req_cnf string (unhashed)
                            parameterBuilder.addPopToken(reqCnfData.reqCnfString);
                            return [3 /*break*/, 3];
                        case 2:
                            if (request.authenticationScheme === exports.AuthenticationScheme.SSH) {
                                if (request.sshJwk) {
                                    parameterBuilder.addSshJwk(request.sshJwk);
                                }
                                else {
                                    throw ClientConfigurationError.createMissingSshJwkError();
                                }
                            }
                            _b.label = 3;
                        case 3:
                            correlationId = request.correlationId || this.config.cryptoInterface.createNewGuid();
                            parameterBuilder.addCorrelationId(correlationId);
                            if (!StringUtils.isEmptyObj(request.claims) || this.config.authOptions.clientCapabilities && this.config.authOptions.clientCapabilities.length > 0) {
                                parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);
                            }
                            ccsCred = undefined;
                            if (request.clientInfo) {
                                try {
                                    clientInfo = buildClientInfo(request.clientInfo, this.cryptoUtils);
                                    ccsCred = {
                                        credential: "" + clientInfo.uid + Separators.CLIENT_INFO_SEPARATOR + clientInfo.utid,
                                        type: CcsCredentialType.HOME_ACCOUNT_ID
                                    };
                                }
                                catch (e) {
                                    this.logger.verbose("Could not parse client info for CCS Header: " + e);
                                }
                            }
                            else {
                                ccsCred = request.ccsCredential;
                            }
                            // Adds these as parameters in the request instead of headers to prevent CORS preflight request
                            if (this.config.systemOptions.preventCorsPreflight && ccsCred) {
                                switch (ccsCred.type) {
                                    case CcsCredentialType.HOME_ACCOUNT_ID:
                                        try {
                                            clientInfo = buildClientInfoFromHomeAccountId(ccsCred.credential);
                                            parameterBuilder.addCcsOid(clientInfo);
                                        }
                                        catch (e) {
                                            this.logger.verbose("Could not parse home account ID for CCS Header: " + e);
                                        }
                                        break;
                                    case CcsCredentialType.UPN:
                                        parameterBuilder.addCcsUpn(ccsCred.credential);
                                        break;
                                }
                            }
                            if (request.tokenBodyParameters) {
                                parameterBuilder.addExtraQueryParameters(request.tokenBodyParameters);
                            }
                            // Add hybrid spa parameters if not already provided
                            if (request.enableSpaAuthorizationCode && (!request.tokenBodyParameters || !request.tokenBodyParameters[AADServerParamKeys.RETURN_SPA_CODE])) {
                                parameterBuilder.addExtraQueryParameters((_a = {},
                                    _a[AADServerParamKeys.RETURN_SPA_CODE] = "1",
                                    _a));
                            }
                            return [2 /*return*/, parameterBuilder.createQueryString()];
                    }
                });
            });
        };
        /**
         * This API validates the `AuthorizationCodeUrlRequest` and creates a URL
         * @param request
         */
        AuthorizationCodeClient.prototype.createAuthCodeUrlQueryString = function (request) {
            return __awaiter(this, void 0, void 0, function () {
                var parameterBuilder, requestScopes, correlationId, accountSid, accountLoginHintClaim, clientInfo, clientInfo, clientInfo, popTokenGenerator, reqCnfData;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            parameterBuilder = new RequestParameterBuilder();
                            parameterBuilder.addClientId(this.config.authOptions.clientId);
                            requestScopes = __spreadArrays(request.scopes || [], request.extraScopesToConsent || []);
                            parameterBuilder.addScopes(requestScopes);
                            // validate the redirectUri (to be a non null value)
                            parameterBuilder.addRedirectUri(request.redirectUri);
                            correlationId = request.correlationId || this.config.cryptoInterface.createNewGuid();
                            parameterBuilder.addCorrelationId(correlationId);
                            // add response_mode. If not passed in it defaults to query.
                            parameterBuilder.addResponseMode(request.responseMode);
                            // add response_type = code
                            parameterBuilder.addResponseTypeCode();
                            // add library info parameters
                            parameterBuilder.addLibraryInfo(this.config.libraryInfo);
                            parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);
                            // add client_info=1
                            parameterBuilder.addClientInfo();
                            if (request.codeChallenge && request.codeChallengeMethod) {
                                parameterBuilder.addCodeChallengeParams(request.codeChallenge, request.codeChallengeMethod);
                            }
                            if (request.prompt) {
                                parameterBuilder.addPrompt(request.prompt);
                            }
                            if (request.domainHint) {
                                parameterBuilder.addDomainHint(request.domainHint);
                            }
                            // Add sid or loginHint with preference for login_hint claim (in request) -> sid -> loginHint (upn/email) -> username of AccountInfo object
                            if (request.prompt !== PromptValue.SELECT_ACCOUNT) {
                                // AAD will throw if prompt=select_account is passed with an account hint
                                if (request.sid && request.prompt === PromptValue.NONE) {
                                    // SessionID is only used in silent calls
                                    this.logger.verbose("createAuthCodeUrlQueryString: Prompt is none, adding sid from request");
                                    parameterBuilder.addSid(request.sid);
                                }
                                else if (request.account) {
                                    accountSid = this.extractAccountSid(request.account);
                                    accountLoginHintClaim = this.extractLoginHint(request.account);
                                    // If login_hint claim is present, use it over sid/username
                                    if (accountLoginHintClaim) {
                                        this.logger.verbose("createAuthCodeUrlQueryString: login_hint claim present on account");
                                        parameterBuilder.addLoginHint(accountLoginHintClaim);
                                        try {
                                            clientInfo = buildClientInfoFromHomeAccountId(request.account.homeAccountId);
                                            parameterBuilder.addCcsOid(clientInfo);
                                        }
                                        catch (e) {
                                            this.logger.verbose("createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header");
                                        }
                                    }
                                    else if (accountSid && request.prompt === PromptValue.NONE) {
                                        /*
                                         * If account and loginHint are provided, we will check account first for sid before adding loginHint
                                         * SessionId is only used in silent calls
                                         */
                                        this.logger.verbose("createAuthCodeUrlQueryString: Prompt is none, adding sid from account");
                                        parameterBuilder.addSid(accountSid);
                                        try {
                                            clientInfo = buildClientInfoFromHomeAccountId(request.account.homeAccountId);
                                            parameterBuilder.addCcsOid(clientInfo);
                                        }
                                        catch (e) {
                                            this.logger.verbose("createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header");
                                        }
                                    }
                                    else if (request.loginHint) {
                                        this.logger.verbose("createAuthCodeUrlQueryString: Adding login_hint from request");
                                        parameterBuilder.addLoginHint(request.loginHint);
                                        parameterBuilder.addCcsUpn(request.loginHint);
                                    }
                                    else if (request.account.username) {
                                        // Fallback to account username if provided
                                        this.logger.verbose("createAuthCodeUrlQueryString: Adding login_hint from account");
                                        parameterBuilder.addLoginHint(request.account.username);
                                        try {
                                            clientInfo = buildClientInfoFromHomeAccountId(request.account.homeAccountId);
                                            parameterBuilder.addCcsOid(clientInfo);
                                        }
                                        catch (e) {
                                            this.logger.verbose("createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header");
                                        }
                                    }
                                }
                                else if (request.loginHint) {
                                    this.logger.verbose("createAuthCodeUrlQueryString: No account, adding login_hint from request");
                                    parameterBuilder.addLoginHint(request.loginHint);
                                    parameterBuilder.addCcsUpn(request.loginHint);
                                }
                            }
                            else {
                                this.logger.verbose("createAuthCodeUrlQueryString: Prompt is select_account, ignoring account hints");
                            }
                            if (request.nonce) {
                                parameterBuilder.addNonce(request.nonce);
                            }
                            if (request.state) {
                                parameterBuilder.addState(request.state);
                            }
                            if (!StringUtils.isEmpty(request.claims) || this.config.authOptions.clientCapabilities && this.config.authOptions.clientCapabilities.length > 0) {
                                parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);
                            }
                            if (request.extraQueryParameters) {
                                parameterBuilder.addExtraQueryParameters(request.extraQueryParameters);
                            }
                            if (!request.nativeBroker) return [3 /*break*/, 2];
                            // signal ests that this is a WAM call
                            parameterBuilder.addNativeBroker();
                            if (!(request.authenticationScheme === exports.AuthenticationScheme.POP)) return [3 /*break*/, 2];
                            popTokenGenerator = new PopTokenGenerator(this.cryptoUtils);
                            return [4 /*yield*/, popTokenGenerator.generateCnf(request)];
                        case 1:
                            reqCnfData = _a.sent();
                            parameterBuilder.addPopToken(reqCnfData.reqCnfHash);
                            _a.label = 2;
                        case 2: return [2 /*return*/, parameterBuilder.createQueryString()];
                    }
                });
            });
        };
        /**
         * This API validates the `EndSessionRequest` and creates a URL
         * @param request
         */
        AuthorizationCodeClient.prototype.createLogoutUrlQueryString = function (request) {
            var parameterBuilder = new RequestParameterBuilder();
            if (request.postLogoutRedirectUri) {
                parameterBuilder.addPostLogoutRedirectUri(request.postLogoutRedirectUri);
            }
            if (request.correlationId) {
                parameterBuilder.addCorrelationId(request.correlationId);
            }
            if (request.idTokenHint) {
                parameterBuilder.addIdTokenHint(request.idTokenHint);
            }
            if (request.state) {
                parameterBuilder.addState(request.state);
            }
            if (request.logoutHint) {
                parameterBuilder.addLogoutHint(request.logoutHint);
            }
            if (request.extraQueryParameters) {
                parameterBuilder.addExtraQueryParameters(request.extraQueryParameters);
            }
            return parameterBuilder.createQueryString();
        };
        /**
         * Helper to get sid from account. Returns null if idTokenClaims are not present or sid is not present.
         * @param account
         */
        AuthorizationCodeClient.prototype.extractAccountSid = function (account) {
            var _a;
            return ((_a = account.idTokenClaims) === null || _a === void 0 ? void 0 : _a.sid) || null;
        };
        AuthorizationCodeClient.prototype.extractLoginHint = function (account) {
            var _a;
            return ((_a = account.idTokenClaims) === null || _a === void 0 ? void 0 : _a.login_hint) || null;
        };
        return AuthorizationCodeClient;
    }(BaseClient));

    /*! @azure/msal-common v7.3.0 2022-08-01 */
    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * Enumeration of operations that are instrumented by have their performance measured by the PerformanceClient.
     *
     * @export
     * @enum {number}
     */
    exports.PerformanceEvents = void 0;
    (function (PerformanceEvents) {
        /**
         * acquireTokenByCode API (msal-browser and msal-node).
         * Used to acquire tokens by trading an authorization code against the token endpoint.
         */
        PerformanceEvents["AcquireTokenByCode"] = "acquireTokenByCode";
        /**
         * acquireTokenByRefreshToken API (msal-browser and msal-node).
         * Used to renew an access token using a refresh token against the token endpoint.
         */
        PerformanceEvents["AcquireTokenByRefreshToken"] = "acquireTokenByRefreshToken";
        /**
         * acquireTokenSilent API (msal-browser and msal-node).
         * Used to silently acquire a new access token (from the cache or the network).
         */
        PerformanceEvents["AcquireTokenSilent"] = "acquireTokenSilent";
        /**
         * acquireTokenSilentAsync (msal-browser).
         * Internal API for acquireTokenSilent.
         */
        PerformanceEvents["AcquireTokenSilentAsync"] = "acquireTokenSilentAsync";
        /**
         * acquireTokenPopup (msal-browser).
         * Used to acquire a new access token interactively through pop ups
         */
        PerformanceEvents["AcquireTokenPopup"] = "acquireTokenPopup";
        /**
         * getPublicKeyThumbprint API in CryptoOpts class (msal-browser).
         * Used to generate a public/private keypair and generate a public key thumbprint for pop requests.
         */
        PerformanceEvents["CryptoOptsGetPublicKeyThumbprint"] = "cryptoOptsGetPublicKeyThumbprint";
        /**
         * signJwt API in CryptoOpts class (msal-browser).
         * Used to signed a pop token.
         */
        PerformanceEvents["CryptoOptsSignJwt"] = "cryptoOptsSignJwt";
        /**
         * acquireToken API in the SilentCacheClient class (msal-browser).
         * Used to read access tokens from the cache.
         */
        PerformanceEvents["SilentCacheClientAcquireToken"] = "silentCacheClientAcquireToken";
        /**
         * acquireToken API in the SilentIframeClient class (msal-browser).
         * Used to acquire a new set of tokens from the authorize endpoint in a hidden iframe.
         */
        PerformanceEvents["SilentIframeClientAcquireToken"] = "silentIframeClientAcquireToken";
        /**
         * acquireToken API in SilentRereshClient (msal-browser).
         * Used to acquire a new set of tokens from the token endpoint using a refresh token.
         */
        PerformanceEvents["SilentRefreshClientAcquireToken"] = "silentRefreshClientAcquireToken";
        /**
         * ssoSilent API (msal-browser).
         * Used to silently acquire an authorization code and set of tokens using a hidden iframe.
         */
        PerformanceEvents["SsoSilent"] = "ssoSilent";
        /**
         * getDiscoveredAuthority API in StandardInteractionClient class (msal-browser).
         * Used to load authority metadata for a request.
         */
        PerformanceEvents["StandardInteractionClientGetDiscoveredAuthority"] = "standardInteractionClientGetDiscoveredAuthority";
        /**
         * acquireToken APIs in msal-browser.
         * Used to make an /authorize endpoint call with native brokering enabled.
         */
        PerformanceEvents["FetchAccountIdWithNativeBroker"] = "fetchAccountIdWithNativeBroker";
        /**
         * acquireToken API in NativeInteractionClient class (msal-browser).
         * Used to acquire a token from Native component when native brokering is enabled.
         */
        PerformanceEvents["NativeInteractionClientAcquireToken"] = "nativeInteractionClientAcquireToken";
        /**
         * Time spent on the network for refresh token acquisition
         */
        PerformanceEvents["RefreshTokenClientExecuteTokenRequest"] = "refreshTokenClientExecuteTokenRequest";
        /**
         * Time spent creating default headers for requests to token endpoint
         */
        PerformanceEvents["BaseClientCreateTokenRequestHeaders"] = "baseClientCreateTokenRequestHeaders";
        /**
         * Used to measure the time taken for completing embedded-broker handshake (PW-Broker).
         */
        PerformanceEvents["BrokerHandhshake"] = "brokerHandshake";
        /**
         * acquireTokenByRefreshToken API in BrokerClientApplication (PW-Broker) .
         */
        PerformanceEvents["AcquireTokenByRefreshTokenInBroker"] = "acquireTokenByRefreshTokenInBroker";
        /**
         * acquireToken API in BrokerClientApplication.
         * Used to acquire a token on behalf of the embedded application (PW-Broker).
         */
        PerformanceEvents["AcquireTokenByBroker"] = "acquireTokenByBroker";
    })(exports.PerformanceEvents || (exports.PerformanceEvents = {}));
    /**
     * State of the performance event.
     *
     * @export
     * @enum {number}
     */
    var PerformanceEventStatus;
    (function (PerformanceEventStatus) {
        PerformanceEventStatus[PerformanceEventStatus["NotStarted"] = 0] = "NotStarted";
        PerformanceEventStatus[PerformanceEventStatus["InProgress"] = 1] = "InProgress";
        PerformanceEventStatus[PerformanceEventStatus["Completed"] = 2] = "Completed";
    })(PerformanceEventStatus || (PerformanceEventStatus = {}));

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * OAuth2.0 refresh token client
     */
    var RefreshTokenClient = /** @class */ (function (_super) {
        __extends(RefreshTokenClient, _super);
        function RefreshTokenClient(configuration, performanceClient) {
            return _super.call(this, configuration, performanceClient) || this;
        }
        RefreshTokenClient.prototype.acquireToken = function (request) {
            return __awaiter(this, void 0, void 0, function () {
                var reqTimestamp, response, responseHandler;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            reqTimestamp = TimeUtils.nowSeconds();
                            return [4 /*yield*/, this.executeTokenRequest(request, this.authority)];
                        case 1:
                            response = _a.sent();
                            responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, this.config.serializableCache, this.config.persistencePlugin);
                            responseHandler.validateTokenResponse(response.body);
                            return [2 /*return*/, responseHandler.handleServerTokenResponse(response.body, this.authority, reqTimestamp, request, undefined, undefined, true, request.forceCache)];
                    }
                });
            });
        };
        /**
         * Gets cached refresh token and attaches to request, then calls acquireToken API
         * @param request
         */
        RefreshTokenClient.prototype.acquireTokenByRefreshToken = function (request) {
            return __awaiter(this, void 0, void 0, function () {
                var isFOCI, noFamilyRTInCache, clientMismatchErrorWithFamilyRT;
                return __generator(this, function (_a) {
                    // Cannot renew token if no request object is given.
                    if (!request) {
                        throw ClientConfigurationError.createEmptyTokenRequestError();
                    }
                    // We currently do not support silent flow for account === null use cases; This will be revisited for confidential flow usecases
                    if (!request.account) {
                        throw ClientAuthError.createNoAccountInSilentRequestError();
                    }
                    isFOCI = this.cacheManager.isAppMetadataFOCI(request.account.environment, this.config.authOptions.clientId);
                    // if the app is part of the family, retrive a Family refresh token if present and make a refreshTokenRequest
                    if (isFOCI) {
                        try {
                            return [2 /*return*/, this.acquireTokenWithCachedRefreshToken(request, true)];
                        }
                        catch (e) {
                            noFamilyRTInCache = e instanceof InteractionRequiredAuthError && e.errorCode === InteractionRequiredAuthErrorMessage.noTokensFoundError.code;
                            clientMismatchErrorWithFamilyRT = e instanceof ServerError && e.errorCode === Errors.INVALID_GRANT_ERROR && e.subError === Errors.CLIENT_MISMATCH_ERROR;
                            // if family Refresh Token (FRT) cache acquisition fails or if client_mismatch error is seen with FRT, reattempt with application Refresh Token (ART)
                            if (noFamilyRTInCache || clientMismatchErrorWithFamilyRT) {
                                return [2 /*return*/, this.acquireTokenWithCachedRefreshToken(request, false)];
                                // throw in all other cases
                            }
                            else {
                                throw e;
                            }
                        }
                    }
                    // fall back to application refresh token acquisition
                    return [2 /*return*/, this.acquireTokenWithCachedRefreshToken(request, false)];
                });
            });
        };
        /**
         * makes a network call to acquire tokens by exchanging RefreshToken available in userCache; throws if refresh token is not cached
         * @param request
         */
        RefreshTokenClient.prototype.acquireTokenWithCachedRefreshToken = function (request, foci) {
            return __awaiter(this, void 0, void 0, function () {
                var refreshToken, refreshTokenRequest;
                return __generator(this, function (_a) {
                    refreshToken = this.cacheManager.readRefreshTokenFromCache(this.config.authOptions.clientId, request.account, foci);
                    // no refresh Token
                    if (!refreshToken) {
                        throw InteractionRequiredAuthError.createNoTokensFoundError();
                    }
                    refreshTokenRequest = __assign(__assign({}, request), { refreshToken: refreshToken.secret, authenticationScheme: request.authenticationScheme || exports.AuthenticationScheme.BEARER, ccsCredential: {
                            credential: request.account.homeAccountId,
                            type: CcsCredentialType.HOME_ACCOUNT_ID
                        } });
                    return [2 /*return*/, this.acquireToken(refreshTokenRequest)];
                });
            });
        };
        /**
         * Constructs the network message and makes a NW call to the underlying secure token service
         * @param request
         * @param authority
         */
        RefreshTokenClient.prototype.executeTokenRequest = function (request, authority) {
            var _a;
            return __awaiter(this, void 0, void 0, function () {
                var acquireTokenMeasurement, requestBody, queryParameters, headers, thumbprint, endpoint;
                return __generator(this, function (_b) {
                    switch (_b.label) {
                        case 0:
                            acquireTokenMeasurement = (_a = this.performanceClient) === null || _a === void 0 ? void 0 : _a.startMeasurement(exports.PerformanceEvents.RefreshTokenClientExecuteTokenRequest, request.correlationId);
                            return [4 /*yield*/, this.createTokenRequestBody(request)];
                        case 1:
                            requestBody = _b.sent();
                            queryParameters = this.createTokenQueryParameters(request);
                            headers = this.createTokenRequestHeaders(request.ccsCredential);
                            thumbprint = {
                                clientId: this.config.authOptions.clientId,
                                authority: authority.canonicalAuthority,
                                scopes: request.scopes,
                                claims: request.claims,
                                authenticationScheme: request.authenticationScheme,
                                resourceRequestMethod: request.resourceRequestMethod,
                                resourceRequestUri: request.resourceRequestUri,
                                shrClaims: request.shrClaims,
                                sshKid: request.sshKid
                            };
                            endpoint = UrlString.appendQueryString(authority.tokenEndpoint, queryParameters);
                            return [2 /*return*/, this.executePostToTokenEndpoint(endpoint, requestBody, headers, thumbprint)
                                    .then(function (result) {
                                    acquireTokenMeasurement === null || acquireTokenMeasurement === void 0 ? void 0 : acquireTokenMeasurement.endMeasurement({
                                        success: true
                                    });
                                    return result;
                                })
                                    .catch(function (error) {
                                    acquireTokenMeasurement === null || acquireTokenMeasurement === void 0 ? void 0 : acquireTokenMeasurement.endMeasurement({
                                        success: false
                                    });
                                    throw error;
                                })];
                    }
                });
            });
        };
        /**
         * Creates query string for the /token request
         * @param request
         */
        RefreshTokenClient.prototype.createTokenQueryParameters = function (request) {
            var parameterBuilder = new RequestParameterBuilder();
            if (request.tokenQueryParameters) {
                parameterBuilder.addExtraQueryParameters(request.tokenQueryParameters);
            }
            return parameterBuilder.createQueryString();
        };
        /**
         * Helper function to create the token request body
         * @param request
         */
        RefreshTokenClient.prototype.createTokenRequestBody = function (request) {
            var _a;
            return __awaiter(this, void 0, void 0, function () {
                var correlationId, acquireTokenMeasurement, parameterBuilder, clientAssertion, popTokenGenerator, reqCnfData, clientInfo;
                return __generator(this, function (_b) {
                    switch (_b.label) {
                        case 0:
                            correlationId = request.correlationId;
                            acquireTokenMeasurement = (_a = this.performanceClient) === null || _a === void 0 ? void 0 : _a.startMeasurement(exports.PerformanceEvents.BaseClientCreateTokenRequestHeaders, correlationId);
                            parameterBuilder = new RequestParameterBuilder();
                            parameterBuilder.addClientId(this.config.authOptions.clientId);
                            parameterBuilder.addScopes(request.scopes);
                            parameterBuilder.addGrantType(GrantType.REFRESH_TOKEN_GRANT);
                            parameterBuilder.addClientInfo();
                            parameterBuilder.addLibraryInfo(this.config.libraryInfo);
                            parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);
                            parameterBuilder.addThrottling();
                            if (this.serverTelemetryManager) {
                                parameterBuilder.addServerTelemetry(this.serverTelemetryManager);
                            }
                            parameterBuilder.addCorrelationId(correlationId);
                            parameterBuilder.addRefreshToken(request.refreshToken);
                            if (this.config.clientCredentials.clientSecret) {
                                parameterBuilder.addClientSecret(this.config.clientCredentials.clientSecret);
                            }
                            if (this.config.clientCredentials.clientAssertion) {
                                clientAssertion = this.config.clientCredentials.clientAssertion;
                                parameterBuilder.addClientAssertion(clientAssertion.assertion);
                                parameterBuilder.addClientAssertionType(clientAssertion.assertionType);
                            }
                            if (!(request.authenticationScheme === exports.AuthenticationScheme.POP)) return [3 /*break*/, 2];
                            popTokenGenerator = new PopTokenGenerator(this.cryptoUtils);
                            return [4 /*yield*/, popTokenGenerator.generateCnf(request)];
                        case 1:
                            reqCnfData = _b.sent();
                            // SPA PoP requires full Base64Url encoded req_cnf string (unhashed)
                            parameterBuilder.addPopToken(reqCnfData.reqCnfString);
                            return [3 /*break*/, 3];
                        case 2:
                            if (request.authenticationScheme === exports.AuthenticationScheme.SSH) {
                                if (request.sshJwk) {
                                    parameterBuilder.addSshJwk(request.sshJwk);
                                }
                                else {
                                    acquireTokenMeasurement === null || acquireTokenMeasurement === void 0 ? void 0 : acquireTokenMeasurement.endMeasurement({
                                        success: false
                                    });
                                    throw ClientConfigurationError.createMissingSshJwkError();
                                }
                            }
                            _b.label = 3;
                        case 3:
                            if (!StringUtils.isEmptyObj(request.claims) || this.config.authOptions.clientCapabilities && this.config.authOptions.clientCapabilities.length > 0) {
                                parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);
                            }
                            if (this.config.systemOptions.preventCorsPreflight && request.ccsCredential) {
                                switch (request.ccsCredential.type) {
                                    case CcsCredentialType.HOME_ACCOUNT_ID:
                                        try {
                                            clientInfo = buildClientInfoFromHomeAccountId(request.ccsCredential.credential);
                                            parameterBuilder.addCcsOid(clientInfo);
                                        }
                                        catch (e) {
                                            this.logger.verbose("Could not parse home account ID for CCS Header: " + e);
                                        }
                                        break;
                                    case CcsCredentialType.UPN:
                                        parameterBuilder.addCcsUpn(request.ccsCredential.credential);
                                        break;
                                }
                            }
                            acquireTokenMeasurement === null || acquireTokenMeasurement === void 0 ? void 0 : acquireTokenMeasurement.endMeasurement({
                                success: true
                            });
                            return [2 /*return*/, parameterBuilder.createQueryString()];
                    }
                });
            });
        };
        return RefreshTokenClient;
    }(BaseClient));

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var SilentFlowClient = /** @class */ (function (_super) {
        __extends(SilentFlowClient, _super);
        function SilentFlowClient(configuration, performanceClient) {
            return _super.call(this, configuration, performanceClient) || this;
        }
        /**
         * Retrieves a token from cache if it is still valid, or uses the cached refresh token to renew
         * the given token and returns the renewed token
         * @param request
         */
        SilentFlowClient.prototype.acquireToken = function (request) {
            return __awaiter(this, void 0, void 0, function () {
                var e_1, refreshTokenClient;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            _a.trys.push([0, 2, , 3]);
                            return [4 /*yield*/, this.acquireCachedToken(request)];
                        case 1: return [2 /*return*/, _a.sent()];
                        case 2:
                            e_1 = _a.sent();
                            if (e_1 instanceof ClientAuthError && e_1.errorCode === ClientAuthErrorMessage.tokenRefreshRequired.code) {
                                refreshTokenClient = new RefreshTokenClient(this.config, this.performanceClient);
                                return [2 /*return*/, refreshTokenClient.acquireTokenByRefreshToken(request)];
                            }
                            else {
                                throw e_1;
                            }
                        case 3: return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * Retrieves token from cache or throws an error if it must be refreshed.
         * @param request
         */
        SilentFlowClient.prototype.acquireCachedToken = function (request) {
            var _a, _b, _c, _d;
            return __awaiter(this, void 0, void 0, function () {
                var environment, cacheRecord;
                return __generator(this, function (_e) {
                    switch (_e.label) {
                        case 0:
                            // Cannot renew token if no request object is given.
                            if (!request) {
                                throw ClientConfigurationError.createEmptyTokenRequestError();
                            }
                            if (request.forceRefresh) {
                                // Must refresh due to present force_refresh flag.
                                (_a = this.serverTelemetryManager) === null || _a === void 0 ? void 0 : _a.setCacheOutcome(CacheOutcome.FORCE_REFRESH);
                                this.logger.info("SilentFlowClient:acquireCachedToken - Skipping cache because forceRefresh is true.");
                                throw ClientAuthError.createRefreshRequiredError();
                            }
                            // We currently do not support silent flow for account === null use cases; This will be revisited for confidential flow usecases
                            if (!request.account) {
                                throw ClientAuthError.createNoAccountInSilentRequestError();
                            }
                            environment = request.authority || this.authority.getPreferredCache();
                            cacheRecord = this.cacheManager.readCacheRecord(request.account, this.config.authOptions.clientId, request, environment);
                            if (!cacheRecord.accessToken) {
                                // Must refresh due to non-existent access_token.
                                (_b = this.serverTelemetryManager) === null || _b === void 0 ? void 0 : _b.setCacheOutcome(CacheOutcome.NO_CACHED_ACCESS_TOKEN);
                                this.logger.info("SilentFlowClient:acquireCachedToken - No access token found in cache for the given properties.");
                                throw ClientAuthError.createRefreshRequiredError();
                            }
                            else if (TimeUtils.wasClockTurnedBack(cacheRecord.accessToken.cachedAt) ||
                                TimeUtils.isTokenExpired(cacheRecord.accessToken.expiresOn, this.config.systemOptions.tokenRenewalOffsetSeconds)) {
                                // Must refresh due to expired access_token.
                                (_c = this.serverTelemetryManager) === null || _c === void 0 ? void 0 : _c.setCacheOutcome(CacheOutcome.CACHED_ACCESS_TOKEN_EXPIRED);
                                this.logger.info("SilentFlowClient:acquireCachedToken - Cached access token is expired or will expire within " + this.config.systemOptions.tokenRenewalOffsetSeconds + " seconds.");
                                throw ClientAuthError.createRefreshRequiredError();
                            }
                            else if (cacheRecord.accessToken.refreshOn && TimeUtils.isTokenExpired(cacheRecord.accessToken.refreshOn, 0)) {
                                // Must refresh due to the refresh_in value.
                                (_d = this.serverTelemetryManager) === null || _d === void 0 ? void 0 : _d.setCacheOutcome(CacheOutcome.REFRESH_CACHED_ACCESS_TOKEN);
                                this.logger.info("SilentFlowClient:acquireCachedToken - Cached access token's refreshOn property has been exceeded'.");
                                throw ClientAuthError.createRefreshRequiredError();
                            }
                            if (this.config.serverTelemetryManager) {
                                this.config.serverTelemetryManager.incrementCacheHits();
                            }
                            return [4 /*yield*/, this.generateResultFromCacheRecord(cacheRecord, request)];
                        case 1: return [2 /*return*/, _e.sent()];
                    }
                });
            });
        };
        /**
         * Helper function to build response object from the CacheRecord
         * @param cacheRecord
         */
        SilentFlowClient.prototype.generateResultFromCacheRecord = function (cacheRecord, request) {
            return __awaiter(this, void 0, void 0, function () {
                var idTokenObj;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            if (cacheRecord.idToken) {
                                idTokenObj = new AuthToken(cacheRecord.idToken.secret, this.config.cryptoInterface);
                            }
                            return [4 /*yield*/, ResponseHandler.generateAuthenticationResult(this.cryptoUtils, this.authority, cacheRecord, true, request, idTokenObj)];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        return SilentFlowClient;
    }(BaseClient));

    /*! @azure/msal-common v7.3.0 2022-08-01 */
    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    function isOpenIdConfigResponse(response) {
        return (response.hasOwnProperty("authorization_endpoint") &&
            response.hasOwnProperty("token_endpoint") &&
            response.hasOwnProperty("issuer") &&
            response.hasOwnProperty("jwks_uri"));
    }

    /*! @azure/msal-common v7.3.0 2022-08-01 */
    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var rawMetdataJSON = { "endpointMetadata": { "https://login.microsoftonline.com/common/": { "token_endpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.microsoftonline.com/common/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.microsoftonline.com/{tenantid}/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo", "authorization_endpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.microsoftonline.com/common/kerberos", "tenant_region_scope": null, "cloud_instance_name": "microsoftonline.com", "cloud_graph_host_name": "graph.windows.net", "msgraph_host": "graph.microsoft.com", "rbac_url": "https://pas.windows.net" }, "https://login.chinacloudapi.cn/common/": { "token_endpoint": "https://login.chinacloudapi.cn/common/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.chinacloudapi.cn/common/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.partner.microsoftonline.cn/{tenantid}/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://microsoftgraph.chinacloudapi.cn/oidc/userinfo", "authorization_endpoint": "https://login.chinacloudapi.cn/common/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.chinacloudapi.cn/common/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.chinacloudapi.cn/common/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.chinacloudapi.cn/common/kerberos", "tenant_region_scope": null, "cloud_instance_name": "partner.microsoftonline.cn", "cloud_graph_host_name": "graph.chinacloudapi.cn", "msgraph_host": "microsoftgraph.chinacloudapi.cn", "rbac_url": "https://pas.chinacloudapi.cn" }, "https://login.microsoftonline.us/common/": { "token_endpoint": "https://login.microsoftonline.us/common/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.microsoftonline.us/common/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.microsoftonline.us/{tenantid}/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo", "authorization_endpoint": "https://login.microsoftonline.us/common/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.microsoftonline.us/common/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.microsoftonline.us/common/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.microsoftonline.us/common/kerberos", "tenant_region_scope": null, "cloud_instance_name": "microsoftonline.us", "cloud_graph_host_name": "graph.windows.net", "msgraph_host": "graph.microsoft.com", "rbac_url": "https://pasff.usgovcloudapi.net" }, "https://login.microsoftonline.com/consumers/": { "token_endpoint": "https://login.microsoftonline.com/consumers/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.microsoftonline.com/consumers/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.microsoftonline.com/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo", "authorization_endpoint": "https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.microsoftonline.com/consumers/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.microsoftonline.com/consumers/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.microsoftonline.com/consumers/kerberos", "tenant_region_scope": null, "cloud_instance_name": "microsoftonline.com", "cloud_graph_host_name": "graph.windows.net", "msgraph_host": "graph.microsoft.com", "rbac_url": "https://pas.windows.net" }, "https://login.chinacloudapi.cn/consumers/": { "token_endpoint": "https://login.chinacloudapi.cn/consumers/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.chinacloudapi.cn/consumers/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.partner.microsoftonline.cn/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://microsoftgraph.chinacloudapi.cn/oidc/userinfo", "authorization_endpoint": "https://login.chinacloudapi.cn/consumers/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.chinacloudapi.cn/consumers/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.chinacloudapi.cn/consumers/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.chinacloudapi.cn/consumers/kerberos", "tenant_region_scope": null, "cloud_instance_name": "partner.microsoftonline.cn", "cloud_graph_host_name": "graph.chinacloudapi.cn", "msgraph_host": "microsoftgraph.chinacloudapi.cn", "rbac_url": "https://pas.chinacloudapi.cn" }, "https://login.microsoftonline.us/consumers/": { "token_endpoint": "https://login.microsoftonline.us/consumers/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.microsoftonline.us/consumers/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.microsoftonline.us/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo", "authorization_endpoint": "https://login.microsoftonline.us/consumers/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.microsoftonline.us/consumers/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.microsoftonline.us/consumers/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.microsoftonline.us/consumers/kerberos", "tenant_region_scope": null, "cloud_instance_name": "microsoftonline.us", "cloud_graph_host_name": "graph.windows.net", "msgraph_host": "graph.microsoft.com", "rbac_url": "https://pasff.usgovcloudapi.net" }, "https://login.microsoftonline.com/organizations/": { "token_endpoint": "https://login.microsoftonline.com/organizations/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.microsoftonline.com/organizations/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.microsoftonline.com/{tenantid}/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo", "authorization_endpoint": "https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.microsoftonline.com/organizations/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.microsoftonline.com/organizations/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.microsoftonline.com/organizations/kerberos", "tenant_region_scope": null, "cloud_instance_name": "microsoftonline.com", "cloud_graph_host_name": "graph.windows.net", "msgraph_host": "graph.microsoft.com", "rbac_url": "https://pas.windows.net" }, "https://login.chinacloudapi.cn/organizations/": { "token_endpoint": "https://login.chinacloudapi.cn/organizations/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.chinacloudapi.cn/organizations/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.partner.microsoftonline.cn/{tenantid}/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://microsoftgraph.chinacloudapi.cn/oidc/userinfo", "authorization_endpoint": "https://login.chinacloudapi.cn/organizations/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.chinacloudapi.cn/organizations/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.chinacloudapi.cn/organizations/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.chinacloudapi.cn/organizations/kerberos", "tenant_region_scope": null, "cloud_instance_name": "partner.microsoftonline.cn", "cloud_graph_host_name": "graph.chinacloudapi.cn", "msgraph_host": "microsoftgraph.chinacloudapi.cn", "rbac_url": "https://pas.chinacloudapi.cn" }, "https://login.microsoftonline.us/organizations/": { "token_endpoint": "https://login.microsoftonline.us/organizations/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.microsoftonline.us/organizations/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.microsoftonline.us/{tenantid}/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo", "authorization_endpoint": "https://login.microsoftonline.us/organizations/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.microsoftonline.us/organizations/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.microsoftonline.us/organizations/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.microsoftonline.us/organizations/kerberos", "tenant_region_scope": null, "cloud_instance_name": "microsoftonline.us", "cloud_graph_host_name": "graph.windows.net", "msgraph_host": "graph.microsoft.com", "rbac_url": "https://pasff.usgovcloudapi.net" } }, "instanceDiscoveryMetadata": { "https://login.microsoftonline.com/common/": { "tenant_discovery_endpoint": "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.chinacloudapi.cn/common/": { "tenant_discovery_endpoint": "https://login.chinacloudapi.cn/common/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.microsoftonline.us/common/": { "tenant_discovery_endpoint": "https://login.microsoftonline.us/common/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.microsoftonline.com/consumers/": { "tenant_discovery_endpoint": "https://login.microsoftonline.com/consumers/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.chinacloudapi.cn/consumers/": { "tenant_discovery_endpoint": "https://login.chinacloudapi.cn/consumers/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.microsoftonline.us/consumers/": { "tenant_discovery_endpoint": "https://login.microsoftonline.us/consumers/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.microsoftonline.com/organizations/": { "tenant_discovery_endpoint": "https://login.microsoftonline.com/organizations/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.chinacloudapi.cn/organizations/": { "tenant_discovery_endpoint": "https://login.chinacloudapi.cn/organizations/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.microsoftonline.us/organizations/": { "tenant_discovery_endpoint": "https://login.microsoftonline.us/organizations/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] } } };
    var EndpointMetadata = rawMetdataJSON.endpointMetadata;
    var InstanceDiscoveryMetadata = rawMetdataJSON.instanceDiscoveryMetadata;

    /*! @azure/msal-common v7.3.0 2022-08-01 */
    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * Protocol modes supported by MSAL.
     */
    exports.ProtocolMode = void 0;
    (function (ProtocolMode) {
        ProtocolMode["AAD"] = "AAD";
        ProtocolMode["OIDC"] = "OIDC";
    })(exports.ProtocolMode || (exports.ProtocolMode = {}));

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var AuthorityMetadataEntity = /** @class */ (function () {
        function AuthorityMetadataEntity() {
            this.expiresAt = TimeUtils.nowSeconds() + AUTHORITY_METADATA_CONSTANTS.REFRESH_TIME_SECONDS;
        }
        /**
         * Update the entity with new aliases, preferred_cache and preferred_network values
         * @param metadata
         * @param fromNetwork
         */
        AuthorityMetadataEntity.prototype.updateCloudDiscoveryMetadata = function (metadata, fromNetwork) {
            this.aliases = metadata.aliases;
            this.preferred_cache = metadata.preferred_cache;
            this.preferred_network = metadata.preferred_network;
            this.aliasesFromNetwork = fromNetwork;
        };
        /**
         * Update the entity with new endpoints
         * @param metadata
         * @param fromNetwork
         */
        AuthorityMetadataEntity.prototype.updateEndpointMetadata = function (metadata, fromNetwork) {
            this.authorization_endpoint = metadata.authorization_endpoint;
            this.token_endpoint = metadata.token_endpoint;
            this.end_session_endpoint = metadata.end_session_endpoint;
            this.issuer = metadata.issuer;
            this.endpointsFromNetwork = fromNetwork;
            this.jwks_uri = metadata.jwks_uri;
        };
        /**
         * Save the authority that was used to create this cache entry
         * @param authority
         */
        AuthorityMetadataEntity.prototype.updateCanonicalAuthority = function (authority) {
            this.canonical_authority = authority;
        };
        /**
         * Reset the exiresAt value
         */
        AuthorityMetadataEntity.prototype.resetExpiresAt = function () {
            this.expiresAt = TimeUtils.nowSeconds() + AUTHORITY_METADATA_CONSTANTS.REFRESH_TIME_SECONDS;
        };
        /**
         * Returns whether or not the data needs to be refreshed
         */
        AuthorityMetadataEntity.prototype.isExpired = function () {
            return this.expiresAt <= TimeUtils.nowSeconds();
        };
        /**
         * Validates an entity: checks for all expected params
         * @param entity
         */
        AuthorityMetadataEntity.isAuthorityMetadataEntity = function (key, entity) {
            if (!entity) {
                return false;
            }
            return (key.indexOf(AUTHORITY_METADATA_CONSTANTS.CACHE_KEY) === 0 &&
                entity.hasOwnProperty("aliases") &&
                entity.hasOwnProperty("preferred_cache") &&
                entity.hasOwnProperty("preferred_network") &&
                entity.hasOwnProperty("canonical_authority") &&
                entity.hasOwnProperty("authorization_endpoint") &&
                entity.hasOwnProperty("token_endpoint") &&
                entity.hasOwnProperty("issuer") &&
                entity.hasOwnProperty("aliasesFromNetwork") &&
                entity.hasOwnProperty("endpointsFromNetwork") &&
                entity.hasOwnProperty("expiresAt") &&
                entity.hasOwnProperty("jwks_uri"));
        };
        return AuthorityMetadataEntity;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */
    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    function isCloudInstanceDiscoveryResponse(response) {
        return (response.hasOwnProperty("tenant_discovery_endpoint") &&
            response.hasOwnProperty("metadata"));
    }

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var RegionDiscovery = /** @class */ (function () {
        function RegionDiscovery(networkInterface) {
            this.networkInterface = networkInterface;
        }
        /**
         * Detect the region from the application's environment.
         *
         * @returns Promise<string | null>
         */
        RegionDiscovery.prototype.detectRegion = function (environmentRegion, regionDiscoveryMetadata, proxyUrl) {
            return __awaiter(this, void 0, void 0, function () {
                var autodetectedRegionName, options, localIMDSVersionResponse, currentIMDSVersion, currentIMDSVersionResponse;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            autodetectedRegionName = environmentRegion;
                            if (!!autodetectedRegionName) return [3 /*break*/, 8];
                            options = RegionDiscovery.IMDS_OPTIONS;
                            if (proxyUrl) {
                                options.proxyUrl = proxyUrl;
                            }
                            _a.label = 1;
                        case 1:
                            _a.trys.push([1, 6, , 7]);
                            return [4 /*yield*/, this.getRegionFromIMDS(Constants.IMDS_VERSION, options)];
                        case 2:
                            localIMDSVersionResponse = _a.sent();
                            if (localIMDSVersionResponse.status === ResponseCodes.httpSuccess) {
                                autodetectedRegionName = localIMDSVersionResponse.body;
                                regionDiscoveryMetadata.region_source = RegionDiscoverySources.IMDS;
                            }
                            if (!(localIMDSVersionResponse.status === ResponseCodes.httpBadRequest)) return [3 /*break*/, 5];
                            return [4 /*yield*/, this.getCurrentVersion(options)];
                        case 3:
                            currentIMDSVersion = _a.sent();
                            if (!currentIMDSVersion) {
                                regionDiscoveryMetadata.region_source = RegionDiscoverySources.FAILED_AUTO_DETECTION;
                                return [2 /*return*/, null];
                            }
                            return [4 /*yield*/, this.getRegionFromIMDS(currentIMDSVersion, options)];
                        case 4:
                            currentIMDSVersionResponse = _a.sent();
                            if (currentIMDSVersionResponse.status === ResponseCodes.httpSuccess) {
                                autodetectedRegionName = currentIMDSVersionResponse.body;
                                regionDiscoveryMetadata.region_source = RegionDiscoverySources.IMDS;
                            }
                            _a.label = 5;
                        case 5: return [3 /*break*/, 7];
                        case 6:
                            _a.sent();
                            regionDiscoveryMetadata.region_source = RegionDiscoverySources.FAILED_AUTO_DETECTION;
                            return [2 /*return*/, null];
                        case 7: return [3 /*break*/, 9];
                        case 8:
                            regionDiscoveryMetadata.region_source = RegionDiscoverySources.ENVIRONMENT_VARIABLE;
                            _a.label = 9;
                        case 9:
                            // If no region was auto detected from the environment or from the IMDS endpoint, mark the attempt as a FAILED_AUTO_DETECTION
                            if (!autodetectedRegionName) {
                                regionDiscoveryMetadata.region_source = RegionDiscoverySources.FAILED_AUTO_DETECTION;
                            }
                            return [2 /*return*/, autodetectedRegionName || null];
                    }
                });
            });
        };
        /**
         * Make the call to the IMDS endpoint
         *
         * @param imdsEndpointUrl
         * @returns Promise<NetworkResponse<string>>
         */
        RegionDiscovery.prototype.getRegionFromIMDS = function (version, options) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    return [2 /*return*/, this.networkInterface.sendGetRequestAsync(Constants.IMDS_ENDPOINT + "?api-version=" + version + "&format=text", options, Constants.IMDS_TIMEOUT)];
                });
            });
        };
        /**
         * Get the most recent version of the IMDS endpoint available
         *
         * @returns Promise<string | null>
         */
        RegionDiscovery.prototype.getCurrentVersion = function (options) {
            return __awaiter(this, void 0, void 0, function () {
                var response;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            _a.trys.push([0, 2, , 3]);
                            return [4 /*yield*/, this.networkInterface.sendGetRequestAsync(Constants.IMDS_ENDPOINT + "?format=json", options)];
                        case 1:
                            response = _a.sent();
                            // When IMDS endpoint is called without the api version query param, bad request response comes back with latest version.
                            if (response.status === ResponseCodes.httpBadRequest && response.body && response.body["newest-versions"] && response.body["newest-versions"].length > 0) {
                                return [2 /*return*/, response.body["newest-versions"][0]];
                            }
                            return [2 /*return*/, null];
                        case 2:
                            _a.sent();
                            return [2 /*return*/, null];
                        case 3: return [2 /*return*/];
                    }
                });
            });
        };
        // Options for the IMDS endpoint request
        RegionDiscovery.IMDS_OPTIONS = {
            headers: {
                Metadata: "true",
            },
        };
        return RegionDiscovery;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * The authority class validates the authority URIs used by the user, and retrieves the OpenID Configuration Data from the
     * endpoint. It will store the pertinent config data in this object for use during token calls.
     */
    var Authority = /** @class */ (function () {
        function Authority(authority, networkInterface, cacheManager, authorityOptions, proxyUrl) {
            this.canonicalAuthority = authority;
            this._canonicalAuthority.validateAsUri();
            this.networkInterface = networkInterface;
            this.cacheManager = cacheManager;
            this.authorityOptions = authorityOptions;
            this.regionDiscovery = new RegionDiscovery(networkInterface);
            this.regionDiscoveryMetadata = { region_used: undefined, region_source: undefined, region_outcome: undefined };
            this.proxyUrl = proxyUrl || Constants.EMPTY_STRING;
        }
        Object.defineProperty(Authority.prototype, "authorityType", {
            // See above for AuthorityType
            get: function () {
                var pathSegments = this.canonicalAuthorityUrlComponents.PathSegments;
                if (pathSegments.length && pathSegments[0].toLowerCase() === Constants.ADFS) {
                    return AuthorityType.Adfs;
                }
                return AuthorityType.Default;
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(Authority.prototype, "protocolMode", {
            /**
             * ProtocolMode enum representing the way endpoints are constructed.
             */
            get: function () {
                return this.authorityOptions.protocolMode;
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(Authority.prototype, "options", {
            /**
             * Returns authorityOptions which can be used to reinstantiate a new authority instance
             */
            get: function () {
                return this.authorityOptions;
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(Authority.prototype, "canonicalAuthority", {
            /**
             * A URL that is the authority set by the developer
             */
            get: function () {
                return this._canonicalAuthority.urlString;
            },
            /**
             * Sets canonical authority.
             */
            set: function (url) {
                this._canonicalAuthority = new UrlString(url);
                this._canonicalAuthority.validateAsUri();
                this._canonicalAuthorityUrlComponents = null;
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(Authority.prototype, "canonicalAuthorityUrlComponents", {
            /**
             * Get authority components.
             */
            get: function () {
                if (!this._canonicalAuthorityUrlComponents) {
                    this._canonicalAuthorityUrlComponents = this._canonicalAuthority.getUrlComponents();
                }
                return this._canonicalAuthorityUrlComponents;
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(Authority.prototype, "hostnameAndPort", {
            /**
             * Get hostname and port i.e. login.microsoftonline.com
             */
            get: function () {
                return this.canonicalAuthorityUrlComponents.HostNameAndPort.toLowerCase();
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(Authority.prototype, "tenant", {
            /**
             * Get tenant for authority.
             */
            get: function () {
                return this.canonicalAuthorityUrlComponents.PathSegments[0];
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(Authority.prototype, "authorizationEndpoint", {
            /**
             * OAuth /authorize endpoint for requests
             */
            get: function () {
                if (this.discoveryComplete()) {
                    var endpoint = this.replacePath(this.metadata.authorization_endpoint);
                    return this.replaceTenant(endpoint);
                }
                else {
                    throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
                }
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(Authority.prototype, "tokenEndpoint", {
            /**
             * OAuth /token endpoint for requests
             */
            get: function () {
                if (this.discoveryComplete()) {
                    var endpoint = this.replacePath(this.metadata.token_endpoint);
                    return this.replaceTenant(endpoint);
                }
                else {
                    throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
                }
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(Authority.prototype, "deviceCodeEndpoint", {
            get: function () {
                if (this.discoveryComplete()) {
                    var endpoint = this.replacePath(this.metadata.token_endpoint.replace("/token", "/devicecode"));
                    return this.replaceTenant(endpoint);
                }
                else {
                    throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
                }
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(Authority.prototype, "endSessionEndpoint", {
            /**
             * OAuth logout endpoint for requests
             */
            get: function () {
                if (this.discoveryComplete()) {
                    // ROPC policies may not have end_session_endpoint set
                    if (!this.metadata.end_session_endpoint) {
                        throw ClientAuthError.createLogoutNotSupportedError();
                    }
                    var endpoint = this.replacePath(this.metadata.end_session_endpoint);
                    return this.replaceTenant(endpoint);
                }
                else {
                    throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
                }
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(Authority.prototype, "selfSignedJwtAudience", {
            /**
             * OAuth issuer for requests
             */
            get: function () {
                if (this.discoveryComplete()) {
                    var endpoint = this.replacePath(this.metadata.issuer);
                    return this.replaceTenant(endpoint);
                }
                else {
                    throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
                }
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(Authority.prototype, "jwksUri", {
            /**
             * Jwks_uri for token signing keys
             */
            get: function () {
                if (this.discoveryComplete()) {
                    var endpoint = this.replacePath(this.metadata.jwks_uri);
                    return this.replaceTenant(endpoint);
                }
                else {
                    throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
                }
            },
            enumerable: false,
            configurable: true
        });
        /**
         * Replaces tenant in url path with current tenant. Defaults to common.
         * @param urlString
         */
        Authority.prototype.replaceTenant = function (urlString) {
            return urlString.replace(/{tenant}|{tenantid}/g, this.tenant);
        };
        /**
         * Replaces path such as tenant or policy with the current tenant or policy.
         * @param urlString
         */
        Authority.prototype.replacePath = function (urlString) {
            var endpoint = urlString;
            var cachedAuthorityUrl = new UrlString(this.metadata.canonical_authority);
            var cachedAuthorityParts = cachedAuthorityUrl.getUrlComponents().PathSegments;
            var currentAuthorityParts = this.canonicalAuthorityUrlComponents.PathSegments;
            currentAuthorityParts.forEach(function (currentPart, index) {
                var cachedPart = cachedAuthorityParts[index];
                if (currentPart !== cachedPart) {
                    endpoint = endpoint.replace("/" + cachedPart + "/", "/" + currentPart + "/");
                }
            });
            return endpoint;
        };
        Object.defineProperty(Authority.prototype, "defaultOpenIdConfigurationEndpoint", {
            /**
             * The default open id configuration endpoint for any canonical authority.
             */
            get: function () {
                if (this.authorityType === AuthorityType.Adfs || this.protocolMode === exports.ProtocolMode.OIDC) {
                    return this.canonicalAuthority + ".well-known/openid-configuration";
                }
                return this.canonicalAuthority + "v2.0/.well-known/openid-configuration";
            },
            enumerable: false,
            configurable: true
        });
        /**
         * Boolean that returns whethr or not tenant discovery has been completed.
         */
        Authority.prototype.discoveryComplete = function () {
            return !!this.metadata;
        };
        /**
         * Perform endpoint discovery to discover aliases, preferred_cache, preferred_network
         * and the /authorize, /token and logout endpoints.
         */
        Authority.prototype.resolveEndpointsAsync = function () {
            return __awaiter(this, void 0, void 0, function () {
                var metadataEntity, cloudDiscoverySource, endpointSource, cacheKey;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            metadataEntity = this.cacheManager.getAuthorityMetadataByAlias(this.hostnameAndPort);
                            if (!metadataEntity) {
                                metadataEntity = new AuthorityMetadataEntity();
                                metadataEntity.updateCanonicalAuthority(this.canonicalAuthority);
                            }
                            return [4 /*yield*/, this.updateCloudDiscoveryMetadata(metadataEntity)];
                        case 1:
                            cloudDiscoverySource = _a.sent();
                            this.canonicalAuthority = this.canonicalAuthority.replace(this.hostnameAndPort, metadataEntity.preferred_network);
                            return [4 /*yield*/, this.updateEndpointMetadata(metadataEntity)];
                        case 2:
                            endpointSource = _a.sent();
                            if (cloudDiscoverySource !== AuthorityMetadataSource.CACHE && endpointSource !== AuthorityMetadataSource.CACHE) {
                                // Reset the expiration time unless both values came from a successful cache lookup
                                metadataEntity.resetExpiresAt();
                                metadataEntity.updateCanonicalAuthority(this.canonicalAuthority);
                            }
                            cacheKey = this.cacheManager.generateAuthorityMetadataCacheKey(metadataEntity.preferred_cache);
                            this.cacheManager.setAuthorityMetadata(cacheKey, metadataEntity);
                            this.metadata = metadataEntity;
                            return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * Update AuthorityMetadataEntity with new endpoints and return where the information came from
         * @param metadataEntity
         */
        Authority.prototype.updateEndpointMetadata = function (metadataEntity) {
            var _a, _b;
            return __awaiter(this, void 0, void 0, function () {
                var metadata, harcodedMetadata;
                return __generator(this, function (_c) {
                    switch (_c.label) {
                        case 0:
                            metadata = this.getEndpointMetadataFromConfig();
                            if (metadata) {
                                metadataEntity.updateEndpointMetadata(metadata, false);
                                return [2 /*return*/, AuthorityMetadataSource.CONFIG];
                            }
                            if (this.isAuthoritySameType(metadataEntity) && metadataEntity.endpointsFromNetwork && !metadataEntity.isExpired()) {
                                // No need to update
                                return [2 /*return*/, AuthorityMetadataSource.CACHE];
                            }
                            harcodedMetadata = this.getEndpointMetadataFromHardcodedValues();
                            return [4 /*yield*/, this.getEndpointMetadataFromNetwork()];
                        case 1:
                            metadata = _c.sent();
                            if (!metadata) return [3 /*break*/, 4];
                            if (!((_a = this.authorityOptions.azureRegionConfiguration) === null || _a === void 0 ? void 0 : _a.azureRegion)) return [3 /*break*/, 3];
                            return [4 /*yield*/, this.updateMetadataWithRegionalInformation(metadata)];
                        case 2:
                            metadata = _c.sent();
                            _c.label = 3;
                        case 3:
                            metadataEntity.updateEndpointMetadata(metadata, true);
                            return [2 /*return*/, AuthorityMetadataSource.NETWORK];
                        case 4:
                            if (!(harcodedMetadata && !this.authorityOptions.skipAuthorityMetadataCache)) return [3 /*break*/, 7];
                            if (!((_b = this.authorityOptions.azureRegionConfiguration) === null || _b === void 0 ? void 0 : _b.azureRegion)) return [3 /*break*/, 6];
                            return [4 /*yield*/, this.updateMetadataWithRegionalInformation(harcodedMetadata)];
                        case 5:
                            harcodedMetadata = _c.sent();
                            _c.label = 6;
                        case 6:
                            metadataEntity.updateEndpointMetadata(harcodedMetadata, false);
                            return [2 /*return*/, AuthorityMetadataSource.HARDCODED_VALUES];
                        case 7: throw ClientAuthError.createUnableToGetOpenidConfigError(this.defaultOpenIdConfigurationEndpoint);
                    }
                });
            });
        };
        /**
         * Compares the number of url components after the domain to determine if the cached authority metadata can be used for the requested authority
         * Protects against same domain different authority such as login.microsoftonline.com/tenant and login.microsoftonline.com/tfp/tenant/policy
         * @param metadataEntity
         */
        Authority.prototype.isAuthoritySameType = function (metadataEntity) {
            var cachedAuthorityUrl = new UrlString(metadataEntity.canonical_authority);
            var cachedParts = cachedAuthorityUrl.getUrlComponents().PathSegments;
            return cachedParts.length === this.canonicalAuthorityUrlComponents.PathSegments.length;
        };
        /**
         * Parse authorityMetadata config option
         */
        Authority.prototype.getEndpointMetadataFromConfig = function () {
            if (this.authorityOptions.authorityMetadata) {
                try {
                    return JSON.parse(this.authorityOptions.authorityMetadata);
                }
                catch (e) {
                    throw ClientConfigurationError.createInvalidAuthorityMetadataError();
                }
            }
            return null;
        };
        /**
         * Gets OAuth endpoints from the given OpenID configuration endpoint.
         *
         * @param hasHardcodedMetadata boolean
         */
        Authority.prototype.getEndpointMetadataFromNetwork = function () {
            return __awaiter(this, void 0, void 0, function () {
                var options, response;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            options = {};
                            if (this.proxyUrl) {
                                options.proxyUrl = this.proxyUrl;
                            }
                            _a.label = 1;
                        case 1:
                            _a.trys.push([1, 3, , 4]);
                            return [4 /*yield*/, this.networkInterface.sendGetRequestAsync(this.defaultOpenIdConfigurationEndpoint, options)];
                        case 2:
                            response = _a.sent();
                            return [2 /*return*/, isOpenIdConfigResponse(response.body) ? response.body : null];
                        case 3:
                            _a.sent();
                            return [2 /*return*/, null];
                        case 4: return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * Get OAuth endpoints for common authorities.
         */
        Authority.prototype.getEndpointMetadataFromHardcodedValues = function () {
            if (this.canonicalAuthority in EndpointMetadata) {
                return EndpointMetadata[this.canonicalAuthority];
            }
            return null;
        };
        /**
         * Update the retrieved metadata with regional information.
         */
        Authority.prototype.updateMetadataWithRegionalInformation = function (metadata) {
            var _a, _b, _c, _d, _e;
            return __awaiter(this, void 0, void 0, function () {
                var autodetectedRegionName, azureRegion;
                return __generator(this, function (_f) {
                    switch (_f.label) {
                        case 0: return [4 /*yield*/, this.regionDiscovery.detectRegion((_a = this.authorityOptions.azureRegionConfiguration) === null || _a === void 0 ? void 0 : _a.environmentRegion, this.regionDiscoveryMetadata, this.proxyUrl)];
                        case 1:
                            autodetectedRegionName = _f.sent();
                            azureRegion = ((_b = this.authorityOptions.azureRegionConfiguration) === null || _b === void 0 ? void 0 : _b.azureRegion) === Constants.AZURE_REGION_AUTO_DISCOVER_FLAG
                                ? autodetectedRegionName
                                : (_c = this.authorityOptions.azureRegionConfiguration) === null || _c === void 0 ? void 0 : _c.azureRegion;
                            if (((_d = this.authorityOptions.azureRegionConfiguration) === null || _d === void 0 ? void 0 : _d.azureRegion) === Constants.AZURE_REGION_AUTO_DISCOVER_FLAG) {
                                this.regionDiscoveryMetadata.region_outcome = autodetectedRegionName ?
                                    RegionDiscoveryOutcomes.AUTO_DETECTION_REQUESTED_SUCCESSFUL :
                                    RegionDiscoveryOutcomes.AUTO_DETECTION_REQUESTED_FAILED;
                            }
                            else {
                                if (autodetectedRegionName) {
                                    this.regionDiscoveryMetadata.region_outcome = (((_e = this.authorityOptions.azureRegionConfiguration) === null || _e === void 0 ? void 0 : _e.azureRegion) === autodetectedRegionName) ?
                                        RegionDiscoveryOutcomes.CONFIGURED_MATCHES_DETECTED :
                                        RegionDiscoveryOutcomes.CONFIGURED_NOT_DETECTED;
                                }
                                else {
                                    this.regionDiscoveryMetadata.region_outcome = RegionDiscoveryOutcomes.CONFIGURED_NO_AUTO_DETECTION;
                                }
                            }
                            if (azureRegion) {
                                this.regionDiscoveryMetadata.region_used = azureRegion;
                                return [2 /*return*/, Authority.replaceWithRegionalInformation(metadata, azureRegion)];
                            }
                            return [2 /*return*/, metadata];
                    }
                });
            });
        };
        /**
         * Updates the AuthorityMetadataEntity with new aliases, preferred_network and preferred_cache and returns where the information was retrived from
         * @param cachedMetadata
         * @param newMetadata
         */
        Authority.prototype.updateCloudDiscoveryMetadata = function (metadataEntity) {
            return __awaiter(this, void 0, void 0, function () {
                var metadata, harcodedMetadata;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            metadata = this.getCloudDiscoveryMetadataFromConfig();
                            if (metadata) {
                                metadataEntity.updateCloudDiscoveryMetadata(metadata, false);
                                return [2 /*return*/, AuthorityMetadataSource.CONFIG];
                            }
                            // If The cached metadata came from config but that config was not passed to this instance, we must go to the network
                            if (this.isAuthoritySameType(metadataEntity) && metadataEntity.aliasesFromNetwork && !metadataEntity.isExpired()) {
                                // No need to update
                                return [2 /*return*/, AuthorityMetadataSource.CACHE];
                            }
                            harcodedMetadata = this.getCloudDiscoveryMetadataFromHarcodedValues();
                            return [4 /*yield*/, this.getCloudDiscoveryMetadataFromNetwork()];
                        case 1:
                            metadata = _a.sent();
                            if (metadata) {
                                metadataEntity.updateCloudDiscoveryMetadata(metadata, true);
                                return [2 /*return*/, AuthorityMetadataSource.NETWORK];
                            }
                            if (harcodedMetadata && !this.options.skipAuthorityMetadataCache) {
                                metadataEntity.updateCloudDiscoveryMetadata(harcodedMetadata, false);
                                return [2 /*return*/, AuthorityMetadataSource.HARDCODED_VALUES];
                            }
                            else {
                                // Metadata could not be obtained from config, cache or network
                                throw ClientConfigurationError.createUntrustedAuthorityError();
                            }
                    }
                });
            });
        };
        /**
         * Parse cloudDiscoveryMetadata config or check knownAuthorities
         */
        Authority.prototype.getCloudDiscoveryMetadataFromConfig = function () {
            // Check if network response was provided in config
            if (this.authorityOptions.cloudDiscoveryMetadata) {
                try {
                    var parsedResponse = JSON.parse(this.authorityOptions.cloudDiscoveryMetadata);
                    var metadata = Authority.getCloudDiscoveryMetadataFromNetworkResponse(parsedResponse.metadata, this.hostnameAndPort);
                    if (metadata) {
                        return metadata;
                    }
                }
                catch (e) {
                    throw ClientConfigurationError.createInvalidCloudDiscoveryMetadataError();
                }
            }
            // If cloudDiscoveryMetadata is empty or does not contain the host, check knownAuthorities
            if (this.isInKnownAuthorities()) {
                return Authority.createCloudDiscoveryMetadataFromHost(this.hostnameAndPort);
            }
            return null;
        };
        /**
         * Called to get metadata from network if CloudDiscoveryMetadata was not populated by config
         *
         * @param hasHardcodedMetadata boolean
         */
        Authority.prototype.getCloudDiscoveryMetadataFromNetwork = function () {
            return __awaiter(this, void 0, void 0, function () {
                var instanceDiscoveryEndpoint, options, match, response, metadata;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            instanceDiscoveryEndpoint = "" + Constants.AAD_INSTANCE_DISCOVERY_ENDPT + this.canonicalAuthority + "oauth2/v2.0/authorize";
                            options = {};
                            if (this.proxyUrl) {
                                options.proxyUrl = this.proxyUrl;
                            }
                            match = null;
                            _a.label = 1;
                        case 1:
                            _a.trys.push([1, 3, , 4]);
                            return [4 /*yield*/, this.networkInterface.sendGetRequestAsync(instanceDiscoveryEndpoint, options)];
                        case 2:
                            response = _a.sent();
                            metadata = isCloudInstanceDiscoveryResponse(response.body)
                                ? response.body.metadata
                                : [];
                            if (metadata.length === 0) {
                                // If no metadata is returned, authority is untrusted
                                return [2 /*return*/, null];
                            }
                            match = Authority.getCloudDiscoveryMetadataFromNetworkResponse(metadata, this.hostnameAndPort);
                            return [3 /*break*/, 4];
                        case 3:
                            _a.sent();
                            return [2 /*return*/, null];
                        case 4:
                            if (!match) {
                                // Custom Domain scenario, host is trusted because Instance Discovery call succeeded
                                match = Authority.createCloudDiscoveryMetadataFromHost(this.hostnameAndPort);
                            }
                            return [2 /*return*/, match];
                    }
                });
            });
        };
        /**
         * Get cloud discovery metadata for common authorities
         */
        Authority.prototype.getCloudDiscoveryMetadataFromHarcodedValues = function () {
            if (this.canonicalAuthority in InstanceDiscoveryMetadata) {
                return InstanceDiscoveryMetadata[this.canonicalAuthority];
            }
            return null;
        };
        /**
         * Helper function to determine if this host is included in the knownAuthorities config option
         */
        Authority.prototype.isInKnownAuthorities = function () {
            var _this = this;
            var matches = this.authorityOptions.knownAuthorities.filter(function (authority) {
                return UrlString.getDomainFromUrl(authority).toLowerCase() === _this.hostnameAndPort;
            });
            return matches.length > 0;
        };
        /**
         * helper function to populate the authority based on azureCloudOptions
         * @param authorityString
         * @param azureCloudOptions
         */
        Authority.generateAuthority = function (authorityString, azureCloudOptions) {
            var authorityAzureCloudInstance;
            if (azureCloudOptions && azureCloudOptions.azureCloudInstance !== exports.AzureCloudInstance.None) {
                var tenant = azureCloudOptions.tenant ? azureCloudOptions.tenant : Constants.DEFAULT_COMMON_TENANT;
                authorityAzureCloudInstance = azureCloudOptions.azureCloudInstance + "/" + tenant + "/";
            }
            return authorityAzureCloudInstance ? authorityAzureCloudInstance : authorityString;
        };
        /**
         * Creates cloud discovery metadata object from a given host
         * @param host
         */
        Authority.createCloudDiscoveryMetadataFromHost = function (host) {
            return {
                preferred_network: host,
                preferred_cache: host,
                aliases: [host]
            };
        };
        /**
         * Searches instance discovery network response for the entry that contains the host in the aliases list
         * @param response
         * @param authority
         */
        Authority.getCloudDiscoveryMetadataFromNetworkResponse = function (response, authority) {
            for (var i = 0; i < response.length; i++) {
                var metadata = response[i];
                if (metadata.aliases.indexOf(authority) > -1) {
                    return metadata;
                }
            }
            return null;
        };
        /**
         * helper function to generate environment from authority object
         */
        Authority.prototype.getPreferredCache = function () {
            if (this.discoveryComplete()) {
                return this.metadata.preferred_cache;
            }
            else {
                throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
            }
        };
        /**
         * Returns whether or not the provided host is an alias of this authority instance
         * @param host
         */
        Authority.prototype.isAlias = function (host) {
            return this.metadata.aliases.indexOf(host) > -1;
        };
        /**
         * Checks whether the provided host is that of a public cloud authority
         *
         * @param authority string
         * @returns bool
         */
        Authority.isPublicCloudAuthority = function (host) {
            return Constants.KNOWN_PUBLIC_CLOUDS.indexOf(host) >= 0;
        };
        /**
         * Rebuild the authority string with the region
         *
         * @param host string
         * @param region string
         */
        Authority.buildRegionalAuthorityString = function (host, region, queryString) {
            // Create and validate a Url string object with the initial authority string
            var authorityUrlInstance = new UrlString(host);
            authorityUrlInstance.validateAsUri();
            var authorityUrlParts = authorityUrlInstance.getUrlComponents();
            var hostNameAndPort = region + "." + authorityUrlParts.HostNameAndPort;
            if (this.isPublicCloudAuthority(authorityUrlParts.HostNameAndPort)) {
                hostNameAndPort = region + "." + Constants.REGIONAL_AUTH_PUBLIC_CLOUD_SUFFIX;
            }
            // Include the query string portion of the url
            var url = UrlString.constructAuthorityUriFromObject(__assign(__assign({}, authorityUrlInstance.getUrlComponents()), { HostNameAndPort: hostNameAndPort })).urlString;
            // Add the query string if a query string was provided
            if (queryString)
                return url + "?" + queryString;
            return url;
        };
        /**
         * Replace the endpoints in the metadata object with their regional equivalents.
         *
         * @param metadata OpenIdConfigResponse
         * @param azureRegion string
         */
        Authority.replaceWithRegionalInformation = function (metadata, azureRegion) {
            metadata.authorization_endpoint = Authority.buildRegionalAuthorityString(metadata.authorization_endpoint, azureRegion);
            // TODO: Enquire on whether we should leave the query string or remove it before releasing the feature
            metadata.token_endpoint = Authority.buildRegionalAuthorityString(metadata.token_endpoint, azureRegion, "allowestsrnonmsi=true");
            if (metadata.end_session_endpoint) {
                metadata.end_session_endpoint = Authority.buildRegionalAuthorityString(metadata.end_session_endpoint, azureRegion);
            }
            return metadata;
        };
        return Authority;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var AuthorityFactory = /** @class */ (function () {
        function AuthorityFactory() {
        }
        /**
         * Create an authority object of the correct type based on the url
         * Performs basic authority validation - checks to see if the authority is of a valid type (i.e. aad, b2c, adfs)
         *
         * Also performs endpoint discovery.
         *
         * @param authorityUri
         * @param networkClient
         * @param protocolMode
         */
        AuthorityFactory.createDiscoveredInstance = function (authorityUri, networkClient, cacheManager, authorityOptions, proxyUrl) {
            return __awaiter(this, void 0, void 0, function () {
                var acquireTokenAuthority, e_1;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            acquireTokenAuthority = AuthorityFactory.createInstance(authorityUri, networkClient, cacheManager, authorityOptions, proxyUrl);
                            _a.label = 1;
                        case 1:
                            _a.trys.push([1, 3, , 4]);
                            return [4 /*yield*/, acquireTokenAuthority.resolveEndpointsAsync()];
                        case 2:
                            _a.sent();
                            return [2 /*return*/, acquireTokenAuthority];
                        case 3:
                            e_1 = _a.sent();
                            throw ClientAuthError.createEndpointDiscoveryIncompleteError(e_1);
                        case 4: return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * Create an authority object of the correct type based on the url
         * Performs basic authority validation - checks to see if the authority is of a valid type (i.e. aad, b2c, adfs)
         *
         * Does not perform endpoint discovery.
         *
         * @param authorityUrl
         * @param networkInterface
         * @param protocolMode
         */
        AuthorityFactory.createInstance = function (authorityUrl, networkInterface, cacheManager, authorityOptions, proxyUrl) {
            // Throw error if authority url is empty
            if (StringUtils.isEmpty(authorityUrl)) {
                throw ClientConfigurationError.createUrlEmptyError();
            }
            return new Authority(authorityUrl, networkInterface, cacheManager, authorityOptions, proxyUrl);
        };
        return AuthorityFactory;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var ServerTelemetryEntity = /** @class */ (function () {
        function ServerTelemetryEntity() {
            this.failedRequests = [];
            this.errors = [];
            this.cacheHits = 0;
        }
        /**
         * validates if a given cache entry is "Telemetry", parses <key,value>
         * @param key
         * @param entity
         */
        ServerTelemetryEntity.isServerTelemetryEntity = function (key, entity) {
            var validateKey = key.indexOf(SERVER_TELEM_CONSTANTS.CACHE_KEY) === 0;
            var validateEntity = true;
            if (entity) {
                validateEntity =
                    entity.hasOwnProperty("failedRequests") &&
                        entity.hasOwnProperty("errors") &&
                        entity.hasOwnProperty("cacheHits");
            }
            return validateKey && validateEntity;
        };
        return ServerTelemetryEntity;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var ThrottlingEntity = /** @class */ (function () {
        function ThrottlingEntity() {
        }
        /**
         * validates if a given cache entry is "Throttling", parses <key,value>
         * @param key
         * @param entity
         */
        ThrottlingEntity.isThrottlingEntity = function (key, entity) {
            var validateKey = false;
            if (key) {
                validateKey = key.indexOf(ThrottlingConstants.THROTTLING_PREFIX) === 0;
            }
            var validateEntity = true;
            if (entity) {
                validateEntity = entity.hasOwnProperty("throttleTime");
            }
            return validateKey && validateEntity;
        };
        return ThrottlingEntity;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var StubbedNetworkModule = {
        sendGetRequestAsync: function () {
            var notImplErr = "Network interface - sendGetRequestAsync() has not been implemented for the Network interface.";
            return Promise.reject(AuthError.createUnexpectedError(notImplErr));
        },
        sendPostRequestAsync: function () {
            var notImplErr = "Network interface - sendPostRequestAsync() has not been implemented for the Network interface.";
            return Promise.reject(AuthError.createUnexpectedError(notImplErr));
        }
    };

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * ClientAuthErrorMessage class containing string constants used by error codes and messages.
     */
    var JoseHeaderErrorMessage = {
        missingKidError: {
            code: "missing_kid_error",
            desc: "The JOSE Header for the requested JWT, JWS or JWK object requires a keyId to be configured as the 'kid' header claim. No 'kid' value was provided."
        },
        missingAlgError: {
            code: "missing_alg_error",
            desc: "The JOSE Header for the requested JWT, JWS or JWK object requires an algorithm to be specified as the 'alg' header claim. No 'alg' value was provided."
        },
    };
    /**
     * Error thrown when there is an error in the client code running on the browser.
     */
    var JoseHeaderError = /** @class */ (function (_super) {
        __extends(JoseHeaderError, _super);
        function JoseHeaderError(errorCode, errorMessage) {
            var _this = _super.call(this, errorCode, errorMessage) || this;
            _this.name = "JoseHeaderError";
            Object.setPrototypeOf(_this, JoseHeaderError.prototype);
            return _this;
        }
        /**
         * Creates an error thrown when keyId isn't set on JOSE header.
         */
        JoseHeaderError.createMissingKidError = function () {
            return new JoseHeaderError(JoseHeaderErrorMessage.missingKidError.code, JoseHeaderErrorMessage.missingKidError.desc);
        };
        /**
         * Creates an error thrown when algorithm isn't set on JOSE header.
         */
        JoseHeaderError.createMissingAlgError = function () {
            return new JoseHeaderError(JoseHeaderErrorMessage.missingAlgError.code, JoseHeaderErrorMessage.missingAlgError.desc);
        };
        return JoseHeaderError;
    }(AuthError));

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var JoseHeader = /** @class */ (function () {
        function JoseHeader(options) {
            this.typ = options.typ;
            this.alg = options.alg;
            this.kid = options.kid;
        }
        /**
         * Builds SignedHttpRequest formatted JOSE Header from the
         * JOSE Header options provided or previously set on the object and returns
         * the stringified header object.
         * Throws if keyId or algorithm aren't provided since they are required for Access Token Binding.
         * @param shrHeaderOptions
         * @returns
         */
        JoseHeader.getShrHeaderString = function (shrHeaderOptions) {
            // KeyID is required on the SHR header
            if (!shrHeaderOptions.kid) {
                throw JoseHeaderError.createMissingKidError();
            }
            // Alg is required on the SHR header
            if (!shrHeaderOptions.alg) {
                throw JoseHeaderError.createMissingAlgError();
            }
            var shrHeader = new JoseHeader({
                // Access Token PoP headers must have type JWT, but the type header can be overriden for special cases
                typ: shrHeaderOptions.typ || JsonTypes.Jwt,
                kid: shrHeaderOptions.kid,
                alg: shrHeaderOptions.alg
            });
            return JSON.stringify(shrHeader);
        };
        return JoseHeader;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * This is a helper class that parses supported HTTP response authentication headers to extract and return
     * header challenge values that can be used outside the basic authorization flows.
     */
    var AuthenticationHeaderParser = /** @class */ (function () {
        function AuthenticationHeaderParser(headers) {
            this.headers = headers;
        }
        /**
         * This method parses the SHR nonce value out of either the Authentication-Info or WWW-Authenticate authentication headers.
         * @returns
         */
        AuthenticationHeaderParser.prototype.getShrNonce = function () {
            // Attempt to parse nonce from Authentiacation-Info
            var authenticationInfo = this.headers[HeaderNames.AuthenticationInfo];
            if (authenticationInfo) {
                var authenticationInfoChallenges = this.parseChallenges(authenticationInfo);
                if (authenticationInfoChallenges.nextnonce) {
                    return authenticationInfoChallenges.nextnonce;
                }
                throw ClientConfigurationError.createInvalidAuthenticationHeaderError(HeaderNames.AuthenticationInfo, "nextnonce challenge is missing.");
            }
            // Attempt to parse nonce from WWW-Authenticate
            var wwwAuthenticate = this.headers[HeaderNames.WWWAuthenticate];
            if (wwwAuthenticate) {
                var wwwAuthenticateChallenges = this.parseChallenges(wwwAuthenticate);
                if (wwwAuthenticateChallenges.nonce) {
                    return wwwAuthenticateChallenges.nonce;
                }
                throw ClientConfigurationError.createInvalidAuthenticationHeaderError(HeaderNames.WWWAuthenticate, "nonce challenge is missing.");
            }
            // If neither header is present, throw missing headers error
            throw ClientConfigurationError.createMissingNonceAuthenticationHeadersError();
        };
        /**
         * Parses an HTTP header's challenge set into a key/value map.
         * @param header
         * @returns
         */
        AuthenticationHeaderParser.prototype.parseChallenges = function (header) {
            var schemeSeparator = header.indexOf(" ");
            var challenges = header.substr(schemeSeparator + 1).split(",");
            var challengeMap = {};
            challenges.forEach(function (challenge) {
                var _a = challenge.split("="), key = _a[0], value = _a[1];
                // Remove escaped quotation marks (', ") from challenge string to keep only the challenge value
                challengeMap[key] = unescape(value.replace(/['"]+/g, Constants.EMPTY_STRING));
            });
            return challengeMap;
        };
        return AuthenticationHeaderParser;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var ServerTelemetryManager = /** @class */ (function () {
        function ServerTelemetryManager(telemetryRequest, cacheManager) {
            this.cacheOutcome = CacheOutcome.NO_CACHE_HIT;
            this.cacheManager = cacheManager;
            this.apiId = telemetryRequest.apiId;
            this.correlationId = telemetryRequest.correlationId;
            this.wrapperSKU = telemetryRequest.wrapperSKU || Constants.EMPTY_STRING;
            this.wrapperVer = telemetryRequest.wrapperVer || Constants.EMPTY_STRING;
            this.telemetryCacheKey = SERVER_TELEM_CONSTANTS.CACHE_KEY + Separators.CACHE_KEY_SEPARATOR + telemetryRequest.clientId;
        }
        /**
         * API to add MSER Telemetry to request
         */
        ServerTelemetryManager.prototype.generateCurrentRequestHeaderValue = function () {
            var request = "" + this.apiId + SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR + this.cacheOutcome;
            var platformFields = [this.wrapperSKU, this.wrapperVer].join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);
            var regionDiscoveryFields = this.getRegionDiscoveryFields();
            var requestWithRegionDiscoveryFields = [request, regionDiscoveryFields].join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);
            return [SERVER_TELEM_CONSTANTS.SCHEMA_VERSION, requestWithRegionDiscoveryFields, platformFields].join(SERVER_TELEM_CONSTANTS.CATEGORY_SEPARATOR);
        };
        /**
         * API to add MSER Telemetry for the last failed request
         */
        ServerTelemetryManager.prototype.generateLastRequestHeaderValue = function () {
            var lastRequests = this.getLastRequests();
            var maxErrors = ServerTelemetryManager.maxErrorsToSend(lastRequests);
            var failedRequests = lastRequests.failedRequests.slice(0, 2 * maxErrors).join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);
            var errors = lastRequests.errors.slice(0, maxErrors).join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);
            var errorCount = lastRequests.errors.length;
            // Indicate whether this header contains all data or partial data
            var overflow = maxErrors < errorCount ? SERVER_TELEM_CONSTANTS.OVERFLOW_TRUE : SERVER_TELEM_CONSTANTS.OVERFLOW_FALSE;
            var platformFields = [errorCount, overflow].join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);
            return [SERVER_TELEM_CONSTANTS.SCHEMA_VERSION, lastRequests.cacheHits, failedRequests, errors, platformFields].join(SERVER_TELEM_CONSTANTS.CATEGORY_SEPARATOR);
        };
        /**
         * API to cache token failures for MSER data capture
         * @param error
         */
        ServerTelemetryManager.prototype.cacheFailedRequest = function (error) {
            var lastRequests = this.getLastRequests();
            if (lastRequests.errors.length >= SERVER_TELEM_CONSTANTS.MAX_CACHED_ERRORS) {
                // Remove a cached error to make room, first in first out
                lastRequests.failedRequests.shift(); // apiId
                lastRequests.failedRequests.shift(); // correlationId
                lastRequests.errors.shift();
            }
            lastRequests.failedRequests.push(this.apiId, this.correlationId);
            if (!StringUtils.isEmpty(error.subError)) {
                lastRequests.errors.push(error.subError);
            }
            else if (!StringUtils.isEmpty(error.errorCode)) {
                lastRequests.errors.push(error.errorCode);
            }
            else if (!!error && error.toString()) {
                lastRequests.errors.push(error.toString());
            }
            else {
                lastRequests.errors.push(SERVER_TELEM_CONSTANTS.UNKNOWN_ERROR);
            }
            this.cacheManager.setServerTelemetry(this.telemetryCacheKey, lastRequests);
            return;
        };
        /**
         * Update server telemetry cache entry by incrementing cache hit counter
         */
        ServerTelemetryManager.prototype.incrementCacheHits = function () {
            var lastRequests = this.getLastRequests();
            lastRequests.cacheHits += 1;
            this.cacheManager.setServerTelemetry(this.telemetryCacheKey, lastRequests);
            return lastRequests.cacheHits;
        };
        /**
         * Get the server telemetry entity from cache or initialize a new one
         */
        ServerTelemetryManager.prototype.getLastRequests = function () {
            var initialValue = new ServerTelemetryEntity();
            var lastRequests = this.cacheManager.getServerTelemetry(this.telemetryCacheKey);
            return lastRequests || initialValue;
        };
        /**
         * Remove server telemetry cache entry
         */
        ServerTelemetryManager.prototype.clearTelemetryCache = function () {
            var lastRequests = this.getLastRequests();
            var numErrorsFlushed = ServerTelemetryManager.maxErrorsToSend(lastRequests);
            var errorCount = lastRequests.errors.length;
            if (numErrorsFlushed === errorCount) {
                // All errors were sent on last request, clear Telemetry cache
                this.cacheManager.removeItem(this.telemetryCacheKey);
            }
            else {
                // Partial data was flushed to server, construct a new telemetry cache item with errors that were not flushed
                var serverTelemEntity = new ServerTelemetryEntity();
                serverTelemEntity.failedRequests = lastRequests.failedRequests.slice(numErrorsFlushed * 2); // failedRequests contains 2 items for each error
                serverTelemEntity.errors = lastRequests.errors.slice(numErrorsFlushed);
                this.cacheManager.setServerTelemetry(this.telemetryCacheKey, serverTelemEntity);
            }
        };
        /**
         * Returns the maximum number of errors that can be flushed to the server in the next network request
         * @param serverTelemetryEntity
         */
        ServerTelemetryManager.maxErrorsToSend = function (serverTelemetryEntity) {
            var i;
            var maxErrors = 0;
            var dataSize = 0;
            var errorCount = serverTelemetryEntity.errors.length;
            for (i = 0; i < errorCount; i++) {
                // failedRequests parameter contains pairs of apiId and correlationId, multiply index by 2 to preserve pairs
                var apiId = serverTelemetryEntity.failedRequests[2 * i] || Constants.EMPTY_STRING;
                var correlationId = serverTelemetryEntity.failedRequests[2 * i + 1] || Constants.EMPTY_STRING;
                var errorCode = serverTelemetryEntity.errors[i] || Constants.EMPTY_STRING;
                // Count number of characters that would be added to header, each character is 1 byte. Add 3 at the end to account for separators
                dataSize += apiId.toString().length + correlationId.toString().length + errorCode.length + 3;
                if (dataSize < SERVER_TELEM_CONSTANTS.MAX_LAST_HEADER_BYTES) {
                    // Adding this entry to the header would still keep header size below the limit
                    maxErrors += 1;
                }
                else {
                    break;
                }
            }
            return maxErrors;
        };
        /**
         * Get the region discovery fields
         *
         * @returns string
         */
        ServerTelemetryManager.prototype.getRegionDiscoveryFields = function () {
            var regionDiscoveryFields = [];
            regionDiscoveryFields.push(this.regionUsed || Constants.EMPTY_STRING);
            regionDiscoveryFields.push(this.regionSource || Constants.EMPTY_STRING);
            regionDiscoveryFields.push(this.regionOutcome || Constants.EMPTY_STRING);
            return regionDiscoveryFields.join(",");
        };
        /**
         * Update the region discovery metadata
         *
         * @param regionDiscoveryMetadata
         * @returns void
         */
        ServerTelemetryManager.prototype.updateRegionDiscoveryMetadata = function (regionDiscoveryMetadata) {
            this.regionUsed = regionDiscoveryMetadata.region_used;
            this.regionSource = regionDiscoveryMetadata.region_source;
            this.regionOutcome = regionDiscoveryMetadata.region_outcome;
        };
        /**
         * Set cache outcome
         */
        ServerTelemetryManager.prototype.setCacheOutcome = function (cacheOutcome) {
            this.cacheOutcome = cacheOutcome;
        };
        return ServerTelemetryManager;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var PerformanceClient = /** @class */ (function () {
        /**
         * Creates an instance of PerformanceClient,
         * an abstract class containing core performance telemetry logic.
         *
         * @constructor
         * @param {string} clientId Client ID of the application
         * @param {string} authority Authority used by the application
         * @param {Logger} logger Logger used by the application
         * @param {string} libraryName Name of the library
         * @param {string} libraryVersion Version of the library
         */
        function PerformanceClient(clientId, authority, logger, libraryName, libraryVersion, applicationTelemetry) {
            this.authority = authority;
            this.libraryName = libraryName;
            this.libraryVersion = libraryVersion;
            this.applicationTelemetry = applicationTelemetry;
            this.clientId = clientId;
            this.logger = logger;
            this.callbacks = new Map();
            this.eventsByCorrelationId = new Map();
            this.measurementsById = new Map();
        }
        /**
         * Starts measuring performance for a given operation. Returns a function that should be used to end the measurement.
         *
         * @param {PerformanceEvents} measureName
         * @param {?string} [correlationId]
         * @returns {InProgressPerformanceEvent}
         */
        PerformanceClient.prototype.startMeasurement = function (measureName, correlationId) {
            var _this = this;
            var _a, _b;
            // Generate a placeholder correlation if the request does not provide one
            var eventCorrelationId = correlationId || this.generateId();
            if (!correlationId) {
                this.logger.info("PerformanceClient: No correlation id provided for " + measureName + ", generating", eventCorrelationId);
            }
            this.logger.trace("PerformanceClient: Performance measurement started for " + measureName, eventCorrelationId);
            var performanceMeasurement = this.startPerformanceMeasuremeant(measureName, eventCorrelationId);
            performanceMeasurement.startMeasurement();
            var inProgressEvent = {
                eventId: this.generateId(),
                status: PerformanceEventStatus.InProgress,
                authority: this.authority,
                libraryName: this.libraryName,
                libraryVersion: this.libraryVersion,
                appName: (_a = this.applicationTelemetry) === null || _a === void 0 ? void 0 : _a.appName,
                appVersion: (_b = this.applicationTelemetry) === null || _b === void 0 ? void 0 : _b.appVersion,
                clientId: this.clientId,
                name: measureName,
                startTimeMs: Date.now(),
                correlationId: eventCorrelationId,
            };
            // Store in progress events so they can be discarded if not ended properly
            this.cacheEventByCorrelationId(inProgressEvent);
            this.cacheMeasurement(inProgressEvent, performanceMeasurement);
            // Return the event and functions the caller can use to properly end/flush the measurement
            return {
                endMeasurement: function (event) {
                    var completedEvent = _this.endMeasurement(__assign(__assign({}, inProgressEvent), event));
                    if (completedEvent) {
                        // Cache event so that submeasurements can be added downstream
                        _this.cacheEventByCorrelationId(completedEvent);
                    }
                    return completedEvent;
                },
                flushMeasurement: function () {
                    return _this.flushMeasurements(inProgressEvent.name, inProgressEvent.correlationId);
                },
                discardMeasurement: function () {
                    return _this.discardMeasurements(inProgressEvent.correlationId);
                },
                measurement: performanceMeasurement,
                event: inProgressEvent
            };
        };
        /**
         * Stops measuring the performance for an operation. Should only be called directly by PerformanceClient classes,
         * as consumers should instead use the function returned by startMeasurement.
         *
         * @param {PerformanceEvent} event
         * @returns {(PerformanceEvent | null)}
         */
        PerformanceClient.prototype.endMeasurement = function (event) {
            var performanceMeasurement = this.measurementsById.get(event.eventId);
            if (performanceMeasurement) {
                // Immediately delete so that the same event isnt ended twice
                this.measurementsById.delete(event.eventId);
                performanceMeasurement.endMeasurement();
                var durationMs = performanceMeasurement.flushMeasurement();
                // null indicates no measurement was taken (e.g. needed performance APIs not present)
                if (durationMs !== null) {
                    this.logger.trace("PerformanceClient: Performance measurement ended for " + event.name + ": " + durationMs + " ms", event.correlationId);
                    var completedEvent = __assign(__assign({ 
                        // Allow duration to be overwritten when event ends (e.g. testing), but not status
                        durationMs: Math.round(durationMs) }, event), { status: PerformanceEventStatus.Completed });
                    return completedEvent;
                }
                else {
                    this.logger.trace("PerformanceClient: Performance measurement not taken", event.correlationId);
                }
            }
            else {
                this.logger.trace("PerformanceClient: Measurement not found for " + event.eventId, event.correlationId);
            }
            return null;
        };
        /**
         * Upserts event into event cache.
         * First key is the correlation id, second key is the event id.
         * Allows for events to be grouped by correlation id,
         * and to easily allow for properties on them to be updated.
         *
         * @private
         * @param {PerformanceEvent} event
         */
        PerformanceClient.prototype.cacheEventByCorrelationId = function (event) {
            var existingEvents = this.eventsByCorrelationId.get(event.correlationId);
            if (existingEvents) {
                this.logger.trace("PerformanceClient: Performance measurement for " + event.name + " added/updated", event.correlationId);
                existingEvents.set(event.eventId, event);
            }
            else {
                this.logger.trace("PerformanceClient: Performance measurement for " + event.name + " started", event.correlationId);
                this.eventsByCorrelationId.set(event.correlationId, new Map().set(event.eventId, event));
            }
        };
        /**
         * Cache measurements by their id.
         *
         * @private
         * @param {PerformanceEvent} event
         * @param {IPerformanceMeasurement} measurement
         */
        PerformanceClient.prototype.cacheMeasurement = function (event, measurement) {
            this.measurementsById.set(event.eventId, measurement);
        };
        /**
         * Gathers and emits performance events for measurements taked for the given top-level API and correlation ID.
         *
         * @param {PerformanceEvents} measureName
         * @param {string} correlationId
         */
        PerformanceClient.prototype.flushMeasurements = function (measureName, correlationId) {
            var _this = this;
            this.logger.trace("PerformanceClient: Performance measurements flushed for " + measureName, correlationId);
            var eventsForCorrelationId = this.eventsByCorrelationId.get(correlationId);
            if (eventsForCorrelationId) {
                this.discardMeasurements(correlationId);
                /*
                 * Manually end incomplete submeasurements to ensure there arent orphaned/never ending events.
                 * Incomplete submeasurements are likely an instrumentation bug that should be fixed.
                 * IE only supports Map.forEach.
                 */
                var completedEvents_1 = [];
                eventsForCorrelationId.forEach(function (event) {
                    if (event.name !== measureName && event.status !== PerformanceEventStatus.Completed) {
                        _this.logger.trace("PerformanceClient: Incomplete submeasurement " + event.name + " found for " + measureName, correlationId);
                        var completedEvent = _this.endMeasurement(event);
                        if (completedEvent) {
                            completedEvents_1.push(completedEvent);
                        }
                    }
                    completedEvents_1.push(event);
                });
                // Sort events by start time (earliest first)
                var sortedCompletedEvents = completedEvents_1.sort(function (eventA, eventB) { return eventA.startTimeMs - eventB.startTimeMs; });
                // Take completed top level event and add completed submeasurements durations as properties
                var topLevelEvents = sortedCompletedEvents.filter(function (event) { return event.name === measureName && event.status === PerformanceEventStatus.Completed; });
                if (topLevelEvents.length > 0) {
                    /*
                     * Only take the first top-level event if there are multiple events with the same correlation id.
                     * This greatly simplifies logic for submeasurements.
                     */
                    if (topLevelEvents.length > 1) {
                        this.logger.verbose("PerformanceClient: Multiple distinct top-level performance events found, using the first", correlationId);
                    }
                    var topLevelEvent = topLevelEvents[0];
                    this.logger.verbose("PerformanceClient: Measurement found for " + measureName, correlationId);
                    // Build event object with top level and sub measurements
                    var eventToEmit = sortedCompletedEvents.reduce(function (previous, current) {
                        if (current.name !== measureName) {
                            _this.logger.trace("PerformanceClient: Complete submeasurement found for " + current.name, correlationId);
                            // TODO: Emit additional properties for each subMeasurement
                            var subMeasurementName = current.name + "DurationMs";
                            /*
                             * Some code paths, such as resolving an authority, can occur multiple times.
                             * Only take the first measurement, since the second could be read from the cache,
                             * or due to the same correlation id being used for two distinct requests.
                             */
                            if (!previous[subMeasurementName]) {
                                previous[subMeasurementName] = current.durationMs;
                            }
                            else {
                                _this.logger.verbose("PerformanceClient: Submeasurement for " + measureName + " already exists for " + current.name + ", ignoring", correlationId);
                            }
                            if (current.accessTokenSize) {
                                previous.accessTokenSize = current.accessTokenSize;
                            }
                            if (current.idTokenSize) {
                                previous.idTokenSize = current.idTokenSize;
                            }
                        }
                        return previous;
                    }, topLevelEvent);
                    this.emitEvents([eventToEmit], eventToEmit.correlationId);
                }
                else {
                    this.logger.verbose("PerformanceClient: No completed top-level measurements found for " + measureName, correlationId);
                }
            }
            else {
                this.logger.verbose("PerformanceClient: No measurements found", correlationId);
            }
        };
        /**
         * Removes measurements for a given correlation id.
         *
         * @param {string} correlationId
         */
        PerformanceClient.prototype.discardMeasurements = function (correlationId) {
            this.logger.trace("PerformanceClient: Performance measurements discarded", correlationId);
            this.eventsByCorrelationId.delete(correlationId);
        };
        /**
         * Registers a callback function to receive performance events.
         *
         * @param {PerformanceCallbackFunction} callback
         * @returns {string}
         */
        PerformanceClient.prototype.addPerformanceCallback = function (callback) {
            var callbackId = this.generateId();
            this.callbacks.set(callbackId, callback);
            this.logger.verbose("PerformanceClient: Performance callback registered with id: " + callbackId);
            return callbackId;
        };
        /**
         * Removes a callback registered with addPerformanceCallback.
         *
         * @param {string} callbackId
         * @returns {boolean}
         */
        PerformanceClient.prototype.removePerformanceCallback = function (callbackId) {
            var result = this.callbacks.delete(callbackId);
            if (result) {
                this.logger.verbose("PerformanceClient: Performance callback " + callbackId + " removed.");
            }
            else {
                this.logger.verbose("PerformanceClient: Performance callback " + callbackId + " not removed.");
            }
            return result;
        };
        /**
         * Emits events to all registered callbacks.
         *
         * @param {PerformanceEvent[]} events
         * @param {?string} [correlationId]
         */
        PerformanceClient.prototype.emitEvents = function (events, correlationId) {
            var _this = this;
            this.logger.verbose("PerformanceClient: Emitting performance events", correlationId);
            this.callbacks.forEach(function (callback, callbackId) {
                _this.logger.trace("PerformanceClient: Emitting event to callback " + callbackId, correlationId);
                callback.apply(null, [events]);
            });
        };
        return PerformanceClient;
    }());

    /*! @azure/msal-common v7.3.0 2022-08-01 */

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var StubPerformanceMeasurement = /** @class */ (function () {
        function StubPerformanceMeasurement() {
        }
        /* eslint-disable-next-line @typescript-eslint/no-empty-function */
        StubPerformanceMeasurement.prototype.startMeasurement = function () { };
        /* eslint-disable-next-line @typescript-eslint/no-empty-function */
        StubPerformanceMeasurement.prototype.endMeasurement = function () { };
        StubPerformanceMeasurement.prototype.flushMeasurement = function () {
            return null;
        };
        return StubPerformanceMeasurement;
    }());
    var StubPerformanceClient = /** @class */ (function (_super) {
        __extends(StubPerformanceClient, _super);
        function StubPerformanceClient() {
            return _super !== null && _super.apply(this, arguments) || this;
        }
        StubPerformanceClient.prototype.generateId = function () {
            return "callback-id";
        };
        StubPerformanceClient.prototype.startPerformanceMeasuremeant = function () {
            return new StubPerformanceMeasurement();
        };
        return StubPerformanceClient;
    }(PerformanceClient));

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * BrowserAuthErrorMessage class containing string constants used by error codes and messages.
     */
    var BrowserAuthErrorMessage = {
        pkceNotGenerated: {
            code: "pkce_not_created",
            desc: "The PKCE code challenge and verifier could not be generated."
        },
        cryptoDoesNotExist: {
            code: "crypto_nonexistent",
            desc: "The crypto object or function is not available."
        },
        httpMethodNotImplementedError: {
            code: "http_method_not_implemented",
            desc: "The HTTP method given has not been implemented in this library."
        },
        emptyNavigateUriError: {
            code: "empty_navigate_uri",
            desc: "Navigation URI is empty. Please check stack trace for more info."
        },
        hashEmptyError: {
            code: "hash_empty_error",
            desc: "Hash value cannot be processed because it is empty. Please verify that your redirectUri is not clearing the hash. For more visit: aka.ms/msaljs/browser-errors."
        },
        hashDoesNotContainStateError: {
            code: "no_state_in_hash",
            desc: "Hash does not contain state. Please verify that the request originated from msal."
        },
        hashDoesNotContainKnownPropertiesError: {
            code: "hash_does_not_contain_known_properties",
            desc: "Hash does not contain known properites. Please verify that your redirectUri is not changing the hash. For more visit: aka.ms/msaljs/browser-errors."
        },
        unableToParseStateError: {
            code: "unable_to_parse_state",
            desc: "Unable to parse state. Please verify that the request originated from msal."
        },
        stateInteractionTypeMismatchError: {
            code: "state_interaction_type_mismatch",
            desc: "Hash contains state but the interaction type does not match the caller."
        },
        interactionInProgress: {
            code: "interaction_in_progress",
            desc: "Interaction is currently in progress. Please ensure that this interaction has been completed before calling an interactive API.  For more visit: aka.ms/msaljs/browser-errors."
        },
        popupWindowError: {
            code: "popup_window_error",
            desc: "Error opening popup window. This can happen if you are using IE or if popups are blocked in the browser."
        },
        emptyWindowError: {
            code: "empty_window_error",
            desc: "window.open returned null or undefined window object."
        },
        userCancelledError: {
            code: "user_cancelled",
            desc: "User cancelled the flow."
        },
        monitorPopupTimeoutError: {
            code: "monitor_window_timeout",
            desc: "Token acquisition in popup failed due to timeout. For more visit: aka.ms/msaljs/browser-errors."
        },
        monitorIframeTimeoutError: {
            code: "monitor_window_timeout",
            desc: "Token acquisition in iframe failed due to timeout. For more visit: aka.ms/msaljs/browser-errors."
        },
        redirectInIframeError: {
            code: "redirect_in_iframe",
            desc: "Redirects are not supported for iframed or brokered applications. Please ensure you are using MSAL.js in a top frame of the window if using the redirect APIs, or use the popup APIs."
        },
        blockTokenRequestsInHiddenIframeError: {
            code: "block_iframe_reload",
            desc: "Request was blocked inside an iframe because MSAL detected an authentication response. For more visit: aka.ms/msaljs/browser-errors"
        },
        blockAcquireTokenInPopupsError: {
            code: "block_nested_popups",
            desc: "Request was blocked inside a popup because MSAL detected it was running in a popup."
        },
        iframeClosedPrematurelyError: {
            code: "iframe_closed_prematurely",
            desc: "The iframe being monitored was closed prematurely."
        },
        silentLogoutUnsupportedError: {
            code: "silent_logout_unsupported",
            desc: "Silent logout not supported. Please call logoutRedirect or logoutPopup instead."
        },
        noAccountError: {
            code: "no_account_error",
            desc: "No account object provided to acquireTokenSilent and no active account has been set. Please call setActiveAccount or provide an account on the request."
        },
        silentPromptValueError: {
            code: "silent_prompt_value_error",
            desc: "The value given for the prompt value is not valid for silent requests - must be set to 'none'."
        },
        noTokenRequestCacheError: {
            code: "no_token_request_cache_error",
            desc: "No token request found in cache."
        },
        unableToParseTokenRequestCacheError: {
            code: "unable_to_parse_token_request_cache_error",
            desc: "The cached token request could not be parsed."
        },
        noCachedAuthorityError: {
            code: "no_cached_authority_error",
            desc: "No cached authority found."
        },
        authRequestNotSet: {
            code: "auth_request_not_set_error",
            desc: "Auth Request not set. Please ensure initiateAuthRequest was called from the InteractionHandler"
        },
        invalidCacheType: {
            code: "invalid_cache_type",
            desc: "Invalid cache type"
        },
        notInBrowserEnvironment: {
            code: "non_browser_environment",
            desc: "Login and token requests are not supported in non-browser environments."
        },
        databaseNotOpen: {
            code: "database_not_open",
            desc: "Database is not open!"
        },
        noNetworkConnectivity: {
            code: "no_network_connectivity",
            desc: "No network connectivity. Check your internet connection."
        },
        postRequestFailed: {
            code: "post_request_failed",
            desc: "Network request failed: If the browser threw a CORS error, check that the redirectUri is registered in the Azure App Portal as type 'SPA'"
        },
        getRequestFailed: {
            code: "get_request_failed",
            desc: "Network request failed. Please check the network trace to determine root cause."
        },
        failedToParseNetworkResponse: {
            code: "failed_to_parse_response",
            desc: "Failed to parse network response. Check network trace."
        },
        unableToLoadTokenError: {
            code: "unable_to_load_token",
            desc: "Error loading token to cache."
        },
        signingKeyNotFoundInStorage: {
            code: "crypto_key_not_found",
            desc: "Cryptographic Key or Keypair not found in browser storage."
        },
        authCodeRequired: {
            code: "auth_code_required",
            desc: "An authorization code must be provided (as the `code` property on the request) to this flow."
        },
        authCodeOrNativeAccountRequired: {
            code: "auth_code_or_nativeAccountId_required",
            desc: "An authorization code or nativeAccountId must be provided to this flow."
        },
        databaseUnavailable: {
            code: "database_unavailable",
            desc: "IndexedDB, which is required for persistent cryptographic key storage, is unavailable. This may be caused by browser privacy features which block persistent storage in third-party contexts."
        },
        unableToAcquireTokenFromNativePlatform: {
            code: "unable_to_acquire_token_from_native_platform",
            desc: "Unable to acquire token from native platform. For a list of possible reasons visit aka.ms/msaljs/browser-errors."
        },
        nativeHandshakeTimeout: {
            code: "native_handshake_timeout",
            desc: "Timed out while attempting to establish connection to browser extension"
        },
        nativeExtensionNotInstalled: {
            code: "native_extension_not_installed",
            desc: "Native extension is not installed. If you think this is a mistake call the initialize function."
        },
        nativeConnectionNotEstablished: {
            code: "native_connection_not_established",
            desc: "Connection to native platform has not been established. Please install a compatible browser extension and run initialize(). For more please visit aka.ms/msaljs/browser-errors."
        },
        nativeBrokerCalledBeforeInitialize: {
            code: "native_broker_called_before_initialize",
            desc: "You must call and await the initialize function before attempting to call any other MSAL API when native brokering is enabled. For more please visit aka.ms/msaljs/browser-errors."
        },
        nativePromptNotSupported: {
            code: "native_prompt_not_supported",
            desc: "The provided prompt is not supported by the native platform. This request should be routed to the web based flow."
        }
    };
    /**
     * Browser library error class thrown by the MSAL.js library for SPAs
     */
    var BrowserAuthError = /** @class */ (function (_super) {
        __extends$1(BrowserAuthError, _super);
        function BrowserAuthError(errorCode, errorMessage) {
            var _this = _super.call(this, errorCode, errorMessage) || this;
            Object.setPrototypeOf(_this, BrowserAuthError.prototype);
            _this.name = "BrowserAuthError";
            return _this;
        }
        /**
         * Creates an error thrown when PKCE is not implemented.
         * @param errDetail
         */
        BrowserAuthError.createPkceNotGeneratedError = function (errDetail) {
            return new BrowserAuthError(BrowserAuthErrorMessage.pkceNotGenerated.code, BrowserAuthErrorMessage.pkceNotGenerated.desc + " Detail:" + errDetail);
        };
        /**
         * Creates an error thrown when the crypto object is unavailable.
         * @param errDetail
         */
        BrowserAuthError.createCryptoNotAvailableError = function (errDetail) {
            return new BrowserAuthError(BrowserAuthErrorMessage.cryptoDoesNotExist.code, BrowserAuthErrorMessage.cryptoDoesNotExist.desc + " Detail:" + errDetail);
        };
        /**
         * Creates an error thrown when an HTTP method hasn't been implemented by the browser class.
         * @param method
         */
        BrowserAuthError.createHttpMethodNotImplementedError = function (method) {
            return new BrowserAuthError(BrowserAuthErrorMessage.httpMethodNotImplementedError.code, BrowserAuthErrorMessage.httpMethodNotImplementedError.desc + " Given Method: " + method);
        };
        /**
         * Creates an error thrown when the navigation URI is empty.
         */
        BrowserAuthError.createEmptyNavigationUriError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.emptyNavigateUriError.code, BrowserAuthErrorMessage.emptyNavigateUriError.desc);
        };
        /**
         * Creates an error thrown when the hash string value is unexpectedly empty.
         * @param hashValue
         */
        BrowserAuthError.createEmptyHashError = function (hashValue) {
            return new BrowserAuthError(BrowserAuthErrorMessage.hashEmptyError.code, BrowserAuthErrorMessage.hashEmptyError.desc + " Given Url: " + hashValue);
        };
        /**
         * Creates an error thrown when the hash string value is unexpectedly empty.
         */
        BrowserAuthError.createHashDoesNotContainStateError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.hashDoesNotContainStateError.code, BrowserAuthErrorMessage.hashDoesNotContainStateError.desc);
        };
        /**
         * Creates an error thrown when the hash string value does not contain known properties
         */
        BrowserAuthError.createHashDoesNotContainKnownPropertiesError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.hashDoesNotContainKnownPropertiesError.code, BrowserAuthErrorMessage.hashDoesNotContainKnownPropertiesError.desc);
        };
        /**
         * Creates an error thrown when the hash string value is unexpectedly empty.
         */
        BrowserAuthError.createUnableToParseStateError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.unableToParseStateError.code, BrowserAuthErrorMessage.unableToParseStateError.desc);
        };
        /**
         * Creates an error thrown when the state value in the hash does not match the interaction type of the API attempting to consume it.
         */
        BrowserAuthError.createStateInteractionTypeMismatchError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.stateInteractionTypeMismatchError.code, BrowserAuthErrorMessage.stateInteractionTypeMismatchError.desc);
        };
        /**
         * Creates an error thrown when a browser interaction (redirect or popup) is in progress.
         */
        BrowserAuthError.createInteractionInProgressError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.interactionInProgress.code, BrowserAuthErrorMessage.interactionInProgress.desc);
        };
        /**
         * Creates an error thrown when the popup window could not be opened.
         * @param errDetail
         */
        BrowserAuthError.createPopupWindowError = function (errDetail) {
            var errorMessage = BrowserAuthErrorMessage.popupWindowError.desc;
            errorMessage = !StringUtils.isEmpty(errDetail) ? errorMessage + " Details: " + errDetail : errorMessage;
            return new BrowserAuthError(BrowserAuthErrorMessage.popupWindowError.code, errorMessage);
        };
        /**
         * Creates an error thrown when window.open returns an empty window object.
         * @param errDetail
         */
        BrowserAuthError.createEmptyWindowCreatedError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.emptyWindowError.code, BrowserAuthErrorMessage.emptyWindowError.desc);
        };
        /**
         * Creates an error thrown when the user closes a popup.
         */
        BrowserAuthError.createUserCancelledError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.userCancelledError.code, BrowserAuthErrorMessage.userCancelledError.desc);
        };
        /**
         * Creates an error thrown when monitorPopupFromHash times out for a given popup.
         */
        BrowserAuthError.createMonitorPopupTimeoutError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.monitorPopupTimeoutError.code, BrowserAuthErrorMessage.monitorPopupTimeoutError.desc);
        };
        /**
         * Creates an error thrown when monitorIframeFromHash times out for a given iframe.
         */
        BrowserAuthError.createMonitorIframeTimeoutError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.monitorIframeTimeoutError.code, BrowserAuthErrorMessage.monitorIframeTimeoutError.desc);
        };
        /**
         * Creates an error thrown when navigateWindow is called inside an iframe or brokered applications.
         * @param windowParentCheck
         */
        BrowserAuthError.createRedirectInIframeError = function (windowParentCheck) {
            return new BrowserAuthError(BrowserAuthErrorMessage.redirectInIframeError.code, BrowserAuthErrorMessage.redirectInIframeError.desc + " (window.parent !== window) => " + windowParentCheck);
        };
        /**
         * Creates an error thrown when an auth reload is done inside an iframe.
         */
        BrowserAuthError.createBlockReloadInHiddenIframeError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.blockTokenRequestsInHiddenIframeError.code, BrowserAuthErrorMessage.blockTokenRequestsInHiddenIframeError.desc);
        };
        /**
         * Creates an error thrown when a popup attempts to call an acquireToken API
         * @returns
         */
        BrowserAuthError.createBlockAcquireTokenInPopupsError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.blockAcquireTokenInPopupsError.code, BrowserAuthErrorMessage.blockAcquireTokenInPopupsError.desc);
        };
        /**
         * Creates an error thrown when an iframe is found to be closed before the timeout is reached.
         */
        BrowserAuthError.createIframeClosedPrematurelyError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.iframeClosedPrematurelyError.code, BrowserAuthErrorMessage.iframeClosedPrematurelyError.desc);
        };
        /**
         * Creates an error thrown when the logout API is called on any of the silent interaction clients
         */
        BrowserAuthError.createSilentLogoutUnsupportedError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.silentLogoutUnsupportedError.code, BrowserAuthErrorMessage.silentLogoutUnsupportedError.desc);
        };
        /**
         * Creates an error thrown when the account object is not provided in the acquireTokenSilent API.
         */
        BrowserAuthError.createNoAccountError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.noAccountError.code, BrowserAuthErrorMessage.noAccountError.desc);
        };
        /**
         * Creates an error thrown when a given prompt value is invalid for silent requests.
         */
        BrowserAuthError.createSilentPromptValueError = function (givenPrompt) {
            return new BrowserAuthError(BrowserAuthErrorMessage.silentPromptValueError.code, BrowserAuthErrorMessage.silentPromptValueError.desc + " Given value: " + givenPrompt);
        };
        /**
         * Creates an error thrown when the cached token request could not be retrieved from the cache
         */
        BrowserAuthError.createUnableToParseTokenRequestCacheError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.unableToParseTokenRequestCacheError.code, BrowserAuthErrorMessage.unableToParseTokenRequestCacheError.desc);
        };
        /**
         * Creates an error thrown when the token request could not be retrieved from the cache
         */
        BrowserAuthError.createNoTokenRequestCacheError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.noTokenRequestCacheError.code, BrowserAuthErrorMessage.noTokenRequestCacheError.desc);
        };
        /**
         * Creates an error thrown when handleCodeResponse is called before initiateAuthRequest (InteractionHandler)
         */
        BrowserAuthError.createAuthRequestNotSetError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.authRequestNotSet.code, BrowserAuthErrorMessage.authRequestNotSet.desc);
        };
        /**
         * Creates an error thrown when the authority could not be retrieved from the cache
         */
        BrowserAuthError.createNoCachedAuthorityError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.noCachedAuthorityError.code, BrowserAuthErrorMessage.noCachedAuthorityError.desc);
        };
        /**
         * Creates an error thrown if cache type is invalid.
         */
        BrowserAuthError.createInvalidCacheTypeError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.invalidCacheType.code, "" + BrowserAuthErrorMessage.invalidCacheType.desc);
        };
        /**
         * Create an error thrown when login and token requests are made from a non-browser environment
         */
        BrowserAuthError.createNonBrowserEnvironmentError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.notInBrowserEnvironment.code, BrowserAuthErrorMessage.notInBrowserEnvironment.desc);
        };
        /**
         * Create an error thrown when indexDB database is not open
         */
        BrowserAuthError.createDatabaseNotOpenError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.databaseNotOpen.code, BrowserAuthErrorMessage.databaseNotOpen.desc);
        };
        /**
         * Create an error thrown when token fetch fails due to no internet
         */
        BrowserAuthError.createNoNetworkConnectivityError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.noNetworkConnectivity.code, BrowserAuthErrorMessage.noNetworkConnectivity.desc);
        };
        /**
         * Create an error thrown when token fetch fails due to reasons other than internet connectivity
         */
        BrowserAuthError.createPostRequestFailedError = function (errorDesc, endpoint) {
            return new BrowserAuthError(BrowserAuthErrorMessage.postRequestFailed.code, BrowserAuthErrorMessage.postRequestFailed.desc + " | Network client threw: " + errorDesc + " | Attempted to reach: " + endpoint.split("?")[0]);
        };
        /**
         * Create an error thrown when get request fails due to reasons other than internet connectivity
         */
        BrowserAuthError.createGetRequestFailedError = function (errorDesc, endpoint) {
            return new BrowserAuthError(BrowserAuthErrorMessage.getRequestFailed.code, BrowserAuthErrorMessage.getRequestFailed.desc + " | Network client threw: " + errorDesc + " | Attempted to reach: " + endpoint.split("?")[0]);
        };
        /**
         * Create an error thrown when network client fails to parse network response
         */
        BrowserAuthError.createFailedToParseNetworkResponseError = function (endpoint) {
            return new BrowserAuthError(BrowserAuthErrorMessage.failedToParseNetworkResponse.code, BrowserAuthErrorMessage.failedToParseNetworkResponse.desc + " | Attempted to reach: " + endpoint.split("?")[0]);
        };
        /**
         * Create an error thrown when the necessary information is not available to sideload tokens
         */
        BrowserAuthError.createUnableToLoadTokenError = function (errorDetail) {
            return new BrowserAuthError(BrowserAuthErrorMessage.unableToLoadTokenError.code, BrowserAuthErrorMessage.unableToLoadTokenError.desc + " | " + errorDetail);
        };
        /**
         * Create an error thrown when the queried cryptographic key is not found in IndexedDB
         */
        BrowserAuthError.createSigningKeyNotFoundInStorageError = function (keyId) {
            return new BrowserAuthError(BrowserAuthErrorMessage.signingKeyNotFoundInStorage.code, BrowserAuthErrorMessage.signingKeyNotFoundInStorage.desc + " | No match found for KeyId: " + keyId);
        };
        /**
         * Create an error when an authorization code is required but not provided
         */
        BrowserAuthError.createAuthCodeRequiredError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.authCodeRequired.code, BrowserAuthErrorMessage.authCodeRequired.desc);
        };
        /**
         * Create an error when an authorization code or native account ID is required but not provided
         */
        BrowserAuthError.createAuthCodeOrNativeAccountIdRequiredError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.authCodeOrNativeAccountRequired.code, BrowserAuthErrorMessage.authCodeOrNativeAccountRequired.desc);
        };
        /**
         * Create an error when IndexedDB is unavailable
         */
        BrowserAuthError.createDatabaseUnavailableError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.databaseUnavailable.code, BrowserAuthErrorMessage.databaseUnavailable.desc);
        };
        /**
         * Create an error when native token acquisition is not possible
         */
        BrowserAuthError.createUnableToAcquireTokenFromNativePlatformError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.unableToAcquireTokenFromNativePlatform.code, BrowserAuthErrorMessage.unableToAcquireTokenFromNativePlatform.desc);
        };
        /**
         * Create an error thrown when Handshake with browser extension times out
         */
        BrowserAuthError.createNativeHandshakeTimeoutError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.nativeHandshakeTimeout.code, BrowserAuthErrorMessage.nativeHandshakeTimeout.desc);
        };
        /**
         * Create an error thrown when browser extension is not installed
         */
        BrowserAuthError.createNativeExtensionNotInstalledError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.nativeExtensionNotInstalled.code, BrowserAuthErrorMessage.nativeExtensionNotInstalled.desc);
        };
        /**
         * Create an error when native connection has not been established
         * @returns
         */
        BrowserAuthError.createNativeConnectionNotEstablishedError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.nativeConnectionNotEstablished.code, BrowserAuthErrorMessage.nativeConnectionNotEstablished.desc);
        };
        /**
         * Create an error thrown when the initialize function hasn't been called
         */
        BrowserAuthError.createNativeBrokerCalledBeforeInitialize = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.nativeBrokerCalledBeforeInitialize.code, BrowserAuthErrorMessage.nativeBrokerCalledBeforeInitialize.desc);
        };
        /**
         * Create an error thrown when requesting a token directly from the native platform with an unsupported prompt parameter e.g. select_account, login or create
         * These requests must go through eSTS to ensure eSTS is aware of the new account
         */
        BrowserAuthError.createNativePromptParameterNotSupportedError = function () {
            return new BrowserAuthError(BrowserAuthErrorMessage.nativePromptNotSupported.code, BrowserAuthErrorMessage.nativePromptNotSupported.desc);
        };
        return BrowserAuthError;
    }(AuthError));

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * Constants
     */
    var BrowserConstants = {
        /**
         * Interaction in progress cache value
         */
        INTERACTION_IN_PROGRESS_VALUE: "interaction_in_progress",
        /**
         * Invalid grant error code
         */
        INVALID_GRANT_ERROR: "invalid_grant",
        /**
         * Default popup window width
         */
        POPUP_WIDTH: 483,
        /**
         * Default popup window height
         */
        POPUP_HEIGHT: 600,
        /**
         * Name of the popup window starts with
         */
        POPUP_NAME_PREFIX: "msal",
        /**
         * Default popup monitor poll interval in milliseconds
         */
        POLL_INTERVAL_MS: 50,
        /**
         * Msal-browser SKU
         */
        MSAL_SKU: "msal.js.browser",
    };
    var NativeConstants = {
        CHANNEL_ID: "53ee284d-920a-4b59-9d30-a60315b26836",
        PREFERRED_EXTENSION_ID: "ppnbnpeolgkicgegkbkbjmhlideopiji",
        MATS_TELEMETRY: "MATS"
    };
    var NativeExtensionMethod;
    (function (NativeExtensionMethod) {
        NativeExtensionMethod["HandshakeRequest"] = "Handshake";
        NativeExtensionMethod["HandshakeResponse"] = "HandshakeResponse";
        NativeExtensionMethod["GetToken"] = "GetToken";
        NativeExtensionMethod["Response"] = "Response";
    })(NativeExtensionMethod || (NativeExtensionMethod = {}));
    exports.BrowserCacheLocation = void 0;
    (function (BrowserCacheLocation) {
        BrowserCacheLocation["LocalStorage"] = "localStorage";
        BrowserCacheLocation["SessionStorage"] = "sessionStorage";
        BrowserCacheLocation["MemoryStorage"] = "memoryStorage";
    })(exports.BrowserCacheLocation || (exports.BrowserCacheLocation = {}));
    /**
     * HTTP Request types supported by MSAL.
     */
    var HTTP_REQUEST_TYPE;
    (function (HTTP_REQUEST_TYPE) {
        HTTP_REQUEST_TYPE["GET"] = "GET";
        HTTP_REQUEST_TYPE["POST"] = "POST";
    })(HTTP_REQUEST_TYPE || (HTTP_REQUEST_TYPE = {}));
    /**
     * Temporary cache keys for MSAL, deleted after any request.
     */
    var TemporaryCacheKeys;
    (function (TemporaryCacheKeys) {
        TemporaryCacheKeys["AUTHORITY"] = "authority";
        TemporaryCacheKeys["ACQUIRE_TOKEN_ACCOUNT"] = "acquireToken.account";
        TemporaryCacheKeys["SESSION_STATE"] = "session.state";
        TemporaryCacheKeys["REQUEST_STATE"] = "request.state";
        TemporaryCacheKeys["NONCE_IDTOKEN"] = "nonce.id_token";
        TemporaryCacheKeys["ORIGIN_URI"] = "request.origin";
        TemporaryCacheKeys["RENEW_STATUS"] = "token.renew.status";
        TemporaryCacheKeys["URL_HASH"] = "urlHash";
        TemporaryCacheKeys["REQUEST_PARAMS"] = "request.params";
        TemporaryCacheKeys["SCOPES"] = "scopes";
        TemporaryCacheKeys["INTERACTION_STATUS_KEY"] = "interaction.status";
        TemporaryCacheKeys["CCS_CREDENTIAL"] = "ccs.credential";
        TemporaryCacheKeys["CORRELATION_ID"] = "request.correlationId";
        TemporaryCacheKeys["NATIVE_REQUEST"] = "request.native";
    })(TemporaryCacheKeys || (TemporaryCacheKeys = {}));
    /**
     * Cache keys stored in-memory
     */
    var InMemoryCacheKeys;
    (function (InMemoryCacheKeys) {
        InMemoryCacheKeys["WRAPPER_SKU"] = "wrapper.sku";
        InMemoryCacheKeys["WRAPPER_VER"] = "wrapper.version";
    })(InMemoryCacheKeys || (InMemoryCacheKeys = {}));
    /**
     * API Codes for Telemetry purposes.
     * Before adding a new code you must claim it in the MSAL Telemetry tracker as these number spaces are shared across all MSALs
     * 0-99 Silent Flow
     * 800-899 Auth Code Flow
     */
    exports.ApiId = void 0;
    (function (ApiId) {
        ApiId[ApiId["acquireTokenRedirect"] = 861] = "acquireTokenRedirect";
        ApiId[ApiId["acquireTokenPopup"] = 862] = "acquireTokenPopup";
        ApiId[ApiId["ssoSilent"] = 863] = "ssoSilent";
        ApiId[ApiId["acquireTokenSilent_authCode"] = 864] = "acquireTokenSilent_authCode";
        ApiId[ApiId["handleRedirectPromise"] = 865] = "handleRedirectPromise";
        ApiId[ApiId["acquireTokenByCode"] = 866] = "acquireTokenByCode";
        ApiId[ApiId["acquireTokenSilent_silentFlow"] = 61] = "acquireTokenSilent_silentFlow";
        ApiId[ApiId["logout"] = 961] = "logout";
        ApiId[ApiId["logoutPopup"] = 962] = "logoutPopup";
    })(exports.ApiId || (exports.ApiId = {}));
    /*
     * Interaction type of the API - used for state and telemetry
     */
    exports.InteractionType = void 0;
    (function (InteractionType) {
        InteractionType["Redirect"] = "redirect";
        InteractionType["Popup"] = "popup";
        InteractionType["Silent"] = "silent";
        InteractionType["None"] = "none";
    })(exports.InteractionType || (exports.InteractionType = {}));
    /**
     * Types of interaction currently in progress.
     * Used in events in wrapper libraries to invoke functions when certain interaction is in progress or all interactions are complete.
     */
    exports.InteractionStatus = void 0;
    (function (InteractionStatus) {
        /**
         * Initial status before interaction occurs
         */
        InteractionStatus["Startup"] = "startup";
        /**
         * Status set when all login calls occuring
         */
        InteractionStatus["Login"] = "login";
        /**
         * Status set when logout call occuring
         */
        InteractionStatus["Logout"] = "logout";
        /**
         * Status set for acquireToken calls
         */
        InteractionStatus["AcquireToken"] = "acquireToken";
        /**
         * Status set for ssoSilent calls
         */
        InteractionStatus["SsoSilent"] = "ssoSilent";
        /**
         * Status set when handleRedirect in progress
         */
        InteractionStatus["HandleRedirect"] = "handleRedirect";
        /**
         * Status set when interaction is complete
         */
        InteractionStatus["None"] = "none";
    })(exports.InteractionStatus || (exports.InteractionStatus = {}));
    var DEFAULT_REQUEST = {
        scopes: OIDC_DEFAULT_SCOPES
    };
    /**
     * JWK Key Format string (Type MUST be defined for window crypto APIs)
     */
    var KEY_FORMAT_JWK = "jwk";
    // Supported wrapper SKUs
    exports.WrapperSKU = void 0;
    (function (WrapperSKU) {
        WrapperSKU["React"] = "@azure/msal-react";
        WrapperSKU["Angular"] = "@azure/msal-angular";
    })(exports.WrapperSKU || (exports.WrapperSKU = {}));
    // DatabaseStorage Constants
    var DB_NAME = "msal.db";
    var DB_VERSION = 1;
    var DB_TABLE_NAME = DB_NAME + ".keys";

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * BrowserAuthErrorMessage class containing string constants used by error codes and messages.
     */
    var BrowserConfigurationAuthErrorMessage = {
        redirectUriNotSet: {
            code: "redirect_uri_empty",
            desc: "A redirect URI is required for all calls, and none has been set."
        },
        postLogoutUriNotSet: {
            code: "post_logout_uri_empty",
            desc: "A post logout redirect has not been set."
        },
        storageNotSupportedError: {
            code: "storage_not_supported",
            desc: "Given storage configuration option was not supported."
        },
        noRedirectCallbacksSet: {
            code: "no_redirect_callbacks",
            desc: "No redirect callbacks have been set. Please call setRedirectCallbacks() with the appropriate function arguments before continuing. " +
                "More information is available here: https://github.com/AzureAD/microsoft-authentication-library-for-js/wiki/MSAL-basics."
        },
        invalidCallbackObject: {
            code: "invalid_callback_object",
            desc: "The object passed for the callback was invalid. " +
                "More information is available here: https://github.com/AzureAD/microsoft-authentication-library-for-js/wiki/MSAL-basics."
        },
        stubPcaInstanceCalled: {
            code: "stubbed_public_client_application_called",
            desc: "Stub instance of Public Client Application was called. If using msal-react, please ensure context is not used without a provider. For more visit: aka.ms/msaljs/browser-errors"
        },
        inMemRedirectUnavailable: {
            code: "in_mem_redirect_unavailable",
            desc: "Redirect cannot be supported. In-memory storage was selected and storeAuthStateInCookie=false, which would cause the library to be unable to handle the incoming hash. If you would like to use the redirect API, please use session/localStorage or set storeAuthStateInCookie=true."
        }
    };
    /**
     * Browser library error class thrown by the MSAL.js library for SPAs
     */
    var BrowserConfigurationAuthError = /** @class */ (function (_super) {
        __extends$1(BrowserConfigurationAuthError, _super);
        function BrowserConfigurationAuthError(errorCode, errorMessage) {
            var _this = _super.call(this, errorCode, errorMessage) || this;
            _this.name = "BrowserConfigurationAuthError";
            Object.setPrototypeOf(_this, BrowserConfigurationAuthError.prototype);
            return _this;
        }
        /**
         * Creates an error thrown when the redirect uri is empty (not set by caller)
         */
        BrowserConfigurationAuthError.createRedirectUriEmptyError = function () {
            return new BrowserConfigurationAuthError(BrowserConfigurationAuthErrorMessage.redirectUriNotSet.code, BrowserConfigurationAuthErrorMessage.redirectUriNotSet.desc);
        };
        /**
         * Creates an error thrown when the post-logout redirect uri is empty (not set by caller)
         */
        BrowserConfigurationAuthError.createPostLogoutRedirectUriEmptyError = function () {
            return new BrowserConfigurationAuthError(BrowserConfigurationAuthErrorMessage.postLogoutUriNotSet.code, BrowserConfigurationAuthErrorMessage.postLogoutUriNotSet.desc);
        };
        /**
         * Creates error thrown when given storage location is not supported.
         * @param givenStorageLocation
         */
        BrowserConfigurationAuthError.createStorageNotSupportedError = function (givenStorageLocation) {
            return new BrowserConfigurationAuthError(BrowserConfigurationAuthErrorMessage.storageNotSupportedError.code, BrowserConfigurationAuthErrorMessage.storageNotSupportedError.desc + " Given Location: " + givenStorageLocation);
        };
        /**
         * Creates error thrown when redirect callbacks are not set before calling loginRedirect() or acquireTokenRedirect().
         */
        BrowserConfigurationAuthError.createRedirectCallbacksNotSetError = function () {
            return new BrowserConfigurationAuthError(BrowserConfigurationAuthErrorMessage.noRedirectCallbacksSet.code, BrowserConfigurationAuthErrorMessage.noRedirectCallbacksSet.desc);
        };
        /**
         * Creates error thrown when the stub instance of PublicClientApplication is called.
         */
        BrowserConfigurationAuthError.createStubPcaInstanceCalledError = function () {
            return new BrowserConfigurationAuthError(BrowserConfigurationAuthErrorMessage.stubPcaInstanceCalled.code, BrowserConfigurationAuthErrorMessage.stubPcaInstanceCalled.desc);
        };
        /*
         * Create an error thrown when in-memory storage is used and storeAuthStateInCookie=false.
         */
        BrowserConfigurationAuthError.createInMemoryRedirectUnavailableError = function () {
            return new BrowserConfigurationAuthError(BrowserConfigurationAuthErrorMessage.inMemRedirectUnavailable.code, BrowserConfigurationAuthErrorMessage.inMemRedirectUnavailable.desc);
        };
        return BrowserConfigurationAuthError;
    }(AuthError));

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var BrowserStorage = /** @class */ (function () {
        function BrowserStorage(cacheLocation) {
            this.validateWindowStorage(cacheLocation);
            this.windowStorage = window[cacheLocation];
        }
        BrowserStorage.prototype.validateWindowStorage = function (cacheLocation) {
            if (cacheLocation !== exports.BrowserCacheLocation.LocalStorage && cacheLocation !== exports.BrowserCacheLocation.SessionStorage) {
                throw BrowserConfigurationAuthError.createStorageNotSupportedError(cacheLocation);
            }
            var storageSupported = !!window[cacheLocation];
            if (!storageSupported) {
                throw BrowserConfigurationAuthError.createStorageNotSupportedError(cacheLocation);
            }
        };
        BrowserStorage.prototype.getItem = function (key) {
            return this.windowStorage.getItem(key);
        };
        BrowserStorage.prototype.setItem = function (key, value) {
            this.windowStorage.setItem(key, value);
        };
        BrowserStorage.prototype.removeItem = function (key) {
            this.windowStorage.removeItem(key);
        };
        BrowserStorage.prototype.getKeys = function () {
            return Object.keys(this.windowStorage);
        };
        BrowserStorage.prototype.containsKey = function (key) {
            return this.windowStorage.hasOwnProperty(key);
        };
        return BrowserStorage;
    }());

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var MemoryStorage = /** @class */ (function () {
        function MemoryStorage() {
            this.cache = new Map();
        }
        MemoryStorage.prototype.getItem = function (key) {
            return this.cache.get(key) || null;
        };
        MemoryStorage.prototype.setItem = function (key, value) {
            this.cache.set(key, value);
        };
        MemoryStorage.prototype.removeItem = function (key) {
            this.cache.delete(key);
        };
        MemoryStorage.prototype.getKeys = function () {
            var cacheKeys = [];
            this.cache.forEach(function (value, key) {
                cacheKeys.push(key);
            });
            return cacheKeys;
        };
        MemoryStorage.prototype.containsKey = function (key) {
            return this.cache.has(key);
        };
        MemoryStorage.prototype.clear = function () {
            this.cache.clear();
        };
        return MemoryStorage;
    }());

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var BrowserProtocolUtils = /** @class */ (function () {
        function BrowserProtocolUtils() {
        }
        /**
         * Extracts the BrowserStateObject from the state string.
         * @param browserCrypto
         * @param state
         */
        BrowserProtocolUtils.extractBrowserRequestState = function (browserCrypto, state) {
            if (StringUtils.isEmpty(state)) {
                return null;
            }
            try {
                var requestStateObj = ProtocolUtils.parseRequestState(browserCrypto, state);
                return requestStateObj.libraryState.meta;
            }
            catch (e) {
                throw ClientAuthError.createInvalidStateError(state, e);
            }
        };
        /**
         * Parses properties of server response from url hash
         * @param locationHash Hash from url
         */
        BrowserProtocolUtils.parseServerResponseFromHash = function (locationHash) {
            if (!locationHash) {
                return {};
            }
            var hashUrlString = new UrlString(locationHash);
            return UrlString.getDeserializedHash(hashUrlString.getHash());
        };
        return BrowserProtocolUtils;
    }());

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * This class implements the cache storage interface for MSAL through browser local or session storage.
     * Cookies are only used if storeAuthStateInCookie is true, and are only used for
     * parameters such as state and nonce, generally.
     */
    var BrowserCacheManager = /** @class */ (function (_super) {
        __extends$1(BrowserCacheManager, _super);
        function BrowserCacheManager(clientId, cacheConfig, cryptoImpl, logger) {
            var _this = _super.call(this, clientId, cryptoImpl) || this;
            // Cookie life calculation (hours * minutes * seconds * ms)
            _this.COOKIE_LIFE_MULTIPLIER = 24 * 60 * 60 * 1000;
            _this.cacheConfig = cacheConfig;
            _this.logger = logger;
            _this.internalStorage = new MemoryStorage();
            _this.browserStorage = _this.setupBrowserStorage(_this.cacheConfig.cacheLocation);
            _this.temporaryCacheStorage = _this.setupTemporaryCacheStorage(_this.cacheConfig.cacheLocation);
            // Migrate any cache entries from older versions of MSAL.
            _this.migrateCacheEntries();
            return _this;
        }
        /**
         * Returns a window storage class implementing the IWindowStorage interface that corresponds to the configured cacheLocation.
         * @param cacheLocation
         */
        BrowserCacheManager.prototype.setupBrowserStorage = function (cacheLocation) {
            switch (cacheLocation) {
                case exports.BrowserCacheLocation.LocalStorage:
                case exports.BrowserCacheLocation.SessionStorage:
                    try {
                        // Temporary cache items will always be stored in session storage to mitigate problems caused by multiple tabs
                        return new BrowserStorage(cacheLocation);
                    }
                    catch (e) {
                        this.logger.verbose(e);
                        break;
                    }
                case exports.BrowserCacheLocation.MemoryStorage:
            }
            this.cacheConfig.cacheLocation = exports.BrowserCacheLocation.MemoryStorage;
            return new MemoryStorage();
        };
        /**
         *
         * @param cacheLocation
         */
        BrowserCacheManager.prototype.setupTemporaryCacheStorage = function (cacheLocation) {
            switch (cacheLocation) {
                case exports.BrowserCacheLocation.LocalStorage:
                case exports.BrowserCacheLocation.SessionStorage:
                    try {
                        // Temporary cache items will always be stored in session storage to mitigate problems caused by multiple tabs
                        return new BrowserStorage(exports.BrowserCacheLocation.SessionStorage);
                    }
                    catch (e) {
                        this.logger.verbose(e);
                        return this.internalStorage;
                    }
                case exports.BrowserCacheLocation.MemoryStorage:
                default:
                    return this.internalStorage;
            }
        };
        /**
         * Migrate all old cache entries to new schema. No rollback supported.
         * @param storeAuthStateInCookie
         */
        BrowserCacheManager.prototype.migrateCacheEntries = function () {
            var _this = this;
            var idTokenKey = Constants.CACHE_PREFIX + "." + PersistentCacheKeys.ID_TOKEN;
            var clientInfoKey = Constants.CACHE_PREFIX + "." + PersistentCacheKeys.CLIENT_INFO;
            var errorKey = Constants.CACHE_PREFIX + "." + PersistentCacheKeys.ERROR;
            var errorDescKey = Constants.CACHE_PREFIX + "." + PersistentCacheKeys.ERROR_DESC;
            var idTokenValue = this.browserStorage.getItem(idTokenKey);
            var clientInfoValue = this.browserStorage.getItem(clientInfoKey);
            var errorValue = this.browserStorage.getItem(errorKey);
            var errorDescValue = this.browserStorage.getItem(errorDescKey);
            var values = [idTokenValue, clientInfoValue, errorValue, errorDescValue];
            var keysToMigrate = [PersistentCacheKeys.ID_TOKEN, PersistentCacheKeys.CLIENT_INFO, PersistentCacheKeys.ERROR, PersistentCacheKeys.ERROR_DESC];
            keysToMigrate.forEach(function (cacheKey, index) { return _this.migrateCacheEntry(cacheKey, values[index]); });
        };
        /**
         * Utility function to help with migration.
         * @param newKey
         * @param value
         * @param storeAuthStateInCookie
         */
        BrowserCacheManager.prototype.migrateCacheEntry = function (newKey, value) {
            if (value) {
                this.setTemporaryCache(newKey, value, true);
            }
        };
        /**
         * Parses passed value as JSON object, JSON.parse() will throw an error.
         * @param input
         */
        BrowserCacheManager.prototype.validateAndParseJson = function (jsonValue) {
            try {
                var parsedJson = JSON.parse(jsonValue);
                /**
                 * There are edge cases in which JSON.parse will successfully parse a non-valid JSON object
                 * (e.g. JSON.parse will parse an escaped string into an unescaped string), so adding a type check
                 * of the parsed value is necessary in order to be certain that the string represents a valid JSON object.
                 *
                 */
                return (parsedJson && typeof parsedJson === "object") ? parsedJson : null;
            }
            catch (error) {
                return null;
            }
        };
        /**
         * fetches the entry from the browser storage based off the key
         * @param key
         */
        BrowserCacheManager.prototype.getItem = function (key) {
            return this.browserStorage.getItem(key);
        };
        /**
         * sets the entry in the browser storage
         * @param key
         * @param value
         */
        BrowserCacheManager.prototype.setItem = function (key, value) {
            this.browserStorage.setItem(key, value);
        };
        /**
         * fetch the account entity from the platform cache
         * @param accountKey
         */
        BrowserCacheManager.prototype.getAccount = function (accountKey) {
            var account = this.getItem(accountKey);
            if (!account) {
                return null;
            }
            var parsedAccount = this.validateAndParseJson(account);
            if (!parsedAccount || !AccountEntity.isAccountEntity(parsedAccount)) {
                return null;
            }
            return CacheManager.toObject(new AccountEntity(), parsedAccount);
        };
        /**
         * set account entity in the platform cache
         * @param key
         * @param value
         */
        BrowserCacheManager.prototype.setAccount = function (account) {
            this.logger.trace("BrowserCacheManager.setAccount called");
            var key = account.generateAccountKey();
            this.setItem(key, JSON.stringify(account));
        };
        /**
         * generates idToken entity from a string
         * @param idTokenKey
         */
        BrowserCacheManager.prototype.getIdTokenCredential = function (idTokenKey) {
            var value = this.getItem(idTokenKey);
            if (!value) {
                this.logger.trace("BrowserCacheManager.getIdTokenCredential: called, no cache hit");
                return null;
            }
            var parsedIdToken = this.validateAndParseJson(value);
            if (!parsedIdToken || !IdTokenEntity.isIdTokenEntity(parsedIdToken)) {
                this.logger.trace("BrowserCacheManager.getIdTokenCredential: called, no cache hit");
                return null;
            }
            this.logger.trace("BrowserCacheManager.getIdTokenCredential: cache hit");
            return CacheManager.toObject(new IdTokenEntity(), parsedIdToken);
        };
        /**
         * set IdToken credential to the platform cache
         * @param idToken
         */
        BrowserCacheManager.prototype.setIdTokenCredential = function (idToken) {
            this.logger.trace("BrowserCacheManager.setIdTokenCredential called");
            var idTokenKey = idToken.generateCredentialKey();
            this.setItem(idTokenKey, JSON.stringify(idToken));
        };
        /**
         * generates accessToken entity from a string
         * @param key
         */
        BrowserCacheManager.prototype.getAccessTokenCredential = function (accessTokenKey) {
            var value = this.getItem(accessTokenKey);
            if (!value) {
                this.logger.trace("BrowserCacheManager.getAccessTokenCredential: called, no cache hit");
                return null;
            }
            var parsedAccessToken = this.validateAndParseJson(value);
            if (!parsedAccessToken || !AccessTokenEntity.isAccessTokenEntity(parsedAccessToken)) {
                this.logger.trace("BrowserCacheManager.getAccessTokenCredential: called, no cache hit");
                return null;
            }
            this.logger.trace("BrowserCacheManager.getAccessTokenCredential: cache hit");
            return CacheManager.toObject(new AccessTokenEntity(), parsedAccessToken);
        };
        /**
         * set accessToken credential to the platform cache
         * @param accessToken
         */
        BrowserCacheManager.prototype.setAccessTokenCredential = function (accessToken) {
            this.logger.trace("BrowserCacheManager.setAccessTokenCredential called");
            var accessTokenKey = accessToken.generateCredentialKey();
            this.setItem(accessTokenKey, JSON.stringify(accessToken));
        };
        /**
         * generates refreshToken entity from a string
         * @param refreshTokenKey
         */
        BrowserCacheManager.prototype.getRefreshTokenCredential = function (refreshTokenKey) {
            var value = this.getItem(refreshTokenKey);
            if (!value) {
                this.logger.trace("BrowserCacheManager.getRefreshTokenCredential: called, no cache hit");
                return null;
            }
            var parsedRefreshToken = this.validateAndParseJson(value);
            if (!parsedRefreshToken || !RefreshTokenEntity.isRefreshTokenEntity(parsedRefreshToken)) {
                this.logger.trace("BrowserCacheManager.getRefreshTokenCredential: called, no cache hit");
                return null;
            }
            this.logger.trace("BrowserCacheManager.getRefreshTokenCredential: cache hit");
            return CacheManager.toObject(new RefreshTokenEntity(), parsedRefreshToken);
        };
        /**
         * set refreshToken credential to the platform cache
         * @param refreshToken
         */
        BrowserCacheManager.prototype.setRefreshTokenCredential = function (refreshToken) {
            this.logger.trace("BrowserCacheManager.setRefreshTokenCredential called");
            var refreshTokenKey = refreshToken.generateCredentialKey();
            this.setItem(refreshTokenKey, JSON.stringify(refreshToken));
        };
        /**
         * fetch appMetadata entity from the platform cache
         * @param appMetadataKey
         */
        BrowserCacheManager.prototype.getAppMetadata = function (appMetadataKey) {
            var value = this.getItem(appMetadataKey);
            if (!value) {
                this.logger.trace("BrowserCacheManager.getAppMetadata: called, no cache hit");
                return null;
            }
            var parsedMetadata = this.validateAndParseJson(value);
            if (!parsedMetadata || !AppMetadataEntity.isAppMetadataEntity(appMetadataKey, parsedMetadata)) {
                this.logger.trace("BrowserCacheManager.getAppMetadata: called, no cache hit");
                return null;
            }
            this.logger.trace("BrowserCacheManager.getAppMetadata: cache hit");
            return CacheManager.toObject(new AppMetadataEntity(), parsedMetadata);
        };
        /**
         * set appMetadata entity to the platform cache
         * @param appMetadata
         */
        BrowserCacheManager.prototype.setAppMetadata = function (appMetadata) {
            this.logger.trace("BrowserCacheManager.setAppMetadata called");
            var appMetadataKey = appMetadata.generateAppMetadataKey();
            this.setItem(appMetadataKey, JSON.stringify(appMetadata));
        };
        /**
         * fetch server telemetry entity from the platform cache
         * @param serverTelemetryKey
         */
        BrowserCacheManager.prototype.getServerTelemetry = function (serverTelemetryKey) {
            var value = this.getItem(serverTelemetryKey);
            if (!value) {
                this.logger.trace("BrowserCacheManager.getServerTelemetry: called, no cache hit");
                return null;
            }
            var parsedMetadata = this.validateAndParseJson(value);
            if (!parsedMetadata || !ServerTelemetryEntity.isServerTelemetryEntity(serverTelemetryKey, parsedMetadata)) {
                this.logger.trace("BrowserCacheManager.getServerTelemetry: called, no cache hit");
                return null;
            }
            this.logger.trace("BrowserCacheManager.getServerTelemetry: cache hit");
            return CacheManager.toObject(new ServerTelemetryEntity(), parsedMetadata);
        };
        /**
         * set server telemetry entity to the platform cache
         * @param serverTelemetryKey
         * @param serverTelemetry
         */
        BrowserCacheManager.prototype.setServerTelemetry = function (serverTelemetryKey, serverTelemetry) {
            this.logger.trace("BrowserCacheManager.setServerTelemetry called");
            this.setItem(serverTelemetryKey, JSON.stringify(serverTelemetry));
        };
        /**
         *
         */
        BrowserCacheManager.prototype.getAuthorityMetadata = function (key) {
            var value = this.internalStorage.getItem(key);
            if (!value) {
                this.logger.trace("BrowserCacheManager.getAuthorityMetadata: called, no cache hit");
                return null;
            }
            var parsedMetadata = this.validateAndParseJson(value);
            if (parsedMetadata && AuthorityMetadataEntity.isAuthorityMetadataEntity(key, parsedMetadata)) {
                this.logger.trace("BrowserCacheManager.getAuthorityMetadata: cache hit");
                return CacheManager.toObject(new AuthorityMetadataEntity(), parsedMetadata);
            }
            return null;
        };
        /**
         *
         */
        BrowserCacheManager.prototype.getAuthorityMetadataKeys = function () {
            var _this = this;
            var allKeys = this.internalStorage.getKeys();
            return allKeys.filter(function (key) {
                return _this.isAuthorityMetadata(key);
            });
        };
        /**
         * Sets wrapper metadata in memory
         * @param wrapperSKU
         * @param wrapperVersion
         */
        BrowserCacheManager.prototype.setWrapperMetadata = function (wrapperSKU, wrapperVersion) {
            this.internalStorage.setItem(InMemoryCacheKeys.WRAPPER_SKU, wrapperSKU);
            this.internalStorage.setItem(InMemoryCacheKeys.WRAPPER_VER, wrapperVersion);
        };
        /**
         * Returns wrapper metadata from in-memory storage
         */
        BrowserCacheManager.prototype.getWrapperMetadata = function () {
            var sku = this.internalStorage.getItem(InMemoryCacheKeys.WRAPPER_SKU) || Constants.EMPTY_STRING;
            var version = this.internalStorage.getItem(InMemoryCacheKeys.WRAPPER_VER) || Constants.EMPTY_STRING;
            return [sku, version];
        };
        /**
         *
         * @param entity
         */
        BrowserCacheManager.prototype.setAuthorityMetadata = function (key, entity) {
            this.logger.trace("BrowserCacheManager.setAuthorityMetadata called");
            this.internalStorage.setItem(key, JSON.stringify(entity));
        };
        /**
         * Gets the active account
         */
        BrowserCacheManager.prototype.getActiveAccount = function () {
            var activeAccountKeyFilters = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT_FILTERS);
            var activeAccountValueFilters = this.getItem(activeAccountKeyFilters);
            if (!activeAccountValueFilters) {
                // if new active account cache type isn't found, it's an old version, so look for that instead
                this.logger.trace("No active account filters cache schema found, looking for legacy schema");
                var activeAccountKeyLocal = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT);
                var activeAccountValueLocal = this.getItem(activeAccountKeyLocal);
                if (!activeAccountValueLocal) {
                    this.logger.trace("No active account found");
                    return null;
                }
                var activeAccount = this.getAccountInfoByFilter({ localAccountId: activeAccountValueLocal })[0] || null;
                if (activeAccount) {
                    this.logger.trace("Legacy active account cache schema found");
                    this.logger.trace("Adding active account filters cache schema");
                    this.setActiveAccount(activeAccount);
                    return activeAccount;
                }
                return null;
            }
            var activeAccountValueObj = this.validateAndParseJson(activeAccountValueFilters);
            if (activeAccountValueObj) {
                this.logger.trace("Active account filters schema found");
                return this.getAccountInfoByFilter({
                    homeAccountId: activeAccountValueObj.homeAccountId,
                    localAccountId: activeAccountValueObj.localAccountId
                })[0] || null;
            }
            this.logger.trace("No active account found");
            return null;
        };
        /**
         * Sets the active account's localAccountId in cache
         * @param account
         */
        BrowserCacheManager.prototype.setActiveAccount = function (account) {
            var activeAccountKey = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT_FILTERS);
            var activeAccountKeyLocal = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT);
            if (account) {
                this.logger.verbose("setActiveAccount: Active account set");
                var activeAccountValue = {
                    homeAccountId: account.homeAccountId,
                    localAccountId: account.localAccountId
                };
                this.browserStorage.setItem(activeAccountKey, JSON.stringify(activeAccountValue));
                this.browserStorage.setItem(activeAccountKeyLocal, account.localAccountId);
            }
            else {
                this.logger.verbose("setActiveAccount: No account passed, active account not set");
                this.browserStorage.removeItem(activeAccountKey);
                this.browserStorage.removeItem(activeAccountKeyLocal);
            }
        };
        /**
         * Gets a list of accounts that match all of the filters provided
         * @param account
         */
        BrowserCacheManager.prototype.getAccountInfoByFilter = function (accountFilter) {
            var allAccounts = this.getAllAccounts();
            return allAccounts.filter(function (accountObj) {
                if (accountFilter.username && accountFilter.username.toLowerCase() !== accountObj.username.toLowerCase()) {
                    return false;
                }
                if (accountFilter.homeAccountId && accountFilter.homeAccountId !== accountObj.homeAccountId) {
                    return false;
                }
                if (accountFilter.localAccountId && accountFilter.localAccountId !== accountObj.localAccountId) {
                    return false;
                }
                if (accountFilter.tenantId && accountFilter.tenantId !== accountObj.tenantId) {
                    return false;
                }
                if (accountFilter.environment && accountFilter.environment !== accountObj.environment) {
                    return false;
                }
                return true;
            });
        };
        /**
         * Checks the cache for accounts matching loginHint or SID
         * @param loginHint
         * @param sid
         */
        BrowserCacheManager.prototype.getAccountInfoByHints = function (loginHint, sid) {
            var matchingAccounts = this.getAllAccounts().filter(function (accountInfo) {
                if (sid) {
                    var accountSid = accountInfo.idTokenClaims && accountInfo.idTokenClaims["sid"];
                    return sid === accountSid;
                }
                if (loginHint) {
                    return loginHint === accountInfo.username;
                }
                return false;
            });
            if (matchingAccounts.length === 1) {
                return matchingAccounts[0];
            }
            else if (matchingAccounts.length > 1) {
                throw ClientAuthError.createMultipleMatchingAccountsInCacheError();
            }
            return null;
        };
        /**
         * fetch throttling entity from the platform cache
         * @param throttlingCacheKey
         */
        BrowserCacheManager.prototype.getThrottlingCache = function (throttlingCacheKey) {
            var value = this.getItem(throttlingCacheKey);
            if (!value) {
                this.logger.trace("BrowserCacheManager.getThrottlingCache: called, no cache hit");
                return null;
            }
            var parsedThrottlingCache = this.validateAndParseJson(value);
            if (!parsedThrottlingCache || !ThrottlingEntity.isThrottlingEntity(throttlingCacheKey, parsedThrottlingCache)) {
                this.logger.trace("BrowserCacheManager.getThrottlingCache: called, no cache hit");
                return null;
            }
            this.logger.trace("BrowserCacheManager.getThrottlingCache: cache hit");
            return CacheManager.toObject(new ThrottlingEntity(), parsedThrottlingCache);
        };
        /**
         * set throttling entity to the platform cache
         * @param throttlingCacheKey
         * @param throttlingCache
         */
        BrowserCacheManager.prototype.setThrottlingCache = function (throttlingCacheKey, throttlingCache) {
            this.logger.trace("BrowserCacheManager.setThrottlingCache called");
            this.setItem(throttlingCacheKey, JSON.stringify(throttlingCache));
        };
        /**
         * Gets cache item with given key.
         * Will retrieve from cookies if storeAuthStateInCookie is set to true.
         * @param key
         */
        BrowserCacheManager.prototype.getTemporaryCache = function (cacheKey, generateKey) {
            var key = generateKey ? this.generateCacheKey(cacheKey) : cacheKey;
            if (this.cacheConfig.storeAuthStateInCookie) {
                var itemCookie = this.getItemCookie(key);
                if (itemCookie) {
                    this.logger.trace("BrowserCacheManager.getTemporaryCache: storeAuthStateInCookies set to true, retrieving from cookies");
                    return itemCookie;
                }
            }
            var value = this.temporaryCacheStorage.getItem(key);
            if (!value) {
                // If temp cache item not found in session/memory, check local storage for items set by old versions
                if (this.cacheConfig.cacheLocation === exports.BrowserCacheLocation.LocalStorage) {
                    var item = this.browserStorage.getItem(key);
                    if (item) {
                        this.logger.trace("BrowserCacheManager.getTemporaryCache: Temporary cache item found in local storage");
                        return item;
                    }
                }
                this.logger.trace("BrowserCacheManager.getTemporaryCache: No cache item found in local storage");
                return null;
            }
            this.logger.trace("BrowserCacheManager.getTemporaryCache: Temporary cache item returned");
            return value;
        };
        /**
         * Sets the cache item with the key and value given.
         * Stores in cookie if storeAuthStateInCookie is set to true.
         * This can cause cookie overflow if used incorrectly.
         * @param key
         * @param value
         */
        BrowserCacheManager.prototype.setTemporaryCache = function (cacheKey, value, generateKey) {
            var key = generateKey ? this.generateCacheKey(cacheKey) : cacheKey;
            this.temporaryCacheStorage.setItem(key, value);
            if (this.cacheConfig.storeAuthStateInCookie) {
                this.logger.trace("BrowserCacheManager.setTemporaryCache: storeAuthStateInCookie set to true, setting item cookie");
                this.setItemCookie(key, value);
            }
        };
        /**
         * Removes the cache item with the given key.
         * Will also clear the cookie item if storeAuthStateInCookie is set to true.
         * @param key
         */
        BrowserCacheManager.prototype.removeItem = function (key) {
            this.browserStorage.removeItem(key);
            this.temporaryCacheStorage.removeItem(key);
            if (this.cacheConfig.storeAuthStateInCookie) {
                this.logger.trace("BrowserCacheManager.removeItem: storeAuthStateInCookie is true, clearing item cookie");
                this.clearItemCookie(key);
            }
            return true;
        };
        /**
         * Checks whether key is in cache.
         * @param key
         */
        BrowserCacheManager.prototype.containsKey = function (key) {
            return this.browserStorage.containsKey(key) || this.temporaryCacheStorage.containsKey(key);
        };
        /**
         * Gets all keys in window.
         */
        BrowserCacheManager.prototype.getKeys = function () {
            return __spread(this.browserStorage.getKeys(), this.temporaryCacheStorage.getKeys());
        };
        /**
         * Clears all cache entries created by MSAL.
         */
        BrowserCacheManager.prototype.clear = function () {
            return __awaiter$1(this, void 0, void 0, function () {
                var _this = this;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0: 
                        // Removes all accounts and their credentials
                        return [4 /*yield*/, this.removeAllAccounts()];
                        case 1:
                            // Removes all accounts and their credentials
                            _a.sent();
                            this.removeAppMetadata();
                            // Removes all remaining MSAL cache items
                            this.getKeys().forEach(function (cacheKey) {
                                // Check if key contains msal prefix; For now, we are clearing all the cache items created by MSAL.js
                                if ((_this.browserStorage.containsKey(cacheKey) || _this.temporaryCacheStorage.containsKey(cacheKey)) && ((cacheKey.indexOf(Constants.CACHE_PREFIX) !== -1) || (cacheKey.indexOf(_this.clientId) !== -1))) {
                                    _this.removeItem(cacheKey);
                                }
                            });
                            this.internalStorage.clear();
                            return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * Add value to cookies
         * @param cookieName
         * @param cookieValue
         * @param expires
         */
        BrowserCacheManager.prototype.setItemCookie = function (cookieName, cookieValue, expires) {
            var cookieStr = encodeURIComponent(cookieName) + "=" + encodeURIComponent(cookieValue) + ";path=/;SameSite=Lax;";
            if (expires) {
                var expireTime = this.getCookieExpirationTime(expires);
                cookieStr += "expires=" + expireTime + ";";
            }
            if (this.cacheConfig.secureCookies) {
                cookieStr += "Secure;";
            }
            document.cookie = cookieStr;
        };
        /**
         * Get one item by key from cookies
         * @param cookieName
         */
        BrowserCacheManager.prototype.getItemCookie = function (cookieName) {
            var name = encodeURIComponent(cookieName) + "=";
            var cookieList = document.cookie.split(";");
            for (var i = 0; i < cookieList.length; i++) {
                var cookie = cookieList[i];
                while (cookie.charAt(0) === " ") {
                    cookie = cookie.substring(1);
                }
                if (cookie.indexOf(name) === 0) {
                    return decodeURIComponent(cookie.substring(name.length, cookie.length));
                }
            }
            return Constants.EMPTY_STRING;
        };
        /**
         * Clear all msal-related cookies currently set in the browser. Should only be used to clear temporary cache items.
         */
        BrowserCacheManager.prototype.clearMsalCookies = function () {
            var _this = this;
            var cookiePrefix = Constants.CACHE_PREFIX + "." + this.clientId;
            var cookieList = document.cookie.split(";");
            cookieList.forEach(function (cookie) {
                while (cookie.charAt(0) === " ") {
                    // eslint-disable-next-line no-param-reassign
                    cookie = cookie.substring(1);
                }
                if (cookie.indexOf(cookiePrefix) === 0) {
                    var cookieKey = cookie.split("=")[0];
                    _this.clearItemCookie(cookieKey);
                }
            });
        };
        /**
         * Clear an item in the cookies by key
         * @param cookieName
         */
        BrowserCacheManager.prototype.clearItemCookie = function (cookieName) {
            this.setItemCookie(cookieName, Constants.EMPTY_STRING, -1);
        };
        /**
         * Get cookie expiration time
         * @param cookieLifeDays
         */
        BrowserCacheManager.prototype.getCookieExpirationTime = function (cookieLifeDays) {
            var today = new Date();
            var expr = new Date(today.getTime() + cookieLifeDays * this.COOKIE_LIFE_MULTIPLIER);
            return expr.toUTCString();
        };
        /**
         * Gets the cache object referenced by the browser
         */
        BrowserCacheManager.prototype.getCache = function () {
            return this.browserStorage;
        };
        /**
         * interface compat, we cannot overwrite browser cache; Functionality is supported by individual entities in browser
         */
        BrowserCacheManager.prototype.setCache = function () {
            // sets nothing
        };
        /**
         * Prepend msal.<client-id> to each key; Skip for any JSON object as Key (defined schemas do not need the key appended: AccessToken Keys or the upcoming schema)
         * @param key
         * @param addInstanceId
         */
        BrowserCacheManager.prototype.generateCacheKey = function (key) {
            var generatedKey = this.validateAndParseJson(key);
            if (!generatedKey) {
                if (StringUtils.startsWith(key, Constants.CACHE_PREFIX) || StringUtils.startsWith(key, PersistentCacheKeys.ADAL_ID_TOKEN)) {
                    return key;
                }
                return Constants.CACHE_PREFIX + "." + this.clientId + "." + key;
            }
            return JSON.stringify(key);
        };
        /**
         * Create authorityKey to cache authority
         * @param state
         */
        BrowserCacheManager.prototype.generateAuthorityKey = function (stateString) {
            var stateId = ProtocolUtils.parseRequestState(this.cryptoImpl, stateString).libraryState.id;
            return this.generateCacheKey(TemporaryCacheKeys.AUTHORITY + "." + stateId);
        };
        /**
         * Create Nonce key to cache nonce
         * @param state
         */
        BrowserCacheManager.prototype.generateNonceKey = function (stateString) {
            var stateId = ProtocolUtils.parseRequestState(this.cryptoImpl, stateString).libraryState.id;
            return this.generateCacheKey(TemporaryCacheKeys.NONCE_IDTOKEN + "." + stateId);
        };
        /**
         * Creates full cache key for the request state
         * @param stateString State string for the request
         */
        BrowserCacheManager.prototype.generateStateKey = function (stateString) {
            // Use the library state id to key temp storage for uniqueness for multiple concurrent requests
            var stateId = ProtocolUtils.parseRequestState(this.cryptoImpl, stateString).libraryState.id;
            return this.generateCacheKey(TemporaryCacheKeys.REQUEST_STATE + "." + stateId);
        };
        /**
         * Gets the cached authority based on the cached state. Returns empty if no cached state found.
         */
        BrowserCacheManager.prototype.getCachedAuthority = function (cachedState) {
            var stateCacheKey = this.generateStateKey(cachedState);
            var state = this.getTemporaryCache(stateCacheKey);
            if (!state) {
                return null;
            }
            var authorityCacheKey = this.generateAuthorityKey(state);
            return this.getTemporaryCache(authorityCacheKey);
        };
        /**
         * Updates account, authority, and state in cache
         * @param serverAuthenticationRequest
         * @param account
         */
        BrowserCacheManager.prototype.updateCacheEntries = function (state, nonce, authorityInstance, loginHint, account) {
            this.logger.trace("BrowserCacheManager.updateCacheEntries called");
            // Cache the request state
            var stateCacheKey = this.generateStateKey(state);
            this.setTemporaryCache(stateCacheKey, state, false);
            // Cache the nonce
            var nonceCacheKey = this.generateNonceKey(state);
            this.setTemporaryCache(nonceCacheKey, nonce, false);
            // Cache authorityKey
            var authorityCacheKey = this.generateAuthorityKey(state);
            this.setTemporaryCache(authorityCacheKey, authorityInstance, false);
            if (account) {
                var ccsCredential = {
                    credential: account.homeAccountId,
                    type: CcsCredentialType.HOME_ACCOUNT_ID
                };
                this.setTemporaryCache(TemporaryCacheKeys.CCS_CREDENTIAL, JSON.stringify(ccsCredential), true);
            }
            else if (!StringUtils.isEmpty(loginHint)) {
                var ccsCredential = {
                    credential: loginHint,
                    type: CcsCredentialType.UPN
                };
                this.setTemporaryCache(TemporaryCacheKeys.CCS_CREDENTIAL, JSON.stringify(ccsCredential), true);
            }
        };
        /**
         * Reset all temporary cache items
         * @param state
         */
        BrowserCacheManager.prototype.resetRequestCache = function (state) {
            var _this = this;
            this.logger.trace("BrowserCacheManager.resetRequestCache called");
            // check state and remove associated cache items
            if (!StringUtils.isEmpty(state)) {
                this.getKeys().forEach(function (key) {
                    if (key.indexOf(state) !== -1) {
                        _this.removeItem(key);
                    }
                });
            }
            // delete generic interactive request parameters
            if (state) {
                this.removeItem(this.generateStateKey(state));
                this.removeItem(this.generateNonceKey(state));
                this.removeItem(this.generateAuthorityKey(state));
            }
            this.removeItem(this.generateCacheKey(TemporaryCacheKeys.REQUEST_PARAMS));
            this.removeItem(this.generateCacheKey(TemporaryCacheKeys.ORIGIN_URI));
            this.removeItem(this.generateCacheKey(TemporaryCacheKeys.URL_HASH));
            this.removeItem(this.generateCacheKey(TemporaryCacheKeys.CORRELATION_ID));
            this.removeItem(this.generateCacheKey(TemporaryCacheKeys.CCS_CREDENTIAL));
            this.removeItem(this.generateCacheKey(TemporaryCacheKeys.NATIVE_REQUEST));
            this.setInteractionInProgress(false);
        };
        /**
         * Removes temporary cache for the provided state
         * @param stateString
         */
        BrowserCacheManager.prototype.cleanRequestByState = function (stateString) {
            this.logger.trace("BrowserCacheManager.cleanRequestByState called");
            // Interaction is completed - remove interaction status.
            if (stateString) {
                var stateKey = this.generateStateKey(stateString);
                var cachedState = this.temporaryCacheStorage.getItem(stateKey);
                this.logger.infoPii("BrowserCacheManager.cleanRequestByState: Removing temporary cache items for state: " + cachedState);
                this.resetRequestCache(cachedState || Constants.EMPTY_STRING);
            }
            this.clearMsalCookies();
        };
        /**
         * Looks in temporary cache for any state values with the provided interactionType and removes all temporary cache items for that state
         * Used in scenarios where temp cache needs to be cleaned but state is not known, such as clicking browser back button.
         * @param interactionType
         */
        BrowserCacheManager.prototype.cleanRequestByInteractionType = function (interactionType) {
            var _this = this;
            this.logger.trace("BrowserCacheManager.cleanRequestByInteractionType called");
            // Loop through all keys to find state key
            this.getKeys().forEach(function (key) {
                // If this key is not the state key, move on
                if (key.indexOf(TemporaryCacheKeys.REQUEST_STATE) === -1) {
                    return;
                }
                // Retrieve state value, return if not a valid value
                var stateValue = _this.temporaryCacheStorage.getItem(key);
                if (!stateValue) {
                    return;
                }
                // Extract state and ensure it matches given InteractionType, then clean request cache
                var parsedState = BrowserProtocolUtils.extractBrowserRequestState(_this.cryptoImpl, stateValue);
                if (parsedState && parsedState.interactionType === interactionType) {
                    _this.logger.infoPii("BrowserCacheManager.cleanRequestByInteractionType: Removing temporary cache items for state: " + stateValue);
                    _this.resetRequestCache(stateValue);
                }
            });
            this.clearMsalCookies();
            this.setInteractionInProgress(false);
        };
        BrowserCacheManager.prototype.cacheCodeRequest = function (authCodeRequest, browserCrypto) {
            this.logger.trace("BrowserCacheManager.cacheCodeRequest called");
            var encodedValue = browserCrypto.base64Encode(JSON.stringify(authCodeRequest));
            this.setTemporaryCache(TemporaryCacheKeys.REQUEST_PARAMS, encodedValue, true);
        };
        /**
         * Gets the token exchange parameters from the cache. Throws an error if nothing is found.
         */
        BrowserCacheManager.prototype.getCachedRequest = function (state, browserCrypto) {
            this.logger.trace("BrowserCacheManager.getCachedRequest called");
            // Get token request from cache and parse as TokenExchangeParameters.
            var encodedTokenRequest = this.getTemporaryCache(TemporaryCacheKeys.REQUEST_PARAMS, true);
            if (!encodedTokenRequest) {
                throw BrowserAuthError.createNoTokenRequestCacheError();
            }
            var parsedRequest = this.validateAndParseJson(browserCrypto.base64Decode(encodedTokenRequest));
            if (!parsedRequest) {
                throw BrowserAuthError.createUnableToParseTokenRequestCacheError();
            }
            this.removeItem(this.generateCacheKey(TemporaryCacheKeys.REQUEST_PARAMS));
            // Get cached authority and use if no authority is cached with request.
            if (StringUtils.isEmpty(parsedRequest.authority)) {
                var authorityCacheKey = this.generateAuthorityKey(state);
                var cachedAuthority = this.getTemporaryCache(authorityCacheKey);
                if (!cachedAuthority) {
                    throw BrowserAuthError.createNoCachedAuthorityError();
                }
                parsedRequest.authority = cachedAuthority;
            }
            return parsedRequest;
        };
        /**
         * Gets cached native request for redirect flows
         */
        BrowserCacheManager.prototype.getCachedNativeRequest = function () {
            this.logger.trace("BrowserCacheManager.getCachedNativeRequest called");
            var cachedRequest = this.getTemporaryCache(TemporaryCacheKeys.NATIVE_REQUEST, true);
            if (!cachedRequest) {
                this.logger.trace("BrowserCacheManager.getCachedNativeRequest: No cached native request found");
                return null;
            }
            var parsedRequest = this.validateAndParseJson(cachedRequest);
            if (!parsedRequest) {
                this.logger.error("BrowserCacheManager.getCachedNativeRequest: Unable to parse native request");
                return null;
            }
            return parsedRequest;
        };
        BrowserCacheManager.prototype.isInteractionInProgress = function (matchClientId) {
            var clientId = this.getInteractionInProgress();
            if (matchClientId) {
                return clientId === this.clientId;
            }
            else {
                return !!clientId;
            }
        };
        BrowserCacheManager.prototype.getInteractionInProgress = function () {
            var key = Constants.CACHE_PREFIX + "." + TemporaryCacheKeys.INTERACTION_STATUS_KEY;
            return this.getTemporaryCache(key, false);
        };
        BrowserCacheManager.prototype.setInteractionInProgress = function (inProgress) {
            // Ensure we don't overwrite interaction in progress for a different clientId
            var key = Constants.CACHE_PREFIX + "." + TemporaryCacheKeys.INTERACTION_STATUS_KEY;
            if (inProgress) {
                if (this.getInteractionInProgress()) {
                    throw BrowserAuthError.createInteractionInProgressError();
                }
                else {
                    // No interaction is in progress
                    this.setTemporaryCache(key, this.clientId, false);
                }
            }
            else if (!inProgress && this.getInteractionInProgress() === this.clientId) {
                this.removeItem(key);
            }
        };
        /**
         * Returns username retrieved from ADAL or MSAL v1 idToken
         */
        BrowserCacheManager.prototype.getLegacyLoginHint = function () {
            // Only check for adal/msal token if no SSO params are being used
            var adalIdTokenString = this.getTemporaryCache(PersistentCacheKeys.ADAL_ID_TOKEN);
            if (adalIdTokenString) {
                this.browserStorage.removeItem(PersistentCacheKeys.ADAL_ID_TOKEN);
                this.logger.verbose("Cached ADAL id token retrieved.");
            }
            // Check for cached MSAL v1 id token
            var msalIdTokenString = this.getTemporaryCache(PersistentCacheKeys.ID_TOKEN, true);
            if (msalIdTokenString) {
                this.removeItem(this.generateCacheKey(PersistentCacheKeys.ID_TOKEN));
                this.logger.verbose("Cached MSAL.js v1 id token retrieved");
            }
            var cachedIdTokenString = msalIdTokenString || adalIdTokenString;
            if (cachedIdTokenString) {
                var cachedIdToken = new AuthToken(cachedIdTokenString, this.cryptoImpl);
                if (cachedIdToken.claims && cachedIdToken.claims.preferred_username) {
                    this.logger.verbose("No SSO params used and ADAL/MSAL v1 token retrieved, setting ADAL/MSAL v1 preferred_username as loginHint");
                    return cachedIdToken.claims.preferred_username;
                }
                else if (cachedIdToken.claims && cachedIdToken.claims.upn) {
                    this.logger.verbose("No SSO params used and ADAL/MSAL v1 token retrieved, setting ADAL/MSAL v1 upn as loginHint");
                    return cachedIdToken.claims.upn;
                }
                else {
                    this.logger.verbose("No SSO params used and ADAL/MSAL v1 token retrieved, however, no account hint claim found. Enable preferred_username or upn id token claim to get SSO.");
                }
            }
            return null;
        };
        /**
         * Updates a credential's cache key if the current cache key is outdated
         */
        BrowserCacheManager.prototype.updateCredentialCacheKey = function (currentCacheKey, credential) {
            var updatedCacheKey = credential.generateCredentialKey();
            if (currentCacheKey !== updatedCacheKey) {
                var cacheItem = this.getItem(currentCacheKey);
                if (cacheItem) {
                    this.removeItem(currentCacheKey);
                    this.setItem(updatedCacheKey, cacheItem);
                    this.logger.verbose("Updated an outdated " + credential.credentialType + " cache key");
                    return updatedCacheKey;
                }
                else {
                    this.logger.error("Attempted to update an outdated " + credential.credentialType + " cache key but no item matching the outdated key was found in storage");
                }
            }
            return currentCacheKey;
        };
        return BrowserCacheManager;
    }(CacheManager));
    var DEFAULT_BROWSER_CACHE_MANAGER = function (clientId, logger) {
        var cacheOptions = {
            cacheLocation: exports.BrowserCacheLocation.MemoryStorage,
            storeAuthStateInCookie: false,
            secureCookies: false
        };
        return new BrowserCacheManager(clientId, cacheOptions, DEFAULT_CRYPTO_IMPLEMENTATION, logger);
    };

    /* eslint-disable header/header */
    var name = "@azure/msal-browser";
    var version = "2.28.1";

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * This class implements the Fetch API for GET and POST requests. See more here: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API
     */
    var FetchClient = /** @class */ (function () {
        function FetchClient() {
        }
        /**
         * Fetch Client for REST endpoints - Get request
         * @param url
         * @param headers
         * @param body
         */
        FetchClient.prototype.sendGetRequestAsync = function (url, options) {
            return __awaiter$1(this, void 0, void 0, function () {
                var response, e_1, _a;
                return __generator$1(this, function (_b) {
                    switch (_b.label) {
                        case 0:
                            _b.trys.push([0, 2, , 3]);
                            return [4 /*yield*/, fetch(url, {
                                    method: HTTP_REQUEST_TYPE.GET,
                                    headers: this.getFetchHeaders(options)
                                })];
                        case 1:
                            response = _b.sent();
                            return [3 /*break*/, 3];
                        case 2:
                            e_1 = _b.sent();
                            if (window.navigator.onLine) {
                                throw BrowserAuthError.createGetRequestFailedError(e_1, url);
                            }
                            else {
                                throw BrowserAuthError.createNoNetworkConnectivityError();
                            }
                        case 3:
                            _b.trys.push([3, 5, , 6]);
                            _a = {
                                headers: this.getHeaderDict(response.headers)
                            };
                            return [4 /*yield*/, response.json()];
                        case 4: return [2 /*return*/, (_a.body = (_b.sent()),
                                _a.status = response.status,
                                _a)];
                        case 5:
                            _b.sent();
                            throw BrowserAuthError.createFailedToParseNetworkResponseError(url);
                        case 6: return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * Fetch Client for REST endpoints - Post request
         * @param url
         * @param headers
         * @param body
         */
        FetchClient.prototype.sendPostRequestAsync = function (url, options) {
            return __awaiter$1(this, void 0, void 0, function () {
                var reqBody, response, e_3, _a;
                return __generator$1(this, function (_b) {
                    switch (_b.label) {
                        case 0:
                            reqBody = (options && options.body) || Constants.EMPTY_STRING;
                            _b.label = 1;
                        case 1:
                            _b.trys.push([1, 3, , 4]);
                            return [4 /*yield*/, fetch(url, {
                                    method: HTTP_REQUEST_TYPE.POST,
                                    headers: this.getFetchHeaders(options),
                                    body: reqBody
                                })];
                        case 2:
                            response = _b.sent();
                            return [3 /*break*/, 4];
                        case 3:
                            e_3 = _b.sent();
                            if (window.navigator.onLine) {
                                throw BrowserAuthError.createPostRequestFailedError(e_3, url);
                            }
                            else {
                                throw BrowserAuthError.createNoNetworkConnectivityError();
                            }
                        case 4:
                            _b.trys.push([4, 6, , 7]);
                            _a = {
                                headers: this.getHeaderDict(response.headers)
                            };
                            return [4 /*yield*/, response.json()];
                        case 5: return [2 /*return*/, (_a.body = (_b.sent()),
                                _a.status = response.status,
                                _a)];
                        case 6:
                            _b.sent();
                            throw BrowserAuthError.createFailedToParseNetworkResponseError(url);
                        case 7: return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * Get Fetch API Headers object from string map
         * @param inputHeaders
         */
        FetchClient.prototype.getFetchHeaders = function (options) {
            var headers = new Headers();
            if (!(options && options.headers)) {
                return headers;
            }
            var optionsHeaders = options.headers;
            Object.keys(optionsHeaders).forEach(function (key) {
                headers.append(key, optionsHeaders[key]);
            });
            return headers;
        };
        FetchClient.prototype.getHeaderDict = function (headers) {
            var headerDict = {};
            headers.forEach(function (value, key) {
                headerDict[key] = value;
            });
            return headerDict;
        };
        return FetchClient;
    }());

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * This client implements the XMLHttpRequest class to send GET and POST requests.
     */
    var XhrClient = /** @class */ (function () {
        function XhrClient() {
        }
        /**
         * XhrClient for REST endpoints - Get request
         * @param url
         * @param headers
         * @param body
         */
        XhrClient.prototype.sendGetRequestAsync = function (url, options) {
            return __awaiter$1(this, void 0, void 0, function () {
                return __generator$1(this, function (_a) {
                    return [2 /*return*/, this.sendRequestAsync(url, HTTP_REQUEST_TYPE.GET, options)];
                });
            });
        };
        /**
         * XhrClient for REST endpoints - Post request
         * @param url
         * @param headers
         * @param body
         */
        XhrClient.prototype.sendPostRequestAsync = function (url, options) {
            return __awaiter$1(this, void 0, void 0, function () {
                return __generator$1(this, function (_a) {
                    return [2 /*return*/, this.sendRequestAsync(url, HTTP_REQUEST_TYPE.POST, options)];
                });
            });
        };
        /**
         * Helper for XhrClient requests.
         * @param url
         * @param method
         * @param options
         */
        XhrClient.prototype.sendRequestAsync = function (url, method, options) {
            var _this = this;
            return new Promise(function (resolve, reject) {
                var xhr = new XMLHttpRequest();
                xhr.open(method, url, /* async: */ true);
                _this.setXhrHeaders(xhr, options);
                xhr.onload = function () {
                    if (xhr.status < 200 || xhr.status >= 300) {
                        if (method === HTTP_REQUEST_TYPE.POST) {
                            reject(BrowserAuthError.createPostRequestFailedError("Failed with status " + xhr.status, url));
                        }
                        else {
                            reject(BrowserAuthError.createGetRequestFailedError("Failed with status " + xhr.status, url));
                        }
                    }
                    try {
                        var jsonResponse = JSON.parse(xhr.responseText);
                        var networkResponse = {
                            headers: _this.getHeaderDict(xhr),
                            body: jsonResponse,
                            status: xhr.status
                        };
                        resolve(networkResponse);
                    }
                    catch (e) {
                        reject(BrowserAuthError.createFailedToParseNetworkResponseError(url));
                    }
                };
                xhr.onerror = function () {
                    if (window.navigator.onLine) {
                        if (method === HTTP_REQUEST_TYPE.POST) {
                            reject(BrowserAuthError.createPostRequestFailedError("Failed with status " + xhr.status, url));
                        }
                        else {
                            reject(BrowserAuthError.createGetRequestFailedError("Failed with status " + xhr.status, url));
                        }
                    }
                    else {
                        reject(BrowserAuthError.createNoNetworkConnectivityError());
                    }
                };
                if (method === HTTP_REQUEST_TYPE.POST && options && options.body) {
                    xhr.send(options.body);
                }
                else if (method === HTTP_REQUEST_TYPE.GET) {
                    xhr.send();
                }
                else {
                    throw BrowserAuthError.createHttpMethodNotImplementedError(method);
                }
            });
        };
        /**
         * Helper to set XHR headers for request.
         * @param xhr
         * @param options
         */
        XhrClient.prototype.setXhrHeaders = function (xhr, options) {
            if (options && options.headers) {
                var headers_1 = options.headers;
                Object.keys(headers_1).forEach(function (key) {
                    xhr.setRequestHeader(key, headers_1[key]);
                });
            }
        };
        /**
         * Gets a string map of the headers received in the response.
         *
         * Algorithm comes from https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getAllResponseHeaders
         * @param xhr
         */
        XhrClient.prototype.getHeaderDict = function (xhr) {
            var headerString = xhr.getAllResponseHeaders();
            var headerArr = headerString.trim().split(/[\r\n]+/);
            var headerDict = {};
            headerArr.forEach(function (value) {
                var parts = value.split(": ");
                var headerName = parts.shift();
                var headerVal = parts.join(": ");
                if (headerName && headerVal) {
                    headerDict[headerName] = headerVal;
                }
            });
            return headerDict;
        };
        return XhrClient;
    }());

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * Utility class for browser specific functions
     */
    var BrowserUtils = /** @class */ (function () {
        function BrowserUtils() {
        }
        // #region Window Navigation and URL management
        /**
         * Clears hash from window url.
         */
        BrowserUtils.clearHash = function (contentWindow) {
            // Office.js sets history.replaceState to null
            contentWindow.location.hash = Constants.EMPTY_STRING;
            if (typeof contentWindow.history.replaceState === "function") {
                // Full removes "#" from url
                contentWindow.history.replaceState(null, Constants.EMPTY_STRING, "" + contentWindow.location.origin + contentWindow.location.pathname + contentWindow.location.search);
            }
        };
        /**
         * Replaces current hash with hash from provided url
         */
        BrowserUtils.replaceHash = function (url) {
            var urlParts = url.split("#");
            urlParts.shift(); // Remove part before the hash
            window.location.hash = urlParts.length > 0 ? urlParts.join("#") : Constants.EMPTY_STRING;
        };
        /**
         * Returns boolean of whether the current window is in an iframe or not.
         */
        BrowserUtils.isInIframe = function () {
            return window.parent !== window;
        };
        /**
         * Returns boolean of whether or not the current window is a popup opened by msal
         */
        BrowserUtils.isInPopup = function () {
            return typeof window !== "undefined" && !!window.opener &&
                window.opener !== window &&
                typeof window.name === "string" &&
                window.name.indexOf(BrowserConstants.POPUP_NAME_PREFIX + ".") === 0;
        };
        // #endregion
        /**
         * Returns current window URL as redirect uri
         */
        BrowserUtils.getCurrentUri = function () {
            return window.location.href.split("?")[0].split("#")[0];
        };
        /**
         * Gets the homepage url for the current window location.
         */
        BrowserUtils.getHomepage = function () {
            var currentUrl = new UrlString(window.location.href);
            var urlComponents = currentUrl.getUrlComponents();
            return urlComponents.Protocol + "//" + urlComponents.HostNameAndPort + "/";
        };
        /**
         * Returns best compatible network client object.
         */
        BrowserUtils.getBrowserNetworkClient = function () {
            if (window.fetch && window.Headers) {
                return new FetchClient();
            }
            else {
                return new XhrClient();
            }
        };
        /**
         * Throws error if we have completed an auth and are
         * attempting another auth request inside an iframe.
         */
        BrowserUtils.blockReloadInHiddenIframes = function () {
            var isResponseHash = UrlString.hashContainsKnownProperties(window.location.hash);
            // return an error if called from the hidden iframe created by the msal js silent calls
            if (isResponseHash && BrowserUtils.isInIframe()) {
                throw BrowserAuthError.createBlockReloadInHiddenIframeError();
            }
        };
        /**
         * Block redirect operations in iframes unless explicitly allowed
         * @param interactionType Interaction type for the request
         * @param allowRedirectInIframe Config value to allow redirects when app is inside an iframe
         */
        BrowserUtils.blockRedirectInIframe = function (interactionType, allowRedirectInIframe) {
            var isIframedApp = BrowserUtils.isInIframe();
            if (interactionType === exports.InteractionType.Redirect && isIframedApp && !allowRedirectInIframe) {
                // If we are not in top frame, we shouldn't redirect. This is also handled by the service.
                throw BrowserAuthError.createRedirectInIframeError(isIframedApp);
            }
        };
        /**
         * Block redirectUri loaded in popup from calling AcquireToken APIs
         */
        BrowserUtils.blockAcquireTokenInPopups = function () {
            // Popups opened by msal popup APIs are given a name that starts with "msal."
            if (BrowserUtils.isInPopup()) {
                throw BrowserAuthError.createBlockAcquireTokenInPopupsError();
            }
        };
        /**
         * Throws error if token requests are made in non-browser environment
         * @param isBrowserEnvironment Flag indicating if environment is a browser.
         */
        BrowserUtils.blockNonBrowserEnvironment = function (isBrowserEnvironment) {
            if (!isBrowserEnvironment) {
                throw BrowserAuthError.createNonBrowserEnvironmentError();
            }
        };
        /**
         * Throws error if native brokering is enabled but initialize hasn't been called
         * @param allowNativeBroker
         * @param initialized
         */
        BrowserUtils.blockNativeBrokerCalledBeforeInitialized = function (allowNativeBroker, initialized) {
            if (allowNativeBroker && !initialized) {
                throw BrowserAuthError.createNativeBrokerCalledBeforeInitialize();
            }
        };
        /**
         * Returns boolean of whether current browser is an Internet Explorer or Edge browser.
         */
        BrowserUtils.detectIEOrEdge = function () {
            var ua = window.navigator.userAgent;
            var msie = ua.indexOf("MSIE ");
            var msie11 = ua.indexOf("Trident/");
            var msedge = ua.indexOf("Edge/");
            var isIE = msie > 0 || msie11 > 0;
            var isEdge = msedge > 0;
            return isIE || isEdge;
        };
        return BrowserUtils;
    }());

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var BaseInteractionClient = /** @class */ (function () {
        function BaseInteractionClient(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeMessageHandler, correlationId) {
            this.config = config;
            this.browserStorage = storageImpl;
            this.browserCrypto = browserCrypto;
            this.networkClient = this.config.system.networkClient;
            this.eventHandler = eventHandler;
            this.navigationClient = navigationClient;
            this.nativeMessageHandler = nativeMessageHandler;
            this.correlationId = correlationId || this.browserCrypto.createNewGuid();
            this.logger = logger.clone(BrowserConstants.MSAL_SKU, version, this.correlationId);
            this.performanceClient = performanceClient;
        }
        BaseInteractionClient.prototype.clearCacheOnLogout = function (account) {
            return __awaiter$1(this, void 0, void 0, function () {
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            if (!account) return [3 /*break*/, 5];
                            if (AccountEntity.accountInfoIsEqual(account, this.browserStorage.getActiveAccount(), false)) {
                                this.logger.verbose("Setting active account to null");
                                this.browserStorage.setActiveAccount(null);
                            }
                            _a.label = 1;
                        case 1:
                            _a.trys.push([1, 3, , 4]);
                            return [4 /*yield*/, this.browserStorage.removeAccount(AccountEntity.generateAccountCacheKey(account))];
                        case 2:
                            _a.sent();
                            this.logger.verbose("Cleared cache items belonging to the account provided in the logout request.");
                            return [3 /*break*/, 4];
                        case 3:
                            _a.sent();
                            this.logger.error("Account provided in logout request was not found. Local cache unchanged.");
                            return [3 /*break*/, 4];
                        case 4: return [3 /*break*/, 9];
                        case 5:
                            _a.trys.push([5, 8, , 9]);
                            this.logger.verbose("No account provided in logout request, clearing all cache items.", this.correlationId);
                            // Clear all accounts and tokens
                            return [4 /*yield*/, this.browserStorage.clear()];
                        case 6:
                            // Clear all accounts and tokens
                            _a.sent();
                            // Clear any stray keys from IndexedDB
                            return [4 /*yield*/, this.browserCrypto.clearKeystore()];
                        case 7:
                            // Clear any stray keys from IndexedDB
                            _a.sent();
                            return [3 /*break*/, 9];
                        case 8:
                            _a.sent();
                            this.logger.error("Attempted to clear all MSAL cache items and failed. Local cache unchanged.");
                            return [3 /*break*/, 9];
                        case 9: return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * Initializer function for all request APIs
         * @param request
         */
        BaseInteractionClient.prototype.initializeBaseRequest = function (request) {
            return __awaiter$1(this, void 0, void 0, function () {
                var authority, scopes, validatedRequest, _a;
                return __generator$1(this, function (_b) {
                    switch (_b.label) {
                        case 0:
                            this.logger.verbose("Initializing BaseAuthRequest");
                            authority = request.authority || this.config.auth.authority;
                            scopes = __spread(((request && request.scopes) || []));
                            validatedRequest = __assign$1(__assign$1({}, request), { correlationId: this.correlationId, authority: authority,
                                scopes: scopes });
                            // Set authenticationScheme to BEARER if not explicitly set in the request
                            if (!validatedRequest.authenticationScheme) {
                                validatedRequest.authenticationScheme = exports.AuthenticationScheme.BEARER;
                                this.logger.verbose("Authentication Scheme wasn't explicitly set in request, defaulting to \"Bearer\" request");
                            }
                            else {
                                if (validatedRequest.authenticationScheme === exports.AuthenticationScheme.SSH) {
                                    if (!request.sshJwk) {
                                        throw ClientConfigurationError.createMissingSshJwkError();
                                    }
                                    if (!request.sshKid) {
                                        throw ClientConfigurationError.createMissingSshKidError();
                                    }
                                }
                                this.logger.verbose("Authentication Scheme set to \"" + validatedRequest.authenticationScheme + "\" as configured in Auth request");
                            }
                            if (!(request.claims && !StringUtils.isEmpty(request.claims))) return [3 /*break*/, 2];
                            _a = validatedRequest;
                            return [4 /*yield*/, this.browserCrypto.hashString(request.claims)];
                        case 1:
                            _a.requestedClaimsHash = _b.sent();
                            _b.label = 2;
                        case 2: return [2 /*return*/, validatedRequest];
                    }
                });
            });
        };
        /**
         *
         * Use to get the redirect uri configured in MSAL or null.
         * @param requestRedirectUri
         * @returns Redirect URL
         *
         */
        BaseInteractionClient.prototype.getRedirectUri = function (requestRedirectUri) {
            this.logger.verbose("getRedirectUri called");
            var redirectUri = requestRedirectUri || this.config.auth.redirectUri || BrowserUtils.getCurrentUri();
            return UrlString.getAbsoluteUrl(redirectUri, BrowserUtils.getCurrentUri());
        };
        /**
         *
         * @param apiId
         * @param correlationId
         * @param forceRefresh
         */
        BaseInteractionClient.prototype.initializeServerTelemetryManager = function (apiId, forceRefresh) {
            this.logger.verbose("initializeServerTelemetryManager called");
            var telemetryPayload = {
                clientId: this.config.auth.clientId,
                correlationId: this.correlationId,
                apiId: apiId,
                forceRefresh: forceRefresh || false,
                wrapperSKU: this.browserStorage.getWrapperMetadata()[0],
                wrapperVer: this.browserStorage.getWrapperMetadata()[1]
            };
            return new ServerTelemetryManager(telemetryPayload, this.browserStorage);
        };
        /**
         * Used to get a discovered version of the default authority.
         * @param requestAuthority
         * @param requestCorrelationId
         */
        BaseInteractionClient.prototype.getDiscoveredAuthority = function (requestAuthority) {
            return __awaiter$1(this, void 0, void 0, function () {
                var authorityOptions;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            this.logger.verbose("getDiscoveredAuthority called");
                            authorityOptions = {
                                protocolMode: this.config.auth.protocolMode,
                                knownAuthorities: this.config.auth.knownAuthorities,
                                cloudDiscoveryMetadata: this.config.auth.cloudDiscoveryMetadata,
                                authorityMetadata: this.config.auth.authorityMetadata
                            };
                            if (!requestAuthority) return [3 /*break*/, 2];
                            this.logger.verbose("Creating discovered authority with request authority");
                            return [4 /*yield*/, AuthorityFactory.createDiscoveredInstance(requestAuthority, this.config.system.networkClient, this.browserStorage, authorityOptions)];
                        case 1: return [2 /*return*/, _a.sent()];
                        case 2:
                            this.logger.verbose("Creating discovered authority with configured authority");
                            return [4 /*yield*/, AuthorityFactory.createDiscoveredInstance(this.config.auth.authority, this.config.system.networkClient, this.browserStorage, authorityOptions)];
                        case 3: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        return BaseInteractionClient;
    }());

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * Defines the class structure and helper functions used by the "standard", non-brokered auth flows (popup, redirect, silent (RT), silent (iframe))
     */
    var StandardInteractionClient = /** @class */ (function (_super) {
        __extends$1(StandardInteractionClient, _super);
        function StandardInteractionClient() {
            return _super !== null && _super.apply(this, arguments) || this;
        }
        /**
         * Generates an auth code request tied to the url request.
         * @param request
         */
        StandardInteractionClient.prototype.initializeAuthorizationCodeRequest = function (request) {
            return __awaiter$1(this, void 0, void 0, function () {
                var generatedPkceParams, authCodeRequest;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            this.logger.verbose("initializeAuthorizationRequest called", request.correlationId);
                            return [4 /*yield*/, this.browserCrypto.generatePkceCodes()];
                        case 1:
                            generatedPkceParams = _a.sent();
                            authCodeRequest = __assign$1(__assign$1({}, request), { redirectUri: request.redirectUri, code: Constants.EMPTY_STRING, codeVerifier: generatedPkceParams.verifier });
                            request.codeChallenge = generatedPkceParams.challenge;
                            request.codeChallengeMethod = Constants.S256_CODE_CHALLENGE_METHOD;
                            return [2 /*return*/, authCodeRequest];
                    }
                });
            });
        };
        /**
         * Initializer for the logout request.
         * @param logoutRequest
         */
        StandardInteractionClient.prototype.initializeLogoutRequest = function (logoutRequest) {
            this.logger.verbose("initializeLogoutRequest called", logoutRequest === null || logoutRequest === void 0 ? void 0 : logoutRequest.correlationId);
            var validLogoutRequest = __assign$1({ correlationId: this.correlationId || this.browserCrypto.createNewGuid() }, logoutRequest);
            /**
             * Set logout_hint to be login_hint from ID Token Claims if present
             * and logoutHint attribute wasn't manually set in logout request
             */
            if (logoutRequest) {
                // If logoutHint isn't set and an account was passed in, try to extract logoutHint from ID Token Claims
                if (!logoutRequest.logoutHint) {
                    if (logoutRequest.account) {
                        var logoutHint = this.getLogoutHintFromIdTokenClaims(logoutRequest.account);
                        if (logoutHint) {
                            this.logger.verbose("Setting logoutHint to login_hint ID Token Claim value for the account provided");
                            validLogoutRequest.logoutHint = logoutHint;
                        }
                    }
                    else {
                        this.logger.verbose("logoutHint was not set and account was not passed into logout request, logoutHint will not be set");
                    }
                }
                else {
                    this.logger.verbose("logoutHint has already been set in logoutRequest");
                }
            }
            else {
                this.logger.verbose("logoutHint will not be set since no logout request was configured");
            }
            /*
             * Only set redirect uri if logout request isn't provided or the set uri isn't null.
             * Otherwise, use passed uri, config, or current page.
             */
            if (!logoutRequest || logoutRequest.postLogoutRedirectUri !== null) {
                if (logoutRequest && logoutRequest.postLogoutRedirectUri) {
                    this.logger.verbose("Setting postLogoutRedirectUri to uri set on logout request", validLogoutRequest.correlationId);
                    validLogoutRequest.postLogoutRedirectUri = UrlString.getAbsoluteUrl(logoutRequest.postLogoutRedirectUri, BrowserUtils.getCurrentUri());
                }
                else if (this.config.auth.postLogoutRedirectUri === null) {
                    this.logger.verbose("postLogoutRedirectUri configured as null and no uri set on request, not passing post logout redirect", validLogoutRequest.correlationId);
                }
                else if (this.config.auth.postLogoutRedirectUri) {
                    this.logger.verbose("Setting postLogoutRedirectUri to configured uri", validLogoutRequest.correlationId);
                    validLogoutRequest.postLogoutRedirectUri = UrlString.getAbsoluteUrl(this.config.auth.postLogoutRedirectUri, BrowserUtils.getCurrentUri());
                }
                else {
                    this.logger.verbose("Setting postLogoutRedirectUri to current page", validLogoutRequest.correlationId);
                    validLogoutRequest.postLogoutRedirectUri = UrlString.getAbsoluteUrl(BrowserUtils.getCurrentUri(), BrowserUtils.getCurrentUri());
                }
            }
            else {
                this.logger.verbose("postLogoutRedirectUri passed as null, not setting post logout redirect uri", validLogoutRequest.correlationId);
            }
            return validLogoutRequest;
        };
        /**
         * Parses login_hint ID Token Claim out of AccountInfo object to be used as
         * logout_hint in end session request.
         * @param account
         */
        StandardInteractionClient.prototype.getLogoutHintFromIdTokenClaims = function (account) {
            var idTokenClaims = account.idTokenClaims;
            if (idTokenClaims) {
                if (idTokenClaims.login_hint) {
                    return idTokenClaims.login_hint;
                }
                else {
                    this.logger.verbose("The ID Token Claims tied to the provided account do not contain a login_hint claim, logoutHint will not be added to logout request");
                }
            }
            else {
                this.logger.verbose("The provided account does not contain ID Token Claims, logoutHint will not be added to logout request");
            }
            return null;
        };
        /**
         * Creates an Authorization Code Client with the given authority, or the default authority.
         * @param serverTelemetryManager
         * @param authorityUrl
         */
        StandardInteractionClient.prototype.createAuthCodeClient = function (serverTelemetryManager, authorityUrl, requestAzureCloudOptions) {
            return __awaiter$1(this, void 0, void 0, function () {
                var clientConfig;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.getClientConfiguration(serverTelemetryManager, authorityUrl, requestAzureCloudOptions)];
                        case 1:
                            clientConfig = _a.sent();
                            return [2 /*return*/, new AuthorizationCodeClient(clientConfig)];
                    }
                });
            });
        };
        /**
         * Creates a Client Configuration object with the given request authority, or the default authority.
         * @param serverTelemetryManager
         * @param requestAuthority
         * @param requestCorrelationId
         */
        StandardInteractionClient.prototype.getClientConfiguration = function (serverTelemetryManager, requestAuthority, requestAzureCloudOptions) {
            return __awaiter$1(this, void 0, void 0, function () {
                var discoveredAuthority;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            this.logger.verbose("getClientConfiguration called", this.correlationId);
                            return [4 /*yield*/, this.getDiscoveredAuthority(requestAuthority, requestAzureCloudOptions)];
                        case 1:
                            discoveredAuthority = _a.sent();
                            return [2 /*return*/, {
                                    authOptions: {
                                        clientId: this.config.auth.clientId,
                                        authority: discoveredAuthority,
                                        clientCapabilities: this.config.auth.clientCapabilities
                                    },
                                    systemOptions: {
                                        tokenRenewalOffsetSeconds: this.config.system.tokenRenewalOffsetSeconds,
                                        preventCorsPreflight: true
                                    },
                                    loggerOptions: {
                                        loggerCallback: this.config.system.loggerOptions.loggerCallback,
                                        piiLoggingEnabled: this.config.system.loggerOptions.piiLoggingEnabled,
                                        logLevel: this.config.system.loggerOptions.logLevel,
                                        correlationId: this.correlationId
                                    },
                                    cryptoInterface: this.browserCrypto,
                                    networkInterface: this.networkClient,
                                    storageInterface: this.browserStorage,
                                    serverTelemetryManager: serverTelemetryManager,
                                    libraryInfo: {
                                        sku: BrowserConstants.MSAL_SKU,
                                        version: version,
                                        cpu: Constants.EMPTY_STRING,
                                        os: Constants.EMPTY_STRING
                                    },
                                    telemetry: this.config.telemetry
                                }];
                    }
                });
            });
        };
        /**
         * @param hash
         * @param interactionType
         */
        StandardInteractionClient.prototype.validateAndExtractStateFromHash = function (serverParams, interactionType, requestCorrelationId) {
            this.logger.verbose("validateAndExtractStateFromHash called", requestCorrelationId);
            if (!serverParams.state) {
                throw BrowserAuthError.createHashDoesNotContainStateError();
            }
            var platformStateObj = BrowserProtocolUtils.extractBrowserRequestState(this.browserCrypto, serverParams.state);
            if (!platformStateObj) {
                throw BrowserAuthError.createUnableToParseStateError();
            }
            if (platformStateObj.interactionType !== interactionType) {
                throw BrowserAuthError.createStateInteractionTypeMismatchError();
            }
            this.logger.verbose("Returning state from hash", requestCorrelationId);
            return serverParams.state;
        };
        /**
         * Used to get a discovered version of the default authority.
         * @param requestAuthority
         * @param requestCorrelationId
         */
        StandardInteractionClient.prototype.getDiscoveredAuthority = function (requestAuthority, requestAzureCloudOptions) {
            return __awaiter$1(this, void 0, void 0, function () {
                var getAuthorityMeasurement, authorityOptions, userAuthority, builtAuthority;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            this.logger.verbose("getDiscoveredAuthority called", this.correlationId);
                            getAuthorityMeasurement = this.performanceClient.startMeasurement(exports.PerformanceEvents.StandardInteractionClientGetDiscoveredAuthority, this.correlationId);
                            authorityOptions = {
                                protocolMode: this.config.auth.protocolMode,
                                knownAuthorities: this.config.auth.knownAuthorities,
                                cloudDiscoveryMetadata: this.config.auth.cloudDiscoveryMetadata,
                                authorityMetadata: this.config.auth.authorityMetadata,
                                skipAuthorityMetadataCache: this.config.auth.skipAuthorityMetadataCache
                            };
                            userAuthority = requestAuthority ? requestAuthority : this.config.auth.authority;
                            builtAuthority = Authority.generateAuthority(userAuthority, requestAzureCloudOptions || this.config.auth.azureCloudOptions);
                            this.logger.verbose("Creating discovered authority with configured authority", this.correlationId);
                            return [4 /*yield*/, AuthorityFactory.createDiscoveredInstance(builtAuthority, this.config.system.networkClient, this.browserStorage, authorityOptions)
                                    .then(function (result) {
                                    getAuthorityMeasurement.endMeasurement({
                                        success: true
                                    });
                                    return result;
                                })
                                    .catch(function (error) {
                                    getAuthorityMeasurement.endMeasurement({
                                        errorCode: error.errorCode,
                                        subErrorCode: error.subError,
                                        success: false
                                    });
                                    throw error;
                                })];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        /**
         * Helper to initialize required request parameters for interactive APIs and ssoSilent()
         * @param request
         * @param interactionType
         */
        StandardInteractionClient.prototype.initializeAuthorizationRequest = function (request, interactionType) {
            return __awaiter$1(this, void 0, void 0, function () {
                var redirectUri, browserState, state, validatedRequest, _a, account, legacyLoginHint;
                return __generator$1(this, function (_b) {
                    switch (_b.label) {
                        case 0:
                            this.logger.verbose("initializeAuthorizationRequest called", this.correlationId);
                            redirectUri = this.getRedirectUri(request.redirectUri);
                            browserState = {
                                interactionType: interactionType
                            };
                            state = ProtocolUtils.setRequestState(this.browserCrypto, (request && request.state) || Constants.EMPTY_STRING, browserState);
                            _a = [{}];
                            return [4 /*yield*/, this.initializeBaseRequest(request)];
                        case 1:
                            validatedRequest = __assign$1.apply(void 0, [__assign$1.apply(void 0, _a.concat([_b.sent()])), { redirectUri: redirectUri, state: state, nonce: request.nonce || this.browserCrypto.createNewGuid(), responseMode: ResponseMode.FRAGMENT }]);
                            account = request.account || this.browserStorage.getActiveAccount();
                            if (account) {
                                this.logger.verbose("Setting validated request account", this.correlationId);
                                this.logger.verbosePii("Setting validated request account: " + account.homeAccountId, this.correlationId);
                                validatedRequest.account = account;
                            }
                            // Check for ADAL/MSAL v1 SSO
                            if (StringUtils.isEmpty(validatedRequest.loginHint) && !account) {
                                legacyLoginHint = this.browserStorage.getLegacyLoginHint();
                                if (legacyLoginHint) {
                                    validatedRequest.loginHint = legacyLoginHint;
                                }
                            }
                            return [2 /*return*/, validatedRequest];
                    }
                });
            });
        };
        return StandardInteractionClient;
    }(BaseInteractionClient));

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * Abstract class which defines operations for a browser interaction handling class.
     */
    var InteractionHandler = /** @class */ (function () {
        function InteractionHandler(authCodeModule, storageImpl, authCodeRequest, logger) {
            this.authModule = authCodeModule;
            this.browserStorage = storageImpl;
            this.authCodeRequest = authCodeRequest;
            this.logger = logger;
        }
        /**
         * Function to handle response parameters from hash.
         * @param locationHash
         */
        InteractionHandler.prototype.handleCodeResponseFromHash = function (locationHash, state, authority, networkModule) {
            return __awaiter$1(this, void 0, void 0, function () {
                var stateKey, requestState, authCodeResponse;
                return __generator$1(this, function (_a) {
                    this.logger.verbose("InteractionHandler.handleCodeResponse called");
                    // Check that location hash isn't empty.
                    if (StringUtils.isEmpty(locationHash)) {
                        throw BrowserAuthError.createEmptyHashError(locationHash);
                    }
                    stateKey = this.browserStorage.generateStateKey(state);
                    requestState = this.browserStorage.getTemporaryCache(stateKey);
                    if (!requestState) {
                        throw ClientAuthError.createStateNotFoundError("Cached State");
                    }
                    try {
                        authCodeResponse = this.authModule.handleFragmentResponse(locationHash, requestState);
                    }
                    catch (e) {
                        if (e instanceof ServerError && e.subError === BrowserAuthErrorMessage.userCancelledError.code) {
                            // Translate server error caused by user closing native prompt to corresponding first class MSAL error
                            throw BrowserAuthError.createUserCancelledError();
                        }
                        else {
                            throw e;
                        }
                    }
                    return [2 /*return*/, this.handleCodeResponseFromServer(authCodeResponse, state, authority, networkModule)];
                });
            });
        };
        /**
         * Process auth code response from AAD
         * @param authCodeResponse
         * @param state
         * @param authority
         * @param networkModule
         * @returns
         */
        InteractionHandler.prototype.handleCodeResponseFromServer = function (authCodeResponse, state, authority, networkModule, validateNonce) {
            if (validateNonce === void 0) { validateNonce = true; }
            return __awaiter$1(this, void 0, void 0, function () {
                var stateKey, requestState, nonceKey, cachedNonce, cachedCcsCred, tokenResponse;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            this.logger.trace("InteractionHandler.handleCodeResponseFromServer called");
                            stateKey = this.browserStorage.generateStateKey(state);
                            requestState = this.browserStorage.getTemporaryCache(stateKey);
                            if (!requestState) {
                                throw ClientAuthError.createStateNotFoundError("Cached State");
                            }
                            nonceKey = this.browserStorage.generateNonceKey(requestState);
                            cachedNonce = this.browserStorage.getTemporaryCache(nonceKey);
                            // Assign code to request
                            this.authCodeRequest.code = authCodeResponse.code;
                            if (!authCodeResponse.cloud_instance_host_name) return [3 /*break*/, 2];
                            return [4 /*yield*/, this.updateTokenEndpointAuthority(authCodeResponse.cloud_instance_host_name, authority, networkModule)];
                        case 1:
                            _a.sent();
                            _a.label = 2;
                        case 2:
                            // Nonce validation not needed when redirect not involved (e.g. hybrid spa, renewing token via rt)
                            if (validateNonce) {
                                authCodeResponse.nonce = cachedNonce || undefined;
                            }
                            authCodeResponse.state = requestState;
                            // Add CCS parameters if available
                            if (authCodeResponse.client_info) {
                                this.authCodeRequest.clientInfo = authCodeResponse.client_info;
                            }
                            else {
                                cachedCcsCred = this.checkCcsCredentials();
                                if (cachedCcsCred) {
                                    this.authCodeRequest.ccsCredential = cachedCcsCred;
                                }
                            }
                            return [4 /*yield*/, this.authModule.acquireToken(this.authCodeRequest, authCodeResponse)];
                        case 3:
                            tokenResponse = _a.sent();
                            this.browserStorage.cleanRequestByState(state);
                            return [2 /*return*/, tokenResponse];
                    }
                });
            });
        };
        /**
         * Updates authority based on cloudInstanceHostname
         * @param cloudInstanceHostname
         * @param authority
         * @param networkModule
         */
        InteractionHandler.prototype.updateTokenEndpointAuthority = function (cloudInstanceHostname, authority, networkModule) {
            return __awaiter$1(this, void 0, void 0, function () {
                var cloudInstanceAuthorityUri, cloudInstanceAuthority;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            cloudInstanceAuthorityUri = "https://" + cloudInstanceHostname + "/" + authority.tenant + "/";
                            return [4 /*yield*/, AuthorityFactory.createDiscoveredInstance(cloudInstanceAuthorityUri, networkModule, this.browserStorage, authority.options)];
                        case 1:
                            cloudInstanceAuthority = _a.sent();
                            this.authModule.updateAuthority(cloudInstanceAuthority);
                            return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * Looks up ccs creds in the cache
         */
        InteractionHandler.prototype.checkCcsCredentials = function () {
            // Look up ccs credential in temp cache
            var cachedCcsCred = this.browserStorage.getTemporaryCache(TemporaryCacheKeys.CCS_CREDENTIAL, true);
            if (cachedCcsCred) {
                try {
                    return JSON.parse(cachedCcsCred);
                }
                catch (e) {
                    this.authModule.logger.error("Cache credential could not be parsed");
                    this.authModule.logger.errorPii("Cache credential could not be parsed: " + cachedCcsCred);
                }
            }
            return null;
        };
        return InteractionHandler;
    }());

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var RedirectHandler = /** @class */ (function (_super) {
        __extends$1(RedirectHandler, _super);
        function RedirectHandler(authCodeModule, storageImpl, authCodeRequest, logger, browserCrypto) {
            var _this = _super.call(this, authCodeModule, storageImpl, authCodeRequest, logger) || this;
            _this.browserCrypto = browserCrypto;
            return _this;
        }
        /**
         * Redirects window to given URL.
         * @param urlNavigate
         */
        RedirectHandler.prototype.initiateAuthRequest = function (requestUrl, params) {
            return __awaiter$1(this, void 0, void 0, function () {
                var navigationOptions, navigate;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            this.logger.verbose("RedirectHandler.initiateAuthRequest called");
                            if (!!StringUtils.isEmpty(requestUrl)) return [3 /*break*/, 7];
                            // Cache start page, returns to this page after redirectUri if navigateToLoginRequestUrl is true
                            if (params.redirectStartPage) {
                                this.logger.verbose("RedirectHandler.initiateAuthRequest: redirectStartPage set, caching start page");
                                this.browserStorage.setTemporaryCache(TemporaryCacheKeys.ORIGIN_URI, params.redirectStartPage, true);
                            }
                            // Set interaction status in the library.
                            this.browserStorage.setTemporaryCache(TemporaryCacheKeys.CORRELATION_ID, this.authCodeRequest.correlationId, true);
                            this.browserStorage.cacheCodeRequest(this.authCodeRequest, this.browserCrypto);
                            this.logger.infoPii("RedirectHandler.initiateAuthRequest: Navigate to: " + requestUrl);
                            navigationOptions = {
                                apiId: exports.ApiId.acquireTokenRedirect,
                                timeout: params.redirectTimeout,
                                noHistory: false
                            };
                            if (!(typeof params.onRedirectNavigate === "function")) return [3 /*break*/, 4];
                            this.logger.verbose("RedirectHandler.initiateAuthRequest: Invoking onRedirectNavigate callback");
                            navigate = params.onRedirectNavigate(requestUrl);
                            if (!(navigate !== false)) return [3 /*break*/, 2];
                            this.logger.verbose("RedirectHandler.initiateAuthRequest: onRedirectNavigate did not return false, navigating");
                            return [4 /*yield*/, params.navigationClient.navigateExternal(requestUrl, navigationOptions)];
                        case 1:
                            _a.sent();
                            return [2 /*return*/];
                        case 2:
                            this.logger.verbose("RedirectHandler.initiateAuthRequest: onRedirectNavigate returned false, stopping navigation");
                            return [2 /*return*/];
                        case 3: return [3 /*break*/, 6];
                        case 4:
                            // Navigate window to request URL
                            this.logger.verbose("RedirectHandler.initiateAuthRequest: Navigating window to navigate url");
                            return [4 /*yield*/, params.navigationClient.navigateExternal(requestUrl, navigationOptions)];
                        case 5:
                            _a.sent();
                            return [2 /*return*/];
                        case 6: return [3 /*break*/, 8];
                        case 7:
                            // Throw error if request URL is empty.
                            this.logger.info("RedirectHandler.initiateAuthRequest: Navigate url is empty");
                            throw BrowserAuthError.createEmptyNavigationUriError();
                        case 8: return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * Handle authorization code response in the window.
         * @param hash
         */
        RedirectHandler.prototype.handleCodeResponseFromHash = function (locationHash, state, authority, networkModule) {
            return __awaiter$1(this, void 0, void 0, function () {
                var stateKey, requestState, authCodeResponse, nonceKey, cachedNonce, cachedCcsCred, tokenResponse;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            this.logger.verbose("RedirectHandler.handleCodeResponse called");
                            // Check that location hash isn't empty.
                            if (StringUtils.isEmpty(locationHash)) {
                                throw BrowserAuthError.createEmptyHashError(locationHash);
                            }
                            // Interaction is completed - remove interaction status.
                            this.browserStorage.setInteractionInProgress(false);
                            stateKey = this.browserStorage.generateStateKey(state);
                            requestState = this.browserStorage.getTemporaryCache(stateKey);
                            if (!requestState) {
                                throw ClientAuthError.createStateNotFoundError("Cached State");
                            }
                            try {
                                authCodeResponse = this.authModule.handleFragmentResponse(locationHash, requestState);
                            }
                            catch (e) {
                                if (e instanceof ServerError && e.subError === BrowserAuthErrorMessage.userCancelledError.code) {
                                    // Translate server error caused by user closing native prompt to corresponding first class MSAL error
                                    throw BrowserAuthError.createUserCancelledError();
                                }
                                else {
                                    throw e;
                                }
                            }
                            nonceKey = this.browserStorage.generateNonceKey(requestState);
                            cachedNonce = this.browserStorage.getTemporaryCache(nonceKey);
                            // Assign code to request
                            this.authCodeRequest.code = authCodeResponse.code;
                            if (!authCodeResponse.cloud_instance_host_name) return [3 /*break*/, 2];
                            return [4 /*yield*/, this.updateTokenEndpointAuthority(authCodeResponse.cloud_instance_host_name, authority, networkModule)];
                        case 1:
                            _a.sent();
                            _a.label = 2;
                        case 2:
                            authCodeResponse.nonce = cachedNonce || undefined;
                            authCodeResponse.state = requestState;
                            // Add CCS parameters if available
                            if (authCodeResponse.client_info) {
                                this.authCodeRequest.clientInfo = authCodeResponse.client_info;
                            }
                            else {
                                cachedCcsCred = this.checkCcsCredentials();
                                if (cachedCcsCred) {
                                    this.authCodeRequest.ccsCredential = cachedCcsCred;
                                }
                            }
                            return [4 /*yield*/, this.authModule.acquireToken(this.authCodeRequest, authCodeResponse)];
                        case 3:
                            tokenResponse = _a.sent();
                            this.browserStorage.cleanRequestByState(state);
                            return [2 /*return*/, tokenResponse];
                    }
                });
            });
        };
        return RedirectHandler;
    }(InteractionHandler));

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    exports.EventType = void 0;
    (function (EventType) {
        EventType["INITIALIZE_START"] = "msal:initializeStart";
        EventType["INITIALIZE_END"] = "msal:initializeEnd";
        EventType["ACCOUNT_ADDED"] = "msal:accountAdded";
        EventType["ACCOUNT_REMOVED"] = "msal:accountRemoved";
        EventType["LOGIN_START"] = "msal:loginStart";
        EventType["LOGIN_SUCCESS"] = "msal:loginSuccess";
        EventType["LOGIN_FAILURE"] = "msal:loginFailure";
        EventType["ACQUIRE_TOKEN_START"] = "msal:acquireTokenStart";
        EventType["ACQUIRE_TOKEN_SUCCESS"] = "msal:acquireTokenSuccess";
        EventType["ACQUIRE_TOKEN_FAILURE"] = "msal:acquireTokenFailure";
        EventType["ACQUIRE_TOKEN_NETWORK_START"] = "msal:acquireTokenFromNetworkStart";
        EventType["SSO_SILENT_START"] = "msal:ssoSilentStart";
        EventType["SSO_SILENT_SUCCESS"] = "msal:ssoSilentSuccess";
        EventType["SSO_SILENT_FAILURE"] = "msal:ssoSilentFailure";
        EventType["ACQUIRE_TOKEN_BY_CODE_START"] = "msal:acquireTokenByCodeStart";
        EventType["ACQUIRE_TOKEN_BY_CODE_SUCCESS"] = "msal:acquireTokenByCodeSuccess";
        EventType["ACQUIRE_TOKEN_BY_CODE_FAILURE"] = "msal:acquireTokenByCodeFailure";
        EventType["HANDLE_REDIRECT_START"] = "msal:handleRedirectStart";
        EventType["HANDLE_REDIRECT_END"] = "msal:handleRedirectEnd";
        EventType["POPUP_OPENED"] = "msal:popupOpened";
        EventType["LOGOUT_START"] = "msal:logoutStart";
        EventType["LOGOUT_SUCCESS"] = "msal:logoutSuccess";
        EventType["LOGOUT_FAILURE"] = "msal:logoutFailure";
        EventType["LOGOUT_END"] = "msal:logoutEnd";
    })(exports.EventType || (exports.EventType = {}));

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var NativeStatusCode;
    (function (NativeStatusCode) {
        NativeStatusCode["USER_INTERACTION_REQUIRED"] = "USER_INTERACTION_REQUIRED";
        NativeStatusCode["USER_CANCEL"] = "USER_CANCEL";
        NativeStatusCode["NO_NETWORK"] = "NO_NETWORK";
        NativeStatusCode["TRANSIENT_ERROR"] = "TRANSIENT_ERROR";
        NativeStatusCode["PERSISTENT_ERROR"] = "PERSISTENT_ERROR";
        NativeStatusCode["DISABLED"] = "DISABLED";
        NativeStatusCode["ACCOUNT_UNAVAILABLE"] = "ACCOUNT_UNAVAILABLE";
    })(NativeStatusCode || (NativeStatusCode = {}));
    var NativeAuthErrorMessage = {
        extensionError: {
            code: "ContentError"
        },
        userSwitch: {
            code: "user_switch",
            desc: "User attempted to switch accounts in the native broker, which is not allowed. All new accounts must sign-in through the standard web flow first, please try again."
        },
        tokensNotFoundInCache: {
            code: "tokens_not_found_in_internal_memory_cache",
            desc: "Tokens not cached in MSAL JS internal memory, please make the WAM request"
        }
    };
    var NativeAuthError = /** @class */ (function (_super) {
        __extends$1(NativeAuthError, _super);
        function NativeAuthError(errorCode, description, ext) {
            var _this = _super.call(this, errorCode, description) || this;
            Object.setPrototypeOf(_this, NativeAuthError.prototype);
            _this.name = "NativeAuthError";
            _this.ext = ext;
            return _this;
        }
        /**
         * These errors should result in a fallback to the 'standard' browser based auth flow.
         */
        NativeAuthError.prototype.isFatal = function () {
            if (this.ext && this.ext.status && (this.ext.status === NativeStatusCode.PERSISTENT_ERROR || this.ext.status === NativeStatusCode.DISABLED)) {
                return true;
            }
            switch (this.errorCode) {
                case NativeAuthErrorMessage.extensionError.code:
                    return true;
                default:
                    return false;
            }
        };
        /**
         * Create the appropriate error object based on the WAM status code.
         * @param code
         * @param description
         * @param ext
         * @returns
         */
        NativeAuthError.createError = function (code, description, ext) {
            if (ext && ext.status) {
                switch (ext.status) {
                    case NativeStatusCode.ACCOUNT_UNAVAILABLE:
                        return InteractionRequiredAuthError.createNativeAccountUnavailableError();
                    case NativeStatusCode.USER_INTERACTION_REQUIRED:
                        return new InteractionRequiredAuthError(code, description);
                    case NativeStatusCode.USER_CANCEL:
                        return BrowserAuthError.createUserCancelledError();
                    case NativeStatusCode.NO_NETWORK:
                        return BrowserAuthError.createNoNetworkConnectivityError();
                }
            }
            return new NativeAuthError(code, description, ext);
        };
        /**
         * Creates user switch error when the user chooses a different account in the native broker prompt
         * @returns
         */
        NativeAuthError.createUserSwitchError = function () {
            return new NativeAuthError(NativeAuthErrorMessage.userSwitch.code, NativeAuthErrorMessage.userSwitch.desc);
        };
        /**
         * Creates a tokens not found error when the internal cache look up fails
         * @returns NativeAuthError: tokensNotFoundInCache
         */
        NativeAuthError.createTokensNotFoundInCacheError = function () {
            return new NativeAuthError(NativeAuthErrorMessage.tokensNotFoundInCache.code, NativeAuthErrorMessage.tokensNotFoundInCache.desc);
        };
        return NativeAuthError;
    }(AuthError));

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var SilentCacheClient = /** @class */ (function (_super) {
        __extends$1(SilentCacheClient, _super);
        function SilentCacheClient() {
            return _super !== null && _super.apply(this, arguments) || this;
        }
        /**
         * Returns unexpired tokens from the cache, if available
         * @param silentRequest
         */
        SilentCacheClient.prototype.acquireToken = function (silentRequest) {
            return __awaiter$1(this, void 0, void 0, function () {
                var acquireTokenMeasurement, serverTelemetryManager, silentAuthClient, cachedToken, error_1;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            acquireTokenMeasurement = this.performanceClient.startMeasurement(exports.PerformanceEvents.SilentCacheClientAcquireToken, silentRequest.correlationId);
                            serverTelemetryManager = this.initializeServerTelemetryManager(exports.ApiId.acquireTokenSilent_silentFlow);
                            return [4 /*yield*/, this.createSilentFlowClient(serverTelemetryManager, silentRequest.authority, silentRequest.azureCloudOptions)];
                        case 1:
                            silentAuthClient = _a.sent();
                            this.logger.verbose("Silent auth client created");
                            _a.label = 2;
                        case 2:
                            _a.trys.push([2, 4, , 5]);
                            return [4 /*yield*/, silentAuthClient.acquireCachedToken(silentRequest)];
                        case 3:
                            cachedToken = _a.sent();
                            acquireTokenMeasurement.endMeasurement({
                                success: true,
                                fromCache: true
                            });
                            return [2 /*return*/, cachedToken];
                        case 4:
                            error_1 = _a.sent();
                            if (error_1 instanceof BrowserAuthError && error_1.errorCode === BrowserAuthErrorMessage.signingKeyNotFoundInStorage.code) {
                                this.logger.verbose("Signing keypair for bound access token not found. Refreshing bound access token and generating a new crypto keypair.");
                            }
                            acquireTokenMeasurement.endMeasurement({
                                errorCode: error_1 instanceof AuthError && error_1.errorCode || undefined,
                                subErrorCode: error_1 instanceof AuthError && error_1.subError || undefined,
                                success: false
                            });
                            throw error_1;
                        case 5: return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * Currently Unsupported
         */
        SilentCacheClient.prototype.logout = function () {
            // Synchronous so we must reject
            return Promise.reject(BrowserAuthError.createSilentLogoutUnsupportedError());
        };
        /**
         * Creates an Silent Flow Client with the given authority, or the default authority.
         * @param serverTelemetryManager
         * @param authorityUrl
         */
        SilentCacheClient.prototype.createSilentFlowClient = function (serverTelemetryManager, authorityUrl, azureCloudOptions) {
            return __awaiter$1(this, void 0, void 0, function () {
                var clientConfig;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.getClientConfiguration(serverTelemetryManager, authorityUrl, azureCloudOptions)];
                        case 1:
                            clientConfig = _a.sent();
                            return [2 /*return*/, new SilentFlowClient(clientConfig, this.performanceClient)];
                    }
                });
            });
        };
        SilentCacheClient.prototype.initializeSilentRequest = function (request, account) {
            return __awaiter$1(this, void 0, void 0, function () {
                var _a;
                return __generator$1(this, function (_b) {
                    switch (_b.label) {
                        case 0:
                            _a = [__assign$1({}, request)];
                            return [4 /*yield*/, this.initializeBaseRequest(request)];
                        case 1: return [2 /*return*/, __assign$1.apply(void 0, [__assign$1.apply(void 0, _a.concat([_b.sent()])), { account: account, forceRefresh: request.forceRefresh || false }])];
                    }
                });
            });
        };
        return SilentCacheClient;
    }(StandardInteractionClient));

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var NativeInteractionClient = /** @class */ (function (_super) {
        __extends$1(NativeInteractionClient, _super);
        function NativeInteractionClient(config, browserStorage, browserCrypto, logger, eventHandler, navigationClient, apiId, performanceClient, provider, accountId, nativeStorageImpl, correlationId) {
            var _this = _super.call(this, config, browserStorage, browserCrypto, logger, eventHandler, navigationClient, performanceClient, provider, correlationId) || this;
            _this.apiId = apiId;
            _this.accountId = accountId;
            _this.nativeMessageHandler = provider;
            _this.nativeStorageManager = nativeStorageImpl;
            _this.silentCacheClient = new SilentCacheClient(config, _this.nativeStorageManager, browserCrypto, logger, eventHandler, navigationClient, performanceClient, provider, correlationId);
            return _this;
        }
        /**
         * Acquire token from native platform via browser extension
         * @param request
         */
        NativeInteractionClient.prototype.acquireToken = function (request) {
            return __awaiter$1(this, void 0, void 0, function () {
                var nativeATMeasurement, reqTimestamp, nativeRequest, result, messageBody, response, validatedResponse;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            this.logger.trace("NativeInteractionClient - acquireToken called.");
                            nativeATMeasurement = this.performanceClient.startMeasurement(exports.PerformanceEvents.NativeInteractionClientAcquireToken, request.correlationId);
                            reqTimestamp = TimeUtils.nowSeconds();
                            return [4 /*yield*/, this.initializeNativeRequest(request)];
                        case 1:
                            nativeRequest = _a.sent();
                            _a.label = 2;
                        case 2:
                            _a.trys.push([2, 4, , 5]);
                            return [4 /*yield*/, this.acquireTokensFromCache(this.accountId, nativeRequest)];
                        case 3:
                            result = _a.sent();
                            nativeATMeasurement.endMeasurement({
                                success: true,
                                isNativeBroker: true,
                                fromCache: true
                            });
                            return [2 /*return*/, result];
                        case 4:
                            _a.sent();
                            // continue with a native call for any and all errors
                            this.logger.info("MSAL internal Cache does not contain tokens, proceed to make a native call");
                            return [3 /*break*/, 5];
                        case 5:
                            messageBody = {
                                method: NativeExtensionMethod.GetToken,
                                request: nativeRequest
                            };
                            return [4 /*yield*/, this.nativeMessageHandler.sendMessage(messageBody)];
                        case 6:
                            response = _a.sent();
                            validatedResponse = this.validateNativeResponse(response);
                            return [2 /*return*/, this.handleNativeResponse(validatedResponse, nativeRequest, reqTimestamp)
                                    .then(function (result) {
                                    nativeATMeasurement.endMeasurement({
                                        success: true,
                                        isNativeBroker: true
                                    });
                                    return result;
                                })
                                    .catch(function (error) {
                                    nativeATMeasurement.endMeasurement({
                                        success: false,
                                        errorCode: error.errorCode,
                                        subErrorCode: error.subError,
                                        isNativeBroker: true
                                    });
                                    throw error;
                                })];
                    }
                });
            });
        };
        /**
         * Creates silent flow request
         * @param request
         * @param cachedAccount
         * @returns CommonSilentFlowRequest
         */
        NativeInteractionClient.prototype.createSilentCacheRequest = function (request, cachedAccount) {
            return {
                authority: request.authority,
                correlationId: this.correlationId,
                scopes: ScopeSet.fromString(request.scope).asArray(),
                account: cachedAccount,
                forceRefresh: false,
            };
        };
        /**
         * Fetches the tokens from the cache if un-expired
         * @param nativeAccountId
         * @param request
         * @returns authenticationResult
         */
        NativeInteractionClient.prototype.acquireTokensFromCache = function (nativeAccountId, request) {
            return __awaiter$1(this, void 0, void 0, function () {
                var accountEntity, account, silentRequest, result, e_2;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            accountEntity = this.browserStorage.readAccountFromCacheWithNativeAccountId(nativeAccountId);
                            if (!accountEntity) {
                                throw ClientAuthError.createNoAccountFoundError();
                            }
                            account = accountEntity.getAccountInfo();
                            _a.label = 1;
                        case 1:
                            _a.trys.push([1, 3, , 4]);
                            silentRequest = this.createSilentCacheRequest(request, account);
                            return [4 /*yield*/, this.silentCacheClient.acquireToken(silentRequest)];
                        case 2:
                            result = _a.sent();
                            return [2 /*return*/, result];
                        case 3:
                            e_2 = _a.sent();
                            throw e_2;
                        case 4: return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * Acquires a token from native platform then redirects to the redirectUri instead of returning the response
         * @param request
         */
        NativeInteractionClient.prototype.acquireTokenRedirect = function (request) {
            return __awaiter$1(this, void 0, void 0, function () {
                var nativeRequest, messageBody, response, e_3, navigationOptions, redirectUri;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            this.logger.trace("NativeInteractionClient - acquireTokenRedirect called.");
                            return [4 /*yield*/, this.initializeNativeRequest(request)];
                        case 1:
                            nativeRequest = _a.sent();
                            messageBody = {
                                method: NativeExtensionMethod.GetToken,
                                request: nativeRequest
                            };
                            _a.label = 2;
                        case 2:
                            _a.trys.push([2, 4, , 5]);
                            return [4 /*yield*/, this.nativeMessageHandler.sendMessage(messageBody)];
                        case 3:
                            response = _a.sent();
                            this.validateNativeResponse(response);
                            return [3 /*break*/, 5];
                        case 4:
                            e_3 = _a.sent();
                            // Only throw fatal errors here to allow application to fallback to regular redirect. Otherwise proceed and the error will be thrown in handleRedirectPromise
                            if (e_3 instanceof NativeAuthError && e_3.isFatal()) {
                                throw e_3;
                            }
                            return [3 /*break*/, 5];
                        case 5:
                            this.browserStorage.setTemporaryCache(TemporaryCacheKeys.NATIVE_REQUEST, JSON.stringify(nativeRequest), true);
                            navigationOptions = {
                                apiId: exports.ApiId.acquireTokenRedirect,
                                timeout: this.config.system.redirectNavigationTimeout,
                                noHistory: false
                            };
                            redirectUri = this.config.auth.navigateToLoginRequestUrl ? window.location.href : this.getRedirectUri(request.redirectUri);
                            return [4 /*yield*/, this.navigationClient.navigateExternal(redirectUri, navigationOptions)];
                        case 6:
                            _a.sent(); // Need to treat this as external to ensure handleRedirectPromise is run again
                            return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * If the previous page called native platform for a token using redirect APIs, send the same request again and return the response
         */
        NativeInteractionClient.prototype.handleRedirectPromise = function () {
            return __awaiter$1(this, void 0, void 0, function () {
                var cachedRequest, messageBody, reqTimestamp, response, result, e_4;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            this.logger.trace("NativeInteractionClient - handleRedirectPromise called.");
                            if (!this.browserStorage.isInteractionInProgress(true)) {
                                this.logger.info("handleRedirectPromise called but there is no interaction in progress, returning null.");
                                return [2 /*return*/, null];
                            }
                            cachedRequest = this.browserStorage.getCachedNativeRequest();
                            if (!cachedRequest) {
                                this.logger.verbose("NativeInteractionClient - handleRedirectPromise called but there is no cached request, returning null.");
                                return [2 /*return*/, null];
                            }
                            this.browserStorage.removeItem(this.browserStorage.generateCacheKey(TemporaryCacheKeys.NATIVE_REQUEST));
                            messageBody = {
                                method: NativeExtensionMethod.GetToken,
                                request: cachedRequest
                            };
                            reqTimestamp = TimeUtils.nowSeconds();
                            _a.label = 1;
                        case 1:
                            _a.trys.push([1, 3, , 4]);
                            this.logger.verbose("NativeInteractionClient - handleRedirectPromise sending message to native broker.");
                            return [4 /*yield*/, this.nativeMessageHandler.sendMessage(messageBody)];
                        case 2:
                            response = _a.sent();
                            this.validateNativeResponse(response);
                            result = this.handleNativeResponse(response, cachedRequest, reqTimestamp);
                            this.browserStorage.setInteractionInProgress(false);
                            return [2 /*return*/, result];
                        case 3:
                            e_4 = _a.sent();
                            this.browserStorage.setInteractionInProgress(false);
                            throw e_4;
                        case 4: return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * Logout from native platform via browser extension
         * @param request
         */
        NativeInteractionClient.prototype.logout = function () {
            this.logger.trace("NativeInteractionClient - logout called.");
            return Promise.reject("Logout not implemented yet");
        };
        /**
         * Transform response from native platform into AuthenticationResult object which will be returned to the end user
         * @param response
         * @param request
         * @param reqTimestamp
         */
        NativeInteractionClient.prototype.handleNativeResponse = function (response, request, reqTimestamp) {
            return __awaiter$1(this, void 0, void 0, function () {
                var idTokenObj, authority, authorityPreferredCache, homeAccountIdentifier, accountEntity, responseScopes, accountProperties, uid, tid, responseAccessToken, responseTokenType, _a, popTokenGenerator, shrParameters, mats, result, idTokenEntity, expiresIn, tokenExpirationSeconds, accessTokenEntity;
                var _this = this;
                return __generator$1(this, function (_b) {
                    switch (_b.label) {
                        case 0:
                            this.logger.trace("NativeInteractionClient - handleNativeResponse called.");
                            if (response.account.id !== request.accountId) {
                                // User switch in native broker prompt is not supported. All users must first sign in through web flow to ensure server state is in sync
                                throw NativeAuthError.createUserSwitchError();
                            }
                            idTokenObj = new AuthToken(response.id_token || Constants.EMPTY_STRING, this.browserCrypto);
                            return [4 /*yield*/, this.getDiscoveredAuthority(request.authority)];
                        case 1:
                            authority = _b.sent();
                            authorityPreferredCache = authority.getPreferredCache();
                            homeAccountIdentifier = AccountEntity.generateHomeAccountId(response.client_info || Constants.EMPTY_STRING, AuthorityType.Default, this.logger, this.browserCrypto, idTokenObj);
                            accountEntity = AccountEntity.createAccount(response.client_info, homeAccountIdentifier, idTokenObj, undefined, undefined, undefined, authorityPreferredCache, response.account.id);
                            this.browserStorage.setAccount(accountEntity);
                            responseScopes = response.scope ? ScopeSet.fromString(response.scope) : ScopeSet.fromString(request.scope);
                            accountProperties = response.account.properties || {};
                            uid = accountProperties["UID"] || idTokenObj.claims.oid || idTokenObj.claims.sub || Constants.EMPTY_STRING;
                            tid = accountProperties["TenantId"] || idTokenObj.claims.tid || Constants.EMPTY_STRING;
                            responseTokenType = exports.AuthenticationScheme.BEARER;
                            _a = request.tokenType;
                            switch (_a) {
                                case exports.AuthenticationScheme.POP: return [3 /*break*/, 2];
                            }
                            return [3 /*break*/, 4];
                        case 2:
                            // Set the token type to POP in the response
                            responseTokenType = exports.AuthenticationScheme.POP;
                            // Check if native layer returned an SHR token
                            if (response.shr) {
                                this.logger.trace("handleNativeServerResponse: SHR is enabled in native layer");
                                responseAccessToken = response.shr;
                                return [3 /*break*/, 5];
                            }
                            popTokenGenerator = new PopTokenGenerator(this.browserCrypto);
                            shrParameters = {
                                resourceRequestMethod: request.resourceRequestMethod,
                                resourceRequestUri: request.resourceRequestUri,
                                shrClaims: request.shrClaims,
                                shrNonce: request.shrNonce
                            };
                            /**
                             * KeyID must be present in the native request from when the PoP key was generated in order for
                             * PopTokenGenerator to query the full key for signing
                             */
                            if (!request.keyId) {
                                throw ClientAuthError.createKeyIdMissingError();
                            }
                            return [4 /*yield*/, popTokenGenerator.signPopToken(response.access_token, request.keyId, shrParameters)];
                        case 3:
                            responseAccessToken = _b.sent();
                            return [3 /*break*/, 5];
                        case 4:
                            {
                                responseAccessToken = response.access_token;
                            }
                            _b.label = 5;
                        case 5:
                            mats = this.getMATSFromResponse(response);
                            result = {
                                authority: authority.canonicalAuthority,
                                uniqueId: uid,
                                tenantId: tid,
                                scopes: responseScopes.asArray(),
                                account: accountEntity.getAccountInfo(),
                                idToken: response.id_token,
                                idTokenClaims: idTokenObj.claims,
                                accessToken: responseAccessToken,
                                fromCache: mats ? this.isResponseFromCache(mats) : false,
                                expiresOn: new Date(Number(reqTimestamp + response.expires_in) * 1000),
                                tokenType: responseTokenType,
                                correlationId: this.correlationId,
                                state: response.state,
                                fromNativeBroker: true
                            };
                            idTokenEntity = IdTokenEntity.createIdTokenEntity(homeAccountIdentifier, request.authority, response.id_token || Constants.EMPTY_STRING, request.clientId, idTokenObj.claims.tid || Constants.EMPTY_STRING);
                            this.nativeStorageManager.setIdTokenCredential(idTokenEntity);
                            expiresIn = (responseTokenType === exports.AuthenticationScheme.POP)
                                ? Constants.SHR_NONCE_VALIDITY
                                : (typeof response.expires_in === "string"
                                    ? parseInt(response.expires_in, 10)
                                    : response.expires_in) || 0;
                            tokenExpirationSeconds = reqTimestamp + expiresIn;
                            accessTokenEntity = AccessTokenEntity.createAccessTokenEntity(homeAccountIdentifier, request.authority, responseAccessToken, request.clientId, tid, responseScopes.printScopes(), tokenExpirationSeconds, 0, this.browserCrypto);
                            this.nativeStorageManager.setAccessTokenCredential(accessTokenEntity);
                            // Remove any existing cached tokens for this account in browser storage
                            this.browserStorage.removeAccountContext(accountEntity).catch(function (e) {
                                _this.logger.error("Error occurred while removing account context from browser storage. " + e);
                            });
                            return [2 /*return*/, result];
                    }
                });
            });
        };
        /**
         * Validates native platform response before processing
         * @param response
         */
        NativeInteractionClient.prototype.validateNativeResponse = function (response) {
            if (response.hasOwnProperty("access_token") &&
                response.hasOwnProperty("id_token") &&
                response.hasOwnProperty("client_info") &&
                response.hasOwnProperty("account") &&
                response.hasOwnProperty("scope") &&
                response.hasOwnProperty("expires_in")) {
                return response;
            }
            else {
                throw NativeAuthError.createUnexpectedError("Response missing expected properties.");
            }
        };
        /**
         * Gets MATS telemetry from native response
         * @param response
         * @returns
         */
        NativeInteractionClient.prototype.getMATSFromResponse = function (response) {
            if (response.properties.MATS) {
                try {
                    return JSON.parse(response.properties.MATS);
                }
                catch (e) {
                    this.logger.error("NativeInteractionClient - Error parsing MATS telemetry, returning null instead");
                }
            }
            return null;
        };
        /**
         * Returns whether or not response came from native cache
         * @param response
         * @returns
         */
        NativeInteractionClient.prototype.isResponseFromCache = function (mats) {
            if (typeof mats.is_cached === "undefined") {
                this.logger.verbose("NativeInteractionClient - MATS telemetry does not contain field indicating if response was served from cache. Returning false.");
                return false;
            }
            return !!mats.is_cached;
        };
        /**
         * Translates developer provided request object into NativeRequest object
         * @param request
         */
        NativeInteractionClient.prototype.initializeNativeRequest = function (request) {
            return __awaiter$1(this, void 0, void 0, function () {
                var authority, canonicalAuthority, scopes, remainingProperties, scopeSet, getPrompt, validatedRequest, shrParameters, popTokenGenerator, reqCnfData;
                var _this = this;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            this.logger.trace("NativeInteractionClient - initializeNativeRequest called");
                            authority = request.authority || this.config.auth.authority;
                            canonicalAuthority = new UrlString(authority);
                            canonicalAuthority.validateAsUri();
                            scopes = request.scopes, remainingProperties = __rest(request, ["scopes"]);
                            scopeSet = new ScopeSet(scopes || []);
                            scopeSet.appendScopes(OIDC_DEFAULT_SCOPES);
                            getPrompt = function () {
                                // If request is silent, prompt is always none
                                switch (_this.apiId) {
                                    case exports.ApiId.ssoSilent:
                                    case exports.ApiId.acquireTokenSilent_silentFlow:
                                        _this.logger.trace("initializeNativeRequest: silent request sets prompt to none");
                                        return PromptValue.NONE;
                                }
                                // Prompt not provided, request may proceed and native broker decides if it needs to prompt
                                if (!request.prompt) {
                                    _this.logger.trace("initializeNativeRequest: prompt was not provided");
                                    return undefined;
                                }
                                // If request is interactive, check if prompt provided is allowed to go directly to native broker
                                switch (request.prompt) {
                                    case PromptValue.NONE:
                                    case PromptValue.CONSENT:
                                    case PromptValue.LOGIN:
                                        _this.logger.trace("initializeNativeRequest: prompt is compatible with native flow");
                                        return request.prompt;
                                    default:
                                        _this.logger.trace("initializeNativeRequest: prompt = " + request.prompt + " is not compatible with native flow");
                                        throw BrowserAuthError.createNativePromptParameterNotSupportedError();
                                }
                            };
                            validatedRequest = __assign$1(__assign$1({}, remainingProperties), { accountId: this.accountId, clientId: this.config.auth.clientId, authority: canonicalAuthority.urlString, scope: scopeSet.printScopes(), redirectUri: this.getRedirectUri(request.redirectUri), prompt: getPrompt(), correlationId: this.correlationId, tokenType: request.authenticationScheme, windowTitleSubstring: document.title, extraParameters: __assign$1(__assign$1(__assign$1({}, request.extraQueryParameters), request.tokenQueryParameters), { telemetry: NativeConstants.MATS_TELEMETRY }), extendedExpiryToken: false // Make this configurable?
                             });
                            if (!(request.authenticationScheme === exports.AuthenticationScheme.POP)) return [3 /*break*/, 2];
                            shrParameters = {
                                resourceRequestUri: request.resourceRequestUri,
                                resourceRequestMethod: request.resourceRequestMethod,
                                shrClaims: request.shrClaims,
                                shrNonce: request.shrNonce
                            };
                            popTokenGenerator = new PopTokenGenerator(this.browserCrypto);
                            return [4 /*yield*/, popTokenGenerator.generateCnf(shrParameters)];
                        case 1:
                            reqCnfData = _a.sent();
                            // to reduce the URL length, it is recommended to send the hash of the req_cnf instead of the whole string
                            validatedRequest.reqCnf = reqCnfData.reqCnfHash;
                            validatedRequest.keyId = reqCnfData.kid;
                            _a.label = 2;
                        case 2: return [2 /*return*/, validatedRequest];
                    }
                });
            });
        };
        return NativeInteractionClient;
    }(BaseInteractionClient));

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var NativeMessageHandler = /** @class */ (function () {
        function NativeMessageHandler(logger, handshakeTimeoutMs, extensionId) {
            this.logger = logger;
            this.handshakeTimeoutMs = handshakeTimeoutMs;
            this.extensionId = extensionId;
            this.resolvers = new Map(); // Used for non-handshake messages
            this.handshakeResolvers = new Map(); // Used for handshake messages
            this.responseId = 0;
            this.messageChannel = new MessageChannel();
            this.windowListener = this.onWindowMessage.bind(this); // Window event callback doesn't have access to 'this' unless it's bound
        }
        /**
         * Sends a given message to the extension and resolves with the extension response
         * @param body
         */
        NativeMessageHandler.prototype.sendMessage = function (body) {
            return __awaiter$1(this, void 0, void 0, function () {
                var req;
                var _this = this;
                return __generator$1(this, function (_a) {
                    this.logger.trace("NativeMessageHandler - sendMessage called.");
                    req = {
                        channel: NativeConstants.CHANNEL_ID,
                        extensionId: this.extensionId,
                        responseId: this.responseId++,
                        body: body
                    };
                    this.logger.trace("NativeMessageHandler - Sending request to browser extension");
                    this.logger.tracePii("NativeMessageHandler - Sending request to browser extension: " + JSON.stringify(req));
                    this.messageChannel.port1.postMessage(req);
                    return [2 /*return*/, new Promise(function (resolve, reject) {
                            _this.resolvers.set(req.responseId, { resolve: resolve, reject: reject });
                        })];
                });
            });
        };
        /**
         * Returns an instance of the MessageHandler that has successfully established a connection with an extension
         * @param logger
         * @param handshakeTimeoutMs
         */
        NativeMessageHandler.createProvider = function (logger, handshakeTimeoutMs) {
            return __awaiter$1(this, void 0, void 0, function () {
                var preferredProvider, backupProvider;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            logger.trace("NativeMessageHandler - createProvider called.");
                            _a.label = 1;
                        case 1:
                            _a.trys.push([1, 3, , 5]);
                            preferredProvider = new NativeMessageHandler(logger, handshakeTimeoutMs, NativeConstants.PREFERRED_EXTENSION_ID);
                            return [4 /*yield*/, preferredProvider.sendHandshakeRequest()];
                        case 2:
                            _a.sent();
                            return [2 /*return*/, preferredProvider];
                        case 3:
                            _a.sent();
                            backupProvider = new NativeMessageHandler(logger, handshakeTimeoutMs);
                            return [4 /*yield*/, backupProvider.sendHandshakeRequest()];
                        case 4:
                            _a.sent();
                            return [2 /*return*/, backupProvider];
                        case 5: return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * Send handshake request helper.
         */
        NativeMessageHandler.prototype.sendHandshakeRequest = function () {
            return __awaiter$1(this, void 0, void 0, function () {
                var req;
                var _this = this;
                return __generator$1(this, function (_a) {
                    this.logger.trace("NativeMessageHandler - sendHandshakeRequest called.");
                    // Register this event listener before sending handshake
                    window.addEventListener("message", this.windowListener, false); // false is important, because content script message processing should work first
                    req = {
                        channel: NativeConstants.CHANNEL_ID,
                        extensionId: this.extensionId,
                        responseId: this.responseId++,
                        body: {
                            method: NativeExtensionMethod.HandshakeRequest
                        }
                    };
                    this.messageChannel.port1.onmessage = function (event) {
                        _this.onChannelMessage(event);
                    };
                    window.postMessage(req, window.origin, [this.messageChannel.port2]);
                    return [2 /*return*/, new Promise(function (resolve, reject) {
                            _this.handshakeResolvers.set(req.responseId, { resolve: resolve, reject: reject });
                            _this.timeoutId = window.setTimeout(function () {
                                /*
                                 * Throw an error if neither HandshakeResponse nor original Handshake request are received in a reasonable timeframe.
                                 * This typically suggests an event handler stopped propagation of the Handshake request but did not respond to it on the MessageChannel port
                                 */
                                window.removeEventListener("message", _this.windowListener, false);
                                _this.messageChannel.port1.close();
                                _this.messageChannel.port2.close();
                                reject(BrowserAuthError.createNativeHandshakeTimeoutError());
                                _this.handshakeResolvers.delete(req.responseId);
                            }, _this.handshakeTimeoutMs); // Use a reasonable timeout in milliseconds here
                        })];
                });
            });
        };
        /**
         * Invoked when a message is posted to the window. If a handshake request is received it means the extension is not installed.
         * @param event
         */
        NativeMessageHandler.prototype.onWindowMessage = function (event) {
            this.logger.trace("NativeMessageHandler - onWindowMessage called");
            // We only accept messages from ourselves
            if (event.source !== window) {
                return;
            }
            var request = event.data;
            if (!request.channel || request.channel !== NativeConstants.CHANNEL_ID) {
                return;
            }
            if (request.extensionId && request.extensionId !== this.extensionId) {
                return;
            }
            if (request.body.method === NativeExtensionMethod.HandshakeRequest) {
                // If we receive this message back it means no extension intercepted the request, meaning no extension supporting handshake protocol is installed
                this.logger.verbose(request.extensionId ? "Extension with id: " + request.extensionId + " not installed" : "No extension installed");
                clearTimeout(this.timeoutId);
                this.messageChannel.port1.close();
                this.messageChannel.port2.close();
                window.removeEventListener("message", this.windowListener, false);
                var handshakeResolver = this.handshakeResolvers.get(request.responseId);
                if (handshakeResolver) {
                    handshakeResolver.reject(BrowserAuthError.createNativeExtensionNotInstalledError());
                }
            }
        };
        /**
         * Invoked when a message is received from the extension on the MessageChannel port
         * @param event
         */
        NativeMessageHandler.prototype.onChannelMessage = function (event) {
            this.logger.trace("NativeMessageHandler - onChannelMessage called.");
            var request = event.data;
            var resolver = this.resolvers.get(request.responseId);
            var handshakeResolver = this.handshakeResolvers.get(request.responseId);
            try {
                var method = request.body.method;
                if (method === NativeExtensionMethod.Response) {
                    if (!resolver) {
                        return;
                    }
                    var response = request.body.response;
                    this.logger.trace("NativeMessageHandler - Received response from browser extension");
                    this.logger.tracePii("NativeMessageHandler - Received response from browser extension: " + JSON.stringify(response));
                    if (response.status !== "Success") {
                        resolver.reject(NativeAuthError.createError(response.code, response.description, response.ext));
                    }
                    else if (response.result) {
                        if (response.result["code"] && response.result["description"]) {
                            resolver.reject(NativeAuthError.createError(response.result["code"], response.result["description"], response.result["ext"]));
                        }
                        else {
                            resolver.resolve(response.result);
                        }
                    }
                    else {
                        throw AuthError.createUnexpectedError("Event does not contain result.");
                    }
                    this.resolvers.delete(request.responseId);
                }
                else if (method === NativeExtensionMethod.HandshakeResponse) {
                    if (!handshakeResolver) {
                        return;
                    }
                    clearTimeout(this.timeoutId); // Clear setTimeout
                    window.removeEventListener("message", this.windowListener, false); // Remove 'No extension' listener
                    this.extensionId = request.extensionId;
                    this.logger.verbose("NativeMessageHandler - Received HandshakeResponse from extension: " + this.extensionId);
                    handshakeResolver.resolve();
                    this.handshakeResolvers.delete(request.responseId);
                }
                // Do nothing if method is not Response or HandshakeResponse
            }
            catch (err) {
                this.logger.error("Error parsing response from WAM Extension");
                this.logger.errorPii("Error parsing response from WAM Extension: " + err.toString());
                this.logger.errorPii("Unable to parse " + event);
                if (resolver) {
                    resolver.reject(err);
                }
                else if (handshakeResolver) {
                    handshakeResolver.reject(err);
                }
            }
        };
        /**
         * Returns boolean indicating whether or not the request should attempt to use native broker
         * @param logger
         * @param config
         * @param nativeExtensionProvider
         * @param authenticationScheme
         */
        NativeMessageHandler.isNativeAvailable = function (config, logger, nativeExtensionProvider, authenticationScheme) {
            logger.trace("isNativeAvailable called");
            if (!config.system.allowNativeBroker) {
                logger.trace("isNativeAvailable: allowNativeBroker is not enabled, returning false");
                // Developer disabled WAM
                return false;
            }
            if (!nativeExtensionProvider) {
                logger.trace("isNativeAvailable: WAM extension provider is not initialized, returning false");
                // Extension is not available
                return false;
            }
            if (authenticationScheme) {
                switch (authenticationScheme) {
                    case exports.AuthenticationScheme.BEARER:
                    case exports.AuthenticationScheme.POP:
                        logger.trace("isNativeAvailable: authenticationScheme is supported, returning true");
                        return true;
                    default:
                        logger.trace("isNativeAvailable: authenticationScheme is not supported, returning false");
                        return false;
                }
            }
            return true;
        };
        return NativeMessageHandler;
    }());

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var RedirectClient = /** @class */ (function (_super) {
        __extends$1(RedirectClient, _super);
        function RedirectClient(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeStorageImpl, nativeMessageHandler, correlationId) {
            var _this = _super.call(this, config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeMessageHandler, correlationId) || this;
            _this.nativeStorage = nativeStorageImpl;
            return _this;
        }
        /**
         * Redirects the page to the /authorize endpoint of the IDP
         * @param request
         */
        RedirectClient.prototype.acquireToken = function (request) {
            return __awaiter$1(this, void 0, void 0, function () {
                var validRequest, serverTelemetryManager, handleBackButton, authCodeRequest, authClient, interactionHandler, navigateUrl, redirectStartPage, e_1;
                var _this = this;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.initializeAuthorizationRequest(request, exports.InteractionType.Redirect)];
                        case 1:
                            validRequest = _a.sent();
                            this.browserStorage.updateCacheEntries(validRequest.state, validRequest.nonce, validRequest.authority, validRequest.loginHint || Constants.EMPTY_STRING, validRequest.account || null);
                            serverTelemetryManager = this.initializeServerTelemetryManager(exports.ApiId.acquireTokenRedirect);
                            handleBackButton = function (event) {
                                // Clear temporary cache if the back button is clicked during the redirect flow.
                                if (event.persisted) {
                                    _this.logger.verbose("Page was restored from back/forward cache. Clearing temporary cache.");
                                    _this.browserStorage.cleanRequestByState(validRequest.state);
                                }
                            };
                            _a.label = 2;
                        case 2:
                            _a.trys.push([2, 7, , 8]);
                            return [4 /*yield*/, this.initializeAuthorizationCodeRequest(validRequest)];
                        case 3:
                            authCodeRequest = _a.sent();
                            return [4 /*yield*/, this.createAuthCodeClient(serverTelemetryManager, validRequest.authority, validRequest.azureCloudOptions)];
                        case 4:
                            authClient = _a.sent();
                            this.logger.verbose("Auth code client created");
                            interactionHandler = new RedirectHandler(authClient, this.browserStorage, authCodeRequest, this.logger, this.browserCrypto);
                            return [4 /*yield*/, authClient.getAuthCodeUrl(__assign$1(__assign$1({}, validRequest), { nativeBroker: NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeMessageHandler, request.authenticationScheme) }))];
                        case 5:
                            navigateUrl = _a.sent();
                            redirectStartPage = this.getRedirectStartPage(request.redirectStartPage);
                            this.logger.verbosePii("Redirect start page: " + redirectStartPage);
                            // Clear temporary cache if the back button is clicked during the redirect flow.
                            window.addEventListener("pageshow", handleBackButton);
                            return [4 /*yield*/, interactionHandler.initiateAuthRequest(navigateUrl, {
                                    navigationClient: this.navigationClient,
                                    redirectTimeout: this.config.system.redirectNavigationTimeout,
                                    redirectStartPage: redirectStartPage,
                                    onRedirectNavigate: request.onRedirectNavigate
                                })];
                        case 6: 
                        // Show the UI once the url has been created. Response will come back in the hash, which will be handled in the handleRedirectCallback function.
                        return [2 /*return*/, _a.sent()];
                        case 7:
                            e_1 = _a.sent();
                            if (e_1 instanceof AuthError) {
                                e_1.setCorrelationId(this.correlationId);
                            }
                            window.removeEventListener("pageshow", handleBackButton);
                            serverTelemetryManager.cacheFailedRequest(e_1);
                            this.browserStorage.cleanRequestByState(validRequest.state);
                            throw e_1;
                        case 8: return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * Checks if navigateToLoginRequestUrl is set, and:
         * - if true, performs logic to cache and navigate
         * - if false, handles hash string and parses response
         * @param hash
         */
        RedirectClient.prototype.handleRedirectPromise = function (hash) {
            return __awaiter$1(this, void 0, void 0, function () {
                var serverTelemetryManager, responseHash, state, serverParams, loginRequestUrl, loginRequestUrlNormalized, currentUrlNormalized, handleHashResult, navigationOptions, processHashOnRedirect, homepage, e_2;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            serverTelemetryManager = this.initializeServerTelemetryManager(exports.ApiId.handleRedirectPromise);
                            _a.label = 1;
                        case 1:
                            _a.trys.push([1, 10, , 11]);
                            if (!this.browserStorage.isInteractionInProgress(true)) {
                                this.logger.info("handleRedirectPromise called but there is no interaction in progress, returning null.");
                                return [2 /*return*/, null];
                            }
                            responseHash = this.getRedirectResponseHash(hash || window.location.hash);
                            if (!responseHash) {
                                // Not a recognized server response hash or hash not associated with a redirect request
                                this.logger.info("handleRedirectPromise did not detect a response hash as a result of a redirect. Cleaning temporary cache.");
                                this.browserStorage.cleanRequestByInteractionType(exports.InteractionType.Redirect);
                                return [2 /*return*/, null];
                            }
                            state = void 0;
                            try {
                                serverParams = UrlString.getDeserializedHash(responseHash);
                                state = this.validateAndExtractStateFromHash(serverParams, exports.InteractionType.Redirect);
                                this.logger.verbose("State extracted from hash");
                            }
                            catch (e) {
                                this.logger.info("handleRedirectPromise was unable to extract state due to: " + e);
                                this.browserStorage.cleanRequestByInteractionType(exports.InteractionType.Redirect);
                                return [2 /*return*/, null];
                            }
                            loginRequestUrl = this.browserStorage.getTemporaryCache(TemporaryCacheKeys.ORIGIN_URI, true) || Constants.EMPTY_STRING;
                            loginRequestUrlNormalized = UrlString.removeHashFromUrl(loginRequestUrl);
                            currentUrlNormalized = UrlString.removeHashFromUrl(window.location.href);
                            if (!(loginRequestUrlNormalized === currentUrlNormalized && this.config.auth.navigateToLoginRequestUrl)) return [3 /*break*/, 3];
                            // We are on the page we need to navigate to - handle hash
                            this.logger.verbose("Current page is loginRequestUrl, handling hash");
                            return [4 /*yield*/, this.handleHash(responseHash, state, serverTelemetryManager)];
                        case 2:
                            handleHashResult = _a.sent();
                            if (loginRequestUrl.indexOf("#") > -1) {
                                // Replace current hash with non-msal hash, if present
                                BrowserUtils.replaceHash(loginRequestUrl);
                            }
                            return [2 /*return*/, handleHashResult];
                        case 3:
                            if (!!this.config.auth.navigateToLoginRequestUrl) return [3 /*break*/, 4];
                            this.logger.verbose("NavigateToLoginRequestUrl set to false, handling hash");
                            return [2 /*return*/, this.handleHash(responseHash, state, serverTelemetryManager)];
                        case 4:
                            if (!(!BrowserUtils.isInIframe() || this.config.system.allowRedirectInIframe)) return [3 /*break*/, 9];
                            /*
                             * Returned from authority using redirect - need to perform navigation before processing response
                             * Cache the hash to be retrieved after the next redirect
                             */
                            this.browserStorage.setTemporaryCache(TemporaryCacheKeys.URL_HASH, responseHash, true);
                            navigationOptions = {
                                apiId: exports.ApiId.handleRedirectPromise,
                                timeout: this.config.system.redirectNavigationTimeout,
                                noHistory: true
                            };
                            processHashOnRedirect = true;
                            if (!(!loginRequestUrl || loginRequestUrl === "null")) return [3 /*break*/, 6];
                            homepage = BrowserUtils.getHomepage();
                            // Cache the homepage under ORIGIN_URI to ensure cached hash is processed on homepage
                            this.browserStorage.setTemporaryCache(TemporaryCacheKeys.ORIGIN_URI, homepage, true);
                            this.logger.warning("Unable to get valid login request url from cache, redirecting to home page");
                            return [4 /*yield*/, this.navigationClient.navigateInternal(homepage, navigationOptions)];
                        case 5:
                            processHashOnRedirect = _a.sent();
                            return [3 /*break*/, 8];
                        case 6:
                            // Navigate to page that initiated the redirect request
                            this.logger.verbose("Navigating to loginRequestUrl: " + loginRequestUrl);
                            return [4 /*yield*/, this.navigationClient.navigateInternal(loginRequestUrl, navigationOptions)];
                        case 7:
                            processHashOnRedirect = _a.sent();
                            _a.label = 8;
                        case 8:
                            // If navigateInternal implementation returns false, handle the hash now
                            if (!processHashOnRedirect) {
                                return [2 /*return*/, this.handleHash(responseHash, state, serverTelemetryManager)];
                            }
                            _a.label = 9;
                        case 9: return [2 /*return*/, null];
                        case 10:
                            e_2 = _a.sent();
                            if (e_2 instanceof AuthError) {
                                e_2.setCorrelationId(this.correlationId);
                            }
                            serverTelemetryManager.cacheFailedRequest(e_2);
                            this.browserStorage.cleanRequestByInteractionType(exports.InteractionType.Redirect);
                            throw e_2;
                        case 11: return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * Gets the response hash for a redirect request
         * Returns null if interactionType in the state value is not "redirect" or the hash does not contain known properties
         * @param hash
         */
        RedirectClient.prototype.getRedirectResponseHash = function (hash) {
            this.logger.verbose("getRedirectResponseHash called");
            // Get current location hash from window or cache.
            var isResponseHash = UrlString.hashContainsKnownProperties(hash);
            if (isResponseHash) {
                BrowserUtils.clearHash(window);
                this.logger.verbose("Hash contains known properties, returning response hash");
                return hash;
            }
            var cachedHash = this.browserStorage.getTemporaryCache(TemporaryCacheKeys.URL_HASH, true);
            this.browserStorage.removeItem(this.browserStorage.generateCacheKey(TemporaryCacheKeys.URL_HASH));
            this.logger.verbose("Hash does not contain known properties, returning cached hash");
            return cachedHash;
        };
        /**
         * Checks if hash exists and handles in window.
         * @param hash
         * @param state
         */
        RedirectClient.prototype.handleHash = function (hash, state, serverTelemetryManager) {
            return __awaiter$1(this, void 0, void 0, function () {
                var cachedRequest, serverParams, nativeInteractionClient, userRequestState, currentAuthority, authClient, interactionHandler;
                var _this = this;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            cachedRequest = this.browserStorage.getCachedRequest(state, this.browserCrypto);
                            this.logger.verbose("handleHash called, retrieved cached request");
                            serverParams = UrlString.getDeserializedHash(hash);
                            if (serverParams.accountId) {
                                this.logger.verbose("Account id found in hash, calling WAM for token");
                                if (!this.nativeMessageHandler) {
                                    throw BrowserAuthError.createNativeConnectionNotEstablishedError();
                                }
                                nativeInteractionClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, exports.ApiId.acquireTokenPopup, this.performanceClient, this.nativeMessageHandler, serverParams.accountId, this.browserStorage, cachedRequest.correlationId);
                                userRequestState = ProtocolUtils.parseRequestState(this.browserCrypto, state).userRequestState;
                                return [2 /*return*/, nativeInteractionClient.acquireToken(__assign$1(__assign$1({}, cachedRequest), { state: userRequestState, prompt: undefined // Server should handle the prompt, ideally native broker can do this part silently
                                     })).finally(function () {
                                        _this.browserStorage.cleanRequestByState(state);
                                    })];
                            }
                            currentAuthority = this.browserStorage.getCachedAuthority(state);
                            if (!currentAuthority) {
                                throw BrowserAuthError.createNoCachedAuthorityError();
                            }
                            return [4 /*yield*/, this.createAuthCodeClient(serverTelemetryManager, currentAuthority)];
                        case 1:
                            authClient = _a.sent();
                            this.logger.verbose("Auth code client created");
                            ThrottlingUtils.removeThrottle(this.browserStorage, this.config.auth.clientId, cachedRequest);
                            interactionHandler = new RedirectHandler(authClient, this.browserStorage, cachedRequest, this.logger, this.browserCrypto);
                            return [4 /*yield*/, interactionHandler.handleCodeResponseFromHash(hash, state, authClient.authority, this.networkClient)];
                        case 2: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        /**
         * Use to log out the current user, and redirect the user to the postLogoutRedirectUri.
         * Default behaviour is to redirect the user to `window.location.href`.
         * @param logoutRequest
         */
        RedirectClient.prototype.logout = function (logoutRequest) {
            return __awaiter$1(this, void 0, void 0, function () {
                var validLogoutRequest, serverTelemetryManager, navigationOptions, authClient, logoutUri, navigate, e_3;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            this.logger.verbose("logoutRedirect called");
                            validLogoutRequest = this.initializeLogoutRequest(logoutRequest);
                            serverTelemetryManager = this.initializeServerTelemetryManager(exports.ApiId.logout);
                            _a.label = 1;
                        case 1:
                            _a.trys.push([1, 10, , 11]);
                            this.eventHandler.emitEvent(exports.EventType.LOGOUT_START, exports.InteractionType.Redirect, logoutRequest);
                            // Clear cache on logout
                            return [4 /*yield*/, this.clearCacheOnLogout(validLogoutRequest.account)];
                        case 2:
                            // Clear cache on logout
                            _a.sent();
                            navigationOptions = {
                                apiId: exports.ApiId.logout,
                                timeout: this.config.system.redirectNavigationTimeout,
                                noHistory: false
                            };
                            return [4 /*yield*/, this.createAuthCodeClient(serverTelemetryManager, logoutRequest && logoutRequest.authority)];
                        case 3:
                            authClient = _a.sent();
                            this.logger.verbose("Auth code client created");
                            logoutUri = authClient.getLogoutUri(validLogoutRequest);
                            this.eventHandler.emitEvent(exports.EventType.LOGOUT_SUCCESS, exports.InteractionType.Redirect, validLogoutRequest);
                            if (!(logoutRequest && typeof logoutRequest.onRedirectNavigate === "function")) return [3 /*break*/, 7];
                            navigate = logoutRequest.onRedirectNavigate(logoutUri);
                            if (!(navigate !== false)) return [3 /*break*/, 5];
                            this.logger.verbose("Logout onRedirectNavigate did not return false, navigating");
                            // Ensure interaction is in progress
                            if (!this.browserStorage.getInteractionInProgress()) {
                                this.browserStorage.setInteractionInProgress(true);
                            }
                            return [4 /*yield*/, this.navigationClient.navigateExternal(logoutUri, navigationOptions)];
                        case 4:
                            _a.sent();
                            return [2 /*return*/];
                        case 5:
                            // Ensure interaction is not in progress
                            this.browserStorage.setInteractionInProgress(false);
                            this.logger.verbose("Logout onRedirectNavigate returned false, stopping navigation");
                            _a.label = 6;
                        case 6: return [3 /*break*/, 9];
                        case 7:
                            // Ensure interaction is in progress
                            if (!this.browserStorage.getInteractionInProgress()) {
                                this.browserStorage.setInteractionInProgress(true);
                            }
                            return [4 /*yield*/, this.navigationClient.navigateExternal(logoutUri, navigationOptions)];
                        case 8:
                            _a.sent();
                            return [2 /*return*/];
                        case 9: return [3 /*break*/, 11];
                        case 10:
                            e_3 = _a.sent();
                            if (e_3 instanceof AuthError) {
                                e_3.setCorrelationId(this.correlationId);
                            }
                            serverTelemetryManager.cacheFailedRequest(e_3);
                            this.eventHandler.emitEvent(exports.EventType.LOGOUT_FAILURE, exports.InteractionType.Redirect, null, e_3);
                            this.eventHandler.emitEvent(exports.EventType.LOGOUT_END, exports.InteractionType.Redirect);
                            throw e_3;
                        case 11:
                            this.eventHandler.emitEvent(exports.EventType.LOGOUT_END, exports.InteractionType.Redirect);
                            return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * Use to get the redirectStartPage either from request or use current window
         * @param requestStartPage
         */
        RedirectClient.prototype.getRedirectStartPage = function (requestStartPage) {
            var redirectStartPage = requestStartPage || window.location.href;
            return UrlString.getAbsoluteUrl(redirectStartPage, BrowserUtils.getCurrentUri());
        };
        return RedirectClient;
    }(StandardInteractionClient));

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var PopupClient = /** @class */ (function (_super) {
        __extends$1(PopupClient, _super);
        function PopupClient(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeStorageImpl, nativeMessageHandler, correlationId) {
            var _this = _super.call(this, config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeMessageHandler, correlationId) || this;
            // Properly sets this reference for the unload event.
            _this.unloadWindow = _this.unloadWindow.bind(_this);
            _this.nativeStorage = nativeStorageImpl;
            return _this;
        }
        /**
         * Acquires tokens by opening a popup window to the /authorize endpoint of the authority
         * @param request
         */
        PopupClient.prototype.acquireToken = function (request) {
            try {
                var popupName = this.generatePopupName(request.scopes || OIDC_DEFAULT_SCOPES, request.authority || this.config.auth.authority);
                var popupWindowAttributes = request.popupWindowAttributes || {};
                // asyncPopups flag is true. Acquires token without first opening popup. Popup will be opened later asynchronously.
                if (this.config.system.asyncPopups) {
                    this.logger.verbose("asyncPopups set to true, acquiring token");
                    // Passes on popup position and dimensions if in request
                    return this.acquireTokenPopupAsync(request, popupName, popupWindowAttributes);
                }
                else {
                    // asyncPopups flag is set to false. Opens popup before acquiring token.
                    this.logger.verbose("asyncPopup set to false, opening popup before acquiring token");
                    var popup = this.openSizedPopup("about:blank", popupName, popupWindowAttributes);
                    return this.acquireTokenPopupAsync(request, popupName, popupWindowAttributes, popup);
                }
            }
            catch (e) {
                return Promise.reject(e);
            }
        };
        /**
         * Clears local cache for the current user then opens a popup window prompting the user to sign-out of the server
         * @param logoutRequest
         */
        PopupClient.prototype.logout = function (logoutRequest) {
            try {
                this.logger.verbose("logoutPopup called");
                var validLogoutRequest = this.initializeLogoutRequest(logoutRequest);
                var popupName = this.generateLogoutPopupName(validLogoutRequest);
                var authority = logoutRequest && logoutRequest.authority;
                var mainWindowRedirectUri = logoutRequest && logoutRequest.mainWindowRedirectUri;
                var popupWindowAttributes = (logoutRequest === null || logoutRequest === void 0 ? void 0 : logoutRequest.popupWindowAttributes) || {};
                // asyncPopups flag is true. Acquires token without first opening popup. Popup will be opened later asynchronously.
                if (this.config.system.asyncPopups) {
                    this.logger.verbose("asyncPopups set to true");
                    // Passes on popup position and dimensions if in request
                    return this.logoutPopupAsync(validLogoutRequest, popupName, popupWindowAttributes, authority, undefined, mainWindowRedirectUri);
                }
                else {
                    // asyncPopups flag is set to false. Opens popup before logging out.
                    this.logger.verbose("asyncPopup set to false, opening popup");
                    var popup = this.openSizedPopup("about:blank", popupName, popupWindowAttributes);
                    return this.logoutPopupAsync(validLogoutRequest, popupName, popupWindowAttributes, authority, popup, mainWindowRedirectUri);
                }
            }
            catch (e) {
                // Since this function is synchronous we need to reject
                return Promise.reject(e);
            }
        };
        /**
         * Helper which obtains an access_token for your API via opening a popup window in the user's browser
         * @param validRequest
         * @param popupName
         * @param popup
         * @param popupWindowAttributes
         *
         * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.
         */
        PopupClient.prototype.acquireTokenPopupAsync = function (request, popupName, popupWindowAttributes, popup) {
            return __awaiter$1(this, void 0, void 0, function () {
                var serverTelemetryManager, validRequest, authCodeRequest, authClient, isNativeBroker, fetchNativeAccountIdMeasurement, navigateUrl, interactionHandler, popupParameters, popupWindow, hash, serverParams, state_1, nativeInteractionClient, userRequestState, result, e_1;
                var _this = this;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            this.logger.verbose("acquireTokenPopupAsync called");
                            serverTelemetryManager = this.initializeServerTelemetryManager(exports.ApiId.acquireTokenPopup);
                            return [4 /*yield*/, this.initializeAuthorizationRequest(request, exports.InteractionType.Popup)];
                        case 1:
                            validRequest = _a.sent();
                            this.browserStorage.updateCacheEntries(validRequest.state, validRequest.nonce, validRequest.authority, validRequest.loginHint || Constants.EMPTY_STRING, validRequest.account || null);
                            _a.label = 2;
                        case 2:
                            _a.trys.push([2, 8, , 9]);
                            return [4 /*yield*/, this.initializeAuthorizationCodeRequest(validRequest)];
                        case 3:
                            authCodeRequest = _a.sent();
                            return [4 /*yield*/, this.createAuthCodeClient(serverTelemetryManager, validRequest.authority, validRequest.azureCloudOptions)];
                        case 4:
                            authClient = _a.sent();
                            this.logger.verbose("Auth code client created");
                            isNativeBroker = NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeMessageHandler, request.authenticationScheme);
                            fetchNativeAccountIdMeasurement = void 0;
                            if (isNativeBroker) {
                                fetchNativeAccountIdMeasurement = this.performanceClient.startMeasurement(exports.PerformanceEvents.FetchAccountIdWithNativeBroker, request.correlationId);
                            }
                            return [4 /*yield*/, authClient.getAuthCodeUrl(__assign$1(__assign$1({}, validRequest), { nativeBroker: isNativeBroker }))];
                        case 5:
                            navigateUrl = _a.sent();
                            interactionHandler = new InteractionHandler(authClient, this.browserStorage, authCodeRequest, this.logger);
                            popupParameters = {
                                popup: popup,
                                popupName: popupName,
                                popupWindowAttributes: popupWindowAttributes
                            };
                            popupWindow = this.initiateAuthRequest(navigateUrl, popupParameters);
                            this.eventHandler.emitEvent(exports.EventType.POPUP_OPENED, exports.InteractionType.Popup, { popupWindow: popupWindow }, null);
                            return [4 /*yield*/, this.monitorPopupForHash(popupWindow)];
                        case 6:
                            hash = _a.sent();
                            serverParams = UrlString.getDeserializedHash(hash);
                            state_1 = this.validateAndExtractStateFromHash(serverParams, exports.InteractionType.Popup, validRequest.correlationId);
                            // Remove throttle if it exists
                            ThrottlingUtils.removeThrottle(this.browserStorage, this.config.auth.clientId, authCodeRequest);
                            if (serverParams.accountId) {
                                this.logger.verbose("Account id found in hash, calling WAM for token");
                                // end measurement for server call with native brokering enabled
                                if (fetchNativeAccountIdMeasurement) {
                                    fetchNativeAccountIdMeasurement.endMeasurement({
                                        success: true,
                                        isNativeBroker: true
                                    });
                                }
                                if (!this.nativeMessageHandler) {
                                    throw BrowserAuthError.createNativeConnectionNotEstablishedError();
                                }
                                nativeInteractionClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, exports.ApiId.acquireTokenPopup, this.performanceClient, this.nativeMessageHandler, serverParams.accountId, this.nativeStorage, validRequest.correlationId);
                                userRequestState = ProtocolUtils.parseRequestState(this.browserCrypto, state_1).userRequestState;
                                return [2 /*return*/, nativeInteractionClient.acquireToken(__assign$1(__assign$1({}, validRequest), { state: userRequestState, prompt: undefined // Server should handle the prompt, ideally native broker can do this part silently
                                     })).finally(function () {
                                        _this.browserStorage.cleanRequestByState(state_1);
                                    })];
                            }
                            return [4 /*yield*/, interactionHandler.handleCodeResponseFromHash(hash, state_1, authClient.authority, this.networkClient)];
                        case 7:
                            result = _a.sent();
                            return [2 /*return*/, result];
                        case 8:
                            e_1 = _a.sent();
                            if (popup) {
                                // Close the synchronous popup if an error is thrown before the window unload event is registered
                                popup.close();
                            }
                            if (e_1 instanceof AuthError) {
                                e_1.setCorrelationId(this.correlationId);
                            }
                            serverTelemetryManager.cacheFailedRequest(e_1);
                            this.browserStorage.cleanRequestByState(validRequest.state);
                            throw e_1;
                        case 9: return [2 /*return*/];
                    }
                });
            });
        };
        /**
         *
         * @param validRequest
         * @param popupName
         * @param requestAuthority
         * @param popup
         * @param mainWindowRedirectUri
         * @param popupWindowAttributes
         */
        PopupClient.prototype.logoutPopupAsync = function (validRequest, popupName, popupWindowAttributes, requestAuthority, popup, mainWindowRedirectUri) {
            return __awaiter$1(this, void 0, void 0, function () {
                var serverTelemetryManager, authClient, logoutUri, popupWindow, navigationOptions, absoluteUrl, e_2;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            this.logger.verbose("logoutPopupAsync called");
                            this.eventHandler.emitEvent(exports.EventType.LOGOUT_START, exports.InteractionType.Popup, validRequest);
                            serverTelemetryManager = this.initializeServerTelemetryManager(exports.ApiId.logoutPopup);
                            _a.label = 1;
                        case 1:
                            _a.trys.push([1, 5, , 6]);
                            // Clear cache on logout
                            return [4 /*yield*/, this.clearCacheOnLogout(validRequest.account)];
                        case 2:
                            // Clear cache on logout
                            _a.sent();
                            return [4 /*yield*/, this.createAuthCodeClient(serverTelemetryManager, requestAuthority)];
                        case 3:
                            authClient = _a.sent();
                            this.logger.verbose("Auth code client created");
                            logoutUri = authClient.getLogoutUri(validRequest);
                            this.eventHandler.emitEvent(exports.EventType.LOGOUT_SUCCESS, exports.InteractionType.Popup, validRequest);
                            popupWindow = this.openPopup(logoutUri, { popupName: popupName, popupWindowAttributes: popupWindowAttributes, popup: popup });
                            this.eventHandler.emitEvent(exports.EventType.POPUP_OPENED, exports.InteractionType.Popup, { popupWindow: popupWindow }, null);
                            return [4 /*yield*/, this.waitForLogoutPopup(popupWindow)];
                        case 4:
                            _a.sent();
                            if (mainWindowRedirectUri) {
                                navigationOptions = {
                                    apiId: exports.ApiId.logoutPopup,
                                    timeout: this.config.system.redirectNavigationTimeout,
                                    noHistory: false
                                };
                                absoluteUrl = UrlString.getAbsoluteUrl(mainWindowRedirectUri, BrowserUtils.getCurrentUri());
                                this.logger.verbose("Redirecting main window to url specified in the request");
                                this.logger.verbosePii("Redirecting main window to: " + absoluteUrl);
                                this.navigationClient.navigateInternal(absoluteUrl, navigationOptions);
                            }
                            else {
                                this.logger.verbose("No main window navigation requested");
                            }
                            return [3 /*break*/, 6];
                        case 5:
                            e_2 = _a.sent();
                            if (popup) {
                                // Close the synchronous popup if an error is thrown before the window unload event is registered
                                popup.close();
                            }
                            if (e_2 instanceof AuthError) {
                                e_2.setCorrelationId(this.correlationId);
                            }
                            this.browserStorage.setInteractionInProgress(false);
                            this.eventHandler.emitEvent(exports.EventType.LOGOUT_FAILURE, exports.InteractionType.Popup, null, e_2);
                            this.eventHandler.emitEvent(exports.EventType.LOGOUT_END, exports.InteractionType.Popup);
                            serverTelemetryManager.cacheFailedRequest(e_2);
                            throw e_2;
                        case 6:
                            this.eventHandler.emitEvent(exports.EventType.LOGOUT_END, exports.InteractionType.Popup);
                            return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * Opens a popup window with given request Url.
         * @param requestUrl
         */
        PopupClient.prototype.initiateAuthRequest = function (requestUrl, params) {
            // Check that request url is not empty.
            if (!StringUtils.isEmpty(requestUrl)) {
                this.logger.infoPii("Navigate to: " + requestUrl);
                // Open the popup window to requestUrl.
                return this.openPopup(requestUrl, params);
            }
            else {
                // Throw error if request URL is empty.
                this.logger.error("Navigate url is empty");
                throw BrowserAuthError.createEmptyNavigationUriError();
            }
        };
        /**
         * Monitors a window until it loads a url with the same origin.
         * @param popupWindow - window that is being monitored
         * @param timeout - timeout for processing hash once popup is redirected back to application
         */
        PopupClient.prototype.monitorPopupForHash = function (popupWindow) {
            var _this = this;
            return new Promise(function (resolve, reject) {
                /*
                 * Polling for popups needs to be tick-based,
                 * since a non-trivial amount of time can be spent on interaction (which should not count against the timeout).
                 */
                var maxTicks = _this.config.system.windowHashTimeout / BrowserConstants.POLL_INTERVAL_MS;
                var ticks = 0;
                _this.logger.verbose("PopupHandler.monitorPopupForHash - polling started");
                var intervalId = setInterval(function () {
                    // Window is closed
                    if (popupWindow.closed) {
                        _this.logger.error("PopupHandler.monitorPopupForHash - window closed");
                        _this.cleanPopup();
                        clearInterval(intervalId);
                        reject(BrowserAuthError.createUserCancelledError());
                        return;
                    }
                    var href = Constants.EMPTY_STRING;
                    var hash = Constants.EMPTY_STRING;
                    try {
                        /*
                         * Will throw if cross origin,
                         * which should be caught and ignored
                         * since we need the interval to keep running while on STS UI.
                         */
                        href = popupWindow.location.href;
                        hash = popupWindow.location.hash;
                    }
                    catch (e) { }
                    // Don't process blank pages or cross domain
                    if (StringUtils.isEmpty(href) || href === "about:blank") {
                        return;
                    }
                    _this.logger.verbose("PopupHandler.monitorPopupForHash - popup window is on same origin as caller");
                    /*
                     * Only run clock when we are on same domain for popups
                     * as popup operations can take a long time.
                     */
                    ticks++;
                    if (hash) {
                        _this.logger.verbose("PopupHandler.monitorPopupForHash - found hash in url");
                        clearInterval(intervalId);
                        _this.cleanPopup(popupWindow);
                        if (UrlString.hashContainsKnownProperties(hash)) {
                            _this.logger.verbose("PopupHandler.monitorPopupForHash - hash contains known properties, returning.");
                            resolve(hash);
                        }
                        else {
                            _this.logger.error("PopupHandler.monitorPopupForHash - found hash in url but it does not contain known properties. Check that your router is not changing the hash prematurely.");
                            _this.logger.errorPii("PopupHandler.monitorPopupForHash - hash found: " + hash);
                            reject(BrowserAuthError.createHashDoesNotContainKnownPropertiesError());
                        }
                    }
                    else if (ticks > maxTicks) {
                        _this.logger.error("PopupHandler.monitorPopupForHash - unable to find hash in url, timing out");
                        clearInterval(intervalId);
                        reject(BrowserAuthError.createMonitorPopupTimeoutError());
                    }
                }, BrowserConstants.POLL_INTERVAL_MS);
            });
        };
        /**
         * Waits for user interaction in logout popup window
         * @param popupWindow
         * @returns
         */
        PopupClient.prototype.waitForLogoutPopup = function (popupWindow) {
            var _this = this;
            return new Promise(function (resolve) {
                _this.logger.verbose("PopupHandler.waitForLogoutPopup - polling started");
                var intervalId = setInterval(function () {
                    // Window is closed
                    if (popupWindow.closed) {
                        _this.logger.error("PopupHandler.waitForLogoutPopup - window closed");
                        _this.cleanPopup();
                        clearInterval(intervalId);
                        resolve();
                    }
                    var href = Constants.EMPTY_STRING;
                    try {
                        /*
                         * Will throw if cross origin,
                         * which should be caught and ignored
                         * since we need the interval to keep running while on STS UI.
                         */
                        href = popupWindow.location.href;
                    }
                    catch (e) { }
                    // Don't process blank pages or cross domain
                    if (StringUtils.isEmpty(href) || href === "about:blank") {
                        return;
                    }
                    _this.logger.verbose("PopupHandler.waitForLogoutPopup - popup window is on same origin as caller, closing.");
                    clearInterval(intervalId);
                    _this.cleanPopup(popupWindow);
                    resolve();
                }, BrowserConstants.POLL_INTERVAL_MS);
            });
        };
        /**
         * @hidden
         *
         * Configures popup window for login.
         *
         * @param urlNavigate
         * @param title
         * @param popUpWidth
         * @param popUpHeight
         * @param popupWindowAttributes
         * @ignore
         * @hidden
         */
        PopupClient.prototype.openPopup = function (urlNavigate, popupParams) {
            try {
                var popupWindow = void 0;
                // Popup window passed in, setting url to navigate to
                if (popupParams.popup) {
                    popupWindow = popupParams.popup;
                    this.logger.verbosePii("Navigating popup window to: " + urlNavigate);
                    popupWindow.location.assign(urlNavigate);
                }
                else if (typeof popupParams.popup === "undefined") {
                    // Popup will be undefined if it was not passed in
                    this.logger.verbosePii("Opening popup window to: " + urlNavigate);
                    popupWindow = this.openSizedPopup(urlNavigate, popupParams.popupName, popupParams.popupWindowAttributes);
                }
                // Popup will be null if popups are blocked
                if (!popupWindow) {
                    throw BrowserAuthError.createEmptyWindowCreatedError();
                }
                if (popupWindow.focus) {
                    popupWindow.focus();
                }
                this.currentWindow = popupWindow;
                window.addEventListener("beforeunload", this.unloadWindow);
                return popupWindow;
            }
            catch (e) {
                this.logger.error("error opening popup " + e.message);
                this.browserStorage.setInteractionInProgress(false);
                throw BrowserAuthError.createPopupWindowError(e.toString());
            }
        };
        /**
         * Helper function to set popup window dimensions and position
         * @param urlNavigate
         * @param popupName
         * @param popupWindowAttributes
         * @returns
         */
        PopupClient.prototype.openSizedPopup = function (urlNavigate, popupName, popupWindowAttributes) {
            var _a, _b, _c, _d;
            /**
             * adding winLeft and winTop to account for dual monitor
             * using screenLeft and screenTop for IE8 and earlier
             */
            var winLeft = window.screenLeft ? window.screenLeft : window.screenX;
            var winTop = window.screenTop ? window.screenTop : window.screenY;
            /**
             * window.innerWidth displays browser window"s height and width excluding toolbars
             * using document.documentElement.clientWidth for IE8 and earlier
             */
            var winWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
            var winHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
            var width = (_a = popupWindowAttributes.popupSize) === null || _a === void 0 ? void 0 : _a.width;
            var height = (_b = popupWindowAttributes.popupSize) === null || _b === void 0 ? void 0 : _b.height;
            var top = (_c = popupWindowAttributes.popupPosition) === null || _c === void 0 ? void 0 : _c.top;
            var left = (_d = popupWindowAttributes.popupPosition) === null || _d === void 0 ? void 0 : _d.left;
            if (!width || width < 0 || width > winWidth) {
                this.logger.verbose("Default popup window width used. Window width not configured or invalid.");
                width = BrowserConstants.POPUP_WIDTH;
            }
            if (!height || height < 0 || height > winHeight) {
                this.logger.verbose("Default popup window height used. Window height not configured or invalid.");
                height = BrowserConstants.POPUP_HEIGHT;
            }
            if (!top || top < 0 || top > winHeight) {
                this.logger.verbose("Default popup window top position used. Window top not configured or invalid.");
                top = Math.max(0, ((winHeight / 2) - (BrowserConstants.POPUP_HEIGHT / 2)) + winTop);
            }
            if (!left || left < 0 || left > winWidth) {
                this.logger.verbose("Default popup window left position used. Window left not configured or invalid.");
                left = Math.max(0, ((winWidth / 2) - (BrowserConstants.POPUP_WIDTH / 2)) + winLeft);
            }
            return window.open(urlNavigate, popupName, "width=" + width + ", height=" + height + ", top=" + top + ", left=" + left + ", scrollbars=yes");
        };
        /**
         * Event callback to unload main window.
         */
        PopupClient.prototype.unloadWindow = function (e) {
            this.browserStorage.cleanRequestByInteractionType(exports.InteractionType.Popup);
            if (this.currentWindow) {
                this.currentWindow.close();
            }
            // Guarantees browser unload will happen, so no other errors will be thrown.
            e.preventDefault();
        };
        /**
         * Closes popup, removes any state vars created during popup calls.
         * @param popupWindow
         */
        PopupClient.prototype.cleanPopup = function (popupWindow) {
            if (popupWindow) {
                // Close window.
                popupWindow.close();
            }
            // Remove window unload function
            window.removeEventListener("beforeunload", this.unloadWindow);
            // Interaction is completed - remove interaction status.
            this.browserStorage.setInteractionInProgress(false);
        };
        /**
         * Generates the name for the popup based on the client id and request
         * @param clientId
         * @param request
         */
        PopupClient.prototype.generatePopupName = function (scopes, authority) {
            return BrowserConstants.POPUP_NAME_PREFIX + "." + this.config.auth.clientId + "." + scopes.join("-") + "." + authority + "." + this.correlationId;
        };
        /**
         * Generates the name for the popup based on the client id and request for logouts
         * @param clientId
         * @param request
         */
        PopupClient.prototype.generateLogoutPopupName = function (request) {
            var homeAccountId = request.account && request.account.homeAccountId;
            return BrowserConstants.POPUP_NAME_PREFIX + "." + this.config.auth.clientId + "." + homeAccountId + "." + this.correlationId;
        };
        return PopupClient;
    }(StandardInteractionClient));

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var NavigationClient = /** @class */ (function () {
        function NavigationClient() {
        }
        /**
         * Navigates to other pages within the same web application
         * @param url
         * @param options
         */
        NavigationClient.prototype.navigateInternal = function (url, options) {
            return NavigationClient.defaultNavigateWindow(url, options);
        };
        /**
         * Navigates to other pages outside the web application i.e. the Identity Provider
         * @param url
         * @param options
         */
        NavigationClient.prototype.navigateExternal = function (url, options) {
            return NavigationClient.defaultNavigateWindow(url, options);
        };
        /**
         * Default navigation implementation invoked by the internal and external functions
         * @param url
         * @param options
         */
        NavigationClient.defaultNavigateWindow = function (url, options) {
            if (options.noHistory) {
                window.location.replace(url);
            }
            else {
                window.location.assign(url);
            }
            return new Promise(function (resolve) {
                setTimeout(function () {
                    resolve(true);
                }, options.timeout);
            });
        };
        return NavigationClient;
    }());

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    // Default timeout for popup windows and iframes in milliseconds
    var DEFAULT_POPUP_TIMEOUT_MS = 60000;
    var DEFAULT_IFRAME_TIMEOUT_MS = 6000;
    var DEFAULT_REDIRECT_TIMEOUT_MS = 30000;
    var DEFAULT_NATIVE_BROKER_HANDSHAKE_TIMEOUT_MS = 2000;
    /**
     * MSAL function that sets the default options when not explicitly configured from app developer
     *
     * @param auth
     * @param cache
     * @param system
     *
     * @returns Configuration object
     */
    function buildConfiguration(_a, isBrowserEnvironment) {
        var userInputAuth = _a.auth, userInputCache = _a.cache, userInputSystem = _a.system, userInputTelemetry = _a.telemetry;
        // Default auth options for browser
        var DEFAULT_AUTH_OPTIONS = {
            clientId: Constants.EMPTY_STRING,
            authority: "" + Constants.DEFAULT_AUTHORITY,
            knownAuthorities: [],
            cloudDiscoveryMetadata: Constants.EMPTY_STRING,
            authorityMetadata: Constants.EMPTY_STRING,
            redirectUri: Constants.EMPTY_STRING,
            postLogoutRedirectUri: Constants.EMPTY_STRING,
            navigateToLoginRequestUrl: true,
            clientCapabilities: [],
            protocolMode: exports.ProtocolMode.AAD,
            azureCloudOptions: {
                azureCloudInstance: exports.AzureCloudInstance.None,
                tenant: Constants.EMPTY_STRING
            },
            skipAuthorityMetadataCache: false,
        };
        // Default cache options for browser
        var DEFAULT_CACHE_OPTIONS = {
            cacheLocation: exports.BrowserCacheLocation.SessionStorage,
            storeAuthStateInCookie: false,
            secureCookies: false
        };
        // Default logger options for browser
        var DEFAULT_LOGGER_OPTIONS = {
            // eslint-disable-next-line @typescript-eslint/no-empty-function
            loggerCallback: function () { },
            logLevel: exports.LogLevel.Info,
            piiLoggingEnabled: false
        };
        // Default system options for browser
        var DEFAULT_BROWSER_SYSTEM_OPTIONS = __assign$1(__assign$1({}, DEFAULT_SYSTEM_OPTIONS), { loggerOptions: DEFAULT_LOGGER_OPTIONS, networkClient: isBrowserEnvironment ? BrowserUtils.getBrowserNetworkClient() : StubbedNetworkModule, navigationClient: new NavigationClient(), loadFrameTimeout: 0, 
            // If loadFrameTimeout is provided, use that as default.
            windowHashTimeout: (userInputSystem === null || userInputSystem === void 0 ? void 0 : userInputSystem.loadFrameTimeout) || DEFAULT_POPUP_TIMEOUT_MS, iframeHashTimeout: (userInputSystem === null || userInputSystem === void 0 ? void 0 : userInputSystem.loadFrameTimeout) || DEFAULT_IFRAME_TIMEOUT_MS, navigateFrameWait: isBrowserEnvironment && BrowserUtils.detectIEOrEdge() ? 500 : 0, redirectNavigationTimeout: DEFAULT_REDIRECT_TIMEOUT_MS, asyncPopups: false, allowRedirectInIframe: false, allowNativeBroker: false, nativeBrokerHandshakeTimeout: (userInputSystem === null || userInputSystem === void 0 ? void 0 : userInputSystem.nativeBrokerHandshakeTimeout) || DEFAULT_NATIVE_BROKER_HANDSHAKE_TIMEOUT_MS });
        var DEFAULT_TELEMETRY_OPTIONS = {
            application: {
                appName: Constants.EMPTY_STRING,
                appVersion: Constants.EMPTY_STRING
            }
        };
        var overlayedConfig = {
            auth: __assign$1(__assign$1({}, DEFAULT_AUTH_OPTIONS), userInputAuth),
            cache: __assign$1(__assign$1({}, DEFAULT_CACHE_OPTIONS), userInputCache),
            system: __assign$1(__assign$1({}, DEFAULT_BROWSER_SYSTEM_OPTIONS), userInputSystem),
            telemetry: __assign$1(__assign$1({}, DEFAULT_TELEMETRY_OPTIONS), userInputTelemetry)
        };
        return overlayedConfig;
    }

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var SilentHandler = /** @class */ (function (_super) {
        __extends$1(SilentHandler, _super);
        function SilentHandler(authCodeModule, storageImpl, authCodeRequest, logger, navigateFrameWait) {
            var _this = _super.call(this, authCodeModule, storageImpl, authCodeRequest, logger) || this;
            _this.navigateFrameWait = navigateFrameWait;
            return _this;
        }
        /**
         * Creates a hidden iframe to given URL using user-requested scopes as an id.
         * @param urlNavigate
         * @param userRequestScopes
         */
        SilentHandler.prototype.initiateAuthRequest = function (requestUrl) {
            return __awaiter$1(this, void 0, void 0, function () {
                var _a;
                return __generator$1(this, function (_b) {
                    switch (_b.label) {
                        case 0:
                            if (StringUtils.isEmpty(requestUrl)) {
                                // Throw error if request URL is empty.
                                this.logger.info("Navigate url is empty");
                                throw BrowserAuthError.createEmptyNavigationUriError();
                            }
                            if (!this.navigateFrameWait) return [3 /*break*/, 2];
                            return [4 /*yield*/, this.loadFrame(requestUrl)];
                        case 1:
                            _a = _b.sent();
                            return [3 /*break*/, 3];
                        case 2:
                            _a = this.loadFrameSync(requestUrl);
                            _b.label = 3;
                        case 3: return [2 /*return*/, _a];
                    }
                });
            });
        };
        /**
         * Monitors an iframe content window until it loads a url with a known hash, or hits a specified timeout.
         * @param iframe
         * @param timeout
         */
        SilentHandler.prototype.monitorIframeForHash = function (iframe, timeout) {
            var _this = this;
            return new Promise(function (resolve, reject) {
                if (timeout < DEFAULT_IFRAME_TIMEOUT_MS) {
                    _this.logger.warning("system.loadFrameTimeout or system.iframeHashTimeout set to lower (" + timeout + "ms) than the default (" + DEFAULT_IFRAME_TIMEOUT_MS + "ms). This may result in timeouts.");
                }
                /*
                 * Polling for iframes can be purely timing based,
                 * since we don't need to account for interaction.
                 */
                var nowMark = window.performance.now();
                var timeoutMark = nowMark + timeout;
                var intervalId = setInterval(function () {
                    if (window.performance.now() > timeoutMark) {
                        _this.removeHiddenIframe(iframe);
                        clearInterval(intervalId);
                        reject(BrowserAuthError.createMonitorIframeTimeoutError());
                        return;
                    }
                    var href = Constants.EMPTY_STRING;
                    var contentWindow = iframe.contentWindow;
                    try {
                        /*
                         * Will throw if cross origin,
                         * which should be caught and ignored
                         * since we need the interval to keep running while on STS UI.
                         */
                        href = contentWindow ? contentWindow.location.href : Constants.EMPTY_STRING;
                    }
                    catch (e) { }
                    if (StringUtils.isEmpty(href)) {
                        return;
                    }
                    var contentHash = contentWindow ? contentWindow.location.hash : Constants.EMPTY_STRING;
                    if (UrlString.hashContainsKnownProperties(contentHash)) {
                        // Success case
                        _this.removeHiddenIframe(iframe);
                        clearInterval(intervalId);
                        resolve(contentHash);
                        return;
                    }
                }, BrowserConstants.POLL_INTERVAL_MS);
            });
        };
        /**
         * @hidden
         * Loads iframe with authorization endpoint URL
         * @ignore
         */
        SilentHandler.prototype.loadFrame = function (urlNavigate) {
            /*
             * This trick overcomes iframe navigation in IE
             * IE does not load the page consistently in iframe
             */
            var _this = this;
            return new Promise(function (resolve, reject) {
                var frameHandle = _this.createHiddenIframe();
                setTimeout(function () {
                    if (!frameHandle) {
                        reject("Unable to load iframe");
                        return;
                    }
                    frameHandle.src = urlNavigate;
                    resolve(frameHandle);
                }, _this.navigateFrameWait);
            });
        };
        /**
         * @hidden
         * Loads the iframe synchronously when the navigateTimeFrame is set to `0`
         * @param urlNavigate
         * @param frameName
         * @param logger
         */
        SilentHandler.prototype.loadFrameSync = function (urlNavigate) {
            var frameHandle = this.createHiddenIframe();
            frameHandle.src = urlNavigate;
            return frameHandle;
        };
        /**
         * @hidden
         * Creates a new hidden iframe or gets an existing one for silent token renewal.
         * @ignore
         */
        SilentHandler.prototype.createHiddenIframe = function () {
            var authFrame = document.createElement("iframe");
            authFrame.style.visibility = "hidden";
            authFrame.style.position = "absolute";
            authFrame.style.width = authFrame.style.height = "0";
            authFrame.style.border = "0";
            authFrame.setAttribute("sandbox", "allow-scripts allow-same-origin allow-forms");
            document.getElementsByTagName("body")[0].appendChild(authFrame);
            return authFrame;
        };
        /**
         * @hidden
         * Removes a hidden iframe from the page.
         * @ignore
         */
        SilentHandler.prototype.removeHiddenIframe = function (iframe) {
            if (document.body === iframe.parentNode) {
                document.body.removeChild(iframe);
            }
        };
        return SilentHandler;
    }(InteractionHandler));

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var SilentIframeClient = /** @class */ (function (_super) {
        __extends$1(SilentIframeClient, _super);
        function SilentIframeClient(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, apiId, performanceClient, nativeStorageImpl, nativeMessageHandler, correlationId) {
            var _this = _super.call(this, config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeMessageHandler, correlationId) || this;
            _this.apiId = apiId;
            _this.nativeStorage = nativeStorageImpl;
            return _this;
        }
        /**
         * Acquires a token silently by opening a hidden iframe to the /authorize endpoint with prompt=none
         * @param request
         */
        SilentIframeClient.prototype.acquireToken = function (request) {
            return __awaiter$1(this, void 0, void 0, function () {
                var acquireTokenMeasurement, silentRequest, serverTelemetryManager, authClient, e_1;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            this.logger.verbose("acquireTokenByIframe called");
                            acquireTokenMeasurement = this.performanceClient.startMeasurement(exports.PerformanceEvents.SilentIframeClientAcquireToken, request.correlationId);
                            // Check that we have some SSO data
                            if (StringUtils.isEmpty(request.loginHint) && StringUtils.isEmpty(request.sid) && (!request.account || StringUtils.isEmpty(request.account.username))) {
                                this.logger.warning("No user hint provided. The authorization server may need more information to complete this request.");
                            }
                            // Check that prompt is set to none, throw error if it is set to anything else.
                            if (request.prompt && request.prompt !== PromptValue.NONE) {
                                acquireTokenMeasurement.endMeasurement({
                                    success: false
                                });
                                throw BrowserAuthError.createSilentPromptValueError(request.prompt);
                            }
                            return [4 /*yield*/, this.initializeAuthorizationRequest(__assign$1(__assign$1({}, request), { prompt: PromptValue.NONE }), exports.InteractionType.Silent)];
                        case 1:
                            silentRequest = _a.sent();
                            this.browserStorage.updateCacheEntries(silentRequest.state, silentRequest.nonce, silentRequest.authority, silentRequest.loginHint || Constants.EMPTY_STRING, silentRequest.account || null);
                            serverTelemetryManager = this.initializeServerTelemetryManager(this.apiId);
                            _a.label = 2;
                        case 2:
                            _a.trys.push([2, 5, , 6]);
                            return [4 /*yield*/, this.createAuthCodeClient(serverTelemetryManager, silentRequest.authority, silentRequest.azureCloudOptions)];
                        case 3:
                            authClient = _a.sent();
                            this.logger.verbose("Auth code client created");
                            return [4 /*yield*/, this.silentTokenHelper(authClient, silentRequest).then(function (result) {
                                    acquireTokenMeasurement.endMeasurement({
                                        success: true,
                                        fromCache: false
                                    });
                                    return result;
                                })];
                        case 4: return [2 /*return*/, _a.sent()];
                        case 5:
                            e_1 = _a.sent();
                            if (e_1 instanceof AuthError) {
                                e_1.setCorrelationId(this.correlationId);
                            }
                            serverTelemetryManager.cacheFailedRequest(e_1);
                            this.browserStorage.cleanRequestByState(silentRequest.state);
                            acquireTokenMeasurement.endMeasurement({
                                errorCode: e_1 instanceof AuthError && e_1.errorCode || undefined,
                                subErrorCode: e_1 instanceof AuthError && e_1.subError || undefined,
                                success: false
                            });
                            throw e_1;
                        case 6: return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * Currently Unsupported
         */
        SilentIframeClient.prototype.logout = function () {
            // Synchronous so we must reject
            return Promise.reject(BrowserAuthError.createSilentLogoutUnsupportedError());
        };
        /**
         * Helper which acquires an authorization code silently using a hidden iframe from given url
         * using the scopes requested as part of the id, and exchanges the code for a set of OAuth tokens.
         * @param navigateUrl
         * @param userRequestScopes
         */
        SilentIframeClient.prototype.silentTokenHelper = function (authClient, silentRequest) {
            return __awaiter$1(this, void 0, void 0, function () {
                var authCodeRequest, navigateUrl, silentHandler, msalFrame, hash, serverParams, state, nativeInteractionClient, userRequestState;
                var _this = this;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.initializeAuthorizationCodeRequest(silentRequest)];
                        case 1:
                            authCodeRequest = _a.sent();
                            return [4 /*yield*/, authClient.getAuthCodeUrl(__assign$1(__assign$1({}, silentRequest), { nativeBroker: NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeMessageHandler, silentRequest.authenticationScheme) }))];
                        case 2:
                            navigateUrl = _a.sent();
                            silentHandler = new SilentHandler(authClient, this.browserStorage, authCodeRequest, this.logger, this.config.system.navigateFrameWait);
                            return [4 /*yield*/, silentHandler.initiateAuthRequest(navigateUrl)];
                        case 3:
                            msalFrame = _a.sent();
                            return [4 /*yield*/, silentHandler.monitorIframeForHash(msalFrame, this.config.system.iframeHashTimeout)];
                        case 4:
                            hash = _a.sent();
                            serverParams = UrlString.getDeserializedHash(hash);
                            state = this.validateAndExtractStateFromHash(serverParams, exports.InteractionType.Silent, authCodeRequest.correlationId);
                            if (serverParams.accountId) {
                                this.logger.verbose("Account id found in hash, calling WAM for token");
                                if (!this.nativeMessageHandler) {
                                    throw BrowserAuthError.createNativeConnectionNotEstablishedError();
                                }
                                nativeInteractionClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, this.apiId, this.performanceClient, this.nativeMessageHandler, serverParams.accountId, this.browserStorage, this.correlationId);
                                userRequestState = ProtocolUtils.parseRequestState(this.browserCrypto, state).userRequestState;
                                return [2 /*return*/, nativeInteractionClient.acquireToken(__assign$1(__assign$1({}, silentRequest), { state: userRequestState, prompt: PromptValue.NONE })).finally(function () {
                                        _this.browserStorage.cleanRequestByState(state);
                                    })];
                            }
                            // Handle response from hash string
                            return [2 /*return*/, silentHandler.handleCodeResponseFromHash(hash, state, authClient.authority, this.networkClient)];
                    }
                });
            });
        };
        return SilentIframeClient;
    }(StandardInteractionClient));

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var SilentRefreshClient = /** @class */ (function (_super) {
        __extends$1(SilentRefreshClient, _super);
        function SilentRefreshClient() {
            return _super !== null && _super.apply(this, arguments) || this;
        }
        /**
         * Exchanges the refresh token for new tokens
         * @param request
         */
        SilentRefreshClient.prototype.acquireToken = function (request) {
            return __awaiter$1(this, void 0, void 0, function () {
                var silentRequest, _a, acquireTokenMeasurement, serverTelemetryManager, refreshTokenClient;
                var _this = this;
                return __generator$1(this, function (_b) {
                    switch (_b.label) {
                        case 0:
                            _a = [__assign$1({}, request)];
                            return [4 /*yield*/, this.initializeBaseRequest(request)];
                        case 1:
                            silentRequest = __assign$1.apply(void 0, _a.concat([_b.sent()]));
                            acquireTokenMeasurement = this.performanceClient.startMeasurement(exports.PerformanceEvents.SilentRefreshClientAcquireToken, silentRequest.correlationId);
                            serverTelemetryManager = this.initializeServerTelemetryManager(exports.ApiId.acquireTokenSilent_silentFlow);
                            return [4 /*yield*/, this.createRefreshTokenClient(serverTelemetryManager, silentRequest.authority, silentRequest.azureCloudOptions)];
                        case 2:
                            refreshTokenClient = _b.sent();
                            this.logger.verbose("Refresh token client created");
                            // Send request to renew token. Auth module will throw errors if token cannot be renewed.
                            return [2 /*return*/, refreshTokenClient.acquireTokenByRefreshToken(silentRequest)
                                    .then(function (result) {
                                    acquireTokenMeasurement.endMeasurement({
                                        success: true,
                                        fromCache: result.fromCache
                                    });
                                    return result;
                                })
                                    .catch(function (e) {
                                    if (e instanceof AuthError) {
                                        e.setCorrelationId(_this.correlationId);
                                    }
                                    serverTelemetryManager.cacheFailedRequest(e);
                                    acquireTokenMeasurement.endMeasurement({
                                        errorCode: e.errorCode,
                                        subErrorCode: e.subError,
                                        success: false
                                    });
                                    throw e;
                                })];
                    }
                });
            });
        };
        /**
         * Currently Unsupported
         */
        SilentRefreshClient.prototype.logout = function () {
            // Synchronous so we must reject
            return Promise.reject(BrowserAuthError.createSilentLogoutUnsupportedError());
        };
        /**
         * Creates a Refresh Client with the given authority, or the default authority.
         * @param serverTelemetryManager
         * @param authorityUrl
         */
        SilentRefreshClient.prototype.createRefreshTokenClient = function (serverTelemetryManager, authorityUrl, azureCloudOptions) {
            return __awaiter$1(this, void 0, void 0, function () {
                var clientConfig;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.getClientConfiguration(serverTelemetryManager, authorityUrl, azureCloudOptions)];
                        case 1:
                            clientConfig = _a.sent();
                            return [2 /*return*/, new RefreshTokenClient(clientConfig, this.performanceClient)];
                    }
                });
            });
        };
        return SilentRefreshClient;
    }(StandardInteractionClient));

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var EventHandler = /** @class */ (function () {
        function EventHandler(logger, browserCrypto) {
            this.eventCallbacks = new Map();
            this.logger = logger;
            this.browserCrypto = browserCrypto;
            this.listeningToStorageEvents = false;
            this.handleAccountCacheChange = this.handleAccountCacheChange.bind(this);
        }
        /**
         * Adds event callbacks to array
         * @param callback
         */
        EventHandler.prototype.addEventCallback = function (callback) {
            if (typeof window !== "undefined") {
                var callbackId = this.browserCrypto.createNewGuid();
                this.eventCallbacks.set(callbackId, callback);
                this.logger.verbose("Event callback registered with id: " + callbackId);
                return callbackId;
            }
            return null;
        };
        /**
         * Removes callback with provided id from callback array
         * @param callbackId
         */
        EventHandler.prototype.removeEventCallback = function (callbackId) {
            this.eventCallbacks.delete(callbackId);
            this.logger.verbose("Event callback " + callbackId + " removed.");
        };
        /**
         * Adds event listener that emits an event when a user account is added or removed from localstorage in a different browser tab or window
         */
        EventHandler.prototype.enableAccountStorageEvents = function () {
            if (typeof window === "undefined") {
                return;
            }
            if (!this.listeningToStorageEvents) {
                this.logger.verbose("Adding account storage listener.");
                this.listeningToStorageEvents = true;
                window.addEventListener("storage", this.handleAccountCacheChange);
            }
            else {
                this.logger.verbose("Account storage listener already registered.");
            }
        };
        /**
         * Removes event listener that emits an event when a user account is added or removed from localstorage in a different browser tab or window
         */
        EventHandler.prototype.disableAccountStorageEvents = function () {
            if (typeof window === "undefined") {
                return;
            }
            if (this.listeningToStorageEvents) {
                this.logger.verbose("Removing account storage listener.");
                window.removeEventListener("storage", this.handleAccountCacheChange);
                this.listeningToStorageEvents = false;
            }
            else {
                this.logger.verbose("No account storage listener registered.");
            }
        };
        /**
         * Emits events by calling callback with event message
         * @param eventType
         * @param interactionType
         * @param payload
         * @param error
         */
        EventHandler.prototype.emitEvent = function (eventType, interactionType, payload, error) {
            var _this = this;
            if (typeof window !== "undefined") {
                var message_1 = {
                    eventType: eventType,
                    interactionType: interactionType || null,
                    payload: payload || null,
                    error: error || null,
                    timestamp: Date.now()
                };
                this.logger.info("Emitting event: " + eventType);
                this.eventCallbacks.forEach(function (callback, callbackId) {
                    _this.logger.verbose("Emitting event to callback " + callbackId + ": " + eventType);
                    callback.apply(null, [message_1]);
                });
            }
        };
        /**
         * Emit account added/removed events when cached accounts are changed in a different tab or frame
         */
        EventHandler.prototype.handleAccountCacheChange = function (e) {
            try {
                var cacheValue = e.newValue || e.oldValue;
                if (!cacheValue) {
                    return;
                }
                var parsedValue = JSON.parse(cacheValue);
                if (typeof parsedValue !== "object" || !AccountEntity.isAccountEntity(parsedValue)) {
                    return;
                }
                var accountEntity = CacheManager.toObject(new AccountEntity(), parsedValue);
                var accountInfo = accountEntity.getAccountInfo();
                if (!e.oldValue && e.newValue) {
                    this.logger.info("Account was added to cache in a different window");
                    this.emitEvent(exports.EventType.ACCOUNT_ADDED, undefined, accountInfo);
                }
                else if (!e.newValue && e.oldValue) {
                    this.logger.info("Account was removed from cache in a different window");
                    this.emitEvent(exports.EventType.ACCOUNT_REMOVED, undefined, accountInfo);
                }
            }
            catch (e) {
                return;
            }
        };
        return EventHandler;
    }());

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */

    var internals = /*#__PURE__*/Object.freeze({
        __proto__: null,
        BrowserCacheManager: BrowserCacheManager,
        StandardInteractionClient: StandardInteractionClient,
        RedirectClient: RedirectClient,
        PopupClient: PopupClient,
        SilentIframeClient: SilentIframeClient,
        SilentCacheClient: SilentCacheClient,
        SilentRefreshClient: SilentRefreshClient,
        RedirectHandler: RedirectHandler,
        EventHandler: EventHandler,
        NativeMessageHandler: NativeMessageHandler,
        BrowserConstants: BrowserConstants,
        get TemporaryCacheKeys () { return TemporaryCacheKeys; }
    });

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * Utility class for math specific functions in browser.
     */
    var MathUtils = /** @class */ (function () {
        function MathUtils() {
        }
        /**
         * Decimal to Hex
         *
         * @param num
         */
        MathUtils.decimalToHex = function (num) {
            var hex = num.toString(16);
            while (hex.length < 2) {
                hex = "0" + hex;
            }
            return hex;
        };
        return MathUtils;
    }());

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var GuidGenerator = /** @class */ (function () {
        function GuidGenerator(cryptoObj) {
            this.cryptoObj = cryptoObj;
        }
        /*
         * RFC4122: The version 4 UUID is meant for generating UUIDs from truly-random or
         * pseudo-random numbers.
         * The algorithm is as follows:
         *     Set the two most significant bits (bits 6 and 7) of the
         *        clock_seq_hi_and_reserved to zero and one, respectively.
         *     Set the four most significant bits (bits 12 through 15) of the
         *        time_hi_and_version field to the 4-bit version number from
         *        Section 4.1.3. Version4
         *     Set all the other bits to randomly (or pseudo-randomly) chosen
         *     values.
         * UUID                   = time-low "-" time-mid "-"time-high-and-version "-"clock-seq-reserved and low(2hexOctet)"-" node
         * time-low               = 4hexOctet
         * time-mid               = 2hexOctet
         * time-high-and-version  = 2hexOctet
         * clock-seq-and-reserved = hexOctet:
         * clock-seq-low          = hexOctet
         * node                   = 6hexOctet
         * Format: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
         * y could be 1000, 1001, 1010, 1011 since most significant two bits needs to be 10
         * y values are 8, 9, A, B
         */
        GuidGenerator.prototype.generateGuid = function () {
            try {
                var buffer = new Uint8Array(16);
                this.cryptoObj.getRandomValues(buffer);
                // buffer[6] and buffer[7] represents the time_hi_and_version field. We will set the four most significant bits (4 through 7) of buffer[6] to represent decimal number 4 (UUID version number).
                buffer[6] |= 0x40; // buffer[6] | 01000000 will set the 6 bit to 1.
                buffer[6] &= 0x4f; // buffer[6] & 01001111 will set the 4, 5, and 7 bit to 0 such that bits 4-7 == 0100 = "4".
                // buffer[8] represents the clock_seq_hi_and_reserved field. We will set the two most significant bits (6 and 7) of the clock_seq_hi_and_reserved to zero and one, respectively.
                buffer[8] |= 0x80; // buffer[8] | 10000000 will set the 7 bit to 1.
                buffer[8] &= 0xbf; // buffer[8] & 10111111 will set the 6 bit to 0.
                return MathUtils.decimalToHex(buffer[0]) + MathUtils.decimalToHex(buffer[1])
                    + MathUtils.decimalToHex(buffer[2]) + MathUtils.decimalToHex(buffer[3])
                    + "-" + MathUtils.decimalToHex(buffer[4]) + MathUtils.decimalToHex(buffer[5])
                    + "-" + MathUtils.decimalToHex(buffer[6]) + MathUtils.decimalToHex(buffer[7])
                    + "-" + MathUtils.decimalToHex(buffer[8]) + MathUtils.decimalToHex(buffer[9])
                    + "-" + MathUtils.decimalToHex(buffer[10]) + MathUtils.decimalToHex(buffer[11])
                    + MathUtils.decimalToHex(buffer[12]) + MathUtils.decimalToHex(buffer[13])
                    + MathUtils.decimalToHex(buffer[14]) + MathUtils.decimalToHex(buffer[15]);
            }
            catch (err) {
                var guidHolder = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx";
                var hex = "0123456789abcdef";
                var r = 0;
                var guidResponse = Constants.EMPTY_STRING;
                for (var i = 0; i < 36; i++) {
                    if (guidHolder[i] !== "-" && guidHolder[i] !== "4") {
                        // each x and y needs to be random
                        r = Math.random() * 16 | 0;
                    }
                    if (guidHolder[i] === "x") {
                        guidResponse += hex[r];
                    }
                    else if (guidHolder[i] === "y") {
                        // clock-seq-and-reserved first hex is filtered and remaining hex values are random
                        r &= 0x3; // bit and with 0011 to set pos 2 to zero ?0??
                        r |= 0x8; // set pos 3 to 1 as 1???
                        guidResponse += hex[r];
                    }
                    else {
                        guidResponse += guidHolder[i];
                    }
                }
                return guidResponse;
            }
        };
        /**
         * verifies if a string is  GUID
         * @param guid
         */
        GuidGenerator.prototype.isGuid = function (guid) {
            var regexGuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
            return regexGuid.test(guid);
        };
        return GuidGenerator;
    }());

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * Utility functions for strings in a browser. See here for implementation details:
     * https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#Solution_2_%E2%80%93_JavaScript's_UTF-16_%3E_UTF-8_%3E_base64
     */
    var BrowserStringUtils = /** @class */ (function () {
        function BrowserStringUtils() {
        }
        /**
         * Converts string to Uint8Array
         * @param sDOMStr
         */
        BrowserStringUtils.stringToUtf8Arr = function (sDOMStr) {
            var nChr;
            var nArrLen = 0;
            var nStrLen = sDOMStr.length;
            /* mapping... */
            for (var nMapIdx = 0; nMapIdx < nStrLen; nMapIdx++) {
                nChr = sDOMStr.charCodeAt(nMapIdx);
                nArrLen += nChr < 0x80 ? 1 : nChr < 0x800 ? 2 : nChr < 0x10000 ? 3 : nChr < 0x200000 ? 4 : nChr < 0x4000000 ? 5 : 6;
            }
            var aBytes = new Uint8Array(nArrLen);
            /* transcription... */
            for (var nIdx = 0, nChrIdx = 0; nIdx < nArrLen; nChrIdx++) {
                nChr = sDOMStr.charCodeAt(nChrIdx);
                if (nChr < 128) {
                    /* one byte */
                    aBytes[nIdx++] = nChr;
                }
                else if (nChr < 0x800) {
                    /* two bytes */
                    aBytes[nIdx++] = 192 + (nChr >>> 6);
                    aBytes[nIdx++] = 128 + (nChr & 63);
                }
                else if (nChr < 0x10000) {
                    /* three bytes */
                    aBytes[nIdx++] = 224 + (nChr >>> 12);
                    aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);
                    aBytes[nIdx++] = 128 + (nChr & 63);
                }
                else if (nChr < 0x200000) {
                    /* four bytes */
                    aBytes[nIdx++] = 240 + (nChr >>> 18);
                    aBytes[nIdx++] = 128 + (nChr >>> 12 & 63);
                    aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);
                    aBytes[nIdx++] = 128 + (nChr & 63);
                }
                else if (nChr < 0x4000000) {
                    /* five bytes */
                    aBytes[nIdx++] = 248 + (nChr >>> 24);
                    aBytes[nIdx++] = 128 + (nChr >>> 18 & 63);
                    aBytes[nIdx++] = 128 + (nChr >>> 12 & 63);
                    aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);
                    aBytes[nIdx++] = 128 + (nChr & 63);
                }
                else /* if (nChr <= 0x7fffffff) */ {
                    /* six bytes */
                    aBytes[nIdx++] = 252 + (nChr >>> 30);
                    aBytes[nIdx++] = 128 + (nChr >>> 24 & 63);
                    aBytes[nIdx++] = 128 + (nChr >>> 18 & 63);
                    aBytes[nIdx++] = 128 + (nChr >>> 12 & 63);
                    aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);
                    aBytes[nIdx++] = 128 + (nChr & 63);
                }
            }
            return aBytes;
        };
        /**
         * Converst string to ArrayBuffer
         * @param dataString
         */
        BrowserStringUtils.stringToArrayBuffer = function (dataString) {
            var data = new ArrayBuffer(dataString.length);
            var dataView = new Uint8Array(data);
            for (var i = 0; i < dataString.length; i++) {
                dataView[i] = dataString.charCodeAt(i);
            }
            return data;
        };
        /**
         * Converts Uint8Array to a string
         * @param aBytes
         */
        BrowserStringUtils.utf8ArrToString = function (aBytes) {
            var sView = Constants.EMPTY_STRING;
            for (var nPart = void 0, nLen = aBytes.length, nIdx = 0; nIdx < nLen; nIdx++) {
                nPart = aBytes[nIdx];
                sView += String.fromCharCode(nPart > 251 && nPart < 254 && nIdx + 5 < nLen ? /* six bytes */
                    /* (nPart - 252 << 30) may be not so safe in ECMAScript! So...: */
                    (nPart - 252) * 1073741824 + (aBytes[++nIdx] - 128 << 24) + (aBytes[++nIdx] - 128 << 18) + (aBytes[++nIdx] - 128 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
                    : nPart > 247 && nPart < 252 && nIdx + 4 < nLen ? /* five bytes */
                        (nPart - 248 << 24) + (aBytes[++nIdx] - 128 << 18) + (aBytes[++nIdx] - 128 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
                        : nPart > 239 && nPart < 248 && nIdx + 3 < nLen ? /* four bytes */
                            (nPart - 240 << 18) + (aBytes[++nIdx] - 128 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
                            : nPart > 223 && nPart < 240 && nIdx + 2 < nLen ? /* three bytes */
                                (nPart - 224 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
                                : nPart > 191 && nPart < 224 && nIdx + 1 < nLen ? /* two bytes */
                                    (nPart - 192 << 6) + aBytes[++nIdx] - 128
                                    : /* nPart < 127 ? */ /* one byte */
                                        nPart);
            }
            return sView;
        };
        return BrowserStringUtils;
    }());

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * Class which exposes APIs to encode plaintext to base64 encoded string. See here for implementation details:
     * https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#Solution_2_%E2%80%93_JavaScript's_UTF-16_%3E_UTF-8_%3E_base64
     */
    var Base64Encode = /** @class */ (function () {
        function Base64Encode() {
        }
        /**
         * Returns URL Safe b64 encoded string from a plaintext string.
         * @param input
         */
        Base64Encode.prototype.urlEncode = function (input) {
            return encodeURIComponent(this.encode(input)
                .replace(/=/g, Constants.EMPTY_STRING)
                .replace(/\+/g, "-")
                .replace(/\//g, "_"));
        };
        /**
         * Returns URL Safe b64 encoded string from an int8Array.
         * @param inputArr
         */
        Base64Encode.prototype.urlEncodeArr = function (inputArr) {
            return this.base64EncArr(inputArr)
                .replace(/=/g, Constants.EMPTY_STRING)
                .replace(/\+/g, "-")
                .replace(/\//g, "_");
        };
        /**
         * Returns b64 encoded string from plaintext string.
         * @param input
         */
        Base64Encode.prototype.encode = function (input) {
            var inputUtf8Arr = BrowserStringUtils.stringToUtf8Arr(input);
            return this.base64EncArr(inputUtf8Arr);
        };
        /**
         * Base64 encode byte array
         * @param aBytes
         */
        Base64Encode.prototype.base64EncArr = function (aBytes) {
            var eqLen = (3 - (aBytes.length % 3)) % 3;
            var sB64Enc = Constants.EMPTY_STRING;
            for (var nMod3 = void 0, nLen = aBytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; nIdx++) {
                nMod3 = nIdx % 3;
                /* Uncomment the following line in order to split the output in lines 76-character long: */
                /*
                 *if (nIdx > 0 && (nIdx * 4 / 3) % 76 === 0) { sB64Enc += "\r\n"; }
                 */
                nUint24 |= aBytes[nIdx] << (16 >>> nMod3 & 24);
                if (nMod3 === 2 || aBytes.length - nIdx === 1) {
                    sB64Enc += String.fromCharCode(this.uint6ToB64(nUint24 >>> 18 & 63), this.uint6ToB64(nUint24 >>> 12 & 63), this.uint6ToB64(nUint24 >>> 6 & 63), this.uint6ToB64(nUint24 & 63));
                    nUint24 = 0;
                }
            }
            return eqLen === 0 ? sB64Enc : sB64Enc.substring(0, sB64Enc.length - eqLen) + (eqLen === 1 ? "=" : "==");
        };
        /**
         * Base64 string to array encoding helper
         * @param nUint6
         */
        Base64Encode.prototype.uint6ToB64 = function (nUint6) {
            return nUint6 < 26 ?
                nUint6 + 65
                : nUint6 < 52 ?
                    nUint6 + 71
                    : nUint6 < 62 ?
                        nUint6 - 4
                        : nUint6 === 62 ?
                            43
                            : nUint6 === 63 ?
                                47
                                :
                                    65;
        };
        return Base64Encode;
    }());

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * Class which exposes APIs to decode base64 strings to plaintext. See here for implementation details:
     * https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#Solution_2_%E2%80%93_JavaScript's_UTF-16_%3E_UTF-8_%3E_base64
     */
    var Base64Decode = /** @class */ (function () {
        function Base64Decode() {
        }
        /**
         * Returns a URL-safe plaintext decoded string from b64 encoded input.
         * @param input
         */
        Base64Decode.prototype.decode = function (input) {
            var encodedString = input.replace(/-/g, "+").replace(/_/g, "/");
            switch (encodedString.length % 4) {
                case 0:
                    break;
                case 2:
                    encodedString += "==";
                    break;
                case 3:
                    encodedString += "=";
                    break;
                default:
                    throw new Error("Invalid base64 string");
            }
            var inputUtf8Arr = this.base64DecToArr(encodedString);
            return BrowserStringUtils.utf8ArrToString(inputUtf8Arr);
        };
        /**
         * Decodes base64 into Uint8Array
         * @param base64String
         * @param nBlockSize
         */
        Base64Decode.prototype.base64DecToArr = function (base64String, nBlockSize) {
            var sB64Enc = base64String.replace(/[^A-Za-z0-9\+\/]/g, Constants.EMPTY_STRING);
            var nInLen = sB64Enc.length;
            var nOutLen = nBlockSize ? Math.ceil((nInLen * 3 + 1 >>> 2) / nBlockSize) * nBlockSize : nInLen * 3 + 1 >>> 2;
            var aBytes = new Uint8Array(nOutLen);
            for (var nMod3 = void 0, nMod4 = void 0, nUint24 = 0, nOutIdx = 0, nInIdx = 0; nInIdx < nInLen; nInIdx++) {
                nMod4 = nInIdx & 3;
                nUint24 |= this.b64ToUint6(sB64Enc.charCodeAt(nInIdx)) << 18 - 6 * nMod4;
                if (nMod4 === 3 || nInLen - nInIdx === 1) {
                    for (nMod3 = 0; nMod3 < 3 && nOutIdx < nOutLen; nMod3++, nOutIdx++) {
                        aBytes[nOutIdx] = nUint24 >>> (16 >>> nMod3 & 24) & 255;
                    }
                    nUint24 = 0;
                }
            }
            return aBytes;
        };
        /**
         * Base64 string to array decoding helper
         * @param charNum
         */
        Base64Decode.prototype.b64ToUint6 = function (charNum) {
            return charNum > 64 && charNum < 91 ?
                charNum - 65
                : charNum > 96 && charNum < 123 ?
                    charNum - 71
                    : charNum > 47 && charNum < 58 ?
                        charNum + 4
                        : charNum === 43 ?
                            62
                            : charNum === 47 ?
                                63
                                :
                                    0;
        };
        return Base64Decode;
    }());

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    // Constant byte array length
    var RANDOM_BYTE_ARR_LENGTH = 32;
    /**
     * Class which exposes APIs to generate PKCE codes and code verifiers.
     */
    var PkceGenerator = /** @class */ (function () {
        function PkceGenerator(cryptoObj) {
            this.base64Encode = new Base64Encode();
            this.cryptoObj = cryptoObj;
        }
        /**
         * Generates PKCE Codes. See the RFC for more information: https://tools.ietf.org/html/rfc7636
         */
        PkceGenerator.prototype.generateCodes = function () {
            return __awaiter$1(this, void 0, void 0, function () {
                var codeVerifier, codeChallenge;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            codeVerifier = this.generateCodeVerifier();
                            return [4 /*yield*/, this.generateCodeChallengeFromVerifier(codeVerifier)];
                        case 1:
                            codeChallenge = _a.sent();
                            return [2 /*return*/, {
                                    verifier: codeVerifier,
                                    challenge: codeChallenge
                                }];
                    }
                });
            });
        };
        /**
         * Generates a random 32 byte buffer and returns the base64
         * encoded string to be used as a PKCE Code Verifier
         */
        PkceGenerator.prototype.generateCodeVerifier = function () {
            try {
                // Generate random values as utf-8
                var buffer = new Uint8Array(RANDOM_BYTE_ARR_LENGTH);
                this.cryptoObj.getRandomValues(buffer);
                // encode verifier as base64
                var pkceCodeVerifierB64 = this.base64Encode.urlEncodeArr(buffer);
                return pkceCodeVerifierB64;
            }
            catch (e) {
                throw BrowserAuthError.createPkceNotGeneratedError(e);
            }
        };
        /**
         * Creates a base64 encoded PKCE Code Challenge string from the
         * hash created from the PKCE Code Verifier supplied
         */
        PkceGenerator.prototype.generateCodeChallengeFromVerifier = function (pkceCodeVerifier) {
            return __awaiter$1(this, void 0, void 0, function () {
                var pkceHashedCodeVerifier, e_1;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            _a.trys.push([0, 2, , 3]);
                            return [4 /*yield*/, this.cryptoObj.sha256Digest(pkceCodeVerifier)];
                        case 1:
                            pkceHashedCodeVerifier = _a.sent();
                            // encode hash as base64
                            return [2 /*return*/, this.base64Encode.urlEncodeArr(new Uint8Array(pkceHashedCodeVerifier))];
                        case 2:
                            e_1 = _a.sent();
                            throw BrowserAuthError.createPkceNotGeneratedError(e_1);
                        case 3: return [2 /*return*/];
                    }
                });
            });
        };
        return PkceGenerator;
    }());

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * See here for more info on RsaHashedKeyGenParams: https://developer.mozilla.org/en-US/docs/Web/API/RsaHashedKeyGenParams
     */
    // RSA KeyGen Algorithm
    var PKCS1_V15_KEYGEN_ALG = "RSASSA-PKCS1-v1_5";
    // SHA-256 hashing algorithm
    var S256_HASH_ALG = "SHA-256";
    // MOD length for PoP tokens
    var MODULUS_LENGTH = 2048;
    // Public Exponent
    var PUBLIC_EXPONENT = new Uint8Array([0x01, 0x00, 0x01]);
    /**
     * This class implements functions used by the browser library to perform cryptography operations such as
     * hashing and encoding. It also has helper functions to validate the availability of specific APIs.
     */
    var BrowserCrypto = /** @class */ (function () {
        function BrowserCrypto(logger) {
            this.logger = logger;
            if (!(this.hasCryptoAPI())) {
                throw BrowserAuthError.createCryptoNotAvailableError("Browser crypto or msCrypto object not available.");
            }
            this._keygenAlgorithmOptions = {
                name: PKCS1_V15_KEYGEN_ALG,
                hash: S256_HASH_ALG,
                modulusLength: MODULUS_LENGTH,
                publicExponent: PUBLIC_EXPONENT
            };
        }
        /**
         * Returns a sha-256 hash of the given dataString as an ArrayBuffer.
         * @param dataString
         */
        BrowserCrypto.prototype.sha256Digest = function (dataString) {
            return __awaiter$1(this, void 0, void 0, function () {
                var data;
                return __generator$1(this, function (_a) {
                    data = BrowserStringUtils.stringToUtf8Arr(dataString);
                    return [2 /*return*/, this.hasIECrypto() ? this.getMSCryptoDigest(S256_HASH_ALG, data) : this.getSubtleCryptoDigest(S256_HASH_ALG, data)];
                });
            });
        };
        /**
         * Populates buffer with cryptographically random values.
         * @param dataBuffer
         */
        BrowserCrypto.prototype.getRandomValues = function (dataBuffer) {
            var cryptoObj = window["msCrypto"] || window.crypto;
            if (!cryptoObj.getRandomValues) {
                throw BrowserAuthError.createCryptoNotAvailableError("getRandomValues does not exist.");
            }
            cryptoObj.getRandomValues(dataBuffer);
        };
        /**
         * Generates a keypair based on current keygen algorithm config.
         * @param extractable
         * @param usages
         */
        BrowserCrypto.prototype.generateKeyPair = function (extractable, usages) {
            return __awaiter$1(this, void 0, void 0, function () {
                return __generator$1(this, function (_a) {
                    return [2 /*return*/, (this.hasIECrypto() ?
                            this.msCryptoGenerateKey(extractable, usages)
                            : window.crypto.subtle.generateKey(this._keygenAlgorithmOptions, extractable, usages))];
                });
            });
        };
        /**
         * Export key as Json Web Key (JWK)
         * @param key
         * @param format
         */
        BrowserCrypto.prototype.exportJwk = function (key) {
            return __awaiter$1(this, void 0, void 0, function () {
                return __generator$1(this, function (_a) {
                    return [2 /*return*/, this.hasIECrypto() ? this.msCryptoExportJwk(key) : window.crypto.subtle.exportKey(KEY_FORMAT_JWK, key)];
                });
            });
        };
        /**
         * Imports key as Json Web Key (JWK), can set extractable and usages.
         * @param key
         * @param format
         * @param extractable
         * @param usages
         */
        BrowserCrypto.prototype.importJwk = function (key, extractable, usages) {
            return __awaiter$1(this, void 0, void 0, function () {
                var keyString, keyBuffer;
                return __generator$1(this, function (_a) {
                    keyString = BrowserCrypto.getJwkString(key);
                    keyBuffer = BrowserStringUtils.stringToArrayBuffer(keyString);
                    return [2 /*return*/, this.hasIECrypto() ?
                            this.msCryptoImportKey(keyBuffer, extractable, usages)
                            : window.crypto.subtle.importKey(KEY_FORMAT_JWK, key, this._keygenAlgorithmOptions, extractable, usages)];
                });
            });
        };
        /**
         * Signs given data with given key
         * @param key
         * @param data
         */
        BrowserCrypto.prototype.sign = function (key, data) {
            return __awaiter$1(this, void 0, void 0, function () {
                return __generator$1(this, function (_a) {
                    return [2 /*return*/, this.hasIECrypto() ?
                            this.msCryptoSign(key, data)
                            : window.crypto.subtle.sign(this._keygenAlgorithmOptions, key, data)];
                });
            });
        };
        /**
         * Check whether IE crypto or other browser cryptography is available.
         */
        BrowserCrypto.prototype.hasCryptoAPI = function () {
            return this.hasIECrypto() || this.hasBrowserCrypto();
        };
        /**
         * Checks whether IE crypto (AKA msCrypto) is available.
         */
        BrowserCrypto.prototype.hasIECrypto = function () {
            return "msCrypto" in window;
        };
        /**
         * Check whether browser crypto is available.
         */
        BrowserCrypto.prototype.hasBrowserCrypto = function () {
            return "crypto" in window;
        };
        /**
         * Helper function for SHA digest.
         * @param algorithm
         * @param data
         */
        BrowserCrypto.prototype.getSubtleCryptoDigest = function (algorithm, data) {
            return __awaiter$1(this, void 0, void 0, function () {
                return __generator$1(this, function (_a) {
                    return [2 /*return*/, window.crypto.subtle.digest(algorithm, data)];
                });
            });
        };
        /**
         * IE Helper function for SHA digest.
         * @param algorithm
         * @param data
         */
        BrowserCrypto.prototype.getMSCryptoDigest = function (algorithm, data) {
            return __awaiter$1(this, void 0, void 0, function () {
                return __generator$1(this, function (_a) {
                    return [2 /*return*/, new Promise(function (resolve, reject) {
                            var digestOperation = window["msCrypto"].subtle.digest(algorithm, data.buffer);
                            digestOperation.addEventListener("complete", function (e) {
                                resolve(e.target.result);
                            });
                            digestOperation.addEventListener("error", function (error) {
                                reject(error);
                            });
                        })];
                });
            });
        };
        /**
         * IE Helper function for generating a keypair
         * @param extractable
         * @param usages
         */
        BrowserCrypto.prototype.msCryptoGenerateKey = function (extractable, usages) {
            return __awaiter$1(this, void 0, void 0, function () {
                var _this = this;
                return __generator$1(this, function (_a) {
                    return [2 /*return*/, new Promise(function (resolve, reject) {
                            var msGenerateKey = window["msCrypto"].subtle.generateKey(_this._keygenAlgorithmOptions, extractable, usages);
                            msGenerateKey.addEventListener("complete", function (e) {
                                resolve(e.target.result);
                            });
                            msGenerateKey.addEventListener("error", function (error) {
                                reject(error);
                            });
                        })];
                });
            });
        };
        /**
         * IE Helper function for exportKey
         * @param key
         * @param format
         */
        BrowserCrypto.prototype.msCryptoExportJwk = function (key) {
            return __awaiter$1(this, void 0, void 0, function () {
                return __generator$1(this, function (_a) {
                    return [2 /*return*/, new Promise(function (resolve, reject) {
                            var msExportKey = window["msCrypto"].subtle.exportKey(KEY_FORMAT_JWK, key);
                            msExportKey.addEventListener("complete", function (e) {
                                var resultBuffer = e.target.result;
                                var resultString = BrowserStringUtils.utf8ArrToString(new Uint8Array(resultBuffer))
                                    .replace(/\r/g, Constants.EMPTY_STRING)
                                    .replace(/\n/g, Constants.EMPTY_STRING)
                                    .replace(/\t/g, Constants.EMPTY_STRING)
                                    .split(" ").join(Constants.EMPTY_STRING)
                                    .replace("\u0000", Constants.EMPTY_STRING);
                                try {
                                    resolve(JSON.parse(resultString));
                                }
                                catch (e) {
                                    reject(e);
                                }
                            });
                            msExportKey.addEventListener("error", function (error) {
                                reject(error);
                            });
                        })];
                });
            });
        };
        /**
         * IE Helper function for importKey
         * @param key
         * @param format
         * @param extractable
         * @param usages
         */
        BrowserCrypto.prototype.msCryptoImportKey = function (keyBuffer, extractable, usages) {
            return __awaiter$1(this, void 0, void 0, function () {
                var _this = this;
                return __generator$1(this, function (_a) {
                    return [2 /*return*/, new Promise(function (resolve, reject) {
                            var msImportKey = window["msCrypto"].subtle.importKey(KEY_FORMAT_JWK, keyBuffer, _this._keygenAlgorithmOptions, extractable, usages);
                            msImportKey.addEventListener("complete", function (e) {
                                resolve(e.target.result);
                            });
                            msImportKey.addEventListener("error", function (error) {
                                reject(error);
                            });
                        })];
                });
            });
        };
        /**
         * IE Helper function for sign JWT
         * @param key
         * @param data
         */
        BrowserCrypto.prototype.msCryptoSign = function (key, data) {
            return __awaiter$1(this, void 0, void 0, function () {
                var _this = this;
                return __generator$1(this, function (_a) {
                    return [2 /*return*/, new Promise(function (resolve, reject) {
                            var msSign = window["msCrypto"].subtle.sign(_this._keygenAlgorithmOptions, key, data);
                            msSign.addEventListener("complete", function (e) {
                                resolve(e.target.result);
                            });
                            msSign.addEventListener("error", function (error) {
                                reject(error);
                            });
                        })];
                });
            });
        };
        /**
         * Returns stringified jwk.
         * @param jwk
         */
        BrowserCrypto.getJwkString = function (jwk) {
            return JSON.stringify(jwk, Object.keys(jwk).sort());
        };
        return BrowserCrypto;
    }());

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * Storage wrapper for IndexedDB storage in browsers: https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API
     */
    var DatabaseStorage = /** @class */ (function () {
        function DatabaseStorage() {
            this.dbName = DB_NAME;
            this.version = DB_VERSION;
            this.tableName = DB_TABLE_NAME;
            this.dbOpen = false;
        }
        /**
         * Opens IndexedDB instance.
         */
        DatabaseStorage.prototype.open = function () {
            return __awaiter$1(this, void 0, void 0, function () {
                var _this = this;
                return __generator$1(this, function (_a) {
                    return [2 /*return*/, new Promise(function (resolve, reject) {
                            var openDB = window.indexedDB.open(_this.dbName, _this.version);
                            openDB.addEventListener("upgradeneeded", function (e) {
                                var event = e;
                                event.target.result.createObjectStore(_this.tableName);
                            });
                            openDB.addEventListener("success", function (e) {
                                var event = e;
                                _this.db = event.target.result;
                                _this.dbOpen = true;
                                resolve();
                            });
                            openDB.addEventListener("error", function () { return reject(BrowserAuthError.createDatabaseUnavailableError()); });
                        })];
                });
            });
        };
        /**
         * Closes the connection to IndexedDB database when all pending transactions
         * complete.
         */
        DatabaseStorage.prototype.closeConnection = function () {
            var db = this.db;
            if (db && this.dbOpen) {
                db.close();
                this.dbOpen = false;
            }
        };
        /**
         * Opens database if it's not already open
         */
        DatabaseStorage.prototype.validateDbIsOpen = function () {
            return __awaiter$1(this, void 0, void 0, function () {
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            if (!!this.dbOpen) return [3 /*break*/, 2];
                            return [4 /*yield*/, this.open()];
                        case 1: return [2 /*return*/, _a.sent()];
                        case 2: return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * Retrieves item from IndexedDB instance.
         * @param key
         */
        DatabaseStorage.prototype.getItem = function (key) {
            return __awaiter$1(this, void 0, void 0, function () {
                var _this = this;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.validateDbIsOpen()];
                        case 1:
                            _a.sent();
                            return [2 /*return*/, new Promise(function (resolve, reject) {
                                    // TODO: Add timeouts?
                                    if (!_this.db) {
                                        return reject(BrowserAuthError.createDatabaseNotOpenError());
                                    }
                                    var transaction = _this.db.transaction([_this.tableName], "readonly");
                                    var objectStore = transaction.objectStore(_this.tableName);
                                    var dbGet = objectStore.get(key);
                                    dbGet.addEventListener("success", function (e) {
                                        var event = e;
                                        _this.closeConnection();
                                        resolve(event.target.result);
                                    });
                                    dbGet.addEventListener("error", function (e) {
                                        _this.closeConnection();
                                        reject(e);
                                    });
                                })];
                    }
                });
            });
        };
        /**
         * Adds item to IndexedDB under given key
         * @param key
         * @param payload
         */
        DatabaseStorage.prototype.setItem = function (key, payload) {
            return __awaiter$1(this, void 0, void 0, function () {
                var _this = this;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.validateDbIsOpen()];
                        case 1:
                            _a.sent();
                            return [2 /*return*/, new Promise(function (resolve, reject) {
                                    // TODO: Add timeouts?
                                    if (!_this.db) {
                                        return reject(BrowserAuthError.createDatabaseNotOpenError());
                                    }
                                    var transaction = _this.db.transaction([_this.tableName], "readwrite");
                                    var objectStore = transaction.objectStore(_this.tableName);
                                    var dbPut = objectStore.put(payload, key);
                                    dbPut.addEventListener("success", function () {
                                        _this.closeConnection();
                                        resolve();
                                    });
                                    dbPut.addEventListener("error", function (e) {
                                        _this.closeConnection();
                                        reject(e);
                                    });
                                })];
                    }
                });
            });
        };
        /**
         * Removes item from IndexedDB under given key
         * @param key
         */
        DatabaseStorage.prototype.removeItem = function (key) {
            return __awaiter$1(this, void 0, void 0, function () {
                var _this = this;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.validateDbIsOpen()];
                        case 1:
                            _a.sent();
                            return [2 /*return*/, new Promise(function (resolve, reject) {
                                    if (!_this.db) {
                                        return reject(BrowserAuthError.createDatabaseNotOpenError());
                                    }
                                    var transaction = _this.db.transaction([_this.tableName], "readwrite");
                                    var objectStore = transaction.objectStore(_this.tableName);
                                    var dbDelete = objectStore.delete(key);
                                    dbDelete.addEventListener("success", function () {
                                        _this.closeConnection();
                                        resolve();
                                    });
                                    dbDelete.addEventListener("error", function (e) {
                                        _this.closeConnection();
                                        reject(e);
                                    });
                                })];
                    }
                });
            });
        };
        /**
         * Get all the keys from the storage object as an iterable array of strings.
         */
        DatabaseStorage.prototype.getKeys = function () {
            return __awaiter$1(this, void 0, void 0, function () {
                var _this = this;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.validateDbIsOpen()];
                        case 1:
                            _a.sent();
                            return [2 /*return*/, new Promise(function (resolve, reject) {
                                    if (!_this.db) {
                                        return reject(BrowserAuthError.createDatabaseNotOpenError());
                                    }
                                    var transaction = _this.db.transaction([_this.tableName], "readonly");
                                    var objectStore = transaction.objectStore(_this.tableName);
                                    var dbGetKeys = objectStore.getAllKeys();
                                    dbGetKeys.addEventListener("success", function (e) {
                                        var event = e;
                                        _this.closeConnection();
                                        resolve(event.target.result);
                                    });
                                    dbGetKeys.addEventListener("error", function (e) {
                                        _this.closeConnection();
                                        reject(e);
                                    });
                                })];
                    }
                });
            });
        };
        /**
         *
         * Checks whether there is an object under the search key in the object store
         */
        DatabaseStorage.prototype.containsKey = function (key) {
            return __awaiter$1(this, void 0, void 0, function () {
                var _this = this;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.validateDbIsOpen()];
                        case 1:
                            _a.sent();
                            return [2 /*return*/, new Promise(function (resolve, reject) {
                                    if (!_this.db) {
                                        return reject(BrowserAuthError.createDatabaseNotOpenError());
                                    }
                                    var transaction = _this.db.transaction([_this.tableName], "readonly");
                                    var objectStore = transaction.objectStore(_this.tableName);
                                    var dbContainsKey = objectStore.count(key);
                                    dbContainsKey.addEventListener("success", function (e) {
                                        var event = e;
                                        _this.closeConnection();
                                        resolve(event.target.result === 1);
                                    });
                                    dbContainsKey.addEventListener("error", function (e) {
                                        _this.closeConnection();
                                        reject(e);
                                    });
                                })];
                    }
                });
            });
        };
        /**
         * Deletes the MSAL database. The database is deleted rather than cleared to make it possible
         * for client applications to downgrade to a previous MSAL version without worrying about forward compatibility issues
         * with IndexedDB database versions.
         */
        DatabaseStorage.prototype.deleteDatabase = function () {
            return __awaiter$1(this, void 0, void 0, function () {
                var existingDatabases, database;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            // Check if database being deleted exists
                            if (this.db && this.dbOpen) {
                                this.closeConnection();
                            }
                            return [4 /*yield*/, window.indexedDB.databases()];
                        case 1:
                            existingDatabases = _a.sent();
                            database = existingDatabases.find(function (database) { return database.name === DB_NAME; });
                            // If database exists, delete it
                            if (database) {
                                return [2 /*return*/, new Promise(function (resolve, reject) {
                                        var deleteDbRequest = window.indexedDB.deleteDatabase(DB_NAME);
                                        deleteDbRequest.addEventListener("success", function () { return resolve(true); });
                                        deleteDbRequest.addEventListener("error", function () { return reject(false); });
                                    })];
                            }
                            // Database doesn't exist, return true
                            return [2 /*return*/, true];
                    }
                });
            });
        };
        return DatabaseStorage;
    }());

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * This class allows MSAL to store artifacts asynchronously using the DatabaseStorage IndexedDB wrapper,
     * backed up with the more volatile MemoryStorage object for cases in which IndexedDB may be unavailable.
     */
    var AsyncMemoryStorage = /** @class */ (function () {
        function AsyncMemoryStorage(logger, storeName) {
            this.inMemoryCache = new MemoryStorage();
            this.indexedDBCache = new DatabaseStorage();
            this.logger = logger;
            this.storeName = storeName;
        }
        AsyncMemoryStorage.prototype.handleDatabaseAccessError = function (error) {
            if (error instanceof BrowserAuthError && error.errorCode === BrowserAuthErrorMessage.databaseUnavailable.code) {
                this.logger.error("Could not access persistent storage. This may be caused by browser privacy features which block persistent storage in third-party contexts.");
            }
            else {
                throw error;
            }
        };
        /**
         * Get the item matching the given key. Tries in-memory cache first, then in the asynchronous
         * storage object if item isn't found in-memory.
         * @param key
         */
        AsyncMemoryStorage.prototype.getItem = function (key) {
            return __awaiter$1(this, void 0, void 0, function () {
                var item, e_1;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            item = this.inMemoryCache.getItem(key);
                            if (!!item) return [3 /*break*/, 4];
                            _a.label = 1;
                        case 1:
                            _a.trys.push([1, 3, , 4]);
                            this.logger.verbose("Queried item not found in in-memory cache, now querying persistent storage.");
                            return [4 /*yield*/, this.indexedDBCache.getItem(key)];
                        case 2: return [2 /*return*/, _a.sent()];
                        case 3:
                            e_1 = _a.sent();
                            this.handleDatabaseAccessError(e_1);
                            return [3 /*break*/, 4];
                        case 4: return [2 /*return*/, item];
                    }
                });
            });
        };
        /**
         * Sets the item in the in-memory cache and then tries to set it in the asynchronous
         * storage object with the given key.
         * @param key
         * @param value
         */
        AsyncMemoryStorage.prototype.setItem = function (key, value) {
            return __awaiter$1(this, void 0, void 0, function () {
                var e_2;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            this.inMemoryCache.setItem(key, value);
                            _a.label = 1;
                        case 1:
                            _a.trys.push([1, 3, , 4]);
                            return [4 /*yield*/, this.indexedDBCache.setItem(key, value)];
                        case 2:
                            _a.sent();
                            return [3 /*break*/, 4];
                        case 3:
                            e_2 = _a.sent();
                            this.handleDatabaseAccessError(e_2);
                            return [3 /*break*/, 4];
                        case 4: return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * Removes the item matching the key from the in-memory cache, then tries to remove it from the asynchronous storage object.
         * @param key
         */
        AsyncMemoryStorage.prototype.removeItem = function (key) {
            return __awaiter$1(this, void 0, void 0, function () {
                var e_3;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            this.inMemoryCache.removeItem(key);
                            _a.label = 1;
                        case 1:
                            _a.trys.push([1, 3, , 4]);
                            return [4 /*yield*/, this.indexedDBCache.removeItem(key)];
                        case 2:
                            _a.sent();
                            return [3 /*break*/, 4];
                        case 3:
                            e_3 = _a.sent();
                            this.handleDatabaseAccessError(e_3);
                            return [3 /*break*/, 4];
                        case 4: return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * Get all the keys from the in-memory cache as an iterable array of strings. If no keys are found, query the keys in the
         * asynchronous storage object.
         */
        AsyncMemoryStorage.prototype.getKeys = function () {
            return __awaiter$1(this, void 0, void 0, function () {
                var cacheKeys, e_4;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            cacheKeys = this.inMemoryCache.getKeys();
                            if (!(cacheKeys.length === 0)) return [3 /*break*/, 4];
                            _a.label = 1;
                        case 1:
                            _a.trys.push([1, 3, , 4]);
                            this.logger.verbose("In-memory cache is empty, now querying persistent storage.");
                            return [4 /*yield*/, this.indexedDBCache.getKeys()];
                        case 2: return [2 /*return*/, _a.sent()];
                        case 3:
                            e_4 = _a.sent();
                            this.handleDatabaseAccessError(e_4);
                            return [3 /*break*/, 4];
                        case 4: return [2 /*return*/, cacheKeys];
                    }
                });
            });
        };
        /**
         * Returns true or false if the given key is present in the cache.
         * @param key
         */
        AsyncMemoryStorage.prototype.containsKey = function (key) {
            return __awaiter$1(this, void 0, void 0, function () {
                var containsKey, e_5;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            containsKey = this.inMemoryCache.containsKey(key);
                            if (!!containsKey) return [3 /*break*/, 4];
                            _a.label = 1;
                        case 1:
                            _a.trys.push([1, 3, , 4]);
                            this.logger.verbose("Key not found in in-memory cache, now querying persistent storage.");
                            return [4 /*yield*/, this.indexedDBCache.containsKey(key)];
                        case 2: return [2 /*return*/, _a.sent()];
                        case 3:
                            e_5 = _a.sent();
                            this.handleDatabaseAccessError(e_5);
                            return [3 /*break*/, 4];
                        case 4: return [2 /*return*/, containsKey];
                    }
                });
            });
        };
        /**
         * Clears in-memory Map and tries to delete the IndexedDB database.
         */
        AsyncMemoryStorage.prototype.clear = function () {
            return __awaiter$1(this, void 0, void 0, function () {
                var dbDeleted, e_6;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            // InMemory cache is a Map instance, clear is straightforward
                            this.logger.verbose("Deleting in-memory keystore " + this.storeName);
                            this.inMemoryCache.clear();
                            this.logger.verbose("In-memory keystore " + this.storeName + " deleted");
                            this.logger.verbose("Deleting persistent keystore " + this.storeName);
                            _a.label = 1;
                        case 1:
                            _a.trys.push([1, 3, , 4]);
                            return [4 /*yield*/, this.indexedDBCache.deleteDatabase()];
                        case 2:
                            dbDeleted = _a.sent();
                            if (dbDeleted) {
                                this.logger.verbose("Persistent keystore " + this.storeName + " deleted");
                            }
                            return [2 /*return*/, dbDeleted];
                        case 3:
                            e_6 = _a.sent();
                            this.handleDatabaseAccessError(e_6);
                            return [2 /*return*/, false];
                        case 4: return [2 /*return*/];
                    }
                });
            });
        };
        return AsyncMemoryStorage;
    }());

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var CryptoKeyStoreNames;
    (function (CryptoKeyStoreNames) {
        CryptoKeyStoreNames["asymmetricKeys"] = "asymmetricKeys";
        CryptoKeyStoreNames["symmetricKeys"] = "symmetricKeys";
    })(CryptoKeyStoreNames || (CryptoKeyStoreNames = {}));
    /**
     * This class implements MSAL's crypto interface, which allows it to perform base64 encoding and decoding, generating cryptographically random GUIDs and
     * implementing Proof Key for Code Exchange specs for the OAuth Authorization Code Flow using PKCE (rfc here: https://tools.ietf.org/html/rfc7636).
     */
    var CryptoOps = /** @class */ (function () {
        function CryptoOps(logger, performanceClient) {
            this.logger = logger;
            // Browser crypto needs to be validated first before any other classes can be set.
            this.browserCrypto = new BrowserCrypto(this.logger);
            this.b64Encode = new Base64Encode();
            this.b64Decode = new Base64Decode();
            this.guidGenerator = new GuidGenerator(this.browserCrypto);
            this.pkceGenerator = new PkceGenerator(this.browserCrypto);
            this.cache = {
                asymmetricKeys: new AsyncMemoryStorage(this.logger, CryptoKeyStoreNames.asymmetricKeys),
                symmetricKeys: new AsyncMemoryStorage(this.logger, CryptoKeyStoreNames.symmetricKeys)
            };
            this.performanceClient = performanceClient;
        }
        /**
         * Creates a new random GUID - used to populate state and nonce.
         * @returns string (GUID)
         */
        CryptoOps.prototype.createNewGuid = function () {
            return this.guidGenerator.generateGuid();
        };
        /**
         * Encodes input string to base64.
         * @param input
         */
        CryptoOps.prototype.base64Encode = function (input) {
            return this.b64Encode.encode(input);
        };
        /**
         * Decodes input string from base64.
         * @param input
         */
        CryptoOps.prototype.base64Decode = function (input) {
            return this.b64Decode.decode(input);
        };
        /**
         * Generates PKCE codes used in Authorization Code Flow.
         */
        CryptoOps.prototype.generatePkceCodes = function () {
            return __awaiter$1(this, void 0, void 0, function () {
                return __generator$1(this, function (_a) {
                    return [2 /*return*/, this.pkceGenerator.generateCodes()];
                });
            });
        };
        /**
         * Generates a keypair, stores it and returns a thumbprint
         * @param request
         */
        CryptoOps.prototype.getPublicKeyThumbprint = function (request) {
            var _a;
            return __awaiter$1(this, void 0, void 0, function () {
                var publicKeyThumbMeasurement, keyPair, publicKeyJwk, pubKeyThumprintObj, publicJwkString, publicJwkHash, privateKeyJwk, unextractablePrivateKey;
                return __generator$1(this, function (_b) {
                    switch (_b.label) {
                        case 0:
                            publicKeyThumbMeasurement = (_a = this.performanceClient) === null || _a === void 0 ? void 0 : _a.startMeasurement(exports.PerformanceEvents.CryptoOptsGetPublicKeyThumbprint, request.correlationId);
                            return [4 /*yield*/, this.browserCrypto.generateKeyPair(CryptoOps.EXTRACTABLE, CryptoOps.POP_KEY_USAGES)];
                        case 1:
                            keyPair = _b.sent();
                            return [4 /*yield*/, this.browserCrypto.exportJwk(keyPair.publicKey)];
                        case 2:
                            publicKeyJwk = _b.sent();
                            pubKeyThumprintObj = {
                                e: publicKeyJwk.e,
                                kty: publicKeyJwk.kty,
                                n: publicKeyJwk.n
                            };
                            publicJwkString = BrowserCrypto.getJwkString(pubKeyThumprintObj);
                            return [4 /*yield*/, this.hashString(publicJwkString)];
                        case 3:
                            publicJwkHash = _b.sent();
                            return [4 /*yield*/, this.browserCrypto.exportJwk(keyPair.privateKey)];
                        case 4:
                            privateKeyJwk = _b.sent();
                            return [4 /*yield*/, this.browserCrypto.importJwk(privateKeyJwk, false, ["sign"])];
                        case 5:
                            unextractablePrivateKey = _b.sent();
                            // Store Keypair data in keystore
                            return [4 /*yield*/, this.cache.asymmetricKeys.setItem(publicJwkHash, {
                                    privateKey: unextractablePrivateKey,
                                    publicKey: keyPair.publicKey,
                                    requestMethod: request.resourceRequestMethod,
                                    requestUri: request.resourceRequestUri
                                })];
                        case 6:
                            // Store Keypair data in keystore
                            _b.sent();
                            if (publicKeyThumbMeasurement) {
                                publicKeyThumbMeasurement.endMeasurement({
                                    success: true
                                });
                            }
                            return [2 /*return*/, publicJwkHash];
                    }
                });
            });
        };
        /**
         * Removes cryptographic keypair from key store matching the keyId passed in
         * @param kid
         */
        CryptoOps.prototype.removeTokenBindingKey = function (kid) {
            return __awaiter$1(this, void 0, void 0, function () {
                var keyFound;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.cache.asymmetricKeys.removeItem(kid)];
                        case 1:
                            _a.sent();
                            return [4 /*yield*/, this.cache.asymmetricKeys.containsKey(kid)];
                        case 2:
                            keyFound = _a.sent();
                            return [2 /*return*/, !keyFound];
                    }
                });
            });
        };
        /**
         * Removes all cryptographic keys from IndexedDB storage
         */
        CryptoOps.prototype.clearKeystore = function () {
            return __awaiter$1(this, void 0, void 0, function () {
                var e_1;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            _a.trys.push([0, 3, , 4]);
                            this.logger.verbose("Deleting in-memory and persistent asymmetric key stores");
                            return [4 /*yield*/, this.cache.asymmetricKeys.clear()];
                        case 1:
                            _a.sent();
                            this.logger.verbose("Successfully deleted asymmetric key stores");
                            this.logger.verbose("Deleting in-memory and persistent symmetric key stores");
                            return [4 /*yield*/, this.cache.symmetricKeys.clear()];
                        case 2:
                            _a.sent();
                            this.logger.verbose("Successfully deleted symmetric key stores");
                            return [2 /*return*/, true];
                        case 3:
                            e_1 = _a.sent();
                            if (e_1 instanceof Error) {
                                this.logger.error("Clearing keystore failed with error: " + e_1.message);
                            }
                            else {
                                this.logger.error("Clearing keystore failed with unknown error");
                            }
                            return [2 /*return*/, false];
                        case 4: return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * Signs the given object as a jwt payload with private key retrieved by given kid.
         * @param payload
         * @param kid
         */
        CryptoOps.prototype.signJwt = function (payload, kid, correlationId) {
            var _a;
            return __awaiter$1(this, void 0, void 0, function () {
                var signJwtMeasurement, cachedKeyPair, publicKeyJwk, publicKeyJwkString, encodedKeyIdThumbprint, shrHeader, encodedShrHeader, encodedPayload, tokenString, tokenBuffer, signatureBuffer, encodedSignature, signedJwt;
                return __generator$1(this, function (_b) {
                    switch (_b.label) {
                        case 0:
                            signJwtMeasurement = (_a = this.performanceClient) === null || _a === void 0 ? void 0 : _a.startMeasurement(exports.PerformanceEvents.CryptoOptsSignJwt, correlationId);
                            return [4 /*yield*/, this.cache.asymmetricKeys.getItem(kid)];
                        case 1:
                            cachedKeyPair = _b.sent();
                            if (!cachedKeyPair) {
                                throw BrowserAuthError.createSigningKeyNotFoundInStorageError(kid);
                            }
                            return [4 /*yield*/, this.browserCrypto.exportJwk(cachedKeyPair.publicKey)];
                        case 2:
                            publicKeyJwk = _b.sent();
                            publicKeyJwkString = BrowserCrypto.getJwkString(publicKeyJwk);
                            encodedKeyIdThumbprint = this.b64Encode.urlEncode(JSON.stringify({ kid: kid }));
                            shrHeader = JoseHeader.getShrHeaderString({ kid: encodedKeyIdThumbprint, alg: publicKeyJwk.alg });
                            encodedShrHeader = this.b64Encode.urlEncode(shrHeader);
                            // Generate payload
                            payload.cnf = {
                                jwk: JSON.parse(publicKeyJwkString)
                            };
                            encodedPayload = this.b64Encode.urlEncode(JSON.stringify(payload));
                            tokenString = encodedShrHeader + "." + encodedPayload;
                            tokenBuffer = BrowserStringUtils.stringToArrayBuffer(tokenString);
                            return [4 /*yield*/, this.browserCrypto.sign(cachedKeyPair.privateKey, tokenBuffer)];
                        case 3:
                            signatureBuffer = _b.sent();
                            encodedSignature = this.b64Encode.urlEncodeArr(new Uint8Array(signatureBuffer));
                            signedJwt = tokenString + "." + encodedSignature;
                            if (signJwtMeasurement) {
                                signJwtMeasurement.endMeasurement({
                                    success: true
                                });
                            }
                            return [2 /*return*/, signedJwt];
                    }
                });
            });
        };
        /**
         * Returns the SHA-256 hash of an input string
         * @param plainText
         */
        CryptoOps.prototype.hashString = function (plainText) {
            return __awaiter$1(this, void 0, void 0, function () {
                var hashBuffer, hashBytes;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.browserCrypto.sha256Digest(plainText)];
                        case 1:
                            hashBuffer = _a.sent();
                            hashBytes = new Uint8Array(hashBuffer);
                            return [2 /*return*/, this.b64Encode.urlEncodeArr(hashBytes)];
                    }
                });
            });
        };
        CryptoOps.POP_KEY_USAGES = ["sign", "verify"];
        CryptoOps.EXTRACTABLE = true;
        return CryptoOps;
    }());

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * Token cache manager
     */
    var TokenCache = /** @class */ (function () {
        function TokenCache(configuration, storage, logger, cryptoObj) {
            this.isBrowserEnvironment = typeof window !== "undefined";
            this.config = configuration;
            this.storage = storage;
            this.logger = logger;
            this.cryptoObj = cryptoObj;
        }
        // Move getAllAccounts here and cache utility APIs
        /**
         * API to load tokens to msal-browser cache.
         * @param request
         * @param response
         * @param options
         */
        TokenCache.prototype.loadExternalTokens = function (request, response, options) {
            this.logger.info("TokenCache - loadExternalTokens called");
            if (!response.id_token) {
                throw BrowserAuthError.createUnableToLoadTokenError("Please ensure server response includes id token.");
            }
            if (request.account) {
                this.loadIdToken(response.id_token, request.account.homeAccountId, request.account.environment, request.account.tenantId, options);
                this.loadAccessToken(request, response, request.account.homeAccountId, request.account.environment, request.account.tenantId, options);
            }
            else if (request.authority) {
                var authorityUrl = Authority.generateAuthority(request.authority, request.azureCloudOptions);
                var authorityOptions = {
                    protocolMode: this.config.auth.protocolMode,
                    knownAuthorities: this.config.auth.knownAuthorities,
                    cloudDiscoveryMetadata: this.config.auth.cloudDiscoveryMetadata,
                    authorityMetadata: this.config.auth.authorityMetadata,
                    skipAuthorityMetadataCache: this.config.auth.skipAuthorityMetadataCache,
                };
                var authority = new Authority(authorityUrl, this.config.system.networkClient, this.storage, authorityOptions);
                // "clientInfo" from options takes precedence over "clientInfo" in response
                if (options.clientInfo) {
                    this.logger.trace("TokenCache - homeAccountId from options");
                    this.loadIdToken(response.id_token, options.clientInfo, authority.hostnameAndPort, authority.tenant, options);
                    this.loadAccessToken(request, response, options.clientInfo, authority.hostnameAndPort, authority.tenant, options);
                }
                else if (response.client_info) {
                    this.logger.trace("TokenCache - homeAccountId from response");
                    this.loadIdToken(response.id_token, response.client_info, authority.hostnameAndPort, authority.tenant, options);
                    this.loadAccessToken(request, response, response.client_info, authority.hostnameAndPort, authority.tenant, options);
                }
                else {
                    throw BrowserAuthError.createUnableToLoadTokenError("Please provide clientInfo in the response or options.");
                }
            }
            else {
                throw BrowserAuthError.createUnableToLoadTokenError("Please provide a request with an account or a request with authority.");
            }
        };
        /**
         * Helper function to load id tokens to msal-browser cache
         * @param idToken
         * @param homeAccountId
         * @param environment
         * @param tenantId
         * @param options
         */
        TokenCache.prototype.loadIdToken = function (idToken, homeAccountId, environment, tenantId, options) {
            var idTokenEntity = IdTokenEntity.createIdTokenEntity(homeAccountId, environment, idToken, this.config.auth.clientId, tenantId);
            var idAuthToken = new AuthToken(idToken, this.cryptoObj);
            var accountEntity = options.clientInfo ?
                AccountEntity.createAccount(options.clientInfo, homeAccountId, idAuthToken, undefined, undefined, undefined, environment) :
                AccountEntity.createGenericAccount(homeAccountId, idAuthToken, undefined, undefined, undefined, environment);
            if (this.isBrowserEnvironment) {
                this.logger.verbose("TokenCache - loading id token");
                this.storage.setAccount(accountEntity);
                this.storage.setIdTokenCredential(idTokenEntity);
            }
            else {
                throw BrowserAuthError.createUnableToLoadTokenError("loadExternalTokens is designed to work in browser environments only.");
            }
        };
        /**
         * Helper function to load access tokens to msal-browser cache
         * @param request
         * @param response
         * @param options
         * @param homeAccountId
         * @param environment
         * @param tenantId
         * @returns
         */
        TokenCache.prototype.loadAccessToken = function (request, response, homeAccountId, environment, tenantId, options) {
            if (!response.access_token) {
                this.logger.verbose("TokenCache - No access token provided for caching");
                return;
            }
            if (!response.expires_in) {
                throw BrowserAuthError.createUnableToLoadTokenError("Please ensure server response includes expires_in value.");
            }
            if (!options.extendedExpiresOn) {
                throw BrowserAuthError.createUnableToLoadTokenError("Please provide an extendedExpiresOn value in the options.");
            }
            var scopes = new ScopeSet(request.scopes).printScopes();
            var expiresOn = options.expiresOn || (response.expires_in + new Date().getTime() / 1000);
            var extendedExpiresOn = options.extendedExpiresOn;
            var accessTokenEntity = AccessTokenEntity.createAccessTokenEntity(homeAccountId, environment, response.access_token, this.config.auth.clientId, tenantId, scopes, expiresOn, extendedExpiresOn, this.cryptoObj);
            if (this.isBrowserEnvironment) {
                this.logger.verbose("TokenCache - loading access token");
                this.storage.setAccessTokenCredential(accessTokenEntity);
            }
            else {
                throw BrowserAuthError.createUnableToLoadTokenError("loadExternalTokens is designed to work in browser environments only.");
            }
        };
        return TokenCache;
    }());

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var HybridSpaAuthorizationCodeClient = /** @class */ (function (_super) {
        __extends$1(HybridSpaAuthorizationCodeClient, _super);
        function HybridSpaAuthorizationCodeClient(config) {
            var _this = _super.call(this, config) || this;
            _this.includeRedirectUri = false;
            return _this;
        }
        return HybridSpaAuthorizationCodeClient;
    }(AuthorizationCodeClient));

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var SilentAuthCodeClient = /** @class */ (function (_super) {
        __extends$1(SilentAuthCodeClient, _super);
        function SilentAuthCodeClient(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, apiId, performanceClient, nativeMessageHandler, correlationId) {
            var _this = _super.call(this, config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeMessageHandler, correlationId) || this;
            _this.apiId = apiId;
            return _this;
        }
        /**
         * Acquires a token silently by redeeming an authorization code against the /token endpoint
         * @param request
         */
        SilentAuthCodeClient.prototype.acquireToken = function (request) {
            return __awaiter$1(this, void 0, void 0, function () {
                var silentRequest, serverTelemetryManager, authCodeRequest, clientConfig, authClient, silentHandler, e_1;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            this.logger.trace("SilentAuthCodeClient.acquireToken called");
                            // Auth code payload is required
                            if (!request.code) {
                                throw BrowserAuthError.createAuthCodeRequiredError();
                            }
                            return [4 /*yield*/, this.initializeAuthorizationRequest(request, exports.InteractionType.Silent)];
                        case 1:
                            silentRequest = _a.sent();
                            this.browserStorage.updateCacheEntries(silentRequest.state, silentRequest.nonce, silentRequest.authority, silentRequest.loginHint || Constants.EMPTY_STRING, silentRequest.account || null);
                            serverTelemetryManager = this.initializeServerTelemetryManager(this.apiId);
                            _a.label = 2;
                        case 2:
                            _a.trys.push([2, 4, , 5]);
                            authCodeRequest = __assign$1(__assign$1({}, silentRequest), { code: request.code });
                            return [4 /*yield*/, this.getClientConfiguration(serverTelemetryManager, silentRequest.authority)];
                        case 3:
                            clientConfig = _a.sent();
                            authClient = new HybridSpaAuthorizationCodeClient(clientConfig);
                            this.logger.verbose("Auth code client created");
                            silentHandler = new SilentHandler(authClient, this.browserStorage, authCodeRequest, this.logger, this.config.system.navigateFrameWait);
                            // Handle auth code parameters from request
                            return [2 /*return*/, silentHandler.handleCodeResponseFromServer({
                                    code: request.code,
                                    msgraph_host: request.msGraphHost,
                                    cloud_graph_host_name: request.cloudGraphHostName,
                                    cloud_instance_host_name: request.cloudInstanceHostName
                                }, silentRequest.state, authClient.authority, this.networkClient, false)];
                        case 4:
                            e_1 = _a.sent();
                            if (e_1 instanceof AuthError) {
                                e_1.setCorrelationId(this.correlationId);
                            }
                            serverTelemetryManager.cacheFailedRequest(e_1);
                            this.browserStorage.cleanRequestByState(silentRequest.state);
                            throw e_1;
                        case 5: return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * Currently Unsupported
         */
        SilentAuthCodeClient.prototype.logout = function () {
            // Synchronous so we must reject
            return Promise.reject(BrowserAuthError.createSilentLogoutUnsupportedError());
        };
        return SilentAuthCodeClient;
    }(StandardInteractionClient));

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var BrowserPerformanceMeasurement = /** @class */ (function () {
        function BrowserPerformanceMeasurement(name, correlationId) {
            this.correlationId = correlationId;
            this.measureName = "msal.measure." + name + "." + this.correlationId;
            this.startMark = "msal.start." + name + "." + this.correlationId;
            this.endMark = "msal.end." + name + "." + this.correlationId;
        }
        BrowserPerformanceMeasurement.supportsBrowserPerformance = function () {
            return typeof window !== "undefined" &&
                typeof window.performance !== "undefined" &&
                typeof window.performance.mark === "function" &&
                typeof window.performance.measure === "function" &&
                typeof window.performance.clearMarks === "function" &&
                typeof window.performance.clearMeasures === "function" &&
                typeof window.performance.getEntriesByName === "function";
        };
        BrowserPerformanceMeasurement.prototype.startMeasurement = function () {
            if (BrowserPerformanceMeasurement.supportsBrowserPerformance()) {
                try {
                    window.performance.mark(this.startMark);
                }
                catch (e) {
                    // Silently catch
                }
            }
        };
        BrowserPerformanceMeasurement.prototype.endMeasurement = function () {
            if (BrowserPerformanceMeasurement.supportsBrowserPerformance()) {
                try {
                    window.performance.mark(this.endMark);
                    window.performance.measure(this.measureName, this.startMark, this.endMark);
                }
                catch (e) {
                    // Silently catch
                }
            }
        };
        BrowserPerformanceMeasurement.prototype.flushMeasurement = function () {
            if (BrowserPerformanceMeasurement.supportsBrowserPerformance()) {
                try {
                    var entriesForMeasurement = window.performance.getEntriesByName(this.measureName, "measure");
                    if (entriesForMeasurement.length > 0) {
                        var durationMs = entriesForMeasurement[0].duration;
                        window.performance.clearMeasures(this.measureName);
                        window.performance.clearMarks(this.startMark);
                        window.performance.clearMarks(this.endMark);
                        return durationMs;
                    }
                }
                catch (e) {
                    // Silently catch and return null
                }
            }
            return null;
        };
        return BrowserPerformanceMeasurement;
    }());

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var BrowserPerformanceClient = /** @class */ (function (_super) {
        __extends$1(BrowserPerformanceClient, _super);
        function BrowserPerformanceClient(clientId, authority, logger, libraryName, libraryVersion, applicationTelemetry) {
            var _this = _super.call(this, clientId, authority, logger, libraryName, libraryVersion, applicationTelemetry) || this;
            _this.browserCrypto = new BrowserCrypto(_this.logger);
            _this.guidGenerator = new GuidGenerator(_this.browserCrypto);
            return _this;
        }
        BrowserPerformanceClient.prototype.startPerformanceMeasuremeant = function (measureName, correlationId) {
            return new BrowserPerformanceMeasurement(measureName, correlationId);
        };
        BrowserPerformanceClient.prototype.generateId = function () {
            return this.guidGenerator.generateGuid();
        };
        BrowserPerformanceClient.prototype.getPageVisibility = function () {
            var _a;
            return ((_a = document.visibilityState) === null || _a === void 0 ? void 0 : _a.toString()) || null;
        };
        /**
         * Starts measuring performance for a given operation. Returns a function that should be used to end the measurement.
         * Also captures browser page visibilityState.
         *
         * @param {PerformanceEvents} measureName
         * @param {?string} [correlationId]
         * @returns {((event?: Partial<PerformanceEvent>) => PerformanceEvent| null)}
         */
        BrowserPerformanceClient.prototype.startMeasurement = function (measureName, correlationId) {
            var _this = this;
            // Capture page visibilityState and then invoke start/end measurement
            var startPageVisibility = this.getPageVisibility();
            var inProgressEvent = _super.prototype.startMeasurement.call(this, measureName, correlationId);
            return __assign$1(__assign$1({}, inProgressEvent), { endMeasurement: function (event) {
                    return inProgressEvent.endMeasurement(__assign$1({ startPageVisibility: startPageVisibility, endPageVisibility: _this.getPageVisibility() }, event));
                } });
        };
        return BrowserPerformanceClient;
    }(PerformanceClient));

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var ClientApplication = /** @class */ (function () {
        /**
         * @constructor
         * Constructor for the PublicClientApplication used to instantiate the PublicClientApplication object
         *
         * Important attributes in the Configuration object for auth are:
         * - clientID: the application ID of your application. You can obtain one by registering your application with our Application registration portal : https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredAppsPreview
         * - authority: the authority URL for your application.
         * - redirect_uri: the uri of your application registered in the portal.
         *
         * In Azure AD, authority is a URL indicating the Azure active directory that MSAL uses to obtain tokens.
         * It is of the form https://login.microsoftonline.com/{Enter_the_Tenant_Info_Here}
         * If your application supports Accounts in one organizational directory, replace "Enter_the_Tenant_Info_Here" value with the Tenant Id or Tenant name (for example, contoso.microsoft.com).
         * If your application supports Accounts in any organizational directory, replace "Enter_the_Tenant_Info_Here" value with organizations.
         * If your application supports Accounts in any organizational directory and personal Microsoft accounts, replace "Enter_the_Tenant_Info_Here" value with common.
         * To restrict support to Personal Microsoft accounts only, replace "Enter_the_Tenant_Info_Here" value with consumers.
         *
         * In Azure B2C, authority is of the form https://{instance}/tfp/{tenant}/{policyName}/
         * Full B2C functionality will be available in this library in future versions.
         *
         * @param configuration Object for the MSAL PublicClientApplication instance
         */
        function ClientApplication(configuration) {
            /*
             * If loaded in an environment where window is not available,
             * set internal flag to false so that further requests fail.
             * This is to support server-side rendering environments.
             */
            this.isBrowserEnvironment = typeof window !== "undefined";
            // Set the configuration.
            this.config = buildConfiguration(configuration, this.isBrowserEnvironment);
            this.initialized = false;
            // Initialize logger
            this.logger = new Logger(this.config.system.loggerOptions, name, version);
            // Initialize the network module class.
            this.networkClient = this.config.system.networkClient;
            // Initialize the navigation client class.
            this.navigationClient = this.config.system.navigationClient;
            // Initialize redirectResponse Map
            this.redirectResponse = new Map();
            // Initial hybrid spa map
            this.hybridAuthCodeResponses = new Map();
            // Initialize performance client
            this.performanceClient = this.isBrowserEnvironment ?
                new BrowserPerformanceClient(this.config.auth.clientId, this.config.auth.authority, this.logger, name, version, this.config.telemetry.application) :
                new StubPerformanceClient(this.config.auth.clientId, this.config.auth.authority, this.logger, name, version, this.config.telemetry.application);
            // Initialize the crypto class.
            this.browserCrypto = this.isBrowserEnvironment ? new CryptoOps(this.logger, this.performanceClient) : DEFAULT_CRYPTO_IMPLEMENTATION;
            this.eventHandler = new EventHandler(this.logger, this.browserCrypto);
            // Initialize the browser storage class.
            this.browserStorage = this.isBrowserEnvironment ?
                new BrowserCacheManager(this.config.auth.clientId, this.config.cache, this.browserCrypto, this.logger) :
                DEFAULT_BROWSER_CACHE_MANAGER(this.config.auth.clientId, this.logger);
            // initialize in memory storage for native flows
            var nativeCacheOptions = {
                cacheLocation: exports.BrowserCacheLocation.MemoryStorage,
                storeAuthStateInCookie: false,
                secureCookies: false
            };
            this.nativeInternalStorage = new BrowserCacheManager(this.config.auth.clientId, nativeCacheOptions, this.browserCrypto, this.logger);
            // Initialize the token cache
            this.tokenCache = new TokenCache(this.config, this.browserStorage, this.logger, this.browserCrypto);
        }
        /**
         * Initializer function to perform async startup tasks such as connecting to WAM extension
         */
        ClientApplication.prototype.initialize = function () {
            return __awaiter$1(this, void 0, void 0, function () {
                var _a, e_1;
                return __generator$1(this, function (_b) {
                    switch (_b.label) {
                        case 0:
                            this.logger.trace("initialize called");
                            if (this.initialized) {
                                this.logger.info("initialize has already been called, exiting early.");
                                return [2 /*return*/];
                            }
                            this.eventHandler.emitEvent(exports.EventType.INITIALIZE_START);
                            if (!this.config.system.allowNativeBroker) return [3 /*break*/, 4];
                            _b.label = 1;
                        case 1:
                            _b.trys.push([1, 3, , 4]);
                            _a = this;
                            return [4 /*yield*/, NativeMessageHandler.createProvider(this.logger, this.config.system.nativeBrokerHandshakeTimeout)];
                        case 2:
                            _a.nativeExtensionProvider = _b.sent();
                            return [3 /*break*/, 4];
                        case 3:
                            e_1 = _b.sent();
                            this.logger.verbose(e_1);
                            return [3 /*break*/, 4];
                        case 4:
                            this.initialized = true;
                            this.eventHandler.emitEvent(exports.EventType.INITIALIZE_END);
                            return [2 /*return*/];
                    }
                });
            });
        };
        // #region Redirect Flow
        /**
         * Event handler function which allows users to fire events after the PublicClientApplication object
         * has loaded during redirect flows. This should be invoked on all page loads involved in redirect
         * auth flows.
         * @param hash Hash to process. Defaults to the current value of window.location.hash. Only needs to be provided explicitly if the response to be handled is not contained in the current value.
         * @returns Token response or null. If the return value is null, then no auth redirect was detected.
         */
        ClientApplication.prototype.handleRedirectPromise = function (hash) {
            return __awaiter$1(this, void 0, void 0, function () {
                var loggedInAccounts, redirectResponseKey, response, request, redirectResponse, nativeClient, correlationId, redirectClient;
                var _this = this;
                return __generator$1(this, function (_a) {
                    this.logger.verbose("handleRedirectPromise called");
                    // Block token acquisition before initialize has been called if native brokering is enabled
                    BrowserUtils.blockNativeBrokerCalledBeforeInitialized(this.config.system.allowNativeBroker, this.initialized);
                    loggedInAccounts = this.getAllAccounts();
                    if (this.isBrowserEnvironment) {
                        redirectResponseKey = hash || Constants.EMPTY_STRING;
                        response = this.redirectResponse.get(redirectResponseKey);
                        if (typeof response === "undefined") {
                            this.eventHandler.emitEvent(exports.EventType.HANDLE_REDIRECT_START, exports.InteractionType.Redirect);
                            this.logger.verbose("handleRedirectPromise has been called for the first time, storing the promise");
                            request = this.browserStorage.getCachedNativeRequest();
                            redirectResponse = void 0;
                            if (request && NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeExtensionProvider) && this.nativeExtensionProvider && !hash) {
                                this.logger.trace("handleRedirectPromise - acquiring token from native platform");
                                nativeClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, exports.ApiId.handleRedirectPromise, this.performanceClient, this.nativeExtensionProvider, request.accountId, this.nativeInternalStorage, request.correlationId);
                                redirectResponse = nativeClient.handleRedirectPromise();
                            }
                            else {
                                this.logger.trace("handleRedirectPromise - acquiring token from web flow");
                                correlationId = this.browserStorage.getTemporaryCache(TemporaryCacheKeys.CORRELATION_ID, true) || Constants.EMPTY_STRING;
                                redirectClient = this.createRedirectClient(correlationId);
                                redirectResponse = redirectClient.handleRedirectPromise(hash);
                            }
                            response = redirectResponse.then(function (result) {
                                if (result) {
                                    // Emit login event if number of accounts change
                                    var isLoggingIn = loggedInAccounts.length < _this.getAllAccounts().length;
                                    if (isLoggingIn) {
                                        _this.eventHandler.emitEvent(exports.EventType.LOGIN_SUCCESS, exports.InteractionType.Redirect, result);
                                        _this.logger.verbose("handleRedirectResponse returned result, login success");
                                    }
                                    else {
                                        _this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_SUCCESS, exports.InteractionType.Redirect, result);
                                        _this.logger.verbose("handleRedirectResponse returned result, acquire token success");
                                    }
                                }
                                _this.eventHandler.emitEvent(exports.EventType.HANDLE_REDIRECT_END, exports.InteractionType.Redirect);
                                return result;
                            }).catch(function (e) {
                                // Emit login event if there is an account
                                if (loggedInAccounts.length > 0) {
                                    _this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_FAILURE, exports.InteractionType.Redirect, null, e);
                                }
                                else {
                                    _this.eventHandler.emitEvent(exports.EventType.LOGIN_FAILURE, exports.InteractionType.Redirect, null, e);
                                }
                                _this.eventHandler.emitEvent(exports.EventType.HANDLE_REDIRECT_END, exports.InteractionType.Redirect);
                                throw e;
                            });
                            this.redirectResponse.set(redirectResponseKey, response);
                        }
                        else {
                            this.logger.verbose("handleRedirectPromise has been called previously, returning the result from the first call");
                        }
                        return [2 /*return*/, response];
                    }
                    this.logger.verbose("handleRedirectPromise returns null, not browser environment");
                    return [2 /*return*/, null];
                });
            });
        };
        /**
         * Use when you want to obtain an access_token for your API by redirecting the user's browser window to the authorization endpoint. This function redirects
         * the page, so any code that follows this function will not execute.
         *
         * IMPORTANT: It is NOT recommended to have code that is dependent on the resolution of the Promise. This function will navigate away from the current
         * browser window. It currently returns a Promise in order to reflect the asynchronous nature of the code running in this function.
         *
         * @param request
         */
        ClientApplication.prototype.acquireTokenRedirect = function (request) {
            return __awaiter$1(this, void 0, void 0, function () {
                var correlationId, isLoggedIn, result, nativeClient, redirectClient;
                var _this = this;
                return __generator$1(this, function (_a) {
                    correlationId = this.getRequestCorrelationId(request);
                    this.logger.verbose("acquireTokenRedirect called", correlationId);
                    this.preflightBrowserEnvironmentCheck(exports.InteractionType.Redirect);
                    isLoggedIn = this.getAllAccounts().length > 0;
                    if (isLoggedIn) {
                        this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_START, exports.InteractionType.Redirect, request);
                    }
                    else {
                        this.eventHandler.emitEvent(exports.EventType.LOGIN_START, exports.InteractionType.Redirect, request);
                    }
                    if (this.nativeExtensionProvider && this.canUseNative(request)) {
                        nativeClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, exports.ApiId.acquireTokenRedirect, this.performanceClient, this.nativeExtensionProvider, this.getNativeAccountId(request), this.nativeInternalStorage, request.correlationId);
                        result = nativeClient.acquireTokenRedirect(request).catch(function (e) {
                            if (e instanceof NativeAuthError && e.isFatal()) {
                                _this.nativeExtensionProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt
                                var redirectClient = _this.createRedirectClient(request.correlationId);
                                return redirectClient.acquireToken(request);
                            }
                            else if (e instanceof InteractionRequiredAuthError) {
                                _this.logger.verbose("acquireTokenRedirect - Resolving interaction required error thrown by native broker by falling back to web flow");
                                var redirectClient = _this.createRedirectClient(request.correlationId);
                                return redirectClient.acquireToken(request);
                            }
                            _this.browserStorage.setInteractionInProgress(false);
                            throw e;
                        });
                    }
                    else {
                        redirectClient = this.createRedirectClient(request.correlationId);
                        result = redirectClient.acquireToken(request);
                    }
                    return [2 /*return*/, result.catch(function (e) {
                            // If logged in, emit acquire token events
                            if (isLoggedIn) {
                                _this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_FAILURE, exports.InteractionType.Redirect, null, e);
                            }
                            else {
                                _this.eventHandler.emitEvent(exports.EventType.LOGIN_FAILURE, exports.InteractionType.Redirect, null, e);
                            }
                            throw e;
                        })];
                });
            });
        };
        // #endregion
        // #region Popup Flow
        /**
         * Use when you want to obtain an access_token for your API via opening a popup window in the user's browser
         *
         * @param request
         *
         * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.
         */
        ClientApplication.prototype.acquireTokenPopup = function (request) {
            var _this = this;
            var correlationId = this.getRequestCorrelationId(request);
            var atPopupMeasurement = this.performanceClient.startMeasurement(exports.PerformanceEvents.AcquireTokenPopup, correlationId);
            try {
                this.logger.verbose("acquireTokenPopup called", correlationId);
                this.preflightBrowserEnvironmentCheck(exports.InteractionType.Popup);
            }
            catch (e) {
                // Since this function is syncronous we need to reject
                return Promise.reject(e);
            }
            // If logged in, emit acquire token events
            var loggedInAccounts = this.getAllAccounts();
            if (loggedInAccounts.length > 0) {
                this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_START, exports.InteractionType.Popup, request);
            }
            else {
                this.eventHandler.emitEvent(exports.EventType.LOGIN_START, exports.InteractionType.Popup, request);
            }
            var result;
            if (this.canUseNative(request)) {
                result = this.acquireTokenNative(request, exports.ApiId.acquireTokenPopup).then(function (response) {
                    _this.browserStorage.setInteractionInProgress(false);
                    atPopupMeasurement.endMeasurement({
                        success: true,
                        isNativeBroker: true,
                        accessTokenSize: response.accessToken.length,
                        idTokenSize: response.idToken.length,
                    });
                    atPopupMeasurement.flushMeasurement();
                    return response;
                }).catch(function (e) {
                    if (e instanceof NativeAuthError && e.isFatal()) {
                        _this.nativeExtensionProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt
                        var popupClient = _this.createPopupClient(request.correlationId);
                        return popupClient.acquireToken(request);
                    }
                    else if (e instanceof InteractionRequiredAuthError) {
                        _this.logger.verbose("acquireTokenPopup - Resolving interaction required error thrown by native broker by falling back to web flow");
                        var popupClient = _this.createPopupClient(request.correlationId);
                        return popupClient.acquireToken(request);
                    }
                    _this.browserStorage.setInteractionInProgress(false);
                    throw e;
                });
            }
            else {
                var popupClient = this.createPopupClient(request.correlationId);
                result = popupClient.acquireToken(request);
            }
            return result.then(function (result) {
                /*
                 *  If logged in, emit acquire token events
                 */
                var isLoggingIn = loggedInAccounts.length < _this.getAllAccounts().length;
                if (isLoggingIn) {
                    _this.eventHandler.emitEvent(exports.EventType.LOGIN_SUCCESS, exports.InteractionType.Popup, result);
                }
                else {
                    _this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_SUCCESS, exports.InteractionType.Popup, result);
                }
                atPopupMeasurement.endMeasurement({
                    success: true,
                    accessTokenSize: result.accessToken.length,
                    idTokenSize: result.idToken.length,
                });
                atPopupMeasurement.flushMeasurement();
                return result;
            }).catch(function (e) {
                if (loggedInAccounts.length > 0) {
                    _this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_FAILURE, exports.InteractionType.Popup, null, e);
                }
                else {
                    _this.eventHandler.emitEvent(exports.EventType.LOGIN_FAILURE, exports.InteractionType.Popup, null, e);
                }
                atPopupMeasurement.endMeasurement({
                    errorCode: e.errorCode,
                    subErrorCode: e.subError,
                    success: false
                });
                atPopupMeasurement.flushMeasurement();
                // Since this function is syncronous we need to reject
                return Promise.reject(e);
            });
        };
        // #endregion
        // #region Silent Flow
        /**
         * This function uses a hidden iframe to fetch an authorization code from the eSTS. There are cases where this may not work:
         * - Any browser using a form of Intelligent Tracking Prevention
         * - If there is not an established session with the service
         *
         * In these cases, the request must be done inside a popup or full frame redirect.
         *
         * For the cases where interaction is required, you cannot send a request with prompt=none.
         *
         * If your refresh token has expired, you can use this function to fetch a new set of tokens silently as long as
         * you session on the server still exists.
         * @param request {@link SsoSilentRequest}
         *
         * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.
         */
        ClientApplication.prototype.ssoSilent = function (request) {
            return __awaiter$1(this, void 0, void 0, function () {
                var correlationId, validRequest, ssoSilentMeasurement, result, silentIframeClient;
                var _this = this;
                return __generator$1(this, function (_a) {
                    correlationId = this.getRequestCorrelationId(request);
                    validRequest = __assign$1(__assign$1({}, request), { prompt: PromptValue.NONE, correlationId: correlationId });
                    this.preflightBrowserEnvironmentCheck(exports.InteractionType.Silent);
                    ssoSilentMeasurement = this.performanceClient.startMeasurement(exports.PerformanceEvents.SsoSilent, correlationId);
                    this.logger.verbose("ssoSilent called", correlationId);
                    this.eventHandler.emitEvent(exports.EventType.SSO_SILENT_START, exports.InteractionType.Silent, validRequest);
                    if (this.canUseNative(validRequest)) {
                        result = this.acquireTokenNative(validRequest, exports.ApiId.ssoSilent).catch(function (e) {
                            // If native token acquisition fails for availability reasons fallback to standard flow
                            if (e instanceof NativeAuthError && e.isFatal()) {
                                _this.nativeExtensionProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt
                                var silentIframeClient = _this.createSilentIframeClient(validRequest.correlationId);
                                return silentIframeClient.acquireToken(validRequest);
                            }
                            throw e;
                        });
                    }
                    else {
                        silentIframeClient = this.createSilentIframeClient(validRequest.correlationId);
                        result = silentIframeClient.acquireToken(validRequest);
                    }
                    return [2 /*return*/, result.then(function (response) {
                            _this.eventHandler.emitEvent(exports.EventType.SSO_SILENT_SUCCESS, exports.InteractionType.Silent, response);
                            ssoSilentMeasurement.endMeasurement({
                                success: true,
                                isNativeBroker: response.fromNativeBroker,
                                accessTokenSize: response.accessToken.length,
                                idTokenSize: response.idToken.length
                            });
                            ssoSilentMeasurement.flushMeasurement();
                            return response;
                        }).catch(function (e) {
                            _this.eventHandler.emitEvent(exports.EventType.SSO_SILENT_FAILURE, exports.InteractionType.Silent, null, e);
                            ssoSilentMeasurement.endMeasurement({
                                errorCode: e.errorCode,
                                subErrorCode: e.subError,
                                success: false
                            });
                            ssoSilentMeasurement.flushMeasurement();
                            throw e;
                        })];
                });
            });
        };
        /**
         * This function redeems an authorization code (passed as code) from the eSTS token endpoint.
         * This authorization code should be acquired server-side using a confidential client to acquire a spa_code.
         * This API is not indended for normal authorization code acquisition and redemption.
         *
         * Redemption of this authorization code will not require PKCE, as it was acquired by a confidential client.
         *
         * @param request {@link AuthorizationCodeRequest}
         * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.
         */
        ClientApplication.prototype.acquireTokenByCode = function (request) {
            return __awaiter$1(this, void 0, void 0, function () {
                var correlationId, atbcMeasurement, hybridAuthCode_1, response;
                var _this = this;
                return __generator$1(this, function (_a) {
                    correlationId = this.getRequestCorrelationId(request);
                    this.preflightBrowserEnvironmentCheck(exports.InteractionType.Silent);
                    this.logger.trace("acquireTokenByCode called", correlationId);
                    this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_BY_CODE_START, exports.InteractionType.Silent, request);
                    atbcMeasurement = this.performanceClient.startMeasurement(exports.PerformanceEvents.AcquireTokenByCode, request.correlationId);
                    try {
                        if (request.code) {
                            hybridAuthCode_1 = request.code;
                            response = this.hybridAuthCodeResponses.get(hybridAuthCode_1);
                            if (!response) {
                                this.logger.verbose("Initiating new acquireTokenByCode request", correlationId);
                                response = this.acquireTokenByCodeAsync(__assign$1(__assign$1({}, request), { correlationId: correlationId }))
                                    .then(function (result) {
                                    _this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_BY_CODE_SUCCESS, exports.InteractionType.Silent, result);
                                    _this.hybridAuthCodeResponses.delete(hybridAuthCode_1);
                                    atbcMeasurement.endMeasurement({
                                        success: true,
                                        accessTokenSize: result.accessToken.length,
                                        idTokenSize: result.idToken.length,
                                        isNativeBroker: result.fromNativeBroker
                                    });
                                    atbcMeasurement.flushMeasurement();
                                    return result;
                                })
                                    .catch(function (error) {
                                    _this.hybridAuthCodeResponses.delete(hybridAuthCode_1);
                                    _this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_BY_CODE_FAILURE, exports.InteractionType.Silent, null, error);
                                    atbcMeasurement.endMeasurement({
                                        errorCode: error.errorCode,
                                        subErrorCode: error.subError,
                                        success: false
                                    });
                                    atbcMeasurement.flushMeasurement();
                                    throw error;
                                });
                                this.hybridAuthCodeResponses.set(hybridAuthCode_1, response);
                            }
                            else {
                                this.logger.verbose("Existing acquireTokenByCode request found", request.correlationId);
                                atbcMeasurement.endMeasurement({
                                    success: true
                                });
                                atbcMeasurement.discardMeasurement();
                            }
                            return [2 /*return*/, response];
                        }
                        else if (request.nativeAccountId) {
                            if (this.canUseNative(request, request.nativeAccountId)) {
                                return [2 /*return*/, this.acquireTokenNative(request, exports.ApiId.acquireTokenByCode, request.nativeAccountId).catch(function (e) {
                                        // If native token acquisition fails for availability reasons fallback to standard flow
                                        if (e instanceof NativeAuthError && e.isFatal()) {
                                            _this.nativeExtensionProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt
                                        }
                                        throw e;
                                    })];
                            }
                            else {
                                throw BrowserAuthError.createUnableToAcquireTokenFromNativePlatformError();
                            }
                        }
                        else {
                            throw BrowserAuthError.createAuthCodeOrNativeAccountIdRequiredError();
                        }
                    }
                    catch (e) {
                        this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_BY_CODE_FAILURE, exports.InteractionType.Silent, null, e);
                        atbcMeasurement.endMeasurement({
                            errorCode: e instanceof AuthError && e.errorCode || undefined,
                            subErrorCode: e instanceof AuthError && e.subError || undefined,
                            success: false
                        });
                        throw e;
                    }
                    return [2 /*return*/];
                });
            });
        };
        /**
         * Creates a SilentAuthCodeClient to redeem an authorization code.
         * @param request
         * @returns Result of the operation to redeem the authorization code
         */
        ClientApplication.prototype.acquireTokenByCodeAsync = function (request) {
            return __awaiter$1(this, void 0, void 0, function () {
                var silentAuthCodeClient, silentTokenResult;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            this.logger.trace("acquireTokenByCodeAsync called", request.correlationId);
                            silentAuthCodeClient = this.createSilentAuthCodeClient(request.correlationId);
                            return [4 /*yield*/, silentAuthCodeClient.acquireToken(request)];
                        case 1:
                            silentTokenResult = _a.sent();
                            return [2 /*return*/, silentTokenResult];
                    }
                });
            });
        };
        /**
         * Use this function to obtain a token before every call to the API / resource provider
         *
         * MSAL return's a cached token when available
         * Or it send's a request to the STS to obtain a new token using a refresh token.
         *
         * @param {@link SilentRequest}
         *
         * To renew idToken, please pass clientId as the only scope in the Authentication Parameters
         * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.
         */
        ClientApplication.prototype.acquireTokenByRefreshToken = function (request) {
            return __awaiter$1(this, void 0, void 0, function () {
                var atbrtMeasurement, silentRefreshClient;
                var _this = this;
                return __generator$1(this, function (_a) {
                    // block the reload if it occurred inside a hidden iframe
                    BrowserUtils.blockReloadInHiddenIframes();
                    atbrtMeasurement = this.performanceClient.startMeasurement(exports.PerformanceEvents.AcquireTokenByRefreshToken, request.correlationId);
                    this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_NETWORK_START, exports.InteractionType.Silent, request);
                    silentRefreshClient = this.createSilentRefreshClient(request.correlationId);
                    return [2 /*return*/, silentRefreshClient.acquireToken(request)
                            .then(function (result) {
                            atbrtMeasurement.endMeasurement({
                                success: true,
                                fromCache: result.fromCache,
                                accessTokenSize: result.accessToken.length,
                                idTokenSize: result.idToken.length,
                            });
                            return result;
                        })
                            .catch(function (e) {
                            var isServerError = e instanceof ServerError;
                            var isInteractionRequiredError = e instanceof InteractionRequiredAuthError;
                            var isInvalidGrantError = (e.errorCode === BrowserConstants.INVALID_GRANT_ERROR);
                            if (isServerError && isInvalidGrantError && !isInteractionRequiredError) {
                                _this.logger.verbose("Refresh token expired or invalid, attempting acquire token by iframe", request.correlationId);
                                var silentIframeClient = _this.createSilentIframeClient(request.correlationId);
                                return silentIframeClient.acquireToken(request)
                                    .then(function (result) {
                                    atbrtMeasurement.endMeasurement({
                                        success: true,
                                        fromCache: result.fromCache,
                                        accessTokenSize: result.accessToken.length,
                                        idTokenSize: result.idToken.length,
                                    });
                                    return result;
                                })
                                    .catch(function (error) {
                                    atbrtMeasurement.endMeasurement({
                                        errorCode: error.errorCode,
                                        subErrorCode: error.subError,
                                        success: false
                                    });
                                    throw error;
                                });
                            }
                            atbrtMeasurement.endMeasurement({
                                success: false
                            });
                            throw e;
                        })];
                });
            });
        };
        // #endregion
        // #region Logout
        /**
         * Deprecated logout function. Use logoutRedirect or logoutPopup instead
         * @param logoutRequest
         * @deprecated
         */
        ClientApplication.prototype.logout = function (logoutRequest) {
            return __awaiter$1(this, void 0, void 0, function () {
                var correlationId;
                return __generator$1(this, function (_a) {
                    correlationId = this.getRequestCorrelationId(logoutRequest);
                    this.logger.warning("logout API is deprecated and will be removed in msal-browser v3.0.0. Use logoutRedirect instead.", correlationId);
                    return [2 /*return*/, this.logoutRedirect(__assign$1({ correlationId: correlationId }, logoutRequest))];
                });
            });
        };
        /**
         * Use to log out the current user, and redirect the user to the postLogoutRedirectUri.
         * Default behaviour is to redirect the user to `window.location.href`.
         * @param logoutRequest
         */
        ClientApplication.prototype.logoutRedirect = function (logoutRequest) {
            return __awaiter$1(this, void 0, void 0, function () {
                var correlationId, redirectClient;
                return __generator$1(this, function (_a) {
                    correlationId = this.getRequestCorrelationId(logoutRequest);
                    this.preflightBrowserEnvironmentCheck(exports.InteractionType.Redirect);
                    redirectClient = this.createRedirectClient(correlationId);
                    return [2 /*return*/, redirectClient.logout(logoutRequest)];
                });
            });
        };
        /**
         * Clears local cache for the current user then opens a popup window prompting the user to sign-out of the server
         * @param logoutRequest
         */
        ClientApplication.prototype.logoutPopup = function (logoutRequest) {
            try {
                var correlationId = this.getRequestCorrelationId(logoutRequest);
                this.preflightBrowserEnvironmentCheck(exports.InteractionType.Popup);
                var popupClient = this.createPopupClient(correlationId);
                return popupClient.logout(logoutRequest);
            }
            catch (e) {
                // Since this function is syncronous we need to reject
                return Promise.reject(e);
            }
        };
        // #endregion
        // #region Account APIs
        /**
         * Returns all accounts that MSAL currently has data for.
         * (the account object is created at the time of successful login)
         * or empty array when no accounts are found
         * @returns Array of account objects in cache
         */
        ClientApplication.prototype.getAllAccounts = function () {
            this.logger.verbose("getAllAccounts called");
            return this.isBrowserEnvironment ? this.browserStorage.getAllAccounts() : [];
        };
        /**
         * Returns the signed in account matching username.
         * (the account object is created at the time of successful login)
         * or null when no matching account is found.
         * This API is provided for convenience but getAccountById should be used for best reliability
         * @param userName
         * @returns The account object stored in MSAL
         */
        ClientApplication.prototype.getAccountByUsername = function (userName) {
            var allAccounts = this.getAllAccounts();
            if (!StringUtils.isEmpty(userName) && allAccounts && allAccounts.length) {
                this.logger.verbose("Account matching username found, returning");
                this.logger.verbosePii("Returning signed-in accounts matching username: " + userName);
                return allAccounts.filter(function (accountObj) { return accountObj.username.toLowerCase() === userName.toLowerCase(); })[0] || null;
            }
            else {
                this.logger.verbose("getAccountByUsername: No matching account found, returning null");
                return null;
            }
        };
        /**
         * Returns the signed in account matching homeAccountId.
         * (the account object is created at the time of successful login)
         * or null when no matching account is found
         * @param homeAccountId
         * @returns The account object stored in MSAL
         */
        ClientApplication.prototype.getAccountByHomeId = function (homeAccountId) {
            var allAccounts = this.getAllAccounts();
            if (!StringUtils.isEmpty(homeAccountId) && allAccounts && allAccounts.length) {
                this.logger.verbose("Account matching homeAccountId found, returning");
                this.logger.verbosePii("Returning signed-in accounts matching homeAccountId: " + homeAccountId);
                return allAccounts.filter(function (accountObj) { return accountObj.homeAccountId === homeAccountId; })[0] || null;
            }
            else {
                this.logger.verbose("getAccountByHomeId: No matching account found, returning null");
                return null;
            }
        };
        /**
         * Returns the signed in account matching localAccountId.
         * (the account object is created at the time of successful login)
         * or null when no matching account is found
         * @param localAccountId
         * @returns The account object stored in MSAL
         */
        ClientApplication.prototype.getAccountByLocalId = function (localAccountId) {
            var allAccounts = this.getAllAccounts();
            if (!StringUtils.isEmpty(localAccountId) && allAccounts && allAccounts.length) {
                this.logger.verbose("Account matching localAccountId found, returning");
                this.logger.verbosePii("Returning signed-in accounts matching localAccountId: " + localAccountId);
                return allAccounts.filter(function (accountObj) { return accountObj.localAccountId === localAccountId; })[0] || null;
            }
            else {
                this.logger.verbose("getAccountByLocalId: No matching account found, returning null");
                return null;
            }
        };
        /**
         * Sets the account to use as the active account. If no account is passed to the acquireToken APIs, then MSAL will use this active account.
         * @param account
         */
        ClientApplication.prototype.setActiveAccount = function (account) {
            this.browserStorage.setActiveAccount(account);
        };
        /**
         * Gets the currently active account
         */
        ClientApplication.prototype.getActiveAccount = function () {
            return this.browserStorage.getActiveAccount();
        };
        // #endregion
        // #region Helpers
        /**
         * Helper to validate app environment before making an auth request
         *
         * @protected
         * @param {InteractionType} interactionType What kind of interaction is being used
         * @param {boolean} [setInteractionInProgress=true] Whether to set interaction in progress temp cache flag
         */
        ClientApplication.prototype.preflightBrowserEnvironmentCheck = function (interactionType, setInteractionInProgress) {
            if (setInteractionInProgress === void 0) { setInteractionInProgress = true; }
            this.logger.verbose("preflightBrowserEnvironmentCheck started");
            // Block request if not in browser environment
            BrowserUtils.blockNonBrowserEnvironment(this.isBrowserEnvironment);
            // Block redirects if in an iframe
            BrowserUtils.blockRedirectInIframe(interactionType, this.config.system.allowRedirectInIframe);
            // Block auth requests inside a hidden iframe
            BrowserUtils.blockReloadInHiddenIframes();
            // Block redirectUri opened in a popup from calling MSAL APIs
            BrowserUtils.blockAcquireTokenInPopups();
            // Block token acquisition before initialize has been called if native brokering is enabled
            BrowserUtils.blockNativeBrokerCalledBeforeInitialized(this.config.system.allowNativeBroker, this.initialized);
            // Block redirects if memory storage is enabled but storeAuthStateInCookie is not
            if (interactionType === exports.InteractionType.Redirect &&
                this.config.cache.cacheLocation === exports.BrowserCacheLocation.MemoryStorage &&
                !this.config.cache.storeAuthStateInCookie) {
                throw BrowserConfigurationAuthError.createInMemoryRedirectUnavailableError();
            }
            if (interactionType === exports.InteractionType.Redirect || interactionType === exports.InteractionType.Popup) {
                this.preflightInteractiveRequest(setInteractionInProgress);
            }
        };
        /**
         * Preflight check for interactive requests
         *
         * @protected
         * @param {boolean} setInteractionInProgress Whether to set interaction in progress temp cache flag
         */
        ClientApplication.prototype.preflightInteractiveRequest = function (setInteractionInProgress) {
            this.logger.verbose("preflightInteractiveRequest called, validating app environment");
            // block the reload if it occurred inside a hidden iframe
            BrowserUtils.blockReloadInHiddenIframes();
            // Set interaction in progress temporary cache or throw if alread set.
            if (setInteractionInProgress) {
                this.browserStorage.setInteractionInProgress(true);
            }
        };
        /**
         * Acquire a token from native device (e.g. WAM)
         * @param request
         */
        ClientApplication.prototype.acquireTokenNative = function (request, apiId, accountId) {
            return __awaiter$1(this, void 0, void 0, function () {
                var nativeClient;
                return __generator$1(this, function (_a) {
                    this.logger.trace("acquireTokenNative called");
                    if (!this.nativeExtensionProvider) {
                        throw BrowserAuthError.createNativeConnectionNotEstablishedError();
                    }
                    nativeClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, apiId, this.performanceClient, this.nativeExtensionProvider, accountId || this.getNativeAccountId(request), this.nativeInternalStorage, request.correlationId);
                    return [2 /*return*/, nativeClient.acquireToken(request)];
                });
            });
        };
        /**
         * Returns boolean indicating if this request can use the native broker
         * @param request
         */
        ClientApplication.prototype.canUseNative = function (request, accountId) {
            this.logger.trace("canUseNative called");
            if (!NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeExtensionProvider, request.authenticationScheme)) {
                this.logger.trace("canUseNative: isNativeAvailable returned false, returning false");
                return false;
            }
            if (request.prompt) {
                switch (request.prompt) {
                    case PromptValue.NONE:
                    case PromptValue.CONSENT:
                    case PromptValue.LOGIN:
                        this.logger.trace("canUseNative: prompt is compatible with native flow");
                        break;
                    default:
                        this.logger.trace("canUseNative: prompt = " + request.prompt + " is not compatible with native flow, returning false");
                        return false;
                }
            }
            if (!accountId && !this.getNativeAccountId(request)) {
                this.logger.trace("canUseNative: nativeAccountId is not available, returning false");
                return false;
            }
            return true;
        };
        /**
         * Get the native accountId from the account
         * @param request
         * @returns
         */
        ClientApplication.prototype.getNativeAccountId = function (request) {
            var account = request.account || this.browserStorage.getAccountInfoByHints(request.loginHint, request.sid) || this.getActiveAccount();
            return account && account.nativeAccountId || "";
        };
        /**
         * Returns new instance of the Popup Interaction Client
         * @param correlationId
         */
        ClientApplication.prototype.createPopupClient = function (correlationId) {
            return new PopupClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, this.performanceClient, this.nativeInternalStorage, this.nativeExtensionProvider, correlationId);
        };
        /**
         * Returns new instance of the Redirect Interaction Client
         * @param correlationId
         */
        ClientApplication.prototype.createRedirectClient = function (correlationId) {
            return new RedirectClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, this.performanceClient, this.nativeInternalStorage, this.nativeExtensionProvider, correlationId);
        };
        /**
         * Returns new instance of the Silent Iframe Interaction Client
         * @param correlationId
         */
        ClientApplication.prototype.createSilentIframeClient = function (correlationId) {
            return new SilentIframeClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, exports.ApiId.ssoSilent, this.performanceClient, this.nativeInternalStorage, this.nativeExtensionProvider, correlationId);
        };
        /**
         * Returns new instance of the Silent Cache Interaction Client
         */
        ClientApplication.prototype.createSilentCacheClient = function (correlationId) {
            return new SilentCacheClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, this.performanceClient, this.nativeExtensionProvider, correlationId);
        };
        /**
         * Returns new instance of the Silent Refresh Interaction Client
         */
        ClientApplication.prototype.createSilentRefreshClient = function (correlationId) {
            return new SilentRefreshClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, this.performanceClient, this.nativeExtensionProvider, correlationId);
        };
        /**
         * Returns new instance of the Silent AuthCode Interaction Client
         */
        ClientApplication.prototype.createSilentAuthCodeClient = function (correlationId) {
            return new SilentAuthCodeClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, exports.ApiId.acquireTokenByCode, this.performanceClient, this.nativeExtensionProvider, correlationId);
        };
        /**
         * Adds event callbacks to array
         * @param callback
         */
        ClientApplication.prototype.addEventCallback = function (callback) {
            return this.eventHandler.addEventCallback(callback);
        };
        /**
         * Removes callback with provided id from callback array
         * @param callbackId
         */
        ClientApplication.prototype.removeEventCallback = function (callbackId) {
            this.eventHandler.removeEventCallback(callbackId);
        };
        /**
         * Registers a callback to receive performance events.
         *
         * @param {PerformanceCallbackFunction} callback
         * @returns {string}
         */
        ClientApplication.prototype.addPerformanceCallback = function (callback) {
            return this.performanceClient.addPerformanceCallback(callback);
        };
        /**
         * Removes a callback registered with addPerformanceCallback.
         *
         * @param {string} callbackId
         * @returns {boolean}
         */
        ClientApplication.prototype.removePerformanceCallback = function (callbackId) {
            return this.performanceClient.removePerformanceCallback(callbackId);
        };
        /**
         * Adds event listener that emits an event when a user account is added or removed from localstorage in a different browser tab or window
         */
        ClientApplication.prototype.enableAccountStorageEvents = function () {
            this.eventHandler.enableAccountStorageEvents();
        };
        /**
         * Removes event listener that emits an event when a user account is added or removed from localstorage in a different browser tab or window
         */
        ClientApplication.prototype.disableAccountStorageEvents = function () {
            this.eventHandler.disableAccountStorageEvents();
        };
        /**
         * Gets the token cache for the application.
         */
        ClientApplication.prototype.getTokenCache = function () {
            return this.tokenCache;
        };
        /**
         * Returns the logger instance
         */
        ClientApplication.prototype.getLogger = function () {
            return this.logger;
        };
        /**
         * Replaces the default logger set in configurations with new Logger with new configurations
         * @param logger Logger instance
         */
        ClientApplication.prototype.setLogger = function (logger) {
            this.logger = logger;
        };
        /**
         * Called by wrapper libraries (Angular & React) to set SKU and Version passed down to telemetry, logger, etc.
         * @param sku
         * @param version
         */
        ClientApplication.prototype.initializeWrapperLibrary = function (sku, version) {
            // Validate the SKU passed in is one we expect
            this.browserStorage.setWrapperMetadata(sku, version);
        };
        /**
         * Sets navigation client
         * @param navigationClient
         */
        ClientApplication.prototype.setNavigationClient = function (navigationClient) {
            this.navigationClient = navigationClient;
        };
        /**
         * Returns the configuration object
         */
        ClientApplication.prototype.getConfiguration = function () {
            return this.config;
        };
        /**
         * Generates a correlation id for a request if none is provided.
         *
         * @protected
         * @param {?Partial<BaseAuthRequest>} [request]
         * @returns {string}
         */
        ClientApplication.prototype.getRequestCorrelationId = function (request) {
            if (request === null || request === void 0 ? void 0 : request.correlationId) {
                return request.correlationId;
            }
            if (this.isBrowserEnvironment) {
                return this.browserCrypto.createNewGuid();
            }
            /*
             * Included for fallback for non-browser environments,
             * and to ensure this method always returns a string.
             */
            return Constants.EMPTY_STRING;
        };
        return ClientApplication;
    }());

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    /**
     * The PublicClientApplication class is the object exposed by the library to perform authentication and authorization functions in Single Page Applications
     * to obtain JWT tokens as described in the OAuth 2.0 Authorization Code Flow with PKCE specification.
     */
    var PublicClientApplication = /** @class */ (function (_super) {
        __extends$1(PublicClientApplication, _super);
        /**
         * @constructor
         * Constructor for the PublicClientApplication used to instantiate the PublicClientApplication object
         *
         * Important attributes in the Configuration object for auth are:
         * - clientID: the application ID of your application. You can obtain one by registering your application with our Application registration portal : https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredAppsPreview
         * - authority: the authority URL for your application.
         * - redirect_uri: the uri of your application registered in the portal.
         *
         * In Azure AD, authority is a URL indicating the Azure active directory that MSAL uses to obtain tokens.
         * It is of the form https://login.microsoftonline.com/{Enter_the_Tenant_Info_Here}
         * If your application supports Accounts in one organizational directory, replace "Enter_the_Tenant_Info_Here" value with the Tenant Id or Tenant name (for example, contoso.microsoft.com).
         * If your application supports Accounts in any organizational directory, replace "Enter_the_Tenant_Info_Here" value with organizations.
         * If your application supports Accounts in any organizational directory and personal Microsoft accounts, replace "Enter_the_Tenant_Info_Here" value with common.
         * To restrict support to Personal Microsoft accounts only, replace "Enter_the_Tenant_Info_Here" value with consumers.
         *
         * In Azure B2C, authority is of the form https://{instance}/tfp/{tenant}/{policyName}/
         * Full B2C functionality will be available in this library in future versions.
         *
         * @param configuration object for the MSAL PublicClientApplication instance
         */
        function PublicClientApplication(configuration) {
            var _this = _super.call(this, configuration) || this;
            _this.activeSilentTokenRequests = new Map();
            return _this;
        }
        /**
         * Use when initiating the login process by redirecting the user's browser to the authorization endpoint. This function redirects the page, so
         * any code that follows this function will not execute.
         *
         * IMPORTANT: It is NOT recommended to have code that is dependent on the resolution of the Promise. This function will navigate away from the current
         * browser window. It currently returns a Promise in order to reflect the asynchronous nature of the code running in this function.
         *
         * @param request
         */
        PublicClientApplication.prototype.loginRedirect = function (request) {
            return __awaiter$1(this, void 0, void 0, function () {
                var correlationId;
                return __generator$1(this, function (_a) {
                    correlationId = this.getRequestCorrelationId(request);
                    this.logger.verbose("loginRedirect called", correlationId);
                    return [2 /*return*/, this.acquireTokenRedirect(__assign$1({ correlationId: correlationId }, (request || DEFAULT_REQUEST)))];
                });
            });
        };
        /**
         * Use when initiating the login process via opening a popup window in the user's browser
         *
         * @param request
         *
         * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.
         */
        PublicClientApplication.prototype.loginPopup = function (request) {
            var correlationId = this.getRequestCorrelationId(request);
            this.logger.verbose("loginPopup called", correlationId);
            return this.acquireTokenPopup(__assign$1({ correlationId: correlationId }, (request || DEFAULT_REQUEST)));
        };
        /**
         * Silently acquire an access token for a given set of scopes. Returns currently processing promise if parallel requests are made.
         *
         * @param {@link (SilentRequest:type)}
         * @returns {Promise.<AuthenticationResult>} - a promise that is fulfilled when this function has completed, or rejected if an error was raised. Returns the {@link AuthResponse} object
         */
        PublicClientApplication.prototype.acquireTokenSilent = function (request) {
            return __awaiter$1(this, void 0, void 0, function () {
                var correlationId, atsMeasurement, account, thumbprint, silentRequestKey, cachedResponse, response;
                var _this = this;
                return __generator$1(this, function (_a) {
                    correlationId = this.getRequestCorrelationId(request);
                    atsMeasurement = this.performanceClient.startMeasurement(exports.PerformanceEvents.AcquireTokenSilent, correlationId);
                    this.preflightBrowserEnvironmentCheck(exports.InteractionType.Silent);
                    this.logger.verbose("acquireTokenSilent called", correlationId);
                    account = request.account || this.getActiveAccount();
                    if (!account) {
                        throw BrowserAuthError.createNoAccountError();
                    }
                    thumbprint = {
                        clientId: this.config.auth.clientId,
                        authority: request.authority || Constants.EMPTY_STRING,
                        scopes: request.scopes,
                        homeAccountIdentifier: account.homeAccountId,
                        claims: request.claims,
                        authenticationScheme: request.authenticationScheme,
                        resourceRequestMethod: request.resourceRequestMethod,
                        resourceRequestUri: request.resourceRequestUri,
                        shrClaims: request.shrClaims,
                        sshKid: request.sshKid
                    };
                    silentRequestKey = JSON.stringify(thumbprint);
                    cachedResponse = this.activeSilentTokenRequests.get(silentRequestKey);
                    if (typeof cachedResponse === "undefined") {
                        this.logger.verbose("acquireTokenSilent called for the first time, storing active request", correlationId);
                        response = this.acquireTokenSilentAsync(__assign$1(__assign$1({}, request), { correlationId: correlationId }), account)
                            .then(function (result) {
                            _this.activeSilentTokenRequests.delete(silentRequestKey);
                            atsMeasurement.endMeasurement({
                                success: true,
                                fromCache: result.fromCache,
                                accessTokenSize: result.accessToken.length,
                                idTokenSize: result.idToken.length,
                                isNativeBroker: result.fromNativeBroker
                            });
                            atsMeasurement.flushMeasurement();
                            return result;
                        })
                            .catch(function (error) {
                            _this.activeSilentTokenRequests.delete(silentRequestKey);
                            atsMeasurement.endMeasurement({
                                success: false
                            });
                            atsMeasurement.flushMeasurement();
                            throw error;
                        });
                        this.activeSilentTokenRequests.set(silentRequestKey, response);
                        return [2 /*return*/, response];
                    }
                    else {
                        this.logger.verbose("acquireTokenSilent has been called previously, returning the result from the first call", correlationId);
                        atsMeasurement.endMeasurement({
                            success: true
                        });
                        // Discard measurements for memoized calls, as they are usually only a couple of ms and will artificially deflate metrics
                        atsMeasurement.discardMeasurement();
                        return [2 /*return*/, cachedResponse];
                    }
                });
            });
        };
        /**
         * Silently acquire an access token for a given set of scopes. Will use cached token if available, otherwise will attempt to acquire a new token from the network via refresh token.
         * @param {@link (SilentRequest:type)}
         * @param {@link (AccountInfo:type)}
         * @returns {Promise.<AuthenticationResult>} - a promise that is fulfilled when this function has completed, or rejected if an error was raised. Returns the {@link AuthResponse}
         */
        PublicClientApplication.prototype.acquireTokenSilentAsync = function (request, account) {
            return __awaiter$1(this, void 0, void 0, function () {
                var astsAsyncMeasurement, result, silentRequest, silentCacheClient, silentRequest_1;
                var _this = this;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_START, exports.InteractionType.Silent, request);
                            astsAsyncMeasurement = this.performanceClient.startMeasurement(exports.PerformanceEvents.AcquireTokenSilentAsync, request.correlationId);
                            if (!(NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeExtensionProvider, request.authenticationScheme) && account.nativeAccountId)) return [3 /*break*/, 1];
                            this.logger.verbose("acquireTokenSilent - attempting to acquire token from native platform");
                            silentRequest = __assign$1(__assign$1({}, request), { account: account });
                            result = this.acquireTokenNative(silentRequest, exports.ApiId.acquireTokenSilent_silentFlow).catch(function (e) { return __awaiter$1(_this, void 0, void 0, function () {
                                var silentIframeClient;
                                return __generator$1(this, function (_a) {
                                    // If native token acquisition fails for availability reasons fallback to web flow
                                    if (e instanceof NativeAuthError && e.isFatal()) {
                                        this.logger.verbose("acquireTokenSilent - native platform unavailable, falling back to web flow");
                                        this.nativeExtensionProvider = undefined; // Prevent future requests from continuing to attempt 
                                        silentIframeClient = this.createSilentIframeClient(request.correlationId);
                                        return [2 /*return*/, silentIframeClient.acquireToken(request)];
                                    }
                                    throw e;
                                });
                            }); });
                            return [3 /*break*/, 3];
                        case 1:
                            this.logger.verbose("acquireTokenSilent - attempting to acquire token from web flow");
                            silentCacheClient = this.createSilentCacheClient(request.correlationId);
                            return [4 /*yield*/, silentCacheClient.initializeSilentRequest(request, account)];
                        case 2:
                            silentRequest_1 = _a.sent();
                            result = silentCacheClient.acquireToken(silentRequest_1).catch(function () { return __awaiter$1(_this, void 0, void 0, function () {
                                return __generator$1(this, function (_a) {
                                    return [2 /*return*/, this.acquireTokenByRefreshToken(silentRequest_1)];
                                });
                            }); });
                            _a.label = 3;
                        case 3: return [2 /*return*/, result.then(function (response) {
                                _this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_SUCCESS, exports.InteractionType.Silent, response);
                                astsAsyncMeasurement.endMeasurement({
                                    success: true,
                                    fromCache: response.fromCache,
                                    accessTokenSize: response.accessToken.length,
                                    idTokenSize: response.idToken.length,
                                    isNativeBroker: response.fromNativeBroker
                                });
                                return response;
                            }).catch(function (tokenRenewalError) {
                                _this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_FAILURE, exports.InteractionType.Silent, null, tokenRenewalError);
                                astsAsyncMeasurement.endMeasurement({
                                    errorCode: tokenRenewalError.errorCode,
                                    subErrorCode: tokenRenewalError.subError,
                                    success: false
                                });
                                throw tokenRenewalError;
                            })];
                    }
                });
            });
        };
        return PublicClientApplication;
    }(ClientApplication));

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var stubbedPublicClientApplication = {
        initialize: function () {
            return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
        },
        acquireTokenPopup: function () {
            return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
        },
        acquireTokenRedirect: function () {
            return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
        },
        acquireTokenSilent: function () {
            return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
        },
        acquireTokenByCode: function () {
            return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
        },
        getAllAccounts: function () {
            return [];
        },
        getAccountByHomeId: function () {
            return null;
        },
        getAccountByUsername: function () {
            return null;
        },
        getAccountByLocalId: function () {
            return null;
        },
        handleRedirectPromise: function () {
            return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
        },
        loginPopup: function () {
            return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
        },
        loginRedirect: function () {
            return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
        },
        logout: function () {
            return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
        },
        logoutRedirect: function () {
            return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
        },
        logoutPopup: function () {
            return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
        },
        ssoSilent: function () {
            return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
        },
        addEventCallback: function () {
            return null;
        },
        removeEventCallback: function () {
            return;
        },
        addPerformanceCallback: function () {
            return "";
        },
        removePerformanceCallback: function () {
            return false;
        },
        enableAccountStorageEvents: function () {
            return;
        },
        disableAccountStorageEvents: function () {
            return;
        },
        getTokenCache: function () {
            throw BrowserConfigurationAuthError.createStubPcaInstanceCalledError();
        },
        getLogger: function () {
            throw BrowserConfigurationAuthError.createStubPcaInstanceCalledError();
        },
        setLogger: function () {
            return;
        },
        setActiveAccount: function () {
            return;
        },
        getActiveAccount: function () {
            return null;
        },
        initializeWrapperLibrary: function () {
            return;
        },
        setNavigationClient: function () {
            return;
        },
        getConfiguration: function () {
            throw BrowserConfigurationAuthError.createStubPcaInstanceCalledError();
        }
    };

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var EventMessageUtils = /** @class */ (function () {
        function EventMessageUtils() {
        }
        /**
         * Gets interaction status from event message
         * @param message
         * @param currentStatus
         */
        EventMessageUtils.getInteractionStatusFromEvent = function (message, currentStatus) {
            switch (message.eventType) {
                case exports.EventType.LOGIN_START:
                    return exports.InteractionStatus.Login;
                case exports.EventType.SSO_SILENT_START:
                    return exports.InteractionStatus.SsoSilent;
                case exports.EventType.ACQUIRE_TOKEN_START:
                    if (message.interactionType === exports.InteractionType.Redirect || message.interactionType === exports.InteractionType.Popup) {
                        return exports.InteractionStatus.AcquireToken;
                    }
                    break;
                case exports.EventType.HANDLE_REDIRECT_START:
                    return exports.InteractionStatus.HandleRedirect;
                case exports.EventType.LOGOUT_START:
                    return exports.InteractionStatus.Logout;
                case exports.EventType.SSO_SILENT_SUCCESS:
                case exports.EventType.SSO_SILENT_FAILURE:
                    if (currentStatus && currentStatus !== exports.InteractionStatus.SsoSilent) {
                        // Prevent this event from clearing any status other than ssoSilent
                        break;
                    }
                    return exports.InteractionStatus.None;
                case exports.EventType.LOGOUT_END:
                    if (currentStatus && currentStatus !== exports.InteractionStatus.Logout) {
                        // Prevent this event from clearing any status other than logout
                        break;
                    }
                    return exports.InteractionStatus.None;
                case exports.EventType.HANDLE_REDIRECT_END:
                    if (currentStatus && currentStatus !== exports.InteractionStatus.HandleRedirect) {
                        // Prevent this event from clearing any status other than handleRedirect
                        break;
                    }
                    return exports.InteractionStatus.None;
                case exports.EventType.LOGIN_SUCCESS:
                case exports.EventType.LOGIN_FAILURE:
                case exports.EventType.ACQUIRE_TOKEN_SUCCESS:
                case exports.EventType.ACQUIRE_TOKEN_FAILURE:
                    if (message.interactionType === exports.InteractionType.Redirect || message.interactionType === exports.InteractionType.Popup) {
                        if (currentStatus && currentStatus !== exports.InteractionStatus.Login && currentStatus !== exports.InteractionStatus.AcquireToken) {
                            // Prevent this event from clearing any status other than login or acquireToken
                            break;
                        }
                        return exports.InteractionStatus.None;
                    }
                    break;
            }
            return null;
        };
        return EventMessageUtils;
    }());

    /*
     * Copyright (c) Microsoft Corporation. All rights reserved.
     * Licensed under the MIT License.
     */
    var SignedHttpRequest = /** @class */ (function () {
        function SignedHttpRequest(shrParameters, shrOptions) {
            var loggerOptions = (shrOptions && shrOptions.loggerOptions) || {};
            this.logger = new Logger(loggerOptions, name, version);
            this.cryptoOps = new CryptoOps(this.logger);
            this.popTokenGenerator = new PopTokenGenerator(this.cryptoOps);
            this.shrParameters = shrParameters;
        }
        /**
         * Generates and caches a keypair for the given request options.
         * @returns Public key digest, which should be sent to the token issuer.
         */
        SignedHttpRequest.prototype.generatePublicKeyThumbprint = function () {
            return __awaiter$1(this, void 0, void 0, function () {
                var kid;
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.popTokenGenerator.generateKid(this.shrParameters)];
                        case 1:
                            kid = (_a.sent()).kid;
                            return [2 /*return*/, kid];
                    }
                });
            });
        };
        /**
         * Generates a signed http request for the given payload with the given key.
         * @param payload Payload to sign (e.g. access token)
         * @param publicKeyThumbprint Public key digest (from generatePublicKeyThumbprint API)
         * @param claims Additional claims to include/override in the signed JWT
         * @returns Pop token signed with the corresponding private key
         */
        SignedHttpRequest.prototype.signRequest = function (payload, publicKeyThumbprint, claims) {
            return __awaiter$1(this, void 0, void 0, function () {
                return __generator$1(this, function (_a) {
                    return [2 /*return*/, this.popTokenGenerator.signPayload(payload, publicKeyThumbprint, this.shrParameters, claims)];
                });
            });
        };
        /**
         * Removes cached keys from browser for given public key thumbprint
         * @param publicKeyThumbprint Public key digest (from generatePublicKeyThumbprint API)
         * @returns If keys are properly deleted
         */
        SignedHttpRequest.prototype.removeKeys = function (publicKeyThumbprint) {
            return __awaiter$1(this, void 0, void 0, function () {
                return __generator$1(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.cryptoOps.removeTokenBindingKey(publicKeyThumbprint)];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        return SignedHttpRequest;
    }());

    exports.AccountEntity = AccountEntity;
    exports.AuthError = AuthError;
    exports.AuthErrorMessage = AuthErrorMessage;
    exports.AuthenticationHeaderParser = AuthenticationHeaderParser;
    exports.BrowserAuthError = BrowserAuthError;
    exports.BrowserAuthErrorMessage = BrowserAuthErrorMessage;
    exports.BrowserConfigurationAuthError = BrowserConfigurationAuthError;
    exports.BrowserConfigurationAuthErrorMessage = BrowserConfigurationAuthErrorMessage;
    exports.BrowserUtils = BrowserUtils;
    exports.ClientAuthError = ClientAuthError;
    exports.ClientAuthErrorMessage = ClientAuthErrorMessage;
    exports.ClientConfigurationError = ClientConfigurationError;
    exports.ClientConfigurationErrorMessage = ClientConfigurationErrorMessage;
    exports.DEFAULT_IFRAME_TIMEOUT_MS = DEFAULT_IFRAME_TIMEOUT_MS;
    exports.EventMessageUtils = EventMessageUtils;
    exports.InteractionRequiredAuthError = InteractionRequiredAuthError;
    exports.InteractionRequiredAuthErrorMessage = InteractionRequiredAuthErrorMessage;
    exports.Logger = Logger;
    exports.NavigationClient = NavigationClient;
    exports.OIDC_DEFAULT_SCOPES = OIDC_DEFAULT_SCOPES;
    exports.PublicClientApplication = PublicClientApplication;
    exports.ServerError = ServerError;
    exports.SignedHttpRequest = SignedHttpRequest;
    exports.StringUtils = StringUtils;
    exports.UrlString = UrlString;
    exports.internals = internals;
    exports.stubbedPublicClientApplication = stubbedPublicClientApplication;
    exports.version = version;

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

})));
//# sourceMappingURL=msal-browser.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
"use strict";!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).msal={})}(this,(function(e){
/*! *****************************************************************************
    Copyright (c) Microsoft Corporation.

    Permission to use, copy, modify, and/or distribute this software for any
    purpose with or without fee is hereby granted.

    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.
    ***************************************************************************** */
var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},t(e,r)};function r(e,r){function n(){this.constructor=e}t(e,r),e.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}var n=function(){return n=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},n.apply(this,arguments)};function o(e,t,r,n){return new(r||(r=Promise))((function(o,i){function a(e){try{c(n.next(e))}catch(e){i(e)}}function s(e){try{c(n.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(a,s)}c((n=n.apply(e,t||[])).next())}))}function i(e,t){var r,n,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(r)throw new TypeError("Generator is already executing.");for(;a;)try{if(r=1,n&&(o=2&i[0]?n.return:i[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,i[1])).done)return o;switch(n=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,n=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=a.trys,(o=o.length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){a.label=i[1];break}if(6===i[0]&&a.label<o[1]){a.label=o[1],o=i;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(i);break}o[2]&&a.ops.pop(),a.trys.pop();continue}i=t.call(e,a)}catch(e){i=[6,e],n=0}finally{r=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,s])}}}function a(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,o,i=r.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(n=i.next()).done;)a.push(n.value)}catch(e){o={error:e}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return a}function s(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(a(arguments[t]));return e}
/*! @azure/msal-common v7.3.0 2022-08-01 */
/*! *****************************************************************************
    Copyright (c) Microsoft Corporation.

    Permission to use, copy, modify, and/or distribute this software for any
    purpose with or without fee is hereby granted.

    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.
    ***************************************************************************** */var c=function(e,t){return c=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},c(e,t)};function u(e,t){function r(){this.constructor=e}c(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}var l=function(){return l=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},l.apply(this,arguments)};function d(e,t,r,n){return new(r||(r=Promise))((function(o,i){function a(e){try{c(n.next(e))}catch(e){i(e)}}function s(e){try{c(n.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(a,s)}c((n=n.apply(e,t||[])).next())}))}function h(e,t){var r,n,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(r)throw new TypeError("Generator is already executing.");for(;a;)try{if(r=1,n&&(o=2&i[0]?n.return:i[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,i[1])).done)return o;switch(n=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,n=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=a.trys,(o=o.length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){a.label=i[1];break}if(6===i[0]&&a.label<o[1]){a.label=o[1],o=i;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(i);break}o[2]&&a.ops.pop(),a.trys.pop();continue}i=t.call(e,a)}catch(e){i=[6,e],n=0}finally{r=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,s])}}}function p(){for(var e=0,t=0,r=arguments.length;t<r;t++)e+=arguments[t].length;var n=Array(e),o=0;for(t=0;t<r;t++)for(var i=arguments[t],a=0,s=i.length;a<s;a++,o++)n[o]=i[a];return n}
/*! @azure/msal-common v7.3.0 2022-08-01 */var g,f,m,v,y,E={LIBRARY_NAME:"MSAL.JS",SKU:"msal.js.common",CACHE_PREFIX:"msal",DEFAULT_AUTHORITY:"https://login.microsoftonline.com/common/",DEFAULT_AUTHORITY_HOST:"login.microsoftonline.com",DEFAULT_COMMON_TENANT:"common",ADFS:"adfs",AAD_INSTANCE_DISCOVERY_ENDPT:"https://login.microsoftonline.com/common/discovery/instance?api-version=1.1&authorization_endpoint=",RESOURCE_DELIM:"|",NO_ACCOUNT:"NO_ACCOUNT",CLAIMS:"claims",CONSUMER_UTID:"9188040d-6c67-4c5b-b112-36a304b66dad",OPENID_SCOPE:"openid",PROFILE_SCOPE:"profile",OFFLINE_ACCESS_SCOPE:"offline_access",EMAIL_SCOPE:"email",CODE_RESPONSE_TYPE:"code",CODE_GRANT_TYPE:"authorization_code",RT_GRANT_TYPE:"refresh_token",FRAGMENT_RESPONSE_MODE:"fragment",S256_CODE_CHALLENGE_METHOD:"S256",URL_FORM_CONTENT_TYPE:"application/x-www-form-urlencoded;charset=utf-8",AUTHORIZATION_PENDING:"authorization_pending",NOT_DEFINED:"not_defined",EMPTY_STRING:"",FORWARD_SLASH:"/",IMDS_ENDPOINT:"http://169.254.169.254/metadata/instance/compute/location",IMDS_VERSION:"2020-06-01",IMDS_TIMEOUT:2e3,AZURE_REGION_AUTO_DISCOVER_FLAG:"TryAutoDetect",REGIONAL_AUTH_PUBLIC_CLOUD_SUFFIX:"login.microsoft.com",KNOWN_PUBLIC_CLOUDS:["login.microsoftonline.com","login.windows.net","login.microsoft.com","sts.windows.net"],TOKEN_RESPONSE_TYPE:"token",ID_TOKEN_RESPONSE_TYPE:"id_token",SHR_NONCE_VALIDITY:240},C=[E.OPENID_SCOPE,E.PROFILE_SCOPE,E.OFFLINE_ACCESS_SCOPE],_=p(C,[E.EMAIL_SCOPE]);!function(e){e.CONTENT_TYPE="Content-Type",e.RETRY_AFTER="Retry-After",e.CCS_HEADER="X-AnchorMailbox",e.WWWAuthenticate="WWW-Authenticate",e.AuthenticationInfo="Authentication-Info"}(g||(g={})),function(e){e.ID_TOKEN="idtoken",e.CLIENT_INFO="client.info",e.ADAL_ID_TOKEN="adal.idtoken",e.ERROR="error",e.ERROR_DESC="error.description",e.ACTIVE_ACCOUNT="active-account",e.ACTIVE_ACCOUNT_FILTERS="active-account-filters"}(f||(f={})),function(e){e.COMMON="common",e.ORGANIZATIONS="organizations",e.CONSUMERS="consumers"}(m||(m={})),function(e){e.CLIENT_ID="client_id",e.REDIRECT_URI="redirect_uri",e.RESPONSE_TYPE="response_type",e.RESPONSE_MODE="response_mode",e.GRANT_TYPE="grant_type",e.CLAIMS="claims",e.SCOPE="scope",e.ERROR="error",e.ERROR_DESCRIPTION="error_description",e.ACCESS_TOKEN="access_token",e.ID_TOKEN="id_token",e.REFRESH_TOKEN="refresh_token",e.EXPIRES_IN="expires_in",e.STATE="state",e.NONCE="nonce",e.PROMPT="prompt",e.SESSION_STATE="session_state",e.CLIENT_INFO="client_info",e.CODE="code",e.CODE_CHALLENGE="code_challenge",e.CODE_CHALLENGE_METHOD="code_challenge_method",e.CODE_VERIFIER="code_verifier",e.CLIENT_REQUEST_ID="client-request-id",e.X_CLIENT_SKU="x-client-SKU",e.X_CLIENT_VER="x-client-VER",e.X_CLIENT_OS="x-client-OS",e.X_CLIENT_CPU="x-client-CPU",e.X_CLIENT_CURR_TELEM="x-client-current-telemetry",e.X_CLIENT_LAST_TELEM="x-client-last-telemetry",e.X_MS_LIB_CAPABILITY="x-ms-lib-capability",e.X_APP_NAME="x-app-name",e.X_APP_VER="x-app-ver",e.POST_LOGOUT_URI="post_logout_redirect_uri",e.ID_TOKEN_HINT="id_token_hint",e.DEVICE_CODE="device_code",e.CLIENT_SECRET="client_secret",e.CLIENT_ASSERTION="client_assertion",e.CLIENT_ASSERTION_TYPE="client_assertion_type",e.TOKEN_TYPE="token_type",e.REQ_CNF="req_cnf",e.OBO_ASSERTION="assertion",e.REQUESTED_TOKEN_USE="requested_token_use",e.ON_BEHALF_OF="on_behalf_of",e.FOCI="foci",e.CCS_HEADER="X-AnchorMailbox",e.RETURN_SPA_CODE="return_spa_code",e.NATIVE_BROKER="nativebroker",e.LOGOUT_HINT="logout_hint"}(v||(v={})),function(e){e.ACCESS_TOKEN="access_token",e.XMS_CC="xms_cc"}(y||(y={}));var T,w={LOGIN:"login",SELECT_ACCOUNT:"select_account",CONSENT:"consent",NONE:"none",CREATE:"create"};!function(e){e.ACCOUNT="account",e.SID="sid",e.LOGIN_HINT="login_hint",e.ID_TOKEN="id_token",e.DOMAIN_HINT="domain_hint",e.ORGANIZATIONS="organizations",e.CONSUMERS="consumers",e.ACCOUNT_ID="accountIdentifier",e.HOMEACCOUNT_ID="homeAccountIdentifier"}(T||(T={}));var I,S,A,b,R,k,N,P={PLAIN:"plain",S256:"S256"};!function(e){e.QUERY="query",e.FRAGMENT="fragment",e.FORM_POST="form_post"}(I||(I={})),function(e){e.IMPLICIT_GRANT="implicit",e.AUTHORIZATION_CODE_GRANT="authorization_code",e.CLIENT_CREDENTIALS_GRANT="client_credentials",e.RESOURCE_OWNER_PASSWORD_GRANT="password",e.REFRESH_TOKEN_GRANT="refresh_token",e.DEVICE_CODE_GRANT="device_code",e.JWT_BEARER="urn:ietf:params:oauth:grant-type:jwt-bearer"}(S||(S={})),function(e){e.MSSTS_ACCOUNT_TYPE="MSSTS",e.ADFS_ACCOUNT_TYPE="ADFS",e.MSAV1_ACCOUNT_TYPE="MSA",e.GENERIC_ACCOUNT_TYPE="Generic"}(A||(A={})),function(e){e.CACHE_KEY_SEPARATOR="-",e.CLIENT_INFO_SEPARATOR="."}(b||(b={})),function(e){e.ID_TOKEN="IdToken",e.ACCESS_TOKEN="AccessToken",e.ACCESS_TOKEN_WITH_AUTH_SCHEME="AccessToken_With_AuthScheme",e.REFRESH_TOKEN="RefreshToken"}(R||(R={})),function(e){e.ACCOUNT="Account",e.CREDENTIAL="Credential",e.ID_TOKEN="IdToken",e.ACCESS_TOKEN="AccessToken",e.REFRESH_TOKEN="RefreshToken",e.APP_METADATA="AppMetadata",e.TEMPORARY="TempCache",e.TELEMETRY="Telemetry",e.UNDEFINED="Undefined",e.THROTTLING="Throttling"}(k||(k={})),function(e){e[e.ADFS=1001]="ADFS",e[e.MSA=1002]="MSA",e[e.MSSTS=1003]="MSSTS",e[e.GENERIC=1004]="GENERIC",e[e.ACCESS_TOKEN=2001]="ACCESS_TOKEN",e[e.REFRESH_TOKEN=2002]="REFRESH_TOKEN",e[e.ID_TOKEN=2003]="ID_TOKEN",e[e.APP_METADATA=3001]="APP_METADATA",e[e.UNDEFINED=9999]="UNDEFINED"}(N||(N={}));var O,M="appmetadata",U="1",q="authority-metadata",H=86400;!function(e){e.CONFIG="config",e.CACHE="cache",e.NETWORK="network",e.HARDCODED_VALUES="hardcoded_values"}(O||(O={}));var L,D={SCHEMA_VERSION:5,MAX_CUR_HEADER_BYTES:80,MAX_LAST_HEADER_BYTES:330,MAX_CACHED_ERRORS:50,CACHE_KEY:"server-telemetry",CATEGORY_SEPARATOR:"|",VALUE_SEPARATOR:",",OVERFLOW_TRUE:"1",OVERFLOW_FALSE:"0",UNKNOWN_ERROR:"unknown_error"};e.AuthenticationScheme=void 0,(L=e.AuthenticationScheme||(e.AuthenticationScheme={})).BEARER="Bearer",L.POP="pop",L.SSH="ssh-cert";var F,x,K,B,G,z,j=60,Y=3600,W="throttling",V="retry-after, h429",J="invalid_grant",Q="client_mismatch";!function(e){e.username="username",e.password="password"}(F||(F={})),function(e){e[e.httpSuccess=200]="httpSuccess",e[e.httpBadRequest=400]="httpBadRequest"}(x||(x={})),function(e){e.FAILED_AUTO_DETECTION="1",e.INTERNAL_CACHE="2",e.ENVIRONMENT_VARIABLE="3",e.IMDS="4"}(K||(K={})),function(e){e.CONFIGURED_MATCHES_DETECTED="1",e.CONFIGURED_NO_AUTO_DETECTION="2",e.CONFIGURED_NOT_DETECTED="3",e.AUTO_DETECTION_REQUESTED_SUCCESSFUL="4",e.AUTO_DETECTION_REQUESTED_FAILED="5"}(B||(B={})),function(e){e.NO_CACHE_HIT="0",e.FORCE_REFRESH="1",e.NO_CACHED_ACCESS_TOKEN="2",e.CACHED_ACCESS_TOKEN_EXPIRED="3",e.REFRESH_CACHED_ACCESS_TOKEN="4"}(G||(G={})),function(e){e.Jwt="JWT",e.Jwk="JWK"}(z||(z={}));
/*! @azure/msal-common v7.3.0 2022-08-01 */
var X,Z={unexpectedError:{code:"unexpected_error",desc:"Unexpected error in authentication."},postRequestFailed:{code:"post_request_failed",desc:"Post request failed from the network, could be a 4xx/5xx or a network unavailability. Please check the exact error code for details."}},$=function(e){function t(r,n,o){var i=this,a=n?r+": "+n:r;return i=e.call(this,a)||this,Object.setPrototypeOf(i,t.prototype),i.errorCode=r||E.EMPTY_STRING,i.errorMessage=n||E.EMPTY_STRING,i.subError=o||E.EMPTY_STRING,i.name="AuthError",i}return u(t,e),t.prototype.setCorrelationId=function(e){this.correlationId=e},t.createUnexpectedError=function(e){return new t(Z.unexpectedError.code,Z.unexpectedError.desc+": "+e)},t.createPostRequestFailed=function(e){return new t(Z.postRequestFailed.code,Z.postRequestFailed.desc+": "+e)},t}(Error),ee={createNewGuid:function(){throw $.createUnexpectedError("Crypto interface - createNewGuid() has not been implemented")},base64Decode:function(){throw $.createUnexpectedError("Crypto interface - base64Decode() has not been implemented")},base64Encode:function(){throw $.createUnexpectedError("Crypto interface - base64Encode() has not been implemented")},generatePkceCodes:function(){return d(this,void 0,void 0,(function(){return h(this,(function(e){throw"Crypto interface - generatePkceCodes() has not been implemented",$.createUnexpectedError("Crypto interface - generatePkceCodes() has not been implemented")}))}))},getPublicKeyThumbprint:function(){return d(this,void 0,void 0,(function(){return h(this,(function(e){throw"Crypto interface - getPublicKeyThumbprint() has not been implemented",$.createUnexpectedError("Crypto interface - getPublicKeyThumbprint() has not been implemented")}))}))},removeTokenBindingKey:function(){return d(this,void 0,void 0,(function(){return h(this,(function(e){throw"Crypto interface - removeTokenBindingKey() has not been implemented",$.createUnexpectedError("Crypto interface - removeTokenBindingKey() has not been implemented")}))}))},clearKeystore:function(){return d(this,void 0,void 0,(function(){return h(this,(function(e){throw"Crypto interface - clearKeystore() has not been implemented",$.createUnexpectedError("Crypto interface - clearKeystore() has not been implemented")}))}))},signJwt:function(){return d(this,void 0,void 0,(function(){return h(this,(function(e){throw"Crypto interface - signJwt() has not been implemented",$.createUnexpectedError("Crypto interface - signJwt() has not been implemented")}))}))},hashString:function(){return d(this,void 0,void 0,(function(){return h(this,(function(e){throw"Crypto interface - hashString() has not been implemented",$.createUnexpectedError("Crypto interface - hashString() has not been implemented")}))}))}},te={clientInfoDecodingError:{code:"client_info_decoding_error",desc:"The client info could not be parsed/decoded correctly. Please review the trace to determine the root cause."},clientInfoEmptyError:{code:"client_info_empty_error",desc:"The client info was empty. Please review the trace to determine the root cause."},tokenParsingError:{code:"token_parsing_error",desc:"Token cannot be parsed. Please review stack trace to determine root cause."},nullOrEmptyToken:{code:"null_or_empty_token",desc:"The token is null or empty. Please review the trace to determine the root cause."},endpointResolutionError:{code:"endpoints_resolution_error",desc:"Error: could not resolve endpoints. Please check network and try again."},networkError:{code:"network_error",desc:"Network request failed. Please check network trace to determine root cause."},unableToGetOpenidConfigError:{code:"openid_config_error",desc:"Could not retrieve endpoints. Check your authority and verify the .well-known/openid-configuration endpoint returns the required endpoints."},hashNotDeserialized:{code:"hash_not_deserialized",desc:"The hash parameters could not be deserialized. Please review the trace to determine the root cause."},blankGuidGenerated:{code:"blank_guid_generated",desc:"The guid generated was blank. Please review the trace to determine the root cause."},invalidStateError:{code:"invalid_state",desc:"State was not the expected format. Please check the logs to determine whether the request was sent using ProtocolUtils.setRequestState()."},stateMismatchError:{code:"state_mismatch",desc:"State mismatch error. Please check your network. Continued requests may cause cache overflow."},stateNotFoundError:{code:"state_not_found",desc:"State not found"},nonceMismatchError:{code:"nonce_mismatch",desc:"Nonce mismatch error. This may be caused by a race condition in concurrent requests."},nonceNotFoundError:{code:"nonce_not_found",desc:"nonce not found"},noTokensFoundError:{code:"no_tokens_found",desc:"No tokens were found for the given scopes, and no authorization code was passed to acquireToken. You must retrieve an authorization code before making a call to acquireToken()."},multipleMatchingTokens:{code:"multiple_matching_tokens",desc:"The cache contains multiple tokens satisfying the requirements. Call AcquireToken again providing more requirements such as authority or account."},multipleMatchingAccounts:{code:"multiple_matching_accounts",desc:"The cache contains multiple accounts satisfying the given parameters. Please pass more info to obtain the correct account"},multipleMatchingAppMetadata:{code:"multiple_matching_appMetadata",desc:"The cache contains multiple appMetadata satisfying the given parameters. Please pass more info to obtain the correct appMetadata"},tokenRequestCannotBeMade:{code:"request_cannot_be_made",desc:"Token request cannot be made without authorization code or refresh token."},appendEmptyScopeError:{code:"cannot_append_empty_scope",desc:"Cannot append null or empty scope to ScopeSet. Please check the stack trace for more info."},removeEmptyScopeError:{code:"cannot_remove_empty_scope",desc:"Cannot remove null or empty scope from ScopeSet. Please check the stack trace for more info."},appendScopeSetError:{code:"cannot_append_scopeset",desc:"Cannot append ScopeSet due to error."},emptyInputScopeSetError:{code:"empty_input_scopeset",desc:"Empty input ScopeSet cannot be processed."},DeviceCodePollingCancelled:{code:"device_code_polling_cancelled",desc:"Caller has cancelled token endpoint polling during device code flow by setting DeviceCodeRequest.cancel = true."},DeviceCodeExpired:{code:"device_code_expired",desc:"Device code is expired."},DeviceCodeUnknownError:{code:"device_code_unknown_error",desc:"Device code stopped polling for unknown reasons."},NoAccountInSilentRequest:{code:"no_account_in_silent_request",desc:"Please pass an account object, silent flow is not supported without account information"},invalidCacheRecord:{code:"invalid_cache_record",desc:"Cache record object was null or undefined."},invalidCacheEnvironment:{code:"invalid_cache_environment",desc:"Invalid environment when attempting to create cache entry"},noAccountFound:{code:"no_account_found",desc:"No account found in cache for given key."},CachePluginError:{code:"no cache plugin set on CacheManager",desc:"ICachePlugin needs to be set before using readFromStorage or writeFromStorage"},noCryptoObj:{code:"no_crypto_object",desc:"No crypto object detected. This is required for the following operation: "},invalidCacheType:{code:"invalid_cache_type",desc:"Invalid cache type"},unexpectedAccountType:{code:"unexpected_account_type",desc:"Unexpected account type."},unexpectedCredentialType:{code:"unexpected_credential_type",desc:"Unexpected credential type."},invalidAssertion:{code:"invalid_assertion",desc:"Client assertion must meet requirements described in https://tools.ietf.org/html/rfc7515"},invalidClientCredential:{code:"invalid_client_credential",desc:"Client credential (secret, certificate, or assertion) must not be empty when creating a confidential client. An application should at most have one credential"},tokenRefreshRequired:{code:"token_refresh_required",desc:"Cannot return token from cache because it must be refreshed. This may be due to one of the following reasons: forceRefresh parameter is set to true, claims have been requested, there is no cached access token or it is expired."},userTimeoutReached:{code:"user_timeout_reached",desc:"User defined timeout for device code polling reached"},tokenClaimsRequired:{code:"token_claims_cnf_required_for_signedjwt",desc:"Cannot generate a POP jwt if the token_claims are not populated"},noAuthorizationCodeFromServer:{code:"authorization_code_missing_from_server_response",desc:"Server response does not contain an authorization code to proceed"},noAzureRegionDetected:{code:"no_azure_region_detected",desc:"No azure region was detected and no fallback was made available"},accessTokenEntityNullError:{code:"access_token_entity_null",desc:"Access token entity is null, please check logs and cache to ensure a valid access token is present."},bindingKeyNotRemovedError:{code:"binding_key_not_removed",desc:"Could not remove the credential's binding key from storage."},logoutNotSupported:{code:"end_session_endpoint_not_supported",desc:"Provided authority does not support logout."},keyIdMissing:{code:"key_id_missing",desc:"A keyId value is missing from the requested bound token's cache record and is required to match the token to it's stored binding key."}},re=function(e){function t(r,n){var o=e.call(this,r,n)||this;return o.name="ClientAuthError",Object.setPrototypeOf(o,t.prototype),o}return u(t,e),t.createClientInfoDecodingError=function(e){return new t(te.clientInfoDecodingError.code,te.clientInfoDecodingError.desc+" Failed with error: "+e)},t.createClientInfoEmptyError=function(){return new t(te.clientInfoEmptyError.code,""+te.clientInfoEmptyError.desc)},t.createTokenParsingError=function(e){return new t(te.tokenParsingError.code,te.tokenParsingError.desc+" Failed with error: "+e)},t.createTokenNullOrEmptyError=function(e){return new t(te.nullOrEmptyToken.code,te.nullOrEmptyToken.desc+" Raw Token Value: "+e)},t.createEndpointDiscoveryIncompleteError=function(e){return new t(te.endpointResolutionError.code,te.endpointResolutionError.desc+" Detail: "+e)},t.createNetworkError=function(e,r){return new t(te.networkError.code,te.networkError.desc+" | Fetch client threw: "+r+" | Attempted to reach: "+e.split("?")[0])},t.createUnableToGetOpenidConfigError=function(e){return new t(te.unableToGetOpenidConfigError.code,te.unableToGetOpenidConfigError.desc+" Attempted to retrieve endpoints from: "+e)},t.createHashNotDeserializedError=function(e){return new t(te.hashNotDeserialized.code,te.hashNotDeserialized.desc+" Given Object: "+e)},t.createInvalidStateError=function(e,r){return new t(te.invalidStateError.code,te.invalidStateError.desc+" Invalid State: "+e+", Root Err: "+r)},t.createStateMismatchError=function(){return new t(te.stateMismatchError.code,te.stateMismatchError.desc)},t.createStateNotFoundError=function(e){return new t(te.stateNotFoundError.code,te.stateNotFoundError.desc+":  "+e)},t.createNonceMismatchError=function(){return new t(te.nonceMismatchError.code,te.nonceMismatchError.desc)},t.createNonceNotFoundError=function(e){return new t(te.nonceNotFoundError.code,te.nonceNotFoundError.desc+":  "+e)},t.createMultipleMatchingTokensInCacheError=function(){return new t(te.multipleMatchingTokens.code,te.multipleMatchingTokens.desc+".")},t.createMultipleMatchingAccountsInCacheError=function(){return new t(te.multipleMatchingAccounts.code,te.multipleMatchingAccounts.desc)},t.createMultipleMatchingAppMetadataInCacheError=function(){return new t(te.multipleMatchingAppMetadata.code,te.multipleMatchingAppMetadata.desc)},t.createTokenRequestCannotBeMadeError=function(){return new t(te.tokenRequestCannotBeMade.code,te.tokenRequestCannotBeMade.desc)},t.createAppendEmptyScopeToSetError=function(e){return new t(te.appendEmptyScopeError.code,te.appendEmptyScopeError.desc+" Given Scope: "+e)},t.createRemoveEmptyScopeFromSetError=function(e){return new t(te.removeEmptyScopeError.code,te.removeEmptyScopeError.desc+" Given Scope: "+e)},t.createAppendScopeSetError=function(e){return new t(te.appendScopeSetError.code,te.appendScopeSetError.desc+" Detail Error: "+e)},t.createEmptyInputScopeSetError=function(){return new t(te.emptyInputScopeSetError.code,""+te.emptyInputScopeSetError.desc)},t.createDeviceCodeCancelledError=function(){return new t(te.DeviceCodePollingCancelled.code,""+te.DeviceCodePollingCancelled.desc)},t.createDeviceCodeExpiredError=function(){return new t(te.DeviceCodeExpired.code,""+te.DeviceCodeExpired.desc)},t.createDeviceCodeUnknownError=function(){return new t(te.DeviceCodeUnknownError.code,""+te.DeviceCodeUnknownError.desc)},t.createNoAccountInSilentRequestError=function(){return new t(te.NoAccountInSilentRequest.code,""+te.NoAccountInSilentRequest.desc)},t.createNullOrUndefinedCacheRecord=function(){return new t(te.invalidCacheRecord.code,te.invalidCacheRecord.desc)},t.createInvalidCacheEnvironmentError=function(){return new t(te.invalidCacheEnvironment.code,te.invalidCacheEnvironment.desc)},t.createNoAccountFoundError=function(){return new t(te.noAccountFound.code,te.noAccountFound.desc)},t.createCachePluginError=function(){return new t(te.CachePluginError.code,""+te.CachePluginError.desc)},t.createNoCryptoObjectError=function(e){return new t(te.noCryptoObj.code,""+te.noCryptoObj.desc+e)},t.createInvalidCacheTypeError=function(){return new t(te.invalidCacheType.code,""+te.invalidCacheType.desc)},t.createUnexpectedAccountTypeError=function(){return new t(te.unexpectedAccountType.code,""+te.unexpectedAccountType.desc)},t.createUnexpectedCredentialTypeError=function(){return new t(te.unexpectedCredentialType.code,""+te.unexpectedCredentialType.desc)},t.createInvalidAssertionError=function(){return new t(te.invalidAssertion.code,""+te.invalidAssertion.desc)},t.createInvalidCredentialError=function(){return new t(te.invalidClientCredential.code,""+te.invalidClientCredential.desc)},t.createRefreshRequiredError=function(){return new t(te.tokenRefreshRequired.code,te.tokenRefreshRequired.desc)},t.createUserTimeoutReachedError=function(){return new t(te.userTimeoutReached.code,te.userTimeoutReached.desc)},t.createTokenClaimsRequiredError=function(){return new t(te.tokenClaimsRequired.code,te.tokenClaimsRequired.desc)},t.createNoAuthCodeInServerResponseError=function(){return new t(te.noAuthorizationCodeFromServer.code,te.noAuthorizationCodeFromServer.desc)},t.createBindingKeyNotRemovedError=function(){return new t(te.bindingKeyNotRemovedError.code,te.bindingKeyNotRemovedError.desc)},t.createLogoutNotSupportedError=function(){return new t(te.logoutNotSupported.code,te.logoutNotSupported.desc)},t.createKeyIdMissingError=function(){return new t(te.keyIdMissing.code,te.keyIdMissing.desc)},t}($),ne=function(){function e(){}return e.decodeAuthToken=function(t){if(e.isEmpty(t))throw re.createTokenNullOrEmptyError(t);var r=/^([^\.\s]*)\.([^\.\s]+)\.([^\.\s]*)$/.exec(t);if(!r||r.length<4)throw re.createTokenParsingError("Given token is malformed: "+JSON.stringify(t));return{header:r[1],JWSPayload:r[2],JWSSig:r[3]}},e.isEmpty=function(e){return void 0===e||!e||0===e.length},e.isEmptyObj=function(t){if(t&&!e.isEmpty(t))try{var r=JSON.parse(t);return 0===Object.keys(r).length}catch(e){}return!0},e.startsWith=function(e,t){return 0===e.indexOf(t)},e.endsWith=function(e,t){return e.length>=t.length&&e.lastIndexOf(t)===e.length-t.length},e.queryStringToObject=function(e){var t={},r=e.split("&"),n=function(e){return decodeURIComponent(e.replace(/\+/g," "))};return r.forEach((function(e){if(e.trim()){var r=e.split(/=(.+)/g,2),o=r[0],i=r[1];o&&i&&(t[n(o)]=n(i))}})),t},e.trimArrayEntries=function(e){return e.map((function(e){return e.trim()}))},e.removeEmptyStringsFromArray=function(t){return t.filter((function(t){return!e.isEmpty(t)}))},e.jsonParseHelper=function(e){try{return JSON.parse(e)}catch(e){return null}},e.matchPattern=function(e,t){return new RegExp(e.replace(/\\/g,"\\\\").replace(/\*/g,"[^ ]*").replace(/\?/g,"\\?")).test(t)},e}();
/*! @azure/msal-common v7.3.0 2022-08-01 */
e.LogLevel=void 0,(X=e.LogLevel||(e.LogLevel={}))[X.Error=0]="Error",X[X.Warning=1]="Warning",X[X.Info=2]="Info",X[X.Verbose=3]="Verbose",X[X.Trace=4]="Trace";var oe,ie=function(){function t(t,r,n){this.level=e.LogLevel.Info;this.localCallback=t.loggerCallback||function(){},this.piiLoggingEnabled=t.piiLoggingEnabled||!1,this.level="number"==typeof t.logLevel?t.logLevel:e.LogLevel.Info,this.correlationId=t.correlationId||E.EMPTY_STRING,this.packageName=r||E.EMPTY_STRING,this.packageVersion=n||E.EMPTY_STRING}return t.prototype.clone=function(e,r,n){return new t({loggerCallback:this.localCallback,piiLoggingEnabled:this.piiLoggingEnabled,logLevel:this.level,correlationId:n||this.correlationId},e,r)},t.prototype.logMessage=function(t,r){if(!(r.logLevel>this.level||!this.piiLoggingEnabled&&r.containsPii)){var n=(new Date).toUTCString(),o=(ne.isEmpty(r.correlationId)?ne.isEmpty(this.correlationId)?"["+n+"]":"["+n+"] : ["+this.correlationId+"]":"["+n+"] : ["+r.correlationId+"]")+" : "+this.packageName+"@"+this.packageVersion+" : "+e.LogLevel[r.logLevel]+" - "+t;this.executeCallback(r.logLevel,o,r.containsPii||!1)}},t.prototype.executeCallback=function(e,t,r){this.localCallback&&this.localCallback(e,t,r)},t.prototype.error=function(t,r){this.logMessage(t,{logLevel:e.LogLevel.Error,containsPii:!1,correlationId:r||E.EMPTY_STRING})},t.prototype.errorPii=function(t,r){this.logMessage(t,{logLevel:e.LogLevel.Error,containsPii:!0,correlationId:r||E.EMPTY_STRING})},t.prototype.warning=function(t,r){this.logMessage(t,{logLevel:e.LogLevel.Warning,containsPii:!1,correlationId:r||E.EMPTY_STRING})},t.prototype.warningPii=function(t,r){this.logMessage(t,{logLevel:e.LogLevel.Warning,containsPii:!0,correlationId:r||E.EMPTY_STRING})},t.prototype.info=function(t,r){this.logMessage(t,{logLevel:e.LogLevel.Info,containsPii:!1,correlationId:r||E.EMPTY_STRING})},t.prototype.infoPii=function(t,r){this.logMessage(t,{logLevel:e.LogLevel.Info,containsPii:!0,correlationId:r||E.EMPTY_STRING})},t.prototype.verbose=function(t,r){this.logMessage(t,{logLevel:e.LogLevel.Verbose,containsPii:!1,correlationId:r||E.EMPTY_STRING})},t.prototype.verbosePii=function(t,r){this.logMessage(t,{logLevel:e.LogLevel.Verbose,containsPii:!0,correlationId:r||E.EMPTY_STRING})},t.prototype.trace=function(t,r){this.logMessage(t,{logLevel:e.LogLevel.Trace,containsPii:!1,correlationId:r||E.EMPTY_STRING})},t.prototype.tracePii=function(t,r){this.logMessage(t,{logLevel:e.LogLevel.Trace,containsPii:!0,correlationId:r||E.EMPTY_STRING})},t.prototype.isPiiLoggingEnabled=function(){return this.piiLoggingEnabled||!1},t}(),ae="7.3.0";
/*! @azure/msal-common v7.3.0 2022-08-01 */
/*! @azure/msal-common v7.3.0 2022-08-01 */
e.AzureCloudInstance=void 0,(oe=e.AzureCloudInstance||(e.AzureCloudInstance={}))[oe.None=0]="None",oe.AzurePublic="https://login.microsoftonline.com",oe.AzurePpe="https://login.windows-ppe.net",oe.AzureChina="https://login.chinacloudapi.cn",oe.AzureGermany="https://login.microsoftonline.de",oe.AzureUsGovernment="https://login.microsoftonline.us";
/*! @azure/msal-common v7.3.0 2022-08-01 */
var se,ce=function(){function t(){}return t.prototype.generateAccountId=function(){return t.generateAccountIdForCacheKey(this.homeAccountId,this.environment)},t.prototype.generateCredentialId=function(){return t.generateCredentialIdForCacheKey(this.credentialType,this.clientId,this.realm,this.familyId)},t.prototype.generateTarget=function(){return t.generateTargetForCacheKey(this.target)},t.prototype.generateCredentialKey=function(){return t.generateCredentialCacheKey(this.homeAccountId,this.environment,this.credentialType,this.clientId,this.realm,this.target,this.familyId,this.tokenType,this.requestedClaimsHash)},t.prototype.generateType=function(){switch(this.credentialType){case R.ID_TOKEN:return N.ID_TOKEN;case R.ACCESS_TOKEN:case R.ACCESS_TOKEN_WITH_AUTH_SCHEME:return N.ACCESS_TOKEN;case R.REFRESH_TOKEN:return N.REFRESH_TOKEN;default:throw re.createUnexpectedCredentialTypeError()}},t.getCredentialType=function(e){return-1!==e.indexOf(R.ACCESS_TOKEN.toLowerCase())?-1!==e.indexOf(R.ACCESS_TOKEN_WITH_AUTH_SCHEME.toLowerCase())?R.ACCESS_TOKEN_WITH_AUTH_SCHEME:R.ACCESS_TOKEN:-1!==e.indexOf(R.ID_TOKEN.toLowerCase())?R.ID_TOKEN:-1!==e.indexOf(R.REFRESH_TOKEN.toLowerCase())?R.REFRESH_TOKEN:E.NOT_DEFINED},t.generateCredentialCacheKey=function(e,t,r,n,o,i,a,s,c){return[this.generateAccountIdForCacheKey(e,t),this.generateCredentialIdForCacheKey(r,n,o,a),this.generateTargetForCacheKey(i),this.generateClaimsHashForCacheKey(c),this.generateSchemeForCacheKey(s)].join(b.CACHE_KEY_SEPARATOR).toLowerCase()},t.generateAccountIdForCacheKey=function(e,t){return[e,t].join(b.CACHE_KEY_SEPARATOR).toLowerCase()},t.generateCredentialIdForCacheKey=function(e,t,r,n){return[e,e===R.REFRESH_TOKEN&&n||t,r||E.EMPTY_STRING].join(b.CACHE_KEY_SEPARATOR).toLowerCase()},t.generateTargetForCacheKey=function(e){return(e||E.EMPTY_STRING).toLowerCase()},t.generateClaimsHashForCacheKey=function(e){return(e||E.EMPTY_STRING).toLowerCase()},t.generateSchemeForCacheKey=function(t){return t&&t.toLowerCase()!==e.AuthenticationScheme.BEARER.toLowerCase()?t.toLowerCase():E.EMPTY_STRING},t}(),ue={redirectUriNotSet:{code:"redirect_uri_empty",desc:"A redirect URI is required for all calls, and none has been set."},postLogoutUriNotSet:{code:"post_logout_uri_empty",desc:"A post logout redirect has not been set."},claimsRequestParsingError:{code:"claims_request_parsing_error",desc:"Could not parse the given claims request object."},authorityUriInsecure:{code:"authority_uri_insecure",desc:"Authority URIs must use https.  Please see here for valid authority configuration options: https://docs.microsoft.com/en-us/azure/active-directory/develop/msal-js-initializing-client-applications#configuration-options"},urlParseError:{code:"url_parse_error",desc:"URL could not be parsed into appropriate segments."},urlEmptyError:{code:"empty_url_error",desc:"URL was empty or null."},emptyScopesError:{code:"empty_input_scopes_error",desc:"Scopes cannot be passed as null, undefined or empty array because they are required to obtain an access token."},nonArrayScopesError:{code:"nonarray_input_scopes_error",desc:"Scopes cannot be passed as non-array."},clientIdSingleScopeError:{code:"clientid_input_scopes_error",desc:"Client ID can only be provided as a single scope."},invalidPrompt:{code:"invalid_prompt_value",desc:"Supported prompt values are 'login', 'select_account', 'consent', 'create' and 'none'.  Please see here for valid configuration options: https://azuread.github.io/microsoft-authentication-library-for-js/ref/modules/_azure_msal_common.html#commonauthorizationurlrequest"},invalidClaimsRequest:{code:"invalid_claims",desc:"Given claims parameter must be a stringified JSON object."},tokenRequestEmptyError:{code:"token_request_empty",desc:"Token request was empty and not found in cache."},logoutRequestEmptyError:{code:"logout_request_empty",desc:"The logout request was null or undefined."},invalidCodeChallengeMethod:{code:"invalid_code_challenge_method",desc:'code_challenge_method passed is invalid. Valid values are "plain" and "S256".'},invalidCodeChallengeParams:{code:"pkce_params_missing",desc:"Both params: code_challenge and code_challenge_method are to be passed if to be sent in the request"},invalidCloudDiscoveryMetadata:{code:"invalid_cloud_discovery_metadata",desc:"Invalid cloudDiscoveryMetadata provided. Must be a stringified JSON object containing tenant_discovery_endpoint and metadata fields"},invalidAuthorityMetadata:{code:"invalid_authority_metadata",desc:"Invalid authorityMetadata provided. Must by a stringified JSON object containing authorization_endpoint, token_endpoint, issuer fields."},untrustedAuthority:{code:"untrusted_authority",desc:"The provided authority is not a trusted authority. Please include this authority in the knownAuthorities config parameter."},invalidAzureCloudInstance:{code:"invalid_azure_cloud_instance",desc:"Invalid AzureCloudInstance provided. Please refer MSAL JS docs: aks.ms/msaljs/azure_cloud_instance for valid values"},missingSshJwk:{code:"missing_ssh_jwk",desc:"Missing sshJwk in SSH certificate request. A stringified JSON Web Key is required when using the SSH authentication scheme."},missingSshKid:{code:"missing_ssh_kid",desc:"Missing sshKid in SSH certificate request. A string that uniquely identifies the public SSH key is required when using the SSH authentication scheme."},missingNonceAuthenticationHeader:{code:"missing_nonce_authentication_header",desc:"Unable to find an authentication header containing server nonce. Either the Authentication-Info or WWW-Authenticate headers must be present in order to obtain a server nonce."},invalidAuthenticationHeader:{code:"invalid_authentication_header",desc:"Invalid authentication header provided"}},le=function(e){function t(r,n){var o=e.call(this,r,n)||this;return o.name="ClientConfigurationError",Object.setPrototypeOf(o,t.prototype),o}return u(t,e),t.createRedirectUriEmptyError=function(){return new t(ue.redirectUriNotSet.code,ue.redirectUriNotSet.desc)},t.createPostLogoutRedirectUriEmptyError=function(){return new t(ue.postLogoutUriNotSet.code,ue.postLogoutUriNotSet.desc)},t.createClaimsRequestParsingError=function(e){return new t(ue.claimsRequestParsingError.code,ue.claimsRequestParsingError.desc+" Given value: "+e)},t.createInsecureAuthorityUriError=function(e){return new t(ue.authorityUriInsecure.code,ue.authorityUriInsecure.desc+" Given URI: "+e)},t.createUrlParseError=function(e){return new t(ue.urlParseError.code,ue.urlParseError.desc+" Given Error: "+e)},t.createUrlEmptyError=function(){return new t(ue.urlEmptyError.code,ue.urlEmptyError.desc)},t.createEmptyScopesArrayError=function(){return new t(ue.emptyScopesError.code,""+ue.emptyScopesError.desc)},t.createClientIdSingleScopeError=function(e){return new t(ue.clientIdSingleScopeError.code,ue.clientIdSingleScopeError.desc+" Given Scopes: "+e)},t.createInvalidPromptError=function(e){return new t(ue.invalidPrompt.code,ue.invalidPrompt.desc+" Given value: "+e)},t.createInvalidClaimsRequestError=function(){return new t(ue.invalidClaimsRequest.code,ue.invalidClaimsRequest.desc)},t.createEmptyLogoutRequestError=function(){return new t(ue.logoutRequestEmptyError.code,ue.logoutRequestEmptyError.desc)},t.createEmptyTokenRequestError=function(){return new t(ue.tokenRequestEmptyError.code,ue.tokenRequestEmptyError.desc)},t.createInvalidCodeChallengeMethodError=function(){return new t(ue.invalidCodeChallengeMethod.code,ue.invalidCodeChallengeMethod.desc)},t.createInvalidCodeChallengeParamsError=function(){return new t(ue.invalidCodeChallengeParams.code,ue.invalidCodeChallengeParams.desc)},t.createInvalidCloudDiscoveryMetadataError=function(){return new t(ue.invalidCloudDiscoveryMetadata.code,ue.invalidCloudDiscoveryMetadata.desc)},t.createInvalidAuthorityMetadataError=function(){return new t(ue.invalidAuthorityMetadata.code,ue.invalidAuthorityMetadata.desc)},t.createUntrustedAuthorityError=function(){return new t(ue.untrustedAuthority.code,ue.untrustedAuthority.desc)},t.createInvalidAzureCloudInstanceError=function(){return new t(ue.invalidAzureCloudInstance.code,ue.invalidAzureCloudInstance.desc)},t.createMissingSshJwkError=function(){return new t(ue.missingSshJwk.code,ue.missingSshJwk.desc)},t.createMissingSshKidError=function(){return new t(ue.missingSshKid.code,ue.missingSshKid.desc)},t.createMissingNonceAuthenticationHeadersError=function(){return new t(ue.missingNonceAuthenticationHeader.code,ue.missingNonceAuthenticationHeader.desc)},t.createInvalidAuthenticationHeaderError=function(e,r){return new t(ue.invalidAuthenticationHeader.code,ue.invalidAuthenticationHeader.desc+". Invalid header: "+e+". Details: "+r)},t}(re),de=function(){function e(e){var t=this,r=e?ne.trimArrayEntries(p(e)):[],n=r?ne.removeEmptyStringsFromArray(r):[];this.validateInputScopes(n),this.scopes=new Set,n.forEach((function(e){return t.scopes.add(e)}))}return e.fromString=function(t){return new e((t||E.EMPTY_STRING).split(" "))},e.prototype.validateInputScopes=function(e){if(!e||e.length<1)throw le.createEmptyScopesArrayError()},e.prototype.containsScope=function(t){var r=new e(this.printScopesLowerCase().split(" "));return!ne.isEmpty(t)&&r.scopes.has(t.toLowerCase())},e.prototype.containsScopeSet=function(e){var t=this;return!(!e||e.scopes.size<=0)&&(this.scopes.size>=e.scopes.size&&e.asArray().every((function(e){return t.containsScope(e)})))},e.prototype.containsOnlyOIDCScopes=function(){var e=this,t=0;return _.forEach((function(r){e.containsScope(r)&&(t+=1)})),this.scopes.size===t},e.prototype.appendScope=function(e){ne.isEmpty(e)||this.scopes.add(e.trim())},e.prototype.appendScopes=function(e){var t=this;try{e.forEach((function(e){return t.appendScope(e)}))}catch(e){throw re.createAppendScopeSetError(e)}},e.prototype.removeScope=function(e){if(ne.isEmpty(e))throw re.createRemoveEmptyScopeFromSetError(e);this.scopes.delete(e.trim())},e.prototype.removeOIDCScopes=function(){var e=this;_.forEach((function(t){e.scopes.delete(t)}))},e.prototype.unionScopeSets=function(e){if(!e)throw re.createEmptyInputScopeSetError();var t=new Set;return e.scopes.forEach((function(e){return t.add(e.toLowerCase())})),this.scopes.forEach((function(e){return t.add(e.toLowerCase())})),t},e.prototype.intersectingScopeSets=function(e){if(!e)throw re.createEmptyInputScopeSetError();e.containsOnlyOIDCScopes()||e.removeOIDCScopes();var t=this.unionScopeSets(e),r=e.getScopeCount(),n=this.getScopeCount();return t.size<n+r},e.prototype.getScopeCount=function(){return this.scopes.size},e.prototype.asArray=function(){var e=[];return this.scopes.forEach((function(t){return e.push(t)})),e},e.prototype.printScopes=function(){return this.scopes?this.asArray().join(" "):E.EMPTY_STRING},e.prototype.printScopesLowerCase=function(){return this.printScopes().toLowerCase()},e}();
/*! @azure/msal-common v7.3.0 2022-08-01 */
/*! @azure/msal-common v7.3.0 2022-08-01 */
function he(e,t){if(ne.isEmpty(e))throw re.createClientInfoEmptyError();try{var r=t.base64Decode(e);return JSON.parse(r)}catch(e){throw re.createClientInfoDecodingError(e)}}function pe(e){if(ne.isEmpty(e))throw re.createClientInfoDecodingError("Home account ID was empty.");var t=e.split(b.CLIENT_INFO_SEPARATOR,2);return{uid:t[0],utid:t.length<2?E.EMPTY_STRING:t[1]}}
/*! @azure/msal-common v7.3.0 2022-08-01 */!function(e){e[e.Default=0]="Default",e[e.Adfs=1]="Adfs"}(se||(se={}));
/*! @azure/msal-common v7.3.0 2022-08-01 */
var ge=function(){function e(){}return e.prototype.generateAccountId=function(){return[this.homeAccountId,this.environment].join(b.CACHE_KEY_SEPARATOR).toLowerCase()},e.prototype.generateAccountKey=function(){return e.generateAccountCacheKey({homeAccountId:this.homeAccountId,environment:this.environment,tenantId:this.realm,username:this.username,localAccountId:this.localAccountId})},e.prototype.generateType=function(){switch(this.authorityType){case A.ADFS_ACCOUNT_TYPE:return N.ADFS;case A.MSAV1_ACCOUNT_TYPE:return N.MSA;case A.MSSTS_ACCOUNT_TYPE:return N.MSSTS;case A.GENERIC_ACCOUNT_TYPE:return N.GENERIC;default:throw re.createUnexpectedAccountTypeError()}},e.prototype.getAccountInfo=function(){return{homeAccountId:this.homeAccountId,environment:this.environment,tenantId:this.realm,username:this.username,localAccountId:this.localAccountId,name:this.name,idTokenClaims:this.idTokenClaims,nativeAccountId:this.nativeAccountId}},e.generateAccountCacheKey=function(e){return[e.homeAccountId,e.environment||E.EMPTY_STRING,e.tenantId||E.EMPTY_STRING].join(b.CACHE_KEY_SEPARATOR).toLowerCase()},e.createAccount=function(t,r,n,o,i,a,s,c){var u,l,d,h,p,g,f=new e;f.authorityType=A.MSSTS_ACCOUNT_TYPE,f.clientInfo=t,f.homeAccountId=r,f.nativeAccountId=c;var m=s||o&&o.getPreferredCache();if(!m)throw re.createInvalidCacheEnvironmentError();return f.environment=m,f.realm=(null===(u=null==n?void 0:n.claims)||void 0===u?void 0:u.tid)||E.EMPTY_STRING,n&&(f.idTokenClaims=n.claims,f.localAccountId=(null===(l=null==n?void 0:n.claims)||void 0===l?void 0:l.oid)||(null===(d=null==n?void 0:n.claims)||void 0===d?void 0:d.sub)||E.EMPTY_STRING,f.username=(null===(h=null==n?void 0:n.claims)||void 0===h?void 0:h.preferred_username)||((null===(p=null==n?void 0:n.claims)||void 0===p?void 0:p.emails)?n.claims.emails[0]:E.EMPTY_STRING),f.name=null===(g=null==n?void 0:n.claims)||void 0===g?void 0:g.name),f.cloudGraphHostName=i,f.msGraphHost=a,f},e.createGenericAccount=function(t,r,n,o,i,a){var s,c,u,l,d=new e;d.authorityType=n&&n.authorityType===se.Adfs?A.ADFS_ACCOUNT_TYPE:A.GENERIC_ACCOUNT_TYPE,d.homeAccountId=t,d.realm=E.EMPTY_STRING;var h=a||n&&n.getPreferredCache();if(!h)throw re.createInvalidCacheEnvironmentError();return r&&(d.localAccountId=(null===(s=null==r?void 0:r.claims)||void 0===s?void 0:s.oid)||(null===(c=null==r?void 0:r.claims)||void 0===c?void 0:c.sub)||E.EMPTY_STRING,d.username=(null===(u=null==r?void 0:r.claims)||void 0===u?void 0:u.upn)||E.EMPTY_STRING,d.name=(null===(l=null==r?void 0:r.claims)||void 0===l?void 0:l.name)||E.EMPTY_STRING,d.idTokenClaims=null==r?void 0:r.claims),d.environment=h,d.cloudGraphHostName=o,d.msGraphHost=i,d},e.generateHomeAccountId=function(e,t,r,n,o){var i,a=(null===(i=null==o?void 0:o.claims)||void 0===i?void 0:i.sub)?o.claims.sub:E.EMPTY_STRING;if(t===se.Adfs)return a;if(e)try{var s=he(e,n);if(!ne.isEmpty(s.uid)&&!ne.isEmpty(s.utid))return""+s.uid+b.CLIENT_INFO_SEPARATOR+s.utid}catch(e){}return r.verbose("No client info in response"),a},e.isAccountEntity=function(e){return!!e&&(e.hasOwnProperty("homeAccountId")&&e.hasOwnProperty("environment")&&e.hasOwnProperty("realm")&&e.hasOwnProperty("localAccountId")&&e.hasOwnProperty("username")&&e.hasOwnProperty("authorityType"))},e.accountInfoIsEqual=function(e,t,r){if(!e||!t)return!1;var n=!0;if(r){var o=e.idTokenClaims||{},i=t.idTokenClaims||{};n=o.iat===i.iat&&o.nonce===i.nonce}return e.homeAccountId===t.homeAccountId&&e.localAccountId===t.localAccountId&&e.username===t.username&&e.tenantId===t.tenantId&&e.environment===t.environment&&e.nativeAccountId===t.nativeAccountId&&n},e}(),fe=function(){function e(t,r){if(ne.isEmpty(t))throw re.createTokenNullOrEmptyError(t);this.rawToken=t,this.claims=e.extractTokenClaims(t,r)}return e.extractTokenClaims=function(e,t){var r=ne.decodeAuthToken(e);try{var n=r.JWSPayload,o=t.base64Decode(n);return JSON.parse(o)}catch(e){throw re.createTokenParsingError(e)}},e}(),me=function(){function t(e,t){this.clientId=e,this.cryptoImpl=t}return t.prototype.getAllAccounts=function(){var e=this,r=this.getAccountsFilteredBy(),n=Object.keys(r).map((function(e){return r[e]}));return n.length<1?[]:n.map((function(r){var n=t.toObject(new ge,r).getAccountInfo(),o=e.readIdTokenFromCache(e.clientId,n);return o&&!n.idTokenClaims&&(n.idTokenClaims=new fe(o.secret,e.cryptoImpl).claims),n}))},t.prototype.saveCacheRecord=function(e){return d(this,void 0,void 0,(function(){return h(this,(function(t){switch(t.label){case 0:if(!e)throw re.createNullOrUndefinedCacheRecord();return e.account&&this.setAccount(e.account),e.idToken&&this.setIdTokenCredential(e.idToken),e.accessToken?[4,this.saveAccessToken(e.accessToken)]:[3,2];case 1:t.sent(),t.label=2;case 2:return e.refreshToken&&this.setRefreshTokenCredential(e.refreshToken),e.appMetadata&&this.setAppMetadata(e.appMetadata),[2]}}))}))},t.prototype.saveAccessToken=function(e){return d(this,void 0,void 0,(function(){var t,r,n,o,i=this;return h(this,(function(a){switch(a.label){case 0:return t=this.getCredentialsFilteredBy({clientId:e.clientId,credentialType:e.credentialType,environment:e.environment,homeAccountId:e.homeAccountId,realm:e.realm,tokenType:e.tokenType,requestedClaimsHash:e.requestedClaimsHash}),r=de.fromString(e.target),(n=Object.keys(t.accessTokens).map((function(e){return t.accessTokens[e]})))?(o=[],n.forEach((function(e){de.fromString(e.target).intersectingScopeSets(r)&&o.push(i.removeCredential(e))})),[4,Promise.all(o)]):[3,2];case 1:a.sent(),a.label=2;case 2:return this.setAccessTokenCredential(e),[2]}}))}))},t.prototype.getAccountsFilteredBy=function(e){return this.getAccountsFilteredByInternal(e?e.homeAccountId:E.EMPTY_STRING,e?e.environment:E.EMPTY_STRING,e?e.realm:E.EMPTY_STRING,e?e.nativeAccountId:E.EMPTY_STRING)},t.prototype.getAccountsFilteredByInternal=function(e,t,r,n){var o=this,i=this.getKeys(),a={};return i.forEach((function(i){var s=o.getAccount(i);s&&(e&&!o.matchHomeAccountId(s,e)||t&&!o.matchEnvironment(s,t)||r&&!o.matchRealm(s,r)||n&&!o.matchNativeAccountId(s,n)||(a[i]=s))})),a},t.prototype.getCredentialsFilteredBy=function(e){return this.getCredentialsFilteredByInternal(e.homeAccountId,e.environment,e.credentialType,e.clientId,e.familyId,e.realm,e.target,e.userAssertionHash,e.tokenType,e.keyId,e.requestedClaimsHash)},t.prototype.getCredentialsFilteredByInternal=function(t,r,n,o,i,a,s,c,u,l,d){var h=this,p=this.getKeys(),g={idTokens:{},accessTokens:{},refreshTokens:{}};return p.forEach((function(p){var f=ce.getCredentialType(p);if(f!==E.NOT_DEFINED){var m=h.getSpecificCredential(p,f);if(m&&(!c||h.matchUserAssertionHash(m,c))&&(!t||h.matchHomeAccountId(m,t))&&(!r||h.matchEnvironment(m,r))&&(!a||h.matchRealm(m,a))&&(!n||h.matchCredentialType(m,n))&&(!o||h.matchClientId(m,o))&&(!i||h.matchFamilyId(m,i))&&(!s||h.matchTarget(m,s))&&(!d&&!m.requestedClaimsHash||m.requestedClaimsHash===d)){if(n===R.ACCESS_TOKEN_WITH_AUTH_SCHEME){if(u&&!h.matchTokenType(m,u))return;if(u===e.AuthenticationScheme.SSH&&l&&!h.matchKeyId(m,l))return}var v=h.updateCredentialCacheKey(p,m);switch(f){case R.ID_TOKEN:g.idTokens[v]=m;break;case R.ACCESS_TOKEN:case R.ACCESS_TOKEN_WITH_AUTH_SCHEME:g.accessTokens[v]=m;break;case R.REFRESH_TOKEN:g.refreshTokens[v]=m}}}})),g},t.prototype.getAppMetadataFilteredBy=function(e){return this.getAppMetadataFilteredByInternal(e.environment,e.clientId)},t.prototype.getAppMetadataFilteredByInternal=function(e,t){var r=this,n=this.getKeys(),o={};return n.forEach((function(n){if(r.isAppMetadata(n)){var i=r.getAppMetadata(n);i&&(e&&!r.matchEnvironment(i,e)||t&&!r.matchClientId(i,t)||(o[n]=i))}})),o},t.prototype.getAuthorityMetadataByAlias=function(e){var t=this,r=this.getAuthorityMetadataKeys(),n=null;return r.forEach((function(r){if(t.isAuthorityMetadata(r)&&-1!==r.indexOf(t.clientId)){var o=t.getAuthorityMetadata(r);o&&-1!==o.aliases.indexOf(e)&&(n=o)}})),n},t.prototype.removeAllAccounts=function(){return d(this,void 0,void 0,(function(){var e,t,r=this;return h(this,(function(n){switch(n.label){case 0:return e=this.getKeys(),t=[],e.forEach((function(e){r.getAccount(e)&&t.push(r.removeAccount(e))})),[4,Promise.all(t)];case 1:return n.sent(),[2,!0]}}))}))},t.prototype.removeAccount=function(e){return d(this,void 0,void 0,(function(){var t;return h(this,(function(r){switch(r.label){case 0:if(!(t=this.getAccount(e)))throw re.createNoAccountFoundError();return[4,this.removeAccountContext(t)];case 1:return[2,r.sent()&&this.removeItem(e,k.ACCOUNT)]}}))}))},t.prototype.removeAccountContext=function(e){return d(this,void 0,void 0,(function(){var t,r,n,o=this;return h(this,(function(i){switch(i.label){case 0:return t=this.getKeys(),r=e.generateAccountId(),n=[],t.forEach((function(e){var t=ce.getCredentialType(e);if(t!==E.NOT_DEFINED){var i=o.getSpecificCredential(e,t);i&&r===i.generateAccountId()&&n.push(o.removeCredential(i))}})),[4,Promise.all(n)];case 1:return i.sent(),[2,!0]}}))}))},t.prototype.removeCredential=function(t){return d(this,void 0,void 0,(function(){var r,n;return h(this,(function(o){switch(o.label){case 0:if(r=t.generateCredentialKey(),t.credentialType.toLowerCase()!==R.ACCESS_TOKEN_WITH_AUTH_SCHEME.toLowerCase())return[3,4];if(t.tokenType!==e.AuthenticationScheme.POP)return[3,4];if(!(n=t.keyId))return[3,4];o.label=1;case 1:return o.trys.push([1,3,,4]),[4,this.cryptoImpl.removeTokenBindingKey(n)];case 2:return o.sent(),[3,4];case 3:throw o.sent(),re.createBindingKeyNotRemovedError();case 4:return[2,this.removeItem(r,k.CREDENTIAL)]}}))}))},t.prototype.removeAppMetadata=function(){var e=this;return this.getKeys().forEach((function(t){e.isAppMetadata(t)&&e.removeItem(t,k.APP_METADATA)})),!0},t.prototype.readCacheRecord=function(e,t,r,n){var o=this.readAccountFromCache(e),i=this.readIdTokenFromCache(t,e),a=this.readAccessTokenFromCache(t,e,r),s=this.readRefreshTokenFromCache(t,e,!1),c=this.readAppMetadataFromCache(n,t);return o&&i&&(o.idTokenClaims=new fe(i.secret,this.cryptoImpl).claims),{account:o,idToken:i,accessToken:a,refreshToken:s,appMetadata:c}},t.prototype.readAccountFromCache=function(e){var t=ge.generateAccountCacheKey(e);return this.getAccount(t)},t.prototype.readAccountFromCacheWithNativeAccountId=function(e){var t={nativeAccountId:e},r=this.getAccountsFilteredBy(t),n=Object.keys(r).map((function(e){return r[e]}));if(n.length<1)return null;if(n.length>1)throw re.createMultipleMatchingAccountsInCacheError();return r[0]},t.prototype.readIdTokenFromCache=function(e,t){var r={homeAccountId:t.homeAccountId,environment:t.environment,credentialType:R.ID_TOKEN,clientId:e,realm:t.tenantId},n=this.getCredentialsFilteredBy(r),o=Object.keys(n.idTokens).map((function(e){return n.idTokens[e]})),i=o.length;if(i<1)return null;if(i>1)throw re.createMultipleMatchingTokensInCacheError();return o[0]},t.prototype.readAccessTokenFromCache=function(t,r,n){var o=new de(n.scopes||[]),i=n.authenticationScheme||e.AuthenticationScheme.BEARER,a=i&&i.toLowerCase()!==e.AuthenticationScheme.BEARER.toLowerCase()?R.ACCESS_TOKEN_WITH_AUTH_SCHEME:R.ACCESS_TOKEN,s={homeAccountId:r.homeAccountId,environment:r.environment,credentialType:a,clientId:t,realm:r.tenantId,target:o.printScopesLowerCase(),tokenType:i,keyId:n.sshKid,requestedClaimsHash:n.requestedClaimsHash},c=this.getCredentialsFilteredBy(s),u=Object.keys(c.accessTokens).map((function(e){return c.accessTokens[e]})),l=u.length;if(l<1)return null;if(l>1)throw re.createMultipleMatchingTokensInCacheError();return u[0]},t.prototype.readRefreshTokenFromCache=function(e,t,r){var n=r?U:void 0,o={homeAccountId:t.homeAccountId,environment:t.environment,credentialType:R.REFRESH_TOKEN,clientId:e,familyId:n},i=this.getCredentialsFilteredBy(o),a=Object.keys(i.refreshTokens).map((function(e){return i.refreshTokens[e]}));return a.length<1?null:a[0]},t.prototype.readAppMetadataFromCache=function(e,t){var r={environment:e,clientId:t},n=this.getAppMetadataFilteredBy(r),o=Object.keys(n).map((function(e){return n[e]})),i=o.length;if(i<1)return null;if(i>1)throw re.createMultipleMatchingAppMetadataInCacheError();return o[0]},t.prototype.isAppMetadataFOCI=function(e,t){var r=this.readAppMetadataFromCache(e,t);return!(!r||r.familyId!==U)},t.prototype.matchHomeAccountId=function(e,t){return!(!e.homeAccountId||t!==e.homeAccountId)},t.prototype.matchUserAssertionHash=function(e,t){return!(!e.userAssertionHash||t!==e.userAssertionHash)},t.prototype.matchEnvironment=function(e,t){var r=this.getAuthorityMetadataByAlias(t);return!!(r&&r.aliases.indexOf(e.environment)>-1)},t.prototype.matchCredentialType=function(e,t){return e.credentialType&&t.toLowerCase()===e.credentialType.toLowerCase()},t.prototype.matchClientId=function(e,t){return!(!e.clientId||t!==e.clientId)},t.prototype.matchFamilyId=function(e,t){return!(!e.familyId||t!==e.familyId)},t.prototype.matchRealm=function(e,t){return!(!e.realm||t!==e.realm)},t.prototype.matchNativeAccountId=function(e,t){return!(!e.nativeAccountId||t!==e.nativeAccountId)},t.prototype.matchTarget=function(e,t){if(e.credentialType!==R.ACCESS_TOKEN&&e.credentialType!==R.ACCESS_TOKEN_WITH_AUTH_SCHEME||!e.target)return!1;var r=de.fromString(e.target),n=de.fromString(t);return n.containsOnlyOIDCScopes()?n.removeScope(E.OFFLINE_ACCESS_SCOPE):n.removeOIDCScopes(),r.containsScopeSet(n)},t.prototype.matchTokenType=function(e,t){return!(!e.tokenType||e.tokenType!==t)},t.prototype.matchKeyId=function(e,t){return!(!e.keyId||e.keyId!==t)},t.prototype.isAppMetadata=function(e){return-1!==e.indexOf(M)},t.prototype.isAuthorityMetadata=function(e){return-1!==e.indexOf(q)},t.prototype.generateAuthorityMetadataCacheKey=function(e){return q+"-"+this.clientId+"-"+e},t.prototype.getSpecificCredential=function(e,t){switch(t){case R.ID_TOKEN:return this.getIdTokenCredential(e);case R.ACCESS_TOKEN:case R.ACCESS_TOKEN_WITH_AUTH_SCHEME:return this.getAccessTokenCredential(e);case R.REFRESH_TOKEN:return this.getRefreshTokenCredential(e);default:return null}},t.toObject=function(e,t){for(var r in t)e[r]=t[r];return e},t}(),ve=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return u(t,e),t.prototype.setAccount=function(){throw $.createUnexpectedError("Storage interface - setAccount() has not been implemented for the cacheStorage interface.")},t.prototype.getAccount=function(){throw $.createUnexpectedError("Storage interface - getAccount() has not been implemented for the cacheStorage interface.")},t.prototype.setIdTokenCredential=function(){throw $.createUnexpectedError("Storage interface - setIdTokenCredential() has not been implemented for the cacheStorage interface.")},t.prototype.getIdTokenCredential=function(){throw $.createUnexpectedError("Storage interface - getIdTokenCredential() has not been implemented for the cacheStorage interface.")},t.prototype.setAccessTokenCredential=function(){throw $.createUnexpectedError("Storage interface - setAccessTokenCredential() has not been implemented for the cacheStorage interface.")},t.prototype.getAccessTokenCredential=function(){throw $.createUnexpectedError("Storage interface - getAccessTokenCredential() has not been implemented for the cacheStorage interface.")},t.prototype.setRefreshTokenCredential=function(){throw $.createUnexpectedError("Storage interface - setRefreshTokenCredential() has not been implemented for the cacheStorage interface.")},t.prototype.getRefreshTokenCredential=function(){throw $.createUnexpectedError("Storage interface - getRefreshTokenCredential() has not been implemented for the cacheStorage interface.")},t.prototype.setAppMetadata=function(){throw $.createUnexpectedError("Storage interface - setAppMetadata() has not been implemented for the cacheStorage interface.")},t.prototype.getAppMetadata=function(){throw $.createUnexpectedError("Storage interface - getAppMetadata() has not been implemented for the cacheStorage interface.")},t.prototype.setServerTelemetry=function(){throw $.createUnexpectedError("Storage interface - setServerTelemetry() has not been implemented for the cacheStorage interface.")},t.prototype.getServerTelemetry=function(){throw $.createUnexpectedError("Storage interface - getServerTelemetry() has not been implemented for the cacheStorage interface.")},t.prototype.setAuthorityMetadata=function(){throw $.createUnexpectedError("Storage interface - setAuthorityMetadata() has not been implemented for the cacheStorage interface.")},t.prototype.getAuthorityMetadata=function(){throw $.createUnexpectedError("Storage interface - getAuthorityMetadata() has not been implemented for the cacheStorage interface.")},t.prototype.getAuthorityMetadataKeys=function(){throw $.createUnexpectedError("Storage interface - getAuthorityMetadataKeys() has not been implemented for the cacheStorage interface.")},t.prototype.setThrottlingCache=function(){throw $.createUnexpectedError("Storage interface - setThrottlingCache() has not been implemented for the cacheStorage interface.")},t.prototype.getThrottlingCache=function(){throw $.createUnexpectedError("Storage interface - getThrottlingCache() has not been implemented for the cacheStorage interface.")},t.prototype.removeItem=function(){throw $.createUnexpectedError("Storage interface - removeItem() has not been implemented for the cacheStorage interface.")},t.prototype.containsKey=function(){throw $.createUnexpectedError("Storage interface - containsKey() has not been implemented for the cacheStorage interface.")},t.prototype.getKeys=function(){throw $.createUnexpectedError("Storage interface - getKeys() has not been implemented for the cacheStorage interface.")},t.prototype.clear=function(){return d(this,void 0,void 0,(function(){return h(this,(function(e){throw"Storage interface - clear() has not been implemented for the cacheStorage interface.",$.createUnexpectedError("Storage interface - clear() has not been implemented for the cacheStorage interface.")}))}))},t.prototype.updateCredentialCacheKey=function(){throw $.createUnexpectedError("Storage interface - updateCredentialCacheKey() has not been implemented for the cacheStorage interface.")},t}(me),ye={tokenRenewalOffsetSeconds:300,preventCorsPreflight:!1,proxyUrl:E.EMPTY_STRING},Ee={loggerCallback:function(){},piiLoggingEnabled:!1,logLevel:e.LogLevel.Info,correlationId:E.EMPTY_STRING},Ce={sendGetRequestAsync:function(){return d(this,void 0,void 0,(function(){return h(this,(function(e){throw"Network interface - sendGetRequestAsync() has not been implemented",$.createUnexpectedError("Network interface - sendGetRequestAsync() has not been implemented")}))}))},sendPostRequestAsync:function(){return d(this,void 0,void 0,(function(){return h(this,(function(e){throw"Network interface - sendPostRequestAsync() has not been implemented",$.createUnexpectedError("Network interface - sendPostRequestAsync() has not been implemented")}))}))}},_e={sku:E.SKU,version:ae,cpu:E.EMPTY_STRING,os:E.EMPTY_STRING},Te={clientSecret:E.EMPTY_STRING,clientAssertion:void 0},we={azureCloudInstance:e.AzureCloudInstance.None,tenant:""+E.DEFAULT_COMMON_TENANT},Ie={application:{appName:"",appVersion:""}};
/*! @azure/msal-common v7.3.0 2022-08-01 */
/*! @azure/msal-common v7.3.0 2022-08-01 */
var Se,Ae=function(e){function t(r,n,o){var i=e.call(this,r,n,o)||this;return i.name="ServerError",Object.setPrototypeOf(i,t.prototype),i}return u(t,e),t}($),be=function(){function e(){}return e.generateThrottlingStorageKey=function(e){return W+"."+JSON.stringify(e)},e.preProcess=function(t,r){var n,o=e.generateThrottlingStorageKey(r),i=t.getThrottlingCache(o);if(i){if(i.throttleTime<Date.now())return void t.removeItem(o,k.THROTTLING);throw new Ae((null===(n=i.errorCodes)||void 0===n?void 0:n.join(" "))||E.EMPTY_STRING,i.errorMessage,i.subError)}},e.postProcess=function(t,r,n){if(e.checkResponseStatus(n)||e.checkResponseForRetryAfter(n)){var o={throttleTime:e.calculateThrottleTime(parseInt(n.headers[g.RETRY_AFTER])),error:n.body.error,errorCodes:n.body.error_codes,errorMessage:n.body.error_description,subError:n.body.suberror};t.setThrottlingCache(e.generateThrottlingStorageKey(r),o)}},e.checkResponseStatus=function(e){return 429===e.status||e.status>=500&&e.status<600},e.checkResponseForRetryAfter=function(e){return!!e.headers&&(e.headers.hasOwnProperty(g.RETRY_AFTER)&&(e.status<200||e.status>=300))},e.calculateThrottleTime=function(e){var t=e<=0?0:e,r=Date.now()/1e3;return Math.floor(1e3*Math.min(r+(t||j),r+Y))},e.removeThrottle=function(e,t,r,n){var o={clientId:t,authority:r.authority,scopes:r.scopes,homeAccountIdentifier:n,claims:r.claims,authenticationScheme:r.authenticationScheme,resourceRequestMethod:r.resourceRequestMethod,resourceRequestUri:r.resourceRequestUri,shrClaims:r.shrClaims,sshKid:r.sshKid},i=this.generateThrottlingStorageKey(o);return e.removeItem(i,k.THROTTLING)},e}(),Re=function(){function e(e,t){this.networkClient=e,this.cacheManager=t}return e.prototype.sendPostRequest=function(e,t,r){return d(this,void 0,void 0,(function(){var n,o;return h(this,(function(i){switch(i.label){case 0:be.preProcess(this.cacheManager,e),i.label=1;case 1:return i.trys.push([1,3,,4]),[4,this.networkClient.sendPostRequestAsync(t,r)];case 2:return n=i.sent(),[3,4];case 3:throw(o=i.sent())instanceof $?o:re.createNetworkError(t,o);case 4:return be.postProcess(this.cacheManager,e,n),[2,n]}}))}))},e}();
/*! @azure/msal-common v7.3.0 2022-08-01 */!function(e){e.HOME_ACCOUNT_ID="home_account_id",e.UPN="UPN"}(Se||(Se={}));
/*! @azure/msal-common v7.3.0 2022-08-01 */
var ke,Ne=function(){function e(e,t){var r,n,o,i,a,s,c,u,d,h,p,g,f,m,v;this.config=(o=(r=e).authOptions,i=r.systemOptions,a=r.loggerOptions,s=r.storageInterface,c=r.networkInterface,u=r.cryptoInterface,d=r.clientCredentials,h=r.libraryInfo,p=r.telemetry,g=r.serverTelemetryManager,f=r.persistencePlugin,m=r.serializableCache,v=l(l({},Ee),a),{authOptions:(n=o,l({clientCapabilities:[],azureCloudOptions:we,skipAuthorityMetadataCache:!1},n)),systemOptions:l(l({},ye),i),loggerOptions:v,storageInterface:s||new ve(o.clientId,ee),networkInterface:c||Ce,cryptoInterface:u||ee,clientCredentials:d||Te,libraryInfo:l(l({},_e),h),telemetry:l(l({},Ie),p),serverTelemetryManager:g||null,persistencePlugin:f||null,serializableCache:m||null}),this.logger=new ie(this.config.loggerOptions,"@azure/msal-common",ae),this.cryptoUtils=this.config.cryptoInterface,this.cacheManager=this.config.storageInterface,this.networkClient=this.config.networkInterface,this.networkManager=new Re(this.networkClient,this.cacheManager),this.serverTelemetryManager=this.config.serverTelemetryManager,this.authority=this.config.authOptions.authority,this.performanceClient=t}return e.prototype.createTokenRequestHeaders=function(e){var t={};if(t[g.CONTENT_TYPE]=E.URL_FORM_CONTENT_TYPE,!this.config.systemOptions.preventCorsPreflight&&e)switch(e.type){case Se.HOME_ACCOUNT_ID:try{var r=pe(e.credential);t[g.CCS_HEADER]="Oid:"+r.uid+"@"+r.utid}catch(e){this.logger.verbose("Could not parse home account ID for CCS Header: "+e)}break;case Se.UPN:t[g.CCS_HEADER]="UPN: "+e.credential}return t},e.prototype.executePostToTokenEndpoint=function(e,t,r,n){return d(this,void 0,void 0,(function(){var o;return h(this,(function(i){switch(i.label){case 0:return[4,this.networkManager.sendPostRequest(n,e,{body:t,headers:r,proxyUrl:this.config.systemOptions.proxyUrl})];case 1:return o=i.sent(),this.config.serverTelemetryManager&&o.status<500&&429!==o.status&&this.config.serverTelemetryManager.clearTelemetryCache(),[2,o]}}))}))},e.prototype.updateAuthority=function(e){if(!e.discoveryComplete())throw re.createEndpointDiscoveryIncompleteError("Updated authority has not completed endpoint discovery.");this.authority=e},e}(),Pe=function(){function e(){}return e.validateRedirectUri=function(e){if(ne.isEmpty(e))throw le.createRedirectUriEmptyError()},e.validatePrompt=function(e){var t=[];for(var r in w)t.push(w[r]);if(t.indexOf(e)<0)throw le.createInvalidPromptError(e)},e.validateClaims=function(e){try{JSON.parse(e)}catch(e){throw le.createInvalidClaimsRequestError()}},e.validateCodeChallengeParams=function(e,t){if(ne.isEmpty(e)||ne.isEmpty(t))throw le.createInvalidCodeChallengeParamsError();this.validateCodeChallengeMethod(t)},e.validateCodeChallengeMethod=function(e){if([P.PLAIN,P.S256].indexOf(e)<0)throw le.createInvalidCodeChallengeMethodError()},e.sanitizeEQParams=function(e,t){return e?(t.forEach((function(t,r){e[r]&&delete e[r]})),e):{}},e}(),Oe=function(){function t(){this.parameters=new Map}return t.prototype.addResponseTypeCode=function(){this.parameters.set(v.RESPONSE_TYPE,encodeURIComponent(E.CODE_RESPONSE_TYPE))},t.prototype.addResponseTypeForTokenAndIdToken=function(){this.parameters.set(v.RESPONSE_TYPE,encodeURIComponent(E.TOKEN_RESPONSE_TYPE+" "+E.ID_TOKEN_RESPONSE_TYPE))},t.prototype.addResponseMode=function(e){this.parameters.set(v.RESPONSE_MODE,encodeURIComponent(e||I.QUERY))},t.prototype.addNativeBroker=function(){this.parameters.set(v.NATIVE_BROKER,encodeURIComponent("1"))},t.prototype.addScopes=function(e,t){void 0===t&&(t=!0);var r=t?p(e||[],C):e||[],n=new de(r);this.parameters.set(v.SCOPE,encodeURIComponent(n.printScopes()))},t.prototype.addClientId=function(e){this.parameters.set(v.CLIENT_ID,encodeURIComponent(e))},t.prototype.addRedirectUri=function(e){Pe.validateRedirectUri(e),this.parameters.set(v.REDIRECT_URI,encodeURIComponent(e))},t.prototype.addPostLogoutRedirectUri=function(e){Pe.validateRedirectUri(e),this.parameters.set(v.POST_LOGOUT_URI,encodeURIComponent(e))},t.prototype.addIdTokenHint=function(e){this.parameters.set(v.ID_TOKEN_HINT,encodeURIComponent(e))},t.prototype.addDomainHint=function(e){this.parameters.set(T.DOMAIN_HINT,encodeURIComponent(e))},t.prototype.addLoginHint=function(e){this.parameters.set(T.LOGIN_HINT,encodeURIComponent(e))},t.prototype.addCcsUpn=function(e){this.parameters.set(g.CCS_HEADER,encodeURIComponent("UPN:"+e))},t.prototype.addCcsOid=function(e){this.parameters.set(g.CCS_HEADER,encodeURIComponent("Oid:"+e.uid+"@"+e.utid))},t.prototype.addSid=function(e){this.parameters.set(T.SID,encodeURIComponent(e))},t.prototype.addClaims=function(e,t){var r=this.addClientCapabilitiesToClaims(e,t);Pe.validateClaims(r),this.parameters.set(v.CLAIMS,encodeURIComponent(r))},t.prototype.addCorrelationId=function(e){this.parameters.set(v.CLIENT_REQUEST_ID,encodeURIComponent(e))},t.prototype.addLibraryInfo=function(e){this.parameters.set(v.X_CLIENT_SKU,e.sku),this.parameters.set(v.X_CLIENT_VER,e.version),e.os&&this.parameters.set(v.X_CLIENT_OS,e.os),e.cpu&&this.parameters.set(v.X_CLIENT_CPU,e.cpu)},t.prototype.addApplicationTelemetry=function(e){(null==e?void 0:e.appName)&&this.parameters.set(v.X_APP_NAME,e.appName),(null==e?void 0:e.appVersion)&&this.parameters.set(v.X_APP_VER,e.appVersion)},t.prototype.addPrompt=function(e){Pe.validatePrompt(e),this.parameters.set(""+v.PROMPT,encodeURIComponent(e))},t.prototype.addState=function(e){ne.isEmpty(e)||this.parameters.set(v.STATE,encodeURIComponent(e))},t.prototype.addNonce=function(e){this.parameters.set(v.NONCE,encodeURIComponent(e))},t.prototype.addCodeChallengeParams=function(e,t){if(Pe.validateCodeChallengeParams(e,t),!e||!t)throw le.createInvalidCodeChallengeParamsError();this.parameters.set(v.CODE_CHALLENGE,encodeURIComponent(e)),this.parameters.set(v.CODE_CHALLENGE_METHOD,encodeURIComponent(t))},t.prototype.addAuthorizationCode=function(e){this.parameters.set(v.CODE,encodeURIComponent(e))},t.prototype.addDeviceCode=function(e){this.parameters.set(v.DEVICE_CODE,encodeURIComponent(e))},t.prototype.addRefreshToken=function(e){this.parameters.set(v.REFRESH_TOKEN,encodeURIComponent(e))},t.prototype.addCodeVerifier=function(e){this.parameters.set(v.CODE_VERIFIER,encodeURIComponent(e))},t.prototype.addClientSecret=function(e){this.parameters.set(v.CLIENT_SECRET,encodeURIComponent(e))},t.prototype.addClientAssertion=function(e){ne.isEmpty(e)||this.parameters.set(v.CLIENT_ASSERTION,encodeURIComponent(e))},t.prototype.addClientAssertionType=function(e){ne.isEmpty(e)||this.parameters.set(v.CLIENT_ASSERTION_TYPE,encodeURIComponent(e))},t.prototype.addOboAssertion=function(e){this.parameters.set(v.OBO_ASSERTION,encodeURIComponent(e))},t.prototype.addRequestTokenUse=function(e){this.parameters.set(v.REQUESTED_TOKEN_USE,encodeURIComponent(e))},t.prototype.addGrantType=function(e){this.parameters.set(v.GRANT_TYPE,encodeURIComponent(e))},t.prototype.addClientInfo=function(){this.parameters.set("client_info","1")},t.prototype.addExtraQueryParameters=function(e){var t=this;Pe.sanitizeEQParams(e,this.parameters),Object.keys(e).forEach((function(r){t.parameters.set(r,e[r])}))},t.prototype.addClientCapabilitiesToClaims=function(e,t){var r;if(e)try{r=JSON.parse(e)}catch(e){throw le.createInvalidClaimsRequestError()}else r={};return t&&t.length>0&&(r.hasOwnProperty(y.ACCESS_TOKEN)||(r[y.ACCESS_TOKEN]={}),r[y.ACCESS_TOKEN][y.XMS_CC]={values:t}),JSON.stringify(r)},t.prototype.addUsername=function(e){this.parameters.set(F.username,encodeURIComponent(e))},t.prototype.addPassword=function(e){this.parameters.set(F.password,encodeURIComponent(e))},t.prototype.addPopToken=function(t){ne.isEmpty(t)||(this.parameters.set(v.TOKEN_TYPE,e.AuthenticationScheme.POP),this.parameters.set(v.REQ_CNF,encodeURIComponent(t)))},t.prototype.addSshJwk=function(t){ne.isEmpty(t)||(this.parameters.set(v.TOKEN_TYPE,e.AuthenticationScheme.SSH),this.parameters.set(v.REQ_CNF,encodeURIComponent(t)))},t.prototype.addServerTelemetry=function(e){this.parameters.set(v.X_CLIENT_CURR_TELEM,e.generateCurrentRequestHeaderValue()),this.parameters.set(v.X_CLIENT_LAST_TELEM,e.generateLastRequestHeaderValue())},t.prototype.addThrottling=function(){this.parameters.set(v.X_MS_LIB_CAPABILITY,V)},t.prototype.addLogoutHint=function(e){this.parameters.set(v.LOGOUT_HINT,encodeURIComponent(e))},t.prototype.createQueryString=function(){var e=new Array;return this.parameters.forEach((function(t,r){e.push(r+"="+t)})),e.join("&")},t}(),Me=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return u(t,e),t.createIdTokenEntity=function(e,r,n,o,i){var a=new t;return a.credentialType=R.ID_TOKEN,a.homeAccountId=e,a.environment=r,a.clientId=o,a.secret=n,a.realm=i,a},t.isIdTokenEntity=function(e){return!!e&&(e.hasOwnProperty("homeAccountId")&&e.hasOwnProperty("environment")&&e.hasOwnProperty("credentialType")&&e.hasOwnProperty("realm")&&e.hasOwnProperty("clientId")&&e.hasOwnProperty("secret")&&e.credentialType===R.ID_TOKEN)},t}(ce),Ue=function(){function e(){}return e.nowSeconds=function(){return Math.round((new Date).getTime()/1e3)},e.isTokenExpired=function(t,r){var n=Number(t)||0;return e.nowSeconds()+r>n},e.wasClockTurnedBack=function(t){return Number(t)>e.nowSeconds()},e.delay=function(e,t){return new Promise((function(r){return setTimeout((function(){return r(t)}),e)}))},e}(),qe=function(t){function r(){return null!==t&&t.apply(this,arguments)||this}return u(r,t),r.createAccessTokenEntity=function(t,n,o,i,a,s,c,u,l,d,h,p,g,f,m){var v,y,E=new r;E.homeAccountId=t,E.credentialType=R.ACCESS_TOKEN,E.secret=o;var C=Ue.nowSeconds();if(E.cachedAt=C.toString(),E.expiresOn=c.toString(),E.extendedExpiresOn=u.toString(),d&&(E.refreshOn=d.toString()),E.environment=n,E.clientId=i,E.realm=a,E.target=s,E.userAssertionHash=p,E.tokenType=ne.isEmpty(h)?e.AuthenticationScheme.BEARER:h,f&&(E.requestedClaims=f,E.requestedClaimsHash=m),(null===(v=E.tokenType)||void 0===v?void 0:v.toLowerCase())!==e.AuthenticationScheme.BEARER.toLowerCase())switch(E.credentialType=R.ACCESS_TOKEN_WITH_AUTH_SCHEME,E.tokenType){case e.AuthenticationScheme.POP:var _=fe.extractTokenClaims(o,l);if(!(null===(y=null==_?void 0:_.cnf)||void 0===y?void 0:y.kid))throw re.createTokenClaimsRequiredError();E.keyId=_.cnf.kid;break;case e.AuthenticationScheme.SSH:E.keyId=g}return E},r.isAccessTokenEntity=function(e){return!!e&&(e.hasOwnProperty("homeAccountId")&&e.hasOwnProperty("environment")&&e.hasOwnProperty("credentialType")&&e.hasOwnProperty("realm")&&e.hasOwnProperty("clientId")&&e.hasOwnProperty("secret")&&e.hasOwnProperty("target")&&(e.credentialType===R.ACCESS_TOKEN||e.credentialType===R.ACCESS_TOKEN_WITH_AUTH_SCHEME))},r}(ce),He=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return u(t,e),t.createRefreshTokenEntity=function(e,r,n,o,i,a){var s=new t;return s.clientId=o,s.credentialType=R.REFRESH_TOKEN,s.environment=r,s.homeAccountId=e,s.secret=n,s.userAssertionHash=a,i&&(s.familyId=i),s},t.isRefreshTokenEntity=function(e){return!!e&&(e.hasOwnProperty("homeAccountId")&&e.hasOwnProperty("environment")&&e.hasOwnProperty("credentialType")&&e.hasOwnProperty("clientId")&&e.hasOwnProperty("secret")&&e.credentialType===R.REFRESH_TOKEN)},t}(ce),Le=["interaction_required","consent_required","login_required"],De=["message_only","additional_action","basic_action","user_password_expired","consent_required"],Fe={noTokensFoundError:{code:"no_tokens_found",desc:"No refresh token found in the cache. Please sign-in."},native_account_unavailable:{code:"native_account_unavailable",desc:"The requested account is not available in the native broker. It may have been deleted or logged out. Please sign-in again using an interactive API."}},xe=function(e){function t(r,n,o){var i=e.call(this,r,n,o)||this;return i.name="InteractionRequiredAuthError",Object.setPrototypeOf(i,t.prototype),i}return u(t,e),t.isInteractionRequiredError=function(e,t,r){var n=!!e&&Le.indexOf(e)>-1,o=!!r&&De.indexOf(r)>-1,i=!!t&&Le.some((function(e){return t.indexOf(e)>-1}));return n||i||o},t.createNoTokensFoundError=function(){return new t(Fe.noTokensFoundError.code,Fe.noTokensFoundError.desc)},t.createNativeAccountUnavailableError=function(){return new t(Fe.native_account_unavailable.code,Fe.native_account_unavailable.desc)},t}($),Ke=function(e,t,r,n,o){this.account=e||null,this.idToken=t||null,this.accessToken=r||null,this.refreshToken=n||null,this.appMetadata=o||null},Be=function(){function e(){}return e.setRequestState=function(t,r,n){var o=e.generateLibraryState(t,n);return ne.isEmpty(r)?o:""+o+E.RESOURCE_DELIM+r},e.generateLibraryState=function(e,t){if(!e)throw re.createNoCryptoObjectError("generateLibraryState");var r={id:e.createNewGuid()};t&&(r.meta=t);var n=JSON.stringify(r);return e.base64Encode(n)},e.parseRequestState=function(e,t){if(!e)throw re.createNoCryptoObjectError("parseRequestState");if(ne.isEmpty(t))throw re.createInvalidStateError(t,"Null, undefined or empty state");try{var r=t.split(E.RESOURCE_DELIM),n=r[0],o=r.length>1?r.slice(1).join(E.RESOURCE_DELIM):E.EMPTY_STRING,i=e.base64Decode(n),a=JSON.parse(i);return{userRequestState:ne.isEmpty(o)?E.EMPTY_STRING:o,libraryState:a}}catch(e){throw re.createInvalidStateError(t,e)}},e}(),Ge=function(){function e(t){if(this._urlString=t,ne.isEmpty(this._urlString))throw le.createUrlEmptyError();ne.isEmpty(this.getHash())&&(this._urlString=e.canonicalizeUri(t))}return Object.defineProperty(e.prototype,"urlString",{get:function(){return this._urlString},enumerable:!1,configurable:!0}),e.canonicalizeUri=function(e){if(e){var t=e.toLowerCase();return ne.endsWith(t,"?")?t=t.slice(0,-1):ne.endsWith(t,"?/")&&(t=t.slice(0,-2)),ne.endsWith(t,"/")||(t+="/"),t}return e},e.prototype.validateAsUri=function(){var e;try{e=this.getUrlComponents()}catch(e){throw le.createUrlParseError(e)}if(!e.HostNameAndPort||!e.PathSegments)throw le.createUrlParseError("Given url string: "+this.urlString);if(!e.Protocol||"https:"!==e.Protocol.toLowerCase())throw le.createInsecureAuthorityUriError(this.urlString)},e.appendQueryString=function(e,t){return ne.isEmpty(t)?e:e.indexOf("?")<0?e+"?"+t:e+"&"+t},e.removeHashFromUrl=function(t){return e.canonicalizeUri(t.split("#")[0])},e.prototype.replaceTenantPath=function(t){var r=this.getUrlComponents(),n=r.PathSegments;return!t||0===n.length||n[0]!==m.COMMON&&n[0]!==m.ORGANIZATIONS||(n[0]=t),e.constructAuthorityUriFromObject(r)},e.prototype.getHash=function(){return e.parseHash(this.urlString)},e.prototype.getUrlComponents=function(){var e=RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?"),t=this.urlString.match(e);if(!t)throw le.createUrlParseError("Given url string: "+this.urlString);var r={Protocol:t[1],HostNameAndPort:t[4],AbsolutePath:t[5],QueryString:t[7]},n=r.AbsolutePath.split("/");return n=n.filter((function(e){return e&&e.length>0})),r.PathSegments=n,!ne.isEmpty(r.QueryString)&&r.QueryString.endsWith("/")&&(r.QueryString=r.QueryString.substring(0,r.QueryString.length-1)),r},e.getDomainFromUrl=function(e){var t=RegExp("^([^:/?#]+://)?([^/?#]*)"),r=e.match(t);if(!r)throw le.createUrlParseError("Given url string: "+e);return r[2]},e.getAbsoluteUrl=function(t,r){if(t[0]===E.FORWARD_SLASH){var n=new e(r).getUrlComponents();return n.Protocol+"//"+n.HostNameAndPort+t}return t},e.parseHash=function(e){var t=e.indexOf("#"),r=e.indexOf("#/");return r>-1?e.substring(r+2):t>-1?e.substring(t+1):E.EMPTY_STRING},e.constructAuthorityUriFromObject=function(t){return new e(t.Protocol+"//"+t.HostNameAndPort+"/"+t.PathSegments.join("/"))},e.getDeserializedHash=function(t){if(ne.isEmpty(t))return{};var r=e.parseHash(t),n=ne.queryStringToObject(ne.isEmpty(r)?t:r);if(!n)throw re.createHashNotDeserializedError(JSON.stringify(n));return n},e.hashContainsKnownProperties=function(t){if(ne.isEmpty(t)||t.indexOf("=")<0)return!1;var r=e.getDeserializedHash(t);return!!(r.code||r.error_description||r.error||r.state)},e}();
/*! @azure/msal-common v7.3.0 2022-08-01 */!function(e){e.SW="sw",e.UHW="uhw"}(ke||(ke={}));var ze,je,Ye=function(){function e(e){this.cryptoUtils=e}return e.prototype.generateCnf=function(e){return d(this,void 0,void 0,(function(){var t,r,n;return h(this,(function(o){switch(o.label){case 0:return[4,this.generateKid(e)];case 1:return t=o.sent(),r=this.cryptoUtils.base64Encode(JSON.stringify(t)),n={kid:t.kid,reqCnfString:r},[4,this.cryptoUtils.hashString(r)];case 2:return[2,(n.reqCnfHash=o.sent(),n)]}}))}))},e.prototype.generateKid=function(e){return d(this,void 0,void 0,(function(){return h(this,(function(t){switch(t.label){case 0:return[4,this.cryptoUtils.getPublicKeyThumbprint(e)];case 1:return[2,{kid:t.sent(),xms_ksl:ke.SW}]}}))}))},e.prototype.signPopToken=function(e,t,r){return d(this,void 0,void 0,(function(){return h(this,(function(n){return[2,this.signPayload(e,t,r)]}))}))},e.prototype.signPayload=function(e,t,r,n){return d(this,void 0,void 0,(function(){var o,i,a,s,c,u;return h(this,(function(d){switch(d.label){case 0:return o=r.resourceRequestMethod,i=r.resourceRequestUri,a=r.shrClaims,s=r.shrNonce,c=i?new Ge(i):void 0,u=null==c?void 0:c.getUrlComponents(),[4,this.cryptoUtils.signJwt(l({at:e,ts:Ue.nowSeconds(),m:null==o?void 0:o.toUpperCase(),u:null==u?void 0:u.HostNameAndPort,nonce:s||this.cryptoUtils.createNewGuid(),p:null==u?void 0:u.AbsolutePath,q:(null==u?void 0:u.QueryString)?[[],u.QueryString]:void 0,client_claims:a||void 0},n),t,r.correlationId)];case 1:return[2,d.sent()]}}))}))},e}(),We=function(){function e(){}return e.prototype.generateAppMetadataKey=function(){return e.generateAppMetadataCacheKey(this.environment,this.clientId)},e.generateAppMetadataCacheKey=function(e,t){return[M,e,t].join(b.CACHE_KEY_SEPARATOR).toLowerCase()},e.createAppMetadataEntity=function(t,r,n){var o=new e;return o.clientId=t,o.environment=r,n&&(o.familyId=n),o},e.isAppMetadataEntity=function(e,t){return!!t&&(0===e.indexOf(M)&&t.hasOwnProperty("clientId")&&t.hasOwnProperty("environment"))},e}(),Ve=function(){function e(e,t){this.cache=e,this.hasChanged=t}return Object.defineProperty(e.prototype,"cacheHasChanged",{get:function(){return this.hasChanged},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"tokenCache",{get:function(){return this.cache},enumerable:!1,configurable:!0}),e}(),Je=function(){function t(e,t,r,n,o,i){this.clientId=e,this.cacheStorage=t,this.cryptoObj=r,this.logger=n,this.serializableCache=o,this.persistencePlugin=i}return t.prototype.validateServerAuthorizationCodeResponse=function(e,t,r){if(!e.state||!t)throw e.state?re.createStateNotFoundError("Cached State"):re.createStateNotFoundError("Server State");if(decodeURIComponent(e.state)!==decodeURIComponent(t))throw re.createStateMismatchError();if(e.error||e.error_description||e.suberror){if(xe.isInteractionRequiredError(e.error,e.error_description,e.suberror))throw new xe(e.error||E.EMPTY_STRING,e.error_description,e.suberror);throw new Ae(e.error||E.EMPTY_STRING,e.error_description,e.suberror)}e.client_info&&he(e.client_info,r)},t.prototype.validateTokenResponse=function(e){if(e.error||e.error_description||e.suberror){if(xe.isInteractionRequiredError(e.error,e.error_description,e.suberror))throw new xe(e.error,e.error_description,e.suberror);var t=e.error_codes+" - ["+e.timestamp+"]: "+e.error_description+" - Correlation ID: "+e.correlation_id+" - Trace ID: "+e.trace_id;throw new Ae(e.error,t,e.suberror)}},t.prototype.handleServerTokenResponse=function(e,r,n,o,i,a,s,c){return d(this,void 0,void 0,(function(){var u,l,d,p,g;return h(this,(function(h){switch(h.label){case 0:if(e.id_token&&(u=new fe(e.id_token||E.EMPTY_STRING,this.cryptoObj),i&&!ne.isEmpty(i.nonce)&&u.claims.nonce!==i.nonce))throw re.createNonceMismatchError();this.homeAccountIdentifier=ge.generateHomeAccountId(e.client_info||E.EMPTY_STRING,r.authorityType,this.logger,this.cryptoObj,u),i&&i.state&&(l=Be.parseRequestState(this.cryptoObj,i.state)),e.key_id=e.key_id||o.sshKid||void 0,d=this.generateCacheRecord(e,r,n,o,u,a,i),h.label=1;case 1:return h.trys.push([1,,5,8]),this.persistencePlugin&&this.serializableCache?(this.logger.verbose("Persistence enabled, calling beforeCacheAccess"),p=new Ve(this.serializableCache,!0),[4,this.persistencePlugin.beforeCacheAccess(p)]):[3,3];case 2:h.sent(),h.label=3;case 3:return!s||c||!d.account||(g=d.account.generateAccountKey(),this.cacheStorage.getAccount(g))?[4,this.cacheStorage.saveCacheRecord(d)]:(this.logger.warning("Account used to refresh tokens not in persistence, refreshed tokens will not be stored in the cache"),[2,t.generateAuthenticationResult(this.cryptoObj,r,d,!1,o,u,l,void 0)]);case 4:return h.sent(),[3,8];case 5:return this.persistencePlugin&&this.serializableCache&&p?(this.logger.verbose("Persistence enabled, calling afterCacheAccess"),[4,this.persistencePlugin.afterCacheAccess(p)]):[3,7];case 6:h.sent(),h.label=7;case 7:return[7];case 8:return[2,t.generateAuthenticationResult(this.cryptoObj,r,d,!1,o,u,l,e.spa_code)]}}))}))},t.prototype.generateCacheRecord=function(e,t,r,n,o,i,a){var s,c,u=t.getPreferredCache();if(ne.isEmpty(u))throw re.createInvalidCacheEnvironmentError();!ne.isEmpty(e.id_token)&&o&&(s=Me.createIdTokenEntity(this.homeAccountIdentifier,u,e.id_token||E.EMPTY_STRING,this.clientId,o.claims.tid||E.EMPTY_STRING),c=this.generateAccountEntity(e,o,t,a));var l=null;if(!ne.isEmpty(e.access_token)){var d=e.scope?de.fromString(e.scope):new de(n.scopes||[]),h=("string"==typeof e.expires_in?parseInt(e.expires_in,10):e.expires_in)||0,p=("string"==typeof e.ext_expires_in?parseInt(e.ext_expires_in,10):e.ext_expires_in)||0,g=("string"==typeof e.refresh_in?parseInt(e.refresh_in,10):e.refresh_in)||void 0,f=r+h,m=f+p,v=g&&g>0?r+g:void 0;l=qe.createAccessTokenEntity(this.homeAccountIdentifier,u,e.access_token||E.EMPTY_STRING,this.clientId,o?o.claims.tid||E.EMPTY_STRING:t.tenant,d.printScopes(),f,m,this.cryptoObj,v,e.token_type,i,e.key_id,n.claims,n.requestedClaimsHash)}var y=null;ne.isEmpty(e.refresh_token)||(y=He.createRefreshTokenEntity(this.homeAccountIdentifier,u,e.refresh_token||E.EMPTY_STRING,this.clientId,e.foci,i));var C=null;return ne.isEmpty(e.foci)||(C=We.createAppMetadataEntity(this.clientId,u,e.foci)),new Ke(c,s,l,y,C)},t.prototype.generateAccountEntity=function(e,t,r,n){var o=r.authorityType,i=n?n.cloud_graph_host_name:E.EMPTY_STRING,a=n?n.msgraph_host:E.EMPTY_STRING;if(o===se.Adfs)return this.logger.verbose("Authority type is ADFS, creating ADFS account"),ge.createGenericAccount(this.homeAccountIdentifier,t,r,i,a);if(ne.isEmpty(e.client_info)&&"AAD"===r.protocolMode)throw re.createClientInfoEmptyError();return e.client_info?ge.createAccount(e.client_info,this.homeAccountIdentifier,t,r,i,a):ge.createGenericAccount(this.homeAccountIdentifier,t,r,i,a)},t.generateAuthenticationResult=function(t,r,n,o,i,a,s,c){var u,l,p;return d(this,void 0,void 0,(function(){var d,g,f,m,v,y,C,_,T,w,I;return h(this,(function(h){switch(h.label){case 0:if(d=E.EMPTY_STRING,g=[],f=null,v=E.EMPTY_STRING,!n.accessToken)return[3,4];if(n.accessToken.tokenType!==e.AuthenticationScheme.POP)return[3,2];if(y=new Ye(t),C=n.accessToken,_=C.secret,!(T=C.keyId))throw re.createKeyIdMissingError();return[4,y.signPopToken(_,T,i)];case 1:return d=h.sent(),[3,3];case 2:d=n.accessToken.secret,h.label=3;case 3:g=de.fromString(n.accessToken.target).asArray(),f=new Date(1e3*Number(n.accessToken.expiresOn)),m=new Date(1e3*Number(n.accessToken.extendedExpiresOn)),h.label=4;case 4:return n.appMetadata&&(v=n.appMetadata.familyId===U?U:E.EMPTY_STRING),w=(null==a?void 0:a.claims.oid)||(null==a?void 0:a.claims.sub)||E.EMPTY_STRING,I=(null==a?void 0:a.claims.tid)||E.EMPTY_STRING,[2,{authority:r.canonicalAuthority,uniqueId:w,tenantId:I,scopes:g,account:n.account?n.account.getAccountInfo():null,idToken:a?a.rawToken:E.EMPTY_STRING,idTokenClaims:a?a.claims:{},accessToken:d,fromCache:o,expiresOn:f,correlationId:i.correlationId,extExpiresOn:m,familyId:v,tokenType:(null===(u=n.accessToken)||void 0===u?void 0:u.tokenType)||E.EMPTY_STRING,state:s?s.userRequestState:E.EMPTY_STRING,cloudGraphHostName:(null===(l=n.account)||void 0===l?void 0:l.cloudGraphHostName)||E.EMPTY_STRING,msGraphHost:(null===(p=n.account)||void 0===p?void 0:p.msGraphHost)||E.EMPTY_STRING,code:c,fromNativeBroker:!1}]}}))}))},t}(),Qe=function(t){function r(e){var r=t.call(this,e)||this;return r.includeRedirectUri=!0,r}return u(r,t),r.prototype.getAuthCodeUrl=function(e){return d(this,void 0,void 0,(function(){var t;return h(this,(function(r){switch(r.label){case 0:return[4,this.createAuthCodeUrlQueryString(e)];case 1:return t=r.sent(),[2,Ge.appendQueryString(this.authority.authorizationEndpoint,t)]}}))}))},r.prototype.acquireToken=function(e,t){return d(this,void 0,void 0,(function(){var r,n,o;return h(this,(function(i){switch(i.label){case 0:if(this.logger.info("in acquireToken call"),!e||ne.isEmpty(e.code))throw re.createTokenRequestCannotBeMadeError();return r=Ue.nowSeconds(),[4,this.executeTokenRequest(this.authority,e)];case 1:return n=i.sent(),(o=new Je(this.config.authOptions.clientId,this.cacheManager,this.cryptoUtils,this.logger,this.config.serializableCache,this.config.persistencePlugin)).validateTokenResponse(n.body),[4,o.handleServerTokenResponse(n.body,this.authority,r,e,t)];case 2:return[2,i.sent()]}}))}))},r.prototype.handleFragmentResponse=function(e,t){var r=new Je(this.config.authOptions.clientId,this.cacheManager,this.cryptoUtils,this.logger,null,null),n=new Ge(e),o=Ge.getDeserializedHash(n.getHash());if(r.validateServerAuthorizationCodeResponse(o,t,this.cryptoUtils),!o.code)throw re.createNoAuthCodeInServerResponseError();return l(l({},o),{code:o.code})},r.prototype.getLogoutUri=function(e){if(!e)throw le.createEmptyLogoutRequestError();var t=this.createLogoutUrlQueryString(e);return Ge.appendQueryString(this.authority.endSessionEndpoint,t)},r.prototype.executeTokenRequest=function(e,t){return d(this,void 0,void 0,(function(){var r,n,o,i,a,s,c;return h(this,(function(u){switch(u.label){case 0:return r={clientId:this.config.authOptions.clientId,authority:e.canonicalAuthority,scopes:t.scopes,claims:t.claims,authenticationScheme:t.authenticationScheme,resourceRequestMethod:t.resourceRequestMethod,resourceRequestUri:t.resourceRequestUri,shrClaims:t.shrClaims,sshKid:t.sshKid},[4,this.createTokenRequestBody(t)];case 1:if(n=u.sent(),o=this.createTokenQueryParameters(t),i=void 0,t.clientInfo)try{a=he(t.clientInfo,this.cryptoUtils),i={credential:""+a.uid+b.CLIENT_INFO_SEPARATOR+a.utid,type:Se.HOME_ACCOUNT_ID}}catch(e){this.logger.verbose("Could not parse client info for CCS Header: "+e)}return s=this.createTokenRequestHeaders(i||t.ccsCredential),c=ne.isEmpty(o)?e.tokenEndpoint:e.tokenEndpoint+"?"+o,[2,this.executePostToTokenEndpoint(c,n,s,r)]}}))}))},r.prototype.createTokenQueryParameters=function(e){var t=new Oe;return e.tokenQueryParameters&&t.addExtraQueryParameters(e.tokenQueryParameters),t.createQueryString()},r.prototype.createTokenRequestBody=function(t){return d(this,void 0,void 0,(function(){var r,n,o,i,a,s,c;return h(this,(function(u){switch(u.label){case 0:return(r=new Oe).addClientId(this.config.authOptions.clientId),this.includeRedirectUri?r.addRedirectUri(t.redirectUri):Pe.validateRedirectUri(t.redirectUri),r.addScopes(t.scopes),r.addAuthorizationCode(t.code),r.addLibraryInfo(this.config.libraryInfo),r.addApplicationTelemetry(this.config.telemetry.application),r.addThrottling(),this.serverTelemetryManager&&r.addServerTelemetry(this.serverTelemetryManager),t.codeVerifier&&r.addCodeVerifier(t.codeVerifier),this.config.clientCredentials.clientSecret&&r.addClientSecret(this.config.clientCredentials.clientSecret),this.config.clientCredentials.clientAssertion&&(n=this.config.clientCredentials.clientAssertion,r.addClientAssertion(n.assertion),r.addClientAssertionType(n.assertionType)),r.addGrantType(S.AUTHORIZATION_CODE_GRANT),r.addClientInfo(),t.authenticationScheme!==e.AuthenticationScheme.POP?[3,2]:[4,new Ye(this.cryptoUtils).generateCnf(t)];case 1:return o=u.sent(),r.addPopToken(o.reqCnfString),[3,3];case 2:if(t.authenticationScheme===e.AuthenticationScheme.SSH){if(!t.sshJwk)throw le.createMissingSshJwkError();r.addSshJwk(t.sshJwk)}u.label=3;case 3:if(i=t.correlationId||this.config.cryptoInterface.createNewGuid(),r.addCorrelationId(i),(!ne.isEmptyObj(t.claims)||this.config.authOptions.clientCapabilities&&this.config.authOptions.clientCapabilities.length>0)&&r.addClaims(t.claims,this.config.authOptions.clientCapabilities),a=void 0,t.clientInfo)try{s=he(t.clientInfo,this.cryptoUtils),a={credential:""+s.uid+b.CLIENT_INFO_SEPARATOR+s.utid,type:Se.HOME_ACCOUNT_ID}}catch(e){this.logger.verbose("Could not parse client info for CCS Header: "+e)}else a=t.ccsCredential;if(this.config.systemOptions.preventCorsPreflight&&a)switch(a.type){case Se.HOME_ACCOUNT_ID:try{s=pe(a.credential),r.addCcsOid(s)}catch(e){this.logger.verbose("Could not parse home account ID for CCS Header: "+e)}break;case Se.UPN:r.addCcsUpn(a.credential)}return t.tokenBodyParameters&&r.addExtraQueryParameters(t.tokenBodyParameters),!t.enableSpaAuthorizationCode||t.tokenBodyParameters&&t.tokenBodyParameters[v.RETURN_SPA_CODE]||r.addExtraQueryParameters(((c={})[v.RETURN_SPA_CODE]="1",c)),[2,r.createQueryString()]}}))}))},r.prototype.createAuthCodeUrlQueryString=function(t){return d(this,void 0,void 0,(function(){var r,n,o,i,a,s,c;return h(this,(function(u){switch(u.label){case 0:if((r=new Oe).addClientId(this.config.authOptions.clientId),n=p(t.scopes||[],t.extraScopesToConsent||[]),r.addScopes(n),r.addRedirectUri(t.redirectUri),o=t.correlationId||this.config.cryptoInterface.createNewGuid(),r.addCorrelationId(o),r.addResponseMode(t.responseMode),r.addResponseTypeCode(),r.addLibraryInfo(this.config.libraryInfo),r.addApplicationTelemetry(this.config.telemetry.application),r.addClientInfo(),t.codeChallenge&&t.codeChallengeMethod&&r.addCodeChallengeParams(t.codeChallenge,t.codeChallengeMethod),t.prompt&&r.addPrompt(t.prompt),t.domainHint&&r.addDomainHint(t.domainHint),t.prompt!==w.SELECT_ACCOUNT)if(t.sid&&t.prompt===w.NONE)this.logger.verbose("createAuthCodeUrlQueryString: Prompt is none, adding sid from request"),r.addSid(t.sid);else if(t.account){if(i=this.extractAccountSid(t.account),a=this.extractLoginHint(t.account)){this.logger.verbose("createAuthCodeUrlQueryString: login_hint claim present on account"),r.addLoginHint(a);try{s=pe(t.account.homeAccountId),r.addCcsOid(s)}catch(e){this.logger.verbose("createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header")}}else if(i&&t.prompt===w.NONE){this.logger.verbose("createAuthCodeUrlQueryString: Prompt is none, adding sid from account"),r.addSid(i);try{s=pe(t.account.homeAccountId),r.addCcsOid(s)}catch(e){this.logger.verbose("createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header")}}else if(t.loginHint)this.logger.verbose("createAuthCodeUrlQueryString: Adding login_hint from request"),r.addLoginHint(t.loginHint),r.addCcsUpn(t.loginHint);else if(t.account.username){this.logger.verbose("createAuthCodeUrlQueryString: Adding login_hint from account"),r.addLoginHint(t.account.username);try{s=pe(t.account.homeAccountId),r.addCcsOid(s)}catch(e){this.logger.verbose("createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header")}}}else t.loginHint&&(this.logger.verbose("createAuthCodeUrlQueryString: No account, adding login_hint from request"),r.addLoginHint(t.loginHint),r.addCcsUpn(t.loginHint));else this.logger.verbose("createAuthCodeUrlQueryString: Prompt is select_account, ignoring account hints");return t.nonce&&r.addNonce(t.nonce),t.state&&r.addState(t.state),(!ne.isEmpty(t.claims)||this.config.authOptions.clientCapabilities&&this.config.authOptions.clientCapabilities.length>0)&&r.addClaims(t.claims,this.config.authOptions.clientCapabilities),t.extraQueryParameters&&r.addExtraQueryParameters(t.extraQueryParameters),t.nativeBroker?(r.addNativeBroker(),t.authenticationScheme!==e.AuthenticationScheme.POP?[3,2]:[4,new Ye(this.cryptoUtils).generateCnf(t)]):[3,2];case 1:c=u.sent(),r.addPopToken(c.reqCnfHash),u.label=2;case 2:return[2,r.createQueryString()]}}))}))},r.prototype.createLogoutUrlQueryString=function(e){var t=new Oe;return e.postLogoutRedirectUri&&t.addPostLogoutRedirectUri(e.postLogoutRedirectUri),e.correlationId&&t.addCorrelationId(e.correlationId),e.idTokenHint&&t.addIdTokenHint(e.idTokenHint),e.state&&t.addState(e.state),e.logoutHint&&t.addLogoutHint(e.logoutHint),e.extraQueryParameters&&t.addExtraQueryParameters(e.extraQueryParameters),t.createQueryString()},r.prototype.extractAccountSid=function(e){var t;return(null===(t=e.idTokenClaims)||void 0===t?void 0:t.sid)||null},r.prototype.extractLoginHint=function(e){var t;return(null===(t=e.idTokenClaims)||void 0===t?void 0:t.login_hint)||null},r}(Ne);
/*! @azure/msal-common v7.3.0 2022-08-01 */
/*! @azure/msal-common v7.3.0 2022-08-01 */
e.PerformanceEvents=void 0,(ze=e.PerformanceEvents||(e.PerformanceEvents={})).AcquireTokenByCode="acquireTokenByCode",ze.AcquireTokenByRefreshToken="acquireTokenByRefreshToken",ze.AcquireTokenSilent="acquireTokenSilent",ze.AcquireTokenSilentAsync="acquireTokenSilentAsync",ze.AcquireTokenPopup="acquireTokenPopup",ze.CryptoOptsGetPublicKeyThumbprint="cryptoOptsGetPublicKeyThumbprint",ze.CryptoOptsSignJwt="cryptoOptsSignJwt",ze.SilentCacheClientAcquireToken="silentCacheClientAcquireToken",ze.SilentIframeClientAcquireToken="silentIframeClientAcquireToken",ze.SilentRefreshClientAcquireToken="silentRefreshClientAcquireToken",ze.SsoSilent="ssoSilent",ze.StandardInteractionClientGetDiscoveredAuthority="standardInteractionClientGetDiscoveredAuthority",ze.FetchAccountIdWithNativeBroker="fetchAccountIdWithNativeBroker",ze.NativeInteractionClientAcquireToken="nativeInteractionClientAcquireToken",ze.RefreshTokenClientExecuteTokenRequest="refreshTokenClientExecuteTokenRequest",ze.BaseClientCreateTokenRequestHeaders="baseClientCreateTokenRequestHeaders",ze.BrokerHandhshake="brokerHandshake",ze.AcquireTokenByRefreshTokenInBroker="acquireTokenByRefreshTokenInBroker",ze.AcquireTokenByBroker="acquireTokenByBroker",function(e){e[e.NotStarted=0]="NotStarted",e[e.InProgress=1]="InProgress",e[e.Completed=2]="Completed"}(je||(je={}));
/*! @azure/msal-common v7.3.0 2022-08-01 */
var Xe=function(t){function r(e,r){return t.call(this,e,r)||this}return u(r,t),r.prototype.acquireToken=function(e){return d(this,void 0,void 0,(function(){var t,r,n;return h(this,(function(o){switch(o.label){case 0:return t=Ue.nowSeconds(),[4,this.executeTokenRequest(e,this.authority)];case 1:return r=o.sent(),(n=new Je(this.config.authOptions.clientId,this.cacheManager,this.cryptoUtils,this.logger,this.config.serializableCache,this.config.persistencePlugin)).validateTokenResponse(r.body),[2,n.handleServerTokenResponse(r.body,this.authority,t,e,void 0,void 0,!0,e.forceCache)]}}))}))},r.prototype.acquireTokenByRefreshToken=function(e){return d(this,void 0,void 0,(function(){var t,r;return h(this,(function(n){if(!e)throw le.createEmptyTokenRequestError();if(!e.account)throw re.createNoAccountInSilentRequestError();if(this.cacheManager.isAppMetadataFOCI(e.account.environment,this.config.authOptions.clientId))try{return[2,this.acquireTokenWithCachedRefreshToken(e,!0)]}catch(n){if(t=n instanceof xe&&n.errorCode===Fe.noTokensFoundError.code,r=n instanceof Ae&&n.errorCode===J&&n.subError===Q,t||r)return[2,this.acquireTokenWithCachedRefreshToken(e,!1)];throw n}return[2,this.acquireTokenWithCachedRefreshToken(e,!1)]}))}))},r.prototype.acquireTokenWithCachedRefreshToken=function(t,r){return d(this,void 0,void 0,(function(){var n,o;return h(this,(function(i){if(!(n=this.cacheManager.readRefreshTokenFromCache(this.config.authOptions.clientId,t.account,r)))throw xe.createNoTokensFoundError();return o=l(l({},t),{refreshToken:n.secret,authenticationScheme:t.authenticationScheme||e.AuthenticationScheme.BEARER,ccsCredential:{credential:t.account.homeAccountId,type:Se.HOME_ACCOUNT_ID}}),[2,this.acquireToken(o)]}))}))},r.prototype.executeTokenRequest=function(t,r){var n;return d(this,void 0,void 0,(function(){var o,i,a,s,c,u;return h(this,(function(l){switch(l.label){case 0:return o=null===(n=this.performanceClient)||void 0===n?void 0:n.startMeasurement(e.PerformanceEvents.RefreshTokenClientExecuteTokenRequest,t.correlationId),[4,this.createTokenRequestBody(t)];case 1:return i=l.sent(),a=this.createTokenQueryParameters(t),s=this.createTokenRequestHeaders(t.ccsCredential),c={clientId:this.config.authOptions.clientId,authority:r.canonicalAuthority,scopes:t.scopes,claims:t.claims,authenticationScheme:t.authenticationScheme,resourceRequestMethod:t.resourceRequestMethod,resourceRequestUri:t.resourceRequestUri,shrClaims:t.shrClaims,sshKid:t.sshKid},u=Ge.appendQueryString(r.tokenEndpoint,a),[2,this.executePostToTokenEndpoint(u,i,s,c).then((function(e){return null==o||o.endMeasurement({success:!0}),e})).catch((function(e){throw null==o||o.endMeasurement({success:!1}),e}))]}}))}))},r.prototype.createTokenQueryParameters=function(e){var t=new Oe;return e.tokenQueryParameters&&t.addExtraQueryParameters(e.tokenQueryParameters),t.createQueryString()},r.prototype.createTokenRequestBody=function(t){var r;return d(this,void 0,void 0,(function(){var n,o,i,a,s,c;return h(this,(function(u){switch(u.label){case 0:return n=t.correlationId,o=null===(r=this.performanceClient)||void 0===r?void 0:r.startMeasurement(e.PerformanceEvents.BaseClientCreateTokenRequestHeaders,n),(i=new Oe).addClientId(this.config.authOptions.clientId),i.addScopes(t.scopes),i.addGrantType(S.REFRESH_TOKEN_GRANT),i.addClientInfo(),i.addLibraryInfo(this.config.libraryInfo),i.addApplicationTelemetry(this.config.telemetry.application),i.addThrottling(),this.serverTelemetryManager&&i.addServerTelemetry(this.serverTelemetryManager),i.addCorrelationId(n),i.addRefreshToken(t.refreshToken),this.config.clientCredentials.clientSecret&&i.addClientSecret(this.config.clientCredentials.clientSecret),this.config.clientCredentials.clientAssertion&&(a=this.config.clientCredentials.clientAssertion,i.addClientAssertion(a.assertion),i.addClientAssertionType(a.assertionType)),t.authenticationScheme!==e.AuthenticationScheme.POP?[3,2]:[4,new Ye(this.cryptoUtils).generateCnf(t)];case 1:return s=u.sent(),i.addPopToken(s.reqCnfString),[3,3];case 2:if(t.authenticationScheme===e.AuthenticationScheme.SSH){if(!t.sshJwk)throw null==o||o.endMeasurement({success:!1}),le.createMissingSshJwkError();i.addSshJwk(t.sshJwk)}u.label=3;case 3:if((!ne.isEmptyObj(t.claims)||this.config.authOptions.clientCapabilities&&this.config.authOptions.clientCapabilities.length>0)&&i.addClaims(t.claims,this.config.authOptions.clientCapabilities),this.config.systemOptions.preventCorsPreflight&&t.ccsCredential)switch(t.ccsCredential.type){case Se.HOME_ACCOUNT_ID:try{c=pe(t.ccsCredential.credential),i.addCcsOid(c)}catch(e){this.logger.verbose("Could not parse home account ID for CCS Header: "+e)}break;case Se.UPN:i.addCcsUpn(t.ccsCredential.credential)}return null==o||o.endMeasurement({success:!0}),[2,i.createQueryString()]}}))}))},r}(Ne),Ze=function(e){function t(t,r){return e.call(this,t,r)||this}return u(t,e),t.prototype.acquireToken=function(e){return d(this,void 0,void 0,(function(){var t;return h(this,(function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,this.acquireCachedToken(e)];case 1:return[2,r.sent()];case 2:if((t=r.sent())instanceof re&&t.errorCode===te.tokenRefreshRequired.code)return[2,new Xe(this.config,this.performanceClient).acquireTokenByRefreshToken(e)];throw t;case 3:return[2]}}))}))},t.prototype.acquireCachedToken=function(e){var t,r,n,o;return d(this,void 0,void 0,(function(){var i,a;return h(this,(function(s){switch(s.label){case 0:if(!e)throw le.createEmptyTokenRequestError();if(e.forceRefresh)throw null===(t=this.serverTelemetryManager)||void 0===t||t.setCacheOutcome(G.FORCE_REFRESH),this.logger.info("SilentFlowClient:acquireCachedToken - Skipping cache because forceRefresh is true."),re.createRefreshRequiredError();if(!e.account)throw re.createNoAccountInSilentRequestError();if(i=e.authority||this.authority.getPreferredCache(),!(a=this.cacheManager.readCacheRecord(e.account,this.config.authOptions.clientId,e,i)).accessToken)throw null===(r=this.serverTelemetryManager)||void 0===r||r.setCacheOutcome(G.NO_CACHED_ACCESS_TOKEN),this.logger.info("SilentFlowClient:acquireCachedToken - No access token found in cache for the given properties."),re.createRefreshRequiredError();if(Ue.wasClockTurnedBack(a.accessToken.cachedAt)||Ue.isTokenExpired(a.accessToken.expiresOn,this.config.systemOptions.tokenRenewalOffsetSeconds))throw null===(n=this.serverTelemetryManager)||void 0===n||n.setCacheOutcome(G.CACHED_ACCESS_TOKEN_EXPIRED),this.logger.info("SilentFlowClient:acquireCachedToken - Cached access token is expired or will expire within "+this.config.systemOptions.tokenRenewalOffsetSeconds+" seconds."),re.createRefreshRequiredError();if(a.accessToken.refreshOn&&Ue.isTokenExpired(a.accessToken.refreshOn,0))throw null===(o=this.serverTelemetryManager)||void 0===o||o.setCacheOutcome(G.REFRESH_CACHED_ACCESS_TOKEN),this.logger.info("SilentFlowClient:acquireCachedToken - Cached access token's refreshOn property has been exceeded'."),re.createRefreshRequiredError();return this.config.serverTelemetryManager&&this.config.serverTelemetryManager.incrementCacheHits(),[4,this.generateResultFromCacheRecord(a,e)];case 1:return[2,s.sent()]}}))}))},t.prototype.generateResultFromCacheRecord=function(e,t){return d(this,void 0,void 0,(function(){var r;return h(this,(function(n){switch(n.label){case 0:return e.idToken&&(r=new fe(e.idToken.secret,this.config.cryptoInterface)),[4,Je.generateAuthenticationResult(this.cryptoUtils,this.authority,e,!0,t,r)];case 1:return[2,n.sent()]}}))}))},t}(Ne);
/*! @azure/msal-common v7.3.0 2022-08-01 */
/*! @azure/msal-common v7.3.0 2022-08-01 */
function $e(e){return e.hasOwnProperty("authorization_endpoint")&&e.hasOwnProperty("token_endpoint")&&e.hasOwnProperty("issuer")&&e.hasOwnProperty("jwks_uri")}
/*! @azure/msal-common v7.3.0 2022-08-01 */var et,tt={"https://login.microsoftonline.com/common/":{token_endpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/token",token_endpoint_auth_methods_supported:["client_secret_post","private_key_jwt","client_secret_basic"],jwks_uri:"https://login.microsoftonline.com/common/discovery/v2.0/keys",response_modes_supported:["query","fragment","form_post"],subject_types_supported:["pairwise"],id_token_signing_alg_values_supported:["RS256"],response_types_supported:["code","id_token","code id_token","id_token token"],scopes_supported:["openid","profile","email","offline_access"],issuer:"https://login.microsoftonline.com/{tenantid}/v2.0",request_uri_parameter_supported:!1,userinfo_endpoint:"https://graph.microsoft.com/oidc/userinfo",authorization_endpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",device_authorization_endpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/devicecode",http_logout_supported:!0,frontchannel_logout_supported:!0,end_session_endpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/logout",claims_supported:["sub","iss","cloud_instance_name","cloud_instance_host_name","cloud_graph_host_name","msgraph_host","aud","exp","iat","auth_time","acr","nonce","preferred_username","name","tid","ver","at_hash","c_hash","email"],kerberos_endpoint:"https://login.microsoftonline.com/common/kerberos",tenant_region_scope:null,cloud_instance_name:"microsoftonline.com",cloud_graph_host_name:"graph.windows.net",msgraph_host:"graph.microsoft.com",rbac_url:"https://pas.windows.net"},"https://login.chinacloudapi.cn/common/":{token_endpoint:"https://login.chinacloudapi.cn/common/oauth2/v2.0/token",token_endpoint_auth_methods_supported:["client_secret_post","private_key_jwt","client_secret_basic"],jwks_uri:"https://login.chinacloudapi.cn/common/discovery/v2.0/keys",response_modes_supported:["query","fragment","form_post"],subject_types_supported:["pairwise"],id_token_signing_alg_values_supported:["RS256"],response_types_supported:["code","id_token","code id_token","id_token token"],scopes_supported:["openid","profile","email","offline_access"],issuer:"https://login.partner.microsoftonline.cn/{tenantid}/v2.0",request_uri_parameter_supported:!1,userinfo_endpoint:"https://microsoftgraph.chinacloudapi.cn/oidc/userinfo",authorization_endpoint:"https://login.chinacloudapi.cn/common/oauth2/v2.0/authorize",device_authorization_endpoint:"https://login.chinacloudapi.cn/common/oauth2/v2.0/devicecode",http_logout_supported:!0,frontchannel_logout_supported:!0,end_session_endpoint:"https://login.chinacloudapi.cn/common/oauth2/v2.0/logout",claims_supported:["sub","iss","cloud_instance_name","cloud_instance_host_name","cloud_graph_host_name","msgraph_host","aud","exp","iat","auth_time","acr","nonce","preferred_username","name","tid","ver","at_hash","c_hash","email"],kerberos_endpoint:"https://login.chinacloudapi.cn/common/kerberos",tenant_region_scope:null,cloud_instance_name:"partner.microsoftonline.cn",cloud_graph_host_name:"graph.chinacloudapi.cn",msgraph_host:"microsoftgraph.chinacloudapi.cn",rbac_url:"https://pas.chinacloudapi.cn"},"https://login.microsoftonline.us/common/":{token_endpoint:"https://login.microsoftonline.us/common/oauth2/v2.0/token",token_endpoint_auth_methods_supported:["client_secret_post","private_key_jwt","client_secret_basic"],jwks_uri:"https://login.microsoftonline.us/common/discovery/v2.0/keys",response_modes_supported:["query","fragment","form_post"],subject_types_supported:["pairwise"],id_token_signing_alg_values_supported:["RS256"],response_types_supported:["code","id_token","code id_token","id_token token"],scopes_supported:["openid","profile","email","offline_access"],issuer:"https://login.microsoftonline.us/{tenantid}/v2.0",request_uri_parameter_supported:!1,userinfo_endpoint:"https://graph.microsoft.com/oidc/userinfo",authorization_endpoint:"https://login.microsoftonline.us/common/oauth2/v2.0/authorize",device_authorization_endpoint:"https://login.microsoftonline.us/common/oauth2/v2.0/devicecode",http_logout_supported:!0,frontchannel_logout_supported:!0,end_session_endpoint:"https://login.microsoftonline.us/common/oauth2/v2.0/logout",claims_supported:["sub","iss","cloud_instance_name","cloud_instance_host_name","cloud_graph_host_name","msgraph_host","aud","exp","iat","auth_time","acr","nonce","preferred_username","name","tid","ver","at_hash","c_hash","email"],kerberos_endpoint:"https://login.microsoftonline.us/common/kerberos",tenant_region_scope:null,cloud_instance_name:"microsoftonline.us",cloud_graph_host_name:"graph.windows.net",msgraph_host:"graph.microsoft.com",rbac_url:"https://pasff.usgovcloudapi.net"},"https://login.microsoftonline.com/consumers/":{token_endpoint:"https://login.microsoftonline.com/consumers/oauth2/v2.0/token",token_endpoint_auth_methods_supported:["client_secret_post","private_key_jwt","client_secret_basic"],jwks_uri:"https://login.microsoftonline.com/consumers/discovery/v2.0/keys",response_modes_supported:["query","fragment","form_post"],subject_types_supported:["pairwise"],id_token_signing_alg_values_supported:["RS256"],response_types_supported:["code","id_token","code id_token","id_token token"],scopes_supported:["openid","profile","email","offline_access"],issuer:"https://login.microsoftonline.com/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0",request_uri_parameter_supported:!1,userinfo_endpoint:"https://graph.microsoft.com/oidc/userinfo",authorization_endpoint:"https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize",device_authorization_endpoint:"https://login.microsoftonline.com/consumers/oauth2/v2.0/devicecode",http_logout_supported:!0,frontchannel_logout_supported:!0,end_session_endpoint:"https://login.microsoftonline.com/consumers/oauth2/v2.0/logout",claims_supported:["sub","iss","cloud_instance_name","cloud_instance_host_name","cloud_graph_host_name","msgraph_host","aud","exp","iat","auth_time","acr","nonce","preferred_username","name","tid","ver","at_hash","c_hash","email"],kerberos_endpoint:"https://login.microsoftonline.com/consumers/kerberos",tenant_region_scope:null,cloud_instance_name:"microsoftonline.com",cloud_graph_host_name:"graph.windows.net",msgraph_host:"graph.microsoft.com",rbac_url:"https://pas.windows.net"},"https://login.chinacloudapi.cn/consumers/":{token_endpoint:"https://login.chinacloudapi.cn/consumers/oauth2/v2.0/token",token_endpoint_auth_methods_supported:["client_secret_post","private_key_jwt","client_secret_basic"],jwks_uri:"https://login.chinacloudapi.cn/consumers/discovery/v2.0/keys",response_modes_supported:["query","fragment","form_post"],subject_types_supported:["pairwise"],id_token_signing_alg_values_supported:["RS256"],response_types_supported:["code","id_token","code id_token","id_token token"],scopes_supported:["openid","profile","email","offline_access"],issuer:"https://login.partner.microsoftonline.cn/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0",request_uri_parameter_supported:!1,userinfo_endpoint:"https://microsoftgraph.chinacloudapi.cn/oidc/userinfo",authorization_endpoint:"https://login.chinacloudapi.cn/consumers/oauth2/v2.0/authorize",device_authorization_endpoint:"https://login.chinacloudapi.cn/consumers/oauth2/v2.0/devicecode",http_logout_supported:!0,frontchannel_logout_supported:!0,end_session_endpoint:"https://login.chinacloudapi.cn/consumers/oauth2/v2.0/logout",claims_supported:["sub","iss","cloud_instance_name","cloud_instance_host_name","cloud_graph_host_name","msgraph_host","aud","exp","iat","auth_time","acr","nonce","preferred_username","name","tid","ver","at_hash","c_hash","email"],kerberos_endpoint:"https://login.chinacloudapi.cn/consumers/kerberos",tenant_region_scope:null,cloud_instance_name:"partner.microsoftonline.cn",cloud_graph_host_name:"graph.chinacloudapi.cn",msgraph_host:"microsoftgraph.chinacloudapi.cn",rbac_url:"https://pas.chinacloudapi.cn"},"https://login.microsoftonline.us/consumers/":{token_endpoint:"https://login.microsoftonline.us/consumers/oauth2/v2.0/token",token_endpoint_auth_methods_supported:["client_secret_post","private_key_jwt","client_secret_basic"],jwks_uri:"https://login.microsoftonline.us/consumers/discovery/v2.0/keys",response_modes_supported:["query","fragment","form_post"],subject_types_supported:["pairwise"],id_token_signing_alg_values_supported:["RS256"],response_types_supported:["code","id_token","code id_token","id_token token"],scopes_supported:["openid","profile","email","offline_access"],issuer:"https://login.microsoftonline.us/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0",request_uri_parameter_supported:!1,userinfo_endpoint:"https://graph.microsoft.com/oidc/userinfo",authorization_endpoint:"https://login.microsoftonline.us/consumers/oauth2/v2.0/authorize",device_authorization_endpoint:"https://login.microsoftonline.us/consumers/oauth2/v2.0/devicecode",http_logout_supported:!0,frontchannel_logout_supported:!0,end_session_endpoint:"https://login.microsoftonline.us/consumers/oauth2/v2.0/logout",claims_supported:["sub","iss","cloud_instance_name","cloud_instance_host_name","cloud_graph_host_name","msgraph_host","aud","exp","iat","auth_time","acr","nonce","preferred_username","name","tid","ver","at_hash","c_hash","email"],kerberos_endpoint:"https://login.microsoftonline.us/consumers/kerberos",tenant_region_scope:null,cloud_instance_name:"microsoftonline.us",cloud_graph_host_name:"graph.windows.net",msgraph_host:"graph.microsoft.com",rbac_url:"https://pasff.usgovcloudapi.net"},"https://login.microsoftonline.com/organizations/":{token_endpoint:"https://login.microsoftonline.com/organizations/oauth2/v2.0/token",token_endpoint_auth_methods_supported:["client_secret_post","private_key_jwt","client_secret_basic"],jwks_uri:"https://login.microsoftonline.com/organizations/discovery/v2.0/keys",response_modes_supported:["query","fragment","form_post"],subject_types_supported:["pairwise"],id_token_signing_alg_values_supported:["RS256"],response_types_supported:["code","id_token","code id_token","id_token token"],scopes_supported:["openid","profile","email","offline_access"],issuer:"https://login.microsoftonline.com/{tenantid}/v2.0",request_uri_parameter_supported:!1,userinfo_endpoint:"https://graph.microsoft.com/oidc/userinfo",authorization_endpoint:"https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize",device_authorization_endpoint:"https://login.microsoftonline.com/organizations/oauth2/v2.0/devicecode",http_logout_supported:!0,frontchannel_logout_supported:!0,end_session_endpoint:"https://login.microsoftonline.com/organizations/oauth2/v2.0/logout",claims_supported:["sub","iss","cloud_instance_name","cloud_instance_host_name","cloud_graph_host_name","msgraph_host","aud","exp","iat","auth_time","acr","nonce","preferred_username","name","tid","ver","at_hash","c_hash","email"],kerberos_endpoint:"https://login.microsoftonline.com/organizations/kerberos",tenant_region_scope:null,cloud_instance_name:"microsoftonline.com",cloud_graph_host_name:"graph.windows.net",msgraph_host:"graph.microsoft.com",rbac_url:"https://pas.windows.net"},"https://login.chinacloudapi.cn/organizations/":{token_endpoint:"https://login.chinacloudapi.cn/organizations/oauth2/v2.0/token",token_endpoint_auth_methods_supported:["client_secret_post","private_key_jwt","client_secret_basic"],jwks_uri:"https://login.chinacloudapi.cn/organizations/discovery/v2.0/keys",response_modes_supported:["query","fragment","form_post"],subject_types_supported:["pairwise"],id_token_signing_alg_values_supported:["RS256"],response_types_supported:["code","id_token","code id_token","id_token token"],scopes_supported:["openid","profile","email","offline_access"],issuer:"https://login.partner.microsoftonline.cn/{tenantid}/v2.0",request_uri_parameter_supported:!1,userinfo_endpoint:"https://microsoftgraph.chinacloudapi.cn/oidc/userinfo",authorization_endpoint:"https://login.chinacloudapi.cn/organizations/oauth2/v2.0/authorize",device_authorization_endpoint:"https://login.chinacloudapi.cn/organizations/oauth2/v2.0/devicecode",http_logout_supported:!0,frontchannel_logout_supported:!0,end_session_endpoint:"https://login.chinacloudapi.cn/organizations/oauth2/v2.0/logout",claims_supported:["sub","iss","cloud_instance_name","cloud_instance_host_name","cloud_graph_host_name","msgraph_host","aud","exp","iat","auth_time","acr","nonce","preferred_username","name","tid","ver","at_hash","c_hash","email"],kerberos_endpoint:"https://login.chinacloudapi.cn/organizations/kerberos",tenant_region_scope:null,cloud_instance_name:"partner.microsoftonline.cn",cloud_graph_host_name:"graph.chinacloudapi.cn",msgraph_host:"microsoftgraph.chinacloudapi.cn",rbac_url:"https://pas.chinacloudapi.cn"},"https://login.microsoftonline.us/organizations/":{token_endpoint:"https://login.microsoftonline.us/organizations/oauth2/v2.0/token",token_endpoint_auth_methods_supported:["client_secret_post","private_key_jwt","client_secret_basic"],jwks_uri:"https://login.microsoftonline.us/organizations/discovery/v2.0/keys",response_modes_supported:["query","fragment","form_post"],subject_types_supported:["pairwise"],id_token_signing_alg_values_supported:["RS256"],response_types_supported:["code","id_token","code id_token","id_token token"],scopes_supported:["openid","profile","email","offline_access"],issuer:"https://login.microsoftonline.us/{tenantid}/v2.0",request_uri_parameter_supported:!1,userinfo_endpoint:"https://graph.microsoft.com/oidc/userinfo",authorization_endpoint:"https://login.microsoftonline.us/organizations/oauth2/v2.0/authorize",device_authorization_endpoint:"https://login.microsoftonline.us/organizations/oauth2/v2.0/devicecode",http_logout_supported:!0,frontchannel_logout_supported:!0,end_session_endpoint:"https://login.microsoftonline.us/organizations/oauth2/v2.0/logout",claims_supported:["sub","iss","cloud_instance_name","cloud_instance_host_name","cloud_graph_host_name","msgraph_host","aud","exp","iat","auth_time","acr","nonce","preferred_username","name","tid","ver","at_hash","c_hash","email"],kerberos_endpoint:"https://login.microsoftonline.us/organizations/kerberos",tenant_region_scope:null,cloud_instance_name:"microsoftonline.us",cloud_graph_host_name:"graph.windows.net",msgraph_host:"graph.microsoft.com",rbac_url:"https://pasff.usgovcloudapi.net"}},rt={"https://login.microsoftonline.com/common/":{tenant_discovery_endpoint:"https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration","api-version":"1.1",metadata:[{preferred_network:"login.microsoftonline.com",preferred_cache:"login.windows.net",aliases:["login.microsoftonline.com","login.windows.net","login.microsoft.com","sts.windows.net"]},{preferred_network:"login.partner.microsoftonline.cn",preferred_cache:"login.partner.microsoftonline.cn",aliases:["login.partner.microsoftonline.cn","login.chinacloudapi.cn"]},{preferred_network:"login.microsoftonline.de",preferred_cache:"login.microsoftonline.de",aliases:["login.microsoftonline.de"]},{preferred_network:"login.microsoftonline.us",preferred_cache:"login.microsoftonline.us",aliases:["login.microsoftonline.us","login.usgovcloudapi.net"]},{preferred_network:"login-us.microsoftonline.com",preferred_cache:"login-us.microsoftonline.com",aliases:["login-us.microsoftonline.com"]}]},"https://login.chinacloudapi.cn/common/":{tenant_discovery_endpoint:"https://login.chinacloudapi.cn/common/v2.0/.well-known/openid-configuration","api-version":"1.1",metadata:[{preferred_network:"login.microsoftonline.com",preferred_cache:"login.windows.net",aliases:["login.microsoftonline.com","login.windows.net","login.microsoft.com","sts.windows.net"]},{preferred_network:"login.partner.microsoftonline.cn",preferred_cache:"login.partner.microsoftonline.cn",aliases:["login.partner.microsoftonline.cn","login.chinacloudapi.cn"]},{preferred_network:"login.microsoftonline.de",preferred_cache:"login.microsoftonline.de",aliases:["login.microsoftonline.de"]},{preferred_network:"login.microsoftonline.us",preferred_cache:"login.microsoftonline.us",aliases:["login.microsoftonline.us","login.usgovcloudapi.net"]},{preferred_network:"login-us.microsoftonline.com",preferred_cache:"login-us.microsoftonline.com",aliases:["login-us.microsoftonline.com"]}]},"https://login.microsoftonline.us/common/":{tenant_discovery_endpoint:"https://login.microsoftonline.us/common/v2.0/.well-known/openid-configuration","api-version":"1.1",metadata:[{preferred_network:"login.microsoftonline.com",preferred_cache:"login.windows.net",aliases:["login.microsoftonline.com","login.windows.net","login.microsoft.com","sts.windows.net"]},{preferred_network:"login.partner.microsoftonline.cn",preferred_cache:"login.partner.microsoftonline.cn",aliases:["login.partner.microsoftonline.cn","login.chinacloudapi.cn"]},{preferred_network:"login.microsoftonline.de",preferred_cache:"login.microsoftonline.de",aliases:["login.microsoftonline.de"]},{preferred_network:"login.microsoftonline.us",preferred_cache:"login.microsoftonline.us",aliases:["login.microsoftonline.us","login.usgovcloudapi.net"]},{preferred_network:"login-us.microsoftonline.com",preferred_cache:"login-us.microsoftonline.com",aliases:["login-us.microsoftonline.com"]}]},"https://login.microsoftonline.com/consumers/":{tenant_discovery_endpoint:"https://login.microsoftonline.com/consumers/v2.0/.well-known/openid-configuration","api-version":"1.1",metadata:[{preferred_network:"login.microsoftonline.com",preferred_cache:"login.windows.net",aliases:["login.microsoftonline.com","login.windows.net","login.microsoft.com","sts.windows.net"]},{preferred_network:"login.partner.microsoftonline.cn",preferred_cache:"login.partner.microsoftonline.cn",aliases:["login.partner.microsoftonline.cn","login.chinacloudapi.cn"]},{preferred_network:"login.microsoftonline.de",preferred_cache:"login.microsoftonline.de",aliases:["login.microsoftonline.de"]},{preferred_network:"login.microsoftonline.us",preferred_cache:"login.microsoftonline.us",aliases:["login.microsoftonline.us","login.usgovcloudapi.net"]},{preferred_network:"login-us.microsoftonline.com",preferred_cache:"login-us.microsoftonline.com",aliases:["login-us.microsoftonline.com"]}]},"https://login.chinacloudapi.cn/consumers/":{tenant_discovery_endpoint:"https://login.chinacloudapi.cn/consumers/v2.0/.well-known/openid-configuration","api-version":"1.1",metadata:[{preferred_network:"login.microsoftonline.com",preferred_cache:"login.windows.net",aliases:["login.microsoftonline.com","login.windows.net","login.microsoft.com","sts.windows.net"]},{preferred_network:"login.partner.microsoftonline.cn",preferred_cache:"login.partner.microsoftonline.cn",aliases:["login.partner.microsoftonline.cn","login.chinacloudapi.cn"]},{preferred_network:"login.microsoftonline.de",preferred_cache:"login.microsoftonline.de",aliases:["login.microsoftonline.de"]},{preferred_network:"login.microsoftonline.us",preferred_cache:"login.microsoftonline.us",aliases:["login.microsoftonline.us","login.usgovcloudapi.net"]},{preferred_network:"login-us.microsoftonline.com",preferred_cache:"login-us.microsoftonline.com",aliases:["login-us.microsoftonline.com"]}]},"https://login.microsoftonline.us/consumers/":{tenant_discovery_endpoint:"https://login.microsoftonline.us/consumers/v2.0/.well-known/openid-configuration","api-version":"1.1",metadata:[{preferred_network:"login.microsoftonline.com",preferred_cache:"login.windows.net",aliases:["login.microsoftonline.com","login.windows.net","login.microsoft.com","sts.windows.net"]},{preferred_network:"login.partner.microsoftonline.cn",preferred_cache:"login.partner.microsoftonline.cn",aliases:["login.partner.microsoftonline.cn","login.chinacloudapi.cn"]},{preferred_network:"login.microsoftonline.de",preferred_cache:"login.microsoftonline.de",aliases:["login.microsoftonline.de"]},{preferred_network:"login.microsoftonline.us",preferred_cache:"login.microsoftonline.us",aliases:["login.microsoftonline.us","login.usgovcloudapi.net"]},{preferred_network:"login-us.microsoftonline.com",preferred_cache:"login-us.microsoftonline.com",aliases:["login-us.microsoftonline.com"]}]},"https://login.microsoftonline.com/organizations/":{tenant_discovery_endpoint:"https://login.microsoftonline.com/organizations/v2.0/.well-known/openid-configuration","api-version":"1.1",metadata:[{preferred_network:"login.microsoftonline.com",preferred_cache:"login.windows.net",aliases:["login.microsoftonline.com","login.windows.net","login.microsoft.com","sts.windows.net"]},{preferred_network:"login.partner.microsoftonline.cn",preferred_cache:"login.partner.microsoftonline.cn",aliases:["login.partner.microsoftonline.cn","login.chinacloudapi.cn"]},{preferred_network:"login.microsoftonline.de",preferred_cache:"login.microsoftonline.de",aliases:["login.microsoftonline.de"]},{preferred_network:"login.microsoftonline.us",preferred_cache:"login.microsoftonline.us",aliases:["login.microsoftonline.us","login.usgovcloudapi.net"]},{preferred_network:"login-us.microsoftonline.com",preferred_cache:"login-us.microsoftonline.com",aliases:["login-us.microsoftonline.com"]}]},"https://login.chinacloudapi.cn/organizations/":{tenant_discovery_endpoint:"https://login.chinacloudapi.cn/organizations/v2.0/.well-known/openid-configuration","api-version":"1.1",metadata:[{preferred_network:"login.microsoftonline.com",preferred_cache:"login.windows.net",aliases:["login.microsoftonline.com","login.windows.net","login.microsoft.com","sts.windows.net"]},{preferred_network:"login.partner.microsoftonline.cn",preferred_cache:"login.partner.microsoftonline.cn",aliases:["login.partner.microsoftonline.cn","login.chinacloudapi.cn"]},{preferred_network:"login.microsoftonline.de",preferred_cache:"login.microsoftonline.de",aliases:["login.microsoftonline.de"]},{preferred_network:"login.microsoftonline.us",preferred_cache:"login.microsoftonline.us",aliases:["login.microsoftonline.us","login.usgovcloudapi.net"]},{preferred_network:"login-us.microsoftonline.com",preferred_cache:"login-us.microsoftonline.com",aliases:["login-us.microsoftonline.com"]}]},"https://login.microsoftonline.us/organizations/":{tenant_discovery_endpoint:"https://login.microsoftonline.us/organizations/v2.0/.well-known/openid-configuration","api-version":"1.1",metadata:[{preferred_network:"login.microsoftonline.com",preferred_cache:"login.windows.net",aliases:["login.microsoftonline.com","login.windows.net","login.microsoft.com","sts.windows.net"]},{preferred_network:"login.partner.microsoftonline.cn",preferred_cache:"login.partner.microsoftonline.cn",aliases:["login.partner.microsoftonline.cn","login.chinacloudapi.cn"]},{preferred_network:"login.microsoftonline.de",preferred_cache:"login.microsoftonline.de",aliases:["login.microsoftonline.de"]},{preferred_network:"login.microsoftonline.us",preferred_cache:"login.microsoftonline.us",aliases:["login.microsoftonline.us","login.usgovcloudapi.net"]},{preferred_network:"login-us.microsoftonline.com",preferred_cache:"login-us.microsoftonline.com",aliases:["login-us.microsoftonline.com"]}]}};
/*! @azure/msal-common v7.3.0 2022-08-01 */
e.ProtocolMode=void 0,(et=e.ProtocolMode||(e.ProtocolMode={})).AAD="AAD",et.OIDC="OIDC";
/*! @azure/msal-common v7.3.0 2022-08-01 */
var nt=function(){function e(){this.expiresAt=Ue.nowSeconds()+H}return e.prototype.updateCloudDiscoveryMetadata=function(e,t){this.aliases=e.aliases,this.preferred_cache=e.preferred_cache,this.preferred_network=e.preferred_network,this.aliasesFromNetwork=t},e.prototype.updateEndpointMetadata=function(e,t){this.authorization_endpoint=e.authorization_endpoint,this.token_endpoint=e.token_endpoint,this.end_session_endpoint=e.end_session_endpoint,this.issuer=e.issuer,this.endpointsFromNetwork=t,this.jwks_uri=e.jwks_uri},e.prototype.updateCanonicalAuthority=function(e){this.canonical_authority=e},e.prototype.resetExpiresAt=function(){this.expiresAt=Ue.nowSeconds()+H},e.prototype.isExpired=function(){return this.expiresAt<=Ue.nowSeconds()},e.isAuthorityMetadataEntity=function(e,t){return!!t&&(0===e.indexOf(q)&&t.hasOwnProperty("aliases")&&t.hasOwnProperty("preferred_cache")&&t.hasOwnProperty("preferred_network")&&t.hasOwnProperty("canonical_authority")&&t.hasOwnProperty("authorization_endpoint")&&t.hasOwnProperty("token_endpoint")&&t.hasOwnProperty("issuer")&&t.hasOwnProperty("aliasesFromNetwork")&&t.hasOwnProperty("endpointsFromNetwork")&&t.hasOwnProperty("expiresAt")&&t.hasOwnProperty("jwks_uri"))},e}();
/*! @azure/msal-common v7.3.0 2022-08-01 */
/*! @azure/msal-common v7.3.0 2022-08-01 */
var ot,it,at,st,ct,ut,lt,dt,ht=function(){function e(e){this.networkInterface=e}return e.prototype.detectRegion=function(t,r,n){return d(this,void 0,void 0,(function(){var o,i,a,s,c;return h(this,(function(u){switch(u.label){case 0:if(o=t)return[3,8];i=e.IMDS_OPTIONS,n&&(i.proxyUrl=n),u.label=1;case 1:return u.trys.push([1,6,,7]),[4,this.getRegionFromIMDS(E.IMDS_VERSION,i)];case 2:return(a=u.sent()).status===x.httpSuccess&&(o=a.body,r.region_source=K.IMDS),a.status!==x.httpBadRequest?[3,5]:[4,this.getCurrentVersion(i)];case 3:return(s=u.sent())?[4,this.getRegionFromIMDS(s,i)]:(r.region_source=K.FAILED_AUTO_DETECTION,[2,null]);case 4:(c=u.sent()).status===x.httpSuccess&&(o=c.body,r.region_source=K.IMDS),u.label=5;case 5:return[3,7];case 6:return u.sent(),r.region_source=K.FAILED_AUTO_DETECTION,[2,null];case 7:return[3,9];case 8:r.region_source=K.ENVIRONMENT_VARIABLE,u.label=9;case 9:return o||(r.region_source=K.FAILED_AUTO_DETECTION),[2,o||null]}}))}))},e.prototype.getRegionFromIMDS=function(e,t){return d(this,void 0,void 0,(function(){return h(this,(function(r){return[2,this.networkInterface.sendGetRequestAsync(E.IMDS_ENDPOINT+"?api-version="+e+"&format=text",t,E.IMDS_TIMEOUT)]}))}))},e.prototype.getCurrentVersion=function(e){return d(this,void 0,void 0,(function(){var t;return h(this,(function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,this.networkInterface.sendGetRequestAsync(E.IMDS_ENDPOINT+"?format=json",e)];case 1:return(t=r.sent()).status===x.httpBadRequest&&t.body&&t.body["newest-versions"]&&t.body["newest-versions"].length>0?[2,t.body["newest-versions"][0]]:[2,null];case 2:return r.sent(),[2,null];case 3:return[2]}}))}))},e.IMDS_OPTIONS={headers:{Metadata:"true"}},e}(),pt=function(){function t(e,t,r,n,o){this.canonicalAuthority=e,this._canonicalAuthority.validateAsUri(),this.networkInterface=t,this.cacheManager=r,this.authorityOptions=n,this.regionDiscovery=new ht(t),this.regionDiscoveryMetadata={region_used:void 0,region_source:void 0,region_outcome:void 0},this.proxyUrl=o||E.EMPTY_STRING}return Object.defineProperty(t.prototype,"authorityType",{get:function(){var e=this.canonicalAuthorityUrlComponents.PathSegments;return e.length&&e[0].toLowerCase()===E.ADFS?se.Adfs:se.Default},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"protocolMode",{get:function(){return this.authorityOptions.protocolMode},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"options",{get:function(){return this.authorityOptions},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"canonicalAuthority",{get:function(){return this._canonicalAuthority.urlString},set:function(e){this._canonicalAuthority=new Ge(e),this._canonicalAuthority.validateAsUri(),this._canonicalAuthorityUrlComponents=null},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"canonicalAuthorityUrlComponents",{get:function(){return this._canonicalAuthorityUrlComponents||(this._canonicalAuthorityUrlComponents=this._canonicalAuthority.getUrlComponents()),this._canonicalAuthorityUrlComponents},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"hostnameAndPort",{get:function(){return this.canonicalAuthorityUrlComponents.HostNameAndPort.toLowerCase()},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"tenant",{get:function(){return this.canonicalAuthorityUrlComponents.PathSegments[0]},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"authorizationEndpoint",{get:function(){if(this.discoveryComplete()){var e=this.replacePath(this.metadata.authorization_endpoint);return this.replaceTenant(e)}throw re.createEndpointDiscoveryIncompleteError("Discovery incomplete.")},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"tokenEndpoint",{get:function(){if(this.discoveryComplete()){var e=this.replacePath(this.metadata.token_endpoint);return this.replaceTenant(e)}throw re.createEndpointDiscoveryIncompleteError("Discovery incomplete.")},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"deviceCodeEndpoint",{get:function(){if(this.discoveryComplete()){var e=this.replacePath(this.metadata.token_endpoint.replace("/token","/devicecode"));return this.replaceTenant(e)}throw re.createEndpointDiscoveryIncompleteError("Discovery incomplete.")},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"endSessionEndpoint",{get:function(){if(this.discoveryComplete()){if(!this.metadata.end_session_endpoint)throw re.createLogoutNotSupportedError();var e=this.replacePath(this.metadata.end_session_endpoint);return this.replaceTenant(e)}throw re.createEndpointDiscoveryIncompleteError("Discovery incomplete.")},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"selfSignedJwtAudience",{get:function(){if(this.discoveryComplete()){var e=this.replacePath(this.metadata.issuer);return this.replaceTenant(e)}throw re.createEndpointDiscoveryIncompleteError("Discovery incomplete.")},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"jwksUri",{get:function(){if(this.discoveryComplete()){var e=this.replacePath(this.metadata.jwks_uri);return this.replaceTenant(e)}throw re.createEndpointDiscoveryIncompleteError("Discovery incomplete.")},enumerable:!1,configurable:!0}),t.prototype.replaceTenant=function(e){return e.replace(/{tenant}|{tenantid}/g,this.tenant)},t.prototype.replacePath=function(e){var t=e,r=new Ge(this.metadata.canonical_authority).getUrlComponents().PathSegments;return this.canonicalAuthorityUrlComponents.PathSegments.forEach((function(e,n){var o=r[n];e!==o&&(t=t.replace("/"+o+"/","/"+e+"/"))})),t},Object.defineProperty(t.prototype,"defaultOpenIdConfigurationEndpoint",{get:function(){return this.authorityType===se.Adfs||this.protocolMode===e.ProtocolMode.OIDC?this.canonicalAuthority+".well-known/openid-configuration":this.canonicalAuthority+"v2.0/.well-known/openid-configuration"},enumerable:!1,configurable:!0}),t.prototype.discoveryComplete=function(){return!!this.metadata},t.prototype.resolveEndpointsAsync=function(){return d(this,void 0,void 0,(function(){var e,t,r,n;return h(this,(function(o){switch(o.label){case 0:return(e=this.cacheManager.getAuthorityMetadataByAlias(this.hostnameAndPort))||(e=new nt).updateCanonicalAuthority(this.canonicalAuthority),[4,this.updateCloudDiscoveryMetadata(e)];case 1:return t=o.sent(),this.canonicalAuthority=this.canonicalAuthority.replace(this.hostnameAndPort,e.preferred_network),[4,this.updateEndpointMetadata(e)];case 2:return r=o.sent(),t!==O.CACHE&&r!==O.CACHE&&(e.resetExpiresAt(),e.updateCanonicalAuthority(this.canonicalAuthority)),n=this.cacheManager.generateAuthorityMetadataCacheKey(e.preferred_cache),this.cacheManager.setAuthorityMetadata(n,e),this.metadata=e,[2]}}))}))},t.prototype.updateEndpointMetadata=function(e){var t,r;return d(this,void 0,void 0,(function(){var n,o;return h(this,(function(i){switch(i.label){case 0:return(n=this.getEndpointMetadataFromConfig())?(e.updateEndpointMetadata(n,!1),[2,O.CONFIG]):this.isAuthoritySameType(e)&&e.endpointsFromNetwork&&!e.isExpired()?[2,O.CACHE]:(o=this.getEndpointMetadataFromHardcodedValues(),[4,this.getEndpointMetadataFromNetwork()]);case 1:return(n=i.sent())?(null===(t=this.authorityOptions.azureRegionConfiguration)||void 0===t?void 0:t.azureRegion)?[4,this.updateMetadataWithRegionalInformation(n)]:[3,3]:[3,4];case 2:n=i.sent(),i.label=3;case 3:return e.updateEndpointMetadata(n,!0),[2,O.NETWORK];case 4:return!o||this.authorityOptions.skipAuthorityMetadataCache?[3,7]:(null===(r=this.authorityOptions.azureRegionConfiguration)||void 0===r?void 0:r.azureRegion)?[4,this.updateMetadataWithRegionalInformation(o)]:[3,6];case 5:o=i.sent(),i.label=6;case 6:return e.updateEndpointMetadata(o,!1),[2,O.HARDCODED_VALUES];case 7:throw re.createUnableToGetOpenidConfigError(this.defaultOpenIdConfigurationEndpoint)}}))}))},t.prototype.isAuthoritySameType=function(e){return new Ge(e.canonical_authority).getUrlComponents().PathSegments.length===this.canonicalAuthorityUrlComponents.PathSegments.length},t.prototype.getEndpointMetadataFromConfig=function(){if(this.authorityOptions.authorityMetadata)try{return JSON.parse(this.authorityOptions.authorityMetadata)}catch(e){throw le.createInvalidAuthorityMetadataError()}return null},t.prototype.getEndpointMetadataFromNetwork=function(){return d(this,void 0,void 0,(function(){var e,t;return h(this,(function(r){switch(r.label){case 0:e={},this.proxyUrl&&(e.proxyUrl=this.proxyUrl),r.label=1;case 1:return r.trys.push([1,3,,4]),[4,this.networkInterface.sendGetRequestAsync(this.defaultOpenIdConfigurationEndpoint,e)];case 2:return[2,$e((t=r.sent()).body)?t.body:null];case 3:return r.sent(),[2,null];case 4:return[2]}}))}))},t.prototype.getEndpointMetadataFromHardcodedValues=function(){return this.canonicalAuthority in tt?tt[this.canonicalAuthority]:null},t.prototype.updateMetadataWithRegionalInformation=function(e){var r,n,o,i,a;return d(this,void 0,void 0,(function(){var s,c;return h(this,(function(u){switch(u.label){case 0:return[4,this.regionDiscovery.detectRegion(null===(r=this.authorityOptions.azureRegionConfiguration)||void 0===r?void 0:r.environmentRegion,this.regionDiscoveryMetadata,this.proxyUrl)];case 1:return s=u.sent(),c=(null===(n=this.authorityOptions.azureRegionConfiguration)||void 0===n?void 0:n.azureRegion)===E.AZURE_REGION_AUTO_DISCOVER_FLAG?s:null===(o=this.authorityOptions.azureRegionConfiguration)||void 0===o?void 0:o.azureRegion,(null===(i=this.authorityOptions.azureRegionConfiguration)||void 0===i?void 0:i.azureRegion)===E.AZURE_REGION_AUTO_DISCOVER_FLAG?this.regionDiscoveryMetadata.region_outcome=s?B.AUTO_DETECTION_REQUESTED_SUCCESSFUL:B.AUTO_DETECTION_REQUESTED_FAILED:this.regionDiscoveryMetadata.region_outcome=s?(null===(a=this.authorityOptions.azureRegionConfiguration)||void 0===a?void 0:a.azureRegion)===s?B.CONFIGURED_MATCHES_DETECTED:B.CONFIGURED_NOT_DETECTED:B.CONFIGURED_NO_AUTO_DETECTION,c?(this.regionDiscoveryMetadata.region_used=c,[2,t.replaceWithRegionalInformation(e,c)]):[2,e]}}))}))},t.prototype.updateCloudDiscoveryMetadata=function(e){return d(this,void 0,void 0,(function(){var t,r;return h(this,(function(n){switch(n.label){case 0:return(t=this.getCloudDiscoveryMetadataFromConfig())?(e.updateCloudDiscoveryMetadata(t,!1),[2,O.CONFIG]):this.isAuthoritySameType(e)&&e.aliasesFromNetwork&&!e.isExpired()?[2,O.CACHE]:(r=this.getCloudDiscoveryMetadataFromHarcodedValues(),[4,this.getCloudDiscoveryMetadataFromNetwork()]);case 1:if(t=n.sent())return e.updateCloudDiscoveryMetadata(t,!0),[2,O.NETWORK];if(r&&!this.options.skipAuthorityMetadataCache)return e.updateCloudDiscoveryMetadata(r,!1),[2,O.HARDCODED_VALUES];throw le.createUntrustedAuthorityError()}}))}))},t.prototype.getCloudDiscoveryMetadataFromConfig=function(){if(this.authorityOptions.cloudDiscoveryMetadata)try{var e=JSON.parse(this.authorityOptions.cloudDiscoveryMetadata),r=t.getCloudDiscoveryMetadataFromNetworkResponse(e.metadata,this.hostnameAndPort);if(r)return r}catch(e){throw le.createInvalidCloudDiscoveryMetadataError()}return this.isInKnownAuthorities()?t.createCloudDiscoveryMetadataFromHost(this.hostnameAndPort):null},t.prototype.getCloudDiscoveryMetadataFromNetwork=function(){return d(this,void 0,void 0,(function(){var e,r,n,o,i;return h(this,(function(a){switch(a.label){case 0:e=""+E.AAD_INSTANCE_DISCOVERY_ENDPT+this.canonicalAuthority+"oauth2/v2.0/authorize",r={},this.proxyUrl&&(r.proxyUrl=this.proxyUrl),n=null,a.label=1;case 1:return a.trys.push([1,3,,4]),[4,this.networkInterface.sendGetRequestAsync(e,r)];case 2:return o=a.sent(),i=function(e){return e.hasOwnProperty("tenant_discovery_endpoint")&&e.hasOwnProperty("metadata")}(o.body)?o.body.metadata:[],0===i.length?[2,null]:(n=t.getCloudDiscoveryMetadataFromNetworkResponse(i,this.hostnameAndPort),[3,4]);case 3:return a.sent(),[2,null];case 4:return n||(n=t.createCloudDiscoveryMetadataFromHost(this.hostnameAndPort)),[2,n]}}))}))},t.prototype.getCloudDiscoveryMetadataFromHarcodedValues=function(){return this.canonicalAuthority in rt?rt[this.canonicalAuthority]:null},t.prototype.isInKnownAuthorities=function(){var e=this;return this.authorityOptions.knownAuthorities.filter((function(t){return Ge.getDomainFromUrl(t).toLowerCase()===e.hostnameAndPort})).length>0},t.generateAuthority=function(t,r){var n;if(r&&r.azureCloudInstance!==e.AzureCloudInstance.None){var o=r.tenant?r.tenant:E.DEFAULT_COMMON_TENANT;n=r.azureCloudInstance+"/"+o+"/"}return n||t},t.createCloudDiscoveryMetadataFromHost=function(e){return{preferred_network:e,preferred_cache:e,aliases:[e]}},t.getCloudDiscoveryMetadataFromNetworkResponse=function(e,t){for(var r=0;r<e.length;r++){var n=e[r];if(n.aliases.indexOf(t)>-1)return n}return null},t.prototype.getPreferredCache=function(){if(this.discoveryComplete())return this.metadata.preferred_cache;throw re.createEndpointDiscoveryIncompleteError("Discovery incomplete.")},t.prototype.isAlias=function(e){return this.metadata.aliases.indexOf(e)>-1},t.isPublicCloudAuthority=function(e){return E.KNOWN_PUBLIC_CLOUDS.indexOf(e)>=0},t.buildRegionalAuthorityString=function(e,t,r){var n=new Ge(e);n.validateAsUri();var o=n.getUrlComponents(),i=t+"."+o.HostNameAndPort;this.isPublicCloudAuthority(o.HostNameAndPort)&&(i=t+"."+E.REGIONAL_AUTH_PUBLIC_CLOUD_SUFFIX);var a=Ge.constructAuthorityUriFromObject(l(l({},n.getUrlComponents()),{HostNameAndPort:i})).urlString;return r?a+"?"+r:a},t.replaceWithRegionalInformation=function(e,r){return e.authorization_endpoint=t.buildRegionalAuthorityString(e.authorization_endpoint,r),e.token_endpoint=t.buildRegionalAuthorityString(e.token_endpoint,r,"allowestsrnonmsi=true"),e.end_session_endpoint&&(e.end_session_endpoint=t.buildRegionalAuthorityString(e.end_session_endpoint,r)),e},t}(),gt=function(){function e(){}return e.createDiscoveredInstance=function(t,r,n,o,i){return d(this,void 0,void 0,(function(){var a,s;return h(this,(function(c){switch(c.label){case 0:a=e.createInstance(t,r,n,o,i),c.label=1;case 1:return c.trys.push([1,3,,4]),[4,a.resolveEndpointsAsync()];case 2:return c.sent(),[2,a];case 3:throw s=c.sent(),re.createEndpointDiscoveryIncompleteError(s);case 4:return[2]}}))}))},e.createInstance=function(e,t,r,n,o){if(ne.isEmpty(e))throw le.createUrlEmptyError();return new pt(e,t,r,n,o)},e}(),ft=function(){function e(){this.failedRequests=[],this.errors=[],this.cacheHits=0}return e.isServerTelemetryEntity=function(e,t){var r=0===e.indexOf(D.CACHE_KEY),n=!0;return t&&(n=t.hasOwnProperty("failedRequests")&&t.hasOwnProperty("errors")&&t.hasOwnProperty("cacheHits")),r&&n},e}(),mt=function(){function e(){}return e.isThrottlingEntity=function(e,t){var r=!1;e&&(r=0===e.indexOf(W));var n=!0;return t&&(n=t.hasOwnProperty("throttleTime")),r&&n},e}(),vt={sendGetRequestAsync:function(){return Promise.reject($.createUnexpectedError("Network interface - sendGetRequestAsync() has not been implemented for the Network interface."))},sendPostRequestAsync:function(){return Promise.reject($.createUnexpectedError("Network interface - sendPostRequestAsync() has not been implemented for the Network interface."))}},yt={code:"missing_kid_error",desc:"The JOSE Header for the requested JWT, JWS or JWK object requires a keyId to be configured as the 'kid' header claim. No 'kid' value was provided."},Et={code:"missing_alg_error",desc:"The JOSE Header for the requested JWT, JWS or JWK object requires an algorithm to be specified as the 'alg' header claim. No 'alg' value was provided."},Ct=function(e){function t(r,n){var o=e.call(this,r,n)||this;return o.name="JoseHeaderError",Object.setPrototypeOf(o,t.prototype),o}return u(t,e),t.createMissingKidError=function(){return new t(yt.code,yt.desc)},t.createMissingAlgError=function(){return new t(Et.code,Et.desc)},t}($),_t=function(){function e(e){this.typ=e.typ,this.alg=e.alg,this.kid=e.kid}return e.getShrHeaderString=function(t){if(!t.kid)throw Ct.createMissingKidError();if(!t.alg)throw Ct.createMissingAlgError();var r=new e({typ:t.typ||z.Jwt,kid:t.kid,alg:t.alg});return JSON.stringify(r)},e}(),Tt=function(){function e(e){this.headers=e}return e.prototype.getShrNonce=function(){var e=this.headers[g.AuthenticationInfo];if(e){var t=this.parseChallenges(e);if(t.nextnonce)return t.nextnonce;throw le.createInvalidAuthenticationHeaderError(g.AuthenticationInfo,"nextnonce challenge is missing.")}var r=this.headers[g.WWWAuthenticate];if(r){var n=this.parseChallenges(r);if(n.nonce)return n.nonce;throw le.createInvalidAuthenticationHeaderError(g.WWWAuthenticate,"nonce challenge is missing.")}throw le.createMissingNonceAuthenticationHeadersError()},e.prototype.parseChallenges=function(e){var t=e.indexOf(" "),r=e.substr(t+1).split(","),n={};return r.forEach((function(e){var t=e.split("="),r=t[0],o=t[1];n[r]=unescape(o.replace(/['"]+/g,E.EMPTY_STRING))})),n},e}(),wt=function(){function e(e,t){this.cacheOutcome=G.NO_CACHE_HIT,this.cacheManager=t,this.apiId=e.apiId,this.correlationId=e.correlationId,this.wrapperSKU=e.wrapperSKU||E.EMPTY_STRING,this.wrapperVer=e.wrapperVer||E.EMPTY_STRING,this.telemetryCacheKey=D.CACHE_KEY+b.CACHE_KEY_SEPARATOR+e.clientId}return e.prototype.generateCurrentRequestHeaderValue=function(){var e=""+this.apiId+D.VALUE_SEPARATOR+this.cacheOutcome,t=[this.wrapperSKU,this.wrapperVer].join(D.VALUE_SEPARATOR),r=[e,this.getRegionDiscoveryFields()].join(D.VALUE_SEPARATOR);return[D.SCHEMA_VERSION,r,t].join(D.CATEGORY_SEPARATOR)},e.prototype.generateLastRequestHeaderValue=function(){var t=this.getLastRequests(),r=e.maxErrorsToSend(t),n=t.failedRequests.slice(0,2*r).join(D.VALUE_SEPARATOR),o=t.errors.slice(0,r).join(D.VALUE_SEPARATOR),i=t.errors.length,a=[i,r<i?D.OVERFLOW_TRUE:D.OVERFLOW_FALSE].join(D.VALUE_SEPARATOR);return[D.SCHEMA_VERSION,t.cacheHits,n,o,a].join(D.CATEGORY_SEPARATOR)},e.prototype.cacheFailedRequest=function(e){var t=this.getLastRequests();t.errors.length>=D.MAX_CACHED_ERRORS&&(t.failedRequests.shift(),t.failedRequests.shift(),t.errors.shift()),t.failedRequests.push(this.apiId,this.correlationId),ne.isEmpty(e.subError)?ne.isEmpty(e.errorCode)?e&&e.toString()?t.errors.push(e.toString()):t.errors.push(D.UNKNOWN_ERROR):t.errors.push(e.errorCode):t.errors.push(e.subError),this.cacheManager.setServerTelemetry(this.telemetryCacheKey,t)},e.prototype.incrementCacheHits=function(){var e=this.getLastRequests();return e.cacheHits+=1,this.cacheManager.setServerTelemetry(this.telemetryCacheKey,e),e.cacheHits},e.prototype.getLastRequests=function(){var e=new ft;return this.cacheManager.getServerTelemetry(this.telemetryCacheKey)||e},e.prototype.clearTelemetryCache=function(){var t=this.getLastRequests(),r=e.maxErrorsToSend(t);if(r===t.errors.length)this.cacheManager.removeItem(this.telemetryCacheKey);else{var n=new ft;n.failedRequests=t.failedRequests.slice(2*r),n.errors=t.errors.slice(r),this.cacheManager.setServerTelemetry(this.telemetryCacheKey,n)}},e.maxErrorsToSend=function(e){var t,r=0,n=0,o=e.errors.length;for(t=0;t<o;t++){var i=e.failedRequests[2*t]||E.EMPTY_STRING,a=e.failedRequests[2*t+1]||E.EMPTY_STRING,s=e.errors[t]||E.EMPTY_STRING;if(!((n+=i.toString().length+a.toString().length+s.length+3)<D.MAX_LAST_HEADER_BYTES))break;r+=1}return r},e.prototype.getRegionDiscoveryFields=function(){var e=[];return e.push(this.regionUsed||E.EMPTY_STRING),e.push(this.regionSource||E.EMPTY_STRING),e.push(this.regionOutcome||E.EMPTY_STRING),e.join(",")},e.prototype.updateRegionDiscoveryMetadata=function(e){this.regionUsed=e.region_used,this.regionSource=e.region_source,this.regionOutcome=e.region_outcome},e.prototype.setCacheOutcome=function(e){this.cacheOutcome=e},e}(),It=function(){function e(e,t,r,n,o,i){this.authority=t,this.libraryName=n,this.libraryVersion=o,this.applicationTelemetry=i,this.clientId=e,this.logger=r,this.callbacks=new Map,this.eventsByCorrelationId=new Map,this.measurementsById=new Map}return e.prototype.startMeasurement=function(e,t){var r,n,o=this,i=t||this.generateId();t||this.logger.info("PerformanceClient: No correlation id provided for "+e+", generating",i),this.logger.trace("PerformanceClient: Performance measurement started for "+e,i);var a=this.startPerformanceMeasuremeant(e,i);a.startMeasurement();var s={eventId:this.generateId(),status:je.InProgress,authority:this.authority,libraryName:this.libraryName,libraryVersion:this.libraryVersion,appName:null===(r=this.applicationTelemetry)||void 0===r?void 0:r.appName,appVersion:null===(n=this.applicationTelemetry)||void 0===n?void 0:n.appVersion,clientId:this.clientId,name:e,startTimeMs:Date.now(),correlationId:i};return this.cacheEventByCorrelationId(s),this.cacheMeasurement(s,a),{endMeasurement:function(e){var t=o.endMeasurement(l(l({},s),e));return t&&o.cacheEventByCorrelationId(t),t},flushMeasurement:function(){return o.flushMeasurements(s.name,s.correlationId)},discardMeasurement:function(){return o.discardMeasurements(s.correlationId)},measurement:a,event:s}},e.prototype.endMeasurement=function(e){var t=this.measurementsById.get(e.eventId);if(t){this.measurementsById.delete(e.eventId),t.endMeasurement();var r=t.flushMeasurement();if(null!==r)return this.logger.trace("PerformanceClient: Performance measurement ended for "+e.name+": "+r+" ms",e.correlationId),l(l({durationMs:Math.round(r)},e),{status:je.Completed});this.logger.trace("PerformanceClient: Performance measurement not taken",e.correlationId)}else this.logger.trace("PerformanceClient: Measurement not found for "+e.eventId,e.correlationId);return null},e.prototype.cacheEventByCorrelationId=function(e){var t=this.eventsByCorrelationId.get(e.correlationId);t?(this.logger.trace("PerformanceClient: Performance measurement for "+e.name+" added/updated",e.correlationId),t.set(e.eventId,e)):(this.logger.trace("PerformanceClient: Performance measurement for "+e.name+" started",e.correlationId),this.eventsByCorrelationId.set(e.correlationId,(new Map).set(e.eventId,e)))},e.prototype.cacheMeasurement=function(e,t){this.measurementsById.set(e.eventId,t)},e.prototype.flushMeasurements=function(e,t){var r=this;this.logger.trace("PerformanceClient: Performance measurements flushed for "+e,t);var n=this.eventsByCorrelationId.get(t);if(n){this.discardMeasurements(t);var o=[];n.forEach((function(n){if(n.name!==e&&n.status!==je.Completed){r.logger.trace("PerformanceClient: Incomplete submeasurement "+n.name+" found for "+e,t);var i=r.endMeasurement(n);i&&o.push(i)}o.push(n)}));var i=o.sort((function(e,t){return e.startTimeMs-t.startTimeMs})),a=i.filter((function(t){return t.name===e&&t.status===je.Completed}));if(a.length>0){a.length>1&&this.logger.verbose("PerformanceClient: Multiple distinct top-level performance events found, using the first",t);var s=a[0];this.logger.verbose("PerformanceClient: Measurement found for "+e,t);var c=i.reduce((function(n,o){if(o.name!==e){r.logger.trace("PerformanceClient: Complete submeasurement found for "+o.name,t);var i=o.name+"DurationMs";n[i]?r.logger.verbose("PerformanceClient: Submeasurement for "+e+" already exists for "+o.name+", ignoring",t):n[i]=o.durationMs,o.accessTokenSize&&(n.accessTokenSize=o.accessTokenSize),o.idTokenSize&&(n.idTokenSize=o.idTokenSize)}return n}),s);this.emitEvents([c],c.correlationId)}else this.logger.verbose("PerformanceClient: No completed top-level measurements found for "+e,t)}else this.logger.verbose("PerformanceClient: No measurements found",t)},e.prototype.discardMeasurements=function(e){this.logger.trace("PerformanceClient: Performance measurements discarded",e),this.eventsByCorrelationId.delete(e)},e.prototype.addPerformanceCallback=function(e){var t=this.generateId();return this.callbacks.set(t,e),this.logger.verbose("PerformanceClient: Performance callback registered with id: "+t),t},e.prototype.removePerformanceCallback=function(e){var t=this.callbacks.delete(e);return t?this.logger.verbose("PerformanceClient: Performance callback "+e+" removed."):this.logger.verbose("PerformanceClient: Performance callback "+e+" not removed."),t},e.prototype.emitEvents=function(e,t){var r=this;this.logger.verbose("PerformanceClient: Emitting performance events",t),this.callbacks.forEach((function(n,o){r.logger.trace("PerformanceClient: Emitting event to callback "+o,t),n.apply(null,[e])}))},e}(),St=function(){function e(){}return e.prototype.startMeasurement=function(){},e.prototype.endMeasurement=function(){},e.prototype.flushMeasurement=function(){return null},e}(),At=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return u(t,e),t.prototype.generateId=function(){return"callback-id"},t.prototype.startPerformanceMeasuremeant=function(){return new St},t}(It),bt={pkceNotGenerated:{code:"pkce_not_created",desc:"The PKCE code challenge and verifier could not be generated."},cryptoDoesNotExist:{code:"crypto_nonexistent",desc:"The crypto object or function is not available."},httpMethodNotImplementedError:{code:"http_method_not_implemented",desc:"The HTTP method given has not been implemented in this library."},emptyNavigateUriError:{code:"empty_navigate_uri",desc:"Navigation URI is empty. Please check stack trace for more info."},hashEmptyError:{code:"hash_empty_error",desc:"Hash value cannot be processed because it is empty. Please verify that your redirectUri is not clearing the hash. For more visit: aka.ms/msaljs/browser-errors."},hashDoesNotContainStateError:{code:"no_state_in_hash",desc:"Hash does not contain state. Please verify that the request originated from msal."},hashDoesNotContainKnownPropertiesError:{code:"hash_does_not_contain_known_properties",desc:"Hash does not contain known properites. Please verify that your redirectUri is not changing the hash. For more visit: aka.ms/msaljs/browser-errors."},unableToParseStateError:{code:"unable_to_parse_state",desc:"Unable to parse state. Please verify that the request originated from msal."},stateInteractionTypeMismatchError:{code:"state_interaction_type_mismatch",desc:"Hash contains state but the interaction type does not match the caller."},interactionInProgress:{code:"interaction_in_progress",desc:"Interaction is currently in progress. Please ensure that this interaction has been completed before calling an interactive API.  For more visit: aka.ms/msaljs/browser-errors."},popupWindowError:{code:"popup_window_error",desc:"Error opening popup window. This can happen if you are using IE or if popups are blocked in the browser."},emptyWindowError:{code:"empty_window_error",desc:"window.open returned null or undefined window object."},userCancelledError:{code:"user_cancelled",desc:"User cancelled the flow."},monitorPopupTimeoutError:{code:"monitor_window_timeout",desc:"Token acquisition in popup failed due to timeout. For more visit: aka.ms/msaljs/browser-errors."},monitorIframeTimeoutError:{code:"monitor_window_timeout",desc:"Token acquisition in iframe failed due to timeout. For more visit: aka.ms/msaljs/browser-errors."},redirectInIframeError:{code:"redirect_in_iframe",desc:"Redirects are not supported for iframed or brokered applications. Please ensure you are using MSAL.js in a top frame of the window if using the redirect APIs, or use the popup APIs."},blockTokenRequestsInHiddenIframeError:{code:"block_iframe_reload",desc:"Request was blocked inside an iframe because MSAL detected an authentication response. For more visit: aka.ms/msaljs/browser-errors"},blockAcquireTokenInPopupsError:{code:"block_nested_popups",desc:"Request was blocked inside a popup because MSAL detected it was running in a popup."},iframeClosedPrematurelyError:{code:"iframe_closed_prematurely",desc:"The iframe being monitored was closed prematurely."},silentLogoutUnsupportedError:{code:"silent_logout_unsupported",desc:"Silent logout not supported. Please call logoutRedirect or logoutPopup instead."},noAccountError:{code:"no_account_error",desc:"No account object provided to acquireTokenSilent and no active account has been set. Please call setActiveAccount or provide an account on the request."},silentPromptValueError:{code:"silent_prompt_value_error",desc:"The value given for the prompt value is not valid for silent requests - must be set to 'none'."},noTokenRequestCacheError:{code:"no_token_request_cache_error",desc:"No token request found in cache."},unableToParseTokenRequestCacheError:{code:"unable_to_parse_token_request_cache_error",desc:"The cached token request could not be parsed."},noCachedAuthorityError:{code:"no_cached_authority_error",desc:"No cached authority found."},authRequestNotSet:{code:"auth_request_not_set_error",desc:"Auth Request not set. Please ensure initiateAuthRequest was called from the InteractionHandler"},invalidCacheType:{code:"invalid_cache_type",desc:"Invalid cache type"},notInBrowserEnvironment:{code:"non_browser_environment",desc:"Login and token requests are not supported in non-browser environments."},databaseNotOpen:{code:"database_not_open",desc:"Database is not open!"},noNetworkConnectivity:{code:"no_network_connectivity",desc:"No network connectivity. Check your internet connection."},postRequestFailed:{code:"post_request_failed",desc:"Network request failed: If the browser threw a CORS error, check that the redirectUri is registered in the Azure App Portal as type 'SPA'"},getRequestFailed:{code:"get_request_failed",desc:"Network request failed. Please check the network trace to determine root cause."},failedToParseNetworkResponse:{code:"failed_to_parse_response",desc:"Failed to parse network response. Check network trace."},unableToLoadTokenError:{code:"unable_to_load_token",desc:"Error loading token to cache."},signingKeyNotFoundInStorage:{code:"crypto_key_not_found",desc:"Cryptographic Key or Keypair not found in browser storage."},authCodeRequired:{code:"auth_code_required",desc:"An authorization code must be provided (as the `code` property on the request) to this flow."},authCodeOrNativeAccountRequired:{code:"auth_code_or_nativeAccountId_required",desc:"An authorization code or nativeAccountId must be provided to this flow."},databaseUnavailable:{code:"database_unavailable",desc:"IndexedDB, which is required for persistent cryptographic key storage, is unavailable. This may be caused by browser privacy features which block persistent storage in third-party contexts."},unableToAcquireTokenFromNativePlatform:{code:"unable_to_acquire_token_from_native_platform",desc:"Unable to acquire token from native platform. For a list of possible reasons visit aka.ms/msaljs/browser-errors."},nativeHandshakeTimeout:{code:"native_handshake_timeout",desc:"Timed out while attempting to establish connection to browser extension"},nativeExtensionNotInstalled:{code:"native_extension_not_installed",desc:"Native extension is not installed. If you think this is a mistake call the initialize function."},nativeConnectionNotEstablished:{code:"native_connection_not_established",desc:"Connection to native platform has not been established. Please install a compatible browser extension and run initialize(). For more please visit aka.ms/msaljs/browser-errors."},nativeBrokerCalledBeforeInitialize:{code:"native_broker_called_before_initialize",desc:"You must call and await the initialize function before attempting to call any other MSAL API when native brokering is enabled. For more please visit aka.ms/msaljs/browser-errors."},nativePromptNotSupported:{code:"native_prompt_not_supported",desc:"The provided prompt is not supported by the native platform. This request should be routed to the web based flow."}},Rt=function(e){function t(r,n){var o=e.call(this,r,n)||this;return Object.setPrototypeOf(o,t.prototype),o.name="BrowserAuthError",o}return r(t,e),t.createPkceNotGeneratedError=function(e){return new t(bt.pkceNotGenerated.code,bt.pkceNotGenerated.desc+" Detail:"+e)},t.createCryptoNotAvailableError=function(e){return new t(bt.cryptoDoesNotExist.code,bt.cryptoDoesNotExist.desc+" Detail:"+e)},t.createHttpMethodNotImplementedError=function(e){return new t(bt.httpMethodNotImplementedError.code,bt.httpMethodNotImplementedError.desc+" Given Method: "+e)},t.createEmptyNavigationUriError=function(){return new t(bt.emptyNavigateUriError.code,bt.emptyNavigateUriError.desc)},t.createEmptyHashError=function(e){return new t(bt.hashEmptyError.code,bt.hashEmptyError.desc+" Given Url: "+e)},t.createHashDoesNotContainStateError=function(){return new t(bt.hashDoesNotContainStateError.code,bt.hashDoesNotContainStateError.desc)},t.createHashDoesNotContainKnownPropertiesError=function(){return new t(bt.hashDoesNotContainKnownPropertiesError.code,bt.hashDoesNotContainKnownPropertiesError.desc)},t.createUnableToParseStateError=function(){return new t(bt.unableToParseStateError.code,bt.unableToParseStateError.desc)},t.createStateInteractionTypeMismatchError=function(){return new t(bt.stateInteractionTypeMismatchError.code,bt.stateInteractionTypeMismatchError.desc)},t.createInteractionInProgressError=function(){return new t(bt.interactionInProgress.code,bt.interactionInProgress.desc)},t.createPopupWindowError=function(e){var r=bt.popupWindowError.desc;return r=ne.isEmpty(e)?r:r+" Details: "+e,new t(bt.popupWindowError.code,r)},t.createEmptyWindowCreatedError=function(){return new t(bt.emptyWindowError.code,bt.emptyWindowError.desc)},t.createUserCancelledError=function(){return new t(bt.userCancelledError.code,bt.userCancelledError.desc)},t.createMonitorPopupTimeoutError=function(){return new t(bt.monitorPopupTimeoutError.code,bt.monitorPopupTimeoutError.desc)},t.createMonitorIframeTimeoutError=function(){return new t(bt.monitorIframeTimeoutError.code,bt.monitorIframeTimeoutError.desc)},t.createRedirectInIframeError=function(e){return new t(bt.redirectInIframeError.code,bt.redirectInIframeError.desc+" (window.parent !== window) => "+e)},t.createBlockReloadInHiddenIframeError=function(){return new t(bt.blockTokenRequestsInHiddenIframeError.code,bt.blockTokenRequestsInHiddenIframeError.desc)},t.createBlockAcquireTokenInPopupsError=function(){return new t(bt.blockAcquireTokenInPopupsError.code,bt.blockAcquireTokenInPopupsError.desc)},t.createIframeClosedPrematurelyError=function(){return new t(bt.iframeClosedPrematurelyError.code,bt.iframeClosedPrematurelyError.desc)},t.createSilentLogoutUnsupportedError=function(){return new t(bt.silentLogoutUnsupportedError.code,bt.silentLogoutUnsupportedError.desc)},t.createNoAccountError=function(){return new t(bt.noAccountError.code,bt.noAccountError.desc)},t.createSilentPromptValueError=function(e){return new t(bt.silentPromptValueError.code,bt.silentPromptValueError.desc+" Given value: "+e)},t.createUnableToParseTokenRequestCacheError=function(){return new t(bt.unableToParseTokenRequestCacheError.code,bt.unableToParseTokenRequestCacheError.desc)},t.createNoTokenRequestCacheError=function(){return new t(bt.noTokenRequestCacheError.code,bt.noTokenRequestCacheError.desc)},t.createAuthRequestNotSetError=function(){return new t(bt.authRequestNotSet.code,bt.authRequestNotSet.desc)},t.createNoCachedAuthorityError=function(){return new t(bt.noCachedAuthorityError.code,bt.noCachedAuthorityError.desc)},t.createInvalidCacheTypeError=function(){return new t(bt.invalidCacheType.code,""+bt.invalidCacheType.desc)},t.createNonBrowserEnvironmentError=function(){return new t(bt.notInBrowserEnvironment.code,bt.notInBrowserEnvironment.desc)},t.createDatabaseNotOpenError=function(){return new t(bt.databaseNotOpen.code,bt.databaseNotOpen.desc)},t.createNoNetworkConnectivityError=function(){return new t(bt.noNetworkConnectivity.code,bt.noNetworkConnectivity.desc)},t.createPostRequestFailedError=function(e,r){return new t(bt.postRequestFailed.code,bt.postRequestFailed.desc+" | Network client threw: "+e+" | Attempted to reach: "+r.split("?")[0])},t.createGetRequestFailedError=function(e,r){return new t(bt.getRequestFailed.code,bt.getRequestFailed.desc+" | Network client threw: "+e+" | Attempted to reach: "+r.split("?")[0])},t.createFailedToParseNetworkResponseError=function(e){return new t(bt.failedToParseNetworkResponse.code,bt.failedToParseNetworkResponse.desc+" | Attempted to reach: "+e.split("?")[0])},t.createUnableToLoadTokenError=function(e){return new t(bt.unableToLoadTokenError.code,bt.unableToLoadTokenError.desc+" | "+e)},t.createSigningKeyNotFoundInStorageError=function(e){return new t(bt.signingKeyNotFoundInStorage.code,bt.signingKeyNotFoundInStorage.desc+" | No match found for KeyId: "+e)},t.createAuthCodeRequiredError=function(){return new t(bt.authCodeRequired.code,bt.authCodeRequired.desc)},t.createAuthCodeOrNativeAccountIdRequiredError=function(){return new t(bt.authCodeOrNativeAccountRequired.code,bt.authCodeOrNativeAccountRequired.desc)},t.createDatabaseUnavailableError=function(){return new t(bt.databaseUnavailable.code,bt.databaseUnavailable.desc)},t.createUnableToAcquireTokenFromNativePlatformError=function(){return new t(bt.unableToAcquireTokenFromNativePlatform.code,bt.unableToAcquireTokenFromNativePlatform.desc)},t.createNativeHandshakeTimeoutError=function(){return new t(bt.nativeHandshakeTimeout.code,bt.nativeHandshakeTimeout.desc)},t.createNativeExtensionNotInstalledError=function(){return new t(bt.nativeExtensionNotInstalled.code,bt.nativeExtensionNotInstalled.desc)},t.createNativeConnectionNotEstablishedError=function(){return new t(bt.nativeConnectionNotEstablished.code,bt.nativeConnectionNotEstablished.desc)},t.createNativeBrokerCalledBeforeInitialize=function(){return new t(bt.nativeBrokerCalledBeforeInitialize.code,bt.nativeBrokerCalledBeforeInitialize.desc)},t.createNativePromptParameterNotSupportedError=function(){return new t(bt.nativePromptNotSupported.code,bt.nativePromptNotSupported.desc)},t}($),kt={INTERACTION_IN_PROGRESS_VALUE:"interaction_in_progress",INVALID_GRANT_ERROR:"invalid_grant",POPUP_WIDTH:483,POPUP_HEIGHT:600,POPUP_NAME_PREFIX:"msal",POLL_INTERVAL_MS:50,MSAL_SKU:"msal.js.browser"},Nt="53ee284d-920a-4b59-9d30-a60315b26836",Pt="ppnbnpeolgkicgegkbkbjmhlideopiji",Ot="MATS";
/*! @azure/msal-common v7.3.0 2022-08-01 */!function(e){e.HandshakeRequest="Handshake",e.HandshakeResponse="HandshakeResponse",e.GetToken="GetToken",e.Response="Response"}(ot||(ot={})),e.BrowserCacheLocation=void 0,(it=e.BrowserCacheLocation||(e.BrowserCacheLocation={})).LocalStorage="localStorage",it.SessionStorage="sessionStorage",it.MemoryStorage="memoryStorage",function(e){e.GET="GET",e.POST="POST"}(at||(at={})),function(e){e.AUTHORITY="authority",e.ACQUIRE_TOKEN_ACCOUNT="acquireToken.account",e.SESSION_STATE="session.state",e.REQUEST_STATE="request.state",e.NONCE_IDTOKEN="nonce.id_token",e.ORIGIN_URI="request.origin",e.RENEW_STATUS="token.renew.status",e.URL_HASH="urlHash",e.REQUEST_PARAMS="request.params",e.SCOPES="scopes",e.INTERACTION_STATUS_KEY="interaction.status",e.CCS_CREDENTIAL="ccs.credential",e.CORRELATION_ID="request.correlationId",e.NATIVE_REQUEST="request.native"}(st||(st={})),function(e){e.WRAPPER_SKU="wrapper.sku",e.WRAPPER_VER="wrapper.version"}(ct||(ct={})),e.ApiId=void 0,(ut=e.ApiId||(e.ApiId={}))[ut.acquireTokenRedirect=861]="acquireTokenRedirect",ut[ut.acquireTokenPopup=862]="acquireTokenPopup",ut[ut.ssoSilent=863]="ssoSilent",ut[ut.acquireTokenSilent_authCode=864]="acquireTokenSilent_authCode",ut[ut.handleRedirectPromise=865]="handleRedirectPromise",ut[ut.acquireTokenByCode=866]="acquireTokenByCode",ut[ut.acquireTokenSilent_silentFlow=61]="acquireTokenSilent_silentFlow",ut[ut.logout=961]="logout",ut[ut.logoutPopup=962]="logoutPopup",e.InteractionType=void 0,(lt=e.InteractionType||(e.InteractionType={})).Redirect="redirect",lt.Popup="popup",lt.Silent="silent",lt.None="none",e.InteractionStatus=void 0,(dt=e.InteractionStatus||(e.InteractionStatus={})).Startup="startup",dt.Login="login",dt.Logout="logout",dt.AcquireToken="acquireToken",dt.SsoSilent="ssoSilent",dt.HandleRedirect="handleRedirect",dt.None="none";var Mt,Ut={scopes:C},qt="jwk";e.WrapperSKU=void 0,(Mt=e.WrapperSKU||(e.WrapperSKU={})).React="@azure/msal-react",Mt.Angular="@azure/msal-angular";var Ht,Lt,Dt="msal.db",Ft={redirectUriNotSet:{code:"redirect_uri_empty",desc:"A redirect URI is required for all calls, and none has been set."},postLogoutUriNotSet:{code:"post_logout_uri_empty",desc:"A post logout redirect has not been set."},storageNotSupportedError:{code:"storage_not_supported",desc:"Given storage configuration option was not supported."},noRedirectCallbacksSet:{code:"no_redirect_callbacks",desc:"No redirect callbacks have been set. Please call setRedirectCallbacks() with the appropriate function arguments before continuing. More information is available here: https://github.com/AzureAD/microsoft-authentication-library-for-js/wiki/MSAL-basics."},invalidCallbackObject:{code:"invalid_callback_object",desc:"The object passed for the callback was invalid. More information is available here: https://github.com/AzureAD/microsoft-authentication-library-for-js/wiki/MSAL-basics."},stubPcaInstanceCalled:{code:"stubbed_public_client_application_called",desc:"Stub instance of Public Client Application was called. If using msal-react, please ensure context is not used without a provider. For more visit: aka.ms/msaljs/browser-errors"},inMemRedirectUnavailable:{code:"in_mem_redirect_unavailable",desc:"Redirect cannot be supported. In-memory storage was selected and storeAuthStateInCookie=false, which would cause the library to be unable to handle the incoming hash. If you would like to use the redirect API, please use session/localStorage or set storeAuthStateInCookie=true."}},xt=function(e){function t(r,n){var o=e.call(this,r,n)||this;return o.name="BrowserConfigurationAuthError",Object.setPrototypeOf(o,t.prototype),o}return r(t,e),t.createRedirectUriEmptyError=function(){return new t(Ft.redirectUriNotSet.code,Ft.redirectUriNotSet.desc)},t.createPostLogoutRedirectUriEmptyError=function(){return new t(Ft.postLogoutUriNotSet.code,Ft.postLogoutUriNotSet.desc)},t.createStorageNotSupportedError=function(e){return new t(Ft.storageNotSupportedError.code,Ft.storageNotSupportedError.desc+" Given Location: "+e)},t.createRedirectCallbacksNotSetError=function(){return new t(Ft.noRedirectCallbacksSet.code,Ft.noRedirectCallbacksSet.desc)},t.createStubPcaInstanceCalledError=function(){return new t(Ft.stubPcaInstanceCalled.code,Ft.stubPcaInstanceCalled.desc)},t.createInMemoryRedirectUnavailableError=function(){return new t(Ft.inMemRedirectUnavailable.code,Ft.inMemRedirectUnavailable.desc)},t}($),Kt=function(){function t(e){this.validateWindowStorage(e),this.windowStorage=window[e]}return t.prototype.validateWindowStorage=function(t){if(t!==e.BrowserCacheLocation.LocalStorage&&t!==e.BrowserCacheLocation.SessionStorage)throw xt.createStorageNotSupportedError(t);if(!!!window[t])throw xt.createStorageNotSupportedError(t)},t.prototype.getItem=function(e){return this.windowStorage.getItem(e)},t.prototype.setItem=function(e,t){this.windowStorage.setItem(e,t)},t.prototype.removeItem=function(e){this.windowStorage.removeItem(e)},t.prototype.getKeys=function(){return Object.keys(this.windowStorage)},t.prototype.containsKey=function(e){return this.windowStorage.hasOwnProperty(e)},t}(),Bt=function(){function e(){this.cache=new Map}return e.prototype.getItem=function(e){return this.cache.get(e)||null},e.prototype.setItem=function(e,t){this.cache.set(e,t)},e.prototype.removeItem=function(e){this.cache.delete(e)},e.prototype.getKeys=function(){var e=[];return this.cache.forEach((function(t,r){e.push(r)})),e},e.prototype.containsKey=function(e){return this.cache.has(e)},e.prototype.clear=function(){this.cache.clear()},e}(),Gt=function(){function e(){}return e.extractBrowserRequestState=function(e,t){if(ne.isEmpty(t))return null;try{return Be.parseRequestState(e,t).libraryState.meta}catch(e){throw re.createInvalidStateError(t,e)}},e.parseServerResponseFromHash=function(e){if(!e)return{};var t=new Ge(e);return Ge.getDeserializedHash(t.getHash())},e}(),zt=function(t){function n(e,r,n,o){var i=t.call(this,e,n)||this;return i.COOKIE_LIFE_MULTIPLIER=864e5,i.cacheConfig=r,i.logger=o,i.internalStorage=new Bt,i.browserStorage=i.setupBrowserStorage(i.cacheConfig.cacheLocation),i.temporaryCacheStorage=i.setupTemporaryCacheStorage(i.cacheConfig.cacheLocation),i.migrateCacheEntries(),i}return r(n,t),n.prototype.setupBrowserStorage=function(t){switch(t){case e.BrowserCacheLocation.LocalStorage:case e.BrowserCacheLocation.SessionStorage:try{return new Kt(t)}catch(e){this.logger.verbose(e);break}case e.BrowserCacheLocation.MemoryStorage:}return this.cacheConfig.cacheLocation=e.BrowserCacheLocation.MemoryStorage,new Bt},n.prototype.setupTemporaryCacheStorage=function(t){switch(t){case e.BrowserCacheLocation.LocalStorage:case e.BrowserCacheLocation.SessionStorage:try{return new Kt(e.BrowserCacheLocation.SessionStorage)}catch(e){return this.logger.verbose(e),this.internalStorage}case e.BrowserCacheLocation.MemoryStorage:default:return this.internalStorage}},n.prototype.migrateCacheEntries=function(){var e=this,t=E.CACHE_PREFIX+"."+f.ID_TOKEN,r=E.CACHE_PREFIX+"."+f.CLIENT_INFO,n=E.CACHE_PREFIX+"."+f.ERROR,o=E.CACHE_PREFIX+"."+f.ERROR_DESC,i=[this.browserStorage.getItem(t),this.browserStorage.getItem(r),this.browserStorage.getItem(n),this.browserStorage.getItem(o)];[f.ID_TOKEN,f.CLIENT_INFO,f.ERROR,f.ERROR_DESC].forEach((function(t,r){return e.migrateCacheEntry(t,i[r])}))},n.prototype.migrateCacheEntry=function(e,t){t&&this.setTemporaryCache(e,t,!0)},n.prototype.validateAndParseJson=function(e){try{var t=JSON.parse(e);return t&&"object"==typeof t?t:null}catch(e){return null}},n.prototype.getItem=function(e){return this.browserStorage.getItem(e)},n.prototype.setItem=function(e,t){this.browserStorage.setItem(e,t)},n.prototype.getAccount=function(e){var t=this.getItem(e);if(!t)return null;var r=this.validateAndParseJson(t);return r&&ge.isAccountEntity(r)?me.toObject(new ge,r):null},n.prototype.setAccount=function(e){this.logger.trace("BrowserCacheManager.setAccount called");var t=e.generateAccountKey();this.setItem(t,JSON.stringify(e))},n.prototype.getIdTokenCredential=function(e){var t=this.getItem(e);if(!t)return this.logger.trace("BrowserCacheManager.getIdTokenCredential: called, no cache hit"),null;var r=this.validateAndParseJson(t);return r&&Me.isIdTokenEntity(r)?(this.logger.trace("BrowserCacheManager.getIdTokenCredential: cache hit"),me.toObject(new Me,r)):(this.logger.trace("BrowserCacheManager.getIdTokenCredential: called, no cache hit"),null)},n.prototype.setIdTokenCredential=function(e){this.logger.trace("BrowserCacheManager.setIdTokenCredential called");var t=e.generateCredentialKey();this.setItem(t,JSON.stringify(e))},n.prototype.getAccessTokenCredential=function(e){var t=this.getItem(e);if(!t)return this.logger.trace("BrowserCacheManager.getAccessTokenCredential: called, no cache hit"),null;var r=this.validateAndParseJson(t);return r&&qe.isAccessTokenEntity(r)?(this.logger.trace("BrowserCacheManager.getAccessTokenCredential: cache hit"),me.toObject(new qe,r)):(this.logger.trace("BrowserCacheManager.getAccessTokenCredential: called, no cache hit"),null)},n.prototype.setAccessTokenCredential=function(e){this.logger.trace("BrowserCacheManager.setAccessTokenCredential called");var t=e.generateCredentialKey();this.setItem(t,JSON.stringify(e))},n.prototype.getRefreshTokenCredential=function(e){var t=this.getItem(e);if(!t)return this.logger.trace("BrowserCacheManager.getRefreshTokenCredential: called, no cache hit"),null;var r=this.validateAndParseJson(t);return r&&He.isRefreshTokenEntity(r)?(this.logger.trace("BrowserCacheManager.getRefreshTokenCredential: cache hit"),me.toObject(new He,r)):(this.logger.trace("BrowserCacheManager.getRefreshTokenCredential: called, no cache hit"),null)},n.prototype.setRefreshTokenCredential=function(e){this.logger.trace("BrowserCacheManager.setRefreshTokenCredential called");var t=e.generateCredentialKey();this.setItem(t,JSON.stringify(e))},n.prototype.getAppMetadata=function(e){var t=this.getItem(e);if(!t)return this.logger.trace("BrowserCacheManager.getAppMetadata: called, no cache hit"),null;var r=this.validateAndParseJson(t);return r&&We.isAppMetadataEntity(e,r)?(this.logger.trace("BrowserCacheManager.getAppMetadata: cache hit"),me.toObject(new We,r)):(this.logger.trace("BrowserCacheManager.getAppMetadata: called, no cache hit"),null)},n.prototype.setAppMetadata=function(e){this.logger.trace("BrowserCacheManager.setAppMetadata called");var t=e.generateAppMetadataKey();this.setItem(t,JSON.stringify(e))},n.prototype.getServerTelemetry=function(e){var t=this.getItem(e);if(!t)return this.logger.trace("BrowserCacheManager.getServerTelemetry: called, no cache hit"),null;var r=this.validateAndParseJson(t);return r&&ft.isServerTelemetryEntity(e,r)?(this.logger.trace("BrowserCacheManager.getServerTelemetry: cache hit"),me.toObject(new ft,r)):(this.logger.trace("BrowserCacheManager.getServerTelemetry: called, no cache hit"),null)},n.prototype.setServerTelemetry=function(e,t){this.logger.trace("BrowserCacheManager.setServerTelemetry called"),this.setItem(e,JSON.stringify(t))},n.prototype.getAuthorityMetadata=function(e){var t=this.internalStorage.getItem(e);if(!t)return this.logger.trace("BrowserCacheManager.getAuthorityMetadata: called, no cache hit"),null;var r=this.validateAndParseJson(t);return r&&nt.isAuthorityMetadataEntity(e,r)?(this.logger.trace("BrowserCacheManager.getAuthorityMetadata: cache hit"),me.toObject(new nt,r)):null},n.prototype.getAuthorityMetadataKeys=function(){var e=this;return this.internalStorage.getKeys().filter((function(t){return e.isAuthorityMetadata(t)}))},n.prototype.setWrapperMetadata=function(e,t){this.internalStorage.setItem(ct.WRAPPER_SKU,e),this.internalStorage.setItem(ct.WRAPPER_VER,t)},n.prototype.getWrapperMetadata=function(){return[this.internalStorage.getItem(ct.WRAPPER_SKU)||E.EMPTY_STRING,this.internalStorage.getItem(ct.WRAPPER_VER)||E.EMPTY_STRING]},n.prototype.setAuthorityMetadata=function(e,t){this.logger.trace("BrowserCacheManager.setAuthorityMetadata called"),this.internalStorage.setItem(e,JSON.stringify(t))},n.prototype.getActiveAccount=function(){var e=this.generateCacheKey(f.ACTIVE_ACCOUNT_FILTERS),t=this.getItem(e);if(!t){this.logger.trace("No active account filters cache schema found, looking for legacy schema");var r=this.generateCacheKey(f.ACTIVE_ACCOUNT),n=this.getItem(r);if(!n)return this.logger.trace("No active account found"),null;var o=this.getAccountInfoByFilter({localAccountId:n})[0]||null;return o?(this.logger.trace("Legacy active account cache schema found"),this.logger.trace("Adding active account filters cache schema"),this.setActiveAccount(o),o):null}var i=this.validateAndParseJson(t);return i?(this.logger.trace("Active account filters schema found"),this.getAccountInfoByFilter({homeAccountId:i.homeAccountId,localAccountId:i.localAccountId})[0]||null):(this.logger.trace("No active account found"),null)},n.prototype.setActiveAccount=function(e){var t=this.generateCacheKey(f.ACTIVE_ACCOUNT_FILTERS),r=this.generateCacheKey(f.ACTIVE_ACCOUNT);if(e){this.logger.verbose("setActiveAccount: Active account set");var n={homeAccountId:e.homeAccountId,localAccountId:e.localAccountId};this.browserStorage.setItem(t,JSON.stringify(n)),this.browserStorage.setItem(r,e.localAccountId)}else this.logger.verbose("setActiveAccount: No account passed, active account not set"),this.browserStorage.removeItem(t),this.browserStorage.removeItem(r)},n.prototype.getAccountInfoByFilter=function(e){return this.getAllAccounts().filter((function(t){return(!e.username||e.username.toLowerCase()===t.username.toLowerCase())&&((!e.homeAccountId||e.homeAccountId===t.homeAccountId)&&((!e.localAccountId||e.localAccountId===t.localAccountId)&&((!e.tenantId||e.tenantId===t.tenantId)&&(!e.environment||e.environment===t.environment))))}))},n.prototype.getAccountInfoByHints=function(e,t){var r=this.getAllAccounts().filter((function(r){if(t){var n=r.idTokenClaims&&r.idTokenClaims.sid;return t===n}return!!e&&e===r.username}));if(1===r.length)return r[0];if(r.length>1)throw re.createMultipleMatchingAccountsInCacheError();return null},n.prototype.getThrottlingCache=function(e){var t=this.getItem(e);if(!t)return this.logger.trace("BrowserCacheManager.getThrottlingCache: called, no cache hit"),null;var r=this.validateAndParseJson(t);return r&&mt.isThrottlingEntity(e,r)?(this.logger.trace("BrowserCacheManager.getThrottlingCache: cache hit"),me.toObject(new mt,r)):(this.logger.trace("BrowserCacheManager.getThrottlingCache: called, no cache hit"),null)},n.prototype.setThrottlingCache=function(e,t){this.logger.trace("BrowserCacheManager.setThrottlingCache called"),this.setItem(e,JSON.stringify(t))},n.prototype.getTemporaryCache=function(t,r){var n=r?this.generateCacheKey(t):t;if(this.cacheConfig.storeAuthStateInCookie){var o=this.getItemCookie(n);if(o)return this.logger.trace("BrowserCacheManager.getTemporaryCache: storeAuthStateInCookies set to true, retrieving from cookies"),o}var i=this.temporaryCacheStorage.getItem(n);if(!i){if(this.cacheConfig.cacheLocation===e.BrowserCacheLocation.LocalStorage){var a=this.browserStorage.getItem(n);if(a)return this.logger.trace("BrowserCacheManager.getTemporaryCache: Temporary cache item found in local storage"),a}return this.logger.trace("BrowserCacheManager.getTemporaryCache: No cache item found in local storage"),null}return this.logger.trace("BrowserCacheManager.getTemporaryCache: Temporary cache item returned"),i},n.prototype.setTemporaryCache=function(e,t,r){var n=r?this.generateCacheKey(e):e;this.temporaryCacheStorage.setItem(n,t),this.cacheConfig.storeAuthStateInCookie&&(this.logger.trace("BrowserCacheManager.setTemporaryCache: storeAuthStateInCookie set to true, setting item cookie"),this.setItemCookie(n,t))},n.prototype.removeItem=function(e){return this.browserStorage.removeItem(e),this.temporaryCacheStorage.removeItem(e),this.cacheConfig.storeAuthStateInCookie&&(this.logger.trace("BrowserCacheManager.removeItem: storeAuthStateInCookie is true, clearing item cookie"),this.clearItemCookie(e)),!0},n.prototype.containsKey=function(e){return this.browserStorage.containsKey(e)||this.temporaryCacheStorage.containsKey(e)},n.prototype.getKeys=function(){return s(this.browserStorage.getKeys(),this.temporaryCacheStorage.getKeys())},n.prototype.clear=function(){return o(this,void 0,void 0,(function(){var e=this;return i(this,(function(t){switch(t.label){case 0:return[4,this.removeAllAccounts()];case 1:return t.sent(),this.removeAppMetadata(),this.getKeys().forEach((function(t){!e.browserStorage.containsKey(t)&&!e.temporaryCacheStorage.containsKey(t)||-1===t.indexOf(E.CACHE_PREFIX)&&-1===t.indexOf(e.clientId)||e.removeItem(t)})),this.internalStorage.clear(),[2]}}))}))},n.prototype.setItemCookie=function(e,t,r){var n=encodeURIComponent(e)+"="+encodeURIComponent(t)+";path=/;SameSite=Lax;";r&&(n+="expires="+this.getCookieExpirationTime(r)+";");this.cacheConfig.secureCookies&&(n+="Secure;"),document.cookie=n},n.prototype.getItemCookie=function(e){for(var t=encodeURIComponent(e)+"=",r=document.cookie.split(";"),n=0;n<r.length;n++){for(var o=r[n];" "===o.charAt(0);)o=o.substring(1);if(0===o.indexOf(t))return decodeURIComponent(o.substring(t.length,o.length))}return E.EMPTY_STRING},n.prototype.clearMsalCookies=function(){var e=this,t=E.CACHE_PREFIX+"."+this.clientId;document.cookie.split(";").forEach((function(r){for(;" "===r.charAt(0);)r=r.substring(1);if(0===r.indexOf(t)){var n=r.split("=")[0];e.clearItemCookie(n)}}))},n.prototype.clearItemCookie=function(e){this.setItemCookie(e,E.EMPTY_STRING,-1)},n.prototype.getCookieExpirationTime=function(e){var t=new Date;return new Date(t.getTime()+e*this.COOKIE_LIFE_MULTIPLIER).toUTCString()},n.prototype.getCache=function(){return this.browserStorage},n.prototype.setCache=function(){},n.prototype.generateCacheKey=function(e){return this.validateAndParseJson(e)?JSON.stringify(e):ne.startsWith(e,E.CACHE_PREFIX)||ne.startsWith(e,f.ADAL_ID_TOKEN)?e:E.CACHE_PREFIX+"."+this.clientId+"."+e},n.prototype.generateAuthorityKey=function(e){var t=Be.parseRequestState(this.cryptoImpl,e).libraryState.id;return this.generateCacheKey(st.AUTHORITY+"."+t)},n.prototype.generateNonceKey=function(e){var t=Be.parseRequestState(this.cryptoImpl,e).libraryState.id;return this.generateCacheKey(st.NONCE_IDTOKEN+"."+t)},n.prototype.generateStateKey=function(e){var t=Be.parseRequestState(this.cryptoImpl,e).libraryState.id;return this.generateCacheKey(st.REQUEST_STATE+"."+t)},n.prototype.getCachedAuthority=function(e){var t=this.generateStateKey(e),r=this.getTemporaryCache(t);if(!r)return null;var n=this.generateAuthorityKey(r);return this.getTemporaryCache(n)},n.prototype.updateCacheEntries=function(e,t,r,n,o){this.logger.trace("BrowserCacheManager.updateCacheEntries called");var i=this.generateStateKey(e);this.setTemporaryCache(i,e,!1);var a=this.generateNonceKey(e);this.setTemporaryCache(a,t,!1);var s=this.generateAuthorityKey(e);if(this.setTemporaryCache(s,r,!1),o){var c={credential:o.homeAccountId,type:Se.HOME_ACCOUNT_ID};this.setTemporaryCache(st.CCS_CREDENTIAL,JSON.stringify(c),!0)}else if(!ne.isEmpty(n)){c={credential:n,type:Se.UPN};this.setTemporaryCache(st.CCS_CREDENTIAL,JSON.stringify(c),!0)}},n.prototype.resetRequestCache=function(e){var t=this;this.logger.trace("BrowserCacheManager.resetRequestCache called"),ne.isEmpty(e)||this.getKeys().forEach((function(r){-1!==r.indexOf(e)&&t.removeItem(r)})),e&&(this.removeItem(this.generateStateKey(e)),this.removeItem(this.generateNonceKey(e)),this.removeItem(this.generateAuthorityKey(e))),this.removeItem(this.generateCacheKey(st.REQUEST_PARAMS)),this.removeItem(this.generateCacheKey(st.ORIGIN_URI)),this.removeItem(this.generateCacheKey(st.URL_HASH)),this.removeItem(this.generateCacheKey(st.CORRELATION_ID)),this.removeItem(this.generateCacheKey(st.CCS_CREDENTIAL)),this.removeItem(this.generateCacheKey(st.NATIVE_REQUEST)),this.setInteractionInProgress(!1)},n.prototype.cleanRequestByState=function(e){if(this.logger.trace("BrowserCacheManager.cleanRequestByState called"),e){var t=this.generateStateKey(e),r=this.temporaryCacheStorage.getItem(t);this.logger.infoPii("BrowserCacheManager.cleanRequestByState: Removing temporary cache items for state: "+r),this.resetRequestCache(r||E.EMPTY_STRING)}this.clearMsalCookies()},n.prototype.cleanRequestByInteractionType=function(e){var t=this;this.logger.trace("BrowserCacheManager.cleanRequestByInteractionType called"),this.getKeys().forEach((function(r){if(-1!==r.indexOf(st.REQUEST_STATE)){var n=t.temporaryCacheStorage.getItem(r);if(n){var o=Gt.extractBrowserRequestState(t.cryptoImpl,n);o&&o.interactionType===e&&(t.logger.infoPii("BrowserCacheManager.cleanRequestByInteractionType: Removing temporary cache items for state: "+n),t.resetRequestCache(n))}}})),this.clearMsalCookies(),this.setInteractionInProgress(!1)},n.prototype.cacheCodeRequest=function(e,t){this.logger.trace("BrowserCacheManager.cacheCodeRequest called");var r=t.base64Encode(JSON.stringify(e));this.setTemporaryCache(st.REQUEST_PARAMS,r,!0)},n.prototype.getCachedRequest=function(e,t){this.logger.trace("BrowserCacheManager.getCachedRequest called");var r=this.getTemporaryCache(st.REQUEST_PARAMS,!0);if(!r)throw Rt.createNoTokenRequestCacheError();var n=this.validateAndParseJson(t.base64Decode(r));if(!n)throw Rt.createUnableToParseTokenRequestCacheError();if(this.removeItem(this.generateCacheKey(st.REQUEST_PARAMS)),ne.isEmpty(n.authority)){var o=this.generateAuthorityKey(e),i=this.getTemporaryCache(o);if(!i)throw Rt.createNoCachedAuthorityError();n.authority=i}return n},n.prototype.getCachedNativeRequest=function(){this.logger.trace("BrowserCacheManager.getCachedNativeRequest called");var e=this.getTemporaryCache(st.NATIVE_REQUEST,!0);if(!e)return this.logger.trace("BrowserCacheManager.getCachedNativeRequest: No cached native request found"),null;var t=this.validateAndParseJson(e);return t||(this.logger.error("BrowserCacheManager.getCachedNativeRequest: Unable to parse native request"),null)},n.prototype.isInteractionInProgress=function(e){var t=this.getInteractionInProgress();return e?t===this.clientId:!!t},n.prototype.getInteractionInProgress=function(){var e=E.CACHE_PREFIX+"."+st.INTERACTION_STATUS_KEY;return this.getTemporaryCache(e,!1)},n.prototype.setInteractionInProgress=function(e){var t=E.CACHE_PREFIX+"."+st.INTERACTION_STATUS_KEY;if(e){if(this.getInteractionInProgress())throw Rt.createInteractionInProgressError();this.setTemporaryCache(t,this.clientId,!1)}else e||this.getInteractionInProgress()!==this.clientId||this.removeItem(t)},n.prototype.getLegacyLoginHint=function(){var e=this.getTemporaryCache(f.ADAL_ID_TOKEN);e&&(this.browserStorage.removeItem(f.ADAL_ID_TOKEN),this.logger.verbose("Cached ADAL id token retrieved."));var t=this.getTemporaryCache(f.ID_TOKEN,!0);t&&(this.removeItem(this.generateCacheKey(f.ID_TOKEN)),this.logger.verbose("Cached MSAL.js v1 id token retrieved"));var r=t||e;if(r){var n=new fe(r,this.cryptoImpl);if(n.claims&&n.claims.preferred_username)return this.logger.verbose("No SSO params used and ADAL/MSAL v1 token retrieved, setting ADAL/MSAL v1 preferred_username as loginHint"),n.claims.preferred_username;if(n.claims&&n.claims.upn)return this.logger.verbose("No SSO params used and ADAL/MSAL v1 token retrieved, setting ADAL/MSAL v1 upn as loginHint"),n.claims.upn;this.logger.verbose("No SSO params used and ADAL/MSAL v1 token retrieved, however, no account hint claim found. Enable preferred_username or upn id token claim to get SSO.")}return null},n.prototype.updateCredentialCacheKey=function(e,t){var r=t.generateCredentialKey();if(e!==r){var n=this.getItem(e);if(n)return this.removeItem(e),this.setItem(r,n),this.logger.verbose("Updated an outdated "+t.credentialType+" cache key"),r;this.logger.error("Attempted to update an outdated "+t.credentialType+" cache key but no item matching the outdated key was found in storage")}return e},n}(me),jt="@azure/msal-browser",Yt="2.28.1",Wt=function(){function e(){}return e.prototype.sendGetRequestAsync=function(e,t){return o(this,void 0,void 0,(function(){var r,n,o;return i(this,(function(i){switch(i.label){case 0:return i.trys.push([0,2,,3]),[4,fetch(e,{method:at.GET,headers:this.getFetchHeaders(t)})];case 1:return r=i.sent(),[3,3];case 2:throw n=i.sent(),window.navigator.onLine?Rt.createGetRequestFailedError(n,e):Rt.createNoNetworkConnectivityError();case 3:return i.trys.push([3,5,,6]),o={headers:this.getHeaderDict(r.headers)},[4,r.json()];case 4:return[2,(o.body=i.sent(),o.status=r.status,o)];case 5:throw i.sent(),Rt.createFailedToParseNetworkResponseError(e);case 6:return[2]}}))}))},e.prototype.sendPostRequestAsync=function(e,t){return o(this,void 0,void 0,(function(){var r,n,o,a;return i(this,(function(i){switch(i.label){case 0:r=t&&t.body||E.EMPTY_STRING,i.label=1;case 1:return i.trys.push([1,3,,4]),[4,fetch(e,{method:at.POST,headers:this.getFetchHeaders(t),body:r})];case 2:return n=i.sent(),[3,4];case 3:throw o=i.sent(),window.navigator.onLine?Rt.createPostRequestFailedError(o,e):Rt.createNoNetworkConnectivityError();case 4:return i.trys.push([4,6,,7]),a={headers:this.getHeaderDict(n.headers)},[4,n.json()];case 5:return[2,(a.body=i.sent(),a.status=n.status,a)];case 6:throw i.sent(),Rt.createFailedToParseNetworkResponseError(e);case 7:return[2]}}))}))},e.prototype.getFetchHeaders=function(e){var t=new Headers;if(!e||!e.headers)return t;var r=e.headers;return Object.keys(r).forEach((function(e){t.append(e,r[e])})),t},e.prototype.getHeaderDict=function(e){var t={};return e.forEach((function(e,r){t[r]=e})),t},e}(),Vt=function(){function e(){}return e.prototype.sendGetRequestAsync=function(e,t){return o(this,void 0,void 0,(function(){return i(this,(function(r){return[2,this.sendRequestAsync(e,at.GET,t)]}))}))},e.prototype.sendPostRequestAsync=function(e,t){return o(this,void 0,void 0,(function(){return i(this,(function(r){return[2,this.sendRequestAsync(e,at.POST,t)]}))}))},e.prototype.sendRequestAsync=function(e,t,r){var n=this;return new Promise((function(o,i){var a=new XMLHttpRequest;if(a.open(t,e,!0),n.setXhrHeaders(a,r),a.onload=function(){(a.status<200||a.status>=300)&&(t===at.POST?i(Rt.createPostRequestFailedError("Failed with status "+a.status,e)):i(Rt.createGetRequestFailedError("Failed with status "+a.status,e)));try{var r=JSON.parse(a.responseText),s={headers:n.getHeaderDict(a),body:r,status:a.status};o(s)}catch(t){i(Rt.createFailedToParseNetworkResponseError(e))}},a.onerror=function(){window.navigator.onLine?t===at.POST?i(Rt.createPostRequestFailedError("Failed with status "+a.status,e)):i(Rt.createGetRequestFailedError("Failed with status "+a.status,e)):i(Rt.createNoNetworkConnectivityError())},t===at.POST&&r&&r.body)a.send(r.body);else{if(t!==at.GET)throw Rt.createHttpMethodNotImplementedError(t);a.send()}}))},e.prototype.setXhrHeaders=function(e,t){if(t&&t.headers){var r=t.headers;Object.keys(r).forEach((function(t){e.setRequestHeader(t,r[t])}))}},e.prototype.getHeaderDict=function(e){var t=e.getAllResponseHeaders().trim().split(/[\r\n]+/),r={};return t.forEach((function(e){var t=e.split(": "),n=t.shift(),o=t.join(": ");n&&o&&(r[n]=o)})),r},e}(),Jt=function(){function t(){}return t.clearHash=function(e){e.location.hash=E.EMPTY_STRING,"function"==typeof e.history.replaceState&&e.history.replaceState(null,E.EMPTY_STRING,""+e.location.origin+e.location.pathname+e.location.search)},t.replaceHash=function(e){var t=e.split("#");t.shift(),window.location.hash=t.length>0?t.join("#"):E.EMPTY_STRING},t.isInIframe=function(){return window.parent!==window},t.isInPopup=function(){return"undefined"!=typeof window&&!!window.opener&&window.opener!==window&&"string"==typeof window.name&&0===window.name.indexOf(kt.POPUP_NAME_PREFIX+".")},t.getCurrentUri=function(){return window.location.href.split("?")[0].split("#")[0]},t.getHomepage=function(){var e=new Ge(window.location.href).getUrlComponents();return e.Protocol+"//"+e.HostNameAndPort+"/"},t.getBrowserNetworkClient=function(){return window.fetch&&window.Headers?new Wt:new Vt},t.blockReloadInHiddenIframes=function(){if(Ge.hashContainsKnownProperties(window.location.hash)&&t.isInIframe())throw Rt.createBlockReloadInHiddenIframeError()},t.blockRedirectInIframe=function(r,n){var o=t.isInIframe();if(r===e.InteractionType.Redirect&&o&&!n)throw Rt.createRedirectInIframeError(o)},t.blockAcquireTokenInPopups=function(){if(t.isInPopup())throw Rt.createBlockAcquireTokenInPopupsError()},t.blockNonBrowserEnvironment=function(e){if(!e)throw Rt.createNonBrowserEnvironmentError()},t.blockNativeBrokerCalledBeforeInitialized=function(e,t){if(e&&!t)throw Rt.createNativeBrokerCalledBeforeInitialize()},t.detectIEOrEdge=function(){var e=window.navigator.userAgent,t=e.indexOf("MSIE "),r=e.indexOf("Trident/"),n=e.indexOf("Edge/");return t>0||r>0||n>0},t}(),Qt=function(){function t(e,t,r,n,o,i,a,s,c){this.config=e,this.browserStorage=t,this.browserCrypto=r,this.networkClient=this.config.system.networkClient,this.eventHandler=o,this.navigationClient=i,this.nativeMessageHandler=s,this.correlationId=c||this.browserCrypto.createNewGuid(),this.logger=n.clone(kt.MSAL_SKU,Yt,this.correlationId),this.performanceClient=a}return t.prototype.clearCacheOnLogout=function(e){return o(this,void 0,void 0,(function(){return i(this,(function(t){switch(t.label){case 0:if(!e)return[3,5];ge.accountInfoIsEqual(e,this.browserStorage.getActiveAccount(),!1)&&(this.logger.verbose("Setting active account to null"),this.browserStorage.setActiveAccount(null)),t.label=1;case 1:return t.trys.push([1,3,,4]),[4,this.browserStorage.removeAccount(ge.generateAccountCacheKey(e))];case 2:return t.sent(),this.logger.verbose("Cleared cache items belonging to the account provided in the logout request."),[3,4];case 3:return t.sent(),this.logger.error("Account provided in logout request was not found. Local cache unchanged."),[3,4];case 4:return[3,9];case 5:return t.trys.push([5,8,,9]),this.logger.verbose("No account provided in logout request, clearing all cache items.",this.correlationId),[4,this.browserStorage.clear()];case 6:return t.sent(),[4,this.browserCrypto.clearKeystore()];case 7:return t.sent(),[3,9];case 8:return t.sent(),this.logger.error("Attempted to clear all MSAL cache items and failed. Local cache unchanged."),[3,9];case 9:return[2]}}))}))},t.prototype.initializeBaseRequest=function(t){return o(this,void 0,void 0,(function(){var r,o,a,c;return i(this,(function(i){switch(i.label){case 0:if(this.logger.verbose("Initializing BaseAuthRequest"),r=t.authority||this.config.auth.authority,o=s(t&&t.scopes||[]),(a=n(n({},t),{correlationId:this.correlationId,authority:r,scopes:o})).authenticationScheme){if(a.authenticationScheme===e.AuthenticationScheme.SSH){if(!t.sshJwk)throw le.createMissingSshJwkError();if(!t.sshKid)throw le.createMissingSshKidError()}this.logger.verbose('Authentication Scheme set to "'+a.authenticationScheme+'" as configured in Auth request')}else a.authenticationScheme=e.AuthenticationScheme.BEARER,this.logger.verbose('Authentication Scheme wasn\'t explicitly set in request, defaulting to "Bearer" request');return!t.claims||ne.isEmpty(t.claims)?[3,2]:(c=a,[4,this.browserCrypto.hashString(t.claims)]);case 1:c.requestedClaimsHash=i.sent(),i.label=2;case 2:return[2,a]}}))}))},t.prototype.getRedirectUri=function(e){this.logger.verbose("getRedirectUri called");var t=e||this.config.auth.redirectUri||Jt.getCurrentUri();return Ge.getAbsoluteUrl(t,Jt.getCurrentUri())},t.prototype.initializeServerTelemetryManager=function(e,t){this.logger.verbose("initializeServerTelemetryManager called");var r={clientId:this.config.auth.clientId,correlationId:this.correlationId,apiId:e,forceRefresh:t||!1,wrapperSKU:this.browserStorage.getWrapperMetadata()[0],wrapperVer:this.browserStorage.getWrapperMetadata()[1]};return new wt(r,this.browserStorage)},t.prototype.getDiscoveredAuthority=function(e){return o(this,void 0,void 0,(function(){var t;return i(this,(function(r){switch(r.label){case 0:return this.logger.verbose("getDiscoveredAuthority called"),t={protocolMode:this.config.auth.protocolMode,knownAuthorities:this.config.auth.knownAuthorities,cloudDiscoveryMetadata:this.config.auth.cloudDiscoveryMetadata,authorityMetadata:this.config.auth.authorityMetadata},e?(this.logger.verbose("Creating discovered authority with request authority"),[4,gt.createDiscoveredInstance(e,this.config.system.networkClient,this.browserStorage,t)]):[3,2];case 1:case 3:return[2,r.sent()];case 2:return this.logger.verbose("Creating discovered authority with configured authority"),[4,gt.createDiscoveredInstance(this.config.auth.authority,this.config.system.networkClient,this.browserStorage,t)]}}))}))},t}(),Xt=function(t){function a(){return null!==t&&t.apply(this,arguments)||this}return r(a,t),a.prototype.initializeAuthorizationCodeRequest=function(e){return o(this,void 0,void 0,(function(){var t,r;return i(this,(function(o){switch(o.label){case 0:return this.logger.verbose("initializeAuthorizationRequest called",e.correlationId),[4,this.browserCrypto.generatePkceCodes()];case 1:return t=o.sent(),r=n(n({},e),{redirectUri:e.redirectUri,code:E.EMPTY_STRING,codeVerifier:t.verifier}),e.codeChallenge=t.challenge,e.codeChallengeMethod=E.S256_CODE_CHALLENGE_METHOD,[2,r]}}))}))},a.prototype.initializeLogoutRequest=function(e){this.logger.verbose("initializeLogoutRequest called",null==e?void 0:e.correlationId);var t=n({correlationId:this.correlationId||this.browserCrypto.createNewGuid()},e);if(e)if(e.logoutHint)this.logger.verbose("logoutHint has already been set in logoutRequest");else if(e.account){var r=this.getLogoutHintFromIdTokenClaims(e.account);r&&(this.logger.verbose("Setting logoutHint to login_hint ID Token Claim value for the account provided"),t.logoutHint=r)}else this.logger.verbose("logoutHint was not set and account was not passed into logout request, logoutHint will not be set");else this.logger.verbose("logoutHint will not be set since no logout request was configured");return e&&null===e.postLogoutRedirectUri?this.logger.verbose("postLogoutRedirectUri passed as null, not setting post logout redirect uri",t.correlationId):e&&e.postLogoutRedirectUri?(this.logger.verbose("Setting postLogoutRedirectUri to uri set on logout request",t.correlationId),t.postLogoutRedirectUri=Ge.getAbsoluteUrl(e.postLogoutRedirectUri,Jt.getCurrentUri())):null===this.config.auth.postLogoutRedirectUri?this.logger.verbose("postLogoutRedirectUri configured as null and no uri set on request, not passing post logout redirect",t.correlationId):this.config.auth.postLogoutRedirectUri?(this.logger.verbose("Setting postLogoutRedirectUri to configured uri",t.correlationId),t.postLogoutRedirectUri=Ge.getAbsoluteUrl(this.config.auth.postLogoutRedirectUri,Jt.getCurrentUri())):(this.logger.verbose("Setting postLogoutRedirectUri to current page",t.correlationId),t.postLogoutRedirectUri=Ge.getAbsoluteUrl(Jt.getCurrentUri(),Jt.getCurrentUri())),t},a.prototype.getLogoutHintFromIdTokenClaims=function(e){var t=e.idTokenClaims;if(t){if(t.login_hint)return t.login_hint;this.logger.verbose("The ID Token Claims tied to the provided account do not contain a login_hint claim, logoutHint will not be added to logout request")}else this.logger.verbose("The provided account does not contain ID Token Claims, logoutHint will not be added to logout request");return null},a.prototype.createAuthCodeClient=function(e,t,r){return o(this,void 0,void 0,(function(){var n;return i(this,(function(o){switch(o.label){case 0:return[4,this.getClientConfiguration(e,t,r)];case 1:return n=o.sent(),[2,new Qe(n)]}}))}))},a.prototype.getClientConfiguration=function(e,t,r){return o(this,void 0,void 0,(function(){var n;return i(this,(function(o){switch(o.label){case 0:return this.logger.verbose("getClientConfiguration called",this.correlationId),[4,this.getDiscoveredAuthority(t,r)];case 1:return n=o.sent(),[2,{authOptions:{clientId:this.config.auth.clientId,authority:n,clientCapabilities:this.config.auth.clientCapabilities},systemOptions:{tokenRenewalOffsetSeconds:this.config.system.tokenRenewalOffsetSeconds,preventCorsPreflight:!0},loggerOptions:{loggerCallback:this.config.system.loggerOptions.loggerCallback,piiLoggingEnabled:this.config.system.loggerOptions.piiLoggingEnabled,logLevel:this.config.system.loggerOptions.logLevel,correlationId:this.correlationId},cryptoInterface:this.browserCrypto,networkInterface:this.networkClient,storageInterface:this.browserStorage,serverTelemetryManager:e,libraryInfo:{sku:kt.MSAL_SKU,version:Yt,cpu:E.EMPTY_STRING,os:E.EMPTY_STRING},telemetry:this.config.telemetry}]}}))}))},a.prototype.validateAndExtractStateFromHash=function(e,t,r){if(this.logger.verbose("validateAndExtractStateFromHash called",r),!e.state)throw Rt.createHashDoesNotContainStateError();var n=Gt.extractBrowserRequestState(this.browserCrypto,e.state);if(!n)throw Rt.createUnableToParseStateError();if(n.interactionType!==t)throw Rt.createStateInteractionTypeMismatchError();return this.logger.verbose("Returning state from hash",r),e.state},a.prototype.getDiscoveredAuthority=function(t,r){return o(this,void 0,void 0,(function(){var n,o,a,s;return i(this,(function(i){switch(i.label){case 0:return this.logger.verbose("getDiscoveredAuthority called",this.correlationId),n=this.performanceClient.startMeasurement(e.PerformanceEvents.StandardInteractionClientGetDiscoveredAuthority,this.correlationId),o={protocolMode:this.config.auth.protocolMode,knownAuthorities:this.config.auth.knownAuthorities,cloudDiscoveryMetadata:this.config.auth.cloudDiscoveryMetadata,authorityMetadata:this.config.auth.authorityMetadata,skipAuthorityMetadataCache:this.config.auth.skipAuthorityMetadataCache},a=t||this.config.auth.authority,s=pt.generateAuthority(a,r||this.config.auth.azureCloudOptions),this.logger.verbose("Creating discovered authority with configured authority",this.correlationId),[4,gt.createDiscoveredInstance(s,this.config.system.networkClient,this.browserStorage,o).then((function(e){return n.endMeasurement({success:!0}),e})).catch((function(e){throw n.endMeasurement({errorCode:e.errorCode,subErrorCode:e.subError,success:!1}),e}))];case 1:return[2,i.sent()]}}))}))},a.prototype.initializeAuthorizationRequest=function(e,t){return o(this,void 0,void 0,(function(){var r,o,a,s,c,u,l;return i(this,(function(i){switch(i.label){case 0:return this.logger.verbose("initializeAuthorizationRequest called",this.correlationId),r=this.getRedirectUri(e.redirectUri),o={interactionType:t},a=Be.setRequestState(this.browserCrypto,e&&e.state||E.EMPTY_STRING,o),c=[{}],[4,this.initializeBaseRequest(e)];case 1:return s=n.apply(void 0,[n.apply(void 0,c.concat([i.sent()])),{redirectUri:r,state:a,nonce:e.nonce||this.browserCrypto.createNewGuid(),responseMode:I.FRAGMENT}]),(u=e.account||this.browserStorage.getActiveAccount())&&(this.logger.verbose("Setting validated request account",this.correlationId),this.logger.verbosePii("Setting validated request account: "+u.homeAccountId,this.correlationId),s.account=u),ne.isEmpty(s.loginHint)&&!u&&(l=this.browserStorage.getLegacyLoginHint())&&(s.loginHint=l),[2,s]}}))}))},a}(Qt),Zt=function(){function e(e,t,r,n){this.authModule=e,this.browserStorage=t,this.authCodeRequest=r,this.logger=n}return e.prototype.handleCodeResponseFromHash=function(e,t,r,n){return o(this,void 0,void 0,(function(){var o,a,s;return i(this,(function(i){if(this.logger.verbose("InteractionHandler.handleCodeResponse called"),ne.isEmpty(e))throw Rt.createEmptyHashError(e);if(o=this.browserStorage.generateStateKey(t),!(a=this.browserStorage.getTemporaryCache(o)))throw re.createStateNotFoundError("Cached State");try{s=this.authModule.handleFragmentResponse(e,a)}catch(e){throw e instanceof Ae&&e.subError===bt.userCancelledError.code?Rt.createUserCancelledError():e}return[2,this.handleCodeResponseFromServer(s,t,r,n)]}))}))},e.prototype.handleCodeResponseFromServer=function(e,t,r,n,a){return void 0===a&&(a=!0),o(this,void 0,void 0,(function(){var o,s,c,u,l,d;return i(this,(function(i){switch(i.label){case 0:if(this.logger.trace("InteractionHandler.handleCodeResponseFromServer called"),o=this.browserStorage.generateStateKey(t),!(s=this.browserStorage.getTemporaryCache(o)))throw re.createStateNotFoundError("Cached State");return c=this.browserStorage.generateNonceKey(s),u=this.browserStorage.getTemporaryCache(c),this.authCodeRequest.code=e.code,e.cloud_instance_host_name?[4,this.updateTokenEndpointAuthority(e.cloud_instance_host_name,r,n)]:[3,2];case 1:i.sent(),i.label=2;case 2:return a&&(e.nonce=u||void 0),e.state=s,e.client_info?this.authCodeRequest.clientInfo=e.client_info:(l=this.checkCcsCredentials())&&(this.authCodeRequest.ccsCredential=l),[4,this.authModule.acquireToken(this.authCodeRequest,e)];case 3:return d=i.sent(),this.browserStorage.cleanRequestByState(t),[2,d]}}))}))},e.prototype.updateTokenEndpointAuthority=function(e,t,r){return o(this,void 0,void 0,(function(){var n,o;return i(this,(function(i){switch(i.label){case 0:return n="https://"+e+"/"+t.tenant+"/",[4,gt.createDiscoveredInstance(n,r,this.browserStorage,t.options)];case 1:return o=i.sent(),this.authModule.updateAuthority(o),[2]}}))}))},e.prototype.checkCcsCredentials=function(){var e=this.browserStorage.getTemporaryCache(st.CCS_CREDENTIAL,!0);if(e)try{return JSON.parse(e)}catch(t){this.authModule.logger.error("Cache credential could not be parsed"),this.authModule.logger.errorPii("Cache credential could not be parsed: "+e)}return null},e}(),$t=function(t){function n(e,r,n,o,i){var a=t.call(this,e,r,n,o)||this;return a.browserCrypto=i,a}return r(n,t),n.prototype.initiateAuthRequest=function(t,r){return o(this,void 0,void 0,(function(){var n;return i(this,(function(o){switch(o.label){case 0:return this.logger.verbose("RedirectHandler.initiateAuthRequest called"),ne.isEmpty(t)?[3,7]:(r.redirectStartPage&&(this.logger.verbose("RedirectHandler.initiateAuthRequest: redirectStartPage set, caching start page"),this.browserStorage.setTemporaryCache(st.ORIGIN_URI,r.redirectStartPage,!0)),this.browserStorage.setTemporaryCache(st.CORRELATION_ID,this.authCodeRequest.correlationId,!0),this.browserStorage.cacheCodeRequest(this.authCodeRequest,this.browserCrypto),this.logger.infoPii("RedirectHandler.initiateAuthRequest: Navigate to: "+t),n={apiId:e.ApiId.acquireTokenRedirect,timeout:r.redirectTimeout,noHistory:!1},"function"!=typeof r.onRedirectNavigate?[3,4]:(this.logger.verbose("RedirectHandler.initiateAuthRequest: Invoking onRedirectNavigate callback"),!1===r.onRedirectNavigate(t)?[3,2]:(this.logger.verbose("RedirectHandler.initiateAuthRequest: onRedirectNavigate did not return false, navigating"),[4,r.navigationClient.navigateExternal(t,n)])));case 1:case 5:return o.sent(),[2];case 2:return this.logger.verbose("RedirectHandler.initiateAuthRequest: onRedirectNavigate returned false, stopping navigation"),[2];case 3:return[3,6];case 4:return this.logger.verbose("RedirectHandler.initiateAuthRequest: Navigating window to navigate url"),[4,r.navigationClient.navigateExternal(t,n)];case 6:return[3,8];case 7:throw this.logger.info("RedirectHandler.initiateAuthRequest: Navigate url is empty"),Rt.createEmptyNavigationUriError();case 8:return[2]}}))}))},n.prototype.handleCodeResponseFromHash=function(e,t,r,n){return o(this,void 0,void 0,(function(){var o,a,s,c,u,l,d;return i(this,(function(i){switch(i.label){case 0:if(this.logger.verbose("RedirectHandler.handleCodeResponse called"),ne.isEmpty(e))throw Rt.createEmptyHashError(e);if(this.browserStorage.setInteractionInProgress(!1),o=this.browserStorage.generateStateKey(t),!(a=this.browserStorage.getTemporaryCache(o)))throw re.createStateNotFoundError("Cached State");try{s=this.authModule.handleFragmentResponse(e,a)}catch(e){throw e instanceof Ae&&e.subError===bt.userCancelledError.code?Rt.createUserCancelledError():e}return c=this.browserStorage.generateNonceKey(a),u=this.browserStorage.getTemporaryCache(c),this.authCodeRequest.code=s.code,s.cloud_instance_host_name?[4,this.updateTokenEndpointAuthority(s.cloud_instance_host_name,r,n)]:[3,2];case 1:i.sent(),i.label=2;case 2:return s.nonce=u||void 0,s.state=a,s.client_info?this.authCodeRequest.clientInfo=s.client_info:(l=this.checkCcsCredentials())&&(this.authCodeRequest.ccsCredential=l),[4,this.authModule.acquireToken(this.authCodeRequest,s)];case 3:return d=i.sent(),this.browserStorage.cleanRequestByState(t),[2,d]}}))}))},n}(Zt);e.EventType=void 0,(Ht=e.EventType||(e.EventType={})).INITIALIZE_START="msal:initializeStart",Ht.INITIALIZE_END="msal:initializeEnd",Ht.ACCOUNT_ADDED="msal:accountAdded",Ht.ACCOUNT_REMOVED="msal:accountRemoved",Ht.LOGIN_START="msal:loginStart",Ht.LOGIN_SUCCESS="msal:loginSuccess",Ht.LOGIN_FAILURE="msal:loginFailure",Ht.ACQUIRE_TOKEN_START="msal:acquireTokenStart",Ht.ACQUIRE_TOKEN_SUCCESS="msal:acquireTokenSuccess",Ht.ACQUIRE_TOKEN_FAILURE="msal:acquireTokenFailure",Ht.ACQUIRE_TOKEN_NETWORK_START="msal:acquireTokenFromNetworkStart",Ht.SSO_SILENT_START="msal:ssoSilentStart",Ht.SSO_SILENT_SUCCESS="msal:ssoSilentSuccess",Ht.SSO_SILENT_FAILURE="msal:ssoSilentFailure",Ht.ACQUIRE_TOKEN_BY_CODE_START="msal:acquireTokenByCodeStart",Ht.ACQUIRE_TOKEN_BY_CODE_SUCCESS="msal:acquireTokenByCodeSuccess",Ht.ACQUIRE_TOKEN_BY_CODE_FAILURE="msal:acquireTokenByCodeFailure",Ht.HANDLE_REDIRECT_START="msal:handleRedirectStart",Ht.HANDLE_REDIRECT_END="msal:handleRedirectEnd",Ht.POPUP_OPENED="msal:popupOpened",Ht.LOGOUT_START="msal:logoutStart",Ht.LOGOUT_SUCCESS="msal:logoutSuccess",Ht.LOGOUT_FAILURE="msal:logoutFailure",Ht.LOGOUT_END="msal:logoutEnd",function(e){e.USER_INTERACTION_REQUIRED="USER_INTERACTION_REQUIRED",e.USER_CANCEL="USER_CANCEL",e.NO_NETWORK="NO_NETWORK",e.TRANSIENT_ERROR="TRANSIENT_ERROR",e.PERSISTENT_ERROR="PERSISTENT_ERROR",e.DISABLED="DISABLED",e.ACCOUNT_UNAVAILABLE="ACCOUNT_UNAVAILABLE"}(Lt||(Lt={}));var er={code:"ContentError"},tr={code:"user_switch",desc:"User attempted to switch accounts in the native broker, which is not allowed. All new accounts must sign-in through the standard web flow first, please try again."},rr={code:"tokens_not_found_in_internal_memory_cache",desc:"Tokens not cached in MSAL JS internal memory, please make the WAM request"},nr=function(e){function t(r,n,o){var i=e.call(this,r,n)||this;return Object.setPrototypeOf(i,t.prototype),i.name="NativeAuthError",i.ext=o,i}return r(t,e),t.prototype.isFatal=function(){return!(!this.ext||!this.ext.status||this.ext.status!==Lt.PERSISTENT_ERROR&&this.ext.status!==Lt.DISABLED)||this.errorCode===er.code},t.createError=function(e,r,n){if(n&&n.status)switch(n.status){case Lt.ACCOUNT_UNAVAILABLE:return xe.createNativeAccountUnavailableError();case Lt.USER_INTERACTION_REQUIRED:return new xe(e,r);case Lt.USER_CANCEL:return Rt.createUserCancelledError();case Lt.NO_NETWORK:return Rt.createNoNetworkConnectivityError()}return new t(e,r,n)},t.createUserSwitchError=function(){return new t(tr.code,tr.desc)},t.createTokensNotFoundInCacheError=function(){return new t(rr.code,rr.desc)},t}($),or=function(t){function a(){return null!==t&&t.apply(this,arguments)||this}return r(a,t),a.prototype.acquireToken=function(t){return o(this,void 0,void 0,(function(){var r,n,o,a,s;return i(this,(function(i){switch(i.label){case 0:return r=this.performanceClient.startMeasurement(e.PerformanceEvents.SilentCacheClientAcquireToken,t.correlationId),n=this.initializeServerTelemetryManager(e.ApiId.acquireTokenSilent_silentFlow),[4,this.createSilentFlowClient(n,t.authority,t.azureCloudOptions)];case 1:o=i.sent(),this.logger.verbose("Silent auth client created"),i.label=2;case 2:return i.trys.push([2,4,,5]),[4,o.acquireCachedToken(t)];case 3:return a=i.sent(),r.endMeasurement({success:!0,fromCache:!0}),[2,a];case 4:throw(s=i.sent())instanceof Rt&&s.errorCode===bt.signingKeyNotFoundInStorage.code&&this.logger.verbose("Signing keypair for bound access token not found. Refreshing bound access token and generating a new crypto keypair."),r.endMeasurement({errorCode:s instanceof $&&s.errorCode||void 0,subErrorCode:s instanceof $&&s.subError||void 0,success:!1}),s;case 5:return[2]}}))}))},a.prototype.logout=function(){return Promise.reject(Rt.createSilentLogoutUnsupportedError())},a.prototype.createSilentFlowClient=function(e,t,r){return o(this,void 0,void 0,(function(){var n;return i(this,(function(o){switch(o.label){case 0:return[4,this.getClientConfiguration(e,t,r)];case 1:return n=o.sent(),[2,new Ze(n,this.performanceClient)]}}))}))},a.prototype.initializeSilentRequest=function(e,t){return o(this,void 0,void 0,(function(){var r;return i(this,(function(o){switch(o.label){case 0:return r=[n({},e)],[4,this.initializeBaseRequest(e)];case 1:return[2,n.apply(void 0,[n.apply(void 0,r.concat([o.sent()])),{account:t,forceRefresh:e.forceRefresh||!1}])]}}))}))},a}(Xt),ir=function(t){function a(e,r,n,o,i,a,s,c,u,l,d,h){var p=t.call(this,e,r,n,o,i,a,c,u,h)||this;return p.apiId=s,p.accountId=l,p.nativeMessageHandler=u,p.nativeStorageManager=d,p.silentCacheClient=new or(e,p.nativeStorageManager,n,o,i,a,c,u,h),p}return r(a,t),a.prototype.acquireToken=function(t){return o(this,void 0,void 0,(function(){var r,n,o,a,s,c,u;return i(this,(function(i){switch(i.label){case 0:return this.logger.trace("NativeInteractionClient - acquireToken called."),r=this.performanceClient.startMeasurement(e.PerformanceEvents.NativeInteractionClientAcquireToken,t.correlationId),n=Ue.nowSeconds(),[4,this.initializeNativeRequest(t)];case 1:o=i.sent(),i.label=2;case 2:return i.trys.push([2,4,,5]),[4,this.acquireTokensFromCache(this.accountId,o)];case 3:return a=i.sent(),r.endMeasurement({success:!0,isNativeBroker:!0,fromCache:!0}),[2,a];case 4:return i.sent(),this.logger.info("MSAL internal Cache does not contain tokens, proceed to make a native call"),[3,5];case 5:return s={method:ot.GetToken,request:o},[4,this.nativeMessageHandler.sendMessage(s)];case 6:return c=i.sent(),u=this.validateNativeResponse(c),[2,this.handleNativeResponse(u,o,n).then((function(e){return r.endMeasurement({success:!0,isNativeBroker:!0}),e})).catch((function(e){throw r.endMeasurement({success:!1,errorCode:e.errorCode,subErrorCode:e.subError,isNativeBroker:!0}),e}))]}}))}))},a.prototype.createSilentCacheRequest=function(e,t){return{authority:e.authority,correlationId:this.correlationId,scopes:de.fromString(e.scope).asArray(),account:t,forceRefresh:!1}},a.prototype.acquireTokensFromCache=function(e,t){return o(this,void 0,void 0,(function(){var r,n,o;return i(this,(function(i){switch(i.label){case 0:if(!(r=this.browserStorage.readAccountFromCacheWithNativeAccountId(e)))throw re.createNoAccountFoundError();n=r.getAccountInfo(),i.label=1;case 1:return i.trys.push([1,3,,4]),o=this.createSilentCacheRequest(t,n),[4,this.silentCacheClient.acquireToken(o)];case 2:return[2,i.sent()];case 3:throw i.sent();case 4:return[2]}}))}))},a.prototype.acquireTokenRedirect=function(t){return o(this,void 0,void 0,(function(){var r,n,o,a,s,c;return i(this,(function(i){switch(i.label){case 0:return this.logger.trace("NativeInteractionClient - acquireTokenRedirect called."),[4,this.initializeNativeRequest(t)];case 1:r=i.sent(),n={method:ot.GetToken,request:r},i.label=2;case 2:return i.trys.push([2,4,,5]),[4,this.nativeMessageHandler.sendMessage(n)];case 3:return o=i.sent(),this.validateNativeResponse(o),[3,5];case 4:if((a=i.sent())instanceof nr&&a.isFatal())throw a;return[3,5];case 5:return this.browserStorage.setTemporaryCache(st.NATIVE_REQUEST,JSON.stringify(r),!0),s={apiId:e.ApiId.acquireTokenRedirect,timeout:this.config.system.redirectNavigationTimeout,noHistory:!1},c=this.config.auth.navigateToLoginRequestUrl?window.location.href:this.getRedirectUri(t.redirectUri),[4,this.navigationClient.navigateExternal(c,s)];case 6:return i.sent(),[2]}}))}))},a.prototype.handleRedirectPromise=function(){return o(this,void 0,void 0,(function(){var e,t,r,n,o,a;return i(this,(function(i){switch(i.label){case 0:if(this.logger.trace("NativeInteractionClient - handleRedirectPromise called."),!this.browserStorage.isInteractionInProgress(!0))return this.logger.info("handleRedirectPromise called but there is no interaction in progress, returning null."),[2,null];if(!(e=this.browserStorage.getCachedNativeRequest()))return this.logger.verbose("NativeInteractionClient - handleRedirectPromise called but there is no cached request, returning null."),[2,null];this.browserStorage.removeItem(this.browserStorage.generateCacheKey(st.NATIVE_REQUEST)),t={method:ot.GetToken,request:e},r=Ue.nowSeconds(),i.label=1;case 1:return i.trys.push([1,3,,4]),this.logger.verbose("NativeInteractionClient - handleRedirectPromise sending message to native broker."),[4,this.nativeMessageHandler.sendMessage(t)];case 2:return n=i.sent(),this.validateNativeResponse(n),o=this.handleNativeResponse(n,e,r),this.browserStorage.setInteractionInProgress(!1),[2,o];case 3:throw a=i.sent(),this.browserStorage.setInteractionInProgress(!1),a;case 4:return[2]}}))}))},a.prototype.logout=function(){return this.logger.trace("NativeInteractionClient - logout called."),Promise.reject("Logout not implemented yet")},a.prototype.handleNativeResponse=function(t,r,n){return o(this,void 0,void 0,(function(){var o,a,s,c,u,l,d,h,p,g,f,m,v,y,C,_,T,w,I,S=this;return i(this,(function(i){switch(i.label){case 0:if(this.logger.trace("NativeInteractionClient - handleNativeResponse called."),t.account.id!==r.accountId)throw nr.createUserSwitchError();return o=new fe(t.id_token||E.EMPTY_STRING,this.browserCrypto),[4,this.getDiscoveredAuthority(r.authority)];case 1:return a=i.sent(),s=a.getPreferredCache(),c=ge.generateHomeAccountId(t.client_info||E.EMPTY_STRING,se.Default,this.logger,this.browserCrypto,o),u=ge.createAccount(t.client_info,c,o,void 0,void 0,void 0,s,t.account.id),this.browserStorage.setAccount(u),l=t.scope?de.fromString(t.scope):de.fromString(r.scope),d=t.account.properties||{},h=d.UID||o.claims.oid||o.claims.sub||E.EMPTY_STRING,p=d.TenantId||o.claims.tid||E.EMPTY_STRING,f=e.AuthenticationScheme.BEARER,r.tokenType===e.AuthenticationScheme.POP?[3,2]:[3,4];case 2:if(f=e.AuthenticationScheme.POP,t.shr)return this.logger.trace("handleNativeServerResponse: SHR is enabled in native layer"),g=t.shr,[3,5];if(m=new Ye(this.browserCrypto),v={resourceRequestMethod:r.resourceRequestMethod,resourceRequestUri:r.resourceRequestUri,shrClaims:r.shrClaims,shrNonce:r.shrNonce},!r.keyId)throw re.createKeyIdMissingError();return[4,m.signPopToken(t.access_token,r.keyId,v)];case 3:return g=i.sent(),[3,5];case 4:g=t.access_token,i.label=5;case 5:return y=this.getMATSFromResponse(t),C={authority:a.canonicalAuthority,uniqueId:h,tenantId:p,scopes:l.asArray(),account:u.getAccountInfo(),idToken:t.id_token,idTokenClaims:o.claims,accessToken:g,fromCache:!!y&&this.isResponseFromCache(y),expiresOn:new Date(1e3*Number(n+t.expires_in)),tokenType:f,correlationId:this.correlationId,state:t.state,fromNativeBroker:!0},_=Me.createIdTokenEntity(c,r.authority,t.id_token||E.EMPTY_STRING,r.clientId,o.claims.tid||E.EMPTY_STRING),this.nativeStorageManager.setIdTokenCredential(_),T=f===e.AuthenticationScheme.POP?E.SHR_NONCE_VALIDITY:("string"==typeof t.expires_in?parseInt(t.expires_in,10):t.expires_in)||0,w=n+T,I=qe.createAccessTokenEntity(c,r.authority,g,r.clientId,p,l.printScopes(),w,0,this.browserCrypto),this.nativeStorageManager.setAccessTokenCredential(I),this.browserStorage.removeAccountContext(u).catch((function(e){S.logger.error("Error occurred while removing account context from browser storage. "+e)})),[2,C]}}))}))},a.prototype.validateNativeResponse=function(e){if(e.hasOwnProperty("access_token")&&e.hasOwnProperty("id_token")&&e.hasOwnProperty("client_info")&&e.hasOwnProperty("account")&&e.hasOwnProperty("scope")&&e.hasOwnProperty("expires_in"))return e;throw nr.createUnexpectedError("Response missing expected properties.")},a.prototype.getMATSFromResponse=function(e){if(e.properties.MATS)try{return JSON.parse(e.properties.MATS)}catch(e){this.logger.error("NativeInteractionClient - Error parsing MATS telemetry, returning null instead")}return null},a.prototype.isResponseFromCache=function(e){return void 0===e.is_cached?(this.logger.verbose("NativeInteractionClient - MATS telemetry does not contain field indicating if response was served from cache. Returning false."),!1):!!e.is_cached},a.prototype.initializeNativeRequest=function(t){return o(this,void 0,void 0,(function(){var r,o,a,s,c,u,l,d,h,p=this;return i(this,(function(i){switch(i.label){case 0:return this.logger.trace("NativeInteractionClient - initializeNativeRequest called"),r=t.authority||this.config.auth.authority,(o=new Ge(r)).validateAsUri(),a=t.scopes,s=function(e,t){var r={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)t.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(r[n[o]]=e[n[o]])}return r}(t,["scopes"]),(c=new de(a||[])).appendScopes(C),u=function(){switch(p.apiId){case e.ApiId.ssoSilent:case e.ApiId.acquireTokenSilent_silentFlow:return p.logger.trace("initializeNativeRequest: silent request sets prompt to none"),w.NONE}if(t.prompt)switch(t.prompt){case w.NONE:case w.CONSENT:case w.LOGIN:return p.logger.trace("initializeNativeRequest: prompt is compatible with native flow"),t.prompt;default:throw p.logger.trace("initializeNativeRequest: prompt = "+t.prompt+" is not compatible with native flow"),Rt.createNativePromptParameterNotSupportedError()}else p.logger.trace("initializeNativeRequest: prompt was not provided")},l=n(n({},s),{accountId:this.accountId,clientId:this.config.auth.clientId,authority:o.urlString,scope:c.printScopes(),redirectUri:this.getRedirectUri(t.redirectUri),prompt:u(),correlationId:this.correlationId,tokenType:t.authenticationScheme,windowTitleSubstring:document.title,extraParameters:n(n(n({},t.extraQueryParameters),t.tokenQueryParameters),{telemetry:Ot}),extendedExpiryToken:!1}),t.authenticationScheme!==e.AuthenticationScheme.POP?[3,2]:(d={resourceRequestUri:t.resourceRequestUri,resourceRequestMethod:t.resourceRequestMethod,shrClaims:t.shrClaims,shrNonce:t.shrNonce},[4,new Ye(this.browserCrypto).generateCnf(d)]);case 1:h=i.sent(),l.reqCnf=h.reqCnfHash,l.keyId=h.kid,i.label=2;case 2:return[2,l]}}))}))},a}(Qt),ar=function(){function t(e,t,r){this.logger=e,this.handshakeTimeoutMs=t,this.extensionId=r,this.resolvers=new Map,this.handshakeResolvers=new Map,this.responseId=0,this.messageChannel=new MessageChannel,this.windowListener=this.onWindowMessage.bind(this)}return t.prototype.sendMessage=function(e){return o(this,void 0,void 0,(function(){var t,r=this;return i(this,(function(n){return this.logger.trace("NativeMessageHandler - sendMessage called."),t={channel:Nt,extensionId:this.extensionId,responseId:this.responseId++,body:e},this.logger.trace("NativeMessageHandler - Sending request to browser extension"),this.logger.tracePii("NativeMessageHandler - Sending request to browser extension: "+JSON.stringify(t)),this.messageChannel.port1.postMessage(t),[2,new Promise((function(e,n){r.resolvers.set(t.responseId,{resolve:e,reject:n})}))]}))}))},t.createProvider=function(e,r){return o(this,void 0,void 0,(function(){var n,o;return i(this,(function(i){switch(i.label){case 0:e.trace("NativeMessageHandler - createProvider called."),i.label=1;case 1:return i.trys.push([1,3,,5]),[4,(n=new t(e,r,Pt)).sendHandshakeRequest()];case 2:return i.sent(),[2,n];case 3:return i.sent(),[4,(o=new t(e,r)).sendHandshakeRequest()];case 4:return i.sent(),[2,o];case 5:return[2]}}))}))},t.prototype.sendHandshakeRequest=function(){return o(this,void 0,void 0,(function(){var e,t=this;return i(this,(function(r){return this.logger.trace("NativeMessageHandler - sendHandshakeRequest called."),window.addEventListener("message",this.windowListener,!1),e={channel:Nt,extensionId:this.extensionId,responseId:this.responseId++,body:{method:ot.HandshakeRequest}},this.messageChannel.port1.onmessage=function(e){t.onChannelMessage(e)},window.postMessage(e,window.origin,[this.messageChannel.port2]),[2,new Promise((function(r,n){t.handshakeResolvers.set(e.responseId,{resolve:r,reject:n}),t.timeoutId=window.setTimeout((function(){window.removeEventListener("message",t.windowListener,!1),t.messageChannel.port1.close(),t.messageChannel.port2.close(),n(Rt.createNativeHandshakeTimeoutError()),t.handshakeResolvers.delete(e.responseId)}),t.handshakeTimeoutMs)}))]}))}))},t.prototype.onWindowMessage=function(e){if(this.logger.trace("NativeMessageHandler - onWindowMessage called"),e.source===window){var t=e.data;if(t.channel&&t.channel===Nt&&(!t.extensionId||t.extensionId===this.extensionId)&&t.body.method===ot.HandshakeRequest){this.logger.verbose(t.extensionId?"Extension with id: "+t.extensionId+" not installed":"No extension installed"),clearTimeout(this.timeoutId),this.messageChannel.port1.close(),this.messageChannel.port2.close(),window.removeEventListener("message",this.windowListener,!1);var r=this.handshakeResolvers.get(t.responseId);r&&r.reject(Rt.createNativeExtensionNotInstalledError())}}},t.prototype.onChannelMessage=function(e){this.logger.trace("NativeMessageHandler - onChannelMessage called.");var t=e.data,r=this.resolvers.get(t.responseId),n=this.handshakeResolvers.get(t.responseId);try{var o=t.body.method;if(o===ot.Response){if(!r)return;var i=t.body.response;if(this.logger.trace("NativeMessageHandler - Received response from browser extension"),this.logger.tracePii("NativeMessageHandler - Received response from browser extension: "+JSON.stringify(i)),"Success"!==i.status)r.reject(nr.createError(i.code,i.description,i.ext));else{if(!i.result)throw $.createUnexpectedError("Event does not contain result.");i.result.code&&i.result.description?r.reject(nr.createError(i.result.code,i.result.description,i.result.ext)):r.resolve(i.result)}this.resolvers.delete(t.responseId)}else if(o===ot.HandshakeResponse){if(!n)return;clearTimeout(this.timeoutId),window.removeEventListener("message",this.windowListener,!1),this.extensionId=t.extensionId,this.logger.verbose("NativeMessageHandler - Received HandshakeResponse from extension: "+this.extensionId),n.resolve(),this.handshakeResolvers.delete(t.responseId)}}catch(t){this.logger.error("Error parsing response from WAM Extension"),this.logger.errorPii("Error parsing response from WAM Extension: "+t.toString()),this.logger.errorPii("Unable to parse "+e),r?r.reject(t):n&&n.reject(t)}},t.isNativeAvailable=function(t,r,n,o){if(r.trace("isNativeAvailable called"),!t.system.allowNativeBroker)return r.trace("isNativeAvailable: allowNativeBroker is not enabled, returning false"),!1;if(!n)return r.trace("isNativeAvailable: WAM extension provider is not initialized, returning false"),!1;if(o)switch(o){case e.AuthenticationScheme.BEARER:case e.AuthenticationScheme.POP:return r.trace("isNativeAvailable: authenticationScheme is supported, returning true"),!0;default:return r.trace("isNativeAvailable: authenticationScheme is not supported, returning false"),!1}return!0},t}(),sr=function(t){function a(e,r,n,o,i,a,s,c,u,l){var d=t.call(this,e,r,n,o,i,a,s,u,l)||this;return d.nativeStorage=c,d}return r(a,t),a.prototype.acquireToken=function(t){return o(this,void 0,void 0,(function(){var r,o,a,s,c,u,l,d,h,p=this;return i(this,(function(i){switch(i.label){case 0:return[4,this.initializeAuthorizationRequest(t,e.InteractionType.Redirect)];case 1:r=i.sent(),this.browserStorage.updateCacheEntries(r.state,r.nonce,r.authority,r.loginHint||E.EMPTY_STRING,r.account||null),o=this.initializeServerTelemetryManager(e.ApiId.acquireTokenRedirect),a=function(e){e.persisted&&(p.logger.verbose("Page was restored from back/forward cache. Clearing temporary cache."),p.browserStorage.cleanRequestByState(r.state))},i.label=2;case 2:return i.trys.push([2,7,,8]),[4,this.initializeAuthorizationCodeRequest(r)];case 3:return s=i.sent(),[4,this.createAuthCodeClient(o,r.authority,r.azureCloudOptions)];case 4:return c=i.sent(),this.logger.verbose("Auth code client created"),u=new $t(c,this.browserStorage,s,this.logger,this.browserCrypto),[4,c.getAuthCodeUrl(n(n({},r),{nativeBroker:ar.isNativeAvailable(this.config,this.logger,this.nativeMessageHandler,t.authenticationScheme)}))];case 5:return l=i.sent(),d=this.getRedirectStartPage(t.redirectStartPage),this.logger.verbosePii("Redirect start page: "+d),window.addEventListener("pageshow",a),[4,u.initiateAuthRequest(l,{navigationClient:this.navigationClient,redirectTimeout:this.config.system.redirectNavigationTimeout,redirectStartPage:d,onRedirectNavigate:t.onRedirectNavigate})];case 6:return[2,i.sent()];case 7:throw(h=i.sent())instanceof $&&h.setCorrelationId(this.correlationId),window.removeEventListener("pageshow",a),o.cacheFailedRequest(h),this.browserStorage.cleanRequestByState(r.state),h;case 8:return[2]}}))}))},a.prototype.handleRedirectPromise=function(t){return o(this,void 0,void 0,(function(){var r,n,o,a,s,c,u,l,d,h,p,g;return i(this,(function(i){switch(i.label){case 0:r=this.initializeServerTelemetryManager(e.ApiId.handleRedirectPromise),i.label=1;case 1:if(i.trys.push([1,10,,11]),!this.browserStorage.isInteractionInProgress(!0))return this.logger.info("handleRedirectPromise called but there is no interaction in progress, returning null."),[2,null];if(!(n=this.getRedirectResponseHash(t||window.location.hash)))return this.logger.info("handleRedirectPromise did not detect a response hash as a result of a redirect. Cleaning temporary cache."),this.browserStorage.cleanRequestByInteractionType(e.InteractionType.Redirect),[2,null];o=void 0;try{a=Ge.getDeserializedHash(n),o=this.validateAndExtractStateFromHash(a,e.InteractionType.Redirect),this.logger.verbose("State extracted from hash")}catch(t){return this.logger.info("handleRedirectPromise was unable to extract state due to: "+t),this.browserStorage.cleanRequestByInteractionType(e.InteractionType.Redirect),[2,null]}return s=this.browserStorage.getTemporaryCache(st.ORIGIN_URI,!0)||E.EMPTY_STRING,c=Ge.removeHashFromUrl(s),u=Ge.removeHashFromUrl(window.location.href),c===u&&this.config.auth.navigateToLoginRequestUrl?(this.logger.verbose("Current page is loginRequestUrl, handling hash"),[4,this.handleHash(n,o,r)]):[3,3];case 2:return l=i.sent(),s.indexOf("#")>-1&&Jt.replaceHash(s),[2,l];case 3:return this.config.auth.navigateToLoginRequestUrl?[3,4]:(this.logger.verbose("NavigateToLoginRequestUrl set to false, handling hash"),[2,this.handleHash(n,o,r)]);case 4:return Jt.isInIframe()&&!this.config.system.allowRedirectInIframe?[3,9]:(this.browserStorage.setTemporaryCache(st.URL_HASH,n,!0),d={apiId:e.ApiId.handleRedirectPromise,timeout:this.config.system.redirectNavigationTimeout,noHistory:!0},h=!0,s&&"null"!==s?[3,6]:(p=Jt.getHomepage(),this.browserStorage.setTemporaryCache(st.ORIGIN_URI,p,!0),this.logger.warning("Unable to get valid login request url from cache, redirecting to home page"),[4,this.navigationClient.navigateInternal(p,d)]));case 5:return h=i.sent(),[3,8];case 6:return this.logger.verbose("Navigating to loginRequestUrl: "+s),[4,this.navigationClient.navigateInternal(s,d)];case 7:h=i.sent(),i.label=8;case 8:if(!h)return[2,this.handleHash(n,o,r)];i.label=9;case 9:return[2,null];case 10:throw(g=i.sent())instanceof $&&g.setCorrelationId(this.correlationId),r.cacheFailedRequest(g),this.browserStorage.cleanRequestByInteractionType(e.InteractionType.Redirect),g;case 11:return[2]}}))}))},a.prototype.getRedirectResponseHash=function(e){if(this.logger.verbose("getRedirectResponseHash called"),Ge.hashContainsKnownProperties(e))return Jt.clearHash(window),this.logger.verbose("Hash contains known properties, returning response hash"),e;var t=this.browserStorage.getTemporaryCache(st.URL_HASH,!0);return this.browserStorage.removeItem(this.browserStorage.generateCacheKey(st.URL_HASH)),this.logger.verbose("Hash does not contain known properties, returning cached hash"),t},a.prototype.handleHash=function(t,r,a){return o(this,void 0,void 0,(function(){var o,s,c,u,l,d,h=this;return i(this,(function(i){switch(i.label){case 0:if(o=this.browserStorage.getCachedRequest(r,this.browserCrypto),this.logger.verbose("handleHash called, retrieved cached request"),(s=Ge.getDeserializedHash(t)).accountId){if(this.logger.verbose("Account id found in hash, calling WAM for token"),!this.nativeMessageHandler)throw Rt.createNativeConnectionNotEstablishedError();return c=new ir(this.config,this.browserStorage,this.browserCrypto,this.logger,this.eventHandler,this.navigationClient,e.ApiId.acquireTokenPopup,this.performanceClient,this.nativeMessageHandler,s.accountId,this.browserStorage,o.correlationId),u=Be.parseRequestState(this.browserCrypto,r).userRequestState,[2,c.acquireToken(n(n({},o),{state:u,prompt:void 0})).finally((function(){h.browserStorage.cleanRequestByState(r)}))]}if(!(l=this.browserStorage.getCachedAuthority(r)))throw Rt.createNoCachedAuthorityError();return[4,this.createAuthCodeClient(a,l)];case 1:return d=i.sent(),this.logger.verbose("Auth code client created"),be.removeThrottle(this.browserStorage,this.config.auth.clientId,o),[4,new $t(d,this.browserStorage,o,this.logger,this.browserCrypto).handleCodeResponseFromHash(t,r,d.authority,this.networkClient)];case 2:return[2,i.sent()]}}))}))},a.prototype.logout=function(t){return o(this,void 0,void 0,(function(){var r,n,o,a,s,c;return i(this,(function(i){switch(i.label){case 0:this.logger.verbose("logoutRedirect called"),r=this.initializeLogoutRequest(t),n=this.initializeServerTelemetryManager(e.ApiId.logout),i.label=1;case 1:return i.trys.push([1,10,,11]),this.eventHandler.emitEvent(e.EventType.LOGOUT_START,e.InteractionType.Redirect,t),[4,this.clearCacheOnLogout(r.account)];case 2:return i.sent(),o={apiId:e.ApiId.logout,timeout:this.config.system.redirectNavigationTimeout,noHistory:!1},[4,this.createAuthCodeClient(n,t&&t.authority)];case 3:return a=i.sent(),this.logger.verbose("Auth code client created"),s=a.getLogoutUri(r),this.eventHandler.emitEvent(e.EventType.LOGOUT_SUCCESS,e.InteractionType.Redirect,r),t&&"function"==typeof t.onRedirectNavigate?!1===t.onRedirectNavigate(s)?[3,5]:(this.logger.verbose("Logout onRedirectNavigate did not return false, navigating"),this.browserStorage.getInteractionInProgress()||this.browserStorage.setInteractionInProgress(!0),[4,this.navigationClient.navigateExternal(s,o)]):[3,7];case 4:return i.sent(),[2];case 5:this.browserStorage.setInteractionInProgress(!1),this.logger.verbose("Logout onRedirectNavigate returned false, stopping navigation"),i.label=6;case 6:return[3,9];case 7:return this.browserStorage.getInteractionInProgress()||this.browserStorage.setInteractionInProgress(!0),[4,this.navigationClient.navigateExternal(s,o)];case 8:return i.sent(),[2];case 9:return[3,11];case 10:throw(c=i.sent())instanceof $&&c.setCorrelationId(this.correlationId),n.cacheFailedRequest(c),this.eventHandler.emitEvent(e.EventType.LOGOUT_FAILURE,e.InteractionType.Redirect,null,c),this.eventHandler.emitEvent(e.EventType.LOGOUT_END,e.InteractionType.Redirect),c;case 11:return this.eventHandler.emitEvent(e.EventType.LOGOUT_END,e.InteractionType.Redirect),[2]}}))}))},a.prototype.getRedirectStartPage=function(e){var t=e||window.location.href;return Ge.getAbsoluteUrl(t,Jt.getCurrentUri())},a}(Xt),cr=function(t){function a(e,r,n,o,i,a,s,c,u,l){var d=t.call(this,e,r,n,o,i,a,s,u,l)||this;return d.unloadWindow=d.unloadWindow.bind(d),d.nativeStorage=c,d}return r(a,t),a.prototype.acquireToken=function(e){try{var t=this.generatePopupName(e.scopes||C,e.authority||this.config.auth.authority),r=e.popupWindowAttributes||{};if(this.config.system.asyncPopups)return this.logger.verbose("asyncPopups set to true, acquiring token"),this.acquireTokenPopupAsync(e,t,r);this.logger.verbose("asyncPopup set to false, opening popup before acquiring token");var n=this.openSizedPopup("about:blank",t,r);return this.acquireTokenPopupAsync(e,t,r,n)}catch(e){return Promise.reject(e)}},a.prototype.logout=function(e){try{this.logger.verbose("logoutPopup called");var t=this.initializeLogoutRequest(e),r=this.generateLogoutPopupName(t),n=e&&e.authority,o=e&&e.mainWindowRedirectUri,i=(null==e?void 0:e.popupWindowAttributes)||{};if(this.config.system.asyncPopups)return this.logger.verbose("asyncPopups set to true"),this.logoutPopupAsync(t,r,i,n,void 0,o);this.logger.verbose("asyncPopup set to false, opening popup");var a=this.openSizedPopup("about:blank",r,i);return this.logoutPopupAsync(t,r,i,n,a,o)}catch(e){return Promise.reject(e)}},a.prototype.acquireTokenPopupAsync=function(t,r,a,s){return o(this,void 0,void 0,(function(){var o,c,u,l,d,h,p,g,f,m,v,y,C,_,T,w,I=this;return i(this,(function(i){switch(i.label){case 0:return this.logger.verbose("acquireTokenPopupAsync called"),o=this.initializeServerTelemetryManager(e.ApiId.acquireTokenPopup),[4,this.initializeAuthorizationRequest(t,e.InteractionType.Popup)];case 1:c=i.sent(),this.browserStorage.updateCacheEntries(c.state,c.nonce,c.authority,c.loginHint||E.EMPTY_STRING,c.account||null),i.label=2;case 2:return i.trys.push([2,8,,9]),[4,this.initializeAuthorizationCodeRequest(c)];case 3:return u=i.sent(),[4,this.createAuthCodeClient(o,c.authority,c.azureCloudOptions)];case 4:return l=i.sent(),this.logger.verbose("Auth code client created"),d=ar.isNativeAvailable(this.config,this.logger,this.nativeMessageHandler,t.authenticationScheme),h=void 0,d&&(h=this.performanceClient.startMeasurement(e.PerformanceEvents.FetchAccountIdWithNativeBroker,t.correlationId)),[4,l.getAuthCodeUrl(n(n({},c),{nativeBroker:d}))];case 5:return p=i.sent(),g=new Zt(l,this.browserStorage,u,this.logger),f={popup:s,popupName:r,popupWindowAttributes:a},m=this.initiateAuthRequest(p,f),this.eventHandler.emitEvent(e.EventType.POPUP_OPENED,e.InteractionType.Popup,{popupWindow:m},null),[4,this.monitorPopupForHash(m)];case 6:if(v=i.sent(),y=Ge.getDeserializedHash(v),C=this.validateAndExtractStateFromHash(y,e.InteractionType.Popup,c.correlationId),be.removeThrottle(this.browserStorage,this.config.auth.clientId,u),y.accountId){if(this.logger.verbose("Account id found in hash, calling WAM for token"),h&&h.endMeasurement({success:!0,isNativeBroker:!0}),!this.nativeMessageHandler)throw Rt.createNativeConnectionNotEstablishedError();return _=new ir(this.config,this.browserStorage,this.browserCrypto,this.logger,this.eventHandler,this.navigationClient,e.ApiId.acquireTokenPopup,this.performanceClient,this.nativeMessageHandler,y.accountId,this.nativeStorage,c.correlationId),T=Be.parseRequestState(this.browserCrypto,C).userRequestState,[2,_.acquireToken(n(n({},c),{state:T,prompt:void 0})).finally((function(){I.browserStorage.cleanRequestByState(C)}))]}return[4,g.handleCodeResponseFromHash(v,C,l.authority,this.networkClient)];case 7:return[2,i.sent()];case 8:throw w=i.sent(),s&&s.close(),w instanceof $&&w.setCorrelationId(this.correlationId),o.cacheFailedRequest(w),this.browserStorage.cleanRequestByState(c.state),w;case 9:return[2]}}))}))},a.prototype.logoutPopupAsync=function(t,r,n,a,s,c){return o(this,void 0,void 0,(function(){var o,u,l,d,h,p,g;return i(this,(function(i){switch(i.label){case 0:this.logger.verbose("logoutPopupAsync called"),this.eventHandler.emitEvent(e.EventType.LOGOUT_START,e.InteractionType.Popup,t),o=this.initializeServerTelemetryManager(e.ApiId.logoutPopup),i.label=1;case 1:return i.trys.push([1,5,,6]),[4,this.clearCacheOnLogout(t.account)];case 2:return i.sent(),[4,this.createAuthCodeClient(o,a)];case 3:return u=i.sent(),this.logger.verbose("Auth code client created"),l=u.getLogoutUri(t),this.eventHandler.emitEvent(e.EventType.LOGOUT_SUCCESS,e.InteractionType.Popup,t),d=this.openPopup(l,{popupName:r,popupWindowAttributes:n,popup:s}),this.eventHandler.emitEvent(e.EventType.POPUP_OPENED,e.InteractionType.Popup,{popupWindow:d},null),[4,this.waitForLogoutPopup(d)];case 4:return i.sent(),c?(h={apiId:e.ApiId.logoutPopup,timeout:this.config.system.redirectNavigationTimeout,noHistory:!1},p=Ge.getAbsoluteUrl(c,Jt.getCurrentUri()),this.logger.verbose("Redirecting main window to url specified in the request"),this.logger.verbosePii("Redirecting main window to: "+p),this.navigationClient.navigateInternal(p,h)):this.logger.verbose("No main window navigation requested"),[3,6];case 5:throw g=i.sent(),s&&s.close(),g instanceof $&&g.setCorrelationId(this.correlationId),this.browserStorage.setInteractionInProgress(!1),this.eventHandler.emitEvent(e.EventType.LOGOUT_FAILURE,e.InteractionType.Popup,null,g),this.eventHandler.emitEvent(e.EventType.LOGOUT_END,e.InteractionType.Popup),o.cacheFailedRequest(g),g;case 6:return this.eventHandler.emitEvent(e.EventType.LOGOUT_END,e.InteractionType.Popup),[2]}}))}))},a.prototype.initiateAuthRequest=function(e,t){if(ne.isEmpty(e))throw this.logger.error("Navigate url is empty"),Rt.createEmptyNavigationUriError();return this.logger.infoPii("Navigate to: "+e),this.openPopup(e,t)},a.prototype.monitorPopupForHash=function(e){var t=this;return new Promise((function(r,n){var o=t.config.system.windowHashTimeout/kt.POLL_INTERVAL_MS,i=0;t.logger.verbose("PopupHandler.monitorPopupForHash - polling started");var a=setInterval((function(){if(e.closed)return t.logger.error("PopupHandler.monitorPopupForHash - window closed"),t.cleanPopup(),clearInterval(a),void n(Rt.createUserCancelledError());var s=E.EMPTY_STRING,c=E.EMPTY_STRING;try{s=e.location.href,c=e.location.hash}catch(e){}ne.isEmpty(s)||"about:blank"===s||(t.logger.verbose("PopupHandler.monitorPopupForHash - popup window is on same origin as caller"),i++,c?(t.logger.verbose("PopupHandler.monitorPopupForHash - found hash in url"),clearInterval(a),t.cleanPopup(e),Ge.hashContainsKnownProperties(c)?(t.logger.verbose("PopupHandler.monitorPopupForHash - hash contains known properties, returning."),r(c)):(t.logger.error("PopupHandler.monitorPopupForHash - found hash in url but it does not contain known properties. Check that your router is not changing the hash prematurely."),t.logger.errorPii("PopupHandler.monitorPopupForHash - hash found: "+c),n(Rt.createHashDoesNotContainKnownPropertiesError()))):i>o&&(t.logger.error("PopupHandler.monitorPopupForHash - unable to find hash in url, timing out"),clearInterval(a),n(Rt.createMonitorPopupTimeoutError())))}),kt.POLL_INTERVAL_MS)}))},a.prototype.waitForLogoutPopup=function(e){var t=this;return new Promise((function(r){t.logger.verbose("PopupHandler.waitForLogoutPopup - polling started");var n=setInterval((function(){e.closed&&(t.logger.error("PopupHandler.waitForLogoutPopup - window closed"),t.cleanPopup(),clearInterval(n),r());var o=E.EMPTY_STRING;try{o=e.location.href}catch(e){}ne.isEmpty(o)||"about:blank"===o||(t.logger.verbose("PopupHandler.waitForLogoutPopup - popup window is on same origin as caller, closing."),clearInterval(n),t.cleanPopup(e),r())}),kt.POLL_INTERVAL_MS)}))},a.prototype.openPopup=function(e,t){try{var r=void 0;if(t.popup?(r=t.popup,this.logger.verbosePii("Navigating popup window to: "+e),r.location.assign(e)):void 0===t.popup&&(this.logger.verbosePii("Opening popup window to: "+e),r=this.openSizedPopup(e,t.popupName,t.popupWindowAttributes)),!r)throw Rt.createEmptyWindowCreatedError();return r.focus&&r.focus(),this.currentWindow=r,window.addEventListener("beforeunload",this.unloadWindow),r}catch(e){throw this.logger.error("error opening popup "+e.message),this.browserStorage.setInteractionInProgress(!1),Rt.createPopupWindowError(e.toString())}},a.prototype.openSizedPopup=function(e,t,r){var n,o,i,a,s=window.screenLeft?window.screenLeft:window.screenX,c=window.screenTop?window.screenTop:window.screenY,u=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,l=window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight,d=null===(n=r.popupSize)||void 0===n?void 0:n.width,h=null===(o=r.popupSize)||void 0===o?void 0:o.height,p=null===(i=r.popupPosition)||void 0===i?void 0:i.top,g=null===(a=r.popupPosition)||void 0===a?void 0:a.left;return(!d||d<0||d>u)&&(this.logger.verbose("Default popup window width used. Window width not configured or invalid."),d=kt.POPUP_WIDTH),(!h||h<0||h>l)&&(this.logger.verbose("Default popup window height used. Window height not configured or invalid."),h=kt.POPUP_HEIGHT),(!p||p<0||p>l)&&(this.logger.verbose("Default popup window top position used. Window top not configured or invalid."),p=Math.max(0,l/2-kt.POPUP_HEIGHT/2+c)),(!g||g<0||g>u)&&(this.logger.verbose("Default popup window left position used. Window left not configured or invalid."),g=Math.max(0,u/2-kt.POPUP_WIDTH/2+s)),window.open(e,t,"width="+d+", height="+h+", top="+p+", left="+g+", scrollbars=yes")},a.prototype.unloadWindow=function(t){this.browserStorage.cleanRequestByInteractionType(e.InteractionType.Popup),this.currentWindow&&this.currentWindow.close(),t.preventDefault()},a.prototype.cleanPopup=function(e){e&&e.close(),window.removeEventListener("beforeunload",this.unloadWindow),this.browserStorage.setInteractionInProgress(!1)},a.prototype.generatePopupName=function(e,t){return kt.POPUP_NAME_PREFIX+"."+this.config.auth.clientId+"."+e.join("-")+"."+t+"."+this.correlationId},a.prototype.generateLogoutPopupName=function(e){var t=e.account&&e.account.homeAccountId;return kt.POPUP_NAME_PREFIX+"."+this.config.auth.clientId+"."+t+"."+this.correlationId},a}(Xt),ur=function(){function e(){}return e.prototype.navigateInternal=function(t,r){return e.defaultNavigateWindow(t,r)},e.prototype.navigateExternal=function(t,r){return e.defaultNavigateWindow(t,r)},e.defaultNavigateWindow=function(e,t){return t.noHistory?window.location.replace(e):window.location.assign(e),new Promise((function(e){setTimeout((function(){e(!0)}),t.timeout)}))},e}(),lr=6e3;var dr,hr=function(e){function t(t,r,n,o,i){var a=e.call(this,t,r,n,o)||this;return a.navigateFrameWait=i,a}return r(t,e),t.prototype.initiateAuthRequest=function(e){return o(this,void 0,void 0,(function(){var t;return i(this,(function(r){switch(r.label){case 0:if(ne.isEmpty(e))throw this.logger.info("Navigate url is empty"),Rt.createEmptyNavigationUriError();return this.navigateFrameWait?[4,this.loadFrame(e)]:[3,2];case 1:return t=r.sent(),[3,3];case 2:t=this.loadFrameSync(e),r.label=3;case 3:return[2,t]}}))}))},t.prototype.monitorIframeForHash=function(e,t){var r=this;return new Promise((function(n,o){t<lr&&r.logger.warning("system.loadFrameTimeout or system.iframeHashTimeout set to lower ("+t+"ms) than the default ("+"6000ms). This may result in timeouts.");var i=window.performance.now()+t,a=setInterval((function(){if(window.performance.now()>i)return r.removeHiddenIframe(e),clearInterval(a),void o(Rt.createMonitorIframeTimeoutError());var t=E.EMPTY_STRING,s=e.contentWindow;try{t=s?s.location.href:E.EMPTY_STRING}catch(e){}if(!ne.isEmpty(t)){var c=s?s.location.hash:E.EMPTY_STRING;return Ge.hashContainsKnownProperties(c)?(r.removeHiddenIframe(e),clearInterval(a),void n(c)):void 0}}),kt.POLL_INTERVAL_MS)}))},t.prototype.loadFrame=function(e){var t=this;return new Promise((function(r,n){var o=t.createHiddenIframe();setTimeout((function(){o?(o.src=e,r(o)):n("Unable to load iframe")}),t.navigateFrameWait)}))},t.prototype.loadFrameSync=function(e){var t=this.createHiddenIframe();return t.src=e,t},t.prototype.createHiddenIframe=function(){var e=document.createElement("iframe");return e.style.visibility="hidden",e.style.position="absolute",e.style.width=e.style.height="0",e.style.border="0",e.setAttribute("sandbox","allow-scripts allow-same-origin allow-forms"),document.getElementsByTagName("body")[0].appendChild(e),e},t.prototype.removeHiddenIframe=function(e){document.body===e.parentNode&&document.body.removeChild(e)},t}(Zt),pr=function(t){function a(e,r,n,o,i,a,s,c,u,l,d){var h=t.call(this,e,r,n,o,i,a,c,l,d)||this;return h.apiId=s,h.nativeStorage=u,h}return r(a,t),a.prototype.acquireToken=function(t){return o(this,void 0,void 0,(function(){var r,o,a,s,c;return i(this,(function(i){switch(i.label){case 0:if(this.logger.verbose("acquireTokenByIframe called"),r=this.performanceClient.startMeasurement(e.PerformanceEvents.SilentIframeClientAcquireToken,t.correlationId),ne.isEmpty(t.loginHint)&&ne.isEmpty(t.sid)&&(!t.account||ne.isEmpty(t.account.username))&&this.logger.warning("No user hint provided. The authorization server may need more information to complete this request."),t.prompt&&t.prompt!==w.NONE)throw r.endMeasurement({success:!1}),Rt.createSilentPromptValueError(t.prompt);return[4,this.initializeAuthorizationRequest(n(n({},t),{prompt:w.NONE}),e.InteractionType.Silent)];case 1:o=i.sent(),this.browserStorage.updateCacheEntries(o.state,o.nonce,o.authority,o.loginHint||E.EMPTY_STRING,o.account||null),a=this.initializeServerTelemetryManager(this.apiId),i.label=2;case 2:return i.trys.push([2,5,,6]),[4,this.createAuthCodeClient(a,o.authority,o.azureCloudOptions)];case 3:return s=i.sent(),this.logger.verbose("Auth code client created"),[4,this.silentTokenHelper(s,o).then((function(e){return r.endMeasurement({success:!0,fromCache:!1}),e}))];case 4:return[2,i.sent()];case 5:throw(c=i.sent())instanceof $&&c.setCorrelationId(this.correlationId),a.cacheFailedRequest(c),this.browserStorage.cleanRequestByState(o.state),r.endMeasurement({errorCode:c instanceof $&&c.errorCode||void 0,subErrorCode:c instanceof $&&c.subError||void 0,success:!1}),c;case 6:return[2]}}))}))},a.prototype.logout=function(){return Promise.reject(Rt.createSilentLogoutUnsupportedError())},a.prototype.silentTokenHelper=function(t,r){return o(this,void 0,void 0,(function(){var o,a,s,c,u,l,d,h,p,g=this;return i(this,(function(i){switch(i.label){case 0:return[4,this.initializeAuthorizationCodeRequest(r)];case 1:return o=i.sent(),[4,t.getAuthCodeUrl(n(n({},r),{nativeBroker:ar.isNativeAvailable(this.config,this.logger,this.nativeMessageHandler,r.authenticationScheme)}))];case 2:return a=i.sent(),[4,(s=new hr(t,this.browserStorage,o,this.logger,this.config.system.navigateFrameWait)).initiateAuthRequest(a)];case 3:return c=i.sent(),[4,s.monitorIframeForHash(c,this.config.system.iframeHashTimeout)];case 4:if(u=i.sent(),l=Ge.getDeserializedHash(u),d=this.validateAndExtractStateFromHash(l,e.InteractionType.Silent,o.correlationId),l.accountId){if(this.logger.verbose("Account id found in hash, calling WAM for token"),!this.nativeMessageHandler)throw Rt.createNativeConnectionNotEstablishedError();return h=new ir(this.config,this.browserStorage,this.browserCrypto,this.logger,this.eventHandler,this.navigationClient,this.apiId,this.performanceClient,this.nativeMessageHandler,l.accountId,this.browserStorage,this.correlationId),p=Be.parseRequestState(this.browserCrypto,d).userRequestState,[2,h.acquireToken(n(n({},r),{state:p,prompt:w.NONE})).finally((function(){g.browserStorage.cleanRequestByState(d)}))]}return[2,s.handleCodeResponseFromHash(u,d,t.authority,this.networkClient)]}}))}))},a}(Xt),gr=function(t){function a(){return null!==t&&t.apply(this,arguments)||this}return r(a,t),a.prototype.acquireToken=function(t){return o(this,void 0,void 0,(function(){var r,o,a,s,c,u=this;return i(this,(function(i){switch(i.label){case 0:return o=[n({},t)],[4,this.initializeBaseRequest(t)];case 1:return r=n.apply(void 0,o.concat([i.sent()])),a=this.performanceClient.startMeasurement(e.PerformanceEvents.SilentRefreshClientAcquireToken,r.correlationId),s=this.initializeServerTelemetryManager(e.ApiId.acquireTokenSilent_silentFlow),[4,this.createRefreshTokenClient(s,r.authority,r.azureCloudOptions)];case 2:return c=i.sent(),this.logger.verbose("Refresh token client created"),[2,c.acquireTokenByRefreshToken(r).then((function(e){return a.endMeasurement({success:!0,fromCache:e.fromCache}),e})).catch((function(e){throw e instanceof $&&e.setCorrelationId(u.correlationId),s.cacheFailedRequest(e),a.endMeasurement({errorCode:e.errorCode,subErrorCode:e.subError,success:!1}),e}))]}}))}))},a.prototype.logout=function(){return Promise.reject(Rt.createSilentLogoutUnsupportedError())},a.prototype.createRefreshTokenClient=function(e,t,r){return o(this,void 0,void 0,(function(){var n;return i(this,(function(o){switch(o.label){case 0:return[4,this.getClientConfiguration(e,t,r)];case 1:return n=o.sent(),[2,new Xe(n,this.performanceClient)]}}))}))},a}(Xt),fr=function(){function t(e,t){this.eventCallbacks=new Map,this.logger=e,this.browserCrypto=t,this.listeningToStorageEvents=!1,this.handleAccountCacheChange=this.handleAccountCacheChange.bind(this)}return t.prototype.addEventCallback=function(e){if("undefined"!=typeof window){var t=this.browserCrypto.createNewGuid();return this.eventCallbacks.set(t,e),this.logger.verbose("Event callback registered with id: "+t),t}return null},t.prototype.removeEventCallback=function(e){this.eventCallbacks.delete(e),this.logger.verbose("Event callback "+e+" removed.")},t.prototype.enableAccountStorageEvents=function(){"undefined"!=typeof window&&(this.listeningToStorageEvents?this.logger.verbose("Account storage listener already registered."):(this.logger.verbose("Adding account storage listener."),this.listeningToStorageEvents=!0,window.addEventListener("storage",this.handleAccountCacheChange)))},t.prototype.disableAccountStorageEvents=function(){"undefined"!=typeof window&&(this.listeningToStorageEvents?(this.logger.verbose("Removing account storage listener."),window.removeEventListener("storage",this.handleAccountCacheChange),this.listeningToStorageEvents=!1):this.logger.verbose("No account storage listener registered."))},t.prototype.emitEvent=function(e,t,r,n){var o=this;if("undefined"!=typeof window){var i={eventType:e,interactionType:t||null,payload:r||null,error:n||null,timestamp:Date.now()};this.logger.info("Emitting event: "+e),this.eventCallbacks.forEach((function(t,r){o.logger.verbose("Emitting event to callback "+r+": "+e),t.apply(null,[i])}))}},t.prototype.handleAccountCacheChange=function(t){try{var r=t.newValue||t.oldValue;if(!r)return;var n=JSON.parse(r);if("object"!=typeof n||!ge.isAccountEntity(n))return;var o=me.toObject(new ge,n).getAccountInfo();!t.oldValue&&t.newValue?(this.logger.info("Account was added to cache in a different window"),this.emitEvent(e.EventType.ACCOUNT_ADDED,void 0,o)):!t.newValue&&t.oldValue&&(this.logger.info("Account was removed from cache in a different window"),this.emitEvent(e.EventType.ACCOUNT_REMOVED,void 0,o))}catch(t){return}},t}(),mr=Object.freeze({__proto__:null,BrowserCacheManager:zt,StandardInteractionClient:Xt,RedirectClient:sr,PopupClient:cr,SilentIframeClient:pr,SilentCacheClient:or,SilentRefreshClient:gr,RedirectHandler:$t,EventHandler:fr,NativeMessageHandler:ar,BrowserConstants:kt,get TemporaryCacheKeys(){return st}}),vr=function(){function e(){}return e.decimalToHex=function(e){for(var t=e.toString(16);t.length<2;)t="0"+t;return t},e}(),yr=function(){function e(e){this.cryptoObj=e}return e.prototype.generateGuid=function(){try{var e=new Uint8Array(16);return this.cryptoObj.getRandomValues(e),e[6]|=64,e[6]&=79,e[8]|=128,e[8]&=191,vr.decimalToHex(e[0])+vr.decimalToHex(e[1])+vr.decimalToHex(e[2])+vr.decimalToHex(e[3])+"-"+vr.decimalToHex(e[4])+vr.decimalToHex(e[5])+"-"+vr.decimalToHex(e[6])+vr.decimalToHex(e[7])+"-"+vr.decimalToHex(e[8])+vr.decimalToHex(e[9])+"-"+vr.decimalToHex(e[10])+vr.decimalToHex(e[11])+vr.decimalToHex(e[12])+vr.decimalToHex(e[13])+vr.decimalToHex(e[14])+vr.decimalToHex(e[15])}catch(e){for(var t="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx",r="0123456789abcdef",n=0,o=E.EMPTY_STRING,i=0;i<36;i++)"-"!==t[i]&&"4"!==t[i]&&(n=16*Math.random()|0),"x"===t[i]?o+=r[n]:"y"===t[i]?(n&=3,o+=r[n|=8]):o+=t[i];return o}},e.prototype.isGuid=function(e){return/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(e)},e}(),Er=function(){function e(){}return e.stringToUtf8Arr=function(e){for(var t,r=0,n=e.length,o=0;o<n;o++)r+=(t=e.charCodeAt(o))<128?1:t<2048?2:t<65536?3:t<2097152?4:t<67108864?5:6;for(var i=new Uint8Array(r),a=0,s=0;a<r;s++)(t=e.charCodeAt(s))<128?i[a++]=t:t<2048?(i[a++]=192+(t>>>6),i[a++]=128+(63&t)):t<65536?(i[a++]=224+(t>>>12),i[a++]=128+(t>>>6&63),i[a++]=128+(63&t)):t<2097152?(i[a++]=240+(t>>>18),i[a++]=128+(t>>>12&63),i[a++]=128+(t>>>6&63),i[a++]=128+(63&t)):t<67108864?(i[a++]=248+(t>>>24),i[a++]=128+(t>>>18&63),i[a++]=128+(t>>>12&63),i[a++]=128+(t>>>6&63),i[a++]=128+(63&t)):(i[a++]=252+(t>>>30),i[a++]=128+(t>>>24&63),i[a++]=128+(t>>>18&63),i[a++]=128+(t>>>12&63),i[a++]=128+(t>>>6&63),i[a++]=128+(63&t));return i},e.stringToArrayBuffer=function(e){for(var t=new ArrayBuffer(e.length),r=new Uint8Array(t),n=0;n<e.length;n++)r[n]=e.charCodeAt(n);return t},e.utf8ArrToString=function(e){for(var t=E.EMPTY_STRING,r=void 0,n=e.length,o=0;o<n;o++)r=e[o],t+=String.fromCharCode(r>251&&r<254&&o+5<n?1073741824*(r-252)+(e[++o]-128<<24)+(e[++o]-128<<18)+(e[++o]-128<<12)+(e[++o]-128<<6)+e[++o]-128:r>247&&r<252&&o+4<n?(r-248<<24)+(e[++o]-128<<18)+(e[++o]-128<<12)+(e[++o]-128<<6)+e[++o]-128:r>239&&r<248&&o+3<n?(r-240<<18)+(e[++o]-128<<12)+(e[++o]-128<<6)+e[++o]-128:r>223&&r<240&&o+2<n?(r-224<<12)+(e[++o]-128<<6)+e[++o]-128:r>191&&r<224&&o+1<n?(r-192<<6)+e[++o]-128:r);return t},e}(),Cr=function(){function e(){}return e.prototype.urlEncode=function(e){return encodeURIComponent(this.encode(e).replace(/=/g,E.EMPTY_STRING).replace(/\+/g,"-").replace(/\//g,"_"))},e.prototype.urlEncodeArr=function(e){return this.base64EncArr(e).replace(/=/g,E.EMPTY_STRING).replace(/\+/g,"-").replace(/\//g,"_")},e.prototype.encode=function(e){var t=Er.stringToUtf8Arr(e);return this.base64EncArr(t)},e.prototype.base64EncArr=function(e){for(var t=(3-e.length%3)%3,r=E.EMPTY_STRING,n=void 0,o=e.length,i=0,a=0;a<o;a++)n=a%3,i|=e[a]<<(16>>>n&24),2!==n&&e.length-a!=1||(r+=String.fromCharCode(this.uint6ToB64(i>>>18&63),this.uint6ToB64(i>>>12&63),this.uint6ToB64(i>>>6&63),this.uint6ToB64(63&i)),i=0);return 0===t?r:r.substring(0,r.length-t)+(1===t?"=":"==")},e.prototype.uint6ToB64=function(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65},e}(),_r=function(){function e(){}return e.prototype.decode=function(e){var t=e.replace(/-/g,"+").replace(/_/g,"/");switch(t.length%4){case 0:break;case 2:t+="==";break;case 3:t+="=";break;default:throw new Error("Invalid base64 string")}var r=this.base64DecToArr(t);return Er.utf8ArrToString(r)},e.prototype.base64DecToArr=function(e,t){for(var r=e.replace(/[^A-Za-z0-9\+\/]/g,E.EMPTY_STRING),n=r.length,o=t?Math.ceil((3*n+1>>>2)/t)*t:3*n+1>>>2,i=new Uint8Array(o),a=void 0,s=void 0,c=0,u=0,l=0;l<n;l++)if(s=3&l,c|=this.b64ToUint6(r.charCodeAt(l))<<18-6*s,3===s||n-l==1){for(a=0;a<3&&u<o;a++,u++)i[u]=c>>>(16>>>a&24)&255;c=0}return i},e.prototype.b64ToUint6=function(e){return e>64&&e<91?e-65:e>96&&e<123?e-71:e>47&&e<58?e+4:43===e?62:47===e?63:0},e}(),Tr=function(){function e(e){this.base64Encode=new Cr,this.cryptoObj=e}return e.prototype.generateCodes=function(){return o(this,void 0,void 0,(function(){var e,t;return i(this,(function(r){switch(r.label){case 0:return e=this.generateCodeVerifier(),[4,this.generateCodeChallengeFromVerifier(e)];case 1:return t=r.sent(),[2,{verifier:e,challenge:t}]}}))}))},e.prototype.generateCodeVerifier=function(){try{var e=new Uint8Array(32);return this.cryptoObj.getRandomValues(e),this.base64Encode.urlEncodeArr(e)}catch(e){throw Rt.createPkceNotGeneratedError(e)}},e.prototype.generateCodeChallengeFromVerifier=function(e){return o(this,void 0,void 0,(function(){var t,r;return i(this,(function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,this.cryptoObj.sha256Digest(e)];case 1:return t=n.sent(),[2,this.base64Encode.urlEncodeArr(new Uint8Array(t))];case 2:throw r=n.sent(),Rt.createPkceNotGeneratedError(r);case 3:return[2]}}))}))},e}(),wr="SHA-256",Ir=new Uint8Array([1,0,1]),Sr=function(){function e(e){if(this.logger=e,!this.hasCryptoAPI())throw Rt.createCryptoNotAvailableError("Browser crypto or msCrypto object not available.");this._keygenAlgorithmOptions={name:"RSASSA-PKCS1-v1_5",hash:wr,modulusLength:2048,publicExponent:Ir}}return e.prototype.sha256Digest=function(e){return o(this,void 0,void 0,(function(){var t;return i(this,(function(r){return t=Er.stringToUtf8Arr(e),[2,this.hasIECrypto()?this.getMSCryptoDigest(wr,t):this.getSubtleCryptoDigest(wr,t)]}))}))},e.prototype.getRandomValues=function(e){var t=window.msCrypto||window.crypto;if(!t.getRandomValues)throw Rt.createCryptoNotAvailableError("getRandomValues does not exist.");t.getRandomValues(e)},e.prototype.generateKeyPair=function(e,t){return o(this,void 0,void 0,(function(){return i(this,(function(r){return[2,this.hasIECrypto()?this.msCryptoGenerateKey(e,t):window.crypto.subtle.generateKey(this._keygenAlgorithmOptions,e,t)]}))}))},e.prototype.exportJwk=function(e){return o(this,void 0,void 0,(function(){return i(this,(function(t){return[2,this.hasIECrypto()?this.msCryptoExportJwk(e):window.crypto.subtle.exportKey(qt,e)]}))}))},e.prototype.importJwk=function(t,r,n){return o(this,void 0,void 0,(function(){var o,a;return i(this,(function(i){return o=e.getJwkString(t),a=Er.stringToArrayBuffer(o),[2,this.hasIECrypto()?this.msCryptoImportKey(a,r,n):window.crypto.subtle.importKey(qt,t,this._keygenAlgorithmOptions,r,n)]}))}))},e.prototype.sign=function(e,t){return o(this,void 0,void 0,(function(){return i(this,(function(r){return[2,this.hasIECrypto()?this.msCryptoSign(e,t):window.crypto.subtle.sign(this._keygenAlgorithmOptions,e,t)]}))}))},e.prototype.hasCryptoAPI=function(){return this.hasIECrypto()||this.hasBrowserCrypto()},e.prototype.hasIECrypto=function(){return"msCrypto"in window},e.prototype.hasBrowserCrypto=function(){return"crypto"in window},e.prototype.getSubtleCryptoDigest=function(e,t){return o(this,void 0,void 0,(function(){return i(this,(function(r){return[2,window.crypto.subtle.digest(e,t)]}))}))},e.prototype.getMSCryptoDigest=function(e,t){return o(this,void 0,void 0,(function(){return i(this,(function(r){return[2,new Promise((function(r,n){var o=window.msCrypto.subtle.digest(e,t.buffer);o.addEventListener("complete",(function(e){r(e.target.result)})),o.addEventListener("error",(function(e){n(e)}))}))]}))}))},e.prototype.msCryptoGenerateKey=function(e,t){return o(this,void 0,void 0,(function(){var r=this;return i(this,(function(n){return[2,new Promise((function(n,o){var i=window.msCrypto.subtle.generateKey(r._keygenAlgorithmOptions,e,t);i.addEventListener("complete",(function(e){n(e.target.result)})),i.addEventListener("error",(function(e){o(e)}))}))]}))}))},e.prototype.msCryptoExportJwk=function(e){return o(this,void 0,void 0,(function(){return i(this,(function(t){return[2,new Promise((function(t,r){var n=window.msCrypto.subtle.exportKey(qt,e);n.addEventListener("complete",(function(e){var n=e.target.result,o=Er.utf8ArrToString(new Uint8Array(n)).replace(/\r/g,E.EMPTY_STRING).replace(/\n/g,E.EMPTY_STRING).replace(/\t/g,E.EMPTY_STRING).split(" ").join(E.EMPTY_STRING).replace("\0",E.EMPTY_STRING);try{t(JSON.parse(o))}catch(e){r(e)}})),n.addEventListener("error",(function(e){r(e)}))}))]}))}))},e.prototype.msCryptoImportKey=function(e,t,r){return o(this,void 0,void 0,(function(){var n=this;return i(this,(function(o){return[2,new Promise((function(o,i){var a=window.msCrypto.subtle.importKey(qt,e,n._keygenAlgorithmOptions,t,r);a.addEventListener("complete",(function(e){o(e.target.result)})),a.addEventListener("error",(function(e){i(e)}))}))]}))}))},e.prototype.msCryptoSign=function(e,t){return o(this,void 0,void 0,(function(){var r=this;return i(this,(function(n){return[2,new Promise((function(n,o){var i=window.msCrypto.subtle.sign(r._keygenAlgorithmOptions,e,t);i.addEventListener("complete",(function(e){n(e.target.result)})),i.addEventListener("error",(function(e){o(e)}))}))]}))}))},e.getJwkString=function(e){return JSON.stringify(e,Object.keys(e).sort())},e}(),Ar=function(){function e(){this.dbName=Dt,this.version=1,this.tableName="msal.db.keys",this.dbOpen=!1}return e.prototype.open=function(){return o(this,void 0,void 0,(function(){var e=this;return i(this,(function(t){return[2,new Promise((function(t,r){var n=window.indexedDB.open(e.dbName,e.version);n.addEventListener("upgradeneeded",(function(t){t.target.result.createObjectStore(e.tableName)})),n.addEventListener("success",(function(r){var n=r;e.db=n.target.result,e.dbOpen=!0,t()})),n.addEventListener("error",(function(){return r(Rt.createDatabaseUnavailableError())}))}))]}))}))},e.prototype.closeConnection=function(){var e=this.db;e&&this.dbOpen&&(e.close(),this.dbOpen=!1)},e.prototype.validateDbIsOpen=function(){return o(this,void 0,void 0,(function(){return i(this,(function(e){switch(e.label){case 0:return this.dbOpen?[3,2]:[4,this.open()];case 1:return[2,e.sent()];case 2:return[2]}}))}))},e.prototype.getItem=function(e){return o(this,void 0,void 0,(function(){var t=this;return i(this,(function(r){switch(r.label){case 0:return[4,this.validateDbIsOpen()];case 1:return r.sent(),[2,new Promise((function(r,n){if(!t.db)return n(Rt.createDatabaseNotOpenError());var o=t.db.transaction([t.tableName],"readonly").objectStore(t.tableName).get(e);o.addEventListener("success",(function(e){var n=e;t.closeConnection(),r(n.target.result)})),o.addEventListener("error",(function(e){t.closeConnection(),n(e)}))}))]}}))}))},e.prototype.setItem=function(e,t){return o(this,void 0,void 0,(function(){var r=this;return i(this,(function(n){switch(n.label){case 0:return[4,this.validateDbIsOpen()];case 1:return n.sent(),[2,new Promise((function(n,o){if(!r.db)return o(Rt.createDatabaseNotOpenError());var i=r.db.transaction([r.tableName],"readwrite").objectStore(r.tableName).put(t,e);i.addEventListener("success",(function(){r.closeConnection(),n()})),i.addEventListener("error",(function(e){r.closeConnection(),o(e)}))}))]}}))}))},e.prototype.removeItem=function(e){return o(this,void 0,void 0,(function(){var t=this;return i(this,(function(r){switch(r.label){case 0:return[4,this.validateDbIsOpen()];case 1:return r.sent(),[2,new Promise((function(r,n){if(!t.db)return n(Rt.createDatabaseNotOpenError());var o=t.db.transaction([t.tableName],"readwrite").objectStore(t.tableName).delete(e);o.addEventListener("success",(function(){t.closeConnection(),r()})),o.addEventListener("error",(function(e){t.closeConnection(),n(e)}))}))]}}))}))},e.prototype.getKeys=function(){return o(this,void 0,void 0,(function(){var e=this;return i(this,(function(t){switch(t.label){case 0:return[4,this.validateDbIsOpen()];case 1:return t.sent(),[2,new Promise((function(t,r){if(!e.db)return r(Rt.createDatabaseNotOpenError());var n=e.db.transaction([e.tableName],"readonly").objectStore(e.tableName).getAllKeys();n.addEventListener("success",(function(r){var n=r;e.closeConnection(),t(n.target.result)})),n.addEventListener("error",(function(t){e.closeConnection(),r(t)}))}))]}}))}))},e.prototype.containsKey=function(e){return o(this,void 0,void 0,(function(){var t=this;return i(this,(function(r){switch(r.label){case 0:return[4,this.validateDbIsOpen()];case 1:return r.sent(),[2,new Promise((function(r,n){if(!t.db)return n(Rt.createDatabaseNotOpenError());var o=t.db.transaction([t.tableName],"readonly").objectStore(t.tableName).count(e);o.addEventListener("success",(function(e){var n=e;t.closeConnection(),r(1===n.target.result)})),o.addEventListener("error",(function(e){t.closeConnection(),n(e)}))}))]}}))}))},e.prototype.deleteDatabase=function(){return o(this,void 0,void 0,(function(){var e;return i(this,(function(t){switch(t.label){case 0:return this.db&&this.dbOpen&&this.closeConnection(),[4,window.indexedDB.databases()];case 1:return e=t.sent(),e.find((function(e){return e.name===Dt}))?[2,new Promise((function(e,t){var r=window.indexedDB.deleteDatabase(Dt);r.addEventListener("success",(function(){return e(!0)})),r.addEventListener("error",(function(){return t(!1)}))}))]:[2,!0]}}))}))},e}(),br=function(){function e(e,t){this.inMemoryCache=new Bt,this.indexedDBCache=new Ar,this.logger=e,this.storeName=t}return e.prototype.handleDatabaseAccessError=function(e){if(!(e instanceof Rt&&e.errorCode===bt.databaseUnavailable.code))throw e;this.logger.error("Could not access persistent storage. This may be caused by browser privacy features which block persistent storage in third-party contexts.")},e.prototype.getItem=function(e){return o(this,void 0,void 0,(function(){var t,r;return i(this,(function(n){switch(n.label){case 0:if(t=this.inMemoryCache.getItem(e))return[3,4];n.label=1;case 1:return n.trys.push([1,3,,4]),this.logger.verbose("Queried item not found in in-memory cache, now querying persistent storage."),[4,this.indexedDBCache.getItem(e)];case 2:return[2,n.sent()];case 3:return r=n.sent(),this.handleDatabaseAccessError(r),[3,4];case 4:return[2,t]}}))}))},e.prototype.setItem=function(e,t){return o(this,void 0,void 0,(function(){var r;return i(this,(function(n){switch(n.label){case 0:this.inMemoryCache.setItem(e,t),n.label=1;case 1:return n.trys.push([1,3,,4]),[4,this.indexedDBCache.setItem(e,t)];case 2:return n.sent(),[3,4];case 3:return r=n.sent(),this.handleDatabaseAccessError(r),[3,4];case 4:return[2]}}))}))},e.prototype.removeItem=function(e){return o(this,void 0,void 0,(function(){var t;return i(this,(function(r){switch(r.label){case 0:this.inMemoryCache.removeItem(e),r.label=1;case 1:return r.trys.push([1,3,,4]),[4,this.indexedDBCache.removeItem(e)];case 2:return r.sent(),[3,4];case 3:return t=r.sent(),this.handleDatabaseAccessError(t),[3,4];case 4:return[2]}}))}))},e.prototype.getKeys=function(){return o(this,void 0,void 0,(function(){var e,t;return i(this,(function(r){switch(r.label){case 0:if(0!==(e=this.inMemoryCache.getKeys()).length)return[3,4];r.label=1;case 1:return r.trys.push([1,3,,4]),this.logger.verbose("In-memory cache is empty, now querying persistent storage."),[4,this.indexedDBCache.getKeys()];case 2:return[2,r.sent()];case 3:return t=r.sent(),this.handleDatabaseAccessError(t),[3,4];case 4:return[2,e]}}))}))},e.prototype.containsKey=function(e){return o(this,void 0,void 0,(function(){var t,r;return i(this,(function(n){switch(n.label){case 0:if(t=this.inMemoryCache.containsKey(e))return[3,4];n.label=1;case 1:return n.trys.push([1,3,,4]),this.logger.verbose("Key not found in in-memory cache, now querying persistent storage."),[4,this.indexedDBCache.containsKey(e)];case 2:return[2,n.sent()];case 3:return r=n.sent(),this.handleDatabaseAccessError(r),[3,4];case 4:return[2,t]}}))}))},e.prototype.clear=function(){return o(this,void 0,void 0,(function(){var e,t;return i(this,(function(r){switch(r.label){case 0:this.logger.verbose("Deleting in-memory keystore "+this.storeName),this.inMemoryCache.clear(),this.logger.verbose("In-memory keystore "+this.storeName+" deleted"),this.logger.verbose("Deleting persistent keystore "+this.storeName),r.label=1;case 1:return r.trys.push([1,3,,4]),[4,this.indexedDBCache.deleteDatabase()];case 2:return(e=r.sent())&&this.logger.verbose("Persistent keystore "+this.storeName+" deleted"),[2,e];case 3:return t=r.sent(),this.handleDatabaseAccessError(t),[2,!1];case 4:return[2]}}))}))},e}();!function(e){e.asymmetricKeys="asymmetricKeys",e.symmetricKeys="symmetricKeys"}(dr||(dr={}));var Rr=function(){function t(e,t){this.logger=e,this.browserCrypto=new Sr(this.logger),this.b64Encode=new Cr,this.b64Decode=new _r,this.guidGenerator=new yr(this.browserCrypto),this.pkceGenerator=new Tr(this.browserCrypto),this.cache={asymmetricKeys:new br(this.logger,dr.asymmetricKeys),symmetricKeys:new br(this.logger,dr.symmetricKeys)},this.performanceClient=t}return t.prototype.createNewGuid=function(){return this.guidGenerator.generateGuid()},t.prototype.base64Encode=function(e){return this.b64Encode.encode(e)},t.prototype.base64Decode=function(e){return this.b64Decode.decode(e)},t.prototype.generatePkceCodes=function(){return o(this,void 0,void 0,(function(){return i(this,(function(e){return[2,this.pkceGenerator.generateCodes()]}))}))},t.prototype.getPublicKeyThumbprint=function(r){var n;return o(this,void 0,void 0,(function(){var o,a,s,c,u,l,d,h;return i(this,(function(i){switch(i.label){case 0:return o=null===(n=this.performanceClient)||void 0===n?void 0:n.startMeasurement(e.PerformanceEvents.CryptoOptsGetPublicKeyThumbprint,r.correlationId),[4,this.browserCrypto.generateKeyPair(t.EXTRACTABLE,t.POP_KEY_USAGES)];case 1:return a=i.sent(),[4,this.browserCrypto.exportJwk(a.publicKey)];case 2:return s=i.sent(),c={e:s.e,kty:s.kty,n:s.n},u=Sr.getJwkString(c),[4,this.hashString(u)];case 3:return l=i.sent(),[4,this.browserCrypto.exportJwk(a.privateKey)];case 4:return d=i.sent(),[4,this.browserCrypto.importJwk(d,!1,["sign"])];case 5:return h=i.sent(),[4,this.cache.asymmetricKeys.setItem(l,{privateKey:h,publicKey:a.publicKey,requestMethod:r.resourceRequestMethod,requestUri:r.resourceRequestUri})];case 6:return i.sent(),o&&o.endMeasurement({success:!0}),[2,l]}}))}))},t.prototype.removeTokenBindingKey=function(e){return o(this,void 0,void 0,(function(){return i(this,(function(t){switch(t.label){case 0:return[4,this.cache.asymmetricKeys.removeItem(e)];case 1:return t.sent(),[4,this.cache.asymmetricKeys.containsKey(e)];case 2:return[2,!t.sent()]}}))}))},t.prototype.clearKeystore=function(){return o(this,void 0,void 0,(function(){var e;return i(this,(function(t){switch(t.label){case 0:return t.trys.push([0,3,,4]),this.logger.verbose("Deleting in-memory and persistent asymmetric key stores"),[4,this.cache.asymmetricKeys.clear()];case 1:return t.sent(),this.logger.verbose("Successfully deleted asymmetric key stores"),this.logger.verbose("Deleting in-memory and persistent symmetric key stores"),[4,this.cache.symmetricKeys.clear()];case 2:return t.sent(),this.logger.verbose("Successfully deleted symmetric key stores"),[2,!0];case 3:return(e=t.sent())instanceof Error?this.logger.error("Clearing keystore failed with error: "+e.message):this.logger.error("Clearing keystore failed with unknown error"),[2,!1];case 4:return[2]}}))}))},t.prototype.signJwt=function(t,r,n){var a;return o(this,void 0,void 0,(function(){var o,s,c,u,l,d,h,p,g,f,m,v,y;return i(this,(function(i){switch(i.label){case 0:return o=null===(a=this.performanceClient)||void 0===a?void 0:a.startMeasurement(e.PerformanceEvents.CryptoOptsSignJwt,n),[4,this.cache.asymmetricKeys.getItem(r)];case 1:if(!(s=i.sent()))throw Rt.createSigningKeyNotFoundInStorageError(r);return[4,this.browserCrypto.exportJwk(s.publicKey)];case 2:return c=i.sent(),u=Sr.getJwkString(c),l=this.b64Encode.urlEncode(JSON.stringify({kid:r})),d=_t.getShrHeaderString({kid:l,alg:c.alg}),h=this.b64Encode.urlEncode(d),t.cnf={jwk:JSON.parse(u)},p=this.b64Encode.urlEncode(JSON.stringify(t)),g=h+"."+p,f=Er.stringToArrayBuffer(g),[4,this.browserCrypto.sign(s.privateKey,f)];case 3:return m=i.sent(),v=this.b64Encode.urlEncodeArr(new Uint8Array(m)),y=g+"."+v,o&&o.endMeasurement({success:!0}),[2,y]}}))}))},t.prototype.hashString=function(e){return o(this,void 0,void 0,(function(){var t,r;return i(this,(function(n){switch(n.label){case 0:return[4,this.browserCrypto.sha256Digest(e)];case 1:return t=n.sent(),r=new Uint8Array(t),[2,this.b64Encode.urlEncodeArr(r)]}}))}))},t.POP_KEY_USAGES=["sign","verify"],t.EXTRACTABLE=!0,t}(),kr=function(){function e(e,t,r,n){this.isBrowserEnvironment="undefined"!=typeof window,this.config=e,this.storage=t,this.logger=r,this.cryptoObj=n}return e.prototype.loadExternalTokens=function(e,t,r){if(this.logger.info("TokenCache - loadExternalTokens called"),!t.id_token)throw Rt.createUnableToLoadTokenError("Please ensure server response includes id token.");if(e.account)this.loadIdToken(t.id_token,e.account.homeAccountId,e.account.environment,e.account.tenantId,r),this.loadAccessToken(e,t,e.account.homeAccountId,e.account.environment,e.account.tenantId,r);else{if(!e.authority)throw Rt.createUnableToLoadTokenError("Please provide a request with an account or a request with authority.");var n=pt.generateAuthority(e.authority,e.azureCloudOptions),o={protocolMode:this.config.auth.protocolMode,knownAuthorities:this.config.auth.knownAuthorities,cloudDiscoveryMetadata:this.config.auth.cloudDiscoveryMetadata,authorityMetadata:this.config.auth.authorityMetadata,skipAuthorityMetadataCache:this.config.auth.skipAuthorityMetadataCache},i=new pt(n,this.config.system.networkClient,this.storage,o);if(r.clientInfo)this.logger.trace("TokenCache - homeAccountId from options"),this.loadIdToken(t.id_token,r.clientInfo,i.hostnameAndPort,i.tenant,r),this.loadAccessToken(e,t,r.clientInfo,i.hostnameAndPort,i.tenant,r);else{if(!t.client_info)throw Rt.createUnableToLoadTokenError("Please provide clientInfo in the response or options.");this.logger.trace("TokenCache - homeAccountId from response"),this.loadIdToken(t.id_token,t.client_info,i.hostnameAndPort,i.tenant,r),this.loadAccessToken(e,t,t.client_info,i.hostnameAndPort,i.tenant,r)}}},e.prototype.loadIdToken=function(e,t,r,n,o){var i=Me.createIdTokenEntity(t,r,e,this.config.auth.clientId,n),a=new fe(e,this.cryptoObj),s=o.clientInfo?ge.createAccount(o.clientInfo,t,a,void 0,void 0,void 0,r):ge.createGenericAccount(t,a,void 0,void 0,void 0,r);if(!this.isBrowserEnvironment)throw Rt.createUnableToLoadTokenError("loadExternalTokens is designed to work in browser environments only.");this.logger.verbose("TokenCache - loading id token"),this.storage.setAccount(s),this.storage.setIdTokenCredential(i)},e.prototype.loadAccessToken=function(e,t,r,n,o,i){if(t.access_token){if(!t.expires_in)throw Rt.createUnableToLoadTokenError("Please ensure server response includes expires_in value.");if(!i.extendedExpiresOn)throw Rt.createUnableToLoadTokenError("Please provide an extendedExpiresOn value in the options.");var a=new de(e.scopes).printScopes(),s=i.expiresOn||t.expires_in+(new Date).getTime()/1e3,c=i.extendedExpiresOn,u=qe.createAccessTokenEntity(r,n,t.access_token,this.config.auth.clientId,o,a,s,c,this.cryptoObj);if(!this.isBrowserEnvironment)throw Rt.createUnableToLoadTokenError("loadExternalTokens is designed to work in browser environments only.");this.logger.verbose("TokenCache - loading access token"),this.storage.setAccessTokenCredential(u)}else this.logger.verbose("TokenCache - No access token provided for caching")},e}(),Nr=function(e){function t(t){var r=e.call(this,t)||this;return r.includeRedirectUri=!1,r}return r(t,e),t}(Qe),Pr=function(t){function a(e,r,n,o,i,a,s,c,u,l){var d=t.call(this,e,r,n,o,i,a,c,u,l)||this;return d.apiId=s,d}return r(a,t),a.prototype.acquireToken=function(t){return o(this,void 0,void 0,(function(){var r,o,a,s,c,u;return i(this,(function(i){switch(i.label){case 0:if(this.logger.trace("SilentAuthCodeClient.acquireToken called"),!t.code)throw Rt.createAuthCodeRequiredError();return[4,this.initializeAuthorizationRequest(t,e.InteractionType.Silent)];case 1:r=i.sent(),this.browserStorage.updateCacheEntries(r.state,r.nonce,r.authority,r.loginHint||E.EMPTY_STRING,r.account||null),o=this.initializeServerTelemetryManager(this.apiId),i.label=2;case 2:return i.trys.push([2,4,,5]),a=n(n({},r),{code:t.code}),[4,this.getClientConfiguration(o,r.authority)];case 3:return s=i.sent(),c=new Nr(s),this.logger.verbose("Auth code client created"),[2,new hr(c,this.browserStorage,a,this.logger,this.config.system.navigateFrameWait).handleCodeResponseFromServer({code:t.code,msgraph_host:t.msGraphHost,cloud_graph_host_name:t.cloudGraphHostName,cloud_instance_host_name:t.cloudInstanceHostName},r.state,c.authority,this.networkClient,!1)];case 4:throw(u=i.sent())instanceof $&&u.setCorrelationId(this.correlationId),o.cacheFailedRequest(u),this.browserStorage.cleanRequestByState(r.state),u;case 5:return[2]}}))}))},a.prototype.logout=function(){return Promise.reject(Rt.createSilentLogoutUnsupportedError())},a}(Xt),Or=function(){function e(e,t){this.correlationId=t,this.measureName="msal.measure."+e+"."+this.correlationId,this.startMark="msal.start."+e+"."+this.correlationId,this.endMark="msal.end."+e+"."+this.correlationId}return e.supportsBrowserPerformance=function(){return"undefined"!=typeof window&&void 0!==window.performance&&"function"==typeof window.performance.mark&&"function"==typeof window.performance.measure&&"function"==typeof window.performance.clearMarks&&"function"==typeof window.performance.clearMeasures&&"function"==typeof window.performance.getEntriesByName},e.prototype.startMeasurement=function(){if(e.supportsBrowserPerformance())try{window.performance.mark(this.startMark)}catch(e){}},e.prototype.endMeasurement=function(){if(e.supportsBrowserPerformance())try{window.performance.mark(this.endMark),window.performance.measure(this.measureName,this.startMark,this.endMark)}catch(e){}},e.prototype.flushMeasurement=function(){if(e.supportsBrowserPerformance())try{var t=window.performance.getEntriesByName(this.measureName,"measure");if(t.length>0){var r=t[0].duration;return window.performance.clearMeasures(this.measureName),window.performance.clearMarks(this.startMark),window.performance.clearMarks(this.endMark),r}}catch(e){}return null},e}(),Mr=function(e){function t(t,r,n,o,i,a){var s=e.call(this,t,r,n,o,i,a)||this;return s.browserCrypto=new Sr(s.logger),s.guidGenerator=new yr(s.browserCrypto),s}return r(t,e),t.prototype.startPerformanceMeasuremeant=function(e,t){return new Or(e,t)},t.prototype.generateId=function(){return this.guidGenerator.generateGuid()},t.prototype.getPageVisibility=function(){var e;return(null===(e=document.visibilityState)||void 0===e?void 0:e.toString())||null},t.prototype.startMeasurement=function(t,r){var o=this,i=this.getPageVisibility(),a=e.prototype.startMeasurement.call(this,t,r);return n(n({},a),{endMeasurement:function(e){return a.endMeasurement(n({startPageVisibility:i,endPageVisibility:o.getPageVisibility()},e))}})},t}(It),Ur=function(){function t(t){var r,o,i;this.isBrowserEnvironment="undefined"!=typeof window,this.config=function(t,r){var o=t.auth,i=t.cache,a=t.system,s=t.telemetry,c={clientId:E.EMPTY_STRING,authority:""+E.DEFAULT_AUTHORITY,knownAuthorities:[],cloudDiscoveryMetadata:E.EMPTY_STRING,authorityMetadata:E.EMPTY_STRING,redirectUri:E.EMPTY_STRING,postLogoutRedirectUri:E.EMPTY_STRING,navigateToLoginRequestUrl:!0,clientCapabilities:[],protocolMode:e.ProtocolMode.AAD,azureCloudOptions:{azureCloudInstance:e.AzureCloudInstance.None,tenant:E.EMPTY_STRING},skipAuthorityMetadataCache:!1},u={cacheLocation:e.BrowserCacheLocation.SessionStorage,storeAuthStateInCookie:!1,secureCookies:!1},l={loggerCallback:function(){},logLevel:e.LogLevel.Info,piiLoggingEnabled:!1},d=n(n({},ye),{loggerOptions:l,networkClient:r?Jt.getBrowserNetworkClient():vt,navigationClient:new ur,loadFrameTimeout:0,windowHashTimeout:(null==a?void 0:a.loadFrameTimeout)||6e4,iframeHashTimeout:(null==a?void 0:a.loadFrameTimeout)||lr,navigateFrameWait:r&&Jt.detectIEOrEdge()?500:0,redirectNavigationTimeout:3e4,asyncPopups:!1,allowRedirectInIframe:!1,allowNativeBroker:!1,nativeBrokerHandshakeTimeout:(null==a?void 0:a.nativeBrokerHandshakeTimeout)||2e3}),h={application:{appName:E.EMPTY_STRING,appVersion:E.EMPTY_STRING}};return{auth:n(n({},c),o),cache:n(n({},u),i),system:n(n({},d),a),telemetry:n(n({},h),s)}}(t,this.isBrowserEnvironment),this.initialized=!1,this.logger=new ie(this.config.system.loggerOptions,jt,Yt),this.networkClient=this.config.system.networkClient,this.navigationClient=this.config.system.navigationClient,this.redirectResponse=new Map,this.hybridAuthCodeResponses=new Map,this.performanceClient=this.isBrowserEnvironment?new Mr(this.config.auth.clientId,this.config.auth.authority,this.logger,jt,Yt,this.config.telemetry.application):new At(this.config.auth.clientId,this.config.auth.authority,this.logger,jt,Yt,this.config.telemetry.application),this.browserCrypto=this.isBrowserEnvironment?new Rr(this.logger,this.performanceClient):ee,this.eventHandler=new fr(this.logger,this.browserCrypto),this.browserStorage=this.isBrowserEnvironment?new zt(this.config.auth.clientId,this.config.cache,this.browserCrypto,this.logger):(r=this.config.auth.clientId,o=this.logger,i={cacheLocation:e.BrowserCacheLocation.MemoryStorage,storeAuthStateInCookie:!1,secureCookies:!1},new zt(r,i,ee,o));var a={cacheLocation:e.BrowserCacheLocation.MemoryStorage,storeAuthStateInCookie:!1,secureCookies:!1};this.nativeInternalStorage=new zt(this.config.auth.clientId,a,this.browserCrypto,this.logger),this.tokenCache=new kr(this.config,this.browserStorage,this.logger,this.browserCrypto)}return t.prototype.initialize=function(){return o(this,void 0,void 0,(function(){var t,r;return i(this,(function(n){switch(n.label){case 0:if(this.logger.trace("initialize called"),this.initialized)return this.logger.info("initialize has already been called, exiting early."),[2];if(this.eventHandler.emitEvent(e.EventType.INITIALIZE_START),!this.config.system.allowNativeBroker)return[3,4];n.label=1;case 1:return n.trys.push([1,3,,4]),t=this,[4,ar.createProvider(this.logger,this.config.system.nativeBrokerHandshakeTimeout)];case 2:return t.nativeExtensionProvider=n.sent(),[3,4];case 3:return r=n.sent(),this.logger.verbose(r),[3,4];case 4:return this.initialized=!0,this.eventHandler.emitEvent(e.EventType.INITIALIZE_END),[2]}}))}))},t.prototype.handleRedirectPromise=function(t){return o(this,void 0,void 0,(function(){var r,n,o,a,s,c,u,l,d=this;return i(this,(function(i){return this.logger.verbose("handleRedirectPromise called"),Jt.blockNativeBrokerCalledBeforeInitialized(this.config.system.allowNativeBroker,this.initialized),r=this.getAllAccounts(),this.isBrowserEnvironment?(n=t||E.EMPTY_STRING,void 0===(o=this.redirectResponse.get(n))?(this.eventHandler.emitEvent(e.EventType.HANDLE_REDIRECT_START,e.InteractionType.Redirect),this.logger.verbose("handleRedirectPromise has been called for the first time, storing the promise"),a=this.browserStorage.getCachedNativeRequest(),s=void 0,a&&ar.isNativeAvailable(this.config,this.logger,this.nativeExtensionProvider)&&this.nativeExtensionProvider&&!t?(this.logger.trace("handleRedirectPromise - acquiring token from native platform"),c=new ir(this.config,this.browserStorage,this.browserCrypto,this.logger,this.eventHandler,this.navigationClient,e.ApiId.handleRedirectPromise,this.performanceClient,this.nativeExtensionProvider,a.accountId,this.nativeInternalStorage,a.correlationId),s=c.handleRedirectPromise()):(this.logger.trace("handleRedirectPromise - acquiring token from web flow"),u=this.browserStorage.getTemporaryCache(st.CORRELATION_ID,!0)||E.EMPTY_STRING,l=this.createRedirectClient(u),s=l.handleRedirectPromise(t)),o=s.then((function(t){t&&(r.length<d.getAllAccounts().length?(d.eventHandler.emitEvent(e.EventType.LOGIN_SUCCESS,e.InteractionType.Redirect,t),d.logger.verbose("handleRedirectResponse returned result, login success")):(d.eventHandler.emitEvent(e.EventType.ACQUIRE_TOKEN_SUCCESS,e.InteractionType.Redirect,t),d.logger.verbose("handleRedirectResponse returned result, acquire token success")));return d.eventHandler.emitEvent(e.EventType.HANDLE_REDIRECT_END,e.InteractionType.Redirect),t})).catch((function(t){throw r.length>0?d.eventHandler.emitEvent(e.EventType.ACQUIRE_TOKEN_FAILURE,e.InteractionType.Redirect,null,t):d.eventHandler.emitEvent(e.EventType.LOGIN_FAILURE,e.InteractionType.Redirect,null,t),d.eventHandler.emitEvent(e.EventType.HANDLE_REDIRECT_END,e.InteractionType.Redirect),t})),this.redirectResponse.set(n,o)):this.logger.verbose("handleRedirectPromise has been called previously, returning the result from the first call"),[2,o]):(this.logger.verbose("handleRedirectPromise returns null, not browser environment"),[2,null])}))}))},t.prototype.acquireTokenRedirect=function(t){return o(this,void 0,void 0,(function(){var r,n,o,a,s,c=this;return i(this,(function(i){return r=this.getRequestCorrelationId(t),this.logger.verbose("acquireTokenRedirect called",r),this.preflightBrowserEnvironmentCheck(e.InteractionType.Redirect),(n=this.getAllAccounts().length>0)?this.eventHandler.emitEvent(e.EventType.ACQUIRE_TOKEN_START,e.InteractionType.Redirect,t):this.eventHandler.emitEvent(e.EventType.LOGIN_START,e.InteractionType.Redirect,t),this.nativeExtensionProvider&&this.canUseNative(t)?(a=new ir(this.config,this.browserStorage,this.browserCrypto,this.logger,this.eventHandler,this.navigationClient,e.ApiId.acquireTokenRedirect,this.performanceClient,this.nativeExtensionProvider,this.getNativeAccountId(t),this.nativeInternalStorage,t.correlationId),o=a.acquireTokenRedirect(t).catch((function(e){if(e instanceof nr&&e.isFatal())return c.nativeExtensionProvider=void 0,c.createRedirectClient(t.correlationId).acquireToken(t);if(e instanceof xe)return c.logger.verbose("acquireTokenRedirect - Resolving interaction required error thrown by native broker by falling back to web flow"),c.createRedirectClient(t.correlationId).acquireToken(t);throw c.browserStorage.setInteractionInProgress(!1),e}))):(s=this.createRedirectClient(t.correlationId),o=s.acquireToken(t)),[2,o.catch((function(t){throw n?c.eventHandler.emitEvent(e.EventType.ACQUIRE_TOKEN_FAILURE,e.InteractionType.Redirect,null,t):c.eventHandler.emitEvent(e.EventType.LOGIN_FAILURE,e.InteractionType.Redirect,null,t),t}))]}))}))},t.prototype.acquireTokenPopup=function(t){var r=this,n=this.getRequestCorrelationId(t),o=this.performanceClient.startMeasurement(e.PerformanceEvents.AcquireTokenPopup,n);try{this.logger.verbose("acquireTokenPopup called",n),this.preflightBrowserEnvironmentCheck(e.InteractionType.Popup)}catch(e){return Promise.reject(e)}var i,a=this.getAllAccounts();(a.length>0?this.eventHandler.emitEvent(e.EventType.ACQUIRE_TOKEN_START,e.InteractionType.Popup,t):this.eventHandler.emitEvent(e.EventType.LOGIN_START,e.InteractionType.Popup,t),this.canUseNative(t))?i=this.acquireTokenNative(t,e.ApiId.acquireTokenPopup).then((function(e){return r.browserStorage.setInteractionInProgress(!1),o.endMeasurement({success:!0,isNativeBroker:!0,accessTokenSize:e.accessToken.length,idTokenSize:e.idToken.length}),o.flushMeasurement(),e})).catch((function(e){if(e instanceof nr&&e.isFatal())return r.nativeExtensionProvider=void 0,r.createPopupClient(t.correlationId).acquireToken(t);if(e instanceof xe)return r.logger.verbose("acquireTokenPopup - Resolving interaction required error thrown by native broker by falling back to web flow"),r.createPopupClient(t.correlationId).acquireToken(t);throw r.browserStorage.setInteractionInProgress(!1),e})):i=this.createPopupClient(t.correlationId).acquireToken(t);return i.then((function(t){return a.length<r.getAllAccounts().length?r.eventHandler.emitEvent(e.EventType.LOGIN_SUCCESS,e.InteractionType.Popup,t):r.eventHandler.emitEvent(e.EventType.ACQUIRE_TOKEN_SUCCESS,e.InteractionType.Popup,t),o.endMeasurement({success:!0,accessTokenSize:t.accessToken.length,idTokenSize:t.idToken.length}),o.flushMeasurement(),t})).catch((function(t){return a.length>0?r.eventHandler.emitEvent(e.EventType.ACQUIRE_TOKEN_FAILURE,e.InteractionType.Popup,null,t):r.eventHandler.emitEvent(e.EventType.LOGIN_FAILURE,e.InteractionType.Popup,null,t),o.endMeasurement({errorCode:t.errorCode,subErrorCode:t.subError,success:!1}),o.flushMeasurement(),Promise.reject(t)}))},t.prototype.ssoSilent=function(t){return o(this,void 0,void 0,(function(){var r,o,a,s,c,u=this;return i(this,(function(i){return r=this.getRequestCorrelationId(t),o=n(n({},t),{prompt:w.NONE,correlationId:r}),this.preflightBrowserEnvironmentCheck(e.InteractionType.Silent),a=this.performanceClient.startMeasurement(e.PerformanceEvents.SsoSilent,r),this.logger.verbose("ssoSilent called",r),this.eventHandler.emitEvent(e.EventType.SSO_SILENT_START,e.InteractionType.Silent,o),this.canUseNative(o)?s=this.acquireTokenNative(o,e.ApiId.ssoSilent).catch((function(e){if(e instanceof nr&&e.isFatal())return u.nativeExtensionProvider=void 0,u.createSilentIframeClient(o.correlationId).acquireToken(o);throw e})):(c=this.createSilentIframeClient(o.correlationId),s=c.acquireToken(o)),[2,s.then((function(t){return u.eventHandler.emitEvent(e.EventType.SSO_SILENT_SUCCESS,e.InteractionType.Silent,t),a.endMeasurement({success:!0,isNativeBroker:t.fromNativeBroker,accessTokenSize:t.accessToken.length,idTokenSize:t.idToken.length}),a.flushMeasurement(),t})).catch((function(t){throw u.eventHandler.emitEvent(e.EventType.SSO_SILENT_FAILURE,e.InteractionType.Silent,null,t),a.endMeasurement({errorCode:t.errorCode,subErrorCode:t.subError,success:!1}),a.flushMeasurement(),t}))]}))}))},t.prototype.acquireTokenByCode=function(t){return o(this,void 0,void 0,(function(){var r,o,a,s,c=this;return i(this,(function(i){r=this.getRequestCorrelationId(t),this.preflightBrowserEnvironmentCheck(e.InteractionType.Silent),this.logger.trace("acquireTokenByCode called",r),this.eventHandler.emitEvent(e.EventType.ACQUIRE_TOKEN_BY_CODE_START,e.InteractionType.Silent,t),o=this.performanceClient.startMeasurement(e.PerformanceEvents.AcquireTokenByCode,t.correlationId);try{if(t.code)return a=t.code,(s=this.hybridAuthCodeResponses.get(a))?(this.logger.verbose("Existing acquireTokenByCode request found",t.correlationId),o.endMeasurement({success:!0}),o.discardMeasurement()):(this.logger.verbose("Initiating new acquireTokenByCode request",r),s=this.acquireTokenByCodeAsync(n(n({},t),{correlationId:r})).then((function(t){return c.eventHandler.emitEvent(e.EventType.ACQUIRE_TOKEN_BY_CODE_SUCCESS,e.InteractionType.Silent,t),c.hybridAuthCodeResponses.delete(a),o.endMeasurement({success:!0,accessTokenSize:t.accessToken.length,idTokenSize:t.idToken.length,isNativeBroker:t.fromNativeBroker}),o.flushMeasurement(),t})).catch((function(t){throw c.hybridAuthCodeResponses.delete(a),c.eventHandler.emitEvent(e.EventType.ACQUIRE_TOKEN_BY_CODE_FAILURE,e.InteractionType.Silent,null,t),o.endMeasurement({errorCode:t.errorCode,subErrorCode:t.subError,success:!1}),o.flushMeasurement(),t})),this.hybridAuthCodeResponses.set(a,s)),[2,s];if(t.nativeAccountId){if(this.canUseNative(t,t.nativeAccountId))return[2,this.acquireTokenNative(t,e.ApiId.acquireTokenByCode,t.nativeAccountId).catch((function(e){throw e instanceof nr&&e.isFatal()&&(c.nativeExtensionProvider=void 0),e}))];throw Rt.createUnableToAcquireTokenFromNativePlatformError()}throw Rt.createAuthCodeOrNativeAccountIdRequiredError()}catch(t){throw this.eventHandler.emitEvent(e.EventType.ACQUIRE_TOKEN_BY_CODE_FAILURE,e.InteractionType.Silent,null,t),o.endMeasurement({errorCode:t instanceof $&&t.errorCode||void 0,subErrorCode:t instanceof $&&t.subError||void 0,success:!1}),t}return[2]}))}))},t.prototype.acquireTokenByCodeAsync=function(e){return o(this,void 0,void 0,(function(){return i(this,(function(t){switch(t.label){case 0:return this.logger.trace("acquireTokenByCodeAsync called",e.correlationId),[4,this.createSilentAuthCodeClient(e.correlationId).acquireToken(e)];case 1:return[2,t.sent()]}}))}))},t.prototype.acquireTokenByRefreshToken=function(t){return o(this,void 0,void 0,(function(){var r,n=this;return i(this,(function(o){return Jt.blockReloadInHiddenIframes(),r=this.performanceClient.startMeasurement(e.PerformanceEvents.AcquireTokenByRefreshToken,t.correlationId),this.eventHandler.emitEvent(e.EventType.ACQUIRE_TOKEN_NETWORK_START,e.InteractionType.Silent,t),[2,this.createSilentRefreshClient(t.correlationId).acquireToken(t).then((function(e){return r.endMeasurement({success:!0,fromCache:e.fromCache,accessTokenSize:e.accessToken.length,idTokenSize:e.idToken.length}),e})).catch((function(e){var o=e instanceof Ae,i=e instanceof xe,a=e.errorCode===kt.INVALID_GRANT_ERROR;if(o&&a&&!i)return n.logger.verbose("Refresh token expired or invalid, attempting acquire token by iframe",t.correlationId),n.createSilentIframeClient(t.correlationId).acquireToken(t).then((function(e){return r.endMeasurement({success:!0,fromCache:e.fromCache,accessTokenSize:e.accessToken.length,idTokenSize:e.idToken.length}),e})).catch((function(e){throw r.endMeasurement({errorCode:e.errorCode,subErrorCode:e.subError,success:!1}),e}));throw r.endMeasurement({success:!1}),e}))]}))}))},t.prototype.logout=function(e){return o(this,void 0,void 0,(function(){var t;return i(this,(function(r){return t=this.getRequestCorrelationId(e),this.logger.warning("logout API is deprecated and will be removed in msal-browser v3.0.0. Use logoutRedirect instead.",t),[2,this.logoutRedirect(n({correlationId:t},e))]}))}))},t.prototype.logoutRedirect=function(t){return o(this,void 0,void 0,(function(){var r;return i(this,(function(n){return r=this.getRequestCorrelationId(t),this.preflightBrowserEnvironmentCheck(e.InteractionType.Redirect),[2,this.createRedirectClient(r).logout(t)]}))}))},t.prototype.logoutPopup=function(t){try{var r=this.getRequestCorrelationId(t);return this.preflightBrowserEnvironmentCheck(e.InteractionType.Popup),this.createPopupClient(r).logout(t)}catch(e){return Promise.reject(e)}},t.prototype.getAllAccounts=function(){return this.logger.verbose("getAllAccounts called"),this.isBrowserEnvironment?this.browserStorage.getAllAccounts():[]},t.prototype.getAccountByUsername=function(e){var t=this.getAllAccounts();return!ne.isEmpty(e)&&t&&t.length?(this.logger.verbose("Account matching username found, returning"),this.logger.verbosePii("Returning signed-in accounts matching username: "+e),t.filter((function(t){return t.username.toLowerCase()===e.toLowerCase()}))[0]||null):(this.logger.verbose("getAccountByUsername: No matching account found, returning null"),null)},t.prototype.getAccountByHomeId=function(e){var t=this.getAllAccounts();return!ne.isEmpty(e)&&t&&t.length?(this.logger.verbose("Account matching homeAccountId found, returning"),this.logger.verbosePii("Returning signed-in accounts matching homeAccountId: "+e),t.filter((function(t){return t.homeAccountId===e}))[0]||null):(this.logger.verbose("getAccountByHomeId: No matching account found, returning null"),null)},t.prototype.getAccountByLocalId=function(e){var t=this.getAllAccounts();return!ne.isEmpty(e)&&t&&t.length?(this.logger.verbose("Account matching localAccountId found, returning"),this.logger.verbosePii("Returning signed-in accounts matching localAccountId: "+e),t.filter((function(t){return t.localAccountId===e}))[0]||null):(this.logger.verbose("getAccountByLocalId: No matching account found, returning null"),null)},t.prototype.setActiveAccount=function(e){this.browserStorage.setActiveAccount(e)},t.prototype.getActiveAccount=function(){return this.browserStorage.getActiveAccount()},t.prototype.preflightBrowserEnvironmentCheck=function(t,r){if(void 0===r&&(r=!0),this.logger.verbose("preflightBrowserEnvironmentCheck started"),Jt.blockNonBrowserEnvironment(this.isBrowserEnvironment),Jt.blockRedirectInIframe(t,this.config.system.allowRedirectInIframe),Jt.blockReloadInHiddenIframes(),Jt.blockAcquireTokenInPopups(),Jt.blockNativeBrokerCalledBeforeInitialized(this.config.system.allowNativeBroker,this.initialized),t===e.InteractionType.Redirect&&this.config.cache.cacheLocation===e.BrowserCacheLocation.MemoryStorage&&!this.config.cache.storeAuthStateInCookie)throw xt.createInMemoryRedirectUnavailableError();t!==e.InteractionType.Redirect&&t!==e.InteractionType.Popup||this.preflightInteractiveRequest(r)},t.prototype.preflightInteractiveRequest=function(e){this.logger.verbose("preflightInteractiveRequest called, validating app environment"),Jt.blockReloadInHiddenIframes(),e&&this.browserStorage.setInteractionInProgress(!0)},t.prototype.acquireTokenNative=function(e,t,r){return o(this,void 0,void 0,(function(){return i(this,(function(n){if(this.logger.trace("acquireTokenNative called"),!this.nativeExtensionProvider)throw Rt.createNativeConnectionNotEstablishedError();return[2,new ir(this.config,this.browserStorage,this.browserCrypto,this.logger,this.eventHandler,this.navigationClient,t,this.performanceClient,this.nativeExtensionProvider,r||this.getNativeAccountId(e),this.nativeInternalStorage,e.correlationId).acquireToken(e)]}))}))},t.prototype.canUseNative=function(e,t){if(this.logger.trace("canUseNative called"),!ar.isNativeAvailable(this.config,this.logger,this.nativeExtensionProvider,e.authenticationScheme))return this.logger.trace("canUseNative: isNativeAvailable returned false, returning false"),!1;if(e.prompt)switch(e.prompt){case w.NONE:case w.CONSENT:case w.LOGIN:this.logger.trace("canUseNative: prompt is compatible with native flow");break;default:return this.logger.trace("canUseNative: prompt = "+e.prompt+" is not compatible with native flow, returning false"),!1}return!(!t&&!this.getNativeAccountId(e))||(this.logger.trace("canUseNative: nativeAccountId is not available, returning false"),!1)},t.prototype.getNativeAccountId=function(e){var t=e.account||this.browserStorage.getAccountInfoByHints(e.loginHint,e.sid)||this.getActiveAccount();return t&&t.nativeAccountId||""},t.prototype.createPopupClient=function(e){return new cr(this.config,this.browserStorage,this.browserCrypto,this.logger,this.eventHandler,this.navigationClient,this.performanceClient,this.nativeInternalStorage,this.nativeExtensionProvider,e)},t.prototype.createRedirectClient=function(e){return new sr(this.config,this.browserStorage,this.browserCrypto,this.logger,this.eventHandler,this.navigationClient,this.performanceClient,this.nativeInternalStorage,this.nativeExtensionProvider,e)},t.prototype.createSilentIframeClient=function(t){return new pr(this.config,this.browserStorage,this.browserCrypto,this.logger,this.eventHandler,this.navigationClient,e.ApiId.ssoSilent,this.performanceClient,this.nativeInternalStorage,this.nativeExtensionProvider,t)},t.prototype.createSilentCacheClient=function(e){return new or(this.config,this.browserStorage,this.browserCrypto,this.logger,this.eventHandler,this.navigationClient,this.performanceClient,this.nativeExtensionProvider,e)},t.prototype.createSilentRefreshClient=function(e){return new gr(this.config,this.browserStorage,this.browserCrypto,this.logger,this.eventHandler,this.navigationClient,this.performanceClient,this.nativeExtensionProvider,e)},t.prototype.createSilentAuthCodeClient=function(t){return new Pr(this.config,this.browserStorage,this.browserCrypto,this.logger,this.eventHandler,this.navigationClient,e.ApiId.acquireTokenByCode,this.performanceClient,this.nativeExtensionProvider,t)},t.prototype.addEventCallback=function(e){return this.eventHandler.addEventCallback(e)},t.prototype.removeEventCallback=function(e){this.eventHandler.removeEventCallback(e)},t.prototype.addPerformanceCallback=function(e){return this.performanceClient.addPerformanceCallback(e)},t.prototype.removePerformanceCallback=function(e){return this.performanceClient.removePerformanceCallback(e)},t.prototype.enableAccountStorageEvents=function(){this.eventHandler.enableAccountStorageEvents()},t.prototype.disableAccountStorageEvents=function(){this.eventHandler.disableAccountStorageEvents()},t.prototype.getTokenCache=function(){return this.tokenCache},t.prototype.getLogger=function(){return this.logger},t.prototype.setLogger=function(e){this.logger=e},t.prototype.initializeWrapperLibrary=function(e,t){this.browserStorage.setWrapperMetadata(e,t)},t.prototype.setNavigationClient=function(e){this.navigationClient=e},t.prototype.getConfiguration=function(){return this.config},t.prototype.getRequestCorrelationId=function(e){return(null==e?void 0:e.correlationId)?e.correlationId:this.isBrowserEnvironment?this.browserCrypto.createNewGuid():E.EMPTY_STRING},t}(),qr=function(t){function a(e){var r=t.call(this,e)||this;return r.activeSilentTokenRequests=new Map,r}return r(a,t),a.prototype.loginRedirect=function(e){return o(this,void 0,void 0,(function(){var t;return i(this,(function(r){return t=this.getRequestCorrelationId(e),this.logger.verbose("loginRedirect called",t),[2,this.acquireTokenRedirect(n({correlationId:t},e||Ut))]}))}))},a.prototype.loginPopup=function(e){var t=this.getRequestCorrelationId(e);return this.logger.verbose("loginPopup called",t),this.acquireTokenPopup(n({correlationId:t},e||Ut))},a.prototype.acquireTokenSilent=function(t){return o(this,void 0,void 0,(function(){var r,o,a,s,c,u,l,d=this;return i(this,(function(i){if(r=this.getRequestCorrelationId(t),o=this.performanceClient.startMeasurement(e.PerformanceEvents.AcquireTokenSilent,r),this.preflightBrowserEnvironmentCheck(e.InteractionType.Silent),this.logger.verbose("acquireTokenSilent called",r),!(a=t.account||this.getActiveAccount()))throw Rt.createNoAccountError();return s={clientId:this.config.auth.clientId,authority:t.authority||E.EMPTY_STRING,scopes:t.scopes,homeAccountIdentifier:a.homeAccountId,claims:t.claims,authenticationScheme:t.authenticationScheme,resourceRequestMethod:t.resourceRequestMethod,resourceRequestUri:t.resourceRequestUri,shrClaims:t.shrClaims,sshKid:t.sshKid},c=JSON.stringify(s),void 0===(u=this.activeSilentTokenRequests.get(c))?(this.logger.verbose("acquireTokenSilent called for the first time, storing active request",r),l=this.acquireTokenSilentAsync(n(n({},t),{correlationId:r}),a).then((function(e){return d.activeSilentTokenRequests.delete(c),o.endMeasurement({success:!0,fromCache:e.fromCache,accessTokenSize:e.accessToken.length,idTokenSize:e.idToken.length,isNativeBroker:e.fromNativeBroker}),o.flushMeasurement(),e})).catch((function(e){throw d.activeSilentTokenRequests.delete(c),o.endMeasurement({success:!1}),o.flushMeasurement(),e})),this.activeSilentTokenRequests.set(c,l),[2,l]):(this.logger.verbose("acquireTokenSilent has been called previously, returning the result from the first call",r),o.endMeasurement({success:!0}),o.discardMeasurement(),[2,u])}))}))},a.prototype.acquireTokenSilentAsync=function(t,r){return o(this,void 0,void 0,(function(){var a,s,c,u,l,d=this;return i(this,(function(h){switch(h.label){case 0:return this.eventHandler.emitEvent(e.EventType.ACQUIRE_TOKEN_START,e.InteractionType.Silent,t),a=this.performanceClient.startMeasurement(e.PerformanceEvents.AcquireTokenSilentAsync,t.correlationId),ar.isNativeAvailable(this.config,this.logger,this.nativeExtensionProvider,t.authenticationScheme)&&r.nativeAccountId?(this.logger.verbose("acquireTokenSilent - attempting to acquire token from native platform"),c=n(n({},t),{account:r}),s=this.acquireTokenNative(c,e.ApiId.acquireTokenSilent_silentFlow).catch((function(e){return o(d,void 0,void 0,(function(){return i(this,(function(r){if(e instanceof nr&&e.isFatal())return this.logger.verbose("acquireTokenSilent - native platform unavailable, falling back to web flow"),this.nativeExtensionProvider=void 0,[2,this.createSilentIframeClient(t.correlationId).acquireToken(t)];throw e}))}))})),[3,3]):[3,1];case 1:return this.logger.verbose("acquireTokenSilent - attempting to acquire token from web flow"),[4,(u=this.createSilentCacheClient(t.correlationId)).initializeSilentRequest(t,r)];case 2:l=h.sent(),s=u.acquireToken(l).catch((function(){return o(d,void 0,void 0,(function(){return i(this,(function(e){return[2,this.acquireTokenByRefreshToken(l)]}))}))})),h.label=3;case 3:return[2,s.then((function(t){return d.eventHandler.emitEvent(e.EventType.ACQUIRE_TOKEN_SUCCESS,e.InteractionType.Silent,t),a.endMeasurement({success:!0,fromCache:t.fromCache,accessTokenSize:t.accessToken.length,idTokenSize:t.idToken.length,isNativeBroker:t.fromNativeBroker}),t})).catch((function(t){throw d.eventHandler.emitEvent(e.EventType.ACQUIRE_TOKEN_FAILURE,e.InteractionType.Silent,null,t),a.endMeasurement({errorCode:t.errorCode,subErrorCode:t.subError,success:!1}),t}))]}}))}))},a}(Ur),Hr={initialize:function(){return Promise.reject(xt.createStubPcaInstanceCalledError())},acquireTokenPopup:function(){return Promise.reject(xt.createStubPcaInstanceCalledError())},acquireTokenRedirect:function(){return Promise.reject(xt.createStubPcaInstanceCalledError())},acquireTokenSilent:function(){return Promise.reject(xt.createStubPcaInstanceCalledError())},acquireTokenByCode:function(){return Promise.reject(xt.createStubPcaInstanceCalledError())},getAllAccounts:function(){return[]},getAccountByHomeId:function(){return null},getAccountByUsername:function(){return null},getAccountByLocalId:function(){return null},handleRedirectPromise:function(){return Promise.reject(xt.createStubPcaInstanceCalledError())},loginPopup:function(){return Promise.reject(xt.createStubPcaInstanceCalledError())},loginRedirect:function(){return Promise.reject(xt.createStubPcaInstanceCalledError())},logout:function(){return Promise.reject(xt.createStubPcaInstanceCalledError())},logoutRedirect:function(){return Promise.reject(xt.createStubPcaInstanceCalledError())},logoutPopup:function(){return Promise.reject(xt.createStubPcaInstanceCalledError())},ssoSilent:function(){return Promise.reject(xt.createStubPcaInstanceCalledError())},addEventCallback:function(){return null},removeEventCallback:function(){},addPerformanceCallback:function(){return""},removePerformanceCallback:function(){return!1},enableAccountStorageEvents:function(){},disableAccountStorageEvents:function(){},getTokenCache:function(){throw xt.createStubPcaInstanceCalledError()},getLogger:function(){throw xt.createStubPcaInstanceCalledError()},setLogger:function(){},setActiveAccount:function(){},getActiveAccount:function(){return null},initializeWrapperLibrary:function(){},setNavigationClient:function(){},getConfiguration:function(){throw xt.createStubPcaInstanceCalledError()}},Lr=function(){function t(){}return t.getInteractionStatusFromEvent=function(t,r){switch(t.eventType){case e.EventType.LOGIN_START:return e.InteractionStatus.Login;case e.EventType.SSO_SILENT_START:return e.InteractionStatus.SsoSilent;case e.EventType.ACQUIRE_TOKEN_START:if(t.interactionType===e.InteractionType.Redirect||t.interactionType===e.InteractionType.Popup)return e.InteractionStatus.AcquireToken;break;case e.EventType.HANDLE_REDIRECT_START:return e.InteractionStatus.HandleRedirect;case e.EventType.LOGOUT_START:return e.InteractionStatus.Logout;case e.EventType.SSO_SILENT_SUCCESS:case e.EventType.SSO_SILENT_FAILURE:if(r&&r!==e.InteractionStatus.SsoSilent)break;return e.InteractionStatus.None;case e.EventType.LOGOUT_END:if(r&&r!==e.InteractionStatus.Logout)break;return e.InteractionStatus.None;case e.EventType.HANDLE_REDIRECT_END:if(r&&r!==e.InteractionStatus.HandleRedirect)break;return e.InteractionStatus.None;case e.EventType.LOGIN_SUCCESS:case e.EventType.LOGIN_FAILURE:case e.EventType.ACQUIRE_TOKEN_SUCCESS:case e.EventType.ACQUIRE_TOKEN_FAILURE:if(t.interactionType===e.InteractionType.Redirect||t.interactionType===e.InteractionType.Popup){if(r&&r!==e.InteractionStatus.Login&&r!==e.InteractionStatus.AcquireToken)break;return e.InteractionStatus.None}}return null},t}(),Dr=function(){function e(e,t){var r=t&&t.loggerOptions||{};this.logger=new ie(r,jt,Yt),this.cryptoOps=new Rr(this.logger),this.popTokenGenerator=new Ye(this.cryptoOps),this.shrParameters=e}return e.prototype.generatePublicKeyThumbprint=function(){return o(this,void 0,void 0,(function(){return i(this,(function(e){switch(e.label){case 0:return[4,this.popTokenGenerator.generateKid(this.shrParameters)];case 1:return[2,e.sent().kid]}}))}))},e.prototype.signRequest=function(e,t,r){return o(this,void 0,void 0,(function(){return i(this,(function(n){return[2,this.popTokenGenerator.signPayload(e,t,this.shrParameters,r)]}))}))},e.prototype.removeKeys=function(e){return o(this,void 0,void 0,(function(){return i(this,(function(t){switch(t.label){case 0:return[4,this.cryptoOps.removeTokenBindingKey(e)];case 1:return[2,t.sent()]}}))}))},e}();e.AccountEntity=ge,e.AuthError=$,e.AuthErrorMessage=Z,e.AuthenticationHeaderParser=Tt,e.BrowserAuthError=Rt,e.BrowserAuthErrorMessage=bt,e.BrowserConfigurationAuthError=xt,e.BrowserConfigurationAuthErrorMessage=Ft,e.BrowserUtils=Jt,e.ClientAuthError=re,e.ClientAuthErrorMessage=te,e.ClientConfigurationError=le,e.ClientConfigurationErrorMessage=ue,e.DEFAULT_IFRAME_TIMEOUT_MS=lr,e.EventMessageUtils=Lr,e.InteractionRequiredAuthError=xe,e.InteractionRequiredAuthErrorMessage=Fe,e.Logger=ie,e.NavigationClient=ur,e.OIDC_DEFAULT_SCOPES=C,e.PublicClientApplication=qr,e.ServerError=Ae,e.SignedHttpRequest=Dr,e.StringUtils=ne,e.UrlString=Ge,e.internals=mr,e.stubbedPublicClientApplication=Hr,e.version=Yt,Object.defineProperty(e,"__esModule",{value:!0})}));
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
'use strict';

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

/*! *****************************************************************************
Copyright (c) Microsoft Corporation.

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.

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.
***************************************************************************** */
/* global Reflect, Promise */

var extendStatics$1 = function(d, b) {
    extendStatics$1 = Object.setPrototypeOf ||
        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
    return extendStatics$1(d, b);
};

function __extends$1(d, b) {
    extendStatics$1(d, b);
    function __() { this.constructor = d; }
    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}

var __assign$1 = function() {
    __assign$1 = Object.assign || function __assign(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
            s = arguments[i];
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
        }
        return t;
    };
    return __assign$1.apply(this, arguments);
};

function __rest(s, e) {
    var t = {};
    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
        t[p] = s[p];
    if (s != null && typeof Object.getOwnPropertySymbols === "function")
        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
                t[p[i]] = s[p[i]];
        }
    return t;
}

function __awaiter$1(thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
}

function __generator$1(thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
}

function __read(o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
}

function __spread() {
    for (var ar = [], i = 0; i < arguments.length; i++)
        ar = ar.concat(__read(arguments[i]));
    return ar;
}

/*! @azure/msal-common v7.3.0 2022-08-01 */
/*! *****************************************************************************
Copyright (c) Microsoft Corporation.

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.

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.
***************************************************************************** */
/* global Reflect, Promise */

var extendStatics = function(d, b) {
    extendStatics = Object.setPrototypeOf ||
        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
    return extendStatics(d, b);
};

function __extends(d, b) {
    extendStatics(d, b);
    function __() { this.constructor = d; }
    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}

var __assign = function() {
    __assign = Object.assign || function __assign(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
            s = arguments[i];
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
        }
        return t;
    };
    return __assign.apply(this, arguments);
};

function __awaiter(thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
}

function __generator(thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
}

function __spreadArrays() {
    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
    for (var r = Array(s), k = 0, i = 0; i < il; i++)
        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
            r[k] = a[j];
    return r;
}

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var Constants = {
    LIBRARY_NAME: "MSAL.JS",
    SKU: "msal.js.common",
    // Prefix for all library cache entries
    CACHE_PREFIX: "msal",
    // default authority
    DEFAULT_AUTHORITY: "https://login.microsoftonline.com/common/",
    DEFAULT_AUTHORITY_HOST: "login.microsoftonline.com",
    DEFAULT_COMMON_TENANT: "common",
    // ADFS String
    ADFS: "adfs",
    // Default AAD Instance Discovery Endpoint
    AAD_INSTANCE_DISCOVERY_ENDPT: "https://login.microsoftonline.com/common/discovery/instance?api-version=1.1&authorization_endpoint=",
    // Resource delimiter - used for certain cache entries
    RESOURCE_DELIM: "|",
    // Placeholder for non-existent account ids/objects
    NO_ACCOUNT: "NO_ACCOUNT",
    // Claims
    CLAIMS: "claims",
    // Consumer UTID
    CONSUMER_UTID: "9188040d-6c67-4c5b-b112-36a304b66dad",
    // Default scopes
    OPENID_SCOPE: "openid",
    PROFILE_SCOPE: "profile",
    OFFLINE_ACCESS_SCOPE: "offline_access",
    EMAIL_SCOPE: "email",
    // Default response type for authorization code flow
    CODE_RESPONSE_TYPE: "code",
    CODE_GRANT_TYPE: "authorization_code",
    RT_GRANT_TYPE: "refresh_token",
    FRAGMENT_RESPONSE_MODE: "fragment",
    S256_CODE_CHALLENGE_METHOD: "S256",
    URL_FORM_CONTENT_TYPE: "application/x-www-form-urlencoded;charset=utf-8",
    AUTHORIZATION_PENDING: "authorization_pending",
    NOT_DEFINED: "not_defined",
    EMPTY_STRING: "",
    FORWARD_SLASH: "/",
    IMDS_ENDPOINT: "http://169.254.169.254/metadata/instance/compute/location",
    IMDS_VERSION: "2020-06-01",
    IMDS_TIMEOUT: 2000,
    AZURE_REGION_AUTO_DISCOVER_FLAG: "TryAutoDetect",
    REGIONAL_AUTH_PUBLIC_CLOUD_SUFFIX: "login.microsoft.com",
    KNOWN_PUBLIC_CLOUDS: ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"],
    TOKEN_RESPONSE_TYPE: "token",
    ID_TOKEN_RESPONSE_TYPE: "id_token",
    SHR_NONCE_VALIDITY: 240,
};
var OIDC_DEFAULT_SCOPES = [
    Constants.OPENID_SCOPE,
    Constants.PROFILE_SCOPE,
    Constants.OFFLINE_ACCESS_SCOPE
];
var OIDC_SCOPES = __spreadArrays(OIDC_DEFAULT_SCOPES, [
    Constants.EMAIL_SCOPE
]);
/**
 * Request header names
 */
var HeaderNames;
(function (HeaderNames) {
    HeaderNames["CONTENT_TYPE"] = "Content-Type";
    HeaderNames["RETRY_AFTER"] = "Retry-After";
    HeaderNames["CCS_HEADER"] = "X-AnchorMailbox";
    HeaderNames["WWWAuthenticate"] = "WWW-Authenticate";
    HeaderNames["AuthenticationInfo"] = "Authentication-Info";
})(HeaderNames || (HeaderNames = {}));
/**
 * Persistent cache keys MSAL which stay while user is logged in.
 */
var PersistentCacheKeys;
(function (PersistentCacheKeys) {
    PersistentCacheKeys["ID_TOKEN"] = "idtoken";
    PersistentCacheKeys["CLIENT_INFO"] = "client.info";
    PersistentCacheKeys["ADAL_ID_TOKEN"] = "adal.idtoken";
    PersistentCacheKeys["ERROR"] = "error";
    PersistentCacheKeys["ERROR_DESC"] = "error.description";
    PersistentCacheKeys["ACTIVE_ACCOUNT"] = "active-account";
    PersistentCacheKeys["ACTIVE_ACCOUNT_FILTERS"] = "active-account-filters"; // new cache entry for active_account for a more robust version for browser
})(PersistentCacheKeys || (PersistentCacheKeys = {}));
/**
 * String constants related to AAD Authority
 */
var AADAuthorityConstants;
(function (AADAuthorityConstants) {
    AADAuthorityConstants["COMMON"] = "common";
    AADAuthorityConstants["ORGANIZATIONS"] = "organizations";
    AADAuthorityConstants["CONSUMERS"] = "consumers";
})(AADAuthorityConstants || (AADAuthorityConstants = {}));
/**
 * Keys in the hashParams sent by AAD Server
 */
var AADServerParamKeys;
(function (AADServerParamKeys) {
    AADServerParamKeys["CLIENT_ID"] = "client_id";
    AADServerParamKeys["REDIRECT_URI"] = "redirect_uri";
    AADServerParamKeys["RESPONSE_TYPE"] = "response_type";
    AADServerParamKeys["RESPONSE_MODE"] = "response_mode";
    AADServerParamKeys["GRANT_TYPE"] = "grant_type";
    AADServerParamKeys["CLAIMS"] = "claims";
    AADServerParamKeys["SCOPE"] = "scope";
    AADServerParamKeys["ERROR"] = "error";
    AADServerParamKeys["ERROR_DESCRIPTION"] = "error_description";
    AADServerParamKeys["ACCESS_TOKEN"] = "access_token";
    AADServerParamKeys["ID_TOKEN"] = "id_token";
    AADServerParamKeys["REFRESH_TOKEN"] = "refresh_token";
    AADServerParamKeys["EXPIRES_IN"] = "expires_in";
    AADServerParamKeys["STATE"] = "state";
    AADServerParamKeys["NONCE"] = "nonce";
    AADServerParamKeys["PROMPT"] = "prompt";
    AADServerParamKeys["SESSION_STATE"] = "session_state";
    AADServerParamKeys["CLIENT_INFO"] = "client_info";
    AADServerParamKeys["CODE"] = "code";
    AADServerParamKeys["CODE_CHALLENGE"] = "code_challenge";
    AADServerParamKeys["CODE_CHALLENGE_METHOD"] = "code_challenge_method";
    AADServerParamKeys["CODE_VERIFIER"] = "code_verifier";
    AADServerParamKeys["CLIENT_REQUEST_ID"] = "client-request-id";
    AADServerParamKeys["X_CLIENT_SKU"] = "x-client-SKU";
    AADServerParamKeys["X_CLIENT_VER"] = "x-client-VER";
    AADServerParamKeys["X_CLIENT_OS"] = "x-client-OS";
    AADServerParamKeys["X_CLIENT_CPU"] = "x-client-CPU";
    AADServerParamKeys["X_CLIENT_CURR_TELEM"] = "x-client-current-telemetry";
    AADServerParamKeys["X_CLIENT_LAST_TELEM"] = "x-client-last-telemetry";
    AADServerParamKeys["X_MS_LIB_CAPABILITY"] = "x-ms-lib-capability";
    AADServerParamKeys["X_APP_NAME"] = "x-app-name";
    AADServerParamKeys["X_APP_VER"] = "x-app-ver";
    AADServerParamKeys["POST_LOGOUT_URI"] = "post_logout_redirect_uri";
    AADServerParamKeys["ID_TOKEN_HINT"] = "id_token_hint";
    AADServerParamKeys["DEVICE_CODE"] = "device_code";
    AADServerParamKeys["CLIENT_SECRET"] = "client_secret";
    AADServerParamKeys["CLIENT_ASSERTION"] = "client_assertion";
    AADServerParamKeys["CLIENT_ASSERTION_TYPE"] = "client_assertion_type";
    AADServerParamKeys["TOKEN_TYPE"] = "token_type";
    AADServerParamKeys["REQ_CNF"] = "req_cnf";
    AADServerParamKeys["OBO_ASSERTION"] = "assertion";
    AADServerParamKeys["REQUESTED_TOKEN_USE"] = "requested_token_use";
    AADServerParamKeys["ON_BEHALF_OF"] = "on_behalf_of";
    AADServerParamKeys["FOCI"] = "foci";
    AADServerParamKeys["CCS_HEADER"] = "X-AnchorMailbox";
    AADServerParamKeys["RETURN_SPA_CODE"] = "return_spa_code";
    AADServerParamKeys["NATIVE_BROKER"] = "nativebroker";
    AADServerParamKeys["LOGOUT_HINT"] = "logout_hint";
})(AADServerParamKeys || (AADServerParamKeys = {}));
/**
 * Claims request keys
 */
var ClaimsRequestKeys;
(function (ClaimsRequestKeys) {
    ClaimsRequestKeys["ACCESS_TOKEN"] = "access_token";
    ClaimsRequestKeys["XMS_CC"] = "xms_cc";
})(ClaimsRequestKeys || (ClaimsRequestKeys = {}));
/**
 * we considered making this "enum" in the request instead of string, however it looks like the allowed list of
 * prompt values kept changing over past couple of years. There are some undocumented prompt values for some
 * internal partners too, hence the choice of generic "string" type instead of the "enum"
 */
var PromptValue = {
    LOGIN: "login",
    SELECT_ACCOUNT: "select_account",
    CONSENT: "consent",
    NONE: "none",
    CREATE: "create"
};
/**
 * SSO Types - generated to populate hints
 */
var SSOTypes;
(function (SSOTypes) {
    SSOTypes["ACCOUNT"] = "account";
    SSOTypes["SID"] = "sid";
    SSOTypes["LOGIN_HINT"] = "login_hint";
    SSOTypes["ID_TOKEN"] = "id_token";
    SSOTypes["DOMAIN_HINT"] = "domain_hint";
    SSOTypes["ORGANIZATIONS"] = "organizations";
    SSOTypes["CONSUMERS"] = "consumers";
    SSOTypes["ACCOUNT_ID"] = "accountIdentifier";
    SSOTypes["HOMEACCOUNT_ID"] = "homeAccountIdentifier";
})(SSOTypes || (SSOTypes = {}));
/**
 * allowed values for codeVerifier
 */
var CodeChallengeMethodValues = {
    PLAIN: "plain",
    S256: "S256"
};
/**
 * allowed values for response_mode
 */
var ResponseMode;
(function (ResponseMode) {
    ResponseMode["QUERY"] = "query";
    ResponseMode["FRAGMENT"] = "fragment";
    ResponseMode["FORM_POST"] = "form_post";
})(ResponseMode || (ResponseMode = {}));
/**
 * allowed grant_type
 */
var GrantType;
(function (GrantType) {
    GrantType["IMPLICIT_GRANT"] = "implicit";
    GrantType["AUTHORIZATION_CODE_GRANT"] = "authorization_code";
    GrantType["CLIENT_CREDENTIALS_GRANT"] = "client_credentials";
    GrantType["RESOURCE_OWNER_PASSWORD_GRANT"] = "password";
    GrantType["REFRESH_TOKEN_GRANT"] = "refresh_token";
    GrantType["DEVICE_CODE_GRANT"] = "device_code";
    GrantType["JWT_BEARER"] = "urn:ietf:params:oauth:grant-type:jwt-bearer";
})(GrantType || (GrantType = {}));
/**
 * Account types in Cache
 */
var CacheAccountType;
(function (CacheAccountType) {
    CacheAccountType["MSSTS_ACCOUNT_TYPE"] = "MSSTS";
    CacheAccountType["ADFS_ACCOUNT_TYPE"] = "ADFS";
    CacheAccountType["MSAV1_ACCOUNT_TYPE"] = "MSA";
    CacheAccountType["GENERIC_ACCOUNT_TYPE"] = "Generic"; // NTLM, Kerberos, FBA, Basic etc
})(CacheAccountType || (CacheAccountType = {}));
/**
 * Separators used in cache
 */
var Separators;
(function (Separators) {
    Separators["CACHE_KEY_SEPARATOR"] = "-";
    Separators["CLIENT_INFO_SEPARATOR"] = ".";
})(Separators || (Separators = {}));
/**
 * Credential Type stored in the cache
 */
var CredentialType;
(function (CredentialType) {
    CredentialType["ID_TOKEN"] = "IdToken";
    CredentialType["ACCESS_TOKEN"] = "AccessToken";
    CredentialType["ACCESS_TOKEN_WITH_AUTH_SCHEME"] = "AccessToken_With_AuthScheme";
    CredentialType["REFRESH_TOKEN"] = "RefreshToken";
})(CredentialType || (CredentialType = {}));
/**
 * Credential Type stored in the cache
 */
var CacheSchemaType;
(function (CacheSchemaType) {
    CacheSchemaType["ACCOUNT"] = "Account";
    CacheSchemaType["CREDENTIAL"] = "Credential";
    CacheSchemaType["ID_TOKEN"] = "IdToken";
    CacheSchemaType["ACCESS_TOKEN"] = "AccessToken";
    CacheSchemaType["REFRESH_TOKEN"] = "RefreshToken";
    CacheSchemaType["APP_METADATA"] = "AppMetadata";
    CacheSchemaType["TEMPORARY"] = "TempCache";
    CacheSchemaType["TELEMETRY"] = "Telemetry";
    CacheSchemaType["UNDEFINED"] = "Undefined";
    CacheSchemaType["THROTTLING"] = "Throttling";
})(CacheSchemaType || (CacheSchemaType = {}));
/**
 * Combine all cache types
 */
var CacheType;
(function (CacheType) {
    CacheType[CacheType["ADFS"] = 1001] = "ADFS";
    CacheType[CacheType["MSA"] = 1002] = "MSA";
    CacheType[CacheType["MSSTS"] = 1003] = "MSSTS";
    CacheType[CacheType["GENERIC"] = 1004] = "GENERIC";
    CacheType[CacheType["ACCESS_TOKEN"] = 2001] = "ACCESS_TOKEN";
    CacheType[CacheType["REFRESH_TOKEN"] = 2002] = "REFRESH_TOKEN";
    CacheType[CacheType["ID_TOKEN"] = 2003] = "ID_TOKEN";
    CacheType[CacheType["APP_METADATA"] = 3001] = "APP_METADATA";
    CacheType[CacheType["UNDEFINED"] = 9999] = "UNDEFINED";
})(CacheType || (CacheType = {}));
/**
 * More Cache related constants
 */
var APP_METADATA = "appmetadata";
var CLIENT_INFO = "client_info";
var THE_FAMILY_ID = "1";
var AUTHORITY_METADATA_CONSTANTS = {
    CACHE_KEY: "authority-metadata",
    REFRESH_TIME_SECONDS: 3600 * 24 // 24 Hours
};
var AuthorityMetadataSource;
(function (AuthorityMetadataSource) {
    AuthorityMetadataSource["CONFIG"] = "config";
    AuthorityMetadataSource["CACHE"] = "cache";
    AuthorityMetadataSource["NETWORK"] = "network";
    AuthorityMetadataSource["HARDCODED_VALUES"] = "hardcoded_values";
})(AuthorityMetadataSource || (AuthorityMetadataSource = {}));
var SERVER_TELEM_CONSTANTS = {
    SCHEMA_VERSION: 5,
    MAX_CUR_HEADER_BYTES: 80,
    MAX_LAST_HEADER_BYTES: 330,
    MAX_CACHED_ERRORS: 50,
    CACHE_KEY: "server-telemetry",
    CATEGORY_SEPARATOR: "|",
    VALUE_SEPARATOR: ",",
    OVERFLOW_TRUE: "1",
    OVERFLOW_FALSE: "0",
    UNKNOWN_ERROR: "unknown_error"
};
/**
 * Type of the authentication request
 */
exports.AuthenticationScheme = void 0;
(function (AuthenticationScheme) {
    AuthenticationScheme["BEARER"] = "Bearer";
    AuthenticationScheme["POP"] = "pop";
    AuthenticationScheme["SSH"] = "ssh-cert";
})(exports.AuthenticationScheme || (exports.AuthenticationScheme = {}));
/**
 * Constants related to throttling
 */
var ThrottlingConstants = {
    // Default time to throttle RequestThumbprint in seconds
    DEFAULT_THROTTLE_TIME_SECONDS: 60,
    // Default maximum time to throttle in seconds, overrides what the server sends back
    DEFAULT_MAX_THROTTLE_TIME_SECONDS: 3600,
    // Prefix for storing throttling entries
    THROTTLING_PREFIX: "throttling",
    // Value assigned to the x-ms-lib-capability header to indicate to the server the library supports throttling
    X_MS_LIB_CAPABILITY_VALUE: "retry-after, h429"
};
var Errors = {
    INVALID_GRANT_ERROR: "invalid_grant",
    CLIENT_MISMATCH_ERROR: "client_mismatch",
};
/**
 * Password grant parameters
 */
var PasswordGrantConstants;
(function (PasswordGrantConstants) {
    PasswordGrantConstants["username"] = "username";
    PasswordGrantConstants["password"] = "password";
})(PasswordGrantConstants || (PasswordGrantConstants = {}));
/**
 * Response codes
 */
var ResponseCodes;
(function (ResponseCodes) {
    ResponseCodes[ResponseCodes["httpSuccess"] = 200] = "httpSuccess";
    ResponseCodes[ResponseCodes["httpBadRequest"] = 400] = "httpBadRequest";
})(ResponseCodes || (ResponseCodes = {}));
/**
 * Region Discovery Sources
 */
var RegionDiscoverySources;
(function (RegionDiscoverySources) {
    RegionDiscoverySources["FAILED_AUTO_DETECTION"] = "1";
    RegionDiscoverySources["INTERNAL_CACHE"] = "2";
    RegionDiscoverySources["ENVIRONMENT_VARIABLE"] = "3";
    RegionDiscoverySources["IMDS"] = "4";
})(RegionDiscoverySources || (RegionDiscoverySources = {}));
/**
 * Region Discovery Outcomes
 */
var RegionDiscoveryOutcomes;
(function (RegionDiscoveryOutcomes) {
    RegionDiscoveryOutcomes["CONFIGURED_MATCHES_DETECTED"] = "1";
    RegionDiscoveryOutcomes["CONFIGURED_NO_AUTO_DETECTION"] = "2";
    RegionDiscoveryOutcomes["CONFIGURED_NOT_DETECTED"] = "3";
    RegionDiscoveryOutcomes["AUTO_DETECTION_REQUESTED_SUCCESSFUL"] = "4";
    RegionDiscoveryOutcomes["AUTO_DETECTION_REQUESTED_FAILED"] = "5";
})(RegionDiscoveryOutcomes || (RegionDiscoveryOutcomes = {}));
var CacheOutcome;
(function (CacheOutcome) {
    CacheOutcome["NO_CACHE_HIT"] = "0";
    CacheOutcome["FORCE_REFRESH"] = "1";
    CacheOutcome["NO_CACHED_ACCESS_TOKEN"] = "2";
    CacheOutcome["CACHED_ACCESS_TOKEN_EXPIRED"] = "3";
    CacheOutcome["REFRESH_CACHED_ACCESS_TOKEN"] = "4";
})(CacheOutcome || (CacheOutcome = {}));
var JsonTypes;
(function (JsonTypes) {
    JsonTypes["Jwt"] = "JWT";
    JsonTypes["Jwk"] = "JWK";
})(JsonTypes || (JsonTypes = {}));

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * AuthErrorMessage class containing string constants used by error codes and messages.
 */
var AuthErrorMessage = {
    unexpectedError: {
        code: "unexpected_error",
        desc: "Unexpected error in authentication."
    },
    postRequestFailed: {
        code: "post_request_failed",
        desc: "Post request failed from the network, could be a 4xx/5xx or a network unavailability. Please check the exact error code for details."
    }
};
/**
 * General error class thrown by the MSAL.js library.
 */
var AuthError = /** @class */ (function (_super) {
    __extends(AuthError, _super);
    function AuthError(errorCode, errorMessage, suberror) {
        var _this = this;
        var errorString = errorMessage ? errorCode + ": " + errorMessage : errorCode;
        _this = _super.call(this, errorString) || this;
        Object.setPrototypeOf(_this, AuthError.prototype);
        _this.errorCode = errorCode || Constants.EMPTY_STRING;
        _this.errorMessage = errorMessage || Constants.EMPTY_STRING;
        _this.subError = suberror || Constants.EMPTY_STRING;
        _this.name = "AuthError";
        return _this;
    }
    AuthError.prototype.setCorrelationId = function (correlationId) {
        this.correlationId = correlationId;
    };
    /**
     * Creates an error that is thrown when something unexpected happens in the library.
     * @param errDesc
     */
    AuthError.createUnexpectedError = function (errDesc) {
        return new AuthError(AuthErrorMessage.unexpectedError.code, AuthErrorMessage.unexpectedError.desc + ": " + errDesc);
    };
    /**
     * Creates an error for post request failures.
     * @param errDesc
     * @returns
     */
    AuthError.createPostRequestFailed = function (errDesc) {
        return new AuthError(AuthErrorMessage.postRequestFailed.code, AuthErrorMessage.postRequestFailed.desc + ": " + errDesc);
    };
    return AuthError;
}(Error));

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var DEFAULT_CRYPTO_IMPLEMENTATION = {
    createNewGuid: function () {
        var notImplErr = "Crypto interface - createNewGuid() has not been implemented";
        throw AuthError.createUnexpectedError(notImplErr);
    },
    base64Decode: function () {
        var notImplErr = "Crypto interface - base64Decode() has not been implemented";
        throw AuthError.createUnexpectedError(notImplErr);
    },
    base64Encode: function () {
        var notImplErr = "Crypto interface - base64Encode() has not been implemented";
        throw AuthError.createUnexpectedError(notImplErr);
    },
    generatePkceCodes: function () {
        return __awaiter(this, void 0, void 0, function () {
            var notImplErr;
            return __generator(this, function (_a) {
                notImplErr = "Crypto interface - generatePkceCodes() has not been implemented";
                throw AuthError.createUnexpectedError(notImplErr);
            });
        });
    },
    getPublicKeyThumbprint: function () {
        return __awaiter(this, void 0, void 0, function () {
            var notImplErr;
            return __generator(this, function (_a) {
                notImplErr = "Crypto interface - getPublicKeyThumbprint() has not been implemented";
                throw AuthError.createUnexpectedError(notImplErr);
            });
        });
    },
    removeTokenBindingKey: function () {
        return __awaiter(this, void 0, void 0, function () {
            var notImplErr;
            return __generator(this, function (_a) {
                notImplErr = "Crypto interface - removeTokenBindingKey() has not been implemented";
                throw AuthError.createUnexpectedError(notImplErr);
            });
        });
    },
    clearKeystore: function () {
        return __awaiter(this, void 0, void 0, function () {
            var notImplErr;
            return __generator(this, function (_a) {
                notImplErr = "Crypto interface - clearKeystore() has not been implemented";
                throw AuthError.createUnexpectedError(notImplErr);
            });
        });
    },
    signJwt: function () {
        return __awaiter(this, void 0, void 0, function () {
            var notImplErr;
            return __generator(this, function (_a) {
                notImplErr = "Crypto interface - signJwt() has not been implemented";
                throw AuthError.createUnexpectedError(notImplErr);
            });
        });
    },
    hashString: function () {
        return __awaiter(this, void 0, void 0, function () {
            var notImplErr;
            return __generator(this, function (_a) {
                notImplErr = "Crypto interface - hashString() has not been implemented";
                throw AuthError.createUnexpectedError(notImplErr);
            });
        });
    }
};

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * ClientAuthErrorMessage class containing string constants used by error codes and messages.
 */
var ClientAuthErrorMessage = {
    clientInfoDecodingError: {
        code: "client_info_decoding_error",
        desc: "The client info could not be parsed/decoded correctly. Please review the trace to determine the root cause."
    },
    clientInfoEmptyError: {
        code: "client_info_empty_error",
        desc: "The client info was empty. Please review the trace to determine the root cause."
    },
    tokenParsingError: {
        code: "token_parsing_error",
        desc: "Token cannot be parsed. Please review stack trace to determine root cause."
    },
    nullOrEmptyToken: {
        code: "null_or_empty_token",
        desc: "The token is null or empty. Please review the trace to determine the root cause."
    },
    endpointResolutionError: {
        code: "endpoints_resolution_error",
        desc: "Error: could not resolve endpoints. Please check network and try again."
    },
    networkError: {
        code: "network_error",
        desc: "Network request failed. Please check network trace to determine root cause."
    },
    unableToGetOpenidConfigError: {
        code: "openid_config_error",
        desc: "Could not retrieve endpoints. Check your authority and verify the .well-known/openid-configuration endpoint returns the required endpoints."
    },
    hashNotDeserialized: {
        code: "hash_not_deserialized",
        desc: "The hash parameters could not be deserialized. Please review the trace to determine the root cause."
    },
    blankGuidGenerated: {
        code: "blank_guid_generated",
        desc: "The guid generated was blank. Please review the trace to determine the root cause."
    },
    invalidStateError: {
        code: "invalid_state",
        desc: "State was not the expected format. Please check the logs to determine whether the request was sent using ProtocolUtils.setRequestState()."
    },
    stateMismatchError: {
        code: "state_mismatch",
        desc: "State mismatch error. Please check your network. Continued requests may cause cache overflow."
    },
    stateNotFoundError: {
        code: "state_not_found",
        desc: "State not found"
    },
    nonceMismatchError: {
        code: "nonce_mismatch",
        desc: "Nonce mismatch error. This may be caused by a race condition in concurrent requests."
    },
    nonceNotFoundError: {
        code: "nonce_not_found",
        desc: "nonce not found"
    },
    noTokensFoundError: {
        code: "no_tokens_found",
        desc: "No tokens were found for the given scopes, and no authorization code was passed to acquireToken. You must retrieve an authorization code before making a call to acquireToken()."
    },
    multipleMatchingTokens: {
        code: "multiple_matching_tokens",
        desc: "The cache contains multiple tokens satisfying the requirements. " +
            "Call AcquireToken again providing more requirements such as authority or account."
    },
    multipleMatchingAccounts: {
        code: "multiple_matching_accounts",
        desc: "The cache contains multiple accounts satisfying the given parameters. Please pass more info to obtain the correct account"
    },
    multipleMatchingAppMetadata: {
        code: "multiple_matching_appMetadata",
        desc: "The cache contains multiple appMetadata satisfying the given parameters. Please pass more info to obtain the correct appMetadata"
    },
    tokenRequestCannotBeMade: {
        code: "request_cannot_be_made",
        desc: "Token request cannot be made without authorization code or refresh token."
    },
    appendEmptyScopeError: {
        code: "cannot_append_empty_scope",
        desc: "Cannot append null or empty scope to ScopeSet. Please check the stack trace for more info."
    },
    removeEmptyScopeError: {
        code: "cannot_remove_empty_scope",
        desc: "Cannot remove null or empty scope from ScopeSet. Please check the stack trace for more info."
    },
    appendScopeSetError: {
        code: "cannot_append_scopeset",
        desc: "Cannot append ScopeSet due to error."
    },
    emptyInputScopeSetError: {
        code: "empty_input_scopeset",
        desc: "Empty input ScopeSet cannot be processed."
    },
    DeviceCodePollingCancelled: {
        code: "device_code_polling_cancelled",
        desc: "Caller has cancelled token endpoint polling during device code flow by setting DeviceCodeRequest.cancel = true."
    },
    DeviceCodeExpired: {
        code: "device_code_expired",
        desc: "Device code is expired."
    },
    DeviceCodeUnknownError: {
        code: "device_code_unknown_error",
        desc: "Device code stopped polling for unknown reasons."
    },
    NoAccountInSilentRequest: {
        code: "no_account_in_silent_request",
        desc: "Please pass an account object, silent flow is not supported without account information"
    },
    invalidCacheRecord: {
        code: "invalid_cache_record",
        desc: "Cache record object was null or undefined."
    },
    invalidCacheEnvironment: {
        code: "invalid_cache_environment",
        desc: "Invalid environment when attempting to create cache entry"
    },
    noAccountFound: {
        code: "no_account_found",
        desc: "No account found in cache for given key."
    },
    CachePluginError: {
        code: "no cache plugin set on CacheManager",
        desc: "ICachePlugin needs to be set before using readFromStorage or writeFromStorage"
    },
    noCryptoObj: {
        code: "no_crypto_object",
        desc: "No crypto object detected. This is required for the following operation: "
    },
    invalidCacheType: {
        code: "invalid_cache_type",
        desc: "Invalid cache type"
    },
    unexpectedAccountType: {
        code: "unexpected_account_type",
        desc: "Unexpected account type."
    },
    unexpectedCredentialType: {
        code: "unexpected_credential_type",
        desc: "Unexpected credential type."
    },
    invalidAssertion: {
        code: "invalid_assertion",
        desc: "Client assertion must meet requirements described in https://tools.ietf.org/html/rfc7515"
    },
    invalidClientCredential: {
        code: "invalid_client_credential",
        desc: "Client credential (secret, certificate, or assertion) must not be empty when creating a confidential client. An application should at most have one credential"
    },
    tokenRefreshRequired: {
        code: "token_refresh_required",
        desc: "Cannot return token from cache because it must be refreshed. This may be due to one of the following reasons: forceRefresh parameter is set to true, claims have been requested, there is no cached access token or it is expired."
    },
    userTimeoutReached: {
        code: "user_timeout_reached",
        desc: "User defined timeout for device code polling reached",
    },
    tokenClaimsRequired: {
        code: "token_claims_cnf_required_for_signedjwt",
        desc: "Cannot generate a POP jwt if the token_claims are not populated"
    },
    noAuthorizationCodeFromServer: {
        code: "authorization_code_missing_from_server_response",
        desc: "Server response does not contain an authorization code to proceed"
    },
    noAzureRegionDetected: {
        code: "no_azure_region_detected",
        desc: "No azure region was detected and no fallback was made available"
    },
    accessTokenEntityNullError: {
        code: "access_token_entity_null",
        desc: "Access token entity is null, please check logs and cache to ensure a valid access token is present."
    },
    bindingKeyNotRemovedError: {
        code: "binding_key_not_removed",
        desc: "Could not remove the credential's binding key from storage."
    },
    logoutNotSupported: {
        code: "end_session_endpoint_not_supported",
        desc: "Provided authority does not support logout."
    },
    keyIdMissing: {
        code: "key_id_missing",
        desc: "A keyId value is missing from the requested bound token's cache record and is required to match the token to it's stored binding key."
    }
};
/**
 * Error thrown when there is an error in the client code running on the browser.
 */
var ClientAuthError = /** @class */ (function (_super) {
    __extends(ClientAuthError, _super);
    function ClientAuthError(errorCode, errorMessage) {
        var _this = _super.call(this, errorCode, errorMessage) || this;
        _this.name = "ClientAuthError";
        Object.setPrototypeOf(_this, ClientAuthError.prototype);
        return _this;
    }
    /**
     * Creates an error thrown when client info object doesn't decode correctly.
     * @param caughtError
     */
    ClientAuthError.createClientInfoDecodingError = function (caughtError) {
        return new ClientAuthError(ClientAuthErrorMessage.clientInfoDecodingError.code, ClientAuthErrorMessage.clientInfoDecodingError.desc + " Failed with error: " + caughtError);
    };
    /**
     * Creates an error thrown if the client info is empty.
     * @param rawClientInfo
     */
    ClientAuthError.createClientInfoEmptyError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.clientInfoEmptyError.code, "" + ClientAuthErrorMessage.clientInfoEmptyError.desc);
    };
    /**
     * Creates an error thrown when the id token extraction errors out.
     * @param err
     */
    ClientAuthError.createTokenParsingError = function (caughtExtractionError) {
        return new ClientAuthError(ClientAuthErrorMessage.tokenParsingError.code, ClientAuthErrorMessage.tokenParsingError.desc + " Failed with error: " + caughtExtractionError);
    };
    /**
     * Creates an error thrown when the id token string is null or empty.
     * @param invalidRawTokenString
     */
    ClientAuthError.createTokenNullOrEmptyError = function (invalidRawTokenString) {
        return new ClientAuthError(ClientAuthErrorMessage.nullOrEmptyToken.code, ClientAuthErrorMessage.nullOrEmptyToken.desc + " Raw Token Value: " + invalidRawTokenString);
    };
    /**
     * Creates an error thrown when the endpoint discovery doesn't complete correctly.
     */
    ClientAuthError.createEndpointDiscoveryIncompleteError = function (errDetail) {
        return new ClientAuthError(ClientAuthErrorMessage.endpointResolutionError.code, ClientAuthErrorMessage.endpointResolutionError.desc + " Detail: " + errDetail);
    };
    /**
     * Creates an error thrown when the fetch client throws
     */
    ClientAuthError.createNetworkError = function (endpoint, errDetail) {
        return new ClientAuthError(ClientAuthErrorMessage.networkError.code, ClientAuthErrorMessage.networkError.desc + " | Fetch client threw: " + errDetail + " | Attempted to reach: " + endpoint.split("?")[0]);
    };
    /**
     * Creates an error thrown when the openid-configuration endpoint cannot be reached or does not contain the required data
     */
    ClientAuthError.createUnableToGetOpenidConfigError = function (errDetail) {
        return new ClientAuthError(ClientAuthErrorMessage.unableToGetOpenidConfigError.code, ClientAuthErrorMessage.unableToGetOpenidConfigError.desc + " Attempted to retrieve endpoints from: " + errDetail);
    };
    /**
     * Creates an error thrown when the hash cannot be deserialized.
     * @param hashParamObj
     */
    ClientAuthError.createHashNotDeserializedError = function (hashParamObj) {
        return new ClientAuthError(ClientAuthErrorMessage.hashNotDeserialized.code, ClientAuthErrorMessage.hashNotDeserialized.desc + " Given Object: " + hashParamObj);
    };
    /**
     * Creates an error thrown when the state cannot be parsed.
     * @param invalidState
     */
    ClientAuthError.createInvalidStateError = function (invalidState, errorString) {
        return new ClientAuthError(ClientAuthErrorMessage.invalidStateError.code, ClientAuthErrorMessage.invalidStateError.desc + " Invalid State: " + invalidState + ", Root Err: " + errorString);
    };
    /**
     * Creates an error thrown when two states do not match.
     */
    ClientAuthError.createStateMismatchError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.stateMismatchError.code, ClientAuthErrorMessage.stateMismatchError.desc);
    };
    /**
     * Creates an error thrown when the state is not present
     * @param missingState
     */
    ClientAuthError.createStateNotFoundError = function (missingState) {
        return new ClientAuthError(ClientAuthErrorMessage.stateNotFoundError.code, ClientAuthErrorMessage.stateNotFoundError.desc + ":  " + missingState);
    };
    /**
     * Creates an error thrown when the nonce does not match.
     */
    ClientAuthError.createNonceMismatchError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.nonceMismatchError.code, ClientAuthErrorMessage.nonceMismatchError.desc);
    };
    /**
     * Creates an error thrown when the mnonce is not present
     * @param missingNonce
     */
    ClientAuthError.createNonceNotFoundError = function (missingNonce) {
        return new ClientAuthError(ClientAuthErrorMessage.nonceNotFoundError.code, ClientAuthErrorMessage.nonceNotFoundError.desc + ":  " + missingNonce);
    };
    /**
     * Throws error when multiple tokens are in cache.
     */
    ClientAuthError.createMultipleMatchingTokensInCacheError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.multipleMatchingTokens.code, ClientAuthErrorMessage.multipleMatchingTokens.desc + ".");
    };
    /**
     * Throws error when multiple accounts are in cache for the given params
     */
    ClientAuthError.createMultipleMatchingAccountsInCacheError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.multipleMatchingAccounts.code, ClientAuthErrorMessage.multipleMatchingAccounts.desc);
    };
    /**
     * Throws error when multiple appMetada are in cache for the given clientId.
     */
    ClientAuthError.createMultipleMatchingAppMetadataInCacheError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.multipleMatchingAppMetadata.code, ClientAuthErrorMessage.multipleMatchingAppMetadata.desc);
    };
    /**
     * Throws error when no auth code or refresh token is given to ServerTokenRequestParameters.
     */
    ClientAuthError.createTokenRequestCannotBeMadeError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.tokenRequestCannotBeMade.code, ClientAuthErrorMessage.tokenRequestCannotBeMade.desc);
    };
    /**
     * Throws error when attempting to append a null, undefined or empty scope to a set
     * @param givenScope
     */
    ClientAuthError.createAppendEmptyScopeToSetError = function (givenScope) {
        return new ClientAuthError(ClientAuthErrorMessage.appendEmptyScopeError.code, ClientAuthErrorMessage.appendEmptyScopeError.desc + " Given Scope: " + givenScope);
    };
    /**
     * Throws error when attempting to append a null, undefined or empty scope to a set
     * @param givenScope
     */
    ClientAuthError.createRemoveEmptyScopeFromSetError = function (givenScope) {
        return new ClientAuthError(ClientAuthErrorMessage.removeEmptyScopeError.code, ClientAuthErrorMessage.removeEmptyScopeError.desc + " Given Scope: " + givenScope);
    };
    /**
     * Throws error when attempting to append null or empty ScopeSet.
     * @param appendError
     */
    ClientAuthError.createAppendScopeSetError = function (appendError) {
        return new ClientAuthError(ClientAuthErrorMessage.appendScopeSetError.code, ClientAuthErrorMessage.appendScopeSetError.desc + " Detail Error: " + appendError);
    };
    /**
     * Throws error if ScopeSet is null or undefined.
     * @param givenScopeSet
     */
    ClientAuthError.createEmptyInputScopeSetError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.emptyInputScopeSetError.code, "" + ClientAuthErrorMessage.emptyInputScopeSetError.desc);
    };
    /**
     * Throws error if user sets CancellationToken.cancel = true during polling of token endpoint during device code flow
     */
    ClientAuthError.createDeviceCodeCancelledError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.DeviceCodePollingCancelled.code, "" + ClientAuthErrorMessage.DeviceCodePollingCancelled.desc);
    };
    /**
     * Throws error if device code is expired
     */
    ClientAuthError.createDeviceCodeExpiredError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.DeviceCodeExpired.code, "" + ClientAuthErrorMessage.DeviceCodeExpired.desc);
    };
    /**
     * Throws error if device code is expired
     */
    ClientAuthError.createDeviceCodeUnknownError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.DeviceCodeUnknownError.code, "" + ClientAuthErrorMessage.DeviceCodeUnknownError.desc);
    };
    /**
     * Throws error when silent requests are made without an account object
     */
    ClientAuthError.createNoAccountInSilentRequestError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.NoAccountInSilentRequest.code, "" + ClientAuthErrorMessage.NoAccountInSilentRequest.desc);
    };
    /**
     * Throws error when cache record is null or undefined.
     */
    ClientAuthError.createNullOrUndefinedCacheRecord = function () {
        return new ClientAuthError(ClientAuthErrorMessage.invalidCacheRecord.code, ClientAuthErrorMessage.invalidCacheRecord.desc);
    };
    /**
     * Throws error when provided environment is not part of the CloudDiscoveryMetadata object
     */
    ClientAuthError.createInvalidCacheEnvironmentError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.invalidCacheEnvironment.code, ClientAuthErrorMessage.invalidCacheEnvironment.desc);
    };
    /**
     * Throws error when account is not found in cache.
     */
    ClientAuthError.createNoAccountFoundError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.noAccountFound.code, ClientAuthErrorMessage.noAccountFound.desc);
    };
    /**
     * Throws error if ICachePlugin not set on CacheManager.
     */
    ClientAuthError.createCachePluginError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.CachePluginError.code, "" + ClientAuthErrorMessage.CachePluginError.desc);
    };
    /**
     * Throws error if crypto object not found.
     * @param operationName
     */
    ClientAuthError.createNoCryptoObjectError = function (operationName) {
        return new ClientAuthError(ClientAuthErrorMessage.noCryptoObj.code, "" + ClientAuthErrorMessage.noCryptoObj.desc + operationName);
    };
    /**
     * Throws error if cache type is invalid.
     */
    ClientAuthError.createInvalidCacheTypeError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.invalidCacheType.code, "" + ClientAuthErrorMessage.invalidCacheType.desc);
    };
    /**
     * Throws error if unexpected account type.
     */
    ClientAuthError.createUnexpectedAccountTypeError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.unexpectedAccountType.code, "" + ClientAuthErrorMessage.unexpectedAccountType.desc);
    };
    /**
     * Throws error if unexpected credential type.
     */
    ClientAuthError.createUnexpectedCredentialTypeError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.unexpectedCredentialType.code, "" + ClientAuthErrorMessage.unexpectedCredentialType.desc);
    };
    /**
     * Throws error if client assertion is not valid.
     */
    ClientAuthError.createInvalidAssertionError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.invalidAssertion.code, "" + ClientAuthErrorMessage.invalidAssertion.desc);
    };
    /**
     * Throws error if client assertion is not valid.
     */
    ClientAuthError.createInvalidCredentialError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.invalidClientCredential.code, "" + ClientAuthErrorMessage.invalidClientCredential.desc);
    };
    /**
     * Throws error if token cannot be retrieved from cache due to refresh being required.
     */
    ClientAuthError.createRefreshRequiredError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.tokenRefreshRequired.code, ClientAuthErrorMessage.tokenRefreshRequired.desc);
    };
    /**
     * Throws error if the user defined timeout is reached.
     */
    ClientAuthError.createUserTimeoutReachedError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.userTimeoutReached.code, ClientAuthErrorMessage.userTimeoutReached.desc);
    };
    /*
     * Throws error if token claims are not populated for a signed jwt generation
     */
    ClientAuthError.createTokenClaimsRequiredError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.tokenClaimsRequired.code, ClientAuthErrorMessage.tokenClaimsRequired.desc);
    };
    /**
     * Throws error when the authorization code is missing from the server response
     */
    ClientAuthError.createNoAuthCodeInServerResponseError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.noAuthorizationCodeFromServer.code, ClientAuthErrorMessage.noAuthorizationCodeFromServer.desc);
    };
    ClientAuthError.createBindingKeyNotRemovedError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.bindingKeyNotRemovedError.code, ClientAuthErrorMessage.bindingKeyNotRemovedError.desc);
    };
    /**
     * Thrown when logout is attempted for an authority that doesnt have an end_session_endpoint
     */
    ClientAuthError.createLogoutNotSupportedError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.logoutNotSupported.code, ClientAuthErrorMessage.logoutNotSupported.desc);
    };
    /**
     * Create an error when kid attribute is missing from a PoP token's cache record
     */
    ClientAuthError.createKeyIdMissingError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.keyIdMissing.code, ClientAuthErrorMessage.keyIdMissing.desc);
    };
    return ClientAuthError;
}(AuthError));

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * @hidden
 */
var StringUtils = /** @class */ (function () {
    function StringUtils() {
    }
    /**
     * decode a JWT
     *
     * @param authToken
     */
    StringUtils.decodeAuthToken = function (authToken) {
        if (StringUtils.isEmpty(authToken)) {
            throw ClientAuthError.createTokenNullOrEmptyError(authToken);
        }
        var tokenPartsRegex = /^([^\.\s]*)\.([^\.\s]+)\.([^\.\s]*)$/;
        var matches = tokenPartsRegex.exec(authToken);
        if (!matches || matches.length < 4) {
            throw ClientAuthError.createTokenParsingError("Given token is malformed: " + JSON.stringify(authToken));
        }
        var crackedToken = {
            header: matches[1],
            JWSPayload: matches[2],
            JWSSig: matches[3]
        };
        return crackedToken;
    };
    /**
     * Check if a string is empty.
     *
     * @param str
     */
    StringUtils.isEmpty = function (str) {
        return (typeof str === "undefined" || !str || 0 === str.length);
    };
    /**
     * Check if stringified object is empty
     * @param strObj
     */
    StringUtils.isEmptyObj = function (strObj) {
        if (strObj && !StringUtils.isEmpty(strObj)) {
            try {
                var obj = JSON.parse(strObj);
                return Object.keys(obj).length === 0;
            }
            catch (e) { }
        }
        return true;
    };
    StringUtils.startsWith = function (str, search) {
        return str.indexOf(search) === 0;
    };
    StringUtils.endsWith = function (str, search) {
        return (str.length >= search.length) && (str.lastIndexOf(search) === (str.length - search.length));
    };
    /**
     * Parses string into an object.
     *
     * @param query
     */
    StringUtils.queryStringToObject = function (query) {
        var obj = {};
        var params = query.split("&");
        var decode = function (s) { return decodeURIComponent(s.replace(/\+/g, " ")); };
        params.forEach(function (pair) {
            if (pair.trim()) {
                var _a = pair.split(/=(.+)/g, 2), key = _a[0], value = _a[1]; // Split on the first occurence of the '=' character
                if (key && value) {
                    obj[decode(key)] = decode(value);
                }
            }
        });
        return obj;
    };
    /**
     * Trims entries in an array.
     *
     * @param arr
     */
    StringUtils.trimArrayEntries = function (arr) {
        return arr.map(function (entry) { return entry.trim(); });
    };
    /**
     * Removes empty strings from array
     * @param arr
     */
    StringUtils.removeEmptyStringsFromArray = function (arr) {
        return arr.filter(function (entry) {
            return !StringUtils.isEmpty(entry);
        });
    };
    /**
     * Attempts to parse a string into JSON
     * @param str
     */
    StringUtils.jsonParseHelper = function (str) {
        try {
            return JSON.parse(str);
        }
        catch (e) {
            return null;
        }
    };
    /**
     * Tests if a given string matches a given pattern, with support for wildcards and queries.
     * @param pattern Wildcard pattern to string match. Supports "*" for wildcards and "?" for queries
     * @param input String to match against
     */
    StringUtils.matchPattern = function (pattern, input) {
        /**
         * Wildcard support: https://stackoverflow.com/a/3117248/4888559
         * Queries: replaces "?" in string with escaped "\?" for regex test
         */
        var regex = new RegExp(pattern.replace(/\\/g, "\\\\").replace(/\*/g, "[^ ]*").replace(/\?/g, "\\\?")); // eslint-disable-line security/detect-non-literal-regexp
        return regex.test(input);
    };
    return StringUtils;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Log message level.
 */
exports.LogLevel = void 0;
(function (LogLevel) {
    LogLevel[LogLevel["Error"] = 0] = "Error";
    LogLevel[LogLevel["Warning"] = 1] = "Warning";
    LogLevel[LogLevel["Info"] = 2] = "Info";
    LogLevel[LogLevel["Verbose"] = 3] = "Verbose";
    LogLevel[LogLevel["Trace"] = 4] = "Trace";
})(exports.LogLevel || (exports.LogLevel = {}));
/**
 * Class which facilitates logging of messages to a specific place.
 */
var Logger = /** @class */ (function () {
    function Logger(loggerOptions, packageName, packageVersion) {
        // Current log level, defaults to info.
        this.level = exports.LogLevel.Info;
        var defaultLoggerCallback = function () {
            return;
        };
        this.localCallback = loggerOptions.loggerCallback || defaultLoggerCallback;
        this.piiLoggingEnabled = loggerOptions.piiLoggingEnabled || false;
        this.level = typeof (loggerOptions.logLevel) === "number" ? loggerOptions.logLevel : exports.LogLevel.Info;
        this.correlationId = loggerOptions.correlationId || Constants.EMPTY_STRING;
        this.packageName = packageName || Constants.EMPTY_STRING;
        this.packageVersion = packageVersion || Constants.EMPTY_STRING;
    }
    /**
     * Create new Logger with existing configurations.
     */
    Logger.prototype.clone = function (packageName, packageVersion, correlationId) {
        return new Logger({ loggerCallback: this.localCallback, piiLoggingEnabled: this.piiLoggingEnabled, logLevel: this.level, correlationId: correlationId || this.correlationId }, packageName, packageVersion);
    };
    /**
     * Log message with required options.
     */
    Logger.prototype.logMessage = function (logMessage, options) {
        if ((options.logLevel > this.level) || (!this.piiLoggingEnabled && options.containsPii)) {
            return;
        }
        var timestamp = new Date().toUTCString();
        // Add correlationId to logs if set, correlationId provided on log messages take precedence
        var logHeader;
        if (!StringUtils.isEmpty(options.correlationId)) {
            logHeader = "[" + timestamp + "] : [" + options.correlationId + "]";
        }
        else if (!StringUtils.isEmpty(this.correlationId)) {
            logHeader = "[" + timestamp + "] : [" + this.correlationId + "]";
        }
        else {
            logHeader = "[" + timestamp + "]";
        }
        var log = logHeader + " : " + this.packageName + "@" + this.packageVersion + " : " + exports.LogLevel[options.logLevel] + " - " + logMessage;
        // debug(`msal:${LogLevel[options.logLevel]}${options.containsPii ? "-Pii": Constants.EMPTY_STRING}${options.context ? `:${options.context}` : Constants.EMPTY_STRING}`)(logMessage);
        this.executeCallback(options.logLevel, log, options.containsPii || false);
    };
    /**
     * Execute callback with message.
     */
    Logger.prototype.executeCallback = function (level, message, containsPii) {
        if (this.localCallback) {
            this.localCallback(level, message, containsPii);
        }
    };
    /**
     * Logs error messages.
     */
    Logger.prototype.error = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: exports.LogLevel.Error,
            containsPii: false,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Logs error messages with PII.
     */
    Logger.prototype.errorPii = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: exports.LogLevel.Error,
            containsPii: true,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Logs warning messages.
     */
    Logger.prototype.warning = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: exports.LogLevel.Warning,
            containsPii: false,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Logs warning messages with PII.
     */
    Logger.prototype.warningPii = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: exports.LogLevel.Warning,
            containsPii: true,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Logs info messages.
     */
    Logger.prototype.info = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: exports.LogLevel.Info,
            containsPii: false,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Logs info messages with PII.
     */
    Logger.prototype.infoPii = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: exports.LogLevel.Info,
            containsPii: true,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Logs verbose messages.
     */
    Logger.prototype.verbose = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: exports.LogLevel.Verbose,
            containsPii: false,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Logs verbose messages with PII.
     */
    Logger.prototype.verbosePii = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: exports.LogLevel.Verbose,
            containsPii: true,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Logs trace messages.
     */
    Logger.prototype.trace = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: exports.LogLevel.Trace,
            containsPii: false,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Logs trace messages with PII.
     */
    Logger.prototype.tracePii = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: exports.LogLevel.Trace,
            containsPii: true,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Returns whether PII Logging is enabled or not.
     */
    Logger.prototype.isPiiLoggingEnabled = function () {
        return this.piiLoggingEnabled || false;
    };
    return Logger;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */
/* eslint-disable header/header */
var name$1 = "@azure/msal-common";
var version$1 = "7.3.0";

/*! @azure/msal-common v7.3.0 2022-08-01 */
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
exports.AzureCloudInstance = void 0;
(function (AzureCloudInstance) {
    // AzureCloudInstance is not specified.
    AzureCloudInstance[AzureCloudInstance["None"] = 0] = "None";
    // Microsoft Azure public cloud
    AzureCloudInstance["AzurePublic"] = "https://login.microsoftonline.com";
    // Microsoft PPE
    AzureCloudInstance["AzurePpe"] = "https://login.windows-ppe.net";
    // Microsoft Chinese national cloud
    AzureCloudInstance["AzureChina"] = "https://login.chinacloudapi.cn";
    // Microsoft German national cloud ("Black Forest")
    AzureCloudInstance["AzureGermany"] = "https://login.microsoftonline.de";
    // US Government cloud
    AzureCloudInstance["AzureUsGovernment"] = "https://login.microsoftonline.us";
})(exports.AzureCloudInstance || (exports.AzureCloudInstance = {}));

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Base type for credentials to be stored in the cache: eg: ACCESS_TOKEN, ID_TOKEN etc
 *
 * Key:Value Schema:
 *
 * Key: <home_account_id*>-<environment>-<credential_type>-<client_id>-<realm*>-<target*>-<requestedClaims*>-<scheme*>
 *
 * Value Schema:
 * {
 *      homeAccountId: home account identifier for the auth scheme,
 *      environment: entity that issued the token, represented as a full host
 *      credentialType: Type of credential as a string, can be one of the following: RefreshToken, AccessToken, IdToken, Password, Cookie, Certificate, Other
 *      clientId: client ID of the application
 *      secret: Actual credential as a string
 *      familyId: Family ID identifier, usually only used for refresh tokens
 *      realm: Full tenant or organizational identifier that the account belongs to
 *      target: Permissions that are included in the token, or for refresh tokens, the resource identifier.
 *      tokenType: Matches the authentication scheme for which the token was issued (i.e. Bearer or pop)
 *      requestedClaimsHash: Matches the SHA 256 hash of the claims object included in the token request
 *      userAssertionHash: Matches the SHA 256 hash of the obo_assertion for the OBO flow
 * }
 */
var CredentialEntity = /** @class */ (function () {
    function CredentialEntity() {
    }
    /**
     * Generate Account Id key component as per the schema: <home_account_id>-<environment>
     */
    CredentialEntity.prototype.generateAccountId = function () {
        return CredentialEntity.generateAccountIdForCacheKey(this.homeAccountId, this.environment);
    };
    /**
     * Generate Credential Id key component as per the schema: <credential_type>-<client_id>-<realm>
     */
    CredentialEntity.prototype.generateCredentialId = function () {
        return CredentialEntity.generateCredentialIdForCacheKey(this.credentialType, this.clientId, this.realm, this.familyId);
    };
    /**
     * Generate target key component as per schema: <target>
     */
    CredentialEntity.prototype.generateTarget = function () {
        return CredentialEntity.generateTargetForCacheKey(this.target);
    };
    /**
     * generates credential key
     */
    CredentialEntity.prototype.generateCredentialKey = function () {
        return CredentialEntity.generateCredentialCacheKey(this.homeAccountId, this.environment, this.credentialType, this.clientId, this.realm, this.target, this.familyId, this.tokenType, this.requestedClaimsHash);
    };
    /**
     * returns the type of the cache (in this case credential)
     */
    CredentialEntity.prototype.generateType = function () {
        switch (this.credentialType) {
            case CredentialType.ID_TOKEN:
                return CacheType.ID_TOKEN;
            case CredentialType.ACCESS_TOKEN:
            case CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME:
                return CacheType.ACCESS_TOKEN;
            case CredentialType.REFRESH_TOKEN:
                return CacheType.REFRESH_TOKEN;
            default: {
                throw ClientAuthError.createUnexpectedCredentialTypeError();
            }
        }
    };
    /**
     * helper function to return `CredentialType`
     * @param key
     */
    CredentialEntity.getCredentialType = function (key) {
        // First keyword search will match all "AccessToken" and "AccessToken_With_AuthScheme" credentials
        if (key.indexOf(CredentialType.ACCESS_TOKEN.toLowerCase()) !== -1) {
            // Perform second search to differentiate between "AccessToken" and "AccessToken_With_AuthScheme" credential types
            if (key.indexOf(CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME.toLowerCase()) !== -1) {
                return CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME;
            }
            return CredentialType.ACCESS_TOKEN;
        }
        else if (key.indexOf(CredentialType.ID_TOKEN.toLowerCase()) !== -1) {
            return CredentialType.ID_TOKEN;
        }
        else if (key.indexOf(CredentialType.REFRESH_TOKEN.toLowerCase()) !== -1) {
            return CredentialType.REFRESH_TOKEN;
        }
        return Constants.NOT_DEFINED;
    };
    /**
     * generates credential key
     * <home_account_id*>-\<environment>-<credential_type>-<client_id>-<realm\*>-<target\*>-<scheme\*>
     */
    CredentialEntity.generateCredentialCacheKey = function (homeAccountId, environment, credentialType, clientId, realm, target, familyId, tokenType, requestedClaimsHash) {
        var credentialKey = [
            this.generateAccountIdForCacheKey(homeAccountId, environment),
            this.generateCredentialIdForCacheKey(credentialType, clientId, realm, familyId),
            this.generateTargetForCacheKey(target),
            this.generateClaimsHashForCacheKey(requestedClaimsHash),
            this.generateSchemeForCacheKey(tokenType)
        ];
        return credentialKey.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();
    };
    /**
     * generates Account Id for keys
     * @param homeAccountId
     * @param environment
     */
    CredentialEntity.generateAccountIdForCacheKey = function (homeAccountId, environment) {
        var accountId = [homeAccountId, environment];
        return accountId.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();
    };
    /**
     * Generates Credential Id for keys
     * @param credentialType
     * @param realm
     * @param clientId
     * @param familyId
     */
    CredentialEntity.generateCredentialIdForCacheKey = function (credentialType, clientId, realm, familyId) {
        var clientOrFamilyId = credentialType === CredentialType.REFRESH_TOKEN
            ? familyId || clientId
            : clientId;
        var credentialId = [
            credentialType,
            clientOrFamilyId,
            realm || Constants.EMPTY_STRING,
        ];
        return credentialId.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();
    };
    /**
     * Generate target key component as per schema: <target>
     */
    CredentialEntity.generateTargetForCacheKey = function (scopes) {
        return (scopes || Constants.EMPTY_STRING).toLowerCase();
    };
    /**
     * Generate requested claims key component as per schema: <requestedClaims>
     */
    CredentialEntity.generateClaimsHashForCacheKey = function (requestedClaimsHash) {
        return (requestedClaimsHash || Constants.EMPTY_STRING).toLowerCase();
    };
    /**
     * Generate scheme key componenet as per schema: <scheme>
     */
    CredentialEntity.generateSchemeForCacheKey = function (tokenType) {
        /*
         * PoP Tokens and SSH certs include scheme in cache key
         * Cast to lowercase to handle "bearer" from ADFS
         */
        return (tokenType && tokenType.toLowerCase() !== exports.AuthenticationScheme.BEARER.toLowerCase()) ? tokenType.toLowerCase() : Constants.EMPTY_STRING;
    };
    return CredentialEntity;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * ClientConfigurationErrorMessage class containing string constants used by error codes and messages.
 */
var ClientConfigurationErrorMessage = {
    redirectUriNotSet: {
        code: "redirect_uri_empty",
        desc: "A redirect URI is required for all calls, and none has been set."
    },
    postLogoutUriNotSet: {
        code: "post_logout_uri_empty",
        desc: "A post logout redirect has not been set."
    },
    claimsRequestParsingError: {
        code: "claims_request_parsing_error",
        desc: "Could not parse the given claims request object."
    },
    authorityUriInsecure: {
        code: "authority_uri_insecure",
        desc: "Authority URIs must use https.  Please see here for valid authority configuration options: https://docs.microsoft.com/en-us/azure/active-directory/develop/msal-js-initializing-client-applications#configuration-options"
    },
    urlParseError: {
        code: "url_parse_error",
        desc: "URL could not be parsed into appropriate segments."
    },
    urlEmptyError: {
        code: "empty_url_error",
        desc: "URL was empty or null."
    },
    emptyScopesError: {
        code: "empty_input_scopes_error",
        desc: "Scopes cannot be passed as null, undefined or empty array because they are required to obtain an access token."
    },
    nonArrayScopesError: {
        code: "nonarray_input_scopes_error",
        desc: "Scopes cannot be passed as non-array."
    },
    clientIdSingleScopeError: {
        code: "clientid_input_scopes_error",
        desc: "Client ID can only be provided as a single scope."
    },
    invalidPrompt: {
        code: "invalid_prompt_value",
        desc: "Supported prompt values are 'login', 'select_account', 'consent', 'create' and 'none'.  Please see here for valid configuration options: https://azuread.github.io/microsoft-authentication-library-for-js/ref/modules/_azure_msal_common.html#commonauthorizationurlrequest",
    },
    invalidClaimsRequest: {
        code: "invalid_claims",
        desc: "Given claims parameter must be a stringified JSON object."
    },
    tokenRequestEmptyError: {
        code: "token_request_empty",
        desc: "Token request was empty and not found in cache."
    },
    logoutRequestEmptyError: {
        code: "logout_request_empty",
        desc: "The logout request was null or undefined."
    },
    invalidCodeChallengeMethod: {
        code: "invalid_code_challenge_method",
        desc: "code_challenge_method passed is invalid. Valid values are \"plain\" and \"S256\"."
    },
    invalidCodeChallengeParams: {
        code: "pkce_params_missing",
        desc: "Both params: code_challenge and code_challenge_method are to be passed if to be sent in the request"
    },
    invalidCloudDiscoveryMetadata: {
        code: "invalid_cloud_discovery_metadata",
        desc: "Invalid cloudDiscoveryMetadata provided. Must be a stringified JSON object containing tenant_discovery_endpoint and metadata fields"
    },
    invalidAuthorityMetadata: {
        code: "invalid_authority_metadata",
        desc: "Invalid authorityMetadata provided. Must by a stringified JSON object containing authorization_endpoint, token_endpoint, issuer fields."
    },
    untrustedAuthority: {
        code: "untrusted_authority",
        desc: "The provided authority is not a trusted authority. Please include this authority in the knownAuthorities config parameter."
    },
    invalidAzureCloudInstance: {
        code: "invalid_azure_cloud_instance",
        desc: "Invalid AzureCloudInstance provided. Please refer MSAL JS docs: aks.ms/msaljs/azure_cloud_instance for valid values"
    },
    missingSshJwk: {
        code: "missing_ssh_jwk",
        desc: "Missing sshJwk in SSH certificate request. A stringified JSON Web Key is required when using the SSH authentication scheme."
    },
    missingSshKid: {
        code: "missing_ssh_kid",
        desc: "Missing sshKid in SSH certificate request. A string that uniquely identifies the public SSH key is required when using the SSH authentication scheme."
    },
    missingNonceAuthenticationHeader: {
        code: "missing_nonce_authentication_header",
        desc: "Unable to find an authentication header containing server nonce. Either the Authentication-Info or WWW-Authenticate headers must be present in order to obtain a server nonce."
    },
    invalidAuthenticationHeader: {
        code: "invalid_authentication_header",
        desc: "Invalid authentication header provided"
    }
};
/**
 * Error thrown when there is an error in configuration of the MSAL.js library.
 */
var ClientConfigurationError = /** @class */ (function (_super) {
    __extends(ClientConfigurationError, _super);
    function ClientConfigurationError(errorCode, errorMessage) {
        var _this = _super.call(this, errorCode, errorMessage) || this;
        _this.name = "ClientConfigurationError";
        Object.setPrototypeOf(_this, ClientConfigurationError.prototype);
        return _this;
    }
    /**
     * Creates an error thrown when the redirect uri is empty (not set by caller)
     */
    ClientConfigurationError.createRedirectUriEmptyError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.redirectUriNotSet.code, ClientConfigurationErrorMessage.redirectUriNotSet.desc);
    };
    /**
     * Creates an error thrown when the post-logout redirect uri is empty (not set by caller)
     */
    ClientConfigurationError.createPostLogoutRedirectUriEmptyError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.postLogoutUriNotSet.code, ClientConfigurationErrorMessage.postLogoutUriNotSet.desc);
    };
    /**
     * Creates an error thrown when the claims request could not be successfully parsed
     */
    ClientConfigurationError.createClaimsRequestParsingError = function (claimsRequestParseError) {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.claimsRequestParsingError.code, ClientConfigurationErrorMessage.claimsRequestParsingError.desc + " Given value: " + claimsRequestParseError);
    };
    /**
     * Creates an error thrown if authority uri is given an insecure protocol.
     * @param urlString
     */
    ClientConfigurationError.createInsecureAuthorityUriError = function (urlString) {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.authorityUriInsecure.code, ClientConfigurationErrorMessage.authorityUriInsecure.desc + " Given URI: " + urlString);
    };
    /**
     * Creates an error thrown if URL string does not parse into separate segments.
     * @param urlString
     */
    ClientConfigurationError.createUrlParseError = function (urlParseError) {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.urlParseError.code, ClientConfigurationErrorMessage.urlParseError.desc + " Given Error: " + urlParseError);
    };
    /**
     * Creates an error thrown if URL string is empty or null.
     * @param urlString
     */
    ClientConfigurationError.createUrlEmptyError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.urlEmptyError.code, ClientConfigurationErrorMessage.urlEmptyError.desc);
    };
    /**
     * Error thrown when scopes are empty.
     * @param scopesValue
     */
    ClientConfigurationError.createEmptyScopesArrayError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.emptyScopesError.code, "" + ClientConfigurationErrorMessage.emptyScopesError.desc);
    };
    /**
     * Error thrown when client id scope is not provided as single scope.
     * @param inputScopes
     */
    ClientConfigurationError.createClientIdSingleScopeError = function (inputScopes) {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.clientIdSingleScopeError.code, ClientConfigurationErrorMessage.clientIdSingleScopeError.desc + " Given Scopes: " + inputScopes);
    };
    /**
     * Error thrown when prompt is not an allowed type.
     * @param promptValue
     */
    ClientConfigurationError.createInvalidPromptError = function (promptValue) {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidPrompt.code, ClientConfigurationErrorMessage.invalidPrompt.desc + " Given value: " + promptValue);
    };
    /**
     * Creates error thrown when claims parameter is not a stringified JSON object
     */
    ClientConfigurationError.createInvalidClaimsRequestError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidClaimsRequest.code, ClientConfigurationErrorMessage.invalidClaimsRequest.desc);
    };
    /**
     * Throws error when token request is empty and nothing cached in storage.
     */
    ClientConfigurationError.createEmptyLogoutRequestError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.logoutRequestEmptyError.code, ClientConfigurationErrorMessage.logoutRequestEmptyError.desc);
    };
    /**
     * Throws error when token request is empty and nothing cached in storage.
     */
    ClientConfigurationError.createEmptyTokenRequestError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.tokenRequestEmptyError.code, ClientConfigurationErrorMessage.tokenRequestEmptyError.desc);
    };
    /**
     * Throws error when an invalid code_challenge_method is passed by the user
     */
    ClientConfigurationError.createInvalidCodeChallengeMethodError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidCodeChallengeMethod.code, ClientConfigurationErrorMessage.invalidCodeChallengeMethod.desc);
    };
    /**
     * Throws error when both params: code_challenge and code_challenge_method are not passed together
     */
    ClientConfigurationError.createInvalidCodeChallengeParamsError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidCodeChallengeParams.code, ClientConfigurationErrorMessage.invalidCodeChallengeParams.desc);
    };
    /**
     * Throws an error when the user passes invalid cloudDiscoveryMetadata
     */
    ClientConfigurationError.createInvalidCloudDiscoveryMetadataError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidCloudDiscoveryMetadata.code, ClientConfigurationErrorMessage.invalidCloudDiscoveryMetadata.desc);
    };
    /**
     * Throws an error when the user passes invalid cloudDiscoveryMetadata
     */
    ClientConfigurationError.createInvalidAuthorityMetadataError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidAuthorityMetadata.code, ClientConfigurationErrorMessage.invalidAuthorityMetadata.desc);
    };
    /**
     * Throws error when provided authority is not a member of the trusted host list
     */
    ClientConfigurationError.createUntrustedAuthorityError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.untrustedAuthority.code, ClientConfigurationErrorMessage.untrustedAuthority.desc);
    };
    /**
     * Throws error when the AzureCloudInstance is set to an invalid value
     */
    ClientConfigurationError.createInvalidAzureCloudInstanceError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidAzureCloudInstance.code, ClientConfigurationErrorMessage.invalidAzureCloudInstance.desc);
    };
    /**
     * Throws an error when the authentication scheme is set to SSH but the SSH public key is omitted from the request
     */
    ClientConfigurationError.createMissingSshJwkError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.missingSshJwk.code, ClientConfigurationErrorMessage.missingSshJwk.desc);
    };
    /**
     * Throws an error when the authentication scheme is set to SSH but the SSH public key ID is omitted from the request
     */
    ClientConfigurationError.createMissingSshKidError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.missingSshKid.code, ClientConfigurationErrorMessage.missingSshKid.desc);
    };
    /**
     * Throws error when provided headers don't contain a header that a server nonce can be extracted from
     */
    ClientConfigurationError.createMissingNonceAuthenticationHeadersError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.missingNonceAuthenticationHeader.code, ClientConfigurationErrorMessage.missingNonceAuthenticationHeader.desc);
    };
    /**
     * Throws error when a provided header is invalid in any way
     */
    ClientConfigurationError.createInvalidAuthenticationHeaderError = function (invalidHeaderName, details) {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidAuthenticationHeader.code, ClientConfigurationErrorMessage.invalidAuthenticationHeader.desc + ". Invalid header: " + invalidHeaderName + ". Details: " + details);
    };
    return ClientConfigurationError;
}(ClientAuthError));

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * The ScopeSet class creates a set of scopes. Scopes are case-insensitive, unique values, so the Set object in JS makes
 * the most sense to implement for this class. All scopes are trimmed and converted to lower case strings in intersection and union functions
 * to ensure uniqueness of strings.
 */
var ScopeSet = /** @class */ (function () {
    function ScopeSet(inputScopes) {
        var _this = this;
        // Filter empty string and null/undefined array items
        var scopeArr = inputScopes ? StringUtils.trimArrayEntries(__spreadArrays(inputScopes)) : [];
        var filteredInput = scopeArr ? StringUtils.removeEmptyStringsFromArray(scopeArr) : [];
        // Validate and filter scopes (validate function throws if validation fails)
        this.validateInputScopes(filteredInput);
        this.scopes = new Set(); // Iterator in constructor not supported by IE11
        filteredInput.forEach(function (scope) { return _this.scopes.add(scope); });
    }
    /**
     * Factory method to create ScopeSet from space-delimited string
     * @param inputScopeString
     * @param appClientId
     * @param scopesRequired
     */
    ScopeSet.fromString = function (inputScopeString) {
        var scopeString = inputScopeString || Constants.EMPTY_STRING;
        var inputScopes = scopeString.split(" ");
        return new ScopeSet(inputScopes);
    };
    /**
     * Used to validate the scopes input parameter requested  by the developer.
     * @param {Array<string>} inputScopes - Developer requested permissions. Not all scopes are guaranteed to be included in the access token returned.
     * @param {boolean} scopesRequired - Boolean indicating whether the scopes array is required or not
     */
    ScopeSet.prototype.validateInputScopes = function (inputScopes) {
        // Check if scopes are required but not given or is an empty array
        if (!inputScopes || inputScopes.length < 1) {
            throw ClientConfigurationError.createEmptyScopesArrayError();
        }
    };
    /**
     * Check if a given scope is present in this set of scopes.
     * @param scope
     */
    ScopeSet.prototype.containsScope = function (scope) {
        var lowerCaseScopes = this.printScopesLowerCase().split(" ");
        var lowerCaseScopesSet = new ScopeSet(lowerCaseScopes);
        // compare lowercase scopes
        return !StringUtils.isEmpty(scope) ? lowerCaseScopesSet.scopes.has(scope.toLowerCase()) : false;
    };
    /**
     * Check if a set of scopes is present in this set of scopes.
     * @param scopeSet
     */
    ScopeSet.prototype.containsScopeSet = function (scopeSet) {
        var _this = this;
        if (!scopeSet || scopeSet.scopes.size <= 0) {
            return false;
        }
        return (this.scopes.size >= scopeSet.scopes.size && scopeSet.asArray().every(function (scope) { return _this.containsScope(scope); }));
    };
    /**
     * Check if set of scopes contains only the defaults
     */
    ScopeSet.prototype.containsOnlyOIDCScopes = function () {
        var _this = this;
        var defaultScopeCount = 0;
        OIDC_SCOPES.forEach(function (defaultScope) {
            if (_this.containsScope(defaultScope)) {
                defaultScopeCount += 1;
            }
        });
        return this.scopes.size === defaultScopeCount;
    };
    /**
     * Appends single scope if passed
     * @param newScope
     */
    ScopeSet.prototype.appendScope = function (newScope) {
        if (!StringUtils.isEmpty(newScope)) {
            this.scopes.add(newScope.trim());
        }
    };
    /**
     * Appends multiple scopes if passed
     * @param newScopes
     */
    ScopeSet.prototype.appendScopes = function (newScopes) {
        var _this = this;
        try {
            newScopes.forEach(function (newScope) { return _this.appendScope(newScope); });
        }
        catch (e) {
            throw ClientAuthError.createAppendScopeSetError(e);
        }
    };
    /**
     * Removes element from set of scopes.
     * @param scope
     */
    ScopeSet.prototype.removeScope = function (scope) {
        if (StringUtils.isEmpty(scope)) {
            throw ClientAuthError.createRemoveEmptyScopeFromSetError(scope);
        }
        this.scopes.delete(scope.trim());
    };
    /**
     * Removes default scopes from set of scopes
     * Primarily used to prevent cache misses if the default scopes are not returned from the server
     */
    ScopeSet.prototype.removeOIDCScopes = function () {
        var _this = this;
        OIDC_SCOPES.forEach(function (defaultScope) {
            _this.scopes.delete(defaultScope);
        });
    };
    /**
     * Combines an array of scopes with the current set of scopes.
     * @param otherScopes
     */
    ScopeSet.prototype.unionScopeSets = function (otherScopes) {
        if (!otherScopes) {
            throw ClientAuthError.createEmptyInputScopeSetError();
        }
        var unionScopes = new Set(); // Iterator in constructor not supported in IE11
        otherScopes.scopes.forEach(function (scope) { return unionScopes.add(scope.toLowerCase()); });
        this.scopes.forEach(function (scope) { return unionScopes.add(scope.toLowerCase()); });
        return unionScopes;
    };
    /**
     * Check if scopes intersect between this set and another.
     * @param otherScopes
     */
    ScopeSet.prototype.intersectingScopeSets = function (otherScopes) {
        if (!otherScopes) {
            throw ClientAuthError.createEmptyInputScopeSetError();
        }
        // Do not allow OIDC scopes to be the only intersecting scopes
        if (!otherScopes.containsOnlyOIDCScopes()) {
            otherScopes.removeOIDCScopes();
        }
        var unionScopes = this.unionScopeSets(otherScopes);
        var sizeOtherScopes = otherScopes.getScopeCount();
        var sizeThisScopes = this.getScopeCount();
        var sizeUnionScopes = unionScopes.size;
        return sizeUnionScopes < (sizeThisScopes + sizeOtherScopes);
    };
    /**
     * Returns size of set of scopes.
     */
    ScopeSet.prototype.getScopeCount = function () {
        return this.scopes.size;
    };
    /**
     * Returns the scopes as an array of string values
     */
    ScopeSet.prototype.asArray = function () {
        var array = [];
        this.scopes.forEach(function (val) { return array.push(val); });
        return array;
    };
    /**
     * Prints scopes into a space-delimited string
     */
    ScopeSet.prototype.printScopes = function () {
        if (this.scopes) {
            var scopeArr = this.asArray();
            return scopeArr.join(" ");
        }
        return Constants.EMPTY_STRING;
    };
    /**
     * Prints scopes into a space-delimited lower-case string (used for caching)
     */
    ScopeSet.prototype.printScopesLowerCase = function () {
        return this.printScopes().toLowerCase();
    };
    return ScopeSet;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Function to build a client info object from server clientInfo string
 * @param rawClientInfo
 * @param crypto
 */
function buildClientInfo(rawClientInfo, crypto) {
    if (StringUtils.isEmpty(rawClientInfo)) {
        throw ClientAuthError.createClientInfoEmptyError();
    }
    try {
        var decodedClientInfo = crypto.base64Decode(rawClientInfo);
        return JSON.parse(decodedClientInfo);
    }
    catch (e) {
        throw ClientAuthError.createClientInfoDecodingError(e);
    }
}
/**
 * Function to build a client info object from cached homeAccountId string
 * @param homeAccountId
 */
function buildClientInfoFromHomeAccountId(homeAccountId) {
    if (StringUtils.isEmpty(homeAccountId)) {
        throw ClientAuthError.createClientInfoDecodingError("Home account ID was empty.");
    }
    var clientInfoParts = homeAccountId.split(Separators.CLIENT_INFO_SEPARATOR, 2);
    return {
        uid: clientInfoParts[0],
        utid: clientInfoParts.length < 2 ? Constants.EMPTY_STRING : clientInfoParts[1]
    };
}

/*! @azure/msal-common v7.3.0 2022-08-01 */
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Authority types supported by MSAL.
 */
var AuthorityType;
(function (AuthorityType) {
    AuthorityType[AuthorityType["Default"] = 0] = "Default";
    AuthorityType[AuthorityType["Adfs"] = 1] = "Adfs";
})(AuthorityType || (AuthorityType = {}));

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Type that defines required and optional parameters for an Account field (based on universal cache schema implemented by all MSALs).
 *
 * Key : Value Schema
 *
 * Key: <home_account_id>-<environment>-<realm*>
 *
 * Value Schema:
 * {
 *      homeAccountId: home account identifier for the auth scheme,
 *      environment: entity that issued the token, represented as a full host
 *      realm: Full tenant or organizational identifier that the account belongs to
 *      localAccountId: Original tenant-specific accountID, usually used for legacy cases
 *      username: primary username that represents the user, usually corresponds to preferred_username in the v2 endpt
 *      authorityType: Accounts authority type as a string
 *      name: Full name for the account, including given name and family name,
 *      clientInfo: Full base64 encoded client info received from ESTS
 *      lastModificationTime: last time this entity was modified in the cache
 *      lastModificationApp:
 *      idTokenClaims: Object containing claims parsed from ID token
 *      nativeAccountId: Account identifier on the native device
 * }
 */
var AccountEntity = /** @class */ (function () {
    function AccountEntity() {
    }
    /**
     * Generate Account Id key component as per the schema: <home_account_id>-<environment>
     */
    AccountEntity.prototype.generateAccountId = function () {
        var accountId = [this.homeAccountId, this.environment];
        return accountId.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();
    };
    /**
     * Generate Account Cache Key as per the schema: <home_account_id>-<environment>-<realm*>
     */
    AccountEntity.prototype.generateAccountKey = function () {
        return AccountEntity.generateAccountCacheKey({
            homeAccountId: this.homeAccountId,
            environment: this.environment,
            tenantId: this.realm,
            username: this.username,
            localAccountId: this.localAccountId
        });
    };
    /**
     * returns the type of the cache (in this case account)
     */
    AccountEntity.prototype.generateType = function () {
        switch (this.authorityType) {
            case CacheAccountType.ADFS_ACCOUNT_TYPE:
                return CacheType.ADFS;
            case CacheAccountType.MSAV1_ACCOUNT_TYPE:
                return CacheType.MSA;
            case CacheAccountType.MSSTS_ACCOUNT_TYPE:
                return CacheType.MSSTS;
            case CacheAccountType.GENERIC_ACCOUNT_TYPE:
                return CacheType.GENERIC;
            default: {
                throw ClientAuthError.createUnexpectedAccountTypeError();
            }
        }
    };
    /**
     * Returns the AccountInfo interface for this account.
     */
    AccountEntity.prototype.getAccountInfo = function () {
        return {
            homeAccountId: this.homeAccountId,
            environment: this.environment,
            tenantId: this.realm,
            username: this.username,
            localAccountId: this.localAccountId,
            name: this.name,
            idTokenClaims: this.idTokenClaims,
            nativeAccountId: this.nativeAccountId
        };
    };
    /**
     * Generates account key from interface
     * @param accountInterface
     */
    AccountEntity.generateAccountCacheKey = function (accountInterface) {
        var accountKey = [
            accountInterface.homeAccountId,
            accountInterface.environment || Constants.EMPTY_STRING,
            accountInterface.tenantId || Constants.EMPTY_STRING,
        ];
        return accountKey.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();
    };
    /**
     * Build Account cache from IdToken, clientInfo and authority/policy. Associated with AAD.
     * @param clientInfo
     * @param authority
     * @param idToken
     * @param policy
     */
    AccountEntity.createAccount = function (clientInfo, homeAccountId, idToken, authority, cloudGraphHostName, msGraphHost, environment, nativeAccountId) {
        var _a, _b, _c, _d, _e, _f;
        var account = new AccountEntity();
        account.authorityType = CacheAccountType.MSSTS_ACCOUNT_TYPE;
        account.clientInfo = clientInfo;
        account.homeAccountId = homeAccountId;
        account.nativeAccountId = nativeAccountId;
        var env = environment || (authority && authority.getPreferredCache());
        if (!env) {
            throw ClientAuthError.createInvalidCacheEnvironmentError();
        }
        account.environment = env;
        // non AAD scenarios can have empty realm
        account.realm = ((_a = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _a === void 0 ? void 0 : _a.tid) || Constants.EMPTY_STRING;
        if (idToken) {
            account.idTokenClaims = idToken.claims;
            // How do you account for MSA CID here?
            account.localAccountId = ((_b = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _b === void 0 ? void 0 : _b.oid) || ((_c = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _c === void 0 ? void 0 : _c.sub) || Constants.EMPTY_STRING;
            /*
             * In B2C scenarios the emails claim is used instead of preferred_username and it is an array. In most cases it will contain a single email.
             * This field should not be relied upon if a custom policy is configured to return more than 1 email.
             */
            account.username = ((_d = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _d === void 0 ? void 0 : _d.preferred_username) || (((_e = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _e === void 0 ? void 0 : _e.emails) ? idToken.claims.emails[0] : Constants.EMPTY_STRING);
            account.name = (_f = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _f === void 0 ? void 0 : _f.name;
        }
        account.cloudGraphHostName = cloudGraphHostName;
        account.msGraphHost = msGraphHost;
        return account;
    };
    /**
     * Builds non-AAD/ADFS account.
     * @param authority
     * @param idToken
     */
    AccountEntity.createGenericAccount = function (homeAccountId, idToken, authority, cloudGraphHostName, msGraphHost, environment) {
        var _a, _b, _c, _d;
        var account = new AccountEntity();
        account.authorityType = (authority && authority.authorityType === AuthorityType.Adfs) ? CacheAccountType.ADFS_ACCOUNT_TYPE : CacheAccountType.GENERIC_ACCOUNT_TYPE;
        account.homeAccountId = homeAccountId;
        // non AAD scenarios can have empty realm
        account.realm = Constants.EMPTY_STRING;
        var env = environment || authority && authority.getPreferredCache();
        if (!env) {
            throw ClientAuthError.createInvalidCacheEnvironmentError();
        }
        if (idToken) {
            // How do you account for MSA CID here?
            account.localAccountId = ((_a = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _a === void 0 ? void 0 : _a.oid) || ((_b = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _b === void 0 ? void 0 : _b.sub) || Constants.EMPTY_STRING;
            // upn claim for most ADFS scenarios
            account.username = ((_c = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _c === void 0 ? void 0 : _c.upn) || Constants.EMPTY_STRING;
            account.name = ((_d = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _d === void 0 ? void 0 : _d.name) || Constants.EMPTY_STRING;
            account.idTokenClaims = idToken === null || idToken === void 0 ? void 0 : idToken.claims;
        }
        account.environment = env;
        account.cloudGraphHostName = cloudGraphHostName;
        account.msGraphHost = msGraphHost;
        /*
         * add uniqueName to claims
         * account.name = idToken.claims.uniqueName;
         */
        return account;
    };
    /**
     * Generate HomeAccountId from server response
     * @param serverClientInfo
     * @param authType
     */
    AccountEntity.generateHomeAccountId = function (serverClientInfo, authType, logger, cryptoObj, idToken) {
        var _a;
        var accountId = ((_a = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _a === void 0 ? void 0 : _a.sub) ? idToken.claims.sub : Constants.EMPTY_STRING;
        // since ADFS does not have tid and does not set client_info
        if (authType === AuthorityType.Adfs) {
            return accountId;
        }
        // for cases where there is clientInfo
        if (serverClientInfo) {
            try {
                var clientInfo = buildClientInfo(serverClientInfo, cryptoObj);
                if (!StringUtils.isEmpty(clientInfo.uid) && !StringUtils.isEmpty(clientInfo.utid)) {
                    return "" + clientInfo.uid + Separators.CLIENT_INFO_SEPARATOR + clientInfo.utid;
                }
            }
            catch (e) { }
        }
        // default to "sub" claim
        logger.verbose("No client info in response");
        return accountId;
    };
    /**
     * Validates an entity: checks for all expected params
     * @param entity
     */
    AccountEntity.isAccountEntity = function (entity) {
        if (!entity) {
            return false;
        }
        return (entity.hasOwnProperty("homeAccountId") &&
            entity.hasOwnProperty("environment") &&
            entity.hasOwnProperty("realm") &&
            entity.hasOwnProperty("localAccountId") &&
            entity.hasOwnProperty("username") &&
            entity.hasOwnProperty("authorityType"));
    };
    /**
     * Helper function to determine whether 2 accountInfo objects represent the same account
     * @param accountA
     * @param accountB
     * @param compareClaims - If set to true idTokenClaims will also be compared to determine account equality
     */
    AccountEntity.accountInfoIsEqual = function (accountA, accountB, compareClaims) {
        if (!accountA || !accountB) {
            return false;
        }
        var claimsMatch = true; // default to true so as to not fail comparison below if compareClaims: false
        if (compareClaims) {
            var accountAClaims = (accountA.idTokenClaims || {});
            var accountBClaims = (accountB.idTokenClaims || {});
            // issued at timestamp and nonce are expected to change each time a new id token is acquired
            claimsMatch = (accountAClaims.iat === accountBClaims.iat) &&
                (accountAClaims.nonce === accountBClaims.nonce);
        }
        return (accountA.homeAccountId === accountB.homeAccountId) &&
            (accountA.localAccountId === accountB.localAccountId) &&
            (accountA.username === accountB.username) &&
            (accountA.tenantId === accountB.tenantId) &&
            (accountA.environment === accountB.environment) &&
            (accountA.nativeAccountId === accountB.nativeAccountId) &&
            claimsMatch;
    };
    return AccountEntity;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * JWT Token representation class. Parses token string and generates claims object.
 */
var AuthToken = /** @class */ (function () {
    function AuthToken(rawToken, crypto) {
        if (StringUtils.isEmpty(rawToken)) {
            throw ClientAuthError.createTokenNullOrEmptyError(rawToken);
        }
        this.rawToken = rawToken;
        this.claims = AuthToken.extractTokenClaims(rawToken, crypto);
    }
    /**
     * Extract token by decoding the rawToken
     *
     * @param encodedToken
     */
    AuthToken.extractTokenClaims = function (encodedToken, crypto) {
        var decodedToken = StringUtils.decodeAuthToken(encodedToken);
        // token will be decoded to get the username
        try {
            var base64TokenPayload = decodedToken.JWSPayload;
            // base64Decode() should throw an error if there is an issue
            var base64Decoded = crypto.base64Decode(base64TokenPayload);
            return JSON.parse(base64Decoded);
        }
        catch (err) {
            throw ClientAuthError.createTokenParsingError(err);
        }
    };
    return AuthToken;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Interface class which implement cache storage functions used by MSAL to perform validity checks, and store tokens.
 */
var CacheManager = /** @class */ (function () {
    function CacheManager(clientId, cryptoImpl) {
        this.clientId = clientId;
        this.cryptoImpl = cryptoImpl;
    }
    /**
     * Returns all accounts in cache
     */
    CacheManager.prototype.getAllAccounts = function () {
        var _this = this;
        var currentAccounts = this.getAccountsFilteredBy();
        var accountValues = Object.keys(currentAccounts).map(function (accountKey) { return currentAccounts[accountKey]; });
        var numAccounts = accountValues.length;
        if (numAccounts < 1) {
            return [];
        }
        else {
            var allAccounts = accountValues.map(function (value) {
                var accountEntity = CacheManager.toObject(new AccountEntity(), value);
                var accountInfo = accountEntity.getAccountInfo();
                var idToken = _this.readIdTokenFromCache(_this.clientId, accountInfo);
                if (idToken && !accountInfo.idTokenClaims) {
                    accountInfo.idTokenClaims = new AuthToken(idToken.secret, _this.cryptoImpl).claims;
                }
                return accountInfo;
            });
            return allAccounts;
        }
    };
    /**
     * saves a cache record
     * @param cacheRecord
     */
    CacheManager.prototype.saveCacheRecord = function (cacheRecord) {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        if (!cacheRecord) {
                            throw ClientAuthError.createNullOrUndefinedCacheRecord();
                        }
                        if (!!cacheRecord.account) {
                            this.setAccount(cacheRecord.account);
                        }
                        if (!!cacheRecord.idToken) {
                            this.setIdTokenCredential(cacheRecord.idToken);
                        }
                        if (!!!cacheRecord.accessToken) return [3 /*break*/, 2];
                        return [4 /*yield*/, this.saveAccessToken(cacheRecord.accessToken)];
                    case 1:
                        _a.sent();
                        _a.label = 2;
                    case 2:
                        if (!!cacheRecord.refreshToken) {
                            this.setRefreshTokenCredential(cacheRecord.refreshToken);
                        }
                        if (!!cacheRecord.appMetadata) {
                            this.setAppMetadata(cacheRecord.appMetadata);
                        }
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * saves access token credential
     * @param credential
     */
    CacheManager.prototype.saveAccessToken = function (credential) {
        return __awaiter(this, void 0, void 0, function () {
            var currentTokenCache, currentScopes, currentAccessTokens, removedAccessTokens_1;
            var _this = this;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        currentTokenCache = this.getCredentialsFilteredBy({
                            clientId: credential.clientId,
                            credentialType: credential.credentialType,
                            environment: credential.environment,
                            homeAccountId: credential.homeAccountId,
                            realm: credential.realm,
                            tokenType: credential.tokenType,
                            requestedClaimsHash: credential.requestedClaimsHash
                        });
                        currentScopes = ScopeSet.fromString(credential.target);
                        currentAccessTokens = Object.keys(currentTokenCache.accessTokens).map(function (key) { return currentTokenCache.accessTokens[key]; });
                        if (!currentAccessTokens) return [3 /*break*/, 2];
                        removedAccessTokens_1 = [];
                        currentAccessTokens.forEach(function (tokenEntity) {
                            var tokenScopeSet = ScopeSet.fromString(tokenEntity.target);
                            if (tokenScopeSet.intersectingScopeSets(currentScopes)) {
                                removedAccessTokens_1.push(_this.removeCredential(tokenEntity));
                            }
                        });
                        return [4 /*yield*/, Promise.all(removedAccessTokens_1)];
                    case 1:
                        _a.sent();
                        _a.label = 2;
                    case 2:
                        this.setAccessTokenCredential(credential);
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * retrieve accounts matching all provided filters; if no filter is set, get all accounts
     * not checking for casing as keys are all generated in lower case, remember to convert to lower case if object properties are compared
     * @param homeAccountId
     * @param environment
     * @param realm
     */
    CacheManager.prototype.getAccountsFilteredBy = function (accountFilter) {
        return this.getAccountsFilteredByInternal(accountFilter ? accountFilter.homeAccountId : Constants.EMPTY_STRING, accountFilter ? accountFilter.environment : Constants.EMPTY_STRING, accountFilter ? accountFilter.realm : Constants.EMPTY_STRING, accountFilter ? accountFilter.nativeAccountId : Constants.EMPTY_STRING);
    };
    /**
     * retrieve accounts matching all provided filters; if no filter is set, get all accounts
     * not checking for casing as keys are all generated in lower case, remember to convert to lower case if object properties are compared
     * @param homeAccountId
     * @param environment
     * @param realm
     */
    CacheManager.prototype.getAccountsFilteredByInternal = function (homeAccountId, environment, realm, nativeAccountId) {
        var _this = this;
        var allCacheKeys = this.getKeys();
        var matchingAccounts = {};
        allCacheKeys.forEach(function (cacheKey) {
            var entity = _this.getAccount(cacheKey);
            if (!entity) {
                return;
            }
            if (!!homeAccountId && !_this.matchHomeAccountId(entity, homeAccountId)) {
                return;
            }
            if (!!environment && !_this.matchEnvironment(entity, environment)) {
                return;
            }
            if (!!realm && !_this.matchRealm(entity, realm)) {
                return;
            }
            if (!!nativeAccountId && !_this.matchNativeAccountId(entity, nativeAccountId)) {
                return;
            }
            matchingAccounts[cacheKey] = entity;
        });
        return matchingAccounts;
    };
    /**
     * retrieve credentails matching all provided filters; if no filter is set, get all credentials
     * @param homeAccountId
     * @param environment
     * @param credentialType
     * @param clientId
     * @param realm
     * @param target
     */
    CacheManager.prototype.getCredentialsFilteredBy = function (filter) {
        return this.getCredentialsFilteredByInternal(filter.homeAccountId, filter.environment, filter.credentialType, filter.clientId, filter.familyId, filter.realm, filter.target, filter.userAssertionHash, filter.tokenType, filter.keyId, filter.requestedClaimsHash);
    };
    /**
     * Support function to help match credentials
     * @param homeAccountId
     * @param environment
     * @param credentialType
     * @param clientId
     * @param realm
     * @param target
     * @param userAssertionHash
     * @param tokenType
     */
    CacheManager.prototype.getCredentialsFilteredByInternal = function (homeAccountId, environment, credentialType, clientId, familyId, realm, target, userAssertionHash, tokenType, keyId, requestedClaimsHash) {
        var _this = this;
        var allCacheKeys = this.getKeys();
        var matchingCredentials = {
            idTokens: {},
            accessTokens: {},
            refreshTokens: {},
        };
        allCacheKeys.forEach(function (cacheKey) {
            // don't parse any non-credential type cache entities
            var credType = CredentialEntity.getCredentialType(cacheKey);
            if (credType === Constants.NOT_DEFINED) {
                return;
            }
            // Attempt retrieval
            var entity = _this.getSpecificCredential(cacheKey, credType);
            if (!entity) {
                return;
            }
            if (!!userAssertionHash && !_this.matchUserAssertionHash(entity, userAssertionHash)) {
                return;
            }
            if (!!homeAccountId && !_this.matchHomeAccountId(entity, homeAccountId)) {
                return;
            }
            if (!!environment && !_this.matchEnvironment(entity, environment)) {
                return;
            }
            if (!!realm && !_this.matchRealm(entity, realm)) {
                return;
            }
            if (!!credentialType && !_this.matchCredentialType(entity, credentialType)) {
                return;
            }
            if (!!clientId && !_this.matchClientId(entity, clientId)) {
                return;
            }
            if (!!familyId && !_this.matchFamilyId(entity, familyId)) {
                return;
            }
            /*
             * idTokens do not have "target", target specific refreshTokens do exist for some types of authentication
             * Resource specific refresh tokens case will be added when the support is deemed necessary
             */
            if (!!target && !_this.matchTarget(entity, target)) {
                return;
            }
            // If request OR cached entity has requested Claims Hash, check if they match
            if (requestedClaimsHash || entity.requestedClaimsHash) {
                // Don't match if either is undefined or they are different
                if (entity.requestedClaimsHash !== requestedClaimsHash) {
                    return;
                }
            }
            // Access Token with Auth Scheme specific matching
            if (credentialType === CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME) {
                if (!!tokenType && !_this.matchTokenType(entity, tokenType)) {
                    return;
                }
                // KeyId (sshKid) in request must match cached SSH certificate keyId because SSH cert is bound to a specific key
                if (tokenType === exports.AuthenticationScheme.SSH) {
                    if (keyId && !_this.matchKeyId(entity, keyId)) {
                        return;
                    }
                }
            }
            // At this point, the entity matches the request, update cache key if key schema has changed
            var updatedCacheKey = _this.updateCredentialCacheKey(cacheKey, entity);
            switch (credType) {
                case CredentialType.ID_TOKEN:
                    matchingCredentials.idTokens[updatedCacheKey] = entity;
                    break;
                case CredentialType.ACCESS_TOKEN:
                case CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME:
                    matchingCredentials.accessTokens[updatedCacheKey] = entity;
                    break;
                case CredentialType.REFRESH_TOKEN:
                    matchingCredentials.refreshTokens[updatedCacheKey] = entity;
                    break;
            }
        });
        return matchingCredentials;
    };
    /**
     * retrieve appMetadata matching all provided filters; if no filter is set, get all appMetadata
     * @param filter
     */
    CacheManager.prototype.getAppMetadataFilteredBy = function (filter) {
        return this.getAppMetadataFilteredByInternal(filter.environment, filter.clientId);
    };
    /**
     * Support function to help match appMetadata
     * @param environment
     * @param clientId
     */
    CacheManager.prototype.getAppMetadataFilteredByInternal = function (environment, clientId) {
        var _this = this;
        var allCacheKeys = this.getKeys();
        var matchingAppMetadata = {};
        allCacheKeys.forEach(function (cacheKey) {
            // don't parse any non-appMetadata type cache entities
            if (!_this.isAppMetadata(cacheKey)) {
                return;
            }
            // Attempt retrieval
            var entity = _this.getAppMetadata(cacheKey);
            if (!entity) {
                return;
            }
            if (!!environment && !_this.matchEnvironment(entity, environment)) {
                return;
            }
            if (!!clientId && !_this.matchClientId(entity, clientId)) {
                return;
            }
            matchingAppMetadata[cacheKey] = entity;
        });
        return matchingAppMetadata;
    };
    /**
     * retrieve authorityMetadata that contains a matching alias
     * @param filter
     */
    CacheManager.prototype.getAuthorityMetadataByAlias = function (host) {
        var _this = this;
        var allCacheKeys = this.getAuthorityMetadataKeys();
        var matchedEntity = null;
        allCacheKeys.forEach(function (cacheKey) {
            // don't parse any non-authorityMetadata type cache entities
            if (!_this.isAuthorityMetadata(cacheKey) || cacheKey.indexOf(_this.clientId) === -1) {
                return;
            }
            // Attempt retrieval
            var entity = _this.getAuthorityMetadata(cacheKey);
            if (!entity) {
                return;
            }
            if (entity.aliases.indexOf(host) === -1) {
                return;
            }
            matchedEntity = entity;
        });
        return matchedEntity;
    };
    /**
     * Removes all accounts and related tokens from cache.
     */
    CacheManager.prototype.removeAllAccounts = function () {
        return __awaiter(this, void 0, void 0, function () {
            var allCacheKeys, removedAccounts;
            var _this = this;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        allCacheKeys = this.getKeys();
                        removedAccounts = [];
                        allCacheKeys.forEach(function (cacheKey) {
                            var entity = _this.getAccount(cacheKey);
                            if (!entity) {
                                return;
                            }
                            removedAccounts.push(_this.removeAccount(cacheKey));
                        });
                        return [4 /*yield*/, Promise.all(removedAccounts)];
                    case 1:
                        _a.sent();
                        return [2 /*return*/, true];
                }
            });
        });
    };
    /**
     * returns a boolean if the given account is removed
     * @param account
     */
    CacheManager.prototype.removeAccount = function (accountKey) {
        return __awaiter(this, void 0, void 0, function () {
            var account;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        account = this.getAccount(accountKey);
                        if (!account) {
                            throw ClientAuthError.createNoAccountFoundError();
                        }
                        return [4 /*yield*/, this.removeAccountContext(account)];
                    case 1: return [2 /*return*/, ((_a.sent()) && this.removeItem(accountKey, CacheSchemaType.ACCOUNT))];
                }
            });
        });
    };
    /**
     * Removes credentials associated with the provided account
     * @param account
     */
    CacheManager.prototype.removeAccountContext = function (account) {
        return __awaiter(this, void 0, void 0, function () {
            var allCacheKeys, accountId, removedCredentials;
            var _this = this;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        allCacheKeys = this.getKeys();
                        accountId = account.generateAccountId();
                        removedCredentials = [];
                        allCacheKeys.forEach(function (cacheKey) {
                            // don't parse any non-credential type cache entities
                            var credType = CredentialEntity.getCredentialType(cacheKey);
                            if (credType === Constants.NOT_DEFINED) {
                                return;
                            }
                            var cacheEntity = _this.getSpecificCredential(cacheKey, credType);
                            if (!!cacheEntity && accountId === cacheEntity.generateAccountId()) {
                                removedCredentials.push(_this.removeCredential(cacheEntity));
                            }
                        });
                        return [4 /*yield*/, Promise.all(removedCredentials)];
                    case 1:
                        _a.sent();
                        return [2 /*return*/, true];
                }
            });
        });
    };
    /**
     * returns a boolean if the given credential is removed
     * @param credential
     */
    CacheManager.prototype.removeCredential = function (credential) {
        return __awaiter(this, void 0, void 0, function () {
            var key, accessTokenWithAuthSchemeEntity, kid;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        key = credential.generateCredentialKey();
                        if (!(credential.credentialType.toLowerCase() === CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME.toLowerCase())) return [3 /*break*/, 4];
                        if (!(credential.tokenType === exports.AuthenticationScheme.POP)) return [3 /*break*/, 4];
                        accessTokenWithAuthSchemeEntity = credential;
                        kid = accessTokenWithAuthSchemeEntity.keyId;
                        if (!kid) return [3 /*break*/, 4];
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        return [4 /*yield*/, this.cryptoImpl.removeTokenBindingKey(kid)];
                    case 2:
                        _a.sent();
                        return [3 /*break*/, 4];
                    case 3:
                        _a.sent();
                        throw ClientAuthError.createBindingKeyNotRemovedError();
                    case 4: return [2 /*return*/, this.removeItem(key, CacheSchemaType.CREDENTIAL)];
                }
            });
        });
    };
    /**
     * Removes all app metadata objects from cache.
     */
    CacheManager.prototype.removeAppMetadata = function () {
        var _this = this;
        var allCacheKeys = this.getKeys();
        allCacheKeys.forEach(function (cacheKey) {
            if (_this.isAppMetadata(cacheKey)) {
                _this.removeItem(cacheKey, CacheSchemaType.APP_METADATA);
            }
        });
        return true;
    };
    /**
     * Retrieve the cached credentials into a cacherecord
     * @param account
     * @param clientId
     * @param scopes
     * @param environment
     * @param authScheme
     */
    CacheManager.prototype.readCacheRecord = function (account, clientId, request, environment) {
        var cachedAccount = this.readAccountFromCache(account);
        var cachedIdToken = this.readIdTokenFromCache(clientId, account);
        var cachedAccessToken = this.readAccessTokenFromCache(clientId, account, request);
        var cachedRefreshToken = this.readRefreshTokenFromCache(clientId, account, false);
        var cachedAppMetadata = this.readAppMetadataFromCache(environment, clientId);
        if (cachedAccount && cachedIdToken) {
            cachedAccount.idTokenClaims = new AuthToken(cachedIdToken.secret, this.cryptoImpl).claims;
        }
        return {
            account: cachedAccount,
            idToken: cachedIdToken,
            accessToken: cachedAccessToken,
            refreshToken: cachedRefreshToken,
            appMetadata: cachedAppMetadata,
        };
    };
    /**
     * Retrieve AccountEntity from cache
     * @param account
     */
    CacheManager.prototype.readAccountFromCache = function (account) {
        var accountKey = AccountEntity.generateAccountCacheKey(account);
        return this.getAccount(accountKey);
    };
    /**
     * Retrieve AccountEntity from cache
     * @param nativeAccountId
     * @returns AccountEntity or Null
     */
    CacheManager.prototype.readAccountFromCacheWithNativeAccountId = function (nativeAccountId) {
        // fetch account from memory
        var accountFilter = {
            nativeAccountId: nativeAccountId
        };
        var accountCache = this.getAccountsFilteredBy(accountFilter);
        var accounts = Object.keys(accountCache).map(function (key) { return accountCache[key]; });
        if (accounts.length < 1) {
            return null;
        }
        else if (accounts.length > 1) {
            throw ClientAuthError.createMultipleMatchingAccountsInCacheError();
        }
        return accountCache[0];
    };
    /**
     * Retrieve IdTokenEntity from cache
     * @param clientId
     * @param account
     * @param inputRealm
     */
    CacheManager.prototype.readIdTokenFromCache = function (clientId, account) {
        var idTokenFilter = {
            homeAccountId: account.homeAccountId,
            environment: account.environment,
            credentialType: CredentialType.ID_TOKEN,
            clientId: clientId,
            realm: account.tenantId,
        };
        var credentialCache = this.getCredentialsFilteredBy(idTokenFilter);
        var idTokens = Object.keys(credentialCache.idTokens).map(function (key) { return credentialCache.idTokens[key]; });
        var numIdTokens = idTokens.length;
        if (numIdTokens < 1) {
            return null;
        }
        else if (numIdTokens > 1) {
            throw ClientAuthError.createMultipleMatchingTokensInCacheError();
        }
        return idTokens[0];
    };
    /**
     * Retrieve AccessTokenEntity from cache
     * @param clientId
     * @param account
     * @param scopes
     * @param authScheme
     */
    CacheManager.prototype.readAccessTokenFromCache = function (clientId, account, request) {
        var scopes = new ScopeSet(request.scopes || []);
        var authScheme = request.authenticationScheme || exports.AuthenticationScheme.BEARER;
        /*
         * Distinguish between Bearer and PoP/SSH token cache types
         * Cast to lowercase to handle "bearer" from ADFS
         */
        var credentialType = (authScheme && authScheme.toLowerCase() !== exports.AuthenticationScheme.BEARER.toLowerCase()) ? CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME : CredentialType.ACCESS_TOKEN;
        var accessTokenFilter = {
            homeAccountId: account.homeAccountId,
            environment: account.environment,
            credentialType: credentialType,
            clientId: clientId,
            realm: account.tenantId,
            target: scopes.printScopesLowerCase(),
            tokenType: authScheme,
            keyId: request.sshKid,
            requestedClaimsHash: request.requestedClaimsHash,
        };
        var credentialCache = this.getCredentialsFilteredBy(accessTokenFilter);
        var accessTokens = Object.keys(credentialCache.accessTokens).map(function (key) { return credentialCache.accessTokens[key]; });
        var numAccessTokens = accessTokens.length;
        if (numAccessTokens < 1) {
            return null;
        }
        else if (numAccessTokens > 1) {
            throw ClientAuthError.createMultipleMatchingTokensInCacheError();
        }
        return accessTokens[0];
    };
    /**
     * Helper to retrieve the appropriate refresh token from cache
     * @param clientId
     * @param account
     * @param familyRT
     */
    CacheManager.prototype.readRefreshTokenFromCache = function (clientId, account, familyRT) {
        var id = familyRT ? THE_FAMILY_ID : undefined;
        var refreshTokenFilter = {
            homeAccountId: account.homeAccountId,
            environment: account.environment,
            credentialType: CredentialType.REFRESH_TOKEN,
            clientId: clientId,
            familyId: id,
        };
        var credentialCache = this.getCredentialsFilteredBy(refreshTokenFilter);
        var refreshTokens = Object.keys(credentialCache.refreshTokens).map(function (key) { return credentialCache.refreshTokens[key]; });
        var numRefreshTokens = refreshTokens.length;
        if (numRefreshTokens < 1) {
            return null;
        }
        // address the else case after remove functions address environment aliases
        return refreshTokens[0];
    };
    /**
     * Retrieve AppMetadataEntity from cache
     */
    CacheManager.prototype.readAppMetadataFromCache = function (environment, clientId) {
        var appMetadataFilter = {
            environment: environment,
            clientId: clientId,
        };
        var appMetadata = this.getAppMetadataFilteredBy(appMetadataFilter);
        var appMetadataEntries = Object.keys(appMetadata).map(function (key) { return appMetadata[key]; });
        var numAppMetadata = appMetadataEntries.length;
        if (numAppMetadata < 1) {
            return null;
        }
        else if (numAppMetadata > 1) {
            throw ClientAuthError.createMultipleMatchingAppMetadataInCacheError();
        }
        return appMetadataEntries[0];
    };
    /**
     * Return the family_id value associated  with FOCI
     * @param environment
     * @param clientId
     */
    CacheManager.prototype.isAppMetadataFOCI = function (environment, clientId) {
        var appMetadata = this.readAppMetadataFromCache(environment, clientId);
        return !!(appMetadata && appMetadata.familyId === THE_FAMILY_ID);
    };
    /**
     * helper to match account ids
     * @param value
     * @param homeAccountId
     */
    CacheManager.prototype.matchHomeAccountId = function (entity, homeAccountId) {
        return !!(entity.homeAccountId && homeAccountId === entity.homeAccountId);
    };
    /**
     * helper to match assertion
     * @param value
     * @param oboAssertion
     */
    CacheManager.prototype.matchUserAssertionHash = function (entity, userAssertionHash) {
        return !!(entity.userAssertionHash && userAssertionHash === entity.userAssertionHash);
    };
    /**
     * helper to match environment
     * @param value
     * @param environment
     */
    CacheManager.prototype.matchEnvironment = function (entity, environment) {
        var cloudMetadata = this.getAuthorityMetadataByAlias(environment);
        if (cloudMetadata && cloudMetadata.aliases.indexOf(entity.environment) > -1) {
            return true;
        }
        return false;
    };
    /**
     * helper to match credential type
     * @param entity
     * @param credentialType
     */
    CacheManager.prototype.matchCredentialType = function (entity, credentialType) {
        return (entity.credentialType && credentialType.toLowerCase() === entity.credentialType.toLowerCase());
    };
    /**
     * helper to match client ids
     * @param entity
     * @param clientId
     */
    CacheManager.prototype.matchClientId = function (entity, clientId) {
        return !!(entity.clientId && clientId === entity.clientId);
    };
    /**
     * helper to match family ids
     * @param entity
     * @param familyId
     */
    CacheManager.prototype.matchFamilyId = function (entity, familyId) {
        return !!(entity.familyId && familyId === entity.familyId);
    };
    /**
     * helper to match realm
     * @param entity
     * @param realm
     */
    CacheManager.prototype.matchRealm = function (entity, realm) {
        return !!(entity.realm && realm === entity.realm);
    };
    /**
     * helper to match nativeAccountId
     * @param entity
     * @param nativeAccountId
     * @returns boolean indicating the match result
     */
    CacheManager.prototype.matchNativeAccountId = function (entity, nativeAccountId) {
        return !!(entity.nativeAccountId && nativeAccountId === entity.nativeAccountId);
    };
    /**
     * Returns true if the target scopes are a subset of the current entity's scopes, false otherwise.
     * @param entity
     * @param target
     */
    CacheManager.prototype.matchTarget = function (entity, target) {
        var isNotAccessTokenCredential = (entity.credentialType !== CredentialType.ACCESS_TOKEN && entity.credentialType !== CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME);
        if (isNotAccessTokenCredential || !entity.target) {
            return false;
        }
        var entityScopeSet = ScopeSet.fromString(entity.target);
        var requestTargetScopeSet = ScopeSet.fromString(target);
        if (!requestTargetScopeSet.containsOnlyOIDCScopes()) {
            requestTargetScopeSet.removeOIDCScopes(); // ignore OIDC scopes
        }
        else {
            requestTargetScopeSet.removeScope(Constants.OFFLINE_ACCESS_SCOPE);
        }
        return entityScopeSet.containsScopeSet(requestTargetScopeSet);
    };
    /**
     * Returns true if the credential's tokenType or Authentication Scheme matches the one in the request, false otherwise
     * @param entity
     * @param tokenType
     */
    CacheManager.prototype.matchTokenType = function (entity, tokenType) {
        return !!(entity.tokenType && entity.tokenType === tokenType);
    };
    /**
     * Returns true if the credential's keyId matches the one in the request, false otherwise
     * @param entity
     * @param tokenType
     */
    CacheManager.prototype.matchKeyId = function (entity, keyId) {
        return !!(entity.keyId && entity.keyId === keyId);
    };
    /**
     * returns if a given cache entity is of the type appmetadata
     * @param key
     */
    CacheManager.prototype.isAppMetadata = function (key) {
        return key.indexOf(APP_METADATA) !== -1;
    };
    /**
     * returns if a given cache entity is of the type authoritymetadata
     * @param key
     */
    CacheManager.prototype.isAuthorityMetadata = function (key) {
        return key.indexOf(AUTHORITY_METADATA_CONSTANTS.CACHE_KEY) !== -1;
    };
    /**
     * returns cache key used for cloud instance metadata
     */
    CacheManager.prototype.generateAuthorityMetadataCacheKey = function (authority) {
        return AUTHORITY_METADATA_CONSTANTS.CACHE_KEY + "-" + this.clientId + "-" + authority;
    };
    /**
     * Returns the specific credential (IdToken/AccessToken/RefreshToken) from the cache
     * @param key
     * @param credType
     */
    CacheManager.prototype.getSpecificCredential = function (key, credType) {
        switch (credType) {
            case CredentialType.ID_TOKEN: {
                return this.getIdTokenCredential(key);
            }
            case CredentialType.ACCESS_TOKEN:
            case CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME: {
                return this.getAccessTokenCredential(key);
            }
            case CredentialType.REFRESH_TOKEN: {
                return this.getRefreshTokenCredential(key);
            }
            default:
                return null;
        }
    };
    /**
     * Helper to convert serialized data to object
     * @param obj
     * @param json
     */
    CacheManager.toObject = function (obj, json) {
        for (var propertyName in json) {
            obj[propertyName] = json[propertyName];
        }
        return obj;
    };
    return CacheManager;
}());
var DefaultStorageClass = /** @class */ (function (_super) {
    __extends(DefaultStorageClass, _super);
    function DefaultStorageClass() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    DefaultStorageClass.prototype.setAccount = function () {
        var notImplErr = "Storage interface - setAccount() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getAccount = function () {
        var notImplErr = "Storage interface - getAccount() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.setIdTokenCredential = function () {
        var notImplErr = "Storage interface - setIdTokenCredential() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getIdTokenCredential = function () {
        var notImplErr = "Storage interface - getIdTokenCredential() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.setAccessTokenCredential = function () {
        var notImplErr = "Storage interface - setAccessTokenCredential() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getAccessTokenCredential = function () {
        var notImplErr = "Storage interface - getAccessTokenCredential() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.setRefreshTokenCredential = function () {
        var notImplErr = "Storage interface - setRefreshTokenCredential() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getRefreshTokenCredential = function () {
        var notImplErr = "Storage interface - getRefreshTokenCredential() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.setAppMetadata = function () {
        var notImplErr = "Storage interface - setAppMetadata() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getAppMetadata = function () {
        var notImplErr = "Storage interface - getAppMetadata() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.setServerTelemetry = function () {
        var notImplErr = "Storage interface - setServerTelemetry() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getServerTelemetry = function () {
        var notImplErr = "Storage interface - getServerTelemetry() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.setAuthorityMetadata = function () {
        var notImplErr = "Storage interface - setAuthorityMetadata() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getAuthorityMetadata = function () {
        var notImplErr = "Storage interface - getAuthorityMetadata() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getAuthorityMetadataKeys = function () {
        var notImplErr = "Storage interface - getAuthorityMetadataKeys() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.setThrottlingCache = function () {
        var notImplErr = "Storage interface - setThrottlingCache() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getThrottlingCache = function () {
        var notImplErr = "Storage interface - getThrottlingCache() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.removeItem = function () {
        var notImplErr = "Storage interface - removeItem() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.containsKey = function () {
        var notImplErr = "Storage interface - containsKey() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getKeys = function () {
        var notImplErr = "Storage interface - getKeys() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.clear = function () {
        return __awaiter(this, void 0, void 0, function () {
            var notImplErr;
            return __generator(this, function (_a) {
                notImplErr = "Storage interface - clear() has not been implemented for the cacheStorage interface.";
                throw AuthError.createUnexpectedError(notImplErr);
            });
        });
    };
    DefaultStorageClass.prototype.updateCredentialCacheKey = function () {
        var notImplErr = "Storage interface - updateCredentialCacheKey() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    return DefaultStorageClass;
}(CacheManager));

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
// Token renewal offset default in seconds
var DEFAULT_TOKEN_RENEWAL_OFFSET_SEC = 300;
var DEFAULT_SYSTEM_OPTIONS = {
    tokenRenewalOffsetSeconds: DEFAULT_TOKEN_RENEWAL_OFFSET_SEC,
    preventCorsPreflight: false,
    proxyUrl: Constants.EMPTY_STRING
};
var DEFAULT_LOGGER_IMPLEMENTATION = {
    loggerCallback: function () {
        // allow users to not set loggerCallback
    },
    piiLoggingEnabled: false,
    logLevel: exports.LogLevel.Info,
    correlationId: Constants.EMPTY_STRING
};
var DEFAULT_NETWORK_IMPLEMENTATION = {
    sendGetRequestAsync: function () {
        return __awaiter(this, void 0, void 0, function () {
            var notImplErr;
            return __generator(this, function (_a) {
                notImplErr = "Network interface - sendGetRequestAsync() has not been implemented";
                throw AuthError.createUnexpectedError(notImplErr);
            });
        });
    },
    sendPostRequestAsync: function () {
        return __awaiter(this, void 0, void 0, function () {
            var notImplErr;
            return __generator(this, function (_a) {
                notImplErr = "Network interface - sendPostRequestAsync() has not been implemented";
                throw AuthError.createUnexpectedError(notImplErr);
            });
        });
    }
};
var DEFAULT_LIBRARY_INFO = {
    sku: Constants.SKU,
    version: version$1,
    cpu: Constants.EMPTY_STRING,
    os: Constants.EMPTY_STRING
};
var DEFAULT_CLIENT_CREDENTIALS = {
    clientSecret: Constants.EMPTY_STRING,
    clientAssertion: undefined
};
var DEFAULT_AZURE_CLOUD_OPTIONS = {
    azureCloudInstance: exports.AzureCloudInstance.None,
    tenant: "" + Constants.DEFAULT_COMMON_TENANT
};
var DEFAULT_TELEMETRY_OPTIONS = {
    application: {
        appName: "",
        appVersion: ""
    }
};
/**
 * Function that sets the default options when not explicitly configured from app developer
 *
 * @param Configuration
 *
 * @returns Configuration
 */
function buildClientConfiguration(_a) {
    var userAuthOptions = _a.authOptions, userSystemOptions = _a.systemOptions, userLoggerOption = _a.loggerOptions, storageImplementation = _a.storageInterface, networkImplementation = _a.networkInterface, cryptoImplementation = _a.cryptoInterface, clientCredentials = _a.clientCredentials, libraryInfo = _a.libraryInfo, telemetry = _a.telemetry, serverTelemetryManager = _a.serverTelemetryManager, persistencePlugin = _a.persistencePlugin, serializableCache = _a.serializableCache;
    var loggerOptions = __assign(__assign({}, DEFAULT_LOGGER_IMPLEMENTATION), userLoggerOption);
    return {
        authOptions: buildAuthOptions(userAuthOptions),
        systemOptions: __assign(__assign({}, DEFAULT_SYSTEM_OPTIONS), userSystemOptions),
        loggerOptions: loggerOptions,
        storageInterface: storageImplementation || new DefaultStorageClass(userAuthOptions.clientId, DEFAULT_CRYPTO_IMPLEMENTATION),
        networkInterface: networkImplementation || DEFAULT_NETWORK_IMPLEMENTATION,
        cryptoInterface: cryptoImplementation || DEFAULT_CRYPTO_IMPLEMENTATION,
        clientCredentials: clientCredentials || DEFAULT_CLIENT_CREDENTIALS,
        libraryInfo: __assign(__assign({}, DEFAULT_LIBRARY_INFO), libraryInfo),
        telemetry: __assign(__assign({}, DEFAULT_TELEMETRY_OPTIONS), telemetry),
        serverTelemetryManager: serverTelemetryManager || null,
        persistencePlugin: persistencePlugin || null,
        serializableCache: serializableCache || null,
    };
}
/**
 * Construct authoptions from the client and platform passed values
 * @param authOptions
 */
function buildAuthOptions(authOptions) {
    return __assign({ clientCapabilities: [], azureCloudOptions: DEFAULT_AZURE_CLOUD_OPTIONS, skipAuthorityMetadataCache: false }, authOptions);
}

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Error thrown when there is an error with the server code, for example, unavailability.
 */
var ServerError = /** @class */ (function (_super) {
    __extends(ServerError, _super);
    function ServerError(errorCode, errorMessage, subError) {
        var _this = _super.call(this, errorCode, errorMessage, subError) || this;
        _this.name = "ServerError";
        Object.setPrototypeOf(_this, ServerError.prototype);
        return _this;
    }
    return ServerError;
}(AuthError));

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var ThrottlingUtils = /** @class */ (function () {
    function ThrottlingUtils() {
    }
    /**
     * Prepares a RequestThumbprint to be stored as a key.
     * @param thumbprint
     */
    ThrottlingUtils.generateThrottlingStorageKey = function (thumbprint) {
        return ThrottlingConstants.THROTTLING_PREFIX + "." + JSON.stringify(thumbprint);
    };
    /**
     * Performs necessary throttling checks before a network request.
     * @param cacheManager
     * @param thumbprint
     */
    ThrottlingUtils.preProcess = function (cacheManager, thumbprint) {
        var _a;
        var key = ThrottlingUtils.generateThrottlingStorageKey(thumbprint);
        var value = cacheManager.getThrottlingCache(key);
        if (value) {
            if (value.throttleTime < Date.now()) {
                cacheManager.removeItem(key, CacheSchemaType.THROTTLING);
                return;
            }
            throw new ServerError(((_a = value.errorCodes) === null || _a === void 0 ? void 0 : _a.join(" ")) || Constants.EMPTY_STRING, value.errorMessage, value.subError);
        }
    };
    /**
     * Performs necessary throttling checks after a network request.
     * @param cacheManager
     * @param thumbprint
     * @param response
     */
    ThrottlingUtils.postProcess = function (cacheManager, thumbprint, response) {
        if (ThrottlingUtils.checkResponseStatus(response) || ThrottlingUtils.checkResponseForRetryAfter(response)) {
            var thumbprintValue = {
                throttleTime: ThrottlingUtils.calculateThrottleTime(parseInt(response.headers[HeaderNames.RETRY_AFTER])),
                error: response.body.error,
                errorCodes: response.body.error_codes,
                errorMessage: response.body.error_description,
                subError: response.body.suberror
            };
            cacheManager.setThrottlingCache(ThrottlingUtils.generateThrottlingStorageKey(thumbprint), thumbprintValue);
        }
    };
    /**
     * Checks a NetworkResponse object's status codes against 429 or 5xx
     * @param response
     */
    ThrottlingUtils.checkResponseStatus = function (response) {
        return response.status === 429 || response.status >= 500 && response.status < 600;
    };
    /**
     * Checks a NetworkResponse object's RetryAfter header
     * @param response
     */
    ThrottlingUtils.checkResponseForRetryAfter = function (response) {
        if (response.headers) {
            return response.headers.hasOwnProperty(HeaderNames.RETRY_AFTER) && (response.status < 200 || response.status >= 300);
        }
        return false;
    };
    /**
     * Calculates the Unix-time value for a throttle to expire given throttleTime in seconds.
     * @param throttleTime
     */
    ThrottlingUtils.calculateThrottleTime = function (throttleTime) {
        var time = throttleTime <= 0 ? 0 : throttleTime;
        var currentSeconds = Date.now() / 1000;
        return Math.floor(Math.min(currentSeconds + (time || ThrottlingConstants.DEFAULT_THROTTLE_TIME_SECONDS), currentSeconds + ThrottlingConstants.DEFAULT_MAX_THROTTLE_TIME_SECONDS) * 1000);
    };
    ThrottlingUtils.removeThrottle = function (cacheManager, clientId, request, homeAccountIdentifier) {
        var thumbprint = {
            clientId: clientId,
            authority: request.authority,
            scopes: request.scopes,
            homeAccountIdentifier: homeAccountIdentifier,
            claims: request.claims,
            authenticationScheme: request.authenticationScheme,
            resourceRequestMethod: request.resourceRequestMethod,
            resourceRequestUri: request.resourceRequestUri,
            shrClaims: request.shrClaims,
            sshKid: request.sshKid
        };
        var key = this.generateThrottlingStorageKey(thumbprint);
        return cacheManager.removeItem(key, CacheSchemaType.THROTTLING);
    };
    return ThrottlingUtils;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var NetworkManager = /** @class */ (function () {
    function NetworkManager(networkClient, cacheManager) {
        this.networkClient = networkClient;
        this.cacheManager = cacheManager;
    }
    /**
     * Wraps sendPostRequestAsync with necessary preflight and postflight logic
     * @param thumbprint
     * @param tokenEndpoint
     * @param options
     */
    NetworkManager.prototype.sendPostRequest = function (thumbprint, tokenEndpoint, options) {
        return __awaiter(this, void 0, void 0, function () {
            var response, e_1;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        ThrottlingUtils.preProcess(this.cacheManager, thumbprint);
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        return [4 /*yield*/, this.networkClient.sendPostRequestAsync(tokenEndpoint, options)];
                    case 2:
                        response = _a.sent();
                        return [3 /*break*/, 4];
                    case 3:
                        e_1 = _a.sent();
                        if (e_1 instanceof AuthError) {
                            throw e_1;
                        }
                        else {
                            throw ClientAuthError.createNetworkError(tokenEndpoint, e_1);
                        }
                    case 4:
                        ThrottlingUtils.postProcess(this.cacheManager, thumbprint, response);
                        return [2 /*return*/, response];
                }
            });
        });
    };
    return NetworkManager;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var CcsCredentialType;
(function (CcsCredentialType) {
    CcsCredentialType["HOME_ACCOUNT_ID"] = "home_account_id";
    CcsCredentialType["UPN"] = "UPN";
})(CcsCredentialType || (CcsCredentialType = {}));

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Base application class which will construct requests to send to and handle responses from the Microsoft STS using the authorization code flow.
 */
var BaseClient = /** @class */ (function () {
    function BaseClient(configuration, performanceClient) {
        // Set the configuration
        this.config = buildClientConfiguration(configuration);
        // Initialize the logger
        this.logger = new Logger(this.config.loggerOptions, name$1, version$1);
        // Initialize crypto
        this.cryptoUtils = this.config.cryptoInterface;
        // Initialize storage interface
        this.cacheManager = this.config.storageInterface;
        // Set the network interface
        this.networkClient = this.config.networkInterface;
        // Set the NetworkManager
        this.networkManager = new NetworkManager(this.networkClient, this.cacheManager);
        // Set TelemetryManager
        this.serverTelemetryManager = this.config.serverTelemetryManager;
        // set Authority
        this.authority = this.config.authOptions.authority;
        // set performance telemetry client
        this.performanceClient = performanceClient;
    }
    /**
     * Creates default headers for requests to token endpoint
     */
    BaseClient.prototype.createTokenRequestHeaders = function (ccsCred) {
        var headers = {};
        headers[HeaderNames.CONTENT_TYPE] = Constants.URL_FORM_CONTENT_TYPE;
        if (!this.config.systemOptions.preventCorsPreflight && ccsCred) {
            switch (ccsCred.type) {
                case CcsCredentialType.HOME_ACCOUNT_ID:
                    try {
                        var clientInfo = buildClientInfoFromHomeAccountId(ccsCred.credential);
                        headers[HeaderNames.CCS_HEADER] = "Oid:" + clientInfo.uid + "@" + clientInfo.utid;
                    }
                    catch (e) {
                        this.logger.verbose("Could not parse home account ID for CCS Header: " + e);
                    }
                    break;
                case CcsCredentialType.UPN:
                    headers[HeaderNames.CCS_HEADER] = "UPN: " + ccsCred.credential;
                    break;
            }
        }
        return headers;
    };
    /**
     * Http post to token endpoint
     * @param tokenEndpoint
     * @param queryString
     * @param headers
     * @param thumbprint
     */
    BaseClient.prototype.executePostToTokenEndpoint = function (tokenEndpoint, queryString, headers, thumbprint) {
        return __awaiter(this, void 0, void 0, function () {
            var response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.networkManager.sendPostRequest(thumbprint, tokenEndpoint, { body: queryString, headers: headers, proxyUrl: this.config.systemOptions.proxyUrl })];
                    case 1:
                        response = _a.sent();
                        if (this.config.serverTelemetryManager && response.status < 500 && response.status !== 429) {
                            // Telemetry data successfully logged by server, clear Telemetry cache
                            this.config.serverTelemetryManager.clearTelemetryCache();
                        }
                        return [2 /*return*/, response];
                }
            });
        });
    };
    /**
     * Updates the authority object of the client. Endpoint discovery must be completed.
     * @param updatedAuthority
     */
    BaseClient.prototype.updateAuthority = function (updatedAuthority) {
        if (!updatedAuthority.discoveryComplete()) {
            throw ClientAuthError.createEndpointDiscoveryIncompleteError("Updated authority has not completed endpoint discovery.");
        }
        this.authority = updatedAuthority;
    };
    return BaseClient;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Validates server consumable params from the "request" objects
 */
var RequestValidator = /** @class */ (function () {
    function RequestValidator() {
    }
    /**
     * Utility to check if the `redirectUri` in the request is a non-null value
     * @param redirectUri
     */
    RequestValidator.validateRedirectUri = function (redirectUri) {
        if (StringUtils.isEmpty(redirectUri)) {
            throw ClientConfigurationError.createRedirectUriEmptyError();
        }
    };
    /**
     * Utility to validate prompt sent by the user in the request
     * @param prompt
     */
    RequestValidator.validatePrompt = function (prompt) {
        var promptValues = [];
        for (var value in PromptValue) {
            promptValues.push(PromptValue[value]);
        }
        if (promptValues.indexOf(prompt) < 0) {
            throw ClientConfigurationError.createInvalidPromptError(prompt);
        }
    };
    RequestValidator.validateClaims = function (claims) {
        try {
            JSON.parse(claims);
        }
        catch (e) {
            throw ClientConfigurationError.createInvalidClaimsRequestError();
        }
    };
    /**
     * Utility to validate code_challenge and code_challenge_method
     * @param codeChallenge
     * @param codeChallengeMethod
     */
    RequestValidator.validateCodeChallengeParams = function (codeChallenge, codeChallengeMethod) {
        if (StringUtils.isEmpty(codeChallenge) || StringUtils.isEmpty(codeChallengeMethod)) {
            throw ClientConfigurationError.createInvalidCodeChallengeParamsError();
        }
        else {
            this.validateCodeChallengeMethod(codeChallengeMethod);
        }
    };
    /**
     * Utility to validate code_challenge_method
     * @param codeChallengeMethod
     */
    RequestValidator.validateCodeChallengeMethod = function (codeChallengeMethod) {
        if ([
            CodeChallengeMethodValues.PLAIN,
            CodeChallengeMethodValues.S256
        ].indexOf(codeChallengeMethod) < 0) {
            throw ClientConfigurationError.createInvalidCodeChallengeMethodError();
        }
    };
    /**
     * Removes unnecessary or duplicate query parameters from extraQueryParameters
     * @param request
     */
    RequestValidator.sanitizeEQParams = function (eQParams, queryParams) {
        if (!eQParams) {
            return {};
        }
        // Remove any query parameters already included in SSO params
        queryParams.forEach(function (value, key) {
            if (eQParams[key]) {
                delete eQParams[key];
            }
        });
        return eQParams;
    };
    return RequestValidator;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var RequestParameterBuilder = /** @class */ (function () {
    function RequestParameterBuilder() {
        this.parameters = new Map();
    }
    /**
     * add response_type = code
     */
    RequestParameterBuilder.prototype.addResponseTypeCode = function () {
        this.parameters.set(AADServerParamKeys.RESPONSE_TYPE, encodeURIComponent(Constants.CODE_RESPONSE_TYPE));
    };
    /**
     * add response_type = token id_token
     */
    RequestParameterBuilder.prototype.addResponseTypeForTokenAndIdToken = function () {
        this.parameters.set(AADServerParamKeys.RESPONSE_TYPE, encodeURIComponent(Constants.TOKEN_RESPONSE_TYPE + " " + Constants.ID_TOKEN_RESPONSE_TYPE));
    };
    /**
     * add response_mode. defaults to query.
     * @param responseMode
     */
    RequestParameterBuilder.prototype.addResponseMode = function (responseMode) {
        this.parameters.set(AADServerParamKeys.RESPONSE_MODE, encodeURIComponent((responseMode) ? responseMode : ResponseMode.QUERY));
    };
    /**
     * Add flag to indicate STS should attempt to use WAM if available
     */
    RequestParameterBuilder.prototype.addNativeBroker = function () {
        this.parameters.set(AADServerParamKeys.NATIVE_BROKER, encodeURIComponent("1"));
    };
    /**
     * add scopes. set addOidcScopes to false to prevent default scopes in non-user scenarios
     * @param scopeSet
     * @param addOidcScopes
     */
    RequestParameterBuilder.prototype.addScopes = function (scopes, addOidcScopes) {
        if (addOidcScopes === void 0) { addOidcScopes = true; }
        var requestScopes = addOidcScopes ? __spreadArrays(scopes || [], OIDC_DEFAULT_SCOPES) : scopes || [];
        var scopeSet = new ScopeSet(requestScopes);
        this.parameters.set(AADServerParamKeys.SCOPE, encodeURIComponent(scopeSet.printScopes()));
    };
    /**
     * add clientId
     * @param clientId
     */
    RequestParameterBuilder.prototype.addClientId = function (clientId) {
        this.parameters.set(AADServerParamKeys.CLIENT_ID, encodeURIComponent(clientId));
    };
    /**
     * add redirect_uri
     * @param redirectUri
     */
    RequestParameterBuilder.prototype.addRedirectUri = function (redirectUri) {
        RequestValidator.validateRedirectUri(redirectUri);
        this.parameters.set(AADServerParamKeys.REDIRECT_URI, encodeURIComponent(redirectUri));
    };
    /**
     * add post logout redirectUri
     * @param redirectUri
     */
    RequestParameterBuilder.prototype.addPostLogoutRedirectUri = function (redirectUri) {
        RequestValidator.validateRedirectUri(redirectUri);
        this.parameters.set(AADServerParamKeys.POST_LOGOUT_URI, encodeURIComponent(redirectUri));
    };
    /**
     * add id_token_hint to logout request
     * @param idTokenHint
     */
    RequestParameterBuilder.prototype.addIdTokenHint = function (idTokenHint) {
        this.parameters.set(AADServerParamKeys.ID_TOKEN_HINT, encodeURIComponent(idTokenHint));
    };
    /**
     * add domain_hint
     * @param domainHint
     */
    RequestParameterBuilder.prototype.addDomainHint = function (domainHint) {
        this.parameters.set(SSOTypes.DOMAIN_HINT, encodeURIComponent(domainHint));
    };
    /**
     * add login_hint
     * @param loginHint
     */
    RequestParameterBuilder.prototype.addLoginHint = function (loginHint) {
        this.parameters.set(SSOTypes.LOGIN_HINT, encodeURIComponent(loginHint));
    };
    /**
     * Adds the CCS (Cache Credential Service) query parameter for login_hint
     * @param loginHint
     */
    RequestParameterBuilder.prototype.addCcsUpn = function (loginHint) {
        this.parameters.set(HeaderNames.CCS_HEADER, encodeURIComponent("UPN:" + loginHint));
    };
    /**
     * Adds the CCS (Cache Credential Service) query parameter for account object
     * @param loginHint
     */
    RequestParameterBuilder.prototype.addCcsOid = function (clientInfo) {
        this.parameters.set(HeaderNames.CCS_HEADER, encodeURIComponent("Oid:" + clientInfo.uid + "@" + clientInfo.utid));
    };
    /**
     * add sid
     * @param sid
     */
    RequestParameterBuilder.prototype.addSid = function (sid) {
        this.parameters.set(SSOTypes.SID, encodeURIComponent(sid));
    };
    /**
     * add claims
     * @param claims
     */
    RequestParameterBuilder.prototype.addClaims = function (claims, clientCapabilities) {
        var mergedClaims = this.addClientCapabilitiesToClaims(claims, clientCapabilities);
        RequestValidator.validateClaims(mergedClaims);
        this.parameters.set(AADServerParamKeys.CLAIMS, encodeURIComponent(mergedClaims));
    };
    /**
     * add correlationId
     * @param correlationId
     */
    RequestParameterBuilder.prototype.addCorrelationId = function (correlationId) {
        this.parameters.set(AADServerParamKeys.CLIENT_REQUEST_ID, encodeURIComponent(correlationId));
    };
    /**
     * add library info query params
     * @param libraryInfo
     */
    RequestParameterBuilder.prototype.addLibraryInfo = function (libraryInfo) {
        // Telemetry Info
        this.parameters.set(AADServerParamKeys.X_CLIENT_SKU, libraryInfo.sku);
        this.parameters.set(AADServerParamKeys.X_CLIENT_VER, libraryInfo.version);
        if (libraryInfo.os) {
            this.parameters.set(AADServerParamKeys.X_CLIENT_OS, libraryInfo.os);
        }
        if (libraryInfo.cpu) {
            this.parameters.set(AADServerParamKeys.X_CLIENT_CPU, libraryInfo.cpu);
        }
    };
    /**
     * Add client telemetry parameters
     * @param appTelemetry
     */
    RequestParameterBuilder.prototype.addApplicationTelemetry = function (appTelemetry) {
        if (appTelemetry === null || appTelemetry === void 0 ? void 0 : appTelemetry.appName) {
            this.parameters.set(AADServerParamKeys.X_APP_NAME, appTelemetry.appName);
        }
        if (appTelemetry === null || appTelemetry === void 0 ? void 0 : appTelemetry.appVersion) {
            this.parameters.set(AADServerParamKeys.X_APP_VER, appTelemetry.appVersion);
        }
    };
    /**
     * add prompt
     * @param prompt
     */
    RequestParameterBuilder.prototype.addPrompt = function (prompt) {
        RequestValidator.validatePrompt(prompt);
        this.parameters.set("" + AADServerParamKeys.PROMPT, encodeURIComponent(prompt));
    };
    /**
     * add state
     * @param state
     */
    RequestParameterBuilder.prototype.addState = function (state) {
        if (!StringUtils.isEmpty(state)) {
            this.parameters.set(AADServerParamKeys.STATE, encodeURIComponent(state));
        }
    };
    /**
     * add nonce
     * @param nonce
     */
    RequestParameterBuilder.prototype.addNonce = function (nonce) {
        this.parameters.set(AADServerParamKeys.NONCE, encodeURIComponent(nonce));
    };
    /**
     * add code_challenge and code_challenge_method
     * - throw if either of them are not passed
     * @param codeChallenge
     * @param codeChallengeMethod
     */
    RequestParameterBuilder.prototype.addCodeChallengeParams = function (codeChallenge, codeChallengeMethod) {
        RequestValidator.validateCodeChallengeParams(codeChallenge, codeChallengeMethod);
        if (codeChallenge && codeChallengeMethod) {
            this.parameters.set(AADServerParamKeys.CODE_CHALLENGE, encodeURIComponent(codeChallenge));
            this.parameters.set(AADServerParamKeys.CODE_CHALLENGE_METHOD, encodeURIComponent(codeChallengeMethod));
        }
        else {
            throw ClientConfigurationError.createInvalidCodeChallengeParamsError();
        }
    };
    /**
     * add the `authorization_code` passed by the user to exchange for a token
     * @param code
     */
    RequestParameterBuilder.prototype.addAuthorizationCode = function (code) {
        this.parameters.set(AADServerParamKeys.CODE, encodeURIComponent(code));
    };
    /**
     * add the `authorization_code` passed by the user to exchange for a token
     * @param code
     */
    RequestParameterBuilder.prototype.addDeviceCode = function (code) {
        this.parameters.set(AADServerParamKeys.DEVICE_CODE, encodeURIComponent(code));
    };
    /**
     * add the `refreshToken` passed by the user
     * @param refreshToken
     */
    RequestParameterBuilder.prototype.addRefreshToken = function (refreshToken) {
        this.parameters.set(AADServerParamKeys.REFRESH_TOKEN, encodeURIComponent(refreshToken));
    };
    /**
     * add the `code_verifier` passed by the user to exchange for a token
     * @param codeVerifier
     */
    RequestParameterBuilder.prototype.addCodeVerifier = function (codeVerifier) {
        this.parameters.set(AADServerParamKeys.CODE_VERIFIER, encodeURIComponent(codeVerifier));
    };
    /**
     * add client_secret
     * @param clientSecret
     */
    RequestParameterBuilder.prototype.addClientSecret = function (clientSecret) {
        this.parameters.set(AADServerParamKeys.CLIENT_SECRET, encodeURIComponent(clientSecret));
    };
    /**
     * add clientAssertion for confidential client flows
     * @param clientAssertion
     */
    RequestParameterBuilder.prototype.addClientAssertion = function (clientAssertion) {
        if (!StringUtils.isEmpty(clientAssertion)) {
            this.parameters.set(AADServerParamKeys.CLIENT_ASSERTION, encodeURIComponent(clientAssertion));
        }
    };
    /**
     * add clientAssertionType for confidential client flows
     * @param clientAssertionType
     */
    RequestParameterBuilder.prototype.addClientAssertionType = function (clientAssertionType) {
        if (!StringUtils.isEmpty(clientAssertionType)) {
            this.parameters.set(AADServerParamKeys.CLIENT_ASSERTION_TYPE, encodeURIComponent(clientAssertionType));
        }
    };
    /**
     * add OBO assertion for confidential client flows
     * @param clientAssertion
     */
    RequestParameterBuilder.prototype.addOboAssertion = function (oboAssertion) {
        this.parameters.set(AADServerParamKeys.OBO_ASSERTION, encodeURIComponent(oboAssertion));
    };
    /**
     * add grant type
     * @param grantType
     */
    RequestParameterBuilder.prototype.addRequestTokenUse = function (tokenUse) {
        this.parameters.set(AADServerParamKeys.REQUESTED_TOKEN_USE, encodeURIComponent(tokenUse));
    };
    /**
     * add grant type
     * @param grantType
     */
    RequestParameterBuilder.prototype.addGrantType = function (grantType) {
        this.parameters.set(AADServerParamKeys.GRANT_TYPE, encodeURIComponent(grantType));
    };
    /**
     * add client info
     *
     */
    RequestParameterBuilder.prototype.addClientInfo = function () {
        this.parameters.set(CLIENT_INFO, "1");
    };
    /**
     * add extraQueryParams
     * @param eQparams
     */
    RequestParameterBuilder.prototype.addExtraQueryParameters = function (eQparams) {
        var _this = this;
        RequestValidator.sanitizeEQParams(eQparams, this.parameters);
        Object.keys(eQparams).forEach(function (key) {
            _this.parameters.set(key, eQparams[key]);
        });
    };
    RequestParameterBuilder.prototype.addClientCapabilitiesToClaims = function (claims, clientCapabilities) {
        var mergedClaims;
        // Parse provided claims into JSON object or initialize empty object
        if (!claims) {
            mergedClaims = {};
        }
        else {
            try {
                mergedClaims = JSON.parse(claims);
            }
            catch (e) {
                throw ClientConfigurationError.createInvalidClaimsRequestError();
            }
        }
        if (clientCapabilities && clientCapabilities.length > 0) {
            if (!mergedClaims.hasOwnProperty(ClaimsRequestKeys.ACCESS_TOKEN)) {
                // Add access_token key to claims object
                mergedClaims[ClaimsRequestKeys.ACCESS_TOKEN] = {};
            }
            // Add xms_cc claim with provided clientCapabilities to access_token key
            mergedClaims[ClaimsRequestKeys.ACCESS_TOKEN][ClaimsRequestKeys.XMS_CC] = {
                values: clientCapabilities
            };
        }
        return JSON.stringify(mergedClaims);
    };
    /**
     * adds `username` for Password Grant flow
     * @param username
     */
    RequestParameterBuilder.prototype.addUsername = function (username) {
        this.parameters.set(PasswordGrantConstants.username, encodeURIComponent(username));
    };
    /**
     * adds `password` for Password Grant flow
     * @param password
     */
    RequestParameterBuilder.prototype.addPassword = function (password) {
        this.parameters.set(PasswordGrantConstants.password, encodeURIComponent(password));
    };
    /**
     * add pop_jwk to query params
     * @param cnfString
     */
    RequestParameterBuilder.prototype.addPopToken = function (cnfString) {
        if (!StringUtils.isEmpty(cnfString)) {
            this.parameters.set(AADServerParamKeys.TOKEN_TYPE, exports.AuthenticationScheme.POP);
            this.parameters.set(AADServerParamKeys.REQ_CNF, encodeURIComponent(cnfString));
        }
    };
    /**
     * add SSH JWK and key ID to query params
     */
    RequestParameterBuilder.prototype.addSshJwk = function (sshJwkString) {
        if (!StringUtils.isEmpty(sshJwkString)) {
            this.parameters.set(AADServerParamKeys.TOKEN_TYPE, exports.AuthenticationScheme.SSH);
            this.parameters.set(AADServerParamKeys.REQ_CNF, encodeURIComponent(sshJwkString));
        }
    };
    /**
     * add server telemetry fields
     * @param serverTelemetryManager
     */
    RequestParameterBuilder.prototype.addServerTelemetry = function (serverTelemetryManager) {
        this.parameters.set(AADServerParamKeys.X_CLIENT_CURR_TELEM, serverTelemetryManager.generateCurrentRequestHeaderValue());
        this.parameters.set(AADServerParamKeys.X_CLIENT_LAST_TELEM, serverTelemetryManager.generateLastRequestHeaderValue());
    };
    /**
     * Adds parameter that indicates to the server that throttling is supported
     */
    RequestParameterBuilder.prototype.addThrottling = function () {
        this.parameters.set(AADServerParamKeys.X_MS_LIB_CAPABILITY, ThrottlingConstants.X_MS_LIB_CAPABILITY_VALUE);
    };
    /**
     * Adds logout_hint parameter for "silent" logout which prevent server account picker
     */
    RequestParameterBuilder.prototype.addLogoutHint = function (logoutHint) {
        this.parameters.set(AADServerParamKeys.LOGOUT_HINT, encodeURIComponent(logoutHint));
    };
    /**
     * Utility to create a URL from the params map
     */
    RequestParameterBuilder.prototype.createQueryString = function () {
        var queryParameterArray = new Array();
        this.parameters.forEach(function (value, key) {
            queryParameterArray.push(key + "=" + value);
        });
        return queryParameterArray.join("&");
    };
    return RequestParameterBuilder;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * ID_TOKEN Cache
 *
 * Key:Value Schema:
 *
 * Key Example: uid.utid-login.microsoftonline.com-idtoken-clientId-contoso.com-
 *
 * Value Schema:
 * {
 *      homeAccountId: home account identifier for the auth scheme,
 *      environment: entity that issued the token, represented as a full host
 *      credentialType: Type of credential as a string, can be one of the following: RefreshToken, AccessToken, IdToken, Password, Cookie, Certificate, Other
 *      clientId: client ID of the application
 *      secret: Actual credential as a string
 *      realm: Full tenant or organizational identifier that the account belongs to
 * }
 */
var IdTokenEntity = /** @class */ (function (_super) {
    __extends(IdTokenEntity, _super);
    function IdTokenEntity() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    /**
     * Create IdTokenEntity
     * @param homeAccountId
     * @param authenticationResult
     * @param clientId
     * @param authority
     */
    IdTokenEntity.createIdTokenEntity = function (homeAccountId, environment, idToken, clientId, tenantId) {
        var idTokenEntity = new IdTokenEntity();
        idTokenEntity.credentialType = CredentialType.ID_TOKEN;
        idTokenEntity.homeAccountId = homeAccountId;
        idTokenEntity.environment = environment;
        idTokenEntity.clientId = clientId;
        idTokenEntity.secret = idToken;
        idTokenEntity.realm = tenantId;
        return idTokenEntity;
    };
    /**
     * Validates an entity: checks for all expected params
     * @param entity
     */
    IdTokenEntity.isIdTokenEntity = function (entity) {
        if (!entity) {
            return false;
        }
        return (entity.hasOwnProperty("homeAccountId") &&
            entity.hasOwnProperty("environment") &&
            entity.hasOwnProperty("credentialType") &&
            entity.hasOwnProperty("realm") &&
            entity.hasOwnProperty("clientId") &&
            entity.hasOwnProperty("secret") &&
            entity["credentialType"] === CredentialType.ID_TOKEN);
    };
    return IdTokenEntity;
}(CredentialEntity));

/*! @azure/msal-common v7.3.0 2022-08-01 */
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Utility class which exposes functions for managing date and time operations.
 */
var TimeUtils = /** @class */ (function () {
    function TimeUtils() {
    }
    /**
     * return the current time in Unix time (seconds).
     */
    TimeUtils.nowSeconds = function () {
        // Date.getTime() returns in milliseconds.
        return Math.round(new Date().getTime() / 1000.0);
    };
    /**
     * check if a token is expired based on given UTC time in seconds.
     * @param expiresOn
     */
    TimeUtils.isTokenExpired = function (expiresOn, offset) {
        // check for access token expiry
        var expirationSec = Number(expiresOn) || 0;
        var offsetCurrentTimeSec = TimeUtils.nowSeconds() + offset;
        // If current time + offset is greater than token expiration time, then token is expired.
        return (offsetCurrentTimeSec > expirationSec);
    };
    /**
     * If the current time is earlier than the time that a token was cached at, we must discard the token
     * i.e. The system clock was turned back after acquiring the cached token
     * @param cachedAt
     * @param offset
     */
    TimeUtils.wasClockTurnedBack = function (cachedAt) {
        var cachedAtSec = Number(cachedAt);
        return cachedAtSec > TimeUtils.nowSeconds();
    };
    /**
     * Waits for t number of milliseconds
     * @param t number
     * @param value T
     */
    TimeUtils.delay = function (t, value) {
        return new Promise(function (resolve) { return setTimeout(function () { return resolve(value); }, t); });
    };
    return TimeUtils;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * ACCESS_TOKEN Credential Type
 *
 * Key:Value Schema:
 *
 * Key Example: uid.utid-login.microsoftonline.com-accesstoken-clientId-contoso.com-user.read
 *
 * Value Schema:
 * {
 *      homeAccountId: home account identifier for the auth scheme,
 *      environment: entity that issued the token, represented as a full host
 *      credentialType: Type of credential as a string, can be one of the following: RefreshToken, AccessToken, IdToken, Password, Cookie, Certificate, Other
 *      clientId: client ID of the application
 *      secret: Actual credential as a string
 *      familyId: Family ID identifier, usually only used for refresh tokens
 *      realm: Full tenant or organizational identifier that the account belongs to
 *      target: Permissions that are included in the token, or for refresh tokens, the resource identifier.
 *      cachedAt: Absolute device time when entry was created in the cache.
 *      expiresOn: Token expiry time, calculated based on current UTC time in seconds. Represented as a string.
 *      extendedExpiresOn: Additional extended expiry time until when token is valid in case of server-side outage. Represented as string in UTC seconds.
 *      keyId: used for POP and SSH tokenTypes
 *      tokenType: Type of the token issued. Usually "Bearer"
 * }
 */
var AccessTokenEntity = /** @class */ (function (_super) {
    __extends(AccessTokenEntity, _super);
    function AccessTokenEntity() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    /**
     * Create AccessTokenEntity
     * @param homeAccountId
     * @param environment
     * @param accessToken
     * @param clientId
     * @param tenantId
     * @param scopes
     * @param expiresOn
     * @param extExpiresOn
     */
    AccessTokenEntity.createAccessTokenEntity = function (homeAccountId, environment, accessToken, clientId, tenantId, scopes, expiresOn, extExpiresOn, cryptoUtils, refreshOn, tokenType, userAssertionHash, keyId, requestedClaims, requestedClaimsHash) {
        var _a, _b;
        var atEntity = new AccessTokenEntity();
        atEntity.homeAccountId = homeAccountId;
        atEntity.credentialType = CredentialType.ACCESS_TOKEN;
        atEntity.secret = accessToken;
        var currentTime = TimeUtils.nowSeconds();
        atEntity.cachedAt = currentTime.toString();
        /*
         * Token expiry time.
         * This value should be  calculated based on the current UTC time measured locally and the value  expires_in Represented as a string in JSON.
         */
        atEntity.expiresOn = expiresOn.toString();
        atEntity.extendedExpiresOn = extExpiresOn.toString();
        if (refreshOn) {
            atEntity.refreshOn = refreshOn.toString();
        }
        atEntity.environment = environment;
        atEntity.clientId = clientId;
        atEntity.realm = tenantId;
        atEntity.target = scopes;
        atEntity.userAssertionHash = userAssertionHash;
        atEntity.tokenType = StringUtils.isEmpty(tokenType) ? exports.AuthenticationScheme.BEARER : tokenType;
        if (requestedClaims) {
            atEntity.requestedClaims = requestedClaims;
            atEntity.requestedClaimsHash = requestedClaimsHash;
        }
        /*
         * Create Access Token With Auth Scheme instead of regular access token
         * Cast to lower to handle "bearer" from ADFS
         */
        if (((_a = atEntity.tokenType) === null || _a === void 0 ? void 0 : _a.toLowerCase()) !== exports.AuthenticationScheme.BEARER.toLowerCase()) {
            atEntity.credentialType = CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME;
            switch (atEntity.tokenType) {
                case exports.AuthenticationScheme.POP:
                    // Make sure keyId is present and add it to credential
                    var tokenClaims = AuthToken.extractTokenClaims(accessToken, cryptoUtils);
                    if (!((_b = tokenClaims === null || tokenClaims === void 0 ? void 0 : tokenClaims.cnf) === null || _b === void 0 ? void 0 : _b.kid)) {
                        throw ClientAuthError.createTokenClaimsRequiredError();
                    }
                    atEntity.keyId = tokenClaims.cnf.kid;
                    break;
                case exports.AuthenticationScheme.SSH:
                    atEntity.keyId = keyId;
            }
        }
        return atEntity;
    };
    /**
     * Validates an entity: checks for all expected params
     * @param entity
     */
    AccessTokenEntity.isAccessTokenEntity = function (entity) {
        if (!entity) {
            return false;
        }
        return (entity.hasOwnProperty("homeAccountId") &&
            entity.hasOwnProperty("environment") &&
            entity.hasOwnProperty("credentialType") &&
            entity.hasOwnProperty("realm") &&
            entity.hasOwnProperty("clientId") &&
            entity.hasOwnProperty("secret") &&
            entity.hasOwnProperty("target") &&
            (entity["credentialType"] === CredentialType.ACCESS_TOKEN || entity["credentialType"] === CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME));
    };
    return AccessTokenEntity;
}(CredentialEntity));

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * REFRESH_TOKEN Cache
 *
 * Key:Value Schema:
 *
 * Key Example: uid.utid-login.microsoftonline.com-refreshtoken-clientId--
 *
 * Value:
 * {
 *      homeAccountId: home account identifier for the auth scheme,
 *      environment: entity that issued the token, represented as a full host
 *      credentialType: Type of credential as a string, can be one of the following: RefreshToken, AccessToken, IdToken, Password, Cookie, Certificate, Other
 *      clientId: client ID of the application
 *      secret: Actual credential as a string
 *      familyId: Family ID identifier, '1' represents Microsoft Family
 *      realm: Full tenant or organizational identifier that the account belongs to
 *      target: Permissions that are included in the token, or for refresh tokens, the resource identifier.
 * }
 */
var RefreshTokenEntity = /** @class */ (function (_super) {
    __extends(RefreshTokenEntity, _super);
    function RefreshTokenEntity() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    /**
     * Create RefreshTokenEntity
     * @param homeAccountId
     * @param authenticationResult
     * @param clientId
     * @param authority
     */
    RefreshTokenEntity.createRefreshTokenEntity = function (homeAccountId, environment, refreshToken, clientId, familyId, userAssertionHash) {
        var rtEntity = new RefreshTokenEntity();
        rtEntity.clientId = clientId;
        rtEntity.credentialType = CredentialType.REFRESH_TOKEN;
        rtEntity.environment = environment;
        rtEntity.homeAccountId = homeAccountId;
        rtEntity.secret = refreshToken;
        rtEntity.userAssertionHash = userAssertionHash;
        if (familyId)
            rtEntity.familyId = familyId;
        return rtEntity;
    };
    /**
     * Validates an entity: checks for all expected params
     * @param entity
     */
    RefreshTokenEntity.isRefreshTokenEntity = function (entity) {
        if (!entity) {
            return false;
        }
        return (entity.hasOwnProperty("homeAccountId") &&
            entity.hasOwnProperty("environment") &&
            entity.hasOwnProperty("credentialType") &&
            entity.hasOwnProperty("clientId") &&
            entity.hasOwnProperty("secret") &&
            entity["credentialType"] === CredentialType.REFRESH_TOKEN);
    };
    return RefreshTokenEntity;
}(CredentialEntity));

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * InteractionRequiredServerErrorMessage contains string constants used by error codes and messages returned by the server indicating interaction is required
 */
var InteractionRequiredServerErrorMessage = [
    "interaction_required",
    "consent_required",
    "login_required"
];
var InteractionRequiredAuthSubErrorMessage = [
    "message_only",
    "additional_action",
    "basic_action",
    "user_password_expired",
    "consent_required"
];
/**
 * Interaction required errors defined by the SDK
 */
var InteractionRequiredAuthErrorMessage = {
    noTokensFoundError: {
        code: "no_tokens_found",
        desc: "No refresh token found in the cache. Please sign-in."
    },
    native_account_unavailable: {
        code: "native_account_unavailable",
        desc: "The requested account is not available in the native broker. It may have been deleted or logged out. Please sign-in again using an interactive API."
    }
};
/**
 * Error thrown when user interaction is required.
 */
var InteractionRequiredAuthError = /** @class */ (function (_super) {
    __extends(InteractionRequiredAuthError, _super);
    function InteractionRequiredAuthError(errorCode, errorMessage, subError) {
        var _this = _super.call(this, errorCode, errorMessage, subError) || this;
        _this.name = "InteractionRequiredAuthError";
        Object.setPrototypeOf(_this, InteractionRequiredAuthError.prototype);
        return _this;
    }
    /**
     * Helper function used to determine if an error thrown by the server requires interaction to resolve
     * @param errorCode
     * @param errorString
     * @param subError
     */
    InteractionRequiredAuthError.isInteractionRequiredError = function (errorCode, errorString, subError) {
        var isInteractionRequiredErrorCode = !!errorCode && InteractionRequiredServerErrorMessage.indexOf(errorCode) > -1;
        var isInteractionRequiredSubError = !!subError && InteractionRequiredAuthSubErrorMessage.indexOf(subError) > -1;
        var isInteractionRequiredErrorDesc = !!errorString && InteractionRequiredServerErrorMessage.some(function (irErrorCode) {
            return errorString.indexOf(irErrorCode) > -1;
        });
        return isInteractionRequiredErrorCode || isInteractionRequiredErrorDesc || isInteractionRequiredSubError;
    };
    /**
     * Creates an error thrown when the authorization code required for a token request is null or empty.
     */
    InteractionRequiredAuthError.createNoTokensFoundError = function () {
        return new InteractionRequiredAuthError(InteractionRequiredAuthErrorMessage.noTokensFoundError.code, InteractionRequiredAuthErrorMessage.noTokensFoundError.desc);
    };
    /**
     * Creates an error thrown when the native broker returns ACCOUNT_UNAVAILABLE status, indicating that the account was removed and interactive sign-in is required
     * @returns
     */
    InteractionRequiredAuthError.createNativeAccountUnavailableError = function () {
        return new InteractionRequiredAuthError(InteractionRequiredAuthErrorMessage.native_account_unavailable.code, InteractionRequiredAuthErrorMessage.native_account_unavailable.desc);
    };
    return InteractionRequiredAuthError;
}(AuthError));

/*! @azure/msal-common v7.3.0 2022-08-01 */
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var CacheRecord = /** @class */ (function () {
    function CacheRecord(accountEntity, idTokenEntity, accessTokenEntity, refreshTokenEntity, appMetadataEntity) {
        this.account = accountEntity || null;
        this.idToken = idTokenEntity || null;
        this.accessToken = accessTokenEntity || null;
        this.refreshToken = refreshTokenEntity || null;
        this.appMetadata = appMetadataEntity || null;
    }
    return CacheRecord;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Class which provides helpers for OAuth 2.0 protocol specific values
 */
var ProtocolUtils = /** @class */ (function () {
    function ProtocolUtils() {
    }
    /**
     * Appends user state with random guid, or returns random guid.
     * @param userState
     * @param randomGuid
     */
    ProtocolUtils.setRequestState = function (cryptoObj, userState, meta) {
        var libraryState = ProtocolUtils.generateLibraryState(cryptoObj, meta);
        return !StringUtils.isEmpty(userState) ? "" + libraryState + Constants.RESOURCE_DELIM + userState : libraryState;
    };
    /**
     * Generates the state value used by the common library.
     * @param randomGuid
     * @param cryptoObj
     */
    ProtocolUtils.generateLibraryState = function (cryptoObj, meta) {
        if (!cryptoObj) {
            throw ClientAuthError.createNoCryptoObjectError("generateLibraryState");
        }
        // Create a state object containing a unique id and the timestamp of the request creation
        var stateObj = {
            id: cryptoObj.createNewGuid()
        };
        if (meta) {
            stateObj.meta = meta;
        }
        var stateString = JSON.stringify(stateObj);
        return cryptoObj.base64Encode(stateString);
    };
    /**
     * Parses the state into the RequestStateObject, which contains the LibraryState info and the state passed by the user.
     * @param state
     * @param cryptoObj
     */
    ProtocolUtils.parseRequestState = function (cryptoObj, state) {
        if (!cryptoObj) {
            throw ClientAuthError.createNoCryptoObjectError("parseRequestState");
        }
        if (StringUtils.isEmpty(state)) {
            throw ClientAuthError.createInvalidStateError(state, "Null, undefined or empty state");
        }
        try {
            // Split the state between library state and user passed state and decode them separately
            var splitState = state.split(Constants.RESOURCE_DELIM);
            var libraryState = splitState[0];
            var userState = splitState.length > 1 ? splitState.slice(1).join(Constants.RESOURCE_DELIM) : Constants.EMPTY_STRING;
            var libraryStateString = cryptoObj.base64Decode(libraryState);
            var libraryStateObj = JSON.parse(libraryStateString);
            return {
                userRequestState: !StringUtils.isEmpty(userState) ? userState : Constants.EMPTY_STRING,
                libraryState: libraryStateObj
            };
        }
        catch (e) {
            throw ClientAuthError.createInvalidStateError(state, e);
        }
    };
    return ProtocolUtils;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Url object class which can perform various transformations on url strings.
 */
var UrlString = /** @class */ (function () {
    function UrlString(url) {
        this._urlString = url;
        if (StringUtils.isEmpty(this._urlString)) {
            // Throws error if url is empty
            throw ClientConfigurationError.createUrlEmptyError();
        }
        if (StringUtils.isEmpty(this.getHash())) {
            this._urlString = UrlString.canonicalizeUri(url);
        }
    }
    Object.defineProperty(UrlString.prototype, "urlString", {
        get: function () {
            return this._urlString;
        },
        enumerable: false,
        configurable: true
    });
    /**
     * Ensure urls are lower case and end with a / character.
     * @param url
     */
    UrlString.canonicalizeUri = function (url) {
        if (url) {
            var lowerCaseUrl = url.toLowerCase();
            if (StringUtils.endsWith(lowerCaseUrl, "?")) {
                lowerCaseUrl = lowerCaseUrl.slice(0, -1);
            }
            else if (StringUtils.endsWith(lowerCaseUrl, "?/")) {
                lowerCaseUrl = lowerCaseUrl.slice(0, -2);
            }
            if (!StringUtils.endsWith(lowerCaseUrl, "/")) {
                lowerCaseUrl += "/";
            }
            return lowerCaseUrl;
        }
        return url;
    };
    /**
     * Throws if urlString passed is not a valid authority URI string.
     */
    UrlString.prototype.validateAsUri = function () {
        // Attempts to parse url for uri components
        var components;
        try {
            components = this.getUrlComponents();
        }
        catch (e) {
            throw ClientConfigurationError.createUrlParseError(e);
        }
        // Throw error if URI or path segments are not parseable.
        if (!components.HostNameAndPort || !components.PathSegments) {
            throw ClientConfigurationError.createUrlParseError("Given url string: " + this.urlString);
        }
        // Throw error if uri is insecure.
        if (!components.Protocol || components.Protocol.toLowerCase() !== "https:") {
            throw ClientConfigurationError.createInsecureAuthorityUriError(this.urlString);
        }
    };
    /**
     * Given a url and a query string return the url with provided query string appended
     * @param url
     * @param queryString
     */
    UrlString.appendQueryString = function (url, queryString) {
        if (StringUtils.isEmpty(queryString)) {
            return url;
        }
        return url.indexOf("?") < 0 ? url + "?" + queryString : url + "&" + queryString;
    };
    /**
     * Returns a url with the hash removed
     * @param url
     */
    UrlString.removeHashFromUrl = function (url) {
        return UrlString.canonicalizeUri(url.split("#")[0]);
    };
    /**
     * Given a url like https://a:b/common/d?e=f#g, and a tenantId, returns https://a:b/tenantId/d
     * @param href The url
     * @param tenantId The tenant id to replace
     */
    UrlString.prototype.replaceTenantPath = function (tenantId) {
        var urlObject = this.getUrlComponents();
        var pathArray = urlObject.PathSegments;
        if (tenantId && (pathArray.length !== 0 && (pathArray[0] === AADAuthorityConstants.COMMON || pathArray[0] === AADAuthorityConstants.ORGANIZATIONS))) {
            pathArray[0] = tenantId;
        }
        return UrlString.constructAuthorityUriFromObject(urlObject);
    };
    /**
     * Returns the anchor part(#) of the URL
     */
    UrlString.prototype.getHash = function () {
        return UrlString.parseHash(this.urlString);
    };
    /**
     * Parses out the components from a url string.
     * @returns An object with the various components. Please cache this value insted of calling this multiple times on the same url.
     */
    UrlString.prototype.getUrlComponents = function () {
        // https://gist.github.com/curtisz/11139b2cfcaef4a261e0
        var regEx = RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?");
        // If url string does not match regEx, we throw an error
        var match = this.urlString.match(regEx);
        if (!match) {
            throw ClientConfigurationError.createUrlParseError("Given url string: " + this.urlString);
        }
        // Url component object
        var urlComponents = {
            Protocol: match[1],
            HostNameAndPort: match[4],
            AbsolutePath: match[5],
            QueryString: match[7]
        };
        var pathSegments = urlComponents.AbsolutePath.split("/");
        pathSegments = pathSegments.filter(function (val) { return val && val.length > 0; }); // remove empty elements
        urlComponents.PathSegments = pathSegments;
        if (!StringUtils.isEmpty(urlComponents.QueryString) && urlComponents.QueryString.endsWith("/")) {
            urlComponents.QueryString = urlComponents.QueryString.substring(0, urlComponents.QueryString.length - 1);
        }
        return urlComponents;
    };
    UrlString.getDomainFromUrl = function (url) {
        var regEx = RegExp("^([^:/?#]+://)?([^/?#]*)");
        var match = url.match(regEx);
        if (!match) {
            throw ClientConfigurationError.createUrlParseError("Given url string: " + url);
        }
        return match[2];
    };
    UrlString.getAbsoluteUrl = function (relativeUrl, baseUrl) {
        if (relativeUrl[0] === Constants.FORWARD_SLASH) {
            var url = new UrlString(baseUrl);
            var baseComponents = url.getUrlComponents();
            return baseComponents.Protocol + "//" + baseComponents.HostNameAndPort + relativeUrl;
        }
        return relativeUrl;
    };
    /**
     * Parses hash string from given string. Returns empty string if no hash symbol is found.
     * @param hashString
     */
    UrlString.parseHash = function (hashString) {
        var hashIndex1 = hashString.indexOf("#");
        var hashIndex2 = hashString.indexOf("#/");
        if (hashIndex2 > -1) {
            return hashString.substring(hashIndex2 + 2);
        }
        else if (hashIndex1 > -1) {
            return hashString.substring(hashIndex1 + 1);
        }
        return Constants.EMPTY_STRING;
    };
    UrlString.constructAuthorityUriFromObject = function (urlObject) {
        return new UrlString(urlObject.Protocol + "//" + urlObject.HostNameAndPort + "/" + urlObject.PathSegments.join("/"));
    };
    /**
     * Returns URL hash as server auth code response object.
     */
    UrlString.getDeserializedHash = function (hash) {
        // Check if given hash is empty
        if (StringUtils.isEmpty(hash)) {
            return {};
        }
        // Strip the # symbol if present
        var parsedHash = UrlString.parseHash(hash);
        // If # symbol was not present, above will return empty string, so give original hash value
        var deserializedHash = StringUtils.queryStringToObject(StringUtils.isEmpty(parsedHash) ? hash : parsedHash);
        // Check if deserialization didn't work
        if (!deserializedHash) {
            throw ClientAuthError.createHashNotDeserializedError(JSON.stringify(deserializedHash));
        }
        return deserializedHash;
    };
    /**
     * Check if the hash of the URL string contains known properties
     */
    UrlString.hashContainsKnownProperties = function (hash) {
        if (StringUtils.isEmpty(hash) || hash.indexOf("=") < 0) {
            // Hash doesn't contain key/value pairs
            return false;
        }
        var parameters = UrlString.getDeserializedHash(hash);
        return !!(parameters.code ||
            parameters.error_description ||
            parameters.error ||
            parameters.state);
    };
    return UrlString;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var KeyLocation;
(function (KeyLocation) {
    KeyLocation["SW"] = "sw";
    KeyLocation["UHW"] = "uhw";
})(KeyLocation || (KeyLocation = {}));
var PopTokenGenerator = /** @class */ (function () {
    function PopTokenGenerator(cryptoUtils) {
        this.cryptoUtils = cryptoUtils;
    }
    /**
     * Generates the req_cnf validated at the RP in the POP protocol for SHR parameters
     * and returns an object containing the keyid, the full req_cnf string and the req_cnf string hash
     * @param request
     * @returns
     */
    PopTokenGenerator.prototype.generateCnf = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var reqCnf, reqCnfString, _a;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0: return [4 /*yield*/, this.generateKid(request)];
                    case 1:
                        reqCnf = _b.sent();
                        reqCnfString = this.cryptoUtils.base64Encode(JSON.stringify(reqCnf));
                        _a = {
                            kid: reqCnf.kid,
                            reqCnfString: reqCnfString
                        };
                        return [4 /*yield*/, this.cryptoUtils.hashString(reqCnfString)];
                    case 2: return [2 /*return*/, (_a.reqCnfHash = _b.sent(),
                            _a)];
                }
            });
        });
    };
    /**
     * Generates key_id for a SHR token request
     * @param request
     * @returns
     */
    PopTokenGenerator.prototype.generateKid = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var kidThumbprint;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.cryptoUtils.getPublicKeyThumbprint(request)];
                    case 1:
                        kidThumbprint = _a.sent();
                        return [2 /*return*/, {
                                kid: kidThumbprint,
                                xms_ksl: KeyLocation.SW
                            }];
                }
            });
        });
    };
    /**
     * Signs the POP access_token with the local generated key-pair
     * @param accessToken
     * @param request
     * @returns
     */
    PopTokenGenerator.prototype.signPopToken = function (accessToken, keyId, request) {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                return [2 /*return*/, this.signPayload(accessToken, keyId, request)];
            });
        });
    };
    /**
     * Utility function to generate the signed JWT for an access_token
     * @param payload
     * @param kid
     * @param request
     * @param claims
     * @returns
     */
    PopTokenGenerator.prototype.signPayload = function (payload, keyId, request, claims) {
        return __awaiter(this, void 0, void 0, function () {
            var resourceRequestMethod, resourceRequestUri, shrClaims, shrNonce, resourceUrlString, resourceUrlComponents;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        resourceRequestMethod = request.resourceRequestMethod, resourceRequestUri = request.resourceRequestUri, shrClaims = request.shrClaims, shrNonce = request.shrNonce;
                        resourceUrlString = (resourceRequestUri) ? new UrlString(resourceRequestUri) : undefined;
                        resourceUrlComponents = resourceUrlString === null || resourceUrlString === void 0 ? void 0 : resourceUrlString.getUrlComponents();
                        return [4 /*yield*/, this.cryptoUtils.signJwt(__assign({ at: payload, ts: TimeUtils.nowSeconds(), m: resourceRequestMethod === null || resourceRequestMethod === void 0 ? void 0 : resourceRequestMethod.toUpperCase(), u: resourceUrlComponents === null || resourceUrlComponents === void 0 ? void 0 : resourceUrlComponents.HostNameAndPort, nonce: shrNonce || this.cryptoUtils.createNewGuid(), p: resourceUrlComponents === null || resourceUrlComponents === void 0 ? void 0 : resourceUrlComponents.AbsolutePath, q: (resourceUrlComponents === null || resourceUrlComponents === void 0 ? void 0 : resourceUrlComponents.QueryString) ? [[], resourceUrlComponents.QueryString] : undefined, client_claims: shrClaims || undefined }, claims), keyId, request.correlationId)];
                    case 1: return [2 /*return*/, _a.sent()];
                }
            });
        });
    };
    return PopTokenGenerator;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * APP_METADATA Cache
 *
 * Key:Value Schema:
 *
 * Key: appmetadata-<environment>-<client_id>
 *
 * Value:
 * {
 *      clientId: client ID of the application
 *      environment: entity that issued the token, represented as a full host
 *      familyId: Family ID identifier, '1' represents Microsoft Family
 * }
 */
var AppMetadataEntity = /** @class */ (function () {
    function AppMetadataEntity() {
    }
    /**
     * Generate AppMetadata Cache Key as per the schema: appmetadata-<environment>-<client_id>
     */
    AppMetadataEntity.prototype.generateAppMetadataKey = function () {
        return AppMetadataEntity.generateAppMetadataCacheKey(this.environment, this.clientId);
    };
    /**
     * Generate AppMetadata Cache Key
     */
    AppMetadataEntity.generateAppMetadataCacheKey = function (environment, clientId) {
        var appMetaDataKeyArray = [
            APP_METADATA,
            environment,
            clientId,
        ];
        return appMetaDataKeyArray.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();
    };
    /**
     * Creates AppMetadataEntity
     * @param clientId
     * @param environment
     * @param familyId
     */
    AppMetadataEntity.createAppMetadataEntity = function (clientId, environment, familyId) {
        var appMetadata = new AppMetadataEntity();
        appMetadata.clientId = clientId;
        appMetadata.environment = environment;
        if (familyId) {
            appMetadata.familyId = familyId;
        }
        return appMetadata;
    };
    /**
     * Validates an entity: checks for all expected params
     * @param entity
     */
    AppMetadataEntity.isAppMetadataEntity = function (key, entity) {
        if (!entity) {
            return false;
        }
        return (key.indexOf(APP_METADATA) === 0 &&
            entity.hasOwnProperty("clientId") &&
            entity.hasOwnProperty("environment"));
    };
    return AppMetadataEntity;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * This class instance helps track the memory changes facilitating
 * decisions to read from and write to the persistent cache
 */ var TokenCacheContext = /** @class */ (function () {
    function TokenCacheContext(tokenCache, hasChanged) {
        this.cache = tokenCache;
        this.hasChanged = hasChanged;
    }
    Object.defineProperty(TokenCacheContext.prototype, "cacheHasChanged", {
        /**
         * boolean which indicates the changes in cache
         */
        get: function () {
            return this.hasChanged;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(TokenCacheContext.prototype, "tokenCache", {
        /**
         * function to retrieve the token cache
         */
        get: function () {
            return this.cache;
        },
        enumerable: false,
        configurable: true
    });
    return TokenCacheContext;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Class that handles response parsing.
 */
var ResponseHandler = /** @class */ (function () {
    function ResponseHandler(clientId, cacheStorage, cryptoObj, logger, serializableCache, persistencePlugin) {
        this.clientId = clientId;
        this.cacheStorage = cacheStorage;
        this.cryptoObj = cryptoObj;
        this.logger = logger;
        this.serializableCache = serializableCache;
        this.persistencePlugin = persistencePlugin;
    }
    /**
     * Function which validates server authorization code response.
     * @param serverResponseHash
     * @param cachedState
     * @param cryptoObj
     */
    ResponseHandler.prototype.validateServerAuthorizationCodeResponse = function (serverResponseHash, cachedState, cryptoObj) {
        if (!serverResponseHash.state || !cachedState) {
            throw !serverResponseHash.state ? ClientAuthError.createStateNotFoundError("Server State") : ClientAuthError.createStateNotFoundError("Cached State");
        }
        if (decodeURIComponent(serverResponseHash.state) !== decodeURIComponent(cachedState)) {
            throw ClientAuthError.createStateMismatchError();
        }
        // Check for error
        if (serverResponseHash.error || serverResponseHash.error_description || serverResponseHash.suberror) {
            if (InteractionRequiredAuthError.isInteractionRequiredError(serverResponseHash.error, serverResponseHash.error_description, serverResponseHash.suberror)) {
                throw new InteractionRequiredAuthError(serverResponseHash.error || Constants.EMPTY_STRING, serverResponseHash.error_description, serverResponseHash.suberror);
            }
            throw new ServerError(serverResponseHash.error || Constants.EMPTY_STRING, serverResponseHash.error_description, serverResponseHash.suberror);
        }
        if (serverResponseHash.client_info) {
            buildClientInfo(serverResponseHash.client_info, cryptoObj);
        }
    };
    /**
     * Function which validates server authorization token response.
     * @param serverResponse
     */
    ResponseHandler.prototype.validateTokenResponse = function (serverResponse) {
        // Check for error
        if (serverResponse.error || serverResponse.error_description || serverResponse.suberror) {
            if (InteractionRequiredAuthError.isInteractionRequiredError(serverResponse.error, serverResponse.error_description, serverResponse.suberror)) {
                throw new InteractionRequiredAuthError(serverResponse.error, serverResponse.error_description, serverResponse.suberror);
            }
            var errString = serverResponse.error_codes + " - [" + serverResponse.timestamp + "]: " + serverResponse.error_description + " - Correlation ID: " + serverResponse.correlation_id + " - Trace ID: " + serverResponse.trace_id;
            throw new ServerError(serverResponse.error, errString, serverResponse.suberror);
        }
    };
    /**
     * Returns a constructed token response based on given string. Also manages the cache updates and cleanups.
     * @param serverTokenResponse
     * @param authority
     */
    ResponseHandler.prototype.handleServerTokenResponse = function (serverTokenResponse, authority, reqTimestamp, request, authCodePayload, userAssertionHash, handlingRefreshTokenResponse, forceCacheRefreshTokenResponse) {
        return __awaiter(this, void 0, void 0, function () {
            var idTokenObj, requestStateObj, cacheRecord, cacheContext, key, account;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        if (serverTokenResponse.id_token) {
                            idTokenObj = new AuthToken(serverTokenResponse.id_token || Constants.EMPTY_STRING, this.cryptoObj);
                            // token nonce check (TODO: Add a warning if no nonce is given?)
                            if (authCodePayload && !StringUtils.isEmpty(authCodePayload.nonce)) {
                                if (idTokenObj.claims.nonce !== authCodePayload.nonce) {
                                    throw ClientAuthError.createNonceMismatchError();
                                }
                            }
                        }
                        // generate homeAccountId
                        this.homeAccountIdentifier = AccountEntity.generateHomeAccountId(serverTokenResponse.client_info || Constants.EMPTY_STRING, authority.authorityType, this.logger, this.cryptoObj, idTokenObj);
                        if (!!authCodePayload && !!authCodePayload.state) {
                            requestStateObj = ProtocolUtils.parseRequestState(this.cryptoObj, authCodePayload.state);
                        }
                        // Add keyId from request to serverTokenResponse if defined
                        serverTokenResponse.key_id = serverTokenResponse.key_id || request.sshKid || undefined;
                        cacheRecord = this.generateCacheRecord(serverTokenResponse, authority, reqTimestamp, request, idTokenObj, userAssertionHash, authCodePayload);
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, , 5, 8]);
                        if (!(this.persistencePlugin && this.serializableCache)) return [3 /*break*/, 3];
                        this.logger.verbose("Persistence enabled, calling beforeCacheAccess");
                        cacheContext = new TokenCacheContext(this.serializableCache, true);
                        return [4 /*yield*/, this.persistencePlugin.beforeCacheAccess(cacheContext)];
                    case 2:
                        _a.sent();
                        _a.label = 3;
                    case 3:
                        /*
                         * When saving a refreshed tokens to the cache, it is expected that the account that was used is present in the cache.
                         * If not present, we should return null, as it's the case that another application called removeAccount in between
                         * the calls to getAllAccounts and acquireTokenSilent. We should not overwrite that removal, unless explicitly flagged by
                         * the developer, as in the case of refresh token flow used in ADAL Node to MSAL Node migration.
                         */
                        if (handlingRefreshTokenResponse && !forceCacheRefreshTokenResponse && cacheRecord.account) {
                            key = cacheRecord.account.generateAccountKey();
                            account = this.cacheStorage.getAccount(key);
                            if (!account) {
                                this.logger.warning("Account used to refresh tokens not in persistence, refreshed tokens will not be stored in the cache");
                                return [2 /*return*/, ResponseHandler.generateAuthenticationResult(this.cryptoObj, authority, cacheRecord, false, request, idTokenObj, requestStateObj, undefined)];
                            }
                        }
                        return [4 /*yield*/, this.cacheStorage.saveCacheRecord(cacheRecord)];
                    case 4:
                        _a.sent();
                        return [3 /*break*/, 8];
                    case 5:
                        if (!(this.persistencePlugin && this.serializableCache && cacheContext)) return [3 /*break*/, 7];
                        this.logger.verbose("Persistence enabled, calling afterCacheAccess");
                        return [4 /*yield*/, this.persistencePlugin.afterCacheAccess(cacheContext)];
                    case 6:
                        _a.sent();
                        _a.label = 7;
                    case 7: return [7 /*endfinally*/];
                    case 8: return [2 /*return*/, ResponseHandler.generateAuthenticationResult(this.cryptoObj, authority, cacheRecord, false, request, idTokenObj, requestStateObj, serverTokenResponse.spa_code)];
                }
            });
        });
    };
    /**
     * Generates CacheRecord
     * @param serverTokenResponse
     * @param idTokenObj
     * @param authority
     */
    ResponseHandler.prototype.generateCacheRecord = function (serverTokenResponse, authority, reqTimestamp, request, idTokenObj, userAssertionHash, authCodePayload) {
        var env = authority.getPreferredCache();
        if (StringUtils.isEmpty(env)) {
            throw ClientAuthError.createInvalidCacheEnvironmentError();
        }
        // IdToken: non AAD scenarios can have empty realm
        var cachedIdToken;
        var cachedAccount;
        if (!StringUtils.isEmpty(serverTokenResponse.id_token) && !!idTokenObj) {
            cachedIdToken = IdTokenEntity.createIdTokenEntity(this.homeAccountIdentifier, env, serverTokenResponse.id_token || Constants.EMPTY_STRING, this.clientId, idTokenObj.claims.tid || Constants.EMPTY_STRING);
            cachedAccount = this.generateAccountEntity(serverTokenResponse, idTokenObj, authority, authCodePayload);
        }
        // AccessToken
        var cachedAccessToken = null;
        if (!StringUtils.isEmpty(serverTokenResponse.access_token)) {
            // If scopes not returned in server response, use request scopes
            var responseScopes = serverTokenResponse.scope ? ScopeSet.fromString(serverTokenResponse.scope) : new ScopeSet(request.scopes || []);
            /*
             * Use timestamp calculated before request
             * Server may return timestamps as strings, parse to numbers if so.
             */
            var expiresIn = (typeof serverTokenResponse.expires_in === "string" ? parseInt(serverTokenResponse.expires_in, 10) : serverTokenResponse.expires_in) || 0;
            var extExpiresIn = (typeof serverTokenResponse.ext_expires_in === "string" ? parseInt(serverTokenResponse.ext_expires_in, 10) : serverTokenResponse.ext_expires_in) || 0;
            var refreshIn = (typeof serverTokenResponse.refresh_in === "string" ? parseInt(serverTokenResponse.refresh_in, 10) : serverTokenResponse.refresh_in) || undefined;
            var tokenExpirationSeconds = reqTimestamp + expiresIn;
            var extendedTokenExpirationSeconds = tokenExpirationSeconds + extExpiresIn;
            var refreshOnSeconds = refreshIn && refreshIn > 0 ? reqTimestamp + refreshIn : undefined;
            // non AAD scenarios can have empty realm
            cachedAccessToken = AccessTokenEntity.createAccessTokenEntity(this.homeAccountIdentifier, env, serverTokenResponse.access_token || Constants.EMPTY_STRING, this.clientId, idTokenObj ? idTokenObj.claims.tid || Constants.EMPTY_STRING : authority.tenant, responseScopes.printScopes(), tokenExpirationSeconds, extendedTokenExpirationSeconds, this.cryptoObj, refreshOnSeconds, serverTokenResponse.token_type, userAssertionHash, serverTokenResponse.key_id, request.claims, request.requestedClaimsHash);
        }
        // refreshToken
        var cachedRefreshToken = null;
        if (!StringUtils.isEmpty(serverTokenResponse.refresh_token)) {
            cachedRefreshToken = RefreshTokenEntity.createRefreshTokenEntity(this.homeAccountIdentifier, env, serverTokenResponse.refresh_token || Constants.EMPTY_STRING, this.clientId, serverTokenResponse.foci, userAssertionHash);
        }
        // appMetadata
        var cachedAppMetadata = null;
        if (!StringUtils.isEmpty(serverTokenResponse.foci)) {
            cachedAppMetadata = AppMetadataEntity.createAppMetadataEntity(this.clientId, env, serverTokenResponse.foci);
        }
        return new CacheRecord(cachedAccount, cachedIdToken, cachedAccessToken, cachedRefreshToken, cachedAppMetadata);
    };
    /**
     * Generate Account
     * @param serverTokenResponse
     * @param idToken
     * @param authority
     */
    ResponseHandler.prototype.generateAccountEntity = function (serverTokenResponse, idToken, authority, authCodePayload) {
        var authorityType = authority.authorityType;
        var cloudGraphHostName = authCodePayload ? authCodePayload.cloud_graph_host_name : Constants.EMPTY_STRING;
        var msGraphhost = authCodePayload ? authCodePayload.msgraph_host : Constants.EMPTY_STRING;
        // ADFS does not require client_info in the response
        if (authorityType === AuthorityType.Adfs) {
            this.logger.verbose("Authority type is ADFS, creating ADFS account");
            return AccountEntity.createGenericAccount(this.homeAccountIdentifier, idToken, authority, cloudGraphHostName, msGraphhost);
        }
        // This fallback applies to B2C as well as they fall under an AAD account type.
        if (StringUtils.isEmpty(serverTokenResponse.client_info) && authority.protocolMode === "AAD") {
            throw ClientAuthError.createClientInfoEmptyError();
        }
        return serverTokenResponse.client_info ?
            AccountEntity.createAccount(serverTokenResponse.client_info, this.homeAccountIdentifier, idToken, authority, cloudGraphHostName, msGraphhost) :
            AccountEntity.createGenericAccount(this.homeAccountIdentifier, idToken, authority, cloudGraphHostName, msGraphhost);
    };
    /**
     * Creates an @AuthenticationResult from @CacheRecord , @IdToken , and a boolean that states whether or not the result is from cache.
     *
     * Optionally takes a state string that is set as-is in the response.
     *
     * @param cacheRecord
     * @param idTokenObj
     * @param fromTokenCache
     * @param stateString
     */
    ResponseHandler.generateAuthenticationResult = function (cryptoObj, authority, cacheRecord, fromTokenCache, request, idTokenObj, requestState, code) {
        var _a, _b, _c;
        return __awaiter(this, void 0, void 0, function () {
            var accessToken, responseScopes, expiresOn, extExpiresOn, familyId, popTokenGenerator, _d, secret, keyId, uid, tid;
            return __generator(this, function (_e) {
                switch (_e.label) {
                    case 0:
                        accessToken = Constants.EMPTY_STRING;
                        responseScopes = [];
                        expiresOn = null;
                        familyId = Constants.EMPTY_STRING;
                        if (!cacheRecord.accessToken) return [3 /*break*/, 4];
                        if (!(cacheRecord.accessToken.tokenType === exports.AuthenticationScheme.POP)) return [3 /*break*/, 2];
                        popTokenGenerator = new PopTokenGenerator(cryptoObj);
                        _d = cacheRecord.accessToken, secret = _d.secret, keyId = _d.keyId;
                        if (!keyId) {
                            throw ClientAuthError.createKeyIdMissingError();
                        }
                        return [4 /*yield*/, popTokenGenerator.signPopToken(secret, keyId, request)];
                    case 1:
                        accessToken = _e.sent();
                        return [3 /*break*/, 3];
                    case 2:
                        accessToken = cacheRecord.accessToken.secret;
                        _e.label = 3;
                    case 3:
                        responseScopes = ScopeSet.fromString(cacheRecord.accessToken.target).asArray();
                        expiresOn = new Date(Number(cacheRecord.accessToken.expiresOn) * 1000);
                        extExpiresOn = new Date(Number(cacheRecord.accessToken.extendedExpiresOn) * 1000);
                        _e.label = 4;
                    case 4:
                        if (cacheRecord.appMetadata) {
                            familyId = cacheRecord.appMetadata.familyId === THE_FAMILY_ID ? THE_FAMILY_ID : Constants.EMPTY_STRING;
                        }
                        uid = (idTokenObj === null || idTokenObj === void 0 ? void 0 : idTokenObj.claims.oid) || (idTokenObj === null || idTokenObj === void 0 ? void 0 : idTokenObj.claims.sub) || Constants.EMPTY_STRING;
                        tid = (idTokenObj === null || idTokenObj === void 0 ? void 0 : idTokenObj.claims.tid) || Constants.EMPTY_STRING;
                        return [2 /*return*/, {
                                authority: authority.canonicalAuthority,
                                uniqueId: uid,
                                tenantId: tid,
                                scopes: responseScopes,
                                account: cacheRecord.account ? cacheRecord.account.getAccountInfo() : null,
                                idToken: idTokenObj ? idTokenObj.rawToken : Constants.EMPTY_STRING,
                                idTokenClaims: idTokenObj ? idTokenObj.claims : {},
                                accessToken: accessToken,
                                fromCache: fromTokenCache,
                                expiresOn: expiresOn,
                                correlationId: request.correlationId,
                                extExpiresOn: extExpiresOn,
                                familyId: familyId,
                                tokenType: ((_a = cacheRecord.accessToken) === null || _a === void 0 ? void 0 : _a.tokenType) || Constants.EMPTY_STRING,
                                state: requestState ? requestState.userRequestState : Constants.EMPTY_STRING,
                                cloudGraphHostName: ((_b = cacheRecord.account) === null || _b === void 0 ? void 0 : _b.cloudGraphHostName) || Constants.EMPTY_STRING,
                                msGraphHost: ((_c = cacheRecord.account) === null || _c === void 0 ? void 0 : _c.msGraphHost) || Constants.EMPTY_STRING,
                                code: code,
                                fromNativeBroker: false
                            }];
                }
            });
        });
    };
    return ResponseHandler;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Oauth2.0 Authorization Code client
 */
var AuthorizationCodeClient = /** @class */ (function (_super) {
    __extends(AuthorizationCodeClient, _super);
    function AuthorizationCodeClient(configuration) {
        var _this = _super.call(this, configuration) || this;
        // Flag to indicate if client is for hybrid spa auth code redemption
        _this.includeRedirectUri = true;
        return _this;
    }
    /**
     * Creates the URL of the authorization request letting the user input credentials and consent to the
     * application. The URL target the /authorize endpoint of the authority configured in the
     * application object.
     *
     * Once the user inputs their credentials and consents, the authority will send a response to the redirect URI
     * sent in the request and should contain an authorization code, which can then be used to acquire tokens via
     * acquireToken(AuthorizationCodeRequest)
     * @param request
     */
    AuthorizationCodeClient.prototype.getAuthCodeUrl = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var queryString;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.createAuthCodeUrlQueryString(request)];
                    case 1:
                        queryString = _a.sent();
                        return [2 /*return*/, UrlString.appendQueryString(this.authority.authorizationEndpoint, queryString)];
                }
            });
        });
    };
    /**
     * API to acquire a token in exchange of 'authorization_code` acquired by the user in the first leg of the
     * authorization_code_grant
     * @param request
     */
    AuthorizationCodeClient.prototype.acquireToken = function (request, authCodePayload) {
        return __awaiter(this, void 0, void 0, function () {
            var reqTimestamp, response, responseHandler;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.info("in acquireToken call");
                        if (!request || StringUtils.isEmpty(request.code)) {
                            throw ClientAuthError.createTokenRequestCannotBeMadeError();
                        }
                        reqTimestamp = TimeUtils.nowSeconds();
                        return [4 /*yield*/, this.executeTokenRequest(this.authority, request)];
                    case 1:
                        response = _a.sent();
                        responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, this.config.serializableCache, this.config.persistencePlugin);
                        // Validate response. This function throws a server error if an error is returned by the server.
                        responseHandler.validateTokenResponse(response.body);
                        return [4 /*yield*/, responseHandler.handleServerTokenResponse(response.body, this.authority, reqTimestamp, request, authCodePayload)];
                    case 2: return [2 /*return*/, _a.sent()];
                }
            });
        });
    };
    /**
     * Handles the hash fragment response from public client code request. Returns a code response used by
     * the client to exchange for a token in acquireToken.
     * @param hashFragment
     */
    AuthorizationCodeClient.prototype.handleFragmentResponse = function (hashFragment, cachedState) {
        // Handle responses.
        var responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, null, null);
        // Deserialize hash fragment response parameters.
        var hashUrlString = new UrlString(hashFragment);
        // Deserialize hash fragment response parameters.
        var serverParams = UrlString.getDeserializedHash(hashUrlString.getHash());
        // Get code response
        responseHandler.validateServerAuthorizationCodeResponse(serverParams, cachedState, this.cryptoUtils);
        // throw when there is no auth code in the response
        if (!serverParams.code) {
            throw ClientAuthError.createNoAuthCodeInServerResponseError();
        }
        return __assign(__assign({}, serverParams), { 
            // Code param is optional in ServerAuthorizationCodeResponse but required in AuthorizationCodePaylod
            code: serverParams.code });
    };
    /**
     * Used to log out the current user, and redirect the user to the postLogoutRedirectUri.
     * Default behaviour is to redirect the user to `window.location.href`.
     * @param authorityUri
     */
    AuthorizationCodeClient.prototype.getLogoutUri = function (logoutRequest) {
        // Throw error if logoutRequest is null/undefined
        if (!logoutRequest) {
            throw ClientConfigurationError.createEmptyLogoutRequestError();
        }
        var queryString = this.createLogoutUrlQueryString(logoutRequest);
        // Construct logout URI
        return UrlString.appendQueryString(this.authority.endSessionEndpoint, queryString);
    };
    /**
     * Executes POST request to token endpoint
     * @param authority
     * @param request
     */
    AuthorizationCodeClient.prototype.executeTokenRequest = function (authority, request) {
        return __awaiter(this, void 0, void 0, function () {
            var thumbprint, requestBody, queryParameters, ccsCredential, clientInfo, headers, endpoint;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        thumbprint = {
                            clientId: this.config.authOptions.clientId,
                            authority: authority.canonicalAuthority,
                            scopes: request.scopes,
                            claims: request.claims,
                            authenticationScheme: request.authenticationScheme,
                            resourceRequestMethod: request.resourceRequestMethod,
                            resourceRequestUri: request.resourceRequestUri,
                            shrClaims: request.shrClaims,
                            sshKid: request.sshKid
                        };
                        return [4 /*yield*/, this.createTokenRequestBody(request)];
                    case 1:
                        requestBody = _a.sent();
                        queryParameters = this.createTokenQueryParameters(request);
                        ccsCredential = undefined;
                        if (request.clientInfo) {
                            try {
                                clientInfo = buildClientInfo(request.clientInfo, this.cryptoUtils);
                                ccsCredential = {
                                    credential: "" + clientInfo.uid + Separators.CLIENT_INFO_SEPARATOR + clientInfo.utid,
                                    type: CcsCredentialType.HOME_ACCOUNT_ID
                                };
                            }
                            catch (e) {
                                this.logger.verbose("Could not parse client info for CCS Header: " + e);
                            }
                        }
                        headers = this.createTokenRequestHeaders(ccsCredential || request.ccsCredential);
                        endpoint = StringUtils.isEmpty(queryParameters) ? authority.tokenEndpoint : authority.tokenEndpoint + "?" + queryParameters;
                        return [2 /*return*/, this.executePostToTokenEndpoint(endpoint, requestBody, headers, thumbprint)];
                }
            });
        });
    };
    /**
     * Creates query string for the /token request
     * @param request
     */
    AuthorizationCodeClient.prototype.createTokenQueryParameters = function (request) {
        var parameterBuilder = new RequestParameterBuilder();
        if (request.tokenQueryParameters) {
            parameterBuilder.addExtraQueryParameters(request.tokenQueryParameters);
        }
        return parameterBuilder.createQueryString();
    };
    /**
     * Generates a map for all the params to be sent to the service
     * @param request
     */
    AuthorizationCodeClient.prototype.createTokenRequestBody = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var parameterBuilder, clientAssertion, popTokenGenerator, reqCnfData, correlationId, ccsCred, clientInfo, clientInfo;
            var _a;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        parameterBuilder = new RequestParameterBuilder();
                        parameterBuilder.addClientId(this.config.authOptions.clientId);
                        /*
                         * For hybrid spa flow, there will be a code but no verifier
                         * In this scenario, don't include redirect uri as auth code will not be bound to redirect URI
                         */
                        if (!this.includeRedirectUri) {
                            // Just validate
                            RequestValidator.validateRedirectUri(request.redirectUri);
                        }
                        else {
                            // Validate and include redirect uri
                            parameterBuilder.addRedirectUri(request.redirectUri);
                        }
                        // Add scope array, parameter builder will add default scopes and dedupe
                        parameterBuilder.addScopes(request.scopes);
                        // add code: user set, not validated
                        parameterBuilder.addAuthorizationCode(request.code);
                        // Add library metadata
                        parameterBuilder.addLibraryInfo(this.config.libraryInfo);
                        parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);
                        parameterBuilder.addThrottling();
                        if (this.serverTelemetryManager) {
                            parameterBuilder.addServerTelemetry(this.serverTelemetryManager);
                        }
                        // add code_verifier if passed
                        if (request.codeVerifier) {
                            parameterBuilder.addCodeVerifier(request.codeVerifier);
                        }
                        if (this.config.clientCredentials.clientSecret) {
                            parameterBuilder.addClientSecret(this.config.clientCredentials.clientSecret);
                        }
                        if (this.config.clientCredentials.clientAssertion) {
                            clientAssertion = this.config.clientCredentials.clientAssertion;
                            parameterBuilder.addClientAssertion(clientAssertion.assertion);
                            parameterBuilder.addClientAssertionType(clientAssertion.assertionType);
                        }
                        parameterBuilder.addGrantType(GrantType.AUTHORIZATION_CODE_GRANT);
                        parameterBuilder.addClientInfo();
                        if (!(request.authenticationScheme === exports.AuthenticationScheme.POP)) return [3 /*break*/, 2];
                        popTokenGenerator = new PopTokenGenerator(this.cryptoUtils);
                        return [4 /*yield*/, popTokenGenerator.generateCnf(request)];
                    case 1:
                        reqCnfData = _b.sent();
                        // SPA PoP requires full Base64Url encoded req_cnf string (unhashed)
                        parameterBuilder.addPopToken(reqCnfData.reqCnfString);
                        return [3 /*break*/, 3];
                    case 2:
                        if (request.authenticationScheme === exports.AuthenticationScheme.SSH) {
                            if (request.sshJwk) {
                                parameterBuilder.addSshJwk(request.sshJwk);
                            }
                            else {
                                throw ClientConfigurationError.createMissingSshJwkError();
                            }
                        }
                        _b.label = 3;
                    case 3:
                        correlationId = request.correlationId || this.config.cryptoInterface.createNewGuid();
                        parameterBuilder.addCorrelationId(correlationId);
                        if (!StringUtils.isEmptyObj(request.claims) || this.config.authOptions.clientCapabilities && this.config.authOptions.clientCapabilities.length > 0) {
                            parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);
                        }
                        ccsCred = undefined;
                        if (request.clientInfo) {
                            try {
                                clientInfo = buildClientInfo(request.clientInfo, this.cryptoUtils);
                                ccsCred = {
                                    credential: "" + clientInfo.uid + Separators.CLIENT_INFO_SEPARATOR + clientInfo.utid,
                                    type: CcsCredentialType.HOME_ACCOUNT_ID
                                };
                            }
                            catch (e) {
                                this.logger.verbose("Could not parse client info for CCS Header: " + e);
                            }
                        }
                        else {
                            ccsCred = request.ccsCredential;
                        }
                        // Adds these as parameters in the request instead of headers to prevent CORS preflight request
                        if (this.config.systemOptions.preventCorsPreflight && ccsCred) {
                            switch (ccsCred.type) {
                                case CcsCredentialType.HOME_ACCOUNT_ID:
                                    try {
                                        clientInfo = buildClientInfoFromHomeAccountId(ccsCred.credential);
                                        parameterBuilder.addCcsOid(clientInfo);
                                    }
                                    catch (e) {
                                        this.logger.verbose("Could not parse home account ID for CCS Header: " + e);
                                    }
                                    break;
                                case CcsCredentialType.UPN:
                                    parameterBuilder.addCcsUpn(ccsCred.credential);
                                    break;
                            }
                        }
                        if (request.tokenBodyParameters) {
                            parameterBuilder.addExtraQueryParameters(request.tokenBodyParameters);
                        }
                        // Add hybrid spa parameters if not already provided
                        if (request.enableSpaAuthorizationCode && (!request.tokenBodyParameters || !request.tokenBodyParameters[AADServerParamKeys.RETURN_SPA_CODE])) {
                            parameterBuilder.addExtraQueryParameters((_a = {},
                                _a[AADServerParamKeys.RETURN_SPA_CODE] = "1",
                                _a));
                        }
                        return [2 /*return*/, parameterBuilder.createQueryString()];
                }
            });
        });
    };
    /**
     * This API validates the `AuthorizationCodeUrlRequest` and creates a URL
     * @param request
     */
    AuthorizationCodeClient.prototype.createAuthCodeUrlQueryString = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var parameterBuilder, requestScopes, correlationId, accountSid, accountLoginHintClaim, clientInfo, clientInfo, clientInfo, popTokenGenerator, reqCnfData;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        parameterBuilder = new RequestParameterBuilder();
                        parameterBuilder.addClientId(this.config.authOptions.clientId);
                        requestScopes = __spreadArrays(request.scopes || [], request.extraScopesToConsent || []);
                        parameterBuilder.addScopes(requestScopes);
                        // validate the redirectUri (to be a non null value)
                        parameterBuilder.addRedirectUri(request.redirectUri);
                        correlationId = request.correlationId || this.config.cryptoInterface.createNewGuid();
                        parameterBuilder.addCorrelationId(correlationId);
                        // add response_mode. If not passed in it defaults to query.
                        parameterBuilder.addResponseMode(request.responseMode);
                        // add response_type = code
                        parameterBuilder.addResponseTypeCode();
                        // add library info parameters
                        parameterBuilder.addLibraryInfo(this.config.libraryInfo);
                        parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);
                        // add client_info=1
                        parameterBuilder.addClientInfo();
                        if (request.codeChallenge && request.codeChallengeMethod) {
                            parameterBuilder.addCodeChallengeParams(request.codeChallenge, request.codeChallengeMethod);
                        }
                        if (request.prompt) {
                            parameterBuilder.addPrompt(request.prompt);
                        }
                        if (request.domainHint) {
                            parameterBuilder.addDomainHint(request.domainHint);
                        }
                        // Add sid or loginHint with preference for login_hint claim (in request) -> sid -> loginHint (upn/email) -> username of AccountInfo object
                        if (request.prompt !== PromptValue.SELECT_ACCOUNT) {
                            // AAD will throw if prompt=select_account is passed with an account hint
                            if (request.sid && request.prompt === PromptValue.NONE) {
                                // SessionID is only used in silent calls
                                this.logger.verbose("createAuthCodeUrlQueryString: Prompt is none, adding sid from request");
                                parameterBuilder.addSid(request.sid);
                            }
                            else if (request.account) {
                                accountSid = this.extractAccountSid(request.account);
                                accountLoginHintClaim = this.extractLoginHint(request.account);
                                // If login_hint claim is present, use it over sid/username
                                if (accountLoginHintClaim) {
                                    this.logger.verbose("createAuthCodeUrlQueryString: login_hint claim present on account");
                                    parameterBuilder.addLoginHint(accountLoginHintClaim);
                                    try {
                                        clientInfo = buildClientInfoFromHomeAccountId(request.account.homeAccountId);
                                        parameterBuilder.addCcsOid(clientInfo);
                                    }
                                    catch (e) {
                                        this.logger.verbose("createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header");
                                    }
                                }
                                else if (accountSid && request.prompt === PromptValue.NONE) {
                                    /*
                                     * If account and loginHint are provided, we will check account first for sid before adding loginHint
                                     * SessionId is only used in silent calls
                                     */
                                    this.logger.verbose("createAuthCodeUrlQueryString: Prompt is none, adding sid from account");
                                    parameterBuilder.addSid(accountSid);
                                    try {
                                        clientInfo = buildClientInfoFromHomeAccountId(request.account.homeAccountId);
                                        parameterBuilder.addCcsOid(clientInfo);
                                    }
                                    catch (e) {
                                        this.logger.verbose("createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header");
                                    }
                                }
                                else if (request.loginHint) {
                                    this.logger.verbose("createAuthCodeUrlQueryString: Adding login_hint from request");
                                    parameterBuilder.addLoginHint(request.loginHint);
                                    parameterBuilder.addCcsUpn(request.loginHint);
                                }
                                else if (request.account.username) {
                                    // Fallback to account username if provided
                                    this.logger.verbose("createAuthCodeUrlQueryString: Adding login_hint from account");
                                    parameterBuilder.addLoginHint(request.account.username);
                                    try {
                                        clientInfo = buildClientInfoFromHomeAccountId(request.account.homeAccountId);
                                        parameterBuilder.addCcsOid(clientInfo);
                                    }
                                    catch (e) {
                                        this.logger.verbose("createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header");
                                    }
                                }
                            }
                            else if (request.loginHint) {
                                this.logger.verbose("createAuthCodeUrlQueryString: No account, adding login_hint from request");
                                parameterBuilder.addLoginHint(request.loginHint);
                                parameterBuilder.addCcsUpn(request.loginHint);
                            }
                        }
                        else {
                            this.logger.verbose("createAuthCodeUrlQueryString: Prompt is select_account, ignoring account hints");
                        }
                        if (request.nonce) {
                            parameterBuilder.addNonce(request.nonce);
                        }
                        if (request.state) {
                            parameterBuilder.addState(request.state);
                        }
                        if (!StringUtils.isEmpty(request.claims) || this.config.authOptions.clientCapabilities && this.config.authOptions.clientCapabilities.length > 0) {
                            parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);
                        }
                        if (request.extraQueryParameters) {
                            parameterBuilder.addExtraQueryParameters(request.extraQueryParameters);
                        }
                        if (!request.nativeBroker) return [3 /*break*/, 2];
                        // signal ests that this is a WAM call
                        parameterBuilder.addNativeBroker();
                        if (!(request.authenticationScheme === exports.AuthenticationScheme.POP)) return [3 /*break*/, 2];
                        popTokenGenerator = new PopTokenGenerator(this.cryptoUtils);
                        return [4 /*yield*/, popTokenGenerator.generateCnf(request)];
                    case 1:
                        reqCnfData = _a.sent();
                        parameterBuilder.addPopToken(reqCnfData.reqCnfHash);
                        _a.label = 2;
                    case 2: return [2 /*return*/, parameterBuilder.createQueryString()];
                }
            });
        });
    };
    /**
     * This API validates the `EndSessionRequest` and creates a URL
     * @param request
     */
    AuthorizationCodeClient.prototype.createLogoutUrlQueryString = function (request) {
        var parameterBuilder = new RequestParameterBuilder();
        if (request.postLogoutRedirectUri) {
            parameterBuilder.addPostLogoutRedirectUri(request.postLogoutRedirectUri);
        }
        if (request.correlationId) {
            parameterBuilder.addCorrelationId(request.correlationId);
        }
        if (request.idTokenHint) {
            parameterBuilder.addIdTokenHint(request.idTokenHint);
        }
        if (request.state) {
            parameterBuilder.addState(request.state);
        }
        if (request.logoutHint) {
            parameterBuilder.addLogoutHint(request.logoutHint);
        }
        if (request.extraQueryParameters) {
            parameterBuilder.addExtraQueryParameters(request.extraQueryParameters);
        }
        return parameterBuilder.createQueryString();
    };
    /**
     * Helper to get sid from account. Returns null if idTokenClaims are not present or sid is not present.
     * @param account
     */
    AuthorizationCodeClient.prototype.extractAccountSid = function (account) {
        var _a;
        return ((_a = account.idTokenClaims) === null || _a === void 0 ? void 0 : _a.sid) || null;
    };
    AuthorizationCodeClient.prototype.extractLoginHint = function (account) {
        var _a;
        return ((_a = account.idTokenClaims) === null || _a === void 0 ? void 0 : _a.login_hint) || null;
    };
    return AuthorizationCodeClient;
}(BaseClient));

/*! @azure/msal-common v7.3.0 2022-08-01 */
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Enumeration of operations that are instrumented by have their performance measured by the PerformanceClient.
 *
 * @export
 * @enum {number}
 */
exports.PerformanceEvents = void 0;
(function (PerformanceEvents) {
    /**
     * acquireTokenByCode API (msal-browser and msal-node).
     * Used to acquire tokens by trading an authorization code against the token endpoint.
     */
    PerformanceEvents["AcquireTokenByCode"] = "acquireTokenByCode";
    /**
     * acquireTokenByRefreshToken API (msal-browser and msal-node).
     * Used to renew an access token using a refresh token against the token endpoint.
     */
    PerformanceEvents["AcquireTokenByRefreshToken"] = "acquireTokenByRefreshToken";
    /**
     * acquireTokenSilent API (msal-browser and msal-node).
     * Used to silently acquire a new access token (from the cache or the network).
     */
    PerformanceEvents["AcquireTokenSilent"] = "acquireTokenSilent";
    /**
     * acquireTokenSilentAsync (msal-browser).
     * Internal API for acquireTokenSilent.
     */
    PerformanceEvents["AcquireTokenSilentAsync"] = "acquireTokenSilentAsync";
    /**
     * acquireTokenPopup (msal-browser).
     * Used to acquire a new access token interactively through pop ups
     */
    PerformanceEvents["AcquireTokenPopup"] = "acquireTokenPopup";
    /**
     * getPublicKeyThumbprint API in CryptoOpts class (msal-browser).
     * Used to generate a public/private keypair and generate a public key thumbprint for pop requests.
     */
    PerformanceEvents["CryptoOptsGetPublicKeyThumbprint"] = "cryptoOptsGetPublicKeyThumbprint";
    /**
     * signJwt API in CryptoOpts class (msal-browser).
     * Used to signed a pop token.
     */
    PerformanceEvents["CryptoOptsSignJwt"] = "cryptoOptsSignJwt";
    /**
     * acquireToken API in the SilentCacheClient class (msal-browser).
     * Used to read access tokens from the cache.
     */
    PerformanceEvents["SilentCacheClientAcquireToken"] = "silentCacheClientAcquireToken";
    /**
     * acquireToken API in the SilentIframeClient class (msal-browser).
     * Used to acquire a new set of tokens from the authorize endpoint in a hidden iframe.
     */
    PerformanceEvents["SilentIframeClientAcquireToken"] = "silentIframeClientAcquireToken";
    /**
     * acquireToken API in SilentRereshClient (msal-browser).
     * Used to acquire a new set of tokens from the token endpoint using a refresh token.
     */
    PerformanceEvents["SilentRefreshClientAcquireToken"] = "silentRefreshClientAcquireToken";
    /**
     * ssoSilent API (msal-browser).
     * Used to silently acquire an authorization code and set of tokens using a hidden iframe.
     */
    PerformanceEvents["SsoSilent"] = "ssoSilent";
    /**
     * getDiscoveredAuthority API in StandardInteractionClient class (msal-browser).
     * Used to load authority metadata for a request.
     */
    PerformanceEvents["StandardInteractionClientGetDiscoveredAuthority"] = "standardInteractionClientGetDiscoveredAuthority";
    /**
     * acquireToken APIs in msal-browser.
     * Used to make an /authorize endpoint call with native brokering enabled.
     */
    PerformanceEvents["FetchAccountIdWithNativeBroker"] = "fetchAccountIdWithNativeBroker";
    /**
     * acquireToken API in NativeInteractionClient class (msal-browser).
     * Used to acquire a token from Native component when native brokering is enabled.
     */
    PerformanceEvents["NativeInteractionClientAcquireToken"] = "nativeInteractionClientAcquireToken";
    /**
     * Time spent on the network for refresh token acquisition
     */
    PerformanceEvents["RefreshTokenClientExecuteTokenRequest"] = "refreshTokenClientExecuteTokenRequest";
    /**
     * Time spent creating default headers for requests to token endpoint
     */
    PerformanceEvents["BaseClientCreateTokenRequestHeaders"] = "baseClientCreateTokenRequestHeaders";
    /**
     * Used to measure the time taken for completing embedded-broker handshake (PW-Broker).
     */
    PerformanceEvents["BrokerHandhshake"] = "brokerHandshake";
    /**
     * acquireTokenByRefreshToken API in BrokerClientApplication (PW-Broker) .
     */
    PerformanceEvents["AcquireTokenByRefreshTokenInBroker"] = "acquireTokenByRefreshTokenInBroker";
    /**
     * acquireToken API in BrokerClientApplication.
     * Used to acquire a token on behalf of the embedded application (PW-Broker).
     */
    PerformanceEvents["AcquireTokenByBroker"] = "acquireTokenByBroker";
})(exports.PerformanceEvents || (exports.PerformanceEvents = {}));
/**
 * State of the performance event.
 *
 * @export
 * @enum {number}
 */
var PerformanceEventStatus;
(function (PerformanceEventStatus) {
    PerformanceEventStatus[PerformanceEventStatus["NotStarted"] = 0] = "NotStarted";
    PerformanceEventStatus[PerformanceEventStatus["InProgress"] = 1] = "InProgress";
    PerformanceEventStatus[PerformanceEventStatus["Completed"] = 2] = "Completed";
})(PerformanceEventStatus || (PerformanceEventStatus = {}));

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * OAuth2.0 refresh token client
 */
var RefreshTokenClient = /** @class */ (function (_super) {
    __extends(RefreshTokenClient, _super);
    function RefreshTokenClient(configuration, performanceClient) {
        return _super.call(this, configuration, performanceClient) || this;
    }
    RefreshTokenClient.prototype.acquireToken = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var reqTimestamp, response, responseHandler;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        reqTimestamp = TimeUtils.nowSeconds();
                        return [4 /*yield*/, this.executeTokenRequest(request, this.authority)];
                    case 1:
                        response = _a.sent();
                        responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, this.config.serializableCache, this.config.persistencePlugin);
                        responseHandler.validateTokenResponse(response.body);
                        return [2 /*return*/, responseHandler.handleServerTokenResponse(response.body, this.authority, reqTimestamp, request, undefined, undefined, true, request.forceCache)];
                }
            });
        });
    };
    /**
     * Gets cached refresh token and attaches to request, then calls acquireToken API
     * @param request
     */
    RefreshTokenClient.prototype.acquireTokenByRefreshToken = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var isFOCI, noFamilyRTInCache, clientMismatchErrorWithFamilyRT;
            return __generator(this, function (_a) {
                // Cannot renew token if no request object is given.
                if (!request) {
                    throw ClientConfigurationError.createEmptyTokenRequestError();
                }
                // We currently do not support silent flow for account === null use cases; This will be revisited for confidential flow usecases
                if (!request.account) {
                    throw ClientAuthError.createNoAccountInSilentRequestError();
                }
                isFOCI = this.cacheManager.isAppMetadataFOCI(request.account.environment, this.config.authOptions.clientId);
                // if the app is part of the family, retrive a Family refresh token if present and make a refreshTokenRequest
                if (isFOCI) {
                    try {
                        return [2 /*return*/, this.acquireTokenWithCachedRefreshToken(request, true)];
                    }
                    catch (e) {
                        noFamilyRTInCache = e instanceof InteractionRequiredAuthError && e.errorCode === InteractionRequiredAuthErrorMessage.noTokensFoundError.code;
                        clientMismatchErrorWithFamilyRT = e instanceof ServerError && e.errorCode === Errors.INVALID_GRANT_ERROR && e.subError === Errors.CLIENT_MISMATCH_ERROR;
                        // if family Refresh Token (FRT) cache acquisition fails or if client_mismatch error is seen with FRT, reattempt with application Refresh Token (ART)
                        if (noFamilyRTInCache || clientMismatchErrorWithFamilyRT) {
                            return [2 /*return*/, this.acquireTokenWithCachedRefreshToken(request, false)];
                            // throw in all other cases
                        }
                        else {
                            throw e;
                        }
                    }
                }
                // fall back to application refresh token acquisition
                return [2 /*return*/, this.acquireTokenWithCachedRefreshToken(request, false)];
            });
        });
    };
    /**
     * makes a network call to acquire tokens by exchanging RefreshToken available in userCache; throws if refresh token is not cached
     * @param request
     */
    RefreshTokenClient.prototype.acquireTokenWithCachedRefreshToken = function (request, foci) {
        return __awaiter(this, void 0, void 0, function () {
            var refreshToken, refreshTokenRequest;
            return __generator(this, function (_a) {
                refreshToken = this.cacheManager.readRefreshTokenFromCache(this.config.authOptions.clientId, request.account, foci);
                // no refresh Token
                if (!refreshToken) {
                    throw InteractionRequiredAuthError.createNoTokensFoundError();
                }
                refreshTokenRequest = __assign(__assign({}, request), { refreshToken: refreshToken.secret, authenticationScheme: request.authenticationScheme || exports.AuthenticationScheme.BEARER, ccsCredential: {
                        credential: request.account.homeAccountId,
                        type: CcsCredentialType.HOME_ACCOUNT_ID
                    } });
                return [2 /*return*/, this.acquireToken(refreshTokenRequest)];
            });
        });
    };
    /**
     * Constructs the network message and makes a NW call to the underlying secure token service
     * @param request
     * @param authority
     */
    RefreshTokenClient.prototype.executeTokenRequest = function (request, authority) {
        var _a;
        return __awaiter(this, void 0, void 0, function () {
            var acquireTokenMeasurement, requestBody, queryParameters, headers, thumbprint, endpoint;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        acquireTokenMeasurement = (_a = this.performanceClient) === null || _a === void 0 ? void 0 : _a.startMeasurement(exports.PerformanceEvents.RefreshTokenClientExecuteTokenRequest, request.correlationId);
                        return [4 /*yield*/, this.createTokenRequestBody(request)];
                    case 1:
                        requestBody = _b.sent();
                        queryParameters = this.createTokenQueryParameters(request);
                        headers = this.createTokenRequestHeaders(request.ccsCredential);
                        thumbprint = {
                            clientId: this.config.authOptions.clientId,
                            authority: authority.canonicalAuthority,
                            scopes: request.scopes,
                            claims: request.claims,
                            authenticationScheme: request.authenticationScheme,
                            resourceRequestMethod: request.resourceRequestMethod,
                            resourceRequestUri: request.resourceRequestUri,
                            shrClaims: request.shrClaims,
                            sshKid: request.sshKid
                        };
                        endpoint = UrlString.appendQueryString(authority.tokenEndpoint, queryParameters);
                        return [2 /*return*/, this.executePostToTokenEndpoint(endpoint, requestBody, headers, thumbprint)
                                .then(function (result) {
                                acquireTokenMeasurement === null || acquireTokenMeasurement === void 0 ? void 0 : acquireTokenMeasurement.endMeasurement({
                                    success: true
                                });
                                return result;
                            })
                                .catch(function (error) {
                                acquireTokenMeasurement === null || acquireTokenMeasurement === void 0 ? void 0 : acquireTokenMeasurement.endMeasurement({
                                    success: false
                                });
                                throw error;
                            })];
                }
            });
        });
    };
    /**
     * Creates query string for the /token request
     * @param request
     */
    RefreshTokenClient.prototype.createTokenQueryParameters = function (request) {
        var parameterBuilder = new RequestParameterBuilder();
        if (request.tokenQueryParameters) {
            parameterBuilder.addExtraQueryParameters(request.tokenQueryParameters);
        }
        return parameterBuilder.createQueryString();
    };
    /**
     * Helper function to create the token request body
     * @param request
     */
    RefreshTokenClient.prototype.createTokenRequestBody = function (request) {
        var _a;
        return __awaiter(this, void 0, void 0, function () {
            var correlationId, acquireTokenMeasurement, parameterBuilder, clientAssertion, popTokenGenerator, reqCnfData, clientInfo;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        correlationId = request.correlationId;
                        acquireTokenMeasurement = (_a = this.performanceClient) === null || _a === void 0 ? void 0 : _a.startMeasurement(exports.PerformanceEvents.BaseClientCreateTokenRequestHeaders, correlationId);
                        parameterBuilder = new RequestParameterBuilder();
                        parameterBuilder.addClientId(this.config.authOptions.clientId);
                        parameterBuilder.addScopes(request.scopes);
                        parameterBuilder.addGrantType(GrantType.REFRESH_TOKEN_GRANT);
                        parameterBuilder.addClientInfo();
                        parameterBuilder.addLibraryInfo(this.config.libraryInfo);
                        parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);
                        parameterBuilder.addThrottling();
                        if (this.serverTelemetryManager) {
                            parameterBuilder.addServerTelemetry(this.serverTelemetryManager);
                        }
                        parameterBuilder.addCorrelationId(correlationId);
                        parameterBuilder.addRefreshToken(request.refreshToken);
                        if (this.config.clientCredentials.clientSecret) {
                            parameterBuilder.addClientSecret(this.config.clientCredentials.clientSecret);
                        }
                        if (this.config.clientCredentials.clientAssertion) {
                            clientAssertion = this.config.clientCredentials.clientAssertion;
                            parameterBuilder.addClientAssertion(clientAssertion.assertion);
                            parameterBuilder.addClientAssertionType(clientAssertion.assertionType);
                        }
                        if (!(request.authenticationScheme === exports.AuthenticationScheme.POP)) return [3 /*break*/, 2];
                        popTokenGenerator = new PopTokenGenerator(this.cryptoUtils);
                        return [4 /*yield*/, popTokenGenerator.generateCnf(request)];
                    case 1:
                        reqCnfData = _b.sent();
                        // SPA PoP requires full Base64Url encoded req_cnf string (unhashed)
                        parameterBuilder.addPopToken(reqCnfData.reqCnfString);
                        return [3 /*break*/, 3];
                    case 2:
                        if (request.authenticationScheme === exports.AuthenticationScheme.SSH) {
                            if (request.sshJwk) {
                                parameterBuilder.addSshJwk(request.sshJwk);
                            }
                            else {
                                acquireTokenMeasurement === null || acquireTokenMeasurement === void 0 ? void 0 : acquireTokenMeasurement.endMeasurement({
                                    success: false
                                });
                                throw ClientConfigurationError.createMissingSshJwkError();
                            }
                        }
                        _b.label = 3;
                    case 3:
                        if (!StringUtils.isEmptyObj(request.claims) || this.config.authOptions.clientCapabilities && this.config.authOptions.clientCapabilities.length > 0) {
                            parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);
                        }
                        if (this.config.systemOptions.preventCorsPreflight && request.ccsCredential) {
                            switch (request.ccsCredential.type) {
                                case CcsCredentialType.HOME_ACCOUNT_ID:
                                    try {
                                        clientInfo = buildClientInfoFromHomeAccountId(request.ccsCredential.credential);
                                        parameterBuilder.addCcsOid(clientInfo);
                                    }
                                    catch (e) {
                                        this.logger.verbose("Could not parse home account ID for CCS Header: " + e);
                                    }
                                    break;
                                case CcsCredentialType.UPN:
                                    parameterBuilder.addCcsUpn(request.ccsCredential.credential);
                                    break;
                            }
                        }
                        acquireTokenMeasurement === null || acquireTokenMeasurement === void 0 ? void 0 : acquireTokenMeasurement.endMeasurement({
                            success: true
                        });
                        return [2 /*return*/, parameterBuilder.createQueryString()];
                }
            });
        });
    };
    return RefreshTokenClient;
}(BaseClient));

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var SilentFlowClient = /** @class */ (function (_super) {
    __extends(SilentFlowClient, _super);
    function SilentFlowClient(configuration, performanceClient) {
        return _super.call(this, configuration, performanceClient) || this;
    }
    /**
     * Retrieves a token from cache if it is still valid, or uses the cached refresh token to renew
     * the given token and returns the renewed token
     * @param request
     */
    SilentFlowClient.prototype.acquireToken = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var e_1, refreshTokenClient;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        _a.trys.push([0, 2, , 3]);
                        return [4 /*yield*/, this.acquireCachedToken(request)];
                    case 1: return [2 /*return*/, _a.sent()];
                    case 2:
                        e_1 = _a.sent();
                        if (e_1 instanceof ClientAuthError && e_1.errorCode === ClientAuthErrorMessage.tokenRefreshRequired.code) {
                            refreshTokenClient = new RefreshTokenClient(this.config, this.performanceClient);
                            return [2 /*return*/, refreshTokenClient.acquireTokenByRefreshToken(request)];
                        }
                        else {
                            throw e_1;
                        }
                    case 3: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Retrieves token from cache or throws an error if it must be refreshed.
     * @param request
     */
    SilentFlowClient.prototype.acquireCachedToken = function (request) {
        var _a, _b, _c, _d;
        return __awaiter(this, void 0, void 0, function () {
            var environment, cacheRecord;
            return __generator(this, function (_e) {
                switch (_e.label) {
                    case 0:
                        // Cannot renew token if no request object is given.
                        if (!request) {
                            throw ClientConfigurationError.createEmptyTokenRequestError();
                        }
                        if (request.forceRefresh) {
                            // Must refresh due to present force_refresh flag.
                            (_a = this.serverTelemetryManager) === null || _a === void 0 ? void 0 : _a.setCacheOutcome(CacheOutcome.FORCE_REFRESH);
                            this.logger.info("SilentFlowClient:acquireCachedToken - Skipping cache because forceRefresh is true.");
                            throw ClientAuthError.createRefreshRequiredError();
                        }
                        // We currently do not support silent flow for account === null use cases; This will be revisited for confidential flow usecases
                        if (!request.account) {
                            throw ClientAuthError.createNoAccountInSilentRequestError();
                        }
                        environment = request.authority || this.authority.getPreferredCache();
                        cacheRecord = this.cacheManager.readCacheRecord(request.account, this.config.authOptions.clientId, request, environment);
                        if (!cacheRecord.accessToken) {
                            // Must refresh due to non-existent access_token.
                            (_b = this.serverTelemetryManager) === null || _b === void 0 ? void 0 : _b.setCacheOutcome(CacheOutcome.NO_CACHED_ACCESS_TOKEN);
                            this.logger.info("SilentFlowClient:acquireCachedToken - No access token found in cache for the given properties.");
                            throw ClientAuthError.createRefreshRequiredError();
                        }
                        else if (TimeUtils.wasClockTurnedBack(cacheRecord.accessToken.cachedAt) ||
                            TimeUtils.isTokenExpired(cacheRecord.accessToken.expiresOn, this.config.systemOptions.tokenRenewalOffsetSeconds)) {
                            // Must refresh due to expired access_token.
                            (_c = this.serverTelemetryManager) === null || _c === void 0 ? void 0 : _c.setCacheOutcome(CacheOutcome.CACHED_ACCESS_TOKEN_EXPIRED);
                            this.logger.info("SilentFlowClient:acquireCachedToken - Cached access token is expired or will expire within " + this.config.systemOptions.tokenRenewalOffsetSeconds + " seconds.");
                            throw ClientAuthError.createRefreshRequiredError();
                        }
                        else if (cacheRecord.accessToken.refreshOn && TimeUtils.isTokenExpired(cacheRecord.accessToken.refreshOn, 0)) {
                            // Must refresh due to the refresh_in value.
                            (_d = this.serverTelemetryManager) === null || _d === void 0 ? void 0 : _d.setCacheOutcome(CacheOutcome.REFRESH_CACHED_ACCESS_TOKEN);
                            this.logger.info("SilentFlowClient:acquireCachedToken - Cached access token's refreshOn property has been exceeded'.");
                            throw ClientAuthError.createRefreshRequiredError();
                        }
                        if (this.config.serverTelemetryManager) {
                            this.config.serverTelemetryManager.incrementCacheHits();
                        }
                        return [4 /*yield*/, this.generateResultFromCacheRecord(cacheRecord, request)];
                    case 1: return [2 /*return*/, _e.sent()];
                }
            });
        });
    };
    /**
     * Helper function to build response object from the CacheRecord
     * @param cacheRecord
     */
    SilentFlowClient.prototype.generateResultFromCacheRecord = function (cacheRecord, request) {
        return __awaiter(this, void 0, void 0, function () {
            var idTokenObj;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        if (cacheRecord.idToken) {
                            idTokenObj = new AuthToken(cacheRecord.idToken.secret, this.config.cryptoInterface);
                        }
                        return [4 /*yield*/, ResponseHandler.generateAuthenticationResult(this.cryptoUtils, this.authority, cacheRecord, true, request, idTokenObj)];
                    case 1: return [2 /*return*/, _a.sent()];
                }
            });
        });
    };
    return SilentFlowClient;
}(BaseClient));

/*! @azure/msal-common v7.3.0 2022-08-01 */
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
function isOpenIdConfigResponse(response) {
    return (response.hasOwnProperty("authorization_endpoint") &&
        response.hasOwnProperty("token_endpoint") &&
        response.hasOwnProperty("issuer") &&
        response.hasOwnProperty("jwks_uri"));
}

/*! @azure/msal-common v7.3.0 2022-08-01 */
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var rawMetdataJSON = { "endpointMetadata": { "https://login.microsoftonline.com/common/": { "token_endpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.microsoftonline.com/common/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.microsoftonline.com/{tenantid}/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo", "authorization_endpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.microsoftonline.com/common/kerberos", "tenant_region_scope": null, "cloud_instance_name": "microsoftonline.com", "cloud_graph_host_name": "graph.windows.net", "msgraph_host": "graph.microsoft.com", "rbac_url": "https://pas.windows.net" }, "https://login.chinacloudapi.cn/common/": { "token_endpoint": "https://login.chinacloudapi.cn/common/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.chinacloudapi.cn/common/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.partner.microsoftonline.cn/{tenantid}/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://microsoftgraph.chinacloudapi.cn/oidc/userinfo", "authorization_endpoint": "https://login.chinacloudapi.cn/common/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.chinacloudapi.cn/common/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.chinacloudapi.cn/common/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.chinacloudapi.cn/common/kerberos", "tenant_region_scope": null, "cloud_instance_name": "partner.microsoftonline.cn", "cloud_graph_host_name": "graph.chinacloudapi.cn", "msgraph_host": "microsoftgraph.chinacloudapi.cn", "rbac_url": "https://pas.chinacloudapi.cn" }, "https://login.microsoftonline.us/common/": { "token_endpoint": "https://login.microsoftonline.us/common/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.microsoftonline.us/common/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.microsoftonline.us/{tenantid}/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo", "authorization_endpoint": "https://login.microsoftonline.us/common/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.microsoftonline.us/common/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.microsoftonline.us/common/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.microsoftonline.us/common/kerberos", "tenant_region_scope": null, "cloud_instance_name": "microsoftonline.us", "cloud_graph_host_name": "graph.windows.net", "msgraph_host": "graph.microsoft.com", "rbac_url": "https://pasff.usgovcloudapi.net" }, "https://login.microsoftonline.com/consumers/": { "token_endpoint": "https://login.microsoftonline.com/consumers/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.microsoftonline.com/consumers/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.microsoftonline.com/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo", "authorization_endpoint": "https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.microsoftonline.com/consumers/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.microsoftonline.com/consumers/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.microsoftonline.com/consumers/kerberos", "tenant_region_scope": null, "cloud_instance_name": "microsoftonline.com", "cloud_graph_host_name": "graph.windows.net", "msgraph_host": "graph.microsoft.com", "rbac_url": "https://pas.windows.net" }, "https://login.chinacloudapi.cn/consumers/": { "token_endpoint": "https://login.chinacloudapi.cn/consumers/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.chinacloudapi.cn/consumers/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.partner.microsoftonline.cn/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://microsoftgraph.chinacloudapi.cn/oidc/userinfo", "authorization_endpoint": "https://login.chinacloudapi.cn/consumers/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.chinacloudapi.cn/consumers/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.chinacloudapi.cn/consumers/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.chinacloudapi.cn/consumers/kerberos", "tenant_region_scope": null, "cloud_instance_name": "partner.microsoftonline.cn", "cloud_graph_host_name": "graph.chinacloudapi.cn", "msgraph_host": "microsoftgraph.chinacloudapi.cn", "rbac_url": "https://pas.chinacloudapi.cn" }, "https://login.microsoftonline.us/consumers/": { "token_endpoint": "https://login.microsoftonline.us/consumers/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.microsoftonline.us/consumers/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.microsoftonline.us/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo", "authorization_endpoint": "https://login.microsoftonline.us/consumers/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.microsoftonline.us/consumers/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.microsoftonline.us/consumers/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.microsoftonline.us/consumers/kerberos", "tenant_region_scope": null, "cloud_instance_name": "microsoftonline.us", "cloud_graph_host_name": "graph.windows.net", "msgraph_host": "graph.microsoft.com", "rbac_url": "https://pasff.usgovcloudapi.net" }, "https://login.microsoftonline.com/organizations/": { "token_endpoint": "https://login.microsoftonline.com/organizations/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.microsoftonline.com/organizations/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.microsoftonline.com/{tenantid}/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo", "authorization_endpoint": "https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.microsoftonline.com/organizations/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.microsoftonline.com/organizations/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.microsoftonline.com/organizations/kerberos", "tenant_region_scope": null, "cloud_instance_name": "microsoftonline.com", "cloud_graph_host_name": "graph.windows.net", "msgraph_host": "graph.microsoft.com", "rbac_url": "https://pas.windows.net" }, "https://login.chinacloudapi.cn/organizations/": { "token_endpoint": "https://login.chinacloudapi.cn/organizations/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.chinacloudapi.cn/organizations/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.partner.microsoftonline.cn/{tenantid}/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://microsoftgraph.chinacloudapi.cn/oidc/userinfo", "authorization_endpoint": "https://login.chinacloudapi.cn/organizations/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.chinacloudapi.cn/organizations/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.chinacloudapi.cn/organizations/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.chinacloudapi.cn/organizations/kerberos", "tenant_region_scope": null, "cloud_instance_name": "partner.microsoftonline.cn", "cloud_graph_host_name": "graph.chinacloudapi.cn", "msgraph_host": "microsoftgraph.chinacloudapi.cn", "rbac_url": "https://pas.chinacloudapi.cn" }, "https://login.microsoftonline.us/organizations/": { "token_endpoint": "https://login.microsoftonline.us/organizations/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.microsoftonline.us/organizations/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.microsoftonline.us/{tenantid}/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo", "authorization_endpoint": "https://login.microsoftonline.us/organizations/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.microsoftonline.us/organizations/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.microsoftonline.us/organizations/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.microsoftonline.us/organizations/kerberos", "tenant_region_scope": null, "cloud_instance_name": "microsoftonline.us", "cloud_graph_host_name": "graph.windows.net", "msgraph_host": "graph.microsoft.com", "rbac_url": "https://pasff.usgovcloudapi.net" } }, "instanceDiscoveryMetadata": { "https://login.microsoftonline.com/common/": { "tenant_discovery_endpoint": "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.chinacloudapi.cn/common/": { "tenant_discovery_endpoint": "https://login.chinacloudapi.cn/common/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.microsoftonline.us/common/": { "tenant_discovery_endpoint": "https://login.microsoftonline.us/common/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.microsoftonline.com/consumers/": { "tenant_discovery_endpoint": "https://login.microsoftonline.com/consumers/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.chinacloudapi.cn/consumers/": { "tenant_discovery_endpoint": "https://login.chinacloudapi.cn/consumers/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.microsoftonline.us/consumers/": { "tenant_discovery_endpoint": "https://login.microsoftonline.us/consumers/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.microsoftonline.com/organizations/": { "tenant_discovery_endpoint": "https://login.microsoftonline.com/organizations/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.chinacloudapi.cn/organizations/": { "tenant_discovery_endpoint": "https://login.chinacloudapi.cn/organizations/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.microsoftonline.us/organizations/": { "tenant_discovery_endpoint": "https://login.microsoftonline.us/organizations/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] } } };
var EndpointMetadata = rawMetdataJSON.endpointMetadata;
var InstanceDiscoveryMetadata = rawMetdataJSON.instanceDiscoveryMetadata;

/*! @azure/msal-common v7.3.0 2022-08-01 */
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Protocol modes supported by MSAL.
 */
exports.ProtocolMode = void 0;
(function (ProtocolMode) {
    ProtocolMode["AAD"] = "AAD";
    ProtocolMode["OIDC"] = "OIDC";
})(exports.ProtocolMode || (exports.ProtocolMode = {}));

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var AuthorityMetadataEntity = /** @class */ (function () {
    function AuthorityMetadataEntity() {
        this.expiresAt = TimeUtils.nowSeconds() + AUTHORITY_METADATA_CONSTANTS.REFRESH_TIME_SECONDS;
    }
    /**
     * Update the entity with new aliases, preferred_cache and preferred_network values
     * @param metadata
     * @param fromNetwork
     */
    AuthorityMetadataEntity.prototype.updateCloudDiscoveryMetadata = function (metadata, fromNetwork) {
        this.aliases = metadata.aliases;
        this.preferred_cache = metadata.preferred_cache;
        this.preferred_network = metadata.preferred_network;
        this.aliasesFromNetwork = fromNetwork;
    };
    /**
     * Update the entity with new endpoints
     * @param metadata
     * @param fromNetwork
     */
    AuthorityMetadataEntity.prototype.updateEndpointMetadata = function (metadata, fromNetwork) {
        this.authorization_endpoint = metadata.authorization_endpoint;
        this.token_endpoint = metadata.token_endpoint;
        this.end_session_endpoint = metadata.end_session_endpoint;
        this.issuer = metadata.issuer;
        this.endpointsFromNetwork = fromNetwork;
        this.jwks_uri = metadata.jwks_uri;
    };
    /**
     * Save the authority that was used to create this cache entry
     * @param authority
     */
    AuthorityMetadataEntity.prototype.updateCanonicalAuthority = function (authority) {
        this.canonical_authority = authority;
    };
    /**
     * Reset the exiresAt value
     */
    AuthorityMetadataEntity.prototype.resetExpiresAt = function () {
        this.expiresAt = TimeUtils.nowSeconds() + AUTHORITY_METADATA_CONSTANTS.REFRESH_TIME_SECONDS;
    };
    /**
     * Returns whether or not the data needs to be refreshed
     */
    AuthorityMetadataEntity.prototype.isExpired = function () {
        return this.expiresAt <= TimeUtils.nowSeconds();
    };
    /**
     * Validates an entity: checks for all expected params
     * @param entity
     */
    AuthorityMetadataEntity.isAuthorityMetadataEntity = function (key, entity) {
        if (!entity) {
            return false;
        }
        return (key.indexOf(AUTHORITY_METADATA_CONSTANTS.CACHE_KEY) === 0 &&
            entity.hasOwnProperty("aliases") &&
            entity.hasOwnProperty("preferred_cache") &&
            entity.hasOwnProperty("preferred_network") &&
            entity.hasOwnProperty("canonical_authority") &&
            entity.hasOwnProperty("authorization_endpoint") &&
            entity.hasOwnProperty("token_endpoint") &&
            entity.hasOwnProperty("issuer") &&
            entity.hasOwnProperty("aliasesFromNetwork") &&
            entity.hasOwnProperty("endpointsFromNetwork") &&
            entity.hasOwnProperty("expiresAt") &&
            entity.hasOwnProperty("jwks_uri"));
    };
    return AuthorityMetadataEntity;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
function isCloudInstanceDiscoveryResponse(response) {
    return (response.hasOwnProperty("tenant_discovery_endpoint") &&
        response.hasOwnProperty("metadata"));
}

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var RegionDiscovery = /** @class */ (function () {
    function RegionDiscovery(networkInterface) {
        this.networkInterface = networkInterface;
    }
    /**
     * Detect the region from the application's environment.
     *
     * @returns Promise<string | null>
     */
    RegionDiscovery.prototype.detectRegion = function (environmentRegion, regionDiscoveryMetadata, proxyUrl) {
        return __awaiter(this, void 0, void 0, function () {
            var autodetectedRegionName, options, localIMDSVersionResponse, currentIMDSVersion, currentIMDSVersionResponse;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        autodetectedRegionName = environmentRegion;
                        if (!!autodetectedRegionName) return [3 /*break*/, 8];
                        options = RegionDiscovery.IMDS_OPTIONS;
                        if (proxyUrl) {
                            options.proxyUrl = proxyUrl;
                        }
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 6, , 7]);
                        return [4 /*yield*/, this.getRegionFromIMDS(Constants.IMDS_VERSION, options)];
                    case 2:
                        localIMDSVersionResponse = _a.sent();
                        if (localIMDSVersionResponse.status === ResponseCodes.httpSuccess) {
                            autodetectedRegionName = localIMDSVersionResponse.body;
                            regionDiscoveryMetadata.region_source = RegionDiscoverySources.IMDS;
                        }
                        if (!(localIMDSVersionResponse.status === ResponseCodes.httpBadRequest)) return [3 /*break*/, 5];
                        return [4 /*yield*/, this.getCurrentVersion(options)];
                    case 3:
                        currentIMDSVersion = _a.sent();
                        if (!currentIMDSVersion) {
                            regionDiscoveryMetadata.region_source = RegionDiscoverySources.FAILED_AUTO_DETECTION;
                            return [2 /*return*/, null];
                        }
                        return [4 /*yield*/, this.getRegionFromIMDS(currentIMDSVersion, options)];
                    case 4:
                        currentIMDSVersionResponse = _a.sent();
                        if (currentIMDSVersionResponse.status === ResponseCodes.httpSuccess) {
                            autodetectedRegionName = currentIMDSVersionResponse.body;
                            regionDiscoveryMetadata.region_source = RegionDiscoverySources.IMDS;
                        }
                        _a.label = 5;
                    case 5: return [3 /*break*/, 7];
                    case 6:
                        _a.sent();
                        regionDiscoveryMetadata.region_source = RegionDiscoverySources.FAILED_AUTO_DETECTION;
                        return [2 /*return*/, null];
                    case 7: return [3 /*break*/, 9];
                    case 8:
                        regionDiscoveryMetadata.region_source = RegionDiscoverySources.ENVIRONMENT_VARIABLE;
                        _a.label = 9;
                    case 9:
                        // If no region was auto detected from the environment or from the IMDS endpoint, mark the attempt as a FAILED_AUTO_DETECTION
                        if (!autodetectedRegionName) {
                            regionDiscoveryMetadata.region_source = RegionDiscoverySources.FAILED_AUTO_DETECTION;
                        }
                        return [2 /*return*/, autodetectedRegionName || null];
                }
            });
        });
    };
    /**
     * Make the call to the IMDS endpoint
     *
     * @param imdsEndpointUrl
     * @returns Promise<NetworkResponse<string>>
     */
    RegionDiscovery.prototype.getRegionFromIMDS = function (version, options) {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                return [2 /*return*/, this.networkInterface.sendGetRequestAsync(Constants.IMDS_ENDPOINT + "?api-version=" + version + "&format=text", options, Constants.IMDS_TIMEOUT)];
            });
        });
    };
    /**
     * Get the most recent version of the IMDS endpoint available
     *
     * @returns Promise<string | null>
     */
    RegionDiscovery.prototype.getCurrentVersion = function (options) {
        return __awaiter(this, void 0, void 0, function () {
            var response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        _a.trys.push([0, 2, , 3]);
                        return [4 /*yield*/, this.networkInterface.sendGetRequestAsync(Constants.IMDS_ENDPOINT + "?format=json", options)];
                    case 1:
                        response = _a.sent();
                        // When IMDS endpoint is called without the api version query param, bad request response comes back with latest version.
                        if (response.status === ResponseCodes.httpBadRequest && response.body && response.body["newest-versions"] && response.body["newest-versions"].length > 0) {
                            return [2 /*return*/, response.body["newest-versions"][0]];
                        }
                        return [2 /*return*/, null];
                    case 2:
                        _a.sent();
                        return [2 /*return*/, null];
                    case 3: return [2 /*return*/];
                }
            });
        });
    };
    // Options for the IMDS endpoint request
    RegionDiscovery.IMDS_OPTIONS = {
        headers: {
            Metadata: "true",
        },
    };
    return RegionDiscovery;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * The authority class validates the authority URIs used by the user, and retrieves the OpenID Configuration Data from the
 * endpoint. It will store the pertinent config data in this object for use during token calls.
 */
var Authority = /** @class */ (function () {
    function Authority(authority, networkInterface, cacheManager, authorityOptions, proxyUrl) {
        this.canonicalAuthority = authority;
        this._canonicalAuthority.validateAsUri();
        this.networkInterface = networkInterface;
        this.cacheManager = cacheManager;
        this.authorityOptions = authorityOptions;
        this.regionDiscovery = new RegionDiscovery(networkInterface);
        this.regionDiscoveryMetadata = { region_used: undefined, region_source: undefined, region_outcome: undefined };
        this.proxyUrl = proxyUrl || Constants.EMPTY_STRING;
    }
    Object.defineProperty(Authority.prototype, "authorityType", {
        // See above for AuthorityType
        get: function () {
            var pathSegments = this.canonicalAuthorityUrlComponents.PathSegments;
            if (pathSegments.length && pathSegments[0].toLowerCase() === Constants.ADFS) {
                return AuthorityType.Adfs;
            }
            return AuthorityType.Default;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "protocolMode", {
        /**
         * ProtocolMode enum representing the way endpoints are constructed.
         */
        get: function () {
            return this.authorityOptions.protocolMode;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "options", {
        /**
         * Returns authorityOptions which can be used to reinstantiate a new authority instance
         */
        get: function () {
            return this.authorityOptions;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "canonicalAuthority", {
        /**
         * A URL that is the authority set by the developer
         */
        get: function () {
            return this._canonicalAuthority.urlString;
        },
        /**
         * Sets canonical authority.
         */
        set: function (url) {
            this._canonicalAuthority = new UrlString(url);
            this._canonicalAuthority.validateAsUri();
            this._canonicalAuthorityUrlComponents = null;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "canonicalAuthorityUrlComponents", {
        /**
         * Get authority components.
         */
        get: function () {
            if (!this._canonicalAuthorityUrlComponents) {
                this._canonicalAuthorityUrlComponents = this._canonicalAuthority.getUrlComponents();
            }
            return this._canonicalAuthorityUrlComponents;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "hostnameAndPort", {
        /**
         * Get hostname and port i.e. login.microsoftonline.com
         */
        get: function () {
            return this.canonicalAuthorityUrlComponents.HostNameAndPort.toLowerCase();
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "tenant", {
        /**
         * Get tenant for authority.
         */
        get: function () {
            return this.canonicalAuthorityUrlComponents.PathSegments[0];
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "authorizationEndpoint", {
        /**
         * OAuth /authorize endpoint for requests
         */
        get: function () {
            if (this.discoveryComplete()) {
                var endpoint = this.replacePath(this.metadata.authorization_endpoint);
                return this.replaceTenant(endpoint);
            }
            else {
                throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
            }
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "tokenEndpoint", {
        /**
         * OAuth /token endpoint for requests
         */
        get: function () {
            if (this.discoveryComplete()) {
                var endpoint = this.replacePath(this.metadata.token_endpoint);
                return this.replaceTenant(endpoint);
            }
            else {
                throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
            }
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "deviceCodeEndpoint", {
        get: function () {
            if (this.discoveryComplete()) {
                var endpoint = this.replacePath(this.metadata.token_endpoint.replace("/token", "/devicecode"));
                return this.replaceTenant(endpoint);
            }
            else {
                throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
            }
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "endSessionEndpoint", {
        /**
         * OAuth logout endpoint for requests
         */
        get: function () {
            if (this.discoveryComplete()) {
                // ROPC policies may not have end_session_endpoint set
                if (!this.metadata.end_session_endpoint) {
                    throw ClientAuthError.createLogoutNotSupportedError();
                }
                var endpoint = this.replacePath(this.metadata.end_session_endpoint);
                return this.replaceTenant(endpoint);
            }
            else {
                throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
            }
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "selfSignedJwtAudience", {
        /**
         * OAuth issuer for requests
         */
        get: function () {
            if (this.discoveryComplete()) {
                var endpoint = this.replacePath(this.metadata.issuer);
                return this.replaceTenant(endpoint);
            }
            else {
                throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
            }
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "jwksUri", {
        /**
         * Jwks_uri for token signing keys
         */
        get: function () {
            if (this.discoveryComplete()) {
                var endpoint = this.replacePath(this.metadata.jwks_uri);
                return this.replaceTenant(endpoint);
            }
            else {
                throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
            }
        },
        enumerable: false,
        configurable: true
    });
    /**
     * Replaces tenant in url path with current tenant. Defaults to common.
     * @param urlString
     */
    Authority.prototype.replaceTenant = function (urlString) {
        return urlString.replace(/{tenant}|{tenantid}/g, this.tenant);
    };
    /**
     * Replaces path such as tenant or policy with the current tenant or policy.
     * @param urlString
     */
    Authority.prototype.replacePath = function (urlString) {
        var endpoint = urlString;
        var cachedAuthorityUrl = new UrlString(this.metadata.canonical_authority);
        var cachedAuthorityParts = cachedAuthorityUrl.getUrlComponents().PathSegments;
        var currentAuthorityParts = this.canonicalAuthorityUrlComponents.PathSegments;
        currentAuthorityParts.forEach(function (currentPart, index) {
            var cachedPart = cachedAuthorityParts[index];
            if (currentPart !== cachedPart) {
                endpoint = endpoint.replace("/" + cachedPart + "/", "/" + currentPart + "/");
            }
        });
        return endpoint;
    };
    Object.defineProperty(Authority.prototype, "defaultOpenIdConfigurationEndpoint", {
        /**
         * The default open id configuration endpoint for any canonical authority.
         */
        get: function () {
            if (this.authorityType === AuthorityType.Adfs || this.protocolMode === exports.ProtocolMode.OIDC) {
                return this.canonicalAuthority + ".well-known/openid-configuration";
            }
            return this.canonicalAuthority + "v2.0/.well-known/openid-configuration";
        },
        enumerable: false,
        configurable: true
    });
    /**
     * Boolean that returns whethr or not tenant discovery has been completed.
     */
    Authority.prototype.discoveryComplete = function () {
        return !!this.metadata;
    };
    /**
     * Perform endpoint discovery to discover aliases, preferred_cache, preferred_network
     * and the /authorize, /token and logout endpoints.
     */
    Authority.prototype.resolveEndpointsAsync = function () {
        return __awaiter(this, void 0, void 0, function () {
            var metadataEntity, cloudDiscoverySource, endpointSource, cacheKey;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        metadataEntity = this.cacheManager.getAuthorityMetadataByAlias(this.hostnameAndPort);
                        if (!metadataEntity) {
                            metadataEntity = new AuthorityMetadataEntity();
                            metadataEntity.updateCanonicalAuthority(this.canonicalAuthority);
                        }
                        return [4 /*yield*/, this.updateCloudDiscoveryMetadata(metadataEntity)];
                    case 1:
                        cloudDiscoverySource = _a.sent();
                        this.canonicalAuthority = this.canonicalAuthority.replace(this.hostnameAndPort, metadataEntity.preferred_network);
                        return [4 /*yield*/, this.updateEndpointMetadata(metadataEntity)];
                    case 2:
                        endpointSource = _a.sent();
                        if (cloudDiscoverySource !== AuthorityMetadataSource.CACHE && endpointSource !== AuthorityMetadataSource.CACHE) {
                            // Reset the expiration time unless both values came from a successful cache lookup
                            metadataEntity.resetExpiresAt();
                            metadataEntity.updateCanonicalAuthority(this.canonicalAuthority);
                        }
                        cacheKey = this.cacheManager.generateAuthorityMetadataCacheKey(metadataEntity.preferred_cache);
                        this.cacheManager.setAuthorityMetadata(cacheKey, metadataEntity);
                        this.metadata = metadataEntity;
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Update AuthorityMetadataEntity with new endpoints and return where the information came from
     * @param metadataEntity
     */
    Authority.prototype.updateEndpointMetadata = function (metadataEntity) {
        var _a, _b;
        return __awaiter(this, void 0, void 0, function () {
            var metadata, harcodedMetadata;
            return __generator(this, function (_c) {
                switch (_c.label) {
                    case 0:
                        metadata = this.getEndpointMetadataFromConfig();
                        if (metadata) {
                            metadataEntity.updateEndpointMetadata(metadata, false);
                            return [2 /*return*/, AuthorityMetadataSource.CONFIG];
                        }
                        if (this.isAuthoritySameType(metadataEntity) && metadataEntity.endpointsFromNetwork && !metadataEntity.isExpired()) {
                            // No need to update
                            return [2 /*return*/, AuthorityMetadataSource.CACHE];
                        }
                        harcodedMetadata = this.getEndpointMetadataFromHardcodedValues();
                        return [4 /*yield*/, this.getEndpointMetadataFromNetwork()];
                    case 1:
                        metadata = _c.sent();
                        if (!metadata) return [3 /*break*/, 4];
                        if (!((_a = this.authorityOptions.azureRegionConfiguration) === null || _a === void 0 ? void 0 : _a.azureRegion)) return [3 /*break*/, 3];
                        return [4 /*yield*/, this.updateMetadataWithRegionalInformation(metadata)];
                    case 2:
                        metadata = _c.sent();
                        _c.label = 3;
                    case 3:
                        metadataEntity.updateEndpointMetadata(metadata, true);
                        return [2 /*return*/, AuthorityMetadataSource.NETWORK];
                    case 4:
                        if (!(harcodedMetadata && !this.authorityOptions.skipAuthorityMetadataCache)) return [3 /*break*/, 7];
                        if (!((_b = this.authorityOptions.azureRegionConfiguration) === null || _b === void 0 ? void 0 : _b.azureRegion)) return [3 /*break*/, 6];
                        return [4 /*yield*/, this.updateMetadataWithRegionalInformation(harcodedMetadata)];
                    case 5:
                        harcodedMetadata = _c.sent();
                        _c.label = 6;
                    case 6:
                        metadataEntity.updateEndpointMetadata(harcodedMetadata, false);
                        return [2 /*return*/, AuthorityMetadataSource.HARDCODED_VALUES];
                    case 7: throw ClientAuthError.createUnableToGetOpenidConfigError(this.defaultOpenIdConfigurationEndpoint);
                }
            });
        });
    };
    /**
     * Compares the number of url components after the domain to determine if the cached authority metadata can be used for the requested authority
     * Protects against same domain different authority such as login.microsoftonline.com/tenant and login.microsoftonline.com/tfp/tenant/policy
     * @param metadataEntity
     */
    Authority.prototype.isAuthoritySameType = function (metadataEntity) {
        var cachedAuthorityUrl = new UrlString(metadataEntity.canonical_authority);
        var cachedParts = cachedAuthorityUrl.getUrlComponents().PathSegments;
        return cachedParts.length === this.canonicalAuthorityUrlComponents.PathSegments.length;
    };
    /**
     * Parse authorityMetadata config option
     */
    Authority.prototype.getEndpointMetadataFromConfig = function () {
        if (this.authorityOptions.authorityMetadata) {
            try {
                return JSON.parse(this.authorityOptions.authorityMetadata);
            }
            catch (e) {
                throw ClientConfigurationError.createInvalidAuthorityMetadataError();
            }
        }
        return null;
    };
    /**
     * Gets OAuth endpoints from the given OpenID configuration endpoint.
     *
     * @param hasHardcodedMetadata boolean
     */
    Authority.prototype.getEndpointMetadataFromNetwork = function () {
        return __awaiter(this, void 0, void 0, function () {
            var options, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        options = {};
                        if (this.proxyUrl) {
                            options.proxyUrl = this.proxyUrl;
                        }
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        return [4 /*yield*/, this.networkInterface.sendGetRequestAsync(this.defaultOpenIdConfigurationEndpoint, options)];
                    case 2:
                        response = _a.sent();
                        return [2 /*return*/, isOpenIdConfigResponse(response.body) ? response.body : null];
                    case 3:
                        _a.sent();
                        return [2 /*return*/, null];
                    case 4: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Get OAuth endpoints for common authorities.
     */
    Authority.prototype.getEndpointMetadataFromHardcodedValues = function () {
        if (this.canonicalAuthority in EndpointMetadata) {
            return EndpointMetadata[this.canonicalAuthority];
        }
        return null;
    };
    /**
     * Update the retrieved metadata with regional information.
     */
    Authority.prototype.updateMetadataWithRegionalInformation = function (metadata) {
        var _a, _b, _c, _d, _e;
        return __awaiter(this, void 0, void 0, function () {
            var autodetectedRegionName, azureRegion;
            return __generator(this, function (_f) {
                switch (_f.label) {
                    case 0: return [4 /*yield*/, this.regionDiscovery.detectRegion((_a = this.authorityOptions.azureRegionConfiguration) === null || _a === void 0 ? void 0 : _a.environmentRegion, this.regionDiscoveryMetadata, this.proxyUrl)];
                    case 1:
                        autodetectedRegionName = _f.sent();
                        azureRegion = ((_b = this.authorityOptions.azureRegionConfiguration) === null || _b === void 0 ? void 0 : _b.azureRegion) === Constants.AZURE_REGION_AUTO_DISCOVER_FLAG
                            ? autodetectedRegionName
                            : (_c = this.authorityOptions.azureRegionConfiguration) === null || _c === void 0 ? void 0 : _c.azureRegion;
                        if (((_d = this.authorityOptions.azureRegionConfiguration) === null || _d === void 0 ? void 0 : _d.azureRegion) === Constants.AZURE_REGION_AUTO_DISCOVER_FLAG) {
                            this.regionDiscoveryMetadata.region_outcome = autodetectedRegionName ?
                                RegionDiscoveryOutcomes.AUTO_DETECTION_REQUESTED_SUCCESSFUL :
                                RegionDiscoveryOutcomes.AUTO_DETECTION_REQUESTED_FAILED;
                        }
                        else {
                            if (autodetectedRegionName) {
                                this.regionDiscoveryMetadata.region_outcome = (((_e = this.authorityOptions.azureRegionConfiguration) === null || _e === void 0 ? void 0 : _e.azureRegion) === autodetectedRegionName) ?
                                    RegionDiscoveryOutcomes.CONFIGURED_MATCHES_DETECTED :
                                    RegionDiscoveryOutcomes.CONFIGURED_NOT_DETECTED;
                            }
                            else {
                                this.regionDiscoveryMetadata.region_outcome = RegionDiscoveryOutcomes.CONFIGURED_NO_AUTO_DETECTION;
                            }
                        }
                        if (azureRegion) {
                            this.regionDiscoveryMetadata.region_used = azureRegion;
                            return [2 /*return*/, Authority.replaceWithRegionalInformation(metadata, azureRegion)];
                        }
                        return [2 /*return*/, metadata];
                }
            });
        });
    };
    /**
     * Updates the AuthorityMetadataEntity with new aliases, preferred_network and preferred_cache and returns where the information was retrived from
     * @param cachedMetadata
     * @param newMetadata
     */
    Authority.prototype.updateCloudDiscoveryMetadata = function (metadataEntity) {
        return __awaiter(this, void 0, void 0, function () {
            var metadata, harcodedMetadata;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        metadata = this.getCloudDiscoveryMetadataFromConfig();
                        if (metadata) {
                            metadataEntity.updateCloudDiscoveryMetadata(metadata, false);
                            return [2 /*return*/, AuthorityMetadataSource.CONFIG];
                        }
                        // If The cached metadata came from config but that config was not passed to this instance, we must go to the network
                        if (this.isAuthoritySameType(metadataEntity) && metadataEntity.aliasesFromNetwork && !metadataEntity.isExpired()) {
                            // No need to update
                            return [2 /*return*/, AuthorityMetadataSource.CACHE];
                        }
                        harcodedMetadata = this.getCloudDiscoveryMetadataFromHarcodedValues();
                        return [4 /*yield*/, this.getCloudDiscoveryMetadataFromNetwork()];
                    case 1:
                        metadata = _a.sent();
                        if (metadata) {
                            metadataEntity.updateCloudDiscoveryMetadata(metadata, true);
                            return [2 /*return*/, AuthorityMetadataSource.NETWORK];
                        }
                        if (harcodedMetadata && !this.options.skipAuthorityMetadataCache) {
                            metadataEntity.updateCloudDiscoveryMetadata(harcodedMetadata, false);
                            return [2 /*return*/, AuthorityMetadataSource.HARDCODED_VALUES];
                        }
                        else {
                            // Metadata could not be obtained from config, cache or network
                            throw ClientConfigurationError.createUntrustedAuthorityError();
                        }
                }
            });
        });
    };
    /**
     * Parse cloudDiscoveryMetadata config or check knownAuthorities
     */
    Authority.prototype.getCloudDiscoveryMetadataFromConfig = function () {
        // Check if network response was provided in config
        if (this.authorityOptions.cloudDiscoveryMetadata) {
            try {
                var parsedResponse = JSON.parse(this.authorityOptions.cloudDiscoveryMetadata);
                var metadata = Authority.getCloudDiscoveryMetadataFromNetworkResponse(parsedResponse.metadata, this.hostnameAndPort);
                if (metadata) {
                    return metadata;
                }
            }
            catch (e) {
                throw ClientConfigurationError.createInvalidCloudDiscoveryMetadataError();
            }
        }
        // If cloudDiscoveryMetadata is empty or does not contain the host, check knownAuthorities
        if (this.isInKnownAuthorities()) {
            return Authority.createCloudDiscoveryMetadataFromHost(this.hostnameAndPort);
        }
        return null;
    };
    /**
     * Called to get metadata from network if CloudDiscoveryMetadata was not populated by config
     *
     * @param hasHardcodedMetadata boolean
     */
    Authority.prototype.getCloudDiscoveryMetadataFromNetwork = function () {
        return __awaiter(this, void 0, void 0, function () {
            var instanceDiscoveryEndpoint, options, match, response, metadata;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        instanceDiscoveryEndpoint = "" + Constants.AAD_INSTANCE_DISCOVERY_ENDPT + this.canonicalAuthority + "oauth2/v2.0/authorize";
                        options = {};
                        if (this.proxyUrl) {
                            options.proxyUrl = this.proxyUrl;
                        }
                        match = null;
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        return [4 /*yield*/, this.networkInterface.sendGetRequestAsync(instanceDiscoveryEndpoint, options)];
                    case 2:
                        response = _a.sent();
                        metadata = isCloudInstanceDiscoveryResponse(response.body)
                            ? response.body.metadata
                            : [];
                        if (metadata.length === 0) {
                            // If no metadata is returned, authority is untrusted
                            return [2 /*return*/, null];
                        }
                        match = Authority.getCloudDiscoveryMetadataFromNetworkResponse(metadata, this.hostnameAndPort);
                        return [3 /*break*/, 4];
                    case 3:
                        _a.sent();
                        return [2 /*return*/, null];
                    case 4:
                        if (!match) {
                            // Custom Domain scenario, host is trusted because Instance Discovery call succeeded
                            match = Authority.createCloudDiscoveryMetadataFromHost(this.hostnameAndPort);
                        }
                        return [2 /*return*/, match];
                }
            });
        });
    };
    /**
     * Get cloud discovery metadata for common authorities
     */
    Authority.prototype.getCloudDiscoveryMetadataFromHarcodedValues = function () {
        if (this.canonicalAuthority in InstanceDiscoveryMetadata) {
            return InstanceDiscoveryMetadata[this.canonicalAuthority];
        }
        return null;
    };
    /**
     * Helper function to determine if this host is included in the knownAuthorities config option
     */
    Authority.prototype.isInKnownAuthorities = function () {
        var _this = this;
        var matches = this.authorityOptions.knownAuthorities.filter(function (authority) {
            return UrlString.getDomainFromUrl(authority).toLowerCase() === _this.hostnameAndPort;
        });
        return matches.length > 0;
    };
    /**
     * helper function to populate the authority based on azureCloudOptions
     * @param authorityString
     * @param azureCloudOptions
     */
    Authority.generateAuthority = function (authorityString, azureCloudOptions) {
        var authorityAzureCloudInstance;
        if (azureCloudOptions && azureCloudOptions.azureCloudInstance !== exports.AzureCloudInstance.None) {
            var tenant = azureCloudOptions.tenant ? azureCloudOptions.tenant : Constants.DEFAULT_COMMON_TENANT;
            authorityAzureCloudInstance = azureCloudOptions.azureCloudInstance + "/" + tenant + "/";
        }
        return authorityAzureCloudInstance ? authorityAzureCloudInstance : authorityString;
    };
    /**
     * Creates cloud discovery metadata object from a given host
     * @param host
     */
    Authority.createCloudDiscoveryMetadataFromHost = function (host) {
        return {
            preferred_network: host,
            preferred_cache: host,
            aliases: [host]
        };
    };
    /**
     * Searches instance discovery network response for the entry that contains the host in the aliases list
     * @param response
     * @param authority
     */
    Authority.getCloudDiscoveryMetadataFromNetworkResponse = function (response, authority) {
        for (var i = 0; i < response.length; i++) {
            var metadata = response[i];
            if (metadata.aliases.indexOf(authority) > -1) {
                return metadata;
            }
        }
        return null;
    };
    /**
     * helper function to generate environment from authority object
     */
    Authority.prototype.getPreferredCache = function () {
        if (this.discoveryComplete()) {
            return this.metadata.preferred_cache;
        }
        else {
            throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
        }
    };
    /**
     * Returns whether or not the provided host is an alias of this authority instance
     * @param host
     */
    Authority.prototype.isAlias = function (host) {
        return this.metadata.aliases.indexOf(host) > -1;
    };
    /**
     * Checks whether the provided host is that of a public cloud authority
     *
     * @param authority string
     * @returns bool
     */
    Authority.isPublicCloudAuthority = function (host) {
        return Constants.KNOWN_PUBLIC_CLOUDS.indexOf(host) >= 0;
    };
    /**
     * Rebuild the authority string with the region
     *
     * @param host string
     * @param region string
     */
    Authority.buildRegionalAuthorityString = function (host, region, queryString) {
        // Create and validate a Url string object with the initial authority string
        var authorityUrlInstance = new UrlString(host);
        authorityUrlInstance.validateAsUri();
        var authorityUrlParts = authorityUrlInstance.getUrlComponents();
        var hostNameAndPort = region + "." + authorityUrlParts.HostNameAndPort;
        if (this.isPublicCloudAuthority(authorityUrlParts.HostNameAndPort)) {
            hostNameAndPort = region + "." + Constants.REGIONAL_AUTH_PUBLIC_CLOUD_SUFFIX;
        }
        // Include the query string portion of the url
        var url = UrlString.constructAuthorityUriFromObject(__assign(__assign({}, authorityUrlInstance.getUrlComponents()), { HostNameAndPort: hostNameAndPort })).urlString;
        // Add the query string if a query string was provided
        if (queryString)
            return url + "?" + queryString;
        return url;
    };
    /**
     * Replace the endpoints in the metadata object with their regional equivalents.
     *
     * @param metadata OpenIdConfigResponse
     * @param azureRegion string
     */
    Authority.replaceWithRegionalInformation = function (metadata, azureRegion) {
        metadata.authorization_endpoint = Authority.buildRegionalAuthorityString(metadata.authorization_endpoint, azureRegion);
        // TODO: Enquire on whether we should leave the query string or remove it before releasing the feature
        metadata.token_endpoint = Authority.buildRegionalAuthorityString(metadata.token_endpoint, azureRegion, "allowestsrnonmsi=true");
        if (metadata.end_session_endpoint) {
            metadata.end_session_endpoint = Authority.buildRegionalAuthorityString(metadata.end_session_endpoint, azureRegion);
        }
        return metadata;
    };
    return Authority;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var AuthorityFactory = /** @class */ (function () {
    function AuthorityFactory() {
    }
    /**
     * Create an authority object of the correct type based on the url
     * Performs basic authority validation - checks to see if the authority is of a valid type (i.e. aad, b2c, adfs)
     *
     * Also performs endpoint discovery.
     *
     * @param authorityUri
     * @param networkClient
     * @param protocolMode
     */
    AuthorityFactory.createDiscoveredInstance = function (authorityUri, networkClient, cacheManager, authorityOptions, proxyUrl) {
        return __awaiter(this, void 0, void 0, function () {
            var acquireTokenAuthority, e_1;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        acquireTokenAuthority = AuthorityFactory.createInstance(authorityUri, networkClient, cacheManager, authorityOptions, proxyUrl);
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        return [4 /*yield*/, acquireTokenAuthority.resolveEndpointsAsync()];
                    case 2:
                        _a.sent();
                        return [2 /*return*/, acquireTokenAuthority];
                    case 3:
                        e_1 = _a.sent();
                        throw ClientAuthError.createEndpointDiscoveryIncompleteError(e_1);
                    case 4: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Create an authority object of the correct type based on the url
     * Performs basic authority validation - checks to see if the authority is of a valid type (i.e. aad, b2c, adfs)
     *
     * Does not perform endpoint discovery.
     *
     * @param authorityUrl
     * @param networkInterface
     * @param protocolMode
     */
    AuthorityFactory.createInstance = function (authorityUrl, networkInterface, cacheManager, authorityOptions, proxyUrl) {
        // Throw error if authority url is empty
        if (StringUtils.isEmpty(authorityUrl)) {
            throw ClientConfigurationError.createUrlEmptyError();
        }
        return new Authority(authorityUrl, networkInterface, cacheManager, authorityOptions, proxyUrl);
    };
    return AuthorityFactory;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var ServerTelemetryEntity = /** @class */ (function () {
    function ServerTelemetryEntity() {
        this.failedRequests = [];
        this.errors = [];
        this.cacheHits = 0;
    }
    /**
     * validates if a given cache entry is "Telemetry", parses <key,value>
     * @param key
     * @param entity
     */
    ServerTelemetryEntity.isServerTelemetryEntity = function (key, entity) {
        var validateKey = key.indexOf(SERVER_TELEM_CONSTANTS.CACHE_KEY) === 0;
        var validateEntity = true;
        if (entity) {
            validateEntity =
                entity.hasOwnProperty("failedRequests") &&
                    entity.hasOwnProperty("errors") &&
                    entity.hasOwnProperty("cacheHits");
        }
        return validateKey && validateEntity;
    };
    return ServerTelemetryEntity;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var ThrottlingEntity = /** @class */ (function () {
    function ThrottlingEntity() {
    }
    /**
     * validates if a given cache entry is "Throttling", parses <key,value>
     * @param key
     * @param entity
     */
    ThrottlingEntity.isThrottlingEntity = function (key, entity) {
        var validateKey = false;
        if (key) {
            validateKey = key.indexOf(ThrottlingConstants.THROTTLING_PREFIX) === 0;
        }
        var validateEntity = true;
        if (entity) {
            validateEntity = entity.hasOwnProperty("throttleTime");
        }
        return validateKey && validateEntity;
    };
    return ThrottlingEntity;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var StubbedNetworkModule = {
    sendGetRequestAsync: function () {
        var notImplErr = "Network interface - sendGetRequestAsync() has not been implemented for the Network interface.";
        return Promise.reject(AuthError.createUnexpectedError(notImplErr));
    },
    sendPostRequestAsync: function () {
        var notImplErr = "Network interface - sendPostRequestAsync() has not been implemented for the Network interface.";
        return Promise.reject(AuthError.createUnexpectedError(notImplErr));
    }
};

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * ClientAuthErrorMessage class containing string constants used by error codes and messages.
 */
var JoseHeaderErrorMessage = {
    missingKidError: {
        code: "missing_kid_error",
        desc: "The JOSE Header for the requested JWT, JWS or JWK object requires a keyId to be configured as the 'kid' header claim. No 'kid' value was provided."
    },
    missingAlgError: {
        code: "missing_alg_error",
        desc: "The JOSE Header for the requested JWT, JWS or JWK object requires an algorithm to be specified as the 'alg' header claim. No 'alg' value was provided."
    },
};
/**
 * Error thrown when there is an error in the client code running on the browser.
 */
var JoseHeaderError = /** @class */ (function (_super) {
    __extends(JoseHeaderError, _super);
    function JoseHeaderError(errorCode, errorMessage) {
        var _this = _super.call(this, errorCode, errorMessage) || this;
        _this.name = "JoseHeaderError";
        Object.setPrototypeOf(_this, JoseHeaderError.prototype);
        return _this;
    }
    /**
     * Creates an error thrown when keyId isn't set on JOSE header.
     */
    JoseHeaderError.createMissingKidError = function () {
        return new JoseHeaderError(JoseHeaderErrorMessage.missingKidError.code, JoseHeaderErrorMessage.missingKidError.desc);
    };
    /**
     * Creates an error thrown when algorithm isn't set on JOSE header.
     */
    JoseHeaderError.createMissingAlgError = function () {
        return new JoseHeaderError(JoseHeaderErrorMessage.missingAlgError.code, JoseHeaderErrorMessage.missingAlgError.desc);
    };
    return JoseHeaderError;
}(AuthError));

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var JoseHeader = /** @class */ (function () {
    function JoseHeader(options) {
        this.typ = options.typ;
        this.alg = options.alg;
        this.kid = options.kid;
    }
    /**
     * Builds SignedHttpRequest formatted JOSE Header from the
     * JOSE Header options provided or previously set on the object and returns
     * the stringified header object.
     * Throws if keyId or algorithm aren't provided since they are required for Access Token Binding.
     * @param shrHeaderOptions
     * @returns
     */
    JoseHeader.getShrHeaderString = function (shrHeaderOptions) {
        // KeyID is required on the SHR header
        if (!shrHeaderOptions.kid) {
            throw JoseHeaderError.createMissingKidError();
        }
        // Alg is required on the SHR header
        if (!shrHeaderOptions.alg) {
            throw JoseHeaderError.createMissingAlgError();
        }
        var shrHeader = new JoseHeader({
            // Access Token PoP headers must have type JWT, but the type header can be overriden for special cases
            typ: shrHeaderOptions.typ || JsonTypes.Jwt,
            kid: shrHeaderOptions.kid,
            alg: shrHeaderOptions.alg
        });
        return JSON.stringify(shrHeader);
    };
    return JoseHeader;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * This is a helper class that parses supported HTTP response authentication headers to extract and return
 * header challenge values that can be used outside the basic authorization flows.
 */
var AuthenticationHeaderParser = /** @class */ (function () {
    function AuthenticationHeaderParser(headers) {
        this.headers = headers;
    }
    /**
     * This method parses the SHR nonce value out of either the Authentication-Info or WWW-Authenticate authentication headers.
     * @returns
     */
    AuthenticationHeaderParser.prototype.getShrNonce = function () {
        // Attempt to parse nonce from Authentiacation-Info
        var authenticationInfo = this.headers[HeaderNames.AuthenticationInfo];
        if (authenticationInfo) {
            var authenticationInfoChallenges = this.parseChallenges(authenticationInfo);
            if (authenticationInfoChallenges.nextnonce) {
                return authenticationInfoChallenges.nextnonce;
            }
            throw ClientConfigurationError.createInvalidAuthenticationHeaderError(HeaderNames.AuthenticationInfo, "nextnonce challenge is missing.");
        }
        // Attempt to parse nonce from WWW-Authenticate
        var wwwAuthenticate = this.headers[HeaderNames.WWWAuthenticate];
        if (wwwAuthenticate) {
            var wwwAuthenticateChallenges = this.parseChallenges(wwwAuthenticate);
            if (wwwAuthenticateChallenges.nonce) {
                return wwwAuthenticateChallenges.nonce;
            }
            throw ClientConfigurationError.createInvalidAuthenticationHeaderError(HeaderNames.WWWAuthenticate, "nonce challenge is missing.");
        }
        // If neither header is present, throw missing headers error
        throw ClientConfigurationError.createMissingNonceAuthenticationHeadersError();
    };
    /**
     * Parses an HTTP header's challenge set into a key/value map.
     * @param header
     * @returns
     */
    AuthenticationHeaderParser.prototype.parseChallenges = function (header) {
        var schemeSeparator = header.indexOf(" ");
        var challenges = header.substr(schemeSeparator + 1).split(",");
        var challengeMap = {};
        challenges.forEach(function (challenge) {
            var _a = challenge.split("="), key = _a[0], value = _a[1];
            // Remove escaped quotation marks (', ") from challenge string to keep only the challenge value
            challengeMap[key] = unescape(value.replace(/['"]+/g, Constants.EMPTY_STRING));
        });
        return challengeMap;
    };
    return AuthenticationHeaderParser;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var ServerTelemetryManager = /** @class */ (function () {
    function ServerTelemetryManager(telemetryRequest, cacheManager) {
        this.cacheOutcome = CacheOutcome.NO_CACHE_HIT;
        this.cacheManager = cacheManager;
        this.apiId = telemetryRequest.apiId;
        this.correlationId = telemetryRequest.correlationId;
        this.wrapperSKU = telemetryRequest.wrapperSKU || Constants.EMPTY_STRING;
        this.wrapperVer = telemetryRequest.wrapperVer || Constants.EMPTY_STRING;
        this.telemetryCacheKey = SERVER_TELEM_CONSTANTS.CACHE_KEY + Separators.CACHE_KEY_SEPARATOR + telemetryRequest.clientId;
    }
    /**
     * API to add MSER Telemetry to request
     */
    ServerTelemetryManager.prototype.generateCurrentRequestHeaderValue = function () {
        var request = "" + this.apiId + SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR + this.cacheOutcome;
        var platformFields = [this.wrapperSKU, this.wrapperVer].join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);
        var regionDiscoveryFields = this.getRegionDiscoveryFields();
        var requestWithRegionDiscoveryFields = [request, regionDiscoveryFields].join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);
        return [SERVER_TELEM_CONSTANTS.SCHEMA_VERSION, requestWithRegionDiscoveryFields, platformFields].join(SERVER_TELEM_CONSTANTS.CATEGORY_SEPARATOR);
    };
    /**
     * API to add MSER Telemetry for the last failed request
     */
    ServerTelemetryManager.prototype.generateLastRequestHeaderValue = function () {
        var lastRequests = this.getLastRequests();
        var maxErrors = ServerTelemetryManager.maxErrorsToSend(lastRequests);
        var failedRequests = lastRequests.failedRequests.slice(0, 2 * maxErrors).join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);
        var errors = lastRequests.errors.slice(0, maxErrors).join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);
        var errorCount = lastRequests.errors.length;
        // Indicate whether this header contains all data or partial data
        var overflow = maxErrors < errorCount ? SERVER_TELEM_CONSTANTS.OVERFLOW_TRUE : SERVER_TELEM_CONSTANTS.OVERFLOW_FALSE;
        var platformFields = [errorCount, overflow].join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);
        return [SERVER_TELEM_CONSTANTS.SCHEMA_VERSION, lastRequests.cacheHits, failedRequests, errors, platformFields].join(SERVER_TELEM_CONSTANTS.CATEGORY_SEPARATOR);
    };
    /**
     * API to cache token failures for MSER data capture
     * @param error
     */
    ServerTelemetryManager.prototype.cacheFailedRequest = function (error) {
        var lastRequests = this.getLastRequests();
        if (lastRequests.errors.length >= SERVER_TELEM_CONSTANTS.MAX_CACHED_ERRORS) {
            // Remove a cached error to make room, first in first out
            lastRequests.failedRequests.shift(); // apiId
            lastRequests.failedRequests.shift(); // correlationId
            lastRequests.errors.shift();
        }
        lastRequests.failedRequests.push(this.apiId, this.correlationId);
        if (!StringUtils.isEmpty(error.subError)) {
            lastRequests.errors.push(error.subError);
        }
        else if (!StringUtils.isEmpty(error.errorCode)) {
            lastRequests.errors.push(error.errorCode);
        }
        else if (!!error && error.toString()) {
            lastRequests.errors.push(error.toString());
        }
        else {
            lastRequests.errors.push(SERVER_TELEM_CONSTANTS.UNKNOWN_ERROR);
        }
        this.cacheManager.setServerTelemetry(this.telemetryCacheKey, lastRequests);
        return;
    };
    /**
     * Update server telemetry cache entry by incrementing cache hit counter
     */
    ServerTelemetryManager.prototype.incrementCacheHits = function () {
        var lastRequests = this.getLastRequests();
        lastRequests.cacheHits += 1;
        this.cacheManager.setServerTelemetry(this.telemetryCacheKey, lastRequests);
        return lastRequests.cacheHits;
    };
    /**
     * Get the server telemetry entity from cache or initialize a new one
     */
    ServerTelemetryManager.prototype.getLastRequests = function () {
        var initialValue = new ServerTelemetryEntity();
        var lastRequests = this.cacheManager.getServerTelemetry(this.telemetryCacheKey);
        return lastRequests || initialValue;
    };
    /**
     * Remove server telemetry cache entry
     */
    ServerTelemetryManager.prototype.clearTelemetryCache = function () {
        var lastRequests = this.getLastRequests();
        var numErrorsFlushed = ServerTelemetryManager.maxErrorsToSend(lastRequests);
        var errorCount = lastRequests.errors.length;
        if (numErrorsFlushed === errorCount) {
            // All errors were sent on last request, clear Telemetry cache
            this.cacheManager.removeItem(this.telemetryCacheKey);
        }
        else {
            // Partial data was flushed to server, construct a new telemetry cache item with errors that were not flushed
            var serverTelemEntity = new ServerTelemetryEntity();
            serverTelemEntity.failedRequests = lastRequests.failedRequests.slice(numErrorsFlushed * 2); // failedRequests contains 2 items for each error
            serverTelemEntity.errors = lastRequests.errors.slice(numErrorsFlushed);
            this.cacheManager.setServerTelemetry(this.telemetryCacheKey, serverTelemEntity);
        }
    };
    /**
     * Returns the maximum number of errors that can be flushed to the server in the next network request
     * @param serverTelemetryEntity
     */
    ServerTelemetryManager.maxErrorsToSend = function (serverTelemetryEntity) {
        var i;
        var maxErrors = 0;
        var dataSize = 0;
        var errorCount = serverTelemetryEntity.errors.length;
        for (i = 0; i < errorCount; i++) {
            // failedRequests parameter contains pairs of apiId and correlationId, multiply index by 2 to preserve pairs
            var apiId = serverTelemetryEntity.failedRequests[2 * i] || Constants.EMPTY_STRING;
            var correlationId = serverTelemetryEntity.failedRequests[2 * i + 1] || Constants.EMPTY_STRING;
            var errorCode = serverTelemetryEntity.errors[i] || Constants.EMPTY_STRING;
            // Count number of characters that would be added to header, each character is 1 byte. Add 3 at the end to account for separators
            dataSize += apiId.toString().length + correlationId.toString().length + errorCode.length + 3;
            if (dataSize < SERVER_TELEM_CONSTANTS.MAX_LAST_HEADER_BYTES) {
                // Adding this entry to the header would still keep header size below the limit
                maxErrors += 1;
            }
            else {
                break;
            }
        }
        return maxErrors;
    };
    /**
     * Get the region discovery fields
     *
     * @returns string
     */
    ServerTelemetryManager.prototype.getRegionDiscoveryFields = function () {
        var regionDiscoveryFields = [];
        regionDiscoveryFields.push(this.regionUsed || Constants.EMPTY_STRING);
        regionDiscoveryFields.push(this.regionSource || Constants.EMPTY_STRING);
        regionDiscoveryFields.push(this.regionOutcome || Constants.EMPTY_STRING);
        return regionDiscoveryFields.join(",");
    };
    /**
     * Update the region discovery metadata
     *
     * @param regionDiscoveryMetadata
     * @returns void
     */
    ServerTelemetryManager.prototype.updateRegionDiscoveryMetadata = function (regionDiscoveryMetadata) {
        this.regionUsed = regionDiscoveryMetadata.region_used;
        this.regionSource = regionDiscoveryMetadata.region_source;
        this.regionOutcome = regionDiscoveryMetadata.region_outcome;
    };
    /**
     * Set cache outcome
     */
    ServerTelemetryManager.prototype.setCacheOutcome = function (cacheOutcome) {
        this.cacheOutcome = cacheOutcome;
    };
    return ServerTelemetryManager;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var PerformanceClient = /** @class */ (function () {
    /**
     * Creates an instance of PerformanceClient,
     * an abstract class containing core performance telemetry logic.
     *
     * @constructor
     * @param {string} clientId Client ID of the application
     * @param {string} authority Authority used by the application
     * @param {Logger} logger Logger used by the application
     * @param {string} libraryName Name of the library
     * @param {string} libraryVersion Version of the library
     */
    function PerformanceClient(clientId, authority, logger, libraryName, libraryVersion, applicationTelemetry) {
        this.authority = authority;
        this.libraryName = libraryName;
        this.libraryVersion = libraryVersion;
        this.applicationTelemetry = applicationTelemetry;
        this.clientId = clientId;
        this.logger = logger;
        this.callbacks = new Map();
        this.eventsByCorrelationId = new Map();
        this.measurementsById = new Map();
    }
    /**
     * Starts measuring performance for a given operation. Returns a function that should be used to end the measurement.
     *
     * @param {PerformanceEvents} measureName
     * @param {?string} [correlationId]
     * @returns {InProgressPerformanceEvent}
     */
    PerformanceClient.prototype.startMeasurement = function (measureName, correlationId) {
        var _this = this;
        var _a, _b;
        // Generate a placeholder correlation if the request does not provide one
        var eventCorrelationId = correlationId || this.generateId();
        if (!correlationId) {
            this.logger.info("PerformanceClient: No correlation id provided for " + measureName + ", generating", eventCorrelationId);
        }
        this.logger.trace("PerformanceClient: Performance measurement started for " + measureName, eventCorrelationId);
        var performanceMeasurement = this.startPerformanceMeasuremeant(measureName, eventCorrelationId);
        performanceMeasurement.startMeasurement();
        var inProgressEvent = {
            eventId: this.generateId(),
            status: PerformanceEventStatus.InProgress,
            authority: this.authority,
            libraryName: this.libraryName,
            libraryVersion: this.libraryVersion,
            appName: (_a = this.applicationTelemetry) === null || _a === void 0 ? void 0 : _a.appName,
            appVersion: (_b = this.applicationTelemetry) === null || _b === void 0 ? void 0 : _b.appVersion,
            clientId: this.clientId,
            name: measureName,
            startTimeMs: Date.now(),
            correlationId: eventCorrelationId,
        };
        // Store in progress events so they can be discarded if not ended properly
        this.cacheEventByCorrelationId(inProgressEvent);
        this.cacheMeasurement(inProgressEvent, performanceMeasurement);
        // Return the event and functions the caller can use to properly end/flush the measurement
        return {
            endMeasurement: function (event) {
                var completedEvent = _this.endMeasurement(__assign(__assign({}, inProgressEvent), event));
                if (completedEvent) {
                    // Cache event so that submeasurements can be added downstream
                    _this.cacheEventByCorrelationId(completedEvent);
                }
                return completedEvent;
            },
            flushMeasurement: function () {
                return _this.flushMeasurements(inProgressEvent.name, inProgressEvent.correlationId);
            },
            discardMeasurement: function () {
                return _this.discardMeasurements(inProgressEvent.correlationId);
            },
            measurement: performanceMeasurement,
            event: inProgressEvent
        };
    };
    /**
     * Stops measuring the performance for an operation. Should only be called directly by PerformanceClient classes,
     * as consumers should instead use the function returned by startMeasurement.
     *
     * @param {PerformanceEvent} event
     * @returns {(PerformanceEvent | null)}
     */
    PerformanceClient.prototype.endMeasurement = function (event) {
        var performanceMeasurement = this.measurementsById.get(event.eventId);
        if (performanceMeasurement) {
            // Immediately delete so that the same event isnt ended twice
            this.measurementsById.delete(event.eventId);
            performanceMeasurement.endMeasurement();
            var durationMs = performanceMeasurement.flushMeasurement();
            // null indicates no measurement was taken (e.g. needed performance APIs not present)
            if (durationMs !== null) {
                this.logger.trace("PerformanceClient: Performance measurement ended for " + event.name + ": " + durationMs + " ms", event.correlationId);
                var completedEvent = __assign(__assign({ 
                    // Allow duration to be overwritten when event ends (e.g. testing), but not status
                    durationMs: Math.round(durationMs) }, event), { status: PerformanceEventStatus.Completed });
                return completedEvent;
            }
            else {
                this.logger.trace("PerformanceClient: Performance measurement not taken", event.correlationId);
            }
        }
        else {
            this.logger.trace("PerformanceClient: Measurement not found for " + event.eventId, event.correlationId);
        }
        return null;
    };
    /**
     * Upserts event into event cache.
     * First key is the correlation id, second key is the event id.
     * Allows for events to be grouped by correlation id,
     * and to easily allow for properties on them to be updated.
     *
     * @private
     * @param {PerformanceEvent} event
     */
    PerformanceClient.prototype.cacheEventByCorrelationId = function (event) {
        var existingEvents = this.eventsByCorrelationId.get(event.correlationId);
        if (existingEvents) {
            this.logger.trace("PerformanceClient: Performance measurement for " + event.name + " added/updated", event.correlationId);
            existingEvents.set(event.eventId, event);
        }
        else {
            this.logger.trace("PerformanceClient: Performance measurement for " + event.name + " started", event.correlationId);
            this.eventsByCorrelationId.set(event.correlationId, new Map().set(event.eventId, event));
        }
    };
    /**
     * Cache measurements by their id.
     *
     * @private
     * @param {PerformanceEvent} event
     * @param {IPerformanceMeasurement} measurement
     */
    PerformanceClient.prototype.cacheMeasurement = function (event, measurement) {
        this.measurementsById.set(event.eventId, measurement);
    };
    /**
     * Gathers and emits performance events for measurements taked for the given top-level API and correlation ID.
     *
     * @param {PerformanceEvents} measureName
     * @param {string} correlationId
     */
    PerformanceClient.prototype.flushMeasurements = function (measureName, correlationId) {
        var _this = this;
        this.logger.trace("PerformanceClient: Performance measurements flushed for " + measureName, correlationId);
        var eventsForCorrelationId = this.eventsByCorrelationId.get(correlationId);
        if (eventsForCorrelationId) {
            this.discardMeasurements(correlationId);
            /*
             * Manually end incomplete submeasurements to ensure there arent orphaned/never ending events.
             * Incomplete submeasurements are likely an instrumentation bug that should be fixed.
             * IE only supports Map.forEach.
             */
            var completedEvents_1 = [];
            eventsForCorrelationId.forEach(function (event) {
                if (event.name !== measureName && event.status !== PerformanceEventStatus.Completed) {
                    _this.logger.trace("PerformanceClient: Incomplete submeasurement " + event.name + " found for " + measureName, correlationId);
                    var completedEvent = _this.endMeasurement(event);
                    if (completedEvent) {
                        completedEvents_1.push(completedEvent);
                    }
                }
                completedEvents_1.push(event);
            });
            // Sort events by start time (earliest first)
            var sortedCompletedEvents = completedEvents_1.sort(function (eventA, eventB) { return eventA.startTimeMs - eventB.startTimeMs; });
            // Take completed top level event and add completed submeasurements durations as properties
            var topLevelEvents = sortedCompletedEvents.filter(function (event) { return event.name === measureName && event.status === PerformanceEventStatus.Completed; });
            if (topLevelEvents.length > 0) {
                /*
                 * Only take the first top-level event if there are multiple events with the same correlation id.
                 * This greatly simplifies logic for submeasurements.
                 */
                if (topLevelEvents.length > 1) {
                    this.logger.verbose("PerformanceClient: Multiple distinct top-level performance events found, using the first", correlationId);
                }
                var topLevelEvent = topLevelEvents[0];
                this.logger.verbose("PerformanceClient: Measurement found for " + measureName, correlationId);
                // Build event object with top level and sub measurements
                var eventToEmit = sortedCompletedEvents.reduce(function (previous, current) {
                    if (current.name !== measureName) {
                        _this.logger.trace("PerformanceClient: Complete submeasurement found for " + current.name, correlationId);
                        // TODO: Emit additional properties for each subMeasurement
                        var subMeasurementName = current.name + "DurationMs";
                        /*
                         * Some code paths, such as resolving an authority, can occur multiple times.
                         * Only take the first measurement, since the second could be read from the cache,
                         * or due to the same correlation id being used for two distinct requests.
                         */
                        if (!previous[subMeasurementName]) {
                            previous[subMeasurementName] = current.durationMs;
                        }
                        else {
                            _this.logger.verbose("PerformanceClient: Submeasurement for " + measureName + " already exists for " + current.name + ", ignoring", correlationId);
                        }
                        if (current.accessTokenSize) {
                            previous.accessTokenSize = current.accessTokenSize;
                        }
                        if (current.idTokenSize) {
                            previous.idTokenSize = current.idTokenSize;
                        }
                    }
                    return previous;
                }, topLevelEvent);
                this.emitEvents([eventToEmit], eventToEmit.correlationId);
            }
            else {
                this.logger.verbose("PerformanceClient: No completed top-level measurements found for " + measureName, correlationId);
            }
        }
        else {
            this.logger.verbose("PerformanceClient: No measurements found", correlationId);
        }
    };
    /**
     * Removes measurements for a given correlation id.
     *
     * @param {string} correlationId
     */
    PerformanceClient.prototype.discardMeasurements = function (correlationId) {
        this.logger.trace("PerformanceClient: Performance measurements discarded", correlationId);
        this.eventsByCorrelationId.delete(correlationId);
    };
    /**
     * Registers a callback function to receive performance events.
     *
     * @param {PerformanceCallbackFunction} callback
     * @returns {string}
     */
    PerformanceClient.prototype.addPerformanceCallback = function (callback) {
        var callbackId = this.generateId();
        this.callbacks.set(callbackId, callback);
        this.logger.verbose("PerformanceClient: Performance callback registered with id: " + callbackId);
        return callbackId;
    };
    /**
     * Removes a callback registered with addPerformanceCallback.
     *
     * @param {string} callbackId
     * @returns {boolean}
     */
    PerformanceClient.prototype.removePerformanceCallback = function (callbackId) {
        var result = this.callbacks.delete(callbackId);
        if (result) {
            this.logger.verbose("PerformanceClient: Performance callback " + callbackId + " removed.");
        }
        else {
            this.logger.verbose("PerformanceClient: Performance callback " + callbackId + " not removed.");
        }
        return result;
    };
    /**
     * Emits events to all registered callbacks.
     *
     * @param {PerformanceEvent[]} events
     * @param {?string} [correlationId]
     */
    PerformanceClient.prototype.emitEvents = function (events, correlationId) {
        var _this = this;
        this.logger.verbose("PerformanceClient: Emitting performance events", correlationId);
        this.callbacks.forEach(function (callback, callbackId) {
            _this.logger.trace("PerformanceClient: Emitting event to callback " + callbackId, correlationId);
            callback.apply(null, [events]);
        });
    };
    return PerformanceClient;
}());

/*! @azure/msal-common v7.3.0 2022-08-01 */

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var StubPerformanceMeasurement = /** @class */ (function () {
    function StubPerformanceMeasurement() {
    }
    /* eslint-disable-next-line @typescript-eslint/no-empty-function */
    StubPerformanceMeasurement.prototype.startMeasurement = function () { };
    /* eslint-disable-next-line @typescript-eslint/no-empty-function */
    StubPerformanceMeasurement.prototype.endMeasurement = function () { };
    StubPerformanceMeasurement.prototype.flushMeasurement = function () {
        return null;
    };
    return StubPerformanceMeasurement;
}());
var StubPerformanceClient = /** @class */ (function (_super) {
    __extends(StubPerformanceClient, _super);
    function StubPerformanceClient() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    StubPerformanceClient.prototype.generateId = function () {
        return "callback-id";
    };
    StubPerformanceClient.prototype.startPerformanceMeasuremeant = function () {
        return new StubPerformanceMeasurement();
    };
    return StubPerformanceClient;
}(PerformanceClient));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * BrowserAuthErrorMessage class containing string constants used by error codes and messages.
 */
var BrowserAuthErrorMessage = {
    pkceNotGenerated: {
        code: "pkce_not_created",
        desc: "The PKCE code challenge and verifier could not be generated."
    },
    cryptoDoesNotExist: {
        code: "crypto_nonexistent",
        desc: "The crypto object or function is not available."
    },
    httpMethodNotImplementedError: {
        code: "http_method_not_implemented",
        desc: "The HTTP method given has not been implemented in this library."
    },
    emptyNavigateUriError: {
        code: "empty_navigate_uri",
        desc: "Navigation URI is empty. Please check stack trace for more info."
    },
    hashEmptyError: {
        code: "hash_empty_error",
        desc: "Hash value cannot be processed because it is empty. Please verify that your redirectUri is not clearing the hash. For more visit: aka.ms/msaljs/browser-errors."
    },
    hashDoesNotContainStateError: {
        code: "no_state_in_hash",
        desc: "Hash does not contain state. Please verify that the request originated from msal."
    },
    hashDoesNotContainKnownPropertiesError: {
        code: "hash_does_not_contain_known_properties",
        desc: "Hash does not contain known properites. Please verify that your redirectUri is not changing the hash. For more visit: aka.ms/msaljs/browser-errors."
    },
    unableToParseStateError: {
        code: "unable_to_parse_state",
        desc: "Unable to parse state. Please verify that the request originated from msal."
    },
    stateInteractionTypeMismatchError: {
        code: "state_interaction_type_mismatch",
        desc: "Hash contains state but the interaction type does not match the caller."
    },
    interactionInProgress: {
        code: "interaction_in_progress",
        desc: "Interaction is currently in progress. Please ensure that this interaction has been completed before calling an interactive API.  For more visit: aka.ms/msaljs/browser-errors."
    },
    popupWindowError: {
        code: "popup_window_error",
        desc: "Error opening popup window. This can happen if you are using IE or if popups are blocked in the browser."
    },
    emptyWindowError: {
        code: "empty_window_error",
        desc: "window.open returned null or undefined window object."
    },
    userCancelledError: {
        code: "user_cancelled",
        desc: "User cancelled the flow."
    },
    monitorPopupTimeoutError: {
        code: "monitor_window_timeout",
        desc: "Token acquisition in popup failed due to timeout. For more visit: aka.ms/msaljs/browser-errors."
    },
    monitorIframeTimeoutError: {
        code: "monitor_window_timeout",
        desc: "Token acquisition in iframe failed due to timeout. For more visit: aka.ms/msaljs/browser-errors."
    },
    redirectInIframeError: {
        code: "redirect_in_iframe",
        desc: "Redirects are not supported for iframed or brokered applications. Please ensure you are using MSAL.js in a top frame of the window if using the redirect APIs, or use the popup APIs."
    },
    blockTokenRequestsInHiddenIframeError: {
        code: "block_iframe_reload",
        desc: "Request was blocked inside an iframe because MSAL detected an authentication response. For more visit: aka.ms/msaljs/browser-errors"
    },
    blockAcquireTokenInPopupsError: {
        code: "block_nested_popups",
        desc: "Request was blocked inside a popup because MSAL detected it was running in a popup."
    },
    iframeClosedPrematurelyError: {
        code: "iframe_closed_prematurely",
        desc: "The iframe being monitored was closed prematurely."
    },
    silentLogoutUnsupportedError: {
        code: "silent_logout_unsupported",
        desc: "Silent logout not supported. Please call logoutRedirect or logoutPopup instead."
    },
    noAccountError: {
        code: "no_account_error",
        desc: "No account object provided to acquireTokenSilent and no active account has been set. Please call setActiveAccount or provide an account on the request."
    },
    silentPromptValueError: {
        code: "silent_prompt_value_error",
        desc: "The value given for the prompt value is not valid for silent requests - must be set to 'none'."
    },
    noTokenRequestCacheError: {
        code: "no_token_request_cache_error",
        desc: "No token request found in cache."
    },
    unableToParseTokenRequestCacheError: {
        code: "unable_to_parse_token_request_cache_error",
        desc: "The cached token request could not be parsed."
    },
    noCachedAuthorityError: {
        code: "no_cached_authority_error",
        desc: "No cached authority found."
    },
    authRequestNotSet: {
        code: "auth_request_not_set_error",
        desc: "Auth Request not set. Please ensure initiateAuthRequest was called from the InteractionHandler"
    },
    invalidCacheType: {
        code: "invalid_cache_type",
        desc: "Invalid cache type"
    },
    notInBrowserEnvironment: {
        code: "non_browser_environment",
        desc: "Login and token requests are not supported in non-browser environments."
    },
    databaseNotOpen: {
        code: "database_not_open",
        desc: "Database is not open!"
    },
    noNetworkConnectivity: {
        code: "no_network_connectivity",
        desc: "No network connectivity. Check your internet connection."
    },
    postRequestFailed: {
        code: "post_request_failed",
        desc: "Network request failed: If the browser threw a CORS error, check that the redirectUri is registered in the Azure App Portal as type 'SPA'"
    },
    getRequestFailed: {
        code: "get_request_failed",
        desc: "Network request failed. Please check the network trace to determine root cause."
    },
    failedToParseNetworkResponse: {
        code: "failed_to_parse_response",
        desc: "Failed to parse network response. Check network trace."
    },
    unableToLoadTokenError: {
        code: "unable_to_load_token",
        desc: "Error loading token to cache."
    },
    signingKeyNotFoundInStorage: {
        code: "crypto_key_not_found",
        desc: "Cryptographic Key or Keypair not found in browser storage."
    },
    authCodeRequired: {
        code: "auth_code_required",
        desc: "An authorization code must be provided (as the `code` property on the request) to this flow."
    },
    authCodeOrNativeAccountRequired: {
        code: "auth_code_or_nativeAccountId_required",
        desc: "An authorization code or nativeAccountId must be provided to this flow."
    },
    databaseUnavailable: {
        code: "database_unavailable",
        desc: "IndexedDB, which is required for persistent cryptographic key storage, is unavailable. This may be caused by browser privacy features which block persistent storage in third-party contexts."
    },
    unableToAcquireTokenFromNativePlatform: {
        code: "unable_to_acquire_token_from_native_platform",
        desc: "Unable to acquire token from native platform. For a list of possible reasons visit aka.ms/msaljs/browser-errors."
    },
    nativeHandshakeTimeout: {
        code: "native_handshake_timeout",
        desc: "Timed out while attempting to establish connection to browser extension"
    },
    nativeExtensionNotInstalled: {
        code: "native_extension_not_installed",
        desc: "Native extension is not installed. If you think this is a mistake call the initialize function."
    },
    nativeConnectionNotEstablished: {
        code: "native_connection_not_established",
        desc: "Connection to native platform has not been established. Please install a compatible browser extension and run initialize(). For more please visit aka.ms/msaljs/browser-errors."
    },
    nativeBrokerCalledBeforeInitialize: {
        code: "native_broker_called_before_initialize",
        desc: "You must call and await the initialize function before attempting to call any other MSAL API when native brokering is enabled. For more please visit aka.ms/msaljs/browser-errors."
    },
    nativePromptNotSupported: {
        code: "native_prompt_not_supported",
        desc: "The provided prompt is not supported by the native platform. This request should be routed to the web based flow."
    }
};
/**
 * Browser library error class thrown by the MSAL.js library for SPAs
 */
var BrowserAuthError = /** @class */ (function (_super) {
    __extends$1(BrowserAuthError, _super);
    function BrowserAuthError(errorCode, errorMessage) {
        var _this = _super.call(this, errorCode, errorMessage) || this;
        Object.setPrototypeOf(_this, BrowserAuthError.prototype);
        _this.name = "BrowserAuthError";
        return _this;
    }
    /**
     * Creates an error thrown when PKCE is not implemented.
     * @param errDetail
     */
    BrowserAuthError.createPkceNotGeneratedError = function (errDetail) {
        return new BrowserAuthError(BrowserAuthErrorMessage.pkceNotGenerated.code, BrowserAuthErrorMessage.pkceNotGenerated.desc + " Detail:" + errDetail);
    };
    /**
     * Creates an error thrown when the crypto object is unavailable.
     * @param errDetail
     */
    BrowserAuthError.createCryptoNotAvailableError = function (errDetail) {
        return new BrowserAuthError(BrowserAuthErrorMessage.cryptoDoesNotExist.code, BrowserAuthErrorMessage.cryptoDoesNotExist.desc + " Detail:" + errDetail);
    };
    /**
     * Creates an error thrown when an HTTP method hasn't been implemented by the browser class.
     * @param method
     */
    BrowserAuthError.createHttpMethodNotImplementedError = function (method) {
        return new BrowserAuthError(BrowserAuthErrorMessage.httpMethodNotImplementedError.code, BrowserAuthErrorMessage.httpMethodNotImplementedError.desc + " Given Method: " + method);
    };
    /**
     * Creates an error thrown when the navigation URI is empty.
     */
    BrowserAuthError.createEmptyNavigationUriError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.emptyNavigateUriError.code, BrowserAuthErrorMessage.emptyNavigateUriError.desc);
    };
    /**
     * Creates an error thrown when the hash string value is unexpectedly empty.
     * @param hashValue
     */
    BrowserAuthError.createEmptyHashError = function (hashValue) {
        return new BrowserAuthError(BrowserAuthErrorMessage.hashEmptyError.code, BrowserAuthErrorMessage.hashEmptyError.desc + " Given Url: " + hashValue);
    };
    /**
     * Creates an error thrown when the hash string value is unexpectedly empty.
     */
    BrowserAuthError.createHashDoesNotContainStateError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.hashDoesNotContainStateError.code, BrowserAuthErrorMessage.hashDoesNotContainStateError.desc);
    };
    /**
     * Creates an error thrown when the hash string value does not contain known properties
     */
    BrowserAuthError.createHashDoesNotContainKnownPropertiesError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.hashDoesNotContainKnownPropertiesError.code, BrowserAuthErrorMessage.hashDoesNotContainKnownPropertiesError.desc);
    };
    /**
     * Creates an error thrown when the hash string value is unexpectedly empty.
     */
    BrowserAuthError.createUnableToParseStateError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.unableToParseStateError.code, BrowserAuthErrorMessage.unableToParseStateError.desc);
    };
    /**
     * Creates an error thrown when the state value in the hash does not match the interaction type of the API attempting to consume it.
     */
    BrowserAuthError.createStateInteractionTypeMismatchError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.stateInteractionTypeMismatchError.code, BrowserAuthErrorMessage.stateInteractionTypeMismatchError.desc);
    };
    /**
     * Creates an error thrown when a browser interaction (redirect or popup) is in progress.
     */
    BrowserAuthError.createInteractionInProgressError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.interactionInProgress.code, BrowserAuthErrorMessage.interactionInProgress.desc);
    };
    /**
     * Creates an error thrown when the popup window could not be opened.
     * @param errDetail
     */
    BrowserAuthError.createPopupWindowError = function (errDetail) {
        var errorMessage = BrowserAuthErrorMessage.popupWindowError.desc;
        errorMessage = !StringUtils.isEmpty(errDetail) ? errorMessage + " Details: " + errDetail : errorMessage;
        return new BrowserAuthError(BrowserAuthErrorMessage.popupWindowError.code, errorMessage);
    };
    /**
     * Creates an error thrown when window.open returns an empty window object.
     * @param errDetail
     */
    BrowserAuthError.createEmptyWindowCreatedError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.emptyWindowError.code, BrowserAuthErrorMessage.emptyWindowError.desc);
    };
    /**
     * Creates an error thrown when the user closes a popup.
     */
    BrowserAuthError.createUserCancelledError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.userCancelledError.code, BrowserAuthErrorMessage.userCancelledError.desc);
    };
    /**
     * Creates an error thrown when monitorPopupFromHash times out for a given popup.
     */
    BrowserAuthError.createMonitorPopupTimeoutError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.monitorPopupTimeoutError.code, BrowserAuthErrorMessage.monitorPopupTimeoutError.desc);
    };
    /**
     * Creates an error thrown when monitorIframeFromHash times out for a given iframe.
     */
    BrowserAuthError.createMonitorIframeTimeoutError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.monitorIframeTimeoutError.code, BrowserAuthErrorMessage.monitorIframeTimeoutError.desc);
    };
    /**
     * Creates an error thrown when navigateWindow is called inside an iframe or brokered applications.
     * @param windowParentCheck
     */
    BrowserAuthError.createRedirectInIframeError = function (windowParentCheck) {
        return new BrowserAuthError(BrowserAuthErrorMessage.redirectInIframeError.code, BrowserAuthErrorMessage.redirectInIframeError.desc + " (window.parent !== window) => " + windowParentCheck);
    };
    /**
     * Creates an error thrown when an auth reload is done inside an iframe.
     */
    BrowserAuthError.createBlockReloadInHiddenIframeError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.blockTokenRequestsInHiddenIframeError.code, BrowserAuthErrorMessage.blockTokenRequestsInHiddenIframeError.desc);
    };
    /**
     * Creates an error thrown when a popup attempts to call an acquireToken API
     * @returns
     */
    BrowserAuthError.createBlockAcquireTokenInPopupsError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.blockAcquireTokenInPopupsError.code, BrowserAuthErrorMessage.blockAcquireTokenInPopupsError.desc);
    };
    /**
     * Creates an error thrown when an iframe is found to be closed before the timeout is reached.
     */
    BrowserAuthError.createIframeClosedPrematurelyError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.iframeClosedPrematurelyError.code, BrowserAuthErrorMessage.iframeClosedPrematurelyError.desc);
    };
    /**
     * Creates an error thrown when the logout API is called on any of the silent interaction clients
     */
    BrowserAuthError.createSilentLogoutUnsupportedError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.silentLogoutUnsupportedError.code, BrowserAuthErrorMessage.silentLogoutUnsupportedError.desc);
    };
    /**
     * Creates an error thrown when the account object is not provided in the acquireTokenSilent API.
     */
    BrowserAuthError.createNoAccountError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.noAccountError.code, BrowserAuthErrorMessage.noAccountError.desc);
    };
    /**
     * Creates an error thrown when a given prompt value is invalid for silent requests.
     */
    BrowserAuthError.createSilentPromptValueError = function (givenPrompt) {
        return new BrowserAuthError(BrowserAuthErrorMessage.silentPromptValueError.code, BrowserAuthErrorMessage.silentPromptValueError.desc + " Given value: " + givenPrompt);
    };
    /**
     * Creates an error thrown when the cached token request could not be retrieved from the cache
     */
    BrowserAuthError.createUnableToParseTokenRequestCacheError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.unableToParseTokenRequestCacheError.code, BrowserAuthErrorMessage.unableToParseTokenRequestCacheError.desc);
    };
    /**
     * Creates an error thrown when the token request could not be retrieved from the cache
     */
    BrowserAuthError.createNoTokenRequestCacheError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.noTokenRequestCacheError.code, BrowserAuthErrorMessage.noTokenRequestCacheError.desc);
    };
    /**
     * Creates an error thrown when handleCodeResponse is called before initiateAuthRequest (InteractionHandler)
     */
    BrowserAuthError.createAuthRequestNotSetError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.authRequestNotSet.code, BrowserAuthErrorMessage.authRequestNotSet.desc);
    };
    /**
     * Creates an error thrown when the authority could not be retrieved from the cache
     */
    BrowserAuthError.createNoCachedAuthorityError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.noCachedAuthorityError.code, BrowserAuthErrorMessage.noCachedAuthorityError.desc);
    };
    /**
     * Creates an error thrown if cache type is invalid.
     */
    BrowserAuthError.createInvalidCacheTypeError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.invalidCacheType.code, "" + BrowserAuthErrorMessage.invalidCacheType.desc);
    };
    /**
     * Create an error thrown when login and token requests are made from a non-browser environment
     */
    BrowserAuthError.createNonBrowserEnvironmentError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.notInBrowserEnvironment.code, BrowserAuthErrorMessage.notInBrowserEnvironment.desc);
    };
    /**
     * Create an error thrown when indexDB database is not open
     */
    BrowserAuthError.createDatabaseNotOpenError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.databaseNotOpen.code, BrowserAuthErrorMessage.databaseNotOpen.desc);
    };
    /**
     * Create an error thrown when token fetch fails due to no internet
     */
    BrowserAuthError.createNoNetworkConnectivityError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.noNetworkConnectivity.code, BrowserAuthErrorMessage.noNetworkConnectivity.desc);
    };
    /**
     * Create an error thrown when token fetch fails due to reasons other than internet connectivity
     */
    BrowserAuthError.createPostRequestFailedError = function (errorDesc, endpoint) {
        return new BrowserAuthError(BrowserAuthErrorMessage.postRequestFailed.code, BrowserAuthErrorMessage.postRequestFailed.desc + " | Network client threw: " + errorDesc + " | Attempted to reach: " + endpoint.split("?")[0]);
    };
    /**
     * Create an error thrown when get request fails due to reasons other than internet connectivity
     */
    BrowserAuthError.createGetRequestFailedError = function (errorDesc, endpoint) {
        return new BrowserAuthError(BrowserAuthErrorMessage.getRequestFailed.code, BrowserAuthErrorMessage.getRequestFailed.desc + " | Network client threw: " + errorDesc + " | Attempted to reach: " + endpoint.split("?")[0]);
    };
    /**
     * Create an error thrown when network client fails to parse network response
     */
    BrowserAuthError.createFailedToParseNetworkResponseError = function (endpoint) {
        return new BrowserAuthError(BrowserAuthErrorMessage.failedToParseNetworkResponse.code, BrowserAuthErrorMessage.failedToParseNetworkResponse.desc + " | Attempted to reach: " + endpoint.split("?")[0]);
    };
    /**
     * Create an error thrown when the necessary information is not available to sideload tokens
     */
    BrowserAuthError.createUnableToLoadTokenError = function (errorDetail) {
        return new BrowserAuthError(BrowserAuthErrorMessage.unableToLoadTokenError.code, BrowserAuthErrorMessage.unableToLoadTokenError.desc + " | " + errorDetail);
    };
    /**
     * Create an error thrown when the queried cryptographic key is not found in IndexedDB
     */
    BrowserAuthError.createSigningKeyNotFoundInStorageError = function (keyId) {
        return new BrowserAuthError(BrowserAuthErrorMessage.signingKeyNotFoundInStorage.code, BrowserAuthErrorMessage.signingKeyNotFoundInStorage.desc + " | No match found for KeyId: " + keyId);
    };
    /**
     * Create an error when an authorization code is required but not provided
     */
    BrowserAuthError.createAuthCodeRequiredError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.authCodeRequired.code, BrowserAuthErrorMessage.authCodeRequired.desc);
    };
    /**
     * Create an error when an authorization code or native account ID is required but not provided
     */
    BrowserAuthError.createAuthCodeOrNativeAccountIdRequiredError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.authCodeOrNativeAccountRequired.code, BrowserAuthErrorMessage.authCodeOrNativeAccountRequired.desc);
    };
    /**
     * Create an error when IndexedDB is unavailable
     */
    BrowserAuthError.createDatabaseUnavailableError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.databaseUnavailable.code, BrowserAuthErrorMessage.databaseUnavailable.desc);
    };
    /**
     * Create an error when native token acquisition is not possible
     */
    BrowserAuthError.createUnableToAcquireTokenFromNativePlatformError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.unableToAcquireTokenFromNativePlatform.code, BrowserAuthErrorMessage.unableToAcquireTokenFromNativePlatform.desc);
    };
    /**
     * Create an error thrown when Handshake with browser extension times out
     */
    BrowserAuthError.createNativeHandshakeTimeoutError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.nativeHandshakeTimeout.code, BrowserAuthErrorMessage.nativeHandshakeTimeout.desc);
    };
    /**
     * Create an error thrown when browser extension is not installed
     */
    BrowserAuthError.createNativeExtensionNotInstalledError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.nativeExtensionNotInstalled.code, BrowserAuthErrorMessage.nativeExtensionNotInstalled.desc);
    };
    /**
     * Create an error when native connection has not been established
     * @returns
     */
    BrowserAuthError.createNativeConnectionNotEstablishedError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.nativeConnectionNotEstablished.code, BrowserAuthErrorMessage.nativeConnectionNotEstablished.desc);
    };
    /**
     * Create an error thrown when the initialize function hasn't been called
     */
    BrowserAuthError.createNativeBrokerCalledBeforeInitialize = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.nativeBrokerCalledBeforeInitialize.code, BrowserAuthErrorMessage.nativeBrokerCalledBeforeInitialize.desc);
    };
    /**
     * Create an error thrown when requesting a token directly from the native platform with an unsupported prompt parameter e.g. select_account, login or create
     * These requests must go through eSTS to ensure eSTS is aware of the new account
     */
    BrowserAuthError.createNativePromptParameterNotSupportedError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.nativePromptNotSupported.code, BrowserAuthErrorMessage.nativePromptNotSupported.desc);
    };
    return BrowserAuthError;
}(AuthError));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Constants
 */
var BrowserConstants = {
    /**
     * Interaction in progress cache value
     */
    INTERACTION_IN_PROGRESS_VALUE: "interaction_in_progress",
    /**
     * Invalid grant error code
     */
    INVALID_GRANT_ERROR: "invalid_grant",
    /**
     * Default popup window width
     */
    POPUP_WIDTH: 483,
    /**
     * Default popup window height
     */
    POPUP_HEIGHT: 600,
    /**
     * Name of the popup window starts with
     */
    POPUP_NAME_PREFIX: "msal",
    /**
     * Default popup monitor poll interval in milliseconds
     */
    POLL_INTERVAL_MS: 50,
    /**
     * Msal-browser SKU
     */
    MSAL_SKU: "msal.js.browser",
};
var NativeConstants = {
    CHANNEL_ID: "53ee284d-920a-4b59-9d30-a60315b26836",
    PREFERRED_EXTENSION_ID: "ppnbnpeolgkicgegkbkbjmhlideopiji",
    MATS_TELEMETRY: "MATS"
};
var NativeExtensionMethod;
(function (NativeExtensionMethod) {
    NativeExtensionMethod["HandshakeRequest"] = "Handshake";
    NativeExtensionMethod["HandshakeResponse"] = "HandshakeResponse";
    NativeExtensionMethod["GetToken"] = "GetToken";
    NativeExtensionMethod["Response"] = "Response";
})(NativeExtensionMethod || (NativeExtensionMethod = {}));
exports.BrowserCacheLocation = void 0;
(function (BrowserCacheLocation) {
    BrowserCacheLocation["LocalStorage"] = "localStorage";
    BrowserCacheLocation["SessionStorage"] = "sessionStorage";
    BrowserCacheLocation["MemoryStorage"] = "memoryStorage";
})(exports.BrowserCacheLocation || (exports.BrowserCacheLocation = {}));
/**
 * HTTP Request types supported by MSAL.
 */
var HTTP_REQUEST_TYPE;
(function (HTTP_REQUEST_TYPE) {
    HTTP_REQUEST_TYPE["GET"] = "GET";
    HTTP_REQUEST_TYPE["POST"] = "POST";
})(HTTP_REQUEST_TYPE || (HTTP_REQUEST_TYPE = {}));
/**
 * Temporary cache keys for MSAL, deleted after any request.
 */
var TemporaryCacheKeys;
(function (TemporaryCacheKeys) {
    TemporaryCacheKeys["AUTHORITY"] = "authority";
    TemporaryCacheKeys["ACQUIRE_TOKEN_ACCOUNT"] = "acquireToken.account";
    TemporaryCacheKeys["SESSION_STATE"] = "session.state";
    TemporaryCacheKeys["REQUEST_STATE"] = "request.state";
    TemporaryCacheKeys["NONCE_IDTOKEN"] = "nonce.id_token";
    TemporaryCacheKeys["ORIGIN_URI"] = "request.origin";
    TemporaryCacheKeys["RENEW_STATUS"] = "token.renew.status";
    TemporaryCacheKeys["URL_HASH"] = "urlHash";
    TemporaryCacheKeys["REQUEST_PARAMS"] = "request.params";
    TemporaryCacheKeys["SCOPES"] = "scopes";
    TemporaryCacheKeys["INTERACTION_STATUS_KEY"] = "interaction.status";
    TemporaryCacheKeys["CCS_CREDENTIAL"] = "ccs.credential";
    TemporaryCacheKeys["CORRELATION_ID"] = "request.correlationId";
    TemporaryCacheKeys["NATIVE_REQUEST"] = "request.native";
})(TemporaryCacheKeys || (TemporaryCacheKeys = {}));
/**
 * Cache keys stored in-memory
 */
var InMemoryCacheKeys;
(function (InMemoryCacheKeys) {
    InMemoryCacheKeys["WRAPPER_SKU"] = "wrapper.sku";
    InMemoryCacheKeys["WRAPPER_VER"] = "wrapper.version";
})(InMemoryCacheKeys || (InMemoryCacheKeys = {}));
/**
 * API Codes for Telemetry purposes.
 * Before adding a new code you must claim it in the MSAL Telemetry tracker as these number spaces are shared across all MSALs
 * 0-99 Silent Flow
 * 800-899 Auth Code Flow
 */
exports.ApiId = void 0;
(function (ApiId) {
    ApiId[ApiId["acquireTokenRedirect"] = 861] = "acquireTokenRedirect";
    ApiId[ApiId["acquireTokenPopup"] = 862] = "acquireTokenPopup";
    ApiId[ApiId["ssoSilent"] = 863] = "ssoSilent";
    ApiId[ApiId["acquireTokenSilent_authCode"] = 864] = "acquireTokenSilent_authCode";
    ApiId[ApiId["handleRedirectPromise"] = 865] = "handleRedirectPromise";
    ApiId[ApiId["acquireTokenByCode"] = 866] = "acquireTokenByCode";
    ApiId[ApiId["acquireTokenSilent_silentFlow"] = 61] = "acquireTokenSilent_silentFlow";
    ApiId[ApiId["logout"] = 961] = "logout";
    ApiId[ApiId["logoutPopup"] = 962] = "logoutPopup";
})(exports.ApiId || (exports.ApiId = {}));
/*
 * Interaction type of the API - used for state and telemetry
 */
exports.InteractionType = void 0;
(function (InteractionType) {
    InteractionType["Redirect"] = "redirect";
    InteractionType["Popup"] = "popup";
    InteractionType["Silent"] = "silent";
    InteractionType["None"] = "none";
})(exports.InteractionType || (exports.InteractionType = {}));
/**
 * Types of interaction currently in progress.
 * Used in events in wrapper libraries to invoke functions when certain interaction is in progress or all interactions are complete.
 */
exports.InteractionStatus = void 0;
(function (InteractionStatus) {
    /**
     * Initial status before interaction occurs
     */
    InteractionStatus["Startup"] = "startup";
    /**
     * Status set when all login calls occuring
     */
    InteractionStatus["Login"] = "login";
    /**
     * Status set when logout call occuring
     */
    InteractionStatus["Logout"] = "logout";
    /**
     * Status set for acquireToken calls
     */
    InteractionStatus["AcquireToken"] = "acquireToken";
    /**
     * Status set for ssoSilent calls
     */
    InteractionStatus["SsoSilent"] = "ssoSilent";
    /**
     * Status set when handleRedirect in progress
     */
    InteractionStatus["HandleRedirect"] = "handleRedirect";
    /**
     * Status set when interaction is complete
     */
    InteractionStatus["None"] = "none";
})(exports.InteractionStatus || (exports.InteractionStatus = {}));
var DEFAULT_REQUEST = {
    scopes: OIDC_DEFAULT_SCOPES
};
/**
 * JWK Key Format string (Type MUST be defined for window crypto APIs)
 */
var KEY_FORMAT_JWK = "jwk";
// Supported wrapper SKUs
exports.WrapperSKU = void 0;
(function (WrapperSKU) {
    WrapperSKU["React"] = "@azure/msal-react";
    WrapperSKU["Angular"] = "@azure/msal-angular";
})(exports.WrapperSKU || (exports.WrapperSKU = {}));
// DatabaseStorage Constants
var DB_NAME = "msal.db";
var DB_VERSION = 1;
var DB_TABLE_NAME = DB_NAME + ".keys";

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * BrowserAuthErrorMessage class containing string constants used by error codes and messages.
 */
var BrowserConfigurationAuthErrorMessage = {
    redirectUriNotSet: {
        code: "redirect_uri_empty",
        desc: "A redirect URI is required for all calls, and none has been set."
    },
    postLogoutUriNotSet: {
        code: "post_logout_uri_empty",
        desc: "A post logout redirect has not been set."
    },
    storageNotSupportedError: {
        code: "storage_not_supported",
        desc: "Given storage configuration option was not supported."
    },
    noRedirectCallbacksSet: {
        code: "no_redirect_callbacks",
        desc: "No redirect callbacks have been set. Please call setRedirectCallbacks() with the appropriate function arguments before continuing. " +
            "More information is available here: https://github.com/AzureAD/microsoft-authentication-library-for-js/wiki/MSAL-basics."
    },
    invalidCallbackObject: {
        code: "invalid_callback_object",
        desc: "The object passed for the callback was invalid. " +
            "More information is available here: https://github.com/AzureAD/microsoft-authentication-library-for-js/wiki/MSAL-basics."
    },
    stubPcaInstanceCalled: {
        code: "stubbed_public_client_application_called",
        desc: "Stub instance of Public Client Application was called. If using msal-react, please ensure context is not used without a provider. For more visit: aka.ms/msaljs/browser-errors"
    },
    inMemRedirectUnavailable: {
        code: "in_mem_redirect_unavailable",
        desc: "Redirect cannot be supported. In-memory storage was selected and storeAuthStateInCookie=false, which would cause the library to be unable to handle the incoming hash. If you would like to use the redirect API, please use session/localStorage or set storeAuthStateInCookie=true."
    }
};
/**
 * Browser library error class thrown by the MSAL.js library for SPAs
 */
var BrowserConfigurationAuthError = /** @class */ (function (_super) {
    __extends$1(BrowserConfigurationAuthError, _super);
    function BrowserConfigurationAuthError(errorCode, errorMessage) {
        var _this = _super.call(this, errorCode, errorMessage) || this;
        _this.name = "BrowserConfigurationAuthError";
        Object.setPrototypeOf(_this, BrowserConfigurationAuthError.prototype);
        return _this;
    }
    /**
     * Creates an error thrown when the redirect uri is empty (not set by caller)
     */
    BrowserConfigurationAuthError.createRedirectUriEmptyError = function () {
        return new BrowserConfigurationAuthError(BrowserConfigurationAuthErrorMessage.redirectUriNotSet.code, BrowserConfigurationAuthErrorMessage.redirectUriNotSet.desc);
    };
    /**
     * Creates an error thrown when the post-logout redirect uri is empty (not set by caller)
     */
    BrowserConfigurationAuthError.createPostLogoutRedirectUriEmptyError = function () {
        return new BrowserConfigurationAuthError(BrowserConfigurationAuthErrorMessage.postLogoutUriNotSet.code, BrowserConfigurationAuthErrorMessage.postLogoutUriNotSet.desc);
    };
    /**
     * Creates error thrown when given storage location is not supported.
     * @param givenStorageLocation
     */
    BrowserConfigurationAuthError.createStorageNotSupportedError = function (givenStorageLocation) {
        return new BrowserConfigurationAuthError(BrowserConfigurationAuthErrorMessage.storageNotSupportedError.code, BrowserConfigurationAuthErrorMessage.storageNotSupportedError.desc + " Given Location: " + givenStorageLocation);
    };
    /**
     * Creates error thrown when redirect callbacks are not set before calling loginRedirect() or acquireTokenRedirect().
     */
    BrowserConfigurationAuthError.createRedirectCallbacksNotSetError = function () {
        return new BrowserConfigurationAuthError(BrowserConfigurationAuthErrorMessage.noRedirectCallbacksSet.code, BrowserConfigurationAuthErrorMessage.noRedirectCallbacksSet.desc);
    };
    /**
     * Creates error thrown when the stub instance of PublicClientApplication is called.
     */
    BrowserConfigurationAuthError.createStubPcaInstanceCalledError = function () {
        return new BrowserConfigurationAuthError(BrowserConfigurationAuthErrorMessage.stubPcaInstanceCalled.code, BrowserConfigurationAuthErrorMessage.stubPcaInstanceCalled.desc);
    };
    /*
     * Create an error thrown when in-memory storage is used and storeAuthStateInCookie=false.
     */
    BrowserConfigurationAuthError.createInMemoryRedirectUnavailableError = function () {
        return new BrowserConfigurationAuthError(BrowserConfigurationAuthErrorMessage.inMemRedirectUnavailable.code, BrowserConfigurationAuthErrorMessage.inMemRedirectUnavailable.desc);
    };
    return BrowserConfigurationAuthError;
}(AuthError));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var BrowserStorage = /** @class */ (function () {
    function BrowserStorage(cacheLocation) {
        this.validateWindowStorage(cacheLocation);
        this.windowStorage = window[cacheLocation];
    }
    BrowserStorage.prototype.validateWindowStorage = function (cacheLocation) {
        if (cacheLocation !== exports.BrowserCacheLocation.LocalStorage && cacheLocation !== exports.BrowserCacheLocation.SessionStorage) {
            throw BrowserConfigurationAuthError.createStorageNotSupportedError(cacheLocation);
        }
        var storageSupported = !!window[cacheLocation];
        if (!storageSupported) {
            throw BrowserConfigurationAuthError.createStorageNotSupportedError(cacheLocation);
        }
    };
    BrowserStorage.prototype.getItem = function (key) {
        return this.windowStorage.getItem(key);
    };
    BrowserStorage.prototype.setItem = function (key, value) {
        this.windowStorage.setItem(key, value);
    };
    BrowserStorage.prototype.removeItem = function (key) {
        this.windowStorage.removeItem(key);
    };
    BrowserStorage.prototype.getKeys = function () {
        return Object.keys(this.windowStorage);
    };
    BrowserStorage.prototype.containsKey = function (key) {
        return this.windowStorage.hasOwnProperty(key);
    };
    return BrowserStorage;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var MemoryStorage = /** @class */ (function () {
    function MemoryStorage() {
        this.cache = new Map();
    }
    MemoryStorage.prototype.getItem = function (key) {
        return this.cache.get(key) || null;
    };
    MemoryStorage.prototype.setItem = function (key, value) {
        this.cache.set(key, value);
    };
    MemoryStorage.prototype.removeItem = function (key) {
        this.cache.delete(key);
    };
    MemoryStorage.prototype.getKeys = function () {
        var cacheKeys = [];
        this.cache.forEach(function (value, key) {
            cacheKeys.push(key);
        });
        return cacheKeys;
    };
    MemoryStorage.prototype.containsKey = function (key) {
        return this.cache.has(key);
    };
    MemoryStorage.prototype.clear = function () {
        this.cache.clear();
    };
    return MemoryStorage;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var BrowserProtocolUtils = /** @class */ (function () {
    function BrowserProtocolUtils() {
    }
    /**
     * Extracts the BrowserStateObject from the state string.
     * @param browserCrypto
     * @param state
     */
    BrowserProtocolUtils.extractBrowserRequestState = function (browserCrypto, state) {
        if (StringUtils.isEmpty(state)) {
            return null;
        }
        try {
            var requestStateObj = ProtocolUtils.parseRequestState(browserCrypto, state);
            return requestStateObj.libraryState.meta;
        }
        catch (e) {
            throw ClientAuthError.createInvalidStateError(state, e);
        }
    };
    /**
     * Parses properties of server response from url hash
     * @param locationHash Hash from url
     */
    BrowserProtocolUtils.parseServerResponseFromHash = function (locationHash) {
        if (!locationHash) {
            return {};
        }
        var hashUrlString = new UrlString(locationHash);
        return UrlString.getDeserializedHash(hashUrlString.getHash());
    };
    return BrowserProtocolUtils;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * This class implements the cache storage interface for MSAL through browser local or session storage.
 * Cookies are only used if storeAuthStateInCookie is true, and are only used for
 * parameters such as state and nonce, generally.
 */
var BrowserCacheManager = /** @class */ (function (_super) {
    __extends$1(BrowserCacheManager, _super);
    function BrowserCacheManager(clientId, cacheConfig, cryptoImpl, logger) {
        var _this = _super.call(this, clientId, cryptoImpl) || this;
        // Cookie life calculation (hours * minutes * seconds * ms)
        _this.COOKIE_LIFE_MULTIPLIER = 24 * 60 * 60 * 1000;
        _this.cacheConfig = cacheConfig;
        _this.logger = logger;
        _this.internalStorage = new MemoryStorage();
        _this.browserStorage = _this.setupBrowserStorage(_this.cacheConfig.cacheLocation);
        _this.temporaryCacheStorage = _this.setupTemporaryCacheStorage(_this.cacheConfig.cacheLocation);
        // Migrate any cache entries from older versions of MSAL.
        _this.migrateCacheEntries();
        return _this;
    }
    /**
     * Returns a window storage class implementing the IWindowStorage interface that corresponds to the configured cacheLocation.
     * @param cacheLocation
     */
    BrowserCacheManager.prototype.setupBrowserStorage = function (cacheLocation) {
        switch (cacheLocation) {
            case exports.BrowserCacheLocation.LocalStorage:
            case exports.BrowserCacheLocation.SessionStorage:
                try {
                    // Temporary cache items will always be stored in session storage to mitigate problems caused by multiple tabs
                    return new BrowserStorage(cacheLocation);
                }
                catch (e) {
                    this.logger.verbose(e);
                    break;
                }
            case exports.BrowserCacheLocation.MemoryStorage:
        }
        this.cacheConfig.cacheLocation = exports.BrowserCacheLocation.MemoryStorage;
        return new MemoryStorage();
    };
    /**
     *
     * @param cacheLocation
     */
    BrowserCacheManager.prototype.setupTemporaryCacheStorage = function (cacheLocation) {
        switch (cacheLocation) {
            case exports.BrowserCacheLocation.LocalStorage:
            case exports.BrowserCacheLocation.SessionStorage:
                try {
                    // Temporary cache items will always be stored in session storage to mitigate problems caused by multiple tabs
                    return new BrowserStorage(exports.BrowserCacheLocation.SessionStorage);
                }
                catch (e) {
                    this.logger.verbose(e);
                    return this.internalStorage;
                }
            case exports.BrowserCacheLocation.MemoryStorage:
            default:
                return this.internalStorage;
        }
    };
    /**
     * Migrate all old cache entries to new schema. No rollback supported.
     * @param storeAuthStateInCookie
     */
    BrowserCacheManager.prototype.migrateCacheEntries = function () {
        var _this = this;
        var idTokenKey = Constants.CACHE_PREFIX + "." + PersistentCacheKeys.ID_TOKEN;
        var clientInfoKey = Constants.CACHE_PREFIX + "." + PersistentCacheKeys.CLIENT_INFO;
        var errorKey = Constants.CACHE_PREFIX + "." + PersistentCacheKeys.ERROR;
        var errorDescKey = Constants.CACHE_PREFIX + "." + PersistentCacheKeys.ERROR_DESC;
        var idTokenValue = this.browserStorage.getItem(idTokenKey);
        var clientInfoValue = this.browserStorage.getItem(clientInfoKey);
        var errorValue = this.browserStorage.getItem(errorKey);
        var errorDescValue = this.browserStorage.getItem(errorDescKey);
        var values = [idTokenValue, clientInfoValue, errorValue, errorDescValue];
        var keysToMigrate = [PersistentCacheKeys.ID_TOKEN, PersistentCacheKeys.CLIENT_INFO, PersistentCacheKeys.ERROR, PersistentCacheKeys.ERROR_DESC];
        keysToMigrate.forEach(function (cacheKey, index) { return _this.migrateCacheEntry(cacheKey, values[index]); });
    };
    /**
     * Utility function to help with migration.
     * @param newKey
     * @param value
     * @param storeAuthStateInCookie
     */
    BrowserCacheManager.prototype.migrateCacheEntry = function (newKey, value) {
        if (value) {
            this.setTemporaryCache(newKey, value, true);
        }
    };
    /**
     * Parses passed value as JSON object, JSON.parse() will throw an error.
     * @param input
     */
    BrowserCacheManager.prototype.validateAndParseJson = function (jsonValue) {
        try {
            var parsedJson = JSON.parse(jsonValue);
            /**
             * There are edge cases in which JSON.parse will successfully parse a non-valid JSON object
             * (e.g. JSON.parse will parse an escaped string into an unescaped string), so adding a type check
             * of the parsed value is necessary in order to be certain that the string represents a valid JSON object.
             *
             */
            return (parsedJson && typeof parsedJson === "object") ? parsedJson : null;
        }
        catch (error) {
            return null;
        }
    };
    /**
     * fetches the entry from the browser storage based off the key
     * @param key
     */
    BrowserCacheManager.prototype.getItem = function (key) {
        return this.browserStorage.getItem(key);
    };
    /**
     * sets the entry in the browser storage
     * @param key
     * @param value
     */
    BrowserCacheManager.prototype.setItem = function (key, value) {
        this.browserStorage.setItem(key, value);
    };
    /**
     * fetch the account entity from the platform cache
     * @param accountKey
     */
    BrowserCacheManager.prototype.getAccount = function (accountKey) {
        var account = this.getItem(accountKey);
        if (!account) {
            return null;
        }
        var parsedAccount = this.validateAndParseJson(account);
        if (!parsedAccount || !AccountEntity.isAccountEntity(parsedAccount)) {
            return null;
        }
        return CacheManager.toObject(new AccountEntity(), parsedAccount);
    };
    /**
     * set account entity in the platform cache
     * @param key
     * @param value
     */
    BrowserCacheManager.prototype.setAccount = function (account) {
        this.logger.trace("BrowserCacheManager.setAccount called");
        var key = account.generateAccountKey();
        this.setItem(key, JSON.stringify(account));
    };
    /**
     * generates idToken entity from a string
     * @param idTokenKey
     */
    BrowserCacheManager.prototype.getIdTokenCredential = function (idTokenKey) {
        var value = this.getItem(idTokenKey);
        if (!value) {
            this.logger.trace("BrowserCacheManager.getIdTokenCredential: called, no cache hit");
            return null;
        }
        var parsedIdToken = this.validateAndParseJson(value);
        if (!parsedIdToken || !IdTokenEntity.isIdTokenEntity(parsedIdToken)) {
            this.logger.trace("BrowserCacheManager.getIdTokenCredential: called, no cache hit");
            return null;
        }
        this.logger.trace("BrowserCacheManager.getIdTokenCredential: cache hit");
        return CacheManager.toObject(new IdTokenEntity(), parsedIdToken);
    };
    /**
     * set IdToken credential to the platform cache
     * @param idToken
     */
    BrowserCacheManager.prototype.setIdTokenCredential = function (idToken) {
        this.logger.trace("BrowserCacheManager.setIdTokenCredential called");
        var idTokenKey = idToken.generateCredentialKey();
        this.setItem(idTokenKey, JSON.stringify(idToken));
    };
    /**
     * generates accessToken entity from a string
     * @param key
     */
    BrowserCacheManager.prototype.getAccessTokenCredential = function (accessTokenKey) {
        var value = this.getItem(accessTokenKey);
        if (!value) {
            this.logger.trace("BrowserCacheManager.getAccessTokenCredential: called, no cache hit");
            return null;
        }
        var parsedAccessToken = this.validateAndParseJson(value);
        if (!parsedAccessToken || !AccessTokenEntity.isAccessTokenEntity(parsedAccessToken)) {
            this.logger.trace("BrowserCacheManager.getAccessTokenCredential: called, no cache hit");
            return null;
        }
        this.logger.trace("BrowserCacheManager.getAccessTokenCredential: cache hit");
        return CacheManager.toObject(new AccessTokenEntity(), parsedAccessToken);
    };
    /**
     * set accessToken credential to the platform cache
     * @param accessToken
     */
    BrowserCacheManager.prototype.setAccessTokenCredential = function (accessToken) {
        this.logger.trace("BrowserCacheManager.setAccessTokenCredential called");
        var accessTokenKey = accessToken.generateCredentialKey();
        this.setItem(accessTokenKey, JSON.stringify(accessToken));
    };
    /**
     * generates refreshToken entity from a string
     * @param refreshTokenKey
     */
    BrowserCacheManager.prototype.getRefreshTokenCredential = function (refreshTokenKey) {
        var value = this.getItem(refreshTokenKey);
        if (!value) {
            this.logger.trace("BrowserCacheManager.getRefreshTokenCredential: called, no cache hit");
            return null;
        }
        var parsedRefreshToken = this.validateAndParseJson(value);
        if (!parsedRefreshToken || !RefreshTokenEntity.isRefreshTokenEntity(parsedRefreshToken)) {
            this.logger.trace("BrowserCacheManager.getRefreshTokenCredential: called, no cache hit");
            return null;
        }
        this.logger.trace("BrowserCacheManager.getRefreshTokenCredential: cache hit");
        return CacheManager.toObject(new RefreshTokenEntity(), parsedRefreshToken);
    };
    /**
     * set refreshToken credential to the platform cache
     * @param refreshToken
     */
    BrowserCacheManager.prototype.setRefreshTokenCredential = function (refreshToken) {
        this.logger.trace("BrowserCacheManager.setRefreshTokenCredential called");
        var refreshTokenKey = refreshToken.generateCredentialKey();
        this.setItem(refreshTokenKey, JSON.stringify(refreshToken));
    };
    /**
     * fetch appMetadata entity from the platform cache
     * @param appMetadataKey
     */
    BrowserCacheManager.prototype.getAppMetadata = function (appMetadataKey) {
        var value = this.getItem(appMetadataKey);
        if (!value) {
            this.logger.trace("BrowserCacheManager.getAppMetadata: called, no cache hit");
            return null;
        }
        var parsedMetadata = this.validateAndParseJson(value);
        if (!parsedMetadata || !AppMetadataEntity.isAppMetadataEntity(appMetadataKey, parsedMetadata)) {
            this.logger.trace("BrowserCacheManager.getAppMetadata: called, no cache hit");
            return null;
        }
        this.logger.trace("BrowserCacheManager.getAppMetadata: cache hit");
        return CacheManager.toObject(new AppMetadataEntity(), parsedMetadata);
    };
    /**
     * set appMetadata entity to the platform cache
     * @param appMetadata
     */
    BrowserCacheManager.prototype.setAppMetadata = function (appMetadata) {
        this.logger.trace("BrowserCacheManager.setAppMetadata called");
        var appMetadataKey = appMetadata.generateAppMetadataKey();
        this.setItem(appMetadataKey, JSON.stringify(appMetadata));
    };
    /**
     * fetch server telemetry entity from the platform cache
     * @param serverTelemetryKey
     */
    BrowserCacheManager.prototype.getServerTelemetry = function (serverTelemetryKey) {
        var value = this.getItem(serverTelemetryKey);
        if (!value) {
            this.logger.trace("BrowserCacheManager.getServerTelemetry: called, no cache hit");
            return null;
        }
        var parsedMetadata = this.validateAndParseJson(value);
        if (!parsedMetadata || !ServerTelemetryEntity.isServerTelemetryEntity(serverTelemetryKey, parsedMetadata)) {
            this.logger.trace("BrowserCacheManager.getServerTelemetry: called, no cache hit");
            return null;
        }
        this.logger.trace("BrowserCacheManager.getServerTelemetry: cache hit");
        return CacheManager.toObject(new ServerTelemetryEntity(), parsedMetadata);
    };
    /**
     * set server telemetry entity to the platform cache
     * @param serverTelemetryKey
     * @param serverTelemetry
     */
    BrowserCacheManager.prototype.setServerTelemetry = function (serverTelemetryKey, serverTelemetry) {
        this.logger.trace("BrowserCacheManager.setServerTelemetry called");
        this.setItem(serverTelemetryKey, JSON.stringify(serverTelemetry));
    };
    /**
     *
     */
    BrowserCacheManager.prototype.getAuthorityMetadata = function (key) {
        var value = this.internalStorage.getItem(key);
        if (!value) {
            this.logger.trace("BrowserCacheManager.getAuthorityMetadata: called, no cache hit");
            return null;
        }
        var parsedMetadata = this.validateAndParseJson(value);
        if (parsedMetadata && AuthorityMetadataEntity.isAuthorityMetadataEntity(key, parsedMetadata)) {
            this.logger.trace("BrowserCacheManager.getAuthorityMetadata: cache hit");
            return CacheManager.toObject(new AuthorityMetadataEntity(), parsedMetadata);
        }
        return null;
    };
    /**
     *
     */
    BrowserCacheManager.prototype.getAuthorityMetadataKeys = function () {
        var _this = this;
        var allKeys = this.internalStorage.getKeys();
        return allKeys.filter(function (key) {
            return _this.isAuthorityMetadata(key);
        });
    };
    /**
     * Sets wrapper metadata in memory
     * @param wrapperSKU
     * @param wrapperVersion
     */
    BrowserCacheManager.prototype.setWrapperMetadata = function (wrapperSKU, wrapperVersion) {
        this.internalStorage.setItem(InMemoryCacheKeys.WRAPPER_SKU, wrapperSKU);
        this.internalStorage.setItem(InMemoryCacheKeys.WRAPPER_VER, wrapperVersion);
    };
    /**
     * Returns wrapper metadata from in-memory storage
     */
    BrowserCacheManager.prototype.getWrapperMetadata = function () {
        var sku = this.internalStorage.getItem(InMemoryCacheKeys.WRAPPER_SKU) || Constants.EMPTY_STRING;
        var version = this.internalStorage.getItem(InMemoryCacheKeys.WRAPPER_VER) || Constants.EMPTY_STRING;
        return [sku, version];
    };
    /**
     *
     * @param entity
     */
    BrowserCacheManager.prototype.setAuthorityMetadata = function (key, entity) {
        this.logger.trace("BrowserCacheManager.setAuthorityMetadata called");
        this.internalStorage.setItem(key, JSON.stringify(entity));
    };
    /**
     * Gets the active account
     */
    BrowserCacheManager.prototype.getActiveAccount = function () {
        var activeAccountKeyFilters = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT_FILTERS);
        var activeAccountValueFilters = this.getItem(activeAccountKeyFilters);
        if (!activeAccountValueFilters) {
            // if new active account cache type isn't found, it's an old version, so look for that instead
            this.logger.trace("No active account filters cache schema found, looking for legacy schema");
            var activeAccountKeyLocal = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT);
            var activeAccountValueLocal = this.getItem(activeAccountKeyLocal);
            if (!activeAccountValueLocal) {
                this.logger.trace("No active account found");
                return null;
            }
            var activeAccount = this.getAccountInfoByFilter({ localAccountId: activeAccountValueLocal })[0] || null;
            if (activeAccount) {
                this.logger.trace("Legacy active account cache schema found");
                this.logger.trace("Adding active account filters cache schema");
                this.setActiveAccount(activeAccount);
                return activeAccount;
            }
            return null;
        }
        var activeAccountValueObj = this.validateAndParseJson(activeAccountValueFilters);
        if (activeAccountValueObj) {
            this.logger.trace("Active account filters schema found");
            return this.getAccountInfoByFilter({
                homeAccountId: activeAccountValueObj.homeAccountId,
                localAccountId: activeAccountValueObj.localAccountId
            })[0] || null;
        }
        this.logger.trace("No active account found");
        return null;
    };
    /**
     * Sets the active account's localAccountId in cache
     * @param account
     */
    BrowserCacheManager.prototype.setActiveAccount = function (account) {
        var activeAccountKey = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT_FILTERS);
        var activeAccountKeyLocal = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT);
        if (account) {
            this.logger.verbose("setActiveAccount: Active account set");
            var activeAccountValue = {
                homeAccountId: account.homeAccountId,
                localAccountId: account.localAccountId
            };
            this.browserStorage.setItem(activeAccountKey, JSON.stringify(activeAccountValue));
            this.browserStorage.setItem(activeAccountKeyLocal, account.localAccountId);
        }
        else {
            this.logger.verbose("setActiveAccount: No account passed, active account not set");
            this.browserStorage.removeItem(activeAccountKey);
            this.browserStorage.removeItem(activeAccountKeyLocal);
        }
    };
    /**
     * Gets a list of accounts that match all of the filters provided
     * @param account
     */
    BrowserCacheManager.prototype.getAccountInfoByFilter = function (accountFilter) {
        var allAccounts = this.getAllAccounts();
        return allAccounts.filter(function (accountObj) {
            if (accountFilter.username && accountFilter.username.toLowerCase() !== accountObj.username.toLowerCase()) {
                return false;
            }
            if (accountFilter.homeAccountId && accountFilter.homeAccountId !== accountObj.homeAccountId) {
                return false;
            }
            if (accountFilter.localAccountId && accountFilter.localAccountId !== accountObj.localAccountId) {
                return false;
            }
            if (accountFilter.tenantId && accountFilter.tenantId !== accountObj.tenantId) {
                return false;
            }
            if (accountFilter.environment && accountFilter.environment !== accountObj.environment) {
                return false;
            }
            return true;
        });
    };
    /**
     * Checks the cache for accounts matching loginHint or SID
     * @param loginHint
     * @param sid
     */
    BrowserCacheManager.prototype.getAccountInfoByHints = function (loginHint, sid) {
        var matchingAccounts = this.getAllAccounts().filter(function (accountInfo) {
            if (sid) {
                var accountSid = accountInfo.idTokenClaims && accountInfo.idTokenClaims["sid"];
                return sid === accountSid;
            }
            if (loginHint) {
                return loginHint === accountInfo.username;
            }
            return false;
        });
        if (matchingAccounts.length === 1) {
            return matchingAccounts[0];
        }
        else if (matchingAccounts.length > 1) {
            throw ClientAuthError.createMultipleMatchingAccountsInCacheError();
        }
        return null;
    };
    /**
     * fetch throttling entity from the platform cache
     * @param throttlingCacheKey
     */
    BrowserCacheManager.prototype.getThrottlingCache = function (throttlingCacheKey) {
        var value = this.getItem(throttlingCacheKey);
        if (!value) {
            this.logger.trace("BrowserCacheManager.getThrottlingCache: called, no cache hit");
            return null;
        }
        var parsedThrottlingCache = this.validateAndParseJson(value);
        if (!parsedThrottlingCache || !ThrottlingEntity.isThrottlingEntity(throttlingCacheKey, parsedThrottlingCache)) {
            this.logger.trace("BrowserCacheManager.getThrottlingCache: called, no cache hit");
            return null;
        }
        this.logger.trace("BrowserCacheManager.getThrottlingCache: cache hit");
        return CacheManager.toObject(new ThrottlingEntity(), parsedThrottlingCache);
    };
    /**
     * set throttling entity to the platform cache
     * @param throttlingCacheKey
     * @param throttlingCache
     */
    BrowserCacheManager.prototype.setThrottlingCache = function (throttlingCacheKey, throttlingCache) {
        this.logger.trace("BrowserCacheManager.setThrottlingCache called");
        this.setItem(throttlingCacheKey, JSON.stringify(throttlingCache));
    };
    /**
     * Gets cache item with given key.
     * Will retrieve from cookies if storeAuthStateInCookie is set to true.
     * @param key
     */
    BrowserCacheManager.prototype.getTemporaryCache = function (cacheKey, generateKey) {
        var key = generateKey ? this.generateCacheKey(cacheKey) : cacheKey;
        if (this.cacheConfig.storeAuthStateInCookie) {
            var itemCookie = this.getItemCookie(key);
            if (itemCookie) {
                this.logger.trace("BrowserCacheManager.getTemporaryCache: storeAuthStateInCookies set to true, retrieving from cookies");
                return itemCookie;
            }
        }
        var value = this.temporaryCacheStorage.getItem(key);
        if (!value) {
            // If temp cache item not found in session/memory, check local storage for items set by old versions
            if (this.cacheConfig.cacheLocation === exports.BrowserCacheLocation.LocalStorage) {
                var item = this.browserStorage.getItem(key);
                if (item) {
                    this.logger.trace("BrowserCacheManager.getTemporaryCache: Temporary cache item found in local storage");
                    return item;
                }
            }
            this.logger.trace("BrowserCacheManager.getTemporaryCache: No cache item found in local storage");
            return null;
        }
        this.logger.trace("BrowserCacheManager.getTemporaryCache: Temporary cache item returned");
        return value;
    };
    /**
     * Sets the cache item with the key and value given.
     * Stores in cookie if storeAuthStateInCookie is set to true.
     * This can cause cookie overflow if used incorrectly.
     * @param key
     * @param value
     */
    BrowserCacheManager.prototype.setTemporaryCache = function (cacheKey, value, generateKey) {
        var key = generateKey ? this.generateCacheKey(cacheKey) : cacheKey;
        this.temporaryCacheStorage.setItem(key, value);
        if (this.cacheConfig.storeAuthStateInCookie) {
            this.logger.trace("BrowserCacheManager.setTemporaryCache: storeAuthStateInCookie set to true, setting item cookie");
            this.setItemCookie(key, value);
        }
    };
    /**
     * Removes the cache item with the given key.
     * Will also clear the cookie item if storeAuthStateInCookie is set to true.
     * @param key
     */
    BrowserCacheManager.prototype.removeItem = function (key) {
        this.browserStorage.removeItem(key);
        this.temporaryCacheStorage.removeItem(key);
        if (this.cacheConfig.storeAuthStateInCookie) {
            this.logger.trace("BrowserCacheManager.removeItem: storeAuthStateInCookie is true, clearing item cookie");
            this.clearItemCookie(key);
        }
        return true;
    };
    /**
     * Checks whether key is in cache.
     * @param key
     */
    BrowserCacheManager.prototype.containsKey = function (key) {
        return this.browserStorage.containsKey(key) || this.temporaryCacheStorage.containsKey(key);
    };
    /**
     * Gets all keys in window.
     */
    BrowserCacheManager.prototype.getKeys = function () {
        return __spread(this.browserStorage.getKeys(), this.temporaryCacheStorage.getKeys());
    };
    /**
     * Clears all cache entries created by MSAL.
     */
    BrowserCacheManager.prototype.clear = function () {
        return __awaiter$1(this, void 0, void 0, function () {
            var _this = this;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0: 
                    // Removes all accounts and their credentials
                    return [4 /*yield*/, this.removeAllAccounts()];
                    case 1:
                        // Removes all accounts and their credentials
                        _a.sent();
                        this.removeAppMetadata();
                        // Removes all remaining MSAL cache items
                        this.getKeys().forEach(function (cacheKey) {
                            // Check if key contains msal prefix; For now, we are clearing all the cache items created by MSAL.js
                            if ((_this.browserStorage.containsKey(cacheKey) || _this.temporaryCacheStorage.containsKey(cacheKey)) && ((cacheKey.indexOf(Constants.CACHE_PREFIX) !== -1) || (cacheKey.indexOf(_this.clientId) !== -1))) {
                                _this.removeItem(cacheKey);
                            }
                        });
                        this.internalStorage.clear();
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Add value to cookies
     * @param cookieName
     * @param cookieValue
     * @param expires
     */
    BrowserCacheManager.prototype.setItemCookie = function (cookieName, cookieValue, expires) {
        var cookieStr = encodeURIComponent(cookieName) + "=" + encodeURIComponent(cookieValue) + ";path=/;SameSite=Lax;";
        if (expires) {
            var expireTime = this.getCookieExpirationTime(expires);
            cookieStr += "expires=" + expireTime + ";";
        }
        if (this.cacheConfig.secureCookies) {
            cookieStr += "Secure;";
        }
        document.cookie = cookieStr;
    };
    /**
     * Get one item by key from cookies
     * @param cookieName
     */
    BrowserCacheManager.prototype.getItemCookie = function (cookieName) {
        var name = encodeURIComponent(cookieName) + "=";
        var cookieList = document.cookie.split(";");
        for (var i = 0; i < cookieList.length; i++) {
            var cookie = cookieList[i];
            while (cookie.charAt(0) === " ") {
                cookie = cookie.substring(1);
            }
            if (cookie.indexOf(name) === 0) {
                return decodeURIComponent(cookie.substring(name.length, cookie.length));
            }
        }
        return Constants.EMPTY_STRING;
    };
    /**
     * Clear all msal-related cookies currently set in the browser. Should only be used to clear temporary cache items.
     */
    BrowserCacheManager.prototype.clearMsalCookies = function () {
        var _this = this;
        var cookiePrefix = Constants.CACHE_PREFIX + "." + this.clientId;
        var cookieList = document.cookie.split(";");
        cookieList.forEach(function (cookie) {
            while (cookie.charAt(0) === " ") {
                // eslint-disable-next-line no-param-reassign
                cookie = cookie.substring(1);
            }
            if (cookie.indexOf(cookiePrefix) === 0) {
                var cookieKey = cookie.split("=")[0];
                _this.clearItemCookie(cookieKey);
            }
        });
    };
    /**
     * Clear an item in the cookies by key
     * @param cookieName
     */
    BrowserCacheManager.prototype.clearItemCookie = function (cookieName) {
        this.setItemCookie(cookieName, Constants.EMPTY_STRING, -1);
    };
    /**
     * Get cookie expiration time
     * @param cookieLifeDays
     */
    BrowserCacheManager.prototype.getCookieExpirationTime = function (cookieLifeDays) {
        var today = new Date();
        var expr = new Date(today.getTime() + cookieLifeDays * this.COOKIE_LIFE_MULTIPLIER);
        return expr.toUTCString();
    };
    /**
     * Gets the cache object referenced by the browser
     */
    BrowserCacheManager.prototype.getCache = function () {
        return this.browserStorage;
    };
    /**
     * interface compat, we cannot overwrite browser cache; Functionality is supported by individual entities in browser
     */
    BrowserCacheManager.prototype.setCache = function () {
        // sets nothing
    };
    /**
     * Prepend msal.<client-id> to each key; Skip for any JSON object as Key (defined schemas do not need the key appended: AccessToken Keys or the upcoming schema)
     * @param key
     * @param addInstanceId
     */
    BrowserCacheManager.prototype.generateCacheKey = function (key) {
        var generatedKey = this.validateAndParseJson(key);
        if (!generatedKey) {
            if (StringUtils.startsWith(key, Constants.CACHE_PREFIX) || StringUtils.startsWith(key, PersistentCacheKeys.ADAL_ID_TOKEN)) {
                return key;
            }
            return Constants.CACHE_PREFIX + "." + this.clientId + "." + key;
        }
        return JSON.stringify(key);
    };
    /**
     * Create authorityKey to cache authority
     * @param state
     */
    BrowserCacheManager.prototype.generateAuthorityKey = function (stateString) {
        var stateId = ProtocolUtils.parseRequestState(this.cryptoImpl, stateString).libraryState.id;
        return this.generateCacheKey(TemporaryCacheKeys.AUTHORITY + "." + stateId);
    };
    /**
     * Create Nonce key to cache nonce
     * @param state
     */
    BrowserCacheManager.prototype.generateNonceKey = function (stateString) {
        var stateId = ProtocolUtils.parseRequestState(this.cryptoImpl, stateString).libraryState.id;
        return this.generateCacheKey(TemporaryCacheKeys.NONCE_IDTOKEN + "." + stateId);
    };
    /**
     * Creates full cache key for the request state
     * @param stateString State string for the request
     */
    BrowserCacheManager.prototype.generateStateKey = function (stateString) {
        // Use the library state id to key temp storage for uniqueness for multiple concurrent requests
        var stateId = ProtocolUtils.parseRequestState(this.cryptoImpl, stateString).libraryState.id;
        return this.generateCacheKey(TemporaryCacheKeys.REQUEST_STATE + "." + stateId);
    };
    /**
     * Gets the cached authority based on the cached state. Returns empty if no cached state found.
     */
    BrowserCacheManager.prototype.getCachedAuthority = function (cachedState) {
        var stateCacheKey = this.generateStateKey(cachedState);
        var state = this.getTemporaryCache(stateCacheKey);
        if (!state) {
            return null;
        }
        var authorityCacheKey = this.generateAuthorityKey(state);
        return this.getTemporaryCache(authorityCacheKey);
    };
    /**
     * Updates account, authority, and state in cache
     * @param serverAuthenticationRequest
     * @param account
     */
    BrowserCacheManager.prototype.updateCacheEntries = function (state, nonce, authorityInstance, loginHint, account) {
        this.logger.trace("BrowserCacheManager.updateCacheEntries called");
        // Cache the request state
        var stateCacheKey = this.generateStateKey(state);
        this.setTemporaryCache(stateCacheKey, state, false);
        // Cache the nonce
        var nonceCacheKey = this.generateNonceKey(state);
        this.setTemporaryCache(nonceCacheKey, nonce, false);
        // Cache authorityKey
        var authorityCacheKey = this.generateAuthorityKey(state);
        this.setTemporaryCache(authorityCacheKey, authorityInstance, false);
        if (account) {
            var ccsCredential = {
                credential: account.homeAccountId,
                type: CcsCredentialType.HOME_ACCOUNT_ID
            };
            this.setTemporaryCache(TemporaryCacheKeys.CCS_CREDENTIAL, JSON.stringify(ccsCredential), true);
        }
        else if (!StringUtils.isEmpty(loginHint)) {
            var ccsCredential = {
                credential: loginHint,
                type: CcsCredentialType.UPN
            };
            this.setTemporaryCache(TemporaryCacheKeys.CCS_CREDENTIAL, JSON.stringify(ccsCredential), true);
        }
    };
    /**
     * Reset all temporary cache items
     * @param state
     */
    BrowserCacheManager.prototype.resetRequestCache = function (state) {
        var _this = this;
        this.logger.trace("BrowserCacheManager.resetRequestCache called");
        // check state and remove associated cache items
        if (!StringUtils.isEmpty(state)) {
            this.getKeys().forEach(function (key) {
                if (key.indexOf(state) !== -1) {
                    _this.removeItem(key);
                }
            });
        }
        // delete generic interactive request parameters
        if (state) {
            this.removeItem(this.generateStateKey(state));
            this.removeItem(this.generateNonceKey(state));
            this.removeItem(this.generateAuthorityKey(state));
        }
        this.removeItem(this.generateCacheKey(TemporaryCacheKeys.REQUEST_PARAMS));
        this.removeItem(this.generateCacheKey(TemporaryCacheKeys.ORIGIN_URI));
        this.removeItem(this.generateCacheKey(TemporaryCacheKeys.URL_HASH));
        this.removeItem(this.generateCacheKey(TemporaryCacheKeys.CORRELATION_ID));
        this.removeItem(this.generateCacheKey(TemporaryCacheKeys.CCS_CREDENTIAL));
        this.removeItem(this.generateCacheKey(TemporaryCacheKeys.NATIVE_REQUEST));
        this.setInteractionInProgress(false);
    };
    /**
     * Removes temporary cache for the provided state
     * @param stateString
     */
    BrowserCacheManager.prototype.cleanRequestByState = function (stateString) {
        this.logger.trace("BrowserCacheManager.cleanRequestByState called");
        // Interaction is completed - remove interaction status.
        if (stateString) {
            var stateKey = this.generateStateKey(stateString);
            var cachedState = this.temporaryCacheStorage.getItem(stateKey);
            this.logger.infoPii("BrowserCacheManager.cleanRequestByState: Removing temporary cache items for state: " + cachedState);
            this.resetRequestCache(cachedState || Constants.EMPTY_STRING);
        }
        this.clearMsalCookies();
    };
    /**
     * Looks in temporary cache for any state values with the provided interactionType and removes all temporary cache items for that state
     * Used in scenarios where temp cache needs to be cleaned but state is not known, such as clicking browser back button.
     * @param interactionType
     */
    BrowserCacheManager.prototype.cleanRequestByInteractionType = function (interactionType) {
        var _this = this;
        this.logger.trace("BrowserCacheManager.cleanRequestByInteractionType called");
        // Loop through all keys to find state key
        this.getKeys().forEach(function (key) {
            // If this key is not the state key, move on
            if (key.indexOf(TemporaryCacheKeys.REQUEST_STATE) === -1) {
                return;
            }
            // Retrieve state value, return if not a valid value
            var stateValue = _this.temporaryCacheStorage.getItem(key);
            if (!stateValue) {
                return;
            }
            // Extract state and ensure it matches given InteractionType, then clean request cache
            var parsedState = BrowserProtocolUtils.extractBrowserRequestState(_this.cryptoImpl, stateValue);
            if (parsedState && parsedState.interactionType === interactionType) {
                _this.logger.infoPii("BrowserCacheManager.cleanRequestByInteractionType: Removing temporary cache items for state: " + stateValue);
                _this.resetRequestCache(stateValue);
            }
        });
        this.clearMsalCookies();
        this.setInteractionInProgress(false);
    };
    BrowserCacheManager.prototype.cacheCodeRequest = function (authCodeRequest, browserCrypto) {
        this.logger.trace("BrowserCacheManager.cacheCodeRequest called");
        var encodedValue = browserCrypto.base64Encode(JSON.stringify(authCodeRequest));
        this.setTemporaryCache(TemporaryCacheKeys.REQUEST_PARAMS, encodedValue, true);
    };
    /**
     * Gets the token exchange parameters from the cache. Throws an error if nothing is found.
     */
    BrowserCacheManager.prototype.getCachedRequest = function (state, browserCrypto) {
        this.logger.trace("BrowserCacheManager.getCachedRequest called");
        // Get token request from cache and parse as TokenExchangeParameters.
        var encodedTokenRequest = this.getTemporaryCache(TemporaryCacheKeys.REQUEST_PARAMS, true);
        if (!encodedTokenRequest) {
            throw BrowserAuthError.createNoTokenRequestCacheError();
        }
        var parsedRequest = this.validateAndParseJson(browserCrypto.base64Decode(encodedTokenRequest));
        if (!parsedRequest) {
            throw BrowserAuthError.createUnableToParseTokenRequestCacheError();
        }
        this.removeItem(this.generateCacheKey(TemporaryCacheKeys.REQUEST_PARAMS));
        // Get cached authority and use if no authority is cached with request.
        if (StringUtils.isEmpty(parsedRequest.authority)) {
            var authorityCacheKey = this.generateAuthorityKey(state);
            var cachedAuthority = this.getTemporaryCache(authorityCacheKey);
            if (!cachedAuthority) {
                throw BrowserAuthError.createNoCachedAuthorityError();
            }
            parsedRequest.authority = cachedAuthority;
        }
        return parsedRequest;
    };
    /**
     * Gets cached native request for redirect flows
     */
    BrowserCacheManager.prototype.getCachedNativeRequest = function () {
        this.logger.trace("BrowserCacheManager.getCachedNativeRequest called");
        var cachedRequest = this.getTemporaryCache(TemporaryCacheKeys.NATIVE_REQUEST, true);
        if (!cachedRequest) {
            this.logger.trace("BrowserCacheManager.getCachedNativeRequest: No cached native request found");
            return null;
        }
        var parsedRequest = this.validateAndParseJson(cachedRequest);
        if (!parsedRequest) {
            this.logger.error("BrowserCacheManager.getCachedNativeRequest: Unable to parse native request");
            return null;
        }
        return parsedRequest;
    };
    BrowserCacheManager.prototype.isInteractionInProgress = function (matchClientId) {
        var clientId = this.getInteractionInProgress();
        if (matchClientId) {
            return clientId === this.clientId;
        }
        else {
            return !!clientId;
        }
    };
    BrowserCacheManager.prototype.getInteractionInProgress = function () {
        var key = Constants.CACHE_PREFIX + "." + TemporaryCacheKeys.INTERACTION_STATUS_KEY;
        return this.getTemporaryCache(key, false);
    };
    BrowserCacheManager.prototype.setInteractionInProgress = function (inProgress) {
        // Ensure we don't overwrite interaction in progress for a different clientId
        var key = Constants.CACHE_PREFIX + "." + TemporaryCacheKeys.INTERACTION_STATUS_KEY;
        if (inProgress) {
            if (this.getInteractionInProgress()) {
                throw BrowserAuthError.createInteractionInProgressError();
            }
            else {
                // No interaction is in progress
                this.setTemporaryCache(key, this.clientId, false);
            }
        }
        else if (!inProgress && this.getInteractionInProgress() === this.clientId) {
            this.removeItem(key);
        }
    };
    /**
     * Returns username retrieved from ADAL or MSAL v1 idToken
     */
    BrowserCacheManager.prototype.getLegacyLoginHint = function () {
        // Only check for adal/msal token if no SSO params are being used
        var adalIdTokenString = this.getTemporaryCache(PersistentCacheKeys.ADAL_ID_TOKEN);
        if (adalIdTokenString) {
            this.browserStorage.removeItem(PersistentCacheKeys.ADAL_ID_TOKEN);
            this.logger.verbose("Cached ADAL id token retrieved.");
        }
        // Check for cached MSAL v1 id token
        var msalIdTokenString = this.getTemporaryCache(PersistentCacheKeys.ID_TOKEN, true);
        if (msalIdTokenString) {
            this.removeItem(this.generateCacheKey(PersistentCacheKeys.ID_TOKEN));
            this.logger.verbose("Cached MSAL.js v1 id token retrieved");
        }
        var cachedIdTokenString = msalIdTokenString || adalIdTokenString;
        if (cachedIdTokenString) {
            var cachedIdToken = new AuthToken(cachedIdTokenString, this.cryptoImpl);
            if (cachedIdToken.claims && cachedIdToken.claims.preferred_username) {
                this.logger.verbose("No SSO params used and ADAL/MSAL v1 token retrieved, setting ADAL/MSAL v1 preferred_username as loginHint");
                return cachedIdToken.claims.preferred_username;
            }
            else if (cachedIdToken.claims && cachedIdToken.claims.upn) {
                this.logger.verbose("No SSO params used and ADAL/MSAL v1 token retrieved, setting ADAL/MSAL v1 upn as loginHint");
                return cachedIdToken.claims.upn;
            }
            else {
                this.logger.verbose("No SSO params used and ADAL/MSAL v1 token retrieved, however, no account hint claim found. Enable preferred_username or upn id token claim to get SSO.");
            }
        }
        return null;
    };
    /**
     * Updates a credential's cache key if the current cache key is outdated
     */
    BrowserCacheManager.prototype.updateCredentialCacheKey = function (currentCacheKey, credential) {
        var updatedCacheKey = credential.generateCredentialKey();
        if (currentCacheKey !== updatedCacheKey) {
            var cacheItem = this.getItem(currentCacheKey);
            if (cacheItem) {
                this.removeItem(currentCacheKey);
                this.setItem(updatedCacheKey, cacheItem);
                this.logger.verbose("Updated an outdated " + credential.credentialType + " cache key");
                return updatedCacheKey;
            }
            else {
                this.logger.error("Attempted to update an outdated " + credential.credentialType + " cache key but no item matching the outdated key was found in storage");
            }
        }
        return currentCacheKey;
    };
    return BrowserCacheManager;
}(CacheManager));
var DEFAULT_BROWSER_CACHE_MANAGER = function (clientId, logger) {
    var cacheOptions = {
        cacheLocation: exports.BrowserCacheLocation.MemoryStorage,
        storeAuthStateInCookie: false,
        secureCookies: false
    };
    return new BrowserCacheManager(clientId, cacheOptions, DEFAULT_CRYPTO_IMPLEMENTATION, logger);
};

/* eslint-disable header/header */
var name = "@azure/msal-browser";
var version = "2.28.1";

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * This class implements the Fetch API for GET and POST requests. See more here: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API
 */
var FetchClient = /** @class */ (function () {
    function FetchClient() {
    }
    /**
     * Fetch Client for REST endpoints - Get request
     * @param url
     * @param headers
     * @param body
     */
    FetchClient.prototype.sendGetRequestAsync = function (url, options) {
        return __awaiter$1(this, void 0, void 0, function () {
            var response, e_1, _a;
            return __generator$1(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        _b.trys.push([0, 2, , 3]);
                        return [4 /*yield*/, fetch(url, {
                                method: HTTP_REQUEST_TYPE.GET,
                                headers: this.getFetchHeaders(options)
                            })];
                    case 1:
                        response = _b.sent();
                        return [3 /*break*/, 3];
                    case 2:
                        e_1 = _b.sent();
                        if (window.navigator.onLine) {
                            throw BrowserAuthError.createGetRequestFailedError(e_1, url);
                        }
                        else {
                            throw BrowserAuthError.createNoNetworkConnectivityError();
                        }
                    case 3:
                        _b.trys.push([3, 5, , 6]);
                        _a = {
                            headers: this.getHeaderDict(response.headers)
                        };
                        return [4 /*yield*/, response.json()];
                    case 4: return [2 /*return*/, (_a.body = (_b.sent()),
                            _a.status = response.status,
                            _a)];
                    case 5:
                        _b.sent();
                        throw BrowserAuthError.createFailedToParseNetworkResponseError(url);
                    case 6: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Fetch Client for REST endpoints - Post request
     * @param url
     * @param headers
     * @param body
     */
    FetchClient.prototype.sendPostRequestAsync = function (url, options) {
        return __awaiter$1(this, void 0, void 0, function () {
            var reqBody, response, e_3, _a;
            return __generator$1(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        reqBody = (options && options.body) || Constants.EMPTY_STRING;
                        _b.label = 1;
                    case 1:
                        _b.trys.push([1, 3, , 4]);
                        return [4 /*yield*/, fetch(url, {
                                method: HTTP_REQUEST_TYPE.POST,
                                headers: this.getFetchHeaders(options),
                                body: reqBody
                            })];
                    case 2:
                        response = _b.sent();
                        return [3 /*break*/, 4];
                    case 3:
                        e_3 = _b.sent();
                        if (window.navigator.onLine) {
                            throw BrowserAuthError.createPostRequestFailedError(e_3, url);
                        }
                        else {
                            throw BrowserAuthError.createNoNetworkConnectivityError();
                        }
                    case 4:
                        _b.trys.push([4, 6, , 7]);
                        _a = {
                            headers: this.getHeaderDict(response.headers)
                        };
                        return [4 /*yield*/, response.json()];
                    case 5: return [2 /*return*/, (_a.body = (_b.sent()),
                            _a.status = response.status,
                            _a)];
                    case 6:
                        _b.sent();
                        throw BrowserAuthError.createFailedToParseNetworkResponseError(url);
                    case 7: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Get Fetch API Headers object from string map
     * @param inputHeaders
     */
    FetchClient.prototype.getFetchHeaders = function (options) {
        var headers = new Headers();
        if (!(options && options.headers)) {
            return headers;
        }
        var optionsHeaders = options.headers;
        Object.keys(optionsHeaders).forEach(function (key) {
            headers.append(key, optionsHeaders[key]);
        });
        return headers;
    };
    FetchClient.prototype.getHeaderDict = function (headers) {
        var headerDict = {};
        headers.forEach(function (value, key) {
            headerDict[key] = value;
        });
        return headerDict;
    };
    return FetchClient;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * This client implements the XMLHttpRequest class to send GET and POST requests.
 */
var XhrClient = /** @class */ (function () {
    function XhrClient() {
    }
    /**
     * XhrClient for REST endpoints - Get request
     * @param url
     * @param headers
     * @param body
     */
    XhrClient.prototype.sendGetRequestAsync = function (url, options) {
        return __awaiter$1(this, void 0, void 0, function () {
            return __generator$1(this, function (_a) {
                return [2 /*return*/, this.sendRequestAsync(url, HTTP_REQUEST_TYPE.GET, options)];
            });
        });
    };
    /**
     * XhrClient for REST endpoints - Post request
     * @param url
     * @param headers
     * @param body
     */
    XhrClient.prototype.sendPostRequestAsync = function (url, options) {
        return __awaiter$1(this, void 0, void 0, function () {
            return __generator$1(this, function (_a) {
                return [2 /*return*/, this.sendRequestAsync(url, HTTP_REQUEST_TYPE.POST, options)];
            });
        });
    };
    /**
     * Helper for XhrClient requests.
     * @param url
     * @param method
     * @param options
     */
    XhrClient.prototype.sendRequestAsync = function (url, method, options) {
        var _this = this;
        return new Promise(function (resolve, reject) {
            var xhr = new XMLHttpRequest();
            xhr.open(method, url, /* async: */ true);
            _this.setXhrHeaders(xhr, options);
            xhr.onload = function () {
                if (xhr.status < 200 || xhr.status >= 300) {
                    if (method === HTTP_REQUEST_TYPE.POST) {
                        reject(BrowserAuthError.createPostRequestFailedError("Failed with status " + xhr.status, url));
                    }
                    else {
                        reject(BrowserAuthError.createGetRequestFailedError("Failed with status " + xhr.status, url));
                    }
                }
                try {
                    var jsonResponse = JSON.parse(xhr.responseText);
                    var networkResponse = {
                        headers: _this.getHeaderDict(xhr),
                        body: jsonResponse,
                        status: xhr.status
                    };
                    resolve(networkResponse);
                }
                catch (e) {
                    reject(BrowserAuthError.createFailedToParseNetworkResponseError(url));
                }
            };
            xhr.onerror = function () {
                if (window.navigator.onLine) {
                    if (method === HTTP_REQUEST_TYPE.POST) {
                        reject(BrowserAuthError.createPostRequestFailedError("Failed with status " + xhr.status, url));
                    }
                    else {
                        reject(BrowserAuthError.createGetRequestFailedError("Failed with status " + xhr.status, url));
                    }
                }
                else {
                    reject(BrowserAuthError.createNoNetworkConnectivityError());
                }
            };
            if (method === HTTP_REQUEST_TYPE.POST && options && options.body) {
                xhr.send(options.body);
            }
            else if (method === HTTP_REQUEST_TYPE.GET) {
                xhr.send();
            }
            else {
                throw BrowserAuthError.createHttpMethodNotImplementedError(method);
            }
        });
    };
    /**
     * Helper to set XHR headers for request.
     * @param xhr
     * @param options
     */
    XhrClient.prototype.setXhrHeaders = function (xhr, options) {
        if (options && options.headers) {
            var headers_1 = options.headers;
            Object.keys(headers_1).forEach(function (key) {
                xhr.setRequestHeader(key, headers_1[key]);
            });
        }
    };
    /**
     * Gets a string map of the headers received in the response.
     *
     * Algorithm comes from https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getAllResponseHeaders
     * @param xhr
     */
    XhrClient.prototype.getHeaderDict = function (xhr) {
        var headerString = xhr.getAllResponseHeaders();
        var headerArr = headerString.trim().split(/[\r\n]+/);
        var headerDict = {};
        headerArr.forEach(function (value) {
            var parts = value.split(": ");
            var headerName = parts.shift();
            var headerVal = parts.join(": ");
            if (headerName && headerVal) {
                headerDict[headerName] = headerVal;
            }
        });
        return headerDict;
    };
    return XhrClient;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Utility class for browser specific functions
 */
var BrowserUtils = /** @class */ (function () {
    function BrowserUtils() {
    }
    // #region Window Navigation and URL management
    /**
     * Clears hash from window url.
     */
    BrowserUtils.clearHash = function (contentWindow) {
        // Office.js sets history.replaceState to null
        contentWindow.location.hash = Constants.EMPTY_STRING;
        if (typeof contentWindow.history.replaceState === "function") {
            // Full removes "#" from url
            contentWindow.history.replaceState(null, Constants.EMPTY_STRING, "" + contentWindow.location.origin + contentWindow.location.pathname + contentWindow.location.search);
        }
    };
    /**
     * Replaces current hash with hash from provided url
     */
    BrowserUtils.replaceHash = function (url) {
        var urlParts = url.split("#");
        urlParts.shift(); // Remove part before the hash
        window.location.hash = urlParts.length > 0 ? urlParts.join("#") : Constants.EMPTY_STRING;
    };
    /**
     * Returns boolean of whether the current window is in an iframe or not.
     */
    BrowserUtils.isInIframe = function () {
        return window.parent !== window;
    };
    /**
     * Returns boolean of whether or not the current window is a popup opened by msal
     */
    BrowserUtils.isInPopup = function () {
        return typeof window !== "undefined" && !!window.opener &&
            window.opener !== window &&
            typeof window.name === "string" &&
            window.name.indexOf(BrowserConstants.POPUP_NAME_PREFIX + ".") === 0;
    };
    // #endregion
    /**
     * Returns current window URL as redirect uri
     */
    BrowserUtils.getCurrentUri = function () {
        return window.location.href.split("?")[0].split("#")[0];
    };
    /**
     * Gets the homepage url for the current window location.
     */
    BrowserUtils.getHomepage = function () {
        var currentUrl = new UrlString(window.location.href);
        var urlComponents = currentUrl.getUrlComponents();
        return urlComponents.Protocol + "//" + urlComponents.HostNameAndPort + "/";
    };
    /**
     * Returns best compatible network client object.
     */
    BrowserUtils.getBrowserNetworkClient = function () {
        if (window.fetch && window.Headers) {
            return new FetchClient();
        }
        else {
            return new XhrClient();
        }
    };
    /**
     * Throws error if we have completed an auth and are
     * attempting another auth request inside an iframe.
     */
    BrowserUtils.blockReloadInHiddenIframes = function () {
        var isResponseHash = UrlString.hashContainsKnownProperties(window.location.hash);
        // return an error if called from the hidden iframe created by the msal js silent calls
        if (isResponseHash && BrowserUtils.isInIframe()) {
            throw BrowserAuthError.createBlockReloadInHiddenIframeError();
        }
    };
    /**
     * Block redirect operations in iframes unless explicitly allowed
     * @param interactionType Interaction type for the request
     * @param allowRedirectInIframe Config value to allow redirects when app is inside an iframe
     */
    BrowserUtils.blockRedirectInIframe = function (interactionType, allowRedirectInIframe) {
        var isIframedApp = BrowserUtils.isInIframe();
        if (interactionType === exports.InteractionType.Redirect && isIframedApp && !allowRedirectInIframe) {
            // If we are not in top frame, we shouldn't redirect. This is also handled by the service.
            throw BrowserAuthError.createRedirectInIframeError(isIframedApp);
        }
    };
    /**
     * Block redirectUri loaded in popup from calling AcquireToken APIs
     */
    BrowserUtils.blockAcquireTokenInPopups = function () {
        // Popups opened by msal popup APIs are given a name that starts with "msal."
        if (BrowserUtils.isInPopup()) {
            throw BrowserAuthError.createBlockAcquireTokenInPopupsError();
        }
    };
    /**
     * Throws error if token requests are made in non-browser environment
     * @param isBrowserEnvironment Flag indicating if environment is a browser.
     */
    BrowserUtils.blockNonBrowserEnvironment = function (isBrowserEnvironment) {
        if (!isBrowserEnvironment) {
            throw BrowserAuthError.createNonBrowserEnvironmentError();
        }
    };
    /**
     * Throws error if native brokering is enabled but initialize hasn't been called
     * @param allowNativeBroker
     * @param initialized
     */
    BrowserUtils.blockNativeBrokerCalledBeforeInitialized = function (allowNativeBroker, initialized) {
        if (allowNativeBroker && !initialized) {
            throw BrowserAuthError.createNativeBrokerCalledBeforeInitialize();
        }
    };
    /**
     * Returns boolean of whether current browser is an Internet Explorer or Edge browser.
     */
    BrowserUtils.detectIEOrEdge = function () {
        var ua = window.navigator.userAgent;
        var msie = ua.indexOf("MSIE ");
        var msie11 = ua.indexOf("Trident/");
        var msedge = ua.indexOf("Edge/");
        var isIE = msie > 0 || msie11 > 0;
        var isEdge = msedge > 0;
        return isIE || isEdge;
    };
    return BrowserUtils;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var BaseInteractionClient = /** @class */ (function () {
    function BaseInteractionClient(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeMessageHandler, correlationId) {
        this.config = config;
        this.browserStorage = storageImpl;
        this.browserCrypto = browserCrypto;
        this.networkClient = this.config.system.networkClient;
        this.eventHandler = eventHandler;
        this.navigationClient = navigationClient;
        this.nativeMessageHandler = nativeMessageHandler;
        this.correlationId = correlationId || this.browserCrypto.createNewGuid();
        this.logger = logger.clone(BrowserConstants.MSAL_SKU, version, this.correlationId);
        this.performanceClient = performanceClient;
    }
    BaseInteractionClient.prototype.clearCacheOnLogout = function (account) {
        return __awaiter$1(this, void 0, void 0, function () {
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        if (!account) return [3 /*break*/, 5];
                        if (AccountEntity.accountInfoIsEqual(account, this.browserStorage.getActiveAccount(), false)) {
                            this.logger.verbose("Setting active account to null");
                            this.browserStorage.setActiveAccount(null);
                        }
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        return [4 /*yield*/, this.browserStorage.removeAccount(AccountEntity.generateAccountCacheKey(account))];
                    case 2:
                        _a.sent();
                        this.logger.verbose("Cleared cache items belonging to the account provided in the logout request.");
                        return [3 /*break*/, 4];
                    case 3:
                        _a.sent();
                        this.logger.error("Account provided in logout request was not found. Local cache unchanged.");
                        return [3 /*break*/, 4];
                    case 4: return [3 /*break*/, 9];
                    case 5:
                        _a.trys.push([5, 8, , 9]);
                        this.logger.verbose("No account provided in logout request, clearing all cache items.", this.correlationId);
                        // Clear all accounts and tokens
                        return [4 /*yield*/, this.browserStorage.clear()];
                    case 6:
                        // Clear all accounts and tokens
                        _a.sent();
                        // Clear any stray keys from IndexedDB
                        return [4 /*yield*/, this.browserCrypto.clearKeystore()];
                    case 7:
                        // Clear any stray keys from IndexedDB
                        _a.sent();
                        return [3 /*break*/, 9];
                    case 8:
                        _a.sent();
                        this.logger.error("Attempted to clear all MSAL cache items and failed. Local cache unchanged.");
                        return [3 /*break*/, 9];
                    case 9: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Initializer function for all request APIs
     * @param request
     */
    BaseInteractionClient.prototype.initializeBaseRequest = function (request) {
        return __awaiter$1(this, void 0, void 0, function () {
            var authority, scopes, validatedRequest, _a;
            return __generator$1(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        this.logger.verbose("Initializing BaseAuthRequest");
                        authority = request.authority || this.config.auth.authority;
                        scopes = __spread(((request && request.scopes) || []));
                        validatedRequest = __assign$1(__assign$1({}, request), { correlationId: this.correlationId, authority: authority,
                            scopes: scopes });
                        // Set authenticationScheme to BEARER if not explicitly set in the request
                        if (!validatedRequest.authenticationScheme) {
                            validatedRequest.authenticationScheme = exports.AuthenticationScheme.BEARER;
                            this.logger.verbose("Authentication Scheme wasn't explicitly set in request, defaulting to \"Bearer\" request");
                        }
                        else {
                            if (validatedRequest.authenticationScheme === exports.AuthenticationScheme.SSH) {
                                if (!request.sshJwk) {
                                    throw ClientConfigurationError.createMissingSshJwkError();
                                }
                                if (!request.sshKid) {
                                    throw ClientConfigurationError.createMissingSshKidError();
                                }
                            }
                            this.logger.verbose("Authentication Scheme set to \"" + validatedRequest.authenticationScheme + "\" as configured in Auth request");
                        }
                        if (!(request.claims && !StringUtils.isEmpty(request.claims))) return [3 /*break*/, 2];
                        _a = validatedRequest;
                        return [4 /*yield*/, this.browserCrypto.hashString(request.claims)];
                    case 1:
                        _a.requestedClaimsHash = _b.sent();
                        _b.label = 2;
                    case 2: return [2 /*return*/, validatedRequest];
                }
            });
        });
    };
    /**
     *
     * Use to get the redirect uri configured in MSAL or null.
     * @param requestRedirectUri
     * @returns Redirect URL
     *
     */
    BaseInteractionClient.prototype.getRedirectUri = function (requestRedirectUri) {
        this.logger.verbose("getRedirectUri called");
        var redirectUri = requestRedirectUri || this.config.auth.redirectUri || BrowserUtils.getCurrentUri();
        return UrlString.getAbsoluteUrl(redirectUri, BrowserUtils.getCurrentUri());
    };
    /**
     *
     * @param apiId
     * @param correlationId
     * @param forceRefresh
     */
    BaseInteractionClient.prototype.initializeServerTelemetryManager = function (apiId, forceRefresh) {
        this.logger.verbose("initializeServerTelemetryManager called");
        var telemetryPayload = {
            clientId: this.config.auth.clientId,
            correlationId: this.correlationId,
            apiId: apiId,
            forceRefresh: forceRefresh || false,
            wrapperSKU: this.browserStorage.getWrapperMetadata()[0],
            wrapperVer: this.browserStorage.getWrapperMetadata()[1]
        };
        return new ServerTelemetryManager(telemetryPayload, this.browserStorage);
    };
    /**
     * Used to get a discovered version of the default authority.
     * @param requestAuthority
     * @param requestCorrelationId
     */
    BaseInteractionClient.prototype.getDiscoveredAuthority = function (requestAuthority) {
        return __awaiter$1(this, void 0, void 0, function () {
            var authorityOptions;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.verbose("getDiscoveredAuthority called");
                        authorityOptions = {
                            protocolMode: this.config.auth.protocolMode,
                            knownAuthorities: this.config.auth.knownAuthorities,
                            cloudDiscoveryMetadata: this.config.auth.cloudDiscoveryMetadata,
                            authorityMetadata: this.config.auth.authorityMetadata
                        };
                        if (!requestAuthority) return [3 /*break*/, 2];
                        this.logger.verbose("Creating discovered authority with request authority");
                        return [4 /*yield*/, AuthorityFactory.createDiscoveredInstance(requestAuthority, this.config.system.networkClient, this.browserStorage, authorityOptions)];
                    case 1: return [2 /*return*/, _a.sent()];
                    case 2:
                        this.logger.verbose("Creating discovered authority with configured authority");
                        return [4 /*yield*/, AuthorityFactory.createDiscoveredInstance(this.config.auth.authority, this.config.system.networkClient, this.browserStorage, authorityOptions)];
                    case 3: return [2 /*return*/, _a.sent()];
                }
            });
        });
    };
    return BaseInteractionClient;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Defines the class structure and helper functions used by the "standard", non-brokered auth flows (popup, redirect, silent (RT), silent (iframe))
 */
var StandardInteractionClient = /** @class */ (function (_super) {
    __extends$1(StandardInteractionClient, _super);
    function StandardInteractionClient() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    /**
     * Generates an auth code request tied to the url request.
     * @param request
     */
    StandardInteractionClient.prototype.initializeAuthorizationCodeRequest = function (request) {
        return __awaiter$1(this, void 0, void 0, function () {
            var generatedPkceParams, authCodeRequest;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.verbose("initializeAuthorizationRequest called", request.correlationId);
                        return [4 /*yield*/, this.browserCrypto.generatePkceCodes()];
                    case 1:
                        generatedPkceParams = _a.sent();
                        authCodeRequest = __assign$1(__assign$1({}, request), { redirectUri: request.redirectUri, code: Constants.EMPTY_STRING, codeVerifier: generatedPkceParams.verifier });
                        request.codeChallenge = generatedPkceParams.challenge;
                        request.codeChallengeMethod = Constants.S256_CODE_CHALLENGE_METHOD;
                        return [2 /*return*/, authCodeRequest];
                }
            });
        });
    };
    /**
     * Initializer for the logout request.
     * @param logoutRequest
     */
    StandardInteractionClient.prototype.initializeLogoutRequest = function (logoutRequest) {
        this.logger.verbose("initializeLogoutRequest called", logoutRequest === null || logoutRequest === void 0 ? void 0 : logoutRequest.correlationId);
        var validLogoutRequest = __assign$1({ correlationId: this.correlationId || this.browserCrypto.createNewGuid() }, logoutRequest);
        /**
         * Set logout_hint to be login_hint from ID Token Claims if present
         * and logoutHint attribute wasn't manually set in logout request
         */
        if (logoutRequest) {
            // If logoutHint isn't set and an account was passed in, try to extract logoutHint from ID Token Claims
            if (!logoutRequest.logoutHint) {
                if (logoutRequest.account) {
                    var logoutHint = this.getLogoutHintFromIdTokenClaims(logoutRequest.account);
                    if (logoutHint) {
                        this.logger.verbose("Setting logoutHint to login_hint ID Token Claim value for the account provided");
                        validLogoutRequest.logoutHint = logoutHint;
                    }
                }
                else {
                    this.logger.verbose("logoutHint was not set and account was not passed into logout request, logoutHint will not be set");
                }
            }
            else {
                this.logger.verbose("logoutHint has already been set in logoutRequest");
            }
        }
        else {
            this.logger.verbose("logoutHint will not be set since no logout request was configured");
        }
        /*
         * Only set redirect uri if logout request isn't provided or the set uri isn't null.
         * Otherwise, use passed uri, config, or current page.
         */
        if (!logoutRequest || logoutRequest.postLogoutRedirectUri !== null) {
            if (logoutRequest && logoutRequest.postLogoutRedirectUri) {
                this.logger.verbose("Setting postLogoutRedirectUri to uri set on logout request", validLogoutRequest.correlationId);
                validLogoutRequest.postLogoutRedirectUri = UrlString.getAbsoluteUrl(logoutRequest.postLogoutRedirectUri, BrowserUtils.getCurrentUri());
            }
            else if (this.config.auth.postLogoutRedirectUri === null) {
                this.logger.verbose("postLogoutRedirectUri configured as null and no uri set on request, not passing post logout redirect", validLogoutRequest.correlationId);
            }
            else if (this.config.auth.postLogoutRedirectUri) {
                this.logger.verbose("Setting postLogoutRedirectUri to configured uri", validLogoutRequest.correlationId);
                validLogoutRequest.postLogoutRedirectUri = UrlString.getAbsoluteUrl(this.config.auth.postLogoutRedirectUri, BrowserUtils.getCurrentUri());
            }
            else {
                this.logger.verbose("Setting postLogoutRedirectUri to current page", validLogoutRequest.correlationId);
                validLogoutRequest.postLogoutRedirectUri = UrlString.getAbsoluteUrl(BrowserUtils.getCurrentUri(), BrowserUtils.getCurrentUri());
            }
        }
        else {
            this.logger.verbose("postLogoutRedirectUri passed as null, not setting post logout redirect uri", validLogoutRequest.correlationId);
        }
        return validLogoutRequest;
    };
    /**
     * Parses login_hint ID Token Claim out of AccountInfo object to be used as
     * logout_hint in end session request.
     * @param account
     */
    StandardInteractionClient.prototype.getLogoutHintFromIdTokenClaims = function (account) {
        var idTokenClaims = account.idTokenClaims;
        if (idTokenClaims) {
            if (idTokenClaims.login_hint) {
                return idTokenClaims.login_hint;
            }
            else {
                this.logger.verbose("The ID Token Claims tied to the provided account do not contain a login_hint claim, logoutHint will not be added to logout request");
            }
        }
        else {
            this.logger.verbose("The provided account does not contain ID Token Claims, logoutHint will not be added to logout request");
        }
        return null;
    };
    /**
     * Creates an Authorization Code Client with the given authority, or the default authority.
     * @param serverTelemetryManager
     * @param authorityUrl
     */
    StandardInteractionClient.prototype.createAuthCodeClient = function (serverTelemetryManager, authorityUrl, requestAzureCloudOptions) {
        return __awaiter$1(this, void 0, void 0, function () {
            var clientConfig;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.getClientConfiguration(serverTelemetryManager, authorityUrl, requestAzureCloudOptions)];
                    case 1:
                        clientConfig = _a.sent();
                        return [2 /*return*/, new AuthorizationCodeClient(clientConfig)];
                }
            });
        });
    };
    /**
     * Creates a Client Configuration object with the given request authority, or the default authority.
     * @param serverTelemetryManager
     * @param requestAuthority
     * @param requestCorrelationId
     */
    StandardInteractionClient.prototype.getClientConfiguration = function (serverTelemetryManager, requestAuthority, requestAzureCloudOptions) {
        return __awaiter$1(this, void 0, void 0, function () {
            var discoveredAuthority;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.verbose("getClientConfiguration called", this.correlationId);
                        return [4 /*yield*/, this.getDiscoveredAuthority(requestAuthority, requestAzureCloudOptions)];
                    case 1:
                        discoveredAuthority = _a.sent();
                        return [2 /*return*/, {
                                authOptions: {
                                    clientId: this.config.auth.clientId,
                                    authority: discoveredAuthority,
                                    clientCapabilities: this.config.auth.clientCapabilities
                                },
                                systemOptions: {
                                    tokenRenewalOffsetSeconds: this.config.system.tokenRenewalOffsetSeconds,
                                    preventCorsPreflight: true
                                },
                                loggerOptions: {
                                    loggerCallback: this.config.system.loggerOptions.loggerCallback,
                                    piiLoggingEnabled: this.config.system.loggerOptions.piiLoggingEnabled,
                                    logLevel: this.config.system.loggerOptions.logLevel,
                                    correlationId: this.correlationId
                                },
                                cryptoInterface: this.browserCrypto,
                                networkInterface: this.networkClient,
                                storageInterface: this.browserStorage,
                                serverTelemetryManager: serverTelemetryManager,
                                libraryInfo: {
                                    sku: BrowserConstants.MSAL_SKU,
                                    version: version,
                                    cpu: Constants.EMPTY_STRING,
                                    os: Constants.EMPTY_STRING
                                },
                                telemetry: this.config.telemetry
                            }];
                }
            });
        });
    };
    /**
     * @param hash
     * @param interactionType
     */
    StandardInteractionClient.prototype.validateAndExtractStateFromHash = function (serverParams, interactionType, requestCorrelationId) {
        this.logger.verbose("validateAndExtractStateFromHash called", requestCorrelationId);
        if (!serverParams.state) {
            throw BrowserAuthError.createHashDoesNotContainStateError();
        }
        var platformStateObj = BrowserProtocolUtils.extractBrowserRequestState(this.browserCrypto, serverParams.state);
        if (!platformStateObj) {
            throw BrowserAuthError.createUnableToParseStateError();
        }
        if (platformStateObj.interactionType !== interactionType) {
            throw BrowserAuthError.createStateInteractionTypeMismatchError();
        }
        this.logger.verbose("Returning state from hash", requestCorrelationId);
        return serverParams.state;
    };
    /**
     * Used to get a discovered version of the default authority.
     * @param requestAuthority
     * @param requestCorrelationId
     */
    StandardInteractionClient.prototype.getDiscoveredAuthority = function (requestAuthority, requestAzureCloudOptions) {
        return __awaiter$1(this, void 0, void 0, function () {
            var getAuthorityMeasurement, authorityOptions, userAuthority, builtAuthority;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.verbose("getDiscoveredAuthority called", this.correlationId);
                        getAuthorityMeasurement = this.performanceClient.startMeasurement(exports.PerformanceEvents.StandardInteractionClientGetDiscoveredAuthority, this.correlationId);
                        authorityOptions = {
                            protocolMode: this.config.auth.protocolMode,
                            knownAuthorities: this.config.auth.knownAuthorities,
                            cloudDiscoveryMetadata: this.config.auth.cloudDiscoveryMetadata,
                            authorityMetadata: this.config.auth.authorityMetadata,
                            skipAuthorityMetadataCache: this.config.auth.skipAuthorityMetadataCache
                        };
                        userAuthority = requestAuthority ? requestAuthority : this.config.auth.authority;
                        builtAuthority = Authority.generateAuthority(userAuthority, requestAzureCloudOptions || this.config.auth.azureCloudOptions);
                        this.logger.verbose("Creating discovered authority with configured authority", this.correlationId);
                        return [4 /*yield*/, AuthorityFactory.createDiscoveredInstance(builtAuthority, this.config.system.networkClient, this.browserStorage, authorityOptions)
                                .then(function (result) {
                                getAuthorityMeasurement.endMeasurement({
                                    success: true
                                });
                                return result;
                            })
                                .catch(function (error) {
                                getAuthorityMeasurement.endMeasurement({
                                    errorCode: error.errorCode,
                                    subErrorCode: error.subError,
                                    success: false
                                });
                                throw error;
                            })];
                    case 1: return [2 /*return*/, _a.sent()];
                }
            });
        });
    };
    /**
     * Helper to initialize required request parameters for interactive APIs and ssoSilent()
     * @param request
     * @param interactionType
     */
    StandardInteractionClient.prototype.initializeAuthorizationRequest = function (request, interactionType) {
        return __awaiter$1(this, void 0, void 0, function () {
            var redirectUri, browserState, state, validatedRequest, _a, account, legacyLoginHint;
            return __generator$1(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        this.logger.verbose("initializeAuthorizationRequest called", this.correlationId);
                        redirectUri = this.getRedirectUri(request.redirectUri);
                        browserState = {
                            interactionType: interactionType
                        };
                        state = ProtocolUtils.setRequestState(this.browserCrypto, (request && request.state) || Constants.EMPTY_STRING, browserState);
                        _a = [{}];
                        return [4 /*yield*/, this.initializeBaseRequest(request)];
                    case 1:
                        validatedRequest = __assign$1.apply(void 0, [__assign$1.apply(void 0, _a.concat([_b.sent()])), { redirectUri: redirectUri, state: state, nonce: request.nonce || this.browserCrypto.createNewGuid(), responseMode: ResponseMode.FRAGMENT }]);
                        account = request.account || this.browserStorage.getActiveAccount();
                        if (account) {
                            this.logger.verbose("Setting validated request account", this.correlationId);
                            this.logger.verbosePii("Setting validated request account: " + account.homeAccountId, this.correlationId);
                            validatedRequest.account = account;
                        }
                        // Check for ADAL/MSAL v1 SSO
                        if (StringUtils.isEmpty(validatedRequest.loginHint) && !account) {
                            legacyLoginHint = this.browserStorage.getLegacyLoginHint();
                            if (legacyLoginHint) {
                                validatedRequest.loginHint = legacyLoginHint;
                            }
                        }
                        return [2 /*return*/, validatedRequest];
                }
            });
        });
    };
    return StandardInteractionClient;
}(BaseInteractionClient));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Abstract class which defines operations for a browser interaction handling class.
 */
var InteractionHandler = /** @class */ (function () {
    function InteractionHandler(authCodeModule, storageImpl, authCodeRequest, logger) {
        this.authModule = authCodeModule;
        this.browserStorage = storageImpl;
        this.authCodeRequest = authCodeRequest;
        this.logger = logger;
    }
    /**
     * Function to handle response parameters from hash.
     * @param locationHash
     */
    InteractionHandler.prototype.handleCodeResponseFromHash = function (locationHash, state, authority, networkModule) {
        return __awaiter$1(this, void 0, void 0, function () {
            var stateKey, requestState, authCodeResponse;
            return __generator$1(this, function (_a) {
                this.logger.verbose("InteractionHandler.handleCodeResponse called");
                // Check that location hash isn't empty.
                if (StringUtils.isEmpty(locationHash)) {
                    throw BrowserAuthError.createEmptyHashError(locationHash);
                }
                stateKey = this.browserStorage.generateStateKey(state);
                requestState = this.browserStorage.getTemporaryCache(stateKey);
                if (!requestState) {
                    throw ClientAuthError.createStateNotFoundError("Cached State");
                }
                try {
                    authCodeResponse = this.authModule.handleFragmentResponse(locationHash, requestState);
                }
                catch (e) {
                    if (e instanceof ServerError && e.subError === BrowserAuthErrorMessage.userCancelledError.code) {
                        // Translate server error caused by user closing native prompt to corresponding first class MSAL error
                        throw BrowserAuthError.createUserCancelledError();
                    }
                    else {
                        throw e;
                    }
                }
                return [2 /*return*/, this.handleCodeResponseFromServer(authCodeResponse, state, authority, networkModule)];
            });
        });
    };
    /**
     * Process auth code response from AAD
     * @param authCodeResponse
     * @param state
     * @param authority
     * @param networkModule
     * @returns
     */
    InteractionHandler.prototype.handleCodeResponseFromServer = function (authCodeResponse, state, authority, networkModule, validateNonce) {
        if (validateNonce === void 0) { validateNonce = true; }
        return __awaiter$1(this, void 0, void 0, function () {
            var stateKey, requestState, nonceKey, cachedNonce, cachedCcsCred, tokenResponse;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.trace("InteractionHandler.handleCodeResponseFromServer called");
                        stateKey = this.browserStorage.generateStateKey(state);
                        requestState = this.browserStorage.getTemporaryCache(stateKey);
                        if (!requestState) {
                            throw ClientAuthError.createStateNotFoundError("Cached State");
                        }
                        nonceKey = this.browserStorage.generateNonceKey(requestState);
                        cachedNonce = this.browserStorage.getTemporaryCache(nonceKey);
                        // Assign code to request
                        this.authCodeRequest.code = authCodeResponse.code;
                        if (!authCodeResponse.cloud_instance_host_name) return [3 /*break*/, 2];
                        return [4 /*yield*/, this.updateTokenEndpointAuthority(authCodeResponse.cloud_instance_host_name, authority, networkModule)];
                    case 1:
                        _a.sent();
                        _a.label = 2;
                    case 2:
                        // Nonce validation not needed when redirect not involved (e.g. hybrid spa, renewing token via rt)
                        if (validateNonce) {
                            authCodeResponse.nonce = cachedNonce || undefined;
                        }
                        authCodeResponse.state = requestState;
                        // Add CCS parameters if available
                        if (authCodeResponse.client_info) {
                            this.authCodeRequest.clientInfo = authCodeResponse.client_info;
                        }
                        else {
                            cachedCcsCred = this.checkCcsCredentials();
                            if (cachedCcsCred) {
                                this.authCodeRequest.ccsCredential = cachedCcsCred;
                            }
                        }
                        return [4 /*yield*/, this.authModule.acquireToken(this.authCodeRequest, authCodeResponse)];
                    case 3:
                        tokenResponse = _a.sent();
                        this.browserStorage.cleanRequestByState(state);
                        return [2 /*return*/, tokenResponse];
                }
            });
        });
    };
    /**
     * Updates authority based on cloudInstanceHostname
     * @param cloudInstanceHostname
     * @param authority
     * @param networkModule
     */
    InteractionHandler.prototype.updateTokenEndpointAuthority = function (cloudInstanceHostname, authority, networkModule) {
        return __awaiter$1(this, void 0, void 0, function () {
            var cloudInstanceAuthorityUri, cloudInstanceAuthority;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        cloudInstanceAuthorityUri = "https://" + cloudInstanceHostname + "/" + authority.tenant + "/";
                        return [4 /*yield*/, AuthorityFactory.createDiscoveredInstance(cloudInstanceAuthorityUri, networkModule, this.browserStorage, authority.options)];
                    case 1:
                        cloudInstanceAuthority = _a.sent();
                        this.authModule.updateAuthority(cloudInstanceAuthority);
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Looks up ccs creds in the cache
     */
    InteractionHandler.prototype.checkCcsCredentials = function () {
        // Look up ccs credential in temp cache
        var cachedCcsCred = this.browserStorage.getTemporaryCache(TemporaryCacheKeys.CCS_CREDENTIAL, true);
        if (cachedCcsCred) {
            try {
                return JSON.parse(cachedCcsCred);
            }
            catch (e) {
                this.authModule.logger.error("Cache credential could not be parsed");
                this.authModule.logger.errorPii("Cache credential could not be parsed: " + cachedCcsCred);
            }
        }
        return null;
    };
    return InteractionHandler;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var RedirectHandler = /** @class */ (function (_super) {
    __extends$1(RedirectHandler, _super);
    function RedirectHandler(authCodeModule, storageImpl, authCodeRequest, logger, browserCrypto) {
        var _this = _super.call(this, authCodeModule, storageImpl, authCodeRequest, logger) || this;
        _this.browserCrypto = browserCrypto;
        return _this;
    }
    /**
     * Redirects window to given URL.
     * @param urlNavigate
     */
    RedirectHandler.prototype.initiateAuthRequest = function (requestUrl, params) {
        return __awaiter$1(this, void 0, void 0, function () {
            var navigationOptions, navigate;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.verbose("RedirectHandler.initiateAuthRequest called");
                        if (!!StringUtils.isEmpty(requestUrl)) return [3 /*break*/, 7];
                        // Cache start page, returns to this page after redirectUri if navigateToLoginRequestUrl is true
                        if (params.redirectStartPage) {
                            this.logger.verbose("RedirectHandler.initiateAuthRequest: redirectStartPage set, caching start page");
                            this.browserStorage.setTemporaryCache(TemporaryCacheKeys.ORIGIN_URI, params.redirectStartPage, true);
                        }
                        // Set interaction status in the library.
                        this.browserStorage.setTemporaryCache(TemporaryCacheKeys.CORRELATION_ID, this.authCodeRequest.correlationId, true);
                        this.browserStorage.cacheCodeRequest(this.authCodeRequest, this.browserCrypto);
                        this.logger.infoPii("RedirectHandler.initiateAuthRequest: Navigate to: " + requestUrl);
                        navigationOptions = {
                            apiId: exports.ApiId.acquireTokenRedirect,
                            timeout: params.redirectTimeout,
                            noHistory: false
                        };
                        if (!(typeof params.onRedirectNavigate === "function")) return [3 /*break*/, 4];
                        this.logger.verbose("RedirectHandler.initiateAuthRequest: Invoking onRedirectNavigate callback");
                        navigate = params.onRedirectNavigate(requestUrl);
                        if (!(navigate !== false)) return [3 /*break*/, 2];
                        this.logger.verbose("RedirectHandler.initiateAuthRequest: onRedirectNavigate did not return false, navigating");
                        return [4 /*yield*/, params.navigationClient.navigateExternal(requestUrl, navigationOptions)];
                    case 1:
                        _a.sent();
                        return [2 /*return*/];
                    case 2:
                        this.logger.verbose("RedirectHandler.initiateAuthRequest: onRedirectNavigate returned false, stopping navigation");
                        return [2 /*return*/];
                    case 3: return [3 /*break*/, 6];
                    case 4:
                        // Navigate window to request URL
                        this.logger.verbose("RedirectHandler.initiateAuthRequest: Navigating window to navigate url");
                        return [4 /*yield*/, params.navigationClient.navigateExternal(requestUrl, navigationOptions)];
                    case 5:
                        _a.sent();
                        return [2 /*return*/];
                    case 6: return [3 /*break*/, 8];
                    case 7:
                        // Throw error if request URL is empty.
                        this.logger.info("RedirectHandler.initiateAuthRequest: Navigate url is empty");
                        throw BrowserAuthError.createEmptyNavigationUriError();
                    case 8: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Handle authorization code response in the window.
     * @param hash
     */
    RedirectHandler.prototype.handleCodeResponseFromHash = function (locationHash, state, authority, networkModule) {
        return __awaiter$1(this, void 0, void 0, function () {
            var stateKey, requestState, authCodeResponse, nonceKey, cachedNonce, cachedCcsCred, tokenResponse;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.verbose("RedirectHandler.handleCodeResponse called");
                        // Check that location hash isn't empty.
                        if (StringUtils.isEmpty(locationHash)) {
                            throw BrowserAuthError.createEmptyHashError(locationHash);
                        }
                        // Interaction is completed - remove interaction status.
                        this.browserStorage.setInteractionInProgress(false);
                        stateKey = this.browserStorage.generateStateKey(state);
                        requestState = this.browserStorage.getTemporaryCache(stateKey);
                        if (!requestState) {
                            throw ClientAuthError.createStateNotFoundError("Cached State");
                        }
                        try {
                            authCodeResponse = this.authModule.handleFragmentResponse(locationHash, requestState);
                        }
                        catch (e) {
                            if (e instanceof ServerError && e.subError === BrowserAuthErrorMessage.userCancelledError.code) {
                                // Translate server error caused by user closing native prompt to corresponding first class MSAL error
                                throw BrowserAuthError.createUserCancelledError();
                            }
                            else {
                                throw e;
                            }
                        }
                        nonceKey = this.browserStorage.generateNonceKey(requestState);
                        cachedNonce = this.browserStorage.getTemporaryCache(nonceKey);
                        // Assign code to request
                        this.authCodeRequest.code = authCodeResponse.code;
                        if (!authCodeResponse.cloud_instance_host_name) return [3 /*break*/, 2];
                        return [4 /*yield*/, this.updateTokenEndpointAuthority(authCodeResponse.cloud_instance_host_name, authority, networkModule)];
                    case 1:
                        _a.sent();
                        _a.label = 2;
                    case 2:
                        authCodeResponse.nonce = cachedNonce || undefined;
                        authCodeResponse.state = requestState;
                        // Add CCS parameters if available
                        if (authCodeResponse.client_info) {
                            this.authCodeRequest.clientInfo = authCodeResponse.client_info;
                        }
                        else {
                            cachedCcsCred = this.checkCcsCredentials();
                            if (cachedCcsCred) {
                                this.authCodeRequest.ccsCredential = cachedCcsCred;
                            }
                        }
                        return [4 /*yield*/, this.authModule.acquireToken(this.authCodeRequest, authCodeResponse)];
                    case 3:
                        tokenResponse = _a.sent();
                        this.browserStorage.cleanRequestByState(state);
                        return [2 /*return*/, tokenResponse];
                }
            });
        });
    };
    return RedirectHandler;
}(InteractionHandler));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
exports.EventType = void 0;
(function (EventType) {
    EventType["INITIALIZE_START"] = "msal:initializeStart";
    EventType["INITIALIZE_END"] = "msal:initializeEnd";
    EventType["ACCOUNT_ADDED"] = "msal:accountAdded";
    EventType["ACCOUNT_REMOVED"] = "msal:accountRemoved";
    EventType["LOGIN_START"] = "msal:loginStart";
    EventType["LOGIN_SUCCESS"] = "msal:loginSuccess";
    EventType["LOGIN_FAILURE"] = "msal:loginFailure";
    EventType["ACQUIRE_TOKEN_START"] = "msal:acquireTokenStart";
    EventType["ACQUIRE_TOKEN_SUCCESS"] = "msal:acquireTokenSuccess";
    EventType["ACQUIRE_TOKEN_FAILURE"] = "msal:acquireTokenFailure";
    EventType["ACQUIRE_TOKEN_NETWORK_START"] = "msal:acquireTokenFromNetworkStart";
    EventType["SSO_SILENT_START"] = "msal:ssoSilentStart";
    EventType["SSO_SILENT_SUCCESS"] = "msal:ssoSilentSuccess";
    EventType["SSO_SILENT_FAILURE"] = "msal:ssoSilentFailure";
    EventType["ACQUIRE_TOKEN_BY_CODE_START"] = "msal:acquireTokenByCodeStart";
    EventType["ACQUIRE_TOKEN_BY_CODE_SUCCESS"] = "msal:acquireTokenByCodeSuccess";
    EventType["ACQUIRE_TOKEN_BY_CODE_FAILURE"] = "msal:acquireTokenByCodeFailure";
    EventType["HANDLE_REDIRECT_START"] = "msal:handleRedirectStart";
    EventType["HANDLE_REDIRECT_END"] = "msal:handleRedirectEnd";
    EventType["POPUP_OPENED"] = "msal:popupOpened";
    EventType["LOGOUT_START"] = "msal:logoutStart";
    EventType["LOGOUT_SUCCESS"] = "msal:logoutSuccess";
    EventType["LOGOUT_FAILURE"] = "msal:logoutFailure";
    EventType["LOGOUT_END"] = "msal:logoutEnd";
})(exports.EventType || (exports.EventType = {}));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var NativeStatusCode;
(function (NativeStatusCode) {
    NativeStatusCode["USER_INTERACTION_REQUIRED"] = "USER_INTERACTION_REQUIRED";
    NativeStatusCode["USER_CANCEL"] = "USER_CANCEL";
    NativeStatusCode["NO_NETWORK"] = "NO_NETWORK";
    NativeStatusCode["TRANSIENT_ERROR"] = "TRANSIENT_ERROR";
    NativeStatusCode["PERSISTENT_ERROR"] = "PERSISTENT_ERROR";
    NativeStatusCode["DISABLED"] = "DISABLED";
    NativeStatusCode["ACCOUNT_UNAVAILABLE"] = "ACCOUNT_UNAVAILABLE";
})(NativeStatusCode || (NativeStatusCode = {}));
var NativeAuthErrorMessage = {
    extensionError: {
        code: "ContentError"
    },
    userSwitch: {
        code: "user_switch",
        desc: "User attempted to switch accounts in the native broker, which is not allowed. All new accounts must sign-in through the standard web flow first, please try again."
    },
    tokensNotFoundInCache: {
        code: "tokens_not_found_in_internal_memory_cache",
        desc: "Tokens not cached in MSAL JS internal memory, please make the WAM request"
    }
};
var NativeAuthError = /** @class */ (function (_super) {
    __extends$1(NativeAuthError, _super);
    function NativeAuthError(errorCode, description, ext) {
        var _this = _super.call(this, errorCode, description) || this;
        Object.setPrototypeOf(_this, NativeAuthError.prototype);
        _this.name = "NativeAuthError";
        _this.ext = ext;
        return _this;
    }
    /**
     * These errors should result in a fallback to the 'standard' browser based auth flow.
     */
    NativeAuthError.prototype.isFatal = function () {
        if (this.ext && this.ext.status && (this.ext.status === NativeStatusCode.PERSISTENT_ERROR || this.ext.status === NativeStatusCode.DISABLED)) {
            return true;
        }
        switch (this.errorCode) {
            case NativeAuthErrorMessage.extensionError.code:
                return true;
            default:
                return false;
        }
    };
    /**
     * Create the appropriate error object based on the WAM status code.
     * @param code
     * @param description
     * @param ext
     * @returns
     */
    NativeAuthError.createError = function (code, description, ext) {
        if (ext && ext.status) {
            switch (ext.status) {
                case NativeStatusCode.ACCOUNT_UNAVAILABLE:
                    return InteractionRequiredAuthError.createNativeAccountUnavailableError();
                case NativeStatusCode.USER_INTERACTION_REQUIRED:
                    return new InteractionRequiredAuthError(code, description);
                case NativeStatusCode.USER_CANCEL:
                    return BrowserAuthError.createUserCancelledError();
                case NativeStatusCode.NO_NETWORK:
                    return BrowserAuthError.createNoNetworkConnectivityError();
            }
        }
        return new NativeAuthError(code, description, ext);
    };
    /**
     * Creates user switch error when the user chooses a different account in the native broker prompt
     * @returns
     */
    NativeAuthError.createUserSwitchError = function () {
        return new NativeAuthError(NativeAuthErrorMessage.userSwitch.code, NativeAuthErrorMessage.userSwitch.desc);
    };
    /**
     * Creates a tokens not found error when the internal cache look up fails
     * @returns NativeAuthError: tokensNotFoundInCache
     */
    NativeAuthError.createTokensNotFoundInCacheError = function () {
        return new NativeAuthError(NativeAuthErrorMessage.tokensNotFoundInCache.code, NativeAuthErrorMessage.tokensNotFoundInCache.desc);
    };
    return NativeAuthError;
}(AuthError));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var SilentCacheClient = /** @class */ (function (_super) {
    __extends$1(SilentCacheClient, _super);
    function SilentCacheClient() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    /**
     * Returns unexpired tokens from the cache, if available
     * @param silentRequest
     */
    SilentCacheClient.prototype.acquireToken = function (silentRequest) {
        return __awaiter$1(this, void 0, void 0, function () {
            var acquireTokenMeasurement, serverTelemetryManager, silentAuthClient, cachedToken, error_1;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        acquireTokenMeasurement = this.performanceClient.startMeasurement(exports.PerformanceEvents.SilentCacheClientAcquireToken, silentRequest.correlationId);
                        serverTelemetryManager = this.initializeServerTelemetryManager(exports.ApiId.acquireTokenSilent_silentFlow);
                        return [4 /*yield*/, this.createSilentFlowClient(serverTelemetryManager, silentRequest.authority, silentRequest.azureCloudOptions)];
                    case 1:
                        silentAuthClient = _a.sent();
                        this.logger.verbose("Silent auth client created");
                        _a.label = 2;
                    case 2:
                        _a.trys.push([2, 4, , 5]);
                        return [4 /*yield*/, silentAuthClient.acquireCachedToken(silentRequest)];
                    case 3:
                        cachedToken = _a.sent();
                        acquireTokenMeasurement.endMeasurement({
                            success: true,
                            fromCache: true
                        });
                        return [2 /*return*/, cachedToken];
                    case 4:
                        error_1 = _a.sent();
                        if (error_1 instanceof BrowserAuthError && error_1.errorCode === BrowserAuthErrorMessage.signingKeyNotFoundInStorage.code) {
                            this.logger.verbose("Signing keypair for bound access token not found. Refreshing bound access token and generating a new crypto keypair.");
                        }
                        acquireTokenMeasurement.endMeasurement({
                            errorCode: error_1 instanceof AuthError && error_1.errorCode || undefined,
                            subErrorCode: error_1 instanceof AuthError && error_1.subError || undefined,
                            success: false
                        });
                        throw error_1;
                    case 5: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Currently Unsupported
     */
    SilentCacheClient.prototype.logout = function () {
        // Synchronous so we must reject
        return Promise.reject(BrowserAuthError.createSilentLogoutUnsupportedError());
    };
    /**
     * Creates an Silent Flow Client with the given authority, or the default authority.
     * @param serverTelemetryManager
     * @param authorityUrl
     */
    SilentCacheClient.prototype.createSilentFlowClient = function (serverTelemetryManager, authorityUrl, azureCloudOptions) {
        return __awaiter$1(this, void 0, void 0, function () {
            var clientConfig;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.getClientConfiguration(serverTelemetryManager, authorityUrl, azureCloudOptions)];
                    case 1:
                        clientConfig = _a.sent();
                        return [2 /*return*/, new SilentFlowClient(clientConfig, this.performanceClient)];
                }
            });
        });
    };
    SilentCacheClient.prototype.initializeSilentRequest = function (request, account) {
        return __awaiter$1(this, void 0, void 0, function () {
            var _a;
            return __generator$1(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        _a = [__assign$1({}, request)];
                        return [4 /*yield*/, this.initializeBaseRequest(request)];
                    case 1: return [2 /*return*/, __assign$1.apply(void 0, [__assign$1.apply(void 0, _a.concat([_b.sent()])), { account: account, forceRefresh: request.forceRefresh || false }])];
                }
            });
        });
    };
    return SilentCacheClient;
}(StandardInteractionClient));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var NativeInteractionClient = /** @class */ (function (_super) {
    __extends$1(NativeInteractionClient, _super);
    function NativeInteractionClient(config, browserStorage, browserCrypto, logger, eventHandler, navigationClient, apiId, performanceClient, provider, accountId, nativeStorageImpl, correlationId) {
        var _this = _super.call(this, config, browserStorage, browserCrypto, logger, eventHandler, navigationClient, performanceClient, provider, correlationId) || this;
        _this.apiId = apiId;
        _this.accountId = accountId;
        _this.nativeMessageHandler = provider;
        _this.nativeStorageManager = nativeStorageImpl;
        _this.silentCacheClient = new SilentCacheClient(config, _this.nativeStorageManager, browserCrypto, logger, eventHandler, navigationClient, performanceClient, provider, correlationId);
        return _this;
    }
    /**
     * Acquire token from native platform via browser extension
     * @param request
     */
    NativeInteractionClient.prototype.acquireToken = function (request) {
        return __awaiter$1(this, void 0, void 0, function () {
            var nativeATMeasurement, reqTimestamp, nativeRequest, result, messageBody, response, validatedResponse;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.trace("NativeInteractionClient - acquireToken called.");
                        nativeATMeasurement = this.performanceClient.startMeasurement(exports.PerformanceEvents.NativeInteractionClientAcquireToken, request.correlationId);
                        reqTimestamp = TimeUtils.nowSeconds();
                        return [4 /*yield*/, this.initializeNativeRequest(request)];
                    case 1:
                        nativeRequest = _a.sent();
                        _a.label = 2;
                    case 2:
                        _a.trys.push([2, 4, , 5]);
                        return [4 /*yield*/, this.acquireTokensFromCache(this.accountId, nativeRequest)];
                    case 3:
                        result = _a.sent();
                        nativeATMeasurement.endMeasurement({
                            success: true,
                            isNativeBroker: true,
                            fromCache: true
                        });
                        return [2 /*return*/, result];
                    case 4:
                        _a.sent();
                        // continue with a native call for any and all errors
                        this.logger.info("MSAL internal Cache does not contain tokens, proceed to make a native call");
                        return [3 /*break*/, 5];
                    case 5:
                        messageBody = {
                            method: NativeExtensionMethod.GetToken,
                            request: nativeRequest
                        };
                        return [4 /*yield*/, this.nativeMessageHandler.sendMessage(messageBody)];
                    case 6:
                        response = _a.sent();
                        validatedResponse = this.validateNativeResponse(response);
                        return [2 /*return*/, this.handleNativeResponse(validatedResponse, nativeRequest, reqTimestamp)
                                .then(function (result) {
                                nativeATMeasurement.endMeasurement({
                                    success: true,
                                    isNativeBroker: true
                                });
                                return result;
                            })
                                .catch(function (error) {
                                nativeATMeasurement.endMeasurement({
                                    success: false,
                                    errorCode: error.errorCode,
                                    subErrorCode: error.subError,
                                    isNativeBroker: true
                                });
                                throw error;
                            })];
                }
            });
        });
    };
    /**
     * Creates silent flow request
     * @param request
     * @param cachedAccount
     * @returns CommonSilentFlowRequest
     */
    NativeInteractionClient.prototype.createSilentCacheRequest = function (request, cachedAccount) {
        return {
            authority: request.authority,
            correlationId: this.correlationId,
            scopes: ScopeSet.fromString(request.scope).asArray(),
            account: cachedAccount,
            forceRefresh: false,
        };
    };
    /**
     * Fetches the tokens from the cache if un-expired
     * @param nativeAccountId
     * @param request
     * @returns authenticationResult
     */
    NativeInteractionClient.prototype.acquireTokensFromCache = function (nativeAccountId, request) {
        return __awaiter$1(this, void 0, void 0, function () {
            var accountEntity, account, silentRequest, result, e_2;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        accountEntity = this.browserStorage.readAccountFromCacheWithNativeAccountId(nativeAccountId);
                        if (!accountEntity) {
                            throw ClientAuthError.createNoAccountFoundError();
                        }
                        account = accountEntity.getAccountInfo();
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        silentRequest = this.createSilentCacheRequest(request, account);
                        return [4 /*yield*/, this.silentCacheClient.acquireToken(silentRequest)];
                    case 2:
                        result = _a.sent();
                        return [2 /*return*/, result];
                    case 3:
                        e_2 = _a.sent();
                        throw e_2;
                    case 4: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Acquires a token from native platform then redirects to the redirectUri instead of returning the response
     * @param request
     */
    NativeInteractionClient.prototype.acquireTokenRedirect = function (request) {
        return __awaiter$1(this, void 0, void 0, function () {
            var nativeRequest, messageBody, response, e_3, navigationOptions, redirectUri;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.trace("NativeInteractionClient - acquireTokenRedirect called.");
                        return [4 /*yield*/, this.initializeNativeRequest(request)];
                    case 1:
                        nativeRequest = _a.sent();
                        messageBody = {
                            method: NativeExtensionMethod.GetToken,
                            request: nativeRequest
                        };
                        _a.label = 2;
                    case 2:
                        _a.trys.push([2, 4, , 5]);
                        return [4 /*yield*/, this.nativeMessageHandler.sendMessage(messageBody)];
                    case 3:
                        response = _a.sent();
                        this.validateNativeResponse(response);
                        return [3 /*break*/, 5];
                    case 4:
                        e_3 = _a.sent();
                        // Only throw fatal errors here to allow application to fallback to regular redirect. Otherwise proceed and the error will be thrown in handleRedirectPromise
                        if (e_3 instanceof NativeAuthError && e_3.isFatal()) {
                            throw e_3;
                        }
                        return [3 /*break*/, 5];
                    case 5:
                        this.browserStorage.setTemporaryCache(TemporaryCacheKeys.NATIVE_REQUEST, JSON.stringify(nativeRequest), true);
                        navigationOptions = {
                            apiId: exports.ApiId.acquireTokenRedirect,
                            timeout: this.config.system.redirectNavigationTimeout,
                            noHistory: false
                        };
                        redirectUri = this.config.auth.navigateToLoginRequestUrl ? window.location.href : this.getRedirectUri(request.redirectUri);
                        return [4 /*yield*/, this.navigationClient.navigateExternal(redirectUri, navigationOptions)];
                    case 6:
                        _a.sent(); // Need to treat this as external to ensure handleRedirectPromise is run again
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * If the previous page called native platform for a token using redirect APIs, send the same request again and return the response
     */
    NativeInteractionClient.prototype.handleRedirectPromise = function () {
        return __awaiter$1(this, void 0, void 0, function () {
            var cachedRequest, messageBody, reqTimestamp, response, result, e_4;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.trace("NativeInteractionClient - handleRedirectPromise called.");
                        if (!this.browserStorage.isInteractionInProgress(true)) {
                            this.logger.info("handleRedirectPromise called but there is no interaction in progress, returning null.");
                            return [2 /*return*/, null];
                        }
                        cachedRequest = this.browserStorage.getCachedNativeRequest();
                        if (!cachedRequest) {
                            this.logger.verbose("NativeInteractionClient - handleRedirectPromise called but there is no cached request, returning null.");
                            return [2 /*return*/, null];
                        }
                        this.browserStorage.removeItem(this.browserStorage.generateCacheKey(TemporaryCacheKeys.NATIVE_REQUEST));
                        messageBody = {
                            method: NativeExtensionMethod.GetToken,
                            request: cachedRequest
                        };
                        reqTimestamp = TimeUtils.nowSeconds();
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        this.logger.verbose("NativeInteractionClient - handleRedirectPromise sending message to native broker.");
                        return [4 /*yield*/, this.nativeMessageHandler.sendMessage(messageBody)];
                    case 2:
                        response = _a.sent();
                        this.validateNativeResponse(response);
                        result = this.handleNativeResponse(response, cachedRequest, reqTimestamp);
                        this.browserStorage.setInteractionInProgress(false);
                        return [2 /*return*/, result];
                    case 3:
                        e_4 = _a.sent();
                        this.browserStorage.setInteractionInProgress(false);
                        throw e_4;
                    case 4: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Logout from native platform via browser extension
     * @param request
     */
    NativeInteractionClient.prototype.logout = function () {
        this.logger.trace("NativeInteractionClient - logout called.");
        return Promise.reject("Logout not implemented yet");
    };
    /**
     * Transform response from native platform into AuthenticationResult object which will be returned to the end user
     * @param response
     * @param request
     * @param reqTimestamp
     */
    NativeInteractionClient.prototype.handleNativeResponse = function (response, request, reqTimestamp) {
        return __awaiter$1(this, void 0, void 0, function () {
            var idTokenObj, authority, authorityPreferredCache, homeAccountIdentifier, accountEntity, responseScopes, accountProperties, uid, tid, responseAccessToken, responseTokenType, _a, popTokenGenerator, shrParameters, mats, result, idTokenEntity, expiresIn, tokenExpirationSeconds, accessTokenEntity;
            var _this = this;
            return __generator$1(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        this.logger.trace("NativeInteractionClient - handleNativeResponse called.");
                        if (response.account.id !== request.accountId) {
                            // User switch in native broker prompt is not supported. All users must first sign in through web flow to ensure server state is in sync
                            throw NativeAuthError.createUserSwitchError();
                        }
                        idTokenObj = new AuthToken(response.id_token || Constants.EMPTY_STRING, this.browserCrypto);
                        return [4 /*yield*/, this.getDiscoveredAuthority(request.authority)];
                    case 1:
                        authority = _b.sent();
                        authorityPreferredCache = authority.getPreferredCache();
                        homeAccountIdentifier = AccountEntity.generateHomeAccountId(response.client_info || Constants.EMPTY_STRING, AuthorityType.Default, this.logger, this.browserCrypto, idTokenObj);
                        accountEntity = AccountEntity.createAccount(response.client_info, homeAccountIdentifier, idTokenObj, undefined, undefined, undefined, authorityPreferredCache, response.account.id);
                        this.browserStorage.setAccount(accountEntity);
                        responseScopes = response.scope ? ScopeSet.fromString(response.scope) : ScopeSet.fromString(request.scope);
                        accountProperties = response.account.properties || {};
                        uid = accountProperties["UID"] || idTokenObj.claims.oid || idTokenObj.claims.sub || Constants.EMPTY_STRING;
                        tid = accountProperties["TenantId"] || idTokenObj.claims.tid || Constants.EMPTY_STRING;
                        responseTokenType = exports.AuthenticationScheme.BEARER;
                        _a = request.tokenType;
                        switch (_a) {
                            case exports.AuthenticationScheme.POP: return [3 /*break*/, 2];
                        }
                        return [3 /*break*/, 4];
                    case 2:
                        // Set the token type to POP in the response
                        responseTokenType = exports.AuthenticationScheme.POP;
                        // Check if native layer returned an SHR token
                        if (response.shr) {
                            this.logger.trace("handleNativeServerResponse: SHR is enabled in native layer");
                            responseAccessToken = response.shr;
                            return [3 /*break*/, 5];
                        }
                        popTokenGenerator = new PopTokenGenerator(this.browserCrypto);
                        shrParameters = {
                            resourceRequestMethod: request.resourceRequestMethod,
                            resourceRequestUri: request.resourceRequestUri,
                            shrClaims: request.shrClaims,
                            shrNonce: request.shrNonce
                        };
                        /**
                         * KeyID must be present in the native request from when the PoP key was generated in order for
                         * PopTokenGenerator to query the full key for signing
                         */
                        if (!request.keyId) {
                            throw ClientAuthError.createKeyIdMissingError();
                        }
                        return [4 /*yield*/, popTokenGenerator.signPopToken(response.access_token, request.keyId, shrParameters)];
                    case 3:
                        responseAccessToken = _b.sent();
                        return [3 /*break*/, 5];
                    case 4:
                        {
                            responseAccessToken = response.access_token;
                        }
                        _b.label = 5;
                    case 5:
                        mats = this.getMATSFromResponse(response);
                        result = {
                            authority: authority.canonicalAuthority,
                            uniqueId: uid,
                            tenantId: tid,
                            scopes: responseScopes.asArray(),
                            account: accountEntity.getAccountInfo(),
                            idToken: response.id_token,
                            idTokenClaims: idTokenObj.claims,
                            accessToken: responseAccessToken,
                            fromCache: mats ? this.isResponseFromCache(mats) : false,
                            expiresOn: new Date(Number(reqTimestamp + response.expires_in) * 1000),
                            tokenType: responseTokenType,
                            correlationId: this.correlationId,
                            state: response.state,
                            fromNativeBroker: true
                        };
                        idTokenEntity = IdTokenEntity.createIdTokenEntity(homeAccountIdentifier, request.authority, response.id_token || Constants.EMPTY_STRING, request.clientId, idTokenObj.claims.tid || Constants.EMPTY_STRING);
                        this.nativeStorageManager.setIdTokenCredential(idTokenEntity);
                        expiresIn = (responseTokenType === exports.AuthenticationScheme.POP)
                            ? Constants.SHR_NONCE_VALIDITY
                            : (typeof response.expires_in === "string"
                                ? parseInt(response.expires_in, 10)
                                : response.expires_in) || 0;
                        tokenExpirationSeconds = reqTimestamp + expiresIn;
                        accessTokenEntity = AccessTokenEntity.createAccessTokenEntity(homeAccountIdentifier, request.authority, responseAccessToken, request.clientId, tid, responseScopes.printScopes(), tokenExpirationSeconds, 0, this.browserCrypto);
                        this.nativeStorageManager.setAccessTokenCredential(accessTokenEntity);
                        // Remove any existing cached tokens for this account in browser storage
                        this.browserStorage.removeAccountContext(accountEntity).catch(function (e) {
                            _this.logger.error("Error occurred while removing account context from browser storage. " + e);
                        });
                        return [2 /*return*/, result];
                }
            });
        });
    };
    /**
     * Validates native platform response before processing
     * @param response
     */
    NativeInteractionClient.prototype.validateNativeResponse = function (response) {
        if (response.hasOwnProperty("access_token") &&
            response.hasOwnProperty("id_token") &&
            response.hasOwnProperty("client_info") &&
            response.hasOwnProperty("account") &&
            response.hasOwnProperty("scope") &&
            response.hasOwnProperty("expires_in")) {
            return response;
        }
        else {
            throw NativeAuthError.createUnexpectedError("Response missing expected properties.");
        }
    };
    /**
     * Gets MATS telemetry from native response
     * @param response
     * @returns
     */
    NativeInteractionClient.prototype.getMATSFromResponse = function (response) {
        if (response.properties.MATS) {
            try {
                return JSON.parse(response.properties.MATS);
            }
            catch (e) {
                this.logger.error("NativeInteractionClient - Error parsing MATS telemetry, returning null instead");
            }
        }
        return null;
    };
    /**
     * Returns whether or not response came from native cache
     * @param response
     * @returns
     */
    NativeInteractionClient.prototype.isResponseFromCache = function (mats) {
        if (typeof mats.is_cached === "undefined") {
            this.logger.verbose("NativeInteractionClient - MATS telemetry does not contain field indicating if response was served from cache. Returning false.");
            return false;
        }
        return !!mats.is_cached;
    };
    /**
     * Translates developer provided request object into NativeRequest object
     * @param request
     */
    NativeInteractionClient.prototype.initializeNativeRequest = function (request) {
        return __awaiter$1(this, void 0, void 0, function () {
            var authority, canonicalAuthority, scopes, remainingProperties, scopeSet, getPrompt, validatedRequest, shrParameters, popTokenGenerator, reqCnfData;
            var _this = this;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.trace("NativeInteractionClient - initializeNativeRequest called");
                        authority = request.authority || this.config.auth.authority;
                        canonicalAuthority = new UrlString(authority);
                        canonicalAuthority.validateAsUri();
                        scopes = request.scopes, remainingProperties = __rest(request, ["scopes"]);
                        scopeSet = new ScopeSet(scopes || []);
                        scopeSet.appendScopes(OIDC_DEFAULT_SCOPES);
                        getPrompt = function () {
                            // If request is silent, prompt is always none
                            switch (_this.apiId) {
                                case exports.ApiId.ssoSilent:
                                case exports.ApiId.acquireTokenSilent_silentFlow:
                                    _this.logger.trace("initializeNativeRequest: silent request sets prompt to none");
                                    return PromptValue.NONE;
                            }
                            // Prompt not provided, request may proceed and native broker decides if it needs to prompt
                            if (!request.prompt) {
                                _this.logger.trace("initializeNativeRequest: prompt was not provided");
                                return undefined;
                            }
                            // If request is interactive, check if prompt provided is allowed to go directly to native broker
                            switch (request.prompt) {
                                case PromptValue.NONE:
                                case PromptValue.CONSENT:
                                case PromptValue.LOGIN:
                                    _this.logger.trace("initializeNativeRequest: prompt is compatible with native flow");
                                    return request.prompt;
                                default:
                                    _this.logger.trace("initializeNativeRequest: prompt = " + request.prompt + " is not compatible with native flow");
                                    throw BrowserAuthError.createNativePromptParameterNotSupportedError();
                            }
                        };
                        validatedRequest = __assign$1(__assign$1({}, remainingProperties), { accountId: this.accountId, clientId: this.config.auth.clientId, authority: canonicalAuthority.urlString, scope: scopeSet.printScopes(), redirectUri: this.getRedirectUri(request.redirectUri), prompt: getPrompt(), correlationId: this.correlationId, tokenType: request.authenticationScheme, windowTitleSubstring: document.title, extraParameters: __assign$1(__assign$1(__assign$1({}, request.extraQueryParameters), request.tokenQueryParameters), { telemetry: NativeConstants.MATS_TELEMETRY }), extendedExpiryToken: false // Make this configurable?
                         });
                        if (!(request.authenticationScheme === exports.AuthenticationScheme.POP)) return [3 /*break*/, 2];
                        shrParameters = {
                            resourceRequestUri: request.resourceRequestUri,
                            resourceRequestMethod: request.resourceRequestMethod,
                            shrClaims: request.shrClaims,
                            shrNonce: request.shrNonce
                        };
                        popTokenGenerator = new PopTokenGenerator(this.browserCrypto);
                        return [4 /*yield*/, popTokenGenerator.generateCnf(shrParameters)];
                    case 1:
                        reqCnfData = _a.sent();
                        // to reduce the URL length, it is recommended to send the hash of the req_cnf instead of the whole string
                        validatedRequest.reqCnf = reqCnfData.reqCnfHash;
                        validatedRequest.keyId = reqCnfData.kid;
                        _a.label = 2;
                    case 2: return [2 /*return*/, validatedRequest];
                }
            });
        });
    };
    return NativeInteractionClient;
}(BaseInteractionClient));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var NativeMessageHandler = /** @class */ (function () {
    function NativeMessageHandler(logger, handshakeTimeoutMs, extensionId) {
        this.logger = logger;
        this.handshakeTimeoutMs = handshakeTimeoutMs;
        this.extensionId = extensionId;
        this.resolvers = new Map(); // Used for non-handshake messages
        this.handshakeResolvers = new Map(); // Used for handshake messages
        this.responseId = 0;
        this.messageChannel = new MessageChannel();
        this.windowListener = this.onWindowMessage.bind(this); // Window event callback doesn't have access to 'this' unless it's bound
    }
    /**
     * Sends a given message to the extension and resolves with the extension response
     * @param body
     */
    NativeMessageHandler.prototype.sendMessage = function (body) {
        return __awaiter$1(this, void 0, void 0, function () {
            var req;
            var _this = this;
            return __generator$1(this, function (_a) {
                this.logger.trace("NativeMessageHandler - sendMessage called.");
                req = {
                    channel: NativeConstants.CHANNEL_ID,
                    extensionId: this.extensionId,
                    responseId: this.responseId++,
                    body: body
                };
                this.logger.trace("NativeMessageHandler - Sending request to browser extension");
                this.logger.tracePii("NativeMessageHandler - Sending request to browser extension: " + JSON.stringify(req));
                this.messageChannel.port1.postMessage(req);
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        _this.resolvers.set(req.responseId, { resolve: resolve, reject: reject });
                    })];
            });
        });
    };
    /**
     * Returns an instance of the MessageHandler that has successfully established a connection with an extension
     * @param logger
     * @param handshakeTimeoutMs
     */
    NativeMessageHandler.createProvider = function (logger, handshakeTimeoutMs) {
        return __awaiter$1(this, void 0, void 0, function () {
            var preferredProvider, backupProvider;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        logger.trace("NativeMessageHandler - createProvider called.");
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 5]);
                        preferredProvider = new NativeMessageHandler(logger, handshakeTimeoutMs, NativeConstants.PREFERRED_EXTENSION_ID);
                        return [4 /*yield*/, preferredProvider.sendHandshakeRequest()];
                    case 2:
                        _a.sent();
                        return [2 /*return*/, preferredProvider];
                    case 3:
                        _a.sent();
                        backupProvider = new NativeMessageHandler(logger, handshakeTimeoutMs);
                        return [4 /*yield*/, backupProvider.sendHandshakeRequest()];
                    case 4:
                        _a.sent();
                        return [2 /*return*/, backupProvider];
                    case 5: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Send handshake request helper.
     */
    NativeMessageHandler.prototype.sendHandshakeRequest = function () {
        return __awaiter$1(this, void 0, void 0, function () {
            var req;
            var _this = this;
            return __generator$1(this, function (_a) {
                this.logger.trace("NativeMessageHandler - sendHandshakeRequest called.");
                // Register this event listener before sending handshake
                window.addEventListener("message", this.windowListener, false); // false is important, because content script message processing should work first
                req = {
                    channel: NativeConstants.CHANNEL_ID,
                    extensionId: this.extensionId,
                    responseId: this.responseId++,
                    body: {
                        method: NativeExtensionMethod.HandshakeRequest
                    }
                };
                this.messageChannel.port1.onmessage = function (event) {
                    _this.onChannelMessage(event);
                };
                window.postMessage(req, window.origin, [this.messageChannel.port2]);
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        _this.handshakeResolvers.set(req.responseId, { resolve: resolve, reject: reject });
                        _this.timeoutId = window.setTimeout(function () {
                            /*
                             * Throw an error if neither HandshakeResponse nor original Handshake request are received in a reasonable timeframe.
                             * This typically suggests an event handler stopped propagation of the Handshake request but did not respond to it on the MessageChannel port
                             */
                            window.removeEventListener("message", _this.windowListener, false);
                            _this.messageChannel.port1.close();
                            _this.messageChannel.port2.close();
                            reject(BrowserAuthError.createNativeHandshakeTimeoutError());
                            _this.handshakeResolvers.delete(req.responseId);
                        }, _this.handshakeTimeoutMs); // Use a reasonable timeout in milliseconds here
                    })];
            });
        });
    };
    /**
     * Invoked when a message is posted to the window. If a handshake request is received it means the extension is not installed.
     * @param event
     */
    NativeMessageHandler.prototype.onWindowMessage = function (event) {
        this.logger.trace("NativeMessageHandler - onWindowMessage called");
        // We only accept messages from ourselves
        if (event.source !== window) {
            return;
        }
        var request = event.data;
        if (!request.channel || request.channel !== NativeConstants.CHANNEL_ID) {
            return;
        }
        if (request.extensionId && request.extensionId !== this.extensionId) {
            return;
        }
        if (request.body.method === NativeExtensionMethod.HandshakeRequest) {
            // If we receive this message back it means no extension intercepted the request, meaning no extension supporting handshake protocol is installed
            this.logger.verbose(request.extensionId ? "Extension with id: " + request.extensionId + " not installed" : "No extension installed");
            clearTimeout(this.timeoutId);
            this.messageChannel.port1.close();
            this.messageChannel.port2.close();
            window.removeEventListener("message", this.windowListener, false);
            var handshakeResolver = this.handshakeResolvers.get(request.responseId);
            if (handshakeResolver) {
                handshakeResolver.reject(BrowserAuthError.createNativeExtensionNotInstalledError());
            }
        }
    };
    /**
     * Invoked when a message is received from the extension on the MessageChannel port
     * @param event
     */
    NativeMessageHandler.prototype.onChannelMessage = function (event) {
        this.logger.trace("NativeMessageHandler - onChannelMessage called.");
        var request = event.data;
        var resolver = this.resolvers.get(request.responseId);
        var handshakeResolver = this.handshakeResolvers.get(request.responseId);
        try {
            var method = request.body.method;
            if (method === NativeExtensionMethod.Response) {
                if (!resolver) {
                    return;
                }
                var response = request.body.response;
                this.logger.trace("NativeMessageHandler - Received response from browser extension");
                this.logger.tracePii("NativeMessageHandler - Received response from browser extension: " + JSON.stringify(response));
                if (response.status !== "Success") {
                    resolver.reject(NativeAuthError.createError(response.code, response.description, response.ext));
                }
                else if (response.result) {
                    if (response.result["code"] && response.result["description"]) {
                        resolver.reject(NativeAuthError.createError(response.result["code"], response.result["description"], response.result["ext"]));
                    }
                    else {
                        resolver.resolve(response.result);
                    }
                }
                else {
                    throw AuthError.createUnexpectedError("Event does not contain result.");
                }
                this.resolvers.delete(request.responseId);
            }
            else if (method === NativeExtensionMethod.HandshakeResponse) {
                if (!handshakeResolver) {
                    return;
                }
                clearTimeout(this.timeoutId); // Clear setTimeout
                window.removeEventListener("message", this.windowListener, false); // Remove 'No extension' listener
                this.extensionId = request.extensionId;
                this.logger.verbose("NativeMessageHandler - Received HandshakeResponse from extension: " + this.extensionId);
                handshakeResolver.resolve();
                this.handshakeResolvers.delete(request.responseId);
            }
            // Do nothing if method is not Response or HandshakeResponse
        }
        catch (err) {
            this.logger.error("Error parsing response from WAM Extension");
            this.logger.errorPii("Error parsing response from WAM Extension: " + err.toString());
            this.logger.errorPii("Unable to parse " + event);
            if (resolver) {
                resolver.reject(err);
            }
            else if (handshakeResolver) {
                handshakeResolver.reject(err);
            }
        }
    };
    /**
     * Returns boolean indicating whether or not the request should attempt to use native broker
     * @param logger
     * @param config
     * @param nativeExtensionProvider
     * @param authenticationScheme
     */
    NativeMessageHandler.isNativeAvailable = function (config, logger, nativeExtensionProvider, authenticationScheme) {
        logger.trace("isNativeAvailable called");
        if (!config.system.allowNativeBroker) {
            logger.trace("isNativeAvailable: allowNativeBroker is not enabled, returning false");
            // Developer disabled WAM
            return false;
        }
        if (!nativeExtensionProvider) {
            logger.trace("isNativeAvailable: WAM extension provider is not initialized, returning false");
            // Extension is not available
            return false;
        }
        if (authenticationScheme) {
            switch (authenticationScheme) {
                case exports.AuthenticationScheme.BEARER:
                case exports.AuthenticationScheme.POP:
                    logger.trace("isNativeAvailable: authenticationScheme is supported, returning true");
                    return true;
                default:
                    logger.trace("isNativeAvailable: authenticationScheme is not supported, returning false");
                    return false;
            }
        }
        return true;
    };
    return NativeMessageHandler;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var RedirectClient = /** @class */ (function (_super) {
    __extends$1(RedirectClient, _super);
    function RedirectClient(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeStorageImpl, nativeMessageHandler, correlationId) {
        var _this = _super.call(this, config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeMessageHandler, correlationId) || this;
        _this.nativeStorage = nativeStorageImpl;
        return _this;
    }
    /**
     * Redirects the page to the /authorize endpoint of the IDP
     * @param request
     */
    RedirectClient.prototype.acquireToken = function (request) {
        return __awaiter$1(this, void 0, void 0, function () {
            var validRequest, serverTelemetryManager, handleBackButton, authCodeRequest, authClient, interactionHandler, navigateUrl, redirectStartPage, e_1;
            var _this = this;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.initializeAuthorizationRequest(request, exports.InteractionType.Redirect)];
                    case 1:
                        validRequest = _a.sent();
                        this.browserStorage.updateCacheEntries(validRequest.state, validRequest.nonce, validRequest.authority, validRequest.loginHint || Constants.EMPTY_STRING, validRequest.account || null);
                        serverTelemetryManager = this.initializeServerTelemetryManager(exports.ApiId.acquireTokenRedirect);
                        handleBackButton = function (event) {
                            // Clear temporary cache if the back button is clicked during the redirect flow.
                            if (event.persisted) {
                                _this.logger.verbose("Page was restored from back/forward cache. Clearing temporary cache.");
                                _this.browserStorage.cleanRequestByState(validRequest.state);
                            }
                        };
                        _a.label = 2;
                    case 2:
                        _a.trys.push([2, 7, , 8]);
                        return [4 /*yield*/, this.initializeAuthorizationCodeRequest(validRequest)];
                    case 3:
                        authCodeRequest = _a.sent();
                        return [4 /*yield*/, this.createAuthCodeClient(serverTelemetryManager, validRequest.authority, validRequest.azureCloudOptions)];
                    case 4:
                        authClient = _a.sent();
                        this.logger.verbose("Auth code client created");
                        interactionHandler = new RedirectHandler(authClient, this.browserStorage, authCodeRequest, this.logger, this.browserCrypto);
                        return [4 /*yield*/, authClient.getAuthCodeUrl(__assign$1(__assign$1({}, validRequest), { nativeBroker: NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeMessageHandler, request.authenticationScheme) }))];
                    case 5:
                        navigateUrl = _a.sent();
                        redirectStartPage = this.getRedirectStartPage(request.redirectStartPage);
                        this.logger.verbosePii("Redirect start page: " + redirectStartPage);
                        // Clear temporary cache if the back button is clicked during the redirect flow.
                        window.addEventListener("pageshow", handleBackButton);
                        return [4 /*yield*/, interactionHandler.initiateAuthRequest(navigateUrl, {
                                navigationClient: this.navigationClient,
                                redirectTimeout: this.config.system.redirectNavigationTimeout,
                                redirectStartPage: redirectStartPage,
                                onRedirectNavigate: request.onRedirectNavigate
                            })];
                    case 6: 
                    // Show the UI once the url has been created. Response will come back in the hash, which will be handled in the handleRedirectCallback function.
                    return [2 /*return*/, _a.sent()];
                    case 7:
                        e_1 = _a.sent();
                        if (e_1 instanceof AuthError) {
                            e_1.setCorrelationId(this.correlationId);
                        }
                        window.removeEventListener("pageshow", handleBackButton);
                        serverTelemetryManager.cacheFailedRequest(e_1);
                        this.browserStorage.cleanRequestByState(validRequest.state);
                        throw e_1;
                    case 8: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Checks if navigateToLoginRequestUrl is set, and:
     * - if true, performs logic to cache and navigate
     * - if false, handles hash string and parses response
     * @param hash
     */
    RedirectClient.prototype.handleRedirectPromise = function (hash) {
        return __awaiter$1(this, void 0, void 0, function () {
            var serverTelemetryManager, responseHash, state, serverParams, loginRequestUrl, loginRequestUrlNormalized, currentUrlNormalized, handleHashResult, navigationOptions, processHashOnRedirect, homepage, e_2;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        serverTelemetryManager = this.initializeServerTelemetryManager(exports.ApiId.handleRedirectPromise);
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 10, , 11]);
                        if (!this.browserStorage.isInteractionInProgress(true)) {
                            this.logger.info("handleRedirectPromise called but there is no interaction in progress, returning null.");
                            return [2 /*return*/, null];
                        }
                        responseHash = this.getRedirectResponseHash(hash || window.location.hash);
                        if (!responseHash) {
                            // Not a recognized server response hash or hash not associated with a redirect request
                            this.logger.info("handleRedirectPromise did not detect a response hash as a result of a redirect. Cleaning temporary cache.");
                            this.browserStorage.cleanRequestByInteractionType(exports.InteractionType.Redirect);
                            return [2 /*return*/, null];
                        }
                        state = void 0;
                        try {
                            serverParams = UrlString.getDeserializedHash(responseHash);
                            state = this.validateAndExtractStateFromHash(serverParams, exports.InteractionType.Redirect);
                            this.logger.verbose("State extracted from hash");
                        }
                        catch (e) {
                            this.logger.info("handleRedirectPromise was unable to extract state due to: " + e);
                            this.browserStorage.cleanRequestByInteractionType(exports.InteractionType.Redirect);
                            return [2 /*return*/, null];
                        }
                        loginRequestUrl = this.browserStorage.getTemporaryCache(TemporaryCacheKeys.ORIGIN_URI, true) || Constants.EMPTY_STRING;
                        loginRequestUrlNormalized = UrlString.removeHashFromUrl(loginRequestUrl);
                        currentUrlNormalized = UrlString.removeHashFromUrl(window.location.href);
                        if (!(loginRequestUrlNormalized === currentUrlNormalized && this.config.auth.navigateToLoginRequestUrl)) return [3 /*break*/, 3];
                        // We are on the page we need to navigate to - handle hash
                        this.logger.verbose("Current page is loginRequestUrl, handling hash");
                        return [4 /*yield*/, this.handleHash(responseHash, state, serverTelemetryManager)];
                    case 2:
                        handleHashResult = _a.sent();
                        if (loginRequestUrl.indexOf("#") > -1) {
                            // Replace current hash with non-msal hash, if present
                            BrowserUtils.replaceHash(loginRequestUrl);
                        }
                        return [2 /*return*/, handleHashResult];
                    case 3:
                        if (!!this.config.auth.navigateToLoginRequestUrl) return [3 /*break*/, 4];
                        this.logger.verbose("NavigateToLoginRequestUrl set to false, handling hash");
                        return [2 /*return*/, this.handleHash(responseHash, state, serverTelemetryManager)];
                    case 4:
                        if (!(!BrowserUtils.isInIframe() || this.config.system.allowRedirectInIframe)) return [3 /*break*/, 9];
                        /*
                         * Returned from authority using redirect - need to perform navigation before processing response
                         * Cache the hash to be retrieved after the next redirect
                         */
                        this.browserStorage.setTemporaryCache(TemporaryCacheKeys.URL_HASH, responseHash, true);
                        navigationOptions = {
                            apiId: exports.ApiId.handleRedirectPromise,
                            timeout: this.config.system.redirectNavigationTimeout,
                            noHistory: true
                        };
                        processHashOnRedirect = true;
                        if (!(!loginRequestUrl || loginRequestUrl === "null")) return [3 /*break*/, 6];
                        homepage = BrowserUtils.getHomepage();
                        // Cache the homepage under ORIGIN_URI to ensure cached hash is processed on homepage
                        this.browserStorage.setTemporaryCache(TemporaryCacheKeys.ORIGIN_URI, homepage, true);
                        this.logger.warning("Unable to get valid login request url from cache, redirecting to home page");
                        return [4 /*yield*/, this.navigationClient.navigateInternal(homepage, navigationOptions)];
                    case 5:
                        processHashOnRedirect = _a.sent();
                        return [3 /*break*/, 8];
                    case 6:
                        // Navigate to page that initiated the redirect request
                        this.logger.verbose("Navigating to loginRequestUrl: " + loginRequestUrl);
                        return [4 /*yield*/, this.navigationClient.navigateInternal(loginRequestUrl, navigationOptions)];
                    case 7:
                        processHashOnRedirect = _a.sent();
                        _a.label = 8;
                    case 8:
                        // If navigateInternal implementation returns false, handle the hash now
                        if (!processHashOnRedirect) {
                            return [2 /*return*/, this.handleHash(responseHash, state, serverTelemetryManager)];
                        }
                        _a.label = 9;
                    case 9: return [2 /*return*/, null];
                    case 10:
                        e_2 = _a.sent();
                        if (e_2 instanceof AuthError) {
                            e_2.setCorrelationId(this.correlationId);
                        }
                        serverTelemetryManager.cacheFailedRequest(e_2);
                        this.browserStorage.cleanRequestByInteractionType(exports.InteractionType.Redirect);
                        throw e_2;
                    case 11: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Gets the response hash for a redirect request
     * Returns null if interactionType in the state value is not "redirect" or the hash does not contain known properties
     * @param hash
     */
    RedirectClient.prototype.getRedirectResponseHash = function (hash) {
        this.logger.verbose("getRedirectResponseHash called");
        // Get current location hash from window or cache.
        var isResponseHash = UrlString.hashContainsKnownProperties(hash);
        if (isResponseHash) {
            BrowserUtils.clearHash(window);
            this.logger.verbose("Hash contains known properties, returning response hash");
            return hash;
        }
        var cachedHash = this.browserStorage.getTemporaryCache(TemporaryCacheKeys.URL_HASH, true);
        this.browserStorage.removeItem(this.browserStorage.generateCacheKey(TemporaryCacheKeys.URL_HASH));
        this.logger.verbose("Hash does not contain known properties, returning cached hash");
        return cachedHash;
    };
    /**
     * Checks if hash exists and handles in window.
     * @param hash
     * @param state
     */
    RedirectClient.prototype.handleHash = function (hash, state, serverTelemetryManager) {
        return __awaiter$1(this, void 0, void 0, function () {
            var cachedRequest, serverParams, nativeInteractionClient, userRequestState, currentAuthority, authClient, interactionHandler;
            var _this = this;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        cachedRequest = this.browserStorage.getCachedRequest(state, this.browserCrypto);
                        this.logger.verbose("handleHash called, retrieved cached request");
                        serverParams = UrlString.getDeserializedHash(hash);
                        if (serverParams.accountId) {
                            this.logger.verbose("Account id found in hash, calling WAM for token");
                            if (!this.nativeMessageHandler) {
                                throw BrowserAuthError.createNativeConnectionNotEstablishedError();
                            }
                            nativeInteractionClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, exports.ApiId.acquireTokenPopup, this.performanceClient, this.nativeMessageHandler, serverParams.accountId, this.browserStorage, cachedRequest.correlationId);
                            userRequestState = ProtocolUtils.parseRequestState(this.browserCrypto, state).userRequestState;
                            return [2 /*return*/, nativeInteractionClient.acquireToken(__assign$1(__assign$1({}, cachedRequest), { state: userRequestState, prompt: undefined // Server should handle the prompt, ideally native broker can do this part silently
                                 })).finally(function () {
                                    _this.browserStorage.cleanRequestByState(state);
                                })];
                        }
                        currentAuthority = this.browserStorage.getCachedAuthority(state);
                        if (!currentAuthority) {
                            throw BrowserAuthError.createNoCachedAuthorityError();
                        }
                        return [4 /*yield*/, this.createAuthCodeClient(serverTelemetryManager, currentAuthority)];
                    case 1:
                        authClient = _a.sent();
                        this.logger.verbose("Auth code client created");
                        ThrottlingUtils.removeThrottle(this.browserStorage, this.config.auth.clientId, cachedRequest);
                        interactionHandler = new RedirectHandler(authClient, this.browserStorage, cachedRequest, this.logger, this.browserCrypto);
                        return [4 /*yield*/, interactionHandler.handleCodeResponseFromHash(hash, state, authClient.authority, this.networkClient)];
                    case 2: return [2 /*return*/, _a.sent()];
                }
            });
        });
    };
    /**
     * Use to log out the current user, and redirect the user to the postLogoutRedirectUri.
     * Default behaviour is to redirect the user to `window.location.href`.
     * @param logoutRequest
     */
    RedirectClient.prototype.logout = function (logoutRequest) {
        return __awaiter$1(this, void 0, void 0, function () {
            var validLogoutRequest, serverTelemetryManager, navigationOptions, authClient, logoutUri, navigate, e_3;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.verbose("logoutRedirect called");
                        validLogoutRequest = this.initializeLogoutRequest(logoutRequest);
                        serverTelemetryManager = this.initializeServerTelemetryManager(exports.ApiId.logout);
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 10, , 11]);
                        this.eventHandler.emitEvent(exports.EventType.LOGOUT_START, exports.InteractionType.Redirect, logoutRequest);
                        // Clear cache on logout
                        return [4 /*yield*/, this.clearCacheOnLogout(validLogoutRequest.account)];
                    case 2:
                        // Clear cache on logout
                        _a.sent();
                        navigationOptions = {
                            apiId: exports.ApiId.logout,
                            timeout: this.config.system.redirectNavigationTimeout,
                            noHistory: false
                        };
                        return [4 /*yield*/, this.createAuthCodeClient(serverTelemetryManager, logoutRequest && logoutRequest.authority)];
                    case 3:
                        authClient = _a.sent();
                        this.logger.verbose("Auth code client created");
                        logoutUri = authClient.getLogoutUri(validLogoutRequest);
                        this.eventHandler.emitEvent(exports.EventType.LOGOUT_SUCCESS, exports.InteractionType.Redirect, validLogoutRequest);
                        if (!(logoutRequest && typeof logoutRequest.onRedirectNavigate === "function")) return [3 /*break*/, 7];
                        navigate = logoutRequest.onRedirectNavigate(logoutUri);
                        if (!(navigate !== false)) return [3 /*break*/, 5];
                        this.logger.verbose("Logout onRedirectNavigate did not return false, navigating");
                        // Ensure interaction is in progress
                        if (!this.browserStorage.getInteractionInProgress()) {
                            this.browserStorage.setInteractionInProgress(true);
                        }
                        return [4 /*yield*/, this.navigationClient.navigateExternal(logoutUri, navigationOptions)];
                    case 4:
                        _a.sent();
                        return [2 /*return*/];
                    case 5:
                        // Ensure interaction is not in progress
                        this.browserStorage.setInteractionInProgress(false);
                        this.logger.verbose("Logout onRedirectNavigate returned false, stopping navigation");
                        _a.label = 6;
                    case 6: return [3 /*break*/, 9];
                    case 7:
                        // Ensure interaction is in progress
                        if (!this.browserStorage.getInteractionInProgress()) {
                            this.browserStorage.setInteractionInProgress(true);
                        }
                        return [4 /*yield*/, this.navigationClient.navigateExternal(logoutUri, navigationOptions)];
                    case 8:
                        _a.sent();
                        return [2 /*return*/];
                    case 9: return [3 /*break*/, 11];
                    case 10:
                        e_3 = _a.sent();
                        if (e_3 instanceof AuthError) {
                            e_3.setCorrelationId(this.correlationId);
                        }
                        serverTelemetryManager.cacheFailedRequest(e_3);
                        this.eventHandler.emitEvent(exports.EventType.LOGOUT_FAILURE, exports.InteractionType.Redirect, null, e_3);
                        this.eventHandler.emitEvent(exports.EventType.LOGOUT_END, exports.InteractionType.Redirect);
                        throw e_3;
                    case 11:
                        this.eventHandler.emitEvent(exports.EventType.LOGOUT_END, exports.InteractionType.Redirect);
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Use to get the redirectStartPage either from request or use current window
     * @param requestStartPage
     */
    RedirectClient.prototype.getRedirectStartPage = function (requestStartPage) {
        var redirectStartPage = requestStartPage || window.location.href;
        return UrlString.getAbsoluteUrl(redirectStartPage, BrowserUtils.getCurrentUri());
    };
    return RedirectClient;
}(StandardInteractionClient));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var PopupClient = /** @class */ (function (_super) {
    __extends$1(PopupClient, _super);
    function PopupClient(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeStorageImpl, nativeMessageHandler, correlationId) {
        var _this = _super.call(this, config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeMessageHandler, correlationId) || this;
        // Properly sets this reference for the unload event.
        _this.unloadWindow = _this.unloadWindow.bind(_this);
        _this.nativeStorage = nativeStorageImpl;
        return _this;
    }
    /**
     * Acquires tokens by opening a popup window to the /authorize endpoint of the authority
     * @param request
     */
    PopupClient.prototype.acquireToken = function (request) {
        try {
            var popupName = this.generatePopupName(request.scopes || OIDC_DEFAULT_SCOPES, request.authority || this.config.auth.authority);
            var popupWindowAttributes = request.popupWindowAttributes || {};
            // asyncPopups flag is true. Acquires token without first opening popup. Popup will be opened later asynchronously.
            if (this.config.system.asyncPopups) {
                this.logger.verbose("asyncPopups set to true, acquiring token");
                // Passes on popup position and dimensions if in request
                return this.acquireTokenPopupAsync(request, popupName, popupWindowAttributes);
            }
            else {
                // asyncPopups flag is set to false. Opens popup before acquiring token.
                this.logger.verbose("asyncPopup set to false, opening popup before acquiring token");
                var popup = this.openSizedPopup("about:blank", popupName, popupWindowAttributes);
                return this.acquireTokenPopupAsync(request, popupName, popupWindowAttributes, popup);
            }
        }
        catch (e) {
            return Promise.reject(e);
        }
    };
    /**
     * Clears local cache for the current user then opens a popup window prompting the user to sign-out of the server
     * @param logoutRequest
     */
    PopupClient.prototype.logout = function (logoutRequest) {
        try {
            this.logger.verbose("logoutPopup called");
            var validLogoutRequest = this.initializeLogoutRequest(logoutRequest);
            var popupName = this.generateLogoutPopupName(validLogoutRequest);
            var authority = logoutRequest && logoutRequest.authority;
            var mainWindowRedirectUri = logoutRequest && logoutRequest.mainWindowRedirectUri;
            var popupWindowAttributes = (logoutRequest === null || logoutRequest === void 0 ? void 0 : logoutRequest.popupWindowAttributes) || {};
            // asyncPopups flag is true. Acquires token without first opening popup. Popup will be opened later asynchronously.
            if (this.config.system.asyncPopups) {
                this.logger.verbose("asyncPopups set to true");
                // Passes on popup position and dimensions if in request
                return this.logoutPopupAsync(validLogoutRequest, popupName, popupWindowAttributes, authority, undefined, mainWindowRedirectUri);
            }
            else {
                // asyncPopups flag is set to false. Opens popup before logging out.
                this.logger.verbose("asyncPopup set to false, opening popup");
                var popup = this.openSizedPopup("about:blank", popupName, popupWindowAttributes);
                return this.logoutPopupAsync(validLogoutRequest, popupName, popupWindowAttributes, authority, popup, mainWindowRedirectUri);
            }
        }
        catch (e) {
            // Since this function is synchronous we need to reject
            return Promise.reject(e);
        }
    };
    /**
     * Helper which obtains an access_token for your API via opening a popup window in the user's browser
     * @param validRequest
     * @param popupName
     * @param popup
     * @param popupWindowAttributes
     *
     * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.
     */
    PopupClient.prototype.acquireTokenPopupAsync = function (request, popupName, popupWindowAttributes, popup) {
        return __awaiter$1(this, void 0, void 0, function () {
            var serverTelemetryManager, validRequest, authCodeRequest, authClient, isNativeBroker, fetchNativeAccountIdMeasurement, navigateUrl, interactionHandler, popupParameters, popupWindow, hash, serverParams, state_1, nativeInteractionClient, userRequestState, result, e_1;
            var _this = this;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.verbose("acquireTokenPopupAsync called");
                        serverTelemetryManager = this.initializeServerTelemetryManager(exports.ApiId.acquireTokenPopup);
                        return [4 /*yield*/, this.initializeAuthorizationRequest(request, exports.InteractionType.Popup)];
                    case 1:
                        validRequest = _a.sent();
                        this.browserStorage.updateCacheEntries(validRequest.state, validRequest.nonce, validRequest.authority, validRequest.loginHint || Constants.EMPTY_STRING, validRequest.account || null);
                        _a.label = 2;
                    case 2:
                        _a.trys.push([2, 8, , 9]);
                        return [4 /*yield*/, this.initializeAuthorizationCodeRequest(validRequest)];
                    case 3:
                        authCodeRequest = _a.sent();
                        return [4 /*yield*/, this.createAuthCodeClient(serverTelemetryManager, validRequest.authority, validRequest.azureCloudOptions)];
                    case 4:
                        authClient = _a.sent();
                        this.logger.verbose("Auth code client created");
                        isNativeBroker = NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeMessageHandler, request.authenticationScheme);
                        fetchNativeAccountIdMeasurement = void 0;
                        if (isNativeBroker) {
                            fetchNativeAccountIdMeasurement = this.performanceClient.startMeasurement(exports.PerformanceEvents.FetchAccountIdWithNativeBroker, request.correlationId);
                        }
                        return [4 /*yield*/, authClient.getAuthCodeUrl(__assign$1(__assign$1({}, validRequest), { nativeBroker: isNativeBroker }))];
                    case 5:
                        navigateUrl = _a.sent();
                        interactionHandler = new InteractionHandler(authClient, this.browserStorage, authCodeRequest, this.logger);
                        popupParameters = {
                            popup: popup,
                            popupName: popupName,
                            popupWindowAttributes: popupWindowAttributes
                        };
                        popupWindow = this.initiateAuthRequest(navigateUrl, popupParameters);
                        this.eventHandler.emitEvent(exports.EventType.POPUP_OPENED, exports.InteractionType.Popup, { popupWindow: popupWindow }, null);
                        return [4 /*yield*/, this.monitorPopupForHash(popupWindow)];
                    case 6:
                        hash = _a.sent();
                        serverParams = UrlString.getDeserializedHash(hash);
                        state_1 = this.validateAndExtractStateFromHash(serverParams, exports.InteractionType.Popup, validRequest.correlationId);
                        // Remove throttle if it exists
                        ThrottlingUtils.removeThrottle(this.browserStorage, this.config.auth.clientId, authCodeRequest);
                        if (serverParams.accountId) {
                            this.logger.verbose("Account id found in hash, calling WAM for token");
                            // end measurement for server call with native brokering enabled
                            if (fetchNativeAccountIdMeasurement) {
                                fetchNativeAccountIdMeasurement.endMeasurement({
                                    success: true,
                                    isNativeBroker: true
                                });
                            }
                            if (!this.nativeMessageHandler) {
                                throw BrowserAuthError.createNativeConnectionNotEstablishedError();
                            }
                            nativeInteractionClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, exports.ApiId.acquireTokenPopup, this.performanceClient, this.nativeMessageHandler, serverParams.accountId, this.nativeStorage, validRequest.correlationId);
                            userRequestState = ProtocolUtils.parseRequestState(this.browserCrypto, state_1).userRequestState;
                            return [2 /*return*/, nativeInteractionClient.acquireToken(__assign$1(__assign$1({}, validRequest), { state: userRequestState, prompt: undefined // Server should handle the prompt, ideally native broker can do this part silently
                                 })).finally(function () {
                                    _this.browserStorage.cleanRequestByState(state_1);
                                })];
                        }
                        return [4 /*yield*/, interactionHandler.handleCodeResponseFromHash(hash, state_1, authClient.authority, this.networkClient)];
                    case 7:
                        result = _a.sent();
                        return [2 /*return*/, result];
                    case 8:
                        e_1 = _a.sent();
                        if (popup) {
                            // Close the synchronous popup if an error is thrown before the window unload event is registered
                            popup.close();
                        }
                        if (e_1 instanceof AuthError) {
                            e_1.setCorrelationId(this.correlationId);
                        }
                        serverTelemetryManager.cacheFailedRequest(e_1);
                        this.browserStorage.cleanRequestByState(validRequest.state);
                        throw e_1;
                    case 9: return [2 /*return*/];
                }
            });
        });
    };
    /**
     *
     * @param validRequest
     * @param popupName
     * @param requestAuthority
     * @param popup
     * @param mainWindowRedirectUri
     * @param popupWindowAttributes
     */
    PopupClient.prototype.logoutPopupAsync = function (validRequest, popupName, popupWindowAttributes, requestAuthority, popup, mainWindowRedirectUri) {
        return __awaiter$1(this, void 0, void 0, function () {
            var serverTelemetryManager, authClient, logoutUri, popupWindow, navigationOptions, absoluteUrl, e_2;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.verbose("logoutPopupAsync called");
                        this.eventHandler.emitEvent(exports.EventType.LOGOUT_START, exports.InteractionType.Popup, validRequest);
                        serverTelemetryManager = this.initializeServerTelemetryManager(exports.ApiId.logoutPopup);
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 5, , 6]);
                        // Clear cache on logout
                        return [4 /*yield*/, this.clearCacheOnLogout(validRequest.account)];
                    case 2:
                        // Clear cache on logout
                        _a.sent();
                        return [4 /*yield*/, this.createAuthCodeClient(serverTelemetryManager, requestAuthority)];
                    case 3:
                        authClient = _a.sent();
                        this.logger.verbose("Auth code client created");
                        logoutUri = authClient.getLogoutUri(validRequest);
                        this.eventHandler.emitEvent(exports.EventType.LOGOUT_SUCCESS, exports.InteractionType.Popup, validRequest);
                        popupWindow = this.openPopup(logoutUri, { popupName: popupName, popupWindowAttributes: popupWindowAttributes, popup: popup });
                        this.eventHandler.emitEvent(exports.EventType.POPUP_OPENED, exports.InteractionType.Popup, { popupWindow: popupWindow }, null);
                        return [4 /*yield*/, this.waitForLogoutPopup(popupWindow)];
                    case 4:
                        _a.sent();
                        if (mainWindowRedirectUri) {
                            navigationOptions = {
                                apiId: exports.ApiId.logoutPopup,
                                timeout: this.config.system.redirectNavigationTimeout,
                                noHistory: false
                            };
                            absoluteUrl = UrlString.getAbsoluteUrl(mainWindowRedirectUri, BrowserUtils.getCurrentUri());
                            this.logger.verbose("Redirecting main window to url specified in the request");
                            this.logger.verbosePii("Redirecting main window to: " + absoluteUrl);
                            this.navigationClient.navigateInternal(absoluteUrl, navigationOptions);
                        }
                        else {
                            this.logger.verbose("No main window navigation requested");
                        }
                        return [3 /*break*/, 6];
                    case 5:
                        e_2 = _a.sent();
                        if (popup) {
                            // Close the synchronous popup if an error is thrown before the window unload event is registered
                            popup.close();
                        }
                        if (e_2 instanceof AuthError) {
                            e_2.setCorrelationId(this.correlationId);
                        }
                        this.browserStorage.setInteractionInProgress(false);
                        this.eventHandler.emitEvent(exports.EventType.LOGOUT_FAILURE, exports.InteractionType.Popup, null, e_2);
                        this.eventHandler.emitEvent(exports.EventType.LOGOUT_END, exports.InteractionType.Popup);
                        serverTelemetryManager.cacheFailedRequest(e_2);
                        throw e_2;
                    case 6:
                        this.eventHandler.emitEvent(exports.EventType.LOGOUT_END, exports.InteractionType.Popup);
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Opens a popup window with given request Url.
     * @param requestUrl
     */
    PopupClient.prototype.initiateAuthRequest = function (requestUrl, params) {
        // Check that request url is not empty.
        if (!StringUtils.isEmpty(requestUrl)) {
            this.logger.infoPii("Navigate to: " + requestUrl);
            // Open the popup window to requestUrl.
            return this.openPopup(requestUrl, params);
        }
        else {
            // Throw error if request URL is empty.
            this.logger.error("Navigate url is empty");
            throw BrowserAuthError.createEmptyNavigationUriError();
        }
    };
    /**
     * Monitors a window until it loads a url with the same origin.
     * @param popupWindow - window that is being monitored
     * @param timeout - timeout for processing hash once popup is redirected back to application
     */
    PopupClient.prototype.monitorPopupForHash = function (popupWindow) {
        var _this = this;
        return new Promise(function (resolve, reject) {
            /*
             * Polling for popups needs to be tick-based,
             * since a non-trivial amount of time can be spent on interaction (which should not count against the timeout).
             */
            var maxTicks = _this.config.system.windowHashTimeout / BrowserConstants.POLL_INTERVAL_MS;
            var ticks = 0;
            _this.logger.verbose("PopupHandler.monitorPopupForHash - polling started");
            var intervalId = setInterval(function () {
                // Window is closed
                if (popupWindow.closed) {
                    _this.logger.error("PopupHandler.monitorPopupForHash - window closed");
                    _this.cleanPopup();
                    clearInterval(intervalId);
                    reject(BrowserAuthError.createUserCancelledError());
                    return;
                }
                var href = Constants.EMPTY_STRING;
                var hash = Constants.EMPTY_STRING;
                try {
                    /*
                     * Will throw if cross origin,
                     * which should be caught and ignored
                     * since we need the interval to keep running while on STS UI.
                     */
                    href = popupWindow.location.href;
                    hash = popupWindow.location.hash;
                }
                catch (e) { }
                // Don't process blank pages or cross domain
                if (StringUtils.isEmpty(href) || href === "about:blank") {
                    return;
                }
                _this.logger.verbose("PopupHandler.monitorPopupForHash - popup window is on same origin as caller");
                /*
                 * Only run clock when we are on same domain for popups
                 * as popup operations can take a long time.
                 */
                ticks++;
                if (hash) {
                    _this.logger.verbose("PopupHandler.monitorPopupForHash - found hash in url");
                    clearInterval(intervalId);
                    _this.cleanPopup(popupWindow);
                    if (UrlString.hashContainsKnownProperties(hash)) {
                        _this.logger.verbose("PopupHandler.monitorPopupForHash - hash contains known properties, returning.");
                        resolve(hash);
                    }
                    else {
                        _this.logger.error("PopupHandler.monitorPopupForHash - found hash in url but it does not contain known properties. Check that your router is not changing the hash prematurely.");
                        _this.logger.errorPii("PopupHandler.monitorPopupForHash - hash found: " + hash);
                        reject(BrowserAuthError.createHashDoesNotContainKnownPropertiesError());
                    }
                }
                else if (ticks > maxTicks) {
                    _this.logger.error("PopupHandler.monitorPopupForHash - unable to find hash in url, timing out");
                    clearInterval(intervalId);
                    reject(BrowserAuthError.createMonitorPopupTimeoutError());
                }
            }, BrowserConstants.POLL_INTERVAL_MS);
        });
    };
    /**
     * Waits for user interaction in logout popup window
     * @param popupWindow
     * @returns
     */
    PopupClient.prototype.waitForLogoutPopup = function (popupWindow) {
        var _this = this;
        return new Promise(function (resolve) {
            _this.logger.verbose("PopupHandler.waitForLogoutPopup - polling started");
            var intervalId = setInterval(function () {
                // Window is closed
                if (popupWindow.closed) {
                    _this.logger.error("PopupHandler.waitForLogoutPopup - window closed");
                    _this.cleanPopup();
                    clearInterval(intervalId);
                    resolve();
                }
                var href = Constants.EMPTY_STRING;
                try {
                    /*
                     * Will throw if cross origin,
                     * which should be caught and ignored
                     * since we need the interval to keep running while on STS UI.
                     */
                    href = popupWindow.location.href;
                }
                catch (e) { }
                // Don't process blank pages or cross domain
                if (StringUtils.isEmpty(href) || href === "about:blank") {
                    return;
                }
                _this.logger.verbose("PopupHandler.waitForLogoutPopup - popup window is on same origin as caller, closing.");
                clearInterval(intervalId);
                _this.cleanPopup(popupWindow);
                resolve();
            }, BrowserConstants.POLL_INTERVAL_MS);
        });
    };
    /**
     * @hidden
     *
     * Configures popup window for login.
     *
     * @param urlNavigate
     * @param title
     * @param popUpWidth
     * @param popUpHeight
     * @param popupWindowAttributes
     * @ignore
     * @hidden
     */
    PopupClient.prototype.openPopup = function (urlNavigate, popupParams) {
        try {
            var popupWindow = void 0;
            // Popup window passed in, setting url to navigate to
            if (popupParams.popup) {
                popupWindow = popupParams.popup;
                this.logger.verbosePii("Navigating popup window to: " + urlNavigate);
                popupWindow.location.assign(urlNavigate);
            }
            else if (typeof popupParams.popup === "undefined") {
                // Popup will be undefined if it was not passed in
                this.logger.verbosePii("Opening popup window to: " + urlNavigate);
                popupWindow = this.openSizedPopup(urlNavigate, popupParams.popupName, popupParams.popupWindowAttributes);
            }
            // Popup will be null if popups are blocked
            if (!popupWindow) {
                throw BrowserAuthError.createEmptyWindowCreatedError();
            }
            if (popupWindow.focus) {
                popupWindow.focus();
            }
            this.currentWindow = popupWindow;
            window.addEventListener("beforeunload", this.unloadWindow);
            return popupWindow;
        }
        catch (e) {
            this.logger.error("error opening popup " + e.message);
            this.browserStorage.setInteractionInProgress(false);
            throw BrowserAuthError.createPopupWindowError(e.toString());
        }
    };
    /**
     * Helper function to set popup window dimensions and position
     * @param urlNavigate
     * @param popupName
     * @param popupWindowAttributes
     * @returns
     */
    PopupClient.prototype.openSizedPopup = function (urlNavigate, popupName, popupWindowAttributes) {
        var _a, _b, _c, _d;
        /**
         * adding winLeft and winTop to account for dual monitor
         * using screenLeft and screenTop for IE8 and earlier
         */
        var winLeft = window.screenLeft ? window.screenLeft : window.screenX;
        var winTop = window.screenTop ? window.screenTop : window.screenY;
        /**
         * window.innerWidth displays browser window"s height and width excluding toolbars
         * using document.documentElement.clientWidth for IE8 and earlier
         */
        var winWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
        var winHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
        var width = (_a = popupWindowAttributes.popupSize) === null || _a === void 0 ? void 0 : _a.width;
        var height = (_b = popupWindowAttributes.popupSize) === null || _b === void 0 ? void 0 : _b.height;
        var top = (_c = popupWindowAttributes.popupPosition) === null || _c === void 0 ? void 0 : _c.top;
        var left = (_d = popupWindowAttributes.popupPosition) === null || _d === void 0 ? void 0 : _d.left;
        if (!width || width < 0 || width > winWidth) {
            this.logger.verbose("Default popup window width used. Window width not configured or invalid.");
            width = BrowserConstants.POPUP_WIDTH;
        }
        if (!height || height < 0 || height > winHeight) {
            this.logger.verbose("Default popup window height used. Window height not configured or invalid.");
            height = BrowserConstants.POPUP_HEIGHT;
        }
        if (!top || top < 0 || top > winHeight) {
            this.logger.verbose("Default popup window top position used. Window top not configured or invalid.");
            top = Math.max(0, ((winHeight / 2) - (BrowserConstants.POPUP_HEIGHT / 2)) + winTop);
        }
        if (!left || left < 0 || left > winWidth) {
            this.logger.verbose("Default popup window left position used. Window left not configured or invalid.");
            left = Math.max(0, ((winWidth / 2) - (BrowserConstants.POPUP_WIDTH / 2)) + winLeft);
        }
        return window.open(urlNavigate, popupName, "width=" + width + ", height=" + height + ", top=" + top + ", left=" + left + ", scrollbars=yes");
    };
    /**
     * Event callback to unload main window.
     */
    PopupClient.prototype.unloadWindow = function (e) {
        this.browserStorage.cleanRequestByInteractionType(exports.InteractionType.Popup);
        if (this.currentWindow) {
            this.currentWindow.close();
        }
        // Guarantees browser unload will happen, so no other errors will be thrown.
        e.preventDefault();
    };
    /**
     * Closes popup, removes any state vars created during popup calls.
     * @param popupWindow
     */
    PopupClient.prototype.cleanPopup = function (popupWindow) {
        if (popupWindow) {
            // Close window.
            popupWindow.close();
        }
        // Remove window unload function
        window.removeEventListener("beforeunload", this.unloadWindow);
        // Interaction is completed - remove interaction status.
        this.browserStorage.setInteractionInProgress(false);
    };
    /**
     * Generates the name for the popup based on the client id and request
     * @param clientId
     * @param request
     */
    PopupClient.prototype.generatePopupName = function (scopes, authority) {
        return BrowserConstants.POPUP_NAME_PREFIX + "." + this.config.auth.clientId + "." + scopes.join("-") + "." + authority + "." + this.correlationId;
    };
    /**
     * Generates the name for the popup based on the client id and request for logouts
     * @param clientId
     * @param request
     */
    PopupClient.prototype.generateLogoutPopupName = function (request) {
        var homeAccountId = request.account && request.account.homeAccountId;
        return BrowserConstants.POPUP_NAME_PREFIX + "." + this.config.auth.clientId + "." + homeAccountId + "." + this.correlationId;
    };
    return PopupClient;
}(StandardInteractionClient));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var NavigationClient = /** @class */ (function () {
    function NavigationClient() {
    }
    /**
     * Navigates to other pages within the same web application
     * @param url
     * @param options
     */
    NavigationClient.prototype.navigateInternal = function (url, options) {
        return NavigationClient.defaultNavigateWindow(url, options);
    };
    /**
     * Navigates to other pages outside the web application i.e. the Identity Provider
     * @param url
     * @param options
     */
    NavigationClient.prototype.navigateExternal = function (url, options) {
        return NavigationClient.defaultNavigateWindow(url, options);
    };
    /**
     * Default navigation implementation invoked by the internal and external functions
     * @param url
     * @param options
     */
    NavigationClient.defaultNavigateWindow = function (url, options) {
        if (options.noHistory) {
            window.location.replace(url);
        }
        else {
            window.location.assign(url);
        }
        return new Promise(function (resolve) {
            setTimeout(function () {
                resolve(true);
            }, options.timeout);
        });
    };
    return NavigationClient;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
// Default timeout for popup windows and iframes in milliseconds
var DEFAULT_POPUP_TIMEOUT_MS = 60000;
var DEFAULT_IFRAME_TIMEOUT_MS = 6000;
var DEFAULT_REDIRECT_TIMEOUT_MS = 30000;
var DEFAULT_NATIVE_BROKER_HANDSHAKE_TIMEOUT_MS = 2000;
/**
 * MSAL function that sets the default options when not explicitly configured from app developer
 *
 * @param auth
 * @param cache
 * @param system
 *
 * @returns Configuration object
 */
function buildConfiguration(_a, isBrowserEnvironment) {
    var userInputAuth = _a.auth, userInputCache = _a.cache, userInputSystem = _a.system, userInputTelemetry = _a.telemetry;
    // Default auth options for browser
    var DEFAULT_AUTH_OPTIONS = {
        clientId: Constants.EMPTY_STRING,
        authority: "" + Constants.DEFAULT_AUTHORITY,
        knownAuthorities: [],
        cloudDiscoveryMetadata: Constants.EMPTY_STRING,
        authorityMetadata: Constants.EMPTY_STRING,
        redirectUri: Constants.EMPTY_STRING,
        postLogoutRedirectUri: Constants.EMPTY_STRING,
        navigateToLoginRequestUrl: true,
        clientCapabilities: [],
        protocolMode: exports.ProtocolMode.AAD,
        azureCloudOptions: {
            azureCloudInstance: exports.AzureCloudInstance.None,
            tenant: Constants.EMPTY_STRING
        },
        skipAuthorityMetadataCache: false,
    };
    // Default cache options for browser
    var DEFAULT_CACHE_OPTIONS = {
        cacheLocation: exports.BrowserCacheLocation.SessionStorage,
        storeAuthStateInCookie: false,
        secureCookies: false
    };
    // Default logger options for browser
    var DEFAULT_LOGGER_OPTIONS = {
        // eslint-disable-next-line @typescript-eslint/no-empty-function
        loggerCallback: function () { },
        logLevel: exports.LogLevel.Info,
        piiLoggingEnabled: false
    };
    // Default system options for browser
    var DEFAULT_BROWSER_SYSTEM_OPTIONS = __assign$1(__assign$1({}, DEFAULT_SYSTEM_OPTIONS), { loggerOptions: DEFAULT_LOGGER_OPTIONS, networkClient: isBrowserEnvironment ? BrowserUtils.getBrowserNetworkClient() : StubbedNetworkModule, navigationClient: new NavigationClient(), loadFrameTimeout: 0, 
        // If loadFrameTimeout is provided, use that as default.
        windowHashTimeout: (userInputSystem === null || userInputSystem === void 0 ? void 0 : userInputSystem.loadFrameTimeout) || DEFAULT_POPUP_TIMEOUT_MS, iframeHashTimeout: (userInputSystem === null || userInputSystem === void 0 ? void 0 : userInputSystem.loadFrameTimeout) || DEFAULT_IFRAME_TIMEOUT_MS, navigateFrameWait: isBrowserEnvironment && BrowserUtils.detectIEOrEdge() ? 500 : 0, redirectNavigationTimeout: DEFAULT_REDIRECT_TIMEOUT_MS, asyncPopups: false, allowRedirectInIframe: false, allowNativeBroker: false, nativeBrokerHandshakeTimeout: (userInputSystem === null || userInputSystem === void 0 ? void 0 : userInputSystem.nativeBrokerHandshakeTimeout) || DEFAULT_NATIVE_BROKER_HANDSHAKE_TIMEOUT_MS });
    var DEFAULT_TELEMETRY_OPTIONS = {
        application: {
            appName: Constants.EMPTY_STRING,
            appVersion: Constants.EMPTY_STRING
        }
    };
    var overlayedConfig = {
        auth: __assign$1(__assign$1({}, DEFAULT_AUTH_OPTIONS), userInputAuth),
        cache: __assign$1(__assign$1({}, DEFAULT_CACHE_OPTIONS), userInputCache),
        system: __assign$1(__assign$1({}, DEFAULT_BROWSER_SYSTEM_OPTIONS), userInputSystem),
        telemetry: __assign$1(__assign$1({}, DEFAULT_TELEMETRY_OPTIONS), userInputTelemetry)
    };
    return overlayedConfig;
}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var SilentHandler = /** @class */ (function (_super) {
    __extends$1(SilentHandler, _super);
    function SilentHandler(authCodeModule, storageImpl, authCodeRequest, logger, navigateFrameWait) {
        var _this = _super.call(this, authCodeModule, storageImpl, authCodeRequest, logger) || this;
        _this.navigateFrameWait = navigateFrameWait;
        return _this;
    }
    /**
     * Creates a hidden iframe to given URL using user-requested scopes as an id.
     * @param urlNavigate
     * @param userRequestScopes
     */
    SilentHandler.prototype.initiateAuthRequest = function (requestUrl) {
        return __awaiter$1(this, void 0, void 0, function () {
            var _a;
            return __generator$1(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        if (StringUtils.isEmpty(requestUrl)) {
                            // Throw error if request URL is empty.
                            this.logger.info("Navigate url is empty");
                            throw BrowserAuthError.createEmptyNavigationUriError();
                        }
                        if (!this.navigateFrameWait) return [3 /*break*/, 2];
                        return [4 /*yield*/, this.loadFrame(requestUrl)];
                    case 1:
                        _a = _b.sent();
                        return [3 /*break*/, 3];
                    case 2:
                        _a = this.loadFrameSync(requestUrl);
                        _b.label = 3;
                    case 3: return [2 /*return*/, _a];
                }
            });
        });
    };
    /**
     * Monitors an iframe content window until it loads a url with a known hash, or hits a specified timeout.
     * @param iframe
     * @param timeout
     */
    SilentHandler.prototype.monitorIframeForHash = function (iframe, timeout) {
        var _this = this;
        return new Promise(function (resolve, reject) {
            if (timeout < DEFAULT_IFRAME_TIMEOUT_MS) {
                _this.logger.warning("system.loadFrameTimeout or system.iframeHashTimeout set to lower (" + timeout + "ms) than the default (" + DEFAULT_IFRAME_TIMEOUT_MS + "ms). This may result in timeouts.");
            }
            /*
             * Polling for iframes can be purely timing based,
             * since we don't need to account for interaction.
             */
            var nowMark = window.performance.now();
            var timeoutMark = nowMark + timeout;
            var intervalId = setInterval(function () {
                if (window.performance.now() > timeoutMark) {
                    _this.removeHiddenIframe(iframe);
                    clearInterval(intervalId);
                    reject(BrowserAuthError.createMonitorIframeTimeoutError());
                    return;
                }
                var href = Constants.EMPTY_STRING;
                var contentWindow = iframe.contentWindow;
                try {
                    /*
                     * Will throw if cross origin,
                     * which should be caught and ignored
                     * since we need the interval to keep running while on STS UI.
                     */
                    href = contentWindow ? contentWindow.location.href : Constants.EMPTY_STRING;
                }
                catch (e) { }
                if (StringUtils.isEmpty(href)) {
                    return;
                }
                var contentHash = contentWindow ? contentWindow.location.hash : Constants.EMPTY_STRING;
                if (UrlString.hashContainsKnownProperties(contentHash)) {
                    // Success case
                    _this.removeHiddenIframe(iframe);
                    clearInterval(intervalId);
                    resolve(contentHash);
                    return;
                }
            }, BrowserConstants.POLL_INTERVAL_MS);
        });
    };
    /**
     * @hidden
     * Loads iframe with authorization endpoint URL
     * @ignore
     */
    SilentHandler.prototype.loadFrame = function (urlNavigate) {
        /*
         * This trick overcomes iframe navigation in IE
         * IE does not load the page consistently in iframe
         */
        var _this = this;
        return new Promise(function (resolve, reject) {
            var frameHandle = _this.createHiddenIframe();
            setTimeout(function () {
                if (!frameHandle) {
                    reject("Unable to load iframe");
                    return;
                }
                frameHandle.src = urlNavigate;
                resolve(frameHandle);
            }, _this.navigateFrameWait);
        });
    };
    /**
     * @hidden
     * Loads the iframe synchronously when the navigateTimeFrame is set to `0`
     * @param urlNavigate
     * @param frameName
     * @param logger
     */
    SilentHandler.prototype.loadFrameSync = function (urlNavigate) {
        var frameHandle = this.createHiddenIframe();
        frameHandle.src = urlNavigate;
        return frameHandle;
    };
    /**
     * @hidden
     * Creates a new hidden iframe or gets an existing one for silent token renewal.
     * @ignore
     */
    SilentHandler.prototype.createHiddenIframe = function () {
        var authFrame = document.createElement("iframe");
        authFrame.style.visibility = "hidden";
        authFrame.style.position = "absolute";
        authFrame.style.width = authFrame.style.height = "0";
        authFrame.style.border = "0";
        authFrame.setAttribute("sandbox", "allow-scripts allow-same-origin allow-forms");
        document.getElementsByTagName("body")[0].appendChild(authFrame);
        return authFrame;
    };
    /**
     * @hidden
     * Removes a hidden iframe from the page.
     * @ignore
     */
    SilentHandler.prototype.removeHiddenIframe = function (iframe) {
        if (document.body === iframe.parentNode) {
            document.body.removeChild(iframe);
        }
    };
    return SilentHandler;
}(InteractionHandler));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var SilentIframeClient = /** @class */ (function (_super) {
    __extends$1(SilentIframeClient, _super);
    function SilentIframeClient(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, apiId, performanceClient, nativeStorageImpl, nativeMessageHandler, correlationId) {
        var _this = _super.call(this, config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeMessageHandler, correlationId) || this;
        _this.apiId = apiId;
        _this.nativeStorage = nativeStorageImpl;
        return _this;
    }
    /**
     * Acquires a token silently by opening a hidden iframe to the /authorize endpoint with prompt=none
     * @param request
     */
    SilentIframeClient.prototype.acquireToken = function (request) {
        return __awaiter$1(this, void 0, void 0, function () {
            var acquireTokenMeasurement, silentRequest, serverTelemetryManager, authClient, e_1;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.verbose("acquireTokenByIframe called");
                        acquireTokenMeasurement = this.performanceClient.startMeasurement(exports.PerformanceEvents.SilentIframeClientAcquireToken, request.correlationId);
                        // Check that we have some SSO data
                        if (StringUtils.isEmpty(request.loginHint) && StringUtils.isEmpty(request.sid) && (!request.account || StringUtils.isEmpty(request.account.username))) {
                            this.logger.warning("No user hint provided. The authorization server may need more information to complete this request.");
                        }
                        // Check that prompt is set to none, throw error if it is set to anything else.
                        if (request.prompt && request.prompt !== PromptValue.NONE) {
                            acquireTokenMeasurement.endMeasurement({
                                success: false
                            });
                            throw BrowserAuthError.createSilentPromptValueError(request.prompt);
                        }
                        return [4 /*yield*/, this.initializeAuthorizationRequest(__assign$1(__assign$1({}, request), { prompt: PromptValue.NONE }), exports.InteractionType.Silent)];
                    case 1:
                        silentRequest = _a.sent();
                        this.browserStorage.updateCacheEntries(silentRequest.state, silentRequest.nonce, silentRequest.authority, silentRequest.loginHint || Constants.EMPTY_STRING, silentRequest.account || null);
                        serverTelemetryManager = this.initializeServerTelemetryManager(this.apiId);
                        _a.label = 2;
                    case 2:
                        _a.trys.push([2, 5, , 6]);
                        return [4 /*yield*/, this.createAuthCodeClient(serverTelemetryManager, silentRequest.authority, silentRequest.azureCloudOptions)];
                    case 3:
                        authClient = _a.sent();
                        this.logger.verbose("Auth code client created");
                        return [4 /*yield*/, this.silentTokenHelper(authClient, silentRequest).then(function (result) {
                                acquireTokenMeasurement.endMeasurement({
                                    success: true,
                                    fromCache: false
                                });
                                return result;
                            })];
                    case 4: return [2 /*return*/, _a.sent()];
                    case 5:
                        e_1 = _a.sent();
                        if (e_1 instanceof AuthError) {
                            e_1.setCorrelationId(this.correlationId);
                        }
                        serverTelemetryManager.cacheFailedRequest(e_1);
                        this.browserStorage.cleanRequestByState(silentRequest.state);
                        acquireTokenMeasurement.endMeasurement({
                            errorCode: e_1 instanceof AuthError && e_1.errorCode || undefined,
                            subErrorCode: e_1 instanceof AuthError && e_1.subError || undefined,
                            success: false
                        });
                        throw e_1;
                    case 6: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Currently Unsupported
     */
    SilentIframeClient.prototype.logout = function () {
        // Synchronous so we must reject
        return Promise.reject(BrowserAuthError.createSilentLogoutUnsupportedError());
    };
    /**
     * Helper which acquires an authorization code silently using a hidden iframe from given url
     * using the scopes requested as part of the id, and exchanges the code for a set of OAuth tokens.
     * @param navigateUrl
     * @param userRequestScopes
     */
    SilentIframeClient.prototype.silentTokenHelper = function (authClient, silentRequest) {
        return __awaiter$1(this, void 0, void 0, function () {
            var authCodeRequest, navigateUrl, silentHandler, msalFrame, hash, serverParams, state, nativeInteractionClient, userRequestState;
            var _this = this;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.initializeAuthorizationCodeRequest(silentRequest)];
                    case 1:
                        authCodeRequest = _a.sent();
                        return [4 /*yield*/, authClient.getAuthCodeUrl(__assign$1(__assign$1({}, silentRequest), { nativeBroker: NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeMessageHandler, silentRequest.authenticationScheme) }))];
                    case 2:
                        navigateUrl = _a.sent();
                        silentHandler = new SilentHandler(authClient, this.browserStorage, authCodeRequest, this.logger, this.config.system.navigateFrameWait);
                        return [4 /*yield*/, silentHandler.initiateAuthRequest(navigateUrl)];
                    case 3:
                        msalFrame = _a.sent();
                        return [4 /*yield*/, silentHandler.monitorIframeForHash(msalFrame, this.config.system.iframeHashTimeout)];
                    case 4:
                        hash = _a.sent();
                        serverParams = UrlString.getDeserializedHash(hash);
                        state = this.validateAndExtractStateFromHash(serverParams, exports.InteractionType.Silent, authCodeRequest.correlationId);
                        if (serverParams.accountId) {
                            this.logger.verbose("Account id found in hash, calling WAM for token");
                            if (!this.nativeMessageHandler) {
                                throw BrowserAuthError.createNativeConnectionNotEstablishedError();
                            }
                            nativeInteractionClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, this.apiId, this.performanceClient, this.nativeMessageHandler, serverParams.accountId, this.browserStorage, this.correlationId);
                            userRequestState = ProtocolUtils.parseRequestState(this.browserCrypto, state).userRequestState;
                            return [2 /*return*/, nativeInteractionClient.acquireToken(__assign$1(__assign$1({}, silentRequest), { state: userRequestState, prompt: PromptValue.NONE })).finally(function () {
                                    _this.browserStorage.cleanRequestByState(state);
                                })];
                        }
                        // Handle response from hash string
                        return [2 /*return*/, silentHandler.handleCodeResponseFromHash(hash, state, authClient.authority, this.networkClient)];
                }
            });
        });
    };
    return SilentIframeClient;
}(StandardInteractionClient));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var SilentRefreshClient = /** @class */ (function (_super) {
    __extends$1(SilentRefreshClient, _super);
    function SilentRefreshClient() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    /**
     * Exchanges the refresh token for new tokens
     * @param request
     */
    SilentRefreshClient.prototype.acquireToken = function (request) {
        return __awaiter$1(this, void 0, void 0, function () {
            var silentRequest, _a, acquireTokenMeasurement, serverTelemetryManager, refreshTokenClient;
            var _this = this;
            return __generator$1(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        _a = [__assign$1({}, request)];
                        return [4 /*yield*/, this.initializeBaseRequest(request)];
                    case 1:
                        silentRequest = __assign$1.apply(void 0, _a.concat([_b.sent()]));
                        acquireTokenMeasurement = this.performanceClient.startMeasurement(exports.PerformanceEvents.SilentRefreshClientAcquireToken, silentRequest.correlationId);
                        serverTelemetryManager = this.initializeServerTelemetryManager(exports.ApiId.acquireTokenSilent_silentFlow);
                        return [4 /*yield*/, this.createRefreshTokenClient(serverTelemetryManager, silentRequest.authority, silentRequest.azureCloudOptions)];
                    case 2:
                        refreshTokenClient = _b.sent();
                        this.logger.verbose("Refresh token client created");
                        // Send request to renew token. Auth module will throw errors if token cannot be renewed.
                        return [2 /*return*/, refreshTokenClient.acquireTokenByRefreshToken(silentRequest)
                                .then(function (result) {
                                acquireTokenMeasurement.endMeasurement({
                                    success: true,
                                    fromCache: result.fromCache
                                });
                                return result;
                            })
                                .catch(function (e) {
                                if (e instanceof AuthError) {
                                    e.setCorrelationId(_this.correlationId);
                                }
                                serverTelemetryManager.cacheFailedRequest(e);
                                acquireTokenMeasurement.endMeasurement({
                                    errorCode: e.errorCode,
                                    subErrorCode: e.subError,
                                    success: false
                                });
                                throw e;
                            })];
                }
            });
        });
    };
    /**
     * Currently Unsupported
     */
    SilentRefreshClient.prototype.logout = function () {
        // Synchronous so we must reject
        return Promise.reject(BrowserAuthError.createSilentLogoutUnsupportedError());
    };
    /**
     * Creates a Refresh Client with the given authority, or the default authority.
     * @param serverTelemetryManager
     * @param authorityUrl
     */
    SilentRefreshClient.prototype.createRefreshTokenClient = function (serverTelemetryManager, authorityUrl, azureCloudOptions) {
        return __awaiter$1(this, void 0, void 0, function () {
            var clientConfig;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.getClientConfiguration(serverTelemetryManager, authorityUrl, azureCloudOptions)];
                    case 1:
                        clientConfig = _a.sent();
                        return [2 /*return*/, new RefreshTokenClient(clientConfig, this.performanceClient)];
                }
            });
        });
    };
    return SilentRefreshClient;
}(StandardInteractionClient));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var EventHandler = /** @class */ (function () {
    function EventHandler(logger, browserCrypto) {
        this.eventCallbacks = new Map();
        this.logger = logger;
        this.browserCrypto = browserCrypto;
        this.listeningToStorageEvents = false;
        this.handleAccountCacheChange = this.handleAccountCacheChange.bind(this);
    }
    /**
     * Adds event callbacks to array
     * @param callback
     */
    EventHandler.prototype.addEventCallback = function (callback) {
        if (typeof window !== "undefined") {
            var callbackId = this.browserCrypto.createNewGuid();
            this.eventCallbacks.set(callbackId, callback);
            this.logger.verbose("Event callback registered with id: " + callbackId);
            return callbackId;
        }
        return null;
    };
    /**
     * Removes callback with provided id from callback array
     * @param callbackId
     */
    EventHandler.prototype.removeEventCallback = function (callbackId) {
        this.eventCallbacks.delete(callbackId);
        this.logger.verbose("Event callback " + callbackId + " removed.");
    };
    /**
     * Adds event listener that emits an event when a user account is added or removed from localstorage in a different browser tab or window
     */
    EventHandler.prototype.enableAccountStorageEvents = function () {
        if (typeof window === "undefined") {
            return;
        }
        if (!this.listeningToStorageEvents) {
            this.logger.verbose("Adding account storage listener.");
            this.listeningToStorageEvents = true;
            window.addEventListener("storage", this.handleAccountCacheChange);
        }
        else {
            this.logger.verbose("Account storage listener already registered.");
        }
    };
    /**
     * Removes event listener that emits an event when a user account is added or removed from localstorage in a different browser tab or window
     */
    EventHandler.prototype.disableAccountStorageEvents = function () {
        if (typeof window === "undefined") {
            return;
        }
        if (this.listeningToStorageEvents) {
            this.logger.verbose("Removing account storage listener.");
            window.removeEventListener("storage", this.handleAccountCacheChange);
            this.listeningToStorageEvents = false;
        }
        else {
            this.logger.verbose("No account storage listener registered.");
        }
    };
    /**
     * Emits events by calling callback with event message
     * @param eventType
     * @param interactionType
     * @param payload
     * @param error
     */
    EventHandler.prototype.emitEvent = function (eventType, interactionType, payload, error) {
        var _this = this;
        if (typeof window !== "undefined") {
            var message_1 = {
                eventType: eventType,
                interactionType: interactionType || null,
                payload: payload || null,
                error: error || null,
                timestamp: Date.now()
            };
            this.logger.info("Emitting event: " + eventType);
            this.eventCallbacks.forEach(function (callback, callbackId) {
                _this.logger.verbose("Emitting event to callback " + callbackId + ": " + eventType);
                callback.apply(null, [message_1]);
            });
        }
    };
    /**
     * Emit account added/removed events when cached accounts are changed in a different tab or frame
     */
    EventHandler.prototype.handleAccountCacheChange = function (e) {
        try {
            var cacheValue = e.newValue || e.oldValue;
            if (!cacheValue) {
                return;
            }
            var parsedValue = JSON.parse(cacheValue);
            if (typeof parsedValue !== "object" || !AccountEntity.isAccountEntity(parsedValue)) {
                return;
            }
            var accountEntity = CacheManager.toObject(new AccountEntity(), parsedValue);
            var accountInfo = accountEntity.getAccountInfo();
            if (!e.oldValue && e.newValue) {
                this.logger.info("Account was added to cache in a different window");
                this.emitEvent(exports.EventType.ACCOUNT_ADDED, undefined, accountInfo);
            }
            else if (!e.newValue && e.oldValue) {
                this.logger.info("Account was removed from cache in a different window");
                this.emitEvent(exports.EventType.ACCOUNT_REMOVED, undefined, accountInfo);
            }
        }
        catch (e) {
            return;
        }
    };
    return EventHandler;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */

var internals = /*#__PURE__*/Object.freeze({
    __proto__: null,
    BrowserCacheManager: BrowserCacheManager,
    StandardInteractionClient: StandardInteractionClient,
    RedirectClient: RedirectClient,
    PopupClient: PopupClient,
    SilentIframeClient: SilentIframeClient,
    SilentCacheClient: SilentCacheClient,
    SilentRefreshClient: SilentRefreshClient,
    RedirectHandler: RedirectHandler,
    EventHandler: EventHandler,
    NativeMessageHandler: NativeMessageHandler,
    BrowserConstants: BrowserConstants,
    get TemporaryCacheKeys () { return TemporaryCacheKeys; }
});

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Utility class for math specific functions in browser.
 */
var MathUtils = /** @class */ (function () {
    function MathUtils() {
    }
    /**
     * Decimal to Hex
     *
     * @param num
     */
    MathUtils.decimalToHex = function (num) {
        var hex = num.toString(16);
        while (hex.length < 2) {
            hex = "0" + hex;
        }
        return hex;
    };
    return MathUtils;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var GuidGenerator = /** @class */ (function () {
    function GuidGenerator(cryptoObj) {
        this.cryptoObj = cryptoObj;
    }
    /*
     * RFC4122: The version 4 UUID is meant for generating UUIDs from truly-random or
     * pseudo-random numbers.
     * The algorithm is as follows:
     *     Set the two most significant bits (bits 6 and 7) of the
     *        clock_seq_hi_and_reserved to zero and one, respectively.
     *     Set the four most significant bits (bits 12 through 15) of the
     *        time_hi_and_version field to the 4-bit version number from
     *        Section 4.1.3. Version4
     *     Set all the other bits to randomly (or pseudo-randomly) chosen
     *     values.
     * UUID                   = time-low "-" time-mid "-"time-high-and-version "-"clock-seq-reserved and low(2hexOctet)"-" node
     * time-low               = 4hexOctet
     * time-mid               = 2hexOctet
     * time-high-and-version  = 2hexOctet
     * clock-seq-and-reserved = hexOctet:
     * clock-seq-low          = hexOctet
     * node                   = 6hexOctet
     * Format: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
     * y could be 1000, 1001, 1010, 1011 since most significant two bits needs to be 10
     * y values are 8, 9, A, B
     */
    GuidGenerator.prototype.generateGuid = function () {
        try {
            var buffer = new Uint8Array(16);
            this.cryptoObj.getRandomValues(buffer);
            // buffer[6] and buffer[7] represents the time_hi_and_version field. We will set the four most significant bits (4 through 7) of buffer[6] to represent decimal number 4 (UUID version number).
            buffer[6] |= 0x40; // buffer[6] | 01000000 will set the 6 bit to 1.
            buffer[6] &= 0x4f; // buffer[6] & 01001111 will set the 4, 5, and 7 bit to 0 such that bits 4-7 == 0100 = "4".
            // buffer[8] represents the clock_seq_hi_and_reserved field. We will set the two most significant bits (6 and 7) of the clock_seq_hi_and_reserved to zero and one, respectively.
            buffer[8] |= 0x80; // buffer[8] | 10000000 will set the 7 bit to 1.
            buffer[8] &= 0xbf; // buffer[8] & 10111111 will set the 6 bit to 0.
            return MathUtils.decimalToHex(buffer[0]) + MathUtils.decimalToHex(buffer[1])
                + MathUtils.decimalToHex(buffer[2]) + MathUtils.decimalToHex(buffer[3])
                + "-" + MathUtils.decimalToHex(buffer[4]) + MathUtils.decimalToHex(buffer[5])
                + "-" + MathUtils.decimalToHex(buffer[6]) + MathUtils.decimalToHex(buffer[7])
                + "-" + MathUtils.decimalToHex(buffer[8]) + MathUtils.decimalToHex(buffer[9])
                + "-" + MathUtils.decimalToHex(buffer[10]) + MathUtils.decimalToHex(buffer[11])
                + MathUtils.decimalToHex(buffer[12]) + MathUtils.decimalToHex(buffer[13])
                + MathUtils.decimalToHex(buffer[14]) + MathUtils.decimalToHex(buffer[15]);
        }
        catch (err) {
            var guidHolder = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx";
            var hex = "0123456789abcdef";
            var r = 0;
            var guidResponse = Constants.EMPTY_STRING;
            for (var i = 0; i < 36; i++) {
                if (guidHolder[i] !== "-" && guidHolder[i] !== "4") {
                    // each x and y needs to be random
                    r = Math.random() * 16 | 0;
                }
                if (guidHolder[i] === "x") {
                    guidResponse += hex[r];
                }
                else if (guidHolder[i] === "y") {
                    // clock-seq-and-reserved first hex is filtered and remaining hex values are random
                    r &= 0x3; // bit and with 0011 to set pos 2 to zero ?0??
                    r |= 0x8; // set pos 3 to 1 as 1???
                    guidResponse += hex[r];
                }
                else {
                    guidResponse += guidHolder[i];
                }
            }
            return guidResponse;
        }
    };
    /**
     * verifies if a string is  GUID
     * @param guid
     */
    GuidGenerator.prototype.isGuid = function (guid) {
        var regexGuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
        return regexGuid.test(guid);
    };
    return GuidGenerator;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Utility functions for strings in a browser. See here for implementation details:
 * https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#Solution_2_%E2%80%93_JavaScript's_UTF-16_%3E_UTF-8_%3E_base64
 */
var BrowserStringUtils = /** @class */ (function () {
    function BrowserStringUtils() {
    }
    /**
     * Converts string to Uint8Array
     * @param sDOMStr
     */
    BrowserStringUtils.stringToUtf8Arr = function (sDOMStr) {
        var nChr;
        var nArrLen = 0;
        var nStrLen = sDOMStr.length;
        /* mapping... */
        for (var nMapIdx = 0; nMapIdx < nStrLen; nMapIdx++) {
            nChr = sDOMStr.charCodeAt(nMapIdx);
            nArrLen += nChr < 0x80 ? 1 : nChr < 0x800 ? 2 : nChr < 0x10000 ? 3 : nChr < 0x200000 ? 4 : nChr < 0x4000000 ? 5 : 6;
        }
        var aBytes = new Uint8Array(nArrLen);
        /* transcription... */
        for (var nIdx = 0, nChrIdx = 0; nIdx < nArrLen; nChrIdx++) {
            nChr = sDOMStr.charCodeAt(nChrIdx);
            if (nChr < 128) {
                /* one byte */
                aBytes[nIdx++] = nChr;
            }
            else if (nChr < 0x800) {
                /* two bytes */
                aBytes[nIdx++] = 192 + (nChr >>> 6);
                aBytes[nIdx++] = 128 + (nChr & 63);
            }
            else if (nChr < 0x10000) {
                /* three bytes */
                aBytes[nIdx++] = 224 + (nChr >>> 12);
                aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);
                aBytes[nIdx++] = 128 + (nChr & 63);
            }
            else if (nChr < 0x200000) {
                /* four bytes */
                aBytes[nIdx++] = 240 + (nChr >>> 18);
                aBytes[nIdx++] = 128 + (nChr >>> 12 & 63);
                aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);
                aBytes[nIdx++] = 128 + (nChr & 63);
            }
            else if (nChr < 0x4000000) {
                /* five bytes */
                aBytes[nIdx++] = 248 + (nChr >>> 24);
                aBytes[nIdx++] = 128 + (nChr >>> 18 & 63);
                aBytes[nIdx++] = 128 + (nChr >>> 12 & 63);
                aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);
                aBytes[nIdx++] = 128 + (nChr & 63);
            }
            else /* if (nChr <= 0x7fffffff) */ {
                /* six bytes */
                aBytes[nIdx++] = 252 + (nChr >>> 30);
                aBytes[nIdx++] = 128 + (nChr >>> 24 & 63);
                aBytes[nIdx++] = 128 + (nChr >>> 18 & 63);
                aBytes[nIdx++] = 128 + (nChr >>> 12 & 63);
                aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);
                aBytes[nIdx++] = 128 + (nChr & 63);
            }
        }
        return aBytes;
    };
    /**
     * Converst string to ArrayBuffer
     * @param dataString
     */
    BrowserStringUtils.stringToArrayBuffer = function (dataString) {
        var data = new ArrayBuffer(dataString.length);
        var dataView = new Uint8Array(data);
        for (var i = 0; i < dataString.length; i++) {
            dataView[i] = dataString.charCodeAt(i);
        }
        return data;
    };
    /**
     * Converts Uint8Array to a string
     * @param aBytes
     */
    BrowserStringUtils.utf8ArrToString = function (aBytes) {
        var sView = Constants.EMPTY_STRING;
        for (var nPart = void 0, nLen = aBytes.length, nIdx = 0; nIdx < nLen; nIdx++) {
            nPart = aBytes[nIdx];
            sView += String.fromCharCode(nPart > 251 && nPart < 254 && nIdx + 5 < nLen ? /* six bytes */
                /* (nPart - 252 << 30) may be not so safe in ECMAScript! So...: */
                (nPart - 252) * 1073741824 + (aBytes[++nIdx] - 128 << 24) + (aBytes[++nIdx] - 128 << 18) + (aBytes[++nIdx] - 128 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
                : nPart > 247 && nPart < 252 && nIdx + 4 < nLen ? /* five bytes */
                    (nPart - 248 << 24) + (aBytes[++nIdx] - 128 << 18) + (aBytes[++nIdx] - 128 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
                    : nPart > 239 && nPart < 248 && nIdx + 3 < nLen ? /* four bytes */
                        (nPart - 240 << 18) + (aBytes[++nIdx] - 128 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
                        : nPart > 223 && nPart < 240 && nIdx + 2 < nLen ? /* three bytes */
                            (nPart - 224 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
                            : nPart > 191 && nPart < 224 && nIdx + 1 < nLen ? /* two bytes */
                                (nPart - 192 << 6) + aBytes[++nIdx] - 128
                                : /* nPart < 127 ? */ /* one byte */
                                    nPart);
        }
        return sView;
    };
    return BrowserStringUtils;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Class which exposes APIs to encode plaintext to base64 encoded string. See here for implementation details:
 * https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#Solution_2_%E2%80%93_JavaScript's_UTF-16_%3E_UTF-8_%3E_base64
 */
var Base64Encode = /** @class */ (function () {
    function Base64Encode() {
    }
    /**
     * Returns URL Safe b64 encoded string from a plaintext string.
     * @param input
     */
    Base64Encode.prototype.urlEncode = function (input) {
        return encodeURIComponent(this.encode(input)
            .replace(/=/g, Constants.EMPTY_STRING)
            .replace(/\+/g, "-")
            .replace(/\//g, "_"));
    };
    /**
     * Returns URL Safe b64 encoded string from an int8Array.
     * @param inputArr
     */
    Base64Encode.prototype.urlEncodeArr = function (inputArr) {
        return this.base64EncArr(inputArr)
            .replace(/=/g, Constants.EMPTY_STRING)
            .replace(/\+/g, "-")
            .replace(/\//g, "_");
    };
    /**
     * Returns b64 encoded string from plaintext string.
     * @param input
     */
    Base64Encode.prototype.encode = function (input) {
        var inputUtf8Arr = BrowserStringUtils.stringToUtf8Arr(input);
        return this.base64EncArr(inputUtf8Arr);
    };
    /**
     * Base64 encode byte array
     * @param aBytes
     */
    Base64Encode.prototype.base64EncArr = function (aBytes) {
        var eqLen = (3 - (aBytes.length % 3)) % 3;
        var sB64Enc = Constants.EMPTY_STRING;
        for (var nMod3 = void 0, nLen = aBytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; nIdx++) {
            nMod3 = nIdx % 3;
            /* Uncomment the following line in order to split the output in lines 76-character long: */
            /*
             *if (nIdx > 0 && (nIdx * 4 / 3) % 76 === 0) { sB64Enc += "\r\n"; }
             */
            nUint24 |= aBytes[nIdx] << (16 >>> nMod3 & 24);
            if (nMod3 === 2 || aBytes.length - nIdx === 1) {
                sB64Enc += String.fromCharCode(this.uint6ToB64(nUint24 >>> 18 & 63), this.uint6ToB64(nUint24 >>> 12 & 63), this.uint6ToB64(nUint24 >>> 6 & 63), this.uint6ToB64(nUint24 & 63));
                nUint24 = 0;
            }
        }
        return eqLen === 0 ? sB64Enc : sB64Enc.substring(0, sB64Enc.length - eqLen) + (eqLen === 1 ? "=" : "==");
    };
    /**
     * Base64 string to array encoding helper
     * @param nUint6
     */
    Base64Encode.prototype.uint6ToB64 = function (nUint6) {
        return nUint6 < 26 ?
            nUint6 + 65
            : nUint6 < 52 ?
                nUint6 + 71
                : nUint6 < 62 ?
                    nUint6 - 4
                    : nUint6 === 62 ?
                        43
                        : nUint6 === 63 ?
                            47
                            :
                                65;
    };
    return Base64Encode;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Class which exposes APIs to decode base64 strings to plaintext. See here for implementation details:
 * https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#Solution_2_%E2%80%93_JavaScript's_UTF-16_%3E_UTF-8_%3E_base64
 */
var Base64Decode = /** @class */ (function () {
    function Base64Decode() {
    }
    /**
     * Returns a URL-safe plaintext decoded string from b64 encoded input.
     * @param input
     */
    Base64Decode.prototype.decode = function (input) {
        var encodedString = input.replace(/-/g, "+").replace(/_/g, "/");
        switch (encodedString.length % 4) {
            case 0:
                break;
            case 2:
                encodedString += "==";
                break;
            case 3:
                encodedString += "=";
                break;
            default:
                throw new Error("Invalid base64 string");
        }
        var inputUtf8Arr = this.base64DecToArr(encodedString);
        return BrowserStringUtils.utf8ArrToString(inputUtf8Arr);
    };
    /**
     * Decodes base64 into Uint8Array
     * @param base64String
     * @param nBlockSize
     */
    Base64Decode.prototype.base64DecToArr = function (base64String, nBlockSize) {
        var sB64Enc = base64String.replace(/[^A-Za-z0-9\+\/]/g, Constants.EMPTY_STRING);
        var nInLen = sB64Enc.length;
        var nOutLen = nBlockSize ? Math.ceil((nInLen * 3 + 1 >>> 2) / nBlockSize) * nBlockSize : nInLen * 3 + 1 >>> 2;
        var aBytes = new Uint8Array(nOutLen);
        for (var nMod3 = void 0, nMod4 = void 0, nUint24 = 0, nOutIdx = 0, nInIdx = 0; nInIdx < nInLen; nInIdx++) {
            nMod4 = nInIdx & 3;
            nUint24 |= this.b64ToUint6(sB64Enc.charCodeAt(nInIdx)) << 18 - 6 * nMod4;
            if (nMod4 === 3 || nInLen - nInIdx === 1) {
                for (nMod3 = 0; nMod3 < 3 && nOutIdx < nOutLen; nMod3++, nOutIdx++) {
                    aBytes[nOutIdx] = nUint24 >>> (16 >>> nMod3 & 24) & 255;
                }
                nUint24 = 0;
            }
        }
        return aBytes;
    };
    /**
     * Base64 string to array decoding helper
     * @param charNum
     */
    Base64Decode.prototype.b64ToUint6 = function (charNum) {
        return charNum > 64 && charNum < 91 ?
            charNum - 65
            : charNum > 96 && charNum < 123 ?
                charNum - 71
                : charNum > 47 && charNum < 58 ?
                    charNum + 4
                    : charNum === 43 ?
                        62
                        : charNum === 47 ?
                            63
                            :
                                0;
    };
    return Base64Decode;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
// Constant byte array length
var RANDOM_BYTE_ARR_LENGTH = 32;
/**
 * Class which exposes APIs to generate PKCE codes and code verifiers.
 */
var PkceGenerator = /** @class */ (function () {
    function PkceGenerator(cryptoObj) {
        this.base64Encode = new Base64Encode();
        this.cryptoObj = cryptoObj;
    }
    /**
     * Generates PKCE Codes. See the RFC for more information: https://tools.ietf.org/html/rfc7636
     */
    PkceGenerator.prototype.generateCodes = function () {
        return __awaiter$1(this, void 0, void 0, function () {
            var codeVerifier, codeChallenge;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        codeVerifier = this.generateCodeVerifier();
                        return [4 /*yield*/, this.generateCodeChallengeFromVerifier(codeVerifier)];
                    case 1:
                        codeChallenge = _a.sent();
                        return [2 /*return*/, {
                                verifier: codeVerifier,
                                challenge: codeChallenge
                            }];
                }
            });
        });
    };
    /**
     * Generates a random 32 byte buffer and returns the base64
     * encoded string to be used as a PKCE Code Verifier
     */
    PkceGenerator.prototype.generateCodeVerifier = function () {
        try {
            // Generate random values as utf-8
            var buffer = new Uint8Array(RANDOM_BYTE_ARR_LENGTH);
            this.cryptoObj.getRandomValues(buffer);
            // encode verifier as base64
            var pkceCodeVerifierB64 = this.base64Encode.urlEncodeArr(buffer);
            return pkceCodeVerifierB64;
        }
        catch (e) {
            throw BrowserAuthError.createPkceNotGeneratedError(e);
        }
    };
    /**
     * Creates a base64 encoded PKCE Code Challenge string from the
     * hash created from the PKCE Code Verifier supplied
     */
    PkceGenerator.prototype.generateCodeChallengeFromVerifier = function (pkceCodeVerifier) {
        return __awaiter$1(this, void 0, void 0, function () {
            var pkceHashedCodeVerifier, e_1;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        _a.trys.push([0, 2, , 3]);
                        return [4 /*yield*/, this.cryptoObj.sha256Digest(pkceCodeVerifier)];
                    case 1:
                        pkceHashedCodeVerifier = _a.sent();
                        // encode hash as base64
                        return [2 /*return*/, this.base64Encode.urlEncodeArr(new Uint8Array(pkceHashedCodeVerifier))];
                    case 2:
                        e_1 = _a.sent();
                        throw BrowserAuthError.createPkceNotGeneratedError(e_1);
                    case 3: return [2 /*return*/];
                }
            });
        });
    };
    return PkceGenerator;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * See here for more info on RsaHashedKeyGenParams: https://developer.mozilla.org/en-US/docs/Web/API/RsaHashedKeyGenParams
 */
// RSA KeyGen Algorithm
var PKCS1_V15_KEYGEN_ALG = "RSASSA-PKCS1-v1_5";
// SHA-256 hashing algorithm
var S256_HASH_ALG = "SHA-256";
// MOD length for PoP tokens
var MODULUS_LENGTH = 2048;
// Public Exponent
var PUBLIC_EXPONENT = new Uint8Array([0x01, 0x00, 0x01]);
/**
 * This class implements functions used by the browser library to perform cryptography operations such as
 * hashing and encoding. It also has helper functions to validate the availability of specific APIs.
 */
var BrowserCrypto = /** @class */ (function () {
    function BrowserCrypto(logger) {
        this.logger = logger;
        if (!(this.hasCryptoAPI())) {
            throw BrowserAuthError.createCryptoNotAvailableError("Browser crypto or msCrypto object not available.");
        }
        this._keygenAlgorithmOptions = {
            name: PKCS1_V15_KEYGEN_ALG,
            hash: S256_HASH_ALG,
            modulusLength: MODULUS_LENGTH,
            publicExponent: PUBLIC_EXPONENT
        };
    }
    /**
     * Returns a sha-256 hash of the given dataString as an ArrayBuffer.
     * @param dataString
     */
    BrowserCrypto.prototype.sha256Digest = function (dataString) {
        return __awaiter$1(this, void 0, void 0, function () {
            var data;
            return __generator$1(this, function (_a) {
                data = BrowserStringUtils.stringToUtf8Arr(dataString);
                return [2 /*return*/, this.hasIECrypto() ? this.getMSCryptoDigest(S256_HASH_ALG, data) : this.getSubtleCryptoDigest(S256_HASH_ALG, data)];
            });
        });
    };
    /**
     * Populates buffer with cryptographically random values.
     * @param dataBuffer
     */
    BrowserCrypto.prototype.getRandomValues = function (dataBuffer) {
        var cryptoObj = window["msCrypto"] || window.crypto;
        if (!cryptoObj.getRandomValues) {
            throw BrowserAuthError.createCryptoNotAvailableError("getRandomValues does not exist.");
        }
        cryptoObj.getRandomValues(dataBuffer);
    };
    /**
     * Generates a keypair based on current keygen algorithm config.
     * @param extractable
     * @param usages
     */
    BrowserCrypto.prototype.generateKeyPair = function (extractable, usages) {
        return __awaiter$1(this, void 0, void 0, function () {
            return __generator$1(this, function (_a) {
                return [2 /*return*/, (this.hasIECrypto() ?
                        this.msCryptoGenerateKey(extractable, usages)
                        : window.crypto.subtle.generateKey(this._keygenAlgorithmOptions, extractable, usages))];
            });
        });
    };
    /**
     * Export key as Json Web Key (JWK)
     * @param key
     * @param format
     */
    BrowserCrypto.prototype.exportJwk = function (key) {
        return __awaiter$1(this, void 0, void 0, function () {
            return __generator$1(this, function (_a) {
                return [2 /*return*/, this.hasIECrypto() ? this.msCryptoExportJwk(key) : window.crypto.subtle.exportKey(KEY_FORMAT_JWK, key)];
            });
        });
    };
    /**
     * Imports key as Json Web Key (JWK), can set extractable and usages.
     * @param key
     * @param format
     * @param extractable
     * @param usages
     */
    BrowserCrypto.prototype.importJwk = function (key, extractable, usages) {
        return __awaiter$1(this, void 0, void 0, function () {
            var keyString, keyBuffer;
            return __generator$1(this, function (_a) {
                keyString = BrowserCrypto.getJwkString(key);
                keyBuffer = BrowserStringUtils.stringToArrayBuffer(keyString);
                return [2 /*return*/, this.hasIECrypto() ?
                        this.msCryptoImportKey(keyBuffer, extractable, usages)
                        : window.crypto.subtle.importKey(KEY_FORMAT_JWK, key, this._keygenAlgorithmOptions, extractable, usages)];
            });
        });
    };
    /**
     * Signs given data with given key
     * @param key
     * @param data
     */
    BrowserCrypto.prototype.sign = function (key, data) {
        return __awaiter$1(this, void 0, void 0, function () {
            return __generator$1(this, function (_a) {
                return [2 /*return*/, this.hasIECrypto() ?
                        this.msCryptoSign(key, data)
                        : window.crypto.subtle.sign(this._keygenAlgorithmOptions, key, data)];
            });
        });
    };
    /**
     * Check whether IE crypto or other browser cryptography is available.
     */
    BrowserCrypto.prototype.hasCryptoAPI = function () {
        return this.hasIECrypto() || this.hasBrowserCrypto();
    };
    /**
     * Checks whether IE crypto (AKA msCrypto) is available.
     */
    BrowserCrypto.prototype.hasIECrypto = function () {
        return "msCrypto" in window;
    };
    /**
     * Check whether browser crypto is available.
     */
    BrowserCrypto.prototype.hasBrowserCrypto = function () {
        return "crypto" in window;
    };
    /**
     * Helper function for SHA digest.
     * @param algorithm
     * @param data
     */
    BrowserCrypto.prototype.getSubtleCryptoDigest = function (algorithm, data) {
        return __awaiter$1(this, void 0, void 0, function () {
            return __generator$1(this, function (_a) {
                return [2 /*return*/, window.crypto.subtle.digest(algorithm, data)];
            });
        });
    };
    /**
     * IE Helper function for SHA digest.
     * @param algorithm
     * @param data
     */
    BrowserCrypto.prototype.getMSCryptoDigest = function (algorithm, data) {
        return __awaiter$1(this, void 0, void 0, function () {
            return __generator$1(this, function (_a) {
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        var digestOperation = window["msCrypto"].subtle.digest(algorithm, data.buffer);
                        digestOperation.addEventListener("complete", function (e) {
                            resolve(e.target.result);
                        });
                        digestOperation.addEventListener("error", function (error) {
                            reject(error);
                        });
                    })];
            });
        });
    };
    /**
     * IE Helper function for generating a keypair
     * @param extractable
     * @param usages
     */
    BrowserCrypto.prototype.msCryptoGenerateKey = function (extractable, usages) {
        return __awaiter$1(this, void 0, void 0, function () {
            var _this = this;
            return __generator$1(this, function (_a) {
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        var msGenerateKey = window["msCrypto"].subtle.generateKey(_this._keygenAlgorithmOptions, extractable, usages);
                        msGenerateKey.addEventListener("complete", function (e) {
                            resolve(e.target.result);
                        });
                        msGenerateKey.addEventListener("error", function (error) {
                            reject(error);
                        });
                    })];
            });
        });
    };
    /**
     * IE Helper function for exportKey
     * @param key
     * @param format
     */
    BrowserCrypto.prototype.msCryptoExportJwk = function (key) {
        return __awaiter$1(this, void 0, void 0, function () {
            return __generator$1(this, function (_a) {
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        var msExportKey = window["msCrypto"].subtle.exportKey(KEY_FORMAT_JWK, key);
                        msExportKey.addEventListener("complete", function (e) {
                            var resultBuffer = e.target.result;
                            var resultString = BrowserStringUtils.utf8ArrToString(new Uint8Array(resultBuffer))
                                .replace(/\r/g, Constants.EMPTY_STRING)
                                .replace(/\n/g, Constants.EMPTY_STRING)
                                .replace(/\t/g, Constants.EMPTY_STRING)
                                .split(" ").join(Constants.EMPTY_STRING)
                                .replace("\u0000", Constants.EMPTY_STRING);
                            try {
                                resolve(JSON.parse(resultString));
                            }
                            catch (e) {
                                reject(e);
                            }
                        });
                        msExportKey.addEventListener("error", function (error) {
                            reject(error);
                        });
                    })];
            });
        });
    };
    /**
     * IE Helper function for importKey
     * @param key
     * @param format
     * @param extractable
     * @param usages
     */
    BrowserCrypto.prototype.msCryptoImportKey = function (keyBuffer, extractable, usages) {
        return __awaiter$1(this, void 0, void 0, function () {
            var _this = this;
            return __generator$1(this, function (_a) {
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        var msImportKey = window["msCrypto"].subtle.importKey(KEY_FORMAT_JWK, keyBuffer, _this._keygenAlgorithmOptions, extractable, usages);
                        msImportKey.addEventListener("complete", function (e) {
                            resolve(e.target.result);
                        });
                        msImportKey.addEventListener("error", function (error) {
                            reject(error);
                        });
                    })];
            });
        });
    };
    /**
     * IE Helper function for sign JWT
     * @param key
     * @param data
     */
    BrowserCrypto.prototype.msCryptoSign = function (key, data) {
        return __awaiter$1(this, void 0, void 0, function () {
            var _this = this;
            return __generator$1(this, function (_a) {
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        var msSign = window["msCrypto"].subtle.sign(_this._keygenAlgorithmOptions, key, data);
                        msSign.addEventListener("complete", function (e) {
                            resolve(e.target.result);
                        });
                        msSign.addEventListener("error", function (error) {
                            reject(error);
                        });
                    })];
            });
        });
    };
    /**
     * Returns stringified jwk.
     * @param jwk
     */
    BrowserCrypto.getJwkString = function (jwk) {
        return JSON.stringify(jwk, Object.keys(jwk).sort());
    };
    return BrowserCrypto;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Storage wrapper for IndexedDB storage in browsers: https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API
 */
var DatabaseStorage = /** @class */ (function () {
    function DatabaseStorage() {
        this.dbName = DB_NAME;
        this.version = DB_VERSION;
        this.tableName = DB_TABLE_NAME;
        this.dbOpen = false;
    }
    /**
     * Opens IndexedDB instance.
     */
    DatabaseStorage.prototype.open = function () {
        return __awaiter$1(this, void 0, void 0, function () {
            var _this = this;
            return __generator$1(this, function (_a) {
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        var openDB = window.indexedDB.open(_this.dbName, _this.version);
                        openDB.addEventListener("upgradeneeded", function (e) {
                            var event = e;
                            event.target.result.createObjectStore(_this.tableName);
                        });
                        openDB.addEventListener("success", function (e) {
                            var event = e;
                            _this.db = event.target.result;
                            _this.dbOpen = true;
                            resolve();
                        });
                        openDB.addEventListener("error", function () { return reject(BrowserAuthError.createDatabaseUnavailableError()); });
                    })];
            });
        });
    };
    /**
     * Closes the connection to IndexedDB database when all pending transactions
     * complete.
     */
    DatabaseStorage.prototype.closeConnection = function () {
        var db = this.db;
        if (db && this.dbOpen) {
            db.close();
            this.dbOpen = false;
        }
    };
    /**
     * Opens database if it's not already open
     */
    DatabaseStorage.prototype.validateDbIsOpen = function () {
        return __awaiter$1(this, void 0, void 0, function () {
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        if (!!this.dbOpen) return [3 /*break*/, 2];
                        return [4 /*yield*/, this.open()];
                    case 1: return [2 /*return*/, _a.sent()];
                    case 2: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Retrieves item from IndexedDB instance.
     * @param key
     */
    DatabaseStorage.prototype.getItem = function (key) {
        return __awaiter$1(this, void 0, void 0, function () {
            var _this = this;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.validateDbIsOpen()];
                    case 1:
                        _a.sent();
                        return [2 /*return*/, new Promise(function (resolve, reject) {
                                // TODO: Add timeouts?
                                if (!_this.db) {
                                    return reject(BrowserAuthError.createDatabaseNotOpenError());
                                }
                                var transaction = _this.db.transaction([_this.tableName], "readonly");
                                var objectStore = transaction.objectStore(_this.tableName);
                                var dbGet = objectStore.get(key);
                                dbGet.addEventListener("success", function (e) {
                                    var event = e;
                                    _this.closeConnection();
                                    resolve(event.target.result);
                                });
                                dbGet.addEventListener("error", function (e) {
                                    _this.closeConnection();
                                    reject(e);
                                });
                            })];
                }
            });
        });
    };
    /**
     * Adds item to IndexedDB under given key
     * @param key
     * @param payload
     */
    DatabaseStorage.prototype.setItem = function (key, payload) {
        return __awaiter$1(this, void 0, void 0, function () {
            var _this = this;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.validateDbIsOpen()];
                    case 1:
                        _a.sent();
                        return [2 /*return*/, new Promise(function (resolve, reject) {
                                // TODO: Add timeouts?
                                if (!_this.db) {
                                    return reject(BrowserAuthError.createDatabaseNotOpenError());
                                }
                                var transaction = _this.db.transaction([_this.tableName], "readwrite");
                                var objectStore = transaction.objectStore(_this.tableName);
                                var dbPut = objectStore.put(payload, key);
                                dbPut.addEventListener("success", function () {
                                    _this.closeConnection();
                                    resolve();
                                });
                                dbPut.addEventListener("error", function (e) {
                                    _this.closeConnection();
                                    reject(e);
                                });
                            })];
                }
            });
        });
    };
    /**
     * Removes item from IndexedDB under given key
     * @param key
     */
    DatabaseStorage.prototype.removeItem = function (key) {
        return __awaiter$1(this, void 0, void 0, function () {
            var _this = this;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.validateDbIsOpen()];
                    case 1:
                        _a.sent();
                        return [2 /*return*/, new Promise(function (resolve, reject) {
                                if (!_this.db) {
                                    return reject(BrowserAuthError.createDatabaseNotOpenError());
                                }
                                var transaction = _this.db.transaction([_this.tableName], "readwrite");
                                var objectStore = transaction.objectStore(_this.tableName);
                                var dbDelete = objectStore.delete(key);
                                dbDelete.addEventListener("success", function () {
                                    _this.closeConnection();
                                    resolve();
                                });
                                dbDelete.addEventListener("error", function (e) {
                                    _this.closeConnection();
                                    reject(e);
                                });
                            })];
                }
            });
        });
    };
    /**
     * Get all the keys from the storage object as an iterable array of strings.
     */
    DatabaseStorage.prototype.getKeys = function () {
        return __awaiter$1(this, void 0, void 0, function () {
            var _this = this;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.validateDbIsOpen()];
                    case 1:
                        _a.sent();
                        return [2 /*return*/, new Promise(function (resolve, reject) {
                                if (!_this.db) {
                                    return reject(BrowserAuthError.createDatabaseNotOpenError());
                                }
                                var transaction = _this.db.transaction([_this.tableName], "readonly");
                                var objectStore = transaction.objectStore(_this.tableName);
                                var dbGetKeys = objectStore.getAllKeys();
                                dbGetKeys.addEventListener("success", function (e) {
                                    var event = e;
                                    _this.closeConnection();
                                    resolve(event.target.result);
                                });
                                dbGetKeys.addEventListener("error", function (e) {
                                    _this.closeConnection();
                                    reject(e);
                                });
                            })];
                }
            });
        });
    };
    /**
     *
     * Checks whether there is an object under the search key in the object store
     */
    DatabaseStorage.prototype.containsKey = function (key) {
        return __awaiter$1(this, void 0, void 0, function () {
            var _this = this;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.validateDbIsOpen()];
                    case 1:
                        _a.sent();
                        return [2 /*return*/, new Promise(function (resolve, reject) {
                                if (!_this.db) {
                                    return reject(BrowserAuthError.createDatabaseNotOpenError());
                                }
                                var transaction = _this.db.transaction([_this.tableName], "readonly");
                                var objectStore = transaction.objectStore(_this.tableName);
                                var dbContainsKey = objectStore.count(key);
                                dbContainsKey.addEventListener("success", function (e) {
                                    var event = e;
                                    _this.closeConnection();
                                    resolve(event.target.result === 1);
                                });
                                dbContainsKey.addEventListener("error", function (e) {
                                    _this.closeConnection();
                                    reject(e);
                                });
                            })];
                }
            });
        });
    };
    /**
     * Deletes the MSAL database. The database is deleted rather than cleared to make it possible
     * for client applications to downgrade to a previous MSAL version without worrying about forward compatibility issues
     * with IndexedDB database versions.
     */
    DatabaseStorage.prototype.deleteDatabase = function () {
        return __awaiter$1(this, void 0, void 0, function () {
            var existingDatabases, database;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        // Check if database being deleted exists
                        if (this.db && this.dbOpen) {
                            this.closeConnection();
                        }
                        return [4 /*yield*/, window.indexedDB.databases()];
                    case 1:
                        existingDatabases = _a.sent();
                        database = existingDatabases.find(function (database) { return database.name === DB_NAME; });
                        // If database exists, delete it
                        if (database) {
                            return [2 /*return*/, new Promise(function (resolve, reject) {
                                    var deleteDbRequest = window.indexedDB.deleteDatabase(DB_NAME);
                                    deleteDbRequest.addEventListener("success", function () { return resolve(true); });
                                    deleteDbRequest.addEventListener("error", function () { return reject(false); });
                                })];
                        }
                        // Database doesn't exist, return true
                        return [2 /*return*/, true];
                }
            });
        });
    };
    return DatabaseStorage;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * This class allows MSAL to store artifacts asynchronously using the DatabaseStorage IndexedDB wrapper,
 * backed up with the more volatile MemoryStorage object for cases in which IndexedDB may be unavailable.
 */
var AsyncMemoryStorage = /** @class */ (function () {
    function AsyncMemoryStorage(logger, storeName) {
        this.inMemoryCache = new MemoryStorage();
        this.indexedDBCache = new DatabaseStorage();
        this.logger = logger;
        this.storeName = storeName;
    }
    AsyncMemoryStorage.prototype.handleDatabaseAccessError = function (error) {
        if (error instanceof BrowserAuthError && error.errorCode === BrowserAuthErrorMessage.databaseUnavailable.code) {
            this.logger.error("Could not access persistent storage. This may be caused by browser privacy features which block persistent storage in third-party contexts.");
        }
        else {
            throw error;
        }
    };
    /**
     * Get the item matching the given key. Tries in-memory cache first, then in the asynchronous
     * storage object if item isn't found in-memory.
     * @param key
     */
    AsyncMemoryStorage.prototype.getItem = function (key) {
        return __awaiter$1(this, void 0, void 0, function () {
            var item, e_1;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        item = this.inMemoryCache.getItem(key);
                        if (!!item) return [3 /*break*/, 4];
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        this.logger.verbose("Queried item not found in in-memory cache, now querying persistent storage.");
                        return [4 /*yield*/, this.indexedDBCache.getItem(key)];
                    case 2: return [2 /*return*/, _a.sent()];
                    case 3:
                        e_1 = _a.sent();
                        this.handleDatabaseAccessError(e_1);
                        return [3 /*break*/, 4];
                    case 4: return [2 /*return*/, item];
                }
            });
        });
    };
    /**
     * Sets the item in the in-memory cache and then tries to set it in the asynchronous
     * storage object with the given key.
     * @param key
     * @param value
     */
    AsyncMemoryStorage.prototype.setItem = function (key, value) {
        return __awaiter$1(this, void 0, void 0, function () {
            var e_2;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.inMemoryCache.setItem(key, value);
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        return [4 /*yield*/, this.indexedDBCache.setItem(key, value)];
                    case 2:
                        _a.sent();
                        return [3 /*break*/, 4];
                    case 3:
                        e_2 = _a.sent();
                        this.handleDatabaseAccessError(e_2);
                        return [3 /*break*/, 4];
                    case 4: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Removes the item matching the key from the in-memory cache, then tries to remove it from the asynchronous storage object.
     * @param key
     */
    AsyncMemoryStorage.prototype.removeItem = function (key) {
        return __awaiter$1(this, void 0, void 0, function () {
            var e_3;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.inMemoryCache.removeItem(key);
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        return [4 /*yield*/, this.indexedDBCache.removeItem(key)];
                    case 2:
                        _a.sent();
                        return [3 /*break*/, 4];
                    case 3:
                        e_3 = _a.sent();
                        this.handleDatabaseAccessError(e_3);
                        return [3 /*break*/, 4];
                    case 4: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Get all the keys from the in-memory cache as an iterable array of strings. If no keys are found, query the keys in the
     * asynchronous storage object.
     */
    AsyncMemoryStorage.prototype.getKeys = function () {
        return __awaiter$1(this, void 0, void 0, function () {
            var cacheKeys, e_4;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        cacheKeys = this.inMemoryCache.getKeys();
                        if (!(cacheKeys.length === 0)) return [3 /*break*/, 4];
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        this.logger.verbose("In-memory cache is empty, now querying persistent storage.");
                        return [4 /*yield*/, this.indexedDBCache.getKeys()];
                    case 2: return [2 /*return*/, _a.sent()];
                    case 3:
                        e_4 = _a.sent();
                        this.handleDatabaseAccessError(e_4);
                        return [3 /*break*/, 4];
                    case 4: return [2 /*return*/, cacheKeys];
                }
            });
        });
    };
    /**
     * Returns true or false if the given key is present in the cache.
     * @param key
     */
    AsyncMemoryStorage.prototype.containsKey = function (key) {
        return __awaiter$1(this, void 0, void 0, function () {
            var containsKey, e_5;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        containsKey = this.inMemoryCache.containsKey(key);
                        if (!!containsKey) return [3 /*break*/, 4];
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        this.logger.verbose("Key not found in in-memory cache, now querying persistent storage.");
                        return [4 /*yield*/, this.indexedDBCache.containsKey(key)];
                    case 2: return [2 /*return*/, _a.sent()];
                    case 3:
                        e_5 = _a.sent();
                        this.handleDatabaseAccessError(e_5);
                        return [3 /*break*/, 4];
                    case 4: return [2 /*return*/, containsKey];
                }
            });
        });
    };
    /**
     * Clears in-memory Map and tries to delete the IndexedDB database.
     */
    AsyncMemoryStorage.prototype.clear = function () {
        return __awaiter$1(this, void 0, void 0, function () {
            var dbDeleted, e_6;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        // InMemory cache is a Map instance, clear is straightforward
                        this.logger.verbose("Deleting in-memory keystore " + this.storeName);
                        this.inMemoryCache.clear();
                        this.logger.verbose("In-memory keystore " + this.storeName + " deleted");
                        this.logger.verbose("Deleting persistent keystore " + this.storeName);
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        return [4 /*yield*/, this.indexedDBCache.deleteDatabase()];
                    case 2:
                        dbDeleted = _a.sent();
                        if (dbDeleted) {
                            this.logger.verbose("Persistent keystore " + this.storeName + " deleted");
                        }
                        return [2 /*return*/, dbDeleted];
                    case 3:
                        e_6 = _a.sent();
                        this.handleDatabaseAccessError(e_6);
                        return [2 /*return*/, false];
                    case 4: return [2 /*return*/];
                }
            });
        });
    };
    return AsyncMemoryStorage;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var CryptoKeyStoreNames;
(function (CryptoKeyStoreNames) {
    CryptoKeyStoreNames["asymmetricKeys"] = "asymmetricKeys";
    CryptoKeyStoreNames["symmetricKeys"] = "symmetricKeys";
})(CryptoKeyStoreNames || (CryptoKeyStoreNames = {}));
/**
 * This class implements MSAL's crypto interface, which allows it to perform base64 encoding and decoding, generating cryptographically random GUIDs and
 * implementing Proof Key for Code Exchange specs for the OAuth Authorization Code Flow using PKCE (rfc here: https://tools.ietf.org/html/rfc7636).
 */
var CryptoOps = /** @class */ (function () {
    function CryptoOps(logger, performanceClient) {
        this.logger = logger;
        // Browser crypto needs to be validated first before any other classes can be set.
        this.browserCrypto = new BrowserCrypto(this.logger);
        this.b64Encode = new Base64Encode();
        this.b64Decode = new Base64Decode();
        this.guidGenerator = new GuidGenerator(this.browserCrypto);
        this.pkceGenerator = new PkceGenerator(this.browserCrypto);
        this.cache = {
            asymmetricKeys: new AsyncMemoryStorage(this.logger, CryptoKeyStoreNames.asymmetricKeys),
            symmetricKeys: new AsyncMemoryStorage(this.logger, CryptoKeyStoreNames.symmetricKeys)
        };
        this.performanceClient = performanceClient;
    }
    /**
     * Creates a new random GUID - used to populate state and nonce.
     * @returns string (GUID)
     */
    CryptoOps.prototype.createNewGuid = function () {
        return this.guidGenerator.generateGuid();
    };
    /**
     * Encodes input string to base64.
     * @param input
     */
    CryptoOps.prototype.base64Encode = function (input) {
        return this.b64Encode.encode(input);
    };
    /**
     * Decodes input string from base64.
     * @param input
     */
    CryptoOps.prototype.base64Decode = function (input) {
        return this.b64Decode.decode(input);
    };
    /**
     * Generates PKCE codes used in Authorization Code Flow.
     */
    CryptoOps.prototype.generatePkceCodes = function () {
        return __awaiter$1(this, void 0, void 0, function () {
            return __generator$1(this, function (_a) {
                return [2 /*return*/, this.pkceGenerator.generateCodes()];
            });
        });
    };
    /**
     * Generates a keypair, stores it and returns a thumbprint
     * @param request
     */
    CryptoOps.prototype.getPublicKeyThumbprint = function (request) {
        var _a;
        return __awaiter$1(this, void 0, void 0, function () {
            var publicKeyThumbMeasurement, keyPair, publicKeyJwk, pubKeyThumprintObj, publicJwkString, publicJwkHash, privateKeyJwk, unextractablePrivateKey;
            return __generator$1(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        publicKeyThumbMeasurement = (_a = this.performanceClient) === null || _a === void 0 ? void 0 : _a.startMeasurement(exports.PerformanceEvents.CryptoOptsGetPublicKeyThumbprint, request.correlationId);
                        return [4 /*yield*/, this.browserCrypto.generateKeyPair(CryptoOps.EXTRACTABLE, CryptoOps.POP_KEY_USAGES)];
                    case 1:
                        keyPair = _b.sent();
                        return [4 /*yield*/, this.browserCrypto.exportJwk(keyPair.publicKey)];
                    case 2:
                        publicKeyJwk = _b.sent();
                        pubKeyThumprintObj = {
                            e: publicKeyJwk.e,
                            kty: publicKeyJwk.kty,
                            n: publicKeyJwk.n
                        };
                        publicJwkString = BrowserCrypto.getJwkString(pubKeyThumprintObj);
                        return [4 /*yield*/, this.hashString(publicJwkString)];
                    case 3:
                        publicJwkHash = _b.sent();
                        return [4 /*yield*/, this.browserCrypto.exportJwk(keyPair.privateKey)];
                    case 4:
                        privateKeyJwk = _b.sent();
                        return [4 /*yield*/, this.browserCrypto.importJwk(privateKeyJwk, false, ["sign"])];
                    case 5:
                        unextractablePrivateKey = _b.sent();
                        // Store Keypair data in keystore
                        return [4 /*yield*/, this.cache.asymmetricKeys.setItem(publicJwkHash, {
                                privateKey: unextractablePrivateKey,
                                publicKey: keyPair.publicKey,
                                requestMethod: request.resourceRequestMethod,
                                requestUri: request.resourceRequestUri
                            })];
                    case 6:
                        // Store Keypair data in keystore
                        _b.sent();
                        if (publicKeyThumbMeasurement) {
                            publicKeyThumbMeasurement.endMeasurement({
                                success: true
                            });
                        }
                        return [2 /*return*/, publicJwkHash];
                }
            });
        });
    };
    /**
     * Removes cryptographic keypair from key store matching the keyId passed in
     * @param kid
     */
    CryptoOps.prototype.removeTokenBindingKey = function (kid) {
        return __awaiter$1(this, void 0, void 0, function () {
            var keyFound;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.cache.asymmetricKeys.removeItem(kid)];
                    case 1:
                        _a.sent();
                        return [4 /*yield*/, this.cache.asymmetricKeys.containsKey(kid)];
                    case 2:
                        keyFound = _a.sent();
                        return [2 /*return*/, !keyFound];
                }
            });
        });
    };
    /**
     * Removes all cryptographic keys from IndexedDB storage
     */
    CryptoOps.prototype.clearKeystore = function () {
        return __awaiter$1(this, void 0, void 0, function () {
            var e_1;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        _a.trys.push([0, 3, , 4]);
                        this.logger.verbose("Deleting in-memory and persistent asymmetric key stores");
                        return [4 /*yield*/, this.cache.asymmetricKeys.clear()];
                    case 1:
                        _a.sent();
                        this.logger.verbose("Successfully deleted asymmetric key stores");
                        this.logger.verbose("Deleting in-memory and persistent symmetric key stores");
                        return [4 /*yield*/, this.cache.symmetricKeys.clear()];
                    case 2:
                        _a.sent();
                        this.logger.verbose("Successfully deleted symmetric key stores");
                        return [2 /*return*/, true];
                    case 3:
                        e_1 = _a.sent();
                        if (e_1 instanceof Error) {
                            this.logger.error("Clearing keystore failed with error: " + e_1.message);
                        }
                        else {
                            this.logger.error("Clearing keystore failed with unknown error");
                        }
                        return [2 /*return*/, false];
                    case 4: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Signs the given object as a jwt payload with private key retrieved by given kid.
     * @param payload
     * @param kid
     */
    CryptoOps.prototype.signJwt = function (payload, kid, correlationId) {
        var _a;
        return __awaiter$1(this, void 0, void 0, function () {
            var signJwtMeasurement, cachedKeyPair, publicKeyJwk, publicKeyJwkString, encodedKeyIdThumbprint, shrHeader, encodedShrHeader, encodedPayload, tokenString, tokenBuffer, signatureBuffer, encodedSignature, signedJwt;
            return __generator$1(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        signJwtMeasurement = (_a = this.performanceClient) === null || _a === void 0 ? void 0 : _a.startMeasurement(exports.PerformanceEvents.CryptoOptsSignJwt, correlationId);
                        return [4 /*yield*/, this.cache.asymmetricKeys.getItem(kid)];
                    case 1:
                        cachedKeyPair = _b.sent();
                        if (!cachedKeyPair) {
                            throw BrowserAuthError.createSigningKeyNotFoundInStorageError(kid);
                        }
                        return [4 /*yield*/, this.browserCrypto.exportJwk(cachedKeyPair.publicKey)];
                    case 2:
                        publicKeyJwk = _b.sent();
                        publicKeyJwkString = BrowserCrypto.getJwkString(publicKeyJwk);
                        encodedKeyIdThumbprint = this.b64Encode.urlEncode(JSON.stringify({ kid: kid }));
                        shrHeader = JoseHeader.getShrHeaderString({ kid: encodedKeyIdThumbprint, alg: publicKeyJwk.alg });
                        encodedShrHeader = this.b64Encode.urlEncode(shrHeader);
                        // Generate payload
                        payload.cnf = {
                            jwk: JSON.parse(publicKeyJwkString)
                        };
                        encodedPayload = this.b64Encode.urlEncode(JSON.stringify(payload));
                        tokenString = encodedShrHeader + "." + encodedPayload;
                        tokenBuffer = BrowserStringUtils.stringToArrayBuffer(tokenString);
                        return [4 /*yield*/, this.browserCrypto.sign(cachedKeyPair.privateKey, tokenBuffer)];
                    case 3:
                        signatureBuffer = _b.sent();
                        encodedSignature = this.b64Encode.urlEncodeArr(new Uint8Array(signatureBuffer));
                        signedJwt = tokenString + "." + encodedSignature;
                        if (signJwtMeasurement) {
                            signJwtMeasurement.endMeasurement({
                                success: true
                            });
                        }
                        return [2 /*return*/, signedJwt];
                }
            });
        });
    };
    /**
     * Returns the SHA-256 hash of an input string
     * @param plainText
     */
    CryptoOps.prototype.hashString = function (plainText) {
        return __awaiter$1(this, void 0, void 0, function () {
            var hashBuffer, hashBytes;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.browserCrypto.sha256Digest(plainText)];
                    case 1:
                        hashBuffer = _a.sent();
                        hashBytes = new Uint8Array(hashBuffer);
                        return [2 /*return*/, this.b64Encode.urlEncodeArr(hashBytes)];
                }
            });
        });
    };
    CryptoOps.POP_KEY_USAGES = ["sign", "verify"];
    CryptoOps.EXTRACTABLE = true;
    return CryptoOps;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Token cache manager
 */
var TokenCache = /** @class */ (function () {
    function TokenCache(configuration, storage, logger, cryptoObj) {
        this.isBrowserEnvironment = typeof window !== "undefined";
        this.config = configuration;
        this.storage = storage;
        this.logger = logger;
        this.cryptoObj = cryptoObj;
    }
    // Move getAllAccounts here and cache utility APIs
    /**
     * API to load tokens to msal-browser cache.
     * @param request
     * @param response
     * @param options
     */
    TokenCache.prototype.loadExternalTokens = function (request, response, options) {
        this.logger.info("TokenCache - loadExternalTokens called");
        if (!response.id_token) {
            throw BrowserAuthError.createUnableToLoadTokenError("Please ensure server response includes id token.");
        }
        if (request.account) {
            this.loadIdToken(response.id_token, request.account.homeAccountId, request.account.environment, request.account.tenantId, options);
            this.loadAccessToken(request, response, request.account.homeAccountId, request.account.environment, request.account.tenantId, options);
        }
        else if (request.authority) {
            var authorityUrl = Authority.generateAuthority(request.authority, request.azureCloudOptions);
            var authorityOptions = {
                protocolMode: this.config.auth.protocolMode,
                knownAuthorities: this.config.auth.knownAuthorities,
                cloudDiscoveryMetadata: this.config.auth.cloudDiscoveryMetadata,
                authorityMetadata: this.config.auth.authorityMetadata,
                skipAuthorityMetadataCache: this.config.auth.skipAuthorityMetadataCache,
            };
            var authority = new Authority(authorityUrl, this.config.system.networkClient, this.storage, authorityOptions);
            // "clientInfo" from options takes precedence over "clientInfo" in response
            if (options.clientInfo) {
                this.logger.trace("TokenCache - homeAccountId from options");
                this.loadIdToken(response.id_token, options.clientInfo, authority.hostnameAndPort, authority.tenant, options);
                this.loadAccessToken(request, response, options.clientInfo, authority.hostnameAndPort, authority.tenant, options);
            }
            else if (response.client_info) {
                this.logger.trace("TokenCache - homeAccountId from response");
                this.loadIdToken(response.id_token, response.client_info, authority.hostnameAndPort, authority.tenant, options);
                this.loadAccessToken(request, response, response.client_info, authority.hostnameAndPort, authority.tenant, options);
            }
            else {
                throw BrowserAuthError.createUnableToLoadTokenError("Please provide clientInfo in the response or options.");
            }
        }
        else {
            throw BrowserAuthError.createUnableToLoadTokenError("Please provide a request with an account or a request with authority.");
        }
    };
    /**
     * Helper function to load id tokens to msal-browser cache
     * @param idToken
     * @param homeAccountId
     * @param environment
     * @param tenantId
     * @param options
     */
    TokenCache.prototype.loadIdToken = function (idToken, homeAccountId, environment, tenantId, options) {
        var idTokenEntity = IdTokenEntity.createIdTokenEntity(homeAccountId, environment, idToken, this.config.auth.clientId, tenantId);
        var idAuthToken = new AuthToken(idToken, this.cryptoObj);
        var accountEntity = options.clientInfo ?
            AccountEntity.createAccount(options.clientInfo, homeAccountId, idAuthToken, undefined, undefined, undefined, environment) :
            AccountEntity.createGenericAccount(homeAccountId, idAuthToken, undefined, undefined, undefined, environment);
        if (this.isBrowserEnvironment) {
            this.logger.verbose("TokenCache - loading id token");
            this.storage.setAccount(accountEntity);
            this.storage.setIdTokenCredential(idTokenEntity);
        }
        else {
            throw BrowserAuthError.createUnableToLoadTokenError("loadExternalTokens is designed to work in browser environments only.");
        }
    };
    /**
     * Helper function to load access tokens to msal-browser cache
     * @param request
     * @param response
     * @param options
     * @param homeAccountId
     * @param environment
     * @param tenantId
     * @returns
     */
    TokenCache.prototype.loadAccessToken = function (request, response, homeAccountId, environment, tenantId, options) {
        if (!response.access_token) {
            this.logger.verbose("TokenCache - No access token provided for caching");
            return;
        }
        if (!response.expires_in) {
            throw BrowserAuthError.createUnableToLoadTokenError("Please ensure server response includes expires_in value.");
        }
        if (!options.extendedExpiresOn) {
            throw BrowserAuthError.createUnableToLoadTokenError("Please provide an extendedExpiresOn value in the options.");
        }
        var scopes = new ScopeSet(request.scopes).printScopes();
        var expiresOn = options.expiresOn || (response.expires_in + new Date().getTime() / 1000);
        var extendedExpiresOn = options.extendedExpiresOn;
        var accessTokenEntity = AccessTokenEntity.createAccessTokenEntity(homeAccountId, environment, response.access_token, this.config.auth.clientId, tenantId, scopes, expiresOn, extendedExpiresOn, this.cryptoObj);
        if (this.isBrowserEnvironment) {
            this.logger.verbose("TokenCache - loading access token");
            this.storage.setAccessTokenCredential(accessTokenEntity);
        }
        else {
            throw BrowserAuthError.createUnableToLoadTokenError("loadExternalTokens is designed to work in browser environments only.");
        }
    };
    return TokenCache;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var HybridSpaAuthorizationCodeClient = /** @class */ (function (_super) {
    __extends$1(HybridSpaAuthorizationCodeClient, _super);
    function HybridSpaAuthorizationCodeClient(config) {
        var _this = _super.call(this, config) || this;
        _this.includeRedirectUri = false;
        return _this;
    }
    return HybridSpaAuthorizationCodeClient;
}(AuthorizationCodeClient));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var SilentAuthCodeClient = /** @class */ (function (_super) {
    __extends$1(SilentAuthCodeClient, _super);
    function SilentAuthCodeClient(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, apiId, performanceClient, nativeMessageHandler, correlationId) {
        var _this = _super.call(this, config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeMessageHandler, correlationId) || this;
        _this.apiId = apiId;
        return _this;
    }
    /**
     * Acquires a token silently by redeeming an authorization code against the /token endpoint
     * @param request
     */
    SilentAuthCodeClient.prototype.acquireToken = function (request) {
        return __awaiter$1(this, void 0, void 0, function () {
            var silentRequest, serverTelemetryManager, authCodeRequest, clientConfig, authClient, silentHandler, e_1;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.trace("SilentAuthCodeClient.acquireToken called");
                        // Auth code payload is required
                        if (!request.code) {
                            throw BrowserAuthError.createAuthCodeRequiredError();
                        }
                        return [4 /*yield*/, this.initializeAuthorizationRequest(request, exports.InteractionType.Silent)];
                    case 1:
                        silentRequest = _a.sent();
                        this.browserStorage.updateCacheEntries(silentRequest.state, silentRequest.nonce, silentRequest.authority, silentRequest.loginHint || Constants.EMPTY_STRING, silentRequest.account || null);
                        serverTelemetryManager = this.initializeServerTelemetryManager(this.apiId);
                        _a.label = 2;
                    case 2:
                        _a.trys.push([2, 4, , 5]);
                        authCodeRequest = __assign$1(__assign$1({}, silentRequest), { code: request.code });
                        return [4 /*yield*/, this.getClientConfiguration(serverTelemetryManager, silentRequest.authority)];
                    case 3:
                        clientConfig = _a.sent();
                        authClient = new HybridSpaAuthorizationCodeClient(clientConfig);
                        this.logger.verbose("Auth code client created");
                        silentHandler = new SilentHandler(authClient, this.browserStorage, authCodeRequest, this.logger, this.config.system.navigateFrameWait);
                        // Handle auth code parameters from request
                        return [2 /*return*/, silentHandler.handleCodeResponseFromServer({
                                code: request.code,
                                msgraph_host: request.msGraphHost,
                                cloud_graph_host_name: request.cloudGraphHostName,
                                cloud_instance_host_name: request.cloudInstanceHostName
                            }, silentRequest.state, authClient.authority, this.networkClient, false)];
                    case 4:
                        e_1 = _a.sent();
                        if (e_1 instanceof AuthError) {
                            e_1.setCorrelationId(this.correlationId);
                        }
                        serverTelemetryManager.cacheFailedRequest(e_1);
                        this.browserStorage.cleanRequestByState(silentRequest.state);
                        throw e_1;
                    case 5: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Currently Unsupported
     */
    SilentAuthCodeClient.prototype.logout = function () {
        // Synchronous so we must reject
        return Promise.reject(BrowserAuthError.createSilentLogoutUnsupportedError());
    };
    return SilentAuthCodeClient;
}(StandardInteractionClient));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var BrowserPerformanceMeasurement = /** @class */ (function () {
    function BrowserPerformanceMeasurement(name, correlationId) {
        this.correlationId = correlationId;
        this.measureName = "msal.measure." + name + "." + this.correlationId;
        this.startMark = "msal.start." + name + "." + this.correlationId;
        this.endMark = "msal.end." + name + "." + this.correlationId;
    }
    BrowserPerformanceMeasurement.supportsBrowserPerformance = function () {
        return typeof window !== "undefined" &&
            typeof window.performance !== "undefined" &&
            typeof window.performance.mark === "function" &&
            typeof window.performance.measure === "function" &&
            typeof window.performance.clearMarks === "function" &&
            typeof window.performance.clearMeasures === "function" &&
            typeof window.performance.getEntriesByName === "function";
    };
    BrowserPerformanceMeasurement.prototype.startMeasurement = function () {
        if (BrowserPerformanceMeasurement.supportsBrowserPerformance()) {
            try {
                window.performance.mark(this.startMark);
            }
            catch (e) {
                // Silently catch
            }
        }
    };
    BrowserPerformanceMeasurement.prototype.endMeasurement = function () {
        if (BrowserPerformanceMeasurement.supportsBrowserPerformance()) {
            try {
                window.performance.mark(this.endMark);
                window.performance.measure(this.measureName, this.startMark, this.endMark);
            }
            catch (e) {
                // Silently catch
            }
        }
    };
    BrowserPerformanceMeasurement.prototype.flushMeasurement = function () {
        if (BrowserPerformanceMeasurement.supportsBrowserPerformance()) {
            try {
                var entriesForMeasurement = window.performance.getEntriesByName(this.measureName, "measure");
                if (entriesForMeasurement.length > 0) {
                    var durationMs = entriesForMeasurement[0].duration;
                    window.performance.clearMeasures(this.measureName);
                    window.performance.clearMarks(this.startMark);
                    window.performance.clearMarks(this.endMark);
                    return durationMs;
                }
            }
            catch (e) {
                // Silently catch and return null
            }
        }
        return null;
    };
    return BrowserPerformanceMeasurement;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var BrowserPerformanceClient = /** @class */ (function (_super) {
    __extends$1(BrowserPerformanceClient, _super);
    function BrowserPerformanceClient(clientId, authority, logger, libraryName, libraryVersion, applicationTelemetry) {
        var _this = _super.call(this, clientId, authority, logger, libraryName, libraryVersion, applicationTelemetry) || this;
        _this.browserCrypto = new BrowserCrypto(_this.logger);
        _this.guidGenerator = new GuidGenerator(_this.browserCrypto);
        return _this;
    }
    BrowserPerformanceClient.prototype.startPerformanceMeasuremeant = function (measureName, correlationId) {
        return new BrowserPerformanceMeasurement(measureName, correlationId);
    };
    BrowserPerformanceClient.prototype.generateId = function () {
        return this.guidGenerator.generateGuid();
    };
    BrowserPerformanceClient.prototype.getPageVisibility = function () {
        var _a;
        return ((_a = document.visibilityState) === null || _a === void 0 ? void 0 : _a.toString()) || null;
    };
    /**
     * Starts measuring performance for a given operation. Returns a function that should be used to end the measurement.
     * Also captures browser page visibilityState.
     *
     * @param {PerformanceEvents} measureName
     * @param {?string} [correlationId]
     * @returns {((event?: Partial<PerformanceEvent>) => PerformanceEvent| null)}
     */
    BrowserPerformanceClient.prototype.startMeasurement = function (measureName, correlationId) {
        var _this = this;
        // Capture page visibilityState and then invoke start/end measurement
        var startPageVisibility = this.getPageVisibility();
        var inProgressEvent = _super.prototype.startMeasurement.call(this, measureName, correlationId);
        return __assign$1(__assign$1({}, inProgressEvent), { endMeasurement: function (event) {
                return inProgressEvent.endMeasurement(__assign$1({ startPageVisibility: startPageVisibility, endPageVisibility: _this.getPageVisibility() }, event));
            } });
    };
    return BrowserPerformanceClient;
}(PerformanceClient));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var ClientApplication = /** @class */ (function () {
    /**
     * @constructor
     * Constructor for the PublicClientApplication used to instantiate the PublicClientApplication object
     *
     * Important attributes in the Configuration object for auth are:
     * - clientID: the application ID of your application. You can obtain one by registering your application with our Application registration portal : https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredAppsPreview
     * - authority: the authority URL for your application.
     * - redirect_uri: the uri of your application registered in the portal.
     *
     * In Azure AD, authority is a URL indicating the Azure active directory that MSAL uses to obtain tokens.
     * It is of the form https://login.microsoftonline.com/{Enter_the_Tenant_Info_Here}
     * If your application supports Accounts in one organizational directory, replace "Enter_the_Tenant_Info_Here" value with the Tenant Id or Tenant name (for example, contoso.microsoft.com).
     * If your application supports Accounts in any organizational directory, replace "Enter_the_Tenant_Info_Here" value with organizations.
     * If your application supports Accounts in any organizational directory and personal Microsoft accounts, replace "Enter_the_Tenant_Info_Here" value with common.
     * To restrict support to Personal Microsoft accounts only, replace "Enter_the_Tenant_Info_Here" value with consumers.
     *
     * In Azure B2C, authority is of the form https://{instance}/tfp/{tenant}/{policyName}/
     * Full B2C functionality will be available in this library in future versions.
     *
     * @param configuration Object for the MSAL PublicClientApplication instance
     */
    function ClientApplication(configuration) {
        /*
         * If loaded in an environment where window is not available,
         * set internal flag to false so that further requests fail.
         * This is to support server-side rendering environments.
         */
        this.isBrowserEnvironment = typeof window !== "undefined";
        // Set the configuration.
        this.config = buildConfiguration(configuration, this.isBrowserEnvironment);
        this.initialized = false;
        // Initialize logger
        this.logger = new Logger(this.config.system.loggerOptions, name, version);
        // Initialize the network module class.
        this.networkClient = this.config.system.networkClient;
        // Initialize the navigation client class.
        this.navigationClient = this.config.system.navigationClient;
        // Initialize redirectResponse Map
        this.redirectResponse = new Map();
        // Initial hybrid spa map
        this.hybridAuthCodeResponses = new Map();
        // Initialize performance client
        this.performanceClient = this.isBrowserEnvironment ?
            new BrowserPerformanceClient(this.config.auth.clientId, this.config.auth.authority, this.logger, name, version, this.config.telemetry.application) :
            new StubPerformanceClient(this.config.auth.clientId, this.config.auth.authority, this.logger, name, version, this.config.telemetry.application);
        // Initialize the crypto class.
        this.browserCrypto = this.isBrowserEnvironment ? new CryptoOps(this.logger, this.performanceClient) : DEFAULT_CRYPTO_IMPLEMENTATION;
        this.eventHandler = new EventHandler(this.logger, this.browserCrypto);
        // Initialize the browser storage class.
        this.browserStorage = this.isBrowserEnvironment ?
            new BrowserCacheManager(this.config.auth.clientId, this.config.cache, this.browserCrypto, this.logger) :
            DEFAULT_BROWSER_CACHE_MANAGER(this.config.auth.clientId, this.logger);
        // initialize in memory storage for native flows
        var nativeCacheOptions = {
            cacheLocation: exports.BrowserCacheLocation.MemoryStorage,
            storeAuthStateInCookie: false,
            secureCookies: false
        };
        this.nativeInternalStorage = new BrowserCacheManager(this.config.auth.clientId, nativeCacheOptions, this.browserCrypto, this.logger);
        // Initialize the token cache
        this.tokenCache = new TokenCache(this.config, this.browserStorage, this.logger, this.browserCrypto);
    }
    /**
     * Initializer function to perform async startup tasks such as connecting to WAM extension
     */
    ClientApplication.prototype.initialize = function () {
        return __awaiter$1(this, void 0, void 0, function () {
            var _a, e_1;
            return __generator$1(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        this.logger.trace("initialize called");
                        if (this.initialized) {
                            this.logger.info("initialize has already been called, exiting early.");
                            return [2 /*return*/];
                        }
                        this.eventHandler.emitEvent(exports.EventType.INITIALIZE_START);
                        if (!this.config.system.allowNativeBroker) return [3 /*break*/, 4];
                        _b.label = 1;
                    case 1:
                        _b.trys.push([1, 3, , 4]);
                        _a = this;
                        return [4 /*yield*/, NativeMessageHandler.createProvider(this.logger, this.config.system.nativeBrokerHandshakeTimeout)];
                    case 2:
                        _a.nativeExtensionProvider = _b.sent();
                        return [3 /*break*/, 4];
                    case 3:
                        e_1 = _b.sent();
                        this.logger.verbose(e_1);
                        return [3 /*break*/, 4];
                    case 4:
                        this.initialized = true;
                        this.eventHandler.emitEvent(exports.EventType.INITIALIZE_END);
                        return [2 /*return*/];
                }
            });
        });
    };
    // #region Redirect Flow
    /**
     * Event handler function which allows users to fire events after the PublicClientApplication object
     * has loaded during redirect flows. This should be invoked on all page loads involved in redirect
     * auth flows.
     * @param hash Hash to process. Defaults to the current value of window.location.hash. Only needs to be provided explicitly if the response to be handled is not contained in the current value.
     * @returns Token response or null. If the return value is null, then no auth redirect was detected.
     */
    ClientApplication.prototype.handleRedirectPromise = function (hash) {
        return __awaiter$1(this, void 0, void 0, function () {
            var loggedInAccounts, redirectResponseKey, response, request, redirectResponse, nativeClient, correlationId, redirectClient;
            var _this = this;
            return __generator$1(this, function (_a) {
                this.logger.verbose("handleRedirectPromise called");
                // Block token acquisition before initialize has been called if native brokering is enabled
                BrowserUtils.blockNativeBrokerCalledBeforeInitialized(this.config.system.allowNativeBroker, this.initialized);
                loggedInAccounts = this.getAllAccounts();
                if (this.isBrowserEnvironment) {
                    redirectResponseKey = hash || Constants.EMPTY_STRING;
                    response = this.redirectResponse.get(redirectResponseKey);
                    if (typeof response === "undefined") {
                        this.eventHandler.emitEvent(exports.EventType.HANDLE_REDIRECT_START, exports.InteractionType.Redirect);
                        this.logger.verbose("handleRedirectPromise has been called for the first time, storing the promise");
                        request = this.browserStorage.getCachedNativeRequest();
                        redirectResponse = void 0;
                        if (request && NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeExtensionProvider) && this.nativeExtensionProvider && !hash) {
                            this.logger.trace("handleRedirectPromise - acquiring token from native platform");
                            nativeClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, exports.ApiId.handleRedirectPromise, this.performanceClient, this.nativeExtensionProvider, request.accountId, this.nativeInternalStorage, request.correlationId);
                            redirectResponse = nativeClient.handleRedirectPromise();
                        }
                        else {
                            this.logger.trace("handleRedirectPromise - acquiring token from web flow");
                            correlationId = this.browserStorage.getTemporaryCache(TemporaryCacheKeys.CORRELATION_ID, true) || Constants.EMPTY_STRING;
                            redirectClient = this.createRedirectClient(correlationId);
                            redirectResponse = redirectClient.handleRedirectPromise(hash);
                        }
                        response = redirectResponse.then(function (result) {
                            if (result) {
                                // Emit login event if number of accounts change
                                var isLoggingIn = loggedInAccounts.length < _this.getAllAccounts().length;
                                if (isLoggingIn) {
                                    _this.eventHandler.emitEvent(exports.EventType.LOGIN_SUCCESS, exports.InteractionType.Redirect, result);
                                    _this.logger.verbose("handleRedirectResponse returned result, login success");
                                }
                                else {
                                    _this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_SUCCESS, exports.InteractionType.Redirect, result);
                                    _this.logger.verbose("handleRedirectResponse returned result, acquire token success");
                                }
                            }
                            _this.eventHandler.emitEvent(exports.EventType.HANDLE_REDIRECT_END, exports.InteractionType.Redirect);
                            return result;
                        }).catch(function (e) {
                            // Emit login event if there is an account
                            if (loggedInAccounts.length > 0) {
                                _this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_FAILURE, exports.InteractionType.Redirect, null, e);
                            }
                            else {
                                _this.eventHandler.emitEvent(exports.EventType.LOGIN_FAILURE, exports.InteractionType.Redirect, null, e);
                            }
                            _this.eventHandler.emitEvent(exports.EventType.HANDLE_REDIRECT_END, exports.InteractionType.Redirect);
                            throw e;
                        });
                        this.redirectResponse.set(redirectResponseKey, response);
                    }
                    else {
                        this.logger.verbose("handleRedirectPromise has been called previously, returning the result from the first call");
                    }
                    return [2 /*return*/, response];
                }
                this.logger.verbose("handleRedirectPromise returns null, not browser environment");
                return [2 /*return*/, null];
            });
        });
    };
    /**
     * Use when you want to obtain an access_token for your API by redirecting the user's browser window to the authorization endpoint. This function redirects
     * the page, so any code that follows this function will not execute.
     *
     * IMPORTANT: It is NOT recommended to have code that is dependent on the resolution of the Promise. This function will navigate away from the current
     * browser window. It currently returns a Promise in order to reflect the asynchronous nature of the code running in this function.
     *
     * @param request
     */
    ClientApplication.prototype.acquireTokenRedirect = function (request) {
        return __awaiter$1(this, void 0, void 0, function () {
            var correlationId, isLoggedIn, result, nativeClient, redirectClient;
            var _this = this;
            return __generator$1(this, function (_a) {
                correlationId = this.getRequestCorrelationId(request);
                this.logger.verbose("acquireTokenRedirect called", correlationId);
                this.preflightBrowserEnvironmentCheck(exports.InteractionType.Redirect);
                isLoggedIn = this.getAllAccounts().length > 0;
                if (isLoggedIn) {
                    this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_START, exports.InteractionType.Redirect, request);
                }
                else {
                    this.eventHandler.emitEvent(exports.EventType.LOGIN_START, exports.InteractionType.Redirect, request);
                }
                if (this.nativeExtensionProvider && this.canUseNative(request)) {
                    nativeClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, exports.ApiId.acquireTokenRedirect, this.performanceClient, this.nativeExtensionProvider, this.getNativeAccountId(request), this.nativeInternalStorage, request.correlationId);
                    result = nativeClient.acquireTokenRedirect(request).catch(function (e) {
                        if (e instanceof NativeAuthError && e.isFatal()) {
                            _this.nativeExtensionProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt
                            var redirectClient = _this.createRedirectClient(request.correlationId);
                            return redirectClient.acquireToken(request);
                        }
                        else if (e instanceof InteractionRequiredAuthError) {
                            _this.logger.verbose("acquireTokenRedirect - Resolving interaction required error thrown by native broker by falling back to web flow");
                            var redirectClient = _this.createRedirectClient(request.correlationId);
                            return redirectClient.acquireToken(request);
                        }
                        _this.browserStorage.setInteractionInProgress(false);
                        throw e;
                    });
                }
                else {
                    redirectClient = this.createRedirectClient(request.correlationId);
                    result = redirectClient.acquireToken(request);
                }
                return [2 /*return*/, result.catch(function (e) {
                        // If logged in, emit acquire token events
                        if (isLoggedIn) {
                            _this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_FAILURE, exports.InteractionType.Redirect, null, e);
                        }
                        else {
                            _this.eventHandler.emitEvent(exports.EventType.LOGIN_FAILURE, exports.InteractionType.Redirect, null, e);
                        }
                        throw e;
                    })];
            });
        });
    };
    // #endregion
    // #region Popup Flow
    /**
     * Use when you want to obtain an access_token for your API via opening a popup window in the user's browser
     *
     * @param request
     *
     * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.
     */
    ClientApplication.prototype.acquireTokenPopup = function (request) {
        var _this = this;
        var correlationId = this.getRequestCorrelationId(request);
        var atPopupMeasurement = this.performanceClient.startMeasurement(exports.PerformanceEvents.AcquireTokenPopup, correlationId);
        try {
            this.logger.verbose("acquireTokenPopup called", correlationId);
            this.preflightBrowserEnvironmentCheck(exports.InteractionType.Popup);
        }
        catch (e) {
            // Since this function is syncronous we need to reject
            return Promise.reject(e);
        }
        // If logged in, emit acquire token events
        var loggedInAccounts = this.getAllAccounts();
        if (loggedInAccounts.length > 0) {
            this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_START, exports.InteractionType.Popup, request);
        }
        else {
            this.eventHandler.emitEvent(exports.EventType.LOGIN_START, exports.InteractionType.Popup, request);
        }
        var result;
        if (this.canUseNative(request)) {
            result = this.acquireTokenNative(request, exports.ApiId.acquireTokenPopup).then(function (response) {
                _this.browserStorage.setInteractionInProgress(false);
                atPopupMeasurement.endMeasurement({
                    success: true,
                    isNativeBroker: true,
                    accessTokenSize: response.accessToken.length,
                    idTokenSize: response.idToken.length,
                });
                atPopupMeasurement.flushMeasurement();
                return response;
            }).catch(function (e) {
                if (e instanceof NativeAuthError && e.isFatal()) {
                    _this.nativeExtensionProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt
                    var popupClient = _this.createPopupClient(request.correlationId);
                    return popupClient.acquireToken(request);
                }
                else if (e instanceof InteractionRequiredAuthError) {
                    _this.logger.verbose("acquireTokenPopup - Resolving interaction required error thrown by native broker by falling back to web flow");
                    var popupClient = _this.createPopupClient(request.correlationId);
                    return popupClient.acquireToken(request);
                }
                _this.browserStorage.setInteractionInProgress(false);
                throw e;
            });
        }
        else {
            var popupClient = this.createPopupClient(request.correlationId);
            result = popupClient.acquireToken(request);
        }
        return result.then(function (result) {
            /*
             *  If logged in, emit acquire token events
             */
            var isLoggingIn = loggedInAccounts.length < _this.getAllAccounts().length;
            if (isLoggingIn) {
                _this.eventHandler.emitEvent(exports.EventType.LOGIN_SUCCESS, exports.InteractionType.Popup, result);
            }
            else {
                _this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_SUCCESS, exports.InteractionType.Popup, result);
            }
            atPopupMeasurement.endMeasurement({
                success: true,
                accessTokenSize: result.accessToken.length,
                idTokenSize: result.idToken.length,
            });
            atPopupMeasurement.flushMeasurement();
            return result;
        }).catch(function (e) {
            if (loggedInAccounts.length > 0) {
                _this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_FAILURE, exports.InteractionType.Popup, null, e);
            }
            else {
                _this.eventHandler.emitEvent(exports.EventType.LOGIN_FAILURE, exports.InteractionType.Popup, null, e);
            }
            atPopupMeasurement.endMeasurement({
                errorCode: e.errorCode,
                subErrorCode: e.subError,
                success: false
            });
            atPopupMeasurement.flushMeasurement();
            // Since this function is syncronous we need to reject
            return Promise.reject(e);
        });
    };
    // #endregion
    // #region Silent Flow
    /**
     * This function uses a hidden iframe to fetch an authorization code from the eSTS. There are cases where this may not work:
     * - Any browser using a form of Intelligent Tracking Prevention
     * - If there is not an established session with the service
     *
     * In these cases, the request must be done inside a popup or full frame redirect.
     *
     * For the cases where interaction is required, you cannot send a request with prompt=none.
     *
     * If your refresh token has expired, you can use this function to fetch a new set of tokens silently as long as
     * you session on the server still exists.
     * @param request {@link SsoSilentRequest}
     *
     * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.
     */
    ClientApplication.prototype.ssoSilent = function (request) {
        return __awaiter$1(this, void 0, void 0, function () {
            var correlationId, validRequest, ssoSilentMeasurement, result, silentIframeClient;
            var _this = this;
            return __generator$1(this, function (_a) {
                correlationId = this.getRequestCorrelationId(request);
                validRequest = __assign$1(__assign$1({}, request), { prompt: PromptValue.NONE, correlationId: correlationId });
                this.preflightBrowserEnvironmentCheck(exports.InteractionType.Silent);
                ssoSilentMeasurement = this.performanceClient.startMeasurement(exports.PerformanceEvents.SsoSilent, correlationId);
                this.logger.verbose("ssoSilent called", correlationId);
                this.eventHandler.emitEvent(exports.EventType.SSO_SILENT_START, exports.InteractionType.Silent, validRequest);
                if (this.canUseNative(validRequest)) {
                    result = this.acquireTokenNative(validRequest, exports.ApiId.ssoSilent).catch(function (e) {
                        // If native token acquisition fails for availability reasons fallback to standard flow
                        if (e instanceof NativeAuthError && e.isFatal()) {
                            _this.nativeExtensionProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt
                            var silentIframeClient = _this.createSilentIframeClient(validRequest.correlationId);
                            return silentIframeClient.acquireToken(validRequest);
                        }
                        throw e;
                    });
                }
                else {
                    silentIframeClient = this.createSilentIframeClient(validRequest.correlationId);
                    result = silentIframeClient.acquireToken(validRequest);
                }
                return [2 /*return*/, result.then(function (response) {
                        _this.eventHandler.emitEvent(exports.EventType.SSO_SILENT_SUCCESS, exports.InteractionType.Silent, response);
                        ssoSilentMeasurement.endMeasurement({
                            success: true,
                            isNativeBroker: response.fromNativeBroker,
                            accessTokenSize: response.accessToken.length,
                            idTokenSize: response.idToken.length
                        });
                        ssoSilentMeasurement.flushMeasurement();
                        return response;
                    }).catch(function (e) {
                        _this.eventHandler.emitEvent(exports.EventType.SSO_SILENT_FAILURE, exports.InteractionType.Silent, null, e);
                        ssoSilentMeasurement.endMeasurement({
                            errorCode: e.errorCode,
                            subErrorCode: e.subError,
                            success: false
                        });
                        ssoSilentMeasurement.flushMeasurement();
                        throw e;
                    })];
            });
        });
    };
    /**
     * This function redeems an authorization code (passed as code) from the eSTS token endpoint.
     * This authorization code should be acquired server-side using a confidential client to acquire a spa_code.
     * This API is not indended for normal authorization code acquisition and redemption.
     *
     * Redemption of this authorization code will not require PKCE, as it was acquired by a confidential client.
     *
     * @param request {@link AuthorizationCodeRequest}
     * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.
     */
    ClientApplication.prototype.acquireTokenByCode = function (request) {
        return __awaiter$1(this, void 0, void 0, function () {
            var correlationId, atbcMeasurement, hybridAuthCode_1, response;
            var _this = this;
            return __generator$1(this, function (_a) {
                correlationId = this.getRequestCorrelationId(request);
                this.preflightBrowserEnvironmentCheck(exports.InteractionType.Silent);
                this.logger.trace("acquireTokenByCode called", correlationId);
                this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_BY_CODE_START, exports.InteractionType.Silent, request);
                atbcMeasurement = this.performanceClient.startMeasurement(exports.PerformanceEvents.AcquireTokenByCode, request.correlationId);
                try {
                    if (request.code) {
                        hybridAuthCode_1 = request.code;
                        response = this.hybridAuthCodeResponses.get(hybridAuthCode_1);
                        if (!response) {
                            this.logger.verbose("Initiating new acquireTokenByCode request", correlationId);
                            response = this.acquireTokenByCodeAsync(__assign$1(__assign$1({}, request), { correlationId: correlationId }))
                                .then(function (result) {
                                _this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_BY_CODE_SUCCESS, exports.InteractionType.Silent, result);
                                _this.hybridAuthCodeResponses.delete(hybridAuthCode_1);
                                atbcMeasurement.endMeasurement({
                                    success: true,
                                    accessTokenSize: result.accessToken.length,
                                    idTokenSize: result.idToken.length,
                                    isNativeBroker: result.fromNativeBroker
                                });
                                atbcMeasurement.flushMeasurement();
                                return result;
                            })
                                .catch(function (error) {
                                _this.hybridAuthCodeResponses.delete(hybridAuthCode_1);
                                _this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_BY_CODE_FAILURE, exports.InteractionType.Silent, null, error);
                                atbcMeasurement.endMeasurement({
                                    errorCode: error.errorCode,
                                    subErrorCode: error.subError,
                                    success: false
                                });
                                atbcMeasurement.flushMeasurement();
                                throw error;
                            });
                            this.hybridAuthCodeResponses.set(hybridAuthCode_1, response);
                        }
                        else {
                            this.logger.verbose("Existing acquireTokenByCode request found", request.correlationId);
                            atbcMeasurement.endMeasurement({
                                success: true
                            });
                            atbcMeasurement.discardMeasurement();
                        }
                        return [2 /*return*/, response];
                    }
                    else if (request.nativeAccountId) {
                        if (this.canUseNative(request, request.nativeAccountId)) {
                            return [2 /*return*/, this.acquireTokenNative(request, exports.ApiId.acquireTokenByCode, request.nativeAccountId).catch(function (e) {
                                    // If native token acquisition fails for availability reasons fallback to standard flow
                                    if (e instanceof NativeAuthError && e.isFatal()) {
                                        _this.nativeExtensionProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt
                                    }
                                    throw e;
                                })];
                        }
                        else {
                            throw BrowserAuthError.createUnableToAcquireTokenFromNativePlatformError();
                        }
                    }
                    else {
                        throw BrowserAuthError.createAuthCodeOrNativeAccountIdRequiredError();
                    }
                }
                catch (e) {
                    this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_BY_CODE_FAILURE, exports.InteractionType.Silent, null, e);
                    atbcMeasurement.endMeasurement({
                        errorCode: e instanceof AuthError && e.errorCode || undefined,
                        subErrorCode: e instanceof AuthError && e.subError || undefined,
                        success: false
                    });
                    throw e;
                }
                return [2 /*return*/];
            });
        });
    };
    /**
     * Creates a SilentAuthCodeClient to redeem an authorization code.
     * @param request
     * @returns Result of the operation to redeem the authorization code
     */
    ClientApplication.prototype.acquireTokenByCodeAsync = function (request) {
        return __awaiter$1(this, void 0, void 0, function () {
            var silentAuthCodeClient, silentTokenResult;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.trace("acquireTokenByCodeAsync called", request.correlationId);
                        silentAuthCodeClient = this.createSilentAuthCodeClient(request.correlationId);
                        return [4 /*yield*/, silentAuthCodeClient.acquireToken(request)];
                    case 1:
                        silentTokenResult = _a.sent();
                        return [2 /*return*/, silentTokenResult];
                }
            });
        });
    };
    /**
     * Use this function to obtain a token before every call to the API / resource provider
     *
     * MSAL return's a cached token when available
     * Or it send's a request to the STS to obtain a new token using a refresh token.
     *
     * @param {@link SilentRequest}
     *
     * To renew idToken, please pass clientId as the only scope in the Authentication Parameters
     * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.
     */
    ClientApplication.prototype.acquireTokenByRefreshToken = function (request) {
        return __awaiter$1(this, void 0, void 0, function () {
            var atbrtMeasurement, silentRefreshClient;
            var _this = this;
            return __generator$1(this, function (_a) {
                // block the reload if it occurred inside a hidden iframe
                BrowserUtils.blockReloadInHiddenIframes();
                atbrtMeasurement = this.performanceClient.startMeasurement(exports.PerformanceEvents.AcquireTokenByRefreshToken, request.correlationId);
                this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_NETWORK_START, exports.InteractionType.Silent, request);
                silentRefreshClient = this.createSilentRefreshClient(request.correlationId);
                return [2 /*return*/, silentRefreshClient.acquireToken(request)
                        .then(function (result) {
                        atbrtMeasurement.endMeasurement({
                            success: true,
                            fromCache: result.fromCache,
                            accessTokenSize: result.accessToken.length,
                            idTokenSize: result.idToken.length,
                        });
                        return result;
                    })
                        .catch(function (e) {
                        var isServerError = e instanceof ServerError;
                        var isInteractionRequiredError = e instanceof InteractionRequiredAuthError;
                        var isInvalidGrantError = (e.errorCode === BrowserConstants.INVALID_GRANT_ERROR);
                        if (isServerError && isInvalidGrantError && !isInteractionRequiredError) {
                            _this.logger.verbose("Refresh token expired or invalid, attempting acquire token by iframe", request.correlationId);
                            var silentIframeClient = _this.createSilentIframeClient(request.correlationId);
                            return silentIframeClient.acquireToken(request)
                                .then(function (result) {
                                atbrtMeasurement.endMeasurement({
                                    success: true,
                                    fromCache: result.fromCache,
                                    accessTokenSize: result.accessToken.length,
                                    idTokenSize: result.idToken.length,
                                });
                                return result;
                            })
                                .catch(function (error) {
                                atbrtMeasurement.endMeasurement({
                                    errorCode: error.errorCode,
                                    subErrorCode: error.subError,
                                    success: false
                                });
                                throw error;
                            });
                        }
                        atbrtMeasurement.endMeasurement({
                            success: false
                        });
                        throw e;
                    })];
            });
        });
    };
    // #endregion
    // #region Logout
    /**
     * Deprecated logout function. Use logoutRedirect or logoutPopup instead
     * @param logoutRequest
     * @deprecated
     */
    ClientApplication.prototype.logout = function (logoutRequest) {
        return __awaiter$1(this, void 0, void 0, function () {
            var correlationId;
            return __generator$1(this, function (_a) {
                correlationId = this.getRequestCorrelationId(logoutRequest);
                this.logger.warning("logout API is deprecated and will be removed in msal-browser v3.0.0. Use logoutRedirect instead.", correlationId);
                return [2 /*return*/, this.logoutRedirect(__assign$1({ correlationId: correlationId }, logoutRequest))];
            });
        });
    };
    /**
     * Use to log out the current user, and redirect the user to the postLogoutRedirectUri.
     * Default behaviour is to redirect the user to `window.location.href`.
     * @param logoutRequest
     */
    ClientApplication.prototype.logoutRedirect = function (logoutRequest) {
        return __awaiter$1(this, void 0, void 0, function () {
            var correlationId, redirectClient;
            return __generator$1(this, function (_a) {
                correlationId = this.getRequestCorrelationId(logoutRequest);
                this.preflightBrowserEnvironmentCheck(exports.InteractionType.Redirect);
                redirectClient = this.createRedirectClient(correlationId);
                return [2 /*return*/, redirectClient.logout(logoutRequest)];
            });
        });
    };
    /**
     * Clears local cache for the current user then opens a popup window prompting the user to sign-out of the server
     * @param logoutRequest
     */
    ClientApplication.prototype.logoutPopup = function (logoutRequest) {
        try {
            var correlationId = this.getRequestCorrelationId(logoutRequest);
            this.preflightBrowserEnvironmentCheck(exports.InteractionType.Popup);
            var popupClient = this.createPopupClient(correlationId);
            return popupClient.logout(logoutRequest);
        }
        catch (e) {
            // Since this function is syncronous we need to reject
            return Promise.reject(e);
        }
    };
    // #endregion
    // #region Account APIs
    /**
     * Returns all accounts that MSAL currently has data for.
     * (the account object is created at the time of successful login)
     * or empty array when no accounts are found
     * @returns Array of account objects in cache
     */
    ClientApplication.prototype.getAllAccounts = function () {
        this.logger.verbose("getAllAccounts called");
        return this.isBrowserEnvironment ? this.browserStorage.getAllAccounts() : [];
    };
    /**
     * Returns the signed in account matching username.
     * (the account object is created at the time of successful login)
     * or null when no matching account is found.
     * This API is provided for convenience but getAccountById should be used for best reliability
     * @param userName
     * @returns The account object stored in MSAL
     */
    ClientApplication.prototype.getAccountByUsername = function (userName) {
        var allAccounts = this.getAllAccounts();
        if (!StringUtils.isEmpty(userName) && allAccounts && allAccounts.length) {
            this.logger.verbose("Account matching username found, returning");
            this.logger.verbosePii("Returning signed-in accounts matching username: " + userName);
            return allAccounts.filter(function (accountObj) { return accountObj.username.toLowerCase() === userName.toLowerCase(); })[0] || null;
        }
        else {
            this.logger.verbose("getAccountByUsername: No matching account found, returning null");
            return null;
        }
    };
    /**
     * Returns the signed in account matching homeAccountId.
     * (the account object is created at the time of successful login)
     * or null when no matching account is found
     * @param homeAccountId
     * @returns The account object stored in MSAL
     */
    ClientApplication.prototype.getAccountByHomeId = function (homeAccountId) {
        var allAccounts = this.getAllAccounts();
        if (!StringUtils.isEmpty(homeAccountId) && allAccounts && allAccounts.length) {
            this.logger.verbose("Account matching homeAccountId found, returning");
            this.logger.verbosePii("Returning signed-in accounts matching homeAccountId: " + homeAccountId);
            return allAccounts.filter(function (accountObj) { return accountObj.homeAccountId === homeAccountId; })[0] || null;
        }
        else {
            this.logger.verbose("getAccountByHomeId: No matching account found, returning null");
            return null;
        }
    };
    /**
     * Returns the signed in account matching localAccountId.
     * (the account object is created at the time of successful login)
     * or null when no matching account is found
     * @param localAccountId
     * @returns The account object stored in MSAL
     */
    ClientApplication.prototype.getAccountByLocalId = function (localAccountId) {
        var allAccounts = this.getAllAccounts();
        if (!StringUtils.isEmpty(localAccountId) && allAccounts && allAccounts.length) {
            this.logger.verbose("Account matching localAccountId found, returning");
            this.logger.verbosePii("Returning signed-in accounts matching localAccountId: " + localAccountId);
            return allAccounts.filter(function (accountObj) { return accountObj.localAccountId === localAccountId; })[0] || null;
        }
        else {
            this.logger.verbose("getAccountByLocalId: No matching account found, returning null");
            return null;
        }
    };
    /**
     * Sets the account to use as the active account. If no account is passed to the acquireToken APIs, then MSAL will use this active account.
     * @param account
     */
    ClientApplication.prototype.setActiveAccount = function (account) {
        this.browserStorage.setActiveAccount(account);
    };
    /**
     * Gets the currently active account
     */
    ClientApplication.prototype.getActiveAccount = function () {
        return this.browserStorage.getActiveAccount();
    };
    // #endregion
    // #region Helpers
    /**
     * Helper to validate app environment before making an auth request
     *
     * @protected
     * @param {InteractionType} interactionType What kind of interaction is being used
     * @param {boolean} [setInteractionInProgress=true] Whether to set interaction in progress temp cache flag
     */
    ClientApplication.prototype.preflightBrowserEnvironmentCheck = function (interactionType, setInteractionInProgress) {
        if (setInteractionInProgress === void 0) { setInteractionInProgress = true; }
        this.logger.verbose("preflightBrowserEnvironmentCheck started");
        // Block request if not in browser environment
        BrowserUtils.blockNonBrowserEnvironment(this.isBrowserEnvironment);
        // Block redirects if in an iframe
        BrowserUtils.blockRedirectInIframe(interactionType, this.config.system.allowRedirectInIframe);
        // Block auth requests inside a hidden iframe
        BrowserUtils.blockReloadInHiddenIframes();
        // Block redirectUri opened in a popup from calling MSAL APIs
        BrowserUtils.blockAcquireTokenInPopups();
        // Block token acquisition before initialize has been called if native brokering is enabled
        BrowserUtils.blockNativeBrokerCalledBeforeInitialized(this.config.system.allowNativeBroker, this.initialized);
        // Block redirects if memory storage is enabled but storeAuthStateInCookie is not
        if (interactionType === exports.InteractionType.Redirect &&
            this.config.cache.cacheLocation === exports.BrowserCacheLocation.MemoryStorage &&
            !this.config.cache.storeAuthStateInCookie) {
            throw BrowserConfigurationAuthError.createInMemoryRedirectUnavailableError();
        }
        if (interactionType === exports.InteractionType.Redirect || interactionType === exports.InteractionType.Popup) {
            this.preflightInteractiveRequest(setInteractionInProgress);
        }
    };
    /**
     * Preflight check for interactive requests
     *
     * @protected
     * @param {boolean} setInteractionInProgress Whether to set interaction in progress temp cache flag
     */
    ClientApplication.prototype.preflightInteractiveRequest = function (setInteractionInProgress) {
        this.logger.verbose("preflightInteractiveRequest called, validating app environment");
        // block the reload if it occurred inside a hidden iframe
        BrowserUtils.blockReloadInHiddenIframes();
        // Set interaction in progress temporary cache or throw if alread set.
        if (setInteractionInProgress) {
            this.browserStorage.setInteractionInProgress(true);
        }
    };
    /**
     * Acquire a token from native device (e.g. WAM)
     * @param request
     */
    ClientApplication.prototype.acquireTokenNative = function (request, apiId, accountId) {
        return __awaiter$1(this, void 0, void 0, function () {
            var nativeClient;
            return __generator$1(this, function (_a) {
                this.logger.trace("acquireTokenNative called");
                if (!this.nativeExtensionProvider) {
                    throw BrowserAuthError.createNativeConnectionNotEstablishedError();
                }
                nativeClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, apiId, this.performanceClient, this.nativeExtensionProvider, accountId || this.getNativeAccountId(request), this.nativeInternalStorage, request.correlationId);
                return [2 /*return*/, nativeClient.acquireToken(request)];
            });
        });
    };
    /**
     * Returns boolean indicating if this request can use the native broker
     * @param request
     */
    ClientApplication.prototype.canUseNative = function (request, accountId) {
        this.logger.trace("canUseNative called");
        if (!NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeExtensionProvider, request.authenticationScheme)) {
            this.logger.trace("canUseNative: isNativeAvailable returned false, returning false");
            return false;
        }
        if (request.prompt) {
            switch (request.prompt) {
                case PromptValue.NONE:
                case PromptValue.CONSENT:
                case PromptValue.LOGIN:
                    this.logger.trace("canUseNative: prompt is compatible with native flow");
                    break;
                default:
                    this.logger.trace("canUseNative: prompt = " + request.prompt + " is not compatible with native flow, returning false");
                    return false;
            }
        }
        if (!accountId && !this.getNativeAccountId(request)) {
            this.logger.trace("canUseNative: nativeAccountId is not available, returning false");
            return false;
        }
        return true;
    };
    /**
     * Get the native accountId from the account
     * @param request
     * @returns
     */
    ClientApplication.prototype.getNativeAccountId = function (request) {
        var account = request.account || this.browserStorage.getAccountInfoByHints(request.loginHint, request.sid) || this.getActiveAccount();
        return account && account.nativeAccountId || "";
    };
    /**
     * Returns new instance of the Popup Interaction Client
     * @param correlationId
     */
    ClientApplication.prototype.createPopupClient = function (correlationId) {
        return new PopupClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, this.performanceClient, this.nativeInternalStorage, this.nativeExtensionProvider, correlationId);
    };
    /**
     * Returns new instance of the Redirect Interaction Client
     * @param correlationId
     */
    ClientApplication.prototype.createRedirectClient = function (correlationId) {
        return new RedirectClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, this.performanceClient, this.nativeInternalStorage, this.nativeExtensionProvider, correlationId);
    };
    /**
     * Returns new instance of the Silent Iframe Interaction Client
     * @param correlationId
     */
    ClientApplication.prototype.createSilentIframeClient = function (correlationId) {
        return new SilentIframeClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, exports.ApiId.ssoSilent, this.performanceClient, this.nativeInternalStorage, this.nativeExtensionProvider, correlationId);
    };
    /**
     * Returns new instance of the Silent Cache Interaction Client
     */
    ClientApplication.prototype.createSilentCacheClient = function (correlationId) {
        return new SilentCacheClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, this.performanceClient, this.nativeExtensionProvider, correlationId);
    };
    /**
     * Returns new instance of the Silent Refresh Interaction Client
     */
    ClientApplication.prototype.createSilentRefreshClient = function (correlationId) {
        return new SilentRefreshClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, this.performanceClient, this.nativeExtensionProvider, correlationId);
    };
    /**
     * Returns new instance of the Silent AuthCode Interaction Client
     */
    ClientApplication.prototype.createSilentAuthCodeClient = function (correlationId) {
        return new SilentAuthCodeClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, exports.ApiId.acquireTokenByCode, this.performanceClient, this.nativeExtensionProvider, correlationId);
    };
    /**
     * Adds event callbacks to array
     * @param callback
     */
    ClientApplication.prototype.addEventCallback = function (callback) {
        return this.eventHandler.addEventCallback(callback);
    };
    /**
     * Removes callback with provided id from callback array
     * @param callbackId
     */
    ClientApplication.prototype.removeEventCallback = function (callbackId) {
        this.eventHandler.removeEventCallback(callbackId);
    };
    /**
     * Registers a callback to receive performance events.
     *
     * @param {PerformanceCallbackFunction} callback
     * @returns {string}
     */
    ClientApplication.prototype.addPerformanceCallback = function (callback) {
        return this.performanceClient.addPerformanceCallback(callback);
    };
    /**
     * Removes a callback registered with addPerformanceCallback.
     *
     * @param {string} callbackId
     * @returns {boolean}
     */
    ClientApplication.prototype.removePerformanceCallback = function (callbackId) {
        return this.performanceClient.removePerformanceCallback(callbackId);
    };
    /**
     * Adds event listener that emits an event when a user account is added or removed from localstorage in a different browser tab or window
     */
    ClientApplication.prototype.enableAccountStorageEvents = function () {
        this.eventHandler.enableAccountStorageEvents();
    };
    /**
     * Removes event listener that emits an event when a user account is added or removed from localstorage in a different browser tab or window
     */
    ClientApplication.prototype.disableAccountStorageEvents = function () {
        this.eventHandler.disableAccountStorageEvents();
    };
    /**
     * Gets the token cache for the application.
     */
    ClientApplication.prototype.getTokenCache = function () {
        return this.tokenCache;
    };
    /**
     * Returns the logger instance
     */
    ClientApplication.prototype.getLogger = function () {
        return this.logger;
    };
    /**
     * Replaces the default logger set in configurations with new Logger with new configurations
     * @param logger Logger instance
     */
    ClientApplication.prototype.setLogger = function (logger) {
        this.logger = logger;
    };
    /**
     * Called by wrapper libraries (Angular & React) to set SKU and Version passed down to telemetry, logger, etc.
     * @param sku
     * @param version
     */
    ClientApplication.prototype.initializeWrapperLibrary = function (sku, version) {
        // Validate the SKU passed in is one we expect
        this.browserStorage.setWrapperMetadata(sku, version);
    };
    /**
     * Sets navigation client
     * @param navigationClient
     */
    ClientApplication.prototype.setNavigationClient = function (navigationClient) {
        this.navigationClient = navigationClient;
    };
    /**
     * Returns the configuration object
     */
    ClientApplication.prototype.getConfiguration = function () {
        return this.config;
    };
    /**
     * Generates a correlation id for a request if none is provided.
     *
     * @protected
     * @param {?Partial<BaseAuthRequest>} [request]
     * @returns {string}
     */
    ClientApplication.prototype.getRequestCorrelationId = function (request) {
        if (request === null || request === void 0 ? void 0 : request.correlationId) {
            return request.correlationId;
        }
        if (this.isBrowserEnvironment) {
            return this.browserCrypto.createNewGuid();
        }
        /*
         * Included for fallback for non-browser environments,
         * and to ensure this method always returns a string.
         */
        return Constants.EMPTY_STRING;
    };
    return ClientApplication;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * The PublicClientApplication class is the object exposed by the library to perform authentication and authorization functions in Single Page Applications
 * to obtain JWT tokens as described in the OAuth 2.0 Authorization Code Flow with PKCE specification.
 */
var PublicClientApplication = /** @class */ (function (_super) {
    __extends$1(PublicClientApplication, _super);
    /**
     * @constructor
     * Constructor for the PublicClientApplication used to instantiate the PublicClientApplication object
     *
     * Important attributes in the Configuration object for auth are:
     * - clientID: the application ID of your application. You can obtain one by registering your application with our Application registration portal : https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredAppsPreview
     * - authority: the authority URL for your application.
     * - redirect_uri: the uri of your application registered in the portal.
     *
     * In Azure AD, authority is a URL indicating the Azure active directory that MSAL uses to obtain tokens.
     * It is of the form https://login.microsoftonline.com/{Enter_the_Tenant_Info_Here}
     * If your application supports Accounts in one organizational directory, replace "Enter_the_Tenant_Info_Here" value with the Tenant Id or Tenant name (for example, contoso.microsoft.com).
     * If your application supports Accounts in any organizational directory, replace "Enter_the_Tenant_Info_Here" value with organizations.
     * If your application supports Accounts in any organizational directory and personal Microsoft accounts, replace "Enter_the_Tenant_Info_Here" value with common.
     * To restrict support to Personal Microsoft accounts only, replace "Enter_the_Tenant_Info_Here" value with consumers.
     *
     * In Azure B2C, authority is of the form https://{instance}/tfp/{tenant}/{policyName}/
     * Full B2C functionality will be available in this library in future versions.
     *
     * @param configuration object for the MSAL PublicClientApplication instance
     */
    function PublicClientApplication(configuration) {
        var _this = _super.call(this, configuration) || this;
        _this.activeSilentTokenRequests = new Map();
        return _this;
    }
    /**
     * Use when initiating the login process by redirecting the user's browser to the authorization endpoint. This function redirects the page, so
     * any code that follows this function will not execute.
     *
     * IMPORTANT: It is NOT recommended to have code that is dependent on the resolution of the Promise. This function will navigate away from the current
     * browser window. It currently returns a Promise in order to reflect the asynchronous nature of the code running in this function.
     *
     * @param request
     */
    PublicClientApplication.prototype.loginRedirect = function (request) {
        return __awaiter$1(this, void 0, void 0, function () {
            var correlationId;
            return __generator$1(this, function (_a) {
                correlationId = this.getRequestCorrelationId(request);
                this.logger.verbose("loginRedirect called", correlationId);
                return [2 /*return*/, this.acquireTokenRedirect(__assign$1({ correlationId: correlationId }, (request || DEFAULT_REQUEST)))];
            });
        });
    };
    /**
     * Use when initiating the login process via opening a popup window in the user's browser
     *
     * @param request
     *
     * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.
     */
    PublicClientApplication.prototype.loginPopup = function (request) {
        var correlationId = this.getRequestCorrelationId(request);
        this.logger.verbose("loginPopup called", correlationId);
        return this.acquireTokenPopup(__assign$1({ correlationId: correlationId }, (request || DEFAULT_REQUEST)));
    };
    /**
     * Silently acquire an access token for a given set of scopes. Returns currently processing promise if parallel requests are made.
     *
     * @param {@link (SilentRequest:type)}
     * @returns {Promise.<AuthenticationResult>} - a promise that is fulfilled when this function has completed, or rejected if an error was raised. Returns the {@link AuthResponse} object
     */
    PublicClientApplication.prototype.acquireTokenSilent = function (request) {
        return __awaiter$1(this, void 0, void 0, function () {
            var correlationId, atsMeasurement, account, thumbprint, silentRequestKey, cachedResponse, response;
            var _this = this;
            return __generator$1(this, function (_a) {
                correlationId = this.getRequestCorrelationId(request);
                atsMeasurement = this.performanceClient.startMeasurement(exports.PerformanceEvents.AcquireTokenSilent, correlationId);
                this.preflightBrowserEnvironmentCheck(exports.InteractionType.Silent);
                this.logger.verbose("acquireTokenSilent called", correlationId);
                account = request.account || this.getActiveAccount();
                if (!account) {
                    throw BrowserAuthError.createNoAccountError();
                }
                thumbprint = {
                    clientId: this.config.auth.clientId,
                    authority: request.authority || Constants.EMPTY_STRING,
                    scopes: request.scopes,
                    homeAccountIdentifier: account.homeAccountId,
                    claims: request.claims,
                    authenticationScheme: request.authenticationScheme,
                    resourceRequestMethod: request.resourceRequestMethod,
                    resourceRequestUri: request.resourceRequestUri,
                    shrClaims: request.shrClaims,
                    sshKid: request.sshKid
                };
                silentRequestKey = JSON.stringify(thumbprint);
                cachedResponse = this.activeSilentTokenRequests.get(silentRequestKey);
                if (typeof cachedResponse === "undefined") {
                    this.logger.verbose("acquireTokenSilent called for the first time, storing active request", correlationId);
                    response = this.acquireTokenSilentAsync(__assign$1(__assign$1({}, request), { correlationId: correlationId }), account)
                        .then(function (result) {
                        _this.activeSilentTokenRequests.delete(silentRequestKey);
                        atsMeasurement.endMeasurement({
                            success: true,
                            fromCache: result.fromCache,
                            accessTokenSize: result.accessToken.length,
                            idTokenSize: result.idToken.length,
                            isNativeBroker: result.fromNativeBroker
                        });
                        atsMeasurement.flushMeasurement();
                        return result;
                    })
                        .catch(function (error) {
                        _this.activeSilentTokenRequests.delete(silentRequestKey);
                        atsMeasurement.endMeasurement({
                            success: false
                        });
                        atsMeasurement.flushMeasurement();
                        throw error;
                    });
                    this.activeSilentTokenRequests.set(silentRequestKey, response);
                    return [2 /*return*/, response];
                }
                else {
                    this.logger.verbose("acquireTokenSilent has been called previously, returning the result from the first call", correlationId);
                    atsMeasurement.endMeasurement({
                        success: true
                    });
                    // Discard measurements for memoized calls, as they are usually only a couple of ms and will artificially deflate metrics
                    atsMeasurement.discardMeasurement();
                    return [2 /*return*/, cachedResponse];
                }
            });
        });
    };
    /**
     * Silently acquire an access token for a given set of scopes. Will use cached token if available, otherwise will attempt to acquire a new token from the network via refresh token.
     * @param {@link (SilentRequest:type)}
     * @param {@link (AccountInfo:type)}
     * @returns {Promise.<AuthenticationResult>} - a promise that is fulfilled when this function has completed, or rejected if an error was raised. Returns the {@link AuthResponse}
     */
    PublicClientApplication.prototype.acquireTokenSilentAsync = function (request, account) {
        return __awaiter$1(this, void 0, void 0, function () {
            var astsAsyncMeasurement, result, silentRequest, silentCacheClient, silentRequest_1;
            var _this = this;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_START, exports.InteractionType.Silent, request);
                        astsAsyncMeasurement = this.performanceClient.startMeasurement(exports.PerformanceEvents.AcquireTokenSilentAsync, request.correlationId);
                        if (!(NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeExtensionProvider, request.authenticationScheme) && account.nativeAccountId)) return [3 /*break*/, 1];
                        this.logger.verbose("acquireTokenSilent - attempting to acquire token from native platform");
                        silentRequest = __assign$1(__assign$1({}, request), { account: account });
                        result = this.acquireTokenNative(silentRequest, exports.ApiId.acquireTokenSilent_silentFlow).catch(function (e) { return __awaiter$1(_this, void 0, void 0, function () {
                            var silentIframeClient;
                            return __generator$1(this, function (_a) {
                                // If native token acquisition fails for availability reasons fallback to web flow
                                if (e instanceof NativeAuthError && e.isFatal()) {
                                    this.logger.verbose("acquireTokenSilent - native platform unavailable, falling back to web flow");
                                    this.nativeExtensionProvider = undefined; // Prevent future requests from continuing to attempt 
                                    silentIframeClient = this.createSilentIframeClient(request.correlationId);
                                    return [2 /*return*/, silentIframeClient.acquireToken(request)];
                                }
                                throw e;
                            });
                        }); });
                        return [3 /*break*/, 3];
                    case 1:
                        this.logger.verbose("acquireTokenSilent - attempting to acquire token from web flow");
                        silentCacheClient = this.createSilentCacheClient(request.correlationId);
                        return [4 /*yield*/, silentCacheClient.initializeSilentRequest(request, account)];
                    case 2:
                        silentRequest_1 = _a.sent();
                        result = silentCacheClient.acquireToken(silentRequest_1).catch(function () { return __awaiter$1(_this, void 0, void 0, function () {
                            return __generator$1(this, function (_a) {
                                return [2 /*return*/, this.acquireTokenByRefreshToken(silentRequest_1)];
                            });
                        }); });
                        _a.label = 3;
                    case 3: return [2 /*return*/, result.then(function (response) {
                            _this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_SUCCESS, exports.InteractionType.Silent, response);
                            astsAsyncMeasurement.endMeasurement({
                                success: true,
                                fromCache: response.fromCache,
                                accessTokenSize: response.accessToken.length,
                                idTokenSize: response.idToken.length,
                                isNativeBroker: response.fromNativeBroker
                            });
                            return response;
                        }).catch(function (tokenRenewalError) {
                            _this.eventHandler.emitEvent(exports.EventType.ACQUIRE_TOKEN_FAILURE, exports.InteractionType.Silent, null, tokenRenewalError);
                            astsAsyncMeasurement.endMeasurement({
                                errorCode: tokenRenewalError.errorCode,
                                subErrorCode: tokenRenewalError.subError,
                                success: false
                            });
                            throw tokenRenewalError;
                        })];
                }
            });
        });
    };
    return PublicClientApplication;
}(ClientApplication));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var stubbedPublicClientApplication = {
    initialize: function () {
        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
    },
    acquireTokenPopup: function () {
        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
    },
    acquireTokenRedirect: function () {
        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
    },
    acquireTokenSilent: function () {
        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
    },
    acquireTokenByCode: function () {
        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
    },
    getAllAccounts: function () {
        return [];
    },
    getAccountByHomeId: function () {
        return null;
    },
    getAccountByUsername: function () {
        return null;
    },
    getAccountByLocalId: function () {
        return null;
    },
    handleRedirectPromise: function () {
        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
    },
    loginPopup: function () {
        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
    },
    loginRedirect: function () {
        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
    },
    logout: function () {
        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
    },
    logoutRedirect: function () {
        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
    },
    logoutPopup: function () {
        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
    },
    ssoSilent: function () {
        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
    },
    addEventCallback: function () {
        return null;
    },
    removeEventCallback: function () {
        return;
    },
    addPerformanceCallback: function () {
        return "";
    },
    removePerformanceCallback: function () {
        return false;
    },
    enableAccountStorageEvents: function () {
        return;
    },
    disableAccountStorageEvents: function () {
        return;
    },
    getTokenCache: function () {
        throw BrowserConfigurationAuthError.createStubPcaInstanceCalledError();
    },
    getLogger: function () {
        throw BrowserConfigurationAuthError.createStubPcaInstanceCalledError();
    },
    setLogger: function () {
        return;
    },
    setActiveAccount: function () {
        return;
    },
    getActiveAccount: function () {
        return null;
    },
    initializeWrapperLibrary: function () {
        return;
    },
    setNavigationClient: function () {
        return;
    },
    getConfiguration: function () {
        throw BrowserConfigurationAuthError.createStubPcaInstanceCalledError();
    }
};

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var EventMessageUtils = /** @class */ (function () {
    function EventMessageUtils() {
    }
    /**
     * Gets interaction status from event message
     * @param message
     * @param currentStatus
     */
    EventMessageUtils.getInteractionStatusFromEvent = function (message, currentStatus) {
        switch (message.eventType) {
            case exports.EventType.LOGIN_START:
                return exports.InteractionStatus.Login;
            case exports.EventType.SSO_SILENT_START:
                return exports.InteractionStatus.SsoSilent;
            case exports.EventType.ACQUIRE_TOKEN_START:
                if (message.interactionType === exports.InteractionType.Redirect || message.interactionType === exports.InteractionType.Popup) {
                    return exports.InteractionStatus.AcquireToken;
                }
                break;
            case exports.EventType.HANDLE_REDIRECT_START:
                return exports.InteractionStatus.HandleRedirect;
            case exports.EventType.LOGOUT_START:
                return exports.InteractionStatus.Logout;
            case exports.EventType.SSO_SILENT_SUCCESS:
            case exports.EventType.SSO_SILENT_FAILURE:
                if (currentStatus && currentStatus !== exports.InteractionStatus.SsoSilent) {
                    // Prevent this event from clearing any status other than ssoSilent
                    break;
                }
                return exports.InteractionStatus.None;
            case exports.EventType.LOGOUT_END:
                if (currentStatus && currentStatus !== exports.InteractionStatus.Logout) {
                    // Prevent this event from clearing any status other than logout
                    break;
                }
                return exports.InteractionStatus.None;
            case exports.EventType.HANDLE_REDIRECT_END:
                if (currentStatus && currentStatus !== exports.InteractionStatus.HandleRedirect) {
                    // Prevent this event from clearing any status other than handleRedirect
                    break;
                }
                return exports.InteractionStatus.None;
            case exports.EventType.LOGIN_SUCCESS:
            case exports.EventType.LOGIN_FAILURE:
            case exports.EventType.ACQUIRE_TOKEN_SUCCESS:
            case exports.EventType.ACQUIRE_TOKEN_FAILURE:
                if (message.interactionType === exports.InteractionType.Redirect || message.interactionType === exports.InteractionType.Popup) {
                    if (currentStatus && currentStatus !== exports.InteractionStatus.Login && currentStatus !== exports.InteractionStatus.AcquireToken) {
                        // Prevent this event from clearing any status other than login or acquireToken
                        break;
                    }
                    return exports.InteractionStatus.None;
                }
                break;
        }
        return null;
    };
    return EventMessageUtils;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var SignedHttpRequest = /** @class */ (function () {
    function SignedHttpRequest(shrParameters, shrOptions) {
        var loggerOptions = (shrOptions && shrOptions.loggerOptions) || {};
        this.logger = new Logger(loggerOptions, name, version);
        this.cryptoOps = new CryptoOps(this.logger);
        this.popTokenGenerator = new PopTokenGenerator(this.cryptoOps);
        this.shrParameters = shrParameters;
    }
    /**
     * Generates and caches a keypair for the given request options.
     * @returns Public key digest, which should be sent to the token issuer.
     */
    SignedHttpRequest.prototype.generatePublicKeyThumbprint = function () {
        return __awaiter$1(this, void 0, void 0, function () {
            var kid;
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.popTokenGenerator.generateKid(this.shrParameters)];
                    case 1:
                        kid = (_a.sent()).kid;
                        return [2 /*return*/, kid];
                }
            });
        });
    };
    /**
     * Generates a signed http request for the given payload with the given key.
     * @param payload Payload to sign (e.g. access token)
     * @param publicKeyThumbprint Public key digest (from generatePublicKeyThumbprint API)
     * @param claims Additional claims to include/override in the signed JWT
     * @returns Pop token signed with the corresponding private key
     */
    SignedHttpRequest.prototype.signRequest = function (payload, publicKeyThumbprint, claims) {
        return __awaiter$1(this, void 0, void 0, function () {
            return __generator$1(this, function (_a) {
                return [2 /*return*/, this.popTokenGenerator.signPayload(payload, publicKeyThumbprint, this.shrParameters, claims)];
            });
        });
    };
    /**
     * Removes cached keys from browser for given public key thumbprint
     * @param publicKeyThumbprint Public key digest (from generatePublicKeyThumbprint API)
     * @returns If keys are properly deleted
     */
    SignedHttpRequest.prototype.removeKeys = function (publicKeyThumbprint) {
        return __awaiter$1(this, void 0, void 0, function () {
            return __generator$1(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.cryptoOps.removeTokenBindingKey(publicKeyThumbprint)];
                    case 1: return [2 /*return*/, _a.sent()];
                }
            });
        });
    };
    return SignedHttpRequest;
}());

exports.AccountEntity = AccountEntity;
exports.AuthError = AuthError;
exports.AuthErrorMessage = AuthErrorMessage;
exports.AuthenticationHeaderParser = AuthenticationHeaderParser;
exports.BrowserAuthError = BrowserAuthError;
exports.BrowserAuthErrorMessage = BrowserAuthErrorMessage;
exports.BrowserConfigurationAuthError = BrowserConfigurationAuthError;
exports.BrowserConfigurationAuthErrorMessage = BrowserConfigurationAuthErrorMessage;
exports.BrowserUtils = BrowserUtils;
exports.ClientAuthError = ClientAuthError;
exports.ClientAuthErrorMessage = ClientAuthErrorMessage;
exports.ClientConfigurationError = ClientConfigurationError;
exports.ClientConfigurationErrorMessage = ClientConfigurationErrorMessage;
exports.DEFAULT_IFRAME_TIMEOUT_MS = DEFAULT_IFRAME_TIMEOUT_MS;
exports.EventMessageUtils = EventMessageUtils;
exports.InteractionRequiredAuthError = InteractionRequiredAuthError;
exports.InteractionRequiredAuthErrorMessage = InteractionRequiredAuthErrorMessage;
exports.Logger = Logger;
exports.NavigationClient = NavigationClient;
exports.OIDC_DEFAULT_SCOPES = OIDC_DEFAULT_SCOPES;
exports.PublicClientApplication = PublicClientApplication;
exports.ServerError = ServerError;
exports.SignedHttpRequest = SignedHttpRequest;
exports.StringUtils = StringUtils;
exports.UrlString = UrlString;
exports.internals = internals;
exports.stubbedPublicClientApplication = stubbedPublicClientApplication;
exports.version = version;
//# sourceMappingURL=index.cjs.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import * as internals from './internals.js';
export { internals };
export { PublicClientApplication } from './app/PublicClientApplication.js';
export { DEFAULT_IFRAME_TIMEOUT_MS } from './config/Configuration.js';
export { ApiId, BrowserCacheLocation, InteractionStatus, InteractionType, WrapperSKU } from './utils/BrowserConstants.js';
export { BrowserUtils } from './utils/BrowserUtils.js';
export { BrowserAuthError, BrowserAuthErrorMessage } from './error/BrowserAuthError.js';
export { BrowserConfigurationAuthError, BrowserConfigurationAuthErrorMessage } from './error/BrowserConfigurationAuthError.js';
export { stubbedPublicClientApplication } from './app/IPublicClientApplication.js';
export { NavigationClient } from './navigation/NavigationClient.js';
export { EventMessageUtils } from './event/EventMessage.js';
export { EventType } from './event/EventType.js';
export { SignedHttpRequest } from './crypto/SignedHttpRequest.js';
export { AccountEntity, AuthError, AuthErrorMessage, AuthenticationHeaderParser, AuthenticationScheme, AzureCloudInstance, ClientAuthError, ClientAuthErrorMessage, ClientConfigurationError, ClientConfigurationErrorMessage, InteractionRequiredAuthError, InteractionRequiredAuthErrorMessage, LogLevel, Logger, OIDC_DEFAULT_SCOPES, PerformanceEvents, ProtocolMode, ServerError, StringUtils, UrlString } from '@azure/msal-common';
export { version } from './packageMetadata.js';
//# sourceMappingURL=index.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
export { BrowserCacheManager } from './cache/BrowserCacheManager.js';
export { StandardInteractionClient } from './interaction_client/StandardInteractionClient.js';
export { RedirectClient } from './interaction_client/RedirectClient.js';
export { PopupClient } from './interaction_client/PopupClient.js';
export { SilentIframeClient } from './interaction_client/SilentIframeClient.js';
export { SilentCacheClient } from './interaction_client/SilentCacheClient.js';
export { SilentRefreshClient } from './interaction_client/SilentRefreshClient.js';
export { RedirectHandler } from './interaction_handler/RedirectHandler.js';
export { EventHandler } from './event/EventHandler.js';
export { NativeMessageHandler } from './broker/nativeBroker/NativeMessageHandler.js';
export { BrowserConstants, TemporaryCacheKeys } from './utils/BrowserConstants.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
//# sourceMappingURL=internals.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
/* eslint-disable header/header */
var name = "@azure/msal-browser";
var version = "2.28.1";

export { name, version };
//# sourceMappingURL=packageMetadata.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { OIDC_DEFAULT_SCOPES } from '@azure/msal-common';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Constants
 */
var BrowserConstants = {
    /**
     * Interaction in progress cache value
     */
    INTERACTION_IN_PROGRESS_VALUE: "interaction_in_progress",
    /**
     * Invalid grant error code
     */
    INVALID_GRANT_ERROR: "invalid_grant",
    /**
     * Default popup window width
     */
    POPUP_WIDTH: 483,
    /**
     * Default popup window height
     */
    POPUP_HEIGHT: 600,
    /**
     * Name of the popup window starts with
     */
    POPUP_NAME_PREFIX: "msal",
    /**
     * Default popup monitor poll interval in milliseconds
     */
    POLL_INTERVAL_MS: 50,
    /**
     * Msal-browser SKU
     */
    MSAL_SKU: "msal.js.browser",
};
var NativeConstants = {
    CHANNEL_ID: "53ee284d-920a-4b59-9d30-a60315b26836",
    PREFERRED_EXTENSION_ID: "ppnbnpeolgkicgegkbkbjmhlideopiji",
    MATS_TELEMETRY: "MATS"
};
var NativeExtensionMethod;
(function (NativeExtensionMethod) {
    NativeExtensionMethod["HandshakeRequest"] = "Handshake";
    NativeExtensionMethod["HandshakeResponse"] = "HandshakeResponse";
    NativeExtensionMethod["GetToken"] = "GetToken";
    NativeExtensionMethod["Response"] = "Response";
})(NativeExtensionMethod || (NativeExtensionMethod = {}));
var BrowserCacheLocation;
(function (BrowserCacheLocation) {
    BrowserCacheLocation["LocalStorage"] = "localStorage";
    BrowserCacheLocation["SessionStorage"] = "sessionStorage";
    BrowserCacheLocation["MemoryStorage"] = "memoryStorage";
})(BrowserCacheLocation || (BrowserCacheLocation = {}));
/**
 * HTTP Request types supported by MSAL.
 */
var HTTP_REQUEST_TYPE;
(function (HTTP_REQUEST_TYPE) {
    HTTP_REQUEST_TYPE["GET"] = "GET";
    HTTP_REQUEST_TYPE["POST"] = "POST";
})(HTTP_REQUEST_TYPE || (HTTP_REQUEST_TYPE = {}));
/**
 * Temporary cache keys for MSAL, deleted after any request.
 */
var TemporaryCacheKeys;
(function (TemporaryCacheKeys) {
    TemporaryCacheKeys["AUTHORITY"] = "authority";
    TemporaryCacheKeys["ACQUIRE_TOKEN_ACCOUNT"] = "acquireToken.account";
    TemporaryCacheKeys["SESSION_STATE"] = "session.state";
    TemporaryCacheKeys["REQUEST_STATE"] = "request.state";
    TemporaryCacheKeys["NONCE_IDTOKEN"] = "nonce.id_token";
    TemporaryCacheKeys["ORIGIN_URI"] = "request.origin";
    TemporaryCacheKeys["RENEW_STATUS"] = "token.renew.status";
    TemporaryCacheKeys["URL_HASH"] = "urlHash";
    TemporaryCacheKeys["REQUEST_PARAMS"] = "request.params";
    TemporaryCacheKeys["SCOPES"] = "scopes";
    TemporaryCacheKeys["INTERACTION_STATUS_KEY"] = "interaction.status";
    TemporaryCacheKeys["CCS_CREDENTIAL"] = "ccs.credential";
    TemporaryCacheKeys["CORRELATION_ID"] = "request.correlationId";
    TemporaryCacheKeys["NATIVE_REQUEST"] = "request.native";
})(TemporaryCacheKeys || (TemporaryCacheKeys = {}));
/**
 * Cache keys stored in-memory
 */
var InMemoryCacheKeys;
(function (InMemoryCacheKeys) {
    InMemoryCacheKeys["WRAPPER_SKU"] = "wrapper.sku";
    InMemoryCacheKeys["WRAPPER_VER"] = "wrapper.version";
})(InMemoryCacheKeys || (InMemoryCacheKeys = {}));
/**
 * API Codes for Telemetry purposes.
 * Before adding a new code you must claim it in the MSAL Telemetry tracker as these number spaces are shared across all MSALs
 * 0-99 Silent Flow
 * 800-899 Auth Code Flow
 */
var ApiId;
(function (ApiId) {
    ApiId[ApiId["acquireTokenRedirect"] = 861] = "acquireTokenRedirect";
    ApiId[ApiId["acquireTokenPopup"] = 862] = "acquireTokenPopup";
    ApiId[ApiId["ssoSilent"] = 863] = "ssoSilent";
    ApiId[ApiId["acquireTokenSilent_authCode"] = 864] = "acquireTokenSilent_authCode";
    ApiId[ApiId["handleRedirectPromise"] = 865] = "handleRedirectPromise";
    ApiId[ApiId["acquireTokenByCode"] = 866] = "acquireTokenByCode";
    ApiId[ApiId["acquireTokenSilent_silentFlow"] = 61] = "acquireTokenSilent_silentFlow";
    ApiId[ApiId["logout"] = 961] = "logout";
    ApiId[ApiId["logoutPopup"] = 962] = "logoutPopup";
})(ApiId || (ApiId = {}));
/*
 * Interaction type of the API - used for state and telemetry
 */
var InteractionType;
(function (InteractionType) {
    InteractionType["Redirect"] = "redirect";
    InteractionType["Popup"] = "popup";
    InteractionType["Silent"] = "silent";
    InteractionType["None"] = "none";
})(InteractionType || (InteractionType = {}));
/**
 * Types of interaction currently in progress.
 * Used in events in wrapper libraries to invoke functions when certain interaction is in progress or all interactions are complete.
 */
var InteractionStatus;
(function (InteractionStatus) {
    /**
     * Initial status before interaction occurs
     */
    InteractionStatus["Startup"] = "startup";
    /**
     * Status set when all login calls occuring
     */
    InteractionStatus["Login"] = "login";
    /**
     * Status set when logout call occuring
     */
    InteractionStatus["Logout"] = "logout";
    /**
     * Status set for acquireToken calls
     */
    InteractionStatus["AcquireToken"] = "acquireToken";
    /**
     * Status set for ssoSilent calls
     */
    InteractionStatus["SsoSilent"] = "ssoSilent";
    /**
     * Status set when handleRedirect in progress
     */
    InteractionStatus["HandleRedirect"] = "handleRedirect";
    /**
     * Status set when interaction is complete
     */
    InteractionStatus["None"] = "none";
})(InteractionStatus || (InteractionStatus = {}));
var DEFAULT_REQUEST = {
    scopes: OIDC_DEFAULT_SCOPES
};
/**
 * JWK Key Format string (Type MUST be defined for window crypto APIs)
 */
var KEY_FORMAT_JWK = "jwk";
// Supported wrapper SKUs
var WrapperSKU;
(function (WrapperSKU) {
    WrapperSKU["React"] = "@azure/msal-react";
    WrapperSKU["Angular"] = "@azure/msal-angular";
})(WrapperSKU || (WrapperSKU = {}));
// DatabaseStorage Constants
var DB_NAME = "msal.db";
var DB_VERSION = 1;
var DB_TABLE_NAME = DB_NAME + ".keys";

export { ApiId, BrowserCacheLocation, BrowserConstants, DB_NAME, DB_TABLE_NAME, DB_VERSION, DEFAULT_REQUEST, HTTP_REQUEST_TYPE, InMemoryCacheKeys, InteractionStatus, InteractionType, KEY_FORMAT_JWK, NativeConstants, NativeExtensionMethod, TemporaryCacheKeys, WrapperSKU };
//# sourceMappingURL=BrowserConstants.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { StringUtils, ProtocolUtils, ClientAuthError, UrlString } from '@azure/msal-common';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var BrowserProtocolUtils = /** @class */ (function () {
    function BrowserProtocolUtils() {
    }
    /**
     * Extracts the BrowserStateObject from the state string.
     * @param browserCrypto
     * @param state
     */
    BrowserProtocolUtils.extractBrowserRequestState = function (browserCrypto, state) {
        if (StringUtils.isEmpty(state)) {
            return null;
        }
        try {
            var requestStateObj = ProtocolUtils.parseRequestState(browserCrypto, state);
            return requestStateObj.libraryState.meta;
        }
        catch (e) {
            throw ClientAuthError.createInvalidStateError(state, e);
        }
    };
    /**
     * Parses properties of server response from url hash
     * @param locationHash Hash from url
     */
    BrowserProtocolUtils.parseServerResponseFromHash = function (locationHash) {
        if (!locationHash) {
            return {};
        }
        var hashUrlString = new UrlString(locationHash);
        return UrlString.getDeserializedHash(hashUrlString.getHash());
    };
    return BrowserProtocolUtils;
}());

export { BrowserProtocolUtils };
//# sourceMappingURL=BrowserProtocolUtils.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { Constants } from '@azure/msal-common';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Utility functions for strings in a browser. See here for implementation details:
 * https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#Solution_2_%E2%80%93_JavaScript's_UTF-16_%3E_UTF-8_%3E_base64
 */
var BrowserStringUtils = /** @class */ (function () {
    function BrowserStringUtils() {
    }
    /**
     * Converts string to Uint8Array
     * @param sDOMStr
     */
    BrowserStringUtils.stringToUtf8Arr = function (sDOMStr) {
        var nChr;
        var nArrLen = 0;
        var nStrLen = sDOMStr.length;
        /* mapping... */
        for (var nMapIdx = 0; nMapIdx < nStrLen; nMapIdx++) {
            nChr = sDOMStr.charCodeAt(nMapIdx);
            nArrLen += nChr < 0x80 ? 1 : nChr < 0x800 ? 2 : nChr < 0x10000 ? 3 : nChr < 0x200000 ? 4 : nChr < 0x4000000 ? 5 : 6;
        }
        var aBytes = new Uint8Array(nArrLen);
        /* transcription... */
        for (var nIdx = 0, nChrIdx = 0; nIdx < nArrLen; nChrIdx++) {
            nChr = sDOMStr.charCodeAt(nChrIdx);
            if (nChr < 128) {
                /* one byte */
                aBytes[nIdx++] = nChr;
            }
            else if (nChr < 0x800) {
                /* two bytes */
                aBytes[nIdx++] = 192 + (nChr >>> 6);
                aBytes[nIdx++] = 128 + (nChr & 63);
            }
            else if (nChr < 0x10000) {
                /* three bytes */
                aBytes[nIdx++] = 224 + (nChr >>> 12);
                aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);
                aBytes[nIdx++] = 128 + (nChr & 63);
            }
            else if (nChr < 0x200000) {
                /* four bytes */
                aBytes[nIdx++] = 240 + (nChr >>> 18);
                aBytes[nIdx++] = 128 + (nChr >>> 12 & 63);
                aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);
                aBytes[nIdx++] = 128 + (nChr & 63);
            }
            else if (nChr < 0x4000000) {
                /* five bytes */
                aBytes[nIdx++] = 248 + (nChr >>> 24);
                aBytes[nIdx++] = 128 + (nChr >>> 18 & 63);
                aBytes[nIdx++] = 128 + (nChr >>> 12 & 63);
                aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);
                aBytes[nIdx++] = 128 + (nChr & 63);
            }
            else /* if (nChr <= 0x7fffffff) */ {
                /* six bytes */
                aBytes[nIdx++] = 252 + (nChr >>> 30);
                aBytes[nIdx++] = 128 + (nChr >>> 24 & 63);
                aBytes[nIdx++] = 128 + (nChr >>> 18 & 63);
                aBytes[nIdx++] = 128 + (nChr >>> 12 & 63);
                aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);
                aBytes[nIdx++] = 128 + (nChr & 63);
            }
        }
        return aBytes;
    };
    /**
     * Converst string to ArrayBuffer
     * @param dataString
     */
    BrowserStringUtils.stringToArrayBuffer = function (dataString) {
        var data = new ArrayBuffer(dataString.length);
        var dataView = new Uint8Array(data);
        for (var i = 0; i < dataString.length; i++) {
            dataView[i] = dataString.charCodeAt(i);
        }
        return data;
    };
    /**
     * Converts Uint8Array to a string
     * @param aBytes
     */
    BrowserStringUtils.utf8ArrToString = function (aBytes) {
        var sView = Constants.EMPTY_STRING;
        for (var nPart = void 0, nLen = aBytes.length, nIdx = 0; nIdx < nLen; nIdx++) {
            nPart = aBytes[nIdx];
            sView += String.fromCharCode(nPart > 251 && nPart < 254 && nIdx + 5 < nLen ? /* six bytes */
                /* (nPart - 252 << 30) may be not so safe in ECMAScript! So...: */
                (nPart - 252) * 1073741824 + (aBytes[++nIdx] - 128 << 24) + (aBytes[++nIdx] - 128 << 18) + (aBytes[++nIdx] - 128 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
                : nPart > 247 && nPart < 252 && nIdx + 4 < nLen ? /* five bytes */
                    (nPart - 248 << 24) + (aBytes[++nIdx] - 128 << 18) + (aBytes[++nIdx] - 128 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
                    : nPart > 239 && nPart < 248 && nIdx + 3 < nLen ? /* four bytes */
                        (nPart - 240 << 18) + (aBytes[++nIdx] - 128 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
                        : nPart > 223 && nPart < 240 && nIdx + 2 < nLen ? /* three bytes */
                            (nPart - 224 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
                            : nPart > 191 && nPart < 224 && nIdx + 1 < nLen ? /* two bytes */
                                (nPart - 192 << 6) + aBytes[++nIdx] - 128
                                : /* nPart < 127 ? */ /* one byte */
                                    nPart);
        }
        return sView;
    };
    return BrowserStringUtils;
}());

export { BrowserStringUtils };
//# sourceMappingURL=BrowserStringUtils.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { Constants, UrlString } from '@azure/msal-common';
import { FetchClient } from '../network/FetchClient.js';
import { XhrClient } from '../network/XhrClient.js';
import { BrowserAuthError } from '../error/BrowserAuthError.js';
import { BrowserConstants, InteractionType } from './BrowserConstants.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Utility class for browser specific functions
 */
var BrowserUtils = /** @class */ (function () {
    function BrowserUtils() {
    }
    // #region Window Navigation and URL management
    /**
     * Clears hash from window url.
     */
    BrowserUtils.clearHash = function (contentWindow) {
        // Office.js sets history.replaceState to null
        contentWindow.location.hash = Constants.EMPTY_STRING;
        if (typeof contentWindow.history.replaceState === "function") {
            // Full removes "#" from url
            contentWindow.history.replaceState(null, Constants.EMPTY_STRING, "" + contentWindow.location.origin + contentWindow.location.pathname + contentWindow.location.search);
        }
    };
    /**
     * Replaces current hash with hash from provided url
     */
    BrowserUtils.replaceHash = function (url) {
        var urlParts = url.split("#");
        urlParts.shift(); // Remove part before the hash
        window.location.hash = urlParts.length > 0 ? urlParts.join("#") : Constants.EMPTY_STRING;
    };
    /**
     * Returns boolean of whether the current window is in an iframe or not.
     */
    BrowserUtils.isInIframe = function () {
        return window.parent !== window;
    };
    /**
     * Returns boolean of whether or not the current window is a popup opened by msal
     */
    BrowserUtils.isInPopup = function () {
        return typeof window !== "undefined" && !!window.opener &&
            window.opener !== window &&
            typeof window.name === "string" &&
            window.name.indexOf(BrowserConstants.POPUP_NAME_PREFIX + ".") === 0;
    };
    // #endregion
    /**
     * Returns current window URL as redirect uri
     */
    BrowserUtils.getCurrentUri = function () {
        return window.location.href.split("?")[0].split("#")[0];
    };
    /**
     * Gets the homepage url for the current window location.
     */
    BrowserUtils.getHomepage = function () {
        var currentUrl = new UrlString(window.location.href);
        var urlComponents = currentUrl.getUrlComponents();
        return urlComponents.Protocol + "//" + urlComponents.HostNameAndPort + "/";
    };
    /**
     * Returns best compatible network client object.
     */
    BrowserUtils.getBrowserNetworkClient = function () {
        if (window.fetch && window.Headers) {
            return new FetchClient();
        }
        else {
            return new XhrClient();
        }
    };
    /**
     * Throws error if we have completed an auth and are
     * attempting another auth request inside an iframe.
     */
    BrowserUtils.blockReloadInHiddenIframes = function () {
        var isResponseHash = UrlString.hashContainsKnownProperties(window.location.hash);
        // return an error if called from the hidden iframe created by the msal js silent calls
        if (isResponseHash && BrowserUtils.isInIframe()) {
            throw BrowserAuthError.createBlockReloadInHiddenIframeError();
        }
    };
    /**
     * Block redirect operations in iframes unless explicitly allowed
     * @param interactionType Interaction type for the request
     * @param allowRedirectInIframe Config value to allow redirects when app is inside an iframe
     */
    BrowserUtils.blockRedirectInIframe = function (interactionType, allowRedirectInIframe) {
        var isIframedApp = BrowserUtils.isInIframe();
        if (interactionType === InteractionType.Redirect && isIframedApp && !allowRedirectInIframe) {
            // If we are not in top frame, we shouldn't redirect. This is also handled by the service.
            throw BrowserAuthError.createRedirectInIframeError(isIframedApp);
        }
    };
    /**
     * Block redirectUri loaded in popup from calling AcquireToken APIs
     */
    BrowserUtils.blockAcquireTokenInPopups = function () {
        // Popups opened by msal popup APIs are given a name that starts with "msal."
        if (BrowserUtils.isInPopup()) {
            throw BrowserAuthError.createBlockAcquireTokenInPopupsError();
        }
    };
    /**
     * Throws error if token requests are made in non-browser environment
     * @param isBrowserEnvironment Flag indicating if environment is a browser.
     */
    BrowserUtils.blockNonBrowserEnvironment = function (isBrowserEnvironment) {
        if (!isBrowserEnvironment) {
            throw BrowserAuthError.createNonBrowserEnvironmentError();
        }
    };
    /**
     * Throws error if native brokering is enabled but initialize hasn't been called
     * @param allowNativeBroker
     * @param initialized
     */
    BrowserUtils.blockNativeBrokerCalledBeforeInitialized = function (allowNativeBroker, initialized) {
        if (allowNativeBroker && !initialized) {
            throw BrowserAuthError.createNativeBrokerCalledBeforeInitialize();
        }
    };
    /**
     * Returns boolean of whether current browser is an Internet Explorer or Edge browser.
     */
    BrowserUtils.detectIEOrEdge = function () {
        var ua = window.navigator.userAgent;
        var msie = ua.indexOf("MSIE ");
        var msie11 = ua.indexOf("Trident/");
        var msedge = ua.indexOf("Edge/");
        var isIE = msie > 0 || msie11 > 0;
        var isEdge = msedge > 0;
        return isIE || isEdge;
    };
    return BrowserUtils;
}());

export { BrowserUtils };
//# sourceMappingURL=BrowserUtils.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Utility class for math specific functions in browser.
 */
var MathUtils = /** @class */ (function () {
    function MathUtils() {
    }
    /**
     * Decimal to Hex
     *
     * @param num
     */
    MathUtils.decimalToHex = function (num) {
        var hex = num.toString(16);
        while (hex.length < 2) {
            hex = "0" + hex;
        }
        return hex;
    };
    return MathUtils;
}());

export { MathUtils };
//# sourceMappingURL=MathUtils.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __extends, __assign } from '../_virtual/_tslib.js';
import { PerformanceClient } from '@azure/msal-common';
import { BrowserCrypto } from '../crypto/BrowserCrypto.js';
import { GuidGenerator } from '../crypto/GuidGenerator.js';
import { BrowserPerformanceMeasurement } from './BrowserPerformanceMeasurement.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var BrowserPerformanceClient = /** @class */ (function (_super) {
    __extends(BrowserPerformanceClient, _super);
    function BrowserPerformanceClient(clientId, authority, logger, libraryName, libraryVersion, applicationTelemetry) {
        var _this = _super.call(this, clientId, authority, logger, libraryName, libraryVersion, applicationTelemetry) || this;
        _this.browserCrypto = new BrowserCrypto(_this.logger);
        _this.guidGenerator = new GuidGenerator(_this.browserCrypto);
        return _this;
    }
    BrowserPerformanceClient.prototype.startPerformanceMeasuremeant = function (measureName, correlationId) {
        return new BrowserPerformanceMeasurement(measureName, correlationId);
    };
    BrowserPerformanceClient.prototype.generateId = function () {
        return this.guidGenerator.generateGuid();
    };
    BrowserPerformanceClient.prototype.getPageVisibility = function () {
        var _a;
        return ((_a = document.visibilityState) === null || _a === void 0 ? void 0 : _a.toString()) || null;
    };
    /**
     * Starts measuring performance for a given operation. Returns a function that should be used to end the measurement.
     * Also captures browser page visibilityState.
     *
     * @param {PerformanceEvents} measureName
     * @param {?string} [correlationId]
     * @returns {((event?: Partial<PerformanceEvent>) => PerformanceEvent| null)}
     */
    BrowserPerformanceClient.prototype.startMeasurement = function (measureName, correlationId) {
        var _this = this;
        // Capture page visibilityState and then invoke start/end measurement
        var startPageVisibility = this.getPageVisibility();
        var inProgressEvent = _super.prototype.startMeasurement.call(this, measureName, correlationId);
        return __assign(__assign({}, inProgressEvent), { endMeasurement: function (event) {
                return inProgressEvent.endMeasurement(__assign({ startPageVisibility: startPageVisibility, endPageVisibility: _this.getPageVisibility() }, event));
            } });
    };
    return BrowserPerformanceClient;
}(PerformanceClient));

export { BrowserPerformanceClient };
//# sourceMappingURL=BrowserPerformanceClient.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var BrowserPerformanceMeasurement = /** @class */ (function () {
    function BrowserPerformanceMeasurement(name, correlationId) {
        this.correlationId = correlationId;
        this.measureName = "msal.measure." + name + "." + this.correlationId;
        this.startMark = "msal.start." + name + "." + this.correlationId;
        this.endMark = "msal.end." + name + "." + this.correlationId;
    }
    BrowserPerformanceMeasurement.supportsBrowserPerformance = function () {
        return typeof window !== "undefined" &&
            typeof window.performance !== "undefined" &&
            typeof window.performance.mark === "function" &&
            typeof window.performance.measure === "function" &&
            typeof window.performance.clearMarks === "function" &&
            typeof window.performance.clearMeasures === "function" &&
            typeof window.performance.getEntriesByName === "function";
    };
    BrowserPerformanceMeasurement.prototype.startMeasurement = function () {
        if (BrowserPerformanceMeasurement.supportsBrowserPerformance()) {
            try {
                window.performance.mark(this.startMark);
            }
            catch (e) {
                // Silently catch
            }
        }
    };
    BrowserPerformanceMeasurement.prototype.endMeasurement = function () {
        if (BrowserPerformanceMeasurement.supportsBrowserPerformance()) {
            try {
                window.performance.mark(this.endMark);
                window.performance.measure(this.measureName, this.startMark, this.endMark);
            }
            catch (e) {
                // Silently catch
            }
        }
    };
    BrowserPerformanceMeasurement.prototype.flushMeasurement = function () {
        if (BrowserPerformanceMeasurement.supportsBrowserPerformance()) {
            try {
                var entriesForMeasurement = window.performance.getEntriesByName(this.measureName, "measure");
                if (entriesForMeasurement.length > 0) {
                    var durationMs = entriesForMeasurement[0].duration;
                    window.performance.clearMeasures(this.measureName);
                    window.performance.clearMarks(this.startMark);
                    window.performance.clearMarks(this.endMark);
                    return durationMs;
                }
            }
            catch (e) {
                // Silently catch and return null
            }
        }
        return null;
    };
    return BrowserPerformanceMeasurement;
}());

export { BrowserPerformanceMeasurement };
//# sourceMappingURL=BrowserPerformanceMeasurement.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __awaiter, __generator } from '../_virtual/_tslib.js';
import { Constants } from '@azure/msal-common';
import { BrowserAuthError } from '../error/BrowserAuthError.js';
import { HTTP_REQUEST_TYPE } from '../utils/BrowserConstants.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * This class implements the Fetch API for GET and POST requests. See more here: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API
 */
var FetchClient = /** @class */ (function () {
    function FetchClient() {
    }
    /**
     * Fetch Client for REST endpoints - Get request
     * @param url
     * @param headers
     * @param body
     */
    FetchClient.prototype.sendGetRequestAsync = function (url, options) {
        return __awaiter(this, void 0, void 0, function () {
            var response, e_1, _a;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        _b.trys.push([0, 2, , 3]);
                        return [4 /*yield*/, fetch(url, {
                                method: HTTP_REQUEST_TYPE.GET,
                                headers: this.getFetchHeaders(options)
                            })];
                    case 1:
                        response = _b.sent();
                        return [3 /*break*/, 3];
                    case 2:
                        e_1 = _b.sent();
                        if (window.navigator.onLine) {
                            throw BrowserAuthError.createGetRequestFailedError(e_1, url);
                        }
                        else {
                            throw BrowserAuthError.createNoNetworkConnectivityError();
                        }
                    case 3:
                        _b.trys.push([3, 5, , 6]);
                        _a = {
                            headers: this.getHeaderDict(response.headers)
                        };
                        return [4 /*yield*/, response.json()];
                    case 4: return [2 /*return*/, (_a.body = (_b.sent()),
                            _a.status = response.status,
                            _a)];
                    case 5:
                        _b.sent();
                        throw BrowserAuthError.createFailedToParseNetworkResponseError(url);
                    case 6: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Fetch Client for REST endpoints - Post request
     * @param url
     * @param headers
     * @param body
     */
    FetchClient.prototype.sendPostRequestAsync = function (url, options) {
        return __awaiter(this, void 0, void 0, function () {
            var reqBody, response, e_3, _a;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        reqBody = (options && options.body) || Constants.EMPTY_STRING;
                        _b.label = 1;
                    case 1:
                        _b.trys.push([1, 3, , 4]);
                        return [4 /*yield*/, fetch(url, {
                                method: HTTP_REQUEST_TYPE.POST,
                                headers: this.getFetchHeaders(options),
                                body: reqBody
                            })];
                    case 2:
                        response = _b.sent();
                        return [3 /*break*/, 4];
                    case 3:
                        e_3 = _b.sent();
                        if (window.navigator.onLine) {
                            throw BrowserAuthError.createPostRequestFailedError(e_3, url);
                        }
                        else {
                            throw BrowserAuthError.createNoNetworkConnectivityError();
                        }
                    case 4:
                        _b.trys.push([4, 6, , 7]);
                        _a = {
                            headers: this.getHeaderDict(response.headers)
                        };
                        return [4 /*yield*/, response.json()];
                    case 5: return [2 /*return*/, (_a.body = (_b.sent()),
                            _a.status = response.status,
                            _a)];
                    case 6:
                        _b.sent();
                        throw BrowserAuthError.createFailedToParseNetworkResponseError(url);
                    case 7: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Get Fetch API Headers object from string map
     * @param inputHeaders
     */
    FetchClient.prototype.getFetchHeaders = function (options) {
        var headers = new Headers();
        if (!(options && options.headers)) {
            return headers;
        }
        var optionsHeaders = options.headers;
        Object.keys(optionsHeaders).forEach(function (key) {
            headers.append(key, optionsHeaders[key]);
        });
        return headers;
    };
    FetchClient.prototype.getHeaderDict = function (headers) {
        var headerDict = {};
        headers.forEach(function (value, key) {
            headerDict[key] = value;
        });
        return headerDict;
    };
    return FetchClient;
}());

export { FetchClient };
//# sourceMappingURL=FetchClient.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __awaiter, __generator } from '../_virtual/_tslib.js';
import { BrowserAuthError } from '../error/BrowserAuthError.js';
import { HTTP_REQUEST_TYPE } from '../utils/BrowserConstants.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * This client implements the XMLHttpRequest class to send GET and POST requests.
 */
var XhrClient = /** @class */ (function () {
    function XhrClient() {
    }
    /**
     * XhrClient for REST endpoints - Get request
     * @param url
     * @param headers
     * @param body
     */
    XhrClient.prototype.sendGetRequestAsync = function (url, options) {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                return [2 /*return*/, this.sendRequestAsync(url, HTTP_REQUEST_TYPE.GET, options)];
            });
        });
    };
    /**
     * XhrClient for REST endpoints - Post request
     * @param url
     * @param headers
     * @param body
     */
    XhrClient.prototype.sendPostRequestAsync = function (url, options) {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                return [2 /*return*/, this.sendRequestAsync(url, HTTP_REQUEST_TYPE.POST, options)];
            });
        });
    };
    /**
     * Helper for XhrClient requests.
     * @param url
     * @param method
     * @param options
     */
    XhrClient.prototype.sendRequestAsync = function (url, method, options) {
        var _this = this;
        return new Promise(function (resolve, reject) {
            var xhr = new XMLHttpRequest();
            xhr.open(method, url, /* async: */ true);
            _this.setXhrHeaders(xhr, options);
            xhr.onload = function () {
                if (xhr.status < 200 || xhr.status >= 300) {
                    if (method === HTTP_REQUEST_TYPE.POST) {
                        reject(BrowserAuthError.createPostRequestFailedError("Failed with status " + xhr.status, url));
                    }
                    else {
                        reject(BrowserAuthError.createGetRequestFailedError("Failed with status " + xhr.status, url));
                    }
                }
                try {
                    var jsonResponse = JSON.parse(xhr.responseText);
                    var networkResponse = {
                        headers: _this.getHeaderDict(xhr),
                        body: jsonResponse,
                        status: xhr.status
                    };
                    resolve(networkResponse);
                }
                catch (e) {
                    reject(BrowserAuthError.createFailedToParseNetworkResponseError(url));
                }
            };
            xhr.onerror = function () {
                if (window.navigator.onLine) {
                    if (method === HTTP_REQUEST_TYPE.POST) {
                        reject(BrowserAuthError.createPostRequestFailedError("Failed with status " + xhr.status, url));
                    }
                    else {
                        reject(BrowserAuthError.createGetRequestFailedError("Failed with status " + xhr.status, url));
                    }
                }
                else {
                    reject(BrowserAuthError.createNoNetworkConnectivityError());
                }
            };
            if (method === HTTP_REQUEST_TYPE.POST && options && options.body) {
                xhr.send(options.body);
            }
            else if (method === HTTP_REQUEST_TYPE.GET) {
                xhr.send();
            }
            else {
                throw BrowserAuthError.createHttpMethodNotImplementedError(method);
            }
        });
    };
    /**
     * Helper to set XHR headers for request.
     * @param xhr
     * @param options
     */
    XhrClient.prototype.setXhrHeaders = function (xhr, options) {
        if (options && options.headers) {
            var headers_1 = options.headers;
            Object.keys(headers_1).forEach(function (key) {
                xhr.setRequestHeader(key, headers_1[key]);
            });
        }
    };
    /**
     * Gets a string map of the headers received in the response.
     *
     * Algorithm comes from https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getAllResponseHeaders
     * @param xhr
     */
    XhrClient.prototype.getHeaderDict = function (xhr) {
        var headerString = xhr.getAllResponseHeaders();
        var headerArr = headerString.trim().split(/[\r\n]+/);
        var headerDict = {};
        headerArr.forEach(function (value) {
            var parts = value.split(": ");
            var headerName = parts.shift();
            var headerVal = parts.join(": ");
            if (headerName && headerVal) {
                headerDict[headerName] = headerVal;
            }
        });
        return headerDict;
    };
    return XhrClient;
}());

export { XhrClient };
//# sourceMappingURL=XhrClient.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var NavigationClient = /** @class */ (function () {
    function NavigationClient() {
    }
    /**
     * Navigates to other pages within the same web application
     * @param url
     * @param options
     */
    NavigationClient.prototype.navigateInternal = function (url, options) {
        return NavigationClient.defaultNavigateWindow(url, options);
    };
    /**
     * Navigates to other pages outside the web application i.e. the Identity Provider
     * @param url
     * @param options
     */
    NavigationClient.prototype.navigateExternal = function (url, options) {
        return NavigationClient.defaultNavigateWindow(url, options);
    };
    /**
     * Default navigation implementation invoked by the internal and external functions
     * @param url
     * @param options
     */
    NavigationClient.defaultNavigateWindow = function (url, options) {
        if (options.noHistory) {
            window.location.replace(url);
        }
        else {
            window.location.assign(url);
        }
        return new Promise(function (resolve) {
            setTimeout(function () {
                resolve(true);
            }, options.timeout);
        });
    };
    return NavigationClient;
}());

export { NavigationClient };
//# sourceMappingURL=NavigationClient.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __awaiter, __generator } from '../_virtual/_tslib.js';
import { StringUtils, ClientAuthError, ServerError, AuthorityFactory } from '@azure/msal-common';
import { BrowserAuthError, BrowserAuthErrorMessage } from '../error/BrowserAuthError.js';
import { TemporaryCacheKeys } from '../utils/BrowserConstants.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Abstract class which defines operations for a browser interaction handling class.
 */
var InteractionHandler = /** @class */ (function () {
    function InteractionHandler(authCodeModule, storageImpl, authCodeRequest, logger) {
        this.authModule = authCodeModule;
        this.browserStorage = storageImpl;
        this.authCodeRequest = authCodeRequest;
        this.logger = logger;
    }
    /**
     * Function to handle response parameters from hash.
     * @param locationHash
     */
    InteractionHandler.prototype.handleCodeResponseFromHash = function (locationHash, state, authority, networkModule) {
        return __awaiter(this, void 0, void 0, function () {
            var stateKey, requestState, authCodeResponse;
            return __generator(this, function (_a) {
                this.logger.verbose("InteractionHandler.handleCodeResponse called");
                // Check that location hash isn't empty.
                if (StringUtils.isEmpty(locationHash)) {
                    throw BrowserAuthError.createEmptyHashError(locationHash);
                }
                stateKey = this.browserStorage.generateStateKey(state);
                requestState = this.browserStorage.getTemporaryCache(stateKey);
                if (!requestState) {
                    throw ClientAuthError.createStateNotFoundError("Cached State");
                }
                try {
                    authCodeResponse = this.authModule.handleFragmentResponse(locationHash, requestState);
                }
                catch (e) {
                    if (e instanceof ServerError && e.subError === BrowserAuthErrorMessage.userCancelledError.code) {
                        // Translate server error caused by user closing native prompt to corresponding first class MSAL error
                        throw BrowserAuthError.createUserCancelledError();
                    }
                    else {
                        throw e;
                    }
                }
                return [2 /*return*/, this.handleCodeResponseFromServer(authCodeResponse, state, authority, networkModule)];
            });
        });
    };
    /**
     * Process auth code response from AAD
     * @param authCodeResponse
     * @param state
     * @param authority
     * @param networkModule
     * @returns
     */
    InteractionHandler.prototype.handleCodeResponseFromServer = function (authCodeResponse, state, authority, networkModule, validateNonce) {
        if (validateNonce === void 0) { validateNonce = true; }
        return __awaiter(this, void 0, void 0, function () {
            var stateKey, requestState, nonceKey, cachedNonce, cachedCcsCred, tokenResponse;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.trace("InteractionHandler.handleCodeResponseFromServer called");
                        stateKey = this.browserStorage.generateStateKey(state);
                        requestState = this.browserStorage.getTemporaryCache(stateKey);
                        if (!requestState) {
                            throw ClientAuthError.createStateNotFoundError("Cached State");
                        }
                        nonceKey = this.browserStorage.generateNonceKey(requestState);
                        cachedNonce = this.browserStorage.getTemporaryCache(nonceKey);
                        // Assign code to request
                        this.authCodeRequest.code = authCodeResponse.code;
                        if (!authCodeResponse.cloud_instance_host_name) return [3 /*break*/, 2];
                        return [4 /*yield*/, this.updateTokenEndpointAuthority(authCodeResponse.cloud_instance_host_name, authority, networkModule)];
                    case 1:
                        _a.sent();
                        _a.label = 2;
                    case 2:
                        // Nonce validation not needed when redirect not involved (e.g. hybrid spa, renewing token via rt)
                        if (validateNonce) {
                            authCodeResponse.nonce = cachedNonce || undefined;
                        }
                        authCodeResponse.state = requestState;
                        // Add CCS parameters if available
                        if (authCodeResponse.client_info) {
                            this.authCodeRequest.clientInfo = authCodeResponse.client_info;
                        }
                        else {
                            cachedCcsCred = this.checkCcsCredentials();
                            if (cachedCcsCred) {
                                this.authCodeRequest.ccsCredential = cachedCcsCred;
                            }
                        }
                        return [4 /*yield*/, this.authModule.acquireToken(this.authCodeRequest, authCodeResponse)];
                    case 3:
                        tokenResponse = _a.sent();
                        this.browserStorage.cleanRequestByState(state);
                        return [2 /*return*/, tokenResponse];
                }
            });
        });
    };
    /**
     * Updates authority based on cloudInstanceHostname
     * @param cloudInstanceHostname
     * @param authority
     * @param networkModule
     */
    InteractionHandler.prototype.updateTokenEndpointAuthority = function (cloudInstanceHostname, authority, networkModule) {
        return __awaiter(this, void 0, void 0, function () {
            var cloudInstanceAuthorityUri, cloudInstanceAuthority;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        cloudInstanceAuthorityUri = "https://" + cloudInstanceHostname + "/" + authority.tenant + "/";
                        return [4 /*yield*/, AuthorityFactory.createDiscoveredInstance(cloudInstanceAuthorityUri, networkModule, this.browserStorage, authority.options)];
                    case 1:
                        cloudInstanceAuthority = _a.sent();
                        this.authModule.updateAuthority(cloudInstanceAuthority);
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Looks up ccs creds in the cache
     */
    InteractionHandler.prototype.checkCcsCredentials = function () {
        // Look up ccs credential in temp cache
        var cachedCcsCred = this.browserStorage.getTemporaryCache(TemporaryCacheKeys.CCS_CREDENTIAL, true);
        if (cachedCcsCred) {
            try {
                return JSON.parse(cachedCcsCred);
            }
            catch (e) {
                this.authModule.logger.error("Cache credential could not be parsed");
                this.authModule.logger.errorPii("Cache credential could not be parsed: " + cachedCcsCred);
            }
        }
        return null;
    };
    return InteractionHandler;
}());

export { InteractionHandler };
//# sourceMappingURL=InteractionHandler.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __extends, __awaiter, __generator } from '../_virtual/_tslib.js';
import { StringUtils, ClientAuthError, ServerError } from '@azure/msal-common';
import { BrowserAuthError, BrowserAuthErrorMessage } from '../error/BrowserAuthError.js';
import { TemporaryCacheKeys, ApiId } from '../utils/BrowserConstants.js';
import { InteractionHandler } from './InteractionHandler.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var RedirectHandler = /** @class */ (function (_super) {
    __extends(RedirectHandler, _super);
    function RedirectHandler(authCodeModule, storageImpl, authCodeRequest, logger, browserCrypto) {
        var _this = _super.call(this, authCodeModule, storageImpl, authCodeRequest, logger) || this;
        _this.browserCrypto = browserCrypto;
        return _this;
    }
    /**
     * Redirects window to given URL.
     * @param urlNavigate
     */
    RedirectHandler.prototype.initiateAuthRequest = function (requestUrl, params) {
        return __awaiter(this, void 0, void 0, function () {
            var navigationOptions, navigate;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.verbose("RedirectHandler.initiateAuthRequest called");
                        if (!!StringUtils.isEmpty(requestUrl)) return [3 /*break*/, 7];
                        // Cache start page, returns to this page after redirectUri if navigateToLoginRequestUrl is true
                        if (params.redirectStartPage) {
                            this.logger.verbose("RedirectHandler.initiateAuthRequest: redirectStartPage set, caching start page");
                            this.browserStorage.setTemporaryCache(TemporaryCacheKeys.ORIGIN_URI, params.redirectStartPage, true);
                        }
                        // Set interaction status in the library.
                        this.browserStorage.setTemporaryCache(TemporaryCacheKeys.CORRELATION_ID, this.authCodeRequest.correlationId, true);
                        this.browserStorage.cacheCodeRequest(this.authCodeRequest, this.browserCrypto);
                        this.logger.infoPii("RedirectHandler.initiateAuthRequest: Navigate to: " + requestUrl);
                        navigationOptions = {
                            apiId: ApiId.acquireTokenRedirect,
                            timeout: params.redirectTimeout,
                            noHistory: false
                        };
                        if (!(typeof params.onRedirectNavigate === "function")) return [3 /*break*/, 4];
                        this.logger.verbose("RedirectHandler.initiateAuthRequest: Invoking onRedirectNavigate callback");
                        navigate = params.onRedirectNavigate(requestUrl);
                        if (!(navigate !== false)) return [3 /*break*/, 2];
                        this.logger.verbose("RedirectHandler.initiateAuthRequest: onRedirectNavigate did not return false, navigating");
                        return [4 /*yield*/, params.navigationClient.navigateExternal(requestUrl, navigationOptions)];
                    case 1:
                        _a.sent();
                        return [2 /*return*/];
                    case 2:
                        this.logger.verbose("RedirectHandler.initiateAuthRequest: onRedirectNavigate returned false, stopping navigation");
                        return [2 /*return*/];
                    case 3: return [3 /*break*/, 6];
                    case 4:
                        // Navigate window to request URL
                        this.logger.verbose("RedirectHandler.initiateAuthRequest: Navigating window to navigate url");
                        return [4 /*yield*/, params.navigationClient.navigateExternal(requestUrl, navigationOptions)];
                    case 5:
                        _a.sent();
                        return [2 /*return*/];
                    case 6: return [3 /*break*/, 8];
                    case 7:
                        // Throw error if request URL is empty.
                        this.logger.info("RedirectHandler.initiateAuthRequest: Navigate url is empty");
                        throw BrowserAuthError.createEmptyNavigationUriError();
                    case 8: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Handle authorization code response in the window.
     * @param hash
     */
    RedirectHandler.prototype.handleCodeResponseFromHash = function (locationHash, state, authority, networkModule) {
        return __awaiter(this, void 0, void 0, function () {
            var stateKey, requestState, authCodeResponse, nonceKey, cachedNonce, cachedCcsCred, tokenResponse;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.verbose("RedirectHandler.handleCodeResponse called");
                        // Check that location hash isn't empty.
                        if (StringUtils.isEmpty(locationHash)) {
                            throw BrowserAuthError.createEmptyHashError(locationHash);
                        }
                        // Interaction is completed - remove interaction status.
                        this.browserStorage.setInteractionInProgress(false);
                        stateKey = this.browserStorage.generateStateKey(state);
                        requestState = this.browserStorage.getTemporaryCache(stateKey);
                        if (!requestState) {
                            throw ClientAuthError.createStateNotFoundError("Cached State");
                        }
                        try {
                            authCodeResponse = this.authModule.handleFragmentResponse(locationHash, requestState);
                        }
                        catch (e) {
                            if (e instanceof ServerError && e.subError === BrowserAuthErrorMessage.userCancelledError.code) {
                                // Translate server error caused by user closing native prompt to corresponding first class MSAL error
                                throw BrowserAuthError.createUserCancelledError();
                            }
                            else {
                                throw e;
                            }
                        }
                        nonceKey = this.browserStorage.generateNonceKey(requestState);
                        cachedNonce = this.browserStorage.getTemporaryCache(nonceKey);
                        // Assign code to request
                        this.authCodeRequest.code = authCodeResponse.code;
                        if (!authCodeResponse.cloud_instance_host_name) return [3 /*break*/, 2];
                        return [4 /*yield*/, this.updateTokenEndpointAuthority(authCodeResponse.cloud_instance_host_name, authority, networkModule)];
                    case 1:
                        _a.sent();
                        _a.label = 2;
                    case 2:
                        authCodeResponse.nonce = cachedNonce || undefined;
                        authCodeResponse.state = requestState;
                        // Add CCS parameters if available
                        if (authCodeResponse.client_info) {
                            this.authCodeRequest.clientInfo = authCodeResponse.client_info;
                        }
                        else {
                            cachedCcsCred = this.checkCcsCredentials();
                            if (cachedCcsCred) {
                                this.authCodeRequest.ccsCredential = cachedCcsCred;
                            }
                        }
                        return [4 /*yield*/, this.authModule.acquireToken(this.authCodeRequest, authCodeResponse)];
                    case 3:
                        tokenResponse = _a.sent();
                        this.browserStorage.cleanRequestByState(state);
                        return [2 /*return*/, tokenResponse];
                }
            });
        });
    };
    return RedirectHandler;
}(InteractionHandler));

export { RedirectHandler };
//# sourceMappingURL=RedirectHandler.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __extends, __awaiter, __generator } from '../_virtual/_tslib.js';
import { StringUtils, Constants, UrlString } from '@azure/msal-common';
import { InteractionHandler } from './InteractionHandler.js';
import { BrowserConstants } from '../utils/BrowserConstants.js';
import { BrowserAuthError } from '../error/BrowserAuthError.js';
import { DEFAULT_IFRAME_TIMEOUT_MS } from '../config/Configuration.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var SilentHandler = /** @class */ (function (_super) {
    __extends(SilentHandler, _super);
    function SilentHandler(authCodeModule, storageImpl, authCodeRequest, logger, navigateFrameWait) {
        var _this = _super.call(this, authCodeModule, storageImpl, authCodeRequest, logger) || this;
        _this.navigateFrameWait = navigateFrameWait;
        return _this;
    }
    /**
     * Creates a hidden iframe to given URL using user-requested scopes as an id.
     * @param urlNavigate
     * @param userRequestScopes
     */
    SilentHandler.prototype.initiateAuthRequest = function (requestUrl) {
        return __awaiter(this, void 0, void 0, function () {
            var _a;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        if (StringUtils.isEmpty(requestUrl)) {
                            // Throw error if request URL is empty.
                            this.logger.info("Navigate url is empty");
                            throw BrowserAuthError.createEmptyNavigationUriError();
                        }
                        if (!this.navigateFrameWait) return [3 /*break*/, 2];
                        return [4 /*yield*/, this.loadFrame(requestUrl)];
                    case 1:
                        _a = _b.sent();
                        return [3 /*break*/, 3];
                    case 2:
                        _a = this.loadFrameSync(requestUrl);
                        _b.label = 3;
                    case 3: return [2 /*return*/, _a];
                }
            });
        });
    };
    /**
     * Monitors an iframe content window until it loads a url with a known hash, or hits a specified timeout.
     * @param iframe
     * @param timeout
     */
    SilentHandler.prototype.monitorIframeForHash = function (iframe, timeout) {
        var _this = this;
        return new Promise(function (resolve, reject) {
            if (timeout < DEFAULT_IFRAME_TIMEOUT_MS) {
                _this.logger.warning("system.loadFrameTimeout or system.iframeHashTimeout set to lower (" + timeout + "ms) than the default (" + DEFAULT_IFRAME_TIMEOUT_MS + "ms). This may result in timeouts.");
            }
            /*
             * Polling for iframes can be purely timing based,
             * since we don't need to account for interaction.
             */
            var nowMark = window.performance.now();
            var timeoutMark = nowMark + timeout;
            var intervalId = setInterval(function () {
                if (window.performance.now() > timeoutMark) {
                    _this.removeHiddenIframe(iframe);
                    clearInterval(intervalId);
                    reject(BrowserAuthError.createMonitorIframeTimeoutError());
                    return;
                }
                var href = Constants.EMPTY_STRING;
                var contentWindow = iframe.contentWindow;
                try {
                    /*
                     * Will throw if cross origin,
                     * which should be caught and ignored
                     * since we need the interval to keep running while on STS UI.
                     */
                    href = contentWindow ? contentWindow.location.href : Constants.EMPTY_STRING;
                }
                catch (e) { }
                if (StringUtils.isEmpty(href)) {
                    return;
                }
                var contentHash = contentWindow ? contentWindow.location.hash : Constants.EMPTY_STRING;
                if (UrlString.hashContainsKnownProperties(contentHash)) {
                    // Success case
                    _this.removeHiddenIframe(iframe);
                    clearInterval(intervalId);
                    resolve(contentHash);
                    return;
                }
            }, BrowserConstants.POLL_INTERVAL_MS);
        });
    };
    /**
     * @hidden
     * Loads iframe with authorization endpoint URL
     * @ignore
     */
    SilentHandler.prototype.loadFrame = function (urlNavigate) {
        /*
         * This trick overcomes iframe navigation in IE
         * IE does not load the page consistently in iframe
         */
        var _this = this;
        return new Promise(function (resolve, reject) {
            var frameHandle = _this.createHiddenIframe();
            setTimeout(function () {
                if (!frameHandle) {
                    reject("Unable to load iframe");
                    return;
                }
                frameHandle.src = urlNavigate;
                resolve(frameHandle);
            }, _this.navigateFrameWait);
        });
    };
    /**
     * @hidden
     * Loads the iframe synchronously when the navigateTimeFrame is set to `0`
     * @param urlNavigate
     * @param frameName
     * @param logger
     */
    SilentHandler.prototype.loadFrameSync = function (urlNavigate) {
        var frameHandle = this.createHiddenIframe();
        frameHandle.src = urlNavigate;
        return frameHandle;
    };
    /**
     * @hidden
     * Creates a new hidden iframe or gets an existing one for silent token renewal.
     * @ignore
     */
    SilentHandler.prototype.createHiddenIframe = function () {
        var authFrame = document.createElement("iframe");
        authFrame.style.visibility = "hidden";
        authFrame.style.position = "absolute";
        authFrame.style.width = authFrame.style.height = "0";
        authFrame.style.border = "0";
        authFrame.setAttribute("sandbox", "allow-scripts allow-same-origin allow-forms");
        document.getElementsByTagName("body")[0].appendChild(authFrame);
        return authFrame;
    };
    /**
     * @hidden
     * Removes a hidden iframe from the page.
     * @ignore
     */
    SilentHandler.prototype.removeHiddenIframe = function (iframe) {
        if (document.body === iframe.parentNode) {
            document.body.removeChild(iframe);
        }
    };
    return SilentHandler;
}(InteractionHandler));

export { SilentHandler };
//# sourceMappingURL=SilentHandler.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __awaiter, __generator, __spread, __assign } from '../_virtual/_tslib.js';
import { AccountEntity, AuthenticationScheme, ClientConfigurationError, StringUtils, UrlString, ServerTelemetryManager, AuthorityFactory } from '@azure/msal-common';
import { version } from '../packageMetadata.js';
import { BrowserConstants } from '../utils/BrowserConstants.js';
import { BrowserUtils } from '../utils/BrowserUtils.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var BaseInteractionClient = /** @class */ (function () {
    function BaseInteractionClient(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeMessageHandler, correlationId) {
        this.config = config;
        this.browserStorage = storageImpl;
        this.browserCrypto = browserCrypto;
        this.networkClient = this.config.system.networkClient;
        this.eventHandler = eventHandler;
        this.navigationClient = navigationClient;
        this.nativeMessageHandler = nativeMessageHandler;
        this.correlationId = correlationId || this.browserCrypto.createNewGuid();
        this.logger = logger.clone(BrowserConstants.MSAL_SKU, version, this.correlationId);
        this.performanceClient = performanceClient;
    }
    BaseInteractionClient.prototype.clearCacheOnLogout = function (account) {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        if (!account) return [3 /*break*/, 5];
                        if (AccountEntity.accountInfoIsEqual(account, this.browserStorage.getActiveAccount(), false)) {
                            this.logger.verbose("Setting active account to null");
                            this.browserStorage.setActiveAccount(null);
                        }
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        return [4 /*yield*/, this.browserStorage.removeAccount(AccountEntity.generateAccountCacheKey(account))];
                    case 2:
                        _a.sent();
                        this.logger.verbose("Cleared cache items belonging to the account provided in the logout request.");
                        return [3 /*break*/, 4];
                    case 3:
                        _a.sent();
                        this.logger.error("Account provided in logout request was not found. Local cache unchanged.");
                        return [3 /*break*/, 4];
                    case 4: return [3 /*break*/, 9];
                    case 5:
                        _a.trys.push([5, 8, , 9]);
                        this.logger.verbose("No account provided in logout request, clearing all cache items.", this.correlationId);
                        // Clear all accounts and tokens
                        return [4 /*yield*/, this.browserStorage.clear()];
                    case 6:
                        // Clear all accounts and tokens
                        _a.sent();
                        // Clear any stray keys from IndexedDB
                        return [4 /*yield*/, this.browserCrypto.clearKeystore()];
                    case 7:
                        // Clear any stray keys from IndexedDB
                        _a.sent();
                        return [3 /*break*/, 9];
                    case 8:
                        _a.sent();
                        this.logger.error("Attempted to clear all MSAL cache items and failed. Local cache unchanged.");
                        return [3 /*break*/, 9];
                    case 9: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Initializer function for all request APIs
     * @param request
     */
    BaseInteractionClient.prototype.initializeBaseRequest = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var authority, scopes, validatedRequest, _a;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        this.logger.verbose("Initializing BaseAuthRequest");
                        authority = request.authority || this.config.auth.authority;
                        scopes = __spread(((request && request.scopes) || []));
                        validatedRequest = __assign(__assign({}, request), { correlationId: this.correlationId, authority: authority,
                            scopes: scopes });
                        // Set authenticationScheme to BEARER if not explicitly set in the request
                        if (!validatedRequest.authenticationScheme) {
                            validatedRequest.authenticationScheme = AuthenticationScheme.BEARER;
                            this.logger.verbose("Authentication Scheme wasn't explicitly set in request, defaulting to \"Bearer\" request");
                        }
                        else {
                            if (validatedRequest.authenticationScheme === AuthenticationScheme.SSH) {
                                if (!request.sshJwk) {
                                    throw ClientConfigurationError.createMissingSshJwkError();
                                }
                                if (!request.sshKid) {
                                    throw ClientConfigurationError.createMissingSshKidError();
                                }
                            }
                            this.logger.verbose("Authentication Scheme set to \"" + validatedRequest.authenticationScheme + "\" as configured in Auth request");
                        }
                        if (!(request.claims && !StringUtils.isEmpty(request.claims))) return [3 /*break*/, 2];
                        _a = validatedRequest;
                        return [4 /*yield*/, this.browserCrypto.hashString(request.claims)];
                    case 1:
                        _a.requestedClaimsHash = _b.sent();
                        _b.label = 2;
                    case 2: return [2 /*return*/, validatedRequest];
                }
            });
        });
    };
    /**
     *
     * Use to get the redirect uri configured in MSAL or null.
     * @param requestRedirectUri
     * @returns Redirect URL
     *
     */
    BaseInteractionClient.prototype.getRedirectUri = function (requestRedirectUri) {
        this.logger.verbose("getRedirectUri called");
        var redirectUri = requestRedirectUri || this.config.auth.redirectUri || BrowserUtils.getCurrentUri();
        return UrlString.getAbsoluteUrl(redirectUri, BrowserUtils.getCurrentUri());
    };
    /**
     *
     * @param apiId
     * @param correlationId
     * @param forceRefresh
     */
    BaseInteractionClient.prototype.initializeServerTelemetryManager = function (apiId, forceRefresh) {
        this.logger.verbose("initializeServerTelemetryManager called");
        var telemetryPayload = {
            clientId: this.config.auth.clientId,
            correlationId: this.correlationId,
            apiId: apiId,
            forceRefresh: forceRefresh || false,
            wrapperSKU: this.browserStorage.getWrapperMetadata()[0],
            wrapperVer: this.browserStorage.getWrapperMetadata()[1]
        };
        return new ServerTelemetryManager(telemetryPayload, this.browserStorage);
    };
    /**
     * Used to get a discovered version of the default authority.
     * @param requestAuthority
     * @param requestCorrelationId
     */
    BaseInteractionClient.prototype.getDiscoveredAuthority = function (requestAuthority) {
        return __awaiter(this, void 0, void 0, function () {
            var authorityOptions;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.verbose("getDiscoveredAuthority called");
                        authorityOptions = {
                            protocolMode: this.config.auth.protocolMode,
                            knownAuthorities: this.config.auth.knownAuthorities,
                            cloudDiscoveryMetadata: this.config.auth.cloudDiscoveryMetadata,
                            authorityMetadata: this.config.auth.authorityMetadata
                        };
                        if (!requestAuthority) return [3 /*break*/, 2];
                        this.logger.verbose("Creating discovered authority with request authority");
                        return [4 /*yield*/, AuthorityFactory.createDiscoveredInstance(requestAuthority, this.config.system.networkClient, this.browserStorage, authorityOptions)];
                    case 1: return [2 /*return*/, _a.sent()];
                    case 2:
                        this.logger.verbose("Creating discovered authority with configured authority");
                        return [4 /*yield*/, AuthorityFactory.createDiscoveredInstance(this.config.auth.authority, this.config.system.networkClient, this.browserStorage, authorityOptions)];
                    case 3: return [2 /*return*/, _a.sent()];
                }
            });
        });
    };
    return BaseInteractionClient;
}());

export { BaseInteractionClient };
//# sourceMappingURL=BaseInteractionClient.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __extends } from '../_virtual/_tslib.js';
import { AuthorizationCodeClient } from '@azure/msal-common';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var HybridSpaAuthorizationCodeClient = /** @class */ (function (_super) {
    __extends(HybridSpaAuthorizationCodeClient, _super);
    function HybridSpaAuthorizationCodeClient(config) {
        var _this = _super.call(this, config) || this;
        _this.includeRedirectUri = false;
        return _this;
    }
    return HybridSpaAuthorizationCodeClient;
}(AuthorizationCodeClient));

export { HybridSpaAuthorizationCodeClient };
//# sourceMappingURL=HybridSpaAuthorizationCodeClient.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __extends, __awaiter, __generator, __rest, __assign } from '../_virtual/_tslib.js';
import { PerformanceEvents, TimeUtils, ScopeSet, ClientAuthError, IdTokenEntity, Constants, AccessTokenEntity, AuthenticationScheme, PopTokenGenerator, AccountEntity, AuthorityType, AuthToken, UrlString, OIDC_DEFAULT_SCOPES, PromptValue } from '@azure/msal-common';
import { BaseInteractionClient } from './BaseInteractionClient.js';
import { TemporaryCacheKeys, NativeExtensionMethod, NativeConstants, ApiId } from '../utils/BrowserConstants.js';
import { NativeAuthError } from '../error/NativeAuthError.js';
import { BrowserAuthError } from '../error/BrowserAuthError.js';
import { SilentCacheClient } from './SilentCacheClient.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var NativeInteractionClient = /** @class */ (function (_super) {
    __extends(NativeInteractionClient, _super);
    function NativeInteractionClient(config, browserStorage, browserCrypto, logger, eventHandler, navigationClient, apiId, performanceClient, provider, accountId, nativeStorageImpl, correlationId) {
        var _this = _super.call(this, config, browserStorage, browserCrypto, logger, eventHandler, navigationClient, performanceClient, provider, correlationId) || this;
        _this.apiId = apiId;
        _this.accountId = accountId;
        _this.nativeMessageHandler = provider;
        _this.nativeStorageManager = nativeStorageImpl;
        _this.silentCacheClient = new SilentCacheClient(config, _this.nativeStorageManager, browserCrypto, logger, eventHandler, navigationClient, performanceClient, provider, correlationId);
        return _this;
    }
    /**
     * Acquire token from native platform via browser extension
     * @param request
     */
    NativeInteractionClient.prototype.acquireToken = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var nativeATMeasurement, reqTimestamp, nativeRequest, result, messageBody, response, validatedResponse;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.trace("NativeInteractionClient - acquireToken called.");
                        nativeATMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.NativeInteractionClientAcquireToken, request.correlationId);
                        reqTimestamp = TimeUtils.nowSeconds();
                        return [4 /*yield*/, this.initializeNativeRequest(request)];
                    case 1:
                        nativeRequest = _a.sent();
                        _a.label = 2;
                    case 2:
                        _a.trys.push([2, 4, , 5]);
                        return [4 /*yield*/, this.acquireTokensFromCache(this.accountId, nativeRequest)];
                    case 3:
                        result = _a.sent();
                        nativeATMeasurement.endMeasurement({
                            success: true,
                            isNativeBroker: true,
                            fromCache: true
                        });
                        return [2 /*return*/, result];
                    case 4:
                        _a.sent();
                        // continue with a native call for any and all errors
                        this.logger.info("MSAL internal Cache does not contain tokens, proceed to make a native call");
                        return [3 /*break*/, 5];
                    case 5:
                        messageBody = {
                            method: NativeExtensionMethod.GetToken,
                            request: nativeRequest
                        };
                        return [4 /*yield*/, this.nativeMessageHandler.sendMessage(messageBody)];
                    case 6:
                        response = _a.sent();
                        validatedResponse = this.validateNativeResponse(response);
                        return [2 /*return*/, this.handleNativeResponse(validatedResponse, nativeRequest, reqTimestamp)
                                .then(function (result) {
                                nativeATMeasurement.endMeasurement({
                                    success: true,
                                    isNativeBroker: true
                                });
                                return result;
                            })
                                .catch(function (error) {
                                nativeATMeasurement.endMeasurement({
                                    success: false,
                                    errorCode: error.errorCode,
                                    subErrorCode: error.subError,
                                    isNativeBroker: true
                                });
                                throw error;
                            })];
                }
            });
        });
    };
    /**
     * Creates silent flow request
     * @param request
     * @param cachedAccount
     * @returns CommonSilentFlowRequest
     */
    NativeInteractionClient.prototype.createSilentCacheRequest = function (request, cachedAccount) {
        return {
            authority: request.authority,
            correlationId: this.correlationId,
            scopes: ScopeSet.fromString(request.scope).asArray(),
            account: cachedAccount,
            forceRefresh: false,
        };
    };
    /**
     * Fetches the tokens from the cache if un-expired
     * @param nativeAccountId
     * @param request
     * @returns authenticationResult
     */
    NativeInteractionClient.prototype.acquireTokensFromCache = function (nativeAccountId, request) {
        return __awaiter(this, void 0, void 0, function () {
            var accountEntity, account, silentRequest, result, e_2;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        accountEntity = this.browserStorage.readAccountFromCacheWithNativeAccountId(nativeAccountId);
                        if (!accountEntity) {
                            throw ClientAuthError.createNoAccountFoundError();
                        }
                        account = accountEntity.getAccountInfo();
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        silentRequest = this.createSilentCacheRequest(request, account);
                        return [4 /*yield*/, this.silentCacheClient.acquireToken(silentRequest)];
                    case 2:
                        result = _a.sent();
                        return [2 /*return*/, result];
                    case 3:
                        e_2 = _a.sent();
                        throw e_2;
                    case 4: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Acquires a token from native platform then redirects to the redirectUri instead of returning the response
     * @param request
     */
    NativeInteractionClient.prototype.acquireTokenRedirect = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var nativeRequest, messageBody, response, e_3, navigationOptions, redirectUri;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.trace("NativeInteractionClient - acquireTokenRedirect called.");
                        return [4 /*yield*/, this.initializeNativeRequest(request)];
                    case 1:
                        nativeRequest = _a.sent();
                        messageBody = {
                            method: NativeExtensionMethod.GetToken,
                            request: nativeRequest
                        };
                        _a.label = 2;
                    case 2:
                        _a.trys.push([2, 4, , 5]);
                        return [4 /*yield*/, this.nativeMessageHandler.sendMessage(messageBody)];
                    case 3:
                        response = _a.sent();
                        this.validateNativeResponse(response);
                        return [3 /*break*/, 5];
                    case 4:
                        e_3 = _a.sent();
                        // Only throw fatal errors here to allow application to fallback to regular redirect. Otherwise proceed and the error will be thrown in handleRedirectPromise
                        if (e_3 instanceof NativeAuthError && e_3.isFatal()) {
                            throw e_3;
                        }
                        return [3 /*break*/, 5];
                    case 5:
                        this.browserStorage.setTemporaryCache(TemporaryCacheKeys.NATIVE_REQUEST, JSON.stringify(nativeRequest), true);
                        navigationOptions = {
                            apiId: ApiId.acquireTokenRedirect,
                            timeout: this.config.system.redirectNavigationTimeout,
                            noHistory: false
                        };
                        redirectUri = this.config.auth.navigateToLoginRequestUrl ? window.location.href : this.getRedirectUri(request.redirectUri);
                        return [4 /*yield*/, this.navigationClient.navigateExternal(redirectUri, navigationOptions)];
                    case 6:
                        _a.sent(); // Need to treat this as external to ensure handleRedirectPromise is run again
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * If the previous page called native platform for a token using redirect APIs, send the same request again and return the response
     */
    NativeInteractionClient.prototype.handleRedirectPromise = function () {
        return __awaiter(this, void 0, void 0, function () {
            var cachedRequest, messageBody, reqTimestamp, response, result, e_4;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.trace("NativeInteractionClient - handleRedirectPromise called.");
                        if (!this.browserStorage.isInteractionInProgress(true)) {
                            this.logger.info("handleRedirectPromise called but there is no interaction in progress, returning null.");
                            return [2 /*return*/, null];
                        }
                        cachedRequest = this.browserStorage.getCachedNativeRequest();
                        if (!cachedRequest) {
                            this.logger.verbose("NativeInteractionClient - handleRedirectPromise called but there is no cached request, returning null.");
                            return [2 /*return*/, null];
                        }
                        this.browserStorage.removeItem(this.browserStorage.generateCacheKey(TemporaryCacheKeys.NATIVE_REQUEST));
                        messageBody = {
                            method: NativeExtensionMethod.GetToken,
                            request: cachedRequest
                        };
                        reqTimestamp = TimeUtils.nowSeconds();
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        this.logger.verbose("NativeInteractionClient - handleRedirectPromise sending message to native broker.");
                        return [4 /*yield*/, this.nativeMessageHandler.sendMessage(messageBody)];
                    case 2:
                        response = _a.sent();
                        this.validateNativeResponse(response);
                        result = this.handleNativeResponse(response, cachedRequest, reqTimestamp);
                        this.browserStorage.setInteractionInProgress(false);
                        return [2 /*return*/, result];
                    case 3:
                        e_4 = _a.sent();
                        this.browserStorage.setInteractionInProgress(false);
                        throw e_4;
                    case 4: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Logout from native platform via browser extension
     * @param request
     */
    NativeInteractionClient.prototype.logout = function () {
        this.logger.trace("NativeInteractionClient - logout called.");
        return Promise.reject("Logout not implemented yet");
    };
    /**
     * Transform response from native platform into AuthenticationResult object which will be returned to the end user
     * @param response
     * @param request
     * @param reqTimestamp
     */
    NativeInteractionClient.prototype.handleNativeResponse = function (response, request, reqTimestamp) {
        return __awaiter(this, void 0, void 0, function () {
            var idTokenObj, authority, authorityPreferredCache, homeAccountIdentifier, accountEntity, responseScopes, accountProperties, uid, tid, responseAccessToken, responseTokenType, _a, popTokenGenerator, shrParameters, mats, result, idTokenEntity, expiresIn, tokenExpirationSeconds, accessTokenEntity;
            var _this = this;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        this.logger.trace("NativeInteractionClient - handleNativeResponse called.");
                        if (response.account.id !== request.accountId) {
                            // User switch in native broker prompt is not supported. All users must first sign in through web flow to ensure server state is in sync
                            throw NativeAuthError.createUserSwitchError();
                        }
                        idTokenObj = new AuthToken(response.id_token || Constants.EMPTY_STRING, this.browserCrypto);
                        return [4 /*yield*/, this.getDiscoveredAuthority(request.authority)];
                    case 1:
                        authority = _b.sent();
                        authorityPreferredCache = authority.getPreferredCache();
                        homeAccountIdentifier = AccountEntity.generateHomeAccountId(response.client_info || Constants.EMPTY_STRING, AuthorityType.Default, this.logger, this.browserCrypto, idTokenObj);
                        accountEntity = AccountEntity.createAccount(response.client_info, homeAccountIdentifier, idTokenObj, undefined, undefined, undefined, authorityPreferredCache, response.account.id);
                        this.browserStorage.setAccount(accountEntity);
                        responseScopes = response.scope ? ScopeSet.fromString(response.scope) : ScopeSet.fromString(request.scope);
                        accountProperties = response.account.properties || {};
                        uid = accountProperties["UID"] || idTokenObj.claims.oid || idTokenObj.claims.sub || Constants.EMPTY_STRING;
                        tid = accountProperties["TenantId"] || idTokenObj.claims.tid || Constants.EMPTY_STRING;
                        responseTokenType = AuthenticationScheme.BEARER;
                        _a = request.tokenType;
                        switch (_a) {
                            case AuthenticationScheme.POP: return [3 /*break*/, 2];
                        }
                        return [3 /*break*/, 4];
                    case 2:
                        // Set the token type to POP in the response
                        responseTokenType = AuthenticationScheme.POP;
                        // Check if native layer returned an SHR token
                        if (response.shr) {
                            this.logger.trace("handleNativeServerResponse: SHR is enabled in native layer");
                            responseAccessToken = response.shr;
                            return [3 /*break*/, 5];
                        }
                        popTokenGenerator = new PopTokenGenerator(this.browserCrypto);
                        shrParameters = {
                            resourceRequestMethod: request.resourceRequestMethod,
                            resourceRequestUri: request.resourceRequestUri,
                            shrClaims: request.shrClaims,
                            shrNonce: request.shrNonce
                        };
                        /**
                         * KeyID must be present in the native request from when the PoP key was generated in order for
                         * PopTokenGenerator to query the full key for signing
                         */
                        if (!request.keyId) {
                            throw ClientAuthError.createKeyIdMissingError();
                        }
                        return [4 /*yield*/, popTokenGenerator.signPopToken(response.access_token, request.keyId, shrParameters)];
                    case 3:
                        responseAccessToken = _b.sent();
                        return [3 /*break*/, 5];
                    case 4:
                        {
                            responseAccessToken = response.access_token;
                        }
                        _b.label = 5;
                    case 5:
                        mats = this.getMATSFromResponse(response);
                        result = {
                            authority: authority.canonicalAuthority,
                            uniqueId: uid,
                            tenantId: tid,
                            scopes: responseScopes.asArray(),
                            account: accountEntity.getAccountInfo(),
                            idToken: response.id_token,
                            idTokenClaims: idTokenObj.claims,
                            accessToken: responseAccessToken,
                            fromCache: mats ? this.isResponseFromCache(mats) : false,
                            expiresOn: new Date(Number(reqTimestamp + response.expires_in) * 1000),
                            tokenType: responseTokenType,
                            correlationId: this.correlationId,
                            state: response.state,
                            fromNativeBroker: true
                        };
                        idTokenEntity = IdTokenEntity.createIdTokenEntity(homeAccountIdentifier, request.authority, response.id_token || Constants.EMPTY_STRING, request.clientId, idTokenObj.claims.tid || Constants.EMPTY_STRING);
                        this.nativeStorageManager.setIdTokenCredential(idTokenEntity);
                        expiresIn = (responseTokenType === AuthenticationScheme.POP)
                            ? Constants.SHR_NONCE_VALIDITY
                            : (typeof response.expires_in === "string"
                                ? parseInt(response.expires_in, 10)
                                : response.expires_in) || 0;
                        tokenExpirationSeconds = reqTimestamp + expiresIn;
                        accessTokenEntity = AccessTokenEntity.createAccessTokenEntity(homeAccountIdentifier, request.authority, responseAccessToken, request.clientId, tid, responseScopes.printScopes(), tokenExpirationSeconds, 0, this.browserCrypto);
                        this.nativeStorageManager.setAccessTokenCredential(accessTokenEntity);
                        // Remove any existing cached tokens for this account in browser storage
                        this.browserStorage.removeAccountContext(accountEntity).catch(function (e) {
                            _this.logger.error("Error occurred while removing account context from browser storage. " + e);
                        });
                        return [2 /*return*/, result];
                }
            });
        });
    };
    /**
     * Validates native platform response before processing
     * @param response
     */
    NativeInteractionClient.prototype.validateNativeResponse = function (response) {
        if (response.hasOwnProperty("access_token") &&
            response.hasOwnProperty("id_token") &&
            response.hasOwnProperty("client_info") &&
            response.hasOwnProperty("account") &&
            response.hasOwnProperty("scope") &&
            response.hasOwnProperty("expires_in")) {
            return response;
        }
        else {
            throw NativeAuthError.createUnexpectedError("Response missing expected properties.");
        }
    };
    /**
     * Gets MATS telemetry from native response
     * @param response
     * @returns
     */
    NativeInteractionClient.prototype.getMATSFromResponse = function (response) {
        if (response.properties.MATS) {
            try {
                return JSON.parse(response.properties.MATS);
            }
            catch (e) {
                this.logger.error("NativeInteractionClient - Error parsing MATS telemetry, returning null instead");
            }
        }
        return null;
    };
    /**
     * Returns whether or not response came from native cache
     * @param response
     * @returns
     */
    NativeInteractionClient.prototype.isResponseFromCache = function (mats) {
        if (typeof mats.is_cached === "undefined") {
            this.logger.verbose("NativeInteractionClient - MATS telemetry does not contain field indicating if response was served from cache. Returning false.");
            return false;
        }
        return !!mats.is_cached;
    };
    /**
     * Translates developer provided request object into NativeRequest object
     * @param request
     */
    NativeInteractionClient.prototype.initializeNativeRequest = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var authority, canonicalAuthority, scopes, remainingProperties, scopeSet, getPrompt, validatedRequest, shrParameters, popTokenGenerator, reqCnfData;
            var _this = this;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.trace("NativeInteractionClient - initializeNativeRequest called");
                        authority = request.authority || this.config.auth.authority;
                        canonicalAuthority = new UrlString(authority);
                        canonicalAuthority.validateAsUri();
                        scopes = request.scopes, remainingProperties = __rest(request, ["scopes"]);
                        scopeSet = new ScopeSet(scopes || []);
                        scopeSet.appendScopes(OIDC_DEFAULT_SCOPES);
                        getPrompt = function () {
                            // If request is silent, prompt is always none
                            switch (_this.apiId) {
                                case ApiId.ssoSilent:
                                case ApiId.acquireTokenSilent_silentFlow:
                                    _this.logger.trace("initializeNativeRequest: silent request sets prompt to none");
                                    return PromptValue.NONE;
                            }
                            // Prompt not provided, request may proceed and native broker decides if it needs to prompt
                            if (!request.prompt) {
                                _this.logger.trace("initializeNativeRequest: prompt was not provided");
                                return undefined;
                            }
                            // If request is interactive, check if prompt provided is allowed to go directly to native broker
                            switch (request.prompt) {
                                case PromptValue.NONE:
                                case PromptValue.CONSENT:
                                case PromptValue.LOGIN:
                                    _this.logger.trace("initializeNativeRequest: prompt is compatible with native flow");
                                    return request.prompt;
                                default:
                                    _this.logger.trace("initializeNativeRequest: prompt = " + request.prompt + " is not compatible with native flow");
                                    throw BrowserAuthError.createNativePromptParameterNotSupportedError();
                            }
                        };
                        validatedRequest = __assign(__assign({}, remainingProperties), { accountId: this.accountId, clientId: this.config.auth.clientId, authority: canonicalAuthority.urlString, scope: scopeSet.printScopes(), redirectUri: this.getRedirectUri(request.redirectUri), prompt: getPrompt(), correlationId: this.correlationId, tokenType: request.authenticationScheme, windowTitleSubstring: document.title, extraParameters: __assign(__assign(__assign({}, request.extraQueryParameters), request.tokenQueryParameters), { telemetry: NativeConstants.MATS_TELEMETRY }), extendedExpiryToken: false // Make this configurable?
                         });
                        if (!(request.authenticationScheme === AuthenticationScheme.POP)) return [3 /*break*/, 2];
                        shrParameters = {
                            resourceRequestUri: request.resourceRequestUri,
                            resourceRequestMethod: request.resourceRequestMethod,
                            shrClaims: request.shrClaims,
                            shrNonce: request.shrNonce
                        };
                        popTokenGenerator = new PopTokenGenerator(this.browserCrypto);
                        return [4 /*yield*/, popTokenGenerator.generateCnf(shrParameters)];
                    case 1:
                        reqCnfData = _a.sent();
                        // to reduce the URL length, it is recommended to send the hash of the req_cnf instead of the whole string
                        validatedRequest.reqCnf = reqCnfData.reqCnfHash;
                        validatedRequest.keyId = reqCnfData.kid;
                        _a.label = 2;
                    case 2: return [2 /*return*/, validatedRequest];
                }
            });
        });
    };
    return NativeInteractionClient;
}(BaseInteractionClient));

export { NativeInteractionClient };
//# sourceMappingURL=NativeInteractionClient.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __extends, __awaiter, __generator, __assign } from '../_virtual/_tslib.js';
import { OIDC_DEFAULT_SCOPES, StringUtils, UrlString, Constants, AuthError, ThrottlingUtils, ProtocolUtils, PerformanceEvents } from '@azure/msal-common';
import { StandardInteractionClient } from './StandardInteractionClient.js';
import { EventType } from '../event/EventType.js';
import { BrowserConstants, InteractionType, ApiId } from '../utils/BrowserConstants.js';
import { BrowserUtils } from '../utils/BrowserUtils.js';
import { NativeInteractionClient } from './NativeInteractionClient.js';
import { NativeMessageHandler } from '../broker/nativeBroker/NativeMessageHandler.js';
import { BrowserAuthError } from '../error/BrowserAuthError.js';
import { InteractionHandler } from '../interaction_handler/InteractionHandler.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var PopupClient = /** @class */ (function (_super) {
    __extends(PopupClient, _super);
    function PopupClient(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeStorageImpl, nativeMessageHandler, correlationId) {
        var _this = _super.call(this, config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeMessageHandler, correlationId) || this;
        // Properly sets this reference for the unload event.
        _this.unloadWindow = _this.unloadWindow.bind(_this);
        _this.nativeStorage = nativeStorageImpl;
        return _this;
    }
    /**
     * Acquires tokens by opening a popup window to the /authorize endpoint of the authority
     * @param request
     */
    PopupClient.prototype.acquireToken = function (request) {
        try {
            var popupName = this.generatePopupName(request.scopes || OIDC_DEFAULT_SCOPES, request.authority || this.config.auth.authority);
            var popupWindowAttributes = request.popupWindowAttributes || {};
            // asyncPopups flag is true. Acquires token without first opening popup. Popup will be opened later asynchronously.
            if (this.config.system.asyncPopups) {
                this.logger.verbose("asyncPopups set to true, acquiring token");
                // Passes on popup position and dimensions if in request
                return this.acquireTokenPopupAsync(request, popupName, popupWindowAttributes);
            }
            else {
                // asyncPopups flag is set to false. Opens popup before acquiring token.
                this.logger.verbose("asyncPopup set to false, opening popup before acquiring token");
                var popup = this.openSizedPopup("about:blank", popupName, popupWindowAttributes);
                return this.acquireTokenPopupAsync(request, popupName, popupWindowAttributes, popup);
            }
        }
        catch (e) {
            return Promise.reject(e);
        }
    };
    /**
     * Clears local cache for the current user then opens a popup window prompting the user to sign-out of the server
     * @param logoutRequest
     */
    PopupClient.prototype.logout = function (logoutRequest) {
        try {
            this.logger.verbose("logoutPopup called");
            var validLogoutRequest = this.initializeLogoutRequest(logoutRequest);
            var popupName = this.generateLogoutPopupName(validLogoutRequest);
            var authority = logoutRequest && logoutRequest.authority;
            var mainWindowRedirectUri = logoutRequest && logoutRequest.mainWindowRedirectUri;
            var popupWindowAttributes = (logoutRequest === null || logoutRequest === void 0 ? void 0 : logoutRequest.popupWindowAttributes) || {};
            // asyncPopups flag is true. Acquires token without first opening popup. Popup will be opened later asynchronously.
            if (this.config.system.asyncPopups) {
                this.logger.verbose("asyncPopups set to true");
                // Passes on popup position and dimensions if in request
                return this.logoutPopupAsync(validLogoutRequest, popupName, popupWindowAttributes, authority, undefined, mainWindowRedirectUri);
            }
            else {
                // asyncPopups flag is set to false. Opens popup before logging out.
                this.logger.verbose("asyncPopup set to false, opening popup");
                var popup = this.openSizedPopup("about:blank", popupName, popupWindowAttributes);
                return this.logoutPopupAsync(validLogoutRequest, popupName, popupWindowAttributes, authority, popup, mainWindowRedirectUri);
            }
        }
        catch (e) {
            // Since this function is synchronous we need to reject
            return Promise.reject(e);
        }
    };
    /**
     * Helper which obtains an access_token for your API via opening a popup window in the user's browser
     * @param validRequest
     * @param popupName
     * @param popup
     * @param popupWindowAttributes
     *
     * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.
     */
    PopupClient.prototype.acquireTokenPopupAsync = function (request, popupName, popupWindowAttributes, popup) {
        return __awaiter(this, void 0, void 0, function () {
            var serverTelemetryManager, validRequest, authCodeRequest, authClient, isNativeBroker, fetchNativeAccountIdMeasurement, navigateUrl, interactionHandler, popupParameters, popupWindow, hash, serverParams, state_1, nativeInteractionClient, userRequestState, result, e_1;
            var _this = this;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.verbose("acquireTokenPopupAsync called");
                        serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenPopup);
                        return [4 /*yield*/, this.initializeAuthorizationRequest(request, InteractionType.Popup)];
                    case 1:
                        validRequest = _a.sent();
                        this.browserStorage.updateCacheEntries(validRequest.state, validRequest.nonce, validRequest.authority, validRequest.loginHint || Constants.EMPTY_STRING, validRequest.account || null);
                        _a.label = 2;
                    case 2:
                        _a.trys.push([2, 8, , 9]);
                        return [4 /*yield*/, this.initializeAuthorizationCodeRequest(validRequest)];
                    case 3:
                        authCodeRequest = _a.sent();
                        return [4 /*yield*/, this.createAuthCodeClient(serverTelemetryManager, validRequest.authority, validRequest.azureCloudOptions)];
                    case 4:
                        authClient = _a.sent();
                        this.logger.verbose("Auth code client created");
                        isNativeBroker = NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeMessageHandler, request.authenticationScheme);
                        fetchNativeAccountIdMeasurement = void 0;
                        if (isNativeBroker) {
                            fetchNativeAccountIdMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.FetchAccountIdWithNativeBroker, request.correlationId);
                        }
                        return [4 /*yield*/, authClient.getAuthCodeUrl(__assign(__assign({}, validRequest), { nativeBroker: isNativeBroker }))];
                    case 5:
                        navigateUrl = _a.sent();
                        interactionHandler = new InteractionHandler(authClient, this.browserStorage, authCodeRequest, this.logger);
                        popupParameters = {
                            popup: popup,
                            popupName: popupName,
                            popupWindowAttributes: popupWindowAttributes
                        };
                        popupWindow = this.initiateAuthRequest(navigateUrl, popupParameters);
                        this.eventHandler.emitEvent(EventType.POPUP_OPENED, InteractionType.Popup, { popupWindow: popupWindow }, null);
                        return [4 /*yield*/, this.monitorPopupForHash(popupWindow)];
                    case 6:
                        hash = _a.sent();
                        serverParams = UrlString.getDeserializedHash(hash);
                        state_1 = this.validateAndExtractStateFromHash(serverParams, InteractionType.Popup, validRequest.correlationId);
                        // Remove throttle if it exists
                        ThrottlingUtils.removeThrottle(this.browserStorage, this.config.auth.clientId, authCodeRequest);
                        if (serverParams.accountId) {
                            this.logger.verbose("Account id found in hash, calling WAM for token");
                            // end measurement for server call with native brokering enabled
                            if (fetchNativeAccountIdMeasurement) {
                                fetchNativeAccountIdMeasurement.endMeasurement({
                                    success: true,
                                    isNativeBroker: true
                                });
                            }
                            if (!this.nativeMessageHandler) {
                                throw BrowserAuthError.createNativeConnectionNotEstablishedError();
                            }
                            nativeInteractionClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, ApiId.acquireTokenPopup, this.performanceClient, this.nativeMessageHandler, serverParams.accountId, this.nativeStorage, validRequest.correlationId);
                            userRequestState = ProtocolUtils.parseRequestState(this.browserCrypto, state_1).userRequestState;
                            return [2 /*return*/, nativeInteractionClient.acquireToken(__assign(__assign({}, validRequest), { state: userRequestState, prompt: undefined // Server should handle the prompt, ideally native broker can do this part silently
                                 })).finally(function () {
                                    _this.browserStorage.cleanRequestByState(state_1);
                                })];
                        }
                        return [4 /*yield*/, interactionHandler.handleCodeResponseFromHash(hash, state_1, authClient.authority, this.networkClient)];
                    case 7:
                        result = _a.sent();
                        return [2 /*return*/, result];
                    case 8:
                        e_1 = _a.sent();
                        if (popup) {
                            // Close the synchronous popup if an error is thrown before the window unload event is registered
                            popup.close();
                        }
                        if (e_1 instanceof AuthError) {
                            e_1.setCorrelationId(this.correlationId);
                        }
                        serverTelemetryManager.cacheFailedRequest(e_1);
                        this.browserStorage.cleanRequestByState(validRequest.state);
                        throw e_1;
                    case 9: return [2 /*return*/];
                }
            });
        });
    };
    /**
     *
     * @param validRequest
     * @param popupName
     * @param requestAuthority
     * @param popup
     * @param mainWindowRedirectUri
     * @param popupWindowAttributes
     */
    PopupClient.prototype.logoutPopupAsync = function (validRequest, popupName, popupWindowAttributes, requestAuthority, popup, mainWindowRedirectUri) {
        return __awaiter(this, void 0, void 0, function () {
            var serverTelemetryManager, authClient, logoutUri, popupWindow, navigationOptions, absoluteUrl, e_2;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.verbose("logoutPopupAsync called");
                        this.eventHandler.emitEvent(EventType.LOGOUT_START, InteractionType.Popup, validRequest);
                        serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.logoutPopup);
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 5, , 6]);
                        // Clear cache on logout
                        return [4 /*yield*/, this.clearCacheOnLogout(validRequest.account)];
                    case 2:
                        // Clear cache on logout
                        _a.sent();
                        return [4 /*yield*/, this.createAuthCodeClient(serverTelemetryManager, requestAuthority)];
                    case 3:
                        authClient = _a.sent();
                        this.logger.verbose("Auth code client created");
                        logoutUri = authClient.getLogoutUri(validRequest);
                        this.eventHandler.emitEvent(EventType.LOGOUT_SUCCESS, InteractionType.Popup, validRequest);
                        popupWindow = this.openPopup(logoutUri, { popupName: popupName, popupWindowAttributes: popupWindowAttributes, popup: popup });
                        this.eventHandler.emitEvent(EventType.POPUP_OPENED, InteractionType.Popup, { popupWindow: popupWindow }, null);
                        return [4 /*yield*/, this.waitForLogoutPopup(popupWindow)];
                    case 4:
                        _a.sent();
                        if (mainWindowRedirectUri) {
                            navigationOptions = {
                                apiId: ApiId.logoutPopup,
                                timeout: this.config.system.redirectNavigationTimeout,
                                noHistory: false
                            };
                            absoluteUrl = UrlString.getAbsoluteUrl(mainWindowRedirectUri, BrowserUtils.getCurrentUri());
                            this.logger.verbose("Redirecting main window to url specified in the request");
                            this.logger.verbosePii("Redirecting main window to: " + absoluteUrl);
                            this.navigationClient.navigateInternal(absoluteUrl, navigationOptions);
                        }
                        else {
                            this.logger.verbose("No main window navigation requested");
                        }
                        return [3 /*break*/, 6];
                    case 5:
                        e_2 = _a.sent();
                        if (popup) {
                            // Close the synchronous popup if an error is thrown before the window unload event is registered
                            popup.close();
                        }
                        if (e_2 instanceof AuthError) {
                            e_2.setCorrelationId(this.correlationId);
                        }
                        this.browserStorage.setInteractionInProgress(false);
                        this.eventHandler.emitEvent(EventType.LOGOUT_FAILURE, InteractionType.Popup, null, e_2);
                        this.eventHandler.emitEvent(EventType.LOGOUT_END, InteractionType.Popup);
                        serverTelemetryManager.cacheFailedRequest(e_2);
                        throw e_2;
                    case 6:
                        this.eventHandler.emitEvent(EventType.LOGOUT_END, InteractionType.Popup);
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Opens a popup window with given request Url.
     * @param requestUrl
     */
    PopupClient.prototype.initiateAuthRequest = function (requestUrl, params) {
        // Check that request url is not empty.
        if (!StringUtils.isEmpty(requestUrl)) {
            this.logger.infoPii("Navigate to: " + requestUrl);
            // Open the popup window to requestUrl.
            return this.openPopup(requestUrl, params);
        }
        else {
            // Throw error if request URL is empty.
            this.logger.error("Navigate url is empty");
            throw BrowserAuthError.createEmptyNavigationUriError();
        }
    };
    /**
     * Monitors a window until it loads a url with the same origin.
     * @param popupWindow - window that is being monitored
     * @param timeout - timeout for processing hash once popup is redirected back to application
     */
    PopupClient.prototype.monitorPopupForHash = function (popupWindow) {
        var _this = this;
        return new Promise(function (resolve, reject) {
            /*
             * Polling for popups needs to be tick-based,
             * since a non-trivial amount of time can be spent on interaction (which should not count against the timeout).
             */
            var maxTicks = _this.config.system.windowHashTimeout / BrowserConstants.POLL_INTERVAL_MS;
            var ticks = 0;
            _this.logger.verbose("PopupHandler.monitorPopupForHash - polling started");
            var intervalId = setInterval(function () {
                // Window is closed
                if (popupWindow.closed) {
                    _this.logger.error("PopupHandler.monitorPopupForHash - window closed");
                    _this.cleanPopup();
                    clearInterval(intervalId);
                    reject(BrowserAuthError.createUserCancelledError());
                    return;
                }
                var href = Constants.EMPTY_STRING;
                var hash = Constants.EMPTY_STRING;
                try {
                    /*
                     * Will throw if cross origin,
                     * which should be caught and ignored
                     * since we need the interval to keep running while on STS UI.
                     */
                    href = popupWindow.location.href;
                    hash = popupWindow.location.hash;
                }
                catch (e) { }
                // Don't process blank pages or cross domain
                if (StringUtils.isEmpty(href) || href === "about:blank") {
                    return;
                }
                _this.logger.verbose("PopupHandler.monitorPopupForHash - popup window is on same origin as caller");
                /*
                 * Only run clock when we are on same domain for popups
                 * as popup operations can take a long time.
                 */
                ticks++;
                if (hash) {
                    _this.logger.verbose("PopupHandler.monitorPopupForHash - found hash in url");
                    clearInterval(intervalId);
                    _this.cleanPopup(popupWindow);
                    if (UrlString.hashContainsKnownProperties(hash)) {
                        _this.logger.verbose("PopupHandler.monitorPopupForHash - hash contains known properties, returning.");
                        resolve(hash);
                    }
                    else {
                        _this.logger.error("PopupHandler.monitorPopupForHash - found hash in url but it does not contain known properties. Check that your router is not changing the hash prematurely.");
                        _this.logger.errorPii("PopupHandler.monitorPopupForHash - hash found: " + hash);
                        reject(BrowserAuthError.createHashDoesNotContainKnownPropertiesError());
                    }
                }
                else if (ticks > maxTicks) {
                    _this.logger.error("PopupHandler.monitorPopupForHash - unable to find hash in url, timing out");
                    clearInterval(intervalId);
                    reject(BrowserAuthError.createMonitorPopupTimeoutError());
                }
            }, BrowserConstants.POLL_INTERVAL_MS);
        });
    };
    /**
     * Waits for user interaction in logout popup window
     * @param popupWindow
     * @returns
     */
    PopupClient.prototype.waitForLogoutPopup = function (popupWindow) {
        var _this = this;
        return new Promise(function (resolve) {
            _this.logger.verbose("PopupHandler.waitForLogoutPopup - polling started");
            var intervalId = setInterval(function () {
                // Window is closed
                if (popupWindow.closed) {
                    _this.logger.error("PopupHandler.waitForLogoutPopup - window closed");
                    _this.cleanPopup();
                    clearInterval(intervalId);
                    resolve();
                }
                var href = Constants.EMPTY_STRING;
                try {
                    /*
                     * Will throw if cross origin,
                     * which should be caught and ignored
                     * since we need the interval to keep running while on STS UI.
                     */
                    href = popupWindow.location.href;
                }
                catch (e) { }
                // Don't process blank pages or cross domain
                if (StringUtils.isEmpty(href) || href === "about:blank") {
                    return;
                }
                _this.logger.verbose("PopupHandler.waitForLogoutPopup - popup window is on same origin as caller, closing.");
                clearInterval(intervalId);
                _this.cleanPopup(popupWindow);
                resolve();
            }, BrowserConstants.POLL_INTERVAL_MS);
        });
    };
    /**
     * @hidden
     *
     * Configures popup window for login.
     *
     * @param urlNavigate
     * @param title
     * @param popUpWidth
     * @param popUpHeight
     * @param popupWindowAttributes
     * @ignore
     * @hidden
     */
    PopupClient.prototype.openPopup = function (urlNavigate, popupParams) {
        try {
            var popupWindow = void 0;
            // Popup window passed in, setting url to navigate to
            if (popupParams.popup) {
                popupWindow = popupParams.popup;
                this.logger.verbosePii("Navigating popup window to: " + urlNavigate);
                popupWindow.location.assign(urlNavigate);
            }
            else if (typeof popupParams.popup === "undefined") {
                // Popup will be undefined if it was not passed in
                this.logger.verbosePii("Opening popup window to: " + urlNavigate);
                popupWindow = this.openSizedPopup(urlNavigate, popupParams.popupName, popupParams.popupWindowAttributes);
            }
            // Popup will be null if popups are blocked
            if (!popupWindow) {
                throw BrowserAuthError.createEmptyWindowCreatedError();
            }
            if (popupWindow.focus) {
                popupWindow.focus();
            }
            this.currentWindow = popupWindow;
            window.addEventListener("beforeunload", this.unloadWindow);
            return popupWindow;
        }
        catch (e) {
            this.logger.error("error opening popup " + e.message);
            this.browserStorage.setInteractionInProgress(false);
            throw BrowserAuthError.createPopupWindowError(e.toString());
        }
    };
    /**
     * Helper function to set popup window dimensions and position
     * @param urlNavigate
     * @param popupName
     * @param popupWindowAttributes
     * @returns
     */
    PopupClient.prototype.openSizedPopup = function (urlNavigate, popupName, popupWindowAttributes) {
        var _a, _b, _c, _d;
        /**
         * adding winLeft and winTop to account for dual monitor
         * using screenLeft and screenTop for IE8 and earlier
         */
        var winLeft = window.screenLeft ? window.screenLeft : window.screenX;
        var winTop = window.screenTop ? window.screenTop : window.screenY;
        /**
         * window.innerWidth displays browser window"s height and width excluding toolbars
         * using document.documentElement.clientWidth for IE8 and earlier
         */
        var winWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
        var winHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
        var width = (_a = popupWindowAttributes.popupSize) === null || _a === void 0 ? void 0 : _a.width;
        var height = (_b = popupWindowAttributes.popupSize) === null || _b === void 0 ? void 0 : _b.height;
        var top = (_c = popupWindowAttributes.popupPosition) === null || _c === void 0 ? void 0 : _c.top;
        var left = (_d = popupWindowAttributes.popupPosition) === null || _d === void 0 ? void 0 : _d.left;
        if (!width || width < 0 || width > winWidth) {
            this.logger.verbose("Default popup window width used. Window width not configured or invalid.");
            width = BrowserConstants.POPUP_WIDTH;
        }
        if (!height || height < 0 || height > winHeight) {
            this.logger.verbose("Default popup window height used. Window height not configured or invalid.");
            height = BrowserConstants.POPUP_HEIGHT;
        }
        if (!top || top < 0 || top > winHeight) {
            this.logger.verbose("Default popup window top position used. Window top not configured or invalid.");
            top = Math.max(0, ((winHeight / 2) - (BrowserConstants.POPUP_HEIGHT / 2)) + winTop);
        }
        if (!left || left < 0 || left > winWidth) {
            this.logger.verbose("Default popup window left position used. Window left not configured or invalid.");
            left = Math.max(0, ((winWidth / 2) - (BrowserConstants.POPUP_WIDTH / 2)) + winLeft);
        }
        return window.open(urlNavigate, popupName, "width=" + width + ", height=" + height + ", top=" + top + ", left=" + left + ", scrollbars=yes");
    };
    /**
     * Event callback to unload main window.
     */
    PopupClient.prototype.unloadWindow = function (e) {
        this.browserStorage.cleanRequestByInteractionType(InteractionType.Popup);
        if (this.currentWindow) {
            this.currentWindow.close();
        }
        // Guarantees browser unload will happen, so no other errors will be thrown.
        e.preventDefault();
    };
    /**
     * Closes popup, removes any state vars created during popup calls.
     * @param popupWindow
     */
    PopupClient.prototype.cleanPopup = function (popupWindow) {
        if (popupWindow) {
            // Close window.
            popupWindow.close();
        }
        // Remove window unload function
        window.removeEventListener("beforeunload", this.unloadWindow);
        // Interaction is completed - remove interaction status.
        this.browserStorage.setInteractionInProgress(false);
    };
    /**
     * Generates the name for the popup based on the client id and request
     * @param clientId
     * @param request
     */
    PopupClient.prototype.generatePopupName = function (scopes, authority) {
        return BrowserConstants.POPUP_NAME_PREFIX + "." + this.config.auth.clientId + "." + scopes.join("-") + "." + authority + "." + this.correlationId;
    };
    /**
     * Generates the name for the popup based on the client id and request for logouts
     * @param clientId
     * @param request
     */
    PopupClient.prototype.generateLogoutPopupName = function (request) {
        var homeAccountId = request.account && request.account.homeAccountId;
        return BrowserConstants.POPUP_NAME_PREFIX + "." + this.config.auth.clientId + "." + homeAccountId + "." + this.correlationId;
    };
    return PopupClient;
}(StandardInteractionClient));

export { PopupClient };
//# sourceMappingURL=PopupClient.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __extends, __awaiter, __generator, __assign } from '../_virtual/_tslib.js';
import { UrlString, AuthError, Constants, ThrottlingUtils, ProtocolUtils } from '@azure/msal-common';
import { StandardInteractionClient } from './StandardInteractionClient.js';
import { TemporaryCacheKeys, ApiId, InteractionType } from '../utils/BrowserConstants.js';
import { RedirectHandler } from '../interaction_handler/RedirectHandler.js';
import { BrowserUtils } from '../utils/BrowserUtils.js';
import { EventType } from '../event/EventType.js';
import { BrowserAuthError } from '../error/BrowserAuthError.js';
import { NativeInteractionClient } from './NativeInteractionClient.js';
import { NativeMessageHandler } from '../broker/nativeBroker/NativeMessageHandler.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var RedirectClient = /** @class */ (function (_super) {
    __extends(RedirectClient, _super);
    function RedirectClient(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeStorageImpl, nativeMessageHandler, correlationId) {
        var _this = _super.call(this, config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeMessageHandler, correlationId) || this;
        _this.nativeStorage = nativeStorageImpl;
        return _this;
    }
    /**
     * Redirects the page to the /authorize endpoint of the IDP
     * @param request
     */
    RedirectClient.prototype.acquireToken = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var validRequest, serverTelemetryManager, handleBackButton, authCodeRequest, authClient, interactionHandler, navigateUrl, redirectStartPage, e_1;
            var _this = this;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.initializeAuthorizationRequest(request, InteractionType.Redirect)];
                    case 1:
                        validRequest = _a.sent();
                        this.browserStorage.updateCacheEntries(validRequest.state, validRequest.nonce, validRequest.authority, validRequest.loginHint || Constants.EMPTY_STRING, validRequest.account || null);
                        serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenRedirect);
                        handleBackButton = function (event) {
                            // Clear temporary cache if the back button is clicked during the redirect flow.
                            if (event.persisted) {
                                _this.logger.verbose("Page was restored from back/forward cache. Clearing temporary cache.");
                                _this.browserStorage.cleanRequestByState(validRequest.state);
                            }
                        };
                        _a.label = 2;
                    case 2:
                        _a.trys.push([2, 7, , 8]);
                        return [4 /*yield*/, this.initializeAuthorizationCodeRequest(validRequest)];
                    case 3:
                        authCodeRequest = _a.sent();
                        return [4 /*yield*/, this.createAuthCodeClient(serverTelemetryManager, validRequest.authority, validRequest.azureCloudOptions)];
                    case 4:
                        authClient = _a.sent();
                        this.logger.verbose("Auth code client created");
                        interactionHandler = new RedirectHandler(authClient, this.browserStorage, authCodeRequest, this.logger, this.browserCrypto);
                        return [4 /*yield*/, authClient.getAuthCodeUrl(__assign(__assign({}, validRequest), { nativeBroker: NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeMessageHandler, request.authenticationScheme) }))];
                    case 5:
                        navigateUrl = _a.sent();
                        redirectStartPage = this.getRedirectStartPage(request.redirectStartPage);
                        this.logger.verbosePii("Redirect start page: " + redirectStartPage);
                        // Clear temporary cache if the back button is clicked during the redirect flow.
                        window.addEventListener("pageshow", handleBackButton);
                        return [4 /*yield*/, interactionHandler.initiateAuthRequest(navigateUrl, {
                                navigationClient: this.navigationClient,
                                redirectTimeout: this.config.system.redirectNavigationTimeout,
                                redirectStartPage: redirectStartPage,
                                onRedirectNavigate: request.onRedirectNavigate
                            })];
                    case 6: 
                    // Show the UI once the url has been created. Response will come back in the hash, which will be handled in the handleRedirectCallback function.
                    return [2 /*return*/, _a.sent()];
                    case 7:
                        e_1 = _a.sent();
                        if (e_1 instanceof AuthError) {
                            e_1.setCorrelationId(this.correlationId);
                        }
                        window.removeEventListener("pageshow", handleBackButton);
                        serverTelemetryManager.cacheFailedRequest(e_1);
                        this.browserStorage.cleanRequestByState(validRequest.state);
                        throw e_1;
                    case 8: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Checks if navigateToLoginRequestUrl is set, and:
     * - if true, performs logic to cache and navigate
     * - if false, handles hash string and parses response
     * @param hash
     */
    RedirectClient.prototype.handleRedirectPromise = function (hash) {
        return __awaiter(this, void 0, void 0, function () {
            var serverTelemetryManager, responseHash, state, serverParams, loginRequestUrl, loginRequestUrlNormalized, currentUrlNormalized, handleHashResult, navigationOptions, processHashOnRedirect, homepage, e_2;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.handleRedirectPromise);
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 10, , 11]);
                        if (!this.browserStorage.isInteractionInProgress(true)) {
                            this.logger.info("handleRedirectPromise called but there is no interaction in progress, returning null.");
                            return [2 /*return*/, null];
                        }
                        responseHash = this.getRedirectResponseHash(hash || window.location.hash);
                        if (!responseHash) {
                            // Not a recognized server response hash or hash not associated with a redirect request
                            this.logger.info("handleRedirectPromise did not detect a response hash as a result of a redirect. Cleaning temporary cache.");
                            this.browserStorage.cleanRequestByInteractionType(InteractionType.Redirect);
                            return [2 /*return*/, null];
                        }
                        state = void 0;
                        try {
                            serverParams = UrlString.getDeserializedHash(responseHash);
                            state = this.validateAndExtractStateFromHash(serverParams, InteractionType.Redirect);
                            this.logger.verbose("State extracted from hash");
                        }
                        catch (e) {
                            this.logger.info("handleRedirectPromise was unable to extract state due to: " + e);
                            this.browserStorage.cleanRequestByInteractionType(InteractionType.Redirect);
                            return [2 /*return*/, null];
                        }
                        loginRequestUrl = this.browserStorage.getTemporaryCache(TemporaryCacheKeys.ORIGIN_URI, true) || Constants.EMPTY_STRING;
                        loginRequestUrlNormalized = UrlString.removeHashFromUrl(loginRequestUrl);
                        currentUrlNormalized = UrlString.removeHashFromUrl(window.location.href);
                        if (!(loginRequestUrlNormalized === currentUrlNormalized && this.config.auth.navigateToLoginRequestUrl)) return [3 /*break*/, 3];
                        // We are on the page we need to navigate to - handle hash
                        this.logger.verbose("Current page is loginRequestUrl, handling hash");
                        return [4 /*yield*/, this.handleHash(responseHash, state, serverTelemetryManager)];
                    case 2:
                        handleHashResult = _a.sent();
                        if (loginRequestUrl.indexOf("#") > -1) {
                            // Replace current hash with non-msal hash, if present
                            BrowserUtils.replaceHash(loginRequestUrl);
                        }
                        return [2 /*return*/, handleHashResult];
                    case 3:
                        if (!!this.config.auth.navigateToLoginRequestUrl) return [3 /*break*/, 4];
                        this.logger.verbose("NavigateToLoginRequestUrl set to false, handling hash");
                        return [2 /*return*/, this.handleHash(responseHash, state, serverTelemetryManager)];
                    case 4:
                        if (!(!BrowserUtils.isInIframe() || this.config.system.allowRedirectInIframe)) return [3 /*break*/, 9];
                        /*
                         * Returned from authority using redirect - need to perform navigation before processing response
                         * Cache the hash to be retrieved after the next redirect
                         */
                        this.browserStorage.setTemporaryCache(TemporaryCacheKeys.URL_HASH, responseHash, true);
                        navigationOptions = {
                            apiId: ApiId.handleRedirectPromise,
                            timeout: this.config.system.redirectNavigationTimeout,
                            noHistory: true
                        };
                        processHashOnRedirect = true;
                        if (!(!loginRequestUrl || loginRequestUrl === "null")) return [3 /*break*/, 6];
                        homepage = BrowserUtils.getHomepage();
                        // Cache the homepage under ORIGIN_URI to ensure cached hash is processed on homepage
                        this.browserStorage.setTemporaryCache(TemporaryCacheKeys.ORIGIN_URI, homepage, true);
                        this.logger.warning("Unable to get valid login request url from cache, redirecting to home page");
                        return [4 /*yield*/, this.navigationClient.navigateInternal(homepage, navigationOptions)];
                    case 5:
                        processHashOnRedirect = _a.sent();
                        return [3 /*break*/, 8];
                    case 6:
                        // Navigate to page that initiated the redirect request
                        this.logger.verbose("Navigating to loginRequestUrl: " + loginRequestUrl);
                        return [4 /*yield*/, this.navigationClient.navigateInternal(loginRequestUrl, navigationOptions)];
                    case 7:
                        processHashOnRedirect = _a.sent();
                        _a.label = 8;
                    case 8:
                        // If navigateInternal implementation returns false, handle the hash now
                        if (!processHashOnRedirect) {
                            return [2 /*return*/, this.handleHash(responseHash, state, serverTelemetryManager)];
                        }
                        _a.label = 9;
                    case 9: return [2 /*return*/, null];
                    case 10:
                        e_2 = _a.sent();
                        if (e_2 instanceof AuthError) {
                            e_2.setCorrelationId(this.correlationId);
                        }
                        serverTelemetryManager.cacheFailedRequest(e_2);
                        this.browserStorage.cleanRequestByInteractionType(InteractionType.Redirect);
                        throw e_2;
                    case 11: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Gets the response hash for a redirect request
     * Returns null if interactionType in the state value is not "redirect" or the hash does not contain known properties
     * @param hash
     */
    RedirectClient.prototype.getRedirectResponseHash = function (hash) {
        this.logger.verbose("getRedirectResponseHash called");
        // Get current location hash from window or cache.
        var isResponseHash = UrlString.hashContainsKnownProperties(hash);
        if (isResponseHash) {
            BrowserUtils.clearHash(window);
            this.logger.verbose("Hash contains known properties, returning response hash");
            return hash;
        }
        var cachedHash = this.browserStorage.getTemporaryCache(TemporaryCacheKeys.URL_HASH, true);
        this.browserStorage.removeItem(this.browserStorage.generateCacheKey(TemporaryCacheKeys.URL_HASH));
        this.logger.verbose("Hash does not contain known properties, returning cached hash");
        return cachedHash;
    };
    /**
     * Checks if hash exists and handles in window.
     * @param hash
     * @param state
     */
    RedirectClient.prototype.handleHash = function (hash, state, serverTelemetryManager) {
        return __awaiter(this, void 0, void 0, function () {
            var cachedRequest, serverParams, nativeInteractionClient, userRequestState, currentAuthority, authClient, interactionHandler;
            var _this = this;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        cachedRequest = this.browserStorage.getCachedRequest(state, this.browserCrypto);
                        this.logger.verbose("handleHash called, retrieved cached request");
                        serverParams = UrlString.getDeserializedHash(hash);
                        if (serverParams.accountId) {
                            this.logger.verbose("Account id found in hash, calling WAM for token");
                            if (!this.nativeMessageHandler) {
                                throw BrowserAuthError.createNativeConnectionNotEstablishedError();
                            }
                            nativeInteractionClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, ApiId.acquireTokenPopup, this.performanceClient, this.nativeMessageHandler, serverParams.accountId, this.browserStorage, cachedRequest.correlationId);
                            userRequestState = ProtocolUtils.parseRequestState(this.browserCrypto, state).userRequestState;
                            return [2 /*return*/, nativeInteractionClient.acquireToken(__assign(__assign({}, cachedRequest), { state: userRequestState, prompt: undefined // Server should handle the prompt, ideally native broker can do this part silently
                                 })).finally(function () {
                                    _this.browserStorage.cleanRequestByState(state);
                                })];
                        }
                        currentAuthority = this.browserStorage.getCachedAuthority(state);
                        if (!currentAuthority) {
                            throw BrowserAuthError.createNoCachedAuthorityError();
                        }
                        return [4 /*yield*/, this.createAuthCodeClient(serverTelemetryManager, currentAuthority)];
                    case 1:
                        authClient = _a.sent();
                        this.logger.verbose("Auth code client created");
                        ThrottlingUtils.removeThrottle(this.browserStorage, this.config.auth.clientId, cachedRequest);
                        interactionHandler = new RedirectHandler(authClient, this.browserStorage, cachedRequest, this.logger, this.browserCrypto);
                        return [4 /*yield*/, interactionHandler.handleCodeResponseFromHash(hash, state, authClient.authority, this.networkClient)];
                    case 2: return [2 /*return*/, _a.sent()];
                }
            });
        });
    };
    /**
     * Use to log out the current user, and redirect the user to the postLogoutRedirectUri.
     * Default behaviour is to redirect the user to `window.location.href`.
     * @param logoutRequest
     */
    RedirectClient.prototype.logout = function (logoutRequest) {
        return __awaiter(this, void 0, void 0, function () {
            var validLogoutRequest, serverTelemetryManager, navigationOptions, authClient, logoutUri, navigate, e_3;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.verbose("logoutRedirect called");
                        validLogoutRequest = this.initializeLogoutRequest(logoutRequest);
                        serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.logout);
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 10, , 11]);
                        this.eventHandler.emitEvent(EventType.LOGOUT_START, InteractionType.Redirect, logoutRequest);
                        // Clear cache on logout
                        return [4 /*yield*/, this.clearCacheOnLogout(validLogoutRequest.account)];
                    case 2:
                        // Clear cache on logout
                        _a.sent();
                        navigationOptions = {
                            apiId: ApiId.logout,
                            timeout: this.config.system.redirectNavigationTimeout,
                            noHistory: false
                        };
                        return [4 /*yield*/, this.createAuthCodeClient(serverTelemetryManager, logoutRequest && logoutRequest.authority)];
                    case 3:
                        authClient = _a.sent();
                        this.logger.verbose("Auth code client created");
                        logoutUri = authClient.getLogoutUri(validLogoutRequest);
                        this.eventHandler.emitEvent(EventType.LOGOUT_SUCCESS, InteractionType.Redirect, validLogoutRequest);
                        if (!(logoutRequest && typeof logoutRequest.onRedirectNavigate === "function")) return [3 /*break*/, 7];
                        navigate = logoutRequest.onRedirectNavigate(logoutUri);
                        if (!(navigate !== false)) return [3 /*break*/, 5];
                        this.logger.verbose("Logout onRedirectNavigate did not return false, navigating");
                        // Ensure interaction is in progress
                        if (!this.browserStorage.getInteractionInProgress()) {
                            this.browserStorage.setInteractionInProgress(true);
                        }
                        return [4 /*yield*/, this.navigationClient.navigateExternal(logoutUri, navigationOptions)];
                    case 4:
                        _a.sent();
                        return [2 /*return*/];
                    case 5:
                        // Ensure interaction is not in progress
                        this.browserStorage.setInteractionInProgress(false);
                        this.logger.verbose("Logout onRedirectNavigate returned false, stopping navigation");
                        _a.label = 6;
                    case 6: return [3 /*break*/, 9];
                    case 7:
                        // Ensure interaction is in progress
                        if (!this.browserStorage.getInteractionInProgress()) {
                            this.browserStorage.setInteractionInProgress(true);
                        }
                        return [4 /*yield*/, this.navigationClient.navigateExternal(logoutUri, navigationOptions)];
                    case 8:
                        _a.sent();
                        return [2 /*return*/];
                    case 9: return [3 /*break*/, 11];
                    case 10:
                        e_3 = _a.sent();
                        if (e_3 instanceof AuthError) {
                            e_3.setCorrelationId(this.correlationId);
                        }
                        serverTelemetryManager.cacheFailedRequest(e_3);
                        this.eventHandler.emitEvent(EventType.LOGOUT_FAILURE, InteractionType.Redirect, null, e_3);
                        this.eventHandler.emitEvent(EventType.LOGOUT_END, InteractionType.Redirect);
                        throw e_3;
                    case 11:
                        this.eventHandler.emitEvent(EventType.LOGOUT_END, InteractionType.Redirect);
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Use to get the redirectStartPage either from request or use current window
     * @param requestStartPage
     */
    RedirectClient.prototype.getRedirectStartPage = function (requestStartPage) {
        var redirectStartPage = requestStartPage || window.location.href;
        return UrlString.getAbsoluteUrl(redirectStartPage, BrowserUtils.getCurrentUri());
    };
    return RedirectClient;
}(StandardInteractionClient));

export { RedirectClient };
//# sourceMappingURL=RedirectClient.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __extends, __awaiter, __generator, __assign } from '../_virtual/_tslib.js';
import { AuthError, Constants } from '@azure/msal-common';
import { StandardInteractionClient } from './StandardInteractionClient.js';
import { BrowserAuthError } from '../error/BrowserAuthError.js';
import { InteractionType } from '../utils/BrowserConstants.js';
import { SilentHandler } from '../interaction_handler/SilentHandler.js';
import { HybridSpaAuthorizationCodeClient } from './HybridSpaAuthorizationCodeClient.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var SilentAuthCodeClient = /** @class */ (function (_super) {
    __extends(SilentAuthCodeClient, _super);
    function SilentAuthCodeClient(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, apiId, performanceClient, nativeMessageHandler, correlationId) {
        var _this = _super.call(this, config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeMessageHandler, correlationId) || this;
        _this.apiId = apiId;
        return _this;
    }
    /**
     * Acquires a token silently by redeeming an authorization code against the /token endpoint
     * @param request
     */
    SilentAuthCodeClient.prototype.acquireToken = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var silentRequest, serverTelemetryManager, authCodeRequest, clientConfig, authClient, silentHandler, e_1;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.trace("SilentAuthCodeClient.acquireToken called");
                        // Auth code payload is required
                        if (!request.code) {
                            throw BrowserAuthError.createAuthCodeRequiredError();
                        }
                        return [4 /*yield*/, this.initializeAuthorizationRequest(request, InteractionType.Silent)];
                    case 1:
                        silentRequest = _a.sent();
                        this.browserStorage.updateCacheEntries(silentRequest.state, silentRequest.nonce, silentRequest.authority, silentRequest.loginHint || Constants.EMPTY_STRING, silentRequest.account || null);
                        serverTelemetryManager = this.initializeServerTelemetryManager(this.apiId);
                        _a.label = 2;
                    case 2:
                        _a.trys.push([2, 4, , 5]);
                        authCodeRequest = __assign(__assign({}, silentRequest), { code: request.code });
                        return [4 /*yield*/, this.getClientConfiguration(serverTelemetryManager, silentRequest.authority)];
                    case 3:
                        clientConfig = _a.sent();
                        authClient = new HybridSpaAuthorizationCodeClient(clientConfig);
                        this.logger.verbose("Auth code client created");
                        silentHandler = new SilentHandler(authClient, this.browserStorage, authCodeRequest, this.logger, this.config.system.navigateFrameWait);
                        // Handle auth code parameters from request
                        return [2 /*return*/, silentHandler.handleCodeResponseFromServer({
                                code: request.code,
                                msgraph_host: request.msGraphHost,
                                cloud_graph_host_name: request.cloudGraphHostName,
                                cloud_instance_host_name: request.cloudInstanceHostName
                            }, silentRequest.state, authClient.authority, this.networkClient, false)];
                    case 4:
                        e_1 = _a.sent();
                        if (e_1 instanceof AuthError) {
                            e_1.setCorrelationId(this.correlationId);
                        }
                        serverTelemetryManager.cacheFailedRequest(e_1);
                        this.browserStorage.cleanRequestByState(silentRequest.state);
                        throw e_1;
                    case 5: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Currently Unsupported
     */
    SilentAuthCodeClient.prototype.logout = function () {
        // Synchronous so we must reject
        return Promise.reject(BrowserAuthError.createSilentLogoutUnsupportedError());
    };
    return SilentAuthCodeClient;
}(StandardInteractionClient));

export { SilentAuthCodeClient };
//# sourceMappingURL=SilentAuthCodeClient.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __extends, __awaiter, __generator, __assign } from '../_virtual/_tslib.js';
import { StandardInteractionClient } from './StandardInteractionClient.js';
import { AuthError, PerformanceEvents, SilentFlowClient } from '@azure/msal-common';
import { ApiId } from '../utils/BrowserConstants.js';
import { BrowserAuthError, BrowserAuthErrorMessage } from '../error/BrowserAuthError.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var SilentCacheClient = /** @class */ (function (_super) {
    __extends(SilentCacheClient, _super);
    function SilentCacheClient() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    /**
     * Returns unexpired tokens from the cache, if available
     * @param silentRequest
     */
    SilentCacheClient.prototype.acquireToken = function (silentRequest) {
        return __awaiter(this, void 0, void 0, function () {
            var acquireTokenMeasurement, serverTelemetryManager, silentAuthClient, cachedToken, error_1;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        acquireTokenMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.SilentCacheClientAcquireToken, silentRequest.correlationId);
                        serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenSilent_silentFlow);
                        return [4 /*yield*/, this.createSilentFlowClient(serverTelemetryManager, silentRequest.authority, silentRequest.azureCloudOptions)];
                    case 1:
                        silentAuthClient = _a.sent();
                        this.logger.verbose("Silent auth client created");
                        _a.label = 2;
                    case 2:
                        _a.trys.push([2, 4, , 5]);
                        return [4 /*yield*/, silentAuthClient.acquireCachedToken(silentRequest)];
                    case 3:
                        cachedToken = _a.sent();
                        acquireTokenMeasurement.endMeasurement({
                            success: true,
                            fromCache: true
                        });
                        return [2 /*return*/, cachedToken];
                    case 4:
                        error_1 = _a.sent();
                        if (error_1 instanceof BrowserAuthError && error_1.errorCode === BrowserAuthErrorMessage.signingKeyNotFoundInStorage.code) {
                            this.logger.verbose("Signing keypair for bound access token not found. Refreshing bound access token and generating a new crypto keypair.");
                        }
                        acquireTokenMeasurement.endMeasurement({
                            errorCode: error_1 instanceof AuthError && error_1.errorCode || undefined,
                            subErrorCode: error_1 instanceof AuthError && error_1.subError || undefined,
                            success: false
                        });
                        throw error_1;
                    case 5: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Currently Unsupported
     */
    SilentCacheClient.prototype.logout = function () {
        // Synchronous so we must reject
        return Promise.reject(BrowserAuthError.createSilentLogoutUnsupportedError());
    };
    /**
     * Creates an Silent Flow Client with the given authority, or the default authority.
     * @param serverTelemetryManager
     * @param authorityUrl
     */
    SilentCacheClient.prototype.createSilentFlowClient = function (serverTelemetryManager, authorityUrl, azureCloudOptions) {
        return __awaiter(this, void 0, void 0, function () {
            var clientConfig;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.getClientConfiguration(serverTelemetryManager, authorityUrl, azureCloudOptions)];
                    case 1:
                        clientConfig = _a.sent();
                        return [2 /*return*/, new SilentFlowClient(clientConfig, this.performanceClient)];
                }
            });
        });
    };
    SilentCacheClient.prototype.initializeSilentRequest = function (request, account) {
        return __awaiter(this, void 0, void 0, function () {
            var _a;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        _a = [__assign({}, request)];
                        return [4 /*yield*/, this.initializeBaseRequest(request)];
                    case 1: return [2 /*return*/, __assign.apply(void 0, [__assign.apply(void 0, _a.concat([_b.sent()])), { account: account, forceRefresh: request.forceRefresh || false }])];
                }
            });
        });
    };
    return SilentCacheClient;
}(StandardInteractionClient));

export { SilentCacheClient };
//# sourceMappingURL=SilentCacheClient.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __extends, __awaiter, __generator, __assign } from '../_virtual/_tslib.js';
import { AuthError, Constants, PerformanceEvents, StringUtils, PromptValue, UrlString, ProtocolUtils } from '@azure/msal-common';
import { StandardInteractionClient } from './StandardInteractionClient.js';
import { BrowserAuthError } from '../error/BrowserAuthError.js';
import { InteractionType } from '../utils/BrowserConstants.js';
import { SilentHandler } from '../interaction_handler/SilentHandler.js';
import { NativeMessageHandler } from '../broker/nativeBroker/NativeMessageHandler.js';
import { NativeInteractionClient } from './NativeInteractionClient.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var SilentIframeClient = /** @class */ (function (_super) {
    __extends(SilentIframeClient, _super);
    function SilentIframeClient(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, apiId, performanceClient, nativeStorageImpl, nativeMessageHandler, correlationId) {
        var _this = _super.call(this, config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeMessageHandler, correlationId) || this;
        _this.apiId = apiId;
        _this.nativeStorage = nativeStorageImpl;
        return _this;
    }
    /**
     * Acquires a token silently by opening a hidden iframe to the /authorize endpoint with prompt=none
     * @param request
     */
    SilentIframeClient.prototype.acquireToken = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var acquireTokenMeasurement, silentRequest, serverTelemetryManager, authClient, e_1;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.verbose("acquireTokenByIframe called");
                        acquireTokenMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.SilentIframeClientAcquireToken, request.correlationId);
                        // Check that we have some SSO data
                        if (StringUtils.isEmpty(request.loginHint) && StringUtils.isEmpty(request.sid) && (!request.account || StringUtils.isEmpty(request.account.username))) {
                            this.logger.warning("No user hint provided. The authorization server may need more information to complete this request.");
                        }
                        // Check that prompt is set to none, throw error if it is set to anything else.
                        if (request.prompt && request.prompt !== PromptValue.NONE) {
                            acquireTokenMeasurement.endMeasurement({
                                success: false
                            });
                            throw BrowserAuthError.createSilentPromptValueError(request.prompt);
                        }
                        return [4 /*yield*/, this.initializeAuthorizationRequest(__assign(__assign({}, request), { prompt: PromptValue.NONE }), InteractionType.Silent)];
                    case 1:
                        silentRequest = _a.sent();
                        this.browserStorage.updateCacheEntries(silentRequest.state, silentRequest.nonce, silentRequest.authority, silentRequest.loginHint || Constants.EMPTY_STRING, silentRequest.account || null);
                        serverTelemetryManager = this.initializeServerTelemetryManager(this.apiId);
                        _a.label = 2;
                    case 2:
                        _a.trys.push([2, 5, , 6]);
                        return [4 /*yield*/, this.createAuthCodeClient(serverTelemetryManager, silentRequest.authority, silentRequest.azureCloudOptions)];
                    case 3:
                        authClient = _a.sent();
                        this.logger.verbose("Auth code client created");
                        return [4 /*yield*/, this.silentTokenHelper(authClient, silentRequest).then(function (result) {
                                acquireTokenMeasurement.endMeasurement({
                                    success: true,
                                    fromCache: false
                                });
                                return result;
                            })];
                    case 4: return [2 /*return*/, _a.sent()];
                    case 5:
                        e_1 = _a.sent();
                        if (e_1 instanceof AuthError) {
                            e_1.setCorrelationId(this.correlationId);
                        }
                        serverTelemetryManager.cacheFailedRequest(e_1);
                        this.browserStorage.cleanRequestByState(silentRequest.state);
                        acquireTokenMeasurement.endMeasurement({
                            errorCode: e_1 instanceof AuthError && e_1.errorCode || undefined,
                            subErrorCode: e_1 instanceof AuthError && e_1.subError || undefined,
                            success: false
                        });
                        throw e_1;
                    case 6: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Currently Unsupported
     */
    SilentIframeClient.prototype.logout = function () {
        // Synchronous so we must reject
        return Promise.reject(BrowserAuthError.createSilentLogoutUnsupportedError());
    };
    /**
     * Helper which acquires an authorization code silently using a hidden iframe from given url
     * using the scopes requested as part of the id, and exchanges the code for a set of OAuth tokens.
     * @param navigateUrl
     * @param userRequestScopes
     */
    SilentIframeClient.prototype.silentTokenHelper = function (authClient, silentRequest) {
        return __awaiter(this, void 0, void 0, function () {
            var authCodeRequest, navigateUrl, silentHandler, msalFrame, hash, serverParams, state, nativeInteractionClient, userRequestState;
            var _this = this;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.initializeAuthorizationCodeRequest(silentRequest)];
                    case 1:
                        authCodeRequest = _a.sent();
                        return [4 /*yield*/, authClient.getAuthCodeUrl(__assign(__assign({}, silentRequest), { nativeBroker: NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeMessageHandler, silentRequest.authenticationScheme) }))];
                    case 2:
                        navigateUrl = _a.sent();
                        silentHandler = new SilentHandler(authClient, this.browserStorage, authCodeRequest, this.logger, this.config.system.navigateFrameWait);
                        return [4 /*yield*/, silentHandler.initiateAuthRequest(navigateUrl)];
                    case 3:
                        msalFrame = _a.sent();
                        return [4 /*yield*/, silentHandler.monitorIframeForHash(msalFrame, this.config.system.iframeHashTimeout)];
                    case 4:
                        hash = _a.sent();
                        serverParams = UrlString.getDeserializedHash(hash);
                        state = this.validateAndExtractStateFromHash(serverParams, InteractionType.Silent, authCodeRequest.correlationId);
                        if (serverParams.accountId) {
                            this.logger.verbose("Account id found in hash, calling WAM for token");
                            if (!this.nativeMessageHandler) {
                                throw BrowserAuthError.createNativeConnectionNotEstablishedError();
                            }
                            nativeInteractionClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, this.apiId, this.performanceClient, this.nativeMessageHandler, serverParams.accountId, this.browserStorage, this.correlationId);
                            userRequestState = ProtocolUtils.parseRequestState(this.browserCrypto, state).userRequestState;
                            return [2 /*return*/, nativeInteractionClient.acquireToken(__assign(__assign({}, silentRequest), { state: userRequestState, prompt: PromptValue.NONE })).finally(function () {
                                    _this.browserStorage.cleanRequestByState(state);
                                })];
                        }
                        // Handle response from hash string
                        return [2 /*return*/, silentHandler.handleCodeResponseFromHash(hash, state, authClient.authority, this.networkClient)];
                }
            });
        });
    };
    return SilentIframeClient;
}(StandardInteractionClient));

export { SilentIframeClient };
//# sourceMappingURL=SilentIframeClient.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __extends, __awaiter, __generator, __assign } from '../_virtual/_tslib.js';
import { StandardInteractionClient } from './StandardInteractionClient.js';
import { AuthError, PerformanceEvents, RefreshTokenClient } from '@azure/msal-common';
import { ApiId } from '../utils/BrowserConstants.js';
import { BrowserAuthError } from '../error/BrowserAuthError.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var SilentRefreshClient = /** @class */ (function (_super) {
    __extends(SilentRefreshClient, _super);
    function SilentRefreshClient() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    /**
     * Exchanges the refresh token for new tokens
     * @param request
     */
    SilentRefreshClient.prototype.acquireToken = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var silentRequest, _a, acquireTokenMeasurement, serverTelemetryManager, refreshTokenClient;
            var _this = this;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        _a = [__assign({}, request)];
                        return [4 /*yield*/, this.initializeBaseRequest(request)];
                    case 1:
                        silentRequest = __assign.apply(void 0, _a.concat([_b.sent()]));
                        acquireTokenMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.SilentRefreshClientAcquireToken, silentRequest.correlationId);
                        serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenSilent_silentFlow);
                        return [4 /*yield*/, this.createRefreshTokenClient(serverTelemetryManager, silentRequest.authority, silentRequest.azureCloudOptions)];
                    case 2:
                        refreshTokenClient = _b.sent();
                        this.logger.verbose("Refresh token client created");
                        // Send request to renew token. Auth module will throw errors if token cannot be renewed.
                        return [2 /*return*/, refreshTokenClient.acquireTokenByRefreshToken(silentRequest)
                                .then(function (result) {
                                acquireTokenMeasurement.endMeasurement({
                                    success: true,
                                    fromCache: result.fromCache
                                });
                                return result;
                            })
                                .catch(function (e) {
                                if (e instanceof AuthError) {
                                    e.setCorrelationId(_this.correlationId);
                                }
                                serverTelemetryManager.cacheFailedRequest(e);
                                acquireTokenMeasurement.endMeasurement({
                                    errorCode: e.errorCode,
                                    subErrorCode: e.subError,
                                    success: false
                                });
                                throw e;
                            })];
                }
            });
        });
    };
    /**
     * Currently Unsupported
     */
    SilentRefreshClient.prototype.logout = function () {
        // Synchronous so we must reject
        return Promise.reject(BrowserAuthError.createSilentLogoutUnsupportedError());
    };
    /**
     * Creates a Refresh Client with the given authority, or the default authority.
     * @param serverTelemetryManager
     * @param authorityUrl
     */
    SilentRefreshClient.prototype.createRefreshTokenClient = function (serverTelemetryManager, authorityUrl, azureCloudOptions) {
        return __awaiter(this, void 0, void 0, function () {
            var clientConfig;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.getClientConfiguration(serverTelemetryManager, authorityUrl, azureCloudOptions)];
                    case 1:
                        clientConfig = _a.sent();
                        return [2 /*return*/, new RefreshTokenClient(clientConfig, this.performanceClient)];
                }
            });
        });
    };
    return SilentRefreshClient;
}(StandardInteractionClient));

export { SilentRefreshClient };
//# sourceMappingURL=SilentRefreshClient.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __extends, __awaiter, __generator, __assign } from '../_virtual/_tslib.js';
import { UrlString, Constants, AuthorizationCodeClient, PerformanceEvents, Authority, AuthorityFactory, ResponseMode, StringUtils, ProtocolUtils } from '@azure/msal-common';
import { BaseInteractionClient } from './BaseInteractionClient.js';
import { BrowserConstants } from '../utils/BrowserConstants.js';
import { version } from '../packageMetadata.js';
import { BrowserAuthError } from '../error/BrowserAuthError.js';
import { BrowserProtocolUtils } from '../utils/BrowserProtocolUtils.js';
import { BrowserUtils } from '../utils/BrowserUtils.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Defines the class structure and helper functions used by the "standard", non-brokered auth flows (popup, redirect, silent (RT), silent (iframe))
 */
var StandardInteractionClient = /** @class */ (function (_super) {
    __extends(StandardInteractionClient, _super);
    function StandardInteractionClient() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    /**
     * Generates an auth code request tied to the url request.
     * @param request
     */
    StandardInteractionClient.prototype.initializeAuthorizationCodeRequest = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var generatedPkceParams, authCodeRequest;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.verbose("initializeAuthorizationRequest called", request.correlationId);
                        return [4 /*yield*/, this.browserCrypto.generatePkceCodes()];
                    case 1:
                        generatedPkceParams = _a.sent();
                        authCodeRequest = __assign(__assign({}, request), { redirectUri: request.redirectUri, code: Constants.EMPTY_STRING, codeVerifier: generatedPkceParams.verifier });
                        request.codeChallenge = generatedPkceParams.challenge;
                        request.codeChallengeMethod = Constants.S256_CODE_CHALLENGE_METHOD;
                        return [2 /*return*/, authCodeRequest];
                }
            });
        });
    };
    /**
     * Initializer for the logout request.
     * @param logoutRequest
     */
    StandardInteractionClient.prototype.initializeLogoutRequest = function (logoutRequest) {
        this.logger.verbose("initializeLogoutRequest called", logoutRequest === null || logoutRequest === void 0 ? void 0 : logoutRequest.correlationId);
        var validLogoutRequest = __assign({ correlationId: this.correlationId || this.browserCrypto.createNewGuid() }, logoutRequest);
        /**
         * Set logout_hint to be login_hint from ID Token Claims if present
         * and logoutHint attribute wasn't manually set in logout request
         */
        if (logoutRequest) {
            // If logoutHint isn't set and an account was passed in, try to extract logoutHint from ID Token Claims
            if (!logoutRequest.logoutHint) {
                if (logoutRequest.account) {
                    var logoutHint = this.getLogoutHintFromIdTokenClaims(logoutRequest.account);
                    if (logoutHint) {
                        this.logger.verbose("Setting logoutHint to login_hint ID Token Claim value for the account provided");
                        validLogoutRequest.logoutHint = logoutHint;
                    }
                }
                else {
                    this.logger.verbose("logoutHint was not set and account was not passed into logout request, logoutHint will not be set");
                }
            }
            else {
                this.logger.verbose("logoutHint has already been set in logoutRequest");
            }
        }
        else {
            this.logger.verbose("logoutHint will not be set since no logout request was configured");
        }
        /*
         * Only set redirect uri if logout request isn't provided or the set uri isn't null.
         * Otherwise, use passed uri, config, or current page.
         */
        if (!logoutRequest || logoutRequest.postLogoutRedirectUri !== null) {
            if (logoutRequest && logoutRequest.postLogoutRedirectUri) {
                this.logger.verbose("Setting postLogoutRedirectUri to uri set on logout request", validLogoutRequest.correlationId);
                validLogoutRequest.postLogoutRedirectUri = UrlString.getAbsoluteUrl(logoutRequest.postLogoutRedirectUri, BrowserUtils.getCurrentUri());
            }
            else if (this.config.auth.postLogoutRedirectUri === null) {
                this.logger.verbose("postLogoutRedirectUri configured as null and no uri set on request, not passing post logout redirect", validLogoutRequest.correlationId);
            }
            else if (this.config.auth.postLogoutRedirectUri) {
                this.logger.verbose("Setting postLogoutRedirectUri to configured uri", validLogoutRequest.correlationId);
                validLogoutRequest.postLogoutRedirectUri = UrlString.getAbsoluteUrl(this.config.auth.postLogoutRedirectUri, BrowserUtils.getCurrentUri());
            }
            else {
                this.logger.verbose("Setting postLogoutRedirectUri to current page", validLogoutRequest.correlationId);
                validLogoutRequest.postLogoutRedirectUri = UrlString.getAbsoluteUrl(BrowserUtils.getCurrentUri(), BrowserUtils.getCurrentUri());
            }
        }
        else {
            this.logger.verbose("postLogoutRedirectUri passed as null, not setting post logout redirect uri", validLogoutRequest.correlationId);
        }
        return validLogoutRequest;
    };
    /**
     * Parses login_hint ID Token Claim out of AccountInfo object to be used as
     * logout_hint in end session request.
     * @param account
     */
    StandardInteractionClient.prototype.getLogoutHintFromIdTokenClaims = function (account) {
        var idTokenClaims = account.idTokenClaims;
        if (idTokenClaims) {
            if (idTokenClaims.login_hint) {
                return idTokenClaims.login_hint;
            }
            else {
                this.logger.verbose("The ID Token Claims tied to the provided account do not contain a login_hint claim, logoutHint will not be added to logout request");
            }
        }
        else {
            this.logger.verbose("The provided account does not contain ID Token Claims, logoutHint will not be added to logout request");
        }
        return null;
    };
    /**
     * Creates an Authorization Code Client with the given authority, or the default authority.
     * @param serverTelemetryManager
     * @param authorityUrl
     */
    StandardInteractionClient.prototype.createAuthCodeClient = function (serverTelemetryManager, authorityUrl, requestAzureCloudOptions) {
        return __awaiter(this, void 0, void 0, function () {
            var clientConfig;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.getClientConfiguration(serverTelemetryManager, authorityUrl, requestAzureCloudOptions)];
                    case 1:
                        clientConfig = _a.sent();
                        return [2 /*return*/, new AuthorizationCodeClient(clientConfig)];
                }
            });
        });
    };
    /**
     * Creates a Client Configuration object with the given request authority, or the default authority.
     * @param serverTelemetryManager
     * @param requestAuthority
     * @param requestCorrelationId
     */
    StandardInteractionClient.prototype.getClientConfiguration = function (serverTelemetryManager, requestAuthority, requestAzureCloudOptions) {
        return __awaiter(this, void 0, void 0, function () {
            var discoveredAuthority;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.verbose("getClientConfiguration called", this.correlationId);
                        return [4 /*yield*/, this.getDiscoveredAuthority(requestAuthority, requestAzureCloudOptions)];
                    case 1:
                        discoveredAuthority = _a.sent();
                        return [2 /*return*/, {
                                authOptions: {
                                    clientId: this.config.auth.clientId,
                                    authority: discoveredAuthority,
                                    clientCapabilities: this.config.auth.clientCapabilities
                                },
                                systemOptions: {
                                    tokenRenewalOffsetSeconds: this.config.system.tokenRenewalOffsetSeconds,
                                    preventCorsPreflight: true
                                },
                                loggerOptions: {
                                    loggerCallback: this.config.system.loggerOptions.loggerCallback,
                                    piiLoggingEnabled: this.config.system.loggerOptions.piiLoggingEnabled,
                                    logLevel: this.config.system.loggerOptions.logLevel,
                                    correlationId: this.correlationId
                                },
                                cryptoInterface: this.browserCrypto,
                                networkInterface: this.networkClient,
                                storageInterface: this.browserStorage,
                                serverTelemetryManager: serverTelemetryManager,
                                libraryInfo: {
                                    sku: BrowserConstants.MSAL_SKU,
                                    version: version,
                                    cpu: Constants.EMPTY_STRING,
                                    os: Constants.EMPTY_STRING
                                },
                                telemetry: this.config.telemetry
                            }];
                }
            });
        });
    };
    /**
     * @param hash
     * @param interactionType
     */
    StandardInteractionClient.prototype.validateAndExtractStateFromHash = function (serverParams, interactionType, requestCorrelationId) {
        this.logger.verbose("validateAndExtractStateFromHash called", requestCorrelationId);
        if (!serverParams.state) {
            throw BrowserAuthError.createHashDoesNotContainStateError();
        }
        var platformStateObj = BrowserProtocolUtils.extractBrowserRequestState(this.browserCrypto, serverParams.state);
        if (!platformStateObj) {
            throw BrowserAuthError.createUnableToParseStateError();
        }
        if (platformStateObj.interactionType !== interactionType) {
            throw BrowserAuthError.createStateInteractionTypeMismatchError();
        }
        this.logger.verbose("Returning state from hash", requestCorrelationId);
        return serverParams.state;
    };
    /**
     * Used to get a discovered version of the default authority.
     * @param requestAuthority
     * @param requestCorrelationId
     */
    StandardInteractionClient.prototype.getDiscoveredAuthority = function (requestAuthority, requestAzureCloudOptions) {
        return __awaiter(this, void 0, void 0, function () {
            var getAuthorityMeasurement, authorityOptions, userAuthority, builtAuthority;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.verbose("getDiscoveredAuthority called", this.correlationId);
                        getAuthorityMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.StandardInteractionClientGetDiscoveredAuthority, this.correlationId);
                        authorityOptions = {
                            protocolMode: this.config.auth.protocolMode,
                            knownAuthorities: this.config.auth.knownAuthorities,
                            cloudDiscoveryMetadata: this.config.auth.cloudDiscoveryMetadata,
                            authorityMetadata: this.config.auth.authorityMetadata,
                            skipAuthorityMetadataCache: this.config.auth.skipAuthorityMetadataCache
                        };
                        userAuthority = requestAuthority ? requestAuthority : this.config.auth.authority;
                        builtAuthority = Authority.generateAuthority(userAuthority, requestAzureCloudOptions || this.config.auth.azureCloudOptions);
                        this.logger.verbose("Creating discovered authority with configured authority", this.correlationId);
                        return [4 /*yield*/, AuthorityFactory.createDiscoveredInstance(builtAuthority, this.config.system.networkClient, this.browserStorage, authorityOptions)
                                .then(function (result) {
                                getAuthorityMeasurement.endMeasurement({
                                    success: true
                                });
                                return result;
                            })
                                .catch(function (error) {
                                getAuthorityMeasurement.endMeasurement({
                                    errorCode: error.errorCode,
                                    subErrorCode: error.subError,
                                    success: false
                                });
                                throw error;
                            })];
                    case 1: return [2 /*return*/, _a.sent()];
                }
            });
        });
    };
    /**
     * Helper to initialize required request parameters for interactive APIs and ssoSilent()
     * @param request
     * @param interactionType
     */
    StandardInteractionClient.prototype.initializeAuthorizationRequest = function (request, interactionType) {
        return __awaiter(this, void 0, void 0, function () {
            var redirectUri, browserState, state, validatedRequest, _a, account, legacyLoginHint;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        this.logger.verbose("initializeAuthorizationRequest called", this.correlationId);
                        redirectUri = this.getRedirectUri(request.redirectUri);
                        browserState = {
                            interactionType: interactionType
                        };
                        state = ProtocolUtils.setRequestState(this.browserCrypto, (request && request.state) || Constants.EMPTY_STRING, browserState);
                        _a = [{}];
                        return [4 /*yield*/, this.initializeBaseRequest(request)];
                    case 1:
                        validatedRequest = __assign.apply(void 0, [__assign.apply(void 0, _a.concat([_b.sent()])), { redirectUri: redirectUri, state: state, nonce: request.nonce || this.browserCrypto.createNewGuid(), responseMode: ResponseMode.FRAGMENT }]);
                        account = request.account || this.browserStorage.getActiveAccount();
                        if (account) {
                            this.logger.verbose("Setting validated request account", this.correlationId);
                            this.logger.verbosePii("Setting validated request account: " + account.homeAccountId, this.correlationId);
                            validatedRequest.account = account;
                        }
                        // Check for ADAL/MSAL v1 SSO
                        if (StringUtils.isEmpty(validatedRequest.loginHint) && !account) {
                            legacyLoginHint = this.browserStorage.getLegacyLoginHint();
                            if (legacyLoginHint) {
                                validatedRequest.loginHint = legacyLoginHint;
                            }
                        }
                        return [2 /*return*/, validatedRequest];
                }
            });
        });
    };
    return StandardInteractionClient;
}(BaseInteractionClient));

export { StandardInteractionClient };
//# sourceMappingURL=StandardInteractionClient.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { AccountEntity, CacheManager } from '@azure/msal-common';
import { EventType } from './EventType.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var EventHandler = /** @class */ (function () {
    function EventHandler(logger, browserCrypto) {
        this.eventCallbacks = new Map();
        this.logger = logger;
        this.browserCrypto = browserCrypto;
        this.listeningToStorageEvents = false;
        this.handleAccountCacheChange = this.handleAccountCacheChange.bind(this);
    }
    /**
     * Adds event callbacks to array
     * @param callback
     */
    EventHandler.prototype.addEventCallback = function (callback) {
        if (typeof window !== "undefined") {
            var callbackId = this.browserCrypto.createNewGuid();
            this.eventCallbacks.set(callbackId, callback);
            this.logger.verbose("Event callback registered with id: " + callbackId);
            return callbackId;
        }
        return null;
    };
    /**
     * Removes callback with provided id from callback array
     * @param callbackId
     */
    EventHandler.prototype.removeEventCallback = function (callbackId) {
        this.eventCallbacks.delete(callbackId);
        this.logger.verbose("Event callback " + callbackId + " removed.");
    };
    /**
     * Adds event listener that emits an event when a user account is added or removed from localstorage in a different browser tab or window
     */
    EventHandler.prototype.enableAccountStorageEvents = function () {
        if (typeof window === "undefined") {
            return;
        }
        if (!this.listeningToStorageEvents) {
            this.logger.verbose("Adding account storage listener.");
            this.listeningToStorageEvents = true;
            window.addEventListener("storage", this.handleAccountCacheChange);
        }
        else {
            this.logger.verbose("Account storage listener already registered.");
        }
    };
    /**
     * Removes event listener that emits an event when a user account is added or removed from localstorage in a different browser tab or window
     */
    EventHandler.prototype.disableAccountStorageEvents = function () {
        if (typeof window === "undefined") {
            return;
        }
        if (this.listeningToStorageEvents) {
            this.logger.verbose("Removing account storage listener.");
            window.removeEventListener("storage", this.handleAccountCacheChange);
            this.listeningToStorageEvents = false;
        }
        else {
            this.logger.verbose("No account storage listener registered.");
        }
    };
    /**
     * Emits events by calling callback with event message
     * @param eventType
     * @param interactionType
     * @param payload
     * @param error
     */
    EventHandler.prototype.emitEvent = function (eventType, interactionType, payload, error) {
        var _this = this;
        if (typeof window !== "undefined") {
            var message_1 = {
                eventType: eventType,
                interactionType: interactionType || null,
                payload: payload || null,
                error: error || null,
                timestamp: Date.now()
            };
            this.logger.info("Emitting event: " + eventType);
            this.eventCallbacks.forEach(function (callback, callbackId) {
                _this.logger.verbose("Emitting event to callback " + callbackId + ": " + eventType);
                callback.apply(null, [message_1]);
            });
        }
    };
    /**
     * Emit account added/removed events when cached accounts are changed in a different tab or frame
     */
    EventHandler.prototype.handleAccountCacheChange = function (e) {
        try {
            var cacheValue = e.newValue || e.oldValue;
            if (!cacheValue) {
                return;
            }
            var parsedValue = JSON.parse(cacheValue);
            if (typeof parsedValue !== "object" || !AccountEntity.isAccountEntity(parsedValue)) {
                return;
            }
            var accountEntity = CacheManager.toObject(new AccountEntity(), parsedValue);
            var accountInfo = accountEntity.getAccountInfo();
            if (!e.oldValue && e.newValue) {
                this.logger.info("Account was added to cache in a different window");
                this.emitEvent(EventType.ACCOUNT_ADDED, undefined, accountInfo);
            }
            else if (!e.newValue && e.oldValue) {
                this.logger.info("Account was removed from cache in a different window");
                this.emitEvent(EventType.ACCOUNT_REMOVED, undefined, accountInfo);
            }
        }
        catch (e) {
            return;
        }
    };
    return EventHandler;
}());

export { EventHandler };
//# sourceMappingURL=EventHandler.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { EventType } from './EventType.js';
import { InteractionType, InteractionStatus } from '../utils/BrowserConstants.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var EventMessageUtils = /** @class */ (function () {
    function EventMessageUtils() {
    }
    /**
     * Gets interaction status from event message
     * @param message
     * @param currentStatus
     */
    EventMessageUtils.getInteractionStatusFromEvent = function (message, currentStatus) {
        switch (message.eventType) {
            case EventType.LOGIN_START:
                return InteractionStatus.Login;
            case EventType.SSO_SILENT_START:
                return InteractionStatus.SsoSilent;
            case EventType.ACQUIRE_TOKEN_START:
                if (message.interactionType === InteractionType.Redirect || message.interactionType === InteractionType.Popup) {
                    return InteractionStatus.AcquireToken;
                }
                break;
            case EventType.HANDLE_REDIRECT_START:
                return InteractionStatus.HandleRedirect;
            case EventType.LOGOUT_START:
                return InteractionStatus.Logout;
            case EventType.SSO_SILENT_SUCCESS:
            case EventType.SSO_SILENT_FAILURE:
                if (currentStatus && currentStatus !== InteractionStatus.SsoSilent) {
                    // Prevent this event from clearing any status other than ssoSilent
                    break;
                }
                return InteractionStatus.None;
            case EventType.LOGOUT_END:
                if (currentStatus && currentStatus !== InteractionStatus.Logout) {
                    // Prevent this event from clearing any status other than logout
                    break;
                }
                return InteractionStatus.None;
            case EventType.HANDLE_REDIRECT_END:
                if (currentStatus && currentStatus !== InteractionStatus.HandleRedirect) {
                    // Prevent this event from clearing any status other than handleRedirect
                    break;
                }
                return InteractionStatus.None;
            case EventType.LOGIN_SUCCESS:
            case EventType.LOGIN_FAILURE:
            case EventType.ACQUIRE_TOKEN_SUCCESS:
            case EventType.ACQUIRE_TOKEN_FAILURE:
                if (message.interactionType === InteractionType.Redirect || message.interactionType === InteractionType.Popup) {
                    if (currentStatus && currentStatus !== InteractionStatus.Login && currentStatus !== InteractionStatus.AcquireToken) {
                        // Prevent this event from clearing any status other than login or acquireToken
                        break;
                    }
                    return InteractionStatus.None;
                }
                break;
        }
        return null;
    };
    return EventMessageUtils;
}());

export { EventMessageUtils };
//# sourceMappingURL=EventMessage.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var EventType;
(function (EventType) {
    EventType["INITIALIZE_START"] = "msal:initializeStart";
    EventType["INITIALIZE_END"] = "msal:initializeEnd";
    EventType["ACCOUNT_ADDED"] = "msal:accountAdded";
    EventType["ACCOUNT_REMOVED"] = "msal:accountRemoved";
    EventType["LOGIN_START"] = "msal:loginStart";
    EventType["LOGIN_SUCCESS"] = "msal:loginSuccess";
    EventType["LOGIN_FAILURE"] = "msal:loginFailure";
    EventType["ACQUIRE_TOKEN_START"] = "msal:acquireTokenStart";
    EventType["ACQUIRE_TOKEN_SUCCESS"] = "msal:acquireTokenSuccess";
    EventType["ACQUIRE_TOKEN_FAILURE"] = "msal:acquireTokenFailure";
    EventType["ACQUIRE_TOKEN_NETWORK_START"] = "msal:acquireTokenFromNetworkStart";
    EventType["SSO_SILENT_START"] = "msal:ssoSilentStart";
    EventType["SSO_SILENT_SUCCESS"] = "msal:ssoSilentSuccess";
    EventType["SSO_SILENT_FAILURE"] = "msal:ssoSilentFailure";
    EventType["ACQUIRE_TOKEN_BY_CODE_START"] = "msal:acquireTokenByCodeStart";
    EventType["ACQUIRE_TOKEN_BY_CODE_SUCCESS"] = "msal:acquireTokenByCodeSuccess";
    EventType["ACQUIRE_TOKEN_BY_CODE_FAILURE"] = "msal:acquireTokenByCodeFailure";
    EventType["HANDLE_REDIRECT_START"] = "msal:handleRedirectStart";
    EventType["HANDLE_REDIRECT_END"] = "msal:handleRedirectEnd";
    EventType["POPUP_OPENED"] = "msal:popupOpened";
    EventType["LOGOUT_START"] = "msal:logoutStart";
    EventType["LOGOUT_SUCCESS"] = "msal:logoutSuccess";
    EventType["LOGOUT_FAILURE"] = "msal:logoutFailure";
    EventType["LOGOUT_END"] = "msal:logoutEnd";
})(EventType || (EventType = {}));

export { EventType };
//# sourceMappingURL=EventType.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __extends } from '../_virtual/_tslib.js';
import { StringUtils, AuthError } from '@azure/msal-common';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * BrowserAuthErrorMessage class containing string constants used by error codes and messages.
 */
var BrowserAuthErrorMessage = {
    pkceNotGenerated: {
        code: "pkce_not_created",
        desc: "The PKCE code challenge and verifier could not be generated."
    },
    cryptoDoesNotExist: {
        code: "crypto_nonexistent",
        desc: "The crypto object or function is not available."
    },
    httpMethodNotImplementedError: {
        code: "http_method_not_implemented",
        desc: "The HTTP method given has not been implemented in this library."
    },
    emptyNavigateUriError: {
        code: "empty_navigate_uri",
        desc: "Navigation URI is empty. Please check stack trace for more info."
    },
    hashEmptyError: {
        code: "hash_empty_error",
        desc: "Hash value cannot be processed because it is empty. Please verify that your redirectUri is not clearing the hash. For more visit: aka.ms/msaljs/browser-errors."
    },
    hashDoesNotContainStateError: {
        code: "no_state_in_hash",
        desc: "Hash does not contain state. Please verify that the request originated from msal."
    },
    hashDoesNotContainKnownPropertiesError: {
        code: "hash_does_not_contain_known_properties",
        desc: "Hash does not contain known properites. Please verify that your redirectUri is not changing the hash. For more visit: aka.ms/msaljs/browser-errors."
    },
    unableToParseStateError: {
        code: "unable_to_parse_state",
        desc: "Unable to parse state. Please verify that the request originated from msal."
    },
    stateInteractionTypeMismatchError: {
        code: "state_interaction_type_mismatch",
        desc: "Hash contains state but the interaction type does not match the caller."
    },
    interactionInProgress: {
        code: "interaction_in_progress",
        desc: "Interaction is currently in progress. Please ensure that this interaction has been completed before calling an interactive API.  For more visit: aka.ms/msaljs/browser-errors."
    },
    popupWindowError: {
        code: "popup_window_error",
        desc: "Error opening popup window. This can happen if you are using IE or if popups are blocked in the browser."
    },
    emptyWindowError: {
        code: "empty_window_error",
        desc: "window.open returned null or undefined window object."
    },
    userCancelledError: {
        code: "user_cancelled",
        desc: "User cancelled the flow."
    },
    monitorPopupTimeoutError: {
        code: "monitor_window_timeout",
        desc: "Token acquisition in popup failed due to timeout. For more visit: aka.ms/msaljs/browser-errors."
    },
    monitorIframeTimeoutError: {
        code: "monitor_window_timeout",
        desc: "Token acquisition in iframe failed due to timeout. For more visit: aka.ms/msaljs/browser-errors."
    },
    redirectInIframeError: {
        code: "redirect_in_iframe",
        desc: "Redirects are not supported for iframed or brokered applications. Please ensure you are using MSAL.js in a top frame of the window if using the redirect APIs, or use the popup APIs."
    },
    blockTokenRequestsInHiddenIframeError: {
        code: "block_iframe_reload",
        desc: "Request was blocked inside an iframe because MSAL detected an authentication response. For more visit: aka.ms/msaljs/browser-errors"
    },
    blockAcquireTokenInPopupsError: {
        code: "block_nested_popups",
        desc: "Request was blocked inside a popup because MSAL detected it was running in a popup."
    },
    iframeClosedPrematurelyError: {
        code: "iframe_closed_prematurely",
        desc: "The iframe being monitored was closed prematurely."
    },
    silentLogoutUnsupportedError: {
        code: "silent_logout_unsupported",
        desc: "Silent logout not supported. Please call logoutRedirect or logoutPopup instead."
    },
    noAccountError: {
        code: "no_account_error",
        desc: "No account object provided to acquireTokenSilent and no active account has been set. Please call setActiveAccount or provide an account on the request."
    },
    silentPromptValueError: {
        code: "silent_prompt_value_error",
        desc: "The value given for the prompt value is not valid for silent requests - must be set to 'none'."
    },
    noTokenRequestCacheError: {
        code: "no_token_request_cache_error",
        desc: "No token request found in cache."
    },
    unableToParseTokenRequestCacheError: {
        code: "unable_to_parse_token_request_cache_error",
        desc: "The cached token request could not be parsed."
    },
    noCachedAuthorityError: {
        code: "no_cached_authority_error",
        desc: "No cached authority found."
    },
    authRequestNotSet: {
        code: "auth_request_not_set_error",
        desc: "Auth Request not set. Please ensure initiateAuthRequest was called from the InteractionHandler"
    },
    invalidCacheType: {
        code: "invalid_cache_type",
        desc: "Invalid cache type"
    },
    notInBrowserEnvironment: {
        code: "non_browser_environment",
        desc: "Login and token requests are not supported in non-browser environments."
    },
    databaseNotOpen: {
        code: "database_not_open",
        desc: "Database is not open!"
    },
    noNetworkConnectivity: {
        code: "no_network_connectivity",
        desc: "No network connectivity. Check your internet connection."
    },
    postRequestFailed: {
        code: "post_request_failed",
        desc: "Network request failed: If the browser threw a CORS error, check that the redirectUri is registered in the Azure App Portal as type 'SPA'"
    },
    getRequestFailed: {
        code: "get_request_failed",
        desc: "Network request failed. Please check the network trace to determine root cause."
    },
    failedToParseNetworkResponse: {
        code: "failed_to_parse_response",
        desc: "Failed to parse network response. Check network trace."
    },
    unableToLoadTokenError: {
        code: "unable_to_load_token",
        desc: "Error loading token to cache."
    },
    signingKeyNotFoundInStorage: {
        code: "crypto_key_not_found",
        desc: "Cryptographic Key or Keypair not found in browser storage."
    },
    authCodeRequired: {
        code: "auth_code_required",
        desc: "An authorization code must be provided (as the `code` property on the request) to this flow."
    },
    authCodeOrNativeAccountRequired: {
        code: "auth_code_or_nativeAccountId_required",
        desc: "An authorization code or nativeAccountId must be provided to this flow."
    },
    databaseUnavailable: {
        code: "database_unavailable",
        desc: "IndexedDB, which is required for persistent cryptographic key storage, is unavailable. This may be caused by browser privacy features which block persistent storage in third-party contexts."
    },
    unableToAcquireTokenFromNativePlatform: {
        code: "unable_to_acquire_token_from_native_platform",
        desc: "Unable to acquire token from native platform. For a list of possible reasons visit aka.ms/msaljs/browser-errors."
    },
    nativeHandshakeTimeout: {
        code: "native_handshake_timeout",
        desc: "Timed out while attempting to establish connection to browser extension"
    },
    nativeExtensionNotInstalled: {
        code: "native_extension_not_installed",
        desc: "Native extension is not installed. If you think this is a mistake call the initialize function."
    },
    nativeConnectionNotEstablished: {
        code: "native_connection_not_established",
        desc: "Connection to native platform has not been established. Please install a compatible browser extension and run initialize(). For more please visit aka.ms/msaljs/browser-errors."
    },
    nativeBrokerCalledBeforeInitialize: {
        code: "native_broker_called_before_initialize",
        desc: "You must call and await the initialize function before attempting to call any other MSAL API when native brokering is enabled. For more please visit aka.ms/msaljs/browser-errors."
    },
    nativePromptNotSupported: {
        code: "native_prompt_not_supported",
        desc: "The provided prompt is not supported by the native platform. This request should be routed to the web based flow."
    }
};
/**
 * Browser library error class thrown by the MSAL.js library for SPAs
 */
var BrowserAuthError = /** @class */ (function (_super) {
    __extends(BrowserAuthError, _super);
    function BrowserAuthError(errorCode, errorMessage) {
        var _this = _super.call(this, errorCode, errorMessage) || this;
        Object.setPrototypeOf(_this, BrowserAuthError.prototype);
        _this.name = "BrowserAuthError";
        return _this;
    }
    /**
     * Creates an error thrown when PKCE is not implemented.
     * @param errDetail
     */
    BrowserAuthError.createPkceNotGeneratedError = function (errDetail) {
        return new BrowserAuthError(BrowserAuthErrorMessage.pkceNotGenerated.code, BrowserAuthErrorMessage.pkceNotGenerated.desc + " Detail:" + errDetail);
    };
    /**
     * Creates an error thrown when the crypto object is unavailable.
     * @param errDetail
     */
    BrowserAuthError.createCryptoNotAvailableError = function (errDetail) {
        return new BrowserAuthError(BrowserAuthErrorMessage.cryptoDoesNotExist.code, BrowserAuthErrorMessage.cryptoDoesNotExist.desc + " Detail:" + errDetail);
    };
    /**
     * Creates an error thrown when an HTTP method hasn't been implemented by the browser class.
     * @param method
     */
    BrowserAuthError.createHttpMethodNotImplementedError = function (method) {
        return new BrowserAuthError(BrowserAuthErrorMessage.httpMethodNotImplementedError.code, BrowserAuthErrorMessage.httpMethodNotImplementedError.desc + " Given Method: " + method);
    };
    /**
     * Creates an error thrown when the navigation URI is empty.
     */
    BrowserAuthError.createEmptyNavigationUriError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.emptyNavigateUriError.code, BrowserAuthErrorMessage.emptyNavigateUriError.desc);
    };
    /**
     * Creates an error thrown when the hash string value is unexpectedly empty.
     * @param hashValue
     */
    BrowserAuthError.createEmptyHashError = function (hashValue) {
        return new BrowserAuthError(BrowserAuthErrorMessage.hashEmptyError.code, BrowserAuthErrorMessage.hashEmptyError.desc + " Given Url: " + hashValue);
    };
    /**
     * Creates an error thrown when the hash string value is unexpectedly empty.
     */
    BrowserAuthError.createHashDoesNotContainStateError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.hashDoesNotContainStateError.code, BrowserAuthErrorMessage.hashDoesNotContainStateError.desc);
    };
    /**
     * Creates an error thrown when the hash string value does not contain known properties
     */
    BrowserAuthError.createHashDoesNotContainKnownPropertiesError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.hashDoesNotContainKnownPropertiesError.code, BrowserAuthErrorMessage.hashDoesNotContainKnownPropertiesError.desc);
    };
    /**
     * Creates an error thrown when the hash string value is unexpectedly empty.
     */
    BrowserAuthError.createUnableToParseStateError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.unableToParseStateError.code, BrowserAuthErrorMessage.unableToParseStateError.desc);
    };
    /**
     * Creates an error thrown when the state value in the hash does not match the interaction type of the API attempting to consume it.
     */
    BrowserAuthError.createStateInteractionTypeMismatchError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.stateInteractionTypeMismatchError.code, BrowserAuthErrorMessage.stateInteractionTypeMismatchError.desc);
    };
    /**
     * Creates an error thrown when a browser interaction (redirect or popup) is in progress.
     */
    BrowserAuthError.createInteractionInProgressError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.interactionInProgress.code, BrowserAuthErrorMessage.interactionInProgress.desc);
    };
    /**
     * Creates an error thrown when the popup window could not be opened.
     * @param errDetail
     */
    BrowserAuthError.createPopupWindowError = function (errDetail) {
        var errorMessage = BrowserAuthErrorMessage.popupWindowError.desc;
        errorMessage = !StringUtils.isEmpty(errDetail) ? errorMessage + " Details: " + errDetail : errorMessage;
        return new BrowserAuthError(BrowserAuthErrorMessage.popupWindowError.code, errorMessage);
    };
    /**
     * Creates an error thrown when window.open returns an empty window object.
     * @param errDetail
     */
    BrowserAuthError.createEmptyWindowCreatedError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.emptyWindowError.code, BrowserAuthErrorMessage.emptyWindowError.desc);
    };
    /**
     * Creates an error thrown when the user closes a popup.
     */
    BrowserAuthError.createUserCancelledError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.userCancelledError.code, BrowserAuthErrorMessage.userCancelledError.desc);
    };
    /**
     * Creates an error thrown when monitorPopupFromHash times out for a given popup.
     */
    BrowserAuthError.createMonitorPopupTimeoutError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.monitorPopupTimeoutError.code, BrowserAuthErrorMessage.monitorPopupTimeoutError.desc);
    };
    /**
     * Creates an error thrown when monitorIframeFromHash times out for a given iframe.
     */
    BrowserAuthError.createMonitorIframeTimeoutError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.monitorIframeTimeoutError.code, BrowserAuthErrorMessage.monitorIframeTimeoutError.desc);
    };
    /**
     * Creates an error thrown when navigateWindow is called inside an iframe or brokered applications.
     * @param windowParentCheck
     */
    BrowserAuthError.createRedirectInIframeError = function (windowParentCheck) {
        return new BrowserAuthError(BrowserAuthErrorMessage.redirectInIframeError.code, BrowserAuthErrorMessage.redirectInIframeError.desc + " (window.parent !== window) => " + windowParentCheck);
    };
    /**
     * Creates an error thrown when an auth reload is done inside an iframe.
     */
    BrowserAuthError.createBlockReloadInHiddenIframeError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.blockTokenRequestsInHiddenIframeError.code, BrowserAuthErrorMessage.blockTokenRequestsInHiddenIframeError.desc);
    };
    /**
     * Creates an error thrown when a popup attempts to call an acquireToken API
     * @returns
     */
    BrowserAuthError.createBlockAcquireTokenInPopupsError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.blockAcquireTokenInPopupsError.code, BrowserAuthErrorMessage.blockAcquireTokenInPopupsError.desc);
    };
    /**
     * Creates an error thrown when an iframe is found to be closed before the timeout is reached.
     */
    BrowserAuthError.createIframeClosedPrematurelyError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.iframeClosedPrematurelyError.code, BrowserAuthErrorMessage.iframeClosedPrematurelyError.desc);
    };
    /**
     * Creates an error thrown when the logout API is called on any of the silent interaction clients
     */
    BrowserAuthError.createSilentLogoutUnsupportedError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.silentLogoutUnsupportedError.code, BrowserAuthErrorMessage.silentLogoutUnsupportedError.desc);
    };
    /**
     * Creates an error thrown when the account object is not provided in the acquireTokenSilent API.
     */
    BrowserAuthError.createNoAccountError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.noAccountError.code, BrowserAuthErrorMessage.noAccountError.desc);
    };
    /**
     * Creates an error thrown when a given prompt value is invalid for silent requests.
     */
    BrowserAuthError.createSilentPromptValueError = function (givenPrompt) {
        return new BrowserAuthError(BrowserAuthErrorMessage.silentPromptValueError.code, BrowserAuthErrorMessage.silentPromptValueError.desc + " Given value: " + givenPrompt);
    };
    /**
     * Creates an error thrown when the cached token request could not be retrieved from the cache
     */
    BrowserAuthError.createUnableToParseTokenRequestCacheError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.unableToParseTokenRequestCacheError.code, BrowserAuthErrorMessage.unableToParseTokenRequestCacheError.desc);
    };
    /**
     * Creates an error thrown when the token request could not be retrieved from the cache
     */
    BrowserAuthError.createNoTokenRequestCacheError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.noTokenRequestCacheError.code, BrowserAuthErrorMessage.noTokenRequestCacheError.desc);
    };
    /**
     * Creates an error thrown when handleCodeResponse is called before initiateAuthRequest (InteractionHandler)
     */
    BrowserAuthError.createAuthRequestNotSetError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.authRequestNotSet.code, BrowserAuthErrorMessage.authRequestNotSet.desc);
    };
    /**
     * Creates an error thrown when the authority could not be retrieved from the cache
     */
    BrowserAuthError.createNoCachedAuthorityError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.noCachedAuthorityError.code, BrowserAuthErrorMessage.noCachedAuthorityError.desc);
    };
    /**
     * Creates an error thrown if cache type is invalid.
     */
    BrowserAuthError.createInvalidCacheTypeError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.invalidCacheType.code, "" + BrowserAuthErrorMessage.invalidCacheType.desc);
    };
    /**
     * Create an error thrown when login and token requests are made from a non-browser environment
     */
    BrowserAuthError.createNonBrowserEnvironmentError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.notInBrowserEnvironment.code, BrowserAuthErrorMessage.notInBrowserEnvironment.desc);
    };
    /**
     * Create an error thrown when indexDB database is not open
     */
    BrowserAuthError.createDatabaseNotOpenError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.databaseNotOpen.code, BrowserAuthErrorMessage.databaseNotOpen.desc);
    };
    /**
     * Create an error thrown when token fetch fails due to no internet
     */
    BrowserAuthError.createNoNetworkConnectivityError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.noNetworkConnectivity.code, BrowserAuthErrorMessage.noNetworkConnectivity.desc);
    };
    /**
     * Create an error thrown when token fetch fails due to reasons other than internet connectivity
     */
    BrowserAuthError.createPostRequestFailedError = function (errorDesc, endpoint) {
        return new BrowserAuthError(BrowserAuthErrorMessage.postRequestFailed.code, BrowserAuthErrorMessage.postRequestFailed.desc + " | Network client threw: " + errorDesc + " | Attempted to reach: " + endpoint.split("?")[0]);
    };
    /**
     * Create an error thrown when get request fails due to reasons other than internet connectivity
     */
    BrowserAuthError.createGetRequestFailedError = function (errorDesc, endpoint) {
        return new BrowserAuthError(BrowserAuthErrorMessage.getRequestFailed.code, BrowserAuthErrorMessage.getRequestFailed.desc + " | Network client threw: " + errorDesc + " | Attempted to reach: " + endpoint.split("?")[0]);
    };
    /**
     * Create an error thrown when network client fails to parse network response
     */
    BrowserAuthError.createFailedToParseNetworkResponseError = function (endpoint) {
        return new BrowserAuthError(BrowserAuthErrorMessage.failedToParseNetworkResponse.code, BrowserAuthErrorMessage.failedToParseNetworkResponse.desc + " | Attempted to reach: " + endpoint.split("?")[0]);
    };
    /**
     * Create an error thrown when the necessary information is not available to sideload tokens
     */
    BrowserAuthError.createUnableToLoadTokenError = function (errorDetail) {
        return new BrowserAuthError(BrowserAuthErrorMessage.unableToLoadTokenError.code, BrowserAuthErrorMessage.unableToLoadTokenError.desc + " | " + errorDetail);
    };
    /**
     * Create an error thrown when the queried cryptographic key is not found in IndexedDB
     */
    BrowserAuthError.createSigningKeyNotFoundInStorageError = function (keyId) {
        return new BrowserAuthError(BrowserAuthErrorMessage.signingKeyNotFoundInStorage.code, BrowserAuthErrorMessage.signingKeyNotFoundInStorage.desc + " | No match found for KeyId: " + keyId);
    };
    /**
     * Create an error when an authorization code is required but not provided
     */
    BrowserAuthError.createAuthCodeRequiredError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.authCodeRequired.code, BrowserAuthErrorMessage.authCodeRequired.desc);
    };
    /**
     * Create an error when an authorization code or native account ID is required but not provided
     */
    BrowserAuthError.createAuthCodeOrNativeAccountIdRequiredError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.authCodeOrNativeAccountRequired.code, BrowserAuthErrorMessage.authCodeOrNativeAccountRequired.desc);
    };
    /**
     * Create an error when IndexedDB is unavailable
     */
    BrowserAuthError.createDatabaseUnavailableError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.databaseUnavailable.code, BrowserAuthErrorMessage.databaseUnavailable.desc);
    };
    /**
     * Create an error when native token acquisition is not possible
     */
    BrowserAuthError.createUnableToAcquireTokenFromNativePlatformError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.unableToAcquireTokenFromNativePlatform.code, BrowserAuthErrorMessage.unableToAcquireTokenFromNativePlatform.desc);
    };
    /**
     * Create an error thrown when Handshake with browser extension times out
     */
    BrowserAuthError.createNativeHandshakeTimeoutError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.nativeHandshakeTimeout.code, BrowserAuthErrorMessage.nativeHandshakeTimeout.desc);
    };
    /**
     * Create an error thrown when browser extension is not installed
     */
    BrowserAuthError.createNativeExtensionNotInstalledError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.nativeExtensionNotInstalled.code, BrowserAuthErrorMessage.nativeExtensionNotInstalled.desc);
    };
    /**
     * Create an error when native connection has not been established
     * @returns
     */
    BrowserAuthError.createNativeConnectionNotEstablishedError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.nativeConnectionNotEstablished.code, BrowserAuthErrorMessage.nativeConnectionNotEstablished.desc);
    };
    /**
     * Create an error thrown when the initialize function hasn't been called
     */
    BrowserAuthError.createNativeBrokerCalledBeforeInitialize = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.nativeBrokerCalledBeforeInitialize.code, BrowserAuthErrorMessage.nativeBrokerCalledBeforeInitialize.desc);
    };
    /**
     * Create an error thrown when requesting a token directly from the native platform with an unsupported prompt parameter e.g. select_account, login or create
     * These requests must go through eSTS to ensure eSTS is aware of the new account
     */
    BrowserAuthError.createNativePromptParameterNotSupportedError = function () {
        return new BrowserAuthError(BrowserAuthErrorMessage.nativePromptNotSupported.code, BrowserAuthErrorMessage.nativePromptNotSupported.desc);
    };
    return BrowserAuthError;
}(AuthError));

export { BrowserAuthError, BrowserAuthErrorMessage };
//# sourceMappingURL=BrowserAuthError.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __extends } from '../_virtual/_tslib.js';
import { AuthError } from '@azure/msal-common';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * BrowserAuthErrorMessage class containing string constants used by error codes and messages.
 */
var BrowserConfigurationAuthErrorMessage = {
    redirectUriNotSet: {
        code: "redirect_uri_empty",
        desc: "A redirect URI is required for all calls, and none has been set."
    },
    postLogoutUriNotSet: {
        code: "post_logout_uri_empty",
        desc: "A post logout redirect has not been set."
    },
    storageNotSupportedError: {
        code: "storage_not_supported",
        desc: "Given storage configuration option was not supported."
    },
    noRedirectCallbacksSet: {
        code: "no_redirect_callbacks",
        desc: "No redirect callbacks have been set. Please call setRedirectCallbacks() with the appropriate function arguments before continuing. " +
            "More information is available here: https://github.com/AzureAD/microsoft-authentication-library-for-js/wiki/MSAL-basics."
    },
    invalidCallbackObject: {
        code: "invalid_callback_object",
        desc: "The object passed for the callback was invalid. " +
            "More information is available here: https://github.com/AzureAD/microsoft-authentication-library-for-js/wiki/MSAL-basics."
    },
    stubPcaInstanceCalled: {
        code: "stubbed_public_client_application_called",
        desc: "Stub instance of Public Client Application was called. If using msal-react, please ensure context is not used without a provider. For more visit: aka.ms/msaljs/browser-errors"
    },
    inMemRedirectUnavailable: {
        code: "in_mem_redirect_unavailable",
        desc: "Redirect cannot be supported. In-memory storage was selected and storeAuthStateInCookie=false, which would cause the library to be unable to handle the incoming hash. If you would like to use the redirect API, please use session/localStorage or set storeAuthStateInCookie=true."
    }
};
/**
 * Browser library error class thrown by the MSAL.js library for SPAs
 */
var BrowserConfigurationAuthError = /** @class */ (function (_super) {
    __extends(BrowserConfigurationAuthError, _super);
    function BrowserConfigurationAuthError(errorCode, errorMessage) {
        var _this = _super.call(this, errorCode, errorMessage) || this;
        _this.name = "BrowserConfigurationAuthError";
        Object.setPrototypeOf(_this, BrowserConfigurationAuthError.prototype);
        return _this;
    }
    /**
     * Creates an error thrown when the redirect uri is empty (not set by caller)
     */
    BrowserConfigurationAuthError.createRedirectUriEmptyError = function () {
        return new BrowserConfigurationAuthError(BrowserConfigurationAuthErrorMessage.redirectUriNotSet.code, BrowserConfigurationAuthErrorMessage.redirectUriNotSet.desc);
    };
    /**
     * Creates an error thrown when the post-logout redirect uri is empty (not set by caller)
     */
    BrowserConfigurationAuthError.createPostLogoutRedirectUriEmptyError = function () {
        return new BrowserConfigurationAuthError(BrowserConfigurationAuthErrorMessage.postLogoutUriNotSet.code, BrowserConfigurationAuthErrorMessage.postLogoutUriNotSet.desc);
    };
    /**
     * Creates error thrown when given storage location is not supported.
     * @param givenStorageLocation
     */
    BrowserConfigurationAuthError.createStorageNotSupportedError = function (givenStorageLocation) {
        return new BrowserConfigurationAuthError(BrowserConfigurationAuthErrorMessage.storageNotSupportedError.code, BrowserConfigurationAuthErrorMessage.storageNotSupportedError.desc + " Given Location: " + givenStorageLocation);
    };
    /**
     * Creates error thrown when redirect callbacks are not set before calling loginRedirect() or acquireTokenRedirect().
     */
    BrowserConfigurationAuthError.createRedirectCallbacksNotSetError = function () {
        return new BrowserConfigurationAuthError(BrowserConfigurationAuthErrorMessage.noRedirectCallbacksSet.code, BrowserConfigurationAuthErrorMessage.noRedirectCallbacksSet.desc);
    };
    /**
     * Creates error thrown when the stub instance of PublicClientApplication is called.
     */
    BrowserConfigurationAuthError.createStubPcaInstanceCalledError = function () {
        return new BrowserConfigurationAuthError(BrowserConfigurationAuthErrorMessage.stubPcaInstanceCalled.code, BrowserConfigurationAuthErrorMessage.stubPcaInstanceCalled.desc);
    };
    /*
     * Create an error thrown when in-memory storage is used and storeAuthStateInCookie=false.
     */
    BrowserConfigurationAuthError.createInMemoryRedirectUnavailableError = function () {
        return new BrowserConfigurationAuthError(BrowserConfigurationAuthErrorMessage.inMemRedirectUnavailable.code, BrowserConfigurationAuthErrorMessage.inMemRedirectUnavailable.desc);
    };
    return BrowserConfigurationAuthError;
}(AuthError));

export { BrowserConfigurationAuthError, BrowserConfigurationAuthErrorMessage };
//# sourceMappingURL=BrowserConfigurationAuthError.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __extends } from '../_virtual/_tslib.js';
import { InteractionRequiredAuthError, AuthError } from '@azure/msal-common';
import { BrowserAuthError } from './BrowserAuthError.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var NativeStatusCode;
(function (NativeStatusCode) {
    NativeStatusCode["USER_INTERACTION_REQUIRED"] = "USER_INTERACTION_REQUIRED";
    NativeStatusCode["USER_CANCEL"] = "USER_CANCEL";
    NativeStatusCode["NO_NETWORK"] = "NO_NETWORK";
    NativeStatusCode["TRANSIENT_ERROR"] = "TRANSIENT_ERROR";
    NativeStatusCode["PERSISTENT_ERROR"] = "PERSISTENT_ERROR";
    NativeStatusCode["DISABLED"] = "DISABLED";
    NativeStatusCode["ACCOUNT_UNAVAILABLE"] = "ACCOUNT_UNAVAILABLE";
})(NativeStatusCode || (NativeStatusCode = {}));
var NativeAuthErrorMessage = {
    extensionError: {
        code: "ContentError"
    },
    userSwitch: {
        code: "user_switch",
        desc: "User attempted to switch accounts in the native broker, which is not allowed. All new accounts must sign-in through the standard web flow first, please try again."
    },
    tokensNotFoundInCache: {
        code: "tokens_not_found_in_internal_memory_cache",
        desc: "Tokens not cached in MSAL JS internal memory, please make the WAM request"
    }
};
var NativeAuthError = /** @class */ (function (_super) {
    __extends(NativeAuthError, _super);
    function NativeAuthError(errorCode, description, ext) {
        var _this = _super.call(this, errorCode, description) || this;
        Object.setPrototypeOf(_this, NativeAuthError.prototype);
        _this.name = "NativeAuthError";
        _this.ext = ext;
        return _this;
    }
    /**
     * These errors should result in a fallback to the 'standard' browser based auth flow.
     */
    NativeAuthError.prototype.isFatal = function () {
        if (this.ext && this.ext.status && (this.ext.status === NativeStatusCode.PERSISTENT_ERROR || this.ext.status === NativeStatusCode.DISABLED)) {
            return true;
        }
        switch (this.errorCode) {
            case NativeAuthErrorMessage.extensionError.code:
                return true;
            default:
                return false;
        }
    };
    /**
     * Create the appropriate error object based on the WAM status code.
     * @param code
     * @param description
     * @param ext
     * @returns
     */
    NativeAuthError.createError = function (code, description, ext) {
        if (ext && ext.status) {
            switch (ext.status) {
                case NativeStatusCode.ACCOUNT_UNAVAILABLE:
                    return InteractionRequiredAuthError.createNativeAccountUnavailableError();
                case NativeStatusCode.USER_INTERACTION_REQUIRED:
                    return new InteractionRequiredAuthError(code, description);
                case NativeStatusCode.USER_CANCEL:
                    return BrowserAuthError.createUserCancelledError();
                case NativeStatusCode.NO_NETWORK:
                    return BrowserAuthError.createNoNetworkConnectivityError();
            }
        }
        return new NativeAuthError(code, description, ext);
    };
    /**
     * Creates user switch error when the user chooses a different account in the native broker prompt
     * @returns
     */
    NativeAuthError.createUserSwitchError = function () {
        return new NativeAuthError(NativeAuthErrorMessage.userSwitch.code, NativeAuthErrorMessage.userSwitch.desc);
    };
    /**
     * Creates a tokens not found error when the internal cache look up fails
     * @returns NativeAuthError: tokensNotFoundInCache
     */
    NativeAuthError.createTokensNotFoundInCacheError = function () {
        return new NativeAuthError(NativeAuthErrorMessage.tokensNotFoundInCache.code, NativeAuthErrorMessage.tokensNotFoundInCache.desc);
    };
    return NativeAuthError;
}(AuthError));

export { NativeAuthError, NativeAuthErrorMessage, NativeStatusCode };
//# sourceMappingURL=NativeAuthError.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { Constants } from '@azure/msal-common';
import { BrowserStringUtils } from '../utils/BrowserStringUtils.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Class which exposes APIs to decode base64 strings to plaintext. See here for implementation details:
 * https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#Solution_2_%E2%80%93_JavaScript's_UTF-16_%3E_UTF-8_%3E_base64
 */
var Base64Decode = /** @class */ (function () {
    function Base64Decode() {
    }
    /**
     * Returns a URL-safe plaintext decoded string from b64 encoded input.
     * @param input
     */
    Base64Decode.prototype.decode = function (input) {
        var encodedString = input.replace(/-/g, "+").replace(/_/g, "/");
        switch (encodedString.length % 4) {
            case 0:
                break;
            case 2:
                encodedString += "==";
                break;
            case 3:
                encodedString += "=";
                break;
            default:
                throw new Error("Invalid base64 string");
        }
        var inputUtf8Arr = this.base64DecToArr(encodedString);
        return BrowserStringUtils.utf8ArrToString(inputUtf8Arr);
    };
    /**
     * Decodes base64 into Uint8Array
     * @param base64String
     * @param nBlockSize
     */
    Base64Decode.prototype.base64DecToArr = function (base64String, nBlockSize) {
        var sB64Enc = base64String.replace(/[^A-Za-z0-9\+\/]/g, Constants.EMPTY_STRING);
        var nInLen = sB64Enc.length;
        var nOutLen = nBlockSize ? Math.ceil((nInLen * 3 + 1 >>> 2) / nBlockSize) * nBlockSize : nInLen * 3 + 1 >>> 2;
        var aBytes = new Uint8Array(nOutLen);
        for (var nMod3 = void 0, nMod4 = void 0, nUint24 = 0, nOutIdx = 0, nInIdx = 0; nInIdx < nInLen; nInIdx++) {
            nMod4 = nInIdx & 3;
            nUint24 |= this.b64ToUint6(sB64Enc.charCodeAt(nInIdx)) << 18 - 6 * nMod4;
            if (nMod4 === 3 || nInLen - nInIdx === 1) {
                for (nMod3 = 0; nMod3 < 3 && nOutIdx < nOutLen; nMod3++, nOutIdx++) {
                    aBytes[nOutIdx] = nUint24 >>> (16 >>> nMod3 & 24) & 255;
                }
                nUint24 = 0;
            }
        }
        return aBytes;
    };
    /**
     * Base64 string to array decoding helper
     * @param charNum
     */
    Base64Decode.prototype.b64ToUint6 = function (charNum) {
        return charNum > 64 && charNum < 91 ?
            charNum - 65
            : charNum > 96 && charNum < 123 ?
                charNum - 71
                : charNum > 47 && charNum < 58 ?
                    charNum + 4
                    : charNum === 43 ?
                        62
                        : charNum === 47 ?
                            63
                            :
                                0;
    };
    return Base64Decode;
}());

export { Base64Decode };
//# sourceMappingURL=Base64Decode.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { Constants } from '@azure/msal-common';
import { BrowserStringUtils } from '../utils/BrowserStringUtils.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Class which exposes APIs to encode plaintext to base64 encoded string. See here for implementation details:
 * https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#Solution_2_%E2%80%93_JavaScript's_UTF-16_%3E_UTF-8_%3E_base64
 */
var Base64Encode = /** @class */ (function () {
    function Base64Encode() {
    }
    /**
     * Returns URL Safe b64 encoded string from a plaintext string.
     * @param input
     */
    Base64Encode.prototype.urlEncode = function (input) {
        return encodeURIComponent(this.encode(input)
            .replace(/=/g, Constants.EMPTY_STRING)
            .replace(/\+/g, "-")
            .replace(/\//g, "_"));
    };
    /**
     * Returns URL Safe b64 encoded string from an int8Array.
     * @param inputArr
     */
    Base64Encode.prototype.urlEncodeArr = function (inputArr) {
        return this.base64EncArr(inputArr)
            .replace(/=/g, Constants.EMPTY_STRING)
            .replace(/\+/g, "-")
            .replace(/\//g, "_");
    };
    /**
     * Returns b64 encoded string from plaintext string.
     * @param input
     */
    Base64Encode.prototype.encode = function (input) {
        var inputUtf8Arr = BrowserStringUtils.stringToUtf8Arr(input);
        return this.base64EncArr(inputUtf8Arr);
    };
    /**
     * Base64 encode byte array
     * @param aBytes
     */
    Base64Encode.prototype.base64EncArr = function (aBytes) {
        var eqLen = (3 - (aBytes.length % 3)) % 3;
        var sB64Enc = Constants.EMPTY_STRING;
        for (var nMod3 = void 0, nLen = aBytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; nIdx++) {
            nMod3 = nIdx % 3;
            /* Uncomment the following line in order to split the output in lines 76-character long: */
            /*
             *if (nIdx > 0 && (nIdx * 4 / 3) % 76 === 0) { sB64Enc += "\r\n"; }
             */
            nUint24 |= aBytes[nIdx] << (16 >>> nMod3 & 24);
            if (nMod3 === 2 || aBytes.length - nIdx === 1) {
                sB64Enc += String.fromCharCode(this.uint6ToB64(nUint24 >>> 18 & 63), this.uint6ToB64(nUint24 >>> 12 & 63), this.uint6ToB64(nUint24 >>> 6 & 63), this.uint6ToB64(nUint24 & 63));
                nUint24 = 0;
            }
        }
        return eqLen === 0 ? sB64Enc : sB64Enc.substring(0, sB64Enc.length - eqLen) + (eqLen === 1 ? "=" : "==");
    };
    /**
     * Base64 string to array encoding helper
     * @param nUint6
     */
    Base64Encode.prototype.uint6ToB64 = function (nUint6) {
        return nUint6 < 26 ?
            nUint6 + 65
            : nUint6 < 52 ?
                nUint6 + 71
                : nUint6 < 62 ?
                    nUint6 - 4
                    : nUint6 === 62 ?
                        43
                        : nUint6 === 63 ?
                            47
                            :
                                65;
    };
    return Base64Encode;
}());

export { Base64Encode };
//# sourceMappingURL=Base64Encode.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __awaiter, __generator } from '../_virtual/_tslib.js';
import { BrowserStringUtils } from '../utils/BrowserStringUtils.js';
import { BrowserAuthError } from '../error/BrowserAuthError.js';
import { KEY_FORMAT_JWK } from '../utils/BrowserConstants.js';
import { Constants } from '@azure/msal-common';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * See here for more info on RsaHashedKeyGenParams: https://developer.mozilla.org/en-US/docs/Web/API/RsaHashedKeyGenParams
 */
// RSA KeyGen Algorithm
var PKCS1_V15_KEYGEN_ALG = "RSASSA-PKCS1-v1_5";
// SHA-256 hashing algorithm
var S256_HASH_ALG = "SHA-256";
// MOD length for PoP tokens
var MODULUS_LENGTH = 2048;
// Public Exponent
var PUBLIC_EXPONENT = new Uint8Array([0x01, 0x00, 0x01]);
/**
 * This class implements functions used by the browser library to perform cryptography operations such as
 * hashing and encoding. It also has helper functions to validate the availability of specific APIs.
 */
var BrowserCrypto = /** @class */ (function () {
    function BrowserCrypto(logger) {
        this.logger = logger;
        if (!(this.hasCryptoAPI())) {
            throw BrowserAuthError.createCryptoNotAvailableError("Browser crypto or msCrypto object not available.");
        }
        this._keygenAlgorithmOptions = {
            name: PKCS1_V15_KEYGEN_ALG,
            hash: S256_HASH_ALG,
            modulusLength: MODULUS_LENGTH,
            publicExponent: PUBLIC_EXPONENT
        };
    }
    /**
     * Returns a sha-256 hash of the given dataString as an ArrayBuffer.
     * @param dataString
     */
    BrowserCrypto.prototype.sha256Digest = function (dataString) {
        return __awaiter(this, void 0, void 0, function () {
            var data;
            return __generator(this, function (_a) {
                data = BrowserStringUtils.stringToUtf8Arr(dataString);
                return [2 /*return*/, this.hasIECrypto() ? this.getMSCryptoDigest(S256_HASH_ALG, data) : this.getSubtleCryptoDigest(S256_HASH_ALG, data)];
            });
        });
    };
    /**
     * Populates buffer with cryptographically random values.
     * @param dataBuffer
     */
    BrowserCrypto.prototype.getRandomValues = function (dataBuffer) {
        var cryptoObj = window["msCrypto"] || window.crypto;
        if (!cryptoObj.getRandomValues) {
            throw BrowserAuthError.createCryptoNotAvailableError("getRandomValues does not exist.");
        }
        cryptoObj.getRandomValues(dataBuffer);
    };
    /**
     * Generates a keypair based on current keygen algorithm config.
     * @param extractable
     * @param usages
     */
    BrowserCrypto.prototype.generateKeyPair = function (extractable, usages) {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                return [2 /*return*/, (this.hasIECrypto() ?
                        this.msCryptoGenerateKey(extractable, usages)
                        : window.crypto.subtle.generateKey(this._keygenAlgorithmOptions, extractable, usages))];
            });
        });
    };
    /**
     * Export key as Json Web Key (JWK)
     * @param key
     * @param format
     */
    BrowserCrypto.prototype.exportJwk = function (key) {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                return [2 /*return*/, this.hasIECrypto() ? this.msCryptoExportJwk(key) : window.crypto.subtle.exportKey(KEY_FORMAT_JWK, key)];
            });
        });
    };
    /**
     * Imports key as Json Web Key (JWK), can set extractable and usages.
     * @param key
     * @param format
     * @param extractable
     * @param usages
     */
    BrowserCrypto.prototype.importJwk = function (key, extractable, usages) {
        return __awaiter(this, void 0, void 0, function () {
            var keyString, keyBuffer;
            return __generator(this, function (_a) {
                keyString = BrowserCrypto.getJwkString(key);
                keyBuffer = BrowserStringUtils.stringToArrayBuffer(keyString);
                return [2 /*return*/, this.hasIECrypto() ?
                        this.msCryptoImportKey(keyBuffer, extractable, usages)
                        : window.crypto.subtle.importKey(KEY_FORMAT_JWK, key, this._keygenAlgorithmOptions, extractable, usages)];
            });
        });
    };
    /**
     * Signs given data with given key
     * @param key
     * @param data
     */
    BrowserCrypto.prototype.sign = function (key, data) {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                return [2 /*return*/, this.hasIECrypto() ?
                        this.msCryptoSign(key, data)
                        : window.crypto.subtle.sign(this._keygenAlgorithmOptions, key, data)];
            });
        });
    };
    /**
     * Check whether IE crypto or other browser cryptography is available.
     */
    BrowserCrypto.prototype.hasCryptoAPI = function () {
        return this.hasIECrypto() || this.hasBrowserCrypto();
    };
    /**
     * Checks whether IE crypto (AKA msCrypto) is available.
     */
    BrowserCrypto.prototype.hasIECrypto = function () {
        return "msCrypto" in window;
    };
    /**
     * Check whether browser crypto is available.
     */
    BrowserCrypto.prototype.hasBrowserCrypto = function () {
        return "crypto" in window;
    };
    /**
     * Helper function for SHA digest.
     * @param algorithm
     * @param data
     */
    BrowserCrypto.prototype.getSubtleCryptoDigest = function (algorithm, data) {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                return [2 /*return*/, window.crypto.subtle.digest(algorithm, data)];
            });
        });
    };
    /**
     * IE Helper function for SHA digest.
     * @param algorithm
     * @param data
     */
    BrowserCrypto.prototype.getMSCryptoDigest = function (algorithm, data) {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        var digestOperation = window["msCrypto"].subtle.digest(algorithm, data.buffer);
                        digestOperation.addEventListener("complete", function (e) {
                            resolve(e.target.result);
                        });
                        digestOperation.addEventListener("error", function (error) {
                            reject(error);
                        });
                    })];
            });
        });
    };
    /**
     * IE Helper function for generating a keypair
     * @param extractable
     * @param usages
     */
    BrowserCrypto.prototype.msCryptoGenerateKey = function (extractable, usages) {
        return __awaiter(this, void 0, void 0, function () {
            var _this = this;
            return __generator(this, function (_a) {
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        var msGenerateKey = window["msCrypto"].subtle.generateKey(_this._keygenAlgorithmOptions, extractable, usages);
                        msGenerateKey.addEventListener("complete", function (e) {
                            resolve(e.target.result);
                        });
                        msGenerateKey.addEventListener("error", function (error) {
                            reject(error);
                        });
                    })];
            });
        });
    };
    /**
     * IE Helper function for exportKey
     * @param key
     * @param format
     */
    BrowserCrypto.prototype.msCryptoExportJwk = function (key) {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        var msExportKey = window["msCrypto"].subtle.exportKey(KEY_FORMAT_JWK, key);
                        msExportKey.addEventListener("complete", function (e) {
                            var resultBuffer = e.target.result;
                            var resultString = BrowserStringUtils.utf8ArrToString(new Uint8Array(resultBuffer))
                                .replace(/\r/g, Constants.EMPTY_STRING)
                                .replace(/\n/g, Constants.EMPTY_STRING)
                                .replace(/\t/g, Constants.EMPTY_STRING)
                                .split(" ").join(Constants.EMPTY_STRING)
                                .replace("\u0000", Constants.EMPTY_STRING);
                            try {
                                resolve(JSON.parse(resultString));
                            }
                            catch (e) {
                                reject(e);
                            }
                        });
                        msExportKey.addEventListener("error", function (error) {
                            reject(error);
                        });
                    })];
            });
        });
    };
    /**
     * IE Helper function for importKey
     * @param key
     * @param format
     * @param extractable
     * @param usages
     */
    BrowserCrypto.prototype.msCryptoImportKey = function (keyBuffer, extractable, usages) {
        return __awaiter(this, void 0, void 0, function () {
            var _this = this;
            return __generator(this, function (_a) {
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        var msImportKey = window["msCrypto"].subtle.importKey(KEY_FORMAT_JWK, keyBuffer, _this._keygenAlgorithmOptions, extractable, usages);
                        msImportKey.addEventListener("complete", function (e) {
                            resolve(e.target.result);
                        });
                        msImportKey.addEventListener("error", function (error) {
                            reject(error);
                        });
                    })];
            });
        });
    };
    /**
     * IE Helper function for sign JWT
     * @param key
     * @param data
     */
    BrowserCrypto.prototype.msCryptoSign = function (key, data) {
        return __awaiter(this, void 0, void 0, function () {
            var _this = this;
            return __generator(this, function (_a) {
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        var msSign = window["msCrypto"].subtle.sign(_this._keygenAlgorithmOptions, key, data);
                        msSign.addEventListener("complete", function (e) {
                            resolve(e.target.result);
                        });
                        msSign.addEventListener("error", function (error) {
                            reject(error);
                        });
                    })];
            });
        });
    };
    /**
     * Returns stringified jwk.
     * @param jwk
     */
    BrowserCrypto.getJwkString = function (jwk) {
        return JSON.stringify(jwk, Object.keys(jwk).sort());
    };
    return BrowserCrypto;
}());

export { BrowserCrypto };
//# sourceMappingURL=BrowserCrypto.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __awaiter, __generator } from '../_virtual/_tslib.js';
import { PerformanceEvents, JoseHeader } from '@azure/msal-common';
import { GuidGenerator } from './GuidGenerator.js';
import { Base64Encode } from '../encode/Base64Encode.js';
import { Base64Decode } from '../encode/Base64Decode.js';
import { PkceGenerator } from './PkceGenerator.js';
import { BrowserCrypto } from './BrowserCrypto.js';
import { BrowserStringUtils } from '../utils/BrowserStringUtils.js';
import { BrowserAuthError } from '../error/BrowserAuthError.js';
import { AsyncMemoryStorage } from '../cache/AsyncMemoryStorage.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var CryptoKeyStoreNames;
(function (CryptoKeyStoreNames) {
    CryptoKeyStoreNames["asymmetricKeys"] = "asymmetricKeys";
    CryptoKeyStoreNames["symmetricKeys"] = "symmetricKeys";
})(CryptoKeyStoreNames || (CryptoKeyStoreNames = {}));
/**
 * This class implements MSAL's crypto interface, which allows it to perform base64 encoding and decoding, generating cryptographically random GUIDs and
 * implementing Proof Key for Code Exchange specs for the OAuth Authorization Code Flow using PKCE (rfc here: https://tools.ietf.org/html/rfc7636).
 */
var CryptoOps = /** @class */ (function () {
    function CryptoOps(logger, performanceClient) {
        this.logger = logger;
        // Browser crypto needs to be validated first before any other classes can be set.
        this.browserCrypto = new BrowserCrypto(this.logger);
        this.b64Encode = new Base64Encode();
        this.b64Decode = new Base64Decode();
        this.guidGenerator = new GuidGenerator(this.browserCrypto);
        this.pkceGenerator = new PkceGenerator(this.browserCrypto);
        this.cache = {
            asymmetricKeys: new AsyncMemoryStorage(this.logger, CryptoKeyStoreNames.asymmetricKeys),
            symmetricKeys: new AsyncMemoryStorage(this.logger, CryptoKeyStoreNames.symmetricKeys)
        };
        this.performanceClient = performanceClient;
    }
    /**
     * Creates a new random GUID - used to populate state and nonce.
     * @returns string (GUID)
     */
    CryptoOps.prototype.createNewGuid = function () {
        return this.guidGenerator.generateGuid();
    };
    /**
     * Encodes input string to base64.
     * @param input
     */
    CryptoOps.prototype.base64Encode = function (input) {
        return this.b64Encode.encode(input);
    };
    /**
     * Decodes input string from base64.
     * @param input
     */
    CryptoOps.prototype.base64Decode = function (input) {
        return this.b64Decode.decode(input);
    };
    /**
     * Generates PKCE codes used in Authorization Code Flow.
     */
    CryptoOps.prototype.generatePkceCodes = function () {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                return [2 /*return*/, this.pkceGenerator.generateCodes()];
            });
        });
    };
    /**
     * Generates a keypair, stores it and returns a thumbprint
     * @param request
     */
    CryptoOps.prototype.getPublicKeyThumbprint = function (request) {
        var _a;
        return __awaiter(this, void 0, void 0, function () {
            var publicKeyThumbMeasurement, keyPair, publicKeyJwk, pubKeyThumprintObj, publicJwkString, publicJwkHash, privateKeyJwk, unextractablePrivateKey;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        publicKeyThumbMeasurement = (_a = this.performanceClient) === null || _a === void 0 ? void 0 : _a.startMeasurement(PerformanceEvents.CryptoOptsGetPublicKeyThumbprint, request.correlationId);
                        return [4 /*yield*/, this.browserCrypto.generateKeyPair(CryptoOps.EXTRACTABLE, CryptoOps.POP_KEY_USAGES)];
                    case 1:
                        keyPair = _b.sent();
                        return [4 /*yield*/, this.browserCrypto.exportJwk(keyPair.publicKey)];
                    case 2:
                        publicKeyJwk = _b.sent();
                        pubKeyThumprintObj = {
                            e: publicKeyJwk.e,
                            kty: publicKeyJwk.kty,
                            n: publicKeyJwk.n
                        };
                        publicJwkString = BrowserCrypto.getJwkString(pubKeyThumprintObj);
                        return [4 /*yield*/, this.hashString(publicJwkString)];
                    case 3:
                        publicJwkHash = _b.sent();
                        return [4 /*yield*/, this.browserCrypto.exportJwk(keyPair.privateKey)];
                    case 4:
                        privateKeyJwk = _b.sent();
                        return [4 /*yield*/, this.browserCrypto.importJwk(privateKeyJwk, false, ["sign"])];
                    case 5:
                        unextractablePrivateKey = _b.sent();
                        // Store Keypair data in keystore
                        return [4 /*yield*/, this.cache.asymmetricKeys.setItem(publicJwkHash, {
                                privateKey: unextractablePrivateKey,
                                publicKey: keyPair.publicKey,
                                requestMethod: request.resourceRequestMethod,
                                requestUri: request.resourceRequestUri
                            })];
                    case 6:
                        // Store Keypair data in keystore
                        _b.sent();
                        if (publicKeyThumbMeasurement) {
                            publicKeyThumbMeasurement.endMeasurement({
                                success: true
                            });
                        }
                        return [2 /*return*/, publicJwkHash];
                }
            });
        });
    };
    /**
     * Removes cryptographic keypair from key store matching the keyId passed in
     * @param kid
     */
    CryptoOps.prototype.removeTokenBindingKey = function (kid) {
        return __awaiter(this, void 0, void 0, function () {
            var keyFound;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.cache.asymmetricKeys.removeItem(kid)];
                    case 1:
                        _a.sent();
                        return [4 /*yield*/, this.cache.asymmetricKeys.containsKey(kid)];
                    case 2:
                        keyFound = _a.sent();
                        return [2 /*return*/, !keyFound];
                }
            });
        });
    };
    /**
     * Removes all cryptographic keys from IndexedDB storage
     */
    CryptoOps.prototype.clearKeystore = function () {
        return __awaiter(this, void 0, void 0, function () {
            var e_1;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        _a.trys.push([0, 3, , 4]);
                        this.logger.verbose("Deleting in-memory and persistent asymmetric key stores");
                        return [4 /*yield*/, this.cache.asymmetricKeys.clear()];
                    case 1:
                        _a.sent();
                        this.logger.verbose("Successfully deleted asymmetric key stores");
                        this.logger.verbose("Deleting in-memory and persistent symmetric key stores");
                        return [4 /*yield*/, this.cache.symmetricKeys.clear()];
                    case 2:
                        _a.sent();
                        this.logger.verbose("Successfully deleted symmetric key stores");
                        return [2 /*return*/, true];
                    case 3:
                        e_1 = _a.sent();
                        if (e_1 instanceof Error) {
                            this.logger.error("Clearing keystore failed with error: " + e_1.message);
                        }
                        else {
                            this.logger.error("Clearing keystore failed with unknown error");
                        }
                        return [2 /*return*/, false];
                    case 4: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Signs the given object as a jwt payload with private key retrieved by given kid.
     * @param payload
     * @param kid
     */
    CryptoOps.prototype.signJwt = function (payload, kid, correlationId) {
        var _a;
        return __awaiter(this, void 0, void 0, function () {
            var signJwtMeasurement, cachedKeyPair, publicKeyJwk, publicKeyJwkString, encodedKeyIdThumbprint, shrHeader, encodedShrHeader, encodedPayload, tokenString, tokenBuffer, signatureBuffer, encodedSignature, signedJwt;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        signJwtMeasurement = (_a = this.performanceClient) === null || _a === void 0 ? void 0 : _a.startMeasurement(PerformanceEvents.CryptoOptsSignJwt, correlationId);
                        return [4 /*yield*/, this.cache.asymmetricKeys.getItem(kid)];
                    case 1:
                        cachedKeyPair = _b.sent();
                        if (!cachedKeyPair) {
                            throw BrowserAuthError.createSigningKeyNotFoundInStorageError(kid);
                        }
                        return [4 /*yield*/, this.browserCrypto.exportJwk(cachedKeyPair.publicKey)];
                    case 2:
                        publicKeyJwk = _b.sent();
                        publicKeyJwkString = BrowserCrypto.getJwkString(publicKeyJwk);
                        encodedKeyIdThumbprint = this.b64Encode.urlEncode(JSON.stringify({ kid: kid }));
                        shrHeader = JoseHeader.getShrHeaderString({ kid: encodedKeyIdThumbprint, alg: publicKeyJwk.alg });
                        encodedShrHeader = this.b64Encode.urlEncode(shrHeader);
                        // Generate payload
                        payload.cnf = {
                            jwk: JSON.parse(publicKeyJwkString)
                        };
                        encodedPayload = this.b64Encode.urlEncode(JSON.stringify(payload));
                        tokenString = encodedShrHeader + "." + encodedPayload;
                        tokenBuffer = BrowserStringUtils.stringToArrayBuffer(tokenString);
                        return [4 /*yield*/, this.browserCrypto.sign(cachedKeyPair.privateKey, tokenBuffer)];
                    case 3:
                        signatureBuffer = _b.sent();
                        encodedSignature = this.b64Encode.urlEncodeArr(new Uint8Array(signatureBuffer));
                        signedJwt = tokenString + "." + encodedSignature;
                        if (signJwtMeasurement) {
                            signJwtMeasurement.endMeasurement({
                                success: true
                            });
                        }
                        return [2 /*return*/, signedJwt];
                }
            });
        });
    };
    /**
     * Returns the SHA-256 hash of an input string
     * @param plainText
     */
    CryptoOps.prototype.hashString = function (plainText) {
        return __awaiter(this, void 0, void 0, function () {
            var hashBuffer, hashBytes;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.browserCrypto.sha256Digest(plainText)];
                    case 1:
                        hashBuffer = _a.sent();
                        hashBytes = new Uint8Array(hashBuffer);
                        return [2 /*return*/, this.b64Encode.urlEncodeArr(hashBytes)];
                }
            });
        });
    };
    CryptoOps.POP_KEY_USAGES = ["sign", "verify"];
    CryptoOps.EXTRACTABLE = true;
    return CryptoOps;
}());

export { CryptoKeyStoreNames, CryptoOps };
//# sourceMappingURL=CryptoOps.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { Constants } from '@azure/msal-common';
import { MathUtils } from '../utils/MathUtils.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var GuidGenerator = /** @class */ (function () {
    function GuidGenerator(cryptoObj) {
        this.cryptoObj = cryptoObj;
    }
    /*
     * RFC4122: The version 4 UUID is meant for generating UUIDs from truly-random or
     * pseudo-random numbers.
     * The algorithm is as follows:
     *     Set the two most significant bits (bits 6 and 7) of the
     *        clock_seq_hi_and_reserved to zero and one, respectively.
     *     Set the four most significant bits (bits 12 through 15) of the
     *        time_hi_and_version field to the 4-bit version number from
     *        Section 4.1.3. Version4
     *     Set all the other bits to randomly (or pseudo-randomly) chosen
     *     values.
     * UUID                   = time-low "-" time-mid "-"time-high-and-version "-"clock-seq-reserved and low(2hexOctet)"-" node
     * time-low               = 4hexOctet
     * time-mid               = 2hexOctet
     * time-high-and-version  = 2hexOctet
     * clock-seq-and-reserved = hexOctet:
     * clock-seq-low          = hexOctet
     * node                   = 6hexOctet
     * Format: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
     * y could be 1000, 1001, 1010, 1011 since most significant two bits needs to be 10
     * y values are 8, 9, A, B
     */
    GuidGenerator.prototype.generateGuid = function () {
        try {
            var buffer = new Uint8Array(16);
            this.cryptoObj.getRandomValues(buffer);
            // buffer[6] and buffer[7] represents the time_hi_and_version field. We will set the four most significant bits (4 through 7) of buffer[6] to represent decimal number 4 (UUID version number).
            buffer[6] |= 0x40; // buffer[6] | 01000000 will set the 6 bit to 1.
            buffer[6] &= 0x4f; // buffer[6] & 01001111 will set the 4, 5, and 7 bit to 0 such that bits 4-7 == 0100 = "4".
            // buffer[8] represents the clock_seq_hi_and_reserved field. We will set the two most significant bits (6 and 7) of the clock_seq_hi_and_reserved to zero and one, respectively.
            buffer[8] |= 0x80; // buffer[8] | 10000000 will set the 7 bit to 1.
            buffer[8] &= 0xbf; // buffer[8] & 10111111 will set the 6 bit to 0.
            return MathUtils.decimalToHex(buffer[0]) + MathUtils.decimalToHex(buffer[1])
                + MathUtils.decimalToHex(buffer[2]) + MathUtils.decimalToHex(buffer[3])
                + "-" + MathUtils.decimalToHex(buffer[4]) + MathUtils.decimalToHex(buffer[5])
                + "-" + MathUtils.decimalToHex(buffer[6]) + MathUtils.decimalToHex(buffer[7])
                + "-" + MathUtils.decimalToHex(buffer[8]) + MathUtils.decimalToHex(buffer[9])
                + "-" + MathUtils.decimalToHex(buffer[10]) + MathUtils.decimalToHex(buffer[11])
                + MathUtils.decimalToHex(buffer[12]) + MathUtils.decimalToHex(buffer[13])
                + MathUtils.decimalToHex(buffer[14]) + MathUtils.decimalToHex(buffer[15]);
        }
        catch (err) {
            var guidHolder = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx";
            var hex = "0123456789abcdef";
            var r = 0;
            var guidResponse = Constants.EMPTY_STRING;
            for (var i = 0; i < 36; i++) {
                if (guidHolder[i] !== "-" && guidHolder[i] !== "4") {
                    // each x and y needs to be random
                    r = Math.random() * 16 | 0;
                }
                if (guidHolder[i] === "x") {
                    guidResponse += hex[r];
                }
                else if (guidHolder[i] === "y") {
                    // clock-seq-and-reserved first hex is filtered and remaining hex values are random
                    r &= 0x3; // bit and with 0011 to set pos 2 to zero ?0??
                    r |= 0x8; // set pos 3 to 1 as 1???
                    guidResponse += hex[r];
                }
                else {
                    guidResponse += guidHolder[i];
                }
            }
            return guidResponse;
        }
    };
    /**
     * verifies if a string is  GUID
     * @param guid
     */
    GuidGenerator.prototype.isGuid = function (guid) {
        var regexGuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
        return regexGuid.test(guid);
    };
    return GuidGenerator;
}());

export { GuidGenerator };
//# sourceMappingURL=GuidGenerator.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __awaiter, __generator } from '../_virtual/_tslib.js';
import { BrowserAuthError } from '../error/BrowserAuthError.js';
import { Base64Encode } from '../encode/Base64Encode.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
// Constant byte array length
var RANDOM_BYTE_ARR_LENGTH = 32;
/**
 * Class which exposes APIs to generate PKCE codes and code verifiers.
 */
var PkceGenerator = /** @class */ (function () {
    function PkceGenerator(cryptoObj) {
        this.base64Encode = new Base64Encode();
        this.cryptoObj = cryptoObj;
    }
    /**
     * Generates PKCE Codes. See the RFC for more information: https://tools.ietf.org/html/rfc7636
     */
    PkceGenerator.prototype.generateCodes = function () {
        return __awaiter(this, void 0, void 0, function () {
            var codeVerifier, codeChallenge;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        codeVerifier = this.generateCodeVerifier();
                        return [4 /*yield*/, this.generateCodeChallengeFromVerifier(codeVerifier)];
                    case 1:
                        codeChallenge = _a.sent();
                        return [2 /*return*/, {
                                verifier: codeVerifier,
                                challenge: codeChallenge
                            }];
                }
            });
        });
    };
    /**
     * Generates a random 32 byte buffer and returns the base64
     * encoded string to be used as a PKCE Code Verifier
     */
    PkceGenerator.prototype.generateCodeVerifier = function () {
        try {
            // Generate random values as utf-8
            var buffer = new Uint8Array(RANDOM_BYTE_ARR_LENGTH);
            this.cryptoObj.getRandomValues(buffer);
            // encode verifier as base64
            var pkceCodeVerifierB64 = this.base64Encode.urlEncodeArr(buffer);
            return pkceCodeVerifierB64;
        }
        catch (e) {
            throw BrowserAuthError.createPkceNotGeneratedError(e);
        }
    };
    /**
     * Creates a base64 encoded PKCE Code Challenge string from the
     * hash created from the PKCE Code Verifier supplied
     */
    PkceGenerator.prototype.generateCodeChallengeFromVerifier = function (pkceCodeVerifier) {
        return __awaiter(this, void 0, void 0, function () {
            var pkceHashedCodeVerifier, e_1;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        _a.trys.push([0, 2, , 3]);
                        return [4 /*yield*/, this.cryptoObj.sha256Digest(pkceCodeVerifier)];
                    case 1:
                        pkceHashedCodeVerifier = _a.sent();
                        // encode hash as base64
                        return [2 /*return*/, this.base64Encode.urlEncodeArr(new Uint8Array(pkceHashedCodeVerifier))];
                    case 2:
                        e_1 = _a.sent();
                        throw BrowserAuthError.createPkceNotGeneratedError(e_1);
                    case 3: return [2 /*return*/];
                }
            });
        });
    };
    return PkceGenerator;
}());

export { PkceGenerator };
//# sourceMappingURL=PkceGenerator.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __awaiter, __generator } from '../_virtual/_tslib.js';
import { CryptoOps } from './CryptoOps.js';
import { Logger, PopTokenGenerator } from '@azure/msal-common';
import { name, version } from '../packageMetadata.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var SignedHttpRequest = /** @class */ (function () {
    function SignedHttpRequest(shrParameters, shrOptions) {
        var loggerOptions = (shrOptions && shrOptions.loggerOptions) || {};
        this.logger = new Logger(loggerOptions, name, version);
        this.cryptoOps = new CryptoOps(this.logger);
        this.popTokenGenerator = new PopTokenGenerator(this.cryptoOps);
        this.shrParameters = shrParameters;
    }
    /**
     * Generates and caches a keypair for the given request options.
     * @returns Public key digest, which should be sent to the token issuer.
     */
    SignedHttpRequest.prototype.generatePublicKeyThumbprint = function () {
        return __awaiter(this, void 0, void 0, function () {
            var kid;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.popTokenGenerator.generateKid(this.shrParameters)];
                    case 1:
                        kid = (_a.sent()).kid;
                        return [2 /*return*/, kid];
                }
            });
        });
    };
    /**
     * Generates a signed http request for the given payload with the given key.
     * @param payload Payload to sign (e.g. access token)
     * @param publicKeyThumbprint Public key digest (from generatePublicKeyThumbprint API)
     * @param claims Additional claims to include/override in the signed JWT
     * @returns Pop token signed with the corresponding private key
     */
    SignedHttpRequest.prototype.signRequest = function (payload, publicKeyThumbprint, claims) {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                return [2 /*return*/, this.popTokenGenerator.signPayload(payload, publicKeyThumbprint, this.shrParameters, claims)];
            });
        });
    };
    /**
     * Removes cached keys from browser for given public key thumbprint
     * @param publicKeyThumbprint Public key digest (from generatePublicKeyThumbprint API)
     * @returns If keys are properly deleted
     */
    SignedHttpRequest.prototype.removeKeys = function (publicKeyThumbprint) {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.cryptoOps.removeTokenBindingKey(publicKeyThumbprint)];
                    case 1: return [2 /*return*/, _a.sent()];
                }
            });
        });
    };
    return SignedHttpRequest;
}());

export { SignedHttpRequest };
//# sourceMappingURL=SignedHttpRequest.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __assign } from '../_virtual/_tslib.js';
import { DEFAULT_SYSTEM_OPTIONS, StubbedNetworkModule, Constants, ProtocolMode, AzureCloudInstance, LogLevel } from '@azure/msal-common';
import { BrowserUtils } from '../utils/BrowserUtils.js';
import { BrowserCacheLocation } from '../utils/BrowserConstants.js';
import { NavigationClient } from '../navigation/NavigationClient.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
// Default timeout for popup windows and iframes in milliseconds
var DEFAULT_POPUP_TIMEOUT_MS = 60000;
var DEFAULT_IFRAME_TIMEOUT_MS = 6000;
var DEFAULT_REDIRECT_TIMEOUT_MS = 30000;
var DEFAULT_NATIVE_BROKER_HANDSHAKE_TIMEOUT_MS = 2000;
/**
 * MSAL function that sets the default options when not explicitly configured from app developer
 *
 * @param auth
 * @param cache
 * @param system
 *
 * @returns Configuration object
 */
function buildConfiguration(_a, isBrowserEnvironment) {
    var userInputAuth = _a.auth, userInputCache = _a.cache, userInputSystem = _a.system, userInputTelemetry = _a.telemetry;
    // Default auth options for browser
    var DEFAULT_AUTH_OPTIONS = {
        clientId: Constants.EMPTY_STRING,
        authority: "" + Constants.DEFAULT_AUTHORITY,
        knownAuthorities: [],
        cloudDiscoveryMetadata: Constants.EMPTY_STRING,
        authorityMetadata: Constants.EMPTY_STRING,
        redirectUri: Constants.EMPTY_STRING,
        postLogoutRedirectUri: Constants.EMPTY_STRING,
        navigateToLoginRequestUrl: true,
        clientCapabilities: [],
        protocolMode: ProtocolMode.AAD,
        azureCloudOptions: {
            azureCloudInstance: AzureCloudInstance.None,
            tenant: Constants.EMPTY_STRING
        },
        skipAuthorityMetadataCache: false,
    };
    // Default cache options for browser
    var DEFAULT_CACHE_OPTIONS = {
        cacheLocation: BrowserCacheLocation.SessionStorage,
        storeAuthStateInCookie: false,
        secureCookies: false
    };
    // Default logger options for browser
    var DEFAULT_LOGGER_OPTIONS = {
        // eslint-disable-next-line @typescript-eslint/no-empty-function
        loggerCallback: function () { },
        logLevel: LogLevel.Info,
        piiLoggingEnabled: false
    };
    // Default system options for browser
    var DEFAULT_BROWSER_SYSTEM_OPTIONS = __assign(__assign({}, DEFAULT_SYSTEM_OPTIONS), { loggerOptions: DEFAULT_LOGGER_OPTIONS, networkClient: isBrowserEnvironment ? BrowserUtils.getBrowserNetworkClient() : StubbedNetworkModule, navigationClient: new NavigationClient(), loadFrameTimeout: 0, 
        // If loadFrameTimeout is provided, use that as default.
        windowHashTimeout: (userInputSystem === null || userInputSystem === void 0 ? void 0 : userInputSystem.loadFrameTimeout) || DEFAULT_POPUP_TIMEOUT_MS, iframeHashTimeout: (userInputSystem === null || userInputSystem === void 0 ? void 0 : userInputSystem.loadFrameTimeout) || DEFAULT_IFRAME_TIMEOUT_MS, navigateFrameWait: isBrowserEnvironment && BrowserUtils.detectIEOrEdge() ? 500 : 0, redirectNavigationTimeout: DEFAULT_REDIRECT_TIMEOUT_MS, asyncPopups: false, allowRedirectInIframe: false, allowNativeBroker: false, nativeBrokerHandshakeTimeout: (userInputSystem === null || userInputSystem === void 0 ? void 0 : userInputSystem.nativeBrokerHandshakeTimeout) || DEFAULT_NATIVE_BROKER_HANDSHAKE_TIMEOUT_MS });
    var DEFAULT_TELEMETRY_OPTIONS = {
        application: {
            appName: Constants.EMPTY_STRING,
            appVersion: Constants.EMPTY_STRING
        }
    };
    var overlayedConfig = {
        auth: __assign(__assign({}, DEFAULT_AUTH_OPTIONS), userInputAuth),
        cache: __assign(__assign({}, DEFAULT_CACHE_OPTIONS), userInputCache),
        system: __assign(__assign({}, DEFAULT_BROWSER_SYSTEM_OPTIONS), userInputSystem),
        telemetry: __assign(__assign({}, DEFAULT_TELEMETRY_OPTIONS), userInputTelemetry)
    };
    return overlayedConfig;
}

export { DEFAULT_IFRAME_TIMEOUT_MS, DEFAULT_NATIVE_BROKER_HANDSHAKE_TIMEOUT_MS, DEFAULT_POPUP_TIMEOUT_MS, DEFAULT_REDIRECT_TIMEOUT_MS, buildConfiguration };
//# sourceMappingURL=Configuration.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __awaiter, __generator } from '../_virtual/_tslib.js';
import { BrowserAuthError, BrowserAuthErrorMessage } from '../error/BrowserAuthError.js';
import { DatabaseStorage } from './DatabaseStorage.js';
import { MemoryStorage } from './MemoryStorage.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * This class allows MSAL to store artifacts asynchronously using the DatabaseStorage IndexedDB wrapper,
 * backed up with the more volatile MemoryStorage object for cases in which IndexedDB may be unavailable.
 */
var AsyncMemoryStorage = /** @class */ (function () {
    function AsyncMemoryStorage(logger, storeName) {
        this.inMemoryCache = new MemoryStorage();
        this.indexedDBCache = new DatabaseStorage();
        this.logger = logger;
        this.storeName = storeName;
    }
    AsyncMemoryStorage.prototype.handleDatabaseAccessError = function (error) {
        if (error instanceof BrowserAuthError && error.errorCode === BrowserAuthErrorMessage.databaseUnavailable.code) {
            this.logger.error("Could not access persistent storage. This may be caused by browser privacy features which block persistent storage in third-party contexts.");
        }
        else {
            throw error;
        }
    };
    /**
     * Get the item matching the given key. Tries in-memory cache first, then in the asynchronous
     * storage object if item isn't found in-memory.
     * @param key
     */
    AsyncMemoryStorage.prototype.getItem = function (key) {
        return __awaiter(this, void 0, void 0, function () {
            var item, e_1;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        item = this.inMemoryCache.getItem(key);
                        if (!!item) return [3 /*break*/, 4];
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        this.logger.verbose("Queried item not found in in-memory cache, now querying persistent storage.");
                        return [4 /*yield*/, this.indexedDBCache.getItem(key)];
                    case 2: return [2 /*return*/, _a.sent()];
                    case 3:
                        e_1 = _a.sent();
                        this.handleDatabaseAccessError(e_1);
                        return [3 /*break*/, 4];
                    case 4: return [2 /*return*/, item];
                }
            });
        });
    };
    /**
     * Sets the item in the in-memory cache and then tries to set it in the asynchronous
     * storage object with the given key.
     * @param key
     * @param value
     */
    AsyncMemoryStorage.prototype.setItem = function (key, value) {
        return __awaiter(this, void 0, void 0, function () {
            var e_2;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.inMemoryCache.setItem(key, value);
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        return [4 /*yield*/, this.indexedDBCache.setItem(key, value)];
                    case 2:
                        _a.sent();
                        return [3 /*break*/, 4];
                    case 3:
                        e_2 = _a.sent();
                        this.handleDatabaseAccessError(e_2);
                        return [3 /*break*/, 4];
                    case 4: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Removes the item matching the key from the in-memory cache, then tries to remove it from the asynchronous storage object.
     * @param key
     */
    AsyncMemoryStorage.prototype.removeItem = function (key) {
        return __awaiter(this, void 0, void 0, function () {
            var e_3;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.inMemoryCache.removeItem(key);
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        return [4 /*yield*/, this.indexedDBCache.removeItem(key)];
                    case 2:
                        _a.sent();
                        return [3 /*break*/, 4];
                    case 3:
                        e_3 = _a.sent();
                        this.handleDatabaseAccessError(e_3);
                        return [3 /*break*/, 4];
                    case 4: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Get all the keys from the in-memory cache as an iterable array of strings. If no keys are found, query the keys in the
     * asynchronous storage object.
     */
    AsyncMemoryStorage.prototype.getKeys = function () {
        return __awaiter(this, void 0, void 0, function () {
            var cacheKeys, e_4;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        cacheKeys = this.inMemoryCache.getKeys();
                        if (!(cacheKeys.length === 0)) return [3 /*break*/, 4];
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        this.logger.verbose("In-memory cache is empty, now querying persistent storage.");
                        return [4 /*yield*/, this.indexedDBCache.getKeys()];
                    case 2: return [2 /*return*/, _a.sent()];
                    case 3:
                        e_4 = _a.sent();
                        this.handleDatabaseAccessError(e_4);
                        return [3 /*break*/, 4];
                    case 4: return [2 /*return*/, cacheKeys];
                }
            });
        });
    };
    /**
     * Returns true or false if the given key is present in the cache.
     * @param key
     */
    AsyncMemoryStorage.prototype.containsKey = function (key) {
        return __awaiter(this, void 0, void 0, function () {
            var containsKey, e_5;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        containsKey = this.inMemoryCache.containsKey(key);
                        if (!!containsKey) return [3 /*break*/, 4];
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        this.logger.verbose("Key not found in in-memory cache, now querying persistent storage.");
                        return [4 /*yield*/, this.indexedDBCache.containsKey(key)];
                    case 2: return [2 /*return*/, _a.sent()];
                    case 3:
                        e_5 = _a.sent();
                        this.handleDatabaseAccessError(e_5);
                        return [3 /*break*/, 4];
                    case 4: return [2 /*return*/, containsKey];
                }
            });
        });
    };
    /**
     * Clears in-memory Map and tries to delete the IndexedDB database.
     */
    AsyncMemoryStorage.prototype.clear = function () {
        return __awaiter(this, void 0, void 0, function () {
            var dbDeleted, e_6;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        // InMemory cache is a Map instance, clear is straightforward
                        this.logger.verbose("Deleting in-memory keystore " + this.storeName);
                        this.inMemoryCache.clear();
                        this.logger.verbose("In-memory keystore " + this.storeName + " deleted");
                        this.logger.verbose("Deleting persistent keystore " + this.storeName);
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        return [4 /*yield*/, this.indexedDBCache.deleteDatabase()];
                    case 2:
                        dbDeleted = _a.sent();
                        if (dbDeleted) {
                            this.logger.verbose("Persistent keystore " + this.storeName + " deleted");
                        }
                        return [2 /*return*/, dbDeleted];
                    case 3:
                        e_6 = _a.sent();
                        this.handleDatabaseAccessError(e_6);
                        return [2 /*return*/, false];
                    case 4: return [2 /*return*/];
                }
            });
        });
    };
    return AsyncMemoryStorage;
}());

export { AsyncMemoryStorage };
//# sourceMappingURL=AsyncMemoryStorage.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __extends, __spread, __awaiter, __generator } from '../_virtual/_tslib.js';
import { AccountEntity, CacheManager, IdTokenEntity, AccessTokenEntity, RefreshTokenEntity, AppMetadataEntity, ServerTelemetryEntity, AuthorityMetadataEntity, Constants, PersistentCacheKeys, ClientAuthError, ThrottlingEntity, StringUtils, ProtocolUtils, CcsCredentialType, IdToken, DEFAULT_CRYPTO_IMPLEMENTATION } from '@azure/msal-common';
import { BrowserAuthError } from '../error/BrowserAuthError.js';
import { BrowserCacheLocation, InMemoryCacheKeys, TemporaryCacheKeys } from '../utils/BrowserConstants.js';
import { BrowserStorage } from './BrowserStorage.js';
import { MemoryStorage } from './MemoryStorage.js';
import { BrowserProtocolUtils } from '../utils/BrowserProtocolUtils.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * This class implements the cache storage interface for MSAL through browser local or session storage.
 * Cookies are only used if storeAuthStateInCookie is true, and are only used for
 * parameters such as state and nonce, generally.
 */
var BrowserCacheManager = /** @class */ (function (_super) {
    __extends(BrowserCacheManager, _super);
    function BrowserCacheManager(clientId, cacheConfig, cryptoImpl, logger) {
        var _this = _super.call(this, clientId, cryptoImpl) || this;
        // Cookie life calculation (hours * minutes * seconds * ms)
        _this.COOKIE_LIFE_MULTIPLIER = 24 * 60 * 60 * 1000;
        _this.cacheConfig = cacheConfig;
        _this.logger = logger;
        _this.internalStorage = new MemoryStorage();
        _this.browserStorage = _this.setupBrowserStorage(_this.cacheConfig.cacheLocation);
        _this.temporaryCacheStorage = _this.setupTemporaryCacheStorage(_this.cacheConfig.cacheLocation);
        // Migrate any cache entries from older versions of MSAL.
        _this.migrateCacheEntries();
        return _this;
    }
    /**
     * Returns a window storage class implementing the IWindowStorage interface that corresponds to the configured cacheLocation.
     * @param cacheLocation
     */
    BrowserCacheManager.prototype.setupBrowserStorage = function (cacheLocation) {
        switch (cacheLocation) {
            case BrowserCacheLocation.LocalStorage:
            case BrowserCacheLocation.SessionStorage:
                try {
                    // Temporary cache items will always be stored in session storage to mitigate problems caused by multiple tabs
                    return new BrowserStorage(cacheLocation);
                }
                catch (e) {
                    this.logger.verbose(e);
                    break;
                }
        }
        this.cacheConfig.cacheLocation = BrowserCacheLocation.MemoryStorage;
        return new MemoryStorage();
    };
    /**
     *
     * @param cacheLocation
     */
    BrowserCacheManager.prototype.setupTemporaryCacheStorage = function (cacheLocation) {
        switch (cacheLocation) {
            case BrowserCacheLocation.LocalStorage:
            case BrowserCacheLocation.SessionStorage:
                try {
                    // Temporary cache items will always be stored in session storage to mitigate problems caused by multiple tabs
                    return new BrowserStorage(BrowserCacheLocation.SessionStorage);
                }
                catch (e) {
                    this.logger.verbose(e);
                    return this.internalStorage;
                }
            case BrowserCacheLocation.MemoryStorage:
            default:
                return this.internalStorage;
        }
    };
    /**
     * Migrate all old cache entries to new schema. No rollback supported.
     * @param storeAuthStateInCookie
     */
    BrowserCacheManager.prototype.migrateCacheEntries = function () {
        var _this = this;
        var idTokenKey = Constants.CACHE_PREFIX + "." + PersistentCacheKeys.ID_TOKEN;
        var clientInfoKey = Constants.CACHE_PREFIX + "." + PersistentCacheKeys.CLIENT_INFO;
        var errorKey = Constants.CACHE_PREFIX + "." + PersistentCacheKeys.ERROR;
        var errorDescKey = Constants.CACHE_PREFIX + "." + PersistentCacheKeys.ERROR_DESC;
        var idTokenValue = this.browserStorage.getItem(idTokenKey);
        var clientInfoValue = this.browserStorage.getItem(clientInfoKey);
        var errorValue = this.browserStorage.getItem(errorKey);
        var errorDescValue = this.browserStorage.getItem(errorDescKey);
        var values = [idTokenValue, clientInfoValue, errorValue, errorDescValue];
        var keysToMigrate = [PersistentCacheKeys.ID_TOKEN, PersistentCacheKeys.CLIENT_INFO, PersistentCacheKeys.ERROR, PersistentCacheKeys.ERROR_DESC];
        keysToMigrate.forEach(function (cacheKey, index) { return _this.migrateCacheEntry(cacheKey, values[index]); });
    };
    /**
     * Utility function to help with migration.
     * @param newKey
     * @param value
     * @param storeAuthStateInCookie
     */
    BrowserCacheManager.prototype.migrateCacheEntry = function (newKey, value) {
        if (value) {
            this.setTemporaryCache(newKey, value, true);
        }
    };
    /**
     * Parses passed value as JSON object, JSON.parse() will throw an error.
     * @param input
     */
    BrowserCacheManager.prototype.validateAndParseJson = function (jsonValue) {
        try {
            var parsedJson = JSON.parse(jsonValue);
            /**
             * There are edge cases in which JSON.parse will successfully parse a non-valid JSON object
             * (e.g. JSON.parse will parse an escaped string into an unescaped string), so adding a type check
             * of the parsed value is necessary in order to be certain that the string represents a valid JSON object.
             *
             */
            return (parsedJson && typeof parsedJson === "object") ? parsedJson : null;
        }
        catch (error) {
            return null;
        }
    };
    /**
     * fetches the entry from the browser storage based off the key
     * @param key
     */
    BrowserCacheManager.prototype.getItem = function (key) {
        return this.browserStorage.getItem(key);
    };
    /**
     * sets the entry in the browser storage
     * @param key
     * @param value
     */
    BrowserCacheManager.prototype.setItem = function (key, value) {
        this.browserStorage.setItem(key, value);
    };
    /**
     * fetch the account entity from the platform cache
     * @param accountKey
     */
    BrowserCacheManager.prototype.getAccount = function (accountKey) {
        var account = this.getItem(accountKey);
        if (!account) {
            return null;
        }
        var parsedAccount = this.validateAndParseJson(account);
        if (!parsedAccount || !AccountEntity.isAccountEntity(parsedAccount)) {
            return null;
        }
        return CacheManager.toObject(new AccountEntity(), parsedAccount);
    };
    /**
     * set account entity in the platform cache
     * @param key
     * @param value
     */
    BrowserCacheManager.prototype.setAccount = function (account) {
        this.logger.trace("BrowserCacheManager.setAccount called");
        var key = account.generateAccountKey();
        this.setItem(key, JSON.stringify(account));
    };
    /**
     * generates idToken entity from a string
     * @param idTokenKey
     */
    BrowserCacheManager.prototype.getIdTokenCredential = function (idTokenKey) {
        var value = this.getItem(idTokenKey);
        if (!value) {
            this.logger.trace("BrowserCacheManager.getIdTokenCredential: called, no cache hit");
            return null;
        }
        var parsedIdToken = this.validateAndParseJson(value);
        if (!parsedIdToken || !IdTokenEntity.isIdTokenEntity(parsedIdToken)) {
            this.logger.trace("BrowserCacheManager.getIdTokenCredential: called, no cache hit");
            return null;
        }
        this.logger.trace("BrowserCacheManager.getIdTokenCredential: cache hit");
        return CacheManager.toObject(new IdTokenEntity(), parsedIdToken);
    };
    /**
     * set IdToken credential to the platform cache
     * @param idToken
     */
    BrowserCacheManager.prototype.setIdTokenCredential = function (idToken) {
        this.logger.trace("BrowserCacheManager.setIdTokenCredential called");
        var idTokenKey = idToken.generateCredentialKey();
        this.setItem(idTokenKey, JSON.stringify(idToken));
    };
    /**
     * generates accessToken entity from a string
     * @param key
     */
    BrowserCacheManager.prototype.getAccessTokenCredential = function (accessTokenKey) {
        var value = this.getItem(accessTokenKey);
        if (!value) {
            this.logger.trace("BrowserCacheManager.getAccessTokenCredential: called, no cache hit");
            return null;
        }
        var parsedAccessToken = this.validateAndParseJson(value);
        if (!parsedAccessToken || !AccessTokenEntity.isAccessTokenEntity(parsedAccessToken)) {
            this.logger.trace("BrowserCacheManager.getAccessTokenCredential: called, no cache hit");
            return null;
        }
        this.logger.trace("BrowserCacheManager.getAccessTokenCredential: cache hit");
        return CacheManager.toObject(new AccessTokenEntity(), parsedAccessToken);
    };
    /**
     * set accessToken credential to the platform cache
     * @param accessToken
     */
    BrowserCacheManager.prototype.setAccessTokenCredential = function (accessToken) {
        this.logger.trace("BrowserCacheManager.setAccessTokenCredential called");
        var accessTokenKey = accessToken.generateCredentialKey();
        this.setItem(accessTokenKey, JSON.stringify(accessToken));
    };
    /**
     * generates refreshToken entity from a string
     * @param refreshTokenKey
     */
    BrowserCacheManager.prototype.getRefreshTokenCredential = function (refreshTokenKey) {
        var value = this.getItem(refreshTokenKey);
        if (!value) {
            this.logger.trace("BrowserCacheManager.getRefreshTokenCredential: called, no cache hit");
            return null;
        }
        var parsedRefreshToken = this.validateAndParseJson(value);
        if (!parsedRefreshToken || !RefreshTokenEntity.isRefreshTokenEntity(parsedRefreshToken)) {
            this.logger.trace("BrowserCacheManager.getRefreshTokenCredential: called, no cache hit");
            return null;
        }
        this.logger.trace("BrowserCacheManager.getRefreshTokenCredential: cache hit");
        return CacheManager.toObject(new RefreshTokenEntity(), parsedRefreshToken);
    };
    /**
     * set refreshToken credential to the platform cache
     * @param refreshToken
     */
    BrowserCacheManager.prototype.setRefreshTokenCredential = function (refreshToken) {
        this.logger.trace("BrowserCacheManager.setRefreshTokenCredential called");
        var refreshTokenKey = refreshToken.generateCredentialKey();
        this.setItem(refreshTokenKey, JSON.stringify(refreshToken));
    };
    /**
     * fetch appMetadata entity from the platform cache
     * @param appMetadataKey
     */
    BrowserCacheManager.prototype.getAppMetadata = function (appMetadataKey) {
        var value = this.getItem(appMetadataKey);
        if (!value) {
            this.logger.trace("BrowserCacheManager.getAppMetadata: called, no cache hit");
            return null;
        }
        var parsedMetadata = this.validateAndParseJson(value);
        if (!parsedMetadata || !AppMetadataEntity.isAppMetadataEntity(appMetadataKey, parsedMetadata)) {
            this.logger.trace("BrowserCacheManager.getAppMetadata: called, no cache hit");
            return null;
        }
        this.logger.trace("BrowserCacheManager.getAppMetadata: cache hit");
        return CacheManager.toObject(new AppMetadataEntity(), parsedMetadata);
    };
    /**
     * set appMetadata entity to the platform cache
     * @param appMetadata
     */
    BrowserCacheManager.prototype.setAppMetadata = function (appMetadata) {
        this.logger.trace("BrowserCacheManager.setAppMetadata called");
        var appMetadataKey = appMetadata.generateAppMetadataKey();
        this.setItem(appMetadataKey, JSON.stringify(appMetadata));
    };
    /**
     * fetch server telemetry entity from the platform cache
     * @param serverTelemetryKey
     */
    BrowserCacheManager.prototype.getServerTelemetry = function (serverTelemetryKey) {
        var value = this.getItem(serverTelemetryKey);
        if (!value) {
            this.logger.trace("BrowserCacheManager.getServerTelemetry: called, no cache hit");
            return null;
        }
        var parsedMetadata = this.validateAndParseJson(value);
        if (!parsedMetadata || !ServerTelemetryEntity.isServerTelemetryEntity(serverTelemetryKey, parsedMetadata)) {
            this.logger.trace("BrowserCacheManager.getServerTelemetry: called, no cache hit");
            return null;
        }
        this.logger.trace("BrowserCacheManager.getServerTelemetry: cache hit");
        return CacheManager.toObject(new ServerTelemetryEntity(), parsedMetadata);
    };
    /**
     * set server telemetry entity to the platform cache
     * @param serverTelemetryKey
     * @param serverTelemetry
     */
    BrowserCacheManager.prototype.setServerTelemetry = function (serverTelemetryKey, serverTelemetry) {
        this.logger.trace("BrowserCacheManager.setServerTelemetry called");
        this.setItem(serverTelemetryKey, JSON.stringify(serverTelemetry));
    };
    /**
     *
     */
    BrowserCacheManager.prototype.getAuthorityMetadata = function (key) {
        var value = this.internalStorage.getItem(key);
        if (!value) {
            this.logger.trace("BrowserCacheManager.getAuthorityMetadata: called, no cache hit");
            return null;
        }
        var parsedMetadata = this.validateAndParseJson(value);
        if (parsedMetadata && AuthorityMetadataEntity.isAuthorityMetadataEntity(key, parsedMetadata)) {
            this.logger.trace("BrowserCacheManager.getAuthorityMetadata: cache hit");
            return CacheManager.toObject(new AuthorityMetadataEntity(), parsedMetadata);
        }
        return null;
    };
    /**
     *
     */
    BrowserCacheManager.prototype.getAuthorityMetadataKeys = function () {
        var _this = this;
        var allKeys = this.internalStorage.getKeys();
        return allKeys.filter(function (key) {
            return _this.isAuthorityMetadata(key);
        });
    };
    /**
     * Sets wrapper metadata in memory
     * @param wrapperSKU
     * @param wrapperVersion
     */
    BrowserCacheManager.prototype.setWrapperMetadata = function (wrapperSKU, wrapperVersion) {
        this.internalStorage.setItem(InMemoryCacheKeys.WRAPPER_SKU, wrapperSKU);
        this.internalStorage.setItem(InMemoryCacheKeys.WRAPPER_VER, wrapperVersion);
    };
    /**
     * Returns wrapper metadata from in-memory storage
     */
    BrowserCacheManager.prototype.getWrapperMetadata = function () {
        var sku = this.internalStorage.getItem(InMemoryCacheKeys.WRAPPER_SKU) || Constants.EMPTY_STRING;
        var version = this.internalStorage.getItem(InMemoryCacheKeys.WRAPPER_VER) || Constants.EMPTY_STRING;
        return [sku, version];
    };
    /**
     *
     * @param entity
     */
    BrowserCacheManager.prototype.setAuthorityMetadata = function (key, entity) {
        this.logger.trace("BrowserCacheManager.setAuthorityMetadata called");
        this.internalStorage.setItem(key, JSON.stringify(entity));
    };
    /**
     * Gets the active account
     */
    BrowserCacheManager.prototype.getActiveAccount = function () {
        var activeAccountKeyFilters = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT_FILTERS);
        var activeAccountValueFilters = this.getItem(activeAccountKeyFilters);
        if (!activeAccountValueFilters) {
            // if new active account cache type isn't found, it's an old version, so look for that instead
            this.logger.trace("No active account filters cache schema found, looking for legacy schema");
            var activeAccountKeyLocal = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT);
            var activeAccountValueLocal = this.getItem(activeAccountKeyLocal);
            if (!activeAccountValueLocal) {
                this.logger.trace("No active account found");
                return null;
            }
            var activeAccount = this.getAccountInfoByFilter({ localAccountId: activeAccountValueLocal })[0] || null;
            if (activeAccount) {
                this.logger.trace("Legacy active account cache schema found");
                this.logger.trace("Adding active account filters cache schema");
                this.setActiveAccount(activeAccount);
                return activeAccount;
            }
            return null;
        }
        var activeAccountValueObj = this.validateAndParseJson(activeAccountValueFilters);
        if (activeAccountValueObj) {
            this.logger.trace("Active account filters schema found");
            return this.getAccountInfoByFilter({
                homeAccountId: activeAccountValueObj.homeAccountId,
                localAccountId: activeAccountValueObj.localAccountId
            })[0] || null;
        }
        this.logger.trace("No active account found");
        return null;
    };
    /**
     * Sets the active account's localAccountId in cache
     * @param account
     */
    BrowserCacheManager.prototype.setActiveAccount = function (account) {
        var activeAccountKey = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT_FILTERS);
        var activeAccountKeyLocal = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT);
        if (account) {
            this.logger.verbose("setActiveAccount: Active account set");
            var activeAccountValue = {
                homeAccountId: account.homeAccountId,
                localAccountId: account.localAccountId
            };
            this.browserStorage.setItem(activeAccountKey, JSON.stringify(activeAccountValue));
            this.browserStorage.setItem(activeAccountKeyLocal, account.localAccountId);
        }
        else {
            this.logger.verbose("setActiveAccount: No account passed, active account not set");
            this.browserStorage.removeItem(activeAccountKey);
            this.browserStorage.removeItem(activeAccountKeyLocal);
        }
    };
    /**
     * Gets a list of accounts that match all of the filters provided
     * @param account
     */
    BrowserCacheManager.prototype.getAccountInfoByFilter = function (accountFilter) {
        var allAccounts = this.getAllAccounts();
        return allAccounts.filter(function (accountObj) {
            if (accountFilter.username && accountFilter.username.toLowerCase() !== accountObj.username.toLowerCase()) {
                return false;
            }
            if (accountFilter.homeAccountId && accountFilter.homeAccountId !== accountObj.homeAccountId) {
                return false;
            }
            if (accountFilter.localAccountId && accountFilter.localAccountId !== accountObj.localAccountId) {
                return false;
            }
            if (accountFilter.tenantId && accountFilter.tenantId !== accountObj.tenantId) {
                return false;
            }
            if (accountFilter.environment && accountFilter.environment !== accountObj.environment) {
                return false;
            }
            return true;
        });
    };
    /**
     * Checks the cache for accounts matching loginHint or SID
     * @param loginHint
     * @param sid
     */
    BrowserCacheManager.prototype.getAccountInfoByHints = function (loginHint, sid) {
        var matchingAccounts = this.getAllAccounts().filter(function (accountInfo) {
            if (sid) {
                var accountSid = accountInfo.idTokenClaims && accountInfo.idTokenClaims["sid"];
                return sid === accountSid;
            }
            if (loginHint) {
                return loginHint === accountInfo.username;
            }
            return false;
        });
        if (matchingAccounts.length === 1) {
            return matchingAccounts[0];
        }
        else if (matchingAccounts.length > 1) {
            throw ClientAuthError.createMultipleMatchingAccountsInCacheError();
        }
        return null;
    };
    /**
     * fetch throttling entity from the platform cache
     * @param throttlingCacheKey
     */
    BrowserCacheManager.prototype.getThrottlingCache = function (throttlingCacheKey) {
        var value = this.getItem(throttlingCacheKey);
        if (!value) {
            this.logger.trace("BrowserCacheManager.getThrottlingCache: called, no cache hit");
            return null;
        }
        var parsedThrottlingCache = this.validateAndParseJson(value);
        if (!parsedThrottlingCache || !ThrottlingEntity.isThrottlingEntity(throttlingCacheKey, parsedThrottlingCache)) {
            this.logger.trace("BrowserCacheManager.getThrottlingCache: called, no cache hit");
            return null;
        }
        this.logger.trace("BrowserCacheManager.getThrottlingCache: cache hit");
        return CacheManager.toObject(new ThrottlingEntity(), parsedThrottlingCache);
    };
    /**
     * set throttling entity to the platform cache
     * @param throttlingCacheKey
     * @param throttlingCache
     */
    BrowserCacheManager.prototype.setThrottlingCache = function (throttlingCacheKey, throttlingCache) {
        this.logger.trace("BrowserCacheManager.setThrottlingCache called");
        this.setItem(throttlingCacheKey, JSON.stringify(throttlingCache));
    };
    /**
     * Gets cache item with given key.
     * Will retrieve from cookies if storeAuthStateInCookie is set to true.
     * @param key
     */
    BrowserCacheManager.prototype.getTemporaryCache = function (cacheKey, generateKey) {
        var key = generateKey ? this.generateCacheKey(cacheKey) : cacheKey;
        if (this.cacheConfig.storeAuthStateInCookie) {
            var itemCookie = this.getItemCookie(key);
            if (itemCookie) {
                this.logger.trace("BrowserCacheManager.getTemporaryCache: storeAuthStateInCookies set to true, retrieving from cookies");
                return itemCookie;
            }
        }
        var value = this.temporaryCacheStorage.getItem(key);
        if (!value) {
            // If temp cache item not found in session/memory, check local storage for items set by old versions
            if (this.cacheConfig.cacheLocation === BrowserCacheLocation.LocalStorage) {
                var item = this.browserStorage.getItem(key);
                if (item) {
                    this.logger.trace("BrowserCacheManager.getTemporaryCache: Temporary cache item found in local storage");
                    return item;
                }
            }
            this.logger.trace("BrowserCacheManager.getTemporaryCache: No cache item found in local storage");
            return null;
        }
        this.logger.trace("BrowserCacheManager.getTemporaryCache: Temporary cache item returned");
        return value;
    };
    /**
     * Sets the cache item with the key and value given.
     * Stores in cookie if storeAuthStateInCookie is set to true.
     * This can cause cookie overflow if used incorrectly.
     * @param key
     * @param value
     */
    BrowserCacheManager.prototype.setTemporaryCache = function (cacheKey, value, generateKey) {
        var key = generateKey ? this.generateCacheKey(cacheKey) : cacheKey;
        this.temporaryCacheStorage.setItem(key, value);
        if (this.cacheConfig.storeAuthStateInCookie) {
            this.logger.trace("BrowserCacheManager.setTemporaryCache: storeAuthStateInCookie set to true, setting item cookie");
            this.setItemCookie(key, value);
        }
    };
    /**
     * Removes the cache item with the given key.
     * Will also clear the cookie item if storeAuthStateInCookie is set to true.
     * @param key
     */
    BrowserCacheManager.prototype.removeItem = function (key) {
        this.browserStorage.removeItem(key);
        this.temporaryCacheStorage.removeItem(key);
        if (this.cacheConfig.storeAuthStateInCookie) {
            this.logger.trace("BrowserCacheManager.removeItem: storeAuthStateInCookie is true, clearing item cookie");
            this.clearItemCookie(key);
        }
        return true;
    };
    /**
     * Checks whether key is in cache.
     * @param key
     */
    BrowserCacheManager.prototype.containsKey = function (key) {
        return this.browserStorage.containsKey(key) || this.temporaryCacheStorage.containsKey(key);
    };
    /**
     * Gets all keys in window.
     */
    BrowserCacheManager.prototype.getKeys = function () {
        return __spread(this.browserStorage.getKeys(), this.temporaryCacheStorage.getKeys());
    };
    /**
     * Clears all cache entries created by MSAL.
     */
    BrowserCacheManager.prototype.clear = function () {
        return __awaiter(this, void 0, void 0, function () {
            var _this = this;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: 
                    // Removes all accounts and their credentials
                    return [4 /*yield*/, this.removeAllAccounts()];
                    case 1:
                        // Removes all accounts and their credentials
                        _a.sent();
                        this.removeAppMetadata();
                        // Removes all remaining MSAL cache items
                        this.getKeys().forEach(function (cacheKey) {
                            // Check if key contains msal prefix; For now, we are clearing all the cache items created by MSAL.js
                            if ((_this.browserStorage.containsKey(cacheKey) || _this.temporaryCacheStorage.containsKey(cacheKey)) && ((cacheKey.indexOf(Constants.CACHE_PREFIX) !== -1) || (cacheKey.indexOf(_this.clientId) !== -1))) {
                                _this.removeItem(cacheKey);
                            }
                        });
                        this.internalStorage.clear();
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Add value to cookies
     * @param cookieName
     * @param cookieValue
     * @param expires
     */
    BrowserCacheManager.prototype.setItemCookie = function (cookieName, cookieValue, expires) {
        var cookieStr = encodeURIComponent(cookieName) + "=" + encodeURIComponent(cookieValue) + ";path=/;SameSite=Lax;";
        if (expires) {
            var expireTime = this.getCookieExpirationTime(expires);
            cookieStr += "expires=" + expireTime + ";";
        }
        if (this.cacheConfig.secureCookies) {
            cookieStr += "Secure;";
        }
        document.cookie = cookieStr;
    };
    /**
     * Get one item by key from cookies
     * @param cookieName
     */
    BrowserCacheManager.prototype.getItemCookie = function (cookieName) {
        var name = encodeURIComponent(cookieName) + "=";
        var cookieList = document.cookie.split(";");
        for (var i = 0; i < cookieList.length; i++) {
            var cookie = cookieList[i];
            while (cookie.charAt(0) === " ") {
                cookie = cookie.substring(1);
            }
            if (cookie.indexOf(name) === 0) {
                return decodeURIComponent(cookie.substring(name.length, cookie.length));
            }
        }
        return Constants.EMPTY_STRING;
    };
    /**
     * Clear all msal-related cookies currently set in the browser. Should only be used to clear temporary cache items.
     */
    BrowserCacheManager.prototype.clearMsalCookies = function () {
        var _this = this;
        var cookiePrefix = Constants.CACHE_PREFIX + "." + this.clientId;
        var cookieList = document.cookie.split(";");
        cookieList.forEach(function (cookie) {
            while (cookie.charAt(0) === " ") {
                // eslint-disable-next-line no-param-reassign
                cookie = cookie.substring(1);
            }
            if (cookie.indexOf(cookiePrefix) === 0) {
                var cookieKey = cookie.split("=")[0];
                _this.clearItemCookie(cookieKey);
            }
        });
    };
    /**
     * Clear an item in the cookies by key
     * @param cookieName
     */
    BrowserCacheManager.prototype.clearItemCookie = function (cookieName) {
        this.setItemCookie(cookieName, Constants.EMPTY_STRING, -1);
    };
    /**
     * Get cookie expiration time
     * @param cookieLifeDays
     */
    BrowserCacheManager.prototype.getCookieExpirationTime = function (cookieLifeDays) {
        var today = new Date();
        var expr = new Date(today.getTime() + cookieLifeDays * this.COOKIE_LIFE_MULTIPLIER);
        return expr.toUTCString();
    };
    /**
     * Gets the cache object referenced by the browser
     */
    BrowserCacheManager.prototype.getCache = function () {
        return this.browserStorage;
    };
    /**
     * interface compat, we cannot overwrite browser cache; Functionality is supported by individual entities in browser
     */
    BrowserCacheManager.prototype.setCache = function () {
        // sets nothing
    };
    /**
     * Prepend msal.<client-id> to each key; Skip for any JSON object as Key (defined schemas do not need the key appended: AccessToken Keys or the upcoming schema)
     * @param key
     * @param addInstanceId
     */
    BrowserCacheManager.prototype.generateCacheKey = function (key) {
        var generatedKey = this.validateAndParseJson(key);
        if (!generatedKey) {
            if (StringUtils.startsWith(key, Constants.CACHE_PREFIX) || StringUtils.startsWith(key, PersistentCacheKeys.ADAL_ID_TOKEN)) {
                return key;
            }
            return Constants.CACHE_PREFIX + "." + this.clientId + "." + key;
        }
        return JSON.stringify(key);
    };
    /**
     * Create authorityKey to cache authority
     * @param state
     */
    BrowserCacheManager.prototype.generateAuthorityKey = function (stateString) {
        var stateId = ProtocolUtils.parseRequestState(this.cryptoImpl, stateString).libraryState.id;
        return this.generateCacheKey(TemporaryCacheKeys.AUTHORITY + "." + stateId);
    };
    /**
     * Create Nonce key to cache nonce
     * @param state
     */
    BrowserCacheManager.prototype.generateNonceKey = function (stateString) {
        var stateId = ProtocolUtils.parseRequestState(this.cryptoImpl, stateString).libraryState.id;
        return this.generateCacheKey(TemporaryCacheKeys.NONCE_IDTOKEN + "." + stateId);
    };
    /**
     * Creates full cache key for the request state
     * @param stateString State string for the request
     */
    BrowserCacheManager.prototype.generateStateKey = function (stateString) {
        // Use the library state id to key temp storage for uniqueness for multiple concurrent requests
        var stateId = ProtocolUtils.parseRequestState(this.cryptoImpl, stateString).libraryState.id;
        return this.generateCacheKey(TemporaryCacheKeys.REQUEST_STATE + "." + stateId);
    };
    /**
     * Gets the cached authority based on the cached state. Returns empty if no cached state found.
     */
    BrowserCacheManager.prototype.getCachedAuthority = function (cachedState) {
        var stateCacheKey = this.generateStateKey(cachedState);
        var state = this.getTemporaryCache(stateCacheKey);
        if (!state) {
            return null;
        }
        var authorityCacheKey = this.generateAuthorityKey(state);
        return this.getTemporaryCache(authorityCacheKey);
    };
    /**
     * Updates account, authority, and state in cache
     * @param serverAuthenticationRequest
     * @param account
     */
    BrowserCacheManager.prototype.updateCacheEntries = function (state, nonce, authorityInstance, loginHint, account) {
        this.logger.trace("BrowserCacheManager.updateCacheEntries called");
        // Cache the request state
        var stateCacheKey = this.generateStateKey(state);
        this.setTemporaryCache(stateCacheKey, state, false);
        // Cache the nonce
        var nonceCacheKey = this.generateNonceKey(state);
        this.setTemporaryCache(nonceCacheKey, nonce, false);
        // Cache authorityKey
        var authorityCacheKey = this.generateAuthorityKey(state);
        this.setTemporaryCache(authorityCacheKey, authorityInstance, false);
        if (account) {
            var ccsCredential = {
                credential: account.homeAccountId,
                type: CcsCredentialType.HOME_ACCOUNT_ID
            };
            this.setTemporaryCache(TemporaryCacheKeys.CCS_CREDENTIAL, JSON.stringify(ccsCredential), true);
        }
        else if (!StringUtils.isEmpty(loginHint)) {
            var ccsCredential = {
                credential: loginHint,
                type: CcsCredentialType.UPN
            };
            this.setTemporaryCache(TemporaryCacheKeys.CCS_CREDENTIAL, JSON.stringify(ccsCredential), true);
        }
    };
    /**
     * Reset all temporary cache items
     * @param state
     */
    BrowserCacheManager.prototype.resetRequestCache = function (state) {
        var _this = this;
        this.logger.trace("BrowserCacheManager.resetRequestCache called");
        // check state and remove associated cache items
        if (!StringUtils.isEmpty(state)) {
            this.getKeys().forEach(function (key) {
                if (key.indexOf(state) !== -1) {
                    _this.removeItem(key);
                }
            });
        }
        // delete generic interactive request parameters
        if (state) {
            this.removeItem(this.generateStateKey(state));
            this.removeItem(this.generateNonceKey(state));
            this.removeItem(this.generateAuthorityKey(state));
        }
        this.removeItem(this.generateCacheKey(TemporaryCacheKeys.REQUEST_PARAMS));
        this.removeItem(this.generateCacheKey(TemporaryCacheKeys.ORIGIN_URI));
        this.removeItem(this.generateCacheKey(TemporaryCacheKeys.URL_HASH));
        this.removeItem(this.generateCacheKey(TemporaryCacheKeys.CORRELATION_ID));
        this.removeItem(this.generateCacheKey(TemporaryCacheKeys.CCS_CREDENTIAL));
        this.removeItem(this.generateCacheKey(TemporaryCacheKeys.NATIVE_REQUEST));
        this.setInteractionInProgress(false);
    };
    /**
     * Removes temporary cache for the provided state
     * @param stateString
     */
    BrowserCacheManager.prototype.cleanRequestByState = function (stateString) {
        this.logger.trace("BrowserCacheManager.cleanRequestByState called");
        // Interaction is completed - remove interaction status.
        if (stateString) {
            var stateKey = this.generateStateKey(stateString);
            var cachedState = this.temporaryCacheStorage.getItem(stateKey);
            this.logger.infoPii("BrowserCacheManager.cleanRequestByState: Removing temporary cache items for state: " + cachedState);
            this.resetRequestCache(cachedState || Constants.EMPTY_STRING);
        }
        this.clearMsalCookies();
    };
    /**
     * Looks in temporary cache for any state values with the provided interactionType and removes all temporary cache items for that state
     * Used in scenarios where temp cache needs to be cleaned but state is not known, such as clicking browser back button.
     * @param interactionType
     */
    BrowserCacheManager.prototype.cleanRequestByInteractionType = function (interactionType) {
        var _this = this;
        this.logger.trace("BrowserCacheManager.cleanRequestByInteractionType called");
        // Loop through all keys to find state key
        this.getKeys().forEach(function (key) {
            // If this key is not the state key, move on
            if (key.indexOf(TemporaryCacheKeys.REQUEST_STATE) === -1) {
                return;
            }
            // Retrieve state value, return if not a valid value
            var stateValue = _this.temporaryCacheStorage.getItem(key);
            if (!stateValue) {
                return;
            }
            // Extract state and ensure it matches given InteractionType, then clean request cache
            var parsedState = BrowserProtocolUtils.extractBrowserRequestState(_this.cryptoImpl, stateValue);
            if (parsedState && parsedState.interactionType === interactionType) {
                _this.logger.infoPii("BrowserCacheManager.cleanRequestByInteractionType: Removing temporary cache items for state: " + stateValue);
                _this.resetRequestCache(stateValue);
            }
        });
        this.clearMsalCookies();
        this.setInteractionInProgress(false);
    };
    BrowserCacheManager.prototype.cacheCodeRequest = function (authCodeRequest, browserCrypto) {
        this.logger.trace("BrowserCacheManager.cacheCodeRequest called");
        var encodedValue = browserCrypto.base64Encode(JSON.stringify(authCodeRequest));
        this.setTemporaryCache(TemporaryCacheKeys.REQUEST_PARAMS, encodedValue, true);
    };
    /**
     * Gets the token exchange parameters from the cache. Throws an error if nothing is found.
     */
    BrowserCacheManager.prototype.getCachedRequest = function (state, browserCrypto) {
        this.logger.trace("BrowserCacheManager.getCachedRequest called");
        // Get token request from cache and parse as TokenExchangeParameters.
        var encodedTokenRequest = this.getTemporaryCache(TemporaryCacheKeys.REQUEST_PARAMS, true);
        if (!encodedTokenRequest) {
            throw BrowserAuthError.createNoTokenRequestCacheError();
        }
        var parsedRequest = this.validateAndParseJson(browserCrypto.base64Decode(encodedTokenRequest));
        if (!parsedRequest) {
            throw BrowserAuthError.createUnableToParseTokenRequestCacheError();
        }
        this.removeItem(this.generateCacheKey(TemporaryCacheKeys.REQUEST_PARAMS));
        // Get cached authority and use if no authority is cached with request.
        if (StringUtils.isEmpty(parsedRequest.authority)) {
            var authorityCacheKey = this.generateAuthorityKey(state);
            var cachedAuthority = this.getTemporaryCache(authorityCacheKey);
            if (!cachedAuthority) {
                throw BrowserAuthError.createNoCachedAuthorityError();
            }
            parsedRequest.authority = cachedAuthority;
        }
        return parsedRequest;
    };
    /**
     * Gets cached native request for redirect flows
     */
    BrowserCacheManager.prototype.getCachedNativeRequest = function () {
        this.logger.trace("BrowserCacheManager.getCachedNativeRequest called");
        var cachedRequest = this.getTemporaryCache(TemporaryCacheKeys.NATIVE_REQUEST, true);
        if (!cachedRequest) {
            this.logger.trace("BrowserCacheManager.getCachedNativeRequest: No cached native request found");
            return null;
        }
        var parsedRequest = this.validateAndParseJson(cachedRequest);
        if (!parsedRequest) {
            this.logger.error("BrowserCacheManager.getCachedNativeRequest: Unable to parse native request");
            return null;
        }
        return parsedRequest;
    };
    BrowserCacheManager.prototype.isInteractionInProgress = function (matchClientId) {
        var clientId = this.getInteractionInProgress();
        if (matchClientId) {
            return clientId === this.clientId;
        }
        else {
            return !!clientId;
        }
    };
    BrowserCacheManager.prototype.getInteractionInProgress = function () {
        var key = Constants.CACHE_PREFIX + "." + TemporaryCacheKeys.INTERACTION_STATUS_KEY;
        return this.getTemporaryCache(key, false);
    };
    BrowserCacheManager.prototype.setInteractionInProgress = function (inProgress) {
        // Ensure we don't overwrite interaction in progress for a different clientId
        var key = Constants.CACHE_PREFIX + "." + TemporaryCacheKeys.INTERACTION_STATUS_KEY;
        if (inProgress) {
            if (this.getInteractionInProgress()) {
                throw BrowserAuthError.createInteractionInProgressError();
            }
            else {
                // No interaction is in progress
                this.setTemporaryCache(key, this.clientId, false);
            }
        }
        else if (!inProgress && this.getInteractionInProgress() === this.clientId) {
            this.removeItem(key);
        }
    };
    /**
     * Returns username retrieved from ADAL or MSAL v1 idToken
     */
    BrowserCacheManager.prototype.getLegacyLoginHint = function () {
        // Only check for adal/msal token if no SSO params are being used
        var adalIdTokenString = this.getTemporaryCache(PersistentCacheKeys.ADAL_ID_TOKEN);
        if (adalIdTokenString) {
            this.browserStorage.removeItem(PersistentCacheKeys.ADAL_ID_TOKEN);
            this.logger.verbose("Cached ADAL id token retrieved.");
        }
        // Check for cached MSAL v1 id token
        var msalIdTokenString = this.getTemporaryCache(PersistentCacheKeys.ID_TOKEN, true);
        if (msalIdTokenString) {
            this.removeItem(this.generateCacheKey(PersistentCacheKeys.ID_TOKEN));
            this.logger.verbose("Cached MSAL.js v1 id token retrieved");
        }
        var cachedIdTokenString = msalIdTokenString || adalIdTokenString;
        if (cachedIdTokenString) {
            var cachedIdToken = new IdToken(cachedIdTokenString, this.cryptoImpl);
            if (cachedIdToken.claims && cachedIdToken.claims.preferred_username) {
                this.logger.verbose("No SSO params used and ADAL/MSAL v1 token retrieved, setting ADAL/MSAL v1 preferred_username as loginHint");
                return cachedIdToken.claims.preferred_username;
            }
            else if (cachedIdToken.claims && cachedIdToken.claims.upn) {
                this.logger.verbose("No SSO params used and ADAL/MSAL v1 token retrieved, setting ADAL/MSAL v1 upn as loginHint");
                return cachedIdToken.claims.upn;
            }
            else {
                this.logger.verbose("No SSO params used and ADAL/MSAL v1 token retrieved, however, no account hint claim found. Enable preferred_username or upn id token claim to get SSO.");
            }
        }
        return null;
    };
    /**
     * Updates a credential's cache key if the current cache key is outdated
     */
    BrowserCacheManager.prototype.updateCredentialCacheKey = function (currentCacheKey, credential) {
        var updatedCacheKey = credential.generateCredentialKey();
        if (currentCacheKey !== updatedCacheKey) {
            var cacheItem = this.getItem(currentCacheKey);
            if (cacheItem) {
                this.removeItem(currentCacheKey);
                this.setItem(updatedCacheKey, cacheItem);
                this.logger.verbose("Updated an outdated " + credential.credentialType + " cache key");
                return updatedCacheKey;
            }
            else {
                this.logger.error("Attempted to update an outdated " + credential.credentialType + " cache key but no item matching the outdated key was found in storage");
            }
        }
        return currentCacheKey;
    };
    return BrowserCacheManager;
}(CacheManager));
var DEFAULT_BROWSER_CACHE_MANAGER = function (clientId, logger) {
    var cacheOptions = {
        cacheLocation: BrowserCacheLocation.MemoryStorage,
        storeAuthStateInCookie: false,
        secureCookies: false
    };
    return new BrowserCacheManager(clientId, cacheOptions, DEFAULT_CRYPTO_IMPLEMENTATION, logger);
};

export { BrowserCacheManager, DEFAULT_BROWSER_CACHE_MANAGER };
//# sourceMappingURL=BrowserCacheManager.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { BrowserConfigurationAuthError } from '../error/BrowserConfigurationAuthError.js';
import { BrowserCacheLocation } from '../utils/BrowserConstants.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var BrowserStorage = /** @class */ (function () {
    function BrowserStorage(cacheLocation) {
        this.validateWindowStorage(cacheLocation);
        this.windowStorage = window[cacheLocation];
    }
    BrowserStorage.prototype.validateWindowStorage = function (cacheLocation) {
        if (cacheLocation !== BrowserCacheLocation.LocalStorage && cacheLocation !== BrowserCacheLocation.SessionStorage) {
            throw BrowserConfigurationAuthError.createStorageNotSupportedError(cacheLocation);
        }
        var storageSupported = !!window[cacheLocation];
        if (!storageSupported) {
            throw BrowserConfigurationAuthError.createStorageNotSupportedError(cacheLocation);
        }
    };
    BrowserStorage.prototype.getItem = function (key) {
        return this.windowStorage.getItem(key);
    };
    BrowserStorage.prototype.setItem = function (key, value) {
        this.windowStorage.setItem(key, value);
    };
    BrowserStorage.prototype.removeItem = function (key) {
        this.windowStorage.removeItem(key);
    };
    BrowserStorage.prototype.getKeys = function () {
        return Object.keys(this.windowStorage);
    };
    BrowserStorage.prototype.containsKey = function (key) {
        return this.windowStorage.hasOwnProperty(key);
    };
    return BrowserStorage;
}());

export { BrowserStorage };
//# sourceMappingURL=BrowserStorage.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __awaiter, __generator } from '../_virtual/_tslib.js';
import { BrowserAuthError } from '../error/BrowserAuthError.js';
import { DB_NAME, DB_VERSION, DB_TABLE_NAME } from '../utils/BrowserConstants.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Storage wrapper for IndexedDB storage in browsers: https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API
 */
var DatabaseStorage = /** @class */ (function () {
    function DatabaseStorage() {
        this.dbName = DB_NAME;
        this.version = DB_VERSION;
        this.tableName = DB_TABLE_NAME;
        this.dbOpen = false;
    }
    /**
     * Opens IndexedDB instance.
     */
    DatabaseStorage.prototype.open = function () {
        return __awaiter(this, void 0, void 0, function () {
            var _this = this;
            return __generator(this, function (_a) {
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        var openDB = window.indexedDB.open(_this.dbName, _this.version);
                        openDB.addEventListener("upgradeneeded", function (e) {
                            var event = e;
                            event.target.result.createObjectStore(_this.tableName);
                        });
                        openDB.addEventListener("success", function (e) {
                            var event = e;
                            _this.db = event.target.result;
                            _this.dbOpen = true;
                            resolve();
                        });
                        openDB.addEventListener("error", function () { return reject(BrowserAuthError.createDatabaseUnavailableError()); });
                    })];
            });
        });
    };
    /**
     * Closes the connection to IndexedDB database when all pending transactions
     * complete.
     */
    DatabaseStorage.prototype.closeConnection = function () {
        var db = this.db;
        if (db && this.dbOpen) {
            db.close();
            this.dbOpen = false;
        }
    };
    /**
     * Opens database if it's not already open
     */
    DatabaseStorage.prototype.validateDbIsOpen = function () {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        if (!!this.dbOpen) return [3 /*break*/, 2];
                        return [4 /*yield*/, this.open()];
                    case 1: return [2 /*return*/, _a.sent()];
                    case 2: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Retrieves item from IndexedDB instance.
     * @param key
     */
    DatabaseStorage.prototype.getItem = function (key) {
        return __awaiter(this, void 0, void 0, function () {
            var _this = this;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.validateDbIsOpen()];
                    case 1:
                        _a.sent();
                        return [2 /*return*/, new Promise(function (resolve, reject) {
                                // TODO: Add timeouts?
                                if (!_this.db) {
                                    return reject(BrowserAuthError.createDatabaseNotOpenError());
                                }
                                var transaction = _this.db.transaction([_this.tableName], "readonly");
                                var objectStore = transaction.objectStore(_this.tableName);
                                var dbGet = objectStore.get(key);
                                dbGet.addEventListener("success", function (e) {
                                    var event = e;
                                    _this.closeConnection();
                                    resolve(event.target.result);
                                });
                                dbGet.addEventListener("error", function (e) {
                                    _this.closeConnection();
                                    reject(e);
                                });
                            })];
                }
            });
        });
    };
    /**
     * Adds item to IndexedDB under given key
     * @param key
     * @param payload
     */
    DatabaseStorage.prototype.setItem = function (key, payload) {
        return __awaiter(this, void 0, void 0, function () {
            var _this = this;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.validateDbIsOpen()];
                    case 1:
                        _a.sent();
                        return [2 /*return*/, new Promise(function (resolve, reject) {
                                // TODO: Add timeouts?
                                if (!_this.db) {
                                    return reject(BrowserAuthError.createDatabaseNotOpenError());
                                }
                                var transaction = _this.db.transaction([_this.tableName], "readwrite");
                                var objectStore = transaction.objectStore(_this.tableName);
                                var dbPut = objectStore.put(payload, key);
                                dbPut.addEventListener("success", function () {
                                    _this.closeConnection();
                                    resolve();
                                });
                                dbPut.addEventListener("error", function (e) {
                                    _this.closeConnection();
                                    reject(e);
                                });
                            })];
                }
            });
        });
    };
    /**
     * Removes item from IndexedDB under given key
     * @param key
     */
    DatabaseStorage.prototype.removeItem = function (key) {
        return __awaiter(this, void 0, void 0, function () {
            var _this = this;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.validateDbIsOpen()];
                    case 1:
                        _a.sent();
                        return [2 /*return*/, new Promise(function (resolve, reject) {
                                if (!_this.db) {
                                    return reject(BrowserAuthError.createDatabaseNotOpenError());
                                }
                                var transaction = _this.db.transaction([_this.tableName], "readwrite");
                                var objectStore = transaction.objectStore(_this.tableName);
                                var dbDelete = objectStore.delete(key);
                                dbDelete.addEventListener("success", function () {
                                    _this.closeConnection();
                                    resolve();
                                });
                                dbDelete.addEventListener("error", function (e) {
                                    _this.closeConnection();
                                    reject(e);
                                });
                            })];
                }
            });
        });
    };
    /**
     * Get all the keys from the storage object as an iterable array of strings.
     */
    DatabaseStorage.prototype.getKeys = function () {
        return __awaiter(this, void 0, void 0, function () {
            var _this = this;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.validateDbIsOpen()];
                    case 1:
                        _a.sent();
                        return [2 /*return*/, new Promise(function (resolve, reject) {
                                if (!_this.db) {
                                    return reject(BrowserAuthError.createDatabaseNotOpenError());
                                }
                                var transaction = _this.db.transaction([_this.tableName], "readonly");
                                var objectStore = transaction.objectStore(_this.tableName);
                                var dbGetKeys = objectStore.getAllKeys();
                                dbGetKeys.addEventListener("success", function (e) {
                                    var event = e;
                                    _this.closeConnection();
                                    resolve(event.target.result);
                                });
                                dbGetKeys.addEventListener("error", function (e) {
                                    _this.closeConnection();
                                    reject(e);
                                });
                            })];
                }
            });
        });
    };
    /**
     *
     * Checks whether there is an object under the search key in the object store
     */
    DatabaseStorage.prototype.containsKey = function (key) {
        return __awaiter(this, void 0, void 0, function () {
            var _this = this;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.validateDbIsOpen()];
                    case 1:
                        _a.sent();
                        return [2 /*return*/, new Promise(function (resolve, reject) {
                                if (!_this.db) {
                                    return reject(BrowserAuthError.createDatabaseNotOpenError());
                                }
                                var transaction = _this.db.transaction([_this.tableName], "readonly");
                                var objectStore = transaction.objectStore(_this.tableName);
                                var dbContainsKey = objectStore.count(key);
                                dbContainsKey.addEventListener("success", function (e) {
                                    var event = e;
                                    _this.closeConnection();
                                    resolve(event.target.result === 1);
                                });
                                dbContainsKey.addEventListener("error", function (e) {
                                    _this.closeConnection();
                                    reject(e);
                                });
                            })];
                }
            });
        });
    };
    /**
     * Deletes the MSAL database. The database is deleted rather than cleared to make it possible
     * for client applications to downgrade to a previous MSAL version without worrying about forward compatibility issues
     * with IndexedDB database versions.
     */
    DatabaseStorage.prototype.deleteDatabase = function () {
        return __awaiter(this, void 0, void 0, function () {
            var existingDatabases, database;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        // Check if database being deleted exists
                        if (this.db && this.dbOpen) {
                            this.closeConnection();
                        }
                        return [4 /*yield*/, window.indexedDB.databases()];
                    case 1:
                        existingDatabases = _a.sent();
                        database = existingDatabases.find(function (database) { return database.name === DB_NAME; });
                        // If database exists, delete it
                        if (database) {
                            return [2 /*return*/, new Promise(function (resolve, reject) {
                                    var deleteDbRequest = window.indexedDB.deleteDatabase(DB_NAME);
                                    deleteDbRequest.addEventListener("success", function () { return resolve(true); });
                                    deleteDbRequest.addEventListener("error", function () { return reject(false); });
                                })];
                        }
                        // Database doesn't exist, return true
                        return [2 /*return*/, true];
                }
            });
        });
    };
    return DatabaseStorage;
}());

export { DatabaseStorage };
//# sourceMappingURL=DatabaseStorage.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var MemoryStorage = /** @class */ (function () {
    function MemoryStorage() {
        this.cache = new Map();
    }
    MemoryStorage.prototype.getItem = function (key) {
        return this.cache.get(key) || null;
    };
    MemoryStorage.prototype.setItem = function (key, value) {
        this.cache.set(key, value);
    };
    MemoryStorage.prototype.removeItem = function (key) {
        this.cache.delete(key);
    };
    MemoryStorage.prototype.getKeys = function () {
        var cacheKeys = [];
        this.cache.forEach(function (value, key) {
            cacheKeys.push(key);
        });
        return cacheKeys;
    };
    MemoryStorage.prototype.containsKey = function (key) {
        return this.cache.has(key);
    };
    MemoryStorage.prototype.clear = function () {
        this.cache.clear();
    };
    return MemoryStorage;
}());

export { MemoryStorage };
//# sourceMappingURL=MemoryStorage.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { Authority, IdTokenEntity, AuthToken, AccountEntity, ScopeSet, AccessTokenEntity } from '@azure/msal-common';
import { BrowserAuthError } from '../error/BrowserAuthError.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Token cache manager
 */
var TokenCache = /** @class */ (function () {
    function TokenCache(configuration, storage, logger, cryptoObj) {
        this.isBrowserEnvironment = typeof window !== "undefined";
        this.config = configuration;
        this.storage = storage;
        this.logger = logger;
        this.cryptoObj = cryptoObj;
    }
    // Move getAllAccounts here and cache utility APIs
    /**
     * API to load tokens to msal-browser cache.
     * @param request
     * @param response
     * @param options
     */
    TokenCache.prototype.loadExternalTokens = function (request, response, options) {
        this.logger.info("TokenCache - loadExternalTokens called");
        if (!response.id_token) {
            throw BrowserAuthError.createUnableToLoadTokenError("Please ensure server response includes id token.");
        }
        if (request.account) {
            this.loadIdToken(response.id_token, request.account.homeAccountId, request.account.environment, request.account.tenantId, options);
            this.loadAccessToken(request, response, request.account.homeAccountId, request.account.environment, request.account.tenantId, options);
        }
        else if (request.authority) {
            var authorityUrl = Authority.generateAuthority(request.authority, request.azureCloudOptions);
            var authorityOptions = {
                protocolMode: this.config.auth.protocolMode,
                knownAuthorities: this.config.auth.knownAuthorities,
                cloudDiscoveryMetadata: this.config.auth.cloudDiscoveryMetadata,
                authorityMetadata: this.config.auth.authorityMetadata,
                skipAuthorityMetadataCache: this.config.auth.skipAuthorityMetadataCache,
            };
            var authority = new Authority(authorityUrl, this.config.system.networkClient, this.storage, authorityOptions);
            // "clientInfo" from options takes precedence over "clientInfo" in response
            if (options.clientInfo) {
                this.logger.trace("TokenCache - homeAccountId from options");
                this.loadIdToken(response.id_token, options.clientInfo, authority.hostnameAndPort, authority.tenant, options);
                this.loadAccessToken(request, response, options.clientInfo, authority.hostnameAndPort, authority.tenant, options);
            }
            else if (response.client_info) {
                this.logger.trace("TokenCache - homeAccountId from response");
                this.loadIdToken(response.id_token, response.client_info, authority.hostnameAndPort, authority.tenant, options);
                this.loadAccessToken(request, response, response.client_info, authority.hostnameAndPort, authority.tenant, options);
            }
            else {
                throw BrowserAuthError.createUnableToLoadTokenError("Please provide clientInfo in the response or options.");
            }
        }
        else {
            throw BrowserAuthError.createUnableToLoadTokenError("Please provide a request with an account or a request with authority.");
        }
    };
    /**
     * Helper function to load id tokens to msal-browser cache
     * @param idToken
     * @param homeAccountId
     * @param environment
     * @param tenantId
     * @param options
     */
    TokenCache.prototype.loadIdToken = function (idToken, homeAccountId, environment, tenantId, options) {
        var idTokenEntity = IdTokenEntity.createIdTokenEntity(homeAccountId, environment, idToken, this.config.auth.clientId, tenantId);
        var idAuthToken = new AuthToken(idToken, this.cryptoObj);
        var accountEntity = options.clientInfo ?
            AccountEntity.createAccount(options.clientInfo, homeAccountId, idAuthToken, undefined, undefined, undefined, environment) :
            AccountEntity.createGenericAccount(homeAccountId, idAuthToken, undefined, undefined, undefined, environment);
        if (this.isBrowserEnvironment) {
            this.logger.verbose("TokenCache - loading id token");
            this.storage.setAccount(accountEntity);
            this.storage.setIdTokenCredential(idTokenEntity);
        }
        else {
            throw BrowserAuthError.createUnableToLoadTokenError("loadExternalTokens is designed to work in browser environments only.");
        }
    };
    /**
     * Helper function to load access tokens to msal-browser cache
     * @param request
     * @param response
     * @param options
     * @param homeAccountId
     * @param environment
     * @param tenantId
     * @returns
     */
    TokenCache.prototype.loadAccessToken = function (request, response, homeAccountId, environment, tenantId, options) {
        if (!response.access_token) {
            this.logger.verbose("TokenCache - No access token provided for caching");
            return;
        }
        if (!response.expires_in) {
            throw BrowserAuthError.createUnableToLoadTokenError("Please ensure server response includes expires_in value.");
        }
        if (!options.extendedExpiresOn) {
            throw BrowserAuthError.createUnableToLoadTokenError("Please provide an extendedExpiresOn value in the options.");
        }
        var scopes = new ScopeSet(request.scopes).printScopes();
        var expiresOn = options.expiresOn || (response.expires_in + new Date().getTime() / 1000);
        var extendedExpiresOn = options.extendedExpiresOn;
        var accessTokenEntity = AccessTokenEntity.createAccessTokenEntity(homeAccountId, environment, response.access_token, this.config.auth.clientId, tenantId, scopes, expiresOn, extendedExpiresOn, this.cryptoObj);
        if (this.isBrowserEnvironment) {
            this.logger.verbose("TokenCache - loading access token");
            this.storage.setAccessTokenCredential(accessTokenEntity);
        }
        else {
            throw BrowserAuthError.createUnableToLoadTokenError("loadExternalTokens is designed to work in browser environments only.");
        }
    };
    return TokenCache;
}());

export { TokenCache };
//# sourceMappingURL=TokenCache.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __awaiter, __generator } from '../../_virtual/_tslib.js';
import { NativeConstants, NativeExtensionMethod } from '../../utils/BrowserConstants.js';
import { AuthError, AuthenticationScheme } from '@azure/msal-common';
import { NativeAuthError } from '../../error/NativeAuthError.js';
import { BrowserAuthError } from '../../error/BrowserAuthError.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var NativeMessageHandler = /** @class */ (function () {
    function NativeMessageHandler(logger, handshakeTimeoutMs, extensionId) {
        this.logger = logger;
        this.handshakeTimeoutMs = handshakeTimeoutMs;
        this.extensionId = extensionId;
        this.resolvers = new Map(); // Used for non-handshake messages
        this.handshakeResolvers = new Map(); // Used for handshake messages
        this.responseId = 0;
        this.messageChannel = new MessageChannel();
        this.windowListener = this.onWindowMessage.bind(this); // Window event callback doesn't have access to 'this' unless it's bound
    }
    /**
     * Sends a given message to the extension and resolves with the extension response
     * @param body
     */
    NativeMessageHandler.prototype.sendMessage = function (body) {
        return __awaiter(this, void 0, void 0, function () {
            var req;
            var _this = this;
            return __generator(this, function (_a) {
                this.logger.trace("NativeMessageHandler - sendMessage called.");
                req = {
                    channel: NativeConstants.CHANNEL_ID,
                    extensionId: this.extensionId,
                    responseId: this.responseId++,
                    body: body
                };
                this.logger.trace("NativeMessageHandler - Sending request to browser extension");
                this.logger.tracePii("NativeMessageHandler - Sending request to browser extension: " + JSON.stringify(req));
                this.messageChannel.port1.postMessage(req);
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        _this.resolvers.set(req.responseId, { resolve: resolve, reject: reject });
                    })];
            });
        });
    };
    /**
     * Returns an instance of the MessageHandler that has successfully established a connection with an extension
     * @param logger
     * @param handshakeTimeoutMs
     */
    NativeMessageHandler.createProvider = function (logger, handshakeTimeoutMs) {
        return __awaiter(this, void 0, void 0, function () {
            var preferredProvider, backupProvider;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        logger.trace("NativeMessageHandler - createProvider called.");
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 5]);
                        preferredProvider = new NativeMessageHandler(logger, handshakeTimeoutMs, NativeConstants.PREFERRED_EXTENSION_ID);
                        return [4 /*yield*/, preferredProvider.sendHandshakeRequest()];
                    case 2:
                        _a.sent();
                        return [2 /*return*/, preferredProvider];
                    case 3:
                        _a.sent();
                        backupProvider = new NativeMessageHandler(logger, handshakeTimeoutMs);
                        return [4 /*yield*/, backupProvider.sendHandshakeRequest()];
                    case 4:
                        _a.sent();
                        return [2 /*return*/, backupProvider];
                    case 5: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Send handshake request helper.
     */
    NativeMessageHandler.prototype.sendHandshakeRequest = function () {
        return __awaiter(this, void 0, void 0, function () {
            var req;
            var _this = this;
            return __generator(this, function (_a) {
                this.logger.trace("NativeMessageHandler - sendHandshakeRequest called.");
                // Register this event listener before sending handshake
                window.addEventListener("message", this.windowListener, false); // false is important, because content script message processing should work first
                req = {
                    channel: NativeConstants.CHANNEL_ID,
                    extensionId: this.extensionId,
                    responseId: this.responseId++,
                    body: {
                        method: NativeExtensionMethod.HandshakeRequest
                    }
                };
                this.messageChannel.port1.onmessage = function (event) {
                    _this.onChannelMessage(event);
                };
                window.postMessage(req, window.origin, [this.messageChannel.port2]);
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        _this.handshakeResolvers.set(req.responseId, { resolve: resolve, reject: reject });
                        _this.timeoutId = window.setTimeout(function () {
                            /*
                             * Throw an error if neither HandshakeResponse nor original Handshake request are received in a reasonable timeframe.
                             * This typically suggests an event handler stopped propagation of the Handshake request but did not respond to it on the MessageChannel port
                             */
                            window.removeEventListener("message", _this.windowListener, false);
                            _this.messageChannel.port1.close();
                            _this.messageChannel.port2.close();
                            reject(BrowserAuthError.createNativeHandshakeTimeoutError());
                            _this.handshakeResolvers.delete(req.responseId);
                        }, _this.handshakeTimeoutMs); // Use a reasonable timeout in milliseconds here
                    })];
            });
        });
    };
    /**
     * Invoked when a message is posted to the window. If a handshake request is received it means the extension is not installed.
     * @param event
     */
    NativeMessageHandler.prototype.onWindowMessage = function (event) {
        this.logger.trace("NativeMessageHandler - onWindowMessage called");
        // We only accept messages from ourselves
        if (event.source !== window) {
            return;
        }
        var request = event.data;
        if (!request.channel || request.channel !== NativeConstants.CHANNEL_ID) {
            return;
        }
        if (request.extensionId && request.extensionId !== this.extensionId) {
            return;
        }
        if (request.body.method === NativeExtensionMethod.HandshakeRequest) {
            // If we receive this message back it means no extension intercepted the request, meaning no extension supporting handshake protocol is installed
            this.logger.verbose(request.extensionId ? "Extension with id: " + request.extensionId + " not installed" : "No extension installed");
            clearTimeout(this.timeoutId);
            this.messageChannel.port1.close();
            this.messageChannel.port2.close();
            window.removeEventListener("message", this.windowListener, false);
            var handshakeResolver = this.handshakeResolvers.get(request.responseId);
            if (handshakeResolver) {
                handshakeResolver.reject(BrowserAuthError.createNativeExtensionNotInstalledError());
            }
        }
    };
    /**
     * Invoked when a message is received from the extension on the MessageChannel port
     * @param event
     */
    NativeMessageHandler.prototype.onChannelMessage = function (event) {
        this.logger.trace("NativeMessageHandler - onChannelMessage called.");
        var request = event.data;
        var resolver = this.resolvers.get(request.responseId);
        var handshakeResolver = this.handshakeResolvers.get(request.responseId);
        try {
            var method = request.body.method;
            if (method === NativeExtensionMethod.Response) {
                if (!resolver) {
                    return;
                }
                var response = request.body.response;
                this.logger.trace("NativeMessageHandler - Received response from browser extension");
                this.logger.tracePii("NativeMessageHandler - Received response from browser extension: " + JSON.stringify(response));
                if (response.status !== "Success") {
                    resolver.reject(NativeAuthError.createError(response.code, response.description, response.ext));
                }
                else if (response.result) {
                    if (response.result["code"] && response.result["description"]) {
                        resolver.reject(NativeAuthError.createError(response.result["code"], response.result["description"], response.result["ext"]));
                    }
                    else {
                        resolver.resolve(response.result);
                    }
                }
                else {
                    throw AuthError.createUnexpectedError("Event does not contain result.");
                }
                this.resolvers.delete(request.responseId);
            }
            else if (method === NativeExtensionMethod.HandshakeResponse) {
                if (!handshakeResolver) {
                    return;
                }
                clearTimeout(this.timeoutId); // Clear setTimeout
                window.removeEventListener("message", this.windowListener, false); // Remove 'No extension' listener
                this.extensionId = request.extensionId;
                this.logger.verbose("NativeMessageHandler - Received HandshakeResponse from extension: " + this.extensionId);
                handshakeResolver.resolve();
                this.handshakeResolvers.delete(request.responseId);
            }
            // Do nothing if method is not Response or HandshakeResponse
        }
        catch (err) {
            this.logger.error("Error parsing response from WAM Extension");
            this.logger.errorPii("Error parsing response from WAM Extension: " + err.toString());
            this.logger.errorPii("Unable to parse " + event);
            if (resolver) {
                resolver.reject(err);
            }
            else if (handshakeResolver) {
                handshakeResolver.reject(err);
            }
        }
    };
    /**
     * Returns boolean indicating whether or not the request should attempt to use native broker
     * @param logger
     * @param config
     * @param nativeExtensionProvider
     * @param authenticationScheme
     */
    NativeMessageHandler.isNativeAvailable = function (config, logger, nativeExtensionProvider, authenticationScheme) {
        logger.trace("isNativeAvailable called");
        if (!config.system.allowNativeBroker) {
            logger.trace("isNativeAvailable: allowNativeBroker is not enabled, returning false");
            // Developer disabled WAM
            return false;
        }
        if (!nativeExtensionProvider) {
            logger.trace("isNativeAvailable: WAM extension provider is not initialized, returning false");
            // Extension is not available
            return false;
        }
        if (authenticationScheme) {
            switch (authenticationScheme) {
                case AuthenticationScheme.BEARER:
                case AuthenticationScheme.POP:
                    logger.trace("isNativeAvailable: authenticationScheme is supported, returning true");
                    return true;
                default:
                    logger.trace("isNativeAvailable: authenticationScheme is not supported, returning false");
                    return false;
            }
        }
        return true;
    };
    return NativeMessageHandler;
}());

export { NativeMessageHandler };
//# sourceMappingURL=NativeMessageHandler.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __awaiter, __generator, __assign } from '../_virtual/_tslib.js';
import { CryptoOps } from '../crypto/CryptoOps.js';
import { Constants, InteractionRequiredAuthError, PerformanceEvents, PromptValue, AuthError, StringUtils, Logger, StubPerformanceClient, DEFAULT_CRYPTO_IMPLEMENTATION, ServerError } from '@azure/msal-common';
import { BrowserCacheManager, DEFAULT_BROWSER_CACHE_MANAGER } from '../cache/BrowserCacheManager.js';
import { buildConfiguration } from '../config/Configuration.js';
import { InteractionType, ApiId, TemporaryCacheKeys, BrowserCacheLocation, BrowserConstants } from '../utils/BrowserConstants.js';
import { BrowserUtils } from '../utils/BrowserUtils.js';
import { name, version } from '../packageMetadata.js';
import { EventType } from '../event/EventType.js';
import { BrowserConfigurationAuthError } from '../error/BrowserConfigurationAuthError.js';
import { EventHandler } from '../event/EventHandler.js';
import { PopupClient } from '../interaction_client/PopupClient.js';
import { RedirectClient } from '../interaction_client/RedirectClient.js';
import { SilentIframeClient } from '../interaction_client/SilentIframeClient.js';
import { SilentRefreshClient } from '../interaction_client/SilentRefreshClient.js';
import { TokenCache } from '../cache/TokenCache.js';
import { NativeInteractionClient } from '../interaction_client/NativeInteractionClient.js';
import { NativeMessageHandler } from '../broker/nativeBroker/NativeMessageHandler.js';
import { NativeAuthError } from '../error/NativeAuthError.js';
import { SilentCacheClient } from '../interaction_client/SilentCacheClient.js';
import { SilentAuthCodeClient } from '../interaction_client/SilentAuthCodeClient.js';
import { BrowserAuthError } from '../error/BrowserAuthError.js';
import { BrowserPerformanceClient } from '../telemetry/BrowserPerformanceClient.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var ClientApplication = /** @class */ (function () {
    /**
     * @constructor
     * Constructor for the PublicClientApplication used to instantiate the PublicClientApplication object
     *
     * Important attributes in the Configuration object for auth are:
     * - clientID: the application ID of your application. You can obtain one by registering your application with our Application registration portal : https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredAppsPreview
     * - authority: the authority URL for your application.
     * - redirect_uri: the uri of your application registered in the portal.
     *
     * In Azure AD, authority is a URL indicating the Azure active directory that MSAL uses to obtain tokens.
     * It is of the form https://login.microsoftonline.com/{Enter_the_Tenant_Info_Here}
     * If your application supports Accounts in one organizational directory, replace "Enter_the_Tenant_Info_Here" value with the Tenant Id or Tenant name (for example, contoso.microsoft.com).
     * If your application supports Accounts in any organizational directory, replace "Enter_the_Tenant_Info_Here" value with organizations.
     * If your application supports Accounts in any organizational directory and personal Microsoft accounts, replace "Enter_the_Tenant_Info_Here" value with common.
     * To restrict support to Personal Microsoft accounts only, replace "Enter_the_Tenant_Info_Here" value with consumers.
     *
     * In Azure B2C, authority is of the form https://{instance}/tfp/{tenant}/{policyName}/
     * Full B2C functionality will be available in this library in future versions.
     *
     * @param configuration Object for the MSAL PublicClientApplication instance
     */
    function ClientApplication(configuration) {
        /*
         * If loaded in an environment where window is not available,
         * set internal flag to false so that further requests fail.
         * This is to support server-side rendering environments.
         */
        this.isBrowserEnvironment = typeof window !== "undefined";
        // Set the configuration.
        this.config = buildConfiguration(configuration, this.isBrowserEnvironment);
        this.initialized = false;
        // Initialize logger
        this.logger = new Logger(this.config.system.loggerOptions, name, version);
        // Initialize the network module class.
        this.networkClient = this.config.system.networkClient;
        // Initialize the navigation client class.
        this.navigationClient = this.config.system.navigationClient;
        // Initialize redirectResponse Map
        this.redirectResponse = new Map();
        // Initial hybrid spa map
        this.hybridAuthCodeResponses = new Map();
        // Initialize performance client
        this.performanceClient = this.isBrowserEnvironment ?
            new BrowserPerformanceClient(this.config.auth.clientId, this.config.auth.authority, this.logger, name, version, this.config.telemetry.application) :
            new StubPerformanceClient(this.config.auth.clientId, this.config.auth.authority, this.logger, name, version, this.config.telemetry.application);
        // Initialize the crypto class.
        this.browserCrypto = this.isBrowserEnvironment ? new CryptoOps(this.logger, this.performanceClient) : DEFAULT_CRYPTO_IMPLEMENTATION;
        this.eventHandler = new EventHandler(this.logger, this.browserCrypto);
        // Initialize the browser storage class.
        this.browserStorage = this.isBrowserEnvironment ?
            new BrowserCacheManager(this.config.auth.clientId, this.config.cache, this.browserCrypto, this.logger) :
            DEFAULT_BROWSER_CACHE_MANAGER(this.config.auth.clientId, this.logger);
        // initialize in memory storage for native flows
        var nativeCacheOptions = {
            cacheLocation: BrowserCacheLocation.MemoryStorage,
            storeAuthStateInCookie: false,
            secureCookies: false
        };
        this.nativeInternalStorage = new BrowserCacheManager(this.config.auth.clientId, nativeCacheOptions, this.browserCrypto, this.logger);
        // Initialize the token cache
        this.tokenCache = new TokenCache(this.config, this.browserStorage, this.logger, this.browserCrypto);
    }
    /**
     * Initializer function to perform async startup tasks such as connecting to WAM extension
     */
    ClientApplication.prototype.initialize = function () {
        return __awaiter(this, void 0, void 0, function () {
            var _a, e_1;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        this.logger.trace("initialize called");
                        if (this.initialized) {
                            this.logger.info("initialize has already been called, exiting early.");
                            return [2 /*return*/];
                        }
                        this.eventHandler.emitEvent(EventType.INITIALIZE_START);
                        if (!this.config.system.allowNativeBroker) return [3 /*break*/, 4];
                        _b.label = 1;
                    case 1:
                        _b.trys.push([1, 3, , 4]);
                        _a = this;
                        return [4 /*yield*/, NativeMessageHandler.createProvider(this.logger, this.config.system.nativeBrokerHandshakeTimeout)];
                    case 2:
                        _a.nativeExtensionProvider = _b.sent();
                        return [3 /*break*/, 4];
                    case 3:
                        e_1 = _b.sent();
                        this.logger.verbose(e_1);
                        return [3 /*break*/, 4];
                    case 4:
                        this.initialized = true;
                        this.eventHandler.emitEvent(EventType.INITIALIZE_END);
                        return [2 /*return*/];
                }
            });
        });
    };
    // #region Redirect Flow
    /**
     * Event handler function which allows users to fire events after the PublicClientApplication object
     * has loaded during redirect flows. This should be invoked on all page loads involved in redirect
     * auth flows.
     * @param hash Hash to process. Defaults to the current value of window.location.hash. Only needs to be provided explicitly if the response to be handled is not contained in the current value.
     * @returns Token response or null. If the return value is null, then no auth redirect was detected.
     */
    ClientApplication.prototype.handleRedirectPromise = function (hash) {
        return __awaiter(this, void 0, void 0, function () {
            var loggedInAccounts, redirectResponseKey, response, request, redirectResponse, nativeClient, correlationId, redirectClient;
            var _this = this;
            return __generator(this, function (_a) {
                this.logger.verbose("handleRedirectPromise called");
                // Block token acquisition before initialize has been called if native brokering is enabled
                BrowserUtils.blockNativeBrokerCalledBeforeInitialized(this.config.system.allowNativeBroker, this.initialized);
                loggedInAccounts = this.getAllAccounts();
                if (this.isBrowserEnvironment) {
                    redirectResponseKey = hash || Constants.EMPTY_STRING;
                    response = this.redirectResponse.get(redirectResponseKey);
                    if (typeof response === "undefined") {
                        this.eventHandler.emitEvent(EventType.HANDLE_REDIRECT_START, InteractionType.Redirect);
                        this.logger.verbose("handleRedirectPromise has been called for the first time, storing the promise");
                        request = this.browserStorage.getCachedNativeRequest();
                        redirectResponse = void 0;
                        if (request && NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeExtensionProvider) && this.nativeExtensionProvider && !hash) {
                            this.logger.trace("handleRedirectPromise - acquiring token from native platform");
                            nativeClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, ApiId.handleRedirectPromise, this.performanceClient, this.nativeExtensionProvider, request.accountId, this.nativeInternalStorage, request.correlationId);
                            redirectResponse = nativeClient.handleRedirectPromise();
                        }
                        else {
                            this.logger.trace("handleRedirectPromise - acquiring token from web flow");
                            correlationId = this.browserStorage.getTemporaryCache(TemporaryCacheKeys.CORRELATION_ID, true) || Constants.EMPTY_STRING;
                            redirectClient = this.createRedirectClient(correlationId);
                            redirectResponse = redirectClient.handleRedirectPromise(hash);
                        }
                        response = redirectResponse.then(function (result) {
                            if (result) {
                                // Emit login event if number of accounts change
                                var isLoggingIn = loggedInAccounts.length < _this.getAllAccounts().length;
                                if (isLoggingIn) {
                                    _this.eventHandler.emitEvent(EventType.LOGIN_SUCCESS, InteractionType.Redirect, result);
                                    _this.logger.verbose("handleRedirectResponse returned result, login success");
                                }
                                else {
                                    _this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_SUCCESS, InteractionType.Redirect, result);
                                    _this.logger.verbose("handleRedirectResponse returned result, acquire token success");
                                }
                            }
                            _this.eventHandler.emitEvent(EventType.HANDLE_REDIRECT_END, InteractionType.Redirect);
                            return result;
                        }).catch(function (e) {
                            // Emit login event if there is an account
                            if (loggedInAccounts.length > 0) {
                                _this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_FAILURE, InteractionType.Redirect, null, e);
                            }
                            else {
                                _this.eventHandler.emitEvent(EventType.LOGIN_FAILURE, InteractionType.Redirect, null, e);
                            }
                            _this.eventHandler.emitEvent(EventType.HANDLE_REDIRECT_END, InteractionType.Redirect);
                            throw e;
                        });
                        this.redirectResponse.set(redirectResponseKey, response);
                    }
                    else {
                        this.logger.verbose("handleRedirectPromise has been called previously, returning the result from the first call");
                    }
                    return [2 /*return*/, response];
                }
                this.logger.verbose("handleRedirectPromise returns null, not browser environment");
                return [2 /*return*/, null];
            });
        });
    };
    /**
     * Use when you want to obtain an access_token for your API by redirecting the user's browser window to the authorization endpoint. This function redirects
     * the page, so any code that follows this function will not execute.
     *
     * IMPORTANT: It is NOT recommended to have code that is dependent on the resolution of the Promise. This function will navigate away from the current
     * browser window. It currently returns a Promise in order to reflect the asynchronous nature of the code running in this function.
     *
     * @param request
     */
    ClientApplication.prototype.acquireTokenRedirect = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var correlationId, isLoggedIn, result, nativeClient, redirectClient;
            var _this = this;
            return __generator(this, function (_a) {
                correlationId = this.getRequestCorrelationId(request);
                this.logger.verbose("acquireTokenRedirect called", correlationId);
                this.preflightBrowserEnvironmentCheck(InteractionType.Redirect);
                isLoggedIn = this.getAllAccounts().length > 0;
                if (isLoggedIn) {
                    this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_START, InteractionType.Redirect, request);
                }
                else {
                    this.eventHandler.emitEvent(EventType.LOGIN_START, InteractionType.Redirect, request);
                }
                if (this.nativeExtensionProvider && this.canUseNative(request)) {
                    nativeClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, ApiId.acquireTokenRedirect, this.performanceClient, this.nativeExtensionProvider, this.getNativeAccountId(request), this.nativeInternalStorage, request.correlationId);
                    result = nativeClient.acquireTokenRedirect(request).catch(function (e) {
                        if (e instanceof NativeAuthError && e.isFatal()) {
                            _this.nativeExtensionProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt
                            var redirectClient = _this.createRedirectClient(request.correlationId);
                            return redirectClient.acquireToken(request);
                        }
                        else if (e instanceof InteractionRequiredAuthError) {
                            _this.logger.verbose("acquireTokenRedirect - Resolving interaction required error thrown by native broker by falling back to web flow");
                            var redirectClient = _this.createRedirectClient(request.correlationId);
                            return redirectClient.acquireToken(request);
                        }
                        _this.browserStorage.setInteractionInProgress(false);
                        throw e;
                    });
                }
                else {
                    redirectClient = this.createRedirectClient(request.correlationId);
                    result = redirectClient.acquireToken(request);
                }
                return [2 /*return*/, result.catch(function (e) {
                        // If logged in, emit acquire token events
                        if (isLoggedIn) {
                            _this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_FAILURE, InteractionType.Redirect, null, e);
                        }
                        else {
                            _this.eventHandler.emitEvent(EventType.LOGIN_FAILURE, InteractionType.Redirect, null, e);
                        }
                        throw e;
                    })];
            });
        });
    };
    // #endregion
    // #region Popup Flow
    /**
     * Use when you want to obtain an access_token for your API via opening a popup window in the user's browser
     *
     * @param request
     *
     * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.
     */
    ClientApplication.prototype.acquireTokenPopup = function (request) {
        var _this = this;
        var correlationId = this.getRequestCorrelationId(request);
        var atPopupMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.AcquireTokenPopup, correlationId);
        try {
            this.logger.verbose("acquireTokenPopup called", correlationId);
            this.preflightBrowserEnvironmentCheck(InteractionType.Popup);
        }
        catch (e) {
            // Since this function is syncronous we need to reject
            return Promise.reject(e);
        }
        // If logged in, emit acquire token events
        var loggedInAccounts = this.getAllAccounts();
        if (loggedInAccounts.length > 0) {
            this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_START, InteractionType.Popup, request);
        }
        else {
            this.eventHandler.emitEvent(EventType.LOGIN_START, InteractionType.Popup, request);
        }
        var result;
        if (this.canUseNative(request)) {
            result = this.acquireTokenNative(request, ApiId.acquireTokenPopup).then(function (response) {
                _this.browserStorage.setInteractionInProgress(false);
                atPopupMeasurement.endMeasurement({
                    success: true,
                    isNativeBroker: true,
                    accessTokenSize: response.accessToken.length,
                    idTokenSize: response.idToken.length,
                });
                atPopupMeasurement.flushMeasurement();
                return response;
            }).catch(function (e) {
                if (e instanceof NativeAuthError && e.isFatal()) {
                    _this.nativeExtensionProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt
                    var popupClient = _this.createPopupClient(request.correlationId);
                    return popupClient.acquireToken(request);
                }
                else if (e instanceof InteractionRequiredAuthError) {
                    _this.logger.verbose("acquireTokenPopup - Resolving interaction required error thrown by native broker by falling back to web flow");
                    var popupClient = _this.createPopupClient(request.correlationId);
                    return popupClient.acquireToken(request);
                }
                _this.browserStorage.setInteractionInProgress(false);
                throw e;
            });
        }
        else {
            var popupClient = this.createPopupClient(request.correlationId);
            result = popupClient.acquireToken(request);
        }
        return result.then(function (result) {
            /*
             *  If logged in, emit acquire token events
             */
            var isLoggingIn = loggedInAccounts.length < _this.getAllAccounts().length;
            if (isLoggingIn) {
                _this.eventHandler.emitEvent(EventType.LOGIN_SUCCESS, InteractionType.Popup, result);
            }
            else {
                _this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_SUCCESS, InteractionType.Popup, result);
            }
            atPopupMeasurement.endMeasurement({
                success: true,
                accessTokenSize: result.accessToken.length,
                idTokenSize: result.idToken.length,
            });
            atPopupMeasurement.flushMeasurement();
            return result;
        }).catch(function (e) {
            if (loggedInAccounts.length > 0) {
                _this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_FAILURE, InteractionType.Popup, null, e);
            }
            else {
                _this.eventHandler.emitEvent(EventType.LOGIN_FAILURE, InteractionType.Popup, null, e);
            }
            atPopupMeasurement.endMeasurement({
                errorCode: e.errorCode,
                subErrorCode: e.subError,
                success: false
            });
            atPopupMeasurement.flushMeasurement();
            // Since this function is syncronous we need to reject
            return Promise.reject(e);
        });
    };
    // #endregion
    // #region Silent Flow
    /**
     * This function uses a hidden iframe to fetch an authorization code from the eSTS. There are cases where this may not work:
     * - Any browser using a form of Intelligent Tracking Prevention
     * - If there is not an established session with the service
     *
     * In these cases, the request must be done inside a popup or full frame redirect.
     *
     * For the cases where interaction is required, you cannot send a request with prompt=none.
     *
     * If your refresh token has expired, you can use this function to fetch a new set of tokens silently as long as
     * you session on the server still exists.
     * @param request {@link SsoSilentRequest}
     *
     * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.
     */
    ClientApplication.prototype.ssoSilent = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var correlationId, validRequest, ssoSilentMeasurement, result, silentIframeClient;
            var _this = this;
            return __generator(this, function (_a) {
                correlationId = this.getRequestCorrelationId(request);
                validRequest = __assign(__assign({}, request), { prompt: PromptValue.NONE, correlationId: correlationId });
                this.preflightBrowserEnvironmentCheck(InteractionType.Silent);
                ssoSilentMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.SsoSilent, correlationId);
                this.logger.verbose("ssoSilent called", correlationId);
                this.eventHandler.emitEvent(EventType.SSO_SILENT_START, InteractionType.Silent, validRequest);
                if (this.canUseNative(validRequest)) {
                    result = this.acquireTokenNative(validRequest, ApiId.ssoSilent).catch(function (e) {
                        // If native token acquisition fails for availability reasons fallback to standard flow
                        if (e instanceof NativeAuthError && e.isFatal()) {
                            _this.nativeExtensionProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt
                            var silentIframeClient = _this.createSilentIframeClient(validRequest.correlationId);
                            return silentIframeClient.acquireToken(validRequest);
                        }
                        throw e;
                    });
                }
                else {
                    silentIframeClient = this.createSilentIframeClient(validRequest.correlationId);
                    result = silentIframeClient.acquireToken(validRequest);
                }
                return [2 /*return*/, result.then(function (response) {
                        _this.eventHandler.emitEvent(EventType.SSO_SILENT_SUCCESS, InteractionType.Silent, response);
                        ssoSilentMeasurement.endMeasurement({
                            success: true,
                            isNativeBroker: response.fromNativeBroker,
                            accessTokenSize: response.accessToken.length,
                            idTokenSize: response.idToken.length
                        });
                        ssoSilentMeasurement.flushMeasurement();
                        return response;
                    }).catch(function (e) {
                        _this.eventHandler.emitEvent(EventType.SSO_SILENT_FAILURE, InteractionType.Silent, null, e);
                        ssoSilentMeasurement.endMeasurement({
                            errorCode: e.errorCode,
                            subErrorCode: e.subError,
                            success: false
                        });
                        ssoSilentMeasurement.flushMeasurement();
                        throw e;
                    })];
            });
        });
    };
    /**
     * This function redeems an authorization code (passed as code) from the eSTS token endpoint.
     * This authorization code should be acquired server-side using a confidential client to acquire a spa_code.
     * This API is not indended for normal authorization code acquisition and redemption.
     *
     * Redemption of this authorization code will not require PKCE, as it was acquired by a confidential client.
     *
     * @param request {@link AuthorizationCodeRequest}
     * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.
     */
    ClientApplication.prototype.acquireTokenByCode = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var correlationId, atbcMeasurement, hybridAuthCode_1, response;
            var _this = this;
            return __generator(this, function (_a) {
                correlationId = this.getRequestCorrelationId(request);
                this.preflightBrowserEnvironmentCheck(InteractionType.Silent);
                this.logger.trace("acquireTokenByCode called", correlationId);
                this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_BY_CODE_START, InteractionType.Silent, request);
                atbcMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.AcquireTokenByCode, request.correlationId);
                try {
                    if (request.code) {
                        hybridAuthCode_1 = request.code;
                        response = this.hybridAuthCodeResponses.get(hybridAuthCode_1);
                        if (!response) {
                            this.logger.verbose("Initiating new acquireTokenByCode request", correlationId);
                            response = this.acquireTokenByCodeAsync(__assign(__assign({}, request), { correlationId: correlationId }))
                                .then(function (result) {
                                _this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_BY_CODE_SUCCESS, InteractionType.Silent, result);
                                _this.hybridAuthCodeResponses.delete(hybridAuthCode_1);
                                atbcMeasurement.endMeasurement({
                                    success: true,
                                    accessTokenSize: result.accessToken.length,
                                    idTokenSize: result.idToken.length,
                                    isNativeBroker: result.fromNativeBroker
                                });
                                atbcMeasurement.flushMeasurement();
                                return result;
                            })
                                .catch(function (error) {
                                _this.hybridAuthCodeResponses.delete(hybridAuthCode_1);
                                _this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_BY_CODE_FAILURE, InteractionType.Silent, null, error);
                                atbcMeasurement.endMeasurement({
                                    errorCode: error.errorCode,
                                    subErrorCode: error.subError,
                                    success: false
                                });
                                atbcMeasurement.flushMeasurement();
                                throw error;
                            });
                            this.hybridAuthCodeResponses.set(hybridAuthCode_1, response);
                        }
                        else {
                            this.logger.verbose("Existing acquireTokenByCode request found", request.correlationId);
                            atbcMeasurement.endMeasurement({
                                success: true
                            });
                            atbcMeasurement.discardMeasurement();
                        }
                        return [2 /*return*/, response];
                    }
                    else if (request.nativeAccountId) {
                        if (this.canUseNative(request, request.nativeAccountId)) {
                            return [2 /*return*/, this.acquireTokenNative(request, ApiId.acquireTokenByCode, request.nativeAccountId).catch(function (e) {
                                    // If native token acquisition fails for availability reasons fallback to standard flow
                                    if (e instanceof NativeAuthError && e.isFatal()) {
                                        _this.nativeExtensionProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt
                                    }
                                    throw e;
                                })];
                        }
                        else {
                            throw BrowserAuthError.createUnableToAcquireTokenFromNativePlatformError();
                        }
                    }
                    else {
                        throw BrowserAuthError.createAuthCodeOrNativeAccountIdRequiredError();
                    }
                }
                catch (e) {
                    this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_BY_CODE_FAILURE, InteractionType.Silent, null, e);
                    atbcMeasurement.endMeasurement({
                        errorCode: e instanceof AuthError && e.errorCode || undefined,
                        subErrorCode: e instanceof AuthError && e.subError || undefined,
                        success: false
                    });
                    throw e;
                }
                return [2 /*return*/];
            });
        });
    };
    /**
     * Creates a SilentAuthCodeClient to redeem an authorization code.
     * @param request
     * @returns Result of the operation to redeem the authorization code
     */
    ClientApplication.prototype.acquireTokenByCodeAsync = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var silentAuthCodeClient, silentTokenResult;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.trace("acquireTokenByCodeAsync called", request.correlationId);
                        silentAuthCodeClient = this.createSilentAuthCodeClient(request.correlationId);
                        return [4 /*yield*/, silentAuthCodeClient.acquireToken(request)];
                    case 1:
                        silentTokenResult = _a.sent();
                        return [2 /*return*/, silentTokenResult];
                }
            });
        });
    };
    /**
     * Use this function to obtain a token before every call to the API / resource provider
     *
     * MSAL return's a cached token when available
     * Or it send's a request to the STS to obtain a new token using a refresh token.
     *
     * @param {@link SilentRequest}
     *
     * To renew idToken, please pass clientId as the only scope in the Authentication Parameters
     * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.
     */
    ClientApplication.prototype.acquireTokenByRefreshToken = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var atbrtMeasurement, silentRefreshClient;
            var _this = this;
            return __generator(this, function (_a) {
                // block the reload if it occurred inside a hidden iframe
                BrowserUtils.blockReloadInHiddenIframes();
                atbrtMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.AcquireTokenByRefreshToken, request.correlationId);
                this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_NETWORK_START, InteractionType.Silent, request);
                silentRefreshClient = this.createSilentRefreshClient(request.correlationId);
                return [2 /*return*/, silentRefreshClient.acquireToken(request)
                        .then(function (result) {
                        atbrtMeasurement.endMeasurement({
                            success: true,
                            fromCache: result.fromCache,
                            accessTokenSize: result.accessToken.length,
                            idTokenSize: result.idToken.length,
                        });
                        return result;
                    })
                        .catch(function (e) {
                        var isServerError = e instanceof ServerError;
                        var isInteractionRequiredError = e instanceof InteractionRequiredAuthError;
                        var isInvalidGrantError = (e.errorCode === BrowserConstants.INVALID_GRANT_ERROR);
                        if (isServerError && isInvalidGrantError && !isInteractionRequiredError) {
                            _this.logger.verbose("Refresh token expired or invalid, attempting acquire token by iframe", request.correlationId);
                            var silentIframeClient = _this.createSilentIframeClient(request.correlationId);
                            return silentIframeClient.acquireToken(request)
                                .then(function (result) {
                                atbrtMeasurement.endMeasurement({
                                    success: true,
                                    fromCache: result.fromCache,
                                    accessTokenSize: result.accessToken.length,
                                    idTokenSize: result.idToken.length,
                                });
                                return result;
                            })
                                .catch(function (error) {
                                atbrtMeasurement.endMeasurement({
                                    errorCode: error.errorCode,
                                    subErrorCode: error.subError,
                                    success: false
                                });
                                throw error;
                            });
                        }
                        atbrtMeasurement.endMeasurement({
                            success: false
                        });
                        throw e;
                    })];
            });
        });
    };
    // #endregion
    // #region Logout
    /**
     * Deprecated logout function. Use logoutRedirect or logoutPopup instead
     * @param logoutRequest
     * @deprecated
     */
    ClientApplication.prototype.logout = function (logoutRequest) {
        return __awaiter(this, void 0, void 0, function () {
            var correlationId;
            return __generator(this, function (_a) {
                correlationId = this.getRequestCorrelationId(logoutRequest);
                this.logger.warning("logout API is deprecated and will be removed in msal-browser v3.0.0. Use logoutRedirect instead.", correlationId);
                return [2 /*return*/, this.logoutRedirect(__assign({ correlationId: correlationId }, logoutRequest))];
            });
        });
    };
    /**
     * Use to log out the current user, and redirect the user to the postLogoutRedirectUri.
     * Default behaviour is to redirect the user to `window.location.href`.
     * @param logoutRequest
     */
    ClientApplication.prototype.logoutRedirect = function (logoutRequest) {
        return __awaiter(this, void 0, void 0, function () {
            var correlationId, redirectClient;
            return __generator(this, function (_a) {
                correlationId = this.getRequestCorrelationId(logoutRequest);
                this.preflightBrowserEnvironmentCheck(InteractionType.Redirect);
                redirectClient = this.createRedirectClient(correlationId);
                return [2 /*return*/, redirectClient.logout(logoutRequest)];
            });
        });
    };
    /**
     * Clears local cache for the current user then opens a popup window prompting the user to sign-out of the server
     * @param logoutRequest
     */
    ClientApplication.prototype.logoutPopup = function (logoutRequest) {
        try {
            var correlationId = this.getRequestCorrelationId(logoutRequest);
            this.preflightBrowserEnvironmentCheck(InteractionType.Popup);
            var popupClient = this.createPopupClient(correlationId);
            return popupClient.logout(logoutRequest);
        }
        catch (e) {
            // Since this function is syncronous we need to reject
            return Promise.reject(e);
        }
    };
    // #endregion
    // #region Account APIs
    /**
     * Returns all accounts that MSAL currently has data for.
     * (the account object is created at the time of successful login)
     * or empty array when no accounts are found
     * @returns Array of account objects in cache
     */
    ClientApplication.prototype.getAllAccounts = function () {
        this.logger.verbose("getAllAccounts called");
        return this.isBrowserEnvironment ? this.browserStorage.getAllAccounts() : [];
    };
    /**
     * Returns the signed in account matching username.
     * (the account object is created at the time of successful login)
     * or null when no matching account is found.
     * This API is provided for convenience but getAccountById should be used for best reliability
     * @param userName
     * @returns The account object stored in MSAL
     */
    ClientApplication.prototype.getAccountByUsername = function (userName) {
        var allAccounts = this.getAllAccounts();
        if (!StringUtils.isEmpty(userName) && allAccounts && allAccounts.length) {
            this.logger.verbose("Account matching username found, returning");
            this.logger.verbosePii("Returning signed-in accounts matching username: " + userName);
            return allAccounts.filter(function (accountObj) { return accountObj.username.toLowerCase() === userName.toLowerCase(); })[0] || null;
        }
        else {
            this.logger.verbose("getAccountByUsername: No matching account found, returning null");
            return null;
        }
    };
    /**
     * Returns the signed in account matching homeAccountId.
     * (the account object is created at the time of successful login)
     * or null when no matching account is found
     * @param homeAccountId
     * @returns The account object stored in MSAL
     */
    ClientApplication.prototype.getAccountByHomeId = function (homeAccountId) {
        var allAccounts = this.getAllAccounts();
        if (!StringUtils.isEmpty(homeAccountId) && allAccounts && allAccounts.length) {
            this.logger.verbose("Account matching homeAccountId found, returning");
            this.logger.verbosePii("Returning signed-in accounts matching homeAccountId: " + homeAccountId);
            return allAccounts.filter(function (accountObj) { return accountObj.homeAccountId === homeAccountId; })[0] || null;
        }
        else {
            this.logger.verbose("getAccountByHomeId: No matching account found, returning null");
            return null;
        }
    };
    /**
     * Returns the signed in account matching localAccountId.
     * (the account object is created at the time of successful login)
     * or null when no matching account is found
     * @param localAccountId
     * @returns The account object stored in MSAL
     */
    ClientApplication.prototype.getAccountByLocalId = function (localAccountId) {
        var allAccounts = this.getAllAccounts();
        if (!StringUtils.isEmpty(localAccountId) && allAccounts && allAccounts.length) {
            this.logger.verbose("Account matching localAccountId found, returning");
            this.logger.verbosePii("Returning signed-in accounts matching localAccountId: " + localAccountId);
            return allAccounts.filter(function (accountObj) { return accountObj.localAccountId === localAccountId; })[0] || null;
        }
        else {
            this.logger.verbose("getAccountByLocalId: No matching account found, returning null");
            return null;
        }
    };
    /**
     * Sets the account to use as the active account. If no account is passed to the acquireToken APIs, then MSAL will use this active account.
     * @param account
     */
    ClientApplication.prototype.setActiveAccount = function (account) {
        this.browserStorage.setActiveAccount(account);
    };
    /**
     * Gets the currently active account
     */
    ClientApplication.prototype.getActiveAccount = function () {
        return this.browserStorage.getActiveAccount();
    };
    // #endregion
    // #region Helpers
    /**
     * Helper to validate app environment before making an auth request
     *
     * @protected
     * @param {InteractionType} interactionType What kind of interaction is being used
     * @param {boolean} [setInteractionInProgress=true] Whether to set interaction in progress temp cache flag
     */
    ClientApplication.prototype.preflightBrowserEnvironmentCheck = function (interactionType, setInteractionInProgress) {
        if (setInteractionInProgress === void 0) { setInteractionInProgress = true; }
        this.logger.verbose("preflightBrowserEnvironmentCheck started");
        // Block request if not in browser environment
        BrowserUtils.blockNonBrowserEnvironment(this.isBrowserEnvironment);
        // Block redirects if in an iframe
        BrowserUtils.blockRedirectInIframe(interactionType, this.config.system.allowRedirectInIframe);
        // Block auth requests inside a hidden iframe
        BrowserUtils.blockReloadInHiddenIframes();
        // Block redirectUri opened in a popup from calling MSAL APIs
        BrowserUtils.blockAcquireTokenInPopups();
        // Block token acquisition before initialize has been called if native brokering is enabled
        BrowserUtils.blockNativeBrokerCalledBeforeInitialized(this.config.system.allowNativeBroker, this.initialized);
        // Block redirects if memory storage is enabled but storeAuthStateInCookie is not
        if (interactionType === InteractionType.Redirect &&
            this.config.cache.cacheLocation === BrowserCacheLocation.MemoryStorage &&
            !this.config.cache.storeAuthStateInCookie) {
            throw BrowserConfigurationAuthError.createInMemoryRedirectUnavailableError();
        }
        if (interactionType === InteractionType.Redirect || interactionType === InteractionType.Popup) {
            this.preflightInteractiveRequest(setInteractionInProgress);
        }
    };
    /**
     * Preflight check for interactive requests
     *
     * @protected
     * @param {boolean} setInteractionInProgress Whether to set interaction in progress temp cache flag
     */
    ClientApplication.prototype.preflightInteractiveRequest = function (setInteractionInProgress) {
        this.logger.verbose("preflightInteractiveRequest called, validating app environment");
        // block the reload if it occurred inside a hidden iframe
        BrowserUtils.blockReloadInHiddenIframes();
        // Set interaction in progress temporary cache or throw if alread set.
        if (setInteractionInProgress) {
            this.browserStorage.setInteractionInProgress(true);
        }
    };
    /**
     * Acquire a token from native device (e.g. WAM)
     * @param request
     */
    ClientApplication.prototype.acquireTokenNative = function (request, apiId, accountId) {
        return __awaiter(this, void 0, void 0, function () {
            var nativeClient;
            return __generator(this, function (_a) {
                this.logger.trace("acquireTokenNative called");
                if (!this.nativeExtensionProvider) {
                    throw BrowserAuthError.createNativeConnectionNotEstablishedError();
                }
                nativeClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, apiId, this.performanceClient, this.nativeExtensionProvider, accountId || this.getNativeAccountId(request), this.nativeInternalStorage, request.correlationId);
                return [2 /*return*/, nativeClient.acquireToken(request)];
            });
        });
    };
    /**
     * Returns boolean indicating if this request can use the native broker
     * @param request
     */
    ClientApplication.prototype.canUseNative = function (request, accountId) {
        this.logger.trace("canUseNative called");
        if (!NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeExtensionProvider, request.authenticationScheme)) {
            this.logger.trace("canUseNative: isNativeAvailable returned false, returning false");
            return false;
        }
        if (request.prompt) {
            switch (request.prompt) {
                case PromptValue.NONE:
                case PromptValue.CONSENT:
                case PromptValue.LOGIN:
                    this.logger.trace("canUseNative: prompt is compatible with native flow");
                    break;
                default:
                    this.logger.trace("canUseNative: prompt = " + request.prompt + " is not compatible with native flow, returning false");
                    return false;
            }
        }
        if (!accountId && !this.getNativeAccountId(request)) {
            this.logger.trace("canUseNative: nativeAccountId is not available, returning false");
            return false;
        }
        return true;
    };
    /**
     * Get the native accountId from the account
     * @param request
     * @returns
     */
    ClientApplication.prototype.getNativeAccountId = function (request) {
        var account = request.account || this.browserStorage.getAccountInfoByHints(request.loginHint, request.sid) || this.getActiveAccount();
        return account && account.nativeAccountId || "";
    };
    /**
     * Returns new instance of the Popup Interaction Client
     * @param correlationId
     */
    ClientApplication.prototype.createPopupClient = function (correlationId) {
        return new PopupClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, this.performanceClient, this.nativeInternalStorage, this.nativeExtensionProvider, correlationId);
    };
    /**
     * Returns new instance of the Redirect Interaction Client
     * @param correlationId
     */
    ClientApplication.prototype.createRedirectClient = function (correlationId) {
        return new RedirectClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, this.performanceClient, this.nativeInternalStorage, this.nativeExtensionProvider, correlationId);
    };
    /**
     * Returns new instance of the Silent Iframe Interaction Client
     * @param correlationId
     */
    ClientApplication.prototype.createSilentIframeClient = function (correlationId) {
        return new SilentIframeClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, ApiId.ssoSilent, this.performanceClient, this.nativeInternalStorage, this.nativeExtensionProvider, correlationId);
    };
    /**
     * Returns new instance of the Silent Cache Interaction Client
     */
    ClientApplication.prototype.createSilentCacheClient = function (correlationId) {
        return new SilentCacheClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, this.performanceClient, this.nativeExtensionProvider, correlationId);
    };
    /**
     * Returns new instance of the Silent Refresh Interaction Client
     */
    ClientApplication.prototype.createSilentRefreshClient = function (correlationId) {
        return new SilentRefreshClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, this.performanceClient, this.nativeExtensionProvider, correlationId);
    };
    /**
     * Returns new instance of the Silent AuthCode Interaction Client
     */
    ClientApplication.prototype.createSilentAuthCodeClient = function (correlationId) {
        return new SilentAuthCodeClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, ApiId.acquireTokenByCode, this.performanceClient, this.nativeExtensionProvider, correlationId);
    };
    /**
     * Adds event callbacks to array
     * @param callback
     */
    ClientApplication.prototype.addEventCallback = function (callback) {
        return this.eventHandler.addEventCallback(callback);
    };
    /**
     * Removes callback with provided id from callback array
     * @param callbackId
     */
    ClientApplication.prototype.removeEventCallback = function (callbackId) {
        this.eventHandler.removeEventCallback(callbackId);
    };
    /**
     * Registers a callback to receive performance events.
     *
     * @param {PerformanceCallbackFunction} callback
     * @returns {string}
     */
    ClientApplication.prototype.addPerformanceCallback = function (callback) {
        return this.performanceClient.addPerformanceCallback(callback);
    };
    /**
     * Removes a callback registered with addPerformanceCallback.
     *
     * @param {string} callbackId
     * @returns {boolean}
     */
    ClientApplication.prototype.removePerformanceCallback = function (callbackId) {
        return this.performanceClient.removePerformanceCallback(callbackId);
    };
    /**
     * Adds event listener that emits an event when a user account is added or removed from localstorage in a different browser tab or window
     */
    ClientApplication.prototype.enableAccountStorageEvents = function () {
        this.eventHandler.enableAccountStorageEvents();
    };
    /**
     * Removes event listener that emits an event when a user account is added or removed from localstorage in a different browser tab or window
     */
    ClientApplication.prototype.disableAccountStorageEvents = function () {
        this.eventHandler.disableAccountStorageEvents();
    };
    /**
     * Gets the token cache for the application.
     */
    ClientApplication.prototype.getTokenCache = function () {
        return this.tokenCache;
    };
    /**
     * Returns the logger instance
     */
    ClientApplication.prototype.getLogger = function () {
        return this.logger;
    };
    /**
     * Replaces the default logger set in configurations with new Logger with new configurations
     * @param logger Logger instance
     */
    ClientApplication.prototype.setLogger = function (logger) {
        this.logger = logger;
    };
    /**
     * Called by wrapper libraries (Angular & React) to set SKU and Version passed down to telemetry, logger, etc.
     * @param sku
     * @param version
     */
    ClientApplication.prototype.initializeWrapperLibrary = function (sku, version) {
        // Validate the SKU passed in is one we expect
        this.browserStorage.setWrapperMetadata(sku, version);
    };
    /**
     * Sets navigation client
     * @param navigationClient
     */
    ClientApplication.prototype.setNavigationClient = function (navigationClient) {
        this.navigationClient = navigationClient;
    };
    /**
     * Returns the configuration object
     */
    ClientApplication.prototype.getConfiguration = function () {
        return this.config;
    };
    /**
     * Generates a correlation id for a request if none is provided.
     *
     * @protected
     * @param {?Partial<BaseAuthRequest>} [request]
     * @returns {string}
     */
    ClientApplication.prototype.getRequestCorrelationId = function (request) {
        if (request === null || request === void 0 ? void 0 : request.correlationId) {
            return request.correlationId;
        }
        if (this.isBrowserEnvironment) {
            return this.browserCrypto.createNewGuid();
        }
        /*
         * Included for fallback for non-browser environments,
         * and to ensure this method always returns a string.
         */
        return Constants.EMPTY_STRING;
    };
    return ClientApplication;
}());

export { ClientApplication };
//# sourceMappingURL=ClientApplication.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { BrowserConfigurationAuthError } from '../error/BrowserConfigurationAuthError.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var stubbedPublicClientApplication = {
    initialize: function () {
        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
    },
    acquireTokenPopup: function () {
        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
    },
    acquireTokenRedirect: function () {
        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
    },
    acquireTokenSilent: function () {
        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
    },
    acquireTokenByCode: function () {
        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
    },
    getAllAccounts: function () {
        return [];
    },
    getAccountByHomeId: function () {
        return null;
    },
    getAccountByUsername: function () {
        return null;
    },
    getAccountByLocalId: function () {
        return null;
    },
    handleRedirectPromise: function () {
        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
    },
    loginPopup: function () {
        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
    },
    loginRedirect: function () {
        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
    },
    logout: function () {
        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
    },
    logoutRedirect: function () {
        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
    },
    logoutPopup: function () {
        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
    },
    ssoSilent: function () {
        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());
    },
    addEventCallback: function () {
        return null;
    },
    removeEventCallback: function () {
        return;
    },
    addPerformanceCallback: function () {
        return "";
    },
    removePerformanceCallback: function () {
        return false;
    },
    enableAccountStorageEvents: function () {
        return;
    },
    disableAccountStorageEvents: function () {
        return;
    },
    getTokenCache: function () {
        throw BrowserConfigurationAuthError.createStubPcaInstanceCalledError();
    },
    getLogger: function () {
        throw BrowserConfigurationAuthError.createStubPcaInstanceCalledError();
    },
    setLogger: function () {
        return;
    },
    setActiveAccount: function () {
        return;
    },
    getActiveAccount: function () {
        return null;
    },
    initializeWrapperLibrary: function () {
        return;
    },
    setNavigationClient: function () {
        return;
    },
    getConfiguration: function () {
        throw BrowserConfigurationAuthError.createStubPcaInstanceCalledError();
    }
};

export { stubbedPublicClientApplication };
//# sourceMappingURL=IPublicClientApplication.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
import { __extends, __awaiter, __generator, __assign } from '../_virtual/_tslib.js';
import { PerformanceEvents, Constants } from '@azure/msal-common';
import { DEFAULT_REQUEST, InteractionType, ApiId } from '../utils/BrowserConstants.js';
import { ClientApplication } from './ClientApplication.js';
import { EventType } from '../event/EventType.js';
import { BrowserAuthError } from '../error/BrowserAuthError.js';
import { NativeAuthError } from '../error/NativeAuthError.js';
import { NativeMessageHandler } from '../broker/nativeBroker/NativeMessageHandler.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * The PublicClientApplication class is the object exposed by the library to perform authentication and authorization functions in Single Page Applications
 * to obtain JWT tokens as described in the OAuth 2.0 Authorization Code Flow with PKCE specification.
 */
var PublicClientApplication = /** @class */ (function (_super) {
    __extends(PublicClientApplication, _super);
    /**
     * @constructor
     * Constructor for the PublicClientApplication used to instantiate the PublicClientApplication object
     *
     * Important attributes in the Configuration object for auth are:
     * - clientID: the application ID of your application. You can obtain one by registering your application with our Application registration portal : https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredAppsPreview
     * - authority: the authority URL for your application.
     * - redirect_uri: the uri of your application registered in the portal.
     *
     * In Azure AD, authority is a URL indicating the Azure active directory that MSAL uses to obtain tokens.
     * It is of the form https://login.microsoftonline.com/{Enter_the_Tenant_Info_Here}
     * If your application supports Accounts in one organizational directory, replace "Enter_the_Tenant_Info_Here" value with the Tenant Id or Tenant name (for example, contoso.microsoft.com).
     * If your application supports Accounts in any organizational directory, replace "Enter_the_Tenant_Info_Here" value with organizations.
     * If your application supports Accounts in any organizational directory and personal Microsoft accounts, replace "Enter_the_Tenant_Info_Here" value with common.
     * To restrict support to Personal Microsoft accounts only, replace "Enter_the_Tenant_Info_Here" value with consumers.
     *
     * In Azure B2C, authority is of the form https://{instance}/tfp/{tenant}/{policyName}/
     * Full B2C functionality will be available in this library in future versions.
     *
     * @param configuration object for the MSAL PublicClientApplication instance
     */
    function PublicClientApplication(configuration) {
        var _this = _super.call(this, configuration) || this;
        _this.activeSilentTokenRequests = new Map();
        return _this;
    }
    /**
     * Use when initiating the login process by redirecting the user's browser to the authorization endpoint. This function redirects the page, so
     * any code that follows this function will not execute.
     *
     * IMPORTANT: It is NOT recommended to have code that is dependent on the resolution of the Promise. This function will navigate away from the current
     * browser window. It currently returns a Promise in order to reflect the asynchronous nature of the code running in this function.
     *
     * @param request
     */
    PublicClientApplication.prototype.loginRedirect = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var correlationId;
            return __generator(this, function (_a) {
                correlationId = this.getRequestCorrelationId(request);
                this.logger.verbose("loginRedirect called", correlationId);
                return [2 /*return*/, this.acquireTokenRedirect(__assign({ correlationId: correlationId }, (request || DEFAULT_REQUEST)))];
            });
        });
    };
    /**
     * Use when initiating the login process via opening a popup window in the user's browser
     *
     * @param request
     *
     * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.
     */
    PublicClientApplication.prototype.loginPopup = function (request) {
        var correlationId = this.getRequestCorrelationId(request);
        this.logger.verbose("loginPopup called", correlationId);
        return this.acquireTokenPopup(__assign({ correlationId: correlationId }, (request || DEFAULT_REQUEST)));
    };
    /**
     * Silently acquire an access token for a given set of scopes. Returns currently processing promise if parallel requests are made.
     *
     * @param {@link (SilentRequest:type)}
     * @returns {Promise.<AuthenticationResult>} - a promise that is fulfilled when this function has completed, or rejected if an error was raised. Returns the {@link AuthResponse} object
     */
    PublicClientApplication.prototype.acquireTokenSilent = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var correlationId, atsMeasurement, account, thumbprint, silentRequestKey, cachedResponse, response;
            var _this = this;
            return __generator(this, function (_a) {
                correlationId = this.getRequestCorrelationId(request);
                atsMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.AcquireTokenSilent, correlationId);
                this.preflightBrowserEnvironmentCheck(InteractionType.Silent);
                this.logger.verbose("acquireTokenSilent called", correlationId);
                account = request.account || this.getActiveAccount();
                if (!account) {
                    throw BrowserAuthError.createNoAccountError();
                }
                thumbprint = {
                    clientId: this.config.auth.clientId,
                    authority: request.authority || Constants.EMPTY_STRING,
                    scopes: request.scopes,
                    homeAccountIdentifier: account.homeAccountId,
                    claims: request.claims,
                    authenticationScheme: request.authenticationScheme,
                    resourceRequestMethod: request.resourceRequestMethod,
                    resourceRequestUri: request.resourceRequestUri,
                    shrClaims: request.shrClaims,
                    sshKid: request.sshKid
                };
                silentRequestKey = JSON.stringify(thumbprint);
                cachedResponse = this.activeSilentTokenRequests.get(silentRequestKey);
                if (typeof cachedResponse === "undefined") {
                    this.logger.verbose("acquireTokenSilent called for the first time, storing active request", correlationId);
                    response = this.acquireTokenSilentAsync(__assign(__assign({}, request), { correlationId: correlationId }), account)
                        .then(function (result) {
                        _this.activeSilentTokenRequests.delete(silentRequestKey);
                        atsMeasurement.endMeasurement({
                            success: true,
                            fromCache: result.fromCache,
                            accessTokenSize: result.accessToken.length,
                            idTokenSize: result.idToken.length,
                            isNativeBroker: result.fromNativeBroker
                        });
                        atsMeasurement.flushMeasurement();
                        return result;
                    })
                        .catch(function (error) {
                        _this.activeSilentTokenRequests.delete(silentRequestKey);
                        atsMeasurement.endMeasurement({
                            success: false
                        });
                        atsMeasurement.flushMeasurement();
                        throw error;
                    });
                    this.activeSilentTokenRequests.set(silentRequestKey, response);
                    return [2 /*return*/, response];
                }
                else {
                    this.logger.verbose("acquireTokenSilent has been called previously, returning the result from the first call", correlationId);
                    atsMeasurement.endMeasurement({
                        success: true
                    });
                    // Discard measurements for memoized calls, as they are usually only a couple of ms and will artificially deflate metrics
                    atsMeasurement.discardMeasurement();
                    return [2 /*return*/, cachedResponse];
                }
            });
        });
    };
    /**
     * Silently acquire an access token for a given set of scopes. Will use cached token if available, otherwise will attempt to acquire a new token from the network via refresh token.
     * @param {@link (SilentRequest:type)}
     * @param {@link (AccountInfo:type)}
     * @returns {Promise.<AuthenticationResult>} - a promise that is fulfilled when this function has completed, or rejected if an error was raised. Returns the {@link AuthResponse}
     */
    PublicClientApplication.prototype.acquireTokenSilentAsync = function (request, account) {
        return __awaiter(this, void 0, void 0, function () {
            var astsAsyncMeasurement, result, silentRequest, silentCacheClient, silentRequest_1;
            var _this = this;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_START, InteractionType.Silent, request);
                        astsAsyncMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.AcquireTokenSilentAsync, request.correlationId);
                        if (!(NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeExtensionProvider, request.authenticationScheme) && account.nativeAccountId)) return [3 /*break*/, 1];
                        this.logger.verbose("acquireTokenSilent - attempting to acquire token from native platform");
                        silentRequest = __assign(__assign({}, request), { account: account });
                        result = this.acquireTokenNative(silentRequest, ApiId.acquireTokenSilent_silentFlow).catch(function (e) { return __awaiter(_this, void 0, void 0, function () {
                            var silentIframeClient;
                            return __generator(this, function (_a) {
                                // If native token acquisition fails for availability reasons fallback to web flow
                                if (e instanceof NativeAuthError && e.isFatal()) {
                                    this.logger.verbose("acquireTokenSilent - native platform unavailable, falling back to web flow");
                                    this.nativeExtensionProvider = undefined; // Prevent future requests from continuing to attempt 
                                    silentIframeClient = this.createSilentIframeClient(request.correlationId);
                                    return [2 /*return*/, silentIframeClient.acquireToken(request)];
                                }
                                throw e;
                            });
                        }); });
                        return [3 /*break*/, 3];
                    case 1:
                        this.logger.verbose("acquireTokenSilent - attempting to acquire token from web flow");
                        silentCacheClient = this.createSilentCacheClient(request.correlationId);
                        return [4 /*yield*/, silentCacheClient.initializeSilentRequest(request, account)];
                    case 2:
                        silentRequest_1 = _a.sent();
                        result = silentCacheClient.acquireToken(silentRequest_1).catch(function () { return __awaiter(_this, void 0, void 0, function () {
                            return __generator(this, function (_a) {
                                return [2 /*return*/, this.acquireTokenByRefreshToken(silentRequest_1)];
                            });
                        }); });
                        _a.label = 3;
                    case 3: return [2 /*return*/, result.then(function (response) {
                            _this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_SUCCESS, InteractionType.Silent, response);
                            astsAsyncMeasurement.endMeasurement({
                                success: true,
                                fromCache: response.fromCache,
                                accessTokenSize: response.accessToken.length,
                                idTokenSize: response.idToken.length,
                                isNativeBroker: response.fromNativeBroker
                            });
                            return response;
                        }).catch(function (tokenRenewalError) {
                            _this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_FAILURE, InteractionType.Silent, null, tokenRenewalError);
                            astsAsyncMeasurement.endMeasurement({
                                errorCode: tokenRenewalError.errorCode,
                                subErrorCode: tokenRenewalError.subError,
                                success: false
                            });
                            throw tokenRenewalError;
                        })];
                }
            });
        });
    };
    return PublicClientApplication;
}(ClientApplication));

export { PublicClientApplication };
//# sourceMappingURL=PublicClientApplication.js.map
/*! @azure/msal-browser v2.28.1 2022-08-01 */
'use strict';
/*! *****************************************************************************
Copyright (c) Microsoft Corporation.

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.

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.
***************************************************************************** */
/* global Reflect, Promise */

var extendStatics = function(d, b) {
    extendStatics = Object.setPrototypeOf ||
        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
    return extendStatics(d, b);
};

function __extends(d, b) {
    extendStatics(d, b);
    function __() { this.constructor = d; }
    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}

var __assign = function() {
    __assign = Object.assign || function __assign(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
            s = arguments[i];
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
        }
        return t;
    };
    return __assign.apply(this, arguments);
};

function __rest(s, e) {
    var t = {};
    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
        t[p] = s[p];
    if (s != null && typeof Object.getOwnPropertySymbols === "function")
        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
                t[p[i]] = s[p[i]];
        }
    return t;
}

function __awaiter(thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
}

function __generator(thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
}

function __read(o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
}

function __spread() {
    for (var ar = [], i = 0; i < arguments.length; i++)
        ar = ar.concat(__read(arguments[i]));
    return ar;
}

export { __assign, __awaiter, __extends, __generator, __read, __rest, __spread };
//# sourceMappingURL=_tslib.js.map
MIT License

Copyright (c) Microsoft Corporation. All rights reserved.

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": "@azure/msal-common",
  "author": {
    "name": "Microsoft",
    "email": "nugetaad@microsoft.com",
    "url": "https://www.microsoft.com"
  },
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/AzureAD/microsoft-authentication-library-for-js.git"
  },
  "version": "7.3.0",
  "description": "Microsoft Authentication Library for js",
  "sideEffects": false,
  "main": "./dist/index.cjs.js",
  "module": "./dist/index.js",
  "types": "./dist/index.d.ts",
  "engines": {
    "node": ">=0.8.0"
  },
  "directories": {
    "test": "test"
  },
  "files": [
    "dist"
  ],
  "devDependencies": {
    "@babel/core": "^7.7.2",
    "@babel/plugin-proposal-class-properties": "^7.7.0",
    "@babel/plugin-proposal-object-rest-spread": "^7.6.2",
    "@babel/preset-env": "^7.7.1",
    "@babel/preset-typescript": "^7.7.2",
    "@types/debug": "^4.1.5",
    "@types/jest": "^27.0.0",
    "@types/lodash": "^4.14.182",
    "@types/sinon": "^7.5.0",
    "husky": "^3.0.9",
    "jest": "^27.0.4",
    "lodash": "^4.17.21",
    "rimraf": "^3.0.2",
    "rollup": "^2.46.0",
    "rollup-plugin-typescript2": "^0.29.0",
    "shx": "^0.3.2",
    "sinon": "^7.5.0",
    "ts-jest": "^27.1.5",
    "tslib": "^1.10.0",
    "tslint": "^5.20.0",
    "typescript": "^3.7.5",
    "yargs": "^17.5.1"
  }
}/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
'use strict';

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

/*! *****************************************************************************
Copyright (c) Microsoft Corporation.

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.

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.
***************************************************************************** */
/* global Reflect, Promise */

var extendStatics = function(d, b) {
    extendStatics = Object.setPrototypeOf ||
        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
    return extendStatics(d, b);
};

function __extends(d, b) {
    extendStatics(d, b);
    function __() { this.constructor = d; }
    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}

var __assign = function() {
    __assign = Object.assign || function __assign(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
            s = arguments[i];
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
        }
        return t;
    };
    return __assign.apply(this, arguments);
};

function __awaiter(thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
}

function __generator(thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
}

function __spreadArrays() {
    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
    for (var r = Array(s), k = 0, i = 0; i < il; i++)
        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
            r[k] = a[j];
    return r;
}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var Constants = {
    LIBRARY_NAME: "MSAL.JS",
    SKU: "msal.js.common",
    // Prefix for all library cache entries
    CACHE_PREFIX: "msal",
    // default authority
    DEFAULT_AUTHORITY: "https://login.microsoftonline.com/common/",
    DEFAULT_AUTHORITY_HOST: "login.microsoftonline.com",
    DEFAULT_COMMON_TENANT: "common",
    // ADFS String
    ADFS: "adfs",
    // Default AAD Instance Discovery Endpoint
    AAD_INSTANCE_DISCOVERY_ENDPT: "https://login.microsoftonline.com/common/discovery/instance?api-version=1.1&authorization_endpoint=",
    // Resource delimiter - used for certain cache entries
    RESOURCE_DELIM: "|",
    // Placeholder for non-existent account ids/objects
    NO_ACCOUNT: "NO_ACCOUNT",
    // Claims
    CLAIMS: "claims",
    // Consumer UTID
    CONSUMER_UTID: "9188040d-6c67-4c5b-b112-36a304b66dad",
    // Default scopes
    OPENID_SCOPE: "openid",
    PROFILE_SCOPE: "profile",
    OFFLINE_ACCESS_SCOPE: "offline_access",
    EMAIL_SCOPE: "email",
    // Default response type for authorization code flow
    CODE_RESPONSE_TYPE: "code",
    CODE_GRANT_TYPE: "authorization_code",
    RT_GRANT_TYPE: "refresh_token",
    FRAGMENT_RESPONSE_MODE: "fragment",
    S256_CODE_CHALLENGE_METHOD: "S256",
    URL_FORM_CONTENT_TYPE: "application/x-www-form-urlencoded;charset=utf-8",
    AUTHORIZATION_PENDING: "authorization_pending",
    NOT_DEFINED: "not_defined",
    EMPTY_STRING: "",
    FORWARD_SLASH: "/",
    IMDS_ENDPOINT: "http://169.254.169.254/metadata/instance/compute/location",
    IMDS_VERSION: "2020-06-01",
    IMDS_TIMEOUT: 2000,
    AZURE_REGION_AUTO_DISCOVER_FLAG: "TryAutoDetect",
    REGIONAL_AUTH_PUBLIC_CLOUD_SUFFIX: "login.microsoft.com",
    KNOWN_PUBLIC_CLOUDS: ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"],
    TOKEN_RESPONSE_TYPE: "token",
    ID_TOKEN_RESPONSE_TYPE: "id_token",
    SHR_NONCE_VALIDITY: 240,
};
var OIDC_DEFAULT_SCOPES = [
    Constants.OPENID_SCOPE,
    Constants.PROFILE_SCOPE,
    Constants.OFFLINE_ACCESS_SCOPE
];
var OIDC_SCOPES = __spreadArrays(OIDC_DEFAULT_SCOPES, [
    Constants.EMAIL_SCOPE
]);
/**
 * Request header names
 */
var HeaderNames;
(function (HeaderNames) {
    HeaderNames["CONTENT_TYPE"] = "Content-Type";
    HeaderNames["RETRY_AFTER"] = "Retry-After";
    HeaderNames["CCS_HEADER"] = "X-AnchorMailbox";
    HeaderNames["WWWAuthenticate"] = "WWW-Authenticate";
    HeaderNames["AuthenticationInfo"] = "Authentication-Info";
})(HeaderNames || (HeaderNames = {}));
/**
 * Persistent cache keys MSAL which stay while user is logged in.
 */
exports.PersistentCacheKeys = void 0;
(function (PersistentCacheKeys) {
    PersistentCacheKeys["ID_TOKEN"] = "idtoken";
    PersistentCacheKeys["CLIENT_INFO"] = "client.info";
    PersistentCacheKeys["ADAL_ID_TOKEN"] = "adal.idtoken";
    PersistentCacheKeys["ERROR"] = "error";
    PersistentCacheKeys["ERROR_DESC"] = "error.description";
    PersistentCacheKeys["ACTIVE_ACCOUNT"] = "active-account";
    PersistentCacheKeys["ACTIVE_ACCOUNT_FILTERS"] = "active-account-filters"; // new cache entry for active_account for a more robust version for browser
})(exports.PersistentCacheKeys || (exports.PersistentCacheKeys = {}));
/**
 * String constants related to AAD Authority
 */
var AADAuthorityConstants;
(function (AADAuthorityConstants) {
    AADAuthorityConstants["COMMON"] = "common";
    AADAuthorityConstants["ORGANIZATIONS"] = "organizations";
    AADAuthorityConstants["CONSUMERS"] = "consumers";
})(AADAuthorityConstants || (AADAuthorityConstants = {}));
/**
 * Keys in the hashParams sent by AAD Server
 */
var AADServerParamKeys;
(function (AADServerParamKeys) {
    AADServerParamKeys["CLIENT_ID"] = "client_id";
    AADServerParamKeys["REDIRECT_URI"] = "redirect_uri";
    AADServerParamKeys["RESPONSE_TYPE"] = "response_type";
    AADServerParamKeys["RESPONSE_MODE"] = "response_mode";
    AADServerParamKeys["GRANT_TYPE"] = "grant_type";
    AADServerParamKeys["CLAIMS"] = "claims";
    AADServerParamKeys["SCOPE"] = "scope";
    AADServerParamKeys["ERROR"] = "error";
    AADServerParamKeys["ERROR_DESCRIPTION"] = "error_description";
    AADServerParamKeys["ACCESS_TOKEN"] = "access_token";
    AADServerParamKeys["ID_TOKEN"] = "id_token";
    AADServerParamKeys["REFRESH_TOKEN"] = "refresh_token";
    AADServerParamKeys["EXPIRES_IN"] = "expires_in";
    AADServerParamKeys["STATE"] = "state";
    AADServerParamKeys["NONCE"] = "nonce";
    AADServerParamKeys["PROMPT"] = "prompt";
    AADServerParamKeys["SESSION_STATE"] = "session_state";
    AADServerParamKeys["CLIENT_INFO"] = "client_info";
    AADServerParamKeys["CODE"] = "code";
    AADServerParamKeys["CODE_CHALLENGE"] = "code_challenge";
    AADServerParamKeys["CODE_CHALLENGE_METHOD"] = "code_challenge_method";
    AADServerParamKeys["CODE_VERIFIER"] = "code_verifier";
    AADServerParamKeys["CLIENT_REQUEST_ID"] = "client-request-id";
    AADServerParamKeys["X_CLIENT_SKU"] = "x-client-SKU";
    AADServerParamKeys["X_CLIENT_VER"] = "x-client-VER";
    AADServerParamKeys["X_CLIENT_OS"] = "x-client-OS";
    AADServerParamKeys["X_CLIENT_CPU"] = "x-client-CPU";
    AADServerParamKeys["X_CLIENT_CURR_TELEM"] = "x-client-current-telemetry";
    AADServerParamKeys["X_CLIENT_LAST_TELEM"] = "x-client-last-telemetry";
    AADServerParamKeys["X_MS_LIB_CAPABILITY"] = "x-ms-lib-capability";
    AADServerParamKeys["X_APP_NAME"] = "x-app-name";
    AADServerParamKeys["X_APP_VER"] = "x-app-ver";
    AADServerParamKeys["POST_LOGOUT_URI"] = "post_logout_redirect_uri";
    AADServerParamKeys["ID_TOKEN_HINT"] = "id_token_hint";
    AADServerParamKeys["DEVICE_CODE"] = "device_code";
    AADServerParamKeys["CLIENT_SECRET"] = "client_secret";
    AADServerParamKeys["CLIENT_ASSERTION"] = "client_assertion";
    AADServerParamKeys["CLIENT_ASSERTION_TYPE"] = "client_assertion_type";
    AADServerParamKeys["TOKEN_TYPE"] = "token_type";
    AADServerParamKeys["REQ_CNF"] = "req_cnf";
    AADServerParamKeys["OBO_ASSERTION"] = "assertion";
    AADServerParamKeys["REQUESTED_TOKEN_USE"] = "requested_token_use";
    AADServerParamKeys["ON_BEHALF_OF"] = "on_behalf_of";
    AADServerParamKeys["FOCI"] = "foci";
    AADServerParamKeys["CCS_HEADER"] = "X-AnchorMailbox";
    AADServerParamKeys["RETURN_SPA_CODE"] = "return_spa_code";
    AADServerParamKeys["NATIVE_BROKER"] = "nativebroker";
    AADServerParamKeys["LOGOUT_HINT"] = "logout_hint";
})(AADServerParamKeys || (AADServerParamKeys = {}));
/**
 * Claims request keys
 */
var ClaimsRequestKeys;
(function (ClaimsRequestKeys) {
    ClaimsRequestKeys["ACCESS_TOKEN"] = "access_token";
    ClaimsRequestKeys["XMS_CC"] = "xms_cc";
})(ClaimsRequestKeys || (ClaimsRequestKeys = {}));
/**
 * we considered making this "enum" in the request instead of string, however it looks like the allowed list of
 * prompt values kept changing over past couple of years. There are some undocumented prompt values for some
 * internal partners too, hence the choice of generic "string" type instead of the "enum"
 */
var PromptValue = {
    LOGIN: "login",
    SELECT_ACCOUNT: "select_account",
    CONSENT: "consent",
    NONE: "none",
    CREATE: "create"
};
/**
 * SSO Types - generated to populate hints
 */
var SSOTypes;
(function (SSOTypes) {
    SSOTypes["ACCOUNT"] = "account";
    SSOTypes["SID"] = "sid";
    SSOTypes["LOGIN_HINT"] = "login_hint";
    SSOTypes["ID_TOKEN"] = "id_token";
    SSOTypes["DOMAIN_HINT"] = "domain_hint";
    SSOTypes["ORGANIZATIONS"] = "organizations";
    SSOTypes["CONSUMERS"] = "consumers";
    SSOTypes["ACCOUNT_ID"] = "accountIdentifier";
    SSOTypes["HOMEACCOUNT_ID"] = "homeAccountIdentifier";
})(SSOTypes || (SSOTypes = {}));
/**
 * Disallowed extra query parameters.
 */
[
    SSOTypes.SID,
    SSOTypes.LOGIN_HINT
];
/**
 * allowed values for codeVerifier
 */
var CodeChallengeMethodValues = {
    PLAIN: "plain",
    S256: "S256"
};
/**
 * allowed values for response_mode
 */
exports.ResponseMode = void 0;
(function (ResponseMode) {
    ResponseMode["QUERY"] = "query";
    ResponseMode["FRAGMENT"] = "fragment";
    ResponseMode["FORM_POST"] = "form_post";
})(exports.ResponseMode || (exports.ResponseMode = {}));
/**
 * allowed grant_type
 */
var GrantType;
(function (GrantType) {
    GrantType["IMPLICIT_GRANT"] = "implicit";
    GrantType["AUTHORIZATION_CODE_GRANT"] = "authorization_code";
    GrantType["CLIENT_CREDENTIALS_GRANT"] = "client_credentials";
    GrantType["RESOURCE_OWNER_PASSWORD_GRANT"] = "password";
    GrantType["REFRESH_TOKEN_GRANT"] = "refresh_token";
    GrantType["DEVICE_CODE_GRANT"] = "device_code";
    GrantType["JWT_BEARER"] = "urn:ietf:params:oauth:grant-type:jwt-bearer";
})(GrantType || (GrantType = {}));
/**
 * Account types in Cache
 */
exports.CacheAccountType = void 0;
(function (CacheAccountType) {
    CacheAccountType["MSSTS_ACCOUNT_TYPE"] = "MSSTS";
    CacheAccountType["ADFS_ACCOUNT_TYPE"] = "ADFS";
    CacheAccountType["MSAV1_ACCOUNT_TYPE"] = "MSA";
    CacheAccountType["GENERIC_ACCOUNT_TYPE"] = "Generic"; // NTLM, Kerberos, FBA, Basic etc
})(exports.CacheAccountType || (exports.CacheAccountType = {}));
/**
 * Separators used in cache
 */
var Separators;
(function (Separators) {
    Separators["CACHE_KEY_SEPARATOR"] = "-";
    Separators["CLIENT_INFO_SEPARATOR"] = ".";
})(Separators || (Separators = {}));
/**
 * Credential Type stored in the cache
 */
exports.CredentialType = void 0;
(function (CredentialType) {
    CredentialType["ID_TOKEN"] = "IdToken";
    CredentialType["ACCESS_TOKEN"] = "AccessToken";
    CredentialType["ACCESS_TOKEN_WITH_AUTH_SCHEME"] = "AccessToken_With_AuthScheme";
    CredentialType["REFRESH_TOKEN"] = "RefreshToken";
})(exports.CredentialType || (exports.CredentialType = {}));
/**
 * Credential Type stored in the cache
 */
exports.CacheSchemaType = void 0;
(function (CacheSchemaType) {
    CacheSchemaType["ACCOUNT"] = "Account";
    CacheSchemaType["CREDENTIAL"] = "Credential";
    CacheSchemaType["ID_TOKEN"] = "IdToken";
    CacheSchemaType["ACCESS_TOKEN"] = "AccessToken";
    CacheSchemaType["REFRESH_TOKEN"] = "RefreshToken";
    CacheSchemaType["APP_METADATA"] = "AppMetadata";
    CacheSchemaType["TEMPORARY"] = "TempCache";
    CacheSchemaType["TELEMETRY"] = "Telemetry";
    CacheSchemaType["UNDEFINED"] = "Undefined";
    CacheSchemaType["THROTTLING"] = "Throttling";
})(exports.CacheSchemaType || (exports.CacheSchemaType = {}));
/**
 * Combine all cache types
 */
exports.CacheType = void 0;
(function (CacheType) {
    CacheType[CacheType["ADFS"] = 1001] = "ADFS";
    CacheType[CacheType["MSA"] = 1002] = "MSA";
    CacheType[CacheType["MSSTS"] = 1003] = "MSSTS";
    CacheType[CacheType["GENERIC"] = 1004] = "GENERIC";
    CacheType[CacheType["ACCESS_TOKEN"] = 2001] = "ACCESS_TOKEN";
    CacheType[CacheType["REFRESH_TOKEN"] = 2002] = "REFRESH_TOKEN";
    CacheType[CacheType["ID_TOKEN"] = 2003] = "ID_TOKEN";
    CacheType[CacheType["APP_METADATA"] = 3001] = "APP_METADATA";
    CacheType[CacheType["UNDEFINED"] = 9999] = "UNDEFINED";
})(exports.CacheType || (exports.CacheType = {}));
/**
 * More Cache related constants
 */
var APP_METADATA = "appmetadata";
var CLIENT_INFO = "client_info";
var THE_FAMILY_ID = "1";
var AUTHORITY_METADATA_CONSTANTS = {
    CACHE_KEY: "authority-metadata",
    REFRESH_TIME_SECONDS: 3600 * 24 // 24 Hours
};
var AuthorityMetadataSource;
(function (AuthorityMetadataSource) {
    AuthorityMetadataSource["CONFIG"] = "config";
    AuthorityMetadataSource["CACHE"] = "cache";
    AuthorityMetadataSource["NETWORK"] = "network";
    AuthorityMetadataSource["HARDCODED_VALUES"] = "hardcoded_values";
})(AuthorityMetadataSource || (AuthorityMetadataSource = {}));
var SERVER_TELEM_CONSTANTS = {
    SCHEMA_VERSION: 5,
    MAX_CUR_HEADER_BYTES: 80,
    MAX_LAST_HEADER_BYTES: 330,
    MAX_CACHED_ERRORS: 50,
    CACHE_KEY: "server-telemetry",
    CATEGORY_SEPARATOR: "|",
    VALUE_SEPARATOR: ",",
    OVERFLOW_TRUE: "1",
    OVERFLOW_FALSE: "0",
    UNKNOWN_ERROR: "unknown_error"
};
/**
 * Type of the authentication request
 */
exports.AuthenticationScheme = void 0;
(function (AuthenticationScheme) {
    AuthenticationScheme["BEARER"] = "Bearer";
    AuthenticationScheme["POP"] = "pop";
    AuthenticationScheme["SSH"] = "ssh-cert";
})(exports.AuthenticationScheme || (exports.AuthenticationScheme = {}));
/**
 * Constants related to throttling
 */
var ThrottlingConstants = {
    // Default time to throttle RequestThumbprint in seconds
    DEFAULT_THROTTLE_TIME_SECONDS: 60,
    // Default maximum time to throttle in seconds, overrides what the server sends back
    DEFAULT_MAX_THROTTLE_TIME_SECONDS: 3600,
    // Prefix for storing throttling entries
    THROTTLING_PREFIX: "throttling",
    // Value assigned to the x-ms-lib-capability header to indicate to the server the library supports throttling
    X_MS_LIB_CAPABILITY_VALUE: "retry-after, h429"
};
var Errors = {
    INVALID_GRANT_ERROR: "invalid_grant",
    CLIENT_MISMATCH_ERROR: "client_mismatch",
};
/**
 * Password grant parameters
 */
var PasswordGrantConstants;
(function (PasswordGrantConstants) {
    PasswordGrantConstants["username"] = "username";
    PasswordGrantConstants["password"] = "password";
})(PasswordGrantConstants || (PasswordGrantConstants = {}));
/**
 * Response codes
 */
var ResponseCodes;
(function (ResponseCodes) {
    ResponseCodes[ResponseCodes["httpSuccess"] = 200] = "httpSuccess";
    ResponseCodes[ResponseCodes["httpBadRequest"] = 400] = "httpBadRequest";
})(ResponseCodes || (ResponseCodes = {}));
/**
 * Region Discovery Sources
 */
var RegionDiscoverySources;
(function (RegionDiscoverySources) {
    RegionDiscoverySources["FAILED_AUTO_DETECTION"] = "1";
    RegionDiscoverySources["INTERNAL_CACHE"] = "2";
    RegionDiscoverySources["ENVIRONMENT_VARIABLE"] = "3";
    RegionDiscoverySources["IMDS"] = "4";
})(RegionDiscoverySources || (RegionDiscoverySources = {}));
/**
 * Region Discovery Outcomes
 */
var RegionDiscoveryOutcomes;
(function (RegionDiscoveryOutcomes) {
    RegionDiscoveryOutcomes["CONFIGURED_MATCHES_DETECTED"] = "1";
    RegionDiscoveryOutcomes["CONFIGURED_NO_AUTO_DETECTION"] = "2";
    RegionDiscoveryOutcomes["CONFIGURED_NOT_DETECTED"] = "3";
    RegionDiscoveryOutcomes["AUTO_DETECTION_REQUESTED_SUCCESSFUL"] = "4";
    RegionDiscoveryOutcomes["AUTO_DETECTION_REQUESTED_FAILED"] = "5";
})(RegionDiscoveryOutcomes || (RegionDiscoveryOutcomes = {}));
var CacheOutcome;
(function (CacheOutcome) {
    CacheOutcome["NO_CACHE_HIT"] = "0";
    CacheOutcome["FORCE_REFRESH"] = "1";
    CacheOutcome["NO_CACHED_ACCESS_TOKEN"] = "2";
    CacheOutcome["CACHED_ACCESS_TOKEN_EXPIRED"] = "3";
    CacheOutcome["REFRESH_CACHED_ACCESS_TOKEN"] = "4";
})(CacheOutcome || (CacheOutcome = {}));
var JsonTypes;
(function (JsonTypes) {
    JsonTypes["Jwt"] = "JWT";
    JsonTypes["Jwk"] = "JWK";
})(JsonTypes || (JsonTypes = {}));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * AuthErrorMessage class containing string constants used by error codes and messages.
 */
var AuthErrorMessage = {
    unexpectedError: {
        code: "unexpected_error",
        desc: "Unexpected error in authentication."
    },
    postRequestFailed: {
        code: "post_request_failed",
        desc: "Post request failed from the network, could be a 4xx/5xx or a network unavailability. Please check the exact error code for details."
    }
};
/**
 * General error class thrown by the MSAL.js library.
 */
var AuthError = /** @class */ (function (_super) {
    __extends(AuthError, _super);
    function AuthError(errorCode, errorMessage, suberror) {
        var _this = this;
        var errorString = errorMessage ? errorCode + ": " + errorMessage : errorCode;
        _this = _super.call(this, errorString) || this;
        Object.setPrototypeOf(_this, AuthError.prototype);
        _this.errorCode = errorCode || Constants.EMPTY_STRING;
        _this.errorMessage = errorMessage || Constants.EMPTY_STRING;
        _this.subError = suberror || Constants.EMPTY_STRING;
        _this.name = "AuthError";
        return _this;
    }
    AuthError.prototype.setCorrelationId = function (correlationId) {
        this.correlationId = correlationId;
    };
    /**
     * Creates an error that is thrown when something unexpected happens in the library.
     * @param errDesc
     */
    AuthError.createUnexpectedError = function (errDesc) {
        return new AuthError(AuthErrorMessage.unexpectedError.code, AuthErrorMessage.unexpectedError.desc + ": " + errDesc);
    };
    /**
     * Creates an error for post request failures.
     * @param errDesc
     * @returns
     */
    AuthError.createPostRequestFailed = function (errDesc) {
        return new AuthError(AuthErrorMessage.postRequestFailed.code, AuthErrorMessage.postRequestFailed.desc + ": " + errDesc);
    };
    return AuthError;
}(Error));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var DEFAULT_CRYPTO_IMPLEMENTATION = {
    createNewGuid: function () {
        var notImplErr = "Crypto interface - createNewGuid() has not been implemented";
        throw AuthError.createUnexpectedError(notImplErr);
    },
    base64Decode: function () {
        var notImplErr = "Crypto interface - base64Decode() has not been implemented";
        throw AuthError.createUnexpectedError(notImplErr);
    },
    base64Encode: function () {
        var notImplErr = "Crypto interface - base64Encode() has not been implemented";
        throw AuthError.createUnexpectedError(notImplErr);
    },
    generatePkceCodes: function () {
        return __awaiter(this, void 0, void 0, function () {
            var notImplErr;
            return __generator(this, function (_a) {
                notImplErr = "Crypto interface - generatePkceCodes() has not been implemented";
                throw AuthError.createUnexpectedError(notImplErr);
            });
        });
    },
    getPublicKeyThumbprint: function () {
        return __awaiter(this, void 0, void 0, function () {
            var notImplErr;
            return __generator(this, function (_a) {
                notImplErr = "Crypto interface - getPublicKeyThumbprint() has not been implemented";
                throw AuthError.createUnexpectedError(notImplErr);
            });
        });
    },
    removeTokenBindingKey: function () {
        return __awaiter(this, void 0, void 0, function () {
            var notImplErr;
            return __generator(this, function (_a) {
                notImplErr = "Crypto interface - removeTokenBindingKey() has not been implemented";
                throw AuthError.createUnexpectedError(notImplErr);
            });
        });
    },
    clearKeystore: function () {
        return __awaiter(this, void 0, void 0, function () {
            var notImplErr;
            return __generator(this, function (_a) {
                notImplErr = "Crypto interface - clearKeystore() has not been implemented";
                throw AuthError.createUnexpectedError(notImplErr);
            });
        });
    },
    signJwt: function () {
        return __awaiter(this, void 0, void 0, function () {
            var notImplErr;
            return __generator(this, function (_a) {
                notImplErr = "Crypto interface - signJwt() has not been implemented";
                throw AuthError.createUnexpectedError(notImplErr);
            });
        });
    },
    hashString: function () {
        return __awaiter(this, void 0, void 0, function () {
            var notImplErr;
            return __generator(this, function (_a) {
                notImplErr = "Crypto interface - hashString() has not been implemented";
                throw AuthError.createUnexpectedError(notImplErr);
            });
        });
    }
};

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * ClientAuthErrorMessage class containing string constants used by error codes and messages.
 */
var ClientAuthErrorMessage = {
    clientInfoDecodingError: {
        code: "client_info_decoding_error",
        desc: "The client info could not be parsed/decoded correctly. Please review the trace to determine the root cause."
    },
    clientInfoEmptyError: {
        code: "client_info_empty_error",
        desc: "The client info was empty. Please review the trace to determine the root cause."
    },
    tokenParsingError: {
        code: "token_parsing_error",
        desc: "Token cannot be parsed. Please review stack trace to determine root cause."
    },
    nullOrEmptyToken: {
        code: "null_or_empty_token",
        desc: "The token is null or empty. Please review the trace to determine the root cause."
    },
    endpointResolutionError: {
        code: "endpoints_resolution_error",
        desc: "Error: could not resolve endpoints. Please check network and try again."
    },
    networkError: {
        code: "network_error",
        desc: "Network request failed. Please check network trace to determine root cause."
    },
    unableToGetOpenidConfigError: {
        code: "openid_config_error",
        desc: "Could not retrieve endpoints. Check your authority and verify the .well-known/openid-configuration endpoint returns the required endpoints."
    },
    hashNotDeserialized: {
        code: "hash_not_deserialized",
        desc: "The hash parameters could not be deserialized. Please review the trace to determine the root cause."
    },
    blankGuidGenerated: {
        code: "blank_guid_generated",
        desc: "The guid generated was blank. Please review the trace to determine the root cause."
    },
    invalidStateError: {
        code: "invalid_state",
        desc: "State was not the expected format. Please check the logs to determine whether the request was sent using ProtocolUtils.setRequestState()."
    },
    stateMismatchError: {
        code: "state_mismatch",
        desc: "State mismatch error. Please check your network. Continued requests may cause cache overflow."
    },
    stateNotFoundError: {
        code: "state_not_found",
        desc: "State not found"
    },
    nonceMismatchError: {
        code: "nonce_mismatch",
        desc: "Nonce mismatch error. This may be caused by a race condition in concurrent requests."
    },
    nonceNotFoundError: {
        code: "nonce_not_found",
        desc: "nonce not found"
    },
    noTokensFoundError: {
        code: "no_tokens_found",
        desc: "No tokens were found for the given scopes, and no authorization code was passed to acquireToken. You must retrieve an authorization code before making a call to acquireToken()."
    },
    multipleMatchingTokens: {
        code: "multiple_matching_tokens",
        desc: "The cache contains multiple tokens satisfying the requirements. " +
            "Call AcquireToken again providing more requirements such as authority or account."
    },
    multipleMatchingAccounts: {
        code: "multiple_matching_accounts",
        desc: "The cache contains multiple accounts satisfying the given parameters. Please pass more info to obtain the correct account"
    },
    multipleMatchingAppMetadata: {
        code: "multiple_matching_appMetadata",
        desc: "The cache contains multiple appMetadata satisfying the given parameters. Please pass more info to obtain the correct appMetadata"
    },
    tokenRequestCannotBeMade: {
        code: "request_cannot_be_made",
        desc: "Token request cannot be made without authorization code or refresh token."
    },
    appendEmptyScopeError: {
        code: "cannot_append_empty_scope",
        desc: "Cannot append null or empty scope to ScopeSet. Please check the stack trace for more info."
    },
    removeEmptyScopeError: {
        code: "cannot_remove_empty_scope",
        desc: "Cannot remove null or empty scope from ScopeSet. Please check the stack trace for more info."
    },
    appendScopeSetError: {
        code: "cannot_append_scopeset",
        desc: "Cannot append ScopeSet due to error."
    },
    emptyInputScopeSetError: {
        code: "empty_input_scopeset",
        desc: "Empty input ScopeSet cannot be processed."
    },
    DeviceCodePollingCancelled: {
        code: "device_code_polling_cancelled",
        desc: "Caller has cancelled token endpoint polling during device code flow by setting DeviceCodeRequest.cancel = true."
    },
    DeviceCodeExpired: {
        code: "device_code_expired",
        desc: "Device code is expired."
    },
    DeviceCodeUnknownError: {
        code: "device_code_unknown_error",
        desc: "Device code stopped polling for unknown reasons."
    },
    NoAccountInSilentRequest: {
        code: "no_account_in_silent_request",
        desc: "Please pass an account object, silent flow is not supported without account information"
    },
    invalidCacheRecord: {
        code: "invalid_cache_record",
        desc: "Cache record object was null or undefined."
    },
    invalidCacheEnvironment: {
        code: "invalid_cache_environment",
        desc: "Invalid environment when attempting to create cache entry"
    },
    noAccountFound: {
        code: "no_account_found",
        desc: "No account found in cache for given key."
    },
    CachePluginError: {
        code: "no cache plugin set on CacheManager",
        desc: "ICachePlugin needs to be set before using readFromStorage or writeFromStorage"
    },
    noCryptoObj: {
        code: "no_crypto_object",
        desc: "No crypto object detected. This is required for the following operation: "
    },
    invalidCacheType: {
        code: "invalid_cache_type",
        desc: "Invalid cache type"
    },
    unexpectedAccountType: {
        code: "unexpected_account_type",
        desc: "Unexpected account type."
    },
    unexpectedCredentialType: {
        code: "unexpected_credential_type",
        desc: "Unexpected credential type."
    },
    invalidAssertion: {
        code: "invalid_assertion",
        desc: "Client assertion must meet requirements described in https://tools.ietf.org/html/rfc7515"
    },
    invalidClientCredential: {
        code: "invalid_client_credential",
        desc: "Client credential (secret, certificate, or assertion) must not be empty when creating a confidential client. An application should at most have one credential"
    },
    tokenRefreshRequired: {
        code: "token_refresh_required",
        desc: "Cannot return token from cache because it must be refreshed. This may be due to one of the following reasons: forceRefresh parameter is set to true, claims have been requested, there is no cached access token or it is expired."
    },
    userTimeoutReached: {
        code: "user_timeout_reached",
        desc: "User defined timeout for device code polling reached",
    },
    tokenClaimsRequired: {
        code: "token_claims_cnf_required_for_signedjwt",
        desc: "Cannot generate a POP jwt if the token_claims are not populated"
    },
    noAuthorizationCodeFromServer: {
        code: "authorization_code_missing_from_server_response",
        desc: "Server response does not contain an authorization code to proceed"
    },
    noAzureRegionDetected: {
        code: "no_azure_region_detected",
        desc: "No azure region was detected and no fallback was made available"
    },
    accessTokenEntityNullError: {
        code: "access_token_entity_null",
        desc: "Access token entity is null, please check logs and cache to ensure a valid access token is present."
    },
    bindingKeyNotRemovedError: {
        code: "binding_key_not_removed",
        desc: "Could not remove the credential's binding key from storage."
    },
    logoutNotSupported: {
        code: "end_session_endpoint_not_supported",
        desc: "Provided authority does not support logout."
    },
    keyIdMissing: {
        code: "key_id_missing",
        desc: "A keyId value is missing from the requested bound token's cache record and is required to match the token to it's stored binding key."
    }
};
/**
 * Error thrown when there is an error in the client code running on the browser.
 */
var ClientAuthError = /** @class */ (function (_super) {
    __extends(ClientAuthError, _super);
    function ClientAuthError(errorCode, errorMessage) {
        var _this = _super.call(this, errorCode, errorMessage) || this;
        _this.name = "ClientAuthError";
        Object.setPrototypeOf(_this, ClientAuthError.prototype);
        return _this;
    }
    /**
     * Creates an error thrown when client info object doesn't decode correctly.
     * @param caughtError
     */
    ClientAuthError.createClientInfoDecodingError = function (caughtError) {
        return new ClientAuthError(ClientAuthErrorMessage.clientInfoDecodingError.code, ClientAuthErrorMessage.clientInfoDecodingError.desc + " Failed with error: " + caughtError);
    };
    /**
     * Creates an error thrown if the client info is empty.
     * @param rawClientInfo
     */
    ClientAuthError.createClientInfoEmptyError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.clientInfoEmptyError.code, "" + ClientAuthErrorMessage.clientInfoEmptyError.desc);
    };
    /**
     * Creates an error thrown when the id token extraction errors out.
     * @param err
     */
    ClientAuthError.createTokenParsingError = function (caughtExtractionError) {
        return new ClientAuthError(ClientAuthErrorMessage.tokenParsingError.code, ClientAuthErrorMessage.tokenParsingError.desc + " Failed with error: " + caughtExtractionError);
    };
    /**
     * Creates an error thrown when the id token string is null or empty.
     * @param invalidRawTokenString
     */
    ClientAuthError.createTokenNullOrEmptyError = function (invalidRawTokenString) {
        return new ClientAuthError(ClientAuthErrorMessage.nullOrEmptyToken.code, ClientAuthErrorMessage.nullOrEmptyToken.desc + " Raw Token Value: " + invalidRawTokenString);
    };
    /**
     * Creates an error thrown when the endpoint discovery doesn't complete correctly.
     */
    ClientAuthError.createEndpointDiscoveryIncompleteError = function (errDetail) {
        return new ClientAuthError(ClientAuthErrorMessage.endpointResolutionError.code, ClientAuthErrorMessage.endpointResolutionError.desc + " Detail: " + errDetail);
    };
    /**
     * Creates an error thrown when the fetch client throws
     */
    ClientAuthError.createNetworkError = function (endpoint, errDetail) {
        return new ClientAuthError(ClientAuthErrorMessage.networkError.code, ClientAuthErrorMessage.networkError.desc + " | Fetch client threw: " + errDetail + " | Attempted to reach: " + endpoint.split("?")[0]);
    };
    /**
     * Creates an error thrown when the openid-configuration endpoint cannot be reached or does not contain the required data
     */
    ClientAuthError.createUnableToGetOpenidConfigError = function (errDetail) {
        return new ClientAuthError(ClientAuthErrorMessage.unableToGetOpenidConfigError.code, ClientAuthErrorMessage.unableToGetOpenidConfigError.desc + " Attempted to retrieve endpoints from: " + errDetail);
    };
    /**
     * Creates an error thrown when the hash cannot be deserialized.
     * @param hashParamObj
     */
    ClientAuthError.createHashNotDeserializedError = function (hashParamObj) {
        return new ClientAuthError(ClientAuthErrorMessage.hashNotDeserialized.code, ClientAuthErrorMessage.hashNotDeserialized.desc + " Given Object: " + hashParamObj);
    };
    /**
     * Creates an error thrown when the state cannot be parsed.
     * @param invalidState
     */
    ClientAuthError.createInvalidStateError = function (invalidState, errorString) {
        return new ClientAuthError(ClientAuthErrorMessage.invalidStateError.code, ClientAuthErrorMessage.invalidStateError.desc + " Invalid State: " + invalidState + ", Root Err: " + errorString);
    };
    /**
     * Creates an error thrown when two states do not match.
     */
    ClientAuthError.createStateMismatchError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.stateMismatchError.code, ClientAuthErrorMessage.stateMismatchError.desc);
    };
    /**
     * Creates an error thrown when the state is not present
     * @param missingState
     */
    ClientAuthError.createStateNotFoundError = function (missingState) {
        return new ClientAuthError(ClientAuthErrorMessage.stateNotFoundError.code, ClientAuthErrorMessage.stateNotFoundError.desc + ":  " + missingState);
    };
    /**
     * Creates an error thrown when the nonce does not match.
     */
    ClientAuthError.createNonceMismatchError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.nonceMismatchError.code, ClientAuthErrorMessage.nonceMismatchError.desc);
    };
    /**
     * Creates an error thrown when the mnonce is not present
     * @param missingNonce
     */
    ClientAuthError.createNonceNotFoundError = function (missingNonce) {
        return new ClientAuthError(ClientAuthErrorMessage.nonceNotFoundError.code, ClientAuthErrorMessage.nonceNotFoundError.desc + ":  " + missingNonce);
    };
    /**
     * Throws error when multiple tokens are in cache.
     */
    ClientAuthError.createMultipleMatchingTokensInCacheError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.multipleMatchingTokens.code, ClientAuthErrorMessage.multipleMatchingTokens.desc + ".");
    };
    /**
     * Throws error when multiple accounts are in cache for the given params
     */
    ClientAuthError.createMultipleMatchingAccountsInCacheError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.multipleMatchingAccounts.code, ClientAuthErrorMessage.multipleMatchingAccounts.desc);
    };
    /**
     * Throws error when multiple appMetada are in cache for the given clientId.
     */
    ClientAuthError.createMultipleMatchingAppMetadataInCacheError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.multipleMatchingAppMetadata.code, ClientAuthErrorMessage.multipleMatchingAppMetadata.desc);
    };
    /**
     * Throws error when no auth code or refresh token is given to ServerTokenRequestParameters.
     */
    ClientAuthError.createTokenRequestCannotBeMadeError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.tokenRequestCannotBeMade.code, ClientAuthErrorMessage.tokenRequestCannotBeMade.desc);
    };
    /**
     * Throws error when attempting to append a null, undefined or empty scope to a set
     * @param givenScope
     */
    ClientAuthError.createAppendEmptyScopeToSetError = function (givenScope) {
        return new ClientAuthError(ClientAuthErrorMessage.appendEmptyScopeError.code, ClientAuthErrorMessage.appendEmptyScopeError.desc + " Given Scope: " + givenScope);
    };
    /**
     * Throws error when attempting to append a null, undefined or empty scope to a set
     * @param givenScope
     */
    ClientAuthError.createRemoveEmptyScopeFromSetError = function (givenScope) {
        return new ClientAuthError(ClientAuthErrorMessage.removeEmptyScopeError.code, ClientAuthErrorMessage.removeEmptyScopeError.desc + " Given Scope: " + givenScope);
    };
    /**
     * Throws error when attempting to append null or empty ScopeSet.
     * @param appendError
     */
    ClientAuthError.createAppendScopeSetError = function (appendError) {
        return new ClientAuthError(ClientAuthErrorMessage.appendScopeSetError.code, ClientAuthErrorMessage.appendScopeSetError.desc + " Detail Error: " + appendError);
    };
    /**
     * Throws error if ScopeSet is null or undefined.
     * @param givenScopeSet
     */
    ClientAuthError.createEmptyInputScopeSetError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.emptyInputScopeSetError.code, "" + ClientAuthErrorMessage.emptyInputScopeSetError.desc);
    };
    /**
     * Throws error if user sets CancellationToken.cancel = true during polling of token endpoint during device code flow
     */
    ClientAuthError.createDeviceCodeCancelledError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.DeviceCodePollingCancelled.code, "" + ClientAuthErrorMessage.DeviceCodePollingCancelled.desc);
    };
    /**
     * Throws error if device code is expired
     */
    ClientAuthError.createDeviceCodeExpiredError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.DeviceCodeExpired.code, "" + ClientAuthErrorMessage.DeviceCodeExpired.desc);
    };
    /**
     * Throws error if device code is expired
     */
    ClientAuthError.createDeviceCodeUnknownError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.DeviceCodeUnknownError.code, "" + ClientAuthErrorMessage.DeviceCodeUnknownError.desc);
    };
    /**
     * Throws error when silent requests are made without an account object
     */
    ClientAuthError.createNoAccountInSilentRequestError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.NoAccountInSilentRequest.code, "" + ClientAuthErrorMessage.NoAccountInSilentRequest.desc);
    };
    /**
     * Throws error when cache record is null or undefined.
     */
    ClientAuthError.createNullOrUndefinedCacheRecord = function () {
        return new ClientAuthError(ClientAuthErrorMessage.invalidCacheRecord.code, ClientAuthErrorMessage.invalidCacheRecord.desc);
    };
    /**
     * Throws error when provided environment is not part of the CloudDiscoveryMetadata object
     */
    ClientAuthError.createInvalidCacheEnvironmentError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.invalidCacheEnvironment.code, ClientAuthErrorMessage.invalidCacheEnvironment.desc);
    };
    /**
     * Throws error when account is not found in cache.
     */
    ClientAuthError.createNoAccountFoundError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.noAccountFound.code, ClientAuthErrorMessage.noAccountFound.desc);
    };
    /**
     * Throws error if ICachePlugin not set on CacheManager.
     */
    ClientAuthError.createCachePluginError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.CachePluginError.code, "" + ClientAuthErrorMessage.CachePluginError.desc);
    };
    /**
     * Throws error if crypto object not found.
     * @param operationName
     */
    ClientAuthError.createNoCryptoObjectError = function (operationName) {
        return new ClientAuthError(ClientAuthErrorMessage.noCryptoObj.code, "" + ClientAuthErrorMessage.noCryptoObj.desc + operationName);
    };
    /**
     * Throws error if cache type is invalid.
     */
    ClientAuthError.createInvalidCacheTypeError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.invalidCacheType.code, "" + ClientAuthErrorMessage.invalidCacheType.desc);
    };
    /**
     * Throws error if unexpected account type.
     */
    ClientAuthError.createUnexpectedAccountTypeError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.unexpectedAccountType.code, "" + ClientAuthErrorMessage.unexpectedAccountType.desc);
    };
    /**
     * Throws error if unexpected credential type.
     */
    ClientAuthError.createUnexpectedCredentialTypeError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.unexpectedCredentialType.code, "" + ClientAuthErrorMessage.unexpectedCredentialType.desc);
    };
    /**
     * Throws error if client assertion is not valid.
     */
    ClientAuthError.createInvalidAssertionError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.invalidAssertion.code, "" + ClientAuthErrorMessage.invalidAssertion.desc);
    };
    /**
     * Throws error if client assertion is not valid.
     */
    ClientAuthError.createInvalidCredentialError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.invalidClientCredential.code, "" + ClientAuthErrorMessage.invalidClientCredential.desc);
    };
    /**
     * Throws error if token cannot be retrieved from cache due to refresh being required.
     */
    ClientAuthError.createRefreshRequiredError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.tokenRefreshRequired.code, ClientAuthErrorMessage.tokenRefreshRequired.desc);
    };
    /**
     * Throws error if the user defined timeout is reached.
     */
    ClientAuthError.createUserTimeoutReachedError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.userTimeoutReached.code, ClientAuthErrorMessage.userTimeoutReached.desc);
    };
    /*
     * Throws error if token claims are not populated for a signed jwt generation
     */
    ClientAuthError.createTokenClaimsRequiredError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.tokenClaimsRequired.code, ClientAuthErrorMessage.tokenClaimsRequired.desc);
    };
    /**
     * Throws error when the authorization code is missing from the server response
     */
    ClientAuthError.createNoAuthCodeInServerResponseError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.noAuthorizationCodeFromServer.code, ClientAuthErrorMessage.noAuthorizationCodeFromServer.desc);
    };
    ClientAuthError.createBindingKeyNotRemovedError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.bindingKeyNotRemovedError.code, ClientAuthErrorMessage.bindingKeyNotRemovedError.desc);
    };
    /**
     * Thrown when logout is attempted for an authority that doesnt have an end_session_endpoint
     */
    ClientAuthError.createLogoutNotSupportedError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.logoutNotSupported.code, ClientAuthErrorMessage.logoutNotSupported.desc);
    };
    /**
     * Create an error when kid attribute is missing from a PoP token's cache record
     */
    ClientAuthError.createKeyIdMissingError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.keyIdMissing.code, ClientAuthErrorMessage.keyIdMissing.desc);
    };
    return ClientAuthError;
}(AuthError));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * @hidden
 */
var StringUtils = /** @class */ (function () {
    function StringUtils() {
    }
    /**
     * decode a JWT
     *
     * @param authToken
     */
    StringUtils.decodeAuthToken = function (authToken) {
        if (StringUtils.isEmpty(authToken)) {
            throw ClientAuthError.createTokenNullOrEmptyError(authToken);
        }
        var tokenPartsRegex = /^([^\.\s]*)\.([^\.\s]+)\.([^\.\s]*)$/;
        var matches = tokenPartsRegex.exec(authToken);
        if (!matches || matches.length < 4) {
            throw ClientAuthError.createTokenParsingError("Given token is malformed: " + JSON.stringify(authToken));
        }
        var crackedToken = {
            header: matches[1],
            JWSPayload: matches[2],
            JWSSig: matches[3]
        };
        return crackedToken;
    };
    /**
     * Check if a string is empty.
     *
     * @param str
     */
    StringUtils.isEmpty = function (str) {
        return (typeof str === "undefined" || !str || 0 === str.length);
    };
    /**
     * Check if stringified object is empty
     * @param strObj
     */
    StringUtils.isEmptyObj = function (strObj) {
        if (strObj && !StringUtils.isEmpty(strObj)) {
            try {
                var obj = JSON.parse(strObj);
                return Object.keys(obj).length === 0;
            }
            catch (e) { }
        }
        return true;
    };
    StringUtils.startsWith = function (str, search) {
        return str.indexOf(search) === 0;
    };
    StringUtils.endsWith = function (str, search) {
        return (str.length >= search.length) && (str.lastIndexOf(search) === (str.length - search.length));
    };
    /**
     * Parses string into an object.
     *
     * @param query
     */
    StringUtils.queryStringToObject = function (query) {
        var obj = {};
        var params = query.split("&");
        var decode = function (s) { return decodeURIComponent(s.replace(/\+/g, " ")); };
        params.forEach(function (pair) {
            if (pair.trim()) {
                var _a = pair.split(/=(.+)/g, 2), key = _a[0], value = _a[1]; // Split on the first occurence of the '=' character
                if (key && value) {
                    obj[decode(key)] = decode(value);
                }
            }
        });
        return obj;
    };
    /**
     * Trims entries in an array.
     *
     * @param arr
     */
    StringUtils.trimArrayEntries = function (arr) {
        return arr.map(function (entry) { return entry.trim(); });
    };
    /**
     * Removes empty strings from array
     * @param arr
     */
    StringUtils.removeEmptyStringsFromArray = function (arr) {
        return arr.filter(function (entry) {
            return !StringUtils.isEmpty(entry);
        });
    };
    /**
     * Attempts to parse a string into JSON
     * @param str
     */
    StringUtils.jsonParseHelper = function (str) {
        try {
            return JSON.parse(str);
        }
        catch (e) {
            return null;
        }
    };
    /**
     * Tests if a given string matches a given pattern, with support for wildcards and queries.
     * @param pattern Wildcard pattern to string match. Supports "*" for wildcards and "?" for queries
     * @param input String to match against
     */
    StringUtils.matchPattern = function (pattern, input) {
        /**
         * Wildcard support: https://stackoverflow.com/a/3117248/4888559
         * Queries: replaces "?" in string with escaped "\?" for regex test
         */
        var regex = new RegExp(pattern.replace(/\\/g, "\\\\").replace(/\*/g, "[^ ]*").replace(/\?/g, "\\\?")); // eslint-disable-line security/detect-non-literal-regexp
        return regex.test(input);
    };
    return StringUtils;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Log message level.
 */
exports.LogLevel = void 0;
(function (LogLevel) {
    LogLevel[LogLevel["Error"] = 0] = "Error";
    LogLevel[LogLevel["Warning"] = 1] = "Warning";
    LogLevel[LogLevel["Info"] = 2] = "Info";
    LogLevel[LogLevel["Verbose"] = 3] = "Verbose";
    LogLevel[LogLevel["Trace"] = 4] = "Trace";
})(exports.LogLevel || (exports.LogLevel = {}));
/**
 * Class which facilitates logging of messages to a specific place.
 */
var Logger = /** @class */ (function () {
    function Logger(loggerOptions, packageName, packageVersion) {
        // Current log level, defaults to info.
        this.level = exports.LogLevel.Info;
        var defaultLoggerCallback = function () {
            return;
        };
        this.localCallback = loggerOptions.loggerCallback || defaultLoggerCallback;
        this.piiLoggingEnabled = loggerOptions.piiLoggingEnabled || false;
        this.level = typeof (loggerOptions.logLevel) === "number" ? loggerOptions.logLevel : exports.LogLevel.Info;
        this.correlationId = loggerOptions.correlationId || Constants.EMPTY_STRING;
        this.packageName = packageName || Constants.EMPTY_STRING;
        this.packageVersion = packageVersion || Constants.EMPTY_STRING;
    }
    /**
     * Create new Logger with existing configurations.
     */
    Logger.prototype.clone = function (packageName, packageVersion, correlationId) {
        return new Logger({ loggerCallback: this.localCallback, piiLoggingEnabled: this.piiLoggingEnabled, logLevel: this.level, correlationId: correlationId || this.correlationId }, packageName, packageVersion);
    };
    /**
     * Log message with required options.
     */
    Logger.prototype.logMessage = function (logMessage, options) {
        if ((options.logLevel > this.level) || (!this.piiLoggingEnabled && options.containsPii)) {
            return;
        }
        var timestamp = new Date().toUTCString();
        // Add correlationId to logs if set, correlationId provided on log messages take precedence
        var logHeader;
        if (!StringUtils.isEmpty(options.correlationId)) {
            logHeader = "[" + timestamp + "] : [" + options.correlationId + "]";
        }
        else if (!StringUtils.isEmpty(this.correlationId)) {
            logHeader = "[" + timestamp + "] : [" + this.correlationId + "]";
        }
        else {
            logHeader = "[" + timestamp + "]";
        }
        var log = logHeader + " : " + this.packageName + "@" + this.packageVersion + " : " + exports.LogLevel[options.logLevel] + " - " + logMessage;
        // debug(`msal:${LogLevel[options.logLevel]}${options.containsPii ? "-Pii": Constants.EMPTY_STRING}${options.context ? `:${options.context}` : Constants.EMPTY_STRING}`)(logMessage);
        this.executeCallback(options.logLevel, log, options.containsPii || false);
    };
    /**
     * Execute callback with message.
     */
    Logger.prototype.executeCallback = function (level, message, containsPii) {
        if (this.localCallback) {
            this.localCallback(level, message, containsPii);
        }
    };
    /**
     * Logs error messages.
     */
    Logger.prototype.error = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: exports.LogLevel.Error,
            containsPii: false,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Logs error messages with PII.
     */
    Logger.prototype.errorPii = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: exports.LogLevel.Error,
            containsPii: true,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Logs warning messages.
     */
    Logger.prototype.warning = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: exports.LogLevel.Warning,
            containsPii: false,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Logs warning messages with PII.
     */
    Logger.prototype.warningPii = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: exports.LogLevel.Warning,
            containsPii: true,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Logs info messages.
     */
    Logger.prototype.info = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: exports.LogLevel.Info,
            containsPii: false,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Logs info messages with PII.
     */
    Logger.prototype.infoPii = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: exports.LogLevel.Info,
            containsPii: true,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Logs verbose messages.
     */
    Logger.prototype.verbose = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: exports.LogLevel.Verbose,
            containsPii: false,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Logs verbose messages with PII.
     */
    Logger.prototype.verbosePii = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: exports.LogLevel.Verbose,
            containsPii: true,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Logs trace messages.
     */
    Logger.prototype.trace = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: exports.LogLevel.Trace,
            containsPii: false,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Logs trace messages with PII.
     */
    Logger.prototype.tracePii = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: exports.LogLevel.Trace,
            containsPii: true,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Returns whether PII Logging is enabled or not.
     */
    Logger.prototype.isPiiLoggingEnabled = function () {
        return this.piiLoggingEnabled || false;
    };
    return Logger;
}());

/* eslint-disable header/header */
var name = "@azure/msal-common";
var version = "7.3.0";

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
exports.AzureCloudInstance = void 0;
(function (AzureCloudInstance) {
    // AzureCloudInstance is not specified.
    AzureCloudInstance[AzureCloudInstance["None"] = 0] = "None";
    // Microsoft Azure public cloud
    AzureCloudInstance["AzurePublic"] = "https://login.microsoftonline.com";
    // Microsoft PPE
    AzureCloudInstance["AzurePpe"] = "https://login.windows-ppe.net";
    // Microsoft Chinese national cloud
    AzureCloudInstance["AzureChina"] = "https://login.chinacloudapi.cn";
    // Microsoft German national cloud ("Black Forest")
    AzureCloudInstance["AzureGermany"] = "https://login.microsoftonline.de";
    // US Government cloud
    AzureCloudInstance["AzureUsGovernment"] = "https://login.microsoftonline.us";
})(exports.AzureCloudInstance || (exports.AzureCloudInstance = {}));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Base type for credentials to be stored in the cache: eg: ACCESS_TOKEN, ID_TOKEN etc
 *
 * Key:Value Schema:
 *
 * Key: <home_account_id*>-<environment>-<credential_type>-<client_id>-<realm*>-<target*>-<requestedClaims*>-<scheme*>
 *
 * Value Schema:
 * {
 *      homeAccountId: home account identifier for the auth scheme,
 *      environment: entity that issued the token, represented as a full host
 *      credentialType: Type of credential as a string, can be one of the following: RefreshToken, AccessToken, IdToken, Password, Cookie, Certificate, Other
 *      clientId: client ID of the application
 *      secret: Actual credential as a string
 *      familyId: Family ID identifier, usually only used for refresh tokens
 *      realm: Full tenant or organizational identifier that the account belongs to
 *      target: Permissions that are included in the token, or for refresh tokens, the resource identifier.
 *      tokenType: Matches the authentication scheme for which the token was issued (i.e. Bearer or pop)
 *      requestedClaimsHash: Matches the SHA 256 hash of the claims object included in the token request
 *      userAssertionHash: Matches the SHA 256 hash of the obo_assertion for the OBO flow
 * }
 */
var CredentialEntity = /** @class */ (function () {
    function CredentialEntity() {
    }
    /**
     * Generate Account Id key component as per the schema: <home_account_id>-<environment>
     */
    CredentialEntity.prototype.generateAccountId = function () {
        return CredentialEntity.generateAccountIdForCacheKey(this.homeAccountId, this.environment);
    };
    /**
     * Generate Credential Id key component as per the schema: <credential_type>-<client_id>-<realm>
     */
    CredentialEntity.prototype.generateCredentialId = function () {
        return CredentialEntity.generateCredentialIdForCacheKey(this.credentialType, this.clientId, this.realm, this.familyId);
    };
    /**
     * Generate target key component as per schema: <target>
     */
    CredentialEntity.prototype.generateTarget = function () {
        return CredentialEntity.generateTargetForCacheKey(this.target);
    };
    /**
     * generates credential key
     */
    CredentialEntity.prototype.generateCredentialKey = function () {
        return CredentialEntity.generateCredentialCacheKey(this.homeAccountId, this.environment, this.credentialType, this.clientId, this.realm, this.target, this.familyId, this.tokenType, this.requestedClaimsHash);
    };
    /**
     * returns the type of the cache (in this case credential)
     */
    CredentialEntity.prototype.generateType = function () {
        switch (this.credentialType) {
            case exports.CredentialType.ID_TOKEN:
                return exports.CacheType.ID_TOKEN;
            case exports.CredentialType.ACCESS_TOKEN:
            case exports.CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME:
                return exports.CacheType.ACCESS_TOKEN;
            case exports.CredentialType.REFRESH_TOKEN:
                return exports.CacheType.REFRESH_TOKEN;
            default: {
                throw ClientAuthError.createUnexpectedCredentialTypeError();
            }
        }
    };
    /**
     * helper function to return `CredentialType`
     * @param key
     */
    CredentialEntity.getCredentialType = function (key) {
        // First keyword search will match all "AccessToken" and "AccessToken_With_AuthScheme" credentials
        if (key.indexOf(exports.CredentialType.ACCESS_TOKEN.toLowerCase()) !== -1) {
            // Perform second search to differentiate between "AccessToken" and "AccessToken_With_AuthScheme" credential types
            if (key.indexOf(exports.CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME.toLowerCase()) !== -1) {
                return exports.CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME;
            }
            return exports.CredentialType.ACCESS_TOKEN;
        }
        else if (key.indexOf(exports.CredentialType.ID_TOKEN.toLowerCase()) !== -1) {
            return exports.CredentialType.ID_TOKEN;
        }
        else if (key.indexOf(exports.CredentialType.REFRESH_TOKEN.toLowerCase()) !== -1) {
            return exports.CredentialType.REFRESH_TOKEN;
        }
        return Constants.NOT_DEFINED;
    };
    /**
     * generates credential key
     * <home_account_id*>-\<environment>-<credential_type>-<client_id>-<realm\*>-<target\*>-<scheme\*>
     */
    CredentialEntity.generateCredentialCacheKey = function (homeAccountId, environment, credentialType, clientId, realm, target, familyId, tokenType, requestedClaimsHash) {
        var credentialKey = [
            this.generateAccountIdForCacheKey(homeAccountId, environment),
            this.generateCredentialIdForCacheKey(credentialType, clientId, realm, familyId),
            this.generateTargetForCacheKey(target),
            this.generateClaimsHashForCacheKey(requestedClaimsHash),
            this.generateSchemeForCacheKey(tokenType)
        ];
        return credentialKey.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();
    };
    /**
     * generates Account Id for keys
     * @param homeAccountId
     * @param environment
     */
    CredentialEntity.generateAccountIdForCacheKey = function (homeAccountId, environment) {
        var accountId = [homeAccountId, environment];
        return accountId.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();
    };
    /**
     * Generates Credential Id for keys
     * @param credentialType
     * @param realm
     * @param clientId
     * @param familyId
     */
    CredentialEntity.generateCredentialIdForCacheKey = function (credentialType, clientId, realm, familyId) {
        var clientOrFamilyId = credentialType === exports.CredentialType.REFRESH_TOKEN
            ? familyId || clientId
            : clientId;
        var credentialId = [
            credentialType,
            clientOrFamilyId,
            realm || Constants.EMPTY_STRING,
        ];
        return credentialId.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();
    };
    /**
     * Generate target key component as per schema: <target>
     */
    CredentialEntity.generateTargetForCacheKey = function (scopes) {
        return (scopes || Constants.EMPTY_STRING).toLowerCase();
    };
    /**
     * Generate requested claims key component as per schema: <requestedClaims>
     */
    CredentialEntity.generateClaimsHashForCacheKey = function (requestedClaimsHash) {
        return (requestedClaimsHash || Constants.EMPTY_STRING).toLowerCase();
    };
    /**
     * Generate scheme key componenet as per schema: <scheme>
     */
    CredentialEntity.generateSchemeForCacheKey = function (tokenType) {
        /*
         * PoP Tokens and SSH certs include scheme in cache key
         * Cast to lowercase to handle "bearer" from ADFS
         */
        return (tokenType && tokenType.toLowerCase() !== exports.AuthenticationScheme.BEARER.toLowerCase()) ? tokenType.toLowerCase() : Constants.EMPTY_STRING;
    };
    return CredentialEntity;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * ClientConfigurationErrorMessage class containing string constants used by error codes and messages.
 */
var ClientConfigurationErrorMessage = {
    redirectUriNotSet: {
        code: "redirect_uri_empty",
        desc: "A redirect URI is required for all calls, and none has been set."
    },
    postLogoutUriNotSet: {
        code: "post_logout_uri_empty",
        desc: "A post logout redirect has not been set."
    },
    claimsRequestParsingError: {
        code: "claims_request_parsing_error",
        desc: "Could not parse the given claims request object."
    },
    authorityUriInsecure: {
        code: "authority_uri_insecure",
        desc: "Authority URIs must use https.  Please see here for valid authority configuration options: https://docs.microsoft.com/en-us/azure/active-directory/develop/msal-js-initializing-client-applications#configuration-options"
    },
    urlParseError: {
        code: "url_parse_error",
        desc: "URL could not be parsed into appropriate segments."
    },
    urlEmptyError: {
        code: "empty_url_error",
        desc: "URL was empty or null."
    },
    emptyScopesError: {
        code: "empty_input_scopes_error",
        desc: "Scopes cannot be passed as null, undefined or empty array because they are required to obtain an access token."
    },
    nonArrayScopesError: {
        code: "nonarray_input_scopes_error",
        desc: "Scopes cannot be passed as non-array."
    },
    clientIdSingleScopeError: {
        code: "clientid_input_scopes_error",
        desc: "Client ID can only be provided as a single scope."
    },
    invalidPrompt: {
        code: "invalid_prompt_value",
        desc: "Supported prompt values are 'login', 'select_account', 'consent', 'create' and 'none'.  Please see here for valid configuration options: https://azuread.github.io/microsoft-authentication-library-for-js/ref/modules/_azure_msal_common.html#commonauthorizationurlrequest",
    },
    invalidClaimsRequest: {
        code: "invalid_claims",
        desc: "Given claims parameter must be a stringified JSON object."
    },
    tokenRequestEmptyError: {
        code: "token_request_empty",
        desc: "Token request was empty and not found in cache."
    },
    logoutRequestEmptyError: {
        code: "logout_request_empty",
        desc: "The logout request was null or undefined."
    },
    invalidCodeChallengeMethod: {
        code: "invalid_code_challenge_method",
        desc: "code_challenge_method passed is invalid. Valid values are \"plain\" and \"S256\"."
    },
    invalidCodeChallengeParams: {
        code: "pkce_params_missing",
        desc: "Both params: code_challenge and code_challenge_method are to be passed if to be sent in the request"
    },
    invalidCloudDiscoveryMetadata: {
        code: "invalid_cloud_discovery_metadata",
        desc: "Invalid cloudDiscoveryMetadata provided. Must be a stringified JSON object containing tenant_discovery_endpoint and metadata fields"
    },
    invalidAuthorityMetadata: {
        code: "invalid_authority_metadata",
        desc: "Invalid authorityMetadata provided. Must by a stringified JSON object containing authorization_endpoint, token_endpoint, issuer fields."
    },
    untrustedAuthority: {
        code: "untrusted_authority",
        desc: "The provided authority is not a trusted authority. Please include this authority in the knownAuthorities config parameter."
    },
    invalidAzureCloudInstance: {
        code: "invalid_azure_cloud_instance",
        desc: "Invalid AzureCloudInstance provided. Please refer MSAL JS docs: aks.ms/msaljs/azure_cloud_instance for valid values"
    },
    missingSshJwk: {
        code: "missing_ssh_jwk",
        desc: "Missing sshJwk in SSH certificate request. A stringified JSON Web Key is required when using the SSH authentication scheme."
    },
    missingSshKid: {
        code: "missing_ssh_kid",
        desc: "Missing sshKid in SSH certificate request. A string that uniquely identifies the public SSH key is required when using the SSH authentication scheme."
    },
    missingNonceAuthenticationHeader: {
        code: "missing_nonce_authentication_header",
        desc: "Unable to find an authentication header containing server nonce. Either the Authentication-Info or WWW-Authenticate headers must be present in order to obtain a server nonce."
    },
    invalidAuthenticationHeader: {
        code: "invalid_authentication_header",
        desc: "Invalid authentication header provided"
    }
};
/**
 * Error thrown when there is an error in configuration of the MSAL.js library.
 */
var ClientConfigurationError = /** @class */ (function (_super) {
    __extends(ClientConfigurationError, _super);
    function ClientConfigurationError(errorCode, errorMessage) {
        var _this = _super.call(this, errorCode, errorMessage) || this;
        _this.name = "ClientConfigurationError";
        Object.setPrototypeOf(_this, ClientConfigurationError.prototype);
        return _this;
    }
    /**
     * Creates an error thrown when the redirect uri is empty (not set by caller)
     */
    ClientConfigurationError.createRedirectUriEmptyError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.redirectUriNotSet.code, ClientConfigurationErrorMessage.redirectUriNotSet.desc);
    };
    /**
     * Creates an error thrown when the post-logout redirect uri is empty (not set by caller)
     */
    ClientConfigurationError.createPostLogoutRedirectUriEmptyError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.postLogoutUriNotSet.code, ClientConfigurationErrorMessage.postLogoutUriNotSet.desc);
    };
    /**
     * Creates an error thrown when the claims request could not be successfully parsed
     */
    ClientConfigurationError.createClaimsRequestParsingError = function (claimsRequestParseError) {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.claimsRequestParsingError.code, ClientConfigurationErrorMessage.claimsRequestParsingError.desc + " Given value: " + claimsRequestParseError);
    };
    /**
     * Creates an error thrown if authority uri is given an insecure protocol.
     * @param urlString
     */
    ClientConfigurationError.createInsecureAuthorityUriError = function (urlString) {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.authorityUriInsecure.code, ClientConfigurationErrorMessage.authorityUriInsecure.desc + " Given URI: " + urlString);
    };
    /**
     * Creates an error thrown if URL string does not parse into separate segments.
     * @param urlString
     */
    ClientConfigurationError.createUrlParseError = function (urlParseError) {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.urlParseError.code, ClientConfigurationErrorMessage.urlParseError.desc + " Given Error: " + urlParseError);
    };
    /**
     * Creates an error thrown if URL string is empty or null.
     * @param urlString
     */
    ClientConfigurationError.createUrlEmptyError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.urlEmptyError.code, ClientConfigurationErrorMessage.urlEmptyError.desc);
    };
    /**
     * Error thrown when scopes are empty.
     * @param scopesValue
     */
    ClientConfigurationError.createEmptyScopesArrayError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.emptyScopesError.code, "" + ClientConfigurationErrorMessage.emptyScopesError.desc);
    };
    /**
     * Error thrown when client id scope is not provided as single scope.
     * @param inputScopes
     */
    ClientConfigurationError.createClientIdSingleScopeError = function (inputScopes) {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.clientIdSingleScopeError.code, ClientConfigurationErrorMessage.clientIdSingleScopeError.desc + " Given Scopes: " + inputScopes);
    };
    /**
     * Error thrown when prompt is not an allowed type.
     * @param promptValue
     */
    ClientConfigurationError.createInvalidPromptError = function (promptValue) {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidPrompt.code, ClientConfigurationErrorMessage.invalidPrompt.desc + " Given value: " + promptValue);
    };
    /**
     * Creates error thrown when claims parameter is not a stringified JSON object
     */
    ClientConfigurationError.createInvalidClaimsRequestError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidClaimsRequest.code, ClientConfigurationErrorMessage.invalidClaimsRequest.desc);
    };
    /**
     * Throws error when token request is empty and nothing cached in storage.
     */
    ClientConfigurationError.createEmptyLogoutRequestError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.logoutRequestEmptyError.code, ClientConfigurationErrorMessage.logoutRequestEmptyError.desc);
    };
    /**
     * Throws error when token request is empty and nothing cached in storage.
     */
    ClientConfigurationError.createEmptyTokenRequestError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.tokenRequestEmptyError.code, ClientConfigurationErrorMessage.tokenRequestEmptyError.desc);
    };
    /**
     * Throws error when an invalid code_challenge_method is passed by the user
     */
    ClientConfigurationError.createInvalidCodeChallengeMethodError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidCodeChallengeMethod.code, ClientConfigurationErrorMessage.invalidCodeChallengeMethod.desc);
    };
    /**
     * Throws error when both params: code_challenge and code_challenge_method are not passed together
     */
    ClientConfigurationError.createInvalidCodeChallengeParamsError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidCodeChallengeParams.code, ClientConfigurationErrorMessage.invalidCodeChallengeParams.desc);
    };
    /**
     * Throws an error when the user passes invalid cloudDiscoveryMetadata
     */
    ClientConfigurationError.createInvalidCloudDiscoveryMetadataError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidCloudDiscoveryMetadata.code, ClientConfigurationErrorMessage.invalidCloudDiscoveryMetadata.desc);
    };
    /**
     * Throws an error when the user passes invalid cloudDiscoveryMetadata
     */
    ClientConfigurationError.createInvalidAuthorityMetadataError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidAuthorityMetadata.code, ClientConfigurationErrorMessage.invalidAuthorityMetadata.desc);
    };
    /**
     * Throws error when provided authority is not a member of the trusted host list
     */
    ClientConfigurationError.createUntrustedAuthorityError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.untrustedAuthority.code, ClientConfigurationErrorMessage.untrustedAuthority.desc);
    };
    /**
     * Throws error when the AzureCloudInstance is set to an invalid value
     */
    ClientConfigurationError.createInvalidAzureCloudInstanceError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidAzureCloudInstance.code, ClientConfigurationErrorMessage.invalidAzureCloudInstance.desc);
    };
    /**
     * Throws an error when the authentication scheme is set to SSH but the SSH public key is omitted from the request
     */
    ClientConfigurationError.createMissingSshJwkError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.missingSshJwk.code, ClientConfigurationErrorMessage.missingSshJwk.desc);
    };
    /**
     * Throws an error when the authentication scheme is set to SSH but the SSH public key ID is omitted from the request
     */
    ClientConfigurationError.createMissingSshKidError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.missingSshKid.code, ClientConfigurationErrorMessage.missingSshKid.desc);
    };
    /**
     * Throws error when provided headers don't contain a header that a server nonce can be extracted from
     */
    ClientConfigurationError.createMissingNonceAuthenticationHeadersError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.missingNonceAuthenticationHeader.code, ClientConfigurationErrorMessage.missingNonceAuthenticationHeader.desc);
    };
    /**
     * Throws error when a provided header is invalid in any way
     */
    ClientConfigurationError.createInvalidAuthenticationHeaderError = function (invalidHeaderName, details) {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidAuthenticationHeader.code, ClientConfigurationErrorMessage.invalidAuthenticationHeader.desc + ". Invalid header: " + invalidHeaderName + ". Details: " + details);
    };
    return ClientConfigurationError;
}(ClientAuthError));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * The ScopeSet class creates a set of scopes. Scopes are case-insensitive, unique values, so the Set object in JS makes
 * the most sense to implement for this class. All scopes are trimmed and converted to lower case strings in intersection and union functions
 * to ensure uniqueness of strings.
 */
var ScopeSet = /** @class */ (function () {
    function ScopeSet(inputScopes) {
        var _this = this;
        // Filter empty string and null/undefined array items
        var scopeArr = inputScopes ? StringUtils.trimArrayEntries(__spreadArrays(inputScopes)) : [];
        var filteredInput = scopeArr ? StringUtils.removeEmptyStringsFromArray(scopeArr) : [];
        // Validate and filter scopes (validate function throws if validation fails)
        this.validateInputScopes(filteredInput);
        this.scopes = new Set(); // Iterator in constructor not supported by IE11
        filteredInput.forEach(function (scope) { return _this.scopes.add(scope); });
    }
    /**
     * Factory method to create ScopeSet from space-delimited string
     * @param inputScopeString
     * @param appClientId
     * @param scopesRequired
     */
    ScopeSet.fromString = function (inputScopeString) {
        var scopeString = inputScopeString || Constants.EMPTY_STRING;
        var inputScopes = scopeString.split(" ");
        return new ScopeSet(inputScopes);
    };
    /**
     * Used to validate the scopes input parameter requested  by the developer.
     * @param {Array<string>} inputScopes - Developer requested permissions. Not all scopes are guaranteed to be included in the access token returned.
     * @param {boolean} scopesRequired - Boolean indicating whether the scopes array is required or not
     */
    ScopeSet.prototype.validateInputScopes = function (inputScopes) {
        // Check if scopes are required but not given or is an empty array
        if (!inputScopes || inputScopes.length < 1) {
            throw ClientConfigurationError.createEmptyScopesArrayError();
        }
    };
    /**
     * Check if a given scope is present in this set of scopes.
     * @param scope
     */
    ScopeSet.prototype.containsScope = function (scope) {
        var lowerCaseScopes = this.printScopesLowerCase().split(" ");
        var lowerCaseScopesSet = new ScopeSet(lowerCaseScopes);
        // compare lowercase scopes
        return !StringUtils.isEmpty(scope) ? lowerCaseScopesSet.scopes.has(scope.toLowerCase()) : false;
    };
    /**
     * Check if a set of scopes is present in this set of scopes.
     * @param scopeSet
     */
    ScopeSet.prototype.containsScopeSet = function (scopeSet) {
        var _this = this;
        if (!scopeSet || scopeSet.scopes.size <= 0) {
            return false;
        }
        return (this.scopes.size >= scopeSet.scopes.size && scopeSet.asArray().every(function (scope) { return _this.containsScope(scope); }));
    };
    /**
     * Check if set of scopes contains only the defaults
     */
    ScopeSet.prototype.containsOnlyOIDCScopes = function () {
        var _this = this;
        var defaultScopeCount = 0;
        OIDC_SCOPES.forEach(function (defaultScope) {
            if (_this.containsScope(defaultScope)) {
                defaultScopeCount += 1;
            }
        });
        return this.scopes.size === defaultScopeCount;
    };
    /**
     * Appends single scope if passed
     * @param newScope
     */
    ScopeSet.prototype.appendScope = function (newScope) {
        if (!StringUtils.isEmpty(newScope)) {
            this.scopes.add(newScope.trim());
        }
    };
    /**
     * Appends multiple scopes if passed
     * @param newScopes
     */
    ScopeSet.prototype.appendScopes = function (newScopes) {
        var _this = this;
        try {
            newScopes.forEach(function (newScope) { return _this.appendScope(newScope); });
        }
        catch (e) {
            throw ClientAuthError.createAppendScopeSetError(e);
        }
    };
    /**
     * Removes element from set of scopes.
     * @param scope
     */
    ScopeSet.prototype.removeScope = function (scope) {
        if (StringUtils.isEmpty(scope)) {
            throw ClientAuthError.createRemoveEmptyScopeFromSetError(scope);
        }
        this.scopes.delete(scope.trim());
    };
    /**
     * Removes default scopes from set of scopes
     * Primarily used to prevent cache misses if the default scopes are not returned from the server
     */
    ScopeSet.prototype.removeOIDCScopes = function () {
        var _this = this;
        OIDC_SCOPES.forEach(function (defaultScope) {
            _this.scopes.delete(defaultScope);
        });
    };
    /**
     * Combines an array of scopes with the current set of scopes.
     * @param otherScopes
     */
    ScopeSet.prototype.unionScopeSets = function (otherScopes) {
        if (!otherScopes) {
            throw ClientAuthError.createEmptyInputScopeSetError();
        }
        var unionScopes = new Set(); // Iterator in constructor not supported in IE11
        otherScopes.scopes.forEach(function (scope) { return unionScopes.add(scope.toLowerCase()); });
        this.scopes.forEach(function (scope) { return unionScopes.add(scope.toLowerCase()); });
        return unionScopes;
    };
    /**
     * Check if scopes intersect between this set and another.
     * @param otherScopes
     */
    ScopeSet.prototype.intersectingScopeSets = function (otherScopes) {
        if (!otherScopes) {
            throw ClientAuthError.createEmptyInputScopeSetError();
        }
        // Do not allow OIDC scopes to be the only intersecting scopes
        if (!otherScopes.containsOnlyOIDCScopes()) {
            otherScopes.removeOIDCScopes();
        }
        var unionScopes = this.unionScopeSets(otherScopes);
        var sizeOtherScopes = otherScopes.getScopeCount();
        var sizeThisScopes = this.getScopeCount();
        var sizeUnionScopes = unionScopes.size;
        return sizeUnionScopes < (sizeThisScopes + sizeOtherScopes);
    };
    /**
     * Returns size of set of scopes.
     */
    ScopeSet.prototype.getScopeCount = function () {
        return this.scopes.size;
    };
    /**
     * Returns the scopes as an array of string values
     */
    ScopeSet.prototype.asArray = function () {
        var array = [];
        this.scopes.forEach(function (val) { return array.push(val); });
        return array;
    };
    /**
     * Prints scopes into a space-delimited string
     */
    ScopeSet.prototype.printScopes = function () {
        if (this.scopes) {
            var scopeArr = this.asArray();
            return scopeArr.join(" ");
        }
        return Constants.EMPTY_STRING;
    };
    /**
     * Prints scopes into a space-delimited lower-case string (used for caching)
     */
    ScopeSet.prototype.printScopesLowerCase = function () {
        return this.printScopes().toLowerCase();
    };
    return ScopeSet;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Function to build a client info object from server clientInfo string
 * @param rawClientInfo
 * @param crypto
 */
function buildClientInfo(rawClientInfo, crypto) {
    if (StringUtils.isEmpty(rawClientInfo)) {
        throw ClientAuthError.createClientInfoEmptyError();
    }
    try {
        var decodedClientInfo = crypto.base64Decode(rawClientInfo);
        return JSON.parse(decodedClientInfo);
    }
    catch (e) {
        throw ClientAuthError.createClientInfoDecodingError(e);
    }
}
/**
 * Function to build a client info object from cached homeAccountId string
 * @param homeAccountId
 */
function buildClientInfoFromHomeAccountId(homeAccountId) {
    if (StringUtils.isEmpty(homeAccountId)) {
        throw ClientAuthError.createClientInfoDecodingError("Home account ID was empty.");
    }
    var clientInfoParts = homeAccountId.split(Separators.CLIENT_INFO_SEPARATOR, 2);
    return {
        uid: clientInfoParts[0],
        utid: clientInfoParts.length < 2 ? Constants.EMPTY_STRING : clientInfoParts[1]
    };
}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Authority types supported by MSAL.
 */
exports.AuthorityType = void 0;
(function (AuthorityType) {
    AuthorityType[AuthorityType["Default"] = 0] = "Default";
    AuthorityType[AuthorityType["Adfs"] = 1] = "Adfs";
})(exports.AuthorityType || (exports.AuthorityType = {}));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Type that defines required and optional parameters for an Account field (based on universal cache schema implemented by all MSALs).
 *
 * Key : Value Schema
 *
 * Key: <home_account_id>-<environment>-<realm*>
 *
 * Value Schema:
 * {
 *      homeAccountId: home account identifier for the auth scheme,
 *      environment: entity that issued the token, represented as a full host
 *      realm: Full tenant or organizational identifier that the account belongs to
 *      localAccountId: Original tenant-specific accountID, usually used for legacy cases
 *      username: primary username that represents the user, usually corresponds to preferred_username in the v2 endpt
 *      authorityType: Accounts authority type as a string
 *      name: Full name for the account, including given name and family name,
 *      clientInfo: Full base64 encoded client info received from ESTS
 *      lastModificationTime: last time this entity was modified in the cache
 *      lastModificationApp:
 *      idTokenClaims: Object containing claims parsed from ID token
 *      nativeAccountId: Account identifier on the native device
 * }
 */
var AccountEntity = /** @class */ (function () {
    function AccountEntity() {
    }
    /**
     * Generate Account Id key component as per the schema: <home_account_id>-<environment>
     */
    AccountEntity.prototype.generateAccountId = function () {
        var accountId = [this.homeAccountId, this.environment];
        return accountId.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();
    };
    /**
     * Generate Account Cache Key as per the schema: <home_account_id>-<environment>-<realm*>
     */
    AccountEntity.prototype.generateAccountKey = function () {
        return AccountEntity.generateAccountCacheKey({
            homeAccountId: this.homeAccountId,
            environment: this.environment,
            tenantId: this.realm,
            username: this.username,
            localAccountId: this.localAccountId
        });
    };
    /**
     * returns the type of the cache (in this case account)
     */
    AccountEntity.prototype.generateType = function () {
        switch (this.authorityType) {
            case exports.CacheAccountType.ADFS_ACCOUNT_TYPE:
                return exports.CacheType.ADFS;
            case exports.CacheAccountType.MSAV1_ACCOUNT_TYPE:
                return exports.CacheType.MSA;
            case exports.CacheAccountType.MSSTS_ACCOUNT_TYPE:
                return exports.CacheType.MSSTS;
            case exports.CacheAccountType.GENERIC_ACCOUNT_TYPE:
                return exports.CacheType.GENERIC;
            default: {
                throw ClientAuthError.createUnexpectedAccountTypeError();
            }
        }
    };
    /**
     * Returns the AccountInfo interface for this account.
     */
    AccountEntity.prototype.getAccountInfo = function () {
        return {
            homeAccountId: this.homeAccountId,
            environment: this.environment,
            tenantId: this.realm,
            username: this.username,
            localAccountId: this.localAccountId,
            name: this.name,
            idTokenClaims: this.idTokenClaims,
            nativeAccountId: this.nativeAccountId
        };
    };
    /**
     * Generates account key from interface
     * @param accountInterface
     */
    AccountEntity.generateAccountCacheKey = function (accountInterface) {
        var accountKey = [
            accountInterface.homeAccountId,
            accountInterface.environment || Constants.EMPTY_STRING,
            accountInterface.tenantId || Constants.EMPTY_STRING,
        ];
        return accountKey.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();
    };
    /**
     * Build Account cache from IdToken, clientInfo and authority/policy. Associated with AAD.
     * @param clientInfo
     * @param authority
     * @param idToken
     * @param policy
     */
    AccountEntity.createAccount = function (clientInfo, homeAccountId, idToken, authority, cloudGraphHostName, msGraphHost, environment, nativeAccountId) {
        var _a, _b, _c, _d, _e, _f;
        var account = new AccountEntity();
        account.authorityType = exports.CacheAccountType.MSSTS_ACCOUNT_TYPE;
        account.clientInfo = clientInfo;
        account.homeAccountId = homeAccountId;
        account.nativeAccountId = nativeAccountId;
        var env = environment || (authority && authority.getPreferredCache());
        if (!env) {
            throw ClientAuthError.createInvalidCacheEnvironmentError();
        }
        account.environment = env;
        // non AAD scenarios can have empty realm
        account.realm = ((_a = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _a === void 0 ? void 0 : _a.tid) || Constants.EMPTY_STRING;
        if (idToken) {
            account.idTokenClaims = idToken.claims;
            // How do you account for MSA CID here?
            account.localAccountId = ((_b = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _b === void 0 ? void 0 : _b.oid) || ((_c = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _c === void 0 ? void 0 : _c.sub) || Constants.EMPTY_STRING;
            /*
             * In B2C scenarios the emails claim is used instead of preferred_username and it is an array. In most cases it will contain a single email.
             * This field should not be relied upon if a custom policy is configured to return more than 1 email.
             */
            account.username = ((_d = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _d === void 0 ? void 0 : _d.preferred_username) || (((_e = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _e === void 0 ? void 0 : _e.emails) ? idToken.claims.emails[0] : Constants.EMPTY_STRING);
            account.name = (_f = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _f === void 0 ? void 0 : _f.name;
        }
        account.cloudGraphHostName = cloudGraphHostName;
        account.msGraphHost = msGraphHost;
        return account;
    };
    /**
     * Builds non-AAD/ADFS account.
     * @param authority
     * @param idToken
     */
    AccountEntity.createGenericAccount = function (homeAccountId, idToken, authority, cloudGraphHostName, msGraphHost, environment) {
        var _a, _b, _c, _d;
        var account = new AccountEntity();
        account.authorityType = (authority && authority.authorityType === exports.AuthorityType.Adfs) ? exports.CacheAccountType.ADFS_ACCOUNT_TYPE : exports.CacheAccountType.GENERIC_ACCOUNT_TYPE;
        account.homeAccountId = homeAccountId;
        // non AAD scenarios can have empty realm
        account.realm = Constants.EMPTY_STRING;
        var env = environment || authority && authority.getPreferredCache();
        if (!env) {
            throw ClientAuthError.createInvalidCacheEnvironmentError();
        }
        if (idToken) {
            // How do you account for MSA CID here?
            account.localAccountId = ((_a = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _a === void 0 ? void 0 : _a.oid) || ((_b = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _b === void 0 ? void 0 : _b.sub) || Constants.EMPTY_STRING;
            // upn claim for most ADFS scenarios
            account.username = ((_c = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _c === void 0 ? void 0 : _c.upn) || Constants.EMPTY_STRING;
            account.name = ((_d = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _d === void 0 ? void 0 : _d.name) || Constants.EMPTY_STRING;
            account.idTokenClaims = idToken === null || idToken === void 0 ? void 0 : idToken.claims;
        }
        account.environment = env;
        account.cloudGraphHostName = cloudGraphHostName;
        account.msGraphHost = msGraphHost;
        /*
         * add uniqueName to claims
         * account.name = idToken.claims.uniqueName;
         */
        return account;
    };
    /**
     * Generate HomeAccountId from server response
     * @param serverClientInfo
     * @param authType
     */
    AccountEntity.generateHomeAccountId = function (serverClientInfo, authType, logger, cryptoObj, idToken) {
        var _a;
        var accountId = ((_a = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _a === void 0 ? void 0 : _a.sub) ? idToken.claims.sub : Constants.EMPTY_STRING;
        // since ADFS does not have tid and does not set client_info
        if (authType === exports.AuthorityType.Adfs) {
            return accountId;
        }
        // for cases where there is clientInfo
        if (serverClientInfo) {
            try {
                var clientInfo = buildClientInfo(serverClientInfo, cryptoObj);
                if (!StringUtils.isEmpty(clientInfo.uid) && !StringUtils.isEmpty(clientInfo.utid)) {
                    return "" + clientInfo.uid + Separators.CLIENT_INFO_SEPARATOR + clientInfo.utid;
                }
            }
            catch (e) { }
        }
        // default to "sub" claim
        logger.verbose("No client info in response");
        return accountId;
    };
    /**
     * Validates an entity: checks for all expected params
     * @param entity
     */
    AccountEntity.isAccountEntity = function (entity) {
        if (!entity) {
            return false;
        }
        return (entity.hasOwnProperty("homeAccountId") &&
            entity.hasOwnProperty("environment") &&
            entity.hasOwnProperty("realm") &&
            entity.hasOwnProperty("localAccountId") &&
            entity.hasOwnProperty("username") &&
            entity.hasOwnProperty("authorityType"));
    };
    /**
     * Helper function to determine whether 2 accountInfo objects represent the same account
     * @param accountA
     * @param accountB
     * @param compareClaims - If set to true idTokenClaims will also be compared to determine account equality
     */
    AccountEntity.accountInfoIsEqual = function (accountA, accountB, compareClaims) {
        if (!accountA || !accountB) {
            return false;
        }
        var claimsMatch = true; // default to true so as to not fail comparison below if compareClaims: false
        if (compareClaims) {
            var accountAClaims = (accountA.idTokenClaims || {});
            var accountBClaims = (accountB.idTokenClaims || {});
            // issued at timestamp and nonce are expected to change each time a new id token is acquired
            claimsMatch = (accountAClaims.iat === accountBClaims.iat) &&
                (accountAClaims.nonce === accountBClaims.nonce);
        }
        return (accountA.homeAccountId === accountB.homeAccountId) &&
            (accountA.localAccountId === accountB.localAccountId) &&
            (accountA.username === accountB.username) &&
            (accountA.tenantId === accountB.tenantId) &&
            (accountA.environment === accountB.environment) &&
            (accountA.nativeAccountId === accountB.nativeAccountId) &&
            claimsMatch;
    };
    return AccountEntity;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * JWT Token representation class. Parses token string and generates claims object.
 */
var AuthToken = /** @class */ (function () {
    function AuthToken(rawToken, crypto) {
        if (StringUtils.isEmpty(rawToken)) {
            throw ClientAuthError.createTokenNullOrEmptyError(rawToken);
        }
        this.rawToken = rawToken;
        this.claims = AuthToken.extractTokenClaims(rawToken, crypto);
    }
    /**
     * Extract token by decoding the rawToken
     *
     * @param encodedToken
     */
    AuthToken.extractTokenClaims = function (encodedToken, crypto) {
        var decodedToken = StringUtils.decodeAuthToken(encodedToken);
        // token will be decoded to get the username
        try {
            var base64TokenPayload = decodedToken.JWSPayload;
            // base64Decode() should throw an error if there is an issue
            var base64Decoded = crypto.base64Decode(base64TokenPayload);
            return JSON.parse(base64Decoded);
        }
        catch (err) {
            throw ClientAuthError.createTokenParsingError(err);
        }
    };
    return AuthToken;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Interface class which implement cache storage functions used by MSAL to perform validity checks, and store tokens.
 */
var CacheManager = /** @class */ (function () {
    function CacheManager(clientId, cryptoImpl) {
        this.clientId = clientId;
        this.cryptoImpl = cryptoImpl;
    }
    /**
     * Returns all accounts in cache
     */
    CacheManager.prototype.getAllAccounts = function () {
        var _this = this;
        var currentAccounts = this.getAccountsFilteredBy();
        var accountValues = Object.keys(currentAccounts).map(function (accountKey) { return currentAccounts[accountKey]; });
        var numAccounts = accountValues.length;
        if (numAccounts < 1) {
            return [];
        }
        else {
            var allAccounts = accountValues.map(function (value) {
                var accountEntity = CacheManager.toObject(new AccountEntity(), value);
                var accountInfo = accountEntity.getAccountInfo();
                var idToken = _this.readIdTokenFromCache(_this.clientId, accountInfo);
                if (idToken && !accountInfo.idTokenClaims) {
                    accountInfo.idTokenClaims = new AuthToken(idToken.secret, _this.cryptoImpl).claims;
                }
                return accountInfo;
            });
            return allAccounts;
        }
    };
    /**
     * saves a cache record
     * @param cacheRecord
     */
    CacheManager.prototype.saveCacheRecord = function (cacheRecord) {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        if (!cacheRecord) {
                            throw ClientAuthError.createNullOrUndefinedCacheRecord();
                        }
                        if (!!cacheRecord.account) {
                            this.setAccount(cacheRecord.account);
                        }
                        if (!!cacheRecord.idToken) {
                            this.setIdTokenCredential(cacheRecord.idToken);
                        }
                        if (!!!cacheRecord.accessToken) return [3 /*break*/, 2];
                        return [4 /*yield*/, this.saveAccessToken(cacheRecord.accessToken)];
                    case 1:
                        _a.sent();
                        _a.label = 2;
                    case 2:
                        if (!!cacheRecord.refreshToken) {
                            this.setRefreshTokenCredential(cacheRecord.refreshToken);
                        }
                        if (!!cacheRecord.appMetadata) {
                            this.setAppMetadata(cacheRecord.appMetadata);
                        }
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * saves access token credential
     * @param credential
     */
    CacheManager.prototype.saveAccessToken = function (credential) {
        return __awaiter(this, void 0, void 0, function () {
            var currentTokenCache, currentScopes, currentAccessTokens, removedAccessTokens_1;
            var _this = this;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        currentTokenCache = this.getCredentialsFilteredBy({
                            clientId: credential.clientId,
                            credentialType: credential.credentialType,
                            environment: credential.environment,
                            homeAccountId: credential.homeAccountId,
                            realm: credential.realm,
                            tokenType: credential.tokenType,
                            requestedClaimsHash: credential.requestedClaimsHash
                        });
                        currentScopes = ScopeSet.fromString(credential.target);
                        currentAccessTokens = Object.keys(currentTokenCache.accessTokens).map(function (key) { return currentTokenCache.accessTokens[key]; });
                        if (!currentAccessTokens) return [3 /*break*/, 2];
                        removedAccessTokens_1 = [];
                        currentAccessTokens.forEach(function (tokenEntity) {
                            var tokenScopeSet = ScopeSet.fromString(tokenEntity.target);
                            if (tokenScopeSet.intersectingScopeSets(currentScopes)) {
                                removedAccessTokens_1.push(_this.removeCredential(tokenEntity));
                            }
                        });
                        return [4 /*yield*/, Promise.all(removedAccessTokens_1)];
                    case 1:
                        _a.sent();
                        _a.label = 2;
                    case 2:
                        this.setAccessTokenCredential(credential);
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * retrieve accounts matching all provided filters; if no filter is set, get all accounts
     * not checking for casing as keys are all generated in lower case, remember to convert to lower case if object properties are compared
     * @param homeAccountId
     * @param environment
     * @param realm
     */
    CacheManager.prototype.getAccountsFilteredBy = function (accountFilter) {
        return this.getAccountsFilteredByInternal(accountFilter ? accountFilter.homeAccountId : Constants.EMPTY_STRING, accountFilter ? accountFilter.environment : Constants.EMPTY_STRING, accountFilter ? accountFilter.realm : Constants.EMPTY_STRING, accountFilter ? accountFilter.nativeAccountId : Constants.EMPTY_STRING);
    };
    /**
     * retrieve accounts matching all provided filters; if no filter is set, get all accounts
     * not checking for casing as keys are all generated in lower case, remember to convert to lower case if object properties are compared
     * @param homeAccountId
     * @param environment
     * @param realm
     */
    CacheManager.prototype.getAccountsFilteredByInternal = function (homeAccountId, environment, realm, nativeAccountId) {
        var _this = this;
        var allCacheKeys = this.getKeys();
        var matchingAccounts = {};
        allCacheKeys.forEach(function (cacheKey) {
            var entity = _this.getAccount(cacheKey);
            if (!entity) {
                return;
            }
            if (!!homeAccountId && !_this.matchHomeAccountId(entity, homeAccountId)) {
                return;
            }
            if (!!environment && !_this.matchEnvironment(entity, environment)) {
                return;
            }
            if (!!realm && !_this.matchRealm(entity, realm)) {
                return;
            }
            if (!!nativeAccountId && !_this.matchNativeAccountId(entity, nativeAccountId)) {
                return;
            }
            matchingAccounts[cacheKey] = entity;
        });
        return matchingAccounts;
    };
    /**
     * retrieve credentails matching all provided filters; if no filter is set, get all credentials
     * @param homeAccountId
     * @param environment
     * @param credentialType
     * @param clientId
     * @param realm
     * @param target
     */
    CacheManager.prototype.getCredentialsFilteredBy = function (filter) {
        return this.getCredentialsFilteredByInternal(filter.homeAccountId, filter.environment, filter.credentialType, filter.clientId, filter.familyId, filter.realm, filter.target, filter.userAssertionHash, filter.tokenType, filter.keyId, filter.requestedClaimsHash);
    };
    /**
     * Support function to help match credentials
     * @param homeAccountId
     * @param environment
     * @param credentialType
     * @param clientId
     * @param realm
     * @param target
     * @param userAssertionHash
     * @param tokenType
     */
    CacheManager.prototype.getCredentialsFilteredByInternal = function (homeAccountId, environment, credentialType, clientId, familyId, realm, target, userAssertionHash, tokenType, keyId, requestedClaimsHash) {
        var _this = this;
        var allCacheKeys = this.getKeys();
        var matchingCredentials = {
            idTokens: {},
            accessTokens: {},
            refreshTokens: {},
        };
        allCacheKeys.forEach(function (cacheKey) {
            // don't parse any non-credential type cache entities
            var credType = CredentialEntity.getCredentialType(cacheKey);
            if (credType === Constants.NOT_DEFINED) {
                return;
            }
            // Attempt retrieval
            var entity = _this.getSpecificCredential(cacheKey, credType);
            if (!entity) {
                return;
            }
            if (!!userAssertionHash && !_this.matchUserAssertionHash(entity, userAssertionHash)) {
                return;
            }
            if (!!homeAccountId && !_this.matchHomeAccountId(entity, homeAccountId)) {
                return;
            }
            if (!!environment && !_this.matchEnvironment(entity, environment)) {
                return;
            }
            if (!!realm && !_this.matchRealm(entity, realm)) {
                return;
            }
            if (!!credentialType && !_this.matchCredentialType(entity, credentialType)) {
                return;
            }
            if (!!clientId && !_this.matchClientId(entity, clientId)) {
                return;
            }
            if (!!familyId && !_this.matchFamilyId(entity, familyId)) {
                return;
            }
            /*
             * idTokens do not have "target", target specific refreshTokens do exist for some types of authentication
             * Resource specific refresh tokens case will be added when the support is deemed necessary
             */
            if (!!target && !_this.matchTarget(entity, target)) {
                return;
            }
            // If request OR cached entity has requested Claims Hash, check if they match
            if (requestedClaimsHash || entity.requestedClaimsHash) {
                // Don't match if either is undefined or they are different
                if (entity.requestedClaimsHash !== requestedClaimsHash) {
                    return;
                }
            }
            // Access Token with Auth Scheme specific matching
            if (credentialType === exports.CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME) {
                if (!!tokenType && !_this.matchTokenType(entity, tokenType)) {
                    return;
                }
                // KeyId (sshKid) in request must match cached SSH certificate keyId because SSH cert is bound to a specific key
                if (tokenType === exports.AuthenticationScheme.SSH) {
                    if (keyId && !_this.matchKeyId(entity, keyId)) {
                        return;
                    }
                }
            }
            // At this point, the entity matches the request, update cache key if key schema has changed
            var updatedCacheKey = _this.updateCredentialCacheKey(cacheKey, entity);
            switch (credType) {
                case exports.CredentialType.ID_TOKEN:
                    matchingCredentials.idTokens[updatedCacheKey] = entity;
                    break;
                case exports.CredentialType.ACCESS_TOKEN:
                case exports.CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME:
                    matchingCredentials.accessTokens[updatedCacheKey] = entity;
                    break;
                case exports.CredentialType.REFRESH_TOKEN:
                    matchingCredentials.refreshTokens[updatedCacheKey] = entity;
                    break;
            }
        });
        return matchingCredentials;
    };
    /**
     * retrieve appMetadata matching all provided filters; if no filter is set, get all appMetadata
     * @param filter
     */
    CacheManager.prototype.getAppMetadataFilteredBy = function (filter) {
        return this.getAppMetadataFilteredByInternal(filter.environment, filter.clientId);
    };
    /**
     * Support function to help match appMetadata
     * @param environment
     * @param clientId
     */
    CacheManager.prototype.getAppMetadataFilteredByInternal = function (environment, clientId) {
        var _this = this;
        var allCacheKeys = this.getKeys();
        var matchingAppMetadata = {};
        allCacheKeys.forEach(function (cacheKey) {
            // don't parse any non-appMetadata type cache entities
            if (!_this.isAppMetadata(cacheKey)) {
                return;
            }
            // Attempt retrieval
            var entity = _this.getAppMetadata(cacheKey);
            if (!entity) {
                return;
            }
            if (!!environment && !_this.matchEnvironment(entity, environment)) {
                return;
            }
            if (!!clientId && !_this.matchClientId(entity, clientId)) {
                return;
            }
            matchingAppMetadata[cacheKey] = entity;
        });
        return matchingAppMetadata;
    };
    /**
     * retrieve authorityMetadata that contains a matching alias
     * @param filter
     */
    CacheManager.prototype.getAuthorityMetadataByAlias = function (host) {
        var _this = this;
        var allCacheKeys = this.getAuthorityMetadataKeys();
        var matchedEntity = null;
        allCacheKeys.forEach(function (cacheKey) {
            // don't parse any non-authorityMetadata type cache entities
            if (!_this.isAuthorityMetadata(cacheKey) || cacheKey.indexOf(_this.clientId) === -1) {
                return;
            }
            // Attempt retrieval
            var entity = _this.getAuthorityMetadata(cacheKey);
            if (!entity) {
                return;
            }
            if (entity.aliases.indexOf(host) === -1) {
                return;
            }
            matchedEntity = entity;
        });
        return matchedEntity;
    };
    /**
     * Removes all accounts and related tokens from cache.
     */
    CacheManager.prototype.removeAllAccounts = function () {
        return __awaiter(this, void 0, void 0, function () {
            var allCacheKeys, removedAccounts;
            var _this = this;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        allCacheKeys = this.getKeys();
                        removedAccounts = [];
                        allCacheKeys.forEach(function (cacheKey) {
                            var entity = _this.getAccount(cacheKey);
                            if (!entity) {
                                return;
                            }
                            removedAccounts.push(_this.removeAccount(cacheKey));
                        });
                        return [4 /*yield*/, Promise.all(removedAccounts)];
                    case 1:
                        _a.sent();
                        return [2 /*return*/, true];
                }
            });
        });
    };
    /**
     * returns a boolean if the given account is removed
     * @param account
     */
    CacheManager.prototype.removeAccount = function (accountKey) {
        return __awaiter(this, void 0, void 0, function () {
            var account;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        account = this.getAccount(accountKey);
                        if (!account) {
                            throw ClientAuthError.createNoAccountFoundError();
                        }
                        return [4 /*yield*/, this.removeAccountContext(account)];
                    case 1: return [2 /*return*/, ((_a.sent()) && this.removeItem(accountKey, exports.CacheSchemaType.ACCOUNT))];
                }
            });
        });
    };
    /**
     * Removes credentials associated with the provided account
     * @param account
     */
    CacheManager.prototype.removeAccountContext = function (account) {
        return __awaiter(this, void 0, void 0, function () {
            var allCacheKeys, accountId, removedCredentials;
            var _this = this;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        allCacheKeys = this.getKeys();
                        accountId = account.generateAccountId();
                        removedCredentials = [];
                        allCacheKeys.forEach(function (cacheKey) {
                            // don't parse any non-credential type cache entities
                            var credType = CredentialEntity.getCredentialType(cacheKey);
                            if (credType === Constants.NOT_DEFINED) {
                                return;
                            }
                            var cacheEntity = _this.getSpecificCredential(cacheKey, credType);
                            if (!!cacheEntity && accountId === cacheEntity.generateAccountId()) {
                                removedCredentials.push(_this.removeCredential(cacheEntity));
                            }
                        });
                        return [4 /*yield*/, Promise.all(removedCredentials)];
                    case 1:
                        _a.sent();
                        return [2 /*return*/, true];
                }
            });
        });
    };
    /**
     * returns a boolean if the given credential is removed
     * @param credential
     */
    CacheManager.prototype.removeCredential = function (credential) {
        return __awaiter(this, void 0, void 0, function () {
            var key, accessTokenWithAuthSchemeEntity, kid;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        key = credential.generateCredentialKey();
                        if (!(credential.credentialType.toLowerCase() === exports.CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME.toLowerCase())) return [3 /*break*/, 4];
                        if (!(credential.tokenType === exports.AuthenticationScheme.POP)) return [3 /*break*/, 4];
                        accessTokenWithAuthSchemeEntity = credential;
                        kid = accessTokenWithAuthSchemeEntity.keyId;
                        if (!kid) return [3 /*break*/, 4];
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        return [4 /*yield*/, this.cryptoImpl.removeTokenBindingKey(kid)];
                    case 2:
                        _a.sent();
                        return [3 /*break*/, 4];
                    case 3:
                        _a.sent();
                        throw ClientAuthError.createBindingKeyNotRemovedError();
                    case 4: return [2 /*return*/, this.removeItem(key, exports.CacheSchemaType.CREDENTIAL)];
                }
            });
        });
    };
    /**
     * Removes all app metadata objects from cache.
     */
    CacheManager.prototype.removeAppMetadata = function () {
        var _this = this;
        var allCacheKeys = this.getKeys();
        allCacheKeys.forEach(function (cacheKey) {
            if (_this.isAppMetadata(cacheKey)) {
                _this.removeItem(cacheKey, exports.CacheSchemaType.APP_METADATA);
            }
        });
        return true;
    };
    /**
     * Retrieve the cached credentials into a cacherecord
     * @param account
     * @param clientId
     * @param scopes
     * @param environment
     * @param authScheme
     */
    CacheManager.prototype.readCacheRecord = function (account, clientId, request, environment) {
        var cachedAccount = this.readAccountFromCache(account);
        var cachedIdToken = this.readIdTokenFromCache(clientId, account);
        var cachedAccessToken = this.readAccessTokenFromCache(clientId, account, request);
        var cachedRefreshToken = this.readRefreshTokenFromCache(clientId, account, false);
        var cachedAppMetadata = this.readAppMetadataFromCache(environment, clientId);
        if (cachedAccount && cachedIdToken) {
            cachedAccount.idTokenClaims = new AuthToken(cachedIdToken.secret, this.cryptoImpl).claims;
        }
        return {
            account: cachedAccount,
            idToken: cachedIdToken,
            accessToken: cachedAccessToken,
            refreshToken: cachedRefreshToken,
            appMetadata: cachedAppMetadata,
        };
    };
    /**
     * Retrieve AccountEntity from cache
     * @param account
     */
    CacheManager.prototype.readAccountFromCache = function (account) {
        var accountKey = AccountEntity.generateAccountCacheKey(account);
        return this.getAccount(accountKey);
    };
    /**
     * Retrieve AccountEntity from cache
     * @param nativeAccountId
     * @returns AccountEntity or Null
     */
    CacheManager.prototype.readAccountFromCacheWithNativeAccountId = function (nativeAccountId) {
        // fetch account from memory
        var accountFilter = {
            nativeAccountId: nativeAccountId
        };
        var accountCache = this.getAccountsFilteredBy(accountFilter);
        var accounts = Object.keys(accountCache).map(function (key) { return accountCache[key]; });
        if (accounts.length < 1) {
            return null;
        }
        else if (accounts.length > 1) {
            throw ClientAuthError.createMultipleMatchingAccountsInCacheError();
        }
        return accountCache[0];
    };
    /**
     * Retrieve IdTokenEntity from cache
     * @param clientId
     * @param account
     * @param inputRealm
     */
    CacheManager.prototype.readIdTokenFromCache = function (clientId, account) {
        var idTokenFilter = {
            homeAccountId: account.homeAccountId,
            environment: account.environment,
            credentialType: exports.CredentialType.ID_TOKEN,
            clientId: clientId,
            realm: account.tenantId,
        };
        var credentialCache = this.getCredentialsFilteredBy(idTokenFilter);
        var idTokens = Object.keys(credentialCache.idTokens).map(function (key) { return credentialCache.idTokens[key]; });
        var numIdTokens = idTokens.length;
        if (numIdTokens < 1) {
            return null;
        }
        else if (numIdTokens > 1) {
            throw ClientAuthError.createMultipleMatchingTokensInCacheError();
        }
        return idTokens[0];
    };
    /**
     * Retrieve AccessTokenEntity from cache
     * @param clientId
     * @param account
     * @param scopes
     * @param authScheme
     */
    CacheManager.prototype.readAccessTokenFromCache = function (clientId, account, request) {
        var scopes = new ScopeSet(request.scopes || []);
        var authScheme = request.authenticationScheme || exports.AuthenticationScheme.BEARER;
        /*
         * Distinguish between Bearer and PoP/SSH token cache types
         * Cast to lowercase to handle "bearer" from ADFS
         */
        var credentialType = (authScheme && authScheme.toLowerCase() !== exports.AuthenticationScheme.BEARER.toLowerCase()) ? exports.CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME : exports.CredentialType.ACCESS_TOKEN;
        var accessTokenFilter = {
            homeAccountId: account.homeAccountId,
            environment: account.environment,
            credentialType: credentialType,
            clientId: clientId,
            realm: account.tenantId,
            target: scopes.printScopesLowerCase(),
            tokenType: authScheme,
            keyId: request.sshKid,
            requestedClaimsHash: request.requestedClaimsHash,
        };
        var credentialCache = this.getCredentialsFilteredBy(accessTokenFilter);
        var accessTokens = Object.keys(credentialCache.accessTokens).map(function (key) { return credentialCache.accessTokens[key]; });
        var numAccessTokens = accessTokens.length;
        if (numAccessTokens < 1) {
            return null;
        }
        else if (numAccessTokens > 1) {
            throw ClientAuthError.createMultipleMatchingTokensInCacheError();
        }
        return accessTokens[0];
    };
    /**
     * Helper to retrieve the appropriate refresh token from cache
     * @param clientId
     * @param account
     * @param familyRT
     */
    CacheManager.prototype.readRefreshTokenFromCache = function (clientId, account, familyRT) {
        var id = familyRT ? THE_FAMILY_ID : undefined;
        var refreshTokenFilter = {
            homeAccountId: account.homeAccountId,
            environment: account.environment,
            credentialType: exports.CredentialType.REFRESH_TOKEN,
            clientId: clientId,
            familyId: id,
        };
        var credentialCache = this.getCredentialsFilteredBy(refreshTokenFilter);
        var refreshTokens = Object.keys(credentialCache.refreshTokens).map(function (key) { return credentialCache.refreshTokens[key]; });
        var numRefreshTokens = refreshTokens.length;
        if (numRefreshTokens < 1) {
            return null;
        }
        // address the else case after remove functions address environment aliases
        return refreshTokens[0];
    };
    /**
     * Retrieve AppMetadataEntity from cache
     */
    CacheManager.prototype.readAppMetadataFromCache = function (environment, clientId) {
        var appMetadataFilter = {
            environment: environment,
            clientId: clientId,
        };
        var appMetadata = this.getAppMetadataFilteredBy(appMetadataFilter);
        var appMetadataEntries = Object.keys(appMetadata).map(function (key) { return appMetadata[key]; });
        var numAppMetadata = appMetadataEntries.length;
        if (numAppMetadata < 1) {
            return null;
        }
        else if (numAppMetadata > 1) {
            throw ClientAuthError.createMultipleMatchingAppMetadataInCacheError();
        }
        return appMetadataEntries[0];
    };
    /**
     * Return the family_id value associated  with FOCI
     * @param environment
     * @param clientId
     */
    CacheManager.prototype.isAppMetadataFOCI = function (environment, clientId) {
        var appMetadata = this.readAppMetadataFromCache(environment, clientId);
        return !!(appMetadata && appMetadata.familyId === THE_FAMILY_ID);
    };
    /**
     * helper to match account ids
     * @param value
     * @param homeAccountId
     */
    CacheManager.prototype.matchHomeAccountId = function (entity, homeAccountId) {
        return !!(entity.homeAccountId && homeAccountId === entity.homeAccountId);
    };
    /**
     * helper to match assertion
     * @param value
     * @param oboAssertion
     */
    CacheManager.prototype.matchUserAssertionHash = function (entity, userAssertionHash) {
        return !!(entity.userAssertionHash && userAssertionHash === entity.userAssertionHash);
    };
    /**
     * helper to match environment
     * @param value
     * @param environment
     */
    CacheManager.prototype.matchEnvironment = function (entity, environment) {
        var cloudMetadata = this.getAuthorityMetadataByAlias(environment);
        if (cloudMetadata && cloudMetadata.aliases.indexOf(entity.environment) > -1) {
            return true;
        }
        return false;
    };
    /**
     * helper to match credential type
     * @param entity
     * @param credentialType
     */
    CacheManager.prototype.matchCredentialType = function (entity, credentialType) {
        return (entity.credentialType && credentialType.toLowerCase() === entity.credentialType.toLowerCase());
    };
    /**
     * helper to match client ids
     * @param entity
     * @param clientId
     */
    CacheManager.prototype.matchClientId = function (entity, clientId) {
        return !!(entity.clientId && clientId === entity.clientId);
    };
    /**
     * helper to match family ids
     * @param entity
     * @param familyId
     */
    CacheManager.prototype.matchFamilyId = function (entity, familyId) {
        return !!(entity.familyId && familyId === entity.familyId);
    };
    /**
     * helper to match realm
     * @param entity
     * @param realm
     */
    CacheManager.prototype.matchRealm = function (entity, realm) {
        return !!(entity.realm && realm === entity.realm);
    };
    /**
     * helper to match nativeAccountId
     * @param entity
     * @param nativeAccountId
     * @returns boolean indicating the match result
     */
    CacheManager.prototype.matchNativeAccountId = function (entity, nativeAccountId) {
        return !!(entity.nativeAccountId && nativeAccountId === entity.nativeAccountId);
    };
    /**
     * Returns true if the target scopes are a subset of the current entity's scopes, false otherwise.
     * @param entity
     * @param target
     */
    CacheManager.prototype.matchTarget = function (entity, target) {
        var isNotAccessTokenCredential = (entity.credentialType !== exports.CredentialType.ACCESS_TOKEN && entity.credentialType !== exports.CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME);
        if (isNotAccessTokenCredential || !entity.target) {
            return false;
        }
        var entityScopeSet = ScopeSet.fromString(entity.target);
        var requestTargetScopeSet = ScopeSet.fromString(target);
        if (!requestTargetScopeSet.containsOnlyOIDCScopes()) {
            requestTargetScopeSet.removeOIDCScopes(); // ignore OIDC scopes
        }
        else {
            requestTargetScopeSet.removeScope(Constants.OFFLINE_ACCESS_SCOPE);
        }
        return entityScopeSet.containsScopeSet(requestTargetScopeSet);
    };
    /**
     * Returns true if the credential's tokenType or Authentication Scheme matches the one in the request, false otherwise
     * @param entity
     * @param tokenType
     */
    CacheManager.prototype.matchTokenType = function (entity, tokenType) {
        return !!(entity.tokenType && entity.tokenType === tokenType);
    };
    /**
     * Returns true if the credential's keyId matches the one in the request, false otherwise
     * @param entity
     * @param tokenType
     */
    CacheManager.prototype.matchKeyId = function (entity, keyId) {
        return !!(entity.keyId && entity.keyId === keyId);
    };
    /**
     * returns if a given cache entity is of the type appmetadata
     * @param key
     */
    CacheManager.prototype.isAppMetadata = function (key) {
        return key.indexOf(APP_METADATA) !== -1;
    };
    /**
     * returns if a given cache entity is of the type authoritymetadata
     * @param key
     */
    CacheManager.prototype.isAuthorityMetadata = function (key) {
        return key.indexOf(AUTHORITY_METADATA_CONSTANTS.CACHE_KEY) !== -1;
    };
    /**
     * returns cache key used for cloud instance metadata
     */
    CacheManager.prototype.generateAuthorityMetadataCacheKey = function (authority) {
        return AUTHORITY_METADATA_CONSTANTS.CACHE_KEY + "-" + this.clientId + "-" + authority;
    };
    /**
     * Returns the specific credential (IdToken/AccessToken/RefreshToken) from the cache
     * @param key
     * @param credType
     */
    CacheManager.prototype.getSpecificCredential = function (key, credType) {
        switch (credType) {
            case exports.CredentialType.ID_TOKEN: {
                return this.getIdTokenCredential(key);
            }
            case exports.CredentialType.ACCESS_TOKEN:
            case exports.CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME: {
                return this.getAccessTokenCredential(key);
            }
            case exports.CredentialType.REFRESH_TOKEN: {
                return this.getRefreshTokenCredential(key);
            }
            default:
                return null;
        }
    };
    /**
     * Helper to convert serialized data to object
     * @param obj
     * @param json
     */
    CacheManager.toObject = function (obj, json) {
        for (var propertyName in json) {
            obj[propertyName] = json[propertyName];
        }
        return obj;
    };
    return CacheManager;
}());
var DefaultStorageClass = /** @class */ (function (_super) {
    __extends(DefaultStorageClass, _super);
    function DefaultStorageClass() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    DefaultStorageClass.prototype.setAccount = function () {
        var notImplErr = "Storage interface - setAccount() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getAccount = function () {
        var notImplErr = "Storage interface - getAccount() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.setIdTokenCredential = function () {
        var notImplErr = "Storage interface - setIdTokenCredential() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getIdTokenCredential = function () {
        var notImplErr = "Storage interface - getIdTokenCredential() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.setAccessTokenCredential = function () {
        var notImplErr = "Storage interface - setAccessTokenCredential() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getAccessTokenCredential = function () {
        var notImplErr = "Storage interface - getAccessTokenCredential() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.setRefreshTokenCredential = function () {
        var notImplErr = "Storage interface - setRefreshTokenCredential() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getRefreshTokenCredential = function () {
        var notImplErr = "Storage interface - getRefreshTokenCredential() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.setAppMetadata = function () {
        var notImplErr = "Storage interface - setAppMetadata() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getAppMetadata = function () {
        var notImplErr = "Storage interface - getAppMetadata() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.setServerTelemetry = function () {
        var notImplErr = "Storage interface - setServerTelemetry() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getServerTelemetry = function () {
        var notImplErr = "Storage interface - getServerTelemetry() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.setAuthorityMetadata = function () {
        var notImplErr = "Storage interface - setAuthorityMetadata() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getAuthorityMetadata = function () {
        var notImplErr = "Storage interface - getAuthorityMetadata() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getAuthorityMetadataKeys = function () {
        var notImplErr = "Storage interface - getAuthorityMetadataKeys() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.setThrottlingCache = function () {
        var notImplErr = "Storage interface - setThrottlingCache() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getThrottlingCache = function () {
        var notImplErr = "Storage interface - getThrottlingCache() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.removeItem = function () {
        var notImplErr = "Storage interface - removeItem() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.containsKey = function () {
        var notImplErr = "Storage interface - containsKey() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getKeys = function () {
        var notImplErr = "Storage interface - getKeys() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.clear = function () {
        return __awaiter(this, void 0, void 0, function () {
            var notImplErr;
            return __generator(this, function (_a) {
                notImplErr = "Storage interface - clear() has not been implemented for the cacheStorage interface.";
                throw AuthError.createUnexpectedError(notImplErr);
            });
        });
    };
    DefaultStorageClass.prototype.updateCredentialCacheKey = function () {
        var notImplErr = "Storage interface - updateCredentialCacheKey() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    return DefaultStorageClass;
}(CacheManager));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
// Token renewal offset default in seconds
var DEFAULT_TOKEN_RENEWAL_OFFSET_SEC = 300;
var DEFAULT_SYSTEM_OPTIONS = {
    tokenRenewalOffsetSeconds: DEFAULT_TOKEN_RENEWAL_OFFSET_SEC,
    preventCorsPreflight: false,
    proxyUrl: Constants.EMPTY_STRING
};
var DEFAULT_LOGGER_IMPLEMENTATION = {
    loggerCallback: function () {
        // allow users to not set loggerCallback
    },
    piiLoggingEnabled: false,
    logLevel: exports.LogLevel.Info,
    correlationId: Constants.EMPTY_STRING
};
var DEFAULT_NETWORK_IMPLEMENTATION = {
    sendGetRequestAsync: function () {
        return __awaiter(this, void 0, void 0, function () {
            var notImplErr;
            return __generator(this, function (_a) {
                notImplErr = "Network interface - sendGetRequestAsync() has not been implemented";
                throw AuthError.createUnexpectedError(notImplErr);
            });
        });
    },
    sendPostRequestAsync: function () {
        return __awaiter(this, void 0, void 0, function () {
            var notImplErr;
            return __generator(this, function (_a) {
                notImplErr = "Network interface - sendPostRequestAsync() has not been implemented";
                throw AuthError.createUnexpectedError(notImplErr);
            });
        });
    }
};
var DEFAULT_LIBRARY_INFO = {
    sku: Constants.SKU,
    version: version,
    cpu: Constants.EMPTY_STRING,
    os: Constants.EMPTY_STRING
};
var DEFAULT_CLIENT_CREDENTIALS = {
    clientSecret: Constants.EMPTY_STRING,
    clientAssertion: undefined
};
var DEFAULT_AZURE_CLOUD_OPTIONS = {
    azureCloudInstance: exports.AzureCloudInstance.None,
    tenant: "" + Constants.DEFAULT_COMMON_TENANT
};
var DEFAULT_TELEMETRY_OPTIONS = {
    application: {
        appName: "",
        appVersion: ""
    }
};
/**
 * Function that sets the default options when not explicitly configured from app developer
 *
 * @param Configuration
 *
 * @returns Configuration
 */
function buildClientConfiguration(_a) {
    var userAuthOptions = _a.authOptions, userSystemOptions = _a.systemOptions, userLoggerOption = _a.loggerOptions, storageImplementation = _a.storageInterface, networkImplementation = _a.networkInterface, cryptoImplementation = _a.cryptoInterface, clientCredentials = _a.clientCredentials, libraryInfo = _a.libraryInfo, telemetry = _a.telemetry, serverTelemetryManager = _a.serverTelemetryManager, persistencePlugin = _a.persistencePlugin, serializableCache = _a.serializableCache;
    var loggerOptions = __assign(__assign({}, DEFAULT_LOGGER_IMPLEMENTATION), userLoggerOption);
    return {
        authOptions: buildAuthOptions(userAuthOptions),
        systemOptions: __assign(__assign({}, DEFAULT_SYSTEM_OPTIONS), userSystemOptions),
        loggerOptions: loggerOptions,
        storageInterface: storageImplementation || new DefaultStorageClass(userAuthOptions.clientId, DEFAULT_CRYPTO_IMPLEMENTATION),
        networkInterface: networkImplementation || DEFAULT_NETWORK_IMPLEMENTATION,
        cryptoInterface: cryptoImplementation || DEFAULT_CRYPTO_IMPLEMENTATION,
        clientCredentials: clientCredentials || DEFAULT_CLIENT_CREDENTIALS,
        libraryInfo: __assign(__assign({}, DEFAULT_LIBRARY_INFO), libraryInfo),
        telemetry: __assign(__assign({}, DEFAULT_TELEMETRY_OPTIONS), telemetry),
        serverTelemetryManager: serverTelemetryManager || null,
        persistencePlugin: persistencePlugin || null,
        serializableCache: serializableCache || null,
    };
}
/**
 * Construct authoptions from the client and platform passed values
 * @param authOptions
 */
function buildAuthOptions(authOptions) {
    return __assign({ clientCapabilities: [], azureCloudOptions: DEFAULT_AZURE_CLOUD_OPTIONS, skipAuthorityMetadataCache: false }, authOptions);
}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Error thrown when there is an error with the server code, for example, unavailability.
 */
var ServerError = /** @class */ (function (_super) {
    __extends(ServerError, _super);
    function ServerError(errorCode, errorMessage, subError) {
        var _this = _super.call(this, errorCode, errorMessage, subError) || this;
        _this.name = "ServerError";
        Object.setPrototypeOf(_this, ServerError.prototype);
        return _this;
    }
    return ServerError;
}(AuthError));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var ThrottlingUtils = /** @class */ (function () {
    function ThrottlingUtils() {
    }
    /**
     * Prepares a RequestThumbprint to be stored as a key.
     * @param thumbprint
     */
    ThrottlingUtils.generateThrottlingStorageKey = function (thumbprint) {
        return ThrottlingConstants.THROTTLING_PREFIX + "." + JSON.stringify(thumbprint);
    };
    /**
     * Performs necessary throttling checks before a network request.
     * @param cacheManager
     * @param thumbprint
     */
    ThrottlingUtils.preProcess = function (cacheManager, thumbprint) {
        var _a;
        var key = ThrottlingUtils.generateThrottlingStorageKey(thumbprint);
        var value = cacheManager.getThrottlingCache(key);
        if (value) {
            if (value.throttleTime < Date.now()) {
                cacheManager.removeItem(key, exports.CacheSchemaType.THROTTLING);
                return;
            }
            throw new ServerError(((_a = value.errorCodes) === null || _a === void 0 ? void 0 : _a.join(" ")) || Constants.EMPTY_STRING, value.errorMessage, value.subError);
        }
    };
    /**
     * Performs necessary throttling checks after a network request.
     * @param cacheManager
     * @param thumbprint
     * @param response
     */
    ThrottlingUtils.postProcess = function (cacheManager, thumbprint, response) {
        if (ThrottlingUtils.checkResponseStatus(response) || ThrottlingUtils.checkResponseForRetryAfter(response)) {
            var thumbprintValue = {
                throttleTime: ThrottlingUtils.calculateThrottleTime(parseInt(response.headers[HeaderNames.RETRY_AFTER])),
                error: response.body.error,
                errorCodes: response.body.error_codes,
                errorMessage: response.body.error_description,
                subError: response.body.suberror
            };
            cacheManager.setThrottlingCache(ThrottlingUtils.generateThrottlingStorageKey(thumbprint), thumbprintValue);
        }
    };
    /**
     * Checks a NetworkResponse object's status codes against 429 or 5xx
     * @param response
     */
    ThrottlingUtils.checkResponseStatus = function (response) {
        return response.status === 429 || response.status >= 500 && response.status < 600;
    };
    /**
     * Checks a NetworkResponse object's RetryAfter header
     * @param response
     */
    ThrottlingUtils.checkResponseForRetryAfter = function (response) {
        if (response.headers) {
            return response.headers.hasOwnProperty(HeaderNames.RETRY_AFTER) && (response.status < 200 || response.status >= 300);
        }
        return false;
    };
    /**
     * Calculates the Unix-time value for a throttle to expire given throttleTime in seconds.
     * @param throttleTime
     */
    ThrottlingUtils.calculateThrottleTime = function (throttleTime) {
        var time = throttleTime <= 0 ? 0 : throttleTime;
        var currentSeconds = Date.now() / 1000;
        return Math.floor(Math.min(currentSeconds + (time || ThrottlingConstants.DEFAULT_THROTTLE_TIME_SECONDS), currentSeconds + ThrottlingConstants.DEFAULT_MAX_THROTTLE_TIME_SECONDS) * 1000);
    };
    ThrottlingUtils.removeThrottle = function (cacheManager, clientId, request, homeAccountIdentifier) {
        var thumbprint = {
            clientId: clientId,
            authority: request.authority,
            scopes: request.scopes,
            homeAccountIdentifier: homeAccountIdentifier,
            claims: request.claims,
            authenticationScheme: request.authenticationScheme,
            resourceRequestMethod: request.resourceRequestMethod,
            resourceRequestUri: request.resourceRequestUri,
            shrClaims: request.shrClaims,
            sshKid: request.sshKid
        };
        var key = this.generateThrottlingStorageKey(thumbprint);
        return cacheManager.removeItem(key, exports.CacheSchemaType.THROTTLING);
    };
    return ThrottlingUtils;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var NetworkManager = /** @class */ (function () {
    function NetworkManager(networkClient, cacheManager) {
        this.networkClient = networkClient;
        this.cacheManager = cacheManager;
    }
    /**
     * Wraps sendPostRequestAsync with necessary preflight and postflight logic
     * @param thumbprint
     * @param tokenEndpoint
     * @param options
     */
    NetworkManager.prototype.sendPostRequest = function (thumbprint, tokenEndpoint, options) {
        return __awaiter(this, void 0, void 0, function () {
            var response, e_1;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        ThrottlingUtils.preProcess(this.cacheManager, thumbprint);
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        return [4 /*yield*/, this.networkClient.sendPostRequestAsync(tokenEndpoint, options)];
                    case 2:
                        response = _a.sent();
                        return [3 /*break*/, 4];
                    case 3:
                        e_1 = _a.sent();
                        if (e_1 instanceof AuthError) {
                            throw e_1;
                        }
                        else {
                            throw ClientAuthError.createNetworkError(tokenEndpoint, e_1);
                        }
                    case 4:
                        ThrottlingUtils.postProcess(this.cacheManager, thumbprint, response);
                        return [2 /*return*/, response];
                }
            });
        });
    };
    return NetworkManager;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
exports.CcsCredentialType = void 0;
(function (CcsCredentialType) {
    CcsCredentialType["HOME_ACCOUNT_ID"] = "home_account_id";
    CcsCredentialType["UPN"] = "UPN";
})(exports.CcsCredentialType || (exports.CcsCredentialType = {}));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Base application class which will construct requests to send to and handle responses from the Microsoft STS using the authorization code flow.
 */
var BaseClient = /** @class */ (function () {
    function BaseClient(configuration, performanceClient) {
        // Set the configuration
        this.config = buildClientConfiguration(configuration);
        // Initialize the logger
        this.logger = new Logger(this.config.loggerOptions, name, version);
        // Initialize crypto
        this.cryptoUtils = this.config.cryptoInterface;
        // Initialize storage interface
        this.cacheManager = this.config.storageInterface;
        // Set the network interface
        this.networkClient = this.config.networkInterface;
        // Set the NetworkManager
        this.networkManager = new NetworkManager(this.networkClient, this.cacheManager);
        // Set TelemetryManager
        this.serverTelemetryManager = this.config.serverTelemetryManager;
        // set Authority
        this.authority = this.config.authOptions.authority;
        // set performance telemetry client
        this.performanceClient = performanceClient;
    }
    /**
     * Creates default headers for requests to token endpoint
     */
    BaseClient.prototype.createTokenRequestHeaders = function (ccsCred) {
        var headers = {};
        headers[HeaderNames.CONTENT_TYPE] = Constants.URL_FORM_CONTENT_TYPE;
        if (!this.config.systemOptions.preventCorsPreflight && ccsCred) {
            switch (ccsCred.type) {
                case exports.CcsCredentialType.HOME_ACCOUNT_ID:
                    try {
                        var clientInfo = buildClientInfoFromHomeAccountId(ccsCred.credential);
                        headers[HeaderNames.CCS_HEADER] = "Oid:" + clientInfo.uid + "@" + clientInfo.utid;
                    }
                    catch (e) {
                        this.logger.verbose("Could not parse home account ID for CCS Header: " + e);
                    }
                    break;
                case exports.CcsCredentialType.UPN:
                    headers[HeaderNames.CCS_HEADER] = "UPN: " + ccsCred.credential;
                    break;
            }
        }
        return headers;
    };
    /**
     * Http post to token endpoint
     * @param tokenEndpoint
     * @param queryString
     * @param headers
     * @param thumbprint
     */
    BaseClient.prototype.executePostToTokenEndpoint = function (tokenEndpoint, queryString, headers, thumbprint) {
        return __awaiter(this, void 0, void 0, function () {
            var response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.networkManager.sendPostRequest(thumbprint, tokenEndpoint, { body: queryString, headers: headers, proxyUrl: this.config.systemOptions.proxyUrl })];
                    case 1:
                        response = _a.sent();
                        if (this.config.serverTelemetryManager && response.status < 500 && response.status !== 429) {
                            // Telemetry data successfully logged by server, clear Telemetry cache
                            this.config.serverTelemetryManager.clearTelemetryCache();
                        }
                        return [2 /*return*/, response];
                }
            });
        });
    };
    /**
     * Updates the authority object of the client. Endpoint discovery must be completed.
     * @param updatedAuthority
     */
    BaseClient.prototype.updateAuthority = function (updatedAuthority) {
        if (!updatedAuthority.discoveryComplete()) {
            throw ClientAuthError.createEndpointDiscoveryIncompleteError("Updated authority has not completed endpoint discovery.");
        }
        this.authority = updatedAuthority;
    };
    return BaseClient;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Validates server consumable params from the "request" objects
 */
var RequestValidator = /** @class */ (function () {
    function RequestValidator() {
    }
    /**
     * Utility to check if the `redirectUri` in the request is a non-null value
     * @param redirectUri
     */
    RequestValidator.validateRedirectUri = function (redirectUri) {
        if (StringUtils.isEmpty(redirectUri)) {
            throw ClientConfigurationError.createRedirectUriEmptyError();
        }
    };
    /**
     * Utility to validate prompt sent by the user in the request
     * @param prompt
     */
    RequestValidator.validatePrompt = function (prompt) {
        var promptValues = [];
        for (var value in PromptValue) {
            promptValues.push(PromptValue[value]);
        }
        if (promptValues.indexOf(prompt) < 0) {
            throw ClientConfigurationError.createInvalidPromptError(prompt);
        }
    };
    RequestValidator.validateClaims = function (claims) {
        try {
            JSON.parse(claims);
        }
        catch (e) {
            throw ClientConfigurationError.createInvalidClaimsRequestError();
        }
    };
    /**
     * Utility to validate code_challenge and code_challenge_method
     * @param codeChallenge
     * @param codeChallengeMethod
     */
    RequestValidator.validateCodeChallengeParams = function (codeChallenge, codeChallengeMethod) {
        if (StringUtils.isEmpty(codeChallenge) || StringUtils.isEmpty(codeChallengeMethod)) {
            throw ClientConfigurationError.createInvalidCodeChallengeParamsError();
        }
        else {
            this.validateCodeChallengeMethod(codeChallengeMethod);
        }
    };
    /**
     * Utility to validate code_challenge_method
     * @param codeChallengeMethod
     */
    RequestValidator.validateCodeChallengeMethod = function (codeChallengeMethod) {
        if ([
            CodeChallengeMethodValues.PLAIN,
            CodeChallengeMethodValues.S256
        ].indexOf(codeChallengeMethod) < 0) {
            throw ClientConfigurationError.createInvalidCodeChallengeMethodError();
        }
    };
    /**
     * Removes unnecessary or duplicate query parameters from extraQueryParameters
     * @param request
     */
    RequestValidator.sanitizeEQParams = function (eQParams, queryParams) {
        if (!eQParams) {
            return {};
        }
        // Remove any query parameters already included in SSO params
        queryParams.forEach(function (value, key) {
            if (eQParams[key]) {
                delete eQParams[key];
            }
        });
        return eQParams;
    };
    return RequestValidator;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var RequestParameterBuilder = /** @class */ (function () {
    function RequestParameterBuilder() {
        this.parameters = new Map();
    }
    /**
     * add response_type = code
     */
    RequestParameterBuilder.prototype.addResponseTypeCode = function () {
        this.parameters.set(AADServerParamKeys.RESPONSE_TYPE, encodeURIComponent(Constants.CODE_RESPONSE_TYPE));
    };
    /**
     * add response_type = token id_token
     */
    RequestParameterBuilder.prototype.addResponseTypeForTokenAndIdToken = function () {
        this.parameters.set(AADServerParamKeys.RESPONSE_TYPE, encodeURIComponent(Constants.TOKEN_RESPONSE_TYPE + " " + Constants.ID_TOKEN_RESPONSE_TYPE));
    };
    /**
     * add response_mode. defaults to query.
     * @param responseMode
     */
    RequestParameterBuilder.prototype.addResponseMode = function (responseMode) {
        this.parameters.set(AADServerParamKeys.RESPONSE_MODE, encodeURIComponent((responseMode) ? responseMode : exports.ResponseMode.QUERY));
    };
    /**
     * Add flag to indicate STS should attempt to use WAM if available
     */
    RequestParameterBuilder.prototype.addNativeBroker = function () {
        this.parameters.set(AADServerParamKeys.NATIVE_BROKER, encodeURIComponent("1"));
    };
    /**
     * add scopes. set addOidcScopes to false to prevent default scopes in non-user scenarios
     * @param scopeSet
     * @param addOidcScopes
     */
    RequestParameterBuilder.prototype.addScopes = function (scopes, addOidcScopes) {
        if (addOidcScopes === void 0) { addOidcScopes = true; }
        var requestScopes = addOidcScopes ? __spreadArrays(scopes || [], OIDC_DEFAULT_SCOPES) : scopes || [];
        var scopeSet = new ScopeSet(requestScopes);
        this.parameters.set(AADServerParamKeys.SCOPE, encodeURIComponent(scopeSet.printScopes()));
    };
    /**
     * add clientId
     * @param clientId
     */
    RequestParameterBuilder.prototype.addClientId = function (clientId) {
        this.parameters.set(AADServerParamKeys.CLIENT_ID, encodeURIComponent(clientId));
    };
    /**
     * add redirect_uri
     * @param redirectUri
     */
    RequestParameterBuilder.prototype.addRedirectUri = function (redirectUri) {
        RequestValidator.validateRedirectUri(redirectUri);
        this.parameters.set(AADServerParamKeys.REDIRECT_URI, encodeURIComponent(redirectUri));
    };
    /**
     * add post logout redirectUri
     * @param redirectUri
     */
    RequestParameterBuilder.prototype.addPostLogoutRedirectUri = function (redirectUri) {
        RequestValidator.validateRedirectUri(redirectUri);
        this.parameters.set(AADServerParamKeys.POST_LOGOUT_URI, encodeURIComponent(redirectUri));
    };
    /**
     * add id_token_hint to logout request
     * @param idTokenHint
     */
    RequestParameterBuilder.prototype.addIdTokenHint = function (idTokenHint) {
        this.parameters.set(AADServerParamKeys.ID_TOKEN_HINT, encodeURIComponent(idTokenHint));
    };
    /**
     * add domain_hint
     * @param domainHint
     */
    RequestParameterBuilder.prototype.addDomainHint = function (domainHint) {
        this.parameters.set(SSOTypes.DOMAIN_HINT, encodeURIComponent(domainHint));
    };
    /**
     * add login_hint
     * @param loginHint
     */
    RequestParameterBuilder.prototype.addLoginHint = function (loginHint) {
        this.parameters.set(SSOTypes.LOGIN_HINT, encodeURIComponent(loginHint));
    };
    /**
     * Adds the CCS (Cache Credential Service) query parameter for login_hint
     * @param loginHint
     */
    RequestParameterBuilder.prototype.addCcsUpn = function (loginHint) {
        this.parameters.set(HeaderNames.CCS_HEADER, encodeURIComponent("UPN:" + loginHint));
    };
    /**
     * Adds the CCS (Cache Credential Service) query parameter for account object
     * @param loginHint
     */
    RequestParameterBuilder.prototype.addCcsOid = function (clientInfo) {
        this.parameters.set(HeaderNames.CCS_HEADER, encodeURIComponent("Oid:" + clientInfo.uid + "@" + clientInfo.utid));
    };
    /**
     * add sid
     * @param sid
     */
    RequestParameterBuilder.prototype.addSid = function (sid) {
        this.parameters.set(SSOTypes.SID, encodeURIComponent(sid));
    };
    /**
     * add claims
     * @param claims
     */
    RequestParameterBuilder.prototype.addClaims = function (claims, clientCapabilities) {
        var mergedClaims = this.addClientCapabilitiesToClaims(claims, clientCapabilities);
        RequestValidator.validateClaims(mergedClaims);
        this.parameters.set(AADServerParamKeys.CLAIMS, encodeURIComponent(mergedClaims));
    };
    /**
     * add correlationId
     * @param correlationId
     */
    RequestParameterBuilder.prototype.addCorrelationId = function (correlationId) {
        this.parameters.set(AADServerParamKeys.CLIENT_REQUEST_ID, encodeURIComponent(correlationId));
    };
    /**
     * add library info query params
     * @param libraryInfo
     */
    RequestParameterBuilder.prototype.addLibraryInfo = function (libraryInfo) {
        // Telemetry Info
        this.parameters.set(AADServerParamKeys.X_CLIENT_SKU, libraryInfo.sku);
        this.parameters.set(AADServerParamKeys.X_CLIENT_VER, libraryInfo.version);
        if (libraryInfo.os) {
            this.parameters.set(AADServerParamKeys.X_CLIENT_OS, libraryInfo.os);
        }
        if (libraryInfo.cpu) {
            this.parameters.set(AADServerParamKeys.X_CLIENT_CPU, libraryInfo.cpu);
        }
    };
    /**
     * Add client telemetry parameters
     * @param appTelemetry
     */
    RequestParameterBuilder.prototype.addApplicationTelemetry = function (appTelemetry) {
        if (appTelemetry === null || appTelemetry === void 0 ? void 0 : appTelemetry.appName) {
            this.parameters.set(AADServerParamKeys.X_APP_NAME, appTelemetry.appName);
        }
        if (appTelemetry === null || appTelemetry === void 0 ? void 0 : appTelemetry.appVersion) {
            this.parameters.set(AADServerParamKeys.X_APP_VER, appTelemetry.appVersion);
        }
    };
    /**
     * add prompt
     * @param prompt
     */
    RequestParameterBuilder.prototype.addPrompt = function (prompt) {
        RequestValidator.validatePrompt(prompt);
        this.parameters.set("" + AADServerParamKeys.PROMPT, encodeURIComponent(prompt));
    };
    /**
     * add state
     * @param state
     */
    RequestParameterBuilder.prototype.addState = function (state) {
        if (!StringUtils.isEmpty(state)) {
            this.parameters.set(AADServerParamKeys.STATE, encodeURIComponent(state));
        }
    };
    /**
     * add nonce
     * @param nonce
     */
    RequestParameterBuilder.prototype.addNonce = function (nonce) {
        this.parameters.set(AADServerParamKeys.NONCE, encodeURIComponent(nonce));
    };
    /**
     * add code_challenge and code_challenge_method
     * - throw if either of them are not passed
     * @param codeChallenge
     * @param codeChallengeMethod
     */
    RequestParameterBuilder.prototype.addCodeChallengeParams = function (codeChallenge, codeChallengeMethod) {
        RequestValidator.validateCodeChallengeParams(codeChallenge, codeChallengeMethod);
        if (codeChallenge && codeChallengeMethod) {
            this.parameters.set(AADServerParamKeys.CODE_CHALLENGE, encodeURIComponent(codeChallenge));
            this.parameters.set(AADServerParamKeys.CODE_CHALLENGE_METHOD, encodeURIComponent(codeChallengeMethod));
        }
        else {
            throw ClientConfigurationError.createInvalidCodeChallengeParamsError();
        }
    };
    /**
     * add the `authorization_code` passed by the user to exchange for a token
     * @param code
     */
    RequestParameterBuilder.prototype.addAuthorizationCode = function (code) {
        this.parameters.set(AADServerParamKeys.CODE, encodeURIComponent(code));
    };
    /**
     * add the `authorization_code` passed by the user to exchange for a token
     * @param code
     */
    RequestParameterBuilder.prototype.addDeviceCode = function (code) {
        this.parameters.set(AADServerParamKeys.DEVICE_CODE, encodeURIComponent(code));
    };
    /**
     * add the `refreshToken` passed by the user
     * @param refreshToken
     */
    RequestParameterBuilder.prototype.addRefreshToken = function (refreshToken) {
        this.parameters.set(AADServerParamKeys.REFRESH_TOKEN, encodeURIComponent(refreshToken));
    };
    /**
     * add the `code_verifier` passed by the user to exchange for a token
     * @param codeVerifier
     */
    RequestParameterBuilder.prototype.addCodeVerifier = function (codeVerifier) {
        this.parameters.set(AADServerParamKeys.CODE_VERIFIER, encodeURIComponent(codeVerifier));
    };
    /**
     * add client_secret
     * @param clientSecret
     */
    RequestParameterBuilder.prototype.addClientSecret = function (clientSecret) {
        this.parameters.set(AADServerParamKeys.CLIENT_SECRET, encodeURIComponent(clientSecret));
    };
    /**
     * add clientAssertion for confidential client flows
     * @param clientAssertion
     */
    RequestParameterBuilder.prototype.addClientAssertion = function (clientAssertion) {
        if (!StringUtils.isEmpty(clientAssertion)) {
            this.parameters.set(AADServerParamKeys.CLIENT_ASSERTION, encodeURIComponent(clientAssertion));
        }
    };
    /**
     * add clientAssertionType for confidential client flows
     * @param clientAssertionType
     */
    RequestParameterBuilder.prototype.addClientAssertionType = function (clientAssertionType) {
        if (!StringUtils.isEmpty(clientAssertionType)) {
            this.parameters.set(AADServerParamKeys.CLIENT_ASSERTION_TYPE, encodeURIComponent(clientAssertionType));
        }
    };
    /**
     * add OBO assertion for confidential client flows
     * @param clientAssertion
     */
    RequestParameterBuilder.prototype.addOboAssertion = function (oboAssertion) {
        this.parameters.set(AADServerParamKeys.OBO_ASSERTION, encodeURIComponent(oboAssertion));
    };
    /**
     * add grant type
     * @param grantType
     */
    RequestParameterBuilder.prototype.addRequestTokenUse = function (tokenUse) {
        this.parameters.set(AADServerParamKeys.REQUESTED_TOKEN_USE, encodeURIComponent(tokenUse));
    };
    /**
     * add grant type
     * @param grantType
     */
    RequestParameterBuilder.prototype.addGrantType = function (grantType) {
        this.parameters.set(AADServerParamKeys.GRANT_TYPE, encodeURIComponent(grantType));
    };
    /**
     * add client info
     *
     */
    RequestParameterBuilder.prototype.addClientInfo = function () {
        this.parameters.set(CLIENT_INFO, "1");
    };
    /**
     * add extraQueryParams
     * @param eQparams
     */
    RequestParameterBuilder.prototype.addExtraQueryParameters = function (eQparams) {
        var _this = this;
        RequestValidator.sanitizeEQParams(eQparams, this.parameters);
        Object.keys(eQparams).forEach(function (key) {
            _this.parameters.set(key, eQparams[key]);
        });
    };
    RequestParameterBuilder.prototype.addClientCapabilitiesToClaims = function (claims, clientCapabilities) {
        var mergedClaims;
        // Parse provided claims into JSON object or initialize empty object
        if (!claims) {
            mergedClaims = {};
        }
        else {
            try {
                mergedClaims = JSON.parse(claims);
            }
            catch (e) {
                throw ClientConfigurationError.createInvalidClaimsRequestError();
            }
        }
        if (clientCapabilities && clientCapabilities.length > 0) {
            if (!mergedClaims.hasOwnProperty(ClaimsRequestKeys.ACCESS_TOKEN)) {
                // Add access_token key to claims object
                mergedClaims[ClaimsRequestKeys.ACCESS_TOKEN] = {};
            }
            // Add xms_cc claim with provided clientCapabilities to access_token key
            mergedClaims[ClaimsRequestKeys.ACCESS_TOKEN][ClaimsRequestKeys.XMS_CC] = {
                values: clientCapabilities
            };
        }
        return JSON.stringify(mergedClaims);
    };
    /**
     * adds `username` for Password Grant flow
     * @param username
     */
    RequestParameterBuilder.prototype.addUsername = function (username) {
        this.parameters.set(PasswordGrantConstants.username, encodeURIComponent(username));
    };
    /**
     * adds `password` for Password Grant flow
     * @param password
     */
    RequestParameterBuilder.prototype.addPassword = function (password) {
        this.parameters.set(PasswordGrantConstants.password, encodeURIComponent(password));
    };
    /**
     * add pop_jwk to query params
     * @param cnfString
     */
    RequestParameterBuilder.prototype.addPopToken = function (cnfString) {
        if (!StringUtils.isEmpty(cnfString)) {
            this.parameters.set(AADServerParamKeys.TOKEN_TYPE, exports.AuthenticationScheme.POP);
            this.parameters.set(AADServerParamKeys.REQ_CNF, encodeURIComponent(cnfString));
        }
    };
    /**
     * add SSH JWK and key ID to query params
     */
    RequestParameterBuilder.prototype.addSshJwk = function (sshJwkString) {
        if (!StringUtils.isEmpty(sshJwkString)) {
            this.parameters.set(AADServerParamKeys.TOKEN_TYPE, exports.AuthenticationScheme.SSH);
            this.parameters.set(AADServerParamKeys.REQ_CNF, encodeURIComponent(sshJwkString));
        }
    };
    /**
     * add server telemetry fields
     * @param serverTelemetryManager
     */
    RequestParameterBuilder.prototype.addServerTelemetry = function (serverTelemetryManager) {
        this.parameters.set(AADServerParamKeys.X_CLIENT_CURR_TELEM, serverTelemetryManager.generateCurrentRequestHeaderValue());
        this.parameters.set(AADServerParamKeys.X_CLIENT_LAST_TELEM, serverTelemetryManager.generateLastRequestHeaderValue());
    };
    /**
     * Adds parameter that indicates to the server that throttling is supported
     */
    RequestParameterBuilder.prototype.addThrottling = function () {
        this.parameters.set(AADServerParamKeys.X_MS_LIB_CAPABILITY, ThrottlingConstants.X_MS_LIB_CAPABILITY_VALUE);
    };
    /**
     * Adds logout_hint parameter for "silent" logout which prevent server account picker
     */
    RequestParameterBuilder.prototype.addLogoutHint = function (logoutHint) {
        this.parameters.set(AADServerParamKeys.LOGOUT_HINT, encodeURIComponent(logoutHint));
    };
    /**
     * Utility to create a URL from the params map
     */
    RequestParameterBuilder.prototype.createQueryString = function () {
        var queryParameterArray = new Array();
        this.parameters.forEach(function (value, key) {
            queryParameterArray.push(key + "=" + value);
        });
        return queryParameterArray.join("&");
    };
    return RequestParameterBuilder;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * ID_TOKEN Cache
 *
 * Key:Value Schema:
 *
 * Key Example: uid.utid-login.microsoftonline.com-idtoken-clientId-contoso.com-
 *
 * Value Schema:
 * {
 *      homeAccountId: home account identifier for the auth scheme,
 *      environment: entity that issued the token, represented as a full host
 *      credentialType: Type of credential as a string, can be one of the following: RefreshToken, AccessToken, IdToken, Password, Cookie, Certificate, Other
 *      clientId: client ID of the application
 *      secret: Actual credential as a string
 *      realm: Full tenant or organizational identifier that the account belongs to
 * }
 */
var IdTokenEntity = /** @class */ (function (_super) {
    __extends(IdTokenEntity, _super);
    function IdTokenEntity() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    /**
     * Create IdTokenEntity
     * @param homeAccountId
     * @param authenticationResult
     * @param clientId
     * @param authority
     */
    IdTokenEntity.createIdTokenEntity = function (homeAccountId, environment, idToken, clientId, tenantId) {
        var idTokenEntity = new IdTokenEntity();
        idTokenEntity.credentialType = exports.CredentialType.ID_TOKEN;
        idTokenEntity.homeAccountId = homeAccountId;
        idTokenEntity.environment = environment;
        idTokenEntity.clientId = clientId;
        idTokenEntity.secret = idToken;
        idTokenEntity.realm = tenantId;
        return idTokenEntity;
    };
    /**
     * Validates an entity: checks for all expected params
     * @param entity
     */
    IdTokenEntity.isIdTokenEntity = function (entity) {
        if (!entity) {
            return false;
        }
        return (entity.hasOwnProperty("homeAccountId") &&
            entity.hasOwnProperty("environment") &&
            entity.hasOwnProperty("credentialType") &&
            entity.hasOwnProperty("realm") &&
            entity.hasOwnProperty("clientId") &&
            entity.hasOwnProperty("secret") &&
            entity["credentialType"] === exports.CredentialType.ID_TOKEN);
    };
    return IdTokenEntity;
}(CredentialEntity));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Utility class which exposes functions for managing date and time operations.
 */
var TimeUtils = /** @class */ (function () {
    function TimeUtils() {
    }
    /**
     * return the current time in Unix time (seconds).
     */
    TimeUtils.nowSeconds = function () {
        // Date.getTime() returns in milliseconds.
        return Math.round(new Date().getTime() / 1000.0);
    };
    /**
     * check if a token is expired based on given UTC time in seconds.
     * @param expiresOn
     */
    TimeUtils.isTokenExpired = function (expiresOn, offset) {
        // check for access token expiry
        var expirationSec = Number(expiresOn) || 0;
        var offsetCurrentTimeSec = TimeUtils.nowSeconds() + offset;
        // If current time + offset is greater than token expiration time, then token is expired.
        return (offsetCurrentTimeSec > expirationSec);
    };
    /**
     * If the current time is earlier than the time that a token was cached at, we must discard the token
     * i.e. The system clock was turned back after acquiring the cached token
     * @param cachedAt
     * @param offset
     */
    TimeUtils.wasClockTurnedBack = function (cachedAt) {
        var cachedAtSec = Number(cachedAt);
        return cachedAtSec > TimeUtils.nowSeconds();
    };
    /**
     * Waits for t number of milliseconds
     * @param t number
     * @param value T
     */
    TimeUtils.delay = function (t, value) {
        return new Promise(function (resolve) { return setTimeout(function () { return resolve(value); }, t); });
    };
    return TimeUtils;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * ACCESS_TOKEN Credential Type
 *
 * Key:Value Schema:
 *
 * Key Example: uid.utid-login.microsoftonline.com-accesstoken-clientId-contoso.com-user.read
 *
 * Value Schema:
 * {
 *      homeAccountId: home account identifier for the auth scheme,
 *      environment: entity that issued the token, represented as a full host
 *      credentialType: Type of credential as a string, can be one of the following: RefreshToken, AccessToken, IdToken, Password, Cookie, Certificate, Other
 *      clientId: client ID of the application
 *      secret: Actual credential as a string
 *      familyId: Family ID identifier, usually only used for refresh tokens
 *      realm: Full tenant or organizational identifier that the account belongs to
 *      target: Permissions that are included in the token, or for refresh tokens, the resource identifier.
 *      cachedAt: Absolute device time when entry was created in the cache.
 *      expiresOn: Token expiry time, calculated based on current UTC time in seconds. Represented as a string.
 *      extendedExpiresOn: Additional extended expiry time until when token is valid in case of server-side outage. Represented as string in UTC seconds.
 *      keyId: used for POP and SSH tokenTypes
 *      tokenType: Type of the token issued. Usually "Bearer"
 * }
 */
var AccessTokenEntity = /** @class */ (function (_super) {
    __extends(AccessTokenEntity, _super);
    function AccessTokenEntity() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    /**
     * Create AccessTokenEntity
     * @param homeAccountId
     * @param environment
     * @param accessToken
     * @param clientId
     * @param tenantId
     * @param scopes
     * @param expiresOn
     * @param extExpiresOn
     */
    AccessTokenEntity.createAccessTokenEntity = function (homeAccountId, environment, accessToken, clientId, tenantId, scopes, expiresOn, extExpiresOn, cryptoUtils, refreshOn, tokenType, userAssertionHash, keyId, requestedClaims, requestedClaimsHash) {
        var _a, _b;
        var atEntity = new AccessTokenEntity();
        atEntity.homeAccountId = homeAccountId;
        atEntity.credentialType = exports.CredentialType.ACCESS_TOKEN;
        atEntity.secret = accessToken;
        var currentTime = TimeUtils.nowSeconds();
        atEntity.cachedAt = currentTime.toString();
        /*
         * Token expiry time.
         * This value should be  calculated based on the current UTC time measured locally and the value  expires_in Represented as a string in JSON.
         */
        atEntity.expiresOn = expiresOn.toString();
        atEntity.extendedExpiresOn = extExpiresOn.toString();
        if (refreshOn) {
            atEntity.refreshOn = refreshOn.toString();
        }
        atEntity.environment = environment;
        atEntity.clientId = clientId;
        atEntity.realm = tenantId;
        atEntity.target = scopes;
        atEntity.userAssertionHash = userAssertionHash;
        atEntity.tokenType = StringUtils.isEmpty(tokenType) ? exports.AuthenticationScheme.BEARER : tokenType;
        if (requestedClaims) {
            atEntity.requestedClaims = requestedClaims;
            atEntity.requestedClaimsHash = requestedClaimsHash;
        }
        /*
         * Create Access Token With Auth Scheme instead of regular access token
         * Cast to lower to handle "bearer" from ADFS
         */
        if (((_a = atEntity.tokenType) === null || _a === void 0 ? void 0 : _a.toLowerCase()) !== exports.AuthenticationScheme.BEARER.toLowerCase()) {
            atEntity.credentialType = exports.CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME;
            switch (atEntity.tokenType) {
                case exports.AuthenticationScheme.POP:
                    // Make sure keyId is present and add it to credential
                    var tokenClaims = AuthToken.extractTokenClaims(accessToken, cryptoUtils);
                    if (!((_b = tokenClaims === null || tokenClaims === void 0 ? void 0 : tokenClaims.cnf) === null || _b === void 0 ? void 0 : _b.kid)) {
                        throw ClientAuthError.createTokenClaimsRequiredError();
                    }
                    atEntity.keyId = tokenClaims.cnf.kid;
                    break;
                case exports.AuthenticationScheme.SSH:
                    atEntity.keyId = keyId;
            }
        }
        return atEntity;
    };
    /**
     * Validates an entity: checks for all expected params
     * @param entity
     */
    AccessTokenEntity.isAccessTokenEntity = function (entity) {
        if (!entity) {
            return false;
        }
        return (entity.hasOwnProperty("homeAccountId") &&
            entity.hasOwnProperty("environment") &&
            entity.hasOwnProperty("credentialType") &&
            entity.hasOwnProperty("realm") &&
            entity.hasOwnProperty("clientId") &&
            entity.hasOwnProperty("secret") &&
            entity.hasOwnProperty("target") &&
            (entity["credentialType"] === exports.CredentialType.ACCESS_TOKEN || entity["credentialType"] === exports.CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME));
    };
    return AccessTokenEntity;
}(CredentialEntity));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * REFRESH_TOKEN Cache
 *
 * Key:Value Schema:
 *
 * Key Example: uid.utid-login.microsoftonline.com-refreshtoken-clientId--
 *
 * Value:
 * {
 *      homeAccountId: home account identifier for the auth scheme,
 *      environment: entity that issued the token, represented as a full host
 *      credentialType: Type of credential as a string, can be one of the following: RefreshToken, AccessToken, IdToken, Password, Cookie, Certificate, Other
 *      clientId: client ID of the application
 *      secret: Actual credential as a string
 *      familyId: Family ID identifier, '1' represents Microsoft Family
 *      realm: Full tenant or organizational identifier that the account belongs to
 *      target: Permissions that are included in the token, or for refresh tokens, the resource identifier.
 * }
 */
var RefreshTokenEntity = /** @class */ (function (_super) {
    __extends(RefreshTokenEntity, _super);
    function RefreshTokenEntity() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    /**
     * Create RefreshTokenEntity
     * @param homeAccountId
     * @param authenticationResult
     * @param clientId
     * @param authority
     */
    RefreshTokenEntity.createRefreshTokenEntity = function (homeAccountId, environment, refreshToken, clientId, familyId, userAssertionHash) {
        var rtEntity = new RefreshTokenEntity();
        rtEntity.clientId = clientId;
        rtEntity.credentialType = exports.CredentialType.REFRESH_TOKEN;
        rtEntity.environment = environment;
        rtEntity.homeAccountId = homeAccountId;
        rtEntity.secret = refreshToken;
        rtEntity.userAssertionHash = userAssertionHash;
        if (familyId)
            rtEntity.familyId = familyId;
        return rtEntity;
    };
    /**
     * Validates an entity: checks for all expected params
     * @param entity
     */
    RefreshTokenEntity.isRefreshTokenEntity = function (entity) {
        if (!entity) {
            return false;
        }
        return (entity.hasOwnProperty("homeAccountId") &&
            entity.hasOwnProperty("environment") &&
            entity.hasOwnProperty("credentialType") &&
            entity.hasOwnProperty("clientId") &&
            entity.hasOwnProperty("secret") &&
            entity["credentialType"] === exports.CredentialType.REFRESH_TOKEN);
    };
    return RefreshTokenEntity;
}(CredentialEntity));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * InteractionRequiredServerErrorMessage contains string constants used by error codes and messages returned by the server indicating interaction is required
 */
var InteractionRequiredServerErrorMessage = [
    "interaction_required",
    "consent_required",
    "login_required"
];
var InteractionRequiredAuthSubErrorMessage = [
    "message_only",
    "additional_action",
    "basic_action",
    "user_password_expired",
    "consent_required"
];
/**
 * Interaction required errors defined by the SDK
 */
var InteractionRequiredAuthErrorMessage = {
    noTokensFoundError: {
        code: "no_tokens_found",
        desc: "No refresh token found in the cache. Please sign-in."
    },
    native_account_unavailable: {
        code: "native_account_unavailable",
        desc: "The requested account is not available in the native broker. It may have been deleted or logged out. Please sign-in again using an interactive API."
    }
};
/**
 * Error thrown when user interaction is required.
 */
var InteractionRequiredAuthError = /** @class */ (function (_super) {
    __extends(InteractionRequiredAuthError, _super);
    function InteractionRequiredAuthError(errorCode, errorMessage, subError) {
        var _this = _super.call(this, errorCode, errorMessage, subError) || this;
        _this.name = "InteractionRequiredAuthError";
        Object.setPrototypeOf(_this, InteractionRequiredAuthError.prototype);
        return _this;
    }
    /**
     * Helper function used to determine if an error thrown by the server requires interaction to resolve
     * @param errorCode
     * @param errorString
     * @param subError
     */
    InteractionRequiredAuthError.isInteractionRequiredError = function (errorCode, errorString, subError) {
        var isInteractionRequiredErrorCode = !!errorCode && InteractionRequiredServerErrorMessage.indexOf(errorCode) > -1;
        var isInteractionRequiredSubError = !!subError && InteractionRequiredAuthSubErrorMessage.indexOf(subError) > -1;
        var isInteractionRequiredErrorDesc = !!errorString && InteractionRequiredServerErrorMessage.some(function (irErrorCode) {
            return errorString.indexOf(irErrorCode) > -1;
        });
        return isInteractionRequiredErrorCode || isInteractionRequiredErrorDesc || isInteractionRequiredSubError;
    };
    /**
     * Creates an error thrown when the authorization code required for a token request is null or empty.
     */
    InteractionRequiredAuthError.createNoTokensFoundError = function () {
        return new InteractionRequiredAuthError(InteractionRequiredAuthErrorMessage.noTokensFoundError.code, InteractionRequiredAuthErrorMessage.noTokensFoundError.desc);
    };
    /**
     * Creates an error thrown when the native broker returns ACCOUNT_UNAVAILABLE status, indicating that the account was removed and interactive sign-in is required
     * @returns
     */
    InteractionRequiredAuthError.createNativeAccountUnavailableError = function () {
        return new InteractionRequiredAuthError(InteractionRequiredAuthErrorMessage.native_account_unavailable.code, InteractionRequiredAuthErrorMessage.native_account_unavailable.desc);
    };
    return InteractionRequiredAuthError;
}(AuthError));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var CacheRecord = /** @class */ (function () {
    function CacheRecord(accountEntity, idTokenEntity, accessTokenEntity, refreshTokenEntity, appMetadataEntity) {
        this.account = accountEntity || null;
        this.idToken = idTokenEntity || null;
        this.accessToken = accessTokenEntity || null;
        this.refreshToken = refreshTokenEntity || null;
        this.appMetadata = appMetadataEntity || null;
    }
    return CacheRecord;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Class which provides helpers for OAuth 2.0 protocol specific values
 */
var ProtocolUtils = /** @class */ (function () {
    function ProtocolUtils() {
    }
    /**
     * Appends user state with random guid, or returns random guid.
     * @param userState
     * @param randomGuid
     */
    ProtocolUtils.setRequestState = function (cryptoObj, userState, meta) {
        var libraryState = ProtocolUtils.generateLibraryState(cryptoObj, meta);
        return !StringUtils.isEmpty(userState) ? "" + libraryState + Constants.RESOURCE_DELIM + userState : libraryState;
    };
    /**
     * Generates the state value used by the common library.
     * @param randomGuid
     * @param cryptoObj
     */
    ProtocolUtils.generateLibraryState = function (cryptoObj, meta) {
        if (!cryptoObj) {
            throw ClientAuthError.createNoCryptoObjectError("generateLibraryState");
        }
        // Create a state object containing a unique id and the timestamp of the request creation
        var stateObj = {
            id: cryptoObj.createNewGuid()
        };
        if (meta) {
            stateObj.meta = meta;
        }
        var stateString = JSON.stringify(stateObj);
        return cryptoObj.base64Encode(stateString);
    };
    /**
     * Parses the state into the RequestStateObject, which contains the LibraryState info and the state passed by the user.
     * @param state
     * @param cryptoObj
     */
    ProtocolUtils.parseRequestState = function (cryptoObj, state) {
        if (!cryptoObj) {
            throw ClientAuthError.createNoCryptoObjectError("parseRequestState");
        }
        if (StringUtils.isEmpty(state)) {
            throw ClientAuthError.createInvalidStateError(state, "Null, undefined or empty state");
        }
        try {
            // Split the state between library state and user passed state and decode them separately
            var splitState = state.split(Constants.RESOURCE_DELIM);
            var libraryState = splitState[0];
            var userState = splitState.length > 1 ? splitState.slice(1).join(Constants.RESOURCE_DELIM) : Constants.EMPTY_STRING;
            var libraryStateString = cryptoObj.base64Decode(libraryState);
            var libraryStateObj = JSON.parse(libraryStateString);
            return {
                userRequestState: !StringUtils.isEmpty(userState) ? userState : Constants.EMPTY_STRING,
                libraryState: libraryStateObj
            };
        }
        catch (e) {
            throw ClientAuthError.createInvalidStateError(state, e);
        }
    };
    return ProtocolUtils;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Url object class which can perform various transformations on url strings.
 */
var UrlString = /** @class */ (function () {
    function UrlString(url) {
        this._urlString = url;
        if (StringUtils.isEmpty(this._urlString)) {
            // Throws error if url is empty
            throw ClientConfigurationError.createUrlEmptyError();
        }
        if (StringUtils.isEmpty(this.getHash())) {
            this._urlString = UrlString.canonicalizeUri(url);
        }
    }
    Object.defineProperty(UrlString.prototype, "urlString", {
        get: function () {
            return this._urlString;
        },
        enumerable: false,
        configurable: true
    });
    /**
     * Ensure urls are lower case and end with a / character.
     * @param url
     */
    UrlString.canonicalizeUri = function (url) {
        if (url) {
            var lowerCaseUrl = url.toLowerCase();
            if (StringUtils.endsWith(lowerCaseUrl, "?")) {
                lowerCaseUrl = lowerCaseUrl.slice(0, -1);
            }
            else if (StringUtils.endsWith(lowerCaseUrl, "?/")) {
                lowerCaseUrl = lowerCaseUrl.slice(0, -2);
            }
            if (!StringUtils.endsWith(lowerCaseUrl, "/")) {
                lowerCaseUrl += "/";
            }
            return lowerCaseUrl;
        }
        return url;
    };
    /**
     * Throws if urlString passed is not a valid authority URI string.
     */
    UrlString.prototype.validateAsUri = function () {
        // Attempts to parse url for uri components
        var components;
        try {
            components = this.getUrlComponents();
        }
        catch (e) {
            throw ClientConfigurationError.createUrlParseError(e);
        }
        // Throw error if URI or path segments are not parseable.
        if (!components.HostNameAndPort || !components.PathSegments) {
            throw ClientConfigurationError.createUrlParseError("Given url string: " + this.urlString);
        }
        // Throw error if uri is insecure.
        if (!components.Protocol || components.Protocol.toLowerCase() !== "https:") {
            throw ClientConfigurationError.createInsecureAuthorityUriError(this.urlString);
        }
    };
    /**
     * Given a url and a query string return the url with provided query string appended
     * @param url
     * @param queryString
     */
    UrlString.appendQueryString = function (url, queryString) {
        if (StringUtils.isEmpty(queryString)) {
            return url;
        }
        return url.indexOf("?") < 0 ? url + "?" + queryString : url + "&" + queryString;
    };
    /**
     * Returns a url with the hash removed
     * @param url
     */
    UrlString.removeHashFromUrl = function (url) {
        return UrlString.canonicalizeUri(url.split("#")[0]);
    };
    /**
     * Given a url like https://a:b/common/d?e=f#g, and a tenantId, returns https://a:b/tenantId/d
     * @param href The url
     * @param tenantId The tenant id to replace
     */
    UrlString.prototype.replaceTenantPath = function (tenantId) {
        var urlObject = this.getUrlComponents();
        var pathArray = urlObject.PathSegments;
        if (tenantId && (pathArray.length !== 0 && (pathArray[0] === AADAuthorityConstants.COMMON || pathArray[0] === AADAuthorityConstants.ORGANIZATIONS))) {
            pathArray[0] = tenantId;
        }
        return UrlString.constructAuthorityUriFromObject(urlObject);
    };
    /**
     * Returns the anchor part(#) of the URL
     */
    UrlString.prototype.getHash = function () {
        return UrlString.parseHash(this.urlString);
    };
    /**
     * Parses out the components from a url string.
     * @returns An object with the various components. Please cache this value insted of calling this multiple times on the same url.
     */
    UrlString.prototype.getUrlComponents = function () {
        // https://gist.github.com/curtisz/11139b2cfcaef4a261e0
        var regEx = RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?");
        // If url string does not match regEx, we throw an error
        var match = this.urlString.match(regEx);
        if (!match) {
            throw ClientConfigurationError.createUrlParseError("Given url string: " + this.urlString);
        }
        // Url component object
        var urlComponents = {
            Protocol: match[1],
            HostNameAndPort: match[4],
            AbsolutePath: match[5],
            QueryString: match[7]
        };
        var pathSegments = urlComponents.AbsolutePath.split("/");
        pathSegments = pathSegments.filter(function (val) { return val && val.length > 0; }); // remove empty elements
        urlComponents.PathSegments = pathSegments;
        if (!StringUtils.isEmpty(urlComponents.QueryString) && urlComponents.QueryString.endsWith("/")) {
            urlComponents.QueryString = urlComponents.QueryString.substring(0, urlComponents.QueryString.length - 1);
        }
        return urlComponents;
    };
    UrlString.getDomainFromUrl = function (url) {
        var regEx = RegExp("^([^:/?#]+://)?([^/?#]*)");
        var match = url.match(regEx);
        if (!match) {
            throw ClientConfigurationError.createUrlParseError("Given url string: " + url);
        }
        return match[2];
    };
    UrlString.getAbsoluteUrl = function (relativeUrl, baseUrl) {
        if (relativeUrl[0] === Constants.FORWARD_SLASH) {
            var url = new UrlString(baseUrl);
            var baseComponents = url.getUrlComponents();
            return baseComponents.Protocol + "//" + baseComponents.HostNameAndPort + relativeUrl;
        }
        return relativeUrl;
    };
    /**
     * Parses hash string from given string. Returns empty string if no hash symbol is found.
     * @param hashString
     */
    UrlString.parseHash = function (hashString) {
        var hashIndex1 = hashString.indexOf("#");
        var hashIndex2 = hashString.indexOf("#/");
        if (hashIndex2 > -1) {
            return hashString.substring(hashIndex2 + 2);
        }
        else if (hashIndex1 > -1) {
            return hashString.substring(hashIndex1 + 1);
        }
        return Constants.EMPTY_STRING;
    };
    UrlString.constructAuthorityUriFromObject = function (urlObject) {
        return new UrlString(urlObject.Protocol + "//" + urlObject.HostNameAndPort + "/" + urlObject.PathSegments.join("/"));
    };
    /**
     * Returns URL hash as server auth code response object.
     */
    UrlString.getDeserializedHash = function (hash) {
        // Check if given hash is empty
        if (StringUtils.isEmpty(hash)) {
            return {};
        }
        // Strip the # symbol if present
        var parsedHash = UrlString.parseHash(hash);
        // If # symbol was not present, above will return empty string, so give original hash value
        var deserializedHash = StringUtils.queryStringToObject(StringUtils.isEmpty(parsedHash) ? hash : parsedHash);
        // Check if deserialization didn't work
        if (!deserializedHash) {
            throw ClientAuthError.createHashNotDeserializedError(JSON.stringify(deserializedHash));
        }
        return deserializedHash;
    };
    /**
     * Check if the hash of the URL string contains known properties
     */
    UrlString.hashContainsKnownProperties = function (hash) {
        if (StringUtils.isEmpty(hash) || hash.indexOf("=") < 0) {
            // Hash doesn't contain key/value pairs
            return false;
        }
        var parameters = UrlString.getDeserializedHash(hash);
        return !!(parameters.code ||
            parameters.error_description ||
            parameters.error ||
            parameters.state);
    };
    return UrlString;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var KeyLocation;
(function (KeyLocation) {
    KeyLocation["SW"] = "sw";
    KeyLocation["UHW"] = "uhw";
})(KeyLocation || (KeyLocation = {}));
var PopTokenGenerator = /** @class */ (function () {
    function PopTokenGenerator(cryptoUtils) {
        this.cryptoUtils = cryptoUtils;
    }
    /**
     * Generates the req_cnf validated at the RP in the POP protocol for SHR parameters
     * and returns an object containing the keyid, the full req_cnf string and the req_cnf string hash
     * @param request
     * @returns
     */
    PopTokenGenerator.prototype.generateCnf = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var reqCnf, reqCnfString, _a;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0: return [4 /*yield*/, this.generateKid(request)];
                    case 1:
                        reqCnf = _b.sent();
                        reqCnfString = this.cryptoUtils.base64Encode(JSON.stringify(reqCnf));
                        _a = {
                            kid: reqCnf.kid,
                            reqCnfString: reqCnfString
                        };
                        return [4 /*yield*/, this.cryptoUtils.hashString(reqCnfString)];
                    case 2: return [2 /*return*/, (_a.reqCnfHash = _b.sent(),
                            _a)];
                }
            });
        });
    };
    /**
     * Generates key_id for a SHR token request
     * @param request
     * @returns
     */
    PopTokenGenerator.prototype.generateKid = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var kidThumbprint;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.cryptoUtils.getPublicKeyThumbprint(request)];
                    case 1:
                        kidThumbprint = _a.sent();
                        return [2 /*return*/, {
                                kid: kidThumbprint,
                                xms_ksl: KeyLocation.SW
                            }];
                }
            });
        });
    };
    /**
     * Signs the POP access_token with the local generated key-pair
     * @param accessToken
     * @param request
     * @returns
     */
    PopTokenGenerator.prototype.signPopToken = function (accessToken, keyId, request) {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                return [2 /*return*/, this.signPayload(accessToken, keyId, request)];
            });
        });
    };
    /**
     * Utility function to generate the signed JWT for an access_token
     * @param payload
     * @param kid
     * @param request
     * @param claims
     * @returns
     */
    PopTokenGenerator.prototype.signPayload = function (payload, keyId, request, claims) {
        return __awaiter(this, void 0, void 0, function () {
            var resourceRequestMethod, resourceRequestUri, shrClaims, shrNonce, resourceUrlString, resourceUrlComponents;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        resourceRequestMethod = request.resourceRequestMethod, resourceRequestUri = request.resourceRequestUri, shrClaims = request.shrClaims, shrNonce = request.shrNonce;
                        resourceUrlString = (resourceRequestUri) ? new UrlString(resourceRequestUri) : undefined;
                        resourceUrlComponents = resourceUrlString === null || resourceUrlString === void 0 ? void 0 : resourceUrlString.getUrlComponents();
                        return [4 /*yield*/, this.cryptoUtils.signJwt(__assign({ at: payload, ts: TimeUtils.nowSeconds(), m: resourceRequestMethod === null || resourceRequestMethod === void 0 ? void 0 : resourceRequestMethod.toUpperCase(), u: resourceUrlComponents === null || resourceUrlComponents === void 0 ? void 0 : resourceUrlComponents.HostNameAndPort, nonce: shrNonce || this.cryptoUtils.createNewGuid(), p: resourceUrlComponents === null || resourceUrlComponents === void 0 ? void 0 : resourceUrlComponents.AbsolutePath, q: (resourceUrlComponents === null || resourceUrlComponents === void 0 ? void 0 : resourceUrlComponents.QueryString) ? [[], resourceUrlComponents.QueryString] : undefined, client_claims: shrClaims || undefined }, claims), keyId, request.correlationId)];
                    case 1: return [2 /*return*/, _a.sent()];
                }
            });
        });
    };
    return PopTokenGenerator;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * APP_METADATA Cache
 *
 * Key:Value Schema:
 *
 * Key: appmetadata-<environment>-<client_id>
 *
 * Value:
 * {
 *      clientId: client ID of the application
 *      environment: entity that issued the token, represented as a full host
 *      familyId: Family ID identifier, '1' represents Microsoft Family
 * }
 */
var AppMetadataEntity = /** @class */ (function () {
    function AppMetadataEntity() {
    }
    /**
     * Generate AppMetadata Cache Key as per the schema: appmetadata-<environment>-<client_id>
     */
    AppMetadataEntity.prototype.generateAppMetadataKey = function () {
        return AppMetadataEntity.generateAppMetadataCacheKey(this.environment, this.clientId);
    };
    /**
     * Generate AppMetadata Cache Key
     */
    AppMetadataEntity.generateAppMetadataCacheKey = function (environment, clientId) {
        var appMetaDataKeyArray = [
            APP_METADATA,
            environment,
            clientId,
        ];
        return appMetaDataKeyArray.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();
    };
    /**
     * Creates AppMetadataEntity
     * @param clientId
     * @param environment
     * @param familyId
     */
    AppMetadataEntity.createAppMetadataEntity = function (clientId, environment, familyId) {
        var appMetadata = new AppMetadataEntity();
        appMetadata.clientId = clientId;
        appMetadata.environment = environment;
        if (familyId) {
            appMetadata.familyId = familyId;
        }
        return appMetadata;
    };
    /**
     * Validates an entity: checks for all expected params
     * @param entity
     */
    AppMetadataEntity.isAppMetadataEntity = function (key, entity) {
        if (!entity) {
            return false;
        }
        return (key.indexOf(APP_METADATA) === 0 &&
            entity.hasOwnProperty("clientId") &&
            entity.hasOwnProperty("environment"));
    };
    return AppMetadataEntity;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * This class instance helps track the memory changes facilitating
 * decisions to read from and write to the persistent cache
 */ var TokenCacheContext = /** @class */ (function () {
    function TokenCacheContext(tokenCache, hasChanged) {
        this.cache = tokenCache;
        this.hasChanged = hasChanged;
    }
    Object.defineProperty(TokenCacheContext.prototype, "cacheHasChanged", {
        /**
         * boolean which indicates the changes in cache
         */
        get: function () {
            return this.hasChanged;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(TokenCacheContext.prototype, "tokenCache", {
        /**
         * function to retrieve the token cache
         */
        get: function () {
            return this.cache;
        },
        enumerable: false,
        configurable: true
    });
    return TokenCacheContext;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Class that handles response parsing.
 */
var ResponseHandler = /** @class */ (function () {
    function ResponseHandler(clientId, cacheStorage, cryptoObj, logger, serializableCache, persistencePlugin) {
        this.clientId = clientId;
        this.cacheStorage = cacheStorage;
        this.cryptoObj = cryptoObj;
        this.logger = logger;
        this.serializableCache = serializableCache;
        this.persistencePlugin = persistencePlugin;
    }
    /**
     * Function which validates server authorization code response.
     * @param serverResponseHash
     * @param cachedState
     * @param cryptoObj
     */
    ResponseHandler.prototype.validateServerAuthorizationCodeResponse = function (serverResponseHash, cachedState, cryptoObj) {
        if (!serverResponseHash.state || !cachedState) {
            throw !serverResponseHash.state ? ClientAuthError.createStateNotFoundError("Server State") : ClientAuthError.createStateNotFoundError("Cached State");
        }
        if (decodeURIComponent(serverResponseHash.state) !== decodeURIComponent(cachedState)) {
            throw ClientAuthError.createStateMismatchError();
        }
        // Check for error
        if (serverResponseHash.error || serverResponseHash.error_description || serverResponseHash.suberror) {
            if (InteractionRequiredAuthError.isInteractionRequiredError(serverResponseHash.error, serverResponseHash.error_description, serverResponseHash.suberror)) {
                throw new InteractionRequiredAuthError(serverResponseHash.error || Constants.EMPTY_STRING, serverResponseHash.error_description, serverResponseHash.suberror);
            }
            throw new ServerError(serverResponseHash.error || Constants.EMPTY_STRING, serverResponseHash.error_description, serverResponseHash.suberror);
        }
        if (serverResponseHash.client_info) {
            buildClientInfo(serverResponseHash.client_info, cryptoObj);
        }
    };
    /**
     * Function which validates server authorization token response.
     * @param serverResponse
     */
    ResponseHandler.prototype.validateTokenResponse = function (serverResponse) {
        // Check for error
        if (serverResponse.error || serverResponse.error_description || serverResponse.suberror) {
            if (InteractionRequiredAuthError.isInteractionRequiredError(serverResponse.error, serverResponse.error_description, serverResponse.suberror)) {
                throw new InteractionRequiredAuthError(serverResponse.error, serverResponse.error_description, serverResponse.suberror);
            }
            var errString = serverResponse.error_codes + " - [" + serverResponse.timestamp + "]: " + serverResponse.error_description + " - Correlation ID: " + serverResponse.correlation_id + " - Trace ID: " + serverResponse.trace_id;
            throw new ServerError(serverResponse.error, errString, serverResponse.suberror);
        }
    };
    /**
     * Returns a constructed token response based on given string. Also manages the cache updates and cleanups.
     * @param serverTokenResponse
     * @param authority
     */
    ResponseHandler.prototype.handleServerTokenResponse = function (serverTokenResponse, authority, reqTimestamp, request, authCodePayload, userAssertionHash, handlingRefreshTokenResponse, forceCacheRefreshTokenResponse) {
        return __awaiter(this, void 0, void 0, function () {
            var idTokenObj, requestStateObj, cacheRecord, cacheContext, key, account;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        if (serverTokenResponse.id_token) {
                            idTokenObj = new AuthToken(serverTokenResponse.id_token || Constants.EMPTY_STRING, this.cryptoObj);
                            // token nonce check (TODO: Add a warning if no nonce is given?)
                            if (authCodePayload && !StringUtils.isEmpty(authCodePayload.nonce)) {
                                if (idTokenObj.claims.nonce !== authCodePayload.nonce) {
                                    throw ClientAuthError.createNonceMismatchError();
                                }
                            }
                        }
                        // generate homeAccountId
                        this.homeAccountIdentifier = AccountEntity.generateHomeAccountId(serverTokenResponse.client_info || Constants.EMPTY_STRING, authority.authorityType, this.logger, this.cryptoObj, idTokenObj);
                        if (!!authCodePayload && !!authCodePayload.state) {
                            requestStateObj = ProtocolUtils.parseRequestState(this.cryptoObj, authCodePayload.state);
                        }
                        // Add keyId from request to serverTokenResponse if defined
                        serverTokenResponse.key_id = serverTokenResponse.key_id || request.sshKid || undefined;
                        cacheRecord = this.generateCacheRecord(serverTokenResponse, authority, reqTimestamp, request, idTokenObj, userAssertionHash, authCodePayload);
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, , 5, 8]);
                        if (!(this.persistencePlugin && this.serializableCache)) return [3 /*break*/, 3];
                        this.logger.verbose("Persistence enabled, calling beforeCacheAccess");
                        cacheContext = new TokenCacheContext(this.serializableCache, true);
                        return [4 /*yield*/, this.persistencePlugin.beforeCacheAccess(cacheContext)];
                    case 2:
                        _a.sent();
                        _a.label = 3;
                    case 3:
                        /*
                         * When saving a refreshed tokens to the cache, it is expected that the account that was used is present in the cache.
                         * If not present, we should return null, as it's the case that another application called removeAccount in between
                         * the calls to getAllAccounts and acquireTokenSilent. We should not overwrite that removal, unless explicitly flagged by
                         * the developer, as in the case of refresh token flow used in ADAL Node to MSAL Node migration.
                         */
                        if (handlingRefreshTokenResponse && !forceCacheRefreshTokenResponse && cacheRecord.account) {
                            key = cacheRecord.account.generateAccountKey();
                            account = this.cacheStorage.getAccount(key);
                            if (!account) {
                                this.logger.warning("Account used to refresh tokens not in persistence, refreshed tokens will not be stored in the cache");
                                return [2 /*return*/, ResponseHandler.generateAuthenticationResult(this.cryptoObj, authority, cacheRecord, false, request, idTokenObj, requestStateObj, undefined)];
                            }
                        }
                        return [4 /*yield*/, this.cacheStorage.saveCacheRecord(cacheRecord)];
                    case 4:
                        _a.sent();
                        return [3 /*break*/, 8];
                    case 5:
                        if (!(this.persistencePlugin && this.serializableCache && cacheContext)) return [3 /*break*/, 7];
                        this.logger.verbose("Persistence enabled, calling afterCacheAccess");
                        return [4 /*yield*/, this.persistencePlugin.afterCacheAccess(cacheContext)];
                    case 6:
                        _a.sent();
                        _a.label = 7;
                    case 7: return [7 /*endfinally*/];
                    case 8: return [2 /*return*/, ResponseHandler.generateAuthenticationResult(this.cryptoObj, authority, cacheRecord, false, request, idTokenObj, requestStateObj, serverTokenResponse.spa_code)];
                }
            });
        });
    };
    /**
     * Generates CacheRecord
     * @param serverTokenResponse
     * @param idTokenObj
     * @param authority
     */
    ResponseHandler.prototype.generateCacheRecord = function (serverTokenResponse, authority, reqTimestamp, request, idTokenObj, userAssertionHash, authCodePayload) {
        var env = authority.getPreferredCache();
        if (StringUtils.isEmpty(env)) {
            throw ClientAuthError.createInvalidCacheEnvironmentError();
        }
        // IdToken: non AAD scenarios can have empty realm
        var cachedIdToken;
        var cachedAccount;
        if (!StringUtils.isEmpty(serverTokenResponse.id_token) && !!idTokenObj) {
            cachedIdToken = IdTokenEntity.createIdTokenEntity(this.homeAccountIdentifier, env, serverTokenResponse.id_token || Constants.EMPTY_STRING, this.clientId, idTokenObj.claims.tid || Constants.EMPTY_STRING);
            cachedAccount = this.generateAccountEntity(serverTokenResponse, idTokenObj, authority, authCodePayload);
        }
        // AccessToken
        var cachedAccessToken = null;
        if (!StringUtils.isEmpty(serverTokenResponse.access_token)) {
            // If scopes not returned in server response, use request scopes
            var responseScopes = serverTokenResponse.scope ? ScopeSet.fromString(serverTokenResponse.scope) : new ScopeSet(request.scopes || []);
            /*
             * Use timestamp calculated before request
             * Server may return timestamps as strings, parse to numbers if so.
             */
            var expiresIn = (typeof serverTokenResponse.expires_in === "string" ? parseInt(serverTokenResponse.expires_in, 10) : serverTokenResponse.expires_in) || 0;
            var extExpiresIn = (typeof serverTokenResponse.ext_expires_in === "string" ? parseInt(serverTokenResponse.ext_expires_in, 10) : serverTokenResponse.ext_expires_in) || 0;
            var refreshIn = (typeof serverTokenResponse.refresh_in === "string" ? parseInt(serverTokenResponse.refresh_in, 10) : serverTokenResponse.refresh_in) || undefined;
            var tokenExpirationSeconds = reqTimestamp + expiresIn;
            var extendedTokenExpirationSeconds = tokenExpirationSeconds + extExpiresIn;
            var refreshOnSeconds = refreshIn && refreshIn > 0 ? reqTimestamp + refreshIn : undefined;
            // non AAD scenarios can have empty realm
            cachedAccessToken = AccessTokenEntity.createAccessTokenEntity(this.homeAccountIdentifier, env, serverTokenResponse.access_token || Constants.EMPTY_STRING, this.clientId, idTokenObj ? idTokenObj.claims.tid || Constants.EMPTY_STRING : authority.tenant, responseScopes.printScopes(), tokenExpirationSeconds, extendedTokenExpirationSeconds, this.cryptoObj, refreshOnSeconds, serverTokenResponse.token_type, userAssertionHash, serverTokenResponse.key_id, request.claims, request.requestedClaimsHash);
        }
        // refreshToken
        var cachedRefreshToken = null;
        if (!StringUtils.isEmpty(serverTokenResponse.refresh_token)) {
            cachedRefreshToken = RefreshTokenEntity.createRefreshTokenEntity(this.homeAccountIdentifier, env, serverTokenResponse.refresh_token || Constants.EMPTY_STRING, this.clientId, serverTokenResponse.foci, userAssertionHash);
        }
        // appMetadata
        var cachedAppMetadata = null;
        if (!StringUtils.isEmpty(serverTokenResponse.foci)) {
            cachedAppMetadata = AppMetadataEntity.createAppMetadataEntity(this.clientId, env, serverTokenResponse.foci);
        }
        return new CacheRecord(cachedAccount, cachedIdToken, cachedAccessToken, cachedRefreshToken, cachedAppMetadata);
    };
    /**
     * Generate Account
     * @param serverTokenResponse
     * @param idToken
     * @param authority
     */
    ResponseHandler.prototype.generateAccountEntity = function (serverTokenResponse, idToken, authority, authCodePayload) {
        var authorityType = authority.authorityType;
        var cloudGraphHostName = authCodePayload ? authCodePayload.cloud_graph_host_name : Constants.EMPTY_STRING;
        var msGraphhost = authCodePayload ? authCodePayload.msgraph_host : Constants.EMPTY_STRING;
        // ADFS does not require client_info in the response
        if (authorityType === exports.AuthorityType.Adfs) {
            this.logger.verbose("Authority type is ADFS, creating ADFS account");
            return AccountEntity.createGenericAccount(this.homeAccountIdentifier, idToken, authority, cloudGraphHostName, msGraphhost);
        }
        // This fallback applies to B2C as well as they fall under an AAD account type.
        if (StringUtils.isEmpty(serverTokenResponse.client_info) && authority.protocolMode === "AAD") {
            throw ClientAuthError.createClientInfoEmptyError();
        }
        return serverTokenResponse.client_info ?
            AccountEntity.createAccount(serverTokenResponse.client_info, this.homeAccountIdentifier, idToken, authority, cloudGraphHostName, msGraphhost) :
            AccountEntity.createGenericAccount(this.homeAccountIdentifier, idToken, authority, cloudGraphHostName, msGraphhost);
    };
    /**
     * Creates an @AuthenticationResult from @CacheRecord , @IdToken , and a boolean that states whether or not the result is from cache.
     *
     * Optionally takes a state string that is set as-is in the response.
     *
     * @param cacheRecord
     * @param idTokenObj
     * @param fromTokenCache
     * @param stateString
     */
    ResponseHandler.generateAuthenticationResult = function (cryptoObj, authority, cacheRecord, fromTokenCache, request, idTokenObj, requestState, code) {
        var _a, _b, _c;
        return __awaiter(this, void 0, void 0, function () {
            var accessToken, responseScopes, expiresOn, extExpiresOn, familyId, popTokenGenerator, _d, secret, keyId, uid, tid;
            return __generator(this, function (_e) {
                switch (_e.label) {
                    case 0:
                        accessToken = Constants.EMPTY_STRING;
                        responseScopes = [];
                        expiresOn = null;
                        familyId = Constants.EMPTY_STRING;
                        if (!cacheRecord.accessToken) return [3 /*break*/, 4];
                        if (!(cacheRecord.accessToken.tokenType === exports.AuthenticationScheme.POP)) return [3 /*break*/, 2];
                        popTokenGenerator = new PopTokenGenerator(cryptoObj);
                        _d = cacheRecord.accessToken, secret = _d.secret, keyId = _d.keyId;
                        if (!keyId) {
                            throw ClientAuthError.createKeyIdMissingError();
                        }
                        return [4 /*yield*/, popTokenGenerator.signPopToken(secret, keyId, request)];
                    case 1:
                        accessToken = _e.sent();
                        return [3 /*break*/, 3];
                    case 2:
                        accessToken = cacheRecord.accessToken.secret;
                        _e.label = 3;
                    case 3:
                        responseScopes = ScopeSet.fromString(cacheRecord.accessToken.target).asArray();
                        expiresOn = new Date(Number(cacheRecord.accessToken.expiresOn) * 1000);
                        extExpiresOn = new Date(Number(cacheRecord.accessToken.extendedExpiresOn) * 1000);
                        _e.label = 4;
                    case 4:
                        if (cacheRecord.appMetadata) {
                            familyId = cacheRecord.appMetadata.familyId === THE_FAMILY_ID ? THE_FAMILY_ID : Constants.EMPTY_STRING;
                        }
                        uid = (idTokenObj === null || idTokenObj === void 0 ? void 0 : idTokenObj.claims.oid) || (idTokenObj === null || idTokenObj === void 0 ? void 0 : idTokenObj.claims.sub) || Constants.EMPTY_STRING;
                        tid = (idTokenObj === null || idTokenObj === void 0 ? void 0 : idTokenObj.claims.tid) || Constants.EMPTY_STRING;
                        return [2 /*return*/, {
                                authority: authority.canonicalAuthority,
                                uniqueId: uid,
                                tenantId: tid,
                                scopes: responseScopes,
                                account: cacheRecord.account ? cacheRecord.account.getAccountInfo() : null,
                                idToken: idTokenObj ? idTokenObj.rawToken : Constants.EMPTY_STRING,
                                idTokenClaims: idTokenObj ? idTokenObj.claims : {},
                                accessToken: accessToken,
                                fromCache: fromTokenCache,
                                expiresOn: expiresOn,
                                correlationId: request.correlationId,
                                extExpiresOn: extExpiresOn,
                                familyId: familyId,
                                tokenType: ((_a = cacheRecord.accessToken) === null || _a === void 0 ? void 0 : _a.tokenType) || Constants.EMPTY_STRING,
                                state: requestState ? requestState.userRequestState : Constants.EMPTY_STRING,
                                cloudGraphHostName: ((_b = cacheRecord.account) === null || _b === void 0 ? void 0 : _b.cloudGraphHostName) || Constants.EMPTY_STRING,
                                msGraphHost: ((_c = cacheRecord.account) === null || _c === void 0 ? void 0 : _c.msGraphHost) || Constants.EMPTY_STRING,
                                code: code,
                                fromNativeBroker: false
                            }];
                }
            });
        });
    };
    return ResponseHandler;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Oauth2.0 Authorization Code client
 */
var AuthorizationCodeClient = /** @class */ (function (_super) {
    __extends(AuthorizationCodeClient, _super);
    function AuthorizationCodeClient(configuration) {
        var _this = _super.call(this, configuration) || this;
        // Flag to indicate if client is for hybrid spa auth code redemption
        _this.includeRedirectUri = true;
        return _this;
    }
    /**
     * Creates the URL of the authorization request letting the user input credentials and consent to the
     * application. The URL target the /authorize endpoint of the authority configured in the
     * application object.
     *
     * Once the user inputs their credentials and consents, the authority will send a response to the redirect URI
     * sent in the request and should contain an authorization code, which can then be used to acquire tokens via
     * acquireToken(AuthorizationCodeRequest)
     * @param request
     */
    AuthorizationCodeClient.prototype.getAuthCodeUrl = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var queryString;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.createAuthCodeUrlQueryString(request)];
                    case 1:
                        queryString = _a.sent();
                        return [2 /*return*/, UrlString.appendQueryString(this.authority.authorizationEndpoint, queryString)];
                }
            });
        });
    };
    /**
     * API to acquire a token in exchange of 'authorization_code` acquired by the user in the first leg of the
     * authorization_code_grant
     * @param request
     */
    AuthorizationCodeClient.prototype.acquireToken = function (request, authCodePayload) {
        return __awaiter(this, void 0, void 0, function () {
            var reqTimestamp, response, responseHandler;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.info("in acquireToken call");
                        if (!request || StringUtils.isEmpty(request.code)) {
                            throw ClientAuthError.createTokenRequestCannotBeMadeError();
                        }
                        reqTimestamp = TimeUtils.nowSeconds();
                        return [4 /*yield*/, this.executeTokenRequest(this.authority, request)];
                    case 1:
                        response = _a.sent();
                        responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, this.config.serializableCache, this.config.persistencePlugin);
                        // Validate response. This function throws a server error if an error is returned by the server.
                        responseHandler.validateTokenResponse(response.body);
                        return [4 /*yield*/, responseHandler.handleServerTokenResponse(response.body, this.authority, reqTimestamp, request, authCodePayload)];
                    case 2: return [2 /*return*/, _a.sent()];
                }
            });
        });
    };
    /**
     * Handles the hash fragment response from public client code request. Returns a code response used by
     * the client to exchange for a token in acquireToken.
     * @param hashFragment
     */
    AuthorizationCodeClient.prototype.handleFragmentResponse = function (hashFragment, cachedState) {
        // Handle responses.
        var responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, null, null);
        // Deserialize hash fragment response parameters.
        var hashUrlString = new UrlString(hashFragment);
        // Deserialize hash fragment response parameters.
        var serverParams = UrlString.getDeserializedHash(hashUrlString.getHash());
        // Get code response
        responseHandler.validateServerAuthorizationCodeResponse(serverParams, cachedState, this.cryptoUtils);
        // throw when there is no auth code in the response
        if (!serverParams.code) {
            throw ClientAuthError.createNoAuthCodeInServerResponseError();
        }
        return __assign(__assign({}, serverParams), { 
            // Code param is optional in ServerAuthorizationCodeResponse but required in AuthorizationCodePaylod
            code: serverParams.code });
    };
    /**
     * Used to log out the current user, and redirect the user to the postLogoutRedirectUri.
     * Default behaviour is to redirect the user to `window.location.href`.
     * @param authorityUri
     */
    AuthorizationCodeClient.prototype.getLogoutUri = function (logoutRequest) {
        // Throw error if logoutRequest is null/undefined
        if (!logoutRequest) {
            throw ClientConfigurationError.createEmptyLogoutRequestError();
        }
        var queryString = this.createLogoutUrlQueryString(logoutRequest);
        // Construct logout URI
        return UrlString.appendQueryString(this.authority.endSessionEndpoint, queryString);
    };
    /**
     * Executes POST request to token endpoint
     * @param authority
     * @param request
     */
    AuthorizationCodeClient.prototype.executeTokenRequest = function (authority, request) {
        return __awaiter(this, void 0, void 0, function () {
            var thumbprint, requestBody, queryParameters, ccsCredential, clientInfo, headers, endpoint;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        thumbprint = {
                            clientId: this.config.authOptions.clientId,
                            authority: authority.canonicalAuthority,
                            scopes: request.scopes,
                            claims: request.claims,
                            authenticationScheme: request.authenticationScheme,
                            resourceRequestMethod: request.resourceRequestMethod,
                            resourceRequestUri: request.resourceRequestUri,
                            shrClaims: request.shrClaims,
                            sshKid: request.sshKid
                        };
                        return [4 /*yield*/, this.createTokenRequestBody(request)];
                    case 1:
                        requestBody = _a.sent();
                        queryParameters = this.createTokenQueryParameters(request);
                        ccsCredential = undefined;
                        if (request.clientInfo) {
                            try {
                                clientInfo = buildClientInfo(request.clientInfo, this.cryptoUtils);
                                ccsCredential = {
                                    credential: "" + clientInfo.uid + Separators.CLIENT_INFO_SEPARATOR + clientInfo.utid,
                                    type: exports.CcsCredentialType.HOME_ACCOUNT_ID
                                };
                            }
                            catch (e) {
                                this.logger.verbose("Could not parse client info for CCS Header: " + e);
                            }
                        }
                        headers = this.createTokenRequestHeaders(ccsCredential || request.ccsCredential);
                        endpoint = StringUtils.isEmpty(queryParameters) ? authority.tokenEndpoint : authority.tokenEndpoint + "?" + queryParameters;
                        return [2 /*return*/, this.executePostToTokenEndpoint(endpoint, requestBody, headers, thumbprint)];
                }
            });
        });
    };
    /**
     * Creates query string for the /token request
     * @param request
     */
    AuthorizationCodeClient.prototype.createTokenQueryParameters = function (request) {
        var parameterBuilder = new RequestParameterBuilder();
        if (request.tokenQueryParameters) {
            parameterBuilder.addExtraQueryParameters(request.tokenQueryParameters);
        }
        return parameterBuilder.createQueryString();
    };
    /**
     * Generates a map for all the params to be sent to the service
     * @param request
     */
    AuthorizationCodeClient.prototype.createTokenRequestBody = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var parameterBuilder, clientAssertion, popTokenGenerator, reqCnfData, correlationId, ccsCred, clientInfo, clientInfo;
            var _a;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        parameterBuilder = new RequestParameterBuilder();
                        parameterBuilder.addClientId(this.config.authOptions.clientId);
                        /*
                         * For hybrid spa flow, there will be a code but no verifier
                         * In this scenario, don't include redirect uri as auth code will not be bound to redirect URI
                         */
                        if (!this.includeRedirectUri) {
                            // Just validate
                            RequestValidator.validateRedirectUri(request.redirectUri);
                        }
                        else {
                            // Validate and include redirect uri
                            parameterBuilder.addRedirectUri(request.redirectUri);
                        }
                        // Add scope array, parameter builder will add default scopes and dedupe
                        parameterBuilder.addScopes(request.scopes);
                        // add code: user set, not validated
                        parameterBuilder.addAuthorizationCode(request.code);
                        // Add library metadata
                        parameterBuilder.addLibraryInfo(this.config.libraryInfo);
                        parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);
                        parameterBuilder.addThrottling();
                        if (this.serverTelemetryManager) {
                            parameterBuilder.addServerTelemetry(this.serverTelemetryManager);
                        }
                        // add code_verifier if passed
                        if (request.codeVerifier) {
                            parameterBuilder.addCodeVerifier(request.codeVerifier);
                        }
                        if (this.config.clientCredentials.clientSecret) {
                            parameterBuilder.addClientSecret(this.config.clientCredentials.clientSecret);
                        }
                        if (this.config.clientCredentials.clientAssertion) {
                            clientAssertion = this.config.clientCredentials.clientAssertion;
                            parameterBuilder.addClientAssertion(clientAssertion.assertion);
                            parameterBuilder.addClientAssertionType(clientAssertion.assertionType);
                        }
                        parameterBuilder.addGrantType(GrantType.AUTHORIZATION_CODE_GRANT);
                        parameterBuilder.addClientInfo();
                        if (!(request.authenticationScheme === exports.AuthenticationScheme.POP)) return [3 /*break*/, 2];
                        popTokenGenerator = new PopTokenGenerator(this.cryptoUtils);
                        return [4 /*yield*/, popTokenGenerator.generateCnf(request)];
                    case 1:
                        reqCnfData = _b.sent();
                        // SPA PoP requires full Base64Url encoded req_cnf string (unhashed)
                        parameterBuilder.addPopToken(reqCnfData.reqCnfString);
                        return [3 /*break*/, 3];
                    case 2:
                        if (request.authenticationScheme === exports.AuthenticationScheme.SSH) {
                            if (request.sshJwk) {
                                parameterBuilder.addSshJwk(request.sshJwk);
                            }
                            else {
                                throw ClientConfigurationError.createMissingSshJwkError();
                            }
                        }
                        _b.label = 3;
                    case 3:
                        correlationId = request.correlationId || this.config.cryptoInterface.createNewGuid();
                        parameterBuilder.addCorrelationId(correlationId);
                        if (!StringUtils.isEmptyObj(request.claims) || this.config.authOptions.clientCapabilities && this.config.authOptions.clientCapabilities.length > 0) {
                            parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);
                        }
                        ccsCred = undefined;
                        if (request.clientInfo) {
                            try {
                                clientInfo = buildClientInfo(request.clientInfo, this.cryptoUtils);
                                ccsCred = {
                                    credential: "" + clientInfo.uid + Separators.CLIENT_INFO_SEPARATOR + clientInfo.utid,
                                    type: exports.CcsCredentialType.HOME_ACCOUNT_ID
                                };
                            }
                            catch (e) {
                                this.logger.verbose("Could not parse client info for CCS Header: " + e);
                            }
                        }
                        else {
                            ccsCred = request.ccsCredential;
                        }
                        // Adds these as parameters in the request instead of headers to prevent CORS preflight request
                        if (this.config.systemOptions.preventCorsPreflight && ccsCred) {
                            switch (ccsCred.type) {
                                case exports.CcsCredentialType.HOME_ACCOUNT_ID:
                                    try {
                                        clientInfo = buildClientInfoFromHomeAccountId(ccsCred.credential);
                                        parameterBuilder.addCcsOid(clientInfo);
                                    }
                                    catch (e) {
                                        this.logger.verbose("Could not parse home account ID for CCS Header: " + e);
                                    }
                                    break;
                                case exports.CcsCredentialType.UPN:
                                    parameterBuilder.addCcsUpn(ccsCred.credential);
                                    break;
                            }
                        }
                        if (request.tokenBodyParameters) {
                            parameterBuilder.addExtraQueryParameters(request.tokenBodyParameters);
                        }
                        // Add hybrid spa parameters if not already provided
                        if (request.enableSpaAuthorizationCode && (!request.tokenBodyParameters || !request.tokenBodyParameters[AADServerParamKeys.RETURN_SPA_CODE])) {
                            parameterBuilder.addExtraQueryParameters((_a = {},
                                _a[AADServerParamKeys.RETURN_SPA_CODE] = "1",
                                _a));
                        }
                        return [2 /*return*/, parameterBuilder.createQueryString()];
                }
            });
        });
    };
    /**
     * This API validates the `AuthorizationCodeUrlRequest` and creates a URL
     * @param request
     */
    AuthorizationCodeClient.prototype.createAuthCodeUrlQueryString = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var parameterBuilder, requestScopes, correlationId, accountSid, accountLoginHintClaim, clientInfo, clientInfo, clientInfo, popTokenGenerator, reqCnfData;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        parameterBuilder = new RequestParameterBuilder();
                        parameterBuilder.addClientId(this.config.authOptions.clientId);
                        requestScopes = __spreadArrays(request.scopes || [], request.extraScopesToConsent || []);
                        parameterBuilder.addScopes(requestScopes);
                        // validate the redirectUri (to be a non null value)
                        parameterBuilder.addRedirectUri(request.redirectUri);
                        correlationId = request.correlationId || this.config.cryptoInterface.createNewGuid();
                        parameterBuilder.addCorrelationId(correlationId);
                        // add response_mode. If not passed in it defaults to query.
                        parameterBuilder.addResponseMode(request.responseMode);
                        // add response_type = code
                        parameterBuilder.addResponseTypeCode();
                        // add library info parameters
                        parameterBuilder.addLibraryInfo(this.config.libraryInfo);
                        parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);
                        // add client_info=1
                        parameterBuilder.addClientInfo();
                        if (request.codeChallenge && request.codeChallengeMethod) {
                            parameterBuilder.addCodeChallengeParams(request.codeChallenge, request.codeChallengeMethod);
                        }
                        if (request.prompt) {
                            parameterBuilder.addPrompt(request.prompt);
                        }
                        if (request.domainHint) {
                            parameterBuilder.addDomainHint(request.domainHint);
                        }
                        // Add sid or loginHint with preference for login_hint claim (in request) -> sid -> loginHint (upn/email) -> username of AccountInfo object
                        if (request.prompt !== PromptValue.SELECT_ACCOUNT) {
                            // AAD will throw if prompt=select_account is passed with an account hint
                            if (request.sid && request.prompt === PromptValue.NONE) {
                                // SessionID is only used in silent calls
                                this.logger.verbose("createAuthCodeUrlQueryString: Prompt is none, adding sid from request");
                                parameterBuilder.addSid(request.sid);
                            }
                            else if (request.account) {
                                accountSid = this.extractAccountSid(request.account);
                                accountLoginHintClaim = this.extractLoginHint(request.account);
                                // If login_hint claim is present, use it over sid/username
                                if (accountLoginHintClaim) {
                                    this.logger.verbose("createAuthCodeUrlQueryString: login_hint claim present on account");
                                    parameterBuilder.addLoginHint(accountLoginHintClaim);
                                    try {
                                        clientInfo = buildClientInfoFromHomeAccountId(request.account.homeAccountId);
                                        parameterBuilder.addCcsOid(clientInfo);
                                    }
                                    catch (e) {
                                        this.logger.verbose("createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header");
                                    }
                                }
                                else if (accountSid && request.prompt === PromptValue.NONE) {
                                    /*
                                     * If account and loginHint are provided, we will check account first for sid before adding loginHint
                                     * SessionId is only used in silent calls
                                     */
                                    this.logger.verbose("createAuthCodeUrlQueryString: Prompt is none, adding sid from account");
                                    parameterBuilder.addSid(accountSid);
                                    try {
                                        clientInfo = buildClientInfoFromHomeAccountId(request.account.homeAccountId);
                                        parameterBuilder.addCcsOid(clientInfo);
                                    }
                                    catch (e) {
                                        this.logger.verbose("createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header");
                                    }
                                }
                                else if (request.loginHint) {
                                    this.logger.verbose("createAuthCodeUrlQueryString: Adding login_hint from request");
                                    parameterBuilder.addLoginHint(request.loginHint);
                                    parameterBuilder.addCcsUpn(request.loginHint);
                                }
                                else if (request.account.username) {
                                    // Fallback to account username if provided
                                    this.logger.verbose("createAuthCodeUrlQueryString: Adding login_hint from account");
                                    parameterBuilder.addLoginHint(request.account.username);
                                    try {
                                        clientInfo = buildClientInfoFromHomeAccountId(request.account.homeAccountId);
                                        parameterBuilder.addCcsOid(clientInfo);
                                    }
                                    catch (e) {
                                        this.logger.verbose("createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header");
                                    }
                                }
                            }
                            else if (request.loginHint) {
                                this.logger.verbose("createAuthCodeUrlQueryString: No account, adding login_hint from request");
                                parameterBuilder.addLoginHint(request.loginHint);
                                parameterBuilder.addCcsUpn(request.loginHint);
                            }
                        }
                        else {
                            this.logger.verbose("createAuthCodeUrlQueryString: Prompt is select_account, ignoring account hints");
                        }
                        if (request.nonce) {
                            parameterBuilder.addNonce(request.nonce);
                        }
                        if (request.state) {
                            parameterBuilder.addState(request.state);
                        }
                        if (!StringUtils.isEmpty(request.claims) || this.config.authOptions.clientCapabilities && this.config.authOptions.clientCapabilities.length > 0) {
                            parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);
                        }
                        if (request.extraQueryParameters) {
                            parameterBuilder.addExtraQueryParameters(request.extraQueryParameters);
                        }
                        if (!request.nativeBroker) return [3 /*break*/, 2];
                        // signal ests that this is a WAM call
                        parameterBuilder.addNativeBroker();
                        if (!(request.authenticationScheme === exports.AuthenticationScheme.POP)) return [3 /*break*/, 2];
                        popTokenGenerator = new PopTokenGenerator(this.cryptoUtils);
                        return [4 /*yield*/, popTokenGenerator.generateCnf(request)];
                    case 1:
                        reqCnfData = _a.sent();
                        parameterBuilder.addPopToken(reqCnfData.reqCnfHash);
                        _a.label = 2;
                    case 2: return [2 /*return*/, parameterBuilder.createQueryString()];
                }
            });
        });
    };
    /**
     * This API validates the `EndSessionRequest` and creates a URL
     * @param request
     */
    AuthorizationCodeClient.prototype.createLogoutUrlQueryString = function (request) {
        var parameterBuilder = new RequestParameterBuilder();
        if (request.postLogoutRedirectUri) {
            parameterBuilder.addPostLogoutRedirectUri(request.postLogoutRedirectUri);
        }
        if (request.correlationId) {
            parameterBuilder.addCorrelationId(request.correlationId);
        }
        if (request.idTokenHint) {
            parameterBuilder.addIdTokenHint(request.idTokenHint);
        }
        if (request.state) {
            parameterBuilder.addState(request.state);
        }
        if (request.logoutHint) {
            parameterBuilder.addLogoutHint(request.logoutHint);
        }
        if (request.extraQueryParameters) {
            parameterBuilder.addExtraQueryParameters(request.extraQueryParameters);
        }
        return parameterBuilder.createQueryString();
    };
    /**
     * Helper to get sid from account. Returns null if idTokenClaims are not present or sid is not present.
     * @param account
     */
    AuthorizationCodeClient.prototype.extractAccountSid = function (account) {
        var _a;
        return ((_a = account.idTokenClaims) === null || _a === void 0 ? void 0 : _a.sid) || null;
    };
    AuthorizationCodeClient.prototype.extractLoginHint = function (account) {
        var _a;
        return ((_a = account.idTokenClaims) === null || _a === void 0 ? void 0 : _a.login_hint) || null;
    };
    return AuthorizationCodeClient;
}(BaseClient));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * OAuth2.0 Device code client
 */
var DeviceCodeClient = /** @class */ (function (_super) {
    __extends(DeviceCodeClient, _super);
    function DeviceCodeClient(configuration) {
        return _super.call(this, configuration) || this;
    }
    /**
     * Gets device code from device code endpoint, calls back to with device code response, and
     * polls token endpoint to exchange device code for tokens
     * @param request
     */
    DeviceCodeClient.prototype.acquireToken = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var deviceCodeResponse, reqTimestamp, response, responseHandler;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.getDeviceCode(request)];
                    case 1:
                        deviceCodeResponse = _a.sent();
                        request.deviceCodeCallback(deviceCodeResponse);
                        reqTimestamp = TimeUtils.nowSeconds();
                        return [4 /*yield*/, this.acquireTokenWithDeviceCode(request, deviceCodeResponse)];
                    case 2:
                        response = _a.sent();
                        responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, this.config.serializableCache, this.config.persistencePlugin);
                        // Validate response. This function throws a server error if an error is returned by the server.
                        responseHandler.validateTokenResponse(response);
                        return [4 /*yield*/, responseHandler.handleServerTokenResponse(response, this.authority, reqTimestamp, request)];
                    case 3: return [2 /*return*/, _a.sent()];
                }
            });
        });
    };
    /**
     * Creates device code request and executes http GET
     * @param request
     */
    DeviceCodeClient.prototype.getDeviceCode = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var queryString, headers, thumbprint;
            return __generator(this, function (_a) {
                queryString = this.createQueryString(request);
                headers = this.createTokenRequestHeaders();
                thumbprint = {
                    clientId: this.config.authOptions.clientId,
                    authority: request.authority,
                    scopes: request.scopes,
                    claims: request.claims,
                    authenticationScheme: request.authenticationScheme,
                    resourceRequestMethod: request.resourceRequestMethod,
                    resourceRequestUri: request.resourceRequestUri,
                    shrClaims: request.shrClaims,
                    sshKid: request.sshKid
                };
                return [2 /*return*/, this.executePostRequestToDeviceCodeEndpoint(this.authority.deviceCodeEndpoint, queryString, headers, thumbprint)];
            });
        });
    };
    /**
     * Executes POST request to device code endpoint
     * @param deviceCodeEndpoint
     * @param queryString
     * @param headers
     */
    DeviceCodeClient.prototype.executePostRequestToDeviceCodeEndpoint = function (deviceCodeEndpoint, queryString, headers, thumbprint) {
        return __awaiter(this, void 0, void 0, function () {
            var _a, userCode, deviceCode, verificationUri, expiresIn, interval, message;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0: return [4 /*yield*/, this.networkManager.sendPostRequest(thumbprint, deviceCodeEndpoint, {
                            body: queryString,
                            headers: headers,
                            proxyUrl: this.config.systemOptions.proxyUrl
                        })];
                    case 1:
                        _a = (_b.sent()).body, userCode = _a.user_code, deviceCode = _a.device_code, verificationUri = _a.verification_uri, expiresIn = _a.expires_in, interval = _a.interval, message = _a.message;
                        return [2 /*return*/, {
                                userCode: userCode,
                                deviceCode: deviceCode,
                                verificationUri: verificationUri,
                                expiresIn: expiresIn,
                                interval: interval,
                                message: message
                            }];
                }
            });
        });
    };
    /**
     * Create device code endpoint query parameters and returns string
     */
    DeviceCodeClient.prototype.createQueryString = function (request) {
        var parameterBuilder = new RequestParameterBuilder();
        parameterBuilder.addScopes(request.scopes);
        parameterBuilder.addClientId(this.config.authOptions.clientId);
        if (!StringUtils.isEmpty(request.claims) || this.config.authOptions.clientCapabilities && this.config.authOptions.clientCapabilities.length > 0) {
            parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);
        }
        return parameterBuilder.createQueryString();
    };
    /**
     * Breaks the polling with specific conditions.
     * @param request CommonDeviceCodeRequest
     * @param deviceCodeResponse DeviceCodeResponse
     */
    DeviceCodeClient.prototype.continuePolling = function (deviceCodeExpirationTime, userSpecifiedTimeout, userSpecifiedCancelFlag) {
        if (userSpecifiedCancelFlag) {
            this.logger.error("Token request cancelled by setting DeviceCodeRequest.cancel = true");
            throw ClientAuthError.createDeviceCodeCancelledError();
        }
        else if (userSpecifiedTimeout && userSpecifiedTimeout < deviceCodeExpirationTime && TimeUtils.nowSeconds() > userSpecifiedTimeout) {
            this.logger.error("User defined timeout for device code polling reached. The timeout was set for " + userSpecifiedTimeout);
            throw ClientAuthError.createUserTimeoutReachedError();
        }
        else if (TimeUtils.nowSeconds() > deviceCodeExpirationTime) {
            if (userSpecifiedTimeout) {
                this.logger.verbose("User specified timeout ignored as the device code has expired before the timeout elapsed. The user specified timeout was set for " + userSpecifiedTimeout);
            }
            this.logger.error("Device code expired. Expiration time of device code was " + deviceCodeExpirationTime);
            throw ClientAuthError.createDeviceCodeExpiredError();
        }
        return true;
    };
    /**
     * Creates token request with device code response and polls token endpoint at interval set by the device code
     * response
     * @param request
     * @param deviceCodeResponse
     */
    DeviceCodeClient.prototype.acquireTokenWithDeviceCode = function (request, deviceCodeResponse) {
        return __awaiter(this, void 0, void 0, function () {
            var requestBody, headers, userSpecifiedTimeout, deviceCodeExpirationTime, pollingIntervalMilli, thumbprint, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        requestBody = this.createTokenRequestBody(request, deviceCodeResponse);
                        headers = this.createTokenRequestHeaders();
                        userSpecifiedTimeout = request.timeout ? TimeUtils.nowSeconds() + request.timeout : undefined;
                        deviceCodeExpirationTime = TimeUtils.nowSeconds() + deviceCodeResponse.expiresIn;
                        pollingIntervalMilli = deviceCodeResponse.interval * 1000;
                        _a.label = 1;
                    case 1:
                        if (!this.continuePolling(deviceCodeExpirationTime, userSpecifiedTimeout, request.cancel)) return [3 /*break*/, 8];
                        thumbprint = {
                            clientId: this.config.authOptions.clientId,
                            authority: request.authority,
                            scopes: request.scopes,
                            claims: request.claims,
                            authenticationScheme: request.authenticationScheme,
                            resourceRequestMethod: request.resourceRequestMethod,
                            resourceRequestUri: request.resourceRequestUri,
                            shrClaims: request.shrClaims,
                            sshKid: request.sshKid
                        };
                        return [4 /*yield*/, this.executePostToTokenEndpoint(this.authority.tokenEndpoint, requestBody, headers, thumbprint)];
                    case 2:
                        response = _a.sent();
                        if (!(response.body && response.body.error)) return [3 /*break*/, 6];
                        if (!(response.body.error === Constants.AUTHORIZATION_PENDING)) return [3 /*break*/, 4];
                        this.logger.info("Authorization pending. Continue polling.");
                        return [4 /*yield*/, TimeUtils.delay(pollingIntervalMilli)];
                    case 3:
                        _a.sent();
                        return [3 /*break*/, 5];
                    case 4:
                        // for any other error, throw
                        this.logger.info("Unexpected error in polling from the server");
                        throw ServerError.createPostRequestFailed(response.body.error);
                    case 5: return [3 /*break*/, 7];
                    case 6:
                        this.logger.verbose("Authorization completed successfully. Polling stopped.");
                        return [2 /*return*/, response.body];
                    case 7: return [3 /*break*/, 1];
                    case 8:
                        /*
                         * The above code should've thrown by this point, but to satisfy TypeScript,
                         * and in the rare case the conditionals in continuePolling() may not catch everything...
                         */
                        this.logger.error("Polling stopped for unknown reasons.");
                        throw ClientAuthError.createDeviceCodeUnknownError();
                }
            });
        });
    };
    /**
     * Creates query parameters and converts to string.
     * @param request
     * @param deviceCodeResponse
     */
    DeviceCodeClient.prototype.createTokenRequestBody = function (request, deviceCodeResponse) {
        var requestParameters = new RequestParameterBuilder();
        requestParameters.addScopes(request.scopes);
        requestParameters.addClientId(this.config.authOptions.clientId);
        requestParameters.addGrantType(GrantType.DEVICE_CODE_GRANT);
        requestParameters.addDeviceCode(deviceCodeResponse.deviceCode);
        var correlationId = request.correlationId || this.config.cryptoInterface.createNewGuid();
        requestParameters.addCorrelationId(correlationId);
        requestParameters.addClientInfo();
        requestParameters.addLibraryInfo(this.config.libraryInfo);
        requestParameters.addApplicationTelemetry(this.config.telemetry.application);
        requestParameters.addThrottling();
        if (this.serverTelemetryManager) {
            requestParameters.addServerTelemetry(this.serverTelemetryManager);
        }
        if (!StringUtils.isEmptyObj(request.claims) || this.config.authOptions.clientCapabilities && this.config.authOptions.clientCapabilities.length > 0) {
            requestParameters.addClaims(request.claims, this.config.authOptions.clientCapabilities);
        }
        return requestParameters.createQueryString();
    };
    return DeviceCodeClient;
}(BaseClient));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Enumeration of operations that are instrumented by have their performance measured by the PerformanceClient.
 *
 * @export
 * @enum {number}
 */
exports.PerformanceEvents = void 0;
(function (PerformanceEvents) {
    /**
     * acquireTokenByCode API (msal-browser and msal-node).
     * Used to acquire tokens by trading an authorization code against the token endpoint.
     */
    PerformanceEvents["AcquireTokenByCode"] = "acquireTokenByCode";
    /**
     * acquireTokenByRefreshToken API (msal-browser and msal-node).
     * Used to renew an access token using a refresh token against the token endpoint.
     */
    PerformanceEvents["AcquireTokenByRefreshToken"] = "acquireTokenByRefreshToken";
    /**
     * acquireTokenSilent API (msal-browser and msal-node).
     * Used to silently acquire a new access token (from the cache or the network).
     */
    PerformanceEvents["AcquireTokenSilent"] = "acquireTokenSilent";
    /**
     * acquireTokenSilentAsync (msal-browser).
     * Internal API for acquireTokenSilent.
     */
    PerformanceEvents["AcquireTokenSilentAsync"] = "acquireTokenSilentAsync";
    /**
     * acquireTokenPopup (msal-browser).
     * Used to acquire a new access token interactively through pop ups
     */
    PerformanceEvents["AcquireTokenPopup"] = "acquireTokenPopup";
    /**
     * getPublicKeyThumbprint API in CryptoOpts class (msal-browser).
     * Used to generate a public/private keypair and generate a public key thumbprint for pop requests.
     */
    PerformanceEvents["CryptoOptsGetPublicKeyThumbprint"] = "cryptoOptsGetPublicKeyThumbprint";
    /**
     * signJwt API in CryptoOpts class (msal-browser).
     * Used to signed a pop token.
     */
    PerformanceEvents["CryptoOptsSignJwt"] = "cryptoOptsSignJwt";
    /**
     * acquireToken API in the SilentCacheClient class (msal-browser).
     * Used to read access tokens from the cache.
     */
    PerformanceEvents["SilentCacheClientAcquireToken"] = "silentCacheClientAcquireToken";
    /**
     * acquireToken API in the SilentIframeClient class (msal-browser).
     * Used to acquire a new set of tokens from the authorize endpoint in a hidden iframe.
     */
    PerformanceEvents["SilentIframeClientAcquireToken"] = "silentIframeClientAcquireToken";
    /**
     * acquireToken API in SilentRereshClient (msal-browser).
     * Used to acquire a new set of tokens from the token endpoint using a refresh token.
     */
    PerformanceEvents["SilentRefreshClientAcquireToken"] = "silentRefreshClientAcquireToken";
    /**
     * ssoSilent API (msal-browser).
     * Used to silently acquire an authorization code and set of tokens using a hidden iframe.
     */
    PerformanceEvents["SsoSilent"] = "ssoSilent";
    /**
     * getDiscoveredAuthority API in StandardInteractionClient class (msal-browser).
     * Used to load authority metadata for a request.
     */
    PerformanceEvents["StandardInteractionClientGetDiscoveredAuthority"] = "standardInteractionClientGetDiscoveredAuthority";
    /**
     * acquireToken APIs in msal-browser.
     * Used to make an /authorize endpoint call with native brokering enabled.
     */
    PerformanceEvents["FetchAccountIdWithNativeBroker"] = "fetchAccountIdWithNativeBroker";
    /**
     * acquireToken API in NativeInteractionClient class (msal-browser).
     * Used to acquire a token from Native component when native brokering is enabled.
     */
    PerformanceEvents["NativeInteractionClientAcquireToken"] = "nativeInteractionClientAcquireToken";
    /**
     * Time spent on the network for refresh token acquisition
     */
    PerformanceEvents["RefreshTokenClientExecuteTokenRequest"] = "refreshTokenClientExecuteTokenRequest";
    /**
     * Time spent creating default headers for requests to token endpoint
     */
    PerformanceEvents["BaseClientCreateTokenRequestHeaders"] = "baseClientCreateTokenRequestHeaders";
    /**
     * Used to measure the time taken for completing embedded-broker handshake (PW-Broker).
     */
    PerformanceEvents["BrokerHandhshake"] = "brokerHandshake";
    /**
     * acquireTokenByRefreshToken API in BrokerClientApplication (PW-Broker) .
     */
    PerformanceEvents["AcquireTokenByRefreshTokenInBroker"] = "acquireTokenByRefreshTokenInBroker";
    /**
     * acquireToken API in BrokerClientApplication.
     * Used to acquire a token on behalf of the embedded application (PW-Broker).
     */
    PerformanceEvents["AcquireTokenByBroker"] = "acquireTokenByBroker";
})(exports.PerformanceEvents || (exports.PerformanceEvents = {}));
/**
 * State of the performance event.
 *
 * @export
 * @enum {number}
 */
exports.PerformanceEventStatus = void 0;
(function (PerformanceEventStatus) {
    PerformanceEventStatus[PerformanceEventStatus["NotStarted"] = 0] = "NotStarted";
    PerformanceEventStatus[PerformanceEventStatus["InProgress"] = 1] = "InProgress";
    PerformanceEventStatus[PerformanceEventStatus["Completed"] = 2] = "Completed";
})(exports.PerformanceEventStatus || (exports.PerformanceEventStatus = {}));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * OAuth2.0 refresh token client
 */
var RefreshTokenClient = /** @class */ (function (_super) {
    __extends(RefreshTokenClient, _super);
    function RefreshTokenClient(configuration, performanceClient) {
        return _super.call(this, configuration, performanceClient) || this;
    }
    RefreshTokenClient.prototype.acquireToken = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var reqTimestamp, response, responseHandler;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        reqTimestamp = TimeUtils.nowSeconds();
                        return [4 /*yield*/, this.executeTokenRequest(request, this.authority)];
                    case 1:
                        response = _a.sent();
                        responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, this.config.serializableCache, this.config.persistencePlugin);
                        responseHandler.validateTokenResponse(response.body);
                        return [2 /*return*/, responseHandler.handleServerTokenResponse(response.body, this.authority, reqTimestamp, request, undefined, undefined, true, request.forceCache)];
                }
            });
        });
    };
    /**
     * Gets cached refresh token and attaches to request, then calls acquireToken API
     * @param request
     */
    RefreshTokenClient.prototype.acquireTokenByRefreshToken = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var isFOCI, noFamilyRTInCache, clientMismatchErrorWithFamilyRT;
            return __generator(this, function (_a) {
                // Cannot renew token if no request object is given.
                if (!request) {
                    throw ClientConfigurationError.createEmptyTokenRequestError();
                }
                // We currently do not support silent flow for account === null use cases; This will be revisited for confidential flow usecases
                if (!request.account) {
                    throw ClientAuthError.createNoAccountInSilentRequestError();
                }
                isFOCI = this.cacheManager.isAppMetadataFOCI(request.account.environment, this.config.authOptions.clientId);
                // if the app is part of the family, retrive a Family refresh token if present and make a refreshTokenRequest
                if (isFOCI) {
                    try {
                        return [2 /*return*/, this.acquireTokenWithCachedRefreshToken(request, true)];
                    }
                    catch (e) {
                        noFamilyRTInCache = e instanceof InteractionRequiredAuthError && e.errorCode === InteractionRequiredAuthErrorMessage.noTokensFoundError.code;
                        clientMismatchErrorWithFamilyRT = e instanceof ServerError && e.errorCode === Errors.INVALID_GRANT_ERROR && e.subError === Errors.CLIENT_MISMATCH_ERROR;
                        // if family Refresh Token (FRT) cache acquisition fails or if client_mismatch error is seen with FRT, reattempt with application Refresh Token (ART)
                        if (noFamilyRTInCache || clientMismatchErrorWithFamilyRT) {
                            return [2 /*return*/, this.acquireTokenWithCachedRefreshToken(request, false)];
                            // throw in all other cases
                        }
                        else {
                            throw e;
                        }
                    }
                }
                // fall back to application refresh token acquisition
                return [2 /*return*/, this.acquireTokenWithCachedRefreshToken(request, false)];
            });
        });
    };
    /**
     * makes a network call to acquire tokens by exchanging RefreshToken available in userCache; throws if refresh token is not cached
     * @param request
     */
    RefreshTokenClient.prototype.acquireTokenWithCachedRefreshToken = function (request, foci) {
        return __awaiter(this, void 0, void 0, function () {
            var refreshToken, refreshTokenRequest;
            return __generator(this, function (_a) {
                refreshToken = this.cacheManager.readRefreshTokenFromCache(this.config.authOptions.clientId, request.account, foci);
                // no refresh Token
                if (!refreshToken) {
                    throw InteractionRequiredAuthError.createNoTokensFoundError();
                }
                refreshTokenRequest = __assign(__assign({}, request), { refreshToken: refreshToken.secret, authenticationScheme: request.authenticationScheme || exports.AuthenticationScheme.BEARER, ccsCredential: {
                        credential: request.account.homeAccountId,
                        type: exports.CcsCredentialType.HOME_ACCOUNT_ID
                    } });
                return [2 /*return*/, this.acquireToken(refreshTokenRequest)];
            });
        });
    };
    /**
     * Constructs the network message and makes a NW call to the underlying secure token service
     * @param request
     * @param authority
     */
    RefreshTokenClient.prototype.executeTokenRequest = function (request, authority) {
        var _a;
        return __awaiter(this, void 0, void 0, function () {
            var acquireTokenMeasurement, requestBody, queryParameters, headers, thumbprint, endpoint;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        acquireTokenMeasurement = (_a = this.performanceClient) === null || _a === void 0 ? void 0 : _a.startMeasurement(exports.PerformanceEvents.RefreshTokenClientExecuteTokenRequest, request.correlationId);
                        return [4 /*yield*/, this.createTokenRequestBody(request)];
                    case 1:
                        requestBody = _b.sent();
                        queryParameters = this.createTokenQueryParameters(request);
                        headers = this.createTokenRequestHeaders(request.ccsCredential);
                        thumbprint = {
                            clientId: this.config.authOptions.clientId,
                            authority: authority.canonicalAuthority,
                            scopes: request.scopes,
                            claims: request.claims,
                            authenticationScheme: request.authenticationScheme,
                            resourceRequestMethod: request.resourceRequestMethod,
                            resourceRequestUri: request.resourceRequestUri,
                            shrClaims: request.shrClaims,
                            sshKid: request.sshKid
                        };
                        endpoint = UrlString.appendQueryString(authority.tokenEndpoint, queryParameters);
                        return [2 /*return*/, this.executePostToTokenEndpoint(endpoint, requestBody, headers, thumbprint)
                                .then(function (result) {
                                acquireTokenMeasurement === null || acquireTokenMeasurement === void 0 ? void 0 : acquireTokenMeasurement.endMeasurement({
                                    success: true
                                });
                                return result;
                            })
                                .catch(function (error) {
                                acquireTokenMeasurement === null || acquireTokenMeasurement === void 0 ? void 0 : acquireTokenMeasurement.endMeasurement({
                                    success: false
                                });
                                throw error;
                            })];
                }
            });
        });
    };
    /**
     * Creates query string for the /token request
     * @param request
     */
    RefreshTokenClient.prototype.createTokenQueryParameters = function (request) {
        var parameterBuilder = new RequestParameterBuilder();
        if (request.tokenQueryParameters) {
            parameterBuilder.addExtraQueryParameters(request.tokenQueryParameters);
        }
        return parameterBuilder.createQueryString();
    };
    /**
     * Helper function to create the token request body
     * @param request
     */
    RefreshTokenClient.prototype.createTokenRequestBody = function (request) {
        var _a;
        return __awaiter(this, void 0, void 0, function () {
            var correlationId, acquireTokenMeasurement, parameterBuilder, clientAssertion, popTokenGenerator, reqCnfData, clientInfo;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        correlationId = request.correlationId;
                        acquireTokenMeasurement = (_a = this.performanceClient) === null || _a === void 0 ? void 0 : _a.startMeasurement(exports.PerformanceEvents.BaseClientCreateTokenRequestHeaders, correlationId);
                        parameterBuilder = new RequestParameterBuilder();
                        parameterBuilder.addClientId(this.config.authOptions.clientId);
                        parameterBuilder.addScopes(request.scopes);
                        parameterBuilder.addGrantType(GrantType.REFRESH_TOKEN_GRANT);
                        parameterBuilder.addClientInfo();
                        parameterBuilder.addLibraryInfo(this.config.libraryInfo);
                        parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);
                        parameterBuilder.addThrottling();
                        if (this.serverTelemetryManager) {
                            parameterBuilder.addServerTelemetry(this.serverTelemetryManager);
                        }
                        parameterBuilder.addCorrelationId(correlationId);
                        parameterBuilder.addRefreshToken(request.refreshToken);
                        if (this.config.clientCredentials.clientSecret) {
                            parameterBuilder.addClientSecret(this.config.clientCredentials.clientSecret);
                        }
                        if (this.config.clientCredentials.clientAssertion) {
                            clientAssertion = this.config.clientCredentials.clientAssertion;
                            parameterBuilder.addClientAssertion(clientAssertion.assertion);
                            parameterBuilder.addClientAssertionType(clientAssertion.assertionType);
                        }
                        if (!(request.authenticationScheme === exports.AuthenticationScheme.POP)) return [3 /*break*/, 2];
                        popTokenGenerator = new PopTokenGenerator(this.cryptoUtils);
                        return [4 /*yield*/, popTokenGenerator.generateCnf(request)];
                    case 1:
                        reqCnfData = _b.sent();
                        // SPA PoP requires full Base64Url encoded req_cnf string (unhashed)
                        parameterBuilder.addPopToken(reqCnfData.reqCnfString);
                        return [3 /*break*/, 3];
                    case 2:
                        if (request.authenticationScheme === exports.AuthenticationScheme.SSH) {
                            if (request.sshJwk) {
                                parameterBuilder.addSshJwk(request.sshJwk);
                            }
                            else {
                                acquireTokenMeasurement === null || acquireTokenMeasurement === void 0 ? void 0 : acquireTokenMeasurement.endMeasurement({
                                    success: false
                                });
                                throw ClientConfigurationError.createMissingSshJwkError();
                            }
                        }
                        _b.label = 3;
                    case 3:
                        if (!StringUtils.isEmptyObj(request.claims) || this.config.authOptions.clientCapabilities && this.config.authOptions.clientCapabilities.length > 0) {
                            parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);
                        }
                        if (this.config.systemOptions.preventCorsPreflight && request.ccsCredential) {
                            switch (request.ccsCredential.type) {
                                case exports.CcsCredentialType.HOME_ACCOUNT_ID:
                                    try {
                                        clientInfo = buildClientInfoFromHomeAccountId(request.ccsCredential.credential);
                                        parameterBuilder.addCcsOid(clientInfo);
                                    }
                                    catch (e) {
                                        this.logger.verbose("Could not parse home account ID for CCS Header: " + e);
                                    }
                                    break;
                                case exports.CcsCredentialType.UPN:
                                    parameterBuilder.addCcsUpn(request.ccsCredential.credential);
                                    break;
                            }
                        }
                        acquireTokenMeasurement === null || acquireTokenMeasurement === void 0 ? void 0 : acquireTokenMeasurement.endMeasurement({
                            success: true
                        });
                        return [2 /*return*/, parameterBuilder.createQueryString()];
                }
            });
        });
    };
    return RefreshTokenClient;
}(BaseClient));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * OAuth2.0 client credential grant
 */
var ClientCredentialClient = /** @class */ (function (_super) {
    __extends(ClientCredentialClient, _super);
    function ClientCredentialClient(configuration, appTokenProvider) {
        var _this = _super.call(this, configuration) || this;
        _this.appTokenProvider = appTokenProvider;
        return _this;
    }
    /**
     * Public API to acquire a token with ClientCredential Flow for Confidential clients
     * @param request
     */
    ClientCredentialClient.prototype.acquireToken = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var cachedAuthenticationResult;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.scopeSet = new ScopeSet(request.scopes || []);
                        if (!request.skipCache) return [3 /*break*/, 2];
                        return [4 /*yield*/, this.executeTokenRequest(request, this.authority)];
                    case 1: return [2 /*return*/, _a.sent()];
                    case 2: return [4 /*yield*/, this.getCachedAuthenticationResult(request)];
                    case 3:
                        cachedAuthenticationResult = _a.sent();
                        if (!cachedAuthenticationResult) return [3 /*break*/, 4];
                        return [2 /*return*/, cachedAuthenticationResult];
                    case 4: return [4 /*yield*/, this.executeTokenRequest(request, this.authority)];
                    case 5: return [2 /*return*/, _a.sent()];
                }
            });
        });
    };
    /**
     * looks up cache if the tokens are cached already
     */
    ClientCredentialClient.prototype.getCachedAuthenticationResult = function (request) {
        var _a, _b;
        return __awaiter(this, void 0, void 0, function () {
            var cachedAccessToken;
            return __generator(this, function (_c) {
                switch (_c.label) {
                    case 0:
                        cachedAccessToken = this.readAccessTokenFromCache();
                        if (!cachedAccessToken) {
                            (_a = this.serverTelemetryManager) === null || _a === void 0 ? void 0 : _a.setCacheOutcome(CacheOutcome.NO_CACHED_ACCESS_TOKEN);
                            return [2 /*return*/, null];
                        }
                        if (TimeUtils.isTokenExpired(cachedAccessToken.expiresOn, this.config.systemOptions.tokenRenewalOffsetSeconds)) {
                            (_b = this.serverTelemetryManager) === null || _b === void 0 ? void 0 : _b.setCacheOutcome(CacheOutcome.CACHED_ACCESS_TOKEN_EXPIRED);
                            return [2 /*return*/, null];
                        }
                        return [4 /*yield*/, ResponseHandler.generateAuthenticationResult(this.cryptoUtils, this.authority, {
                                account: null,
                                idToken: null,
                                accessToken: cachedAccessToken,
                                refreshToken: null,
                                appMetadata: null
                            }, true, request)];
                    case 1: return [2 /*return*/, _c.sent()];
                }
            });
        });
    };
    /**
     * Reads access token from the cache
     * TODO: Move this call to cacheManager instead
     */
    ClientCredentialClient.prototype.readAccessTokenFromCache = function () {
        var accessTokenFilter = {
            homeAccountId: Constants.EMPTY_STRING,
            environment: this.authority.canonicalAuthorityUrlComponents.HostNameAndPort,
            credentialType: exports.CredentialType.ACCESS_TOKEN,
            clientId: this.config.authOptions.clientId,
            realm: this.authority.tenant,
            target: this.scopeSet.printScopesLowerCase()
        };
        var credentialCache = this.cacheManager.getCredentialsFilteredBy(accessTokenFilter);
        var accessTokens = Object.keys(credentialCache.accessTokens).map(function (key) { return credentialCache.accessTokens[key]; });
        if (accessTokens.length < 1) {
            return null;
        }
        else if (accessTokens.length > 1) {
            throw ClientAuthError.createMultipleMatchingTokensInCacheError();
        }
        return accessTokens[0];
    };
    /**
     * Makes a network call to request the token from the service
     * @param request
     * @param authority
     */
    ClientCredentialClient.prototype.executeTokenRequest = function (request, authority) {
        return __awaiter(this, void 0, void 0, function () {
            var serverTokenResponse, reqTimestamp, appTokenPropviderParameters, appTokenProviderResult, requestBody, headers, thumbprint, response, responseHandler, tokenResponse;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        if (!this.appTokenProvider) return [3 /*break*/, 2];
                        this.logger.info("Using appTokenProvider extensibility.");
                        appTokenPropviderParameters = {
                            correlationId: request.correlationId,
                            tenantId: this.config.authOptions.authority.tenant,
                            scopes: request.scopes,
                            claims: request.claims,
                        };
                        reqTimestamp = TimeUtils.nowSeconds();
                        return [4 /*yield*/, this.appTokenProvider(appTokenPropviderParameters)];
                    case 1:
                        appTokenProviderResult = _a.sent();
                        serverTokenResponse = {
                            access_token: appTokenProviderResult.accessToken,
                            expires_in: appTokenProviderResult.expiresInSeconds,
                            refresh_in: appTokenProviderResult.refreshInSeconds,
                            token_type: exports.AuthenticationScheme.BEARER
                        };
                        return [3 /*break*/, 4];
                    case 2:
                        requestBody = this.createTokenRequestBody(request);
                        headers = this.createTokenRequestHeaders();
                        thumbprint = {
                            clientId: this.config.authOptions.clientId,
                            authority: request.authority,
                            scopes: request.scopes,
                            claims: request.claims,
                            authenticationScheme: request.authenticationScheme,
                            resourceRequestMethod: request.resourceRequestMethod,
                            resourceRequestUri: request.resourceRequestUri,
                            shrClaims: request.shrClaims,
                            sshKid: request.sshKid
                        };
                        reqTimestamp = TimeUtils.nowSeconds();
                        return [4 /*yield*/, this.executePostToTokenEndpoint(authority.tokenEndpoint, requestBody, headers, thumbprint)];
                    case 3:
                        response = _a.sent();
                        serverTokenResponse = response.body;
                        _a.label = 4;
                    case 4:
                        responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, this.config.serializableCache, this.config.persistencePlugin);
                        responseHandler.validateTokenResponse(serverTokenResponse);
                        return [4 /*yield*/, responseHandler.handleServerTokenResponse(serverTokenResponse, this.authority, reqTimestamp, request)];
                    case 5:
                        tokenResponse = _a.sent();
                        return [2 /*return*/, tokenResponse];
                }
            });
        });
    };
    /**
     * generate the request to the server in the acceptable format
     * @param request
     */
    ClientCredentialClient.prototype.createTokenRequestBody = function (request) {
        var parameterBuilder = new RequestParameterBuilder();
        parameterBuilder.addClientId(this.config.authOptions.clientId);
        parameterBuilder.addScopes(request.scopes, false);
        parameterBuilder.addGrantType(GrantType.CLIENT_CREDENTIALS_GRANT);
        parameterBuilder.addLibraryInfo(this.config.libraryInfo);
        parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);
        parameterBuilder.addThrottling();
        if (this.serverTelemetryManager) {
            parameterBuilder.addServerTelemetry(this.serverTelemetryManager);
        }
        var correlationId = request.correlationId || this.config.cryptoInterface.createNewGuid();
        parameterBuilder.addCorrelationId(correlationId);
        if (this.config.clientCredentials.clientSecret) {
            parameterBuilder.addClientSecret(this.config.clientCredentials.clientSecret);
        }
        // Use clientAssertion from request, fallback to client assertion in base configuration
        var clientAssertion = request.clientAssertion || this.config.clientCredentials.clientAssertion;
        if (clientAssertion) {
            parameterBuilder.addClientAssertion(clientAssertion.assertion);
            parameterBuilder.addClientAssertionType(clientAssertion.assertionType);
        }
        if (!StringUtils.isEmptyObj(request.claims) || this.config.authOptions.clientCapabilities && this.config.authOptions.clientCapabilities.length > 0) {
            parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);
        }
        return parameterBuilder.createQueryString();
    };
    return ClientCredentialClient;
}(BaseClient));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * On-Behalf-Of client
 */
var OnBehalfOfClient = /** @class */ (function (_super) {
    __extends(OnBehalfOfClient, _super);
    function OnBehalfOfClient(configuration) {
        return _super.call(this, configuration) || this;
    }
    /**
     * Public API to acquire tokens with on behalf of flow
     * @param request
     */
    OnBehalfOfClient.prototype.acquireToken = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var _a;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        this.scopeSet = new ScopeSet(request.scopes || []);
                        // generate the user_assertion_hash for OBOAssertion
                        _a = this;
                        return [4 /*yield*/, this.cryptoUtils.hashString(request.oboAssertion)];
                    case 1:
                        // generate the user_assertion_hash for OBOAssertion
                        _a.userAssertionHash = _b.sent();
                        if (!request.skipCache) return [3 /*break*/, 3];
                        return [4 /*yield*/, this.executeTokenRequest(request, this.authority, this.userAssertionHash)];
                    case 2: return [2 /*return*/, _b.sent()];
                    case 3:
                        _b.trys.push([3, 5, , 7]);
                        return [4 /*yield*/, this.getCachedAuthenticationResult(request)];
                    case 4: return [2 /*return*/, _b.sent()];
                    case 5:
                        _b.sent();
                        return [4 /*yield*/, this.executeTokenRequest(request, this.authority, this.userAssertionHash)];
                    case 6: 
                    // Any failure falls back to interactive request, once we implement distributed cache, we plan to handle `createRefreshRequiredError` to refresh using the RT
                    return [2 /*return*/, _b.sent()];
                    case 7: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * look up cache for tokens
     * Find idtoken in the cache
     * Find accessToken based on user assertion and account info in the cache
     * Please note we are not yet supported OBO tokens refreshed with long lived RT. User will have to send a new assertion if the current access token expires
     * This is to prevent security issues when the assertion changes over time, however, longlived RT helps retaining the session
     * @param request
     */
    OnBehalfOfClient.prototype.getCachedAuthenticationResult = function (request) {
        var _a, _b;
        return __awaiter(this, void 0, void 0, function () {
            var cachedAccessToken, cachedIdToken, idTokenObject, cachedAccount, localAccountId, accountInfo;
            return __generator(this, function (_c) {
                switch (_c.label) {
                    case 0:
                        cachedAccessToken = this.readAccessTokenFromCacheForOBO(this.config.authOptions.clientId, request);
                        if (!cachedAccessToken) {
                            // Must refresh due to non-existent access_token.
                            (_a = this.serverTelemetryManager) === null || _a === void 0 ? void 0 : _a.setCacheOutcome(CacheOutcome.NO_CACHED_ACCESS_TOKEN);
                            this.logger.info("SilentFlowClient:acquireCachedToken - No access token found in cache for the given properties.");
                            throw ClientAuthError.createRefreshRequiredError();
                        }
                        else if (TimeUtils.isTokenExpired(cachedAccessToken.expiresOn, this.config.systemOptions.tokenRenewalOffsetSeconds)) {
                            // Access token expired, will need to renewed
                            (_b = this.serverTelemetryManager) === null || _b === void 0 ? void 0 : _b.setCacheOutcome(CacheOutcome.CACHED_ACCESS_TOKEN_EXPIRED);
                            this.logger.info("OnbehalfofFlow:getCachedAuthenticationResult - Cached access token is expired or will expire within " + this.config.systemOptions.tokenRenewalOffsetSeconds + " seconds.");
                            throw ClientAuthError.createRefreshRequiredError();
                        }
                        cachedIdToken = this.readIdTokenFromCacheForOBO(request, cachedAccessToken.homeAccountId);
                        cachedAccount = null;
                        if (cachedIdToken) {
                            idTokenObject = new AuthToken(cachedIdToken.secret, this.config.cryptoInterface);
                            localAccountId = idTokenObject.claims.oid ? idTokenObject.claims.oid : idTokenObject.claims.sub;
                            accountInfo = {
                                homeAccountId: cachedIdToken.homeAccountId,
                                environment: cachedIdToken.environment,
                                tenantId: cachedIdToken.realm,
                                username: Constants.EMPTY_STRING,
                                localAccountId: localAccountId || Constants.EMPTY_STRING
                            };
                            cachedAccount = this.cacheManager.readAccountFromCache(accountInfo);
                        }
                        // increment telemetry cache hit counter
                        if (this.config.serverTelemetryManager) {
                            this.config.serverTelemetryManager.incrementCacheHits();
                        }
                        return [4 /*yield*/, ResponseHandler.generateAuthenticationResult(this.cryptoUtils, this.authority, {
                                account: cachedAccount,
                                accessToken: cachedAccessToken,
                                idToken: cachedIdToken,
                                refreshToken: null,
                                appMetadata: null
                            }, true, request, idTokenObject)];
                    case 1: return [2 /*return*/, _c.sent()];
                }
            });
        });
    };
    /**
     * read idtoken from cache, this is a specific implementation for OBO as the requirements differ from a generic lookup in the cacheManager
     * Certain use cases of OBO flow do not expect an idToken in the cache/or from the service
     * @param request
     */
    OnBehalfOfClient.prototype.readIdTokenFromCacheForOBO = function (request, atHomeAccountId) {
        var idTokenFilter = {
            homeAccountId: atHomeAccountId,
            environment: this.authority.canonicalAuthorityUrlComponents.HostNameAndPort,
            credentialType: exports.CredentialType.ID_TOKEN,
            clientId: this.config.authOptions.clientId,
            realm: this.authority.tenant
        };
        var credentialCache = this.cacheManager.getCredentialsFilteredBy(idTokenFilter);
        var idTokens = Object.keys(credentialCache.idTokens).map(function (key) { return credentialCache.idTokens[key]; });
        // When acquiring a token on behalf of an application, there might not be an id token in the cache
        if (idTokens.length < 1) {
            return null;
        }
        return idTokens[0];
    };
    /**
     * Fetches the cached access token based on incoming assertion
     * @param clientId
     * @param request
     * @param userAssertionHash
     */
    OnBehalfOfClient.prototype.readAccessTokenFromCacheForOBO = function (clientId, request) {
        var authScheme = request.authenticationScheme || exports.AuthenticationScheme.BEARER;
        /*
         * Distinguish between Bearer and PoP/SSH token cache types
         * Cast to lowercase to handle "bearer" from ADFS
         */
        var credentialType = (authScheme && authScheme.toLowerCase() !== exports.AuthenticationScheme.BEARER.toLowerCase()) ? exports.CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME : exports.CredentialType.ACCESS_TOKEN;
        var accessTokenFilter = {
            credentialType: credentialType,
            clientId: clientId,
            target: this.scopeSet.printScopesLowerCase(),
            tokenType: authScheme,
            keyId: request.sshKid,
            requestedClaimsHash: request.requestedClaimsHash,
            userAssertionHash: this.userAssertionHash
        };
        var credentialCache = this.cacheManager.getCredentialsFilteredBy(accessTokenFilter);
        var accessTokens = Object.keys(credentialCache.accessTokens).map(function (key) { return credentialCache.accessTokens[key]; });
        var numAccessTokens = accessTokens.length;
        if (numAccessTokens < 1) {
            return null;
        }
        else if (numAccessTokens > 1) {
            throw ClientAuthError.createMultipleMatchingTokensInCacheError();
        }
        return accessTokens[0];
    };
    /**
     * Make a network call to the server requesting credentials
     * @param request
     * @param authority
     */
    OnBehalfOfClient.prototype.executeTokenRequest = function (request, authority, userAssertionHash) {
        return __awaiter(this, void 0, void 0, function () {
            var requestBody, headers, thumbprint, reqTimestamp, response, responseHandler, tokenResponse;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        requestBody = this.createTokenRequestBody(request);
                        headers = this.createTokenRequestHeaders();
                        thumbprint = {
                            clientId: this.config.authOptions.clientId,
                            authority: request.authority,
                            scopes: request.scopes,
                            claims: request.claims,
                            authenticationScheme: request.authenticationScheme,
                            resourceRequestMethod: request.resourceRequestMethod,
                            resourceRequestUri: request.resourceRequestUri,
                            shrClaims: request.shrClaims,
                            sshKid: request.sshKid
                        };
                        reqTimestamp = TimeUtils.nowSeconds();
                        return [4 /*yield*/, this.executePostToTokenEndpoint(authority.tokenEndpoint, requestBody, headers, thumbprint)];
                    case 1:
                        response = _a.sent();
                        responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, this.config.serializableCache, this.config.persistencePlugin);
                        responseHandler.validateTokenResponse(response.body);
                        return [4 /*yield*/, responseHandler.handleServerTokenResponse(response.body, this.authority, reqTimestamp, request, undefined, userAssertionHash)];
                    case 2:
                        tokenResponse = _a.sent();
                        return [2 /*return*/, tokenResponse];
                }
            });
        });
    };
    /**
     * generate a server request in accepable format
     * @param request
     */
    OnBehalfOfClient.prototype.createTokenRequestBody = function (request) {
        var parameterBuilder = new RequestParameterBuilder();
        parameterBuilder.addClientId(this.config.authOptions.clientId);
        parameterBuilder.addScopes(request.scopes);
        parameterBuilder.addGrantType(GrantType.JWT_BEARER);
        parameterBuilder.addClientInfo();
        parameterBuilder.addLibraryInfo(this.config.libraryInfo);
        parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);
        parameterBuilder.addThrottling();
        if (this.serverTelemetryManager) {
            parameterBuilder.addServerTelemetry(this.serverTelemetryManager);
        }
        var correlationId = request.correlationId || this.config.cryptoInterface.createNewGuid();
        parameterBuilder.addCorrelationId(correlationId);
        parameterBuilder.addRequestTokenUse(AADServerParamKeys.ON_BEHALF_OF);
        parameterBuilder.addOboAssertion(request.oboAssertion);
        if (this.config.clientCredentials.clientSecret) {
            parameterBuilder.addClientSecret(this.config.clientCredentials.clientSecret);
        }
        if (this.config.clientCredentials.clientAssertion) {
            var clientAssertion = this.config.clientCredentials.clientAssertion;
            parameterBuilder.addClientAssertion(clientAssertion.assertion);
            parameterBuilder.addClientAssertionType(clientAssertion.assertionType);
        }
        return parameterBuilder.createQueryString();
    };
    return OnBehalfOfClient;
}(BaseClient));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var SilentFlowClient = /** @class */ (function (_super) {
    __extends(SilentFlowClient, _super);
    function SilentFlowClient(configuration, performanceClient) {
        return _super.call(this, configuration, performanceClient) || this;
    }
    /**
     * Retrieves a token from cache if it is still valid, or uses the cached refresh token to renew
     * the given token and returns the renewed token
     * @param request
     */
    SilentFlowClient.prototype.acquireToken = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var e_1, refreshTokenClient;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        _a.trys.push([0, 2, , 3]);
                        return [4 /*yield*/, this.acquireCachedToken(request)];
                    case 1: return [2 /*return*/, _a.sent()];
                    case 2:
                        e_1 = _a.sent();
                        if (e_1 instanceof ClientAuthError && e_1.errorCode === ClientAuthErrorMessage.tokenRefreshRequired.code) {
                            refreshTokenClient = new RefreshTokenClient(this.config, this.performanceClient);
                            return [2 /*return*/, refreshTokenClient.acquireTokenByRefreshToken(request)];
                        }
                        else {
                            throw e_1;
                        }
                    case 3: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Retrieves token from cache or throws an error if it must be refreshed.
     * @param request
     */
    SilentFlowClient.prototype.acquireCachedToken = function (request) {
        var _a, _b, _c, _d;
        return __awaiter(this, void 0, void 0, function () {
            var environment, cacheRecord;
            return __generator(this, function (_e) {
                switch (_e.label) {
                    case 0:
                        // Cannot renew token if no request object is given.
                        if (!request) {
                            throw ClientConfigurationError.createEmptyTokenRequestError();
                        }
                        if (request.forceRefresh) {
                            // Must refresh due to present force_refresh flag.
                            (_a = this.serverTelemetryManager) === null || _a === void 0 ? void 0 : _a.setCacheOutcome(CacheOutcome.FORCE_REFRESH);
                            this.logger.info("SilentFlowClient:acquireCachedToken - Skipping cache because forceRefresh is true.");
                            throw ClientAuthError.createRefreshRequiredError();
                        }
                        // We currently do not support silent flow for account === null use cases; This will be revisited for confidential flow usecases
                        if (!request.account) {
                            throw ClientAuthError.createNoAccountInSilentRequestError();
                        }
                        environment = request.authority || this.authority.getPreferredCache();
                        cacheRecord = this.cacheManager.readCacheRecord(request.account, this.config.authOptions.clientId, request, environment);
                        if (!cacheRecord.accessToken) {
                            // Must refresh due to non-existent access_token.
                            (_b = this.serverTelemetryManager) === null || _b === void 0 ? void 0 : _b.setCacheOutcome(CacheOutcome.NO_CACHED_ACCESS_TOKEN);
                            this.logger.info("SilentFlowClient:acquireCachedToken - No access token found in cache for the given properties.");
                            throw ClientAuthError.createRefreshRequiredError();
                        }
                        else if (TimeUtils.wasClockTurnedBack(cacheRecord.accessToken.cachedAt) ||
                            TimeUtils.isTokenExpired(cacheRecord.accessToken.expiresOn, this.config.systemOptions.tokenRenewalOffsetSeconds)) {
                            // Must refresh due to expired access_token.
                            (_c = this.serverTelemetryManager) === null || _c === void 0 ? void 0 : _c.setCacheOutcome(CacheOutcome.CACHED_ACCESS_TOKEN_EXPIRED);
                            this.logger.info("SilentFlowClient:acquireCachedToken - Cached access token is expired or will expire within " + this.config.systemOptions.tokenRenewalOffsetSeconds + " seconds.");
                            throw ClientAuthError.createRefreshRequiredError();
                        }
                        else if (cacheRecord.accessToken.refreshOn && TimeUtils.isTokenExpired(cacheRecord.accessToken.refreshOn, 0)) {
                            // Must refresh due to the refresh_in value.
                            (_d = this.serverTelemetryManager) === null || _d === void 0 ? void 0 : _d.setCacheOutcome(CacheOutcome.REFRESH_CACHED_ACCESS_TOKEN);
                            this.logger.info("SilentFlowClient:acquireCachedToken - Cached access token's refreshOn property has been exceeded'.");
                            throw ClientAuthError.createRefreshRequiredError();
                        }
                        if (this.config.serverTelemetryManager) {
                            this.config.serverTelemetryManager.incrementCacheHits();
                        }
                        return [4 /*yield*/, this.generateResultFromCacheRecord(cacheRecord, request)];
                    case 1: return [2 /*return*/, _e.sent()];
                }
            });
        });
    };
    /**
     * Helper function to build response object from the CacheRecord
     * @param cacheRecord
     */
    SilentFlowClient.prototype.generateResultFromCacheRecord = function (cacheRecord, request) {
        return __awaiter(this, void 0, void 0, function () {
            var idTokenObj;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        if (cacheRecord.idToken) {
                            idTokenObj = new AuthToken(cacheRecord.idToken.secret, this.config.cryptoInterface);
                        }
                        return [4 /*yield*/, ResponseHandler.generateAuthenticationResult(this.cryptoUtils, this.authority, cacheRecord, true, request, idTokenObj)];
                    case 1: return [2 /*return*/, _a.sent()];
                }
            });
        });
    };
    return SilentFlowClient;
}(BaseClient));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Oauth2.0 Password grant client
 * Note: We are only supporting public clients for password grant and for purely testing purposes
 */
var UsernamePasswordClient = /** @class */ (function (_super) {
    __extends(UsernamePasswordClient, _super);
    function UsernamePasswordClient(configuration) {
        return _super.call(this, configuration) || this;
    }
    /**
     * API to acquire a token by passing the username and password to the service in exchage of credentials
     * password_grant
     * @param request
     */
    UsernamePasswordClient.prototype.acquireToken = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var reqTimestamp, response, responseHandler, tokenResponse;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.info("in acquireToken call");
                        reqTimestamp = TimeUtils.nowSeconds();
                        return [4 /*yield*/, this.executeTokenRequest(this.authority, request)];
                    case 1:
                        response = _a.sent();
                        responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, this.config.serializableCache, this.config.persistencePlugin);
                        // Validate response. This function throws a server error if an error is returned by the server.
                        responseHandler.validateTokenResponse(response.body);
                        tokenResponse = responseHandler.handleServerTokenResponse(response.body, this.authority, reqTimestamp, request);
                        return [2 /*return*/, tokenResponse];
                }
            });
        });
    };
    /**
     * Executes POST request to token endpoint
     * @param authority
     * @param request
     */
    UsernamePasswordClient.prototype.executeTokenRequest = function (authority, request) {
        return __awaiter(this, void 0, void 0, function () {
            var thumbprint, requestBody, headers;
            return __generator(this, function (_a) {
                thumbprint = {
                    clientId: this.config.authOptions.clientId,
                    authority: authority.canonicalAuthority,
                    scopes: request.scopes,
                    claims: request.claims,
                    authenticationScheme: request.authenticationScheme,
                    resourceRequestMethod: request.resourceRequestMethod,
                    resourceRequestUri: request.resourceRequestUri,
                    shrClaims: request.shrClaims,
                    sshKid: request.sshKid
                };
                requestBody = this.createTokenRequestBody(request);
                headers = this.createTokenRequestHeaders({
                    credential: request.username,
                    type: exports.CcsCredentialType.UPN
                });
                return [2 /*return*/, this.executePostToTokenEndpoint(authority.tokenEndpoint, requestBody, headers, thumbprint)];
            });
        });
    };
    /**
     * Generates a map for all the params to be sent to the service
     * @param request
     */
    UsernamePasswordClient.prototype.createTokenRequestBody = function (request) {
        var parameterBuilder = new RequestParameterBuilder();
        parameterBuilder.addClientId(this.config.authOptions.clientId);
        parameterBuilder.addUsername(request.username);
        parameterBuilder.addPassword(request.password);
        parameterBuilder.addScopes(request.scopes);
        parameterBuilder.addResponseTypeForTokenAndIdToken();
        parameterBuilder.addGrantType(GrantType.RESOURCE_OWNER_PASSWORD_GRANT);
        parameterBuilder.addClientInfo();
        parameterBuilder.addLibraryInfo(this.config.libraryInfo);
        parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);
        parameterBuilder.addThrottling();
        if (this.serverTelemetryManager) {
            parameterBuilder.addServerTelemetry(this.serverTelemetryManager);
        }
        var correlationId = request.correlationId || this.config.cryptoInterface.createNewGuid();
        parameterBuilder.addCorrelationId(correlationId);
        if (this.config.clientCredentials.clientSecret) {
            parameterBuilder.addClientSecret(this.config.clientCredentials.clientSecret);
        }
        if (this.config.clientCredentials.clientAssertion) {
            var clientAssertion = this.config.clientCredentials.clientAssertion;
            parameterBuilder.addClientAssertion(clientAssertion.assertion);
            parameterBuilder.addClientAssertionType(clientAssertion.assertionType);
        }
        if (!StringUtils.isEmptyObj(request.claims) || this.config.authOptions.clientCapabilities && this.config.authOptions.clientCapabilities.length > 0) {
            parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);
        }
        if (this.config.systemOptions.preventCorsPreflight && request.username) {
            parameterBuilder.addCcsUpn(request.username);
        }
        return parameterBuilder.createQueryString();
    };
    return UsernamePasswordClient;
}(BaseClient));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
function isOpenIdConfigResponse(response) {
    return (response.hasOwnProperty("authorization_endpoint") &&
        response.hasOwnProperty("token_endpoint") &&
        response.hasOwnProperty("issuer") &&
        response.hasOwnProperty("jwks_uri"));
}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var rawMetdataJSON = { "endpointMetadata": { "https://login.microsoftonline.com/common/": { "token_endpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.microsoftonline.com/common/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.microsoftonline.com/{tenantid}/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo", "authorization_endpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.microsoftonline.com/common/kerberos", "tenant_region_scope": null, "cloud_instance_name": "microsoftonline.com", "cloud_graph_host_name": "graph.windows.net", "msgraph_host": "graph.microsoft.com", "rbac_url": "https://pas.windows.net" }, "https://login.chinacloudapi.cn/common/": { "token_endpoint": "https://login.chinacloudapi.cn/common/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.chinacloudapi.cn/common/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.partner.microsoftonline.cn/{tenantid}/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://microsoftgraph.chinacloudapi.cn/oidc/userinfo", "authorization_endpoint": "https://login.chinacloudapi.cn/common/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.chinacloudapi.cn/common/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.chinacloudapi.cn/common/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.chinacloudapi.cn/common/kerberos", "tenant_region_scope": null, "cloud_instance_name": "partner.microsoftonline.cn", "cloud_graph_host_name": "graph.chinacloudapi.cn", "msgraph_host": "microsoftgraph.chinacloudapi.cn", "rbac_url": "https://pas.chinacloudapi.cn" }, "https://login.microsoftonline.us/common/": { "token_endpoint": "https://login.microsoftonline.us/common/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.microsoftonline.us/common/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.microsoftonline.us/{tenantid}/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo", "authorization_endpoint": "https://login.microsoftonline.us/common/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.microsoftonline.us/common/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.microsoftonline.us/common/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.microsoftonline.us/common/kerberos", "tenant_region_scope": null, "cloud_instance_name": "microsoftonline.us", "cloud_graph_host_name": "graph.windows.net", "msgraph_host": "graph.microsoft.com", "rbac_url": "https://pasff.usgovcloudapi.net" }, "https://login.microsoftonline.com/consumers/": { "token_endpoint": "https://login.microsoftonline.com/consumers/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.microsoftonline.com/consumers/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.microsoftonline.com/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo", "authorization_endpoint": "https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.microsoftonline.com/consumers/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.microsoftonline.com/consumers/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.microsoftonline.com/consumers/kerberos", "tenant_region_scope": null, "cloud_instance_name": "microsoftonline.com", "cloud_graph_host_name": "graph.windows.net", "msgraph_host": "graph.microsoft.com", "rbac_url": "https://pas.windows.net" }, "https://login.chinacloudapi.cn/consumers/": { "token_endpoint": "https://login.chinacloudapi.cn/consumers/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.chinacloudapi.cn/consumers/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.partner.microsoftonline.cn/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://microsoftgraph.chinacloudapi.cn/oidc/userinfo", "authorization_endpoint": "https://login.chinacloudapi.cn/consumers/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.chinacloudapi.cn/consumers/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.chinacloudapi.cn/consumers/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.chinacloudapi.cn/consumers/kerberos", "tenant_region_scope": null, "cloud_instance_name": "partner.microsoftonline.cn", "cloud_graph_host_name": "graph.chinacloudapi.cn", "msgraph_host": "microsoftgraph.chinacloudapi.cn", "rbac_url": "https://pas.chinacloudapi.cn" }, "https://login.microsoftonline.us/consumers/": { "token_endpoint": "https://login.microsoftonline.us/consumers/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.microsoftonline.us/consumers/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.microsoftonline.us/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo", "authorization_endpoint": "https://login.microsoftonline.us/consumers/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.microsoftonline.us/consumers/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.microsoftonline.us/consumers/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.microsoftonline.us/consumers/kerberos", "tenant_region_scope": null, "cloud_instance_name": "microsoftonline.us", "cloud_graph_host_name": "graph.windows.net", "msgraph_host": "graph.microsoft.com", "rbac_url": "https://pasff.usgovcloudapi.net" }, "https://login.microsoftonline.com/organizations/": { "token_endpoint": "https://login.microsoftonline.com/organizations/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.microsoftonline.com/organizations/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.microsoftonline.com/{tenantid}/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo", "authorization_endpoint": "https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.microsoftonline.com/organizations/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.microsoftonline.com/organizations/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.microsoftonline.com/organizations/kerberos", "tenant_region_scope": null, "cloud_instance_name": "microsoftonline.com", "cloud_graph_host_name": "graph.windows.net", "msgraph_host": "graph.microsoft.com", "rbac_url": "https://pas.windows.net" }, "https://login.chinacloudapi.cn/organizations/": { "token_endpoint": "https://login.chinacloudapi.cn/organizations/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.chinacloudapi.cn/organizations/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.partner.microsoftonline.cn/{tenantid}/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://microsoftgraph.chinacloudapi.cn/oidc/userinfo", "authorization_endpoint": "https://login.chinacloudapi.cn/organizations/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.chinacloudapi.cn/organizations/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.chinacloudapi.cn/organizations/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.chinacloudapi.cn/organizations/kerberos", "tenant_region_scope": null, "cloud_instance_name": "partner.microsoftonline.cn", "cloud_graph_host_name": "graph.chinacloudapi.cn", "msgraph_host": "microsoftgraph.chinacloudapi.cn", "rbac_url": "https://pas.chinacloudapi.cn" }, "https://login.microsoftonline.us/organizations/": { "token_endpoint": "https://login.microsoftonline.us/organizations/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.microsoftonline.us/organizations/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.microsoftonline.us/{tenantid}/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo", "authorization_endpoint": "https://login.microsoftonline.us/organizations/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.microsoftonline.us/organizations/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.microsoftonline.us/organizations/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.microsoftonline.us/organizations/kerberos", "tenant_region_scope": null, "cloud_instance_name": "microsoftonline.us", "cloud_graph_host_name": "graph.windows.net", "msgraph_host": "graph.microsoft.com", "rbac_url": "https://pasff.usgovcloudapi.net" } }, "instanceDiscoveryMetadata": { "https://login.microsoftonline.com/common/": { "tenant_discovery_endpoint": "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.chinacloudapi.cn/common/": { "tenant_discovery_endpoint": "https://login.chinacloudapi.cn/common/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.microsoftonline.us/common/": { "tenant_discovery_endpoint": "https://login.microsoftonline.us/common/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.microsoftonline.com/consumers/": { "tenant_discovery_endpoint": "https://login.microsoftonline.com/consumers/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.chinacloudapi.cn/consumers/": { "tenant_discovery_endpoint": "https://login.chinacloudapi.cn/consumers/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.microsoftonline.us/consumers/": { "tenant_discovery_endpoint": "https://login.microsoftonline.us/consumers/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.microsoftonline.com/organizations/": { "tenant_discovery_endpoint": "https://login.microsoftonline.com/organizations/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.chinacloudapi.cn/organizations/": { "tenant_discovery_endpoint": "https://login.chinacloudapi.cn/organizations/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.microsoftonline.us/organizations/": { "tenant_discovery_endpoint": "https://login.microsoftonline.us/organizations/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] } } };
var EndpointMetadata = rawMetdataJSON.endpointMetadata;
var InstanceDiscoveryMetadata = rawMetdataJSON.instanceDiscoveryMetadata;

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Protocol modes supported by MSAL.
 */
exports.ProtocolMode = void 0;
(function (ProtocolMode) {
    ProtocolMode["AAD"] = "AAD";
    ProtocolMode["OIDC"] = "OIDC";
})(exports.ProtocolMode || (exports.ProtocolMode = {}));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var AuthorityMetadataEntity = /** @class */ (function () {
    function AuthorityMetadataEntity() {
        this.expiresAt = TimeUtils.nowSeconds() + AUTHORITY_METADATA_CONSTANTS.REFRESH_TIME_SECONDS;
    }
    /**
     * Update the entity with new aliases, preferred_cache and preferred_network values
     * @param metadata
     * @param fromNetwork
     */
    AuthorityMetadataEntity.prototype.updateCloudDiscoveryMetadata = function (metadata, fromNetwork) {
        this.aliases = metadata.aliases;
        this.preferred_cache = metadata.preferred_cache;
        this.preferred_network = metadata.preferred_network;
        this.aliasesFromNetwork = fromNetwork;
    };
    /**
     * Update the entity with new endpoints
     * @param metadata
     * @param fromNetwork
     */
    AuthorityMetadataEntity.prototype.updateEndpointMetadata = function (metadata, fromNetwork) {
        this.authorization_endpoint = metadata.authorization_endpoint;
        this.token_endpoint = metadata.token_endpoint;
        this.end_session_endpoint = metadata.end_session_endpoint;
        this.issuer = metadata.issuer;
        this.endpointsFromNetwork = fromNetwork;
        this.jwks_uri = metadata.jwks_uri;
    };
    /**
     * Save the authority that was used to create this cache entry
     * @param authority
     */
    AuthorityMetadataEntity.prototype.updateCanonicalAuthority = function (authority) {
        this.canonical_authority = authority;
    };
    /**
     * Reset the exiresAt value
     */
    AuthorityMetadataEntity.prototype.resetExpiresAt = function () {
        this.expiresAt = TimeUtils.nowSeconds() + AUTHORITY_METADATA_CONSTANTS.REFRESH_TIME_SECONDS;
    };
    /**
     * Returns whether or not the data needs to be refreshed
     */
    AuthorityMetadataEntity.prototype.isExpired = function () {
        return this.expiresAt <= TimeUtils.nowSeconds();
    };
    /**
     * Validates an entity: checks for all expected params
     * @param entity
     */
    AuthorityMetadataEntity.isAuthorityMetadataEntity = function (key, entity) {
        if (!entity) {
            return false;
        }
        return (key.indexOf(AUTHORITY_METADATA_CONSTANTS.CACHE_KEY) === 0 &&
            entity.hasOwnProperty("aliases") &&
            entity.hasOwnProperty("preferred_cache") &&
            entity.hasOwnProperty("preferred_network") &&
            entity.hasOwnProperty("canonical_authority") &&
            entity.hasOwnProperty("authorization_endpoint") &&
            entity.hasOwnProperty("token_endpoint") &&
            entity.hasOwnProperty("issuer") &&
            entity.hasOwnProperty("aliasesFromNetwork") &&
            entity.hasOwnProperty("endpointsFromNetwork") &&
            entity.hasOwnProperty("expiresAt") &&
            entity.hasOwnProperty("jwks_uri"));
    };
    return AuthorityMetadataEntity;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
function isCloudInstanceDiscoveryResponse(response) {
    return (response.hasOwnProperty("tenant_discovery_endpoint") &&
        response.hasOwnProperty("metadata"));
}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var RegionDiscovery = /** @class */ (function () {
    function RegionDiscovery(networkInterface) {
        this.networkInterface = networkInterface;
    }
    /**
     * Detect the region from the application's environment.
     *
     * @returns Promise<string | null>
     */
    RegionDiscovery.prototype.detectRegion = function (environmentRegion, regionDiscoveryMetadata, proxyUrl) {
        return __awaiter(this, void 0, void 0, function () {
            var autodetectedRegionName, options, localIMDSVersionResponse, currentIMDSVersion, currentIMDSVersionResponse;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        autodetectedRegionName = environmentRegion;
                        if (!!autodetectedRegionName) return [3 /*break*/, 8];
                        options = RegionDiscovery.IMDS_OPTIONS;
                        if (proxyUrl) {
                            options.proxyUrl = proxyUrl;
                        }
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 6, , 7]);
                        return [4 /*yield*/, this.getRegionFromIMDS(Constants.IMDS_VERSION, options)];
                    case 2:
                        localIMDSVersionResponse = _a.sent();
                        if (localIMDSVersionResponse.status === ResponseCodes.httpSuccess) {
                            autodetectedRegionName = localIMDSVersionResponse.body;
                            regionDiscoveryMetadata.region_source = RegionDiscoverySources.IMDS;
                        }
                        if (!(localIMDSVersionResponse.status === ResponseCodes.httpBadRequest)) return [3 /*break*/, 5];
                        return [4 /*yield*/, this.getCurrentVersion(options)];
                    case 3:
                        currentIMDSVersion = _a.sent();
                        if (!currentIMDSVersion) {
                            regionDiscoveryMetadata.region_source = RegionDiscoverySources.FAILED_AUTO_DETECTION;
                            return [2 /*return*/, null];
                        }
                        return [4 /*yield*/, this.getRegionFromIMDS(currentIMDSVersion, options)];
                    case 4:
                        currentIMDSVersionResponse = _a.sent();
                        if (currentIMDSVersionResponse.status === ResponseCodes.httpSuccess) {
                            autodetectedRegionName = currentIMDSVersionResponse.body;
                            regionDiscoveryMetadata.region_source = RegionDiscoverySources.IMDS;
                        }
                        _a.label = 5;
                    case 5: return [3 /*break*/, 7];
                    case 6:
                        _a.sent();
                        regionDiscoveryMetadata.region_source = RegionDiscoverySources.FAILED_AUTO_DETECTION;
                        return [2 /*return*/, null];
                    case 7: return [3 /*break*/, 9];
                    case 8:
                        regionDiscoveryMetadata.region_source = RegionDiscoverySources.ENVIRONMENT_VARIABLE;
                        _a.label = 9;
                    case 9:
                        // If no region was auto detected from the environment or from the IMDS endpoint, mark the attempt as a FAILED_AUTO_DETECTION
                        if (!autodetectedRegionName) {
                            regionDiscoveryMetadata.region_source = RegionDiscoverySources.FAILED_AUTO_DETECTION;
                        }
                        return [2 /*return*/, autodetectedRegionName || null];
                }
            });
        });
    };
    /**
     * Make the call to the IMDS endpoint
     *
     * @param imdsEndpointUrl
     * @returns Promise<NetworkResponse<string>>
     */
    RegionDiscovery.prototype.getRegionFromIMDS = function (version, options) {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                return [2 /*return*/, this.networkInterface.sendGetRequestAsync(Constants.IMDS_ENDPOINT + "?api-version=" + version + "&format=text", options, Constants.IMDS_TIMEOUT)];
            });
        });
    };
    /**
     * Get the most recent version of the IMDS endpoint available
     *
     * @returns Promise<string | null>
     */
    RegionDiscovery.prototype.getCurrentVersion = function (options) {
        return __awaiter(this, void 0, void 0, function () {
            var response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        _a.trys.push([0, 2, , 3]);
                        return [4 /*yield*/, this.networkInterface.sendGetRequestAsync(Constants.IMDS_ENDPOINT + "?format=json", options)];
                    case 1:
                        response = _a.sent();
                        // When IMDS endpoint is called without the api version query param, bad request response comes back with latest version.
                        if (response.status === ResponseCodes.httpBadRequest && response.body && response.body["newest-versions"] && response.body["newest-versions"].length > 0) {
                            return [2 /*return*/, response.body["newest-versions"][0]];
                        }
                        return [2 /*return*/, null];
                    case 2:
                        _a.sent();
                        return [2 /*return*/, null];
                    case 3: return [2 /*return*/];
                }
            });
        });
    };
    // Options for the IMDS endpoint request
    RegionDiscovery.IMDS_OPTIONS = {
        headers: {
            Metadata: "true",
        },
    };
    return RegionDiscovery;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * The authority class validates the authority URIs used by the user, and retrieves the OpenID Configuration Data from the
 * endpoint. It will store the pertinent config data in this object for use during token calls.
 */
var Authority = /** @class */ (function () {
    function Authority(authority, networkInterface, cacheManager, authorityOptions, proxyUrl) {
        this.canonicalAuthority = authority;
        this._canonicalAuthority.validateAsUri();
        this.networkInterface = networkInterface;
        this.cacheManager = cacheManager;
        this.authorityOptions = authorityOptions;
        this.regionDiscovery = new RegionDiscovery(networkInterface);
        this.regionDiscoveryMetadata = { region_used: undefined, region_source: undefined, region_outcome: undefined };
        this.proxyUrl = proxyUrl || Constants.EMPTY_STRING;
    }
    Object.defineProperty(Authority.prototype, "authorityType", {
        // See above for AuthorityType
        get: function () {
            var pathSegments = this.canonicalAuthorityUrlComponents.PathSegments;
            if (pathSegments.length && pathSegments[0].toLowerCase() === Constants.ADFS) {
                return exports.AuthorityType.Adfs;
            }
            return exports.AuthorityType.Default;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "protocolMode", {
        /**
         * ProtocolMode enum representing the way endpoints are constructed.
         */
        get: function () {
            return this.authorityOptions.protocolMode;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "options", {
        /**
         * Returns authorityOptions which can be used to reinstantiate a new authority instance
         */
        get: function () {
            return this.authorityOptions;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "canonicalAuthority", {
        /**
         * A URL that is the authority set by the developer
         */
        get: function () {
            return this._canonicalAuthority.urlString;
        },
        /**
         * Sets canonical authority.
         */
        set: function (url) {
            this._canonicalAuthority = new UrlString(url);
            this._canonicalAuthority.validateAsUri();
            this._canonicalAuthorityUrlComponents = null;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "canonicalAuthorityUrlComponents", {
        /**
         * Get authority components.
         */
        get: function () {
            if (!this._canonicalAuthorityUrlComponents) {
                this._canonicalAuthorityUrlComponents = this._canonicalAuthority.getUrlComponents();
            }
            return this._canonicalAuthorityUrlComponents;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "hostnameAndPort", {
        /**
         * Get hostname and port i.e. login.microsoftonline.com
         */
        get: function () {
            return this.canonicalAuthorityUrlComponents.HostNameAndPort.toLowerCase();
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "tenant", {
        /**
         * Get tenant for authority.
         */
        get: function () {
            return this.canonicalAuthorityUrlComponents.PathSegments[0];
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "authorizationEndpoint", {
        /**
         * OAuth /authorize endpoint for requests
         */
        get: function () {
            if (this.discoveryComplete()) {
                var endpoint = this.replacePath(this.metadata.authorization_endpoint);
                return this.replaceTenant(endpoint);
            }
            else {
                throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
            }
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "tokenEndpoint", {
        /**
         * OAuth /token endpoint for requests
         */
        get: function () {
            if (this.discoveryComplete()) {
                var endpoint = this.replacePath(this.metadata.token_endpoint);
                return this.replaceTenant(endpoint);
            }
            else {
                throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
            }
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "deviceCodeEndpoint", {
        get: function () {
            if (this.discoveryComplete()) {
                var endpoint = this.replacePath(this.metadata.token_endpoint.replace("/token", "/devicecode"));
                return this.replaceTenant(endpoint);
            }
            else {
                throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
            }
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "endSessionEndpoint", {
        /**
         * OAuth logout endpoint for requests
         */
        get: function () {
            if (this.discoveryComplete()) {
                // ROPC policies may not have end_session_endpoint set
                if (!this.metadata.end_session_endpoint) {
                    throw ClientAuthError.createLogoutNotSupportedError();
                }
                var endpoint = this.replacePath(this.metadata.end_session_endpoint);
                return this.replaceTenant(endpoint);
            }
            else {
                throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
            }
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "selfSignedJwtAudience", {
        /**
         * OAuth issuer for requests
         */
        get: function () {
            if (this.discoveryComplete()) {
                var endpoint = this.replacePath(this.metadata.issuer);
                return this.replaceTenant(endpoint);
            }
            else {
                throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
            }
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "jwksUri", {
        /**
         * Jwks_uri for token signing keys
         */
        get: function () {
            if (this.discoveryComplete()) {
                var endpoint = this.replacePath(this.metadata.jwks_uri);
                return this.replaceTenant(endpoint);
            }
            else {
                throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
            }
        },
        enumerable: false,
        configurable: true
    });
    /**
     * Replaces tenant in url path with current tenant. Defaults to common.
     * @param urlString
     */
    Authority.prototype.replaceTenant = function (urlString) {
        return urlString.replace(/{tenant}|{tenantid}/g, this.tenant);
    };
    /**
     * Replaces path such as tenant or policy with the current tenant or policy.
     * @param urlString
     */
    Authority.prototype.replacePath = function (urlString) {
        var endpoint = urlString;
        var cachedAuthorityUrl = new UrlString(this.metadata.canonical_authority);
        var cachedAuthorityParts = cachedAuthorityUrl.getUrlComponents().PathSegments;
        var currentAuthorityParts = this.canonicalAuthorityUrlComponents.PathSegments;
        currentAuthorityParts.forEach(function (currentPart, index) {
            var cachedPart = cachedAuthorityParts[index];
            if (currentPart !== cachedPart) {
                endpoint = endpoint.replace("/" + cachedPart + "/", "/" + currentPart + "/");
            }
        });
        return endpoint;
    };
    Object.defineProperty(Authority.prototype, "defaultOpenIdConfigurationEndpoint", {
        /**
         * The default open id configuration endpoint for any canonical authority.
         */
        get: function () {
            if (this.authorityType === exports.AuthorityType.Adfs || this.protocolMode === exports.ProtocolMode.OIDC) {
                return this.canonicalAuthority + ".well-known/openid-configuration";
            }
            return this.canonicalAuthority + "v2.0/.well-known/openid-configuration";
        },
        enumerable: false,
        configurable: true
    });
    /**
     * Boolean that returns whethr or not tenant discovery has been completed.
     */
    Authority.prototype.discoveryComplete = function () {
        return !!this.metadata;
    };
    /**
     * Perform endpoint discovery to discover aliases, preferred_cache, preferred_network
     * and the /authorize, /token and logout endpoints.
     */
    Authority.prototype.resolveEndpointsAsync = function () {
        return __awaiter(this, void 0, void 0, function () {
            var metadataEntity, cloudDiscoverySource, endpointSource, cacheKey;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        metadataEntity = this.cacheManager.getAuthorityMetadataByAlias(this.hostnameAndPort);
                        if (!metadataEntity) {
                            metadataEntity = new AuthorityMetadataEntity();
                            metadataEntity.updateCanonicalAuthority(this.canonicalAuthority);
                        }
                        return [4 /*yield*/, this.updateCloudDiscoveryMetadata(metadataEntity)];
                    case 1:
                        cloudDiscoverySource = _a.sent();
                        this.canonicalAuthority = this.canonicalAuthority.replace(this.hostnameAndPort, metadataEntity.preferred_network);
                        return [4 /*yield*/, this.updateEndpointMetadata(metadataEntity)];
                    case 2:
                        endpointSource = _a.sent();
                        if (cloudDiscoverySource !== AuthorityMetadataSource.CACHE && endpointSource !== AuthorityMetadataSource.CACHE) {
                            // Reset the expiration time unless both values came from a successful cache lookup
                            metadataEntity.resetExpiresAt();
                            metadataEntity.updateCanonicalAuthority(this.canonicalAuthority);
                        }
                        cacheKey = this.cacheManager.generateAuthorityMetadataCacheKey(metadataEntity.preferred_cache);
                        this.cacheManager.setAuthorityMetadata(cacheKey, metadataEntity);
                        this.metadata = metadataEntity;
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Update AuthorityMetadataEntity with new endpoints and return where the information came from
     * @param metadataEntity
     */
    Authority.prototype.updateEndpointMetadata = function (metadataEntity) {
        var _a, _b;
        return __awaiter(this, void 0, void 0, function () {
            var metadata, harcodedMetadata;
            return __generator(this, function (_c) {
                switch (_c.label) {
                    case 0:
                        metadata = this.getEndpointMetadataFromConfig();
                        if (metadata) {
                            metadataEntity.updateEndpointMetadata(metadata, false);
                            return [2 /*return*/, AuthorityMetadataSource.CONFIG];
                        }
                        if (this.isAuthoritySameType(metadataEntity) && metadataEntity.endpointsFromNetwork && !metadataEntity.isExpired()) {
                            // No need to update
                            return [2 /*return*/, AuthorityMetadataSource.CACHE];
                        }
                        harcodedMetadata = this.getEndpointMetadataFromHardcodedValues();
                        return [4 /*yield*/, this.getEndpointMetadataFromNetwork()];
                    case 1:
                        metadata = _c.sent();
                        if (!metadata) return [3 /*break*/, 4];
                        if (!((_a = this.authorityOptions.azureRegionConfiguration) === null || _a === void 0 ? void 0 : _a.azureRegion)) return [3 /*break*/, 3];
                        return [4 /*yield*/, this.updateMetadataWithRegionalInformation(metadata)];
                    case 2:
                        metadata = _c.sent();
                        _c.label = 3;
                    case 3:
                        metadataEntity.updateEndpointMetadata(metadata, true);
                        return [2 /*return*/, AuthorityMetadataSource.NETWORK];
                    case 4:
                        if (!(harcodedMetadata && !this.authorityOptions.skipAuthorityMetadataCache)) return [3 /*break*/, 7];
                        if (!((_b = this.authorityOptions.azureRegionConfiguration) === null || _b === void 0 ? void 0 : _b.azureRegion)) return [3 /*break*/, 6];
                        return [4 /*yield*/, this.updateMetadataWithRegionalInformation(harcodedMetadata)];
                    case 5:
                        harcodedMetadata = _c.sent();
                        _c.label = 6;
                    case 6:
                        metadataEntity.updateEndpointMetadata(harcodedMetadata, false);
                        return [2 /*return*/, AuthorityMetadataSource.HARDCODED_VALUES];
                    case 7: throw ClientAuthError.createUnableToGetOpenidConfigError(this.defaultOpenIdConfigurationEndpoint);
                }
            });
        });
    };
    /**
     * Compares the number of url components after the domain to determine if the cached authority metadata can be used for the requested authority
     * Protects against same domain different authority such as login.microsoftonline.com/tenant and login.microsoftonline.com/tfp/tenant/policy
     * @param metadataEntity
     */
    Authority.prototype.isAuthoritySameType = function (metadataEntity) {
        var cachedAuthorityUrl = new UrlString(metadataEntity.canonical_authority);
        var cachedParts = cachedAuthorityUrl.getUrlComponents().PathSegments;
        return cachedParts.length === this.canonicalAuthorityUrlComponents.PathSegments.length;
    };
    /**
     * Parse authorityMetadata config option
     */
    Authority.prototype.getEndpointMetadataFromConfig = function () {
        if (this.authorityOptions.authorityMetadata) {
            try {
                return JSON.parse(this.authorityOptions.authorityMetadata);
            }
            catch (e) {
                throw ClientConfigurationError.createInvalidAuthorityMetadataError();
            }
        }
        return null;
    };
    /**
     * Gets OAuth endpoints from the given OpenID configuration endpoint.
     *
     * @param hasHardcodedMetadata boolean
     */
    Authority.prototype.getEndpointMetadataFromNetwork = function () {
        return __awaiter(this, void 0, void 0, function () {
            var options, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        options = {};
                        if (this.proxyUrl) {
                            options.proxyUrl = this.proxyUrl;
                        }
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        return [4 /*yield*/, this.networkInterface.sendGetRequestAsync(this.defaultOpenIdConfigurationEndpoint, options)];
                    case 2:
                        response = _a.sent();
                        return [2 /*return*/, isOpenIdConfigResponse(response.body) ? response.body : null];
                    case 3:
                        _a.sent();
                        return [2 /*return*/, null];
                    case 4: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Get OAuth endpoints for common authorities.
     */
    Authority.prototype.getEndpointMetadataFromHardcodedValues = function () {
        if (this.canonicalAuthority in EndpointMetadata) {
            return EndpointMetadata[this.canonicalAuthority];
        }
        return null;
    };
    /**
     * Update the retrieved metadata with regional information.
     */
    Authority.prototype.updateMetadataWithRegionalInformation = function (metadata) {
        var _a, _b, _c, _d, _e;
        return __awaiter(this, void 0, void 0, function () {
            var autodetectedRegionName, azureRegion;
            return __generator(this, function (_f) {
                switch (_f.label) {
                    case 0: return [4 /*yield*/, this.regionDiscovery.detectRegion((_a = this.authorityOptions.azureRegionConfiguration) === null || _a === void 0 ? void 0 : _a.environmentRegion, this.regionDiscoveryMetadata, this.proxyUrl)];
                    case 1:
                        autodetectedRegionName = _f.sent();
                        azureRegion = ((_b = this.authorityOptions.azureRegionConfiguration) === null || _b === void 0 ? void 0 : _b.azureRegion) === Constants.AZURE_REGION_AUTO_DISCOVER_FLAG
                            ? autodetectedRegionName
                            : (_c = this.authorityOptions.azureRegionConfiguration) === null || _c === void 0 ? void 0 : _c.azureRegion;
                        if (((_d = this.authorityOptions.azureRegionConfiguration) === null || _d === void 0 ? void 0 : _d.azureRegion) === Constants.AZURE_REGION_AUTO_DISCOVER_FLAG) {
                            this.regionDiscoveryMetadata.region_outcome = autodetectedRegionName ?
                                RegionDiscoveryOutcomes.AUTO_DETECTION_REQUESTED_SUCCESSFUL :
                                RegionDiscoveryOutcomes.AUTO_DETECTION_REQUESTED_FAILED;
                        }
                        else {
                            if (autodetectedRegionName) {
                                this.regionDiscoveryMetadata.region_outcome = (((_e = this.authorityOptions.azureRegionConfiguration) === null || _e === void 0 ? void 0 : _e.azureRegion) === autodetectedRegionName) ?
                                    RegionDiscoveryOutcomes.CONFIGURED_MATCHES_DETECTED :
                                    RegionDiscoveryOutcomes.CONFIGURED_NOT_DETECTED;
                            }
                            else {
                                this.regionDiscoveryMetadata.region_outcome = RegionDiscoveryOutcomes.CONFIGURED_NO_AUTO_DETECTION;
                            }
                        }
                        if (azureRegion) {
                            this.regionDiscoveryMetadata.region_used = azureRegion;
                            return [2 /*return*/, Authority.replaceWithRegionalInformation(metadata, azureRegion)];
                        }
                        return [2 /*return*/, metadata];
                }
            });
        });
    };
    /**
     * Updates the AuthorityMetadataEntity with new aliases, preferred_network and preferred_cache and returns where the information was retrived from
     * @param cachedMetadata
     * @param newMetadata
     */
    Authority.prototype.updateCloudDiscoveryMetadata = function (metadataEntity) {
        return __awaiter(this, void 0, void 0, function () {
            var metadata, harcodedMetadata;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        metadata = this.getCloudDiscoveryMetadataFromConfig();
                        if (metadata) {
                            metadataEntity.updateCloudDiscoveryMetadata(metadata, false);
                            return [2 /*return*/, AuthorityMetadataSource.CONFIG];
                        }
                        // If The cached metadata came from config but that config was not passed to this instance, we must go to the network
                        if (this.isAuthoritySameType(metadataEntity) && metadataEntity.aliasesFromNetwork && !metadataEntity.isExpired()) {
                            // No need to update
                            return [2 /*return*/, AuthorityMetadataSource.CACHE];
                        }
                        harcodedMetadata = this.getCloudDiscoveryMetadataFromHarcodedValues();
                        return [4 /*yield*/, this.getCloudDiscoveryMetadataFromNetwork()];
                    case 1:
                        metadata = _a.sent();
                        if (metadata) {
                            metadataEntity.updateCloudDiscoveryMetadata(metadata, true);
                            return [2 /*return*/, AuthorityMetadataSource.NETWORK];
                        }
                        if (harcodedMetadata && !this.options.skipAuthorityMetadataCache) {
                            metadataEntity.updateCloudDiscoveryMetadata(harcodedMetadata, false);
                            return [2 /*return*/, AuthorityMetadataSource.HARDCODED_VALUES];
                        }
                        else {
                            // Metadata could not be obtained from config, cache or network
                            throw ClientConfigurationError.createUntrustedAuthorityError();
                        }
                }
            });
        });
    };
    /**
     * Parse cloudDiscoveryMetadata config or check knownAuthorities
     */
    Authority.prototype.getCloudDiscoveryMetadataFromConfig = function () {
        // Check if network response was provided in config
        if (this.authorityOptions.cloudDiscoveryMetadata) {
            try {
                var parsedResponse = JSON.parse(this.authorityOptions.cloudDiscoveryMetadata);
                var metadata = Authority.getCloudDiscoveryMetadataFromNetworkResponse(parsedResponse.metadata, this.hostnameAndPort);
                if (metadata) {
                    return metadata;
                }
            }
            catch (e) {
                throw ClientConfigurationError.createInvalidCloudDiscoveryMetadataError();
            }
        }
        // If cloudDiscoveryMetadata is empty or does not contain the host, check knownAuthorities
        if (this.isInKnownAuthorities()) {
            return Authority.createCloudDiscoveryMetadataFromHost(this.hostnameAndPort);
        }
        return null;
    };
    /**
     * Called to get metadata from network if CloudDiscoveryMetadata was not populated by config
     *
     * @param hasHardcodedMetadata boolean
     */
    Authority.prototype.getCloudDiscoveryMetadataFromNetwork = function () {
        return __awaiter(this, void 0, void 0, function () {
            var instanceDiscoveryEndpoint, options, match, response, metadata;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        instanceDiscoveryEndpoint = "" + Constants.AAD_INSTANCE_DISCOVERY_ENDPT + this.canonicalAuthority + "oauth2/v2.0/authorize";
                        options = {};
                        if (this.proxyUrl) {
                            options.proxyUrl = this.proxyUrl;
                        }
                        match = null;
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        return [4 /*yield*/, this.networkInterface.sendGetRequestAsync(instanceDiscoveryEndpoint, options)];
                    case 2:
                        response = _a.sent();
                        metadata = isCloudInstanceDiscoveryResponse(response.body)
                            ? response.body.metadata
                            : [];
                        if (metadata.length === 0) {
                            // If no metadata is returned, authority is untrusted
                            return [2 /*return*/, null];
                        }
                        match = Authority.getCloudDiscoveryMetadataFromNetworkResponse(metadata, this.hostnameAndPort);
                        return [3 /*break*/, 4];
                    case 3:
                        _a.sent();
                        return [2 /*return*/, null];
                    case 4:
                        if (!match) {
                            // Custom Domain scenario, host is trusted because Instance Discovery call succeeded
                            match = Authority.createCloudDiscoveryMetadataFromHost(this.hostnameAndPort);
                        }
                        return [2 /*return*/, match];
                }
            });
        });
    };
    /**
     * Get cloud discovery metadata for common authorities
     */
    Authority.prototype.getCloudDiscoveryMetadataFromHarcodedValues = function () {
        if (this.canonicalAuthority in InstanceDiscoveryMetadata) {
            return InstanceDiscoveryMetadata[this.canonicalAuthority];
        }
        return null;
    };
    /**
     * Helper function to determine if this host is included in the knownAuthorities config option
     */
    Authority.prototype.isInKnownAuthorities = function () {
        var _this = this;
        var matches = this.authorityOptions.knownAuthorities.filter(function (authority) {
            return UrlString.getDomainFromUrl(authority).toLowerCase() === _this.hostnameAndPort;
        });
        return matches.length > 0;
    };
    /**
     * helper function to populate the authority based on azureCloudOptions
     * @param authorityString
     * @param azureCloudOptions
     */
    Authority.generateAuthority = function (authorityString, azureCloudOptions) {
        var authorityAzureCloudInstance;
        if (azureCloudOptions && azureCloudOptions.azureCloudInstance !== exports.AzureCloudInstance.None) {
            var tenant = azureCloudOptions.tenant ? azureCloudOptions.tenant : Constants.DEFAULT_COMMON_TENANT;
            authorityAzureCloudInstance = azureCloudOptions.azureCloudInstance + "/" + tenant + "/";
        }
        return authorityAzureCloudInstance ? authorityAzureCloudInstance : authorityString;
    };
    /**
     * Creates cloud discovery metadata object from a given host
     * @param host
     */
    Authority.createCloudDiscoveryMetadataFromHost = function (host) {
        return {
            preferred_network: host,
            preferred_cache: host,
            aliases: [host]
        };
    };
    /**
     * Searches instance discovery network response for the entry that contains the host in the aliases list
     * @param response
     * @param authority
     */
    Authority.getCloudDiscoveryMetadataFromNetworkResponse = function (response, authority) {
        for (var i = 0; i < response.length; i++) {
            var metadata = response[i];
            if (metadata.aliases.indexOf(authority) > -1) {
                return metadata;
            }
        }
        return null;
    };
    /**
     * helper function to generate environment from authority object
     */
    Authority.prototype.getPreferredCache = function () {
        if (this.discoveryComplete()) {
            return this.metadata.preferred_cache;
        }
        else {
            throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
        }
    };
    /**
     * Returns whether or not the provided host is an alias of this authority instance
     * @param host
     */
    Authority.prototype.isAlias = function (host) {
        return this.metadata.aliases.indexOf(host) > -1;
    };
    /**
     * Checks whether the provided host is that of a public cloud authority
     *
     * @param authority string
     * @returns bool
     */
    Authority.isPublicCloudAuthority = function (host) {
        return Constants.KNOWN_PUBLIC_CLOUDS.indexOf(host) >= 0;
    };
    /**
     * Rebuild the authority string with the region
     *
     * @param host string
     * @param region string
     */
    Authority.buildRegionalAuthorityString = function (host, region, queryString) {
        // Create and validate a Url string object with the initial authority string
        var authorityUrlInstance = new UrlString(host);
        authorityUrlInstance.validateAsUri();
        var authorityUrlParts = authorityUrlInstance.getUrlComponents();
        var hostNameAndPort = region + "." + authorityUrlParts.HostNameAndPort;
        if (this.isPublicCloudAuthority(authorityUrlParts.HostNameAndPort)) {
            hostNameAndPort = region + "." + Constants.REGIONAL_AUTH_PUBLIC_CLOUD_SUFFIX;
        }
        // Include the query string portion of the url
        var url = UrlString.constructAuthorityUriFromObject(__assign(__assign({}, authorityUrlInstance.getUrlComponents()), { HostNameAndPort: hostNameAndPort })).urlString;
        // Add the query string if a query string was provided
        if (queryString)
            return url + "?" + queryString;
        return url;
    };
    /**
     * Replace the endpoints in the metadata object with their regional equivalents.
     *
     * @param metadata OpenIdConfigResponse
     * @param azureRegion string
     */
    Authority.replaceWithRegionalInformation = function (metadata, azureRegion) {
        metadata.authorization_endpoint = Authority.buildRegionalAuthorityString(metadata.authorization_endpoint, azureRegion);
        // TODO: Enquire on whether we should leave the query string or remove it before releasing the feature
        metadata.token_endpoint = Authority.buildRegionalAuthorityString(metadata.token_endpoint, azureRegion, "allowestsrnonmsi=true");
        if (metadata.end_session_endpoint) {
            metadata.end_session_endpoint = Authority.buildRegionalAuthorityString(metadata.end_session_endpoint, azureRegion);
        }
        return metadata;
    };
    return Authority;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var AuthorityFactory = /** @class */ (function () {
    function AuthorityFactory() {
    }
    /**
     * Create an authority object of the correct type based on the url
     * Performs basic authority validation - checks to see if the authority is of a valid type (i.e. aad, b2c, adfs)
     *
     * Also performs endpoint discovery.
     *
     * @param authorityUri
     * @param networkClient
     * @param protocolMode
     */
    AuthorityFactory.createDiscoveredInstance = function (authorityUri, networkClient, cacheManager, authorityOptions, proxyUrl) {
        return __awaiter(this, void 0, void 0, function () {
            var acquireTokenAuthority, e_1;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        acquireTokenAuthority = AuthorityFactory.createInstance(authorityUri, networkClient, cacheManager, authorityOptions, proxyUrl);
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        return [4 /*yield*/, acquireTokenAuthority.resolveEndpointsAsync()];
                    case 2:
                        _a.sent();
                        return [2 /*return*/, acquireTokenAuthority];
                    case 3:
                        e_1 = _a.sent();
                        throw ClientAuthError.createEndpointDiscoveryIncompleteError(e_1);
                    case 4: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Create an authority object of the correct type based on the url
     * Performs basic authority validation - checks to see if the authority is of a valid type (i.e. aad, b2c, adfs)
     *
     * Does not perform endpoint discovery.
     *
     * @param authorityUrl
     * @param networkInterface
     * @param protocolMode
     */
    AuthorityFactory.createInstance = function (authorityUrl, networkInterface, cacheManager, authorityOptions, proxyUrl) {
        // Throw error if authority url is empty
        if (StringUtils.isEmpty(authorityUrl)) {
            throw ClientConfigurationError.createUrlEmptyError();
        }
        return new Authority(authorityUrl, networkInterface, cacheManager, authorityOptions, proxyUrl);
    };
    return AuthorityFactory;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var ServerTelemetryEntity = /** @class */ (function () {
    function ServerTelemetryEntity() {
        this.failedRequests = [];
        this.errors = [];
        this.cacheHits = 0;
    }
    /**
     * validates if a given cache entry is "Telemetry", parses <key,value>
     * @param key
     * @param entity
     */
    ServerTelemetryEntity.isServerTelemetryEntity = function (key, entity) {
        var validateKey = key.indexOf(SERVER_TELEM_CONSTANTS.CACHE_KEY) === 0;
        var validateEntity = true;
        if (entity) {
            validateEntity =
                entity.hasOwnProperty("failedRequests") &&
                    entity.hasOwnProperty("errors") &&
                    entity.hasOwnProperty("cacheHits");
        }
        return validateKey && validateEntity;
    };
    return ServerTelemetryEntity;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var ThrottlingEntity = /** @class */ (function () {
    function ThrottlingEntity() {
    }
    /**
     * validates if a given cache entry is "Throttling", parses <key,value>
     * @param key
     * @param entity
     */
    ThrottlingEntity.isThrottlingEntity = function (key, entity) {
        var validateKey = false;
        if (key) {
            validateKey = key.indexOf(ThrottlingConstants.THROTTLING_PREFIX) === 0;
        }
        var validateEntity = true;
        if (entity) {
            validateEntity = entity.hasOwnProperty("throttleTime");
        }
        return validateKey && validateEntity;
    };
    return ThrottlingEntity;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var StubbedNetworkModule = {
    sendGetRequestAsync: function () {
        var notImplErr = "Network interface - sendGetRequestAsync() has not been implemented for the Network interface.";
        return Promise.reject(AuthError.createUnexpectedError(notImplErr));
    },
    sendPostRequestAsync: function () {
        var notImplErr = "Network interface - sendPostRequestAsync() has not been implemented for the Network interface.";
        return Promise.reject(AuthError.createUnexpectedError(notImplErr));
    }
};

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * ClientAuthErrorMessage class containing string constants used by error codes and messages.
 */
var JoseHeaderErrorMessage = {
    missingKidError: {
        code: "missing_kid_error",
        desc: "The JOSE Header for the requested JWT, JWS or JWK object requires a keyId to be configured as the 'kid' header claim. No 'kid' value was provided."
    },
    missingAlgError: {
        code: "missing_alg_error",
        desc: "The JOSE Header for the requested JWT, JWS or JWK object requires an algorithm to be specified as the 'alg' header claim. No 'alg' value was provided."
    },
};
/**
 * Error thrown when there is an error in the client code running on the browser.
 */
var JoseHeaderError = /** @class */ (function (_super) {
    __extends(JoseHeaderError, _super);
    function JoseHeaderError(errorCode, errorMessage) {
        var _this = _super.call(this, errorCode, errorMessage) || this;
        _this.name = "JoseHeaderError";
        Object.setPrototypeOf(_this, JoseHeaderError.prototype);
        return _this;
    }
    /**
     * Creates an error thrown when keyId isn't set on JOSE header.
     */
    JoseHeaderError.createMissingKidError = function () {
        return new JoseHeaderError(JoseHeaderErrorMessage.missingKidError.code, JoseHeaderErrorMessage.missingKidError.desc);
    };
    /**
     * Creates an error thrown when algorithm isn't set on JOSE header.
     */
    JoseHeaderError.createMissingAlgError = function () {
        return new JoseHeaderError(JoseHeaderErrorMessage.missingAlgError.code, JoseHeaderErrorMessage.missingAlgError.desc);
    };
    return JoseHeaderError;
}(AuthError));

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var JoseHeader = /** @class */ (function () {
    function JoseHeader(options) {
        this.typ = options.typ;
        this.alg = options.alg;
        this.kid = options.kid;
    }
    /**
     * Builds SignedHttpRequest formatted JOSE Header from the
     * JOSE Header options provided or previously set on the object and returns
     * the stringified header object.
     * Throws if keyId or algorithm aren't provided since they are required for Access Token Binding.
     * @param shrHeaderOptions
     * @returns
     */
    JoseHeader.getShrHeaderString = function (shrHeaderOptions) {
        // KeyID is required on the SHR header
        if (!shrHeaderOptions.kid) {
            throw JoseHeaderError.createMissingKidError();
        }
        // Alg is required on the SHR header
        if (!shrHeaderOptions.alg) {
            throw JoseHeaderError.createMissingAlgError();
        }
        var shrHeader = new JoseHeader({
            // Access Token PoP headers must have type JWT, but the type header can be overriden for special cases
            typ: shrHeaderOptions.typ || JsonTypes.Jwt,
            kid: shrHeaderOptions.kid,
            alg: shrHeaderOptions.alg
        });
        return JSON.stringify(shrHeader);
    };
    return JoseHeader;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * This is a helper class that parses supported HTTP response authentication headers to extract and return
 * header challenge values that can be used outside the basic authorization flows.
 */
var AuthenticationHeaderParser = /** @class */ (function () {
    function AuthenticationHeaderParser(headers) {
        this.headers = headers;
    }
    /**
     * This method parses the SHR nonce value out of either the Authentication-Info or WWW-Authenticate authentication headers.
     * @returns
     */
    AuthenticationHeaderParser.prototype.getShrNonce = function () {
        // Attempt to parse nonce from Authentiacation-Info
        var authenticationInfo = this.headers[HeaderNames.AuthenticationInfo];
        if (authenticationInfo) {
            var authenticationInfoChallenges = this.parseChallenges(authenticationInfo);
            if (authenticationInfoChallenges.nextnonce) {
                return authenticationInfoChallenges.nextnonce;
            }
            throw ClientConfigurationError.createInvalidAuthenticationHeaderError(HeaderNames.AuthenticationInfo, "nextnonce challenge is missing.");
        }
        // Attempt to parse nonce from WWW-Authenticate
        var wwwAuthenticate = this.headers[HeaderNames.WWWAuthenticate];
        if (wwwAuthenticate) {
            var wwwAuthenticateChallenges = this.parseChallenges(wwwAuthenticate);
            if (wwwAuthenticateChallenges.nonce) {
                return wwwAuthenticateChallenges.nonce;
            }
            throw ClientConfigurationError.createInvalidAuthenticationHeaderError(HeaderNames.WWWAuthenticate, "nonce challenge is missing.");
        }
        // If neither header is present, throw missing headers error
        throw ClientConfigurationError.createMissingNonceAuthenticationHeadersError();
    };
    /**
     * Parses an HTTP header's challenge set into a key/value map.
     * @param header
     * @returns
     */
    AuthenticationHeaderParser.prototype.parseChallenges = function (header) {
        var schemeSeparator = header.indexOf(" ");
        var challenges = header.substr(schemeSeparator + 1).split(",");
        var challengeMap = {};
        challenges.forEach(function (challenge) {
            var _a = challenge.split("="), key = _a[0], value = _a[1];
            // Remove escaped quotation marks (', ") from challenge string to keep only the challenge value
            challengeMap[key] = unescape(value.replace(/['"]+/g, Constants.EMPTY_STRING));
        });
        return challengeMap;
    };
    return AuthenticationHeaderParser;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var ServerTelemetryManager = /** @class */ (function () {
    function ServerTelemetryManager(telemetryRequest, cacheManager) {
        this.cacheOutcome = CacheOutcome.NO_CACHE_HIT;
        this.cacheManager = cacheManager;
        this.apiId = telemetryRequest.apiId;
        this.correlationId = telemetryRequest.correlationId;
        this.wrapperSKU = telemetryRequest.wrapperSKU || Constants.EMPTY_STRING;
        this.wrapperVer = telemetryRequest.wrapperVer || Constants.EMPTY_STRING;
        this.telemetryCacheKey = SERVER_TELEM_CONSTANTS.CACHE_KEY + Separators.CACHE_KEY_SEPARATOR + telemetryRequest.clientId;
    }
    /**
     * API to add MSER Telemetry to request
     */
    ServerTelemetryManager.prototype.generateCurrentRequestHeaderValue = function () {
        var request = "" + this.apiId + SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR + this.cacheOutcome;
        var platformFields = [this.wrapperSKU, this.wrapperVer].join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);
        var regionDiscoveryFields = this.getRegionDiscoveryFields();
        var requestWithRegionDiscoveryFields = [request, regionDiscoveryFields].join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);
        return [SERVER_TELEM_CONSTANTS.SCHEMA_VERSION, requestWithRegionDiscoveryFields, platformFields].join(SERVER_TELEM_CONSTANTS.CATEGORY_SEPARATOR);
    };
    /**
     * API to add MSER Telemetry for the last failed request
     */
    ServerTelemetryManager.prototype.generateLastRequestHeaderValue = function () {
        var lastRequests = this.getLastRequests();
        var maxErrors = ServerTelemetryManager.maxErrorsToSend(lastRequests);
        var failedRequests = lastRequests.failedRequests.slice(0, 2 * maxErrors).join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);
        var errors = lastRequests.errors.slice(0, maxErrors).join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);
        var errorCount = lastRequests.errors.length;
        // Indicate whether this header contains all data or partial data
        var overflow = maxErrors < errorCount ? SERVER_TELEM_CONSTANTS.OVERFLOW_TRUE : SERVER_TELEM_CONSTANTS.OVERFLOW_FALSE;
        var platformFields = [errorCount, overflow].join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);
        return [SERVER_TELEM_CONSTANTS.SCHEMA_VERSION, lastRequests.cacheHits, failedRequests, errors, platformFields].join(SERVER_TELEM_CONSTANTS.CATEGORY_SEPARATOR);
    };
    /**
     * API to cache token failures for MSER data capture
     * @param error
     */
    ServerTelemetryManager.prototype.cacheFailedRequest = function (error) {
        var lastRequests = this.getLastRequests();
        if (lastRequests.errors.length >= SERVER_TELEM_CONSTANTS.MAX_CACHED_ERRORS) {
            // Remove a cached error to make room, first in first out
            lastRequests.failedRequests.shift(); // apiId
            lastRequests.failedRequests.shift(); // correlationId
            lastRequests.errors.shift();
        }
        lastRequests.failedRequests.push(this.apiId, this.correlationId);
        if (!StringUtils.isEmpty(error.subError)) {
            lastRequests.errors.push(error.subError);
        }
        else if (!StringUtils.isEmpty(error.errorCode)) {
            lastRequests.errors.push(error.errorCode);
        }
        else if (!!error && error.toString()) {
            lastRequests.errors.push(error.toString());
        }
        else {
            lastRequests.errors.push(SERVER_TELEM_CONSTANTS.UNKNOWN_ERROR);
        }
        this.cacheManager.setServerTelemetry(this.telemetryCacheKey, lastRequests);
        return;
    };
    /**
     * Update server telemetry cache entry by incrementing cache hit counter
     */
    ServerTelemetryManager.prototype.incrementCacheHits = function () {
        var lastRequests = this.getLastRequests();
        lastRequests.cacheHits += 1;
        this.cacheManager.setServerTelemetry(this.telemetryCacheKey, lastRequests);
        return lastRequests.cacheHits;
    };
    /**
     * Get the server telemetry entity from cache or initialize a new one
     */
    ServerTelemetryManager.prototype.getLastRequests = function () {
        var initialValue = new ServerTelemetryEntity();
        var lastRequests = this.cacheManager.getServerTelemetry(this.telemetryCacheKey);
        return lastRequests || initialValue;
    };
    /**
     * Remove server telemetry cache entry
     */
    ServerTelemetryManager.prototype.clearTelemetryCache = function () {
        var lastRequests = this.getLastRequests();
        var numErrorsFlushed = ServerTelemetryManager.maxErrorsToSend(lastRequests);
        var errorCount = lastRequests.errors.length;
        if (numErrorsFlushed === errorCount) {
            // All errors were sent on last request, clear Telemetry cache
            this.cacheManager.removeItem(this.telemetryCacheKey);
        }
        else {
            // Partial data was flushed to server, construct a new telemetry cache item with errors that were not flushed
            var serverTelemEntity = new ServerTelemetryEntity();
            serverTelemEntity.failedRequests = lastRequests.failedRequests.slice(numErrorsFlushed * 2); // failedRequests contains 2 items for each error
            serverTelemEntity.errors = lastRequests.errors.slice(numErrorsFlushed);
            this.cacheManager.setServerTelemetry(this.telemetryCacheKey, serverTelemEntity);
        }
    };
    /**
     * Returns the maximum number of errors that can be flushed to the server in the next network request
     * @param serverTelemetryEntity
     */
    ServerTelemetryManager.maxErrorsToSend = function (serverTelemetryEntity) {
        var i;
        var maxErrors = 0;
        var dataSize = 0;
        var errorCount = serverTelemetryEntity.errors.length;
        for (i = 0; i < errorCount; i++) {
            // failedRequests parameter contains pairs of apiId and correlationId, multiply index by 2 to preserve pairs
            var apiId = serverTelemetryEntity.failedRequests[2 * i] || Constants.EMPTY_STRING;
            var correlationId = serverTelemetryEntity.failedRequests[2 * i + 1] || Constants.EMPTY_STRING;
            var errorCode = serverTelemetryEntity.errors[i] || Constants.EMPTY_STRING;
            // Count number of characters that would be added to header, each character is 1 byte. Add 3 at the end to account for separators
            dataSize += apiId.toString().length + correlationId.toString().length + errorCode.length + 3;
            if (dataSize < SERVER_TELEM_CONSTANTS.MAX_LAST_HEADER_BYTES) {
                // Adding this entry to the header would still keep header size below the limit
                maxErrors += 1;
            }
            else {
                break;
            }
        }
        return maxErrors;
    };
    /**
     * Get the region discovery fields
     *
     * @returns string
     */
    ServerTelemetryManager.prototype.getRegionDiscoveryFields = function () {
        var regionDiscoveryFields = [];
        regionDiscoveryFields.push(this.regionUsed || Constants.EMPTY_STRING);
        regionDiscoveryFields.push(this.regionSource || Constants.EMPTY_STRING);
        regionDiscoveryFields.push(this.regionOutcome || Constants.EMPTY_STRING);
        return regionDiscoveryFields.join(",");
    };
    /**
     * Update the region discovery metadata
     *
     * @param regionDiscoveryMetadata
     * @returns void
     */
    ServerTelemetryManager.prototype.updateRegionDiscoveryMetadata = function (regionDiscoveryMetadata) {
        this.regionUsed = regionDiscoveryMetadata.region_used;
        this.regionSource = regionDiscoveryMetadata.region_source;
        this.regionOutcome = regionDiscoveryMetadata.region_outcome;
    };
    /**
     * Set cache outcome
     */
    ServerTelemetryManager.prototype.setCacheOutcome = function (cacheOutcome) {
        this.cacheOutcome = cacheOutcome;
    };
    return ServerTelemetryManager;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var PerformanceClient = /** @class */ (function () {
    /**
     * Creates an instance of PerformanceClient,
     * an abstract class containing core performance telemetry logic.
     *
     * @constructor
     * @param {string} clientId Client ID of the application
     * @param {string} authority Authority used by the application
     * @param {Logger} logger Logger used by the application
     * @param {string} libraryName Name of the library
     * @param {string} libraryVersion Version of the library
     */
    function PerformanceClient(clientId, authority, logger, libraryName, libraryVersion, applicationTelemetry) {
        this.authority = authority;
        this.libraryName = libraryName;
        this.libraryVersion = libraryVersion;
        this.applicationTelemetry = applicationTelemetry;
        this.clientId = clientId;
        this.logger = logger;
        this.callbacks = new Map();
        this.eventsByCorrelationId = new Map();
        this.measurementsById = new Map();
    }
    /**
     * Starts measuring performance for a given operation. Returns a function that should be used to end the measurement.
     *
     * @param {PerformanceEvents} measureName
     * @param {?string} [correlationId]
     * @returns {InProgressPerformanceEvent}
     */
    PerformanceClient.prototype.startMeasurement = function (measureName, correlationId) {
        var _this = this;
        var _a, _b;
        // Generate a placeholder correlation if the request does not provide one
        var eventCorrelationId = correlationId || this.generateId();
        if (!correlationId) {
            this.logger.info("PerformanceClient: No correlation id provided for " + measureName + ", generating", eventCorrelationId);
        }
        this.logger.trace("PerformanceClient: Performance measurement started for " + measureName, eventCorrelationId);
        var performanceMeasurement = this.startPerformanceMeasuremeant(measureName, eventCorrelationId);
        performanceMeasurement.startMeasurement();
        var inProgressEvent = {
            eventId: this.generateId(),
            status: exports.PerformanceEventStatus.InProgress,
            authority: this.authority,
            libraryName: this.libraryName,
            libraryVersion: this.libraryVersion,
            appName: (_a = this.applicationTelemetry) === null || _a === void 0 ? void 0 : _a.appName,
            appVersion: (_b = this.applicationTelemetry) === null || _b === void 0 ? void 0 : _b.appVersion,
            clientId: this.clientId,
            name: measureName,
            startTimeMs: Date.now(),
            correlationId: eventCorrelationId,
        };
        // Store in progress events so they can be discarded if not ended properly
        this.cacheEventByCorrelationId(inProgressEvent);
        this.cacheMeasurement(inProgressEvent, performanceMeasurement);
        // Return the event and functions the caller can use to properly end/flush the measurement
        return {
            endMeasurement: function (event) {
                var completedEvent = _this.endMeasurement(__assign(__assign({}, inProgressEvent), event));
                if (completedEvent) {
                    // Cache event so that submeasurements can be added downstream
                    _this.cacheEventByCorrelationId(completedEvent);
                }
                return completedEvent;
            },
            flushMeasurement: function () {
                return _this.flushMeasurements(inProgressEvent.name, inProgressEvent.correlationId);
            },
            discardMeasurement: function () {
                return _this.discardMeasurements(inProgressEvent.correlationId);
            },
            measurement: performanceMeasurement,
            event: inProgressEvent
        };
    };
    /**
     * Stops measuring the performance for an operation. Should only be called directly by PerformanceClient classes,
     * as consumers should instead use the function returned by startMeasurement.
     *
     * @param {PerformanceEvent} event
     * @returns {(PerformanceEvent | null)}
     */
    PerformanceClient.prototype.endMeasurement = function (event) {
        var performanceMeasurement = this.measurementsById.get(event.eventId);
        if (performanceMeasurement) {
            // Immediately delete so that the same event isnt ended twice
            this.measurementsById.delete(event.eventId);
            performanceMeasurement.endMeasurement();
            var durationMs = performanceMeasurement.flushMeasurement();
            // null indicates no measurement was taken (e.g. needed performance APIs not present)
            if (durationMs !== null) {
                this.logger.trace("PerformanceClient: Performance measurement ended for " + event.name + ": " + durationMs + " ms", event.correlationId);
                var completedEvent = __assign(__assign({ 
                    // Allow duration to be overwritten when event ends (e.g. testing), but not status
                    durationMs: Math.round(durationMs) }, event), { status: exports.PerformanceEventStatus.Completed });
                return completedEvent;
            }
            else {
                this.logger.trace("PerformanceClient: Performance measurement not taken", event.correlationId);
            }
        }
        else {
            this.logger.trace("PerformanceClient: Measurement not found for " + event.eventId, event.correlationId);
        }
        return null;
    };
    /**
     * Upserts event into event cache.
     * First key is the correlation id, second key is the event id.
     * Allows for events to be grouped by correlation id,
     * and to easily allow for properties on them to be updated.
     *
     * @private
     * @param {PerformanceEvent} event
     */
    PerformanceClient.prototype.cacheEventByCorrelationId = function (event) {
        var existingEvents = this.eventsByCorrelationId.get(event.correlationId);
        if (existingEvents) {
            this.logger.trace("PerformanceClient: Performance measurement for " + event.name + " added/updated", event.correlationId);
            existingEvents.set(event.eventId, event);
        }
        else {
            this.logger.trace("PerformanceClient: Performance measurement for " + event.name + " started", event.correlationId);
            this.eventsByCorrelationId.set(event.correlationId, new Map().set(event.eventId, event));
        }
    };
    /**
     * Cache measurements by their id.
     *
     * @private
     * @param {PerformanceEvent} event
     * @param {IPerformanceMeasurement} measurement
     */
    PerformanceClient.prototype.cacheMeasurement = function (event, measurement) {
        this.measurementsById.set(event.eventId, measurement);
    };
    /**
     * Gathers and emits performance events for measurements taked for the given top-level API and correlation ID.
     *
     * @param {PerformanceEvents} measureName
     * @param {string} correlationId
     */
    PerformanceClient.prototype.flushMeasurements = function (measureName, correlationId) {
        var _this = this;
        this.logger.trace("PerformanceClient: Performance measurements flushed for " + measureName, correlationId);
        var eventsForCorrelationId = this.eventsByCorrelationId.get(correlationId);
        if (eventsForCorrelationId) {
            this.discardMeasurements(correlationId);
            /*
             * Manually end incomplete submeasurements to ensure there arent orphaned/never ending events.
             * Incomplete submeasurements are likely an instrumentation bug that should be fixed.
             * IE only supports Map.forEach.
             */
            var completedEvents_1 = [];
            eventsForCorrelationId.forEach(function (event) {
                if (event.name !== measureName && event.status !== exports.PerformanceEventStatus.Completed) {
                    _this.logger.trace("PerformanceClient: Incomplete submeasurement " + event.name + " found for " + measureName, correlationId);
                    var completedEvent = _this.endMeasurement(event);
                    if (completedEvent) {
                        completedEvents_1.push(completedEvent);
                    }
                }
                completedEvents_1.push(event);
            });
            // Sort events by start time (earliest first)
            var sortedCompletedEvents = completedEvents_1.sort(function (eventA, eventB) { return eventA.startTimeMs - eventB.startTimeMs; });
            // Take completed top level event and add completed submeasurements durations as properties
            var topLevelEvents = sortedCompletedEvents.filter(function (event) { return event.name === measureName && event.status === exports.PerformanceEventStatus.Completed; });
            if (topLevelEvents.length > 0) {
                /*
                 * Only take the first top-level event if there are multiple events with the same correlation id.
                 * This greatly simplifies logic for submeasurements.
                 */
                if (topLevelEvents.length > 1) {
                    this.logger.verbose("PerformanceClient: Multiple distinct top-level performance events found, using the first", correlationId);
                }
                var topLevelEvent = topLevelEvents[0];
                this.logger.verbose("PerformanceClient: Measurement found for " + measureName, correlationId);
                // Build event object with top level and sub measurements
                var eventToEmit = sortedCompletedEvents.reduce(function (previous, current) {
                    if (current.name !== measureName) {
                        _this.logger.trace("PerformanceClient: Complete submeasurement found for " + current.name, correlationId);
                        // TODO: Emit additional properties for each subMeasurement
                        var subMeasurementName = current.name + "DurationMs";
                        /*
                         * Some code paths, such as resolving an authority, can occur multiple times.
                         * Only take the first measurement, since the second could be read from the cache,
                         * or due to the same correlation id being used for two distinct requests.
                         */
                        if (!previous[subMeasurementName]) {
                            previous[subMeasurementName] = current.durationMs;
                        }
                        else {
                            _this.logger.verbose("PerformanceClient: Submeasurement for " + measureName + " already exists for " + current.name + ", ignoring", correlationId);
                        }
                        if (current.accessTokenSize) {
                            previous.accessTokenSize = current.accessTokenSize;
                        }
                        if (current.idTokenSize) {
                            previous.idTokenSize = current.idTokenSize;
                        }
                    }
                    return previous;
                }, topLevelEvent);
                this.emitEvents([eventToEmit], eventToEmit.correlationId);
            }
            else {
                this.logger.verbose("PerformanceClient: No completed top-level measurements found for " + measureName, correlationId);
            }
        }
        else {
            this.logger.verbose("PerformanceClient: No measurements found", correlationId);
        }
    };
    /**
     * Removes measurements for a given correlation id.
     *
     * @param {string} correlationId
     */
    PerformanceClient.prototype.discardMeasurements = function (correlationId) {
        this.logger.trace("PerformanceClient: Performance measurements discarded", correlationId);
        this.eventsByCorrelationId.delete(correlationId);
    };
    /**
     * Registers a callback function to receive performance events.
     *
     * @param {PerformanceCallbackFunction} callback
     * @returns {string}
     */
    PerformanceClient.prototype.addPerformanceCallback = function (callback) {
        var callbackId = this.generateId();
        this.callbacks.set(callbackId, callback);
        this.logger.verbose("PerformanceClient: Performance callback registered with id: " + callbackId);
        return callbackId;
    };
    /**
     * Removes a callback registered with addPerformanceCallback.
     *
     * @param {string} callbackId
     * @returns {boolean}
     */
    PerformanceClient.prototype.removePerformanceCallback = function (callbackId) {
        var result = this.callbacks.delete(callbackId);
        if (result) {
            this.logger.verbose("PerformanceClient: Performance callback " + callbackId + " removed.");
        }
        else {
            this.logger.verbose("PerformanceClient: Performance callback " + callbackId + " not removed.");
        }
        return result;
    };
    /**
     * Emits events to all registered callbacks.
     *
     * @param {PerformanceEvent[]} events
     * @param {?string} [correlationId]
     */
    PerformanceClient.prototype.emitEvents = function (events, correlationId) {
        var _this = this;
        this.logger.verbose("PerformanceClient: Emitting performance events", correlationId);
        this.callbacks.forEach(function (callback, callbackId) {
            _this.logger.trace("PerformanceClient: Emitting event to callback " + callbackId, correlationId);
            callback.apply(null, [events]);
        });
    };
    return PerformanceClient;
}());

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var StubPerformanceMeasurement = /** @class */ (function () {
    function StubPerformanceMeasurement() {
    }
    /* eslint-disable-next-line @typescript-eslint/no-empty-function */
    StubPerformanceMeasurement.prototype.startMeasurement = function () { };
    /* eslint-disable-next-line @typescript-eslint/no-empty-function */
    StubPerformanceMeasurement.prototype.endMeasurement = function () { };
    StubPerformanceMeasurement.prototype.flushMeasurement = function () {
        return null;
    };
    return StubPerformanceMeasurement;
}());
var StubPerformanceClient = /** @class */ (function (_super) {
    __extends(StubPerformanceClient, _super);
    function StubPerformanceClient() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    StubPerformanceClient.prototype.generateId = function () {
        return "callback-id";
    };
    StubPerformanceClient.prototype.startPerformanceMeasuremeant = function () {
        return new StubPerformanceMeasurement();
    };
    return StubPerformanceClient;
}(PerformanceClient));

exports.AccessTokenEntity = AccessTokenEntity;
exports.AccountEntity = AccountEntity;
exports.AppMetadataEntity = AppMetadataEntity;
exports.AuthError = AuthError;
exports.AuthErrorMessage = AuthErrorMessage;
exports.AuthToken = AuthToken;
exports.AuthenticationHeaderParser = AuthenticationHeaderParser;
exports.Authority = Authority;
exports.AuthorityFactory = AuthorityFactory;
exports.AuthorityMetadataEntity = AuthorityMetadataEntity;
exports.AuthorizationCodeClient = AuthorizationCodeClient;
exports.CacheManager = CacheManager;
exports.ClientAuthError = ClientAuthError;
exports.ClientAuthErrorMessage = ClientAuthErrorMessage;
exports.ClientConfigurationError = ClientConfigurationError;
exports.ClientConfigurationErrorMessage = ClientConfigurationErrorMessage;
exports.ClientCredentialClient = ClientCredentialClient;
exports.Constants = Constants;
exports.CredentialEntity = CredentialEntity;
exports.DEFAULT_CRYPTO_IMPLEMENTATION = DEFAULT_CRYPTO_IMPLEMENTATION;
exports.DEFAULT_SYSTEM_OPTIONS = DEFAULT_SYSTEM_OPTIONS;
exports.DefaultStorageClass = DefaultStorageClass;
exports.DeviceCodeClient = DeviceCodeClient;
exports.IdToken = AuthToken;
exports.IdTokenEntity = IdTokenEntity;
exports.InteractionRequiredAuthError = InteractionRequiredAuthError;
exports.InteractionRequiredAuthErrorMessage = InteractionRequiredAuthErrorMessage;
exports.JoseHeader = JoseHeader;
exports.Logger = Logger;
exports.NetworkManager = NetworkManager;
exports.OIDC_DEFAULT_SCOPES = OIDC_DEFAULT_SCOPES;
exports.OnBehalfOfClient = OnBehalfOfClient;
exports.PerformanceClient = PerformanceClient;
exports.PopTokenGenerator = PopTokenGenerator;
exports.PromptValue = PromptValue;
exports.ProtocolUtils = ProtocolUtils;
exports.RefreshTokenClient = RefreshTokenClient;
exports.RefreshTokenEntity = RefreshTokenEntity;
exports.ScopeSet = ScopeSet;
exports.ServerError = ServerError;
exports.ServerTelemetryEntity = ServerTelemetryEntity;
exports.ServerTelemetryManager = ServerTelemetryManager;
exports.SilentFlowClient = SilentFlowClient;
exports.StringUtils = StringUtils;
exports.StubPerformanceClient = StubPerformanceClient;
exports.StubbedNetworkModule = StubbedNetworkModule;
exports.ThrottlingEntity = ThrottlingEntity;
exports.ThrottlingUtils = ThrottlingUtils;
exports.TimeUtils = TimeUtils;
exports.TokenCacheContext = TokenCacheContext;
exports.UrlString = UrlString;
exports.UsernamePasswordClient = UsernamePasswordClient;
exports.version = version;
//# sourceMappingURL=index.cjs.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
export { AuthorizationCodeClient } from './client/AuthorizationCodeClient.js';
export { DeviceCodeClient } from './client/DeviceCodeClient.js';
export { RefreshTokenClient } from './client/RefreshTokenClient.js';
export { ClientCredentialClient } from './client/ClientCredentialClient.js';
export { OnBehalfOfClient } from './client/OnBehalfOfClient.js';
export { SilentFlowClient } from './client/SilentFlowClient.js';
export { UsernamePasswordClient } from './client/UsernamePasswordClient.js';
export { DEFAULT_SYSTEM_OPTIONS } from './config/ClientConfiguration.js';
export { AuthToken, AuthToken as IdToken } from './account/AuthToken.js';
export { CcsCredentialType } from './account/CcsCredential.js';
export { Authority } from './authority/Authority.js';
export { AzureCloudInstance } from './authority/AuthorityOptions.js';
export { AuthorityFactory } from './authority/AuthorityFactory.js';
export { AuthorityType } from './authority/AuthorityType.js';
export { ProtocolMode } from './authority/ProtocolMode.js';
export { CacheManager, DefaultStorageClass } from './cache/CacheManager.js';
export { CredentialEntity } from './cache/entities/CredentialEntity.js';
export { AppMetadataEntity } from './cache/entities/AppMetadataEntity.js';
export { AccountEntity } from './cache/entities/AccountEntity.js';
export { IdTokenEntity } from './cache/entities/IdTokenEntity.js';
export { AccessTokenEntity } from './cache/entities/AccessTokenEntity.js';
export { RefreshTokenEntity } from './cache/entities/RefreshTokenEntity.js';
export { ServerTelemetryEntity } from './cache/entities/ServerTelemetryEntity.js';
export { AuthorityMetadataEntity } from './cache/entities/AuthorityMetadataEntity.js';
export { ThrottlingEntity } from './cache/entities/ThrottlingEntity.js';
export { TokenCacheContext } from './cache/persistence/TokenCacheContext.js';
export { StubbedNetworkModule } from './network/INetworkModule.js';
export { NetworkManager } from './network/NetworkManager.js';
export { ThrottlingUtils } from './network/ThrottlingUtils.js';
export { UrlString } from './url/UrlString.js';
export { DEFAULT_CRYPTO_IMPLEMENTATION } from './crypto/ICrypto.js';
export { JoseHeader } from './crypto/JoseHeader.js';
export { ScopeSet } from './request/ScopeSet.js';
export { AuthenticationHeaderParser } from './request/AuthenticationHeaderParser.js';
export { LogLevel, Logger } from './logger/Logger.js';
export { InteractionRequiredAuthError, InteractionRequiredAuthErrorMessage } from './error/InteractionRequiredAuthError.js';
export { AuthError, AuthErrorMessage } from './error/AuthError.js';
export { ServerError } from './error/ServerError.js';
export { ClientAuthError, ClientAuthErrorMessage } from './error/ClientAuthError.js';
export { ClientConfigurationError, ClientConfigurationErrorMessage } from './error/ClientConfigurationError.js';
export { AuthenticationScheme, CacheAccountType, CacheSchemaType, CacheType, Constants, CredentialType, OIDC_DEFAULT_SCOPES, PersistentCacheKeys, PromptValue, ResponseMode } from './utils/Constants.js';
export { StringUtils } from './utils/StringUtils.js';
export { ProtocolUtils } from './utils/ProtocolUtils.js';
export { TimeUtils } from './utils/TimeUtils.js';
export { ServerTelemetryManager } from './telemetry/server/ServerTelemetryManager.js';
export { PerformanceEventStatus, PerformanceEvents } from './telemetry/performance/PerformanceEvent.js';
export { PerformanceClient } from './telemetry/performance/PerformanceClient.js';
export { StubPerformanceClient } from './telemetry/performance/StubPerformanceClient.js';
export { PopTokenGenerator } from './crypto/PopTokenGenerator.js';
export { version } from './packageMetadata.js';
//# sourceMappingURL=index.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
/* eslint-disable header/header */
var name = "@azure/msal-common";
var version = "7.3.0";

export { name, version };
//# sourceMappingURL=packageMetadata.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __spreadArrays } from '../_virtual/_tslib.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var Constants = {
    LIBRARY_NAME: "MSAL.JS",
    SKU: "msal.js.common",
    // Prefix for all library cache entries
    CACHE_PREFIX: "msal",
    // default authority
    DEFAULT_AUTHORITY: "https://login.microsoftonline.com/common/",
    DEFAULT_AUTHORITY_HOST: "login.microsoftonline.com",
    DEFAULT_COMMON_TENANT: "common",
    // ADFS String
    ADFS: "adfs",
    // Default AAD Instance Discovery Endpoint
    AAD_INSTANCE_DISCOVERY_ENDPT: "https://login.microsoftonline.com/common/discovery/instance?api-version=1.1&authorization_endpoint=",
    // Resource delimiter - used for certain cache entries
    RESOURCE_DELIM: "|",
    // Placeholder for non-existent account ids/objects
    NO_ACCOUNT: "NO_ACCOUNT",
    // Claims
    CLAIMS: "claims",
    // Consumer UTID
    CONSUMER_UTID: "9188040d-6c67-4c5b-b112-36a304b66dad",
    // Default scopes
    OPENID_SCOPE: "openid",
    PROFILE_SCOPE: "profile",
    OFFLINE_ACCESS_SCOPE: "offline_access",
    EMAIL_SCOPE: "email",
    // Default response type for authorization code flow
    CODE_RESPONSE_TYPE: "code",
    CODE_GRANT_TYPE: "authorization_code",
    RT_GRANT_TYPE: "refresh_token",
    FRAGMENT_RESPONSE_MODE: "fragment",
    S256_CODE_CHALLENGE_METHOD: "S256",
    URL_FORM_CONTENT_TYPE: "application/x-www-form-urlencoded;charset=utf-8",
    AUTHORIZATION_PENDING: "authorization_pending",
    NOT_DEFINED: "not_defined",
    EMPTY_STRING: "",
    FORWARD_SLASH: "/",
    IMDS_ENDPOINT: "http://169.254.169.254/metadata/instance/compute/location",
    IMDS_VERSION: "2020-06-01",
    IMDS_TIMEOUT: 2000,
    AZURE_REGION_AUTO_DISCOVER_FLAG: "TryAutoDetect",
    REGIONAL_AUTH_PUBLIC_CLOUD_SUFFIX: "login.microsoft.com",
    KNOWN_PUBLIC_CLOUDS: ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"],
    TOKEN_RESPONSE_TYPE: "token",
    ID_TOKEN_RESPONSE_TYPE: "id_token",
    SHR_NONCE_VALIDITY: 240,
};
var OIDC_DEFAULT_SCOPES = [
    Constants.OPENID_SCOPE,
    Constants.PROFILE_SCOPE,
    Constants.OFFLINE_ACCESS_SCOPE
];
var OIDC_SCOPES = __spreadArrays(OIDC_DEFAULT_SCOPES, [
    Constants.EMAIL_SCOPE
]);
/**
 * Request header names
 */
var HeaderNames;
(function (HeaderNames) {
    HeaderNames["CONTENT_TYPE"] = "Content-Type";
    HeaderNames["RETRY_AFTER"] = "Retry-After";
    HeaderNames["CCS_HEADER"] = "X-AnchorMailbox";
    HeaderNames["WWWAuthenticate"] = "WWW-Authenticate";
    HeaderNames["AuthenticationInfo"] = "Authentication-Info";
})(HeaderNames || (HeaderNames = {}));
/**
 * Persistent cache keys MSAL which stay while user is logged in.
 */
var PersistentCacheKeys;
(function (PersistentCacheKeys) {
    PersistentCacheKeys["ID_TOKEN"] = "idtoken";
    PersistentCacheKeys["CLIENT_INFO"] = "client.info";
    PersistentCacheKeys["ADAL_ID_TOKEN"] = "adal.idtoken";
    PersistentCacheKeys["ERROR"] = "error";
    PersistentCacheKeys["ERROR_DESC"] = "error.description";
    PersistentCacheKeys["ACTIVE_ACCOUNT"] = "active-account";
    PersistentCacheKeys["ACTIVE_ACCOUNT_FILTERS"] = "active-account-filters"; // new cache entry for active_account for a more robust version for browser
})(PersistentCacheKeys || (PersistentCacheKeys = {}));
/**
 * String constants related to AAD Authority
 */
var AADAuthorityConstants;
(function (AADAuthorityConstants) {
    AADAuthorityConstants["COMMON"] = "common";
    AADAuthorityConstants["ORGANIZATIONS"] = "organizations";
    AADAuthorityConstants["CONSUMERS"] = "consumers";
})(AADAuthorityConstants || (AADAuthorityConstants = {}));
/**
 * Keys in the hashParams sent by AAD Server
 */
var AADServerParamKeys;
(function (AADServerParamKeys) {
    AADServerParamKeys["CLIENT_ID"] = "client_id";
    AADServerParamKeys["REDIRECT_URI"] = "redirect_uri";
    AADServerParamKeys["RESPONSE_TYPE"] = "response_type";
    AADServerParamKeys["RESPONSE_MODE"] = "response_mode";
    AADServerParamKeys["GRANT_TYPE"] = "grant_type";
    AADServerParamKeys["CLAIMS"] = "claims";
    AADServerParamKeys["SCOPE"] = "scope";
    AADServerParamKeys["ERROR"] = "error";
    AADServerParamKeys["ERROR_DESCRIPTION"] = "error_description";
    AADServerParamKeys["ACCESS_TOKEN"] = "access_token";
    AADServerParamKeys["ID_TOKEN"] = "id_token";
    AADServerParamKeys["REFRESH_TOKEN"] = "refresh_token";
    AADServerParamKeys["EXPIRES_IN"] = "expires_in";
    AADServerParamKeys["STATE"] = "state";
    AADServerParamKeys["NONCE"] = "nonce";
    AADServerParamKeys["PROMPT"] = "prompt";
    AADServerParamKeys["SESSION_STATE"] = "session_state";
    AADServerParamKeys["CLIENT_INFO"] = "client_info";
    AADServerParamKeys["CODE"] = "code";
    AADServerParamKeys["CODE_CHALLENGE"] = "code_challenge";
    AADServerParamKeys["CODE_CHALLENGE_METHOD"] = "code_challenge_method";
    AADServerParamKeys["CODE_VERIFIER"] = "code_verifier";
    AADServerParamKeys["CLIENT_REQUEST_ID"] = "client-request-id";
    AADServerParamKeys["X_CLIENT_SKU"] = "x-client-SKU";
    AADServerParamKeys["X_CLIENT_VER"] = "x-client-VER";
    AADServerParamKeys["X_CLIENT_OS"] = "x-client-OS";
    AADServerParamKeys["X_CLIENT_CPU"] = "x-client-CPU";
    AADServerParamKeys["X_CLIENT_CURR_TELEM"] = "x-client-current-telemetry";
    AADServerParamKeys["X_CLIENT_LAST_TELEM"] = "x-client-last-telemetry";
    AADServerParamKeys["X_MS_LIB_CAPABILITY"] = "x-ms-lib-capability";
    AADServerParamKeys["X_APP_NAME"] = "x-app-name";
    AADServerParamKeys["X_APP_VER"] = "x-app-ver";
    AADServerParamKeys["POST_LOGOUT_URI"] = "post_logout_redirect_uri";
    AADServerParamKeys["ID_TOKEN_HINT"] = "id_token_hint";
    AADServerParamKeys["DEVICE_CODE"] = "device_code";
    AADServerParamKeys["CLIENT_SECRET"] = "client_secret";
    AADServerParamKeys["CLIENT_ASSERTION"] = "client_assertion";
    AADServerParamKeys["CLIENT_ASSERTION_TYPE"] = "client_assertion_type";
    AADServerParamKeys["TOKEN_TYPE"] = "token_type";
    AADServerParamKeys["REQ_CNF"] = "req_cnf";
    AADServerParamKeys["OBO_ASSERTION"] = "assertion";
    AADServerParamKeys["REQUESTED_TOKEN_USE"] = "requested_token_use";
    AADServerParamKeys["ON_BEHALF_OF"] = "on_behalf_of";
    AADServerParamKeys["FOCI"] = "foci";
    AADServerParamKeys["CCS_HEADER"] = "X-AnchorMailbox";
    AADServerParamKeys["RETURN_SPA_CODE"] = "return_spa_code";
    AADServerParamKeys["NATIVE_BROKER"] = "nativebroker";
    AADServerParamKeys["LOGOUT_HINT"] = "logout_hint";
})(AADServerParamKeys || (AADServerParamKeys = {}));
/**
 * Claims request keys
 */
var ClaimsRequestKeys;
(function (ClaimsRequestKeys) {
    ClaimsRequestKeys["ACCESS_TOKEN"] = "access_token";
    ClaimsRequestKeys["XMS_CC"] = "xms_cc";
})(ClaimsRequestKeys || (ClaimsRequestKeys = {}));
/**
 * we considered making this "enum" in the request instead of string, however it looks like the allowed list of
 * prompt values kept changing over past couple of years. There are some undocumented prompt values for some
 * internal partners too, hence the choice of generic "string" type instead of the "enum"
 */
var PromptValue = {
    LOGIN: "login",
    SELECT_ACCOUNT: "select_account",
    CONSENT: "consent",
    NONE: "none",
    CREATE: "create"
};
/**
 * SSO Types - generated to populate hints
 */
var SSOTypes;
(function (SSOTypes) {
    SSOTypes["ACCOUNT"] = "account";
    SSOTypes["SID"] = "sid";
    SSOTypes["LOGIN_HINT"] = "login_hint";
    SSOTypes["ID_TOKEN"] = "id_token";
    SSOTypes["DOMAIN_HINT"] = "domain_hint";
    SSOTypes["ORGANIZATIONS"] = "organizations";
    SSOTypes["CONSUMERS"] = "consumers";
    SSOTypes["ACCOUNT_ID"] = "accountIdentifier";
    SSOTypes["HOMEACCOUNT_ID"] = "homeAccountIdentifier";
})(SSOTypes || (SSOTypes = {}));
/**
 * allowed values for codeVerifier
 */
var CodeChallengeMethodValues = {
    PLAIN: "plain",
    S256: "S256"
};
/**
 * allowed values for response_mode
 */
var ResponseMode;
(function (ResponseMode) {
    ResponseMode["QUERY"] = "query";
    ResponseMode["FRAGMENT"] = "fragment";
    ResponseMode["FORM_POST"] = "form_post";
})(ResponseMode || (ResponseMode = {}));
/**
 * allowed grant_type
 */
var GrantType;
(function (GrantType) {
    GrantType["IMPLICIT_GRANT"] = "implicit";
    GrantType["AUTHORIZATION_CODE_GRANT"] = "authorization_code";
    GrantType["CLIENT_CREDENTIALS_GRANT"] = "client_credentials";
    GrantType["RESOURCE_OWNER_PASSWORD_GRANT"] = "password";
    GrantType["REFRESH_TOKEN_GRANT"] = "refresh_token";
    GrantType["DEVICE_CODE_GRANT"] = "device_code";
    GrantType["JWT_BEARER"] = "urn:ietf:params:oauth:grant-type:jwt-bearer";
})(GrantType || (GrantType = {}));
/**
 * Account types in Cache
 */
var CacheAccountType;
(function (CacheAccountType) {
    CacheAccountType["MSSTS_ACCOUNT_TYPE"] = "MSSTS";
    CacheAccountType["ADFS_ACCOUNT_TYPE"] = "ADFS";
    CacheAccountType["MSAV1_ACCOUNT_TYPE"] = "MSA";
    CacheAccountType["GENERIC_ACCOUNT_TYPE"] = "Generic"; // NTLM, Kerberos, FBA, Basic etc
})(CacheAccountType || (CacheAccountType = {}));
/**
 * Separators used in cache
 */
var Separators;
(function (Separators) {
    Separators["CACHE_KEY_SEPARATOR"] = "-";
    Separators["CLIENT_INFO_SEPARATOR"] = ".";
})(Separators || (Separators = {}));
/**
 * Credential Type stored in the cache
 */
var CredentialType;
(function (CredentialType) {
    CredentialType["ID_TOKEN"] = "IdToken";
    CredentialType["ACCESS_TOKEN"] = "AccessToken";
    CredentialType["ACCESS_TOKEN_WITH_AUTH_SCHEME"] = "AccessToken_With_AuthScheme";
    CredentialType["REFRESH_TOKEN"] = "RefreshToken";
})(CredentialType || (CredentialType = {}));
/**
 * Credential Type stored in the cache
 */
var CacheSchemaType;
(function (CacheSchemaType) {
    CacheSchemaType["ACCOUNT"] = "Account";
    CacheSchemaType["CREDENTIAL"] = "Credential";
    CacheSchemaType["ID_TOKEN"] = "IdToken";
    CacheSchemaType["ACCESS_TOKEN"] = "AccessToken";
    CacheSchemaType["REFRESH_TOKEN"] = "RefreshToken";
    CacheSchemaType["APP_METADATA"] = "AppMetadata";
    CacheSchemaType["TEMPORARY"] = "TempCache";
    CacheSchemaType["TELEMETRY"] = "Telemetry";
    CacheSchemaType["UNDEFINED"] = "Undefined";
    CacheSchemaType["THROTTLING"] = "Throttling";
})(CacheSchemaType || (CacheSchemaType = {}));
/**
 * Combine all cache types
 */
var CacheType;
(function (CacheType) {
    CacheType[CacheType["ADFS"] = 1001] = "ADFS";
    CacheType[CacheType["MSA"] = 1002] = "MSA";
    CacheType[CacheType["MSSTS"] = 1003] = "MSSTS";
    CacheType[CacheType["GENERIC"] = 1004] = "GENERIC";
    CacheType[CacheType["ACCESS_TOKEN"] = 2001] = "ACCESS_TOKEN";
    CacheType[CacheType["REFRESH_TOKEN"] = 2002] = "REFRESH_TOKEN";
    CacheType[CacheType["ID_TOKEN"] = 2003] = "ID_TOKEN";
    CacheType[CacheType["APP_METADATA"] = 3001] = "APP_METADATA";
    CacheType[CacheType["UNDEFINED"] = 9999] = "UNDEFINED";
})(CacheType || (CacheType = {}));
/**
 * More Cache related constants
 */
var APP_METADATA = "appmetadata";
var CLIENT_INFO = "client_info";
var THE_FAMILY_ID = "1";
var AUTHORITY_METADATA_CONSTANTS = {
    CACHE_KEY: "authority-metadata",
    REFRESH_TIME_SECONDS: 3600 * 24 // 24 Hours
};
var AuthorityMetadataSource;
(function (AuthorityMetadataSource) {
    AuthorityMetadataSource["CONFIG"] = "config";
    AuthorityMetadataSource["CACHE"] = "cache";
    AuthorityMetadataSource["NETWORK"] = "network";
    AuthorityMetadataSource["HARDCODED_VALUES"] = "hardcoded_values";
})(AuthorityMetadataSource || (AuthorityMetadataSource = {}));
var SERVER_TELEM_CONSTANTS = {
    SCHEMA_VERSION: 5,
    MAX_CUR_HEADER_BYTES: 80,
    MAX_LAST_HEADER_BYTES: 330,
    MAX_CACHED_ERRORS: 50,
    CACHE_KEY: "server-telemetry",
    CATEGORY_SEPARATOR: "|",
    VALUE_SEPARATOR: ",",
    OVERFLOW_TRUE: "1",
    OVERFLOW_FALSE: "0",
    UNKNOWN_ERROR: "unknown_error"
};
/**
 * Type of the authentication request
 */
var AuthenticationScheme;
(function (AuthenticationScheme) {
    AuthenticationScheme["BEARER"] = "Bearer";
    AuthenticationScheme["POP"] = "pop";
    AuthenticationScheme["SSH"] = "ssh-cert";
})(AuthenticationScheme || (AuthenticationScheme = {}));
/**
 * Constants related to throttling
 */
var ThrottlingConstants = {
    // Default time to throttle RequestThumbprint in seconds
    DEFAULT_THROTTLE_TIME_SECONDS: 60,
    // Default maximum time to throttle in seconds, overrides what the server sends back
    DEFAULT_MAX_THROTTLE_TIME_SECONDS: 3600,
    // Prefix for storing throttling entries
    THROTTLING_PREFIX: "throttling",
    // Value assigned to the x-ms-lib-capability header to indicate to the server the library supports throttling
    X_MS_LIB_CAPABILITY_VALUE: "retry-after, h429"
};
var Errors = {
    INVALID_GRANT_ERROR: "invalid_grant",
    CLIENT_MISMATCH_ERROR: "client_mismatch",
};
/**
 * Password grant parameters
 */
var PasswordGrantConstants;
(function (PasswordGrantConstants) {
    PasswordGrantConstants["username"] = "username";
    PasswordGrantConstants["password"] = "password";
})(PasswordGrantConstants || (PasswordGrantConstants = {}));
/**
 * Response codes
 */
var ResponseCodes;
(function (ResponseCodes) {
    ResponseCodes[ResponseCodes["httpSuccess"] = 200] = "httpSuccess";
    ResponseCodes[ResponseCodes["httpBadRequest"] = 400] = "httpBadRequest";
})(ResponseCodes || (ResponseCodes = {}));
/**
 * Region Discovery Sources
 */
var RegionDiscoverySources;
(function (RegionDiscoverySources) {
    RegionDiscoverySources["FAILED_AUTO_DETECTION"] = "1";
    RegionDiscoverySources["INTERNAL_CACHE"] = "2";
    RegionDiscoverySources["ENVIRONMENT_VARIABLE"] = "3";
    RegionDiscoverySources["IMDS"] = "4";
})(RegionDiscoverySources || (RegionDiscoverySources = {}));
/**
 * Region Discovery Outcomes
 */
var RegionDiscoveryOutcomes;
(function (RegionDiscoveryOutcomes) {
    RegionDiscoveryOutcomes["CONFIGURED_MATCHES_DETECTED"] = "1";
    RegionDiscoveryOutcomes["CONFIGURED_NO_AUTO_DETECTION"] = "2";
    RegionDiscoveryOutcomes["CONFIGURED_NOT_DETECTED"] = "3";
    RegionDiscoveryOutcomes["AUTO_DETECTION_REQUESTED_SUCCESSFUL"] = "4";
    RegionDiscoveryOutcomes["AUTO_DETECTION_REQUESTED_FAILED"] = "5";
})(RegionDiscoveryOutcomes || (RegionDiscoveryOutcomes = {}));
var CacheOutcome;
(function (CacheOutcome) {
    CacheOutcome["NO_CACHE_HIT"] = "0";
    CacheOutcome["FORCE_REFRESH"] = "1";
    CacheOutcome["NO_CACHED_ACCESS_TOKEN"] = "2";
    CacheOutcome["CACHED_ACCESS_TOKEN_EXPIRED"] = "3";
    CacheOutcome["REFRESH_CACHED_ACCESS_TOKEN"] = "4";
})(CacheOutcome || (CacheOutcome = {}));
var JsonTypes;
(function (JsonTypes) {
    JsonTypes["Jwt"] = "JWT";
    JsonTypes["Jwk"] = "JWK";
})(JsonTypes || (JsonTypes = {}));

export { AADAuthorityConstants, AADServerParamKeys, APP_METADATA, AUTHORITY_METADATA_CONSTANTS, AuthenticationScheme, AuthorityMetadataSource, CLIENT_INFO, CacheAccountType, CacheOutcome, CacheSchemaType, CacheType, ClaimsRequestKeys, CodeChallengeMethodValues, Constants, CredentialType, Errors, GrantType, HeaderNames, JsonTypes, OIDC_DEFAULT_SCOPES, OIDC_SCOPES, PasswordGrantConstants, PersistentCacheKeys, PromptValue, RegionDiscoveryOutcomes, RegionDiscoverySources, ResponseCodes, ResponseMode, SERVER_TELEM_CONSTANTS, SSOTypes, Separators, THE_FAMILY_ID, ThrottlingConstants };
//# sourceMappingURL=Constants.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { StringUtils } from './StringUtils.js';
import { Constants } from './Constants.js';
import { ClientAuthError } from '../error/ClientAuthError.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Class which provides helpers for OAuth 2.0 protocol specific values
 */
var ProtocolUtils = /** @class */ (function () {
    function ProtocolUtils() {
    }
    /**
     * Appends user state with random guid, or returns random guid.
     * @param userState
     * @param randomGuid
     */
    ProtocolUtils.setRequestState = function (cryptoObj, userState, meta) {
        var libraryState = ProtocolUtils.generateLibraryState(cryptoObj, meta);
        return !StringUtils.isEmpty(userState) ? "" + libraryState + Constants.RESOURCE_DELIM + userState : libraryState;
    };
    /**
     * Generates the state value used by the common library.
     * @param randomGuid
     * @param cryptoObj
     */
    ProtocolUtils.generateLibraryState = function (cryptoObj, meta) {
        if (!cryptoObj) {
            throw ClientAuthError.createNoCryptoObjectError("generateLibraryState");
        }
        // Create a state object containing a unique id and the timestamp of the request creation
        var stateObj = {
            id: cryptoObj.createNewGuid()
        };
        if (meta) {
            stateObj.meta = meta;
        }
        var stateString = JSON.stringify(stateObj);
        return cryptoObj.base64Encode(stateString);
    };
    /**
     * Parses the state into the RequestStateObject, which contains the LibraryState info and the state passed by the user.
     * @param state
     * @param cryptoObj
     */
    ProtocolUtils.parseRequestState = function (cryptoObj, state) {
        if (!cryptoObj) {
            throw ClientAuthError.createNoCryptoObjectError("parseRequestState");
        }
        if (StringUtils.isEmpty(state)) {
            throw ClientAuthError.createInvalidStateError(state, "Null, undefined or empty state");
        }
        try {
            // Split the state between library state and user passed state and decode them separately
            var splitState = state.split(Constants.RESOURCE_DELIM);
            var libraryState = splitState[0];
            var userState = splitState.length > 1 ? splitState.slice(1).join(Constants.RESOURCE_DELIM) : Constants.EMPTY_STRING;
            var libraryStateString = cryptoObj.base64Decode(libraryState);
            var libraryStateObj = JSON.parse(libraryStateString);
            return {
                userRequestState: !StringUtils.isEmpty(userState) ? userState : Constants.EMPTY_STRING,
                libraryState: libraryStateObj
            };
        }
        catch (e) {
            throw ClientAuthError.createInvalidStateError(state, e);
        }
    };
    return ProtocolUtils;
}());

export { ProtocolUtils };
//# sourceMappingURL=ProtocolUtils.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { ClientAuthError } from '../error/ClientAuthError.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * @hidden
 */
var StringUtils = /** @class */ (function () {
    function StringUtils() {
    }
    /**
     * decode a JWT
     *
     * @param authToken
     */
    StringUtils.decodeAuthToken = function (authToken) {
        if (StringUtils.isEmpty(authToken)) {
            throw ClientAuthError.createTokenNullOrEmptyError(authToken);
        }
        var tokenPartsRegex = /^([^\.\s]*)\.([^\.\s]+)\.([^\.\s]*)$/;
        var matches = tokenPartsRegex.exec(authToken);
        if (!matches || matches.length < 4) {
            throw ClientAuthError.createTokenParsingError("Given token is malformed: " + JSON.stringify(authToken));
        }
        var crackedToken = {
            header: matches[1],
            JWSPayload: matches[2],
            JWSSig: matches[3]
        };
        return crackedToken;
    };
    /**
     * Check if a string is empty.
     *
     * @param str
     */
    StringUtils.isEmpty = function (str) {
        return (typeof str === "undefined" || !str || 0 === str.length);
    };
    /**
     * Check if stringified object is empty
     * @param strObj
     */
    StringUtils.isEmptyObj = function (strObj) {
        if (strObj && !StringUtils.isEmpty(strObj)) {
            try {
                var obj = JSON.parse(strObj);
                return Object.keys(obj).length === 0;
            }
            catch (e) { }
        }
        return true;
    };
    StringUtils.startsWith = function (str, search) {
        return str.indexOf(search) === 0;
    };
    StringUtils.endsWith = function (str, search) {
        return (str.length >= search.length) && (str.lastIndexOf(search) === (str.length - search.length));
    };
    /**
     * Parses string into an object.
     *
     * @param query
     */
    StringUtils.queryStringToObject = function (query) {
        var obj = {};
        var params = query.split("&");
        var decode = function (s) { return decodeURIComponent(s.replace(/\+/g, " ")); };
        params.forEach(function (pair) {
            if (pair.trim()) {
                var _a = pair.split(/=(.+)/g, 2), key = _a[0], value = _a[1]; // Split on the first occurence of the '=' character
                if (key && value) {
                    obj[decode(key)] = decode(value);
                }
            }
        });
        return obj;
    };
    /**
     * Trims entries in an array.
     *
     * @param arr
     */
    StringUtils.trimArrayEntries = function (arr) {
        return arr.map(function (entry) { return entry.trim(); });
    };
    /**
     * Removes empty strings from array
     * @param arr
     */
    StringUtils.removeEmptyStringsFromArray = function (arr) {
        return arr.filter(function (entry) {
            return !StringUtils.isEmpty(entry);
        });
    };
    /**
     * Attempts to parse a string into JSON
     * @param str
     */
    StringUtils.jsonParseHelper = function (str) {
        try {
            return JSON.parse(str);
        }
        catch (e) {
            return null;
        }
    };
    /**
     * Tests if a given string matches a given pattern, with support for wildcards and queries.
     * @param pattern Wildcard pattern to string match. Supports "*" for wildcards and "?" for queries
     * @param input String to match against
     */
    StringUtils.matchPattern = function (pattern, input) {
        /**
         * Wildcard support: https://stackoverflow.com/a/3117248/4888559
         * Queries: replaces "?" in string with escaped "\?" for regex test
         */
        var regex = new RegExp(pattern.replace(/\\/g, "\\\\").replace(/\*/g, "[^ ]*").replace(/\?/g, "\\\?")); // eslint-disable-line security/detect-non-literal-regexp
        return regex.test(input);
    };
    return StringUtils;
}());

export { StringUtils };
//# sourceMappingURL=StringUtils.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Utility class which exposes functions for managing date and time operations.
 */
var TimeUtils = /** @class */ (function () {
    function TimeUtils() {
    }
    /**
     * return the current time in Unix time (seconds).
     */
    TimeUtils.nowSeconds = function () {
        // Date.getTime() returns in milliseconds.
        return Math.round(new Date().getTime() / 1000.0);
    };
    /**
     * check if a token is expired based on given UTC time in seconds.
     * @param expiresOn
     */
    TimeUtils.isTokenExpired = function (expiresOn, offset) {
        // check for access token expiry
        var expirationSec = Number(expiresOn) || 0;
        var offsetCurrentTimeSec = TimeUtils.nowSeconds() + offset;
        // If current time + offset is greater than token expiration time, then token is expired.
        return (offsetCurrentTimeSec > expirationSec);
    };
    /**
     * If the current time is earlier than the time that a token was cached at, we must discard the token
     * i.e. The system clock was turned back after acquiring the cached token
     * @param cachedAt
     * @param offset
     */
    TimeUtils.wasClockTurnedBack = function (cachedAt) {
        var cachedAtSec = Number(cachedAt);
        return cachedAtSec > TimeUtils.nowSeconds();
    };
    /**
     * Waits for t number of milliseconds
     * @param t number
     * @param value T
     */
    TimeUtils.delay = function (t, value) {
        return new Promise(function (resolve) { return setTimeout(function () { return resolve(value); }, t); });
    };
    return TimeUtils;
}());

export { TimeUtils };
//# sourceMappingURL=TimeUtils.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { ClientConfigurationError } from '../error/ClientConfigurationError.js';
import { ClientAuthError } from '../error/ClientAuthError.js';
import { StringUtils } from '../utils/StringUtils.js';
import { AADAuthorityConstants, Constants } from '../utils/Constants.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Url object class which can perform various transformations on url strings.
 */
var UrlString = /** @class */ (function () {
    function UrlString(url) {
        this._urlString = url;
        if (StringUtils.isEmpty(this._urlString)) {
            // Throws error if url is empty
            throw ClientConfigurationError.createUrlEmptyError();
        }
        if (StringUtils.isEmpty(this.getHash())) {
            this._urlString = UrlString.canonicalizeUri(url);
        }
    }
    Object.defineProperty(UrlString.prototype, "urlString", {
        get: function () {
            return this._urlString;
        },
        enumerable: false,
        configurable: true
    });
    /**
     * Ensure urls are lower case and end with a / character.
     * @param url
     */
    UrlString.canonicalizeUri = function (url) {
        if (url) {
            var lowerCaseUrl = url.toLowerCase();
            if (StringUtils.endsWith(lowerCaseUrl, "?")) {
                lowerCaseUrl = lowerCaseUrl.slice(0, -1);
            }
            else if (StringUtils.endsWith(lowerCaseUrl, "?/")) {
                lowerCaseUrl = lowerCaseUrl.slice(0, -2);
            }
            if (!StringUtils.endsWith(lowerCaseUrl, "/")) {
                lowerCaseUrl += "/";
            }
            return lowerCaseUrl;
        }
        return url;
    };
    /**
     * Throws if urlString passed is not a valid authority URI string.
     */
    UrlString.prototype.validateAsUri = function () {
        // Attempts to parse url for uri components
        var components;
        try {
            components = this.getUrlComponents();
        }
        catch (e) {
            throw ClientConfigurationError.createUrlParseError(e);
        }
        // Throw error if URI or path segments are not parseable.
        if (!components.HostNameAndPort || !components.PathSegments) {
            throw ClientConfigurationError.createUrlParseError("Given url string: " + this.urlString);
        }
        // Throw error if uri is insecure.
        if (!components.Protocol || components.Protocol.toLowerCase() !== "https:") {
            throw ClientConfigurationError.createInsecureAuthorityUriError(this.urlString);
        }
    };
    /**
     * Given a url and a query string return the url with provided query string appended
     * @param url
     * @param queryString
     */
    UrlString.appendQueryString = function (url, queryString) {
        if (StringUtils.isEmpty(queryString)) {
            return url;
        }
        return url.indexOf("?") < 0 ? url + "?" + queryString : url + "&" + queryString;
    };
    /**
     * Returns a url with the hash removed
     * @param url
     */
    UrlString.removeHashFromUrl = function (url) {
        return UrlString.canonicalizeUri(url.split("#")[0]);
    };
    /**
     * Given a url like https://a:b/common/d?e=f#g, and a tenantId, returns https://a:b/tenantId/d
     * @param href The url
     * @param tenantId The tenant id to replace
     */
    UrlString.prototype.replaceTenantPath = function (tenantId) {
        var urlObject = this.getUrlComponents();
        var pathArray = urlObject.PathSegments;
        if (tenantId && (pathArray.length !== 0 && (pathArray[0] === AADAuthorityConstants.COMMON || pathArray[0] === AADAuthorityConstants.ORGANIZATIONS))) {
            pathArray[0] = tenantId;
        }
        return UrlString.constructAuthorityUriFromObject(urlObject);
    };
    /**
     * Returns the anchor part(#) of the URL
     */
    UrlString.prototype.getHash = function () {
        return UrlString.parseHash(this.urlString);
    };
    /**
     * Parses out the components from a url string.
     * @returns An object with the various components. Please cache this value insted of calling this multiple times on the same url.
     */
    UrlString.prototype.getUrlComponents = function () {
        // https://gist.github.com/curtisz/11139b2cfcaef4a261e0
        var regEx = RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?");
        // If url string does not match regEx, we throw an error
        var match = this.urlString.match(regEx);
        if (!match) {
            throw ClientConfigurationError.createUrlParseError("Given url string: " + this.urlString);
        }
        // Url component object
        var urlComponents = {
            Protocol: match[1],
            HostNameAndPort: match[4],
            AbsolutePath: match[5],
            QueryString: match[7]
        };
        var pathSegments = urlComponents.AbsolutePath.split("/");
        pathSegments = pathSegments.filter(function (val) { return val && val.length > 0; }); // remove empty elements
        urlComponents.PathSegments = pathSegments;
        if (!StringUtils.isEmpty(urlComponents.QueryString) && urlComponents.QueryString.endsWith("/")) {
            urlComponents.QueryString = urlComponents.QueryString.substring(0, urlComponents.QueryString.length - 1);
        }
        return urlComponents;
    };
    UrlString.getDomainFromUrl = function (url) {
        var regEx = RegExp("^([^:/?#]+://)?([^/?#]*)");
        var match = url.match(regEx);
        if (!match) {
            throw ClientConfigurationError.createUrlParseError("Given url string: " + url);
        }
        return match[2];
    };
    UrlString.getAbsoluteUrl = function (relativeUrl, baseUrl) {
        if (relativeUrl[0] === Constants.FORWARD_SLASH) {
            var url = new UrlString(baseUrl);
            var baseComponents = url.getUrlComponents();
            return baseComponents.Protocol + "//" + baseComponents.HostNameAndPort + relativeUrl;
        }
        return relativeUrl;
    };
    /**
     * Parses hash string from given string. Returns empty string if no hash symbol is found.
     * @param hashString
     */
    UrlString.parseHash = function (hashString) {
        var hashIndex1 = hashString.indexOf("#");
        var hashIndex2 = hashString.indexOf("#/");
        if (hashIndex2 > -1) {
            return hashString.substring(hashIndex2 + 2);
        }
        else if (hashIndex1 > -1) {
            return hashString.substring(hashIndex1 + 1);
        }
        return Constants.EMPTY_STRING;
    };
    UrlString.constructAuthorityUriFromObject = function (urlObject) {
        return new UrlString(urlObject.Protocol + "//" + urlObject.HostNameAndPort + "/" + urlObject.PathSegments.join("/"));
    };
    /**
     * Returns URL hash as server auth code response object.
     */
    UrlString.getDeserializedHash = function (hash) {
        // Check if given hash is empty
        if (StringUtils.isEmpty(hash)) {
            return {};
        }
        // Strip the # symbol if present
        var parsedHash = UrlString.parseHash(hash);
        // If # symbol was not present, above will return empty string, so give original hash value
        var deserializedHash = StringUtils.queryStringToObject(StringUtils.isEmpty(parsedHash) ? hash : parsedHash);
        // Check if deserialization didn't work
        if (!deserializedHash) {
            throw ClientAuthError.createHashNotDeserializedError(JSON.stringify(deserializedHash));
        }
        return deserializedHash;
    };
    /**
     * Check if the hash of the URL string contains known properties
     */
    UrlString.hashContainsKnownProperties = function (hash) {
        if (StringUtils.isEmpty(hash) || hash.indexOf("=") < 0) {
            // Hash doesn't contain key/value pairs
            return false;
        }
        var parameters = UrlString.getDeserializedHash(hash);
        return !!(parameters.code ||
            parameters.error_description ||
            parameters.error ||
            parameters.state);
    };
    return UrlString;
}());

export { UrlString };
//# sourceMappingURL=UrlString.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { SERVER_TELEM_CONSTANTS, CacheOutcome, Constants, Separators } from '../../utils/Constants.js';
import { ServerTelemetryEntity } from '../../cache/entities/ServerTelemetryEntity.js';
import { StringUtils } from '../../utils/StringUtils.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var ServerTelemetryManager = /** @class */ (function () {
    function ServerTelemetryManager(telemetryRequest, cacheManager) {
        this.cacheOutcome = CacheOutcome.NO_CACHE_HIT;
        this.cacheManager = cacheManager;
        this.apiId = telemetryRequest.apiId;
        this.correlationId = telemetryRequest.correlationId;
        this.wrapperSKU = telemetryRequest.wrapperSKU || Constants.EMPTY_STRING;
        this.wrapperVer = telemetryRequest.wrapperVer || Constants.EMPTY_STRING;
        this.telemetryCacheKey = SERVER_TELEM_CONSTANTS.CACHE_KEY + Separators.CACHE_KEY_SEPARATOR + telemetryRequest.clientId;
    }
    /**
     * API to add MSER Telemetry to request
     */
    ServerTelemetryManager.prototype.generateCurrentRequestHeaderValue = function () {
        var request = "" + this.apiId + SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR + this.cacheOutcome;
        var platformFields = [this.wrapperSKU, this.wrapperVer].join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);
        var regionDiscoveryFields = this.getRegionDiscoveryFields();
        var requestWithRegionDiscoveryFields = [request, regionDiscoveryFields].join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);
        return [SERVER_TELEM_CONSTANTS.SCHEMA_VERSION, requestWithRegionDiscoveryFields, platformFields].join(SERVER_TELEM_CONSTANTS.CATEGORY_SEPARATOR);
    };
    /**
     * API to add MSER Telemetry for the last failed request
     */
    ServerTelemetryManager.prototype.generateLastRequestHeaderValue = function () {
        var lastRequests = this.getLastRequests();
        var maxErrors = ServerTelemetryManager.maxErrorsToSend(lastRequests);
        var failedRequests = lastRequests.failedRequests.slice(0, 2 * maxErrors).join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);
        var errors = lastRequests.errors.slice(0, maxErrors).join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);
        var errorCount = lastRequests.errors.length;
        // Indicate whether this header contains all data or partial data
        var overflow = maxErrors < errorCount ? SERVER_TELEM_CONSTANTS.OVERFLOW_TRUE : SERVER_TELEM_CONSTANTS.OVERFLOW_FALSE;
        var platformFields = [errorCount, overflow].join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);
        return [SERVER_TELEM_CONSTANTS.SCHEMA_VERSION, lastRequests.cacheHits, failedRequests, errors, platformFields].join(SERVER_TELEM_CONSTANTS.CATEGORY_SEPARATOR);
    };
    /**
     * API to cache token failures for MSER data capture
     * @param error
     */
    ServerTelemetryManager.prototype.cacheFailedRequest = function (error) {
        var lastRequests = this.getLastRequests();
        if (lastRequests.errors.length >= SERVER_TELEM_CONSTANTS.MAX_CACHED_ERRORS) {
            // Remove a cached error to make room, first in first out
            lastRequests.failedRequests.shift(); // apiId
            lastRequests.failedRequests.shift(); // correlationId
            lastRequests.errors.shift();
        }
        lastRequests.failedRequests.push(this.apiId, this.correlationId);
        if (!StringUtils.isEmpty(error.subError)) {
            lastRequests.errors.push(error.subError);
        }
        else if (!StringUtils.isEmpty(error.errorCode)) {
            lastRequests.errors.push(error.errorCode);
        }
        else if (!!error && error.toString()) {
            lastRequests.errors.push(error.toString());
        }
        else {
            lastRequests.errors.push(SERVER_TELEM_CONSTANTS.UNKNOWN_ERROR);
        }
        this.cacheManager.setServerTelemetry(this.telemetryCacheKey, lastRequests);
        return;
    };
    /**
     * Update server telemetry cache entry by incrementing cache hit counter
     */
    ServerTelemetryManager.prototype.incrementCacheHits = function () {
        var lastRequests = this.getLastRequests();
        lastRequests.cacheHits += 1;
        this.cacheManager.setServerTelemetry(this.telemetryCacheKey, lastRequests);
        return lastRequests.cacheHits;
    };
    /**
     * Get the server telemetry entity from cache or initialize a new one
     */
    ServerTelemetryManager.prototype.getLastRequests = function () {
        var initialValue = new ServerTelemetryEntity();
        var lastRequests = this.cacheManager.getServerTelemetry(this.telemetryCacheKey);
        return lastRequests || initialValue;
    };
    /**
     * Remove server telemetry cache entry
     */
    ServerTelemetryManager.prototype.clearTelemetryCache = function () {
        var lastRequests = this.getLastRequests();
        var numErrorsFlushed = ServerTelemetryManager.maxErrorsToSend(lastRequests);
        var errorCount = lastRequests.errors.length;
        if (numErrorsFlushed === errorCount) {
            // All errors were sent on last request, clear Telemetry cache
            this.cacheManager.removeItem(this.telemetryCacheKey);
        }
        else {
            // Partial data was flushed to server, construct a new telemetry cache item with errors that were not flushed
            var serverTelemEntity = new ServerTelemetryEntity();
            serverTelemEntity.failedRequests = lastRequests.failedRequests.slice(numErrorsFlushed * 2); // failedRequests contains 2 items for each error
            serverTelemEntity.errors = lastRequests.errors.slice(numErrorsFlushed);
            this.cacheManager.setServerTelemetry(this.telemetryCacheKey, serverTelemEntity);
        }
    };
    /**
     * Returns the maximum number of errors that can be flushed to the server in the next network request
     * @param serverTelemetryEntity
     */
    ServerTelemetryManager.maxErrorsToSend = function (serverTelemetryEntity) {
        var i;
        var maxErrors = 0;
        var dataSize = 0;
        var errorCount = serverTelemetryEntity.errors.length;
        for (i = 0; i < errorCount; i++) {
            // failedRequests parameter contains pairs of apiId and correlationId, multiply index by 2 to preserve pairs
            var apiId = serverTelemetryEntity.failedRequests[2 * i] || Constants.EMPTY_STRING;
            var correlationId = serverTelemetryEntity.failedRequests[2 * i + 1] || Constants.EMPTY_STRING;
            var errorCode = serverTelemetryEntity.errors[i] || Constants.EMPTY_STRING;
            // Count number of characters that would be added to header, each character is 1 byte. Add 3 at the end to account for separators
            dataSize += apiId.toString().length + correlationId.toString().length + errorCode.length + 3;
            if (dataSize < SERVER_TELEM_CONSTANTS.MAX_LAST_HEADER_BYTES) {
                // Adding this entry to the header would still keep header size below the limit
                maxErrors += 1;
            }
            else {
                break;
            }
        }
        return maxErrors;
    };
    /**
     * Get the region discovery fields
     *
     * @returns string
     */
    ServerTelemetryManager.prototype.getRegionDiscoveryFields = function () {
        var regionDiscoveryFields = [];
        regionDiscoveryFields.push(this.regionUsed || Constants.EMPTY_STRING);
        regionDiscoveryFields.push(this.regionSource || Constants.EMPTY_STRING);
        regionDiscoveryFields.push(this.regionOutcome || Constants.EMPTY_STRING);
        return regionDiscoveryFields.join(",");
    };
    /**
     * Update the region discovery metadata
     *
     * @param regionDiscoveryMetadata
     * @returns void
     */
    ServerTelemetryManager.prototype.updateRegionDiscoveryMetadata = function (regionDiscoveryMetadata) {
        this.regionUsed = regionDiscoveryMetadata.region_used;
        this.regionSource = regionDiscoveryMetadata.region_source;
        this.regionOutcome = regionDiscoveryMetadata.region_outcome;
    };
    /**
     * Set cache outcome
     */
    ServerTelemetryManager.prototype.setCacheOutcome = function (cacheOutcome) {
        this.cacheOutcome = cacheOutcome;
    };
    return ServerTelemetryManager;
}());

export { ServerTelemetryManager };
//# sourceMappingURL=ServerTelemetryManager.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __assign } from '../../_virtual/_tslib.js';
import { PerformanceEventStatus } from './PerformanceEvent.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var PerformanceClient = /** @class */ (function () {
    /**
     * Creates an instance of PerformanceClient,
     * an abstract class containing core performance telemetry logic.
     *
     * @constructor
     * @param {string} clientId Client ID of the application
     * @param {string} authority Authority used by the application
     * @param {Logger} logger Logger used by the application
     * @param {string} libraryName Name of the library
     * @param {string} libraryVersion Version of the library
     */
    function PerformanceClient(clientId, authority, logger, libraryName, libraryVersion, applicationTelemetry) {
        this.authority = authority;
        this.libraryName = libraryName;
        this.libraryVersion = libraryVersion;
        this.applicationTelemetry = applicationTelemetry;
        this.clientId = clientId;
        this.logger = logger;
        this.callbacks = new Map();
        this.eventsByCorrelationId = new Map();
        this.measurementsById = new Map();
    }
    /**
     * Starts measuring performance for a given operation. Returns a function that should be used to end the measurement.
     *
     * @param {PerformanceEvents} measureName
     * @param {?string} [correlationId]
     * @returns {InProgressPerformanceEvent}
     */
    PerformanceClient.prototype.startMeasurement = function (measureName, correlationId) {
        var _this = this;
        var _a, _b;
        // Generate a placeholder correlation if the request does not provide one
        var eventCorrelationId = correlationId || this.generateId();
        if (!correlationId) {
            this.logger.info("PerformanceClient: No correlation id provided for " + measureName + ", generating", eventCorrelationId);
        }
        this.logger.trace("PerformanceClient: Performance measurement started for " + measureName, eventCorrelationId);
        var performanceMeasurement = this.startPerformanceMeasuremeant(measureName, eventCorrelationId);
        performanceMeasurement.startMeasurement();
        var inProgressEvent = {
            eventId: this.generateId(),
            status: PerformanceEventStatus.InProgress,
            authority: this.authority,
            libraryName: this.libraryName,
            libraryVersion: this.libraryVersion,
            appName: (_a = this.applicationTelemetry) === null || _a === void 0 ? void 0 : _a.appName,
            appVersion: (_b = this.applicationTelemetry) === null || _b === void 0 ? void 0 : _b.appVersion,
            clientId: this.clientId,
            name: measureName,
            startTimeMs: Date.now(),
            correlationId: eventCorrelationId,
        };
        // Store in progress events so they can be discarded if not ended properly
        this.cacheEventByCorrelationId(inProgressEvent);
        this.cacheMeasurement(inProgressEvent, performanceMeasurement);
        // Return the event and functions the caller can use to properly end/flush the measurement
        return {
            endMeasurement: function (event) {
                var completedEvent = _this.endMeasurement(__assign(__assign({}, inProgressEvent), event));
                if (completedEvent) {
                    // Cache event so that submeasurements can be added downstream
                    _this.cacheEventByCorrelationId(completedEvent);
                }
                return completedEvent;
            },
            flushMeasurement: function () {
                return _this.flushMeasurements(inProgressEvent.name, inProgressEvent.correlationId);
            },
            discardMeasurement: function () {
                return _this.discardMeasurements(inProgressEvent.correlationId);
            },
            measurement: performanceMeasurement,
            event: inProgressEvent
        };
    };
    /**
     * Stops measuring the performance for an operation. Should only be called directly by PerformanceClient classes,
     * as consumers should instead use the function returned by startMeasurement.
     *
     * @param {PerformanceEvent} event
     * @returns {(PerformanceEvent | null)}
     */
    PerformanceClient.prototype.endMeasurement = function (event) {
        var performanceMeasurement = this.measurementsById.get(event.eventId);
        if (performanceMeasurement) {
            // Immediately delete so that the same event isnt ended twice
            this.measurementsById.delete(event.eventId);
            performanceMeasurement.endMeasurement();
            var durationMs = performanceMeasurement.flushMeasurement();
            // null indicates no measurement was taken (e.g. needed performance APIs not present)
            if (durationMs !== null) {
                this.logger.trace("PerformanceClient: Performance measurement ended for " + event.name + ": " + durationMs + " ms", event.correlationId);
                var completedEvent = __assign(__assign({ 
                    // Allow duration to be overwritten when event ends (e.g. testing), but not status
                    durationMs: Math.round(durationMs) }, event), { status: PerformanceEventStatus.Completed });
                return completedEvent;
            }
            else {
                this.logger.trace("PerformanceClient: Performance measurement not taken", event.correlationId);
            }
        }
        else {
            this.logger.trace("PerformanceClient: Measurement not found for " + event.eventId, event.correlationId);
        }
        return null;
    };
    /**
     * Upserts event into event cache.
     * First key is the correlation id, second key is the event id.
     * Allows for events to be grouped by correlation id,
     * and to easily allow for properties on them to be updated.
     *
     * @private
     * @param {PerformanceEvent} event
     */
    PerformanceClient.prototype.cacheEventByCorrelationId = function (event) {
        var existingEvents = this.eventsByCorrelationId.get(event.correlationId);
        if (existingEvents) {
            this.logger.trace("PerformanceClient: Performance measurement for " + event.name + " added/updated", event.correlationId);
            existingEvents.set(event.eventId, event);
        }
        else {
            this.logger.trace("PerformanceClient: Performance measurement for " + event.name + " started", event.correlationId);
            this.eventsByCorrelationId.set(event.correlationId, new Map().set(event.eventId, event));
        }
    };
    /**
     * Cache measurements by their id.
     *
     * @private
     * @param {PerformanceEvent} event
     * @param {IPerformanceMeasurement} measurement
     */
    PerformanceClient.prototype.cacheMeasurement = function (event, measurement) {
        this.measurementsById.set(event.eventId, measurement);
    };
    /**
     * Gathers and emits performance events for measurements taked for the given top-level API and correlation ID.
     *
     * @param {PerformanceEvents} measureName
     * @param {string} correlationId
     */
    PerformanceClient.prototype.flushMeasurements = function (measureName, correlationId) {
        var _this = this;
        this.logger.trace("PerformanceClient: Performance measurements flushed for " + measureName, correlationId);
        var eventsForCorrelationId = this.eventsByCorrelationId.get(correlationId);
        if (eventsForCorrelationId) {
            this.discardMeasurements(correlationId);
            /*
             * Manually end incomplete submeasurements to ensure there arent orphaned/never ending events.
             * Incomplete submeasurements are likely an instrumentation bug that should be fixed.
             * IE only supports Map.forEach.
             */
            var completedEvents_1 = [];
            eventsForCorrelationId.forEach(function (event) {
                if (event.name !== measureName && event.status !== PerformanceEventStatus.Completed) {
                    _this.logger.trace("PerformanceClient: Incomplete submeasurement " + event.name + " found for " + measureName, correlationId);
                    var completedEvent = _this.endMeasurement(event);
                    if (completedEvent) {
                        completedEvents_1.push(completedEvent);
                    }
                }
                completedEvents_1.push(event);
            });
            // Sort events by start time (earliest first)
            var sortedCompletedEvents = completedEvents_1.sort(function (eventA, eventB) { return eventA.startTimeMs - eventB.startTimeMs; });
            // Take completed top level event and add completed submeasurements durations as properties
            var topLevelEvents = sortedCompletedEvents.filter(function (event) { return event.name === measureName && event.status === PerformanceEventStatus.Completed; });
            if (topLevelEvents.length > 0) {
                /*
                 * Only take the first top-level event if there are multiple events with the same correlation id.
                 * This greatly simplifies logic for submeasurements.
                 */
                if (topLevelEvents.length > 1) {
                    this.logger.verbose("PerformanceClient: Multiple distinct top-level performance events found, using the first", correlationId);
                }
                var topLevelEvent = topLevelEvents[0];
                this.logger.verbose("PerformanceClient: Measurement found for " + measureName, correlationId);
                // Build event object with top level and sub measurements
                var eventToEmit = sortedCompletedEvents.reduce(function (previous, current) {
                    if (current.name !== measureName) {
                        _this.logger.trace("PerformanceClient: Complete submeasurement found for " + current.name, correlationId);
                        // TODO: Emit additional properties for each subMeasurement
                        var subMeasurementName = current.name + "DurationMs";
                        /*
                         * Some code paths, such as resolving an authority, can occur multiple times.
                         * Only take the first measurement, since the second could be read from the cache,
                         * or due to the same correlation id being used for two distinct requests.
                         */
                        if (!previous[subMeasurementName]) {
                            previous[subMeasurementName] = current.durationMs;
                        }
                        else {
                            _this.logger.verbose("PerformanceClient: Submeasurement for " + measureName + " already exists for " + current.name + ", ignoring", correlationId);
                        }
                        if (current.accessTokenSize) {
                            previous.accessTokenSize = current.accessTokenSize;
                        }
                        if (current.idTokenSize) {
                            previous.idTokenSize = current.idTokenSize;
                        }
                    }
                    return previous;
                }, topLevelEvent);
                this.emitEvents([eventToEmit], eventToEmit.correlationId);
            }
            else {
                this.logger.verbose("PerformanceClient: No completed top-level measurements found for " + measureName, correlationId);
            }
        }
        else {
            this.logger.verbose("PerformanceClient: No measurements found", correlationId);
        }
    };
    /**
     * Removes measurements for a given correlation id.
     *
     * @param {string} correlationId
     */
    PerformanceClient.prototype.discardMeasurements = function (correlationId) {
        this.logger.trace("PerformanceClient: Performance measurements discarded", correlationId);
        this.eventsByCorrelationId.delete(correlationId);
    };
    /**
     * Registers a callback function to receive performance events.
     *
     * @param {PerformanceCallbackFunction} callback
     * @returns {string}
     */
    PerformanceClient.prototype.addPerformanceCallback = function (callback) {
        var callbackId = this.generateId();
        this.callbacks.set(callbackId, callback);
        this.logger.verbose("PerformanceClient: Performance callback registered with id: " + callbackId);
        return callbackId;
    };
    /**
     * Removes a callback registered with addPerformanceCallback.
     *
     * @param {string} callbackId
     * @returns {boolean}
     */
    PerformanceClient.prototype.removePerformanceCallback = function (callbackId) {
        var result = this.callbacks.delete(callbackId);
        if (result) {
            this.logger.verbose("PerformanceClient: Performance callback " + callbackId + " removed.");
        }
        else {
            this.logger.verbose("PerformanceClient: Performance callback " + callbackId + " not removed.");
        }
        return result;
    };
    /**
     * Emits events to all registered callbacks.
     *
     * @param {PerformanceEvent[]} events
     * @param {?string} [correlationId]
     */
    PerformanceClient.prototype.emitEvents = function (events, correlationId) {
        var _this = this;
        this.logger.verbose("PerformanceClient: Emitting performance events", correlationId);
        this.callbacks.forEach(function (callback, callbackId) {
            _this.logger.trace("PerformanceClient: Emitting event to callback " + callbackId, correlationId);
            callback.apply(null, [events]);
        });
    };
    return PerformanceClient;
}());

export { PerformanceClient };
//# sourceMappingURL=PerformanceClient.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Enumeration of operations that are instrumented by have their performance measured by the PerformanceClient.
 *
 * @export
 * @enum {number}
 */
var PerformanceEvents;
(function (PerformanceEvents) {
    /**
     * acquireTokenByCode API (msal-browser and msal-node).
     * Used to acquire tokens by trading an authorization code against the token endpoint.
     */
    PerformanceEvents["AcquireTokenByCode"] = "acquireTokenByCode";
    /**
     * acquireTokenByRefreshToken API (msal-browser and msal-node).
     * Used to renew an access token using a refresh token against the token endpoint.
     */
    PerformanceEvents["AcquireTokenByRefreshToken"] = "acquireTokenByRefreshToken";
    /**
     * acquireTokenSilent API (msal-browser and msal-node).
     * Used to silently acquire a new access token (from the cache or the network).
     */
    PerformanceEvents["AcquireTokenSilent"] = "acquireTokenSilent";
    /**
     * acquireTokenSilentAsync (msal-browser).
     * Internal API for acquireTokenSilent.
     */
    PerformanceEvents["AcquireTokenSilentAsync"] = "acquireTokenSilentAsync";
    /**
     * acquireTokenPopup (msal-browser).
     * Used to acquire a new access token interactively through pop ups
     */
    PerformanceEvents["AcquireTokenPopup"] = "acquireTokenPopup";
    /**
     * getPublicKeyThumbprint API in CryptoOpts class (msal-browser).
     * Used to generate a public/private keypair and generate a public key thumbprint for pop requests.
     */
    PerformanceEvents["CryptoOptsGetPublicKeyThumbprint"] = "cryptoOptsGetPublicKeyThumbprint";
    /**
     * signJwt API in CryptoOpts class (msal-browser).
     * Used to signed a pop token.
     */
    PerformanceEvents["CryptoOptsSignJwt"] = "cryptoOptsSignJwt";
    /**
     * acquireToken API in the SilentCacheClient class (msal-browser).
     * Used to read access tokens from the cache.
     */
    PerformanceEvents["SilentCacheClientAcquireToken"] = "silentCacheClientAcquireToken";
    /**
     * acquireToken API in the SilentIframeClient class (msal-browser).
     * Used to acquire a new set of tokens from the authorize endpoint in a hidden iframe.
     */
    PerformanceEvents["SilentIframeClientAcquireToken"] = "silentIframeClientAcquireToken";
    /**
     * acquireToken API in SilentRereshClient (msal-browser).
     * Used to acquire a new set of tokens from the token endpoint using a refresh token.
     */
    PerformanceEvents["SilentRefreshClientAcquireToken"] = "silentRefreshClientAcquireToken";
    /**
     * ssoSilent API (msal-browser).
     * Used to silently acquire an authorization code and set of tokens using a hidden iframe.
     */
    PerformanceEvents["SsoSilent"] = "ssoSilent";
    /**
     * getDiscoveredAuthority API in StandardInteractionClient class (msal-browser).
     * Used to load authority metadata for a request.
     */
    PerformanceEvents["StandardInteractionClientGetDiscoveredAuthority"] = "standardInteractionClientGetDiscoveredAuthority";
    /**
     * acquireToken APIs in msal-browser.
     * Used to make an /authorize endpoint call with native brokering enabled.
     */
    PerformanceEvents["FetchAccountIdWithNativeBroker"] = "fetchAccountIdWithNativeBroker";
    /**
     * acquireToken API in NativeInteractionClient class (msal-browser).
     * Used to acquire a token from Native component when native brokering is enabled.
     */
    PerformanceEvents["NativeInteractionClientAcquireToken"] = "nativeInteractionClientAcquireToken";
    /**
     * Time spent on the network for refresh token acquisition
     */
    PerformanceEvents["RefreshTokenClientExecuteTokenRequest"] = "refreshTokenClientExecuteTokenRequest";
    /**
     * Time spent creating default headers for requests to token endpoint
     */
    PerformanceEvents["BaseClientCreateTokenRequestHeaders"] = "baseClientCreateTokenRequestHeaders";
    /**
     * Used to measure the time taken for completing embedded-broker handshake (PW-Broker).
     */
    PerformanceEvents["BrokerHandhshake"] = "brokerHandshake";
    /**
     * acquireTokenByRefreshToken API in BrokerClientApplication (PW-Broker) .
     */
    PerformanceEvents["AcquireTokenByRefreshTokenInBroker"] = "acquireTokenByRefreshTokenInBroker";
    /**
     * acquireToken API in BrokerClientApplication.
     * Used to acquire a token on behalf of the embedded application (PW-Broker).
     */
    PerformanceEvents["AcquireTokenByBroker"] = "acquireTokenByBroker";
})(PerformanceEvents || (PerformanceEvents = {}));
/**
 * State of the performance event.
 *
 * @export
 * @enum {number}
 */
var PerformanceEventStatus;
(function (PerformanceEventStatus) {
    PerformanceEventStatus[PerformanceEventStatus["NotStarted"] = 0] = "NotStarted";
    PerformanceEventStatus[PerformanceEventStatus["InProgress"] = 1] = "InProgress";
    PerformanceEventStatus[PerformanceEventStatus["Completed"] = 2] = "Completed";
})(PerformanceEventStatus || (PerformanceEventStatus = {}));

export { PerformanceEventStatus, PerformanceEvents };
//# sourceMappingURL=PerformanceEvent.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __extends } from '../../_virtual/_tslib.js';
import { PerformanceClient } from './PerformanceClient.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var StubPerformanceMeasurement = /** @class */ (function () {
    function StubPerformanceMeasurement() {
    }
    /* eslint-disable-next-line @typescript-eslint/no-empty-function */
    StubPerformanceMeasurement.prototype.startMeasurement = function () { };
    /* eslint-disable-next-line @typescript-eslint/no-empty-function */
    StubPerformanceMeasurement.prototype.endMeasurement = function () { };
    StubPerformanceMeasurement.prototype.flushMeasurement = function () {
        return null;
    };
    return StubPerformanceMeasurement;
}());
var StubPerformanceClient = /** @class */ (function (_super) {
    __extends(StubPerformanceClient, _super);
    function StubPerformanceClient() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    StubPerformanceClient.prototype.generateId = function () {
        return "callback-id";
    };
    StubPerformanceClient.prototype.startPerformanceMeasuremeant = function () {
        return new StubPerformanceMeasurement();
    };
    return StubPerformanceClient;
}(PerformanceClient));

export { StubPerformanceClient, StubPerformanceMeasurement };
//# sourceMappingURL=StubPerformanceClient.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __awaiter, __generator } from '../_virtual/_tslib.js';
import { buildClientInfo } from '../account/ClientInfo.js';
import { ClientAuthError } from '../error/ClientAuthError.js';
import { StringUtils } from '../utils/StringUtils.js';
import { ServerError } from '../error/ServerError.js';
import { AuthToken } from '../account/AuthToken.js';
import { ScopeSet } from '../request/ScopeSet.js';
import { AccountEntity } from '../cache/entities/AccountEntity.js';
import { AuthorityType } from '../authority/AuthorityType.js';
import { IdTokenEntity } from '../cache/entities/IdTokenEntity.js';
import { AccessTokenEntity } from '../cache/entities/AccessTokenEntity.js';
import { RefreshTokenEntity } from '../cache/entities/RefreshTokenEntity.js';
import { InteractionRequiredAuthError } from '../error/InteractionRequiredAuthError.js';
import { CacheRecord } from '../cache/entities/CacheRecord.js';
import { ProtocolUtils } from '../utils/ProtocolUtils.js';
import { Constants, AuthenticationScheme, THE_FAMILY_ID } from '../utils/Constants.js';
import { PopTokenGenerator } from '../crypto/PopTokenGenerator.js';
import { AppMetadataEntity } from '../cache/entities/AppMetadataEntity.js';
import { TokenCacheContext } from '../cache/persistence/TokenCacheContext.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Class that handles response parsing.
 */
var ResponseHandler = /** @class */ (function () {
    function ResponseHandler(clientId, cacheStorage, cryptoObj, logger, serializableCache, persistencePlugin) {
        this.clientId = clientId;
        this.cacheStorage = cacheStorage;
        this.cryptoObj = cryptoObj;
        this.logger = logger;
        this.serializableCache = serializableCache;
        this.persistencePlugin = persistencePlugin;
    }
    /**
     * Function which validates server authorization code response.
     * @param serverResponseHash
     * @param cachedState
     * @param cryptoObj
     */
    ResponseHandler.prototype.validateServerAuthorizationCodeResponse = function (serverResponseHash, cachedState, cryptoObj) {
        if (!serverResponseHash.state || !cachedState) {
            throw !serverResponseHash.state ? ClientAuthError.createStateNotFoundError("Server State") : ClientAuthError.createStateNotFoundError("Cached State");
        }
        if (decodeURIComponent(serverResponseHash.state) !== decodeURIComponent(cachedState)) {
            throw ClientAuthError.createStateMismatchError();
        }
        // Check for error
        if (serverResponseHash.error || serverResponseHash.error_description || serverResponseHash.suberror) {
            if (InteractionRequiredAuthError.isInteractionRequiredError(serverResponseHash.error, serverResponseHash.error_description, serverResponseHash.suberror)) {
                throw new InteractionRequiredAuthError(serverResponseHash.error || Constants.EMPTY_STRING, serverResponseHash.error_description, serverResponseHash.suberror);
            }
            throw new ServerError(serverResponseHash.error || Constants.EMPTY_STRING, serverResponseHash.error_description, serverResponseHash.suberror);
        }
        if (serverResponseHash.client_info) {
            buildClientInfo(serverResponseHash.client_info, cryptoObj);
        }
    };
    /**
     * Function which validates server authorization token response.
     * @param serverResponse
     */
    ResponseHandler.prototype.validateTokenResponse = function (serverResponse) {
        // Check for error
        if (serverResponse.error || serverResponse.error_description || serverResponse.suberror) {
            if (InteractionRequiredAuthError.isInteractionRequiredError(serverResponse.error, serverResponse.error_description, serverResponse.suberror)) {
                throw new InteractionRequiredAuthError(serverResponse.error, serverResponse.error_description, serverResponse.suberror);
            }
            var errString = serverResponse.error_codes + " - [" + serverResponse.timestamp + "]: " + serverResponse.error_description + " - Correlation ID: " + serverResponse.correlation_id + " - Trace ID: " + serverResponse.trace_id;
            throw new ServerError(serverResponse.error, errString, serverResponse.suberror);
        }
    };
    /**
     * Returns a constructed token response based on given string. Also manages the cache updates and cleanups.
     * @param serverTokenResponse
     * @param authority
     */
    ResponseHandler.prototype.handleServerTokenResponse = function (serverTokenResponse, authority, reqTimestamp, request, authCodePayload, userAssertionHash, handlingRefreshTokenResponse, forceCacheRefreshTokenResponse) {
        return __awaiter(this, void 0, void 0, function () {
            var idTokenObj, requestStateObj, cacheRecord, cacheContext, key, account;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        if (serverTokenResponse.id_token) {
                            idTokenObj = new AuthToken(serverTokenResponse.id_token || Constants.EMPTY_STRING, this.cryptoObj);
                            // token nonce check (TODO: Add a warning if no nonce is given?)
                            if (authCodePayload && !StringUtils.isEmpty(authCodePayload.nonce)) {
                                if (idTokenObj.claims.nonce !== authCodePayload.nonce) {
                                    throw ClientAuthError.createNonceMismatchError();
                                }
                            }
                        }
                        // generate homeAccountId
                        this.homeAccountIdentifier = AccountEntity.generateHomeAccountId(serverTokenResponse.client_info || Constants.EMPTY_STRING, authority.authorityType, this.logger, this.cryptoObj, idTokenObj);
                        if (!!authCodePayload && !!authCodePayload.state) {
                            requestStateObj = ProtocolUtils.parseRequestState(this.cryptoObj, authCodePayload.state);
                        }
                        // Add keyId from request to serverTokenResponse if defined
                        serverTokenResponse.key_id = serverTokenResponse.key_id || request.sshKid || undefined;
                        cacheRecord = this.generateCacheRecord(serverTokenResponse, authority, reqTimestamp, request, idTokenObj, userAssertionHash, authCodePayload);
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, , 5, 8]);
                        if (!(this.persistencePlugin && this.serializableCache)) return [3 /*break*/, 3];
                        this.logger.verbose("Persistence enabled, calling beforeCacheAccess");
                        cacheContext = new TokenCacheContext(this.serializableCache, true);
                        return [4 /*yield*/, this.persistencePlugin.beforeCacheAccess(cacheContext)];
                    case 2:
                        _a.sent();
                        _a.label = 3;
                    case 3:
                        /*
                         * When saving a refreshed tokens to the cache, it is expected that the account that was used is present in the cache.
                         * If not present, we should return null, as it's the case that another application called removeAccount in between
                         * the calls to getAllAccounts and acquireTokenSilent. We should not overwrite that removal, unless explicitly flagged by
                         * the developer, as in the case of refresh token flow used in ADAL Node to MSAL Node migration.
                         */
                        if (handlingRefreshTokenResponse && !forceCacheRefreshTokenResponse && cacheRecord.account) {
                            key = cacheRecord.account.generateAccountKey();
                            account = this.cacheStorage.getAccount(key);
                            if (!account) {
                                this.logger.warning("Account used to refresh tokens not in persistence, refreshed tokens will not be stored in the cache");
                                return [2 /*return*/, ResponseHandler.generateAuthenticationResult(this.cryptoObj, authority, cacheRecord, false, request, idTokenObj, requestStateObj, undefined)];
                            }
                        }
                        return [4 /*yield*/, this.cacheStorage.saveCacheRecord(cacheRecord)];
                    case 4:
                        _a.sent();
                        return [3 /*break*/, 8];
                    case 5:
                        if (!(this.persistencePlugin && this.serializableCache && cacheContext)) return [3 /*break*/, 7];
                        this.logger.verbose("Persistence enabled, calling afterCacheAccess");
                        return [4 /*yield*/, this.persistencePlugin.afterCacheAccess(cacheContext)];
                    case 6:
                        _a.sent();
                        _a.label = 7;
                    case 7: return [7 /*endfinally*/];
                    case 8: return [2 /*return*/, ResponseHandler.generateAuthenticationResult(this.cryptoObj, authority, cacheRecord, false, request, idTokenObj, requestStateObj, serverTokenResponse.spa_code)];
                }
            });
        });
    };
    /**
     * Generates CacheRecord
     * @param serverTokenResponse
     * @param idTokenObj
     * @param authority
     */
    ResponseHandler.prototype.generateCacheRecord = function (serverTokenResponse, authority, reqTimestamp, request, idTokenObj, userAssertionHash, authCodePayload) {
        var env = authority.getPreferredCache();
        if (StringUtils.isEmpty(env)) {
            throw ClientAuthError.createInvalidCacheEnvironmentError();
        }
        // IdToken: non AAD scenarios can have empty realm
        var cachedIdToken;
        var cachedAccount;
        if (!StringUtils.isEmpty(serverTokenResponse.id_token) && !!idTokenObj) {
            cachedIdToken = IdTokenEntity.createIdTokenEntity(this.homeAccountIdentifier, env, serverTokenResponse.id_token || Constants.EMPTY_STRING, this.clientId, idTokenObj.claims.tid || Constants.EMPTY_STRING);
            cachedAccount = this.generateAccountEntity(serverTokenResponse, idTokenObj, authority, authCodePayload);
        }
        // AccessToken
        var cachedAccessToken = null;
        if (!StringUtils.isEmpty(serverTokenResponse.access_token)) {
            // If scopes not returned in server response, use request scopes
            var responseScopes = serverTokenResponse.scope ? ScopeSet.fromString(serverTokenResponse.scope) : new ScopeSet(request.scopes || []);
            /*
             * Use timestamp calculated before request
             * Server may return timestamps as strings, parse to numbers if so.
             */
            var expiresIn = (typeof serverTokenResponse.expires_in === "string" ? parseInt(serverTokenResponse.expires_in, 10) : serverTokenResponse.expires_in) || 0;
            var extExpiresIn = (typeof serverTokenResponse.ext_expires_in === "string" ? parseInt(serverTokenResponse.ext_expires_in, 10) : serverTokenResponse.ext_expires_in) || 0;
            var refreshIn = (typeof serverTokenResponse.refresh_in === "string" ? parseInt(serverTokenResponse.refresh_in, 10) : serverTokenResponse.refresh_in) || undefined;
            var tokenExpirationSeconds = reqTimestamp + expiresIn;
            var extendedTokenExpirationSeconds = tokenExpirationSeconds + extExpiresIn;
            var refreshOnSeconds = refreshIn && refreshIn > 0 ? reqTimestamp + refreshIn : undefined;
            // non AAD scenarios can have empty realm
            cachedAccessToken = AccessTokenEntity.createAccessTokenEntity(this.homeAccountIdentifier, env, serverTokenResponse.access_token || Constants.EMPTY_STRING, this.clientId, idTokenObj ? idTokenObj.claims.tid || Constants.EMPTY_STRING : authority.tenant, responseScopes.printScopes(), tokenExpirationSeconds, extendedTokenExpirationSeconds, this.cryptoObj, refreshOnSeconds, serverTokenResponse.token_type, userAssertionHash, serverTokenResponse.key_id, request.claims, request.requestedClaimsHash);
        }
        // refreshToken
        var cachedRefreshToken = null;
        if (!StringUtils.isEmpty(serverTokenResponse.refresh_token)) {
            cachedRefreshToken = RefreshTokenEntity.createRefreshTokenEntity(this.homeAccountIdentifier, env, serverTokenResponse.refresh_token || Constants.EMPTY_STRING, this.clientId, serverTokenResponse.foci, userAssertionHash);
        }
        // appMetadata
        var cachedAppMetadata = null;
        if (!StringUtils.isEmpty(serverTokenResponse.foci)) {
            cachedAppMetadata = AppMetadataEntity.createAppMetadataEntity(this.clientId, env, serverTokenResponse.foci);
        }
        return new CacheRecord(cachedAccount, cachedIdToken, cachedAccessToken, cachedRefreshToken, cachedAppMetadata);
    };
    /**
     * Generate Account
     * @param serverTokenResponse
     * @param idToken
     * @param authority
     */
    ResponseHandler.prototype.generateAccountEntity = function (serverTokenResponse, idToken, authority, authCodePayload) {
        var authorityType = authority.authorityType;
        var cloudGraphHostName = authCodePayload ? authCodePayload.cloud_graph_host_name : Constants.EMPTY_STRING;
        var msGraphhost = authCodePayload ? authCodePayload.msgraph_host : Constants.EMPTY_STRING;
        // ADFS does not require client_info in the response
        if (authorityType === AuthorityType.Adfs) {
            this.logger.verbose("Authority type is ADFS, creating ADFS account");
            return AccountEntity.createGenericAccount(this.homeAccountIdentifier, idToken, authority, cloudGraphHostName, msGraphhost);
        }
        // This fallback applies to B2C as well as they fall under an AAD account type.
        if (StringUtils.isEmpty(serverTokenResponse.client_info) && authority.protocolMode === "AAD") {
            throw ClientAuthError.createClientInfoEmptyError();
        }
        return serverTokenResponse.client_info ?
            AccountEntity.createAccount(serverTokenResponse.client_info, this.homeAccountIdentifier, idToken, authority, cloudGraphHostName, msGraphhost) :
            AccountEntity.createGenericAccount(this.homeAccountIdentifier, idToken, authority, cloudGraphHostName, msGraphhost);
    };
    /**
     * Creates an @AuthenticationResult from @CacheRecord , @IdToken , and a boolean that states whether or not the result is from cache.
     *
     * Optionally takes a state string that is set as-is in the response.
     *
     * @param cacheRecord
     * @param idTokenObj
     * @param fromTokenCache
     * @param stateString
     */
    ResponseHandler.generateAuthenticationResult = function (cryptoObj, authority, cacheRecord, fromTokenCache, request, idTokenObj, requestState, code) {
        var _a, _b, _c;
        return __awaiter(this, void 0, void 0, function () {
            var accessToken, responseScopes, expiresOn, extExpiresOn, familyId, popTokenGenerator, _d, secret, keyId, uid, tid;
            return __generator(this, function (_e) {
                switch (_e.label) {
                    case 0:
                        accessToken = Constants.EMPTY_STRING;
                        responseScopes = [];
                        expiresOn = null;
                        familyId = Constants.EMPTY_STRING;
                        if (!cacheRecord.accessToken) return [3 /*break*/, 4];
                        if (!(cacheRecord.accessToken.tokenType === AuthenticationScheme.POP)) return [3 /*break*/, 2];
                        popTokenGenerator = new PopTokenGenerator(cryptoObj);
                        _d = cacheRecord.accessToken, secret = _d.secret, keyId = _d.keyId;
                        if (!keyId) {
                            throw ClientAuthError.createKeyIdMissingError();
                        }
                        return [4 /*yield*/, popTokenGenerator.signPopToken(secret, keyId, request)];
                    case 1:
                        accessToken = _e.sent();
                        return [3 /*break*/, 3];
                    case 2:
                        accessToken = cacheRecord.accessToken.secret;
                        _e.label = 3;
                    case 3:
                        responseScopes = ScopeSet.fromString(cacheRecord.accessToken.target).asArray();
                        expiresOn = new Date(Number(cacheRecord.accessToken.expiresOn) * 1000);
                        extExpiresOn = new Date(Number(cacheRecord.accessToken.extendedExpiresOn) * 1000);
                        _e.label = 4;
                    case 4:
                        if (cacheRecord.appMetadata) {
                            familyId = cacheRecord.appMetadata.familyId === THE_FAMILY_ID ? THE_FAMILY_ID : Constants.EMPTY_STRING;
                        }
                        uid = (idTokenObj === null || idTokenObj === void 0 ? void 0 : idTokenObj.claims.oid) || (idTokenObj === null || idTokenObj === void 0 ? void 0 : idTokenObj.claims.sub) || Constants.EMPTY_STRING;
                        tid = (idTokenObj === null || idTokenObj === void 0 ? void 0 : idTokenObj.claims.tid) || Constants.EMPTY_STRING;
                        return [2 /*return*/, {
                                authority: authority.canonicalAuthority,
                                uniqueId: uid,
                                tenantId: tid,
                                scopes: responseScopes,
                                account: cacheRecord.account ? cacheRecord.account.getAccountInfo() : null,
                                idToken: idTokenObj ? idTokenObj.rawToken : Constants.EMPTY_STRING,
                                idTokenClaims: idTokenObj ? idTokenObj.claims : {},
                                accessToken: accessToken,
                                fromCache: fromTokenCache,
                                expiresOn: expiresOn,
                                correlationId: request.correlationId,
                                extExpiresOn: extExpiresOn,
                                familyId: familyId,
                                tokenType: ((_a = cacheRecord.accessToken) === null || _a === void 0 ? void 0 : _a.tokenType) || Constants.EMPTY_STRING,
                                state: requestState ? requestState.userRequestState : Constants.EMPTY_STRING,
                                cloudGraphHostName: ((_b = cacheRecord.account) === null || _b === void 0 ? void 0 : _b.cloudGraphHostName) || Constants.EMPTY_STRING,
                                msGraphHost: ((_c = cacheRecord.account) === null || _c === void 0 ? void 0 : _c.msGraphHost) || Constants.EMPTY_STRING,
                                code: code,
                                fromNativeBroker: false
                            }];
                }
            });
        });
    };
    return ResponseHandler;
}());

export { ResponseHandler };
//# sourceMappingURL=ResponseHandler.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { ClientConfigurationError } from '../error/ClientConfigurationError.js';
import { HeaderNames, Constants } from '../utils/Constants.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * This is a helper class that parses supported HTTP response authentication headers to extract and return
 * header challenge values that can be used outside the basic authorization flows.
 */
var AuthenticationHeaderParser = /** @class */ (function () {
    function AuthenticationHeaderParser(headers) {
        this.headers = headers;
    }
    /**
     * This method parses the SHR nonce value out of either the Authentication-Info or WWW-Authenticate authentication headers.
     * @returns
     */
    AuthenticationHeaderParser.prototype.getShrNonce = function () {
        // Attempt to parse nonce from Authentiacation-Info
        var authenticationInfo = this.headers[HeaderNames.AuthenticationInfo];
        if (authenticationInfo) {
            var authenticationInfoChallenges = this.parseChallenges(authenticationInfo);
            if (authenticationInfoChallenges.nextnonce) {
                return authenticationInfoChallenges.nextnonce;
            }
            throw ClientConfigurationError.createInvalidAuthenticationHeaderError(HeaderNames.AuthenticationInfo, "nextnonce challenge is missing.");
        }
        // Attempt to parse nonce from WWW-Authenticate
        var wwwAuthenticate = this.headers[HeaderNames.WWWAuthenticate];
        if (wwwAuthenticate) {
            var wwwAuthenticateChallenges = this.parseChallenges(wwwAuthenticate);
            if (wwwAuthenticateChallenges.nonce) {
                return wwwAuthenticateChallenges.nonce;
            }
            throw ClientConfigurationError.createInvalidAuthenticationHeaderError(HeaderNames.WWWAuthenticate, "nonce challenge is missing.");
        }
        // If neither header is present, throw missing headers error
        throw ClientConfigurationError.createMissingNonceAuthenticationHeadersError();
    };
    /**
     * Parses an HTTP header's challenge set into a key/value map.
     * @param header
     * @returns
     */
    AuthenticationHeaderParser.prototype.parseChallenges = function (header) {
        var schemeSeparator = header.indexOf(" ");
        var challenges = header.substr(schemeSeparator + 1).split(",");
        var challengeMap = {};
        challenges.forEach(function (challenge) {
            var _a = challenge.split("="), key = _a[0], value = _a[1];
            // Remove escaped quotation marks (', ") from challenge string to keep only the challenge value
            challengeMap[key] = unescape(value.replace(/['"]+/g, Constants.EMPTY_STRING));
        });
        return challengeMap;
    };
    return AuthenticationHeaderParser;
}());

export { AuthenticationHeaderParser };
//# sourceMappingURL=AuthenticationHeaderParser.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __spreadArrays } from '../_virtual/_tslib.js';
import { AADServerParamKeys, Constants, ResponseMode, OIDC_DEFAULT_SCOPES, SSOTypes, HeaderNames, CLIENT_INFO, ClaimsRequestKeys, PasswordGrantConstants, AuthenticationScheme, ThrottlingConstants } from '../utils/Constants.js';
import { ScopeSet } from './ScopeSet.js';
import { ClientConfigurationError } from '../error/ClientConfigurationError.js';
import { RequestValidator } from './RequestValidator.js';
import { StringUtils } from '../utils/StringUtils.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var RequestParameterBuilder = /** @class */ (function () {
    function RequestParameterBuilder() {
        this.parameters = new Map();
    }
    /**
     * add response_type = code
     */
    RequestParameterBuilder.prototype.addResponseTypeCode = function () {
        this.parameters.set(AADServerParamKeys.RESPONSE_TYPE, encodeURIComponent(Constants.CODE_RESPONSE_TYPE));
    };
    /**
     * add response_type = token id_token
     */
    RequestParameterBuilder.prototype.addResponseTypeForTokenAndIdToken = function () {
        this.parameters.set(AADServerParamKeys.RESPONSE_TYPE, encodeURIComponent(Constants.TOKEN_RESPONSE_TYPE + " " + Constants.ID_TOKEN_RESPONSE_TYPE));
    };
    /**
     * add response_mode. defaults to query.
     * @param responseMode
     */
    RequestParameterBuilder.prototype.addResponseMode = function (responseMode) {
        this.parameters.set(AADServerParamKeys.RESPONSE_MODE, encodeURIComponent((responseMode) ? responseMode : ResponseMode.QUERY));
    };
    /**
     * Add flag to indicate STS should attempt to use WAM if available
     */
    RequestParameterBuilder.prototype.addNativeBroker = function () {
        this.parameters.set(AADServerParamKeys.NATIVE_BROKER, encodeURIComponent("1"));
    };
    /**
     * add scopes. set addOidcScopes to false to prevent default scopes in non-user scenarios
     * @param scopeSet
     * @param addOidcScopes
     */
    RequestParameterBuilder.prototype.addScopes = function (scopes, addOidcScopes) {
        if (addOidcScopes === void 0) { addOidcScopes = true; }
        var requestScopes = addOidcScopes ? __spreadArrays(scopes || [], OIDC_DEFAULT_SCOPES) : scopes || [];
        var scopeSet = new ScopeSet(requestScopes);
        this.parameters.set(AADServerParamKeys.SCOPE, encodeURIComponent(scopeSet.printScopes()));
    };
    /**
     * add clientId
     * @param clientId
     */
    RequestParameterBuilder.prototype.addClientId = function (clientId) {
        this.parameters.set(AADServerParamKeys.CLIENT_ID, encodeURIComponent(clientId));
    };
    /**
     * add redirect_uri
     * @param redirectUri
     */
    RequestParameterBuilder.prototype.addRedirectUri = function (redirectUri) {
        RequestValidator.validateRedirectUri(redirectUri);
        this.parameters.set(AADServerParamKeys.REDIRECT_URI, encodeURIComponent(redirectUri));
    };
    /**
     * add post logout redirectUri
     * @param redirectUri
     */
    RequestParameterBuilder.prototype.addPostLogoutRedirectUri = function (redirectUri) {
        RequestValidator.validateRedirectUri(redirectUri);
        this.parameters.set(AADServerParamKeys.POST_LOGOUT_URI, encodeURIComponent(redirectUri));
    };
    /**
     * add id_token_hint to logout request
     * @param idTokenHint
     */
    RequestParameterBuilder.prototype.addIdTokenHint = function (idTokenHint) {
        this.parameters.set(AADServerParamKeys.ID_TOKEN_HINT, encodeURIComponent(idTokenHint));
    };
    /**
     * add domain_hint
     * @param domainHint
     */
    RequestParameterBuilder.prototype.addDomainHint = function (domainHint) {
        this.parameters.set(SSOTypes.DOMAIN_HINT, encodeURIComponent(domainHint));
    };
    /**
     * add login_hint
     * @param loginHint
     */
    RequestParameterBuilder.prototype.addLoginHint = function (loginHint) {
        this.parameters.set(SSOTypes.LOGIN_HINT, encodeURIComponent(loginHint));
    };
    /**
     * Adds the CCS (Cache Credential Service) query parameter for login_hint
     * @param loginHint
     */
    RequestParameterBuilder.prototype.addCcsUpn = function (loginHint) {
        this.parameters.set(HeaderNames.CCS_HEADER, encodeURIComponent("UPN:" + loginHint));
    };
    /**
     * Adds the CCS (Cache Credential Service) query parameter for account object
     * @param loginHint
     */
    RequestParameterBuilder.prototype.addCcsOid = function (clientInfo) {
        this.parameters.set(HeaderNames.CCS_HEADER, encodeURIComponent("Oid:" + clientInfo.uid + "@" + clientInfo.utid));
    };
    /**
     * add sid
     * @param sid
     */
    RequestParameterBuilder.prototype.addSid = function (sid) {
        this.parameters.set(SSOTypes.SID, encodeURIComponent(sid));
    };
    /**
     * add claims
     * @param claims
     */
    RequestParameterBuilder.prototype.addClaims = function (claims, clientCapabilities) {
        var mergedClaims = this.addClientCapabilitiesToClaims(claims, clientCapabilities);
        RequestValidator.validateClaims(mergedClaims);
        this.parameters.set(AADServerParamKeys.CLAIMS, encodeURIComponent(mergedClaims));
    };
    /**
     * add correlationId
     * @param correlationId
     */
    RequestParameterBuilder.prototype.addCorrelationId = function (correlationId) {
        this.parameters.set(AADServerParamKeys.CLIENT_REQUEST_ID, encodeURIComponent(correlationId));
    };
    /**
     * add library info query params
     * @param libraryInfo
     */
    RequestParameterBuilder.prototype.addLibraryInfo = function (libraryInfo) {
        // Telemetry Info
        this.parameters.set(AADServerParamKeys.X_CLIENT_SKU, libraryInfo.sku);
        this.parameters.set(AADServerParamKeys.X_CLIENT_VER, libraryInfo.version);
        if (libraryInfo.os) {
            this.parameters.set(AADServerParamKeys.X_CLIENT_OS, libraryInfo.os);
        }
        if (libraryInfo.cpu) {
            this.parameters.set(AADServerParamKeys.X_CLIENT_CPU, libraryInfo.cpu);
        }
    };
    /**
     * Add client telemetry parameters
     * @param appTelemetry
     */
    RequestParameterBuilder.prototype.addApplicationTelemetry = function (appTelemetry) {
        if (appTelemetry === null || appTelemetry === void 0 ? void 0 : appTelemetry.appName) {
            this.parameters.set(AADServerParamKeys.X_APP_NAME, appTelemetry.appName);
        }
        if (appTelemetry === null || appTelemetry === void 0 ? void 0 : appTelemetry.appVersion) {
            this.parameters.set(AADServerParamKeys.X_APP_VER, appTelemetry.appVersion);
        }
    };
    /**
     * add prompt
     * @param prompt
     */
    RequestParameterBuilder.prototype.addPrompt = function (prompt) {
        RequestValidator.validatePrompt(prompt);
        this.parameters.set("" + AADServerParamKeys.PROMPT, encodeURIComponent(prompt));
    };
    /**
     * add state
     * @param state
     */
    RequestParameterBuilder.prototype.addState = function (state) {
        if (!StringUtils.isEmpty(state)) {
            this.parameters.set(AADServerParamKeys.STATE, encodeURIComponent(state));
        }
    };
    /**
     * add nonce
     * @param nonce
     */
    RequestParameterBuilder.prototype.addNonce = function (nonce) {
        this.parameters.set(AADServerParamKeys.NONCE, encodeURIComponent(nonce));
    };
    /**
     * add code_challenge and code_challenge_method
     * - throw if either of them are not passed
     * @param codeChallenge
     * @param codeChallengeMethod
     */
    RequestParameterBuilder.prototype.addCodeChallengeParams = function (codeChallenge, codeChallengeMethod) {
        RequestValidator.validateCodeChallengeParams(codeChallenge, codeChallengeMethod);
        if (codeChallenge && codeChallengeMethod) {
            this.parameters.set(AADServerParamKeys.CODE_CHALLENGE, encodeURIComponent(codeChallenge));
            this.parameters.set(AADServerParamKeys.CODE_CHALLENGE_METHOD, encodeURIComponent(codeChallengeMethod));
        }
        else {
            throw ClientConfigurationError.createInvalidCodeChallengeParamsError();
        }
    };
    /**
     * add the `authorization_code` passed by the user to exchange for a token
     * @param code
     */
    RequestParameterBuilder.prototype.addAuthorizationCode = function (code) {
        this.parameters.set(AADServerParamKeys.CODE, encodeURIComponent(code));
    };
    /**
     * add the `authorization_code` passed by the user to exchange for a token
     * @param code
     */
    RequestParameterBuilder.prototype.addDeviceCode = function (code) {
        this.parameters.set(AADServerParamKeys.DEVICE_CODE, encodeURIComponent(code));
    };
    /**
     * add the `refreshToken` passed by the user
     * @param refreshToken
     */
    RequestParameterBuilder.prototype.addRefreshToken = function (refreshToken) {
        this.parameters.set(AADServerParamKeys.REFRESH_TOKEN, encodeURIComponent(refreshToken));
    };
    /**
     * add the `code_verifier` passed by the user to exchange for a token
     * @param codeVerifier
     */
    RequestParameterBuilder.prototype.addCodeVerifier = function (codeVerifier) {
        this.parameters.set(AADServerParamKeys.CODE_VERIFIER, encodeURIComponent(codeVerifier));
    };
    /**
     * add client_secret
     * @param clientSecret
     */
    RequestParameterBuilder.prototype.addClientSecret = function (clientSecret) {
        this.parameters.set(AADServerParamKeys.CLIENT_SECRET, encodeURIComponent(clientSecret));
    };
    /**
     * add clientAssertion for confidential client flows
     * @param clientAssertion
     */
    RequestParameterBuilder.prototype.addClientAssertion = function (clientAssertion) {
        if (!StringUtils.isEmpty(clientAssertion)) {
            this.parameters.set(AADServerParamKeys.CLIENT_ASSERTION, encodeURIComponent(clientAssertion));
        }
    };
    /**
     * add clientAssertionType for confidential client flows
     * @param clientAssertionType
     */
    RequestParameterBuilder.prototype.addClientAssertionType = function (clientAssertionType) {
        if (!StringUtils.isEmpty(clientAssertionType)) {
            this.parameters.set(AADServerParamKeys.CLIENT_ASSERTION_TYPE, encodeURIComponent(clientAssertionType));
        }
    };
    /**
     * add OBO assertion for confidential client flows
     * @param clientAssertion
     */
    RequestParameterBuilder.prototype.addOboAssertion = function (oboAssertion) {
        this.parameters.set(AADServerParamKeys.OBO_ASSERTION, encodeURIComponent(oboAssertion));
    };
    /**
     * add grant type
     * @param grantType
     */
    RequestParameterBuilder.prototype.addRequestTokenUse = function (tokenUse) {
        this.parameters.set(AADServerParamKeys.REQUESTED_TOKEN_USE, encodeURIComponent(tokenUse));
    };
    /**
     * add grant type
     * @param grantType
     */
    RequestParameterBuilder.prototype.addGrantType = function (grantType) {
        this.parameters.set(AADServerParamKeys.GRANT_TYPE, encodeURIComponent(grantType));
    };
    /**
     * add client info
     *
     */
    RequestParameterBuilder.prototype.addClientInfo = function () {
        this.parameters.set(CLIENT_INFO, "1");
    };
    /**
     * add extraQueryParams
     * @param eQparams
     */
    RequestParameterBuilder.prototype.addExtraQueryParameters = function (eQparams) {
        var _this = this;
        RequestValidator.sanitizeEQParams(eQparams, this.parameters);
        Object.keys(eQparams).forEach(function (key) {
            _this.parameters.set(key, eQparams[key]);
        });
    };
    RequestParameterBuilder.prototype.addClientCapabilitiesToClaims = function (claims, clientCapabilities) {
        var mergedClaims;
        // Parse provided claims into JSON object or initialize empty object
        if (!claims) {
            mergedClaims = {};
        }
        else {
            try {
                mergedClaims = JSON.parse(claims);
            }
            catch (e) {
                throw ClientConfigurationError.createInvalidClaimsRequestError();
            }
        }
        if (clientCapabilities && clientCapabilities.length > 0) {
            if (!mergedClaims.hasOwnProperty(ClaimsRequestKeys.ACCESS_TOKEN)) {
                // Add access_token key to claims object
                mergedClaims[ClaimsRequestKeys.ACCESS_TOKEN] = {};
            }
            // Add xms_cc claim with provided clientCapabilities to access_token key
            mergedClaims[ClaimsRequestKeys.ACCESS_TOKEN][ClaimsRequestKeys.XMS_CC] = {
                values: clientCapabilities
            };
        }
        return JSON.stringify(mergedClaims);
    };
    /**
     * adds `username` for Password Grant flow
     * @param username
     */
    RequestParameterBuilder.prototype.addUsername = function (username) {
        this.parameters.set(PasswordGrantConstants.username, encodeURIComponent(username));
    };
    /**
     * adds `password` for Password Grant flow
     * @param password
     */
    RequestParameterBuilder.prototype.addPassword = function (password) {
        this.parameters.set(PasswordGrantConstants.password, encodeURIComponent(password));
    };
    /**
     * add pop_jwk to query params
     * @param cnfString
     */
    RequestParameterBuilder.prototype.addPopToken = function (cnfString) {
        if (!StringUtils.isEmpty(cnfString)) {
            this.parameters.set(AADServerParamKeys.TOKEN_TYPE, AuthenticationScheme.POP);
            this.parameters.set(AADServerParamKeys.REQ_CNF, encodeURIComponent(cnfString));
        }
    };
    /**
     * add SSH JWK and key ID to query params
     */
    RequestParameterBuilder.prototype.addSshJwk = function (sshJwkString) {
        if (!StringUtils.isEmpty(sshJwkString)) {
            this.parameters.set(AADServerParamKeys.TOKEN_TYPE, AuthenticationScheme.SSH);
            this.parameters.set(AADServerParamKeys.REQ_CNF, encodeURIComponent(sshJwkString));
        }
    };
    /**
     * add server telemetry fields
     * @param serverTelemetryManager
     */
    RequestParameterBuilder.prototype.addServerTelemetry = function (serverTelemetryManager) {
        this.parameters.set(AADServerParamKeys.X_CLIENT_CURR_TELEM, serverTelemetryManager.generateCurrentRequestHeaderValue());
        this.parameters.set(AADServerParamKeys.X_CLIENT_LAST_TELEM, serverTelemetryManager.generateLastRequestHeaderValue());
    };
    /**
     * Adds parameter that indicates to the server that throttling is supported
     */
    RequestParameterBuilder.prototype.addThrottling = function () {
        this.parameters.set(AADServerParamKeys.X_MS_LIB_CAPABILITY, ThrottlingConstants.X_MS_LIB_CAPABILITY_VALUE);
    };
    /**
     * Adds logout_hint parameter for "silent" logout which prevent server account picker
     */
    RequestParameterBuilder.prototype.addLogoutHint = function (logoutHint) {
        this.parameters.set(AADServerParamKeys.LOGOUT_HINT, encodeURIComponent(logoutHint));
    };
    /**
     * Utility to create a URL from the params map
     */
    RequestParameterBuilder.prototype.createQueryString = function () {
        var queryParameterArray = new Array();
        this.parameters.forEach(function (value, key) {
            queryParameterArray.push(key + "=" + value);
        });
        return queryParameterArray.join("&");
    };
    return RequestParameterBuilder;
}());

export { RequestParameterBuilder };
//# sourceMappingURL=RequestParameterBuilder.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { StringUtils } from '../utils/StringUtils.js';
import { ClientConfigurationError } from '../error/ClientConfigurationError.js';
import { CodeChallengeMethodValues, PromptValue } from '../utils/Constants.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Validates server consumable params from the "request" objects
 */
var RequestValidator = /** @class */ (function () {
    function RequestValidator() {
    }
    /**
     * Utility to check if the `redirectUri` in the request is a non-null value
     * @param redirectUri
     */
    RequestValidator.validateRedirectUri = function (redirectUri) {
        if (StringUtils.isEmpty(redirectUri)) {
            throw ClientConfigurationError.createRedirectUriEmptyError();
        }
    };
    /**
     * Utility to validate prompt sent by the user in the request
     * @param prompt
     */
    RequestValidator.validatePrompt = function (prompt) {
        var promptValues = [];
        for (var value in PromptValue) {
            promptValues.push(PromptValue[value]);
        }
        if (promptValues.indexOf(prompt) < 0) {
            throw ClientConfigurationError.createInvalidPromptError(prompt);
        }
    };
    RequestValidator.validateClaims = function (claims) {
        try {
            JSON.parse(claims);
        }
        catch (e) {
            throw ClientConfigurationError.createInvalidClaimsRequestError();
        }
    };
    /**
     * Utility to validate code_challenge and code_challenge_method
     * @param codeChallenge
     * @param codeChallengeMethod
     */
    RequestValidator.validateCodeChallengeParams = function (codeChallenge, codeChallengeMethod) {
        if (StringUtils.isEmpty(codeChallenge) || StringUtils.isEmpty(codeChallengeMethod)) {
            throw ClientConfigurationError.createInvalidCodeChallengeParamsError();
        }
        else {
            this.validateCodeChallengeMethod(codeChallengeMethod);
        }
    };
    /**
     * Utility to validate code_challenge_method
     * @param codeChallengeMethod
     */
    RequestValidator.validateCodeChallengeMethod = function (codeChallengeMethod) {
        if ([
            CodeChallengeMethodValues.PLAIN,
            CodeChallengeMethodValues.S256
        ].indexOf(codeChallengeMethod) < 0) {
            throw ClientConfigurationError.createInvalidCodeChallengeMethodError();
        }
    };
    /**
     * Removes unnecessary or duplicate query parameters from extraQueryParameters
     * @param request
     */
    RequestValidator.sanitizeEQParams = function (eQParams, queryParams) {
        if (!eQParams) {
            return {};
        }
        // Remove any query parameters already included in SSO params
        queryParams.forEach(function (value, key) {
            if (eQParams[key]) {
                delete eQParams[key];
            }
        });
        return eQParams;
    };
    return RequestValidator;
}());

export { RequestValidator };
//# sourceMappingURL=RequestValidator.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __spreadArrays } from '../_virtual/_tslib.js';
import { ClientConfigurationError } from '../error/ClientConfigurationError.js';
import { StringUtils } from '../utils/StringUtils.js';
import { ClientAuthError } from '../error/ClientAuthError.js';
import { OIDC_SCOPES, Constants } from '../utils/Constants.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * The ScopeSet class creates a set of scopes. Scopes are case-insensitive, unique values, so the Set object in JS makes
 * the most sense to implement for this class. All scopes are trimmed and converted to lower case strings in intersection and union functions
 * to ensure uniqueness of strings.
 */
var ScopeSet = /** @class */ (function () {
    function ScopeSet(inputScopes) {
        var _this = this;
        // Filter empty string and null/undefined array items
        var scopeArr = inputScopes ? StringUtils.trimArrayEntries(__spreadArrays(inputScopes)) : [];
        var filteredInput = scopeArr ? StringUtils.removeEmptyStringsFromArray(scopeArr) : [];
        // Validate and filter scopes (validate function throws if validation fails)
        this.validateInputScopes(filteredInput);
        this.scopes = new Set(); // Iterator in constructor not supported by IE11
        filteredInput.forEach(function (scope) { return _this.scopes.add(scope); });
    }
    /**
     * Factory method to create ScopeSet from space-delimited string
     * @param inputScopeString
     * @param appClientId
     * @param scopesRequired
     */
    ScopeSet.fromString = function (inputScopeString) {
        var scopeString = inputScopeString || Constants.EMPTY_STRING;
        var inputScopes = scopeString.split(" ");
        return new ScopeSet(inputScopes);
    };
    /**
     * Used to validate the scopes input parameter requested  by the developer.
     * @param {Array<string>} inputScopes - Developer requested permissions. Not all scopes are guaranteed to be included in the access token returned.
     * @param {boolean} scopesRequired - Boolean indicating whether the scopes array is required or not
     */
    ScopeSet.prototype.validateInputScopes = function (inputScopes) {
        // Check if scopes are required but not given or is an empty array
        if (!inputScopes || inputScopes.length < 1) {
            throw ClientConfigurationError.createEmptyScopesArrayError();
        }
    };
    /**
     * Check if a given scope is present in this set of scopes.
     * @param scope
     */
    ScopeSet.prototype.containsScope = function (scope) {
        var lowerCaseScopes = this.printScopesLowerCase().split(" ");
        var lowerCaseScopesSet = new ScopeSet(lowerCaseScopes);
        // compare lowercase scopes
        return !StringUtils.isEmpty(scope) ? lowerCaseScopesSet.scopes.has(scope.toLowerCase()) : false;
    };
    /**
     * Check if a set of scopes is present in this set of scopes.
     * @param scopeSet
     */
    ScopeSet.prototype.containsScopeSet = function (scopeSet) {
        var _this = this;
        if (!scopeSet || scopeSet.scopes.size <= 0) {
            return false;
        }
        return (this.scopes.size >= scopeSet.scopes.size && scopeSet.asArray().every(function (scope) { return _this.containsScope(scope); }));
    };
    /**
     * Check if set of scopes contains only the defaults
     */
    ScopeSet.prototype.containsOnlyOIDCScopes = function () {
        var _this = this;
        var defaultScopeCount = 0;
        OIDC_SCOPES.forEach(function (defaultScope) {
            if (_this.containsScope(defaultScope)) {
                defaultScopeCount += 1;
            }
        });
        return this.scopes.size === defaultScopeCount;
    };
    /**
     * Appends single scope if passed
     * @param newScope
     */
    ScopeSet.prototype.appendScope = function (newScope) {
        if (!StringUtils.isEmpty(newScope)) {
            this.scopes.add(newScope.trim());
        }
    };
    /**
     * Appends multiple scopes if passed
     * @param newScopes
     */
    ScopeSet.prototype.appendScopes = function (newScopes) {
        var _this = this;
        try {
            newScopes.forEach(function (newScope) { return _this.appendScope(newScope); });
        }
        catch (e) {
            throw ClientAuthError.createAppendScopeSetError(e);
        }
    };
    /**
     * Removes element from set of scopes.
     * @param scope
     */
    ScopeSet.prototype.removeScope = function (scope) {
        if (StringUtils.isEmpty(scope)) {
            throw ClientAuthError.createRemoveEmptyScopeFromSetError(scope);
        }
        this.scopes.delete(scope.trim());
    };
    /**
     * Removes default scopes from set of scopes
     * Primarily used to prevent cache misses if the default scopes are not returned from the server
     */
    ScopeSet.prototype.removeOIDCScopes = function () {
        var _this = this;
        OIDC_SCOPES.forEach(function (defaultScope) {
            _this.scopes.delete(defaultScope);
        });
    };
    /**
     * Combines an array of scopes with the current set of scopes.
     * @param otherScopes
     */
    ScopeSet.prototype.unionScopeSets = function (otherScopes) {
        if (!otherScopes) {
            throw ClientAuthError.createEmptyInputScopeSetError();
        }
        var unionScopes = new Set(); // Iterator in constructor not supported in IE11
        otherScopes.scopes.forEach(function (scope) { return unionScopes.add(scope.toLowerCase()); });
        this.scopes.forEach(function (scope) { return unionScopes.add(scope.toLowerCase()); });
        return unionScopes;
    };
    /**
     * Check if scopes intersect between this set and another.
     * @param otherScopes
     */
    ScopeSet.prototype.intersectingScopeSets = function (otherScopes) {
        if (!otherScopes) {
            throw ClientAuthError.createEmptyInputScopeSetError();
        }
        // Do not allow OIDC scopes to be the only intersecting scopes
        if (!otherScopes.containsOnlyOIDCScopes()) {
            otherScopes.removeOIDCScopes();
        }
        var unionScopes = this.unionScopeSets(otherScopes);
        var sizeOtherScopes = otherScopes.getScopeCount();
        var sizeThisScopes = this.getScopeCount();
        var sizeUnionScopes = unionScopes.size;
        return sizeUnionScopes < (sizeThisScopes + sizeOtherScopes);
    };
    /**
     * Returns size of set of scopes.
     */
    ScopeSet.prototype.getScopeCount = function () {
        return this.scopes.size;
    };
    /**
     * Returns the scopes as an array of string values
     */
    ScopeSet.prototype.asArray = function () {
        var array = [];
        this.scopes.forEach(function (val) { return array.push(val); });
        return array;
    };
    /**
     * Prints scopes into a space-delimited string
     */
    ScopeSet.prototype.printScopes = function () {
        if (this.scopes) {
            var scopeArr = this.asArray();
            return scopeArr.join(" ");
        }
        return Constants.EMPTY_STRING;
    };
    /**
     * Prints scopes into a space-delimited lower-case string (used for caching)
     */
    ScopeSet.prototype.printScopesLowerCase = function () {
        return this.printScopes().toLowerCase();
    };
    return ScopeSet;
}());

export { ScopeSet };
//# sourceMappingURL=ScopeSet.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { AuthError } from '../error/AuthError.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var StubbedNetworkModule = {
    sendGetRequestAsync: function () {
        var notImplErr = "Network interface - sendGetRequestAsync() has not been implemented for the Network interface.";
        return Promise.reject(AuthError.createUnexpectedError(notImplErr));
    },
    sendPostRequestAsync: function () {
        var notImplErr = "Network interface - sendPostRequestAsync() has not been implemented for the Network interface.";
        return Promise.reject(AuthError.createUnexpectedError(notImplErr));
    }
};

export { StubbedNetworkModule };
//# sourceMappingURL=INetworkModule.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __awaiter, __generator } from '../_virtual/_tslib.js';
import { ThrottlingUtils } from './ThrottlingUtils.js';
import { ClientAuthError } from '../error/ClientAuthError.js';
import { AuthError } from '../error/AuthError.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var NetworkManager = /** @class */ (function () {
    function NetworkManager(networkClient, cacheManager) {
        this.networkClient = networkClient;
        this.cacheManager = cacheManager;
    }
    /**
     * Wraps sendPostRequestAsync with necessary preflight and postflight logic
     * @param thumbprint
     * @param tokenEndpoint
     * @param options
     */
    NetworkManager.prototype.sendPostRequest = function (thumbprint, tokenEndpoint, options) {
        return __awaiter(this, void 0, void 0, function () {
            var response, e_1;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        ThrottlingUtils.preProcess(this.cacheManager, thumbprint);
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        return [4 /*yield*/, this.networkClient.sendPostRequestAsync(tokenEndpoint, options)];
                    case 2:
                        response = _a.sent();
                        return [3 /*break*/, 4];
                    case 3:
                        e_1 = _a.sent();
                        if (e_1 instanceof AuthError) {
                            throw e_1;
                        }
                        else {
                            throw ClientAuthError.createNetworkError(tokenEndpoint, e_1);
                        }
                    case 4:
                        ThrottlingUtils.postProcess(this.cacheManager, thumbprint, response);
                        return [2 /*return*/, response];
                }
            });
        });
    };
    return NetworkManager;
}());

export { NetworkManager };
//# sourceMappingURL=NetworkManager.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { ThrottlingConstants, CacheSchemaType, Constants, HeaderNames } from '../utils/Constants.js';
import { ServerError } from '../error/ServerError.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var ThrottlingUtils = /** @class */ (function () {
    function ThrottlingUtils() {
    }
    /**
     * Prepares a RequestThumbprint to be stored as a key.
     * @param thumbprint
     */
    ThrottlingUtils.generateThrottlingStorageKey = function (thumbprint) {
        return ThrottlingConstants.THROTTLING_PREFIX + "." + JSON.stringify(thumbprint);
    };
    /**
     * Performs necessary throttling checks before a network request.
     * @param cacheManager
     * @param thumbprint
     */
    ThrottlingUtils.preProcess = function (cacheManager, thumbprint) {
        var _a;
        var key = ThrottlingUtils.generateThrottlingStorageKey(thumbprint);
        var value = cacheManager.getThrottlingCache(key);
        if (value) {
            if (value.throttleTime < Date.now()) {
                cacheManager.removeItem(key, CacheSchemaType.THROTTLING);
                return;
            }
            throw new ServerError(((_a = value.errorCodes) === null || _a === void 0 ? void 0 : _a.join(" ")) || Constants.EMPTY_STRING, value.errorMessage, value.subError);
        }
    };
    /**
     * Performs necessary throttling checks after a network request.
     * @param cacheManager
     * @param thumbprint
     * @param response
     */
    ThrottlingUtils.postProcess = function (cacheManager, thumbprint, response) {
        if (ThrottlingUtils.checkResponseStatus(response) || ThrottlingUtils.checkResponseForRetryAfter(response)) {
            var thumbprintValue = {
                throttleTime: ThrottlingUtils.calculateThrottleTime(parseInt(response.headers[HeaderNames.RETRY_AFTER])),
                error: response.body.error,
                errorCodes: response.body.error_codes,
                errorMessage: response.body.error_description,
                subError: response.body.suberror
            };
            cacheManager.setThrottlingCache(ThrottlingUtils.generateThrottlingStorageKey(thumbprint), thumbprintValue);
        }
    };
    /**
     * Checks a NetworkResponse object's status codes against 429 or 5xx
     * @param response
     */
    ThrottlingUtils.checkResponseStatus = function (response) {
        return response.status === 429 || response.status >= 500 && response.status < 600;
    };
    /**
     * Checks a NetworkResponse object's RetryAfter header
     * @param response
     */
    ThrottlingUtils.checkResponseForRetryAfter = function (response) {
        if (response.headers) {
            return response.headers.hasOwnProperty(HeaderNames.RETRY_AFTER) && (response.status < 200 || response.status >= 300);
        }
        return false;
    };
    /**
     * Calculates the Unix-time value for a throttle to expire given throttleTime in seconds.
     * @param throttleTime
     */
    ThrottlingUtils.calculateThrottleTime = function (throttleTime) {
        var time = throttleTime <= 0 ? 0 : throttleTime;
        var currentSeconds = Date.now() / 1000;
        return Math.floor(Math.min(currentSeconds + (time || ThrottlingConstants.DEFAULT_THROTTLE_TIME_SECONDS), currentSeconds + ThrottlingConstants.DEFAULT_MAX_THROTTLE_TIME_SECONDS) * 1000);
    };
    ThrottlingUtils.removeThrottle = function (cacheManager, clientId, request, homeAccountIdentifier) {
        var thumbprint = {
            clientId: clientId,
            authority: request.authority,
            scopes: request.scopes,
            homeAccountIdentifier: homeAccountIdentifier,
            claims: request.claims,
            authenticationScheme: request.authenticationScheme,
            resourceRequestMethod: request.resourceRequestMethod,
            resourceRequestUri: request.resourceRequestUri,
            shrClaims: request.shrClaims,
            sshKid: request.sshKid
        };
        var key = this.generateThrottlingStorageKey(thumbprint);
        return cacheManager.removeItem(key, CacheSchemaType.THROTTLING);
    };
    return ThrottlingUtils;
}());

export { ThrottlingUtils };
//# sourceMappingURL=ThrottlingUtils.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { StringUtils } from '../utils/StringUtils.js';
import { Constants } from '../utils/Constants.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Log message level.
 */
var LogLevel;
(function (LogLevel) {
    LogLevel[LogLevel["Error"] = 0] = "Error";
    LogLevel[LogLevel["Warning"] = 1] = "Warning";
    LogLevel[LogLevel["Info"] = 2] = "Info";
    LogLevel[LogLevel["Verbose"] = 3] = "Verbose";
    LogLevel[LogLevel["Trace"] = 4] = "Trace";
})(LogLevel || (LogLevel = {}));
/**
 * Class which facilitates logging of messages to a specific place.
 */
var Logger = /** @class */ (function () {
    function Logger(loggerOptions, packageName, packageVersion) {
        // Current log level, defaults to info.
        this.level = LogLevel.Info;
        var defaultLoggerCallback = function () {
            return;
        };
        this.localCallback = loggerOptions.loggerCallback || defaultLoggerCallback;
        this.piiLoggingEnabled = loggerOptions.piiLoggingEnabled || false;
        this.level = typeof (loggerOptions.logLevel) === "number" ? loggerOptions.logLevel : LogLevel.Info;
        this.correlationId = loggerOptions.correlationId || Constants.EMPTY_STRING;
        this.packageName = packageName || Constants.EMPTY_STRING;
        this.packageVersion = packageVersion || Constants.EMPTY_STRING;
    }
    /**
     * Create new Logger with existing configurations.
     */
    Logger.prototype.clone = function (packageName, packageVersion, correlationId) {
        return new Logger({ loggerCallback: this.localCallback, piiLoggingEnabled: this.piiLoggingEnabled, logLevel: this.level, correlationId: correlationId || this.correlationId }, packageName, packageVersion);
    };
    /**
     * Log message with required options.
     */
    Logger.prototype.logMessage = function (logMessage, options) {
        if ((options.logLevel > this.level) || (!this.piiLoggingEnabled && options.containsPii)) {
            return;
        }
        var timestamp = new Date().toUTCString();
        // Add correlationId to logs if set, correlationId provided on log messages take precedence
        var logHeader;
        if (!StringUtils.isEmpty(options.correlationId)) {
            logHeader = "[" + timestamp + "] : [" + options.correlationId + "]";
        }
        else if (!StringUtils.isEmpty(this.correlationId)) {
            logHeader = "[" + timestamp + "] : [" + this.correlationId + "]";
        }
        else {
            logHeader = "[" + timestamp + "]";
        }
        var log = logHeader + " : " + this.packageName + "@" + this.packageVersion + " : " + LogLevel[options.logLevel] + " - " + logMessage;
        // debug(`msal:${LogLevel[options.logLevel]}${options.containsPii ? "-Pii": Constants.EMPTY_STRING}${options.context ? `:${options.context}` : Constants.EMPTY_STRING}`)(logMessage);
        this.executeCallback(options.logLevel, log, options.containsPii || false);
    };
    /**
     * Execute callback with message.
     */
    Logger.prototype.executeCallback = function (level, message, containsPii) {
        if (this.localCallback) {
            this.localCallback(level, message, containsPii);
        }
    };
    /**
     * Logs error messages.
     */
    Logger.prototype.error = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: LogLevel.Error,
            containsPii: false,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Logs error messages with PII.
     */
    Logger.prototype.errorPii = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: LogLevel.Error,
            containsPii: true,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Logs warning messages.
     */
    Logger.prototype.warning = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: LogLevel.Warning,
            containsPii: false,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Logs warning messages with PII.
     */
    Logger.prototype.warningPii = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: LogLevel.Warning,
            containsPii: true,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Logs info messages.
     */
    Logger.prototype.info = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: LogLevel.Info,
            containsPii: false,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Logs info messages with PII.
     */
    Logger.prototype.infoPii = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: LogLevel.Info,
            containsPii: true,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Logs verbose messages.
     */
    Logger.prototype.verbose = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: LogLevel.Verbose,
            containsPii: false,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Logs verbose messages with PII.
     */
    Logger.prototype.verbosePii = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: LogLevel.Verbose,
            containsPii: true,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Logs trace messages.
     */
    Logger.prototype.trace = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: LogLevel.Trace,
            containsPii: false,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Logs trace messages with PII.
     */
    Logger.prototype.tracePii = function (message, correlationId) {
        this.logMessage(message, {
            logLevel: LogLevel.Trace,
            containsPii: true,
            correlationId: correlationId || Constants.EMPTY_STRING
        });
    };
    /**
     * Returns whether PII Logging is enabled or not.
     */
    Logger.prototype.isPiiLoggingEnabled = function () {
        return this.piiLoggingEnabled || false;
    };
    return Logger;
}());

export { LogLevel, Logger };
//# sourceMappingURL=Logger.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __extends } from '../_virtual/_tslib.js';
import { Constants } from '../utils/Constants.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * AuthErrorMessage class containing string constants used by error codes and messages.
 */
var AuthErrorMessage = {
    unexpectedError: {
        code: "unexpected_error",
        desc: "Unexpected error in authentication."
    },
    postRequestFailed: {
        code: "post_request_failed",
        desc: "Post request failed from the network, could be a 4xx/5xx or a network unavailability. Please check the exact error code for details."
    }
};
/**
 * General error class thrown by the MSAL.js library.
 */
var AuthError = /** @class */ (function (_super) {
    __extends(AuthError, _super);
    function AuthError(errorCode, errorMessage, suberror) {
        var _this = this;
        var errorString = errorMessage ? errorCode + ": " + errorMessage : errorCode;
        _this = _super.call(this, errorString) || this;
        Object.setPrototypeOf(_this, AuthError.prototype);
        _this.errorCode = errorCode || Constants.EMPTY_STRING;
        _this.errorMessage = errorMessage || Constants.EMPTY_STRING;
        _this.subError = suberror || Constants.EMPTY_STRING;
        _this.name = "AuthError";
        return _this;
    }
    AuthError.prototype.setCorrelationId = function (correlationId) {
        this.correlationId = correlationId;
    };
    /**
     * Creates an error that is thrown when something unexpected happens in the library.
     * @param errDesc
     */
    AuthError.createUnexpectedError = function (errDesc) {
        return new AuthError(AuthErrorMessage.unexpectedError.code, AuthErrorMessage.unexpectedError.desc + ": " + errDesc);
    };
    /**
     * Creates an error for post request failures.
     * @param errDesc
     * @returns
     */
    AuthError.createPostRequestFailed = function (errDesc) {
        return new AuthError(AuthErrorMessage.postRequestFailed.code, AuthErrorMessage.postRequestFailed.desc + ": " + errDesc);
    };
    return AuthError;
}(Error));

export { AuthError, AuthErrorMessage };
//# sourceMappingURL=AuthError.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __extends } from '../_virtual/_tslib.js';
import { AuthError } from './AuthError.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * ClientAuthErrorMessage class containing string constants used by error codes and messages.
 */
var ClientAuthErrorMessage = {
    clientInfoDecodingError: {
        code: "client_info_decoding_error",
        desc: "The client info could not be parsed/decoded correctly. Please review the trace to determine the root cause."
    },
    clientInfoEmptyError: {
        code: "client_info_empty_error",
        desc: "The client info was empty. Please review the trace to determine the root cause."
    },
    tokenParsingError: {
        code: "token_parsing_error",
        desc: "Token cannot be parsed. Please review stack trace to determine root cause."
    },
    nullOrEmptyToken: {
        code: "null_or_empty_token",
        desc: "The token is null or empty. Please review the trace to determine the root cause."
    },
    endpointResolutionError: {
        code: "endpoints_resolution_error",
        desc: "Error: could not resolve endpoints. Please check network and try again."
    },
    networkError: {
        code: "network_error",
        desc: "Network request failed. Please check network trace to determine root cause."
    },
    unableToGetOpenidConfigError: {
        code: "openid_config_error",
        desc: "Could not retrieve endpoints. Check your authority and verify the .well-known/openid-configuration endpoint returns the required endpoints."
    },
    hashNotDeserialized: {
        code: "hash_not_deserialized",
        desc: "The hash parameters could not be deserialized. Please review the trace to determine the root cause."
    },
    blankGuidGenerated: {
        code: "blank_guid_generated",
        desc: "The guid generated was blank. Please review the trace to determine the root cause."
    },
    invalidStateError: {
        code: "invalid_state",
        desc: "State was not the expected format. Please check the logs to determine whether the request was sent using ProtocolUtils.setRequestState()."
    },
    stateMismatchError: {
        code: "state_mismatch",
        desc: "State mismatch error. Please check your network. Continued requests may cause cache overflow."
    },
    stateNotFoundError: {
        code: "state_not_found",
        desc: "State not found"
    },
    nonceMismatchError: {
        code: "nonce_mismatch",
        desc: "Nonce mismatch error. This may be caused by a race condition in concurrent requests."
    },
    nonceNotFoundError: {
        code: "nonce_not_found",
        desc: "nonce not found"
    },
    noTokensFoundError: {
        code: "no_tokens_found",
        desc: "No tokens were found for the given scopes, and no authorization code was passed to acquireToken. You must retrieve an authorization code before making a call to acquireToken()."
    },
    multipleMatchingTokens: {
        code: "multiple_matching_tokens",
        desc: "The cache contains multiple tokens satisfying the requirements. " +
            "Call AcquireToken again providing more requirements such as authority or account."
    },
    multipleMatchingAccounts: {
        code: "multiple_matching_accounts",
        desc: "The cache contains multiple accounts satisfying the given parameters. Please pass more info to obtain the correct account"
    },
    multipleMatchingAppMetadata: {
        code: "multiple_matching_appMetadata",
        desc: "The cache contains multiple appMetadata satisfying the given parameters. Please pass more info to obtain the correct appMetadata"
    },
    tokenRequestCannotBeMade: {
        code: "request_cannot_be_made",
        desc: "Token request cannot be made without authorization code or refresh token."
    },
    appendEmptyScopeError: {
        code: "cannot_append_empty_scope",
        desc: "Cannot append null or empty scope to ScopeSet. Please check the stack trace for more info."
    },
    removeEmptyScopeError: {
        code: "cannot_remove_empty_scope",
        desc: "Cannot remove null or empty scope from ScopeSet. Please check the stack trace for more info."
    },
    appendScopeSetError: {
        code: "cannot_append_scopeset",
        desc: "Cannot append ScopeSet due to error."
    },
    emptyInputScopeSetError: {
        code: "empty_input_scopeset",
        desc: "Empty input ScopeSet cannot be processed."
    },
    DeviceCodePollingCancelled: {
        code: "device_code_polling_cancelled",
        desc: "Caller has cancelled token endpoint polling during device code flow by setting DeviceCodeRequest.cancel = true."
    },
    DeviceCodeExpired: {
        code: "device_code_expired",
        desc: "Device code is expired."
    },
    DeviceCodeUnknownError: {
        code: "device_code_unknown_error",
        desc: "Device code stopped polling for unknown reasons."
    },
    NoAccountInSilentRequest: {
        code: "no_account_in_silent_request",
        desc: "Please pass an account object, silent flow is not supported without account information"
    },
    invalidCacheRecord: {
        code: "invalid_cache_record",
        desc: "Cache record object was null or undefined."
    },
    invalidCacheEnvironment: {
        code: "invalid_cache_environment",
        desc: "Invalid environment when attempting to create cache entry"
    },
    noAccountFound: {
        code: "no_account_found",
        desc: "No account found in cache for given key."
    },
    CachePluginError: {
        code: "no cache plugin set on CacheManager",
        desc: "ICachePlugin needs to be set before using readFromStorage or writeFromStorage"
    },
    noCryptoObj: {
        code: "no_crypto_object",
        desc: "No crypto object detected. This is required for the following operation: "
    },
    invalidCacheType: {
        code: "invalid_cache_type",
        desc: "Invalid cache type"
    },
    unexpectedAccountType: {
        code: "unexpected_account_type",
        desc: "Unexpected account type."
    },
    unexpectedCredentialType: {
        code: "unexpected_credential_type",
        desc: "Unexpected credential type."
    },
    invalidAssertion: {
        code: "invalid_assertion",
        desc: "Client assertion must meet requirements described in https://tools.ietf.org/html/rfc7515"
    },
    invalidClientCredential: {
        code: "invalid_client_credential",
        desc: "Client credential (secret, certificate, or assertion) must not be empty when creating a confidential client. An application should at most have one credential"
    },
    tokenRefreshRequired: {
        code: "token_refresh_required",
        desc: "Cannot return token from cache because it must be refreshed. This may be due to one of the following reasons: forceRefresh parameter is set to true, claims have been requested, there is no cached access token or it is expired."
    },
    userTimeoutReached: {
        code: "user_timeout_reached",
        desc: "User defined timeout for device code polling reached",
    },
    tokenClaimsRequired: {
        code: "token_claims_cnf_required_for_signedjwt",
        desc: "Cannot generate a POP jwt if the token_claims are not populated"
    },
    noAuthorizationCodeFromServer: {
        code: "authorization_code_missing_from_server_response",
        desc: "Server response does not contain an authorization code to proceed"
    },
    noAzureRegionDetected: {
        code: "no_azure_region_detected",
        desc: "No azure region was detected and no fallback was made available"
    },
    accessTokenEntityNullError: {
        code: "access_token_entity_null",
        desc: "Access token entity is null, please check logs and cache to ensure a valid access token is present."
    },
    bindingKeyNotRemovedError: {
        code: "binding_key_not_removed",
        desc: "Could not remove the credential's binding key from storage."
    },
    logoutNotSupported: {
        code: "end_session_endpoint_not_supported",
        desc: "Provided authority does not support logout."
    },
    keyIdMissing: {
        code: "key_id_missing",
        desc: "A keyId value is missing from the requested bound token's cache record and is required to match the token to it's stored binding key."
    }
};
/**
 * Error thrown when there is an error in the client code running on the browser.
 */
var ClientAuthError = /** @class */ (function (_super) {
    __extends(ClientAuthError, _super);
    function ClientAuthError(errorCode, errorMessage) {
        var _this = _super.call(this, errorCode, errorMessage) || this;
        _this.name = "ClientAuthError";
        Object.setPrototypeOf(_this, ClientAuthError.prototype);
        return _this;
    }
    /**
     * Creates an error thrown when client info object doesn't decode correctly.
     * @param caughtError
     */
    ClientAuthError.createClientInfoDecodingError = function (caughtError) {
        return new ClientAuthError(ClientAuthErrorMessage.clientInfoDecodingError.code, ClientAuthErrorMessage.clientInfoDecodingError.desc + " Failed with error: " + caughtError);
    };
    /**
     * Creates an error thrown if the client info is empty.
     * @param rawClientInfo
     */
    ClientAuthError.createClientInfoEmptyError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.clientInfoEmptyError.code, "" + ClientAuthErrorMessage.clientInfoEmptyError.desc);
    };
    /**
     * Creates an error thrown when the id token extraction errors out.
     * @param err
     */
    ClientAuthError.createTokenParsingError = function (caughtExtractionError) {
        return new ClientAuthError(ClientAuthErrorMessage.tokenParsingError.code, ClientAuthErrorMessage.tokenParsingError.desc + " Failed with error: " + caughtExtractionError);
    };
    /**
     * Creates an error thrown when the id token string is null or empty.
     * @param invalidRawTokenString
     */
    ClientAuthError.createTokenNullOrEmptyError = function (invalidRawTokenString) {
        return new ClientAuthError(ClientAuthErrorMessage.nullOrEmptyToken.code, ClientAuthErrorMessage.nullOrEmptyToken.desc + " Raw Token Value: " + invalidRawTokenString);
    };
    /**
     * Creates an error thrown when the endpoint discovery doesn't complete correctly.
     */
    ClientAuthError.createEndpointDiscoveryIncompleteError = function (errDetail) {
        return new ClientAuthError(ClientAuthErrorMessage.endpointResolutionError.code, ClientAuthErrorMessage.endpointResolutionError.desc + " Detail: " + errDetail);
    };
    /**
     * Creates an error thrown when the fetch client throws
     */
    ClientAuthError.createNetworkError = function (endpoint, errDetail) {
        return new ClientAuthError(ClientAuthErrorMessage.networkError.code, ClientAuthErrorMessage.networkError.desc + " | Fetch client threw: " + errDetail + " | Attempted to reach: " + endpoint.split("?")[0]);
    };
    /**
     * Creates an error thrown when the openid-configuration endpoint cannot be reached or does not contain the required data
     */
    ClientAuthError.createUnableToGetOpenidConfigError = function (errDetail) {
        return new ClientAuthError(ClientAuthErrorMessage.unableToGetOpenidConfigError.code, ClientAuthErrorMessage.unableToGetOpenidConfigError.desc + " Attempted to retrieve endpoints from: " + errDetail);
    };
    /**
     * Creates an error thrown when the hash cannot be deserialized.
     * @param hashParamObj
     */
    ClientAuthError.createHashNotDeserializedError = function (hashParamObj) {
        return new ClientAuthError(ClientAuthErrorMessage.hashNotDeserialized.code, ClientAuthErrorMessage.hashNotDeserialized.desc + " Given Object: " + hashParamObj);
    };
    /**
     * Creates an error thrown when the state cannot be parsed.
     * @param invalidState
     */
    ClientAuthError.createInvalidStateError = function (invalidState, errorString) {
        return new ClientAuthError(ClientAuthErrorMessage.invalidStateError.code, ClientAuthErrorMessage.invalidStateError.desc + " Invalid State: " + invalidState + ", Root Err: " + errorString);
    };
    /**
     * Creates an error thrown when two states do not match.
     */
    ClientAuthError.createStateMismatchError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.stateMismatchError.code, ClientAuthErrorMessage.stateMismatchError.desc);
    };
    /**
     * Creates an error thrown when the state is not present
     * @param missingState
     */
    ClientAuthError.createStateNotFoundError = function (missingState) {
        return new ClientAuthError(ClientAuthErrorMessage.stateNotFoundError.code, ClientAuthErrorMessage.stateNotFoundError.desc + ":  " + missingState);
    };
    /**
     * Creates an error thrown when the nonce does not match.
     */
    ClientAuthError.createNonceMismatchError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.nonceMismatchError.code, ClientAuthErrorMessage.nonceMismatchError.desc);
    };
    /**
     * Creates an error thrown when the mnonce is not present
     * @param missingNonce
     */
    ClientAuthError.createNonceNotFoundError = function (missingNonce) {
        return new ClientAuthError(ClientAuthErrorMessage.nonceNotFoundError.code, ClientAuthErrorMessage.nonceNotFoundError.desc + ":  " + missingNonce);
    };
    /**
     * Throws error when multiple tokens are in cache.
     */
    ClientAuthError.createMultipleMatchingTokensInCacheError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.multipleMatchingTokens.code, ClientAuthErrorMessage.multipleMatchingTokens.desc + ".");
    };
    /**
     * Throws error when multiple accounts are in cache for the given params
     */
    ClientAuthError.createMultipleMatchingAccountsInCacheError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.multipleMatchingAccounts.code, ClientAuthErrorMessage.multipleMatchingAccounts.desc);
    };
    /**
     * Throws error when multiple appMetada are in cache for the given clientId.
     */
    ClientAuthError.createMultipleMatchingAppMetadataInCacheError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.multipleMatchingAppMetadata.code, ClientAuthErrorMessage.multipleMatchingAppMetadata.desc);
    };
    /**
     * Throws error when no auth code or refresh token is given to ServerTokenRequestParameters.
     */
    ClientAuthError.createTokenRequestCannotBeMadeError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.tokenRequestCannotBeMade.code, ClientAuthErrorMessage.tokenRequestCannotBeMade.desc);
    };
    /**
     * Throws error when attempting to append a null, undefined or empty scope to a set
     * @param givenScope
     */
    ClientAuthError.createAppendEmptyScopeToSetError = function (givenScope) {
        return new ClientAuthError(ClientAuthErrorMessage.appendEmptyScopeError.code, ClientAuthErrorMessage.appendEmptyScopeError.desc + " Given Scope: " + givenScope);
    };
    /**
     * Throws error when attempting to append a null, undefined or empty scope to a set
     * @param givenScope
     */
    ClientAuthError.createRemoveEmptyScopeFromSetError = function (givenScope) {
        return new ClientAuthError(ClientAuthErrorMessage.removeEmptyScopeError.code, ClientAuthErrorMessage.removeEmptyScopeError.desc + " Given Scope: " + givenScope);
    };
    /**
     * Throws error when attempting to append null or empty ScopeSet.
     * @param appendError
     */
    ClientAuthError.createAppendScopeSetError = function (appendError) {
        return new ClientAuthError(ClientAuthErrorMessage.appendScopeSetError.code, ClientAuthErrorMessage.appendScopeSetError.desc + " Detail Error: " + appendError);
    };
    /**
     * Throws error if ScopeSet is null or undefined.
     * @param givenScopeSet
     */
    ClientAuthError.createEmptyInputScopeSetError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.emptyInputScopeSetError.code, "" + ClientAuthErrorMessage.emptyInputScopeSetError.desc);
    };
    /**
     * Throws error if user sets CancellationToken.cancel = true during polling of token endpoint during device code flow
     */
    ClientAuthError.createDeviceCodeCancelledError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.DeviceCodePollingCancelled.code, "" + ClientAuthErrorMessage.DeviceCodePollingCancelled.desc);
    };
    /**
     * Throws error if device code is expired
     */
    ClientAuthError.createDeviceCodeExpiredError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.DeviceCodeExpired.code, "" + ClientAuthErrorMessage.DeviceCodeExpired.desc);
    };
    /**
     * Throws error if device code is expired
     */
    ClientAuthError.createDeviceCodeUnknownError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.DeviceCodeUnknownError.code, "" + ClientAuthErrorMessage.DeviceCodeUnknownError.desc);
    };
    /**
     * Throws error when silent requests are made without an account object
     */
    ClientAuthError.createNoAccountInSilentRequestError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.NoAccountInSilentRequest.code, "" + ClientAuthErrorMessage.NoAccountInSilentRequest.desc);
    };
    /**
     * Throws error when cache record is null or undefined.
     */
    ClientAuthError.createNullOrUndefinedCacheRecord = function () {
        return new ClientAuthError(ClientAuthErrorMessage.invalidCacheRecord.code, ClientAuthErrorMessage.invalidCacheRecord.desc);
    };
    /**
     * Throws error when provided environment is not part of the CloudDiscoveryMetadata object
     */
    ClientAuthError.createInvalidCacheEnvironmentError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.invalidCacheEnvironment.code, ClientAuthErrorMessage.invalidCacheEnvironment.desc);
    };
    /**
     * Throws error when account is not found in cache.
     */
    ClientAuthError.createNoAccountFoundError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.noAccountFound.code, ClientAuthErrorMessage.noAccountFound.desc);
    };
    /**
     * Throws error if ICachePlugin not set on CacheManager.
     */
    ClientAuthError.createCachePluginError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.CachePluginError.code, "" + ClientAuthErrorMessage.CachePluginError.desc);
    };
    /**
     * Throws error if crypto object not found.
     * @param operationName
     */
    ClientAuthError.createNoCryptoObjectError = function (operationName) {
        return new ClientAuthError(ClientAuthErrorMessage.noCryptoObj.code, "" + ClientAuthErrorMessage.noCryptoObj.desc + operationName);
    };
    /**
     * Throws error if cache type is invalid.
     */
    ClientAuthError.createInvalidCacheTypeError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.invalidCacheType.code, "" + ClientAuthErrorMessage.invalidCacheType.desc);
    };
    /**
     * Throws error if unexpected account type.
     */
    ClientAuthError.createUnexpectedAccountTypeError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.unexpectedAccountType.code, "" + ClientAuthErrorMessage.unexpectedAccountType.desc);
    };
    /**
     * Throws error if unexpected credential type.
     */
    ClientAuthError.createUnexpectedCredentialTypeError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.unexpectedCredentialType.code, "" + ClientAuthErrorMessage.unexpectedCredentialType.desc);
    };
    /**
     * Throws error if client assertion is not valid.
     */
    ClientAuthError.createInvalidAssertionError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.invalidAssertion.code, "" + ClientAuthErrorMessage.invalidAssertion.desc);
    };
    /**
     * Throws error if client assertion is not valid.
     */
    ClientAuthError.createInvalidCredentialError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.invalidClientCredential.code, "" + ClientAuthErrorMessage.invalidClientCredential.desc);
    };
    /**
     * Throws error if token cannot be retrieved from cache due to refresh being required.
     */
    ClientAuthError.createRefreshRequiredError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.tokenRefreshRequired.code, ClientAuthErrorMessage.tokenRefreshRequired.desc);
    };
    /**
     * Throws error if the user defined timeout is reached.
     */
    ClientAuthError.createUserTimeoutReachedError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.userTimeoutReached.code, ClientAuthErrorMessage.userTimeoutReached.desc);
    };
    /*
     * Throws error if token claims are not populated for a signed jwt generation
     */
    ClientAuthError.createTokenClaimsRequiredError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.tokenClaimsRequired.code, ClientAuthErrorMessage.tokenClaimsRequired.desc);
    };
    /**
     * Throws error when the authorization code is missing from the server response
     */
    ClientAuthError.createNoAuthCodeInServerResponseError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.noAuthorizationCodeFromServer.code, ClientAuthErrorMessage.noAuthorizationCodeFromServer.desc);
    };
    ClientAuthError.createBindingKeyNotRemovedError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.bindingKeyNotRemovedError.code, ClientAuthErrorMessage.bindingKeyNotRemovedError.desc);
    };
    /**
     * Thrown when logout is attempted for an authority that doesnt have an end_session_endpoint
     */
    ClientAuthError.createLogoutNotSupportedError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.logoutNotSupported.code, ClientAuthErrorMessage.logoutNotSupported.desc);
    };
    /**
     * Create an error when kid attribute is missing from a PoP token's cache record
     */
    ClientAuthError.createKeyIdMissingError = function () {
        return new ClientAuthError(ClientAuthErrorMessage.keyIdMissing.code, ClientAuthErrorMessage.keyIdMissing.desc);
    };
    return ClientAuthError;
}(AuthError));

export { ClientAuthError, ClientAuthErrorMessage };
//# sourceMappingURL=ClientAuthError.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __extends } from '../_virtual/_tslib.js';
import { ClientAuthError } from './ClientAuthError.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * ClientConfigurationErrorMessage class containing string constants used by error codes and messages.
 */
var ClientConfigurationErrorMessage = {
    redirectUriNotSet: {
        code: "redirect_uri_empty",
        desc: "A redirect URI is required for all calls, and none has been set."
    },
    postLogoutUriNotSet: {
        code: "post_logout_uri_empty",
        desc: "A post logout redirect has not been set."
    },
    claimsRequestParsingError: {
        code: "claims_request_parsing_error",
        desc: "Could not parse the given claims request object."
    },
    authorityUriInsecure: {
        code: "authority_uri_insecure",
        desc: "Authority URIs must use https.  Please see here for valid authority configuration options: https://docs.microsoft.com/en-us/azure/active-directory/develop/msal-js-initializing-client-applications#configuration-options"
    },
    urlParseError: {
        code: "url_parse_error",
        desc: "URL could not be parsed into appropriate segments."
    },
    urlEmptyError: {
        code: "empty_url_error",
        desc: "URL was empty or null."
    },
    emptyScopesError: {
        code: "empty_input_scopes_error",
        desc: "Scopes cannot be passed as null, undefined or empty array because they are required to obtain an access token."
    },
    nonArrayScopesError: {
        code: "nonarray_input_scopes_error",
        desc: "Scopes cannot be passed as non-array."
    },
    clientIdSingleScopeError: {
        code: "clientid_input_scopes_error",
        desc: "Client ID can only be provided as a single scope."
    },
    invalidPrompt: {
        code: "invalid_prompt_value",
        desc: "Supported prompt values are 'login', 'select_account', 'consent', 'create' and 'none'.  Please see here for valid configuration options: https://azuread.github.io/microsoft-authentication-library-for-js/ref/modules/_azure_msal_common.html#commonauthorizationurlrequest",
    },
    invalidClaimsRequest: {
        code: "invalid_claims",
        desc: "Given claims parameter must be a stringified JSON object."
    },
    tokenRequestEmptyError: {
        code: "token_request_empty",
        desc: "Token request was empty and not found in cache."
    },
    logoutRequestEmptyError: {
        code: "logout_request_empty",
        desc: "The logout request was null or undefined."
    },
    invalidCodeChallengeMethod: {
        code: "invalid_code_challenge_method",
        desc: "code_challenge_method passed is invalid. Valid values are \"plain\" and \"S256\"."
    },
    invalidCodeChallengeParams: {
        code: "pkce_params_missing",
        desc: "Both params: code_challenge and code_challenge_method are to be passed if to be sent in the request"
    },
    invalidCloudDiscoveryMetadata: {
        code: "invalid_cloud_discovery_metadata",
        desc: "Invalid cloudDiscoveryMetadata provided. Must be a stringified JSON object containing tenant_discovery_endpoint and metadata fields"
    },
    invalidAuthorityMetadata: {
        code: "invalid_authority_metadata",
        desc: "Invalid authorityMetadata provided. Must by a stringified JSON object containing authorization_endpoint, token_endpoint, issuer fields."
    },
    untrustedAuthority: {
        code: "untrusted_authority",
        desc: "The provided authority is not a trusted authority. Please include this authority in the knownAuthorities config parameter."
    },
    invalidAzureCloudInstance: {
        code: "invalid_azure_cloud_instance",
        desc: "Invalid AzureCloudInstance provided. Please refer MSAL JS docs: aks.ms/msaljs/azure_cloud_instance for valid values"
    },
    missingSshJwk: {
        code: "missing_ssh_jwk",
        desc: "Missing sshJwk in SSH certificate request. A stringified JSON Web Key is required when using the SSH authentication scheme."
    },
    missingSshKid: {
        code: "missing_ssh_kid",
        desc: "Missing sshKid in SSH certificate request. A string that uniquely identifies the public SSH key is required when using the SSH authentication scheme."
    },
    missingNonceAuthenticationHeader: {
        code: "missing_nonce_authentication_header",
        desc: "Unable to find an authentication header containing server nonce. Either the Authentication-Info or WWW-Authenticate headers must be present in order to obtain a server nonce."
    },
    invalidAuthenticationHeader: {
        code: "invalid_authentication_header",
        desc: "Invalid authentication header provided"
    }
};
/**
 * Error thrown when there is an error in configuration of the MSAL.js library.
 */
var ClientConfigurationError = /** @class */ (function (_super) {
    __extends(ClientConfigurationError, _super);
    function ClientConfigurationError(errorCode, errorMessage) {
        var _this = _super.call(this, errorCode, errorMessage) || this;
        _this.name = "ClientConfigurationError";
        Object.setPrototypeOf(_this, ClientConfigurationError.prototype);
        return _this;
    }
    /**
     * Creates an error thrown when the redirect uri is empty (not set by caller)
     */
    ClientConfigurationError.createRedirectUriEmptyError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.redirectUriNotSet.code, ClientConfigurationErrorMessage.redirectUriNotSet.desc);
    };
    /**
     * Creates an error thrown when the post-logout redirect uri is empty (not set by caller)
     */
    ClientConfigurationError.createPostLogoutRedirectUriEmptyError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.postLogoutUriNotSet.code, ClientConfigurationErrorMessage.postLogoutUriNotSet.desc);
    };
    /**
     * Creates an error thrown when the claims request could not be successfully parsed
     */
    ClientConfigurationError.createClaimsRequestParsingError = function (claimsRequestParseError) {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.claimsRequestParsingError.code, ClientConfigurationErrorMessage.claimsRequestParsingError.desc + " Given value: " + claimsRequestParseError);
    };
    /**
     * Creates an error thrown if authority uri is given an insecure protocol.
     * @param urlString
     */
    ClientConfigurationError.createInsecureAuthorityUriError = function (urlString) {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.authorityUriInsecure.code, ClientConfigurationErrorMessage.authorityUriInsecure.desc + " Given URI: " + urlString);
    };
    /**
     * Creates an error thrown if URL string does not parse into separate segments.
     * @param urlString
     */
    ClientConfigurationError.createUrlParseError = function (urlParseError) {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.urlParseError.code, ClientConfigurationErrorMessage.urlParseError.desc + " Given Error: " + urlParseError);
    };
    /**
     * Creates an error thrown if URL string is empty or null.
     * @param urlString
     */
    ClientConfigurationError.createUrlEmptyError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.urlEmptyError.code, ClientConfigurationErrorMessage.urlEmptyError.desc);
    };
    /**
     * Error thrown when scopes are empty.
     * @param scopesValue
     */
    ClientConfigurationError.createEmptyScopesArrayError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.emptyScopesError.code, "" + ClientConfigurationErrorMessage.emptyScopesError.desc);
    };
    /**
     * Error thrown when client id scope is not provided as single scope.
     * @param inputScopes
     */
    ClientConfigurationError.createClientIdSingleScopeError = function (inputScopes) {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.clientIdSingleScopeError.code, ClientConfigurationErrorMessage.clientIdSingleScopeError.desc + " Given Scopes: " + inputScopes);
    };
    /**
     * Error thrown when prompt is not an allowed type.
     * @param promptValue
     */
    ClientConfigurationError.createInvalidPromptError = function (promptValue) {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidPrompt.code, ClientConfigurationErrorMessage.invalidPrompt.desc + " Given value: " + promptValue);
    };
    /**
     * Creates error thrown when claims parameter is not a stringified JSON object
     */
    ClientConfigurationError.createInvalidClaimsRequestError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidClaimsRequest.code, ClientConfigurationErrorMessage.invalidClaimsRequest.desc);
    };
    /**
     * Throws error when token request is empty and nothing cached in storage.
     */
    ClientConfigurationError.createEmptyLogoutRequestError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.logoutRequestEmptyError.code, ClientConfigurationErrorMessage.logoutRequestEmptyError.desc);
    };
    /**
     * Throws error when token request is empty and nothing cached in storage.
     */
    ClientConfigurationError.createEmptyTokenRequestError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.tokenRequestEmptyError.code, ClientConfigurationErrorMessage.tokenRequestEmptyError.desc);
    };
    /**
     * Throws error when an invalid code_challenge_method is passed by the user
     */
    ClientConfigurationError.createInvalidCodeChallengeMethodError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidCodeChallengeMethod.code, ClientConfigurationErrorMessage.invalidCodeChallengeMethod.desc);
    };
    /**
     * Throws error when both params: code_challenge and code_challenge_method are not passed together
     */
    ClientConfigurationError.createInvalidCodeChallengeParamsError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidCodeChallengeParams.code, ClientConfigurationErrorMessage.invalidCodeChallengeParams.desc);
    };
    /**
     * Throws an error when the user passes invalid cloudDiscoveryMetadata
     */
    ClientConfigurationError.createInvalidCloudDiscoveryMetadataError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidCloudDiscoveryMetadata.code, ClientConfigurationErrorMessage.invalidCloudDiscoveryMetadata.desc);
    };
    /**
     * Throws an error when the user passes invalid cloudDiscoveryMetadata
     */
    ClientConfigurationError.createInvalidAuthorityMetadataError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidAuthorityMetadata.code, ClientConfigurationErrorMessage.invalidAuthorityMetadata.desc);
    };
    /**
     * Throws error when provided authority is not a member of the trusted host list
     */
    ClientConfigurationError.createUntrustedAuthorityError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.untrustedAuthority.code, ClientConfigurationErrorMessage.untrustedAuthority.desc);
    };
    /**
     * Throws error when the AzureCloudInstance is set to an invalid value
     */
    ClientConfigurationError.createInvalidAzureCloudInstanceError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidAzureCloudInstance.code, ClientConfigurationErrorMessage.invalidAzureCloudInstance.desc);
    };
    /**
     * Throws an error when the authentication scheme is set to SSH but the SSH public key is omitted from the request
     */
    ClientConfigurationError.createMissingSshJwkError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.missingSshJwk.code, ClientConfigurationErrorMessage.missingSshJwk.desc);
    };
    /**
     * Throws an error when the authentication scheme is set to SSH but the SSH public key ID is omitted from the request
     */
    ClientConfigurationError.createMissingSshKidError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.missingSshKid.code, ClientConfigurationErrorMessage.missingSshKid.desc);
    };
    /**
     * Throws error when provided headers don't contain a header that a server nonce can be extracted from
     */
    ClientConfigurationError.createMissingNonceAuthenticationHeadersError = function () {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.missingNonceAuthenticationHeader.code, ClientConfigurationErrorMessage.missingNonceAuthenticationHeader.desc);
    };
    /**
     * Throws error when a provided header is invalid in any way
     */
    ClientConfigurationError.createInvalidAuthenticationHeaderError = function (invalidHeaderName, details) {
        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidAuthenticationHeader.code, ClientConfigurationErrorMessage.invalidAuthenticationHeader.desc + ". Invalid header: " + invalidHeaderName + ". Details: " + details);
    };
    return ClientConfigurationError;
}(ClientAuthError));

export { ClientConfigurationError, ClientConfigurationErrorMessage };
//# sourceMappingURL=ClientConfigurationError.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __extends } from '../_virtual/_tslib.js';
import { AuthError } from './AuthError.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * InteractionRequiredServerErrorMessage contains string constants used by error codes and messages returned by the server indicating interaction is required
 */
var InteractionRequiredServerErrorMessage = [
    "interaction_required",
    "consent_required",
    "login_required"
];
var InteractionRequiredAuthSubErrorMessage = [
    "message_only",
    "additional_action",
    "basic_action",
    "user_password_expired",
    "consent_required"
];
/**
 * Interaction required errors defined by the SDK
 */
var InteractionRequiredAuthErrorMessage = {
    noTokensFoundError: {
        code: "no_tokens_found",
        desc: "No refresh token found in the cache. Please sign-in."
    },
    native_account_unavailable: {
        code: "native_account_unavailable",
        desc: "The requested account is not available in the native broker. It may have been deleted or logged out. Please sign-in again using an interactive API."
    }
};
/**
 * Error thrown when user interaction is required.
 */
var InteractionRequiredAuthError = /** @class */ (function (_super) {
    __extends(InteractionRequiredAuthError, _super);
    function InteractionRequiredAuthError(errorCode, errorMessage, subError) {
        var _this = _super.call(this, errorCode, errorMessage, subError) || this;
        _this.name = "InteractionRequiredAuthError";
        Object.setPrototypeOf(_this, InteractionRequiredAuthError.prototype);
        return _this;
    }
    /**
     * Helper function used to determine if an error thrown by the server requires interaction to resolve
     * @param errorCode
     * @param errorString
     * @param subError
     */
    InteractionRequiredAuthError.isInteractionRequiredError = function (errorCode, errorString, subError) {
        var isInteractionRequiredErrorCode = !!errorCode && InteractionRequiredServerErrorMessage.indexOf(errorCode) > -1;
        var isInteractionRequiredSubError = !!subError && InteractionRequiredAuthSubErrorMessage.indexOf(subError) > -1;
        var isInteractionRequiredErrorDesc = !!errorString && InteractionRequiredServerErrorMessage.some(function (irErrorCode) {
            return errorString.indexOf(irErrorCode) > -1;
        });
        return isInteractionRequiredErrorCode || isInteractionRequiredErrorDesc || isInteractionRequiredSubError;
    };
    /**
     * Creates an error thrown when the authorization code required for a token request is null or empty.
     */
    InteractionRequiredAuthError.createNoTokensFoundError = function () {
        return new InteractionRequiredAuthError(InteractionRequiredAuthErrorMessage.noTokensFoundError.code, InteractionRequiredAuthErrorMessage.noTokensFoundError.desc);
    };
    /**
     * Creates an error thrown when the native broker returns ACCOUNT_UNAVAILABLE status, indicating that the account was removed and interactive sign-in is required
     * @returns
     */
    InteractionRequiredAuthError.createNativeAccountUnavailableError = function () {
        return new InteractionRequiredAuthError(InteractionRequiredAuthErrorMessage.native_account_unavailable.code, InteractionRequiredAuthErrorMessage.native_account_unavailable.desc);
    };
    return InteractionRequiredAuthError;
}(AuthError));

export { InteractionRequiredAuthError, InteractionRequiredAuthErrorMessage, InteractionRequiredAuthSubErrorMessage, InteractionRequiredServerErrorMessage };
//# sourceMappingURL=InteractionRequiredAuthError.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __extends } from '../_virtual/_tslib.js';
import { AuthError } from './AuthError.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * ClientAuthErrorMessage class containing string constants used by error codes and messages.
 */
var JoseHeaderErrorMessage = {
    missingKidError: {
        code: "missing_kid_error",
        desc: "The JOSE Header for the requested JWT, JWS or JWK object requires a keyId to be configured as the 'kid' header claim. No 'kid' value was provided."
    },
    missingAlgError: {
        code: "missing_alg_error",
        desc: "The JOSE Header for the requested JWT, JWS or JWK object requires an algorithm to be specified as the 'alg' header claim. No 'alg' value was provided."
    },
};
/**
 * Error thrown when there is an error in the client code running on the browser.
 */
var JoseHeaderError = /** @class */ (function (_super) {
    __extends(JoseHeaderError, _super);
    function JoseHeaderError(errorCode, errorMessage) {
        var _this = _super.call(this, errorCode, errorMessage) || this;
        _this.name = "JoseHeaderError";
        Object.setPrototypeOf(_this, JoseHeaderError.prototype);
        return _this;
    }
    /**
     * Creates an error thrown when keyId isn't set on JOSE header.
     */
    JoseHeaderError.createMissingKidError = function () {
        return new JoseHeaderError(JoseHeaderErrorMessage.missingKidError.code, JoseHeaderErrorMessage.missingKidError.desc);
    };
    /**
     * Creates an error thrown when algorithm isn't set on JOSE header.
     */
    JoseHeaderError.createMissingAlgError = function () {
        return new JoseHeaderError(JoseHeaderErrorMessage.missingAlgError.code, JoseHeaderErrorMessage.missingAlgError.desc);
    };
    return JoseHeaderError;
}(AuthError));

export { JoseHeaderError, JoseHeaderErrorMessage };
//# sourceMappingURL=JoseHeaderError.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __extends } from '../_virtual/_tslib.js';
import { AuthError } from './AuthError.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Error thrown when there is an error with the server code, for example, unavailability.
 */
var ServerError = /** @class */ (function (_super) {
    __extends(ServerError, _super);
    function ServerError(errorCode, errorMessage, subError) {
        var _this = _super.call(this, errorCode, errorMessage, subError) || this;
        _this.name = "ServerError";
        Object.setPrototypeOf(_this, ServerError.prototype);
        return _this;
    }
    return ServerError;
}(AuthError));

export { ServerError };
//# sourceMappingURL=ServerError.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __awaiter, __generator } from '../_virtual/_tslib.js';
import { AuthError } from '../error/AuthError.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var DEFAULT_CRYPTO_IMPLEMENTATION = {
    createNewGuid: function () {
        var notImplErr = "Crypto interface - createNewGuid() has not been implemented";
        throw AuthError.createUnexpectedError(notImplErr);
    },
    base64Decode: function () {
        var notImplErr = "Crypto interface - base64Decode() has not been implemented";
        throw AuthError.createUnexpectedError(notImplErr);
    },
    base64Encode: function () {
        var notImplErr = "Crypto interface - base64Encode() has not been implemented";
        throw AuthError.createUnexpectedError(notImplErr);
    },
    generatePkceCodes: function () {
        return __awaiter(this, void 0, void 0, function () {
            var notImplErr;
            return __generator(this, function (_a) {
                notImplErr = "Crypto interface - generatePkceCodes() has not been implemented";
                throw AuthError.createUnexpectedError(notImplErr);
            });
        });
    },
    getPublicKeyThumbprint: function () {
        return __awaiter(this, void 0, void 0, function () {
            var notImplErr;
            return __generator(this, function (_a) {
                notImplErr = "Crypto interface - getPublicKeyThumbprint() has not been implemented";
                throw AuthError.createUnexpectedError(notImplErr);
            });
        });
    },
    removeTokenBindingKey: function () {
        return __awaiter(this, void 0, void 0, function () {
            var notImplErr;
            return __generator(this, function (_a) {
                notImplErr = "Crypto interface - removeTokenBindingKey() has not been implemented";
                throw AuthError.createUnexpectedError(notImplErr);
            });
        });
    },
    clearKeystore: function () {
        return __awaiter(this, void 0, void 0, function () {
            var notImplErr;
            return __generator(this, function (_a) {
                notImplErr = "Crypto interface - clearKeystore() has not been implemented";
                throw AuthError.createUnexpectedError(notImplErr);
            });
        });
    },
    signJwt: function () {
        return __awaiter(this, void 0, void 0, function () {
            var notImplErr;
            return __generator(this, function (_a) {
                notImplErr = "Crypto interface - signJwt() has not been implemented";
                throw AuthError.createUnexpectedError(notImplErr);
            });
        });
    },
    hashString: function () {
        return __awaiter(this, void 0, void 0, function () {
            var notImplErr;
            return __generator(this, function (_a) {
                notImplErr = "Crypto interface - hashString() has not been implemented";
                throw AuthError.createUnexpectedError(notImplErr);
            });
        });
    }
};

export { DEFAULT_CRYPTO_IMPLEMENTATION };
//# sourceMappingURL=ICrypto.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { JoseHeaderError } from '../error/JoseHeaderError.js';
import { JsonTypes } from '../utils/Constants.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var JoseHeader = /** @class */ (function () {
    function JoseHeader(options) {
        this.typ = options.typ;
        this.alg = options.alg;
        this.kid = options.kid;
    }
    /**
     * Builds SignedHttpRequest formatted JOSE Header from the
     * JOSE Header options provided or previously set on the object and returns
     * the stringified header object.
     * Throws if keyId or algorithm aren't provided since they are required for Access Token Binding.
     * @param shrHeaderOptions
     * @returns
     */
    JoseHeader.getShrHeaderString = function (shrHeaderOptions) {
        // KeyID is required on the SHR header
        if (!shrHeaderOptions.kid) {
            throw JoseHeaderError.createMissingKidError();
        }
        // Alg is required on the SHR header
        if (!shrHeaderOptions.alg) {
            throw JoseHeaderError.createMissingAlgError();
        }
        var shrHeader = new JoseHeader({
            // Access Token PoP headers must have type JWT, but the type header can be overriden for special cases
            typ: shrHeaderOptions.typ || JsonTypes.Jwt,
            kid: shrHeaderOptions.kid,
            alg: shrHeaderOptions.alg
        });
        return JSON.stringify(shrHeader);
    };
    return JoseHeader;
}());

export { JoseHeader };
//# sourceMappingURL=JoseHeader.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __awaiter, __generator, __assign } from '../_virtual/_tslib.js';
import { TimeUtils } from '../utils/TimeUtils.js';
import { UrlString } from '../url/UrlString.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var KeyLocation;
(function (KeyLocation) {
    KeyLocation["SW"] = "sw";
    KeyLocation["UHW"] = "uhw";
})(KeyLocation || (KeyLocation = {}));
var PopTokenGenerator = /** @class */ (function () {
    function PopTokenGenerator(cryptoUtils) {
        this.cryptoUtils = cryptoUtils;
    }
    /**
     * Generates the req_cnf validated at the RP in the POP protocol for SHR parameters
     * and returns an object containing the keyid, the full req_cnf string and the req_cnf string hash
     * @param request
     * @returns
     */
    PopTokenGenerator.prototype.generateCnf = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var reqCnf, reqCnfString, _a;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0: return [4 /*yield*/, this.generateKid(request)];
                    case 1:
                        reqCnf = _b.sent();
                        reqCnfString = this.cryptoUtils.base64Encode(JSON.stringify(reqCnf));
                        _a = {
                            kid: reqCnf.kid,
                            reqCnfString: reqCnfString
                        };
                        return [4 /*yield*/, this.cryptoUtils.hashString(reqCnfString)];
                    case 2: return [2 /*return*/, (_a.reqCnfHash = _b.sent(),
                            _a)];
                }
            });
        });
    };
    /**
     * Generates key_id for a SHR token request
     * @param request
     * @returns
     */
    PopTokenGenerator.prototype.generateKid = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var kidThumbprint;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.cryptoUtils.getPublicKeyThumbprint(request)];
                    case 1:
                        kidThumbprint = _a.sent();
                        return [2 /*return*/, {
                                kid: kidThumbprint,
                                xms_ksl: KeyLocation.SW
                            }];
                }
            });
        });
    };
    /**
     * Signs the POP access_token with the local generated key-pair
     * @param accessToken
     * @param request
     * @returns
     */
    PopTokenGenerator.prototype.signPopToken = function (accessToken, keyId, request) {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                return [2 /*return*/, this.signPayload(accessToken, keyId, request)];
            });
        });
    };
    /**
     * Utility function to generate the signed JWT for an access_token
     * @param payload
     * @param kid
     * @param request
     * @param claims
     * @returns
     */
    PopTokenGenerator.prototype.signPayload = function (payload, keyId, request, claims) {
        return __awaiter(this, void 0, void 0, function () {
            var resourceRequestMethod, resourceRequestUri, shrClaims, shrNonce, resourceUrlString, resourceUrlComponents;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        resourceRequestMethod = request.resourceRequestMethod, resourceRequestUri = request.resourceRequestUri, shrClaims = request.shrClaims, shrNonce = request.shrNonce;
                        resourceUrlString = (resourceRequestUri) ? new UrlString(resourceRequestUri) : undefined;
                        resourceUrlComponents = resourceUrlString === null || resourceUrlString === void 0 ? void 0 : resourceUrlString.getUrlComponents();
                        return [4 /*yield*/, this.cryptoUtils.signJwt(__assign({ at: payload, ts: TimeUtils.nowSeconds(), m: resourceRequestMethod === null || resourceRequestMethod === void 0 ? void 0 : resourceRequestMethod.toUpperCase(), u: resourceUrlComponents === null || resourceUrlComponents === void 0 ? void 0 : resourceUrlComponents.HostNameAndPort, nonce: shrNonce || this.cryptoUtils.createNewGuid(), p: resourceUrlComponents === null || resourceUrlComponents === void 0 ? void 0 : resourceUrlComponents.AbsolutePath, q: (resourceUrlComponents === null || resourceUrlComponents === void 0 ? void 0 : resourceUrlComponents.QueryString) ? [[], resourceUrlComponents.QueryString] : undefined, client_claims: shrClaims || undefined }, claims), keyId, request.correlationId)];
                    case 1: return [2 /*return*/, _a.sent()];
                }
            });
        });
    };
    return PopTokenGenerator;
}());

export { PopTokenGenerator };
//# sourceMappingURL=PopTokenGenerator.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __assign, __awaiter, __generator } from '../_virtual/_tslib.js';
import { DEFAULT_CRYPTO_IMPLEMENTATION } from '../crypto/ICrypto.js';
import { AuthError } from '../error/AuthError.js';
import { LogLevel } from '../logger/Logger.js';
import { Constants } from '../utils/Constants.js';
import { version } from '../packageMetadata.js';
import { AzureCloudInstance } from '../authority/AuthorityOptions.js';
import { DefaultStorageClass } from '../cache/CacheManager.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
// Token renewal offset default in seconds
var DEFAULT_TOKEN_RENEWAL_OFFSET_SEC = 300;
var DEFAULT_SYSTEM_OPTIONS = {
    tokenRenewalOffsetSeconds: DEFAULT_TOKEN_RENEWAL_OFFSET_SEC,
    preventCorsPreflight: false,
    proxyUrl: Constants.EMPTY_STRING
};
var DEFAULT_LOGGER_IMPLEMENTATION = {
    loggerCallback: function () {
        // allow users to not set loggerCallback
    },
    piiLoggingEnabled: false,
    logLevel: LogLevel.Info,
    correlationId: Constants.EMPTY_STRING
};
var DEFAULT_NETWORK_IMPLEMENTATION = {
    sendGetRequestAsync: function () {
        return __awaiter(this, void 0, void 0, function () {
            var notImplErr;
            return __generator(this, function (_a) {
                notImplErr = "Network interface - sendGetRequestAsync() has not been implemented";
                throw AuthError.createUnexpectedError(notImplErr);
            });
        });
    },
    sendPostRequestAsync: function () {
        return __awaiter(this, void 0, void 0, function () {
            var notImplErr;
            return __generator(this, function (_a) {
                notImplErr = "Network interface - sendPostRequestAsync() has not been implemented";
                throw AuthError.createUnexpectedError(notImplErr);
            });
        });
    }
};
var DEFAULT_LIBRARY_INFO = {
    sku: Constants.SKU,
    version: version,
    cpu: Constants.EMPTY_STRING,
    os: Constants.EMPTY_STRING
};
var DEFAULT_CLIENT_CREDENTIALS = {
    clientSecret: Constants.EMPTY_STRING,
    clientAssertion: undefined
};
var DEFAULT_AZURE_CLOUD_OPTIONS = {
    azureCloudInstance: AzureCloudInstance.None,
    tenant: "" + Constants.DEFAULT_COMMON_TENANT
};
var DEFAULT_TELEMETRY_OPTIONS = {
    application: {
        appName: "",
        appVersion: ""
    }
};
/**
 * Function that sets the default options when not explicitly configured from app developer
 *
 * @param Configuration
 *
 * @returns Configuration
 */
function buildClientConfiguration(_a) {
    var userAuthOptions = _a.authOptions, userSystemOptions = _a.systemOptions, userLoggerOption = _a.loggerOptions, storageImplementation = _a.storageInterface, networkImplementation = _a.networkInterface, cryptoImplementation = _a.cryptoInterface, clientCredentials = _a.clientCredentials, libraryInfo = _a.libraryInfo, telemetry = _a.telemetry, serverTelemetryManager = _a.serverTelemetryManager, persistencePlugin = _a.persistencePlugin, serializableCache = _a.serializableCache;
    var loggerOptions = __assign(__assign({}, DEFAULT_LOGGER_IMPLEMENTATION), userLoggerOption);
    return {
        authOptions: buildAuthOptions(userAuthOptions),
        systemOptions: __assign(__assign({}, DEFAULT_SYSTEM_OPTIONS), userSystemOptions),
        loggerOptions: loggerOptions,
        storageInterface: storageImplementation || new DefaultStorageClass(userAuthOptions.clientId, DEFAULT_CRYPTO_IMPLEMENTATION),
        networkInterface: networkImplementation || DEFAULT_NETWORK_IMPLEMENTATION,
        cryptoInterface: cryptoImplementation || DEFAULT_CRYPTO_IMPLEMENTATION,
        clientCredentials: clientCredentials || DEFAULT_CLIENT_CREDENTIALS,
        libraryInfo: __assign(__assign({}, DEFAULT_LIBRARY_INFO), libraryInfo),
        telemetry: __assign(__assign({}, DEFAULT_TELEMETRY_OPTIONS), telemetry),
        serverTelemetryManager: serverTelemetryManager || null,
        persistencePlugin: persistencePlugin || null,
        serializableCache: serializableCache || null,
    };
}
/**
 * Construct authoptions from the client and platform passed values
 * @param authOptions
 */
function buildAuthOptions(authOptions) {
    return __assign({ clientCapabilities: [], azureCloudOptions: DEFAULT_AZURE_CLOUD_OPTIONS, skipAuthorityMetadataCache: false }, authOptions);
}

export { DEFAULT_SYSTEM_OPTIONS, buildClientConfiguration };
//# sourceMappingURL=ClientConfiguration.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __extends, __awaiter, __generator, __assign, __spreadArrays } from '../_virtual/_tslib.js';
import { BaseClient } from './BaseClient.js';
import { RequestParameterBuilder } from '../request/RequestParameterBuilder.js';
import { Separators, AADServerParamKeys, AuthenticationScheme, GrantType, PromptValue } from '../utils/Constants.js';
import { ResponseHandler } from '../response/ResponseHandler.js';
import { StringUtils } from '../utils/StringUtils.js';
import { ClientAuthError } from '../error/ClientAuthError.js';
import { UrlString } from '../url/UrlString.js';
import { PopTokenGenerator } from '../crypto/PopTokenGenerator.js';
import { TimeUtils } from '../utils/TimeUtils.js';
import { buildClientInfo, buildClientInfoFromHomeAccountId } from '../account/ClientInfo.js';
import { CcsCredentialType } from '../account/CcsCredential.js';
import { ClientConfigurationError } from '../error/ClientConfigurationError.js';
import { RequestValidator } from '../request/RequestValidator.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Oauth2.0 Authorization Code client
 */
var AuthorizationCodeClient = /** @class */ (function (_super) {
    __extends(AuthorizationCodeClient, _super);
    function AuthorizationCodeClient(configuration) {
        var _this = _super.call(this, configuration) || this;
        // Flag to indicate if client is for hybrid spa auth code redemption
        _this.includeRedirectUri = true;
        return _this;
    }
    /**
     * Creates the URL of the authorization request letting the user input credentials and consent to the
     * application. The URL target the /authorize endpoint of the authority configured in the
     * application object.
     *
     * Once the user inputs their credentials and consents, the authority will send a response to the redirect URI
     * sent in the request and should contain an authorization code, which can then be used to acquire tokens via
     * acquireToken(AuthorizationCodeRequest)
     * @param request
     */
    AuthorizationCodeClient.prototype.getAuthCodeUrl = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var queryString;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.createAuthCodeUrlQueryString(request)];
                    case 1:
                        queryString = _a.sent();
                        return [2 /*return*/, UrlString.appendQueryString(this.authority.authorizationEndpoint, queryString)];
                }
            });
        });
    };
    /**
     * API to acquire a token in exchange of 'authorization_code` acquired by the user in the first leg of the
     * authorization_code_grant
     * @param request
     */
    AuthorizationCodeClient.prototype.acquireToken = function (request, authCodePayload) {
        return __awaiter(this, void 0, void 0, function () {
            var reqTimestamp, response, responseHandler;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.info("in acquireToken call");
                        if (!request || StringUtils.isEmpty(request.code)) {
                            throw ClientAuthError.createTokenRequestCannotBeMadeError();
                        }
                        reqTimestamp = TimeUtils.nowSeconds();
                        return [4 /*yield*/, this.executeTokenRequest(this.authority, request)];
                    case 1:
                        response = _a.sent();
                        responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, this.config.serializableCache, this.config.persistencePlugin);
                        // Validate response. This function throws a server error if an error is returned by the server.
                        responseHandler.validateTokenResponse(response.body);
                        return [4 /*yield*/, responseHandler.handleServerTokenResponse(response.body, this.authority, reqTimestamp, request, authCodePayload)];
                    case 2: return [2 /*return*/, _a.sent()];
                }
            });
        });
    };
    /**
     * Handles the hash fragment response from public client code request. Returns a code response used by
     * the client to exchange for a token in acquireToken.
     * @param hashFragment
     */
    AuthorizationCodeClient.prototype.handleFragmentResponse = function (hashFragment, cachedState) {
        // Handle responses.
        var responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, null, null);
        // Deserialize hash fragment response parameters.
        var hashUrlString = new UrlString(hashFragment);
        // Deserialize hash fragment response parameters.
        var serverParams = UrlString.getDeserializedHash(hashUrlString.getHash());
        // Get code response
        responseHandler.validateServerAuthorizationCodeResponse(serverParams, cachedState, this.cryptoUtils);
        // throw when there is no auth code in the response
        if (!serverParams.code) {
            throw ClientAuthError.createNoAuthCodeInServerResponseError();
        }
        return __assign(__assign({}, serverParams), { 
            // Code param is optional in ServerAuthorizationCodeResponse but required in AuthorizationCodePaylod
            code: serverParams.code });
    };
    /**
     * Used to log out the current user, and redirect the user to the postLogoutRedirectUri.
     * Default behaviour is to redirect the user to `window.location.href`.
     * @param authorityUri
     */
    AuthorizationCodeClient.prototype.getLogoutUri = function (logoutRequest) {
        // Throw error if logoutRequest is null/undefined
        if (!logoutRequest) {
            throw ClientConfigurationError.createEmptyLogoutRequestError();
        }
        var queryString = this.createLogoutUrlQueryString(logoutRequest);
        // Construct logout URI
        return UrlString.appendQueryString(this.authority.endSessionEndpoint, queryString);
    };
    /**
     * Executes POST request to token endpoint
     * @param authority
     * @param request
     */
    AuthorizationCodeClient.prototype.executeTokenRequest = function (authority, request) {
        return __awaiter(this, void 0, void 0, function () {
            var thumbprint, requestBody, queryParameters, ccsCredential, clientInfo, headers, endpoint;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        thumbprint = {
                            clientId: this.config.authOptions.clientId,
                            authority: authority.canonicalAuthority,
                            scopes: request.scopes,
                            claims: request.claims,
                            authenticationScheme: request.authenticationScheme,
                            resourceRequestMethod: request.resourceRequestMethod,
                            resourceRequestUri: request.resourceRequestUri,
                            shrClaims: request.shrClaims,
                            sshKid: request.sshKid
                        };
                        return [4 /*yield*/, this.createTokenRequestBody(request)];
                    case 1:
                        requestBody = _a.sent();
                        queryParameters = this.createTokenQueryParameters(request);
                        ccsCredential = undefined;
                        if (request.clientInfo) {
                            try {
                                clientInfo = buildClientInfo(request.clientInfo, this.cryptoUtils);
                                ccsCredential = {
                                    credential: "" + clientInfo.uid + Separators.CLIENT_INFO_SEPARATOR + clientInfo.utid,
                                    type: CcsCredentialType.HOME_ACCOUNT_ID
                                };
                            }
                            catch (e) {
                                this.logger.verbose("Could not parse client info for CCS Header: " + e);
                            }
                        }
                        headers = this.createTokenRequestHeaders(ccsCredential || request.ccsCredential);
                        endpoint = StringUtils.isEmpty(queryParameters) ? authority.tokenEndpoint : authority.tokenEndpoint + "?" + queryParameters;
                        return [2 /*return*/, this.executePostToTokenEndpoint(endpoint, requestBody, headers, thumbprint)];
                }
            });
        });
    };
    /**
     * Creates query string for the /token request
     * @param request
     */
    AuthorizationCodeClient.prototype.createTokenQueryParameters = function (request) {
        var parameterBuilder = new RequestParameterBuilder();
        if (request.tokenQueryParameters) {
            parameterBuilder.addExtraQueryParameters(request.tokenQueryParameters);
        }
        return parameterBuilder.createQueryString();
    };
    /**
     * Generates a map for all the params to be sent to the service
     * @param request
     */
    AuthorizationCodeClient.prototype.createTokenRequestBody = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var parameterBuilder, clientAssertion, popTokenGenerator, reqCnfData, correlationId, ccsCred, clientInfo, clientInfo;
            var _a;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        parameterBuilder = new RequestParameterBuilder();
                        parameterBuilder.addClientId(this.config.authOptions.clientId);
                        /*
                         * For hybrid spa flow, there will be a code but no verifier
                         * In this scenario, don't include redirect uri as auth code will not be bound to redirect URI
                         */
                        if (!this.includeRedirectUri) {
                            // Just validate
                            RequestValidator.validateRedirectUri(request.redirectUri);
                        }
                        else {
                            // Validate and include redirect uri
                            parameterBuilder.addRedirectUri(request.redirectUri);
                        }
                        // Add scope array, parameter builder will add default scopes and dedupe
                        parameterBuilder.addScopes(request.scopes);
                        // add code: user set, not validated
                        parameterBuilder.addAuthorizationCode(request.code);
                        // Add library metadata
                        parameterBuilder.addLibraryInfo(this.config.libraryInfo);
                        parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);
                        parameterBuilder.addThrottling();
                        if (this.serverTelemetryManager) {
                            parameterBuilder.addServerTelemetry(this.serverTelemetryManager);
                        }
                        // add code_verifier if passed
                        if (request.codeVerifier) {
                            parameterBuilder.addCodeVerifier(request.codeVerifier);
                        }
                        if (this.config.clientCredentials.clientSecret) {
                            parameterBuilder.addClientSecret(this.config.clientCredentials.clientSecret);
                        }
                        if (this.config.clientCredentials.clientAssertion) {
                            clientAssertion = this.config.clientCredentials.clientAssertion;
                            parameterBuilder.addClientAssertion(clientAssertion.assertion);
                            parameterBuilder.addClientAssertionType(clientAssertion.assertionType);
                        }
                        parameterBuilder.addGrantType(GrantType.AUTHORIZATION_CODE_GRANT);
                        parameterBuilder.addClientInfo();
                        if (!(request.authenticationScheme === AuthenticationScheme.POP)) return [3 /*break*/, 2];
                        popTokenGenerator = new PopTokenGenerator(this.cryptoUtils);
                        return [4 /*yield*/, popTokenGenerator.generateCnf(request)];
                    case 1:
                        reqCnfData = _b.sent();
                        // SPA PoP requires full Base64Url encoded req_cnf string (unhashed)
                        parameterBuilder.addPopToken(reqCnfData.reqCnfString);
                        return [3 /*break*/, 3];
                    case 2:
                        if (request.authenticationScheme === AuthenticationScheme.SSH) {
                            if (request.sshJwk) {
                                parameterBuilder.addSshJwk(request.sshJwk);
                            }
                            else {
                                throw ClientConfigurationError.createMissingSshJwkError();
                            }
                        }
                        _b.label = 3;
                    case 3:
                        correlationId = request.correlationId || this.config.cryptoInterface.createNewGuid();
                        parameterBuilder.addCorrelationId(correlationId);
                        if (!StringUtils.isEmptyObj(request.claims) || this.config.authOptions.clientCapabilities && this.config.authOptions.clientCapabilities.length > 0) {
                            parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);
                        }
                        ccsCred = undefined;
                        if (request.clientInfo) {
                            try {
                                clientInfo = buildClientInfo(request.clientInfo, this.cryptoUtils);
                                ccsCred = {
                                    credential: "" + clientInfo.uid + Separators.CLIENT_INFO_SEPARATOR + clientInfo.utid,
                                    type: CcsCredentialType.HOME_ACCOUNT_ID
                                };
                            }
                            catch (e) {
                                this.logger.verbose("Could not parse client info for CCS Header: " + e);
                            }
                        }
                        else {
                            ccsCred = request.ccsCredential;
                        }
                        // Adds these as parameters in the request instead of headers to prevent CORS preflight request
                        if (this.config.systemOptions.preventCorsPreflight && ccsCred) {
                            switch (ccsCred.type) {
                                case CcsCredentialType.HOME_ACCOUNT_ID:
                                    try {
                                        clientInfo = buildClientInfoFromHomeAccountId(ccsCred.credential);
                                        parameterBuilder.addCcsOid(clientInfo);
                                    }
                                    catch (e) {
                                        this.logger.verbose("Could not parse home account ID for CCS Header: " + e);
                                    }
                                    break;
                                case CcsCredentialType.UPN:
                                    parameterBuilder.addCcsUpn(ccsCred.credential);
                                    break;
                            }
                        }
                        if (request.tokenBodyParameters) {
                            parameterBuilder.addExtraQueryParameters(request.tokenBodyParameters);
                        }
                        // Add hybrid spa parameters if not already provided
                        if (request.enableSpaAuthorizationCode && (!request.tokenBodyParameters || !request.tokenBodyParameters[AADServerParamKeys.RETURN_SPA_CODE])) {
                            parameterBuilder.addExtraQueryParameters((_a = {},
                                _a[AADServerParamKeys.RETURN_SPA_CODE] = "1",
                                _a));
                        }
                        return [2 /*return*/, parameterBuilder.createQueryString()];
                }
            });
        });
    };
    /**
     * This API validates the `AuthorizationCodeUrlRequest` and creates a URL
     * @param request
     */
    AuthorizationCodeClient.prototype.createAuthCodeUrlQueryString = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var parameterBuilder, requestScopes, correlationId, accountSid, accountLoginHintClaim, clientInfo, clientInfo, clientInfo, popTokenGenerator, reqCnfData;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        parameterBuilder = new RequestParameterBuilder();
                        parameterBuilder.addClientId(this.config.authOptions.clientId);
                        requestScopes = __spreadArrays(request.scopes || [], request.extraScopesToConsent || []);
                        parameterBuilder.addScopes(requestScopes);
                        // validate the redirectUri (to be a non null value)
                        parameterBuilder.addRedirectUri(request.redirectUri);
                        correlationId = request.correlationId || this.config.cryptoInterface.createNewGuid();
                        parameterBuilder.addCorrelationId(correlationId);
                        // add response_mode. If not passed in it defaults to query.
                        parameterBuilder.addResponseMode(request.responseMode);
                        // add response_type = code
                        parameterBuilder.addResponseTypeCode();
                        // add library info parameters
                        parameterBuilder.addLibraryInfo(this.config.libraryInfo);
                        parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);
                        // add client_info=1
                        parameterBuilder.addClientInfo();
                        if (request.codeChallenge && request.codeChallengeMethod) {
                            parameterBuilder.addCodeChallengeParams(request.codeChallenge, request.codeChallengeMethod);
                        }
                        if (request.prompt) {
                            parameterBuilder.addPrompt(request.prompt);
                        }
                        if (request.domainHint) {
                            parameterBuilder.addDomainHint(request.domainHint);
                        }
                        // Add sid or loginHint with preference for login_hint claim (in request) -> sid -> loginHint (upn/email) -> username of AccountInfo object
                        if (request.prompt !== PromptValue.SELECT_ACCOUNT) {
                            // AAD will throw if prompt=select_account is passed with an account hint
                            if (request.sid && request.prompt === PromptValue.NONE) {
                                // SessionID is only used in silent calls
                                this.logger.verbose("createAuthCodeUrlQueryString: Prompt is none, adding sid from request");
                                parameterBuilder.addSid(request.sid);
                            }
                            else if (request.account) {
                                accountSid = this.extractAccountSid(request.account);
                                accountLoginHintClaim = this.extractLoginHint(request.account);
                                // If login_hint claim is present, use it over sid/username
                                if (accountLoginHintClaim) {
                                    this.logger.verbose("createAuthCodeUrlQueryString: login_hint claim present on account");
                                    parameterBuilder.addLoginHint(accountLoginHintClaim);
                                    try {
                                        clientInfo = buildClientInfoFromHomeAccountId(request.account.homeAccountId);
                                        parameterBuilder.addCcsOid(clientInfo);
                                    }
                                    catch (e) {
                                        this.logger.verbose("createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header");
                                    }
                                }
                                else if (accountSid && request.prompt === PromptValue.NONE) {
                                    /*
                                     * If account and loginHint are provided, we will check account first for sid before adding loginHint
                                     * SessionId is only used in silent calls
                                     */
                                    this.logger.verbose("createAuthCodeUrlQueryString: Prompt is none, adding sid from account");
                                    parameterBuilder.addSid(accountSid);
                                    try {
                                        clientInfo = buildClientInfoFromHomeAccountId(request.account.homeAccountId);
                                        parameterBuilder.addCcsOid(clientInfo);
                                    }
                                    catch (e) {
                                        this.logger.verbose("createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header");
                                    }
                                }
                                else if (request.loginHint) {
                                    this.logger.verbose("createAuthCodeUrlQueryString: Adding login_hint from request");
                                    parameterBuilder.addLoginHint(request.loginHint);
                                    parameterBuilder.addCcsUpn(request.loginHint);
                                }
                                else if (request.account.username) {
                                    // Fallback to account username if provided
                                    this.logger.verbose("createAuthCodeUrlQueryString: Adding login_hint from account");
                                    parameterBuilder.addLoginHint(request.account.username);
                                    try {
                                        clientInfo = buildClientInfoFromHomeAccountId(request.account.homeAccountId);
                                        parameterBuilder.addCcsOid(clientInfo);
                                    }
                                    catch (e) {
                                        this.logger.verbose("createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header");
                                    }
                                }
                            }
                            else if (request.loginHint) {
                                this.logger.verbose("createAuthCodeUrlQueryString: No account, adding login_hint from request");
                                parameterBuilder.addLoginHint(request.loginHint);
                                parameterBuilder.addCcsUpn(request.loginHint);
                            }
                        }
                        else {
                            this.logger.verbose("createAuthCodeUrlQueryString: Prompt is select_account, ignoring account hints");
                        }
                        if (request.nonce) {
                            parameterBuilder.addNonce(request.nonce);
                        }
                        if (request.state) {
                            parameterBuilder.addState(request.state);
                        }
                        if (!StringUtils.isEmpty(request.claims) || this.config.authOptions.clientCapabilities && this.config.authOptions.clientCapabilities.length > 0) {
                            parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);
                        }
                        if (request.extraQueryParameters) {
                            parameterBuilder.addExtraQueryParameters(request.extraQueryParameters);
                        }
                        if (!request.nativeBroker) return [3 /*break*/, 2];
                        // signal ests that this is a WAM call
                        parameterBuilder.addNativeBroker();
                        if (!(request.authenticationScheme === AuthenticationScheme.POP)) return [3 /*break*/, 2];
                        popTokenGenerator = new PopTokenGenerator(this.cryptoUtils);
                        return [4 /*yield*/, popTokenGenerator.generateCnf(request)];
                    case 1:
                        reqCnfData = _a.sent();
                        parameterBuilder.addPopToken(reqCnfData.reqCnfHash);
                        _a.label = 2;
                    case 2: return [2 /*return*/, parameterBuilder.createQueryString()];
                }
            });
        });
    };
    /**
     * This API validates the `EndSessionRequest` and creates a URL
     * @param request
     */
    AuthorizationCodeClient.prototype.createLogoutUrlQueryString = function (request) {
        var parameterBuilder = new RequestParameterBuilder();
        if (request.postLogoutRedirectUri) {
            parameterBuilder.addPostLogoutRedirectUri(request.postLogoutRedirectUri);
        }
        if (request.correlationId) {
            parameterBuilder.addCorrelationId(request.correlationId);
        }
        if (request.idTokenHint) {
            parameterBuilder.addIdTokenHint(request.idTokenHint);
        }
        if (request.state) {
            parameterBuilder.addState(request.state);
        }
        if (request.logoutHint) {
            parameterBuilder.addLogoutHint(request.logoutHint);
        }
        if (request.extraQueryParameters) {
            parameterBuilder.addExtraQueryParameters(request.extraQueryParameters);
        }
        return parameterBuilder.createQueryString();
    };
    /**
     * Helper to get sid from account. Returns null if idTokenClaims are not present or sid is not present.
     * @param account
     */
    AuthorizationCodeClient.prototype.extractAccountSid = function (account) {
        var _a;
        return ((_a = account.idTokenClaims) === null || _a === void 0 ? void 0 : _a.sid) || null;
    };
    AuthorizationCodeClient.prototype.extractLoginHint = function (account) {
        var _a;
        return ((_a = account.idTokenClaims) === null || _a === void 0 ? void 0 : _a.login_hint) || null;
    };
    return AuthorizationCodeClient;
}(BaseClient));

export { AuthorizationCodeClient };
//# sourceMappingURL=AuthorizationCodeClient.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __awaiter, __generator } from '../_virtual/_tslib.js';
import { buildClientConfiguration } from '../config/ClientConfiguration.js';
import { NetworkManager } from '../network/NetworkManager.js';
import { Logger } from '../logger/Logger.js';
import { HeaderNames, Constants } from '../utils/Constants.js';
import { name, version } from '../packageMetadata.js';
import { ClientAuthError } from '../error/ClientAuthError.js';
import { CcsCredentialType } from '../account/CcsCredential.js';
import { buildClientInfoFromHomeAccountId } from '../account/ClientInfo.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Base application class which will construct requests to send to and handle responses from the Microsoft STS using the authorization code flow.
 */
var BaseClient = /** @class */ (function () {
    function BaseClient(configuration, performanceClient) {
        // Set the configuration
        this.config = buildClientConfiguration(configuration);
        // Initialize the logger
        this.logger = new Logger(this.config.loggerOptions, name, version);
        // Initialize crypto
        this.cryptoUtils = this.config.cryptoInterface;
        // Initialize storage interface
        this.cacheManager = this.config.storageInterface;
        // Set the network interface
        this.networkClient = this.config.networkInterface;
        // Set the NetworkManager
        this.networkManager = new NetworkManager(this.networkClient, this.cacheManager);
        // Set TelemetryManager
        this.serverTelemetryManager = this.config.serverTelemetryManager;
        // set Authority
        this.authority = this.config.authOptions.authority;
        // set performance telemetry client
        this.performanceClient = performanceClient;
    }
    /**
     * Creates default headers for requests to token endpoint
     */
    BaseClient.prototype.createTokenRequestHeaders = function (ccsCred) {
        var headers = {};
        headers[HeaderNames.CONTENT_TYPE] = Constants.URL_FORM_CONTENT_TYPE;
        if (!this.config.systemOptions.preventCorsPreflight && ccsCred) {
            switch (ccsCred.type) {
                case CcsCredentialType.HOME_ACCOUNT_ID:
                    try {
                        var clientInfo = buildClientInfoFromHomeAccountId(ccsCred.credential);
                        headers[HeaderNames.CCS_HEADER] = "Oid:" + clientInfo.uid + "@" + clientInfo.utid;
                    }
                    catch (e) {
                        this.logger.verbose("Could not parse home account ID for CCS Header: " + e);
                    }
                    break;
                case CcsCredentialType.UPN:
                    headers[HeaderNames.CCS_HEADER] = "UPN: " + ccsCred.credential;
                    break;
            }
        }
        return headers;
    };
    /**
     * Http post to token endpoint
     * @param tokenEndpoint
     * @param queryString
     * @param headers
     * @param thumbprint
     */
    BaseClient.prototype.executePostToTokenEndpoint = function (tokenEndpoint, queryString, headers, thumbprint) {
        return __awaiter(this, void 0, void 0, function () {
            var response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.networkManager.sendPostRequest(thumbprint, tokenEndpoint, { body: queryString, headers: headers, proxyUrl: this.config.systemOptions.proxyUrl })];
                    case 1:
                        response = _a.sent();
                        if (this.config.serverTelemetryManager && response.status < 500 && response.status !== 429) {
                            // Telemetry data successfully logged by server, clear Telemetry cache
                            this.config.serverTelemetryManager.clearTelemetryCache();
                        }
                        return [2 /*return*/, response];
                }
            });
        });
    };
    /**
     * Updates the authority object of the client. Endpoint discovery must be completed.
     * @param updatedAuthority
     */
    BaseClient.prototype.updateAuthority = function (updatedAuthority) {
        if (!updatedAuthority.discoveryComplete()) {
            throw ClientAuthError.createEndpointDiscoveryIncompleteError("Updated authority has not completed endpoint discovery.");
        }
        this.authority = updatedAuthority;
    };
    return BaseClient;
}());

export { BaseClient };
//# sourceMappingURL=BaseClient.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __extends, __awaiter, __generator } from '../_virtual/_tslib.js';
import { BaseClient } from './BaseClient.js';
import { RequestParameterBuilder } from '../request/RequestParameterBuilder.js';
import { ScopeSet } from '../request/ScopeSet.js';
import { Constants, CredentialType, GrantType, CacheOutcome, AuthenticationScheme } from '../utils/Constants.js';
import { ResponseHandler } from '../response/ResponseHandler.js';
import { TimeUtils } from '../utils/TimeUtils.js';
import { StringUtils } from '../utils/StringUtils.js';
import { ClientAuthError } from '../error/ClientAuthError.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * OAuth2.0 client credential grant
 */
var ClientCredentialClient = /** @class */ (function (_super) {
    __extends(ClientCredentialClient, _super);
    function ClientCredentialClient(configuration, appTokenProvider) {
        var _this = _super.call(this, configuration) || this;
        _this.appTokenProvider = appTokenProvider;
        return _this;
    }
    /**
     * Public API to acquire a token with ClientCredential Flow for Confidential clients
     * @param request
     */
    ClientCredentialClient.prototype.acquireToken = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var cachedAuthenticationResult;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.scopeSet = new ScopeSet(request.scopes || []);
                        if (!request.skipCache) return [3 /*break*/, 2];
                        return [4 /*yield*/, this.executeTokenRequest(request, this.authority)];
                    case 1: return [2 /*return*/, _a.sent()];
                    case 2: return [4 /*yield*/, this.getCachedAuthenticationResult(request)];
                    case 3:
                        cachedAuthenticationResult = _a.sent();
                        if (!cachedAuthenticationResult) return [3 /*break*/, 4];
                        return [2 /*return*/, cachedAuthenticationResult];
                    case 4: return [4 /*yield*/, this.executeTokenRequest(request, this.authority)];
                    case 5: return [2 /*return*/, _a.sent()];
                }
            });
        });
    };
    /**
     * looks up cache if the tokens are cached already
     */
    ClientCredentialClient.prototype.getCachedAuthenticationResult = function (request) {
        var _a, _b;
        return __awaiter(this, void 0, void 0, function () {
            var cachedAccessToken;
            return __generator(this, function (_c) {
                switch (_c.label) {
                    case 0:
                        cachedAccessToken = this.readAccessTokenFromCache();
                        if (!cachedAccessToken) {
                            (_a = this.serverTelemetryManager) === null || _a === void 0 ? void 0 : _a.setCacheOutcome(CacheOutcome.NO_CACHED_ACCESS_TOKEN);
                            return [2 /*return*/, null];
                        }
                        if (TimeUtils.isTokenExpired(cachedAccessToken.expiresOn, this.config.systemOptions.tokenRenewalOffsetSeconds)) {
                            (_b = this.serverTelemetryManager) === null || _b === void 0 ? void 0 : _b.setCacheOutcome(CacheOutcome.CACHED_ACCESS_TOKEN_EXPIRED);
                            return [2 /*return*/, null];
                        }
                        return [4 /*yield*/, ResponseHandler.generateAuthenticationResult(this.cryptoUtils, this.authority, {
                                account: null,
                                idToken: null,
                                accessToken: cachedAccessToken,
                                refreshToken: null,
                                appMetadata: null
                            }, true, request)];
                    case 1: return [2 /*return*/, _c.sent()];
                }
            });
        });
    };
    /**
     * Reads access token from the cache
     * TODO: Move this call to cacheManager instead
     */
    ClientCredentialClient.prototype.readAccessTokenFromCache = function () {
        var accessTokenFilter = {
            homeAccountId: Constants.EMPTY_STRING,
            environment: this.authority.canonicalAuthorityUrlComponents.HostNameAndPort,
            credentialType: CredentialType.ACCESS_TOKEN,
            clientId: this.config.authOptions.clientId,
            realm: this.authority.tenant,
            target: this.scopeSet.printScopesLowerCase()
        };
        var credentialCache = this.cacheManager.getCredentialsFilteredBy(accessTokenFilter);
        var accessTokens = Object.keys(credentialCache.accessTokens).map(function (key) { return credentialCache.accessTokens[key]; });
        if (accessTokens.length < 1) {
            return null;
        }
        else if (accessTokens.length > 1) {
            throw ClientAuthError.createMultipleMatchingTokensInCacheError();
        }
        return accessTokens[0];
    };
    /**
     * Makes a network call to request the token from the service
     * @param request
     * @param authority
     */
    ClientCredentialClient.prototype.executeTokenRequest = function (request, authority) {
        return __awaiter(this, void 0, void 0, function () {
            var serverTokenResponse, reqTimestamp, appTokenPropviderParameters, appTokenProviderResult, requestBody, headers, thumbprint, response, responseHandler, tokenResponse;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        if (!this.appTokenProvider) return [3 /*break*/, 2];
                        this.logger.info("Using appTokenProvider extensibility.");
                        appTokenPropviderParameters = {
                            correlationId: request.correlationId,
                            tenantId: this.config.authOptions.authority.tenant,
                            scopes: request.scopes,
                            claims: request.claims,
                        };
                        reqTimestamp = TimeUtils.nowSeconds();
                        return [4 /*yield*/, this.appTokenProvider(appTokenPropviderParameters)];
                    case 1:
                        appTokenProviderResult = _a.sent();
                        serverTokenResponse = {
                            access_token: appTokenProviderResult.accessToken,
                            expires_in: appTokenProviderResult.expiresInSeconds,
                            refresh_in: appTokenProviderResult.refreshInSeconds,
                            token_type: AuthenticationScheme.BEARER
                        };
                        return [3 /*break*/, 4];
                    case 2:
                        requestBody = this.createTokenRequestBody(request);
                        headers = this.createTokenRequestHeaders();
                        thumbprint = {
                            clientId: this.config.authOptions.clientId,
                            authority: request.authority,
                            scopes: request.scopes,
                            claims: request.claims,
                            authenticationScheme: request.authenticationScheme,
                            resourceRequestMethod: request.resourceRequestMethod,
                            resourceRequestUri: request.resourceRequestUri,
                            shrClaims: request.shrClaims,
                            sshKid: request.sshKid
                        };
                        reqTimestamp = TimeUtils.nowSeconds();
                        return [4 /*yield*/, this.executePostToTokenEndpoint(authority.tokenEndpoint, requestBody, headers, thumbprint)];
                    case 3:
                        response = _a.sent();
                        serverTokenResponse = response.body;
                        _a.label = 4;
                    case 4:
                        responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, this.config.serializableCache, this.config.persistencePlugin);
                        responseHandler.validateTokenResponse(serverTokenResponse);
                        return [4 /*yield*/, responseHandler.handleServerTokenResponse(serverTokenResponse, this.authority, reqTimestamp, request)];
                    case 5:
                        tokenResponse = _a.sent();
                        return [2 /*return*/, tokenResponse];
                }
            });
        });
    };
    /**
     * generate the request to the server in the acceptable format
     * @param request
     */
    ClientCredentialClient.prototype.createTokenRequestBody = function (request) {
        var parameterBuilder = new RequestParameterBuilder();
        parameterBuilder.addClientId(this.config.authOptions.clientId);
        parameterBuilder.addScopes(request.scopes, false);
        parameterBuilder.addGrantType(GrantType.CLIENT_CREDENTIALS_GRANT);
        parameterBuilder.addLibraryInfo(this.config.libraryInfo);
        parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);
        parameterBuilder.addThrottling();
        if (this.serverTelemetryManager) {
            parameterBuilder.addServerTelemetry(this.serverTelemetryManager);
        }
        var correlationId = request.correlationId || this.config.cryptoInterface.createNewGuid();
        parameterBuilder.addCorrelationId(correlationId);
        if (this.config.clientCredentials.clientSecret) {
            parameterBuilder.addClientSecret(this.config.clientCredentials.clientSecret);
        }
        // Use clientAssertion from request, fallback to client assertion in base configuration
        var clientAssertion = request.clientAssertion || this.config.clientCredentials.clientAssertion;
        if (clientAssertion) {
            parameterBuilder.addClientAssertion(clientAssertion.assertion);
            parameterBuilder.addClientAssertionType(clientAssertion.assertionType);
        }
        if (!StringUtils.isEmptyObj(request.claims) || this.config.authOptions.clientCapabilities && this.config.authOptions.clientCapabilities.length > 0) {
            parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);
        }
        return parameterBuilder.createQueryString();
    };
    return ClientCredentialClient;
}(BaseClient));

export { ClientCredentialClient };
//# sourceMappingURL=ClientCredentialClient.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __extends, __awaiter, __generator } from '../_virtual/_tslib.js';
import { BaseClient } from './BaseClient.js';
import { ClientAuthError } from '../error/ClientAuthError.js';
import { RequestParameterBuilder } from '../request/RequestParameterBuilder.js';
import { GrantType, Constants } from '../utils/Constants.js';
import { TimeUtils } from '../utils/TimeUtils.js';
import { ResponseHandler } from '../response/ResponseHandler.js';
import { StringUtils } from '../utils/StringUtils.js';
import { ServerError } from '../error/ServerError.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * OAuth2.0 Device code client
 */
var DeviceCodeClient = /** @class */ (function (_super) {
    __extends(DeviceCodeClient, _super);
    function DeviceCodeClient(configuration) {
        return _super.call(this, configuration) || this;
    }
    /**
     * Gets device code from device code endpoint, calls back to with device code response, and
     * polls token endpoint to exchange device code for tokens
     * @param request
     */
    DeviceCodeClient.prototype.acquireToken = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var deviceCodeResponse, reqTimestamp, response, responseHandler;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.getDeviceCode(request)];
                    case 1:
                        deviceCodeResponse = _a.sent();
                        request.deviceCodeCallback(deviceCodeResponse);
                        reqTimestamp = TimeUtils.nowSeconds();
                        return [4 /*yield*/, this.acquireTokenWithDeviceCode(request, deviceCodeResponse)];
                    case 2:
                        response = _a.sent();
                        responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, this.config.serializableCache, this.config.persistencePlugin);
                        // Validate response. This function throws a server error if an error is returned by the server.
                        responseHandler.validateTokenResponse(response);
                        return [4 /*yield*/, responseHandler.handleServerTokenResponse(response, this.authority, reqTimestamp, request)];
                    case 3: return [2 /*return*/, _a.sent()];
                }
            });
        });
    };
    /**
     * Creates device code request and executes http GET
     * @param request
     */
    DeviceCodeClient.prototype.getDeviceCode = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var queryString, headers, thumbprint;
            return __generator(this, function (_a) {
                queryString = this.createQueryString(request);
                headers = this.createTokenRequestHeaders();
                thumbprint = {
                    clientId: this.config.authOptions.clientId,
                    authority: request.authority,
                    scopes: request.scopes,
                    claims: request.claims,
                    authenticationScheme: request.authenticationScheme,
                    resourceRequestMethod: request.resourceRequestMethod,
                    resourceRequestUri: request.resourceRequestUri,
                    shrClaims: request.shrClaims,
                    sshKid: request.sshKid
                };
                return [2 /*return*/, this.executePostRequestToDeviceCodeEndpoint(this.authority.deviceCodeEndpoint, queryString, headers, thumbprint)];
            });
        });
    };
    /**
     * Executes POST request to device code endpoint
     * @param deviceCodeEndpoint
     * @param queryString
     * @param headers
     */
    DeviceCodeClient.prototype.executePostRequestToDeviceCodeEndpoint = function (deviceCodeEndpoint, queryString, headers, thumbprint) {
        return __awaiter(this, void 0, void 0, function () {
            var _a, userCode, deviceCode, verificationUri, expiresIn, interval, message;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0: return [4 /*yield*/, this.networkManager.sendPostRequest(thumbprint, deviceCodeEndpoint, {
                            body: queryString,
                            headers: headers,
                            proxyUrl: this.config.systemOptions.proxyUrl
                        })];
                    case 1:
                        _a = (_b.sent()).body, userCode = _a.user_code, deviceCode = _a.device_code, verificationUri = _a.verification_uri, expiresIn = _a.expires_in, interval = _a.interval, message = _a.message;
                        return [2 /*return*/, {
                                userCode: userCode,
                                deviceCode: deviceCode,
                                verificationUri: verificationUri,
                                expiresIn: expiresIn,
                                interval: interval,
                                message: message
                            }];
                }
            });
        });
    };
    /**
     * Create device code endpoint query parameters and returns string
     */
    DeviceCodeClient.prototype.createQueryString = function (request) {
        var parameterBuilder = new RequestParameterBuilder();
        parameterBuilder.addScopes(request.scopes);
        parameterBuilder.addClientId(this.config.authOptions.clientId);
        if (!StringUtils.isEmpty(request.claims) || this.config.authOptions.clientCapabilities && this.config.authOptions.clientCapabilities.length > 0) {
            parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);
        }
        return parameterBuilder.createQueryString();
    };
    /**
     * Breaks the polling with specific conditions.
     * @param request CommonDeviceCodeRequest
     * @param deviceCodeResponse DeviceCodeResponse
     */
    DeviceCodeClient.prototype.continuePolling = function (deviceCodeExpirationTime, userSpecifiedTimeout, userSpecifiedCancelFlag) {
        if (userSpecifiedCancelFlag) {
            this.logger.error("Token request cancelled by setting DeviceCodeRequest.cancel = true");
            throw ClientAuthError.createDeviceCodeCancelledError();
        }
        else if (userSpecifiedTimeout && userSpecifiedTimeout < deviceCodeExpirationTime && TimeUtils.nowSeconds() > userSpecifiedTimeout) {
            this.logger.error("User defined timeout for device code polling reached. The timeout was set for " + userSpecifiedTimeout);
            throw ClientAuthError.createUserTimeoutReachedError();
        }
        else if (TimeUtils.nowSeconds() > deviceCodeExpirationTime) {
            if (userSpecifiedTimeout) {
                this.logger.verbose("User specified timeout ignored as the device code has expired before the timeout elapsed. The user specified timeout was set for " + userSpecifiedTimeout);
            }
            this.logger.error("Device code expired. Expiration time of device code was " + deviceCodeExpirationTime);
            throw ClientAuthError.createDeviceCodeExpiredError();
        }
        return true;
    };
    /**
     * Creates token request with device code response and polls token endpoint at interval set by the device code
     * response
     * @param request
     * @param deviceCodeResponse
     */
    DeviceCodeClient.prototype.acquireTokenWithDeviceCode = function (request, deviceCodeResponse) {
        return __awaiter(this, void 0, void 0, function () {
            var requestBody, headers, userSpecifiedTimeout, deviceCodeExpirationTime, pollingIntervalMilli, thumbprint, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        requestBody = this.createTokenRequestBody(request, deviceCodeResponse);
                        headers = this.createTokenRequestHeaders();
                        userSpecifiedTimeout = request.timeout ? TimeUtils.nowSeconds() + request.timeout : undefined;
                        deviceCodeExpirationTime = TimeUtils.nowSeconds() + deviceCodeResponse.expiresIn;
                        pollingIntervalMilli = deviceCodeResponse.interval * 1000;
                        _a.label = 1;
                    case 1:
                        if (!this.continuePolling(deviceCodeExpirationTime, userSpecifiedTimeout, request.cancel)) return [3 /*break*/, 8];
                        thumbprint = {
                            clientId: this.config.authOptions.clientId,
                            authority: request.authority,
                            scopes: request.scopes,
                            claims: request.claims,
                            authenticationScheme: request.authenticationScheme,
                            resourceRequestMethod: request.resourceRequestMethod,
                            resourceRequestUri: request.resourceRequestUri,
                            shrClaims: request.shrClaims,
                            sshKid: request.sshKid
                        };
                        return [4 /*yield*/, this.executePostToTokenEndpoint(this.authority.tokenEndpoint, requestBody, headers, thumbprint)];
                    case 2:
                        response = _a.sent();
                        if (!(response.body && response.body.error)) return [3 /*break*/, 6];
                        if (!(response.body.error === Constants.AUTHORIZATION_PENDING)) return [3 /*break*/, 4];
                        this.logger.info("Authorization pending. Continue polling.");
                        return [4 /*yield*/, TimeUtils.delay(pollingIntervalMilli)];
                    case 3:
                        _a.sent();
                        return [3 /*break*/, 5];
                    case 4:
                        // for any other error, throw
                        this.logger.info("Unexpected error in polling from the server");
                        throw ServerError.createPostRequestFailed(response.body.error);
                    case 5: return [3 /*break*/, 7];
                    case 6:
                        this.logger.verbose("Authorization completed successfully. Polling stopped.");
                        return [2 /*return*/, response.body];
                    case 7: return [3 /*break*/, 1];
                    case 8:
                        /*
                         * The above code should've thrown by this point, but to satisfy TypeScript,
                         * and in the rare case the conditionals in continuePolling() may not catch everything...
                         */
                        this.logger.error("Polling stopped for unknown reasons.");
                        throw ClientAuthError.createDeviceCodeUnknownError();
                }
            });
        });
    };
    /**
     * Creates query parameters and converts to string.
     * @param request
     * @param deviceCodeResponse
     */
    DeviceCodeClient.prototype.createTokenRequestBody = function (request, deviceCodeResponse) {
        var requestParameters = new RequestParameterBuilder();
        requestParameters.addScopes(request.scopes);
        requestParameters.addClientId(this.config.authOptions.clientId);
        requestParameters.addGrantType(GrantType.DEVICE_CODE_GRANT);
        requestParameters.addDeviceCode(deviceCodeResponse.deviceCode);
        var correlationId = request.correlationId || this.config.cryptoInterface.createNewGuid();
        requestParameters.addCorrelationId(correlationId);
        requestParameters.addClientInfo();
        requestParameters.addLibraryInfo(this.config.libraryInfo);
        requestParameters.addApplicationTelemetry(this.config.telemetry.application);
        requestParameters.addThrottling();
        if (this.serverTelemetryManager) {
            requestParameters.addServerTelemetry(this.serverTelemetryManager);
        }
        if (!StringUtils.isEmptyObj(request.claims) || this.config.authOptions.clientCapabilities && this.config.authOptions.clientCapabilities.length > 0) {
            requestParameters.addClaims(request.claims, this.config.authOptions.clientCapabilities);
        }
        return requestParameters.createQueryString();
    };
    return DeviceCodeClient;
}(BaseClient));

export { DeviceCodeClient };
//# sourceMappingURL=DeviceCodeClient.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __extends, __awaiter, __generator } from '../_virtual/_tslib.js';
import { BaseClient } from './BaseClient.js';
import { RequestParameterBuilder } from '../request/RequestParameterBuilder.js';
import { ScopeSet } from '../request/ScopeSet.js';
import { AuthenticationScheme, CredentialType, GrantType, AADServerParamKeys, CacheOutcome, Constants } from '../utils/Constants.js';
import { ResponseHandler } from '../response/ResponseHandler.js';
import { TimeUtils } from '../utils/TimeUtils.js';
import { AuthToken } from '../account/AuthToken.js';
import { ClientAuthError } from '../error/ClientAuthError.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * On-Behalf-Of client
 */
var OnBehalfOfClient = /** @class */ (function (_super) {
    __extends(OnBehalfOfClient, _super);
    function OnBehalfOfClient(configuration) {
        return _super.call(this, configuration) || this;
    }
    /**
     * Public API to acquire tokens with on behalf of flow
     * @param request
     */
    OnBehalfOfClient.prototype.acquireToken = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var _a;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        this.scopeSet = new ScopeSet(request.scopes || []);
                        // generate the user_assertion_hash for OBOAssertion
                        _a = this;
                        return [4 /*yield*/, this.cryptoUtils.hashString(request.oboAssertion)];
                    case 1:
                        // generate the user_assertion_hash for OBOAssertion
                        _a.userAssertionHash = _b.sent();
                        if (!request.skipCache) return [3 /*break*/, 3];
                        return [4 /*yield*/, this.executeTokenRequest(request, this.authority, this.userAssertionHash)];
                    case 2: return [2 /*return*/, _b.sent()];
                    case 3:
                        _b.trys.push([3, 5, , 7]);
                        return [4 /*yield*/, this.getCachedAuthenticationResult(request)];
                    case 4: return [2 /*return*/, _b.sent()];
                    case 5:
                        _b.sent();
                        return [4 /*yield*/, this.executeTokenRequest(request, this.authority, this.userAssertionHash)];
                    case 6: 
                    // Any failure falls back to interactive request, once we implement distributed cache, we plan to handle `createRefreshRequiredError` to refresh using the RT
                    return [2 /*return*/, _b.sent()];
                    case 7: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * look up cache for tokens
     * Find idtoken in the cache
     * Find accessToken based on user assertion and account info in the cache
     * Please note we are not yet supported OBO tokens refreshed with long lived RT. User will have to send a new assertion if the current access token expires
     * This is to prevent security issues when the assertion changes over time, however, longlived RT helps retaining the session
     * @param request
     */
    OnBehalfOfClient.prototype.getCachedAuthenticationResult = function (request) {
        var _a, _b;
        return __awaiter(this, void 0, void 0, function () {
            var cachedAccessToken, cachedIdToken, idTokenObject, cachedAccount, localAccountId, accountInfo;
            return __generator(this, function (_c) {
                switch (_c.label) {
                    case 0:
                        cachedAccessToken = this.readAccessTokenFromCacheForOBO(this.config.authOptions.clientId, request);
                        if (!cachedAccessToken) {
                            // Must refresh due to non-existent access_token.
                            (_a = this.serverTelemetryManager) === null || _a === void 0 ? void 0 : _a.setCacheOutcome(CacheOutcome.NO_CACHED_ACCESS_TOKEN);
                            this.logger.info("SilentFlowClient:acquireCachedToken - No access token found in cache for the given properties.");
                            throw ClientAuthError.createRefreshRequiredError();
                        }
                        else if (TimeUtils.isTokenExpired(cachedAccessToken.expiresOn, this.config.systemOptions.tokenRenewalOffsetSeconds)) {
                            // Access token expired, will need to renewed
                            (_b = this.serverTelemetryManager) === null || _b === void 0 ? void 0 : _b.setCacheOutcome(CacheOutcome.CACHED_ACCESS_TOKEN_EXPIRED);
                            this.logger.info("OnbehalfofFlow:getCachedAuthenticationResult - Cached access token is expired or will expire within " + this.config.systemOptions.tokenRenewalOffsetSeconds + " seconds.");
                            throw ClientAuthError.createRefreshRequiredError();
                        }
                        cachedIdToken = this.readIdTokenFromCacheForOBO(request, cachedAccessToken.homeAccountId);
                        cachedAccount = null;
                        if (cachedIdToken) {
                            idTokenObject = new AuthToken(cachedIdToken.secret, this.config.cryptoInterface);
                            localAccountId = idTokenObject.claims.oid ? idTokenObject.claims.oid : idTokenObject.claims.sub;
                            accountInfo = {
                                homeAccountId: cachedIdToken.homeAccountId,
                                environment: cachedIdToken.environment,
                                tenantId: cachedIdToken.realm,
                                username: Constants.EMPTY_STRING,
                                localAccountId: localAccountId || Constants.EMPTY_STRING
                            };
                            cachedAccount = this.cacheManager.readAccountFromCache(accountInfo);
                        }
                        // increment telemetry cache hit counter
                        if (this.config.serverTelemetryManager) {
                            this.config.serverTelemetryManager.incrementCacheHits();
                        }
                        return [4 /*yield*/, ResponseHandler.generateAuthenticationResult(this.cryptoUtils, this.authority, {
                                account: cachedAccount,
                                accessToken: cachedAccessToken,
                                idToken: cachedIdToken,
                                refreshToken: null,
                                appMetadata: null
                            }, true, request, idTokenObject)];
                    case 1: return [2 /*return*/, _c.sent()];
                }
            });
        });
    };
    /**
     * read idtoken from cache, this is a specific implementation for OBO as the requirements differ from a generic lookup in the cacheManager
     * Certain use cases of OBO flow do not expect an idToken in the cache/or from the service
     * @param request
     */
    OnBehalfOfClient.prototype.readIdTokenFromCacheForOBO = function (request, atHomeAccountId) {
        var idTokenFilter = {
            homeAccountId: atHomeAccountId,
            environment: this.authority.canonicalAuthorityUrlComponents.HostNameAndPort,
            credentialType: CredentialType.ID_TOKEN,
            clientId: this.config.authOptions.clientId,
            realm: this.authority.tenant
        };
        var credentialCache = this.cacheManager.getCredentialsFilteredBy(idTokenFilter);
        var idTokens = Object.keys(credentialCache.idTokens).map(function (key) { return credentialCache.idTokens[key]; });
        // When acquiring a token on behalf of an application, there might not be an id token in the cache
        if (idTokens.length < 1) {
            return null;
        }
        return idTokens[0];
    };
    /**
     * Fetches the cached access token based on incoming assertion
     * @param clientId
     * @param request
     * @param userAssertionHash
     */
    OnBehalfOfClient.prototype.readAccessTokenFromCacheForOBO = function (clientId, request) {
        var authScheme = request.authenticationScheme || AuthenticationScheme.BEARER;
        /*
         * Distinguish between Bearer and PoP/SSH token cache types
         * Cast to lowercase to handle "bearer" from ADFS
         */
        var credentialType = (authScheme && authScheme.toLowerCase() !== AuthenticationScheme.BEARER.toLowerCase()) ? CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME : CredentialType.ACCESS_TOKEN;
        var accessTokenFilter = {
            credentialType: credentialType,
            clientId: clientId,
            target: this.scopeSet.printScopesLowerCase(),
            tokenType: authScheme,
            keyId: request.sshKid,
            requestedClaimsHash: request.requestedClaimsHash,
            userAssertionHash: this.userAssertionHash
        };
        var credentialCache = this.cacheManager.getCredentialsFilteredBy(accessTokenFilter);
        var accessTokens = Object.keys(credentialCache.accessTokens).map(function (key) { return credentialCache.accessTokens[key]; });
        var numAccessTokens = accessTokens.length;
        if (numAccessTokens < 1) {
            return null;
        }
        else if (numAccessTokens > 1) {
            throw ClientAuthError.createMultipleMatchingTokensInCacheError();
        }
        return accessTokens[0];
    };
    /**
     * Make a network call to the server requesting credentials
     * @param request
     * @param authority
     */
    OnBehalfOfClient.prototype.executeTokenRequest = function (request, authority, userAssertionHash) {
        return __awaiter(this, void 0, void 0, function () {
            var requestBody, headers, thumbprint, reqTimestamp, response, responseHandler, tokenResponse;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        requestBody = this.createTokenRequestBody(request);
                        headers = this.createTokenRequestHeaders();
                        thumbprint = {
                            clientId: this.config.authOptions.clientId,
                            authority: request.authority,
                            scopes: request.scopes,
                            claims: request.claims,
                            authenticationScheme: request.authenticationScheme,
                            resourceRequestMethod: request.resourceRequestMethod,
                            resourceRequestUri: request.resourceRequestUri,
                            shrClaims: request.shrClaims,
                            sshKid: request.sshKid
                        };
                        reqTimestamp = TimeUtils.nowSeconds();
                        return [4 /*yield*/, this.executePostToTokenEndpoint(authority.tokenEndpoint, requestBody, headers, thumbprint)];
                    case 1:
                        response = _a.sent();
                        responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, this.config.serializableCache, this.config.persistencePlugin);
                        responseHandler.validateTokenResponse(response.body);
                        return [4 /*yield*/, responseHandler.handleServerTokenResponse(response.body, this.authority, reqTimestamp, request, undefined, userAssertionHash)];
                    case 2:
                        tokenResponse = _a.sent();
                        return [2 /*return*/, tokenResponse];
                }
            });
        });
    };
    /**
     * generate a server request in accepable format
     * @param request
     */
    OnBehalfOfClient.prototype.createTokenRequestBody = function (request) {
        var parameterBuilder = new RequestParameterBuilder();
        parameterBuilder.addClientId(this.config.authOptions.clientId);
        parameterBuilder.addScopes(request.scopes);
        parameterBuilder.addGrantType(GrantType.JWT_BEARER);
        parameterBuilder.addClientInfo();
        parameterBuilder.addLibraryInfo(this.config.libraryInfo);
        parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);
        parameterBuilder.addThrottling();
        if (this.serverTelemetryManager) {
            parameterBuilder.addServerTelemetry(this.serverTelemetryManager);
        }
        var correlationId = request.correlationId || this.config.cryptoInterface.createNewGuid();
        parameterBuilder.addCorrelationId(correlationId);
        parameterBuilder.addRequestTokenUse(AADServerParamKeys.ON_BEHALF_OF);
        parameterBuilder.addOboAssertion(request.oboAssertion);
        if (this.config.clientCredentials.clientSecret) {
            parameterBuilder.addClientSecret(this.config.clientCredentials.clientSecret);
        }
        if (this.config.clientCredentials.clientAssertion) {
            var clientAssertion = this.config.clientCredentials.clientAssertion;
            parameterBuilder.addClientAssertion(clientAssertion.assertion);
            parameterBuilder.addClientAssertionType(clientAssertion.assertionType);
        }
        return parameterBuilder.createQueryString();
    };
    return OnBehalfOfClient;
}(BaseClient));

export { OnBehalfOfClient };
//# sourceMappingURL=OnBehalfOfClient.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __extends, __awaiter, __generator, __assign } from '../_virtual/_tslib.js';
import { BaseClient } from './BaseClient.js';
import { RequestParameterBuilder } from '../request/RequestParameterBuilder.js';
import { AuthenticationScheme, GrantType, Errors } from '../utils/Constants.js';
import { ResponseHandler } from '../response/ResponseHandler.js';
import { PopTokenGenerator } from '../crypto/PopTokenGenerator.js';
import { StringUtils } from '../utils/StringUtils.js';
import { ClientConfigurationError } from '../error/ClientConfigurationError.js';
import { ClientAuthError } from '../error/ClientAuthError.js';
import { ServerError } from '../error/ServerError.js';
import { TimeUtils } from '../utils/TimeUtils.js';
import { UrlString } from '../url/UrlString.js';
import { CcsCredentialType } from '../account/CcsCredential.js';
import { buildClientInfoFromHomeAccountId } from '../account/ClientInfo.js';
import { InteractionRequiredAuthError, InteractionRequiredAuthErrorMessage } from '../error/InteractionRequiredAuthError.js';
import { PerformanceEvents } from '../telemetry/performance/PerformanceEvent.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * OAuth2.0 refresh token client
 */
var RefreshTokenClient = /** @class */ (function (_super) {
    __extends(RefreshTokenClient, _super);
    function RefreshTokenClient(configuration, performanceClient) {
        return _super.call(this, configuration, performanceClient) || this;
    }
    RefreshTokenClient.prototype.acquireToken = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var reqTimestamp, response, responseHandler;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        reqTimestamp = TimeUtils.nowSeconds();
                        return [4 /*yield*/, this.executeTokenRequest(request, this.authority)];
                    case 1:
                        response = _a.sent();
                        responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, this.config.serializableCache, this.config.persistencePlugin);
                        responseHandler.validateTokenResponse(response.body);
                        return [2 /*return*/, responseHandler.handleServerTokenResponse(response.body, this.authority, reqTimestamp, request, undefined, undefined, true, request.forceCache)];
                }
            });
        });
    };
    /**
     * Gets cached refresh token and attaches to request, then calls acquireToken API
     * @param request
     */
    RefreshTokenClient.prototype.acquireTokenByRefreshToken = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var isFOCI, noFamilyRTInCache, clientMismatchErrorWithFamilyRT;
            return __generator(this, function (_a) {
                // Cannot renew token if no request object is given.
                if (!request) {
                    throw ClientConfigurationError.createEmptyTokenRequestError();
                }
                // We currently do not support silent flow for account === null use cases; This will be revisited for confidential flow usecases
                if (!request.account) {
                    throw ClientAuthError.createNoAccountInSilentRequestError();
                }
                isFOCI = this.cacheManager.isAppMetadataFOCI(request.account.environment, this.config.authOptions.clientId);
                // if the app is part of the family, retrive a Family refresh token if present and make a refreshTokenRequest
                if (isFOCI) {
                    try {
                        return [2 /*return*/, this.acquireTokenWithCachedRefreshToken(request, true)];
                    }
                    catch (e) {
                        noFamilyRTInCache = e instanceof InteractionRequiredAuthError && e.errorCode === InteractionRequiredAuthErrorMessage.noTokensFoundError.code;
                        clientMismatchErrorWithFamilyRT = e instanceof ServerError && e.errorCode === Errors.INVALID_GRANT_ERROR && e.subError === Errors.CLIENT_MISMATCH_ERROR;
                        // if family Refresh Token (FRT) cache acquisition fails or if client_mismatch error is seen with FRT, reattempt with application Refresh Token (ART)
                        if (noFamilyRTInCache || clientMismatchErrorWithFamilyRT) {
                            return [2 /*return*/, this.acquireTokenWithCachedRefreshToken(request, false)];
                            // throw in all other cases
                        }
                        else {
                            throw e;
                        }
                    }
                }
                // fall back to application refresh token acquisition
                return [2 /*return*/, this.acquireTokenWithCachedRefreshToken(request, false)];
            });
        });
    };
    /**
     * makes a network call to acquire tokens by exchanging RefreshToken available in userCache; throws if refresh token is not cached
     * @param request
     */
    RefreshTokenClient.prototype.acquireTokenWithCachedRefreshToken = function (request, foci) {
        return __awaiter(this, void 0, void 0, function () {
            var refreshToken, refreshTokenRequest;
            return __generator(this, function (_a) {
                refreshToken = this.cacheManager.readRefreshTokenFromCache(this.config.authOptions.clientId, request.account, foci);
                // no refresh Token
                if (!refreshToken) {
                    throw InteractionRequiredAuthError.createNoTokensFoundError();
                }
                refreshTokenRequest = __assign(__assign({}, request), { refreshToken: refreshToken.secret, authenticationScheme: request.authenticationScheme || AuthenticationScheme.BEARER, ccsCredential: {
                        credential: request.account.homeAccountId,
                        type: CcsCredentialType.HOME_ACCOUNT_ID
                    } });
                return [2 /*return*/, this.acquireToken(refreshTokenRequest)];
            });
        });
    };
    /**
     * Constructs the network message and makes a NW call to the underlying secure token service
     * @param request
     * @param authority
     */
    RefreshTokenClient.prototype.executeTokenRequest = function (request, authority) {
        var _a;
        return __awaiter(this, void 0, void 0, function () {
            var acquireTokenMeasurement, requestBody, queryParameters, headers, thumbprint, endpoint;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        acquireTokenMeasurement = (_a = this.performanceClient) === null || _a === void 0 ? void 0 : _a.startMeasurement(PerformanceEvents.RefreshTokenClientExecuteTokenRequest, request.correlationId);
                        return [4 /*yield*/, this.createTokenRequestBody(request)];
                    case 1:
                        requestBody = _b.sent();
                        queryParameters = this.createTokenQueryParameters(request);
                        headers = this.createTokenRequestHeaders(request.ccsCredential);
                        thumbprint = {
                            clientId: this.config.authOptions.clientId,
                            authority: authority.canonicalAuthority,
                            scopes: request.scopes,
                            claims: request.claims,
                            authenticationScheme: request.authenticationScheme,
                            resourceRequestMethod: request.resourceRequestMethod,
                            resourceRequestUri: request.resourceRequestUri,
                            shrClaims: request.shrClaims,
                            sshKid: request.sshKid
                        };
                        endpoint = UrlString.appendQueryString(authority.tokenEndpoint, queryParameters);
                        return [2 /*return*/, this.executePostToTokenEndpoint(endpoint, requestBody, headers, thumbprint)
                                .then(function (result) {
                                acquireTokenMeasurement === null || acquireTokenMeasurement === void 0 ? void 0 : acquireTokenMeasurement.endMeasurement({
                                    success: true
                                });
                                return result;
                            })
                                .catch(function (error) {
                                acquireTokenMeasurement === null || acquireTokenMeasurement === void 0 ? void 0 : acquireTokenMeasurement.endMeasurement({
                                    success: false
                                });
                                throw error;
                            })];
                }
            });
        });
    };
    /**
     * Creates query string for the /token request
     * @param request
     */
    RefreshTokenClient.prototype.createTokenQueryParameters = function (request) {
        var parameterBuilder = new RequestParameterBuilder();
        if (request.tokenQueryParameters) {
            parameterBuilder.addExtraQueryParameters(request.tokenQueryParameters);
        }
        return parameterBuilder.createQueryString();
    };
    /**
     * Helper function to create the token request body
     * @param request
     */
    RefreshTokenClient.prototype.createTokenRequestBody = function (request) {
        var _a;
        return __awaiter(this, void 0, void 0, function () {
            var correlationId, acquireTokenMeasurement, parameterBuilder, clientAssertion, popTokenGenerator, reqCnfData, clientInfo;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        correlationId = request.correlationId;
                        acquireTokenMeasurement = (_a = this.performanceClient) === null || _a === void 0 ? void 0 : _a.startMeasurement(PerformanceEvents.BaseClientCreateTokenRequestHeaders, correlationId);
                        parameterBuilder = new RequestParameterBuilder();
                        parameterBuilder.addClientId(this.config.authOptions.clientId);
                        parameterBuilder.addScopes(request.scopes);
                        parameterBuilder.addGrantType(GrantType.REFRESH_TOKEN_GRANT);
                        parameterBuilder.addClientInfo();
                        parameterBuilder.addLibraryInfo(this.config.libraryInfo);
                        parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);
                        parameterBuilder.addThrottling();
                        if (this.serverTelemetryManager) {
                            parameterBuilder.addServerTelemetry(this.serverTelemetryManager);
                        }
                        parameterBuilder.addCorrelationId(correlationId);
                        parameterBuilder.addRefreshToken(request.refreshToken);
                        if (this.config.clientCredentials.clientSecret) {
                            parameterBuilder.addClientSecret(this.config.clientCredentials.clientSecret);
                        }
                        if (this.config.clientCredentials.clientAssertion) {
                            clientAssertion = this.config.clientCredentials.clientAssertion;
                            parameterBuilder.addClientAssertion(clientAssertion.assertion);
                            parameterBuilder.addClientAssertionType(clientAssertion.assertionType);
                        }
                        if (!(request.authenticationScheme === AuthenticationScheme.POP)) return [3 /*break*/, 2];
                        popTokenGenerator = new PopTokenGenerator(this.cryptoUtils);
                        return [4 /*yield*/, popTokenGenerator.generateCnf(request)];
                    case 1:
                        reqCnfData = _b.sent();
                        // SPA PoP requires full Base64Url encoded req_cnf string (unhashed)
                        parameterBuilder.addPopToken(reqCnfData.reqCnfString);
                        return [3 /*break*/, 3];
                    case 2:
                        if (request.authenticationScheme === AuthenticationScheme.SSH) {
                            if (request.sshJwk) {
                                parameterBuilder.addSshJwk(request.sshJwk);
                            }
                            else {
                                acquireTokenMeasurement === null || acquireTokenMeasurement === void 0 ? void 0 : acquireTokenMeasurement.endMeasurement({
                                    success: false
                                });
                                throw ClientConfigurationError.createMissingSshJwkError();
                            }
                        }
                        _b.label = 3;
                    case 3:
                        if (!StringUtils.isEmptyObj(request.claims) || this.config.authOptions.clientCapabilities && this.config.authOptions.clientCapabilities.length > 0) {
                            parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);
                        }
                        if (this.config.systemOptions.preventCorsPreflight && request.ccsCredential) {
                            switch (request.ccsCredential.type) {
                                case CcsCredentialType.HOME_ACCOUNT_ID:
                                    try {
                                        clientInfo = buildClientInfoFromHomeAccountId(request.ccsCredential.credential);
                                        parameterBuilder.addCcsOid(clientInfo);
                                    }
                                    catch (e) {
                                        this.logger.verbose("Could not parse home account ID for CCS Header: " + e);
                                    }
                                    break;
                                case CcsCredentialType.UPN:
                                    parameterBuilder.addCcsUpn(request.ccsCredential.credential);
                                    break;
                            }
                        }
                        acquireTokenMeasurement === null || acquireTokenMeasurement === void 0 ? void 0 : acquireTokenMeasurement.endMeasurement({
                            success: true
                        });
                        return [2 /*return*/, parameterBuilder.createQueryString()];
                }
            });
        });
    };
    return RefreshTokenClient;
}(BaseClient));

export { RefreshTokenClient };
//# sourceMappingURL=RefreshTokenClient.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __extends, __awaiter, __generator } from '../_virtual/_tslib.js';
import { BaseClient } from './BaseClient.js';
import { AuthToken } from '../account/AuthToken.js';
import { TimeUtils } from '../utils/TimeUtils.js';
import { RefreshTokenClient } from './RefreshTokenClient.js';
import { ClientAuthError, ClientAuthErrorMessage } from '../error/ClientAuthError.js';
import { ClientConfigurationError } from '../error/ClientConfigurationError.js';
import { ResponseHandler } from '../response/ResponseHandler.js';
import { CacheOutcome } from '../utils/Constants.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var SilentFlowClient = /** @class */ (function (_super) {
    __extends(SilentFlowClient, _super);
    function SilentFlowClient(configuration, performanceClient) {
        return _super.call(this, configuration, performanceClient) || this;
    }
    /**
     * Retrieves a token from cache if it is still valid, or uses the cached refresh token to renew
     * the given token and returns the renewed token
     * @param request
     */
    SilentFlowClient.prototype.acquireToken = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var e_1, refreshTokenClient;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        _a.trys.push([0, 2, , 3]);
                        return [4 /*yield*/, this.acquireCachedToken(request)];
                    case 1: return [2 /*return*/, _a.sent()];
                    case 2:
                        e_1 = _a.sent();
                        if (e_1 instanceof ClientAuthError && e_1.errorCode === ClientAuthErrorMessage.tokenRefreshRequired.code) {
                            refreshTokenClient = new RefreshTokenClient(this.config, this.performanceClient);
                            return [2 /*return*/, refreshTokenClient.acquireTokenByRefreshToken(request)];
                        }
                        else {
                            throw e_1;
                        }
                    case 3: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Retrieves token from cache or throws an error if it must be refreshed.
     * @param request
     */
    SilentFlowClient.prototype.acquireCachedToken = function (request) {
        var _a, _b, _c, _d;
        return __awaiter(this, void 0, void 0, function () {
            var environment, cacheRecord;
            return __generator(this, function (_e) {
                switch (_e.label) {
                    case 0:
                        // Cannot renew token if no request object is given.
                        if (!request) {
                            throw ClientConfigurationError.createEmptyTokenRequestError();
                        }
                        if (request.forceRefresh) {
                            // Must refresh due to present force_refresh flag.
                            (_a = this.serverTelemetryManager) === null || _a === void 0 ? void 0 : _a.setCacheOutcome(CacheOutcome.FORCE_REFRESH);
                            this.logger.info("SilentFlowClient:acquireCachedToken - Skipping cache because forceRefresh is true.");
                            throw ClientAuthError.createRefreshRequiredError();
                        }
                        // We currently do not support silent flow for account === null use cases; This will be revisited for confidential flow usecases
                        if (!request.account) {
                            throw ClientAuthError.createNoAccountInSilentRequestError();
                        }
                        environment = request.authority || this.authority.getPreferredCache();
                        cacheRecord = this.cacheManager.readCacheRecord(request.account, this.config.authOptions.clientId, request, environment);
                        if (!cacheRecord.accessToken) {
                            // Must refresh due to non-existent access_token.
                            (_b = this.serverTelemetryManager) === null || _b === void 0 ? void 0 : _b.setCacheOutcome(CacheOutcome.NO_CACHED_ACCESS_TOKEN);
                            this.logger.info("SilentFlowClient:acquireCachedToken - No access token found in cache for the given properties.");
                            throw ClientAuthError.createRefreshRequiredError();
                        }
                        else if (TimeUtils.wasClockTurnedBack(cacheRecord.accessToken.cachedAt) ||
                            TimeUtils.isTokenExpired(cacheRecord.accessToken.expiresOn, this.config.systemOptions.tokenRenewalOffsetSeconds)) {
                            // Must refresh due to expired access_token.
                            (_c = this.serverTelemetryManager) === null || _c === void 0 ? void 0 : _c.setCacheOutcome(CacheOutcome.CACHED_ACCESS_TOKEN_EXPIRED);
                            this.logger.info("SilentFlowClient:acquireCachedToken - Cached access token is expired or will expire within " + this.config.systemOptions.tokenRenewalOffsetSeconds + " seconds.");
                            throw ClientAuthError.createRefreshRequiredError();
                        }
                        else if (cacheRecord.accessToken.refreshOn && TimeUtils.isTokenExpired(cacheRecord.accessToken.refreshOn, 0)) {
                            // Must refresh due to the refresh_in value.
                            (_d = this.serverTelemetryManager) === null || _d === void 0 ? void 0 : _d.setCacheOutcome(CacheOutcome.REFRESH_CACHED_ACCESS_TOKEN);
                            this.logger.info("SilentFlowClient:acquireCachedToken - Cached access token's refreshOn property has been exceeded'.");
                            throw ClientAuthError.createRefreshRequiredError();
                        }
                        if (this.config.serverTelemetryManager) {
                            this.config.serverTelemetryManager.incrementCacheHits();
                        }
                        return [4 /*yield*/, this.generateResultFromCacheRecord(cacheRecord, request)];
                    case 1: return [2 /*return*/, _e.sent()];
                }
            });
        });
    };
    /**
     * Helper function to build response object from the CacheRecord
     * @param cacheRecord
     */
    SilentFlowClient.prototype.generateResultFromCacheRecord = function (cacheRecord, request) {
        return __awaiter(this, void 0, void 0, function () {
            var idTokenObj;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        if (cacheRecord.idToken) {
                            idTokenObj = new AuthToken(cacheRecord.idToken.secret, this.config.cryptoInterface);
                        }
                        return [4 /*yield*/, ResponseHandler.generateAuthenticationResult(this.cryptoUtils, this.authority, cacheRecord, true, request, idTokenObj)];
                    case 1: return [2 /*return*/, _a.sent()];
                }
            });
        });
    };
    return SilentFlowClient;
}(BaseClient));

export { SilentFlowClient };
//# sourceMappingURL=SilentFlowClient.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __extends, __awaiter, __generator } from '../_virtual/_tslib.js';
import { BaseClient } from './BaseClient.js';
import { ResponseHandler } from '../response/ResponseHandler.js';
import { RequestParameterBuilder } from '../request/RequestParameterBuilder.js';
import { GrantType } from '../utils/Constants.js';
import { StringUtils } from '../utils/StringUtils.js';
import { TimeUtils } from '../utils/TimeUtils.js';
import { CcsCredentialType } from '../account/CcsCredential.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Oauth2.0 Password grant client
 * Note: We are only supporting public clients for password grant and for purely testing purposes
 */
var UsernamePasswordClient = /** @class */ (function (_super) {
    __extends(UsernamePasswordClient, _super);
    function UsernamePasswordClient(configuration) {
        return _super.call(this, configuration) || this;
    }
    /**
     * API to acquire a token by passing the username and password to the service in exchage of credentials
     * password_grant
     * @param request
     */
    UsernamePasswordClient.prototype.acquireToken = function (request) {
        return __awaiter(this, void 0, void 0, function () {
            var reqTimestamp, response, responseHandler, tokenResponse;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.logger.info("in acquireToken call");
                        reqTimestamp = TimeUtils.nowSeconds();
                        return [4 /*yield*/, this.executeTokenRequest(this.authority, request)];
                    case 1:
                        response = _a.sent();
                        responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, this.config.serializableCache, this.config.persistencePlugin);
                        // Validate response. This function throws a server error if an error is returned by the server.
                        responseHandler.validateTokenResponse(response.body);
                        tokenResponse = responseHandler.handleServerTokenResponse(response.body, this.authority, reqTimestamp, request);
                        return [2 /*return*/, tokenResponse];
                }
            });
        });
    };
    /**
     * Executes POST request to token endpoint
     * @param authority
     * @param request
     */
    UsernamePasswordClient.prototype.executeTokenRequest = function (authority, request) {
        return __awaiter(this, void 0, void 0, function () {
            var thumbprint, requestBody, headers;
            return __generator(this, function (_a) {
                thumbprint = {
                    clientId: this.config.authOptions.clientId,
                    authority: authority.canonicalAuthority,
                    scopes: request.scopes,
                    claims: request.claims,
                    authenticationScheme: request.authenticationScheme,
                    resourceRequestMethod: request.resourceRequestMethod,
                    resourceRequestUri: request.resourceRequestUri,
                    shrClaims: request.shrClaims,
                    sshKid: request.sshKid
                };
                requestBody = this.createTokenRequestBody(request);
                headers = this.createTokenRequestHeaders({
                    credential: request.username,
                    type: CcsCredentialType.UPN
                });
                return [2 /*return*/, this.executePostToTokenEndpoint(authority.tokenEndpoint, requestBody, headers, thumbprint)];
            });
        });
    };
    /**
     * Generates a map for all the params to be sent to the service
     * @param request
     */
    UsernamePasswordClient.prototype.createTokenRequestBody = function (request) {
        var parameterBuilder = new RequestParameterBuilder();
        parameterBuilder.addClientId(this.config.authOptions.clientId);
        parameterBuilder.addUsername(request.username);
        parameterBuilder.addPassword(request.password);
        parameterBuilder.addScopes(request.scopes);
        parameterBuilder.addResponseTypeForTokenAndIdToken();
        parameterBuilder.addGrantType(GrantType.RESOURCE_OWNER_PASSWORD_GRANT);
        parameterBuilder.addClientInfo();
        parameterBuilder.addLibraryInfo(this.config.libraryInfo);
        parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);
        parameterBuilder.addThrottling();
        if (this.serverTelemetryManager) {
            parameterBuilder.addServerTelemetry(this.serverTelemetryManager);
        }
        var correlationId = request.correlationId || this.config.cryptoInterface.createNewGuid();
        parameterBuilder.addCorrelationId(correlationId);
        if (this.config.clientCredentials.clientSecret) {
            parameterBuilder.addClientSecret(this.config.clientCredentials.clientSecret);
        }
        if (this.config.clientCredentials.clientAssertion) {
            var clientAssertion = this.config.clientCredentials.clientAssertion;
            parameterBuilder.addClientAssertion(clientAssertion.assertion);
            parameterBuilder.addClientAssertionType(clientAssertion.assertionType);
        }
        if (!StringUtils.isEmptyObj(request.claims) || this.config.authOptions.clientCapabilities && this.config.authOptions.clientCapabilities.length > 0) {
            parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);
        }
        if (this.config.systemOptions.preventCorsPreflight && request.username) {
            parameterBuilder.addCcsUpn(request.username);
        }
        return parameterBuilder.createQueryString();
    };
    return UsernamePasswordClient;
}(BaseClient));

export { UsernamePasswordClient };
//# sourceMappingURL=UsernamePasswordClient.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __awaiter, __generator, __extends } from '../_virtual/_tslib.js';
import { Constants, CredentialType, AuthenticationScheme, CacheSchemaType, THE_FAMILY_ID, APP_METADATA, AUTHORITY_METADATA_CONSTANTS } from '../utils/Constants.js';
import { CredentialEntity } from './entities/CredentialEntity.js';
import { ScopeSet } from '../request/ScopeSet.js';
import { AccountEntity } from './entities/AccountEntity.js';
import { AuthError } from '../error/AuthError.js';
import { ClientAuthError } from '../error/ClientAuthError.js';
import { AuthToken } from '../account/AuthToken.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Interface class which implement cache storage functions used by MSAL to perform validity checks, and store tokens.
 */
var CacheManager = /** @class */ (function () {
    function CacheManager(clientId, cryptoImpl) {
        this.clientId = clientId;
        this.cryptoImpl = cryptoImpl;
    }
    /**
     * Returns all accounts in cache
     */
    CacheManager.prototype.getAllAccounts = function () {
        var _this = this;
        var currentAccounts = this.getAccountsFilteredBy();
        var accountValues = Object.keys(currentAccounts).map(function (accountKey) { return currentAccounts[accountKey]; });
        var numAccounts = accountValues.length;
        if (numAccounts < 1) {
            return [];
        }
        else {
            var allAccounts = accountValues.map(function (value) {
                var accountEntity = CacheManager.toObject(new AccountEntity(), value);
                var accountInfo = accountEntity.getAccountInfo();
                var idToken = _this.readIdTokenFromCache(_this.clientId, accountInfo);
                if (idToken && !accountInfo.idTokenClaims) {
                    accountInfo.idTokenClaims = new AuthToken(idToken.secret, _this.cryptoImpl).claims;
                }
                return accountInfo;
            });
            return allAccounts;
        }
    };
    /**
     * saves a cache record
     * @param cacheRecord
     */
    CacheManager.prototype.saveCacheRecord = function (cacheRecord) {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        if (!cacheRecord) {
                            throw ClientAuthError.createNullOrUndefinedCacheRecord();
                        }
                        if (!!cacheRecord.account) {
                            this.setAccount(cacheRecord.account);
                        }
                        if (!!cacheRecord.idToken) {
                            this.setIdTokenCredential(cacheRecord.idToken);
                        }
                        if (!!!cacheRecord.accessToken) return [3 /*break*/, 2];
                        return [4 /*yield*/, this.saveAccessToken(cacheRecord.accessToken)];
                    case 1:
                        _a.sent();
                        _a.label = 2;
                    case 2:
                        if (!!cacheRecord.refreshToken) {
                            this.setRefreshTokenCredential(cacheRecord.refreshToken);
                        }
                        if (!!cacheRecord.appMetadata) {
                            this.setAppMetadata(cacheRecord.appMetadata);
                        }
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * saves access token credential
     * @param credential
     */
    CacheManager.prototype.saveAccessToken = function (credential) {
        return __awaiter(this, void 0, void 0, function () {
            var currentTokenCache, currentScopes, currentAccessTokens, removedAccessTokens_1;
            var _this = this;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        currentTokenCache = this.getCredentialsFilteredBy({
                            clientId: credential.clientId,
                            credentialType: credential.credentialType,
                            environment: credential.environment,
                            homeAccountId: credential.homeAccountId,
                            realm: credential.realm,
                            tokenType: credential.tokenType,
                            requestedClaimsHash: credential.requestedClaimsHash
                        });
                        currentScopes = ScopeSet.fromString(credential.target);
                        currentAccessTokens = Object.keys(currentTokenCache.accessTokens).map(function (key) { return currentTokenCache.accessTokens[key]; });
                        if (!currentAccessTokens) return [3 /*break*/, 2];
                        removedAccessTokens_1 = [];
                        currentAccessTokens.forEach(function (tokenEntity) {
                            var tokenScopeSet = ScopeSet.fromString(tokenEntity.target);
                            if (tokenScopeSet.intersectingScopeSets(currentScopes)) {
                                removedAccessTokens_1.push(_this.removeCredential(tokenEntity));
                            }
                        });
                        return [4 /*yield*/, Promise.all(removedAccessTokens_1)];
                    case 1:
                        _a.sent();
                        _a.label = 2;
                    case 2:
                        this.setAccessTokenCredential(credential);
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * retrieve accounts matching all provided filters; if no filter is set, get all accounts
     * not checking for casing as keys are all generated in lower case, remember to convert to lower case if object properties are compared
     * @param homeAccountId
     * @param environment
     * @param realm
     */
    CacheManager.prototype.getAccountsFilteredBy = function (accountFilter) {
        return this.getAccountsFilteredByInternal(accountFilter ? accountFilter.homeAccountId : Constants.EMPTY_STRING, accountFilter ? accountFilter.environment : Constants.EMPTY_STRING, accountFilter ? accountFilter.realm : Constants.EMPTY_STRING, accountFilter ? accountFilter.nativeAccountId : Constants.EMPTY_STRING);
    };
    /**
     * retrieve accounts matching all provided filters; if no filter is set, get all accounts
     * not checking for casing as keys are all generated in lower case, remember to convert to lower case if object properties are compared
     * @param homeAccountId
     * @param environment
     * @param realm
     */
    CacheManager.prototype.getAccountsFilteredByInternal = function (homeAccountId, environment, realm, nativeAccountId) {
        var _this = this;
        var allCacheKeys = this.getKeys();
        var matchingAccounts = {};
        allCacheKeys.forEach(function (cacheKey) {
            var entity = _this.getAccount(cacheKey);
            if (!entity) {
                return;
            }
            if (!!homeAccountId && !_this.matchHomeAccountId(entity, homeAccountId)) {
                return;
            }
            if (!!environment && !_this.matchEnvironment(entity, environment)) {
                return;
            }
            if (!!realm && !_this.matchRealm(entity, realm)) {
                return;
            }
            if (!!nativeAccountId && !_this.matchNativeAccountId(entity, nativeAccountId)) {
                return;
            }
            matchingAccounts[cacheKey] = entity;
        });
        return matchingAccounts;
    };
    /**
     * retrieve credentails matching all provided filters; if no filter is set, get all credentials
     * @param homeAccountId
     * @param environment
     * @param credentialType
     * @param clientId
     * @param realm
     * @param target
     */
    CacheManager.prototype.getCredentialsFilteredBy = function (filter) {
        return this.getCredentialsFilteredByInternal(filter.homeAccountId, filter.environment, filter.credentialType, filter.clientId, filter.familyId, filter.realm, filter.target, filter.userAssertionHash, filter.tokenType, filter.keyId, filter.requestedClaimsHash);
    };
    /**
     * Support function to help match credentials
     * @param homeAccountId
     * @param environment
     * @param credentialType
     * @param clientId
     * @param realm
     * @param target
     * @param userAssertionHash
     * @param tokenType
     */
    CacheManager.prototype.getCredentialsFilteredByInternal = function (homeAccountId, environment, credentialType, clientId, familyId, realm, target, userAssertionHash, tokenType, keyId, requestedClaimsHash) {
        var _this = this;
        var allCacheKeys = this.getKeys();
        var matchingCredentials = {
            idTokens: {},
            accessTokens: {},
            refreshTokens: {},
        };
        allCacheKeys.forEach(function (cacheKey) {
            // don't parse any non-credential type cache entities
            var credType = CredentialEntity.getCredentialType(cacheKey);
            if (credType === Constants.NOT_DEFINED) {
                return;
            }
            // Attempt retrieval
            var entity = _this.getSpecificCredential(cacheKey, credType);
            if (!entity) {
                return;
            }
            if (!!userAssertionHash && !_this.matchUserAssertionHash(entity, userAssertionHash)) {
                return;
            }
            if (!!homeAccountId && !_this.matchHomeAccountId(entity, homeAccountId)) {
                return;
            }
            if (!!environment && !_this.matchEnvironment(entity, environment)) {
                return;
            }
            if (!!realm && !_this.matchRealm(entity, realm)) {
                return;
            }
            if (!!credentialType && !_this.matchCredentialType(entity, credentialType)) {
                return;
            }
            if (!!clientId && !_this.matchClientId(entity, clientId)) {
                return;
            }
            if (!!familyId && !_this.matchFamilyId(entity, familyId)) {
                return;
            }
            /*
             * idTokens do not have "target", target specific refreshTokens do exist for some types of authentication
             * Resource specific refresh tokens case will be added when the support is deemed necessary
             */
            if (!!target && !_this.matchTarget(entity, target)) {
                return;
            }
            // If request OR cached entity has requested Claims Hash, check if they match
            if (requestedClaimsHash || entity.requestedClaimsHash) {
                // Don't match if either is undefined or they are different
                if (entity.requestedClaimsHash !== requestedClaimsHash) {
                    return;
                }
            }
            // Access Token with Auth Scheme specific matching
            if (credentialType === CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME) {
                if (!!tokenType && !_this.matchTokenType(entity, tokenType)) {
                    return;
                }
                // KeyId (sshKid) in request must match cached SSH certificate keyId because SSH cert is bound to a specific key
                if (tokenType === AuthenticationScheme.SSH) {
                    if (keyId && !_this.matchKeyId(entity, keyId)) {
                        return;
                    }
                }
            }
            // At this point, the entity matches the request, update cache key if key schema has changed
            var updatedCacheKey = _this.updateCredentialCacheKey(cacheKey, entity);
            switch (credType) {
                case CredentialType.ID_TOKEN:
                    matchingCredentials.idTokens[updatedCacheKey] = entity;
                    break;
                case CredentialType.ACCESS_TOKEN:
                case CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME:
                    matchingCredentials.accessTokens[updatedCacheKey] = entity;
                    break;
                case CredentialType.REFRESH_TOKEN:
                    matchingCredentials.refreshTokens[updatedCacheKey] = entity;
                    break;
            }
        });
        return matchingCredentials;
    };
    /**
     * retrieve appMetadata matching all provided filters; if no filter is set, get all appMetadata
     * @param filter
     */
    CacheManager.prototype.getAppMetadataFilteredBy = function (filter) {
        return this.getAppMetadataFilteredByInternal(filter.environment, filter.clientId);
    };
    /**
     * Support function to help match appMetadata
     * @param environment
     * @param clientId
     */
    CacheManager.prototype.getAppMetadataFilteredByInternal = function (environment, clientId) {
        var _this = this;
        var allCacheKeys = this.getKeys();
        var matchingAppMetadata = {};
        allCacheKeys.forEach(function (cacheKey) {
            // don't parse any non-appMetadata type cache entities
            if (!_this.isAppMetadata(cacheKey)) {
                return;
            }
            // Attempt retrieval
            var entity = _this.getAppMetadata(cacheKey);
            if (!entity) {
                return;
            }
            if (!!environment && !_this.matchEnvironment(entity, environment)) {
                return;
            }
            if (!!clientId && !_this.matchClientId(entity, clientId)) {
                return;
            }
            matchingAppMetadata[cacheKey] = entity;
        });
        return matchingAppMetadata;
    };
    /**
     * retrieve authorityMetadata that contains a matching alias
     * @param filter
     */
    CacheManager.prototype.getAuthorityMetadataByAlias = function (host) {
        var _this = this;
        var allCacheKeys = this.getAuthorityMetadataKeys();
        var matchedEntity = null;
        allCacheKeys.forEach(function (cacheKey) {
            // don't parse any non-authorityMetadata type cache entities
            if (!_this.isAuthorityMetadata(cacheKey) || cacheKey.indexOf(_this.clientId) === -1) {
                return;
            }
            // Attempt retrieval
            var entity = _this.getAuthorityMetadata(cacheKey);
            if (!entity) {
                return;
            }
            if (entity.aliases.indexOf(host) === -1) {
                return;
            }
            matchedEntity = entity;
        });
        return matchedEntity;
    };
    /**
     * Removes all accounts and related tokens from cache.
     */
    CacheManager.prototype.removeAllAccounts = function () {
        return __awaiter(this, void 0, void 0, function () {
            var allCacheKeys, removedAccounts;
            var _this = this;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        allCacheKeys = this.getKeys();
                        removedAccounts = [];
                        allCacheKeys.forEach(function (cacheKey) {
                            var entity = _this.getAccount(cacheKey);
                            if (!entity) {
                                return;
                            }
                            removedAccounts.push(_this.removeAccount(cacheKey));
                        });
                        return [4 /*yield*/, Promise.all(removedAccounts)];
                    case 1:
                        _a.sent();
                        return [2 /*return*/, true];
                }
            });
        });
    };
    /**
     * returns a boolean if the given account is removed
     * @param account
     */
    CacheManager.prototype.removeAccount = function (accountKey) {
        return __awaiter(this, void 0, void 0, function () {
            var account;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        account = this.getAccount(accountKey);
                        if (!account) {
                            throw ClientAuthError.createNoAccountFoundError();
                        }
                        return [4 /*yield*/, this.removeAccountContext(account)];
                    case 1: return [2 /*return*/, ((_a.sent()) && this.removeItem(accountKey, CacheSchemaType.ACCOUNT))];
                }
            });
        });
    };
    /**
     * Removes credentials associated with the provided account
     * @param account
     */
    CacheManager.prototype.removeAccountContext = function (account) {
        return __awaiter(this, void 0, void 0, function () {
            var allCacheKeys, accountId, removedCredentials;
            var _this = this;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        allCacheKeys = this.getKeys();
                        accountId = account.generateAccountId();
                        removedCredentials = [];
                        allCacheKeys.forEach(function (cacheKey) {
                            // don't parse any non-credential type cache entities
                            var credType = CredentialEntity.getCredentialType(cacheKey);
                            if (credType === Constants.NOT_DEFINED) {
                                return;
                            }
                            var cacheEntity = _this.getSpecificCredential(cacheKey, credType);
                            if (!!cacheEntity && accountId === cacheEntity.generateAccountId()) {
                                removedCredentials.push(_this.removeCredential(cacheEntity));
                            }
                        });
                        return [4 /*yield*/, Promise.all(removedCredentials)];
                    case 1:
                        _a.sent();
                        return [2 /*return*/, true];
                }
            });
        });
    };
    /**
     * returns a boolean if the given credential is removed
     * @param credential
     */
    CacheManager.prototype.removeCredential = function (credential) {
        return __awaiter(this, void 0, void 0, function () {
            var key, accessTokenWithAuthSchemeEntity, kid;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        key = credential.generateCredentialKey();
                        if (!(credential.credentialType.toLowerCase() === CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME.toLowerCase())) return [3 /*break*/, 4];
                        if (!(credential.tokenType === AuthenticationScheme.POP)) return [3 /*break*/, 4];
                        accessTokenWithAuthSchemeEntity = credential;
                        kid = accessTokenWithAuthSchemeEntity.keyId;
                        if (!kid) return [3 /*break*/, 4];
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        return [4 /*yield*/, this.cryptoImpl.removeTokenBindingKey(kid)];
                    case 2:
                        _a.sent();
                        return [3 /*break*/, 4];
                    case 3:
                        _a.sent();
                        throw ClientAuthError.createBindingKeyNotRemovedError();
                    case 4: return [2 /*return*/, this.removeItem(key, CacheSchemaType.CREDENTIAL)];
                }
            });
        });
    };
    /**
     * Removes all app metadata objects from cache.
     */
    CacheManager.prototype.removeAppMetadata = function () {
        var _this = this;
        var allCacheKeys = this.getKeys();
        allCacheKeys.forEach(function (cacheKey) {
            if (_this.isAppMetadata(cacheKey)) {
                _this.removeItem(cacheKey, CacheSchemaType.APP_METADATA);
            }
        });
        return true;
    };
    /**
     * Retrieve the cached credentials into a cacherecord
     * @param account
     * @param clientId
     * @param scopes
     * @param environment
     * @param authScheme
     */
    CacheManager.prototype.readCacheRecord = function (account, clientId, request, environment) {
        var cachedAccount = this.readAccountFromCache(account);
        var cachedIdToken = this.readIdTokenFromCache(clientId, account);
        var cachedAccessToken = this.readAccessTokenFromCache(clientId, account, request);
        var cachedRefreshToken = this.readRefreshTokenFromCache(clientId, account, false);
        var cachedAppMetadata = this.readAppMetadataFromCache(environment, clientId);
        if (cachedAccount && cachedIdToken) {
            cachedAccount.idTokenClaims = new AuthToken(cachedIdToken.secret, this.cryptoImpl).claims;
        }
        return {
            account: cachedAccount,
            idToken: cachedIdToken,
            accessToken: cachedAccessToken,
            refreshToken: cachedRefreshToken,
            appMetadata: cachedAppMetadata,
        };
    };
    /**
     * Retrieve AccountEntity from cache
     * @param account
     */
    CacheManager.prototype.readAccountFromCache = function (account) {
        var accountKey = AccountEntity.generateAccountCacheKey(account);
        return this.getAccount(accountKey);
    };
    /**
     * Retrieve AccountEntity from cache
     * @param nativeAccountId
     * @returns AccountEntity or Null
     */
    CacheManager.prototype.readAccountFromCacheWithNativeAccountId = function (nativeAccountId) {
        // fetch account from memory
        var accountFilter = {
            nativeAccountId: nativeAccountId
        };
        var accountCache = this.getAccountsFilteredBy(accountFilter);
        var accounts = Object.keys(accountCache).map(function (key) { return accountCache[key]; });
        if (accounts.length < 1) {
            return null;
        }
        else if (accounts.length > 1) {
            throw ClientAuthError.createMultipleMatchingAccountsInCacheError();
        }
        return accountCache[0];
    };
    /**
     * Retrieve IdTokenEntity from cache
     * @param clientId
     * @param account
     * @param inputRealm
     */
    CacheManager.prototype.readIdTokenFromCache = function (clientId, account) {
        var idTokenFilter = {
            homeAccountId: account.homeAccountId,
            environment: account.environment,
            credentialType: CredentialType.ID_TOKEN,
            clientId: clientId,
            realm: account.tenantId,
        };
        var credentialCache = this.getCredentialsFilteredBy(idTokenFilter);
        var idTokens = Object.keys(credentialCache.idTokens).map(function (key) { return credentialCache.idTokens[key]; });
        var numIdTokens = idTokens.length;
        if (numIdTokens < 1) {
            return null;
        }
        else if (numIdTokens > 1) {
            throw ClientAuthError.createMultipleMatchingTokensInCacheError();
        }
        return idTokens[0];
    };
    /**
     * Retrieve AccessTokenEntity from cache
     * @param clientId
     * @param account
     * @param scopes
     * @param authScheme
     */
    CacheManager.prototype.readAccessTokenFromCache = function (clientId, account, request) {
        var scopes = new ScopeSet(request.scopes || []);
        var authScheme = request.authenticationScheme || AuthenticationScheme.BEARER;
        /*
         * Distinguish between Bearer and PoP/SSH token cache types
         * Cast to lowercase to handle "bearer" from ADFS
         */
        var credentialType = (authScheme && authScheme.toLowerCase() !== AuthenticationScheme.BEARER.toLowerCase()) ? CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME : CredentialType.ACCESS_TOKEN;
        var accessTokenFilter = {
            homeAccountId: account.homeAccountId,
            environment: account.environment,
            credentialType: credentialType,
            clientId: clientId,
            realm: account.tenantId,
            target: scopes.printScopesLowerCase(),
            tokenType: authScheme,
            keyId: request.sshKid,
            requestedClaimsHash: request.requestedClaimsHash,
        };
        var credentialCache = this.getCredentialsFilteredBy(accessTokenFilter);
        var accessTokens = Object.keys(credentialCache.accessTokens).map(function (key) { return credentialCache.accessTokens[key]; });
        var numAccessTokens = accessTokens.length;
        if (numAccessTokens < 1) {
            return null;
        }
        else if (numAccessTokens > 1) {
            throw ClientAuthError.createMultipleMatchingTokensInCacheError();
        }
        return accessTokens[0];
    };
    /**
     * Helper to retrieve the appropriate refresh token from cache
     * @param clientId
     * @param account
     * @param familyRT
     */
    CacheManager.prototype.readRefreshTokenFromCache = function (clientId, account, familyRT) {
        var id = familyRT ? THE_FAMILY_ID : undefined;
        var refreshTokenFilter = {
            homeAccountId: account.homeAccountId,
            environment: account.environment,
            credentialType: CredentialType.REFRESH_TOKEN,
            clientId: clientId,
            familyId: id,
        };
        var credentialCache = this.getCredentialsFilteredBy(refreshTokenFilter);
        var refreshTokens = Object.keys(credentialCache.refreshTokens).map(function (key) { return credentialCache.refreshTokens[key]; });
        var numRefreshTokens = refreshTokens.length;
        if (numRefreshTokens < 1) {
            return null;
        }
        // address the else case after remove functions address environment aliases
        return refreshTokens[0];
    };
    /**
     * Retrieve AppMetadataEntity from cache
     */
    CacheManager.prototype.readAppMetadataFromCache = function (environment, clientId) {
        var appMetadataFilter = {
            environment: environment,
            clientId: clientId,
        };
        var appMetadata = this.getAppMetadataFilteredBy(appMetadataFilter);
        var appMetadataEntries = Object.keys(appMetadata).map(function (key) { return appMetadata[key]; });
        var numAppMetadata = appMetadataEntries.length;
        if (numAppMetadata < 1) {
            return null;
        }
        else if (numAppMetadata > 1) {
            throw ClientAuthError.createMultipleMatchingAppMetadataInCacheError();
        }
        return appMetadataEntries[0];
    };
    /**
     * Return the family_id value associated  with FOCI
     * @param environment
     * @param clientId
     */
    CacheManager.prototype.isAppMetadataFOCI = function (environment, clientId) {
        var appMetadata = this.readAppMetadataFromCache(environment, clientId);
        return !!(appMetadata && appMetadata.familyId === THE_FAMILY_ID);
    };
    /**
     * helper to match account ids
     * @param value
     * @param homeAccountId
     */
    CacheManager.prototype.matchHomeAccountId = function (entity, homeAccountId) {
        return !!(entity.homeAccountId && homeAccountId === entity.homeAccountId);
    };
    /**
     * helper to match assertion
     * @param value
     * @param oboAssertion
     */
    CacheManager.prototype.matchUserAssertionHash = function (entity, userAssertionHash) {
        return !!(entity.userAssertionHash && userAssertionHash === entity.userAssertionHash);
    };
    /**
     * helper to match environment
     * @param value
     * @param environment
     */
    CacheManager.prototype.matchEnvironment = function (entity, environment) {
        var cloudMetadata = this.getAuthorityMetadataByAlias(environment);
        if (cloudMetadata && cloudMetadata.aliases.indexOf(entity.environment) > -1) {
            return true;
        }
        return false;
    };
    /**
     * helper to match credential type
     * @param entity
     * @param credentialType
     */
    CacheManager.prototype.matchCredentialType = function (entity, credentialType) {
        return (entity.credentialType && credentialType.toLowerCase() === entity.credentialType.toLowerCase());
    };
    /**
     * helper to match client ids
     * @param entity
     * @param clientId
     */
    CacheManager.prototype.matchClientId = function (entity, clientId) {
        return !!(entity.clientId && clientId === entity.clientId);
    };
    /**
     * helper to match family ids
     * @param entity
     * @param familyId
     */
    CacheManager.prototype.matchFamilyId = function (entity, familyId) {
        return !!(entity.familyId && familyId === entity.familyId);
    };
    /**
     * helper to match realm
     * @param entity
     * @param realm
     */
    CacheManager.prototype.matchRealm = function (entity, realm) {
        return !!(entity.realm && realm === entity.realm);
    };
    /**
     * helper to match nativeAccountId
     * @param entity
     * @param nativeAccountId
     * @returns boolean indicating the match result
     */
    CacheManager.prototype.matchNativeAccountId = function (entity, nativeAccountId) {
        return !!(entity.nativeAccountId && nativeAccountId === entity.nativeAccountId);
    };
    /**
     * Returns true if the target scopes are a subset of the current entity's scopes, false otherwise.
     * @param entity
     * @param target
     */
    CacheManager.prototype.matchTarget = function (entity, target) {
        var isNotAccessTokenCredential = (entity.credentialType !== CredentialType.ACCESS_TOKEN && entity.credentialType !== CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME);
        if (isNotAccessTokenCredential || !entity.target) {
            return false;
        }
        var entityScopeSet = ScopeSet.fromString(entity.target);
        var requestTargetScopeSet = ScopeSet.fromString(target);
        if (!requestTargetScopeSet.containsOnlyOIDCScopes()) {
            requestTargetScopeSet.removeOIDCScopes(); // ignore OIDC scopes
        }
        else {
            requestTargetScopeSet.removeScope(Constants.OFFLINE_ACCESS_SCOPE);
        }
        return entityScopeSet.containsScopeSet(requestTargetScopeSet);
    };
    /**
     * Returns true if the credential's tokenType or Authentication Scheme matches the one in the request, false otherwise
     * @param entity
     * @param tokenType
     */
    CacheManager.prototype.matchTokenType = function (entity, tokenType) {
        return !!(entity.tokenType && entity.tokenType === tokenType);
    };
    /**
     * Returns true if the credential's keyId matches the one in the request, false otherwise
     * @param entity
     * @param tokenType
     */
    CacheManager.prototype.matchKeyId = function (entity, keyId) {
        return !!(entity.keyId && entity.keyId === keyId);
    };
    /**
     * returns if a given cache entity is of the type appmetadata
     * @param key
     */
    CacheManager.prototype.isAppMetadata = function (key) {
        return key.indexOf(APP_METADATA) !== -1;
    };
    /**
     * returns if a given cache entity is of the type authoritymetadata
     * @param key
     */
    CacheManager.prototype.isAuthorityMetadata = function (key) {
        return key.indexOf(AUTHORITY_METADATA_CONSTANTS.CACHE_KEY) !== -1;
    };
    /**
     * returns cache key used for cloud instance metadata
     */
    CacheManager.prototype.generateAuthorityMetadataCacheKey = function (authority) {
        return AUTHORITY_METADATA_CONSTANTS.CACHE_KEY + "-" + this.clientId + "-" + authority;
    };
    /**
     * Returns the specific credential (IdToken/AccessToken/RefreshToken) from the cache
     * @param key
     * @param credType
     */
    CacheManager.prototype.getSpecificCredential = function (key, credType) {
        switch (credType) {
            case CredentialType.ID_TOKEN: {
                return this.getIdTokenCredential(key);
            }
            case CredentialType.ACCESS_TOKEN:
            case CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME: {
                return this.getAccessTokenCredential(key);
            }
            case CredentialType.REFRESH_TOKEN: {
                return this.getRefreshTokenCredential(key);
            }
            default:
                return null;
        }
    };
    /**
     * Helper to convert serialized data to object
     * @param obj
     * @param json
     */
    CacheManager.toObject = function (obj, json) {
        for (var propertyName in json) {
            obj[propertyName] = json[propertyName];
        }
        return obj;
    };
    return CacheManager;
}());
var DefaultStorageClass = /** @class */ (function (_super) {
    __extends(DefaultStorageClass, _super);
    function DefaultStorageClass() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    DefaultStorageClass.prototype.setAccount = function () {
        var notImplErr = "Storage interface - setAccount() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getAccount = function () {
        var notImplErr = "Storage interface - getAccount() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.setIdTokenCredential = function () {
        var notImplErr = "Storage interface - setIdTokenCredential() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getIdTokenCredential = function () {
        var notImplErr = "Storage interface - getIdTokenCredential() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.setAccessTokenCredential = function () {
        var notImplErr = "Storage interface - setAccessTokenCredential() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getAccessTokenCredential = function () {
        var notImplErr = "Storage interface - getAccessTokenCredential() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.setRefreshTokenCredential = function () {
        var notImplErr = "Storage interface - setRefreshTokenCredential() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getRefreshTokenCredential = function () {
        var notImplErr = "Storage interface - getRefreshTokenCredential() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.setAppMetadata = function () {
        var notImplErr = "Storage interface - setAppMetadata() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getAppMetadata = function () {
        var notImplErr = "Storage interface - getAppMetadata() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.setServerTelemetry = function () {
        var notImplErr = "Storage interface - setServerTelemetry() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getServerTelemetry = function () {
        var notImplErr = "Storage interface - getServerTelemetry() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.setAuthorityMetadata = function () {
        var notImplErr = "Storage interface - setAuthorityMetadata() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getAuthorityMetadata = function () {
        var notImplErr = "Storage interface - getAuthorityMetadata() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getAuthorityMetadataKeys = function () {
        var notImplErr = "Storage interface - getAuthorityMetadataKeys() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.setThrottlingCache = function () {
        var notImplErr = "Storage interface - setThrottlingCache() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getThrottlingCache = function () {
        var notImplErr = "Storage interface - getThrottlingCache() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.removeItem = function () {
        var notImplErr = "Storage interface - removeItem() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.containsKey = function () {
        var notImplErr = "Storage interface - containsKey() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.getKeys = function () {
        var notImplErr = "Storage interface - getKeys() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    DefaultStorageClass.prototype.clear = function () {
        return __awaiter(this, void 0, void 0, function () {
            var notImplErr;
            return __generator(this, function (_a) {
                notImplErr = "Storage interface - clear() has not been implemented for the cacheStorage interface.";
                throw AuthError.createUnexpectedError(notImplErr);
            });
        });
    };
    DefaultStorageClass.prototype.updateCredentialCacheKey = function () {
        var notImplErr = "Storage interface - updateCredentialCacheKey() has not been implemented for the cacheStorage interface.";
        throw AuthError.createUnexpectedError(notImplErr);
    };
    return DefaultStorageClass;
}(CacheManager));

export { CacheManager, DefaultStorageClass };
//# sourceMappingURL=CacheManager.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * This class instance helps track the memory changes facilitating
 * decisions to read from and write to the persistent cache
 */ var TokenCacheContext = /** @class */ (function () {
    function TokenCacheContext(tokenCache, hasChanged) {
        this.cache = tokenCache;
        this.hasChanged = hasChanged;
    }
    Object.defineProperty(TokenCacheContext.prototype, "cacheHasChanged", {
        /**
         * boolean which indicates the changes in cache
         */
        get: function () {
            return this.hasChanged;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(TokenCacheContext.prototype, "tokenCache", {
        /**
         * function to retrieve the token cache
         */
        get: function () {
            return this.cache;
        },
        enumerable: false,
        configurable: true
    });
    return TokenCacheContext;
}());

export { TokenCacheContext };
//# sourceMappingURL=TokenCacheContext.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __extends } from '../../_virtual/_tslib.js';
import { CredentialEntity } from './CredentialEntity.js';
import { CredentialType, AuthenticationScheme } from '../../utils/Constants.js';
import { TimeUtils } from '../../utils/TimeUtils.js';
import { StringUtils } from '../../utils/StringUtils.js';
import { AuthToken } from '../../account/AuthToken.js';
import { ClientAuthError } from '../../error/ClientAuthError.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * ACCESS_TOKEN Credential Type
 *
 * Key:Value Schema:
 *
 * Key Example: uid.utid-login.microsoftonline.com-accesstoken-clientId-contoso.com-user.read
 *
 * Value Schema:
 * {
 *      homeAccountId: home account identifier for the auth scheme,
 *      environment: entity that issued the token, represented as a full host
 *      credentialType: Type of credential as a string, can be one of the following: RefreshToken, AccessToken, IdToken, Password, Cookie, Certificate, Other
 *      clientId: client ID of the application
 *      secret: Actual credential as a string
 *      familyId: Family ID identifier, usually only used for refresh tokens
 *      realm: Full tenant or organizational identifier that the account belongs to
 *      target: Permissions that are included in the token, or for refresh tokens, the resource identifier.
 *      cachedAt: Absolute device time when entry was created in the cache.
 *      expiresOn: Token expiry time, calculated based on current UTC time in seconds. Represented as a string.
 *      extendedExpiresOn: Additional extended expiry time until when token is valid in case of server-side outage. Represented as string in UTC seconds.
 *      keyId: used for POP and SSH tokenTypes
 *      tokenType: Type of the token issued. Usually "Bearer"
 * }
 */
var AccessTokenEntity = /** @class */ (function (_super) {
    __extends(AccessTokenEntity, _super);
    function AccessTokenEntity() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    /**
     * Create AccessTokenEntity
     * @param homeAccountId
     * @param environment
     * @param accessToken
     * @param clientId
     * @param tenantId
     * @param scopes
     * @param expiresOn
     * @param extExpiresOn
     */
    AccessTokenEntity.createAccessTokenEntity = function (homeAccountId, environment, accessToken, clientId, tenantId, scopes, expiresOn, extExpiresOn, cryptoUtils, refreshOn, tokenType, userAssertionHash, keyId, requestedClaims, requestedClaimsHash) {
        var _a, _b;
        var atEntity = new AccessTokenEntity();
        atEntity.homeAccountId = homeAccountId;
        atEntity.credentialType = CredentialType.ACCESS_TOKEN;
        atEntity.secret = accessToken;
        var currentTime = TimeUtils.nowSeconds();
        atEntity.cachedAt = currentTime.toString();
        /*
         * Token expiry time.
         * This value should be  calculated based on the current UTC time measured locally and the value  expires_in Represented as a string in JSON.
         */
        atEntity.expiresOn = expiresOn.toString();
        atEntity.extendedExpiresOn = extExpiresOn.toString();
        if (refreshOn) {
            atEntity.refreshOn = refreshOn.toString();
        }
        atEntity.environment = environment;
        atEntity.clientId = clientId;
        atEntity.realm = tenantId;
        atEntity.target = scopes;
        atEntity.userAssertionHash = userAssertionHash;
        atEntity.tokenType = StringUtils.isEmpty(tokenType) ? AuthenticationScheme.BEARER : tokenType;
        if (requestedClaims) {
            atEntity.requestedClaims = requestedClaims;
            atEntity.requestedClaimsHash = requestedClaimsHash;
        }
        /*
         * Create Access Token With Auth Scheme instead of regular access token
         * Cast to lower to handle "bearer" from ADFS
         */
        if (((_a = atEntity.tokenType) === null || _a === void 0 ? void 0 : _a.toLowerCase()) !== AuthenticationScheme.BEARER.toLowerCase()) {
            atEntity.credentialType = CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME;
            switch (atEntity.tokenType) {
                case AuthenticationScheme.POP:
                    // Make sure keyId is present and add it to credential
                    var tokenClaims = AuthToken.extractTokenClaims(accessToken, cryptoUtils);
                    if (!((_b = tokenClaims === null || tokenClaims === void 0 ? void 0 : tokenClaims.cnf) === null || _b === void 0 ? void 0 : _b.kid)) {
                        throw ClientAuthError.createTokenClaimsRequiredError();
                    }
                    atEntity.keyId = tokenClaims.cnf.kid;
                    break;
                case AuthenticationScheme.SSH:
                    atEntity.keyId = keyId;
            }
        }
        return atEntity;
    };
    /**
     * Validates an entity: checks for all expected params
     * @param entity
     */
    AccessTokenEntity.isAccessTokenEntity = function (entity) {
        if (!entity) {
            return false;
        }
        return (entity.hasOwnProperty("homeAccountId") &&
            entity.hasOwnProperty("environment") &&
            entity.hasOwnProperty("credentialType") &&
            entity.hasOwnProperty("realm") &&
            entity.hasOwnProperty("clientId") &&
            entity.hasOwnProperty("secret") &&
            entity.hasOwnProperty("target") &&
            (entity["credentialType"] === CredentialType.ACCESS_TOKEN || entity["credentialType"] === CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME));
    };
    return AccessTokenEntity;
}(CredentialEntity));

export { AccessTokenEntity };
//# sourceMappingURL=AccessTokenEntity.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { Separators, CacheAccountType, CacheType, Constants } from '../../utils/Constants.js';
import { buildClientInfo } from '../../account/ClientInfo.js';
import { StringUtils } from '../../utils/StringUtils.js';
import { ClientAuthError } from '../../error/ClientAuthError.js';
import { AuthorityType } from '../../authority/AuthorityType.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Type that defines required and optional parameters for an Account field (based on universal cache schema implemented by all MSALs).
 *
 * Key : Value Schema
 *
 * Key: <home_account_id>-<environment>-<realm*>
 *
 * Value Schema:
 * {
 *      homeAccountId: home account identifier for the auth scheme,
 *      environment: entity that issued the token, represented as a full host
 *      realm: Full tenant or organizational identifier that the account belongs to
 *      localAccountId: Original tenant-specific accountID, usually used for legacy cases
 *      username: primary username that represents the user, usually corresponds to preferred_username in the v2 endpt
 *      authorityType: Accounts authority type as a string
 *      name: Full name for the account, including given name and family name,
 *      clientInfo: Full base64 encoded client info received from ESTS
 *      lastModificationTime: last time this entity was modified in the cache
 *      lastModificationApp:
 *      idTokenClaims: Object containing claims parsed from ID token
 *      nativeAccountId: Account identifier on the native device
 * }
 */
var AccountEntity = /** @class */ (function () {
    function AccountEntity() {
    }
    /**
     * Generate Account Id key component as per the schema: <home_account_id>-<environment>
     */
    AccountEntity.prototype.generateAccountId = function () {
        var accountId = [this.homeAccountId, this.environment];
        return accountId.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();
    };
    /**
     * Generate Account Cache Key as per the schema: <home_account_id>-<environment>-<realm*>
     */
    AccountEntity.prototype.generateAccountKey = function () {
        return AccountEntity.generateAccountCacheKey({
            homeAccountId: this.homeAccountId,
            environment: this.environment,
            tenantId: this.realm,
            username: this.username,
            localAccountId: this.localAccountId
        });
    };
    /**
     * returns the type of the cache (in this case account)
     */
    AccountEntity.prototype.generateType = function () {
        switch (this.authorityType) {
            case CacheAccountType.ADFS_ACCOUNT_TYPE:
                return CacheType.ADFS;
            case CacheAccountType.MSAV1_ACCOUNT_TYPE:
                return CacheType.MSA;
            case CacheAccountType.MSSTS_ACCOUNT_TYPE:
                return CacheType.MSSTS;
            case CacheAccountType.GENERIC_ACCOUNT_TYPE:
                return CacheType.GENERIC;
            default: {
                throw ClientAuthError.createUnexpectedAccountTypeError();
            }
        }
    };
    /**
     * Returns the AccountInfo interface for this account.
     */
    AccountEntity.prototype.getAccountInfo = function () {
        return {
            homeAccountId: this.homeAccountId,
            environment: this.environment,
            tenantId: this.realm,
            username: this.username,
            localAccountId: this.localAccountId,
            name: this.name,
            idTokenClaims: this.idTokenClaims,
            nativeAccountId: this.nativeAccountId
        };
    };
    /**
     * Generates account key from interface
     * @param accountInterface
     */
    AccountEntity.generateAccountCacheKey = function (accountInterface) {
        var accountKey = [
            accountInterface.homeAccountId,
            accountInterface.environment || Constants.EMPTY_STRING,
            accountInterface.tenantId || Constants.EMPTY_STRING,
        ];
        return accountKey.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();
    };
    /**
     * Build Account cache from IdToken, clientInfo and authority/policy. Associated with AAD.
     * @param clientInfo
     * @param authority
     * @param idToken
     * @param policy
     */
    AccountEntity.createAccount = function (clientInfo, homeAccountId, idToken, authority, cloudGraphHostName, msGraphHost, environment, nativeAccountId) {
        var _a, _b, _c, _d, _e, _f;
        var account = new AccountEntity();
        account.authorityType = CacheAccountType.MSSTS_ACCOUNT_TYPE;
        account.clientInfo = clientInfo;
        account.homeAccountId = homeAccountId;
        account.nativeAccountId = nativeAccountId;
        var env = environment || (authority && authority.getPreferredCache());
        if (!env) {
            throw ClientAuthError.createInvalidCacheEnvironmentError();
        }
        account.environment = env;
        // non AAD scenarios can have empty realm
        account.realm = ((_a = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _a === void 0 ? void 0 : _a.tid) || Constants.EMPTY_STRING;
        if (idToken) {
            account.idTokenClaims = idToken.claims;
            // How do you account for MSA CID here?
            account.localAccountId = ((_b = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _b === void 0 ? void 0 : _b.oid) || ((_c = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _c === void 0 ? void 0 : _c.sub) || Constants.EMPTY_STRING;
            /*
             * In B2C scenarios the emails claim is used instead of preferred_username and it is an array. In most cases it will contain a single email.
             * This field should not be relied upon if a custom policy is configured to return more than 1 email.
             */
            account.username = ((_d = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _d === void 0 ? void 0 : _d.preferred_username) || (((_e = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _e === void 0 ? void 0 : _e.emails) ? idToken.claims.emails[0] : Constants.EMPTY_STRING);
            account.name = (_f = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _f === void 0 ? void 0 : _f.name;
        }
        account.cloudGraphHostName = cloudGraphHostName;
        account.msGraphHost = msGraphHost;
        return account;
    };
    /**
     * Builds non-AAD/ADFS account.
     * @param authority
     * @param idToken
     */
    AccountEntity.createGenericAccount = function (homeAccountId, idToken, authority, cloudGraphHostName, msGraphHost, environment) {
        var _a, _b, _c, _d;
        var account = new AccountEntity();
        account.authorityType = (authority && authority.authorityType === AuthorityType.Adfs) ? CacheAccountType.ADFS_ACCOUNT_TYPE : CacheAccountType.GENERIC_ACCOUNT_TYPE;
        account.homeAccountId = homeAccountId;
        // non AAD scenarios can have empty realm
        account.realm = Constants.EMPTY_STRING;
        var env = environment || authority && authority.getPreferredCache();
        if (!env) {
            throw ClientAuthError.createInvalidCacheEnvironmentError();
        }
        if (idToken) {
            // How do you account for MSA CID here?
            account.localAccountId = ((_a = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _a === void 0 ? void 0 : _a.oid) || ((_b = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _b === void 0 ? void 0 : _b.sub) || Constants.EMPTY_STRING;
            // upn claim for most ADFS scenarios
            account.username = ((_c = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _c === void 0 ? void 0 : _c.upn) || Constants.EMPTY_STRING;
            account.name = ((_d = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _d === void 0 ? void 0 : _d.name) || Constants.EMPTY_STRING;
            account.idTokenClaims = idToken === null || idToken === void 0 ? void 0 : idToken.claims;
        }
        account.environment = env;
        account.cloudGraphHostName = cloudGraphHostName;
        account.msGraphHost = msGraphHost;
        /*
         * add uniqueName to claims
         * account.name = idToken.claims.uniqueName;
         */
        return account;
    };
    /**
     * Generate HomeAccountId from server response
     * @param serverClientInfo
     * @param authType
     */
    AccountEntity.generateHomeAccountId = function (serverClientInfo, authType, logger, cryptoObj, idToken) {
        var _a;
        var accountId = ((_a = idToken === null || idToken === void 0 ? void 0 : idToken.claims) === null || _a === void 0 ? void 0 : _a.sub) ? idToken.claims.sub : Constants.EMPTY_STRING;
        // since ADFS does not have tid and does not set client_info
        if (authType === AuthorityType.Adfs) {
            return accountId;
        }
        // for cases where there is clientInfo
        if (serverClientInfo) {
            try {
                var clientInfo = buildClientInfo(serverClientInfo, cryptoObj);
                if (!StringUtils.isEmpty(clientInfo.uid) && !StringUtils.isEmpty(clientInfo.utid)) {
                    return "" + clientInfo.uid + Separators.CLIENT_INFO_SEPARATOR + clientInfo.utid;
                }
            }
            catch (e) { }
        }
        // default to "sub" claim
        logger.verbose("No client info in response");
        return accountId;
    };
    /**
     * Validates an entity: checks for all expected params
     * @param entity
     */
    AccountEntity.isAccountEntity = function (entity) {
        if (!entity) {
            return false;
        }
        return (entity.hasOwnProperty("homeAccountId") &&
            entity.hasOwnProperty("environment") &&
            entity.hasOwnProperty("realm") &&
            entity.hasOwnProperty("localAccountId") &&
            entity.hasOwnProperty("username") &&
            entity.hasOwnProperty("authorityType"));
    };
    /**
     * Helper function to determine whether 2 accountInfo objects represent the same account
     * @param accountA
     * @param accountB
     * @param compareClaims - If set to true idTokenClaims will also be compared to determine account equality
     */
    AccountEntity.accountInfoIsEqual = function (accountA, accountB, compareClaims) {
        if (!accountA || !accountB) {
            return false;
        }
        var claimsMatch = true; // default to true so as to not fail comparison below if compareClaims: false
        if (compareClaims) {
            var accountAClaims = (accountA.idTokenClaims || {});
            var accountBClaims = (accountB.idTokenClaims || {});
            // issued at timestamp and nonce are expected to change each time a new id token is acquired
            claimsMatch = (accountAClaims.iat === accountBClaims.iat) &&
                (accountAClaims.nonce === accountBClaims.nonce);
        }
        return (accountA.homeAccountId === accountB.homeAccountId) &&
            (accountA.localAccountId === accountB.localAccountId) &&
            (accountA.username === accountB.username) &&
            (accountA.tenantId === accountB.tenantId) &&
            (accountA.environment === accountB.environment) &&
            (accountA.nativeAccountId === accountB.nativeAccountId) &&
            claimsMatch;
    };
    return AccountEntity;
}());

export { AccountEntity };
//# sourceMappingURL=AccountEntity.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { Separators, APP_METADATA } from '../../utils/Constants.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * APP_METADATA Cache
 *
 * Key:Value Schema:
 *
 * Key: appmetadata-<environment>-<client_id>
 *
 * Value:
 * {
 *      clientId: client ID of the application
 *      environment: entity that issued the token, represented as a full host
 *      familyId: Family ID identifier, '1' represents Microsoft Family
 * }
 */
var AppMetadataEntity = /** @class */ (function () {
    function AppMetadataEntity() {
    }
    /**
     * Generate AppMetadata Cache Key as per the schema: appmetadata-<environment>-<client_id>
     */
    AppMetadataEntity.prototype.generateAppMetadataKey = function () {
        return AppMetadataEntity.generateAppMetadataCacheKey(this.environment, this.clientId);
    };
    /**
     * Generate AppMetadata Cache Key
     */
    AppMetadataEntity.generateAppMetadataCacheKey = function (environment, clientId) {
        var appMetaDataKeyArray = [
            APP_METADATA,
            environment,
            clientId,
        ];
        return appMetaDataKeyArray.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();
    };
    /**
     * Creates AppMetadataEntity
     * @param clientId
     * @param environment
     * @param familyId
     */
    AppMetadataEntity.createAppMetadataEntity = function (clientId, environment, familyId) {
        var appMetadata = new AppMetadataEntity();
        appMetadata.clientId = clientId;
        appMetadata.environment = environment;
        if (familyId) {
            appMetadata.familyId = familyId;
        }
        return appMetadata;
    };
    /**
     * Validates an entity: checks for all expected params
     * @param entity
     */
    AppMetadataEntity.isAppMetadataEntity = function (key, entity) {
        if (!entity) {
            return false;
        }
        return (key.indexOf(APP_METADATA) === 0 &&
            entity.hasOwnProperty("clientId") &&
            entity.hasOwnProperty("environment"));
    };
    return AppMetadataEntity;
}());

export { AppMetadataEntity };
//# sourceMappingURL=AppMetadataEntity.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { AUTHORITY_METADATA_CONSTANTS } from '../../utils/Constants.js';
import { TimeUtils } from '../../utils/TimeUtils.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var AuthorityMetadataEntity = /** @class */ (function () {
    function AuthorityMetadataEntity() {
        this.expiresAt = TimeUtils.nowSeconds() + AUTHORITY_METADATA_CONSTANTS.REFRESH_TIME_SECONDS;
    }
    /**
     * Update the entity with new aliases, preferred_cache and preferred_network values
     * @param metadata
     * @param fromNetwork
     */
    AuthorityMetadataEntity.prototype.updateCloudDiscoveryMetadata = function (metadata, fromNetwork) {
        this.aliases = metadata.aliases;
        this.preferred_cache = metadata.preferred_cache;
        this.preferred_network = metadata.preferred_network;
        this.aliasesFromNetwork = fromNetwork;
    };
    /**
     * Update the entity with new endpoints
     * @param metadata
     * @param fromNetwork
     */
    AuthorityMetadataEntity.prototype.updateEndpointMetadata = function (metadata, fromNetwork) {
        this.authorization_endpoint = metadata.authorization_endpoint;
        this.token_endpoint = metadata.token_endpoint;
        this.end_session_endpoint = metadata.end_session_endpoint;
        this.issuer = metadata.issuer;
        this.endpointsFromNetwork = fromNetwork;
        this.jwks_uri = metadata.jwks_uri;
    };
    /**
     * Save the authority that was used to create this cache entry
     * @param authority
     */
    AuthorityMetadataEntity.prototype.updateCanonicalAuthority = function (authority) {
        this.canonical_authority = authority;
    };
    /**
     * Reset the exiresAt value
     */
    AuthorityMetadataEntity.prototype.resetExpiresAt = function () {
        this.expiresAt = TimeUtils.nowSeconds() + AUTHORITY_METADATA_CONSTANTS.REFRESH_TIME_SECONDS;
    };
    /**
     * Returns whether or not the data needs to be refreshed
     */
    AuthorityMetadataEntity.prototype.isExpired = function () {
        return this.expiresAt <= TimeUtils.nowSeconds();
    };
    /**
     * Validates an entity: checks for all expected params
     * @param entity
     */
    AuthorityMetadataEntity.isAuthorityMetadataEntity = function (key, entity) {
        if (!entity) {
            return false;
        }
        return (key.indexOf(AUTHORITY_METADATA_CONSTANTS.CACHE_KEY) === 0 &&
            entity.hasOwnProperty("aliases") &&
            entity.hasOwnProperty("preferred_cache") &&
            entity.hasOwnProperty("preferred_network") &&
            entity.hasOwnProperty("canonical_authority") &&
            entity.hasOwnProperty("authorization_endpoint") &&
            entity.hasOwnProperty("token_endpoint") &&
            entity.hasOwnProperty("issuer") &&
            entity.hasOwnProperty("aliasesFromNetwork") &&
            entity.hasOwnProperty("endpointsFromNetwork") &&
            entity.hasOwnProperty("expiresAt") &&
            entity.hasOwnProperty("jwks_uri"));
    };
    return AuthorityMetadataEntity;
}());

export { AuthorityMetadataEntity };
//# sourceMappingURL=AuthorityMetadataEntity.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var CacheRecord = /** @class */ (function () {
    function CacheRecord(accountEntity, idTokenEntity, accessTokenEntity, refreshTokenEntity, appMetadataEntity) {
        this.account = accountEntity || null;
        this.idToken = idTokenEntity || null;
        this.accessToken = accessTokenEntity || null;
        this.refreshToken = refreshTokenEntity || null;
        this.appMetadata = appMetadataEntity || null;
    }
    return CacheRecord;
}());

export { CacheRecord };
//# sourceMappingURL=CacheRecord.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { CredentialType, CacheType, Constants, Separators, AuthenticationScheme } from '../../utils/Constants.js';
import { ClientAuthError } from '../../error/ClientAuthError.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Base type for credentials to be stored in the cache: eg: ACCESS_TOKEN, ID_TOKEN etc
 *
 * Key:Value Schema:
 *
 * Key: <home_account_id*>-<environment>-<credential_type>-<client_id>-<realm*>-<target*>-<requestedClaims*>-<scheme*>
 *
 * Value Schema:
 * {
 *      homeAccountId: home account identifier for the auth scheme,
 *      environment: entity that issued the token, represented as a full host
 *      credentialType: Type of credential as a string, can be one of the following: RefreshToken, AccessToken, IdToken, Password, Cookie, Certificate, Other
 *      clientId: client ID of the application
 *      secret: Actual credential as a string
 *      familyId: Family ID identifier, usually only used for refresh tokens
 *      realm: Full tenant or organizational identifier that the account belongs to
 *      target: Permissions that are included in the token, or for refresh tokens, the resource identifier.
 *      tokenType: Matches the authentication scheme for which the token was issued (i.e. Bearer or pop)
 *      requestedClaimsHash: Matches the SHA 256 hash of the claims object included in the token request
 *      userAssertionHash: Matches the SHA 256 hash of the obo_assertion for the OBO flow
 * }
 */
var CredentialEntity = /** @class */ (function () {
    function CredentialEntity() {
    }
    /**
     * Generate Account Id key component as per the schema: <home_account_id>-<environment>
     */
    CredentialEntity.prototype.generateAccountId = function () {
        return CredentialEntity.generateAccountIdForCacheKey(this.homeAccountId, this.environment);
    };
    /**
     * Generate Credential Id key component as per the schema: <credential_type>-<client_id>-<realm>
     */
    CredentialEntity.prototype.generateCredentialId = function () {
        return CredentialEntity.generateCredentialIdForCacheKey(this.credentialType, this.clientId, this.realm, this.familyId);
    };
    /**
     * Generate target key component as per schema: <target>
     */
    CredentialEntity.prototype.generateTarget = function () {
        return CredentialEntity.generateTargetForCacheKey(this.target);
    };
    /**
     * generates credential key
     */
    CredentialEntity.prototype.generateCredentialKey = function () {
        return CredentialEntity.generateCredentialCacheKey(this.homeAccountId, this.environment, this.credentialType, this.clientId, this.realm, this.target, this.familyId, this.tokenType, this.requestedClaimsHash);
    };
    /**
     * returns the type of the cache (in this case credential)
     */
    CredentialEntity.prototype.generateType = function () {
        switch (this.credentialType) {
            case CredentialType.ID_TOKEN:
                return CacheType.ID_TOKEN;
            case CredentialType.ACCESS_TOKEN:
            case CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME:
                return CacheType.ACCESS_TOKEN;
            case CredentialType.REFRESH_TOKEN:
                return CacheType.REFRESH_TOKEN;
            default: {
                throw ClientAuthError.createUnexpectedCredentialTypeError();
            }
        }
    };
    /**
     * helper function to return `CredentialType`
     * @param key
     */
    CredentialEntity.getCredentialType = function (key) {
        // First keyword search will match all "AccessToken" and "AccessToken_With_AuthScheme" credentials
        if (key.indexOf(CredentialType.ACCESS_TOKEN.toLowerCase()) !== -1) {
            // Perform second search to differentiate between "AccessToken" and "AccessToken_With_AuthScheme" credential types
            if (key.indexOf(CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME.toLowerCase()) !== -1) {
                return CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME;
            }
            return CredentialType.ACCESS_TOKEN;
        }
        else if (key.indexOf(CredentialType.ID_TOKEN.toLowerCase()) !== -1) {
            return CredentialType.ID_TOKEN;
        }
        else if (key.indexOf(CredentialType.REFRESH_TOKEN.toLowerCase()) !== -1) {
            return CredentialType.REFRESH_TOKEN;
        }
        return Constants.NOT_DEFINED;
    };
    /**
     * generates credential key
     * <home_account_id*>-\<environment>-<credential_type>-<client_id>-<realm\*>-<target\*>-<scheme\*>
     */
    CredentialEntity.generateCredentialCacheKey = function (homeAccountId, environment, credentialType, clientId, realm, target, familyId, tokenType, requestedClaimsHash) {
        var credentialKey = [
            this.generateAccountIdForCacheKey(homeAccountId, environment),
            this.generateCredentialIdForCacheKey(credentialType, clientId, realm, familyId),
            this.generateTargetForCacheKey(target),
            this.generateClaimsHashForCacheKey(requestedClaimsHash),
            this.generateSchemeForCacheKey(tokenType)
        ];
        return credentialKey.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();
    };
    /**
     * generates Account Id for keys
     * @param homeAccountId
     * @param environment
     */
    CredentialEntity.generateAccountIdForCacheKey = function (homeAccountId, environment) {
        var accountId = [homeAccountId, environment];
        return accountId.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();
    };
    /**
     * Generates Credential Id for keys
     * @param credentialType
     * @param realm
     * @param clientId
     * @param familyId
     */
    CredentialEntity.generateCredentialIdForCacheKey = function (credentialType, clientId, realm, familyId) {
        var clientOrFamilyId = credentialType === CredentialType.REFRESH_TOKEN
            ? familyId || clientId
            : clientId;
        var credentialId = [
            credentialType,
            clientOrFamilyId,
            realm || Constants.EMPTY_STRING,
        ];
        return credentialId.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();
    };
    /**
     * Generate target key component as per schema: <target>
     */
    CredentialEntity.generateTargetForCacheKey = function (scopes) {
        return (scopes || Constants.EMPTY_STRING).toLowerCase();
    };
    /**
     * Generate requested claims key component as per schema: <requestedClaims>
     */
    CredentialEntity.generateClaimsHashForCacheKey = function (requestedClaimsHash) {
        return (requestedClaimsHash || Constants.EMPTY_STRING).toLowerCase();
    };
    /**
     * Generate scheme key componenet as per schema: <scheme>
     */
    CredentialEntity.generateSchemeForCacheKey = function (tokenType) {
        /*
         * PoP Tokens and SSH certs include scheme in cache key
         * Cast to lowercase to handle "bearer" from ADFS
         */
        return (tokenType && tokenType.toLowerCase() !== AuthenticationScheme.BEARER.toLowerCase()) ? tokenType.toLowerCase() : Constants.EMPTY_STRING;
    };
    return CredentialEntity;
}());

export { CredentialEntity };
//# sourceMappingURL=CredentialEntity.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __extends } from '../../_virtual/_tslib.js';
import { CredentialEntity } from './CredentialEntity.js';
import { CredentialType } from '../../utils/Constants.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * ID_TOKEN Cache
 *
 * Key:Value Schema:
 *
 * Key Example: uid.utid-login.microsoftonline.com-idtoken-clientId-contoso.com-
 *
 * Value Schema:
 * {
 *      homeAccountId: home account identifier for the auth scheme,
 *      environment: entity that issued the token, represented as a full host
 *      credentialType: Type of credential as a string, can be one of the following: RefreshToken, AccessToken, IdToken, Password, Cookie, Certificate, Other
 *      clientId: client ID of the application
 *      secret: Actual credential as a string
 *      realm: Full tenant or organizational identifier that the account belongs to
 * }
 */
var IdTokenEntity = /** @class */ (function (_super) {
    __extends(IdTokenEntity, _super);
    function IdTokenEntity() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    /**
     * Create IdTokenEntity
     * @param homeAccountId
     * @param authenticationResult
     * @param clientId
     * @param authority
     */
    IdTokenEntity.createIdTokenEntity = function (homeAccountId, environment, idToken, clientId, tenantId) {
        var idTokenEntity = new IdTokenEntity();
        idTokenEntity.credentialType = CredentialType.ID_TOKEN;
        idTokenEntity.homeAccountId = homeAccountId;
        idTokenEntity.environment = environment;
        idTokenEntity.clientId = clientId;
        idTokenEntity.secret = idToken;
        idTokenEntity.realm = tenantId;
        return idTokenEntity;
    };
    /**
     * Validates an entity: checks for all expected params
     * @param entity
     */
    IdTokenEntity.isIdTokenEntity = function (entity) {
        if (!entity) {
            return false;
        }
        return (entity.hasOwnProperty("homeAccountId") &&
            entity.hasOwnProperty("environment") &&
            entity.hasOwnProperty("credentialType") &&
            entity.hasOwnProperty("realm") &&
            entity.hasOwnProperty("clientId") &&
            entity.hasOwnProperty("secret") &&
            entity["credentialType"] === CredentialType.ID_TOKEN);
    };
    return IdTokenEntity;
}(CredentialEntity));

export { IdTokenEntity };
//# sourceMappingURL=IdTokenEntity.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __extends } from '../../_virtual/_tslib.js';
import { CredentialEntity } from './CredentialEntity.js';
import { CredentialType } from '../../utils/Constants.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * REFRESH_TOKEN Cache
 *
 * Key:Value Schema:
 *
 * Key Example: uid.utid-login.microsoftonline.com-refreshtoken-clientId--
 *
 * Value:
 * {
 *      homeAccountId: home account identifier for the auth scheme,
 *      environment: entity that issued the token, represented as a full host
 *      credentialType: Type of credential as a string, can be one of the following: RefreshToken, AccessToken, IdToken, Password, Cookie, Certificate, Other
 *      clientId: client ID of the application
 *      secret: Actual credential as a string
 *      familyId: Family ID identifier, '1' represents Microsoft Family
 *      realm: Full tenant or organizational identifier that the account belongs to
 *      target: Permissions that are included in the token, or for refresh tokens, the resource identifier.
 * }
 */
var RefreshTokenEntity = /** @class */ (function (_super) {
    __extends(RefreshTokenEntity, _super);
    function RefreshTokenEntity() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    /**
     * Create RefreshTokenEntity
     * @param homeAccountId
     * @param authenticationResult
     * @param clientId
     * @param authority
     */
    RefreshTokenEntity.createRefreshTokenEntity = function (homeAccountId, environment, refreshToken, clientId, familyId, userAssertionHash) {
        var rtEntity = new RefreshTokenEntity();
        rtEntity.clientId = clientId;
        rtEntity.credentialType = CredentialType.REFRESH_TOKEN;
        rtEntity.environment = environment;
        rtEntity.homeAccountId = homeAccountId;
        rtEntity.secret = refreshToken;
        rtEntity.userAssertionHash = userAssertionHash;
        if (familyId)
            rtEntity.familyId = familyId;
        return rtEntity;
    };
    /**
     * Validates an entity: checks for all expected params
     * @param entity
     */
    RefreshTokenEntity.isRefreshTokenEntity = function (entity) {
        if (!entity) {
            return false;
        }
        return (entity.hasOwnProperty("homeAccountId") &&
            entity.hasOwnProperty("environment") &&
            entity.hasOwnProperty("credentialType") &&
            entity.hasOwnProperty("clientId") &&
            entity.hasOwnProperty("secret") &&
            entity["credentialType"] === CredentialType.REFRESH_TOKEN);
    };
    return RefreshTokenEntity;
}(CredentialEntity));

export { RefreshTokenEntity };
//# sourceMappingURL=RefreshTokenEntity.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { SERVER_TELEM_CONSTANTS } from '../../utils/Constants.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var ServerTelemetryEntity = /** @class */ (function () {
    function ServerTelemetryEntity() {
        this.failedRequests = [];
        this.errors = [];
        this.cacheHits = 0;
    }
    /**
     * validates if a given cache entry is "Telemetry", parses <key,value>
     * @param key
     * @param entity
     */
    ServerTelemetryEntity.isServerTelemetryEntity = function (key, entity) {
        var validateKey = key.indexOf(SERVER_TELEM_CONSTANTS.CACHE_KEY) === 0;
        var validateEntity = true;
        if (entity) {
            validateEntity =
                entity.hasOwnProperty("failedRequests") &&
                    entity.hasOwnProperty("errors") &&
                    entity.hasOwnProperty("cacheHits");
        }
        return validateKey && validateEntity;
    };
    return ServerTelemetryEntity;
}());

export { ServerTelemetryEntity };
//# sourceMappingURL=ServerTelemetryEntity.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { ThrottlingConstants } from '../../utils/Constants.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var ThrottlingEntity = /** @class */ (function () {
    function ThrottlingEntity() {
    }
    /**
     * validates if a given cache entry is "Throttling", parses <key,value>
     * @param key
     * @param entity
     */
    ThrottlingEntity.isThrottlingEntity = function (key, entity) {
        var validateKey = false;
        if (key) {
            validateKey = key.indexOf(ThrottlingConstants.THROTTLING_PREFIX) === 0;
        }
        var validateEntity = true;
        if (entity) {
            validateEntity = entity.hasOwnProperty("throttleTime");
        }
        return validateKey && validateEntity;
    };
    return ThrottlingEntity;
}());

export { ThrottlingEntity };
//# sourceMappingURL=ThrottlingEntity.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __awaiter, __generator, __assign } from '../_virtual/_tslib.js';
import { AuthorityType } from './AuthorityType.js';
import { isOpenIdConfigResponse } from './OpenIdConfigResponse.js';
import { UrlString } from '../url/UrlString.js';
import { ClientAuthError } from '../error/ClientAuthError.js';
import { Constants, AuthorityMetadataSource, RegionDiscoveryOutcomes } from '../utils/Constants.js';
import { EndpointMetadata, InstanceDiscoveryMetadata } from './AuthorityMetadata.js';
import { ClientConfigurationError } from '../error/ClientConfigurationError.js';
import { ProtocolMode } from './ProtocolMode.js';
import { AuthorityMetadataEntity } from '../cache/entities/AuthorityMetadataEntity.js';
import { AzureCloudInstance } from './AuthorityOptions.js';
import { isCloudInstanceDiscoveryResponse } from './CloudInstanceDiscoveryResponse.js';
import { RegionDiscovery } from './RegionDiscovery.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * The authority class validates the authority URIs used by the user, and retrieves the OpenID Configuration Data from the
 * endpoint. It will store the pertinent config data in this object for use during token calls.
 */
var Authority = /** @class */ (function () {
    function Authority(authority, networkInterface, cacheManager, authorityOptions, proxyUrl) {
        this.canonicalAuthority = authority;
        this._canonicalAuthority.validateAsUri();
        this.networkInterface = networkInterface;
        this.cacheManager = cacheManager;
        this.authorityOptions = authorityOptions;
        this.regionDiscovery = new RegionDiscovery(networkInterface);
        this.regionDiscoveryMetadata = { region_used: undefined, region_source: undefined, region_outcome: undefined };
        this.proxyUrl = proxyUrl || Constants.EMPTY_STRING;
    }
    Object.defineProperty(Authority.prototype, "authorityType", {
        // See above for AuthorityType
        get: function () {
            var pathSegments = this.canonicalAuthorityUrlComponents.PathSegments;
            if (pathSegments.length && pathSegments[0].toLowerCase() === Constants.ADFS) {
                return AuthorityType.Adfs;
            }
            return AuthorityType.Default;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "protocolMode", {
        /**
         * ProtocolMode enum representing the way endpoints are constructed.
         */
        get: function () {
            return this.authorityOptions.protocolMode;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "options", {
        /**
         * Returns authorityOptions which can be used to reinstantiate a new authority instance
         */
        get: function () {
            return this.authorityOptions;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "canonicalAuthority", {
        /**
         * A URL that is the authority set by the developer
         */
        get: function () {
            return this._canonicalAuthority.urlString;
        },
        /**
         * Sets canonical authority.
         */
        set: function (url) {
            this._canonicalAuthority = new UrlString(url);
            this._canonicalAuthority.validateAsUri();
            this._canonicalAuthorityUrlComponents = null;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "canonicalAuthorityUrlComponents", {
        /**
         * Get authority components.
         */
        get: function () {
            if (!this._canonicalAuthorityUrlComponents) {
                this._canonicalAuthorityUrlComponents = this._canonicalAuthority.getUrlComponents();
            }
            return this._canonicalAuthorityUrlComponents;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "hostnameAndPort", {
        /**
         * Get hostname and port i.e. login.microsoftonline.com
         */
        get: function () {
            return this.canonicalAuthorityUrlComponents.HostNameAndPort.toLowerCase();
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "tenant", {
        /**
         * Get tenant for authority.
         */
        get: function () {
            return this.canonicalAuthorityUrlComponents.PathSegments[0];
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "authorizationEndpoint", {
        /**
         * OAuth /authorize endpoint for requests
         */
        get: function () {
            if (this.discoveryComplete()) {
                var endpoint = this.replacePath(this.metadata.authorization_endpoint);
                return this.replaceTenant(endpoint);
            }
            else {
                throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
            }
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "tokenEndpoint", {
        /**
         * OAuth /token endpoint for requests
         */
        get: function () {
            if (this.discoveryComplete()) {
                var endpoint = this.replacePath(this.metadata.token_endpoint);
                return this.replaceTenant(endpoint);
            }
            else {
                throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
            }
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "deviceCodeEndpoint", {
        get: function () {
            if (this.discoveryComplete()) {
                var endpoint = this.replacePath(this.metadata.token_endpoint.replace("/token", "/devicecode"));
                return this.replaceTenant(endpoint);
            }
            else {
                throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
            }
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "endSessionEndpoint", {
        /**
         * OAuth logout endpoint for requests
         */
        get: function () {
            if (this.discoveryComplete()) {
                // ROPC policies may not have end_session_endpoint set
                if (!this.metadata.end_session_endpoint) {
                    throw ClientAuthError.createLogoutNotSupportedError();
                }
                var endpoint = this.replacePath(this.metadata.end_session_endpoint);
                return this.replaceTenant(endpoint);
            }
            else {
                throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
            }
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "selfSignedJwtAudience", {
        /**
         * OAuth issuer for requests
         */
        get: function () {
            if (this.discoveryComplete()) {
                var endpoint = this.replacePath(this.metadata.issuer);
                return this.replaceTenant(endpoint);
            }
            else {
                throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
            }
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(Authority.prototype, "jwksUri", {
        /**
         * Jwks_uri for token signing keys
         */
        get: function () {
            if (this.discoveryComplete()) {
                var endpoint = this.replacePath(this.metadata.jwks_uri);
                return this.replaceTenant(endpoint);
            }
            else {
                throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
            }
        },
        enumerable: false,
        configurable: true
    });
    /**
     * Replaces tenant in url path with current tenant. Defaults to common.
     * @param urlString
     */
    Authority.prototype.replaceTenant = function (urlString) {
        return urlString.replace(/{tenant}|{tenantid}/g, this.tenant);
    };
    /**
     * Replaces path such as tenant or policy with the current tenant or policy.
     * @param urlString
     */
    Authority.prototype.replacePath = function (urlString) {
        var endpoint = urlString;
        var cachedAuthorityUrl = new UrlString(this.metadata.canonical_authority);
        var cachedAuthorityParts = cachedAuthorityUrl.getUrlComponents().PathSegments;
        var currentAuthorityParts = this.canonicalAuthorityUrlComponents.PathSegments;
        currentAuthorityParts.forEach(function (currentPart, index) {
            var cachedPart = cachedAuthorityParts[index];
            if (currentPart !== cachedPart) {
                endpoint = endpoint.replace("/" + cachedPart + "/", "/" + currentPart + "/");
            }
        });
        return endpoint;
    };
    Object.defineProperty(Authority.prototype, "defaultOpenIdConfigurationEndpoint", {
        /**
         * The default open id configuration endpoint for any canonical authority.
         */
        get: function () {
            if (this.authorityType === AuthorityType.Adfs || this.protocolMode === ProtocolMode.OIDC) {
                return this.canonicalAuthority + ".well-known/openid-configuration";
            }
            return this.canonicalAuthority + "v2.0/.well-known/openid-configuration";
        },
        enumerable: false,
        configurable: true
    });
    /**
     * Boolean that returns whethr or not tenant discovery has been completed.
     */
    Authority.prototype.discoveryComplete = function () {
        return !!this.metadata;
    };
    /**
     * Perform endpoint discovery to discover aliases, preferred_cache, preferred_network
     * and the /authorize, /token and logout endpoints.
     */
    Authority.prototype.resolveEndpointsAsync = function () {
        return __awaiter(this, void 0, void 0, function () {
            var metadataEntity, cloudDiscoverySource, endpointSource, cacheKey;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        metadataEntity = this.cacheManager.getAuthorityMetadataByAlias(this.hostnameAndPort);
                        if (!metadataEntity) {
                            metadataEntity = new AuthorityMetadataEntity();
                            metadataEntity.updateCanonicalAuthority(this.canonicalAuthority);
                        }
                        return [4 /*yield*/, this.updateCloudDiscoveryMetadata(metadataEntity)];
                    case 1:
                        cloudDiscoverySource = _a.sent();
                        this.canonicalAuthority = this.canonicalAuthority.replace(this.hostnameAndPort, metadataEntity.preferred_network);
                        return [4 /*yield*/, this.updateEndpointMetadata(metadataEntity)];
                    case 2:
                        endpointSource = _a.sent();
                        if (cloudDiscoverySource !== AuthorityMetadataSource.CACHE && endpointSource !== AuthorityMetadataSource.CACHE) {
                            // Reset the expiration time unless both values came from a successful cache lookup
                            metadataEntity.resetExpiresAt();
                            metadataEntity.updateCanonicalAuthority(this.canonicalAuthority);
                        }
                        cacheKey = this.cacheManager.generateAuthorityMetadataCacheKey(metadataEntity.preferred_cache);
                        this.cacheManager.setAuthorityMetadata(cacheKey, metadataEntity);
                        this.metadata = metadataEntity;
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Update AuthorityMetadataEntity with new endpoints and return where the information came from
     * @param metadataEntity
     */
    Authority.prototype.updateEndpointMetadata = function (metadataEntity) {
        var _a, _b;
        return __awaiter(this, void 0, void 0, function () {
            var metadata, harcodedMetadata;
            return __generator(this, function (_c) {
                switch (_c.label) {
                    case 0:
                        metadata = this.getEndpointMetadataFromConfig();
                        if (metadata) {
                            metadataEntity.updateEndpointMetadata(metadata, false);
                            return [2 /*return*/, AuthorityMetadataSource.CONFIG];
                        }
                        if (this.isAuthoritySameType(metadataEntity) && metadataEntity.endpointsFromNetwork && !metadataEntity.isExpired()) {
                            // No need to update
                            return [2 /*return*/, AuthorityMetadataSource.CACHE];
                        }
                        harcodedMetadata = this.getEndpointMetadataFromHardcodedValues();
                        return [4 /*yield*/, this.getEndpointMetadataFromNetwork()];
                    case 1:
                        metadata = _c.sent();
                        if (!metadata) return [3 /*break*/, 4];
                        if (!((_a = this.authorityOptions.azureRegionConfiguration) === null || _a === void 0 ? void 0 : _a.azureRegion)) return [3 /*break*/, 3];
                        return [4 /*yield*/, this.updateMetadataWithRegionalInformation(metadata)];
                    case 2:
                        metadata = _c.sent();
                        _c.label = 3;
                    case 3:
                        metadataEntity.updateEndpointMetadata(metadata, true);
                        return [2 /*return*/, AuthorityMetadataSource.NETWORK];
                    case 4:
                        if (!(harcodedMetadata && !this.authorityOptions.skipAuthorityMetadataCache)) return [3 /*break*/, 7];
                        if (!((_b = this.authorityOptions.azureRegionConfiguration) === null || _b === void 0 ? void 0 : _b.azureRegion)) return [3 /*break*/, 6];
                        return [4 /*yield*/, this.updateMetadataWithRegionalInformation(harcodedMetadata)];
                    case 5:
                        harcodedMetadata = _c.sent();
                        _c.label = 6;
                    case 6:
                        metadataEntity.updateEndpointMetadata(harcodedMetadata, false);
                        return [2 /*return*/, AuthorityMetadataSource.HARDCODED_VALUES];
                    case 7: throw ClientAuthError.createUnableToGetOpenidConfigError(this.defaultOpenIdConfigurationEndpoint);
                }
            });
        });
    };
    /**
     * Compares the number of url components after the domain to determine if the cached authority metadata can be used for the requested authority
     * Protects against same domain different authority such as login.microsoftonline.com/tenant and login.microsoftonline.com/tfp/tenant/policy
     * @param metadataEntity
     */
    Authority.prototype.isAuthoritySameType = function (metadataEntity) {
        var cachedAuthorityUrl = new UrlString(metadataEntity.canonical_authority);
        var cachedParts = cachedAuthorityUrl.getUrlComponents().PathSegments;
        return cachedParts.length === this.canonicalAuthorityUrlComponents.PathSegments.length;
    };
    /**
     * Parse authorityMetadata config option
     */
    Authority.prototype.getEndpointMetadataFromConfig = function () {
        if (this.authorityOptions.authorityMetadata) {
            try {
                return JSON.parse(this.authorityOptions.authorityMetadata);
            }
            catch (e) {
                throw ClientConfigurationError.createInvalidAuthorityMetadataError();
            }
        }
        return null;
    };
    /**
     * Gets OAuth endpoints from the given OpenID configuration endpoint.
     *
     * @param hasHardcodedMetadata boolean
     */
    Authority.prototype.getEndpointMetadataFromNetwork = function () {
        return __awaiter(this, void 0, void 0, function () {
            var options, response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        options = {};
                        if (this.proxyUrl) {
                            options.proxyUrl = this.proxyUrl;
                        }
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        return [4 /*yield*/, this.networkInterface.sendGetRequestAsync(this.defaultOpenIdConfigurationEndpoint, options)];
                    case 2:
                        response = _a.sent();
                        return [2 /*return*/, isOpenIdConfigResponse(response.body) ? response.body : null];
                    case 3:
                        _a.sent();
                        return [2 /*return*/, null];
                    case 4: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Get OAuth endpoints for common authorities.
     */
    Authority.prototype.getEndpointMetadataFromHardcodedValues = function () {
        if (this.canonicalAuthority in EndpointMetadata) {
            return EndpointMetadata[this.canonicalAuthority];
        }
        return null;
    };
    /**
     * Update the retrieved metadata with regional information.
     */
    Authority.prototype.updateMetadataWithRegionalInformation = function (metadata) {
        var _a, _b, _c, _d, _e;
        return __awaiter(this, void 0, void 0, function () {
            var autodetectedRegionName, azureRegion;
            return __generator(this, function (_f) {
                switch (_f.label) {
                    case 0: return [4 /*yield*/, this.regionDiscovery.detectRegion((_a = this.authorityOptions.azureRegionConfiguration) === null || _a === void 0 ? void 0 : _a.environmentRegion, this.regionDiscoveryMetadata, this.proxyUrl)];
                    case 1:
                        autodetectedRegionName = _f.sent();
                        azureRegion = ((_b = this.authorityOptions.azureRegionConfiguration) === null || _b === void 0 ? void 0 : _b.azureRegion) === Constants.AZURE_REGION_AUTO_DISCOVER_FLAG
                            ? autodetectedRegionName
                            : (_c = this.authorityOptions.azureRegionConfiguration) === null || _c === void 0 ? void 0 : _c.azureRegion;
                        if (((_d = this.authorityOptions.azureRegionConfiguration) === null || _d === void 0 ? void 0 : _d.azureRegion) === Constants.AZURE_REGION_AUTO_DISCOVER_FLAG) {
                            this.regionDiscoveryMetadata.region_outcome = autodetectedRegionName ?
                                RegionDiscoveryOutcomes.AUTO_DETECTION_REQUESTED_SUCCESSFUL :
                                RegionDiscoveryOutcomes.AUTO_DETECTION_REQUESTED_FAILED;
                        }
                        else {
                            if (autodetectedRegionName) {
                                this.regionDiscoveryMetadata.region_outcome = (((_e = this.authorityOptions.azureRegionConfiguration) === null || _e === void 0 ? void 0 : _e.azureRegion) === autodetectedRegionName) ?
                                    RegionDiscoveryOutcomes.CONFIGURED_MATCHES_DETECTED :
                                    RegionDiscoveryOutcomes.CONFIGURED_NOT_DETECTED;
                            }
                            else {
                                this.regionDiscoveryMetadata.region_outcome = RegionDiscoveryOutcomes.CONFIGURED_NO_AUTO_DETECTION;
                            }
                        }
                        if (azureRegion) {
                            this.regionDiscoveryMetadata.region_used = azureRegion;
                            return [2 /*return*/, Authority.replaceWithRegionalInformation(metadata, azureRegion)];
                        }
                        return [2 /*return*/, metadata];
                }
            });
        });
    };
    /**
     * Updates the AuthorityMetadataEntity with new aliases, preferred_network and preferred_cache and returns where the information was retrived from
     * @param cachedMetadata
     * @param newMetadata
     */
    Authority.prototype.updateCloudDiscoveryMetadata = function (metadataEntity) {
        return __awaiter(this, void 0, void 0, function () {
            var metadata, harcodedMetadata;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        metadata = this.getCloudDiscoveryMetadataFromConfig();
                        if (metadata) {
                            metadataEntity.updateCloudDiscoveryMetadata(metadata, false);
                            return [2 /*return*/, AuthorityMetadataSource.CONFIG];
                        }
                        // If The cached metadata came from config but that config was not passed to this instance, we must go to the network
                        if (this.isAuthoritySameType(metadataEntity) && metadataEntity.aliasesFromNetwork && !metadataEntity.isExpired()) {
                            // No need to update
                            return [2 /*return*/, AuthorityMetadataSource.CACHE];
                        }
                        harcodedMetadata = this.getCloudDiscoveryMetadataFromHarcodedValues();
                        return [4 /*yield*/, this.getCloudDiscoveryMetadataFromNetwork()];
                    case 1:
                        metadata = _a.sent();
                        if (metadata) {
                            metadataEntity.updateCloudDiscoveryMetadata(metadata, true);
                            return [2 /*return*/, AuthorityMetadataSource.NETWORK];
                        }
                        if (harcodedMetadata && !this.options.skipAuthorityMetadataCache) {
                            metadataEntity.updateCloudDiscoveryMetadata(harcodedMetadata, false);
                            return [2 /*return*/, AuthorityMetadataSource.HARDCODED_VALUES];
                        }
                        else {
                            // Metadata could not be obtained from config, cache or network
                            throw ClientConfigurationError.createUntrustedAuthorityError();
                        }
                }
            });
        });
    };
    /**
     * Parse cloudDiscoveryMetadata config or check knownAuthorities
     */
    Authority.prototype.getCloudDiscoveryMetadataFromConfig = function () {
        // Check if network response was provided in config
        if (this.authorityOptions.cloudDiscoveryMetadata) {
            try {
                var parsedResponse = JSON.parse(this.authorityOptions.cloudDiscoveryMetadata);
                var metadata = Authority.getCloudDiscoveryMetadataFromNetworkResponse(parsedResponse.metadata, this.hostnameAndPort);
                if (metadata) {
                    return metadata;
                }
            }
            catch (e) {
                throw ClientConfigurationError.createInvalidCloudDiscoveryMetadataError();
            }
        }
        // If cloudDiscoveryMetadata is empty or does not contain the host, check knownAuthorities
        if (this.isInKnownAuthorities()) {
            return Authority.createCloudDiscoveryMetadataFromHost(this.hostnameAndPort);
        }
        return null;
    };
    /**
     * Called to get metadata from network if CloudDiscoveryMetadata was not populated by config
     *
     * @param hasHardcodedMetadata boolean
     */
    Authority.prototype.getCloudDiscoveryMetadataFromNetwork = function () {
        return __awaiter(this, void 0, void 0, function () {
            var instanceDiscoveryEndpoint, options, match, response, metadata;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        instanceDiscoveryEndpoint = "" + Constants.AAD_INSTANCE_DISCOVERY_ENDPT + this.canonicalAuthority + "oauth2/v2.0/authorize";
                        options = {};
                        if (this.proxyUrl) {
                            options.proxyUrl = this.proxyUrl;
                        }
                        match = null;
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        return [4 /*yield*/, this.networkInterface.sendGetRequestAsync(instanceDiscoveryEndpoint, options)];
                    case 2:
                        response = _a.sent();
                        metadata = isCloudInstanceDiscoveryResponse(response.body)
                            ? response.body.metadata
                            : [];
                        if (metadata.length === 0) {
                            // If no metadata is returned, authority is untrusted
                            return [2 /*return*/, null];
                        }
                        match = Authority.getCloudDiscoveryMetadataFromNetworkResponse(metadata, this.hostnameAndPort);
                        return [3 /*break*/, 4];
                    case 3:
                        _a.sent();
                        return [2 /*return*/, null];
                    case 4:
                        if (!match) {
                            // Custom Domain scenario, host is trusted because Instance Discovery call succeeded
                            match = Authority.createCloudDiscoveryMetadataFromHost(this.hostnameAndPort);
                        }
                        return [2 /*return*/, match];
                }
            });
        });
    };
    /**
     * Get cloud discovery metadata for common authorities
     */
    Authority.prototype.getCloudDiscoveryMetadataFromHarcodedValues = function () {
        if (this.canonicalAuthority in InstanceDiscoveryMetadata) {
            return InstanceDiscoveryMetadata[this.canonicalAuthority];
        }
        return null;
    };
    /**
     * Helper function to determine if this host is included in the knownAuthorities config option
     */
    Authority.prototype.isInKnownAuthorities = function () {
        var _this = this;
        var matches = this.authorityOptions.knownAuthorities.filter(function (authority) {
            return UrlString.getDomainFromUrl(authority).toLowerCase() === _this.hostnameAndPort;
        });
        return matches.length > 0;
    };
    /**
     * helper function to populate the authority based on azureCloudOptions
     * @param authorityString
     * @param azureCloudOptions
     */
    Authority.generateAuthority = function (authorityString, azureCloudOptions) {
        var authorityAzureCloudInstance;
        if (azureCloudOptions && azureCloudOptions.azureCloudInstance !== AzureCloudInstance.None) {
            var tenant = azureCloudOptions.tenant ? azureCloudOptions.tenant : Constants.DEFAULT_COMMON_TENANT;
            authorityAzureCloudInstance = azureCloudOptions.azureCloudInstance + "/" + tenant + "/";
        }
        return authorityAzureCloudInstance ? authorityAzureCloudInstance : authorityString;
    };
    /**
     * Creates cloud discovery metadata object from a given host
     * @param host
     */
    Authority.createCloudDiscoveryMetadataFromHost = function (host) {
        return {
            preferred_network: host,
            preferred_cache: host,
            aliases: [host]
        };
    };
    /**
     * Searches instance discovery network response for the entry that contains the host in the aliases list
     * @param response
     * @param authority
     */
    Authority.getCloudDiscoveryMetadataFromNetworkResponse = function (response, authority) {
        for (var i = 0; i < response.length; i++) {
            var metadata = response[i];
            if (metadata.aliases.indexOf(authority) > -1) {
                return metadata;
            }
        }
        return null;
    };
    /**
     * helper function to generate environment from authority object
     */
    Authority.prototype.getPreferredCache = function () {
        if (this.discoveryComplete()) {
            return this.metadata.preferred_cache;
        }
        else {
            throw ClientAuthError.createEndpointDiscoveryIncompleteError("Discovery incomplete.");
        }
    };
    /**
     * Returns whether or not the provided host is an alias of this authority instance
     * @param host
     */
    Authority.prototype.isAlias = function (host) {
        return this.metadata.aliases.indexOf(host) > -1;
    };
    /**
     * Checks whether the provided host is that of a public cloud authority
     *
     * @param authority string
     * @returns bool
     */
    Authority.isPublicCloudAuthority = function (host) {
        return Constants.KNOWN_PUBLIC_CLOUDS.indexOf(host) >= 0;
    };
    /**
     * Rebuild the authority string with the region
     *
     * @param host string
     * @param region string
     */
    Authority.buildRegionalAuthorityString = function (host, region, queryString) {
        // Create and validate a Url string object with the initial authority string
        var authorityUrlInstance = new UrlString(host);
        authorityUrlInstance.validateAsUri();
        var authorityUrlParts = authorityUrlInstance.getUrlComponents();
        var hostNameAndPort = region + "." + authorityUrlParts.HostNameAndPort;
        if (this.isPublicCloudAuthority(authorityUrlParts.HostNameAndPort)) {
            hostNameAndPort = region + "." + Constants.REGIONAL_AUTH_PUBLIC_CLOUD_SUFFIX;
        }
        // Include the query string portion of the url
        var url = UrlString.constructAuthorityUriFromObject(__assign(__assign({}, authorityUrlInstance.getUrlComponents()), { HostNameAndPort: hostNameAndPort })).urlString;
        // Add the query string if a query string was provided
        if (queryString)
            return url + "?" + queryString;
        return url;
    };
    /**
     * Replace the endpoints in the metadata object with their regional equivalents.
     *
     * @param metadata OpenIdConfigResponse
     * @param azureRegion string
     */
    Authority.replaceWithRegionalInformation = function (metadata, azureRegion) {
        metadata.authorization_endpoint = Authority.buildRegionalAuthorityString(metadata.authorization_endpoint, azureRegion);
        // TODO: Enquire on whether we should leave the query string or remove it before releasing the feature
        metadata.token_endpoint = Authority.buildRegionalAuthorityString(metadata.token_endpoint, azureRegion, "allowestsrnonmsi=true");
        if (metadata.end_session_endpoint) {
            metadata.end_session_endpoint = Authority.buildRegionalAuthorityString(metadata.end_session_endpoint, azureRegion);
        }
        return metadata;
    };
    return Authority;
}());

export { Authority };
//# sourceMappingURL=Authority.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __awaiter, __generator } from '../_virtual/_tslib.js';
import { Authority } from './Authority.js';
import { ClientConfigurationError } from '../error/ClientConfigurationError.js';
import { StringUtils } from '../utils/StringUtils.js';
import { ClientAuthError } from '../error/ClientAuthError.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var AuthorityFactory = /** @class */ (function () {
    function AuthorityFactory() {
    }
    /**
     * Create an authority object of the correct type based on the url
     * Performs basic authority validation - checks to see if the authority is of a valid type (i.e. aad, b2c, adfs)
     *
     * Also performs endpoint discovery.
     *
     * @param authorityUri
     * @param networkClient
     * @param protocolMode
     */
    AuthorityFactory.createDiscoveredInstance = function (authorityUri, networkClient, cacheManager, authorityOptions, proxyUrl) {
        return __awaiter(this, void 0, void 0, function () {
            var acquireTokenAuthority, e_1;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        acquireTokenAuthority = AuthorityFactory.createInstance(authorityUri, networkClient, cacheManager, authorityOptions, proxyUrl);
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 3, , 4]);
                        return [4 /*yield*/, acquireTokenAuthority.resolveEndpointsAsync()];
                    case 2:
                        _a.sent();
                        return [2 /*return*/, acquireTokenAuthority];
                    case 3:
                        e_1 = _a.sent();
                        throw ClientAuthError.createEndpointDiscoveryIncompleteError(e_1);
                    case 4: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * Create an authority object of the correct type based on the url
     * Performs basic authority validation - checks to see if the authority is of a valid type (i.e. aad, b2c, adfs)
     *
     * Does not perform endpoint discovery.
     *
     * @param authorityUrl
     * @param networkInterface
     * @param protocolMode
     */
    AuthorityFactory.createInstance = function (authorityUrl, networkInterface, cacheManager, authorityOptions, proxyUrl) {
        // Throw error if authority url is empty
        if (StringUtils.isEmpty(authorityUrl)) {
            throw ClientConfigurationError.createUrlEmptyError();
        }
        return new Authority(authorityUrl, networkInterface, cacheManager, authorityOptions, proxyUrl);
    };
    return AuthorityFactory;
}());

export { AuthorityFactory };
//# sourceMappingURL=AuthorityFactory.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var rawMetdataJSON = { "endpointMetadata": { "https://login.microsoftonline.com/common/": { "token_endpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.microsoftonline.com/common/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.microsoftonline.com/{tenantid}/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo", "authorization_endpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.microsoftonline.com/common/kerberos", "tenant_region_scope": null, "cloud_instance_name": "microsoftonline.com", "cloud_graph_host_name": "graph.windows.net", "msgraph_host": "graph.microsoft.com", "rbac_url": "https://pas.windows.net" }, "https://login.chinacloudapi.cn/common/": { "token_endpoint": "https://login.chinacloudapi.cn/common/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.chinacloudapi.cn/common/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.partner.microsoftonline.cn/{tenantid}/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://microsoftgraph.chinacloudapi.cn/oidc/userinfo", "authorization_endpoint": "https://login.chinacloudapi.cn/common/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.chinacloudapi.cn/common/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.chinacloudapi.cn/common/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.chinacloudapi.cn/common/kerberos", "tenant_region_scope": null, "cloud_instance_name": "partner.microsoftonline.cn", "cloud_graph_host_name": "graph.chinacloudapi.cn", "msgraph_host": "microsoftgraph.chinacloudapi.cn", "rbac_url": "https://pas.chinacloudapi.cn" }, "https://login.microsoftonline.us/common/": { "token_endpoint": "https://login.microsoftonline.us/common/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.microsoftonline.us/common/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.microsoftonline.us/{tenantid}/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo", "authorization_endpoint": "https://login.microsoftonline.us/common/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.microsoftonline.us/common/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.microsoftonline.us/common/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.microsoftonline.us/common/kerberos", "tenant_region_scope": null, "cloud_instance_name": "microsoftonline.us", "cloud_graph_host_name": "graph.windows.net", "msgraph_host": "graph.microsoft.com", "rbac_url": "https://pasff.usgovcloudapi.net" }, "https://login.microsoftonline.com/consumers/": { "token_endpoint": "https://login.microsoftonline.com/consumers/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.microsoftonline.com/consumers/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.microsoftonline.com/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo", "authorization_endpoint": "https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.microsoftonline.com/consumers/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.microsoftonline.com/consumers/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.microsoftonline.com/consumers/kerberos", "tenant_region_scope": null, "cloud_instance_name": "microsoftonline.com", "cloud_graph_host_name": "graph.windows.net", "msgraph_host": "graph.microsoft.com", "rbac_url": "https://pas.windows.net" }, "https://login.chinacloudapi.cn/consumers/": { "token_endpoint": "https://login.chinacloudapi.cn/consumers/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.chinacloudapi.cn/consumers/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.partner.microsoftonline.cn/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://microsoftgraph.chinacloudapi.cn/oidc/userinfo", "authorization_endpoint": "https://login.chinacloudapi.cn/consumers/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.chinacloudapi.cn/consumers/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.chinacloudapi.cn/consumers/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.chinacloudapi.cn/consumers/kerberos", "tenant_region_scope": null, "cloud_instance_name": "partner.microsoftonline.cn", "cloud_graph_host_name": "graph.chinacloudapi.cn", "msgraph_host": "microsoftgraph.chinacloudapi.cn", "rbac_url": "https://pas.chinacloudapi.cn" }, "https://login.microsoftonline.us/consumers/": { "token_endpoint": "https://login.microsoftonline.us/consumers/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.microsoftonline.us/consumers/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.microsoftonline.us/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo", "authorization_endpoint": "https://login.microsoftonline.us/consumers/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.microsoftonline.us/consumers/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.microsoftonline.us/consumers/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.microsoftonline.us/consumers/kerberos", "tenant_region_scope": null, "cloud_instance_name": "microsoftonline.us", "cloud_graph_host_name": "graph.windows.net", "msgraph_host": "graph.microsoft.com", "rbac_url": "https://pasff.usgovcloudapi.net" }, "https://login.microsoftonline.com/organizations/": { "token_endpoint": "https://login.microsoftonline.com/organizations/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.microsoftonline.com/organizations/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.microsoftonline.com/{tenantid}/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo", "authorization_endpoint": "https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.microsoftonline.com/organizations/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.microsoftonline.com/organizations/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.microsoftonline.com/organizations/kerberos", "tenant_region_scope": null, "cloud_instance_name": "microsoftonline.com", "cloud_graph_host_name": "graph.windows.net", "msgraph_host": "graph.microsoft.com", "rbac_url": "https://pas.windows.net" }, "https://login.chinacloudapi.cn/organizations/": { "token_endpoint": "https://login.chinacloudapi.cn/organizations/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.chinacloudapi.cn/organizations/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.partner.microsoftonline.cn/{tenantid}/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://microsoftgraph.chinacloudapi.cn/oidc/userinfo", "authorization_endpoint": "https://login.chinacloudapi.cn/organizations/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.chinacloudapi.cn/organizations/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.chinacloudapi.cn/organizations/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.chinacloudapi.cn/organizations/kerberos", "tenant_region_scope": null, "cloud_instance_name": "partner.microsoftonline.cn", "cloud_graph_host_name": "graph.chinacloudapi.cn", "msgraph_host": "microsoftgraph.chinacloudapi.cn", "rbac_url": "https://pas.chinacloudapi.cn" }, "https://login.microsoftonline.us/organizations/": { "token_endpoint": "https://login.microsoftonline.us/organizations/oauth2/v2.0/token", "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"], "jwks_uri": "https://login.microsoftonline.us/organizations/discovery/v2.0/keys", "response_modes_supported": ["query", "fragment", "form_post"], "subject_types_supported": ["pairwise"], "id_token_signing_alg_values_supported": ["RS256"], "response_types_supported": ["code", "id_token", "code id_token", "id_token token"], "scopes_supported": ["openid", "profile", "email", "offline_access"], "issuer": "https://login.microsoftonline.us/{tenantid}/v2.0", "request_uri_parameter_supported": false, "userinfo_endpoint": "https://graph.microsoft.com/oidc/userinfo", "authorization_endpoint": "https://login.microsoftonline.us/organizations/oauth2/v2.0/authorize", "device_authorization_endpoint": "https://login.microsoftonline.us/organizations/oauth2/v2.0/devicecode", "http_logout_supported": true, "frontchannel_logout_supported": true, "end_session_endpoint": "https://login.microsoftonline.us/organizations/oauth2/v2.0/logout", "claims_supported": ["sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email"], "kerberos_endpoint": "https://login.microsoftonline.us/organizations/kerberos", "tenant_region_scope": null, "cloud_instance_name": "microsoftonline.us", "cloud_graph_host_name": "graph.windows.net", "msgraph_host": "graph.microsoft.com", "rbac_url": "https://pasff.usgovcloudapi.net" } }, "instanceDiscoveryMetadata": { "https://login.microsoftonline.com/common/": { "tenant_discovery_endpoint": "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.chinacloudapi.cn/common/": { "tenant_discovery_endpoint": "https://login.chinacloudapi.cn/common/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.microsoftonline.us/common/": { "tenant_discovery_endpoint": "https://login.microsoftonline.us/common/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.microsoftonline.com/consumers/": { "tenant_discovery_endpoint": "https://login.microsoftonline.com/consumers/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.chinacloudapi.cn/consumers/": { "tenant_discovery_endpoint": "https://login.chinacloudapi.cn/consumers/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.microsoftonline.us/consumers/": { "tenant_discovery_endpoint": "https://login.microsoftonline.us/consumers/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.microsoftonline.com/organizations/": { "tenant_discovery_endpoint": "https://login.microsoftonline.com/organizations/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.chinacloudapi.cn/organizations/": { "tenant_discovery_endpoint": "https://login.chinacloudapi.cn/organizations/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] }, "https://login.microsoftonline.us/organizations/": { "tenant_discovery_endpoint": "https://login.microsoftonline.us/organizations/v2.0/.well-known/openid-configuration", "api-version": "1.1", "metadata": [{ "preferred_network": "login.microsoftonline.com", "preferred_cache": "login.windows.net", "aliases": ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }, { "preferred_network": "login.partner.microsoftonline.cn", "preferred_cache": "login.partner.microsoftonline.cn", "aliases": ["login.partner.microsoftonline.cn", "login.chinacloudapi.cn"] }, { "preferred_network": "login.microsoftonline.de", "preferred_cache": "login.microsoftonline.de", "aliases": ["login.microsoftonline.de"] }, { "preferred_network": "login.microsoftonline.us", "preferred_cache": "login.microsoftonline.us", "aliases": ["login.microsoftonline.us", "login.usgovcloudapi.net"] }, { "preferred_network": "login-us.microsoftonline.com", "preferred_cache": "login-us.microsoftonline.com", "aliases": ["login-us.microsoftonline.com"] }] } } };
var EndpointMetadata = rawMetdataJSON.endpointMetadata;
var InstanceDiscoveryMetadata = rawMetdataJSON.instanceDiscoveryMetadata;

export { EndpointMetadata, InstanceDiscoveryMetadata, rawMetdataJSON };
//# sourceMappingURL=AuthorityMetadata.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var AzureCloudInstance;
(function (AzureCloudInstance) {
    // AzureCloudInstance is not specified.
    AzureCloudInstance[AzureCloudInstance["None"] = 0] = "None";
    // Microsoft Azure public cloud
    AzureCloudInstance["AzurePublic"] = "https://login.microsoftonline.com";
    // Microsoft PPE
    AzureCloudInstance["AzurePpe"] = "https://login.windows-ppe.net";
    // Microsoft Chinese national cloud
    AzureCloudInstance["AzureChina"] = "https://login.chinacloudapi.cn";
    // Microsoft German national cloud ("Black Forest")
    AzureCloudInstance["AzureGermany"] = "https://login.microsoftonline.de";
    // US Government cloud
    AzureCloudInstance["AzureUsGovernment"] = "https://login.microsoftonline.us";
})(AzureCloudInstance || (AzureCloudInstance = {}));

export { AzureCloudInstance };
//# sourceMappingURL=AuthorityOptions.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Authority types supported by MSAL.
 */
var AuthorityType;
(function (AuthorityType) {
    AuthorityType[AuthorityType["Default"] = 0] = "Default";
    AuthorityType[AuthorityType["Adfs"] = 1] = "Adfs";
})(AuthorityType || (AuthorityType = {}));

export { AuthorityType };
//# sourceMappingURL=AuthorityType.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
function isCloudInstanceDiscoveryResponse(response) {
    return (response.hasOwnProperty("tenant_discovery_endpoint") &&
        response.hasOwnProperty("metadata"));
}

export { isCloudInstanceDiscoveryResponse };
//# sourceMappingURL=CloudInstanceDiscoveryResponse.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
function isOpenIdConfigResponse(response) {
    return (response.hasOwnProperty("authorization_endpoint") &&
        response.hasOwnProperty("token_endpoint") &&
        response.hasOwnProperty("issuer") &&
        response.hasOwnProperty("jwks_uri"));
}

export { isOpenIdConfigResponse };
//# sourceMappingURL=OpenIdConfigResponse.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Protocol modes supported by MSAL.
 */
var ProtocolMode;
(function (ProtocolMode) {
    ProtocolMode["AAD"] = "AAD";
    ProtocolMode["OIDC"] = "OIDC";
})(ProtocolMode || (ProtocolMode = {}));

export { ProtocolMode };
//# sourceMappingURL=ProtocolMode.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { __awaiter, __generator } from '../_virtual/_tslib.js';
import { RegionDiscoverySources, ResponseCodes, Constants } from '../utils/Constants.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var RegionDiscovery = /** @class */ (function () {
    function RegionDiscovery(networkInterface) {
        this.networkInterface = networkInterface;
    }
    /**
     * Detect the region from the application's environment.
     *
     * @returns Promise<string | null>
     */
    RegionDiscovery.prototype.detectRegion = function (environmentRegion, regionDiscoveryMetadata, proxyUrl) {
        return __awaiter(this, void 0, void 0, function () {
            var autodetectedRegionName, options, localIMDSVersionResponse, currentIMDSVersion, currentIMDSVersionResponse;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        autodetectedRegionName = environmentRegion;
                        if (!!autodetectedRegionName) return [3 /*break*/, 8];
                        options = RegionDiscovery.IMDS_OPTIONS;
                        if (proxyUrl) {
                            options.proxyUrl = proxyUrl;
                        }
                        _a.label = 1;
                    case 1:
                        _a.trys.push([1, 6, , 7]);
                        return [4 /*yield*/, this.getRegionFromIMDS(Constants.IMDS_VERSION, options)];
                    case 2:
                        localIMDSVersionResponse = _a.sent();
                        if (localIMDSVersionResponse.status === ResponseCodes.httpSuccess) {
                            autodetectedRegionName = localIMDSVersionResponse.body;
                            regionDiscoveryMetadata.region_source = RegionDiscoverySources.IMDS;
                        }
                        if (!(localIMDSVersionResponse.status === ResponseCodes.httpBadRequest)) return [3 /*break*/, 5];
                        return [4 /*yield*/, this.getCurrentVersion(options)];
                    case 3:
                        currentIMDSVersion = _a.sent();
                        if (!currentIMDSVersion) {
                            regionDiscoveryMetadata.region_source = RegionDiscoverySources.FAILED_AUTO_DETECTION;
                            return [2 /*return*/, null];
                        }
                        return [4 /*yield*/, this.getRegionFromIMDS(currentIMDSVersion, options)];
                    case 4:
                        currentIMDSVersionResponse = _a.sent();
                        if (currentIMDSVersionResponse.status === ResponseCodes.httpSuccess) {
                            autodetectedRegionName = currentIMDSVersionResponse.body;
                            regionDiscoveryMetadata.region_source = RegionDiscoverySources.IMDS;
                        }
                        _a.label = 5;
                    case 5: return [3 /*break*/, 7];
                    case 6:
                        _a.sent();
                        regionDiscoveryMetadata.region_source = RegionDiscoverySources.FAILED_AUTO_DETECTION;
                        return [2 /*return*/, null];
                    case 7: return [3 /*break*/, 9];
                    case 8:
                        regionDiscoveryMetadata.region_source = RegionDiscoverySources.ENVIRONMENT_VARIABLE;
                        _a.label = 9;
                    case 9:
                        // If no region was auto detected from the environment or from the IMDS endpoint, mark the attempt as a FAILED_AUTO_DETECTION
                        if (!autodetectedRegionName) {
                            regionDiscoveryMetadata.region_source = RegionDiscoverySources.FAILED_AUTO_DETECTION;
                        }
                        return [2 /*return*/, autodetectedRegionName || null];
                }
            });
        });
    };
    /**
     * Make the call to the IMDS endpoint
     *
     * @param imdsEndpointUrl
     * @returns Promise<NetworkResponse<string>>
     */
    RegionDiscovery.prototype.getRegionFromIMDS = function (version, options) {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                return [2 /*return*/, this.networkInterface.sendGetRequestAsync(Constants.IMDS_ENDPOINT + "?api-version=" + version + "&format=text", options, Constants.IMDS_TIMEOUT)];
            });
        });
    };
    /**
     * Get the most recent version of the IMDS endpoint available
     *
     * @returns Promise<string | null>
     */
    RegionDiscovery.prototype.getCurrentVersion = function (options) {
        return __awaiter(this, void 0, void 0, function () {
            var response;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        _a.trys.push([0, 2, , 3]);
                        return [4 /*yield*/, this.networkInterface.sendGetRequestAsync(Constants.IMDS_ENDPOINT + "?format=json", options)];
                    case 1:
                        response = _a.sent();
                        // When IMDS endpoint is called without the api version query param, bad request response comes back with latest version.
                        if (response.status === ResponseCodes.httpBadRequest && response.body && response.body["newest-versions"] && response.body["newest-versions"].length > 0) {
                            return [2 /*return*/, response.body["newest-versions"][0]];
                        }
                        return [2 /*return*/, null];
                    case 2:
                        _a.sent();
                        return [2 /*return*/, null];
                    case 3: return [2 /*return*/];
                }
            });
        });
    };
    // Options for the IMDS endpoint request
    RegionDiscovery.IMDS_OPTIONS = {
        headers: {
            Metadata: "true",
        },
    };
    return RegionDiscovery;
}());

export { RegionDiscovery };
//# sourceMappingURL=RegionDiscovery.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { ClientAuthError } from '../error/ClientAuthError.js';
import { StringUtils } from '../utils/StringUtils.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * JWT Token representation class. Parses token string and generates claims object.
 */
var AuthToken = /** @class */ (function () {
    function AuthToken(rawToken, crypto) {
        if (StringUtils.isEmpty(rawToken)) {
            throw ClientAuthError.createTokenNullOrEmptyError(rawToken);
        }
        this.rawToken = rawToken;
        this.claims = AuthToken.extractTokenClaims(rawToken, crypto);
    }
    /**
     * Extract token by decoding the rawToken
     *
     * @param encodedToken
     */
    AuthToken.extractTokenClaims = function (encodedToken, crypto) {
        var decodedToken = StringUtils.decodeAuthToken(encodedToken);
        // token will be decoded to get the username
        try {
            var base64TokenPayload = decodedToken.JWSPayload;
            // base64Decode() should throw an error if there is an issue
            var base64Decoded = crypto.base64Decode(base64TokenPayload);
            return JSON.parse(base64Decoded);
        }
        catch (err) {
            throw ClientAuthError.createTokenParsingError(err);
        }
    };
    return AuthToken;
}());

export { AuthToken };
//# sourceMappingURL=AuthToken.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
var CcsCredentialType;
(function (CcsCredentialType) {
    CcsCredentialType["HOME_ACCOUNT_ID"] = "home_account_id";
    CcsCredentialType["UPN"] = "UPN";
})(CcsCredentialType || (CcsCredentialType = {}));

export { CcsCredentialType };
//# sourceMappingURL=CcsCredential.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
import { ClientAuthError } from '../error/ClientAuthError.js';
import { StringUtils } from '../utils/StringUtils.js';
import { Constants, Separators } from '../utils/Constants.js';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Function to build a client info object from server clientInfo string
 * @param rawClientInfo
 * @param crypto
 */
function buildClientInfo(rawClientInfo, crypto) {
    if (StringUtils.isEmpty(rawClientInfo)) {
        throw ClientAuthError.createClientInfoEmptyError();
    }
    try {
        var decodedClientInfo = crypto.base64Decode(rawClientInfo);
        return JSON.parse(decodedClientInfo);
    }
    catch (e) {
        throw ClientAuthError.createClientInfoDecodingError(e);
    }
}
/**
 * Function to build a client info object from cached homeAccountId string
 * @param homeAccountId
 */
function buildClientInfoFromHomeAccountId(homeAccountId) {
    if (StringUtils.isEmpty(homeAccountId)) {
        throw ClientAuthError.createClientInfoDecodingError("Home account ID was empty.");
    }
    var clientInfoParts = homeAccountId.split(Separators.CLIENT_INFO_SEPARATOR, 2);
    return {
        uid: clientInfoParts[0],
        utid: clientInfoParts.length < 2 ? Constants.EMPTY_STRING : clientInfoParts[1]
    };
}

export { buildClientInfo, buildClientInfoFromHomeAccountId };
//# sourceMappingURL=ClientInfo.js.map
/*! @azure/msal-common v7.3.0 2022-08-01 */
'use strict';
/*! *****************************************************************************
Copyright (c) Microsoft Corporation.

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.

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.
***************************************************************************** */
/* global Reflect, Promise */

var extendStatics = function(d, b) {
    extendStatics = Object.setPrototypeOf ||
        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
    return extendStatics(d, b);
};

function __extends(d, b) {
    extendStatics(d, b);
    function __() { this.constructor = d; }
    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}

var __assign = function() {
    __assign = Object.assign || function __assign(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
            s = arguments[i];
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
        }
        return t;
    };
    return __assign.apply(this, arguments);
};

function __awaiter(thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
}

function __generator(thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
}

function __spreadArrays() {
    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
    for (var r = Array(s), k = 0, i = 0; i < il; i++)
        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
            r[k] = a[j];
    return r;
}

export { __assign, __awaiter, __extends, __generator, __spreadArrays };
//# sourceMappingURL=_tslib.js.map
MIT License

Copyright (c) 2020 Microsoft

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": "@azure/msal-node",
  "version": "1.12.1",
  "author": {
    "name": "Microsoft",
    "email": "nugetaad@microsoft.com",
    "url": "https://www.microsoft.com"
  },
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/AzureAD/microsoft-authentication-library-for-js.git"
  },
  "description": "Microsoft Authentication Library for Node",
  "main": "dist/index.js",
  "types": "dist/index.d.ts",
  "files": [
    "dist"
  ],
  "beachball": {
    "disallowedChangeTypes": [
      "major"
    ]
  },
  "module": "dist/msal-node.esm.js",
  "devDependencies": {
    "@microsoft/api-extractor": "^7.19.4",
    "@types/jest": "^25.2.3",
    "@types/jsonwebtoken": "^8.5.5",
    "@types/node": "^13.13.4",
    "@types/uuid": "^7.0.0",
    "husky": "^4.2.3",
    "tsdx": "^0.14.1",
    "tslib": "^1.10.0",
    "typescript": "^3.8.3",
    "yargs": "^17.3.1"
  },
  "dependencies": {
    "@azure/msal-common": "^7.3.0",
    "jsonwebtoken": "^8.5.1",
    "uuid": "^8.3.0"
  },
  "engines": {
    "node": "10 || 12 || 14 || 16 || 18"
  }
}
'use strict'

if (process.env.NODE_ENV === 'production') {
  module.exports = require('./msal-node.cjs.production.min.js')
} else {
  module.exports = require('./msal-node.cjs.development.js')
}
'use strict';

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

function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }

var msalCommon = require('@azure/msal-common');
var http = _interopDefault(require('http'));
var https = _interopDefault(require('https'));
var uuid = require('uuid');
var crypto = _interopDefault(require('crypto'));
var jsonwebtoken = require('jsonwebtoken');

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */

/**
 * http methods
 */
var HttpMethod;

(function (HttpMethod) {
  HttpMethod["GET"] = "get";
  HttpMethod["POST"] = "post";
})(HttpMethod || (HttpMethod = {}));
/**
 * Constants used for region discovery
 */


const REGION_ENVIRONMENT_VARIABLE = "REGION_NAME";
/**
 * Constant used for PKCE
 */

const RANDOM_OCTET_SIZE = 32;
/**
 * Constants used in PKCE
 */

const Hash = {
  SHA256: "sha256"
};
/**
 * Constants for encoding schemes
 */

const CharSet = {
  CV_CHARSET: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~"
};
/**
 * Constants
 */

const Constants = {
  MSAL_SKU: "msal.js.node",
  JWT_BEARER_ASSERTION_TYPE: "urn:ietf:params:oauth:client-assertion-type:jwt-bearer",
  AUTHORIZATION_PENDING: "authorization_pending"
};
/**
 * API Codes for Telemetry purposes.
 * Before adding a new code you must claim it in the MSAL Telemetry tracker as these number spaces are shared across all MSALs
 * 0-99 Silent Flow
 * 600-699 Device Code Flow
 * 800-899 Auth Code Flow
 */

var ApiId;

(function (ApiId) {
  ApiId[ApiId["acquireTokenSilent"] = 62] = "acquireTokenSilent";
  ApiId[ApiId["acquireTokenByUsernamePassword"] = 371] = "acquireTokenByUsernamePassword";
  ApiId[ApiId["acquireTokenByDeviceCode"] = 671] = "acquireTokenByDeviceCode";
  ApiId[ApiId["acquireTokenByClientCredential"] = 771] = "acquireTokenByClientCredential";
  ApiId[ApiId["acquireTokenByCode"] = 871] = "acquireTokenByCode";
  ApiId[ApiId["acquireTokenByRefreshToken"] = 872] = "acquireTokenByRefreshToken";
})(ApiId || (ApiId = {}));
/**
 * JWT  constants
 */


const JwtConstants = {
  ALGORITHM: "alg",
  RSA_256: "RS256",
  X5T: "x5t",
  X5C: "x5c",
  AUDIENCE: "aud",
  EXPIRATION_TIME: "exp",
  ISSUER: "iss",
  SUBJECT: "sub",
  NOT_BEFORE: "nbf",
  JWT_ID: "jti"
};

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * This class implements the API for network requests.
 */

class HttpClient {
  /**
   * Http Get request
   * @param url
   * @param options
   */
  async sendGetRequestAsync(url, options) {
    if (options != null && options.proxyUrl) {
      return networkRequestViaProxy(url, HttpMethod.GET, options);
    } else {
      return networkRequestViaHttps(url, HttpMethod.GET, options);
    }
  }
  /**
   * Http Post request
   * @param url
   * @param options
   */


  async sendPostRequestAsync(url, options, cancellationToken) {
    if (options != null && options.proxyUrl) {
      return networkRequestViaProxy(url, HttpMethod.POST, options, cancellationToken);
    } else {
      return networkRequestViaHttps(url, HttpMethod.POST, options, cancellationToken);
    }
  }

}

const networkRequestViaProxy = (url, httpMethod, options, timeout) => {
  const headers = (options == null ? void 0 : options.headers) || {};
  const proxyUrl = new URL((options == null ? void 0 : options.proxyUrl) || "");
  const destinationUrl = new URL(url); // "method: connect" must be used to establish a connection to the proxy

  const tunnelRequestOptions = {
    host: proxyUrl.hostname,
    port: proxyUrl.port,
    method: "CONNECT",
    path: destinationUrl.hostname,
    headers: headers
  };

  if (timeout) {
    tunnelRequestOptions.timeout = timeout;
  } // compose a request string for the socket


  let postRequestStringContent = "";

  if (httpMethod === HttpMethod.POST) {
    const body = (options == null ? void 0 : options.body) || "";
    postRequestStringContent = "Content-Type: application/x-www-form-urlencoded\r\n" + `Content-Length: ${body.length}\r\n` + `\r\n${body}`;
  }

  const outgoingRequestString = `${httpMethod.toUpperCase()} ${destinationUrl.href} HTTP/1.1\r\n` + `Host: ${destinationUrl.host}\r\n` + "Connection: close\r\n" + postRequestStringContent + "\r\n";
  return new Promise((resolve, reject) => {
    const request = http.request(tunnelRequestOptions);

    if (tunnelRequestOptions.timeout) {
      request.on("timeout", () => {
        request.destroy();
        reject(new Error("Request time out"));
      });
    }

    request.end(); // establish connection to the proxy

    request.on("connect", (response, socket) => {
      const statusCode = (response == null ? void 0 : response.statusCode) || 500;

      if (statusCode < 200 || statusCode > 299) {
        request.destroy();
        socket.destroy();
        reject(new Error(`HTTP status code ${statusCode}`));
      }

      if (tunnelRequestOptions.timeout) {
        socket.setTimeout(tunnelRequestOptions.timeout);
        socket.on("timeout", () => {
          request.destroy();
          socket.destroy();
          reject(new Error("Request time out"));
        });
      } // make a request over an HTTP tunnel


      socket.write(outgoingRequestString);
      const data = [];
      socket.on("data", chunk => {
        data.push(chunk);
      });
      socket.on("end", () => {
        // combine all received buffer streams into one buffer, and then into a string
        const dataString = Buffer.concat([...data]).toString(); // separate each line into it's own entry in an arry

        const dataStringArray = dataString.split("\r\n"); // the first entry will contain the statusCode

        const statusCode = parseInt(dataStringArray[0].split(" ")[1]); // the last entry will contain the body

        const body = dataStringArray[dataStringArray.length - 1]; // everything in between the first and last entries are the headers

        const headersArray = dataStringArray.slice(1, dataStringArray.length - 2); // build an object out of all the headers

        const entries = new Map();
        headersArray.forEach(header => {
          /**
           * the header might look like "Content-Length: 1531", but that is just a string
           * it needs to be converted to a key/value pair
           * split the string at the first instance of ":"
           * there may be more than one ":" if the value of the header is supposed to be a JSON object
           */
          const headerKeyValue = header.split(new RegExp(/:\s(.*)/s));
          const headerKey = headerKeyValue[0];
          let headerValue = headerKeyValue[1]; // check if the value of the header is supposed to be a JSON object

          try {
            const object = JSON.parse(headerValue); // if it is, then convert it from a string to a JSON object

            if (object && typeof object === "object") {
              headerValue = object;
            }
          } catch (e) {// otherwise, leave it as a string
          }

          entries.set(headerKey, headerValue);
        });
        const headers = Object.fromEntries(entries);
        const networkResponse = {
          headers: headers,
          body: JSON.parse(body),
          status: statusCode
        };

        if ((statusCode < 200 || statusCode > 299) && // do not destroy the request for the device code flow
        networkResponse.body["error"] !== Constants.AUTHORIZATION_PENDING) {
          request.destroy();
          socket.destroy();
          reject(new Error(`HTTP status code ${statusCode}`));
        }

        resolve(networkResponse);
      });
      socket.on("error", chunk => {
        request.destroy();
        socket.destroy();
        reject(new Error(chunk.toString()));
      });
    });
    request.on("error", chunk => {
      request.destroy();
      reject(new Error(chunk.toString()));
    });
  });
};

const networkRequestViaHttps = (url, httpMethod, options, timeout) => {
  const isPostRequest = httpMethod === HttpMethod.POST;
  const body = (options == null ? void 0 : options.body) || "";
  const emptyHeaders = {};
  const customOptions = {
    method: httpMethod,
    headers: (options == null ? void 0 : options.headers) || emptyHeaders
  };

  if (timeout) {
    customOptions.timeout = timeout;
  }

  if (isPostRequest) {
    // needed for post request to work
    customOptions.headers = { ...customOptions.headers,
      "Content-Length": body.length
    };
  }

  return new Promise((resolve, reject) => {
    const request = https.request(url, customOptions);

    if (timeout) {
      request.on("timeout", () => {
        request.destroy();
        reject(new Error("Request time out"));
      });
    }

    if (isPostRequest) {
      request.write(body);
    }

    request.end();
    request.on("response", response => {
      const headers = response.headers;
      const statusCode = response.statusCode;
      const data = [];
      response.on("data", chunk => {
        data.push(chunk);
      });
      response.on("end", () => {
        // combine all received buffer streams into one buffer, and then into a string
        const body = Buffer.concat([...data]).toString();
        const networkResponse = {
          headers: headers,
          body: JSON.parse(body),
          status: statusCode
        };

        if ((statusCode < 200 || statusCode > 299) && // do not destroy the request for the device code flow
        networkResponse.body["error"] !== Constants.AUTHORIZATION_PENDING) {
          request.destroy();
          reject(new Error(`HTTP status code ${statusCode}`));
        }

        resolve(networkResponse);
      });
    });
    request.on("error", chunk => {
      request.destroy();
      reject(new Error(chunk.toString()));
    });
  });
};

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
class NetworkUtils {
  /**
   * Returns best compatible network client object.
   */
  static getNetworkClient() {
    return new HttpClient();
  }

}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
const DEFAULT_AUTH_OPTIONS = {
  clientId: msalCommon.Constants.EMPTY_STRING,
  authority: msalCommon.Constants.DEFAULT_AUTHORITY,
  clientSecret: msalCommon.Constants.EMPTY_STRING,
  clientAssertion: msalCommon.Constants.EMPTY_STRING,
  clientCertificate: {
    thumbprint: msalCommon.Constants.EMPTY_STRING,
    privateKey: msalCommon.Constants.EMPTY_STRING,
    x5c: msalCommon.Constants.EMPTY_STRING
  },
  knownAuthorities: [],
  cloudDiscoveryMetadata: msalCommon.Constants.EMPTY_STRING,
  authorityMetadata: msalCommon.Constants.EMPTY_STRING,
  clientCapabilities: [],
  protocolMode: msalCommon.ProtocolMode.AAD,
  azureCloudOptions: {
    azureCloudInstance: msalCommon.AzureCloudInstance.None,
    tenant: msalCommon.Constants.EMPTY_STRING
  },
  skipAuthorityMetadataCache: false
};
const DEFAULT_CACHE_OPTIONS = {};
const DEFAULT_LOGGER_OPTIONS = {
  loggerCallback: () => {// allow users to not set logger call back
  },
  piiLoggingEnabled: false,
  logLevel: msalCommon.LogLevel.Info
};
const DEFAULT_SYSTEM_OPTIONS = {
  loggerOptions: DEFAULT_LOGGER_OPTIONS,
  networkClient: /*#__PURE__*/NetworkUtils.getNetworkClient(),
  proxyUrl: msalCommon.Constants.EMPTY_STRING
};
const DEFAULT_TELEMETRY_OPTIONS = {
  application: {
    appName: msalCommon.Constants.EMPTY_STRING,
    appVersion: msalCommon.Constants.EMPTY_STRING
  }
};
/**
 * Sets the default options when not explicitly configured from app developer
 *
 * @param auth - Authentication options
 * @param cache - Cache options
 * @param system - System options
 * @param telemetry - Telemetry options
 *
 * @returns Configuration
 * @public
 */

function buildAppConfiguration({
  auth,
  cache,
  system,
  telemetry
}) {
  return {
    auth: { ...DEFAULT_AUTH_OPTIONS,
      ...auth
    },
    cache: { ...DEFAULT_CACHE_OPTIONS,
      ...cache
    },
    system: { ...DEFAULT_SYSTEM_OPTIONS,
      ...system
    },
    telemetry: { ...DEFAULT_TELEMETRY_OPTIONS,
      ...telemetry
    }
  };
}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
class GuidGenerator {
  /**
   *
   * RFC4122: The version 4 UUID is meant for generating UUIDs from truly-random or pseudo-random numbers.
   * uuidv4 generates guids from cryprtographically-string random
   */
  generateGuid() {
    return uuid.v4();
  }
  /**
   * verifies if a string is  GUID
   * @param guid
   */


  isGuid(guid) {
    const regexGuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
    return regexGuid.test(guid);
  }

}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
class EncodingUtils {
  /**
   * 'utf8': Multibyte encoded Unicode characters. Many web pages and other document formats use UTF-8.
   * 'base64': Base64 encoding.
   *
   * @param str text
   */
  static base64Encode(str, encoding) {
    return Buffer.from(str, encoding).toString("base64");
  }
  /**
   * encode a URL
   * @param str
   */


  static base64EncodeUrl(str, encoding) {
    return EncodingUtils.base64Encode(str, encoding).replace(/=/g, msalCommon.Constants.EMPTY_STRING).replace(/\+/g, "-").replace(/\//g, "_");
  }
  /**
   * 'utf8': Multibyte encoded Unicode characters. Many web pages and other document formats use UTF-8.
   * 'base64': Base64 encoding.
   *
   * @param base64Str Base64 encoded text
   */


  static base64Decode(base64Str) {
    return Buffer.from(base64Str, "base64").toString("utf8");
  }
  /**
   * @param base64Str Base64 encoded Url
   */


  static base64DecodeUrl(base64Str) {
    let str = base64Str.replace(/-/g, "+").replace(/_/g, "/");

    while (str.length % 4) {
      str += "=";
    }

    return EncodingUtils.base64Decode(str);
  }

}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
class HashUtils {
  /**
   * generate 'SHA256' hash
   * @param buffer
   */
  sha256(buffer) {
    return crypto.createHash(Hash.SHA256).update(buffer).digest();
  }

}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * https://tools.ietf.org/html/rfc7636#page-8
 */

class PkceGenerator {
  constructor() {
    this.hashUtils = new HashUtils();
  }
  /**
   * generates the codeVerfier and the challenge from the codeVerfier
   * reference: https://tools.ietf.org/html/rfc7636#section-4.1 and https://tools.ietf.org/html/rfc7636#section-4.2
   */


  async generatePkceCodes() {
    const verifier = this.generateCodeVerifier();
    const challenge = this.generateCodeChallengeFromVerifier(verifier);
    return {
      verifier,
      challenge
    };
  }
  /**
   * generates the codeVerfier; reference: https://tools.ietf.org/html/rfc7636#section-4.1
   */


  generateCodeVerifier() {
    const charArr = [];
    const maxNumber = 256 - 256 % CharSet.CV_CHARSET.length;

    while (charArr.length <= RANDOM_OCTET_SIZE) {
      const byte = crypto.randomBytes(1)[0];

      if (byte >= maxNumber) {
        /*
         * Ignore this number to maintain randomness.
         * Including it would result in an unequal distribution of characters after doing the modulo
         */
        continue;
      }

      const index = byte % CharSet.CV_CHARSET.length;
      charArr.push(CharSet.CV_CHARSET[index]);
    }

    const verifier = charArr.join(msalCommon.Constants.EMPTY_STRING);
    return EncodingUtils.base64EncodeUrl(verifier);
  }
  /**
   * generate the challenge from the codeVerfier; reference: https://tools.ietf.org/html/rfc7636#section-4.2
   * @param codeVerifier
   */


  generateCodeChallengeFromVerifier(codeVerifier) {
    return EncodingUtils.base64EncodeUrl(this.hashUtils.sha256(codeVerifier).toString("base64"), "base64");
  }

}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * This class implements MSAL node's crypto interface, which allows it to perform base64 encoding and decoding, generating cryptographically random GUIDs and
 * implementing Proof Key for Code Exchange specs for the OAuth Authorization Code Flow using PKCE (rfc here: https://tools.ietf.org/html/rfc7636).
 * @public
 */

class CryptoProvider {
  constructor() {
    // Browser crypto needs to be validated first before any other classes can be set.
    this.pkceGenerator = new PkceGenerator();
    this.guidGenerator = new GuidGenerator();
    this.hashUtils = new HashUtils();
  }
  /**
   * Creates a new random GUID - used to populate state and nonce.
   * @returns string (GUID)
   */


  createNewGuid() {
    return this.guidGenerator.generateGuid();
  }
  /**
   * Encodes input string to base64.
   * @param input - string to be encoded
   */


  base64Encode(input) {
    return EncodingUtils.base64Encode(input);
  }
  /**
   * Decodes input string from base64.
   * @param input - string to be decoded
   */


  base64Decode(input) {
    return EncodingUtils.base64Decode(input);
  }
  /**
   * Generates PKCE codes used in Authorization Code Flow.
   */


  generatePkceCodes() {
    return this.pkceGenerator.generatePkceCodes();
  }
  /**
   * Generates a keypair, stores it and returns a thumbprint - not yet implemented for node
   */


  getPublicKeyThumbprint() {
    throw new Error("Method not implemented.");
  }
  /**
   * Removes cryptographic keypair from key store matching the keyId passed in
   * @param kid
   */


  removeTokenBindingKey() {
    throw new Error("Method not implemented.");
  }
  /**
   * Removes all cryptographic keys from Keystore
   */


  clearKeystore() {
    throw new Error("Method not implemented.");
  }
  /**
   * Signs the given object as a jwt payload with private key retrieved by given kid - currently not implemented for node
   */


  signJwt() {
    throw new Error("Method not implemented.");
  }
  /**
   * Returns the SHA-256 hash of an input string
   */


  async hashString(plainText) {
    return EncodingUtils.base64EncodeUrl(this.hashUtils.sha256(plainText).toString("base64"), "base64");
  }

}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * This class deserializes cache entities read from the file into in memory object types defined internally
 */

class Deserializer {
  /**
   * Parse the JSON blob in memory and deserialize the content
   * @param cachedJson
   */
  static deserializeJSONBlob(jsonFile) {
    const deserializedCache = msalCommon.StringUtils.isEmpty(jsonFile) ? {} : JSON.parse(jsonFile);
    return deserializedCache;
  }
  /**
   * Deserializes accounts to AccountEntity objects
   * @param accounts
   */


  static deserializeAccounts(accounts) {
    const accountObjects = {};

    if (accounts) {
      Object.keys(accounts).map(function (key) {
        const serializedAcc = accounts[key];
        const mappedAcc = {
          homeAccountId: serializedAcc.home_account_id,
          environment: serializedAcc.environment,
          realm: serializedAcc.realm,
          localAccountId: serializedAcc.local_account_id,
          username: serializedAcc.username,
          authorityType: serializedAcc.authority_type,
          name: serializedAcc.name,
          clientInfo: serializedAcc.client_info,
          lastModificationTime: serializedAcc.last_modification_time,
          lastModificationApp: serializedAcc.last_modification_app
        };
        const account = new msalCommon.AccountEntity();
        msalCommon.CacheManager.toObject(account, mappedAcc);
        accountObjects[key] = account;
      });
    }

    return accountObjects;
  }
  /**
   * Deserializes id tokens to IdTokenEntity objects
   * @param idTokens
   */


  static deserializeIdTokens(idTokens) {
    const idObjects = {};

    if (idTokens) {
      Object.keys(idTokens).map(function (key) {
        const serializedIdT = idTokens[key];
        const mappedIdT = {
          homeAccountId: serializedIdT.home_account_id,
          environment: serializedIdT.environment,
          credentialType: serializedIdT.credential_type,
          clientId: serializedIdT.client_id,
          secret: serializedIdT.secret,
          realm: serializedIdT.realm
        };
        const idToken = new msalCommon.IdTokenEntity();
        msalCommon.CacheManager.toObject(idToken, mappedIdT);
        idObjects[key] = idToken;
      });
    }

    return idObjects;
  }
  /**
   * Deserializes access tokens to AccessTokenEntity objects
   * @param accessTokens
   */


  static deserializeAccessTokens(accessTokens) {
    const atObjects = {};

    if (accessTokens) {
      Object.keys(accessTokens).map(function (key) {
        const serializedAT = accessTokens[key];
        const mappedAT = {
          homeAccountId: serializedAT.home_account_id,
          environment: serializedAT.environment,
          credentialType: serializedAT.credential_type,
          clientId: serializedAT.client_id,
          secret: serializedAT.secret,
          realm: serializedAT.realm,
          target: serializedAT.target,
          cachedAt: serializedAT.cached_at,
          expiresOn: serializedAT.expires_on,
          extendedExpiresOn: serializedAT.extended_expires_on,
          refreshOn: serializedAT.refresh_on,
          keyId: serializedAT.key_id,
          tokenType: serializedAT.token_type,
          requestedClaims: serializedAT.requestedClaims,
          requestedClaimsHash: serializedAT.requestedClaimsHash
        };
        const accessToken = new msalCommon.AccessTokenEntity();
        msalCommon.CacheManager.toObject(accessToken, mappedAT);
        atObjects[key] = accessToken;
      });
    }

    return atObjects;
  }
  /**
   * Deserializes refresh tokens to RefreshTokenEntity objects
   * @param refreshTokens
   */


  static deserializeRefreshTokens(refreshTokens) {
    const rtObjects = {};

    if (refreshTokens) {
      Object.keys(refreshTokens).map(function (key) {
        const serializedRT = refreshTokens[key];
        const mappedRT = {
          homeAccountId: serializedRT.home_account_id,
          environment: serializedRT.environment,
          credentialType: serializedRT.credential_type,
          clientId: serializedRT.client_id,
          secret: serializedRT.secret,
          familyId: serializedRT.family_id,
          target: serializedRT.target,
          realm: serializedRT.realm
        };
        const refreshToken = new msalCommon.RefreshTokenEntity();
        msalCommon.CacheManager.toObject(refreshToken, mappedRT);
        rtObjects[key] = refreshToken;
      });
    }

    return rtObjects;
  }
  /**
   * Deserializes appMetadata to AppMetaData objects
   * @param appMetadata
   */


  static deserializeAppMetadata(appMetadata) {
    const appMetadataObjects = {};

    if (appMetadata) {
      Object.keys(appMetadata).map(function (key) {
        const serializedAmdt = appMetadata[key];
        const mappedAmd = {
          clientId: serializedAmdt.client_id,
          environment: serializedAmdt.environment,
          familyId: serializedAmdt.family_id
        };
        const amd = new msalCommon.AppMetadataEntity();
        msalCommon.CacheManager.toObject(amd, mappedAmd);
        appMetadataObjects[key] = amd;
      });
    }

    return appMetadataObjects;
  }
  /**
   * Deserialize an inMemory Cache
   * @param jsonCache
   */


  static deserializeAllCache(jsonCache) {
    return {
      accounts: jsonCache.Account ? this.deserializeAccounts(jsonCache.Account) : {},
      idTokens: jsonCache.IdToken ? this.deserializeIdTokens(jsonCache.IdToken) : {},
      accessTokens: jsonCache.AccessToken ? this.deserializeAccessTokens(jsonCache.AccessToken) : {},
      refreshTokens: jsonCache.RefreshToken ? this.deserializeRefreshTokens(jsonCache.RefreshToken) : {},
      appMetadata: jsonCache.AppMetadata ? this.deserializeAppMetadata(jsonCache.AppMetadata) : {}
    };
  }

}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
class Serializer {
  /**
   * serialize the JSON blob
   * @param data
   */
  static serializeJSONBlob(data) {
    return JSON.stringify(data);
  }
  /**
   * Serialize Accounts
   * @param accCache
   */


  static serializeAccounts(accCache) {
    const accounts = {};
    Object.keys(accCache).map(function (key) {
      const accountEntity = accCache[key];
      accounts[key] = {
        home_account_id: accountEntity.homeAccountId,
        environment: accountEntity.environment,
        realm: accountEntity.realm,
        local_account_id: accountEntity.localAccountId,
        username: accountEntity.username,
        authority_type: accountEntity.authorityType,
        name: accountEntity.name,
        client_info: accountEntity.clientInfo,
        last_modification_time: accountEntity.lastModificationTime,
        last_modification_app: accountEntity.lastModificationApp
      };
    });
    return accounts;
  }
  /**
   * Serialize IdTokens
   * @param idTCache
   */


  static serializeIdTokens(idTCache) {
    const idTokens = {};
    Object.keys(idTCache).map(function (key) {
      const idTEntity = idTCache[key];
      idTokens[key] = {
        home_account_id: idTEntity.homeAccountId,
        environment: idTEntity.environment,
        credential_type: idTEntity.credentialType,
        client_id: idTEntity.clientId,
        secret: idTEntity.secret,
        realm: idTEntity.realm
      };
    });
    return idTokens;
  }
  /**
   * Serializes AccessTokens
   * @param atCache
   */


  static serializeAccessTokens(atCache) {
    const accessTokens = {};
    Object.keys(atCache).map(function (key) {
      const atEntity = atCache[key];
      accessTokens[key] = {
        home_account_id: atEntity.homeAccountId,
        environment: atEntity.environment,
        credential_type: atEntity.credentialType,
        client_id: atEntity.clientId,
        secret: atEntity.secret,
        realm: atEntity.realm,
        target: atEntity.target,
        cached_at: atEntity.cachedAt,
        expires_on: atEntity.expiresOn,
        extended_expires_on: atEntity.extendedExpiresOn,
        refresh_on: atEntity.refreshOn,
        key_id: atEntity.keyId,
        token_type: atEntity.tokenType,
        requestedClaims: atEntity.requestedClaims,
        requestedClaimsHash: atEntity.requestedClaimsHash
      };
    });
    return accessTokens;
  }
  /**
   * Serialize refreshTokens
   * @param rtCache
   */


  static serializeRefreshTokens(rtCache) {
    const refreshTokens = {};
    Object.keys(rtCache).map(function (key) {
      const rtEntity = rtCache[key];
      refreshTokens[key] = {
        home_account_id: rtEntity.homeAccountId,
        environment: rtEntity.environment,
        credential_type: rtEntity.credentialType,
        client_id: rtEntity.clientId,
        secret: rtEntity.secret,
        family_id: rtEntity.familyId,
        target: rtEntity.target,
        realm: rtEntity.realm
      };
    });
    return refreshTokens;
  }
  /**
   * Serialize amdtCache
   * @param amdtCache
   */


  static serializeAppMetadata(amdtCache) {
    const appMetadata = {};
    Object.keys(amdtCache).map(function (key) {
      const amdtEntity = amdtCache[key];
      appMetadata[key] = {
        client_id: amdtEntity.clientId,
        environment: amdtEntity.environment,
        family_id: amdtEntity.familyId
      };
    });
    return appMetadata;
  }
  /**
   * Serialize the cache
   * @param jsonContent
   */


  static serializeAllCache(inMemCache) {
    return {
      Account: this.serializeAccounts(inMemCache.accounts),
      IdToken: this.serializeIdTokens(inMemCache.idTokens),
      AccessToken: this.serializeAccessTokens(inMemCache.accessTokens),
      RefreshToken: this.serializeRefreshTokens(inMemCache.refreshTokens),
      AppMetadata: this.serializeAppMetadata(inMemCache.appMetadata)
    };
  }

}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * This class implements Storage for node, reading cache from user specified storage location or an  extension library
 * @public
 */

class NodeStorage extends msalCommon.CacheManager {
  constructor(logger, clientId, cryptoImpl) {
    super(clientId, cryptoImpl);
    this.cache = {};
    this.changeEmitters = [];
    this.logger = logger;
  }
  /**
   * Queue up callbacks
   * @param func - a callback function for cache change indication
   */


  registerChangeEmitter(func) {
    this.changeEmitters.push(func);
  }
  /**
   * Invoke the callback when cache changes
   */


  emitChange() {
    this.changeEmitters.forEach(func => func.call(null));
  }
  /**
   * Converts cacheKVStore to InMemoryCache
   * @param cache - key value store
   */


  cacheToInMemoryCache(cache) {
    const inMemoryCache = {
      accounts: {},
      idTokens: {},
      accessTokens: {},
      refreshTokens: {},
      appMetadata: {}
    };

    for (const key in cache) {
      if (cache[key] instanceof msalCommon.AccountEntity) {
        inMemoryCache.accounts[key] = cache[key];
      } else if (cache[key] instanceof msalCommon.IdTokenEntity) {
        inMemoryCache.idTokens[key] = cache[key];
      } else if (cache[key] instanceof msalCommon.AccessTokenEntity) {
        inMemoryCache.accessTokens[key] = cache[key];
      } else if (cache[key] instanceof msalCommon.RefreshTokenEntity) {
        inMemoryCache.refreshTokens[key] = cache[key];
      } else if (cache[key] instanceof msalCommon.AppMetadataEntity) {
        inMemoryCache.appMetadata[key] = cache[key];
      } else {
        continue;
      }
    }

    return inMemoryCache;
  }
  /**
   * converts inMemoryCache to CacheKVStore
   * @param inMemoryCache - kvstore map for inmemory
   */


  inMemoryCacheToCache(inMemoryCache) {
    // convert in memory cache to a flat Key-Value map
    let cache = this.getCache();
    cache = { ...cache,
      ...inMemoryCache.accounts,
      ...inMemoryCache.idTokens,
      ...inMemoryCache.accessTokens,
      ...inMemoryCache.refreshTokens,
      ...inMemoryCache.appMetadata
    }; // convert in memory cache to a flat Key-Value map

    return cache;
  }
  /**
   * gets the current in memory cache for the client
   */


  getInMemoryCache() {
    this.logger.trace("Getting in-memory cache"); // convert the cache key value store to inMemoryCache

    const inMemoryCache = this.cacheToInMemoryCache(this.getCache());
    return inMemoryCache;
  }
  /**
   * sets the current in memory cache for the client
   * @param inMemoryCache - key value map in memory
   */


  setInMemoryCache(inMemoryCache) {
    this.logger.trace("Setting in-memory cache"); // convert and append the inMemoryCache to cacheKVStore

    const cache = this.inMemoryCacheToCache(inMemoryCache);
    this.setCache(cache);
    this.emitChange();
  }
  /**
   * get the current cache key-value store
   */


  getCache() {
    this.logger.trace("Getting cache key-value store");
    return this.cache;
  }
  /**
   * sets the current cache (key value store)
   * @param cacheMap - key value map
   */


  setCache(cache) {
    this.logger.trace("Setting cache key value store");
    this.cache = cache; // mark change in cache

    this.emitChange();
  }
  /**
   * Gets cache item with given key.
   * @param key - lookup key for the cache entry
   */


  getItem(key) {
    this.logger.tracePii(`Item key: ${key}`); // read cache

    const cache = this.getCache();
    return cache[key];
  }
  /**
   * Gets cache item with given key-value
   * @param key - lookup key for the cache entry
   * @param value - value of the cache entry
   */


  setItem(key, value) {
    this.logger.tracePii(`Item key: ${key}`); // read cache

    const cache = this.getCache();
    cache[key] = value; // write to cache

    this.setCache(cache);
  }
  /**
   * fetch the account entity
   * @param accountKey - lookup key to fetch cache type AccountEntity
   */


  getAccount(accountKey) {
    const account = this.getItem(accountKey);

    if (msalCommon.AccountEntity.isAccountEntity(account)) {
      return account;
    }

    return null;
  }
  /**
   * set account entity
   * @param account - cache value to be set of type AccountEntity
   */


  setAccount(account) {
    const accountKey = account.generateAccountKey();
    this.setItem(accountKey, account);
  }
  /**
   * fetch the idToken credential
   * @param idTokenKey - lookup key to fetch cache type IdTokenEntity
   */


  getIdTokenCredential(idTokenKey) {
    const idToken = this.getItem(idTokenKey);

    if (msalCommon.IdTokenEntity.isIdTokenEntity(idToken)) {
      return idToken;
    }

    return null;
  }
  /**
   * set idToken credential
   * @param idToken - cache value to be set of type IdTokenEntity
   */


  setIdTokenCredential(idToken) {
    const idTokenKey = idToken.generateCredentialKey();
    this.setItem(idTokenKey, idToken);
  }
  /**
   * fetch the accessToken credential
   * @param accessTokenKey - lookup key to fetch cache type AccessTokenEntity
   */


  getAccessTokenCredential(accessTokenKey) {
    const accessToken = this.getItem(accessTokenKey);

    if (msalCommon.AccessTokenEntity.isAccessTokenEntity(accessToken)) {
      return accessToken;
    }

    return null;
  }
  /**
   * set accessToken credential
   * @param accessToken -  cache value to be set of type AccessTokenEntity
   */


  setAccessTokenCredential(accessToken) {
    const accessTokenKey = accessToken.generateCredentialKey();
    this.setItem(accessTokenKey, accessToken);
  }
  /**
   * fetch the refreshToken credential
   * @param refreshTokenKey - lookup key to fetch cache type RefreshTokenEntity
   */


  getRefreshTokenCredential(refreshTokenKey) {
    const refreshToken = this.getItem(refreshTokenKey);

    if (msalCommon.RefreshTokenEntity.isRefreshTokenEntity(refreshToken)) {
      return refreshToken;
    }

    return null;
  }
  /**
   * set refreshToken credential
   * @param refreshToken - cache value to be set of type RefreshTokenEntity
   */


  setRefreshTokenCredential(refreshToken) {
    const refreshTokenKey = refreshToken.generateCredentialKey();
    this.setItem(refreshTokenKey, refreshToken);
  }
  /**
   * fetch appMetadata entity from the platform cache
   * @param appMetadataKey - lookup key to fetch cache type AppMetadataEntity
   */


  getAppMetadata(appMetadataKey) {
    const appMetadata = this.getItem(appMetadataKey);

    if (msalCommon.AppMetadataEntity.isAppMetadataEntity(appMetadataKey, appMetadata)) {
      return appMetadata;
    }

    return null;
  }
  /**
   * set appMetadata entity to the platform cache
   * @param appMetadata - cache value to be set of type AppMetadataEntity
   */


  setAppMetadata(appMetadata) {
    const appMetadataKey = appMetadata.generateAppMetadataKey();
    this.setItem(appMetadataKey, appMetadata);
  }
  /**
   * fetch server telemetry entity from the platform cache
   * @param serverTelemetrykey - lookup key to fetch cache type ServerTelemetryEntity
   */


  getServerTelemetry(serverTelemetrykey) {
    const serverTelemetryEntity = this.getItem(serverTelemetrykey);

    if (serverTelemetryEntity && msalCommon.ServerTelemetryEntity.isServerTelemetryEntity(serverTelemetrykey, serverTelemetryEntity)) {
      return serverTelemetryEntity;
    }

    return null;
  }
  /**
   * set server telemetry entity to the platform cache
   * @param serverTelemetryKey - lookup key to fetch cache type ServerTelemetryEntity
   * @param serverTelemetry - cache value to be set of type ServerTelemetryEntity
   */


  setServerTelemetry(serverTelemetryKey, serverTelemetry) {
    this.setItem(serverTelemetryKey, serverTelemetry);
  }
  /**
   * fetch authority metadata entity from the platform cache
   * @param key - lookup key to fetch cache type AuthorityMetadataEntity
   */


  getAuthorityMetadata(key) {
    const authorityMetadataEntity = this.getItem(key);

    if (authorityMetadataEntity && msalCommon.AuthorityMetadataEntity.isAuthorityMetadataEntity(key, authorityMetadataEntity)) {
      return authorityMetadataEntity;
    }

    return null;
  }
  /**
   * Get all authority metadata keys
   */


  getAuthorityMetadataKeys() {
    return this.getKeys().filter(key => {
      return this.isAuthorityMetadata(key);
    });
  }
  /**
   * set authority metadata entity to the platform cache
   * @param key - lookup key to fetch cache type AuthorityMetadataEntity
   * @param metadata - cache value to be set of type AuthorityMetadataEntity
   */


  setAuthorityMetadata(key, metadata) {
    this.setItem(key, metadata);
  }
  /**
   * fetch throttling entity from the platform cache
   * @param throttlingCacheKey - lookup key to fetch cache type ThrottlingEntity
   */


  getThrottlingCache(throttlingCacheKey) {
    const throttlingCache = this.getItem(throttlingCacheKey);

    if (throttlingCache && msalCommon.ThrottlingEntity.isThrottlingEntity(throttlingCacheKey, throttlingCache)) {
      return throttlingCache;
    }

    return null;
  }
  /**
   * set throttling entity to the platform cache
   * @param throttlingCacheKey - lookup key to fetch cache type ThrottlingEntity
   * @param throttlingCache - cache value to be set of type ThrottlingEntity
   */


  setThrottlingCache(throttlingCacheKey, throttlingCache) {
    this.setItem(throttlingCacheKey, throttlingCache);
  }
  /**
   * Removes the cache item from memory with the given key.
   * @param key - lookup key to remove a cache entity
   * @param inMemory - key value map of the cache
   */


  removeItem(key) {
    this.logger.tracePii(`Item key: ${key}`); // read inMemoryCache

    let result = false;
    const cache = this.getCache();

    if (!!cache[key]) {
      delete cache[key];
      result = true;
    } // write to the cache after removal


    if (result) {
      this.setCache(cache);
      this.emitChange();
    }

    return result;
  }
  /**
   * Checks whether key is in cache.
   * @param key - look up key for a cache entity
   */


  containsKey(key) {
    return this.getKeys().includes(key);
  }
  /**
   * Gets all keys in window.
   */


  getKeys() {
    this.logger.trace("Retrieving all cache keys"); // read cache

    const cache = this.getCache();
    return [...Object.keys(cache)];
  }
  /**
   * Clears all cache entries created by MSAL (except tokens).
   */


  async clear() {
    this.logger.trace("Clearing cache entries created by MSAL"); // read inMemoryCache

    const cacheKeys = this.getKeys(); // delete each element

    cacheKeys.forEach(key => {
      this.removeItem(key);
    });
    this.emitChange();
  }
  /**
   * Initialize in memory cache from an exisiting cache vault
   * @param cache - blob formatted cache (JSON)
   */


  static generateInMemoryCache(cache) {
    return Deserializer.deserializeAllCache(Deserializer.deserializeJSONBlob(cache));
  }
  /**
   * retrieves the final JSON
   * @param inMemoryCache - itemised cache read from the JSON
   */


  static generateJsonCache(inMemoryCache) {
    return Serializer.serializeAllCache(inMemoryCache);
  }
  /**
   * Updates a credential's cache key if the current cache key is outdated
   */


  updateCredentialCacheKey(currentCacheKey, credential) {
    const updatedCacheKey = credential.generateCredentialKey();

    if (currentCacheKey !== updatedCacheKey) {
      const cacheItem = this.getItem(currentCacheKey);

      if (cacheItem) {
        this.removeItem(currentCacheKey);
        this.setItem(updatedCacheKey, cacheItem);
        this.logger.verbose(`Updated an outdated ${credential.credentialType} cache key`);
        return updatedCacheKey;
      } else {
        this.logger.error(`Attempted to update an outdated ${credential.credentialType} cache key but no item matching the outdated key was found in storage`);
      }
    }

    return currentCacheKey;
  }

}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
const defaultSerializedCache = {
  Account: {},
  IdToken: {},
  AccessToken: {},
  RefreshToken: {},
  AppMetadata: {}
};
/**
 * In-memory token cache manager
 * @public
 */

class TokenCache {
  constructor(storage, logger, cachePlugin) {
    this.cacheHasChanged = false;
    this.storage = storage;
    this.storage.registerChangeEmitter(this.handleChangeEvent.bind(this));

    if (cachePlugin) {
      this.persistence = cachePlugin;
    }

    this.logger = logger;
  }
  /**
   * Set to true if cache state has changed since last time serialize or writeToPersistence was called
   */


  hasChanged() {
    return this.cacheHasChanged;
  }
  /**
   * Serializes in memory cache to JSON
   */


  serialize() {
    this.logger.trace("Serializing in-memory cache");
    let finalState = Serializer.serializeAllCache(this.storage.getInMemoryCache()); // if cacheSnapshot not null or empty, merge

    if (!msalCommon.StringUtils.isEmpty(this.cacheSnapshot)) {
      this.logger.trace("Reading cache snapshot from disk");
      finalState = this.mergeState(JSON.parse(this.cacheSnapshot), finalState);
    } else {
      this.logger.trace("No cache snapshot to merge");
    }

    this.cacheHasChanged = false;
    return JSON.stringify(finalState);
  }
  /**
   * Deserializes JSON to in-memory cache. JSON should be in MSAL cache schema format
   * @param cache - blob formatted cache
   */


  deserialize(cache) {
    this.logger.trace("Deserializing JSON to in-memory cache");
    this.cacheSnapshot = cache;

    if (!msalCommon.StringUtils.isEmpty(this.cacheSnapshot)) {
      this.logger.trace("Reading cache snapshot from disk");
      const deserializedCache = Deserializer.deserializeAllCache(this.overlayDefaults(JSON.parse(this.cacheSnapshot)));
      this.storage.setInMemoryCache(deserializedCache);
    } else {
      this.logger.trace("No cache snapshot to deserialize");
    }
  }
  /**
   * Fetches the cache key-value map
   */


  getKVStore() {
    return this.storage.getCache();
  }
  /**
   * API that retrieves all accounts currently in cache to the user
   */


  async getAllAccounts() {
    this.logger.trace("getAllAccounts called");
    let cacheContext;

    try {
      if (this.persistence) {
        cacheContext = new msalCommon.TokenCacheContext(this, false);
        await this.persistence.beforeCacheAccess(cacheContext);
      }

      return this.storage.getAllAccounts();
    } finally {
      if (this.persistence && cacheContext) {
        await this.persistence.afterCacheAccess(cacheContext);
      }
    }
  }
  /**
   * Returns the signed in account matching homeAccountId.
   * (the account object is created at the time of successful login)
   * or null when no matching account is found
   * @param homeAccountId - unique identifier for an account (uid.utid)
   */


  async getAccountByHomeId(homeAccountId) {
    const allAccounts = await this.getAllAccounts();

    if (!msalCommon.StringUtils.isEmpty(homeAccountId) && allAccounts && allAccounts.length) {
      return allAccounts.filter(accountObj => accountObj.homeAccountId === homeAccountId)[0] || null;
    } else {
      return null;
    }
  }
  /**
   * Returns the signed in account matching localAccountId.
   * (the account object is created at the time of successful login)
   * or null when no matching account is found
   * @param localAccountId - unique identifier of an account (sub/obj when homeAccountId cannot be populated)
   */


  async getAccountByLocalId(localAccountId) {
    const allAccounts = await this.getAllAccounts();

    if (!msalCommon.StringUtils.isEmpty(localAccountId) && allAccounts && allAccounts.length) {
      return allAccounts.filter(accountObj => accountObj.localAccountId === localAccountId)[0] || null;
    } else {
      return null;
    }
  }
  /**
   * API to remove a specific account and the relevant data from cache
   * @param account - AccountInfo passed by the user
   */


  async removeAccount(account) {
    this.logger.trace("removeAccount called");
    let cacheContext;

    try {
      if (this.persistence) {
        cacheContext = new msalCommon.TokenCacheContext(this, true);
        await this.persistence.beforeCacheAccess(cacheContext);
      }

      await this.storage.removeAccount(msalCommon.AccountEntity.generateAccountCacheKey(account));
    } finally {
      if (this.persistence && cacheContext) {
        await this.persistence.afterCacheAccess(cacheContext);
      }
    }
  }
  /**
   * Called when the cache has changed state.
   */


  handleChangeEvent() {
    this.cacheHasChanged = true;
  }
  /**
   * Merge in memory cache with the cache snapshot.
   * @param oldState - cache before changes
   * @param currentState - current cache state in the library
   */


  mergeState(oldState, currentState) {
    this.logger.trace("Merging in-memory cache with cache snapshot");
    const stateAfterRemoval = this.mergeRemovals(oldState, currentState);
    return this.mergeUpdates(stateAfterRemoval, currentState);
  }
  /**
   * Deep update of oldState based on newState values
   * @param oldState - cache before changes
   * @param newState - updated cache
   */


  mergeUpdates(oldState, newState) {
    Object.keys(newState).forEach(newKey => {
      const newValue = newState[newKey]; // if oldState does not contain value but newValue does, add it

      if (!oldState.hasOwnProperty(newKey)) {
        if (newValue !== null) {
          oldState[newKey] = newValue;
        }
      } else {
        // both oldState and newState contain the key, do deep update
        const newValueNotNull = newValue !== null;
        const newValueIsObject = typeof newValue === "object";
        const newValueIsNotArray = !Array.isArray(newValue);
        const oldStateNotUndefinedOrNull = typeof oldState[newKey] !== "undefined" && oldState[newKey] !== null;

        if (newValueNotNull && newValueIsObject && newValueIsNotArray && oldStateNotUndefinedOrNull) {
          this.mergeUpdates(oldState[newKey], newValue);
        } else {
          oldState[newKey] = newValue;
        }
      }
    });
    return oldState;
  }
  /**
   * Removes entities in oldState that the were removed from newState. If there are any unknown values in root of
   * oldState that are not recognized, they are left untouched.
   * @param oldState - cache before changes
   * @param newState - updated cache
   */


  mergeRemovals(oldState, newState) {
    this.logger.trace("Remove updated entries in cache");
    const accounts = oldState.Account ? this.mergeRemovalsDict(oldState.Account, newState.Account) : oldState.Account;
    const accessTokens = oldState.AccessToken ? this.mergeRemovalsDict(oldState.AccessToken, newState.AccessToken) : oldState.AccessToken;
    const refreshTokens = oldState.RefreshToken ? this.mergeRemovalsDict(oldState.RefreshToken, newState.RefreshToken) : oldState.RefreshToken;
    const idTokens = oldState.IdToken ? this.mergeRemovalsDict(oldState.IdToken, newState.IdToken) : oldState.IdToken;
    const appMetadata = oldState.AppMetadata ? this.mergeRemovalsDict(oldState.AppMetadata, newState.AppMetadata) : oldState.AppMetadata;
    return { ...oldState,
      Account: accounts,
      AccessToken: accessTokens,
      RefreshToken: refreshTokens,
      IdToken: idTokens,
      AppMetadata: appMetadata
    };
  }
  /**
   * Helper to merge new cache with the old one
   * @param oldState - cache before changes
   * @param newState - updated cache
   */


  mergeRemovalsDict(oldState, newState) {
    const finalState = { ...oldState
    };
    Object.keys(oldState).forEach(oldKey => {
      if (!newState || !newState.hasOwnProperty(oldKey)) {
        delete finalState[oldKey];
      }
    });
    return finalState;
  }
  /**
   * Helper to overlay as a part of cache merge
   * @param passedInCache - cache read from the blob
   */


  overlayDefaults(passedInCache) {
    this.logger.trace("Overlaying input cache with the default cache");
    return {
      Account: { ...defaultSerializedCache.Account,
        ...passedInCache.Account
      },
      IdToken: { ...defaultSerializedCache.IdToken,
        ...passedInCache.IdToken
      },
      AccessToken: { ...defaultSerializedCache.AccessToken,
        ...passedInCache.AccessToken
      },
      RefreshToken: { ...defaultSerializedCache.RefreshToken,
        ...passedInCache.RefreshToken
      },
      AppMetadata: { ...defaultSerializedCache.AppMetadata,
        ...passedInCache.AppMetadata
      }
    };
  }

}

/* eslint-disable header/header */
const name = "@azure/msal-node";
const version = "1.12.1";

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Base abstract class for all ClientApplications - public and confidential
 * @public
 */

class ClientApplication {
  /**
   * Constructor for the ClientApplication
   */
  constructor(configuration) {
    this.config = buildAppConfiguration(configuration);
    this.cryptoProvider = new CryptoProvider();
    this.logger = new msalCommon.Logger(this.config.system.loggerOptions, name, version);
    this.storage = new NodeStorage(this.logger, this.config.auth.clientId, this.cryptoProvider);
    this.tokenCache = new TokenCache(this.storage, this.logger, this.config.cache.cachePlugin);
  }
  /**
   * Creates the URL of the authorization request, letting the user input credentials and consent to the
   * application. The URL targets the /authorize endpoint of the authority configured in the
   * application object.
   *
   * Once the user inputs their credentials and consents, the authority will send a response to the redirect URI
   * sent in the request and should contain an authorization code, which can then be used to acquire tokens via
   * `acquireTokenByCode(AuthorizationCodeRequest)`.
   */


  async getAuthCodeUrl(request) {
    this.logger.info("getAuthCodeUrl called", request.correlationId);
    const validRequest = { ...request,
      ...(await this.initializeBaseRequest(request)),
      responseMode: request.responseMode || msalCommon.ResponseMode.QUERY,
      authenticationScheme: msalCommon.AuthenticationScheme.BEARER
    };
    const authClientConfig = await this.buildOauthClientConfiguration(validRequest.authority, validRequest.correlationId, undefined, undefined, request.azureCloudOptions);
    const authorizationCodeClient = new msalCommon.AuthorizationCodeClient(authClientConfig);
    this.logger.verbose("Auth code client created", validRequest.correlationId);
    return authorizationCodeClient.getAuthCodeUrl(validRequest);
  }
  /**
   * Acquires a token by exchanging the Authorization Code received from the first step of OAuth2.0
   * Authorization Code flow.
   *
   * `getAuthCodeUrl(AuthorizationCodeUrlRequest)` can be used to create the URL for the first step of OAuth2.0
   * Authorization Code flow. Ensure that values for redirectUri and scopes in AuthorizationCodeUrlRequest and
   * AuthorizationCodeRequest are the same.
   */


  async acquireTokenByCode(request, authCodePayLoad) {
    this.logger.info("acquireTokenByCode called", request.correlationId);
    const validRequest = { ...request,
      ...(await this.initializeBaseRequest(request)),
      authenticationScheme: msalCommon.AuthenticationScheme.BEARER
    };
    const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenByCode, validRequest.correlationId);

    try {
      const authClientConfig = await this.buildOauthClientConfiguration(validRequest.authority, validRequest.correlationId, serverTelemetryManager, undefined, request.azureCloudOptions);
      const authorizationCodeClient = new msalCommon.AuthorizationCodeClient(authClientConfig);
      this.logger.verbose("Auth code client created", validRequest.correlationId);
      return authorizationCodeClient.acquireToken(validRequest, authCodePayLoad);
    } catch (e) {
      if (e instanceof msalCommon.AuthError) {
        e.setCorrelationId(validRequest.correlationId);
      }

      serverTelemetryManager.cacheFailedRequest(e);
      throw e;
    }
  }
  /**
   * Acquires a token by exchanging the refresh token provided for a new set of tokens.
   *
   * This API is provided only for scenarios where you would like to migrate from ADAL to MSAL. Otherwise, it is
   * recommended that you use `acquireTokenSilent()` for silent scenarios. When using `acquireTokenSilent()`, MSAL will
   * handle the caching and refreshing of tokens automatically.
   */


  async acquireTokenByRefreshToken(request) {
    this.logger.info("acquireTokenByRefreshToken called", request.correlationId);
    const validRequest = { ...request,
      ...(await this.initializeBaseRequest(request)),
      authenticationScheme: msalCommon.AuthenticationScheme.BEARER
    };
    const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenByRefreshToken, validRequest.correlationId);

    try {
      const refreshTokenClientConfig = await this.buildOauthClientConfiguration(validRequest.authority, validRequest.correlationId, serverTelemetryManager, undefined, request.azureCloudOptions);
      const refreshTokenClient = new msalCommon.RefreshTokenClient(refreshTokenClientConfig);
      this.logger.verbose("Refresh token client created", validRequest.correlationId);
      return refreshTokenClient.acquireToken(validRequest);
    } catch (e) {
      if (e instanceof msalCommon.AuthError) {
        e.setCorrelationId(validRequest.correlationId);
      }

      serverTelemetryManager.cacheFailedRequest(e);
      throw e;
    }
  }
  /**
   * Acquires a token silently when a user specifies the account the token is requested for.
   *
   * This API expects the user to provide an account object and looks into the cache to retrieve the token if present.
   * There is also an optional "forceRefresh" boolean the user can send to bypass the cache for access_token and id_token.
   * In case the refresh_token is expired or not found, an error is thrown
   * and the guidance is for the user to call any interactive token acquisition API (eg: `acquireTokenByCode()`).
   */


  async acquireTokenSilent(request) {
    const validRequest = { ...request,
      ...(await this.initializeBaseRequest(request)),
      forceRefresh: request.forceRefresh || false
    };
    const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenSilent, validRequest.correlationId, validRequest.forceRefresh);

    try {
      const silentFlowClientConfig = await this.buildOauthClientConfiguration(validRequest.authority, validRequest.correlationId, serverTelemetryManager, undefined, request.azureCloudOptions);
      const silentFlowClient = new msalCommon.SilentFlowClient(silentFlowClientConfig);
      this.logger.verbose("Silent flow client created", validRequest.correlationId);
      return silentFlowClient.acquireToken(validRequest);
    } catch (e) {
      if (e instanceof msalCommon.AuthError) {
        e.setCorrelationId(validRequest.correlationId);
      }

      serverTelemetryManager.cacheFailedRequest(e);
      throw e;
    }
  }
  /**
   * Acquires tokens with password grant by exchanging client applications username and password for credentials
   *
   * The latest OAuth 2.0 Security Best Current Practice disallows the password grant entirely.
   * More details on this recommendation at https://tools.ietf.org/html/draft-ietf-oauth-security-topics-13#section-3.4
   * Microsoft's documentation and recommendations are at:
   * https://docs.microsoft.com/en-us/azure/active-directory/develop/msal-authentication-flows#usernamepassword
   *
   * @param request - UsenamePasswordRequest
   */


  async acquireTokenByUsernamePassword(request) {
    this.logger.info("acquireTokenByUsernamePassword called", request.correlationId);
    const validRequest = { ...request,
      ...(await this.initializeBaseRequest(request))
    };
    const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenByUsernamePassword, validRequest.correlationId);

    try {
      const usernamePasswordClientConfig = await this.buildOauthClientConfiguration(validRequest.authority, validRequest.correlationId, serverTelemetryManager, undefined, request.azureCloudOptions);
      const usernamePasswordClient = new msalCommon.UsernamePasswordClient(usernamePasswordClientConfig);
      this.logger.verbose("Username password client created", validRequest.correlationId);
      return usernamePasswordClient.acquireToken(validRequest);
    } catch (e) {
      if (e instanceof msalCommon.AuthError) {
        e.setCorrelationId(validRequest.correlationId);
      }

      serverTelemetryManager.cacheFailedRequest(e);
      throw e;
    }
  }
  /**
   * Gets the token cache for the application.
   */


  getTokenCache() {
    this.logger.info("getTokenCache called");
    return this.tokenCache;
  }
  /**
   * Returns the logger instance
   */


  getLogger() {
    return this.logger;
  }
  /**
   * Replaces the default logger set in configurations with new Logger with new configurations
   * @param logger - Logger instance
   */


  setLogger(logger) {
    this.logger = logger;
  }
  /**
   * Builds the common configuration to be passed to the common component based on the platform configurarion
   * @param authority - user passed authority in configuration
   * @param serverTelemetryManager - initializes servertelemetry if passed
   */


  async buildOauthClientConfiguration(authority, requestCorrelationId, serverTelemetryManager, azureRegionConfiguration, azureCloudOptions) {
    this.logger.verbose("buildOauthClientConfiguration called", requestCorrelationId); // precedence - azureCloudInstance + tenant >> authority and request  >> config

    const userAzureCloudOptions = azureCloudOptions ? azureCloudOptions : this.config.auth.azureCloudOptions; // using null assertion operator as we ensure that all config values have default values in buildConfiguration()

    this.logger.verbose(`building oauth client configuration with the authority: ${authority}`, requestCorrelationId);
    const discoveredAuthority = await this.createAuthority(authority, azureRegionConfiguration, requestCorrelationId, userAzureCloudOptions);
    serverTelemetryManager == null ? void 0 : serverTelemetryManager.updateRegionDiscoveryMetadata(discoveredAuthority.regionDiscoveryMetadata);
    const clientConfiguration = {
      authOptions: {
        clientId: this.config.auth.clientId,
        authority: discoveredAuthority,
        clientCapabilities: this.config.auth.clientCapabilities
      },
      systemOptions: {
        proxyUrl: this.config.system.proxyUrl
      },
      loggerOptions: {
        logLevel: this.config.system.loggerOptions.logLevel,
        loggerCallback: this.config.system.loggerOptions.loggerCallback,
        piiLoggingEnabled: this.config.system.loggerOptions.piiLoggingEnabled,
        correlationId: requestCorrelationId
      },
      cryptoInterface: this.cryptoProvider,
      networkInterface: this.config.system.networkClient,
      storageInterface: this.storage,
      serverTelemetryManager: serverTelemetryManager,
      clientCredentials: {
        clientSecret: this.clientSecret,
        clientAssertion: this.clientAssertion ? this.getClientAssertion(discoveredAuthority) : undefined
      },
      libraryInfo: {
        sku: Constants.MSAL_SKU,
        version: version,
        cpu: process.arch || msalCommon.Constants.EMPTY_STRING,
        os: process.platform || msalCommon.Constants.EMPTY_STRING
      },
      telemetry: this.config.telemetry,
      persistencePlugin: this.config.cache.cachePlugin,
      serializableCache: this.tokenCache
    };
    return clientConfiguration;
  }

  getClientAssertion(authority) {
    return {
      assertion: this.clientAssertion.getJwt(this.cryptoProvider, this.config.auth.clientId, authority.tokenEndpoint),
      assertionType: Constants.JWT_BEARER_ASSERTION_TYPE
    };
  }
  /**
   * Generates a request with the default scopes & generates a correlationId.
   * @param authRequest - BaseAuthRequest for initialization
   */


  async initializeBaseRequest(authRequest) {
    this.logger.verbose("initializeRequestScopes called", authRequest.correlationId); // Default authenticationScheme to Bearer, log that POP isn't supported yet

    if (authRequest.authenticationScheme && authRequest.authenticationScheme === msalCommon.AuthenticationScheme.POP) {
      this.logger.verbose("Authentication Scheme 'pop' is not supported yet, setting Authentication Scheme to 'Bearer' for request", authRequest.correlationId);
    }

    authRequest.authenticationScheme = msalCommon.AuthenticationScheme.BEARER; // Set requested claims hash if claims were requested

    if (authRequest.claims && !msalCommon.StringUtils.isEmpty(authRequest.claims)) {
      authRequest.requestedClaimsHash = await this.cryptoProvider.hashString(authRequest.claims);
    }

    return { ...authRequest,
      scopes: [...(authRequest && authRequest.scopes || []), ...msalCommon.OIDC_DEFAULT_SCOPES],
      correlationId: authRequest && authRequest.correlationId || this.cryptoProvider.createNewGuid(),
      authority: authRequest.authority || this.config.auth.authority
    };
  }
  /**
   * Initializes the server telemetry payload
   * @param apiId - Id for a specific request
   * @param correlationId - GUID
   * @param forceRefresh - boolean to indicate network call
   */


  initializeServerTelemetryManager(apiId, correlationId, forceRefresh) {
    const telemetryPayload = {
      clientId: this.config.auth.clientId,
      correlationId: correlationId,
      apiId: apiId,
      forceRefresh: forceRefresh || false
    };
    return new msalCommon.ServerTelemetryManager(telemetryPayload, this.storage);
  }
  /**
   * Create authority instance. If authority not passed in request, default to authority set on the application
   * object. If no authority set in application object, then default to common authority.
   * @param authorityString - authority from user configuration
   */


  async createAuthority(authorityString, azureRegionConfiguration, requestCorrelationId, azureCloudOptions) {
    this.logger.verbose("createAuthority called", requestCorrelationId); // build authority string based on auth params - azureCloudInstance is prioritized if provided

    const authorityUrl = msalCommon.Authority.generateAuthority(authorityString, azureCloudOptions);
    const authorityOptions = {
      protocolMode: this.config.auth.protocolMode,
      knownAuthorities: this.config.auth.knownAuthorities,
      cloudDiscoveryMetadata: this.config.auth.cloudDiscoveryMetadata,
      authorityMetadata: this.config.auth.authorityMetadata,
      azureRegionConfiguration,
      skipAuthorityMetadataCache: this.config.auth.skipAuthorityMetadataCache
    };
    return await msalCommon.AuthorityFactory.createDiscoveredInstance(authorityUrl, this.config.system.networkClient, this.storage, authorityOptions, this.config.system.proxyUrl);
  }
  /**
   * Clear the cache
   */


  clearCache() {
    this.storage.clear();
  }

}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * This class is to be used to acquire tokens for public client applications (desktop, mobile). Public client applications
 * are not trusted to safely store application secrets, and therefore can only request tokens in the name of an user.
 * @public
 */

class PublicClientApplication extends ClientApplication {
  /**
   * Important attributes in the Configuration object for auth are:
   * - clientID: the application ID of your application. You can obtain one by registering your application with our Application registration portal.
   * - authority: the authority URL for your application.
   *
   * AAD authorities are of the form https://login.microsoftonline.com/\{Enter_the_Tenant_Info_Here\}.
   * - If your application supports Accounts in one organizational directory, replace "Enter_the_Tenant_Info_Here" value with the Tenant Id or Tenant name (for example, contoso.microsoft.com).
   * - If your application supports Accounts in any organizational directory, replace "Enter_the_Tenant_Info_Here" value with organizations.
   * - If your application supports Accounts in any organizational directory and personal Microsoft accounts, replace "Enter_the_Tenant_Info_Here" value with common.
   * - To restrict support to Personal Microsoft accounts only, replace "Enter_the_Tenant_Info_Here" value with consumers.
   *
   * Azure B2C authorities are of the form https://\{instance\}/\{tenant\}/\{policy\}. Each policy is considered
   * its own authority. You will have to set the all of the knownAuthorities at the time of the client application
   * construction.
   *
   * ADFS authorities are of the form https://\{instance\}/adfs.
   */
  constructor(configuration) {
    super(configuration);
  }
  /**
   * Acquires a token from the authority using OAuth2.0 device code flow.
   * This flow is designed for devices that do not have access to a browser or have input constraints.
   * The authorization server issues a DeviceCode object with a verification code, an end-user code,
   * and the end-user verification URI. The DeviceCode object is provided through a callback, and the end-user should be
   * instructed to use another device to navigate to the verification URI to input credentials.
   * Since the client cannot receive incoming requests, it polls the authorization server repeatedly
   * until the end-user completes input of credentials.
   */


  async acquireTokenByDeviceCode(request) {
    this.logger.info("acquireTokenByDeviceCode called", request.correlationId);
    const validRequest = Object.assign(request, await this.initializeBaseRequest(request));
    const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenByDeviceCode, validRequest.correlationId);

    try {
      const deviceCodeConfig = await this.buildOauthClientConfiguration(validRequest.authority, validRequest.correlationId, serverTelemetryManager, undefined, request.azureCloudOptions);
      const deviceCodeClient = new msalCommon.DeviceCodeClient(deviceCodeConfig);
      this.logger.verbose("Device code client created", validRequest.correlationId);
      return deviceCodeClient.acquireToken(validRequest);
    } catch (e) {
      if (e instanceof msalCommon.AuthError) {
        e.setCorrelationId(validRequest.correlationId);
      }

      serverTelemetryManager.cacheFailedRequest(e);
      throw e;
    }
  }

}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Client assertion of type jwt-bearer used in confidential client flows
 * @public
 */

class ClientAssertion {
  /**
   * Initialize the ClientAssertion class from the clientAssertion passed by the user
   * @param assertion - refer https://tools.ietf.org/html/rfc7521
   */
  static fromAssertion(assertion) {
    const clientAssertion = new ClientAssertion();
    clientAssertion.jwt = assertion;
    return clientAssertion;
  }
  /**
   * Initialize the ClientAssertion class from the certificate passed by the user
   * @param thumbprint - identifier of a certificate
   * @param privateKey - secret key
   * @param publicCertificate - electronic document provided to prove the ownership of the public key
   */


  static fromCertificate(thumbprint, privateKey, publicCertificate) {
    const clientAssertion = new ClientAssertion();
    clientAssertion.privateKey = privateKey;
    clientAssertion.thumbprint = thumbprint;

    if (publicCertificate) {
      clientAssertion.publicCertificate = this.parseCertificate(publicCertificate);
    }

    return clientAssertion;
  }
  /**
   * Update JWT for certificate based clientAssertion, if passed by the user, uses it as is
   * @param cryptoProvider - library's crypto helper
   * @param issuer - iss claim
   * @param jwtAudience - aud claim
   */


  getJwt(cryptoProvider, issuer, jwtAudience) {
    // if assertion was created from certificate, check if jwt is expired and create new one.
    if (this.privateKey && this.thumbprint) {
      if (this.jwt && !this.isExpired() && issuer === this.issuer && jwtAudience === this.jwtAudience) {
        return this.jwt;
      }

      return this.createJwt(cryptoProvider, issuer, jwtAudience);
    }
    /*
     * if assertion was created by caller, then we just append it. It is up to the caller to
     * ensure that it contains necessary claims and that it is not expired.
     */


    if (this.jwt) {
      return this.jwt;
    }

    throw msalCommon.ClientAuthError.createInvalidAssertionError();
  }
  /**
   * JWT format and required claims specified: https://tools.ietf.org/html/rfc7523#section-3
   */


  createJwt(cryptoProvider, issuer, jwtAudience) {
    this.issuer = issuer;
    this.jwtAudience = jwtAudience;
    const issuedAt = msalCommon.TimeUtils.nowSeconds();
    this.expirationTime = issuedAt + 600;
    const header = {
      alg: JwtConstants.RSA_256,
      x5t: EncodingUtils.base64EncodeUrl(this.thumbprint, "hex")
    };

    if (this.publicCertificate) {
      Object.assign(header, {
        x5c: this.publicCertificate
      });
    }

    const payload = {
      [JwtConstants.AUDIENCE]: this.jwtAudience,
      [JwtConstants.EXPIRATION_TIME]: this.expirationTime,
      [JwtConstants.ISSUER]: this.issuer,
      [JwtConstants.SUBJECT]: this.issuer,
      [JwtConstants.NOT_BEFORE]: issuedAt,
      [JwtConstants.JWT_ID]: cryptoProvider.createNewGuid()
    };
    this.jwt = jsonwebtoken.sign(payload, this.privateKey, {
      header
    });
    return this.jwt;
  }
  /**
   * Utility API to check expiration
   */


  isExpired() {
    return this.expirationTime < msalCommon.TimeUtils.nowSeconds();
  }
  /**
   * Extracts the raw certs from a given certificate string and returns them in an array.
   * @param publicCertificate - electronic document provided to prove the ownership of the public key
   */


  static parseCertificate(publicCertificate) {
    /**
     * This is regex to identify the certs in a given certificate string.
     * We want to look for the contents between the BEGIN and END certificate strings, without the associated newlines.
     * The information in parens "(.+?)" is the capture group to represent the cert we want isolated.
     * "." means any string character, "+" means match 1 or more times, and "?" means the shortest match.
     * The "g" at the end of the regex means search the string globally, and the "s" enables the "." to match newlines.
     */
    const regexToFindCerts = /-----BEGIN CERTIFICATE-----\r*\n(.+?)\r*\n-----END CERTIFICATE-----/gs;
    const certs = [];
    let matches;

    while ((matches = regexToFindCerts.exec(publicCertificate)) !== null) {
      // matches[1] represents the first parens capture group in the regex.
      certs.push(matches[1].replace(/\r*\n/g, msalCommon.Constants.EMPTY_STRING));
    }

    return certs;
  }

}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 *  This class is to be used to acquire tokens for confidential client applications (webApp, webAPI). Confidential client applications
 *  will configure application secrets, client certificates/assertions as applicable
 * @public
 */

class ConfidentialClientApplication extends ClientApplication {
  /**
   * Constructor for the ConfidentialClientApplication
   *
   * Required attributes in the Configuration object are:
   * - clientID: the application ID of your application. You can obtain one by registering your application with our application registration portal
   * - authority: the authority URL for your application.
   * - client credential: Must set either client secret, certificate, or assertion for confidential clients. You can obtain a client secret from the application registration portal.
   *
   * In Azure AD, authority is a URL indicating of the form https://login.microsoftonline.com/\{Enter_the_Tenant_Info_Here\}.
   * If your application supports Accounts in one organizational directory, replace "Enter_the_Tenant_Info_Here" value with the Tenant Id or Tenant name (for example, contoso.microsoft.com).
   * If your application supports Accounts in any organizational directory, replace "Enter_the_Tenant_Info_Here" value with organizations.
   * If your application supports Accounts in any organizational directory and personal Microsoft accounts, replace "Enter_the_Tenant_Info_Here" value with common.
   * To restrict support to Personal Microsoft accounts only, replace "Enter_the_Tenant_Info_Here" value with consumers.
   *
   * In Azure B2C, authority is of the form https://\{instance\}/tfp/\{tenant\}/\{policyName\}/
   * Full B2C functionality will be available in this library in future versions.
   *
   * @param Configuration - configuration object for the MSAL ConfidentialClientApplication instance
   */
  constructor(configuration) {
    super(configuration);
    this.setClientCredential(this.config);
    this.appTokenProvider = undefined;
  }
  /**
   * This extensibility point only works for the client_credential flow, i.e. acquireTokenByClientCredential and
   * is meant for Azure SDK to enhance Managed Identity support.
   *
   * @param IAppTokenProvider  - Extensibility interface, which allows the app developer to return a token from a custom source.
   */


  SetAppTokenProvider(provider) {
    this.appTokenProvider = provider;
  }
  /**
   * Acquires tokens from the authority for the application (not for an end user).
   */


  async acquireTokenByClientCredential(request) {
    this.logger.info("acquireTokenByClientCredential called", request.correlationId); // If there is a client assertion present in the request, it overrides the one present in the client configuration

    let clientAssertion;

    if (request.clientAssertion) {
      clientAssertion = {
        assertion: request.clientAssertion,
        assertionType: Constants.JWT_BEARER_ASSERTION_TYPE
      };
    }

    const validRequest = { ...request,
      ...(await this.initializeBaseRequest(request)),
      clientAssertion
    };
    const azureRegionConfiguration = {
      azureRegion: validRequest.azureRegion,
      environmentRegion: process.env[REGION_ENVIRONMENT_VARIABLE]
    };
    const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenByClientCredential, validRequest.correlationId, validRequest.skipCache);

    try {
      const clientCredentialConfig = await this.buildOauthClientConfiguration(validRequest.authority, validRequest.correlationId, serverTelemetryManager, azureRegionConfiguration, request.azureCloudOptions);
      const clientCredentialClient = new msalCommon.ClientCredentialClient(clientCredentialConfig, this.appTokenProvider);
      this.logger.verbose("Client credential client created", validRequest.correlationId);
      return clientCredentialClient.acquireToken(validRequest);
    } catch (e) {
      if (e instanceof msalCommon.AuthError) {
        e.setCorrelationId(validRequest.correlationId);
      }

      serverTelemetryManager.cacheFailedRequest(e);
      throw e;
    }
  }
  /**
   * Acquires tokens from the authority for the application.
   *
   * Used in scenarios where the current app is a middle-tier service which was called with a token
   * representing an end user. The current app can use the token (oboAssertion) to request another
   * token to access downstream web API, on behalf of that user.
   *
   * The current middle-tier app has no user interaction to obtain consent.
   * See how to gain consent upfront for your middle-tier app from this article.
   * https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-on-behalf-of-flow#gaining-consent-for-the-middle-tier-application
   */


  async acquireTokenOnBehalfOf(request) {
    this.logger.info("acquireTokenOnBehalfOf called", request.correlationId);
    const validRequest = { ...request,
      ...(await this.initializeBaseRequest(request))
    };

    try {
      const onBehalfOfConfig = await this.buildOauthClientConfiguration(validRequest.authority, validRequest.correlationId, undefined, undefined, request.azureCloudOptions);
      const oboClient = new msalCommon.OnBehalfOfClient(onBehalfOfConfig);
      this.logger.verbose("On behalf of client created", validRequest.correlationId);
      return oboClient.acquireToken(validRequest);
    } catch (e) {
      if (e instanceof msalCommon.AuthError) {
        e.setCorrelationId(validRequest.correlationId);
      }

      throw e;
    }
  }

  setClientCredential(configuration) {
    const clientSecretNotEmpty = !msalCommon.StringUtils.isEmpty(configuration.auth.clientSecret);
    const clientAssertionNotEmpty = !msalCommon.StringUtils.isEmpty(configuration.auth.clientAssertion);
    const certificate = configuration.auth.clientCertificate || {
      thumbprint: msalCommon.Constants.EMPTY_STRING,
      privateKey: msalCommon.Constants.EMPTY_STRING
    };
    const certificateNotEmpty = !msalCommon.StringUtils.isEmpty(certificate.thumbprint) || !msalCommon.StringUtils.isEmpty(certificate.privateKey);
    /*
     * If app developer configures this callback, they don't need a credential
     * i.e. AzureSDK can get token from Managed Identity without a cert / secret
     */

    if (this.appTokenProvider) {
      return;
    } // Check that at most one credential is set on the application


    if (clientSecretNotEmpty && clientAssertionNotEmpty || clientAssertionNotEmpty && certificateNotEmpty || clientSecretNotEmpty && certificateNotEmpty) {
      throw msalCommon.ClientAuthError.createInvalidCredentialError();
    }

    if (configuration.auth.clientSecret) {
      this.clientSecret = configuration.auth.clientSecret;
      return;
    }

    if (configuration.auth.clientAssertion) {
      this.clientAssertion = ClientAssertion.fromAssertion(configuration.auth.clientAssertion);
      return;
    }

    if (!certificateNotEmpty) {
      throw msalCommon.ClientAuthError.createInvalidCredentialError();
    } else {
      var _configuration$auth$c;

      this.clientAssertion = ClientAssertion.fromCertificate(certificate.thumbprint, certificate.privateKey, (_configuration$auth$c = configuration.auth.clientCertificate) == null ? void 0 : _configuration$auth$c.x5c);
    }
  }

}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
class DistributedCachePlugin {
  constructor(client, partitionManager) {
    this.client = client;
    this.partitionManager = partitionManager;
  }

  async beforeCacheAccess(cacheContext) {
    const partitionKey = await this.partitionManager.getKey();
    const cacheData = await this.client.get(partitionKey);
    cacheContext.tokenCache.deserialize(cacheData);
  }

  async afterCacheAccess(cacheContext) {
    if (cacheContext.cacheHasChanged) {
      const kvStore = cacheContext.tokenCache.getKVStore();
      const accountEntities = Object.values(kvStore).filter(value => msalCommon.AccountEntity.isAccountEntity(value));

      if (accountEntities.length > 0) {
        const accountEntity = accountEntities[0];
        const partitionKey = await this.partitionManager.extractKey(accountEntity);
        await this.client.set(partitionKey, cacheContext.tokenCache.serialize());
      }
    }
  }

}

Object.defineProperty(exports, 'AuthError', {
    enumerable: true,
    get: function () {
        return msalCommon.AuthError;
    }
});
Object.defineProperty(exports, 'AuthErrorMessage', {
    enumerable: true,
    get: function () {
        return msalCommon.AuthErrorMessage;
    }
});
Object.defineProperty(exports, 'AzureCloudInstance', {
    enumerable: true,
    get: function () {
        return msalCommon.AzureCloudInstance;
    }
});
Object.defineProperty(exports, 'ClientAuthError', {
    enumerable: true,
    get: function () {
        return msalCommon.ClientAuthError;
    }
});
Object.defineProperty(exports, 'ClientAuthErrorMessage', {
    enumerable: true,
    get: function () {
        return msalCommon.ClientAuthErrorMessage;
    }
});
Object.defineProperty(exports, 'ClientConfigurationError', {
    enumerable: true,
    get: function () {
        return msalCommon.ClientConfigurationError;
    }
});
Object.defineProperty(exports, 'ClientConfigurationErrorMessage', {
    enumerable: true,
    get: function () {
        return msalCommon.ClientConfigurationErrorMessage;
    }
});
Object.defineProperty(exports, 'InteractionRequiredAuthError', {
    enumerable: true,
    get: function () {
        return msalCommon.InteractionRequiredAuthError;
    }
});
Object.defineProperty(exports, 'InteractionRequiredAuthErrorMessage', {
    enumerable: true,
    get: function () {
        return msalCommon.InteractionRequiredAuthErrorMessage;
    }
});
Object.defineProperty(exports, 'LogLevel', {
    enumerable: true,
    get: function () {
        return msalCommon.LogLevel;
    }
});
Object.defineProperty(exports, 'Logger', {
    enumerable: true,
    get: function () {
        return msalCommon.Logger;
    }
});
Object.defineProperty(exports, 'PromptValue', {
    enumerable: true,
    get: function () {
        return msalCommon.PromptValue;
    }
});
Object.defineProperty(exports, 'ProtocolMode', {
    enumerable: true,
    get: function () {
        return msalCommon.ProtocolMode;
    }
});
Object.defineProperty(exports, 'ResponseMode', {
    enumerable: true,
    get: function () {
        return msalCommon.ResponseMode;
    }
});
Object.defineProperty(exports, 'ServerError', {
    enumerable: true,
    get: function () {
        return msalCommon.ServerError;
    }
});
Object.defineProperty(exports, 'TokenCacheContext', {
    enumerable: true,
    get: function () {
        return msalCommon.TokenCacheContext;
    }
});
exports.ClientApplication = ClientApplication;
exports.ClientAssertion = ClientAssertion;
exports.ConfidentialClientApplication = ConfidentialClientApplication;
exports.CryptoProvider = CryptoProvider;
exports.DistributedCachePlugin = DistributedCachePlugin;
exports.NodeStorage = NodeStorage;
exports.PublicClientApplication = PublicClientApplication;
exports.TokenCache = TokenCache;
exports.buildAppConfiguration = buildAppConfiguration;
exports.version = version;
//# sourceMappingURL=msal-node.cjs.development.js.map
"use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}Object.defineProperty(exports,"__esModule",{value:!0});var t,r=require("@azure/msal-common"),n=e(require("http")),i=e(require("https")),o=require("uuid"),s=e(require("crypto")),a=require("jsonwebtoken");!function(e){e.GET="get",e.POST="post"}(t||(t={}));const c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~";var l;!function(e){e[e.acquireTokenSilent=62]="acquireTokenSilent",e[e.acquireTokenByUsernamePassword=371]="acquireTokenByUsernamePassword",e[e.acquireTokenByDeviceCode=671]="acquireTokenByDeviceCode",e[e.acquireTokenByClientCredential=771]="acquireTokenByClientCredential",e[e.acquireTokenByCode=871]="acquireTokenByCode",e[e.acquireTokenByRefreshToken=872]="acquireTokenByRefreshToken"}(l||(l={}));class h{async sendGetRequestAsync(e,r){return null!=r&&r.proxyUrl?u(e,t.GET,r):d(e,t.GET,r)}async sendPostRequestAsync(e,r,n){return null!=r&&r.proxyUrl?u(e,t.POST,r,n):d(e,t.POST,r,n)}}const u=(e,r,i,o)=>{const s=(null==i?void 0:i.headers)||{},a=new URL((null==i?void 0:i.proxyUrl)||""),c=new URL(e),l={host:a.hostname,port:a.port,method:"CONNECT",path:c.hostname,headers:s};o&&(l.timeout=o);let h="";if(r===t.POST){const e=(null==i?void 0:i.body)||"";h=`Content-Type: application/x-www-form-urlencoded\r\nContent-Length: ${e.length}\r\n\r\n`+e}const u=`${r.toUpperCase()} ${c.href} HTTP/1.1\r\nHost: ${c.host}\r\nConnection: close\r\n`+h+"\r\n";return new Promise((e,t)=>{const r=n.request(l);l.timeout&&r.on("timeout",()=>{r.destroy(),t(new Error("Request time out"))}),r.end(),r.on("connect",(n,i)=>{const o=(null==n?void 0:n.statusCode)||500;(o<200||o>299)&&(r.destroy(),i.destroy(),t(new Error("HTTP status code "+o))),l.timeout&&(i.setTimeout(l.timeout),i.on("timeout",()=>{r.destroy(),i.destroy(),t(new Error("Request time out"))})),i.write(u);const s=[];i.on("data",e=>{s.push(e)}),i.on("end",()=>{const n=Buffer.concat([...s]).toString().split("\r\n"),o=parseInt(n[0].split(" ")[1]),a=n[n.length-1],c=n.slice(1,n.length-2),l=new Map;c.forEach(e=>{const t=e.split(new RegExp(/:\s(.*)/s)),r=t[0];let n=t[1];try{const e=JSON.parse(n);e&&"object"==typeof e&&(n=e)}catch(e){}l.set(r,n)});const h={headers:Object.fromEntries(l),body:JSON.parse(a),status:o};(o<200||o>299)&&"authorization_pending"!==h.body.error&&(r.destroy(),i.destroy(),t(new Error("HTTP status code "+o))),e(h)}),i.on("error",e=>{r.destroy(),i.destroy(),t(new Error(e.toString()))})}),r.on("error",e=>{r.destroy(),t(new Error(e.toString()))})})},d=(e,r,n,o)=>{const s=r===t.POST,a=(null==n?void 0:n.body)||"",c={method:r,headers:(null==n?void 0:n.headers)||{}};return o&&(c.timeout=o),s&&(c.headers={...c.headers,"Content-Length":a.length}),new Promise((t,r)=>{const n=i.request(e,c);o&&n.on("timeout",()=>{n.destroy(),r(new Error("Request time out"))}),s&&n.write(a),n.end(),n.on("response",e=>{const i=e.headers,o=e.statusCode,s=[];e.on("data",e=>{s.push(e)}),e.on("end",()=>{const e=Buffer.concat([...s]).toString(),a={headers:i,body:JSON.parse(e),status:o};(o<200||o>299)&&"authorization_pending"!==a.body.error&&(n.destroy(),r(new Error("HTTP status code "+o))),t(a)})}),n.on("error",e=>{n.destroy(),r(new Error(e.toString()))})})},g={clientId:r.Constants.EMPTY_STRING,authority:r.Constants.DEFAULT_AUTHORITY,clientSecret:r.Constants.EMPTY_STRING,clientAssertion:r.Constants.EMPTY_STRING,clientCertificate:{thumbprint:r.Constants.EMPTY_STRING,privateKey:r.Constants.EMPTY_STRING,x5c:r.Constants.EMPTY_STRING},knownAuthorities:[],cloudDiscoveryMetadata:r.Constants.EMPTY_STRING,authorityMetadata:r.Constants.EMPTY_STRING,clientCapabilities:[],protocolMode:r.ProtocolMode.AAD,azureCloudOptions:{azureCloudInstance:r.AzureCloudInstance.None,tenant:r.Constants.EMPTY_STRING},skipAuthorityMetadataCache:!1},p={},y={loggerOptions:{loggerCallback:()=>{},piiLoggingEnabled:!1,logLevel:r.LogLevel.Info},networkClient:class{static getNetworkClient(){return new h}}.getNetworkClient(),proxyUrl:r.Constants.EMPTY_STRING},m={application:{appName:r.Constants.EMPTY_STRING,appVersion:r.Constants.EMPTY_STRING}};function f({auth:e,cache:t,system:r,telemetry:n}){return{auth:{...g,...e},cache:{...p,...t},system:{...y,...r},telemetry:{...m,...n}}}class C{generateGuid(){return o.v4()}isGuid(e){return/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(e)}}class T{static base64Encode(e,t){return Buffer.from(e,t).toString("base64")}static base64EncodeUrl(e,t){return T.base64Encode(e,t).replace(/=/g,r.Constants.EMPTY_STRING).replace(/\+/g,"-").replace(/\//g,"_")}static base64Decode(e){return Buffer.from(e,"base64").toString("utf8")}static base64DecodeUrl(e){let t=e.replace(/-/g,"+").replace(/_/g,"/");for(;t.length%4;)t+="=";return T.base64Decode(t)}}class A{sha256(e){return s.createHash("sha256").update(e).digest()}}class k{constructor(){this.hashUtils=new A}async generatePkceCodes(){const e=this.generateCodeVerifier();return{verifier:e,challenge:this.generateCodeChallengeFromVerifier(e)}}generateCodeVerifier(){const e=[],t=256-256%c.length;for(;e.length<=32;){const r=s.randomBytes(1)[0];r>=t||e.push(c[r%c.length])}const n=e.join(r.Constants.EMPTY_STRING);return T.base64EncodeUrl(n)}generateCodeChallengeFromVerifier(e){return T.base64EncodeUrl(this.hashUtils.sha256(e).toString("base64"),"base64")}}class I{constructor(){this.pkceGenerator=new k,this.guidGenerator=new C,this.hashUtils=new A}createNewGuid(){return this.guidGenerator.generateGuid()}base64Encode(e){return T.base64Encode(e)}base64Decode(e){return T.base64Decode(e)}generatePkceCodes(){return this.pkceGenerator.generatePkceCodes()}getPublicKeyThumbprint(){throw new Error("Method not implemented.")}removeTokenBindingKey(){throw new Error("Method not implemented.")}clearKeystore(){throw new Error("Method not implemented.")}signJwt(){throw new Error("Method not implemented.")}async hashString(e){return T.base64EncodeUrl(this.hashUtils.sha256(e).toString("base64"),"base64")}}class E{static deserializeJSONBlob(e){return r.StringUtils.isEmpty(e)?{}:JSON.parse(e)}static deserializeAccounts(e){const t={};return e&&Object.keys(e).map((function(n){const i=e[n],o={homeAccountId:i.home_account_id,environment:i.environment,realm:i.realm,localAccountId:i.local_account_id,username:i.username,authorityType:i.authority_type,name:i.name,clientInfo:i.client_info,lastModificationTime:i.last_modification_time,lastModificationApp:i.last_modification_app},s=new r.AccountEntity;r.CacheManager.toObject(s,o),t[n]=s})),t}static deserializeIdTokens(e){const t={};return e&&Object.keys(e).map((function(n){const i=e[n],o={homeAccountId:i.home_account_id,environment:i.environment,credentialType:i.credential_type,clientId:i.client_id,secret:i.secret,realm:i.realm},s=new r.IdTokenEntity;r.CacheManager.toObject(s,o),t[n]=s})),t}static deserializeAccessTokens(e){const t={};return e&&Object.keys(e).map((function(n){const i=e[n],o={homeAccountId:i.home_account_id,environment:i.environment,credentialType:i.credential_type,clientId:i.client_id,secret:i.secret,realm:i.realm,target:i.target,cachedAt:i.cached_at,expiresOn:i.expires_on,extendedExpiresOn:i.extended_expires_on,refreshOn:i.refresh_on,keyId:i.key_id,tokenType:i.token_type,requestedClaims:i.requestedClaims,requestedClaimsHash:i.requestedClaimsHash},s=new r.AccessTokenEntity;r.CacheManager.toObject(s,o),t[n]=s})),t}static deserializeRefreshTokens(e){const t={};return e&&Object.keys(e).map((function(n){const i=e[n],o={homeAccountId:i.home_account_id,environment:i.environment,credentialType:i.credential_type,clientId:i.client_id,secret:i.secret,familyId:i.family_id,target:i.target,realm:i.realm},s=new r.RefreshTokenEntity;r.CacheManager.toObject(s,o),t[n]=s})),t}static deserializeAppMetadata(e){const t={};return e&&Object.keys(e).map((function(n){const i=e[n],o={clientId:i.client_id,environment:i.environment,familyId:i.family_id},s=new r.AppMetadataEntity;r.CacheManager.toObject(s,o),t[n]=s})),t}static deserializeAllCache(e){return{accounts:e.Account?this.deserializeAccounts(e.Account):{},idTokens:e.IdToken?this.deserializeIdTokens(e.IdToken):{},accessTokens:e.AccessToken?this.deserializeAccessTokens(e.AccessToken):{},refreshTokens:e.RefreshToken?this.deserializeRefreshTokens(e.RefreshToken):{},appMetadata:e.AppMetadata?this.deserializeAppMetadata(e.AppMetadata):{}}}}class b{static serializeJSONBlob(e){return JSON.stringify(e)}static serializeAccounts(e){const t={};return Object.keys(e).map((function(r){const n=e[r];t[r]={home_account_id:n.homeAccountId,environment:n.environment,realm:n.realm,local_account_id:n.localAccountId,username:n.username,authority_type:n.authorityType,name:n.name,client_info:n.clientInfo,last_modification_time:n.lastModificationTime,last_modification_app:n.lastModificationApp}})),t}static serializeIdTokens(e){const t={};return Object.keys(e).map((function(r){const n=e[r];t[r]={home_account_id:n.homeAccountId,environment:n.environment,credential_type:n.credentialType,client_id:n.clientId,secret:n.secret,realm:n.realm}})),t}static serializeAccessTokens(e){const t={};return Object.keys(e).map((function(r){const n=e[r];t[r]={home_account_id:n.homeAccountId,environment:n.environment,credential_type:n.credentialType,client_id:n.clientId,secret:n.secret,realm:n.realm,target:n.target,cached_at:n.cachedAt,expires_on:n.expiresOn,extended_expires_on:n.extendedExpiresOn,refresh_on:n.refreshOn,key_id:n.keyId,token_type:n.tokenType,requestedClaims:n.requestedClaims,requestedClaimsHash:n.requestedClaimsHash}})),t}static serializeRefreshTokens(e){const t={};return Object.keys(e).map((function(r){const n=e[r];t[r]={home_account_id:n.homeAccountId,environment:n.environment,credential_type:n.credentialType,client_id:n.clientId,secret:n.secret,family_id:n.familyId,target:n.target,realm:n.realm}})),t}static serializeAppMetadata(e){const t={};return Object.keys(e).map((function(r){const n=e[r];t[r]={client_id:n.clientId,environment:n.environment,family_id:n.familyId}})),t}static serializeAllCache(e){return{Account:this.serializeAccounts(e.accounts),IdToken:this.serializeIdTokens(e.idTokens),AccessToken:this.serializeAccessTokens(e.accessTokens),RefreshToken:this.serializeRefreshTokens(e.refreshTokens),AppMetadata:this.serializeAppMetadata(e.appMetadata)}}}class v extends r.CacheManager{constructor(e,t,r){super(t,r),this.cache={},this.changeEmitters=[],this.logger=e}registerChangeEmitter(e){this.changeEmitters.push(e)}emitChange(){this.changeEmitters.forEach(e=>e.call(null))}cacheToInMemoryCache(e){const t={accounts:{},idTokens:{},accessTokens:{},refreshTokens:{},appMetadata:{}};for(const n in e)if(e[n]instanceof r.AccountEntity)t.accounts[n]=e[n];else if(e[n]instanceof r.IdTokenEntity)t.idTokens[n]=e[n];else if(e[n]instanceof r.AccessTokenEntity)t.accessTokens[n]=e[n];else if(e[n]instanceof r.RefreshTokenEntity)t.refreshTokens[n]=e[n];else{if(!(e[n]instanceof r.AppMetadataEntity))continue;t.appMetadata[n]=e[n]}return t}inMemoryCacheToCache(e){let t=this.getCache();return t={...t,...e.accounts,...e.idTokens,...e.accessTokens,...e.refreshTokens,...e.appMetadata},t}getInMemoryCache(){return this.logger.trace("Getting in-memory cache"),this.cacheToInMemoryCache(this.getCache())}setInMemoryCache(e){this.logger.trace("Setting in-memory cache");const t=this.inMemoryCacheToCache(e);this.setCache(t),this.emitChange()}getCache(){return this.logger.trace("Getting cache key-value store"),this.cache}setCache(e){this.logger.trace("Setting cache key value store"),this.cache=e,this.emitChange()}getItem(e){return this.logger.tracePii("Item key: "+e),this.getCache()[e]}setItem(e,t){this.logger.tracePii("Item key: "+e);const r=this.getCache();r[e]=t,this.setCache(r)}getAccount(e){const t=this.getItem(e);return r.AccountEntity.isAccountEntity(t)?t:null}setAccount(e){const t=e.generateAccountKey();this.setItem(t,e)}getIdTokenCredential(e){const t=this.getItem(e);return r.IdTokenEntity.isIdTokenEntity(t)?t:null}setIdTokenCredential(e){const t=e.generateCredentialKey();this.setItem(t,e)}getAccessTokenCredential(e){const t=this.getItem(e);return r.AccessTokenEntity.isAccessTokenEntity(t)?t:null}setAccessTokenCredential(e){const t=e.generateCredentialKey();this.setItem(t,e)}getRefreshTokenCredential(e){const t=this.getItem(e);return r.RefreshTokenEntity.isRefreshTokenEntity(t)?t:null}setRefreshTokenCredential(e){const t=e.generateCredentialKey();this.setItem(t,e)}getAppMetadata(e){const t=this.getItem(e);return r.AppMetadataEntity.isAppMetadataEntity(e,t)?t:null}setAppMetadata(e){const t=e.generateAppMetadataKey();this.setItem(t,e)}getServerTelemetry(e){const t=this.getItem(e);return t&&r.ServerTelemetryEntity.isServerTelemetryEntity(e,t)?t:null}setServerTelemetry(e,t){this.setItem(e,t)}getAuthorityMetadata(e){const t=this.getItem(e);return t&&r.AuthorityMetadataEntity.isAuthorityMetadataEntity(e,t)?t:null}getAuthorityMetadataKeys(){return this.getKeys().filter(e=>this.isAuthorityMetadata(e))}setAuthorityMetadata(e,t){this.setItem(e,t)}getThrottlingCache(e){const t=this.getItem(e);return t&&r.ThrottlingEntity.isThrottlingEntity(e,t)?t:null}setThrottlingCache(e,t){this.setItem(e,t)}removeItem(e){this.logger.tracePii("Item key: "+e);let t=!1;const r=this.getCache();return r[e]&&(delete r[e],t=!0),t&&(this.setCache(r),this.emitChange()),t}containsKey(e){return this.getKeys().includes(e)}getKeys(){this.logger.trace("Retrieving all cache keys");const e=this.getCache();return[...Object.keys(e)]}async clear(){this.logger.trace("Clearing cache entries created by MSAL"),this.getKeys().forEach(e=>{this.removeItem(e)}),this.emitChange()}static generateInMemoryCache(e){return E.deserializeAllCache(E.deserializeJSONBlob(e))}static generateJsonCache(e){return b.serializeAllCache(e)}updateCredentialCacheKey(e,t){const r=t.generateCredentialKey();if(e!==r){const n=this.getItem(e);if(n)return this.removeItem(e),this.setItem(r,n),this.logger.verbose(`Updated an outdated ${t.credentialType} cache key`),r;this.logger.error(`Attempted to update an outdated ${t.credentialType} cache key but no item matching the outdated key was found in storage`)}return e}}const w={},M={},S={},R={},O={};class _{constructor(e,t,r){this.cacheHasChanged=!1,this.storage=e,this.storage.registerChangeEmitter(this.handleChangeEvent.bind(this)),r&&(this.persistence=r),this.logger=t}hasChanged(){return this.cacheHasChanged}serialize(){this.logger.trace("Serializing in-memory cache");let e=b.serializeAllCache(this.storage.getInMemoryCache());return r.StringUtils.isEmpty(this.cacheSnapshot)?this.logger.trace("No cache snapshot to merge"):(this.logger.trace("Reading cache snapshot from disk"),e=this.mergeState(JSON.parse(this.cacheSnapshot),e)),this.cacheHasChanged=!1,JSON.stringify(e)}deserialize(e){if(this.logger.trace("Deserializing JSON to in-memory cache"),this.cacheSnapshot=e,r.StringUtils.isEmpty(this.cacheSnapshot))this.logger.trace("No cache snapshot to deserialize");else{this.logger.trace("Reading cache snapshot from disk");const e=E.deserializeAllCache(this.overlayDefaults(JSON.parse(this.cacheSnapshot)));this.storage.setInMemoryCache(e)}}getKVStore(){return this.storage.getCache()}async getAllAccounts(){let e;this.logger.trace("getAllAccounts called");try{return this.persistence&&(e=new r.TokenCacheContext(this,!1),await this.persistence.beforeCacheAccess(e)),this.storage.getAllAccounts()}finally{this.persistence&&e&&await this.persistence.afterCacheAccess(e)}}async getAccountByHomeId(e){const t=await this.getAllAccounts();return!r.StringUtils.isEmpty(e)&&t&&t.length&&t.filter(t=>t.homeAccountId===e)[0]||null}async getAccountByLocalId(e){const t=await this.getAllAccounts();return!r.StringUtils.isEmpty(e)&&t&&t.length&&t.filter(t=>t.localAccountId===e)[0]||null}async removeAccount(e){let t;this.logger.trace("removeAccount called");try{this.persistence&&(t=new r.TokenCacheContext(this,!0),await this.persistence.beforeCacheAccess(t)),await this.storage.removeAccount(r.AccountEntity.generateAccountCacheKey(e))}finally{this.persistence&&t&&await this.persistence.afterCacheAccess(t)}}handleChangeEvent(){this.cacheHasChanged=!0}mergeState(e,t){this.logger.trace("Merging in-memory cache with cache snapshot");const r=this.mergeRemovals(e,t);return this.mergeUpdates(r,t)}mergeUpdates(e,t){return Object.keys(t).forEach(r=>{const n=t[r];if(e.hasOwnProperty(r)){const t=null!==n,i="object"==typeof n,o=!Array.isArray(n),s=null!=e[r];t&&i&&o&&s?this.mergeUpdates(e[r],n):e[r]=n}else null!==n&&(e[r]=n)}),e}mergeRemovals(e,t){this.logger.trace("Remove updated entries in cache");const r=e.Account?this.mergeRemovalsDict(e.Account,t.Account):e.Account,n=e.AccessToken?this.mergeRemovalsDict(e.AccessToken,t.AccessToken):e.AccessToken,i=e.RefreshToken?this.mergeRemovalsDict(e.RefreshToken,t.RefreshToken):e.RefreshToken,o=e.IdToken?this.mergeRemovalsDict(e.IdToken,t.IdToken):e.IdToken,s=e.AppMetadata?this.mergeRemovalsDict(e.AppMetadata,t.AppMetadata):e.AppMetadata;return{...e,Account:r,AccessToken:n,RefreshToken:i,IdToken:o,AppMetadata:s}}mergeRemovalsDict(e,t){const r={...e};return Object.keys(e).forEach(e=>{t&&t.hasOwnProperty(e)||delete r[e]}),r}overlayDefaults(e){return this.logger.trace("Overlaying input cache with the default cache"),{Account:{...w,...e.Account},IdToken:{...M,...e.IdToken},AccessToken:{...S,...e.AccessToken},RefreshToken:{...R,...e.RefreshToken},AppMetadata:{...O,...e.AppMetadata}}}}class P{constructor(e){this.config=f(e),this.cryptoProvider=new I,this.logger=new r.Logger(this.config.system.loggerOptions,"@azure/msal-node","1.12.1"),this.storage=new v(this.logger,this.config.auth.clientId,this.cryptoProvider),this.tokenCache=new _(this.storage,this.logger,this.config.cache.cachePlugin)}async getAuthCodeUrl(e){this.logger.info("getAuthCodeUrl called",e.correlationId);const t={...e,...await this.initializeBaseRequest(e),responseMode:e.responseMode||r.ResponseMode.QUERY,authenticationScheme:r.AuthenticationScheme.BEARER},n=await this.buildOauthClientConfiguration(t.authority,t.correlationId,void 0,void 0,e.azureCloudOptions),i=new r.AuthorizationCodeClient(n);return this.logger.verbose("Auth code client created",t.correlationId),i.getAuthCodeUrl(t)}async acquireTokenByCode(e,t){this.logger.info("acquireTokenByCode called",e.correlationId);const n={...e,...await this.initializeBaseRequest(e),authenticationScheme:r.AuthenticationScheme.BEARER},i=this.initializeServerTelemetryManager(l.acquireTokenByCode,n.correlationId);try{const o=await this.buildOauthClientConfiguration(n.authority,n.correlationId,i,void 0,e.azureCloudOptions),s=new r.AuthorizationCodeClient(o);return this.logger.verbose("Auth code client created",n.correlationId),s.acquireToken(n,t)}catch(e){throw e instanceof r.AuthError&&e.setCorrelationId(n.correlationId),i.cacheFailedRequest(e),e}}async acquireTokenByRefreshToken(e){this.logger.info("acquireTokenByRefreshToken called",e.correlationId);const t={...e,...await this.initializeBaseRequest(e),authenticationScheme:r.AuthenticationScheme.BEARER},n=this.initializeServerTelemetryManager(l.acquireTokenByRefreshToken,t.correlationId);try{const i=await this.buildOauthClientConfiguration(t.authority,t.correlationId,n,void 0,e.azureCloudOptions),o=new r.RefreshTokenClient(i);return this.logger.verbose("Refresh token client created",t.correlationId),o.acquireToken(t)}catch(e){throw e instanceof r.AuthError&&e.setCorrelationId(t.correlationId),n.cacheFailedRequest(e),e}}async acquireTokenSilent(e){const t={...e,...await this.initializeBaseRequest(e),forceRefresh:e.forceRefresh||!1},n=this.initializeServerTelemetryManager(l.acquireTokenSilent,t.correlationId,t.forceRefresh);try{const i=await this.buildOauthClientConfiguration(t.authority,t.correlationId,n,void 0,e.azureCloudOptions),o=new r.SilentFlowClient(i);return this.logger.verbose("Silent flow client created",t.correlationId),o.acquireToken(t)}catch(e){throw e instanceof r.AuthError&&e.setCorrelationId(t.correlationId),n.cacheFailedRequest(e),e}}async acquireTokenByUsernamePassword(e){this.logger.info("acquireTokenByUsernamePassword called",e.correlationId);const t={...e,...await this.initializeBaseRequest(e)},n=this.initializeServerTelemetryManager(l.acquireTokenByUsernamePassword,t.correlationId);try{const i=await this.buildOauthClientConfiguration(t.authority,t.correlationId,n,void 0,e.azureCloudOptions),o=new r.UsernamePasswordClient(i);return this.logger.verbose("Username password client created",t.correlationId),o.acquireToken(t)}catch(e){throw e instanceof r.AuthError&&e.setCorrelationId(t.correlationId),n.cacheFailedRequest(e),e}}getTokenCache(){return this.logger.info("getTokenCache called"),this.tokenCache}getLogger(){return this.logger}setLogger(e){this.logger=e}async buildOauthClientConfiguration(e,t,n,i,o){this.logger.verbose("buildOauthClientConfiguration called",t);const s=o||this.config.auth.azureCloudOptions;this.logger.verbose("building oauth client configuration with the authority: "+e,t);const a=await this.createAuthority(e,i,t,s);return null==n||n.updateRegionDiscoveryMetadata(a.regionDiscoveryMetadata),{authOptions:{clientId:this.config.auth.clientId,authority:a,clientCapabilities:this.config.auth.clientCapabilities},systemOptions:{proxyUrl:this.config.system.proxyUrl},loggerOptions:{logLevel:this.config.system.loggerOptions.logLevel,loggerCallback:this.config.system.loggerOptions.loggerCallback,piiLoggingEnabled:this.config.system.loggerOptions.piiLoggingEnabled,correlationId:t},cryptoInterface:this.cryptoProvider,networkInterface:this.config.system.networkClient,storageInterface:this.storage,serverTelemetryManager:n,clientCredentials:{clientSecret:this.clientSecret,clientAssertion:this.clientAssertion?this.getClientAssertion(a):void 0},libraryInfo:{sku:"msal.js.node",version:"1.12.1",cpu:process.arch||r.Constants.EMPTY_STRING,os:process.platform||r.Constants.EMPTY_STRING},telemetry:this.config.telemetry,persistencePlugin:this.config.cache.cachePlugin,serializableCache:this.tokenCache}}getClientAssertion(e){return{assertion:this.clientAssertion.getJwt(this.cryptoProvider,this.config.auth.clientId,e.tokenEndpoint),assertionType:"urn:ietf:params:oauth:client-assertion-type:jwt-bearer"}}async initializeBaseRequest(e){return this.logger.verbose("initializeRequestScopes called",e.correlationId),e.authenticationScheme&&e.authenticationScheme===r.AuthenticationScheme.POP&&this.logger.verbose("Authentication Scheme 'pop' is not supported yet, setting Authentication Scheme to 'Bearer' for request",e.correlationId),e.authenticationScheme=r.AuthenticationScheme.BEARER,e.claims&&!r.StringUtils.isEmpty(e.claims)&&(e.requestedClaimsHash=await this.cryptoProvider.hashString(e.claims)),{...e,scopes:[...e&&e.scopes||[],...r.OIDC_DEFAULT_SCOPES],correlationId:e&&e.correlationId||this.cryptoProvider.createNewGuid(),authority:e.authority||this.config.auth.authority}}initializeServerTelemetryManager(e,t,n){return new r.ServerTelemetryManager({clientId:this.config.auth.clientId,correlationId:t,apiId:e,forceRefresh:n||!1},this.storage)}async createAuthority(e,t,n,i){this.logger.verbose("createAuthority called",n);const o=r.Authority.generateAuthority(e,i),s={protocolMode:this.config.auth.protocolMode,knownAuthorities:this.config.auth.knownAuthorities,cloudDiscoveryMetadata:this.config.auth.cloudDiscoveryMetadata,authorityMetadata:this.config.auth.authorityMetadata,azureRegionConfiguration:t,skipAuthorityMetadataCache:this.config.auth.skipAuthorityMetadataCache};return await r.AuthorityFactory.createDiscoveredInstance(o,this.config.system.networkClient,this.storage,s,this.config.system.proxyUrl)}clearCache(){this.storage.clear()}}class q{static fromAssertion(e){const t=new q;return t.jwt=e,t}static fromCertificate(e,t,r){const n=new q;return n.privateKey=t,n.thumbprint=e,r&&(n.publicCertificate=this.parseCertificate(r)),n}getJwt(e,t,n){if(this.privateKey&&this.thumbprint)return this.jwt&&!this.isExpired()&&t===this.issuer&&n===this.jwtAudience?this.jwt:this.createJwt(e,t,n);if(this.jwt)return this.jwt;throw r.ClientAuthError.createInvalidAssertionError()}createJwt(e,t,n){this.issuer=t,this.jwtAudience=n;const i=r.TimeUtils.nowSeconds();this.expirationTime=i+600;const o={alg:"RS256",x5t:T.base64EncodeUrl(this.thumbprint,"hex")};this.publicCertificate&&Object.assign(o,{x5c:this.publicCertificate});const s={aud:this.jwtAudience,exp:this.expirationTime,iss:this.issuer,sub:this.issuer,nbf:i,jti:e.createNewGuid()};return this.jwt=a.sign(s,this.privateKey,{header:o}),this.jwt}isExpired(){return this.expirationTime<r.TimeUtils.nowSeconds()}static parseCertificate(e){const t=/-----BEGIN CERTIFICATE-----\r*\n(.+?)\r*\n-----END CERTIFICATE-----/gs,n=[];let i;for(;null!==(i=t.exec(e));)n.push(i[1].replace(/\r*\n/g,r.Constants.EMPTY_STRING));return n}}Object.defineProperty(exports,"AuthError",{enumerable:!0,get:function(){return r.AuthError}}),Object.defineProperty(exports,"AuthErrorMessage",{enumerable:!0,get:function(){return r.AuthErrorMessage}}),Object.defineProperty(exports,"AzureCloudInstance",{enumerable:!0,get:function(){return r.AzureCloudInstance}}),Object.defineProperty(exports,"ClientAuthError",{enumerable:!0,get:function(){return r.ClientAuthError}}),Object.defineProperty(exports,"ClientAuthErrorMessage",{enumerable:!0,get:function(){return r.ClientAuthErrorMessage}}),Object.defineProperty(exports,"ClientConfigurationError",{enumerable:!0,get:function(){return r.ClientConfigurationError}}),Object.defineProperty(exports,"ClientConfigurationErrorMessage",{enumerable:!0,get:function(){return r.ClientConfigurationErrorMessage}}),Object.defineProperty(exports,"InteractionRequiredAuthError",{enumerable:!0,get:function(){return r.InteractionRequiredAuthError}}),Object.defineProperty(exports,"InteractionRequiredAuthErrorMessage",{enumerable:!0,get:function(){return r.InteractionRequiredAuthErrorMessage}}),Object.defineProperty(exports,"LogLevel",{enumerable:!0,get:function(){return r.LogLevel}}),Object.defineProperty(exports,"Logger",{enumerable:!0,get:function(){return r.Logger}}),Object.defineProperty(exports,"PromptValue",{enumerable:!0,get:function(){return r.PromptValue}}),Object.defineProperty(exports,"ProtocolMode",{enumerable:!0,get:function(){return r.ProtocolMode}}),Object.defineProperty(exports,"ResponseMode",{enumerable:!0,get:function(){return r.ResponseMode}}),Object.defineProperty(exports,"ServerError",{enumerable:!0,get:function(){return r.ServerError}}),Object.defineProperty(exports,"TokenCacheContext",{enumerable:!0,get:function(){return r.TokenCacheContext}}),exports.ClientApplication=P,exports.ClientAssertion=q,exports.ConfidentialClientApplication=class extends P{constructor(e){super(e),this.setClientCredential(this.config),this.appTokenProvider=void 0}SetAppTokenProvider(e){this.appTokenProvider=e}async acquireTokenByClientCredential(e){let t;this.logger.info("acquireTokenByClientCredential called",e.correlationId),e.clientAssertion&&(t={assertion:e.clientAssertion,assertionType:"urn:ietf:params:oauth:client-assertion-type:jwt-bearer"});const n={...e,...await this.initializeBaseRequest(e),clientAssertion:t},i={azureRegion:n.azureRegion,environmentRegion:process.env.REGION_NAME},o=this.initializeServerTelemetryManager(l.acquireTokenByClientCredential,n.correlationId,n.skipCache);try{const t=await this.buildOauthClientConfiguration(n.authority,n.correlationId,o,i,e.azureCloudOptions),s=new r.ClientCredentialClient(t,this.appTokenProvider);return this.logger.verbose("Client credential client created",n.correlationId),s.acquireToken(n)}catch(e){throw e instanceof r.AuthError&&e.setCorrelationId(n.correlationId),o.cacheFailedRequest(e),e}}async acquireTokenOnBehalfOf(e){this.logger.info("acquireTokenOnBehalfOf called",e.correlationId);const t={...e,...await this.initializeBaseRequest(e)};try{const n=await this.buildOauthClientConfiguration(t.authority,t.correlationId,void 0,void 0,e.azureCloudOptions),i=new r.OnBehalfOfClient(n);return this.logger.verbose("On behalf of client created",t.correlationId),i.acquireToken(t)}catch(e){throw e instanceof r.AuthError&&e.setCorrelationId(t.correlationId),e}}setClientCredential(e){const t=!r.StringUtils.isEmpty(e.auth.clientSecret),n=!r.StringUtils.isEmpty(e.auth.clientAssertion),i=e.auth.clientCertificate||{thumbprint:r.Constants.EMPTY_STRING,privateKey:r.Constants.EMPTY_STRING},o=!r.StringUtils.isEmpty(i.thumbprint)||!r.StringUtils.isEmpty(i.privateKey);if(!this.appTokenProvider){if(t&&n||n&&o||t&&o)throw r.ClientAuthError.createInvalidCredentialError();if(e.auth.clientSecret)this.clientSecret=e.auth.clientSecret;else if(e.auth.clientAssertion)this.clientAssertion=q.fromAssertion(e.auth.clientAssertion);else{if(!o)throw r.ClientAuthError.createInvalidCredentialError();var s;this.clientAssertion=q.fromCertificate(i.thumbprint,i.privateKey,null==(s=e.auth.clientCertificate)?void 0:s.x5c)}}}},exports.CryptoProvider=I,exports.DistributedCachePlugin=class{constructor(e,t){this.client=e,this.partitionManager=t}async beforeCacheAccess(e){const t=await this.partitionManager.getKey(),r=await this.client.get(t);e.tokenCache.deserialize(r)}async afterCacheAccess(e){if(e.cacheHasChanged){const t=e.tokenCache.getKVStore(),n=Object.values(t).filter(e=>r.AccountEntity.isAccountEntity(e));if(n.length>0){const t=n[0],r=await this.partitionManager.extractKey(t);await this.client.set(r,e.tokenCache.serialize())}}}},exports.NodeStorage=v,exports.PublicClientApplication=class extends P{constructor(e){super(e)}async acquireTokenByDeviceCode(e){this.logger.info("acquireTokenByDeviceCode called",e.correlationId);const t=Object.assign(e,await this.initializeBaseRequest(e)),n=this.initializeServerTelemetryManager(l.acquireTokenByDeviceCode,t.correlationId);try{const i=await this.buildOauthClientConfiguration(t.authority,t.correlationId,n,void 0,e.azureCloudOptions),o=new r.DeviceCodeClient(i);return this.logger.verbose("Device code client created",t.correlationId),o.acquireToken(t)}catch(e){throw e instanceof r.AuthError&&e.setCorrelationId(t.correlationId),n.cacheFailedRequest(e),e}}},exports.TokenCache=_,exports.buildAppConfiguration=f,exports.version="1.12.1";
//# sourceMappingURL=msal-node.cjs.production.min.js.map
import { Constants as Constants$1, ProtocolMode, AzureCloudInstance, LogLevel, StringUtils, AccountEntity, CacheManager, IdTokenEntity, AccessTokenEntity, RefreshTokenEntity, AppMetadataEntity, ServerTelemetryEntity, AuthorityMetadataEntity, ThrottlingEntity, TokenCacheContext, Logger, ResponseMode, AuthenticationScheme, AuthorizationCodeClient, AuthError, RefreshTokenClient, SilentFlowClient, UsernamePasswordClient, OIDC_DEFAULT_SCOPES, ServerTelemetryManager, Authority, AuthorityFactory, DeviceCodeClient, ClientAuthError, TimeUtils, ClientCredentialClient, OnBehalfOfClient } from '@azure/msal-common';
export { AuthError, AuthErrorMessage, AzureCloudInstance, ClientAuthError, ClientAuthErrorMessage, ClientConfigurationError, ClientConfigurationErrorMessage, InteractionRequiredAuthError, InteractionRequiredAuthErrorMessage, LogLevel, Logger, PromptValue, ProtocolMode, ResponseMode, ServerError, TokenCacheContext } from '@azure/msal-common';
import http from 'http';
import https from 'https';
import { v4 } from 'uuid';
import crypto from 'crypto';
import { sign } from 'jsonwebtoken';

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */

/**
 * http methods
 */
var HttpMethod;

(function (HttpMethod) {
  HttpMethod["GET"] = "get";
  HttpMethod["POST"] = "post";
})(HttpMethod || (HttpMethod = {}));
/**
 * Constants used for region discovery
 */


const REGION_ENVIRONMENT_VARIABLE = "REGION_NAME";
/**
 * Constant used for PKCE
 */

const RANDOM_OCTET_SIZE = 32;
/**
 * Constants used in PKCE
 */

const Hash = {
  SHA256: "sha256"
};
/**
 * Constants for encoding schemes
 */

const CharSet = {
  CV_CHARSET: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~"
};
/**
 * Constants
 */

const Constants = {
  MSAL_SKU: "msal.js.node",
  JWT_BEARER_ASSERTION_TYPE: "urn:ietf:params:oauth:client-assertion-type:jwt-bearer",
  AUTHORIZATION_PENDING: "authorization_pending"
};
/**
 * API Codes for Telemetry purposes.
 * Before adding a new code you must claim it in the MSAL Telemetry tracker as these number spaces are shared across all MSALs
 * 0-99 Silent Flow
 * 600-699 Device Code Flow
 * 800-899 Auth Code Flow
 */

var ApiId;

(function (ApiId) {
  ApiId[ApiId["acquireTokenSilent"] = 62] = "acquireTokenSilent";
  ApiId[ApiId["acquireTokenByUsernamePassword"] = 371] = "acquireTokenByUsernamePassword";
  ApiId[ApiId["acquireTokenByDeviceCode"] = 671] = "acquireTokenByDeviceCode";
  ApiId[ApiId["acquireTokenByClientCredential"] = 771] = "acquireTokenByClientCredential";
  ApiId[ApiId["acquireTokenByCode"] = 871] = "acquireTokenByCode";
  ApiId[ApiId["acquireTokenByRefreshToken"] = 872] = "acquireTokenByRefreshToken";
})(ApiId || (ApiId = {}));
/**
 * JWT  constants
 */


const JwtConstants = {
  ALGORITHM: "alg",
  RSA_256: "RS256",
  X5T: "x5t",
  X5C: "x5c",
  AUDIENCE: "aud",
  EXPIRATION_TIME: "exp",
  ISSUER: "iss",
  SUBJECT: "sub",
  NOT_BEFORE: "nbf",
  JWT_ID: "jti"
};

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * This class implements the API for network requests.
 */

class HttpClient {
  /**
   * Http Get request
   * @param url
   * @param options
   */
  async sendGetRequestAsync(url, options) {
    if (options != null && options.proxyUrl) {
      return networkRequestViaProxy(url, HttpMethod.GET, options);
    } else {
      return networkRequestViaHttps(url, HttpMethod.GET, options);
    }
  }
  /**
   * Http Post request
   * @param url
   * @param options
   */


  async sendPostRequestAsync(url, options, cancellationToken) {
    if (options != null && options.proxyUrl) {
      return networkRequestViaProxy(url, HttpMethod.POST, options, cancellationToken);
    } else {
      return networkRequestViaHttps(url, HttpMethod.POST, options, cancellationToken);
    }
  }

}

const networkRequestViaProxy = (url, httpMethod, options, timeout) => {
  const headers = (options == null ? void 0 : options.headers) || {};
  const proxyUrl = new URL((options == null ? void 0 : options.proxyUrl) || "");
  const destinationUrl = new URL(url); // "method: connect" must be used to establish a connection to the proxy

  const tunnelRequestOptions = {
    host: proxyUrl.hostname,
    port: proxyUrl.port,
    method: "CONNECT",
    path: destinationUrl.hostname,
    headers: headers
  };

  if (timeout) {
    tunnelRequestOptions.timeout = timeout;
  } // compose a request string for the socket


  let postRequestStringContent = "";

  if (httpMethod === HttpMethod.POST) {
    const body = (options == null ? void 0 : options.body) || "";
    postRequestStringContent = "Content-Type: application/x-www-form-urlencoded\r\n" + `Content-Length: ${body.length}\r\n` + `\r\n${body}`;
  }

  const outgoingRequestString = `${httpMethod.toUpperCase()} ${destinationUrl.href} HTTP/1.1\r\n` + `Host: ${destinationUrl.host}\r\n` + "Connection: close\r\n" + postRequestStringContent + "\r\n";
  return new Promise((resolve, reject) => {
    const request = http.request(tunnelRequestOptions);

    if (tunnelRequestOptions.timeout) {
      request.on("timeout", () => {
        request.destroy();
        reject(new Error("Request time out"));
      });
    }

    request.end(); // establish connection to the proxy

    request.on("connect", (response, socket) => {
      const statusCode = (response == null ? void 0 : response.statusCode) || 500;

      if (statusCode < 200 || statusCode > 299) {
        request.destroy();
        socket.destroy();
        reject(new Error(`HTTP status code ${statusCode}`));
      }

      if (tunnelRequestOptions.timeout) {
        socket.setTimeout(tunnelRequestOptions.timeout);
        socket.on("timeout", () => {
          request.destroy();
          socket.destroy();
          reject(new Error("Request time out"));
        });
      } // make a request over an HTTP tunnel


      socket.write(outgoingRequestString);
      const data = [];
      socket.on("data", chunk => {
        data.push(chunk);
      });
      socket.on("end", () => {
        // combine all received buffer streams into one buffer, and then into a string
        const dataString = Buffer.concat([...data]).toString(); // separate each line into it's own entry in an arry

        const dataStringArray = dataString.split("\r\n"); // the first entry will contain the statusCode

        const statusCode = parseInt(dataStringArray[0].split(" ")[1]); // the last entry will contain the body

        const body = dataStringArray[dataStringArray.length - 1]; // everything in between the first and last entries are the headers

        const headersArray = dataStringArray.slice(1, dataStringArray.length - 2); // build an object out of all the headers

        const entries = new Map();
        headersArray.forEach(header => {
          /**
           * the header might look like "Content-Length: 1531", but that is just a string
           * it needs to be converted to a key/value pair
           * split the string at the first instance of ":"
           * there may be more than one ":" if the value of the header is supposed to be a JSON object
           */
          const headerKeyValue = header.split(new RegExp(/:\s(.*)/s));
          const headerKey = headerKeyValue[0];
          let headerValue = headerKeyValue[1]; // check if the value of the header is supposed to be a JSON object

          try {
            const object = JSON.parse(headerValue); // if it is, then convert it from a string to a JSON object

            if (object && typeof object === "object") {
              headerValue = object;
            }
          } catch (e) {// otherwise, leave it as a string
          }

          entries.set(headerKey, headerValue);
        });
        const headers = Object.fromEntries(entries);
        const networkResponse = {
          headers: headers,
          body: JSON.parse(body),
          status: statusCode
        };

        if ((statusCode < 200 || statusCode > 299) && // do not destroy the request for the device code flow
        networkResponse.body["error"] !== Constants.AUTHORIZATION_PENDING) {
          request.destroy();
          socket.destroy();
          reject(new Error(`HTTP status code ${statusCode}`));
        }

        resolve(networkResponse);
      });
      socket.on("error", chunk => {
        request.destroy();
        socket.destroy();
        reject(new Error(chunk.toString()));
      });
    });
    request.on("error", chunk => {
      request.destroy();
      reject(new Error(chunk.toString()));
    });
  });
};

const networkRequestViaHttps = (url, httpMethod, options, timeout) => {
  const isPostRequest = httpMethod === HttpMethod.POST;
  const body = (options == null ? void 0 : options.body) || "";
  const emptyHeaders = {};
  const customOptions = {
    method: httpMethod,
    headers: (options == null ? void 0 : options.headers) || emptyHeaders
  };

  if (timeout) {
    customOptions.timeout = timeout;
  }

  if (isPostRequest) {
    // needed for post request to work
    customOptions.headers = { ...customOptions.headers,
      "Content-Length": body.length
    };
  }

  return new Promise((resolve, reject) => {
    const request = https.request(url, customOptions);

    if (timeout) {
      request.on("timeout", () => {
        request.destroy();
        reject(new Error("Request time out"));
      });
    }

    if (isPostRequest) {
      request.write(body);
    }

    request.end();
    request.on("response", response => {
      const headers = response.headers;
      const statusCode = response.statusCode;
      const data = [];
      response.on("data", chunk => {
        data.push(chunk);
      });
      response.on("end", () => {
        // combine all received buffer streams into one buffer, and then into a string
        const body = Buffer.concat([...data]).toString();
        const networkResponse = {
          headers: headers,
          body: JSON.parse(body),
          status: statusCode
        };

        if ((statusCode < 200 || statusCode > 299) && // do not destroy the request for the device code flow
        networkResponse.body["error"] !== Constants.AUTHORIZATION_PENDING) {
          request.destroy();
          reject(new Error(`HTTP status code ${statusCode}`));
        }

        resolve(networkResponse);
      });
    });
    request.on("error", chunk => {
      request.destroy();
      reject(new Error(chunk.toString()));
    });
  });
};

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
class NetworkUtils {
  /**
   * Returns best compatible network client object.
   */
  static getNetworkClient() {
    return new HttpClient();
  }

}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
const DEFAULT_AUTH_OPTIONS = {
  clientId: Constants$1.EMPTY_STRING,
  authority: Constants$1.DEFAULT_AUTHORITY,
  clientSecret: Constants$1.EMPTY_STRING,
  clientAssertion: Constants$1.EMPTY_STRING,
  clientCertificate: {
    thumbprint: Constants$1.EMPTY_STRING,
    privateKey: Constants$1.EMPTY_STRING,
    x5c: Constants$1.EMPTY_STRING
  },
  knownAuthorities: [],
  cloudDiscoveryMetadata: Constants$1.EMPTY_STRING,
  authorityMetadata: Constants$1.EMPTY_STRING,
  clientCapabilities: [],
  protocolMode: ProtocolMode.AAD,
  azureCloudOptions: {
    azureCloudInstance: AzureCloudInstance.None,
    tenant: Constants$1.EMPTY_STRING
  },
  skipAuthorityMetadataCache: false
};
const DEFAULT_CACHE_OPTIONS = {};
const DEFAULT_LOGGER_OPTIONS = {
  loggerCallback: () => {// allow users to not set logger call back
  },
  piiLoggingEnabled: false,
  logLevel: LogLevel.Info
};
const DEFAULT_SYSTEM_OPTIONS = {
  loggerOptions: DEFAULT_LOGGER_OPTIONS,
  networkClient: /*#__PURE__*/NetworkUtils.getNetworkClient(),
  proxyUrl: Constants$1.EMPTY_STRING
};
const DEFAULT_TELEMETRY_OPTIONS = {
  application: {
    appName: Constants$1.EMPTY_STRING,
    appVersion: Constants$1.EMPTY_STRING
  }
};
/**
 * Sets the default options when not explicitly configured from app developer
 *
 * @param auth - Authentication options
 * @param cache - Cache options
 * @param system - System options
 * @param telemetry - Telemetry options
 *
 * @returns Configuration
 * @public
 */

function buildAppConfiguration({
  auth,
  cache,
  system,
  telemetry
}) {
  return {
    auth: { ...DEFAULT_AUTH_OPTIONS,
      ...auth
    },
    cache: { ...DEFAULT_CACHE_OPTIONS,
      ...cache
    },
    system: { ...DEFAULT_SYSTEM_OPTIONS,
      ...system
    },
    telemetry: { ...DEFAULT_TELEMETRY_OPTIONS,
      ...telemetry
    }
  };
}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
class GuidGenerator {
  /**
   *
   * RFC4122: The version 4 UUID is meant for generating UUIDs from truly-random or pseudo-random numbers.
   * uuidv4 generates guids from cryprtographically-string random
   */
  generateGuid() {
    return v4();
  }
  /**
   * verifies if a string is  GUID
   * @param guid
   */


  isGuid(guid) {
    const regexGuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
    return regexGuid.test(guid);
  }

}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
class EncodingUtils {
  /**
   * 'utf8': Multibyte encoded Unicode characters. Many web pages and other document formats use UTF-8.
   * 'base64': Base64 encoding.
   *
   * @param str text
   */
  static base64Encode(str, encoding) {
    return Buffer.from(str, encoding).toString("base64");
  }
  /**
   * encode a URL
   * @param str
   */


  static base64EncodeUrl(str, encoding) {
    return EncodingUtils.base64Encode(str, encoding).replace(/=/g, Constants$1.EMPTY_STRING).replace(/\+/g, "-").replace(/\//g, "_");
  }
  /**
   * 'utf8': Multibyte encoded Unicode characters. Many web pages and other document formats use UTF-8.
   * 'base64': Base64 encoding.
   *
   * @param base64Str Base64 encoded text
   */


  static base64Decode(base64Str) {
    return Buffer.from(base64Str, "base64").toString("utf8");
  }
  /**
   * @param base64Str Base64 encoded Url
   */


  static base64DecodeUrl(base64Str) {
    let str = base64Str.replace(/-/g, "+").replace(/_/g, "/");

    while (str.length % 4) {
      str += "=";
    }

    return EncodingUtils.base64Decode(str);
  }

}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
class HashUtils {
  /**
   * generate 'SHA256' hash
   * @param buffer
   */
  sha256(buffer) {
    return crypto.createHash(Hash.SHA256).update(buffer).digest();
  }

}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * https://tools.ietf.org/html/rfc7636#page-8
 */

class PkceGenerator {
  constructor() {
    this.hashUtils = new HashUtils();
  }
  /**
   * generates the codeVerfier and the challenge from the codeVerfier
   * reference: https://tools.ietf.org/html/rfc7636#section-4.1 and https://tools.ietf.org/html/rfc7636#section-4.2
   */


  async generatePkceCodes() {
    const verifier = this.generateCodeVerifier();
    const challenge = this.generateCodeChallengeFromVerifier(verifier);
    return {
      verifier,
      challenge
    };
  }
  /**
   * generates the codeVerfier; reference: https://tools.ietf.org/html/rfc7636#section-4.1
   */


  generateCodeVerifier() {
    const charArr = [];
    const maxNumber = 256 - 256 % CharSet.CV_CHARSET.length;

    while (charArr.length <= RANDOM_OCTET_SIZE) {
      const byte = crypto.randomBytes(1)[0];

      if (byte >= maxNumber) {
        /*
         * Ignore this number to maintain randomness.
         * Including it would result in an unequal distribution of characters after doing the modulo
         */
        continue;
      }

      const index = byte % CharSet.CV_CHARSET.length;
      charArr.push(CharSet.CV_CHARSET[index]);
    }

    const verifier = charArr.join(Constants$1.EMPTY_STRING);
    return EncodingUtils.base64EncodeUrl(verifier);
  }
  /**
   * generate the challenge from the codeVerfier; reference: https://tools.ietf.org/html/rfc7636#section-4.2
   * @param codeVerifier
   */


  generateCodeChallengeFromVerifier(codeVerifier) {
    return EncodingUtils.base64EncodeUrl(this.hashUtils.sha256(codeVerifier).toString("base64"), "base64");
  }

}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * This class implements MSAL node's crypto interface, which allows it to perform base64 encoding and decoding, generating cryptographically random GUIDs and
 * implementing Proof Key for Code Exchange specs for the OAuth Authorization Code Flow using PKCE (rfc here: https://tools.ietf.org/html/rfc7636).
 * @public
 */

class CryptoProvider {
  constructor() {
    // Browser crypto needs to be validated first before any other classes can be set.
    this.pkceGenerator = new PkceGenerator();
    this.guidGenerator = new GuidGenerator();
    this.hashUtils = new HashUtils();
  }
  /**
   * Creates a new random GUID - used to populate state and nonce.
   * @returns string (GUID)
   */


  createNewGuid() {
    return this.guidGenerator.generateGuid();
  }
  /**
   * Encodes input string to base64.
   * @param input - string to be encoded
   */


  base64Encode(input) {
    return EncodingUtils.base64Encode(input);
  }
  /**
   * Decodes input string from base64.
   * @param input - string to be decoded
   */


  base64Decode(input) {
    return EncodingUtils.base64Decode(input);
  }
  /**
   * Generates PKCE codes used in Authorization Code Flow.
   */


  generatePkceCodes() {
    return this.pkceGenerator.generatePkceCodes();
  }
  /**
   * Generates a keypair, stores it and returns a thumbprint - not yet implemented for node
   */


  getPublicKeyThumbprint() {
    throw new Error("Method not implemented.");
  }
  /**
   * Removes cryptographic keypair from key store matching the keyId passed in
   * @param kid
   */


  removeTokenBindingKey() {
    throw new Error("Method not implemented.");
  }
  /**
   * Removes all cryptographic keys from Keystore
   */


  clearKeystore() {
    throw new Error("Method not implemented.");
  }
  /**
   * Signs the given object as a jwt payload with private key retrieved by given kid - currently not implemented for node
   */


  signJwt() {
    throw new Error("Method not implemented.");
  }
  /**
   * Returns the SHA-256 hash of an input string
   */


  async hashString(plainText) {
    return EncodingUtils.base64EncodeUrl(this.hashUtils.sha256(plainText).toString("base64"), "base64");
  }

}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * This class deserializes cache entities read from the file into in memory object types defined internally
 */

class Deserializer {
  /**
   * Parse the JSON blob in memory and deserialize the content
   * @param cachedJson
   */
  static deserializeJSONBlob(jsonFile) {
    const deserializedCache = StringUtils.isEmpty(jsonFile) ? {} : JSON.parse(jsonFile);
    return deserializedCache;
  }
  /**
   * Deserializes accounts to AccountEntity objects
   * @param accounts
   */


  static deserializeAccounts(accounts) {
    const accountObjects = {};

    if (accounts) {
      Object.keys(accounts).map(function (key) {
        const serializedAcc = accounts[key];
        const mappedAcc = {
          homeAccountId: serializedAcc.home_account_id,
          environment: serializedAcc.environment,
          realm: serializedAcc.realm,
          localAccountId: serializedAcc.local_account_id,
          username: serializedAcc.username,
          authorityType: serializedAcc.authority_type,
          name: serializedAcc.name,
          clientInfo: serializedAcc.client_info,
          lastModificationTime: serializedAcc.last_modification_time,
          lastModificationApp: serializedAcc.last_modification_app
        };
        const account = new AccountEntity();
        CacheManager.toObject(account, mappedAcc);
        accountObjects[key] = account;
      });
    }

    return accountObjects;
  }
  /**
   * Deserializes id tokens to IdTokenEntity objects
   * @param idTokens
   */


  static deserializeIdTokens(idTokens) {
    const idObjects = {};

    if (idTokens) {
      Object.keys(idTokens).map(function (key) {
        const serializedIdT = idTokens[key];
        const mappedIdT = {
          homeAccountId: serializedIdT.home_account_id,
          environment: serializedIdT.environment,
          credentialType: serializedIdT.credential_type,
          clientId: serializedIdT.client_id,
          secret: serializedIdT.secret,
          realm: serializedIdT.realm
        };
        const idToken = new IdTokenEntity();
        CacheManager.toObject(idToken, mappedIdT);
        idObjects[key] = idToken;
      });
    }

    return idObjects;
  }
  /**
   * Deserializes access tokens to AccessTokenEntity objects
   * @param accessTokens
   */


  static deserializeAccessTokens(accessTokens) {
    const atObjects = {};

    if (accessTokens) {
      Object.keys(accessTokens).map(function (key) {
        const serializedAT = accessTokens[key];
        const mappedAT = {
          homeAccountId: serializedAT.home_account_id,
          environment: serializedAT.environment,
          credentialType: serializedAT.credential_type,
          clientId: serializedAT.client_id,
          secret: serializedAT.secret,
          realm: serializedAT.realm,
          target: serializedAT.target,
          cachedAt: serializedAT.cached_at,
          expiresOn: serializedAT.expires_on,
          extendedExpiresOn: serializedAT.extended_expires_on,
          refreshOn: serializedAT.refresh_on,
          keyId: serializedAT.key_id,
          tokenType: serializedAT.token_type,
          requestedClaims: serializedAT.requestedClaims,
          requestedClaimsHash: serializedAT.requestedClaimsHash
        };
        const accessToken = new AccessTokenEntity();
        CacheManager.toObject(accessToken, mappedAT);
        atObjects[key] = accessToken;
      });
    }

    return atObjects;
  }
  /**
   * Deserializes refresh tokens to RefreshTokenEntity objects
   * @param refreshTokens
   */


  static deserializeRefreshTokens(refreshTokens) {
    const rtObjects = {};

    if (refreshTokens) {
      Object.keys(refreshTokens).map(function (key) {
        const serializedRT = refreshTokens[key];
        const mappedRT = {
          homeAccountId: serializedRT.home_account_id,
          environment: serializedRT.environment,
          credentialType: serializedRT.credential_type,
          clientId: serializedRT.client_id,
          secret: serializedRT.secret,
          familyId: serializedRT.family_id,
          target: serializedRT.target,
          realm: serializedRT.realm
        };
        const refreshToken = new RefreshTokenEntity();
        CacheManager.toObject(refreshToken, mappedRT);
        rtObjects[key] = refreshToken;
      });
    }

    return rtObjects;
  }
  /**
   * Deserializes appMetadata to AppMetaData objects
   * @param appMetadata
   */


  static deserializeAppMetadata(appMetadata) {
    const appMetadataObjects = {};

    if (appMetadata) {
      Object.keys(appMetadata).map(function (key) {
        const serializedAmdt = appMetadata[key];
        const mappedAmd = {
          clientId: serializedAmdt.client_id,
          environment: serializedAmdt.environment,
          familyId: serializedAmdt.family_id
        };
        const amd = new AppMetadataEntity();
        CacheManager.toObject(amd, mappedAmd);
        appMetadataObjects[key] = amd;
      });
    }

    return appMetadataObjects;
  }
  /**
   * Deserialize an inMemory Cache
   * @param jsonCache
   */


  static deserializeAllCache(jsonCache) {
    return {
      accounts: jsonCache.Account ? this.deserializeAccounts(jsonCache.Account) : {},
      idTokens: jsonCache.IdToken ? this.deserializeIdTokens(jsonCache.IdToken) : {},
      accessTokens: jsonCache.AccessToken ? this.deserializeAccessTokens(jsonCache.AccessToken) : {},
      refreshTokens: jsonCache.RefreshToken ? this.deserializeRefreshTokens(jsonCache.RefreshToken) : {},
      appMetadata: jsonCache.AppMetadata ? this.deserializeAppMetadata(jsonCache.AppMetadata) : {}
    };
  }

}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
class Serializer {
  /**
   * serialize the JSON blob
   * @param data
   */
  static serializeJSONBlob(data) {
    return JSON.stringify(data);
  }
  /**
   * Serialize Accounts
   * @param accCache
   */


  static serializeAccounts(accCache) {
    const accounts = {};
    Object.keys(accCache).map(function (key) {
      const accountEntity = accCache[key];
      accounts[key] = {
        home_account_id: accountEntity.homeAccountId,
        environment: accountEntity.environment,
        realm: accountEntity.realm,
        local_account_id: accountEntity.localAccountId,
        username: accountEntity.username,
        authority_type: accountEntity.authorityType,
        name: accountEntity.name,
        client_info: accountEntity.clientInfo,
        last_modification_time: accountEntity.lastModificationTime,
        last_modification_app: accountEntity.lastModificationApp
      };
    });
    return accounts;
  }
  /**
   * Serialize IdTokens
   * @param idTCache
   */


  static serializeIdTokens(idTCache) {
    const idTokens = {};
    Object.keys(idTCache).map(function (key) {
      const idTEntity = idTCache[key];
      idTokens[key] = {
        home_account_id: idTEntity.homeAccountId,
        environment: idTEntity.environment,
        credential_type: idTEntity.credentialType,
        client_id: idTEntity.clientId,
        secret: idTEntity.secret,
        realm: idTEntity.realm
      };
    });
    return idTokens;
  }
  /**
   * Serializes AccessTokens
   * @param atCache
   */


  static serializeAccessTokens(atCache) {
    const accessTokens = {};
    Object.keys(atCache).map(function (key) {
      const atEntity = atCache[key];
      accessTokens[key] = {
        home_account_id: atEntity.homeAccountId,
        environment: atEntity.environment,
        credential_type: atEntity.credentialType,
        client_id: atEntity.clientId,
        secret: atEntity.secret,
        realm: atEntity.realm,
        target: atEntity.target,
        cached_at: atEntity.cachedAt,
        expires_on: atEntity.expiresOn,
        extended_expires_on: atEntity.extendedExpiresOn,
        refresh_on: atEntity.refreshOn,
        key_id: atEntity.keyId,
        token_type: atEntity.tokenType,
        requestedClaims: atEntity.requestedClaims,
        requestedClaimsHash: atEntity.requestedClaimsHash
      };
    });
    return accessTokens;
  }
  /**
   * Serialize refreshTokens
   * @param rtCache
   */


  static serializeRefreshTokens(rtCache) {
    const refreshTokens = {};
    Object.keys(rtCache).map(function (key) {
      const rtEntity = rtCache[key];
      refreshTokens[key] = {
        home_account_id: rtEntity.homeAccountId,
        environment: rtEntity.environment,
        credential_type: rtEntity.credentialType,
        client_id: rtEntity.clientId,
        secret: rtEntity.secret,
        family_id: rtEntity.familyId,
        target: rtEntity.target,
        realm: rtEntity.realm
      };
    });
    return refreshTokens;
  }
  /**
   * Serialize amdtCache
   * @param amdtCache
   */


  static serializeAppMetadata(amdtCache) {
    const appMetadata = {};
    Object.keys(amdtCache).map(function (key) {
      const amdtEntity = amdtCache[key];
      appMetadata[key] = {
        client_id: amdtEntity.clientId,
        environment: amdtEntity.environment,
        family_id: amdtEntity.familyId
      };
    });
    return appMetadata;
  }
  /**
   * Serialize the cache
   * @param jsonContent
   */


  static serializeAllCache(inMemCache) {
    return {
      Account: this.serializeAccounts(inMemCache.accounts),
      IdToken: this.serializeIdTokens(inMemCache.idTokens),
      AccessToken: this.serializeAccessTokens(inMemCache.accessTokens),
      RefreshToken: this.serializeRefreshTokens(inMemCache.refreshTokens),
      AppMetadata: this.serializeAppMetadata(inMemCache.appMetadata)
    };
  }

}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * This class implements Storage for node, reading cache from user specified storage location or an  extension library
 * @public
 */

class NodeStorage extends CacheManager {
  constructor(logger, clientId, cryptoImpl) {
    super(clientId, cryptoImpl);
    this.cache = {};
    this.changeEmitters = [];
    this.logger = logger;
  }
  /**
   * Queue up callbacks
   * @param func - a callback function for cache change indication
   */


  registerChangeEmitter(func) {
    this.changeEmitters.push(func);
  }
  /**
   * Invoke the callback when cache changes
   */


  emitChange() {
    this.changeEmitters.forEach(func => func.call(null));
  }
  /**
   * Converts cacheKVStore to InMemoryCache
   * @param cache - key value store
   */


  cacheToInMemoryCache(cache) {
    const inMemoryCache = {
      accounts: {},
      idTokens: {},
      accessTokens: {},
      refreshTokens: {},
      appMetadata: {}
    };

    for (const key in cache) {
      if (cache[key] instanceof AccountEntity) {
        inMemoryCache.accounts[key] = cache[key];
      } else if (cache[key] instanceof IdTokenEntity) {
        inMemoryCache.idTokens[key] = cache[key];
      } else if (cache[key] instanceof AccessTokenEntity) {
        inMemoryCache.accessTokens[key] = cache[key];
      } else if (cache[key] instanceof RefreshTokenEntity) {
        inMemoryCache.refreshTokens[key] = cache[key];
      } else if (cache[key] instanceof AppMetadataEntity) {
        inMemoryCache.appMetadata[key] = cache[key];
      } else {
        continue;
      }
    }

    return inMemoryCache;
  }
  /**
   * converts inMemoryCache to CacheKVStore
   * @param inMemoryCache - kvstore map for inmemory
   */


  inMemoryCacheToCache(inMemoryCache) {
    // convert in memory cache to a flat Key-Value map
    let cache = this.getCache();
    cache = { ...cache,
      ...inMemoryCache.accounts,
      ...inMemoryCache.idTokens,
      ...inMemoryCache.accessTokens,
      ...inMemoryCache.refreshTokens,
      ...inMemoryCache.appMetadata
    }; // convert in memory cache to a flat Key-Value map

    return cache;
  }
  /**
   * gets the current in memory cache for the client
   */


  getInMemoryCache() {
    this.logger.trace("Getting in-memory cache"); // convert the cache key value store to inMemoryCache

    const inMemoryCache = this.cacheToInMemoryCache(this.getCache());
    return inMemoryCache;
  }
  /**
   * sets the current in memory cache for the client
   * @param inMemoryCache - key value map in memory
   */


  setInMemoryCache(inMemoryCache) {
    this.logger.trace("Setting in-memory cache"); // convert and append the inMemoryCache to cacheKVStore

    const cache = this.inMemoryCacheToCache(inMemoryCache);
    this.setCache(cache);
    this.emitChange();
  }
  /**
   * get the current cache key-value store
   */


  getCache() {
    this.logger.trace("Getting cache key-value store");
    return this.cache;
  }
  /**
   * sets the current cache (key value store)
   * @param cacheMap - key value map
   */


  setCache(cache) {
    this.logger.trace("Setting cache key value store");
    this.cache = cache; // mark change in cache

    this.emitChange();
  }
  /**
   * Gets cache item with given key.
   * @param key - lookup key for the cache entry
   */


  getItem(key) {
    this.logger.tracePii(`Item key: ${key}`); // read cache

    const cache = this.getCache();
    return cache[key];
  }
  /**
   * Gets cache item with given key-value
   * @param key - lookup key for the cache entry
   * @param value - value of the cache entry
   */


  setItem(key, value) {
    this.logger.tracePii(`Item key: ${key}`); // read cache

    const cache = this.getCache();
    cache[key] = value; // write to cache

    this.setCache(cache);
  }
  /**
   * fetch the account entity
   * @param accountKey - lookup key to fetch cache type AccountEntity
   */


  getAccount(accountKey) {
    const account = this.getItem(accountKey);

    if (AccountEntity.isAccountEntity(account)) {
      return account;
    }

    return null;
  }
  /**
   * set account entity
   * @param account - cache value to be set of type AccountEntity
   */


  setAccount(account) {
    const accountKey = account.generateAccountKey();
    this.setItem(accountKey, account);
  }
  /**
   * fetch the idToken credential
   * @param idTokenKey - lookup key to fetch cache type IdTokenEntity
   */


  getIdTokenCredential(idTokenKey) {
    const idToken = this.getItem(idTokenKey);

    if (IdTokenEntity.isIdTokenEntity(idToken)) {
      return idToken;
    }

    return null;
  }
  /**
   * set idToken credential
   * @param idToken - cache value to be set of type IdTokenEntity
   */


  setIdTokenCredential(idToken) {
    const idTokenKey = idToken.generateCredentialKey();
    this.setItem(idTokenKey, idToken);
  }
  /**
   * fetch the accessToken credential
   * @param accessTokenKey - lookup key to fetch cache type AccessTokenEntity
   */


  getAccessTokenCredential(accessTokenKey) {
    const accessToken = this.getItem(accessTokenKey);

    if (AccessTokenEntity.isAccessTokenEntity(accessToken)) {
      return accessToken;
    }

    return null;
  }
  /**
   * set accessToken credential
   * @param accessToken -  cache value to be set of type AccessTokenEntity
   */


  setAccessTokenCredential(accessToken) {
    const accessTokenKey = accessToken.generateCredentialKey();
    this.setItem(accessTokenKey, accessToken);
  }
  /**
   * fetch the refreshToken credential
   * @param refreshTokenKey - lookup key to fetch cache type RefreshTokenEntity
   */


  getRefreshTokenCredential(refreshTokenKey) {
    const refreshToken = this.getItem(refreshTokenKey);

    if (RefreshTokenEntity.isRefreshTokenEntity(refreshToken)) {
      return refreshToken;
    }

    return null;
  }
  /**
   * set refreshToken credential
   * @param refreshToken - cache value to be set of type RefreshTokenEntity
   */


  setRefreshTokenCredential(refreshToken) {
    const refreshTokenKey = refreshToken.generateCredentialKey();
    this.setItem(refreshTokenKey, refreshToken);
  }
  /**
   * fetch appMetadata entity from the platform cache
   * @param appMetadataKey - lookup key to fetch cache type AppMetadataEntity
   */


  getAppMetadata(appMetadataKey) {
    const appMetadata = this.getItem(appMetadataKey);

    if (AppMetadataEntity.isAppMetadataEntity(appMetadataKey, appMetadata)) {
      return appMetadata;
    }

    return null;
  }
  /**
   * set appMetadata entity to the platform cache
   * @param appMetadata - cache value to be set of type AppMetadataEntity
   */


  setAppMetadata(appMetadata) {
    const appMetadataKey = appMetadata.generateAppMetadataKey();
    this.setItem(appMetadataKey, appMetadata);
  }
  /**
   * fetch server telemetry entity from the platform cache
   * @param serverTelemetrykey - lookup key to fetch cache type ServerTelemetryEntity
   */


  getServerTelemetry(serverTelemetrykey) {
    const serverTelemetryEntity = this.getItem(serverTelemetrykey);

    if (serverTelemetryEntity && ServerTelemetryEntity.isServerTelemetryEntity(serverTelemetrykey, serverTelemetryEntity)) {
      return serverTelemetryEntity;
    }

    return null;
  }
  /**
   * set server telemetry entity to the platform cache
   * @param serverTelemetryKey - lookup key to fetch cache type ServerTelemetryEntity
   * @param serverTelemetry - cache value to be set of type ServerTelemetryEntity
   */


  setServerTelemetry(serverTelemetryKey, serverTelemetry) {
    this.setItem(serverTelemetryKey, serverTelemetry);
  }
  /**
   * fetch authority metadata entity from the platform cache
   * @param key - lookup key to fetch cache type AuthorityMetadataEntity
   */


  getAuthorityMetadata(key) {
    const authorityMetadataEntity = this.getItem(key);

    if (authorityMetadataEntity && AuthorityMetadataEntity.isAuthorityMetadataEntity(key, authorityMetadataEntity)) {
      return authorityMetadataEntity;
    }

    return null;
  }
  /**
   * Get all authority metadata keys
   */


  getAuthorityMetadataKeys() {
    return this.getKeys().filter(key => {
      return this.isAuthorityMetadata(key);
    });
  }
  /**
   * set authority metadata entity to the platform cache
   * @param key - lookup key to fetch cache type AuthorityMetadataEntity
   * @param metadata - cache value to be set of type AuthorityMetadataEntity
   */


  setAuthorityMetadata(key, metadata) {
    this.setItem(key, metadata);
  }
  /**
   * fetch throttling entity from the platform cache
   * @param throttlingCacheKey - lookup key to fetch cache type ThrottlingEntity
   */


  getThrottlingCache(throttlingCacheKey) {
    const throttlingCache = this.getItem(throttlingCacheKey);

    if (throttlingCache && ThrottlingEntity.isThrottlingEntity(throttlingCacheKey, throttlingCache)) {
      return throttlingCache;
    }

    return null;
  }
  /**
   * set throttling entity to the platform cache
   * @param throttlingCacheKey - lookup key to fetch cache type ThrottlingEntity
   * @param throttlingCache - cache value to be set of type ThrottlingEntity
   */


  setThrottlingCache(throttlingCacheKey, throttlingCache) {
    this.setItem(throttlingCacheKey, throttlingCache);
  }
  /**
   * Removes the cache item from memory with the given key.
   * @param key - lookup key to remove a cache entity
   * @param inMemory - key value map of the cache
   */


  removeItem(key) {
    this.logger.tracePii(`Item key: ${key}`); // read inMemoryCache

    let result = false;
    const cache = this.getCache();

    if (!!cache[key]) {
      delete cache[key];
      result = true;
    } // write to the cache after removal


    if (result) {
      this.setCache(cache);
      this.emitChange();
    }

    return result;
  }
  /**
   * Checks whether key is in cache.
   * @param key - look up key for a cache entity
   */


  containsKey(key) {
    return this.getKeys().includes(key);
  }
  /**
   * Gets all keys in window.
   */


  getKeys() {
    this.logger.trace("Retrieving all cache keys"); // read cache

    const cache = this.getCache();
    return [...Object.keys(cache)];
  }
  /**
   * Clears all cache entries created by MSAL (except tokens).
   */


  async clear() {
    this.logger.trace("Clearing cache entries created by MSAL"); // read inMemoryCache

    const cacheKeys = this.getKeys(); // delete each element

    cacheKeys.forEach(key => {
      this.removeItem(key);
    });
    this.emitChange();
  }
  /**
   * Initialize in memory cache from an exisiting cache vault
   * @param cache - blob formatted cache (JSON)
   */


  static generateInMemoryCache(cache) {
    return Deserializer.deserializeAllCache(Deserializer.deserializeJSONBlob(cache));
  }
  /**
   * retrieves the final JSON
   * @param inMemoryCache - itemised cache read from the JSON
   */


  static generateJsonCache(inMemoryCache) {
    return Serializer.serializeAllCache(inMemoryCache);
  }
  /**
   * Updates a credential's cache key if the current cache key is outdated
   */


  updateCredentialCacheKey(currentCacheKey, credential) {
    const updatedCacheKey = credential.generateCredentialKey();

    if (currentCacheKey !== updatedCacheKey) {
      const cacheItem = this.getItem(currentCacheKey);

      if (cacheItem) {
        this.removeItem(currentCacheKey);
        this.setItem(updatedCacheKey, cacheItem);
        this.logger.verbose(`Updated an outdated ${credential.credentialType} cache key`);
        return updatedCacheKey;
      } else {
        this.logger.error(`Attempted to update an outdated ${credential.credentialType} cache key but no item matching the outdated key was found in storage`);
      }
    }

    return currentCacheKey;
  }

}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
const defaultSerializedCache = {
  Account: {},
  IdToken: {},
  AccessToken: {},
  RefreshToken: {},
  AppMetadata: {}
};
/**
 * In-memory token cache manager
 * @public
 */

class TokenCache {
  constructor(storage, logger, cachePlugin) {
    this.cacheHasChanged = false;
    this.storage = storage;
    this.storage.registerChangeEmitter(this.handleChangeEvent.bind(this));

    if (cachePlugin) {
      this.persistence = cachePlugin;
    }

    this.logger = logger;
  }
  /**
   * Set to true if cache state has changed since last time serialize or writeToPersistence was called
   */


  hasChanged() {
    return this.cacheHasChanged;
  }
  /**
   * Serializes in memory cache to JSON
   */


  serialize() {
    this.logger.trace("Serializing in-memory cache");
    let finalState = Serializer.serializeAllCache(this.storage.getInMemoryCache()); // if cacheSnapshot not null or empty, merge

    if (!StringUtils.isEmpty(this.cacheSnapshot)) {
      this.logger.trace("Reading cache snapshot from disk");
      finalState = this.mergeState(JSON.parse(this.cacheSnapshot), finalState);
    } else {
      this.logger.trace("No cache snapshot to merge");
    }

    this.cacheHasChanged = false;
    return JSON.stringify(finalState);
  }
  /**
   * Deserializes JSON to in-memory cache. JSON should be in MSAL cache schema format
   * @param cache - blob formatted cache
   */


  deserialize(cache) {
    this.logger.trace("Deserializing JSON to in-memory cache");
    this.cacheSnapshot = cache;

    if (!StringUtils.isEmpty(this.cacheSnapshot)) {
      this.logger.trace("Reading cache snapshot from disk");
      const deserializedCache = Deserializer.deserializeAllCache(this.overlayDefaults(JSON.parse(this.cacheSnapshot)));
      this.storage.setInMemoryCache(deserializedCache);
    } else {
      this.logger.trace("No cache snapshot to deserialize");
    }
  }
  /**
   * Fetches the cache key-value map
   */


  getKVStore() {
    return this.storage.getCache();
  }
  /**
   * API that retrieves all accounts currently in cache to the user
   */


  async getAllAccounts() {
    this.logger.trace("getAllAccounts called");
    let cacheContext;

    try {
      if (this.persistence) {
        cacheContext = new TokenCacheContext(this, false);
        await this.persistence.beforeCacheAccess(cacheContext);
      }

      return this.storage.getAllAccounts();
    } finally {
      if (this.persistence && cacheContext) {
        await this.persistence.afterCacheAccess(cacheContext);
      }
    }
  }
  /**
   * Returns the signed in account matching homeAccountId.
   * (the account object is created at the time of successful login)
   * or null when no matching account is found
   * @param homeAccountId - unique identifier for an account (uid.utid)
   */


  async getAccountByHomeId(homeAccountId) {
    const allAccounts = await this.getAllAccounts();

    if (!StringUtils.isEmpty(homeAccountId) && allAccounts && allAccounts.length) {
      return allAccounts.filter(accountObj => accountObj.homeAccountId === homeAccountId)[0] || null;
    } else {
      return null;
    }
  }
  /**
   * Returns the signed in account matching localAccountId.
   * (the account object is created at the time of successful login)
   * or null when no matching account is found
   * @param localAccountId - unique identifier of an account (sub/obj when homeAccountId cannot be populated)
   */


  async getAccountByLocalId(localAccountId) {
    const allAccounts = await this.getAllAccounts();

    if (!StringUtils.isEmpty(localAccountId) && allAccounts && allAccounts.length) {
      return allAccounts.filter(accountObj => accountObj.localAccountId === localAccountId)[0] || null;
    } else {
      return null;
    }
  }
  /**
   * API to remove a specific account and the relevant data from cache
   * @param account - AccountInfo passed by the user
   */


  async removeAccount(account) {
    this.logger.trace("removeAccount called");
    let cacheContext;

    try {
      if (this.persistence) {
        cacheContext = new TokenCacheContext(this, true);
        await this.persistence.beforeCacheAccess(cacheContext);
      }

      await this.storage.removeAccount(AccountEntity.generateAccountCacheKey(account));
    } finally {
      if (this.persistence && cacheContext) {
        await this.persistence.afterCacheAccess(cacheContext);
      }
    }
  }
  /**
   * Called when the cache has changed state.
   */


  handleChangeEvent() {
    this.cacheHasChanged = true;
  }
  /**
   * Merge in memory cache with the cache snapshot.
   * @param oldState - cache before changes
   * @param currentState - current cache state in the library
   */


  mergeState(oldState, currentState) {
    this.logger.trace("Merging in-memory cache with cache snapshot");
    const stateAfterRemoval = this.mergeRemovals(oldState, currentState);
    return this.mergeUpdates(stateAfterRemoval, currentState);
  }
  /**
   * Deep update of oldState based on newState values
   * @param oldState - cache before changes
   * @param newState - updated cache
   */


  mergeUpdates(oldState, newState) {
    Object.keys(newState).forEach(newKey => {
      const newValue = newState[newKey]; // if oldState does not contain value but newValue does, add it

      if (!oldState.hasOwnProperty(newKey)) {
        if (newValue !== null) {
          oldState[newKey] = newValue;
        }
      } else {
        // both oldState and newState contain the key, do deep update
        const newValueNotNull = newValue !== null;
        const newValueIsObject = typeof newValue === "object";
        const newValueIsNotArray = !Array.isArray(newValue);
        const oldStateNotUndefinedOrNull = typeof oldState[newKey] !== "undefined" && oldState[newKey] !== null;

        if (newValueNotNull && newValueIsObject && newValueIsNotArray && oldStateNotUndefinedOrNull) {
          this.mergeUpdates(oldState[newKey], newValue);
        } else {
          oldState[newKey] = newValue;
        }
      }
    });
    return oldState;
  }
  /**
   * Removes entities in oldState that the were removed from newState. If there are any unknown values in root of
   * oldState that are not recognized, they are left untouched.
   * @param oldState - cache before changes
   * @param newState - updated cache
   */


  mergeRemovals(oldState, newState) {
    this.logger.trace("Remove updated entries in cache");
    const accounts = oldState.Account ? this.mergeRemovalsDict(oldState.Account, newState.Account) : oldState.Account;
    const accessTokens = oldState.AccessToken ? this.mergeRemovalsDict(oldState.AccessToken, newState.AccessToken) : oldState.AccessToken;
    const refreshTokens = oldState.RefreshToken ? this.mergeRemovalsDict(oldState.RefreshToken, newState.RefreshToken) : oldState.RefreshToken;
    const idTokens = oldState.IdToken ? this.mergeRemovalsDict(oldState.IdToken, newState.IdToken) : oldState.IdToken;
    const appMetadata = oldState.AppMetadata ? this.mergeRemovalsDict(oldState.AppMetadata, newState.AppMetadata) : oldState.AppMetadata;
    return { ...oldState,
      Account: accounts,
      AccessToken: accessTokens,
      RefreshToken: refreshTokens,
      IdToken: idTokens,
      AppMetadata: appMetadata
    };
  }
  /**
   * Helper to merge new cache with the old one
   * @param oldState - cache before changes
   * @param newState - updated cache
   */


  mergeRemovalsDict(oldState, newState) {
    const finalState = { ...oldState
    };
    Object.keys(oldState).forEach(oldKey => {
      if (!newState || !newState.hasOwnProperty(oldKey)) {
        delete finalState[oldKey];
      }
    });
    return finalState;
  }
  /**
   * Helper to overlay as a part of cache merge
   * @param passedInCache - cache read from the blob
   */


  overlayDefaults(passedInCache) {
    this.logger.trace("Overlaying input cache with the default cache");
    return {
      Account: { ...defaultSerializedCache.Account,
        ...passedInCache.Account
      },
      IdToken: { ...defaultSerializedCache.IdToken,
        ...passedInCache.IdToken
      },
      AccessToken: { ...defaultSerializedCache.AccessToken,
        ...passedInCache.AccessToken
      },
      RefreshToken: { ...defaultSerializedCache.RefreshToken,
        ...passedInCache.RefreshToken
      },
      AppMetadata: { ...defaultSerializedCache.AppMetadata,
        ...passedInCache.AppMetadata
      }
    };
  }

}

/* eslint-disable header/header */
const name = "@azure/msal-node";
const version = "1.12.1";

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Base abstract class for all ClientApplications - public and confidential
 * @public
 */

class ClientApplication {
  /**
   * Constructor for the ClientApplication
   */
  constructor(configuration) {
    this.config = buildAppConfiguration(configuration);
    this.cryptoProvider = new CryptoProvider();
    this.logger = new Logger(this.config.system.loggerOptions, name, version);
    this.storage = new NodeStorage(this.logger, this.config.auth.clientId, this.cryptoProvider);
    this.tokenCache = new TokenCache(this.storage, this.logger, this.config.cache.cachePlugin);
  }
  /**
   * Creates the URL of the authorization request, letting the user input credentials and consent to the
   * application. The URL targets the /authorize endpoint of the authority configured in the
   * application object.
   *
   * Once the user inputs their credentials and consents, the authority will send a response to the redirect URI
   * sent in the request and should contain an authorization code, which can then be used to acquire tokens via
   * `acquireTokenByCode(AuthorizationCodeRequest)`.
   */


  async getAuthCodeUrl(request) {
    this.logger.info("getAuthCodeUrl called", request.correlationId);
    const validRequest = { ...request,
      ...(await this.initializeBaseRequest(request)),
      responseMode: request.responseMode || ResponseMode.QUERY,
      authenticationScheme: AuthenticationScheme.BEARER
    };
    const authClientConfig = await this.buildOauthClientConfiguration(validRequest.authority, validRequest.correlationId, undefined, undefined, request.azureCloudOptions);
    const authorizationCodeClient = new AuthorizationCodeClient(authClientConfig);
    this.logger.verbose("Auth code client created", validRequest.correlationId);
    return authorizationCodeClient.getAuthCodeUrl(validRequest);
  }
  /**
   * Acquires a token by exchanging the Authorization Code received from the first step of OAuth2.0
   * Authorization Code flow.
   *
   * `getAuthCodeUrl(AuthorizationCodeUrlRequest)` can be used to create the URL for the first step of OAuth2.0
   * Authorization Code flow. Ensure that values for redirectUri and scopes in AuthorizationCodeUrlRequest and
   * AuthorizationCodeRequest are the same.
   */


  async acquireTokenByCode(request, authCodePayLoad) {
    this.logger.info("acquireTokenByCode called", request.correlationId);
    const validRequest = { ...request,
      ...(await this.initializeBaseRequest(request)),
      authenticationScheme: AuthenticationScheme.BEARER
    };
    const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenByCode, validRequest.correlationId);

    try {
      const authClientConfig = await this.buildOauthClientConfiguration(validRequest.authority, validRequest.correlationId, serverTelemetryManager, undefined, request.azureCloudOptions);
      const authorizationCodeClient = new AuthorizationCodeClient(authClientConfig);
      this.logger.verbose("Auth code client created", validRequest.correlationId);
      return authorizationCodeClient.acquireToken(validRequest, authCodePayLoad);
    } catch (e) {
      if (e instanceof AuthError) {
        e.setCorrelationId(validRequest.correlationId);
      }

      serverTelemetryManager.cacheFailedRequest(e);
      throw e;
    }
  }
  /**
   * Acquires a token by exchanging the refresh token provided for a new set of tokens.
   *
   * This API is provided only for scenarios where you would like to migrate from ADAL to MSAL. Otherwise, it is
   * recommended that you use `acquireTokenSilent()` for silent scenarios. When using `acquireTokenSilent()`, MSAL will
   * handle the caching and refreshing of tokens automatically.
   */


  async acquireTokenByRefreshToken(request) {
    this.logger.info("acquireTokenByRefreshToken called", request.correlationId);
    const validRequest = { ...request,
      ...(await this.initializeBaseRequest(request)),
      authenticationScheme: AuthenticationScheme.BEARER
    };
    const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenByRefreshToken, validRequest.correlationId);

    try {
      const refreshTokenClientConfig = await this.buildOauthClientConfiguration(validRequest.authority, validRequest.correlationId, serverTelemetryManager, undefined, request.azureCloudOptions);
      const refreshTokenClient = new RefreshTokenClient(refreshTokenClientConfig);
      this.logger.verbose("Refresh token client created", validRequest.correlationId);
      return refreshTokenClient.acquireToken(validRequest);
    } catch (e) {
      if (e instanceof AuthError) {
        e.setCorrelationId(validRequest.correlationId);
      }

      serverTelemetryManager.cacheFailedRequest(e);
      throw e;
    }
  }
  /**
   * Acquires a token silently when a user specifies the account the token is requested for.
   *
   * This API expects the user to provide an account object and looks into the cache to retrieve the token if present.
   * There is also an optional "forceRefresh" boolean the user can send to bypass the cache for access_token and id_token.
   * In case the refresh_token is expired or not found, an error is thrown
   * and the guidance is for the user to call any interactive token acquisition API (eg: `acquireTokenByCode()`).
   */


  async acquireTokenSilent(request) {
    const validRequest = { ...request,
      ...(await this.initializeBaseRequest(request)),
      forceRefresh: request.forceRefresh || false
    };
    const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenSilent, validRequest.correlationId, validRequest.forceRefresh);

    try {
      const silentFlowClientConfig = await this.buildOauthClientConfiguration(validRequest.authority, validRequest.correlationId, serverTelemetryManager, undefined, request.azureCloudOptions);
      const silentFlowClient = new SilentFlowClient(silentFlowClientConfig);
      this.logger.verbose("Silent flow client created", validRequest.correlationId);
      return silentFlowClient.acquireToken(validRequest);
    } catch (e) {
      if (e instanceof AuthError) {
        e.setCorrelationId(validRequest.correlationId);
      }

      serverTelemetryManager.cacheFailedRequest(e);
      throw e;
    }
  }
  /**
   * Acquires tokens with password grant by exchanging client applications username and password for credentials
   *
   * The latest OAuth 2.0 Security Best Current Practice disallows the password grant entirely.
   * More details on this recommendation at https://tools.ietf.org/html/draft-ietf-oauth-security-topics-13#section-3.4
   * Microsoft's documentation and recommendations are at:
   * https://docs.microsoft.com/en-us/azure/active-directory/develop/msal-authentication-flows#usernamepassword
   *
   * @param request - UsenamePasswordRequest
   */


  async acquireTokenByUsernamePassword(request) {
    this.logger.info("acquireTokenByUsernamePassword called", request.correlationId);
    const validRequest = { ...request,
      ...(await this.initializeBaseRequest(request))
    };
    const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenByUsernamePassword, validRequest.correlationId);

    try {
      const usernamePasswordClientConfig = await this.buildOauthClientConfiguration(validRequest.authority, validRequest.correlationId, serverTelemetryManager, undefined, request.azureCloudOptions);
      const usernamePasswordClient = new UsernamePasswordClient(usernamePasswordClientConfig);
      this.logger.verbose("Username password client created", validRequest.correlationId);
      return usernamePasswordClient.acquireToken(validRequest);
    } catch (e) {
      if (e instanceof AuthError) {
        e.setCorrelationId(validRequest.correlationId);
      }

      serverTelemetryManager.cacheFailedRequest(e);
      throw e;
    }
  }
  /**
   * Gets the token cache for the application.
   */


  getTokenCache() {
    this.logger.info("getTokenCache called");
    return this.tokenCache;
  }
  /**
   * Returns the logger instance
   */


  getLogger() {
    return this.logger;
  }
  /**
   * Replaces the default logger set in configurations with new Logger with new configurations
   * @param logger - Logger instance
   */


  setLogger(logger) {
    this.logger = logger;
  }
  /**
   * Builds the common configuration to be passed to the common component based on the platform configurarion
   * @param authority - user passed authority in configuration
   * @param serverTelemetryManager - initializes servertelemetry if passed
   */


  async buildOauthClientConfiguration(authority, requestCorrelationId, serverTelemetryManager, azureRegionConfiguration, azureCloudOptions) {
    this.logger.verbose("buildOauthClientConfiguration called", requestCorrelationId); // precedence - azureCloudInstance + tenant >> authority and request  >> config

    const userAzureCloudOptions = azureCloudOptions ? azureCloudOptions : this.config.auth.azureCloudOptions; // using null assertion operator as we ensure that all config values have default values in buildConfiguration()

    this.logger.verbose(`building oauth client configuration with the authority: ${authority}`, requestCorrelationId);
    const discoveredAuthority = await this.createAuthority(authority, azureRegionConfiguration, requestCorrelationId, userAzureCloudOptions);
    serverTelemetryManager == null ? void 0 : serverTelemetryManager.updateRegionDiscoveryMetadata(discoveredAuthority.regionDiscoveryMetadata);
    const clientConfiguration = {
      authOptions: {
        clientId: this.config.auth.clientId,
        authority: discoveredAuthority,
        clientCapabilities: this.config.auth.clientCapabilities
      },
      systemOptions: {
        proxyUrl: this.config.system.proxyUrl
      },
      loggerOptions: {
        logLevel: this.config.system.loggerOptions.logLevel,
        loggerCallback: this.config.system.loggerOptions.loggerCallback,
        piiLoggingEnabled: this.config.system.loggerOptions.piiLoggingEnabled,
        correlationId: requestCorrelationId
      },
      cryptoInterface: this.cryptoProvider,
      networkInterface: this.config.system.networkClient,
      storageInterface: this.storage,
      serverTelemetryManager: serverTelemetryManager,
      clientCredentials: {
        clientSecret: this.clientSecret,
        clientAssertion: this.clientAssertion ? this.getClientAssertion(discoveredAuthority) : undefined
      },
      libraryInfo: {
        sku: Constants.MSAL_SKU,
        version: version,
        cpu: process.arch || Constants$1.EMPTY_STRING,
        os: process.platform || Constants$1.EMPTY_STRING
      },
      telemetry: this.config.telemetry,
      persistencePlugin: this.config.cache.cachePlugin,
      serializableCache: this.tokenCache
    };
    return clientConfiguration;
  }

  getClientAssertion(authority) {
    return {
      assertion: this.clientAssertion.getJwt(this.cryptoProvider, this.config.auth.clientId, authority.tokenEndpoint),
      assertionType: Constants.JWT_BEARER_ASSERTION_TYPE
    };
  }
  /**
   * Generates a request with the default scopes & generates a correlationId.
   * @param authRequest - BaseAuthRequest for initialization
   */


  async initializeBaseRequest(authRequest) {
    this.logger.verbose("initializeRequestScopes called", authRequest.correlationId); // Default authenticationScheme to Bearer, log that POP isn't supported yet

    if (authRequest.authenticationScheme && authRequest.authenticationScheme === AuthenticationScheme.POP) {
      this.logger.verbose("Authentication Scheme 'pop' is not supported yet, setting Authentication Scheme to 'Bearer' for request", authRequest.correlationId);
    }

    authRequest.authenticationScheme = AuthenticationScheme.BEARER; // Set requested claims hash if claims were requested

    if (authRequest.claims && !StringUtils.isEmpty(authRequest.claims)) {
      authRequest.requestedClaimsHash = await this.cryptoProvider.hashString(authRequest.claims);
    }

    return { ...authRequest,
      scopes: [...(authRequest && authRequest.scopes || []), ...OIDC_DEFAULT_SCOPES],
      correlationId: authRequest && authRequest.correlationId || this.cryptoProvider.createNewGuid(),
      authority: authRequest.authority || this.config.auth.authority
    };
  }
  /**
   * Initializes the server telemetry payload
   * @param apiId - Id for a specific request
   * @param correlationId - GUID
   * @param forceRefresh - boolean to indicate network call
   */


  initializeServerTelemetryManager(apiId, correlationId, forceRefresh) {
    const telemetryPayload = {
      clientId: this.config.auth.clientId,
      correlationId: correlationId,
      apiId: apiId,
      forceRefresh: forceRefresh || false
    };
    return new ServerTelemetryManager(telemetryPayload, this.storage);
  }
  /**
   * Create authority instance. If authority not passed in request, default to authority set on the application
   * object. If no authority set in application object, then default to common authority.
   * @param authorityString - authority from user configuration
   */


  async createAuthority(authorityString, azureRegionConfiguration, requestCorrelationId, azureCloudOptions) {
    this.logger.verbose("createAuthority called", requestCorrelationId); // build authority string based on auth params - azureCloudInstance is prioritized if provided

    const authorityUrl = Authority.generateAuthority(authorityString, azureCloudOptions);
    const authorityOptions = {
      protocolMode: this.config.auth.protocolMode,
      knownAuthorities: this.config.auth.knownAuthorities,
      cloudDiscoveryMetadata: this.config.auth.cloudDiscoveryMetadata,
      authorityMetadata: this.config.auth.authorityMetadata,
      azureRegionConfiguration,
      skipAuthorityMetadataCache: this.config.auth.skipAuthorityMetadataCache
    };
    return await AuthorityFactory.createDiscoveredInstance(authorityUrl, this.config.system.networkClient, this.storage, authorityOptions, this.config.system.proxyUrl);
  }
  /**
   * Clear the cache
   */


  clearCache() {
    this.storage.clear();
  }

}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * This class is to be used to acquire tokens for public client applications (desktop, mobile). Public client applications
 * are not trusted to safely store application secrets, and therefore can only request tokens in the name of an user.
 * @public
 */

class PublicClientApplication extends ClientApplication {
  /**
   * Important attributes in the Configuration object for auth are:
   * - clientID: the application ID of your application. You can obtain one by registering your application with our Application registration portal.
   * - authority: the authority URL for your application.
   *
   * AAD authorities are of the form https://login.microsoftonline.com/\{Enter_the_Tenant_Info_Here\}.
   * - If your application supports Accounts in one organizational directory, replace "Enter_the_Tenant_Info_Here" value with the Tenant Id or Tenant name (for example, contoso.microsoft.com).
   * - If your application supports Accounts in any organizational directory, replace "Enter_the_Tenant_Info_Here" value with organizations.
   * - If your application supports Accounts in any organizational directory and personal Microsoft accounts, replace "Enter_the_Tenant_Info_Here" value with common.
   * - To restrict support to Personal Microsoft accounts only, replace "Enter_the_Tenant_Info_Here" value with consumers.
   *
   * Azure B2C authorities are of the form https://\{instance\}/\{tenant\}/\{policy\}. Each policy is considered
   * its own authority. You will have to set the all of the knownAuthorities at the time of the client application
   * construction.
   *
   * ADFS authorities are of the form https://\{instance\}/adfs.
   */
  constructor(configuration) {
    super(configuration);
  }
  /**
   * Acquires a token from the authority using OAuth2.0 device code flow.
   * This flow is designed for devices that do not have access to a browser or have input constraints.
   * The authorization server issues a DeviceCode object with a verification code, an end-user code,
   * and the end-user verification URI. The DeviceCode object is provided through a callback, and the end-user should be
   * instructed to use another device to navigate to the verification URI to input credentials.
   * Since the client cannot receive incoming requests, it polls the authorization server repeatedly
   * until the end-user completes input of credentials.
   */


  async acquireTokenByDeviceCode(request) {
    this.logger.info("acquireTokenByDeviceCode called", request.correlationId);
    const validRequest = Object.assign(request, await this.initializeBaseRequest(request));
    const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenByDeviceCode, validRequest.correlationId);

    try {
      const deviceCodeConfig = await this.buildOauthClientConfiguration(validRequest.authority, validRequest.correlationId, serverTelemetryManager, undefined, request.azureCloudOptions);
      const deviceCodeClient = new DeviceCodeClient(deviceCodeConfig);
      this.logger.verbose("Device code client created", validRequest.correlationId);
      return deviceCodeClient.acquireToken(validRequest);
    } catch (e) {
      if (e instanceof AuthError) {
        e.setCorrelationId(validRequest.correlationId);
      }

      serverTelemetryManager.cacheFailedRequest(e);
      throw e;
    }
  }

}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 * Client assertion of type jwt-bearer used in confidential client flows
 * @public
 */

class ClientAssertion {
  /**
   * Initialize the ClientAssertion class from the clientAssertion passed by the user
   * @param assertion - refer https://tools.ietf.org/html/rfc7521
   */
  static fromAssertion(assertion) {
    const clientAssertion = new ClientAssertion();
    clientAssertion.jwt = assertion;
    return clientAssertion;
  }
  /**
   * Initialize the ClientAssertion class from the certificate passed by the user
   * @param thumbprint - identifier of a certificate
   * @param privateKey - secret key
   * @param publicCertificate - electronic document provided to prove the ownership of the public key
   */


  static fromCertificate(thumbprint, privateKey, publicCertificate) {
    const clientAssertion = new ClientAssertion();
    clientAssertion.privateKey = privateKey;
    clientAssertion.thumbprint = thumbprint;

    if (publicCertificate) {
      clientAssertion.publicCertificate = this.parseCertificate(publicCertificate);
    }

    return clientAssertion;
  }
  /**
   * Update JWT for certificate based clientAssertion, if passed by the user, uses it as is
   * @param cryptoProvider - library's crypto helper
   * @param issuer - iss claim
   * @param jwtAudience - aud claim
   */


  getJwt(cryptoProvider, issuer, jwtAudience) {
    // if assertion was created from certificate, check if jwt is expired and create new one.
    if (this.privateKey && this.thumbprint) {
      if (this.jwt && !this.isExpired() && issuer === this.issuer && jwtAudience === this.jwtAudience) {
        return this.jwt;
      }

      return this.createJwt(cryptoProvider, issuer, jwtAudience);
    }
    /*
     * if assertion was created by caller, then we just append it. It is up to the caller to
     * ensure that it contains necessary claims and that it is not expired.
     */


    if (this.jwt) {
      return this.jwt;
    }

    throw ClientAuthError.createInvalidAssertionError();
  }
  /**
   * JWT format and required claims specified: https://tools.ietf.org/html/rfc7523#section-3
   */


  createJwt(cryptoProvider, issuer, jwtAudience) {
    this.issuer = issuer;
    this.jwtAudience = jwtAudience;
    const issuedAt = TimeUtils.nowSeconds();
    this.expirationTime = issuedAt + 600;
    const header = {
      alg: JwtConstants.RSA_256,
      x5t: EncodingUtils.base64EncodeUrl(this.thumbprint, "hex")
    };

    if (this.publicCertificate) {
      Object.assign(header, {
        x5c: this.publicCertificate
      });
    }

    const payload = {
      [JwtConstants.AUDIENCE]: this.jwtAudience,
      [JwtConstants.EXPIRATION_TIME]: this.expirationTime,
      [JwtConstants.ISSUER]: this.issuer,
      [JwtConstants.SUBJECT]: this.issuer,
      [JwtConstants.NOT_BEFORE]: issuedAt,
      [JwtConstants.JWT_ID]: cryptoProvider.createNewGuid()
    };
    this.jwt = sign(payload, this.privateKey, {
      header
    });
    return this.jwt;
  }
  /**
   * Utility API to check expiration
   */


  isExpired() {
    return this.expirationTime < TimeUtils.nowSeconds();
  }
  /**
   * Extracts the raw certs from a given certificate string and returns them in an array.
   * @param publicCertificate - electronic document provided to prove the ownership of the public key
   */


  static parseCertificate(publicCertificate) {
    /**
     * This is regex to identify the certs in a given certificate string.
     * We want to look for the contents between the BEGIN and END certificate strings, without the associated newlines.
     * The information in parens "(.+?)" is the capture group to represent the cert we want isolated.
     * "." means any string character, "+" means match 1 or more times, and "?" means the shortest match.
     * The "g" at the end of the regex means search the string globally, and the "s" enables the "." to match newlines.
     */
    const regexToFindCerts = /-----BEGIN CERTIFICATE-----\r*\n(.+?)\r*\n-----END CERTIFICATE-----/gs;
    const certs = [];
    let matches;

    while ((matches = regexToFindCerts.exec(publicCertificate)) !== null) {
      // matches[1] represents the first parens capture group in the regex.
      certs.push(matches[1].replace(/\r*\n/g, Constants$1.EMPTY_STRING));
    }

    return certs;
  }

}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
/**
 *  This class is to be used to acquire tokens for confidential client applications (webApp, webAPI). Confidential client applications
 *  will configure application secrets, client certificates/assertions as applicable
 * @public
 */

class ConfidentialClientApplication extends ClientApplication {
  /**
   * Constructor for the ConfidentialClientApplication
   *
   * Required attributes in the Configuration object are:
   * - clientID: the application ID of your application. You can obtain one by registering your application with our application registration portal
   * - authority: the authority URL for your application.
   * - client credential: Must set either client secret, certificate, or assertion for confidential clients. You can obtain a client secret from the application registration portal.
   *
   * In Azure AD, authority is a URL indicating of the form https://login.microsoftonline.com/\{Enter_the_Tenant_Info_Here\}.
   * If your application supports Accounts in one organizational directory, replace "Enter_the_Tenant_Info_Here" value with the Tenant Id or Tenant name (for example, contoso.microsoft.com).
   * If your application supports Accounts in any organizational directory, replace "Enter_the_Tenant_Info_Here" value with organizations.
   * If your application supports Accounts in any organizational directory and personal Microsoft accounts, replace "Enter_the_Tenant_Info_Here" value with common.
   * To restrict support to Personal Microsoft accounts only, replace "Enter_the_Tenant_Info_Here" value with consumers.
   *
   * In Azure B2C, authority is of the form https://\{instance\}/tfp/\{tenant\}/\{policyName\}/
   * Full B2C functionality will be available in this library in future versions.
   *
   * @param Configuration - configuration object for the MSAL ConfidentialClientApplication instance
   */
  constructor(configuration) {
    super(configuration);
    this.setClientCredential(this.config);
    this.appTokenProvider = undefined;
  }
  /**
   * This extensibility point only works for the client_credential flow, i.e. acquireTokenByClientCredential and
   * is meant for Azure SDK to enhance Managed Identity support.
   *
   * @param IAppTokenProvider  - Extensibility interface, which allows the app developer to return a token from a custom source.
   */


  SetAppTokenProvider(provider) {
    this.appTokenProvider = provider;
  }
  /**
   * Acquires tokens from the authority for the application (not for an end user).
   */


  async acquireTokenByClientCredential(request) {
    this.logger.info("acquireTokenByClientCredential called", request.correlationId); // If there is a client assertion present in the request, it overrides the one present in the client configuration

    let clientAssertion;

    if (request.clientAssertion) {
      clientAssertion = {
        assertion: request.clientAssertion,
        assertionType: Constants.JWT_BEARER_ASSERTION_TYPE
      };
    }

    const validRequest = { ...request,
      ...(await this.initializeBaseRequest(request)),
      clientAssertion
    };
    const azureRegionConfiguration = {
      azureRegion: validRequest.azureRegion,
      environmentRegion: process.env[REGION_ENVIRONMENT_VARIABLE]
    };
    const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenByClientCredential, validRequest.correlationId, validRequest.skipCache);

    try {
      const clientCredentialConfig = await this.buildOauthClientConfiguration(validRequest.authority, validRequest.correlationId, serverTelemetryManager, azureRegionConfiguration, request.azureCloudOptions);
      const clientCredentialClient = new ClientCredentialClient(clientCredentialConfig, this.appTokenProvider);
      this.logger.verbose("Client credential client created", validRequest.correlationId);
      return clientCredentialClient.acquireToken(validRequest);
    } catch (e) {
      if (e instanceof AuthError) {
        e.setCorrelationId(validRequest.correlationId);
      }

      serverTelemetryManager.cacheFailedRequest(e);
      throw e;
    }
  }
  /**
   * Acquires tokens from the authority for the application.
   *
   * Used in scenarios where the current app is a middle-tier service which was called with a token
   * representing an end user. The current app can use the token (oboAssertion) to request another
   * token to access downstream web API, on behalf of that user.
   *
   * The current middle-tier app has no user interaction to obtain consent.
   * See how to gain consent upfront for your middle-tier app from this article.
   * https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-on-behalf-of-flow#gaining-consent-for-the-middle-tier-application
   */


  async acquireTokenOnBehalfOf(request) {
    this.logger.info("acquireTokenOnBehalfOf called", request.correlationId);
    const validRequest = { ...request,
      ...(await this.initializeBaseRequest(request))
    };

    try {
      const onBehalfOfConfig = await this.buildOauthClientConfiguration(validRequest.authority, validRequest.correlationId, undefined, undefined, request.azureCloudOptions);
      const oboClient = new OnBehalfOfClient(onBehalfOfConfig);
      this.logger.verbose("On behalf of client created", validRequest.correlationId);
      return oboClient.acquireToken(validRequest);
    } catch (e) {
      if (e instanceof AuthError) {
        e.setCorrelationId(validRequest.correlationId);
      }

      throw e;
    }
  }

  setClientCredential(configuration) {
    const clientSecretNotEmpty = !StringUtils.isEmpty(configuration.auth.clientSecret);
    const clientAssertionNotEmpty = !StringUtils.isEmpty(configuration.auth.clientAssertion);
    const certificate = configuration.auth.clientCertificate || {
      thumbprint: Constants$1.EMPTY_STRING,
      privateKey: Constants$1.EMPTY_STRING
    };
    const certificateNotEmpty = !StringUtils.isEmpty(certificate.thumbprint) || !StringUtils.isEmpty(certificate.privateKey);
    /*
     * If app developer configures this callback, they don't need a credential
     * i.e. AzureSDK can get token from Managed Identity without a cert / secret
     */

    if (this.appTokenProvider) {
      return;
    } // Check that at most one credential is set on the application


    if (clientSecretNotEmpty && clientAssertionNotEmpty || clientAssertionNotEmpty && certificateNotEmpty || clientSecretNotEmpty && certificateNotEmpty) {
      throw ClientAuthError.createInvalidCredentialError();
    }

    if (configuration.auth.clientSecret) {
      this.clientSecret = configuration.auth.clientSecret;
      return;
    }

    if (configuration.auth.clientAssertion) {
      this.clientAssertion = ClientAssertion.fromAssertion(configuration.auth.clientAssertion);
      return;
    }

    if (!certificateNotEmpty) {
      throw ClientAuthError.createInvalidCredentialError();
    } else {
      var _configuration$auth$c;

      this.clientAssertion = ClientAssertion.fromCertificate(certificate.thumbprint, certificate.privateKey, (_configuration$auth$c = configuration.auth.clientCertificate) == null ? void 0 : _configuration$auth$c.x5c);
    }
  }

}

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
class DistributedCachePlugin {
  constructor(client, partitionManager) {
    this.client = client;
    this.partitionManager = partitionManager;
  }

  async beforeCacheAccess(cacheContext) {
    const partitionKey = await this.partitionManager.getKey();
    const cacheData = await this.client.get(partitionKey);
    cacheContext.tokenCache.deserialize(cacheData);
  }

  async afterCacheAccess(cacheContext) {
    if (cacheContext.cacheHasChanged) {
      const kvStore = cacheContext.tokenCache.getKVStore();
      const accountEntities = Object.values(kvStore).filter(value => AccountEntity.isAccountEntity(value));

      if (accountEntities.length > 0) {
        const accountEntity = accountEntities[0];
        const partitionKey = await this.partitionManager.extractKey(accountEntity);
        await this.client.set(partitionKey, cacheContext.tokenCache.serialize());
      }
    }
  }

}

export { ClientApplication, ClientAssertion, ConfidentialClientApplication, CryptoProvider, DistributedCachePlugin, NodeStorage, PublicClientApplication, TokenCache, buildAppConfiguration, version };
//# sourceMappingURL=msal-node.esm.js.map
# PM2 for Electron

## Interface

![Process Manager](./process-manager.png)

### The Interface

```javascript
const pm = require('elife/pm')

pm.start({

	name:'service1',

	script:'index.js',

	args: [arguments],

	cwd:'./services/first',

	log: 'logs/service1.log',

	env: ENVIRONMENT_OBJECT,

	restartAt: [100,500..],

	restartOk: 30*60*1000,

  stripANSI: true,

})

...

pm.stop('service1')

...

pm.stopall()

...

pm.restart(service1)

...

/* the 'on stopping event' is called when the process is exiting
 * and gives the user an opportunity to cleanly stop the microservices
 * or web servers that are running (sub processes will be automatically
 * terminated
 */
pm.onstopping(() => {
})
```

## Clean Shutdowns

### The Problem

When the main process stops, we need to  shutdown the child processes as well. Otherwise they will just remain alive and the next time we start we will launch another whole set of microservices for no reason -  all of which will compete for the same ports and resources.

### The Solution

Whenever the process stops, we will attempt to stop all the child processes we have spawned. We will do this in two ways:

1. First we will attempt to be _nice_ and send a message to each child process requesting it to shut down. If the child process has added a `pm.onstopping` handler - that will be called.
2. If the child process refuses to stop after a short while (200ms?) we will send it a SIGKILL which will, hopefully, finish it off.

## Crashing & Restarts

![Crash](./crash.png)

### The Problem

When a process encounters a problem, sometimes it "crashes" - dies unexpectedly. If a user started the process he will often be informed with some pop up and can choose to restart the process again. However, because the user has not started our processes, if they crash we need to restart them ourselves.

#### Instability

Now if the user restarts a process and it crashes again and again and again, he is likely to give up (or at least try again after a long time). However, if we automatically restart processes that are unstable (for whatever reason) we can easily reach a crash/restart spinning loop.

### The Solution

When a process crashes we will restart it. However the number of times we will restart should depend on how stable we see it behaving:

- First crash? Wait 100ms before restarting
- Crashed again? Wait 500ms before restarting
- Crashed again? Wait 1 second, then 10 seconds, then 30 seconds, then 1 minute, then 5 minutes before restarting
- Still crashing? Re-try every 15 minutes

If it has been running successfully for 30 minutes before crashing, treat it as the first crash and restart the cycle again.

This can be configured by the user using the `restartAt:[]` parameter
and the `restartOk` parameter.
Additionally, if this is set to `[]` or `[0]`, then no restart will be
attempted.

## Logging

### The Problem

In order to see what happened to the child processes, the "Process Manager" must capture all the output of the child process and redirect it to a log file.

Logging suffers from two problems:

1. Writing to log file should be batched otherwise it will slow the process down
2. Logs for multiple processes can be interleaved in the same file. They should not mix each other up

### The Solution

We will solve _both_ the above problems by batching the output and error data into _lines_ and output-ting each _line_ to the log file.

## Strip ANSI

### The Problem

Some loggers expect to output to the terminal and fill their logs with ANSI escape codes that show the logs filled with color and style. Unfortunately, if we save these logs into text files, the escape codes make them very hard to read and understand.

### The Solution

The user can tell us to strip the ANSI codes by passing in a `stripANSI` parameter. Then the saved log file will be nice and clean.

## Identity

### Named Processes

Note that we use a `name` for each process launched in order to perform further actions on it (stopping/restarting).

The `name` is not mandatory and can be duplicated. If not provided, the process will be started but you cannot ask it to restart or stop. If duplicate then the requested action will be applied to all services with matching `name`.

## API Details

### Node Processes

We use [`child_process.fork`](https://nodejs.org/api/child_process.html#child_process_child_process_fork_modulepath_args_options) to launch the process. This special case allows us to use the embedded NodeJS that comes with Electron and also to use the files in the packed ASAR format.

Because we use [`child_process.fork`](https://nodejs.org/api/child_process.html#child_process_child_process_fork_modulepath_args_options) we also can pass messages to the child process. We use this to inform the child process that we are going to shut down (so it can invoke the `onstopping` hook) before attempting to shut it down forcefully.

### Python Processes

For python programs that are embedded in the application we

(a) cannot use ASAR and

(b) need to launch a python app

Hence we should use the [asarUnpack](https://www.electron.build/configuration/configuration#configuration-asarUnpack) option to extract the python files and then launch the extracted files using [`child_process.spawn('python',...)`](https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options)
PNG

   IHDR         X  iCCPsRGB IEC61966-2.1  (u+DQ?3ƈXX4f5GMlP(6o73j~{dl(k_VY+EdccMlsQ#s;|s\ZƪL6#efvN~G3^U2'')ko7xx*_]-<5a£˶pRC\PE~r9YXtJ23rt^&ފE"(1a9L=tʊ2]$W`%	Ą躌4+nJ#P8/Pywl)?}JZ`伤ŷtZT
qo"GP7/g[W]|`g㴗c   	pHYs  %  %IR$    IDATx]w`tҩKVfw[66L3! 	!	HЛq/{e{n\~Ui?7o7, A	$H A	$H A	$H A	$H A	$H` :4Dk&
d6@{1'%q?ڎ aAA;/ziaZJm(2pyaޢ!jum(2Anzέ\~BZ%M2кŇ 	J" $!eɂW.NO! J nD myKVU (|iDD ES/{ՏjJH @RxxR.eAS~jёbCth<!\c'$&~Y 1!>mBA"H 7eVvP H :D+=҃\aaZrޣ^ʙ  nA	a{W.}ifb|9 A LH$pY/lX4w
1 IjBw@"HY>~]
B6ai9תU^6qBB
 g|g21  i{ y?G6Xü,O%8aD?ǵsg>wE/YxUVI ~Ӳ~e~˅DiE =)rĦ>fTr$/9@::n8!?!qќWVdN>oPA9  1\ըcaDD?M>]QtװsaV+IAyik[`TtY#:$8OlH~W潘jHFh6cNH~9gl`N2`4>NH\3wC^s\2@'-X7$&-|쒋ѸR\,҂C"{٢Wf'%DCȋd!Ǹ~ܲdbDWC*z+QBXD9?{2
=DkP`ɃA|i9]llq\uv,XTeE/΍:\tLS6w(L	U޾t+ycHWlHqNTL4t!r#L
L҅dƇd$B2gGGi
kiYwe0kCƊܷbZA5Ȏ(mP8  [ר㲣#Dd%f&dN	ΘA i۶]]QyC@8Dhxղy`i5)WҋV(R@Xİ M\ϰƍEp+BTԈХ91Qix2"3#2t$m# b2Q=wp]+ypk)8|*kmBȌNeHx"  B	AbNL͌fFě
SvO@ey?D'([Jtt# 56-۰x^ޮ*(PYk]=ݾĆ_^͊Gx@Dkc"fEGfX͜Q a	!uM;jqwa 6B̽rΌ~`Ow/~Qa<furcvw=oЉA䂔
]NL온p]f.436$8sz\TZJxG`Y6N 9xN' l.8xyfG@  'HZ[.wk~ᗻVPt-IOY	QY_ì3:ÃܲK95*bAnlԬH[x657.:D)Yi9ZtI&\v9HF]JLP!0;91bfR}m?Wc5|aORDX}+;gJNB*"@qi".TxjTDFrxhА̤p]朄J$ Q}T^t^vm{iua~s.S4&AlҢ4y|`sE-*[v0֋ϛ5Ƕ+c T}֏0<;6*+%",#A9%48kV|lr\hJ URc#	`we'l/&,AlBV,]{k_xdgA=:?pܟ<v
ܠ<RiiqDMOLxȩY1m>nve:-{+_@Ŀ>c1'IF{Kw/x_Q+]=n6s}Õ%Qr&K!UfoCfB.R*T~Ary!\90<	A JͺdfNTݿ\J^-ki+sGaA͝y^YOWB*; n^}k^&!2ݽCc!/#mo\o/|ƣ}}! LWC*Q:YKdHţoKi֢Bx +'dM͉en;wpE7`,~ucWD)876~rp{^I0L'101rO!tFJuy?ӪcH hӒr;h(،^Y	S"	Q+φTWC&t3qTO]88]<IAh:w-Zyy++ٮ%~[RZ G[yyeVz39\]xt3t23!}TĎڏ(1	<SB2Ѧɐ;%&YJQ*Sn\<Ob=*9JE!\W礓k',f.m5Eo)z`hh1= 9X*mu׺is2~h}3.}|݊4
ju66;/H!+O.۽"AbOUaޞ:ˌԝYdL1u;+fF|윩ёLYqN^EנӬ8XB*|u_Uk& A`iBb;1YqA{SR]&5l/\`K4v2wXszyœCl O(>QQщA:&A\b7X򲟊%pK<|uH>מ7l)Vu^ >k092YqaA=ֲwe8AzvM|HE&I/v
<)T `,R8/pOHŒ>ʬ8w4l̈́X!5 J<94( rjjroلѢ|լ8%;C*ۉLbGeW&P0{^9I1ttVA,.s&CLcXW	sk3pwB:ˋUY[z Ixt EJVCƸ	eX.%B" ~=sEZ0!\vU5l0L E;$\iVb$ߋrYqҕvrؠ^s ~0+E,秛U7zuh$IXe<o4}tr*.eSm%F
NT_m/|Iګ:	 d#ľ%$;tl+Q/!0	bnǬ=]?9B*YDH͚;`ljziyxA?fhI.;fy=2~7" ?!n[uLb ano]9A7BÞ-,]1+ΛUҚڻhwEëzJW]ehQ`k|Ί AOy!\.}Fl K.rr .3qZm,+;9{NNXD}9$_} sGȺ4YV}Y'Z> ˖Һ1H"It~ I$ԋ/!	#`shk}`,/WA}N`O/LꔄV/޷:5Jւy	IzcX Q	+HvϊPeCb-=>c)KZ^Zc%"[X5^vlW.r//潲m޸.=1KÙYj@X dQ&=s;00ww9z  Ct݀BO(:^CVp٩$K̎⁲zFa= .KBZHEBBA5+U`O"CGk5P]墕 #u>Mf]er<hϭZC  x*kXe[!
WsuŰ}!H!+^u9),&oznvݬQ΁[@h-ۺ_pⲉQ<yYgYϞ;+/lBySLlzްQgA;@	X9iR%m_TW^vzyuAkt#;9 Bvg˞^$9y֐KuyO>bH]2k%A76FF܋MװZh~%κ:B'iH	Rwa>F],b\h6,R	fYctro4j?_{o_:]f|A ZODTQzGw-L2Uci%#FN9k.~̺ "{t} Ib4@Z]8eO\2̗.3<6xM;] QO&]qA߳ )aA>	T1r[i5A1c4W" !6SY!M]7^̲:\^2pK̎^a= ve1^PC\>z,=o؏cf9bȑoYtSe檛 cId/}z^rpy]jGLjftDKg_Ws \l
wab1~'>!re(f΅檛AkR°uN9!6/}kz}t"rge~AQp(W`rD6lz^ ԩF\!{sOBj2lX|cE3+^{Cia!/^Tvxg 2RQeEj:fGB^fC"8' A3쵧a02}n2 D#W͌ْG׷9
LeV܊n)gds7d&>aYd	 h0ðgjO^1$.%=uy ֧gM	lzpɍgںCMq="-aY/G1l rh o6x4`&	]6RQ;TZrAJ 	Br6GF粰p£j |'rp1apo6A8s+!=J?TVfJ>k+}'i~[l4wu`d,^C8o4C*M׷u-+&ADVXpYsG+A'}n{pq2>k!:} iAXs)ǳktGL}Ey{ܷJ`DwHH%/!keWC*Jw7H1'HἨ%[\?inFEk8%e8zN66BhHc?K<!\Ko0_euhp&A.9EF D.pa t#9㙣 m[zn{5 kK_?_ԮA&AĒC`Vܵ0f7Enb`o<}*d[A Xuпg[CbB]8%u.o`|l{my?p5Bb
ɡ`􈁩&sW|s.b<7%?MW`dgyd?9v4QP/\ H!.sy<Zk8LI9'L7ݓ!h} 
hn`yeMy	7Ɛc0ْMU@ A)`ތX<oVAgV\|c.6BGQ{&ƿݧ,,- 0^kqV/|	piOݓȰ eRQef%dI⁐JD`li%H$~= z`nm!Zh7!\Kfn-Yƻ~I)P)ޙ7SӒ1EwΊ;!sz
AJޮc!]&~Pod#}g! m'r"K^B:Q	 OJkwY~Mg2.h!\% n'	ï>A(kz}BcV@FxngHeK{+#!LsE/?u󦦤(e9b rخGZ|ꄩVn}
XΝr夓ZV{떇Tt>X-OZ<7vsĆho7O\̝XQ˨#&^E.1Ȟ	m9R[vMy>9g;`B,>zuː^<_Xyk/zUy7$납S|}^`tBDP0N*ea=s0JR1b褕Wk.6hrY^\Ԫ!pagIKNXK+rvb|\&48*ID`zvVr0ӓ}P-^I eDx<O.t:J',f
\59b0,ܳcY;dR!ϛyP?TwW	q矸l?/=CTX3|0+NR'Pdπ,f`QaryT{ΑC#ʄ9P_wT
yTȢb Si!>쁐ݳYU(yqQ=Fobɯ=;{dUVFK"^t|!]7OzcQ>IOb\/e۟7Dv6rAZ(_5 "YT,}.<oW⮋8Z\쿚/d8A\a'6.wF.w||5@B*6Xx5W%Yk`,9GEClxlgoT岵P_]'(yW\%.ժ-&7c!Vvlt=+eeFz2֐OCϋM~	λ+ `d*V}=oc#
(,Cu%2[Ovwx6:!\U.{J!_i`8O\=HXFs̜ܕ)Ir285_Ί3t!(f-`DZq	FJ ːSǘpz4\ժf EUKer Ě[_G׮9%2\+XL|.@Pd8P( ONn,ȋMnbr@ sEgAẠc<C.wV}$TP,X08SpN2'++v~J.x&^ry!(LPZ؜M	YD4LcV$> `nkݻׂPpd/GsE]Cl:	Rʗ"젪  _IDATEm$"Hb.sk}iUJ©lwpc) z-] Le"+;]淏mVYTF6ͽ:V"Sa2($`<=/}ue"k!RXqPUQN3AMYKVm~x+t!j 8{8aFVȴCe톹aVtFL@v!GCư C  !B*}tOR(D;SZ?8\( C5--&J2%44x":,Yˋ!OLLѠȝ(OB4\dౝ>Yq$dq	z7Mqñ4/ȳg:ޒc.{,'ni:6d۹Wu<0jӧb5ݲ涞!Hxu&W/6ymo*9I\z BBA<5Leȋ>{S3s/9GFv}CP.[x1`V=+.c
Ou7DуV6X!Oo<7K:Ypc`HJ)@!ku"7f F#d YD\_۵O*\
ʵWA}ݜ5O`  ʼU tv+>B*h9$]2ćG|C͝
=QHv/lYWf!V8{u.OfSOjTY
_%(灈rxPtI=Rb2h~9=#mCx%ûшѽ}?O˫0j~t_-X;Z`᱙Su{vTyO$R*Nt͞u5'`<GOLA@UErh7/fY9%3AsO\ Ib1kK>ּW@f]E$FlyzW^vuD/){8^hA}ɸnQJb,T?qUAO*5+.W@}MP.^^$Xt>qT  KɀbB(f/rx .@0eXDXewtvdV\(E"9U?=^%)Jp
欸sȮΊ+AsFᅁV[`(Բq!`x0hAD@"2Xsf	¦_~{n!UIf\ŦO*~Y>!5^qWdD8ywTN2נqsٔDd?]̻-(!x.(QҬ8˞9"#+&2kmV=3S7Ȕ\l{Xp1>'䙹P;ٌ#0+DR "]VBA6w쁇7!"XKMc}vWfV
T 2WO'2'Ag@jӳ1xFw}sk\wT,\x>h6U-qY[Fwb^b\޺;/JnqJBcC*/6ӳ\b1nX|06 R9/gH275셷k `!1,4rEZ}3S6\3=kVe}eHE<c9p(2s!ϚyFfݝ ;@vYY? G^P/eA( %^}iԍW_J˾
8@h4:DP\ah[7q)YqN($)=VI:JAȌXz)7J˶. */yOΊuGL痿Qy]Q|%1 ¤etմ5:f1!\W
jzᅆ|%`G-_YYv{۞/wc<Ah}f]2R_o}!H}:rs5B@pKҊIƓVD{&Al	8=S7\Tn>`3,:5M2ٲ>hxqP?$Ԅ+gn,;ܘ(mW}2uȋ>_T4VbCߟ,ݦ1>Ө/?PO;FMةar8rir>hς1	bCLS#uo~_X٭7u
Ą
9Tr=O9&53HPPbI)!&zٗ7_Q}IfuRHZ!"daIϩ!;!\[u޸dV~~5/>6"M7<RQn   "HEt$8/9H021tZ2QuA.a߈ľcLZdF)ͤPzc](35FҮ@]K[=5<-y͚^>F]0;C\ކ͝_Ï1iC]HW"
ENx$ϖ|BO{f'nϊuۺw01i	qBX|XAAo<Z?ڦ'jz<UDV Yq!uF{۽:ULJhgFe|kX;Zϓi7mά8SE߮}1)	2-:byjX!$ֹҽ/ɅJ$CxB*@Yw`NNiC*`d9Q929ocv$> m_8;q
vr0cFC.T|ܩgqr{^\Yo~IAu!َf=q)a9w:exs{?NOyåiΚWա7toh)N9|9位{)߅_LJf⥆0	^rX{^3>zAruLεL}%}ÆHJ=0%Iߵtn.`$HeD貜w\|#6w<1z[#=YN{[_9zHj F]<1 Ӣ#VΈ|m<dpg{u_ew&^}O֚ls3I*fmGFwkW# z cs f Vyn`FR =Y{%5dSՊAT\d/d$Ih&PZ¤#H.4[FRٻN϶v.T6/_P_qlHEƎξ/ꏘtIimveׅ\[WC{E7Xpo){! ouk!U>޽]?2 d#2Y##!p@=unf Wco۬f9+vU=}˪]f3ec2$1`4aoc_/Ldä"HVdؒ	1u\+h=;Id|3<}S-gf4}C?(wŪV(e1t! |G}뙓$123&rvy~+,={9#&39YՍ︒Łj<L1βe.D[vJT!lKx97HZX7 ,9W|UV,総$)Eտu-la 9Aȷ]6cR$IͱLwwh3?k7"#KkWRs,.t{;[k/.ΊT6r4v|W;0<b2H	a.]Gۉxb>fll~|]clyH?CRV{u-L߷v:&AtDE(rǮEКgb5ϔ_;4wvΖC:֎Y]=zfi	 3"ETz	-ġ3k6yEKo0=}A}߶֏M^%=o=ҵf`6 liX|HUcsV`sOn$xDK_W5\vַi˕bnMf[vFoc$9ԶI pg{]iIߜ-3-ag6YTwT?Ըs3Ë+ k[Ĳ~Ť!Hbh4רGjH_5Tм/N߶W+c\]}aO-L
DisÙ4Oc{7w.~=+mn=uulfb<l4c_sfO-L
dE]45\fT,1ޚ҇aa$_W?{g;z
=붺7#(`Tr;m	`$7*,ǩ,!ըċ'[vyB@ȈSOkhʻ';zQݼًX7B*B=1ƉK¤ HJXm琪p}g-E$a"?hxћYok}gX~A"V2F6w:&AB}xYBu͕?sw/T<	?^*(G/i>JrTQ+Gyg/18^Lx+!SB	ZHe$Irx/ZYȍ-Mo4AG)Vr I8޳kVz b# I\USCA⚻+{|eշ!󵒞-]HLxL	Zk{wowכLN҆vȶLf7Z{Pb$=,$G&~]Ս~`s+ZB*18+w0	G~+|Gwm
$4zַ}b"<Ks ii>+w0	hcwqa}@/ʹ.?X zvGg1	Th6T߲!u[;4c`6c_s_ CƁc"`GcǫU\ov7uk>t3c;VA$ƶtF$45wMȑA DXG/kѽȮG|dG!DKAYhy"9ڹ DKҵum>hۖ	5AD	u}]|l D?:JL$6 O$Hpưl
V#cԪ*ѤM$Rb$-J_ A	$H A	$H A	$H A	$H A	)k>    IENDB`'use strict'
const fs = require('fs')
const path = require('path')
const proc = require('child_process')
const stripAnsi = require('strip-ansi')
const ProcessInfo = require('./process-info')

module.exports = {
    start,
    restartByName,
    stopByName,
    stop,
    stopAll,
    onstopping,
    forEach,
}

/*      understand/
 * PROCESS REGISTRY
 */
let REG = []

function forEach(cb) { REG.forEach(cb) }

/*      understand/
 * Shutdown hook to be called before shutdown (should be called only
 * once)
 */
let ONSTOPPING
let ONSTOPPING_CALLED

/*      outcome/
 * We get the values we require from the user, set up some defaults, and
 * start the given process depending on what type it is
 */
function start(pi, cb) {
    if(!cb) cb = (err, pid) => {
        if(err && pid) {
            if(pi && pi.name) console.error(pi.name, err, pid)
            else console.error(err, pid)
        } else if(err) {
            if(pi && pi.name) console.error(pi.name, err)
            else console.error(err)
        } else {
          console.log(`Starting ${pi.name} on ${pi.cwd} - pid (${pi.child.pid})`)
        }
    }

    if(!pi) return cb(`Cannot start process without any information`)
    if(!pi.script && !pi.cwd) return cb(`Cannot start process without 'script' or 'cwd'`)

    pi = {
        name: pi.name,
        script: pi.script,
        args: pi.args,
        cwd: pi.cwd || process.cwd(),
        log: pi.log,
        stripANSI: pi.stripANSI,
        restartAt: pi.restartAt,
        restartOk: pi.restartOk,
        env: pi.env,
        cb: cb,
    }
    pi = Object.assign(new ProcessInfo(), pi);

    if(!pi.restartAt) pi.restartAt = [100,500,1000,30*1000,60*1000,5*60*1000,15*60*1000]
    if(!pi.restartOk) pi.restartOk = 30 * 60 * 1000

    get_script_1(pi, (script) => {
        pi._script = script
        if(!pi._script) return cb(`Failed getting program to run`)

        fixAsarIssue(pi)

        let handler = getScriptHandler(script)
        if(!handler) return cb(`Don't know how to start ${script}`)

        REG.push(pi)
        handler(pi)
        cb(null, pi)
    })

    /**
     *      outcome/
     *  This will check the given script or CWD is inside asar file or not.
     * If given script or CWD is inside, it will change the script and CWD
     * to as per asar child process support.
     * else this will keep same
     * @param {*} pi
     */
    function fixAsarIssue(pi) {
        if (pi.cwd.includes('/app.asar/') ||
                pi.cwd.includes('\\app.asar\\')) {
            let p = pi.cwd.split('app.asar')
            if (p.length == 2){
                pi._script = path.join('app.asar', p[1], pi._script)
                pi.cwd = p[0]
            }
        } else if (pi._script.includes('/app.asar/') ||
                pi._script.includes('\\app.asar\\')) {
            let p = pi._script.split('app.asar')
            if (p.length == 2){
                pi._script = path.join('app.asar', p[1])
                pi.cwd = p[0]
            }
        }
    }

    /*      understand/
     * A nodejs module contains a 'package.json' file which generally
     * gives the 'main' entry script for the module. So we can use this
     * to find the script to run if we haven't been given it.
     *
     *      outcome/
     * If the script is provided, we use that. Otherwise we check if we
     * are a node module and try and derive the script from the
     * 'package.json'.
     */
    function get_script_1(pi, cb) {
        if(pi.script) return cb(pi.script)
        let pkg = path.join(pi.cwd, 'package.json')
        fs.readFile(pkg, (err, data) => {
            if(err) {
                pi.emit('error', err)
                cb()
            } else {
                try {
                    let obj = JSON.parse(data)
                    cb(obj.main)
                } catch(e) {
                    pi.emit('error', err)
                    cb()
                }
            }
        })
    }
}

function restartByName(name) {
    REG.forEach((pi) => {
        if(pi.name === name) restart(pi)
    })
}

function stopByName(name) {
    REG.forEach((pi) => {
        if(pi.name === name) stop(pi)
    })
}

function stopAll() { REG.forEach(pi => stop(pi)) }

/*      outcome/
 * Set the 'onstopping' hook which is called before the process shuts
 * down.
 */
function onstopping(hook) {
    ONSTOPPING = hook
    ONSTOPPING_CALLED = false

    process.on('message', (m) => {
        if(m.stopping) callOnStoppingHook_1()
    })
    process.on('beforeExit', (code) => callOnStoppingHook_1())
    process.on('exit', (code) => callOnStoppingHook_1())

    function callOnStoppingHook_1() {
        if(ONSTOPPING_CALLED) return
        ONSTOPPING_CALLED = true
        ONSTOPPING()
    }
}



/*      outcome/
 * Restart the requested process by stopping it and then starting it
 * again.
 */
function restart(pi) {
    stop(pi, () =>  startAgain(pi))
}

/*      outcome/
 * This function finds the appropriate handler for the process and
 * starts the process again marking the time it has been restarted.
 * It assumes that the process has been correctly started/setup before
 * and stopped so it does no error checking
 */
function startAgain(pi) {
    let handler = getScriptHandler(pi._script)
    if(!handler) pi.emit('error', `Don't know how to restart ${pi._script}`)

    handler(pi)

    pi.stopRequested = false
    pi.lastStart = Date.now()
    pi.emit('restart')
}

/*      outcome/
 * Send a message to the child to stop and wait a bit to see if it
 * complies. If it does fine, otherwise try to kill it.
 */
function stop(pi, cb) {
    pi.stopRequested = true
    if(pi.restartInProgress) clearTimeout(pi.restartInProgress)
    if(!pi.child || pi.child.exitCode !== null) {
        cb && cb()
        return
    }

    try {
        if(pi.child) {
            if(pi.child.send) pi.child.send({ stopping: true })
            pi.child.kill()
        }
        cb && cb()
    } catch(err) {
        console.error(err)
        pi.emit('error', err)
    }
}

/*      problem/
 * Depending on the type of file we need to run, return a handler that
 * can launch that type.
 *      way/
 * Use the extension of the file to determine it's type and then return
 * a matching handler
 */
function getScriptHandler(script) {
    if(!script) return
    let handlers = {
        ".js" : launchJSProcess,
        ".py" : launchPythonProcess,
    }
    let ext = path.extname(script)
    if(ext) return handlers[ext]
}

/*      outcome/
 * We use the standard `child_process.spawn` function to launch a python
 * process with the given script as the first argument. Then we capture
 * the output and handle process exits.
 */
function launchPythonProcess(pi) {
    let opts = {
        windowsHide: false,
        detached: false,
    }

    if(pi.cwd) opts.cwd = pi.cwd
    if(pi.env) opts.env = pi.env
    if(!pi.args) pi.args = [pi._script]
    else pi.args = [pi._script].concat(pi.args)

    pi.child = proc.spawn('python', pi.args, opts)

    pi.flush = captureOutput(pi)
    handleExit(pi)
}

/*      understand/
 * To launch the requested process as a new NodeJS process, we use a
 * special node js function (`child_process.fork`) that launches other
 * nodejs processes and creates a connection with them so we can
 * communicate via messages. This both (a) allows us to use the electron
 * embedded NodeJS and allows us to send messages requesting the child
 * to shutdown when we are shutting down ourselves.
 *
 *      outcome/
 * Launch the child process using `child_process.fork`, capturing the
 * output and handling what happens when the process exits.
 */
function launchJSProcess(pi) {
    let opts = {
        silent: true,
        detached: false,
    }

    if(pi.cwd) opts.cwd = pi.cwd
    if(pi.env) opts.env = pi.env
    if(pi.stdio) opts.stdio = pi.stdio
    if(!pi.args) pi.args = []

    pi.child = proc.fork(pi._script, pi.args, opts)

    pi.flush = captureOutput(pi)
    handleExit(pi)
}

/*      outcome/
 * As data comes in either the error or output stream we capture it and
 * show individual lines.
 */
function captureOutput(pi) {
    if(!pi.child) return () => "Doing Nothing"

    let op = ""
    let er = ""

    pi.child.stdout.on('data', (data) => {
        op += data
        op = show_lines_1(op)
    })
    pi.child.stderr.on('data', (data) => {
        er += data
        er = show_lines_1(er, true)
    })

    return flush

    function flush() {
        if(op && op.trim()) out(pi, op.trim())
        if(er && er.trim()) out(pi, er.trim(), true)
        op = ""
        er = ""
    }

    function show_lines_1(f, iserr) {
        if(!f) return f

        let lines = f.split(/[\n\r]+/)
        for(let i = 0;i < lines.length-1;i++) {
            out(pi, lines[i], iserr)
        }
        return lines[lines.length-1]
    }

    /*      outcome/
     * Given a log file we output to the log file. If no log file is
     * given we output to stdout/stderr.
     */
    function out(pi, line, iserr) {
        if(pi.stripANSI) line = stripAnsi(line)
        if(pi.log) {
            if(pi.name) line = `${pi.name}: ${line}\n`
            else line = line + '\n'
            fs.appendFile(pi.log, line, (err) => {
                if(err) {
                    console.error(err)
                }
            })
        } else {
            if(pi.name) line = `${pi.name}: ${line}`
            if(iserr) console.error(line)
            else console.log(line)
        }
    }
}

/*      understand/
 * The ChildProcess is an `EventEmitter` with the following events:
 *      + 'error': Failed to start the given process
 *      + 'exit': Process exited (fires sometimes)
 *      + 'close': Process exited cleanly
 * `exit` and `close` may both be fired or not.
 *
 *      outcome/
 * If there is an error, exit, or close, we flush whatever data we have
 * so far and then callback with the error or completion and clear the
 * child process. Allow the process to restart if needed.
 */
function handleExit(pi) {
    if(!pi.child) return

    const child = pi.child

    child.on('error', (err) => {
        if(child == pi.child) pi.child = null
        pi.flush && pi.flush()
        pi.emit('error', err)
        restartIfNeeded(pi)
    })
    child.on('exit', on_done_1)
    child.on('close', on_done_1)

    let prevcode, prevsignal

    function on_done_1(code, signal) {
        if(child == pi.child) pi.child = null
        pi.flush && pi.flush()
        if(code == prevcode && signal == prevsignal) return
        prevcode = code
        prevsignal = signal
        if(code && code) {
            pi.emit('exit',`Exited with error`, child.pid)
        } else if(signal) {
            pi.emit('exit',`Killed`, child.pid)
        } else {
            pi.emit('exit','Process exit')
        }
        restartIfNeeded(pi)
    }
}

/*      outcome/
 * If the process is not running, check which restart interval is needed
 * then launch a restart after that time. Note that if the `restartAt`
 * parameter is the special parameters `[]` or `[0]` or if the process
 * is already started somehow we don't start it again.
 */
function restartIfNeeded(pi) {
    if(!pi.restartAt || pi.restartAt.length == 0) return
    if(pi.restartAt.length == 1 && pi.restartAt[0] == 0) return
    if(pi.child && pi.child.exitCode === null) return
    if(pi.stopRequested) return

    if(pi.restartInProgress) return

    let intv = get_restart_interval_1()

    pi.restartInProgress = setTimeout(() => {
        pi.restartInProgress = false
        if(pi.stopRequested) return
        if(!pi.child || pi.child.exitCode !== null) startAgain(pi)
    }, intv)


    /*      outcome/
     * The restartAt[] parameter gives a list of times (usually
     * increasing) at which to attempt the restart of this process.
     * We keep track of the current index and go all the way to the end.
     * If the process has been running successfully for `restartOk` we go
     * back to the begginning cycle again.
     */
    function get_restart_interval_1() {
        let ndx = pi.restartAtNdx ? pi.restartAtNdx : 0
        if(pi.lastStart && (Date.now() - pi.lastStart > pi.restartOk)) ndx = 0

        if(!ndx) pi.restartAtNdx = 1
        else pi.restartAtNdx += 1
        if(pi.restartAtNdx >= pi.restartAt.length) pi.restartAtNdx = pi.restartAt.length-1

        return pi.restartAt[ndx]
    }
}
{
  "name": "@elife/pm2",
  "version": "3.6.1",
  "description": "A PM2 Replacement that works with Electron",
  "main": "index.js",
  "author": "charles.lobo@gmail.com",
  "license": "ISC",
  "repository": {
    "type": "git",
    "url": "https://github.com/theproductiveprogrammer/pm2.git"
  },
  "homepage": "https://github.com/theproductiveprogrammer/pm2#readme",
  "dependencies": {
    "strip-ansi": "^6.0.0"
  }
}
'use strict'
const EventEmitter = require('events');

class ProcessInfo extends EventEmitter {
  constructor(){
    super()
  }

}
module.exports = ProcessInfo
PNG

   IHDR  ,  ,   y}u  iCCPsRGB IEC61966-2.1  (u+DQ?3ƈXX4f5GMlP(6o73j~{dl(k_VY+EdccMlsQ#s;|s\ZƪL6#efvN~G3^U2'')ko7xx*_]-<5a£˶pRC\PE~r9YXtJ23rt^&ފE"(1a9L=tʊ2]$W`%	Ą躌4+nJ#P8/Pywl)?}JZ`伤ŷtZT
qo"GP7/g[W]|`g㴗c   	pHYs  %  %IR$    IDATxw`,}EDQ&bDML4&1&Ѩ)X~5ESI&EE,TRwawa};wwwn93{g93y{(((((((((((((((((((((((((((,PVI0`+.EQN  ƻYu GEQkYV`N9O%Kgy\ynf*d+ s7*e޼yƲ,cYV	g{EIaѣMeee5馛l/U(	h.w+'MJԗ C}#WXԗ 6l}#WXԗ% sSNs΍_Q/ s`0X-h"a2$TQ7U5kyW͢E-bk(.QܑL#MhAi&6@I(NƇ^?%\j?)8d!bd|EQVnG0:FQ8/P5EQv!bRKQ%.9g$tmQEl`3"Vs|EQV~U1g[EQj(d~-(5b!bEQ '>_SEQj'}EQVEĪ-(5rP}EQF,D<Ec.	EQiBo>ۢ(R+#b-(5r:>ۢ(R#`1"V 0tEA*Ej$rmH$GmQZ31!\>ڨ(:lK 	a(smb_k<n-
\!o#VC&p*J,E]4.<Aa/zUzK_	E2;Âɽ:_,zG[R 2|"RUZ
;5H3"ː	K~!8xda	0>
ZsZ'"AYox[خX3yM[9"~d ?^
kq`PZDf%zd!ɟV"q)A( " qawo0qW^5yY,^ F6m86~1j"iL[<b.iPfx23SL1F25yGept6UL۪5N%lԻ%PJDΣ僀-!DW`
&`d ݜ
;̞=lڴAcsd<5G=	"D	{+4{tNl9iZ,*$^r?a{ζչJBa&++Ν;͹~ .*E!a߁{CAut㔎z3YΙB$$_L޽g}VP	3,k?D,K<RĪ*Bsgt  qoG)4F<fzEIPzZU4H\}|0|+{[!U麍GVLUroHH:Ənbe1W^yTV 74]᪫ ?ƢQ L~~)..n`c̋/h?{Yu
]{Ce06?x1DjE3 }be fffP\<tO OXUâŶX}@
OqIT˪8 p	'Ĥ,F250&6ʿƮEnH`]I T
5{ (,aEm+	
Vb`1kV5{dkiK'' *X:kƬAW[bhj5ŦeaRJ@T K,Ybh12*a1hoۿ`)J310]tQLF	KJJLZZAV͉ocWf(9ܴ§GD;={4Y|I}Ί2bUːѾ3$EI~_$ڹsz4co/lX)7La_EIfٍ`0hO|0~ղ#kNK(H!5lrsm6|J"a?Ʋᒵ^Q]~y\`_@QR?w7knŲQ2eHDe0REm[ĉ(UH/p,[ʀ[y˲f{5,0ܹ͛s͍7h4ȃ@dhv!zBB;xPh:v.DVI+|YVl)L{x6a hW`!uv 
3cʱD:עzJ\0ڇ3t!+*tAL.=OpmQ zg՟OeаSÌ򅵬B=9'b?kN?bT`R[lk"p7C϶4qC*qAk,w6ζZx2UA vujZWqmQ@V5L;,橧kנag[C/#$˔YKڇgYth6k]&qCr;ˉԶRJeЧ1Dm/fmi`S5GQJyz~o25LƱ{+3PRmv<#8eSo;5EQcVpT}~{ᬳɣwjebr[B'Wkn }rki	Kɗ5Nc>ۢ(uT"`~GpD9mqlg[QLOה$I=x]y8ڄQ/86g[ICʨhWq#%_"i&m(Mȗy32_ipmrm+LE@)϶$"ī.AVQ78AY0za$ܞ82(JhS~mIDyNK86g[bMg$M:נ$95։#D҉C ؈c3]eTS>ےa-]l5'&y.p71l60\{-,$3q'lKѝDA>v·\aZm=KTP'ej($v8*l:ʻW>PqlK1DR?F\u%8hX
ORf#_5@϶$oO}8KEcW徾beowǧhrtR2'-mI4ƿDc\.$':bRMRcwqϡ׿hK
2
R<ծO!E̩}:ImL[Kx50	i,}%6hr`݋][wkջ!Vi319HDe>p.o bf`0 kAJS(lK"MdIϲ3vkn;Bm>% =MD*7DbFk{Y;PYHn, ީm@ ;7';;ٹݱ,8|h'vRz҃*mpPh.W >ag":0^)*J$
^_snHyD¢Ƞ{S=x&O';7@d?@0F~,`lY<7E0X>mWwyJpNN잰$~Vd 8+לcdrzZF6M8Vm;Z!AJ%^pYT/Âʲ"}*<QYqJ<tU0 zǠ2$+"bbJJw}%@Ƶ~	t 6\	ZQ)
	qDɲ=27v.>~׬/Se
I 	cMe)d=%&&d8x RVٮR8Fк5x/|~ï$3MXTT+[BE-̬6|6;9{m$7b#$ 8=>'w.FZLXRSfRSk<#K哐=ǛtaFp}CXm襛)`YC۸kg mB˻F! bST@}QHQd}J1nF7Z*}7e_ @8c COӳr[i,$mK>N 2 A)Ә' >愈BDRT,HuHr~dZ̹&-#ǌ;ok +<g~<?{%^\/nq;=cӚ&y	w#޻{d}k3I>A$a'x;2#2I=H.͝Ȑ`@gy؇e˸ӮpIAp	RF&}[|Q@y5o*?>C F¾l79t#p3;GAF39)ӵg*nFBiHpHcPo!2װpH%r:%U'$p,")88WO+6!j[PVy;6=$6H|;T_{
SEdi|/H u ÷9=,d~pm"%?nu%$&X _G얣bzM ==ɟ
üݺp§-Z'Wzm{oO;nO(}+ yѩhCcsV<t㥷CrʤB F!s7!)yH^.p$c"Ꭴ%+u(HݬHz y/G13ܚݶ/֝D-y=(sw!Ʀ\C֢u!QpBHzp4{x=j*y09KK¦!"sї.;t!50pJȂO{RQ@F^?,ueCHl$&Q2?i9fZm;xh"5vTyGÞSjVu-bxh{w1%R)x^^w8%A ኆ
ѽ&qE
V625FNclݍ<ҳ8R_(kj"1̓f>Oӫ;<d	i/ܭtũljʀ9vy<20i|H['>=-
"A_ a +)T7c>gvNey!gOr` ɋ!ǉ@26hȸtҭ'!"`Wan"QM)6ǚec8}NO[y^sd6C]ݵ7u)SH|/$((8:.dnh}qO	V []~C8-m?܌vƊ?)-+E
Qt(2cň+m{|Ml t@bH7!#w^!ݾ9K7{pF6AXiqRMnlݝf~HVM߽)ֿ 'A2]Od1)RnȮ;sݸ=1x~hܲ2a Nl$CdT؍^@]	۵+kY#)k@z3l+./cȔp\},w;c3
~=>"g?ux'9>s`\e>oG8$5&oi,)VHbaK
"X$ EaI8'G]фf˞;KAӟuXٓ6y¢bw鼉i7ؚAMycN./*+%&w{=y➡ƧASIt$ dȾGg!soVs]=0ٽ_KNA]a)Hb=2w;/0'ܶ_	{QUͯzqM!Сs-HEJ5>xO;5	R+>Uk:٩tD4}~H6&7[g3p/.g-aatɂ7^+ySzlwWwg3IzFUd4x&z0=B{2~$Sj"Xte 9y:׶L2NfPP"8Y$ap{Rn
pۮ{D1]:.2@U-x&'kOdt,SM$fdVG?d b7 U=@vI'=+gة|`@~Rrw	3	E{^#ƳoXP\-k,t-G4Յ-l%Sdx^#9nn$v.-BxzKg T.%XsBwԱ5gE,,+A>"fw{)v(@В^v-"oXN;v>6[HPg]nB65L$l<c7t@`١{RְۘrlGt@"YW"@+>ek*,vV
>pV;>CQ}EjMrzJzFmlQNpOE%deB!xo9,^#wwLnUUuy&c
q	=4[@djGAٲ\tkkȄ u!shE+Sa,8֮|2c+v`Ud,%zu#/=}HPΡ`c9^=F!Y}NfW^xFYPr$uDM+(>c֙p= 3C꾆+AfT.;Np$>-^
V9tDFA??tL=.vL$f8f,CewĈsnrcك@fDĨG[7bwykȒXy㿾bo7&eg?+hfΛ Ẅ́w@)>X'co~&SG1k6^༉0D]lL28g,=H9< 7\yma>(<#wD[,SxIܥv/{/={cΟD騪a"i.cRÚYEާ]S<6l@2yVNGD.a˩	5zk$+';U~y&ce߅	pt/u*|b8s.
7ǫ0j0ˇaG_ԓa$XN=Ia~8Xf]c{x*P% mw@ލH^T,ha p
 --X'd*G-ç5PVS۾*Z+b[uZҳ`n6,\)V^__g߁	Jo/EDFúq; 
pr*qל'`3X4ts,M=,;o{]kMH`5cauFlU@eV:û@ck"y}V}4ompqVv~NXg@vZ^`^'p?ťrlQ	l!{vY-\<} ;v~7zuVUOA0axY%ao    IDAT2 p2^
Y41k.\1ڽ_fCغոjZNM'g7}m?h_XLJ|R:D֊3Sq,<pOŻpG`6R N{`&r>O7@~dgÎ]68v0%W3E<wVr}^b.}mF8 g0S^o6R%fXo<DVNw6=fmomZ'  GXmq=زv(v@b:S(#GβYg#CާP|yx?;զ5!ݼ
t*Vo᨞?qԈt	B\<;~lߛ{'7U2Yntњ?Λ	U1f!dW5h:N}fFe~*SZ>>A򋇀4^~9{GpeUUD
@ݎ=:-<V+4nӼ{scR~3a0` [O|Pg)uE
*!Sձb$7Uwx|psߡ}D%+W&کs^؟ۢj/Bt=|a!$i'6*d܌Tu*ŘE]Tayى?$@
=ĬUc'G";JgVl+{2x
;
	ErsHA}MUYճñ*WCd(~ O00$˦
8oCH@y&bz]t>߹u'L=((,l={$lv@,\m	W.wB,O#EJY  "!bqy)|L<!/;UȻop@lɭZfä㡲^gH~v̕ {<%`xtÉ%_>"^+X<æ3LF`_(
VpĩݪGmڍvi6¾zoF_θI^IfN.d,{e1|iᲳ}.Y ֫aN>ǹ08IiXQrFm,3IZEe?bq=syX;+-MJVh+ / ,h mqAb]dA$󭏜%v^v.tPR!,`h<Vm;esT^!KT>KUKp_NdwJ:JDJu"&;[? Ma05;v2omgkzomAy&7YE7lu;a c$aA@,K9HiB
^*XɇzXCQc:8^ȴD N!@ lGG>y`&صWųzuB=kK׶*	XtL.>,#+IS{q`p?i_>tͣP;Φ(kWJ7/EIʀoUy̵dd;rDC^{xU8yN9PR
=ӯgG}n*:(RzDxiQnN0d4zvoj@O7ፏ$~	}2Z<Rjf1;W˝P\E/Dna ZIP|g?sw"c<.=o[4wһ^al֤Y.	KE!fLWއzC]h3-iu͹P%.ar1`#2н]Bp=mᢞ]	Z\	G@E%.?KWw'ų;lƆG%9P+XSP]w=ǽEޗxȜe'xE;U'|N{dsy$?S^VğnL0XqYM#LJ.ʀM[_"y3ҽjڻE8ęz=}ݦI/F7,jKYy+ /bT`% vo~>³hw=IEtlK)4 >#/vV~ayϫYIdT6ͧL*M]7d񶼞gTͪ~jDZFTDdWvm	縒Cذ_ uRUIp4!(`ŉUt{voeiEQ-MYۻNz<EĞ~^mdέfS'Fa%'t۪PRy8]\ giz-`Fmxڪv28{=d, Bjc ~G3/ ̤t?" R,}w<ۣqFˠwǖyN(1@ ˳?3\/ o6dې@#p$?%($vwb:t;Y
ۭz7YTo7ZjBD*JNVM".Ƃ{G'5r^#Up<YgRK#+AI<Ŏwۼ]Fȅ)B;G$ñv./+	p}T+"3LB"+/ۑc4ZgR%Qhd20$0$FKZKܬ.>|h[@Zz<^LnW5c{IQne&ˉiw\'o͚ yEޑ-!?> @}DCClҳ:PUQLUš,Q=!%.as">yyt0]Ԯ"	SSW1y+V H5d&Ӛy|&`l Bk^!^ߑ/@N{:>4{]\[L%5|MITHLzF/_Le䮮x-hpS%"KMd=\zaD.@Q=csݹ>t(ˀvd$j< 3>KX@aϧ otV<qɾ_x0C]$E+^,m_&}cZtdf+$FĬO*"8{gES9\!=R[ BbN&'PlϏ qx`}C۠`^OZ8DZQJ^		gRqBX̨q)wȞ¢w^+"eE*-ђHr}t*;6PO|Gˑ?+zͰ3^1XeyKd;sL
TDր
D :ϐٺM4(%S==ZNVx?8ױҿ.j08Ԡ;4Z!h;e?#+lUIk8Lyt0_zt`R%`j]C׾Shݦk5Or;6e&'NG9q{f58v~3NaΕ bu6iT"'hg0`t1I'iv E)=5My4+y8]zD6$5{żH/)YD+/-\/w7ry1Ĭ!՗;$0Y-=ψIzn<.&&*XHBHH^CH0k3vX(wy5HeTU[J.ɛRu1,Yp/c&UKv"ĶIhKu_/r;o<R	&?)$S$)r"  2rwnc_aD0\>L7'+ڨV" myr;`lL<hiMl<b2A<,}Vћt@U7vay*p/aѳ8o}X]@ ,.U၅x#Nۻ
XPw={s8|\WK uט5h2h**f'0~V 隼^E|3+әLqk}Zuc+qxWAOw9(wwm-n`ŻxxcظYׅlkl{K
xߧ1knKwLb/Y	7В/Ps|5Rj1"
!b`X7NKϦkLzFFVlt"ۉޔ,,+bWl*+J̽Hͪh㕝`u"2r޻f7$/j)AQwЮ[SXm+W N0L@7vX는S+A~=x&NvQzD#wlyvl|^0d/o*xvҮ&7劻m 4$/qۮcq[[G|*c݂Kٻ9"l?xsO|vHyvrۃd6OÇ
(=T@AYrܿAABdɗDgo:>cΘGS,;m ]10CH7/%h/N|tLK]wRUmBH% <ؚ,KqEBO~./otC_v}$l2O#X#]Nf~\o{$qq;''t/Hb*/;)ZWk8V^xU/O"0CАHti 3ѪC3XHqFr"a_( SU[eo~,O7	fU~5)F]d_)v>v'3'2g=DUD7+K-gǳm]`eTg;WTR5+2WufԝJfhkPtA^֑<݋sHKHwD
)-HkFNpzCnixrzRZ(޻ݛPqx`sRgK.Lfv3j֧f·LveMV
)2xMH4)~a!	HrX>R}Tt_۝oE8vjdd8j[=6HݫN>٩BL6`!6C>kL9G&m#Dx#@ߖd ~Ʒ2{$*UM$Ґ,6#9tr5)1n}ˑerh?2Z2RCSy3b/|>Fba:lz'Tux\{3Hqx~t̅{]F
	"d̫p8o=q/Cg;7be%ޱcK0x
mC	r2"<éGh[q]{{)DzJ9eUvHǉgڃ]BE+{+pQVzU\uq%ν϶$:8>ۢ!`2!R-^U{~+K~	b@/-s1Vu϶$#P.Ȑ{_Qd°beoBE!-ɀlJ^xI,lR.	s<sOlK2p:NZN϶(	LOZ$\)Fi%6qk϶$80l$ICFb!Xe`H;p+ѺGoCk'e@6y@Ǻvm &q8yl%Hƻt}}"Q?ABb;պ}Ux*]p74[ƒ8x-
V(+G"XZVyx.Z#*X-HiҵJ_y(BfOvkDa|Ƞ~,<'|U*XoZk)T;u
[WTR%v!HNfZî(MDХ	s`cP:g[O{{߆(ÿ C;@ڎߟo1ƢGв=JIÞ oJ3Hb˅݇lb!9)OEŰRa*ԝoEK#7?]qmQqյd2'*Ze%y,	؀a~yϴ[G{<oC%-å=M4+S`v{gPR
V˰zt\`)AXQPR
V,c)J#pFn-N{}϶ԆAv/eT5A/5GQ 0)/XS&:vY"_~/Mr1 ÆC^l 2,[>?5BJEqlj(s*UÝwv=Pb@(J|1a=P.TmVСC
e$@}EQqXV`x?*waD[>FC)6ƭ$݀kX[5kJ&r+Ol?R^n`Mj*y2%5~NrT Q$`xM*c(4d?PS|DB&1tnCN"زC%h"#Ӱ@}]^i {UǕAuԛUR Fa;4s+5#	o->*1cA>b&>1Uٯ:Įє"F0qR{eggڿf*X~wZt+ݔ
ӫ'Xuz_L
Vj{_])vCEE{YcmTRQvŮWoǮє"|LE9<ڶϷcXK[6Et})Vl< 9AWm?޾l(3.V۶NdulW]-X_0+C}^f+)B_,=|eӒF;n+YkCɡ2ݟ@GbpRoC6miXUVʤJGIJ10WnBh!݊SA.o`w=U)7nz õ_v1;'lڄwM,&)TL>RԼM ;vK<kts7w+|	(Jr2#(A@z?x8B{!o!ޙ4;:;
&NRH8)8s:ұEQ"it_M("Pm@])'XHW3*D~|KQ%wp=GEQ"<M(~(&xȩ4'i(Vȼ8BɑtEQ<@Z cOH+:"(Ĝ>_;&7C r[XEQRc(1Lpu70x^W(JI4\a;v3	%`f+0p%VOk9REiq 5ME>۫(q7ktc1WZVXQ@y8TQASN%vi$*X̓
؏zW4A(sp^-A1X ^*´b`nOZ\mVEQF!ptD:Z(7|!".D'2+Jчh)wEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ{J   OIDATEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEIhlʳ@    IENDB`#!/bin/bash

function build() {
    npm run build || exit 1
}

#   outcome/
# Ensure that we are not reaching any user-specific installs (NodeJS
# etc) and then run
function run_cleanly() {
    export PATH=
    ./dist/mac/pm2-electron-tester.app/Contents/MacOS/pm2-electron-tester
}

function showHelp() {
    cat << EOF
Tester for PM2 replacement.

Run this tester with two parameters:
    1. --pm2: With PM2 (will fail)
    2. --new: With our new & improved PM2 (should succeed)

Failing and suceeding can be seen in the output and the log files.
Refer the 'tester.js' files if you're unsure about anything.

WARNING: Because this rebuild the 'dist' version everytime, it will
be slow

EOF
}

if [ "$1" == "--pm2" ]
then
    cd with-pm2 || exit 1
    build       || exit 1
    run_cleanly
elif [ "$1" == "--new" ]
then
    cd with-new || exit 1
    build       || exit 1
    run_cleanly
else
    showHelp
fi

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Hello World!</title>
  </head>
  <body>
    <h1>Hello World!</h1>
    We are using Node.js <span id="node-version"></span>,
    Chromium <span id="chrome-version"></span>,
    and Electron <span id="electron-version"></span>.

    <!-- You can also require other files to run in this process -->
    <script src="./renderer.js"></script>
  </body>
</html>
{
  "name": "pm2-electron-tester",
  "version": "1.0.0",
  "description": "Tester for PM2 replacement that works with Electron",
  "main": "tester.js",
  "author": "charles.lobo@gmail.com",
  "license": "ISC",
  "devDependencies": {
    "electron": "^15.5.5",
    "electron-builder": "^22.10.5"
  },
  "dependencies": {
    "pm2": "^4.5.5"
  }
}// This file is required by the index.html file and will
// be executed in the renderer process for that window.
#!/bin/bash
npm run build || exit 1
export PATH=
./dist/mac/pm2-electron-tester.app/Contents/MacOS/pm2-electron-tester
'use strict'
// Modules to control application life and create native browser window
const {app, BrowserWindow} = require('electron')
const path = require('path')
const pm2 = require('pm2')

// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
let mainWindow

function createWindow () {
  // Create the browser window.
  mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
  })

  // and load the index.html of the app.
  mainWindow.loadFile('index.html')

  pm2.connect(true, function(err) {
    if (err) {
      console.error(err)
      return
    }

    pm2.start({
      script    : 'index.js',         // Script to be run
      cwd: './process1',
      log: path.join(process.cwd(), 'process1.log'),
    }, function(err, apps) {
      if (err) throw err
      else console.log('Started Process1')
    })
  })

  console.log('Test 999')


  // Open the DevTools.
  // mainWindow.webContents.openDevTools()



  // Emitted when the window is closed.
  mainWindow.on('closed', function () {
    // Dereference the window object, usually you would store windows
    // in an array if your app supports multi windows, this is the time
    // when you should delete the corresponding element.
    mainWindow = null
  })
}

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on('ready', createWindow)

// Quit when all windows are closed.
app.on('window-all-closed', function () {
  // On macOS it is common for applications and their menu bar
  // to stay active until the user quits explicitly with Cmd + Q
  if (process.platform !== 'darwin') app.quit()
})

app.on('activate', function () {
  // On macOS it's common to re-create a window in the app when the
  // dock icon is clicked and there are no other windows open.
  if (mainWindow === null) createWindow()
})

'use strict'
const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World\n');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});
'use strict'
const fs = require('fs')
const proc = require('child_process')

/*      understand/
 * `proc.spawn` creates an `EventEmitter` with the following events:
 *      + 'error': Failed to start the given process
 *      + 'exit': Process exited (fires sometimes)
 *      + 'close': Process exited cleanly
 * `exit` and `close` may both be fired or not.
 *
 *      outcome/
 * We spawn the process and set up the even listeners:
 *      - when we get data, we show them line by line
 *        (stdout and stderror streams)
 *      - on error we dump whatever we have and callback
 *        with the error
 *      - on exit/close we dump whatever we have and call
 *        back based on the return code (error or ok)
 *      - we ensure we don't call back more than once
 */
module.exports = function(cmd, args, cwd, log, cb, env, pfx_) {
    let child
    if(env) child = proc.fork(cmd, args, { cwd: cwd, env: env, silent: true, detached: false })
    else child = proc.fork(cmd, args, { cwd: cwd, silent: true, detached: false })

  process.on('exit', () => child.kill())

    let op = ""
    let er = ""
    child.stdout.on('data', (data) => {
        op += data
        op = show_lines_1(op)
    })
    child.stderr.on('data', (data) => {
        er += data
        er = show_lines_1(er)
    })

    child.on('error', (err) => {
        call_back_with(err)
    })
    child.on('exit', on_done_1)
    child.on('close', on_done_1)

    function out(m) {
        fs.appendFile(log, m + '\n', (err) => {
            if(err) {
                console.error(m)
                console.error(err)
            }
        })
    }

    function on_done_1(code, signal) {
        if(code || signal) call_back_with(`Exited with error: ${cwd}/${cmd} ${args}`)
        else call_back_with()
    }

    let cb_done = false
    function call_back_with(err) {
        dump_full_stream_1()

        if(cb_done) return
        cb_done = true

        cb(err)
    }

    function show_lines_1(f) {
        if(!f) return f

        let lines = f.split(/[\n\r]+/)
        for(let i = 0;i < lines.length-1;i++) {
            out(pfx(lines[i]))
        }
        return lines[lines.length-1]
    }

    function dump_full_stream_1() {
        if(op && op.trim()) out(pfx(op.trim()))
        if(er && er.trim()) out(pfx(er.trim()))
        op = ""
        er = ""
    }

    function pfx(v) {
        if(pfx_) return pfx_ + ":" + v
        else return v
    }
}
'use strict'
const fs = require('fs')
const proc = require('child_process')

/*      understand/
 * `proc.spawn` creates an `EventEmitter` with the following events:
 *      + 'error': Failed to start the given process
 *      + 'exit': Process exited (fires sometimes)
 *      + 'close': Process exited cleanly
 * `exit` and `close` may both be fired or not.
 *
 *      outcome/
 * We spawn the process and set up the even listeners:
 *      - when we get data, we show them line by line
 *        (stdout and stderror streams)
 *      - on error we dump whatever we have and callback
 *        with the error
 *      - on exit/close we dump whatever we have and call
 *        back based on the return code (error or ok)
 *      - we ensure we don't call back more than once
 */
module.exports = function(cmd, args, cwd, log, cb, env, pfx_) {
    let child
    if(env) child = proc.spawn(cmd, args, { cwd: cwd, env: env, windowsHide: true })
    else child = proc.spawn(cmd, args, { cwd: cwd, windowsHide: true })

    let op = ""
    let er = ""
    child.stdout.on('data', (data) => {
        op += data
        op = show_lines_1(op)
    })
    child.stderr.on('data', (data) => {
        er += data
        er = show_lines_1(er)
    })

    child.on('error', (err) => {
        call_back_with(err)
    })
    child.on('exit', on_done_1)
    child.on('close', on_done_1)

    function out(m) {
        fs.appendFile(log, m + '\n', (err) => {
            if(err) {
                console.error(m)
                console.error(err)
            }
        })
    }

    function on_done_1(code, signal) {
        if(code || signal) call_back_with(`Exited with error: ${cmd} ${args}`)
        else call_back_with()
    }

    let cb_done = false
    function call_back_with(err) {
        dump_full_stream_1()

        if(cb_done) return
        cb_done = true

        cb(err)
    }

    function show_lines_1(f) {
        if(!f) return f

        let lines = f.split(/[\n\r]+/)
        for(let i = 0;i < lines.length-1;i++) {
            out(pfx(lines[i]))
        }
        return lines[lines.length-1]
    }

    function dump_full_stream_1() {
        if(op && op.trim()) out(pfx(op.trim()))
        if(er && er.trim()) out(pfx(er.trim()))
        op = ""
        er = ""
    }

    function pfx(v) {
        if(pfx_) return pfx_ + ":" + v
        else return v
    }
}
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Hello World!</title>
  </head>
  <body>
    <h1>Hello World!</h1>
    We are using Node.js <span id="node-version"></span>,
    Chromium <span id="chrome-version"></span>,
    and Electron <span id="electron-version"></span>.

    <!-- You can also require other files to run in this process -->
    <script src="./renderer.js"></script>
  </body>
</html>
{
  "name": "pm2-electron-tester",
  "version": "1.0.0",
  "description": "Tester for PM2 replacement that works with Electron",
  "main": "tester.js",
  "author": "charles.lobo@gmail.com",
  "license": "ISC",
  "devDependencies": {
    "electron": "^15.5.5",
    "electron-builder": "^22.10.5"
  }
}// This file is required by the index.html file and will
// be executed in the renderer process for that window.
'use strict'
// Modules to control application life and create native browser window
const {app, BrowserWindow} = require('electron')
const path = require('path')
const pm2 = require('./exec.js')
const pm22 = require('./exec2.js')

// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
let mainWindow

function createWindow () {
  // Create the browser window.
  mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
  })

  // and load the index.html of the app.
  mainWindow.loadFile('index.html')

  pm2('index.js', [], './process1', 'process1.log', (err) => {
    if(err) console.error(err)
    else console.log('Started process1...')
  })

  let p2 = "./process1/process2"
  if(process.mainModule.filename.indexOf('app.asar') !== -1) {
    p2 = path.join(__dirname, '..', 'app.asar.unpacked', 'process1', 'process2')
  }
  pm22('/usr/local/bin/python', ['serve.py'], p2, 'process2.log', (err) => {
    if(err) console.error(err)
    else console.log('Started process2...')
  })

  // Open the DevTools.
  // mainWindow.webContents.openDevTools()



  // Emitted when the window is closed.
  mainWindow.on('closed', function () {
    // Dereference the window object, usually you would store windows
    // in an array if your app supports multi windows, this is the time
    // when you should delete the corresponding element.
    mainWindow = null
  })
}

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on('ready', createWindow)

// Quit when all windows are closed.
app.on('window-all-closed', function () {
  // On macOS it is common for applications and their menu bar
  // to stay active until the user quits explicitly with Cmd + Q
  if (process.platform !== 'darwin') app.quit()
})

app.on('activate', function () {
  // On macOS it's common to re-create a window in the app when the
  // dock icon is clicked and there are no other windows open.
  if (mainWindow === null) createWindow()
})

'use strict'

const val = process.env.ENV_VAL
if(!val) console.log('FAILED FINDING ENVIRONMENT VALUE')
else console.log(`ENV_VAL = ${val}`)

setTimeout(() => 1, 1 << 111)
import os
import time
import sys

val = os.environ.get('ENV_VAL')
if val == None:
    print('FAILED FINDING ENVIRONMENT VALUE')
else:
    print('ENV_VAL = ' + val)

sys.stdout.flush()
time.sleep(60 * 5000)
'use strict'
const http = require('http')
const pm2 = require('../../../')

const hostname = '127.0.0.1'
const port = 3000

const server = http.createServer((req, res) => {
  res.statusCode = 200
  res.setHeader('Content-Type', 'text/plain')
  res.end('Hello World\n')
})

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`)
})

pm2.onstopping(() => {
    console.log('Shutting down')
    server.close()
})
{
  "name": "process1",
  "version": "1.0.0",
  "description": "Test Process for pm2 launcher",
  "main": "index.js",
  "author": "",
  "license": "ISC"
}import BaseHTTPServer
import sys

def run(server_class=BaseHTTPServer.HTTPServer,
        handler_class=BaseHTTPServer.BaseHTTPRequestHandler):
    server_address = ('', 3131)
    httpd = server_class(server_address, handler_class)
    print('Starting server at 3131')
    sys.stdout.flush()
    httpd.serve_forever()


run()
The MIT License (MIT)

Copyright © 2020-2022 Michael Garvin

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'

const { promisify } = require('util')

const handler = {
  get: function (target, prop, receiver) {
    if (typeof target[prop] !== 'function') {
      return target[prop]
    }
    if (target[prop][promisify.custom]) {
      return function () {
        return Reflect.get(target, prop, receiver)[promisify.custom].apply(target, arguments)
      }
    }
    return function () {
      return new Promise((resolve, reject) => {
        Reflect.get(target, prop, receiver).apply(target, [...arguments, function (err, result) {
          if (err) {
            return reject(err)
          }
          resolve(result)
        }])
      })
    }
  }
}

module.exports = function (thingToPromisify) {
  if (typeof thingToPromisify === 'function') {
    return promisify(thingToPromisify)
  }
  if (typeof thingToPromisify === 'object') {
    return new Proxy(thingToPromisify, handler)
  }
  throw new TypeError('Can only promisify functions or objects')
}
{
  "name": "@gar/promisify",
  "version": "1.1.3",
  "description": "Promisify an entire class or object",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "https://github.com/wraithgar/gar-promisify.git"
  },
  "files": [
    "index.js"
  ],
  "author": "Gar <gar+npm@danger.computer>",
  "license": "MIT",
  "devDependencies": {
    "@hapi/code": "^8.0.1",
    "@hapi/lab": "^24.1.0",
    "standard": "^16.0.3"
  }
}BSD License

For js-joda software

Copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 
All rights reserved.
 
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.
 
 * Neither the name of js-joda nor the names of its contributors
   may 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 OWNER 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.

{
  "name": "@js-joda/core",
  "version": "5.2.0",
  "description": "a date and time library for javascript",
  "repository": {
    "type": "git",
    "url": "https://github.com/js-joda/js-joda.git"
  },
  "author": "pithu",
  "homepage": "https://js-joda.github.io/js-joda",
  "license": "BSD-3-Clause",
  "main": "dist/js-joda.js",
  "module": "dist/js-joda.esm.js",
  "typings": "typings/js-joda.d.ts",
  "files": [
    "dist",
    "src",
    "typings",
    "CHANGELOG.md",
    "README.md"
  ]
}/**
 * Flowtype definitions for js-joda
 * Generated by Flowgen from a Typescript Definition
 * Flowgen v1.2.0
 * Author: [Joar Wilk](http://twitter.com/joarwilk)
 * Repo: http://github.com/joarwilk/flowgen
 */

declare module "js-joda" {
    declare class TemporalAccessor {
        get(field: TemporalField): number;
        query(query: TemporalQuery): any;
        range(field: TemporalField): ValueRange
    }

    declare class Temporal mixins TemporalAccessor {
    }

    declare class Clock {
        fixed(fixedInstant: Instant, zoneOffset: ZoneOffset): Clock;
        system(zone: ZoneId): Clock;
        systemDefaultZone(): Clock;
        systemUTC(): Clock;
        instant(): Instant;
        millis(): number;
        zone(): any
    }

    declare class DayOfWeek mixins Temporal {
        MONDAY: DayOfWeek;
        TUESDAY: DayOfWeek;
        WEDNESDAY: DayOfWeek;
        THURSDAY: DayOfWeek;
        FRIDAY: DayOfWeek;
        SATURDAY: DayOfWeek;
        SUNDAY: DayOfWeek;
        from(temporal: TemporalAccessor): DayOfWeek; of(dayOfWeek: number): DayOfWeek;
        valueOf(name: string): DayOfWeek;
        values(): DayOfWeek[];
        adjustInto(temporal: TemporalAdjuster): this;
        equals(other: any): boolean;
        getDisplayName(style: TextStyle, locale: Locale): string;
        getLong(field: TemporalField): number;
        isSupported(field: TemporalField): boolean;
        minus(days: number): DayOfWeek;
        name(): string;
        ordinal(): number;
        plus(days: number): DayOfWeek;
        toString(): string;
        value(): number
    }

    declare class TemporalAmount {
        addTo<T>(temporal: T): T;
        get(unit: TemporalUnit): number;
        units(): TemporalUnit[];
        subtractFrom<T>(temporal: T): T
    }

    declare class Duration mixins TemporalAmount {
        ZERO: Duration;
        between(startInclusive: Temporal, endExclusive: Temporal): Duration;
        from(amount: TemporalAmount): Duration; of(amount: number, unit: TemporalUnit): Duration;
        ofDays(days: number): Duration;
        ofHours(hours: number): Duration;
        ofMillis(millis: number): Duration;
        ofMinutes(minutes: number): Duration;
        ofNanos(nanos: number): Duration;
        ofSeconds(seconds: number): Duration;
        parse(text: string): Duration;
        abs(): Duration;
        addTo<T>(temporal: T): T;
        compareTo(otherDuration: Duration): number;
        dividedBy(divisor: number): Duration;
        equals(otherDuration: any): boolean;
        get(unit: TemporalUnit): number;
        isNegative(): boolean;
        isZero(): boolean;
        minus(durationOrNumber: Duration | number, unit: ChronoUnit): Duration;
        minusAmountUnit(amountToSubtract: number, unit: TemporalUnit): Duration;
        minusDays(daysToSubtract: number): Duration;
        minusDuration(duration: Duration): Duration;
        minusHours(hoursToSubtract: number): Duration;
        minusMillis(millisToSubtract: number): Duration;
        minusMinutes(minutesToSubtract: number): Duration;
        minusNanos(nanosToSubtract: number): Duration;
        minusSeconds(secondsToSubtract: number): Duration;
        multipliedBy(multiplicand: number): Duration;
        nano(): number;
        negated(): Duration;
        plus(
            durationOrNumber: Duration | number,
            unitOrNumber: TemporalUnit | number): Duration;
        plusAmountUnit(amountToAdd: number, unit: TemporalUnit): Duration;
        plusDays(daysToAdd: number): Duration;
        plusDuration(duration: Duration): Duration;
        plusHours(hoursToAdd: number): Duration;
        plusMillis(millisToAdd: number): Duration;
        plusMinutes(minutesToAdd: number): Duration;
        plusNanos(nanosToAdd: number): Duration;
        plusSeconds(secondsToAdd: number): Duration;
        plusSecondsNanos(secondsToAdd: number, nanosToAdd: number): Duration;
        seconds(): number;
        subtractFrom<T>(temporal: T): T;
        toDays(): number;
        toHours(): number;
        toJSON(): string;
        toMillis(): number;
        toMinutes(): number;
        toNanos(): number;
        toString(): string;
        units(): any;
        withNanos(nanoOfSecond: number): Duration;
        withSeconds(seconds: number): Duration
    }

    declare class Instant mixins Temporal {
        EPOCH: Instant;
        MIN: Instant;
        MAX: Instant;
        MIN_SECONDS: Instant;
        MAX_SECONDS: Instant;
        from(temporal: TemporalAccessor): Instant;
        now(clock?: Clock): Instant;
        ofEpochMilli(epochMilli: number): Instant;
        ofEpochSecond(epochSecond: number, nanoAdjustment?: number): Instant;
        parse(text: string): Instant;
        adjustInto(temporal: Temporal): Temporal;
        compareTo(otherInstant: Instant): number;
        epochSecond(): number;
        equals(otherInstant: any): boolean;
        get(field: TemporalField): number;
        getLong(field: TemporalField): number;
        hashCode(): number;
        isAfter(otherInstant: Instant): boolean;
        isBefore(otherInstant: Instant): boolean;
        isSupported(fieldOrUnit: TemporalField | TemporalUnit): boolean;
        minus(amount: TemporalAmount): Instant;
        minus(amountToSubtract: number, unit: TemporalUnit): Instant;
        minusMillis(millisToSubtract: number): Instant;
        minusNanos(nanosToSubtract: number): Instant;
        minusSeconds(secondsToSubtract: number): Instant;
        nano(): number;
        plus(amount: TemporalAmount): Instant;
        plus(amountToAdd: number, unit: TemporalUnit): Instant;
        plusMillis(millisToAdd: number): Instant;
        plusNanos(nanosToAdd: number): Instant;
        plusSeconds(secondsToAdd: number): Instant;
        query(query: TemporalQuery): any;
        range(field: TemporalField): ValueRange;
        toEpochMilli(): number;
        toString(): string;
        truncatedTo(unit: TemporalUnit): Instant;
        until(endExclusive: Temporal, unit: TemporalUnit): number;
        with(adjuster: TemporalAdjuster): Instant;
        with(field: TemporalField, newValue: number): Instant;
        withTemporalAdjuster(adjuster: TemporalAdjuster): Instant
    }

    declare class ResolverStyle {
        STRICT: ResolverStyle;
        SMART: ResolverStyle;
        LENIENT: ResolverStyle
    }

    declare class DateTimeFormatter {
        ISO_LOCAL_DATE: DateTimeFormatter;
        ISO_LOCAL_TIME: DateTimeFormatter;
        ISO_LOCAL_DATE_TIME: DateTimeFormatter;
        ISO_INSTANT: DateTimeFormatter;
        ISO_OFFSET_DATE_TIME: DateTimeFormatter;
        ISO_ZONED_DATE_TIME: DateTimeFormatter;
        ofPattern(pattern: string): DateTimeFormatter;
        parsedExcessDays(): TemporalQuery;
        parsedLeapSecond(): boolean;
        chronology(): any;
        decimalStyle(): any;
        format(temporal: TemporalAccessor): string;
        locale(): any;
        parse(text: string, type: TemporalQuery): TemporalAccessor;
        parse1(text: string): TemporalAccessor;
        parse2(text: any, type: any): any;
        parseUnresolved(text: any, position: any): any;
        toString(): string;
        withChronology(chrono: any): any;
        withLocale(locale: Locale): DateTimeFormatter;
        withResolverStyle(resolverStyle: ResolverStyle): DateTimeFormatter
    }

    declare class DateTimeFormatterBuilder {
        constructor(): this;
        append(formatter: DateTimeFormatter): DateTimeFormatterBuilder;
        appendFraction(
            field: TemporalField,
            minWidth: number,
            maxWidth: number,
            decimalPoint: boolean): DateTimeFormatterBuilder;
        appendInstant(fractionalDigits: number): DateTimeFormatterBuilder;
        appendLiteral(literal: any): DateTimeFormatterBuilder;
        appendOffset(pattern: string, noOffsetText: string): DateTimeFormatterBuilder;
        appendOffsetId(): DateTimeFormatterBuilder;
        appendPattern(pattern: string): DateTimeFormatterBuilder;
        appendValue(): DateTimeFormatterBuilder;
        appendValueReduced(): DateTimeFormatterBuilder;
        appendZoneId(): DateTimeFormatterBuilder;
        optionalEnd(): DateTimeFormatterBuilder;
        optionalStart(): DateTimeFormatterBuilder;
        padNext(): DateTimeFormatterBuilder;
        parseCaseInsensitive(): DateTimeFormatterBuilder;
        parseCaseSensitive(): DateTimeFormatterBuilder;
        parseLenient(): DateTimeFormatterBuilder;
        parseStrict(): DateTimeFormatterBuilder;
        toFormatter(resolverStyle: ResolverStyle): DateTimeFormatter
    }

    declare class Chronology {
    }

    declare class LocalTime mixins Temporal {
        MIN: LocalTime;
        MAX: LocalTime;
        MIDNIGHT: LocalTime;
        NOON: LocalTime;
        HOURS_PER_DAY: number;
        MINUTES_PER_HOUR: number;
        MINUTES_PER_DAY: number;
        SECONDS_PER_MINUTE: number;
        SECONDS_PER_HOUR: number;
        SECONDS_PER_DAY: number;
        MILLIS_PER_DAY: number;
        MICROS_PER_DAY: number;
        NANOS_PER_SECOND: number;
        NANOS_PER_MINUTE: number;
        NANOS_PER_HOUR: number;
        NANOS_PER_DAY: number;
        from(temporal: TemporalAccessor): LocalTime;
        now(clockOrZone?: Clock | ZoneId): LocalTime; of(
            hour?: number,
            minute?: number,
            second?: number,
            nanoOfSecond?: number): LocalTime;
        ofInstant(instant: Instant, zone?: ZoneId): LocalTime;
        ofNanoOfDay(nanoOfDay: number): LocalTime;
        ofSecondOfDay(secondOfDay?: number, nanoOfSecond?: number): LocalTime;
        parse(text: String, formatter?: DateTimeFormatter): LocalTime;
        adjustInto(temporal: TemporalAdjuster): Temporal;
        atDate(date: LocalDate): LocalDateTime;
        compareTo(other: LocalTime): number;
        equals(other: any): boolean;
        format(formatter: DateTimeFormatter): string;
        get(field: ChronoField): number;
        getLong(field: ChronoField): number;
        hashCode(): number;
        hour(): number;
        isAfter(other: LocalTime): boolean;
        isBefore(other: LocalTime): boolean;
        isSupported(fieldOrUnit: ChronoField | ChronoUnit): boolean;
        minus(amount: TemporalAmount): LocalTime;
        minus(amountToSubtract: number, unit: ChronoUnit): LocalTime;
        minusHours(hoursToSubtract: number): LocalTime;
        minusMinutes(minutesToSubtract: number): LocalTime;
        minusNanos(nanosToSubtract: number): LocalTime;
        minusSeconds(secondsToSubtract: number): LocalTime;
        minute(): number;
        nano(): number;
        plus(amount: TemporalAmount): LocalTime;
        plus(amountToAdd: number, unit: TemporalUnit): LocalTime;
        plusHours(hoursToAdd: number): LocalTime;
        plusMinutes(minutesToAdd: number): LocalTime;
        plusNanos(nanosToAdd: number): LocalTime;
        plusSeconds(secondstoAdd: number): LocalTime;
        query(query: TemporalQuery): any;
        range(field: ChronoField): ValueRange;
        second(): number;
        toJSON(): string;
        toNanoOfDay(): number;
        toSecondOfDay(): number;
        toString(): string;
        truncatedTo(unit: ChronoUnit): LocalTime;
        until(endExclusive: TemporalAccessor, unit: TemporalUnit): number;
        with(adjuster: TemporalAdjuster): LocalTime;
        with(field: TemporalField, newValue: number): LocalTime;
        withHour(hour: number): LocalTime;
        withMinute(minute: number): LocalTime;
        withNano(nanoOfSecond: number): LocalTime;
        withSecond(second: number): LocalTime;
        withTemporalAdjuster(adjuster: TemporalAdjuster): LocalTime
    }

    declare class MathUtil {
        compareNumbers(a: number, b: number): number;
        floorDiv(x: number, y: number): number;
        floorMod(x: number, y: number): number;
        intDiv(x: number, y: number): number;
        intMod(x: number, y: number): number;
        parseInt(value: number): number;
        roundDown(r: number): number;
        safeAdd(x: number, y: number): number;
        safeMultiply(x: number, y: number): number;
        safeSubtract(x: number, y: number): number;
        safeToInt(value: number): number;
        safeZero(value: number): number;
        verifyInt(value: number): void
    }

    declare class Month mixins Temporal {
        JANUARY: Month;
        FEBRUARY: Month;
        MARCH: Month;
        APRIL: Month;
        MAY: Month;
        JUNE: Month;
        JULY: Month;
        AUGUST: Month;
        SEPTEMBER: Month;
        OCTOBER: Month;
        NOVEMBER: Month;
        DECEMBER: Month;
        from(temporal: TemporalAccessor): Month; of(month: number): Month;
        values(): Month[];
        adjustInto(temporal: Temporal): Temporal;
        firstDayOfYear(leapYear: boolean): number;
        firstMonthOfQuarter(): Month;
        get(field: TemporalField): number;
        getDisplayName(style: TextStyle, locale: Locale): string;
        getLong(field: TemporalField): number;
        isSupported(field: TemporalField): boolean;
        length(leapYear: boolean): number;
        maxLength(): number;
        minLength(): number;
        minus(months: number): Month;
        plus(months: number): Month;
        query(query: TemporalQuery): any;
        toString(): string;
        value(): number
    }

    declare class MonthDay mixins Temporal {
        from(temporal: TemporalAccessor): MonthDay;
        now(arg1?: ZoneId | Clock): MonthDay; of(monthOrNumber: Month | number, number?: number): MonthDay;
        ofMonthNumber(month: Month, dayOfMonth: number): MonthDay;
        ofNumberNumber(month: number, dayOfMonth: number): MonthDay;
        parse(text: string, formatter?: DateTimeFormatter): MonthDay;
        parseString(text: string): MonthDay;
        parseStringFormatter(text: string, formatter: DateTimeFormatter): MonthDay;
        adjustInto(temporal: Temporal): Temporal;
        atYear(year: number): LocalDate;
        compareTo(other: MonthDay): number;
        dayOfMonth(): number;
        equals(obj: any): boolean;
        format(formatter: DateTimeFormatter): string;
        get(field: TemporalField): number;
        getLong(field: TemporalField): number;
        isAfter(other: MonthDay): boolean;
        isBefore(other: MonthDay): boolean;
        isSupported(field: TemporalField): boolean;
        isValidYear(year: number): boolean;
        month(): Month;
        monthValue(): number;
        query(query: TemporalQuery): any;
        range(field: TemporalField): ValueRange;
        toString(): string;
        with(month: Month): MonthDay;
        withDayOfMonth(dayOfMonth: number): MonthDay;
        withMonth(month: number): MonthDay
    }

    declare interface TemporalField {
    }

    declare class ChronoField {
        NANO_OF_SECOND: ChronoField;
        NANO_OF_DAY: ChronoField;
        MICRO_OF_SECOND: ChronoField;
        MICRO_OF_DAY: ChronoField;
        MILLI_OF_SECOND: ChronoField;
        MILLI_OF_DAY: ChronoField;
        SECOND_OF_MINUTE: ChronoField;
        SECOND_OF_DAY: ChronoField;
        MINUTE_OF_HOUR: ChronoField;
        MINUTE_OF_DAY: ChronoField;
        HOUR_OF_AMPM: ChronoField;
        CLOCK_HOUR_OF_AMPM: ChronoField;
        HOUR_OF_DAY: ChronoField;
        CLOCK_HOUR_OF_DAY: ChronoField;
        AMPM_OF_DAY: ChronoField;
        DAY_OF_WEEK: ChronoField;
        ALIGNED_DAY_OF_WEEK_IN_MONTH: ChronoField;
        ALIGNED_DAY_OF_WEEK_IN_YEAR: ChronoField;
        DAY_OF_MONTH: ChronoField;
        DAY_OF_YEAR: ChronoField;
        EPOCH_DAY: ChronoField;
        ALIGNED_WEEK_OF_MONTH: ChronoField;
        ALIGNED_WEEK_OF_YEAR: ChronoField;
        MONTH_OF_YEAR: ChronoField;
        PROLEPTIC_MONTH: ChronoField;
        YEAR_OF_ERA: ChronoField;
        YEAR: ChronoField;
        ERA: ChronoField;
        INSTANT_SECONDS: ChronoField;
        OFFSET_SECONDS: ChronoField;
        baseUnit(): number;
        checkValidIntValue(value: number): number;
        checkValidValue(value: number): any;
        displayName(): string;
        equals(other: any): boolean;
        getFrom(temporal: TemporalAccessor): number;
        isDateBased(): boolean;
        isTimeBased(): boolean;
        name(): string;
        range(): ValueRange;
        rangeRefinedBy(temporal: TemporalAccessor): ValueRange;
        rangeUnit(): number;
        toString(): string
    }

    declare class TemporalUnit {
        addTo<T>(temporal: T, amount: number): T;
        between(temporal1: Temporal, temporal2: Temporal): number;
        duration(): Duration;
        isDateBased(): boolean;
        isDurationEstimated(): boolean;
        isSupportedBy(temporal: Temporal): boolean;
        isTimeBased(): boolean
    }

    declare class ChronoUnit mixins TemporalUnit {
        MICROS: ChronoUnit;
        MILLIS: ChronoUnit;
        SECONDS: ChronoUnit;
        MINUTES: ChronoUnit;
        HOURS: ChronoUnit;
        HALF_DAYS: ChronoUnit;
        DAYS: ChronoUnit;
        WEEKS: ChronoUnit;
        MONTHS: ChronoUnit;
        YEARS: ChronoUnit;
        DECADES: ChronoUnit;
        CENTURIES: ChronoUnit;
        MILLENNIA: ChronoUnit;
        ERAS: ChronoUnit;
        FOREVER: ChronoUnit;
        addTo<T>(temporal: T, amount: number): T;
        between(temporal1: Temporal, temporal2: Temporal): number;
        compareTo(other: TemporalUnit): number;
        duration(): Duration;
        isDateBased(): boolean;
        isDurationEstimated(): boolean;
        isSupportedBy(temporal: Temporal): boolean;
        isTimeBased(): boolean;
        toString(): string
    }

    declare class IsoFields {
        DAY_OF_QUARTER: IsoFields;
        QUARTER_OF_YEAR: IsoFields;
        WEEK_OF_WEEK_BASED_YEAR: IsoFields;
        WEEK_BASED_YEAR: IsoFields;
        WEEK_BASED_YEARS: IsoFields;
        QUARTER_YEARS: IsoFields
    }

    declare class ChronoLocalDate mixins Temporal {
        adjustInto(temporal: TemporalAdjuster): this;
        format(formatter: DateTimeFormatter): string;
        isSupported(fieldOrUnit: TemporalField | TemporalUnit): boolean
    }

    declare class LocalDate mixins ChronoLocalDate {
        MIN: LocalDate;
        MAX: LocalDate;
        EPOCH_0: LocalDate;
        from(temporal: TemporalAccessor): LocalDate;
        now(clockOrZone?: Clock | ZoneId): LocalDate; of(year: number, month: Month | number, dayOfMonth: number): LocalDate;
        ofEpochDay(epochDay: number): LocalDate;
        ofInstant(instant: Instant, zoneId?: ZoneId): LocalDate;
        ofYearDay(year: number, dayOfYear: number): LocalDate;
        parse(text: string, formatter?: DateTimeFormatter): LocalDate;
        atStartOfDay(): LocalDateTime;
        atStartOfDay(zone: ZoneId): ZonedDateTime;
        atStartOfDayWithZone(zone: ZoneId): ZonedDateTime;
        atTime(time: LocalTime): LocalDateTime;
        atTime(
            hour: number,
            minute: number,
            second?: number,
            nanoOfSecond?: number): LocalDateTime;
        chronology(): Chronology;
        compareTo(other: LocalDate): number;
        dayOfMonth(): number;
        dayOfWeek(): DayOfWeek;
        dayOfYear(): number;
        equals(otherDate: any): boolean;
        get(field: TemporalField): number;
        getLong(field: TemporalField): number;
        hashCode(): number;
        isAfter(other: LocalDate): boolean;
        isBefore(other: LocalDate): boolean;
        isEqual(other: LocalDate): boolean;
        isLeapYear(): boolean;
        isoWeekOfWeekyear(): number;
        isoWeekyear(): number;
        lengthOfMonth(): number;
        lengthOfYear(): number;
        minus(amount: TemporalAmount): LocalDate;
        minus(amountToSubtract: number, unit: TemporalUnit): LocalDate;
        minusDays(daysToSubtract: number): LocalDate;
        minusMonths(monthsToSubtract: number): LocalDate;
        minusWeeks(weeksToSubtract: number): LocalDate;
        minusYears(yearsToSubtract: number): LocalDate;
        month(): Month;
        monthValue(): number;
        plus(amount: TemporalAmount): LocalDate;
        plus(amountToAdd: number, unit: TemporalUnit): LocalDate;
        plusDays(daysToAdd: number): LocalDate;
        plusMonths(monthsToAdd: number): LocalDate;
        plusWeeks(weeksToAdd: number): LocalDate;
        plusYears(yearsToAdd: number): LocalDate;
        query(query: TemporalQuery): any;
        range(field: TemporalField): ValueRange;
        toEpochDay(): number;
        toJSON(): string;
        toString(): string;
        until(endDate: TemporalAccessor): Period;
        until(endExclusive: TemporalAccessor, unit: TemporalUnit): number;
        with(fieldOrAdjuster: TemporalField, newValue: Number): LocalDate;
        with(adjuster: TemporalAdjuster): LocalDate;
        withDayOfMonth(dayOfMonth: number): LocalDate;
        withDayOfYear(dayOfYear: number): LocalDate;
        withFieldAndValue(field: TemporalField, newValue: number): LocalDate;
        withMonth(month: Month | number): LocalDate;
        withTemporalAdjuster(adjuster: TemporalAdjuster): LocalDate;
        withYear(year: number): LocalDate;
        year(): number
    }

    declare class ChronoLocalDateTime mixins Temporal {
        adjustInto(temporal: any): any;
        chronology(): Chronology;
        toEpochSecond(offset: ZoneOffset): number;
        toInstant(offset: ZoneOffset): Instant
    }

    declare class LocalDateTime mixins ChronoLocalDateTime {
        MIN: LocalDateTime;
        MAX: LocalDateTime;
        from(temporal: TemporalAccessor): LocalDateTime;
        now(clockOrZone?: Clock | ZoneId): LocalDateTime; of(date: LocalDate, time: LocalTime): LocalDateTime; of(
            year?: number,
            month?: Month | number,
            dayOfMonth?: number,
            hour?: number,
            minute?: number,
            second?: number,
            nanoSecond?: number): LocalDateTime;
        ofEpochSecond(epochSecond: number, offset: ZoneOffset): LocalDateTime;
        ofEpochSecond(epochSecond: number, nanoOfSecond: number, offset: ZoneOffset): LocalDateTime;
        ofInstant(instant: Instant, zoneId?: ZoneId): LocalDateTime;
        parse(text: string, formatter?: DateTimeFormatter): LocalDateTime;
        adjustInto(temporal: TemporalAdjuster): LocalDateTime;
        atZone(zone: ZoneId): ZonedDateTime;
        compareTo(other: LocalDateTime): number;
        dayOfMonth(): number;
        dayOfWeek(): DayOfWeek;
        dayOfYear(): number;
        equals(other: any): boolean;
        format(formatter: DateTimeFormatter): string;
        get(field: TemporalField): number;
        getLong(field: TemporalField): number;
        hashCode(): number;
        hour(): number;
        isAfter(other: LocalDateTime): boolean;
        isBefore(other: LocalDateTime): boolean;
        isEqual(other: any): boolean;
        isSupported(fieldOrUnit: TemporalField | TemporalUnit): boolean;
        minus(amount: TemporalAmount): LocalDateTime;
        minus(amountToSubtract: number, unit: TemporalUnit): LocalDateTime;
        minusDays(days: number): LocalDateTime;
        minusHours(hours: number): LocalDateTime;
        minusMinutes(minutes: number): LocalDateTime;
        minusMonths(months: number): LocalDateTime;
        minusNanos(nanos: number): LocalDateTime;
        minusSeconds(seconds: number): LocalDateTime;
        minusTemporalAmount(amount: TemporalAmount): LocalDateTime;
        minusWeeks(weeks: number): LocalDateTime;
        minusYears(years: number): LocalDateTime;
        minute(): number;
        month(): Month;
        monthValue(): number;
        nano(): number;
        plus(amount: TemporalAmount): LocalDateTime;
        plus(amountToAdd: number, unit: TemporalUnit): LocalDateTime;
        plusDays(days: number): LocalDateTime;
        plusHours(hours: number): LocalDateTime;
        plusMinutes(minutes: number): LocalDateTime;
        plusMonths(months: number): LocalDateTime;
        plusNanos(nanos: number): LocalDateTime;
        plusSeconds(seconds: number): LocalDateTime;
        plusTemporalAmount(amount: TemporalAmount): LocalDateTime;
        plusWeeks(weeks: number): LocalDateTime;
        plusYears(years: number): LocalDateTime;
        query(query: TemporalQuery): any;
        range(field: TemporalField): ValueRange;
        second(): number;
        toJSON(): string;
        toLocalDate(): LocalDate;
        toLocalTime(): LocalTime;
        toString(): string;
        truncatedTo(unit: TemporalUnit): LocalDateTime;
        until(endExclusive: Temporal, unit: TemporalUnit): number;
        with(adjuster: TemporalAdjuster): LocalDateTime;
        with(field: TemporalField, newValue: number): LocalDateTime;
        withDayOfMonth(dayOfMonth: number): LocalDateTime;
        withDayOfYear(dayOfYear: number): LocalDateTime;
        withHour(hour: number): LocalDateTime;
        withMinute(minute: number): LocalDateTime;
        withMonth(month: number | Month): LocalDateTime;
        withNano(nanoOfSecond: number): LocalDateTime;
        withSecond(second: number): LocalDateTime;
        withTemporalAdjuster(adjuster: TemporalAdjuster): LocalDateTime;
        withYear(year: number): LocalDateTime;
        year(): number
    }

    declare class OffsetDateTime {
    }

    declare class Period mixins TemporalAmount {
        ZERO: Period;
        between(startDate: LocalDate, endDate: LocalDate): Period;
        create(years: number, months: number, days: number): Duration;
        from(amount: TemporalAmount): Period; of(years: number, months: number, days: number): Period;
        ofDays(days: number): Period;
        ofMonths(months: number): Period;
        ofWeeks(weeks: number): Period;
        ofYears(years: number): Period;
        parse(text: string): Period;
        addTo<T>(temporal: T): T;
        chronology(): IsoChronology;
        days(): number;
        equals(obj: any): boolean;
        get(unit: TemporalUnit): number;
        hashCode(): number;
        isNegative(): boolean;
        isZero(): boolean;
        minus(amountToSubtract: TemporalAmount): Period;
        minusDays(daysToSubtract: number): Period;
        minusMonths(monthsToSubtract: number): Period;
        minusYears(yearsToSubtract: number): Period;
        months(): number;
        multipliedBy(scalar: number): Period;
        negated(): Period;
        normalized(): Period;
        plus(amountToAdd: TemporalAmount): Period;
        plusDays(daysToAdd: number): Period;
        plusMonths(monthsToAdd: number): Period;
        plusYears(yearsToAdd: number): Period;
        subtractFrom<T>(temporal: T): T;
        toJSON(): string;
        toString(): string;
        toTotalMonths(): number;
        units(): ChronoUnit[];
        withDays(days: number): Period;
        withMonths(months: number): Period;
        withYears(years: number): Period;
        years(): number
    }

    declare class TemporalAdjuster {
        adjustInto(temporal: Temporal): Temporal
    }

    declare class TemporalAdjusters {
        dayOfWeekInMonth(ordinal: number, dayOfWeek: DayOfWeek): TemporalAdjuster;
        firstDayOfMonth(): TemporalAdjuster;
        firstDayOfNextMonth(): TemporalAdjuster;
        firstDayOfNextYear(): TemporalAdjuster;
        firstDayOfYear(): TemporalAdjuster;
        firstInMonth(dayOfWeek: DayOfWeek): TemporalAdjuster;
        lastDayOfMonth(): TemporalAdjuster;
        lastDayOfYear(): TemporalAdjuster;
        lastInMonth(dayOfWeek: DayOfWeek): TemporalAdjuster;
        next(dayOfWeek: DayOfWeek): TemporalAdjuster;
        nextOrSame(dayOfWeek: DayOfWeek): TemporalAdjuster;
        previous(dayOfWeek: DayOfWeek): TemporalAdjuster;
        previousOrSame(dayOfWeek: DayOfWeek): TemporalAdjuster
    }

    declare class TemporalQueries {
        chronology(): TemporalQuery;
        localDate(): TemporalQuery;
        localTime(): TemporalQuery;
        offset(): TemporalQuery;
        precision(): TemporalQuery;
        zone(): TemporalQuery;
        zoneId(): TemporalQuery
    }

    declare class TemporalQuery {
        queryFrom(temporal: TemporalAccessor): any
    }

    declare class ValueRange {
        of(min: number, max: number): ValueRange; of(min: number, maxSmallest: number, maxLargest: number): ValueRange; of(
            minSmallest: number,
            minLargest: number,
            maxSmallest: number,
            maxLargest: number): ValueRange;
        checkValidIntValue(value: number, field: TemporalField): number;
        checkValidValue(value: number, field: TemporalField): any;
        equals(other: any): boolean;
        hashCode(): number;
        isFixed(): boolean;
        isIntValue(): boolean;
        isValidIntValue(value: number): boolean;
        isValidValue(value: any): boolean;
        largestMinimum(): number;
        maximum(): number;
        minimum(): number;
        smallestMaximum(): number;
        toString(): string
    }

    declare class Year mixins Temporal {
        MIN_VALUE: number;
        MAX_VALUE: number;
        from(temporal: TemporalAccessor): Year;
        isLeap(year: number): boolean;
        now(zoneIdOrClock?: ZoneId | Clock): Year; of(isoYear: number): Year;
        parse(text: string, formatter?: DateTimeFormatter): Year;
        atMonth(monthOrNumber: Month | number): Year;
        plus(amountOrNumber: TemporalAmount | number, unit?: TemporalUnit): Year;
        minus(amountOrNumber: TemporalAmount | number, unit?: TemporalUnit): Year
    }

    declare class YearMonth mixins Temporal {
        from(temporal: TemporalAccessor): YearMonth;
        now(zoneIdOrClock?: ZoneId | Clock): YearMonth; of(year: number, monthOrNumber: Month | number): YearMonth;
        parse(text: string, formatter?: DateTimeFormatter): YearMonth;
        minus(amount: TemporalAmount): YearMonth;
        minus(amountToSubtract: number, unit: TemporalUnit): YearMonth;
        minusYears(yearsToSubtract: number): YearMonth;
        minusMonths(monthsToSubtract: number): YearMonth;
        plus(amount: TemporalAmount): YearMonth;
        plus(amountToAdd: number, unit: TemporalUnit): YearMonth;
        plusYears(yearsToAdd: number): YearMonth;
        plusMonths(monthsToAdd: number): YearMonth;
        with(adjuster: TemporalAdjuster): YearMonth;
        with(field: TemporalField, value: number): YearMonth;
        withYearMonth(newYear: number, newMonth: number): YearMonth;
        withYear(year: number): YearMonth;
        withMonth(month: number): YearMonth;
        isSupported(fieldOrUnit: TemporalField | ChronoUnit): boolean;
        year(): number;
        monthValue(): number;
        month(): Month;
        isLeapYear(): boolean;
        isValidDay(): boolean;
        lengthOfMonth(): number;
        lengthOfYear(): number;
        atDay(dayOfMonth: number): LocalDate;
        atEndOfMonth(): LocalDate;
        compareTo(other: YearMonth): number;
        isAfter(other: YearMonth): boolean;
        isBefore(other: YearMonth): boolean;
        equals(other: YearMonth): boolean;
        toJSON(): string;
        format(formatter: DateTimeFormatter): string
    }

    declare class ZoneId {
        SYSTEM: ZoneId;
        UTC: ZoneId;
        systemDefault(): ZoneId; of(zoneId: string): ZoneId;
        ofOffset(prefix: string, offset: ZoneOffset): ZoneId;
        from(temporal: TemporalAccessor): ZoneId;
        getAvailableZoneIds(): string[];
        equals(other: any): boolean;
        hashCode(): number;
        id(): string;
        normalized(): ZoneId;
        rules(): ZoneRules;
        toString(): string
    }

    declare class ZoneOffset mixins ZoneId {
        MAX_SECONDS: ZoneOffset;
        UTC: ZoneOffset;
        MIN: ZoneOffset;
        MAX: ZoneOffset; of(offsetId: string): ZoneOffset;
        ofHours(hours: number): ZoneOffset;
        ofHoursMinutes(hours: number, minutes: number): ZoneOffset;
        ofHoursMinutesSeconds(hours: number, minutes: number, seconds: number): ZoneOffset;
        ofTotalMinutes(totalMinutes: number): ZoneOffset;
        ofTotalSeconds(totalSeconds: number): ZoneOffset;
        adjustInto(temporal: Temporal): Temporal;
        compareTo(other: ZoneOffset): number;
        equals(obj: any): boolean;
        get(field: TemporalField): number;
        getLong(field: TemporalField): number;
        hashCode(): number;
        id(): string;
        query(query: TemporalQuery): any;
        rules(): ZoneRules;
        toString(): string;
        totalSeconds(): number
    }

    declare class ZoneRegion mixins ZoneId {
        ofId(zoneId: string): ZoneId;
        id(): string;
        rules(): ZoneRules
    }

    declare class ZoneRules {
        of(offest: ZoneOffset): ZoneRules;
        isFixedOffset(): boolean;
        isValidOffset(localDateTime: LocalDateTime, offset: ZoneOffset): boolean;
        offset(instantOrLocalDateTime: Instant | LocalDateTime): ZoneOffset;
        offsetOfEpochMilli(epochMilli: number): ZoneOffset;
        offsetOfInstant(instant: Instant): ZoneOffset;
        offsetOfLocalDateTime(localDateTime: LocalDateTime): ZoneOffset
    }

    declare class ChronoZonedDateTime mixins Temporal {
        compareTo(other: ChronoZonedDateTime): number;
        equals(other: any): boolean;
        format(formatter: DateTimeFormatter): string;
        isAfter(other: ChronoZonedDateTime): boolean;
        isBefore(other: ChronoZonedDateTime): boolean;
        isEqual(other: ChronoZonedDateTime): boolean;
        query(query: any): any;
        toEpochSecond(): number;
        toInstant(): Instant
    }

    declare class ZonedDateTime mixins ChronoZonedDateTime {
        from(temporal: TemporalAccessor): ZonedDateTime;
        now(clockOrZone?: Clock | ZoneId): ZonedDateTime; of(): any; of(localDateTime: LocalDateTime, zone: ZoneId): ZonedDateTime; of(date: LocalDate, time: LocalTime, zone: ZoneId): ZonedDateTime; of(
            year: number,
            month: number,
            dayOfMonth: number,
            hour: number,
            minute: number,
            second: number,
            nanoOfSecond: number,
            zone: ZoneId): ZonedDateTime;
        ofInstant(): ZonedDateTime;
        ofInstant(instant: Instant, zone: ZoneId): ZonedDateTime;
        ofInstant(localDateTime: LocalDateTime, offset: ZoneOffset, zone: ZoneId): ZonedDateTime;
        ofLocal(
            localDateTime: LocalDateTime,
            zone: ZoneId,
            preferredOffset: ZoneOffset): ZonedDateTime;
        ofStrict(localDateTime: LocalDateTime, offset: ZoneOffset, zone: ZoneId): ZonedDateTime;
        parse(text: string, formatter?: DateTimeFormatter): ZonedDateTime;
        dayOfMonth(): number;
        dayOfWeek(): DayOfWeek;
        dayOfYear(): number;
        equals(other: any): boolean;
        format(formatter: DateTimeFormatter): string;
        get(field: TemporalField): number;
        getLong(field: TemporalField): number;
        hashCode(): number;
        hour(): number;
        isSupported(fieldOrUnit: TemporalField | TemporalUnit): boolean;
        minus(): any;
        minus(amountToSubtract: number, unit: TemporalUnit): ZonedDateTime;
        minusDays(days: number): ZonedDateTime;
        minusHours(hours: number): ZonedDateTime;
        minusMinutes(minutes: number): ZonedDateTime;
        minusMonths(months: number): ZonedDateTime;
        minusNanos(nanos: number): ZonedDateTime;
        minusSeconds(seconds: number): ZonedDateTime;
        minusTemporalAmount(amount: TemporalAmount): ZonedDateTime;
        minusWeeks(weeks: number): ZonedDateTime;
        minusYears(years: number): ZonedDateTime;
        minute(): number;
        month(): Month;
        monthValue(): number;
        nano(): number;
        offset(): any;
        plus(): any;
        plus(amountToAdd: number, unit: TemporalUnit): ZonedDateTime;
        plusDays(days: number): any;
        plusHours(hours: number): ZonedDateTime;
        plusMinutes(minutes: number): ZonedDateTime;
        plusMonths(months: number): ZonedDateTime;
        plusNanos(nanos: number): ZonedDateTime;
        plusSeconds(seconds: number): ZonedDateTime;
        plusTemporalAmount(amount: TemporalAmount): ZonedDateTime;
        plusWeeks(weeks: number): any;
        plusYears(years: number): ZonedDateTime;
        query(query: TemporalQuery): any;
        range(field: TemporalField): ValueRange;
        second(): number;
        toJSON(): string;
        toLocalDate(): LocalDate;
        toLocalDateTime(): LocalDateTime;
        toLocalTime(): LocalTime;
        toOffsetDateTime(): OffsetDateTime;
        toString(): string;
        truncatedTo(unit: TemporalUnit): ZonedDateTime;
        until(endExclusive: Temporal, unit: TemporalUnit): number;
        with(): any;
        with(field: TemporalField, newValue: number): ZonedDateTime;
        withDayOfMonth(dayOfMonth: number): ZonedDateTime;
        withDayOfYear(dayOfYear: number): ZonedDateTime;
        withFixedOffsetZone(): ZonedDateTime;
        withHour(hour: number): ZonedDateTime;
        withMinute(minute: number): ZonedDateTime;
        withMonth(month: number): ZonedDateTime;
        withNano(nanoOfSecond: number): ZonedDateTime;
        withSecond(second: number): ZonedDateTime;
        withTemporalAdjuster(adjuster: TemporalAdjuster): ZonedDateTime;
        withYear(year: number): ZonedDateTime;
        withZoneSameInstant(zone: ZoneId): ZonedDateTime;
        withZoneSameLocal(zone: ZoneId): ZonedDateTime;
        year(): number;
        zone(): ZoneId
    }

    declare class TextStyle {
        asNormal(): TextStyle;
        asStandalone(): TextStyle;
        isStandalone(): boolean
    }

    declare class Locale {
    }

    declare class IsoChronology {
        isLeapYear(prolepticYear: number): boolean;
        resolveDate(fieldValues: any, resolverStyle: any): any;
        equals(other: any): boolean;
        toString(): string
    }

    declare function nativeJs(date: Date | any, zone?: ZoneId): TemporalAccessor

    declare function convert(
        temporal: LocalDate | LocalDateTime | ZonedDateTime,
        zone?: ZoneId): {
        toDate: () => Date,
        toEpochMilli: () => number
    }

    declare function use(plugin: Function): any;
}
/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { abstractMethodFail, requireNonNull } from './assert';
import { Instant } from './Instant';
import { ZoneId } from './ZoneId';
import { ZoneOffset } from './ZoneOffset';

/**
 * A clock providing access to the current instant, date and time using a time-zone.
 *
 * Instances of this class are used to find the current instant, which can be
 * interpreted using the stored time-zone to find the current date and time.
 * As such, a clock can be used instead of {@link System#currentTimeMillis}
 * and {@link TimeZone#getDefault}.
 *
 * Use of a {@link Clock} is optional. All key date-time classes also have a
 * `now()` factory method that uses the system clock in the default time zone.
 * The primary purpose of this abstraction is to allow alternate clocks to be
 * plugged in as and when required. Applications use an object to obtain the
 * current time rather than a static method. This can simplify testing.
 *
 * Best practice for applications is to pass a {@link Clock} into any method
 * that requires the current instant.
 *
 * This approach allows an alternate clock, such as {@link fixed}
 * or {@link offset} to be used during testing.
 *
 * The {@link system} factory methods provide clocks based on the best available
 * system clock This may use {@link System#currentTimeMillis}, or a higher
 * resolution clock if one is available.
 *
 * The javascript Clock implementation differs from the openjdk.
 *
 * Javascript only provides the UTC millis of epoch and the ZoneOffset in minutes of the system default time.
 * Javascript do not provide the system default ZoneId.
 *
 * the system default ZoneId is only guessable by the ZoneOffset, like moment-timezone does by returning one ZoneId
 * with the same ZoneOffset.
 *
 * Therefore we are doing a shortcut here, by defining a SystemUTCClock and a SystemDefaultClock, the Clock itself
 * is returning the ZoneOffset and not the ZoneRules as in the jdk. We should change it, when introducing the iana
 * timezone database and implementing the timezone domains.
 *
 */

export class Clock {
    /**
     * Obtains a clock that returns the current instant using the
     * system clock, converting to date and time using the Date.getTime() UTC millis.
     *
     * This clock, rather than {@link systemDefaultZone}, should be used when
     * you need the current instant without the date or time.
     *
     * @return {Clock} a clock that uses the system clock in the UTC zone, not null
     */
    static systemUTC() {
        return new SystemClock(ZoneOffset.UTC);
    }

    /**
     * Obtains a clock that returns the current instant using the best available
     * system clock, converting to date and time using the default time-zone.
     *
     * This clock is based on the available system clock using the Date.getTime() UTC millis
     *
     * Using this method hard codes a dependency to the default time-zone into your application.
     *
     * The UTC clock (see {@link systemUTC}) should be used when you need the current instant
     * without the date or time.
     *
     *
     * @return {Clock} a clock that uses the system clock in the default zone, not null
     * @see ZoneId#systemDefault()
     */
    static systemDefaultZone() {
        return new SystemClock(ZoneId.systemDefault());
    }

    /**
     *
     * @param {ZoneId} zone
     * @return {Clock} a clock that uses the specified time zone
     */
    static system(zone){
        return new SystemClock(zone);
    }

    /**
     * Obtains a clock that always returns the same instant.
     *
     * This clock simply returns the specified instant.
     * As such, it is not a clock in the conventional sense.
     * The main use case for this is in testing, where the fixed clock ensures
     * tests are not dependent on the current clock.
     *
     * @param {Instant} fixedInstant  the instant to use as the clock, not null
     * @param {ZoneId} zoneId  the zoneOffset to use as zone Offset, not null
     * @return {Clock} a clock that always returns the same instant, not null
     */
    static fixed(fixedInstant, zoneId) {
        return new FixedClock(fixedInstant, zoneId);
    }
    
    /**
     * Obtains a clock that returns instants from the specified clock with the
     * specified duration added
     * <p>
     * This clock wraps another clock, returning instants that are later by the
     * specified duration. If the duration is negative, the instants will be
     * earlier than the current date and time.
     * The main use case for this is to simulate running in the future or in the past.
     * <p>
     * A duration of zero would have no offsetting effect.
     * Passing zero will return the underlying clock.
     * <p>
     * The returned implementation is immutable, thread-safe and {@code Serializable}
     * providing that the base clock is.
     *
     * @param baseClock  the base clock to add the duration to, not null
     * @param duration  the duration to add, not null
     * @return a clock based on the base clock with the duration added, not null
     */
    static offset(baseClock, duration) {
        return new OffsetClock(baseClock, duration);   
    }

    /**
      * Gets the current millisecond instant of the clock.
      *
      * This returns the millisecond-based instant, measured from 1970-01-01T00:00Z (UTC).
      * This is equivalent to the definition of {@link Date#getTime}.
      *
      * Most applications should avoid this method and use {@link Instant} to represent
      * an instant on the time-line rather than a raw millisecond value.
      * This method is provided to allow the use of the clock in high performance use cases
      * where the creation of an object would be unacceptable.
      *
      * The default implementation currently calls {@link instant}.
      *
      * @return the current millisecond instant from this clock, measured from
      *  the Java epoch of 1970-01-01T00:00Z (UTC), not null
      */
    millis(){
        abstractMethodFail('Clock.millis');
    }

    /**
     * Gets the current instant of the clock.
     *
     * This returns an instant representing the current instant as defined by the clock.
     *
     * @return {Instant} the current instant from this clock, not null
     */
    instant(){
        abstractMethodFail('Clock.instant');
    }

    zone(){
        abstractMethodFail('Clock.zone');
    }
    
    /**
     * Returns a copy of this clock with a different time-zone.
     * <p>
     * A clock will typically obtain the current instant and then convert that
     * to a date or time using a time-zone. This method returns a clock with
     * similar properties but using a different time-zone.
     *
     * @return a clock based on this clock with the specified time-zone, not null
     */
    withZone(){
        abstractMethodFail('Clock.withZone');
    }
}

/**
 * Implementation of a clock that always returns the latest time from
 * {@link Date#getTime}.
 *
 * @private
 */
class SystemClock extends Clock {
    /**
     *
     * @param {!ZoneId} zone
     */
    constructor(zone){
        requireNonNull(zone, 'zone');
        super();
        this._zone = zone;
    }

    /**
     *
     * @returns {!ZoneId}
     */
    zone() {
        return this._zone;
    }

    /**
     *
     * @returns {number}
     */
    millis() {
        return new Date().getTime();
    }

    /**
     *
     * @returns {Instant}
     */
    instant() {
        return Instant.ofEpochMilli(this.millis());
    }
    
    equals(obj) {    
        if (obj instanceof SystemClock) {            
            return this._zone.equals(obj._zone);
        }
        return false;    
    }  
      
    withZone(zone) {
        if (zone.equals(this._zone)) {  // intentional NPE
            return this;
        }
        return new SystemClock(zone);
    }      

    /**
     *
     * @returns {string}
     */
    toString(){
        return `SystemClock[${this._zone.toString()}]`;
    }

}

/**
 * Implementation of a clock that always returns the same instant.
 * This is typically used for testing.
 * @private
 */
class FixedClock extends Clock{
    constructor(fixedInstant, zoneId) {
        super();
        this._instant = fixedInstant;
        this._zoneId = zoneId;
    }

    instant() {
        return this._instant;
    }

    millis(){
        return this._instant.toEpochMilli();
    }

    zone() {
        return this._zoneId;
    }

    toString(){
        return 'FixedClock[]';
    }
    
    equals(obj) {    
        if (obj instanceof FixedClock) {            
            return this._instant.equals(obj._instant) && this._zoneId.equals(obj._zoneId);
        }
        return false;    
    }

    withZone(zone) {
        if (zone.equals(this._zoneId)) {  // intentional NPE
            return this;
        }
        return new FixedClock(this._instant, zone);
    }      
    
}


/**
 * Implementation of a clock that adds an offset to an underlying clock.
 */
class OffsetClock extends Clock {
    constructor(baseClock, offset) {
        super();
        this._baseClock = baseClock;
        this._offset = offset;
    }
   
    zone() {
        return this._baseClock.zone();
    }
        
    withZone(zone) {
        if (zone.equals(this._baseClock.zone())) {  // intentional NPE
            return this;
        }
        return new OffsetClock(this._baseClock.withZone(zone), this._offset);
    }
    
    millis() {
        return this._baseClock.millis() + this._offset.toMillis();
    }
    
    instant() {
        return this._baseClock.instant().plus(this._offset);
    }
        
    equals(obj) {
        if (obj instanceof OffsetClock) {            
            return this._baseClock.equals(obj._baseClock) && this._offset.equals(obj._offset);
        }
        return false;
    }
    
    toString() {
        return `OffsetClock[${this._baseClock},${this._offset}]`;
    }
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { DateTimeException, UnsupportedTemporalTypeException, NullPointerException } from './errors';
import { MathUtil } from './MathUtil';
import { assert, requireNonNull, requireInstance } from './assert';

import { ChronoField } from './temporal/ChronoField';
import { ChronoUnit } from './temporal/ChronoUnit';
import { IllegalArgumentException } from './errors';
import { TemporalAccessor } from './temporal/TemporalAccessor';
import { TemporalQueries } from './temporal/TemporalQueries';
import { createTemporalQuery } from './temporal/TemporalQuery';

/**
 * ### Static properties of Class {@link DayOfWeek}
 *
 * DayOfWeek.MONDAY,
 * DayOfWeek.TUESDAY,
 * DayOfWeek.WEDNESDAY,
 * DayOfWeek.THURSDAY,
 * DayOfWeek.FRIDAY,
 * DayOfWeek.SATURDAY,
 * DayOfWeek.SUNDAY
 *
 */
export class DayOfWeek extends TemporalAccessor {

    /**
     *
     * @param {number} ordinal
     * @param {string} name
     * @private
     */
    constructor(ordinal, name){
        super();
        this._ordinal = ordinal;
        this._name = name;
    }

    /**
     *
     * @returns {number}
     */
    ordinal(){
        return this._ordinal;
    }

    /**
     *
     * @returns {string}
     */
    name(){
        return this._name;
    }

    /**
     *
     * @returns {DayOfWeek[]}
     */
    static values() {
        return ENUMS.slice();
    }

    /**
     *
     * @param {string} name
     * @returns {DayOfWeek}
     */
    static valueOf(name) {
        let ordinal = 0;
        for(ordinal; ordinal < ENUMS.length; ordinal++){
            if(ENUMS[ordinal].name() === name){
                break;
            }
        }
        return DayOfWeek.of(ordinal+1);
    }

    /**
     * Obtains an instance of {@link DayOfWeek} from an `int` value.
     *
     * {@link DayOfWeek} is an enum representing the 7 days of the week.
     * This factory allows the enum to be obtained from the `int` value.
     * The `int` value follows the ISO-8601 standard, from 1 (Monday) to 7 (Sunday).
     *
     * @param {!number} dayOfWeek  the day-of-week to represent, from 1 (Monday) to 7 (Sunday)
     * @return {DayOfWeek} the day-of-week singleton, not null
     * @throws DateTimeException if the day-of-week is invalid
     */
    static of(dayOfWeek) {
        if (dayOfWeek < 1 || dayOfWeek > 7) {
            throw new DateTimeException(`Invalid value for DayOfWeek: ${dayOfWeek}`);
        }
        return ENUMS[dayOfWeek - 1];
    }

    /**
     * Obtains an instance of {@link DayOfWeek} from a temporal object.
     *
     * A {@link TemporalAccessor} represents some form of date and time information.
     * This factory converts the arbitrary temporal object to an instance of {@link DayOfWeek}.
     *
     * The conversion extracts the {@link ChronoField#DAY_OF_WEEK} field.
     *
     * This method matches the signature of the functional interface {@link TemporalQuery}
     * allowing it to be used as a query via method reference, {@link DayOfWeek::from}.
     *
     * @param {TemporalAccessor} temporal - the temporal object to convert, not null
     * @return {DayOfWeek} the day-of-week, not null
     * @throws DateTimeException if unable to convert to a {@link DayOfWeek}
     */
    static from(temporal) {
        assert(temporal != null, 'temporal', NullPointerException);
        if (temporal instanceof DayOfWeek) {
            return temporal;
        }
        try {
            return DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
        } catch (ex) {
            if(ex instanceof DateTimeException) {
                throw new DateTimeException(`Unable to obtain DayOfWeek from TemporalAccessor: ${ 
                    temporal}, type ${temporal.constructor != null ? temporal.constructor.name : ''}`, ex);
            } else {
                throw ex;
            }
        }
    }

    /**
     * Gets the day-of-week `int` value.
     *
     * The values are numbered following the ISO-8601 standard, from 1 (Monday) to 7 (Sunday).
     * See {@link WeekFields#dayOfWeek} for localized week-numbering.
     *
     * @return {number} the day-of-week, from 1 (Monday) to 7 (Sunday)
     */
    value() {
        return this._ordinal + 1;
    }

    /**
     * Gets the textual representation, such as 'Mon' or 'Friday'.
     *
     * This returns the textual name used to identify the day-of-week.
     * The parameters control the length of the returned text and the locale.
     *
     * If no textual mapping is found then the numeric value (see {@link getValue}) is returned.
     *
     * @param {TextStyle} style - the length of the text required, not null
     * @param {Locale} locale - the locale to use, not null
     * @return {string} the text value of the day-of-week, not null
     */
    // eslint-disable-next-line no-unused-vars
    displayName(style, locale) {
        throw new IllegalArgumentException('Pattern using (localized) text not implemented yet!');
        // return new DateTimeFormatterBuilder().appendText(ChronoField.DAY_OF_WEEK, style).toFormatter(locale).format(this);
    }

    /**
     * Checks if the specified field is supported.
     *
     * This checks if this day-of-week can be queried for the specified field.
     * If false, then calling the {@link range} and
     * {@link get} methods will throw an exception.
     *
     * If the field is {@link ChronoField#DAY_OF_WEEK} then
     * this method returns true.
     * All other {@link ChronoField} instances will return false.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking `TemporalField.isSupportedBy(TemporalAccessor)`
     * passing `this` as the argument.
     * Whether the field is supported is determined by the field.
     *
     * @param {TemporalField} field - the field to check, null returns false
     * @return {boolean} true if the field is supported on this day-of-week, false if not
     */
    isSupported(field) {
        if (field instanceof ChronoField) {
            return field === ChronoField.DAY_OF_WEEK;
        }
        return field != null && field.isSupportedBy(this);
    }

    /**
     * Gets the range of valid values for the specified field.
     *
     * The range object expresses the minimum and maximum valid values for a field.
     * This day-of-week is used to enhance the accuracy of the returned range.
     * If it is not possible to return the range, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is {@link ChronoField#DAY_OF_WEEK} then the
     * range of the day-of-week, from 1 to 7, will be returned.
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking `TemporalField.rangeRefinedBy(TemporalAccessor)`
     * passing `this` as the argument.
     * Whether the range can be obtained is determined by the field.
     *
     * @param {TemporalField} field - the field to query the range for, not null
     * @return {ValueRange} the range of valid values for the field, not null
     * @throws DateTimeException if the range for the field cannot be obtained
     */
    range(field) {
        if (field === ChronoField.DAY_OF_WEEK) {
            return field.range();
        } else if (field instanceof ChronoField) {
            throw new UnsupportedTemporalTypeException(`Unsupported field: ${field}`);
        }
        return field.rangeRefinedBy(this);
    }

    /**
     * Gets the value of the specified field from this day-of-week as an `int`.
     *
     * This queries this day-of-week for the value for the specified field.
     * The returned value will always be within the valid range of values for the field.
     * If it is not possible to return the value, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is {@link ChronoField#DAY_OF_WEEK} then the
     * value of the day-of-week, from 1 to 7, will be returned.
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.getFrom}
     * passing `this` as the argument. Whether the value can be obtained,
     * and what the value represents, is determined by the field.
     *
     * @param {TemporalField} field - the field to get, not null
     * @return {number} the value for the field, within the valid range of values
     * @throws DateTimeException if a value for the field cannot be obtained
     * @throws DateTimeException if the range of valid values for the field exceeds an `int`
     * @throws DateTimeException if the value is outside the range of valid values for the field
     * @throws ArithmeticException if numeric overflow occurs
     */
    get(field) {
        if (field === ChronoField.DAY_OF_WEEK) {
            return this.value();
        }
        return this.range(field).checkValidIntValue(this.getLong(field), field);
    }

    /**
     * Gets the value of the specified field from this day-of-week as a `long`.
     *
     * This queries this day-of-week for the value for the specified field.
     * If it is not possible to return the value, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is {@link ChronoField#DAY_OF_WEEK} then the
     * value of the day-of-week, from 1 to 7, will be returned.
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.getFrom}
     * passing `this` as the argument. Whether the value can be obtained,
     * and what the value represents, is determined by the field.
     *
     * @param {TemporalField} field - the field to get, not null
     * @return {number} the value for the field
     * @throws DateTimeException if a value for the field cannot be obtained
     * @throws ArithmeticException if numeric overflow occurs
     */
    getLong(field) {
        if (field === ChronoField.DAY_OF_WEEK) {
            return this.value();
        } else if (field instanceof ChronoField) {
            throw new UnsupportedTemporalTypeException(`Unsupported field: ${field}`);
        }
        return field.getFrom(this);
    }

    //-----------------------------------------------------------------------
    /**
     * Returns the day-of-week that is the specified number of days after this one.
     *
     * The calculation rolls around the end of the week from Sunday to Monday.
     * The specified period may be negative.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} days - the days to add, positive or negative
     * @return {DayOfWeek} the resulting day-of-week, not null
     */
    plus(days) {
        const amount = MathUtil.floorMod(days, 7);
        return ENUMS[MathUtil.floorMod(this._ordinal + (amount + 7), 7)];
    }

    /**
     * Returns the day-of-week that is the specified number of days before this one.
     *
     * The calculation rolls around the start of the year from Monday to Sunday.
     * The specified period may be negative.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} days - the days to subtract, positive or negative
     * @return {DayOfWeek} the resulting day-of-week, not null
     */
    minus(days) {
        return this.plus(-1 * MathUtil.floorMod(days, 7));
    }

    //-----------------------------------------------------------------------
    /**
     * Queries this day-of-week using the specified query.
     *
     * This queries this day-of-week using the specified query strategy object.
     * The {@link TemporalQuery} object defines the logic to be used to
     * obtain the result. Read the documentation of the query to understand
     * what the result of this method will be.
     *
     * The result of this method is obtained by invoking the
     * {@link TemporalQuery#queryFrom} method on the
     * specified query passing `this` as the argument.
     *
     * @param {TemporalQuery} query  the query to invoke, not null
     * @return {*} the query result, null may be returned (defined by the query)
     * @throws DateTimeException if unable to query (defined by the query)
     * @throws ArithmeticException if numeric overflow occurs (defined by the query)
     */
    query(query) {
        if (query === TemporalQueries.precision()) {
            return ChronoUnit.DAYS;
        } else if (query === TemporalQueries.localDate() || query === TemporalQueries.localTime() || query === TemporalQueries.chronology() ||
                query === TemporalQueries.zone() || query === TemporalQueries.zoneId() || query === TemporalQueries.offset()) {
            return null;
        }
        assert(query != null, 'query', NullPointerException);
        return query.queryFrom(this);
    }

    /**
     * Adjusts the specified temporal object to have this day-of-week.
     *
     * This returns a temporal object of the same observable type as the input
     * with the day-of-week changed to be the same as this.
     *
     * The adjustment is equivalent to using {@link Temporal#with}
     * passing {@link ChronoField#DAY_OF_WEEK} as the field.
     * Note that this adjusts forwards or backwards within a Monday to Sunday week.
     * See {@link WeekFields#dayOfWeek} for localized week start days.
     * See {@link TemporalAdjusters} for other adjusters
     * with more control, such as `next(MONDAY)`.
     *
     * In most cases, it is clearer to reverse the calling pattern by using
     * {@link Temporal#with}:
     * <pre>
     *   // these two lines are equivalent, but the second approach is recommended
     *   temporal = thisDayOfWeek.adjustInto(temporal);
     *   temporal = temporal.with(thisDayOfWeek);
     * </pre>
     *
     * For example, given a date that is a Wednesday, the following are output:
     * <pre>
     *   dateOnWed.with(MONDAY);     // two days earlier
     *   dateOnWed.with(TUESDAY);    // one day earlier
     *   dateOnWed.with(WEDNESDAY);  // same date
     *   dateOnWed.with(THURSDAY);   // one day later
     *   dateOnWed.with(FRIDAY);     // two days later
     *   dateOnWed.with(SATURDAY);   // three days later
     *   dateOnWed.with(SUNDAY);     // four days later
     * </pre>
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {TemporalAdjusters} temporal  the target object to be adjusted, not null
     * @return {Temporal} the adjusted object, not null
     * @throws DateTimeException if unable to make the adjustment
     * @throws ArithmeticException if numeric overflow occurs
     */
    adjustInto(temporal) {
        requireNonNull(temporal, 'temporal');
        return temporal.with(ChronoField.DAY_OF_WEEK, this.value());
    }

    /**
     *
     * @returns {boolean}
     */
    equals(other){ 
        return this === other;
    }

    /**
     *
     * @returns {string}
     */
    toString(){
        return this._name;
    }

    /**
     * Compares this DayOfWeek to another DayOfWeek.
     *
     * The comparison is based on the value of the DayOfWeek.
     * It is "consistent with equals", as defined by {@link Comparable}.
     *
     * @param {DayOfWeek} other  the other year to compare to, not null
     * @return {number} the comparator value, negative if less, positive if greater
     */    
    compareTo(other) {
        requireNonNull(other, 'other');
        requireInstance(other, DayOfWeek, 'other');
        return this._ordinal - other._ordinal;
    }

    /**
     * toJSON() use by JSON.stringify
     * delegates to toString()
     *
     * @return {string}
     */
    toJSON() {
        return this.toString();
    }
}

let ENUMS;

export function _init() {
    DayOfWeek.MONDAY = new DayOfWeek(0, 'MONDAY');
    DayOfWeek.TUESDAY = new DayOfWeek(1, 'TUESDAY');
    DayOfWeek.WEDNESDAY = new DayOfWeek(2, 'WEDNESDAY');
    DayOfWeek.THURSDAY = new DayOfWeek(3, 'THURSDAY');
    DayOfWeek.FRIDAY = new DayOfWeek(4, 'FRIDAY');
    DayOfWeek.SATURDAY = new DayOfWeek(5, 'SATURDAY');
    DayOfWeek.SUNDAY = new DayOfWeek(6, 'SUNDAY');

    DayOfWeek.FROM = createTemporalQuery('DayOfWeek.FROM', (temporal) => {
        return DayOfWeek.from(temporal);
    });

    ENUMS = [
        DayOfWeek.MONDAY,
        DayOfWeek.TUESDAY,
        DayOfWeek.WEDNESDAY,
        DayOfWeek.THURSDAY,
        DayOfWeek.FRIDAY,
        DayOfWeek.SATURDAY,
        DayOfWeek.SUNDAY
    ];
}
/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
import { requireNonNull, requireInstance } from './assert';
import { ArithmeticException, DateTimeParseException, UnsupportedTemporalTypeException } from './errors';
import { MathUtil, MAX_SAFE_INTEGER, MIN_SAFE_INTEGER } from './MathUtil';

import { ChronoField } from './temporal/ChronoField';
import { ChronoUnit } from './temporal/ChronoUnit';
import { TemporalAmount } from './temporal/TemporalAmount';
import { TemporalUnit } from './temporal/TemporalUnit';

import { LocalTime } from './LocalTime';

/**
 * A time-based amount of time, such as '34.5 seconds'.
 *
 * This class models a quantity or amount of time in terms of seconds and nanoseconds.
 * It can be accessed using other duration-based units, such as minutes and hours.
 * In addition, the {@link ChronoUnit#DAYS} unit can be used and is treated as
 * exactly equal to 24 hours, thus ignoring daylight savings effects.
 * See {@link Period} for the date-based equivalent to this class.
 *
 * A physical duration could be of infinite length.
 * For practicality, the duration is stored with constraints similar to {@link Instant}.
 * The duration uses nanosecond resolution with a maximum value of the seconds that can
 * be held in a `long`. This is greater than the current estimated age of the universe.
 *
 * The range of a duration requires the storage of a number larger than a `long`.
 * To achieve this, the class stores a `long` representing seconds and an `int`
 * representing nanosecond-of-second, which will always be between 0 and 999,999,999.
 *
 * The duration is measured in "seconds", but these are not necessarily identical to
 * the scientific "SI second" definition based on atomic clocks.
 * This difference only impacts durations measured near a leap-second and should not affect
 * most applications.
 * See {@link Instant} for a discussion as to the meaning of the second and time-scales.
 *
 * ### Static properties of Class {@link Duration}
 *
 * Duration.ZERO
 *
 * Constant for a duration of zero.
 *
 */
export class Duration extends TemporalAmount /*implements TemporalAmount, Comparable<Duration>, Serializable */ {

    /**
     * Constructs an instance of {@link Duration} using seconds and nanoseconds.
     *
     * @param {Number} seconds - the length of the duration in seconds, positive or negative
     * @param {Number} nanos - the nanoseconds within the second, from 0 to 999,999,999
     * @private
     */
    constructor(seconds, nanos) {
        super();
        this._seconds = MathUtil.safeToInt(seconds);
        this._nanos = MathUtil.safeToInt(nanos);
    }

    //-----------------------------------------------------------------------
    /**
     * Obtains an instance of {@link Duration} from a number of standard 24 hour days.
     *
     * The seconds are calculated based on the standard definition of a day,
     * where each day is 86400 seconds which implies a 24 hour day.
     * The nanosecond in second field is set to zero.
     *
     * @param {Number} days - the number of days, positive or negative
     * @return {!Duration}
     * @throws ArithmeticException if the input days exceeds the capacity of {@link Duration}
     */
    static ofDays(days) {
        return Duration._create(MathUtil.safeMultiply(days, LocalTime.SECONDS_PER_DAY), 0);
    }

    /**
     * Obtains an instance of {@link Duration} from a number of standard hours.
     *
     * The seconds are calculated based on the standard definition of an hour,
     * where each hour is 3600 seconds.
     * The nanosecond in second field is set to zero.
     *
     * @param {Number} hours - the number of hours, positive or negative
     * @return {!Duration}
     * @throws ArithmeticException if the input hours exceeds the capacity of {@link Duration}
     */
    static ofHours(hours) {
        return Duration._create(MathUtil.safeMultiply(hours, LocalTime.SECONDS_PER_HOUR), 0);
    }

    /**
     * Obtains an instance of {@link Duration} from a number of standard minutes.
     *
     * The seconds are calculated based on the standard definition of a minute,
     * where each minute is 60 seconds.
     * The nanosecond in second field is set to zero.
     *
     * @param {Number} minutes - the number of minutes, positive or negative
     * @return {!Duration}
     * @throws ArithmeticException if the input minutes exceeds the capacity of {@link Duration}
     */
    static ofMinutes(minutes) {
        return Duration._create(MathUtil.safeMultiply(minutes, LocalTime.SECONDS_PER_MINUTE), 0);
    }

    //-----------------------------------------------------------------------
    /**
     * Obtains an instance of {@link Duration} from a number of seconds
     * and an adjustment in nanoseconds.
     *
     * This method allows an arbitrary number of nanoseconds to be passed in.
     * The factory will alter the values of the second and nanosecond in order
     * to ensure that the stored nanosecond is in the range 0 to 999,999,999.
     * For example, the following will result in the exactly the same duration:
     * <pre>
     *  Duration.ofSeconds(3, 1);
     *  Duration.ofSeconds(4, -999_999_999);
     *  Duration.ofSeconds(2, 1000_000_001);
     * </pre>
     *
     * @param {Number} seconds - the number of seconds, positive or negative
     * @param {Number} nanoAdjustment  the nanosecond adjustment to the number of seconds, positive or negative
     * @return {!Duration}
     * @throws ArithmeticException if the adjustment causes the seconds to exceed the capacity of {@link Duration}
     */
    static ofSeconds(seconds, nanoAdjustment = 0) {
        const secs = MathUtil.safeAdd(seconds, MathUtil.floorDiv(nanoAdjustment, LocalTime.NANOS_PER_SECOND));
        const nos = MathUtil.floorMod(nanoAdjustment, LocalTime.NANOS_PER_SECOND);
        return Duration._create(secs, nos);
    }

    //-----------------------------------------------------------------------
    /**
     * Obtains an instance of {@link Duration} from a number of milliseconds.
     *
     * The seconds and nanoseconds are extracted from the specified milliseconds.
     *
     * @param {Number} millis - the number of milliseconds, positive or negative
     * @return {!Duration}
     */
    static ofMillis(millis) {
        let secs = MathUtil.intDiv(millis, 1000);
        let mos = MathUtil.intMod(millis, 1000);
        if (mos < 0) {
            mos += 1000;
            secs--;
        }
        return Duration._create(secs, mos * 1000000);
    }

    //-----------------------------------------------------------------------
    /**
     * Obtains an instance of {@link Duration} from a number of nanoseconds.
     *
     * The seconds and nanoseconds are extracted from the specified nanoseconds.
     *
     * @param {Number} nanos - the number of nanoseconds, positive or negative
     * @return {!Duration}
     */
    static ofNanos(nanos) {
        let secs = MathUtil.intDiv(nanos, LocalTime.NANOS_PER_SECOND);
        let nos = MathUtil.intMod(nanos, LocalTime.NANOS_PER_SECOND);
        if (nos < 0) {
            nos += LocalTime.NANOS_PER_SECOND;
            secs--;
        }
        return this._create(secs, nos);
    }

    //-----------------------------------------------------------------------
    /**
     * Obtains an instance of {@link Duration} from a duration in the specified unit.
     *
     * The parameters represent the two parts of a phrase like '6 Hours'. For example:
     * <pre>
     *  Duration.of(3, SECONDS);
     *  Duration.of(465, HOURS);
     * </pre>
     * Only a subset of units are accepted by this method.
     * The unit must either have an exact duration (see {@link TemporalUnit#isDurationEstimated}) or
     * be {@link ChronoUnit#DAYS} which is treated as 24 hours. Other units throw an exception.
     *
     * @param {Number} amount - the amount of the duration, measured in terms of the unit, positive or negative
     * @param {TemporalUnit} unit - the unit that the duration is measured in, must have an exact duration, not null
     * @return {!Duration}
     * @throws DateTimeException if the period unit has an estimated duration
     * @throws ArithmeticException if a numeric overflow occurs
     */
    static of(amount, unit) {
        return Duration.ZERO.plus(amount, unit);
    }

    //-----------------------------------------------------------------------
    /**
     * Obtains an instance of {@link Duration} from an amount.
     *
     * This obtains a duration based on the specified amount.
     * A TemporalAmount represents an amount of time, which may be date-based
     * or time-based, which this factory extracts to a duration.
     *
     * The conversion loops around the set of units from the amount and uses
     * the duration of the unit to calculate the total Duration.
     * Only a subset of units are accepted by this method.
     * The unit must either have an exact duration or be ChronoUnit.DAYS which
     * is treated as 24 hours. If any other units are found then an exception is thrown.
     *
     * @param {TemporalAmount} amount - the temporal amount to convert, not null
     * @return {Duration} the resulting duration, not null
     * @throws DateTimeException if the amount cannot be converted
     * @throws ArithmeticException if a numeric overflow occurs
     */
    static from(amount) {
        requireNonNull(amount, 'amount');
        requireInstance(amount, TemporalAmount);
        let duration = Duration.ZERO;
        amount.units().forEach((unit) => {
            duration = duration.plus(amount.get(unit), unit);
        });
        return duration;
    }

    /**
     * Obtains an instance of {@link Duration} representing the duration between two instants.
     *
     * Obtains a {@link Duration} representing the duration between two instants.
     * This calculates the duration between two temporal objects of the same type.
     * The difference in seconds is calculated using {@link Temporal#until}.
     * The difference in nanoseconds is calculated using by querying the
     * {@link ChronoField#NANO_OF_SECOND} field.
     *
     * The result of this method can be a negative period if the end is before the start.
     * To guarantee to obtain a positive duration call abs() on the result.
     *
     * @param {Temporal} startInclusive - the start instant, inclusive, not null
     * @param {Temporal} endExclusive - the end instant, exclusive, not null
     * @return {!Duration}
     * @throws DateTimeException if the seconds between the temporals cannot be obtained
     * @throws ArithmeticException if the calculation exceeds the capacity of {@link Duration}
     */
    static between(startInclusive, endExclusive) {
        requireNonNull(startInclusive, 'startInclusive');
        requireNonNull(endExclusive, 'endExclusive');
        let secs = startInclusive.until(endExclusive, ChronoUnit.SECONDS);
        let nanos = 0;
        if (startInclusive.isSupported(ChronoField.NANO_OF_SECOND) && endExclusive.isSupported(ChronoField.NANO_OF_SECOND)) {
            try {
                const startNos = startInclusive.getLong(ChronoField.NANO_OF_SECOND);
                nanos = endExclusive.getLong(ChronoField.NANO_OF_SECOND) - startNos;
                if (secs > 0 && nanos < 0) {
                    nanos += LocalTime.NANOS_PER_SECOND;
                } else if (secs < 0 && nanos > 0) {
                    nanos -= LocalTime.NANOS_PER_SECOND;
                } else if (secs === 0 && nanos !== 0) {
                    // two possible meanings for result, so recalculate secs
                    const adjustedEnd = endExclusive.with(ChronoField.NANO_OF_SECOND, startNos);
                    secs = startInclusive.until(adjustedEnd, ChronoUnit.SECONDS);
                }
            } catch (e) {
                // ignore and only use seconds
            }
        }
        return this.ofSeconds(secs, nanos);
    }

    //-----------------------------------------------------------------------
    /**
     * Obtains a {@link Duration} from a text string such as {@link PnDTnHnMn.nS}.
     *
     * This will parse a textual representation of a duration, including the
     * string produced by {@link toString}. The formats accepted are based
     * on the ISO-8601 duration format {@link PnDTnHnMn.nS} with days
     * considered to be exactly 24 hours.
     *
     * The string starts with an optional sign, denoted by the ASCII negative
     * or positive symbol. If negative, the whole period is negated.
     * The ASCII letter "P" is next in upper or lower case.
     * There are then four sections, each consisting of a number and a suffix.
     * The sections have suffixes in ASCII of "D", "H", "M" and "S" for
     * days, hours, minutes and seconds, accepted in upper or lower case.
     * The suffixes must occur in order. The ASCII letter "T" must occur before
     * the first occurrence, if any, of an hour, minute or second section.
     * At least one of the four sections must be present, and if "T" is present
     * there must be at least one section after the "T".
     * The number part of each section must consist of one or more ASCII digits.
     * The number may be prefixed by the ASCII negative or positive symbol.
     * The number of days, hours and minutes must parse to a `long`.
     * The number of seconds must parse to a `long` with optional fraction.
     * The decimal point may be either a dot or a comma.
     * The fractional part may have from zero to 9 digits.
     *
     * The leading plus/minus sign, and negative values for other units are
     * not part of the ISO-8601 standard.
     *
     * Examples:
     * <pre>
     *    "PT20.345S" -> parses as "20.345 seconds"
     *    "PT15M"     -> parses as "15 minutes" (where a minute is 60 seconds)
     *    "PT10H"     -> parses as "10 hours" (where an hour is 3600 seconds)
     *    "P2D"       -> parses as "2 days" (where a day is 24 hours or 86400 seconds)
     *    "P2DT3H4M"  -> parses as "2 days, 3 hours and 4 minutes"
     *    "P-6H3M"    -> parses as "-6 hours and +3 minutes"
     *    "-P6H3M"    -> parses as "-6 hours and -3 minutes"
     *    "-P-6H+3M"  -> parses as "+6 hours and -3 minutes"
     * </pre>
     *
     * @param {String} text - the text to parse, not null
     * @return {Duration} the parsed duration, not null
     * @throws DateTimeParseException if the text cannot be parsed to a duration
     */
    static parse(text) {
        requireNonNull(text, 'text');
        /**
         * The pattern for parsing.
         */
        const PATTERN = new RegExp('([-+]?)P(?:([-+]?[0-9]+)D)?(T(?:([-+]?[0-9]+)H)?(?:([-+]?[0-9]+)M)?(?:([-+]?[0-9]+)(?:[.,]([0-9]{0,9}))?S)?)?', 'i');
        const matches = PATTERN.exec(text);
        if (matches !== null) {
            // check for letter T but no time sections
            if ('T' === matches[3] === false) {
                const negate = '-' === matches[1];
                const dayMatch = matches[2];
                const hourMatch = matches[4];
                const minuteMatch = matches[5];
                const secondMatch = matches[6];
                const fractionMatch = matches[7];
                if (dayMatch != null || hourMatch != null || minuteMatch != null || secondMatch != null) {
                    const daysAsSecs = Duration._parseNumber(text, dayMatch, LocalTime.SECONDS_PER_DAY, 'days');
                    const hoursAsSecs = Duration._parseNumber(text, hourMatch, LocalTime.SECONDS_PER_HOUR, 'hours');
                    const minsAsSecs = Duration._parseNumber(text, minuteMatch, LocalTime.SECONDS_PER_MINUTE, 'minutes');
                    const seconds = Duration._parseNumber(text, secondMatch, 1, 'seconds');
                    const negativeSecs = secondMatch != null && secondMatch.charAt(0) === '-';
                    const nanos = Duration._parseFraction(text,  fractionMatch, negativeSecs ? -1 : 1);
                    try {
                        return Duration._create(negate, daysAsSecs, hoursAsSecs, minsAsSecs, seconds, nanos);
                    } catch (ex) {
                        throw new DateTimeParseException('Text cannot be parsed to a Duration: overflow', text, 0, ex);
                    }
                }
            }
        }
        throw new DateTimeParseException('Text cannot be parsed to a Duration', text, 0);
    }

    static _parseNumber(text, parsed, multiplier, errorText) {
        // regex limits to [-+]?[0-9]+
        if (parsed == null) {
            return 0;
        }
        try {
            if (parsed[0] === '+') {
                parsed = parsed.substring(1);
            }
            return MathUtil.safeMultiply(parseFloat(parsed), multiplier);
        } catch (ex) {
            throw new DateTimeParseException(`Text cannot be parsed to a Duration: ${errorText}`, text, 0, ex);
        }
    }

    static _parseFraction(text, parsed, negate) {
        // regex limits to [0-9]{0,9}
        if (parsed == null || parsed.length === 0) {
            return 0;
        }
        parsed = (`${parsed}000000000`).substring(0, 9);
        return parseFloat(parsed) * negate;
    }

    //-----------------------------------------------------------------------
    /**
     * to handle function overriding this function accepts any number of arguments, checks their type and delegates to the appropriate
     * function
     *
     * @return {Duration}
     */
    static _create() {
        if (arguments.length <= 2) {
            return Duration._createSecondsNanos(arguments[0], arguments[1]);
        } else {
            return Duration._createNegateDaysHoursMinutesSecondsNanos(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);
        }
    }

    static _createNegateDaysHoursMinutesSecondsNanos(negate, daysAsSecs, hoursAsSecs, minsAsSecs, secs, nanos) {
        const seconds = MathUtil.safeAdd(daysAsSecs, MathUtil.safeAdd(hoursAsSecs, MathUtil.safeAdd(minsAsSecs, secs)));
        if (negate) {
            return Duration.ofSeconds(seconds, nanos).negated();
        }
        return Duration.ofSeconds(seconds, nanos);
    }

    /**
     * Obtains an instance of {@link Duration} using seconds and nanoseconds.
     *
     * @param {Number} seconds - the length of the duration in seconds, positive or negative
     * @param {Number} nanoAdjustment - the nanosecond adjustment within the second, from 0 to 999,999,999
     */
    static _createSecondsNanos(seconds = 0, nanoAdjustment = 0) {
        if (seconds === 0 && nanoAdjustment === 0) {
            return Duration.ZERO;
        }
        return new Duration(seconds, nanoAdjustment);
    }

    //-----------------------------------------------------------------------
    /**
     * Gets the value of the requested unit.
     *
     * This returns a value for each of the two supported units,
     * {@link ChronoUnit#SECONDS} and {@link ChronoUnit#NANOS}.
     * All other units throw an exception.
     *
     * @param {TemporalUnit} unit the {@link TemporalUnit} for which to return the value
     * @return {number} the const value of the unit
     * @throws DateTimeException if the unit is not supported
     * @throws UnsupportedTemporalTypeException if the unit is not supported
     */
    get(unit) {
        if (unit === ChronoUnit.SECONDS) {
            return this._seconds;
        } else if (unit === ChronoUnit.NANOS) {
            return this._nanos;
        } else {
            throw new UnsupportedTemporalTypeException(`Unsupported unit: ${unit}`);
        }
    }

    units() {
        return [ChronoUnit.SECONDS, ChronoUnit.NANOS];
    }

    //-----------------------------------------------------------------------
    /**
     * Checks if this duration is zero length.
     *
     * A {@link Duration} represents a directed distance between two points on
     * the time-line and can therefore be positive, zero or negative.
     * This method checks whether the length is zero.
     *
     * @return {boolean} true if this duration has a total length equal to zero
     */
    isZero() {
        return this._seconds === 0 && this._nanos === 0;
    }

    /**
     * Checks if this duration is negative, excluding zero.
     *
     * A {@link Duration} represents a directed distance between two points on
     * the time-line and can therefore be positive, zero or negative.
     * This method checks whether the length is less than zero.
     *
     * @return {boolean} true if this duration has a total length less than zero
     */
    isNegative() {
        return this._seconds < 0;
    }

    //-----------------------------------------------------------------------
    /**
     * Gets the number of seconds in this duration.
     *
     * The length of the duration is stored using two fields - seconds and nanoseconds.
     * The nanoseconds part is a value from 0 to 999,999,999 that is an adjustment to
     * the length in seconds.
     * The total duration is defined by calling this method and {@link getNano}.
     *
     * A {@link Duration} represents a directed distance between two points on the time-line.
     * A negative duration is expressed by the negative sign of the seconds part.
     * A duration of -1 nanosecond is stored as -1 seconds plus 999,999,999 nanoseconds.
     *
     * @return {number} the whole seconds part of the length of the duration, positive or negative
     */
    seconds() {
        return this._seconds;
    }

    /**
     * Gets the number of nanoseconds within the second in this duration.
     *
     * The length of the duration is stored using two fields - seconds and nanoseconds.
     * The nanoseconds part is a value from 0 to 999,999,999 that is an adjustment to
     * the length in seconds.
     * The total duration is defined by calling this method and {@link getSeconds}.
     *
     * A {@link Duration} represents a directed distance between two points on the time-line.
     * A negative duration is expressed by the negative sign of the seconds part.
     * A duration of -1 nanosecond is stored as -1 seconds plus 999,999,999 nanoseconds.
     *
     * @return {number} the nanoseconds within the second part of the length of the duration, from 0 to 999,999,999
     */
    nano() {
        return this._nanos;
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this duration with the specified amount of seconds.
     *
     * This returns a duration with the specified seconds, retaining the
     * nano-of-second part of this duration.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Number} seconds - the seconds to represent, may be negative
     * @return {Duration} based on this period with the requested seconds, not null
     */
    withSeconds(seconds) {
        return Duration._create(seconds, this._nanos);
    }

    /**
     * Returns a copy of this duration with the specified nano-of-second.
     *
     * This returns a duration with the specified nano-of-second, retaining the
     * seconds part of this duration.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Number} nanoOfSecond - the nano-of-second to represent, from 0 to 999,999,999
     * @return {Duration} based on this period with the requested nano-of-second, not null
     * @throws DateTimeException if the nano-of-second is invalid
     */
    withNanos(nanoOfSecond) {
        ChronoField.NANO_OF_SECOND.checkValidIntValue(nanoOfSecond);
        return Duration._create(this._seconds, nanoOfSecond);
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this duration with the specified duration added.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Duration} duration - the duration to add, positive or negative, not null
     * @return {Duration} based on this duration with the specified duration added, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    plusDuration(duration) {
        requireNonNull(duration, 'duration');
        return this.plus(duration.seconds(), duration.nano());
    }


    /**
     * function overloading for {@link Duration.plus}
     *
     * if called with 1 arguments, then {@link Duration.plusDuration} is executed.
     *
     * if called with 2 arguments and second argument is an instance of TemporalUnit, then {@link Duration.plusAmountUnit} is executed.
     *
     * Otherwise {@link Duration.plusSecondsNanos} is executed.
     *
     * @param {!(Duration|number)} durationOrNumber
     * @param {!TemporalUnit|number} unitOrNumber
     * @returns {Duration}
     */
    plus(durationOrNumber, unitOrNumber) {
        if (arguments.length === 1) {
            return this.plusDuration(durationOrNumber);
        }
        else if (arguments.length === 2 && unitOrNumber instanceof TemporalUnit) {
            return this.plusAmountUnit(durationOrNumber, unitOrNumber);
        } else {
            return this.plusSecondsNanos(durationOrNumber, unitOrNumber);
        }
    }

    /**
     * Returns a copy of this duration with the specified duration added.
     *
     * The duration amount is measured in terms of the specified unit.
     * Only a subset of units are accepted by this method.
     * The unit must either have an exact duration (see {@link TemporalUnit#isDurationEstimated}) or
     * be {@link ChronoUnit#DAYS} which is treated as 24 hours. Other units throw an exception.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Number} amountToAdd - the amount to add, measured in terms of the unit, positive or negative
     * @param {TemporalUnit} unit - the unit that the amount is measured in, must have an exact duration, not null
     * @return {Duration} based on this duration with the specified duration added, not null
     * @throws UnsupportedTemporalTypeException if the unit is not supported
     * @throws ArithmeticException if numeric overflow occurs
     */
    plusAmountUnit(amountToAdd, unit) {
        requireNonNull(amountToAdd, 'amountToAdd');
        requireNonNull(unit, 'unit');
        if (unit === ChronoUnit.DAYS) {
            return this.plusSecondsNanos(MathUtil.safeMultiply(amountToAdd, LocalTime.SECONDS_PER_DAY), 0);
        }
        if (unit.isDurationEstimated()) {
            throw new UnsupportedTemporalTypeException('Unit must not have an estimated duration');
        }
        if (amountToAdd === 0) {
            return this;
        }
        if (unit instanceof ChronoUnit) {
            switch (unit) {
                case ChronoUnit.NANOS: return this.plusNanos(amountToAdd);
                case ChronoUnit.MICROS: return this.plusSecondsNanos(MathUtil.intDiv(amountToAdd, (1000000 * 1000)) * 1000, MathUtil.intMod(amountToAdd, (1000000 * 1000)) * 1000);
                case ChronoUnit.MILLIS: return this.plusMillis(amountToAdd);
                case ChronoUnit.SECONDS: return this.plusSeconds(amountToAdd);
            }
            return this.plusSecondsNanos(MathUtil.safeMultiply(unit.duration().seconds(), amountToAdd), 0);
        }
        const duration = unit.duration().multipliedBy(amountToAdd);
        return this.plusSecondsNanos(duration.seconds(), duration.nano());
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this duration with the specified duration in 24 hour days added.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Number} daysToAdd - the days to add, positive or negative
     * @return {Duration} based on this duration with the specified days added, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    plusDays(daysToAdd) {
        return this.plusSecondsNanos(MathUtil.safeMultiply(daysToAdd, LocalTime.SECONDS_PER_DAY), 0);
    }

    /**
     * Returns a copy of this duration with the specified duration in hours added.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Number} hoursToAdd - the hours to add, positive or negative
     * @return {Duration} based on this duration with the specified hours added, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    plusHours(hoursToAdd) {
        return this.plusSecondsNanos(MathUtil.safeMultiply(hoursToAdd, LocalTime.SECONDS_PER_HOUR), 0);
    }

    /**
     * Returns a copy of this duration with the specified duration in minutes added.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Number} minutesToAdd - the minutes to add, positive or negative
     * @return {Duration} based on this duration with the specified minutes added, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    plusMinutes(minutesToAdd) {
        return this.plusSecondsNanos(MathUtil.safeMultiply(minutesToAdd, LocalTime.SECONDS_PER_MINUTE), 0);
    }

    /**
     * Returns a copy of this duration with the specified duration in seconds added.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Number} secondsToAdd - the seconds to add, positive or negative
     * @return {Duration} based on this duration with the specified seconds added, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    plusSeconds(secondsToAdd) {
        return this.plusSecondsNanos(secondsToAdd, 0);
    }

    /**
     * Returns a copy of this duration with the specified duration in milliseconds added.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Number} millisToAdd - the milliseconds to add, positive or negative
     * @return {Duration} based on this duration with the specified milliseconds added, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    plusMillis(millisToAdd) {
        return this.plusSecondsNanos(MathUtil.intDiv(millisToAdd, 1000), MathUtil.intMod(millisToAdd, 1000) * 1000000);
    }

    /**
     * Returns a copy of this duration with the specified duration in nanoseconds added.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Number} nanosToAdd - the nanoseconds to add, positive or negative
     * @return {Duration} based on this duration with the specified nanoseconds added, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    plusNanos(nanosToAdd) {
        return this.plusSecondsNanos(0, nanosToAdd);
    }

    /**
     * Returns a copy of this duration with the specified duration added.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Number} secondsToAdd - the seconds to add, positive or negative
     * @param {Number} nanosToAdd - the nanos to add, positive or negative
     * @return {Duration} based on this duration with the specified seconds added, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    plusSecondsNanos(secondsToAdd, nanosToAdd) {
        requireNonNull(secondsToAdd, 'secondsToAdd');
        requireNonNull(nanosToAdd, 'nanosToAdd');
        if (secondsToAdd === 0 && nanosToAdd === 0) {
            return this;
        }
        let epochSec = MathUtil.safeAdd(this._seconds, secondsToAdd);
        epochSec = MathUtil.safeAdd(epochSec, MathUtil.intDiv(nanosToAdd, LocalTime.NANOS_PER_SECOND));
        nanosToAdd = MathUtil.intMod(nanosToAdd, LocalTime.NANOS_PER_SECOND);
        const nanoAdjustment = MathUtil.safeAdd(this._nanos, nanosToAdd);  // safe int+LocalTime.NANOS_PER_SECOND
        return Duration.ofSeconds(epochSec, nanoAdjustment);
    }

    //-----------------------------------------------------------------------
    /**
     * function overloading for {@link Duration.minus}
     *
     * if called with 1 arguments and first argument is an instance of Duration, then {@link Duration.minusDuration} is executed.
     *
     * Otherwise {@link Duration.minusAmountUnit} is executed.
     *
     * @param {!(Duration|number)} durationOrNumber
     * @param {?TemporalUnit} unit
     * @return {Duration}
     */
    minus(durationOrNumber, unit) {
        if (arguments.length === 1) {
            return this.minusDuration(durationOrNumber);
        } else {
            return this.minusAmountUnit(durationOrNumber, unit);
        }
    }

    /**
     * Returns a copy of this duration with the specified duration subtracted.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Duration} duration - the duration to subtract, positive or negative, not null
     * @return {Duration} based on this duration with the specified duration subtracted, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    minusDuration(duration) {
        requireNonNull(duration, 'duration');
        const secsToSubtract = duration.seconds();
        const nanosToSubtract = duration.nano();
        if (secsToSubtract === MIN_SAFE_INTEGER) {
            return this.plus(MAX_SAFE_INTEGER, -nanosToSubtract);
        }
        return this.plus(-secsToSubtract, -nanosToSubtract);
    }

    /**
     * Returns a copy of this duration with the specified duration subtracted.
     *
     * The duration amount is measured in terms of the specified unit.
     * Only a subset of units are accepted by this method.
     * The unit must either have an exact duration (see {@link TemporalUnit#isDurationEstimated}) or
     * be {@link ChronoUnit#DAYS} which is treated as 24 hours. Other units throw an exception.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Number} amountToSubtract - the amount to subtract, measured in terms of the unit, positive or negative
     * @param {TemporalUnit} unit - the unit that the amount is measured in, must have an exact duration, not null
     * @return {Duration} based on this duration with the specified duration subtracted, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    minusAmountUnit(amountToSubtract, unit) {
        requireNonNull(amountToSubtract, 'amountToSubtract');
        requireNonNull(unit, 'unit');
        return (amountToSubtract === MIN_SAFE_INTEGER ? this.plusAmountUnit(MAX_SAFE_INTEGER, unit) : this.plusAmountUnit(-amountToSubtract, unit));
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this duration with the specified duration in 24 hour days subtracted.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Number} daysToSubtract - the days to subtract, positive or negative
     * @return {Duration} based on this duration with the specified days subtracted, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    minusDays(daysToSubtract) {
        return (daysToSubtract === MIN_SAFE_INTEGER ? this.plusDays(MAX_SAFE_INTEGER) : this.plusDays(-daysToSubtract));
    }

    /**
     * Returns a copy of this duration with the specified duration in hours subtracted.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Number} hoursToSubtract - the hours to subtract, positive or negative
     * @return {Duration} based on this duration with the specified hours subtracted, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    minusHours(hoursToSubtract) {
        return (hoursToSubtract === MIN_SAFE_INTEGER ? this.plusHours(MAX_SAFE_INTEGER) : this.plusHours(-hoursToSubtract));
    }

    /**
     * Returns a copy of this duration with the specified duration in minutes subtracted.
     *
     * The number of hours is multiplied by 60 to obtain the number of seconds to subtract.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Number} minutesToSubtract - the minutes to subtract, positive or negative
     * @return {Duration} based on this duration with the specified minutes subtracted, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    minusMinutes(minutesToSubtract) {
        return (minutesToSubtract === MIN_SAFE_INTEGER ? this.plusMinutes(MAX_SAFE_INTEGER) : this.plusMinutes(-minutesToSubtract));
    }

    /**
     * Returns a copy of this duration with the specified duration in seconds subtracted.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Number} secondsToSubtract - the seconds to subtract, positive or negative
     * @return {Duration} based on this duration with the specified seconds subtracted, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    minusSeconds(secondsToSubtract) {
        return (secondsToSubtract === MIN_SAFE_INTEGER ? this.plusSeconds(MAX_SAFE_INTEGER) : this.plusSeconds(-secondsToSubtract));
    }

    /**
     * Returns a copy of this duration with the specified duration in milliseconds subtracted.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Number} millisToSubtract - the milliseconds to subtract, positive or negative
     * @return {Duration} based on this duration with the specified milliseconds subtracted, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    minusMillis(millisToSubtract) {
        return (millisToSubtract === MIN_SAFE_INTEGER ? this.plusMillis(MAX_SAFE_INTEGER) : this.plusMillis(-millisToSubtract));
    }

    /**
     * Returns a copy of this duration with the specified duration in nanoseconds subtracted.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Number} nanosToSubtract - the nanoseconds to subtract, positive or negative
     * @return {Duration} based on this duration with the specified nanoseconds subtracted, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    minusNanos(nanosToSubtract) {
        return (nanosToSubtract === MIN_SAFE_INTEGER ? this.plusNanos(MAX_SAFE_INTEGER) : this.plusNanos(-nanosToSubtract));
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this duration multiplied by the scalar.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Number} multiplicand - the value to multiply the duration by, positive or negative
     * @return {Duration} based on this duration multiplied by the specified scalar, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    multipliedBy(multiplicand) {
        if (multiplicand === 0) {
            return Duration.ZERO;
        }
        if (multiplicand === 1) {
            return this;
        }
        let secs = MathUtil.safeMultiply(this._seconds, multiplicand);
        let nos = MathUtil.safeMultiply(this._nanos, multiplicand);
        secs = secs + MathUtil.intDiv(nos, LocalTime.NANOS_PER_SECOND);
        nos = MathUtil.intMod(nos, LocalTime.NANOS_PER_SECOND);
        return Duration.ofSeconds(secs, nos);
    }

    /**
     * Returns a copy of this duration divided by the specified value.
     *
     * In opposite to the threeten implementation the division is realized by floating point not by
     * fixed point arithmetic. Expect floating point rounding errors for {@link Duration.dividedBy}.
     *
     * @param {Number} divisor - the value to divide the duration by, positive or negative, not zero
     * @return {Duration} based on this duration divided by the specified divisor, not null
     * @throws ArithmeticException if the divisor is zero or if numeric overflow occurs
     */
    dividedBy(divisor) {
        if (divisor === 0) {
            throw new ArithmeticException('Cannot divide by zero');
        }
        if (divisor === 1) {
            return this;
        }
        const secs = MathUtil.intDiv(this._seconds, divisor);
        const secsMod = MathUtil.roundDown(((this._seconds/ divisor) - secs) * LocalTime.NANOS_PER_SECOND);
        let nos = MathUtil.intDiv(this._nanos, divisor);
        nos = secsMod + nos;
        return Duration.ofSeconds(secs, nos);
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this duration with the length negated.
     *
     * This method swaps the sign of the total length of this duration.
     * For example, {@link PT1.3S} will be returned as {@link PT-1.3S}.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @return {Duration} based on this duration with the amount negated, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    negated() {
        return this.multipliedBy(-1);
    }

    /**
     * Returns a copy of this duration with a positive length.
     *
     * This method returns a positive duration by effectively removing the sign from any negative total length.
     * For example, {@link PT-1.3S} will be returned as {@link PT1.3S}.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @return {Duration} based on this duration with an absolute length, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    abs() {
        return this.isNegative() ? this.negated() : this;
    }

    //-------------------------------------------------------------------------
    /**
     * Adds this duration to the specified temporal object.
     *
     * This returns a temporal object of the same observable type as the input
     * with this duration added.
     *
     * In most cases, it is clearer to reverse the calling pattern by using
     * {@link Temporal#plus}.
     * <pre>
     *   // these two lines are equivalent, but the second approach is recommended
     *   dateTime = thisDuration.addTo(dateTime);
     *   dateTime = dateTime.plus(thisDuration);
     * </pre>
     *
     * The calculation will add the seconds, then nanos.
     * Only non-zero amounts will be added.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Temporal} temporal - the temporal object to adjust, not null
     * @return {Temporal} an object of the same type with the adjustment made, not null
     * @throws DateTimeException if unable to add
     * @throws ArithmeticException if numeric overflow occurs
     */
    addTo(temporal) {
        requireNonNull(temporal, 'temporal');
        if (this._seconds !== 0) {
            temporal = temporal.plus(this._seconds, ChronoUnit.SECONDS);
        }
        if (this._nanos !== 0) {
            temporal = temporal.plus(this._nanos, ChronoUnit.NANOS);
        }
        return temporal;
    }

    /**
     * Subtracts this duration from the specified temporal object.
     *
     * This returns a temporal object of the same observable type as the input
     * with this duration subtracted.
     *
     * In most cases, it is clearer to reverse the calling pattern by using
     * {@link Temporal#minus}.
     * <pre>
     *   // these two lines are equivalent, but the second approach is recommended
     *   dateTime = thisDuration.subtractFrom(dateTime);
     *   dateTime = dateTime.minus(thisDuration);
     * </pre>
     *
     * The calculation will subtract the seconds, then nanos.
     * Only non-zero amounts will be added.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Temporal} temporal - the temporal object to adjust, not null
     * @return {Temporal} an object of the same type with the adjustment made, not null
     * @throws DateTimeException if unable to subtract
     * @throws ArithmeticException if numeric overflow occurs
     */
    subtractFrom(temporal) {
        requireNonNull(temporal, 'temporal');
        if (this._seconds !== 0) {
            temporal = temporal.minus(this._seconds, ChronoUnit.SECONDS);
        }
        if (this._nanos !== 0) {
            temporal = temporal.minus(this._nanos, ChronoUnit.NANOS);
        }
        return temporal;
    }

    //-----------------------------------------------------------------------
    /**
     * Gets the number of days in this duration.
     *
     * This returns the total number of days in the duration by dividing the
     * number of seconds by 86400.
     * This is based on the standard definition of a day as 24 hours.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @return {number} the number of days in the duration, may be negative
     */
    toDays() {
        return MathUtil.intDiv(this._seconds, LocalTime.SECONDS_PER_DAY);
    }

    /**
     * Gets the number of hours in this duration.
     *
     * This returns the total number of hours in the duration by dividing the
     * number of seconds by 3600.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @return {number} the number of hours in the duration, may be negative
     */
    toHours() {
        return MathUtil.intDiv(this._seconds, LocalTime.SECONDS_PER_HOUR);
    }

    /**
     * Gets the number of minutes in this duration.
     *
     * This returns the total number of minutes in the duration by dividing the
     * number of seconds by 60.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @return {number} the number of minutes in the duration, may be negative
     */
    toMinutes() {
        return MathUtil.intDiv(this._seconds, LocalTime.SECONDS_PER_MINUTE);
    }

    /**
     * Converts this duration to the total length in milliseconds.
     *
     * If this duration is too large to fit in a `long` milliseconds, then an
     * exception is thrown.
     *
     * If this duration has greater than millisecond precision, then the conversion
     * will drop any excess precision information as though the amount in nanoseconds
     * was subject to integer division by one million.
     *
     * @return {number} the total length of the duration in milliseconds
     * @throws ArithmeticException if numeric overflow occurs
     */
    toMillis() {
        let millis = Math.round(MathUtil.safeMultiply(this._seconds, 1000));
        millis = MathUtil.safeAdd(millis, MathUtil.intDiv(this._nanos, 1000000));
        return millis;
    }

    /**
     * Converts this duration to the total length in nanoseconds expressed as a `long`.
     *
     * If this duration is too large to fit in a `long` nanoseconds, then an
     * exception is thrown.
     *
     * @return {number} the total length of the duration in nanoseconds
     * @throws ArithmeticException if numeric overflow occurs
     */
    toNanos() {
        let totalNanos = MathUtil.safeMultiply(this._seconds, LocalTime.NANOS_PER_SECOND);
        totalNanos = MathUtil.safeAdd(totalNanos, this._nanos);
        return totalNanos;
    }

    //-----------------------------------------------------------------------
    /**
     * Compares this duration to the specified {@link Duration}.
     *
     * The comparison is based on the total length of the durations.
     *
     * @param {Duration} otherDuration - the other duration to compare to, not null
     * @return {number} the comparator value, negative if less, positive if greater
     */
    compareTo(otherDuration) {
        requireNonNull(otherDuration, 'otherDuration');
        requireInstance(otherDuration, Duration, 'otherDuration');
        const cmp = MathUtil.compareNumbers(this._seconds, otherDuration.seconds());
        if (cmp !== 0) {
            return cmp;
        }
        return this._nanos - otherDuration.nano();
    }

    //-----------------------------------------------------------------------
    /**
     * Checks if this duration is equal to the specified {@link Duration}.
     *
     * The comparison is based on the total length of the durations.
     *
     * @param {*} otherDuration - the other duration, null returns false
     * @return {boolean} true if the other duration is equal to this one
     */
    equals(otherDuration) {
        if (this === otherDuration) {
            return true;
        }
        if (otherDuration instanceof Duration) {
            return this.seconds() === otherDuration.seconds() &&
                   this.nano() === otherDuration.nano();
        }
        return false;
    }

    //-----------------------------------------------------------------------
    /**
     * A string representation of this duration using ISO-8601 seconds
     * based representation, such as {@link PT8H6M12.345S}.
     *
     * The format of the returned string will be {@link PTnHnMnS}, where n is
     * the relevant hours, minutes or seconds part of the duration.
     * Any fractional seconds are placed after a decimal point in the seconds section.
     * If a section has a zero value, it is omitted.
     * The hours, minutes and seconds will all have the same sign.
     *
     * Examples:
     * <pre>
     *    "20.345 seconds"                 -> "PT20.345S
     *    "15 minutes" (15 * 60 seconds)   -> "PT15M"
     *    "10 hours" (10 * 3600 seconds)   -> "PT10H"
     *    "2 days" (2 * 86400 seconds)     -> "PT48H"
     * </pre>
     * Note that multiples of 24 hours are not output as days to avoid confusion
     * with {@link Period}.
     *
     * @return {string} an ISO-8601 representation of this duration, not null
     */
    toString() {
        if (this === Duration.ZERO) {
            return 'PT0S';
        }
        const hours = MathUtil.intDiv(this._seconds, LocalTime.SECONDS_PER_HOUR);
        const minutes = MathUtil.intDiv(MathUtil.intMod(this._seconds, LocalTime.SECONDS_PER_HOUR), LocalTime.SECONDS_PER_MINUTE);
        const secs = MathUtil.intMod(this._seconds, LocalTime.SECONDS_PER_MINUTE);
        let rval = 'PT';
        if (hours !== 0) {
            rval += `${hours}H`;
        }
        if (minutes !== 0) {
            rval += `${minutes}M`;
        }
        if (secs === 0 && this._nanos === 0 && rval.length > 2) {
            return rval;
        }
        if (secs < 0 && this._nanos > 0) {
            if (secs === -1) {
                rval += '-0';
            } else {
                rval += secs + 1;
            }
        } else {
            rval += secs;
        }
        if (this._nanos > 0) {
            rval += '.';
            let nanoString;
            if (secs < 0) {
                nanoString = `${2 * LocalTime.NANOS_PER_SECOND - this._nanos}`;
            } else {
                nanoString = `${LocalTime.NANOS_PER_SECOND + this._nanos}`;
            }
            // remove the leading '1'
            nanoString = nanoString.slice(1, nanoString.length);
            rval += nanoString;
            while (rval.charAt(rval.length - 1) === '0') {
                rval = rval.slice(0, rval.length - 1);
            }
        }
        rval += 'S';
        return rval;
    }

    /**
     *
     * @return {string} same as {@link Duration.toString}
     */
    toJSON() {
        return this.toString();
    }

}

export function _init() {
    /**
     * Constant for a duration of zero.
     */
    Duration.ZERO = new Duration(0, 0);
}
/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
/***
 * Base class for a pseudo enum
 */
export class Enum {
    constructor(name){
        this._name = name;
    }

    equals(other){
        return this === other;
    }

    toString() {
        return this._name;
    }

    /**
     * toJSON() use by JSON.stringify
     * delegates to toString()
     *
     * @return {string}
     */
    toJSON() {
        return this.toString();
    }
}
/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { requireNonNull, requireInstance } from './assert';
import { DateTimeException, UnsupportedTemporalTypeException } from './errors';

import { Clock } from './Clock';
import { LocalTime } from './LocalTime';
import { ZonedDateTime } from './ZonedDateTime';
import { MathUtil } from './MathUtil';
import { OffsetDateTime } from './OffsetDateTime';

import { Temporal } from './temporal/Temporal';
import { ChronoField } from './temporal/ChronoField';
import { ChronoUnit } from './temporal/ChronoUnit';
import { TemporalQueries } from './temporal/TemporalQueries';
import { TemporalUnit } from './temporal/TemporalUnit';
import { createTemporalQuery } from './temporal/TemporalQuery';
import { DateTimeFormatter } from './format/DateTimeFormatter';

const NANOS_PER_MILLI = 1000000;

/**
 * An instantaneous point on the time-line.
 *
 * This class models a single instantaneous point on the time-line.
 * This might be used to record event time-stamps in the application.
 *
 * Time-scale
 *
 * The length of the solar day is the standard way that humans measure time.
 * This has traditionally been subdivided into 24 hours of 60 minutes of 60 seconds,
 * forming a 86400 second day.
 *
 * Modern timekeeping is based on atomic clocks which precisely define an SI second
 * relative to the transitions of a Caesium atom. The length of an SI second was defined
 * to be very close to the 86400th fraction of a day.
 *
 * Unfortunately, as the Earth rotates the length of the day varies.
 * In addition, over time the average length of the day is getting longer as the Earth slows.
 * As a result, the length of a solar day in 2012 is slightly longer than 86400 SI seconds.
 * The actual length of any given day and the amount by which the Earth is slowing
 * are not predictable and can only be determined by measurement.
 * The UT1 time-scale captures the accurate length of day, but is only available some
 * time after the day has completed.
 *
 * The UTC time-scale is a standard approach to bundle up all the additional fractions
 * of a second from UT1 into whole seconds, known as *leap-seconds*.
 * A leap-second may be added or removed depending on the Earth's rotational changes.
 * As such, UTC permits a day to have 86399 SI seconds or 86401 SI seconds where
 * necessary in order to keep the day aligned with the Sun.
 *
 * The modern UTC time-scale was introduced in 1972, introducing the concept of whole leap-seconds.
 * Between 1958 and 1972, the definition of UTC was complex, with minor sub-second leaps and
 * alterations to the length of the notional second. As of 2012, discussions are underway
 * to change the definition of UTC again, with the potential to remove leap seconds or
 * introduce other changes.
 *
 * Given the complexity of accurate timekeeping described above, this Java API defines
 * its own time-scale, the *Java Time-Scale*.
 *
 * The Java Time-Scale divides each calendar day into exactly 86400
 * subdivisions, known as seconds.  These seconds may differ from the
 * SI second.  It closely matches the de facto international civil time
 * scale, the definition of which changes from time to time.
 *
 * The Java Time-Scale has slightly different definitions for different
 * segments of the time-line, each based on the consensus international
 * time scale that is used as the basis for civil time. Whenever the
 * internationally-agreed time scale is modified or replaced, a new
 * segment of the Java Time-Scale must be defined for it.  Each segment
 * must meet these requirements:
 *
 * * the Java Time-Scale shall closely match the underlying international
 *   civil time scale;
 * * the Java Time-Scale shall exactly match the international civil
 *   time scale at noon each day;
 * * the Java Time-Scale shall have a precisely-defined relationship to
 *   the international civil time scale.
 *
 * There are currently, as of 2013, two segments in the Java time-scale.
 *
 * For the segment from 1972-11-03 (exact boundary discussed below) until
 * further notice, the consensus international time scale is UTC (with
 * leap seconds).  In this segment, the Java Time-Scale is identical to
 * [UTC-SLS](http://www.cl.cam.ac.uk/~mgk25/time/utc-sls/).
 * This is identical to UTC on days that do not have a leap second.
 * On days that do have a leap second, the leap second is spread equally
 * over the last 1000 seconds of the day, maintaining the appearance of
 * exactly 86400 seconds per day.
 *
 * For the segment prior to 1972-11-03, extending back arbitrarily far,
 * the consensus international time scale is defined to be UT1, applied
 * proleptically, which is equivalent to the (mean) solar time on the
 * prime meridian (Greenwich). In this segment, the Java Time-Scale is
 * identical to the consensus international time scale. The exact
 * boundary between the two segments is the instant where UT1 = UTC
 * between 1972-11-03T00:00 and 1972-11-04T12:00.
 *
 * Implementations of the Java time-scale using the JSR-310 API are not
 * required to provide any clock that is sub-second accurate, or that
 * progresses monotonically or smoothly. Implementations are therefore
 * not required to actually perform the UTC-SLS slew or to otherwise be
 * aware of leap seconds. JSR-310 does, however, require that
 * implementations must document the approach they use when defining a
 * clock representing the current instant.
 * See {@link Clock} for details on the available clocks.
 *
 * The Java time-scale is used for all date-time classes.
 * This includes {@link Instant}, {@link LocalDate}, {@link LocalTime}, {@link OffsetDateTime},
 * {@link ZonedDateTime} and {@link Duration}.
 *
 * ### Static properties of Class {@link Instant}
 *
 * Instant.EPOCH
 *
 * Instant.MIN
 *
 * Instant.MAX
 *
 * Instant.MIN_SECONDS
 *
 * Instant.MAX_SECONDS
 *
 */
export class Instant extends Temporal {

    /**
     * Obtains the current instant from the system clock, or if specified
     * the current instant from the specified clock.
     *
     * This will query the specified clock to obtain the current time.
     *
     * @param {Clock} [clock=Clock.systemUTC()] - the clock to use, defaults to the system clock
     * @return {Instant} the current instant, not null
     */
    static now(clock = Clock.systemUTC()){
        return clock.instant();
    }

    /**
     * Obtains an instance of {@link Instant} using seconds from the
     * epoch of 1970-01-01T00:00:00Z.
     *
     * @param {number} epochSecond - the number of seconds from 1970-01-01T00:00:00Z
     * @param {number} nanoAdjustment nanoseconds start from the start of epochSecond, if null the nanosecond field is set to zero.
     * @return {Instant} an instant, not null
     * @throws DateTimeException if the instant exceeds the maximum or minimum instant
     */
    static ofEpochSecond(epochSecond, nanoAdjustment=0){
        const secs = epochSecond + MathUtil.floorDiv(nanoAdjustment, LocalTime.NANOS_PER_SECOND);
        const nos = MathUtil.floorMod(nanoAdjustment, LocalTime.NANOS_PER_SECOND);
        return Instant._create(secs, nos);
    }

    /**
     * Obtains an instance of {@link Instant} using milliseconds from the
     * epoch of 1970-01-01T00:00:00Z.
     *
     * The seconds and nanoseconds are extracted from the specified milliseconds.
     *
     * @param {number} epochMilli - the number of milliseconds from 1970-01-01T00:00:00Z
     * @return {Instant} an instant, not null
     * @throws DateTimeException if the instant exceeds the maximum or minimum instant
     */
    static ofEpochMilli(epochMilli) {
        const secs = MathUtil.floorDiv(epochMilli, 1000);
        const mos = MathUtil.floorMod(epochMilli, 1000);
        return Instant._create(secs, mos * 1000000);
    }

    /**
     * Obtains an instance of {@link Instant} using microseconds from the
     * epoch of 1970-01-01T00:00:00Z.
     *
     * @param {number} epochMicro - the number of microseconds from 1970-01-01T00:00:00Z
     * @return {Instant} an instant, not null
     * @throws DateTimeException if the instant exceeds the maximum or minimum instant
     */
    static ofEpochMicro(epochMicro) {
        const secs = MathUtil.floorDiv(epochMicro, 1000000);
        const mos = MathUtil.floorMod(epochMicro, 1000000);
        return Instant._create(secs, mos * 1000);
    }

    /**
     * Obtains an instance of {@link Instant} from a temporal object.
     *
     * A {@link TemporalAccessor} represents some form of date and time information.
     * This factory converts the arbitrary temporal object to an instance of {@link Instant}.
     *
     * The conversion extracts the {@link ChronoField#INSTANT_SECONDS}
     * and {@link ChronoField#NANO_OF_SECOND} fields.
     *
     * This method matches the signature of the functional interface {@link TemporalQuery}
     * allowing it to be used as a query via method reference, {@link Instant::from}.
     *
     * @param {TemporalAccessor} temporal - the temporal object to convert, not null
     * @return {Instant} the instant, not null
     * @throws DateTimeException if unable to convert to an {@link Instant}
     */
    static from(temporal) {
        try {
            const instantSecs = temporal.getLong(ChronoField.INSTANT_SECONDS);
            const nanoOfSecond = temporal.get(ChronoField.NANO_OF_SECOND);
            return Instant.ofEpochSecond(instantSecs, nanoOfSecond);
        } catch (ex) {
            throw new DateTimeException(`Unable to obtain Instant from TemporalAccessor: ${ 
                temporal}, type ${typeof temporal}`, ex);
        }
    }

    /**
     * Obtains an instance of {@link Instant} from a text string such as
     * `2007-12-03T10:15:30.000Z`.
     *
     * The string must represent a valid instant in UTC and is parsed using
     * {@link DateTimeFormatter#ISO_INSTANT}.
     *
     * @param {string} text - the text to parse, not null
     * @return {Instant} the parsed instant, not null
     * @throws DateTimeParseException if the text cannot be parsed
     */
    static parse(text) {
        return DateTimeFormatter.ISO_INSTANT.parse(text, Instant.FROM);
    }

    /**
     *
     * @param {number} seconds
     * @param {number} nanoOfSecond
     * @returns {Instant}
     * @private
     */
    static _create(seconds, nanoOfSecond){
        if(seconds === 0 && nanoOfSecond === 0){
            return Instant.EPOCH;
        }
        return new Instant(seconds, nanoOfSecond);
    }

    /**
     *
     * @param {number} seconds
     * @param {number} nanoOfSecond
     * @private
     */
    static _validate(seconds, nanoOfSecond){
        if (seconds < Instant.MIN_SECONDS || seconds > Instant.MAX_SECONDS) {
            throw new DateTimeException('Instant exceeds minimum or maximum instant');
        }
        if (nanoOfSecond < 0 || nanoOfSecond > LocalTime.NANOS_PER_SECOND) {
            throw new DateTimeException('Instant exceeds minimum or maximum instant');
        }
    }

    /**
     *
     * @param {number} seconds
     * @param {number} nanoOfSecond
     * @private
     */
    constructor(seconds, nanoOfSecond){
        super();
        Instant._validate(seconds, nanoOfSecond);
        this._seconds = MathUtil.safeToInt(seconds);
        this._nanos = MathUtil.safeToInt(nanoOfSecond);
    }

    /**
     * Checks if the specified field is supported.
     *
     * This checks if this instant can be queried for the specified field.
     * If false, then calling {@link range} and {@link get} will throw an exception.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields are:
     *
     * * {@link NANO_OF_SECOND}
     * * {@link MICRO_OF_SECOND}
     * * {@link MILLI_OF_SECOND}
     * * {@link INSTANT_SECONDS}
     *
     * All other {@link ChronoField} instances will return false.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.isSupportedBy}
     * passing `this` as the argument.
     * Whether the field is supported is determined by the field.
     *
     * @param {TemporalField|TemporalUnit} fieldOrUnit - the field to check, null returns false
     * @return {boolean} true if the field is supported on this instant, false if not
     */
    isSupported(fieldOrUnit) {
        if (fieldOrUnit instanceof ChronoField) {
            return fieldOrUnit === ChronoField.INSTANT_SECONDS || fieldOrUnit === ChronoField.NANO_OF_SECOND || fieldOrUnit === ChronoField.MICRO_OF_SECOND || fieldOrUnit === ChronoField.MILLI_OF_SECOND;
        }
        if (fieldOrUnit instanceof ChronoUnit) {
            return fieldOrUnit.isTimeBased() || fieldOrUnit === ChronoUnit.DAYS;
        }
        return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
    }

    /**
     * Gets the range of valid values for the specified field.
     *
     * The range object expresses the minimum and maximum valid values for a field.
     * This instant is used to enhance the accuracy of the returned range.
     * If it is not possible to return the range, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields (see {@link isSupported}) will return
     * appropriate range instances.
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.rangeRefinedBy}
     * passing `this` as the argument.
     * Whether the range can be obtained is determined by the field.
     *
     * @param {TemporalField} field - the field to query the range for, not null
     * @return {ValueRange} the range of valid values for the field, not null
     * @throws DateTimeException if the range for the field cannot be obtained
     */
    range(field) {
        return super.range(field);
    }

    /**
     * Gets the value of the specified field from this instant as an `int`.
     *
     * This queries this instant for the value for the specified field.
     * The returned value will always be within the valid range of values for the field.
     * If it is not possible to return the value, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields (see {@link isSupported}) will return valid
     * values based on this date-time, except {@link INSTANT_SECONDS} which is too
     * large to fit in an `int` and throws a {@link DateTimeException}.
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.getFrom}
     * passing `this` as the argument. Whether the value can be obtained,
     * and what the value represents, is determined by the field.
     *
     * @param {TemporalField} field - the field to get, not null
     * @return {number} the value for the field
     * @throws DateTimeException if a value for the field cannot be obtained
     * @throws ArithmeticException if numeric overflow occurs
     */
    get(field) {
        return this.getLong(field);
    }

    /**
     * Gets the value of the specified field from this instant as a `long`.
     *
     * This queries this instant for the value for the specified field.
     * If it is not possible to return the value, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields (see {@link isSupported}) will return valid
     * values based on this date-time.
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.getFrom}
     * passing `this` as the argument. Whether the value can be obtained,
     * and what the value represents, is determined by the field.
     *
     * @param {TemporalField} field - the field to get, not null
     * @return {number} the value for the field
     * @throws DateTimeException if a value for the field cannot be obtained
     * @throws ArithmeticException if numeric overflow occurs
     */
    getLong(field) {
        if (field instanceof ChronoField) {
            switch (field) {
                case ChronoField.NANO_OF_SECOND: return this._nanos;
                case ChronoField.MICRO_OF_SECOND: return MathUtil.intDiv(this._nanos, 1000);
                case ChronoField.MILLI_OF_SECOND: return MathUtil.intDiv(this._nanos, NANOS_PER_MILLI);
                case ChronoField.INSTANT_SECONDS: return this._seconds;
            }
            throw new UnsupportedTemporalTypeException(`Unsupported field: ${field}`);
        }
        return field.getFrom(this);
    }

    /**
     * Gets the number of seconds from the Java epoch of 1970-01-01T00:00:00Z.
     *
     * The epoch second count is a simple incrementing count of seconds where
     * second 0 is 1970-01-01T00:00:00Z.
     * The nanosecond part of the day is returned by {@link getNanosOfSecond}.
     *
     * @return {number} the seconds from the epoch of 1970-01-01T00:00:00Z
     */
    epochSecond(){
        return this._seconds;
    }

    /**
     * Gets the number of nanoseconds, later along the time-line, from the start
     * of the second.
     *
     * The nanosecond-of-second value measures the total number of nanoseconds from
     * the second returned by {@link getEpochSecond}.
     *
     * @return {number} the nanoseconds within the second, always positive, never exceeds 999,999,999
     */
    nano(){
        return this._nanos;
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this instant with the specified field set to a new value.
     *
     * This returns a new {@link Instant}, based on this one, with the value
     * for the specified field changed.
     * If it is not possible to set the value, because the field is not supported or for
     * some other reason, an exception is thrown.
     *
     * If the field is a {@link ChronoField} then the adjustment is implemented here.
     * The supported fields behave as follows:
     *
     * * {@link NANO_OF_SECOND} -
     *  Returns an {@link Instant} with the specified nano-of-second.
     *  The epoch-second will be unchanged.
     * * {@link MICRO_OF_SECOND} -
     *  Returns an {@link Instant} with the nano-of-second replaced by the specified
     *  micro-of-second multiplied by 1,000. The epoch-second will be unchanged.
     * * {@link MILLI_OF_SECOND} -
     *  Returns an {@link Instant} with the nano-of-second replaced by the specified
     *  milli-of-second multiplied by 1,000,000. The epoch-second will be unchanged.
     * * {@link INSTANT_SECONDS} -
     *  Returns an {@link Instant} with the specified epoch-second.
     *  The nano-of-second will be unchanged.
     *
     *
     * In all cases, if the new value is outside the valid range of values for the field
     * then a {@link DateTimeException} will be thrown.
     *
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.adjustInto}
     * passing `this` as the argument. In this case, the field determines
     * whether and how to adjust the instant.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {TemporalField} field - the field to set in the result, not null
     * @param {number} newValue - the new value of the field in the result
     * @return {Instant} an {@link Instant} based on `this` with the specified field set, not null
     * @throws DateTimeException if the field cannot be set
     * @throws ArithmeticException if numeric overflow occurs
     */
    _withField(field, newValue) {
        requireNonNull(field, 'field');
        if (field instanceof ChronoField) {
            field.checkValidValue(newValue);
            switch (field) {
                case ChronoField.MILLI_OF_SECOND: {
                    const nval = newValue * NANOS_PER_MILLI;
                    return (nval !== this._nanos? Instant._create(this._seconds, nval) : this);
                }
                case ChronoField.MICRO_OF_SECOND: {
                    const nval = newValue * 1000;
                    return (nval !== this._nanos? Instant._create(this._seconds, nval) : this);
                }
                case ChronoField.NANO_OF_SECOND: return (newValue !== this._nanos? Instant._create(this._seconds, newValue) : this);
                case ChronoField.INSTANT_SECONDS: return (newValue !== this._seconds ? Instant._create(newValue, this._nanos) : this);
            }
            throw new UnsupportedTemporalTypeException(`Unsupported field: ${field}`);
        }
        return field.adjustInto(this, newValue);
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this {@link Instant} truncated to the specified unit.
     *
     * Truncating the instant returns a copy of the original with fields
     * smaller than the specified unit set to zero.
     * The fields are calculated on the basis of using a UTC offset as seen
     * in {@link toString}.
     * For example, truncating with {@link ChronoUnit#MINUTES} will
     * round down to the nearest minute, setting the seconds and nanoseconds to zero.
     *
     * The unit must have a duration (see {@link TemporalUnit#getDuration})
     * that divides into the length of a standard day without remainder.
     * This includes all supplied time units on {@link ChronoUnit} and
     * {@link ChronoUnit#DAYS}. Other units throw an exception.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {!TemporalUnit} unit - the unit to truncate to, not null
     * @return {Instant} an {@link Instant} based on this instant with the time truncated, not null
     * @throws DateTimeException if the unit is invalid for truncation
     */
    truncatedTo(unit) {
        requireNonNull(unit, 'unit');
        if (unit === ChronoUnit.NANOS) {
            return this;
        }
        const unitDur = unit.duration();
        if (unitDur.seconds() > LocalTime.SECONDS_PER_DAY) {
            throw new DateTimeException('Unit is too large to be used for truncation');
        }
        const dur = unitDur.toNanos();
        if (MathUtil.intMod(LocalTime.NANOS_PER_DAY, dur) !== 0) {
            throw new DateTimeException('Unit must divide into a standard day without remainder');
        }
        const nod = MathUtil.intMod(this._seconds, LocalTime.SECONDS_PER_DAY) * LocalTime.NANOS_PER_SECOND + this._nanos;
        const result = MathUtil.intDiv(nod, dur) * dur;
        return this.plusNanos(result - nod);
    }

    //-----------------------------------------------------------------------
    /**
     * @param {!number} amountToAdd
     * @param {!TemporalUnit} unit
     * @return {Instant}
     * @throws DateTimeException
     * @throws ArithmeticException
     */
    _plusUnit(amountToAdd, unit) {
        requireNonNull(amountToAdd, 'amountToAdd');
        requireNonNull(unit, 'unit');
        requireInstance(unit, TemporalUnit);
        if (unit instanceof ChronoUnit) {
            switch (unit) {
                case ChronoUnit.NANOS: return this.plusNanos(amountToAdd);
                case ChronoUnit.MICROS: return this.plusMicros(amountToAdd);
                case ChronoUnit.MILLIS: return this.plusMillis(amountToAdd);
                case ChronoUnit.SECONDS: return this.plusSeconds(amountToAdd);
                case ChronoUnit.MINUTES: return this.plusSeconds(MathUtil.safeMultiply(amountToAdd, LocalTime.SECONDS_PER_MINUTE));
                case ChronoUnit.HOURS: return this.plusSeconds(MathUtil.safeMultiply(amountToAdd, LocalTime.SECONDS_PER_HOUR));
                case ChronoUnit.HALF_DAYS: return this.plusSeconds(MathUtil.safeMultiply(amountToAdd, LocalTime.SECONDS_PER_DAY / 2));
                case ChronoUnit.DAYS: return this.plusSeconds(MathUtil.safeMultiply(amountToAdd, LocalTime.SECONDS_PER_DAY));
            }
            throw new UnsupportedTemporalTypeException(`Unsupported unit: ${unit}`);
        }
        return unit.addTo(this, amountToAdd);
    }

    /**
     * Returns a copy of this instant with the specified duration in seconds added.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} secondsToAdd  the seconds to add, positive or negative
     * @return {Instant} an {@link Instant} based on this instant with the specified seconds added, not null
     * @throws DateTimeException if the result exceeds the maximum or minimum instant
     */
    plusSeconds(secondsToAdd) {
        return this._plus(secondsToAdd, 0);
    }

    /**
     * Returns a copy of this instant with the specified duration in milliseconds added.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} millisToAdd - the milliseconds to add, positive or negative
     * @return {Instant} an {@link Instant} based on this instant with the specified milliseconds added, not null
     * @throws DateTimeException if the result exceeds the maximum or minimum instant
     * @throws ArithmeticException if numeric overflow occurs
     */
    plusMillis(millisToAdd) {
        return this._plus(MathUtil.intDiv(millisToAdd, 1000), MathUtil.intMod(millisToAdd, 1000) * NANOS_PER_MILLI);
    }

    /**
     * Returns a copy of this instant with the specified duration in nanoseconds added.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} nanosToAdd - the nanoseconds to add, positive or negative
     * @return {Instant} an {@link Instant} based on this instant with the specified nanoseconds added, not null
     * @throws DateTimeException if the result exceeds the maximum or minimum instant
     */
    plusNanos(nanosToAdd) {
        return this._plus(0, nanosToAdd);
    }

    /**
     * Returns a copy of this instant with the specified duration in microseconds added.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} microsToAdd - the microseconds to add, positive or negative
     * @return {Instant} an {@link Instant} based on this instant with the specified microseconds added, not null
     * @throws DateTimeException if the result exceeds the maximum or minimum instant
     */
    plusMicros(microsToAdd) {
        return this._plus(MathUtil.intDiv(microsToAdd, 1000000), MathUtil.intMod(microsToAdd, 1000000) * 1000);
    }

    /**
     * Returns a copy of this instant with the specified duration added.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} secondsToAdd - the seconds to add, positive or negative
     * @param {number} nanosToAdd - the nanos to add, positive or negative
     * @return {Instant} an {@link Instant} based on this instant with the specified seconds added, not null
     * @throws DateTimeException if the result exceeds the maximum or minimum instant
     */
    _plus(secondsToAdd, nanosToAdd) {
        if (secondsToAdd === 0 && nanosToAdd === 0) {
            return this;
        }
        let epochSec = this._seconds + secondsToAdd;
        epochSec = epochSec + MathUtil.intDiv(nanosToAdd, LocalTime.NANOS_PER_SECOND);
        const nanoAdjustment = this._nanos + nanosToAdd % LocalTime.NANOS_PER_SECOND;
        return Instant.ofEpochSecond(epochSec, nanoAdjustment);
    }

    //-----------------------------------------------------------------------

    /**
     * @param {!number} amountToSubtract
     * @param {!TemporalUnit} unit
     * @return {Instant}
     * @throws DateTimeException
     * @throws ArithmeticException
     */
    _minusUnit(amountToSubtract, unit) {
        return this._plusUnit(-1 * amountToSubtract, unit);
    }

    /**
     * Returns a copy of this instant with the specified duration in seconds subtracted.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} secondsToSubtract - the seconds to subtract, positive or negative
     * @return {Instant} an {@link Instant} based on this instant with the specified seconds subtracted, not null
     * @throws DateTimeException if the result exceeds the maximum or minimum instant
     */
    minusSeconds(secondsToSubtract) {
        return this.plusSeconds(secondsToSubtract * -1);
    }

    /**
     * Returns a copy of this instant with the specified duration in milliseconds subtracted.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} millisToSubtract - the milliseconds to subtract, positive or negative
     * @return {Instant} an {@link Instant} based on this instant with the specified milliseconds subtracted, not null
     * @throws DateTimeException if the result exceeds the maximum or minimum instant
     * @throws ArithmeticException if numeric overflow occurs
     */
    minusMillis(millisToSubtract) {
        return this.plusMillis(-1 * millisToSubtract);
    }

    /**
     * Returns a copy of this instant with the specified duration in nanoseconds subtracted.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} nanosToSubtract  the nanoseconds to subtract, positive or negative
     * @return {Instant} an {@link Instant} based on this instant with the specified nanoseconds subtracted, not null
     * @throws DateTimeException if the result exceeds the maximum or minimum instant
     * @throws ArithmeticException if numeric overflow occurs
     */
    minusNanos(nanosToSubtract) {
        return this.plusNanos(-1 * nanosToSubtract);
    }

    /**
     * Returns a copy of this instant with the specified duration in microseconds subtracted.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} microsToSubtract  the microseconds to subtract, positive or negative
     * @return {Instant} an {@link Instant} based on this instant with the specified microseconds subtracted, not null
     * @throws DateTimeException if the result exceeds the maximum or minimum instant
     * @throws ArithmeticException if numeric overflow occurs
     */
    minusMicros(microsToSubtract) {
        return this.plusMicros(-1 * microsToSubtract);
    }

    //-------------------------------------------------------------------------
    /**
     * Queries this instant using the specified query.
     *
     * This queries this instant using the specified query strategy object.
     * The {@link TemporalQuery} object defines the logic to be used to
     * obtain the result. Read the documentation of the query to understand
     * what the result of this method will be.
     *
     * The result of this method is obtained by invoking the
     * {@link TemporalQuery#queryFrom} method on the
     * specified query passing `this` as the argument.
     *
     * @param {!TemporalQuery} query - the query to invoke, not null
     * @return {*} the query result, null may be returned (defined by the query)
     * @throws DateTimeException if unable to query (defined by the query)
     * @throws ArithmeticException if numeric overflow occurs (defined by the query)
     */
    query(query) {
        requireNonNull(query, 'query');
        if (query === TemporalQueries.precision()) {
            return ChronoUnit.NANOS;
        }
        // inline TemporalAccessor.super.query(query) as an optimization
        if (query === TemporalQueries.localDate() || query === TemporalQueries.localTime() ||
                query === TemporalQueries.chronology() || query === TemporalQueries.zoneId() ||
                query === TemporalQueries.zone() || query === TemporalQueries.offset()) {
            return null;
        }
        return query.queryFrom(this);
    }

    /**
     * Adjusts the specified temporal object to have this instant.
     *
     * This returns a temporal object of the same observable type as the input
     * with the instant changed to be the same as this.
     *
     * The adjustment is equivalent to using {@link Temporal#with}
     * twice, passing {@link ChronoField#INSTANT_SECONDS} and
     * {@link ChronoField#NANO_OF_SECOND} as the fields.
     *
     * In most cases, it is clearer to reverse the calling pattern by using
     * {@link Temporal#with}:
     * <pre>
     *   // these two lines are equivalent, but the second approach is recommended
     *   temporal = thisInstant.adjustInto(temporal);
     *   temporal = temporal.with(thisInstant);
     * </pre>
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {!Temporal} temporal - the target object to be adjusted, not null
     * @return {Temporal} the adjusted object, not null
     * @throws DateTimeException if unable to make the adjustment
     * @throws ArithmeticException if numeric overflow occurs
     */
    adjustInto(temporal) {
        requireNonNull(temporal, 'temporal');
        return temporal.with(ChronoField.INSTANT_SECONDS, this._seconds).with(ChronoField.NANO_OF_SECOND, this._nanos);
    }

    /**
     * Calculates the period between this instant and another instant in
     * terms of the specified unit.
     *
     * This calculates the period between two instants in terms of a single unit.
     * The start and end points are `this` and the specified instant.
     * The result will be negative if the end is before the start.
     * The calculation returns a whole number, representing the number of
     * complete units between the two instants.
     * The {@link Temporal} passed to this method is converted to a
     * {@link Instant} using {@link from}.
     * For example, the period in days between two dates can be calculated
     * using `startInstant.until(endInstant, SECONDS)`.
     *
     * This method operates in association with {@link TemporalUnit#between}.
     * The result of this method is a `long` representing the amount of
     * the specified unit. By contrast, the result of {@link between} is an
     * object that can be used directly in addition/subtraction:
     * <pre>
     *   long period = start.until(end, SECONDS);   // this method
     *   dateTime.plus(SECONDS.between(start, end));      // use in plus/minus
     * </pre>
     *
     * The calculation is implemented in this method for {@link ChronoUnit}.
     * The units {@link NANOS}, {@link MICROS}, {@link MILLIS}, {@link SECONDS},
     * {@link MINUTES}, {@link HOURS}, {@link HALF_DAYS} and {@link DAYS}
     * are supported. Other {@link ChronoUnit} values will throw an exception.
     *
     * If the unit is not a {@link ChronoUnit}, then the result of this method
     * is obtained by invoking {@link TemporalUnit.between}
     * passing `this` as the first argument and the input temporal as
     * the second argument.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Temporal} endExclusive - the end date, which is converted to an {@link Instant}, not null
     * @param {TemporalUnit} unit - the unit to measure the period in, not null
     * @return {number} the amount of the period between this date and the end date
     * @throws DateTimeException if the period cannot be calculated
     * @throws ArithmeticException if numeric overflow occurs
     */
    until(endExclusive, unit) {
        requireNonNull(endExclusive, 'endExclusive');
        requireNonNull(unit, 'unit');
        const end = Instant.from(endExclusive);
        if (unit instanceof ChronoUnit) {
            switch (unit) {
                case ChronoUnit.NANOS: return this._nanosUntil(end);
                case ChronoUnit.MICROS: return this._microsUntil(end);
                case ChronoUnit.MILLIS: return MathUtil.safeSubtract(end.toEpochMilli(), this.toEpochMilli());
                case ChronoUnit.SECONDS: return this._secondsUntil(end);
                case ChronoUnit.MINUTES: return MathUtil.intDiv(this._secondsUntil(end), LocalTime.SECONDS_PER_MINUTE);
                case ChronoUnit.HOURS: return MathUtil.intDiv(this._secondsUntil(end), LocalTime.SECONDS_PER_HOUR);
                case ChronoUnit.HALF_DAYS: return MathUtil.intDiv(this._secondsUntil(end), (12 * LocalTime.SECONDS_PER_HOUR));
                case ChronoUnit.DAYS: return MathUtil.intDiv(this._secondsUntil(end), LocalTime.SECONDS_PER_DAY);
            }
            throw new UnsupportedTemporalTypeException(`Unsupported unit: ${unit}`);
        }
        return unit.between(this, end);
    }

    /**
     *
     * @param {Temporal} end
     * @returns {number}
     * @private
     */
    _microsUntil(end) {
        const secsDiff = MathUtil.safeSubtract(end.epochSecond(), this.epochSecond());
        const totalMicros = MathUtil.safeMultiply(secsDiff, 1000000);
        return MathUtil.safeAdd(totalMicros, MathUtil.intDiv(end.nano() - this.nano(), 1000));
    }

    /**
     *
     * @param {Temporal} end
     * @returns {number}
     * @private
     */
    _nanosUntil(end) {
        const secsDiff = MathUtil.safeSubtract(end.epochSecond(), this.epochSecond());
        const totalNanos = MathUtil.safeMultiply(secsDiff, LocalTime.NANOS_PER_SECOND);
        return MathUtil.safeAdd(totalNanos, end.nano() - this.nano());
    }

    /**
     *
     * @param {Temporal} end
     * @returns {number}
     * @private
     */
    _secondsUntil(end) {
        let secsDiff = MathUtil.safeSubtract(end.epochSecond(), this.epochSecond());
        const nanosDiff = end.nano() - this.nano();
        if (secsDiff > 0 && nanosDiff < 0) {
            secsDiff--;
        } else if (secsDiff < 0 && nanosDiff > 0) {
            secsDiff++;
        }
        return secsDiff;
    }

    //-----------------------------------------------------------------------
    /**
     * Combines this instant with an offset to create an {@link OffsetDateTime}.
     *
     * This returns an {@link OffsetDateTime} formed from this instant at the
     * specified offset from UTC/Greenwich. An exception will be thrown if the
     * instant is too large to fit into an offset date-time.
     *
     * This method is equivalent to {@link OffsetDateTime#ofInstant}.
     *
     * @param {ZoneOffset} offset - the offset to combine with, not null
     * @return {OffsetDateTime} the offset date-time formed from this instant and the specified offset, not null
     * @throws DateTimeException if the result exceeds the supported range
     */
    atOffset(offset) {
        return OffsetDateTime.ofInstant(this, offset);
    }

    /**
     * Combines this instant with a time-zone to create a {@link ZonedDateTime}.
     *
     * This returns an {@link ZonedDateTime} formed from this instant at the
     * specified time-zone. An exception will be thrown if the instant is too
     * large to fit into a zoned date-time.
     *
     * This method is equivalent to {@link ZonedDateTime#ofInstant}.
     *
     * @param {ZoneId} zone - the zone to combine with, not null
     * @return {ZonedDateTime} the zoned date-time formed from this instant and the specified zone, not null
     * @throws DateTimeException if the result exceeds the supported range
     */
    atZone(zone) {
        return ZonedDateTime.ofInstant(this, zone);
    }

    //-----------------------------------------------------------------------
    /**
     * Converts this instant to the number of milliseconds from the epoch
     * of 1970-01-01T00:00:00Z.
     *
     * If this instant represents a point on the time-line too far in the future
     * or past to fit in a `long` milliseconds, then an exception is thrown.
     *
     * If this instant has greater than millisecond precision, then the conversion
     * will drop any excess precision information as though the amount in nanoseconds
     * was subject to integer division by one million.
     *
     * @return {number} the number of milliseconds since the epoch of 1970-01-01T00:00:00Z
     * @throws ArithmeticException if numeric overflow occurs
     */
    toEpochMilli() {
        const millis = MathUtil.safeMultiply(this._seconds, 1000);
        return millis + MathUtil.intDiv(this._nanos, NANOS_PER_MILLI);
    }

    //-----------------------------------------------------------------------
    /**
     * Compares this instant to the specified instant.
     *
     * The comparison is based on the time-line position of the instants.
     * It is "consistent with equals", as defined by {@link Comparable}.
     *
     * @param {Instant} otherInstant  the other instant to compare to, not null
     * @return {number} the comparator value, negative if less, positive if greater
     * @throws NullPointerException if otherInstant is null
     */
    compareTo(otherInstant) {
        requireNonNull(otherInstant, 'otherInstant');
        requireInstance(otherInstant, Instant, 'otherInstant');
        const cmp = MathUtil.compareNumbers(this._seconds, otherInstant._seconds);
        if (cmp !== 0) {
            return cmp;
        }
        return this._nanos - otherInstant._nanos;
    }

    /**
     * Checks if this instant is after the specified instant.
     *
     * The comparison is based on the time-line position of the instants.
     *
     * @param {Instant} otherInstant  the other instant to compare to, not null
     * @return {boolean} true if this instant is after the specified instant
     * @throws NullPointerException if otherInstant is null
     */
    isAfter(otherInstant) {
        return this.compareTo(otherInstant) > 0;
    }

    /**
     * Checks if this instant is before the specified instant.
     *
     * The comparison is based on the time-line position of the instants.
     *
     * @param {Instant} otherInstant  the other instant to compare to, not null
     * @return {boolean} true if this instant is before the specified instant
     * @throws NullPointerException if otherInstant is null
     */
    isBefore(otherInstant) {
        return this.compareTo(otherInstant) < 0;
    }

    /**
     * Checks if this instant is equal to the specified instant.
     *
     * The comparison is based on the time-line position of the instants.
     *
     * @param {*} other - the other instant, null/ undefined returns false
     * @return {boolean} true if the other instant is equal to this one
     */
    equals(other) {
        if(this === other){
            return true;
        }
        if(other instanceof Instant){
            return this.epochSecond() === other.epochSecond() &&
                this.nano() === other.nano();
        }
        return false;
    }

    /**
     * Returns a hash code for this instant.
     *
     * @return {number} a suitable hash code
     */
    hashCode() {
        return MathUtil.hashCode(this._seconds, this._nanos);
    }

    /**
     * A string representation of this instant using ISO-8601 representation.
     *
     * The format used is the same as {@link DateTimeFormatter#ISO_INSTANT}.
     *
     * @return {string} an ISO-8601 representation of this instant, not null
     */
    toString(){
        return DateTimeFormatter.ISO_INSTANT.format(this);
    }

    /**
     *
     * @return {string} same as {@link LocalDate.toString}
     */
    toJSON() {
        return this.toString();
    }
}

export function _init() {
    Instant.MIN_SECONDS = -31619119219200; // -1000000-01-01T00:00:00Z
    Instant.MAX_SECONDS = 31494816403199; // +1000000-12-31T23:59:59.999999999Z
    Instant.EPOCH = new Instant(0, 0);
    Instant.MIN = Instant.ofEpochSecond(Instant.MIN_SECONDS, 0);
    Instant.MAX = Instant.ofEpochSecond(Instant.MAX_SECONDS, 999999999);
    Instant.FROM = createTemporalQuery('Instant.FROM', (temporal) => {
        return Instant.from(temporal);
    });
}
/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { assert, requireNonNull, requireInstance } from './assert';

import { MathUtil } from './MathUtil';
import { DateTimeException, UnsupportedTemporalTypeException, NullPointerException, IllegalArgumentException } from './errors';

import { IsoChronology } from './chrono/IsoChronology';
import { ChronoField } from './temporal/ChronoField';
import { ChronoUnit } from './temporal/ChronoUnit';
import { ChronoLocalDate } from './chrono/ChronoLocalDate';
import { TemporalQueries } from './temporal/TemporalQueries';
import { createTemporalQuery } from './temporal/TemporalQuery';
import { ValueRange } from './temporal/ValueRange';
import { DateTimeFormatter } from './format/DateTimeFormatter';

import { Clock } from './Clock';
import { DayOfWeek } from './DayOfWeek';
import { OffsetDateTime } from './OffsetDateTime';
import { OffsetTime } from './OffsetTime';
import { Month } from './Month';
import { Period } from './Period';
import { YearConstants } from './YearConstants';
import { LocalTime } from './LocalTime';
import { LocalDateTime } from './LocalDateTime';
import { Year } from './Year';
import { ZoneId } from './ZoneId';
import { ZoneOffset } from './ZoneOffset';
import { ZonedDateTime } from './ZonedDateTime';

/**
 * The number of days in a 400 year cycle.
 */
const  DAYS_PER_CYCLE = 146097;

/**
* The number of days from year zero to year 1970.
* There are five 400 year cycles from year zero to 2000.
* There are 7 leap years from 1970 to 2000.
*/
const  DAYS_0000_TO_1970 = (DAYS_PER_CYCLE * 5) - (30 * 365 + 7);

/**
 * A date without a time-zone in the ISO-8601 calendar system,
 * such as 2007-12-03.
 *
 * LocalDate is an immutable date-time object that represents a date,
 * often viewed as year-month-day. Other date fields, such as day-of-year,
 * day-of-week and week-of-year, can also be accessed.
 * For example, the value "2nd October 2007" can be stored in a LocalDate.
 *
 * This class does not store or represent a time or time-zone.
 * Instead, it is a description of the date, as used for birthdays.
 * It cannot represent an instant on the time-line without additional information
 * such as an offset or time-zone.
 *
 * The ISO-8601 calendar system is the modern civil calendar system used today
 * in most of the world. It is equivalent to the proleptic Gregorian calendar
 * system, in which today's rules for leap years are applied for all time.
 * For most applications written today, the ISO-8601 rules are entirely suitable.
 * However, any application that makes use of historical dates, and requires them
 * to be accurate will find the ISO-8601 approach unsuitable.
 *
 * ### Static properties of Class {@link LocalDate}
 *
 * LocalDate.MIN = LocalDate.of(Year.MIN_VALUE, 1, 1);
 *
 * The minimum supported {@link LocalDate}
 * This could be used by an application as a "far past" date.
 *
 * LocalDate.MAX = LocalDate.of(Year.MAX_VALUE, 12, 31);
 *
 * The maximum supported {@link LocalDate}
 * This could be used by an application as a "far future" date.
 *
 * LocalDate.EPOCH_0
 *
 * The date at epoch day 0, that is 1970-01-01.
 */

export class LocalDate extends ChronoLocalDate{

    /**
     * Obtains the current date from the system clock in the default time-zone or
     * if specified, the current date from the specified clock or
     * if argument is a ZoneId this will query a clock with the specified ZoneId.
     *
     * This will query the specified clock to obtain the current date - today.
     * Using this method allows the use of an alternate clock for testing.
     *
     * @param {Clock|ZoneId} [clockOrZone=Clock.systemDefaultZone()] - the clock or zone to use,
     * if null, the system clock and default time-zone is used.
     * @return {LocalDate} the current date, not null
     */
    static now(clockOrZone) {
        let clock;
        if(clockOrZone == null){
            clock = Clock.systemDefaultZone();
        } else if(clockOrZone instanceof ZoneId){
            clock = Clock.system(clockOrZone);
        } else {
            clock = clockOrZone;
        }
        return LocalDate.ofInstant(clock.instant(), clock.zone());
    }

    /**
     * obtain a LocalDate from an Instant in the specified time-zone or, if null
     * in the system default time-zone
     *
     * @param {!Instant} instant
     * @param {ZoneId} [zone=ZoneId.systemDefault()], defaults to ZoneId.systemDefault()
     * @returns {LocalDate} the current date, not null
     */
    static ofInstant(instant, zone=ZoneId.systemDefault()){
        requireNonNull(instant, 'instant');
        const offset = zone.rules().offset(instant);
        const epochSec = instant.epochSecond() + offset.totalSeconds();
        const epochDay = MathUtil.floorDiv(epochSec, LocalTime.SECONDS_PER_DAY);
        return LocalDate.ofEpochDay(epochDay);
    }

    /**
     * Obtains an instance of {@link LocalDate} from a year, month and day.
     *
     * This returns a {@link LocalDate} with the specified year, month and day-of-month.
     * The day must be valid for the year and month, otherwise an exception will be thrown.
     *
     * @param {!number} year - the year to represent, from {@link Year.MIN_VALUE} to {@link Year.MAX_VALUE}
     * @param {!(Month|Number)} month - the month-of-year to represent, from 1 (January) to 12 (December)
     * @param {!number} dayOfMonth - the day-of-month to represent, from 1 to 31
     * @return {LocalDate} the local date, not null
     * @throws {DateTimeException} if the value of any field is out of range,
     *  or if the day-of-month is invalid for the month-year
     */
    static of(year, month, dayOfMonth) {
        return new LocalDate(year, month, dayOfMonth);
    }

    /**
     * Obtains an instance of {@link LocalDate} from a year and day-of-year.
     *
     * This returns a {@link LocalDate} with the specified year and day-of-year.
     * The day-of-year must be valid for the year, otherwise an exception will be thrown.
     *
     * @param {!number} year - the year to represent, from {@link Year.MIN_VALUE} to {@link Year.MAX_VALUE}
     * @param {!number} dayOfYear - the day-of-year to represent, from 1 to 366
     * @return {LocalDate} the local date, not null
     * @throws {DateTimeException} if the value of any field is out of range,
     *  or if the day-of-year is invalid for the year
     */
    static ofYearDay(year, dayOfYear) {
        ChronoField.YEAR.checkValidValue(year);
        //TODO: ChronoField.DAY_OF_YEAR.checkValidValue(dayOfYear);
        const leap = IsoChronology.isLeapYear(year);
        if (dayOfYear === 366 && leap === false) {
            assert(false, `Invalid date 'DayOfYear 366' as '${year}' is not a leap year`, DateTimeException);
        }
        let moy = Month.of(Math.floor((dayOfYear - 1) / 31 + 1));
        const monthEnd = moy.firstDayOfYear(leap) + moy.length(leap) - 1;
        if (dayOfYear > monthEnd) {
            moy = moy.plus(1);
        }
        const dom = dayOfYear - moy.firstDayOfYear(leap) + 1;
        return new LocalDate(year, moy.value(), dom);
    }

    /**
     * Obtains an instance of LocalDate from the epoch day count.
     *
     * This returns a LocalDate with the specified epoch-day.
     * The {@link ChronoField.EPOCH_DAY} is a simple incrementing count
     * of days where day 0 is 1970-01-01. Negative numbers represent earlier days.
     *
     * @param {number} [epochDay=0] - the Epoch Day to convert, based on the epoch 1970-01-01
     * @return {LocalDate} the local date, not null
     * @throws {AssertionError} if the epoch days exceeds the supported date range
     */
    static ofEpochDay(epochDay=0) {
        let adjust, adjustCycles, doyEst, yearEst, zeroDay;
        zeroDay = epochDay + DAYS_0000_TO_1970;
        zeroDay -= 60;
        adjust = 0;
        if (zeroDay < 0) {
            adjustCycles = MathUtil.intDiv(zeroDay + 1, DAYS_PER_CYCLE) - 1;
            adjust = adjustCycles * 400;
            zeroDay += -adjustCycles * DAYS_PER_CYCLE;
        }
        yearEst = MathUtil.intDiv(400 * zeroDay + 591, DAYS_PER_CYCLE);
        doyEst = zeroDay - (365 * yearEst + MathUtil.intDiv(yearEst, 4) - MathUtil.intDiv(yearEst, 100) + MathUtil.intDiv(yearEst, 400));
        if (doyEst < 0) {
            yearEst--;
            doyEst = zeroDay - (365 * yearEst + MathUtil.intDiv(yearEst, 4) - MathUtil.intDiv(yearEst, 100) + MathUtil.intDiv(yearEst, 400));
        }
        yearEst += adjust;
        const marchDoy0 = doyEst;
        const marchMonth0 = MathUtil.intDiv(marchDoy0 * 5 + 2, 153);
        const month = (marchMonth0 + 2) % 12 + 1;
        const dom = marchDoy0 - MathUtil.intDiv(marchMonth0 * 306 + 5, 10) + 1;
        yearEst += MathUtil.intDiv(marchMonth0, 10);
        const year = yearEst;
        return new LocalDate(year, month, dom);
    }

    /**
     * Obtains an instance of {@link LocalDate} from a temporal object.
     *
     * A {@link TemporalAccessor} represents some form of date and time information.
     * This factory converts the arbitrary temporal object to an instance of {@link LocalDate}.
     *
     * The conversion uses the {@link TemporalQueries.localDate} query, which relies
     * on extracting the {@link ChronoField.EPOCH_DAY} field.
     *
     * This method matches the signature of the functional interface {@link TemporalQuery}
     * allowing it to be used as a query via method reference, {@link LocalDate::from}.
     *
     * @param {!TemporalAccessor} temporal - the temporal object to convert, not null
     * @return {LocalDate} the local date, not null
     * @throws {DateTimeException} if unable to convert to a {@link LocalDate}
     */
    static from(temporal) {
        requireNonNull(temporal, 'temporal');
        const date = temporal.query(TemporalQueries.localDate());
        if (date == null) {
            throw new DateTimeException(
                `Unable to obtain LocalDate from TemporalAccessor: ${temporal}, type ${temporal.constructor != null ? temporal.constructor.name : ''}`);
        }
        return date;
    }

    /**
     * Obtains an instance of {@link LocalDate} from a text string using a specific formatter.
     *
     * The text is parsed using the formatter, returning a date.
     *
     * @param {!string} text - the text to parse, not null
     * @param {DateTimeFormatter} [formatter=DateTimeFormatter.ISO_LOCAL_DATE] - the formatter to use, default is
     * {@link DateTimeFormatter.ISO_LOCAL_DATE}
     * @return {LocalDate} the parsed local date, not null
     * @throws {DateTimeParseException} if the text cannot be parsed
     */
    static parse(text, formatter = DateTimeFormatter.ISO_LOCAL_DATE){
        assert(formatter != null, 'formatter', NullPointerException);
        return formatter.parse(text, LocalDate.FROM);
    }

    /**
     * Resolves the date, resolving days past the end of month.
     *
     * @param {!number} year - the year to represent, validated from {@link Year.MIN_VALUE} to {@link Year.MAX_VALUE}
     * @param {!number} month - the month-of-year to represent, validated from 1 to 12
     * @param {!number} day - the day-of-month to represent, validated from 1 to 31
     * @return {LocalDate} resolved date, not null
     */
    static _resolvePreviousValid(year, month, day) {
        switch (month) {
            case 2:
                day = Math.min(day, IsoChronology.isLeapYear(year) ? 29 : 28);
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                day = Math.min(day, 30);
                break;
        }
        return LocalDate.of(year, month, day);
    }

    /**
     * Do not call the constructor directly, use the of*() factories instead like {@link LocalDate.of}
     *
     * @param {!number} year
     * @param {!(Month|number)} month
     * @param {!number} dayOfMonth
     * @private
     */
    constructor(year, month, dayOfMonth){
        super();
        requireNonNull(year, 'year');
        requireNonNull(month, 'month');
        requireNonNull(dayOfMonth, 'dayOfMonth');

        if (month instanceof Month) {
            month = month.value();
        }
        this._year = MathUtil.safeToInt(year);
        this._month = MathUtil.safeToInt(month);
        this._day = MathUtil.safeToInt(dayOfMonth);
        LocalDate._validate(this._year, this._month, this._day);
    }


    /**
     *
     * @param {!number} year
     * @param {!number} month
     * @param {!number} dayOfMonth
     * @throws {DateTimeException} if date values are invalid
     * @private
     */
    static _validate(year, month, dayOfMonth) {
        let dom;
        ChronoField.YEAR.checkValidValue(year);
        ChronoField.MONTH_OF_YEAR.checkValidValue(month);
        ChronoField.DAY_OF_MONTH.checkValidValue(dayOfMonth);

        if (dayOfMonth > 28) {
            dom = 31;
            switch (month) {
                case 2:
                    dom = IsoChronology.isLeapYear(year) ? 29 : 28;
                    break;
                case 4:
                case 6:
                case 9:
                case 11:
                    dom = 30;
            }
            if (dayOfMonth > dom) {
                if (dayOfMonth === 29) {
                    assert(false, `Invalid date 'February 29' as '${year}' is not a leap year`, DateTimeException);
                } else {
                    assert(false, `Invalid date '${year}' '${month}' '${dayOfMonth}'`, DateTimeException);
                }
            }
        }
    }

    /**
     * Checks if the specified field is supported.
     *
     * This checks if this date can be queried for the specified field.
     * If false, then calling the {@link LocalDate.range} range and
     * {@link LocalDate.get} get methods will throw an exception.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The {@link LocalDate.isSupported} supported fields will return valid
     * values based on this date-time.
     * The supported fields are:
     *
     * * {@link ChronoField.DAY_OF_WEEK}
     * * {@link ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH}
     * * {@link ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR}
     * * {@link ChronoField.DAY_OF_MONTH}
     * * {@link ChronoField.DAY_OF_YEAR}
     * * {@link ChronoField.EPOCH_DAY}
     * * {@link ChronoField.ALIGNED_WEEK_OF_MONTH}
     * * {@link ChronoField.ALIGNED_WEEK_OF_YEAR}
     * * {@link ChronoField.MONTH_OF_YEAR}
     * * {@link ChronoField.EPOCH_MONTH}
     * * {@link ChronoField.YEAR_OF_ERA}
     * * {@link ChronoField.YEAR}
     * * {@link ChronoField.ERA}
     *
     * All other {@link ChronoField} instances will return false.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.isSupportedBy}
     * passing this as the argument.
     * Whether the field is supported is determined by the field.
     *
     * @param {TemporalField} field  the field to check, null returns false
     * @return {boolean} true if the field is supported on this date, false if not
     */
    isSupported(field) {
        return super.isSupported(field);
    }

    /**
     * Gets the range of valid values for the specified field.
     *
     * The range object expresses the minimum and maximum valid values for a field.
     * This date is used to enhance the accuracy of the returned range.
     * If it is not possible to return the range, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The {@link LocalDate.isSupported} supported fields will return
     * appropriate range instances.
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.rangeRefinedBy}
     * passing this as the argument.
     * Whether the range can be obtained is determined by the field.
     *
     * @param {TemporalField} field  the field to query the range for, not null
     * @return {ValueRange} the range of valid values for the field, not null
     * @throws {DateTimeException} if the range for the field cannot be obtained
     */
    range(field) {
        if (field instanceof ChronoField) {
            if (field.isDateBased()) {
                switch (field) {
                    case ChronoField.DAY_OF_MONTH: return ValueRange.of(1, this.lengthOfMonth());
                    case ChronoField.DAY_OF_YEAR: return ValueRange.of(1, this.lengthOfYear());
                    case ChronoField.ALIGNED_WEEK_OF_MONTH: return ValueRange.of(1, this.month() === Month.FEBRUARY && this.isLeapYear() === false ? 4 : 5);
                    case ChronoField.YEAR_OF_ERA:
                        return (this._year <= 0 ? ValueRange.of(1, Year.MAX_VALUE + 1) : ValueRange.of(1, Year.MAX_VALUE));
                }
                return field.range();
            }
            throw new UnsupportedTemporalTypeException(`Unsupported field: ${field}`);
        }
        return field.rangeRefinedBy(this);
    }

    /**
     * Gets the value of the specified field from this date as an `int`.
     *
     * This queries this date for the value for the specified field.
     * The returned value will always be within the valid range of values for the field.
     * If it is not possible to return the value, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The {@link LocalDate.isSupported} supported fields will return valid
     * values based on this date, except {@link ChronoField.EPOCH_DAY} and {@link ChronoField.EPOCH_MONTH}
     * which are too large to fit in an `int` and throw a {@link DateTimeException}.
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.getFrom}
     * passing this as the argument. Whether the value can be obtained,
     * and what the value represents, is determined by the field.
     *
     * @param {!TemporalField} field  the field to get, not null
     * @return the value for the field
     * @throws {DateTimeException} if a value for the field cannot be obtained
     * @throws {ArithmeticException} if numeric overflow occurs
     */
    get(field) {
        return this.getLong(field);
    }

    /**
     * see {LocalDate.get}, get and getLong are identical in javascript, because we are only limited by
     * {@link MathUtil.MIN_SAFE_INTEGER}/ {@link MathUtil.MAX_SAFE_INTEGER}
     *
     * @param {!TemporalField} field
     * @returns {*}
     */
    getLong(field) {
        assert(field != null, '', NullPointerException);
        if (field instanceof ChronoField) {
            return this._get0(field);
        }
        return field.getFrom(this);
    }

    /**
     * TODO tests are missing for the ALIGNED_* ChronoFields
     *
     * @param {!TemporalField} field
     * @returns {*}
     * @private
     */
    _get0(field) {
        switch (field) {
            case ChronoField.DAY_OF_WEEK: return this.dayOfWeek().value();
            case ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH: return MathUtil.intMod((this._day - 1), 7) + 1;
            case ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR: return MathUtil.intMod((this.dayOfYear() - 1), 7) + 1;
            case ChronoField.DAY_OF_MONTH: return this._day;
            case ChronoField.DAY_OF_YEAR: return this.dayOfYear();
            case ChronoField.EPOCH_DAY: return this.toEpochDay();
            case ChronoField.ALIGNED_WEEK_OF_MONTH: return MathUtil.intDiv((this._day - 1), 7) + 1;
            case ChronoField.ALIGNED_WEEK_OF_YEAR: return MathUtil.intDiv((this.dayOfYear() - 1), 7) + 1;
            case ChronoField.MONTH_OF_YEAR: return this._month;
            case ChronoField.PROLEPTIC_MONTH: return this._prolepticMonth();
            case ChronoField.YEAR_OF_ERA: return (this._year >= 1 ? this._year : 1 - this._year);
            case ChronoField.YEAR: return this._year;
            case ChronoField.ERA: return (this._year >= 1 ? 1 : 0);
        }
        throw new UnsupportedTemporalTypeException(`Unsupported field: ${field}`);
    }

    /**
     *
     * @return {number}
     * @private
     */
    _prolepticMonth() {
        return (this._year * 12) + (this._month - 1);
    }

    /**
     * Gets the chronology of this date, which is the ISO calendar system.
     *
     * The {@link Chronology} represents the calendar system in use.
     * The ISO-8601 calendar system is the modern civil calendar system used today
     * in most of the world. It is equivalent to the proleptic Gregorian calendar
     * system, in which today's rules for leap years are applied for all time.
     *
     * @return {Chronology} the ISO chronology, not null
     */
    chronology() {
        return IsoChronology.INSTANCE;
    }

    /**
     *
     * @return {number} gets the year
     */
    year() {
        return this._year;
    }

    /**
     *
     * @return {number} gets the month value
     */
    monthValue() {
        return this._month;
    }

    /**
     *
     * @returns {Month} month
     */
    month() {
        return Month.of(this._month);
    }

    /**
     *
     * @return {number} gets the day of month
     */
    dayOfMonth() {
        return this._day;
    }

    /**
      * Gets the day-of-year field.
      *
      * This method returns the primitive int value for the day-of-year.
      *
      * @return {number} the day-of-year, from 1 to 365, or 366 in a leap year
      */
    dayOfYear() {
        return this.month().firstDayOfYear(this.isLeapYear()) + this._day - 1;
    }

    /**
     * Gets the day-of-week field, which is an enum {@link DayOfWeek}.
     *
     * This method returns the enum {@link DayOfWeek} for the day-of-week.
     * This avoids confusion as to what `int` values mean.
     * If you need access to the primitive `int` value then the enum
     * provides the {@link DayOfWeek.value} int value.
     *
     * Additional information can be obtained from the {@link DayOfWeek}.
     * This includes textual names of the values.
     *
     * @return {DayOfWeek} the day-of-week, not null
     */
    dayOfWeek() {
        const dow0 = MathUtil.floorMod(this.toEpochDay() + 3, 7);
        return DayOfWeek.of(dow0 + 1);
    }

    /**
     * Checks if the year is a leap year, according to the ISO proleptic
     * calendar system rules.
     *
     * This method applies the current rules for leap years across the whole time-line.
     * In general, a year is a leap year if it is divisible by four without
     * remainder. However, years divisible by 100, are not leap years, with
     * the exception of years divisible by 400 which are.
     *
     * For example, 1904 is a leap year it is divisible by 4.
     * 1900 was not a leap year as it is divisible by 100, however 2000 was a
     * leap year as it is divisible by 400.
     *
     * The calculation is proleptic - applying the same rules into the far future and far past.
     * This is historically inaccurate, but is correct for the ISO-8601 standard.
     *
     * @return {boolean} true if the year is leap, false otherwise
     */
    isLeapYear() {
        return IsoChronology.isLeapYear(this._year);
    }

    /**
     * Returns the length of the month represented by this date.
     *
     * This returns the length of the month in days.
     * For example, a date in January would return 31.
     *
     * @return {number} the length of the month in days
     */
    lengthOfMonth() {
        switch (this._month) {
            case 2:
                return (this.isLeapYear() ? 29 : 28);
            case 4:
            case 6:
            case 9:
            case 11:
                return 30;
            default:
                return 31;
        }
    }

    /**
     * Returns the length of the year represented by this date.
     *
     * This returns the length of the year in days, either 365 or 366.
     *
     * @return {number} 366 if the year is leap, 365 otherwise
     */
    lengthOfYear() {
        return (this.isLeapYear() ? 366 : 365);
    }

    /**
     * Returns an adjusted copy of this date.
     *
     * This returns a new {@link LocalDate}, based on this one, with the date adjusted.
     * The adjustment takes place using the specified adjuster strategy object.
     * Read the documentation of the adjuster to understand what adjustment will be made.
     *
     * A simple adjuster might simply set the one of the fields, such as the year field.
     * A more complex adjuster might set the date to the last day of the month.
     * A selection of common adjustments is provided in {@link TemporalAdjusters}.
     * These include finding the "last day of the month" and "next Wednesday".
     * Key date-time classes also implement the {@link TemporalAdjuster} interface,
     * such as {@link Month} and {@link MonthDay}.
     * The adjuster is responsible for handling special cases, such as the varying
     * lengths of month and leap years.
     *
     * For example this code returns a date on the last day of July:
     * <pre>
     *  import static org.threeten.bp.Month.*;
     *  import static org.threeten.bp.temporal.Adjusters.*;
     *
     *  result = localDate.with(JULY).with(lastDayOfMonth());
     * </pre>
     *
     * The result of this method is obtained by invoking the
     * {@link TemporalAdjuster.adjustInto} method on the
     * specified adjuster passing `this` as the argument.
     *
     * @param {!TemporalAdjuster} adjuster - the adjuster to use, not null
     * @return {LocalDate} a {@link LocalDate} based on `this` with the adjustment made, not null
     * @throws {DateTimeException} if the adjustment cannot be made
     * @throws {ArithmeticException} if numeric overflow occurs
     */
    _withAdjuster(adjuster) {
        requireNonNull(adjuster, 'adjuster');
        // optimizations
        if (adjuster instanceof LocalDate) {
            return adjuster;
        }
        return super._withAdjuster(adjuster);
    }

    /**
     * Returns a copy of this date with the specified field set to a new value.
     *
     * This returns a new {@link LocalDate}, based on this one, with the value
     * for the specified field changed.
     * This can be used to change any supported field, such as the year, month or day-of-month.
     * If it is not possible to set the value, because the field is not supported or for
     * some other reason, an exception is thrown.
     *
     * In some cases, changing the specified field can cause the resulting date to become invalid,
     * such as changing the month from 31st January to February would make the day-of-month invalid.
     * In cases like this, the field is responsible for resolving the date. Typically it will choose
     * the previous valid date, which would be the last valid day of February in this example.
     *
     * If the field is a {@link ChronoField} then the adjustment is implemented here.
     * The supported fields behave as follows:
     *
     * * {@link DAY_OF_WEEK} -
     *   Returns a {@link LocalDate} with the specified day-of-week.
     *   The date is adjusted up to 6 days forward or backward within the boundary
     *   of a Monday to Sunday week.
     * * {@link ALIGNED_DAY_OF_WEEK_IN_MONTH} -
     *   Returns a {@link LocalDate} with the specified aligned-day-of-week.
     *   The date is adjusted to the specified month-based aligned-day-of-week.
     *   Aligned weeks are counted such that the first week of a given month starts
     *   on the first day of that month.
     *   This may cause the date to be moved up to 6 days into the following month.
     * * {@link ALIGNED_DAY_OF_WEEK_IN_YEAR} -
     *   Returns a {@link LocalDate} with the specified aligned-day-of-week.
     *   The date is adjusted to the specified year-based aligned-day-of-week.
     *   Aligned weeks are counted such that the first week of a given year starts
     *   on the first day of that year.
     *   This may cause the date to be moved up to 6 days into the following year.
     * * {@link DAY_OF_MONTH} -
     *   Returns a {@link LocalDate} with the specified day-of-month.
     *   The month and year will be unchanged. If the day-of-month is invalid for the
     *   year and month, then a {@link DateTimeException} is thrown.
     * * {@link DAY_OF_YEAR} -
     *   Returns a {@link LocalDate} with the specified day-of-year.
     *   The year will be unchanged. If the day-of-year is invalid for the
     *   year, then a {@link DateTimeException} is thrown.
     * * {@link EPOCH_DAY} -
     *   Returns a {@link LocalDate} with the specified epoch-day.
     *   This completely replaces the date and is equivalent to {@link ofEpochDay}.
     * * {@link ALIGNED_WEEK_OF_MONTH} -
     *   Returns a {@link LocalDate} with the specified aligned-week-of-month.
     *   Aligned weeks are counted such that the first week of a given month starts
     *   on the first day of that month.
     *   This adjustment moves the date in whole week chunks to match the specified week.
     *   The result will have the same day-of-week as this date.
     *   This may cause the date to be moved into the following month.
     * * {@link ALIGNED_WEEK_OF_YEAR} -
     *   Returns a {@link LocalDate} with the specified aligned-week-of-year.
     *   Aligned weeks are counted such that the first week of a given year starts
     *   on the first day of that year.
     *   This adjustment moves the date in whole week chunks to match the specified week.
     *   The result will have the same day-of-week as this date.
     *   This may cause the date to be moved into the following year.
     * * {@link MONTH_OF_YEAR} -
     *   Returns a {@link LocalDate} with the specified month-of-year.
     *   The year will be unchanged. The day-of-month will also be unchanged,
     *   unless it would be invalid for the new month and year. In that case, the
     *   day-of-month is adjusted to the maximum valid value for the new month and year.
     * * {@link PROLEPTIC_MONTH} -
     *   Returns a {@link LocalDate} with the specified proleptic-month.
     *   The day-of-month will be unchanged, unless it would be invalid for the new month
     *   and year. In that case, the day-of-month is adjusted to the maximum valid value
     *   for the new month and year.
     * * {@link YEAR_OF_ERA} -
     *   Returns a {@link LocalDate} with the specified year-of-era.
     *   The era and month will be unchanged. The day-of-month will also be unchanged,
     *   unless it would be invalid for the new month and year. In that case, the
     *   day-of-month is adjusted to the maximum valid value for the new month and year.
     * * {@link YEAR} -
     *   Returns a {@link LocalDate} with the specified year.
     *   The month will be unchanged. The day-of-month will also be unchanged,
     *   unless it would be invalid for the new month and year. In that case, the
     *   day-of-month is adjusted to the maximum valid value for the new month and year.
     * * {@link ERA} -
     *   Returns a {@link LocalDate} with the specified era.
     *   The year-of-era and month will be unchanged. The day-of-month will also be unchanged,
     *   unless it would be invalid for the new month and year. In that case, the
     *   day-of-month is adjusted to the maximum valid value for the new month and year.
     *
     * In all cases, if the new value is outside the valid range of values for the field
     * then a {@link DateTimeException} will be thrown.
     *
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.adjustInto}
     * passing `this` as the argument. In this case, the field determines
     * whether and how to adjust the instant.
     *
     * @param {TemporalField} field - the field to set in the result, not null
     * @param {number} newValue - the new value of the field in the result
     * @return {LocalDate} a {@link LocalDate} based on `this` with the specified field set, not null
     * @throws {DateTimeException} if the field cannot be set
     * @throws {ArithmeticException} if numeric overflow occurs
     */
    _withField(field, newValue) {
        assert(field != null, 'field', NullPointerException);
        if (field instanceof ChronoField) {
            const f = field;
            f.checkValidValue(newValue);
            switch (f) {
                case ChronoField.DAY_OF_WEEK: return this.plusDays(newValue - this.dayOfWeek().value());
                case ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH: return this.plusDays(newValue - this.getLong(ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH));
                case ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR: return this.plusDays(newValue - this.getLong(ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR));
                case ChronoField.DAY_OF_MONTH: return this.withDayOfMonth(newValue);
                case ChronoField.DAY_OF_YEAR: return this.withDayOfYear(newValue);
                case ChronoField.EPOCH_DAY: return LocalDate.ofEpochDay(newValue);
                case ChronoField.ALIGNED_WEEK_OF_MONTH: return this.plusWeeks(newValue - this.getLong(ChronoField.ALIGNED_WEEK_OF_MONTH));
                case ChronoField.ALIGNED_WEEK_OF_YEAR: return this.plusWeeks(newValue - this.getLong(ChronoField.ALIGNED_WEEK_OF_YEAR));
                case ChronoField.MONTH_OF_YEAR: return this.withMonth(newValue);
                case ChronoField.PROLEPTIC_MONTH: return this.plusMonths(newValue - this.getLong(ChronoField.PROLEPTIC_MONTH));
                case ChronoField.YEAR_OF_ERA: return this.withYear((this._year >= 1 ? newValue : 1 - newValue));
                case ChronoField.YEAR: return this.withYear(newValue);
                case ChronoField.ERA: return (this.getLong(ChronoField.ERA) === newValue ? this : this.withYear(1 - this._year));
            }
            throw new UnsupportedTemporalTypeException(`Unsupported field: ${field}`);
        }
        return field.adjustInto(this, newValue);
    }

    /**
     * Returns a copy of this date with the year altered.
     * If the day-of-month is invalid for the year, it will be changed to the last valid day of the month.
     *
     * @param {!number} year  the year to set in the result, from {@link Year.MIN_VALUE} to {@link Year.MAX_VALUE}
     * @return {LocalDate} a {@link LocalDate} based on this date with the requested year, not null
     * @throws {DateTimeException} if the year value is invalid
     */
    withYear(year) {
        if (this._year === year) {
            return this;
        }
        ChronoField.YEAR.checkValidValue(year);
        return LocalDate._resolvePreviousValid(year, this._month, this._day);
    }

    /**
     * Returns a copy of this date with the month-of-year altered.
     * If the day-of-month is invalid for the year, it will be changed to the last valid day of the month.
     *
     * @param {!(Month|number)} month - the month-of-year to set in the result, from 1 (January) to 12 (December)
     * @return {LocalDate} a {@link LocalDate} based on this date with the requested month, not null
     * @throws {DateTimeException} if the month-of-year value is invalid
     */
    withMonth(month) {
        const m = (month instanceof Month) ? month.value() : month;
        if (this._month === m) {
            return this;
        }
        ChronoField.MONTH_OF_YEAR.checkValidValue(m);
        return LocalDate._resolvePreviousValid(this._year, m, this._day);
    }

    /**
     * Returns a copy of this {@link LocalDate} with the day-of-month altered.
     *
     * If the resulting date is invalid, an exception is thrown.
     *
     * @param {!number} dayOfMonth - the day-of-month to set in the result, from 1 to 28-31
     * @return {LocalDate} based on this date with the requested day, not null
     * @throws {DateTimeException} if the day-of-month value is invalid,
     *  or if the day-of-month is invalid for the month-year
     */
    withDayOfMonth(dayOfMonth) {
        if (this._day === dayOfMonth) {
            return this;
        }
        return LocalDate.of(this._year, this._month, dayOfMonth);
    }

    /**
     * Returns a copy of this date with the day-of-year altered.
     * If the resulting date is invalid, an exception is thrown.
     *
     * @param dayOfYear  the day-of-year to set in the result, from 1 to 365-366
     * @return {LocalDate} a {@link LocalDate} based on this date with the requested day, not null
     * @throws {DateTimeException} if the day-of-year value is invalid
     * @throws {DateTimeException} if the day-of-year is invalid for the year
     */
    withDayOfYear(dayOfYear) {
        if (this.dayOfYear() === dayOfYear) {
            return this;
        }
        return LocalDate.ofYearDay(this._year, dayOfYear);
    }

    /**
     * Returns a copy of this date with the specified period added.
     *
     * This method returns a new date based on this date with the specified period added.
     * This can be used to add any period that is defined by a unit, for example to add years, months or days.
     * The unit is responsible for the details of the calculation, including the resolution
     * of any edge cases in the calculation.
     *
     * @param {!number} amountToAdd - the amount of the unit to add to the result, may be negative
     * @param {!TemporalUnit} unit - the unit of the period to add, not null
     * @return {LocalDate} a {@link LocalDate} based on this date with the specified period added, not null
     * @throws {DateTimeException} if the unit cannot be added to this type
     */
    _plusUnit(amountToAdd, unit) {
        requireNonNull(amountToAdd, 'amountToAdd');
        requireNonNull(unit, 'unit');
        if (unit instanceof ChronoUnit) {
            switch (unit) {
                case ChronoUnit.DAYS: return this.plusDays(amountToAdd);
                case ChronoUnit.WEEKS: return this.plusWeeks(amountToAdd);
                case ChronoUnit.MONTHS: return this.plusMonths(amountToAdd);
                case ChronoUnit.YEARS: return this.plusYears(amountToAdd);
                case ChronoUnit.DECADES: return this.plusYears(MathUtil.safeMultiply(amountToAdd, 10));
                case ChronoUnit.CENTURIES: return this.plusYears(MathUtil.safeMultiply(amountToAdd, 100));
                case ChronoUnit.MILLENNIA: return this.plusYears(MathUtil.safeMultiply(amountToAdd, 1000));
                case ChronoUnit.ERAS: return this.with(ChronoField.ERA, MathUtil.safeAdd(this.getLong(ChronoField.ERA), amountToAdd));
            }
            throw new UnsupportedTemporalTypeException(`Unsupported unit: ${unit}`);
        }
        return unit.addTo(this, amountToAdd);
    }

    /**
     * Returns a copy of this {@link LocalDate} with the specified period in years added.
     *
     * This method adds the specified amount to the years field in three steps:
     *
     * 1. Add the input years to the year field
     * 2. Check if the resulting date would be invalid
     * 3. Adjust the day-of-month to the last valid day if necessary
     *
     * For example, 2008-02-29 (leap year) plus one year would result in the
     * invalid date 2009-02-29 (standard year). Instead of returning an invalid
     * result, the last valid day of the month, 2009-02-28, is selected instead.
     *
     * @param {!number} yearsToAdd - the years to add, may be negative
     * @return {LocalDate} a {@link LocalDate} based on this date with the years added, not null
     * @throws {DateTimeException} if the result exceeds the supported date range
     */
    plusYears(yearsToAdd) {
        if (yearsToAdd === 0) {
            return this;
        }
        const newYear = ChronoField.YEAR.checkValidIntValue(this._year + yearsToAdd);  // safe overflow
        return LocalDate._resolvePreviousValid(newYear, this._month, this._day);
    }

    /**
     * Returns a copy of this {@link LocalDate} with the specified period in months added.
     *
     * This method adds the specified amount to the months field in three steps:
     *
     * 1. Add the input months to the month-of-year field
     * 2. Check if the resulting date would be invalid
     * 3. Adjust the day-of-month to the last valid day if necessary
     *
     * For example, 2007-03-31 plus one month would result in the invalid date
     * 2007-04-31. Instead of returning an invalid result, the last valid day
     * of the month, 2007-04-30, is selected instead.
     *
     * @param {number} monthsToAdd - the months to add, may be negative
     * @return {LocalDate} a {@link LocalDate} based on this date with the months added, not null
     * @throws {DateTimeException} if the result exceeds the supported date range
     */
    plusMonths(monthsToAdd) {
        if (monthsToAdd === 0) {
            return this;
        }
        const monthCount = this._year * 12 + (this._month - 1);
        const calcMonths = monthCount + monthsToAdd;  // safe overflow
        const newYear = ChronoField.YEAR.checkValidIntValue(MathUtil.floorDiv(calcMonths, 12));
        const newMonth = MathUtil.floorMod(calcMonths, 12) + 1;
        return LocalDate._resolvePreviousValid(newYear, newMonth, this._day);
    }

    /**
     * Returns a copy of this {@link LocalDate} with the specified period in weeks added.
     *
     * This method adds the specified amount in weeks to the days field incrementing
     * the month and year fields as necessary to ensure the result remains valid.
     * The result is only invalid if the maximum/minimum year is exceeded.
     *
     * For example, 2008-12-31 plus one week would result in 2009-01-07.
     *
     * @param {!number} weeksToAdd - the weeks to add, may be negative
     * @return {LocalDate} a {@link LocalDate} based on this date with the weeks added, not null
     * @throws {DateTimeException} if the result exceeds the supported date range
     */
    plusWeeks(weeksToAdd) {
        return this.plusDays(MathUtil.safeMultiply(weeksToAdd, 7));
    }


    /**
     * Returns a copy of this LocalDate with the specified number of days added.
     *
     * This method adds the specified amount to the days field incrementing the
     * month and year fields as necessary to ensure the result remains valid.
     * The result is only invalid if the maximum/minimum year is exceeded.
     *
     * For example, 2008-12-31 plus one day would result in 2009-01-01.
     *
     * @param {number} daysToAdd - the days to add, may be negative
     * @return {LocalDate} a LocalDate based on this date with the days added, not null
     * @throws AssertionError if the result exceeds the supported date range
     */
    plusDays(daysToAdd) {
        if (daysToAdd === 0) {
            return this;
        }
        const mjDay = MathUtil.safeAdd(this.toEpochDay(), daysToAdd);
        return LocalDate.ofEpochDay(mjDay);
    }

    /**
     * Returns a copy of this date with the specified period subtracted.
     *
     * This method returns a new date based on this date with the specified period subtracted.
     * This can be used to subtract any period that is defined by a unit, for example to subtract years, months or days.
     * The unit is responsible for the details of the calculation, including the resolution
     * of any edge cases in the calculation.
     *
     * @param {!number} amountToSubtract - the amount of the unit to subtract from the result, may be negative
     * @param {!TemporalUnit} unit  the unit of the period to subtract, not null
     * @return {LocalDate} a {@link LocalDate} based on this date with the specified period subtracted, not null
     * @throws {DateTimeException} if the unit cannot be added to this type
     */
    _minusUnit(amountToSubtract, unit) {
        requireNonNull(amountToSubtract, 'amountToSubtract');
        requireNonNull(unit, 'unit');
        return this._plusUnit(-1 * amountToSubtract, unit);
    }

    /**
     * Returns a copy of this {@link LocalDate} with the specified period in years subtracted.
     *
     * This method subtracts the specified amount from the years field in three steps:
     *
     * 1. Subtract the input years to the year field
     * 2. Check if the resulting date would be invalid
     * 3. Adjust the day-of-month to the last valid day if necessary
     *
     * For example, 2008-02-29 (leap year) minus one year would result in the
     * invalid date 2007-02-29 (standard year). Instead of returning an invalid
     * result, the last valid day of the month, 2007-02-28, is selected instead.
     *
     * @param {!number} yearsToSubtract - the years to subtract, may be negative
     * @return {LocalDate} a {@link LocalDate} based on this date with the years subtracted, not null
     * @throws {DateTimeException} if the result exceeds the supported date range
     */
    minusYears(yearsToSubtract) {
        return this.plusYears(yearsToSubtract * -1);
    }

    /**
     * Returns a copy of this {@link LocalDate} with the specified period in months subtracted.
     *
     * This method subtracts the specified amount from the months field in three steps:
     *
     * 1. Subtract the input months to the month-of-year field
     * 2. Check if the resulting date would be invalid
     * 3. Adjust the day-of-month to the last valid day if necessary
     *
     * For example, 2007-03-31 minus one month would result in the invalid date
     * 2007-02-31. Instead of returning an invalid result, the last valid day
     * of the month, 2007-02-28, is selected instead.
     *
     * @param {!number} monthsToSubtract - the months to subtract, may be negative
     * @return {LocalDate} a {@link LocalDate} based on this date with the months subtracted, not null
     * @throws {DateTimeException} if the result exceeds the supported date range
     */
    minusMonths(monthsToSubtract) {
        return this.plusMonths(monthsToSubtract * -1);
    }

    /**
     * Returns a copy of this {@link LocalDate} with the specified period in weeks subtracted.
     *
     * This method subtracts the specified amount in weeks from the days field decrementing
     * the month and year fields as necessary to ensure the result remains valid.
     * The result is only invalid if the maximum/minimum year is exceeded.
     *
     * For example, 2009-01-07 minus one week would result in 2008-12-31.
     *
     * @param {!number} weeksToSubtract - the weeks to subtract, may be negative
     * @return {LocalDate} a {@link LocalDate} based on this date with the weeks subtracted, not null
     * @throws {DateTimeException} if the result exceeds the supported date range
     */
    minusWeeks(weeksToSubtract) {
        return this.plusWeeks(weeksToSubtract * -1);
    }

    /*
     * Returns a copy of this LocalDate with the specified number of days subtracted.
     *
     * This method subtracts the specified amount from the days field decrementing the
     * month and year fields as necessary to ensure the result remains valid.
     * The result is only invalid if the maximum/minimum year is exceeded.
     *
     * For example, 2009-01-01 minus one day would result in 2008-12-31.
     *
     * @param {number} daysToSubtract - the days to subtract, may be negative
     * @return {LocalDate} a LocalDate based on this date with the days subtracted, not null
     * @throws AssertionError if the result exceeds the supported date range
     */
    minusDays(daysToSubtract) {
        return this.plusDays(daysToSubtract * -1);
    }

    /**
     * Queries this date using the specified query.
     *
     * This queries this date using the specified query strategy object.
     * The {@link TemporalQuery} object defines the logic to be used to
     * obtain the result. Read the documentation of the query to understand
     * what the result of this method will be.
     *
     * The result of this method is obtained by invoking the
     * {@link TemporalQuery#queryFrom} method on the
     * specified query passing `this` as the argument.
     *
     * @param {TemporalQuery} query - the query to invoke, not null
     * @return the query result, null may be returned (defined by the query)
     * @throws {DateTimeException} if unable to query (defined by the query)
     * @throws {ArithmeticException} if numeric overflow occurs (defined by the query)
     */
    query(query) {
        requireNonNull(query, 'query');
        if (query === TemporalQueries.localDate()) {
            return this;
        }
        return super.query(query);
    }

    /**
     * Adjusts the specified temporal object to have the same date as this object.
     *
     * This returns a temporal object of the same observable type as the input
     * with the date changed to be the same as this.
     *
     * The adjustment is equivalent to using {@link Temporal#with}
     * passing {@link ChronoField.EPOCH_DAY} as the field.
     *
     * In most cases, it is clearer to reverse the calling pattern by using
     * {@link Temporal#with}:
     * <pre>
     *   // these two lines are equivalent, but the second approach is recommended
     *   temporal = thisLocalDate.adjustInto(temporal);
     *   temporal = temporal.with(thisLocalDate);
     * </pre>
     *
     * @param {!TemporalAdjuster} temporal - the target object to be adjusted, not null
     * @return the adjusted object, not null
     * @throws {DateTimeException} if unable to make the adjustment
     * @throws {ArithmeticException} if numeric overflow occurs
     */
    adjustInto(temporal) {
        return super.adjustInto(temporal);
    }

    /**
     * function overloading for {@link LocalDate.until}
     *
     * called with 1 (or less) arguments {{@link LocalDate.until1}} is called
     * otherwise {@link LocalDate.until2}
     *
     * @param {!TemporalAccessor} p1
     * @param {TemporalUnit} p2 - not null if called with 2 arguments
     * @return {number|Period}
     */
    until(p1, p2){
        if(arguments.length < 2){
            return this.until1(p1);
        } else {
            return this.until2(p1, p2);
        }
    }

    /**
     * Calculates the period between this date and another date in
     * terms of the specified unit.
     *
     * This calculates the period between two dates in terms of a single unit.
     * The start and end points are `this` and the specified date.
     * The result will be negative if the end is before the start.
     * The {@link Temporal} passed to this method must be a {@link LocalDate}.
     * For example, the period in days between two dates can be calculated
     * using {@link startDate.until}.
     *
     * The calculation returns a whole number, representing the number of
     * complete units between the two dates.
     * For example, the period in months between 2012-06-15 and 2012-08-14
     * will only be one month as it is one day short of two months.
     *
     * This method operates in association with {@link TemporalUnit#between}.
     * The result of this method is a `long` representing the amount of
     * the specified unit. By contrast, the result of {@link between} is an
     * object that can be used directly in addition/subtraction:
     * <pre>
     *   long period = start.until(end, MONTHS);   // this method
     *   dateTime.plus(MONTHS.between(start, end));      // use in plus/minus
     * </pre>
     *
     * The calculation is implemented in this method for {@link ChronoUnit}.
     * The units {@link DAYS}, {@link WEEKS}, {@link MONTHS}, {@link YEARS},
     * {@link DECADES}, {@link CENTURIES}, {@link MILLENNIA} and {@link ERAS}
     * are supported. Other {@link ChronoUnit} values will throw an exception.
     *
     * If the unit is not a {@link ChronoUnit}, then the result of this method
     * is obtained by invoking {@link TemporalUnit.between}
     * passing `this` as the first argument and the input temporal as
     * the second argument.
     *
     * @param {!TemporalAccessor} endExclusive - the end date, which is converted to a {@link LocalDate}, not null
     * @param {!TemporalUnit} unit - the unit to measure the period in, not null
     * @return {number} the amount of the period between this date and the end date
     * @throws {DateTimeException} if the period cannot be calculated
     * @throws {ArithmeticException} if numeric overflow occurs
     */
    until2(endExclusive, unit) {
        const end = LocalDate.from(endExclusive);
        if (unit instanceof ChronoUnit) {
            switch (unit) {
                case ChronoUnit.DAYS: return this.daysUntil(end);
                case ChronoUnit.WEEKS: return MathUtil.intDiv(this.daysUntil(end), 7);
                case ChronoUnit.MONTHS: return this._monthsUntil(end);
                case ChronoUnit.YEARS: return MathUtil.intDiv(this._monthsUntil(end), 12);
                case ChronoUnit.DECADES: return MathUtil.intDiv(this._monthsUntil(end), 120);
                case ChronoUnit.CENTURIES: return MathUtil.intDiv(this._monthsUntil(end), 1200);
                case ChronoUnit.MILLENNIA: return MathUtil.intDiv(this._monthsUntil(end), 12000);
                case ChronoUnit.ERAS: return end.getLong(ChronoField.ERA) - this.getLong(ChronoField.ERA);
            }
            throw new UnsupportedTemporalTypeException(`Unsupported unit: ${unit}`);
        }
        return unit.between(this, end);
    }

    /**
     *
     * @param {!LocalDate} end
     * @returns {number}
     * @protected
     */
    daysUntil(end) {
        return end.toEpochDay() - this.toEpochDay();  // no overflow
    }

    /**
     *
     * @param {!LocalDate} end
     * @returns {number}
     * @private
     */
    _monthsUntil(end) {
        const packed1 = this._prolepticMonth() * 32 + this.dayOfMonth();  // no overflow
        const packed2 = end._prolepticMonth() * 32 + end.dayOfMonth();  // no overflow
        return MathUtil.intDiv((packed2 - packed1), 32);
    }

    /**
     * Calculates the period between this date and another date as a {@link Period}.
     *
     * This calculates the period between two dates in terms of years, months and days.
     * The start and end points are `this` and the specified date.
     * The result will be negative if the end is before the start.
     *
     * The calculation is performed using the ISO calendar system.
     * If necessary, the input date will be converted to ISO.
     *
     * The start date is included, but the end date is not.
     * The period is calculated by removing complete months, then calculating
     * the remaining number of days, adjusting to ensure that both have the same sign.
     * The number of months is then normalized into years and months based on a 12 month year.
     * A month is considered to be complete if the end day-of-month is greater
     * than or equal to the start day-of-month.
     * For example, from `2010-01-15` to `2011-03-18` is "1 year, 2 months and 3 days".
     *
     * The result of this method can be a negative period if the end is before the start.
     * The negative sign will be the same in each of year, month and day.
     *
     * There are two equivalent ways of using this method.
     * The first is to invoke this method.
     * The second is to use {@link Period#between}:
     * <pre>
     *   // these two lines are equivalent
     *   period = start.until(end);
     *   period = Period.between(start, end);
     * </pre>
     * The choice should be made based on which makes the code more readable.
     *
     * @param {!TemporalAccessor} endDate - the end date, exclusive, which may be in any chronology, not null
     * @return {Period} the period between this date and the end date, not null
     */
    until1(endDate) {
        const end = LocalDate.from(endDate);
        let totalMonths = end._prolepticMonth() - this._prolepticMonth();  // safe
        let days = end._day - this._day;
        if (totalMonths > 0 && days < 0) {
            totalMonths--;
            const calcDate = this.plusMonths(totalMonths);
            days = (end.toEpochDay() - calcDate.toEpochDay());  // safe
        } else if (totalMonths < 0 && days > 0) {
            totalMonths++;
            days -= end.lengthOfMonth();
        }
        const years = MathUtil.intDiv(totalMonths, 12);  // safe
        const months = MathUtil.intMod(totalMonths, 12);  // safe
        return Period.of(years, months, days);
    }


    //-----------------------------------------------------------------------
    /**
     * function overloading for {@link LocalDate.atTime}
     *
     * if called with 1 argument {@link LocalDate.atTime1} is called
     * otherwise {@link LocalDate.atTime4}
     *
     * @return {LocalDateTime|OffsetDateTime} the local date-time formed from this date and the specified params
     */
    atTime(){
        if(arguments.length===1){
            return this.atTime1.apply(this, arguments);
        } else {
            return this.atTime4.apply(this, arguments);
        }
    }

    /**
     * Combines this date with a time to create a {@link LocalDateTime}.
     *
     * This returns a {@link LocalDateTime} formed from this date at the specified time.
     * All possible combinations of date and time are valid.
     *
     * @param {LocalTime} time - the time to combine with, not null
     * @return {LocalDateTime|OffsetDateTime} the date-time formed from this date and the specified time, not null
     */
    atTime1(time) {
        requireNonNull(time, 'time');
        if (time instanceof LocalTime) {
            return LocalDateTime.of(this, time);
        } else if (time instanceof OffsetTime) {
            return this._atTimeOffsetTime(time);
        } else {
            throw new IllegalArgumentException(`time must be an instance of LocalTime or OffsetTime${ 
                time && time.constructor && time.constructor.name ? `, but is ${time.constructor.name}` : ''}`);
        }
    }

    /**
     * Combines this date with a time to create a {@link LocalDateTime}.
     *
     * This returns a {@link LocalDateTime} formed from this date at the
     * specified hour, minute, second and nanosecond.
     * The individual time fields must be within their valid range.
     * All possible combinations of date and time are valid.
     *
     * @param {!number} hour - the hour-of-day to use, from 0 to 23
     * @param {!number} minute - the minute-of-hour to use, from 0 to 59
     * @param {number} [second=0] - the second-of-minute to represent, from 0 to 59
     * @param {number} [nanoOfSecond=0] - the nano-of-second to represent, from 0 to 999,999,999
     * @return {LocalDateTime} the local date-time formed from this date and the specified time, not null
     * @throws {DateTimeException} if the value of any field is out of range
     */
    atTime4(hour, minute, second=0, nanoOfSecond=0) {
        return this.atTime1(LocalTime.of(hour, minute, second, nanoOfSecond));
    }

    /**
     * Combines this date with an offset time to create an {@link OffsetDateTime}.
     *
     * This returns an {@link OffsetDateTime} formed from this date at the specified time.
     * All possible combinations of date and time are valid.
     *
     * @param {OffsetTime} time - the time to combine with, not null
     * @return {OffsetDateTime} the offset date-time formed from this date and the specified time, not null
     */
    _atTimeOffsetTime(time) { // atTime(offsetTime)
        return OffsetDateTime.of(LocalDateTime.of(this, time.toLocalTime()), time.offset());
    }

    /**
     * Combines this date with the time of midnight to create a {@link LocalDateTime}
     * at the start of this date.
     *
     * This returns a {@link LocalDateTime} formed from this date at the time of
     * midnight, 00:00, at the start of this date.
     *
     * If zone is not null, this returns a {@link ZonedDateTime} formed from this date at the
     * specified zone, with the time set to be the earliest valid time according
     * to the rules in the time-zone.
     *
     * Time-zone rules, such as daylight savings, mean that not every local date-time
     * is valid for the specified zone, thus the local date-time may not be midnight.
     *
     * In most cases, there is only one valid offset for a local date-time.
     * In the case of an overlap, there are two valid offsets, and the earlier one is used,
     * corresponding to the first occurrence of midnight on the date.
     * In the case of a gap, the zoned date-time will represent the instant just after the gap.
     *
     * If the zone ID is a {@link ZoneOffset}, then the result always has a time of midnight.
     *
     * To convert to a specific time in a given time-zone call {@link atTime}
     * followed by {@link LocalDateTime#atZone}.
     *
     * @param {ZoneId} zone - optional ZoneId or ZoneOffset
     * @return {LocalDateTime|ZonedDateTime} the local date-time of midnight at the start of this date, not null
     */
    atStartOfDay(zone) {
        if(zone != null){
            return this._atStartOfDayWithZone(zone);
        } else {
            return LocalDateTime.of(this, LocalTime.MIDNIGHT);
        }
    }

    /**
     * Combines this date with a time-zone to create a {@link ZonedDateTime}
     * at the start of the day
     *
     * This returns a {@link ZonedDateTime} formed from this date at the
     * specified zone, with the time set to be the earliest valid time according
     * to the rules in the time-zone.
     *
     * Time-zone rules, such as daylight savings, mean that not every local date-time
     * is valid for the specified zone, thus the local date-time may not be midnight.
     *
     * In most cases, there is only one valid offset for a local date-time.
     * In the case of an overlap, there are two valid offsets, and the earlier one is used,
     * corresponding to the first occurrence of midnight on the date.
     * In the case of a gap, the zoned date-time will represent the instant just after the gap.
     *
     * If the zone ID is a {@link ZoneOffset}, then the result always has a time of midnight.
     *
     * To convert to a specific time in a given time-zone call {@link atTime}
     * followed by {@link LocalDateTime#atZone}.
     *
     * @param {!ZoneId} zone - the zone ID to use, not null
     * @return {ZonedDateTime} the zoned date-time formed from this date and the earliest valid time for the zone, not null
     */
    _atStartOfDayWithZone(zone) {
        requireNonNull(zone, 'zone');
        let ldt = this.atTime(LocalTime.MIDNIGHT);
        // need to handle case where there is a gap from 11:30 to 00:30
        // standard ZDT factory would result in 01:00 rather than 00:30
        if (zone instanceof ZoneOffset === false) {
            const trans = zone.rules().transition(ldt);
            if (trans != null && trans.isGap()) {
                ldt = trans.dateTimeAfter();
            }
        }
        return ZonedDateTime.of(ldt, zone);
    }


    /**
     * Converts this date to the Epoch Day.
     *
     * The Epoch Day count is a simple incrementing count of days where day 0 is 1970-01-01 (ISO).
     * This definition is the same for all chronologies, enabling conversion.
     *
     * @return {number} the Epoch Day equivalent to this date
     */
    toEpochDay() {
        const y = this._year;
        const m = this._month;
        let total = 0;
        total += 365 * y;
        if (y >= 0) {
            total += MathUtil.intDiv(y + 3, 4) - MathUtil.intDiv(y + 99, 100) + MathUtil.intDiv(y + 399, 400);
        } else {
            total -= MathUtil.intDiv(y, -4) - MathUtil.intDiv(y, -100) + MathUtil.intDiv(y, -400);
        }
        total += MathUtil.intDiv(367 * m - 362, 12);
        total += this.dayOfMonth() - 1;
        if (m > 2) {
            total--;
            if (!IsoChronology.isLeapYear(y)) {
                total--;
            }
        }
        return total - DAYS_0000_TO_1970;
    }

    /**
     * Compares this date to another date.
     *
     * The comparison is primarily based on the date, from earliest to latest.
     * It is "consistent with equals", as defined by {@link Comparable}.
     *
     * If all the dates being compared are instances of {@link LocalDate},
     * then the comparison will be entirely based on the date.
     * If some dates being compared are in different chronologies, then the
     * chronology is also considered, see {@link ChronoLocalDate.compareTo}.
     *
     * @param {!LocalDate} other - the other date to compare to, not null
     * @return {number} the comparator value, negative if less, positive if greater
     */
    compareTo(other) {
        requireNonNull(other, 'other');
        requireInstance(other, LocalDate, 'other');
        return this._compareTo0(other);
        // return super.compareTo(other);  if not instanceof LocalDate
    }

    /**
     *
     * @param {!LocalDate} otherDate
     * @returns {number}
     * @private
     */
    _compareTo0(otherDate) {
        let cmp = (this._year - otherDate._year);
        if (cmp === 0) {
            cmp = (this._month - otherDate._month);
            if (cmp === 0) {
                cmp = (this._day - otherDate._day);
            }
        }
        return cmp;
    }

    /**
     * Checks if this date is after the specified date.
     *
     * This checks to see if this date represents a point on the
     * local time-line after the other date.
     * <pre>
     *   LocalDate a = LocalDate.of(2012, 6, 30);
     *   LocalDate b = LocalDate.of(2012, 7, 1);
     *   a.isAfter(b) == false
     *   a.isAfter(a) == false
     *   b.isAfter(a) == true
     * </pre>
     *
     * This method only considers the position of the two dates on the local time-line.
     * It does not take into account the chronology, or calendar system.
     * This is different from the comparison in {@link compareTo},
     * but is the same approach as {@link DATE_COMPARATOR}.
     *
     * @param {!LocalDate} other - the other date to compare to, not null
     * @return {boolean} true if this date is after the specified date
     */
    isAfter(other) {
        return this.compareTo(other) > 0;
        // return super.isAfter(other) if not instanceof LocalDate
    }

    /**
     * Checks if this date is before the specified date.
     *
     * This checks to see if this date represents a point on the
     * local time-line before the other date.
     * <pre>
     *   LocalDate a = LocalDate.of(2012, 6, 30);
     *   LocalDate b = LocalDate.of(2012, 7, 1);
     *   a.isBefore(b) == true
     *   a.isBefore(a) == false
     *   b.isBefore(a) == false
     * </pre>
     *
     * This method only considers the position of the two dates on the local time-line.
     * It does not take into account the chronology, or calendar system.
     * This is different from the comparison in {@link compareTo},
     * but is the same approach as {@link DATE_COMPARATOR}.
     *
     * @param {!LocalDate} other - the other date to compare to, not null
     * @return {boolean} true if this date is before the specified date
     */
    isBefore(other) {
        return this.compareTo(other) < 0;
        // return super.isBefore(other) if not instanceof LocalDate
    }

    /**
     * Checks if this date is equal to the specified date.
     *
     * This checks to see if this date represents the same point on the
     * local time-line as the other date.
     * <pre>
     *   LocalDate a = LocalDate.of(2012, 6, 30);
     *   LocalDate b = LocalDate.of(2012, 7, 1);
     *   a.isEqual(b) == false
     *   a.isEqual(a) == true
     *   b.isEqual(a) == false
     * </pre>
     *
     * This method only considers the position of the two dates on the local time-line.
     * It does not take into account the chronology, or calendar system.
     * This is different from the comparison in {@link compareTo}
     * but is the same approach as {@link DATE_COMPARATOR}.
     *
     * @param {!LocalDate} other - the other date to compare to, not null
     * @return {boolean} true if this date is equal to the specified date
     */
    isEqual(other) {
        return this.compareTo(other) === 0;
        // return super.isEqual(other) if not instanceof LocalDate
    }

    /**
     * Checks if this date is equal to another date.
     *
     * Compares this LocalDate with another ensuring that the date is the same.
     *
     * Only objects of type LocalDate are compared, other types return false.
     *
     * @param {*} other - the object to check, null returns false
     * @return {boolean} true if this is equal to the other date
     */
    equals(other) {
        if (this === other) {
            return true;
        }
        if (other instanceof LocalDate) {
            return this._compareTo0(other) === 0;
        }
        return false;
    }

    /**
     * A hash code for this date.
     *
     * @return {number} a suitable hash code
     */
    hashCode() {
        const yearValue = this._year;
        const monthValue = this._month;
        const dayValue = this._day;
        return MathUtil.hash((yearValue & 0xFFFFF800) ^ ((yearValue << 11) + (monthValue << 6) + (dayValue)));
    }

    /**
     * Outputs this date as a String, such as 2007-12-03.
     * The output will be in the ISO-8601 format uuuu-MM-dd.
     *
     * @return {string} a string representation of this date, not null
     */
    toString() {
        let dayString, monthString, yearString;

        const yearValue = this._year;
        const monthValue = this._month;
        const dayValue = this._day;

        const absYear = Math.abs(yearValue);

        if (absYear < 1000) {
            if (yearValue < 0) {
                yearString = `-${(`${yearValue - 10000}`).slice(-4)}`;
            } else {
                yearString = (`${yearValue + 10000}`).slice(-4);
            }
        } else {
            if (yearValue > 9999) {
                yearString = `+${yearValue}`;
            } else {
                yearString = `${yearValue}`;
            }
        }

        if (monthValue < 10) {
            monthString = `-0${monthValue}`;
        } else {
            monthString = `-${monthValue}`;
        }

        if (dayValue < 10) {
            dayString = `-0${dayValue}`;
        } else {
            dayString = `-${dayValue}`;
        }

        return yearString + monthString + dayString;
    }

    /**
     *
     * @return {string} same as {@link LocalDate.toString}
     */
    toJSON() {
        return this.toString();
    }

    /**
     * Outputs this date as a string using the formatter.
     *
     * @param {DateTimeFormatter} formatter  the formatter to use, not null
     * @return {String} the formatted date string, not null
     * @throws DateTimeException if an error occurs during printing
     */
    format(formatter) {
        requireNonNull(formatter, 'formatter');
        requireInstance(formatter, DateTimeFormatter, 'formatter');
        return super.format(formatter);
    }
}

export function _init() {
    /**
     * The minimum supported {@link LocalDate}
     * This could be used by an application as a "far past" date.
     */
    LocalDate.MIN = LocalDate.of(YearConstants.MIN_VALUE, 1, 1);
    /**
     * The maximum supported {@link LocalDate}
     * This could be used by an application as a "far future" date.
     */
    LocalDate.MAX = LocalDate.of(YearConstants.MAX_VALUE, 12, 31);
    /**
     * The date at epoch day 0, that is 1970-01-01.
     */
    LocalDate.EPOCH_0 = LocalDate.ofEpochDay(0);

    LocalDate.FROM = createTemporalQuery('LocalDate.FROM', (temporal) => {
        return LocalDate.from(temporal);
    });
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { MathUtil } from './MathUtil';
import { requireNonNull, requireInstance } from './assert';
import { DateTimeException, UnsupportedTemporalTypeException } from './errors';

import { Clock } from './Clock';
import { Instant } from './Instant';
import { LocalDate } from './LocalDate';
import { LocalTime } from './LocalTime';
import { OffsetDateTime } from './OffsetDateTime';
import { ZonedDateTime } from './ZonedDateTime';
import { ZoneId } from './ZoneId';
import { ZoneOffset } from './ZoneOffset';


import { DateTimeFormatter } from './format/DateTimeFormatter';
import { ChronoField } from './temporal/ChronoField';
import { ChronoUnit } from './temporal/ChronoUnit';
import { TemporalQueries } from './temporal/TemporalQueries';
import { createTemporalQuery } from './temporal/TemporalQuery';

import { ChronoLocalDateTime } from './chrono/ChronoLocalDateTime';

/**
 * A date-time without a time-zone in the ISO-8601 calendar system,
 * such as `2007-12-03T10:15:30`.
 *
 * {@link LocalDateTime} is an immutable date-time object that represents a date-time,
 * often viewed as year-month-day-hour-minute-second. Other date and time fields,
 * such as day-of-year, day-of-week and week-of-year, can also be accessed.
 * Time is represented to nanosecond precision.
 * For example, the value '2nd October 2007 at 13:45.30.123456789' can be
 * stored in a {@link LocalDateTime}.
 *
 * This class does not store or represent a time-zone.
 * Instead, it is a description of the date, as used for birthdays, combined with
 * the local time as seen on a wall clock.
 * It cannot represent an instant on the time-line without additional information
 * such as an offset or time-zone.
 *
 * The ISO-8601 calendar system is the modern civil calendar system used today
 * in most of the world. It is equivalent to the proleptic Gregorian calendar
 * system, in which today's rules for leap years are applied for all time.
 * For most applications written today, the ISO-8601 rules are entirely suitable.
 * However, any application that makes use of historical dates, and requires them
 * to be accurate will find the ISO-8601 approach unsuitable.
 *
 * ### Static properties of Class {@link LocalTime}
 *
 * LocalDateTime.MIN
 *
 * The minimum supported {@link LocalDateTime}, '-999999999-01-01T00:00:00'.
 * This is the local date-time of midnight at the start of the minimum date.
 * This combines {@link LocalDate#MIN} and {@link LocalTime#MIN}.
 * This could be used by an application as a 'far past' date-time.
 *
 * LocalDateTime.MAX
 *
 * The maximum supported {@link LocalDateTime}, '+999999999-12-31T23:59:59.999999999'.
 * This is the local date-time just before midnight at the end of the maximum date.
 * This combines {@link LocalDate#MAX} and {@link LocalTime#MAX}.
 * This could be used by an application as a 'far future' date-time.
 *
 */
export class LocalDateTime extends ChronoLocalDateTime
/** extends ChronoLocalDateTime<LocalDate>
implements Temporal, TemporalAdjuster, Serializable */ {


    /**
     * Obtains the current date-time from from the specified clock or the system clock in the specified time-zone.
     *
     * If the argument is an instance of Clock this will query the specified clock to obtain the current date-time.
     * Using this method allows the use of an alternate clock for testing.
     * The alternate clock may be introduced using dependency injection.
     *
     * If the argument is an instance of ZoneId this will query the system clock (see {@link Clock#system}) to obtain the current date-time.
     * Specifying the time-zone avoids dependence on the default time-zone.
     *
     * If nor argument is applied, the system default time zone is used to obtain the current date-time.
     *
     * Using this method will prevent the ability to use an alternate clock for testing
     * because the clock is hard-coded.
     *
     * @param {Clock|ZoneId} clockOrZone - the zone ID or clock to use, if null Clock.systemDefaultZone() is used.
     * @return {LocalDateTime} the current date-time using the system clock, not null
     */
    static now(clockOrZone) {
        if (clockOrZone == null){
            return LocalDateTime._now(Clock.systemDefaultZone());
        } else if (clockOrZone instanceof Clock){
            return LocalDateTime._now(clockOrZone);
        } else {
            return LocalDateTime._now(Clock.system(clockOrZone));
        }
    }

    /**
     * Obtains the current date-time from the specified clock.
     *
     * This will query the specified clock to obtain the current date-time.
     * Using this method allows the use of an alternate clock for testing.
     * The alternate clock may be introduced using dependency injection.
     *
     * @param {Clock} clock - the clock to use, defaults to Clock.systemDefaultZone()
     * @return {LocalDateTime} the current date-time, not null
     */
    static _now(clock) {
        requireNonNull(clock, 'clock');
        return LocalDateTime.ofInstant(clock.instant(), clock.zone());

        // this is an alternative implementation with better performance.
        // const epochMilli = clock.millis();
        // const offset = clock.zone().rules().offsetOfEpochMilli(epochMilli);
        // return LocalDateTime._ofEpochMillis(epochMilli, offset);

    }

    /**
     * @see comment at {LocalDateTime._now}
     * @param {number} epochMilli
     * @param {ZoneOffset} offset
     * @return {LocalDateTime} the  date-time, not null
     *
     */
    static _ofEpochMillis(epochMilli, offset){
        const localSecond = MathUtil.floorDiv(epochMilli, 1000) + offset.totalSeconds();
        const localEpochDay = MathUtil.floorDiv(localSecond, LocalTime.SECONDS_PER_DAY);
        const secsOfDay = MathUtil.floorMod(localSecond, LocalTime.SECONDS_PER_DAY);
        const nanoOfSecond = MathUtil.floorMod(epochMilli, 1000) * 1000000;
        const date = LocalDate.ofEpochDay(localEpochDay);
        const time = LocalTime.ofSecondOfDay(secsOfDay, nanoOfSecond);
        return new LocalDateTime(date, time);

    }

    //-----------------------------------------------------------------------
    /**
     * function overloading for {@link LocalDateTime.of}
     *
     * if called with 2 arguments and first argument is an instance of LocalDate and second is an
     * instance of LocalTime, then {@link LocalDateTime.ofDateAndTime} is executed.
     *
     * Otherwise {@link LocalDateTime.ofNumbers} is executed.
     *
     * @returns {LocalDateTime}
     */
    static of(){
        if (arguments.length <= 2){
            return LocalDateTime.ofDateAndTime.apply(this, arguments);
        } else {
            return LocalDateTime.ofNumbers.apply(this, arguments);
        }
    }
    /**
     * Obtains an instance of {@link LocalDateTime} from year, month,
     * day, hour, minute, second and nanosecond.
     *
     * The day must be valid for the year and month, otherwise an exception will be thrown.
     *
     * @param {number} [year] - the year to represent, from MIN_YEAR to MAX_YEAR
     * @param {number} [month] - the month-of-year to represent, from 1 to 12 or from a Month
     * @param {number} [dayOfMonth] - the day-of-month to represent, from 1 to 31
     * @param {number} [hour=0] - the hour-of-day to represent, from 0 to 23
     * @param {number} [minute=0] - the minute-of-hour to represent, from 0 to 59
     * @param {number} [second=0] - the second-of-minute to represent, from 0 to 59
     * @param {number} [nanoOfSecond=0] - the nano-of-second to represent, from 0 to 999,999,999
     * @return {LocalDateTime} the local date-time, not null
     * @throws {DateTimeException} if the value of any field is out of range
     * @throws {DateTimeException} if the day-of-month is invalid for the month-year
     */
    static ofNumbers(year, month, dayOfMonth, hour=0, minute=0, second=0, nanoOfSecond=0) {
        const date = LocalDate.of(year, month, dayOfMonth);
        const time = LocalTime.of(hour, minute, second, nanoOfSecond);
        return new LocalDateTime(date, time);
    }

    /**
     * Obtains an instance of {@link LocalDateTime} from a date and time.
     *
     * @param {!LocalDate} date - the local date, not null
     * @param {!LocalTime} time - the local time, not null
     * @return {LocalDateTime} the local date-time, not null
     */
    static ofDateAndTime(date, time) {
        requireNonNull(date, 'date');
        requireNonNull(time, 'time');
        return new LocalDateTime(date, time);
    }

    //-------------------------------------------------------------------------
    /**
     * Obtains an instance of {@link LocalDateTime} from an {@link Instant} and zone ID.
     *
     * This creates a local date-time based on the specified instant.
     * First, the offset from UTC/Greenwich is obtained using the zone ID and instant,
     * which is simple as there is only one valid offset for each instant.
     * Then, the instant and offset are used to calculate the local date-time.
     *
     * @param {!Instant} instant  the instant to create the date-time from, not null
     * @param {!ZoneId} [zone=ZoneId.systemDefault()]  the time-zone, which may be an offset, defaults to ZoneId.systemDefault()
     * @return {LocalDateTime} the local date-time, not null
     * @throws {DateTimeException} if the result exceeds the supported range
     */
    static ofInstant(instant, zone=ZoneId.systemDefault()) {
        requireNonNull(instant, 'instant');
        requireInstance(instant, Instant, 'instant');
        requireNonNull(zone, 'zone');
        const offset = zone.rules().offset(instant);
        return LocalDateTime.ofEpochSecond(instant.epochSecond(), instant.nano(), offset);
    }

    /**
     * Obtains an instance of {@link LocalDateTime} using seconds from the
     * epoch of 1970-01-01T00:00:00Z.
     *
     * This allows the {@link ChronoField.INSTANT_SECONDS} epoch-second field
     * to be converted to a local date-time. This is primarily intended for
     * low-level conversions rather than general application usage.
     *
     * @param {number} epochSecond - the number of seconds from the epoch of 1970-01-01T00:00:00Z
     * @param {number|!ZoneOffset} nanoOfSecond - the nanosecond within the second, from 0 to 999,999,999
     * @param {ZoneOffset} offset - the zone offset, not null if called with 3 arguments
     * @return {LocalDateTime} the local date-time, not null
     * @throws {DateTimeException} if the result exceeds the supported range
     */
    static ofEpochSecond(epochSecond=0, nanoOfSecond=0, offset) {
        if(arguments.length === 2 && nanoOfSecond instanceof ZoneOffset){
            offset = nanoOfSecond;
            nanoOfSecond = 0;
        }
        requireNonNull(offset, 'offset');
        const localSecond = epochSecond + offset.totalSeconds();  // overflow caught later
        const localEpochDay = MathUtil.floorDiv(localSecond, LocalTime.SECONDS_PER_DAY);
        const secsOfDay = MathUtil.floorMod(localSecond, LocalTime.SECONDS_PER_DAY);
        const date = LocalDate.ofEpochDay(localEpochDay);
        const time = LocalTime.ofSecondOfDay(secsOfDay, nanoOfSecond);
        return new LocalDateTime(date, time);
    }

    //-----------------------------------------------------------------------
    /**
     * Obtains an instance of {@link LocalDateTime} from a temporal object.
     *
     * A {@link TemporalAccessor} represents some form of date and time information.
     * This factory converts the arbitrary temporal object to an instance of {@link LocalDateTime}.
     *
     * The conversion extracts and combines {@link LocalDate} and {@link LocalTime}.
     *
     * This method matches the signature of the functional interface {@link TemporalQuery}
     * allowing it to be used as a query via method reference, {@link LocalDateTime::from}.
     *
     * @param {!TemporalAccessor} temporal - the temporal object to convert, not null
     * @return {LocalDateTime} {LocalDateTime} the local date-time, not null
     * @throws {DateTimeException} if unable to convert to a {@link LocalDateTime}
     */
    static from(temporal) {
        requireNonNull(temporal, 'temporal');
        if (temporal instanceof LocalDateTime) {
            return temporal;
        } else if (temporal instanceof ZonedDateTime) {
            return temporal.toLocalDateTime();
        }
        try {
            const date = LocalDate.from(temporal);
            const time = LocalTime.from(temporal);
            return new LocalDateTime(date, time);
        } catch (ex) {
            throw new DateTimeException(`Unable to obtain LocalDateTime TemporalAccessor: ${temporal}, type ${temporal.constructor != null ? temporal.constructor.name : ''}`);
        }
    }

    //-----------------------------------------------------------------------
    /**
     * Obtains an instance of {@link LocalDateTime} from a text string using a specific formatter.
     *
     * The text is parsed using the formatter, returning a date-time.
     *
     * @param {!string} text - the text to parse, not null
     * @param {DateTimeFormatter} [formatter=DateTimeFormatter.ISO_LOCAL_DATE_TIME] - the formatter to use,
     * defaults to DateTimeFormatter.ISO_LOCAL_DATE_TIME
     * @return {LocalDateTime} the parsed local date-time, not null
     * @throws {DateTimeParseException} if the text cannot be parsed
     */
    static parse(text, formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME) {
        requireNonNull(formatter, 'formatter');
        return formatter.parse(text, LocalDateTime.FROM);
    }

    //-----------------------------------------------------------------------
    /**
     * Constructor.
     *
     * @param {LocalDate} date - the date part of the date-time, validated not null
     * @param {LocalTime} time - the time part of the date-time, validated not null
     * @private
     */
    constructor(date, time) {
        super();
        requireInstance(date, LocalDate, 'date');
        requireInstance(time, LocalTime, 'time');
        this._date = date;
        this._time = time;
    }

    /**
     * Returns a copy of this date-time with the new date and time, checking
     * to see if a new object is in fact required.
     *
     * @param {LocalDate} newDate - the date of the new date-time, not null
     * @param {LocalTime} newTime - the time of the new date-time, not null
     * @return {LocalDateTime} the date-time, not null
     */
    _withDateTime(newDate, newTime) {
        if (this._date.equals(newDate) && this._time.equals(newTime)) {
            return this;
        }
        return new LocalDateTime(newDate, newTime);
    }

    //-----------------------------------------------------------------------
    /**
     * Checks if the specified field is supported.
     *
     * This checks if this date-time can be queried for the specified field.
     * If false, then calling the {@link LocalDateTime.range} range and
     * {@link LocalDateTime.get} get methods will throw an exception.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields are:
     *
     * * {@link ChronoField.NANO_OF_SECOND}
     * * {@link ChronoField.NANO_OF_DAY}
     * * {@link ChronoField.MICRO_OF_SECOND}
     * * {@link ChronoField.MICRO_OF_DAY}
     * * {@link ChronoField.MILLI_OF_SECOND}
     * * {@link ChronoField.MILLI_OF_DAY}
     * * {@link ChronoField.SECOND_OF_MINUTE}
     * * {@link ChronoField.SECOND_OF_DAY}
     * * {@link ChronoField.MINUTE_OF_HOUR}
     * * {@link ChronoField.MINUTE_OF_DAY}
     * * {@link ChronoField.HOUR_OF_AMPM}
     * * {@link ChronoField.CLOCK_HOUR_OF_AMPM}
     * * {@link ChronoField.HOUR_OF_DAY}
     * * {@link ChronoField.CLOCK_HOUR_OF_DAY}
     * * {@link ChronoField.AMPM_OF_DAY}
     * * {@link ChronoField.DAY_OF_WEEK}
     * * {@link ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH}
     * * {@link ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR}
     * * {@link ChronoField.DAY_OF_MONTH}
     * * {@link ChronoField.DAY_OF_YEAR}
     * * {@link ChronoField.EPOCH_DAY}
     * * {@link ChronoField.ALIGNED_WEEK_OF_MONTH}
     * * {@link ChronoField.ALIGNED_WEEK_OF_YEAR}
     * * {@link ChronoField.MONTH_OF_YEAR}
     * * {@link ChronoField.EPOCH_MONTH}
     * * {@link ChronoField.YEAR_OF_ERA}
     * * {@link ChronoField.YEAR}
     * * {@link ChronoField.ERA}
     *
     * All other {@link ChronoField} instances will return false.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.isSupportedBy}
     * passing `this` as the argument.
     * Whether the field is supported is determined by the field.
     *
     * @param {TemporalField|TemporalUnit} fieldOrUnit - the field to check, null returns false
     * @return {boolean} true if the field is supported on this date-time, false if not
     */
    isSupported(fieldOrUnit) {
        if (fieldOrUnit instanceof ChronoField) {
            return fieldOrUnit.isDateBased() || fieldOrUnit.isTimeBased();
        } else if (fieldOrUnit instanceof ChronoUnit) {
            return fieldOrUnit.isDateBased() || fieldOrUnit.isTimeBased();
        }
        return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
    }

    /**
     * Gets the range of valid values for the specified field.
     *
     * The range object expresses the minimum and maximum valid values for a field.
     * This date-time is used to enhance the accuracy of the returned range.
     * If it is not possible to return the range, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields (see {@link isSupported}) will return
     * appropriate range instances.
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.rangeRefinedBy}
     * passing `this` as the argument.
     * Whether the range can be obtained is determined by the field.
     *
     * @param {!TemporalField} field - the field to query the range for, not null
     * @return {ValueRange} the range of valid values for the field, not null
     * @throws {DateTimeException} if the range for the field cannot be obtained
     */
    range(field) {
        if (field instanceof ChronoField) {
            return (field.isTimeBased() ? this._time.range(field) : this._date.range(field));
        }
        return field.rangeRefinedBy(this);
    }

    /**
     * Gets the value of the specified field from this date-time as an `int`.
     *
     * This queries this date-time for the value for the specified field.
     * The returned value will always be within the valid range of values for the field.
     * If it is not possible to return the value, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields (see {@link isSupported}) will return valid
     * values based on this date-time, except {@link NANO_OF_DAY}, {@link MICRO_OF_DAY},
     * {@link EPOCH_DAY} and {@link EPOCH_MONTH} which are too large to fit in
     * an `int` and throw a {@link DateTimeException}.
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.getFrom}
     * passing `this` as the argument. Whether the value can be obtained,
     * and what the value represents, is determined by the field.
     *
     * @param {!TemporalField} field - the field to get, not null
     * @return {number} the value for the field
     * @throws {DateTimeException} if a value for the field cannot be obtained
     * @throws {ArithmeticException} if numeric overflow occurs
     */
    get(field) {
        if (field instanceof ChronoField) {
            return (field.isTimeBased() ? this._time.get(field) : this._date.get(field));
        }
        return super.get(field);
    }

    /**
     * Gets the value of the specified field from this date-time as a `long`.
     *
     * This queries this date-time for the value for the specified field.
     * If it is not possible to return the value, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields (see {@link isSupported}) will return valid
     * values based on this date-time.
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.getFrom}
     * passing `this` as the argument. Whether the value can be obtained,
     * and what the value represents, is determined by the field.
     *
     * @param {!TemporalField} field - the field to get, not null
     * @return {number} the value for the field
     * @throws {DateTimeException} if a value for the field cannot be obtained
     * @throws {ArithmeticException} if numeric overflow occurs
     */
    getLong(field) {
        requireNonNull(field, 'field');
        if (field instanceof ChronoField) {
            return (field.isTimeBased() ? this._time.getLong(field) : this._date.getLong(field));
        }
        return field.getFrom(this);
    }

    //-----------------------------------------------------------------------
    /**
     * Gets the year field.
     *
     * This method returns the primitive `int` value for the year.
     *
     * The year returned by this method is proleptic as per `get(YEAR)`.
     * To obtain the year-of-era, use `get(YEAR_OF_ERA)`.
     *
     * @return {number} the year, from MIN_YEAR to MAX_YEAR
     */
    year() {
        return this._date.year();
    }

    /**
     * Gets the month-of-year field from 1 to 12.
     *
     * This method returns the month as an `int` from 1 to 12.
     * Application code is frequently clearer if the enum {@link Month}
     * is used by calling {@link getMonth}.
     *
     * @return {number} the month-of-year, from 1 to 12
     * @see #getMonth()
     */
    monthValue() {
        return this._date.monthValue();
    }

    /**
     * Gets the month-of-year field using the {@link Month} enum.
     *
     * This method returns the enum {@link Month} for the month.
     * This avoids confusion as to what `int` values mean.
     * If you need access to the primitive `int` value, use
     * {@link Month#getValue}.
     *
     * @return {Month} the month-of-year, not null
     * @see #getMonthValue()
     */
    month() {
        return this._date.month();
    }

    /**
     * Gets the day-of-month field.
     *
     * This method returns the primitive `int` value for the day-of-month.
     *
     * @return {number} the day-of-month, from 1 to 31
     */
    dayOfMonth() {
        return this._date.dayOfMonth();
    }

    /**
     * Gets the day-of-year field.
     *
     * This method returns the primitive `int` value for the day-of-year.
     *
     * @return {number} the day-of-year, from 1 to 365, or 366 in a leap year
     */
    dayOfYear() {
        return this._date.dayOfYear();
    }

    /**
     * Gets the day-of-week field, which is an enum {@link DayOfWeek}.
     *
     * This method returns the enum {@link DayOfWeek} for the day-of-week.
     * This avoids confusion as to what `int` values mean.
     * If you need access to the primitive `int` value, use
     * {@link DayOfWeek#getValue}.
     *
     * Additional information can be obtained from the {@link DayOfWeek}.
     * This includes textual names of the values.
     *
     * @return {DayOfWeek} the day-of-week, not null
     */
    dayOfWeek() {
        return this._date.dayOfWeek();
    }

    //-----------------------------------------------------------------------
    /**
     * Gets the hour-of-day field.
     *
     * @return {number} the hour-of-day, from 0 to 23
     */
    hour() {
        return this._time.hour();
    }

    /**
     * Gets the minute-of-hour field.
     *
     * @return {number} the minute-of-hour, from 0 to 59
     */
    minute() {
        return this._time.minute();
    }

    /**
     * Gets the second-of-minute field.
     *
     * @return {number} the second-of-minute, from 0 to 59
     */
    second() {
        return this._time.second();
    }

    /**
     * Gets the nano-of-second field.
     *
     * @return {number} the nano-of-second, from 0 to 999,999,999
     */
    nano() {
        return this._time.nano();
    }

    //-----------------------------------------------------------------------

    /**
     * Returns an adjusted copy of this date-time.
     *
     * This returns a new {@link LocalDateTime}, based on this one, with the date-time adjusted.
     * The adjustment takes place using the specified adjuster strategy object.
     * Read the documentation of the adjuster to understand what adjustment will be made.
     *
     * A simple adjuster might simply set the one of the fields, such as the year field.
     * A more complex adjuster might set the date to the last day of the month.
     * A selection of common adjustments is provided in {@link TemporalAdjusters}.
     * These include finding the 'last day of the month' and 'next Wednesday'.
     * Key date-time classes also implement the {@link TemporalAdjuster} interface,
     * such as {@link Month} and {@link MonthDay}.
     * The adjuster is responsible for handling special cases, such as the varying
     * lengths of month and leap years.
     *
     * For example this code returns a date on the last day of July:
     * <pre>
     *  import static org.threeten.bp.Month.*;
     *  import static org.threeten.bp.temporal.Adjusters.*;
     *
     *  result = localDateTime.with(JULY).with(lastDayOfMonth());
     * </pre>
     *
     * The classes {@link LocalDate} and {@link LocalTime} implement {@link TemporalAdjuster},
     * thus this method can be used to change the date, time or offset:
     * <pre>
     *  result = localDateTime.with(date);
     *  result = localDateTime.with(time);
     * </pre>
     *
     * The result of this method is obtained by invoking the
     * {@link TemporalAdjuster#adjustInto} method on the
     * specified adjuster passing `this` as the argument.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {TemporalAdjuster} adjuster the adjuster to use, not null
     * @return {LocalDateTime} a {@link LocalDateTime} based on `this` with the adjustment made, not null
     * @throws {DateTimeException} if the adjustment cannot be made
     * @throws {ArithmeticException} if numeric overflow occurs
     */
    _withAdjuster(adjuster) {
        requireNonNull(adjuster, 'adjuster');
        // optimizations
        if (adjuster instanceof LocalDate) {
            return this._withDateTime(adjuster, this._time);
        } else if (adjuster instanceof LocalTime) {
            return this._withDateTime(this._date, adjuster);
        } else if (adjuster instanceof LocalDateTime) {
            return adjuster;
        }
        return super._withAdjuster(adjuster);
    }

    /**
     * Returns a copy of this date-time with the specified field set to a new value.
     *
     * This returns a new {@link LocalDateTime}, based on this one, with the value
     * for the specified field changed.
     * This can be used to change any supported field, such as the year, month or day-of-month.
     * If it is not possible to set the value, because the field is not supported or for
     * some other reason, an exception is thrown.
     *
     * In some cases, changing the specified field can cause the resulting date-time to become invalid,
     * such as changing the month from 31st January to February would make the day-of-month invalid.
     * In cases like this, the field is responsible for resolving the date. Typically it will choose
     * the previous valid date, which would be the last valid day of February in this example.
     *
     * If the field is a {@link ChronoField} then the adjustment is implemented here.
     * The supported fields (see {@link isSupported}) will behave as in
     * {@link LocalDate#with} or {@link LocalTime#with}.
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.adjustInto}
     * passing `this` as the argument. In this case, the field determines
     * whether and how to adjust the instant.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {TemporalField} field - the field to set in the result, not null
     * @param {number} newValue - the new value of the field in the result
     * @return {LocalDateTime} a {@link LocalDateTime} based on `this` with the specified field set, not null
     * @throws {DateTimeException} if the field cannot be set
     * @throws {ArithmeticException} if numeric overflow occurs
     */
    _withField(field, newValue) {
        requireNonNull(field, 'field');
        if (field instanceof ChronoField) {
            if (field.isTimeBased()) {
                return this._withDateTime(this._date, this._time.with(field, newValue));
            } else {
                return this._withDateTime(this._date.with(field, newValue), this._time);
            }
        }
        return field.adjustInto(this, newValue);
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this {@link LocalDateTime} with the year altered.
     * The time does not affect the calculation and will be the same in the result.
     * If the day-of-month is invalid for the year, it will be changed to the last valid day of the month.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} year - the year to set in the result, from MIN_YEAR to MAX_YEAR
     * @return {LocalDateTime} a {@link LocalDateTime} based on this date-time with the requested year, not null
     * @throws {DateTimeException} if the year value is invalid
     */
    withYear(year) {
        return this._withDateTime(this._date.withYear(year), this._time);
    }

    /**
     * Returns a copy of this {@link LocalDateTime} with the month-of-year altered.
     * The time does not affect the calculation and will be the same in the result.
     * If the day-of-month is invalid for the year, it will be changed to the last valid day of the month.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {!(number|Month)} month - the month-of-year to set in the result, from 1 (January) to 12 (December)
     * @return {LocalDateTime} a {@link LocalDateTime} based on this date-time with the requested month, not null
     * @throws {DateTimeException} if the month-of-year value is invalid
     */
    withMonth(month) {
        return this._withDateTime(this._date.withMonth(month), this._time);
    }

    /**
     * Returns a copy of this {@link LocalDateTime} with the day-of-month altered.
     * If the resulting {@link LocalDateTime} is invalid, an exception is thrown.
     * The time does not affect the calculation and will be the same in the result.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} dayOfMonth - the day-of-month to set in the result, from 1 to 28-31
     * @return {LocalDateTime} a {@link LocalDateTime} based on this date-time with the requested day, not null
     * @throws {DateTimeException} if the day-of-month value is invalid
     * @throws {DateTimeException} if the day-of-month is invalid for the month-year
     */
    withDayOfMonth(dayOfMonth) {
        return this._withDateTime(this._date.withDayOfMonth(dayOfMonth), this._time);
    }

    /**
     * Returns a copy of this {@link LocalDateTime} with the day-of-year altered.
     * If the resulting {@link LocalDateTime} is invalid, an exception is thrown.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} dayOfYear - the day-of-year to set in the result, from 1 to 365-366
     * @return {LocalDateTime} a {@link LocalDateTime} based on this date with the requested day, not null
     * @throws {DateTimeException} if the day-of-year value is invalid
     * @throws {DateTimeException} if the day-of-year is invalid for the year
     */
    withDayOfYear(dayOfYear) {
        return this._withDateTime(this._date.withDayOfYear(dayOfYear), this._time);
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this {@link LocalDateTime} with the hour-of-day value altered.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} hour - the hour-of-day to set in the result, from 0 to 23
     * @return {LocalDateTime} a {@link LocalDateTime} based on this date-time with the requested hour, not null
     * @throws {DateTimeException} if the hour value is invalid
     */
    withHour(hour) {
        const newTime = this._time.withHour(hour);
        return this._withDateTime(this._date, newTime);
    }

    /**
     * Returns a copy of this {@link LocalDateTime} with the minute-of-hour value altered.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} minute - the minute-of-hour to set in the result, from 0 to 59
     * @return {LocalDateTime} a {@link LocalDateTime} based on this date-time with the requested minute, not null
     * @throws {DateTimeException} if the minute value is invalid
     */
    withMinute(minute) {
        const newTime = this._time.withMinute(minute);
        return this._withDateTime(this._date, newTime);
    }

    /**
     * Returns a copy of this {@link LocalDateTime} with the second-of-minute value altered.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} second - the second-of-minute to set in the result, from 0 to 59
     * @return {LocalDateTime} a {@link LocalDateTime} based on this date-time with the requested second, not null
     * @throws {DateTimeException} if the second value is invalid
     */
    withSecond(second) {
        const newTime = this._time.withSecond(second);
        return this._withDateTime(this._date, newTime);
    }

    /**
     * Returns a copy of this {@link LocalDateTime} with the nano-of-second value altered.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} nanoOfSecond - the nano-of-second to set in the result, from 0 to 999,999,999
     * @return {LocalDateTime} a {@link LocalDateTime} based on this date-time with the requested nanosecond, not null
     * @throws {DateTimeException} if the nano value is invalid
     */
    withNano(nanoOfSecond) {
        const newTime = this._time.withNano(nanoOfSecond);
        return this._withDateTime(this._date, newTime);
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this {@link LocalDateTime} with the time truncated.
     *
     * Truncation returns a copy of the original date-time with fields
     * smaller than the specified unit set to zero.
     * For example, truncating with {@link ChronoUnit#MINUTES}
     * will set the second-of-minute and nano-of-second field to zero.
     *
     * The unit must have a duration (see {@link TemporalUnit#getDuration})
     * that divides into the length of a standard day without remainder.
     * This includes all supplied time units on {@link ChronoUnit} and
     * {@link ChronoUnit#DAYS}. Other units throw an exception.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {TemporalUnit} unit - the unit to truncate to, not null
     * @return {LocalDateTime} a {@link LocalDateTime} based on this date-time with the time truncated, not null
     * @throws {DateTimeException} if unable to truncate
     */
    truncatedTo(unit) {
        return this._withDateTime(this._date, this._time.truncatedTo(unit));
    }

    //-----------------------------------------------------------------------

    /**
     * Returns a copy of this date-time with the specified period added.
     *
     * This method returns a new date-time based on this date-time with the specified period added.
     * This can be used to add any period that is defined by a unit, for example to add years, months or days.
     * The unit is responsible for the details of the calculation, including the resolution
     * of any edge cases in the calculation.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} amountToAdd - the amount of the unit to add to the result, may be negative
     * @param {!TemporalUnit} unit - the unit of the period to add, not null
     * @return {LocalDateTime} a {@link LocalDateTime} based on this date-time with the specified period added, not null
     * @throws {DateTimeException} if the unit cannot be added to this type
     */
    _plusUnit(amountToAdd, unit) {
        requireNonNull(unit, 'unit');
        if (unit instanceof ChronoUnit) {
            switch (unit) {
                case ChronoUnit.NANOS: return this.plusNanos(amountToAdd);
                case ChronoUnit.MICROS: return this.plusDays(MathUtil.intDiv(amountToAdd, LocalTime.MICROS_PER_DAY)).plusNanos(MathUtil.intMod(amountToAdd, LocalTime.MICROS_PER_DAY) * 1000);
                case ChronoUnit.MILLIS: return this.plusDays(MathUtil.intDiv(amountToAdd, LocalTime.MILLIS_PER_DAY)).plusNanos(MathUtil.intMod(amountToAdd, LocalTime.MILLIS_PER_DAY) * 1000000);
                case ChronoUnit.SECONDS: return this.plusSeconds(amountToAdd);
                case ChronoUnit.MINUTES: return this.plusMinutes(amountToAdd);
                case ChronoUnit.HOURS: return this.plusHours(amountToAdd);
                case ChronoUnit.HALF_DAYS: return this.plusDays(MathUtil.intDiv(amountToAdd, 256)).plusHours(MathUtil.intMod(amountToAdd, 256) * 12);  // no overflow (256 is multiple of 2)
            }
            return this._withDateTime(this._date.plus(amountToAdd, unit), this._time);
        }
        return unit.addTo(this, amountToAdd);
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this {@link LocalDateTime} with the specified period in years added.
     *
     * This method adds the specified amount to the years field in three steps:
     *
     * 1. Add the input years to the year field
     * 2. Check if the resulting date would be invalid
     * 3. Adjust the day-of-month to the last valid day if necessary
     *
     * For example, 2008-02-29 (leap year) plus one year would result in the
     * invalid date 2009-02-29 (standard year). Instead of returning an invalid
     * result, the last valid day of the month, 2009-02-28, is selected instead.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} years - the years to add, may be negative
     * @return {LocalDateTime} a {@link LocalDateTime} based on this date-time with the years added, not null
     * @throws {DateTimeException} if the result exceeds the supported date range
     */
    plusYears(years) {
        const newDate = this._date.plusYears(years);
        return this._withDateTime(newDate, this._time);
    }

    /**
     * Returns a copy of this {@link LocalDateTime} with the specified period in months added.
     *
     * This method adds the specified amount to the months field in three steps:
     *
     * 1. Add the input months to the month-of-year field
     * 2. Check if the resulting date would be invalid
     * 3. Adjust the day-of-month to the last valid day if necessary
     *
     * For example, 2007-03-31 plus one month would result in the invalid date
     * 2007-04-31. Instead of returning an invalid result, the last valid day
     * of the month, 2007-04-30, is selected instead.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} months - the months to add, may be negative
     * @return {LocalDateTime} a {@link LocalDateTime} based on this date-time with the months added, not null
     * @throws {DateTimeException} if the result exceeds the supported date range
     */
    plusMonths(months) {
        const newDate = this._date.plusMonths(months);
        return this._withDateTime(newDate, this._time);
    }

    /**
     * Returns a copy of this {@link LocalDateTime} with the specified period in weeks added.
     *
     * This method adds the specified amount in weeks to the days field incrementing
     * the month and year fields as necessary to ensure the result remains valid.
     * The result is only invalid if the maximum/minimum year is exceeded.
     *
     * For example, 2008-12-31 plus one week would result in 2009-01-07.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} weeks - the weeks to add, may be negative
     * @return {LocalDateTime} a {@link LocalDateTime} based on this date-time with the weeks added, not null
     * @throws {DateTimeException} if the result exceeds the supported date range
     */
    plusWeeks(weeks) {
        const newDate = this._date.plusWeeks(weeks);
        return this._withDateTime(newDate, this._time);
    }

    /**
     * Returns a copy of this {@link LocalDateTime} with the specified period in days added.
     *
     * This method adds the specified amount to the days field incrementing the
     * month and year fields as necessary to ensure the result remains valid.
     * The result is only invalid if the maximum/minimum year is exceeded.
     *
     * For example, 2008-12-31 plus one day would result in 2009-01-01.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} days - the days to add, may be negative
     * @return {LocalDateTime} a {@link LocalDateTime} based on this date-time with the days added, not null
     * @throws {DateTimeException} if the result exceeds the supported date range
     */
    plusDays(days) {
        const newDate = this._date.plusDays(days);
        return this._withDateTime(newDate, this._time);
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this {@link LocalDateTime} with the specified period in hours added.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} hours - the hours to add, may be negative
     * @return {LocalDateTime} a {@link LocalDateTime} based on this date-time with the hours added, not null
     * @throws {DateTimeException} if the result exceeds the supported date range
     */
    plusHours(hours) {
        return this._plusWithOverflow(this._date, hours, 0, 0, 0, 1);
    }

    /**
     * Returns a copy of this {@link LocalDateTime} with the specified period in minutes added.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} minutes - the minutes to add, may be negative
     * @return {LocalDateTime} a {@link LocalDateTime} based on this date-time with the minutes added, not null
     * @throws {DateTimeException} if the result exceeds the supported date range
     */
    plusMinutes(minutes) {
        return this._plusWithOverflow(this._date, 0, minutes, 0, 0, 1);
    }

    /**
     * Returns a copy of this {@link LocalDateTime} with the specified period in seconds added.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} seconds - the seconds to add, may be negative
     * @return {LocalDateTime} a {@link LocalDateTime} based on this date-time with the seconds added, not null
     * @throws {DateTimeException} if the result exceeds the supported date range
     */
    plusSeconds(seconds) {
        return this._plusWithOverflow(this._date, 0, 0, seconds, 0, 1);
    }

    /**
     * Returns a copy of this {@link LocalDateTime} with the specified period in nanoseconds added.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} nanos - the nanos to add, may be negative
     * @return {LocalDateTime} a {@link LocalDateTime} based on this date-time with the nanoseconds added, not null
     * @throws {DateTimeException} if the result exceeds the supported date range
     */
    plusNanos(nanos) {
        return this._plusWithOverflow(this._date, 0, 0, 0, nanos, 1);
    }

    //-----------------------------------------------------------------------

    /**
     * Returns a copy of this date-time with the specified period subtracted.
     *
     * This method returns a new date-time based on this date-time with the specified period subtracted.
     * This can be used to subtract any period that is defined by a unit, for example to subtract years, months or days.
     * The unit is responsible for the details of the calculation, including the resolution
     * of any edge cases in the calculation.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} amountToSubtract - the amount of the unit to subtract from the result, may be negative
     * @param {TemporalUnit} unit - the unit of the period to subtract, not null
     * @return {LocalDateTime} a {@link LocalDateTime} based on this date-time with the specified period subtracted, not null
     * @throws {DateTimeException} if the unit cannot be added to this type
     */
    _minusUnit(amountToSubtract, unit) {
        requireNonNull(unit, 'unit');
        return this._plusUnit(-1 * amountToSubtract, unit);
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this {@link LocalDateTime} with the specified period in years subtracted.
     *
     * This method subtracts the specified amount from the years field in three steps:
     *
     * 1. Subtract the input years from the year field
     * 2. Check if the resulting date would be invalid
     * 3. Adjust the day-of-month to the last valid day if necessary
     *
     * For example, 2008-02-29 (leap year) minus one year would result in the
     * invalid date 2009-02-29 (standard year). Instead of returning an invalid
     * result, the last valid day of the month, 2009-02-28, is selected instead.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} years - the years to subtract, may be negative
     * @return {LocalDateTime} a {@link LocalDateTime} based on this date-time with the years subtracted, not null
     * @throws {DateTimeException} if the result exceeds the supported date range
     */
    minusYears(years) {
        return this.plusYears(-1 * years);
    }

    /**
     * Returns a copy of this {@link LocalDateTime} with the specified period in months subtracted.
     *
     * This method subtracts the specified amount from the months field in three steps:
     *
     * 1. Subtract the input months from the month-of-year field
     * 2. Check if the resulting date would be invalid
     * 3. Adjust the day-of-month to the last valid day if necessary
     *
     * For example, 2007-03-31 minus one month would result in the invalid date
     * 2007-04-31. Instead of returning an invalid result, the last valid day
     * of the month, 2007-04-30, is selected instead.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} months - the months to subtract, may be negative
     * @return {LocalDateTime} a {@link LocalDateTime} based on this date-time with the months subtracted, not null
     * @throws {DateTimeException} if the result exceeds the supported date range
     */
    minusMonths(months) {
        return this.plusMonths(-1 * months);
    }

    /**
     * Returns a copy of this {@link LocalDateTime} with the specified period in weeks subtracted.
     *
     * This method subtracts the specified amount in weeks from the days field decrementing
     * the month and year fields as necessary to ensure the result remains valid.
     * The result is only invalid if the maximum/minimum year is exceeded.
     *
     * For example, 2009-01-07 minus one week would result in 2008-12-31.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} weeks - the weeks to subtract, may be negative
     * @return {LocalDateTime} a {@link LocalDateTime} based on this date-time with the weeks subtracted, not null
     * @throws {DateTimeException} if the result exceeds the supported date range
     */
    minusWeeks(weeks) {
        return this.plusWeeks(-1 * weeks);
    }

    /**
     * Returns a copy of this {@link LocalDateTime} with the specified period in days subtracted.
     *
     * This method subtracts the specified amount from the days field incrementing the
     * month and year fields as necessary to ensure the result remains valid.
     * The result is only invalid if the maximum/minimum year is exceeded.
     *
     * For example, 2009-01-01 minus one day would result in 2008-12-31.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} days - the days to subtract, may be negative
     * @return {LocalDateTime} a {@link LocalDateTime} based on this date-time with the days subtracted, not null
     * @throws {DateTimeException} if the result exceeds the supported date range
     */
    minusDays(days) {
        return this.plusDays(-1 * days);
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this {@link LocalDateTime} with the specified period in hours subtracted.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} hours - the hours to subtract, may be negative
     * @return {LocalDateTime} a {@link LocalDateTime} based on this date-time with the hours subtracted, not null
     * @throws {DateTimeException} if the result exceeds the supported date range
     */
    minusHours(hours) {
        return this._plusWithOverflow(this._date, hours, 0, 0, 0, -1);
    }

    /**
     * Returns a copy of this {@link LocalDateTime} with the specified period in minutes subtracted.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} minutes - the minutes to subtract, may be negative
     * @return {LocalDateTime} a {@link LocalDateTime} based on this date-time with the minutes subtracted, not null
     * @throws {DateTimeException} if the result exceeds the supported date range
     */
    minusMinutes(minutes) {
        return this._plusWithOverflow(this._date, 0, minutes, 0, 0, -1);
    }

    /**
     * Returns a copy of this {@link LocalDateTime} with the specified period in seconds subtracted.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} seconds - the seconds to subtract, may be negative
     * @return {LocalDateTime} a {@link LocalDateTime} based on this date-time with the seconds subtracted, not null
     * @throws {DateTimeException} if the result exceeds the supported date range
     */
    minusSeconds(seconds) {
        return this._plusWithOverflow(this._date, 0, 0, seconds, 0, -1);
    }

    /**
     * Returns a copy of this {@link LocalDateTime} with the specified period in nanoseconds subtracted.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Number} nanos - the nanos to subtract, may be negative
     * @return {LocalDateTime} based on this date-time with the nanoseconds subtracted, not null
     * @throws {DateTimeException} if the result exceeds the supported date range
     */
    minusNanos(nanos) {
        return this._plusWithOverflow(this._date, 0, 0, 0, nanos, -1);
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this {@link LocalDateTime} with the specified period added.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {LocalDate} newDate  the new date to base the calculation on, not null
     * @param {Number} hours - the hours to add, may be negative
     * @param {Number} minutes - the minutes to add, may be negative
     * @param {Number} seconds - the seconds to add, may be negative
     * @param {Number} nanos - the nanos to add, may be negative
     * @param {Number} sign - the sign to determine add or subtract
     * @return {LocalDateTime} the combined result, not null
     */
    _plusWithOverflow(newDate, hours, minutes, seconds, nanos, sign) {
        // 9223372036854775808 long, 2147483648 int
        if (hours === 0 && minutes === 0 && seconds === 0 && nanos === 0) {
            return this._withDateTime(newDate, this._time);
        }
        let totDays = MathUtil.intDiv(nanos, LocalTime.NANOS_PER_DAY) +             //   max/24*60*60*1B
                MathUtil.intDiv(seconds, LocalTime.SECONDS_PER_DAY) +                //   max/24*60*60
                MathUtil.intDiv(minutes, LocalTime.MINUTES_PER_DAY) +                //   max/24*60
                MathUtil.intDiv(hours, LocalTime.HOURS_PER_DAY);                     //   max/24
        totDays *= sign;                                   // total max*0.4237...
        let totNanos = MathUtil.intMod(nanos, LocalTime.NANOS_PER_DAY) +                    //   max  86400000000000
                (MathUtil.intMod(seconds, LocalTime.SECONDS_PER_DAY)) * LocalTime.NANOS_PER_SECOND +   //   max  86400000000000
                (MathUtil.intMod(minutes, LocalTime.MINUTES_PER_DAY)) * LocalTime.NANOS_PER_MINUTE +   //   max  86400000000000
                (MathUtil.intMod(hours, LocalTime.HOURS_PER_DAY)) * LocalTime.NANOS_PER_HOUR;          //   max  86400000000000
        const curNoD = this._time.toNanoOfDay();                       //   max  86400000000000
        totNanos = totNanos * sign + curNoD;                    // total 432000000000000
        totDays += MathUtil.floorDiv(totNanos, LocalTime.NANOS_PER_DAY);
        const newNoD = MathUtil.floorMod(totNanos, LocalTime.NANOS_PER_DAY);
        const newTime = (newNoD === curNoD ? this._time : LocalTime.ofNanoOfDay(newNoD));
        return this._withDateTime(newDate.plusDays(totDays), newTime);
    }

    //-----------------------------------------------------------------------
    /**
     * Queries this date-time using the specified query.
     *
     * This queries this date-time using the specified query strategy object.
     * The {@link TemporalQuery} object defines the logic to be used to
     * obtain the result. Read the documentation of the query to understand
     * what the result of this method will be.
     *
     * The result of this method is obtained by invoking the
     * {@link TemporalQuery#queryFrom} method on the
     * specified query passing `this` as the argument.
     *
     * @param {TemporalQuery} query  the query to invoke, not null
     * @return {*} the query result, null may be returned (defined by the query)
     * @throws {DateTimeException} if unable to query (defined by the query)
     * @throws {ArithmeticException} if numeric overflow occurs (defined by the query)
     */
    query(query) {
        requireNonNull(query, 'query');
        if (query === TemporalQueries.localDate()) {
            return this.toLocalDate();
        }
        return super.query(query);
    }

    /**
     * Adjusts the specified temporal object to have the same date and time as this object.
     *
     * This returns a temporal object of the same observable type as the input
     * with the date and time changed to be the same as this.
     *
     * The adjustment is equivalent to using {@link Temporal#with}
     * twice, passing {@link ChronoField#EPOCH_DAY} and
     * {@link ChronoField#NANO_OF_DAY} as the fields.
     *
     * In most cases, it is clearer to reverse the calling pattern by using
     * {@link Temporal#with}:
     * <pre>
     *   // these two lines are equivalent, but the second approach is recommended
     *   temporal = thisLocalDateTime.adjustInto(temporal);
     *   temporal = temporal.with(thisLocalDateTime);
     * </pre>
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {TemporalAdjuster} temporal - the target object to be adjusted, not null
     * @return {LocalDateTime} the adjusted object, not null
     * @throws {DateTimeException} if unable to make the adjustment
     * @throws {ArithmeticException} if numeric overflow occurs
     */
    adjustInto(temporal) {
        return super.adjustInto(temporal);
    }

    /**
     * Calculates the period between this date-time and another date-time in
     * terms of the specified unit.
     *
     * This calculates the period between two date-times in terms of a single unit.
     * The start and end points are `this` and the specified date-time.
     * The result will be negative if the end is before the start.
     * The {@link Temporal} passed to this method must be a {@link LocalDateTime}.
     * For example, the period in days between two date-times can be calculated
     * using `startDateTime.until(endDateTime, DAYS)`.
     *
     * The calculation returns a whole number, representing the number of
     * complete units between the two date-times.
     * For example, the period in months between 2012-06-15T00:00 and 2012-08-14T23:59
     * will only be one month as it is one minute short of two months.
     *
     * This method operates in association with {@link TemporalUnit#between}.
     * The result of this method is a `long` representing the amount of
     * the specified unit. By contrast, the result of {@link between} is an
     * object that can be used directly in addition/subtraction:
     * <pre>
     *   long period = start.until(end, MONTHS);   // this method
     *   dateTime.plus(MONTHS.between(start, end));      // use in plus/minus
     * </pre>
     *
     * The calculation is implemented in this method for {@link ChronoUnit}.
     * The units {@link NANOS}, {@link MICROS}, {@link MILLIS}, {@link SECONDS},
     * {@link MINUTES}, {@link HOURS} and {@link HALF_DAYS}, {@link DAYS},
     * {@link WEEKS}, {@link MONTHS}, {@link YEARS}, {@link DECADES},
     * {@link CENTURIES}, {@link MILLENNIA} and {@link ERAS} are supported.
     * Other {@link ChronoUnit} values will throw an exception.
     *
     * If the unit is not a {@link ChronoUnit}, then the result of this method
     * is obtained by invoking {@link TemporalUnit.between}
     * passing `this` as the first argument and the input temporal as
     * the second argument.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Temporal} endExclusive - the end date-time, which is converted to a {@link LocalDateTime}, not null
     * @param {TemporalUnit} unit - the unit to measure the period in, not null
     * @return {number} the amount of the period between this date-time and the end date-time
     * @throws {DateTimeException} if the period cannot be calculated
     * @throws {ArithmeticException} if numeric overflow occurs
     */
    until(endExclusive, unit) {
        requireNonNull(endExclusive, 'endExclusive');
        requireNonNull(unit, 'unit');
        const end = LocalDateTime.from(endExclusive);
        if (unit instanceof ChronoUnit) {
            if (unit.isTimeBased()) {
                let daysUntil = this._date.daysUntil(end._date);
                let timeUntil = end._time.toNanoOfDay() - this._time.toNanoOfDay();
                if (daysUntil > 0 && timeUntil < 0) {
                    daysUntil--;
                    timeUntil += LocalTime.NANOS_PER_DAY;
                } else if (daysUntil < 0 && timeUntil > 0) {
                    daysUntil++;
                    timeUntil -= LocalTime.NANOS_PER_DAY;
                }
                let amount = daysUntil;
                switch (unit) {
                    case ChronoUnit.NANOS:
                        amount = MathUtil.safeMultiply(amount, LocalTime.NANOS_PER_DAY);
                        return MathUtil.safeAdd(amount, timeUntil);
                    case ChronoUnit.MICROS:
                        amount = MathUtil.safeMultiply(amount, LocalTime.MICROS_PER_DAY);
                        return MathUtil.safeAdd(amount, MathUtil.intDiv(timeUntil, 1000));
                    case ChronoUnit.MILLIS:
                        amount = MathUtil.safeMultiply(amount, LocalTime.MILLIS_PER_DAY);
                        return MathUtil.safeAdd(amount, MathUtil.intDiv(timeUntil, 1000000));
                    case ChronoUnit.SECONDS:
                        amount = MathUtil.safeMultiply(amount, LocalTime.SECONDS_PER_DAY);
                        return MathUtil.safeAdd(amount, MathUtil.intDiv(timeUntil, LocalTime.NANOS_PER_SECOND));
                    case ChronoUnit.MINUTES:
                        amount = MathUtil.safeMultiply(amount, LocalTime.MINUTES_PER_DAY);
                        return MathUtil.safeAdd(amount, MathUtil.intDiv(timeUntil, LocalTime.NANOS_PER_MINUTE));
                    case ChronoUnit.HOURS:
                        amount = MathUtil.safeMultiply(amount, LocalTime.HOURS_PER_DAY);
                        return MathUtil.safeAdd(amount, MathUtil.intDiv(timeUntil, LocalTime.NANOS_PER_HOUR));
                    case ChronoUnit.HALF_DAYS:
                        amount = MathUtil.safeMultiply(amount, 2);
                        return MathUtil.safeAdd(amount, MathUtil.intDiv(timeUntil, (LocalTime.NANOS_PER_HOUR * 12)));
                }
                throw new UnsupportedTemporalTypeException(`Unsupported unit: ${unit}`);
            }
            let endDate = end._date;
            const endTime = end._time;
            if (endDate.isAfter(this._date) && endTime.isBefore(this._time)) {
                endDate = endDate.minusDays(1);
            } else if (endDate.isBefore(this._date) && endTime.isAfter(this._time)) {
                endDate = endDate.plusDays(1);
            }
            return this._date.until(endDate, unit);
        }
        return unit.between(this, end);
    }

    //-----------------------------------------------------------------------
    /**
     * Combines this date-time with an offset to create an {@link OffsetDateTime}.
     *
     * This returns an {@link OffsetDateTime} formed from this date-time at the specified offset.
     * All possible combinations of date-time and offset are valid.
     *
     * @param {ZoneOffset} offset  the offset to combine with, not null
     * @return {OffsetDateTime} the offset date-time formed from this date-time and the specified offset, not null
     */
    atOffset(offset) {
        return OffsetDateTime.of(this, offset);
    }

    /**
     * Combines this date-time with a time-zone to create a {@link ZonedDateTime}.
     *
     * This returns a {@link ZonedDateTime} formed from this date-time at the
     * specified time-zone. The result will match this date-time as closely as possible.
     * Time-zone rules, such as daylight savings, mean that not every local date-time
     * is valid for the specified zone, thus the local date-time may be adjusted.
     *
     * The local date-time is resolved to a single instant on the time-line.
     * This is achieved by finding a valid offset from UTC/Greenwich for the local
     * date-time as defined by the {@link ZoneRules} of the zone ID.
     *
     * In most cases, there is only one valid offset for a local date-time.
     * In the case of an overlap, where clocks are set back, there are two valid offsets.
     * This method uses the earlier offset typically corresponding to 'summer'.
     *
     * In the case of a gap, where clocks jump forward, there is no valid offset.
     * Instead, the local date-time is adjusted to be later by the length of the gap.
     * For a typical one hour daylight savings change, the local date-time will be
     * moved one hour later into the offset typically corresponding to 'summer'.
     *
     * To obtain the later offset during an overlap, call
     * {@link ZonedDateTime#withLaterOffsetAtOverlap} on the result of this method.
     * To throw an exception when there is a gap or overlap, use
     * {@link ZonedDateTime#ofStrict}.
     *
     * @param {ZoneId} zone  the time-zone to use, not null
     * @return {ZonedDateTime} the zoned date-time formed from this date-time, not null
     */
    atZone(zone) {
        return ZonedDateTime.of(this, zone);
    }

    //-----------------------------------------------------------------------
    /**
     * Gets the {@link LocalDate} part of this date-time.
     *
     * This returns a {@link LocalDate} with the same year, month and day
     * as this date-time.
     *
     * @return {LocalDate} the date part of this date-time, not null
     */
    toLocalDate() {
        return this._date;
    }

    /**
     * Gets the {@link LocalTime} part of this date-time.
     *
     * This returns a {@link LocalTime} with the same hour, minute, second and
     * nanosecond as this date-time.
     *
     * @return {LocalTime} the time part of this date-time, not null
     */
    toLocalTime() {
        return this._time;
    }

    //-----------------------------------------------------------------------
    /**
     * Compares this date-time to another date-time.
     *
     * The comparison is primarily based on the date-time, from earliest to latest.
     * It is 'consistent with equals', as defined by {@link Comparable}.
     *
     * If all the date-times being compared are instances of {@link LocalDateTime},
     * then the comparison will be entirely based on the date-time.
     * If some dates being compared are in different chronologies, then the
     * chronology is also considered, see {@link ChronoLocalDateTime#compareTo}.
     *
     * @param {!LocalDateTime} other - the other date-time to compare to, not null
     * @return {number} the comparator value, negative if less, positive if greater
     */
    compareTo(other) {
        requireNonNull(other, 'other');
        requireInstance(other, LocalDateTime, 'other');
        return this._compareTo0(other);
        // return super.compareTo(other); if not instance of  LocalDateTime
    }

    /**
     *
     * @param {!LocalDateTime} other
     * @returns {number}
     * @private
     */
    _compareTo0(other) {
        let cmp = this._date.compareTo(other.toLocalDate());
        if (cmp === 0) {
            cmp = this._time.compareTo(other.toLocalTime());
        }
        return cmp;
    }

    /**
     * Checks if this date-time is after the specified date-time.
     *
     * This checks to see if this date-time represents a point on the
     * local time-line after the other date-time.
     * <pre>
     *   LocalDate a = LocalDateTime.of(2012, 6, 30, 12, 00);
     *   LocalDate b = LocalDateTime.of(2012, 7, 1, 12, 00);
     *   a.isAfter(b) == false
     *   a.isAfter(a) == false
     *   b.isAfter(a) == true
     * </pre>
     *
     * This method only considers the position of the two date-times on the local time-line.
     * It does not take into account the chronology, or calendar system.
     * This is different from the comparison in {@link compareTo},
     * but is the same approach as {@link DATE_TIME_COMPARATOR}.
     *
     * @param {LocalDateTime} other - the other date-time to compare to, not null
     * @return {boolean} true if this date-time is after the specified date-time
     */
    isAfter(other) {
        return this.compareTo(other) > 0;
        // return super.isAfter(other);  if not instance of LocalDateTime
    }

    /**
     * Checks if this date-time is before the specified date-time.
     *
     * This checks to see if this date-time represents a point on the
     * local time-line before the other date-time.
     * <pre>
     *   LocalDate a = LocalDateTime.of(2012, 6, 30, 12, 00);
     *   LocalDate b = LocalDateTime.of(2012, 7, 1, 12, 00);
     *   a.isBefore(b) == true
     *   a.isBefore(a) == false
     *   b.isBefore(a) == false
     * </pre>
     *
     * This method only considers the position of the two date-times on the local time-line.
     * It does not take into account the chronology, or calendar system.
     * This is different from the comparison in {@link compareTo},
     * but is the same approach as {@link DATE_TIME_COMPARATOR}.
     *
     * @param {LocalDateTime} other - the other date-time to compare to, not null
     * @return {boolean} true if this date-time is before the specified date-time
     */
    isBefore(other) {
        return this.compareTo(other) < 0;
        // return super.isBefore(other);  if not instance of LocalDateTime
    }

    /**
     * Checks if this date-time is equal to the specified date-time.
     *
     * This checks to see if this date-time represents the same point on the
     * local time-line as the other date-time.
     * <pre>
     *   LocalDate a = LocalDateTime.of(2012, 6, 30, 12, 00);
     *   LocalDate b = LocalDateTime.of(2012, 7, 1, 12, 00);
     *   a.isEqual(b) == false
     *   a.isEqual(a) == true
     *   b.isEqual(a) == false
     * </pre>
     *
     * This method only considers the position of the two date-times on the local time-line.
     * It does not take into account the chronology, or calendar system.
     * This is different from the comparison in {@link compareTo},
     * but is the same approach as {@link DATE_TIME_COMPARATOR}.
     *
     * @param {LocalDateTime} other - the other date-time to compare to, not null
     * @return {boolean} true if this date-time is equal to the specified date-time
     */
    isEqual(other) {
        return this.compareTo(other) === 0;
        // return super.isEqual(other); if not instance of LocalDateTime
    }

    //-----------------------------------------------------------------------
    /**
     * Checks if this date-time is equal to another date-time.
     *
     * Compares this {@link LocalDateTime} with another ensuring that the date-time is the same.
     * Only objects of type {@link LocalDateTime} are compared, other types return false.
     *
     * @param {*} other - the object to check, null returns false
     * @return {boolean} true if this is equal to the other date-time
     */
    equals(other) {
        if (this === other) {
            return true;
        }
        if (other instanceof LocalDateTime) {
            return this._date.equals(other._date) && this._time.equals(other._time);
        }
        return false;
    }

    /**
     * A hash code for this date-time.
     *
     * @return {number} a suitable hash code
     */
    hashCode() {
        return this._date.hashCode() ^ this._time.hashCode();
    }

    //-----------------------------------------------------------------------
    /**
     * Outputs this date-time as a string, such as `2007-12-03T10:15:30`.
     *
     * The output will be one of the following ISO-8601 formats:
     *
     * * `yyyy-MM-dd'T'HH:mm`
     * * `yyyy-MM-dd'T'HH:mm:ss`
     * * `yyyy-MM-dd'T'HH:mm:ss.SSS`
     * * `yyyy-MM-dd'T'HH:mm:ss.SSSSSS`
     * * `yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS`
     *
     * The format used will be the shortest that outputs the full value of
     * the time where the omitted parts are implied to be zero.
     *
     * @return {string} a string representation of this date-time, not null
     */
    toString() {
        return `${this._date.toString()}T${this._time.toString()}`;
    }

    /**
     *
     * @return {string} same as {@link LocalDateTime.toString}
     */
    toJSON() {
        return this.toString();
    }

    /**
     * Outputs this date-time as a string using the formatter.
     *
     * @param {!DateTimeFormatter} formatter  the formatter to use, not null
     * @return {String} the formatted date-time string, not null
     * @throws {DateTimeException} if an error occurs during printing
     */
    format(formatter) {
        requireNonNull(formatter, 'formatter');
        return formatter.format(this);
    }

}

export function _init(){
    /**
     * The minimum supported {@link LocalDateTime}, '-999999999-01-01T00:00:00'.
     * This is the local date-time of midnight at the start of the minimum date.
     * This combines {@link LocalDate#MIN} and {@link LocalTime#MIN}.
     * This could be used by an application as a 'far past' date-time.
     */
    LocalDateTime.MIN = LocalDateTime.of(LocalDate.MIN, LocalTime.MIN);

    /**
     * The maximum supported {@link LocalDateTime}, '+999999999-12-31T23:59:59.999999999'.
     * This is the local date-time just before midnight at the end of the maximum date.
     * This combines {@link LocalDate#MAX} and {@link LocalTime#MAX}.
     * This could be used by an application as a 'far future' date-time.
     */
    LocalDateTime.MAX = LocalDateTime.of(LocalDate.MAX, LocalTime.MAX);

    LocalDateTime.FROM = createTemporalQuery('LocalDateTime.FROM', (temporal) => {
        return LocalDateTime.from(temporal);
    });
}
/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */


import { MathUtil } from './MathUtil';
import { requireNonNull, requireInstance } from './assert';
import { DateTimeException, UnsupportedTemporalTypeException } from './errors';

import { Clock } from './Clock';
import { LocalDateTime } from './LocalDateTime';
import { ZoneId } from './ZoneId';
import { OffsetTime } from './OffsetTime';

import { DateTimeFormatter } from './format/DateTimeFormatter';

import { ChronoField } from './temporal/ChronoField';
import { ChronoUnit } from './temporal/ChronoUnit';
import { Temporal } from './temporal/Temporal';
import { TemporalField } from './temporal/TemporalField';
import { TemporalQueries } from './temporal/TemporalQueries';
import { createTemporalQuery } from './temporal/TemporalQuery';

/**
 * A time without time-zone in the ISO-8601 calendar system,
 * such as `10:15:30`.
 *
 * {@link LocalTime} is an immutable date-time object that represents a time,
 * often viewed as hour-minute-second.
 * Time is represented to nanosecond precision.
 * For example, the value '13:45.30.123456789' can be stored in a {@link LocalTime}.
 *
 * It does not store or represent a date or time-zone.
 * Instead, it is a description of the local time as seen on a wall clock.
 * It cannot represent an instant on the time-line without additional information
 * such as an offset or time-zone.
 *
 * The ISO-8601 calendar system is the modern civil calendar system used today
 * in most of the world. This API assumes that all calendar systems use the same
 * representation, this class, for time-of-day.
 *
 * ### Static properties of Class {@link LocalTime}
 *
 * LocalTime.MIN
 *
 * The minimum supported {@link LocalTime}, '00:00'.
 * This is the time of midnight at the start of the day.
 *
 * LocalTime.MAX
 *
 * The maximum supported {@link LocalTime}, '23:59:59.999999999'.
 * This is the time just before midnight at the end of the day.
 *
 * LocalTime.MIDNIGHT
 *
 * The time of midnight at the start of the day, '00:00'.
 *
 * LocalTime.NOON
 *
 * The time of noon in the middle of the day, '12:00'.
 *
 * LocalTime.HOURS_PER_DAY
 *
 * Hours per day.
 *
 * LocalTime.MINUTES_PER_HOUR
 *
 * Minutes per hour.
 *
 * LocalTime.MINUTES_PER_DAY
 *
 * Minutes per day.
 *
 * LocalTime.SECONDS_PER_MINUTE
 *
 * Seconds per minute.
 *
 * LocalTime.SECONDS_PER_HOUR
 *
 * Seconds per hour.
 *
 * LocalTime.SECONDS_PER_DAY
 *
 * Seconds per day.
 *
 * LocalTime.MILLIS_PER_DAY
 *
 * Milliseconds per day.
 *
 * LocalTime.MICROS_PER_DAY
 *
 * Microseconds per day.
 *
 * LocalTime.NANOS_PER_SECOND
 *
 * Nanos per second.
 *
 * LocalTime.NANOS_PER_MINUTE
 *
 * Nanos per minute.
 *
 * LocalTime.NANOS_PER_HOUR
 *
 * Nanos per hour.
 *
 * LocalTime.NANOS_PER_DAY
 *
 * Nanos per day.
 *
 */
export class LocalTime extends Temporal /** implements Temporal, TemporalAdjuster */ {
    /**
     * Obtains the current time from the specified clock.
     * If no argument is specified the system default clock is queried,
     * if a zone-id is passed a system clock with the specified zone is queried.
     *
     * This will query the specified clock to obtain the current time.
     * Using this method allows the use of an alternate clock for testing.
     * The alternate clock may be introduced using dependency injection.
     *
     * @param {Clock|ZoneId} clockOrZone - the zone ID or clock to use, if null Clock.systemDefaultZone() is used.
     * @return {LocalTime} the current time using the system clock, not null
     */
    static now(clockOrZone) {
        if (clockOrZone == null){
            return LocalTime._now(Clock.systemDefaultZone());
        } else if (clockOrZone instanceof Clock){
            return LocalTime._now(clockOrZone);
        } else {
            return LocalTime._now(Clock.system(clockOrZone));
        }
    }

    /**
     * Obtains the current time from the specified clock.
     *
     * This will query the specified clock to obtain the current time.
     * Using this method allows the use of an alternate clock for testing.
     * The alternate clock may be introduced using dependency injection (see {@link Clock}).
     *
     * @param {Clock} [clock=Clock.systemDefaultZone()] - the clock to use, not null
     * @return {LocalTime} the current time, not null
     */
    static _now(clock = Clock.systemDefaultZone()) {
        requireNonNull(clock, 'clock');// inline OffsetTime factory to avoid creating object and InstantProvider checks
        return LocalTime.ofInstant(clock.instant(), clock.zone());
    }

    /**
     * obtain a LocalTime from an Instant in the specified time-zone or, if null
     * in the system default time-zone
     *
     * @param {!Instant} instant
     * @param {ZoneId} [zone=ZoneId.systemDefault()], defaults to ZoneId.systemDefault()
     * @returns {LocalTime} the current date, not null
     */
    static ofInstant(instant, zone=ZoneId.systemDefault()){
        const offset = zone.rules().offset(instant);
        let secsOfDay = MathUtil.intMod(instant.epochSecond(), LocalTime.SECONDS_PER_DAY);
        secsOfDay = MathUtil.intMod((secsOfDay + offset.totalSeconds()), LocalTime.SECONDS_PER_DAY);
        if (secsOfDay < 0) {
            secsOfDay += LocalTime.SECONDS_PER_DAY;
        }
        return LocalTime.ofSecondOfDay(secsOfDay, instant.nano());
    }

    /**
     * Obtains an instance of {@link LocalTime} from an hour, minute, second and nanosecond.
     *
     * This factory may return a cached value, but applications must not rely on this.
     *
     * @param {number} [hour=0] - the hour-of-day to represent, from 0 to 23
     * @param {number} [minute=0] - the minute-of-hour to represent, from 0 to 59
     * @param {number} [second=0] - the second-of-minute to represent, from 0 to 59
     * @param {number} [nanoOfSecond=0] - the nano-of-second to represent, from 0 to 999,999,999
     * @return {LocalTime} the local time, not null
     * @throws {DateTimeException} if the value of any field is out of range
     */
    static of(hour, minute, second, nanoOfSecond) {
        return new LocalTime(hour, minute, second, nanoOfSecond);
    }

    /**
     * Obtains an instance of {@link LocalTime} from a second-of-day value, with
     * associated nanos of second.
     *
     * This factory may return a cached value, but applications must not rely on this.
     *
     * @param {number} [secondOfDay=0] - the second-of-day, from `0` to `24 * 60 * 60 - 1`
     * @param {number} [nanoOfSecond=0] - the nano-of-second, from `0` to `999,999,999`
     * @return {LocalTime} the local time, not null
     * @throws {DateTimeException} if the either input value is invalid
     */
    static ofSecondOfDay(secondOfDay=0, nanoOfSecond=0) {
        ChronoField.SECOND_OF_DAY.checkValidValue(secondOfDay);
        ChronoField.NANO_OF_SECOND.checkValidValue(nanoOfSecond);
        const hours = MathUtil.intDiv(secondOfDay, LocalTime.SECONDS_PER_HOUR);
        secondOfDay -= hours * LocalTime.SECONDS_PER_HOUR;
        const minutes = MathUtil.intDiv(secondOfDay, LocalTime.SECONDS_PER_MINUTE);
        secondOfDay -= minutes * LocalTime.SECONDS_PER_MINUTE;
        return new LocalTime(hours, minutes, secondOfDay, nanoOfSecond);
    }

    /**
     * Obtains an instance of {@link LocalTime} from a nanos-of-day value.
     *
     * This factory may return a cached value, but applications must not rely on this.
     *
     * @param {number} [nanoOfDay=0] - the nano of day, from `0` to `24 * 60 * 60 * 1,000,000,000 - 1`
     * @return {LocalTime} the local time, not null
     * @throws {DateTimeException} if the nanos of day value is invalid
     */
    static ofNanoOfDay(nanoOfDay=0) {
        ChronoField.NANO_OF_DAY.checkValidValue(nanoOfDay);
        const hours = MathUtil.intDiv(nanoOfDay, LocalTime.NANOS_PER_HOUR);
        nanoOfDay -= hours * LocalTime.NANOS_PER_HOUR;
        const minutes = MathUtil.intDiv(nanoOfDay, LocalTime.NANOS_PER_MINUTE);
        nanoOfDay -= minutes * LocalTime.NANOS_PER_MINUTE;
        const seconds = MathUtil.intDiv(nanoOfDay, LocalTime.NANOS_PER_SECOND);
        nanoOfDay -= seconds * LocalTime.NANOS_PER_SECOND;
        return new LocalTime(hours, minutes, seconds, nanoOfDay);
    }

    //-----------------------------------------------------------------------
    /**
     * Obtains an instance of {@link LocalTime} from a temporal object.
     *
     * A {@link TemporalAccessor} represents some form of date and time information.
     * This factory converts the arbitrary temporal object to an instance of {@link LocalTime}.
     *
     * The conversion uses the {@link TemporalQueries#localTime} query, which relies
     * on extracting {@link ChronoField#NANO_OF_DAY}.
     *
     * This method matches the signature of the functional interface {@link TemporalQuery}
     * allowing it to be used in queries via method reference, {@link LocalTime::from}.
     *
     * @param {!TemporalAccessor} temporal - the temporal object to convert, not null
     * @return {LocalTime} the local time, not null
     * @throws {DateTimeException} if unable to convert to a {@link LocalTime}
     */
    static from(temporal) {
        requireNonNull(temporal, 'temporal');
        const time = temporal.query(TemporalQueries.localTime());
        if (time == null) {
            throw new DateTimeException(`Unable to obtain LocalTime TemporalAccessor: ${temporal}, type ${temporal.constructor != null ? temporal.constructor.name : ''}`);
        }
        return time;
    }

    /**
     * Obtains an instance of {@link LocalTime} from a text string using a specific formatter.
     *
     * The text is parsed using the formatter, returning a time.
     *
     * @param {!String} text - the text to parse, not null
     * @param {DateTimeFormatter} [formatter=DateTimeFormatter.ISO_LOCAL_TIME] - the formatter to use, default is
     * {@link DateTimeFormatter.ISO_LOCAL_TIME}
     * @return {LocalTime} the parsed local time, not null
     * @throws {DateTimeParseException} if the text cannot be parsed
     */
    static parse(text, formatter=DateTimeFormatter.ISO_LOCAL_TIME) {
        requireNonNull(formatter, 'formatter');
        return formatter.parse(text, LocalTime.FROM);
    }

    /**
     * Constructor, previously validated.
     *
     * @param {number} [hour=0] - the hour-of-day to represent, validated from 0 to 23
     * @param {number} [minute=0] - the minute-of-hour to represent, validated from 0 to 59
     * @param {number} [second=0] - the second-of-minute to represent, validated from 0 to 59
     * @param {number} [nanoOfSecond=0] - the nano-of-second to represent, validated from 0 to 999,999,999
     * @private
     */
    constructor(hour=0, minute=0, second=0, nanoOfSecond=0) {
        super();
        const _hour = MathUtil.safeToInt(hour);
        const _minute = MathUtil.safeToInt(minute);
        const _second = MathUtil.safeToInt(second);
        const _nanoOfSecond = MathUtil.safeToInt(nanoOfSecond);
        LocalTime._validate(_hour, _minute, _second, _nanoOfSecond);
        if (_minute === 0 && _second === 0 && _nanoOfSecond === 0) {
            if (!LocalTime.HOURS[_hour]) {
                this._hour = _hour;
                this._minute = _minute;
                this._second = _second;
                this._nano = _nanoOfSecond;
                LocalTime.HOURS[_hour] = this;
            }
            return LocalTime.HOURS[_hour];
        }
        this._hour = _hour;
        this._minute = _minute;
        this._second = _second;
        this._nano = _nanoOfSecond;
    }

    static _validate(hour, minute, second, nanoOfSecond){
        ChronoField.HOUR_OF_DAY.checkValidValue(hour);
        ChronoField.MINUTE_OF_HOUR.checkValidValue(minute);
        ChronoField.SECOND_OF_MINUTE.checkValidValue(second);
        ChronoField.NANO_OF_SECOND.checkValidValue(nanoOfSecond);

    }
    //-----------------------------------------------------------------------
    /**
     * Checks if the specified field is supported.
     *
     * This checks if this time can be queried for the specified field.
     * If false, then calling {@link range} and {@link get} will throw an exception.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields are:
     *
     * * {@link ChronoField.NANO_OF_SECOND}
     * * {@link ChronoField.NANO_OF_DAY}
     * * {@link ChronoField.MICRO_OF_SECOND}
     * * {@link ChronoField.MICRO_OF_DAY}
     * * {@link ChronoField.MILLI_OF_SECOND}
     * * {@link ChronoField.MILLI_OF_DAY}
     * * {@link ChronoField.SECOND_OF_MINUTE}
     * * {@link ChronoField.SECOND_OF_DAY}
     * * {@link ChronoField.MINUTE_OF_HOUR}
     * * {@link ChronoField.MINUTE_OF_DAY}
     * * {@link ChronoField.HOUR_OF_AMPM}
     * * {@link ChronoField.CLOCK_HOUR_OF_AMPM}
     * * {@link ChronoField.HOUR_OF_DAY}
     * * {@link ChronoField.CLOCK_HOUR_OF_DAY}
     * * {@link ChronoField.AMPM_OF_DAY}
     *
     * All other {@link ChronoField} instances will return false.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.isSupportedBy}
     * passing this as the argument.
     * Whether the field is supported is determined by the field.
     *
     * @param {ChronoField|ChronoUnit} fieldOrUnit - the field to check, null returns false
     * @return {boolean} true if the field is supported on this time, false if not
     */
    isSupported(fieldOrUnit) {
        if (fieldOrUnit instanceof ChronoField) {
            return fieldOrUnit.isTimeBased();
        } else if (fieldOrUnit instanceof ChronoUnit) {
            return fieldOrUnit.isTimeBased();
        }
        return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
    }

    /**
     * Gets the range of valid values for the specified field.
     *
     * The range object expresses the minimum and maximum valid values for a field.
     * This time is used to enhance the accuracy of the returned range.
     * If it is not possible to return the range, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields (see {@link isSupported}) will return
     * appropriate range instances.
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.rangeRefinedBy}
     * passing this as the argument.
     * Whether the range can be obtained is determined by the field.
     *
     * @param {ChronoField} field - the field to query the range for, not null
     * @return {ValueRange} the range of valid values for the field, not null
     * @throws {DateTimeException} if the range for the field cannot be obtained
     */
    range(field) {
        requireNonNull(field);
        return super.range(field);
    }

    /**
     * Gets the value of the specified field from this time as an `int`.
     *
     * This queries this time for the value for the specified field.
     * The returned value will always be within the valid range of values for the field.
     * If it is not possible to return the value, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields (see {@link isSupported}) will return valid
     * values based on this time, except {@link ChronoField.NANO_OF_DAY} and {@link ChronoField.MICRO_OF_DAY}
     * which are too large to fit in an `int` and throw a {@link DateTimeException}.
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.getFrom}
     * passing this as the argument. Whether the value can be obtained,
     * and what the value represents, is determined by the field.
     *
     * @param {ChronoField} field - the field to get, not null
     * @return {number} the value for the field
     * @throws {DateTimeException} if a value for the field cannot be obtained
     * @throws {ArithmeticException} if numeric overflow occurs
     */
    get(field) {
        return this.getLong(field);
    }

    /**
     * Gets the value of the specified field from this time as a `long`.
     *
     * This queries this time for the value for the specified field.
     * If it is not possible to return the value, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields (see {@link isSupported}) will return valid
     * values based on this time.
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.from}
     * passing this as the argument. Whether the value can be obtained,
     * and what the value represents, is determined by the field.
     *
     * @param {ChronoField} field - the field to get, not null
     * @return {number} the value for the field
     * @throws {DateTimeException} if a value for the field cannot be obtained
     * @throws {ArithmeticException} if numeric overflow occurs
     */
    getLong(field) {
        requireNonNull(field, 'field');
        if (field instanceof ChronoField) {
            return this._get0(field);
        }
        return field.getFrom(this);
    }

    /**
     *
     * @param {ChronoField} field
     * @returns {number}
     * @private
     */
    _get0(field) {
        switch (field) {
            case ChronoField.NANO_OF_SECOND: return this._nano;
            case ChronoField.NANO_OF_DAY: return this.toNanoOfDay();
            case ChronoField.MICRO_OF_SECOND: return MathUtil.intDiv(this._nano, 1000);
            case ChronoField.MICRO_OF_DAY: return MathUtil.intDiv(this.toNanoOfDay(), 1000);
            case ChronoField.MILLI_OF_SECOND: return MathUtil.intDiv(this._nano, 1000000);
            case ChronoField.MILLI_OF_DAY: return MathUtil.intDiv(this.toNanoOfDay(), 1000000);
            case ChronoField.SECOND_OF_MINUTE: return this._second;
            case ChronoField.SECOND_OF_DAY: return this.toSecondOfDay();
            case ChronoField.MINUTE_OF_HOUR: return this._minute;
            case ChronoField.MINUTE_OF_DAY: return this._hour * 60 + this._minute;
            case ChronoField.HOUR_OF_AMPM: return MathUtil.intMod(this._hour, 12);
            case ChronoField.CLOCK_HOUR_OF_AMPM: {
                const ham = MathUtil.intMod(this._hour, 12);
                return (ham % 12 === 0 ? 12 : ham);
            }
            case ChronoField.HOUR_OF_DAY: return this._hour;
            case ChronoField.CLOCK_HOUR_OF_DAY: return (this._hour === 0 ? 24 : this._hour);
            case ChronoField.AMPM_OF_DAY: return MathUtil.intDiv(this._hour, 12);
        }
        throw new UnsupportedTemporalTypeException(`Unsupported field: ${field}`);
    }

    //-----------------------------------------------------------------------
    /**
     * Gets the hour-of-day field.
     *
     * @return {number} the hour-of-day, from 0 to 23
     */
    hour() {
        return this._hour;
    }

    /**
     * Gets the minute-of-hour field.
     *
     * @return {number} the minute-of-hour, from 0 to 59
     */
    minute() {
        return this._minute;
    }

    /**
     * Gets the second-of-minute field.
     *
     * @return {number} the second-of-minute, from 0 to 59
     */
    second() {
        return this._second;
    }

    /**
     * Gets the nano-of-second field.
     *
     * @return {number} the nano-of-second, from 0 to 999,999,999
     */
    nano() {
        return this._nano;
    }

    /**
     * Returns an adjusted copy of this time.
     *
     * This returns a new {@link LocalTime}, based on this one, with the time adjusted.
     * The adjustment takes place using the specified adjuster strategy object.
     * Read the documentation of the adjuster to understand what adjustment will be made.
     *
     * A simple adjuster might simply set the one of the fields, such as the hour field.
     * A more complex adjuster might set the time to the last hour of the day.
     *
     * The result of this method is obtained by invoking the
     * {@link TemporalAdjuster.adjustInto} method on the
     * specified adjuster passing this as the argument.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {TemporalAdjuster} adjuster - the adjuster to use, not null
     * @return {LocalTime} a {@link LocalTime} based on this with the adjustment made, not null
     * @throws {DateTimeException} if the adjustment cannot be made
     * @throws {ArithmeticException} if numeric overflow occurs
     */
    _withAdjuster(adjuster) {
        requireNonNull(adjuster, 'adjuster');
        // optimizations
        if (adjuster instanceof LocalTime) {
            return adjuster;
        }
        return super._withAdjuster(adjuster);
    }

    /**
     * Returns a copy of this time with the specified field set to a new value.
     *
     * This returns a new {@link LocalTime}, based on this one, with the value
     * for the specified field changed.
     * This can be used to change any supported field, such as the hour, minute or second.
     * If it is not possible to set the value, because the field is not supported or for
     * some other reason, an exception is thrown.
     *
     * If the field is a {@link ChronoField} then the adjustment is implemented here.
     * The supported fields behave as follows:
     *
     * * {@link ChronoField.NANO_OF_SECOND} -
     *   Returns a {@link LocalTime} with the specified nano-of-second.
     *  The hour, minute and second will be unchanged.
     * * {@link ChronoField.NANO_OF_DAY} -
     *   Returns a {@link LocalTime} with the specified nano-of-day.
     *   This completely replaces the time and is equivalent to {@link ofNanoOfDay}.
     * * {@link ChronoField.MICRO_OF_SECOND} -
     *   Returns a {@link LocalTime} with the nano-of-second replaced by the specified
     *   micro-of-second multiplied by 1,000.
     *   The hour, minute and second will be unchanged.
     * * {@link ChronoField.MICRO_OF_DAY} -
     *   Returns a {@link LocalTime} with the specified micro-of-day.
     *   This completely replaces the time and is equivalent to using {@link ofNanoOfDay}
     *   with the micro-of-day multiplied by 1,000.
     * * {@link ChronoField.MILLI_OF_SECOND} -
     *   Returns a {@link LocalTime} with the nano-of-second replaced by the specified
     *   milli-of-second multiplied by 1,000,000.
     *   The hour, minute and second will be unchanged.
     * * {@link ChronoField.MILLI_OF_DAY} -
     *   Returns a {@link LocalTime} with the specified milli-of-day.
     *   This completely replaces the time and is equivalent to using {@link ofNanoOfDay}
     *   with the milli-of-day multiplied by 1,000,000.
     * * {@link ChronoField.SECOND_OF_MINUTE} -
     *   Returns a {@link LocalTime} with the specified second-of-minute.
     *   The hour, minute and nano-of-second will be unchanged.
     * * {@link ChronoField.SECOND_OF_DAY} -
     *   Returns a {@link LocalTime} with the specified second-of-day.
     *   The nano-of-second will be unchanged.
     * * {@link ChronoField.MINUTE_OF_HOUR} -
     *   Returns a {@link LocalTime} with the specified minute-of-hour.
     *   The hour, second-of-minute and nano-of-second will be unchanged.
     * * {@link ChronoField.MINUTE_OF_DAY} -
     *   Returns a {@link LocalTime} with the specified minute-of-day.
     *   The second-of-minute and nano-of-second will be unchanged.
     * * {@link ChronoField.HOUR_OF_AMPM} -
     *   Returns a {@link LocalTime} with the specified hour-of-am-pm.
     *   The AM/PM, minute-of-hour, second-of-minute and nano-of-second will be unchanged.
     * * {@link ChronoField.CLOCK_HOUR_OF_AMPM} -
     *   Returns a {@link LocalTime} with the specified clock-hour-of-am-pm.
     *   The AM/PM, minute-of-hour, second-of-minute and nano-of-second will be unchanged.
     * * {@link ChronoField.HOUR_OF_DAY} -
     *   Returns a {@link LocalTime} with the specified hour-of-day.
     *   The minute-of-hour, second-of-minute and nano-of-second will be unchanged.
     * * {@link ChronoField.CLOCK_HOUR_OF_DAY} -
     *   Returns a {@link LocalTime} with the specified clock-hour-of-day.
     *   The minute-of-hour, second-of-minute and nano-of-second will be unchanged.
     * * {@link ChronoField.AMPM_OF_DAY} -
     *   Returns a {@link LocalTime} with the specified AM/PM.
     *   The hour-of-am-pm, minute-of-hour, second-of-minute and nano-of-second will be unchanged.
     *
     * In all cases, if the new value is outside the valid range of values for the field
     * then a {@link DateTimeException} will be thrown.
     *
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.adjustInto}
     * passing this as the argument. In this case, the field determines
     * whether and how to adjust the instant.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {!TemporalField} field - the field to set in the result, not null
     * @param {number} newValue - the new value of the field in the result
     * @return {LocalTime} a {@link LocalTime} based on this with the specified field set, not null
     * @throws {DateTimeException} if the field cannot be set
     * @throws {ArithmeticException} if numeric overflow occurs
     */
    _withField(field, newValue) {
        requireNonNull(field, 'field');
        requireInstance(field, TemporalField, 'field');
        if (field instanceof ChronoField) {
            field.checkValidValue(newValue);
            switch (field) {
                case ChronoField.NANO_OF_SECOND: return this.withNano(newValue);
                case ChronoField.NANO_OF_DAY: return LocalTime.ofNanoOfDay(newValue);
                case ChronoField.MICRO_OF_SECOND: return this.withNano(newValue * 1000);
                case ChronoField.MICRO_OF_DAY: return LocalTime.ofNanoOfDay(newValue * 1000);
                case ChronoField.MILLI_OF_SECOND: return this.withNano( newValue * 1000000);
                case ChronoField.MILLI_OF_DAY: return LocalTime.ofNanoOfDay(newValue * 1000000);
                case ChronoField.SECOND_OF_MINUTE: return this.withSecond(newValue);
                case ChronoField.SECOND_OF_DAY: return this.plusSeconds(newValue - this.toSecondOfDay());
                case ChronoField.MINUTE_OF_HOUR: return this.withMinute(newValue);
                case ChronoField.MINUTE_OF_DAY: return this.plusMinutes(newValue - (this._hour * 60 + this._minute));
                case ChronoField.HOUR_OF_AMPM: return this.plusHours(newValue - MathUtil.intMod(this._hour, 12));
                case ChronoField.CLOCK_HOUR_OF_AMPM: return this.plusHours((newValue === 12 ? 0 : newValue) - MathUtil.intMod(this._hour, 12));
                case ChronoField.HOUR_OF_DAY: return this.withHour(newValue);
                case ChronoField.CLOCK_HOUR_OF_DAY: return this.withHour((newValue === 24 ? 0 : newValue));
                case ChronoField.AMPM_OF_DAY: return this.plusHours((newValue - MathUtil.intDiv(this._hour, 12)) * 12);
            }
            throw new UnsupportedTemporalTypeException(`Unsupported field: ${field}`);
        }
        return field.adjustInto(this, newValue);
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this {@link LocalTime} with the hour-of-day value altered.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} [hour=0] - the hour-of-day to set in the result, from 0 to 23
     * @return {LocalTime} a {@link LocalTime} based on this time with the requested hour, not null
     * @throws {DateTimeException} if the hour value is invalid
     */
    withHour(hour=0) {
        if (this._hour === hour) {
            return this;
        }
        return new LocalTime(hour, this._minute, this._second, this._nano);
    }

    /**
     * Returns a copy of this {@link LocalTime} with the minute-of-hour value altered.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} [minute=0] - the minute-of-hour to set in the result, from 0 to 59
     * @return {LocalTime} a {@link LocalTime} based on this time with the requested minute, not null
     * @throws {DateTimeException} if the minute value is invalid
     */
    withMinute(minute=0) {
        if (this._minute === minute) {
            return this;
        }
        return new LocalTime(this._hour, minute, this._second, this._nano);
    }

    /**
     * Returns a copy of this {@link LocalTime} with the second-of-minute value altered.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} [second=0] - the second-of-minute to set in the result, from 0 to 59
     * @return {LocalTime} a {@link LocalTime} based on this time with the requested second, not null
     * @throws {DateTimeException} if the second value is invalid
     */
    withSecond(second=0) {
        if (this._second === second) {
            return this;
        }
        return new LocalTime(this._hour, this._minute, second, this._nano);
    }

    /**
     * Returns a copy of this {@link LocalTime} with the nano-of-second value altered.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} [nanoOfSecond=0] - the nano-of-second to set in the result, from 0 to 999,999,999
     * @return {LocalTime} a {@link LocalTime} based on this time with the requested nanosecond, not null
     * @throws {DateTimeException} if the nanos value is invalid
     */
    withNano(nanoOfSecond=0) {
        if (this._nano === nanoOfSecond) {
            return this;
        }
        return new LocalTime(this._hour, this._minute, this._second, nanoOfSecond);
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this {@link LocalTime} with the time truncated.
     *
     * Truncating the time returns a copy of the original time with fields
     * smaller than the specified unit set to zero.
     * For example, truncating with the {@link ChronoUnit.MINUTES} minutes unit
     * will set the second-of-minute and nano-of-second field to zero.
     *
     * The unit must have a duration (see {@link TemporalUnit#getDuration})
     * that divides into the length of a standard day without remainder.
     * This includes all supplied time units on {@link ChronoUnit} and
     * {@link ChronoUnit.DAYS}. Other units throw an exception.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {!ChronoUnit} unit - the unit to truncate to, not null
     * @return {LocalTime} a {@link LocalTime} based on this time with the time truncated, not null
     * @throws {DateTimeException} if unable to truncate
     */
    truncatedTo(unit) {
        requireNonNull(unit, 'unit');
        if (unit === ChronoUnit.NANOS) {
            return this;
        }
        const unitDur = unit.duration();
        if (unitDur.seconds() > LocalTime.SECONDS_PER_DAY) {
            throw new DateTimeException('Unit is too large to be used for truncation');
        }
        const dur = unitDur.toNanos();
        if (MathUtil.intMod(LocalTime.NANOS_PER_DAY, dur) !== 0) {
            throw new DateTimeException('Unit must divide into a standard day without remainder');
        }
        const nod = this.toNanoOfDay();
        return LocalTime.ofNanoOfDay(MathUtil.intDiv(nod, dur) * dur);
    }

    //-----------------------------------------------------------------------

    /**
     * Returns a copy of this time with the specified period added.
     *
     * This method returns a new time based on this time with the specified period added.
     * This can be used to add any period that is defined by a unit, for example to add hours, minutes or seconds.
     * The unit is responsible for the details of the calculation, including the resolution
     * of any edge cases in the calculation.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} amountToAdd - the amount of the unit to add to the result, may be negative
     * @param {TemporalUnit} unit - the unit of the period to add, not null
     * @return {LocalTime} a {@link LocalTime} based on this time with the specified period added, not null
     * @throws {DateTimeException} if the unit cannot be added to this type
     */
    _plusUnit(amountToAdd, unit) {
        requireNonNull(unit, 'unit');
        if (unit instanceof ChronoUnit) {
            switch (unit) {
                case ChronoUnit.NANOS: return this.plusNanos(amountToAdd);
                case ChronoUnit.MICROS: return this.plusNanos(MathUtil.intMod(amountToAdd, LocalTime.MICROS_PER_DAY) * 1000);
                case ChronoUnit.MILLIS: return this.plusNanos(MathUtil.intMod(amountToAdd, LocalTime.MILLIS_PER_DAY) * 1000000);
                case ChronoUnit.SECONDS: return this.plusSeconds(amountToAdd);
                case ChronoUnit.MINUTES: return this.plusMinutes(amountToAdd);
                case ChronoUnit.HOURS: return this.plusHours(amountToAdd);
                case ChronoUnit.HALF_DAYS: return this.plusHours(MathUtil.intMod(amountToAdd, 2) * 12);
            }
            throw new UnsupportedTemporalTypeException(`Unsupported unit: ${unit}`);
        }
        return unit.addTo(this, amountToAdd);
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this {@link LocalTime} with the specified period in hours added.
     *
     * This adds the specified number of hours to this time, returning a new time.
     * The calculation wraps around midnight.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} hoursToAdd - the hours to add, may be negative
     * @return {LocalTime} a {@link LocalTime} based on this time with the hours added, not null
     */
    plusHours(hoursToAdd) {
        if (hoursToAdd === 0) {
            return this;
        }

        const newHour = MathUtil.intMod(MathUtil.intMod(hoursToAdd, LocalTime.HOURS_PER_DAY) + this._hour + LocalTime.HOURS_PER_DAY, LocalTime.HOURS_PER_DAY);
        return new LocalTime(newHour, this._minute, this._second, this._nano);
    }

    /**
     * Returns a copy of this {@link LocalTime} with the specified period in minutes added.
     *
     * This adds the specified number of minutes to this time, returning a new time.
     * The calculation wraps around midnight.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} minutesToAdd - the minutes to add, may be negative
     * @return {LocalTime} a {@link LocalTime} based on this time with the minutes added, not null
     */
    plusMinutes(minutesToAdd) {
        if (minutesToAdd === 0) {
            return this;
        }
        const mofd = this._hour * LocalTime.MINUTES_PER_HOUR + this._minute;
        const newMofd = MathUtil.intMod(MathUtil.intMod(minutesToAdd, LocalTime.MINUTES_PER_DAY) + mofd + LocalTime.MINUTES_PER_DAY, LocalTime.MINUTES_PER_DAY);
        if (mofd === newMofd) {
            return this;
        }
        const newHour = MathUtil.intDiv(newMofd, LocalTime.MINUTES_PER_HOUR);
        const newMinute = MathUtil.intMod(newMofd, LocalTime.MINUTES_PER_HOUR);
        return new LocalTime(newHour, newMinute, this._second, this._nano);
    }

    /**
     * Returns a copy of this {@link LocalTime} with the specified period in seconds added.
     *
     * This adds the specified number of seconds to this time, returning a new time.
     * The calculation wraps around midnight.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} secondsToAdd - the seconds to add, may be negative
     * @return {LocalTime} a {@link LocalTime} based on this time with the seconds added, not null
     */
    plusSeconds(secondsToAdd) {
        if (secondsToAdd === 0) {
            return this;
        }
        const sofd = this._hour * LocalTime.SECONDS_PER_HOUR +
                    this._minute * LocalTime.SECONDS_PER_MINUTE + this._second;
        const newSofd = MathUtil.intMod((MathUtil.intMod(secondsToAdd, LocalTime.SECONDS_PER_DAY) + sofd + LocalTime.SECONDS_PER_DAY), LocalTime.SECONDS_PER_DAY);
        if (sofd === newSofd) {
            return this;
        }
        const newHour = MathUtil.intDiv(newSofd, LocalTime.SECONDS_PER_HOUR);
        const newMinute = MathUtil.intMod(MathUtil.intDiv(newSofd, LocalTime.SECONDS_PER_MINUTE), LocalTime.MINUTES_PER_HOUR);
        const newSecond = MathUtil.intMod(newSofd, LocalTime.SECONDS_PER_MINUTE);
        return new LocalTime(newHour, newMinute, newSecond, this._nano);
    }

    /**
     * Returns a copy of this {@link LocalTime} with the specified period in nanoseconds added.
     *
     * This adds the specified number of nanoseconds to this time, returning a new time.
     * The calculation wraps around midnight.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} nanosToAdd - the nanos to add, may be negative
     * @return {LocalTime} a {@link LocalTime} based on this time with the nanoseconds added, not null
     */
    plusNanos(nanosToAdd) {
        if (nanosToAdd === 0) {
            return this;
        }
        const nofd = this.toNanoOfDay();
        const newNofd = MathUtil.intMod((MathUtil.intMod(nanosToAdd, LocalTime.NANOS_PER_DAY) + nofd + LocalTime.NANOS_PER_DAY), LocalTime.NANOS_PER_DAY);
        if (nofd === newNofd) {
            return this;
        }
        const newHour = MathUtil.intDiv(newNofd, LocalTime.NANOS_PER_HOUR);
        const newMinute = MathUtil.intMod(MathUtil.intDiv(newNofd, LocalTime.NANOS_PER_MINUTE), LocalTime.MINUTES_PER_HOUR);
        const newSecond = MathUtil.intMod(MathUtil.intDiv(newNofd, LocalTime.NANOS_PER_SECOND), LocalTime.SECONDS_PER_MINUTE);
        const newNano = MathUtil.intMod(newNofd, LocalTime.NANOS_PER_SECOND);
        return new LocalTime(newHour, newMinute, newSecond, newNano);
    }

    //-----------------------------------------------------------------------

    /**
     * Returns a copy of this time with the specified period subtracted.
     *
     * This method returns a new time based on this time with the specified period subtracted.
     * This can be used to subtract any period that is defined by a unit, for example to subtract hours, minutes or seconds.
     * The unit is responsible for the details of the calculation, including the resolution
     * of any edge cases in the calculation.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} amountToSubtract - the amount of the unit to subtract from the result, may be negative
     * @param {ChronoUnit} unit - the unit of the period to subtract, not null
     * @return {LocalTime} a {@link LocalTime} based on this time with the specified period subtracted, not null
     * @throws {DateTimeException} if the unit cannot be added to this type
     */
    _minusUnit(amountToSubtract, unit) {
        requireNonNull(unit, 'unit');
        return this._plusUnit(-1 * amountToSubtract, unit);
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this {@link LocalTime} with the specified period in hours subtracted.
     *
     * This subtracts the specified number of hours from this time, returning a new time.
     * The calculation wraps around midnight.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} hoursToSubtract - the hours to subtract, may be negative
     * @return {LocalTime} a {@link LocalTime} based on this time with the hours subtracted, not null
     */
    minusHours(hoursToSubtract) {
        return this.plusHours(-1 * MathUtil.intMod(hoursToSubtract, LocalTime.HOURS_PER_DAY));
    }

    /**
     * Returns a copy of this {@link LocalTime} with the specified period in minutes subtracted.
     *
     * This subtracts the specified number of minutes from this time, returning a new time.
     * The calculation wraps around midnight.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} minutesToSubtract - the minutes to subtract, may be negative
     * @return {LocalTime} a {@link LocalTime} based on this time with the minutes subtracted, not null
     */
    minusMinutes(minutesToSubtract) {
        return this.plusMinutes(-1 * MathUtil.intMod(minutesToSubtract, LocalTime.MINUTES_PER_DAY));
    }

    /**
     * Returns a copy of this {@link LocalTime} with the specified period in seconds subtracted.
     *
     * This subtracts the specified number of seconds from this time, returning a new time.
     * The calculation wraps around midnight.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} secondsToSubtract - the seconds to subtract, may be negative
     * @return {LocalTime} a {@link LocalTime} based on this time with the seconds subtracted, not null
     */
    minusSeconds(secondsToSubtract) {
        return this.plusSeconds(-1 * MathUtil.intMod(secondsToSubtract, LocalTime.SECONDS_PER_DAY));
    }

    /**
     * Returns a copy of this {@link LocalTime} with the specified period in nanoseconds subtracted.
     *
     * This subtracts the specified number of nanoseconds from this time, returning a new time.
     * The calculation wraps around midnight.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} nanosToSubtract - the nanos to subtract, may be negative
     * @return {LocalTime} a {@link LocalTime} based on this time with the nanoseconds subtracted, not null
     */
    minusNanos(nanosToSubtract) {
        return this.plusNanos(-1 * MathUtil.intMod(nanosToSubtract, LocalTime.NANOS_PER_DAY));
    }

    //-----------------------------------------------------------------------
    /**
     * Queries this time using the specified query.
     *
     * This queries this time using the specified query strategy object.
     * The {@link TemporalQuery} object defines the logic to be used to
     * obtain the result. Read the documentation of the query to understand
     * what the result of this method will be.
     *
     * The result of this method is obtained by invoking the
     * {@link TemporalQuery#queryFrom} method on the
     * specified query passing this as the argument.
     *
     * @param {TemporalQuery} query - the query to invoke, not null
     * @return {*} the query result, null may be returned (defined by the query)
     * @throws {DateTimeException} if unable to query (defined by the query)
     * @throws {ArithmeticException} if numeric overflow occurs (defined by the query)
     */
    query(query) {
        requireNonNull(query, 'query');
        if (query === TemporalQueries.precision()) {
            return ChronoUnit.NANOS;
        } else if (query === TemporalQueries.localTime()) {
            return this;
        }
        // inline TemporalAccessor.super.query(query) as an optimization
        if (query === TemporalQueries.chronology() || query === TemporalQueries.zoneId() ||
                query === TemporalQueries.zone() || query === TemporalQueries.offset() ||
                query === TemporalQueries.localDate()) {
            return null;
        }
        return query.queryFrom(this);
    }

    /**
     * Adjusts the specified temporal object to have the same time as this object.
     *
     * This returns a temporal object of the same observable type as the input
     * with the time changed to be the same as this.
     *
     * The adjustment is equivalent to using {@link Temporal.with}
     * passing {@link ChronoField.NANO_OF_DAY} as the field.
     *
     * In most cases, it is clearer to reverse the calling pattern by using
     * {@link Temporal.with}:
     * <pre>
     *   // these two lines are equivalent, but the second approach is recommended
     *   temporal = thisLocalTime.adjustInto(temporal);
     *   temporal = temporal.with(thisLocalTime);
     * </pre>
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {TemporalAdjuster} temporal - the target object to be adjusted, not null
     * @return {Temporal} the adjusted object, not null
     * @throws {DateTimeException} if unable to make the adjustment
     * @throws {ArithmeticException} if numeric overflow occurs
     */
    adjustInto(temporal) {
        return temporal.with(LocalTime.NANO_OF_DAY, this.toNanoOfDay());
    }

    /**
     * Calculates the period between this time and another time in
     * terms of the specified unit.
     *
     * This calculates the period between two times in terms of a single unit.
     * The start and end points are this and the specified time.
     * The result will be negative if the end is before the start.
     * The {@link Temporal} passed to this method must be a {@link LocalTime}.
     * For example, the period in hours between two times can be calculated
     * using {@link startTime.until}.
     *
     * The calculation returns a whole number, representing the number of
     * complete units between the two times.
     * For example, the period in hours between 11:30 and 13:29 will only
     * be one hour as it is one minute short of two hours.
     *
     * This method operates in association with {@link TemporalUnit.between}.
     * The result of this method is a `long` representing the amount of
     * the specified unit. By contrast, the result of {@link between} is an
     * object that can be used directly in addition/subtraction:
     * <pre>
     *   long period = start.until(end, HOURS);   // this method
     *   dateTime.plus(HOURS.between(start, end));      // use in plus/minus
     * </pre>
     *
     * The calculation is implemented in this method for {@link ChronoUnit}.
     * The units {@link ChronoUnit.NANOS}, {@link ChronoUnit.MICROS}, {@link ChronoUnit.MILLIS}, {@link ChronoUnit.SECONDS},
     * {@link ChronoUnit.MINUTES}, {@link ChronoUnit.HOURS} and {@link ChronoUnit.HALF_DAYS} are supported.
     * Other {@link ChronoUnit} values will throw an exception.
     *
     * If the unit is not a {@link ChronoUnit}, then the result of this method
     * is obtained by invoking {@link TemporalUnit.between}
     * passing this as the first argument and the input temporal as
     * the second argument.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {TemporalAccessor} endExclusive - the end time, which is converted to a {@link LocalTime}, not null
     * @param {TemporalUnit} unit - the unit to measure the period in, not null
     * @return {number} the amount of the period between this time and the end time
     * @throws {DateTimeException} if the period cannot be calculated
     * @throws {ArithmeticException} if numeric overflow occurs
     */
    until(endExclusive, unit) {
        requireNonNull(endExclusive, 'endExclusive');
        requireNonNull(unit, 'unit');
        const end = LocalTime.from(endExclusive);
        if (unit instanceof ChronoUnit) {
            const nanosUntil = end.toNanoOfDay() - this.toNanoOfDay();  // no overflow
            switch (unit) {
                case ChronoUnit.NANOS: return nanosUntil;
                case ChronoUnit.MICROS: return MathUtil.intDiv(nanosUntil, 1000);
                case ChronoUnit.MILLIS: return MathUtil.intDiv(nanosUntil, 1000000);
                case ChronoUnit.SECONDS: return MathUtil.intDiv(nanosUntil, LocalTime.NANOS_PER_SECOND);
                case ChronoUnit.MINUTES: return MathUtil.intDiv(nanosUntil, LocalTime.NANOS_PER_MINUTE);
                case ChronoUnit.HOURS: return MathUtil.intDiv(nanosUntil, LocalTime.NANOS_PER_HOUR);
                case ChronoUnit.HALF_DAYS: return MathUtil.intDiv(nanosUntil, (12 * LocalTime.NANOS_PER_HOUR));
            }
            throw new UnsupportedTemporalTypeException(`Unsupported unit: ${unit}`);
        }
        return unit.between(this, end);
    }

    //-----------------------------------------------------------------------
    /**
     * Combines this time with a date to create a {@link LocalDateTime}.
     *
     * This returns a {@link LocalDateTime} formed from this time at the specified date.
     * All possible combinations of date and time are valid.
     *
     * @param {LocalDate} date - the date to combine with, not null
     * @return {LocalDateTime} the local date-time formed from this time and the specified date, not null
     */
    atDate(date) {
        return LocalDateTime.of(date, this);
    }

    /**
     * Combines this time with an offset to create an {@link OffsetTime}.
     *
     * This returns an {@link OffsetTime} formed from this time at the specified offset.
     * All possible combinations of time and offset are valid.
     *
     * @param {OffsetTime} offset - the offset to combine with, not null
     * @return {OffsetTime} the offset time formed from this time and the specified offset, not null
     */
    atOffset(offset) {
        return OffsetTime.of(this, offset);
    }

    //-----------------------------------------------------------------------
    /**
     * Extracts the time as seconds of day, from `0` to `24 * 60 * 60 - 1`.
     *
     * @return {number} the second-of-day equivalent to this time
     */
    toSecondOfDay() {
        let total = this._hour * LocalTime.SECONDS_PER_HOUR;
        total += this._minute * LocalTime.SECONDS_PER_MINUTE;
        total += this._second;
        return total;
    }

    /**
     * Extracts the time as nanos of day, from `0` to `24 * 60 * 60 * 1,000,000,000 - 1`.
     *
     * @return {number} the nano of day equivalent to this time
     */
    toNanoOfDay() {
        let total = this._hour * LocalTime.NANOS_PER_HOUR;
        total += this._minute * LocalTime.NANOS_PER_MINUTE;
        total += this._second * LocalTime.NANOS_PER_SECOND;
        total += this._nano;
        return total;
    }

    //-----------------------------------------------------------------------
    /**
     * Compares this {@link LocalTime} to another time.
     *
     * The comparison is based on the time-line position of the local times within a day.
     * It is 'consistent with equals', as defined by {@link Comparable}.
     *
     * @param {LocalTime} other - the other time to compare to, not null
     * @return {number} the comparator value, negative if less, positive if greater
     * @throws {NullPointerException} if `other` is null
     */
    compareTo(other) {
        requireNonNull(other, 'other');
        requireInstance(other, LocalTime, 'other');
        let cmp = MathUtil.compareNumbers(this._hour, other._hour);
        if (cmp === 0) {
            cmp = MathUtil.compareNumbers(this._minute, other._minute);
            if (cmp === 0) {
                cmp = MathUtil.compareNumbers(this._second, other._second);
                if (cmp === 0) {
                    cmp = MathUtil.compareNumbers(this._nano, other._nano);
                }
            }
        }
        return cmp;
    }

    /**
     * Checks if this {@link LocalTime} is after the specified time.
     *
     * The comparison is based on the time-line position of the time within a day.
     *
     * @param {LocalTime} other - the other time to compare to, not null
     * @return {boolean} true if this is after the specified time
     * @throws {NullPointerException} if `other` is null
     */
    isAfter(other) {
        return this.compareTo(other) > 0;
    }

    /**
     * Checks if this {@link LocalTime} is before the specified time.
     *
     * The comparison is based on the time-line position of the time within a day.
     *
     * @param {LocalTime} other - the other time to compare to, not null
     * @return {boolean} true if this point is before the specified time
     * @throws {NullPointerException} if `other` is null
     */
    isBefore(other) {
        return this.compareTo(other) < 0;
    }

    //-----------------------------------------------------------------------
    /**
     * Checks if this time is equal to another time.
     *
     * The comparison is based on the time-line position of the time within a day.
     *
     * Only objects of type {@link LocalTime} are compared, other types return false.
     * To compare the date of two {@link TemporalAccessor} instances, use
     * {@link ChronoField#NANO_OF_DAY} as a comparator.
     *
     * @param {*} other - the object to check, null returns false
     * @return {boolean} true if this is equal to the other time
     */
    equals(other) {
        if (this === other) {
            return true;
        }
        if (other instanceof LocalTime) {
            return this._hour === other._hour && this._minute === other._minute &&
                this._second === other._second && this._nano === other._nano;
        }
        return false;
    }

    /**
     * A hash code for this time.
     *
     * @return {number} a suitable hash code
     */
    hashCode() {
        const nod = this.toNanoOfDay();
        return MathUtil.hash(nod);
    }

    //-----------------------------------------------------------------------
    /**
     * Outputs this time as a string, such as `10:15`.
     *
     * The output will be one of the following ISO-8601 formats:
     *
     * * {@link HH:mm}
     * * {@link HH:mm:ss}
     * * {@link HH:mm:ss.SSS}
     * * {@link HH:mm:ss.SSSSSS}
     * * {@link HH:mm:ss.SSSSSSSSS}
     *
     * The format used will be the shortest that outputs the full value of
     * the time where the omitted parts are implied to be zero.
     *
     * @return {string} a string representation of this time, not null
     */
    toString() {
        let buf = '';
        const hourValue = this._hour;
        const minuteValue = this._minute;
        const secondValue = this._second;
        const nanoValue = this._nano;
        buf += hourValue < 10 ? '0' : '';
        buf += hourValue;
        buf += minuteValue < 10 ? ':0' : ':';
        buf += minuteValue;
        if (secondValue > 0 || nanoValue > 0) {
            buf += secondValue < 10 ? ':0' : ':';
            buf += secondValue;
            if (nanoValue > 0) {
                buf += '.';
                if(MathUtil.intMod(nanoValue, 1000000) === 0) {
                    buf += (`${MathUtil.intDiv(nanoValue, 1000000) + 1000}`).substring(1);
                } else if (MathUtil.intMod(nanoValue, 1000) === 0) {
                    buf += (`${MathUtil.intDiv(nanoValue, 1000) + 1000000}`).substring(1);
                } else {
                    buf += (`${nanoValue + 1000000000}`).substring(1);
                }
            }
        }
        return buf;
    }

    /**
     *
     * @return {string} same as {@link LocalTime.toString}
     */
    toJSON() {
        return this.toString();
    }

    /**
     * Outputs this time as a string using the formatter.
     *
     * @param {DateTimeFormatter} formatter - the formatter to use, not null
     * @return {string} the formatted time string, not null
     * @throws {DateTimeException} if an error occurs during printing
     */
    format(formatter) {
        requireNonNull(formatter, 'formatter');
        return formatter.format(this);
    }
}

export function _init() {
    /**
     * Constants for the local time of each hour.
     */
    LocalTime.HOURS = [];
    for (let hour = 0; hour < 24; hour++) {
        LocalTime.of(hour, 0, 0, 0);
    }

    /**
     * The minimum supported {@link LocalTime}, '00:00'.
     * This is the time of midnight at the start of the day.
     */
    LocalTime.MIN = LocalTime.HOURS[0];
    /**
     * The maximum supported {@link LocalTime}, '23:59:59.999999999'.
     * This is the time just before midnight at the end of the day.
     */
    LocalTime.MAX = new LocalTime(23, 59, 59, 999999999);
    /**
     * The time of midnight at the start of the day, '00:00'.
     */
    LocalTime.MIDNIGHT = LocalTime.HOURS[0];
    /**
     * The time of noon in the middle of the day, '12:00'.
     */
    LocalTime.NOON = LocalTime.HOURS[12];

    LocalTime.FROM = createTemporalQuery('LocalTime.FROM', (temporal) => {
        return LocalTime.from(temporal);
    });
}

/**
 * Hours per day.
 */
LocalTime.HOURS_PER_DAY = 24;
/**
 * Minutes per hour.
 */
LocalTime.MINUTES_PER_HOUR = 60;
/**
 * Minutes per day.
 */
LocalTime.MINUTES_PER_DAY = LocalTime.MINUTES_PER_HOUR * LocalTime.HOURS_PER_DAY;
/**
 * Seconds per minute.
 */
LocalTime.SECONDS_PER_MINUTE = 60;
/**
 * Seconds per hour.
 */
LocalTime.SECONDS_PER_HOUR = LocalTime.SECONDS_PER_MINUTE * LocalTime.MINUTES_PER_HOUR;
/**
 * Seconds per day.
 */
LocalTime.SECONDS_PER_DAY = LocalTime.SECONDS_PER_HOUR * LocalTime.HOURS_PER_DAY;
/**
 * Milliseconds per day.
 */
LocalTime.MILLIS_PER_DAY = LocalTime.SECONDS_PER_DAY * 1000;
/**
 * Microseconds per day.
 */
LocalTime.MICROS_PER_DAY = LocalTime.SECONDS_PER_DAY * 1000000;
/**
 * Nanos per second.
 */
LocalTime.NANOS_PER_SECOND = 1000000000;
/**
 * Nanos per minute.
 */
LocalTime.NANOS_PER_MINUTE = LocalTime.NANOS_PER_SECOND * LocalTime.SECONDS_PER_MINUTE;
/**
 * Nanos per hour.
 */
LocalTime.NANOS_PER_HOUR = LocalTime.NANOS_PER_MINUTE * LocalTime.MINUTES_PER_HOUR;
/**
 * Nanos per day.
 */
LocalTime.NANOS_PER_DAY = LocalTime.NANOS_PER_HOUR * LocalTime.HOURS_PER_DAY;
/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
import { ArithmeticException } from './errors';

export const MAX_SAFE_INTEGER = 9007199254740991;
export const MIN_SAFE_INTEGER = -9007199254740991;

/**
 * Math helper with static function for integer operations
 */
export class MathUtil {
    /**
     *
     * @param {number} x
     * @param {number} y
     * @returns {number}
     */
    static intDiv(x, y) {
        let r = x/y;
        r = MathUtil.roundDown(r);
        return MathUtil.safeZero(r);
    }

    /**
     *
     * @param {number} x
     * @param {number} y
     * @returns {number}
     */
    static intMod(x, y) {
        let r = x - MathUtil.intDiv(x, y) * y;
        r = MathUtil.roundDown(r);
        return MathUtil.safeZero(r);
    }

    /**
     *
     * @param {number} r
     * @returns {number}
     */
    static roundDown(r){
        if (r < 0) {
            return Math.ceil(r);
        } else {
            return Math.floor(r);
        }
    }

    /**
     *
     * @param {number} x
     * @param {number} y
     * @returns {number}
     */
    static floorDiv(x, y){
        const r = Math.floor(x / y);
        return MathUtil.safeZero(r);
    }

    /**
     *
     * @param {number} x
     * @param {number} y
     * @returns {number}
     */
    static floorMod(x, y){
        const r = x - MathUtil.floorDiv(x, y) * y;
        return MathUtil.safeZero(r);
    }

    /**
     *
     * @param {number} x
     * @param {number} y
     * @returns {number}
     */
    static safeAdd(x, y) {
        MathUtil.verifyInt(x);
        MathUtil.verifyInt(y);
        if (x === 0) {
            return MathUtil.safeZero(y);
        }
        if (y === 0) {
            return MathUtil.safeZero(x);
        }
        const r = MathUtil.safeToInt(x + y);
        if (r === x || r === y) {
            throw new ArithmeticException('Invalid addition beyond MAX_SAFE_INTEGER!');
        }
        return r;
    }

    /**
     *
     * @param {number} x
     * @param {number} y
     * @returns {number}
     */
    static safeSubtract(x, y) {
        MathUtil.verifyInt(x);
        MathUtil.verifyInt(y);
        if (x === 0 && y === 0) {
            return 0;
        } else if (x === 0) {
            return MathUtil.safeZero(-1 * y);
        } else if (y === 0) {
            return MathUtil.safeZero(x);
        }
        return MathUtil.safeToInt(x - y);
    }

    /**
     *
     * @param {number} x
     * @param {number} y
     * @returns {number}
     */
    static safeMultiply(x, y) {
        MathUtil.verifyInt(x);
        MathUtil.verifyInt(y);
        if (x === 1) {
            return MathUtil.safeZero(y);
        }
        if (y === 1) {
            return MathUtil.safeZero(x);
        }
        if (x === 0 || y === 0) {
            return 0;
        }
        const r = MathUtil.safeToInt(x * y);
        if (r / y !== x || (x === MIN_SAFE_INTEGER && y === -1) || (y === MIN_SAFE_INTEGER && x === -1)) {
            throw new ArithmeticException(`Multiplication overflows: ${x} * ${y}`);
        }
        return r;
    }

    /**
     *
     * @param {number} value
     * @returns {number}
     */
    static parseInt(value) {
        const r = parseInt(value);
        return MathUtil.safeToInt(r);
    }

    /**
     *
     * @param {number} value
     * @returns {number}
     */
    static safeToInt(value) {
        MathUtil.verifyInt(value);
        return MathUtil.safeZero(value);
    }

    /**
     *
     * @param {number} value
     */
    static verifyInt(value){
        if (value == null) {
            throw new ArithmeticException(`Invalid value: '${value}', using null or undefined as argument`);
        }
        if (isNaN(value)) {
            throw new ArithmeticException('Invalid int value, using NaN as argument');
        }
        if ((value % 1) !== 0) {
            throw new ArithmeticException(`Invalid value: '${value}' is a float`);
        }
        if (value > MAX_SAFE_INTEGER || value < MIN_SAFE_INTEGER) {
            throw new ArithmeticException(`Calculation overflows an int: ${value}`);
        }
    }

    /**
     * convert -0 to 0 and int as string to a number ( '1' -> 1 )
     *
     * @param {number} value
     * @returns {number}
     */
    static safeZero(value){
        return value === 0 ? 0 : +value;
    }

    /**
     * Compares two Numbers.
     *
     * @param {number} a  the first value
     * @param {number} b  the second value
     * @return {number} the result
     */
    static compareNumbers(a, b) {
        if (a < b) {
            return -1;
        }
        if (a > b) {
            return 1;
        }
        return 0;
    }

    // convert to small integer for v8 optimisation
    static smi(int) {
        return ((int >>> 1) & 0x40000000) | (int & 0xBFFFFFFF);
    }

    // calculate 32 bit hash of a number and convert to SMI
    static hash(number) {
        if (number !== number || number === Infinity) {
            return 0;
        }
        let result = number;
        while (number > 0xFFFFFFFF) {
            number /= 0xFFFFFFFF;
            result ^= number;
        }
        return MathUtil.smi(result);
    }

    // default hashCode calculation for a number sequence as mentioned by Joshua Bloch
    static hashCode(...numbers) {
        let result = 17;
        for (const n of numbers) {
            result = (result << 5) - result + MathUtil.hash(n);
        }
        return MathUtil.hash(result);
    }
}

MathUtil.MAX_SAFE_INTEGER = MAX_SAFE_INTEGER;
MathUtil.MIN_SAFE_INTEGER = MIN_SAFE_INTEGER;

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { assert, requireNonNull, requireInstance } from './assert';
import { MathUtil } from './MathUtil';

import { ChronoField } from './temporal/ChronoField';
import { ChronoUnit } from './temporal/ChronoUnit';
import { DateTimeException, IllegalArgumentException, UnsupportedTemporalTypeException } from './errors';
import { IsoChronology } from './chrono/IsoChronology';
import { TemporalAccessor } from './temporal/TemporalAccessor';
import { TemporalQueries } from './temporal/TemporalQueries';

/**
 * A month-of-year, such as 'July'.
 *
 * {@link Month} is representing the 12 months of the year -
 * January, February, March, April, May, June, July, August, September, October,
 * November and December.
 *
 * In addition to the textual name, each month-of-year has an `int` value.
 * The `int` value follows normal usage and the ISO-8601 standard,
 * from 1 (January) to 12 (December). It is recommended that applications use the static values defined by this class
 * rather than the `int` value to ensure code clarity.
 *
 * This class represents a common concept that is found in many calendar systems.
 * As such, this class may be used by any calendar system that has the month-of-year
 * concept defined exactly equivalent to the ISO-8601 calendar system.
 *
 * ### Static properties of Class {@link Month}
 *
 * Month.JANUARY, Month.FEBRUARY, Month.MARCH, Month.APRIL, Month.MAY, Month.JUNE,
 * Month.JULY, Month.AUGUST, Month.SEPTEMBER, Month.OCTOBER, Month.NOVEMBER, Month.DECEMBER
 *
 */
export class Month extends TemporalAccessor {

    /**
     *
     * @param {number} ordinal
     * @param {string} name
     * @private
     */
    constructor(value, name){
        super();
        this._value = MathUtil.safeToInt(value);
        this._name = name;
    }    

    /**
     *
     * @return {number} gets the value
     */
    value() {
        return this._value;
    }
    
    /**
     *
     * @returns {number}
     */
    ordinal(){
        return this._value - 1;
    }

    /**
     *
     * @returns {string}
     */
    name(){
        return this._name;
    }  

    /**
     * Gets the textual representation, such as 'Jan' or 'December'.
     *
     * This returns the textual name used to identify the month-of-year.
     * The parameters control the length of the returned text and the locale.
     *
     * If no textual mapping is found then the numeric value (see {@link getValue}) is returned.
     *
     * @param {TextStyle} style - the length of the text required, not null
     * @param {Locale} locale - the locale to use, not null
     * @return {string} the text value of the day-of-week, not null
     */
    // eslint-disable-next-line no-unused-vars
    displayName(style, locale) {
        // TODO:
        throw new IllegalArgumentException('Pattern using (localized) text not implemented yet!');
    }

    /**
     * Checks if the specified field is supported.
     *
     * This checks if this month-of-year can be queried for the specified field.
     * If false, then calling the range (see {@link range}) and
     * get (see {@link get}) methods will throw an exception.
     *
     * If the field is MONTH_OF_YEAR (see {@link ChronoField#MONTH_OF_YEAR}) then
     * this method returns true.
     * All other {@link ChronoField} instances will return false.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.isSupportedBy}
     * passing `this` as the argument.
     * Whether the field is supported is determined by the field.
     *
     * @param {TemporalField} field - the field to check, null returns false
     * @return {boolean} true if the field is supported on this month-of-year, false if not
     */
    isSupported(field) {
        if (null === field) {
            return false;
        }
        if (field instanceof ChronoField) {
            return field === ChronoField.MONTH_OF_YEAR;
        }
        return field != null && field.isSupportedBy(this);
    }

    /**
     * Gets the value of the specified field from this month-of-year as an `int`.
     *
     * This queries this month for the value of the specified field.
     * The returned value will always be within the valid range of values for the field.
     * If it is not possible to return the value, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is MONTH_OF_YEAR (see {@link ChronoField#MONTH_OF_YEAR}) then the
     * value of the month-of-year, from 1 to 12, will be returned.
     * All other {@link ChronoField} instances will throw an {@link UnsupportedTemporalTypeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.getFrom}
     * passing `this` as the argument. Whether the value can be obtained,
     * and what the value represents, is determined by the field.
     *
     * @param {TemporalField} field - the field to get, not null
     * @return {Number} the value for the field, within the valid range of values
     * @throws DateTimeException if a value for the field cannot be obtained or
     *         the value is outside the range of valid values for the field
     * @throws UnsupportedTemporalTypeException if the field is not supported or
     *         the range of values exceeds an `int`
     * @throws ArithmeticException if numeric overflow occurs
     */
    get(field) {
        if (field === ChronoField.MONTH_OF_YEAR) {
            return this.value();
        }
        return this.range(field).checkValidIntValue(this.getLong(field), field);
    }

    /**
     * Gets the value of the specified field from this month-of-year as a `long`.
     *
     * This queries this month for the value of the specified field.
     * If it is not possible to return the value, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is MONTH_OF_YEAR (see {@link ChronoField#MONTH_OF_YEAR}) then the
     * value of the month-of-year, from 1 to 12, will be returned.
     * All other {@link ChronoField} instances will throw an {@link UnsupportedTemporalTypeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.getFrom}
     * passing `this` as the argument. Whether the value can be obtained,
     * and what the value represents, is determined by the field.
     *
     * @param {TemporalField} field - the field to get, not null
     * @return {Number} the value for the field
     * @throws DateTimeException if a value for the field cannot be obtained
     * @throws UnsupportedTemporalTypeException if the field is not supported
     * @throws ArithmeticException if numeric overflow occurs
     */
    getLong(field) {
        if (field === ChronoField.MONTH_OF_YEAR) {
            return this.value();
        } else if (field instanceof ChronoField) {
            throw new UnsupportedTemporalTypeException(`Unsupported field: ${field}`);
        }
        return field.getFrom(this);
    }

    /**
     * Returns the month-of-year that is the specified number of months after this one.
     *
     * The calculation rolls around the end of the year from December to January.
     * The specified period may be negative.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} months - the months to add, positive or negative
     * @return {Month} the resulting month, not null
     */
    plus(months) {
        const amount = MathUtil.intMod(months, 12) + 12; // + 12 to make sure negative arguments are positive, the total is "corrected" by the next % 12
        let newMonthVal = MathUtil.intMod((this.value() + amount), 12);
        /* December is 12, not 0, but 12 % 12 = 0 */
        newMonthVal = newMonthVal === 0 ? 12 : newMonthVal;
        return Month.of(newMonthVal);
    }

    /**
     * Returns the month-of-year that is the specified number of months before this one.
     *
     * The calculation rolls around the start of the year from January to December.
     * The specified period may be negative.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} months - the months to subtract, positive or negative
     * @return {Month} the resulting month, not null
     */
    minus(months) {
        return this.plus(-1 * MathUtil.intMod(months, 12));
    }

    /**
     * Gets the length of this month in days.
     *
     * This takes a flag to determine whether to return the length for a leap year or not.
     *
     * February has 28 days in a standard year and 29 days in a leap year.
     * April, June, September and November have 30 days.
     * All other months have 31 days.
     *
     * @param {boolean} leapYear - true if the length is required for a leap year
     * @return {number} the length of this month in days, from 28 to 31
     */
    length(leapYear) {
        switch (this) {
            case Month.FEBRUARY:
                return (leapYear ? 29 : 28);
            case Month.APRIL:
            case Month.JUNE:
            case Month.SEPTEMBER:
            case Month.NOVEMBER:
                return 30;
            default:
                return 31;
        }
    }

    /**
     * Gets the minimum length of this month in days.
     *
     * February has a minimum length of 28 days.
     * April, June, September and November have 30 days.
     * All other months have 31 days.
     *
     * @return {number} the minimum length of this month in days, from 28 to 31
     */
    minLength() {
        switch (this) {
            case Month.FEBRUARY:
                return 28;
            case Month.APRIL:
            case Month.JUNE:
            case Month.SEPTEMBER:
            case Month.NOVEMBER:
                return 30;
            default:
                return 31;
        }
    }

    /**
     * Gets the maximum length of this month in days.
     *
     * February has a maximum length of 29 days.
     * April, June, September and November have 30 days.
     * All other months have 31 days.
     *
     * @return {number} the maximum length of this month in days, from 29 to 31
     */
    maxLength() {
        switch (this) {
            case Month.FEBRUARY:
                return 29;
            case Month.APRIL:
            case Month.JUNE:
            case Month.SEPTEMBER:
            case Month.NOVEMBER:
                return 30;
            default:
                return 31;
        }
    }

    /**
     * Gets the day-of-year corresponding to the first day of this month.
     *
     * This returns the day-of-year that this month begins on, using the leap
     * year flag to determine the length of February.
     *
     * @param {boolean} leapYear - true if the length is required for a leap year
     * @return {number} the day of year corresponding to the first day of this month, from 1 to 336
     */
    firstDayOfYear(leapYear) {
        const leap = leapYear ? 1 : 0;
        switch (this) {
            case Month.JANUARY:
                return 1;
            case Month.FEBRUARY:
                return 32;
            case Month.MARCH:
                return 60 + leap;
            case Month.APRIL:
                return 91 + leap;
            case Month.MAY:
                return 121 + leap;
            case Month.JUNE:
                return 152 + leap;
            case Month.JULY:
                return 182 + leap;
            case Month.AUGUST:
                return 213 + leap;
            case Month.SEPTEMBER:
                return 244 + leap;
            case Month.OCTOBER:
                return 274 + leap;
            case Month.NOVEMBER:
                return 305 + leap;
            case Month.DECEMBER:
            default:
                return 335 + leap;
        }
    }

    /**
     * Gets the month corresponding to the first month of this quarter.
     *
     * The year can be divided into four quarters.
     * This method returns the first month of the quarter for the base month.
     * January, February and March return January.
     * April, May and June return April.
     * July, August and September return July.
     * October, November and December return October.
     *
     * @return {Month} the first month of the quarter corresponding to this month, not null
     */
    firstMonthOfQuarter() {
        switch (this) {
            case Month.JANUARY:
            case Month.FEBRUARY:
            case Month.MARCH:
                return Month.JANUARY;
            case Month.APRIL:
            case Month.MAY:
            case Month.JUNE:
                return Month.APRIL;
            case Month.JULY:
            case Month.AUGUST:
            case Month.SEPTEMBER:
                return Month.JULY;
            case Month.OCTOBER:
            case Month.NOVEMBER:
            case Month.DECEMBER:
            default:
                return Month.OCTOBER;
        }
    }

    /**
     * Queries this month-of-year using the specified query.
     *
     * This queries this month-of-year using the specified query strategy object.
     * The {@link TemporalQuery} object defines the logic to be used to
     * obtain the result. Read the documentation of the query to understand
     * what the result of this method will be.
     *
     * The result of this method is obtained by invoking the
     * {@link TemporalQuery#queryFrom} method on the
     * specified query passing `this` as the argument.
     *
     * @param {TemporalQuery} query - the query to invoke, not null
     * @return {*} the query result, null may be returned (defined by the query)
     * @throws DateTimeException if unable to query (defined by the query)
     * @throws ArithmeticException if numeric overflow occurs (defined by the query)
     */
    query(query) {
        assert(query != null, 'query() parameter must not be null', DateTimeException);
        if (query === TemporalQueries.chronology()) {
            return IsoChronology.INSTANCE;
        } else if (query === TemporalQueries.precision()) {
            return ChronoUnit.MONTHS;
        }
        return super.query(query);
    }



    /**
     * toString implementation... in JDK this is inherited from the Enum class
     *
     * @return {String}
     */
    toString() {
        switch (this) {
            case Month.JANUARY:
                return 'JANUARY';
            case Month.FEBRUARY:
                return 'FEBRUARY';
            case Month.MARCH:
                return 'MARCH';
            case Month.APRIL:
                return 'APRIL';
            case Month.MAY:
                return 'MAY';
            case Month.JUNE:
                return 'JUNE';
            case Month.JULY:
                return 'JULY';
            case Month.AUGUST:
                return 'AUGUST';
            case Month.SEPTEMBER:
                return 'SEPTEMBER';
            case Month.OCTOBER:
                return 'OCTOBER';
            case Month.NOVEMBER:
                return 'NOVEMBER';
            case Month.DECEMBER:
                return 'DECEMBER';
            default:
                return `unknown Month, value: ${this.value()}`;
        }
    }

    /**
     * toJSON() use by JSON.stringify
     * delegates to toString()
     *
     * @return {string}
     */
    toJSON() {
        return this.toString();
    }

    /**
     * Adjusts the specified temporal object to have this month-of-year.
     *
     * This returns a temporal object of the same observable type as the input
     * with the month-of-year changed to be the same as this.
     *
     * The adjustment is equivalent to using {@link Temporal#with}
     * passing {@link ChronoField#MONTH_OF_YEAR} as the field.
     * If the specified temporal object does not use the ISO calendar system then
     * a {@link DateTimeException} is thrown.
     *
     * In most cases, it is clearer to reverse the calling pattern by using
     * {@link Temporal#with}:
     * <pre>
     *   // these two lines are equivalent, but the second approach is recommended
     *   temporal = thisMonth.adjustInto(temporal);
     *   temporal = temporal.with(thisMonth);
     * </pre>
     *
     * For example, given a date in May, the following are output:
     * <pre>
     *   dateInMay.with(JANUARY);    // four months earlier
     *   dateInMay.with(APRIL);      // one months earlier
     *   dateInMay.with(MAY);        // same date
     *   dateInMay.with(JUNE);       // one month later
     *   dateInMay.with(DECEMBER);   // seven months later
     * </pre>
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Temporal} temporal - the target object to be adjusted, not null
     * @return {Temporal} the adjusted object, not null
     * @throws DateTimeException if unable to make the adjustment
     * @throws ArithmeticException if numeric overflow occurs
     */
    adjustInto(temporal) {
        /* we support only ISO for now
            if (Chronology.from(temporal).equals(IsoChronology.INSTANCE) === false) {
                throw new DateTimeException('Adjustment only supported on ISO date-time');
            }
        */
        return temporal.with(ChronoField.MONTH_OF_YEAR, this.value());
    }
    
    /**
     * Compares this Month to another Month.
     *
     * The comparison is based on the value of the Month.
     * It is "consistent with equals", as defined by {@link Comparable}.
     *
     * @param {Month} other  the other year to compare to, not null
     * @return {number} the comparator value, negative if less, positive if greater
     */    
    compareTo(other) {
        requireNonNull(other, 'other');
        requireInstance(other, Month, 'other');
        return this._value - other._value;
    }    
    
    /**
     *
     * @returns {boolean}
     */
    equals(other){    
        return this === other;
    }

    /**
     *
     * @param {string} name
     * @returns {Month}
     */
    static valueOf(name) {
        let ordinal = 0;
        for(ordinal; ordinal < MONTHS.length; ordinal++){
            if(MONTHS[ordinal].name() === name){
                break;
            }
        }
        return Month.of(ordinal+1);
    }
    

    /**
     * replacement for enum values
     * @return {Month[]}
     */
    static values(){
        return MONTHS.slice();
    }

    /**
     *
     * @param {number} month
     * @return {Month} not null
     **/
    static of(month) {
        if (month < 1 || month > 12) {
            assert(false, `Invalid value for MonthOfYear: ${month}`, DateTimeException);
        }
        return MONTHS[month-1];
    }

    /**
     * Obtains an instance of {@link Month} from a temporal object.
     *
     * This obtains a month based on the specified temporal.
     * A {@link TemporalAccessor} represents an arbitrary set of date and time information,
     * which this factory converts to an instance of {@link Month}.
     *
     * The conversion extracts the MONTH_OF_YEAR (see {@link ChronoField#MONTH_OF_YEAR}) field.
     * The extraction is only permitted if the temporal object has an ISO
     * chronology, or can be converted to a {@link LocalDate}.
     *
     * This method matches the signature of the functional interface {@link TemporalQuery}
     * allowing it to be used in queries via method reference, {@link Month::from}.
     *
     * @param {TemporalAccessor} temporal  the temporal object to convert, not null
     * @return {Month} the month-of-year, not null
     * @throws DateTimeException if unable to convert to a {@link Month}
     */
    static from(temporal) {
        if (temporal instanceof Month) {
            return temporal;
        }
        try {
            /* only ISO for now
            if (IsoChronology.INSTANCE.equals(Chronology.from(temporal)) == false) {
                temporal = LocalDate.from(temporal);
            }*/
            return Month.of(temporal.get(ChronoField.MONTH_OF_YEAR));
        } catch (ex) {
            throw new DateTimeException(`Unable to obtain Month from TemporalAccessor: ${ 
                temporal} of type ${temporal && temporal.constructor != null ? temporal.constructor.name : ''}`, ex);
        }
    }
}

let MONTHS;

export function _init() {
    Month.JANUARY = new Month(1, 'JANUARY');
    Month.FEBRUARY = new Month(2, 'FEBRUARY');
    Month.MARCH = new Month(3, 'MARCH');
    Month.APRIL = new Month(4, 'APRIL');
    Month.MAY = new Month(5, 'MAY');
    Month.JUNE = new Month(6, 'JUNE');
    Month.JULY = new Month(7, 'JULY');
    Month.AUGUST = new Month(8, 'AUGUST');
    Month.SEPTEMBER = new Month(9, 'SEPTEMBER');
    Month.OCTOBER = new Month(10, 'OCTOBER');
    Month.NOVEMBER = new Month(11, 'NOVEMBER');
    Month.DECEMBER = new Month(12, 'DECEMBER');

    MONTHS = [
        Month.JANUARY, Month.FEBRUARY, Month.MARCH, Month.APRIL, Month.MAY, Month.JUNE,
        Month.JULY, Month.AUGUST, Month.SEPTEMBER, Month.OCTOBER, Month.NOVEMBER, Month.DECEMBER
    ];
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE.md in the root directory of this source tree)
 */

import { requireNonNull, requireInstance } from './assert';
import { DateTimeException, UnsupportedTemporalTypeException } from './errors';
import { MathUtil } from './MathUtil';

import { ChronoField } from './temporal/ChronoField';
import { Clock } from './Clock';
import { DateTimeFormatter } from './format/DateTimeFormatter';
import { DateTimeFormatterBuilder } from './format/DateTimeFormatterBuilder';
import { IsoChronology } from './chrono/IsoChronology';
import { LocalDate } from './LocalDate';
import { Month } from './Month';
import { TemporalAccessor } from './temporal/TemporalAccessor';
import { TemporalQuery, createTemporalQuery } from './temporal/TemporalQuery';
import { TemporalQueries } from './temporal/TemporalQueries';
import { ValueRange } from './temporal/ValueRange';
import { Year } from './Year';
import { ZoneId } from './ZoneId';

/**
 * A month-day in the ISO-8601 calendar system, such as `--12-03`.
 *
 * {@link MonthDay} is an immutable date-time object that represents the combination
 * of a year and month. Any field that can be derived from a month and day, such as
 * quarter-of-year, can be obtained.
 *
 * This class does not store or represent a year, time or time-zone.
 * For example, the value "December 3rd" can be stored in a {@link MonthDay}.
 *
 * Since a {@link MonthDay} does not possess a year, the leap day of
 * February 29th is considered valid.
 *
 * This class implements {@link TemporalAccessor} rather than {@link Temporal}.
 * This is because it is not possible to define whether February 29th is valid or not
 * without external information, preventing the implementation of plus/minus.
 * Related to this, {@link MonthDay} only provides access to query and set the fields
 * {@link MONTH_OF_YEAR} and {@link DAY_OF_MONTH}.
 *
 * The ISO-8601 calendar system is the modern civil calendar system used today
 * in most of the world. It is equivalent to the proleptic Gregorian calendar
 * system, in which today's rules for leap years are applied for all time.
 * For most applications written today, the ISO-8601 rules are entirely suitable.
 * However, any application that makes use of historical dates, and requires them
 * to be accurate will find the ISO-8601 approach unsuitable.
 *
 * ### Specification for implementors
 *
 * This class is immutable and thread-safe.
 */
export class MonthDay extends TemporalAccessor {
    /**
     * function overloading for {@link MonthDay.now}
     *
     * if called with 0 argument {@link MonthDay.now0} is executed,
     *
     * if called with 1 argument and first argument is an instance of ZoneId, then {@link MonthDay.nowZoneId} is executed,
     *
     * otherwise {@link MonthDay.nowClock} is executed
     *
     * @param {?(ZoneId|Clock)} zoneIdOrClock
     * @returns {MonthDay}
     */
    static now(zoneIdOrClock) {
        if (arguments.length === 0) {
            return MonthDay.now0();
        } else if (arguments.length === 1 && zoneIdOrClock instanceof ZoneId) {
            return MonthDay.nowZoneId(zoneIdOrClock);
        } else {
            return MonthDay.nowClock(zoneIdOrClock);
        }
    }
    /**
     * Obtains the current month-day from the system clock in the default time-zone.
     *
     * This will query the system clock (see {@link Clock#systemDefaultZone}) in the default
     * time-zone to obtain the current month-day.
     *
     * Using this method will prevent the ability to use an alternate clock for testing
     * because the clock is hard-coded.
     *
     * @return {MonthDay} the current month-day using the system clock and default time-zone, not null
     */
    static now0() {
        return this.nowClock(Clock.systemDefaultZone());
    }

    /**
     * Obtains the current month-day from the system clock in the specified time-zone.
     *
     * This will query the system clock (see {@link Clock#system}) to obtain the current month-day.
     * Specifying the time-zone avoids dependence on the default time-zone.
     *
     * Using this method will prevent the ability to use an alternate clock for testing
     * because the clock is hard-coded.
     *
     * @param {ZoneId} zone  the zone ID to use, not null
     * @return {MonthDay} the current month-day using the system clock, not null
     */
    static nowZoneId(zone) {
        requireNonNull(zone, 'zone');
        return this.nowClock(Clock.system(zone));
    }

    /**
     * Obtains the current month-day from the specified clock.
     *
     * This will query the specified clock to obtain the current month-day.
     * Using this method allows the use of an alternate clock for testing.
     * The alternate clock may be introduced using dependency injection (see {@link Clock}).
     *
     * @param {Clock} clock  the clock to use, not null
     * @return {MonthDay} the current month-day, not null
     */
    static nowClock(clock) {
        requireNonNull(clock, 'clock');
        const now = LocalDate.now(clock);  // called once
        return MonthDay.of(now.month(), now.dayOfMonth());
    }
    //-----------------------------------------------------------------------
    /**
     * function overloading for {@link MonthDay.of}
     *
     * if called with 2 argument and first argument is an instance of Month, then {@link MonthDay.ofMonthNumber} is executed,
     *
     * otherwise {@link MonthDay.ofNumberNumber} is executed
     *
     * @param {!(Month|number)} monthOrNumber
     * @param {?number} number
     * @returns {MonthDay}
     */
    static of(monthOrNumber, number) {
        if (arguments.length === 2 && monthOrNumber instanceof Month) {
            return MonthDay.ofMonthNumber(monthOrNumber, number);
        } else {
            return MonthDay.ofNumberNumber(monthOrNumber, number);
        }
    }
    /**
     * Obtains an instance of {@link MonthDay}.
     *
     * The day-of-month must be valid for the month within a leap year.
     * Hence, for February, day 29 is valid.
     *
     * For example, passing in April and day 31 will throw an exception, as
     * there can never be April 31st in any year. By contrast, passing in
     * February 29th is permitted, as that month-day can sometimes be valid.
     *
     * @param {Month} month  the month-of-year to represent, not null
     * @param {number} dayOfMonth  the day-of-month to represent, from 1 to 31
     * @return {MonthDay} the month-day, not null
     * @throws DateTimeException if the value of any field is out of range
     * @throws DateTimeException if the day-of-month is invalid for the month
     */
    static ofMonthNumber(month, dayOfMonth) {
        requireNonNull(month, 'month');
        ChronoField.DAY_OF_MONTH.checkValidValue(dayOfMonth);
        if (dayOfMonth > month.maxLength()) {
            throw new DateTimeException(`Illegal value for DayOfMonth field, value ${dayOfMonth 
            } is not valid for month ${month.toString()}`);
        }
        return new MonthDay(month.value(), dayOfMonth);
    }

    /**
     * Obtains an instance of {@link MonthDay}.
     *
     * The day-of-month must be valid for the month within a leap year.
     * Hence, for month 2 (February), day 29 is valid.
     *
     * For example, passing in month 4 (April) and day 31 will throw an exception, as
     * there can never be April 31st in any year. By contrast, passing in
     * February 29th is permitted, as that month-day can sometimes be valid.
     *
     * @param {number} month  the month-of-year to represent, from 1 (January) to 12 (December)
     * @param {number} dayOfMonth  the day-of-month to represent, from 1 to 31
     * @return {MonthDay} the month-day, not null
     * @throws DateTimeException if the value of any field is out of range
     * @throws DateTimeException if the day-of-month is invalid for the month
     */
    static ofNumberNumber(month, dayOfMonth) {
        requireNonNull(month, 'month');
        requireNonNull(dayOfMonth, 'dayOfMonth');
        return MonthDay.of(Month.of(month), dayOfMonth);
    }
    //-----------------------------------------------------------------------
    /**
     * Obtains an instance of {@link MonthDay} from a temporal object.
     *
     * A {@link TemporalAccessor} represents some form of date and time information.
     * This factory converts the arbitrary temporal object to an instance of {@link MonthDay}.
     *
     * The conversion extracts the MONTH_OF_YEAR (see {@link ChronoField#MONTH_OF_YEAR}) and
     * DAY_OF_MONTH (see {@link ChronoField#DAY_OF_MONTH}) fields.
     * The extraction is only permitted if the date-time has an ISO chronology.
     *
     * This method matches the signature of the functional interface {@link TemporalQuery}
     * allowing it to be used in queries via method reference, {@link MonthDay::from}.
     *
     * @param {TemporalAccessor} temporal  the temporal object to convert, not null
     * @return {MonthDay} the month-day, not null
     * @throws DateTimeException if unable to convert to a {@link MonthDay}
     */
    static from(temporal) {
        requireNonNull(temporal, 'temporal');
        requireInstance(temporal, TemporalAccessor, 'temporal');
        if (temporal instanceof MonthDay) {
            return temporal;
        }
        try {
            /* TODO: only IsoChronology for now
            if (IsoChronology.INSTANCE.equals(Chronology.from(temporal)) == false) {
                temporal = LocalDate.from(temporal);
            }*/
            return MonthDay.of(temporal.get(ChronoField.MONTH_OF_YEAR), temporal.get(ChronoField.DAY_OF_MONTH));
        } catch (ex) {
            throw new DateTimeException(`Unable to obtain MonthDay from TemporalAccessor: ${ 
                temporal}, type ${temporal && temporal.constructor != null ? temporal.constructor.name : ''}`);
        }
    }
    //-----------------------------------------------------------------------
    /**
     * function overloading for {@link MonthDay.parse}
     *
     * if called with 1 argument, then {@link MonthDay.parseString} is executed,
     *
     * otherwise {@link MonthDay.parseStringFormatter} is executed
     *
     * @param {!(String)} text
     * @param {?DateTimeFormatter} formatter
     * @returns {MonthDay}
     */
    static parse(text, formatter) {
        if (arguments.length === 1) {
            return MonthDay.parseString(text);
        } else {
            return MonthDay.parseStringFormatter(text, formatter);
        }
    }

    /**
     * Obtains an instance of {@link MonthDay} from a text string such as `--12-03`.
     *
     * The string must represent a valid month-day.
     * The format is `--MM-dd`.
     *
     * @param {String} text  the text to parse such as "--12-03", not null
     * @return {MonthDay} the parsed month-day, not null
     * @throws DateTimeParseException if the text cannot be parsed
     */
    static parseString(text) {
        return MonthDay.parseStringFormatter(text, PARSER);
    }

    /**
     * Obtains an instance of {@link MonthDay} from a text string using a specific formatter.
     *
     * The text is parsed using the formatter, returning a month-day.
     *
     * @param {String} text  the text to parse, not null
     * @param {DateTimeFormatter} formatter  the formatter to use, not null
     * @return {MonthDay} the parsed month-day, not null
     * @throws DateTimeParseException if the text cannot be parsed
     */
    static parseStringFormatter(text, formatter) {
        requireNonNull(text, 'text');
        requireNonNull(formatter, 'formatter');
        requireInstance(formatter, DateTimeFormatter, 'formatter');
        return formatter.parse(text, MonthDay.FROM);
    }

    //-----------------------------------------------------------------------
    /**
     * Constructor, previously validated.
     *
     * @param {number} month  the month-of-year to represent, validated from 1 to 12
     * @param {number} dayOfMonth  the day-of-month to represent, validated from 1 to 29-31
     * @private
     */
    constructor(month, dayOfMonth) {
        super();
        this._month = MathUtil.safeToInt(month);
        this._day = MathUtil.safeToInt(dayOfMonth);
    }

    //-----------------------------------------------------------------------
    /**
     * Gets the month-of-year field from 1 to 12.
     *
     * This method returns the month as an `int` from 1 to 12.
     * Application code is frequently clearer if the enum {@link Month}
     * is used by calling {@link getMonth}.
     *
     * @return {number} the month-of-year, from 1 to 12
     * @see #month()
     */
    monthValue() {
        return this._month;
    }

    /**
     * Gets the month-of-year field using the {@link Month} enum.
     *
     * This method returns the enum {@link Month} for the month.
     * This avoids confusion as to what `int` values mean.
     * If you need access to the primitive `int` value then the enum
     * provides the int value (see {@link Month#getValue}).
     *
     * @return {Month} the month-of-year, not null
     * @see #getMonthValue()
     */
    month() {
        return Month.of(this._month);
    }

    /**
     * Gets the day-of-month field.
     *
     * This method returns the primitive `int` value for the day-of-month.
     *
     * @return {number} the day-of-month, from 1 to 31
     */
    dayOfMonth() {
        return this._day;
    }

    //-----------------------------------------------------------------------
    /**
     * Checks if the specified field is supported.
     *
     * This checks if this month-day can be queried for the specified field.
     * If false, then calling the range (see {@link range}) and
     * get (see {@link get}) methods will throw an exception.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields (see {@link isSupported}) will return valid
     * values based on this date-time.
     * The supported fields are:
     *
     * * {@link MONTH_OF_YEAR}
     * * {@link YEAR}
     *
     * All other {@link ChronoField} instances will return false.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.isSupportedBy}
     * passing `this` as the argument.
     * Whether the field is supported is determined by the field.
     *
     * @param {TemporalField} field  the field to check, null returns false
     * @return {boolean} true if the field is supported on this month-day, false if not
     */
    isSupported(field) {
        if (field instanceof ChronoField) {
            return field === ChronoField.MONTH_OF_YEAR || field === ChronoField.DAY_OF_MONTH;
        }
        return field != null && field.isSupportedBy(this);
    }

    /**
     * Gets the range of valid values for the specified field.
     *
     * The range object expresses the minimum and maximum valid values for a field.
     * This month-day is used to enhance the accuracy of the returned range.
     * If it is not possible to return the range, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields (see {@link isSupported}) will return
     * appropriate range instances.
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.rangeRefinedBy}
     * passing `this` as the argument.
     * Whether the range can be obtained is determined by the field.
     *
     * @param {TemporalField} field  the field to query the range for, not null
     * @return {ValueRange} the range of valid values for the field, not null
     * @throws DateTimeException if the range for the field cannot be obtained
     */
    range(field) {
        if (field === ChronoField.MONTH_OF_YEAR) {
            return field.range();
        } else if (field === ChronoField.DAY_OF_MONTH) {
            return ValueRange.of(1, this.month().minLength(), this.month().maxLength());
        }
        return super.range(field);
    }

    /**
     * Gets the value of the specified field from this month-day as an `int`.
     *
     * This queries this month-day for the value for the specified field.
     * The returned value will always be within the valid range of values for the field.
     * If it is not possible to return the value, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields (see {@link isSupported}) will return valid
     * values based on this month-day.
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.getFrom}
     * passing `this` as the argument. Whether the value can be obtained,
     * and what the value represents, is determined by the field.
     *
     * @param {TemporalField} field  the field to get, not null
     * @return {number} the value for the field
     * @throws DateTimeException if a value for the field cannot be obtained
     * @throws ArithmeticException if numeric overflow occurs
     */
    get(field) {
        return this.range(field).checkValidIntValue(this.getLong(field), field);
    }

    /**
     * Gets the value of the specified field from this month-day as a `long`.
     *
     * This queries this month-day for the value for the specified field.
     * If it is not possible to return the value, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields (see {@link isSupported}) will return valid
     * values based on this month-day.
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.getFrom}
     * passing `this` as the argument. Whether the value can be obtained,
     * and what the value represents, is determined by the field.
     *
     * @param {TemporalField} field  the field to get, not null
     * @return {number} the value for the field
     * @throws DateTimeException if a value for the field cannot be obtained
     * @throws ArithmeticException if numeric overflow occurs
     */
    getLong(field) {
        requireNonNull(field, 'field');
        if (field instanceof ChronoField) {
            switch (field) {
                // alignedDOW and alignedWOM not supported because they cannot be set in with()
                case ChronoField.DAY_OF_MONTH: return this._day;
                case ChronoField.MONTH_OF_YEAR: return this._month;
            }
            throw new UnsupportedTemporalTypeException(`Unsupported field: ${field}`);
        }
        return field.getFrom(this);
    }
    //-----------------------------------------------------------------------
    /**
     * Checks if the year is valid for this month-day.
     *
     * This method checks whether this month and day and the input year form
     * a valid date. This can only return false for February 29th.
     *
     * @param {number} year  the year to validate, an out of range value returns false
     * @return {boolean} true if the year is valid for this month-day
     * @see Year#isValidMonthDay(MonthDay)
     */
    isValidYear(year) {
        return (this._day === 29 && this._month === 2 && Year.isLeap(year) === false) === false;
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this {@link MonthDay} with the month-of-year altered.
     *
     * This returns a month-day with the specified month.
     * If the day-of-month is invalid for the specified month, the day will
     * be adjusted to the last valid day-of-month.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} month  the month-of-year to set in the returned month-day, from 1 (January) to 12 (December)
     * @return {MonthDay} based on this month-day with the requested month, not null
     * @throws DateTimeException if the month-of-year value is invalid
     */
    withMonth(month) {
        return this.with(Month.of(month));
    }

    /**
    * Returns a copy of this {@link MonthDay} with the month-of-year altered.
    *
    * This returns a month-day with the specified month.
    * If the day-of-month is invalid for the specified month, the day will
    * be adjusted to the last valid day-of-month.
    *
    * This instance is immutable and unaffected by this method call.
    *
    * @param {Month} month  the month-of-year to set in the returned month-day, not null
    * @return {MonthDay} based on this month-day with the requested month, not null
    */
    with(month) {
        requireNonNull(month, 'month');
        if (month.value() === this._month) {
            return this;
        }
        const day = Math.min(this._day, month.maxLength());
        return new MonthDay(month.value(), day);
    }

    /**
     * Returns a copy of this {@link MonthDay} with the day-of-month altered.
     *
     * This returns a month-day with the specified day-of-month.
     * If the day-of-month is invalid for the month, an exception is thrown.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} dayOfMonth  the day-of-month to set in the return month-day, from 1 to 31
     * @return {MonthDay} based on this month-day with the requested day, not null
     * @throws DateTimeException if the day-of-month value is invalid
     * @throws DateTimeException if the day-of-month is invalid for the month
     */
    withDayOfMonth(dayOfMonth) {
        if (dayOfMonth === this._day) {
            return this;
        }
        return MonthDay.of(this._month, dayOfMonth);
    }

    //-----------------------------------------------------------------------
    /**
     * Queries this month-day using the specified query.
     *
     * This queries this month-day using the specified query strategy object.
     * The {@link TemporalQuery} object defines the logic to be used to
     * obtain the result. Read the documentation of the query to understand
     * what the result of this method will be.
     *
     * The result of this method is obtained by invoking the
     * {@link TemporalQuery#queryFrom} method on the
     * specified query passing `this` as the argument.
     *
     * @param {TemporalQuery} query  the query to invoke, not null
     * @return {*} the query result, null may be returned (defined by the query)
     * @throws DateTimeException if unable to query (defined by the query)
     * @throws ArithmeticException if numeric overflow occurs (defined by the query)
     */
    query(query) {
        requireNonNull(query, 'query');
        requireInstance(query, TemporalQuery, 'query');
        if (query === TemporalQueries.chronology()) {
            return IsoChronology.INSTANCE;
        }
        return super.query(query);
    }

    /**
     * Adjusts the specified temporal object to have this month-day.
     *
     * This returns a temporal object of the same observable type as the input
     * with the month and day-of-month changed to be the same as this.
     *
     * The adjustment is equivalent to using {@link Temporal#with}
     * twice, passing {@link ChronoField#MONTH_OF_YEAR} and
     * {@link ChronoField#DAY_OF_MONTH} as the fields.
     * If the specified temporal object does not use the ISO calendar system then
     * a {@link DateTimeException} is thrown.
     *
     * In most cases, it is clearer to reverse the calling pattern by using
     * {@link Temporal#with}:
     * <pre>
     *   // these two lines are equivalent, but the second approach is recommended
     *   temporal = thisMonthDay.adjustInto(temporal);
     *   temporal = temporal.with(thisMonthDay);
     * </pre>
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Temporal} temporal  the target object to be adjusted, not null
     * @return {Temporal} the adjusted object, not null
     * @throws DateTimeException if unable to make the adjustment
     * @throws ArithmeticException if numeric overflow occurs
     */
    adjustInto(temporal) {
        requireNonNull(temporal, 'temporal');
        /* TODO: only IsoChronology for now
        if (Chronology.from(temporal).equals(IsoChronology.INSTANCE) == false) {
            throw new DateTimeException("Adjustment only supported on ISO date-time");
        }*/
        temporal = temporal.with(ChronoField.MONTH_OF_YEAR, this._month);
        return temporal.with(ChronoField.DAY_OF_MONTH, Math.min(temporal.range(ChronoField.DAY_OF_MONTH).maximum(), this._day));
    }

    //-----------------------------------------------------------------------
    /**
     * Combines this month-day with a year to create a {@link LocalDate}.
     *
     * This returns a {@link LocalDate} formed from this month-day and the specified year.
     *
     * A month-day of February 29th will be adjusted to February 28th in the resulting
     * date if the year is not a leap year.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} year  the year to use, from MIN_YEAR to MAX_YEAR
     * @return {LocalDate} the local date formed from this month-day and the specified year, not null
     * @throws DateTimeException if the year is outside the valid range of years
     */
    atYear(year) {
        return LocalDate.of(year, this._month, this.isValidYear(year) ? this._day : 28);
    }
    //-----------------------------------------------------------------------
    /**
     * Compares this month-day to another month-day.
     *
     * The comparison is based first on value of the month, then on the value of the day.
     * It is "consistent with equals", as defined by {@link Comparable}.
     *
     * @param {MonthDay} other  the other month-day to compare to, not null
     * @return {number} the comparator value, negative if less, positive if greater
     */
    compareTo(other) {
        requireNonNull(other, 'other');
        requireInstance(other, MonthDay, 'other');
        let cmp = (this._month - other.monthValue());
        if (cmp === 0) {
            cmp = (this._day - other.dayOfMonth());
        }
        return cmp;
    }

    /**
     * Is this month-day after the specified month-day.
     *
     * @param {MonthDay} other  the other month-day to compare to, not null
     * @return {boolean} true if this is after the specified month-day
     */
    isAfter(other) {
        requireNonNull(other, 'other');
        requireInstance(other, MonthDay, 'other');
        return this.compareTo(other) > 0;
    }

    /**
     * Is this month-day before the specified month-day.
     *
     * @param {MonthDay} other  the other month-day to compare to, not null
     * @return {boolean} true if this point is before the specified month-day
     */
    isBefore(other) {
        requireNonNull(other, 'other');
        requireInstance(other, MonthDay, 'other');
        return this.compareTo(other) < 0;
    }


    //-----------------------------------------------------------------------
    /**
     * Checks if this month-day is equal to another month-day.
     *
     * The comparison is based on the time-line position of the month-day within a year.
     *
     * @param {*} obj  the object to check, null returns false
     * @return {boolean} true if this is equal to the other month-day
     */
    equals(obj) {
        if (this === obj) {
            return true;
        }
        if (obj instanceof MonthDay) {
            const other = obj;
            return this.monthValue() === other.monthValue() && this.dayOfMonth() === other.dayOfMonth();
        }
        return false;
    }
    //-----------------------------------------------------------------------
    /**
     * Outputs this month-day as a string, such as `--12-03`.
     *
     * The output will be in the format `--MM-dd`:
     *
     * @return {String} a string representation of this month-day, not null
     */
    toString() {
        return `--${
            this._month < 10 ? '0' : ''}${this._month
        }${this._day < 10 ? '-0' : '-'}${this._day}`;
    }

    /**
     * toJSON() use by JSON.stringify
     * delegates to toString()
     *
     * @return {string}
     */
    toJSON() {
        return this.toString();
    }

    /**
     * Outputs this month-day as a string using the formatter.
     *
     * This month-day will be passed to the formatter
     * print method (see {@link DateTimeFormatter#format}).
     *
     * @param {DateTimeFormatter} formatter  the formatter to use, not null
     * @return {String} the formatted month-day string, not null
     * @throws DateTimeException if an error occurs during printing
     */
    format(formatter) {
        requireNonNull(formatter, 'formatter');
        requireInstance(formatter, DateTimeFormatter, 'formatter');
        return formatter.format(this);
    }

}

let PARSER;

export function _init() {
    PARSER = new DateTimeFormatterBuilder()
        .appendLiteral('--')
        .appendValue(ChronoField.MONTH_OF_YEAR, 2)
        .appendLiteral('-')
        .appendValue(ChronoField.DAY_OF_MONTH, 2)
        .toFormatter();

    MonthDay.FROM = createTemporalQuery('MonthDay.FROM', (temporal) => {
        return MonthDay.from(temporal);
    });
}
/**
 * @copyright (c) 2016-present, Philipp Thürwächter & Pattrick Hüper  & js-joda contributors
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { ChronoField } from './temporal/ChronoField';
import { ChronoUnit } from './temporal/ChronoUnit';
import { Temporal } from './temporal/Temporal';
import { Clock } from './Clock';
import { DateTimeFormatter } from './format/DateTimeFormatter';
import { Instant } from './Instant';
import { IsoChronology } from './chrono/IsoChronology';
import { LocalDateTime } from './LocalDateTime';
import { LocalDate } from './LocalDate';
import { LocalTime } from './LocalTime';
import { MathUtil } from './MathUtil';
import { OffsetTime } from './OffsetTime';
import { TemporalQueries } from './temporal/TemporalQueries';
import { ZonedDateTime } from './ZonedDateTime';
import { ZoneId } from './ZoneId';
import { ZoneOffset } from './ZoneOffset';
import { DateTimeException, IllegalArgumentException } from './errors';

import { createTemporalQuery } from './temporal/TemporalQuery';
import { requireInstance, requireNonNull } from './assert';

/**
 * A date-time with an offset from UTC/Greenwich in the ISO-8601 calendar system,
 * such as 2007-12-23T10:15:30+01:00.
 */
export class OffsetDateTime extends Temporal {
    /**
     * @param {TemporaroAccessor} temporal
     * @return {OffsetDateTime}
     */
    static from(temporal) {
        requireNonNull(temporal, 'temporal');
        if (temporal instanceof OffsetDateTime) {
            return temporal;
        }
        try {
            const offset = ZoneOffset.from(temporal);
            try {
                const ldt = LocalDateTime.from(temporal);
                return OffsetDateTime.of(ldt, offset);
            } catch (_) {
                const instant = Instant.from(temporal);
                return OffsetDateTime.ofInstant(instant, offset);
            }
        } catch (ex) {
            throw new DateTimeException(`Unable to obtain OffsetDateTime TemporalAccessor: ${temporal}, type ${temporal.constructor != null ? temporal.constructor.name : ''}`);
        }
    }

    /**
     * @param {Clock|ZoneId|null} clockOrZone
     * @return {OffsetDateTime}
     */
    static now(clockOrZone) {
        if (arguments.length === 0) {
            return OffsetDateTime.now(Clock.systemDefaultZone());
        } else {
            requireNonNull(clockOrZone, 'clockOrZone');
            if (clockOrZone instanceof ZoneId) {
                return OffsetDateTime.now(Clock.system(clockOrZone));
            } else if (clockOrZone instanceof Clock) {
                const now = clockOrZone.instant(); // called once
                return OffsetDateTime.ofInstant(now, clockOrZone.zone().rules().offset(now));
            } else {
                throw new IllegalArgumentException('clockOrZone must be an instance of ZoneId or Clock');
            }
        }
    }

    /**
     * @return {OffsetDateTime}
     */
    static of() {
        if (arguments.length <= 2) {
            return OffsetDateTime.ofDateTime.apply(this, arguments);
        } else if (arguments.length === 3) {
            return OffsetDateTime.ofDateAndTime.apply(this, arguments);
        } else {
            return OffsetDateTime.ofNumbers.apply(this, arguments);
        }
    }

    static ofDateTime(dateTime, offset) {
        return new OffsetDateTime(dateTime, offset);
    }

    static ofDateAndTime(date, time, offset) {
        const dt = LocalDateTime.of(date, time);
        return new OffsetDateTime(dt, offset);
    }

    static ofNumbers(year, month, dayOfMonth, hour=0, minute=0, second=0, nanoOfSecond=0, offset) {
        const dt = LocalDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoOfSecond);
        return new OffsetDateTime(dt, offset);
    }

    /**
     * @param {Instant} instant
     * @param {ZoneId} zone
     * @return {OffsetDateTime}
     */
    static ofInstant(instant,  zone){
        requireNonNull(instant, 'instant');
        requireNonNull(zone, 'zone');
        const rules = zone.rules();
        const offset = rules.offset(instant);
        const ldt = LocalDateTime.ofEpochSecond(instant.epochSecond(), instant.nano(), offset);
        return new OffsetDateTime(ldt, offset);
    }

    /**
     * @param {string} text
     * @param {DateTimeFormatter|undefined} formatter
     * @return {OffsetTime}
     */
    static parse(text, formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME){
        requireNonNull(formatter, 'formatter');
        return formatter.parse(text, OffsetDateTime.FROM);
    }

    // TODO: Need java.util.Comparater interface.
    // static timeLineOrder() {
    //
    // }

    //-----------------------------------------------------------------------


    /**
     * @param {LocalDateTime} dateTime
     * @param {ZoneOffset} offset
     * @private
     */
    constructor(dateTime, offset) {
        super();
        requireNonNull(dateTime, 'dateTime');
        requireInstance(dateTime, LocalDateTime, 'dateTime');
        requireNonNull(offset, 'offset');
        requireInstance(offset, ZoneOffset, 'offset');
        this._dateTime = dateTime;
        this._offset = offset;
    }

    /**
     *
     * @param {Temporal} temporal
     * @return {Temporal}
     */
    adjustInto(temporal) {
        return temporal
            .with(ChronoField.EPOCH_DAY, this.toLocalDate().toEpochDay())
            .with(ChronoField.NANO_OF_DAY, this.toLocalTime().toNanoOfDay())
            .with(ChronoField.OFFSET_SECONDS, this.offset().totalSeconds());
    }

    until(endExclusive, unit) {
        let end = OffsetDateTime.from(endExclusive);
        if (unit instanceof ChronoUnit) {
            end = end.withOffsetSameInstant(this._offset);
            return this._dateTime.until(end._dateTime, unit);
        }
        return unit.between(this, end);
    }

    /**
     * @param {ZoneId} zone
     * @return {ZonedDateTime}
     */
    atZoneSameInstant(zone) {
        return ZonedDateTime.ofInstant(this._dateTime, this._offset, zone);
    }

    /**
     * @param {ZoneId} zone
     * @return {ZonedDateTime}
     */
    atZoneSimilarLocal(zone) {
        return ZonedDateTime.ofLocal(this._dateTime, zone, this._offset);
    }

    query(query) {
        requireNonNull(query, 'query');
        if (query === TemporalQueries.chronology()) {
            return IsoChronology.INSTANCE;
        } else if (query === TemporalQueries.precision()) {
            return ChronoUnit.NANOS;
        } else if (query === TemporalQueries.offset() || query === TemporalQueries.zone()) {
            return this.offset();
        } else if (query === TemporalQueries.localDate()) {
            return this.toLocalDate();
        } else if (query === TemporalQueries.localTime()) {
            return this.toLocalTime();
        } else if (query === TemporalQueries.zoneId()) {
            return null;
        }
        return super.query(query);
    }

    get(field) {
        if (field instanceof ChronoField) {
            switch (field) {
                case ChronoField.INSTANT_SECONDS: throw new DateTimeException(`Field too large for an int: ${field}`);
                case ChronoField.OFFSET_SECONDS: return this.offset().totalSeconds();
            }
            return this._dateTime.get(field);
        }
        return super.get(field);
    }

    getLong(field) {
        if (field instanceof ChronoField) {
            switch (field) {
                case ChronoField.INSTANT_SECONDS: return this.toEpochSecond();
                case ChronoField.OFFSET_SECONDS: return this.offset().totalSeconds();
            }
            return this._dateTime.getLong(field);
        }
        return field.getFrom(this);
    }

    /**
     * @return {ZoneOffset}
     */
    offset() {
        return this._offset;
    }

    /**
     * @return {number} the year, from MIN_YEAR to MAX_YEAR
     */
    year() {
        return this._dateTime.year();
    }

    /**
     * @return {number} the month-of-year, from 1 to 12
     * @see #month()
     */
    monthValue() {
        return this._dateTime.monthValue();
    }

    /**
     * @return {{number} }the month-of-year, not null
     * @see #monthValue()
     */
    month() {
        return this._dateTime.month();
    }

    /**
     * @return {number} the day-of-month, from 1 to 31
     */
    dayOfMonth() {
        return this._dateTime.dayOfMonth();
    }

    /**
     * @return {number} the day-of-year, from 1 to 365, or 366 in a leap year
     */
    dayOfYear() {
        return this._dateTime.dayOfYear();
    }

    /**
     * @return {number} the day-of-week, not null
     */
    dayOfWeek() {
        return this._dateTime.dayOfWeek();
    }

    /**
     * @return {number} the hour-of-day, from 0 to 23
     */
    hour() {
        return this._dateTime.hour();
    }

    /**
     * @return {number} the minute-of-hour, from 0 to 59
     */
    minute() {
        return this._dateTime.minute();
    }

    /**
     * @return {number} the second-of-minute, from 0 to 59
     */
    second() {
        return this._dateTime.second();
    }

    /**
     * @return {number} the nano-of-second, from 0 to 999,999,999
     */
    nano() {
        return this._dateTime.nano();
    }

    //-----------------------------------------------------------------------
    /**
     * @return {LocalDateTime}the local date-time part of this date-time, not null
     */
    toLocalDateTime() {
        return this._dateTime;
    }

    /**
     * @return {LocalDate} the date part of this date-time, not null
     */
    toLocalDate() {
        return this._dateTime.toLocalDate();
    }

    /**
     * @return {LocalTime} the time part of this date-time, not null
     */
    toLocalTime() {
        return this._dateTime.toLocalTime();
    }

    /**
     * @return {OffsetTime} an OffsetTime representing the time and offset, not null
     */
    toOffsetTime() {
        return OffsetTime.of(this._dateTime.toLocalTime(), this._offset);
    }

    /**
     * @return {ZonedDateTime}a zoned date-time representing the same local date-time and offset, not null
     */
    toZonedDateTime() {
        return ZonedDateTime.of(this._dateTime, this._offset);
    }

    /**
     * @return {Instant} an {@code Instant} representing the same instant, not null
     */
    toInstant() {
        return this._dateTime.toInstant(this._offset);
    }

    /**
     * @return {number} the number of seconds from the epoch of 1970-01-01T00:00:00Z
     */
    toEpochSecond() {
        return this._dateTime.toEpochSecond(this._offset);
    }

    isSupported(fieldOrUnit) {
        if (fieldOrUnit instanceof ChronoField) {
            return fieldOrUnit.isDateBased() || fieldOrUnit.isTimeBased();
        }
        if (fieldOrUnit instanceof ChronoUnit) {
            return fieldOrUnit.isDateBased() || fieldOrUnit.isTimeBased();
        }
        return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
    }

    range(field) {
        if (field instanceof ChronoField) {
            if (field === ChronoField.INSTANT_SECONDS || field === ChronoField.OFFSET_SECONDS) {
                return field.range();
            }
            return this._dateTime.range(field);
        }
        return field.rangeRefinedBy(this);
    }

    _withAdjuster(adjuster) {
        requireNonNull(adjuster);
        // optimizations
        if (adjuster instanceof LocalDate || adjuster instanceof LocalTime || adjuster instanceof LocalDateTime) {
            return this._withDateTimeOffset(this._dateTime.with(adjuster), this._offset);
        } else if (adjuster instanceof Instant) {
            return OffsetDateTime.ofInstant(adjuster, this._offset);
        } else if (adjuster instanceof ZoneOffset) {
            return this._withDateTimeOffset(this._dateTime, adjuster);
        } else if (adjuster instanceof OffsetDateTime) {
            return adjuster;
        }
        return adjuster.adjustInto(this);
    }

    _withField(field, newValue) {
        requireNonNull(field);
        if (field instanceof ChronoField) {
            const f = field;
            switch (f) {
                case ChronoField.INSTANT_SECONDS: return OffsetDateTime.ofInstant(Instant.ofEpochSecond(newValue, this.nano()), this._offset);
                case ChronoField.OFFSET_SECONDS: {
                    return this._withDateTimeOffset(this._dateTime, ZoneOffset.ofTotalSeconds(f.checkValidIntValue(newValue)));
                }
            }
            return this._withDateTimeOffset(this._dateTime.with(field, newValue), this._offset);
        }
        return field.adjustInto(this, newValue);
    }

    _withDateTimeOffset(dateTime, offset) {
        if (this._dateTime === dateTime && this._offset.equals(offset)) {
            return this;
        }
        return new OffsetDateTime(dateTime, offset);
    }

    /**
     * @param {int} year
     * @return {OffsetDateTime}
     */
    withYear(year) {
        return this._withDateTimeOffset(this._dateTime.withYear(year), this._offset);
    }

    /**
     * @param {int} month
     * @return {OffsetDateTime}
     */
    withMonth(month) {
        return this._withDateTimeOffset(this._dateTime.withMonth(month), this._offset);
    }

    /**
     * @param {int} dayOfMonth
     * @return {OffsetDateTime}
     */
    withDayOfMonth(dayOfMonth) {
        return this._withDateTimeOffset(this._dateTime.withDayOfMonth(dayOfMonth), this._offset);
    }

    /**
     * @param {int} dayOfYear
     * @return {OffsetDateTime}
     */
    withDayOfYear(dayOfYear) {
        return this._withDateTimeOffset(this._dateTime.withDayOfYear(dayOfYear), this._offset);
    }

    /**
     * @param {int} hour
     * @return {OffsetDateTime}
     */
    withHour(hour) {
        return this._withDateTimeOffset(this._dateTime.withHour(hour), this._offset);
    }

    /**
     * @param {int} minute
     * @return {OffsetDateTime}
     */
    withMinute(minute) {
        return this._withDateTimeOffset(this._dateTime.withMinute(minute), this._offset);
    }

    /**
     * @param {int} second
     * @return {OffsetDateTime}
     */
    withSecond(second) {
        return this._withDateTimeOffset(this._dateTime.withSecond(second), this._offset);
    }

    /**
     * @param {int} nanoOfSecond
     * @return {OffsetDateTime}
     */
    withNano(nanoOfSecond) {
        return this._withDateTimeOffset(this._dateTime.withNano(nanoOfSecond), this._offset);
    }

    /**
     * @param {ZoneOffset} offset
     * @return {OffsetDateTime}
     */
    withOffsetSameLocal(offset) {
        requireNonNull(offset, 'offset');
        return this._withDateTimeOffset(this._dateTime, offset);
    }

    /**
     * @param {ZoneOffset} offset
     * @return {OffsetDateTime}
     */
    withOffsetSameInstant(offset) {
        requireNonNull(offset, 'offset');
        if (offset.equals(this._offset)) {
            return this;
        }
        const difference = offset.totalSeconds() - this._offset.totalSeconds();
        const adjusted = this._dateTime.plusSeconds(difference);
        return new OffsetDateTime(adjusted, offset);
    }

    /**
     * @param {TemporalUnit} unit
     * @return {OffsetDateTime}
     */
    truncatedTo(unit) {
        return this._withDateTimeOffset(this._dateTime.truncatedTo(unit), this._offset);
    }

    _plusAmount(amount) {
        requireNonNull(amount, 'amount');
        return amount.addTo(this);
    }

    _plusUnit(amountToAdd, unit) {
        if (unit instanceof ChronoUnit) {
            return this._withDateTimeOffset(this._dateTime.plus(amountToAdd, unit), this._offset);
        }
        return unit.addTo(this, amountToAdd);
    }

    /**
     * @param {int} years
     * @return {OffsetTime}
     */
    plusYears(years) {
        return this._withDateTimeOffset(this._dateTime.plusYears(years), this._offset);
    }

    /**
     * @param {int} months
     * @return {OffsetTime}
     */
    plusMonths(months) {
        return this._withDateTimeOffset(this._dateTime.plusMonths(months), this._offset);
    }

    /**
     * @param {int} weeks
     * @return {OffsetTime}
     */
    plusWeeks(weeks) {
        return this._withDateTimeOffset(this._dateTime.plusWeeks(weeks), this._offset);
    }

    /**
     * @param {int} days
     * @return {OffsetTime}
     */
    plusDays(days) {
        return this._withDateTimeOffset(this._dateTime.plusDays(days), this._offset);
    }

    /**
     * @param {int} hours
     * @return {OffsetTime}
     */
    plusHours(hours) {
        return this._withDateTimeOffset(this._dateTime.plusHours(hours), this._offset);
    }

    /**
     * @param {int} minutes
     * @return {OffsetTime}
     */
    plusMinutes(minutes) {
        return this._withDateTimeOffset(this._dateTime.plusMinutes(minutes), this._offset);
    }

    /**
     * @param {int} seconds
     * @return {OffsetTime}
     */
    plusSeconds(seconds) {
        return this._withDateTimeOffset(this._dateTime.plusSeconds(seconds), this._offset);
    }

    /**
     * @param {int} nanos
     * @return {OffsetTime}
     */
    plusNanos(nanos) {
        return this._withDateTimeOffset(this._dateTime.plusNanos(nanos), this._offset);
    }

    _minusAmount(amount) {
        requireNonNull(amount);
        return amount.subtractFrom(this);
    }

    _minusUnit(amountToSubtract, unit) {
        return this.plus(-1 * amountToSubtract, unit);
    }

    /**
     * @param {int} years
     * @return {OffsetTime}
     */
    minusYears(years) {
        return this._withDateTimeOffset(this._dateTime.minusYears(years), this._offset);
    }

    /**
     * @param {int} months
     * @return {OffsetTime}
     */
    minusMonths(months) {
        return this._withDateTimeOffset(this._dateTime.minusMonths(months), this._offset);
    }

    /**
     * @param {int} weeks
     * @return {OffsetTime}
     */
    minusWeeks(weeks) {
        return this._withDateTimeOffset(this._dateTime.minusWeeks(weeks), this._offset);
    }

    /**
     * @param {int} days
     * @return {OffsetTime}
     */
    minusDays(days) {
        return this._withDateTimeOffset(this._dateTime.minusDays(days), this._offset);
    }

    /**
     * @param {int} hours
     * @return {OffsetTime}
     */
    minusHours(hours) {
        return this._withDateTimeOffset(this._dateTime.minusHours(hours), this._offset);
    }

    /**
     * @param {int} minutes
     * @return {OffsetTime}
     */
    minusMinutes(minutes) {
        return this._withDateTimeOffset(this._dateTime.minusMinutes(minutes), this._offset);
    }

    /**
     * @param {int} seconds
     * @return {OffsetTime}
     */
    minusSeconds(seconds) {
        return this._withDateTimeOffset(this._dateTime.minusSeconds(seconds), this._offset);
    }

    /**
     * @param {int} nanos
     * @return {OffsetTime}
     */
    minusNanos(nanos) {
        return this._withDateTimeOffset(this._dateTime.minusNanos(nanos), this._offset);
    }

    compareTo(other) {
        requireNonNull(other, 'other');
        requireInstance(other, OffsetDateTime, 'other');
        if (this.offset().equals(other.offset())) {
            return this.toLocalDateTime().compareTo(other.toLocalDateTime());
        }
        let cmp = MathUtil.compareNumbers(this.toEpochSecond(), other.toEpochSecond());
        if (cmp === 0) {
            cmp = this.toLocalTime().nano() - other.toLocalTime().nano();
            if (cmp === 0) {
                cmp = this.toLocalDateTime().compareTo(other.toLocalDateTime());
            }
        }
        return cmp;
    }

    /**
     * @param {OffsetDateTime} other
     * @return {boolean}
     */
    isAfter(other) {
        requireNonNull(other, 'other');
        const thisEpochSec = this.toEpochSecond();
        const otherEpochSec = other.toEpochSecond();
        return thisEpochSec > otherEpochSec || (thisEpochSec === otherEpochSec && this.toLocalTime().nano() > other.toLocalTime().nano());
    }

    /**
     * @param {OffsetDateTime} other
     * @return {boolean}
     */
    isBefore(other) {
        requireNonNull(other, 'other');
        const thisEpochSec = this.toEpochSecond();
        const otherEpochSec = other.toEpochSecond();
        return thisEpochSec < otherEpochSec || (thisEpochSec === otherEpochSec && this.toLocalTime().nano() < other.toLocalTime().nano());
    }

    /**
     * @param {OffsetDateTime} other
     * @return {boolean}
     */
    isEqual(other) {
        requireNonNull(other, 'other');
        return this.toEpochSecond() === other.toEpochSecond() && this.toLocalTime().nano() === other.toLocalTime().nano();
    }

    //-----------------------------------------------------------------------
    /**
     * @param other
     * @return {boolean}
     */
    equals(other) {
        if (this === other) {
            return true;
        }
        if (other instanceof OffsetDateTime) {
            return this._dateTime.equals(other._dateTime) && this._offset.equals(other._offset);
        }
        return false;
    }

    /**
     * @return {number}
     */
    hashCode() {
        return this._dateTime.hashCode() ^ this._offset.hashCode();
    }

    toString() {
        return this._dateTime.toString() + this._offset.toString();
    }

    /**
     *
     * @return {string} same as {@link LocalDateTime.toString}
     */
    toJSON() {
        return this.toString();
    }

    /**
     * @param {DateTimeFormatter} formatter
     * @return {string}
     */
    format(formatter) {
        requireNonNull(formatter, 'formatter');
        return formatter.format(this);
    }
}


export function _init() {
    OffsetDateTime.MIN = LocalDateTime.MIN.atOffset(ZoneOffset.MAX);

    OffsetDateTime.MAX = LocalDateTime.MAX.atOffset(ZoneOffset.MIN);

    OffsetDateTime.FROM = createTemporalQuery('OffsetDateTime.FROM', (temporal) => {
        return OffsetDateTime.from(temporal);
    });
}
/**
 * @copyright (c) 2016-present, Philipp Thürwächter & Pattrick Hüper  & js-joda contributors
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { ChronoField } from './temporal/ChronoField';
import { ChronoUnit } from './temporal/ChronoUnit';
import { Temporal } from './temporal/Temporal';
import { Clock } from './Clock';
import { DateTimeException, UnsupportedTemporalTypeException } from './errors';
import { DateTimeFormatter } from './format/DateTimeFormatter';
import { Instant, LocalTime } from './js-joda';
import { MathUtil } from './MathUtil';
import { OffsetDateTime } from './OffsetDateTime';
import { TemporalQueries } from './temporal/TemporalQueries';
import { ZoneId } from './ZoneId';
import { ZoneOffset } from './ZoneOffset';

import { createTemporalQuery } from './temporal/TemporalQuery';
import { requireInstance, requireNonNull } from './assert';

/**
 * A time with an offset from UTC/Greenwich in the ISO-8601 calendar system, such as 10:15:30+01:00.
 */
export class OffsetTime extends Temporal {
    /**
     * @param {!TemporalAccessor} temporal
     * @return {OffsetTime}
     */
    static from(temporal) {
        requireNonNull(temporal, 'temporal');
        if (temporal instanceof OffsetTime) {
            return temporal;
        } else if (temporal instanceof OffsetDateTime) {
            return temporal.toOffsetTime();
        }
        try {
            const time = LocalTime.from(temporal);
            const offset = ZoneOffset.from(temporal);
            return new OffsetTime(time, offset);
        } catch(ex) {
            throw new DateTimeException(`Unable to obtain OffsetTime TemporalAccessor: ${temporal}, type ${temporal.constructor != null ? temporal.constructor.name : ''}`);
        }
    }

    /**
     * @param {Clock|ZoneId} clockOrZone
     * @return {OffsetTime}
     */
    static now(clockOrZone) {
        if (arguments.length === 0){
            return OffsetTime._now(Clock.systemDefaultZone());
        } else if (clockOrZone instanceof Clock){
            return OffsetTime._now(clockOrZone);
        } else {
            return OffsetTime._now(Clock.system(clockOrZone));
        }
    }

    /**
     * @param {Clock} clock - the clock to use, defaults to Clock.systemDefaultZone()
     * @return {OffsetTime} the current offset date-time, not null
     */
    static _now(clock) {
        requireNonNull(clock, 'clock');
        const now = clock.instant();
        return OffsetTime.ofInstant(now, clock.zone().rules().offset(now));
    }

    /**
     * @return {OffsetTime}
     */
    static of(){
        if (arguments.length <= 2) {
            return OffsetTime.ofTimeAndOffset.apply(this, arguments);
        } else {
            return OffsetTime.ofNumbers.apply(this, arguments);
        }
    }

    /**
     * @param {int} hour
     * @param {int} minute
     * @param {int} second
     * @param {int} nanoOfSecond
     * @param {ZoneOffset} offset
     * @return {OffsetTime}
     */
    static ofNumbers(hour, minute, second, nanoOfSecond, offset) {
        const time = LocalTime.of(hour, minute, second, nanoOfSecond);
        return new OffsetTime(time, offset);
    }

    /**
     * @param {LocalTime} time
     * @param {ZoneOffset} offset
     * @return {OffsetTime}
     */
    static ofTimeAndOffset(time, offset) {
        return new OffsetTime(time, offset);
    }

    /**
     * @param {!Instant} instant
     * @param {!ZoneId} zone
     * @return {!OffsetTime}
     */
    static ofInstant( instant,  zone){
        requireNonNull(instant, 'instant');
        requireInstance(instant, Instant, 'instant');
        requireNonNull(zone, 'zone');
        requireInstance(zone, ZoneId, 'zone');

        const rules = zone.rules();
        const offset = rules.offset(instant);
        let secsOfDay = instant.epochSecond() % LocalTime.SECONDS_PER_DAY;
        secsOfDay = (secsOfDay + offset.totalSeconds()) % LocalTime.SECONDS_PER_DAY;
        if (secsOfDay < 0) {
            secsOfDay += LocalTime.SECONDS_PER_DAY;
        }
        const time = LocalTime.ofSecondOfDay(secsOfDay, instant.nano());
        return new OffsetTime(time, offset);
    }

    /**
     * @param {string} text
     * @param {DateTimeFormatter} formatter
     * @return {OffsetTime}
     */
    static parse(text, formatter= DateTimeFormatter.ISO_OFFSET_TIME) {
        requireNonNull(formatter, 'formatter');
        return formatter.parse(text, OffsetTime.FROM);
    }
    //-----------------------------------------------------------------------

    /**
     * @param {LocalTime} time
     * @param {ZoneOffset} offset
     * @private
     */
    constructor(time, offset) {
        super();
        requireNonNull(time, 'time');
        requireInstance(time, LocalTime, 'time');
        requireNonNull(offset, 'offset');
        requireInstance(offset, ZoneOffset, 'offset');
        this._time = time;
        this._offset = offset;
    }


    /**
     * @param {TemporalAdjuster} temporal - the target object to be adjusted, not null
     * @return {Temporal} the adjusted object, not null
     * @throws {DateTimeException} if unable to make the adjustment
     * @throws {ArithmeticException} if numeric overflow occurs
     */
    adjustInto(temporal) {
        return temporal
            .with(ChronoField.NANO_OF_DAY, this._time.toNanoOfDay())
            .with(ChronoField.OFFSET_SECONDS, this.offset().totalSeconds());
    }

    /**
     * @param {LocalDate} date - the date to combine with, not null
     * @return {OffsetDateTime} the offset date-time formed from this time and the specified date, not null
     */
    atDate(date) {
        return OffsetDateTime.of(date, this._time, this._offset);
    }

    /**
     * @param {DateTimeFormatter} formatter - the formatter to use, not null
     * @return {string} the formatted time string, not null
     * @throws {DateTimeException} if an error occurs during printing
     */
    format(formatter) {
        requireNonNull(formatter, 'formatter');
        return formatter.format(this, OffsetTime.FROM);
    }


    /**
     * @param {TemporalField} field - the field to get, not null
     * @return {number} the value for the field
     * @throws {DateTimeException} if a value for the field cannot be obtained
     * @throws {ArithmeticException} if numeric overflow occurs
     */
    get(field) {
        return super.get(field);
    }

    /**
     * @param {TemporalField} field - the field to get, not null
     * @return {number} the value for the field
     * @throws {DateTimeException} if a value for the field cannot be obtained
     * @trhows {UnsupportedTemporalTypeException}
     * @throws {ArithmeticException} if numeric overflow occurs
     */
    getLong(field) {
        if (field instanceof ChronoField) {
            if (field === ChronoField.OFFSET_SECONDS) {
                return this._offset.totalSeconds();
            }
            return this._time.getLong(field);
        }
        return field.getFrom(this);
    }

    /**
     * @return {int}
     */
    hour() {
        return this._time.hour();
    }

    /**
     * @return {int}
     */
    minute() {
        return this._time.minute();
    }

    /**
     * @return {int}
     */
    second() {
        return this._time.second();
    }

    /**
     * @return {int}
     */
    nano() {
        return this._time.nano();
    }

    /**
     * @return {ZoneOffset}
     */
    offset() {
        return this._offset;
    }

    /**
     * @param {OffsetTime} other - the other time to compare to, not null
     * @return {boolean} true if this is after the specified time
     * @throws {NullPointerException} if `other` is null
     */
    isAfter(other) {
        requireNonNull(other, 'other');
        return this._toEpochNano() > other._toEpochNano();
    }

    /**
     * @param {OffsetTime} other - the other time to compare to, not null
     * @return {boolean} true if this point is before the specified time
     * @throws {NullPointerException} if `other` is null
     */
    isBefore(other) {
        requireNonNull(other, 'other');
        return this._toEpochNano() < other._toEpochNano();
    }

    /**
     * @param {OffsetTime} other - the other time to compare to, not null
     * @return {boolean}
     * @throws {NullPointerException} if `other` is null
     */
    isEqual(other) {
        requireNonNull(other, 'other');
        return this._toEpochNano() === other._toEpochNano();
    }

    /**
     * @param {TemporalField|TemporalUnit} fieldOrUnit - the field to check, null returns false
     * @return {boolean} true if the field is supported on this time, false if not
     */
    isSupported(fieldOrUnit) {
        if (fieldOrUnit instanceof ChronoField) {
            return fieldOrUnit.isTimeBased() || fieldOrUnit === ChronoField.OFFSET_SECONDS;
        } else if (fieldOrUnit instanceof ChronoUnit) {
            return fieldOrUnit.isTimeBased();
        }
        return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
    }

    /**
     * @param {number} hours
     * @return {OffsetTime}
     */
    minusHours(hours) {
        return this._withLocalTimeOffset(this._time.minusHours(hours), this._offset);
    }

    /**
     * @param {number} minutes
     * @return {OffsetTime}
     */
    minusMinutes(minutes) {
        return this._withLocalTimeOffset(this._time.minusMinutes(minutes), this._offset);
    }

    /**
     * @param {number} seconds
     * @return {OffsetTime}
     */
    minusSeconds(seconds) {
        return this._withLocalTimeOffset(this._time.minusSeconds(seconds), this._offset);
    }

    /**
     * @param {number} nanos
     * @return {OffsetTime}
     */
    minusNanos(nanos) {
        return this._withLocalTimeOffset(this._time.minusNanos(nanos), this._offset);
    }

    _minusAmount(amount) {
        requireNonNull(amount);
        return amount.subtractFrom(this);
    }

    _minusUnit(amountToSubtract, unit) {
        return this.plus(-1 * amountToSubtract, unit);
    }

    _plusAmount(amount) {
        requireNonNull(amount);
        return amount.addTo(this);
    }

    /**
     *
     * @param amountToAdd
     * @param unit
     * @return {Temporal}
     */
    _plusUnit(amountToAdd, unit) {
        if (unit instanceof ChronoUnit) {
            return this._withLocalTimeOffset(this._time.plus(amountToAdd, unit), this._offset);
        }
        return unit.addTo(this, amountToAdd);
    }

    /**
     * @param {int} hours
     * @return {OffsetTime}
     */
    plusHours(hours) {
        return this._withLocalTimeOffset(this._time.plusHours(hours), this._offset);
    }

    /**
     * @param {int} minutes
     * @return {OffsetTime}
     */
    plusMinutes(minutes) {
        return this._withLocalTimeOffset(this._time.plusMinutes(minutes), this._offset);
    }

    /**
     * @param {int} seconds
     * @return {OffsetTime}
     */
    plusSeconds(seconds) {
        return this._withLocalTimeOffset(this._time.plusSeconds(seconds), this._offset);
    }

    /**
     * @param {int} nanos
     * @return {OffsetTime}
     */
    plusNanos(nanos) {
        return this._withLocalTimeOffset(this._time.plusNanos(nanos), this._offset);
    }

    /**
     * @param {TemporalQuery} query - the query to invoke, not null
     * @return {*} the query result, null may be returned (defined by the query)
     * @throws {DateTimeException} if unable to query (defined by the query)
     * @throws {ArithmeticException} if numeric overflow occurs (defined by the query)
     */
    query(query) {
        requireNonNull(query, 'query');
        if (query === TemporalQueries.precision()) {
            return ChronoUnit.NANOS;
        } else if (query === TemporalQueries.offset() || query === TemporalQueries.zone()) {
            return this.offset();
        } else if (query === TemporalQueries.localTime()) {
            return this._time;
        } else if (query === TemporalQueries.chronology() || query === TemporalQueries.localDate() || query === TemporalQueries.zoneId()) {
            return null;
        }
        return super.query(query);
    }

    /**
     * @param {TemporalField} field - the field to query the range for, not null
     * @return {ValueRange} the range of valid values for the field, not null
     * @throws {DateTimeException} if the range for the field cannot be obtained
     */
    range(field) {
        if (field instanceof ChronoField) {
            if (field === ChronoField.OFFSET_SECONDS) {
                return field.range();
            }
            return this._time.range(field);
        }
        return field.rangeRefinedBy(this);
    }

    /**
     * @return {LocalTime}
     */
    toLocalTime() {
        return this._time;
    }

    /**
     * @param {TemporalUnit} unit - the unit to truncate to, not null
     * @return {OffsetTime} a {@link LocalTime} based on this time with the time truncated, not null
     * @throws {DateTimeException} if unable to truncate
     */
    truncatedTo(unit) {
        return this._withLocalTimeOffset(this._time.truncatedTo(unit), this._offset);
    }

    /**
    * @param {Temporal} endExclusive - the end time, which is converted to a {@link LocalTime}, not null
    * @param {TemporalUnit} unit - the unit to measure the period in, not null
    * @return {number} the amount of the period between this time and the end time
    * @throws {DateTimeException} if the period cannot be calculated
    * @throws {ArithmeticException} if numeric overflow occurs
    */
    until(endExclusive, unit) {
        requireNonNull(endExclusive, 'endExclusive');
        requireNonNull(unit, 'unit');
        const end = OffsetTime.from(endExclusive);
        if (unit instanceof ChronoUnit) {
            const nanosUntil = end._toEpochNano() - this._toEpochNano(); // no overflow
            switch (unit) {
                case ChronoUnit.NANOS: return nanosUntil;
                case ChronoUnit.MICROS: return Math.floor(nanosUntil / 1000);
                case ChronoUnit.MILLIS: return Math.floor(nanosUntil / 1000000);
                case ChronoUnit.SECONDS: return Math.floor(nanosUntil / LocalTime.NANOS_PER_SECOND);
                case ChronoUnit.MINUTES: return Math.floor(nanosUntil / LocalTime.NANOS_PER_MINUTE);
                case ChronoUnit.HOURS: return Math.floor(nanosUntil / LocalTime.NANOS_PER_HOUR);
                case ChronoUnit.HALF_DAYS: return Math.floor(nanosUntil / (12 * LocalTime.NANOS_PER_HOUR));
            }
            throw new UnsupportedTemporalTypeException(`Unsupported unit: ${unit}`);
        }
        return unit.between(this, end);
    }

    /**
     * @param {int} hour
     * @return {OffsetTime}
     */
    withHour(hour) {
        return this._withLocalTimeOffset(this._time.withHour(hour), this._offset);
    }

    /**
     * @param {int} minute
     * @return {OffsetTime}
     */
    withMinute(minute) {
        return this._withLocalTimeOffset(this._time.withMinute(minute), this._offset);
    }

    /**
     * @param {int} second
     * @return {OffsetTime}
     */
    withSecond(second) {
        return this._withLocalTimeOffset(this._time.withSecond(second), this._offset);
    }

    /**
     * @param {int} nano
     * @return {OffsetTime}
     */
    withNano(nano) {
        return this._withLocalTimeOffset(this._time.withNano(nano), this._offset);
    }

    /**
     * @param {ZoneOffset} offset
     * @return {OffsetTime}
     */
    withOffsetSameInstant(offset) {
        requireNonNull(offset, 'offset');
        if (offset.equals(this._offset)) {
            return this;
        }
        const difference = offset.totalSeconds() - this._offset.totalSeconds();
        const adjusted = this._time.plusSeconds(difference);
        return new OffsetTime(adjusted, offset);
    }

    /**
     * @param {ZoneOffset} offset
     * @return {OffsetTime}
     */
    withOffsetSameLocal(offset) {
        return offset != null && offset.equals(this._offset) ? this : new OffsetTime(this._time, offset);
    }

    _toEpochNano() {
        const nod = this._time.toNanoOfDay();
        const offsetNanos = this._offset.totalSeconds() * LocalTime.NANOS_PER_SECOND;
        return nod - offsetNanos;
    }

    _withAdjuster(adjuster) {
        requireNonNull(adjuster, 'adjuster');
        // optimizations
        if (adjuster instanceof LocalTime) {
            return this._withLocalTimeOffset(adjuster, this._offset);
        } else if (adjuster instanceof ZoneOffset) {
            return this._withLocalTimeOffset(this._time, adjuster);
        } else if (adjuster instanceof OffsetTime) {
            return adjuster;
        }
        return adjuster.adjustInto(this);
    }

    _withField(field, newValue) {
        requireNonNull(field, 'field');
        if (field instanceof ChronoField) {
            if (field === ChronoField.OFFSET_SECONDS) {
                return this._withLocalTimeOffset(this._time, ZoneOffset.ofTotalSeconds(field.checkValidIntValue(newValue)));
            }
            return this._withLocalTimeOffset(this._time.with(field, newValue), this._offset);
        }
        return field.adjustInto(this, newValue);
    }

    /**
     * @private
     * @param {LocalTime} time
     * @param {ZoneOffset} offset
     * @return {OffsetTime}
     */
    _withLocalTimeOffset(time, offset) {
        if (this._time === time && this._offset.equals(offset)) {
            return this;
        }
        return new OffsetTime(time, offset);
    }

    //---------------------------------

    /**
     * @param {OffsetTime} other - the other time to compare to, not null
     * @return {int} the comparator value, negative if less, positive if greater
     * @throws {NullPointerException} if `other` is null
     */
    compareTo(other) {
        requireNonNull(other, 'other');
        requireInstance(other, OffsetTime, 'other');
        if (this._offset.equals(other._offset)) {
            return this._time.compareTo(other._time);
        }
        const compare = MathUtil.compareNumbers(this._toEpochNano(), other._toEpochNano());
        if (compare === 0) {
            return this._time.compareTo(other._time);
        }
        return compare;
    }

    /**
     * @param {*} other - the object to check, null returns false
     * @return {boolean} true if this is equal to the other time
     */
    equals(other) {
        if (this === other) {
            return true;
        }
        if (other instanceof OffsetTime) {
            return this._time.equals(other._time) && this._offset.equals(other._offset);
        }
        return false;
    }

    /**
     * @return {number}
     */
    hashCode() {
        return this._time.hashCode() ^ this._offset.hashCode();
    }

    /**
     * @return {string}
     */
    toString() {
        return this._time.toString() + this._offset.toString();
    }

    /**
     *
     * @return {string} same as {@link LocalDateTime.toString}
     */
    toJSON() {
        return this.toString();
    }
}


export function _init() {
    OffsetTime.MIN = OffsetTime.ofNumbers(0, 0, 0,0, ZoneOffset.MAX);

    OffsetTime.MAX = OffsetTime.ofNumbers(23, 59, 59,999999999, ZoneOffset.MIN);

    OffsetTime.FROM = createTemporalQuery('OffsetTime.FROM', (temporal) => {
        return OffsetTime.from(temporal);
    });
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { MathUtil } from './MathUtil';
import { requireNonNull, requireInstance } from './assert';
import { DateTimeException, UnsupportedTemporalTypeException, ArithmeticException, DateTimeParseException } from './errors';

import { IsoChronology } from './chrono/IsoChronology';

import { ChronoUnit } from './temporal/ChronoUnit';
import { TemporalAmount } from './temporal/TemporalAmount';

import { LocalDate } from './LocalDate';

/**
 * The pattern for parsing.
 */
const PATTERN = /([-+]?)P(?:([-+]?[0-9]+)Y)?(?:([-+]?[0-9]+)M)?(?:([-+]?[0-9]+)W)?(?:([-+]?[0-9]+)D)?/;

/**
 * A date-based amount of time, such as '2 years, 3 months and 4 days'.
 *
 * This class models a quantity or amount of time in terms of years, months and days.
 * See {@link Duration} for the time-based equivalent to this class.
 *
 * Durations and period differ in their treatment of daylight savings time
 * when added to {@link ZonedDateTime}. A {@link Duration} will add an exact
 * number of seconds, thus a duration of one day is always exactly 24 hours.
 * By contrast, a {@link Period} will add a conceptual day, trying to maintain
 * the local time.
 *
 * For example, consider adding a period of one day and a duration of one day to
 * 18:00 on the evening before a daylight savings gap. The {@link Period} will add
 * the conceptual day and result in a {@link ZonedDateTime} at 18:00 the following day.
 * By contrast, the {@link Duration} will add exactly 24 hours, resulting in a
 * {@link ZonedDateTime} at 19:00 the following day (assuming a one hour DST gap).
 *
 * The supported units of a period are {@link ChronoUnit#YEARS},
 * {@link ChronoUnit#MONTHS} and {@link ChronoUnit#DAYS}.
 * All three fields are always present, but may be set to zero.
 *
 * The period may be used with any calendar system.
 * The meaning of a 'year' or 'month' is only applied when the object is added to a date.
 *
 * The period is modeled as a directed amount of time, meaning that individual parts of the
 * period may be negative.
 *
 * The months and years fields may be normalized (see {@link normalized}).
 * The normalization assumes a 12 month year, so is not appropriate for all calendar systems.
 *
 * ### Static properties of Class {@link Period}
 *
 * Period.ZERO
 *
 * A constant for a period of zero.
 *
 */
export class Period extends TemporalAmount /* extends ChronoPeriod */ {

    /**
     * do not call the constructor directly
     * use a factory method instead
     *
     * @param {number} years
     * @param {number} months
     * @param {number} days
     * @private
     */
    constructor(years, months, days){
        super();
        
        const _years = MathUtil.safeToInt(years);
        const _months =  MathUtil.safeToInt(months);
        const _days = MathUtil.safeToInt(days);

        if( _years === 0 && _months === 0 && _days === 0 ){
            if (!Period.ZERO) {
                this._years = _years;
                this._months =  _months;
                this._days = _days;
                Period.ZERO = this;
            }
            return Period.ZERO;
        }
        
        /**
         * The number of years.
         */
        this._years = _years;
        /**
         * The number of months.
         */
        this._months =  _months;
        /**
         * The number of days.
         */
        this._days = _days;
    }

    //-----------------------------------------------------------------------
    /**
     * Obtains a {@link Period} representing a number of years.
     *
     * The resulting period will have the specified years.
     * The months and days units will be zero.
     *
     * @param {number} years - the number of years, positive or negative
     * @return {Period} the period of years, not null
     */
    static ofYears(years) {
        return Period.create(years, 0, 0);
    }

    /**
     * Obtains a {@link Period} representing a number of months.
     *
     * The resulting period will have the specified months.
     * The years and days units will be zero.
     *
     * @param {number} months - the number of months, positive or negative
     * @return {Period} the period of months, not null
     */
    static ofMonths(months) {
        return Period.create(0, months, 0);
    }

    /**
     * Obtains a {@link Period} representing a number of weeks.
     *
     * The resulting period will have days equal to the weeks multiplied by seven.
     * The years and months units will be zero.
     *
     * @param {number} weeks - the number of weeks, positive or negative
     * @return {Period} the period of days, not null
     */
    static ofWeeks(weeks) {
        return Period.create(0, 0, MathUtil.safeMultiply(weeks, 7));
    }

    /**
     * Obtains a {@link Period} representing a number of days.
     *
     * The resulting period will have the specified days.
     * The years and months units will be zero.
     *
     * @param {number} days - the number of days, positive or negative
     * @return {Period} the period of days, not null
     */
    static ofDays(days) {
        return Period.create(0, 0, days);
    }

    //-----------------------------------------------------------------------
    /**
     * Obtains a {@link Period} representing a number of years, months and days.
     *
     * This creates an instance based on years, months and days.
     *
     * @param {!number} years - the amount of years, may be negative
     * @param {!number} months - the amount of months, may be negative
     * @param {!number} days - the amount of days, may be negative
     * @return {Period} the period of years, months and days, not null
     */
    static of(years, months, days) {
        return Period.create(years, months, days);
    }

    //-----------------------------------------------------------------------
    /**
     * Obtains an instance of {@link Period} from a temporal amount.
     *
     * This obtains a period based on the specified amount.
     * A {@link TemporalAmount} represents an - amount of time, which may be
     * date-based or time-based, which this factory extracts to a {@link Period}.
     *
     * The conversion loops around the set of units from the amount and uses
     * the {@link ChronoUnit#YEARS}, {@link ChronoUnit#MONTHS}
     * and {@link ChronoUnit#DAYS} units to create a period.
     * If any other units are found then an exception is thrown.
     *
     * If the amount is a {@link ChronoPeriod} then it must use the ISO chronology.
     *
     * @param {TemporalAmount} amount - the temporal amount to convert, not null
     * @return {Period} the equivalent period, not null
     * @throws DateTimeException if unable to convert to a {@link Period}
     * @throws ArithmeticException if the amount of years, months or days exceeds an int
     */
    static from(amount) {
        if (amount instanceof Period) {
            return amount;
        }
        /*
        if (amount instanceof ChronoPeriod) {
            if (IsoChronology.INSTANCE !== amount.chronology()) {
                throw new DateTimeException('Period requires ISO chronology: ' + amount);
            }
        }
*/
        requireNonNull(amount, 'amount');
        let years = 0;
        let months = 0;
        let days = 0;
        const units = amount.units();
        for (let i=0; i<units.length; i++) {
            const unit = units[i];
            const unitAmount = amount.get(unit);
            if (unit === ChronoUnit.YEARS) {
                years = MathUtil.safeToInt(unitAmount);
            } else if (unit === ChronoUnit.MONTHS) {
                months = MathUtil.safeToInt(unitAmount);
            } else if (unit === ChronoUnit.DAYS) {
                days = MathUtil.safeToInt(unitAmount);
            } else {
                throw new DateTimeException(`Unit must be Years, Months or Days, but was ${unit}`);
            }
        }
        return Period.create(years, months, days);
    }

    //-----------------------------------------------------------------------
    /**
     * Obtains a {@link Period} consisting of the number of years, months,
     * and days between two dates.
     *
     * The start date is included, but the end date is not.
     * The period is calculated by removing complete months, then calculating
     * the remaining number of days, adjusting to ensure that both have the same sign.
     * The number of months is then split into years and months based on a 12 month year.
     * A month is considered if the end day-of-month is greater than or equal to the start day-of-month.
     * For example, from `2010-01-15` to `2011-03-18` is one year, two months and three days.
     *
     * The result of this method can be a negative period if the end is before the start.
     * The negative sign will be the same in each of year, month and day.

     * see {@link ChronoLocalDate.until}
     *
     * @param {LocalDate} startDate - the start date, inclusive, not null
     * @param {LocalDate} endDate - the end date, exclusive, not null
     * @return {Period} the period between this date and the end date, not null
     */
    static between(startDate, endDate) {
        requireNonNull(startDate, 'startDate');
        requireNonNull(endDate, 'endDate');
        requireInstance(startDate, LocalDate, 'startDate');
        requireInstance(endDate, LocalDate, 'endDate');
        return startDate.until(endDate);
    }

    //-----------------------------------------------------------------------
    /**
     * Obtains a {@link Period} from a text string such as {@link PnYnMnD}.
     *
     * This will parse the string produced by {@link toString} which is
     * based on the ISO-8601 period formats {@link PnYnMnD} and {@link PnW}.
     *
     * The string starts with an optional sign, denoted by the ASCII negative
     * or positive symbol. If negative, the whole period is negated.
     * The ASCII letter 'P' is next in upper or lower case.
     * There are then four sections, each consisting of a number and a suffix.
     * At least one of the four sections must be present.
     * The sections have suffixes in ASCII of 'Y', 'M', 'W' and 'D' for
     * years, months, weeks and days, accepted in upper or lower case.
     * The suffixes must occur in order.
     * The number part of each section must consist of ASCII digits.
     * The number may be prefixed by the ASCII negative or positive symbol.
     * The number must parse to an `int`.
     *
     * The leading plus/minus sign, and negative values for other units are
     * not part of the ISO-8601 standard. In addition, ISO-8601 does not
     * permit mixing between the {@link PnYnMnD} and {@link PnW} formats.
     * Any week-based input is multiplied by 7 and treated as a number of days.
     *
     * For example, the following are valid inputs:
     * <pre>
     *   'P2Y'             -- Period.ofYears(2)
     *   'P3M'             -- Period.ofMonths(3)
     *   'P4W'             -- Period.ofWeeks(4)
     *   'P5D'             -- Period.ofDays(5)
     *   'P1Y2M3D'         -- Period.of(1, 2, 3)
     *   'P1Y2M3W4D'       -- Period.of(1, 2, 25)
     *   'P-1Y2M'          -- Period.of(-1, 2, 0)
     *   '-P1Y2M'          -- Period.of(-1, -2, 0)
     * </pre>
     *
     * @param {string} text - the text to parse, not null
     * @return {Period} the parsed period, not null
     * @throws DateTimeParseException if the text cannot be parsed to a period
     */
    static parse(text) {
        requireNonNull(text, 'text');
        try {
            return Period._parse(text);
        } catch (ex){
            if(ex instanceof ArithmeticException){
                throw new DateTimeParseException('Text cannot be parsed to a Period', text, 0, ex);
            } else {
                throw ex;
            }
        }
    }

    /**
     * because functions that containing a try/ catch block cant be optimized,
     * we put the code in a sub function.
     */
    static _parse(text){
        const matches = PATTERN.exec(text);
        if (matches != null) {
            const negate = '-' === matches[1] ? -1 : 1;
            const yearMatch = matches[2];
            const monthMatch = matches[3];
            const weekMatch = matches[4];
            const dayMatch = matches[5];
            if (yearMatch != null || monthMatch != null || weekMatch != null || dayMatch != null) {
                const years = Period._parseNumber(text, yearMatch, negate);
                const months = Period._parseNumber(text, monthMatch, negate);
                const weeks = Period._parseNumber(text, weekMatch, negate);
                let days = Period._parseNumber(text, dayMatch, negate);
                days = MathUtil.safeAdd(days, MathUtil.safeMultiply(weeks, 7));
                return Period.create(years, months, days);
            }
        }
        throw new DateTimeParseException('Text cannot be parsed to a Period', text, 0);
    }

    static _parseNumber(text, str, negate) {
        if (str == null) {
            return 0;
        }
        const val = MathUtil.parseInt(str);
        return MathUtil.safeMultiply(val, negate);
    }

    //-----------------------------------------------------------------------
    /**
     * Creates an instance.
     *
     * @param {number} years - the amount
     * @param {number} months - the amount
     * @param {number} days - the amount
     * @return {Duration}
     */
    static create(years, months, days) {
        return new Period(years, months, days);
    }

    //-----------------------------------------------------------------------
    /**
     * Gets the list of units, from largest to smallest, that fully define this amount.
     *
     * @returns {ChronoUnit[]} list of units
     */
    units() {
        return [ChronoUnit.YEARS, ChronoUnit.MONTHS, ChronoUnit.DAYS];
    }

    /**
     * Gets the chronology that defines the meaning of the supported units.
     *
     * The period is defined by the chronology.
     * It controls the supported units and restricts addition/subtraction
     * to {@link ChronoLocalDate} instances of the same chronology.
     *
     * @return {IsoChronology} the chronology defining the period, not null
     */
    chronology() {
        return IsoChronology.INSTANCE;
    }

    /**
     * Gets the value of the requested unit.
     *
     * The supported units are chronology specific.
     * They will typically be {@link ChronoUnit#YEARS},
     * {@link ChronoUnit#MONTHS} and {@link ChronoUnit#DAYS}.
     * Requesting an unsupported unit will throw an exception.
     *
     * @param {TemporalUnit} unit the {@link TemporalUnit} for which to return the value
     * @return {number} the long value of the unit
     * @throws DateTimeException if the unit is not supported
     * @throws UnsupportedTemporalTypeException if the unit is not supported
     */
    get(unit) {
        if (unit === ChronoUnit.YEARS) {
            return this._years;
        }
        if (unit === ChronoUnit.MONTHS) {
            return this._months;
        }
        if (unit === ChronoUnit.DAYS) {
            return this._days;
        }
        throw new UnsupportedTemporalTypeException(`Unsupported unit: ${unit}`);
    }

    //-----------------------------------------------------------------------
    /**
     * Checks if all three units of this period are zero.
     *
     * A zero period has the value zero for the years, months and days units.
     *
     * @return {boolean} true if this period is zero-length
     */
    isZero() {
        return (this === Period.ZERO);
    }

    /**
     * Checks if any of the three units of this period are negative.
     *
     * This checks whether the years, months or days units are less than zero.
     *
     * @return {boolean} true if any unit of this period is negative
     */
    isNegative() {
        return this._years < 0 || this._months < 0 || this._days < 0;
    }

    //-----------------------------------------------------------------------
    /**
     * Gets the amount of years of this period.
     *
     * This returns the years unit.
     *
     * The months unit is not normalized with the years unit.
     * This means that a period of '15 months' is different to a period
     * of '1 year and 3 months'.
     *
     * @return {number} the amount of years of this period, may be negative
     */
    years() {
        return this._years;
    }

    /**
     * Gets the amount of months of this period.
     *
     * This returns the months unit.
     *
     * The months unit is not normalized with the years unit.
     * This means that a period of '15 months' is different to a period
     * of '1 year and 3 months'.
     *
     * @return {number} the amount of months of this period, may be negative
     */
    months() {
        return this._months;
    }

    /**
     * Gets the amount of days of this period.
     *
     * This returns the days unit.
     *
     * @return {number} the amount of days of this period, may be negative
     */
    days() {
        return this._days;
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this period with the specified amount of years.
     *
     * This sets the amount of the years unit in a copy of this period.
     * The months and days units are unaffected.
     *
     * The months unit is not normalized with the years unit.
     * This means that a period of '15 months' is different to a period
     * of '1 year and 3 months'.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} years - the years to represent, may be negative
     * @return {Period} a {@link Period} based on this period with the requested years, not null
     */
    withYears(years) {
        if (years === this._years) {
            return this;
        }
        return Period.create(years, this._months, this._days);
    }

    /**
     * Returns a copy of this period with the specified amount of months.
     *
     * This sets the amount of the months unit in a copy of this period.
     * The years and days units are unaffected.
     *
     * The months unit is not normalized with the years unit.
     * This means that a period of '15 months' is different to a period
     * of '1 year and 3 months'.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} months - the months to represent, may be negative
     * @return {Period} a {@link Period} based on this period with the requested months, not null
     */
    withMonths(months) {
        if (months === this._months) {
            return this;
        }
        return Period.create(this._years, months, this._days);
    }

    /**
     * Returns a copy of this period with the specified amount of days.
     *
     * This sets the amount of the days unit in a copy of this period.
     * The years and months units are unaffected.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} days - the days to represent, may be negative
     * @return {Period} a {@link Period} based on this period with the requested days, not null
     */
    withDays(days) {
        if (days === this._days) {
            return this;
        }
        return Period.create(this._years, this._months, days);
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this period with the specified amount added.
     *
     * This input amount is converted to a {@link Period} using {@link from}.
     * This operates separately on the years, months and days.
     *
     * For example, '1 year, 6 months and 3 days' plus '2 years, 2 months and 2 days'
     * returns '3 years, 8 months and 5 days'.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {TemporalAmount} amountToAdd - the period to add, not null
     * @return {Period} a {@link Period} based on this period with the requested period added, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    plus(amountToAdd) {
        const amount = Period.from(amountToAdd);
        return Period.create(
            MathUtil.safeAdd(this._years, amount._years),
            MathUtil.safeAdd(this._months, amount._months),
            MathUtil.safeAdd(this._days, amount._days));
    }

    /**
     * Returns a copy of this period with the specified years added.
     *
     * This adds the amount to the years unit in a copy of this period.
     * The months and days units are unaffected.
     * For example, '1 year, 6 months and 3 days' plus 2 years returns '3 years, 6 months and 3 days'.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} yearsToAdd - the years to add, positive or negative
     * @return {Period} a {@link Period} based on this period with the specified years added, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    plusYears(yearsToAdd) {
        if (yearsToAdd === 0) {
            return this;
        }
        return Period.create(MathUtil.safeToInt(MathUtil.safeAdd(this._years, yearsToAdd)), this._months, this._days);
    }

    /**
     * Returns a copy of this period with the specified months added.
     *
     * This adds the amount to the months unit in a copy of this period.
     * The years and days units are unaffected.
     * For example, '1 year, 6 months and 3 days' plus 2 months returns '1 year, 8 months and 3 days'.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} monthsToAdd - the months to add, positive or negative
     * @return {Period} a {@link Period} based on this period with the specified months added, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    plusMonths(monthsToAdd) {
        if (monthsToAdd === 0) {
            return this;
        }
        return Period.create(this._years, MathUtil.safeToInt(MathUtil.safeAdd(this._months, monthsToAdd)), this._days);
    }

    /**
     * Returns a copy of this period with the specified days added.
     *
     * This adds the amount to the days unit in a copy of this period.
     * The years and months units are unaffected.
     * For example, '1 year, 6 months and 3 days' plus 2 days returns '1 year, 6 months and 5 days'.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} daysToAdd - the days to add, positive or negative
     * @return {Period} a {@link Period} based on this period with the specified days added, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    plusDays(daysToAdd) {
        if (daysToAdd === 0) {
            return this;
        }
        return Period.create(this._years, this._months, MathUtil.safeToInt(MathUtil.safeAdd(this._days, daysToAdd)));
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this period with the specified amount subtracted.
     *
     * This input amount is converted to a {@link Period} using {@link from}.
     * This operates separately on the years, months and days.
     *
     * For example, '1 year, 6 months and 3 days' minus '2 years, 2 months and 2 days'
     * returns '-1 years, 4 months and 1 day'.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {TemporalAmount} amountToSubtract - the period to subtract, not null
     * @return {Period} a {@link Period} based on this period with the requested period subtracted, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    minus(amountToSubtract) {
        const amount = Period.from(amountToSubtract);
        return Period.create(
            MathUtil.safeSubtract(this._years, amount._years),
            MathUtil.safeSubtract(this._months, amount._months),
            MathUtil.safeSubtract(this._days, amount._days));
    }

    /**
     * Returns a copy of this period with the specified years subtracted.
     *
     * This subtracts the amount from the years unit in a copy of this period.
     * The months and days units are unaffected.
     * For example, '1 year, 6 months and 3 days' minus 2 years returns '-1 years, 6 months and 3 days'.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} yearsToSubtract - the years to subtract, positive or negative
     * @return {Period} a {@link Period} based on this period with the specified years subtracted, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    minusYears(yearsToSubtract) {
        return this.plusYears(-1 * yearsToSubtract);
    }

    /**
     * Returns a copy of this period with the specified months subtracted.
     *
     * This subtracts the amount from the months unit in a copy of this period.
     * The years and days units are unaffected.
     * For example, '1 year, 6 months and 3 days' minus 2 months returns '1 year, 4 months and 3 days'.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} monthsToSubtract - the years to subtract, positive or negative
     * @return {Period} a {@link Period} based on this period with the specified months subtracted, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    minusMonths(monthsToSubtract) {
        return this.plusMonths(-1 * monthsToSubtract);
    }

    /**
     * Returns a copy of this period with the specified days subtracted.
     *
     * This subtracts the amount from the days unit in a copy of this period.
     * The years and months units are unaffected.
     * For example, '1 year, 6 months and 3 days' minus 2 days returns '1 year, 6 months and 1 day'.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} daysToSubtract - the months to subtract, positive or negative
     * @return {Period} a {@link Period} based on this period with the specified days subtracted, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    minusDays(daysToSubtract) {
        return this.plusDays(-1 * daysToSubtract);
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a new instance with each element in this period multiplied
     * by the specified scalar.
     *
     * This simply multiplies each field, years, months, days and normalized time,
     * by the scalar. No normalization is performed.
     *
     * @param {number} scalar - the scalar to multiply by, not null
     * @return {Period} a {@link Period} based on this period with the amounts multiplied by the scalar, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    multipliedBy(scalar) {
        if (this === Period.ZERO || scalar === 1) {
            return this;
        }
        return Period.create(
            MathUtil.safeMultiply(this._years, scalar),
            MathUtil.safeMultiply(this._months, scalar),
            MathUtil.safeMultiply(this._days, scalar));
    }

    /**
     * Returns a new instance with each amount in this period negated.
     *
     * @return {Period} a {@link Period} based on this period with the amounts negated, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    negated() {
        return this.multipliedBy(-1);
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this period with the years and months normalized
     * using a 12 month year.
     *
     * This normalizes the years and months units, leaving the days unit unchanged.
     * The months unit is adjusted to have an absolute value less than 11,
     * with the years unit being adjusted to compensate. For example, a period of
     * '1 Year and 15 months' will be normalized to '2 years and 3 months'.
     *
     * The sign of the years and months units will be the same after normalization.
     * For example, a period of '1 year and -25 months' will be normalized to
     * '-1 year and -1 month'.
     *
     * This normalization uses a 12 month year which is not valid for all calendar systems.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @return {Period} a {@link Period} based on this period with excess months normalized to years, not null
     * @throws ArithmeticException if numeric overflow occurs
     */
    normalized() {
        const totalMonths = this.toTotalMonths();
        const splitYears = MathUtil.intDiv(totalMonths, 12);
        const splitMonths = MathUtil.intMod(totalMonths, 12);  // no overflow
        if (splitYears === this._years && splitMonths === this._months) {
            return this;
        }
        return Period.create(MathUtil.safeToInt(splitYears), splitMonths, this._days);
    }

    /**
     * Gets the total number of months in this period using a 12 month year.
     *
     * This returns the total number of months in the period by multiplying the
     * number of years by 12 and adding the number of months.
     *
     * This uses a 12 month year which is not valid for all calendar systems.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @return {number} the total number of months in the period, may be negative
     */
    toTotalMonths() {
        return this._years * 12 + this._months;  // no overflow
    }

    //-------------------------------------------------------------------------
    /**
     * Adds this period to the specified temporal object.
     *
     * This returns a temporal object of the same observable type as the input
     * with this period added.
     *
     * In most cases, it is clearer to reverse the calling pattern by using
     * {@link Temporal#plus}.
     * <pre>
     *   // these two lines are equivalent, but the second approach is recommended
     *   dateTime = thisPeriod.addTo(dateTime);
     *   dateTime = dateTime.plus(thisPeriod);
     * </pre>
     *
     * The calculation will add the years, then months, then days.
     * Only non-zero amounts will be added.
     * If the date-time has a calendar system with a fixed number of months in a
     * year, then the years and months will be combined before being added.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Temporal} temporal - the temporal object to adjust, not null
     * @return {Temporal} an object of the same type with the adjustment made, not null
     * @throws DateTimeException if unable to add
     * @throws ArithmeticException if numeric overflow occurs
     */
    addTo(temporal) {
        requireNonNull(temporal, 'temporal');
        if (this._years !== 0) {
            if (this._months !== 0) {
                temporal = temporal.plus(this.toTotalMonths(), ChronoUnit.MONTHS);
            } else {
                temporal = temporal.plus(this._years, ChronoUnit.YEARS);
            }
        } else if (this._months !== 0) {
            temporal = temporal.plus(this._months, ChronoUnit.MONTHS);
        }
        if (this._days !== 0) {
            temporal = temporal.plus(this._days, ChronoUnit.DAYS);
        }
        return temporal;
    }

    /**
     * Subtracts this period from the specified temporal object.
     *
     * This returns a temporal object of the same observable type as the input
     * with this period subtracted.
     *
     * In most cases, it is clearer to reverse the calling pattern by using
     * {@link Temporal#minus}.
     * <pre>
     *   // these two lines are equivalent, but the second approach is recommended
     *   dateTime = thisPeriod.subtractFrom(dateTime);
     *   dateTime = dateTime.minus(thisPeriod);
     * </pre>
     *
     * The calculation operates as follows.
     * First, the chronology of the temporal is checked to ensure it is ISO chronology or null.
     * Second, if the months are zero, the years are added if non-zero, otherwise
     * the combination of years and months is added if non-zero.
     * Finally, any days are added.
     *
     * The calculation will subtract the years, then months, then days.
     * Only non-zero amounts will be subtracted.
     * If the date-time has a calendar system with a fixed number of months in a
     * year, then the years and months will be combined before being subtracted.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Temporal} temporal - the temporal object to adjust, not null
     * @return {Temporal} an object of the same type with the adjustment made, not null
     * @throws DateTimeException if unable to subtract
     * @throws ArithmeticException if numeric overflow occurs
     */
    subtractFrom(temporal) {
        requireNonNull(temporal, 'temporal');
        if (this._years !== 0) {
            if (this._months !== 0) {
                temporal = temporal.minus(this.toTotalMonths(), ChronoUnit.MONTHS);
            } else {
                temporal = temporal.minus(this._years, ChronoUnit.YEARS);
            }
        } else if (this._months !== 0) {
            temporal = temporal.minus(this._months, ChronoUnit.MONTHS);
        }
        if (this._days !== 0) {
            temporal = temporal.minus(this._days, ChronoUnit.DAYS);
        }
        return temporal;
    }

    //-----------------------------------------------------------------------
    /**
     * Checks if this period is equal to another period.
     *
     * The comparison is based on the amounts held in the period.
     * To be equal, the years, months and days units must be individually equal.
     * Note that this means that a period of '15 Months' is not equal to a period
     * of '1 Year and 3 Months'.
     *
     * @param {*} obj - the object to check, null returns false
     * @return {boolean} true if this is equal to the other period
     */
    equals(obj) {
        if (this === obj) {
            return true;
        }
        if (obj instanceof Period) {
            const other = obj;
            return this._years === other._years &&
                this._months === other._months &&
                this._days === other._days;
        }
        return false;
    }

    /**
     * A hash code for this period.
     *
     * @return {number} a suitable hash code
     */
    hashCode() {
        return MathUtil.hashCode(this._years, this._months, this._days);
    }

    //-----------------------------------------------------------------------
    /**
     * Outputs this period as a string, such as {@link P6Y3M1D}.
     *
     * The output will be in the ISO-8601 period format.
     * A zero period will be represented as zero days, 'P0D'.
     *
     * @return {string} a string representation of this period, not null
     */
    toString() {
        if (this === Period.ZERO) {
            return 'P0D';
        } else {
            let buf = 'P';
            if (this._years !== 0) {
                buf += `${this._years}Y`;
            }
            if (this._months !== 0) {
                buf += `${this._months}M`;
            }
            if (this._days !== 0) {
                buf += `${this._days}D`;
            }
            return buf;
        }
    }

    /**
     *
     * @return {string} same as {@link Period.toString}
     */
    toJSON() {
        return this.toString();
    }
}

export function _init() {
    /**
     * A constant for a period of zero.
     */
    Period.ofDays(0);
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { MathUtil } from './MathUtil';

/**
 * @private
 */
export class StringUtil {

    /**
     *
     * @param {string} text
     * @param {string} pattern
     * @return {boolean}
     */
    static startsWith(text, pattern){
        return text.indexOf(pattern) === 0;
    }

    /**
     *
     * @param {string} text
     * @returns {number}
     */
    static hashCode(text) {
        const len = text.length;
        if (len === 0) {
            return 0;
        }

        let hash = 0;
        for (let i = 0; i < len; i++) {
            const chr = text.charCodeAt(i);
            hash = ((hash << 5) - hash) + chr;
            hash |= 0; // Convert to 32bit integer
        }
        return MathUtil.smi(hash);
    }
}

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { DateTimeException, UnsupportedTemporalTypeException } from './errors';
import { requireNonNull, requireInstance } from './assert';
import { MathUtil } from './MathUtil';

import { ChronoField } from './temporal/ChronoField';
import { ChronoUnit } from './temporal/ChronoUnit';
import { Clock } from './Clock';
import { DateTimeFormatter } from './format/DateTimeFormatter';
import { DateTimeFormatterBuilder } from './format/DateTimeFormatterBuilder';
import { IsoChronology } from './chrono/IsoChronology';
import { LocalDate } from './LocalDate';
import { Month } from './Month';
import { MonthDay } from './MonthDay';
import { SignStyle } from './format/SignStyle';
import { Temporal } from './temporal/Temporal';
import { TemporalAccessor } from './temporal/TemporalAccessor';
import { TemporalField } from './temporal/TemporalField';
import { TemporalQueries } from './temporal/TemporalQueries';
import { TemporalQuery, createTemporalQuery } from './temporal/TemporalQuery';
import { TemporalUnit } from './temporal/TemporalUnit';
import { YearConstants } from './YearConstants';
import { YearMonth } from './YearMonth';
import { ZoneId } from './ZoneId';


/**
 * A year in the ISO-8601 calendar system, such as `2007`.
 *
 * {@link Year} is an immutable date-time object that represents a year.
 * Any field that can be derived from a year can be obtained.
 *
 * **Note that years in the ISO chronology only align with years in the
 * Gregorian-Julian system for modern years. Parts of Russia did not switch to the
 * modern Gregorian/ISO rules until 1920.
 * As such, historical years must be treated with caution.**
 *
 * This class does not store or represent a month, day, time or time-zone.
 * For example, the value "2007" can be stored in a {@link Year}.
 *
 * Years represented by this class follow the ISO-8601 standard and use
 * the proleptic numbering system. Year 1 is preceded by year 0, then by year -1.
 *
 * The ISO-8601 calendar system is the modern civil calendar system used today
 * in most of the world. It is equivalent to the proleptic Gregorian calendar
 * system, in which today's rules for leap years are applied for all time.
 * For most applications written today, the ISO-8601 rules are entirely suitable.
 * However, any application that makes use of historical dates, and requires them
 * to be accurate will find the ISO-8601 approach unsuitable.
 *
 * ### Static properties of Class {@link LocalDate}
 *
 * Year.MIN_VALUE = -999.999;
 *
 * The minimum supported year. Theoretically the minimum could be -28.542.4812 years in javascript.
 * approx LocalDateTime.ofEpochSecond(Number.MIN_SAFE_INTEGER, 0, ZoneOffset.UTC).year()
 *
 * Year.MAX_VALUE = 999.999;
 *
 * The maximum supported year. Theoretically the maximum could be 285.428.751 years in javascript.
 * approx LocalDateTime.ofEpochSecond(Number.MAX_SAFE_INTEGER, 0, ZoneOffset.UTC).year()
 *
 */
export class Year extends Temporal {

    /**
     *
     * @param {number} value
     * @private
     */
    constructor(value) {
        super();
        this._year = MathUtil.safeToInt(value);
    }

    /**
     *
     * @return {number} gets the value
     */
    value() {
        return this._year;
    }

    /**
     * function overloading for {@link Year.now}
     *
     * if called without arguments, then {@link Year.now0} is executed.

     * if called with 1 arguments and first argument is an instance of ZoneId, then {@link Year.nowZoneId} is executed.
     *
     * Otherwise {@link Year.nowClock} is executed.
     *
     * @param {!(ZoneId|Clock)} zoneIdOrClock
     * @returns {Year}
     */
    static now(zoneIdOrClock = undefined) {
        if (zoneIdOrClock === undefined) {
            return Year.now0();
        } else if (zoneIdOrClock instanceof ZoneId) {
            return Year.nowZoneId(zoneIdOrClock);
        } else {
            return Year.nowClock(zoneIdOrClock);
        }
    }

    /**
     * Obtains the current year from the system clock in the default time-zone.
     *
     * This will query the system clock (see {@link Clock#systemDefaultZone}) in the default
     * time-zone to obtain the current year.
     *
     * Using this method will prevent the ability to use an alternate clock for testing
     * because the clock is hard-coded.
     *
     * @return {Year} the current year using the system clock and default time-zone, not null
     */
    static now0() {
        return Year.nowClock(Clock.systemDefaultZone());
    }

    /**
     * Obtains the current year from the system clock in the specified time-zone.
     *
     * This will query the system clock (see {@link Clock#system}) to obtain the current year.
     * Specifying the time-zone avoids dependence on the default time-zone.
     *
     * Using this method will prevent the ability to use an alternate clock for testing
     * because the clock is hard-coded.
     *
     * @param {ZoneId} zone  the zone ID to use, not null
     * @return {Year} the current year using the system clock, not null
     */
    static nowZoneId(zone) {
        requireNonNull(zone, 'zone');
        requireInstance(zone, ZoneId, 'zone');
        return Year.nowClock(Clock.system(zone));
    }

    /**
     * Obtains the current year from the specified clock.
     *
     * This will query the specified clock to obtain the current year.
     * Using this method allows the use of an alternate clock for testing.
     * The alternate clock may be introduced using dependency injection.
     *
     * @param {Clock} clock  the clock to use, not null
     * @return {Year} the current year, not null
     */
    static nowClock(clock) {
        requireNonNull(clock, 'clock');
        requireInstance(clock, Clock, 'clock');
        const now = LocalDate.now(clock);  // called once
        return Year.of(now.year());
    }
    /**
     * Obtains an instance of {@link Year}.
     *
     * This method accepts a year value from the proleptic ISO calendar system.
     *
     * * The year 2AD/CE is represented by 2.
     * * The year 1AD/CE is represented by 1.
     * * The year 1BC/BCE is represented by 0.
     * * The year 2BC/BCE is represented by -1.
     *
     * @param {Number} isoYear  the ISO proleptic year to represent, from {@link MIN_VALUE} to {@link MAX_VALUE}
     * @return {Year} the year, not null
     * @throws DateTimeException if the field is invalid
     */
    static of(isoYear) {
        requireNonNull(isoYear, 'isoYear');
        ChronoField.YEAR.checkValidValue(isoYear);
        return new Year(isoYear);
    }

    //-----------------------------------------------------------------------
    /**
     * Obtains an instance of {@link Year} from a temporal object.
     *
     * A {@link TemporalAccessor} represents some form of date and time information.
     * This factory converts the arbitrary temporal object to an instance of {@link Year}.
     *
     * The conversion extracts the {@link ChronoField#YEAR} field.
     * The extraction is only permitted if the temporal object has an ISO
     * chronology, or can be converted to a {@link LocalDate}.
     *
     * This method matches the signature of the functional interface {@link TemporalQuery}
     * allowing it to be used in queries via method reference, {@link Year::from}.
     *
     * @param {TemporalAccessor} temporal  the temporal object to convert, not null
     * @return {Year} the year, not null
     * @throws DateTimeException if unable to convert to a {@link Year}
     */
    static from(temporal) {
        requireNonNull(temporal, 'temporal');
        requireInstance(temporal, TemporalAccessor, 'temporal');
        if (temporal instanceof Year) {
            return temporal;
        }
        try {
            /* TODO: we support only ISO for now
            if (IsoChronology.INSTANCE.equals(Chronology.from(temporal)) == false) {
                temporal = LocalDate.from(temporal);
            }*/
            return Year.of(temporal.get(ChronoField.YEAR));
        } catch (ex) {
            throw new DateTimeException(`Unable to obtain Year from TemporalAccessor: ${ 
                temporal}, type ${temporal && temporal.constructor != null ? temporal.constructor.name : ''}`);
        }
    }
    //-----------------------------------------------------------------------
    /**
     * function overloading for {@link Year.parse}
     *
     * if called with 1 argument, then {@link Year.parseText} is executed.
     *
     * Otherwise {@link Year.parseTextFormatter} is executed.
     *
     * @param {!(String)} text
     * @param {?DateTimeFormatter} formatter
     * @returns {Year}
     */
    static parse(text, formatter) {
        if (arguments.length <= 1) {
            return Year.parseText(text);
        } else {
            return Year.parseTextFormatter(text, formatter);
        }
    }

    /**
     * Obtains an instance of {@link Year} from a text string such as `2007`.
     *
     * The string must represent a valid year.
     * Years outside the range 0000 to 9999 must be prefixed by the plus or minus symbol.
     *
     * @param {String} text  the text to parse such as "2007", not null
     * @return {Year} the parsed year, not null
     * @throws DateTimeParseException if the text cannot be parsed
     */
    static parseText(text) {
        requireNonNull(text, 'text');
        return Year.parse(text, PARSER);
    }

    /**
     * Obtains an instance of {@link Year} from a text string using a specific formatter.
     *
     * The text is parsed using the formatter, returning a year.
     *
     * @param {String} text  the text to parse, not null
     * @param {DateTimeFormatter} formatter  the formatter to use, not null
     * @return {Year} the parsed year, not null
     * @throws DateTimeParseException if the text cannot be parsed
     */
    static parseTextFormatter(text, formatter = PARSER) {
        requireNonNull(text, 'text');
        requireNonNull(formatter, 'formatter');
        requireInstance(formatter, DateTimeFormatter, 'formatter');
        return formatter.parse(text, Year.FROM);
    }

    //-------------------------------------------------------------------------
    /**
     * Checks if the year is a leap year, according to the ISO proleptic
     * calendar system rules.
     *
     * This method applies the current rules for leap years across the whole time-line.
     * In general, a year is a leap year if it is divisible by four without
     * remainder. However, years divisible by 100, are not leap years, with
     * the exception of years divisible by 400 which are.
     *
     * For example, 1904 is a leap year it is divisible by 4.
     * 1900 was not a leap year as it is divisible by 100, however 2000 was a
     * leap year as it is divisible by 400.
     *
     * The calculation is proleptic - applying the same rules into the far future and far past.
     * This is historically inaccurate, but is correct for the ISO-8601 standard.
     *
     * @param {number} year  the year to check
     * @return {boolean} true if the year is leap, false otherwise
     */
    static isLeap(year) {
        return ((MathUtil.intMod(year, 4) === 0) && ((MathUtil.intMod(year, 100) !== 0) || (MathUtil.intMod(year, 400) === 0)));
    }

    /**
     * function overloading for {@link YearMonth.isSupported}
     *
     * if called with 1 argument and first argument is an instance of TemporalField, then {@link YearMonth.isSupportedField} is executed,
     *
     * otherwise {@link YearMonth.isSupportedUnit} is executed
     *
     * @param {!(TemporalField|ChronoUnit)} fieldOrUnit
     * @returns {boolean}
     */
    isSupported(fieldOrUnit) {
        if (arguments.length === 1 && fieldOrUnit instanceof TemporalField) {
            return this.isSupportedField(fieldOrUnit);
        } else {
            return this.isSupportedUnit(fieldOrUnit);
        }
    }

    /**
     * Checks if the specified field is supported.
     *
     * This checks if this year can be queried for the specified field.
     * If false, then calling {@link range} and {@link get} will throw an exception.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields (see {@link isSupported}) will return valid
     * values based on this date-time.
     * The supported fields are:
     *
     * * {@link YEAR_OF_ERA}
     * * {@link YEAR}
     * * {@link ERA}
     *
     * All other {@link ChronoField} instances will return false.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.isSupportedBy}
     * passing `this` as the argument.
     * Whether the field is supported is determined by the field.
     *
     * @param {TemporalField} field  the field to check, null returns false
     * @return {boolean} true if the field is supported on this year, false if not
     */
    isSupportedField(field) {
        if (field instanceof ChronoField) {
            return field === ChronoField.YEAR || field === ChronoField.YEAR_OF_ERA || field === ChronoField.ERA;
        }
        return field != null && field.isSupportedBy(this);
    }

    isSupportedUnit(unit) {
        if (unit instanceof ChronoUnit) {
            return unit === ChronoUnit.YEARS || unit === ChronoUnit.DECADES || unit === ChronoUnit.CENTURIES || unit === ChronoUnit.MILLENNIA || unit === ChronoUnit.ERAS;
        }
        return unit != null && unit.isSupportedBy(this);
    }

    /**
     * Gets the range of valid values for the specified field.
     *
     * The range object expresses the minimum and maximum valid values for a field.
     * This year is used to enhance the accuracy of the returned range.
     * If it is not possible to return the range, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields (see {@link isSupported}) will return
     * appropriate range instances.
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.rangeRefinedBy}
     * passing `this` as the argument.
     * Whether the range can be obtained is determined by the field.
     *
     * @param {TemporalField} field  the field to query the range for, not null
     * @return {ValueRange} the range of valid values for the field, not null
     * @throws DateTimeException if the range for the field cannot be obtained
     */
    range(field) {
        if (this.isSupported(field)) {
            return field.range();
        } else if (field instanceof ChronoField) {
            throw new UnsupportedTemporalTypeException(`Unsupported field: ${field}`);
        }
        return super.range(field);
    }

    /**
     * Gets the value of the specified field from this year as an `int`.
     *
     * This queries this year for the value for the specified field.
     * The returned value will always be within the valid range of values for the field.
     * If it is not possible to return the value, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields (see {@link isSupported}) will return valid
     * values based on this year.
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.getFrom}
     * passing `this` as the argument. Whether the value can be obtained,
     * and what the value represents, is determined by the field.
     *
     * @param {TemporalField} field  the field to get, not null
     * @return {number} the value for the field
     * @throws DateTimeException if a value for the field cannot be obtained
     * @throws ArithmeticException if numeric overflow occurs
     */
    get(field) {
        return this.range(field).checkValidIntValue(this.getLong(field), field);
    }

    /**
     * Gets the value of the specified field from this year as a `long`.
     *
     * This queries this year for the value for the specified field.
     * If it is not possible to return the value, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields (see {@link isSupported}) will return valid
     * values based on this year.
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.getFrom}
     * passing `this` as the argument. Whether the value can be obtained,
     * and what the value represents, is determined by the field.
     *
     * @param {TemporalField} field  the field to get, not null
     * @return {number} the value for the field
     * @throws DateTimeException if a value for the field cannot be obtained
     * @throws ArithmeticException if numeric overflow occurs
     */
    getLong(field) {
        requireNonNull(field, 'field');
        if (field instanceof ChronoField) {
            switch (field) {
                case ChronoField.YEAR_OF_ERA: return (this._year < 1 ? 1 - this._year : this._year);
                case ChronoField.YEAR: return this._year;
                case ChronoField.ERA: return (this._year < 1 ? 0 : 1);
            }
            throw new UnsupportedTemporalTypeException(`Unsupported field: ${field}`);
        }
        return field.getFrom(this);
    }

    //-----------------------------------------------------------------------
    /**
     * Checks if the year is a leap year, according to the ISO proleptic
     * calendar system rules.
     *
     * This method applies the current rules for leap years across the whole time-line.
     * In general, a year is a leap year if it is divisible by four without
     * remainder. However, years divisible by 100, are not leap years, with
     * the exception of years divisible by 400 which are.
     *
     * For example, 1904 is a leap year it is divisible by 4.
     * 1900 was not a leap year as it is divisible by 100, however 2000 was a
     * leap year as it is divisible by 400.
     *
     * The calculation is proleptic - applying the same rules into the far future and far past.
     * This is historically inaccurate, but is correct for the ISO-8601 standard.
     *
     * @return {boolean} true if the year is leap, false otherwise
     */
    isLeap() {
        return Year.isLeap(this._year);
    }

    //-----------------------------------------------------------------------

    /**
     * Returns a copy of this year with the specified field set to a new value.
     *
     * This returns a new {@link Year}, based on this one, with the value
     * for the specified field changed.
     * If it is not possible to set the value, because the field is not supported or for
     * some other reason, an exception is thrown.
     *
     * If the field is a {@link ChronoField} then the adjustment is implemented here.
     * The supported fields behave as follows:
     *
     * * {@link YEAR_OF_ERA} -
     *   Returns a {@link Year} with the specified year-of-era
     *   The era will be unchanged.
     * * {@link YEAR} -
     *   Returns a {@link Year} with the specified year.
     *   This completely replaces the date and is equivalent to {@link of}.
     * * {@link ERA} -
     *   Returns a {@link Year} with the specified era.
     *   The year-of-era will be unchanged.
     *
     * In all cases, if the new value is outside the valid range of values for the field
     * then a {@link DateTimeException} will be thrown.
     *
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.adjustInto}
     * passing `this` as the argument. In this case, the field determines
     * whether and how to adjust the instant.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {TemporalField} field  the field to set in the result, not null
     * @param {number} newValue  the new value of the field in the result
     * @returns {Year} based on `this` with the specified field set, not null
     * @throws DateTimeException if the field cannot be set
     * @throws ArithmeticException if numeric overflow occurs
     */
    _withField(field, newValue) {
        requireNonNull(field, 'field');
        requireInstance(field, TemporalField, 'field');
        if (field instanceof ChronoField) {
            field.checkValidValue(newValue);
            switch (field) {
                case ChronoField.YEAR_OF_ERA:
                    return Year.of((this._year < 1 ? 1 - newValue : newValue));
                case ChronoField.YEAR:
                    return Year.of(newValue);
                case ChronoField.ERA:
                    return (this.getLong(ChronoField.ERA) === newValue ? this : Year.of(1 - this._year));
            }
            throw new UnsupportedTemporalTypeException(`Unsupported field: ${field}`);
        }
        return field.adjustInto(this, newValue);
    }

    /**
     * @param {number} amountToAdd
     * @param {TemporalUnit} unit
     * @return {Year} based on this year with the addition made, not null
     * @throws DateTimeException if the addition cannot be made
     * @throws ArithmeticException if numeric overflow occurs
     */
    _plusUnit(amountToAdd, unit) {
        requireNonNull(amountToAdd, 'amountToAdd');
        requireNonNull(unit, 'unit');
        requireInstance(unit, TemporalUnit, 'unit');
        if (unit instanceof ChronoUnit) {
            switch (unit) {
                case ChronoUnit.YEARS: return this.plusYears(amountToAdd);
                case ChronoUnit.DECADES: return this.plusYears(MathUtil.safeMultiply(amountToAdd, 10));
                case ChronoUnit.CENTURIES: return this.plusYears(MathUtil.safeMultiply(amountToAdd, 100));
                case ChronoUnit.MILLENNIA: return this.plusYears(MathUtil.safeMultiply(amountToAdd, 1000));
                case ChronoUnit.ERAS: return this.with(ChronoField.ERA, MathUtil.safeAdd(this.getLong(ChronoField.ERA), amountToAdd));
            }
            throw new UnsupportedTemporalTypeException(`Unsupported unit: ${unit}`);
        }
        return unit.addTo(this, amountToAdd);
    }

    /**
     * Returns a copy of this year with the specified number of years added.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} yearsToAdd  the years to add, may be negative
     * @return {Year} based on this year with the period added, not null
     * @throws DateTimeException if the result exceeds the supported year range
     */
    plusYears(yearsToAdd) {
        if (yearsToAdd === 0) {
            return this;
        }
        return Year.of(ChronoField.YEAR.checkValidIntValue(MathUtil.safeAdd(this._year, yearsToAdd)));
    }

    //-----------------------------------------------------------------------

    /**
     * Returns a copy of this year with the specified number of years subtracted.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} yearsToSubtract  the years to subtract, may be negative
     * @return {Year} based on this year with the period subtracted, not null
     * @throws DateTimeException if the result exceeds the supported year range
     */
    minusYears(yearsToSubtract) {
        return (yearsToSubtract === MathUtil.MIN_SAFE_INTEGER ? this.plusYears(MathUtil.MAX_SAFE_INTEGER).plusYears(1) : this.plusYears(-yearsToSubtract));
    }

    /**
     * Adjusts the specified temporal object to have this year.
     *
     * This returns a temporal object of the same observable type as the input
     * with the year changed to be the same as this.
     *
     * The adjustment is equivalent to using {@link Temporal#with}
     * passing {@link ChronoField#YEAR} as the field.
     * If the specified temporal object does not use the ISO calendar system then
     * a {@link DateTimeException} is thrown.
     *
     * In most cases, it is clearer to reverse the calling pattern by using
     * {@link Temporal#with}:
     * <pre>
     *   // these two lines are equivalent, but the second approach is recommended
     *   temporal = thisYear.adjustInto(temporal);
     *   temporal = temporal.with(thisYear);
     * </pre>
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Temporal} temporal  the target object to be adjusted, not null
     * @return {Temporal} the adjusted object, not null
     * @throws DateTimeException if unable to make the adjustment
     * @throws ArithmeticException if numeric overflow occurs
     */
    adjustInto(temporal) {
        requireNonNull(temporal, 'temporal');
        /* TODO: only IsoChronology for now
         if (Chronology.from(temporal).equals(IsoChronology.INSTANCE) == false) {
         throw new DateTimeException("Adjustment only supported on ISO date-time");
         }*/
        return temporal.with(ChronoField.YEAR, this._year);
    }

    /**
     * Checks if the month-day is valid for this year.
     *
     * This method checks whether this year and the input month and day form
     * a valid date.
     *
     * @param {MonthDay} monthDay  the month-day to validate, null returns false
     * @return {boolean} true if the month and day are valid for this year
     */
    isValidMonthDay(monthDay) {
        return monthDay != null && monthDay.isValidYear(this._year);
    }

    /**
     * Gets the length of this year in days.
     *
     * @return {number} the length of this year in days, 365 or 366
     */
    length() {
        return this.isLeap() ? 366 : 365;
    }

    //-----------------------------------------------------------------------
    /**
     * Combines this year with a day-of-year to create a {@link LocalDate}.
     *
     * This returns a {@link LocalDate} formed from this year and the specified day-of-year.
     *
     * The day-of-year value 366 is only valid in a leap year.
     *
     * @param {number} dayOfYear  the day-of-year to use, not null
     * @return {LocalDate} the local date formed from this year and the specified date of year, not null
     * @throws DateTimeException if the day of year is zero or less, 366 or greater or equal
     *  to 366 and this is not a leap year
     */
    atDay(dayOfYear) {
        return LocalDate.ofYearDay(this._year, dayOfYear);
    }

    /**
     * function overloading for {@link Year.atMonth}
     *
     * if called with 1 arguments and first argument is instance of Month, then {@link Year.atMonthMonth} is executed.
     *
     * Otherwise {@link Year.atMonthNumber} is executed.
     *
     * @param {Month|number} monthOrNumber
     * @returns {YearMonth}
     */
    atMonth(monthOrNumber) {
        if (arguments.length === 1 && monthOrNumber instanceof Month) {
            return this.atMonthMonth(monthOrNumber);
        } else {
            return this.atMonthNumber(monthOrNumber);
        }
    }

    /**
     * Combines this year with a month to create a {@link YearMonth}.
     *
     * This returns a {@link YearMonth} formed from this year and the specified month.
     * All possible combinations of year and month are valid.
     *
     * This method can be used as part of a chain to produce a date:
     * <pre>
     *  LocalDate date = year.atMonth(month).atDay(day);
     * </pre>
     *
     * @param {Month} month  the month-of-year to use, not null
     * @return {YearMonth} the year-month formed from this year and the specified month, not null
     */
    atMonthMonth(month) {
        requireNonNull(month, 'month');
        requireInstance(month, Month, 'month');
        return YearMonth.of(this._year, month);
    }

    /**
     * Combines this year with a month to create a {@link YearMonth}.
     *
     * This returns a {@link YearMonth} formed from this year and the specified month.
     * All possible combinations of year and month are valid.
     *
     * This method can be used as part of a chain to produce a date:
     * <pre>
     *  LocalDate date = year.atMonth(month).atDay(day);
     * </pre>
     *
     * @param {number} month  the month-of-year to use, from 1 (January) to 12 (December)
     * @return {YearMonth} the year-month formed from this year and the specified month, not null
     * @throws DateTimeException if the month is invalid
     */
    atMonthNumber(month) {
        requireNonNull(month, 'month');
        return YearMonth.of(this._year, month);
    }

    /**
     * Combines this year with a month-day to create a {@link LocalDate}.
     *
     * This returns a {@link LocalDate} formed from this year and the specified month-day.
     *
     * A month-day of February 29th will be adjusted to February 28th in the resulting
     * date if the year is not a leap year.
     *
     * @param {MonthDay} monthDay  the month-day to use, not null
     * @return {LocalDate} the local date formed from this year and the specified month-day, not null
     */
    atMonthDay(monthDay) {
        requireNonNull(monthDay, 'monthDay');
        requireInstance(monthDay, MonthDay, 'monthDay');
        return monthDay.atYear(this._year);
    }


    //-----------------------------------------------------------------------
    /**
     * Queries this year using the specified query.
     *
     * This queries this year using the specified query strategy object.
     * The {@link TemporalQuery} object defines the logic to be used to
     * obtain the result. Read the documentation of the query to understand
     * what the result of this method will be.
     *
     * The result of this method is obtained by invoking the
     * {@link TemporalQuery#queryFrom} method on the
     * specified query passing `this` as the argument.
     *
     * @param {TemporalQuery} query  the query to invoke, not null
     * @return {*} the query result, null may be returned (defined by the query)
     * @throws DateTimeException if unable to query (defined by the query)
     * @throws ArithmeticException if numeric overflow occurs (defined by the query)
     */
    query(query) {
        requireNonNull(query, 'query()');
        requireInstance(query, TemporalQuery, 'query()');
        if (query === TemporalQueries.chronology()) {
            return IsoChronology.INSTANCE;
        } else if (query === TemporalQueries.precision()) {
            return ChronoUnit.YEARS;
        } else if (query === TemporalQueries.localDate() || query === TemporalQueries.localTime() ||
                query === TemporalQueries.zone() || query === TemporalQueries.zoneId() || query === TemporalQueries.offset()) {
            return null;
        }
        return super.query(query);
    }
    //-----------------------------------------------------------------------
    /**
     * Compares this year to another year.
     *
     * The comparison is based on the value of the year.
     * It is "consistent with equals", as defined by {@link Comparable}.
     *
     * @param {Year} other  the other year to compare to, not null
     * @return {number} the comparator value, negative if less, positive if greater
     */
    compareTo(other) {
        requireNonNull(other, 'other');
        requireInstance(other, Year, 'other');
        return this._year - other._year;
    }

    /**
     * Is this year after the specified year.
     *
     * @param {Year} other  the other year to compare to, not null
     * @return {boolean} true if this is after the specified year
     */
    isAfter(other) {
        requireNonNull(other, 'other');
        requireInstance(other, Year, 'other');
        return this._year > other._year;
    }

    /**
     * Is this year before the specified year.
     *
     * @param {Year} other  the other year to compare to, not null
     * @return {boolean} true if this point is before the specified year
     */
    isBefore(other) {
        requireNonNull(other, 'other');
        requireInstance(other, Year, 'other');
        return this._year < other._year;
    }
    /**
     * Outputs this year as a string using the formatter.
     *
     * @param {DateTimeFormatter} formatter  the formatter to use, not null
     * @return {String} the formatted year string, not null
     * @throws DateTimeException if an error occurs during printing
     */
    format(formatter) {
        requireNonNull(formatter, 'formatter');
        requireInstance(formatter, DateTimeFormatter, 'formatter');
        return formatter.format(this);
    }

    /**
     * Checks if this year is equal to the specified {@link Year}.
     *
     * The comparison is based on the value
     *
     * @param {*} other - the other year, null returns false
     * @return {boolean} true if the other duration is equal to this one
     */
    equals(other) {
        if (this === other) {
            return true;
        }
        if (other instanceof Year) {
            return this.value() === other.value();
        }
        return false;
    }
    /**
     * Outputs this year as a string.
     *
     * @return {String} a string representation of this year, not null
     */
    toString() {
        return `${this._year}`;
    }

    /**
     * toJSON() use by JSON.stringify
     * delegates to toString()
     *
     * @return {string}
     */
    toJSON() {
        return this.toString();
    }

    /**
     * Calculates the amount of time until another temporal in terms of the specified unit.
     * This calculates the amount of time between two temporal objects in terms of a single {@link TemporalUnit}. The start and end points are this and the specified temporal. The end point is converted to be of the same type as the start point if different. The result will be negative if the end is before the start. For example, the amount in hours between two temporal objects can be calculated using `startTime.until(endTime, HOURS)`.
     *
     * The calculation returns a whole number, representing the number of complete units between the two temporals. For example, the amount in hours between the times 11:30 and 13:29 will only be one hour as it is one minute short of two hours.
     *
     * There are two equivalent ways of using this method. The first is to invoke this method directly. The second is to use `TemporalUnit.between(Temporal, Temporal)`:
     *
     * <pre>
     *    // these two lines are equivalent
     *    temporal = start.until(end, unit);
     *    temporal = unit.between(start, end);
     * </pre>
     *
     * The choice should be made based on which makes the code more readable.
     * For example, this method allows the number of days between two dates to be calculated:
     *
     * <pre>
     *   daysBetween = start.until(end, DAYS);
     *   // or alternatively
     *   daysBetween = DAYS.between(start, end);
     * </pre>
     *
     * ### Implementation Requirements:
     * Implementations must begin by checking to ensure that the input temporal object is of the same observable type as the implementation. They must then perform the calculation for all instances of {@link ChronoUnit}. An {@link UnsupportedTemporalTypeException} must be thrown for {@link ChronoUnit} instances that are unsupported.
     * If the unit is not a {@link ChronoUnit}, then the result of this method is obtained by invoking `TemporalUnit.between(Temporal, Temporal)` passing this as the first argument and the converted input temporal as the second argument.
     *
     * In summary, implementations must behave in a manner equivalent to this pseudo-code:
     *
     * <pre>
     *   // convert the end temporal to the same type as this class
     *   if (unit instanceof ChronoUnit) {
     *     // if unit is supported, then calculate and return result
     *     // else throw UnsupportedTemporalTypeException for unsupported units
     *   }
     *   return unit.between(this, convertedEndTemporal);
     * </pre>
     *
     * Note that the unit's between method must only be invoked if the two temporal objects have exactly the same type evaluated by `getClass()`.
     *
     * Implementations must ensure that no observable state is altered when this read-only method is invoked.
     *
     * @param {Temporal} endExclusive - the end temporal, exclusive, converted to be of the same type as this object, not null
     * @param {TemporalUnit} unit - the unit to measure the amount in, not null
     * @return {number} the amount of time between this temporal object and the specified one in terms of the unit; positive if the specified object is later than this one, negative if it is earlier than this one
     * @throws DateTimeException - if the amount cannot be calculated, or the end temporal cannot be converted to the same type as this temporal
     * @throws UnsupportedTemporalTypeException - if the unit is not supported
     * @throws ArithmeticException - if numeric overflow occurs
     */
    until(endExclusive, unit) {
        const end = Year.from(endExclusive);

        if (unit instanceof ChronoUnit) {
            const yearsUntil = end.value() - this.value();
            switch (unit) {
                case ChronoUnit.YEARS:
                    return yearsUntil;
                case ChronoUnit.DECADES:
                    return MathUtil.intDiv(yearsUntil, 10);
                case ChronoUnit.CENTURIES:
                    return MathUtil.intDiv(yearsUntil, 100);
                case ChronoUnit.MILLENNIA:
                    return MathUtil.intDiv(yearsUntil, 1000);
                case ChronoUnit.ERAS:
                    return end.getLong(ChronoField.ERA) - this.getLong(ChronoField.ERA);
            }
            throw new UnsupportedTemporalTypeException(`Unsupported unit: ${unit}`);
        }
        return unit.between(this, end);
    }
}

let PARSER;

export function _init() {

    Year.MIN_VALUE = YearConstants.MIN_VALUE;
    Year.MAX_VALUE = YearConstants.MAX_VALUE;

    PARSER = new DateTimeFormatterBuilder()
        .appendValue(ChronoField.YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
        .toFormatter();

    Year.FROM = createTemporalQuery('Year.FROM', (temporal) => {
        return Year.from(temporal);
    });
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE.md in the root directory of this source tree)
 */

/**
 * attempt to avoid dependency cycles... define all constants here and they could be used
 * so instead of using e.g. Year.MAX_VALUE we could use YearConstants.MAX_VALUE to avoid the cycle
 */
export class YearConstants {}

export function _init() {
    /**
     * The minimum supported year
     */
    YearConstants.MIN_VALUE = -999999;
    /**
     * The maximum supported year
     */
    YearConstants.MAX_VALUE = 999999;
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE.md in the root directory of this source tree)
 */

import { requireNonNull, requireInstance } from './assert';
import { DateTimeException, UnsupportedTemporalTypeException } from './errors';
import { MathUtil } from './MathUtil';

import { ChronoField } from './temporal/ChronoField';
import { ChronoUnit } from './temporal/ChronoUnit';
import { Clock } from './Clock';
import { DateTimeFormatterBuilder } from './format/DateTimeFormatterBuilder';
import { IsoChronology } from './chrono/IsoChronology';
import { LocalDate } from './LocalDate';
import { Month } from './Month';
import { SignStyle } from './format/SignStyle';
import { Temporal } from './temporal/Temporal';
import { TemporalField } from './temporal/TemporalField';
import { TemporalQueries } from './temporal/TemporalQueries';
import { TemporalQuery } from './temporal/TemporalQuery';
import { TemporalUnit } from './temporal/TemporalUnit';
import { createTemporalQuery } from './temporal/TemporalQuery';
import { ValueRange } from './temporal/ValueRange';
import { Year } from './Year';
import { ZoneId } from './ZoneId';

/**
 * A year-month in the ISO-8601 calendar system, such as `2007-12`.
 *
 * {@link YearMonth} is an immutable date-time object that represents the combination
 * of a year and month. Any field that can be derived from a year and month, such as
 * quarter-of-year, can be obtained.
 *
 * This class does not store or represent a day, time or time-zone.
 * For example, the value "October 2007" can be stored in a {@link YearMonth}.
 *
 * The ISO-8601 calendar system is the modern civil calendar system used today
 * in most of the world. It is equivalent to the proleptic Gregorian calendar
 * system, in which today's rules for leap years are applied for all time.
 * For most applications written today, the ISO-8601 rules are entirely suitable.
 * However, any application that makes use of historical dates, and requires them
 * to be accurate will find the ISO-8601 approach unsuitable.
 *
 * ### Specification for implementors
 *
 * This class is immutable and thread-safe.
 */
export class YearMonth extends Temporal {
    //-----------------------------------------------------------------------
    /**
     * function overloading for {@link YearMonth.now}
     *
     * if called with 0 argument {@link YearMonth.now0} is executed,
     *
     * if called with 1 argument and first argument is an instance of ZoneId, then {@link YearMonth.nowZoneId} is executed,
     *
     * otherwise {@link YearMonth.nowClock} is executed
     *
     * @param {?(ZoneId|Clock)} zoneIdOrClock
     * @returns {YearMonth}
     */
    static now(zoneIdOrClock) {
        if (arguments.length === 0) {
            return YearMonth.now0();
        } else if (arguments.length === 1 && zoneIdOrClock instanceof ZoneId) {
            return YearMonth.nowZoneId(zoneIdOrClock);
        } else {
            return YearMonth.nowClock(zoneIdOrClock);
        }
    }

    /**
     * Obtains the current year-month from the system clock in the default time-zone.
     *
     * This will query the system clock (see {@link Clock#systemDefaultZone}) in the default
     * time-zone to obtain the current year-month.
     * The zone and offset will be set based on the time-zone in the clock.
     *
     * Using this method will prevent the ability to use an alternate clock for testing
     * because the clock is hard-coded.
     *
     * @return {YearMonth} the current year-month using the system clock and default time-zone, not null
     */
    static now0() {
        return YearMonth.nowClock(Clock.systemDefaultZone());
    }

    /**
     * Obtains the current year-month from the system clock in the specified time-zone.
     *
     * This will query the system clock (see {@link Clock#system}) to obtain the current year-month.
     * Specifying the time-zone avoids dependence on the default time-zone.
     *
     * Using this method will prevent the ability to use an alternate clock for testing
     * because the clock is hard-coded.
     *
     * @param {ZoneId} zone  the zone ID to use, not null
     * @return {YearMonth} the current year-month using the system clock, not null
     */
    static nowZoneId(zone) {
        return YearMonth.nowClock(Clock.system(zone));
    }

    /**
     * Obtains the current year-month from the specified clock.
     *
     * This will query the specified clock to obtain the current year-month.
     * Using this method allows the use of an alternate clock for testing.
     * The alternate clock may be introduced using dependency injection.
     *
     * @param {Clock} clock  the clock to use, not null
     * @return {YearMonth} the current year-month, not null
     */
    static nowClock(clock) {
        const now = LocalDate.now(clock);
        return YearMonth.of(now.year(), now.month());
    }

    //-----------------------------------------------------------------------
    /**
     * function overloading for {@link YearMonth.of}
     *
     * if called with 2 argument and first argument is an instance of Month, then {@link YearMonth.ofNumberMonth} is executed,
     *
     * otherwise {@link YearMonth.ofNumberNumber} is executed
     *
     * @param {!number} year
     * @param {!(Month|number)} monthOrNumber
     * @returns {YearMonth}
     */
    static of(year, monthOrNumber) {
        if (arguments.length === 2 && monthOrNumber instanceof Month) {
            return YearMonth.ofNumberMonth(year, monthOrNumber);
        } else {
            return YearMonth.ofNumberNumber(year, monthOrNumber);
        }
    }

    /**
     * Obtains an instance of {@link YearMonth} from a year and month.
     *
     * @param {number} year  the year to represent, from MIN_YEAR to MAX_YEAR
     * @param {Month} month  the month-of-year to represent, not null
     * @return {YearMonth} the year-month, not null
     * @throws DateTimeException if the year value is invalid
     */
    static ofNumberMonth(year, month) {
        requireNonNull(month, 'month');
        requireInstance(month, Month, 'month');
        return YearMonth.ofNumberNumber(year, month.value());
    }

    /**
     * Obtains an instance of {@link YearMonth} from a year and month.
     *
     * @param {number} year  the year to represent, from MIN_YEAR to MAX_YEAR
     * @param {number} month  the month-of-year to represent, from 1 (January) to 12 (December)
     * @return {YearMonth} the year-month, not null
     * @throws DateTimeException if either field value is invalid
     */
    static ofNumberNumber(year, month) {
        requireNonNull(year, 'year');
        requireNonNull(month, 'month');
        ChronoField.YEAR.checkValidValue(year);
        ChronoField.MONTH_OF_YEAR.checkValidValue(month);
        return new YearMonth(year, month);
    }

    //-----------------------------------------------------------------------
    /**
     * Obtains an instance of {@link YearMonth} from a temporal object.
     *
     * A {@link TemporalAccessor} represents some form of date and time information.
     * This factory converts the arbitrary temporal object to an instance of {@link YearMonth}.
     *
     * The conversion extracts the {@link ChronoField#YEAR} and
     * {@link ChronoField#MONTH_OF_YEAR} fields.
     * The extraction is only permitted if the temporal object has an ISO
     * chronology, or can be converted to a {@link LocalDate}.
     *
     * This method matches the signature of the functional interface {@link TemporalQuery}
     * allowing it to be used in queries via method reference, {@link YearMonth::from}.
     *
     * @param {TemporalAccessor} temporal  the temporal object to convert, not null
     * @return {YearMonth} the year-month, not null
     * @throws DateTimeException if unable to convert to a {@link YearMonth}
     */
    static from(temporal) {
        requireNonNull(temporal, 'temporal');
        if (temporal instanceof YearMonth) {
            return temporal;
        }
        try {
            /* TODO: only IsoChronology for now
            if (IsoChronology.INSTANCE.equals(Chronology.from(temporal)) == false) {
                temporal = LocalDate.from(temporal);
            }*/
            return YearMonth.of(temporal.get(ChronoField.YEAR), temporal.get(ChronoField.MONTH_OF_YEAR));
        } catch (ex) {
            throw new DateTimeException(`Unable to obtain YearMonth from TemporalAccessor: ${ 
                temporal}, type ${temporal && temporal.constructor != null ? temporal.constructor.name : ''}`);
        }
    }
    //-----------------------------------------------------------------------
    /**
     * function overloading for {@link YearMonth.parse}
     *
     * if called with 2 argument and first argument is an instance of Month, then {@link YearMonth.parseString} is executed,
     *
     * otherwise {@link YearMonth.parseStringFormatter} is executed
     *
     * @param {!(String)} text
     * @param {?DateTimeFormatter} formatter
     * @returns {YearMonth}
     */
    static parse(text, formatter) {
        if (arguments.length === 1) {
            return YearMonth.parseString(text);
        } else {
            return YearMonth.parseStringFormatter(text, formatter);
        }
    }

    /**
     * Obtains an instance of {@link YearMonth} from a text string such as `2007-12`.
     *
     * The string must represent a valid year-month.
     * The format must be {@link yyyy-MM}.
     * Years outside the range 0000 to 9999 must be prefixed by the plus or minus symbol.
     *
     * @param {String} text  the text to parse such as "2007-12", not null
     * @return {YearMonth} the parsed year-month, not null
     * @throws DateTimeParseException if the text cannot be parsed
     */
    static parseString(text) {
        return YearMonth.parseStringFormatter(text, PARSER);
    }

    /**
     * Obtains an instance of {@link YearMonth} from a text string using a specific formatter.
     *
     * The text is parsed using the formatter, returning a year-month.
     *
     * @param {String} text  the text to parse, not null
     * @param {DateTimeFormatter} formatter  the formatter to use, not null
     * @return the parsed year-month, not null
     * @throws DateTimeParseException if the text cannot be parsed
     */
    static parseStringFormatter(text, formatter) {
        requireNonNull(formatter, 'formatter');
        return formatter.parse(text, YearMonth.FROM);
    }


    /**
     * Constructor.
     *
     * @param {number} year  the year to represent, validated from MIN_YEAR to MAX_YEAR
     * @param {number} month  the month-of-year to represent, validated from 1 (January) to 12 (December)
     * @private
     */
    constructor(year, month) {
        super();
        this._year = MathUtil.safeToInt(year);
        this._month = MathUtil.safeToInt(month);
    }

    /**
     * function overloading for {@link YearMonth.isSupported}
     *
     * if called with 1 argument and first argument is an instance of TemporalField, then {@link YearMonth.isSupportedField} is executed,
     *
     * otherwise {@link YearMonth.isSupportedUnit} is executed
     *
     * @param {!(TemporalField|ChronoUnit)} fieldOrUnit
     * @returns {boolean}
     */
    isSupported(fieldOrUnit) {
        if (arguments.length === 1 && fieldOrUnit instanceof TemporalField) {
            return this.isSupportedField(fieldOrUnit);
        } else {
            return this.isSupportedUnit(fieldOrUnit);
        }
    }

    /**
     * Checks if the specified field is supported.
     *
     * This checks if this year-month can be queried for the specified field.
     * If false, then calling {@link range} and {@link get} will throw an exception.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields (see {@link isSupported}) will return valid
     * values based on this date-time.
     * The supported fields are:
     *
     * * {@link MONTH_OF_YEAR}
     * * {@link EPOCH_MONTH}
     * * {@link YEAR_OF_ERA}
     * * {@link YEAR}
     * * {@link ERA}
     *
     * All other {@link ChronoField} instances will return false.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.isSupportedBy}
     * passing `this` as the argument.
     * Whether the field is supported is determined by the field.
     *
     * @param {TemporalField} field  the field to check, null returns false
     * @return {boolean} true if the field is supported on this year-month, false if not
     */
    isSupportedField(field) {
        if (field instanceof ChronoField) {
            return field === ChronoField.YEAR || field === ChronoField.MONTH_OF_YEAR ||
                    field === ChronoField.PROLEPTIC_MONTH || field === ChronoField.YEAR_OF_ERA || field === ChronoField.ERA;
        }
        return field != null && field.isSupportedBy(this);
    }

    isSupportedUnit(unit) {
        if (unit instanceof ChronoUnit) {
            return unit === ChronoUnit.MONTHS || unit === ChronoUnit.YEARS || unit === ChronoUnit.DECADES || unit === ChronoUnit.CENTURIES || unit === ChronoUnit.MILLENNIA || unit === ChronoUnit.ERAS;
        }
        return unit != null && unit.isSupportedBy(this);
    }

    /**
     * Gets the range of valid values for the specified field.
     *
     * The range object expresses the minimum and maximum valid values for a field.
     * This year-month is used to enhance the accuracy of the returned range.
     * If it is not possible to return the range, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields (see {@link isSupported}) will return
     * appropriate range instances.
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.rangeRefinedBy}
     * passing `this` as the argument.
     * Whether the range can be obtained is determined by the field.
     *
     * @param {TemporalField} field  the field to query the range for, not null
     * @return {ValueRange} the range of valid values for the field, not null
     * @throws DateTimeException if the range for the field cannot be obtained
     */
    range(field) {
        if (field === ChronoField.YEAR_OF_ERA) {
            return (this.year() <= 0 ? ValueRange.of(1, Year.MAX_VALUE + 1) : ValueRange.of(1, Year.MAX_VALUE));
        }
        return super.range(field);
    }

    /**
     * Gets the value of the specified field from this year-month as an `int`.
     *
     * This queries this year-month for the value for the specified field.
     * The returned value will always be within the valid range of values for the field.
     * If it is not possible to return the value, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields (see {@link isSupported}) will return valid
     * values based on this year-month, except {@link EPOCH_MONTH} which is too
     * large to fit in an `int` and throw a {@link DateTimeException}.
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.getFrom}
     * passing `this` as the argument. Whether the value can be obtained,
     * and what the value represents, is determined by the field.
     *
     * @param {TemporalField} field  the field to get, not null
     * @return {number} the value for the field
     * @throws DateTimeException if a value for the field cannot be obtained
     * @throws ArithmeticException if numeric overflow occurs
     */
    get(field) {
        requireNonNull(field, 'field');
        requireInstance(field, TemporalField, 'field');
        return this.range(field).checkValidIntValue(this.getLong(field), field);
    }

    /**
     * Gets the value of the specified field from this year-month as a `long`.
     *
     * This queries this year-month for the value for the specified field.
     * If it is not possible to return the value, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields (see {@link isSupported}) will return valid
     * values based on this year-month.
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.getFrom}
     * passing `this` as the argument. Whether the value can be obtained,
     * and what the value represents, is determined by the field.
     *
     * @param {TemporalField} field  the field to get, not null
     * @return {number} the value for the field
     * @throws DateTimeException if a value for the field cannot be obtained
     * @throws ArithmeticException if numeric overflow occurs
     */
    getLong(field) {
        requireNonNull(field, 'field');
        requireInstance(field, TemporalField, 'field');
        if (field instanceof ChronoField) {
            switch (field) {
                case ChronoField.MONTH_OF_YEAR: return this._month;
                case ChronoField.PROLEPTIC_MONTH: return this._getProlepticMonth();
                case ChronoField.YEAR_OF_ERA: return (this._year < 1 ? 1 - this._year : this._year);
                case ChronoField.YEAR: return this._year;
                case ChronoField.ERA: return (this._year < 1 ? 0 : 1);
            }
            throw new UnsupportedTemporalTypeException(`Unsupported field: ${field}`);
        }
        return field.getFrom(this);
    }

    _getProlepticMonth() {
        return MathUtil.safeAdd(MathUtil.safeMultiply(this._year, 12), (this._month - 1));
    }

    //-----------------------------------------------------------------------
    /**
     * Gets the year field.
     *
     * This method returns the primitive `int` value for the year.
     *
     * The year returned by this method is proleptic as per {@link get}.
     *
     * @return {number} the year, from MIN_YEAR to MAX_YEAR
     */
    year() {
        return this._year;
    }

    /**
     * Gets the month-of-year field from 1 to 12.
     *
     * This method returns the month as an `int` from 1 to 12.
     * Application code is frequently clearer if the enum {@link Month}
     * is used by calling {@link getMonth}.
     *
     * @return {number} the month-of-year, from 1 to 12
     * @see #getMonth()
     */
    monthValue() {
        return this._month;
    }

    /**
     * Gets the month-of-year field using the {@link Month} enum.
     *
     * This method returns the enum {@link Month} for the month.
     * This avoids confusion as to what `int` values mean.
     * If you need access to the primitive `int` value, use {@link Month#getValue}.
     *
     * @return {Month} the month-of-year, not null
     */
    month() {
        return Month.of(this._month);
    }

    //-----------------------------------------------------------------------
    /**
     * Checks if the year is a leap year, according to the ISO proleptic
     * calendar system rules.
     *
     * This method applies the current rules for leap years across the whole time-line.
     * In general, a year is a leap year if it is divisible by four without
     * remainder. However, years divisible by 100, are not leap years, with
     * the exception of years divisible by 400 which are.
     *
     * For example, 1904 is a leap year it is divisible by 4.
     * 1900 was not a leap year as it is divisible by 100, however 2000 was a
     * leap year as it is divisible by 400.
     *
     * The calculation is proleptic - applying the same rules into the far future and far past.
     * This is historically inaccurate, but is correct for the ISO-8601 standard.
     *
     * @return {boolean} true if the year is leap, false otherwise
     */
    isLeapYear() {
        return IsoChronology.isLeapYear(this._year);
    }

    /**
     * Checks if the day-of-month is valid for this year-month.
     *
     * This method checks whether this year and month and the input day form
     * a valid date.
     *
     * @param {number} dayOfMonth  the day-of-month to validate, from 1 to 31, invalid value returns false
     * @return {boolean} true if the day is valid for this year-month
     */
    isValidDay(dayOfMonth) {
        return dayOfMonth >= 1 && dayOfMonth <= this.lengthOfMonth();
    }

    /**
     * Returns the length of the month, taking account of the year.
     *
     * This returns the length of the month in days.
     * For example, a date in January would return 31.
     *
     * @return {number} the length of the month in days, from 28 to 31
     */
    lengthOfMonth() {
        return this.month().length(this.isLeapYear());
    }

    /**
     * Returns the length of the year.
     *
     * This returns the length of the year in days, either 365 or 366.
     *
     * @return {number} 366 if the year is leap, 365 otherwise
     */
    lengthOfYear() {
        return (this.isLeapYear() ? 366 : 365);
    }

    /**
     * function overloading for {@link YearMonth.with}
     *
     * if called with 1 argument, then {@link YearMonth.withAdjuster} is executed,
     * otherwise {@link YearMonth.withFieldValue} is executed.
     *
     * @param {!(TemporalAdjuster|TemporalField)} adjusterOrField
     * @param {?number} value nullable only of first argument is an instance of TemporalAdjuster
     * @returns {YearMonth}
     */
    with(adjusterOrField, value) {
        if (arguments.length === 1) {
            return this._withAdjuster(adjusterOrField);
        } else {
            return this._withField(adjusterOrField, value);
        }
    }

    /**
     * Returns a copy of this year-month with the specified field set to a new value.
     *
     * This returns a new {@link YearMonth}, based on this one, with the value
     * for the specified field changed.
     * This can be used to change any supported field, such as the year or month.
     * If it is not possible to set the value, because the field is not supported or for
     * some other reason, an exception is thrown.
     *
     * If the field is a {@link ChronoField} then the adjustment is implemented here.
     * The supported fields behave as follows:
     *
     * * {@link MONTH_OF_YEAR} -
     *   Returns a {@link YearMonth} with the specified month-of-year.
     *   The year will be unchanged.
     * * {@link PROLEPTIC_MONTH} -
     *   Returns a {@link YearMonth} with the specified proleptic-month.
     *   This completely replaces the year and month of this object.
     * * {@link YEAR_OF_ERA} -
     *   Returns a {@link YearMonth} with the specified year-of-era
     *   The month and era will be unchanged.
     * * {@link YEAR} -
     *   Returns a {@link YearMonth} with the specified year.
     *   The month will be unchanged.
     * * {@link ERA} -
     *   Returns a {@link YearMonth} with the specified era.
     *   The month and year-of-era will be unchanged.
     *
     * In all cases, if the new value is outside the valid range of values for the field
     * then a {@link DateTimeException} will be thrown.
     *
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.adjustInto}
     * passing `this` as the argument. In this case, the field determines
     * whether and how to adjust the instant.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {TemporalField} field  the field to set in the result, not null
     * @param {number} newValue  the new value of the field in the result
     * @return a {@link YearMonth} based on `this` with the specified field set, not null
     * @throws DateTimeException if the field cannot be set
     * @throws ArithmeticException if numeric overflow occurs
     */
    _withField(field, newValue) {
        requireNonNull(field, 'field');
        requireInstance(field, TemporalField, 'field');
        if (field instanceof ChronoField) {
            const f = field;
            f.checkValidValue(newValue);
            switch (f) {
                case ChronoField.MONTH_OF_YEAR: return this.withMonth(newValue);
                case ChronoField.PROLEPTIC_MONTH: return this.plusMonths(newValue - this.getLong(ChronoField.PROLEPTIC_MONTH));
                case ChronoField.YEAR_OF_ERA: return this.withYear((this._year < 1 ? 1 - newValue : newValue));
                case ChronoField.YEAR: return this.withYear(newValue);
                case ChronoField.ERA: return (this.getLong(ChronoField.ERA) === newValue ? this : this.withYear(1 - this._year));
            }
            throw new UnsupportedTemporalTypeException(`Unsupported field: ${field}`);
        }
        return field.adjustInto(this, newValue);
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this {@link YearMonth} with the year altered.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} year  the year to set in the returned year-month, from MIN_YEAR to MAX_YEAR
     * @return {YearMonth} based on this year-month with the requested year, not null
     * @throws DateTimeException if the year value is invalid
     */
    withYear(year) {
        ChronoField.YEAR.checkValidValue(year);
        return new YearMonth(year, this._month);
    }

    /**
     * Returns a copy of this {@link YearMonth} with the month-of-year altered.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} month  the month-of-year to set in the returned year-month, from 1 (January) to 12 (December)
     * @return {YearMonth} based on this year-month with the requested month, not null
     * @throws DateTimeException if the month-of-year value is invalid
     */
    withMonth(month) {
        ChronoField.MONTH_OF_YEAR.checkValidValue(month);
        return new YearMonth(this._year, month);
    }

    //-----------------------------------------------------------------------

    /**
     * @param {number} amountToAdd
     * @param {TemporalUnit} unit
     * @return {YearMonth} based on this year-month with the addition made, not null
     * @throws DateTimeException if the addition cannot be made
     * @throws ArithmeticException if numeric overflow occurs
     */
    _plusUnit(amountToAdd, unit) {
        requireNonNull(unit, 'unit');
        requireInstance(unit, TemporalUnit, 'unit');
        if (unit instanceof ChronoUnit) {
            switch (unit) {
                case ChronoUnit.MONTHS: return this.plusMonths(amountToAdd);
                case ChronoUnit.YEARS: return this.plusYears(amountToAdd);
                case ChronoUnit.DECADES: return this.plusYears(MathUtil.safeMultiply(amountToAdd, 10));
                case ChronoUnit.CENTURIES: return this.plusYears(MathUtil.safeMultiply(amountToAdd, 100));
                case ChronoUnit.MILLENNIA: return this.plusYears(MathUtil.safeMultiply(amountToAdd, 1000));
                case ChronoUnit.ERAS: return this.with(ChronoField.ERA, MathUtil.safeAdd(this.getLong(ChronoField.ERA), amountToAdd));
            }
            throw new UnsupportedTemporalTypeException(`Unsupported unit: ${unit}`);
        }
        return unit.addTo(this, amountToAdd);
    }

    /**
     * Returns a copy of this year-month with the specified period in years added.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} yearsToAdd  the years to add, may be negative
     * @return {YearMonth} based on this year-month with the years added, not null
     * @throws DateTimeException if the result exceeds the supported range
     */
    plusYears(yearsToAdd) {
        if (yearsToAdd === 0) {
            return this;
        }
        const newYear = ChronoField.YEAR.checkValidIntValue(this._year + yearsToAdd);  // safe overflow
        return this.withYear(newYear);
    }

    /**
     * Returns a copy of this year-month with the specified period in months added.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} monthsToAdd  the months to add, may be negative
     * @return {YearMonth} based on this year-month with the months added, not null
     * @throws DateTimeException if the result exceeds the supported range
     */
    plusMonths(monthsToAdd) {
        if (monthsToAdd === 0) {
            return this;
        }
        const monthCount = (this._year * 12) + (this._month - 1);
        const calcMonths = monthCount + monthsToAdd;
        const newYear = ChronoField.YEAR.checkValidIntValue(MathUtil.floorDiv(calcMonths, 12));
        const newMonth = MathUtil.floorMod(calcMonths, 12) + 1;
        return new YearMonth(newYear, newMonth);
    }

    //-----------------------------------------------------------------------

    /**
     * Returns a copy of this year-month with the specified period in years subtracted.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} yearsToSubtract  the years to subtract, may be negative
     * @return {YearMonth} based on this year-month with the years subtracted, not null
     * @throws DateTimeException if the result exceeds the supported range
     */
    minusYears(yearsToSubtract) {
        return (yearsToSubtract === MathUtil.MIN_SAFE_INTEGER ? this.plusYears(MathUtil.MIN_SAFE_INTEGER).plusYears(1) : this.plusYears(-yearsToSubtract));
    }

    /**
     * Returns a copy of this year-month with the specified period in months subtracted.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} monthsToSubtract  the months to subtract, may be negative
     * @return {YearMonth} based on this year-month with the months subtracted, not null
     * @throws DateTimeException if the result exceeds the supported range
     */
    minusMonths(monthsToSubtract) {
        return (monthsToSubtract === MathUtil.MIN_SAFE_INTEGER ? this.plusMonths(Math.MAX_SAFE_INTEGER).plusMonths(1) : this.plusMonths(-monthsToSubtract));
    }

    //-----------------------------------------------------------------------
    /**
     * Queries this year-month using the specified query.
     *
     * This queries this year-month using the specified query strategy object.
     * The {@link TemporalQuery} object defines the logic to be used to
     * obtain the result. Read the documentation of the query to understand
     * what the result of this method will be.
     *
     * The result of this method is obtained by invoking the
     * {@link TemporalQuery#queryFrom} method on the
     * specified query passing `this` as the argument.
     *
     * @param {TemporalQuery} query  the query to invoke, not null
     * @return {*} the query result, null may be returned (defined by the query)
     * @throws DateTimeException if unable to query (defined by the query)
     * @throws ArithmeticException if numeric overflow occurs (defined by the query)
     */
    query(query) {
        requireNonNull(query, 'query');
        requireInstance(query, TemporalQuery, 'query');
        if (query === TemporalQueries.chronology()) {
            return IsoChronology.INSTANCE;
        } else if (query === TemporalQueries.precision()) {
            return ChronoUnit.MONTHS;
        } else if (query === TemporalQueries.localDate() || query === TemporalQueries.localTime() ||
                query === TemporalQueries.zone() || query === TemporalQueries.zoneId() || query === TemporalQueries.offset()) {
            return null;
        }
        return super.query(query);
    }

    /**
     * Adjusts the specified temporal object to have this year-month.
     *
     * This returns a temporal object of the same observable type as the input
     * with the year and month changed to be the same as this.
     *
     * The adjustment is equivalent to using {@link Temporal#with}
     * passing {@link ChronoField#PROLEPTIC_MONTH} as the field.
     * If the specified temporal object does not use the ISO calendar system then
     * a {@link DateTimeException} is thrown.
     *
     * In most cases, it is clearer to reverse the calling pattern by using
     * {@link Temporal#with}:
     * <pre>
     *   // these two lines are equivalent, but the second approach is recommended
     *   temporal = thisYearMonth.adjustInto(temporal);
     *   temporal = temporal.with(thisYearMonth);
     * </pre>
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Temporal} temporal  the target object to be adjusted, not null
     * @return {Temporal} the adjusted object, not null
     * @throws DateTimeException if unable to make the adjustment
     * @throws ArithmeticException if numeric overflow occurs
     */
    adjustInto(temporal) {
        requireNonNull(temporal, 'temporal');
        requireInstance(temporal, Temporal, 'temporal');
        /* TODO: only IsoChronology for now
        if (Chronology.from(temporal).equals(IsoChronology.INSTANCE) == false) {
            throw new DateTimeException("Adjustment only supported on ISO date-time");
        }*/
        return temporal.with(ChronoField.PROLEPTIC_MONTH, this._getProlepticMonth());
    }

    /**
     * Calculates the period between this year-month and another year-month in
     * terms of the specified unit.
     *
     * This calculates the period between two year-months in terms of a single unit.
     * The start and end points are `this` and the specified year-month.
     * The result will be negative if the end is before the start.
     * The {@link Temporal} passed to this method must be a {@link YearMonth}.
     * For example, the period in years between two year-months can be calculated
     * using {@link startYearMonth.until}.
     *
     * The calculation returns a whole number, representing the number of
     * complete units between the two year-months.
     * For example, the period in decades between 2012-06 and 2032-05
     * will only be one decade as it is one month short of two decades.
     *
     * This method operates in association with {@link TemporalUnit#between}.
     * The result of this method is a `long` representing the amount of
     * the specified unit. By contrast, the result of {@link between} is an
     * object that can be used directly in addition/subtraction:
     * <pre>
     *   long period = start.until(end, YEARS);   // this method
     *   dateTime.plus(YEARS.between(start, end));      // use in plus/minus
     * </pre>
     *
     * The calculation is implemented in this method for {@link ChronoUnit}.
     * The units {@link MONTHS}, {@link YEARS}, {@link DECADES},
     * {@link CENTURIES}, {@link MILLENNIA} and {@link ERAS} are supported.
     * Other {@link ChronoUnit} values will throw an exception.
     *
     * If the unit is not a {@link ChronoUnit}, then the result of this method
     * is obtained by invoking {@link TemporalUnit.between}
     * passing `this` as the first argument and the input temporal as
     * the second argument.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Temporal} endExclusive  the end year-month, which is converted to a {@link YearMonth}, not null
     * @param {TemporalUnit} unit  the unit to measure the period in, not null
     * @return {number} the amount of the period between this year-month and the end year-month
     * @throws DateTimeException if the period cannot be calculated
     * @throws ArithmeticException if numeric overflow occurs
     */
    until(endExclusive, unit) {
        requireNonNull(endExclusive, 'endExclusive');
        requireNonNull(unit, 'unit');
        requireInstance(endExclusive, Temporal, 'endExclusive');
        requireInstance(unit, TemporalUnit, 'unit');

        const end = YearMonth.from(endExclusive);
        if (unit instanceof ChronoUnit) {
            const monthsUntil = end._getProlepticMonth() - this._getProlepticMonth();  // no overflow
            switch (unit) {
                case ChronoUnit.MONTHS: return monthsUntil;
                case ChronoUnit.YEARS: return monthsUntil / 12;
                case ChronoUnit.DECADES: return monthsUntil / 120;
                case ChronoUnit.CENTURIES: return monthsUntil / 1200;
                case ChronoUnit.MILLENNIA: return monthsUntil / 12000;
                case ChronoUnit.ERAS: return end.getLong(ChronoField.ERA) - this.getLong(ChronoField.ERA);
            }
            throw new UnsupportedTemporalTypeException(`Unsupported unit: ${unit}`);
        }
        return unit.between(this, end);
    }

    //-----------------------------------------------------------------------
    /**
     * Combines this year-month with a day-of-month to create a {@link LocalDate}.
     *
     * This returns a {@link LocalDate} formed from this year-month and the specified day-of-month.
     *
     * The day-of-month value must be valid for the year-month.
     *
     * This method can be used as part of a chain to produce a date:
     * <pre>
     *  LocalDate date = year.atMonth(month).atDay(day);
     * </pre>
     *
     * @param {number} dayOfMonth  the day-of-month to use, from 1 to 31
     * @return {LocalDate} the date formed from this year-month and the specified day, not null
     * @throws DateTimeException if the day is invalid for the year-month
     * @see #isValidDay(int)
     */
    atDay(dayOfMonth) {
        return LocalDate.of(this._year, this._month, dayOfMonth);
    }

    /**
     * Returns a {@link LocalDate} at the end of the month.
     *
     * This returns a {@link LocalDate} based on this year-month.
     * The day-of-month is set to the last valid day of the month, taking
     * into account leap years.
     *
     * This method can be used as part of a chain to produce a date:
     * <pre>
     *  LocalDate date = year.atMonth(month).atEndOfMonth();
     * </pre>
     *
     * @return {LocalDate} the last valid date of this year-month, not null
     */
    atEndOfMonth() {
        return LocalDate.of(this._year, this._month, this.lengthOfMonth());
    }

    //-----------------------------------------------------------------------
    /**
     * Compares this year-month to another year-month.
     *
     * The comparison is based first on the value of the year, then on the value of the month.
     * It is "consistent with equals", as defined by {@link Comparable}.
     *
     * @param {YearMonth} other  the other year-month to compare to, not null
     * @return {number} the comparator value, negative if less, positive if greater
     */
    compareTo(other) {
        requireNonNull(other, 'other');
        requireInstance(other, YearMonth, 'other');
        let cmp = (this._year - other.year());
        if (cmp === 0) {
            cmp = (this._month - other.monthValue());
        }
        return cmp;
    }

    /**
     * Is this year-month after the specified year-month.
     *
     * @param {YearMonth} other  the other year-month to compare to, not null
     * @return {boolean} true if this is after the specified year-month
     */
    isAfter(other) {
        return this.compareTo(other) > 0;
    }

    /**
     * Is this year-month before the specified year-month.
     *
     * @param {YearMonth} other  the other year-month to compare to, not null
     * @return {boolean} true if this point is before the specified year-month
     */
    isBefore(other) {
        return this.compareTo(other) < 0;
    }

    //-----------------------------------------------------------------------
    /**
     * Checks if this year-month is equal to another year-month.
     *
     * The comparison is based on the time-line position of the year-months.
     *
     * @param {*} obj  the object to check, null returns false
     * @return {boolean} true if this is equal to the other year-month
     */
    equals(obj) {
        if (this === obj) {
            return true;
        }
        if (obj instanceof YearMonth) {
            const other = obj;
            return this.year() === other.year() && this.monthValue() === other.monthValue();
        }
        return false;
    }

    //-----------------------------------------------------------------------
    /**
     * Outputs this year-month as a string, such as `2007-12`.
     *
     * The output will be in the format {@link yyyy-MM}:
     *
     * @return {String} a string representation of this year-month, not null
     */
    toString() {
        return PARSER.format(this);
    }

    /**
     * toJSON() use by JSON.stringify
     * delegates to toString()
     *
     * @return {string}
     */
    toJSON() {
        return this.toString();
    }

    /**
     * Outputs this year-month as a string using the formatter.
     *
     * @param {DateTimeFormatter} formatter  the formatter to use, not null
     * @return {String} the formatted year-month string, not null
     * @throws DateTimeException if an error occurs during printing
     */
    format(formatter) {
        requireNonNull(formatter, 'formatter');
        return formatter.format(this);
    }

}

let PARSER;

export function _init() {

    PARSER = new DateTimeFormatterBuilder()
        .appendValue(ChronoField.YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
        .appendLiteral('-')
        .appendValue(ChronoField.MONTH_OF_YEAR, 2)
        .toFormatter();

    YearMonth.FROM = createTemporalQuery('YearMonth.FROM', (temporal) => {
        return YearMonth.from(temporal);
    });
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { abstractMethodFail } from './assert';
import { DateTimeException } from './errors';

import { StringUtil } from './StringUtil';

import { Instant } from './Instant';

export class ZoneId {
    /**
     * Gets the system default time-zone.
     *
     * @return {ZoneId} the zone ID, not null
     */
    static systemDefault() {
        // Find implementation at {@link ZoneIdFactory}
        throw new DateTimeException('not supported operation');
    }

    /**
     * Gets the set of available zone IDs.
     *
     * This set includes the string form of all available region-based IDs.
     * Offset-based zone IDs are not included in the returned set.
     * The ID can be passed to {@link of} to create a {@link ZoneId}.
     *
     * The set of zone IDs can increase over time, although in a typical application
     * the set of IDs is fixed. Each call to this method is thread-safe.
     *
     * @return {string[]} a modifiable copy of the set of zone IDs, not null
     */
    static getAvailableZoneIds() {
        // Find implementation at {@link ZoneIdFactory}
        throw new DateTimeException('not supported operation');
    }

    /**
     * Obtains an instance of {@link ZoneId} from an ID ensuring that the
     * ID is valid and available for use.
     *
     * This method parses the ID producing a {@link ZoneId} or {@link ZoneOffset}.
     * A {@link ZoneOffset} is returned if the ID is 'Z', or starts with '+' or '-'.
     * The result will always be a valid ID for which {@link ZoneRules} can be obtained.
     *
     * Parsing matches the zone ID step by step as follows.
     *
     * * If the zone ID equals 'Z', the result is {@link ZoneOffset.UTC}.
     * * If the zone ID consists of a single letter, the zone ID is invalid
     *   and {@link DateTimeException} is thrown.
     * * If the zone ID starts with '+' or '-', the ID is parsed as a
     *   {@link ZoneOffset} using {@link ZoneOffset#of}.
     * * If the zone ID equals 'GMT', 'UTC' or 'UT' then the result is a {@link ZoneId}
     *   with the same ID and rules equivalent to {@link ZoneOffset.UTC}.
     * * If the zone ID starts with 'UTC+', 'UTC-', 'GMT+', 'GMT-', 'UT+' or 'UT-'
     *   then the ID is a prefixed offset-based ID. The ID is split in two, with
     *   a two or three letter prefix and a suffix starting with the sign.
     *   The suffix is parsed as a {@link ZoneOffset}.
     *   The result will be a {@link ZoneId} with the specified UTC/GMT/UT prefix
     *   and the normalized offset ID as per {@link ZoneOffset#getId}.
     *   The rules of the returned {@link ZoneId} will be equivalent to the
     *   parsed {@link ZoneOffset}.
     * * All other IDs are parsed as region-based zone IDs. Region IDs must
     *   match the regular expression `[A-Za-z][A-Za-z0-9~/._+-]+`,
     *   otherwise a {@link DateTimeException} is thrown. If the zone ID is not
     *   in the configured set of IDs, {@link ZoneRulesException} is thrown.
     *   The detailed format of the region ID depends on the group supplying the data.
     *   The default set of data is supplied by the IANA Time Zone Database (TZDB).
     *   This has region IDs of the form '{area}/{city}', such as 'Europe/Paris' or 'America/New_York'.
     *   This is compatible with most IDs from {@link java.util.TimeZone}.
     *
     * @param {string} zoneId  the time-zone ID, not null
     * @return {ZoneId} the zone ID, not null
     * @throws DateTimeException if the zone ID has an invalid format
     * @throws ZoneRulesException if the zone ID is a region ID that cannot be found
     */
    static of(zoneId) {
        // Find implementation at {@link ZoneIdFactory}
        throw new DateTimeException(`not supported operation${zoneId}`);
    }

    /**
     * Obtains an instance of {@link ZoneId} wrapping an offset.
     *
     * If the prefix is 'GMT', 'UTC', or 'UT' a {@link ZoneId}
     * with the prefix and the non-zero offset is returned.
     * If the prefix is empty `''` the {@link ZoneOffset} is returned.
     *
     * @param {string} prefix  the time-zone ID, not null
     * @param {ZoneOffset} offset  the offset, not null
     * @return {ZoneId} the zone ID, not null
     * @throws IllegalArgumentException if the prefix is not one of
     *     'GMT', 'UTC', or 'UT', or ''
     */
    static ofOffset(prefix, offset) {
        // Find implementation at {@link ZoneIdFactory}
        throw new DateTimeException(`not supported operation${prefix}${offset}`);
    }


    /**
     * Obtains an instance of {@link ZoneId} from a temporal object.
     *
     * A {@link TemporalAccessor} represents some form of date and time information.
     * This factory converts the arbitrary temporal object to an instance of {@link ZoneId}.
     *
     * The conversion will try to obtain the zone in a way that favours region-based
     * zones over offset-based zones using {@link TemporalQueries#zone}.
     *
     * This method matches the signature of the functional interface {@link TemporalQuery}
     * allowing it to be used in queries via method reference, {@link ZoneId::from}.
     *
     * @param {!TemporalAccessor} temporal - the temporal object to convert, not null
     * @return {ZoneId} the zone ID, not null
     * @throws DateTimeException if unable to convert to a {@link ZoneId}
     */
    static from(temporal) {
        // Find implementation at {@link ZoneIdFactory}
        throw new DateTimeException(`not supported operation${temporal}`);
    }

    //-----------------------------------------------------------------------
    /**
     * Gets the unique time-zone ID.
     *
     * This ID uniquely defines this object.
     * The format of an offset based ID is defined by {@link ZoneOffset#getId}.
     *
     * @return {String} the time-zone unique ID, not null
     */
    id(){
        abstractMethodFail('ZoneId.id');
    }

    //-----------------------------------------------------------------------
    /**
     * Gets the time-zone rules for this ID allowing calculations to be performed.
     *
     * The rules provide the functionality associated with a time-zone,
     * such as finding the offset for a given instant or local date-time.
     *
     * A time-zone can be invalid if it is deserialized in a Java Runtime which
     * does not have the same rules loaded as the Java Runtime that stored it.
     * In this case, calling this method will throw a {@link ZoneRulesException}.
     *
     * The rules are supplied by {@link ZoneRulesProvider}. An advanced provider may
     * support dynamic updates to the rules without restarting the Java Runtime.
     * If so, then the result of this method may change over time.
     * Each individual call will be still remain thread-safe.
     *
     * {@link ZoneOffset} will always return a set of rules where the offset never changes.
     *
     * @return {!ZoneRules} the rules, not null
     * @throws ZoneRulesException if no rules are available for this ID
     */
    rules(){
        abstractMethodFail('ZoneId.rules');
    }

    /**
      * Normalizes the time-zone ID, returning a {@link ZoneOffset} where possible.
      *
      * The returns a normalized {@link ZoneId} that can be used in place of this ID.
      * The result will have {@link ZoneRules} equivalent to those returned by this object,
      * however the ID returned by {@link getId} may be different.
      *
      * The normalization checks if the rules of this {@link ZoneId} have a fixed offset.
      * If they do, then the {@link ZoneOffset} equal to that offset is returned.
      * Otherwise `this` is returned.
      *
      * @return {ZoneId} the time-zone unique ID, not null
      */
    normalized() {
        const rules = this.rules();
        if (rules.isFixedOffset()) {
            return rules.offset(Instant.EPOCH);
        }
        //try {
        //} catch (ZoneRulesException ex) {
        //    // ignore invalid objects
        //}
        return this;
    }

    //-----------------------------------------------------------------------
    /**
      * Checks if this time-zone ID is equal to another time-zone ID.
      *
      * The comparison is based on the ID.
      *
      * @param {*} other  the object to check, null returns false
      * @return {boolean} true if this is equal to the other time-zone ID
      */
    equals(other) {
        if (this === other) {
            return true;
        }
        if (other instanceof ZoneId) {
            return this.id() === other.id();
        }
        return false;
    }

    /**
      * A hash code for this time-zone ID.
      *
      * @return {number} a suitable hash code
      */
    hashCode() {
        return StringUtil.hashCode(this.id());
    }

    //-----------------------------------------------------------------------
    /**
      * Outputs this zone as a string, using the ID.
      *
      * @return {string} a string representation of this time-zone ID, not null
      */
    toString() {
        return this.id();
    }

    /**
     * toJSON() use by JSON.stringify
     * delegates to toString()
     *
     * @return {string}
     */
    toJSON() {
        return this.toString();
    }
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { requireNonNull } from './assert';
import { DateTimeException, IllegalArgumentException } from './errors';
import { StringUtil } from './StringUtil';

import { ZoneOffset } from './ZoneOffset';
import { ZoneRegion } from './ZoneRegion';
import { ZoneId } from './ZoneId';

import { TemporalQueries } from './temporal/TemporalQueries';
import { SystemDefaultZoneId } from './zone/SystemDefaultZoneId';
import { ZoneRulesProvider } from './zone/ZoneRulesProvider';

/**
 * @see {@link ZoneId}
 *
 * Helper class to avoid dependency cycles.
 * Static methods of the class ZoneIdFactory are added automatically to class ZoneId.
 * @private
 */
export class ZoneIdFactory {

    /**
     * Gets the system default time-zone.
     *
     *
     * @return {ZoneId} the zone ID, not null
     */
    static systemDefault() {
        return SYSTEM_DEFAULT_ZONE_ID_INSTANCE;
    }

    /**
     * Gets the set of available zone IDs.
     *
     * This set includes the string form of all available region-based IDs.
     * Offset-based zone IDs are not included in the returned set.
     * The ID can be passed to {@link of} to create a {@link ZoneId}.
     *
     * The set of zone IDs can increase over time, although in a typical application
     * the set of IDs is fixed. Each call to this method is thread-safe.
     *
     * @return {string[]} a modifiable copy of the set of zone IDs, not null
     */
    static getAvailableZoneIds() {
        return ZoneRulesProvider.getAvailableZoneIds();
    }

    /**
     * Obtains an instance of {@link ZoneId} from an ID ensuring that the
     * ID is valid and available for use.
     *
     * This method parses the ID producing a {@link ZoneId} or {@link ZoneOffset}.
     * A {@link ZoneOffset} is returned if the ID is 'Z', or starts with '+' or '-'.
     * The result will always be a valid ID for which {@link ZoneRules} can be obtained.
     *
     * Parsing matches the zone ID step by step as follows.
     *
     * * If the zone ID equals 'Z', the result is {@link ZoneOffset.UTC}.
     * * If the zone ID consists of a single letter, the zone ID is invalid
     *   and {@link DateTimeException} is thrown.
     * * If the zone ID starts with '+' or '-', the ID is parsed as a
     *   {@link ZoneOffset} using {@link ZoneOffset#of}.
     * * If the zone ID equals 'GMT', 'UTC' or 'UT' then the result is a {@link ZoneId}
     *   with the same ID and rules equivalent to {@link ZoneOffset.UTC}.
     * * If the zone ID starts with 'UTC+', 'UTC-', 'GMT+', 'GMT-', 'UT+' or 'UT-'
     *   then the ID is a prefixed offset-based ID. The ID is split in two, with
     *   a two or three letter prefix and a suffix starting with the sign.
     *   The suffix is parsed as a {@link ZoneOffset}.
     *   The result will be a {@link ZoneId} with the specified UTC/GMT/UT prefix
     *   and the normalized offset ID as per {@link ZoneOffset#getId}.
     *   The rules of the returned {@link ZoneId} will be equivalent to the
     *   parsed {@link ZoneOffset}.
     * * All other IDs are parsed as region-based zone IDs. Region IDs must
     *   match the regular expression `[A-Za-z][A-Za-z0-9~/._+-]+`,
     *   otherwise a {@link DateTimeException} is thrown. If the zone ID is not
     *   in the configured set of IDs, {@link ZoneRulesException} is thrown.
     *   The detailed format of the region ID depends on the group supplying the data.
     *   The default set of data is supplied by the IANA Time Zone Database (TZDB).
     *   This has region IDs of the form '{area}/{city}', such as 'Europe/Paris' or 'America/New_York'.
     *   This is compatible with most IDs from {@link java.util.TimeZone}.
     *
     * @param {string} zoneId  the time-zone ID, not null
     * @return {ZoneId} the zone ID, not null
     * @throws DateTimeException if the zone ID has an invalid format
     * @throws ZoneRulesException if the zone ID is a region ID that cannot be found
     */
    static of(zoneId) {
        requireNonNull(zoneId, 'zoneId');
        if (zoneId === 'Z') {
            return ZoneOffset.UTC;
        }
        if (zoneId.length === 1) {
            throw new DateTimeException(`Invalid zone: ${zoneId}`);
        }
        if (StringUtil.startsWith(zoneId, '+') || StringUtil.startsWith(zoneId, '-')) {
            return ZoneOffset.of(zoneId);
        }
        if (zoneId === 'UTC' || zoneId === 'GMT' || zoneId === 'GMT0' || zoneId === 'UT') {
            return new ZoneRegion(zoneId, ZoneOffset.UTC.rules());
        }
        if (StringUtil.startsWith(zoneId, 'UTC+') || StringUtil.startsWith(zoneId, 'GMT+') ||
                StringUtil.startsWith(zoneId, 'UTC-') || StringUtil.startsWith(zoneId, 'GMT-')) {
            const offset = ZoneOffset.of(zoneId.substring(3));
            if (offset.totalSeconds() === 0) {
                return new ZoneRegion(zoneId.substring(0, 3), offset.rules());
            }
            return new ZoneRegion(zoneId.substring(0, 3) + offset.id(), offset.rules());
        }
        if (StringUtil.startsWith(zoneId, 'UT+') || StringUtil.startsWith(zoneId, 'UT-')) {
            const offset = ZoneOffset.of(zoneId.substring(2));
            if (offset.totalSeconds() === 0) {
                return new ZoneRegion('UT', offset.rules());
            }
            return new ZoneRegion(`UT${offset.id()}`, offset.rules());
        }
        // javascript special case
        if(zoneId === 'SYSTEM'){
            return ZoneId.systemDefault();
        }
        return ZoneRegion.ofId(zoneId);
    }

    /**
     * Obtains an instance of {@link ZoneId} wrapping an offset.
     *
     * If the prefix is 'GMT', 'UTC', or 'UT' a {@link ZoneId}
     * with the prefix and the non-zero offset is returned.
     * If the prefix is empty `''` the {@link ZoneOffset} is returned.
     *
     * @param {string} prefix  the time-zone ID, not null
     * @param {ZoneOffset} offset  the offset, not null
     * @return {ZoneId} the zone ID, not null
     * @throws IllegalArgumentException if the prefix is not one of
     *     'GMT', 'UTC', or 'UT', or ''
     */
    static ofOffset(prefix, offset) {
        requireNonNull(prefix, 'prefix');
        requireNonNull(offset, 'offset');
        if (prefix.length === 0) {
            return offset;
        }
        if (prefix === 'GMT' || prefix === 'UTC' || prefix === 'UT') {
            if (offset.totalSeconds() === 0) {
                return new ZoneRegion(prefix, offset.rules());
            }
            return new ZoneRegion(prefix + offset.id(), offset.rules());
        }
        throw new IllegalArgumentException(`Invalid prefix, must be GMT, UTC or UT: ${prefix}`);
    }


    /**
     * Obtains an instance of {@link ZoneId} from a temporal object.
     *
     * A {@link TemporalAccessor} represents some form of date and time information.
     * This factory converts the arbitrary temporal object to an instance of {@link ZoneId}.
     *
     * The conversion will try to obtain the zone in a way that favours region-based
     * zones over offset-based zones using {@link TemporalQueries#zone}.
     *
     * This method matches the signature of the functional interface {@link TemporalQuery}
     * allowing it to be used in queries via method reference, {@link ZoneId::from}.
     *
     * @param {!TemporalAccessor} temporal - the temporal object to convert, not null
     * @return {ZoneId} the zone ID, not null
     * @throws DateTimeException if unable to convert to a {@link ZoneId}
     */
    static from(temporal) {
        requireNonNull(temporal, 'temporal');
        const obj = temporal.query(TemporalQueries.zone());
        if (obj == null) {
            throw new DateTimeException(`Unable to obtain ZoneId from TemporalAccessor: ${ 
                temporal}, type ${temporal.constructor != null ? temporal.constructor.name : ''}`);
        }
        return obj;
    }
}

let SYSTEM_DEFAULT_ZONE_ID_INSTANCE = null;

export function _init(){
    SYSTEM_DEFAULT_ZONE_ID_INSTANCE = new SystemDefaultZoneId();

    // a bit magic to stay a bit more to the threeten bp impl.
    ZoneId.systemDefault = ZoneIdFactory.systemDefault;
    ZoneId.getAvailableZoneIds = ZoneIdFactory.getAvailableZoneIds;
    ZoneId.of = ZoneIdFactory.of;
    ZoneId.ofOffset = ZoneIdFactory.ofOffset;
    ZoneId.from = ZoneIdFactory.from;
    ZoneOffset.from = ZoneIdFactory.from;

    // short cut
    ZoneId.SYSTEM = SYSTEM_DEFAULT_ZONE_ID_INSTANCE;
    ZoneId.UTC = ZoneOffset.ofTotalSeconds(0);
}
/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { requireNonNull } from './assert';
import { DateTimeException } from './errors';
import { MathUtil } from './MathUtil';

import { LocalTime } from './LocalTime';
import { ZoneId } from './ZoneId';

import { ChronoField } from './temporal/ChronoField';
import { TemporalQueries } from './temporal/TemporalQueries';

import { ZoneRules } from './zone/ZoneRules';

const SECONDS_CACHE = {};
const ID_CACHE = {};

/**
 *
 * ### Static properties of Class {@link LocalDate}
 *
 * ZoneOffset.MAX_SECONDS = 18 * LocalTime.SECONDS_PER_HOUR;
 *
 * ZoneOffset.UTC = ZoneOffset.ofTotalSeconds(0);
 *
 * ZoneOffset.MIN = ZoneOffset.ofTotalSeconds(-ZoneOffset.MAX_SECONDS);
 *
 * ZoneOffset.MAX = ZoneOffset.ofTotalSeconds(ZoneOffset.MAX_SECONDS);
 *
 */
export class ZoneOffset extends ZoneId {
    /**
     *
     * @param {number} totalSeconds
     * @private
     */
    constructor(totalSeconds){
        super();
        ZoneOffset._validateTotalSeconds(totalSeconds);
        this._totalSeconds = MathUtil.safeToInt(totalSeconds);
        this._rules = ZoneRules.of(this);
        this._id = ZoneOffset._buildId(totalSeconds);
    }

    /**
     *
     * @returns {number}
     */
    totalSeconds() {
        return this._totalSeconds;
    }

    /**
     *
     * @returns {string}
     */
    id() {
        return this._id;
    }

    /**
     *
     * @param {number} totalSeconds
     * @returns {string}
     */
    static _buildId(totalSeconds) {
        if (totalSeconds === 0) {
            return 'Z';
        } else {
            const absTotalSeconds = Math.abs(totalSeconds);
            const absHours = MathUtil.intDiv(absTotalSeconds, LocalTime.SECONDS_PER_HOUR);
            const absMinutes = MathUtil.intMod(MathUtil.intDiv(absTotalSeconds, LocalTime.SECONDS_PER_MINUTE), LocalTime.MINUTES_PER_HOUR);
            let buf = `${totalSeconds < 0 ? '-' : '+'
            }${absHours < 10 ? '0' : ''}${absHours
            }${absMinutes < 10 ? ':0' : ':'}${absMinutes}`;
            const absSeconds = MathUtil.intMod(absTotalSeconds, LocalTime.SECONDS_PER_MINUTE);
            if (absSeconds !== 0) {
                buf += (absSeconds < 10 ? ':0' : ':') + (absSeconds);
            }
            return buf;
        }
    }


    /**
     *
     * @param {number} totalSeconds
     * @private
     */
    static _validateTotalSeconds(totalSeconds){
        if (Math.abs(totalSeconds) > ZoneOffset.MAX_SECONDS) {
            throw new DateTimeException('Zone offset not in valid range: -18:00 to +18:00');
        }
    }

    /**
     *
     * @param {number} hours
     * @param {number} minutes
     * @param {number} seconds
     * @private
     */
    static _validate(hours, minutes, seconds) {
        if (hours < -18 || hours > 18) {
            throw new DateTimeException(`Zone offset hours not in valid range: value ${hours 
            } is not in the range -18 to 18`);
        }
        if (hours > 0) {
            if (minutes < 0 || seconds < 0) {
                throw new DateTimeException('Zone offset minutes and seconds must be positive because hours is positive');
            }
        } else if (hours < 0) {
            if (minutes > 0 || seconds > 0) {
                throw new DateTimeException('Zone offset minutes and seconds must be negative because hours is negative');
            }
        } else if ((minutes > 0 && seconds < 0) || (minutes < 0 && seconds > 0)) {
            throw new DateTimeException('Zone offset minutes and seconds must have the same sign');
        }
        if (Math.abs(minutes) > 59) {
            throw new DateTimeException(`Zone offset minutes not in valid range: abs(value) ${ 
                Math.abs(minutes)} is not in the range 0 to 59`);
        }
        if (Math.abs(seconds) > 59) {
            throw new DateTimeException(`Zone offset seconds not in valid range: abs(value) ${ 
                Math.abs(seconds)} is not in the range 0 to 59`);
        }
        if (Math.abs(hours) === 18 && (Math.abs(minutes) > 0 || Math.abs(seconds) > 0)) {
            throw new DateTimeException('Zone offset not in valid range: -18:00 to +18:00');
        }
    }

    //-----------------------------------------------------------------------
    /**
     * Obtains an instance of {@link ZoneOffset} using the ID.
     *
     * This method parses the string ID of a {@link ZoneOffset} to
     * return an instance. The parsing accepts all the formats generated by
     * {@link getId}, plus some additional formats:
     *
     * * {@link Z} - for UTC
     * * `+h`
     * * `+hh`
     * * `+hh:mm`
     * * `-hh:mm`
     * * `+hhmm`
     * * `-hhmm`
     * * `+hh:mm:ss`
     * * `-hh:mm:ss`
     * * `+hhmmss`
     * * `-hhmmss`
     *
     * Note that &plusmn; means either the plus or minus symbol.
     *
     * The ID of the returned offset will be normalized to one of the formats
     * described by {@link getId}.
     *
     * The maximum supported range is from +18:00 to -18:00 inclusive.
     *
     * @param {string} offsetId  the offset ID, not null
     * @return {ZoneOffset} the zone-offset, not null
     * @throws DateTimeException if the offset ID is invalid
     */
    static of(offsetId) {
        requireNonNull(offsetId, 'offsetId');
        // "Z" is always in the cache
        const offset = ID_CACHE[offsetId];
        if (offset != null) {
            return offset;
        }

        // parse - +h, +hh, +hhmm, +hh:mm, +hhmmss, +hh:mm:ss
        let hours, minutes, seconds;
        switch (offsetId.length) {
            case 2:
                offsetId = `${offsetId[0]}0${offsetId[1]}`;  // fallthru
            // eslint-disable-next-line no-fallthrough
            case 3:
                hours = ZoneOffset._parseNumber(offsetId, 1, false);
                minutes = 0;
                seconds = 0;
                break;
            case 5:
                hours = ZoneOffset._parseNumber(offsetId, 1, false);
                minutes = ZoneOffset._parseNumber(offsetId, 3, false);
                seconds = 0;
                break;
            case 6:
                hours = ZoneOffset._parseNumber(offsetId, 1, false);
                minutes = ZoneOffset._parseNumber(offsetId, 4, true);
                seconds = 0;
                break;
            case 7:
                hours = ZoneOffset._parseNumber(offsetId, 1, false);
                minutes = ZoneOffset._parseNumber(offsetId, 3, false);
                seconds = ZoneOffset._parseNumber(offsetId, 5, false);
                break;
            case 9:
                hours = ZoneOffset._parseNumber(offsetId, 1, false);
                minutes = ZoneOffset._parseNumber(offsetId, 4, true);
                seconds = ZoneOffset._parseNumber(offsetId, 7, true);
                break;
            default:
                throw new DateTimeException(`Invalid ID for ZoneOffset, invalid format: ${offsetId}`);
        }
        const first = offsetId[0];
        if (first !== '+' && first !== '-') {
            throw new DateTimeException(`Invalid ID for ZoneOffset, plus/minus not found when expected: ${offsetId}`);
        }
        if (first === '-') {
            return ZoneOffset.ofHoursMinutesSeconds(-hours, -minutes, -seconds);
        } else {
            return ZoneOffset.ofHoursMinutesSeconds(hours, minutes, seconds);
        }
    }

    /**
     * Parse a two digit zero-prefixed number.
     *
     * @param {string} offsetId - the offset ID, not null
     * @param {number} pos - the position to parse, valid
     * @param {boolean} precededByColon - should this number be prefixed by a precededByColon
     * @return {number} the parsed number, from 0 to 99
     */
    static _parseNumber(offsetId, pos, precededByColon) {
        if (precededByColon && offsetId[pos - 1] !== ':') {
            throw new DateTimeException(`Invalid ID for ZoneOffset, colon not found when expected: ${offsetId}`);
        }
        const ch1 = offsetId[pos];
        const ch2 = offsetId[pos + 1];
        if (ch1 < '0' || ch1 > '9' || ch2 < '0' || ch2 > '9') {
            throw new DateTimeException(`Invalid ID for ZoneOffset, non numeric characters found: ${offsetId}`);
        }
        return (ch1.charCodeAt(0) - 48) * 10 + (ch2.charCodeAt(0) - 48);
    }

    /**
     *
     * @param {number} hours
     * @returns {ZoneOffset}
     */
    static ofHours(hours) {
        return ZoneOffset.ofHoursMinutesSeconds(hours, 0, 0);
    }

    /**
     *
     * @param {number} hours
     * @param {number} minutes
     * @returns {ZoneOffset}
     */
    static ofHoursMinutes(hours, minutes) {
        return ZoneOffset.ofHoursMinutesSeconds(hours, minutes, 0);
    }

    /**
     *
     * @param {number} hours
     * @param {number} minutes
     * @param {number} seconds
     * @returns {ZoneOffset}
     */
    static ofHoursMinutesSeconds(hours, minutes, seconds) {
        ZoneOffset._validate(hours, minutes, seconds);
        const totalSeconds = hours * LocalTime.SECONDS_PER_HOUR + minutes * LocalTime.SECONDS_PER_MINUTE + seconds;
        return ZoneOffset.ofTotalSeconds(totalSeconds);
    }

    /**
     *
     * @param {number} totalMinutes
     * @returns {ZoneOffset}
     */
    static ofTotalMinutes(totalMinutes) {
        const totalSeconds = totalMinutes * LocalTime.SECONDS_PER_MINUTE;
        return ZoneOffset.ofTotalSeconds(totalSeconds);
    }

    /**
     *
     * @param {number} totalSeconds
     * @returns {ZoneOffset}
     */
    static ofTotalSeconds(totalSeconds) {
        if (totalSeconds % (15 * LocalTime.SECONDS_PER_MINUTE) === 0) {
            const totalSecs = totalSeconds;
            let result = SECONDS_CACHE[totalSecs];
            if (result == null) {
                result = new ZoneOffset(totalSeconds);
                SECONDS_CACHE[totalSecs] = result;
                ID_CACHE[result.id()] = result;
            }
            return result;
        } else {
            return new ZoneOffset(totalSeconds);
        }
    }

    /**
     * Gets the associated time-zone rules.
     *
     * The rules will always return this offset when queried.
     * The implementation class is immutable, thread-safe and serializable.
     *
     * @return {ZoneRules} the rules, not null
     */
    rules() {
        return this._rules;
    }

    /**
      * Gets the value of the specified field from this offset as an `int`.
      *
      * This queries this offset for the value for the specified field.
      * The returned value will always be within the valid range of values for the field.
      * If it is not possible to return the value, because the field is not supported
      * or for some other reason, an exception is thrown.
      *
      * If the field is a {@link ChronoField} then the query is implemented here.
      * The {@link OFFSET_SECONDS} field returns the value of the offset.
      * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
      *
      * If the field is not a {@link ChronoField}, then the result of this method
      * is obtained by invoking {@link TemporalField.getFrom}
      * passing `this` as the argument. Whether the value can be obtained,
      * and what the value represents, is determined by the field.
      *
      * @param {TemporalField} field - the field to get, not null
      * @return {number} the value for the field
      * @throws DateTimeException if a value for the field cannot be obtained
      * @throws ArithmeticException if numeric overflow occurs
      */
    get(field) {
        return this.getLong(field);
    }

    /**
      * Gets the value of the specified field from this offset as a `long`.
      *
      * This queries this offset for the value for the specified field.
      * If it is not possible to return the value, because the field is not supported
      * or for some other reason, an exception is thrown.
      *
      * If the field is a {@link ChronoField} then the query is implemented here.
      * The {@link OFFSET_SECONDS} field returns the value of the offset.
      * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
      *
      * If the field is not a {@link ChronoField}, then the result of this method
      * is obtained by invoking {@link TemporalField.getFrom}
      * passing `this` as the argument. Whether the value can be obtained,
      * and what the value represents, is determined by the field.
      *
      * @param {TemporalField} field - the field to get, not null
      * @return {number} the value for the field
      * @throws DateTimeException if a value for the field cannot be obtained
      * @throws ArithmeticException if numeric overflow occurs
      */
    getLong(field) {
        if (field === ChronoField.OFFSET_SECONDS) {
            return this._totalSeconds;
        } else if (field instanceof ChronoField) {
            throw new DateTimeException(`Unsupported field: ${field}`);
        }
        return field.getFrom(this);
    }

    //-----------------------------------------------------------------------
    /**
      * Queries this offset using the specified query.
      *
      * This queries this offset using the specified query strategy object.
      * The {@link TemporalQuery} object defines the logic to be used to
      * obtain the result. Read the documentation of the query to understand
      * what the result of this method will be.
      *
      * The result of this method is obtained by invoking the
      * {@link TemporalQuery#queryFrom} method on the
      * specified query passing `this` as the argument.
      *
      * @param {TemporalQuery} query - the query to invoke, not null
      * @return {*} the query result, null may be returned (defined by the query)
      * @throws DateTimeException if unable to query (defined by the query)
      * @throws ArithmeticException if numeric overflow occurs (defined by the query)
      */
    query(query) {
        requireNonNull(query, 'query');
        if (query === TemporalQueries.offset() || query === TemporalQueries.zone()) {
            return this;
        } else if (query === TemporalQueries.localDate() || query === TemporalQueries.localTime() ||
                 query === TemporalQueries.precision() || query === TemporalQueries.chronology() || query === TemporalQueries.zoneId()) {
            return null;
        }
        return query.queryFrom(this);
    }

    /**
      * Adjusts the specified temporal object to have the same offset as this object.
      *
      * This returns a temporal object of the same observable type as the input
      * with the offset changed to be the same as this.
      *
      * The adjustment is equivalent to using {@link Temporal#with}
      * passing {@link ChronoField#OFFSET_SECONDS} as the field.
      *
      * In most cases, it is clearer to reverse the calling pattern by using
      * {@link Temporal#with}:
      * <pre>
      *   // these two lines are equivalent, but the second approach is recommended
      *   temporal = thisOffset.adjustInto(temporal);
      *   temporal = temporal.with(thisOffset);
      * </pre>
      *
      * This instance is immutable and unaffected by this method call.
      *
      * @param {Temporal} temporal - the target object to be adjusted, not null
      * @return {Temporal} the adjusted object, not null
      * @throws DateTimeException if unable to make the adjustment
      * @throws ArithmeticException if numeric overflow occurs
      */
    adjustInto(temporal) {
        return temporal.with(ChronoField.OFFSET_SECONDS, this._totalSeconds);
    }

    /**
     * Compares this offset to another offset in descending order.
     *
     * The offsets are compared in the order that they occur for the same time
     * of day around the world. Thus, an offset of `+10:00` comes before an
     * offset of `+09:00` and so on down to `-18:00`.
     *
     * The comparison is "consistent with equals", as defined by {@link Comparable}.
     *
     * @param {!ZoneOffset} other - the other date to compare to, not null
     * @return {number} the comparator value, negative if less, positive if greater
     * @throws NullPointerException if {@link other} is null
     */
    compareTo(other) {
        requireNonNull(other, 'other');
        return other._totalSeconds - this._totalSeconds;
    }


    /**
     * Checks if this offset is equal to another offset.
     *
     * The comparison is based on the amount of the offset in seconds.
     * This is equivalent to a comparison by ID.
     *
     * @param {*} obj - the object to check, null returns false
     * @return {boolean} true if this is equal to the other offset
     */
    equals(obj) {
        if (this === obj) {
            return true;
        }
        if (obj instanceof ZoneOffset) {
            return this._totalSeconds === obj._totalSeconds;
        }
        return false;
    }

    /**
     * @return {number}
     */
    hashCode(){
        return this._totalSeconds;
    }

    /**
     *
     * @returns {string}
     */
    toString(){
        return this._id;
    }
}

export function _init() {
    ZoneOffset.MAX_SECONDS = 18 * LocalTime.SECONDS_PER_HOUR;
    ZoneOffset.UTC = ZoneOffset.ofTotalSeconds(0);
    ZoneOffset.MIN = ZoneOffset.ofTotalSeconds(-ZoneOffset.MAX_SECONDS);
    ZoneOffset.MAX = ZoneOffset.ofTotalSeconds(ZoneOffset.MAX_SECONDS);
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */


import { ZoneId } from './ZoneId';
import { ZoneRulesProvider } from './zone/ZoneRulesProvider';

/**
 * A geographical region where the same time-zone rules apply.
 *
 * Time-zone information is categorized as a set of rules defining when and
 * how the offset from UTC/Greenwich changes. These rules are accessed using
 * identifiers based on geographical regions, such as countries or states.
 * The most common region classification is the Time Zone Database (TZDB),
 * which defines regions such as 'Europe/Paris' and 'Asia/Tokyo'.
 *
 * The region identifier, modeled by this class, is distinct from the
 * underlying rules, modeled by {@link ZoneRules}.
 * The rules are defined by governments and change frequently.
 * By contrast, the region identifier is well-defined and long-lived.
 * This separation also allows rules to be shared between regions if appropriate.
 *
 * ### Specification for implementors
 *
 * This class is immutable and thread-safe.
 */
export class ZoneRegion extends ZoneId {
    /**
     * not yet implemented
     * @param {string} zoneId
     * @return {ZoneId}
     */
    static ofId(zoneId){
        const rules = ZoneRulesProvider.getRules(zoneId);
        return new ZoneRegion(zoneId, rules);
    }

    //-------------------------------------------------------------------------
    /**
     * Constructor.
     *
     * @param {string} id  the time-zone ID, not null
     * @param {ZoneRules} rules  the rules, null for lazy lookup
     * @private
     */
    constructor(id, rules) {
        super();
        this._id = id;
        this._rules = rules;
    }

    //-----------------------------------------------------------------------
    /**
     *
     * @returns {string}
     */
    id() {
        return this._id;
    }

    /**
     *
     * @returns {ZoneRules}
     */
    rules() {
        return this._rules;
    }

}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { requireNonNull } from './assert';
import { DateTimeException, IllegalArgumentException } from './errors';
import { MathUtil } from './MathUtil';

import { Clock } from './Clock';
import { Instant } from './Instant';
import { LocalDate } from './LocalDate';
import { LocalDateTime } from './LocalDateTime';
import { LocalTime } from './LocalTime';
import { OffsetDateTime } from './OffsetDateTime';
import { ZoneId } from './ZoneId';
import { ZoneOffset } from './ZoneOffset';

import { ChronoZonedDateTime } from './chrono/ChronoZonedDateTime';
import { DateTimeFormatter } from './format/DateTimeFormatter';
import { ChronoField } from './temporal/ChronoField';
import { ChronoUnit } from './temporal/ChronoUnit';
import { createTemporalQuery } from './temporal/TemporalQuery';
import { TemporalQueries } from './temporal/TemporalQueries';

/**
 * A date-time with a time-zone in the ISO-8601 calendar system,
 * such as `2007-12-03T10:15:30+01:00 Europe/Paris`.
 *
 * `ZonedDateTime` is an immutable representation of a date-time with a time-zone.
 * This class stores all date and time fields, to a precision of nanoseconds,
 * and a time-zone, with a zone offset used to handle ambiguous local date-times.
 * For example, the value
 * '2nd October 2007 at 13:45.30.123456789 +02:00 in the Europe/Paris time-zone'
 * can be stored in a {@link ZonedDateTime}.
 *
 * This class handles conversion from the local time-line of {@link LocalDateTime}
 * to the instant time-line of {@link Instant}.
 * The difference between the two time-lines is the offset from UTC/Greenwich,
 * represented by a {@link ZoneOffset}.
 *
 * Converting between the two time-lines involves calculating the offset using the
 * {@link ZoneRules} rules accessed from the {@link ZoneId}.
 * Obtaining the offset for an instant is simple, as there is exactly one valid
 * offset for each instant. By contrast, obtaining the offset for a local date-time
 * is not straightforward. There are three cases:
 *
 * * Normal, with one valid offset. For the vast majority of the year, the normal
 *   case applies, where there is a single valid offset for the local date-time.
 * * Gap, with zero valid offsets. This is when clocks jump forward typically
 *   due to the spring daylight savings change from 'winter' to 'summer'.
 *   In a gap there are local date-time values with no valid offset.
 * * Overlap, with two valid offsets. This is when clocks are set back typically
 *   due to the autumn daylight savings change from 'summer' to 'winter'.
 *   In an overlap there are local date-time values with two valid offsets.
 *
 * Any method that converts directly or implicitly from a local date-time to an
 * instant by obtaining the offset has the potential to be complicated.
 *
 * For Gaps, the general strategy is that if the local date-time falls in the
 * middle of a Gap, then the resulting zoned date-time will have a local date-time
 * shifted forwards by the length of the Gap, resulting in a date-time in the later
 * offset, typically 'summer' time.
 *
 * For Overlaps, the general strategy is that if the local date-time falls in the
 * middle of an Overlap, then the previous offset will be retained. If there is no
 * previous offset, or the previous offset is invalid, then the earlier offset is
 * used, typically 'summer' time. Two additional methods,
 * {@link withEarlierOffsetAtOverlap} and {@link withLaterOffsetAtOverlap},
 * help manage the case of an overlap.
 *
 * ### Specification for implementors
 *
 * A {@link ZonedDateTime} holds state equivalent to three separate objects,
 * a {@link LocalDateTime}, a {@link ZoneId} and the resolved {@link ZoneOffset}.
 * The offset and local date-time are used to define an instant when necessary.
 * The zone ID is used to obtain the rules for how and when the offset changes.
 * The offset cannot be freely set, as the zone controls which offsets are valid.
 */
export class ZonedDateTime extends ChronoZonedDateTime {

    //-----------------------------------------------------------------------
    /**
     * Obtains the current date-time from the system clock in the specified time-zone or clock
     * or default time zone.
     *
     * This will query the system clock (see {@link Clock#systemDefaultZone}) in the default
     * time-zone to obtain the current date-time.
     * The zone and offset will be set based on the time-zone in the clock.
     *
     * Using this method will prevent the ability to use an alternate clock for testing
     * because the clock is hard-coded.
     *
     * @param {Clock|ZoneId} [clockOrZone=Clock.systemDefaultZone()]
     * @return {ZonedDateTime} the current date-time using the system clock, not null
     */
    static now(clockOrZone) {
        let clock;
        if(clockOrZone instanceof ZoneId){
            clock = Clock.system(clockOrZone);
        } else {
            clock = clockOrZone == null ? Clock.systemDefaultZone() : clockOrZone;
        }
        return ZonedDateTime.ofInstant(clock.instant(), clock.zone());
    }

    //-----------------------------------------------------------------------
    /**
     * function overloading for static {@link ZonedDateTime.of}
     *
     * if called with 2 (or less) args {@link ZonedDateTime.of2} is called,
     * if called with 3 args and the first arg is an instance of LocalDate {@link ZonedDateTime.of3} is called,
     * otherwise {@link ZonedDateTime.of8} is called.
     */
    static of(){
        if(arguments.length <= 2){
            return ZonedDateTime.of2.apply(this, arguments);
        } else if (arguments.length === 3 && arguments[0] instanceof LocalDate){
            return ZonedDateTime.of3.apply(this, arguments);
        } else {
            return ZonedDateTime.of8.apply(this, arguments);
        }
    }
    /**
     * Obtains an instance of {@link ZonedDateTime} from a local date and time.
     *
     * This creates a zoned date-time matching the input local date and time as closely as possible.
     * Time-zone rules, such as daylight savings, mean that not every local date-time
     * is valid for the specified zone, thus the local date-time may be adjusted.
     *
     * The local date time and first combined to form a local date-time.
     * The local date-time is then resolved to a single instant on the time-line.
     * This is achieved by finding a valid offset from UTC/Greenwich for the local
     * date-time as defined by the {@link ZoneRules} of the zone ID.
     *
     * In most cases, there is only one valid offset for a local date-time.
     * In the case of an overlap, when clocks are set back, there are two valid offsets.
     * This method uses the earlier offset typically corresponding to 'summer'.
     *
     * In the case of a gap, when clocks jump forward, there is no valid offset.
     * Instead, the local date-time is adjusted to be later by the length of the gap.
     * For a typical one hour daylight savings change, the local date-time will be
     * moved one hour later into the offset typically corresponding to 'summer'.
     *
     * @param {LocalDate} date - the local date, not null
     * @param {LocalTime} time - the local time, not null
     * @param {ZoneId} zone - the time-zone, not null
     * @return {ZonedDateTime} the offset date-time, not null
     */
    static of3(date, time, zone) {
        return ZonedDateTime.of2(LocalDateTime.of(date, time), zone);
    }

    /**
     * Obtains an instance of {@link ZonedDateTime} from a local date-time.
     *
     * This creates a zoned date-time matching the input local date-time as closely as possible.
     * Time-zone rules, such as daylight savings, mean that not every local date-time
     * is valid for the specified zone, thus the local date-time may be adjusted.
     *
     * The local date-time is resolved to a single instant on the time-line.
     * This is achieved by finding a valid offset from UTC/Greenwich for the local
     * date-time as defined by the {@link ZoneRules} of the zone ID.
     *
     * In most cases, there is only one valid offset for a local date-time.
     * In the case of an overlap, when clocks are set back, there are two valid offsets.
     * This method uses the earlier offset typically corresponding to 'summer'.
     *
     * In the case of a gap, when clocks jump forward, there is no valid offset.
     * Instead, the local date-time is adjusted to be later by the length of the gap.
     * For a typical one hour daylight savings change, the local date-time will be
     * moved one hour later into the offset typically corresponding to 'summer'.
     *
     * @param {!LocalDateTime} localDateTime - the local date-time, not null
     * @param {!ZoneId} zone - the time-zone, not null
     * @return {ZonedDateTime} the zoned date-time, not null
     */
    static of2(localDateTime, zone) {
        return ZonedDateTime.ofLocal(localDateTime, zone, null);
    }

    /**
     * Obtains an instance of {@link ZonedDateTime} from a year, month, day,
     * hour, minute, second, nanosecond and time-zone.
     *
     * This creates a zoned date-time matching the local date-time of the seven
     * specified fields as closely as possible.
     * Time-zone rules, such as daylight savings, mean that not every local date-time
     * is valid for the specified zone, thus the local date-time may be adjusted.
     *
     * The local date-time is resolved to a single instant on the time-line.
     * This is achieved by finding a valid offset from UTC/Greenwich for the local
     * date-time as defined by the {@link ZoneRules} of the zone ID.
     *
     * In most cases, there is only one valid offset for a local date-time.
     * In the case of an overlap, when clocks are set back, there are two valid offsets.
     * This method uses the earlier offset typically corresponding to 'summer'.
     *
     * In the case of a gap, when clocks jump forward, there is no valid offset.
     * Instead, the local date-time is adjusted to be later by the length of the gap.
     * For a typical one hour daylight savings change, the local date-time will be
     * moved one hour later into the offset typically corresponding to 'summer'.
     *
     * This method exists primarily for writing test cases.
     * Non test-code will typically use other methods to create an offset time.
     * {@link LocalDateTime} has five additional convenience variants of the
     * equivalent factory method taking fewer arguments.
     * They are not provided here to reduce the footprint of the API.
     *
     * @param {number} year - the year to represent, from MIN_YEAR to MAX_YEAR
     * @param {number} month - the month-of-year to represent, from 1 (January) to 12 (December)
     * @param {number} dayOfMonth - the day-of-month to represent, from 1 to 31
     * @param {number} hour - the hour-of-day to represent, from 0 to 23
     * @param {number} minute - the minute-of-hour to represent, from 0 to 59
     * @param {number} second - the second-of-minute to represent, from 0 to 59
     * @param {number} nanoOfSecond - the nano-of-second to represent, from 0 to 999,999,999
     * @param {ZoneId} zone - the time-zone, not null
     * @return {ZonedDateTime } the offset date-time, not null
     * @throws DateTimeException if the value of any field is out of range, or
     *  if the day-of-month is invalid for the month-year
     */
    static of8(
        year, month, dayOfMonth,
        hour, minute, second, nanoOfSecond, zone) {
        const dt = LocalDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoOfSecond);
        return ZonedDateTime.ofLocal(dt, zone, null);
    }

    /**
     * Obtains an instance of {@link ZonedDateTime} from a local date-time
     * using the preferred offset if possible.
     *
     * The local date-time is resolved to a single instant on the time-line.
     * This is achieved by finding a valid offset from UTC/Greenwich for the local
     * date-time as defined by the {@link ZoneRules} of the zone ID.
     *
     * In most cases, there is only one valid offset for a local date-time.
     * In the case of an overlap, where clocks are set back, there are two valid offsets.
     * If the preferred offset is one of the valid offsets then it is used.
     * Otherwise the earlier valid offset is used, typically corresponding to 'summer'.
     *
     * In the case of a gap, where clocks jump forward, there is no valid offset.
     * Instead, the local date-time is adjusted to be later by the length of the gap.
     * For a typical one hour daylight savings change, the local date-time will be
     * moved one hour later into the offset typically corresponding to 'summer'.
     *
     * @param {!LocalDateTime} localDateTime - the local date-time, not null
     * @param {!ZoneId} zone - the time-zone, not null
     * @param {ZoneOffset} preferredOffset - the zone offset, null if no preference
     * @return {ZonedDateTime} the zoned date-time, not null
     */
    static ofLocal(localDateTime, zone, preferredOffset) {
        requireNonNull(localDateTime, 'localDateTime');
        requireNonNull(zone, 'zone');
        if (zone instanceof ZoneOffset) {
            return new ZonedDateTime(localDateTime, zone, zone);
        }
        let offset = null;
        const rules = zone.rules();
        const validOffsets = rules.validOffsets(localDateTime);
        if (validOffsets.length === 1) {
            offset = validOffsets[0];
        } else if (validOffsets.length === 0) {
            const trans = rules.transition(localDateTime);
            localDateTime = localDateTime.plusSeconds(trans.duration().seconds());
            offset = trans.offsetAfter();
        } else {
            if (preferredOffset != null &&
                    validOffsets.some((validOffset) => {return validOffset.equals(preferredOffset);})) {
                offset = preferredOffset;
            } else {
                offset = requireNonNull(validOffsets[0], 'offset');  // protect against bad ZoneRules
            }
        }

        return new ZonedDateTime(localDateTime, offset, zone);
    }

    //-----------------------------------------------------------------------
    /**
     * function overloading for {@link ZonedDateTime.ofInstant}.
     * if called with 2 args {@link ZonedDateTime.ofInstant2} is called
     * otherwise {@link ZonedDateTime.ofInstant3}.
     */
    static ofInstant(){
        if (arguments.length === 2){
            return ZonedDateTime.ofInstant2.apply(this, arguments);
        } else {
            return ZonedDateTime.ofInstant3.apply(this, arguments);
        }
    }
    /**
     * Obtains an instance of {@link ZonedDateTime} from an {@link Instant}.
     *
     * This creates a zoned date-time with the same instant as that specified.
     * Calling {@link toInstant} will return an instant equal to the one used here.
     *
     * Converting an instant to a zoned date-time is simple as there is only one valid
     * offset for each instant.
     *
     * @param {!Instant} instant - the instant to create the date-time from, not null
     * @param {!ZoneId} zone - the time-zone, not null
     * @return {ZonedDateTime} the zoned date-time, not null
     * @throws DateTimeException if the result exceeds the supported range
     */
    static ofInstant2(instant, zone) {
        requireNonNull(instant, 'instant');
        requireNonNull(zone, 'zone');
        return ZonedDateTime._create(instant.epochSecond(), instant.nano(), zone);
    }

    /**
     * Obtains an instance of {@link ZonedDateTime} from the instant formed by combining
     * the local date-time and offset.
     *
     * This creates a zoned date-time by combining the {@link LocalDateTime} and {@link ZoneOffset}.
     * This combination uniquely specifies an instant without ambiguity.
     *
     * Converting an instant to a zoned date-time is simple as there is only one valid
     * offset for each instant. If the valid offset is different to the offset specified,
     * the the date-time and offset of the zoned date-time will differ from those specified.
     *
     * If the {@link ZoneId} to be used is a {@link ZoneOffset}, this method is equivalent
     * to {@link of}.
     *
     * @param {LocalDateTime} localDateTime - the local date-time, not null
     * @param {ZoneOffset} offset - the zone offset, not null
     * @param {ZoneId} zone - the time-zone, not null
     * @return {ZonedDateTime} the zoned date-time, not null
     */
    static ofInstant3(localDateTime, offset, zone) {
        requireNonNull(localDateTime, 'localDateTime');
        requireNonNull(offset, 'offset');
        requireNonNull(zone, 'zone');
        return ZonedDateTime._create(localDateTime.toEpochSecond(offset), localDateTime.nano(), zone);
    }

    /**
     * Obtains an instance of {@link ZonedDateTime} using seconds from the
     * epoch of 1970-01-01T00:00:00Z.
     *
     * @param {number} epochSecond - the number of seconds from the epoch of 1970-01-01T00:00:00Z
     * @param {number} nanoOfSecond - the nanosecond within the second, from 0 to 999,999,999
     * @param {ZoneId} zone - the time-zone, not null
     * @return {ZonedDateTime} the zoned date-time, not null
     * @throws DateTimeException if the result exceeds the supported range
     */
    static _create(epochSecond, nanoOfSecond, zone) {
        const rules = zone.rules();
        const instant = Instant.ofEpochSecond(epochSecond, nanoOfSecond);  // TODO: rules should be queryable by epochSeconds
        const offset = rules.offset(instant);
        const ldt = LocalDateTime.ofEpochSecond(epochSecond, nanoOfSecond, offset);
        return new ZonedDateTime(ldt, offset, zone);
    }

    //-----------------------------------------------------------------------
    /**
     * Obtains an instance of {@link ZonedDateTime} strictly validating the
     * combination of local date-time, offset and zone ID.
     *
     * This creates a zoned date-time ensuring that the offset is valid for the
     * local date-time according to the rules of the specified zone.
     * If the offset is invalid, an exception is thrown.
     *
     * @param {LocalDateTime} localDateTime - the local date-time, not null
     * @param {ZoneOffset} offset - the zone offset, not null
     * @param {ZoneId} zone - the time-zone, not null
     * @return {ZonedDateTime} the zoned date-time, not null
     */
    static ofStrict(localDateTime, offset, zone) {
        requireNonNull(localDateTime, 'localDateTime');
        requireNonNull(offset, 'offset');
        requireNonNull(zone, 'zone');
        const rules = zone.rules();
        if (rules.isValidOffset(localDateTime, offset) === false) {
            const trans = rules.transition(localDateTime);
            if (trans != null && trans.isGap()) {
                // error message says daylight savings for simplicity
                // even though there are other kinds of gaps
                throw new DateTimeException(`LocalDateTime ${localDateTime 
                } does not exist in zone ${zone 
                } due to a gap in the local time-line, typically caused by daylight savings`);
            }
            throw new DateTimeException(`ZoneOffset "${offset}" is not valid for LocalDateTime "${ 
                localDateTime}" in zone "${zone}"`);
        }
        return new ZonedDateTime(localDateTime, offset, zone);
    }

    /**
     * Obtains an instance of {@link ZonedDateTime} leniently, for advanced use cases,
     * allowing any combination of local date-time, offset and zone ID.
     *
     * This creates a zoned date-time with no checks other than no nulls.
     * This means that the resulting zoned date-time may have an offset that is in conflict
     * with the zone ID.
     *
     * This method is intended for advanced use cases.
     * For example, consider the case where a zoned date-time with valid fields is created
     * and then stored in a database or serialization-based store. At some later point,
     * the object is then re-loaded. However, between those points in time, the government
     * that defined the time-zone has changed the rules, such that the originally stored
     * local date-time now does not occur. This method can be used to create the object
     * in an 'invalid' state, despite the change in rules.
     *
     * @param {LocalDateTime} localDateTime - the local date-time, not null
     * @param {ZoneOffset} offset - the zone offset, not null
     * @param {ZoneId} zone - the time-zone, not null
     * @return {ZonedDateTime} the zoned date-time, not null
     */
    static ofLenient(localDateTime, offset, zone) {
        requireNonNull(localDateTime, 'localDateTime');
        requireNonNull(offset, 'offset');
        requireNonNull(zone, 'zone');
        if (zone instanceof ZoneOffset && offset.equals(zone) === false) {
            throw new IllegalArgumentException('ZoneId must match ZoneOffset');
        }
        return new ZonedDateTime(localDateTime, offset, zone);
    }

    //-----------------------------------------------------------------------
    /**
     * Obtains an instance of {@link ZonedDateTime} from a temporal object.
     *
     * A {@link TemporalAccessor} represents some form of date and time information.
     * This factory converts the arbitrary temporal object to an instance of {@link ZonedDateTime}.
     *
     * The conversion will first obtain a {@link ZoneId}. It will then try to obtain an instant.
     * If that fails it will try to obtain a local date-time.
     * The zoned date time will either be a combination of {@link ZoneId} and instant,
     * or {@link ZoneId} and local date-time.
     *
     * This method matches the signature of the functional interface {@link TemporalQuery}
     * allowing it to be used in queries via method reference, {@link ZonedDateTime::from}.
     *
     * @param {!TemporalAccessor} temporal - the temporal object to convert, not null
     * @return {ZonedDateTime} the zoned date-time, not null
     * @throws DateTimeException if unable to convert to an {@link ZonedDateTime}
     */
    static from(temporal) {
        requireNonNull(temporal, 'temporal');
        if (temporal instanceof ZonedDateTime) {
            return temporal;
        }
        const zone = ZoneId.from(temporal);
        if (temporal.isSupported(ChronoField.INSTANT_SECONDS)) {
            const zdt = ZonedDateTime._from(temporal, zone);
            if(zdt != null) return zdt;
        }
        const ldt = LocalDateTime.from(temporal);
        return ZonedDateTime.of2(ldt, zone);
    }

    static _from(temporal, zone){
        try {
            return ZonedDateTime.__from(temporal, zone);
        } catch (ex) {
            if(!(ex instanceof DateTimeException)) throw ex;
            // ignore
        }
    }

    static __from(temporal, zone){
        const epochSecond = temporal.getLong(ChronoField.INSTANT_SECONDS);
        const nanoOfSecond = temporal.get(ChronoField.NANO_OF_SECOND);
        return ZonedDateTime._create(epochSecond, nanoOfSecond, zone);
    }

    //-----------------------------------------------------------------------
    /**
     * Obtains an instance of {@link ZonedDateTime} from a text string such as
     * `2007-12-03T10:15:30+01:00[Europe/Paris]`.
     *
     * The string must represent a valid date-time and is parsed using
     * {@link org.threeten.bp.format.DateTimeFormatter#ISO_ZONED_DATE_TIME}.
     *
     * @param {!string} text - the text to parse such as '2007-12-03T10:15:30+01:00[Europe/Paris]', not null
     * @param {!DateTimeFormatter} [formatter=DateTimeFormatter.ISO_ZONED_DATE_TIME] - the formatter to use
     * @return {ZonedDateTime} the parsed zoned date-time, not null
     * @throws DateTimeParseException if the text cannot be parsed
     */
    static parse(text, formatter = DateTimeFormatter.ISO_ZONED_DATE_TIME) {
        requireNonNull(formatter, 'formatter');
        return formatter.parse(text, ZonedDateTime.FROM);
    }

    //-----------------------------------------------------------------------
    /**
     * Constructor.
     *
     * @param {LocalDateTime} dateTime - the date-time, validated as not null
     * @param {ZoneOffset} offset - the zone offset, validated as not null
     * @param {ZoneUd} zone - the time-zone, validated as not null
     * @private
     */
    constructor(dateTime, offset, zone) {
        requireNonNull(dateTime, 'dateTime');
        requireNonNull(offset, 'offset');
        requireNonNull(zone, 'zone');

        super();

        /**
         * The local date-time.
         */
        this._dateTime = dateTime;
        /**
         * The offset from UTC/Greenwich.
         */
        this._offset = offset;
        /**
         * The time-zone.
         */
        this._zone = zone;
    }

    /**
     * Resolves the new local date-time using this zone ID, retaining the offset if possible.
     *
     * @param {LocalDateTime} newDateTime - the new local date-time, not null
     * @return {ZonedDateTime} the zoned date-time, not null
     */
    _resolveLocal(newDateTime) {
        requireNonNull(newDateTime, 'newDateTime');
        return ZonedDateTime.ofLocal(newDateTime, this._zone, this._offset);
    }

    /**
     * Resolves the new local date-time using the offset to identify the instant.
     *
     * @param {LocalDateTime} newDateTime - the new local date-time, not null
     * @return {ZonedDateTime} the zoned date-time, not null
     */
    _resolveInstant(newDateTime) {
        return ZonedDateTime.ofInstant3(newDateTime, this._offset, this._zone);
    }

    /**
     * Resolves the offset into this zoned date-time.
     *
     * This ignores the offset, unless it can be used in an overlap.
     *
     * @param {ZoneOffset} offset - the offset, not null
     * @return {ZonedDateTime} the zoned date-time, not null
     */
    _resolveOffset(offset) {
        if (offset.equals(this._offset) === false && this._zone.rules().isValidOffset(this._dateTime, offset)) {
            return new ZonedDateTime(this._dateTime, offset, this._zone);
        }
        return this;
    }

    //-----------------------------------------------------------------------
    /**
     * Checks if the specified field is supported.
     *
     * This checks if this date-time can be queried for the specified field.
     * If false, then calling {@link range} and {@link get} will throw an exception.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields are:
     *
     * * {@link NANO_OF_SECOND}
     * * {@link NANO_OF_DAY}
     * * {@link MICRO_OF_SECOND}
     * * {@link MICRO_OF_DAY}
     * * {@link MILLI_OF_SECOND}
     * * {@link MILLI_OF_DAY}
     * * {@link SECOND_OF_MINUTE}
     * * {@link SECOND_OF_DAY}
     * * {@link MINUTE_OF_HOUR}
     * * {@link MINUTE_OF_DAY}
     * * {@link HOUR_OF_AMPM}
     * * {@link CLOCK_HOUR_OF_AMPM}
     * * {@link HOUR_OF_DAY}
     * * {@link CLOCK_HOUR_OF_DAY}
     * * {@link AMPM_OF_DAY}
     * * {@link DAY_OF_WEEK}
     * * {@link ALIGNED_DAY_OF_WEEK_IN_MONTH}
     * * {@link ALIGNED_DAY_OF_WEEK_IN_YEAR}
     * * {@link DAY_OF_MONTH}
     * * {@link DAY_OF_YEAR}
     * * {@link EPOCH_DAY}
     * * {@link ALIGNED_WEEK_OF_MONTH}
     * * {@link ALIGNED_WEEK_OF_YEAR}
     * * {@link MONTH_OF_YEAR}
     * * {@link EPOCH_MONTH}
     * * {@link YEAR_OF_ERA}
     * * {@link YEAR}
     * * {@link ERA}
     * * {@link INSTANT_SECONDS}
     * * {@link OFFSET_SECONDS}
     *
     * All other {@link ChronoField} instances will return false.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.isSupportedBy}
     * passing `this` as the argument.
     * Whether the field is supported is determined by the field.
     *
     * @param {TemporalField|TemporalUnit} fieldOrUnit - the field to check, null returns false
     * @return {boolean} true if the field is supported on this date-time, false if not
     */
    isSupported(fieldOrUnit) {
        if(fieldOrUnit instanceof ChronoField){
            return true;
        } else if (fieldOrUnit instanceof ChronoUnit) {
            return fieldOrUnit.isDateBased() || fieldOrUnit.isTimeBased();
        }
        return (fieldOrUnit != null && fieldOrUnit.isSupportedBy(this));
    }


    /**
     * Gets the range of valid values for the specified field.
     *
     * The range object expresses the minimum and maximum valid values for a field.
     * This date-time is used to enhance the accuracy of the returned range.
     * If it is not possible to return the range, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields (see {@link isSupported}) will return
     * appropriate range instances.
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.rangeRefinedBy}
     * passing `this` as the argument.
     * Whether the range can be obtained is determined by the field.
     *
     * @param {TemporalField} field - the field to query the range for, not null
     * @return {ValueRange} the range of valid values for the field, not null
     * @throws DateTimeException if the range for the field cannot be obtained
     */
    range(field) {
        if (field instanceof ChronoField) {
            if (field === ChronoField.INSTANT_SECONDS || field === ChronoField.OFFSET_SECONDS) {
                return field.range();
            }
            return this._dateTime.range(field);
        }
        return field.rangeRefinedBy(this);
    }

    /**
     * Gets the value of the specified field from this date-time as an `int`.
     *
     * This queries this date-time for the value for the specified field.
     * The returned value will always be within the valid range of values for the field.
     * If it is not possible to return the value, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields (see {@link isSupported}) will return valid
     * values based on this date-time, except {@link NANO_OF_DAY}, {@link MICRO_OF_DAY},
     * {@link EPOCH_DAY}, {@link EPOCH_MONTH} and {@link INSTANT_SECONDS} which are too
     * large to fit in an `int` and throw a {@link DateTimeException}.
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.getFrom}
     * passing `this` as the argument. Whether the value can be obtained,
     * and what the value represents, is determined by the field.
     *
     * @param {!TemporalField} field - the field to get, not null
     * @return {number} the value for the field
     * @throws DateTimeException if a value for the field cannot be obtained
     * @throws ArithmeticException if numeric overflow occurs
     */
    get(field) {
        return this.getLong(field);
    }

    /**
     * Gets the value of the specified field from this date-time as a `long`.
     *
     * This queries this date-time for the value for the specified field.
     * If it is not possible to return the value, because the field is not supported
     * or for some other reason, an exception is thrown.
     *
     * If the field is a {@link ChronoField} then the query is implemented here.
     * The supported fields (see {@link isSupported}) will return valid
     * values based on this date-time.
     * All other {@link ChronoField} instances will throw a {@link DateTimeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.getFrom}
     * passing `this` as the argument. Whether the value can be obtained,
     * and what the value represents, is determined by the field.
     *
     * @param {!TemporalField} field  the field to get, not null
     * @return {number} the value for the field
     * @throws DateTimeException if a value for the field cannot be obtained
     * @throws ArithmeticException if numeric overflow occurs
     */
    getLong(field) {
        if (field instanceof ChronoField) {
            switch (field) {
                case ChronoField.INSTANT_SECONDS: return this.toEpochSecond();
                case ChronoField.OFFSET_SECONDS: return this._offset.totalSeconds();
            }
            return this._dateTime.getLong(field);
        }
        requireNonNull(field, 'field');
        return field.getFrom(this);
    }

    //-----------------------------------------------------------------------
    /**
     * Gets the zone offset, such as '+01:00'.
     *
     * This is the offset of the local date-time from UTC/Greenwich.
     *
     * @return {ZoneOffset}the zone offset, not null
     */
    offset() {
        return this._offset;
    }

    /**
     * Returns a copy of this date-time changing the zone offset to the
     * earlier of the two valid offsets at a local time-line overlap.
     *
     * This method only has any effect when the local time-line overlaps, such as
     * at an autumn daylight savings cutover. In this scenario, there are two
     * valid offsets for the local date-time. Calling this method will return
     * a zoned date-time with the earlier of the two selected.
     *
     * If this method is called when it is not an overlap, `this`
     * is returned.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the earlier offset, not null
     */
    withEarlierOffsetAtOverlap() {
        const trans = this._zone.rules().transition(this._dateTime);
        if (trans != null && trans.isOverlap()) {
            const earlierOffset = trans.offsetBefore();
            if (earlierOffset.equals(this._offset) === false) {
                return new ZonedDateTime(this._dateTime, earlierOffset, this._zone);
            }
        }
        return this;
    }

    /**
     * Returns a copy of this date-time changing the zone offset to the
     * later of the two valid offsets at a local time-line overlap.
     *
     * This method only has any effect when the local time-line overlaps, such as
     * at an autumn daylight savings cutover. In this scenario, there are two
     * valid offsets for the local date-time. Calling this method will return
     * a zoned date-time with the later of the two selected.
     *
     * If this method is called when it is not an overlap, `this`
     * is returned.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the later offset, not null
     */
    withLaterOffsetAtOverlap() {
        const trans = this._zone.rules().transition(this.toLocalDateTime());
        if (trans != null) {
            const laterOffset = trans.offsetAfter();
            if (laterOffset.equals(this._offset) === false) {
                return new ZonedDateTime(this._dateTime, laterOffset, this._zone);
            }
        }
        return this;
    }

    //-----------------------------------------------------------------------
    /**
     * Gets the time-zone, such as 'Europe/Paris'.
     *
     * This returns the zone ID. This identifies the time-zone {@link ZoneRules}
     * that determine when and how the offset from UTC/Greenwich changes.
     *
     * The zone ID may be same as the offset (see {@link getOffset}).
     * If this is true, then any future calculations, such as addition or subtraction,
     * have no complex edge cases due to time-zone rules.
     * See also {@link withFixedOffsetZone}.
     *
     * @return {ZoneId} the time-zone, not null
     */
    zone() {
        return this._zone;
    }

    /**
     * Returns a copy of this date-time with a different time-zone,
     * retaining the local date-time if possible.
     *
     * This method changes the time-zone and retains the local date-time.
     * The local date-time is only changed if it is invalid for the new zone,
     * determined using the same approach as
     * {@link ofLocal}.
     *
     * To change the zone and adjust the local date-time,
     * use {@link withZoneSameInstant}.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {ZoneId} zone - the time-zone to change to, not null
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the requested zone, not null
     */
    withZoneSameLocal(zone) {
        requireNonNull(zone, 'zone');
        return this._zone.equals(zone) ? this : ZonedDateTime.ofLocal(this._dateTime, zone, this._offset);
    }

    /**
     * Returns a copy of this date-time with a different time-zone,
     * retaining the instant.
     *
     * This method changes the time-zone and retains the instant.
     * This normally results in a change to the local date-time.
     *
     * This method is based on retaining the same instant, thus gaps and overlaps
     * in the local time-line have no effect on the result.
     *
     * To change the offset while keeping the local time,
     * use {@link withZoneSameLocal}.
     *
     * @param {ZoneId} zone - the time-zone to change to, not null
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the requested zone, not null
     * @throws DateTimeException if the result exceeds the supported date range
     */
    withZoneSameInstant(zone) {
        requireNonNull(zone, 'zone');
        return this._zone.equals(zone) ? this :
            ZonedDateTime._create(this._dateTime.toEpochSecond(this._offset), this._dateTime.nano(), zone);
    }

    /**
     * Returns a copy of this date-time with the zone ID set to the offset.
     *
     * This returns a zoned date-time where the zone ID is the same as {@link getOffset}.
     * The local date-time, offset and instant of the result will be the same as in this date-time.
     *
     * Setting the date-time to a fixed single offset means that any future
     * calculations, such as addition or subtraction, have no complex edge cases
     * due to time-zone rules.
     * This might also be useful when sending a zoned date-time across a network,
     * as most protocols, such as ISO-8601, only handle offsets,
     * and not region-based zone IDs.
     *
     * This is equivalent to {@link ZonedDateTime.of}.
     *
     * @return {ZonedDateTime} a {@link ZonedDateTime} with the zone ID set to the offset, not null
     */
    withFixedOffsetZone() {
        return this._zone.equals(this._offset) ? this : new ZonedDateTime(this._dateTime, this._offset, this._offset);
    }

    //-----------------------------------------------------------------------
    /**
     * Gets the year field.
     *
     * This method returns the primitive `int` value for the year.
     *
     * The year returned by this method is proleptic as per {@link get}.
     * To obtain the year-of-era, use `get(YEAR_OF_ERA)`.
     *
     * @return {number} the year, from MIN_YEAR to MAX_YEAR
     */
    year() {
        return this._dateTime.year();
    }

    /**
     * Gets the month-of-year field from 1 to 12.
     *
     * This method returns the month as an `int` from 1 to 12.
     * Application code is frequently clearer if the enum {@link Month}
     * is used by calling {@link getMonth}.
     *
     * @return {number} the month-of-year, from 1 to 12
     * @see #month()
     */
    monthValue() {
        return this._dateTime.monthValue();
    }

    /**
     * Gets the month-of-year field using the {@link Month} enum.
     *
     * This method returns the enum {@link Month} for the month.
     * This avoids confusion as to what `int` values mean.
     * If you need access to the primitive `int` value, use {@link Month#getValue}.
     *
     * @return {Month} the month-of-year, not null
     * @see #getMonthValue()
     */
    month() {
        return this._dateTime.month();
    }

    /**
     * Gets the day-of-month field.
     *
     * This method returns the primitive `int` value for the day-of-month.
     *
     * @return {number} the day-of-month, from 1 to 31
     */
    dayOfMonth() {
        return this._dateTime.dayOfMonth();
    }

    /**
     * Gets the day-of-year field.
     *
     * This method returns the primitive `int` value for the day-of-year.
     *
     * @return {number} the day-of-year, from 1 to 365, or 366 in a leap year
     */
    dayOfYear() {
        return this._dateTime.dayOfYear();
    }

    /**
     * Gets the day-of-week field, which is an enum {@link DayOfWeek}.
     *
     * This method returns the enum {@link DayOfWeek} for the day-of-week.
     * This avoids confusion as to what `int` values mean.
     * If you need access to the primitive `int` value, use {@link DayOfWeek#getValue}.
     *
     * Additional information can be obtained from the {@link DayOfWeek}.
     * This includes textual names of the values.
     *
     * @return {DayOfWeek} the day-of-week, not null
     */
    dayOfWeek() {
        return this._dateTime.dayOfWeek();
    }

    //-----------------------------------------------------------------------
    /**
     * Gets the hour-of-day field.
     *
     * @return {number} the hour-of-day, from 0 to 23
     */
    hour() {
        return this._dateTime.hour();
    }

    /**
     * Gets the minute-of-hour field.
     *
     * @return {number} the minute-of-hour, from 0 to 59
     */
    minute() {
        return this._dateTime.minute();
    }

    /**
     * Gets the second-of-minute field.
     *
     * @return {number} the second-of-minute, from 0 to 59
     */
    second() {
        return this._dateTime.second();
    }

    /**
     * Gets the nano-of-second field.
     *
     * @return {number} the nano-of-second, from 0 to 999,999,999
     */
    nano() {
        return this._dateTime.nano();
    }

    //-----------------------------------------------------------------------

    /**
     * Returns an adjusted copy of this date-time.
     *
     * This returns a new {@link ZonedDateTime}, based on this one, with the date-time adjusted.
     * The adjustment takes place using the specified adjuster strategy object.
     * Read the documentation of the adjuster to understand what adjustment will be made.
     *
     * A simple adjuster might simply set the one of the fields, such as the year field.
     * A more complex adjuster might set the date to the last day of the month.
     * A selection of common adjustments is provided in {@link TemporalAdjusters}.
     * These include finding the 'last day of the month' and 'next Wednesday'.
     * Key date-time classes also implement the {@link TemporalAdjuster} interface,
     * such as {@link Month} and {@link MonthDay}.
     * The adjuster is responsible for handling special cases, such as the varying
     * lengths of month and leap years.
     *
     * For example this code returns a date on the last day of July:
     * <pre>
     *  import static org.threeten.bp.Month.*;
     *  import static org.threeten.bp.temporal.Adjusters.*;
     *
     *  result = zonedDateTime.with(JULY).with(lastDayOfMonth());
     * </pre>
     *
     * The classes {@link LocalDate} and {@link LocalTime} implement {@link TemporalAdjuster},
     * thus this method can be used to change the date, time or offset:
     * <pre>
     *  result = zonedDateTime.with(date);
     *  result = zonedDateTime.with(time);
     * </pre>
     *
     * {@link ZoneOffset} also implements {@link TemporalAdjuster} however it is less likely
     * that setting the offset will have the effect you expect. When an offset is passed in,
     * the local date-time is combined with the new offset to form an {@link Instant}.
     * The instant and original zone are then used to create the result.
     * This algorithm means that it is quite likely that the output has a different offset
     * to the specified offset. It will however work correctly when passing in the offset
     * applicable for the instant of the zoned date-time, and will work correctly if passing
     * one of the two valid offsets during a daylight savings overlap when the same local time
     * occurs twice.
     *
     * The result of this method is obtained by invoking the
     * {@link TemporalAdjuster#adjustInto} method on the
     * specified adjuster passing `this` as the argument.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {TemporalAdjuster} adjuster - the adjuster to use, not null
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on `this` with the adjustment made, not null
     * @throws DateTimeException if the adjustment cannot be made
     * @throws ArithmeticException if numeric overflow occurs
     */
    _withAdjuster(adjuster) {
        // optimizations
        if (adjuster instanceof LocalDate) {
            return this._resolveLocal(LocalDateTime.of(adjuster, this._dateTime.toLocalTime()));
        } else if (adjuster instanceof LocalTime) {
            return this._resolveLocal(LocalDateTime.of(this._dateTime.toLocalDate(), adjuster));
        } else if (adjuster instanceof LocalDateTime) {
            return this._resolveLocal(adjuster);
        } else if (adjuster instanceof Instant) {
            const instant = adjuster;
            return ZonedDateTime._create(instant.epochSecond(), instant.nano(), this._zone);
        } else if (adjuster instanceof ZoneOffset) {
            return this._resolveOffset(adjuster);
        }
        return super._withAdjuster(adjuster);
    }

    /**
     * Returns a copy of this date-time with the specified field set to a new value.
     *
     * This returns a {@link ZonedDateTime}, based on this one, with the value
     * for the specified field changed.
     * This can be used to change any supported field, such as the year, month or day-of-month.
     * If it is not possible to set the value, because the field is not supported or for
     * some other reason, an exception is thrown.
     *
     * In some cases, changing the specified field can cause the resulting date-time to become invalid,
     * such as changing the month from 31st January to February would make the day-of-month invalid.
     * In cases like this, the field is responsible for resolving the date. Typically it will choose
     * the previous valid date, which would be the last valid day of February in this example.
     *
     * If the field is a {@link ChronoField} then the adjustment is implemented here.
     *
     * The {@link INSTANT_SECONDS} field will return a date-time with the specified instant.
     * The zone and nano-of-second are unchanged.
     * The result will have an offset derived from the new instant and original zone.
     * If the new instant value is outside the valid range then a {@link DateTimeException} will be thrown.
     *
     * The {@link OFFSET_SECONDS} field will typically be ignored.
     * The offset of a {@link ZonedDateTime} is controlled primarily by the time-zone.
     * As such, changing the offset does not generally make sense, because there is only
     * one valid offset for the local date-time and zone.
     * If the zoned date-time is in a daylight savings overlap, then the offset is used
     * to switch between the two valid offsets. In all other cases, the offset is ignored.
     * If the new offset value is outside the valid range then a {@link DateTimeException} will be thrown.
     *
     * The other supported fields (see {@link isSupported}) will behave as in {@link LocalDateTime#with}.
     * The zone is not part of the calculation and will be unchanged.
     * When converting back to {@link ZonedDateTime}, if the local date-time is in an overlap,
     * then the offset will be retained if possible, otherwise the earlier offset will be used.
     * If in a gap, the local date-time will be adjusted forward by the length of the gap.
     *
     * All other {@link ChronoField} instances will throw an {@link UnsupportedTemporalTypeException}.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.adjustInto}
     * passing `this` as the argument. In this case, the field determines
     * whether and how to adjust the instant.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {TemporalField} field - the field to set in the result, not null
     * @param {number} newValue - the new value of the field in the result
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on `this` with the specified field set, not null
     * @throws DateTimeException if the field cannot be set
     * @throws UnsupportedTemporalTypeException if the field is not supported
     * @throws ArithmeticException if numeric overflow occurs
     */
    _withField(field, newValue) {
        if (field instanceof ChronoField) {
            switch (field) {
                case ChronoField.INSTANT_SECONDS: return ZonedDateTime._create(newValue, this.nano(), this._zone);
                case ChronoField.OFFSET_SECONDS: {
                    const offset = ZoneOffset.ofTotalSeconds(field.checkValidIntValue(newValue));
                    return this._resolveOffset(offset);
                }
            }
            return this._resolveLocal(this._dateTime.with(field, newValue));
        }
        return field.adjustInto(this, newValue);
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this {@link ZonedDateTime} with the year value altered.
     *
     * This operates on the local time-line,
     * changing the year (see {@link LocalDateTime#withYear}) of the local date-time.
     * This is then converted back to a {@link ZonedDateTime}, using the zone ID
     * to obtain the offset.
     *
     * When converting back to {@link ZonedDateTime}, if the local date-time is in an overlap,
     * then the offset will be retained if possible, otherwise the earlier offset will be used.
     * If in a gap, the local date-time will be adjusted forward by the length of the gap.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} year - the year to set in the result, from MIN_YEAR to MAX_YEAR
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the requested year, not null
     * @throws DateTimeException if the year value is invalid
     */
    withYear(year) {
        return this._resolveLocal(this._dateTime.withYear(year));
    }

    /**
     * Returns a copy of this {@link ZonedDateTime} with the month-of-year value altered.
     *
     * This operates on the local time-line,
     * changing the month (see {@link LocalDateTime#withMonth}) of the local date-time.
     * This is then converted back to a {@link ZonedDateTime}, using the zone ID
     * to obtain the offset.
     *
     * When converting back to {@link ZonedDateTime}, if the local date-time is in an overlap,
     * then the offset will be retained if possible, otherwise the earlier offset will be used.
     * If in a gap, the local date-time will be adjusted forward by the length of the gap.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} month - the month-of-year to set in the result, from 1 (January) to 12 (December)
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the requested month, not null
     * @throws DateTimeException if the month-of-year value is invalid
     */
    withMonth(month) {
        return this._resolveLocal(this._dateTime.withMonth(month));
    }

    /**
     * Returns a copy of this {@link ZonedDateTime} with the day-of-month value altered.
     *
     * This operates on the local time-line,
     * changing the day-of-month (see {@link LocalDateTime#withDayOfMonth}) of the local date-time.
     * This is then converted back to a {@link ZonedDateTime}, using the zone ID
     * to obtain the offset.
     *
     * When converting back to {@link ZonedDateTime}, if the local date-time is in an overlap,
     * then the offset will be retained if possible, otherwise the earlier offset will be used.
     * If in a gap, the local date-time will be adjusted forward by the length of the gap.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} dayOfMonth - the day-of-month to set in the result, from 1 to 28-31
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the requested day, not null
     * @throws DateTimeException if the day-of-month value is invalid
     * @throws DateTimeException if the day-of-month is invalid for the month-year
     */
    withDayOfMonth(dayOfMonth) {
        return this._resolveLocal(this._dateTime.withDayOfMonth(dayOfMonth));
    }

    /**
     * Returns a copy of this {@link ZonedDateTime} with the day-of-year altered.
     *
     * This operates on the local time-line,
     * changing the day-of-year (see {@link LocalDateTime#withDayOfYear}) of the local date-time.
     * This is then converted back to a {@link ZonedDateTime}, using the zone ID
     * to obtain the offset.
     *
     * When converting back to {@link ZonedDateTime}, if the local date-time is in an overlap,
     * then the offset will be retained if possible, otherwise the earlier offset will be used.
     * If in a gap, the local date-time will be adjusted forward by the length of the gap.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} dayOfYear - the day-of-year to set in the result, from 1 to 365-366
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date with the requested day, not null
     * @throws DateTimeException if the day-of-year value is invalid
     * @throws DateTimeException if the day-of-year is invalid for the year
     */
    withDayOfYear(dayOfYear) {
        return this._resolveLocal(this._dateTime.withDayOfYear(dayOfYear));
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this {@link ZonedDateTime} with the hour-of-day value altered.
     *
     * This operates on the local time-line,
     * changing the time (see {@link LocalDateTime#withHour}) of the local date-time.
     * This is then converted back to a {@link ZonedDateTime}, using the zone ID
     * to obtain the offset.
     *
     * When converting back to {@link ZonedDateTime}, if the local date-time is in an overlap,
     * then the offset will be retained if possible, otherwise the earlier offset will be used.
     * If in a gap, the local date-time will be adjusted forward by the length of the gap.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} hour - the hour-of-day to set in the result, from 0 to 23
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the requested hour, not null
     * @throws DateTimeException if the hour value is invalid
     */
    withHour(hour) {
        return this._resolveLocal(this._dateTime.withHour(hour));
    }

    /**
     * Returns a copy of this {@link ZonedDateTime} with the minute-of-hour value altered.
     *
     * This operates on the local time-line,
     * changing the time (see {@link LocalDateTime#withMinute}) of the local date-time.
     * This is then converted back to a {@link ZonedDateTime}, using the zone ID
     * to obtain the offset.
     *
     * When converting back to {@link ZonedDateTime}, if the local date-time is in an overlap,
     * then the offset will be retained if possible, otherwise the earlier offset will be used.
     * If in a gap, the local date-time will be adjusted forward by the length of the gap.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} minute - the minute-of-hour to set in the result, from 0 to 59
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the requested minute, not null
     * @throws DateTimeException if the minute value is invalid
     */
    withMinute(minute) {
        return this._resolveLocal(this._dateTime.withMinute(minute));
    }

    /**
     * Returns a copy of this {@link ZonedDateTime} with the second-of-minute value altered.
     *
     * This operates on the local time-line,
     * changing the time (see {@link LocalDateTime#withSecond}) of the local date-time.
     * This is then converted back to a {@link ZonedDateTime}, using the zone ID
     * to obtain the offset.
     *
     * When converting back to {@link ZonedDateTime}, if the local date-time is in an overlap,
     * then the offset will be retained if possible, otherwise the earlier offset will be used.
     * If in a gap, the local date-time will be adjusted forward by the length of the gap.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} second - the second-of-minute to set in the result, from 0 to 59
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the requested second, not null
     * @throws DateTimeException if the second value is invalid
     */
    withSecond(second) {
        return this._resolveLocal(this._dateTime.withSecond(second));
    }

    /**
     * Returns a copy of this {@link ZonedDateTime} with the nano-of-second value altered.
     *
     * This operates on the local time-line,
     * changing the time (see {@link LocalDateTime#withNano}) of the local date-time.
     * This is then converted back to a {@link ZonedDateTime}, using the zone ID
     * to obtain the offset.
     *
     * When converting back to {@link ZonedDateTime}, if the local date-time is in an overlap,
     * then the offset will be retained if possible, otherwise the earlier offset will be used.
     * If in a gap, the local date-time will be adjusted forward by the length of the gap.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} nanoOfSecond - the nano-of-second to set in the result, from 0 to 999,999,999
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the requested nanosecond, not null
     * @throws DateTimeException if the nano value is invalid
     */
    withNano(nanoOfSecond) {
        return this._resolveLocal(this._dateTime.withNano(nanoOfSecond));
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this {@link ZonedDateTime} with the time truncated.
     *
     * Truncation returns a copy of the original date-time with fields
     * smaller than the specified unit set to zero.
     * For example, truncating with {@link ChronoUnit#MINUTES}
     * will set the second-of-minute and nano-of-second field to zero.
     *
     * The unit must have a duration (see {@link TemporalUnit#getDuration})
     * that divides into the length of a standard day without remainder.
     * This includes all supplied time units on {@link ChronoUnit} and
     * {@link ChronoUnit#DAYS}. Other units throw an exception.
     *
     * This operates on the local time-line, truncating the underlying local date-time.
     * This is then converted back to a {@link ZonedDateTime}, using the zone ID to obtain the offset.
     *
     * When converting back to {@link ZonedDateTime}, if the local date-time is in an overlap,
     * then the offset will be retained if possible, otherwise the earlier offset will be used.
     * If in a gap, the local date-time will be adjusted forward by the length of the gap.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {TemporalUnit} unit - the unit to truncate to, not null
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the time truncated, not null
     * @throws DateTimeException if unable to truncate
     */
    truncatedTo(unit) {
        return this._resolveLocal(this._dateTime.truncatedTo(unit));
    }

    //-----------------------------------------------------------------------

    /**
     * Returns a copy of this date-time with the specified period added.
     *
     * This method returns a new date-time based on this date-time with the specified period added.
     * This can be used to add any period that is defined by a unit, for example to add years, months or days.
     * The unit is responsible for the details of the calculation, including the resolution
     * of any edge cases in the calculation.
     *
     * The calculation for date and time units differ.
     *
     * Date units operate on the local time-line.
     * The period is first added to the local date-time, then converted back
     * to a zoned date-time using the zone ID.
     * The conversion uses {@link ofLocal}
     * with the offset before the addition.
     *
     * Time units operate on the instant time-line.
     * The period is first added to the local date-time, then converted back to
     * a zoned date-time using the zone ID.
     * The conversion uses {@link ofInstant}
     * with the offset before the addition.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} amountToAdd - the amount of the unit to add to the result, may be negative
     * @param {TemporalUnit} unit - the unit of the period to add, not null
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the specified period added, not null
     * @throws DateTimeException if the unit cannot be added to this type
     */
    _plusUnit(amountToAdd, unit) {
        if (unit instanceof ChronoUnit) {
            if (unit.isDateBased()) {
                return this._resolveLocal(this._dateTime.plus(amountToAdd, unit));
            } else {
                return this._resolveInstant(this._dateTime.plus(amountToAdd, unit));
            }
        }
        requireNonNull(unit, 'unit');
        return unit.addTo(this, amountToAdd);
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this {@link ZonedDateTime} with the specified period in years added.
     *
     * This operates on the local time-line, adding years to the local date-time.
     * This is then converted back to a {@link ZonedDateTime}, using the zone ID
     * to obtain the offset.
     *
     * When converting back to {@link ZonedDateTime}, if the local date-time is in an overlap,
     * then the offset will be retained if possible, otherwise the earlier offset will be used.
     * If in a gap, the local date-time will be adjusted forward by the length of the gap.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} years - the years to add, may be negative
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the years added, not null
     * @throws DateTimeException if the result exceeds the supported date range
     */
    plusYears(years) {
        return this._resolveLocal(this._dateTime.plusYears(years));
    }

    /**
     * Returns a copy of this {@link ZonedDateTime} with the specified period in months added.
     *
     * This operates on the local time-line, adding months to the local date-time.
     * This is then converted back to a {@link ZonedDateTime}, using the zone ID
     * to obtain the offset.
     *
     * When converting back to {@link ZonedDateTime}, if the local date-time is in an overlap,
     * then the offset will be retained if possible, otherwise the earlier offset will be used.
     * If in a gap, the local date-time will be adjusted forward by the length of the gap.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} months - the months to add, may be negative
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the months added, not null
     * @throws DateTimeException if the result exceeds the supported date range
     */
    plusMonths(months) {
        return this._resolveLocal(this._dateTime.plusMonths(months));
    }

    /**
     * Returns a copy of this {@link ZonedDateTime} with the specified period in weeks added.
     *
     * This operates on the local time-line, adding weeks to the local date-time.
     * This is then converted back to a {@link ZonedDateTime}, using the zone ID
     * to obtain the offset.
     *
     * When converting back to {@link ZonedDateTime}, if the local date-time is in an overlap,
     * then the offset will be retained if possible, otherwise the earlier offset will be used.
     * If in a gap, the local date-time will be adjusted forward by the length of the gap.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} weeks - the weeks to add, may be negative
     * @return {ZonedDateTime}a {@link ZonedDateTime} based on this date-time with the weeks added, not null
     * @throws DateTimeException if the result exceeds the supported date range
     */
    plusWeeks(weeks) {
        return this._resolveLocal(this._dateTime.plusWeeks(weeks));
    }

    /**
     * Returns a copy of this {@link ZonedDateTime} with the specified period in days added.
     *
     * This operates on the local time-line, adding days to the local date-time.
     * This is then converted back to a {@link ZonedDateTime}, using the zone ID
     * to obtain the offset.
     *
     * When converting back to {@link ZonedDateTime}, if the local date-time is in an overlap,
     * then the offset will be retained if possible, otherwise the earlier offset will be used.
     * If in a gap, the local date-time will be adjusted forward by the length of the gap.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} days - the days to add, may be negative
     * @return {ZonedDateTime}a {@link ZonedDateTime} based on this date-time with the days added, not null
     * @throws DateTimeException if the result exceeds the supported date range
     */
    plusDays(days) {
        return this._resolveLocal(this._dateTime.plusDays(days));
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this {@link ZonedDateTime} with the specified period in hours added.
     *
     * This operates on the instant time-line, such that adding one hour will
     * always be a duration of one hour later.
     * This may cause the local date-time to change by an amount other than one hour.
     * Note that this is a different approach to that used by days, months and years,
     * thus adding one day is not the same as adding 24 hours.
     *
     * For example, consider a time-zone where the spring DST cutover means that the
     * local times 01:00 to 01:59 occur twice changing from offset +02:00 to +01:00.
     *
     * * Adding one hour to 00:30+02:00 will result in 01:30+02:00
     * * Adding one hour to 01:30+02:00 will result in 01:30+01:00
     * * Adding one hour to 01:30+01:00 will result in 02:30+01:00
     * * Adding three hours to 00:30+02:00 will result in 02:30+01:00
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} hours - the hours to add, may be negative
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the hours added, not null
     * @throws DateTimeException if the result exceeds the supported date range
     */
    plusHours(hours) {
        return this._resolveInstant(this._dateTime.plusHours(hours));
    }

    /**
     * Returns a copy of this {@link ZonedDateTime} with the specified period in minutes added.
     *
     * This operates on the instant time-line, such that adding one minute will
     * always be a duration of one minute later.
     * This may cause the local date-time to change by an amount other than one minute.
     * Note that this is a different approach to that used by days, months and years.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} minutes - the minutes to add, may be negative
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the minutes added, not null
     * @throws DateTimeException if the result exceeds the supported date range
     */
    plusMinutes(minutes) {
        return this._resolveInstant(this._dateTime.plusMinutes(minutes));
    }

    /**
     * Returns a copy of this {@link ZonedDateTime} with the specified period in seconds added.
     *
     * This operates on the instant time-line, such that adding one second will
     * always be a duration of one second later.
     * This may cause the local date-time to change by an amount other than one second.
     * Note that this is a different approach to that used by days, months and years.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} seconds - the seconds to add, may be negative
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the seconds added, not null
     * @throws DateTimeException if the result exceeds the supported date range
     */
    plusSeconds(seconds) {
        return this._resolveInstant(this._dateTime.plusSeconds(seconds));
    }

    /**
     * Returns a copy of this {@link ZonedDateTime} with the specified period in nanoseconds added.
     *
     * This operates on the instant time-line, such that adding one nano will
     * always be a duration of one nano later.
     * This may cause the local date-time to change by an amount other than one nano.
     * Note that this is a different approach to that used by days, months and years.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} nanos - the nanos to add, may be negative
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the nanoseconds added, not null
     * @throws DateTimeException if the result exceeds the supported date range
     */
    plusNanos(nanos) {
        return this._resolveInstant(this._dateTime.plusNanos(nanos));
    }

    //-----------------------------------------------------------------------

    /**
     * Returns a copy of this date-time with the specified period subtracted.
     *
     * This method returns a new date-time based on this date-time with the specified period subtracted.
     * This can be used to subtract any period that is defined by a unit, for example to subtract years, months or days.
     * The unit is responsible for the details of the calculation, including the resolution
     * of any edge cases in the calculation.
     *
     * The calculation for date and time units differ.
     *
     * Date units operate on the local time-line.
     * The period is first subtracted from the local date-time, then converted back
     * to a zoned date-time using the zone ID.
     * The conversion uses {@link ofLocal}
     * with the offset before the subtraction.
     *
     * Time units operate on the instant time-line.
     * The period is first subtracted from the local date-time, then converted back to
     * a zoned date-time using the zone ID.
     * The conversion uses {@link ofInstant}
     * with the offset before the subtraction.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} amountToSubtract - the amount of the unit to subtract from the result, may be negative
     * @param {TemporalUnit} unit - the unit of the period to subtract, not null
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the specified period subtracted, not null
     * @throws DateTimeException if the unit cannot be added to this type
     */
    _minusUnit(amountToSubtract, unit) {
        return this._plusUnit(-1 * amountToSubtract, unit);
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this {@link ZonedDateTime} with the specified period in years subtracted.
     *
     * This operates on the local time-line, subtracting years from the local date-time.
     * This is then converted back to a {@link ZonedDateTime}, using the zone ID
     * to obtain the offset.
     *
     * When converting back to {@link ZonedDateTime}, if the local date-time is in an overlap,
     * then the offset will be retained if possible, otherwise the earlier offset will be used.
     * If in a gap, the local date-time will be adjusted forward by the length of the gap.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} years - the years to subtract, may be negative
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the years subtracted, not null
     * @throws DateTimeException if the result exceeds the supported date range
     */
    minusYears(years) {
        return this.plusYears(-1 * years);
    }

    /**
     * Returns a copy of this {@link ZonedDateTime} with the specified period in months subtracted.
     *
     * This operates on the local time-line, subtracting months from the local date-time.
     * This is then converted back to a {@link ZonedDateTime}, using the zone ID
     * to obtain the offset.
     *
     * When converting back to {@link ZonedDateTime}, if the local date-time is in an overlap,
     * then the offset will be retained if possible, otherwise the earlier offset will be used.
     * If in a gap, the local date-time will be adjusted forward by the length of the gap.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} months - the months to subtract, may be negative
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the months subtracted, not null
     * @throws DateTimeException if the result exceeds the supported date range
     */
    minusMonths(months) {
        return this.plusMonths(-1 * months);
    }

    /**
     * Returns a copy of this {@link ZonedDateTime} with the specified period in weeks subtracted.
     *
     * This operates on the local time-line, subtracting weeks from the local date-time.
     * This is then converted back to a {@link ZonedDateTime}, using the zone ID
     * to obtain the offset.
     *
     * When converting back to {@link ZonedDateTime}, if the local date-time is in an overlap,
     * then the offset will be retained if possible, otherwise the earlier offset will be used.
     * If in a gap, the local date-time will be adjusted forward by the length of the gap.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} weeks - the weeks to subtract, may be negative
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the weeks subtracted, not null
     * @throws DateTimeException if the result exceeds the supported date range
     */
    minusWeeks(weeks) {
        return this.plusWeeks(-1 * weeks);
    }

    /**
     * Returns a copy of this {@link ZonedDateTime} with the specified period in days subtracted.
     *
     * This operates on the local time-line, subtracting days from the local date-time.
     * This is then converted back to a {@link ZonedDateTime}, using the zone ID
     * to obtain the offset.
     *
     * When converting back to {@link ZonedDateTime}, if the local date-time is in an overlap,
     * then the offset will be retained if possible, otherwise the earlier offset will be used.
     * If in a gap, the local date-time will be adjusted forward by the length of the gap.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} days - the days to subtract, may be negative
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the days subtracted, not null
     * @throws DateTimeException if the result exceeds the supported date range
     */
    minusDays(days) {
        return this.plusDays(-1 * days);
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a copy of this {@link ZonedDateTime} with the specified period in hours subtracted.
     *
     * This operates on the instant time-line, such that subtracting one hour will
     * always be a duration of one hour earlier.
     * This may cause the local date-time to change by an amount other than one hour.
     * Note that this is a different approach to that used by days, months and years,
     * thus subtracting one day is not the same as adding 24 hours.
     *
     * For example, consider a time-zone where the spring DST cutover means that the
     * local times 01:00 to 01:59 occur twice changing from offset +02:00 to +01:00.
     *
     * * Subtracting one hour from 02:30+01:00 will result in 01:30+02:00
     * * Subtracting one hour from 01:30+01:00 will result in 01:30+02:00
     * * Subtracting one hour from 01:30+02:00 will result in 00:30+01:00
     * * Subtracting three hours from 02:30+01:00 will result in 00:30+02:00
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} hours - the hours to subtract, may be negative
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the hours subtracted, not null
     * @throws DateTimeException if the result exceeds the supported date range
     */
    minusHours(hours) {
        return this.plusHours(-1 * hours);
    }

    /**
     * Returns a copy of this {@link ZonedDateTime} with the specified period in minutes subtracted.
     *
     * This operates on the instant time-line, such that subtracting one minute will
     * always be a duration of one minute earlier.
     * This may cause the local date-time to change by an amount other than one minute.
     * Note that this is a different approach to that used by days, months and years.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} minutes - the minutes to subtract, may be negative
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the minutes subtracted, not null
     * @throws DateTimeException if the result exceeds the supported date range
     */
    minusMinutes(minutes) {
        return this.plusMinutes(-1 * minutes);
    }

    /**
     * Returns a copy of this {@link ZonedDateTime} with the specified period in seconds subtracted.
     *
     * This operates on the instant time-line, such that subtracting one second will
     * always be a duration of one second earlier.
     * This may cause the local date-time to change by an amount other than one second.
     * Note that this is a different approach to that used by days, months and years.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} seconds - the seconds to subtract, may be negative
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the seconds subtracted, not null
     * @throws DateTimeException if the result exceeds the supported date range
     */
    minusSeconds(seconds) {
        return this.plusSeconds(-1 * seconds);
    }

    /**
     * Returns a copy of this {@link ZonedDateTime} with the specified period in nanoseconds subtracted.
     *
     * This operates on the instant time-line, such that subtracting one nano will
     * always be a duration of one nano earlier.
     * This may cause the local date-time to change by an amount other than one nano.
     * Note that this is a different approach to that used by days, months and years.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {number} nanos - the nanos to subtract, may be negative
     * @return {ZonedDateTime} a {@link ZonedDateTime} based on this date-time with the nanoseconds subtracted, not null
     * @throws DateTimeException if the result exceeds the supported date range
     */
    minusNanos(nanos) {
        return this.plusNanos(-1 * nanos);
    }

    //-----------------------------------------------------------------------
    /**
     * Queries this date-time using the specified query.
     *
     * This queries this date-time using the specified query strategy object.
     * The {@link TemporalQuery} object defines the logic to be used to
     * obtain the result. Read the documentation of the query to understand
     * what the result of this method will be.
     *
     * The result of this method is obtained by invoking the
     * {@link TemporalQuery#queryFrom} method on the
     * specified query passing `this` as the argument.
     *
     * @param {TemporalQuery} query - the query to invoke, not null
     * @return {*} the query result, null may be returned (defined by the query)
     * @throws DateTimeException if unable to query (defined by the query)
     * @throws ArithmeticException if numeric overflow occurs (defined by the query)
     */
    query(query) {
        if (query === TemporalQueries.localDate()) {
            return this.toLocalDate();
        }
        requireNonNull(query, 'query');
        return super.query(query);
    }

    /**
     * Calculates the period between this date-time and another date-time in
     * terms of the specified unit.
     *
     * This calculates the period between two date-times in terms of a single unit.
     * The start and end points are `this` and the specified date-time.
     * The result will be negative if the end is before the start.
     * For example, the period in days between two date-times can be calculated
     * using {@link startDateTime.until}.
     *
     * The {@link Temporal} passed to this method must be a {@link ZonedDateTime}.
     * If the time-zone differs between the two zoned date-times, the specified
     * end date-time is normalized to have the same zone as this date-time.
     *
     * The calculation returns a whole number, representing the number of
     * complete units between the two date-times.
     * For example, the period in months between 2012-06-15T00:00Z and 2012-08-14T23:59Z
     * will only be one month as it is one minute short of two months.
     *
     * This method operates in association with {@link TemporalUnit#between}.
     * The result of this method is a `long` representing the amount of
     * the specified unit. By contrast, the result of {@link between} is an
     * object that can be used directly in addition/subtraction:
     * <pre>
     *   long period = start.until(end, MONTHS);   // this method
     *   dateTime.plus(MONTHS.between(start, end));      // use in plus/minus
     * </pre>
     *
     * The calculation is implemented in this method for {@link ChronoUnit}.
     * The units {@link NANOS}, {@link MICROS}, {@link MILLIS}, {@link SECONDS},
     * {@link MINUTES}, {@link HOURS} and {@link HALF_DAYS}, {@link DAYS},
     * {@link WEEKS}, {@link MONTHS}, {@link YEARS}, {@link DECADES},
     * {@link CENTURIES}, {@link MILLENNIA} and {@link ERAS} are supported.
     * Other {@link ChronoUnit} values will throw an exception.
     *
     * The calculation for date and time units differ.
     *
     * Date units operate on the local time-line, using the local date-time.
     * For example, the period from noon on day 1 to noon the following day
     * in days will always be counted as exactly one day, irrespective of whether
     * there was a daylight savings change or not.
     *
     * Time units operate on the instant time-line.
     * The calculation effectively converts both zoned date-times to instants
     * and then calculates the period between the instants.
     * For example, the period from noon on day 1 to noon the following day
     * in hours may be 23, 24 or 25 hours (or some other amount) depending on
     * whether there was a daylight savings change or not.
     *
     * If the unit is not a {@link ChronoUnit}, then the result of this method
     * is obtained by invoking {@link TemporalUnit.between}
     * passing `this` as the first argument and the input temporal as
     * the second argument.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param {Temporal} endExclusive  the end date-time, which is converted to a {@link ZonedDateTime}, not null
     * @param {TemporalUnit} unit  the unit to measure the period in, not null
     * @return {number} the amount of the period between this date-time and the end date-time
     * @throws DateTimeException if the period cannot be calculated
     * @throws ArithmeticException if numeric overflow occurs
     */
    until(endExclusive, unit) {
        let end = ZonedDateTime.from(endExclusive);
        if (unit instanceof ChronoUnit) {
            end = end.withZoneSameInstant(this._zone);
            if (unit.isDateBased()) {
                return this._dateTime.until(end._dateTime, unit);
            } else {
                const difference = this._offset.totalSeconds() - end._offset.totalSeconds();
                const adjustedEnd = end._dateTime.plusSeconds(difference);
                return this._dateTime.until(adjustedEnd, unit);
            }
        }
        return unit.between(this, end);
    }

    //-----------------------------------------------------------------------
    /**
     * Gets the {@link LocalDateTime} part of this date-time.
     *
     * This returns a {@link LocalDateTime} with the same year, month, day and time
     * as this date-time.
     *
     * @return {LocalDateTime} the local date-time part of this date-time, not null
     */
    toLocalDateTime() {
        return this._dateTime;
    }

    /**
     * Gets the {@link LocalDate} part of this date-time.
     *
     * This returns a {@link LocalDate} with the same year, month and day
     * as this date-time.
     *
     * @return {LocalDate} the date part of this date-time, not null
     */
    toLocalDate() {
        return this._dateTime.toLocalDate();
    }

    /**
     * Gets the {@link LocalTime} part of this date-time.
     *
     * This returns a {@link LocalTime} with the same hour, minute, second and
     * nanosecond as this date-time.
     *
     * @return {LocalTime} the time part of this date-time, not null
     */
    toLocalTime() {
        return this._dateTime.toLocalTime();
    }

    /**
     * Converts this date-time to an {@link OffsetDateTime}.
     *
     * This creates an offset date-time using the local date-time and offset.
     * The zone ID is ignored.
     *
     * @return {OffsetDateTime} an offset date-time representing the same local date-time and offset, not null
     */
    toOffsetDateTime() {
        return OffsetDateTime.of(this._dateTime, this._offset);
    }

    //-----------------------------------------------------------------------
    /**
     * Checks if this date-time is equal to another date-time.
     *
     * The comparison is based on the offset date-time and the zone.
     * Only objects of type {@link ZonedDateTime} are compared, other types return false.
     *
     * @param {*} other  the object to check, null returns false
     * @return {boolean} true if this is equal to the other date-time
     */
    equals(other) {
        if (this === other) {
            return true;
        }
        if (other instanceof ZonedDateTime) {
            return this._dateTime.equals(other._dateTime) &&
                this._offset.equals(other._offset) &&
                this._zone.equals(other._zone);
        }
        return false;
    }

    /**
     * A hash code for this date-time.
     *
     * @return {number} a suitable hash code
     */
    hashCode() {
        return MathUtil.hashCode(this._dateTime.hashCode(), this._offset.hashCode(), this._zone.hashCode());
    }

    //-----------------------------------------------------------------------
    /**
     * Outputs this date-time as a string, such as
     * `2007-12-03T10:15:30+01:00[Europe/Paris]`.
     *
     * The format consists of the {@link LocalDateTime} followed by the {@link ZoneOffset}.
     * If the {@link ZoneId} is not the same as the offset, then the ID is output.
     * The output is compatible with ISO-8601 if the offset and ID are the same.
     *
     * @return {string} a string representation of this date-time, not null
     */
    toString() {
        let str = this._dateTime.toString() + this._offset.toString();
        if (this._offset !== this._zone) {
            str += `[${this._zone.toString()}]`;
        }
        return str;
    }

    /**
     *
     * @return {string} same as {@link ZonedDateTime.toString}
     */
    toJSON() {
        return this.toString();
    }

    /**
     * Outputs this date-time as a string using the formatter.
     *
     * @param {DateTimeFormatter} formatter  the formatter to use, not null
     * @return {string} the formatted date-time string, not null
     * @throws DateTimeException if an error occurs during printing
     */
    format(formatter) {
        return super.format(formatter);
    }

}

export function _init(){
    ZonedDateTime.FROM = createTemporalQuery('ZonedDateTime.FROM', (temporal) => {
        return ZonedDateTime.from(temporal);
    });
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { _init as ZoneOffsetInit } from './ZoneOffset';
import { _init as DayOfWeekInit } from './DayOfWeek';
import { _init as DurationInit } from './Duration';
import { _init as InstantInit } from './Instant';
import { _init as LocalDateInit } from './LocalDate';
import { _init as LocalTimeInit } from './LocalTime';
import { _init as LocalDateTimeInit } from './LocalDateTime';
import { _init as MonthInit } from './Month';
import { _init as MonthDayInit } from './MonthDay';
import { _init as OffsetDateTimeInit } from './OffsetDateTime';
import { _init as OffsetTimeInit } from './OffsetTime';
import { _init as PeriodInit } from './Period';
import { _init as YearInit } from './Year';
import { _init as YearConstantsInit } from './YearConstants';
import { _init as YearMonthInit } from './YearMonth';
import { _init as ZonedDateTimeInit } from './ZonedDateTime';
import { _init as IsoChronologyInit } from './chrono/IsoChronology';
import { _init as DateTimeFormatterInit } from './format/DateTimeFormatter';
import { _init as ChronoFieldInit } from './temporal/ChronoField';
import { _init as ChronoUnitInit } from './temporal/ChronoUnit';
import { _init as IsoFieldsInit } from './temporal/IsoFields';
import { _init as DateTimeFormatterBuilderInit } from './format/DateTimeFormatterBuilder';

import { _init as TemporalQueriesInit } from './temporal/TemporalQueriesFactory';
import { _init as ZoneIdInit } from './ZoneIdFactory';

let isInit = false;

function init() {

    if (isInit) {
        return;
    }

    isInit = true;

    YearConstantsInit();
    DurationInit();
    ChronoUnitInit();
    ChronoFieldInit();
    LocalTimeInit();
    IsoFieldsInit();
    TemporalQueriesInit();
    DayOfWeekInit();
    InstantInit();
    LocalDateInit();
    LocalDateTimeInit();
    YearInit();
    MonthInit();
    YearMonthInit();
    MonthDayInit();
    PeriodInit();
    ZoneOffsetInit();
    ZonedDateTimeInit();
    ZoneIdInit();
    IsoChronologyInit();
    DateTimeFormatterInit();
    DateTimeFormatterBuilderInit();
    OffsetDateTimeInit();
    OffsetTimeInit();
}

init();
/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
import { NullPointerException, IllegalArgumentException } from './errors';

/**
 * @private
 *
 * @param assertion
 * @param msg
 * @param error
 */
export function assert(assertion, msg, error) {
    if(!assertion){
        if (error) {
            throw new error(msg);
        } else {
            throw new Error(msg);
        }
    }
}

/**
 * @private
 *
 * @param value
 * @param parameterName
 * @returns {*}
 */
export function requireNonNull(value, parameterName) {
    if (value == null) {
        throw new NullPointerException(`${parameterName} must not be null`);
    }
    return value;
}

/**
 * @private
 *
 * @param value
 * @param _class
 * @param parameterName
 * @returns {_class}
 */
export function requireInstance(value, _class, parameterName) {
    if (!(value instanceof _class)) {
        throw new IllegalArgumentException(`${parameterName} must be an instance of ${_class.name ? _class.name : _class}${value && value.constructor && value.constructor.name ? `, but is ${value.constructor.name}` : ''}`);
    }
    return value;
}

/**
 * @private
 *
 * @param methodName
 */
export function abstractMethodFail(methodName){
    throw new TypeError(`abstract method "${methodName}" is not implemented`);
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { IllegalArgumentException } from './errors';

import { LocalDate } from './LocalDate';
import { LocalDateTime } from './LocalDateTime';
import { ZonedDateTime } from './ZonedDateTime';
import { ZoneId } from './ZoneId';
import { Instant } from './Instant';

class ToNativeJsConverter {
    /**
     * @param {!(LocalDate|LocalDateTime|ZonedDateTime|Instant)} temporal - a joda temporal instance
     * @param {ZoneId} [zone] - the zone of the temporal,
     *  the default value for LocalDate and LocalDateTime is ZoneId.systemDefault().
     */
    constructor(temporal, zone){
        let zonedDateTime;

        if(temporal instanceof Instant) {
            this.instant = temporal;
            return;
        } else if(temporal instanceof LocalDate) {
            zone = zone == null ?  ZoneId.systemDefault() : zone;
            zonedDateTime = temporal.atStartOfDay(zone);
        } else if (temporal instanceof LocalDateTime) {
            zone = zone == null ? ZoneId.systemDefault() : zone;
            zonedDateTime = temporal.atZone(zone);
        } else if (temporal instanceof ZonedDateTime) {
            if (zone == null) {
                zonedDateTime = temporal;
            } else {
                zonedDateTime = temporal.withZoneSameInstant(zone);
            }
        } else {
            throw new IllegalArgumentException(`unsupported instance for convert operation:${temporal}`);
        }

        this.instant = zonedDateTime.toInstant();
    }

    /**
     *
     * @returns {Date}
     */
    toDate() {
        return new Date(this.instant.toEpochMilli());
    }

    /**
     *
     * @returns {number}
     */
    toEpochMilli() {
        return this.instant.toEpochMilli();
    }
}

/**
 * converts a LocalDate, LocalDateTime or ZonedDateTime to a native Javascript Date.
 *
 * In a first step the temporal is converted to an Instant by adding implicit values.
 * 
 * A LocalDate is implicit set to a LocalDateTime at start of day. 
 * A LocalDateTime is implicit set to a ZonedDateTime with 
 * the passed zone or if null, with the system default time zone. 
 * A ZonedDateTime is converted to an Instant, if a zone is specified the zonedDateTime is adjusted to this 
 * zone, keeping the same Instant.
 *
 * In a second step the instant is converted to a native Javascript Date
 *
 * default zone for LocalDate and LocalDateTime is ZoneId.systemDefault().
 *
 * @example
 * convert(localDate).toDate() // returns a javascript Date
 * convert(localDate).toEpochMilli()   // returns the epochMillis
 *
 * @param {!(LocalDate|LocalDateTime|ZonedDateTime)} temporal - a joda temporal instance
 * @param {ZoneId} [zone] - the zone of the temporal
 * @returns {ToNativeJsConverter}
 */
export function convert(temporal, zone){
    return new ToNativeJsConverter(temporal, zone);
}
/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

function createErrorType(name, init, superErrorClass = Error) {
    function JsJodaException(message) {
        if (!Error.captureStackTrace) {
            this.stack = (new Error()).stack;
        } else {
            Error.captureStackTrace(this, this.constructor);
        }
        this.message = message;
        init && init.apply(this, arguments);
        this.toString = function () {
            return `${this.name}: ${this.message}`;
        };
    }
    JsJodaException.prototype = Object.create(superErrorClass.prototype);
    JsJodaException.prototype.name = name;
    JsJodaException.prototype.constructor = JsJodaException;
    return JsJodaException;
}

export const DateTimeException = createErrorType('DateTimeException', messageWithCause);
export const DateTimeParseException = createErrorType('DateTimeParseException', messageForDateTimeParseException);
export const UnsupportedTemporalTypeException = createErrorType('UnsupportedTemporalTypeException', null, DateTimeException);
export const ArithmeticException = createErrorType('ArithmeticException');
export const IllegalArgumentException = createErrorType('IllegalArgumentException');
export const IllegalStateException = createErrorType('IllegalStateException');
export const NullPointerException = createErrorType('NullPointerException');

function messageWithCause(message, cause = null) {
    let msg = message || this.name;
    if (cause !== null && cause instanceof Error) {
        msg += `\n-------\nCaused by: ${cause.stack}\n-------\n`;
    }
    this.message = msg;
}

function messageForDateTimeParseException(message, text = '', index = 0, cause = null) {
    let msg = message || this.name;
    msg += `: ${text}, at index: ${index}`;
    if (cause !== null && cause instanceof Error) {
        msg += `\n-------\nCaused by: ${cause.stack}\n-------\n`;
    }
    this.message = msg;
    this.parsedString = () => {
        return text;
    };
    this.errorIndex = () => {
        return index;
    };
}
/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import {
    ArithmeticException,
    DateTimeException,
    DateTimeParseException,
    IllegalArgumentException,
    IllegalStateException,
    UnsupportedTemporalTypeException,
    NullPointerException
} from './errors';

import { Clock } from './Clock';
import { DayOfWeek } from './DayOfWeek';
import { Duration } from './Duration';
import { Instant } from './Instant';
import { LocalDate } from './LocalDate';
import { LocalTime } from './LocalTime';
import { LocalDateTime } from './LocalDateTime';
import { Month } from './Month';
import { MonthDay } from './MonthDay';
import { OffsetDateTime } from './OffsetDateTime';
import { OffsetTime } from './OffsetTime';
import { Period } from './Period';
import { Year } from './Year';
import { YearConstants } from './YearConstants';
import { YearMonth } from './YearMonth';
import { ZonedDateTime } from './ZonedDateTime';
import { ZoneOffset } from './ZoneOffset';
import { ZoneId } from './ZoneId';
import { ZoneRegion } from './ZoneRegion';

import { ZoneOffsetTransition } from './zone/ZoneOffsetTransition';
import { ZoneRules } from './zone/ZoneRules';
import { ZoneRulesProvider } from './zone/ZoneRulesProvider';

import { ChronoLocalDate } from './chrono/ChronoLocalDate';
import { ChronoLocalDateTime } from './chrono/ChronoLocalDateTime';
import { ChronoZonedDateTime } from './chrono/ChronoZonedDateTime';
import { IsoChronology } from './chrono/IsoChronology';

import { ChronoField } from './temporal/ChronoField';
import { ChronoUnit } from './temporal/ChronoUnit';
import { IsoFields } from './temporal/IsoFields';
import { Temporal } from './temporal/Temporal';
import { TemporalAccessor } from './temporal/TemporalAccessor';
import { TemporalAdjuster } from './temporal/TemporalAdjuster';
import { TemporalAdjusters } from './temporal/TemporalAdjusters';
import { TemporalAmount } from './temporal/TemporalAmount';
import { TemporalField } from './temporal/TemporalField';
import { TemporalQueries } from './temporal/TemporalQueries';
import { TemporalQuery } from './temporal/TemporalQuery';
import { TemporalUnit } from './temporal/TemporalUnit';
import { ValueRange } from './temporal/ValueRange';

import { DateTimeFormatter } from './format/DateTimeFormatter';
import { DateTimeFormatterBuilder } from './format/DateTimeFormatterBuilder';
import { DecimalStyle } from './format/DecimalStyle';
import { ResolverStyle } from './format/ResolverStyle';
import { SignStyle } from './format/SignStyle';
import { TextStyle } from './format/TextStyle';

// init static properties
import './_init';

// private/internal exports, e.g. for use in plugins
import { MathUtil } from './MathUtil';
import { StringUtil } from './StringUtil';
import { DateTimeBuilder } from './format/DateTimeBuilder';
import { DateTimeParseContext } from './format/DateTimeParseContext';
import { DateTimePrintContext } from './format/DateTimePrintContext';
import { StringBuilder } from './format/StringBuilder';
import * as assert from './assert';

import { convert } from './convert';
import { nativeJs } from './temporal/NativeJsTemporal';
import { bindUse } from './use';

const _ = {
    assert,
    DateTimeBuilder,
    DateTimeParseContext,
    DateTimePrintContext,
    MathUtil,
    StringUtil,
    StringBuilder,
};

const jsJodaExports = {
    _,
    convert,
    nativeJs,
    ArithmeticException,
    DateTimeException,
    DateTimeParseException,
    IllegalArgumentException,
    IllegalStateException,
    UnsupportedTemporalTypeException,
    NullPointerException,
    Clock,
    DayOfWeek,
    Duration,
    Instant,
    LocalDate,
    LocalTime,
    LocalDateTime,
    OffsetTime,
    OffsetDateTime,
    Month,
    MonthDay,
    Period,
    Year,
    YearConstants,
    YearMonth,
    ZonedDateTime,
    ZoneOffset,
    ZoneId,
    ZoneRegion,
    ZoneOffsetTransition,
    ZoneRules,
    ZoneRulesProvider,
    ChronoLocalDate,
    ChronoLocalDateTime,
    ChronoZonedDateTime,
    IsoChronology,
    ChronoField,
    ChronoUnit,
    IsoFields,
    Temporal,
    TemporalAccessor,
    TemporalAdjuster,
    TemporalAdjusters,
    TemporalAmount,
    TemporalField,
    TemporalQueries,
    TemporalQuery,
    TemporalUnit,
    ValueRange,
    DateTimeFormatter,
    DateTimeFormatterBuilder,
    DecimalStyle,
    ResolverStyle,
    SignStyle,
    TextStyle,
};

/**
 * @private
 *
 * @type {function(*=): *}
 */
const use = bindUse(jsJodaExports);
jsJodaExports.use = use;

export {
    _,
    use,
    convert,
    nativeJs,
    ArithmeticException,
    DateTimeException,
    DateTimeParseException,
    IllegalArgumentException,
    IllegalStateException,
    UnsupportedTemporalTypeException,
    NullPointerException,
    Clock,
    DayOfWeek,
    Duration,
    Instant,
    LocalDate,
    LocalTime,
    LocalDateTime,
    Month,
    MonthDay,
    OffsetTime,
    OffsetDateTime,
    Period,
    Year,
    YearConstants,
    YearMonth,
    ZonedDateTime,
    ZoneOffset,
    ZoneId,
    ZoneRegion,
    ZoneOffsetTransition,
    ZoneRules,
    ZoneRulesProvider,
    ChronoLocalDate,
    ChronoLocalDateTime,
    ChronoZonedDateTime,
    IsoChronology,
    ChronoField,
    ChronoUnit,
    IsoFields,
    Temporal,
    TemporalAccessor,
    TemporalAdjuster,
    TemporalAdjusters,
    TemporalAmount,
    TemporalField,
    TemporalQueries,
    TemporalQuery,
    TemporalUnit,
    ValueRange,
    DateTimeFormatter,
    DateTimeFormatterBuilder,
    DecimalStyle,
    ResolverStyle,
    SignStyle,
    TextStyle,
};
/**
 * @private
 *
 * @param jsJoda
 * @returns {function(*=): *}
 */
export function bindUse(jsJoda) {
    const used = [];

    /**
     * use
     *
     * Provides a way to extend the internals of js-joda
     *
     * @param {function} fn - function to extend js-joda public api
     * @returns {this} for chaining
     */
    return function use(fn) {
        if (!~used.indexOf(fn)) {
            fn(jsJoda);
            used.push(fn);
        }
        return jsJoda;
    };
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { SystemDefaultZoneRules } from './SystemDefaultZoneRules';
import { ZoneId } from '../ZoneId';

export class SystemDefaultZoneId extends ZoneId {

    constructor(){
        super();
        this._rules = new SystemDefaultZoneRules();
    }

    rules(){
        return this._rules;
    }

    equals(other){
        if(this === other){
            return true;
        }
        return false;
    }

    id(){
        return 'SYSTEM';
    }

}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { ZoneRules } from './ZoneRules';
import { ZoneOffset } from '../ZoneOffset';
import { DateTimeException } from '../errors';

export class SystemDefaultZoneRules extends ZoneRules {

    isFixedOffset(){
        return false;
    }

    /**
     *
     * @param {Instant} instant
     * @returns {ZoneOffset}
     */
    offsetOfInstant(instant){
        const offsetInMinutes = new Date(instant.toEpochMilli()).getTimezoneOffset();
        return ZoneOffset.ofTotalMinutes(offsetInMinutes * -1);
    }

    /**
     *
     * @param {number} epochMilli
     * @returns {ZoneOffset}
     */
    offsetOfEpochMilli(epochMilli){
        const offsetInMinutes = new Date(epochMilli).getTimezoneOffset();
        return ZoneOffset.ofTotalMinutes(offsetInMinutes * -1);
    }

    /**
     * This implementation is NOT returning the best value in a gap or overlap situation
     * as specified at {@link ZoneRules.offsetOfLocalDateTime}.
     *
     * The calculated offset depends Date.prototype.getTimezoneOffset and its not specified
     * at the ECMA-262 specification how to handle daylight savings gaps/ overlaps.
     *
     * The Chrome Browser version 49 is returning the next transition offset in a gap/overlap situation,
     * other browsers/ engines might do it in the same way.
     *
     * @param {LocalDateTime} localDateTime
     * @returns {ZoneOffset}
     */
    offsetOfLocalDateTime(localDateTime){
        const epochMilli = localDateTime.toEpochSecond(ZoneOffset.UTC) * 1000;
        const offsetInMinutesBeforePossibleTransition = new Date(epochMilli).getTimezoneOffset();
        const epochMilliSystemZone = epochMilli + offsetInMinutesBeforePossibleTransition * 60000;
        const offsetInMinutesAfterPossibleTransition = new Date(epochMilliSystemZone).getTimezoneOffset();
        return ZoneOffset.ofTotalMinutes(offsetInMinutesAfterPossibleTransition * -1);
    }

    /**
     *
     * @param localDateTime
     * @return {ZoneOffset[]}
     */
    validOffsets(localDateTime){
        return [this.offsetOfLocalDateTime(localDateTime)];
    }

    /**
     * @return null, not supported
     */
    transition(){
        return null;
    }

    /**
     *
     * @param instant
     * @return {ZoneOffset}
     */
    standardOffset(instant){
        return this.offsetOfInstant(instant);
    }

    /**
     * @throws DateTimeException not supported
     */
    daylightSavings(){
        this._throwNotSupported();
    }

    /**
     * @throws DateTimeException not supported
     */
    isDaylightSavings(){
        this._throwNotSupported();
    }

    /**
     *
     * @param {LocalDateTime} dateTime
     * @param {ZoneOffset} offset
     * @return {boolean}
     */
    isValidOffset(dateTime, offset) {
        return this.offsetOfLocalDateTime(dateTime).equals(offset);
    }

    /**
     * @throws DateTimeException not supported
     */
    nextTransition(){
        this._throwNotSupported();
    }

    /**
     * @throws DateTimeException not supported
     */
    previousTransition(){
        this._throwNotSupported();
    }

    /**
     * @throws DateTimeException not supported
     */
    transitions(){
        this._throwNotSupported();
    }

    /**
     * @throws DateTimeException not supported
     */
    transitionRules(){
        this._throwNotSupported();
    }

    /**
     * @throws DateTimeException not supported
     */
    _throwNotSupported(){
        throw new DateTimeException('not supported operation');
    }
    //-----------------------------------------------------------------------
    /**
     *
     * @param {*} other
     * @returns {boolean}
     */
    equals(other) {
        if (this === other || other instanceof SystemDefaultZoneRules) {
            return true;
        } else {
            return false;
        }
    }

    /**
     *
     * @returns {string}
     */
    toString() {
        return 'SYSTEM';
    }

}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { requireNonNull } from '../assert';
import { IllegalArgumentException } from '../errors';

import { Duration } from '../Duration';
import { LocalDateTime } from '../LocalDateTime';

/**
 * A transition between two offsets caused by a discontinuity in the local time-line.
 *
 * A transition between two offsets is normally the result of a daylight savings cutover.
 * The discontinuity is normally a gap in spring and an overlap in autumn.
 * {@link ZoneOffsetTransition} models the transition between the two offsets.
 *
 * Gaps occur where there are local date-times that simply do not not exist.
 * An example would be when the offset changes from `+03:00` to `+04:00`.
 * This might be described as 'the clocks will move forward one hour tonight at 1am'.
 *
 * Overlaps occur where there are local date-times that exist twice.
 * An example would be when the offset changes from `+04:00` to `+03:00`.
 * This might be described as 'the clocks will move back one hour tonight at 2am'.
 *
 */
export class ZoneOffsetTransition {

    //-----------------------------------------------------------------------
    /**
     * Obtains an instance defining a transition between two offsets.
     *
     * Applications should normally obtain an instance from {@link ZoneRules}.
     * This factory is only intended for use when creating {@link ZoneRules}.
     *
     * @param {LocalDateTime} transition - the transition date-time at the transition, which never
     *  actually occurs, expressed local to the before offset, not null
     * @param {ZoneOffset} offsetBefore - the offset before the transition, not null
     * @param {ZoneOffset} offsetAfter - the offset at and after the transition, not null
     * @return {ZoneOffsetTransition} the transition, not null
     * @throws IllegalArgumentException if {@link offsetBefore} and {@link offsetAfter}
     *         are equal, or {@link transition.getNano} returns non-zero value
     */
    static of(transition, offsetBefore, offsetAfter) {
        return new ZoneOffsetTransition(transition, offsetBefore, offsetAfter);
    }

    /**
     * Creates an instance defining a transition between two offsets.
     * Creates an instance from epoch-second if transition is not a LocalDateTimeInstance
     *
     * @param {(LocalDateTime \ number)} transition - the transition date-time with the offset before the transition, not null
     * @param {ZoneOffset} offsetBefore - the offset before the transition, not null
     * @param {ZoneOffset} offsetAfter - the offset at and after the transition, not null
     * @private
     */
    constructor(transition, offsetBefore, offsetAfter) {
        requireNonNull(transition, 'transition');
        requireNonNull(offsetBefore, 'offsetBefore');
        requireNonNull(offsetAfter, 'offsetAfter');
        if (offsetBefore.equals(offsetAfter)) {
            throw new IllegalArgumentException('Offsets must not be equal');
        }
        if (transition.nano() !== 0) {
            throw new IllegalArgumentException('Nano-of-second must be zero');
        }
        if(transition instanceof LocalDateTime) {
            this._transition = transition;
        } else {
            this._transition = LocalDateTime.ofEpochSecond(transition, 0, offsetBefore);
        }
        this._offsetBefore = offsetBefore;
        this._offsetAfter = offsetAfter;
    }

    //-----------------------------------------------------------------------
    /**
     * Gets the transition instant.
     *
     * This is the instant of the discontinuity, which is defined as the first
     * instant that the 'after' offset applies.
     *
     * The methods {@link getInstant}, {@link getDateTimeBefore} and {@link getDateTimeAfter}
     * all represent the same instant.
     *
     * @return {Instant} the transition instant, not null
     */
    instant() {
        return this._transition.toInstant(this._offsetBefore);
    }

    /**
     * Gets the transition instant as an epoch second.
     *
     * @return {number} the transition epoch second
     */
    toEpochSecond() {
        return this._transition.toEpochSecond(this._offsetBefore);
    }

    //-------------------------------------------------------------------------
    /**
     * Gets the local transition date-time, as would be expressed with the 'before' offset.
     *
     * This is the date-time where the discontinuity begins expressed with the 'before' offset.
     * At this instant, the 'after' offset is actually used, therefore the combination of this
     * date-time and the 'before' offset will never occur.
     *
     * The combination of the 'before' date-time and offset represents the same instant
     * as the 'after' date-time and offset.
     *
     * @return {LocalDateTime} the transition date-time expressed with the before offset, not null
     */
    dateTimeBefore(){
        return this._transition;
    }

    /**
     * Gets the local transition date-time, as would be expressed with the 'after' offset.
     *
     * This is the first date-time after the discontinuity, when the new offset applies.
     *
     * The combination of the 'before' date-time and offset represents the same instant
     * as the 'after' date-time and offset.
     *
     * @return {LocalDateTime} the transition date-time expressed with the after offset, not null
     */
    dateTimeAfter() {
        return this._transition.plusSeconds(this.durationSeconds());
    }

    /**
     * Gets the offset before the transition.
     *
     * This is the offset in use before the instant of the transition.
     *
     * @return {ZoneOffset} the offset before the transition, not null
     */
    offsetBefore() {
        return this._offsetBefore;
    }

    /**
     * Gets the offset after the transition.
     *
     * This is the offset in use on and after the instant of the transition.
     *
     * @return {ZoneOffset} the offset after the transition, not null
     */
    offsetAfter() {
        return this._offsetAfter;
    }

    /**
     * Gets the duration of the transition.
     *
     * In most cases, the transition duration is one hour, however this is not always the case.
     * The duration will be positive for a gap and negative for an overlap.
     * Time-zones are second-based, so the nanosecond part of the duration will be zero.
     *
     * @return {Duration} the duration of the transition, positive for gaps, negative for overlaps
     */
    duration() {
        return Duration.ofSeconds(this.durationSeconds());
    }

    /**
     * Gets the duration of the transition in seconds.
     *
     * @return {number} the duration in seconds
     */
    durationSeconds() {
        return this._offsetAfter.totalSeconds() - this._offsetBefore.totalSeconds();
    }

    /**
     * Does this transition represent a gap in the local time-line.
     *
     * Gaps occur where there are local date-times that simply do not not exist.
     * An example would be when the offset changes from `+01:00` to `+02:00`.
     * This might be described as 'the clocks will move forward one hour tonight at 1am'.
     *
     * @return {boolean} true if this transition is a gap, false if it is an overlap
     */
    isGap() {
        return this._offsetAfter.totalSeconds() > this._offsetBefore.totalSeconds();
    }

    /**
     * Does this transition represent a gap in the local time-line.
     *
     * Overlaps occur where there are local date-times that exist twice.
     * An example would be when the offset changes from `+02:00` to `+01:00`.
     * This might be described as 'the clocks will move back one hour tonight at 2am'.
     *
     * @return {boolean} true if this transition is an overlap, false if it is a gap
     */
    isOverlap() {
        return this._offsetAfter.totalSeconds() < this._offsetBefore.totalSeconds();
    }

    /**
     * Checks if the specified offset is valid during this transition.
     *
     * This checks to see if the given offset will be valid at some point in the transition.
     * A gap will always return false.
     * An overlap will return true if the offset is either the before or after offset.
     *
     * @param {ZoneOffset} offset - the offset to check, null returns false
     * @return {boolean} true if the offset is valid during the transition
     */
    isValidOffset(offset) {
        return this.isGap() ? false : (this._offsetBefore.equals(offset) || this._offsetAfter.equals(offset));
    }

    /**
     * Gets the valid offsets during this transition.
     *
     * A gap will return an empty list, while an overlap will return both offsets.
     *
     * @return {ZoneOffset[]} the list of valid offsets
     */
    validOffsets() {
        if (this.isGap()){
            return [];
        } else {
            return [this._offsetBefore, this._offsetAfter];
        }
    }

    //-----------------------------------------------------------------------
    /**
     * Compares this transition to another based on the transition instant.
     *
     * This compares the instants of each transition.
     * The offsets are ignored, making this order inconsistent with equals.
     *
     * @param {ZoneOffsetTransition} transition - the transition to compare to, not null
     * @return {number} the comparator value, negative if less, positive if greater
     */
    compareTo(transition) {
        return this.instant().compareTo(transition.instant());
    }

    //-----------------------------------------------------------------------
    /**
     * Checks if this object equals another.
     *
     * The entire state of the object is compared.
     *
     * @param {*} other - the other object to compare to, null returns false
     * @return true if equal
     */
    equals(other) {
        if (other === this) {
            return true;
        }
        if (other instanceof ZoneOffsetTransition) {
            const d = other;
            return this._transition.equals(d._transition) &&
                this._offsetBefore.equals(d.offsetBefore()) && this._offsetAfter.equals(d.offsetAfter());
        }
        return false;
    }

    /**
     * Returns a suitable hash code.
     *
     * @return {number} the hash code
     */
    hashCode() {
        return this._transition.hashCode() ^ this._offsetBefore.hashCode() ^ (this._offsetAfter.hashCode()>>>16);
    }

    //-----------------------------------------------------------------------
    /**
     * Returns a string describing this object.
     *
     * @return {string} a string for debugging, not null
     */
    toString() {
        return `Transition[${this.isGap() ? 'Gap' : 'Overlap' 
        } at ${this._transition.toString()}${this._offsetBefore.toString() 
        } to ${this._offsetAfter}]`;
    }

}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { requireNonNull, abstractMethodFail } from '../assert';

import { Duration } from '../Duration';
import { Instant } from '../Instant';

export class ZoneRules {

    /**
     * Obtains an instance of {@link ZoneRules} that always uses the same offset.
     *
     * The returned rules always have the same offset.
     *
     * @param {ZoneOffset} offset - the offset, not null
     * @return {ZoneRules} the zone rules, not null
     */
    static of(offset) {
        requireNonNull(offset, 'offset');
        return new Fixed(offset);
    }


    //-----------------------------------------------------------------------
    /**
     * Checks of the zone rules are fixed, such that the offset never varies.
     *
     * @return {boolean} true if the time-zone is fixed and the offset never changes
     */
    isFixedOffset(){
        abstractMethodFail('ZoneRules.isFixedOffset');
    }

    //-----------------------------------------------------------------------

    /**
     *
     * @param instantOrLocalDateTime
     * @returns {ZoneOffset}
     */
    offset(instantOrLocalDateTime){
        if(instantOrLocalDateTime instanceof Instant){
            return this.offsetOfInstant(instantOrLocalDateTime);
        } else {
            return this.offsetOfLocalDateTime(instantOrLocalDateTime);
        }
    }

    /**
     * Gets the offset applicable at the specified instant in these rules.
     *
     * The mapping from an instant to an offset is simple, there is only
     * one valid offset for each instant.
     * This method returns that offset.
     *
     * @param {Instant} instant - the instant to find the offset for, not null, but null
     *  may be ignored if the rules have a single offset for all instants
     * @return {ZoneOffset} the offset, not null
     */
    // eslint-disable-next-line no-unused-vars
    offsetOfInstant(instant){
        abstractMethodFail('ZoneRules.offsetInstant');
    }

    /**
     * Gets the offset applicable at the specified epochMilli in these rules.
     *
     * The method is for javascript performance optimisation.
     *
     * @param {number} epochMilli - the epoch millisecond to find the offset for, not null, but null
     *  may be ignored if the rules have a single offset for all instants
     * @return {ZoneOffset} the offset, not null
     */
    // eslint-disable-next-line no-unused-vars
    offsetOfEpochMilli(epochMilli){
        abstractMethodFail('ZoneRules.offsetOfEpochMilli');
    }


    /**
     * Gets a suitable offset for the specified local date-time in these rules.
     *
     * The mapping from a local date-time to an offset is not straightforward.
     * There are three cases:
     *
     * * Normal, with one valid offset. For the vast majority of the year, the normal
     *   case applies, where there is a single valid offset for the local date-time.
     * * Gap, with zero valid offsets. This is when clocks jump forward typically
     *   due to the spring daylight savings change from "winter" to "summer".
     *   In a gap there are local date-time values with no valid offset.
     * * Overlap, with two valid offsets. This is when clocks are set back typically
     *   due to the autumn daylight savings change from "summer" to "winter".
     *   In an overlap there are local date-time values with two valid offsets.
     *
     * Thus, for any given local date-time there can be zero, one or two valid offsets.
     * This method returns the single offset in the Normal case, and in the Gap or Overlap
     * case it returns the offset before the transition.
     *
     * Since, in the case of Gap and Overlap, the offset returned is a "best" value, rather
     * than the "correct" value, it should be treated with care. Applications that care
     * about the correct offset should use a combination of this method,
     * {@link getValidOffsets} and {@link getTransition}.
     *
     * @param {LocalDateTime} localDateTime - the local date-time to query, not null, but null
     *  may be ignored if the rules have a single offset for all instants
     * @return {ZoneOffset} the best available offset for the local date-time, not null
     */
    // eslint-disable-next-line no-unused-vars
    offsetOfLocalDateTime(localDateTime){
        abstractMethodFail('ZoneRules.offsetLocalDateTime');
    }

    /**
     * Gets the offset applicable at the specified local date-time in these rules.
     *
     * The mapping from a local date-time to an offset is not straightforward.
     * There are three cases:
     *
     * * Normal, with one valid offset. For the vast majority of the year, the normal
     *   case applies, where there is a single valid offset for the local date-time.
     * * Gap, with zero valid offsets. This is when clocks jump forward typically
     *   due to the spring daylight savings change from "winter" to "summer".
     *   In a gap there are local date-time values with no valid offset.
     * * Overlap, with two valid offsets. This is when clocks are set back typically
     *   due to the autumn daylight savings change from "summer" to "winter".
     *   In an overlap there are local date-time values with two valid offsets.
     *
     * Thus, for any given local date-time there can be zero, one or two valid offsets.
     * This method returns that list of valid offsets, which is a list of size 0, 1 or 2.
     * In the case where there are two offsets, the earlier offset is returned at index 0
     * and the later offset at index 1.
     *
     * There are various ways to handle the conversion from a {@link LocalDateTime}.
     * One technique, using this method, would be:
     * <pre>
     *  List<ZoneOffset> validOffsets = rules.getOffset(localDT);
     *  if (validOffsets.size() == 1) {
     *    // Normal case: only one valid offset
     *    zoneOffset = validOffsets.get(0);
     *  } else {
     *    // Gap or Overlap: determine what to do from transition (which will be non-null)
     *    ZoneOffsetTransition trans = rules.getTransition(localDT);
     *  }
     * </pre>
     *
     * In theory, it is possible for there to be more than two valid offsets.
     * This would happen if clocks to be put back more than once in quick succession.
     * This has never happened in the history of time-zones and thus has no special handling.
     * However, if it were to happen, then the list would return more than 2 entries.
     *
     * @param {LocalDateTime} localDateTime - the local date-time to query for valid offsets, not null
     *  may be ignored if the rules have a single offset for all instants
     * @return {ZoneOffset[]} the list of valid offsets, may be immutable, not null
     */
    // eslint-disable-next-line no-unused-vars
    validOffsets(localDateTime){
        abstractMethodFail('ZoneRules.validOffsets');
    }

    /**
     * Gets the offset transition applicable at the specified local date-time in these rules.
     *
     * The mapping from a local date-time to an offset is not straightforward.
     * There are three cases:
     *
     * * Normal, with one valid offset. For the vast majority of the year, the normal
     *   case applies, where there is a single valid offset for the local date-time.
     * * Gap, with zero valid offsets. This is when clocks jump forward typically
     *   due to the spring daylight savings change from "winter" to "summer".
     *   In a gap there are local date-time values with no valid offset.
     * * Overlap, with two valid offsets. This is when clocks are set back typically
     *   due to the autumn daylight savings change from "summer" to "winter".
     *   In an overlap there are local date-time values with two valid offsets.
     *
     * A transition is used to model the cases of a Gap or Overlap.
     * The Normal case will return null.
     *
     * There are various ways to handle the conversion from a {@link LocalDateTime}.
     * One technique, using this method, would be:
     * <pre>
     *  ZoneOffsetTransition trans = rules.getTransition(localDT);
     *  if (trans != null) {
     *    // Gap or Overlap: determine what to do from transition
     *  } else {
     *    // Normal case: only one valid offset
     *    zoneOffset = rule.getOffset(localDT);
     *  }
     * </pre>
     *
     * @param {LocalDateTime} localDateTime  the local date-time to query for offset transition, not null, but null
     *  may be ignored if the rules have a single offset for all instants
     * @return {ZoneOffsetTransition} the offset transition, null if the local date-time is not in transition
     */
    // eslint-disable-next-line no-unused-vars
    transition(localDateTime){
        abstractMethodFail('ZoneRules.transition');
    }

    //-----------------------------------------------------------------------
    /**
     * Gets the standard offset for the specified instant in this zone.
     *
     * This provides access to historic information on how the standard offset
     * has changed over time.
     * The standard offset is the offset before any daylight saving time is applied.
     * This is typically the offset applicable during winter.
     *
     * @param {Instant} instant - the instant to find the offset information for, not null, but null
     *  may be ignored if the rules have a single offset for all instants
     * @return {ZoneOffset} the standard offset, not null
     */
    // eslint-disable-next-line no-unused-vars
    standardOffset(instant){
        abstractMethodFail('ZoneRules.standardOffset');
    }

    /**
     * Gets the amount of daylight savings in use for the specified instant in this zone.
     *
     * This provides access to historic information on how the amount of daylight
     * savings has changed over time.
     * This is the difference between the standard offset and the actual offset.
     * Typically the amount is zero during winter and one hour during summer.
     * Time-zones are second-based, so the nanosecond part of the duration will be zero.
     *
     * @param {Instant} instant - the instant to find the daylight savings for, not null, but null
     *  may be ignored if the rules have a single offset for all instants
     * @return {Duration} the difference between the standard and actual offset, not null
     */
    // eslint-disable-next-line no-unused-vars
    daylightSavings(instant){
        abstractMethodFail('ZoneRules.daylightSavings');
        //    default {
        //        ZoneOffset standardOffset = getStandardOffset(instant);
        //        ZoneOffset actualOffset = getOffset(instant);
        //        return actualOffset.toDuration().minus(standardOffset.toDuration()).normalized();
        //    }
    }

    /**
     * Checks if the specified instant is in daylight savings.
     *
     * This checks if the standard and actual offsets are the same at the specified instant.
     *
     * @param {Instant} instant - the instant to find the offset information for, not null, but null
     *  may be ignored if the rules have a single offset for all instants
     * @return {boolean} the standard offset, not null
     */
    // eslint-disable-next-line no-unused-vars
    isDaylightSavings(instant) {
        abstractMethodFail('ZoneRules.isDaylightSavings');
        //    default {
        //        return (getStandardOffset(instant).equals(getOffset(instant)) == false);
        //    }
    }

    /**
     * Checks if the offset date-time is valid for these rules.
     *
     * To be valid, the local date-time must not be in a gap and the offset
     * must match the valid offsets.
     *
     * @param {LocalDateTime} localDateTime - the date-time to check, not null, but null
     *  may be ignored if the rules have a single offset for all instants
     * @param {ZoneOffset} offset - the offset to check, null returns false
     * @return {boolean} true if the offset date-time is valid for these rules
     */
    // eslint-disable-next-line no-unused-vars
    isValidOffset(localDateTime, offset){
        abstractMethodFail('ZoneRules.isValidOffset');
    }

    //-----------------------------------------------------------------------
    /**
     * Gets the next transition after the specified instant.
     *
     * This returns details of the next transition after the specified instant.
     * For example, if the instant represents a point where "Summer" daylight savings time
     * applies, then the method will return the transition to the next "Winter" time.
     *
     * @param {Instant} instant - the instant to get the next transition after, not null, but null
     *  may be ignored if the rules have a single offset for all instants
     * @return {ZoneOffsetTransition} the next transition after the specified instant, null if this is after the last transition
     */
    // eslint-disable-next-line no-unused-vars
    nextTransition(instant){
        abstractMethodFail('ZoneRules.nextTransition');
    }

    /**
     * Gets the previous transition before the specified instant.
     *
     * This returns details of the previous transition after the specified instant.
     * For example, if the instant represents a point where "summer" daylight saving time
     * applies, then the method will return the transition from the previous "winter" time.
     *
     * @param {Instant} instant - the instant to get the previous transition after, not null, but null
     *  may be ignored if the rules have a single offset for all instants
     * @return {ZoneOffsetTransition} the previous transition after the specified instant, null if this is before the first transition
     */
    // eslint-disable-next-line no-unused-vars
    previousTransition(instant){
        abstractMethodFail('ZoneRules.previousTransition');
    }

    /**
     * Gets the complete list of fully defined transitions.
     *
     * The complete set of transitions for this rules instance is defined by this method
     * and {@link getTransitionRules}. This method returns those transitions that have
     * been fully defined. These are typically historical, but may be in the future.
     *
     * The list will be empty for fixed offset rules and for any time-zone where there has
     * only ever been a single offset. The list will also be empty if the transition rules are unknown.
     *
     * @return {ZoneOffsetTransition[]} an immutable list of fully defined transitions, not null
     */
    transitions(){
        abstractMethodFail('ZoneRules.transitions');
    }

    /**
     * Gets the list of transition rules for years beyond those defined in the transition list.
     *
     * The complete set of transitions for this rules instance is defined by this method
     * and {@link getTransitions}. This method returns instances of {@link ZoneOffsetTransitionRule}
     * that define an algorithm for when transitions will occur.
     *
     * For any given {@link ZoneRules}, this list contains the transition rules for years
     * beyond those years that have been fully defined. These rules typically refer to future
     * daylight saving time rule changes.
     *
     * If the zone defines daylight savings into the future, then the list will normally
     * be of size two and hold information about entering and exiting daylight savings.
     * If the zone does not have daylight savings, or information about future changes
     * is uncertain, then the list will be empty.
     *
     * The list will be empty for fixed offset rules and for any time-zone where there is no
     * daylight saving time. The list will also be empty if the transition rules are unknown.
     *
     * @return {ZoneOffsetTransitionRule[]} an immutable list of transition rules, not null
     */
    transitionRules(){
        abstractMethodFail('ZoneRules.transitionRules');
    }

    toString(){
        abstractMethodFail('ZoneRules.toString');
    }

    /**
     * toJSON() use by JSON.stringify
     * delegates to toString()
     *
     * @return {string}
     */
    toJSON() {
        return this.toString();
    }
}


class Fixed extends ZoneRules{
    /**
     *
     * @param {ZoneOffset} offset
     * @private
     */
    constructor(offset){
        super();
        this._offset = offset;
    }

    isFixedOffset(){
        return true;
    }

    offsetOfInstant(){
        return this._offset;
    }

    offsetOfEpochMilli(){
        return this._offset;
    }

    offsetOfLocalDateTime(){
        return this._offset;
    }

    validOffsets(){
        return [this._offset];
    }

    transition(){
        return null;
    }

    standardOffset(){
        return this._offset;
    }

    daylightSavings(){
        return Duration.ZERO;
    }

    isDaylightSavings(){
        return false;
    }

    /**
     *
     * @param {LocalDateTime} localDateTime
     * @param {ZoneOffset} offset
     * @return {boolean}
     */
    isValidOffset(localDateTime, offset) {
        return this._offset.equals(offset);
    }

    nextTransition(){
        return null;
    }

    previousTransition(){
        return null;
    }

    transitions(){
        return [];
    }

    transitionRules(){
        return [];
    }

    //-----------------------------------------------------------------------
    /**
     *
     * @param {*} other
     * @returns {boolean}
     */
    equals(other) {
        if (this === other) {
            return true;
        }
        if (other instanceof Fixed) {
            return this._offset.equals(other._offset);
        }
        return false;
    }

    /**
     *
     * @returns {string}
     */
    toString() {
        return `FixedRules:${this._offset.toString()}`;
    }

}
/*
 * @copyright (c) 2016, Philipp Thürwächter, Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { DateTimeException } from '../errors';

export class ZoneRulesProvider {
    /**
     * Gets the rules for the zone ID.
     *
     * This returns the latest available rules for the zone ID.
     *
     * This method relies on time-zone data provider files that are configured.
     *
     * @param {string} zoneId
     * @return {ZoneRules}
     */
    static getRules(zoneId){
        throw new DateTimeException(`unsupported ZoneId:${zoneId}`);
    }


    /**
     * Gets the set of available zone IDs.
     *
     * These zone IDs are loaded and available for use by {@link ZoneId}.
     *
     * @return {string[]} a modifiable copy of the set of zone IDs, not null
     */
    static getAvailableZoneIds(){
        return [];
    }
}

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { MAX_SAFE_INTEGER, MIN_SAFE_INTEGER } from '../MathUtil';

import { ChronoUnit } from './ChronoUnit';
import { TemporalField } from './TemporalField';
import { ValueRange } from './ValueRange';
import { YearConstants } from '../YearConstants';

/**
 * A standard set of fields.
 *
 * This set of fields provide field-based access to manipulate a date, time or date-time.
 * The standard set of fields can be extended by implementing {@link TemporalField}.
 *
 * These fields are intended to be applicable in multiple calendar systems.
 * For example, most non-ISO calendar systems define dates as a year, month and day,
 * just with slightly different rules.
 * The documentation of each field explains how it operates.
 *
 * ### Static properties:
 *
 * - `ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH`: This represents concept of the count of
 * days within the period of a week where the weeks are aligned to the start of the month.
 * This field is typically used with `ALIGNED_WEEK_OF_MONTH`.
 * 
 * - `ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR`: This represents concept of the count of days
 * within the period of a week where the weeks are aligned to the start of the year.
 * This field is typically used with `ALIGNED_WEEK_OF_YEAR`.
 * 
 * - `ChronoField.ALIGNED_WEEK_OF_MONTH`: This represents concept of the count of weeks within
 * the period of a month where the weeks are aligned to the start of the month. This field
 * is typically used with `ALIGNED_DAY_OF_WEEK_IN_MONTH`.
 * 
 * - `ChronoField.ALIGNED_WEEK_OF_YEAR`: This represents concept of the count of weeks within
 * the period of a year where the weeks are aligned to the start of the year. This field
 * is typically used with `ALIGNED_DAY_OF_WEEK_IN_YEAR`.
 * 
 * - `ChronoField.AMPM_OF_DAY`: This counts the AM/PM within the day, from 0 (AM) to 1 (PM).
 * 
 * - `ChronoField.CLOCK_HOUR_OF_AMPM`: This counts the hour within the AM/PM, from 1 to 12.
 * This is the hour that would be observed on a standard 12-hour analog wall clock.
 * 
 * - `ChronoField.CLOCK_HOUR_OF_DAY`: This counts the hour within the AM/PM, from 1 to 24.
 * This is the hour that would be observed on a 24-hour analog wall clock.
 * 
 * - `ChronoField.DAY_OF_MONTH`: This represents the concept of the day within the month.
 * In the default ISO calendar system, this has values from 1 to 31 in most months.
 * April, June, September, November have days from 1 to 30, while February has days from
 * 1 to 28, or 29 in a leap year.
 * 
 * - `ChronoField.DAY_OF_WEEK`: This represents the standard concept of the day of the week.
 * In the default ISO calendar system, this has values from Monday (1) to Sunday (7).
 * The {@link DayOfWeek} class can be used to interpret the result.
 * 
 * - `ChronoField.DAY_OF_YEAR`: This represents the concept of the day within the year.
 * In the default ISO calendar system, this has values from 1 to 365 in standard years and
 * 1 to 366 in leap years.
 * 
 * - `ChronoField.EPOCH_DAY`: This field is the sequential count of days where
 * 1970-01-01 (ISO) is zero. Note that this uses the local time-line, ignoring offset and
 * time-zone.
 * 
 * - `ChronoField.ERA`: This represents the concept of the era, which is the largest
 * division of the time-line. This field is typically used with `YEAR_OF_ERA`.
 * 
 *     In the default ISO calendar system, there are two eras defined, 'BCE' and 'CE'. The era
 * 'CE' is the one currently in use and year-of-era runs from 1 to the maximum value.
 * The era 'BCE' is the previous era, and the year-of-era runs backwards.
 * 
 * - `ChronoField.HOUR_OF_AMPM`: This counts the hour within the AM/PM, from 0 to 11.
 * This is the hour that would be observed on a standard 12-hour digital clock.
 * 
 * - `ChronoField.HOUR_OF_DAY`: This counts the hour within the day, from 0 to 23. This is
 * the hour that would be observed on a standard 24-hour digital clock.
 * 
 * - `ChronoField.INSTANT_SECONDS`: This represents the concept of the sequential count of
 * seconds where 1970-01-01T00:00Z (ISO) is zero. This field may be used with `NANO_OF_DAY`
 * to represent the fraction of the day.
 * 
 *     An Instant represents an instantaneous point on the time-line. On their own they have
 * no elements which allow a local date-time to be obtained. Only when paired with an offset
 * or time-zone can the local date or time be found. This field allows the seconds part of
 * the instant to be queried.
 * 
 * - `ChronoField.MICRO_OF_DAY`: This counts the microsecond within the day, from 0 to
 * (24 * 60 * 60 * 1,000,000) - 1.
 * 
 *     This field is used to represent the micro-of-day handling any fraction of the second.
 * Implementations of {@link TemporalAccessor} should provide a value for this field if they
 * can return a value for `SECOND_OF_DAY` filling unknown precision with zero.
 * 
 *     When this field is used for setting a value, it should behave in the same way as
 * setting `NANO_OF_DAY` with the value multiplied by 1,000.
 * 
 * - `ChronoField.MICRO_OF_SECOND`: This counts the microsecond within the second, from 0
 * to 999,999.
 * 
 *     This field is used to represent the micro-of-second handling any fraction of the second.
 * Implementations of {@link TemporalAccessor} should provide a value for this field if they
 * can return a value for `SECOND_OF_MINUTE`, `SECOND_OF_DAY` or `INSTANT_SECONDS` filling
 * unknown precision with zero.
 * 
 * - `ChronoField.MILLI_OF_DAY`: This counts the millisecond within the day, from 0 to
 * (24 * 60 * 60 * 1,000) - 1.
 * 
 *     This field is used to represent the milli-of-day handling any fraction of the second.
 * Implementations of {@link TemporalAccessor} should provide a value for this field if they
 * can return a value for `SECOND_OF_DAY` filling unknown precision with zero.
 * 
 *     When this field is used for setting a value, it should behave in the same way as
 * setting `NANO_OF_DAY` with the value multiplied by 1,000,000.
 * 
 * - `ChronoField.MILLI_OF_SECOND`: This counts the millisecond within the second, from 0 to
 * 999.
 * 
 *     This field is used to represent the milli-of-second handling any fraction of the second.
 * Implementations of {@link TemporalAccessor} should provide a value for this field if they can
 * return a value for `SECOND_OF_MINUTE`, `SECOND_OF_DAY` or `INSTANT_SECONDS` filling unknown
 * precision with zero.
 * 
 *     When this field is used for setting a value, it should behave in the same way as
 * setting `NANO_OF_SECOND` with the value multiplied by 1,000,000.
 * 
 * - `ChronoField.MINUTE_OF_DAY`: This counts the minute within the day, from 0 to (24 * 60) - 1.
 * 
 * - `ChronoField.MINUTE_OF_HOUR`: This counts the minute within the hour, from 0 to 59.
 * 
 * - `ChronoField.MONTH_OF_YEAR`: The month-of-year, such as March. This represents the concept
 * of the month within the year. In the default ISO calendar system, this has values from
 * January (1) to December (12).
 * 
 * - `ChronoField.NANO_OF_DAY`: This counts the nanosecond within the day, from 0 to
 * (24 * 60 * 60 * 1,000,000,000) - 1.
 * 
 *     This field is used to represent the nano-of-day handling any fraction of the second.
 * Implementations of {@link TemporalAccessor} should provide a value for this field if they
 * can return a value for `SECOND_OF_DAY` filling unknown precision with zero.
 * 
 * - `ChronoField.NANO_OF_SECOND`: This counts the nanosecond within the second, from 0
 * to 999,999,999.
 * 
 *     This field is used to represent the nano-of-second handling any fraction of the second.
 * Implementations of {@link TemporalAccessor} should provide a value for this field if they
 * can return a value for `SECOND_OF_MINUTE`, `SECOND_OF_DAY` or `INSTANT_SECONDS` filling
 * unknown precision with zero.
 * 
 *     When this field is used for setting a value, it should set as much precision as the
 * object stores, using integer division to remove excess precision. For example, if the
 * {@link TemporalAccessor} stores time to millisecond precision, then the nano-of-second must
 * be divided by 1,000,000 before replacing the milli-of-second.
 * 
 * - `ChronoField.OFFSET_SECONDS`: This represents the concept of the offset in seconds of
 * local time from UTC/Greenwich.
 * 
 *     A {@link ZoneOffset} represents the period of time that local time differs from
 * UTC/Greenwich. This is usually a fixed number of hours and minutes. It is equivalent to
 * the total amount of the offset in seconds. For example, during the winter Paris has an
 * offset of +01:00, which is 3600 seconds.
 * 
 * - `ChronoField.PROLEPTIC_MONTH`: The proleptic-month, which counts months sequentially
 * from year 0.
 * 
 *     The first month in year zero has the value zero. The value increase for later months
 * and decrease for earlier ones. Note that this uses the local time-line, ignoring offset
 * and time-zone.
 * 
 * - `ChronoField.SECOND_OF_DAY`: This counts the second within the day, from 0 to
 * (24 * 60 * 60) - 1.
 * 
 * - `ChronoField.SECOND_OF_MINUTE`: This counts the second within the minute, from 0 to 59.
 * 
 * - `ChronoField.YEAR`: The proleptic year, such as 2012. This represents the concept of
 * the year, counting sequentially and using negative numbers. The proleptic year is not
 * interpreted in terms of the era.
 * 
 *     The standard mental model for a date is based on three concepts - year, month and day.
 * These map onto the `YEAR`, `MONTH_OF_YEAR` and `DAY_OF_MONTH` fields. Note that there is no
 * reference to eras. The full model for a date requires four concepts - era, year, month and
 * day. These map onto the `ERA`, `YEAR_OF_ERA`, `MONTH_OF_YEAR` and `DAY_OF_MONTH` fields.
 * Whether this field or `YEAR_OF_ERA` is used depends on which mental model is being used.
 * 
 * - `ChronoField.YEAR_OF_ERA`: This represents the concept of the year within the era. This
 * field is typically used with `ERA`. The standard mental model for a date is based on three
 * concepts - year, month and day. These map onto the `YEAR`, `MONTH_OF_YEAR` and
 * `DAY_OF_MONTH` fields. Note that there is no reference to eras. The full model for a date
 * requires four concepts - era, year, month and day. These map onto the `ERA`, `YEAR_OF_ERA`,
 * `MONTH_OF_YEAR` and `DAY_OF_MONTH` fields. Whether this field or `YEAR` is used depends on
 * which mental model is being used.
 * 
 *     In the default ISO calendar system, there are two eras defined, 'BCE' and 'CE'.
 * The era 'CE' is the one currently in use and year-of-era runs from 1 to the maximum value.
 * The era 'BCE' is the previous era, and the year-of-era runs backwards.
 * 
 *     For example, subtracting a year each time yield the following:
 *    - year-proleptic 2 = 'CE' year-of-era 2
 *    - year-proleptic 1 = 'CE' year-of-era 1
 *    - year-proleptic 0 = 'BCE' year-of-era 1
 *    - year-proleptic -1 = 'BCE' year-of-era 2
 * 
 *     Note that the ISO-8601 standard does not actually define eras. Note also that the
 * ISO eras do not align with the well-known AD/BC eras due to the change between the Julian
 * and Gregorian calendar systems.
 */
export class ChronoField extends TemporalField {

    /**
     * helper function to get one of the static ChronoField defines by name, needed to resolve ChronoField from EnumMap
     *
     * @param {String} fieldName
     * @return {ChronoField | null}
     * @private
     */
    static byName(fieldName) {
        for (const prop in ChronoField) {
            if (ChronoField[prop]) {
                if ((ChronoField[prop] instanceof ChronoField) && ChronoField[prop].name() === fieldName) {
                    return ChronoField[prop];
                }
            }
        }
    }

    /**
     *
     * @param {!string} name
     * @param {!TemporalUnit} baseUnit
     * @param {!TemporalUnit} rangeUnit
     * @param {!ValueRange} range
     * @private
     */
    constructor(name, baseUnit, rangeUnit, range) {
        super();
        this._name = name;
        this._baseUnit = baseUnit;
        this._rangeUnit = rangeUnit;
        this._range = range;
    }

    /**
     * @return {string}
     */
    name(){
        return this._name;
    }

    /**
     * @return {TemporalUnit} the period unit defining the base unit of the field.
     */
    baseUnit(){
        return this._baseUnit;
    }

    /**
     * @return {TemporalUnit} the period unit defining the range of the field.
     */
    rangeUnit(){
        return this._rangeUnit;
    }

    /**
     * @return {ValueRange} the range of valid values for the field.
     */
    range(){
        return this._range;
    }

    /**
     * @returns {string}
     */
    displayName(){
        return this.toString();
    }

    /**
     * Checks that the specified value is valid for this field.
     *
     * This validates that the value is within the outer range of valid values
     * returned by {@link range}.
     *
     * This method checks against the range of the field in the ISO-8601 calendar system.
     *
     * @param {!number} value the value to check.
     * @returns {number} the value that was passed in.
     */
    checkValidValue(value) {
        return this.range().checkValidValue(value, this);
    }

    /**
     * Checks that the specified value is valid and fits in an `int`.
     *
     * This validates that the value is within the outer range of valid values
     * returned by {@link range}.
     * It also checks that all valid values are within the bounds of an `int`.
     *
     * This method checks against the range of the field in the ISO-8601 calendar system.
     *
     * @param {number} value the value to check.
     * @return {number} the value that was passed in.
     */
    checkValidIntValue(value) {
        return this.range().checkValidIntValue(value, this);
    }

    /**
     * @return {boolean} `true` if it is a component of a date, `false` otherwise.
     */
    isDateBased() {
        const dateBased =
            this === ChronoField.DAY_OF_WEEK ||
            this === ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH ||
            this === ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR ||
            this === ChronoField.DAY_OF_MONTH ||
            this === ChronoField.DAY_OF_YEAR ||
            this === ChronoField.EPOCH_DAY ||
            this === ChronoField.ALIGNED_WEEK_OF_MONTH ||
            this === ChronoField.ALIGNED_WEEK_OF_YEAR ||
            this === ChronoField.MONTH_OF_YEAR ||
            //this === ChronoField.EPOCH_MONTH ||
            this === ChronoField.YEAR_OF_ERA ||
            this === ChronoField.YEAR ||
            this === ChronoField.ERA;
        return dateBased;
    }

    /**
     * @return {boolean} `true` if it is a component of a time, `false` otherwise.
     */
    isTimeBased() {
        const timeBased =
            this === ChronoField.NANO_OF_SECOND     ||
            this === ChronoField.NANO_OF_DAY        ||
            this === ChronoField.MICRO_OF_SECOND    ||
            this === ChronoField.MICRO_OF_DAY       ||
            this === ChronoField.MILLI_OF_SECOND    ||
            this === ChronoField.MILLI_OF_DAY       ||
            this === ChronoField.SECOND_OF_MINUTE   ||
            this === ChronoField.SECOND_OF_DAY      ||
            this === ChronoField.MINUTE_OF_HOUR     ||
            this === ChronoField.MINUTE_OF_DAY      ||
            this === ChronoField.HOUR_OF_AMPM       ||
            this === ChronoField.CLOCK_HOUR_OF_AMPM ||
            this === ChronoField.HOUR_OF_DAY        ||
            this === ChronoField.CLOCK_HOUR_OF_DAY  ||
            this === ChronoField.AMPM_OF_DAY;
        return timeBased;
    }

    /**
     * @param {!TemporalAccessor} temporal the temporal object used to refine the result.
     * @return {ValueRange} the range of valid values for this field.
     * @throws {DateTimeException} if the range for the field cannot be obtained.
     */
    rangeRefinedBy(temporal) {
        return temporal.range(this);
    }

    

    /**
     * @param {!TemporalAccesor} temporal the temporal object to query.
     * @return {number} the value of this field.
     * @throws {DateTimeException} if a value for the field cannot be obtained.
     */
    getFrom(temporal) {
        return temporal.getLong(this);
    }

    /**
     * @returns {string}
     */
    toString(){
        return this.name();
    }

    /**
     * @param {*} other
     * @returns {boolean}
     */
    equals(other){
        return this === other;
    }

    /**
     * @param {!Temporal} temporal the temporal object to adjust.
     * @param {!number} newValue the new value of the field.
     * @return {Temporal} the adjusted temporal object.
     * @throws {DateTimeException} if the field cannot be set.
     */
    adjustInto(temporal, newValue) {
        return temporal.with(this, newValue);
    }

    /**
     * @param {!TemporalAccesor} temporal the temporal object to query.
     * @return {boolean} `true` if the date-time can be queried for this field, `false` if not.
     */
    isSupportedBy(temporal) {
        return temporal.isSupported(this);
    }
}

export function _init() {

    ChronoField.NANO_OF_SECOND = new ChronoField('NanoOfSecond', ChronoUnit.NANOS, ChronoUnit.SECONDS, ValueRange.of(0, 999999999));

    ChronoField.NANO_OF_DAY = new ChronoField('NanoOfDay', ChronoUnit.NANOS, ChronoUnit.DAYS, ValueRange.of(0, 86400 * 1000000000 - 1));

    ChronoField.MICRO_OF_SECOND = new ChronoField('MicroOfSecond', ChronoUnit.MICROS, ChronoUnit.SECONDS, ValueRange.of(0, 999999));

    ChronoField.MICRO_OF_DAY = new ChronoField('MicroOfDay', ChronoUnit.MICROS, ChronoUnit.DAYS, ValueRange.of(0, 86400 * 1000000 - 1));

    ChronoField.MILLI_OF_SECOND = new ChronoField('MilliOfSecond', ChronoUnit.MILLIS, ChronoUnit.SECONDS, ValueRange.of(0, 999));

    ChronoField.MILLI_OF_DAY = new ChronoField('MilliOfDay', ChronoUnit.MILLIS, ChronoUnit.DAYS, ValueRange.of(0, 86400 * 1000 - 1));

    ChronoField.SECOND_OF_MINUTE = new ChronoField('SecondOfMinute', ChronoUnit.SECONDS, ChronoUnit.MINUTES, ValueRange.of(0, 59));

    ChronoField.SECOND_OF_DAY = new ChronoField('SecondOfDay', ChronoUnit.SECONDS, ChronoUnit.DAYS, ValueRange.of(0, 86400 - 1));

    ChronoField.MINUTE_OF_HOUR = new ChronoField('MinuteOfHour', ChronoUnit.MINUTES, ChronoUnit.HOURS, ValueRange.of(0, 59));

    ChronoField.MINUTE_OF_DAY = new ChronoField('MinuteOfDay', ChronoUnit.MINUTES, ChronoUnit.DAYS, ValueRange.of(0, (24 * 60) - 1));

    ChronoField.HOUR_OF_AMPM = new ChronoField('HourOfAmPm', ChronoUnit.HOURS, ChronoUnit.HALF_DAYS, ValueRange.of(0, 11));

    ChronoField.CLOCK_HOUR_OF_AMPM = new ChronoField('ClockHourOfAmPm', ChronoUnit.HOURS, ChronoUnit.HALF_DAYS, ValueRange.of(1, 12));

    ChronoField.HOUR_OF_DAY = new ChronoField('HourOfDay', ChronoUnit.HOURS, ChronoUnit.DAYS, ValueRange.of(0, 23));

    ChronoField.CLOCK_HOUR_OF_DAY = new ChronoField('ClockHourOfDay', ChronoUnit.HOURS, ChronoUnit.DAYS, ValueRange.of(1, 24));

    ChronoField.AMPM_OF_DAY = new ChronoField('AmPmOfDay', ChronoUnit.HALF_DAYS, ChronoUnit.DAYS, ValueRange.of(0, 1));

    ChronoField.DAY_OF_WEEK = new ChronoField('DayOfWeek', ChronoUnit.DAYS, ChronoUnit.WEEKS, ValueRange.of(1, 7));

    ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH = new ChronoField('AlignedDayOfWeekInMonth', ChronoUnit.DAYS, ChronoUnit.WEEKS, ValueRange.of(1, 7));

    ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR = new ChronoField('AlignedDayOfWeekInYear', ChronoUnit.DAYS, ChronoUnit.WEEKS, ValueRange.of(1, 7));

    ChronoField.DAY_OF_MONTH = new ChronoField('DayOfMonth', ChronoUnit.DAYS, ChronoUnit.MONTHS, ValueRange.of(1, 28, 31), 'day');

    ChronoField.DAY_OF_YEAR = new ChronoField('DayOfYear', ChronoUnit.DAYS, ChronoUnit.YEARS, ValueRange.of(1, 365, 366));

    ChronoField.EPOCH_DAY = new ChronoField('EpochDay', ChronoUnit.DAYS, ChronoUnit.FOREVER, ValueRange.of(Math.floor(YearConstants.MIN_VALUE * 365.25), Math.floor(YearConstants.MAX_VALUE * 365.25)));

    ChronoField.ALIGNED_WEEK_OF_MONTH = new ChronoField('AlignedWeekOfMonth', ChronoUnit.WEEKS, ChronoUnit.MONTHS, ValueRange.of(1, 4, 5));

    ChronoField.ALIGNED_WEEK_OF_YEAR = new ChronoField('AlignedWeekOfYear', ChronoUnit.WEEKS, ChronoUnit.YEARS, ValueRange.of(1, 53));

    ChronoField.MONTH_OF_YEAR = new ChronoField('MonthOfYear', ChronoUnit.MONTHS, ChronoUnit.YEARS, ValueRange.of(1, 12), 'month');

    ChronoField.PROLEPTIC_MONTH = new ChronoField('ProlepticMonth', ChronoUnit.MONTHS, ChronoUnit.FOREVER, ValueRange.of(YearConstants.MIN_VALUE * 12, YearConstants.MAX_VALUE * 12 + 11));

    ChronoField.YEAR_OF_ERA = new ChronoField('YearOfEra', ChronoUnit.YEARS, ChronoUnit.FOREVER, ValueRange.of(1, YearConstants.MAX_VALUE, YearConstants.MAX_VALUE + 1));

    ChronoField.YEAR = new ChronoField('Year', ChronoUnit.YEARS, ChronoUnit.FOREVER, ValueRange.of(YearConstants.MIN_VALUE, YearConstants.MAX_VALUE), 'year');

    ChronoField.ERA = new ChronoField('Era', ChronoUnit.ERAS, ChronoUnit.FOREVER, ValueRange.of(0, 1));

    ChronoField.INSTANT_SECONDS = new ChronoField('InstantSeconds', ChronoUnit.SECONDS, ChronoUnit.FOREVER, ValueRange.of(MIN_SAFE_INTEGER, MAX_SAFE_INTEGER));

    ChronoField.OFFSET_SECONDS = new ChronoField('OffsetSeconds', ChronoUnit.SECONDS, ChronoUnit.FOREVER, ValueRange.of(-18 * 3600, 18 * 3600));

}
/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { MathUtil } from '../MathUtil';

import { Duration } from '../Duration';
import { YearConstants } from '../YearConstants';
import { TemporalUnit } from './TemporalUnit';

/**
 * A standard set of date periods units.
 *
 * This set of units provide unit-based access to manipulate a date, time or date-time.
 * The standard set of units can be extended by implementing {@link TemporalUnit}.
 *
 * These units are intended to be applicable in multiple calendar systems.
 * For example, most non-ISO calendar systems define units of years, months and days,
 * just with slightly different rules.
 * The documentation of each unit explains how it operates.
 *
 * ### Static properties:
 * 
 * - `ChronoUnit.CENTURIES`: Unit that represents the concept of a century. For the ISO calendar
 * system, it is equal to 100 years.
 * 
 * - `ChronoUnit.DAYS`: Unit that represents the concept of a day. For the ISO calendar system, it
 * is the standard day from midnight to midnight. The estimated duration of a day is 24 Hours.
 * 
 * - `ChronoUnit.DECADES`: Unit that represents the concept of a decade. For the ISO calendar system,
 * it is equal to 10 years.
 * 
 * - `ChronoUnit.ERAS`: Unit that represents the concept of an era. The ISO calendar system doesn't
 * have eras thus it is impossible to add an era to a date or date-time. The estimated duration of the
 * era is artificially defined as 1,000,000,000 Years.
 * 
 * - `ChronoUnit.FOREVER`: Artificial unit that represents the concept of forever. This is primarily
 * used with {@link TemporalField} to represent unbounded fields such as the year or era. The
 * estimated duration of the era is artificially defined as the largest duration supported by
 * {@link Duration}.
 * 
 * - `ChronoUnit.HALF_DAYS`: Unit that represents the concept of half a day, as used in AM/PM. For
 * the ISO calendar system, it is equal to 12 hours.
 *
 * - `ChronoUnit.HOURS`: Unit that represents the concept of an hour. For the ISO calendar system,
 * it is equal to 60 minutes.
 * 
 * - `ChronoUnit.MICROS`: Unit that represents the concept of a microsecond. For the ISO calendar
 * system, it is equal to the 1,000,000th part of the second unit.
 * 
 * - `ChronoUnit.MILLENNIA`: Unit that represents the concept of a millennium. For the ISO calendar
 * system, it is equal to 1,000 years.
 * 
 * - `ChronoUnit.MILLIS`: Unit that represents the concept of a millisecond. For the ISO calendar
 * system, it is equal to the 1000th part of the second unit.
 * 
 * - `ChronoUnit.MINUTES`: Unit that represents the concept of a minute. For the ISO calendar system,
 * it is equal to 60 seconds.
 * 
 * - `ChronoUnit.MONTHS`: Unit that represents the concept of a month. For the ISO calendar system,
 * the length of the month varies by month-of-year. The estimated duration of a month is one twelfth
 * of 365.2425 Days.
 * 
 * - `ChronoUnit.NANOS`: Unit that represents the concept of a nanosecond, the smallest supported unit
 * of time. For the ISO calendar system, it is equal to the 1,000,000,000th part of the second unit.
 * 
 * - `ChronoUnit.SECONDS`: Unit that represents the concept of a second. For the ISO calendar system,
 * it is equal to the second in the SI system of units, except around a leap-second.
 * 
 * - `ChronoUnit.WEEKS`: Unit that represents the concept of a week. For the ISO calendar system,
 * it is equal to 7 Days.
 * 
 * - `ChronoUnit.YEARS`: Unit that represents the concept of a year. For the ISO calendar system, it
 * is equal to 12 months. The estimated duration of a year is 365.2425 Days.
 */
export class ChronoUnit extends TemporalUnit {

    /**
     *
     * @param {String} name
     * @param {Duration} estimatedDuration
     * @private
     */
    constructor (name, estimatedDuration) {
        super();
        this._name = name;
        this._duration = estimatedDuration;
    }

    //-----------------------------------------------------------------------
    /**
     * @return {Duration} the duration of this unit, which may be an estimate.
     */
    duration() {
        return this._duration;
    }

    /**
     * @return {boolean} `true` if the duration is estimated, `false` if accurate.
     */
    isDurationEstimated() {
        return this.isDateBased() || this === ChronoUnit.FOREVER;
    }

    //-----------------------------------------------------------------------
    /**
     * @return {boolean} `true` if date unit, `false` if a time unit.
     */
    isDateBased() {
        return this.compareTo(ChronoUnit.DAYS) >= 0 && this !== ChronoUnit.FOREVER;
    }

    /**
     * Checks if this unit is a time unit.
     *
     * @return {boolean} `true` if time unit, `false` if a date unit.
     */
    isTimeBased() {
        return this.compareTo(ChronoUnit.DAYS) < 0;
    }

    //-----------------------------------------------------------------------
    /**
     * @param {!Temporal} temporal the temporal object to check.
     * @return {boolean} `true` if the unit is supported.
     */
    isSupportedBy(temporal) {
        if (this === ChronoUnit.FOREVER) {
            return false;
        }
        /* TODO: classes not implemented yet */
        /*
        if (temporal instanceof ChronoLocalDate) {
            return isDateBased();
        }
        if (temporal instanceof ChronoLocalDateTime || temporal instanceof ChronoZonedDateTime) {
            return true;
        }
*/
        try {
            temporal.plus(1, this);
            return true;
        } catch (e) {
            try {
                temporal.plus(-1, this);
                return true;
            } catch (e2) {
                return false;
            }
        }
    }

    /**
     * @param {!Temporal} temporal the temporal object to adjust.
     * @param {number} amount the period of this unit to add, positive or negative.
     * @return {Temporal} the adjusted temporal object.
     * @throws DateTimeException if the period cannot be added.
     */
    addTo(temporal, amount) {
        return temporal.plus(amount, this);
    }

    //-----------------------------------------------------------------------
    /**
     * @param {!Temporal} temporal1 the base temporal object.
     * @param {!Temporal} temporal2 the other temporal object.
     * @return {number} the period between temporal1 and temporal2 in terms of this unit;
     *  positive if temporal2 is later than temporal1, negative if earlier.
     * @throws DateTimeException if the period cannot be calculated.
     * @throws ArithmeticException if numeric overflow occurs.
     */
    between(temporal1, temporal2) {
        return temporal1.until(temporal2, this);
    }

    //-----------------------------------------------------------------------
    toString() {
        return this._name;
    }

    /**
     * Compares this ChronoUnit to the specified {@link TemporalUnit}.
     *
     * The comparison is based on the total length of the durations.
     *
     * @param {!TemporalUnit} other the other unit to compare to.
     * @return the comparator value, negative if less, positive if greater.
     */
    compareTo(other) {
        return this.duration().compareTo(other.duration());
    }

}

export function _init() {
    /**
     * Unit that represents the concept of a nanosecond, the smallest supported unit of time.
     * For the ISO calendar system, it is equal to the 1,000,000,000th part of the second unit.
     */
    ChronoUnit.NANOS = new ChronoUnit('Nanos', Duration.ofNanos(1));
    /**
     * Unit that represents the concept of a microsecond.
     * For the ISO calendar system, it is equal to the 1,000,000th part of the second unit.
     */
    ChronoUnit.MICROS = new ChronoUnit('Micros', Duration.ofNanos(1000));
    /**
     * Unit that represents the concept of a millisecond.
     * For the ISO calendar system, it is equal to the 1000th part of the second unit.
     */
    ChronoUnit.MILLIS = new ChronoUnit('Millis', Duration.ofNanos(1000000));
    /**
     * Unit that represents the concept of a second.
     * For the ISO calendar system, it is equal to the second in the SI system
     * of units, except around a leap-second.
     */
    ChronoUnit.SECONDS = new ChronoUnit('Seconds', Duration.ofSeconds(1));
    /**
     * Unit that represents the concept of a minute.
     * For the ISO calendar system, it is equal to 60 seconds.
     */
    ChronoUnit.MINUTES = new ChronoUnit('Minutes', Duration.ofSeconds(60));
    /**
     * Unit that represents the concept of an hour.
     * For the ISO calendar system, it is equal to 60 minutes.
     */
    ChronoUnit.HOURS = new ChronoUnit('Hours', Duration.ofSeconds(3600));
    /**
     * Unit that represents the concept of half a day, as used in AM/PM.
     * For the ISO calendar system, it is equal to 12 hours.
     */
    ChronoUnit.HALF_DAYS = new ChronoUnit('HalfDays', Duration.ofSeconds(43200));
    /**
     * Unit that represents the concept of a day.
     * For the ISO calendar system, it is the standard day from midnight to midnight.
     * The estimated duration of a day is 24 hours.
     *
     * When used with other calendar systems it must correspond to the day defined by
     * the rising and setting of the Sun on Earth. It is not required that days begin
     * at midnight - when converting between calendar systems, the date should be
     * equivalent at midday.
     */
    ChronoUnit.DAYS = new ChronoUnit('Days', Duration.ofSeconds(86400));
    /**
     * Unit that represents the concept of a week.
     * For the ISO calendar system, it is equal to 7 days.
     *
     * When used with other calendar systems it must correspond to an integral number of days.
     */
    ChronoUnit.WEEKS = new ChronoUnit('Weeks', Duration.ofSeconds(7 * 86400));
    /**
     * Unit that represents the concept of a month.
     * For the ISO calendar system, the length of the month varies by month-of-year.
     * The estimated duration of a month is one twelfth of 365.2425 days.
     *
     * When used with other calendar systems it must correspond to an integral number of days.
     */
    ChronoUnit.MONTHS = new ChronoUnit('Months', Duration.ofSeconds(31556952 / 12));
    /**
     * Unit that represents the concept of a year.
     * For the ISO calendar system, it is equal to 12 months.
     * The estimated duration of a year is 365.2425 days.
     *
     * When used with other calendar systems it must correspond to an integral number of days
     * or months roughly equal to a year defined by the passage of the Earth around the Sun.
     */
    ChronoUnit.YEARS = new ChronoUnit('Years', Duration.ofSeconds(31556952));
    /**
     * Unit that represents the concept of a decade.
     * For the ISO calendar system, it is equal to 10 years.
     *
     * When used with other calendar systems it must correspond to an integral number of days
     * and is normally an integral number of years.
     */
    ChronoUnit.DECADES = new ChronoUnit('Decades', Duration.ofSeconds(31556952 * 10));
    /**
     * Unit that represents the concept of a century.
     * For the ISO calendar system, it is equal to 100 years.
     *
     * When used with other calendar systems it must correspond to an integral number of days
     * and is normally an integral number of years.
     */
    ChronoUnit.CENTURIES = new ChronoUnit('Centuries', Duration.ofSeconds(31556952 * 100));
    /**
     * Unit that represents the concept of a millennium.
     * For the ISO calendar system, it is equal to 1000 years.
     *
     * When used with other calendar systems it must correspond to an integral number of days
     * and is normally an integral number of years.
     */
    ChronoUnit.MILLENNIA = new ChronoUnit('Millennia', Duration.ofSeconds(31556952 * 1000));
    /**
     * Unit that represents the concept of an era.
     * The ISO calendar system doesn't have eras thus it is impossible to add
     * an era to a date or date-time.
     * The estimated duration of the era is artificially defined as {Year.MAX_VALUE} + 1.
     *
     * When used with other calendar systems there are no restrictions on the unit.
     */
    ChronoUnit.ERAS = new ChronoUnit('Eras', Duration.ofSeconds(31556952 * (YearConstants.MAX_VALUE + 1)));
    /**
     * Artificial unit that represents the concept of forever.
     * This is primarily used with {@link TemporalField} to represent unbounded fields
     * such as the year or era.
     * The estimated duration of the era is artificially defined as the largest duration
     * supported by {@link Duration}.
     */
    ChronoUnit.FOREVER = new ChronoUnit('Forever', Duration.ofSeconds(MathUtil.MAX_SAFE_INTEGER, 999999999));
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { UnsupportedTemporalTypeException, IllegalStateException } from '../errors';

import { DayOfWeek } from '../DayOfWeek';
import { Duration } from '../Duration';
import { MathUtil } from '../MathUtil';
import { LocalDate } from '../LocalDate';

import { ChronoField } from './ChronoField';
import { ChronoUnit } from './ChronoUnit';
import { TemporalField } from './TemporalField';
import { TemporalUnit } from './TemporalUnit';
import { ValueRange } from './ValueRange';

import { IsoChronology } from '../chrono/IsoChronology';

import { ResolverStyle } from '../format/ResolverStyle';

/**
 * Fields and units specific to the ISO-8601 calendar system,
 * including quarter-of-year and week-based-year.
 *
 * This class defines fields and units that are specific to the ISO calendar system.
 *
 * ### Quarter of year
 *
 * The ISO-8601 standard is based on the standard civic 12 month year.
 * This is commonly divided into four quarters, often abbreviated as Q1, Q2, Q3 and Q4.
 *
 * January, February and March are in Q1.
 * April, May and June are in Q2.
 * July, August and September are in Q3.
 * October, November and December are in Q4.
 *
 * The complete date is expressed using three fields:
 *
 * * `IsoFields.DAY_OF_QUARTER` - the day within the quarter, from 1 to 90, 91 or 92
 * * `QUARTER_OF_YEAR` - the week within the week-based-year
 * * `ChronoField.YEAR` - the standard ISO year (see {@link ChronoField})
 *
 * ### Week based years
 *
 * The ISO-8601 standard was originally intended as a data interchange format,
 * defining a string format for dates and times. However, it also defines an
 * alternate way of expressing the date, based on the concept of week-based-year.
 *
 * The date is expressed using three fields:
 *
 * * `ChronoField.DAY_OF_WEEK` - the standard field defining the
 *   day-of-week from Monday (1) to Sunday (7) (see {@link ChronoField})
 * * `WEEK_OF_WEEK_BASED_YEAR` - the week within the week-based-year
 * * `WEEK_BASED_YEAR` - the week-based-year 
 *
 * The week-based-year itself is defined relative to the standard ISO proleptic year.
 * It differs from the standard year in that it always starts on a Monday.
 *
 * The first week of a week-based-year is the first Monday-based week of the standard
 * ISO year that has at least 4 days in the new year.
 *
 * * If January 1st is Monday then week 1 starts on January 1st
 * * If January 1st is Tuesday then week 1 starts on December 31st of the previous standard year
 * * If January 1st is Wednesday then week 1 starts on December 30th of the previous standard year
 * * If January 1st is Thursday then week 1 starts on December 29th of the previous standard year
 * * If January 1st is Friday then week 1 starts on January 4th
 * * If January 1st is Saturday then week 1 starts on January 3rd
 * * If January 1st is Sunday then week 1 starts on January 2nd
 *
 * There are 52 weeks in most week-based years, however on occasion there are 53 weeks.
 *
 * For example:
 *
 * * Sunday, 2008-12-28: Week 52 of week-based-year 2008
 * * Monday, 2008-12-29: Week 1 of week-based-year 2009
 * * Wednesday, 2008-12-31: Week 1 of week-based-year 2009
 * * Thursday, 2009-01-01: Week 1 of week-based-year 2009
 * * Sunday, 2009-01-04: Week 1 of week-based-year 2009
 * * Monday, 2009-01-05: Week 2 of week-based-year 2009
 *
 * @property {TemporalField} DAY_OF_QUARTER The field that represents the day-of-quarter.
 *
 * This field allows the day-of-quarter value to be queried and set.
 * The day-of-quarter has values from 1 to 90 in Q1 of a standard year, from 1 to 91
 * in Q1 of a leap year, from 1 to 91 in Q2 and from 1 to 92 in Q3 and Q4.
 *
 * The day-of-quarter can only be calculated if the day-of-year, month-of-year and year
 * are available.
 *
 * When setting this field, the value is allowed to be partially lenient, taking any
 * value from 1 to 92. If the quarter has less than 92 days, then day 92, and
 * potentially day 91, is in the following quarter.
 *
 * @property {TemporalField} QUARTER_OF_YEAR The field that represents the quarter-of-year.
 *
 * This field allows the quarter-of-year value to be queried and set.
 * The quarter-of-year has values from 1 to 4.
 *
 * The day-of-quarter can only be calculated if the month-of-year is available.
 *
 * @property {TemporalField} WEEK_OF_WEEK_BASED_YEAR The field that represents the
 * week-of-week-based-year.
 *
 * This field allows the week of the week-based-year value to be queried and set.
 *
 * @property {TemporalField} WEEK_BASED_YEAR The field that represents the week-based-year.
 *
 * This field allows the week-based-year value to be queried and set.
 *
 * @property {TemporalField} WEEK_BASED_YEARS The unit that represents week-based-years for
 * the purpose of addition and subtraction.
 *
 * This allows a number of week-based-years to be added to, or subtracted from, a date.
 * The unit is equal to either 52 or 53 weeks.
 * The estimated duration of a week-based-year is the same as that of a standard ISO
 * year at 365.2425 days.
 *
 * The rules for addition add the number of week-based-years to the existing value
 * for the week-based-year field. If the resulting week-based-year only has 52 weeks,
 * then the date will be in week 1 of the following week-based-year.
 *
 * @property {TemporalField} QUARTER_YEARS Unit that represents the concept of a quarter-year.
 * For the ISO calendar system, it is equal to 3 months.
 * The estimated duration of a quarter-year is one quarter of 365.2425 days.
 * 
 * @typedef {Object} IsoFields
 * @type {Object}
 */
export const IsoFields = {};

//-----------------------------------------------------------------------

const QUARTER_DAYS = [0, 90, 181, 273, 0, 91, 182, 274];

/**
 * Implementation of the field.
 * @private
 */
class Field extends TemporalField{

    /**
     *
     * @returns {boolean}
     */
    isDateBased() {
        return true;
    }

    /**
     *
     * @returns {boolean}
     */
    isTimeBased() {
        return false;
    }

    /**
     *
     * @returns {boolean}
     */
    _isIso() {
        return true;
    }

    /**
     *
     * @param {LocalDate} date
     * @returns {ValueRange}
     */
    static _getWeekRangeByLocalDate(date) {
        const wby = Field._getWeekBasedYear(date);
        return ValueRange.of(1, Field._getWeekRangeByYear(wby));
    }

    /**
     *
     * @param {number} wby
     * @returns {number}
     */
    static _getWeekRangeByYear(wby) {
        const date = LocalDate.of(wby, 1, 1);
        // 53 weeks if standard year starts on Thursday, or Wed in a leap year
        if (date.dayOfWeek() === DayOfWeek.THURSDAY || (date.dayOfWeek() === DayOfWeek.WEDNESDAY && date.isLeapYear())) {
            return 53;
        }
        return 52;
    }

    /**
     *
     * @param {LocalDate} date
     * @returns {number}
     */
    static _getWeek(date) {
        const dow0 = date.dayOfWeek().ordinal();
        const doy0 = date.dayOfYear() - 1;
        const doyThu0 = doy0 + (3 - dow0);  // adjust to mid-week Thursday (which is 3 indexed from zero)
        const alignedWeek = MathUtil.intDiv(doyThu0, 7);
        const firstThuDoy0 = doyThu0 - (alignedWeek * 7);
        let firstMonDoy0 = firstThuDoy0 - 3;
        if (firstMonDoy0 < -3) {
            firstMonDoy0 += 7;
        }
        if (doy0 < firstMonDoy0) {
            return Field._getWeekRangeByLocalDate(date.withDayOfYear(180).minusYears(1)).maximum();
        }
        let week = MathUtil.intDiv((doy0 - firstMonDoy0), 7) + 1;
        if (week === 53) {
            if ((firstMonDoy0 === -3 || (firstMonDoy0 === -2 && date.isLeapYear())) === false) {
                week = 1;
            }
        }
        return week;
    }

    /**
     *
     * @param {LocalDate} date
     * @returns {number}
     */
    static _getWeekBasedYear(date) {
        let year = date.year();
        let doy = date.dayOfYear();
        if (doy <= 3) {
            const dow = date.dayOfWeek().ordinal();
            if (doy - dow < -2) {
                year--;
            }
        } else if (doy >= 363) {
            const dow = date.dayOfWeek().ordinal();
            doy = doy - 363 - (date.isLeapYear() ? 1 : 0);
            if (doy - dow >= 0) {
                year++;
            }
        }
        return year;
    }

    /**
     *
     * @returns {string}
     */
    displayName(/*locale*/) {
        return this.toString();
    }

    /**
     *
     * @returns {null}
     */
    resolve() {
        return null;
    }

    name(){
        return this.toString();
    }

}

/**
 * @private
 */
class DAY_OF_QUARTER_FIELD extends Field {

    /**
     *
     * @returns {string}
     */
    toString() {
        return 'DayOfQuarter';
    }

    /**
     *
     * @returns {TemporalUnit}
     */
    baseUnit() {
        return ChronoUnit.DAYS;
    }

    /**
     *
     * @returns {TemporalUnit}
     */
    rangeUnit() {
        return QUARTER_YEARS;
    }

    /**
     *
     * @returns {ValueRange}
     */
    range() {
        return ValueRange.of(1, 90, 92);
    }

    /**
     *
     * @param {TemporalAccessor} temporal
     * @returns {boolean}
     */
    isSupportedBy(temporal) {
        return temporal.isSupported(ChronoField.DAY_OF_YEAR) && temporal.isSupported(ChronoField.MONTH_OF_YEAR) &&
            temporal.isSupported(ChronoField.YEAR) && this._isIso(temporal);
    }


    /**
     *
     * @param {TemporalAccessor} temporal
     * @returns {ValueRange}
     */
    rangeRefinedBy(temporal) {
        if (temporal.isSupported(this) === false) {
            throw new UnsupportedTemporalTypeException('Unsupported field: DayOfQuarter');
        }
        const qoy = temporal.getLong(QUARTER_OF_YEAR);
        if (qoy === 1) {
            const year = temporal.getLong(ChronoField.YEAR);
            return (IsoChronology.isLeapYear(year) ? ValueRange.of(1, 91) : ValueRange.of(1, 90));
        } else if (qoy === 2) {
            return ValueRange.of(1, 91);
        } else if (qoy === 3 || qoy === 4) {
            return ValueRange.of(1, 92);
        } // else value not from 1 to 4, so drop through
        return this.range();
    }

    /**
     *
     * @param {TemporalAccessor} temporal
     * @returns {number}
     */
    getFrom(temporal) {
        if (temporal.isSupported(this) === false) {
            throw new UnsupportedTemporalTypeException('Unsupported field: DayOfQuarter');
        }
        const doy = temporal.get(ChronoField.DAY_OF_YEAR);
        const moy = temporal.get(ChronoField.MONTH_OF_YEAR);
        const year = temporal.getLong(ChronoField.YEAR);
        return doy - QUARTER_DAYS[MathUtil.intDiv((moy - 1), 3) + (IsoChronology.isLeapYear(year) ? 4 : 0)];
    }

    /**
     *
     * @param {Temporal} temporal
     * @param {number} newValue
     * @returns {temporal}
     */
    adjustInto(temporal, newValue) {
        const curValue = this.getFrom(temporal);
        this.range().checkValidValue(newValue, this);
        return temporal.with(ChronoField.DAY_OF_YEAR, temporal.getLong(ChronoField.DAY_OF_YEAR) + (newValue - curValue));
    }

    /**
     *
     * @param {Map<TemporalField, number>} fieldValues
     * @param {TemporalAccessor} partialTemporal
     * @param {ResolverStyle} resolverStyle
     * @returns {ValueRange}
     */
    resolve(fieldValues, partialTemporal, resolverStyle) {
        const yearLong = fieldValues.get(ChronoField.YEAR);
        const qoyLong = fieldValues.get(QUARTER_OF_YEAR);
        if (yearLong == null || qoyLong == null) {
            return null;
        }
        const y = ChronoField.YEAR.checkValidIntValue(yearLong);
        const doq = fieldValues.get(DAY_OF_QUARTER);
        let date;
        if (resolverStyle === ResolverStyle.LENIENT) {
            const qoy = qoyLong;
            date = LocalDate.of(y, 1, 1);
            date = date.plusMonths(MathUtil.safeMultiply(MathUtil.safeSubtract(qoy, 1), 3));
            date = date.plusDays(MathUtil.safeSubtract(doq, 1));
        } else {
            const qoy = QUARTER_OF_YEAR.range().checkValidIntValue(qoyLong, QUARTER_OF_YEAR);
            if (resolverStyle === ResolverStyle.STRICT) {
                let max = 92;
                if (qoy === 1) {
                    max = (IsoChronology.isLeapYear(y) ? 91 : 90);
                } else if (qoy === 2) {
                    max = 91;
                }
                ValueRange.of(1, max).checkValidValue(doq, this);
            } else {
                this.range().checkValidValue(doq, this);  // leniently check from 1 to 92
            }
            date = LocalDate.of(y, ((qoy - 1) * 3) + 1, 1).plusDays(doq - 1);
        }
        fieldValues.remove(this);
        fieldValues.remove(ChronoField.YEAR);
        fieldValues.remove(QUARTER_OF_YEAR);
        return date;
    }
}

/**
 * @private
 */
class QUARTER_OF_YEAR_FIELD extends Field {

    /**
     *
     * @returns {string}
     */
    toString() {
        return 'QuarterOfYear';
    }

    /**
     *
     * @returns {TemporalUnit}
     */
    baseUnit() {
        return QUARTER_YEARS;
    }

    /**
     *
     * @returns {TemporalUnit}
     */
    rangeUnit() {
        return ChronoUnit.YEARS;
    }

    /**
     *
     * @returns {ValueRange}
     */
    range() {
        return ValueRange.of(1, 4);
    }

    /**
     *
     * @param {TemporalAccessor} temporal
     * @returns {boolean}
     */
    isSupportedBy(temporal) {
        return temporal.isSupported(ChronoField.MONTH_OF_YEAR) && this._isIso(temporal);
    }


    /**
     *
     * @param {TemporalAccessor} temporal
     * @returns {ValueRange}
     */
    //eslint-disable-next-line no-unused-vars
    rangeRefinedBy(temporal) {
        return this.range();
    }

    /**
     *
     * @param {TemporalAccessor} temporal
     * @returns {number}
     */
    getFrom(temporal) {
        if (temporal.isSupported(this) === false) {
            throw new UnsupportedTemporalTypeException('Unsupported field: QuarterOfYear');
        }
        const moy = temporal.getLong(ChronoField.MONTH_OF_YEAR);
        return MathUtil.intDiv((moy + 2), 3);
    }

    /**
     *
     * @param {Temporal} temporal
     * @param {number} newValue
     * @returns {temporal}
     */
    adjustInto(temporal, newValue) {
        const curValue = this.getFrom(temporal);
        this.range().checkValidValue(newValue, this);
        return temporal.with(ChronoField.MONTH_OF_YEAR, temporal.getLong(ChronoField.MONTH_OF_YEAR) + (newValue - curValue) * 3);
    }

}

/**
 * @private
 */
class WEEK_OF_WEEK_BASED_YEAR_FIELD extends Field {

    /**
     *
     * @returns {string}
     */
    toString() {
        return 'WeekOfWeekBasedYear';
    }

    /**
     *
     * @returns {TemporalUnit}
     */
    baseUnit() {
        return ChronoUnit.WEEKS;
    }

    /**
     *
     * @returns {TemporalUnit}
     */
    rangeUnit() {
        return WEEK_BASED_YEARS;
    }

    /**
     *
     * @returns {ValueRange}
     */
    range() {
        return ValueRange.of(1, 52, 53);
    }

    /**
     *
     * @param {TemporalAccessor} temporal
     * @returns {boolean}
     */
    isSupportedBy(temporal) {
        return temporal.isSupported(ChronoField.EPOCH_DAY) && this._isIso(temporal);
    }


    /**
     *
     * @param {TemporalAccessor} temporal
     * @returns {ValueRange}
     */
    rangeRefinedBy(temporal) {
        if (temporal.isSupported(this) === false) {
            throw new UnsupportedTemporalTypeException('Unsupported field: WeekOfWeekBasedYear');
        }
        return Field._getWeekRangeByLocalDate(LocalDate.from(temporal));
    }

    /**
     *
     * @param {TemporalAccessor} temporal
     * @returns {number}
     */
    getFrom(temporal) {
        if (temporal.isSupported(this) === false) {
            throw new UnsupportedTemporalTypeException('Unsupported field: WeekOfWeekBasedYear');
        }
        return Field._getWeek(LocalDate.from(temporal));
    }

    /**
     *
     * @param {Temporal} temporal
     * @param {number} newValue
     * @returns {temporal}
     */
    adjustInto(temporal, newValue) {
        this.range().checkValidValue(newValue, this);
        return temporal.plus(MathUtil.safeSubtract(newValue, this.getFrom(temporal)), ChronoUnit.WEEKS);
    }

    /**
     *
     * @param {Map<TemporalField, number>} fieldValues
     * @param {TemporalAccessor} partialTemporal
     * @param {ResolverStyle} resolverStyle
     * @returns {ValueRange}
     */
    resolve(fieldValues, partialTemporal, resolverStyle) {
        const wbyLong = fieldValues.get(WEEK_BASED_YEAR);
        const dowLong = fieldValues.get(ChronoField.DAY_OF_WEEK);
        if (wbyLong == null || dowLong == null) {
            return null;
        }
        const wby = WEEK_BASED_YEAR.range().checkValidIntValue(wbyLong, WEEK_BASED_YEAR);
        const wowby = fieldValues.get(WEEK_OF_WEEK_BASED_YEAR);
        let date;
        if (resolverStyle === ResolverStyle.LENIENT) {
            let dow = dowLong;
            let weeks = 0;
            if (dow > 7) {
                weeks = MathUtil.intDiv((dow - 1), 7);
                dow = (MathUtil.intMod((dow - 1), 7) + 1);
            } else if (dow < 1) {
                weeks = MathUtil.intDiv(dow, 7) - 1;
                dow = MathUtil.intMod(dow, 7) + 7;
            }
            date = LocalDate.of(wby, 1, 4).plusWeeks(wowby - 1).plusWeeks(weeks).with(ChronoField.DAY_OF_WEEK, dow);
        } else {
            const dow = ChronoField.DAY_OF_WEEK.checkValidIntValue(dowLong);
            if (resolverStyle === ResolverStyle.STRICT) {
                const temp = LocalDate.of(wby, 1, 4);
                const range = Field._getWeekRangeByLocalDate(temp);
                range.checkValidValue(wowby, this);
            } else {
                this.range().checkValidValue(wowby, this);  // leniently check from 1 to 53
            }
            date = LocalDate.of(wby, 1, 4).plusWeeks(wowby - 1).with(ChronoField.DAY_OF_WEEK, dow);
        }
        fieldValues.remove(this);
        fieldValues.remove(WEEK_BASED_YEAR);
        fieldValues.remove(ChronoField.DAY_OF_WEEK);
        return date;
    }

    /**
     *
     * @returns {string}
     */
    displayName() {
        return 'Week';
    }

}

/**
 * @private
 */
class WEEK_BASED_YEAR_FIELD extends Field {

    /**
     *
     * @returns {string}
     */
    toString() {
        return 'WeekBasedYear';
    }

    /**
     *
     * @returns {TemporalUnit}
     */
    baseUnit() {
        return WEEK_BASED_YEARS;
    }

    /**
     *
     * @returns {TemporalUnit}
     */
    rangeUnit() {
        return ChronoUnit.FOREVER;
    }

    /**
     *
     * @returns {ValueRange}
     */
    range() {
        return ChronoField.YEAR.range();
    }

    /**
     *
     * @param {TemporalAccessor} temporal
     * @returns {boolean}
     */
    isSupportedBy(temporal) {
        return temporal.isSupported(ChronoField.EPOCH_DAY) && this._isIso(temporal);
    }


    /**
     *
     * @param {TemporalAccessor} temporal
     * @returns {ValueRange}
     */
    //eslint-disable-next-line no-unused-vars
    rangeRefinedBy(temporal) {
        return ChronoField.YEAR.range();
    }

    /**
     *
     * @param {TemporalAccessor} temporal
     * @returns {number}
     */
    getFrom(temporal) {
        if (temporal.isSupported(this) === false) {
            throw new UnsupportedTemporalTypeException('Unsupported field: WeekBasedYear');
        }
        return Field._getWeekBasedYear(LocalDate.from(temporal));
    }

    /**
     *
     * @param {Temporal} temporal
     * @param {number} newValue
     * @returns {temporal}
     */
    adjustInto(temporal, newValue) {
        if (this.isSupportedBy(temporal) === false) {
            throw new UnsupportedTemporalTypeException('Unsupported field: WeekBasedYear');
        }
        const newWby = this.range().checkValidIntValue(newValue, WEEK_BASED_YEAR);  // strict check
        const date = LocalDate.from(temporal);
        const dow = date.get(ChronoField.DAY_OF_WEEK);
        let week = Field._getWeek(date);
        if (week === 53 && Field._getWeekRangeByYear(newWby) === 52) {
            week = 52;
        }
        let resolved = LocalDate.of(newWby, 1, 4);  // 4th is guaranteed to be in week one
        const days = (dow - resolved.get(ChronoField.DAY_OF_WEEK)) + ((week - 1) * 7);
        resolved = resolved.plusDays(days);
        return temporal.with(resolved);
    }

}

//-----------------------------------------------------------------------
/**
 * Implementation of the period unit.
 * @private
 */
class Unit extends TemporalUnit {

    /**
     *
     * @param {string} name
     * @param {Duration} estimatedDuration
     * @private
     */
    constructor(name, estimatedDuration) {
        super();
        this._name = name;
        this._duration = estimatedDuration;
    }

    /**
     *
     * @returns {Duration}
     */
    duration() {
        return this._duration;
    }

    /**
     *
     * @returns {boolean}
     */
    isDurationEstimated() {
        return true;
    }

    /**
     *
     * @returns {boolean}
     */
    isDateBased() {
        return true;
    }

    /**
     *
     * @returns {boolean}
     */
    isTimeBased() {
        return false;
    }

    /**
     *
     * @param {Temporal} temporal
     * @returns {boolean}
     */
    isSupportedBy(temporal) {
        return temporal.isSupported(ChronoField.EPOCH_DAY);
    }

    /**
     *
     * @param {Temporal} temporal
     * @param {number} periodToAdd
     * @returns {number}
     */
    addTo(temporal, periodToAdd) {
        switch(this) {
            case WEEK_BASED_YEARS: {
                const added = MathUtil.safeAdd(temporal.get(WEEK_BASED_YEAR), periodToAdd);
                return temporal.with(WEEK_BASED_YEAR, added);
            }
            case QUARTER_YEARS:
                // no overflow (256 is multiple of 4)
                return temporal.plus(MathUtil.intDiv(periodToAdd, 256), ChronoUnit.YEARS).plus(MathUtil.intMod(periodToAdd, 256) * 3, ChronoUnit.MONTHS);
            default:
                throw new IllegalStateException('Unreachable');
        }
    }

    /**
     *
     * @param {Temporal} temporal1
     * @param {Temporal} temporal2
     * @returns {number}
     */
    between(temporal1, temporal2) {
        switch(this) {
            case WEEK_BASED_YEARS:
                return MathUtil.safeSubtract(temporal2.getLong(WEEK_BASED_YEAR), temporal1.getLong(WEEK_BASED_YEAR));
            case QUARTER_YEARS:
                return MathUtil.intDiv(temporal1.until(temporal2, ChronoUnit.MONTHS), 3);
            default:
                throw new IllegalStateException('Unreachable');
        }
    }

    toString() {
        return name;
    }
}

let DAY_OF_QUARTER = null;
let QUARTER_OF_YEAR = null;
let WEEK_OF_WEEK_BASED_YEAR = null;
let WEEK_BASED_YEAR = null;
let WEEK_BASED_YEARS = null;
let QUARTER_YEARS = null;

export function _init() {
    DAY_OF_QUARTER = new DAY_OF_QUARTER_FIELD();
    QUARTER_OF_YEAR = new QUARTER_OF_YEAR_FIELD();
    WEEK_OF_WEEK_BASED_YEAR = new WEEK_OF_WEEK_BASED_YEAR_FIELD();
    WEEK_BASED_YEAR = new WEEK_BASED_YEAR_FIELD();

    WEEK_BASED_YEARS = new Unit('WeekBasedYears', Duration.ofSeconds(31556952));
    QUARTER_YEARS = new Unit('QuarterYears', Duration.ofSeconds(31556952 / 4));

    IsoFields.DAY_OF_QUARTER = DAY_OF_QUARTER;
    IsoFields.QUARTER_OF_YEAR = QUARTER_OF_YEAR;
    IsoFields.WEEK_OF_WEEK_BASED_YEAR = WEEK_OF_WEEK_BASED_YEAR;
    IsoFields.WEEK_BASED_YEAR = WEEK_BASED_YEAR;
    IsoFields.WEEK_BASED_YEARS = WEEK_BASED_YEARS;
    IsoFields.QUARTER_YEARS = QUARTER_YEARS;

    // this differs from threeten, but for ease of use we bring back good old joda time functionality
    /**
     * the week of the week based year as defined by the ISO8601 Standard with a Monday-based week
     *
     * @returns {number} the week a the week based year
     */
    LocalDate.prototype.isoWeekOfWeekyear = function () {
        return this.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR);
    };
    /**
     * the year of the week based year as defined by the ISO8601 Standard with a Monday-based week
     *
     * @returns {number} the year a the week based year
     */
    LocalDate.prototype.isoWeekyear = function () {
        return this.get(IsoFields.WEEK_BASED_YEAR);
    };
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { assert, requireNonNull } from '../assert';
import { UnsupportedTemporalTypeException } from '../errors';

import { Instant } from '../Instant';
import { LocalDate } from '../LocalDate';
import { LocalTime } from '../LocalTime';
import { MathUtil } from '../MathUtil';
import { ZoneId } from '../ZoneId';

import { ChronoField } from './ChronoField';
import { TemporalQueries } from './TemporalQueries';
import { TemporalAccessor } from './TemporalAccessor';

/**
 * A wrapper around a native javascript Date instance that
 * implements TemporalAccessor functionality
 */
class NativeJsTemporal extends TemporalAccessor {

    /**
     * @param {!(Date|moment)} date - a javascript Date or a moment instance
     * @param {ZoneId} [zone=ZoneId.systemDefault()] - the zone of the temporal, defaults to ZoneId.systemDefault()
     * @private
     */
    constructor(date, zone=ZoneId.systemDefault()){
        super();
        this._zone = zone;
        if(date instanceof Date) {
            this._epochMilli = date.getTime();
            return;
        } else if(typeof date.toDate === 'function' &&  date.toDate() instanceof Date) {
            // it's a moment
            this._epochMilli = date.toDate().getTime();
            return;
        }
        assert(false, 'date must be either a javascript date or a moment');
    }

    /**
     * @param {TemporalQuery} query  the query to invoke, not null
     * @return {*} the query result, null may be returned (defined by the query)
     * @throws DateTimeException if unable to query
     */
    query(query) {
        requireNonNull(query, 'query');
        if (query === TemporalQueries.localDate()) {
            return LocalDate.ofInstant(Instant.ofEpochMilli(this._epochMilli), this._zone);
        } else if(query === TemporalQueries.localTime()){
            return LocalTime.ofInstant(Instant.ofEpochMilli(this._epochMilli), this._zone);
        } else if(query === TemporalQueries.zone()){
            return this._zone;
        }
        return super.query(query);
    }

    /**
     *
     * @param {TemporalField} field
     * @returns {number}
     */
    get(field) {
        return this.getLong(field);
    }

    /**
     *
     * @param {!TemporalField} field
     * @returns {number}
     */
    getLong(field) {
        requireNonNull(field, 'field');
        if (field instanceof ChronoField) {
            switch (field) {
                case ChronoField.NANO_OF_SECOND: return MathUtil.floorMod(this._epochMilli, 1000) * 1000000;
                case ChronoField.INSTANT_SECONDS: return MathUtil.floorDiv(this._epochMilli, 1000);
            }
            throw new UnsupportedTemporalTypeException(`Unsupported field: ${field}`);
        }
        return field.getFrom(this);
    }

    /**
     *
     * @param {TemporalField} field
     * @returns {boolean}
     */
    isSupported(field){
        return field === ChronoField.INSTANT_SECONDS || field === ChronoField.NANO_OF_SECOND;
    }
}

/**
 *
 * @param {!(Date|moment)} date - a javascript Date or a moment instance
 * @param {ZoneId} [zone=ZoneId.systemDefault()] - the zone of the temporal, defaults to ZoneId.systemDefault()
 * @returns {NativeJsTemporal}
 */
export function nativeJs(date, zone){
    return new NativeJsTemporal(date, zone);
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { assert, abstractMethodFail, requireInstance, requireNonNull } from '../assert';
import { IllegalArgumentException } from '../errors';
import { TemporalAccessor } from './TemporalAccessor';
import { TemporalAmount } from './TemporalAmount';
import { TemporalUnit } from './TemporalUnit';

/**
 * Framework-level interface defining read-write access to a temporal object,
 * such as a date, time, offset or some combination of these.
 *
 * This is the base interface type for date, time and offset objects that
 * are complete enough to be manipulated using plus and minus.
 * It is implemented by those classes that can provide and manipulate information
 * as fields (see {@link TemporalField}) or queries (see {@link TemporalQuery}).
 * See {@link TemporalAccessor} for the read-only version of this interface.
 *
 * Most date and time information can be represented as a number.
 * These are modeled using {@link TemporalField} with the number held using
 * a `long` to handle large values. Year, month and day-of-month are
 * simple examples of fields, but they also include instant and offsets.
 * See {@link ChronoField} for the standard set of fields.
 *
 * Two pieces of date/time information cannot be represented by numbers,
 * the {@link Chronology} and the {@link ZoneId}.
 * These can be accessed using the static methods defined on {@link TemporalQueries}.
 *
 * This interface is a framework-level interface that should not be widely
 * used in application code. Instead, applications should create and pass
 * around instances of concrete types, such as {@link LocalDate}.
 * There are many reasons for this, part of which is that implementations
 * of this interface may be in calendar systems other than ISO.
 * See {@link ChronoLocalDate} for a fuller discussion of the issues.
 *
 * ### When to implement
 *
 * A class should implement this interface if it meets three criteria:
 *
 * * it provides access to date/time/offset information, as per {@link TemporalAccessor}
 * * the set of fields are contiguous from the largest to the smallest
 * * the set of fields are complete, such that no other field is needed to define the
 *   valid range of values for the fields that are represented
 *
 * Four examples make this clear:
 *
 * * {@link LocalDate} implements this interface as it represents a set of fields
 *   that are contiguous from days to forever and require no external information to determine
 *   the validity of each date. It is therefore able to implement plus/minus correctly.
 * * {@link LocalTime} implements this interface as it represents a set of fields
 *   that are contiguous from nanos to within days and require no external information to determine
 *   validity. It is able to implement plus/minus correctly, by wrapping around the day.
 * * {@link MonthDay}, the combination of month-of-year and day-of-month, does not implement
 *   this interface.  While the combination is contiguous, from days to months within years,
 *   the combination does not have sufficient information to define the valid range of values
 *   for day-of-month.  As such, it is unable to implement plus/minus correctly.
 * * The combination day-of-week and day-of-month ("Friday the 13th") should not implement
 *   this interface. It does not represent a contiguous set of fields, as days to weeks overlaps
 *   days to months.
 *
 * @interface
 */
export class Temporal extends TemporalAccessor {
    /**
     * Checks if the specified unit is supported.
     * This checks if the date-time can be queried for the specified unit. If false, then calling the plus and minus methods will throw an exception.

     * ### Specification for implementors
     * Implementations must check and handle all fields defined in {@link ChronoUnit}. If the field is supported, then true is returned, otherwise false
     * If the field is not a {@link ChronoUnit}, then the result of this method is obtained by invoking `TemporalUnit.isSupportedBy(Temporal)` passing this as the argument.

     * Implementations must not alter this object.

     * @param {TemporalUnit} fieldOrUnit - the unit to check, null returns false
     * @return {boolean} true if this date-time can be queried for the unit, false if not
     */
    // eslint-disable-next-line no-unused-vars
    isSupported(fieldOrUnit) {
        abstractMethodFail('isSupported');
    }

    /**
     * function overloading for {@link Temporal.plus}
     *
     * Called with 1 (or less) arguments, p1 is expected to be a {@link TemporalAmount} and {@link Temporal.minusAmount} is called.
     *
     * Otherwise {@link Temporal.minusAmountUnit} is called.
     *
     * @param {!(TemporalAmount|number)} amount
     * @param {TemporalUnit} unit
     * @return {Temporal}
     */
    minus(amount, unit) {
        if (arguments.length < 2) {
            return this._minusAmount(amount);
        } else {
            return this._minusUnit(amount, unit);
        }
    }

    /**
     * Returns an object of the same type as this object with an amount subtracted.
     * This adjusts this temporal, subtracting according to the rules of the specified amount. The
     * amount is typically a {@link Period} but may be any other type implementing the {@link TemporalAmount} interface, such as Duration.
     *
     * Some example code indicating how and why this method is used:
     *
     * <pre>
     *   date = date.minus(period);                  // subtract a Period instance
     *   date = date.minus(duration);                // subtract a Duration instance
     *   date = date.minus(workingDays(6));          // example user-written workingDays method
     * </pre>
     *
     * Note that calling plus followed by minus is not guaranteed to return the same date-time.
     *
     * ### Specification for implementors
     * Implementations must not alter either this object. Instead, an adjusted copy of the original
     * must be returned. This provides equivalent, safe behavior for immutable and mutable
     * implementations.
     *
     * @param {TemporalAmount} amount - the amount to subtract, not null
     * @return {Temporal} an object of the same type with the specified adjustment made, not null
     * @throws DateTimeException - if the subtraction cannot be made
     * @throws ArithmeticException - if numeric overflow occurs
     */
    _minusAmount(amount) {
        requireNonNull(amount, 'amount');
        requireInstance(amount, TemporalAmount, 'amount');
        return amount.subtractFrom(this);
    }

    /**
     * Returns an object of the same type as this object with the specified period subtracted.
     * This method returns a new object based on this one with the specified period subtracted. For example, on a {@link LocalDate}, this could be used to subtract a number of years, months or days. The returned object will have the same observable type as this object.
     *
     * In some cases, changing a field is not fully defined. For example, if the target object is a date representing the 31st March, then subtracting one month would be unclear. In cases like this, the field is responsible for resolving the result. Typically it will choose the previous valid date, which would be the last valid day of February in this example.
     *
     * If the implementation represents a date-time that has boundaries, such {@link as} LocalTime, then the permitted units must include the boundary unit, but no multiples of the boundary unit. For example, {@link LocalTime} must accept `DAYS` but not `WEEKS` or `MONTHS`.
     *
     * ### Specification for implementors
     * Implementations must behave in a manor equivalent to the default method behavior.
     * Implementations must not alter either this object or the specified temporal object. Instead, an adjusted copy of the original must be returned. This provides equivalent, safe behavior for immutable and mutable implementations.
     *
     * @param {number} amountToSubtract - the amount of the specified unit to subtract, may be negative
     * @param {TemporalUnit} unit - the unit of the period to subtract, not null
     * @return {Temporal} an object of the same type with the specified period subtracted, not null
     * @throws DateTimeException - if the unit cannot be subtracted
     * @throws ArithmeticException - if numeric overflow occurs
     */
    _minusUnit(amountToSubtract, unit) {
        requireNonNull(amountToSubtract, 'amountToSubtract');
        requireNonNull(unit, 'unit');
        requireInstance(unit, TemporalUnit, 'unit');
        return this._plusUnit(-amountToSubtract, unit);
    }

    /**
     * function overloading for {@link Temporal.plus}
     *
     * Called with 1 (or less) arguments, p1 is expected to be a {@link TemporalAmount} and {@link Temporal.plusAmount} is called.
     *
     * Otherwise {@link Temporal.plusAmountUnit} is called.
     *
     * @param {!(TemporalAmount|number)} amount
     * @param {TemporalUnit} unit
     * @return {Temporal}
     */
    plus(amount, unit) {
        if (arguments.length < 2) {
            return this._plusAmount(amount);
        } else {
            return this._plusUnit(amount, unit);
        }
    }

    /**
     * Returns an object of the same type as this object with an amount added.
     * This adjusts this temporal, adding according to the rules of the specified amount. The amount is typically a {@link Period} but may be any other type implementing the {@link TemporalAmount} interface, such as {@link Duration}.
     *
     * Some example code indicating how and why this method is used:
     *
     * <pre>
     *   date = date.plus(period);                  // add a Period instance
     *   date = date.plus(duration);                // add a Duration instance
     *   date = date.plus(workingDays(6));          // example user-written workingDays method
     * </pre>
     *
     * Note that calling plus followed by minus is not guaranteed to return the same date-time.
     *
     * ### Specification for implementors
     * Implementations must not alter either this object. Instead, an adjusted copy of the original must be returned. This provides equivalent, safe behavior for immutable and mutable implementations.
     *
     * @param {TemporalAmount} amount - the amount to add, not null
     * @return {Temporal} an object of the same type with the specified adjustment made, not null
     * @throws DateTimeException - if the addition cannot be made
     * @throws ArithmeticException - if numeric overflow occurs
     */
    _plusAmount(amount) {
        requireNonNull(amount, 'amount');
        requireInstance(amount, TemporalAmount, 'amount');
        return amount.addTo(this);
    }

    /**
     * Returns an object of the same type as this object with the specified period added.
     * This method returns a new object based on this one with the specified period added. For example, on a {@link LocalDate}, this could be used to add a number of years, months or days. The returned object will have the same observable type as this object.
     *
     * In some cases, changing a field is not fully defined. For example, if the target object is a date representing the 31st January, then adding one month would be unclear. In cases like this, the field is responsible for resolving the result. Typically it will choose the previous valid date, which would be the last valid day of February in this example.
     *
     * If the implementation represents a date-time that has boundaries, such as {@link LocalTime}, then the permitted units must include the boundary unit, but no multiples of the boundary unit. For example, {@link LocalTime} must accept `DAYS` but not `WEEKS` or `MONTHS`.
     *
     * ### Specification for implementors
     * Implementations must check and handle all units defined in {@link ChronoUnit}. If the unit is supported, then the addition must be performed. If unsupported, then a {@link DateTimeException} must be thrown.
     * If the unit is not a {@link ChronoUnit}, then the result of this method is obtained by invoking `TemporalUnit.addTo(Temporal, long)` passing this as the first argument.
     *
     * Implementations must not alter either this object or the specified temporal object. Instead, an adjusted copy of the original must be returned. This provides equivalent, safe behavior for immutable and mutable implementations.
     *
     * @param {number} amountToAdd - the amount of the specified unit to add, may be negative
     * @param {TemporalUnit} unit - the unit of the period to add, not null
     * @return {Temporal} an object of the same type with the specified period added, not null
     * @throws DateTimeException - if the unit cannot be added
     * @throws ArithmeticException - if numeric overflow occurs
     */
    // eslint-disable-next-line no-unused-vars
    _plusUnit(amountToAdd, unit) {
        abstractMethodFail('_plusUnit');
    }

    /**
     * Calculates the period between this temporal and another temporal in terms of the specified unit.
     * This calculates the period between two temporals in terms of a single unit. The start and end points are this and the specified temporal. The result will be negative if the end is before the start. For example, the period in hours between two temporal objects can be calculated using `startTime.until(endTime, HOURS)`.
     *
     * The calculation returns a whole number, representing the number of complete units between the two temporals. For example, the period in hours between the times 11:30 and 13:29 will only be one hour as it is one minute short of two hours.
     *
     * There are two equivalent ways of using this method. The first is to invoke this method directly. The second is to use `TemporalUnit.between(Temporal, Temporal)`:
     *
     * <pre>
     *    // these two lines are equivalent
     *    between = thisUnit.between(start, end);
     *    between = start.until(end, thisUnit);
     * </pre>
     *
     * The choice should be made based on which makes the code more readable.
     * For example, this method allows the number of days between two dates to be calculated:
     *
     * <pre>
     *    long daysBetween = DAYS.between(start, end);
     *    // or alternatively
     *    long daysBetween = start.until(end, DAYS);
     * </pre>
     *
     * ### Specification for implementors
     * Implementations must begin by checking to ensure that the input temporal object is of the same observable type as the implementation. They must then perform the calculation for all instances of {@link ChronoUnit}. A {@link DateTimeException} must be thrown for {@link ChronoUnit} instances that are unsupported.
     * If the unit is not a {@link ChronoUnit}, then the result of this method is obtained by invoking `TemporalUnit.between(Temporal, Temporal)` passing this as the first argument and the input temporal as the second argument.
     *
     * In summary, implementations must behave in a manner equivalent to this code:
     *
     * <pre>
     *   // check input temporal is the same type as this class
     *   if (unit instanceof ChronoUnit) {
     *     // if unit is supported, then calculate and return result
     *     // else throw DateTimeException for unsupported units
     *   }
     *   return unit.between(this, endTemporal);
     * </pre>
     *
     * The target object must not be altered by this method.
     *
     * @param {Temporal} endTemporal - the end temporal, of the same type as this object, not null
     * @param {TemporalUnit} unit - the unit to measure the period in, not null
     * @return {number} the amount of the period between this and the end
     * @throws DateTimeException - if the period cannot be calculated
     * @throws ArithmeticException - if numeric overflow occurs
     */
    // eslint-disable-next-line no-unused-vars
    until(endTemporal, unit) {
        abstractMethodFail('until');
    }

    /**
     * function overloading for {@link Temporal.with}
     *
     * Called with 1 (or less) arguments, p1 is expected to be a {@link TemporalAdjuster} and {@link Temporal.withAdjuster} is called.
     *
     * Otherwise {@link Temporal.withFieldValue} is called.
     *
     * @param {!(TemporalAdjuster|TemporalField)} adjusterOrField
     * @param {number} newValue
     * @return {Temporal}
     */
    with(adjusterOrField, newValue) {
        if (arguments.length < 2) {
            return this._withAdjuster(adjusterOrField);
        } else {
            return this._withField(adjusterOrField, newValue);
        }
    }

    /**
     * Returns an adjusted object of the same type as this object with the adjustment made.
     * This adjusts this date-time according to the rules of the specified adjuster. A simple adjuster might simply set the one of the fields, such as the year field. A more complex adjuster might set the date to the last day of the month. A selection of common adjustments is provided in {@link TemporalAdjusters}. These include finding the "last day of the month" and "next Wednesday". The adjuster is responsible for handling special cases, such as the varying lengths of month and leap years.
     *
     * Some example code indicating how and why this method is used:
     *
     * <pre>
     *   date = date.with(Month.JULY);        // most key classes implement TemporalAdjuster
     *   date = date.with(lastDayOfMonth());  // static import from TemporalAdjusters
     *   date = date.with(next(WEDNESDAY));   // static import from TemporalAdjusters and DayOfWeek
     * </pre>
     *
     * ### Specification for implementors
     * Implementations must not alter either this object. Instead, an adjusted copy of the original must be returned. This provides equivalent, safe behavior for immutable and mutable implementations.
     *
     * @param {TemporalAdjuster} adjuster - the adjuster to use, not null
     * @return {Temporal} an object of the same type with the specified adjustment made, not null
     * @throws DateTimeException - if unable to make the adjustment
     * @throws ArithmeticException - if numeric overflow occurs
     */
    _withAdjuster(adjuster) {
        requireNonNull(adjuster, 'adjuster');
        assert(typeof adjuster.adjustInto === 'function',
            'adjuster must be a TemporalAdjuster',
            IllegalArgumentException);
        return adjuster.adjustInto(this);
    }

    /**
     * Returns an object of the same type as this object with the specified field altered.
     * This returns a new object based on this one with the value for the specified field changed. For example, on a {@link LocalDate}, this could be used to set the year, month or day-of-month. The returned object will have the same observable type as this object.
     *
     * In some cases, changing a field is not fully defined. For example, if the target object is a date representing the 31st January, then changing the month to February would be unclear. In cases like this, the field is responsible for resolving the result. Typically it will choose the previous valid date, which would be the last valid day of February in this example.
     *
     * ### Specification for implementors
     * Implementations must check and handle all fields defined in {@link ChronoField}. If the field is supported, then the adjustment must be performed. If unsupported, then a {@link DateTimeException} must be thrown.
     * If the field is not a {@link ChronoField}, then the result of this method is obtained by invoking `TemporalField.adjustInto(Temporal, long)` passing this as the first argument.
     *
     * Implementations must not alter either this object or the specified temporal object. Instead, an adjusted copy of the original must be returned. This provides equivalent, safe behavior for immutable and mutable implementations.
     *
     * @param {TemporalField} field - the field to set in the result, not null
     * @param {number} newValue - the new value of the field in the result
     * @return {Temporal} an object of the same type with the specified field set, not null
     * @throws DateTimeException - if the field cannot be set
     * @throws ArithmeticException - if numeric overflow occurs
     */
    // eslint-disable-next-line no-unused-vars
    _withField(field, newValue) {
        abstractMethodFail('_withField');
    }
}

if (typeof Symbol !== 'undefined' && Symbol.toPrimitive) {
    Temporal.prototype[Symbol.toPrimitive] = function (hint) {
        // hint could be 'number', 'string' or 'default'. Only 'number'
        // should throw and 'default' is treated as 'string'.
        if (hint !== 'number') {
            return this.toString();
        }

        throw new TypeError(
            'A conversion from Temporal to a number is not allowed. ' +
            'To compare use the methods .equals(), .compareTo(), .isBefore() ' +
            'or one that is more suitable to your use case.'
        );
    };
}
/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { UnsupportedTemporalTypeException } from '../errors';
import { abstractMethodFail } from '../assert';

import { ChronoField } from './ChronoField';
import { TemporalQueries } from './TemporalQueries';

export class TemporalAccessor {
    /**
     * Queries this date-time.
     *
     * This queries this date-time using the specified query strategy object.
     *
     * Queries are a key tool for extracting information from date-times.
     * They exists to externalize the process of querying, permitting different
     * approaches, as per the strategy design pattern.
     * Examples might be a query that checks if the date is the day before February 29th
     * in a leap year, or calculates the number of days to your next birthday.
     *
     * The most common query implementations are method references, such as
     * {@link LocalDate::from} and {@link ZoneId::from}.
     * Further implementations are on {@link TemporalQueries}.
     * Queries may also be defined by applications.
     *
     * @implSpec
     * Implementations of this method must behave as follows:
     * <pre>
        if (query == TemporalQueries.zoneId()
            || query == TemporalQueries.chronology()
            || query == TemporalQueries.precision()) {
                return null;
        }
        return query.queryFrom(this);
     * </pre>
     *
     * @param {TemporalQuery} query  the query to invoke, not null
     * @return the query result, null may be returned (defined by the query)
     * @throws DateTimeException if unable to query
     * @throws ArithmeticException if numeric overflow occurs
     */
    query(query) {
        if (query === TemporalQueries.zoneId()
                || query === TemporalQueries.chronology()
                || query === TemporalQueries.precision()) {
            return null;
        }
        return query.queryFrom(this);
    }

    /**
     * Gets the value of the specified field as an `int`.
     *
     * This queries the date-time for the value for the specified field.
     * The returned value will always be within the valid range of values for the field.
     * If the date-time cannot return the value, because the field is unsupported or for
     * some other reason, an exception will be thrown.
     *
     * ### Specification for implementors
     *
     * Implementations must check and handle all fields defined in {@link ChronoField}.
     * If the field is supported and has an `int` range, then the value of
     * the field must be returned.
     * If unsupported, then a {@link DateTimeException} must be thrown.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.getFrom}
     * passing `this` as the argument.
     *
     * Implementations must not alter either this object.
     *
     * @param {TemporalField} field - the field to get, not null
     * @return {number} the value for the field, within the valid range of values
     * @throws DateTimeException if a value for the field cannot be obtained
     * @throws DateTimeException if the range of valid values for the field exceeds an `int`
     * @throws DateTimeException if the value is outside the range of valid values for the field
     * @throws ArithmeticException if numeric overflow occurs
     */
    get(field) {
        return this.range(field).checkValidIntValue(this.getLong(field), field);
    }

    // eslint-disable-next-line no-unused-vars
    getLong(field) {
        abstractMethodFail('getLong');
    }

    /**
     * Gets the range of valid values for the specified field.
     *
     * All fields can be expressed as a `long` integer.
     * This method returns an object that describes the valid range for that value.
     * The value of this temporal object is used to enhance the accuracy of the returned range.
     * If the date-time cannot return the range, because the field is unsupported or for
     * some other reason, an exception will be thrown.
     *
     * Note that the result only describes the minimum and maximum valid values
     * and it is important not to read too much into them. For example, there
     * could be values within the range that are invalid for the field.
     *
     * ### Specification for implementors
     *
     * Implementations must check and handle all fields defined in {@link ChronoField}.
     * If the field is supported, then the range of the field must be returned.
     * If unsupported, then a {@link DateTimeException} must be thrown.
     *
     * If the field is not a {@link ChronoField}, then the result of this method
     * is obtained by invoking {@link TemporalField.rangeRefinedBy}
     * passing `this` as the argument.
     *
     * Implementations must not alter either this object.
     *
     * @param {TemporalField} field  the field to query the range for, not null
     * @return {ValueRange} the range of valid values for the field, not null
     * @throws DateTimeException if the range for the field cannot be obtained
     */
    range(field) {
        if (field instanceof ChronoField) {
            if (this.isSupported(field)) {
                return field.range();
            }
            throw new UnsupportedTemporalTypeException(`Unsupported field: ${field}`);
        }
        return field.rangeRefinedBy(this);
    }

    // eslint-disable-next-line no-unused-vars
    isSupported(field) {
        abstractMethodFail('isSupported');
    }
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { abstractMethodFail } from '../assert';

/**
 * Strategy for adjusting a temporal object.
 *
 * Adjusters are a key tool for modifying temporal objects.
 * They exist to externalize the process of adjustment, permitting different
 * approaches, as per the strategy design pattern.
 * Examples might be an adjuster that sets the date avoiding weekends, or one that
 * sets the date to the last day of the month.
 *
 * There are two equivalent ways of using a {@link TemporalAdjuster}.
 * The first is to invoke the method on this interface directly.
 * The second is to use {@link Temporal#with}:
 * <pre>
 *   // these two lines are equivalent, but the second approach is recommended
 *   temporal = thisAdjuster.adjustInto(temporal);
 *   temporal = temporal.with(thisAdjuster);
 * </pre>
 * It is recommended to use the second approach, {@link with},
 * as it is a lot clearer to read in code.
 *
 * See {@link TemporalAdjusters} for a standard set of adjusters, including finding the
 * last day of the month.
 * Adjusters may also be defined by applications.
 *
 * ### Specification for implementors
 *
 * This interface places no restrictions on the mutability of implementations,
 * however immutability is strongly recommended.
 *
 * @interface
 */
export class TemporalAdjuster {

    /**
     * Adjusts the specified temporal object.
     *
     * This adjusts the specified temporal object using the logic
     * encapsulated in the implementing class.
     * Examples might be an adjuster that sets the date avoiding weekends, or one that
     * sets the date to the last day of the month.
     *
     * There are two equivalent ways of using this method.
     * The first is to invoke this method directly.
     * The second is to use {@link Temporal#with}:
     * <pre>
     *   // these two lines are equivalent, but the second approach is recommended
     *   temporal = thisAdjuster.adjustInto(temporal);
     *   temporal = temporal.with(thisAdjuster);
     * </pre>
     * It is recommended to use the second approach, {@link with},
     * as it is a lot clearer to read in code.
     *
     * ### Specification for implementors
     *
     * The implementation must take the input object and adjust it.
     * The implementation defines the logic of the adjustment and is responsible for
     * documenting that logic. It may use any method on {@link Temporal} to
     * query the temporal object and perform the adjustment.
     * The returned object must have the same observable type as the input object
     *
     * The input object must not be altered.
     * Instead, an adjusted copy of the original must be returned.
     * This provides equivalent, safe behavior for immutable and mutable temporal objects.
     *
     * The input temporal object may be in a calendar system other than ISO.
     * Implementations may choose to document compatibility with other calendar systems,
     * or reject non-ISO temporal objects by querying the chronology (see {@link TemporalQueries#chronology}).
     *
     * This method may be called from multiple threads in parallel.
     * It must be thread-safe when invoked.
     *
     * @param {Temporal} temporal  the temporal object to adjust, not null
     * @return {Temporal} an object of the same observable type with the adjustment made, not null
     * @throws DateTimeException if unable to make the adjustment
     * @throws ArithmeticException if numeric overflow occurs
     *
     * @abstract
     */
    // eslint-disable-next-line no-unused-vars
    adjustInto(temporal){
        abstractMethodFail('adjustInto');
    }

}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { requireNonNull } from '../assert';
import { IllegalStateException } from '../errors';

import { TemporalAdjuster } from './TemporalAdjuster';
import { ChronoField } from '../temporal/ChronoField';
import { ChronoUnit } from '../temporal/ChronoUnit';
import { MathUtil } from '../MathUtil';

/**
 * Common implementations of {@link TemporalAdjuster}.
 *
 * This class provides common implementations of {@link TemporalAdjuster}.
 * They are especially useful to document the intent of business logic and
 * often link well to requirements.
 * For example, these two pieces of code do the same thing, but the second
 * one is clearer (assuming that there is a static import of this class):
 * <pre>
 *  // direct manipulation
 *  date.withDayOfMonth(1).plusMonths(1).minusDays(1);
 *  // use of an adjuster from this class
 *  date.with(lastDayOfMonth());
 * </pre>
 * There are two equivalent ways of using a {@link TemporalAdjuster}.
 * The first is to invoke the method on the interface directly.
 * The second is to use {@link Temporal#with}:
 * <pre>
 *   // these two lines are equivalent, but the second approach is recommended
 *   dateTime = adjuster.adjustInto(dateTime);
 *   dateTime = dateTime.with(adjuster);
 * </pre>
 * It is recommended to use the second approach, {@link with},
 * as it is a lot clearer to read in code.
 *
 * ### Specification for implementors
 *
 * This is a thread-safe utility class.
 * All returned adjusters are immutable and thread-safe.
 *
 * The JDK 8 ofDateAdjuster(UnaryOperator) method is not backported.
 */
export class TemporalAdjusters {

    //-----------------------------------------------------------------------
    /**
     * Returns the 'first day of month' adjuster, which returns a new date set to
     * the first day of the current month.
     *
     * The ISO calendar system behaves as follows:
     *
     * * The input 2011-01-15 will return 2011-01-01.
     * * The input 2011-02-15 will return 2011-02-01.
     *
     * The behavior is suitable for use with most calendar systems.
     * It is equivalent to:
     * <pre>
     *  temporal.with(DAY_OF_MONTH, 1);
     * </pre>
     *
     * @return {TemporalAdjuster} the first day-of-month adjuster, not null
     */
    static firstDayOfMonth() {
        return Impl.FIRST_DAY_OF_MONTH;
    }

    /**
     * Returns the 'last day of month' adjuster, which returns a new date set to
     * the last day of the current month.
     *
     * The ISO calendar system behaves as follows:
     *
     * * The input 2011-01-15 will return 2011-01-31.
     * * The input 2011-02-15 will return 2011-02-28.
     * * The input 2012-02-15 will return 2012-02-29 (leap year).
     * * The input 2011-04-15 will return 2011-04-30.
     *
     * The behavior is suitable for use with most calendar systems.
     * It is equivalent to:
     * <pre>
     *  long lastDay = temporal.range(DAY_OF_MONTH).getMaximum();
     *  temporal.with(DAY_OF_MONTH, lastDay);
     * </pre>
     *
     * @return {TemporalAdjuster} the last day-of-month adjuster, not null
     */
    static lastDayOfMonth() {
        return Impl.LAST_DAY_OF_MONTH;
    }

    /**
     * Returns the 'first day of next month' adjuster, which returns a new date set to
     * the first day of the next month.
     *
     * The ISO calendar system behaves as follows:
     *
     * * The input 2011-01-15 will return 2011-02-01.
     * * The input 2011-02-15 will return 2011-03-01.
     *
     * The behavior is suitable for use with most calendar systems.
     * It is equivalent to:
     * <pre>
     *  temporal.with(DAY_OF_MONTH, 1).plus(1, MONTHS);
     * </pre>
     *
     * @return {TemporalAdjuster} the first day of next month adjuster, not null
     */
    static firstDayOfNextMonth() {
        return Impl.FIRST_DAY_OF_NEXT_MONTH;
    }

    //-----------------------------------------------------------------------
    /**
     * Returns the 'first day of year' adjuster, which returns a new date set to
     * the first day of the current year.
     *
     * The ISO calendar system behaves as follows:
     *
     * * The input 2011-01-15 will return 2011-01-01.
     * * The input 2011-02-15 will return 2011-01-01.
     *
     * The behavior is suitable for use with most calendar systems.
     * It is equivalent to:
     * <pre>
     *  temporal.with(DAY_OF_YEAR, 1);
     * </pre>
     *
     * @return {TemporalAdjuster} the first day-of-year adjuster, not null
     */
    static firstDayOfYear() {
        return Impl.FIRST_DAY_OF_YEAR;
    }

    /**
     * Returns the 'last day of year' adjuster, which returns a new date set to
     * the last day of the current year.
     *
     * The ISO calendar system behaves as follows:
     *
     * * The input 2011-01-15 will return 2011-12-31.
     * * The input 2011-02-15 will return 2011-12-31.
     *
     * The behavior is suitable for use with most calendar systems.
     * It is equivalent to:
     * <pre>
     *  long lastDay = temporal.range(DAY_OF_YEAR).getMaximum();
     *  temporal.with(DAY_OF_YEAR, lastDay);
     * </pre>
     *
     * @return {TemporalAdjuster} the last day-of-year adjuster, not null
     */
    static lastDayOfYear() {
        return Impl.LAST_DAY_OF_YEAR;
    }

    /**
     * Returns the 'first day of next year' adjuster, which returns a new date set to
     * the first day of the next year.
     *
     * The ISO calendar system behaves as follows:
     *
     * * The input 2011-01-15 will return 2012-01-01.
     *
     * The behavior is suitable for use with most calendar systems.
     * It is equivalent to:
     * <pre>
     *  temporal.with(DAY_OF_YEAR, 1).plus(1, YEARS);
     * </pre>
     *
     * @return {TemporalAdjuster} the first day of next month adjuster, not null
     */
    static firstDayOfNextYear() {
        return Impl.FIRST_DAY_OF_NEXT_YEAR;
    }

    //-----------------------------------------------------------------------
    /**
     * Returns the first in month adjuster, which returns a new date
     * in the same month with the first matching day-of-week.
     * This is used for expressions like 'first Tuesday in March'.
     *
     * The ISO calendar system behaves as follows:
     *
     * * The input 2011-12-15 for (MONDAY) will return 2011-12-05.
     * * The input 2011-12-15 for (FRIDAY) will return 2011-12-02.
     *
     * The behavior is suitable for use with most calendar systems.
     * It uses the {@link DAY_OF_WEEK} and {@link DAY_OF_MONTH} fields
     * and the {@link DAYS} unit, and assumes a seven day week.
     *
     * @param {DayOfWeek} dayOfWeek  the day-of-week, not null
     * @return {TemporalAdjuster} the first in month adjuster, not null
     */
    static firstInMonth(dayOfWeek) {
        requireNonNull(dayOfWeek, 'dayOfWeek');
        return new DayOfWeekInMonth(1, dayOfWeek);
    }

    /**
     * Returns the last in month adjuster, which returns a new date
     * in the same month with the last matching day-of-week.
     * This is used for expressions like 'last Tuesday in March'.
     *
     * The ISO calendar system behaves as follows:
     *
     * * The input 2011-12-15 for (MONDAY) will return 2011-12-26.
     * * The input 2011-12-15 for (FRIDAY) will return 2011-12-30.
     *
     * The behavior is suitable for use with most calendar systems.
     * It uses the {@link DAY_OF_WEEK} and {@link DAY_OF_MONTH} fields
     * and the {@link DAYS} unit, and assumes a seven day week.
     *
     * @param {DayOfWeek} dayOfWeek  the day-of-week, not null
     * @return {TemporalAdjuster} the first in month adjuster, not null
     */
    static lastInMonth(dayOfWeek) {
        requireNonNull(dayOfWeek, 'dayOfWeek');
        return new DayOfWeekInMonth(-1, dayOfWeek);
    }

    /**
     * Returns the day-of-week in month adjuster, which returns a new date
     * in the same month with the ordinal day-of-week.
     * This is used for expressions like the 'second Tuesday in March'.
     *
     * The ISO calendar system behaves as follows:
     *
     * * The input 2011-12-15 for (1,TUESDAY) will return 2011-12-06.
     * * The input 2011-12-15 for (2,TUESDAY) will return 2011-12-13.
     * * The input 2011-12-15 for (3,TUESDAY) will return 2011-12-20.
     * * The input 2011-12-15 for (4,TUESDAY) will return 2011-12-27.
     * * The input 2011-12-15 for (5,TUESDAY) will return 2012-01-03.
     * * The input 2011-12-15 for (-1,TUESDAY) will return 2011-12-27 (last in month).
     * * The input 2011-12-15 for (-4,TUESDAY) will return 2011-12-06 (3 weeks before last in month).
     * * The input 2011-12-15 for (-5,TUESDAY) will return 2011-11-29 (4 weeks before last in month).
     * * The input 2011-12-15 for (0,TUESDAY) will return 2011-11-29 (last in previous month).
     *
     * For a positive or zero ordinal, the algorithm is equivalent to finding the first
     * day-of-week that matches within the month and then adding a number of weeks to it.
     * For a negative ordinal, the algorithm is equivalent to finding the last
     * day-of-week that matches within the month and then subtracting a number of weeks to it.
     * The ordinal number of weeks is not validated and is interpreted leniently
     * according to this algorithm. This definition means that an ordinal of zero finds
     * the last matching day-of-week in the previous month.
     *
     * The behavior is suitable for use with most calendar systems.
     * It uses the {@link DAY_OF_WEEK} and {@link DAY_OF_MONTH} fields
     * and the {@link DAYS} unit, and assumes a seven day week.
     *
     * @param {Number} ordinal  the week within the month, unbounded but typically from -5 to 5
     * @param {DayOfWeek} dayOfWeek  the day-of-week, not null
     * @return {TemporalAdjuster} the day-of-week in month adjuster, not null
     */
    static dayOfWeekInMonth(ordinal, dayOfWeek) {
        requireNonNull(dayOfWeek, 'dayOfWeek');
        return new DayOfWeekInMonth(ordinal, dayOfWeek);
    }

    //-----------------------------------------------------------------------
    /**
     * Returns the next day-of-week adjuster, which adjusts the date to the
     * first occurrence of the specified day-of-week after the date being adjusted.
     *
     * The ISO calendar system behaves as follows:
     *
     * * The input 2011-01-15 (a Saturday) for parameter (MONDAY) will return 2011-01-17 (two days later).
     * * The input 2011-01-15 (a Saturday) for parameter (WEDNESDAY) will return 2011-01-19 (four days later).
     * * The input 2011-01-15 (a Saturday) for parameter (SATURDAY) will return 2011-01-22 (seven days later).
     *
     * The behavior is suitable for use with most calendar systems.
     * It uses the {@link DAY_OF_WEEK} field and the {@link DAYS} unit,
     * and assumes a seven day week.
     *
     * @param {DayOfWeek} dayOfWeek  the day-of-week to move the date to, not null
     * @return {TemporalAdjuster} the next day-of-week adjuster, not null
     */
    static next(dayOfWeek) {
        return new RelativeDayOfWeek(2, dayOfWeek);
    }

    /**
     * Returns the next-or-same day-of-week adjuster, which adjusts the date to the
     * first occurrence of the specified day-of-week after the date being adjusted
     * unless it is already on that day in which case the same object is returned.
     *
     * The ISO calendar system behaves as follows:
     *
     * * The input 2011-01-15 (a Saturday) for parameter (MONDAY) will return 2011-01-17 (two days later).
     * * The input 2011-01-15 (a Saturday) for parameter (WEDNESDAY) will return 2011-01-19 (four days later).
     * * The input 2011-01-15 (a Saturday) for parameter (SATURDAY) will return 2011-01-15 (same as input).
     *
     * The behavior is suitable for use with most calendar systems.
     * It uses the {@link DAY_OF_WEEK} field and the {@link DAYS} unit,
     * and assumes a seven day week.
     *
     * @param {DayOfWeek} dayOfWeek  the day-of-week to check for or move the date to, not null
     * @return {TemporalAdjuster} the next-or-same day-of-week adjuster, not null
     */
    static nextOrSame(dayOfWeek) {
        return new RelativeDayOfWeek(0, dayOfWeek);
    }

    /**
     * Returns the previous day-of-week adjuster, which adjusts the date to the
     * first occurrence of the specified day-of-week before the date being adjusted.
     *
     * The ISO calendar system behaves as follows:
     *
     * * The input 2011-01-15 (a Saturday) for parameter (MONDAY) will return 2011-01-10 (five days earlier).
     * * The input 2011-01-15 (a Saturday) for parameter (WEDNESDAY) will return 2011-01-12 (three days earlier).
     * * The input 2011-01-15 (a Saturday) for parameter (SATURDAY) will return 2011-01-08 (seven days earlier).
     *
     * The behavior is suitable for use with most calendar systems.
     * It uses the {@link DAY_OF_WEEK} field and the {@link DAYS} unit,
     * and assumes a seven day week.
     *
     * @param {DayOfWeek} dayOfWeek  the day-of-week to move the date to, not null
     * @return {TemporalAdjuster} the previous day-of-week adjuster, not null
     */
    static previous(dayOfWeek) {
        return new RelativeDayOfWeek(3, dayOfWeek);
    }

    /**
     * Returns the previous-or-same day-of-week adjuster, which adjusts the date to the
     * first occurrence of the specified day-of-week before the date being adjusted
     * unless it is already on that day in which case the same object is returned.
     *
     * The ISO calendar system behaves as follows:
     *
     * * The input 2011-01-15 (a Saturday) for parameter (MONDAY) will return 2011-01-10 (five days earlier).
     * * The input 2011-01-15 (a Saturday) for parameter (WEDNESDAY) will return 2011-01-12 (three days earlier).
     * * The input 2011-01-15 (a Saturday) for parameter (SATURDAY) will return 2011-01-15 (same as input).
     *
     * The behavior is suitable for use with most calendar systems.
     * It uses the {@link DAY_OF_WEEK} field and the {@link DAYS} unit,
     * and assumes a seven day week.
     *
     * @param {DayOfWeek} dayOfWeek the day-of-week to check for or move the date to, not null
     * @return {TemporalAdjuster} the previous-or-same day-of-week adjuster, not null
     */
    static previousOrSame(dayOfWeek) {
        return new RelativeDayOfWeek(1, dayOfWeek);
    }

}

//-----------------------------------------------------------------------
/**
 * Enum implementing the adjusters.
 */
class Impl extends TemporalAdjuster {

    /**
     *
     * @param ordinal
     * @private
     */
    constructor(ordinal) {
        super();
        this._ordinal = ordinal;
    }

    adjustInto(temporal) {
        switch (this._ordinal) {
            case 0: return temporal.with(ChronoField.DAY_OF_MONTH, 1);
            case 1: return temporal.with(ChronoField.DAY_OF_MONTH, temporal.range(ChronoField.DAY_OF_MONTH).maximum());
            case 2: return temporal.with(ChronoField.DAY_OF_MONTH, 1).plus(1, ChronoUnit.MONTHS);
            case 3: return temporal.with(ChronoField.DAY_OF_YEAR, 1);
            case 4: return temporal.with(ChronoField.DAY_OF_YEAR, temporal.range(ChronoField.DAY_OF_YEAR).maximum());
            case 5: return temporal.with(ChronoField.DAY_OF_YEAR, 1).plus(1, ChronoUnit.YEARS);
        }
        throw new IllegalStateException('Unreachable');
    }

}

/** First day of month adjuster. */
Impl.FIRST_DAY_OF_MONTH = new Impl(0);
/** Last day of month adjuster. */
Impl.LAST_DAY_OF_MONTH = new Impl(1);
/** First day of next month adjuster. */
Impl.FIRST_DAY_OF_NEXT_MONTH = new Impl(2);
/** First day of year adjuster. */
Impl.FIRST_DAY_OF_YEAR = new Impl(3);
/** Last day of year adjuster. */
Impl.LAST_DAY_OF_YEAR = new Impl(4);
/** First day of next month adjuster. */
Impl.FIRST_DAY_OF_NEXT_YEAR = new Impl(5);


/**
 * Class implementing day-of-week in month adjuster.
 */
class DayOfWeekInMonth extends TemporalAdjuster {

    /**
     *
     * @param ordinal
     * @param dow
     * @private
     */
    constructor(ordinal, dow) {
        super();
        this._ordinal = ordinal;
        this._dowValue = dow.value();
    }

    adjustInto(temporal) {
        if (this._ordinal >= 0) {
            const temp = temporal.with(ChronoField.DAY_OF_MONTH, 1);
            const curDow = temp.get(ChronoField.DAY_OF_WEEK);
            let dowDiff = MathUtil.intMod((this._dowValue - curDow + 7), 7);
            dowDiff += (this._ordinal - 1) * 7;  // safe from overflow
            return temp.plus(dowDiff, ChronoUnit.DAYS);
        } else {
            const temp = temporal.with(ChronoField.DAY_OF_MONTH, temporal.range(ChronoField.DAY_OF_MONTH).maximum());
            const curDow = temp.get(ChronoField.DAY_OF_WEEK);
            let daysDiff = this._dowValue - curDow;
            daysDiff = (daysDiff === 0 ? 0 : (daysDiff > 0 ? daysDiff - 7 : daysDiff));
            daysDiff -= (-this._ordinal - 1) * 7;  // safe from overflow
            return temp.plus(daysDiff, ChronoUnit.DAYS);
        }
    }
}

/**
 * Implementation of next, previous or current day-of-week.
 */
class RelativeDayOfWeek extends TemporalAdjuster {

    /**
     *
     * @param relative
     * @param dayOfWeek
     * @private
     */
    constructor(relative, dayOfWeek) {
        super();
        requireNonNull(dayOfWeek, 'dayOfWeek');
        /** Whether the current date is a valid answer. */
        this._relative = relative;
        /** The day-of-week value, from 1 to 7. */
        this._dowValue = dayOfWeek.value();
    }

    adjustInto(temporal) {
        const calDow = temporal.get(ChronoField.DAY_OF_WEEK);
        if (this._relative < 2 && calDow === this._dowValue) {
            return temporal;
        }
        if ((this._relative & 1) === 0) {
            const daysDiff = calDow - this._dowValue;
            return temporal.plus(daysDiff >= 0 ? 7 - daysDiff : -daysDiff, ChronoUnit.DAYS);
        } else {
            const daysDiff = this._dowValue - calDow;
            return temporal.minus(daysDiff >= 0 ? 7 - daysDiff : -daysDiff, ChronoUnit.DAYS);
        }
    }
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { abstractMethodFail } from '../assert';

/**
 * Framework-level interface defining an amount of time, such as
 * "6 hours", "8 days" or "2 years and 3 months".
 *
 * This is the base interface type for amounts of time.
 * An amount is distinct from a date or time-of-day in that it is not tied
 * to any specific point on the time-line.
 *
 * The amount can be thought of as a {@link Map} of {@link TemporalUnit} to
 * `long`, exposed via {@link getUnits} and {@link get}.
 * A simple case might have a single unit-value pair, such as "6 hours".
 * A more complex case may have multiple unit-value pairs, such as
 * "7 years, 3 months and 5 days".
 *
 * There are two common implementations.
 * {@link Period} is a date-based implementation, storing years, months and days.
 * {@link Duration} is a time-based implementation, storing seconds and nanoseconds,
 * but providing some access using other duration based units such as minutes,
 * hours and fixed 24-hour days.
 *
 * This interface is a framework-level interface that should not be widely
 * used in application code. Instead, applications should create and pass
 * around instances of concrete types, such as {@link Period} and {@link Duration}.
 *
 * @interface
 */
export class TemporalAmount {
    /**
     * Returns the value of the requested unit.
     * The units returned from {@link getUnits} uniquely define the
     * value of the {@link TemporalAmount}.  A value must be returned
     * for each unit listed in {@link getUnits}.
     *
     * @implSpec
     * Implementations may declare support for units not listed by {@link getUnits}.
     * Typically, the implementation would define additional units
     * as conversions for the convenience of developers.
     *
     * @param {TemporalUnit} unit - the {@link TemporalUnit} for which to return the value
     * @return {number} the long value of the unit
     * @throws DateTimeException if a value for the unit cannot be obtained
     * @throws UnsupportedTemporalTypeException if the {@link unit} is not supported
     */
    // eslint-disable-next-line no-unused-vars
    get(unit) {
        abstractMethodFail('get');
    }
    
    /**
     * Returns the list of units uniquely defining the value of this TemporalAmount.
     * The list of {@link TemporalUnits} is defined by the implementation class.
     * The list is a snapshot of the units at the time {@link getUnits}
     * is called and is not mutable.
     * The units are ordered from longest duration to the shortest duration
     * of the unit.
     *
     * @implSpec
     * The list of units completely and uniquely represents the
     * state of the object without omissions, overlaps or duplication.
     * The units are in order from longest duration to shortest.
     *
     * @return {TemporalUnit[]} the List of {@link TemporalUnits}; not null
     */
    units() {
        abstractMethodFail('units');
    }
    
    /**
     * Adds to the specified temporal object.
     *
     * Adds the amount to the specified temporal object using the logic
     * encapsulated in the implementing class.
     *
     * There are two equivalent ways of using this method.
     * The first is to invoke this method directly.
     * The second is to use {@link Temporal#plus}:
     * <pre>
     *   // These two lines are equivalent, but the second approach is recommended
     *   dateTime = amount.addTo(dateTime);
     *   dateTime = dateTime.plus(adder);
     * </pre>
     * It is recommended to use the second approach, {@link plus},
     * as it is a lot clearer to read in code.
     *
     * @implSpec
     * The implementation must take the input object and add to it.
     * The implementation defines the logic of the addition and is responsible for
     * documenting that logic. It may use any method on {@link Temporal} to
     * query the temporal object and perform the addition.
     * The returned object must have the same observable type as the input object
     *
     * The input object must not be altered.
     * Instead, an adjusted copy of the original must be returned.
     * This provides equivalent, safe behavior for immutable and mutable temporal objects.
     *
     * The input temporal object may be in a calendar system other than ISO.
     * Implementations may choose to document compatibility with other calendar systems,
     * or reject non-ISO temporal objects by querying the chronology (see {@link TemporalQueries#chronology}).
     *
     * This method may be called from multiple threads in parallel.
     * It must be thread-safe when invoked.
     *
     * @param {Temporal} temporal - the temporal object to add the amount to, not null
     * @return {Temporal} an object of the same observable type with the addition made, not null
     * @throws DateTimeException if unable to add
     * @throws ArithmeticException if numeric overflow occurs
     */
    // eslint-disable-next-line no-unused-vars
    addTo(temporal) {
        abstractMethodFail('addTo');
    }
    
    /**
     * Subtracts this object from the specified temporal object.
     *
     * Subtracts the amount from the specified temporal object using the logic
     * encapsulated in the implementing class.
     *
     * There are two equivalent ways of using this method.
     * The first is to invoke this method directly.
     * The second is to use {@link Temporal#minus}:
     * <pre>
     *   // these two lines are equivalent, but the second approach is recommended
     *   dateTime = amount.subtractFrom(dateTime);
     *   dateTime = dateTime.minus(amount);
     * </pre>
     * It is recommended to use the second approach, {@link minus},
     * as it is a lot clearer to read in code.
     *
     * @implSpec
     * The implementation must take the input object and subtract from it.
     * The implementation defines the logic of the subtraction and is responsible for
     * documenting that logic. It may use any method on {@link Temporal} to
     * query the temporal object and perform the subtraction.
     * The returned object must have the same observable type as the input object
     *
     * The input object must not be altered.
     * Instead, an adjusted copy of the original must be returned.
     * This provides equivalent, safe behavior for immutable and mutable temporal objects.
     *
     * The input temporal object may be in a calendar system other than ISO.
     * Implementations may choose to document compatibility with other calendar systems,
     * or reject non-ISO temporal objects by querying the chronology (see {@link TemporalQueries#chronology}).
     *
     * This method may be called from multiple threads in parallel.
     * It must be thread-safe when invoked.
     *
     * @param {Temporal} temporal - the temporal object to subtract the amount from, not null
     * @return {Temporal} an object of the same observable type with the subtraction made, not null
     * @throws DateTimeException if unable to subtract
     * @throws ArithmeticException if numeric overflow occurs
     */
    // eslint-disable-next-line no-unused-vars
    subtractFrom(temporal) {
        abstractMethodFail('subtractFrom');
    }
    
}

if (typeof Symbol !== 'undefined' && Symbol.toPrimitive) {
    TemporalAmount.prototype[Symbol.toPrimitive] = function (hint) {
        // hint could be 'number', 'string' or 'default'. Only 'number'
        // should throw and 'default' is treated as 'string'.
        if (hint !== 'number') {
            return this.toString();
        }

        throw new TypeError(
            'A conversion from TemporalAmount to a number is not allowed. ' +
            'To compare use the methods .equals(), .compareTo(), .isBefore() ' +
            'or one that is more suitable to your use case.'
        );
    };
}
import { abstractMethodFail } from '../assert';

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

/**
 * A field of date-time, such as month-of-year or hour-of-minute.
 *
 * Date and time is expressed using fields which partition the time-line into something
 * meaningful for humans. Implementations of this interface represent those fields.
 *
 * The most commonly used units are defined in {@link ChronoField}.
 * Further fields are supplied in {@link IsoFields}, {@link WeekFields} and {@link JulianFields}.
 * Fields can also be written by application code by implementing this interface.
 *
 * The field works using double dispatch. Client code calls methods on a date-time like
 * {@link LocalDateTime} which check if the field is a {@link ChronoField}.
 * If it is, then the date-time must handle it.
 * Otherwise, the method call is re-dispatched to the matching method in this interface.
 *
 * @interface
 */
export class TemporalField {
    /**
     * Checks if this field represents a component of a date.
     *
     * @return {boolean} `true` if it is a component of a date, `false` otherwise.
     */
    isDateBased() {
        abstractMethodFail('isDateBased');
    }

    /**
     * Checks if this field represents a component of a time.
     *
     * @return {boolean} `true` if it is a component of a time, `false` otherwise.
     */
    isTimeBased() {
        abstractMethodFail('isTimeBased');
    }

    /**
     * Gets the unit that the field is measured in.
     *
     * The unit of the field is the period that varies within the range.
     * For example, in the field 'MonthOfYear', the unit is 'Months'.
     * See also {@link rangeUnit}.
     *
     * @return {TemporalUnit} the period unit defining the base unit of the field.
     */
    baseUnit() {
        abstractMethodFail('baseUnit');
    }

    /**
     * Gets the range that the field is bound by.
     * 
     * The range of the field is the period that the field varies within.
     * For example, in the field 'MonthOfYear', the range is 'Years'.
     * See also {@link baseUnit}.
     * 
     * The range is never null. For example, the 'Year' field is shorthand for
     * 'YearOfForever'. It therefore has a unit of 'Years' and a range of 'Forever'.
     *
     * @return {TemporalUnit} the period unit defining the range of the field.
     */
    rangeUnit() {
        abstractMethodFail('rangeUnit');
    }

    /**
     * Gets the range of valid values for the field.
     *
     * All fields can be expressed as an integer.
     * This method returns an object that describes the valid range for that value.
     * This method is generally only applicable to the ISO-8601 calendar system.
     *
     * Note that the result only describes the minimum and maximum valid values
     * and it is important not to read too much into them. For example, there
     * could be values within the range that are invalid for the field.
     *
     * @return {ValueRange} the range of valid values for the field.
     */
    range() {
        abstractMethodFail('range');
    }

    /**
     * Get the range of valid values for this field using the temporal object to
     * refine the result.
     *
     * This uses the temporal object to find the range of valid values for the field.
     * This is similar to {@link range}, however this method refines the result
     * using the temporal. For example, if the field is {@link DAY_OF_MONTH} the
     * {@link range} method is not accurate as there are four possible month lengths,
     * 28, 29, 30 and 31 days. Using this method with a date allows the range to be
     * accurate, returning just one of those four options.
     *
     * There are two equivalent ways of using this method.
     * The first is to invoke this method directly.
     * The second is to use {@link TemporalAccessor#range}:
     * <pre>
     *   // these two lines are equivalent, but the second approach is recommended
     *   temporal = thisField.rangeRefinedBy(temporal);
     *   temporal = temporal.range(thisField);
     * </pre>
     * It is recommended to use the second approach, {@link range},
     * as it is a lot clearer to read in code.
     *
     * Implementations should perform any queries or calculations using the fields
     * available in {@link ChronoField}.
     * If the field is not supported a {@link DateTimeException} must be thrown.
     *
     * @param {!TemporalAccessor} temporal the temporal object used to refine the result.
     * @return {ValueRange} the range of valid values for this field.
     * @throws {DateTimeException} if the range for the field cannot be obtained.
     * 
     */
    // eslint-disable-next-line no-unused-vars
    rangeRefinedBy(temporal) {
        abstractMethodFail('rangeRefinedBy');
    }

    /**
     * Gets the value of this field from the specified temporal object.
     *
     * This queries the temporal object for the value of this field.
     *
     * There are two equivalent ways of using this method.
     * The first is to invoke this method directly.
     * The second is to use {@link TemporalAccessor#get}:
     * <pre>
     *   // these two lines are equivalent, but the second approach is recommended
     *   temporal = thisField.getFrom(temporal);
     *   temporal = temporal.get(thisField);
     * </pre>
     * It is recommended to use the second approach, as it is a lot clearer to read in code.
     *
     * Implementations should perform any queries or calculations using the fields
     * available in {@link ChronoField}.
     * If the field is not supported a {@link DateTimeException} must be thrown.
     *
     * @param {!TemporalAccesor} temporal the temporal object to query.
     * @return {number} the value of this field.
     * @throws {DateTimeException} if a value for the field cannot be obtained.
     */
    // eslint-disable-next-line no-unused-vars
    getFrom(temporal) {
        abstractMethodFail('getFrom');
    }

    /**
     * Returns a copy of the specified temporal object with the value of this field set.
     *
     * This returns a new temporal object based on the specified one with the value for
     * this field changed. For example, on a {@link LocalDate}, this could be used to
     * set the year, month or day-of-month.
     * The returned object has the same observable type as the specified object.
     *
     * In some cases, changing a field is not fully defined. For example, if the target object is
     * a date representing the 31st January, then changing the month to February would be unclear.
     * In cases like this, the implementation is responsible for resolving the result.
     * Typically it will choose the previous valid date, which would be the last valid
     * day of February in this example.
     *
     * There are two equivalent ways of using this method.
     * The first is to invoke this method directly.
     * The second is to use {@link Temporal#with}:
     * <pre>
     *   // these two lines are equivalent, but the second approach is recommended
     *   temporal = thisField.adjustInto(temporal);
     *   temporal = temporal.with(thisField);
     * </pre>
     * It is recommended to use the second approach, `with(temporal)`,
     * as it is a lot clearer to read in code.
     *
     * Implementations should perform any queries or calculations using the fields
     * available in {@link ChronoField}.
     * If the field is not supported a {@link DateTimeException} must be thrown.
     *
     * Implementations must not alter the specified temporal object.
     * Instead, an adjusted copy of the original must be returned.
     * This provides equivalent, safe behavior for immutable and mutable implementations.
     *
     * @param {!Temporal} temporal the temporal object to adjust.
     * @param {!number} newValue the new value of the field.
     * @return {Temporal} the adjusted temporal object.
     * @throws {DateTimeException} if the field cannot be set.
     */
    // eslint-disable-next-line no-unused-vars
    adjustInto(temporal, newValue) {
        abstractMethodFail('adjustInto');
    }

    /**
     * Checks if this field is supported by the temporal object.
     *
     * This determines whether the temporal accessor supports this field.
     * If this returns false, the the temporal cannot be queried for this field.
     *
     * There are two equivalent ways of using this method.
     * The first is to invoke this method directly.
     * The second is to use {@link TemporalAccessor#isSupported}:
     * <pre>
     *   // these two lines are equivalent, but the second approach is recommended
     *   temporal = thisField.isSupportedBy(temporal);
     *   temporal = temporal.isSupported(thisField);
     * </pre>
     * It is recommended to use the second approach, `isSupported(temporal)`,
     * as it is a lot clearer to read in code.
     *
     * Implementations should determine whether they are supported using the fields
     * available in {@link ChronoField}.
     *
     * @param {!TemporalAccesor} temporal the temporal object to query.
     * @return {boolean} `true` if the date-time can be queried for this field, `false` if not.
     */
    // eslint-disable-next-line no-unused-vars
    isSupportedBy(temporal) {
        abstractMethodFail('isSupportedBy');
    }

    /**
     * @return {string}
     */
    displayName(/* TODO: locale */) {
        abstractMethodFail('displayName');
    }

    /**
    * @param {*} other
    * @returns {boolean}
    */
    // eslint-disable-next-line no-unused-vars
    equals(other) {
        abstractMethodFail('equals');
    }

    /**
     * @returns {string}
     */
    name() {
        abstractMethodFail('name');
    }
}
/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

/**
 * Common implementations of {@link TemporalQuery}.
 *
 * This class provides common implementations of {@link TemporalQuery}.
 * These queries are primarily used as optimizations, allowing the internals
 * of other objects to be extracted effectively. Note that application code
 * can also use the {@link from} method on most temporal
 * objects as a method reference matching the query interface, such as
 * {@link LocalDate::from} and {@link ZoneId::from}.
 *
 * There are two equivalent ways of using a {@link TemporalQuery}.
 * The first is to invoke the method on the interface directly.
 * The second is to use {@link TemporalAccessor#query}:
 * <pre>
 *   // these two lines are equivalent, but the second approach is recommended
 *   dateTime = query.queryFrom(dateTime);
 *   dateTime = dateTime.query(query);
 * </pre>
 * It is recommended to use the second approach, {@link query},
 * as it is a lot clearer to read in code.
 *
 */
export class TemporalQueries {

    /**
     * A strict query for the {@link ZoneId}.
     *
     * This queries a {@link TemporalAccessor} for the zone.
     * The zone is only returned if the date-time conceptually contains a {@link ZoneId}.
     * It will not be returned if the date-time only conceptually has an {@link ZoneOffset}.
     * Thus a {@link ZonedDateTime} will return the result of
     * {@link getZone}, but an {@link OffsetDateTime} will
     * return null.
     *
     * In most cases, applications should use {@link ZONE} as this query is too strict.
     *
     * The result from JDK classes implementing {@link TemporalAccessor} is as follows:
     * * * {@link LocalDate} returns null
     * * {@link LocalTime} returns null
     * * {@link LocalDateTime} returns null
     * * {@link ZonedDateTime} returns the associated zone
     * * {@link OffsetTime} returns null
     * * {@link OffsetDateTime} returns null
     * * {@link ChronoLocalDate} returns null
     * * {@link ChronoLocalDateTime} returns null
     * * {@link ChronoZonedDateTime} returns the associated zone
     * * {@link Era} returns null
     * * {@link DayOfWeek} returns null
     * * {@link Month} returns null
     * * {@link Year} returns null
     * * {@link YearMonth} returns null
     * * {@link MonthDay} returns null
     * * {@link ZoneOffset} returns null
     * * {@link Instant} returns null
     *
     * @return a query that can obtain the zone ID of a temporal, not null
     */
    static zoneId() {
        return TemporalQueries.ZONE_ID;
    }

    /**
     * A query for the {@link Chronology}.
     *
     * This queries a {@link TemporalAccessor} for the chronology.
     * If the target {@link TemporalAccessor} represents a date, or part of a date,
     * then it should return the chronology that the date is expressed in.
     * As a result of this definition, objects only representing time, such as
     * {@link LocalTime}, will return null.
     *
     * The result from js-joda classes implementing {@link TemporalAccessor} is as follows:
     *
     * * {@link LocalDate} returns * {@link IsoChronology.INSTANCE}
     * * {@link LocalTime} returns null (does not represent a date)
     * * {@link LocalDateTime} returns * {@link IsoChronology.INSTANCE}
     * * {@link ZonedDateTime} returns * {@link IsoChronology.INSTANCE}
     * * {@link OffsetTime} returns null (does not represent a date)
     * * {@link OffsetDateTime} returns * {@link IsoChronology.INSTANCE}
     * * {@link ChronoLocalDate} returns the associated chronology
     * * {@link ChronoLocalDateTime} returns the associated chronology
     * * {@link ChronoZonedDateTime} returns the associated chronology
     * * {@link Era} returns the associated chronology
     * * {@link DayOfWeek} returns null (shared across chronologies)
     * * {@link Month} returns * {@link IsoChronology.INSTANCE}
     * * {@link Year} returns * {@link IsoChronology.INSTANCE}
     * * {@link YearMonth} returns * {@link IsoChronology.INSTANCE}
     * * {@link MonthDay} returns null * {@link IsoChronology.INSTANCE}
     * * {@link ZoneOffset} returns null (does not represent a date)
     * * {@link Instant} returns null (does not represent a date)
     *
     * The method {@link Chronology#from} can be used as a
     * {@link TemporalQuery}
     * That method is equivalent to this query, except that it throws an
     * exception if a chronology cannot be obtained.
     *
     * @return {TemporalQuery} a query that can obtain the chronology of a temporal, not null
     */
    static chronology() {
        return TemporalQueries.CHRONO;
    }

    /**
     * A query for the smallest supported unit.
     *
     * This queries a {@link TemporalAccessor} for the time precision.
     * If the target {@link TemporalAccessor} represents a consistent or complete date-time,
     * date or time then this must return the smallest precision actually supported.
     * Note that fields such as {@link NANO_OF_DAY} and {@link NANO_OF_SECOND}
     * are defined to always return ignoring the precision, thus this is the only
     * way to find the actual smallest supported unit.
     * For example, were {@link GregorianCalendar} to implement {@link TemporalAccessor}
     * it would return a precision of {@link MILLIS}.
     *
     * The result from js-joda classes implementing {@link TemporalAccessor} is as follows:
     *
     * {@link LocalDate} returns {@link DAYS}
     * {@link LocalTime} returns {@link NANOS}
     * {@link LocalDateTime} returns {@link NANOS}
     * {@link ZonedDateTime} returns {@link NANOS}
     * {@link OffsetTime} returns {@link NANOS}
     * {@link OffsetDateTime} returns {@link NANOS}
     * {@link ChronoLocalDate} returns {@link DAYS}
     * {@link ChronoLocalDateTime} returns {@link NANOS}
     * {@link ChronoZonedDateTime} returns {@link NANOS}
     * {@link Era} returns {@link ERAS}
     * {@link DayOfWeek} returns {@link DAYS}
     * {@link Month} returns {@link MONTHS}
     * {@link Year} returns {@link YEARS}
     * {@link YearMonth} returns {@link MONTHS}
     * {@link MonthDay} returns null (does not represent a complete date or time)
     * {@link ZoneOffset} returns null (does not represent a date or time)
     * {@link Instant} returns {@link NANOS}
     *
     * @return a query that can obtain the precision of a temporal, not null
     */
    static precision() {
        return TemporalQueries.PRECISION;
    }

    /**
     * A lenient query for the {@link ZoneId}, falling back to the {@link ZoneOffset}.
     *
     * This queries a {@link TemporalAccessor} for the zone.
     * It first tries to obtain the zone, using {@link zoneId}.
     * If that is not found it tries to obtain the {@link offset}.
     *
     * In most cases, applications should use this query rather than {@link zoneId}.
     *
     * This query examines the {@link ChronoField#OFFSET_SECONDS}
     * field and uses it to create a {@link ZoneOffset}.
     *
     * The method {@link ZoneId#from} can be used as a
     * {@link TemporalQuery} via a method reference, {@link ZoneId::from}.
     * That method is equivalent to this query, except that it throws an
     * exception if a zone cannot be obtained.
     *
     * @return a query that can obtain the zone ID or offset of a temporal, not null
     */
    static zone() {
        return TemporalQueries.ZONE;
    }

    /**
     * A query for {@link ZoneOffset} returning null if not found.
     *
     * This returns a {@link TemporalQuery} that can be used to query a temporal
     * object for the offset. The query will return null if the temporal
     * object cannot supply an offset.
     *
     * The query implementation examines the {@link ChronoField#OFFSET_SECONDS}
     * field and uses it to create a {@link ZoneOffset}.
     *
     * The method {@link java.time.ZoneOffset#from} can be used as a
     * {@link TemporalQuery} via a method reference, {@link ZoneOffset::from}.
     * This query and {@link ZoneOffset::from} will return the same result if the
     * temporal object contains an offset. If the temporal object does not contain
     * an offset, then the method reference will throw an exception, whereas this
     * query will return null.
     *
     * @return a query that can obtain the offset of a temporal, not null
     */
    static offset() {
        return TemporalQueries.OFFSET;
    }

    /**
     * A query for {@link LocalDate} returning null if not found.
     *
     * This returns a {@link TemporalQuery} that can be used to query a temporal
     * object for the local date. The query will return null if the temporal
     * object cannot supply a local date.
     *
     * The query implementation examines the {@link ChronoField#EPOCH_DAY}
     * field and uses it to create a {@link LocalDate}.
     *
     * @return a query that can obtain the date of a temporal, not null
     */
    static localDate() {
        return TemporalQueries.LOCAL_DATE;
    }

    /**
     * A query for {@link LocalTime} returning null if not found.
     *
     * This returns a {@link TemporalQuery} that can be used to query a temporal
     * object for the local time. The query will return null if the temporal
     * object cannot supply a local time.
     *
     * The query implementation examines the {@link ChronoField#NANO_OF_DAY}
     * field and uses it to create a {@link LocalTime}.
     *
     * @return a query that can obtain the time of a temporal, not null
     */
    static localTime() {
        return TemporalQueries.LOCAL_TIME;
    }
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { ChronoField } from './ChronoField';
import { createTemporalQuery } from './TemporalQuery';
import { TemporalQueries } from './TemporalQueries';

import { LocalDate } from '../LocalDate';
import { LocalTime } from '../LocalTime';
import { ZoneOffset } from '../ZoneOffset';


export function _init() {
    //-----------------------------------------------------------------------
    /**
     * A strict query for the {@link ZoneId}.
     */
    TemporalQueries.ZONE_ID = createTemporalQuery('ZONE_ID', (temporal) => {
        return temporal.query(TemporalQueries.ZONE_ID);
    });

    /**
     * A query for the {@link Chronology}.
     */
    TemporalQueries.CHRONO = createTemporalQuery('CHRONO', (temporal) => {
        return temporal.query(TemporalQueries.CHRONO);
    });

    /**
     * A query for the smallest supported unit.
     */
    TemporalQueries.PRECISION = createTemporalQuery('PRECISION', (temporal) => {
        return temporal.query(TemporalQueries.PRECISION);
    });

    //-----------------------------------------------------------------------
    /**
     * A query for {@link ZoneOffset} returning null if not found.
     */
    TemporalQueries.OFFSET = createTemporalQuery('OFFSET', (temporal) => {
        if (temporal.isSupported(ChronoField.OFFSET_SECONDS)) {
            return ZoneOffset.ofTotalSeconds(temporal.get(ChronoField.OFFSET_SECONDS));
        }
        return null;
    });

    /**
     * A lenient query for the {@link ZoneId}, falling back to the {@link ZoneOffset}.
     */
    TemporalQueries.ZONE = createTemporalQuery('ZONE', (temporal) => {
        const zone = temporal.query(TemporalQueries.ZONE_ID);
        return (zone != null ? zone : temporal.query(TemporalQueries.OFFSET));
    });

    /**
     * A query for {@link LocalDate} returning null if not found.
     */
    TemporalQueries.LOCAL_DATE = createTemporalQuery('LOCAL_DATE', (temporal) => {
        if (temporal.isSupported(ChronoField.EPOCH_DAY)) {
            return LocalDate.ofEpochDay(temporal.getLong(ChronoField.EPOCH_DAY));
        }
        return null;
    });

    /**
     * A query for {@link LocalTime} returning null if not found.
     */
    TemporalQueries.LOCAL_TIME = createTemporalQuery('LOCAL_TIME', (temporal) => {
        if (temporal.isSupported(ChronoField.NANO_OF_DAY)) {
            return LocalTime.ofNanoOfDay(temporal.getLong(ChronoField.NANO_OF_DAY));
        }
        return null;
    });
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { abstractMethodFail } from '../assert';
import { Enum } from '../Enum';


/**
 * Strategy for querying a temporal object.
 *
 * Queries are a key tool for extracting information from temporal objects.
 * They exist to externalize the process of querying, permitting different
 * approaches, as per the strategy design pattern.
 * Examples might be a query that checks if the date is the day before February 29th
 * in a leap year, or calculates the number of days to your next birthday.
 *
 * The {@link TemporalField} interface provides another mechanism for querying
 * temporal objects. That interface is limited to returning a `long`.
 * By contrast, queries can return any type.
 *
 * There are two equivalent ways of using a {@link TemporalQuery}.
 * The first is to invoke the method on this interface directly.
 * The second is to use {@link TemporalAccessor#query}:
 * <pre>
 *   // these two lines are equivalent, but the second approach is recommended
 *   temporal = thisQuery.queryFrom(temporal);
 *   temporal = temporal.query(thisQuery);
 * </pre>
 * It is recommended to use the second approach, {@link query},
 * as it is a lot clearer to read in code.
 *
 * The most common implementations are method references, such as
 * {@link LocalDate::from} and {@link ZoneId::from}.
 * Further implementations are on {@link TemporalQueries}.
 * Queries may also be defined by applications.
 *
 * ### Specification for implementors
 *
 * This interface places no restrictions on the mutability of implementations,
 * however immutability is strongly recommended.
 *
 * @interface
 */
export class TemporalQuery  extends Enum {
    /**
     * Queries the specified temporal object.
     *
     * This queries the specified temporal object to return an object using the logic
     * encapsulated in the implementing class.
     * Examples might be a query that checks if the date is the day before February 29th
     * in a leap year, or calculates the number of days to your next birthday.
     *
     * There are two equivalent ways of using this method.
     * The first is to invoke this method directly.
     * The second is to use {@link TemporalAccessor#query}:
     * <pre>
     *   // these two lines are equivalent, but the second approach is recommended
     *   temporal = thisQuery.queryFrom(temporal);
     *   temporal = temporal.query(thisQuery);
     * </pre>
     * It is recommended to use the second approach, {@link query},
     * as it is a lot clearer to read in code.
     *
     * ### Specification for implementors
     *
     * The implementation must take the input object and query it.
     * The implementation defines the logic of the query and is responsible for
     * documenting that logic.
     * It may use any method on {@link TemporalAccessor} to determine the result.
     * The input object must not be altered.
     *
     * The input temporal object may be in a calendar system other than ISO.
     * Implementations may choose to document compatibility with other calendar systems,
     * or reject non-ISO temporal objects by querying the chronology (see {@link TemporalQueries#chronology}).
     *
     * This method may be called from multiple threads in parallel.
     * It must be thread-safe when invoked.
     *
     * @param {TemporalAccessor} temporal  the temporal object to query, not null
     * @return the queried value, may return null to indicate not found
     * @throws DateTimeException if unable to query
     * @throws ArithmeticException if numeric overflow occurs
     */
    // eslint-disable-next-line no-unused-vars
    queryFrom(temporal){
        abstractMethodFail('queryFrom');
    }

}

/**
 * @private
 *
 * Factory to create something similar to the JSR-310 {TemporalQuery} interface, takes a function and returns a new TemporalQuery object that presents that function
 * as the queryFrom() function.
 * @param name for the underlying Enum
 * @param queryFromFunction
 */
export function createTemporalQuery(name, queryFromFunction) {
    class ExtendedTemporalQuery extends TemporalQuery {

    }

    ExtendedTemporalQuery.prototype.queryFrom = queryFromFunction;
    return new ExtendedTemporalQuery(name);
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { abstractMethodFail } from '../assert';

/**
 * A unit of date-time, such as Days or Hours.
 *
 * Measurement of time is built on units, such as years, months, days, hours, minutes and seconds.
 * Implementations of this interface represent those units.
 *
 * An instance of this interface represents the unit itself, rather than an amount of the unit.
 * See {@link Period} for a class that represents an amount in terms of the common units.
 *
 * The most commonly used units are defined in {@link ChronoUnit}.
 * Further units are supplied in {@link IsoFields}.
 * Units can also be written by application code by implementing this interface.
 *
 * The unit works using double dispatch. Client code calls methods on a date-time like
 * {@link LocalDateTime} which check if the unit is a {@link ChronoUnit}.
 * If it is, then the date-time must handle it.
 * Otherwise, the method call is re-dispatched to the matching method in this interface.
 *
 * @interface
 */
export class TemporalUnit {
    /**
     * Gets the duration of this unit, which may be an estimate.
     *
     * All units return a duration measured in standard nanoseconds from this method.
     * The duration will be positive and non-zero.
     * For example, an hour has a duration of `60 * 60 * 1,000,000,000 ns`.
     *
     * Some units may return an accurate duration while others return an estimate.
     * For example, days have an estimated duration due to the possibility of
     * daylight saving time changes.
     * To determine if the duration is an estimate, use {@link isDurationEstimated}.
     *
     * @return {Duration} the duration of this unit, which may be an estimate.
     */
    duration() {
        abstractMethodFail('duration');
    }

    /**
     * Checks if the duration of the unit is an estimate.
     *
     * All units have a duration, however the duration is not always accurate.
     * For example, days have an estimated duration due to the possibility of
     * daylight saving time changes.
     * This method returns true if the duration is an estimate and false if it is
     * accurate. Note that accurate/estimated ignores leap seconds.
     *
     * @return {boolean} `true` if the duration is estimated, `false` if accurate.
     */
    isDurationEstimated() {
        abstractMethodFail('isDurationEstimated');
    }

    /**
     * Checks if this unit is date-based.
     *
     * @return {boolean} `true` if date unit, `false` if a time unit.
     */
    isDateBased() {
        abstractMethodFail('isDateBased');
    }

    /**
     * Checks if this unit is time-based.
     *
     * @return {boolean} `true` if time unit, `false` if a date unit.
     */
    isTimeBased() {
        abstractMethodFail('isTimeBased');
    }

    //-----------------------------------------------------------------------
    /**
     * Checks if this unit is supported by the specified temporal object.
     *
     * This checks that the implementing date-time can add/subtract this unit.
     * This can be used to avoid throwing an exception.
     *
     * @param {!Temporal} temporal the temporal object to check.
     * @return {boolean} `true` if the unit is supported.
     */
    // eslint-disable-next-line no-unused-vars
    isSupportedBy(temporal) {
        abstractMethodFail('isSupportedBy');
    }

    /**
     * Returns a copy of the specified temporal object with the specified period added.
     *
     * The period added is a multiple of this unit. For example, this method
     * could be used to add "3 days" to a date by calling this method on the
     * instance representing "days", passing the date and the period "3".
     * The period to be added may be negative, which is equivalent to subtraction.
     *
     * There are two equivalent ways of using this method.
     * The first is to invoke this method directly.
     * The second is to use {@link Temporal#plus}:
     * <pre>
     *   // these two lines are equivalent, but the second approach is recommended
     *   temporal = thisUnit.doPlus(temporal);
     *   temporal = temporal.plus(thisUnit);
     * </pre>
     * It is recommended to use the second approach, {@link plus},
     * as it is a lot clearer to read in code.
     *
     * Implementations should perform any queries or calculations using the units
     * available in {@link ChronoUnit} or the fields available in {@link ChronoField}.
     * If the field is not supported a {@link DateTimeException} must be thrown.
     *
     * Implementations must not alter the specified temporal object.
     * Instead, an adjusted copy of the original must be returned.
     * This provides equivalent, safe behavior for immutable and mutable implementations.
     *
     * @param {!Temporal} dateTime the temporal object to adjust.
     * @param {number} periodToAdd the period of this unit to add, positive or negative.
     * @return {Temporal} the adjusted temporal object.
     * @throws DateTimeException if the period cannot be added.
     */
    // eslint-disable-next-line no-unused-vars
    addTo(dateTime, periodToAdd) {
        abstractMethodFail('addTo');
    }

    //-----------------------------------------------------------------------
    /**
     * Calculates the period in terms of this unit between two temporal objects of the same type.
     *
     * This calculates the period between two temporals in terms of this unit.
     * The start and end points are supplied as temporal objects and must be of the same type.
     * The result will be negative if the end is before the start.
     * For example, the period in hours between two temporal objects can be calculated
     * using {@link HOURS.between}.
     *
     * The calculation returns a whole number, representing the number of complete units between the two temporals.
     * For example, the period in hours between the times 11:30 and 13:29 will only be
     * one hour as it is one minute short of two hours.
     *
     * There are two equivalent ways of using this method.
     * The first is to invoke this method directly.
     * The second is to use {@link Temporal#until}:
     * <pre>
     *   // these two lines are equivalent
     *   between = thisUnit.between(start, end);
     *   between = start.until(end, thisUnit);
     * </pre>
     * The choice should be made based on which makes the code more readable.
     *
     * For example, this method allows the number of days between two dates to be calculated:
     * <pre>
     *   long daysBetween = DAYS.between(start, end);
     *   // or alternatively
     *   long daysBetween = start.until(end, DAYS);
     * </pre>
     * Implementations should perform any queries or calculations using the units available in
     * {@link ChronoUnit} or the fields available in {@link ChronoField}.
     * If the unit is not supported a {@link DateTimeException} must be thrown.
     * Implementations must not alter the specified temporal objects.
     *
     * @param {!Temporal} temporal1 the base temporal object.
     * @param {!Temporal} temporal2 the other temporal object.
     * @return {number} the period between temporal1 and temporal2 in terms of this unit;
     *  positive if temporal2 is later than temporal1, negative if earlier.
     * @throws DateTimeException if the period cannot be calculated.
     * @throws ArithmeticException if numeric overflow occurs.
     */
    // eslint-disable-next-line no-unused-vars
    between(temporal1, temporal2) {
        abstractMethodFail('between');
    }
}
/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { assert } from '../assert';
import { DateTimeException, IllegalArgumentException } from '../errors';
import { MathUtil } from '../MathUtil';

/**
 * The range of valid values for a date-time field.
 *
 * All TemporalField instances have a valid range of values.
 * For example, the ISO day-of-month runs from 1 to somewhere between 28 and 31.
 * This class captures that valid range.
 *
 * It is important to be aware of the limitations of this class.
 * Only the minimum and maximum values are provided.
 * It is possible for there to be invalid values within the outer range.
 * For example, a weird field may have valid values of 1, 2, 4, 6, 7, thus
 * have a range of '1 - 7', despite that fact that values 3 and 5 are invalid.
 *
 * Instances of this class are not tied to a specific field.
 */
export class ValueRange {

    /**
     *
     * @param {!number} minSmallest
     * @param {!number} minLargest
     * @param {!number} maxSmallest
     * @param {!number} maxLargest
     * @private
     */
    constructor(minSmallest, minLargest, maxSmallest, maxLargest) {
        assert(!(minSmallest > minLargest), `Smallest minimum value '${minSmallest 
        }' must be less than largest minimum value '${minLargest}'`, IllegalArgumentException);
        assert(!(maxSmallest > maxLargest), `Smallest maximum value '${maxSmallest 
        }' must be less than largest maximum value '${maxLargest}'`, IllegalArgumentException);
        assert(!(minLargest > maxLargest), `Minimum value '${minLargest 
        }' must be less than maximum value '${maxLargest}'`, IllegalArgumentException);

        this._minSmallest = minSmallest;
        this._minLargest = minLargest;
        this._maxLargest = maxLargest;
        this._maxSmallest = maxSmallest;
    }

    /**
     * Is the value range fixed and fully known.
     *
     * For example, the ISO day-of-month runs from 1 to between 28 and 31.
     * Since there is uncertainty about the maximum value, the range is not fixed.
     * However, for the month of January, the range is always 1 to 31, thus it is fixed.
     *
     * @return {boolean} true if the set of values is fixed
     */
    isFixed() {
        return this._minSmallest === this._minLargest && this._maxSmallest === this._maxLargest;
    }

    /**
     *
     * @returns {number}
     */
    minimum(){
        return this._minSmallest;
    }

    /**
     *
     * @returns {number}
     */
    largestMinimum(){
        return this._minLargest;
    }

    /**
     *
     * @returns {number}
     */
    maximum(){
        return this._maxLargest;
    }

    /**
     *
     * @returns {number}
     */
    smallestMaximum(){
        return this._maxSmallest;
    }

    /**
     *
     * @returns {boolean}
     */
    isValidValue(value) {
        return (this.minimum() <= value && value <= this.maximum());
    }

    /**
     *
     * @param {number} value
     * @param {TemporalField} field
     */
    checkValidValue(value, field) {
        let msg;
        if (!this.isValidValue(value)) {
            if (field != null) {
                msg = `Invalid value for ${field} (valid values ${this.toString()}): ${value}`;
            } else {
                msg = `Invalid value (valid values ${this.toString()}): ${value}`;
            }
            return assert(false, msg, DateTimeException);
        }
        return value;
    }

    /**
     * Checks that the specified value is valid and fits in an `int`.
     *
     * This validates that the value is within the valid range of values and that
     * all valid values are within the bounds of an `int`.
     * The field is only used to improve the error message.
     *
     * @param {number} value - the value to check
     * @param {TemporalField} field - the field being checked, may be null
     * @return {number} the value that was passed in
     * @see #isValidIntValue(long)
     */
    checkValidIntValue(value, field) {
        if (this.isValidIntValue(value) === false) {
            throw new DateTimeException(`Invalid int value for ${field}: ${value}`);
        }
        return value;
    }

    /**
     * Checks if the value is within the valid range and that all values
     * in the range fit in an `int`.
     *
     * This method combines {@link isIntValue} and {@link isValidValue}.
     *
     * @param {number} value - the value to check
     * @return true if the value is valid and fits in an `int`
     */
    isValidIntValue(value) {
        return this.isIntValue() && this.isValidValue(value);
    }

    /**
     * Checks if all values in the range fit in an `int`.
     *
     * This checks that all valid values are within the bounds of an `int`.
     *
     * For example, the ISO month-of-year has values from 1 to 12, which fits in an `int`.
     * By comparison, ISO nano-of-day runs from 1 to 86,400,000,000,000 which does not fit in an `int`.
     *
     * This implementation uses {@link getMinimum} and {@link getMaximum}.
     *
     * @return boolean if a valid value always fits in an `int`
     */
    isIntValue() { // should be isSafeIntegerValue
        return this.minimum() >= MathUtil.MIN_SAFE_INTEGER && this.maximum() <= MathUtil.MAX_SAFE_INTEGER;
    }

    /**
     * Checks if this range is equal to another range.
     *
     * The comparison is based on the four values, minimum, largest minimum,
     * smallest maximum and maximum.
     * Only objects of type {@link ValueRange} are compared, other types return false.
     *
     * @param {*} other - the object to check, null returns false
     * @return {boolean} true if this is equal to the other range
     */
    equals(other) {
        if (other === this) {
            return true;
        }
        if (other instanceof ValueRange) {
            return this._minSmallest === other._minSmallest && this._minLargest === other._minLargest &&
                this._maxSmallest === other._maxSmallest && this._maxLargest === other._maxLargest;
        }
        return false;
    }

    /**
     * A hash code for this range.
     *
     * @return {number} a suitable hash code
     */
    hashCode() {
        return MathUtil.hashCode(this._minSmallest, this._minLargest, this._maxSmallest, this._maxLargest);
    }

    /*
     * Outputs this range as a String.
     *
     * The format will be '{min}/{largestMin} - {smallestMax}/{max}',
     * where the largestMin or smallestMax sections may be omitted, together
     * with associated slash, if they are the same as the min or max.
     *
     * @return {string} a string representation of this range, not null
     */
    toString() {
        let str = this.minimum() + (this.minimum() !== this.largestMinimum() ? `/${this.largestMinimum()}` : '');
        str += ' - ';
        str += this.smallestMaximum() + (this.smallestMaximum() !== this.maximum() ? `/${this.maximum()}` : '');
        return str;
    }

    /*
     * called with 2 params: Obtains a fixed value range.
     *
     * This factory obtains a range where the minimum and maximum values are fixed.
     * For example, the ISO month-of-year always runs from 1 to 12.
     *
     * @param min  the minimum value
     * @param max  the maximum value
     * @return the ValueRange for min, max, not null

     * called with 3 params: Obtains a variable value range.
     *
     * This factory obtains a range where the minimum value is fixed and the maximum value may vary.
     * For example, the ISO day-of-month always starts at 1, but ends between 28 and 31.
     *
     * @param min  the minimum value
     * @param maxSmallest  the smallest maximum value
     * @param maxLargest  the largest maximum value
     * @return the ValueRange for min, smallest max, largest max, not null

     * called with 4 params: Obtains a fully variable value range.
     *
     * This factory obtains a range where both the minimum and maximum value may vary.
     *
     * @param minSmallest  the smallest minimum value
     * @param minLargest  the largest minimum value
     * @param maxSmallest  the smallest maximum value
     * @param maxLargest  the largest maximum value
     *
     * @return {ValueRange} the ValueRange for smallest min, largest min, smallest max, largest max, not null
     */
    static of() {
        if (arguments.length === 2) {
            return new ValueRange(arguments[0], arguments[0], arguments[1], arguments[1]);
        } else if (arguments.length === 3) {
            return new ValueRange(arguments[0], arguments[0], arguments[1], arguments[2]);
        } else if (arguments.length === 4) {
            return new ValueRange(arguments[0], arguments[1], arguments[2], arguments[3]);
        } else {
            return assert(false, `Invalid number of arguments ${arguments.length}`, IllegalArgumentException);
        }
    }
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { requireNonNull } from '../assert';
import { DateTimeException } from '../errors';
import { MathUtil } from '../MathUtil';

import { EnumMap } from './EnumMap';
import { ResolverStyle } from './ResolverStyle';

import { IsoChronology } from '../chrono/IsoChronology';
import { ChronoLocalDate } from '../chrono/ChronoLocalDate';
import { ChronoField } from '../temporal/ChronoField';
import { TemporalAccessor } from '../temporal/TemporalAccessor';
import { TemporalQueries } from '../temporal/TemporalQueries';

import { LocalTime } from '../LocalTime';
import { LocalDate } from '../LocalDate';
import { Period } from '../Period';

import { ZoneOffset } from '../ZoneOffset';

/**
 * Builder that can holds date and time fields and related date and time objects.
 *
 * The builder is used to hold onto different elements of date and time.
 * It is designed as two separate maps:
 *
 * * from {@link TemporalField} to `long` value, where the value may be
 *   outside the valid range for the field
 * * from {@link Class} to {@link TemporalAccessor}, holding larger scale objects
 *   like {@link LocalDateTime}.
 *
 *   @private
 */
export class DateTimeBuilder extends TemporalAccessor {

    /**
     * Creates a new instance of the builder with a single field-value.
     *
     * This is equivalent to using {@link addFieldValue} on an empty builder.
     *
     * @param {TemporalField} field - the field to add, not null
     * @param {number} value - the value to add, not null
     * @return {DateTimeBuilder}
     */
    static create(field, value) {
        const dtb = new DateTimeBuilder();
        dtb._addFieldValue(field, value);
        return dtb;
    }


    constructor(){
        super();

        /**
         * The map of other fields.
         */
        this.fieldValues = new EnumMap();
        /**
         * The chronology.
         */
        this.chrono = null;
        /**
         * The zone.
         */
        this.zone = null;
        /**
         * The date.
         */
        this.date = null;
        /**
         * The time.
         */
        this.time = null;
        /**
         * The leap second flag.
         */
        this.leapSecond = false;
        /**
         * The excess days.
         */
        this.excessDays = null;
    }

    /**
     *
     * @param {TemporalField} field
     * @return {Number} field value
     */
    getFieldValue0(field) {
        return this.fieldValues.get(field);
    }

    /**
     * Adds a field-value pair to the builder.
     *
     * This adds a field to the builder.
     * If the field is not already present, then the field-value pair is added to the map.
     * If the field is already present and it has the same value as that specified, no action occurs.
     * If the field is already present and it has a different value to that specified, then
     * an exception is thrown.
     *
     * @param {TemporalField} field - the field to add, not null
     * @param {Number} value - the value to add, not null
     * @return {DateTimeBuilder}, this for method chaining
     * @throws DateTimeException if the field is already present with a different value
     */
    _addFieldValue(field, value) {
        requireNonNull(field, 'field');
        const old = this.getFieldValue0(field);  // check first for better error message
        if (old != null && old !== value) {
            throw new DateTimeException(`Conflict found: ${field} ${old} differs from ${field} ${value}: ${this}`);
        }
        return this._putFieldValue0(field, value);
    }

    /**
     * @param {TemporalField} field
     * @param {Number} value
     * @return {DateTimeBuilder}, this for method chaining
     */
    _putFieldValue0(field, value) {
        this.fieldValues.put(field, value);
        return this;
    }

    /**
     * Resolves the builder, evaluating the date and time.
     *
     * This examines the contents of the build.er and resolves it to produce the best
     * available date and time, throwing an exception if a problem occurs.
     * Calling this method changes the state of the builder.
     *
     * @param {ResolverStyle} resolverStyle - how to resolve
     * @param {TemporalField[]} resolverFields
     * @return {DateTimeBuilder} this, for method chaining
     */
    resolve(resolverStyle, resolverFields) {
        if (resolverFields != null) {
            this.fieldValues.retainAll(resolverFields);
        }
        // handle standard fields
        // this._mergeInstantFields();
        this._mergeDate(resolverStyle);
        this._mergeTime(resolverStyle);
        //if (resolveFields(resolverStyle)) {
        //    mergeInstantFields();
        //    mergeDate(resolverStyle);
        //    mergeTime(resolverStyle);
        //}
        this._resolveTimeInferZeroes(resolverStyle);
        //this._crossCheck();
        if (this.excessDays != null && this.excessDays.isZero() === false && this.date != null && this.time != null) {
            this.date = this.date.plus(this.excessDays);
            this.excessDays = Period.ZERO;
        }
        //resolveFractional();
        this._resolveInstant();
        return this;
    }

    /**
     *
     * @param {ResolverStyle} resolverStyle
     * @private
     */
    _mergeDate(resolverStyle) {
        //if (this.chrono instanceof IsoChronology) {
        this._checkDate(IsoChronology.INSTANCE.resolveDate(this.fieldValues, resolverStyle));
        //} else {
        //    if (this.fieldValues.containsKey(ChronoField.EPOCH_DAY)) {
        //        this._checkDate(LocalDate.ofEpochDay(this.fieldValues.remove(ChronoField.EPOCH_DAY)));
        //        return;
        //    }
        //}
    }

    /**
     *
     * @param {LocalDate} date
     * @private
     */
    _checkDate(date) {
        if (date != null) {
            this._addObject(date);
            for (const fieldName in this.fieldValues.keySet()) {
                const field = ChronoField.byName(fieldName);
                if (field) {
                    if (this.fieldValues.get(field) !== undefined) { // undefined if "removed" in EnumMap
                        if (field.isDateBased()) {
                            let val1;
                            try {
                                val1 = date.getLong(field);
                            } catch (ex) {
                                if (ex instanceof DateTimeException) {
                                    continue;
                                } else {
                                    throw ex;
                                }
                            }
                            const val2 = this.fieldValues.get(field);
                            if (val1 !== val2) {
                                throw new DateTimeException(`Conflict found: Field ${field} ${val1} differs from ${field} ${val2} derived from ${date}`);
                            }
                        }
                    }
                }
            }
        }
    }

    /**
     *
     * @param {ResolverStyle} resolverStyle
     * @private
     */
    _mergeTime(resolverStyle) {
        if (this.fieldValues.containsKey(ChronoField.CLOCK_HOUR_OF_DAY)) {
            const ch = this.fieldValues.remove(ChronoField.CLOCK_HOUR_OF_DAY);
            if (resolverStyle !== ResolverStyle.LENIENT) {
                if (resolverStyle === ResolverStyle.SMART && ch === 0) {
                    // ok
                } else {
                    ChronoField.CLOCK_HOUR_OF_DAY.checkValidValue(ch);
                }
            }
            this._addFieldValue(ChronoField.HOUR_OF_DAY, ch === 24 ? 0 : ch);
        }
        if (this.fieldValues.containsKey(ChronoField.CLOCK_HOUR_OF_AMPM)) {
            const ch = this.fieldValues.remove(ChronoField.CLOCK_HOUR_OF_AMPM);
            if (resolverStyle !== ResolverStyle.LENIENT) {
                if (resolverStyle === ResolverStyle.SMART && ch === 0) {
                    // ok
                } else {
                    ChronoField.CLOCK_HOUR_OF_AMPM.checkValidValue(ch);
                }
            }
            this._addFieldValue(ChronoField.HOUR_OF_AMPM, ch === 12 ? 0 : ch);
        }
        if (resolverStyle !== ResolverStyle.LENIENT) {
            if (this.fieldValues.containsKey(ChronoField.AMPM_OF_DAY)) {
                ChronoField.AMPM_OF_DAY.checkValidValue(this.fieldValues.get(ChronoField.AMPM_OF_DAY));
            }
            if (this.fieldValues.containsKey(ChronoField.HOUR_OF_AMPM)) {
                ChronoField.HOUR_OF_AMPM.checkValidValue(this.fieldValues.get(ChronoField.HOUR_OF_AMPM));
            }
        }
        if (this.fieldValues.containsKey(ChronoField.AMPM_OF_DAY) && this.fieldValues.containsKey(ChronoField.HOUR_OF_AMPM)) {
            const ap = this.fieldValues.remove(ChronoField.AMPM_OF_DAY);
            const hap = this.fieldValues.remove(ChronoField.HOUR_OF_AMPM);
            this._addFieldValue(ChronoField.HOUR_OF_DAY, ap * 12 + hap);
        }
        //        if (timeFields.containsKey(HOUR_OF_DAY) && timeFields.containsKey(MINUTE_OF_HOUR)) {
        //            const hod = timeFields.remove(HOUR_OF_DAY);
        //            const moh = timeFields.remove(MINUTE_OF_HOUR);
        //            this._addFieldValue(MINUTE_OF_DAY, hod * 60 + moh);
        //        }
        //        if (timeFields.containsKey(MINUTE_OF_DAY) && timeFields.containsKey(SECOND_OF_MINUTE)) {
        //            const mod = timeFields.remove(MINUTE_OF_DAY);
        //            const som = timeFields.remove(SECOND_OF_MINUTE);
        //            this._addFieldValue(SECOND_OF_DAY, mod * 60 + som);
        //        }
        if (this.fieldValues.containsKey(ChronoField.NANO_OF_DAY)) {
            const nod = this.fieldValues.remove(ChronoField.NANO_OF_DAY);
            if (resolverStyle !== ResolverStyle.LENIENT) {
                ChronoField.NANO_OF_DAY.checkValidValue(nod);
            }
            this._addFieldValue(ChronoField.SECOND_OF_DAY, MathUtil.intDiv(nod, 1000000000));
            this._addFieldValue(ChronoField.NANO_OF_SECOND, MathUtil.intMod(nod, 1000000000));
        }
        if (this.fieldValues.containsKey(ChronoField.MICRO_OF_DAY)) {
            const cod = this.fieldValues.remove(ChronoField.MICRO_OF_DAY);
            if (resolverStyle !== ResolverStyle.LENIENT) {
                ChronoField.MICRO_OF_DAY.checkValidValue(cod);
            }
            this._addFieldValue(ChronoField.SECOND_OF_DAY, MathUtil.intDiv(cod, 1000000));
            this._addFieldValue(ChronoField.MICRO_OF_SECOND, MathUtil.intMod(cod, 1000000));
        }
        if (this.fieldValues.containsKey(ChronoField.MILLI_OF_DAY)) {
            const lod = this.fieldValues.remove(ChronoField.MILLI_OF_DAY);
            if (resolverStyle !== ResolverStyle.LENIENT) {
                ChronoField.MILLI_OF_DAY.checkValidValue(lod);
            }
            this._addFieldValue(ChronoField.SECOND_OF_DAY, MathUtil.intDiv(lod, 1000));
            this._addFieldValue(ChronoField.MILLI_OF_SECOND, MathUtil.intMod(lod, 1000));
        }
        if (this.fieldValues.containsKey(ChronoField.SECOND_OF_DAY)) {
            const sod = this.fieldValues.remove(ChronoField.SECOND_OF_DAY);
            if (resolverStyle !== ResolverStyle.LENIENT) {
                ChronoField.SECOND_OF_DAY.checkValidValue(sod);
            }
            this._addFieldValue(ChronoField.HOUR_OF_DAY, MathUtil.intDiv(sod, 3600));
            this._addFieldValue(ChronoField.MINUTE_OF_HOUR, MathUtil.intMod(MathUtil.intDiv(sod, 60), 60));
            this._addFieldValue(ChronoField.SECOND_OF_MINUTE, MathUtil.intMod(sod, 60));
        }
        if (this.fieldValues.containsKey(ChronoField.MINUTE_OF_DAY)) {
            const mod = this.fieldValues.remove(ChronoField.MINUTE_OF_DAY);
            if (resolverStyle !== ResolverStyle.LENIENT) {
                ChronoField.MINUTE_OF_DAY.checkValidValue(mod);
            }
            this._addFieldValue(ChronoField.HOUR_OF_DAY, MathUtil.intDiv(mod, 60));
            this._addFieldValue(ChronoField.MINUTE_OF_HOUR, MathUtil.intMod(mod, 60));
        }

        //            const sod = MathUtil.intDiv(nod, 1000000000L);
        //            this._addFieldValue(HOUR_OF_DAY, MathUtil.intDiv(sod, 3600));
        //            this._addFieldValue(MINUTE_OF_HOUR, MathUtil.intMod(MathUtil.intDiv(sod, 60), 60));
        //            this._addFieldValue(SECOND_OF_MINUTE, MathUtil.intMod(sod, 60));
        //            this._addFieldValue(NANO_OF_SECOND, MathUtil.intMod(nod, 1000000000L));
        if (resolverStyle !== ResolverStyle.LENIENT) {
            if (this.fieldValues.containsKey(ChronoField.MILLI_OF_SECOND)) {
                ChronoField.MILLI_OF_SECOND.checkValidValue(this.fieldValues.get(ChronoField.MILLI_OF_SECOND));
            }
            if (this.fieldValues.containsKey(ChronoField.MICRO_OF_SECOND)) {
                ChronoField.MICRO_OF_SECOND.checkValidValue(this.fieldValues.get(ChronoField.MICRO_OF_SECOND));
            }
        }
        if (this.fieldValues.containsKey(ChronoField.MILLI_OF_SECOND) && this.fieldValues.containsKey(ChronoField.MICRO_OF_SECOND)) {
            const los = this.fieldValues.remove(ChronoField.MILLI_OF_SECOND);
            const cos = this.fieldValues.get(ChronoField.MICRO_OF_SECOND);
            this._putFieldValue0(ChronoField.MICRO_OF_SECOND, los * 1000 + (MathUtil.intMod(cos, 1000)));
        }
        if (this.fieldValues.containsKey(ChronoField.MICRO_OF_SECOND) && this.fieldValues.containsKey(ChronoField.NANO_OF_SECOND)) {
            const nos = this.fieldValues.get(ChronoField.NANO_OF_SECOND);
            this._putFieldValue0(ChronoField.MICRO_OF_SECOND, MathUtil.intDiv(nos, 1000));
            this.fieldValues.remove(ChronoField.MICRO_OF_SECOND);
        }
        if (this.fieldValues.containsKey(ChronoField.MILLI_OF_SECOND) && this.fieldValues.containsKey(ChronoField.NANO_OF_SECOND)) {
            const nos = this.fieldValues.get(ChronoField.NANO_OF_SECOND);
            this._putFieldValue0(ChronoField.MILLI_OF_SECOND, MathUtil.intDiv(nos, 1000000));
            this.fieldValues.remove(ChronoField.MILLI_OF_SECOND);
        }
        if (this.fieldValues.containsKey(ChronoField.MICRO_OF_SECOND)) {
            const cos = this.fieldValues.remove(ChronoField.MICRO_OF_SECOND);
            this._putFieldValue0(ChronoField.NANO_OF_SECOND, cos * 1000);
        } else if (this.fieldValues.containsKey(ChronoField.MILLI_OF_SECOND)) {
            const los = this.fieldValues.remove(ChronoField.MILLI_OF_SECOND);
            this._putFieldValue0(ChronoField.NANO_OF_SECOND, los * 1000000);
        }
    }

    /**
     *
     * @param {ResolverStyle} resolverStyle
     * @private
     */
    _resolveTimeInferZeroes(resolverStyle) {
        let hod =  this.fieldValues.get(ChronoField.HOUR_OF_DAY);
        const moh =  this.fieldValues.get(ChronoField.MINUTE_OF_HOUR);
        const som =  this.fieldValues.get(ChronoField.SECOND_OF_MINUTE);
        let nos =  this.fieldValues.get(ChronoField.NANO_OF_SECOND);
        if (hod == null) {
            return;
        }
        if (moh == null && (som != null || nos != null)) {
            return;
        }
        if (moh != null && som == null && nos != null) {
            return;
        }
        if (resolverStyle !== ResolverStyle.LENIENT) {
            if (hod != null) {
                if (resolverStyle === ResolverStyle.SMART &&
                                hod === 24 &&
                                (moh == null || moh === 0) &&
                                (som == null || som === 0) &&
                                (nos == null || nos === 0)) {
                    hod = 0;
                    this.excessDays = Period.ofDays(1);
                }
                const hodVal = ChronoField.HOUR_OF_DAY.checkValidIntValue(hod);
                if (moh != null) {
                    const mohVal = ChronoField.MINUTE_OF_HOUR.checkValidIntValue(moh);
                    if (som != null) {
                        const somVal = ChronoField.SECOND_OF_MINUTE.checkValidIntValue(som);
                        if (nos != null) {
                            const nosVal = ChronoField.NANO_OF_SECOND.checkValidIntValue(nos);
                            this._addObject(LocalTime.of(hodVal, mohVal, somVal, nosVal));
                        } else {
                            this._addObject(LocalTime.of(hodVal, mohVal, somVal));
                        }
                    } else {
                        if (nos == null) {
                            this._addObject(LocalTime.of(hodVal, mohVal));
                        }
                    }
                } else {
                    if (som == null && nos == null) {
                        this._addObject(LocalTime.of(hodVal, 0));
                    }
                }
            }
        } else {
            if (hod != null) {
                let hodVal = hod;
                if (moh != null) {
                    if (som != null) {
                        if (nos == null) {
                            nos = 0;
                        }
                        let totalNanos = MathUtil.safeMultiply(hodVal, 3600000000000);
                        totalNanos = MathUtil.safeAdd(totalNanos, MathUtil.safeMultiply(moh, 60000000000));
                        totalNanos = MathUtil.safeAdd(totalNanos, MathUtil.safeMultiply(som, 1000000000));
                        totalNanos = MathUtil.safeAdd(totalNanos, nos);
                        const excessDays =  MathUtil.floorDiv(totalNanos, 86400000000000);  // safe int cast
                        const nod = MathUtil.floorMod(totalNanos, 86400000000000);
                        this._addObject(LocalTime.ofNanoOfDay(nod));
                        this.excessDays = Period.ofDays(excessDays);
                    } else {
                        let totalSecs = MathUtil.safeMultiply(hodVal, 3600);
                        totalSecs = MathUtil.safeAdd(totalSecs, MathUtil.safeMultiply(moh, 60));
                        const excessDays =  MathUtil.floorDiv(totalSecs, 86400);  // safe int cast
                        const sod = MathUtil.floorMod(totalSecs, 86400);
                        this._addObject(LocalTime.ofSecondOfDay(sod));
                        this.excessDays = Period.ofDays(excessDays);
                    }
                } else {
                    const excessDays = MathUtil.safeToInt(MathUtil.floorDiv(hodVal, 24));
                    hodVal = MathUtil.floorMod(hodVal, 24);
                    this._addObject(LocalTime.of(hodVal, 0));
                    this.excessDays = Period.ofDays(excessDays);
                }
            }
        }
        this.fieldValues.remove(ChronoField.HOUR_OF_DAY);
        this.fieldValues.remove(ChronoField.MINUTE_OF_HOUR);
        this.fieldValues.remove(ChronoField.SECOND_OF_MINUTE);
        this.fieldValues.remove(ChronoField.NANO_OF_SECOND);
    }

    /**
     *
     * @param {ChronoLocalDate|LocalTime} dateOrTime
     * @private
     */
    _addObject(dateOrTime) {
        if (dateOrTime instanceof ChronoLocalDate){
            this.date = dateOrTime;
        } else if (dateOrTime instanceof LocalTime){
            this.time = dateOrTime;
        }
    }

    _resolveInstant() {
        if (this.date != null && this.time != null) {
            const offsetSecs = this.fieldValues.get(ChronoField.OFFSET_SECONDS);
            if (offsetSecs != null) {
                const offset = ZoneOffset.ofTotalSeconds(offsetSecs);
                const instant = this.date.atTime(this.time).atZone(offset).getLong(ChronoField.INSTANT_SECONDS);
                this.fieldValues.put(ChronoField.INSTANT_SECONDS, instant);
            } else if (this.zone != null) {
                const instant = this.date.atTime(this.time).atZone(this.zone).getLong(ChronoField.INSTANT_SECONDS);
                this.fieldValues.put(ChronoField.INSTANT_SECONDS, instant);
            }
        }
    }

    /**
     * Builds the specified type from the values in this builder.
     *
     * This attempts to build the specified type from this builder.
     * If the builder cannot return the type, an exception is thrown.
     *
     * @param {!TemporalQuery} type - the type to invoke `from` on, not null
     * @return {*} the extracted value, not null
     * @throws DateTimeException if an error occurs
     */
    build(type) {
        return type.queryFrom(this);
    }

    /**
     *
     * @param {TemporalField} field
     * @returns {number}
     */
    isSupported(field) {
        if (field == null) {
            return false;
        }
        return (this.fieldValues.containsKey(field) && this.fieldValues.get(field) !== undefined) ||
                (this.date != null && this.date.isSupported(field)) ||
                (this.time != null && this.time.isSupported(field));
    }

    /**
     *
     * @param {TemporalField} field
     * @returns {number}
     */
    getLong(field) {
        requireNonNull(field, 'field');
        const value = this.getFieldValue0(field);
        if (value == null) {
            if (this.date != null && this.date.isSupported(field)) {
                return this.date.getLong(field);
            }
            if (this.time != null && this.time.isSupported(field)) {
                return this.time.getLong(field);
            }
            throw new DateTimeException(`Field not found: ${field}`);
        }
        return value;
    }

    /**
     *
     * @param {!TemporalQuery} query
     * @returns {*}
     */
    query(query) {
        if (query === TemporalQueries.zoneId()) {
            return this.zone;
        } else if (query === TemporalQueries.chronology()) {
            return this.chrono;
        } else if (query === TemporalQueries.localDate()) {
            return this.date != null ? LocalDate.from(this.date) : null;
        } else if (query === TemporalQueries.localTime()) {
            return this.time;
        } else if (query === TemporalQueries.zone() || query === TemporalQueries.offset()) {
            return query.queryFrom(this);
        } else if (query === TemporalQueries.precision()) {
            return null;  // not a complete date/time
        }
        // inline TemporalAccessor.super.query(query) as an optimization
        // non-JDK classes are not permitted to make this optimization
        return query.queryFrom(this);
    }

}
/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { assert, requireNonNull } from '../assert';

import { DateTimeParseException, NullPointerException } from '../errors';

import { Period } from '../Period';

import { ParsePosition } from './ParsePosition';
import { DateTimeBuilder } from './DateTimeBuilder';
import { DateTimeParseContext } from './DateTimeParseContext';
import { DateTimePrintContext } from './DateTimePrintContext';
import { DateTimeFormatterBuilder } from './DateTimeFormatterBuilder';
import { SignStyle } from './SignStyle';
import { StringBuilder } from './StringBuilder';
import { ResolverStyle } from './ResolverStyle';

import { IsoChronology } from '../chrono/IsoChronology';
import { ChronoField } from '../temporal/ChronoField';
import { createTemporalQuery } from '../temporal/TemporalQuery';

/**
 *
 * ### Static properties of Class {@link DateTimeFormatter}
 *
 * DateTimeFormatter.ISO_LOCAL_DATE
 *
 * DateTimeFormatter.ISO_LOCAL_TIME
 *
 * DateTimeFormatter.ISO_LOCAL_DATE_TIME
 *
 */
export class DateTimeFormatter {

    //-----------------------------------------------------------------------
    /**
     * A query that provides access to the excess days that were parsed.
     *
     * This returns a singleton {@link TemporalQuery} that provides
     * access to additional information from the parse. The query always returns
     * a non-null period, with a zero period returned instead of null.
     *
     * There are two situations where this query may return a non-zero period.
     *
     * * If the {@link ResolverStyle} is {@link LENIENT} and a time is parsed
     *   without a date, then the complete result of the parse consists of a
     *   {@link LocalTime} and an excess {@link Period} in days.
     * * If the {@link ResolverStyle} is {@link SMART} and a time is parsed
     *   without a date where the time is 24:00:00, then the complete result of
     *   the parse consists of a {@link LocalTime} of 00:00:00 and an excess
     *   {@link Period} of one day.
     *
     * In both cases, if a complete {@link ChronoLocalDateTime} or {@link Instant}
     * is parsed, then the excess days are added to the date part.
     * As a result, this query will return a zero period.
     *
     * The {@link SMART} behaviour handles the common "end of day" 24:00 value.
     * Processing in {@link LENIENT} mode also produces the same result:
     * <pre>
     *  Text to parse        Parsed object                         Excess days
     *  "2012-12-03T00:00"   LocalDateTime.of(2012, 12, 3, 0, 0)   ZERO
     *  "2012-12-03T24:00"   LocalDateTime.of(2012, 12, 4, 0, 0)   ZERO
     *  "00:00"              LocalTime.of(0, 0)                    ZERO
     *  "24:00"              LocalTime.of(0, 0)                    Period.ofDays(1)
     * </pre>
     * The query can be used as follows:
     * <pre>
     *  TemporalAccessor parsed = formatter.parse(str);
     *  LocalTime time = parsed.query(LocalTime.FROM);
     *  Period extraDays = parsed.query(DateTimeFormatter.parsedExcessDays());
     * </pre>
     * @return {TemporalQuery} a query that provides access to the excess days that were parsed
     */
    static parsedExcessDays() {
        return DateTimeFormatter.PARSED_EXCESS_DAYS;
    }

    /**
     * A query that provides access to whether a leap-second was parsed.
     *
     * This returns a singleton {@link TemporalQuery} that provides
     * access to additional information from the parse. The query always returns
     * a non-null boolean, true if parsing saw a leap-second, false if not.
     *
     * Instant parsing handles the special "leap second" time of '23:59:60'.
     * Leap seconds occur at '23:59:60' in the UTC time-zone, but at other
     * local times in different time-zones. To avoid this potential ambiguity,
     * the handling of leap-seconds is limited to
     * {@link DateTimeFormatterBuilder#appendInstant}, as that method
     * always parses the instant with the UTC zone offset.
     *
     * If the time '23:59:60' is received, then a simple conversion is applied,
     * replacing the second-of-minute of 60 with 59. This query can be used
     * on the parse result to determine if the leap-second adjustment was made.
     * The query will return one second of excess if it did adjust to remove
     * the leap-second, and zero if not. Note that applying a leap-second
     * smoothing mechanism, such as UTC-SLS, is the responsibility of the
     * application, as follows:
     * <pre>
     *  TemporalAccessor parsed = formatter.parse(str);
     *  Instant instant = parsed.query(Instant::from);
     *  if (parsed.query(DateTimeFormatter.parsedLeapSecond())) {
     *    // validate leap-second is correct and apply correct smoothing
     *  }
     * </pre>
     * @return a query that provides access to whether a leap-second was parsed
     */
    static parsedLeapSecond() {
        return DateTimeFormatter.PARSED_LEAP_SECOND;
    }

    /**
     * Creates a formatter using the specified pattern.
     *
     * This method will create a formatter based on a simple pattern of letters and symbols.
     *
     * The returned formatter will use the default locale, but this can be changed
     * using {@link DateTimeFormatter.withLocale}.
     *
     * All letters 'A' to 'Z' and 'a' to 'z' are reserved as pattern letters.
     * The following pattern letters are defined:
     * <pre>
     *  |Symbol  |Meaning                     |Presentation      |Examples
     *  |--------|----------------------------|------------------|----------------------------------------------------
     *  | G      | era                        | number/text      | 1; 01; AD; Anno Domini
     *  | u      | year                       | year             | 2004; 04
     *  | y      | year-of-era                | year             | 2004; 04
     *  | D      | day-of-year                | number           | 189
     *  | M      | month-of-year              | number/text      | 7; 07; Jul; July; J
     *  | d      | day-of-month               | number           | 10
     *  |        |                            |                  |
     *  | Q      | quarter-of-year            | number/text      | 3; 03; Q3
     *  | Y      | week-based-year            | year             | 1996; 96
     *  | w      | week-of-year               | number           | 27
     *  | W      | week-of-month              | number           | 27
     *  | e      | localized day-of-week      | number           | 2; Tue; Tuesday; T
     *  | E      | day-of-week                | number/text      | 2; Tue; Tuesday; T
     *  | F      | week-of-month              | number           | 3
     *  |        |                            |                  |
     *  | a      | am-pm-of-day               | text             | PM
     *  | h      | clock-hour-of-am-pm (1-12) | number           | 12
     *  | K      | hour-of-am-pm (0-11)       | number           | 0
     *  | k      | clock-hour-of-am-pm (1-24) | number           | 0
     *  |        |                            |                  |
     *  | H      | hour-of-day (0-23)         | number           | 0
     *  | m      | minute-of-hour             | number           | 30
     *  | s      | second-of-minute           | number           | 55
     *  | S      | fraction-of-second         | fraction         | 978
     *  | A      | milli-of-day               | number           | 1234
     *  | n      | nano-of-second             | number           | 987654321
     *  | N      | nano-of-day                | number           | 1234000000
     *  |        |                            |                  |
     *  | V      | time-zone ID               | zone-id          | America/Los_Angeles; Z; -08:30
     *  | z      | time-zone name             | zone-name        | Pacific Standard Time; PST
     *  | X      | zone-offset 'Z' for zero   | offset-X         | Z; -08; -0830; -08:30; -083015; -08:30:15;
     *  | x      | zone-offset                | offset-x         | +0000; -08; -0830; -08:30; -083015; -08:30:15;
     *  | Z      | zone-offset                | offset-Z         | +0000; -0800; -08:00;
     *  |        |                            |                  |
     *  | p      | pad next                   | pad modifier     | 1
     *  |        |                            |                  |
     *  | '      | escape for text            | delimiter        |
     *  | ''     | single quote               | literal          | '
     *  | [      | optional section start     |                  |
     *  | ]      | optional section end       |                  |
     *  | {}     | reserved for future use    |                  |
     * </pre>
     *
     * The count of pattern letters determine the format.
     *
     * **Text**: The text style is determined based on the number of pattern letters used.
     * Less than 4 pattern letters will use the short form `TextStyle.SHORT`.
     * Exactly 4 pattern letters will use the full form `TextStyle.FULL`.
     * Exactly 5 pattern letters will use the narrow form `TextStyle.NARROW`.
     *
     * **NOTE**: since text styles require locale support, they are currently not supported in js-joda!
     *
     * **Number**: If the count of letters is one, then the value is printed using the minimum number
     * of digits and without padding as per {@link DateTimeFormatterBuilder.appendValue}.
     * Otherwise, the count of digits is used as the width of the output field as per
     * {@link DateTimeFormatterBuilder.appendValue}.
     *
     * **Number/Text**: If the count of pattern letters is 3 or greater, use the Text rules above.
     * Otherwise use the Number rules above.
     *
     * **Fraction**: Outputs the nano-of-second field as a fraction-of-second.
     * The nano-of-second value has nine digits, thus the count of pattern letters is from 1 to 9.
     * If it is less than 9, then the nano-of-second value is truncated, with only the most
     * significant digits being output.
     * When parsing in strict mode, the number of parsed digits must match the count of pattern letters.
     * When parsing in lenient mode, the number of parsed digits must be at least the count of pattern
     * letters, up to 9 digits.
     *
     * **Year**: The count of letters determines the minimum field width below which padding is used.
     * If the count of letters is two, then a {@link DateTimeFormatterBuilder.appendValueReduced}
     * two digit form is used.
     * For printing, this outputs the rightmost two digits. For parsing, this will parse using the
     * base value of 2000, resulting in a year within the range 2000 to 2099 inclusive.
     * If the count of letters is less than four (but not two), then the sign is only output for negative
     * years as per `SignStyle.NORMAL`.
     * Otherwise, the sign is output if the pad width is exceeded, as per `SignStyle.EXCEEDS_PAD`
     *
     * **ZoneId**: This outputs the time-zone ID, such as 'Europe/Paris'.
     * If the count of letters is two, then the time-zone ID is output.
     * Any other count of letters throws `IllegalArgumentException`.
     *
     * **Zone names**: This outputs the display name of the time-zone ID.
     * If the count of letters is one, two or three, then the short name is output.
     * If the count of letters is four, then the full name is output.
     * Five or more letters throws `IllegalArgumentException`.
     *
     * **NOTE**: since zone ids and name require the iana tzdb, they are currently not supported in js-joda!
     *
     * **Offset X and x**: This formats the offset based on the number of pattern letters.
     * One letter outputs just the hour', such as '+01', unless the minute is non-zero
     * in which case the minute is also output, such as '+0130'.
     * Two letters outputs the hour and minute, without a colon, such as '+0130'.
     * Three letters outputs the hour and minute, with a colon, such as '+01:30'.
     * Four letters outputs the hour and minute and optional second, without a colon, such as '+013015'.
     * Five letters outputs the hour and minute and optional second, with a colon, such as '+01:30:15'.
     * Six or more letters throws `IllegalArgumentException`.
     * Pattern letter 'X' (upper case) will output 'Z' when the offset to be output would be zero,
     * whereas pattern letter 'x' (lower case) will output '+00', '+0000', or '+00:00'.
     *
     * **Offset Z**: This formats the offset based on the number of pattern letters.
     * One, two or three letters outputs the hour and minute, without a colon, such as '+0130'.
     * Four or more letters throws `IllegalArgumentException`.
     * The output will be '+0000' when the offset is zero.
     *
     * **Optional section**: The optional section markers work exactly like calling
     * {@link DateTimeFormatterBuilder.optionalStart} and {@link DateTimeFormatterBuilder.optionalEnd}.
     *
     * **Pad modifier**: Modifies the pattern that immediately follows to be padded with spaces.
     * The pad width is determined by the number of pattern letters.
     * This is the same as calling {@link DateTimeFormatterBuilder.padNext}.
     *
     * For example, 'ppH' outputs the hour-of-day padded on the left with spaces to a width of 2.
     *
     * Any unrecognized letter is an error.
     * Any non-letter character, other than '[', ']', '{', '}' and the single quote will be output directly.
     * Despite this, it is recommended to use single quotes around all characters that you want to
     * output directly to ensure that future changes do not break your application.
     *
     * @param {String} pattern  the pattern to use, not null
     * @return {DateTimeFormatter} the formatter based on the pattern, not null
     * @throws IllegalArgumentException if the pattern is invalid
     * @see DateTimeFormatterBuilder#appendPattern(String)
     * @example
     * var s = LocalDate.parse('2016-04-01').format(DateTimeFormatter.ofPattern('d MM yyyy'));
     * console.log(s); // '1 04 2016'
     *
     */
    static ofPattern(pattern) {
        return new DateTimeFormatterBuilder().appendPattern(pattern).toFormatter();
    }


    //-----------------------------------------------------------------------
    /**
     * Constructor.
     *
     * @param printerParser  the printer/parser to use, not null
     * @param locale  the locale to use, not null
     * @param decimalStyle  the decimal style to use, not null
     * @param resolverStyle  the resolver style to use, not null
     * @param resolverFields  the fields to use during resolving, null for all fields
     * @param chrono  the chronology to use, null for no override
     * @param zone  the zone to use, null for no override
     * @private
     */
    constructor(printerParser, locale, decimalStyle, resolverStyle, resolverFields, chrono=IsoChronology.INSTANCE, zone) {
        assert(printerParser != null);
        assert(decimalStyle != null);
        assert(resolverStyle != null);
        /**
         * The printer and/or parser to use, not null.
         */
        this._printerParser = printerParser;
        /**
         * The locale to use for formatting. // nyi
         */
        this._locale = locale;
        /**
         * The symbols to use for formatting, not null.
         */
        this._decimalStyle = decimalStyle;
        /**
         * The resolver style to use, not null.
         */
        this._resolverStyle = resolverStyle;
        /**
         * The fields to use in resolving, null for all fields.
         */
        this._resolverFields = resolverFields;
        /**
         * The chronology to use for formatting, null for no override.
         */
        this._chrono = chrono;
        /**
         * The zone to use for formatting, null for no override. // nyi
         */
        this._zone = zone;
    }

    locale() {
        return this._locale;
    }

    decimalStyle() {
        return this._decimalStyle;
    }

    chronology() {
        return this._chrono;
    }

    /**
     * Returns a copy of this formatter with a new override chronology.
     *
     * This returns a formatter with similar state to this formatter but
     * with the override chronology set.
     * By default, a formatter has no override chronology, returning null.
     *
     * If an override is added, then any date that is printed or parsed will be affected.
     *
     * When printing, if the {@link Temporal} object contains a date then it will
     * be converted to a date in the override chronology.
     * Any time or zone will be retained unless overridden.
     * The converted result will behave in a manner equivalent to an implementation
     * of {@link ChronoLocalDate},{@link ChronoLocalDateTime} or {@link ChronoZonedDateTime}.
     *
     * When parsing, the override chronology will be used to interpret the
     * {@link ChronoField} into a date unless the
     * formatter directly parses a valid chronology.
     *
     * This instance is immutable and unaffected by this method call.
     *
     * @param chrono  the new chronology, not null
     * @return a formatter based on this formatter with the requested override chronology, not null
     */
    withChronology(chrono) {
        if (this._chrono != null && this._chrono.equals(chrono)) {
            return this;
        }
        return new DateTimeFormatter(this._printerParser, this._locale, this._decimalStyle,
            this._resolverStyle, this._resolverFields, chrono, this._zone);
    }

    /**
     * not yet supported
     * @returns {DateTimeFormatter}
     */
    withLocale(){
        return this;
    }

    /**
     * Returns a copy of this formatter with a new resolver style.
     * <p>
     * This returns a formatter with similar state to this formatter but
     * with the resolver style set. By default, a formatter has the
     * {@link ResolverStyle#SMART SMART} resolver style.
     * <p>
     * Changing the resolver style only has an effect during parsing.
     * Parsing a text string occurs in two phases.
     * Phase 1 is a basic text parse according to the fields added to the builder.
     * Phase 2 resolves the parsed field-value pairs into date and/or time objects.
     * The resolver style is used to control how phase 2, resolving, happens.
     * See {@link ResolverStyle} for more information on the options available.
     * <p>
     * This instance is immutable and unaffected by this method call.
     *
     * @param {ResolverStyle} resolverStyle  the new resolver style, not null
     * @return {DateTimeFormatter} a formatter based on this formatter with the requested resolver style, not null
     */
    withResolverStyle(resolverStyle) {
        requireNonNull(resolverStyle, 'resolverStyle');
        if (resolverStyle.equals(this._resolverStyle)) {
            return this;
        }
        return new DateTimeFormatter(this._printerParser, this._locale, this._decimalStyle, resolverStyle, this._resolverFields, this._chrono, this._zone);
    }
    //-----------------------------------------------------------------------
    /**
     * Formats a date-time object using this formatter.
     *
     * This formats the date-time to a String using the rules of the formatter.
     *
     * @param {TemporalAccessor} temporal  the temporal object to print, not null
     * @return {String} the printed string, not null
     * @throws DateTimeException if an error occurs during formatting
     */
    format(temporal) {
        const buf = new StringBuilder(32);
        this._formatTo(temporal, buf);
        return buf.toString();
    }

    //-----------------------------------------------------------------------
    /**
     * Formats a date-time object to an {@link Appendable} using this formatter.
     *
     * This formats the date-time to the specified destination.
     * {@link Appendable} is a general purpose interface that is implemented by all
     * key character output classes including {@link StringBuffer}, {@link StringBuilder},
     * {@link PrintStream} and {@link Writer}.
     *
     * Although {@link Appendable} methods throw an {@link IOException}, this method does not.
     * Instead, any {@link IOException} is wrapped in a runtime exception.
     *
     * @param {TemporalAccessor} temporal - the temporal object to print, not null
     * @param {StringBuilder} appendable - the appendable to print to, not null
     * @throws DateTimeException if an error occurs during formatting
     */
    _formatTo(temporal, appendable) {
        requireNonNull(temporal, 'temporal');
        requireNonNull(appendable, 'appendable');
        const context = new DateTimePrintContext(temporal, this);
        this._printerParser.print(context, appendable);
    }

    /**
     * function overloading for {@link DateTimeFormatter.parse}
     *
     * if called with one arg {@link DateTimeFormatter.parse1} is called
     * otherwise {@link DateTimeFormatter.parse2}
     *
     * @param {string} text
     * @param {TemporalQuery} type
     * @return {TemporalAccessor}
     */
    parse(text, type){
        if(arguments.length === 1){
            return this.parse1(text);
        } else {
            return this.parse2(text, type);
        }
    }

    /**
     * Fully parses the text producing a temporal object.
     *
     * This parses the entire text producing a temporal object.
     * It is typically more useful to use {@link parse}.
     * The result of this method is {@link TemporalAccessor} which has been resolved,
     * applying basic validation checks to help ensure a valid date-time.
     *
     * If the parse completes without reading the entire length of the text,
     * or a problem occurs during parsing or merging, then an exception is thrown.
     *
     * @param {String} text  the text to parse, not null
     * @return {TemporalAccessor} the parsed temporal object, not null
     * @throws DateTimeParseException if unable to parse the requested result
     */
    parse1(text) {
        requireNonNull(text, 'text');
        try {
            return this._parseToBuilder(text, null).resolve(this._resolverStyle, this._resolverFields);
        } catch (ex) {
            if(ex instanceof DateTimeParseException){
                throw ex;
            } else {
                throw this._createError(text, ex);
            }
        }
    }

    /**
     * Fully parses the text producing a temporal object.
     *
     * This parses the entire text producing a temporal object.
     * It is typically more useful to use {@link parse}.
     * The result of this method is {@link TemporalAccessor} which has been resolved,
     * applying basic validation checks to help ensure a valid date-time.
     *
     * If the parse completes without reading the entire length of the text,
     * or a problem occurs during parsing or merging, then an exception is thrown.
     *
     * @param text  the text to parse, not null
     * @param type the type to extract, not null
 * @return the parsed temporal object, not null
     * @throws DateTimeParseException if unable to parse the requested result
     */
    parse2(text, type) {
        requireNonNull(text, 'text');
        requireNonNull(type, 'type');
        try {
            const builder = this._parseToBuilder(text, null).resolve(this._resolverStyle, this._resolverFields);
            return builder.build(type);
        } catch (ex) {
            if(ex instanceof DateTimeParseException){
                throw ex;
            } else {
                throw this._createError(text, ex);
            }
        }
    }

    _createError(text, ex) {
        let abbr = '';
        if (text.length > 64) {
            abbr = `${text.substring(0, 64)}...`;
        } else {
            abbr = text;
        }
        return new DateTimeParseException(`Text '${abbr}' could not be parsed: ${ex.message}`, text, 0, ex);
    }


    /**
     * Parses the text to a builder.
     *
     * This parses to a {@link DateTimeBuilder} ensuring that the text is fully parsed.
     * This method throws {@link DateTimeParseException} if unable to parse, or
     * some other {@link DateTimeException} if another date/time problem occurs.
     *
     * @param text  the text to parse, not null
     * @param position  the position to parse from, updated with length parsed
     *  and the index of any error, null if parsing whole string
     * @return the engine representing the result of the parse, not null
     * @throws DateTimeParseException if the parse fails
     */
    _parseToBuilder(text, position) {
        const pos = (position != null ? position : new ParsePosition(0));
        const result = this._parseUnresolved0(text, pos);
        if (result == null || pos.getErrorIndex() >= 0 || (position == null && pos.getIndex() < text.length)) {
            let abbr = '';
            if (text.length > 64) {
                abbr = `${text.substr(0, 64).toString()}...`;
            } else {
                abbr = text;
            }
            if (pos.getErrorIndex() >= 0) {
                throw new DateTimeParseException(`Text '${abbr}' could not be parsed at index ${ 
                    pos.getErrorIndex()}`, text, pos.getErrorIndex());
            } else {
                throw new DateTimeParseException(`Text '${abbr}' could not be parsed, unparsed text found at index ${ 
                    pos.getIndex()}`, text, pos.getIndex());
            }
        }
        return result.toBuilder();
    }

    /**
     * Parses the text using this formatter, without resolving the result, intended
     * for advanced use cases.
     *
     * Parsing is implemented as a two-phase operation.
     * First, the text is parsed using the layout defined by the formatter, producing
     * a {@link Map} of field to value, a {@link ZoneId} and a {@link Chronology}.
     * Second, the parsed data is *resolved*, by validating, combining and
     * simplifying the various fields into more useful ones.
     * This method performs the parsing stage but not the resolving stage.
     *
     * The result of this method is {@link TemporalAccessor} which represents the
     * data as seen in the input. Values are not validated, thus parsing a date string
     * of '2012-00-65' would result in a temporal with three fields - year of '2012',
     * month of '0' and day-of-month of '65'.
     *
     * The text will be parsed from the specified start {@link ParsePosition}.
     * The entire length of the text does not have to be parsed, the {@link ParsePosition}
     * will be updated with the index at the end of parsing.
     *
     * Errors are returned using the error index field of the {@link ParsePosition}
     * instead of {@link DateTimeParseException}.
     * The returned error index will be set to an index indicative of the error.
     * Callers must check for errors before using the context.
     *
     * If the formatter parses the same field more than once with different values,
     * the result will be an error.
     *
     * This method is intended for advanced use cases that need access to the
     * internal state during parsing. Typical application code should use
     * {@link parse} or the parse method on the target type.
     *
     * @param text  the text to parse, not null
     * @param position  the position to parse from, updated with length parsed
     *  and the index of any error, not null
     * @return the parsed text, null if the parse results in an error
     * @throws DateTimeException if some problem occurs during parsing
     * @throws IndexOutOfBoundsException if the position is invalid
     */
    parseUnresolved(text, position) {
        return this._parseUnresolved0(text, position);
    }

    _parseUnresolved0(text, position) {
        assert(text != null, 'text', NullPointerException);
        assert(position != null, 'position', NullPointerException);
        const context = new DateTimeParseContext(this);
        let pos = position.getIndex();
        pos = this._printerParser.parse(context, text, pos);
        if (pos < 0) {
            position.setErrorIndex(~pos);  // index not updated from input
            return null;
        }
        position.setIndex(pos);  // errorIndex not updated from input
        return context.toParsed();
    }

    /**
     * Returns the formatter as a composite printer parser.
     *
     * @param {boolean} optional  whether the printer/parser should be optional
     * @return {CompositePrinterParser} the printer/parser, not null
     */
    _toPrinterParser(optional) {
        return this._printerParser.withOptional(optional);
    }

    /**
     *
     * @returns {string}
     */
    toString() {
        const pattern = this._printerParser.toString();
        return pattern.indexOf('[') === 0 ? pattern : pattern.substring(1, pattern.length - 1);
    }

}

export function _init() {

    DateTimeFormatter.ISO_LOCAL_DATE = new DateTimeFormatterBuilder()
        .appendValue(ChronoField.YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
        .appendLiteral('-')
        .appendValue(ChronoField.MONTH_OF_YEAR, 2)
        .appendLiteral('-')
        .appendValue(ChronoField.DAY_OF_MONTH, 2)
        .toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);

    DateTimeFormatter.ISO_LOCAL_TIME = new DateTimeFormatterBuilder()
        .appendValue(ChronoField.HOUR_OF_DAY, 2)
        .appendLiteral(':')
        .appendValue(ChronoField.MINUTE_OF_HOUR, 2)
        .optionalStart()
        .appendLiteral(':')
        .appendValue(ChronoField.SECOND_OF_MINUTE, 2)
        .optionalStart()
        .appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true)
        .toFormatter(ResolverStyle.STRICT);

    DateTimeFormatter.ISO_LOCAL_DATE_TIME = new DateTimeFormatterBuilder()
        .parseCaseInsensitive()
        .append(DateTimeFormatter.ISO_LOCAL_DATE)
        .appendLiteral('T')
        .append(DateTimeFormatter.ISO_LOCAL_TIME)
        .toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);

    DateTimeFormatter.ISO_INSTANT = new DateTimeFormatterBuilder()
        .parseCaseInsensitive()
        .appendInstant()
        .toFormatter(ResolverStyle.STRICT);

    DateTimeFormatter.ISO_OFFSET_DATE_TIME = new DateTimeFormatterBuilder()
        .parseCaseInsensitive()
        .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
        .appendOffsetId()
        .toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);

    DateTimeFormatter.ISO_ZONED_DATE_TIME = new DateTimeFormatterBuilder()
        .append(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
        .optionalStart()
        .appendLiteral('[')
        .parseCaseSensitive()
        .appendZoneId()
        // .appendZoneRegionId()
        .appendLiteral(']')
        .toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);

    DateTimeFormatter.BASIC_ISO_DATE = new DateTimeFormatterBuilder()
        .appendValue(ChronoField.YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
        .appendValue(ChronoField.MONTH_OF_YEAR, 2)
        .appendValue(ChronoField.DAY_OF_MONTH, 2)
        .toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);

    DateTimeFormatter.ISO_OFFSET_DATE = new DateTimeFormatterBuilder()
        .parseCaseInsensitive()
        .append(DateTimeFormatter.ISO_LOCAL_DATE)
        .appendOffsetId()
        .toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);

    DateTimeFormatter.ISO_OFFSET_TIME = new DateTimeFormatterBuilder()
        .parseCaseInsensitive()
        .append(DateTimeFormatter.ISO_LOCAL_TIME)
        .appendOffsetId()
        .toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);

    DateTimeFormatter.ISO_ORDINAL_DATE = new DateTimeFormatterBuilder()
        .appendValue(ChronoField.YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
        .appendLiteral('-')
        .appendValue(ChronoField.DAY_OF_YEAR)
        .toFormatter(ResolverStyle.STRICT);

    DateTimeFormatter.ISO_WEEK_DATE = new DateTimeFormatterBuilder()
        .appendValue(ChronoField.YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
        .appendLiteral('-W')
        .appendValue(ChronoField.ALIGNED_WEEK_OF_YEAR)
        .appendLiteral('-')
        .appendValue(ChronoField.DAY_OF_WEEK)
        .toFormatter(ResolverStyle.STRICT);

    DateTimeFormatter.ISO_DATE = new DateTimeFormatterBuilder()
        .parseCaseInsensitive()
        .append(DateTimeFormatter.ISO_LOCAL_DATE)
        .optionalStart()
        .appendOffsetId()
        .optionalEnd()
        .toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);

    DateTimeFormatter.ISO_TIME = new DateTimeFormatterBuilder()
        .parseCaseInsensitive()
        .append(DateTimeFormatter.ISO_LOCAL_TIME)
        .optionalStart()
        .appendOffsetId()
        .optionalEnd()
        .toFormatter(ResolverStyle.STRICT);

    DateTimeFormatter.ISO_DATE_TIME = new DateTimeFormatterBuilder()
        .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
        .optionalStart()
        .appendOffsetId()
        .optionalEnd()
        .toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);

    // TODO:
    //  RFC_1123_DATE_TIME - https://www.threeten.org/threetenbp/apidocs/org/threeten/bp/format/DateTimeFormatter.html#RFC_1123_DATE_TIME

    DateTimeFormatter.PARSED_EXCESS_DAYS = createTemporalQuery('PARSED_EXCESS_DAYS', (temporal) => {
        if (temporal instanceof DateTimeBuilder) {
            return temporal.excessDays;
        } else {
            return Period.ZERO;
        }
    });

    DateTimeFormatter.PARSED_LEAP_SECOND = createTemporalQuery('PARSED_LEAP_SECOND', (temporal) => {
        if (temporal instanceof DateTimeBuilder) {
            return temporal.leapSecond;
        } else {
            return false;
        }
    });


}
/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { assert, requireNonNull, requireInstance } from '../assert';
import { IllegalArgumentException, IllegalStateException } from '../errors';
import { MathUtil } from '../MathUtil';

import { LocalDate } from '../LocalDate';
import { LocalDateTime } from '../LocalDateTime';
import { ZoneOffset } from '../ZoneOffset';
import { ChronoLocalDate } from '../chrono/ChronoLocalDate';
import { ChronoField } from '../temporal/ChronoField';
import { IsoFields } from '../temporal/IsoFields';
import { TemporalQueries } from '../temporal/TemporalQueries';

import { DateTimeFormatter } from './DateTimeFormatter';
import { DecimalStyle } from './DecimalStyle';
import { SignStyle } from './SignStyle';
import { TextStyle } from './TextStyle';
import { ResolverStyle } from './ResolverStyle';

import { CharLiteralPrinterParser } from './parser/CharLiteralPrinterParser';
import { CompositePrinterParser } from './parser/CompositePrinterParser';
import { FractionPrinterParser } from './parser/FractionPrinterParser';
import { NumberPrinterParser, ReducedPrinterParser } from './parser/NumberPrinterParser';
import { OffsetIdPrinterParser } from './parser/OffsetIdPrinterParser';
import { PadPrinterParserDecorator } from './parser/PadPrinterParserDecorator';
import { SettingsParser } from './parser/SettingsParser';
import { StringLiteralPrinterParser } from './parser/StringLiteralPrinterParser';
import { ZoneIdPrinterParser } from './parser/ZoneIdPrinterParser';

const MAX_WIDTH = 15; // can't parse all numbers with more then 15 digits in javascript

export class DateTimeFormatterBuilder {

    /**
     * Constructs a new instance of the builder.
     */
    constructor() {
        /**
         * The currently active builder, used by the outermost builder.
         */
        this._active = this;
        /**
         * The parent builder, null for the outermost builder.
         */
        this._parent = null;

        /**
         * The list of printers that will be used.
         */
        this._printerParsers = [];

        /**
         * Whether this builder produces an optional formatter.
         */
        this._optional = false;
        /**
         * The width to pad the next field to.
         */
        this._padNextWidth = 0;

        /**
         * The character to pad the next field with.
         */
        this._padNextChar = null;

        /**
         * The index of the last variable width value parser.
         */
        this._valueParserIndex = -1;
    }

    /**
     * Private static factory, replaces private threeten constructor
     * Returns a new instance of the builder.
     *
     * @param {DateTimeFormatterBuilder} parent  the parent builder, not null
     * @param {boolean} optional  whether the formatter is optional, not null
     * @return {DateTimeFormatterBuilder} new instance
     */
    static _of(parent, optional){
        requireNonNull(parent, 'parent');
        requireNonNull(optional, 'optional');

        const dtFormatterBuilder = new DateTimeFormatterBuilder();
        dtFormatterBuilder._parent = parent;
        dtFormatterBuilder._optional = optional;

        return dtFormatterBuilder;
    }

    /**
     * Changes the parse style to be case sensitive for the remainder of the formatter.
     *
     * Parsing can be case sensitive or insensitive - by default it is case sensitive.
     * This method allows the case sensitivity setting of parsing to be changed.
     *
     * Calling this method changes the state of the builder such that all
     * subsequent builder method calls will parse text in case sensitive mode.
     * See {@link parseCaseInsensitive} for the opposite setting.
     * The parse case sensitive/insensitive methods may be called at any point
     * in the builder, thus the parser can swap between case parsing modes
     * multiple times during the parse.
     *
     * Since the default is case sensitive, this method should only be used after
     * a previous call to {@link parseCaseInsensitive}.
     *
     * @return {DateTimeFormatterBuilder} this, for chaining, not null
     */
    parseCaseSensitive() {
        this._appendInternalPrinterParser(SettingsParser.SENSITIVE);
        return this;
    }

    /**
     * Changes the parse style to be case insensitive for the remainder of the formatter.
     *
     * Parsing can be case sensitive or insensitive - by default it is case sensitive.
     * This method allows the case sensitivity setting of parsing to be changed.
     *
     * Calling this method changes the state of the builder such that all
     * subsequent builder method calls will parse text in case sensitive mode.
     * See {@link parseCaseSensitive} for the opposite setting.
     * The parse case sensitive/insensitive methods may be called at any point
     * in the builder, thus the parser can swap between case parsing modes
     * multiple times during the parse.
     *
     * @return {DateTimeFormatterBuilder} this, for chaining, not null
     */
    parseCaseInsensitive() {
        this._appendInternalPrinterParser(SettingsParser.INSENSITIVE);
        return this;
    }

    //-----------------------------------------------------------------------
    /**
     * Changes the parse style to be strict for the remainder of the formatter.
     *
     * Parsing can be strict or lenient - by default its strict.
     * This controls the degree of flexibility in matching the text and sign styles.
     *
     * When used, this method changes the parsing to be strict from this point onwards.
     * As strict is the default, this is normally only needed after calling {@link parseLenient}.
     * The change will remain in force until the end of the formatter that is eventually
     * constructed or until {@link parseLenient} is called.
     *
     * @return {DateTimeFormatterBuilder} this, for chaining, not null
     */
    parseStrict() {
        this._appendInternalPrinterParser(SettingsParser.STRICT);
        return this;
    }

    /**
     * Changes the parse style to be lenient for the remainder of the formatter.
     * Note that case sensitivity is set separately to this method.
     *
     * Parsing can be strict or lenient - by default its strict.
     * This controls the degree of flexibility in matching the text and sign styles.
     * Applications calling this method should typically also call {@link parseCaseInsensitive}.
     *
     * When used, this method changes the parsing to be strict from this point onwards.
     * The change will remain in force until the end of the formatter that is eventually
     * constructed or until {@link parseStrict} is called.
     *
     * @return {DateTimeFormatterBuilder} this, for chaining, not null
     */
    parseLenient() {
        this._appendInternalPrinterParser(SettingsParser.LENIENT);
        return this;
    }

    /**
     * appendValue function overloading
     */
    appendValue(){
        if(arguments.length === 1){
            return this._appendValue1.apply(this, arguments);
        } else if(arguments.length === 2){
            return this._appendValue2.apply(this, arguments);
        } else {
            return this._appendValue4.apply(this, arguments);
        }
    }

    /**
     * Appends the value of a date-time field to the formatter using a normal
     * output style.
     *
     * The value of the field will be output during a print.
     * If the value cannot be obtained then an exception will be thrown.
     *
     * The value will be printed as per the normal print of an integer value.
     * Only negative numbers will be signed. No padding will be added.
     *
     * The parser for a variable width value such as this normally behaves greedily,
     * requiring one digit, but accepting as many digits as possible.
     * This behavior can be affected by 'adjacent value parsing'.
     * See {@link appendValue} for full details.
     *
     * @param field  the field to append, not null
     * @return {DateTimeFormatterBuilder} this, for chaining, not null
     */
    _appendValue1(field) {
        requireNonNull(field);
        this._appendValuePrinterParser(new NumberPrinterParser(field, 1, MAX_WIDTH, SignStyle.NORMAL));
        return this;
    }

    /**
     * Appends the value of a date-time field to the formatter using a fixed
     * width, zero-padded approach.
     *
     * The value of the field will be output during a print.
     * If the value cannot be obtained then an exception will be thrown.
     *
     * The value will be zero-padded on the left. If the size of the value
     * means that it cannot be printed within the width then an exception is thrown.
     * If the value of the field is negative then an exception is thrown during printing.
     *
     * This method supports a special technique of parsing known as 'adjacent value parsing'.
     * This technique solves the problem where a variable length value is followed by one or more
     * fixed length values. The standard parser is greedy, and thus it would normally
     * steal the digits that are needed by the fixed width value parsers that follow the
     * variable width one.
     *
     * No action is required to initiate 'adjacent value parsing'.
     * When a call to {@link appendValue} with a variable width is made, the builder
     * enters adjacent value parsing setup mode. If the immediately subsequent method
     * call or calls on the same builder are to this method, then the parser will reserve
     * space so that the fixed width values can be parsed.
     *
     * For example, consider `builder.appendValue(YEAR).appendValue(MONTH_OF_YEAR, 2)`.
     * The year is a variable width parse of between 1 and 19 digits.
     * The month is a fixed width parse of 2 digits.
     * Because these were appended to the same builder immediately after one another,
     * the year parser will reserve two digits for the month to parse.
     * Thus, the text '201106' will correctly parse to a year of 2011 and a month of 6.
     * Without adjacent value parsing, the year would greedily parse all six digits and leave
     * nothing for the month.
     *
     * Adjacent value parsing applies to each set of fixed width not-negative values in the parser
     * that immediately follow any kind of variable width value.
     * Calling any other append method will end the setup of adjacent value parsing.
     * Thus, in the unlikely event that you need to avoid adjacent value parsing behavior,
     * simply add the `appendValue` to another {@link DateTimeFormatterBuilder}
     * and add that to this builder.
     *
     * If adjacent parsing is active, then parsing must match exactly the specified
     * number of digits in both strict and lenient modes.
     * In addition, no positive or negative sign is permitted.
     *
     * @param field  the field to append, not null
     * @param width  the width of the printed field, from 1 to 19
     * @return this, for chaining, not null
     * @throws IllegalArgumentException if the width is invalid
     */
    _appendValue2(field, width) {
        requireNonNull(field);
        if (width < 1 || width > MAX_WIDTH) {
            throw new IllegalArgumentException(`The width must be from 1 to ${MAX_WIDTH} inclusive but was ${width}`);
        }
        const pp = new NumberPrinterParser(field, width, width, SignStyle.NOT_NEGATIVE);
        this._appendValuePrinterParser(pp);
        return this;
    }

    /**
     * Appends the value of a date-time field to the formatter providing full
     * control over printing.
     *
     * The value of the field will be output during a print.
     * If the value cannot be obtained then an exception will be thrown.
     *
     * This method provides full control of the numeric formatting, including
     * zero-padding and the positive/negative sign.
     *
     * The parser for a variable width value such as this normally behaves greedily,
     * accepting as many digits as possible.
     * This behavior can be affected by 'adjacent value parsing'.
     * See {@link appendValue} for full details.
     *
     * In strict parsing mode, the minimum number of parsed digits is `minWidth`.
     * In lenient parsing mode, the minimum number of parsed digits is one.
     *
     * If this method is invoked with equal minimum and maximum widths and a sign style of
     * `NOT_NEGATIVE` then it delegates to `appendValue(TemporalField, int)`.
     * In this scenario, the printing and parsing behavior described there occur.
     *
     * @param field  the field to append, not null
     * @param minWidth  the minimum field width of the printed field, from 1 to 19
     * @param maxWidth  the maximum field width of the printed field, from 1 to 19
     * @param signStyle  the positive/negative output style, not null
     * @return {DateTimeFormatterBuilder} this, for chaining, not null
     * @throws IllegalArgumentException if the widths are invalid
     */
    _appendValue4(field, minWidth, maxWidth, signStyle) {
        requireNonNull(field);
        requireNonNull(signStyle);
        if (minWidth === maxWidth && signStyle === SignStyle.NOT_NEGATIVE) {
            return this._appendValue2(field, maxWidth);
        }
        if (minWidth < 1 || minWidth > MAX_WIDTH) {
            throw new IllegalArgumentException(`The minimum width must be from 1 to ${MAX_WIDTH} inclusive but was ${minWidth}`);
        }
        if (maxWidth < 1 || maxWidth > MAX_WIDTH) {
            throw new IllegalArgumentException(`The minimum width must be from 1 to ${MAX_WIDTH} inclusive but was ${maxWidth}`);
        }
        if (maxWidth < minWidth) {
            throw new IllegalArgumentException(`The maximum width must exceed or equal the minimum width but ${maxWidth} < ${minWidth}`);
        }
        const pp = new NumberPrinterParser(field, minWidth, maxWidth, signStyle);
        this._appendValuePrinterParser(pp);
        return this;
    }

    /**
     * appendValueReduced function overloading
     */
    appendValueReduced() {
        if (arguments.length === 4 && arguments[3] instanceof ChronoLocalDate) {
            return this._appendValueReducedFieldWidthMaxWidthBaseDate.apply(this, arguments);
        } else {
            return this._appendValueReducedFieldWidthMaxWidthBaseValue.apply(this, arguments);
        }
    }

    /**
     * Appends the reduced value of a date-time field to the formatter.
     *
     * Since fields such as year vary by chronology, it is recommended to use the
     * {@link appendValueReduced} date}
     * variant of this method in most cases. This variant is suitable for
     * simple fields or working with only the ISO chronology.
     *
     * For formatting, the `width` and `maxWidth` are used to
     * determine the number of characters to format.
     * If they are equal then the format is fixed width.
     * If the value of the field is within the range of the `baseValue` using
     * `width` characters then the reduced value is formatted otherwise the value is
     * truncated to fit `maxWidth`.
     * The rightmost characters are output to match the width, left padding with zero.
     *
     * For strict parsing, the number of characters allowed by `width` to `maxWidth` are parsed.
     * For lenient parsing, the number of characters must be at least 1 and less than 10.
     * If the number of digits parsed is equal to `width` and the value is positive,
     * the value of the field is computed to be the first number greater than
     * or equal to the `baseValue` with the same least significant characters,
     * otherwise the value parsed is the field value.
     * This allows a reduced value to be entered for values in range of the baseValue
     * and width and absolute values can be entered for values outside the range.
     *
     * For example, a base value of `1980` and a width of `2` will have
     * valid values from `1980` to `2079`.
     * During parsing, the text `"12"` will result in the value `2012` as that
     * is the value within the range where the last two characters are "12".
     * By contrast, parsing the text `"1915"` will result in the value `1915`.
     *
     * @param {TemporalField} field  the field to append, not null
     * @param {number} width  the field width of the printed and parsed field, from 1 to 10
     * @param {number} maxWidth  the maximum field width of the printed field, from 1 to 10
     * @param {number} baseValue  the base value of the range of valid values
     * @return {DateTimeFormatterBuilder} this, for chaining, not null
     * @throws IllegalArgumentException if the width or base value is invalid
     */
    _appendValueReducedFieldWidthMaxWidthBaseValue(field, width, maxWidth, baseValue) {
        requireNonNull(field, 'field');
        const pp = new ReducedPrinterParser(field, width, maxWidth, baseValue, null);
        this._appendValuePrinterParser(pp);
        return this;
    }

    /**
     * Appends the reduced value of a date-time field to the formatter.
     *
     * This is typically used for formatting and parsing a two digit year.
     *
     * The base date is used to calculate the full value during parsing.
     * For example, if the base date is 1950-01-01 then parsed values for
     * a two digit year parse will be in the range 1950-01-01 to 2049-12-31.
     * Only the year would be extracted from the date, thus a base date of
     * 1950-08-25 would also parse to the range 1950-01-01 to 2049-12-31.
     * This behavior is necessary to support fields such as week-based-year
     * or other calendar systems where the parsed value does not align with
     * standard ISO years.
     *
     * The exact behavior is as follows. Parse the full set of fields and
     * determine the effective chronology using the last chronology if
     * it appears more than once. Then convert the base date to the
     * effective chronology. Then extract the specified field from the
     * chronology-specific base date and use it to determine the
     * `baseValue` used below.
     *
     * For formatting, the `width` and `maxWidth` are used to
     * determine the number of characters to format.
     * If they are equal then the format is fixed width.
     * If the value of the field is within the range of the `baseValue` using
     * `width` characters then the reduced value is formatted otherwise the value is
     * truncated to fit `maxWidth`.
     * The rightmost characters are output to match the width, left padding with zero.
     *
     * For strict parsing, the number of characters allowed by `width` to `maxWidth` are parsed.
     * For lenient parsing, the number of characters must be at least 1 and less than 10.
     * If the number of digits parsed is equal to `width` and the value is positive,
     * the value of the field is computed to be the first number greater than
     * or equal to the `baseValue` with the same least significant characters,
     * otherwise the value parsed is the field value.
     * This allows a reduced value to be entered for values in range of the baseValue
     * and width and absolute values can be entered for values outside the range.
     *
     * For example, a base value of `1980` and a width of `2` will have
     * valid values from `1980` to `2079`.
     * During parsing, the text `"12"` will result in the value `2012` as that
     * is the value within the range where the last two characters are "12".
     * By contrast, parsing the text `"1915"` will result in the value `1915`.
     *
     * @param {TemporalField} field  the field to append, not null
     * @param {number} width  the field width of the printed and parsed field, from 1 to 10
     * @param {number} maxWidth  the maximum field width of the printed field, from 1 to 10
     * @param {ChronoLocalDate} baseDate  the base date used to calculate the base value for the range
     *  of valid values in the parsed chronology, not null
     * @return {DateTimeFormatterBuilder} this, for chaining, not null
     * @throws IllegalArgumentException if the width or base value is invalid
     */
    _appendValueReducedFieldWidthMaxWidthBaseDate(field, width, maxWidth, baseDate) {
        requireNonNull(field, 'field');
        requireNonNull(baseDate, 'baseDate');
        requireInstance(baseDate, ChronoLocalDate, 'baseDate');
        const pp = new ReducedPrinterParser(field, width, maxWidth, 0, baseDate);
        this._appendValuePrinterParser(pp);
        return this;
    }

    /**
     * Appends a fixed width printer-parser.
     *
     * @param pp  the printer-parser, not null
     * @return {DateTimeFormatterBuilder} this, for chaining, not null
     */
    _appendValuePrinterParser(pp) {
        assert(pp != null);
        if (this._active._valueParserIndex >= 0 &&
                this._active._printerParsers[this._active._valueParserIndex] instanceof NumberPrinterParser) {
            const activeValueParser = this._active._valueParserIndex;

            // adjacent parsing mode, update setting in previous parsers
            let basePP = this._active._printerParsers[activeValueParser];
            if (pp.minWidth() === pp.maxWidth() && pp.signStyle() === SignStyle.NOT_NEGATIVE) {
                // Append the width to the subsequentWidth of the active parser
                basePP = basePP.withSubsequentWidth(pp.maxWidth());
                // Append the new parser as a fixed width
                this._appendInternal(pp.withFixedWidth());
                // Retain the previous active parser
                this._active._valueParserIndex = activeValueParser;
            } else {
                // Modify the active parser to be fixed width
                basePP = basePP.withFixedWidth();
                // The new parser becomes the mew active parser
                this._active._valueParserIndex = this._appendInternal(pp);
            }
            // Replace the modified parser with the updated one
            this._active._printerParsers[activeValueParser] = basePP;
        } else {
            // The new Parser becomes the active parser
            this._active._valueParserIndex = this._appendInternal(pp);
        }
        return this;
    }

    //-----------------------------------------------------------------------
    /**
     * Appends the fractional value of a date-time field to the formatter.
     *
     * The fractional value of the field will be output including the
     * preceding decimal point. The preceding value is not output.
     * For example, the second-of-minute value of 15 would be output as `.25`.
     *
     * The width of the printed fraction can be controlled. Setting the
     * minimum width to zero will cause no output to be generated.
     * The printed fraction will have the minimum width necessary between
     * the minimum and maximum widths - trailing zeroes are omitted.
     * No rounding occurs due to the maximum width - digits are simply dropped.
     *
     * When parsing in strict mode, the number of parsed digits must be between
     * the minimum and maximum width. When parsing in lenient mode, the minimum
     * width is considered to be zero and the maximum is nine.
     *
     * If the value cannot be obtained then an exception will be thrown.
     * If the value is negative an exception will be thrown.
     * If the field does not have a fixed set of valid values then an
     * exception will be thrown.
     * If the field value in the date-time to be printed is invalid it
     * cannot be printed and an exception will be thrown.
     *
     * @param {TemporalField} field  the field to append, not null
     * @param {Number} minWidth  the minimum width of the field excluding the decimal point, from 0 to 9
     * @param {Number} maxWidth  the maximum width of the field excluding the decimal point, from 1 to 9
     * @param {boolean} decimalPoint  whether to output the localized decimal point symbol
     * @return {DateTimeFormatterBuilder} this, for chaining, not null
     * @throws IllegalArgumentException if the field has a variable set of valid values or
     *  either width is invalid
     */
    appendFraction(field, minWidth, maxWidth, decimalPoint) {
        this._appendInternal(new FractionPrinterParser(field, minWidth, maxWidth, decimalPoint));
        return this;
    }

    /**
     * Appends an instant using ISO-8601 to the formatter with control over
     * the number of fractional digits.
     *
     * Instants have a fixed output format, although this method provides some
     * control over the fractional digits. They are converted to a date-time
     * with a zone-offset of UTC and printed using the standard ISO-8601 format.
     * The localized decimal style is not used.
     *
     * The {@link this.fractionalDigits} parameter allows the output of the fractional
     * second to be controlled. Specifying zero will cause no fractional digits
     * to be output. From 1 to 9 will output an increasing number of digits, using
     * zero right-padding if necessary. The special value -1 is used to output as
     * many digits as necessary to avoid any trailing zeroes.
     *
     * When parsing in strict mode, the number of parsed digits must match the
     * fractional digits. When parsing in lenient mode, any number of fractional
     * digits from zero to nine are accepted.
     *
     * The instant is obtained using {@link ChronoField#INSTANT_SECONDS}
     * and optionally (@code NANO_OF_SECOND). The value of {@link INSTANT_SECONDS}
     * may be outside the maximum range of {@link LocalDateTime}.
     *
     * The {@link ResolverStyle} has no effect on instant parsing.
     * The end-of-day time of '24:00' is handled as midnight at the start of the following day.
     * The leap-second time of '23:59:59' is handled to some degree, see
     * {@link DateTimeFormatter#parsedLeapSecond} for full details.
     *
     * An alternative to this method is to format/parse the instant as a single
     * epoch-seconds value. That is achieved using `appendValue(INSTANT_SECONDS)`.
     *
     * @param {number} [fractionalDigits=-2] - the number of fractional second digits to format with,
     *  from 0 to 9, or -1 to use as many digits as necessary
     * @return {DateTimeFormatterBuilder} this, for chaining, not null
     */
    appendInstant(fractionalDigits=-2) {
        if (fractionalDigits < -2 || fractionalDigits > 9) {
            throw new IllegalArgumentException(`Invalid fractional digits: ${fractionalDigits}`);
        }
        this._appendInternal(new InstantPrinterParser(fractionalDigits));
        return this;
    }


    /**
     * Appends the zone offset, such as '+01:00', to the formatter.
     *
     * This appends an instruction to print/parse the offset ID to the builder.
     * This is equivalent to calling `appendOffset("HH:MM:ss", "Z")`.
     *
     * @return {DateTimeFormatterBuilder} this, for chaining, not null
     */
    appendOffsetId() {
        this._appendInternal(OffsetIdPrinterParser.INSTANCE_ID);
        return this;
    }

    /**
     * Appends the zone offset, such as '+01:00', to the formatter.
     *
     * This appends an instruction to print/parse the offset ID to the builder.
     *
     * During printing, the offset is obtained using a mechanism equivalent
     * to querying the temporal with {@link TemporalQueries#offset}.
     * It will be printed using the format defined below.
     * If the offset cannot be obtained then an exception is thrown unless the
     * section of the formatter is optional.
     *
     * During parsing, the offset is parsed using the format defined below.
     * If the offset cannot be parsed then an exception is thrown unless the
     * section of the formatter is optional.
     *
     * The format of the offset is controlled by a pattern which must be one
     * of the following:
     *
     * * `+HH` - hour only, ignoring minute and second
     * * `+HHmm` - hour, with minute if non-zero, ignoring second, no colon
     * * `+HH:mm` - hour, with minute if non-zero, ignoring second, with colon
     * * `+HHMM` - hour and minute, ignoring second, no colon
     * * `+HH:MM` - hour and minute, ignoring second, with colon
     * * `+HHMMss` - hour and minute, with second if non-zero, no colon
     * * `+HH:MM:ss` - hour and minute, with second if non-zero, with colon
     * * `+HHMMSS` - hour, minute and second, no colon
     * * `+HH:MM:SS` - hour, minute and second, with colon
     *
     * The "no offset" text controls what text is printed when the total amount of
     * the offset fields to be output is zero.
     * Example values would be 'Z', '+00:00', 'UTC' or 'GMT'.
     * Three formats are accepted for parsing UTC - the "no offset" text, and the
     * plus and minus versions of zero defined by the pattern.
     *
     * @param {String} pattern  the pattern to use, not null
     * @param {String} noOffsetText  the text to use when the offset is zero, not null
     * @return {DateTimeFormatterBuilder} this, for chaining, not null
     */
    appendOffset(pattern, noOffsetText) {
        this._appendInternalPrinterParser(new OffsetIdPrinterParser(noOffsetText, pattern));
        return this;
    }

    /**
      * Appends the time-zone ID, such as 'Europe/Paris' or '+02:00', to the formatter.
      *
      * This appends an instruction to print/parse the zone ID to the builder.
      * The zone ID is obtained in a strict manner suitable for {@link ZonedDateTime}.
      * By contrast, {@link OffsetDateTime} does not have a zone ID suitable
      * for use with this method, see {@link appendZoneOrOffsetId}.
      *
      * During printing, the zone is obtained using a mechanism equivalent
      * to querying the temporal with {@link TemporalQueries#zoneId}.
      * It will be printed using the result of {@link ZoneId#getId}.
      * If the zone cannot be obtained then an exception is thrown unless the
      * section of the formatter is optional.
      *
      * During parsing, the zone is parsed and must match a known zone or offset.
      * If the zone cannot be parsed then an exception is thrown unless the
      * section of the formatter is optional.
      *
      * @return {DateTimeFormatterBuilder} this, for chaining, not null
      * @see #appendZoneRegionId()
      */
    appendZoneId() {
        this._appendInternal(new ZoneIdPrinterParser(TemporalQueries.zoneId(), 'ZoneId()'));
        return this;
    }

    //-----------------------------------------------------------------------
    /**
     * Appends the elements defined by the specified pattern to the builder.
     *
     * All letters 'A' to 'Z' and 'a' to 'z' are reserved as pattern letters.
     * The characters '{' and '}' are reserved for future use.
     * The characters '[' and ']' indicate optional patterns.
     * The following pattern letters are defined:
     * <pre>
     *  |Symbol  |Meaning                     |Presentation      |Examples
     *  |--------|----------------------------|------------------|----------------------------------------------------
     *  | G      | era                        | number/text      | 1; 01; AD; Anno Domini
     *  | u      | year                       | year             | 2004; 04
     *  | y      | year-of-era                | year             | 2004; 04
     *  | D      | day-of-year                | number           | 189
     *  | M      | month-of-year              | number/text      | 7; 07; Jul; July; J
     *  | d      | day-of-month               | number           | 10
     *  |        |                            |                  |
     *  | Q      | quarter-of-year            | number/text      | 3; 03; Q3
     *  | Y      | week-based-year            | year             | 1996; 96
     *  | w      | week-of-year               | number           | 27
     *  | W      | week-of-month              | number           | 27
     *  | e      | localized day-of-week      | number           | 2; Tue; Tuesday; T
     *  | E      | day-of-week                | number/text      | 2; Tue; Tuesday; T
     *  | F      | week-of-month              | number           | 3
     *  |        |                            |                  |
     *  | a      | am-pm-of-day               | text             | PM
     *  | h      | clock-hour-of-am-pm (1-12) | number           | 12
     *  | K      | hour-of-am-pm (0-11)       | number           | 0
     *  | k      | clock-hour-of-am-pm (1-24) | number           | 0
     *  |        |                            |                  |
     *  | H      | hour-of-day (0-23)         | number           | 0
     *  | m      | minute-of-hour             | number           | 30
     *  | s      | second-of-minute           | number           | 55
     *  | S      | fraction-of-second         | fraction         | 978
     *  | A      | milli-of-day               | number           | 1234
     *  | n      | nano-of-second             | number           | 987654321
     *  | N      | nano-of-day                | number           | 1234000000
     *  |        |                            |                  |
     *  | V      | time-zone ID               | zone-id          | America/Los_Angeles; Z; -08:30
     *  | z      | time-zone name             | zone-name        | Pacific Standard Time; PST
     *  | X      | zone-offset 'Z' for zero   | offset-X         | Z; -08; -0830; -08:30; -083015; -08:30:15;
     *  | x      | zone-offset                | offset-x         | +0000; -08; -0830; -08:30; -083015; -08:30:15;
     *  | Z      | zone-offset                | offset-Z         | +0000; -0800; -08:00;
     *  |        |                            |                  |
     *  | p      | pad next                   | pad modifier     | 1
     *  |        |                            |                  |
     *  | '      | escape for text            | delimiter        |
     *  | ''     | single quote               | literal          | '
     *  | [      | optional section start     |                  |
     *  | ]      | optional section end       |                  |
     *  | {}     | reserved for future use    |                  |
     * </pre>
     *
     * The count of pattern letters determine the format.
     *
     * **Text**: The text style is determined based on the number of pattern letters used.
     * Less than 4 pattern letters will use the short form (see {@link TextStyle#SHORT}).
     * Exactly 4 pattern letters will use the full form (see {@link TextStyle#FULL}).
     * Exactly 5 pattern letters will use the narrow form (see {@link TextStyle#NARROW}).
     *
     * **Number**: If the count of letters is one, then the value is printed using the minimum number
     * of digits and without padding as per {@link appendValue}. Otherwise, the
     * count of digits is used as the width of the output field as per {@link appendValue}.
     *
     * **Number/Text**: If the count of pattern letters is 3 or greater, use the Text rules above.
     * Otherwise use the Number rules above.
     *
     * **Fraction**: Outputs the nano-of-second field as a fraction-of-second.
     * The nano-of-second value has nine digits, thus the count of pattern letters is from 1 to 9.
     * If it is less than 9, then the nano-of-second value is truncated, with only the most
     * significant digits being output.
     * When parsing in strict mode, the number of parsed digits must match the count of pattern letters.
     * When parsing in lenient mode, the number of parsed digits must be at least the count of pattern
     * letters, up to 9 digits.
     *
     * **Year**: The count of letters determines the minimum field width below which padding is used.
     * If the count of letters is two, then a reduced (see {@link appendValueReduced}) two digit form is used.
     * For printing, this outputs the rightmost two digits. For parsing, this will parse using the
     * base value of 2000, resulting in a year within the range 2000 to 2099 inclusive.
     * If the count of letters is less than four (but not two), then the sign is only output for negative
     * years as per {@link SignStyle#NORMAL}.
     * Otherwise, the sign is output if the pad width is exceeded, as per {@link SignStyle#EXCEEDS_PAD}
     *
     * **ZoneId**: This outputs the time-zone ID, such as 'Europe/Paris'.
     * If the count of letters is two, then the time-zone ID is output.
     * Any other count of letters throws {@link IllegalArgumentException}.
     * <pre>
     *  Pattern     Equivalent builder methods
     *   VV          appendZoneId()
     * </pre>
     *
     * **Zone names**: This outputs the display name of the time-zone ID.
     * If the count of letters is one, two or three, then the short name is output.
     * If the count of letters is four, then the full name is output.
     * Five or more letters throws {@link IllegalArgumentException}.
     * <pre>
     *  Pattern     Equivalent builder methods
     *   z           appendZoneText(TextStyle.SHORT)
     *   zz          appendZoneText(TextStyle.SHORT)
     *   zzz         appendZoneText(TextStyle.SHORT)
     *   zzzz        appendZoneText(TextStyle.FULL)
     * </pre>
     *
     * **Offset X and x**: This formats the offset based on the number of pattern letters.
     * One letter outputs just the hour', such as '+01', unless the minute is non-zero
     * in which case the minute is also output, such as '+0130'.
     * Two letters outputs the hour and minute, without a colon, such as '+0130'.
     * Three letters outputs the hour and minute, with a colon, such as '+01:30'.
     * Four letters outputs the hour and minute and optional second, without a colon, such as '+013015'.
     * Five letters outputs the hour and minute and optional second, with a colon, such as '+01:30:15'.
     * Six or more letters throws {@link IllegalArgumentException}.
     * Pattern letter 'X' (upper case) will output 'Z' when the offset to be output would be zero,
     * whereas pattern letter 'x' (lower case) will output '+00', '+0000', or '+00:00'.
     * <pre>
     *  Pattern     Equivalent builder methods
     *   X           appendOffset("+HHmm","Z")
     *   XX          appendOffset("+HHMM","Z")
     *   XXX         appendOffset("+HH:MM","Z")
     *   XXXX        appendOffset("+HHMMss","Z")
     *   XXXXX       appendOffset("+HH:MM:ss","Z")
     *   x           appendOffset("+HHmm","+00")
     *   xx          appendOffset("+HHMM","+0000")
     *   xxx         appendOffset("+HH:MM","+00:00")
     *   xxxx        appendOffset("+HHMMss","+0000")
     *   xxxxx       appendOffset("+HH:MM:ss","+00:00")
     * </pre>
     *
     * **Offset Z**: This formats the offset based on the number of pattern letters.
     * One, two or three letters outputs the hour and minute, without a colon, such as '+0130'.
     * Four or more letters throws {@link IllegalArgumentException}.
     * The output will be '+0000' when the offset is zero.
     * <pre>
     *  Pattern     Equivalent builder methods
     *   Z           appendOffset("+HHMM","+0000")
     *   ZZ          appendOffset("+HHMM","+0000")
     *   ZZZ         appendOffset("+HHMM","+0000")
     * </pre>
     *
     * **Optional section**: The optional section markers work exactly like calling {@link optionalStart}
     * and {@link optionalEnd}.
     *
     * **Pad modifier**: Modifies the pattern that immediately follows to be padded with spaces.
     * The pad width is determined by the number of pattern letters.
     * This is the same as calling {@link padNext}.
     *
     * For example, 'ppH' outputs the hour-of-day padded on the left with spaces to a width of 2.
     *
     * Any unrecognized letter is an error.
     * Any non-letter character, other than '[', ']', '{', '}' and the single quote will be output directly.
     * Despite this, it is recommended to use single quotes around all characters that you want to
     * output directly to ensure that future changes do not break your application.
     *
     * Note that the pattern string is similar, but not identical, to
     * {@link java.text.SimpleDateFormat}.
     * The pattern string is also similar, but not identical, to that defined by the
     * Unicode Common Locale Data Repository (CLDR/LDML).
     * Pattern letters 'E' and 'u' are merged, which changes the meaning of "E" and "EE" to be numeric.
     * Pattern letters 'X' is aligned with Unicode CLDR/LDML, which affects pattern 'X'.
     * Pattern letter 'y' and 'Y' parse years of two digits and more than 4 digits differently.
     * Pattern letters 'n', 'A', 'N', 'I' and 'p' are added.
     * Number types will reject large numbers.
     *
     * @param {String} pattern  the pattern to add, not null
     * @return {DateTimeFormatterBuilder} this, for chaining, not null
     * @throws IllegalArgumentException if the pattern is invalid
     */
    appendPattern(pattern) {
        requireNonNull(pattern, 'pattern');
        this._parsePattern(pattern);
        return this;
    }


    //-----------------------------------------------------------------------
    // empty implementations of locale functionality, be implemented/overridden by js-joda-locale

    appendZoneText() {
        throw new IllegalArgumentException('Pattern using (localized) text not implemented, use @js-joda/locale plugin!');
    }

    appendText() {
        throw new IllegalArgumentException('Pattern using (localized) text not implemented, use @js-joda/locale plugin!');
    }

    appendLocalizedOffset() {
        throw new IllegalArgumentException('Pattern using (localized) text not implemented, use @js-joda/locale plugin!');
    }

    appendWeekField() {
        throw new IllegalArgumentException('Pattern using (localized) text not implemented, use @js-joda/locale plugin!');
    }

    //-----------------------------------------------------------------------

    _parsePattern(pattern) {
        /** Map of letters to fields. */
        const FIELD_MAP = {
            'G': ChronoField.ERA,
            'y': ChronoField.YEAR_OF_ERA,
            'u': ChronoField.YEAR,
            'Q': IsoFields.QUARTER_OF_YEAR,
            'q': IsoFields.QUARTER_OF_YEAR,
            'M': ChronoField.MONTH_OF_YEAR,
            'L': ChronoField.MONTH_OF_YEAR,
            'D': ChronoField.DAY_OF_YEAR,
            'd': ChronoField.DAY_OF_MONTH,
            'F': ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH,
            'E': ChronoField.DAY_OF_WEEK,
            'c': ChronoField.DAY_OF_WEEK,
            'e': ChronoField.DAY_OF_WEEK,
            'a': ChronoField.AMPM_OF_DAY,
            'H': ChronoField.HOUR_OF_DAY,
            'k': ChronoField.CLOCK_HOUR_OF_DAY,
            'K': ChronoField.HOUR_OF_AMPM,
            'h': ChronoField.CLOCK_HOUR_OF_AMPM,
            'm': ChronoField.MINUTE_OF_HOUR,
            's': ChronoField.SECOND_OF_MINUTE,
            'S': ChronoField.NANO_OF_SECOND,
            'A': ChronoField.MILLI_OF_DAY,
            'n': ChronoField.NANO_OF_SECOND,
            'N': ChronoField.NANO_OF_DAY
        };

        for (let pos = 0; pos < pattern.length; pos++) {
            let cur = pattern.charAt(pos);
            if ((cur >= 'A' && cur <= 'Z') || (cur >= 'a' && cur <= 'z')) {
                let start = pos++;
                for (; pos < pattern.length && pattern.charAt(pos) === cur; pos++);  // short loop
                let count = pos - start;
                // padding
                if (cur === 'p') {
                    let pad = 0;
                    if (pos < pattern.length) {
                        cur = pattern.charAt(pos);
                        if ((cur >= 'A' && cur <= 'Z') || (cur >= 'a' && cur <= 'z')) {
                            pad = count;
                            start = pos++;
                            for (; pos < pattern.length && pattern.charAt(pos) === cur; pos++);  // short loop
                            count = pos - start;
                        }
                    }
                    if (pad === 0) {
                        throw new IllegalArgumentException(
                            `Pad letter 'p' must be followed by valid pad pattern: ${pattern}`);
                    }
                    this.padNext(pad); // pad and continue parsing
                }
                // main rules
                const field = FIELD_MAP[cur];
                if (field != null) {
                    this._parseField(cur, count, field);
                } else if (cur === 'z') {
                    if (count > 4) {
                        throw new IllegalArgumentException(`Too many pattern letters: ${cur}`);
                    } else if (count === 4) {
                        this.appendZoneText(TextStyle.FULL);
                    } else {
                        this.appendZoneText(TextStyle.SHORT);
                    }
                } else if (cur === 'V') {
                    if (count !== 2) {
                        throw new IllegalArgumentException(`Pattern letter count must be 2: ${cur}`);
                    }
                    this.appendZoneId();
                } else if (cur === 'Z') {
                    if (count < 4) {
                        this.appendOffset('+HHMM', '+0000');
                    } else if (count === 4) {
                        this.appendLocalizedOffset(TextStyle.FULL);
                    } else if (count === 5) {
                        this.appendOffset('+HH:MM:ss', 'Z');
                    } else {
                        throw new IllegalArgumentException(`Too many pattern letters: ${cur}`);
                    }
                } else if (cur === 'O') {
                    if (count === 1) {
                        this.appendLocalizedOffset(TextStyle.SHORT);
                    } else if (count === 4) {
                        this.appendLocalizedOffset(TextStyle.FULL);
                    } else {
                        throw new IllegalArgumentException(`Pattern letter count must be 1 or 4: ${cur}`);
                    }
                } else if (cur === 'X') {
                    if (count > 5) {
                        throw new IllegalArgumentException(`Too many pattern letters: ${cur}`);
                    }
                    this.appendOffset(OffsetIdPrinterParser.PATTERNS[count + (count === 1 ? 0 : 1)], 'Z');
                } else if (cur === 'x') {
                    if (count > 5) {
                        throw new IllegalArgumentException(`Too many pattern letters: ${cur}`);
                    }
                    const zero = (count === 1 ? '+00' : (count % 2 === 0 ? '+0000' : '+00:00'));
                    this.appendOffset(OffsetIdPrinterParser.PATTERNS[count + (count === 1 ? 0 : 1)], zero);
                } else if (cur === 'W') {
                    if (count > 1) {
                        throw new IllegalArgumentException(`Too many pattern letters: ${cur}`);
                    }
                    this.appendWeekField('W', count);
                } else if (cur === 'w') {
                    if (count > 2) {
                        throw new IllegalArgumentException(`Too many pattern letters: ${cur}`);
                    }
                    this.appendWeekField('w', count);
                } else if (cur === 'Y') {
                    this.appendWeekField('Y', count);
                } else {
                    throw new IllegalArgumentException(`Unknown pattern letter: ${cur}`);
                }
                pos--;

            } else if (cur === '\'') {
                // parse literals
                const start = pos++;
                for (; pos < pattern.length; pos++) {
                    if (pattern.charAt(pos) === '\'') {
                        if (pos + 1 < pattern.length && pattern.charAt(pos + 1) === '\'') {
                            pos++;
                        } else {
                            break;  // end of literal
                        }
                    }
                }
                if (pos >= pattern.length) {
                    throw new IllegalArgumentException(`Pattern ends with an incomplete string literal: ${pattern}`);
                }
                const str = pattern.substring(start + 1, pos);
                if (str.length === 0) {
                    this.appendLiteral('\'');
                } else {
                    this.appendLiteral(str.replace('\'\'', '\''));
                }

            } else if (cur === '[') {
                this.optionalStart();

            } else if (cur === ']') {
                if (this._active._parent === null) {
                    throw new IllegalArgumentException('Pattern invalid as it contains ] without previous [');
                }
                this.optionalEnd();

            } else if (cur === '{' || cur === '}' || cur === '#') {
                throw new IllegalArgumentException(`Pattern includes reserved character: '${cur}'`);
            } else {
                this.appendLiteral(cur);
            }
        }
    }

    _parseField(cur, count, field) {
        switch (cur) {
            case 'u':
            case 'y':
                if (count === 2) {
                    this.appendValueReduced(field, 2, 2, ReducedPrinterParser.BASE_DATE);
                } else if (count < 4) {
                    this.appendValue(field, count, MAX_WIDTH, SignStyle.NORMAL);
                } else {
                    this.appendValue(field, count, MAX_WIDTH, SignStyle.EXCEEDS_PAD);
                }
                break;
            case 'M':
            case 'Q':
                switch (count) {
                    case 1:
                        this.appendValue(field);
                        break;
                    case 2:
                        this.appendValue(field, 2);
                        break;
                    case 3:
                        this.appendText(field, TextStyle.SHORT);
                        break;
                    case 4:
                        this.appendText(field, TextStyle.FULL);
                        break;
                    case 5:
                        this.appendText(field, TextStyle.NARROW);
                        break;
                    default:
                        throw new IllegalArgumentException(`Too many pattern letters: ${cur}`);
                }
                break;
            case 'L':
            case 'q':
                switch (count) {
                    case 1:
                        this.appendValue(field);
                        break;
                    case 2:
                        this.appendValue(field, 2);
                        break;
                    case 3:
                        this.appendText(field, TextStyle.SHORT_STANDALONE);
                        break;
                    case 4:
                        this.appendText(field, TextStyle.FULL_STANDALONE);
                        break;
                    case 5:
                        this.appendText(field, TextStyle.NARROW_STANDALONE);
                        break;
                    default:
                        throw new IllegalArgumentException(`Too many pattern letters: ${cur}`);
                }
                break;
            case 'e':
                switch (count) {
                    case 1:
                    case 2:
                        this.appendWeekField('e', count);
                        break;
                    case 3:
                        this.appendText(field, TextStyle.SHORT);
                        break;
                    case 4:
                        this.appendText(field, TextStyle.FULL);
                        break;
                    case 5:
                        this.appendText(field, TextStyle.NARROW);
                        break;
                    default:
                        throw new IllegalArgumentException(`Too many pattern letters: ${cur}`);
                }
                // eslint-disable-next-line no-unreachable
                break;
            case 'c':
                switch (count) {
                    case 1:
                        this.appendWeekField('c', count);
                        break;
                    case 2:
                        throw new IllegalArgumentException(`Invalid number of pattern letters: ${cur}`);
                    case 3:
                        this.appendText(field, TextStyle.SHORT_STANDALONE);
                        break;
                    case 4:
                        this.appendText(field, TextStyle.FULL_STANDALONE);
                        break;
                    case 5:
                        this.appendText(field, TextStyle.NARROW_STANDALONE);
                        break;
                    default:
                        throw new IllegalArgumentException(`Too many pattern letters: ${cur}`);
                }
                // eslint-disable-next-line no-unreachable
                break;
            case 'a':
                if (count === 1) {
                    this.appendText(field, TextStyle.SHORT);
                } else {
                    throw new IllegalArgumentException(`Too many pattern letters: ${cur}`);
                }
                // eslint-disable-next-line no-unreachable
                break;
            case 'E':
            case 'G':
                switch (count) {
                    case 1:
                    case 2:
                    case 3:
                        this.appendText(field, TextStyle.SHORT);
                        break;
                    case 4:
                        this.appendText(field, TextStyle.FULL);
                        break;
                    case 5:
                        this.appendText(field, TextStyle.NARROW);
                        break;
                    default:
                        throw new IllegalArgumentException(`Too many pattern letters: ${cur}`);
                }
                // eslint-disable-next-line no-unreachable
                break;
            case 'S':
                this.appendFraction(ChronoField.NANO_OF_SECOND, count, count, false);
                break;
            case 'F':
                if (count === 1) {
                    this.appendValue(field);
                } else {
                    throw new IllegalArgumentException(`Too many pattern letters: ${cur}`);
                }
                break;
            case 'd':
            case 'h':
            case 'H':
            case 'k':
            case 'K':
            case 'm':
            case 's':
                if (count === 1) {
                    this.appendValue(field);
                } else if (count === 2) {
                    this.appendValue(field, count);
                } else {
                    throw new IllegalArgumentException(`Too many pattern letters: ${cur}`);
                }
                break;
            case 'D':
                if (count === 1) {
                    this.appendValue(field);
                } else if (count <= 3) {
                    this.appendValue(field, count);
                } else {
                    throw new IllegalArgumentException(`Too many pattern letters: ${cur}`);
                }
                break;
            default:
                if (count === 1) {
                    this.appendValue(field);
                } else {
                    this.appendValue(field, count);
                }
                break;
        }
    }

    /**
     * padNext function overloading
     */
    padNext() {
        if (arguments.length === 1) {
            return this._padNext1.apply(this, arguments);
        } else {
            return this._padNext2.apply(this, arguments);
        }
    }

    /**
     * Causes the next added printer/parser to pad to a fixed width using a space.
     *
     * This padding will pad to a fixed width using spaces.
     *
     * During formatting, the decorated element will be output and then padded
     * to the specified width. An exception will be thrown during printing if
     * the pad width is exceeded.
     *
     * During parsing, the padding and decorated element are parsed.
     * If parsing is lenient, then the pad width is treated as a maximum.
     * If parsing is case insensitive, then the pad character is matched ignoring case.
     * The padding is parsed greedily. Thus, if the decorated element starts with
     * the pad character, it will not be parsed.
     *
     * @param {number} padWidth  the pad width, 1 or greater
     * @return {DateTimeFormatterBuilder} this, for chaining, not null
     * @throws IllegalArgumentException if pad width is too small
     */
    _padNext1(padWidth) {
        return this._padNext2(padWidth, ' ');
    }

    /**
     * Causes the next added printer/parser to pad to a fixed width.
     *
     * This padding is intended for padding other than zero-padding.
     * Zero-padding should be achieved using the appendValue methods.
     *
     * During formatting, the decorated element will be output and then padded
     * to the specified width. An exception will be thrown during printing if
     * the pad width is exceeded.
     *
     * During parsing, the padding and decorated element are parsed.
     * If parsing is lenient, then the pad width is treated as a maximum.
     * If parsing is case insensitive, then the pad character is matched ignoring case.
     * The padding is parsed greedily. Thus, if the decorated element starts with
     * the pad character, it will not be parsed.
     *
     * @param {number} padWidth  the pad width, 1 or greater
     * @param {String} padChar  the pad character
     * @return {DateTimeFormatterBuilder} this, for chaining, not null
     * @throws IllegalArgumentException if pad width is too small
     */
    _padNext2(padWidth, padChar) {
        if (padWidth < 1) {
            throw new IllegalArgumentException(`The pad width must be at least one but was ${padWidth}`);
        }
        this._active._padNextWidth = padWidth;
        this._active._padNextChar = padChar;
        this._active._valueParserIndex = -1;
        return this;
    }


    //-----------------------------------------------------------------------
    /**
     * Mark the start of an optional section.
     *
     * The output of printing can include optional sections, which may be nested.
     * An optional section is started by calling this method and ended by calling
     * {@link optionalEnd} or by ending the build process.
     *
     * All elements in the optional section are treated as optional.
     * During printing, the section is only output if data is available in the
     * {@link TemporalAccessor} for all the elements in the section.
     * During parsing, the whole section may be missing from the parsed string.
     *
     * For example, consider a builder setup as
     * `builder.appendValue(HOUR_OF_DAY,2).optionalStart().appendValue(MINUTE_OF_HOUR,2)`.
     * The optional section ends automatically at the end of the builder.
     * During printing, the minute will only be output if its value can be obtained from the date-time.
     * During parsing, the input will be successfully parsed whether the minute is present or not.
     *
     * @return {DateTimeFormatterBuilder} this, for chaining, not null
     */
    optionalStart() {
        this._active._valueParserIndex = -1;
        this._active = DateTimeFormatterBuilder._of(this._active, true);
        return this;
    }

    /**
     * Ends an optional section.
     *
     * The output of printing can include optional sections, which may be nested.
     * An optional section is started by calling {@link optionalStart} and ended
     * using this method (or at the end of the builder).
     *
     * Calling this method without having previously called `optionalStart`
     * will throw an exception.
     * Calling this method immediately after calling `optionalStart` has no effect
     * on the formatter other than ending the (empty) optional section.
     *
     * All elements in the optional section are treated as optional.
     * During printing, the section is only output if data is available in the
     * {@link TemporalAccessor} for all the elements in the section.
     * During parsing, the whole section may be missing from the parsed string.
     *
     * For example, consider a builder setup as
     * `builder.appendValue(HOUR_OF_DAY,2).optionalStart().appendValue(MINUTE_OF_HOUR,2).optionalEnd()`.
     * During printing, the minute will only be output if its value can be obtained from the date-time.
     * During parsing, the input will be successfully parsed whether the minute is present or not.
     *
     * @return {DateTimeFormatterBuilder} this, for chaining, not null
     * @throws IllegalStateException if there was no previous call to `optionalStart`
     */
    optionalEnd() {
        if (this._active._parent == null) {
            throw new IllegalStateException('Cannot call optionalEnd() as there was no previous call to optionalStart()');
        }
        if (this._active._printerParsers.length > 0) {
            const cpp = new CompositePrinterParser(this._active._printerParsers, this._active._optional);
            this._active = this._active._parent;
            this._appendInternal(cpp);
        } else {
            this._active = this._active._parent;
        }
        return this;
    }

    /**
     * Appends a printer and/or parser to the internal list handling padding.
     *
     * @param pp  the printer-parser to add, not null
     * @return the index into the active parsers list
     */
    _appendInternal(pp) {
        assert(pp != null);
        if (this._active._padNextWidth > 0) {
            if (pp != null) {
                pp = new PadPrinterParserDecorator(pp, this._active._padNextWidth, this._active._padNextChar);
            }
            this._active._padNextWidth = 0;
            this._active._padNextChar = 0;
        }
        this._active._printerParsers.push(pp);
        this._active._valueParserIndex = -1;
        return this._active._printerParsers.length - 1;
    }

    /**
     * Appends a string literal to the formatter.
     *
     * This string will be output during a print.
     *
     * If the literal is empty, nothing is added to the formatter.
     *
     * @param literal  the literal to append, not null
     * @return {DateTimeFormatterBuilder} this, for chaining, not null
     */
    appendLiteral(literal) {
        assert(literal != null);
        if (literal.length > 0) {
            if (literal.length === 1) {
                this._appendInternalPrinterParser(new CharLiteralPrinterParser(literal.charAt(0)));
            } else {
                this._appendInternalPrinterParser(new StringLiteralPrinterParser(literal));
            }
        }
        return this;
    }

    /**
     * Appends a printer and/or parser to the internal list handling padding.
     *
     * @param pp  the printer-parser to add, not null
     * @return the index into the active parsers list
     */
    _appendInternalPrinterParser(pp) {
        assert(pp != null);
        if (this._active._padNextWidth > 0) {
            if (pp != null) {
                pp = new PadPrinterParserDecorator(pp, this._active._padNextWidth, this._active._padNextChar);
            }
            this._active._padNextWidth = 0;
            this._active._padNextChar = 0;
        }
        this._active._printerParsers.push(pp);
        this._active._valueParserIndex = -1;
        return this._active._printerParsers.length - 1;
    }

    //-----------------------------------------------------------------------
    /**
     * Appends all the elements of a formatter to the builder.
     *
     * This method has the same effect as appending each of the constituent
     * parts of the formatter directly to this builder.
     *
     * @param {DateTimeFormatter} formatter  the formatter to add, not null
     * @return {DateTimeFormatterBuilder} this, for chaining, not null
     */
    append(formatter) {
        requireNonNull(formatter, 'formatter');
        this._appendInternal(formatter._toPrinterParser(false));
        return this;
    }

    /**
     * Completes this builder by creating the DateTimeFormatter.
     *
     * This will create a formatter with the specified locale.
     * Numbers will be printed and parsed using the standard non-localized set of symbols.
     *
     * Calling this method will end any open optional sections by repeatedly
     * calling {@link optionalEnd} before creating the formatter.
     *
     * This builder can still be used after creating the formatter if desired,
     * although the state may have been changed by calls to `optionalEnd`.
     *
     * @param resolverStyle  the new resolver style
     * @return the created formatter, not null
     */
    toFormatter(resolverStyle=ResolverStyle.SMART) {
        while (this._active._parent != null) {
            this.optionalEnd();
        }
        const pp = new CompositePrinterParser(this._printerParsers, false);
        return new DateTimeFormatter(pp, null, DecimalStyle.STANDARD, resolverStyle, null, null, null);
    }

}

// days in a 400 year cycle = 146097
// days in a 10,000 year cycle = 146097 * 25
// seconds per day = 86400
const SECONDS_PER_10000_YEARS = 146097 * 25 * 86400;
const SECONDS_0000_TO_1970 = ((146097 * 5) - (30 * 365 + 7)) * 86400;

/**
 * Prints or parses an ISO-8601 instant.
 */
class InstantPrinterParser  {

    constructor(fractionalDigits) {
        this.fractionalDigits = fractionalDigits;
    }

    print(context, buf) {
        // use INSTANT_SECONDS, thus this code is not bound by Instant.MAX
        const inSecs = context.getValue(ChronoField.INSTANT_SECONDS);
        let inNanos = 0;
        if (context.temporal().isSupported(ChronoField.NANO_OF_SECOND)) {
            inNanos = context.temporal().getLong(ChronoField.NANO_OF_SECOND);
        }
        if (inSecs == null) {
            return false;
        }
        const inSec = inSecs;
        let inNano = ChronoField.NANO_OF_SECOND.checkValidIntValue(inNanos);
        if (inSec >= -SECONDS_0000_TO_1970) {
            // current era
            const zeroSecs = inSec - SECONDS_PER_10000_YEARS + SECONDS_0000_TO_1970;
            const hi = MathUtil.floorDiv(zeroSecs, SECONDS_PER_10000_YEARS) + 1;
            const lo = MathUtil.floorMod(zeroSecs, SECONDS_PER_10000_YEARS);
            const ldt = LocalDateTime.ofEpochSecond(lo - SECONDS_0000_TO_1970, 0, ZoneOffset.UTC);
            if (hi > 0) {
                buf.append('+').append(hi);
            }
            buf.append(ldt.toString());
            if (ldt.second() === 0) {
                buf.append(':00');
            }
        } else {
            // before current era
            const zeroSecs = inSec + SECONDS_0000_TO_1970;
            const hi = MathUtil.intDiv(zeroSecs, SECONDS_PER_10000_YEARS);
            const lo = MathUtil.intMod(zeroSecs, SECONDS_PER_10000_YEARS);
            const ldt = LocalDateTime.ofEpochSecond(lo - SECONDS_0000_TO_1970, 0, ZoneOffset.UTC);
            const pos = buf.length();
            buf.append(ldt.toString());
            if (ldt.second() === 0) {
                buf.append(':00');
            }
            if (hi < 0) {
                if (ldt.year() === -10000) {
                    buf.replace(pos, pos + 2, `${hi - 1}`);
                } else if (lo === 0) {
                    buf.insert(pos, hi);
                } else {
                    buf.insert(pos + 1, Math.abs(hi));
                }
            }
        }
        //fraction
        if (this.fractionalDigits === -2) {
            if (inNano !== 0) {
                buf.append('.');
                if (MathUtil.intMod(inNano, 1000000) === 0) {
                    buf.append((`${MathUtil.intDiv(inNano, 1000000) + 1000}`).substring(1));
                } else if (MathUtil.intMod(inNano, 1000) === 0) {
                    buf.append((`${MathUtil.intDiv(inNano, 1000) + 1000000}`).substring(1));
                } else {
                    buf.append((`${(inNano) + 1000000000}`).substring(1));
                }
            }
        } else if (this.fractionalDigits > 0 || (this.fractionalDigits === -1 && inNano > 0)) {
            buf.append('.');
            let div = 100000000;
            for (let i = 0; ((this.fractionalDigits === -1 && inNano > 0) || i < this.fractionalDigits); i++) {
                const digit = MathUtil.intDiv(inNano, div);
                buf.append(digit);
                inNano = inNano - (digit * div);
                div = MathUtil.intDiv(div, 10);
            }
        }
        buf.append('Z');
        return true;
    }

    parse(context, text, position) {
        // new context to avoid overwriting fields like year/month/day
        const newContext = context.copy();
        const minDigits = (this.fractionalDigits < 0 ? 0 : this.fractionalDigits);
        const maxDigits = (this.fractionalDigits < 0 ? 9 : this.fractionalDigits);
        const parser = new DateTimeFormatterBuilder()
            .append(DateTimeFormatter.ISO_LOCAL_DATE).appendLiteral('T')
            .appendValue(ChronoField.HOUR_OF_DAY, 2).appendLiteral(':').appendValue(ChronoField.MINUTE_OF_HOUR, 2).appendLiteral(':')
            .appendValue(ChronoField.SECOND_OF_MINUTE, 2).appendFraction(ChronoField.NANO_OF_SECOND, minDigits, maxDigits, true).appendLiteral('Z')
            .toFormatter()._toPrinterParser(false);
        const pos = parser.parse(newContext, text, position);
        if (pos < 0) {
            return pos;
        }
        // parser restricts most fields to 2 digits, so definitely int
        // correctly parsed nano is also guaranteed to be valid
        const yearParsed = newContext.getParsed(ChronoField.YEAR);
        const month = newContext.getParsed(ChronoField.MONTH_OF_YEAR);
        const day = newContext.getParsed(ChronoField.DAY_OF_MONTH);
        let hour = newContext.getParsed(ChronoField.HOUR_OF_DAY);
        const min = newContext.getParsed(ChronoField.MINUTE_OF_HOUR);
        const secVal = newContext.getParsed(ChronoField.SECOND_OF_MINUTE);
        const nanoVal = newContext.getParsed(ChronoField.NANO_OF_SECOND);
        let sec = (secVal != null ? secVal : 0);
        const nano = (nanoVal != null ? nanoVal : 0);
        const year = MathUtil.intMod(yearParsed, 10000);
        let days = 0;
        if (hour === 24 && min === 0 && sec === 0 && nano === 0) {
            hour = 0;
            days = 1;
        } else if (hour === 23 && min === 59 && sec === 60) {
            context.setParsedLeapSecond();
            sec = 59;
        }
        let instantSecs;
        try {
            const ldt = LocalDateTime.of(year, month, day, hour, min, sec, 0).plusDays(days);
            instantSecs = ldt.toEpochSecond(ZoneOffset.UTC);
            instantSecs += MathUtil.safeMultiply(MathUtil.intDiv(yearParsed, 10000), SECONDS_PER_10000_YEARS);
        } catch (ex) {
            return ~position;
        }
        let successPos = pos;
        successPos = context.setParsedField(ChronoField.INSTANT_SECONDS, instantSecs, position, successPos);
        return context.setParsedField(ChronoField.NANO_OF_SECOND, nano, position, successPos);
    }

    toString() {
        return 'Instant()';
    }
}


export function _init() {
    ReducedPrinterParser.BASE_DATE = LocalDate.of(2000, 1, 1);

    DateTimeFormatterBuilder.CompositePrinterParser = CompositePrinterParser;
    DateTimeFormatterBuilder.PadPrinterParserDecorator = PadPrinterParserDecorator;
    DateTimeFormatterBuilder.SettingsParser = SettingsParser;
    DateTimeFormatterBuilder.CharLiteralPrinterParser = StringLiteralPrinterParser;
    DateTimeFormatterBuilder.StringLiteralPrinterParser = StringLiteralPrinterParser;
    DateTimeFormatterBuilder.CharLiteralPrinterParser = CharLiteralPrinterParser;
    DateTimeFormatterBuilder.NumberPrinterParser = NumberPrinterParser;
    DateTimeFormatterBuilder.ReducedPrinterParser = ReducedPrinterParser;
    DateTimeFormatterBuilder.FractionPrinterParser = FractionPrinterParser;
    DateTimeFormatterBuilder.OffsetIdPrinterParser = OffsetIdPrinterParser;
    DateTimeFormatterBuilder.ZoneIdPrinterParser = ZoneIdPrinterParser;
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { assert, requireNonNull } from '../assert';

import { DateTimeBuilder } from './DateTimeBuilder';
import { EnumMap } from './EnumMap';

import { IsoChronology } from '../chrono/IsoChronology';
import { Temporal } from '../temporal/Temporal';
import { TemporalQueries } from '../temporal/TemporalQueries';

/**
 * @private
 */
export class DateTimeParseContext{

    constructor(){
        if(arguments.length === 1){
            if(arguments[0] instanceof DateTimeParseContext){
                this._constructorSelf.apply(this, arguments);
                return;
            } else {
                this._constructorFormatter.apply(this, arguments);
            }
        } else {
            this._constructorParam.apply(this, arguments);
        }

        this._caseSensitive = true;
        this._strict = true;
        this._parsed = [new Parsed(this)];
    }

    _constructorParam(locale, symbols, chronology){
        this._locale = locale;
        this._symbols = symbols;
        this._overrideChronology = chronology;
    }

    _constructorFormatter(formatter){
        this._locale = formatter.locale();
        this._symbols = formatter.decimalStyle();
        this._overrideChronology = formatter.chronology();
    }


    _constructorSelf(other) {
        this._locale = other._locale;
        this._symbols = other._symbols;
        this._overrideChronology = other._overrideChronology;
        this._overrideZone = other._overrideZone;
        this._caseSensitive = other._caseSensitive;
        this._strict = other._strict;
        this._parsed = [new Parsed(this)];
    }

    /**
     * Creates a copy of this context.
     */
    copy() {
        return new DateTimeParseContext(this);
    }

    symbols(){
        return this._symbols;
    }

    isStrict(){
        return this._strict;
    }

    setStrict(strict){
        this._strict = strict;
    }

    locale() {
        return this._locale;
    }

    setLocale(locale) {
        this._locale = locale;
    }
    //-----------------------------------------------------------------------
    /**
     * Starts the parsing of an optional segment of the input.
     */
    startOptional() {
        this._parsed.push(this.currentParsed().copy());
    }

    /**
     * Ends the parsing of an optional segment of the input.
     *
     * @param {boolean} successful  whether the optional segment was successfully parsed
     */
    endOptional(successful) {
        if (successful) {
            this._parsed.splice(this._parsed.length - 2, 1);
        } else {
            this._parsed.splice(this._parsed.length - 1, 1);
        }
    }

    /**
     * Checks if parsing is case sensitive.
     *
     * @return true if parsing is case sensitive, false if case insensitive
     */
    isCaseSensitive() {
        return this._caseSensitive;
    }

    /**
     * Sets whether the parsing is case sensitive or not.
     *
     * @param caseSensitive  changes the parsing to be case sensitive or not from now on
     */
    setCaseSensitive(caseSensitive) {
        this._caseSensitive = caseSensitive;
    }

    /**
     * Helper to compare two {@link CharSequence} instances.
     * This uses {@link isCaseSensitive}.
     *
     * @param cs1  the first character sequence, not null
     * @param offset1  the offset into the first sequence, valid
     * @param cs2  the second character sequence, not null
     * @param offset2  the offset into the second sequence, valid
     * @param length  the length to check, valid
     * @return true if equal
     */
    subSequenceEquals(cs1, offset1, cs2, offset2, length) {
        if (offset1 + length > cs1.length || offset2 + length > cs2.length) {
            return false;
        }
        if (! this.isCaseSensitive()) {
            cs1 = cs1.toLowerCase();
            cs2 = cs2.toLowerCase();
        }
        for (let i = 0; i < length; i++) {
            const ch1 = cs1[offset1 + i];
            const ch2 = cs2[offset2 + i];
            if (ch1 !== ch2) {
                return false;
            }
        }
        return true;
    }

    /**
     * Helper to compare two `char`.
     * This uses {@link isCaseSensitive}.
     *
     * @param ch1  the first character
     * @param ch2  the second character
     * @return true if equal
     */
    charEquals(ch1, ch2) {
        if (this.isCaseSensitive()) {
            return ch1 === ch2;
        }
        return this.charEqualsIgnoreCase(ch1, ch2);
    }

    /**
     * Compares two characters ignoring case.
     *
     * @param c1  the first
     * @param c2  the second
     * @return true if equal
     */
    charEqualsIgnoreCase(c1, c2) {
        return c1 === c2 ||
                c1.toLowerCase() === c2.toLowerCase();
    }

    setParsedField(field, value, errorPos, successPos){
        const currentParsedFieldValues = this.currentParsed().fieldValues;
        const old = currentParsedFieldValues.get(field);
        currentParsedFieldValues.set(field, value);
        return (old != null && old !== value) ? ~errorPos : successPos;
    }

    /**
     * Stores the parsed zone.
     *
     * This stores the zone that has been parsed.
     * No validation is performed other than ensuring it is not null.
     *
     * @param {ZoneId} zone  the parsed zone, not null
     */
    setParsedZone(zone) {
        requireNonNull(zone, 'zone');
        this.currentParsed().zone = zone;
    }

    getParsed(field) {
        return this.currentParsed().fieldValues.get(field);
    }

    toParsed() {
        return this.currentParsed();
    }

    currentParsed() {
        return this._parsed[this._parsed.length - 1];
    }

    /**
     * Stores the leap second.
     */
    setParsedLeapSecond() {
        this.currentParsed().leapSecond = true;
    }

    /**
     * Gets the effective chronology during parsing.
     *
     * @return the effective parsing chronology, not null
     */
    getEffectiveChronology() {
        let chrono = this.currentParsed().chrono;
        if (chrono == null) {
            chrono = this._overrideChronology;
            if (chrono == null) {
                chrono = IsoChronology.INSTANCE;
            }
        }
        return chrono;
    }


}

class Parsed extends Temporal {
    constructor(dateTimeParseContext){
        super();
        this.chrono = null;
        this.zone = null;
        this.fieldValues = new EnumMap();
        this.leapSecond = false;
        this.dateTimeParseContext = dateTimeParseContext;
    }

    copy() {
        const cloned = new Parsed();
        cloned.chrono = this.chrono;
        cloned.zone = this.zone;
        cloned.fieldValues.putAll(this.fieldValues);
        cloned.leapSecond = this.leapSecond;
        cloned.dateTimeParseContext = this.dateTimeParseContext;
        return cloned;
    }

    toString() {
        return `${this.fieldValues}, ${this.chrono}, ${this.zone}`;
    }

    isSupported(field) {
        return this.fieldValues.containsKey(field);
    }

    get(field) {
        const val = this.fieldValues.get(field);
        assert(val != null);
        return val;
    }

    query(query) {
        if (query === TemporalQueries.chronology()) {
            return this.chrono;
        }
        if (query === TemporalQueries.zoneId() || query === TemporalQueries.zone()) {
            return this.zone;
        }
        return super.query(query);
    }

    toBuilder() {
        const builder = new DateTimeBuilder();
        builder.fieldValues.putAll(this.fieldValues);
        builder.chrono = this.dateTimeParseContext.getEffectiveChronology();
        if (this.zone != null) {
            builder.zone = this.zone;
        } else {
            builder.zone = this.overrideZone;
        }
        builder.leapSecond = this.leapSecond;
        builder.excessDays = this.excessDays;
        return builder;
    }
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { DateTimeException } from '../errors';

import { DateTimeFormatter } from './DateTimeFormatter';

/**
 * @private
 */
export class DateTimePrintContext{
    /**
     *
     * @param {TemporalAccessor} temporal
     * @param {DateTimeFormatter|Locale} localeOrFormatter
     * @param {DecimalStyle} symbols
     */
    constructor(temporal, localeOrFormatter, symbols) {
        if(arguments.length === 2 && arguments[1] instanceof DateTimeFormatter){
            this._temporal = DateTimePrintContext.adjust(temporal, localeOrFormatter);
            this._locale = localeOrFormatter.locale();
            this._symbols = localeOrFormatter.decimalStyle();
        } else {
            this._temporal = temporal;
            this._locale = localeOrFormatter;
            this._symbols = symbols;
        }
        this._optional = 0;
    }

    /**
     *
     * @param {TemporalAccessor} temporal
     * @param {DateTimeFormatter} formatter
     * @returns {TemporalAccessor}
     */
    // eslint-disable-next-line no-unused-vars
    static adjust(temporal, formatter) {
        // TODO implement
        return temporal;
    }


    symbols(){
        return this._symbols;
    }

    /**
     * Starts the printing of an optional segment of the input.
     */
    startOptional() {
        this._optional++;
    }

    /**
     * Ends the printing of an optional segment of the input.
     */
    endOptional() {
        this._optional--;
    }

    /**
     * Gets a value using a query.
     *
     * @param {TemporalQuery} query  the query to use, not null
     * @return {*} the result, null if not found and optional is true
     * @throws DateTimeException if the type is not available and the section is not optional
     */
    getValueQuery(query) {
        const result = this._temporal.query(query);
        if (result == null && this._optional === 0) {
            throw new DateTimeException(`Unable to extract value: ${this._temporal}`);
        }
        return result;
    }

    /**
     * Gets the value of the specified field.
     *
     * This will return the value for the specified field.
     *
     * @param field  the field to find, not null
     * @return the value, null if not found and optional is true
     * @throws DateTimeException if the field is not available and the section is not optional
     */
    getValue(field) {
        try {
            return this._temporal.getLong(field);
        } catch (ex) {
            if ((ex instanceof DateTimeException) && this._optional > 0) {
                return null;
            }
            throw ex;
        }
    }

    //-----------------------------------------------------------------------
    /**
     * Gets the temporal object being output.
     *
     * @return {TemporalAccessor} the temporal object, not null
     */
    temporal() {
        return this._temporal;
    }

    /**
     * Gets the locale.
     * <p>
     * This locale is used to control localization in the print output except
     * where localization is controlled by the symbols.
     *
     * @return the locale, not null
     */
    locale() {
        return this._locale;
    }

    //-------------------------------------------------------------------------
    // for testing
    /**
     * Sets the date-time being output.
     *
     * @param temporal  the date-time object, not null
     */
    setDateTime(temporal) {
        this._temporal = temporal;
    }

    setLocale(locale) {
        this._locale = locale;
    }


}
/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

export class DecimalStyle {
    /**
     *
     * @param zeroChar
     * @param positiveSignChar
     * @param negativeSignChar
     * @param decimalPointChar
     * @private
     */
    constructor(zeroChar, positiveSignChar, negativeSignChar, decimalPointChar) {
        this._zeroDigit = zeroChar;
        this._zeroDigitCharCode = zeroChar.charCodeAt(0);
        this._positiveSign = positiveSignChar;
        this._negativeSign = negativeSignChar;
        this._decimalSeparator = decimalPointChar;
    }

    positiveSign(){
        return this._positiveSign;
    }

    withPositiveSign(positiveSign) {
        if (positiveSign === this._positiveSign) {
            return this;
        }
        return new DecimalStyle(this._zeroDigit, positiveSign, this._negativeSign, this._decimalSeparator);
    }

    negativeSign(){
        return this._negativeSign;
    }

    withNegativeSign(negativeSign) {
        if (negativeSign === this._negativeSign) {
            return this;
        }
        return new DecimalStyle(this._zeroDigit, this._positiveSign, negativeSign, this._decimalSeparator);
    }

    zeroDigit(){
        return this._zeroDigit;
    }

    withZeroDigit(zeroDigit) {
        if (zeroDigit === this._zeroDigit) {
            return this;
        }
        return new DecimalStyle(zeroDigit, this._positiveSign, this._negativeSign, this._decimalSeparator);
    }

    decimalSeparator(){
        return this._decimalSeparator;
    }

    withDecimalSeparator(decimalSeparator) {
        if (decimalSeparator === this._decimalSeparator) {
            return this;
        }
        return new DecimalStyle(this._zeroDigit, this._positiveSign, this._negativeSign, decimalSeparator);
    }

    convertToDigit(char){
        const val = char.charCodeAt(0) - this._zeroDigitCharCode;
        return (val >= 0 && val <= 9) ? val : -1;
    }

    convertNumberToI18N(numericText) {
        if (this._zeroDigit === '0') {
            return numericText;
        }
        const diff = this._zeroDigitCharCode - '0'.charCodeAt(0);
        let convertedText = '';
        for (let i = 0; i < numericText.length; i++) {
            convertedText += String.fromCharCode(numericText.charCodeAt(i) + diff);
        }
        return convertedText;
    }

    equals(other) {
        if (this === other) {
            return true;
        }
        if (other instanceof DecimalStyle) {
            return (this._zeroDigit === other._zeroDigit && this._positiveSign === other._positiveSign &&
                this._negativeSign === other._negativeSign && this._decimalSeparator === other._decimalSeparator);
        }
        return false;
    }

    hashCode() {
        return this._zeroDigit + this._positiveSign + this._negativeSign + this._decimalSeparator;
    }

    toString() {
        return `DecimalStyle[${this._zeroDigit}${this._positiveSign}${this._negativeSign}${this._decimalSeparator}]`;
    }

    static of(){
        throw new Error('not yet supported');
    }
    static availableLocales(){
        throw new Error('not yet supported');
    }

}

DecimalStyle.STANDARD = new DecimalStyle('0', '+', '-', '.');
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

/**
 * @private
 */
export class EnumMap {
    constructor(){
        this._map = {};
    }

    putAll(otherMap){
        for(const key in otherMap._map){
            this._map[key] = otherMap._map[key];
        }
        return this;
    }

    containsKey(key){
        // eslint-disable-next-line no-prototype-builtins
        return (this._map.hasOwnProperty(key.name())) && (this.get(key) !== undefined);
    }

    get(key) {
        return this._map[key.name()];
    }

    put(key, val) {
        return this.set(key, val);
    }

    set(key, val) {
        this._map[key.name()] = val;
        return this;
    }

    retainAll(keyList){
        const map = {};
        for(let i=0; i<keyList.length; i++){
            const key = keyList[i].name();
            map[key] = this._map[key];
        }
        this._map = map;
        return this;
    }

    /**
     * due to the bad performance of delete we just set the key entry to undefined.
     *
     * this might lead to issues with "null" entries. Calling clear in the end might solve the issue
     * @param key
     * @returns {*}
     */
    remove(key){
        const keyName = key.name();
        const val = this._map[keyName];
        this._map[keyName] = undefined;
        return val;
    }

    keySet(){
        return this._map;
    }

    clear(){
        this._map = {};
    }
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

/**
 * @private
 */
export class ParsePosition {
    constructor(index) {
        this._index = index;
        this._errorIndex = -1;
    }

    getIndex(){
        return this._index;
    }

    setIndex(index){
        this._index = index;
    }

    getErrorIndex(){
        return this._errorIndex;
    }

    setErrorIndex(errorIndex){
        this._errorIndex = errorIndex;
    }
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { Enum } from '../Enum';

/**
 * Enumeration of different ways to resolve dates and times.
 * 
 * Parsing a text string occurs in two phases.
 * Phase 1 is a basic text parse according to the fields added to the builder.
 * Phase 2 resolves the parsed field-value pairs into date and/or time objects.
 * This style is used to control how phase 2, resolving, happens.
 *
 * ### Static properties of Class {@link DateTimeFormatter}
 *
 * ResolverStyle.STRICT = new ResolverStyle('STRICT');
 *
 * Style to resolve dates and times strictly.
 *
 * Using strict resolution will ensure that all parsed values are within
 * the outer range of valid values for the field. Individual fields may
 * be further processed for strictness.
 *
 * For example, resolving year-month and day-of-month in the ISO calendar
 * system using strict mode will ensure that the day-of-month is valid
 * for the year-month, rejecting invalid values.
 *
 * ResolverStyle.SMART = new ResolverStyle('SMART');
 *
 * Style to resolve dates and times in a smart, or intelligent, manner.
 *
 * Using smart resolution will perform the sensible default for each
 * field, which may be the same as strict, the same as lenient, or a third
 * behavior. Individual fields will interpret this differently.
 *
 * For example, resolving year-month and day-of-month in the ISO calendar
 * system using smart mode will ensure that the day-of-month is from
 * 1 to 31, converting any value beyond the last valid day-of-month to be
 * the last valid day-of-month.
 *
 * ResolverStyle.LENIENT = new ResolverStyle('LENIENT');
 *
 * Style to resolve dates and times leniently.
 *
 * Using lenient resolution will resolve the values in an appropriate
 * lenient manner. Individual fields will interpret this differently.
 *
 * For example, lenient mode allows the month in the ISO calendar system
 * to be outside the range 1 to 12.
 * For example, month 15 is treated as being 3 months after month 12.
 *
 */
export class ResolverStyle extends Enum {}

/**
 * Style to resolve dates and times strictly.
 * 
 * Using strict resolution will ensure that all parsed values are within
 * the outer range of valid values for the field. Individual fields may
 * be further processed for strictness.
 * 
 * For example, resolving year-month and day-of-month in the ISO calendar
 * system using strict mode will ensure that the day-of-month is valid
 * for the year-month, rejecting invalid values.
 */
ResolverStyle.STRICT = new ResolverStyle('STRICT');
/**
 * Style to resolve dates and times in a smart, or intelligent, manner.
 * 
 * Using smart resolution will perform the sensible default for each
 * field, which may be the same as strict, the same as lenient, or a third
 * behavior. Individual fields will interpret this differently.
 * 
 * For example, resolving year-month and day-of-month in the ISO calendar
 * system using smart mode will ensure that the day-of-month is from
 * 1 to 31, converting any value beyond the last valid day-of-month to be
 * the last valid day-of-month.
 */
ResolverStyle.SMART = new ResolverStyle('SMART');
/**
 * Style to resolve dates and times leniently.
 * 
 * Using lenient resolution will resolve the values in an appropriate
 * lenient manner. Individual fields will interpret this differently.
 * 
 * For example, lenient mode allows the month in the ISO calendar system
 * to be outside the range 1 to 12.
 * For example, month 15 is treated as being 3 months after month 12.
 */
ResolverStyle.LENIENT = new ResolverStyle('LENIENT');
/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { Enum } from '../Enum';

export class SignStyle extends Enum{
    /**
     * Parse helper.
     *
     * @param positive  true if positive sign parsed, false for negative sign
     * @param strict  true if strict, false if lenient
     * @param fixedWidth  true if fixed width, false if not
     * @return true if valid
     */
    parse(positive, strict, fixedWidth){
        switch (this) {
            case SignStyle.NORMAL: // NORMAL
                // valid if negative or (positive and lenient)
                return !positive || !strict;
            case SignStyle.ALWAYS: // ALWAYS
            case SignStyle.EXCEEDS_PAD: // EXCEEDS_PAD
                return true;
            default:
                // valid if lenient and not fixed width
                return !strict && !fixedWidth;
        }

    }
}

SignStyle.NORMAL = new SignStyle('NORMAL');
SignStyle.NEVER = new SignStyle('NEVER');
SignStyle.ALWAYS = new SignStyle('ALWAYS');
SignStyle.EXCEEDS_PAD = new SignStyle('EXCEEDS_PAD');
SignStyle.NOT_NEGATIVE = new SignStyle('NOT_NEGATIVE');
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

/**
 * @private
 */
export class StringBuilder {
    constructor(){
        this._str = '';
    }

    append(str){
        this._str += str;
        return this;
    }

    appendChar(str){
        this._str += str[0];
        return this;
    }

    insert(offset, str){
        this._str = this._str.slice(0, offset) + str + this._str.slice(offset);
        return this;
    }

    replace(start, end, str){
        this._str = this._str.slice(0, start) + str + this._str.slice(end);
        return this;
    }

    length(){
        return this._str.length;
    }

    setLength(length){
        this._str = this._str.slice(0, length);
        return this;
    }


    toString() {
        return this._str;
    }
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE.md in the root directory of this source tree)
 */

import { Enum } from '../Enum';

/**
 * Enumeration of the style of text formatting and parsing.
 *
 * Text styles define three sizes for the formatted text - 'full', 'short' and 'narrow'.
 * Each of these three sizes is available in both 'standard' and 'stand-alone' variations.
 *
 * The difference between the three sizes is obvious in most languages.
 * For example, in English the 'full' month is 'January', the 'short' month is 'Jan'
 * and the 'narrow' month is 'J'. Note that the narrow size is often not unique.
 * For example, 'January', 'June' and 'July' all have the 'narrow' text 'J'.
 *
 * The difference between the 'standard' and 'stand-alone' forms is trickier to describe
 * as there is no difference in English. However, in other languages there is a difference
 * in the word used when the text is used alone, as opposed to in a complete date.
 * For example, the word used for a month when used alone in a date picker is different
 * to the word used for month in association with a day and year in a date.
 *
 * ### Specification for implementors
 *
 * This is immutable and thread-safe enum.
 */
export class TextStyle extends Enum {
    /**
     * Checks if the style is stand-alone.
     *
     * @return {boolean} true if the style is stand-alone
     */
    isStandalone() {
        switch (this) {
            case TextStyle.FULL_STANDALONE:
            case TextStyle.SHORT_STANDALONE:
            case TextStyle.NARROW_STANDALONE:
                return true;
            default:
                return false;
        }
    }

    /**
     * Converts the style to the equivalent stand-alone style.
     *
     * @return {TextStyle} the matching stand-alone style
     */
    asStandalone() {
        switch (this) {
            case TextStyle.FULL:
                return TextStyle.FULL_STANDALONE;
            case TextStyle.SHORT:
                return TextStyle.SHORT_STANDALONE;
            case TextStyle.NARROW:
                return TextStyle.NARROW_STANDALONE;
            default:
                // all others are already standalone
                return this;
        }
    }

    /**
     * Converts the style to the equivalent normal style.
     *
     * @return {TextStyle} the matching normal style
     */
    asNormal() {
        switch (this) {
            case TextStyle.FULL_STANDALONE:
                return TextStyle.FULL;
            case TextStyle.SHORT_STANDALONE:
                return TextStyle.SHORT;
            case TextStyle.NARROW_STANDALONE:
                return TextStyle.NARROW;
            default:
                // all others are already normal
                return this;
        }
    }
}

/**
 * Full text, typically the full description.
 * For example, day-of-week Monday might output "Monday".
 */
TextStyle.FULL = new TextStyle('FULL');
/**
 * Full text for stand-alone use, typically the full description.
 * For example, day-of-week Monday might output "Monday".
 */
TextStyle.FULL_STANDALONE = new TextStyle('FULL_STANDALONE');
/**
 * Short text, typically an abbreviation.
 * For example, day-of-week Monday might output "Mon".
 */
TextStyle.SHORT = new TextStyle('SHORT');
/**
 * Short text for stand-alone use, typically an abbreviation.
 * For example, day-of-week Monday might output "Mon".
 */
TextStyle.SHORT_STANDALONE = new TextStyle('SHORT_STANDALONE');
/**
 * Narrow text, typically a single letter.
 * For example, day-of-week Monday might output "M".
 */
TextStyle.NARROW = new TextStyle('NARROW');
/**
 * Narrow text for stand-alone use, typically a single letter.
 * For example, day-of-week Monday might output "M".
 */
TextStyle.NARROW_STANDALONE = new TextStyle('NARROW_STANDALONE');
/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { IllegalArgumentException } from '../../errors';

/**
 * Prints or parses a char literal.
 * @private
 */
export class CharLiteralPrinterParser {

    constructor(literal) {
        if (literal.length > 1) {
            throw new IllegalArgumentException(`invalid literal, too long: "${literal}"`);
        }
        this._literal = literal;
    }

    print(context, buf) {
        buf.append(this._literal);
        return true;
    }

    parse(context, text, position) {
        const length = text.length;
        if (position === length) {
            return ~position;
        }
        const ch = text.charAt(position);
        if (context.charEquals(this._literal, ch) === false) {
            return ~position;
        }
        return position + this._literal.length;
    }

    toString() {
        if (this._literal === '\'') {
            return "''";
        }
        return `'${this._literal}'`;
    }
}

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

/**
 * @private
 */
export class CompositePrinterParser {

    constructor(printerParsers, optional) {
        this._printerParsers = printerParsers;
        this._optional = optional;
    }

    /**
     * Returns a copy of this printer-parser with the optional flag changed.
     *
     * @param {boolean} optional  the optional flag to set in the copy
     * @return {CompositePrinterParser} the new printer-parser, not null
     */
    withOptional(optional) {
        if (optional === this._optional) {
            return this;
        }
        return new CompositePrinterParser(this._printerParsers, optional);
    }

    print(context, buf) {
        const length = buf.length();
        if (this._optional) {
            context.startOptional();
        }
        try {
            for (let i=0; i<this._printerParsers.length; i++) {
                const pp = this._printerParsers[i];
                if (pp.print(context, buf) === false) {
                    buf.setLength(length);  // reset buffer
                    return true;
                }
            }
        } finally {
            if (this._optional) {
                context.endOptional();
            }
        }
        return true;
    }

    parse(context, text, position) {
        if (this._optional) {
            context.startOptional();
            let pos = position;
            for (let i=0; i<this._printerParsers.length; i++) {
                const pp = this._printerParsers[i];
                pos = pp.parse(context, text, pos);
                if (pos < 0) {
                    context.endOptional(false);
                    return position;  // return original position
                }
            }
            context.endOptional(true);
            return pos;
        } else {
            for (let i=0; i<this._printerParsers.length; i++) {
                const pp = this._printerParsers[i];
                position = pp.parse(context, text, position);
                if (position < 0) {
                    break;
                }
            }
            return position;
        }
    }

    toString() {
        let buf = '';
        if (this._printerParsers != null) {
            buf += this._optional ? '[' : '(';
            for (let i=0; i<this._printerParsers.length; i++) {
                const pp = this._printerParsers[i];
                buf += pp.toString();
            }
            buf += this._optional ? ']' : ')';
        }
        return buf;
    }
}
/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { requireNonNull } from '../../assert';
import { IllegalArgumentException } from '../../errors';
import { MathUtil } from '../../MathUtil';

/**
 * TODO optimize FractionPrinterParser, fix documentation
 *
 * Prints and parses a numeric date-time field with optional padding.
 * @private
 */
export class FractionPrinterParser {

    /**
     * Constructor.
     *
     * @param {TemporalField} field  the field to output, not null
     * @param {Number} minWidth  the minimum width to output, from 0 to 9
     * @param {Number} maxWidth  the maximum width to output, from 0 to 9
     * @param {boolean} decimalPoint  whether to output the localized decimal point symbol
     */
    constructor(field, minWidth, maxWidth, decimalPoint) {
        requireNonNull(field, 'field');
        if (field.range().isFixed() === false) {
            throw new IllegalArgumentException(`Field must have a fixed set of values: ${field}`);
        }
        if (minWidth < 0 || minWidth > 9) {
            throw new IllegalArgumentException(`Minimum width must be from 0 to 9 inclusive but was ${minWidth}`);
        }
        if (maxWidth < 1 || maxWidth > 9) {
            throw new IllegalArgumentException(`Maximum width must be from 1 to 9 inclusive but was ${maxWidth}`);
        }
        if (maxWidth < minWidth) {
            throw new IllegalArgumentException(`Maximum width must exceed or equal the minimum width but ${ 
                maxWidth} < ${minWidth}`);
        }
        this.field = field;
        this.minWidth = minWidth;
        this.maxWidth = maxWidth;
        this.decimalPoint = decimalPoint;
    }

    print(context, buf) {
        const value = context.getValue(this.field);
        if (value === null) {
            return false;
        }
        const symbols = context.symbols();
        if (value === 0) {  // scale is zero if value is zero
            if (this.minWidth > 0) {
                if (this.decimalPoint) {
                    buf.append(symbols.decimalSeparator());
                }
                for (let i = 0; i < this.minWidth; i++) {
                    buf.append(symbols.zeroDigit());
                }
            }
        } else {
            let fraction = this.convertToFraction(value, symbols.zeroDigit());
            const outputScale = Math.min(Math.max(fraction.length, this.minWidth), this.maxWidth);
            fraction = fraction.substr(0, outputScale);
            if(fraction * 1 > 0 ) {
                while (fraction.length > this.minWidth && fraction[fraction.length - 1] === '0') {
                    fraction = fraction.substr(0, fraction.length - 1);
                }
            }
            let str = fraction;
            str = symbols.convertNumberToI18N(str);
            if (this.decimalPoint) {
                buf.append(symbols.decimalSeparator());
            }
            buf.append(str);
        }
        return true;
    }

    parse(context, text, position) {
        const effectiveMin = (context.isStrict() ? this.minWidth : 0);
        const effectiveMax = (context.isStrict() ? this.maxWidth : 9);
        const length = text.length;
        if (position === length) {
            // valid if whole field is optional, invalid if minimum width
            return (effectiveMin > 0 ? ~position : position);
        }
        if (this.decimalPoint) {
            if (text[position] !== context.symbols().decimalSeparator()) {
                // valid if whole field is optional, invalid if minimum width
                return (effectiveMin > 0 ? ~position : position);
            }
            position++;
        }
        const minEndPos = position + effectiveMin;
        if (minEndPos > length) {
            return ~position;  // need at least min width digits
        }
        const maxEndPos = Math.min(position + effectiveMax, length);
        let total = 0;  // can use int because we are only parsing up to 9 digits
        let pos = position;
        while (pos < maxEndPos) {
            const ch = text.charAt(pos++);
            const digit = context.symbols().convertToDigit(ch);
            if (digit < 0) {
                if (pos < minEndPos) {
                    return ~position;  // need at least min width digits
                }
                pos--;
                break;
            }
            total = total * 10 + digit;
        }
        const moveLeft = pos - position;
        const scale = Math.pow(10, moveLeft);
        const value = this.convertFromFraction(total, scale);
        return context.setParsedField(this.field, value, position, pos);
    }

    /**
     *
     * @param {Number} value  the value to convert, must be valid for this rule
     * @param {String} zeroDigit  the character for zero
     * @return {String} the value as a fraction within the range, from 0 to 1, not null
     */
    convertToFraction(value, zeroDigit) {
        const range = this.field.range();
        range.checkValidValue(value, this.field);
        const _min = range.minimum();
        const _range = range.maximum() - _min + 1;
        const _value = value - _min;
        const _scaled = MathUtil.intDiv((_value * 1000000000),  _range);
        let fraction = `${_scaled}`;
        while(fraction.length < 9){
            fraction = zeroDigit + fraction;
        }
        return fraction;
    }

    /**
     *
     * @param {Number} total  the fraction to convert, not null
     * @param {Number} scale  the scale, not null
     * @return {Number} the value of the field, valid for this rule
     * @throws DateTimeException if the value cannot be converted
     */
    convertFromFraction(total, scale) {
        const range = this.field.range();
        const _min = range.minimum();
        const _range = range.maximum() - _min + 1;
        const _value = MathUtil.intDiv((total * _range), scale);
        return _value;
    }

    toString() {
        const decimal = (this.decimalPoint ? ',DecimalPoint' : '');
        return `Fraction(${this.field},${this.minWidth},${this.maxWidth}${decimal})`;
    }
}

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { assert } from '../../assert';
import { ArithmeticException, DateTimeException, IllegalArgumentException } from '../../errors';
import { MathUtil } from '../../MathUtil';

import { IsoChronology } from '../../chrono/IsoChronology';

import { SignStyle } from '../SignStyle';


const MAX_WIDTH = 15; // can't parse all numbers with more then 15 digits in javascript

const EXCEED_POINTS = [
    0,
    10,
    100,
    1000,
    10000,
    100000,
    1000000,
    10000000,
    100000000,
    1000000000
];

/**
 * @private
 */
export class NumberPrinterParser {

    /**
     * Constructor.
     *
     * @param field  the field to print, not null
     * @param minWidth  the minimum field width, from 1 to 19
     * @param maxWidth  the maximum field width, from minWidth to 19
     * @param signStyle  the positive/negative sign style, not null
     * @param subsequentWidth  the width of subsequent non-negative numbers, 0 or greater,
     *  -1 if fixed width due to active adjacent parsing
     */
    constructor(field, minWidth, maxWidth, signStyle, subsequentWidth=0){
        this._field = field;
        this._minWidth = minWidth;
        this._maxWidth = maxWidth;
        this._signStyle = signStyle;
        this._subsequentWidth = subsequentWidth;
    }

    field(){ return this._field;}
    minWidth(){ return this._minWidth;}
    maxWidth(){ return this._maxWidth;}
    signStyle(){ return this._signStyle;}

    withFixedWidth() {
        if (this._subsequentWidth === -1) {
            return this;
        }
        return new NumberPrinterParser(this._field, this._minWidth, this._maxWidth, this._signStyle, -1);
    }

    withSubsequentWidth(subsequentWidth) {
        return new NumberPrinterParser(this._field, this._minWidth, this._maxWidth, this._signStyle, this._subsequentWidth + subsequentWidth);
    }

    _isFixedWidth() {
        return this._subsequentWidth === -1 ||
            (this._subsequentWidth > 0 && this._minWidth === this._maxWidth && this._signStyle === SignStyle.NOT_NEGATIVE);
    }

    print(context, buf) {
        const contextValue = context.getValue(this._field);
        if (contextValue == null) {
            return false;
        }
        const value = this._getValue(context, contextValue);
        const symbols = context.symbols();
        let str = `${Math.abs(value)}`;
        if (str.length > this._maxWidth) {
            throw new DateTimeException(`Field ${this._field 
            } cannot be printed as the value ${value 
            } exceeds the maximum print width of ${this._maxWidth}`);
        }
        str = symbols.convertNumberToI18N(str);

        if (value >= 0) {
            switch (this._signStyle) {
                case SignStyle.EXCEEDS_PAD:
                    if (this._minWidth < MAX_WIDTH && value >= EXCEED_POINTS[this._minWidth]) {
                        buf.append(symbols.positiveSign());
                    }
                    break;
                case SignStyle.ALWAYS:
                    buf.append(symbols.positiveSign());
                    break;
            }
        } else {
            switch (this._signStyle) {
                case SignStyle.NORMAL:
                case SignStyle.EXCEEDS_PAD:
                case SignStyle.ALWAYS:
                    buf.append(symbols.negativeSign());
                    break;
                case SignStyle.NOT_NEGATIVE:
                    throw new DateTimeException(`Field ${this._field 
                    } cannot be printed as the value ${value 
                    } cannot be negative according to the SignStyle`);
            }
        }
        for (let i = 0; i < this._minWidth - str.length; i++) {
            buf.append(symbols.zeroDigit());
        }
        buf.append(str);
        return true;
    }

    parse(context, text, position){
        const length = text.length;
        if (position === length) {
            return ~position;
        }
        assert(position>=0 && position<length);
        const sign = text.charAt(position);  // IOOBE if invalid position
        let negative = false;
        let positive = false;
        if (sign === context.symbols().positiveSign()) {
            if (this._signStyle.parse(true, context.isStrict(), this._minWidth === this._maxWidth) === false) {
                return ~position;
            }
            positive = true;
            position++;
        } else if (sign === context.symbols().negativeSign()) {
            if (this._signStyle.parse(false, context.isStrict(), this._minWidth === this._maxWidth) === false) {
                return ~position;
            }
            negative = true;
            position++;
        } else {
            if (this._signStyle === SignStyle.ALWAYS && context.isStrict()) {
                return ~position;
            }
        }
        const effMinWidth = (context.isStrict() || this._isFixedWidth() ? this._minWidth : 1);
        const minEndPos = position + effMinWidth;
        if (minEndPos > length) {
            return ~position;
        }
        let effMaxWidth = (context.isStrict() || this._isFixedWidth() ? this._maxWidth : 9) + Math.max(this._subsequentWidth, 0);
        let total = 0;
        let pos = position;
        for (let pass = 0; pass < 2; pass++) {
            const maxEndPos = Math.min(pos + effMaxWidth, length);
            while (pos < maxEndPos) {
                const ch = text.charAt(pos++);
                const digit = context.symbols().convertToDigit(ch);
                if (digit < 0) {
                    pos--;
                    if (pos < minEndPos) {
                        return ~position;  // need at least min width digits
                    }
                    break;
                }
                if ((pos - position) > MAX_WIDTH) {
                    throw new ArithmeticException('number text exceeds length');
                } else {
                    total = total * 10 + digit;
                }
            }
            if (this._subsequentWidth > 0 && pass === 0) {
                // re-parse now we know the correct width
                const parseLen = pos - position;
                effMaxWidth = Math.max(effMinWidth, parseLen - this._subsequentWidth);
                pos = position;
                total = 0;
            } else {
                break;
            }
        }
        if (negative) {
            if (total === 0 && context.isStrict()) {
                return ~(position - 1);  // minus zero not allowed
            }
            if(total !== 0) {
                total = -total;
            }
        } else if (this._signStyle === SignStyle.EXCEEDS_PAD && context.isStrict()) {
            const parseLen = pos - position;
            if (positive) {
                if (parseLen <= this._minWidth) {
                    return ~(position - 1);  // '+' only parsed if minWidth exceeded
                }
            } else {
                if (parseLen > this._minWidth) {
                    return ~position;  // '+' must be parsed if minWidth exceeded
                }
            }
        }
        return this._setValue(context, total, position, pos);
    }

    /**
     * Gets the value to output.
     * (This is needed to allow e.g. ReducedPrinterParser to override this and change the value!
     *
     * @param context  the context
     * @param value  the value of the field, not null
     * @return the value
     * @private
     */
    _getValue(context, value) {
        return value;
    }

    /**
     * Stores the value.
     *
     * @param context  the context to store into, not null
     * @param value  the value
     * @param errorPos  the position of the field being parsed
     * @param successPos  the position after the field being parsed
     * @return the new position
     */
    _setValue(context, value, errorPos, successPos) {
        return context.setParsedField(this._field, value, errorPos, successPos);
    }

    toString() {
        if (this._minWidth === 1 && this._maxWidth === MAX_WIDTH && this._signStyle === SignStyle.NORMAL) {
            return `Value(${this._field})`;
        }
        if (this._minWidth === this._maxWidth && this._signStyle === SignStyle.NOT_NEGATIVE) {
            return `Value(${this._field},${this._minWidth})`;
        }
        return `Value(${this._field},${this._minWidth},${this._maxWidth},${this._signStyle})`;
    }

}
//-----------------------------------------------------------------------
/**
 * Prints and parses a reduced numeric date-time field.
 * @private
 */
export class ReducedPrinterParser extends NumberPrinterParser {

    /**
     * Constructor.
     *
     * @param {TemporalField} field  the field to print, validated not null
     * @param {number} width  the field width, from 1 to 10
     * @param {number} maxWidth  the field max width, from 1 to 10
     * @param {number} baseValue  the base value
     * @param {ChronoLocalDate} baseDate  the base date
     */
    constructor(field, width, maxWidth, baseValue, baseDate) {
        super(field, width, maxWidth, SignStyle.NOT_NEGATIVE);
        if (width < 1 || width > 10) {
            throw new IllegalArgumentException(`The width must be from 1 to 10 inclusive but was ${width}`);
        }
        if (maxWidth < 1 || maxWidth > 10) {
            throw new IllegalArgumentException(`The maxWidth must be from 1 to 10 inclusive but was ${maxWidth}`);
        }
        if (maxWidth < width) {
            throw new IllegalArgumentException('The maxWidth must be greater than the width');
        }
        if (baseDate === null) {
            if (field.range().isValidValue(baseValue) === false) {
                throw new IllegalArgumentException('The base value must be within the range of the field');
            }
            if ((baseValue + EXCEED_POINTS[width]) > MathUtil.MAX_SAFE_INTEGER) {
                throw new DateTimeException('Unable to add printer-parser as the range exceeds the capacity of an int');
            }
        }
        this._baseValue = baseValue;
        this._baseDate = baseDate;
    }

    /**
     *
     * @param {DateTimePrintContext} context
     * @param {number} value
     */
    _getValue(context, value) {
        const absValue = Math.abs(value);
        let baseValue = this._baseValue;
        if (this._baseDate !== null) {
            // TODO: in threetenbp the following line is used, but we dont have Chronology yet,
            // let chrono = Chronology.from(context.getTemporal());
            // so let's use IsoChronology for now
            context.temporal();
            const chrono = IsoChronology.INSTANCE;
            baseValue = chrono.date(this._baseDate).get(this._field);
        }
        if (value >= baseValue && value < baseValue + EXCEED_POINTS[this._minWidth]) {
            return absValue % EXCEED_POINTS[this._minWidth];
        }
        return absValue % EXCEED_POINTS[this._maxWidth];
    }

    /**
     *
     * @param {DateTimeParseContext} context
     * @param {number} value
     * @param {number} errorPos
     * @param {number} successPos
     */
    _setValue(context, value, errorPos, successPos) {
        let baseValue = this._baseValue;
        if (this._baseDate != null) {
            const chrono = context.getEffectiveChronology();
            baseValue = chrono.date(this._baseDate).get(this._field);
            // TODO: not implemented??
            // context.addChronologyChangedParser(this, value, errorPos, successPos);
        }
        const parseLen = successPos - errorPos;
        if (parseLen === this._minWidth && value >= 0) {
            const range = EXCEED_POINTS[this._minWidth];
            const lastPart = baseValue % range;
            const basePart = baseValue - lastPart;
            if (baseValue > 0) {
                value = basePart + value;
            } else {
                value = basePart - value;
            }
            if (value < baseValue) {
                value += range;
            }
        }
        return context.setParsedField(this._field, value, errorPos, successPos);
    }

    withFixedWidth() {
        if (this._subsequentWidth === -1) {
            return this;
        }
        return new ReducedPrinterParser(this._field, this._minWidth, this._maxWidth, this._baseValue, this._baseDate, -1);
    }

    /**
     *
     * @param {number} subsequentWidth
     * @returns {ReducedPrinterParser}
     */
    withSubsequentWidth(subsequentWidth) {
        return new ReducedPrinterParser(this._field, this._minWidth, this._maxWidth, this._baseValue, this._baseDate,
            this._subsequentWidth + subsequentWidth);
    }

    /**
     *
     * @param {DateTimeParseContext} context
     */
    isFixedWidth(context) {
        if (context.isStrict() === false) {
            return false;
        }
        return super.isFixedWidth(context);
    }

    toString() {
        return `ReducedValue(${this._field},${this._minWidth},${this._maxWidth},${this._baseDate != null ? this._baseDate : this._baseValue})`;
    }
}

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { requireNonNull } from '../../assert';
import { IllegalArgumentException } from '../../errors';
import { MathUtil } from '../../MathUtil';

import { ChronoField } from '../../temporal/ChronoField';

//-----------------------------------------------------------------------
const PATTERNS = [
    '+HH', '+HHmm', '+HH:mm', '+HHMM', '+HH:MM', '+HHMMss', '+HH:MM:ss', '+HHMMSS', '+HH:MM:SS'
];
/**
 * Prints or parses an offset ID.
 * @private
 */
export class OffsetIdPrinterParser  {

    /**
     * Constructor.
     *
     * @param {string} noOffsetText  the text to use for UTC, not null
     * @param {string} pattern  the pattern
     */
    constructor(noOffsetText, pattern) {
        requireNonNull(noOffsetText, 'noOffsetText');
        requireNonNull(pattern, 'pattern');
        this.noOffsetText = noOffsetText;
        this.type = this._checkPattern(pattern);
    }

    /**
     * @param {String} pattern
     * @return {number}
     */
    _checkPattern(pattern) {
        for (let i = 0; i < PATTERNS.length; i++) {
            if (PATTERNS[i] === pattern) {
                return i;
            }
        }
        throw new IllegalArgumentException(`Invalid zone offset pattern: ${pattern}`);
    }

    /**
     * @param {DateTimePrintContext} context
     * @param {StringBuilder} buf
     * @return {boolean}
     */
    print(context, buf) {
        const offsetSecs = context.getValue(ChronoField.OFFSET_SECONDS);
        if (offsetSecs == null) {
            return false;
        }
        const totalSecs = MathUtil.safeToInt(offsetSecs);
        if (totalSecs === 0) {
            buf.append(this.noOffsetText);
        } else {
            const absHours = Math.abs(MathUtil.intMod(MathUtil.intDiv(totalSecs, 3600), 100));  // anything larger than 99 silently dropped
            const absMinutes = Math.abs(MathUtil.intMod(MathUtil.intDiv(totalSecs, 60), 60));
            const absSeconds = Math.abs(MathUtil.intMod(totalSecs, 60));
            const bufPos = buf.length();
            let output = absHours;
            buf.append(totalSecs < 0 ? '-' : '+')
                .appendChar((`${MathUtil.intDiv(absHours, 10)}0`)).appendChar(`${MathUtil.intMod(absHours, 10)}0`);
            if (this.type >= 3 || (this.type >= 1 && absMinutes > 0)) {
                buf.append((this.type % 2) === 0 ? ':' : '')
                    .appendChar((`${MathUtil.intDiv(absMinutes, 10)}0`)).appendChar((`${absMinutes % 10}0`));
                output += absMinutes;
                if (this.type >= 7 || (this.type >= 5 && absSeconds > 0)) {
                    buf.append((this.type % 2) === 0 ? ':' : '')
                        .appendChar((`${MathUtil.intDiv(absSeconds, 10)}0`)).appendChar((`${absSeconds % 10}0`));
                    output += absSeconds;
                }
            }
            if (output === 0) {
                buf.setLength(bufPos);
                buf.append(this.noOffsetText);
            }
        }
        return true;
    }

    /**
     * @param {DateTimeParseContext} context
     * @param {String} text
     * @param {number} position
     * @return {number}
     */
    parse(context, text, position) {
        const length = text.length;
        const noOffsetLen = this.noOffsetText.length;
        if (noOffsetLen === 0) {
            if (position === length) {
                return context.setParsedField(ChronoField.OFFSET_SECONDS, 0, position, position);
            }
        } else {
            if (position === length) {
                return ~position;
            }
            if (context.subSequenceEquals(text, position, this.noOffsetText, 0, noOffsetLen)) {
                return context.setParsedField(ChronoField.OFFSET_SECONDS, 0, position, position + noOffsetLen);
            }
        }

        // parse normal plus/minus offset
        const sign = text[position];  // IOOBE if invalid position
        if (sign === '+' || sign === '-') {
            // starts
            const negative = (sign === '-' ? -1 : 1);
            const array = [0,0,0,0];
            array[0] = position + 1;
            if ((this._parseNumber(array, 1, text, true) ||
                this._parseNumber(array, 2, text, this.type >=3) ||
                this._parseNumber(array, 3, text, false)) === false) {
                // success
                const offsetSecs = MathUtil.safeZero(negative * (array[1] * 3600 + array[2] * 60 + array[3]));
                return context.setParsedField(ChronoField.OFFSET_SECONDS, offsetSecs, position, array[0]);
            }
        }
        // handle special case of empty no offset text
        if (noOffsetLen === 0) {
            return context.setParsedField(ChronoField.OFFSET_SECONDS, 0, position, position + noOffsetLen);
        }
        return ~position;
    }

    /**
     * Parse a two digit zero-prefixed number.
     *
     * @param {number[]} array  the array of parsed data, 0=pos,1=hours,2=mins,3=secs, not null
     * @param {number} arrayIndex  the index to parse the value into
     * @param {string} parseText  the offset ID, not null
     * @param {boolean} required  whether this number is required
     * @return {boolean} true if an error occurred
     */
    _parseNumber(array, arrayIndex, parseText, required) {
        if ((this.type + 3) / 2 < arrayIndex) {
            return false;  // ignore seconds/minutes
        }
        let pos = array[0];
        if ((this.type % 2) === 0 && arrayIndex > 1) {
            if (pos + 1 > parseText.length || parseText[pos] !== ':') {
                return required;
            }
            pos++;
        }
        if (pos + 2 > parseText.length) {
            return required;
        }
        const ch1 = parseText[pos++];
        const ch2 = parseText[pos++];
        if (ch1 < '0' || ch1 > '9' || ch2 < '0' || ch2 > '9') {
            return required;
        }
        const value = (ch1.charCodeAt(0) - 48) * 10 + (ch2.charCodeAt(0) - 48);
        if (value < 0 || value > 59) {
            return required;
        }
        array[arrayIndex] = value;
        array[0] = pos;
        return false;
    }


    toString() {
        const converted = this.noOffsetText.replace('\'', '\'\'');
        return `Offset(${PATTERNS[this.type]},'${converted}')`;
    }
}
OffsetIdPrinterParser.INSTANCE_ID = new OffsetIdPrinterParser('Z', '+HH:MM:ss');
OffsetIdPrinterParser.PATTERNS = PATTERNS;

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { assert } from '../../assert';

import { DateTimeException } from '../../errors';

/**
 * Pads the output to a fixed width.
 * @private
 */
export class PadPrinterParserDecorator {

    /**
     * Constructor.
     *
     * @param printerParser  the printer, not null
     * @param padWidth  the width to pad to, 1 or greater
     * @param padChar  the pad character
     */
    constructor(printerParser, padWidth, padChar) {
        // input checked by DateTimeFormatterBuilder
        this._printerParser = printerParser;
        this._padWidth = padWidth;
        this._padChar = padChar;
    }

    print(context, buf) {
        const preLen = buf.length();
        if (this._printerParser.print(context, buf) === false) {
            return false;
        }
        const len = buf.length() - preLen;
        if (len > this._padWidth) {
            throw new DateTimeException(
                `Cannot print as output of ${len} characters exceeds pad width of ${this._padWidth}`);
        }
        for (let i = 0; i < this._padWidth - len; i++) {
            buf.insert(preLen, this._padChar);
        }
        return true;
    }

    parse(context, text, position) {
        // cache context before changed by decorated parser
        const strict = context.isStrict();
        const caseSensitive = context.isCaseSensitive();
        // parse
        assert(!(position > text.length));
        assert(position >= 0);
        if (position === text.length) {
            return ~position;  // no more characters in the string
        }
        let endPos = position + this._padWidth;
        if (endPos > text.length) {
            if (strict) {
                return ~position;  // not enough characters in the string to meet the parse width
            }
            endPos = text.length;
        }
        let pos = position;
        while (pos < endPos &&
        (caseSensitive ? text[pos] === this._padChar : context.charEquals(text[pos], this._padChar))) {
            pos++;
        }
        text = text.substring(0, endPos);
        const resultPos = this._printerParser.parse(context, text, pos);
        if (resultPos !== endPos && strict) {
            return ~(position + pos);  // parse of decorated field didn't parse to the end
        }
        return resultPos;
    }

    toString() {
        return `Pad(${this._printerParser},${this._padWidth}${(this._padChar === ' ' ? ')' : `,'${this._padChar}')`)}`;
    }
}

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { Enum } from '../../Enum';

/**
 * @private
 */
export class SettingsParser extends Enum {

    print(/*context, buf*/) {
        return true;  // nothing to do here
    }

    parse(context, text, position) {
        // using ordinals to avoid javac synthetic inner class
        switch (this) {
            case SettingsParser.SENSITIVE:   context.setCaseSensitive(true); break;
            case SettingsParser.INSENSITIVE: context.setCaseSensitive(false); break;
            case SettingsParser.STRICT:      context.setStrict(true); break;
            case SettingsParser.LENIENT:     context.setStrict(false); break;
        }
        return position;
    }

    toString() {
        // using ordinals to avoid javac synthetic inner class
        switch (this) {
            case SettingsParser.SENSITIVE:   return 'ParseCaseSensitive(true)';
            case SettingsParser.INSENSITIVE: return 'ParseCaseSensitive(false)';
            case SettingsParser.STRICT:      return 'ParseStrict(true)';
            case SettingsParser.LENIENT:     return 'ParseStrict(false)';
        }
    }
}

SettingsParser.SENSITIVE = new SettingsParser('SENSITIVE');
SettingsParser.INSENSITIVE = new SettingsParser('INSENSITIVE');
SettingsParser.STRICT = new SettingsParser('STRICT');
SettingsParser.LENIENT = new SettingsParser('LENIENT');

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { assert } from '../../assert';

/**
 * Prints or parses a string literal.
 * @private
 */
export class StringLiteralPrinterParser {

    constructor(literal) {
        this._literal = literal;
    }

    print(context, buf) {
        buf.append(this._literal);
        return true;
    }

    parse(context, text, position) {
        const length = text.length;
        assert(!(position > length || position < 0));

        if (context.subSequenceEquals(text, position, this._literal, 0, this._literal.length) === false) {
            return ~position;
        }
        return position + this._literal.length;
    }

    toString() {
        const converted = this._literal.replace("'", "''");
        return `'${converted}'`;
    }
}

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { ZoneOffset } from '../../ZoneOffset';
import { ZoneId } from '../../ZoneId';
import { ZoneRegion } from '../../ZoneRegion';

import { ChronoField } from '../../temporal/ChronoField';

import { ZoneRulesProvider } from '../../zone/ZoneRulesProvider';

import { OffsetIdPrinterParser } from './OffsetIdPrinterParser';

/**
 * Prints or parses a zone ID.
 * @private
 */
export class ZoneIdPrinterParser {

    /**
     *
     * @param {TemporalQuery} query
     * @param {string} description
     */
    constructor(query, description) {
        this.query = query;
        this.description = description;
    }

    //-----------------------------------------------------------------------
    /**
     *
     * @param {DateTimePrintContext } context
     * @param {StringBuilder} buf
     * @returns {boolean}
     */
    print(context, buf) {
        const zone = context.getValueQuery(this.query);
        if (zone == null) {
            return false;
        }
        buf.append(zone.id());
        return true;
    }

    //-----------------------------------------------------------------------
    /**
     * This implementation looks for the longest matching string.
     * For example, parsing Etc/GMT-2 will return Etc/GMC-2 rather than just
     * Etc/GMC although both are valid.
     *
     * This implementation uses a tree to search for valid time-zone names in
     * the parseText. The top level node of the tree has a length equal to the
     * length of the shortest time-zone as well as the beginning characters of
     * all other time-zones.
     *
     * @param {DateTimeParseContext} context
     * @param {String} text
     * @param {number} position
     * @return {number}
     */
    parse(context, text, position) {
        const length = text.length;
        if (position > length) {
            return ~position;
        }
        if (position === length) {
            return ~position;
        }

        // handle fixed time-zone IDs
        const nextChar = text.charAt(position);
        if (nextChar === '+' || nextChar === '-') {
            const newContext = context.copy();
            const endPos = OffsetIdPrinterParser.INSTANCE_ID.parse(newContext, text, position);
            if (endPos < 0) {
                return endPos;
            }
            const offset = newContext.getParsed(ChronoField.OFFSET_SECONDS);
            const zone = ZoneOffset.ofTotalSeconds(offset);
            context.setParsedZone(zone);
            return endPos;
        } else if (length >= position + 2) {
            const nextNextChar = text.charAt(position + 1);
            if (context.charEquals(nextChar, 'U') &&
                context.charEquals(nextNextChar, 'T')) {
                if (length >= position + 3 &&
                    context.charEquals(text.charAt(position + 2), 'C')) {
                    return this._parsePrefixedOffset(context, text, position, position + 3);
                }
                return this._parsePrefixedOffset(context, text, position, position + 2);
            } else if (context.charEquals(nextChar, 'G') &&
                length >= position + 3 &&
                context.charEquals(nextNextChar, 'M') &&
                context.charEquals(text.charAt(position + 2), 'T')) {
                return this._parsePrefixedOffset(context, text, position, position + 3);
            }
        }
        // javascript special case
        if(text.substr(position, 6) === 'SYSTEM'){
            context.setParsedZone(ZoneId.systemDefault());
            return position + 6;
        }

        // ...
        if (context.charEquals(nextChar, 'Z')) {
            context.setParsedZone(ZoneOffset.UTC);
            return position + 1;
        }

        const availableZoneIds = ZoneRulesProvider.getAvailableZoneIds();
        if (zoneIdTree.size !== availableZoneIds.length) {
            zoneIdTree = ZoneIdTree.createTreeMap(availableZoneIds);
        }

        const maxParseLength = length - position;
        let treeMap = zoneIdTree.treeMap;
        let parsedZoneId = null;
        let parseLength = 0;
        while(treeMap != null) {
            const parsedSubZoneId = text.substr(position, Math.min(treeMap.length, maxParseLength));
            treeMap = treeMap.get(parsedSubZoneId);
            if (treeMap != null && treeMap.isLeaf) {
                parsedZoneId = parsedSubZoneId;
                parseLength = treeMap.length;
            }
        }
        if (parsedZoneId != null) {
            context.setParsedZone(ZoneRegion.ofId(parsedZoneId));
            return position + parseLength;
        }

        return ~position;
    }

    /**
     *
     * @param {DateTimeParseContext} context
     * @param {String} text
     * @param {number} prefixPos
     * @param {number} position
     * @return {number}
     */
    _parsePrefixedOffset(context, text, prefixPos, position) {
        const prefix = text.substring(prefixPos, position).toUpperCase();
        const newContext = context.copy();
        if (position < text.length && context.charEquals(text.charAt(position), 'Z')) {
            context.setParsedZone(ZoneId.ofOffset(prefix, ZoneOffset.UTC));
            return position;
        }
        const endPos = OffsetIdPrinterParser.INSTANCE_ID.parse(newContext, text, position);
        if (endPos < 0) {
            context.setParsedZone(ZoneId.ofOffset(prefix, ZoneOffset.UTC));
            return position;
        }
        const offsetSecs = newContext.getParsed(ChronoField.OFFSET_SECONDS);
        const offset = ZoneOffset.ofTotalSeconds(offsetSecs);
        context.setParsedZone(ZoneId.ofOffset(prefix, offset));
        return endPos;
    }

    /**
     *
     * @returns {string}
     */
    toString() {
        return this.description;
    }
}

class ZoneIdTree {

    static createTreeMap(availableZoneIds) {
        const sortedZoneIds =  availableZoneIds.sort((a, b) => a.length - b.length);
        const treeMap = new ZoneIdTreeMap(sortedZoneIds[0].length, false);
        for (let i=0; i<sortedZoneIds.length; i++){
            treeMap.add(sortedZoneIds[i]);
        }
        return new ZoneIdTree(sortedZoneIds.length, treeMap);
    }

    constructor(size, treeMap) {
        this.size = size;
        this.treeMap = treeMap;
    }
}

class ZoneIdTreeMap {
    constructor(length = 0, isLeaf = false){
        this.length = length;
        this.isLeaf = isLeaf;
        this._treeMap = {};
    }

    add(zoneId){
        const idLength = zoneId.length;
        if(idLength === this.length) {
            this._treeMap[zoneId] = new ZoneIdTreeMap(idLength, true);
        } else if (idLength > this.length) {
            const subZoneId = zoneId.substr(0, this.length);
            let subTreeMap = this._treeMap[subZoneId];
            if (subTreeMap == null) {
                subTreeMap = new ZoneIdTreeMap(idLength, false);
                this._treeMap[subZoneId] = subTreeMap;
            }
            subTreeMap.add(zoneId);
        }
    }

    get(zoneId){
        return this._treeMap[zoneId];
    }
}

let zoneIdTree = new ZoneIdTree([]);/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { requireNonNull, requireInstance } from '../assert';

import { ChronoField } from '../temporal/ChronoField';
import { ChronoUnit } from '../temporal/ChronoUnit';
import { DateTimeFormatter } from '../format/DateTimeFormatter';
import { TemporalQueries } from '../temporal/TemporalQueries';
import { Temporal } from '../temporal/Temporal';

import { LocalDate } from '../LocalDate';

/**
 * A date without time-of-day or time-zone in an arbitrary chronology, intended
 * for advanced globalization use cases.
 *
 * **Most applications should declare method signatures, fields and variables
 * as {@link LocalDate}, not this interface.**
 *
 * A {@link ChronoLocalDate} is the abstract representation of a date where the
 * {@link Chronology}, or calendar system, is pluggable.
 * The date is defined in terms of fields expressed by {@link TemporalField},
 * where most common implementations are defined in {@link ChronoField}.
 * The chronology defines how the calendar system operates and the meaning of
 * the standard fields.
 *
 * #### When to use this interface
 *
 * The design of the API encourages the use of {@link LocalDate} rather than this
 * interface, even in the case where the application needs to deal with multiple
 * calendar systems. The rationale for this is explored in the following documentation.
 *
 * The primary use case where this interface should be used is where the generic
 * type parameter `C` is fully defined as a specific chronology.
 * In that case, the assumptions of that chronology are known at development
 * time and specified in the code.
 *
 * When the chronology is defined in the generic type parameter as ? or otherwise
 * unknown at development time, the rest of the discussion below applies.
 *
 * To emphasize the point, declaring a method signature, field or variable as this
 * interface type can initially seem like the sensible way to globalize an application,
 * however it is usually the wrong approach.
 * As such, it should be considered an application-wide architectural decision to choose
 * to use this interface as opposed to {@link LocalDate}.
 *
 * #### Architectural issues to consider
 *
 * These are some of the points that must be considered before using this interface
 * throughout an application.
 *
 * 1) Applications using this interface, as opposed to using just {@link LocalDate},
 * face a significantly higher probability of bugs. This is because the calendar system
 * in use is not known at development time. A key cause of bugs is where the developer
 * applies assumptions from their day-to-day knowledge of the ISO calendar system
 * to code that is intended to deal with any arbitrary calendar system.
 * The section below outlines how those assumptions can cause problems
 * The primary mechanism for reducing this increased risk of bugs is a strong code review process.
 * This should also be considered a extra cost in maintenance for the lifetime of the code.
 *
 * 2) This interface does not enforce immutability of implementations.
 * While the implementation notes indicate that all implementations must be immutable
 * there is nothing in the code or type system to enforce this. Any method declared
 * to accept a {@link ChronoLocalDate} could therefore be passed a poorly or
 * maliciously written mutable implementation.
 *
 * 3) Applications using this interface  must consider the impact of eras.
 * {@link LocalDate} shields users from the concept of eras, by ensuring that `getYear()`
 * returns the proleptic year. That decision ensures that developers can think of
 * {@link LocalDate} instances as consisting of three fields - year, month-of-year and day-of-month.
 * By contrast, users of this interface must think of dates as consisting of four fields -
 * era, year-of-era, month-of-year and day-of-month. The extra era field is frequently
 * forgotten, yet it is of vital importance to dates in an arbitrary calendar system.
 * For example, in the Japanese calendar system, the era represents the reign of an Emperor.
 * Whenever one reign ends and another starts, the year-of-era is reset to one.
 *
 * 4) The only agreed international standard for passing a date between two systems
 * is the ISO-8601 standard which requires the ISO calendar system. Using this interface
 * throughout the application will inevitably lead to the requirement to pass the date
 * across a network or component boundary, requiring an application specific protocol or format.
 *
 * 5) Long term persistence, such as a database, will almost always only accept dates in the
 * ISO-8601 calendar system (or the related Julian-Gregorian). Passing around dates in other
 * calendar systems increases the complications of interacting with persistence.
 *
 * 6) Most of the time, passing a {@link ChronoLocalDate} throughout an application
 * is unnecessary, as discussed in the last section below.
 *
 * #### False assumptions causing bugs in multi-calendar system code
 *
 * As indicated above, there are many issues to consider when try to use and manipulate a
 * date in an arbitrary calendar system. These are some of the key issues.
 *
 * Code that queries the day-of-month and assumes that the value will never be more than
 * 31 is invalid. Some calendar systems have more than 31 days in some months.
 *
 * Code that adds 12 months to a date and assumes that a year has been added is invalid.
 * Some calendar systems have a different number of months, such as 13 in the Coptic or Ethiopic.
 *
 * Code that adds one month to a date and assumes that the month-of-year value will increase
 * by one or wrap to the next year is invalid. Some calendar systems have a variable number
 * of months in a year, such as the Hebrew.
 *
 * Code that adds one month, then adds a second one month and assumes that the day-of-month
 * will remain close to its original value is invalid. Some calendar systems have a large difference
 * between the length of the longest month and the length of the shortest month.
 * For example, the Coptic or Ethiopic have 12 months of 30 days and 1 month of 5 days.
 *
 * Code that adds seven days and assumes that a week has been added is invalid.
 * Some calendar systems have weeks of other than seven days, such as the French Revolutionary.
 *
 * Code that assumes that because the year of `date1` is greater than the year of `date2`
 * then `date1` is after `date2` is invalid. This is invalid for all calendar systems
 * when referring to the year-of-era, and especially untrue of the Japanese calendar system
 * where the year-of-era restarts with the reign of every new Emperor.
 *
 * Code that treats month-of-year one and day-of-month one as the start of the year is invalid.
 * Not all calendar systems start the year when the month value is one.
 *
 * In general, manipulating a date, and even querying a date, is wide open to bugs when the
 * calendar system is unknown at development time. This is why it is essential that code using
 * this interface is subjected to additional code reviews. It is also why an architectural
 * decision to avoid this interface type is usually the correct one.
 *
 * #### Using LocalDate instead
 *
 * The primary alternative to using this interface throughout your application is as follows.
 *
 * * Declare all method signatures referring to dates in terms of {@link LocalDate}.
 * * Either store the chronology (calendar system) in the user profile or lookup the chronology
 *   from the user locale.
 * * Convert the ISO {@link LocalDate} to and from the user's preferred calendar system during
 *   printing and parsing.
 *
 * This approach treats the problem of globalized calendar systems as a localization issue
 * and confines it to the UI layer. This approach is in keeping with other localization
 * issues in the java platform.
 *
 * As discussed above, performing calculations on a date where the rules of the calendar system
 * are pluggable requires skill and is not recommended.
 * Fortunately, the need to perform calculations on a date in an arbitrary calendar system
 * is extremely rare. For example, it is highly unlikely that the business rules of a library
 * book rental scheme will allow rentals to be for one month, where meaning of the month
 * is dependent on the user's preferred calendar system.
 *
 * A key use case for calculations on a date in an arbitrary calendar system is producing
 * a month-by-month calendar for display and user interaction. Again, this is a UI issue,
 * and use of this interface solely within a few methods of the UI layer may be justified.
 *
 * In any other part of the system, where a date must be manipulated in a calendar system
 * other than ISO, the use case will generally specify the calendar system to use.
 * For example, an application may need to calculate the next Islamic or Hebrew holiday
 * which may require manipulating the date.
 * This kind of use case can be handled as follows:
 *
 * * start from the ISO {@link LocalDate} being passed to the method
 * * convert the date to the alternate calendar system, which for this use case is known
 *   rather than arbitrary
 * * perform the calculation
 * * convert back to {@link LocalDate}
 *
 * Developers writing low-level frameworks or libraries should also avoid this interface.
 * Instead, one of the two general purpose access interfaces should be used.
 * Use {@link TemporalAccessor} if read-only access is required, or use {@link Temporal}
 * if read-write access is required.
 *
 * ### Specification for implementors
 *
 * This interface must be implemented with care to ensure other classes operate correctly.
 * All implementations that can be instantiated must be final, immutable and thread-safe.
 * Subclasses should be Serializable wherever possible.
 *
 * Additional calendar systems may be added to the system.
 * See {@link Chronology} for more details.
 *
 * In JDK 8, this is an interface with default methods.
 * Since there are no default methods in JDK 7, an abstract class is used.
 */
export class ChronoLocalDate extends Temporal {

    isSupported(fieldOrUnit) {
        if (fieldOrUnit instanceof ChronoField) {
            return fieldOrUnit.isDateBased();
        } else if (fieldOrUnit instanceof ChronoUnit) {
            return fieldOrUnit.isDateBased();
        }
        return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
    }

    query(query) {
        if (query === TemporalQueries.chronology()) {
            return this.chronology();
        } else if (query === TemporalQueries.precision()) {
            return ChronoUnit.DAYS;
        } else if (query === TemporalQueries.localDate()) {
            return LocalDate.ofEpochDay(this.toEpochDay());
        } else if (query === TemporalQueries.localTime() || query === TemporalQueries.zone() ||
                query === TemporalQueries.zoneId() || query === TemporalQueries.offset()) {
            return null;
        }
        return super.query(query);
    }

    adjustInto(temporal) {
        return temporal.with(ChronoField.EPOCH_DAY, this.toEpochDay());
    }
    /**
     * Formats this date using the specified formatter.
     *
     * This date will be passed to the formatter to produce a string.
     *
     * The default implementation must behave as follows:
     * <pre>
     *  return formatter.format(this);
     * </pre>
     *
     * @param {DateTimeFormatter} formatter  the formatter to use, not null
     * @return {String} the formatted date string, not null
     * @throws DateTimeException if an error occurs during printing
     */
    format(formatter) {
        requireNonNull(formatter, 'formatter');
        requireInstance(formatter, DateTimeFormatter, 'formatter');
        return formatter.format(this);
    }
}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { requireNonNull, requireInstance } from '../assert';
import { MathUtil } from '../MathUtil';

import { LocalDate } from '../LocalDate';
import { Instant } from '../Instant';
import { ZoneOffset } from '../ZoneOffset';
import { ChronoUnit } from '../temporal/ChronoUnit';
import { ChronoField } from '../temporal/ChronoField';
import { Temporal } from '../temporal/Temporal';
import { TemporalQueries } from '../temporal/TemporalQueries';

/**
 * A date-time without a time-zone in an arbitrary chronology, intended
 * for advanced globalization use cases.
 *
 * **Most applications should declare method signatures, fields and variables
 * as {@link LocalDateTime}, not this interface.**
 *
 * A {@link ChronoLocalDateTime} is the abstract representation of a local date-time
 * where the {@link Chronology}, or calendar system, is pluggable.
 * The date-time is defined in terms of fields expressed by {@link TemporalField},
 * where most common implementations are defined in {@link ChronoField}.
 * The chronology defines how the calendar system operates and the meaning of
 * the standard fields.
 *
 * #### When to use this interface
 *
 * The design of the API encourages the use of {@link LocalDateTime} rather than this
 * interface, even in the case where the application needs to deal with multiple
 * calendar systems. The rationale for this is explored in detail in {@link ChronoLocalDate}.
 *
 * Ensure that the discussion in {@link ChronoLocalDate} has been read and understood
 * before using this interface.
 *
 * ### Specification for implementors
 *
 * This interface must be implemented with care to ensure other classes operate correctly.
 * All implementations that can be instantiated must be final, immutable and thread-safe.
 * Subclasses should be Serializable wherever possible.
 *
 * In JDK 8, this is an interface with default methods.
 * Since there are no default methods in JDK 7, an abstract class is used.
 *
 * @param D the date type
 */
export class ChronoLocalDateTime extends Temporal {
    /* <D extends ChronoLocalDate>
        extends DefaultInterfaceTemporal
        implements Temporal, TemporalAdjuster, Comparable<ChronoLocalDateTime<?>> */

    //-----------------------------------------------------------------------
    /**
     * Gets the chronology of this date-time.
     *
     * The {@link Chronology} represents the calendar system in use.
     * The era and other fields in {@link ChronoField} are defined by the chronology.
     *
     * @return the chronology, not null
     */
    chronology() {
        return this.toLocalDate().chronology();
    }

    /**
     *
     * @param {TemporalQuery} query
     * @returns {*}
     */
    query(query) {
        if (query === TemporalQueries.chronology()) {
            return this.chronology();
        } else if (query === TemporalQueries.precision()) {
            return ChronoUnit.NANOS;
        } else if (query === TemporalQueries.localDate()) {
            return LocalDate.ofEpochDay(this.toLocalDate().toEpochDay());
        } else if (query === TemporalQueries.localTime()) {
            return this.toLocalTime();
        } else if (query === TemporalQueries.zone() || query === TemporalQueries.zoneId() || query === TemporalQueries.offset()) {
            return null;
        }
        return super.query(query);
    }

    adjustInto(temporal) {
        return temporal
            .with(ChronoField.EPOCH_DAY, this.toLocalDate().toEpochDay())
            .with(ChronoField.NANO_OF_DAY, this.toLocalTime().toNanoOfDay());
    }

    //-----------------------------------------------------------------------
    /**
     * Converts this date-time to an {@link Instant}.
     *
     * This combines this local date-time and the specified offset to form
     * an {@link Instant}.
     *
     * @param {ZoneOffset} offset  the offset to use for the conversion, not null
     * @return {Instant} an {@link Instant} representing the same instant, not null
     */
    toInstant(offset) {
        requireInstance(offset, ZoneOffset, 'zoneId');
        return Instant.ofEpochSecond(this.toEpochSecond(offset), this.toLocalTime().nano());
    }

    /**
     * Converts this date-time to the number of seconds from the epoch
     * of 1970-01-01T00:00:00Z.
     *
     * This combines this local date-time and the specified offset to calculate the
     * epoch-second value, which is the number of elapsed seconds from 1970-01-01T00:00:00Z.
     * Instants on the time-line after the epoch are positive, earlier are negative.
     *
     * @param {ZoneOffset} offset  the offset to use for the conversion, not null
     * @return {number} the number of seconds from the epoch of 1970-01-01T00:00:00Z
     */
    toEpochSecond(offset) {
        requireNonNull(offset, 'offset');
        const epochDay = this.toLocalDate().toEpochDay();
        let secs = epochDay * 86400 + this.toLocalTime().toSecondOfDay();
        secs -= offset.totalSeconds();
        return MathUtil.safeToInt(secs);
    }

}
/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { requireNonNull } from '../assert';
import { Instant } from '../Instant';
import { LocalDate } from '../LocalDate';
import { MathUtil } from '../MathUtil';

import { ChronoUnit } from '../temporal/ChronoUnit';
import { Temporal } from '../temporal/Temporal';
import { TemporalQueries } from '../temporal/TemporalQueries';

export class ChronoZonedDateTime extends Temporal {
    query(query) {
        if (query === TemporalQueries.zoneId() || query === TemporalQueries.zone()) {
            return this.zone();
        } else if (query === TemporalQueries.chronology()) {
            return this.toLocalDate().chronology();
        } else if (query === TemporalQueries.precision()) {
            return ChronoUnit.NANOS;
        } else if (query === TemporalQueries.offset()) {
            return this.offset();
        } else if (query === TemporalQueries.localDate()) {
            return LocalDate.ofEpochDay(this.toLocalDate().toEpochDay());
        } else if (query === TemporalQueries.localTime()) {
            return this.toLocalTime();
        }
        return super.query(query);
    }

    /**
     * Outputs this date-time as a string using the formatter.
     *
     * @param {DateTimeFormatter} formatter - the formatter to use, not null
     * @return {string} the formatted date-time string, not null
     * @throws DateTimeException if an error occurs during printing
     */
    format(formatter) {
        requireNonNull(formatter, 'formatter');
        return formatter.format(this);
    }

    /**
     * Converts this date-time to an {@link Instant}.
     *
     * This returns an {@link Instant} representing the same point on the
     * time-line as this date-time. The calculation combines the
     * local date-time (see {@link toLocalDateTime}) and
     * offset (see {@link getOffset}).
     *
     * @return {Instant} an {@link Instant} representing the same instant, not null
     */
    toInstant() {
        return Instant.ofEpochSecond(this.toEpochSecond(), this.toLocalTime().nano());
    }

    /**
     * Converts this date-time to the number of seconds from the epoch
     * of 1970-01-01T00:00:00Z.
     *
     * This uses the local date-time (see {@link toLocalDateTime}) and
     * offset (see {@link getOffset}) to calculate the epoch-second value,
     * which is the number of elapsed seconds from 1970-01-01T00:00:00Z.
     * Instants on the time-line after the epoch are positive, earlier are negative.
     *
     * @return {number} the number of seconds from the epoch of 1970-01-01T00:00:00Z
     */
    toEpochSecond() {
        const epochDay = this.toLocalDate().toEpochDay();
        let secs = epochDay * 86400 + this.toLocalTime().toSecondOfDay();
        secs -= this.offset().totalSeconds();
        return secs;
    }

    /**
      * Compares this date-time to another date-time, including the chronology.
      *
      * The comparison is based first on the instant, then on the local date-time,
      * then on the zone ID, then on the chronology.
      * It is "consistent with equals", as defined by {@link Comparable}.
      *
      * If all the date-time objects being compared are in the same chronology, then the
      * additional chronology stage is not required.
      *
      * @param {ChronoZonedDateTime} other - the other date-time to compare to, not null
      * @return {number} the comparator value, negative if less, positive if greater
      */
    compareTo(other) {
        requireNonNull(other, 'other');
        let cmp = MathUtil.compareNumbers(this.toEpochSecond(), other.toEpochSecond());
        if (cmp === 0) {
            cmp = this.toLocalTime().nano() - other.toLocalTime().nano();
            if (cmp === 0) {
                cmp = this.toLocalDateTime().compareTo(other.toLocalDateTime());
                if (cmp === 0) {
                    cmp = strcmp(this.zone().id(), other.zone().id());
                    // we only support iso for now
                    //if (cmp === 0) {
                    //    cmp = toLocalDate().getChronology().compareTo(other.toLocalDate().getChronology());
                    //}
                }
            }
        }
        return cmp;
    }

    //-----------------------------------------------------------------------
    /**
     * Checks if the instant of this date-time is after that of the specified date-time.
     *
     * This method differs from the comparison in {@link compareTo} in that it
     * only compares the instant of the date-time. This is equivalent to using
     * `dateTime1.toInstant().isAfter(dateTime2.toInstant())`.
     *
     * @param {!ChronoZonedDateTime} other - the other date-time to compare to, not null
     * @return {boolean} true if this is after the specified date-time
     */
    isAfter(other) {
        requireNonNull(other, 'other');
        const thisEpochSec = this.toEpochSecond();
        const otherEpochSec = other.toEpochSecond();
        return thisEpochSec > otherEpochSec ||
            (thisEpochSec === otherEpochSec && this.toLocalTime().nano() > other.toLocalTime().nano());
    }

    /**
     * Checks if the instant of this date-time is before that of the specified date-time.
     *
     * This method differs from the comparison in {@link compareTo} in that it
     * only compares the instant of the date-time. This is equivalent to using
     * `dateTime1.toInstant().isBefore(dateTime2.toInstant())`.
     *
     * @param {!ChronoZonedDateTime} other - the other date-time to compare to, not null
     * @return {boolean} true if this point is before the specified date-time
     */
    isBefore(other) {
        requireNonNull(other, 'other');
        const thisEpochSec = this.toEpochSecond();
        const otherEpochSec = other.toEpochSecond();
        return thisEpochSec < otherEpochSec ||
            (thisEpochSec === otherEpochSec && this.toLocalTime().nano() < other.toLocalTime().nano());
    }

    /**
     * Checks if the instant of this date-time is equal to that of the specified date-time.
     *
     * This method differs from the comparison in {@link compareTo} and {@link equals}
     * in that it only compares the instant of the date-time. This is equivalent to using
     * `dateTime1.toInstant().equals(dateTime2.toInstant())`.
     *
     * @param {!ChronoZonedDateTime} other - the other date-time to compare to, not null
     * @return {boolean} true if the instant equals the instant of the specified date-time
     */
    isEqual(other) {
        requireNonNull(other, 'other');
        return this.toEpochSecond() === other.toEpochSecond() &&
                this.toLocalTime().nano() === other.toLocalTime().nano();
    }

    //-----------------------------------------------------------------------
    /**
     * Checks if this date-time is equal to another date-time.
     *
     * The comparison is based on the offset date-time and the zone.
     * To compare for the same instant on the time-line, use {@link compareTo}.
     * Only objects of type {@link ChronoZoneDateTime} are compared, other types return false.
     *
     * @param {*} other  the object to check, null returns false
     * @return {boolean} true if this is equal to the other date-time
     */
    equals(other) {
        if (this === other) {
            return true;
        }
        if (other instanceof ChronoZonedDateTime) {
            return this.compareTo(other) === 0;
        }
        return false;
    }

}

function strcmp(a, b){
    if (a < b) {
        return -1;
    }
    if (a > b) {
        return 1;
    }
    return 0;
}
/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

import { Enum } from '../Enum';
import { requireNonNull } from '../assert';
import { DateTimeException } from '../errors';
import { MathUtil } from '../MathUtil';

import { DayOfWeek } from '../DayOfWeek';
import { LocalDate } from '../LocalDate';
import { Month } from '../Month';
import { Year } from '../Year';

import { ChronoField } from '../temporal/ChronoField';
import { ResolverStyle } from '../format/ResolverStyle';
import { TemporalAdjusters } from '../temporal/TemporalAdjusters';

export class IsoChronology extends Enum{
    /**
     * Checks if the year is a leap year, according to the ISO proleptic
     * calendar system rules.
     *
     * This method applies the current rules for leap years across the whole time-line.
     * In general, a year is a leap year if it is divisible by four without
     * remainder. However, years divisible by 100, are not leap years, with
     * the exception of years divisible by 400 which are.
     *
     * For example, 1904 is a leap year it is divisible by 4.
     * 1900 was not a leap year as it is divisible by 100, however 2000 was a
     * leap year as it is divisible by 400.
     *
     * The calculation is proleptic - applying the same rules into the far future and far past.
     * This is historically inaccurate, but is correct for the ISO-8601 standard.
     *
     * @param {number} prolepticYear - the ISO proleptic year to check
     * @return {boolean} true if the year is leap, false otherwise
     */
    static isLeapYear(prolepticYear) {
        return ((prolepticYear & 3) === 0) && ((prolepticYear % 100) !== 0 || (prolepticYear % 400) === 0);
    }

    /**
     * Updates the map of field-values during resolution.
     *
     * @param {EnumMap} fieldValues  the fieldValues map to update, not null
     * @param {ChronoField} field  the field to update, not null
     * @param {number} value  the value to update, not null
     * @throws DateTimeException if a conflict occurs
     */
    _updateResolveMap(fieldValues, field, value) {
        // TODO: this function is in Chronology in threetenbp, maybe needs to be moved?
        requireNonNull(fieldValues, 'fieldValues');
        requireNonNull(field, 'field');
        const current = fieldValues.get(field);
        if (current != null && current !== value) {
            throw new DateTimeException(`Invalid state, field: ${field} ${current} conflicts with ${field} ${value}`);
        }
        fieldValues.put(field, value);
    }

    resolveDate(fieldValues, resolverStyle) {
        if (fieldValues.containsKey(ChronoField.EPOCH_DAY)) {
            return LocalDate.ofEpochDay(fieldValues.remove(ChronoField.EPOCH_DAY));
        }

        // normalize fields
        const prolepticMonth = fieldValues.remove(ChronoField.PROLEPTIC_MONTH);
        if (prolepticMonth != null) {
            if (resolverStyle !== ResolverStyle.LENIENT) {
                ChronoField.PROLEPTIC_MONTH.checkValidValue(prolepticMonth);
            }
            this._updateResolveMap(fieldValues, ChronoField.MONTH_OF_YEAR, MathUtil.floorMod(prolepticMonth, 12) + 1);
            this._updateResolveMap(fieldValues, ChronoField.YEAR, MathUtil.floorDiv(prolepticMonth, 12));
        }

        // eras
        const yoeLong = fieldValues.remove(ChronoField.YEAR_OF_ERA);
        if (yoeLong != null) {
            if (resolverStyle !== ResolverStyle.LENIENT) {
                ChronoField.YEAR_OF_ERA.checkValidValue(yoeLong);
            }
            const era = fieldValues.remove(ChronoField.ERA);
            if (era == null) {
                const year = fieldValues.get(ChronoField.YEAR);
                if (resolverStyle === ResolverStyle.STRICT) {
                    // do not invent era if strict, but do cross-check with year
                    if (year != null) {
                        this._updateResolveMap(fieldValues, ChronoField.YEAR, (year > 0 ? yoeLong: MathUtil.safeSubtract(1, yoeLong)));
                    } else {
                        // reinstate the field removed earlier, no cross-check issues
                        fieldValues.put(ChronoField.YEAR_OF_ERA, yoeLong);
                    }
                } else {
                    // invent era
                    this._updateResolveMap(fieldValues, ChronoField.YEAR, (year == null || year > 0 ? yoeLong: MathUtil.safeSubtract(1, yoeLong)));
                }
            } else if (era === 1) {
                this._updateResolveMap(fieldValues, ChronoField.YEAR, yoeLong);
            } else if (era === 0) {
                this._updateResolveMap(fieldValues, ChronoField.YEAR, MathUtil.safeSubtract(1, yoeLong));
            } else {
                throw new DateTimeException(`Invalid value for era: ${era}`);
            }
        } else if (fieldValues.containsKey(ChronoField.ERA)) {
            ChronoField.ERA.checkValidValue(fieldValues.get(ChronoField.ERA));  // always validated
        }

        // build date
        if (fieldValues.containsKey(ChronoField.YEAR)) {
            if (fieldValues.containsKey(ChronoField.MONTH_OF_YEAR)) {
                if (fieldValues.containsKey(ChronoField.DAY_OF_MONTH)) {
                    const y = ChronoField.YEAR.checkValidIntValue(fieldValues.remove(ChronoField.YEAR));
                    const moy = fieldValues.remove(ChronoField.MONTH_OF_YEAR);
                    let dom = fieldValues.remove(ChronoField.DAY_OF_MONTH);
                    if (resolverStyle === ResolverStyle.LENIENT) {
                        const months = moy - 1;
                        const days = dom - 1;
                        return LocalDate.of(y, 1, 1).plusMonths(months).plusDays(days);
                    } else if (resolverStyle === ResolverStyle.SMART){
                        ChronoField.DAY_OF_MONTH.checkValidValue(dom);
                        if (moy === 4 || moy === 6 || moy === 9 || moy === 11) {
                            dom = Math.min(dom, 30);
                        } else if (moy === 2) {
                            dom = Math.min(dom, Month.FEBRUARY.length(Year.isLeap(y)));
                        }
                        return LocalDate.of(y, moy, dom);
                    } else {
                        return LocalDate.of(y, moy, dom);
                    }
                }
                /*
                if (fieldValues.containsKey(ALIGNED_WEEK_OF_MONTH)) {
                    if (fieldValues.containsKey(ALIGNED_DAY_OF_WEEK_IN_MONTH)) {
                        int y = ChronoField.YEAR.checkValidIntValue(fieldValues.remove(ChronoField.YEAR));
                        if (resolverStyle == ResolverStyle.LENIENT) {
                            long months = Jdk8Methods.safeSubtract(fieldValues.remove(ChronoField.MONTH_OF_YEAR), 1);
                            long weeks = Jdk8Methods.safeSubtract(fieldValues.remove(ALIGNED_WEEK_OF_MONTH), 1);
                            long days = Jdk8Methods.safeSubtract(fieldValues.remove(ALIGNED_DAY_OF_WEEK_IN_MONTH), 1);
                            return LocalDate.of(y, 1, 1).plusMonths(months).plusWeeks(weeks).plusDays(days);
                        }
                        int moy = ChronoField.MONTH_OF_YEAR.checkValidIntValue(fieldValues.remove(ChronoField.MONTH_OF_YEAR));
                        int aw = ALIGNED_WEEK_OF_MONTH.checkValidIntValue(fieldValues.remove(ALIGNED_WEEK_OF_MONTH));
                        int ad = ALIGNED_DAY_OF_WEEK_IN_MONTH.checkValidIntValue(fieldValues.remove(ALIGNED_DAY_OF_WEEK_IN_MONTH));
                        LocalDate date = LocalDate.of(y, moy, 1).plusDays((aw - 1) * 7 + (ad - 1));
                        if (resolverStyle == ResolverStyle.STRICT && date.get(ChronoField.MONTH_OF_YEAR) != moy) {
                            throw new DateTimeException("Strict mode rejected date parsed to a different month");
                        }
                        return date;
                    }
                    if (fieldValues.containsKey(DAY_OF_WEEK)) {
                        int y = ChronoField.YEAR.checkValidIntValue(fieldValues.remove(ChronoField.YEAR));
                        if (resolverStyle == ResolverStyle.LENIENT) {
                            long months = Jdk8Methods.safeSubtract(fieldValues.remove(ChronoField.MONTH_OF_YEAR), 1);
                            long weeks = Jdk8Methods.safeSubtract(fieldValues.remove(ALIGNED_WEEK_OF_MONTH), 1);
                            long days = Jdk8Methods.safeSubtract(fieldValues.remove(DAY_OF_WEEK), 1);
                            return LocalDate.of(y, 1, 1).plusMonths(months).plusWeeks(weeks).plusDays(days);
                        }
                        int moy = ChronoField.MONTH_OF_YEAR.checkValidIntValue(fieldValues.remove(ChronoField.MONTH_OF_YEAR));
                        int aw = ALIGNED_WEEK_OF_MONTH.checkValidIntValue(fieldValues.remove(ALIGNED_WEEK_OF_MONTH));
                        int dow = DAY_OF_WEEK.checkValidIntValue(fieldValues.remove(DAY_OF_WEEK));
                        LocalDate date = LocalDate.of(y, moy, 1).plusWeeks(aw - 1).with(nextOrSame(DayOfWeek.of(dow)));
                        if (resolverStyle == ResolverStyle.STRICT && date.get(ChronoField.MONTH_OF_YEAR) != moy) {
                            throw new DateTimeException("Strict mode rejected date parsed to a different month");
                        }
                        return date;
                    }
                }
*/
            }
            if (fieldValues.containsKey(ChronoField.DAY_OF_YEAR)) {
                const y = ChronoField.YEAR.checkValidIntValue(fieldValues.remove(ChronoField.YEAR));
                if (resolverStyle === ResolverStyle.LENIENT) {
                    const days = MathUtil.safeSubtract(fieldValues.remove(ChronoField.DAY_OF_YEAR), 1);
                    return LocalDate.ofYearDay(y, 1).plusDays(days);
                }
                const doy = ChronoField.DAY_OF_YEAR.checkValidIntValue(fieldValues.remove(ChronoField.DAY_OF_YEAR));
                return LocalDate.ofYearDay(y, doy);
            }
            if (fieldValues.containsKey(ChronoField.ALIGNED_WEEK_OF_YEAR)) {
                if (fieldValues.containsKey(ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR)) {
                    const y = ChronoField.YEAR.checkValidIntValue(fieldValues.remove(ChronoField.YEAR));
                    if (resolverStyle === ResolverStyle.LENIENT) {
                        const weeks = MathUtil.safeSubtract(fieldValues.remove(ChronoField.ALIGNED_WEEK_OF_YEAR), 1);
                        const days = MathUtil.safeSubtract(fieldValues.remove(ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR), 1);
                        return LocalDate.of(y, 1, 1).plusWeeks(weeks).plusDays(days);
                    }
                    const aw = ChronoField.ALIGNED_WEEK_OF_YEAR.checkValidIntValue(fieldValues.remove(ChronoField.ALIGNED_WEEK_OF_YEAR));
                    const ad = ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR.checkValidIntValue(fieldValues.remove(ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR));
                    const date = LocalDate.of(y, 1, 1).plusDays((aw - 1) * 7 + (ad - 1));
                    if (resolverStyle === ResolverStyle.STRICT && date.get(ChronoField.YEAR) !== y) {
                        throw new DateTimeException('Strict mode rejected date parsed to a different year');
                    }
                    return date;
                }
                if (fieldValues.containsKey(ChronoField.DAY_OF_WEEK)) {
                    const y = ChronoField.YEAR.checkValidIntValue(fieldValues.remove(ChronoField.YEAR));
                    if (resolverStyle === ResolverStyle.LENIENT) {
                        const weeks = MathUtil.safeSubtract(fieldValues.remove(ChronoField.ALIGNED_WEEK_OF_YEAR), 1);
                        const days = MathUtil.safeSubtract(fieldValues.remove(ChronoField.DAY_OF_WEEK), 1);
                        return LocalDate.of(y, 1, 1).plusWeeks(weeks).plusDays(days);
                    }
                    const aw = ChronoField.ALIGNED_WEEK_OF_YEAR.checkValidIntValue(fieldValues.remove(ChronoField.ALIGNED_WEEK_OF_YEAR));
                    const dow = ChronoField.DAY_OF_WEEK.checkValidIntValue(fieldValues.remove(ChronoField.DAY_OF_WEEK));
                    const date = LocalDate.of(y, 1, 1).plusWeeks(aw - 1).with(TemporalAdjusters.nextOrSame(DayOfWeek.of(dow)));
                    if (resolverStyle === ResolverStyle.STRICT && date.get(ChronoField.YEAR) !== y) {
                        throw new DateTimeException('Strict mode rejected date parsed to a different month');
                    }
                    return date;
                }
            }
        }
        return null;
    }

    /**
     * Obtains an ISO local date from another date-time object.
     * <p>
     * This is equivalent to {@link LocalDate#from(TemporalAccessor)}.
     *
     * @param temporal  the date-time object to convert, not null
     * @return the ISO local date, not null
     * @throws DateTimeException if unable to create the date
     */
    date(temporal) {
        return LocalDate.from(temporal);
    }

}

export function _init() {
    IsoChronology.INSTANCE = new IsoChronology('IsoChronology');
}
//! @version @js-joda/core - 5.2.0
//! @copyright (c) 2015-present, Philipp Thürwächter, Pattrick Hüper & js-joda contributors
//! @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
//! @license BSD-3-Clause (see LICENSE in the root directory of this source tree)

'use strict';

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

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
function createErrorType(name, init, superErrorClass) {
  if (superErrorClass === void 0) {
    superErrorClass = Error;
  }

  function JsJodaException(message) {
    if (!Error.captureStackTrace) {
      this.stack = new Error().stack;
    } else {
      Error.captureStackTrace(this, this.constructor);
    }

    this.message = message;
    init && init.apply(this, arguments);

    this.toString = function () {
      return this.name + ": " + this.message;
    };
  }

  JsJodaException.prototype = Object.create(superErrorClass.prototype);
  JsJodaException.prototype.name = name;
  JsJodaException.prototype.constructor = JsJodaException;
  return JsJodaException;
}

var DateTimeException = createErrorType('DateTimeException', messageWithCause);
var DateTimeParseException = createErrorType('DateTimeParseException', messageForDateTimeParseException);
var UnsupportedTemporalTypeException = createErrorType('UnsupportedTemporalTypeException', null, DateTimeException);
var ArithmeticException = createErrorType('ArithmeticException');
var IllegalArgumentException = createErrorType('IllegalArgumentException');
var IllegalStateException = createErrorType('IllegalStateException');
var NullPointerException = createErrorType('NullPointerException');

function messageWithCause(message, cause) {
  if (cause === void 0) {
    cause = null;
  }

  var msg = message || this.name;

  if (cause !== null && cause instanceof Error) {
    msg += "\n-------\nCaused by: " + cause.stack + "\n-------\n";
  }

  this.message = msg;
}

function messageForDateTimeParseException(message, text, index, cause) {
  if (text === void 0) {
    text = '';
  }

  if (index === void 0) {
    index = 0;
  }

  if (cause === void 0) {
    cause = null;
  }

  var msg = message || this.name;
  msg += ": " + text + ", at index: " + index;

  if (cause !== null && cause instanceof Error) {
    msg += "\n-------\nCaused by: " + cause.stack + "\n-------\n";
  }

  this.message = msg;

  this.parsedString = function () {
    return text;
  };

  this.errorIndex = function () {
    return index;
  };
}

function _inheritsLoose(subClass, superClass) {
  subClass.prototype = Object.create(superClass.prototype);
  subClass.prototype.constructor = subClass;

  _setPrototypeOf(subClass, superClass);
}

function _setPrototypeOf(o, p) {
  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
    o.__proto__ = p;
    return o;
  };

  return _setPrototypeOf(o, p);
}

function _assertThisInitialized(self) {
  if (self === void 0) {
    throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
  }

  return self;
}

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
function assert(assertion, msg, error) {
  if (!assertion) {
    if (error) {
      throw new error(msg);
    } else {
      throw new Error(msg);
    }
  }
}
function requireNonNull(value, parameterName) {
  if (value == null) {
    throw new NullPointerException(parameterName + " must not be null");
  }

  return value;
}
function requireInstance(value, _class, parameterName) {
  if (!(value instanceof _class)) {
    throw new IllegalArgumentException(parameterName + " must be an instance of " + (_class.name ? _class.name : _class) + (value && value.constructor && value.constructor.name ? ", but is " + value.constructor.name : ''));
  }

  return value;
}
function abstractMethodFail(methodName) {
  throw new TypeError("abstract method \"" + methodName + "\" is not implemented");
}

var assert$1 = /*#__PURE__*/Object.freeze({
    __proto__: null,
    assert: assert,
    requireNonNull: requireNonNull,
    requireInstance: requireInstance,
    abstractMethodFail: abstractMethodFail
});

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var MAX_SAFE_INTEGER = 9007199254740991;
var MIN_SAFE_INTEGER = -9007199254740991;
var MathUtil = function () {
  function MathUtil() {}

  MathUtil.intDiv = function intDiv(x, y) {
    var r = x / y;
    r = MathUtil.roundDown(r);
    return MathUtil.safeZero(r);
  };

  MathUtil.intMod = function intMod(x, y) {
    var r = x - MathUtil.intDiv(x, y) * y;
    r = MathUtil.roundDown(r);
    return MathUtil.safeZero(r);
  };

  MathUtil.roundDown = function roundDown(r) {
    if (r < 0) {
      return Math.ceil(r);
    } else {
      return Math.floor(r);
    }
  };

  MathUtil.floorDiv = function floorDiv(x, y) {
    var r = Math.floor(x / y);
    return MathUtil.safeZero(r);
  };

  MathUtil.floorMod = function floorMod(x, y) {
    var r = x - MathUtil.floorDiv(x, y) * y;
    return MathUtil.safeZero(r);
  };

  MathUtil.safeAdd = function safeAdd(x, y) {
    MathUtil.verifyInt(x);
    MathUtil.verifyInt(y);

    if (x === 0) {
      return MathUtil.safeZero(y);
    }

    if (y === 0) {
      return MathUtil.safeZero(x);
    }

    var r = MathUtil.safeToInt(x + y);

    if (r === x || r === y) {
      throw new ArithmeticException('Invalid addition beyond MAX_SAFE_INTEGER!');
    }

    return r;
  };

  MathUtil.safeSubtract = function safeSubtract(x, y) {
    MathUtil.verifyInt(x);
    MathUtil.verifyInt(y);

    if (x === 0 && y === 0) {
      return 0;
    } else if (x === 0) {
      return MathUtil.safeZero(-1 * y);
    } else if (y === 0) {
      return MathUtil.safeZero(x);
    }

    return MathUtil.safeToInt(x - y);
  };

  MathUtil.safeMultiply = function safeMultiply(x, y) {
    MathUtil.verifyInt(x);
    MathUtil.verifyInt(y);

    if (x === 1) {
      return MathUtil.safeZero(y);
    }

    if (y === 1) {
      return MathUtil.safeZero(x);
    }

    if (x === 0 || y === 0) {
      return 0;
    }

    var r = MathUtil.safeToInt(x * y);

    if (r / y !== x || x === MIN_SAFE_INTEGER && y === -1 || y === MIN_SAFE_INTEGER && x === -1) {
      throw new ArithmeticException("Multiplication overflows: " + x + " * " + y);
    }

    return r;
  };

  MathUtil.parseInt = function (_parseInt) {
    function parseInt(_x) {
      return _parseInt.apply(this, arguments);
    }

    parseInt.toString = function () {
      return _parseInt.toString();
    };

    return parseInt;
  }(function (value) {
    var r = parseInt(value);
    return MathUtil.safeToInt(r);
  });

  MathUtil.safeToInt = function safeToInt(value) {
    MathUtil.verifyInt(value);
    return MathUtil.safeZero(value);
  };

  MathUtil.verifyInt = function verifyInt(value) {
    if (value == null) {
      throw new ArithmeticException("Invalid value: '" + value + "', using null or undefined as argument");
    }

    if (isNaN(value)) {
      throw new ArithmeticException('Invalid int value, using NaN as argument');
    }

    if (value % 1 !== 0) {
      throw new ArithmeticException("Invalid value: '" + value + "' is a float");
    }

    if (value > MAX_SAFE_INTEGER || value < MIN_SAFE_INTEGER) {
      throw new ArithmeticException("Calculation overflows an int: " + value);
    }
  };

  MathUtil.safeZero = function safeZero(value) {
    return value === 0 ? 0 : +value;
  };

  MathUtil.compareNumbers = function compareNumbers(a, b) {
    if (a < b) {
      return -1;
    }

    if (a > b) {
      return 1;
    }

    return 0;
  };

  MathUtil.smi = function smi(int) {
    return int >>> 1 & 0x40000000 | int & 0xBFFFFFFF;
  };

  MathUtil.hash = function hash(number) {
    if (number !== number || number === Infinity) {
      return 0;
    }

    var result = number;

    while (number > 0xFFFFFFFF) {
      number /= 0xFFFFFFFF;
      result ^= number;
    }

    return MathUtil.smi(result);
  };

  MathUtil.hashCode = function hashCode() {
    var result = 17;

    for (var _len = arguments.length, numbers = new Array(_len), _key = 0; _key < _len; _key++) {
      numbers[_key] = arguments[_key];
    }

    for (var _i = 0, _numbers = numbers; _i < _numbers.length; _i++) {
      var n = _numbers[_i];
      result = (result << 5) - result + MathUtil.hash(n);
    }

    return MathUtil.hash(result);
  };

  return MathUtil;
}();
MathUtil.MAX_SAFE_INTEGER = MAX_SAFE_INTEGER;
MathUtil.MIN_SAFE_INTEGER = MIN_SAFE_INTEGER;

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var Enum = function () {
  function Enum(name) {
    this._name = name;
  }

  var _proto = Enum.prototype;

  _proto.equals = function equals(other) {
    return this === other;
  };

  _proto.toString = function toString() {
    return this._name;
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  return Enum;
}();

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var TemporalAmount = function () {
  function TemporalAmount() {}

  var _proto = TemporalAmount.prototype;

  _proto.get = function get(unit) {
    abstractMethodFail('get');
  };

  _proto.units = function units() {
    abstractMethodFail('units');
  };

  _proto.addTo = function addTo(temporal) {
    abstractMethodFail('addTo');
  };

  _proto.subtractFrom = function subtractFrom(temporal) {
    abstractMethodFail('subtractFrom');
  };

  return TemporalAmount;
}();

if (typeof Symbol !== 'undefined' && Symbol.toPrimitive) {
  TemporalAmount.prototype[Symbol.toPrimitive] = function (hint) {
    if (hint !== 'number') {
      return this.toString();
    }

    throw new TypeError('A conversion from TemporalAmount to a number is not allowed. ' + 'To compare use the methods .equals(), .compareTo(), .isBefore() ' + 'or one that is more suitable to your use case.');
  };
}

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var TemporalUnit = function () {
  function TemporalUnit() {}

  var _proto = TemporalUnit.prototype;

  _proto.duration = function duration() {
    abstractMethodFail('duration');
  };

  _proto.isDurationEstimated = function isDurationEstimated() {
    abstractMethodFail('isDurationEstimated');
  };

  _proto.isDateBased = function isDateBased() {
    abstractMethodFail('isDateBased');
  };

  _proto.isTimeBased = function isTimeBased() {
    abstractMethodFail('isTimeBased');
  };

  _proto.isSupportedBy = function isSupportedBy(temporal) {
    abstractMethodFail('isSupportedBy');
  };

  _proto.addTo = function addTo(dateTime, periodToAdd) {
    abstractMethodFail('addTo');
  };

  _proto.between = function between(temporal1, temporal2) {
    abstractMethodFail('between');
  };

  return TemporalUnit;
}();

var Duration = function (_TemporalAmount) {
  _inheritsLoose(Duration, _TemporalAmount);

  function Duration(seconds, nanos) {
    var _this;

    _this = _TemporalAmount.call(this) || this;
    _this._seconds = MathUtil.safeToInt(seconds);
    _this._nanos = MathUtil.safeToInt(nanos);
    return _this;
  }

  Duration.ofDays = function ofDays(days) {
    return Duration._create(MathUtil.safeMultiply(days, LocalTime.SECONDS_PER_DAY), 0);
  };

  Duration.ofHours = function ofHours(hours) {
    return Duration._create(MathUtil.safeMultiply(hours, LocalTime.SECONDS_PER_HOUR), 0);
  };

  Duration.ofMinutes = function ofMinutes(minutes) {
    return Duration._create(MathUtil.safeMultiply(minutes, LocalTime.SECONDS_PER_MINUTE), 0);
  };

  Duration.ofSeconds = function ofSeconds(seconds, nanoAdjustment) {
    if (nanoAdjustment === void 0) {
      nanoAdjustment = 0;
    }

    var secs = MathUtil.safeAdd(seconds, MathUtil.floorDiv(nanoAdjustment, LocalTime.NANOS_PER_SECOND));
    var nos = MathUtil.floorMod(nanoAdjustment, LocalTime.NANOS_PER_SECOND);
    return Duration._create(secs, nos);
  };

  Duration.ofMillis = function ofMillis(millis) {
    var secs = MathUtil.intDiv(millis, 1000);
    var mos = MathUtil.intMod(millis, 1000);

    if (mos < 0) {
      mos += 1000;
      secs--;
    }

    return Duration._create(secs, mos * 1000000);
  };

  Duration.ofNanos = function ofNanos(nanos) {
    var secs = MathUtil.intDiv(nanos, LocalTime.NANOS_PER_SECOND);
    var nos = MathUtil.intMod(nanos, LocalTime.NANOS_PER_SECOND);

    if (nos < 0) {
      nos += LocalTime.NANOS_PER_SECOND;
      secs--;
    }

    return this._create(secs, nos);
  };

  Duration.of = function of(amount, unit) {
    return Duration.ZERO.plus(amount, unit);
  };

  Duration.from = function from(amount) {
    requireNonNull(amount, 'amount');
    requireInstance(amount, TemporalAmount);
    var duration = Duration.ZERO;
    amount.units().forEach(function (unit) {
      duration = duration.plus(amount.get(unit), unit);
    });
    return duration;
  };

  Duration.between = function between(startInclusive, endExclusive) {
    requireNonNull(startInclusive, 'startInclusive');
    requireNonNull(endExclusive, 'endExclusive');
    var secs = startInclusive.until(endExclusive, ChronoUnit.SECONDS);
    var nanos = 0;

    if (startInclusive.isSupported(ChronoField.NANO_OF_SECOND) && endExclusive.isSupported(ChronoField.NANO_OF_SECOND)) {
      try {
        var startNos = startInclusive.getLong(ChronoField.NANO_OF_SECOND);
        nanos = endExclusive.getLong(ChronoField.NANO_OF_SECOND) - startNos;

        if (secs > 0 && nanos < 0) {
          nanos += LocalTime.NANOS_PER_SECOND;
        } else if (secs < 0 && nanos > 0) {
          nanos -= LocalTime.NANOS_PER_SECOND;
        } else if (secs === 0 && nanos !== 0) {
          var adjustedEnd = endExclusive.with(ChronoField.NANO_OF_SECOND, startNos);
          secs = startInclusive.until(adjustedEnd, ChronoUnit.SECONDS);
        }
      } catch (e) {}
    }

    return this.ofSeconds(secs, nanos);
  };

  Duration.parse = function parse(text) {
    requireNonNull(text, 'text');
    var PATTERN = new RegExp('([-+]?)P(?:([-+]?[0-9]+)D)?(T(?:([-+]?[0-9]+)H)?(?:([-+]?[0-9]+)M)?(?:([-+]?[0-9]+)(?:[.,]([0-9]{0,9}))?S)?)?', 'i');
    var matches = PATTERN.exec(text);

    if (matches !== null) {
      if ('T' === matches[3] === false) {
        var negate = '-' === matches[1];
        var dayMatch = matches[2];
        var hourMatch = matches[4];
        var minuteMatch = matches[5];
        var secondMatch = matches[6];
        var fractionMatch = matches[7];

        if (dayMatch != null || hourMatch != null || minuteMatch != null || secondMatch != null) {
          var daysAsSecs = Duration._parseNumber(text, dayMatch, LocalTime.SECONDS_PER_DAY, 'days');

          var hoursAsSecs = Duration._parseNumber(text, hourMatch, LocalTime.SECONDS_PER_HOUR, 'hours');

          var minsAsSecs = Duration._parseNumber(text, minuteMatch, LocalTime.SECONDS_PER_MINUTE, 'minutes');

          var seconds = Duration._parseNumber(text, secondMatch, 1, 'seconds');

          var negativeSecs = secondMatch != null && secondMatch.charAt(0) === '-';

          var nanos = Duration._parseFraction(text, fractionMatch, negativeSecs ? -1 : 1);

          try {
            return Duration._create(negate, daysAsSecs, hoursAsSecs, minsAsSecs, seconds, nanos);
          } catch (ex) {
            throw new DateTimeParseException('Text cannot be parsed to a Duration: overflow', text, 0, ex);
          }
        }
      }
    }

    throw new DateTimeParseException('Text cannot be parsed to a Duration', text, 0);
  };

  Duration._parseNumber = function _parseNumber(text, parsed, multiplier, errorText) {
    if (parsed == null) {
      return 0;
    }

    try {
      if (parsed[0] === '+') {
        parsed = parsed.substring(1);
      }

      return MathUtil.safeMultiply(parseFloat(parsed), multiplier);
    } catch (ex) {
      throw new DateTimeParseException("Text cannot be parsed to a Duration: " + errorText, text, 0, ex);
    }
  };

  Duration._parseFraction = function _parseFraction(text, parsed, negate) {
    if (parsed == null || parsed.length === 0) {
      return 0;
    }

    parsed = (parsed + "000000000").substring(0, 9);
    return parseFloat(parsed) * negate;
  };

  Duration._create = function _create() {
    if (arguments.length <= 2) {
      return Duration._createSecondsNanos(arguments[0], arguments[1]);
    } else {
      return Duration._createNegateDaysHoursMinutesSecondsNanos(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);
    }
  };

  Duration._createNegateDaysHoursMinutesSecondsNanos = function _createNegateDaysHoursMinutesSecondsNanos(negate, daysAsSecs, hoursAsSecs, minsAsSecs, secs, nanos) {
    var seconds = MathUtil.safeAdd(daysAsSecs, MathUtil.safeAdd(hoursAsSecs, MathUtil.safeAdd(minsAsSecs, secs)));

    if (negate) {
      return Duration.ofSeconds(seconds, nanos).negated();
    }

    return Duration.ofSeconds(seconds, nanos);
  };

  Duration._createSecondsNanos = function _createSecondsNanos(seconds, nanoAdjustment) {
    if (seconds === void 0) {
      seconds = 0;
    }

    if (nanoAdjustment === void 0) {
      nanoAdjustment = 0;
    }

    if (seconds === 0 && nanoAdjustment === 0) {
      return Duration.ZERO;
    }

    return new Duration(seconds, nanoAdjustment);
  };

  var _proto = Duration.prototype;

  _proto.get = function get(unit) {
    if (unit === ChronoUnit.SECONDS) {
      return this._seconds;
    } else if (unit === ChronoUnit.NANOS) {
      return this._nanos;
    } else {
      throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
    }
  };

  _proto.units = function units() {
    return [ChronoUnit.SECONDS, ChronoUnit.NANOS];
  };

  _proto.isZero = function isZero() {
    return this._seconds === 0 && this._nanos === 0;
  };

  _proto.isNegative = function isNegative() {
    return this._seconds < 0;
  };

  _proto.seconds = function seconds() {
    return this._seconds;
  };

  _proto.nano = function nano() {
    return this._nanos;
  };

  _proto.withSeconds = function withSeconds(seconds) {
    return Duration._create(seconds, this._nanos);
  };

  _proto.withNanos = function withNanos(nanoOfSecond) {
    ChronoField.NANO_OF_SECOND.checkValidIntValue(nanoOfSecond);
    return Duration._create(this._seconds, nanoOfSecond);
  };

  _proto.plusDuration = function plusDuration(duration) {
    requireNonNull(duration, 'duration');
    return this.plus(duration.seconds(), duration.nano());
  };

  _proto.plus = function plus(durationOrNumber, unitOrNumber) {
    if (arguments.length === 1) {
      return this.plusDuration(durationOrNumber);
    } else if (arguments.length === 2 && unitOrNumber instanceof TemporalUnit) {
      return this.plusAmountUnit(durationOrNumber, unitOrNumber);
    } else {
      return this.plusSecondsNanos(durationOrNumber, unitOrNumber);
    }
  };

  _proto.plusAmountUnit = function plusAmountUnit(amountToAdd, unit) {
    requireNonNull(amountToAdd, 'amountToAdd');
    requireNonNull(unit, 'unit');

    if (unit === ChronoUnit.DAYS) {
      return this.plusSecondsNanos(MathUtil.safeMultiply(amountToAdd, LocalTime.SECONDS_PER_DAY), 0);
    }

    if (unit.isDurationEstimated()) {
      throw new UnsupportedTemporalTypeException('Unit must not have an estimated duration');
    }

    if (amountToAdd === 0) {
      return this;
    }

    if (unit instanceof ChronoUnit) {
      switch (unit) {
        case ChronoUnit.NANOS:
          return this.plusNanos(amountToAdd);

        case ChronoUnit.MICROS:
          return this.plusSecondsNanos(MathUtil.intDiv(amountToAdd, 1000000 * 1000) * 1000, MathUtil.intMod(amountToAdd, 1000000 * 1000) * 1000);

        case ChronoUnit.MILLIS:
          return this.plusMillis(amountToAdd);

        case ChronoUnit.SECONDS:
          return this.plusSeconds(amountToAdd);
      }

      return this.plusSecondsNanos(MathUtil.safeMultiply(unit.duration().seconds(), amountToAdd), 0);
    }

    var duration = unit.duration().multipliedBy(amountToAdd);
    return this.plusSecondsNanos(duration.seconds(), duration.nano());
  };

  _proto.plusDays = function plusDays(daysToAdd) {
    return this.plusSecondsNanos(MathUtil.safeMultiply(daysToAdd, LocalTime.SECONDS_PER_DAY), 0);
  };

  _proto.plusHours = function plusHours(hoursToAdd) {
    return this.plusSecondsNanos(MathUtil.safeMultiply(hoursToAdd, LocalTime.SECONDS_PER_HOUR), 0);
  };

  _proto.plusMinutes = function plusMinutes(minutesToAdd) {
    return this.plusSecondsNanos(MathUtil.safeMultiply(minutesToAdd, LocalTime.SECONDS_PER_MINUTE), 0);
  };

  _proto.plusSeconds = function plusSeconds(secondsToAdd) {
    return this.plusSecondsNanos(secondsToAdd, 0);
  };

  _proto.plusMillis = function plusMillis(millisToAdd) {
    return this.plusSecondsNanos(MathUtil.intDiv(millisToAdd, 1000), MathUtil.intMod(millisToAdd, 1000) * 1000000);
  };

  _proto.plusNanos = function plusNanos(nanosToAdd) {
    return this.plusSecondsNanos(0, nanosToAdd);
  };

  _proto.plusSecondsNanos = function plusSecondsNanos(secondsToAdd, nanosToAdd) {
    requireNonNull(secondsToAdd, 'secondsToAdd');
    requireNonNull(nanosToAdd, 'nanosToAdd');

    if (secondsToAdd === 0 && nanosToAdd === 0) {
      return this;
    }

    var epochSec = MathUtil.safeAdd(this._seconds, secondsToAdd);
    epochSec = MathUtil.safeAdd(epochSec, MathUtil.intDiv(nanosToAdd, LocalTime.NANOS_PER_SECOND));
    nanosToAdd = MathUtil.intMod(nanosToAdd, LocalTime.NANOS_PER_SECOND);
    var nanoAdjustment = MathUtil.safeAdd(this._nanos, nanosToAdd);
    return Duration.ofSeconds(epochSec, nanoAdjustment);
  };

  _proto.minus = function minus(durationOrNumber, unit) {
    if (arguments.length === 1) {
      return this.minusDuration(durationOrNumber);
    } else {
      return this.minusAmountUnit(durationOrNumber, unit);
    }
  };

  _proto.minusDuration = function minusDuration(duration) {
    requireNonNull(duration, 'duration');
    var secsToSubtract = duration.seconds();
    var nanosToSubtract = duration.nano();

    if (secsToSubtract === MIN_SAFE_INTEGER) {
      return this.plus(MAX_SAFE_INTEGER, -nanosToSubtract);
    }

    return this.plus(-secsToSubtract, -nanosToSubtract);
  };

  _proto.minusAmountUnit = function minusAmountUnit(amountToSubtract, unit) {
    requireNonNull(amountToSubtract, 'amountToSubtract');
    requireNonNull(unit, 'unit');
    return amountToSubtract === MIN_SAFE_INTEGER ? this.plusAmountUnit(MAX_SAFE_INTEGER, unit) : this.plusAmountUnit(-amountToSubtract, unit);
  };

  _proto.minusDays = function minusDays(daysToSubtract) {
    return daysToSubtract === MIN_SAFE_INTEGER ? this.plusDays(MAX_SAFE_INTEGER) : this.plusDays(-daysToSubtract);
  };

  _proto.minusHours = function minusHours(hoursToSubtract) {
    return hoursToSubtract === MIN_SAFE_INTEGER ? this.plusHours(MAX_SAFE_INTEGER) : this.plusHours(-hoursToSubtract);
  };

  _proto.minusMinutes = function minusMinutes(minutesToSubtract) {
    return minutesToSubtract === MIN_SAFE_INTEGER ? this.plusMinutes(MAX_SAFE_INTEGER) : this.plusMinutes(-minutesToSubtract);
  };

  _proto.minusSeconds = function minusSeconds(secondsToSubtract) {
    return secondsToSubtract === MIN_SAFE_INTEGER ? this.plusSeconds(MAX_SAFE_INTEGER) : this.plusSeconds(-secondsToSubtract);
  };

  _proto.minusMillis = function minusMillis(millisToSubtract) {
    return millisToSubtract === MIN_SAFE_INTEGER ? this.plusMillis(MAX_SAFE_INTEGER) : this.plusMillis(-millisToSubtract);
  };

  _proto.minusNanos = function minusNanos(nanosToSubtract) {
    return nanosToSubtract === MIN_SAFE_INTEGER ? this.plusNanos(MAX_SAFE_INTEGER) : this.plusNanos(-nanosToSubtract);
  };

  _proto.multipliedBy = function multipliedBy(multiplicand) {
    if (multiplicand === 0) {
      return Duration.ZERO;
    }

    if (multiplicand === 1) {
      return this;
    }

    var secs = MathUtil.safeMultiply(this._seconds, multiplicand);
    var nos = MathUtil.safeMultiply(this._nanos, multiplicand);
    secs = secs + MathUtil.intDiv(nos, LocalTime.NANOS_PER_SECOND);
    nos = MathUtil.intMod(nos, LocalTime.NANOS_PER_SECOND);
    return Duration.ofSeconds(secs, nos);
  };

  _proto.dividedBy = function dividedBy(divisor) {
    if (divisor === 0) {
      throw new ArithmeticException('Cannot divide by zero');
    }

    if (divisor === 1) {
      return this;
    }

    var secs = MathUtil.intDiv(this._seconds, divisor);
    var secsMod = MathUtil.roundDown((this._seconds / divisor - secs) * LocalTime.NANOS_PER_SECOND);
    var nos = MathUtil.intDiv(this._nanos, divisor);
    nos = secsMod + nos;
    return Duration.ofSeconds(secs, nos);
  };

  _proto.negated = function negated() {
    return this.multipliedBy(-1);
  };

  _proto.abs = function abs() {
    return this.isNegative() ? this.negated() : this;
  };

  _proto.addTo = function addTo(temporal) {
    requireNonNull(temporal, 'temporal');

    if (this._seconds !== 0) {
      temporal = temporal.plus(this._seconds, ChronoUnit.SECONDS);
    }

    if (this._nanos !== 0) {
      temporal = temporal.plus(this._nanos, ChronoUnit.NANOS);
    }

    return temporal;
  };

  _proto.subtractFrom = function subtractFrom(temporal) {
    requireNonNull(temporal, 'temporal');

    if (this._seconds !== 0) {
      temporal = temporal.minus(this._seconds, ChronoUnit.SECONDS);
    }

    if (this._nanos !== 0) {
      temporal = temporal.minus(this._nanos, ChronoUnit.NANOS);
    }

    return temporal;
  };

  _proto.toDays = function toDays() {
    return MathUtil.intDiv(this._seconds, LocalTime.SECONDS_PER_DAY);
  };

  _proto.toHours = function toHours() {
    return MathUtil.intDiv(this._seconds, LocalTime.SECONDS_PER_HOUR);
  };

  _proto.toMinutes = function toMinutes() {
    return MathUtil.intDiv(this._seconds, LocalTime.SECONDS_PER_MINUTE);
  };

  _proto.toMillis = function toMillis() {
    var millis = Math.round(MathUtil.safeMultiply(this._seconds, 1000));
    millis = MathUtil.safeAdd(millis, MathUtil.intDiv(this._nanos, 1000000));
    return millis;
  };

  _proto.toNanos = function toNanos() {
    var totalNanos = MathUtil.safeMultiply(this._seconds, LocalTime.NANOS_PER_SECOND);
    totalNanos = MathUtil.safeAdd(totalNanos, this._nanos);
    return totalNanos;
  };

  _proto.compareTo = function compareTo(otherDuration) {
    requireNonNull(otherDuration, 'otherDuration');
    requireInstance(otherDuration, Duration, 'otherDuration');
    var cmp = MathUtil.compareNumbers(this._seconds, otherDuration.seconds());

    if (cmp !== 0) {
      return cmp;
    }

    return this._nanos - otherDuration.nano();
  };

  _proto.equals = function equals(otherDuration) {
    if (this === otherDuration) {
      return true;
    }

    if (otherDuration instanceof Duration) {
      return this.seconds() === otherDuration.seconds() && this.nano() === otherDuration.nano();
    }

    return false;
  };

  _proto.toString = function toString() {
    if (this === Duration.ZERO) {
      return 'PT0S';
    }

    var hours = MathUtil.intDiv(this._seconds, LocalTime.SECONDS_PER_HOUR);
    var minutes = MathUtil.intDiv(MathUtil.intMod(this._seconds, LocalTime.SECONDS_PER_HOUR), LocalTime.SECONDS_PER_MINUTE);
    var secs = MathUtil.intMod(this._seconds, LocalTime.SECONDS_PER_MINUTE);
    var rval = 'PT';

    if (hours !== 0) {
      rval += hours + "H";
    }

    if (minutes !== 0) {
      rval += minutes + "M";
    }

    if (secs === 0 && this._nanos === 0 && rval.length > 2) {
      return rval;
    }

    if (secs < 0 && this._nanos > 0) {
      if (secs === -1) {
        rval += '-0';
      } else {
        rval += secs + 1;
      }
    } else {
      rval += secs;
    }

    if (this._nanos > 0) {
      rval += '.';
      var nanoString;

      if (secs < 0) {
        nanoString = "" + (2 * LocalTime.NANOS_PER_SECOND - this._nanos);
      } else {
        nanoString = "" + (LocalTime.NANOS_PER_SECOND + this._nanos);
      }

      nanoString = nanoString.slice(1, nanoString.length);
      rval += nanoString;

      while (rval.charAt(rval.length - 1) === '0') {
        rval = rval.slice(0, rval.length - 1);
      }
    }

    rval += 'S';
    return rval;
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  return Duration;
}(TemporalAmount);
function _init$n() {
  Duration.ZERO = new Duration(0, 0);
}

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE.md in the root directory of this source tree)
 */
var YearConstants = function YearConstants() {};
function _init$m() {
  YearConstants.MIN_VALUE = -999999;
  YearConstants.MAX_VALUE = 999999;
}

var ChronoUnit = function (_TemporalUnit) {
  _inheritsLoose(ChronoUnit, _TemporalUnit);

  function ChronoUnit(name, estimatedDuration) {
    var _this;

    _this = _TemporalUnit.call(this) || this;
    _this._name = name;
    _this._duration = estimatedDuration;
    return _this;
  }

  var _proto = ChronoUnit.prototype;

  _proto.duration = function duration() {
    return this._duration;
  };

  _proto.isDurationEstimated = function isDurationEstimated() {
    return this.isDateBased() || this === ChronoUnit.FOREVER;
  };

  _proto.isDateBased = function isDateBased() {
    return this.compareTo(ChronoUnit.DAYS) >= 0 && this !== ChronoUnit.FOREVER;
  };

  _proto.isTimeBased = function isTimeBased() {
    return this.compareTo(ChronoUnit.DAYS) < 0;
  };

  _proto.isSupportedBy = function isSupportedBy(temporal) {
    if (this === ChronoUnit.FOREVER) {
      return false;
    }

    try {
      temporal.plus(1, this);
      return true;
    } catch (e) {
      try {
        temporal.plus(-1, this);
        return true;
      } catch (e2) {
        return false;
      }
    }
  };

  _proto.addTo = function addTo(temporal, amount) {
    return temporal.plus(amount, this);
  };

  _proto.between = function between(temporal1, temporal2) {
    return temporal1.until(temporal2, this);
  };

  _proto.toString = function toString() {
    return this._name;
  };

  _proto.compareTo = function compareTo(other) {
    return this.duration().compareTo(other.duration());
  };

  return ChronoUnit;
}(TemporalUnit);
function _init$l() {
  ChronoUnit.NANOS = new ChronoUnit('Nanos', Duration.ofNanos(1));
  ChronoUnit.MICROS = new ChronoUnit('Micros', Duration.ofNanos(1000));
  ChronoUnit.MILLIS = new ChronoUnit('Millis', Duration.ofNanos(1000000));
  ChronoUnit.SECONDS = new ChronoUnit('Seconds', Duration.ofSeconds(1));
  ChronoUnit.MINUTES = new ChronoUnit('Minutes', Duration.ofSeconds(60));
  ChronoUnit.HOURS = new ChronoUnit('Hours', Duration.ofSeconds(3600));
  ChronoUnit.HALF_DAYS = new ChronoUnit('HalfDays', Duration.ofSeconds(43200));
  ChronoUnit.DAYS = new ChronoUnit('Days', Duration.ofSeconds(86400));
  ChronoUnit.WEEKS = new ChronoUnit('Weeks', Duration.ofSeconds(7 * 86400));
  ChronoUnit.MONTHS = new ChronoUnit('Months', Duration.ofSeconds(31556952 / 12));
  ChronoUnit.YEARS = new ChronoUnit('Years', Duration.ofSeconds(31556952));
  ChronoUnit.DECADES = new ChronoUnit('Decades', Duration.ofSeconds(31556952 * 10));
  ChronoUnit.CENTURIES = new ChronoUnit('Centuries', Duration.ofSeconds(31556952 * 100));
  ChronoUnit.MILLENNIA = new ChronoUnit('Millennia', Duration.ofSeconds(31556952 * 1000));
  ChronoUnit.ERAS = new ChronoUnit('Eras', Duration.ofSeconds(31556952 * (YearConstants.MAX_VALUE + 1)));
  ChronoUnit.FOREVER = new ChronoUnit('Forever', Duration.ofSeconds(MathUtil.MAX_SAFE_INTEGER, 999999999));
}

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

var TemporalField = function () {
  function TemporalField() {}

  var _proto = TemporalField.prototype;

  _proto.isDateBased = function isDateBased() {
    abstractMethodFail('isDateBased');
  };

  _proto.isTimeBased = function isTimeBased() {
    abstractMethodFail('isTimeBased');
  };

  _proto.baseUnit = function baseUnit() {
    abstractMethodFail('baseUnit');
  };

  _proto.rangeUnit = function rangeUnit() {
    abstractMethodFail('rangeUnit');
  };

  _proto.range = function range() {
    abstractMethodFail('range');
  };

  _proto.rangeRefinedBy = function rangeRefinedBy(temporal) {
    abstractMethodFail('rangeRefinedBy');
  };

  _proto.getFrom = function getFrom(temporal) {
    abstractMethodFail('getFrom');
  };

  _proto.adjustInto = function adjustInto(temporal, newValue) {
    abstractMethodFail('adjustInto');
  };

  _proto.isSupportedBy = function isSupportedBy(temporal) {
    abstractMethodFail('isSupportedBy');
  };

  _proto.displayName = function displayName() {
    abstractMethodFail('displayName');
  };

  _proto.equals = function equals(other) {
    abstractMethodFail('equals');
  };

  _proto.name = function name() {
    abstractMethodFail('name');
  };

  return TemporalField;
}();

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var ValueRange = function () {
  function ValueRange(minSmallest, minLargest, maxSmallest, maxLargest) {
    assert(!(minSmallest > minLargest), "Smallest minimum value '" + minSmallest + "' must be less than largest minimum value '" + minLargest + "'", IllegalArgumentException);
    assert(!(maxSmallest > maxLargest), "Smallest maximum value '" + maxSmallest + "' must be less than largest maximum value '" + maxLargest + "'", IllegalArgumentException);
    assert(!(minLargest > maxLargest), "Minimum value '" + minLargest + "' must be less than maximum value '" + maxLargest + "'", IllegalArgumentException);
    this._minSmallest = minSmallest;
    this._minLargest = minLargest;
    this._maxLargest = maxLargest;
    this._maxSmallest = maxSmallest;
  }

  var _proto = ValueRange.prototype;

  _proto.isFixed = function isFixed() {
    return this._minSmallest === this._minLargest && this._maxSmallest === this._maxLargest;
  };

  _proto.minimum = function minimum() {
    return this._minSmallest;
  };

  _proto.largestMinimum = function largestMinimum() {
    return this._minLargest;
  };

  _proto.maximum = function maximum() {
    return this._maxLargest;
  };

  _proto.smallestMaximum = function smallestMaximum() {
    return this._maxSmallest;
  };

  _proto.isValidValue = function isValidValue(value) {
    return this.minimum() <= value && value <= this.maximum();
  };

  _proto.checkValidValue = function checkValidValue(value, field) {
    var msg;

    if (!this.isValidValue(value)) {
      if (field != null) {
        msg = "Invalid value for " + field + " (valid values " + this.toString() + "): " + value;
      } else {
        msg = "Invalid value (valid values " + this.toString() + "): " + value;
      }

      return assert(false, msg, DateTimeException);
    }

    return value;
  };

  _proto.checkValidIntValue = function checkValidIntValue(value, field) {
    if (this.isValidIntValue(value) === false) {
      throw new DateTimeException("Invalid int value for " + field + ": " + value);
    }

    return value;
  };

  _proto.isValidIntValue = function isValidIntValue(value) {
    return this.isIntValue() && this.isValidValue(value);
  };

  _proto.isIntValue = function isIntValue() {
    return this.minimum() >= MathUtil.MIN_SAFE_INTEGER && this.maximum() <= MathUtil.MAX_SAFE_INTEGER;
  };

  _proto.equals = function equals(other) {
    if (other === this) {
      return true;
    }

    if (other instanceof ValueRange) {
      return this._minSmallest === other._minSmallest && this._minLargest === other._minLargest && this._maxSmallest === other._maxSmallest && this._maxLargest === other._maxLargest;
    }

    return false;
  };

  _proto.hashCode = function hashCode() {
    return MathUtil.hashCode(this._minSmallest, this._minLargest, this._maxSmallest, this._maxLargest);
  };

  _proto.toString = function toString() {
    var str = this.minimum() + (this.minimum() !== this.largestMinimum() ? "/" + this.largestMinimum() : '');
    str += ' - ';
    str += this.smallestMaximum() + (this.smallestMaximum() !== this.maximum() ? "/" + this.maximum() : '');
    return str;
  };

  ValueRange.of = function of() {
    if (arguments.length === 2) {
      return new ValueRange(arguments[0], arguments[0], arguments[1], arguments[1]);
    } else if (arguments.length === 3) {
      return new ValueRange(arguments[0], arguments[0], arguments[1], arguments[2]);
    } else if (arguments.length === 4) {
      return new ValueRange(arguments[0], arguments[1], arguments[2], arguments[3]);
    } else {
      return assert(false, "Invalid number of arguments " + arguments.length, IllegalArgumentException);
    }
  };

  return ValueRange;
}();

var ChronoField = function (_TemporalField) {
  _inheritsLoose(ChronoField, _TemporalField);

  ChronoField.byName = function byName(fieldName) {
    for (var prop in ChronoField) {
      if (ChronoField[prop]) {
        if (ChronoField[prop] instanceof ChronoField && ChronoField[prop].name() === fieldName) {
          return ChronoField[prop];
        }
      }
    }
  };

  function ChronoField(name, baseUnit, rangeUnit, range) {
    var _this;

    _this = _TemporalField.call(this) || this;
    _this._name = name;
    _this._baseUnit = baseUnit;
    _this._rangeUnit = rangeUnit;
    _this._range = range;
    return _this;
  }

  var _proto = ChronoField.prototype;

  _proto.name = function name() {
    return this._name;
  };

  _proto.baseUnit = function baseUnit() {
    return this._baseUnit;
  };

  _proto.rangeUnit = function rangeUnit() {
    return this._rangeUnit;
  };

  _proto.range = function range() {
    return this._range;
  };

  _proto.displayName = function displayName() {
    return this.toString();
  };

  _proto.checkValidValue = function checkValidValue(value) {
    return this.range().checkValidValue(value, this);
  };

  _proto.checkValidIntValue = function checkValidIntValue(value) {
    return this.range().checkValidIntValue(value, this);
  };

  _proto.isDateBased = function isDateBased() {
    var dateBased = this === ChronoField.DAY_OF_WEEK || this === ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH || this === ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR || this === ChronoField.DAY_OF_MONTH || this === ChronoField.DAY_OF_YEAR || this === ChronoField.EPOCH_DAY || this === ChronoField.ALIGNED_WEEK_OF_MONTH || this === ChronoField.ALIGNED_WEEK_OF_YEAR || this === ChronoField.MONTH_OF_YEAR || this === ChronoField.YEAR_OF_ERA || this === ChronoField.YEAR || this === ChronoField.ERA;
    return dateBased;
  };

  _proto.isTimeBased = function isTimeBased() {
    var timeBased = this === ChronoField.NANO_OF_SECOND || this === ChronoField.NANO_OF_DAY || this === ChronoField.MICRO_OF_SECOND || this === ChronoField.MICRO_OF_DAY || this === ChronoField.MILLI_OF_SECOND || this === ChronoField.MILLI_OF_DAY || this === ChronoField.SECOND_OF_MINUTE || this === ChronoField.SECOND_OF_DAY || this === ChronoField.MINUTE_OF_HOUR || this === ChronoField.MINUTE_OF_DAY || this === ChronoField.HOUR_OF_AMPM || this === ChronoField.CLOCK_HOUR_OF_AMPM || this === ChronoField.HOUR_OF_DAY || this === ChronoField.CLOCK_HOUR_OF_DAY || this === ChronoField.AMPM_OF_DAY;
    return timeBased;
  };

  _proto.rangeRefinedBy = function rangeRefinedBy(temporal) {
    return temporal.range(this);
  };

  _proto.getFrom = function getFrom(temporal) {
    return temporal.getLong(this);
  };

  _proto.toString = function toString() {
    return this.name();
  };

  _proto.equals = function equals(other) {
    return this === other;
  };

  _proto.adjustInto = function adjustInto(temporal, newValue) {
    return temporal.with(this, newValue);
  };

  _proto.isSupportedBy = function isSupportedBy(temporal) {
    return temporal.isSupported(this);
  };

  return ChronoField;
}(TemporalField);
function _init$k() {
  ChronoField.NANO_OF_SECOND = new ChronoField('NanoOfSecond', ChronoUnit.NANOS, ChronoUnit.SECONDS, ValueRange.of(0, 999999999));
  ChronoField.NANO_OF_DAY = new ChronoField('NanoOfDay', ChronoUnit.NANOS, ChronoUnit.DAYS, ValueRange.of(0, 86400 * 1000000000 - 1));
  ChronoField.MICRO_OF_SECOND = new ChronoField('MicroOfSecond', ChronoUnit.MICROS, ChronoUnit.SECONDS, ValueRange.of(0, 999999));
  ChronoField.MICRO_OF_DAY = new ChronoField('MicroOfDay', ChronoUnit.MICROS, ChronoUnit.DAYS, ValueRange.of(0, 86400 * 1000000 - 1));
  ChronoField.MILLI_OF_SECOND = new ChronoField('MilliOfSecond', ChronoUnit.MILLIS, ChronoUnit.SECONDS, ValueRange.of(0, 999));
  ChronoField.MILLI_OF_DAY = new ChronoField('MilliOfDay', ChronoUnit.MILLIS, ChronoUnit.DAYS, ValueRange.of(0, 86400 * 1000 - 1));
  ChronoField.SECOND_OF_MINUTE = new ChronoField('SecondOfMinute', ChronoUnit.SECONDS, ChronoUnit.MINUTES, ValueRange.of(0, 59));
  ChronoField.SECOND_OF_DAY = new ChronoField('SecondOfDay', ChronoUnit.SECONDS, ChronoUnit.DAYS, ValueRange.of(0, 86400 - 1));
  ChronoField.MINUTE_OF_HOUR = new ChronoField('MinuteOfHour', ChronoUnit.MINUTES, ChronoUnit.HOURS, ValueRange.of(0, 59));
  ChronoField.MINUTE_OF_DAY = new ChronoField('MinuteOfDay', ChronoUnit.MINUTES, ChronoUnit.DAYS, ValueRange.of(0, 24 * 60 - 1));
  ChronoField.HOUR_OF_AMPM = new ChronoField('HourOfAmPm', ChronoUnit.HOURS, ChronoUnit.HALF_DAYS, ValueRange.of(0, 11));
  ChronoField.CLOCK_HOUR_OF_AMPM = new ChronoField('ClockHourOfAmPm', ChronoUnit.HOURS, ChronoUnit.HALF_DAYS, ValueRange.of(1, 12));
  ChronoField.HOUR_OF_DAY = new ChronoField('HourOfDay', ChronoUnit.HOURS, ChronoUnit.DAYS, ValueRange.of(0, 23));
  ChronoField.CLOCK_HOUR_OF_DAY = new ChronoField('ClockHourOfDay', ChronoUnit.HOURS, ChronoUnit.DAYS, ValueRange.of(1, 24));
  ChronoField.AMPM_OF_DAY = new ChronoField('AmPmOfDay', ChronoUnit.HALF_DAYS, ChronoUnit.DAYS, ValueRange.of(0, 1));
  ChronoField.DAY_OF_WEEK = new ChronoField('DayOfWeek', ChronoUnit.DAYS, ChronoUnit.WEEKS, ValueRange.of(1, 7));
  ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH = new ChronoField('AlignedDayOfWeekInMonth', ChronoUnit.DAYS, ChronoUnit.WEEKS, ValueRange.of(1, 7));
  ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR = new ChronoField('AlignedDayOfWeekInYear', ChronoUnit.DAYS, ChronoUnit.WEEKS, ValueRange.of(1, 7));
  ChronoField.DAY_OF_MONTH = new ChronoField('DayOfMonth', ChronoUnit.DAYS, ChronoUnit.MONTHS, ValueRange.of(1, 28, 31), 'day');
  ChronoField.DAY_OF_YEAR = new ChronoField('DayOfYear', ChronoUnit.DAYS, ChronoUnit.YEARS, ValueRange.of(1, 365, 366));
  ChronoField.EPOCH_DAY = new ChronoField('EpochDay', ChronoUnit.DAYS, ChronoUnit.FOREVER, ValueRange.of(Math.floor(YearConstants.MIN_VALUE * 365.25), Math.floor(YearConstants.MAX_VALUE * 365.25)));
  ChronoField.ALIGNED_WEEK_OF_MONTH = new ChronoField('AlignedWeekOfMonth', ChronoUnit.WEEKS, ChronoUnit.MONTHS, ValueRange.of(1, 4, 5));
  ChronoField.ALIGNED_WEEK_OF_YEAR = new ChronoField('AlignedWeekOfYear', ChronoUnit.WEEKS, ChronoUnit.YEARS, ValueRange.of(1, 53));
  ChronoField.MONTH_OF_YEAR = new ChronoField('MonthOfYear', ChronoUnit.MONTHS, ChronoUnit.YEARS, ValueRange.of(1, 12), 'month');
  ChronoField.PROLEPTIC_MONTH = new ChronoField('ProlepticMonth', ChronoUnit.MONTHS, ChronoUnit.FOREVER, ValueRange.of(YearConstants.MIN_VALUE * 12, YearConstants.MAX_VALUE * 12 + 11));
  ChronoField.YEAR_OF_ERA = new ChronoField('YearOfEra', ChronoUnit.YEARS, ChronoUnit.FOREVER, ValueRange.of(1, YearConstants.MAX_VALUE, YearConstants.MAX_VALUE + 1));
  ChronoField.YEAR = new ChronoField('Year', ChronoUnit.YEARS, ChronoUnit.FOREVER, ValueRange.of(YearConstants.MIN_VALUE, YearConstants.MAX_VALUE), 'year');
  ChronoField.ERA = new ChronoField('Era', ChronoUnit.ERAS, ChronoUnit.FOREVER, ValueRange.of(0, 1));
  ChronoField.INSTANT_SECONDS = new ChronoField('InstantSeconds', ChronoUnit.SECONDS, ChronoUnit.FOREVER, ValueRange.of(MIN_SAFE_INTEGER, MAX_SAFE_INTEGER));
  ChronoField.OFFSET_SECONDS = new ChronoField('OffsetSeconds', ChronoUnit.SECONDS, ChronoUnit.FOREVER, ValueRange.of(-18 * 3600, 18 * 3600));
}

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var TemporalQueries = function () {
  function TemporalQueries() {}

  TemporalQueries.zoneId = function zoneId() {
    return TemporalQueries.ZONE_ID;
  };

  TemporalQueries.chronology = function chronology() {
    return TemporalQueries.CHRONO;
  };

  TemporalQueries.precision = function precision() {
    return TemporalQueries.PRECISION;
  };

  TemporalQueries.zone = function zone() {
    return TemporalQueries.ZONE;
  };

  TemporalQueries.offset = function offset() {
    return TemporalQueries.OFFSET;
  };

  TemporalQueries.localDate = function localDate() {
    return TemporalQueries.LOCAL_DATE;
  };

  TemporalQueries.localTime = function localTime() {
    return TemporalQueries.LOCAL_TIME;
  };

  return TemporalQueries;
}();

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var TemporalAccessor = function () {
  function TemporalAccessor() {}

  var _proto = TemporalAccessor.prototype;

  _proto.query = function query(_query) {
    if (_query === TemporalQueries.zoneId() || _query === TemporalQueries.chronology() || _query === TemporalQueries.precision()) {
      return null;
    }

    return _query.queryFrom(this);
  };

  _proto.get = function get(field) {
    return this.range(field).checkValidIntValue(this.getLong(field), field);
  };

  _proto.getLong = function getLong(field) {
    abstractMethodFail('getLong');
  };

  _proto.range = function range(field) {
    if (field instanceof ChronoField) {
      if (this.isSupported(field)) {
        return field.range();
      }

      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.rangeRefinedBy(this);
  };

  _proto.isSupported = function isSupported(field) {
    abstractMethodFail('isSupported');
  };

  return TemporalAccessor;
}();

var TemporalQuery = function (_Enum) {
  _inheritsLoose(TemporalQuery, _Enum);

  function TemporalQuery() {
    return _Enum.apply(this, arguments) || this;
  }

  var _proto = TemporalQuery.prototype;

  _proto.queryFrom = function queryFrom(temporal) {
    abstractMethodFail('queryFrom');
  };

  return TemporalQuery;
}(Enum);
function createTemporalQuery(name, queryFromFunction) {
  var ExtendedTemporalQuery = function (_TemporalQuery) {
    _inheritsLoose(ExtendedTemporalQuery, _TemporalQuery);

    function ExtendedTemporalQuery() {
      return _TemporalQuery.apply(this, arguments) || this;
    }

    return ExtendedTemporalQuery;
  }(TemporalQuery);

  ExtendedTemporalQuery.prototype.queryFrom = queryFromFunction;
  return new ExtendedTemporalQuery(name);
}

var DayOfWeek = function (_TemporalAccessor) {
  _inheritsLoose(DayOfWeek, _TemporalAccessor);

  function DayOfWeek(ordinal, name) {
    var _this;

    _this = _TemporalAccessor.call(this) || this;
    _this._ordinal = ordinal;
    _this._name = name;
    return _this;
  }

  var _proto = DayOfWeek.prototype;

  _proto.ordinal = function ordinal() {
    return this._ordinal;
  };

  _proto.name = function name() {
    return this._name;
  };

  DayOfWeek.values = function values() {
    return ENUMS.slice();
  };

  DayOfWeek.valueOf = function valueOf(name) {
    var ordinal = 0;

    for (ordinal; ordinal < ENUMS.length; ordinal++) {
      if (ENUMS[ordinal].name() === name) {
        break;
      }
    }

    return DayOfWeek.of(ordinal + 1);
  };

  DayOfWeek.of = function of(dayOfWeek) {
    if (dayOfWeek < 1 || dayOfWeek > 7) {
      throw new DateTimeException("Invalid value for DayOfWeek: " + dayOfWeek);
    }

    return ENUMS[dayOfWeek - 1];
  };

  DayOfWeek.from = function from(temporal) {
    assert(temporal != null, 'temporal', NullPointerException);

    if (temporal instanceof DayOfWeek) {
      return temporal;
    }

    try {
      return DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
    } catch (ex) {
      if (ex instanceof DateTimeException) {
        throw new DateTimeException("Unable to obtain DayOfWeek from TemporalAccessor: " + temporal + ", type " + (temporal.constructor != null ? temporal.constructor.name : ''), ex);
      } else {
        throw ex;
      }
    }
  };

  _proto.value = function value() {
    return this._ordinal + 1;
  };

  _proto.displayName = function displayName(style, locale) {
    throw new IllegalArgumentException('Pattern using (localized) text not implemented yet!');
  };

  _proto.isSupported = function isSupported(field) {
    if (field instanceof ChronoField) {
      return field === ChronoField.DAY_OF_WEEK;
    }

    return field != null && field.isSupportedBy(this);
  };

  _proto.range = function range(field) {
    if (field === ChronoField.DAY_OF_WEEK) {
      return field.range();
    } else if (field instanceof ChronoField) {
      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.rangeRefinedBy(this);
  };

  _proto.get = function get(field) {
    if (field === ChronoField.DAY_OF_WEEK) {
      return this.value();
    }

    return this.range(field).checkValidIntValue(this.getLong(field), field);
  };

  _proto.getLong = function getLong(field) {
    if (field === ChronoField.DAY_OF_WEEK) {
      return this.value();
    } else if (field instanceof ChronoField) {
      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.getFrom(this);
  };

  _proto.plus = function plus(days) {
    var amount = MathUtil.floorMod(days, 7);
    return ENUMS[MathUtil.floorMod(this._ordinal + (amount + 7), 7)];
  };

  _proto.minus = function minus(days) {
    return this.plus(-1 * MathUtil.floorMod(days, 7));
  };

  _proto.query = function query(_query) {
    if (_query === TemporalQueries.precision()) {
      return ChronoUnit.DAYS;
    } else if (_query === TemporalQueries.localDate() || _query === TemporalQueries.localTime() || _query === TemporalQueries.chronology() || _query === TemporalQueries.zone() || _query === TemporalQueries.zoneId() || _query === TemporalQueries.offset()) {
      return null;
    }

    assert(_query != null, 'query', NullPointerException);
    return _query.queryFrom(this);
  };

  _proto.adjustInto = function adjustInto(temporal) {
    requireNonNull(temporal, 'temporal');
    return temporal.with(ChronoField.DAY_OF_WEEK, this.value());
  };

  _proto.equals = function equals(other) {
    return this === other;
  };

  _proto.toString = function toString() {
    return this._name;
  };

  _proto.compareTo = function compareTo(other) {
    requireNonNull(other, 'other');
    requireInstance(other, DayOfWeek, 'other');
    return this._ordinal - other._ordinal;
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  return DayOfWeek;
}(TemporalAccessor);
var ENUMS;
function _init$j() {
  DayOfWeek.MONDAY = new DayOfWeek(0, 'MONDAY');
  DayOfWeek.TUESDAY = new DayOfWeek(1, 'TUESDAY');
  DayOfWeek.WEDNESDAY = new DayOfWeek(2, 'WEDNESDAY');
  DayOfWeek.THURSDAY = new DayOfWeek(3, 'THURSDAY');
  DayOfWeek.FRIDAY = new DayOfWeek(4, 'FRIDAY');
  DayOfWeek.SATURDAY = new DayOfWeek(5, 'SATURDAY');
  DayOfWeek.SUNDAY = new DayOfWeek(6, 'SUNDAY');
  DayOfWeek.FROM = createTemporalQuery('DayOfWeek.FROM', function (temporal) {
    return DayOfWeek.from(temporal);
  });
  ENUMS = [DayOfWeek.MONDAY, DayOfWeek.TUESDAY, DayOfWeek.WEDNESDAY, DayOfWeek.THURSDAY, DayOfWeek.FRIDAY, DayOfWeek.SATURDAY, DayOfWeek.SUNDAY];
}

var Month = function (_TemporalAccessor) {
  _inheritsLoose(Month, _TemporalAccessor);

  function Month(value, name) {
    var _this;

    _this = _TemporalAccessor.call(this) || this;
    _this._value = MathUtil.safeToInt(value);
    _this._name = name;
    return _this;
  }

  var _proto = Month.prototype;

  _proto.value = function value() {
    return this._value;
  };

  _proto.ordinal = function ordinal() {
    return this._value - 1;
  };

  _proto.name = function name() {
    return this._name;
  };

  _proto.displayName = function displayName(style, locale) {
    throw new IllegalArgumentException('Pattern using (localized) text not implemented yet!');
  };

  _proto.isSupported = function isSupported(field) {
    if (null === field) {
      return false;
    }

    if (field instanceof ChronoField) {
      return field === ChronoField.MONTH_OF_YEAR;
    }

    return field != null && field.isSupportedBy(this);
  };

  _proto.get = function get(field) {
    if (field === ChronoField.MONTH_OF_YEAR) {
      return this.value();
    }

    return this.range(field).checkValidIntValue(this.getLong(field), field);
  };

  _proto.getLong = function getLong(field) {
    if (field === ChronoField.MONTH_OF_YEAR) {
      return this.value();
    } else if (field instanceof ChronoField) {
      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.getFrom(this);
  };

  _proto.plus = function plus(months) {
    var amount = MathUtil.intMod(months, 12) + 12;
    var newMonthVal = MathUtil.intMod(this.value() + amount, 12);
    newMonthVal = newMonthVal === 0 ? 12 : newMonthVal;
    return Month.of(newMonthVal);
  };

  _proto.minus = function minus(months) {
    return this.plus(-1 * MathUtil.intMod(months, 12));
  };

  _proto.length = function length(leapYear) {
    switch (this) {
      case Month.FEBRUARY:
        return leapYear ? 29 : 28;

      case Month.APRIL:
      case Month.JUNE:
      case Month.SEPTEMBER:
      case Month.NOVEMBER:
        return 30;

      default:
        return 31;
    }
  };

  _proto.minLength = function minLength() {
    switch (this) {
      case Month.FEBRUARY:
        return 28;

      case Month.APRIL:
      case Month.JUNE:
      case Month.SEPTEMBER:
      case Month.NOVEMBER:
        return 30;

      default:
        return 31;
    }
  };

  _proto.maxLength = function maxLength() {
    switch (this) {
      case Month.FEBRUARY:
        return 29;

      case Month.APRIL:
      case Month.JUNE:
      case Month.SEPTEMBER:
      case Month.NOVEMBER:
        return 30;

      default:
        return 31;
    }
  };

  _proto.firstDayOfYear = function firstDayOfYear(leapYear) {
    var leap = leapYear ? 1 : 0;

    switch (this) {
      case Month.JANUARY:
        return 1;

      case Month.FEBRUARY:
        return 32;

      case Month.MARCH:
        return 60 + leap;

      case Month.APRIL:
        return 91 + leap;

      case Month.MAY:
        return 121 + leap;

      case Month.JUNE:
        return 152 + leap;

      case Month.JULY:
        return 182 + leap;

      case Month.AUGUST:
        return 213 + leap;

      case Month.SEPTEMBER:
        return 244 + leap;

      case Month.OCTOBER:
        return 274 + leap;

      case Month.NOVEMBER:
        return 305 + leap;

      case Month.DECEMBER:
      default:
        return 335 + leap;
    }
  };

  _proto.firstMonthOfQuarter = function firstMonthOfQuarter() {
    switch (this) {
      case Month.JANUARY:
      case Month.FEBRUARY:
      case Month.MARCH:
        return Month.JANUARY;

      case Month.APRIL:
      case Month.MAY:
      case Month.JUNE:
        return Month.APRIL;

      case Month.JULY:
      case Month.AUGUST:
      case Month.SEPTEMBER:
        return Month.JULY;

      case Month.OCTOBER:
      case Month.NOVEMBER:
      case Month.DECEMBER:
      default:
        return Month.OCTOBER;
    }
  };

  _proto.query = function query(_query) {
    assert(_query != null, 'query() parameter must not be null', DateTimeException);

    if (_query === TemporalQueries.chronology()) {
      return IsoChronology.INSTANCE;
    } else if (_query === TemporalQueries.precision()) {
      return ChronoUnit.MONTHS;
    }

    return _TemporalAccessor.prototype.query.call(this, _query);
  };

  _proto.toString = function toString() {
    switch (this) {
      case Month.JANUARY:
        return 'JANUARY';

      case Month.FEBRUARY:
        return 'FEBRUARY';

      case Month.MARCH:
        return 'MARCH';

      case Month.APRIL:
        return 'APRIL';

      case Month.MAY:
        return 'MAY';

      case Month.JUNE:
        return 'JUNE';

      case Month.JULY:
        return 'JULY';

      case Month.AUGUST:
        return 'AUGUST';

      case Month.SEPTEMBER:
        return 'SEPTEMBER';

      case Month.OCTOBER:
        return 'OCTOBER';

      case Month.NOVEMBER:
        return 'NOVEMBER';

      case Month.DECEMBER:
        return 'DECEMBER';

      default:
        return "unknown Month, value: " + this.value();
    }
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  _proto.adjustInto = function adjustInto(temporal) {
    return temporal.with(ChronoField.MONTH_OF_YEAR, this.value());
  };

  _proto.compareTo = function compareTo(other) {
    requireNonNull(other, 'other');
    requireInstance(other, Month, 'other');
    return this._value - other._value;
  };

  _proto.equals = function equals(other) {
    return this === other;
  };

  Month.valueOf = function valueOf(name) {
    var ordinal = 0;

    for (ordinal; ordinal < MONTHS.length; ordinal++) {
      if (MONTHS[ordinal].name() === name) {
        break;
      }
    }

    return Month.of(ordinal + 1);
  };

  Month.values = function values() {
    return MONTHS.slice();
  };

  Month.of = function of(month) {
    if (month < 1 || month > 12) {
      assert(false, "Invalid value for MonthOfYear: " + month, DateTimeException);
    }

    return MONTHS[month - 1];
  };

  Month.from = function from(temporal) {
    if (temporal instanceof Month) {
      return temporal;
    }

    try {
      return Month.of(temporal.get(ChronoField.MONTH_OF_YEAR));
    } catch (ex) {
      throw new DateTimeException("Unable to obtain Month from TemporalAccessor: " + temporal + " of type " + (temporal && temporal.constructor != null ? temporal.constructor.name : ''), ex);
    }
  };

  return Month;
}(TemporalAccessor);
var MONTHS;
function _init$i() {
  Month.JANUARY = new Month(1, 'JANUARY');
  Month.FEBRUARY = new Month(2, 'FEBRUARY');
  Month.MARCH = new Month(3, 'MARCH');
  Month.APRIL = new Month(4, 'APRIL');
  Month.MAY = new Month(5, 'MAY');
  Month.JUNE = new Month(6, 'JUNE');
  Month.JULY = new Month(7, 'JULY');
  Month.AUGUST = new Month(8, 'AUGUST');
  Month.SEPTEMBER = new Month(9, 'SEPTEMBER');
  Month.OCTOBER = new Month(10, 'OCTOBER');
  Month.NOVEMBER = new Month(11, 'NOVEMBER');
  Month.DECEMBER = new Month(12, 'DECEMBER');
  MONTHS = [Month.JANUARY, Month.FEBRUARY, Month.MARCH, Month.APRIL, Month.MAY, Month.JUNE, Month.JULY, Month.AUGUST, Month.SEPTEMBER, Month.OCTOBER, Month.NOVEMBER, Month.DECEMBER];
}

var PATTERN = /([-+]?)P(?:([-+]?[0-9]+)Y)?(?:([-+]?[0-9]+)M)?(?:([-+]?[0-9]+)W)?(?:([-+]?[0-9]+)D)?/;
var Period = function (_TemporalAmount) {
  _inheritsLoose(Period, _TemporalAmount);

  function Period(years, months, days) {
    var _this;

    _this = _TemporalAmount.call(this) || this;

    var _years = MathUtil.safeToInt(years);

    var _months = MathUtil.safeToInt(months);

    var _days = MathUtil.safeToInt(days);

    if (_years === 0 && _months === 0 && _days === 0) {
      if (!Period.ZERO) {
        _this._years = _years;
        _this._months = _months;
        _this._days = _days;
        Period.ZERO = _assertThisInitialized(_this);
      }

      return Period.ZERO || _assertThisInitialized(_this);
    }

    _this._years = _years;
    _this._months = _months;
    _this._days = _days;
    return _this;
  }

  Period.ofYears = function ofYears(years) {
    return Period.create(years, 0, 0);
  };

  Period.ofMonths = function ofMonths(months) {
    return Period.create(0, months, 0);
  };

  Period.ofWeeks = function ofWeeks(weeks) {
    return Period.create(0, 0, MathUtil.safeMultiply(weeks, 7));
  };

  Period.ofDays = function ofDays(days) {
    return Period.create(0, 0, days);
  };

  Period.of = function of(years, months, days) {
    return Period.create(years, months, days);
  };

  Period.from = function from(amount) {
    if (amount instanceof Period) {
      return amount;
    }

    requireNonNull(amount, 'amount');
    var years = 0;
    var months = 0;
    var days = 0;
    var units = amount.units();

    for (var i = 0; i < units.length; i++) {
      var unit = units[i];
      var unitAmount = amount.get(unit);

      if (unit === ChronoUnit.YEARS) {
        years = MathUtil.safeToInt(unitAmount);
      } else if (unit === ChronoUnit.MONTHS) {
        months = MathUtil.safeToInt(unitAmount);
      } else if (unit === ChronoUnit.DAYS) {
        days = MathUtil.safeToInt(unitAmount);
      } else {
        throw new DateTimeException("Unit must be Years, Months or Days, but was " + unit);
      }
    }

    return Period.create(years, months, days);
  };

  Period.between = function between(startDate, endDate) {
    requireNonNull(startDate, 'startDate');
    requireNonNull(endDate, 'endDate');
    requireInstance(startDate, LocalDate, 'startDate');
    requireInstance(endDate, LocalDate, 'endDate');
    return startDate.until(endDate);
  };

  Period.parse = function parse(text) {
    requireNonNull(text, 'text');

    try {
      return Period._parse(text);
    } catch (ex) {
      if (ex instanceof ArithmeticException) {
        throw new DateTimeParseException('Text cannot be parsed to a Period', text, 0, ex);
      } else {
        throw ex;
      }
    }
  };

  Period._parse = function _parse(text) {
    var matches = PATTERN.exec(text);

    if (matches != null) {
      var negate = '-' === matches[1] ? -1 : 1;
      var yearMatch = matches[2];
      var monthMatch = matches[3];
      var weekMatch = matches[4];
      var dayMatch = matches[5];

      if (yearMatch != null || monthMatch != null || weekMatch != null || dayMatch != null) {
        var years = Period._parseNumber(text, yearMatch, negate);

        var months = Period._parseNumber(text, monthMatch, negate);

        var weeks = Period._parseNumber(text, weekMatch, negate);

        var days = Period._parseNumber(text, dayMatch, negate);

        days = MathUtil.safeAdd(days, MathUtil.safeMultiply(weeks, 7));
        return Period.create(years, months, days);
      }
    }

    throw new DateTimeParseException('Text cannot be parsed to a Period', text, 0);
  };

  Period._parseNumber = function _parseNumber(text, str, negate) {
    if (str == null) {
      return 0;
    }

    var val = MathUtil.parseInt(str);
    return MathUtil.safeMultiply(val, negate);
  };

  Period.create = function create(years, months, days) {
    return new Period(years, months, days);
  };

  var _proto = Period.prototype;

  _proto.units = function units() {
    return [ChronoUnit.YEARS, ChronoUnit.MONTHS, ChronoUnit.DAYS];
  };

  _proto.chronology = function chronology() {
    return IsoChronology.INSTANCE;
  };

  _proto.get = function get(unit) {
    if (unit === ChronoUnit.YEARS) {
      return this._years;
    }

    if (unit === ChronoUnit.MONTHS) {
      return this._months;
    }

    if (unit === ChronoUnit.DAYS) {
      return this._days;
    }

    throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
  };

  _proto.isZero = function isZero() {
    return this === Period.ZERO;
  };

  _proto.isNegative = function isNegative() {
    return this._years < 0 || this._months < 0 || this._days < 0;
  };

  _proto.years = function years() {
    return this._years;
  };

  _proto.months = function months() {
    return this._months;
  };

  _proto.days = function days() {
    return this._days;
  };

  _proto.withYears = function withYears(years) {
    if (years === this._years) {
      return this;
    }

    return Period.create(years, this._months, this._days);
  };

  _proto.withMonths = function withMonths(months) {
    if (months === this._months) {
      return this;
    }

    return Period.create(this._years, months, this._days);
  };

  _proto.withDays = function withDays(days) {
    if (days === this._days) {
      return this;
    }

    return Period.create(this._years, this._months, days);
  };

  _proto.plus = function plus(amountToAdd) {
    var amount = Period.from(amountToAdd);
    return Period.create(MathUtil.safeAdd(this._years, amount._years), MathUtil.safeAdd(this._months, amount._months), MathUtil.safeAdd(this._days, amount._days));
  };

  _proto.plusYears = function plusYears(yearsToAdd) {
    if (yearsToAdd === 0) {
      return this;
    }

    return Period.create(MathUtil.safeToInt(MathUtil.safeAdd(this._years, yearsToAdd)), this._months, this._days);
  };

  _proto.plusMonths = function plusMonths(monthsToAdd) {
    if (monthsToAdd === 0) {
      return this;
    }

    return Period.create(this._years, MathUtil.safeToInt(MathUtil.safeAdd(this._months, monthsToAdd)), this._days);
  };

  _proto.plusDays = function plusDays(daysToAdd) {
    if (daysToAdd === 0) {
      return this;
    }

    return Period.create(this._years, this._months, MathUtil.safeToInt(MathUtil.safeAdd(this._days, daysToAdd)));
  };

  _proto.minus = function minus(amountToSubtract) {
    var amount = Period.from(amountToSubtract);
    return Period.create(MathUtil.safeSubtract(this._years, amount._years), MathUtil.safeSubtract(this._months, amount._months), MathUtil.safeSubtract(this._days, amount._days));
  };

  _proto.minusYears = function minusYears(yearsToSubtract) {
    return this.plusYears(-1 * yearsToSubtract);
  };

  _proto.minusMonths = function minusMonths(monthsToSubtract) {
    return this.plusMonths(-1 * monthsToSubtract);
  };

  _proto.minusDays = function minusDays(daysToSubtract) {
    return this.plusDays(-1 * daysToSubtract);
  };

  _proto.multipliedBy = function multipliedBy(scalar) {
    if (this === Period.ZERO || scalar === 1) {
      return this;
    }

    return Period.create(MathUtil.safeMultiply(this._years, scalar), MathUtil.safeMultiply(this._months, scalar), MathUtil.safeMultiply(this._days, scalar));
  };

  _proto.negated = function negated() {
    return this.multipliedBy(-1);
  };

  _proto.normalized = function normalized() {
    var totalMonths = this.toTotalMonths();
    var splitYears = MathUtil.intDiv(totalMonths, 12);
    var splitMonths = MathUtil.intMod(totalMonths, 12);

    if (splitYears === this._years && splitMonths === this._months) {
      return this;
    }

    return Period.create(MathUtil.safeToInt(splitYears), splitMonths, this._days);
  };

  _proto.toTotalMonths = function toTotalMonths() {
    return this._years * 12 + this._months;
  };

  _proto.addTo = function addTo(temporal) {
    requireNonNull(temporal, 'temporal');

    if (this._years !== 0) {
      if (this._months !== 0) {
        temporal = temporal.plus(this.toTotalMonths(), ChronoUnit.MONTHS);
      } else {
        temporal = temporal.plus(this._years, ChronoUnit.YEARS);
      }
    } else if (this._months !== 0) {
      temporal = temporal.plus(this._months, ChronoUnit.MONTHS);
    }

    if (this._days !== 0) {
      temporal = temporal.plus(this._days, ChronoUnit.DAYS);
    }

    return temporal;
  };

  _proto.subtractFrom = function subtractFrom(temporal) {
    requireNonNull(temporal, 'temporal');

    if (this._years !== 0) {
      if (this._months !== 0) {
        temporal = temporal.minus(this.toTotalMonths(), ChronoUnit.MONTHS);
      } else {
        temporal = temporal.minus(this._years, ChronoUnit.YEARS);
      }
    } else if (this._months !== 0) {
      temporal = temporal.minus(this._months, ChronoUnit.MONTHS);
    }

    if (this._days !== 0) {
      temporal = temporal.minus(this._days, ChronoUnit.DAYS);
    }

    return temporal;
  };

  _proto.equals = function equals(obj) {
    if (this === obj) {
      return true;
    }

    if (obj instanceof Period) {
      var other = obj;
      return this._years === other._years && this._months === other._months && this._days === other._days;
    }

    return false;
  };

  _proto.hashCode = function hashCode() {
    return MathUtil.hashCode(this._years, this._months, this._days);
  };

  _proto.toString = function toString() {
    if (this === Period.ZERO) {
      return 'P0D';
    } else {
      var buf = 'P';

      if (this._years !== 0) {
        buf += this._years + "Y";
      }

      if (this._months !== 0) {
        buf += this._months + "M";
      }

      if (this._days !== 0) {
        buf += this._days + "D";
      }

      return buf;
    }
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  return Period;
}(TemporalAmount);
function _init$h() {
  Period.ofDays(0);
}

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var ParsePosition = function () {
  function ParsePosition(index) {
    this._index = index;
    this._errorIndex = -1;
  }

  var _proto = ParsePosition.prototype;

  _proto.getIndex = function getIndex() {
    return this._index;
  };

  _proto.setIndex = function setIndex(index) {
    this._index = index;
  };

  _proto.getErrorIndex = function getErrorIndex() {
    return this._errorIndex;
  };

  _proto.setErrorIndex = function setErrorIndex(errorIndex) {
    this._errorIndex = errorIndex;
  };

  return ParsePosition;
}();

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var EnumMap = function () {
  function EnumMap() {
    this._map = {};
  }

  var _proto = EnumMap.prototype;

  _proto.putAll = function putAll(otherMap) {
    for (var key in otherMap._map) {
      this._map[key] = otherMap._map[key];
    }

    return this;
  };

  _proto.containsKey = function containsKey(key) {
    return this._map.hasOwnProperty(key.name()) && this.get(key) !== undefined;
  };

  _proto.get = function get(key) {
    return this._map[key.name()];
  };

  _proto.put = function put(key, val) {
    return this.set(key, val);
  };

  _proto.set = function set(key, val) {
    this._map[key.name()] = val;
    return this;
  };

  _proto.retainAll = function retainAll(keyList) {
    var map = {};

    for (var i = 0; i < keyList.length; i++) {
      var key = keyList[i].name();
      map[key] = this._map[key];
    }

    this._map = map;
    return this;
  };

  _proto.remove = function remove(key) {
    var keyName = key.name();
    var val = this._map[keyName];
    this._map[keyName] = undefined;
    return val;
  };

  _proto.keySet = function keySet() {
    return this._map;
  };

  _proto.clear = function clear() {
    this._map = {};
  };

  return EnumMap;
}();

var ResolverStyle = function (_Enum) {
  _inheritsLoose(ResolverStyle, _Enum);

  function ResolverStyle() {
    return _Enum.apply(this, arguments) || this;
  }

  return ResolverStyle;
}(Enum);
ResolverStyle.STRICT = new ResolverStyle('STRICT');
ResolverStyle.SMART = new ResolverStyle('SMART');
ResolverStyle.LENIENT = new ResolverStyle('LENIENT');

var Temporal = function (_TemporalAccessor) {
  _inheritsLoose(Temporal, _TemporalAccessor);

  function Temporal() {
    return _TemporalAccessor.apply(this, arguments) || this;
  }

  var _proto = Temporal.prototype;

  _proto.isSupported = function isSupported(fieldOrUnit) {
    abstractMethodFail('isSupported');
  };

  _proto.minus = function minus(amount, unit) {
    if (arguments.length < 2) {
      return this._minusAmount(amount);
    } else {
      return this._minusUnit(amount, unit);
    }
  };

  _proto._minusAmount = function _minusAmount(amount) {
    requireNonNull(amount, 'amount');
    requireInstance(amount, TemporalAmount, 'amount');
    return amount.subtractFrom(this);
  };

  _proto._minusUnit = function _minusUnit(amountToSubtract, unit) {
    requireNonNull(amountToSubtract, 'amountToSubtract');
    requireNonNull(unit, 'unit');
    requireInstance(unit, TemporalUnit, 'unit');
    return this._plusUnit(-amountToSubtract, unit);
  };

  _proto.plus = function plus(amount, unit) {
    if (arguments.length < 2) {
      return this._plusAmount(amount);
    } else {
      return this._plusUnit(amount, unit);
    }
  };

  _proto._plusAmount = function _plusAmount(amount) {
    requireNonNull(amount, 'amount');
    requireInstance(amount, TemporalAmount, 'amount');
    return amount.addTo(this);
  };

  _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
    abstractMethodFail('_plusUnit');
  };

  _proto.until = function until(endTemporal, unit) {
    abstractMethodFail('until');
  };

  _proto.with = function _with(adjusterOrField, newValue) {
    if (arguments.length < 2) {
      return this._withAdjuster(adjusterOrField);
    } else {
      return this._withField(adjusterOrField, newValue);
    }
  };

  _proto._withAdjuster = function _withAdjuster(adjuster) {
    requireNonNull(adjuster, 'adjuster');
    assert(typeof adjuster.adjustInto === 'function', 'adjuster must be a TemporalAdjuster', IllegalArgumentException);
    return adjuster.adjustInto(this);
  };

  _proto._withField = function _withField(field, newValue) {
    abstractMethodFail('_withField');
  };

  return Temporal;
}(TemporalAccessor);

if (typeof Symbol !== 'undefined' && Symbol.toPrimitive) {
  Temporal.prototype[Symbol.toPrimitive] = function (hint) {
    if (hint !== 'number') {
      return this.toString();
    }

    throw new TypeError('A conversion from Temporal to a number is not allowed. ' + 'To compare use the methods .equals(), .compareTo(), .isBefore() ' + 'or one that is more suitable to your use case.');
  };
}

var ChronoLocalDate = function (_Temporal) {
  _inheritsLoose(ChronoLocalDate, _Temporal);

  function ChronoLocalDate() {
    return _Temporal.apply(this, arguments) || this;
  }

  var _proto = ChronoLocalDate.prototype;

  _proto.isSupported = function isSupported(fieldOrUnit) {
    if (fieldOrUnit instanceof ChronoField) {
      return fieldOrUnit.isDateBased();
    } else if (fieldOrUnit instanceof ChronoUnit) {
      return fieldOrUnit.isDateBased();
    }

    return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
  };

  _proto.query = function query(_query) {
    if (_query === TemporalQueries.chronology()) {
      return this.chronology();
    } else if (_query === TemporalQueries.precision()) {
      return ChronoUnit.DAYS;
    } else if (_query === TemporalQueries.localDate()) {
      return LocalDate.ofEpochDay(this.toEpochDay());
    } else if (_query === TemporalQueries.localTime() || _query === TemporalQueries.zone() || _query === TemporalQueries.zoneId() || _query === TemporalQueries.offset()) {
      return null;
    }

    return _Temporal.prototype.query.call(this, _query);
  };

  _proto.adjustInto = function adjustInto(temporal) {
    return temporal.with(ChronoField.EPOCH_DAY, this.toEpochDay());
  };

  _proto.format = function format(formatter) {
    requireNonNull(formatter, 'formatter');
    requireInstance(formatter, DateTimeFormatter, 'formatter');
    return formatter.format(this);
  };

  return ChronoLocalDate;
}(Temporal);

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var StringUtil = function () {
  function StringUtil() {}

  StringUtil.startsWith = function startsWith(text, pattern) {
    return text.indexOf(pattern) === 0;
  };

  StringUtil.hashCode = function hashCode(text) {
    var len = text.length;

    if (len === 0) {
      return 0;
    }

    var hash = 0;

    for (var i = 0; i < len; i++) {
      var chr = text.charCodeAt(i);
      hash = (hash << 5) - hash + chr;
      hash |= 0;
    }

    return MathUtil.smi(hash);
  };

  return StringUtil;
}();

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var ZoneId = function () {
  function ZoneId() {}

  ZoneId.systemDefault = function systemDefault() {
    throw new DateTimeException('not supported operation');
  };

  ZoneId.getAvailableZoneIds = function getAvailableZoneIds() {
    throw new DateTimeException('not supported operation');
  };

  ZoneId.of = function of(zoneId) {
    throw new DateTimeException("not supported operation" + zoneId);
  };

  ZoneId.ofOffset = function ofOffset(prefix, offset) {
    throw new DateTimeException("not supported operation" + prefix + offset);
  };

  ZoneId.from = function from(temporal) {
    throw new DateTimeException("not supported operation" + temporal);
  };

  var _proto = ZoneId.prototype;

  _proto.id = function id() {
    abstractMethodFail('ZoneId.id');
  };

  _proto.rules = function rules() {
    abstractMethodFail('ZoneId.rules');
  };

  _proto.normalized = function normalized() {
    var rules = this.rules();

    if (rules.isFixedOffset()) {
      return rules.offset(Instant.EPOCH);
    }

    return this;
  };

  _proto.equals = function equals(other) {
    if (this === other) {
      return true;
    }

    if (other instanceof ZoneId) {
      return this.id() === other.id();
    }

    return false;
  };

  _proto.hashCode = function hashCode() {
    return StringUtil.hashCode(this.id());
  };

  _proto.toString = function toString() {
    return this.id();
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  return ZoneId;
}();

var ZoneRules = function () {
  function ZoneRules() {}

  ZoneRules.of = function of(offset) {
    requireNonNull(offset, 'offset');
    return new Fixed(offset);
  };

  var _proto = ZoneRules.prototype;

  _proto.isFixedOffset = function isFixedOffset() {
    abstractMethodFail('ZoneRules.isFixedOffset');
  };

  _proto.offset = function offset(instantOrLocalDateTime) {
    if (instantOrLocalDateTime instanceof Instant) {
      return this.offsetOfInstant(instantOrLocalDateTime);
    } else {
      return this.offsetOfLocalDateTime(instantOrLocalDateTime);
    }
  };

  _proto.offsetOfInstant = function offsetOfInstant(instant) {
    abstractMethodFail('ZoneRules.offsetInstant');
  };

  _proto.offsetOfEpochMilli = function offsetOfEpochMilli(epochMilli) {
    abstractMethodFail('ZoneRules.offsetOfEpochMilli');
  };

  _proto.offsetOfLocalDateTime = function offsetOfLocalDateTime(localDateTime) {
    abstractMethodFail('ZoneRules.offsetLocalDateTime');
  };

  _proto.validOffsets = function validOffsets(localDateTime) {
    abstractMethodFail('ZoneRules.validOffsets');
  };

  _proto.transition = function transition(localDateTime) {
    abstractMethodFail('ZoneRules.transition');
  };

  _proto.standardOffset = function standardOffset(instant) {
    abstractMethodFail('ZoneRules.standardOffset');
  };

  _proto.daylightSavings = function daylightSavings(instant) {
    abstractMethodFail('ZoneRules.daylightSavings');
  };

  _proto.isDaylightSavings = function isDaylightSavings(instant) {
    abstractMethodFail('ZoneRules.isDaylightSavings');
  };

  _proto.isValidOffset = function isValidOffset(localDateTime, offset) {
    abstractMethodFail('ZoneRules.isValidOffset');
  };

  _proto.nextTransition = function nextTransition(instant) {
    abstractMethodFail('ZoneRules.nextTransition');
  };

  _proto.previousTransition = function previousTransition(instant) {
    abstractMethodFail('ZoneRules.previousTransition');
  };

  _proto.transitions = function transitions() {
    abstractMethodFail('ZoneRules.transitions');
  };

  _proto.transitionRules = function transitionRules() {
    abstractMethodFail('ZoneRules.transitionRules');
  };

  _proto.toString = function toString() {
    abstractMethodFail('ZoneRules.toString');
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  return ZoneRules;
}();

var Fixed = function (_ZoneRules) {
  _inheritsLoose(Fixed, _ZoneRules);

  function Fixed(offset) {
    var _this;

    _this = _ZoneRules.call(this) || this;
    _this._offset = offset;
    return _this;
  }

  var _proto2 = Fixed.prototype;

  _proto2.isFixedOffset = function isFixedOffset() {
    return true;
  };

  _proto2.offsetOfInstant = function offsetOfInstant() {
    return this._offset;
  };

  _proto2.offsetOfEpochMilli = function offsetOfEpochMilli() {
    return this._offset;
  };

  _proto2.offsetOfLocalDateTime = function offsetOfLocalDateTime() {
    return this._offset;
  };

  _proto2.validOffsets = function validOffsets() {
    return [this._offset];
  };

  _proto2.transition = function transition() {
    return null;
  };

  _proto2.standardOffset = function standardOffset() {
    return this._offset;
  };

  _proto2.daylightSavings = function daylightSavings() {
    return Duration.ZERO;
  };

  _proto2.isDaylightSavings = function isDaylightSavings() {
    return false;
  };

  _proto2.isValidOffset = function isValidOffset(localDateTime, offset) {
    return this._offset.equals(offset);
  };

  _proto2.nextTransition = function nextTransition() {
    return null;
  };

  _proto2.previousTransition = function previousTransition() {
    return null;
  };

  _proto2.transitions = function transitions() {
    return [];
  };

  _proto2.transitionRules = function transitionRules() {
    return [];
  };

  _proto2.equals = function equals(other) {
    if (this === other) {
      return true;
    }

    if (other instanceof Fixed) {
      return this._offset.equals(other._offset);
    }

    return false;
  };

  _proto2.toString = function toString() {
    return "FixedRules:" + this._offset.toString();
  };

  return Fixed;
}(ZoneRules);

var SECONDS_CACHE = {};
var ID_CACHE = {};
var ZoneOffset = function (_ZoneId) {
  _inheritsLoose(ZoneOffset, _ZoneId);

  function ZoneOffset(totalSeconds) {
    var _this;

    _this = _ZoneId.call(this) || this;

    ZoneOffset._validateTotalSeconds(totalSeconds);

    _this._totalSeconds = MathUtil.safeToInt(totalSeconds);
    _this._rules = ZoneRules.of(_assertThisInitialized(_this));
    _this._id = ZoneOffset._buildId(totalSeconds);
    return _this;
  }

  var _proto = ZoneOffset.prototype;

  _proto.totalSeconds = function totalSeconds() {
    return this._totalSeconds;
  };

  _proto.id = function id() {
    return this._id;
  };

  ZoneOffset._buildId = function _buildId(totalSeconds) {
    if (totalSeconds === 0) {
      return 'Z';
    } else {
      var absTotalSeconds = Math.abs(totalSeconds);
      var absHours = MathUtil.intDiv(absTotalSeconds, LocalTime.SECONDS_PER_HOUR);
      var absMinutes = MathUtil.intMod(MathUtil.intDiv(absTotalSeconds, LocalTime.SECONDS_PER_MINUTE), LocalTime.MINUTES_PER_HOUR);
      var buf = "" + (totalSeconds < 0 ? '-' : '+') + (absHours < 10 ? '0' : '') + absHours + (absMinutes < 10 ? ':0' : ':') + absMinutes;
      var absSeconds = MathUtil.intMod(absTotalSeconds, LocalTime.SECONDS_PER_MINUTE);

      if (absSeconds !== 0) {
        buf += (absSeconds < 10 ? ':0' : ':') + absSeconds;
      }

      return buf;
    }
  };

  ZoneOffset._validateTotalSeconds = function _validateTotalSeconds(totalSeconds) {
    if (Math.abs(totalSeconds) > ZoneOffset.MAX_SECONDS) {
      throw new DateTimeException('Zone offset not in valid range: -18:00 to +18:00');
    }
  };

  ZoneOffset._validate = function _validate(hours, minutes, seconds) {
    if (hours < -18 || hours > 18) {
      throw new DateTimeException("Zone offset hours not in valid range: value " + hours + " is not in the range -18 to 18");
    }

    if (hours > 0) {
      if (minutes < 0 || seconds < 0) {
        throw new DateTimeException('Zone offset minutes and seconds must be positive because hours is positive');
      }
    } else if (hours < 0) {
      if (minutes > 0 || seconds > 0) {
        throw new DateTimeException('Zone offset minutes and seconds must be negative because hours is negative');
      }
    } else if (minutes > 0 && seconds < 0 || minutes < 0 && seconds > 0) {
      throw new DateTimeException('Zone offset minutes and seconds must have the same sign');
    }

    if (Math.abs(minutes) > 59) {
      throw new DateTimeException("Zone offset minutes not in valid range: abs(value) " + Math.abs(minutes) + " is not in the range 0 to 59");
    }

    if (Math.abs(seconds) > 59) {
      throw new DateTimeException("Zone offset seconds not in valid range: abs(value) " + Math.abs(seconds) + " is not in the range 0 to 59");
    }

    if (Math.abs(hours) === 18 && (Math.abs(minutes) > 0 || Math.abs(seconds) > 0)) {
      throw new DateTimeException('Zone offset not in valid range: -18:00 to +18:00');
    }
  };

  ZoneOffset.of = function of(offsetId) {
    requireNonNull(offsetId, 'offsetId');
    var offset = ID_CACHE[offsetId];

    if (offset != null) {
      return offset;
    }

    var hours, minutes, seconds;

    switch (offsetId.length) {
      case 2:
        offsetId = offsetId[0] + "0" + offsetId[1];

      case 3:
        hours = ZoneOffset._parseNumber(offsetId, 1, false);
        minutes = 0;
        seconds = 0;
        break;

      case 5:
        hours = ZoneOffset._parseNumber(offsetId, 1, false);
        minutes = ZoneOffset._parseNumber(offsetId, 3, false);
        seconds = 0;
        break;

      case 6:
        hours = ZoneOffset._parseNumber(offsetId, 1, false);
        minutes = ZoneOffset._parseNumber(offsetId, 4, true);
        seconds = 0;
        break;

      case 7:
        hours = ZoneOffset._parseNumber(offsetId, 1, false);
        minutes = ZoneOffset._parseNumber(offsetId, 3, false);
        seconds = ZoneOffset._parseNumber(offsetId, 5, false);
        break;

      case 9:
        hours = ZoneOffset._parseNumber(offsetId, 1, false);
        minutes = ZoneOffset._parseNumber(offsetId, 4, true);
        seconds = ZoneOffset._parseNumber(offsetId, 7, true);
        break;

      default:
        throw new DateTimeException("Invalid ID for ZoneOffset, invalid format: " + offsetId);
    }

    var first = offsetId[0];

    if (first !== '+' && first !== '-') {
      throw new DateTimeException("Invalid ID for ZoneOffset, plus/minus not found when expected: " + offsetId);
    }

    if (first === '-') {
      return ZoneOffset.ofHoursMinutesSeconds(-hours, -minutes, -seconds);
    } else {
      return ZoneOffset.ofHoursMinutesSeconds(hours, minutes, seconds);
    }
  };

  ZoneOffset._parseNumber = function _parseNumber(offsetId, pos, precededByColon) {
    if (precededByColon && offsetId[pos - 1] !== ':') {
      throw new DateTimeException("Invalid ID for ZoneOffset, colon not found when expected: " + offsetId);
    }

    var ch1 = offsetId[pos];
    var ch2 = offsetId[pos + 1];

    if (ch1 < '0' || ch1 > '9' || ch2 < '0' || ch2 > '9') {
      throw new DateTimeException("Invalid ID for ZoneOffset, non numeric characters found: " + offsetId);
    }

    return (ch1.charCodeAt(0) - 48) * 10 + (ch2.charCodeAt(0) - 48);
  };

  ZoneOffset.ofHours = function ofHours(hours) {
    return ZoneOffset.ofHoursMinutesSeconds(hours, 0, 0);
  };

  ZoneOffset.ofHoursMinutes = function ofHoursMinutes(hours, minutes) {
    return ZoneOffset.ofHoursMinutesSeconds(hours, minutes, 0);
  };

  ZoneOffset.ofHoursMinutesSeconds = function ofHoursMinutesSeconds(hours, minutes, seconds) {
    ZoneOffset._validate(hours, minutes, seconds);

    var totalSeconds = hours * LocalTime.SECONDS_PER_HOUR + minutes * LocalTime.SECONDS_PER_MINUTE + seconds;
    return ZoneOffset.ofTotalSeconds(totalSeconds);
  };

  ZoneOffset.ofTotalMinutes = function ofTotalMinutes(totalMinutes) {
    var totalSeconds = totalMinutes * LocalTime.SECONDS_PER_MINUTE;
    return ZoneOffset.ofTotalSeconds(totalSeconds);
  };

  ZoneOffset.ofTotalSeconds = function ofTotalSeconds(totalSeconds) {
    if (totalSeconds % (15 * LocalTime.SECONDS_PER_MINUTE) === 0) {
      var totalSecs = totalSeconds;
      var result = SECONDS_CACHE[totalSecs];

      if (result == null) {
        result = new ZoneOffset(totalSeconds);
        SECONDS_CACHE[totalSecs] = result;
        ID_CACHE[result.id()] = result;
      }

      return result;
    } else {
      return new ZoneOffset(totalSeconds);
    }
  };

  _proto.rules = function rules() {
    return this._rules;
  };

  _proto.get = function get(field) {
    return this.getLong(field);
  };

  _proto.getLong = function getLong(field) {
    if (field === ChronoField.OFFSET_SECONDS) {
      return this._totalSeconds;
    } else if (field instanceof ChronoField) {
      throw new DateTimeException("Unsupported field: " + field);
    }

    return field.getFrom(this);
  };

  _proto.query = function query(_query) {
    requireNonNull(_query, 'query');

    if (_query === TemporalQueries.offset() || _query === TemporalQueries.zone()) {
      return this;
    } else if (_query === TemporalQueries.localDate() || _query === TemporalQueries.localTime() || _query === TemporalQueries.precision() || _query === TemporalQueries.chronology() || _query === TemporalQueries.zoneId()) {
      return null;
    }

    return _query.queryFrom(this);
  };

  _proto.adjustInto = function adjustInto(temporal) {
    return temporal.with(ChronoField.OFFSET_SECONDS, this._totalSeconds);
  };

  _proto.compareTo = function compareTo(other) {
    requireNonNull(other, 'other');
    return other._totalSeconds - this._totalSeconds;
  };

  _proto.equals = function equals(obj) {
    if (this === obj) {
      return true;
    }

    if (obj instanceof ZoneOffset) {
      return this._totalSeconds === obj._totalSeconds;
    }

    return false;
  };

  _proto.hashCode = function hashCode() {
    return this._totalSeconds;
  };

  _proto.toString = function toString() {
    return this._id;
  };

  return ZoneOffset;
}(ZoneId);
function _init$g() {
  ZoneOffset.MAX_SECONDS = 18 * LocalTime.SECONDS_PER_HOUR;
  ZoneOffset.UTC = ZoneOffset.ofTotalSeconds(0);
  ZoneOffset.MIN = ZoneOffset.ofTotalSeconds(-ZoneOffset.MAX_SECONDS);
  ZoneOffset.MAX = ZoneOffset.ofTotalSeconds(ZoneOffset.MAX_SECONDS);
}

var DateTimeBuilder = function (_TemporalAccessor) {
  _inheritsLoose(DateTimeBuilder, _TemporalAccessor);

  DateTimeBuilder.create = function create(field, value) {
    var dtb = new DateTimeBuilder();

    dtb._addFieldValue(field, value);

    return dtb;
  };

  function DateTimeBuilder() {
    var _this;

    _this = _TemporalAccessor.call(this) || this;
    _this.fieldValues = new EnumMap();
    _this.chrono = null;
    _this.zone = null;
    _this.date = null;
    _this.time = null;
    _this.leapSecond = false;
    _this.excessDays = null;
    return _this;
  }

  var _proto = DateTimeBuilder.prototype;

  _proto.getFieldValue0 = function getFieldValue0(field) {
    return this.fieldValues.get(field);
  };

  _proto._addFieldValue = function _addFieldValue(field, value) {
    requireNonNull(field, 'field');
    var old = this.getFieldValue0(field);

    if (old != null && old !== value) {
      throw new DateTimeException("Conflict found: " + field + " " + old + " differs from " + field + " " + value + ": " + this);
    }

    return this._putFieldValue0(field, value);
  };

  _proto._putFieldValue0 = function _putFieldValue0(field, value) {
    this.fieldValues.put(field, value);
    return this;
  };

  _proto.resolve = function resolve(resolverStyle, resolverFields) {
    if (resolverFields != null) {
      this.fieldValues.retainAll(resolverFields);
    }

    this._mergeDate(resolverStyle);

    this._mergeTime(resolverStyle);

    this._resolveTimeInferZeroes(resolverStyle);

    if (this.excessDays != null && this.excessDays.isZero() === false && this.date != null && this.time != null) {
      this.date = this.date.plus(this.excessDays);
      this.excessDays = Period.ZERO;
    }

    this._resolveInstant();

    return this;
  };

  _proto._mergeDate = function _mergeDate(resolverStyle) {
    this._checkDate(IsoChronology.INSTANCE.resolveDate(this.fieldValues, resolverStyle));
  };

  _proto._checkDate = function _checkDate(date) {
    if (date != null) {
      this._addObject(date);

      for (var fieldName in this.fieldValues.keySet()) {
        var field = ChronoField.byName(fieldName);

        if (field) {
          if (this.fieldValues.get(field) !== undefined) {
            if (field.isDateBased()) {
              var val1 = void 0;

              try {
                val1 = date.getLong(field);
              } catch (ex) {
                if (ex instanceof DateTimeException) {
                  continue;
                } else {
                  throw ex;
                }
              }

              var val2 = this.fieldValues.get(field);

              if (val1 !== val2) {
                throw new DateTimeException("Conflict found: Field " + field + " " + val1 + " differs from " + field + " " + val2 + " derived from " + date);
              }
            }
          }
        }
      }
    }
  };

  _proto._mergeTime = function _mergeTime(resolverStyle) {
    if (this.fieldValues.containsKey(ChronoField.CLOCK_HOUR_OF_DAY)) {
      var ch = this.fieldValues.remove(ChronoField.CLOCK_HOUR_OF_DAY);

      if (resolverStyle !== ResolverStyle.LENIENT) {
        if (resolverStyle === ResolverStyle.SMART && ch === 0) ; else {
          ChronoField.CLOCK_HOUR_OF_DAY.checkValidValue(ch);
        }
      }

      this._addFieldValue(ChronoField.HOUR_OF_DAY, ch === 24 ? 0 : ch);
    }

    if (this.fieldValues.containsKey(ChronoField.CLOCK_HOUR_OF_AMPM)) {
      var _ch = this.fieldValues.remove(ChronoField.CLOCK_HOUR_OF_AMPM);

      if (resolverStyle !== ResolverStyle.LENIENT) {
        if (resolverStyle === ResolverStyle.SMART && _ch === 0) ; else {
          ChronoField.CLOCK_HOUR_OF_AMPM.checkValidValue(_ch);
        }
      }

      this._addFieldValue(ChronoField.HOUR_OF_AMPM, _ch === 12 ? 0 : _ch);
    }

    if (resolverStyle !== ResolverStyle.LENIENT) {
      if (this.fieldValues.containsKey(ChronoField.AMPM_OF_DAY)) {
        ChronoField.AMPM_OF_DAY.checkValidValue(this.fieldValues.get(ChronoField.AMPM_OF_DAY));
      }

      if (this.fieldValues.containsKey(ChronoField.HOUR_OF_AMPM)) {
        ChronoField.HOUR_OF_AMPM.checkValidValue(this.fieldValues.get(ChronoField.HOUR_OF_AMPM));
      }
    }

    if (this.fieldValues.containsKey(ChronoField.AMPM_OF_DAY) && this.fieldValues.containsKey(ChronoField.HOUR_OF_AMPM)) {
      var ap = this.fieldValues.remove(ChronoField.AMPM_OF_DAY);
      var hap = this.fieldValues.remove(ChronoField.HOUR_OF_AMPM);

      this._addFieldValue(ChronoField.HOUR_OF_DAY, ap * 12 + hap);
    }

    if (this.fieldValues.containsKey(ChronoField.NANO_OF_DAY)) {
      var nod = this.fieldValues.remove(ChronoField.NANO_OF_DAY);

      if (resolverStyle !== ResolverStyle.LENIENT) {
        ChronoField.NANO_OF_DAY.checkValidValue(nod);
      }

      this._addFieldValue(ChronoField.SECOND_OF_DAY, MathUtil.intDiv(nod, 1000000000));

      this._addFieldValue(ChronoField.NANO_OF_SECOND, MathUtil.intMod(nod, 1000000000));
    }

    if (this.fieldValues.containsKey(ChronoField.MICRO_OF_DAY)) {
      var cod = this.fieldValues.remove(ChronoField.MICRO_OF_DAY);

      if (resolverStyle !== ResolverStyle.LENIENT) {
        ChronoField.MICRO_OF_DAY.checkValidValue(cod);
      }

      this._addFieldValue(ChronoField.SECOND_OF_DAY, MathUtil.intDiv(cod, 1000000));

      this._addFieldValue(ChronoField.MICRO_OF_SECOND, MathUtil.intMod(cod, 1000000));
    }

    if (this.fieldValues.containsKey(ChronoField.MILLI_OF_DAY)) {
      var lod = this.fieldValues.remove(ChronoField.MILLI_OF_DAY);

      if (resolverStyle !== ResolverStyle.LENIENT) {
        ChronoField.MILLI_OF_DAY.checkValidValue(lod);
      }

      this._addFieldValue(ChronoField.SECOND_OF_DAY, MathUtil.intDiv(lod, 1000));

      this._addFieldValue(ChronoField.MILLI_OF_SECOND, MathUtil.intMod(lod, 1000));
    }

    if (this.fieldValues.containsKey(ChronoField.SECOND_OF_DAY)) {
      var sod = this.fieldValues.remove(ChronoField.SECOND_OF_DAY);

      if (resolverStyle !== ResolverStyle.LENIENT) {
        ChronoField.SECOND_OF_DAY.checkValidValue(sod);
      }

      this._addFieldValue(ChronoField.HOUR_OF_DAY, MathUtil.intDiv(sod, 3600));

      this._addFieldValue(ChronoField.MINUTE_OF_HOUR, MathUtil.intMod(MathUtil.intDiv(sod, 60), 60));

      this._addFieldValue(ChronoField.SECOND_OF_MINUTE, MathUtil.intMod(sod, 60));
    }

    if (this.fieldValues.containsKey(ChronoField.MINUTE_OF_DAY)) {
      var mod = this.fieldValues.remove(ChronoField.MINUTE_OF_DAY);

      if (resolverStyle !== ResolverStyle.LENIENT) {
        ChronoField.MINUTE_OF_DAY.checkValidValue(mod);
      }

      this._addFieldValue(ChronoField.HOUR_OF_DAY, MathUtil.intDiv(mod, 60));

      this._addFieldValue(ChronoField.MINUTE_OF_HOUR, MathUtil.intMod(mod, 60));
    }

    if (resolverStyle !== ResolverStyle.LENIENT) {
      if (this.fieldValues.containsKey(ChronoField.MILLI_OF_SECOND)) {
        ChronoField.MILLI_OF_SECOND.checkValidValue(this.fieldValues.get(ChronoField.MILLI_OF_SECOND));
      }

      if (this.fieldValues.containsKey(ChronoField.MICRO_OF_SECOND)) {
        ChronoField.MICRO_OF_SECOND.checkValidValue(this.fieldValues.get(ChronoField.MICRO_OF_SECOND));
      }
    }

    if (this.fieldValues.containsKey(ChronoField.MILLI_OF_SECOND) && this.fieldValues.containsKey(ChronoField.MICRO_OF_SECOND)) {
      var los = this.fieldValues.remove(ChronoField.MILLI_OF_SECOND);
      var cos = this.fieldValues.get(ChronoField.MICRO_OF_SECOND);

      this._putFieldValue0(ChronoField.MICRO_OF_SECOND, los * 1000 + MathUtil.intMod(cos, 1000));
    }

    if (this.fieldValues.containsKey(ChronoField.MICRO_OF_SECOND) && this.fieldValues.containsKey(ChronoField.NANO_OF_SECOND)) {
      var nos = this.fieldValues.get(ChronoField.NANO_OF_SECOND);

      this._putFieldValue0(ChronoField.MICRO_OF_SECOND, MathUtil.intDiv(nos, 1000));

      this.fieldValues.remove(ChronoField.MICRO_OF_SECOND);
    }

    if (this.fieldValues.containsKey(ChronoField.MILLI_OF_SECOND) && this.fieldValues.containsKey(ChronoField.NANO_OF_SECOND)) {
      var _nos = this.fieldValues.get(ChronoField.NANO_OF_SECOND);

      this._putFieldValue0(ChronoField.MILLI_OF_SECOND, MathUtil.intDiv(_nos, 1000000));

      this.fieldValues.remove(ChronoField.MILLI_OF_SECOND);
    }

    if (this.fieldValues.containsKey(ChronoField.MICRO_OF_SECOND)) {
      var _cos = this.fieldValues.remove(ChronoField.MICRO_OF_SECOND);

      this._putFieldValue0(ChronoField.NANO_OF_SECOND, _cos * 1000);
    } else if (this.fieldValues.containsKey(ChronoField.MILLI_OF_SECOND)) {
      var _los = this.fieldValues.remove(ChronoField.MILLI_OF_SECOND);

      this._putFieldValue0(ChronoField.NANO_OF_SECOND, _los * 1000000);
    }
  };

  _proto._resolveTimeInferZeroes = function _resolveTimeInferZeroes(resolverStyle) {
    var hod = this.fieldValues.get(ChronoField.HOUR_OF_DAY);
    var moh = this.fieldValues.get(ChronoField.MINUTE_OF_HOUR);
    var som = this.fieldValues.get(ChronoField.SECOND_OF_MINUTE);
    var nos = this.fieldValues.get(ChronoField.NANO_OF_SECOND);

    if (hod == null) {
      return;
    }

    if (moh == null && (som != null || nos != null)) {
      return;
    }

    if (moh != null && som == null && nos != null) {
      return;
    }

    if (resolverStyle !== ResolverStyle.LENIENT) {
      if (hod != null) {
        if (resolverStyle === ResolverStyle.SMART && hod === 24 && (moh == null || moh === 0) && (som == null || som === 0) && (nos == null || nos === 0)) {
          hod = 0;
          this.excessDays = Period.ofDays(1);
        }

        var hodVal = ChronoField.HOUR_OF_DAY.checkValidIntValue(hod);

        if (moh != null) {
          var mohVal = ChronoField.MINUTE_OF_HOUR.checkValidIntValue(moh);

          if (som != null) {
            var somVal = ChronoField.SECOND_OF_MINUTE.checkValidIntValue(som);

            if (nos != null) {
              var nosVal = ChronoField.NANO_OF_SECOND.checkValidIntValue(nos);

              this._addObject(LocalTime.of(hodVal, mohVal, somVal, nosVal));
            } else {
              this._addObject(LocalTime.of(hodVal, mohVal, somVal));
            }
          } else {
            if (nos == null) {
              this._addObject(LocalTime.of(hodVal, mohVal));
            }
          }
        } else {
          if (som == null && nos == null) {
            this._addObject(LocalTime.of(hodVal, 0));
          }
        }
      }
    } else {
      if (hod != null) {
        var _hodVal = hod;

        if (moh != null) {
          if (som != null) {
            if (nos == null) {
              nos = 0;
            }

            var totalNanos = MathUtil.safeMultiply(_hodVal, 3600000000000);
            totalNanos = MathUtil.safeAdd(totalNanos, MathUtil.safeMultiply(moh, 60000000000));
            totalNanos = MathUtil.safeAdd(totalNanos, MathUtil.safeMultiply(som, 1000000000));
            totalNanos = MathUtil.safeAdd(totalNanos, nos);
            var excessDays = MathUtil.floorDiv(totalNanos, 86400000000000);
            var nod = MathUtil.floorMod(totalNanos, 86400000000000);

            this._addObject(LocalTime.ofNanoOfDay(nod));

            this.excessDays = Period.ofDays(excessDays);
          } else {
            var totalSecs = MathUtil.safeMultiply(_hodVal, 3600);
            totalSecs = MathUtil.safeAdd(totalSecs, MathUtil.safeMultiply(moh, 60));

            var _excessDays = MathUtil.floorDiv(totalSecs, 86400);

            var sod = MathUtil.floorMod(totalSecs, 86400);

            this._addObject(LocalTime.ofSecondOfDay(sod));

            this.excessDays = Period.ofDays(_excessDays);
          }
        } else {
          var _excessDays2 = MathUtil.safeToInt(MathUtil.floorDiv(_hodVal, 24));

          _hodVal = MathUtil.floorMod(_hodVal, 24);

          this._addObject(LocalTime.of(_hodVal, 0));

          this.excessDays = Period.ofDays(_excessDays2);
        }
      }
    }

    this.fieldValues.remove(ChronoField.HOUR_OF_DAY);
    this.fieldValues.remove(ChronoField.MINUTE_OF_HOUR);
    this.fieldValues.remove(ChronoField.SECOND_OF_MINUTE);
    this.fieldValues.remove(ChronoField.NANO_OF_SECOND);
  };

  _proto._addObject = function _addObject(dateOrTime) {
    if (dateOrTime instanceof ChronoLocalDate) {
      this.date = dateOrTime;
    } else if (dateOrTime instanceof LocalTime) {
      this.time = dateOrTime;
    }
  };

  _proto._resolveInstant = function _resolveInstant() {
    if (this.date != null && this.time != null) {
      var offsetSecs = this.fieldValues.get(ChronoField.OFFSET_SECONDS);

      if (offsetSecs != null) {
        var offset = ZoneOffset.ofTotalSeconds(offsetSecs);
        var instant = this.date.atTime(this.time).atZone(offset).getLong(ChronoField.INSTANT_SECONDS);
        this.fieldValues.put(ChronoField.INSTANT_SECONDS, instant);
      } else if (this.zone != null) {
        var _instant = this.date.atTime(this.time).atZone(this.zone).getLong(ChronoField.INSTANT_SECONDS);

        this.fieldValues.put(ChronoField.INSTANT_SECONDS, _instant);
      }
    }
  };

  _proto.build = function build(type) {
    return type.queryFrom(this);
  };

  _proto.isSupported = function isSupported(field) {
    if (field == null) {
      return false;
    }

    return this.fieldValues.containsKey(field) && this.fieldValues.get(field) !== undefined || this.date != null && this.date.isSupported(field) || this.time != null && this.time.isSupported(field);
  };

  _proto.getLong = function getLong(field) {
    requireNonNull(field, 'field');
    var value = this.getFieldValue0(field);

    if (value == null) {
      if (this.date != null && this.date.isSupported(field)) {
        return this.date.getLong(field);
      }

      if (this.time != null && this.time.isSupported(field)) {
        return this.time.getLong(field);
      }

      throw new DateTimeException("Field not found: " + field);
    }

    return value;
  };

  _proto.query = function query(_query) {
    if (_query === TemporalQueries.zoneId()) {
      return this.zone;
    } else if (_query === TemporalQueries.chronology()) {
      return this.chrono;
    } else if (_query === TemporalQueries.localDate()) {
      return this.date != null ? LocalDate.from(this.date) : null;
    } else if (_query === TemporalQueries.localTime()) {
      return this.time;
    } else if (_query === TemporalQueries.zone() || _query === TemporalQueries.offset()) {
      return _query.queryFrom(this);
    } else if (_query === TemporalQueries.precision()) {
      return null;
    }

    return _query.queryFrom(this);
  };

  return DateTimeBuilder;
}(TemporalAccessor);

var DateTimeParseContext = function () {
  function DateTimeParseContext() {
    if (arguments.length === 1) {
      if (arguments[0] instanceof DateTimeParseContext) {
        this._constructorSelf.apply(this, arguments);

        return;
      } else {
        this._constructorFormatter.apply(this, arguments);
      }
    } else {
      this._constructorParam.apply(this, arguments);
    }

    this._caseSensitive = true;
    this._strict = true;
    this._parsed = [new Parsed(this)];
  }

  var _proto = DateTimeParseContext.prototype;

  _proto._constructorParam = function _constructorParam(locale, symbols, chronology) {
    this._locale = locale;
    this._symbols = symbols;
    this._overrideChronology = chronology;
  };

  _proto._constructorFormatter = function _constructorFormatter(formatter) {
    this._locale = formatter.locale();
    this._symbols = formatter.decimalStyle();
    this._overrideChronology = formatter.chronology();
  };

  _proto._constructorSelf = function _constructorSelf(other) {
    this._locale = other._locale;
    this._symbols = other._symbols;
    this._overrideChronology = other._overrideChronology;
    this._overrideZone = other._overrideZone;
    this._caseSensitive = other._caseSensitive;
    this._strict = other._strict;
    this._parsed = [new Parsed(this)];
  };

  _proto.copy = function copy() {
    return new DateTimeParseContext(this);
  };

  _proto.symbols = function symbols() {
    return this._symbols;
  };

  _proto.isStrict = function isStrict() {
    return this._strict;
  };

  _proto.setStrict = function setStrict(strict) {
    this._strict = strict;
  };

  _proto.locale = function locale() {
    return this._locale;
  };

  _proto.setLocale = function setLocale(locale) {
    this._locale = locale;
  };

  _proto.startOptional = function startOptional() {
    this._parsed.push(this.currentParsed().copy());
  };

  _proto.endOptional = function endOptional(successful) {
    if (successful) {
      this._parsed.splice(this._parsed.length - 2, 1);
    } else {
      this._parsed.splice(this._parsed.length - 1, 1);
    }
  };

  _proto.isCaseSensitive = function isCaseSensitive() {
    return this._caseSensitive;
  };

  _proto.setCaseSensitive = function setCaseSensitive(caseSensitive) {
    this._caseSensitive = caseSensitive;
  };

  _proto.subSequenceEquals = function subSequenceEquals(cs1, offset1, cs2, offset2, length) {
    if (offset1 + length > cs1.length || offset2 + length > cs2.length) {
      return false;
    }

    if (!this.isCaseSensitive()) {
      cs1 = cs1.toLowerCase();
      cs2 = cs2.toLowerCase();
    }

    for (var i = 0; i < length; i++) {
      var ch1 = cs1[offset1 + i];
      var ch2 = cs2[offset2 + i];

      if (ch1 !== ch2) {
        return false;
      }
    }

    return true;
  };

  _proto.charEquals = function charEquals(ch1, ch2) {
    if (this.isCaseSensitive()) {
      return ch1 === ch2;
    }

    return this.charEqualsIgnoreCase(ch1, ch2);
  };

  _proto.charEqualsIgnoreCase = function charEqualsIgnoreCase(c1, c2) {
    return c1 === c2 || c1.toLowerCase() === c2.toLowerCase();
  };

  _proto.setParsedField = function setParsedField(field, value, errorPos, successPos) {
    var currentParsedFieldValues = this.currentParsed().fieldValues;
    var old = currentParsedFieldValues.get(field);
    currentParsedFieldValues.set(field, value);
    return old != null && old !== value ? ~errorPos : successPos;
  };

  _proto.setParsedZone = function setParsedZone(zone) {
    requireNonNull(zone, 'zone');
    this.currentParsed().zone = zone;
  };

  _proto.getParsed = function getParsed(field) {
    return this.currentParsed().fieldValues.get(field);
  };

  _proto.toParsed = function toParsed() {
    return this.currentParsed();
  };

  _proto.currentParsed = function currentParsed() {
    return this._parsed[this._parsed.length - 1];
  };

  _proto.setParsedLeapSecond = function setParsedLeapSecond() {
    this.currentParsed().leapSecond = true;
  };

  _proto.getEffectiveChronology = function getEffectiveChronology() {
    var chrono = this.currentParsed().chrono;

    if (chrono == null) {
      chrono = this._overrideChronology;

      if (chrono == null) {
        chrono = IsoChronology.INSTANCE;
      }
    }

    return chrono;
  };

  return DateTimeParseContext;
}();

var Parsed = function (_Temporal) {
  _inheritsLoose(Parsed, _Temporal);

  function Parsed(dateTimeParseContext) {
    var _this;

    _this = _Temporal.call(this) || this;
    _this.chrono = null;
    _this.zone = null;
    _this.fieldValues = new EnumMap();
    _this.leapSecond = false;
    _this.dateTimeParseContext = dateTimeParseContext;
    return _this;
  }

  var _proto2 = Parsed.prototype;

  _proto2.copy = function copy() {
    var cloned = new Parsed();
    cloned.chrono = this.chrono;
    cloned.zone = this.zone;
    cloned.fieldValues.putAll(this.fieldValues);
    cloned.leapSecond = this.leapSecond;
    cloned.dateTimeParseContext = this.dateTimeParseContext;
    return cloned;
  };

  _proto2.toString = function toString() {
    return this.fieldValues + ", " + this.chrono + ", " + this.zone;
  };

  _proto2.isSupported = function isSupported(field) {
    return this.fieldValues.containsKey(field);
  };

  _proto2.get = function get(field) {
    var val = this.fieldValues.get(field);
    assert(val != null);
    return val;
  };

  _proto2.query = function query(_query) {
    if (_query === TemporalQueries.chronology()) {
      return this.chrono;
    }

    if (_query === TemporalQueries.zoneId() || _query === TemporalQueries.zone()) {
      return this.zone;
    }

    return _Temporal.prototype.query.call(this, _query);
  };

  _proto2.toBuilder = function toBuilder() {
    var builder = new DateTimeBuilder();
    builder.fieldValues.putAll(this.fieldValues);
    builder.chrono = this.dateTimeParseContext.getEffectiveChronology();

    if (this.zone != null) {
      builder.zone = this.zone;
    } else {
      builder.zone = this.overrideZone;
    }

    builder.leapSecond = this.leapSecond;
    builder.excessDays = this.excessDays;
    return builder;
  };

  return Parsed;
}(Temporal);

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var DateTimePrintContext = function () {
  function DateTimePrintContext(temporal, localeOrFormatter, symbols) {
    if (arguments.length === 2 && arguments[1] instanceof DateTimeFormatter) {
      this._temporal = DateTimePrintContext.adjust(temporal, localeOrFormatter);
      this._locale = localeOrFormatter.locale();
      this._symbols = localeOrFormatter.decimalStyle();
    } else {
      this._temporal = temporal;
      this._locale = localeOrFormatter;
      this._symbols = symbols;
    }

    this._optional = 0;
  }

  DateTimePrintContext.adjust = function adjust(temporal, formatter) {
    return temporal;
  };

  var _proto = DateTimePrintContext.prototype;

  _proto.symbols = function symbols() {
    return this._symbols;
  };

  _proto.startOptional = function startOptional() {
    this._optional++;
  };

  _proto.endOptional = function endOptional() {
    this._optional--;
  };

  _proto.getValueQuery = function getValueQuery(query) {
    var result = this._temporal.query(query);

    if (result == null && this._optional === 0) {
      throw new DateTimeException("Unable to extract value: " + this._temporal);
    }

    return result;
  };

  _proto.getValue = function getValue(field) {
    try {
      return this._temporal.getLong(field);
    } catch (ex) {
      if (ex instanceof DateTimeException && this._optional > 0) {
        return null;
      }

      throw ex;
    }
  };

  _proto.temporal = function temporal() {
    return this._temporal;
  };

  _proto.locale = function locale() {
    return this._locale;
  };

  _proto.setDateTime = function setDateTime(temporal) {
    this._temporal = temporal;
  };

  _proto.setLocale = function setLocale(locale) {
    this._locale = locale;
  };

  return DateTimePrintContext;
}();

var IsoFields = {};
var QUARTER_DAYS = [0, 90, 181, 273, 0, 91, 182, 274];

var Field = function (_TemporalField) {
  _inheritsLoose(Field, _TemporalField);

  function Field() {
    return _TemporalField.apply(this, arguments) || this;
  }

  var _proto = Field.prototype;

  _proto.isDateBased = function isDateBased() {
    return true;
  };

  _proto.isTimeBased = function isTimeBased() {
    return false;
  };

  _proto._isIso = function _isIso() {
    return true;
  };

  Field._getWeekRangeByLocalDate = function _getWeekRangeByLocalDate(date) {
    var wby = Field._getWeekBasedYear(date);

    return ValueRange.of(1, Field._getWeekRangeByYear(wby));
  };

  Field._getWeekRangeByYear = function _getWeekRangeByYear(wby) {
    var date = LocalDate.of(wby, 1, 1);

    if (date.dayOfWeek() === DayOfWeek.THURSDAY || date.dayOfWeek() === DayOfWeek.WEDNESDAY && date.isLeapYear()) {
      return 53;
    }

    return 52;
  };

  Field._getWeek = function _getWeek(date) {
    var dow0 = date.dayOfWeek().ordinal();
    var doy0 = date.dayOfYear() - 1;
    var doyThu0 = doy0 + (3 - dow0);
    var alignedWeek = MathUtil.intDiv(doyThu0, 7);
    var firstThuDoy0 = doyThu0 - alignedWeek * 7;
    var firstMonDoy0 = firstThuDoy0 - 3;

    if (firstMonDoy0 < -3) {
      firstMonDoy0 += 7;
    }

    if (doy0 < firstMonDoy0) {
      return Field._getWeekRangeByLocalDate(date.withDayOfYear(180).minusYears(1)).maximum();
    }

    var week = MathUtil.intDiv(doy0 - firstMonDoy0, 7) + 1;

    if (week === 53) {
      if ((firstMonDoy0 === -3 || firstMonDoy0 === -2 && date.isLeapYear()) === false) {
        week = 1;
      }
    }

    return week;
  };

  Field._getWeekBasedYear = function _getWeekBasedYear(date) {
    var year = date.year();
    var doy = date.dayOfYear();

    if (doy <= 3) {
      var dow = date.dayOfWeek().ordinal();

      if (doy - dow < -2) {
        year--;
      }
    } else if (doy >= 363) {
      var _dow = date.dayOfWeek().ordinal();

      doy = doy - 363 - (date.isLeapYear() ? 1 : 0);

      if (doy - _dow >= 0) {
        year++;
      }
    }

    return year;
  };

  _proto.displayName = function displayName() {
    return this.toString();
  };

  _proto.resolve = function resolve() {
    return null;
  };

  _proto.name = function name() {
    return this.toString();
  };

  return Field;
}(TemporalField);

var DAY_OF_QUARTER_FIELD = function (_Field) {
  _inheritsLoose(DAY_OF_QUARTER_FIELD, _Field);

  function DAY_OF_QUARTER_FIELD() {
    return _Field.apply(this, arguments) || this;
  }

  var _proto2 = DAY_OF_QUARTER_FIELD.prototype;

  _proto2.toString = function toString() {
    return 'DayOfQuarter';
  };

  _proto2.baseUnit = function baseUnit() {
    return ChronoUnit.DAYS;
  };

  _proto2.rangeUnit = function rangeUnit() {
    return QUARTER_YEARS;
  };

  _proto2.range = function range() {
    return ValueRange.of(1, 90, 92);
  };

  _proto2.isSupportedBy = function isSupportedBy(temporal) {
    return temporal.isSupported(ChronoField.DAY_OF_YEAR) && temporal.isSupported(ChronoField.MONTH_OF_YEAR) && temporal.isSupported(ChronoField.YEAR) && this._isIso(temporal);
  };

  _proto2.rangeRefinedBy = function rangeRefinedBy(temporal) {
    if (temporal.isSupported(this) === false) {
      throw new UnsupportedTemporalTypeException('Unsupported field: DayOfQuarter');
    }

    var qoy = temporal.getLong(QUARTER_OF_YEAR);

    if (qoy === 1) {
      var year = temporal.getLong(ChronoField.YEAR);
      return IsoChronology.isLeapYear(year) ? ValueRange.of(1, 91) : ValueRange.of(1, 90);
    } else if (qoy === 2) {
      return ValueRange.of(1, 91);
    } else if (qoy === 3 || qoy === 4) {
      return ValueRange.of(1, 92);
    }

    return this.range();
  };

  _proto2.getFrom = function getFrom(temporal) {
    if (temporal.isSupported(this) === false) {
      throw new UnsupportedTemporalTypeException('Unsupported field: DayOfQuarter');
    }

    var doy = temporal.get(ChronoField.DAY_OF_YEAR);
    var moy = temporal.get(ChronoField.MONTH_OF_YEAR);
    var year = temporal.getLong(ChronoField.YEAR);
    return doy - QUARTER_DAYS[MathUtil.intDiv(moy - 1, 3) + (IsoChronology.isLeapYear(year) ? 4 : 0)];
  };

  _proto2.adjustInto = function adjustInto(temporal, newValue) {
    var curValue = this.getFrom(temporal);
    this.range().checkValidValue(newValue, this);
    return temporal.with(ChronoField.DAY_OF_YEAR, temporal.getLong(ChronoField.DAY_OF_YEAR) + (newValue - curValue));
  };

  _proto2.resolve = function resolve(fieldValues, partialTemporal, resolverStyle) {
    var yearLong = fieldValues.get(ChronoField.YEAR);
    var qoyLong = fieldValues.get(QUARTER_OF_YEAR);

    if (yearLong == null || qoyLong == null) {
      return null;
    }

    var y = ChronoField.YEAR.checkValidIntValue(yearLong);
    var doq = fieldValues.get(DAY_OF_QUARTER);
    var date;

    if (resolverStyle === ResolverStyle.LENIENT) {
      var qoy = qoyLong;
      date = LocalDate.of(y, 1, 1);
      date = date.plusMonths(MathUtil.safeMultiply(MathUtil.safeSubtract(qoy, 1), 3));
      date = date.plusDays(MathUtil.safeSubtract(doq, 1));
    } else {
      var _qoy = QUARTER_OF_YEAR.range().checkValidIntValue(qoyLong, QUARTER_OF_YEAR);

      if (resolverStyle === ResolverStyle.STRICT) {
        var max = 92;

        if (_qoy === 1) {
          max = IsoChronology.isLeapYear(y) ? 91 : 90;
        } else if (_qoy === 2) {
          max = 91;
        }

        ValueRange.of(1, max).checkValidValue(doq, this);
      } else {
        this.range().checkValidValue(doq, this);
      }

      date = LocalDate.of(y, (_qoy - 1) * 3 + 1, 1).plusDays(doq - 1);
    }

    fieldValues.remove(this);
    fieldValues.remove(ChronoField.YEAR);
    fieldValues.remove(QUARTER_OF_YEAR);
    return date;
  };

  return DAY_OF_QUARTER_FIELD;
}(Field);

var QUARTER_OF_YEAR_FIELD = function (_Field2) {
  _inheritsLoose(QUARTER_OF_YEAR_FIELD, _Field2);

  function QUARTER_OF_YEAR_FIELD() {
    return _Field2.apply(this, arguments) || this;
  }

  var _proto3 = QUARTER_OF_YEAR_FIELD.prototype;

  _proto3.toString = function toString() {
    return 'QuarterOfYear';
  };

  _proto3.baseUnit = function baseUnit() {
    return QUARTER_YEARS;
  };

  _proto3.rangeUnit = function rangeUnit() {
    return ChronoUnit.YEARS;
  };

  _proto3.range = function range() {
    return ValueRange.of(1, 4);
  };

  _proto3.isSupportedBy = function isSupportedBy(temporal) {
    return temporal.isSupported(ChronoField.MONTH_OF_YEAR) && this._isIso(temporal);
  };

  _proto3.rangeRefinedBy = function rangeRefinedBy(temporal) {
    return this.range();
  };

  _proto3.getFrom = function getFrom(temporal) {
    if (temporal.isSupported(this) === false) {
      throw new UnsupportedTemporalTypeException('Unsupported field: QuarterOfYear');
    }

    var moy = temporal.getLong(ChronoField.MONTH_OF_YEAR);
    return MathUtil.intDiv(moy + 2, 3);
  };

  _proto3.adjustInto = function adjustInto(temporal, newValue) {
    var curValue = this.getFrom(temporal);
    this.range().checkValidValue(newValue, this);
    return temporal.with(ChronoField.MONTH_OF_YEAR, temporal.getLong(ChronoField.MONTH_OF_YEAR) + (newValue - curValue) * 3);
  };

  return QUARTER_OF_YEAR_FIELD;
}(Field);

var WEEK_OF_WEEK_BASED_YEAR_FIELD = function (_Field3) {
  _inheritsLoose(WEEK_OF_WEEK_BASED_YEAR_FIELD, _Field3);

  function WEEK_OF_WEEK_BASED_YEAR_FIELD() {
    return _Field3.apply(this, arguments) || this;
  }

  var _proto4 = WEEK_OF_WEEK_BASED_YEAR_FIELD.prototype;

  _proto4.toString = function toString() {
    return 'WeekOfWeekBasedYear';
  };

  _proto4.baseUnit = function baseUnit() {
    return ChronoUnit.WEEKS;
  };

  _proto4.rangeUnit = function rangeUnit() {
    return WEEK_BASED_YEARS;
  };

  _proto4.range = function range() {
    return ValueRange.of(1, 52, 53);
  };

  _proto4.isSupportedBy = function isSupportedBy(temporal) {
    return temporal.isSupported(ChronoField.EPOCH_DAY) && this._isIso(temporal);
  };

  _proto4.rangeRefinedBy = function rangeRefinedBy(temporal) {
    if (temporal.isSupported(this) === false) {
      throw new UnsupportedTemporalTypeException('Unsupported field: WeekOfWeekBasedYear');
    }

    return Field._getWeekRangeByLocalDate(LocalDate.from(temporal));
  };

  _proto4.getFrom = function getFrom(temporal) {
    if (temporal.isSupported(this) === false) {
      throw new UnsupportedTemporalTypeException('Unsupported field: WeekOfWeekBasedYear');
    }

    return Field._getWeek(LocalDate.from(temporal));
  };

  _proto4.adjustInto = function adjustInto(temporal, newValue) {
    this.range().checkValidValue(newValue, this);
    return temporal.plus(MathUtil.safeSubtract(newValue, this.getFrom(temporal)), ChronoUnit.WEEKS);
  };

  _proto4.resolve = function resolve(fieldValues, partialTemporal, resolverStyle) {
    var wbyLong = fieldValues.get(WEEK_BASED_YEAR);
    var dowLong = fieldValues.get(ChronoField.DAY_OF_WEEK);

    if (wbyLong == null || dowLong == null) {
      return null;
    }

    var wby = WEEK_BASED_YEAR.range().checkValidIntValue(wbyLong, WEEK_BASED_YEAR);
    var wowby = fieldValues.get(WEEK_OF_WEEK_BASED_YEAR);
    var date;

    if (resolverStyle === ResolverStyle.LENIENT) {
      var dow = dowLong;
      var weeks = 0;

      if (dow > 7) {
        weeks = MathUtil.intDiv(dow - 1, 7);
        dow = MathUtil.intMod(dow - 1, 7) + 1;
      } else if (dow < 1) {
        weeks = MathUtil.intDiv(dow, 7) - 1;
        dow = MathUtil.intMod(dow, 7) + 7;
      }

      date = LocalDate.of(wby, 1, 4).plusWeeks(wowby - 1).plusWeeks(weeks).with(ChronoField.DAY_OF_WEEK, dow);
    } else {
      var _dow2 = ChronoField.DAY_OF_WEEK.checkValidIntValue(dowLong);

      if (resolverStyle === ResolverStyle.STRICT) {
        var temp = LocalDate.of(wby, 1, 4);

        var range = Field._getWeekRangeByLocalDate(temp);

        range.checkValidValue(wowby, this);
      } else {
        this.range().checkValidValue(wowby, this);
      }

      date = LocalDate.of(wby, 1, 4).plusWeeks(wowby - 1).with(ChronoField.DAY_OF_WEEK, _dow2);
    }

    fieldValues.remove(this);
    fieldValues.remove(WEEK_BASED_YEAR);
    fieldValues.remove(ChronoField.DAY_OF_WEEK);
    return date;
  };

  _proto4.displayName = function displayName() {
    return 'Week';
  };

  return WEEK_OF_WEEK_BASED_YEAR_FIELD;
}(Field);

var WEEK_BASED_YEAR_FIELD = function (_Field4) {
  _inheritsLoose(WEEK_BASED_YEAR_FIELD, _Field4);

  function WEEK_BASED_YEAR_FIELD() {
    return _Field4.apply(this, arguments) || this;
  }

  var _proto5 = WEEK_BASED_YEAR_FIELD.prototype;

  _proto5.toString = function toString() {
    return 'WeekBasedYear';
  };

  _proto5.baseUnit = function baseUnit() {
    return WEEK_BASED_YEARS;
  };

  _proto5.rangeUnit = function rangeUnit() {
    return ChronoUnit.FOREVER;
  };

  _proto5.range = function range() {
    return ChronoField.YEAR.range();
  };

  _proto5.isSupportedBy = function isSupportedBy(temporal) {
    return temporal.isSupported(ChronoField.EPOCH_DAY) && this._isIso(temporal);
  };

  _proto5.rangeRefinedBy = function rangeRefinedBy(temporal) {
    return ChronoField.YEAR.range();
  };

  _proto5.getFrom = function getFrom(temporal) {
    if (temporal.isSupported(this) === false) {
      throw new UnsupportedTemporalTypeException('Unsupported field: WeekBasedYear');
    }

    return Field._getWeekBasedYear(LocalDate.from(temporal));
  };

  _proto5.adjustInto = function adjustInto(temporal, newValue) {
    if (this.isSupportedBy(temporal) === false) {
      throw new UnsupportedTemporalTypeException('Unsupported field: WeekBasedYear');
    }

    var newWby = this.range().checkValidIntValue(newValue, WEEK_BASED_YEAR);
    var date = LocalDate.from(temporal);
    var dow = date.get(ChronoField.DAY_OF_WEEK);

    var week = Field._getWeek(date);

    if (week === 53 && Field._getWeekRangeByYear(newWby) === 52) {
      week = 52;
    }

    var resolved = LocalDate.of(newWby, 1, 4);
    var days = dow - resolved.get(ChronoField.DAY_OF_WEEK) + (week - 1) * 7;
    resolved = resolved.plusDays(days);
    return temporal.with(resolved);
  };

  return WEEK_BASED_YEAR_FIELD;
}(Field);

var Unit = function (_TemporalUnit) {
  _inheritsLoose(Unit, _TemporalUnit);

  function Unit(name, estimatedDuration) {
    var _this;

    _this = _TemporalUnit.call(this) || this;
    _this._name = name;
    _this._duration = estimatedDuration;
    return _this;
  }

  var _proto6 = Unit.prototype;

  _proto6.duration = function duration() {
    return this._duration;
  };

  _proto6.isDurationEstimated = function isDurationEstimated() {
    return true;
  };

  _proto6.isDateBased = function isDateBased() {
    return true;
  };

  _proto6.isTimeBased = function isTimeBased() {
    return false;
  };

  _proto6.isSupportedBy = function isSupportedBy(temporal) {
    return temporal.isSupported(ChronoField.EPOCH_DAY);
  };

  _proto6.addTo = function addTo(temporal, periodToAdd) {
    switch (this) {
      case WEEK_BASED_YEARS:
        {
          var added = MathUtil.safeAdd(temporal.get(WEEK_BASED_YEAR), periodToAdd);
          return temporal.with(WEEK_BASED_YEAR, added);
        }

      case QUARTER_YEARS:
        return temporal.plus(MathUtil.intDiv(periodToAdd, 256), ChronoUnit.YEARS).plus(MathUtil.intMod(periodToAdd, 256) * 3, ChronoUnit.MONTHS);

      default:
        throw new IllegalStateException('Unreachable');
    }
  };

  _proto6.between = function between(temporal1, temporal2) {
    switch (this) {
      case WEEK_BASED_YEARS:
        return MathUtil.safeSubtract(temporal2.getLong(WEEK_BASED_YEAR), temporal1.getLong(WEEK_BASED_YEAR));

      case QUARTER_YEARS:
        return MathUtil.intDiv(temporal1.until(temporal2, ChronoUnit.MONTHS), 3);

      default:
        throw new IllegalStateException('Unreachable');
    }
  };

  _proto6.toString = function toString() {
    return name;
  };

  return Unit;
}(TemporalUnit);

var DAY_OF_QUARTER = null;
var QUARTER_OF_YEAR = null;
var WEEK_OF_WEEK_BASED_YEAR = null;
var WEEK_BASED_YEAR = null;
var WEEK_BASED_YEARS = null;
var QUARTER_YEARS = null;
function _init$f() {
  DAY_OF_QUARTER = new DAY_OF_QUARTER_FIELD();
  QUARTER_OF_YEAR = new QUARTER_OF_YEAR_FIELD();
  WEEK_OF_WEEK_BASED_YEAR = new WEEK_OF_WEEK_BASED_YEAR_FIELD();
  WEEK_BASED_YEAR = new WEEK_BASED_YEAR_FIELD();
  WEEK_BASED_YEARS = new Unit('WeekBasedYears', Duration.ofSeconds(31556952));
  QUARTER_YEARS = new Unit('QuarterYears', Duration.ofSeconds(31556952 / 4));
  IsoFields.DAY_OF_QUARTER = DAY_OF_QUARTER;
  IsoFields.QUARTER_OF_YEAR = QUARTER_OF_YEAR;
  IsoFields.WEEK_OF_WEEK_BASED_YEAR = WEEK_OF_WEEK_BASED_YEAR;
  IsoFields.WEEK_BASED_YEAR = WEEK_BASED_YEAR;
  IsoFields.WEEK_BASED_YEARS = WEEK_BASED_YEARS;
  IsoFields.QUARTER_YEARS = QUARTER_YEARS;

  LocalDate.prototype.isoWeekOfWeekyear = function () {
    return this.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR);
  };

  LocalDate.prototype.isoWeekyear = function () {
    return this.get(IsoFields.WEEK_BASED_YEAR);
  };
}

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var DecimalStyle = function () {
  function DecimalStyle(zeroChar, positiveSignChar, negativeSignChar, decimalPointChar) {
    this._zeroDigit = zeroChar;
    this._zeroDigitCharCode = zeroChar.charCodeAt(0);
    this._positiveSign = positiveSignChar;
    this._negativeSign = negativeSignChar;
    this._decimalSeparator = decimalPointChar;
  }

  var _proto = DecimalStyle.prototype;

  _proto.positiveSign = function positiveSign() {
    return this._positiveSign;
  };

  _proto.withPositiveSign = function withPositiveSign(positiveSign) {
    if (positiveSign === this._positiveSign) {
      return this;
    }

    return new DecimalStyle(this._zeroDigit, positiveSign, this._negativeSign, this._decimalSeparator);
  };

  _proto.negativeSign = function negativeSign() {
    return this._negativeSign;
  };

  _proto.withNegativeSign = function withNegativeSign(negativeSign) {
    if (negativeSign === this._negativeSign) {
      return this;
    }

    return new DecimalStyle(this._zeroDigit, this._positiveSign, negativeSign, this._decimalSeparator);
  };

  _proto.zeroDigit = function zeroDigit() {
    return this._zeroDigit;
  };

  _proto.withZeroDigit = function withZeroDigit(zeroDigit) {
    if (zeroDigit === this._zeroDigit) {
      return this;
    }

    return new DecimalStyle(zeroDigit, this._positiveSign, this._negativeSign, this._decimalSeparator);
  };

  _proto.decimalSeparator = function decimalSeparator() {
    return this._decimalSeparator;
  };

  _proto.withDecimalSeparator = function withDecimalSeparator(decimalSeparator) {
    if (decimalSeparator === this._decimalSeparator) {
      return this;
    }

    return new DecimalStyle(this._zeroDigit, this._positiveSign, this._negativeSign, decimalSeparator);
  };

  _proto.convertToDigit = function convertToDigit(char) {
    var val = char.charCodeAt(0) - this._zeroDigitCharCode;

    return val >= 0 && val <= 9 ? val : -1;
  };

  _proto.convertNumberToI18N = function convertNumberToI18N(numericText) {
    if (this._zeroDigit === '0') {
      return numericText;
    }

    var diff = this._zeroDigitCharCode - '0'.charCodeAt(0);
    var convertedText = '';

    for (var i = 0; i < numericText.length; i++) {
      convertedText += String.fromCharCode(numericText.charCodeAt(i) + diff);
    }

    return convertedText;
  };

  _proto.equals = function equals(other) {
    if (this === other) {
      return true;
    }

    if (other instanceof DecimalStyle) {
      return this._zeroDigit === other._zeroDigit && this._positiveSign === other._positiveSign && this._negativeSign === other._negativeSign && this._decimalSeparator === other._decimalSeparator;
    }

    return false;
  };

  _proto.hashCode = function hashCode() {
    return this._zeroDigit + this._positiveSign + this._negativeSign + this._decimalSeparator;
  };

  _proto.toString = function toString() {
    return "DecimalStyle[" + this._zeroDigit + this._positiveSign + this._negativeSign + this._decimalSeparator + "]";
  };

  DecimalStyle.of = function of() {
    throw new Error('not yet supported');
  };

  DecimalStyle.availableLocales = function availableLocales() {
    throw new Error('not yet supported');
  };

  return DecimalStyle;
}();
DecimalStyle.STANDARD = new DecimalStyle('0', '+', '-', '.');

var SignStyle = function (_Enum) {
  _inheritsLoose(SignStyle, _Enum);

  function SignStyle() {
    return _Enum.apply(this, arguments) || this;
  }

  var _proto = SignStyle.prototype;

  _proto.parse = function parse(positive, strict, fixedWidth) {
    switch (this) {
      case SignStyle.NORMAL:
        return !positive || !strict;

      case SignStyle.ALWAYS:
      case SignStyle.EXCEEDS_PAD:
        return true;

      default:
        return !strict && !fixedWidth;
    }
  };

  return SignStyle;
}(Enum);
SignStyle.NORMAL = new SignStyle('NORMAL');
SignStyle.NEVER = new SignStyle('NEVER');
SignStyle.ALWAYS = new SignStyle('ALWAYS');
SignStyle.EXCEEDS_PAD = new SignStyle('EXCEEDS_PAD');
SignStyle.NOT_NEGATIVE = new SignStyle('NOT_NEGATIVE');

var TextStyle = function (_Enum) {
  _inheritsLoose(TextStyle, _Enum);

  function TextStyle() {
    return _Enum.apply(this, arguments) || this;
  }

  var _proto = TextStyle.prototype;

  _proto.isStandalone = function isStandalone() {
    switch (this) {
      case TextStyle.FULL_STANDALONE:
      case TextStyle.SHORT_STANDALONE:
      case TextStyle.NARROW_STANDALONE:
        return true;

      default:
        return false;
    }
  };

  _proto.asStandalone = function asStandalone() {
    switch (this) {
      case TextStyle.FULL:
        return TextStyle.FULL_STANDALONE;

      case TextStyle.SHORT:
        return TextStyle.SHORT_STANDALONE;

      case TextStyle.NARROW:
        return TextStyle.NARROW_STANDALONE;

      default:
        return this;
    }
  };

  _proto.asNormal = function asNormal() {
    switch (this) {
      case TextStyle.FULL_STANDALONE:
        return TextStyle.FULL;

      case TextStyle.SHORT_STANDALONE:
        return TextStyle.SHORT;

      case TextStyle.NARROW_STANDALONE:
        return TextStyle.NARROW;

      default:
        return this;
    }
  };

  return TextStyle;
}(Enum);
TextStyle.FULL = new TextStyle('FULL');
TextStyle.FULL_STANDALONE = new TextStyle('FULL_STANDALONE');
TextStyle.SHORT = new TextStyle('SHORT');
TextStyle.SHORT_STANDALONE = new TextStyle('SHORT_STANDALONE');
TextStyle.NARROW = new TextStyle('NARROW');
TextStyle.NARROW_STANDALONE = new TextStyle('NARROW_STANDALONE');

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var CharLiteralPrinterParser = function () {
  function CharLiteralPrinterParser(literal) {
    if (literal.length > 1) {
      throw new IllegalArgumentException("invalid literal, too long: \"" + literal + "\"");
    }

    this._literal = literal;
  }

  var _proto = CharLiteralPrinterParser.prototype;

  _proto.print = function print(context, buf) {
    buf.append(this._literal);
    return true;
  };

  _proto.parse = function parse(context, text, position) {
    var length = text.length;

    if (position === length) {
      return ~position;
    }

    var ch = text.charAt(position);

    if (context.charEquals(this._literal, ch) === false) {
      return ~position;
    }

    return position + this._literal.length;
  };

  _proto.toString = function toString() {
    if (this._literal === '\'') {
      return "''";
    }

    return "'" + this._literal + "'";
  };

  return CharLiteralPrinterParser;
}();

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var CompositePrinterParser = function () {
  function CompositePrinterParser(printerParsers, optional) {
    this._printerParsers = printerParsers;
    this._optional = optional;
  }

  var _proto = CompositePrinterParser.prototype;

  _proto.withOptional = function withOptional(optional) {
    if (optional === this._optional) {
      return this;
    }

    return new CompositePrinterParser(this._printerParsers, optional);
  };

  _proto.print = function print(context, buf) {
    var length = buf.length();

    if (this._optional) {
      context.startOptional();
    }

    try {
      for (var i = 0; i < this._printerParsers.length; i++) {
        var pp = this._printerParsers[i];

        if (pp.print(context, buf) === false) {
          buf.setLength(length);
          return true;
        }
      }
    } finally {
      if (this._optional) {
        context.endOptional();
      }
    }

    return true;
  };

  _proto.parse = function parse(context, text, position) {
    if (this._optional) {
      context.startOptional();
      var pos = position;

      for (var i = 0; i < this._printerParsers.length; i++) {
        var pp = this._printerParsers[i];
        pos = pp.parse(context, text, pos);

        if (pos < 0) {
          context.endOptional(false);
          return position;
        }
      }

      context.endOptional(true);
      return pos;
    } else {
      for (var _i = 0; _i < this._printerParsers.length; _i++) {
        var _pp = this._printerParsers[_i];
        position = _pp.parse(context, text, position);

        if (position < 0) {
          break;
        }
      }

      return position;
    }
  };

  _proto.toString = function toString() {
    var buf = '';

    if (this._printerParsers != null) {
      buf += this._optional ? '[' : '(';

      for (var i = 0; i < this._printerParsers.length; i++) {
        var pp = this._printerParsers[i];
        buf += pp.toString();
      }

      buf += this._optional ? ']' : ')';
    }

    return buf;
  };

  return CompositePrinterParser;
}();

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var FractionPrinterParser = function () {
  function FractionPrinterParser(field, minWidth, maxWidth, decimalPoint) {
    requireNonNull(field, 'field');

    if (field.range().isFixed() === false) {
      throw new IllegalArgumentException("Field must have a fixed set of values: " + field);
    }

    if (minWidth < 0 || minWidth > 9) {
      throw new IllegalArgumentException("Minimum width must be from 0 to 9 inclusive but was " + minWidth);
    }

    if (maxWidth < 1 || maxWidth > 9) {
      throw new IllegalArgumentException("Maximum width must be from 1 to 9 inclusive but was " + maxWidth);
    }

    if (maxWidth < minWidth) {
      throw new IllegalArgumentException("Maximum width must exceed or equal the minimum width but " + maxWidth + " < " + minWidth);
    }

    this.field = field;
    this.minWidth = minWidth;
    this.maxWidth = maxWidth;
    this.decimalPoint = decimalPoint;
  }

  var _proto = FractionPrinterParser.prototype;

  _proto.print = function print(context, buf) {
    var value = context.getValue(this.field);

    if (value === null) {
      return false;
    }

    var symbols = context.symbols();

    if (value === 0) {
      if (this.minWidth > 0) {
        if (this.decimalPoint) {
          buf.append(symbols.decimalSeparator());
        }

        for (var i = 0; i < this.minWidth; i++) {
          buf.append(symbols.zeroDigit());
        }
      }
    } else {
      var fraction = this.convertToFraction(value, symbols.zeroDigit());
      var outputScale = Math.min(Math.max(fraction.length, this.minWidth), this.maxWidth);
      fraction = fraction.substr(0, outputScale);

      if (fraction * 1 > 0) {
        while (fraction.length > this.minWidth && fraction[fraction.length - 1] === '0') {
          fraction = fraction.substr(0, fraction.length - 1);
        }
      }

      var str = fraction;
      str = symbols.convertNumberToI18N(str);

      if (this.decimalPoint) {
        buf.append(symbols.decimalSeparator());
      }

      buf.append(str);
    }

    return true;
  };

  _proto.parse = function parse(context, text, position) {
    var effectiveMin = context.isStrict() ? this.minWidth : 0;
    var effectiveMax = context.isStrict() ? this.maxWidth : 9;
    var length = text.length;

    if (position === length) {
      return effectiveMin > 0 ? ~position : position;
    }

    if (this.decimalPoint) {
      if (text[position] !== context.symbols().decimalSeparator()) {
        return effectiveMin > 0 ? ~position : position;
      }

      position++;
    }

    var minEndPos = position + effectiveMin;

    if (minEndPos > length) {
      return ~position;
    }

    var maxEndPos = Math.min(position + effectiveMax, length);
    var total = 0;
    var pos = position;

    while (pos < maxEndPos) {
      var ch = text.charAt(pos++);
      var digit = context.symbols().convertToDigit(ch);

      if (digit < 0) {
        if (pos < minEndPos) {
          return ~position;
        }

        pos--;
        break;
      }

      total = total * 10 + digit;
    }

    var moveLeft = pos - position;
    var scale = Math.pow(10, moveLeft);
    var value = this.convertFromFraction(total, scale);
    return context.setParsedField(this.field, value, position, pos);
  };

  _proto.convertToFraction = function convertToFraction(value, zeroDigit) {
    var range = this.field.range();
    range.checkValidValue(value, this.field);

    var _min = range.minimum();

    var _range = range.maximum() - _min + 1;

    var _value = value - _min;

    var _scaled = MathUtil.intDiv(_value * 1000000000, _range);

    var fraction = "" + _scaled;

    while (fraction.length < 9) {
      fraction = zeroDigit + fraction;
    }

    return fraction;
  };

  _proto.convertFromFraction = function convertFromFraction(total, scale) {
    var range = this.field.range();

    var _min = range.minimum();

    var _range = range.maximum() - _min + 1;

    var _value = MathUtil.intDiv(total * _range, scale);

    return _value;
  };

  _proto.toString = function toString() {
    var decimal = this.decimalPoint ? ',DecimalPoint' : '';
    return "Fraction(" + this.field + "," + this.minWidth + "," + this.maxWidth + decimal + ")";
  };

  return FractionPrinterParser;
}();

var MAX_WIDTH$1 = 15;
var EXCEED_POINTS = [0, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000];
var NumberPrinterParser = function () {
  function NumberPrinterParser(field, minWidth, maxWidth, signStyle, subsequentWidth) {
    if (subsequentWidth === void 0) {
      subsequentWidth = 0;
    }

    this._field = field;
    this._minWidth = minWidth;
    this._maxWidth = maxWidth;
    this._signStyle = signStyle;
    this._subsequentWidth = subsequentWidth;
  }

  var _proto = NumberPrinterParser.prototype;

  _proto.field = function field() {
    return this._field;
  };

  _proto.minWidth = function minWidth() {
    return this._minWidth;
  };

  _proto.maxWidth = function maxWidth() {
    return this._maxWidth;
  };

  _proto.signStyle = function signStyle() {
    return this._signStyle;
  };

  _proto.withFixedWidth = function withFixedWidth() {
    if (this._subsequentWidth === -1) {
      return this;
    }

    return new NumberPrinterParser(this._field, this._minWidth, this._maxWidth, this._signStyle, -1);
  };

  _proto.withSubsequentWidth = function withSubsequentWidth(subsequentWidth) {
    return new NumberPrinterParser(this._field, this._minWidth, this._maxWidth, this._signStyle, this._subsequentWidth + subsequentWidth);
  };

  _proto._isFixedWidth = function _isFixedWidth() {
    return this._subsequentWidth === -1 || this._subsequentWidth > 0 && this._minWidth === this._maxWidth && this._signStyle === SignStyle.NOT_NEGATIVE;
  };

  _proto.print = function print(context, buf) {
    var contextValue = context.getValue(this._field);

    if (contextValue == null) {
      return false;
    }

    var value = this._getValue(context, contextValue);

    var symbols = context.symbols();
    var str = "" + Math.abs(value);

    if (str.length > this._maxWidth) {
      throw new DateTimeException("Field " + this._field + " cannot be printed as the value " + value + " exceeds the maximum print width of " + this._maxWidth);
    }

    str = symbols.convertNumberToI18N(str);

    if (value >= 0) {
      switch (this._signStyle) {
        case SignStyle.EXCEEDS_PAD:
          if (this._minWidth < MAX_WIDTH$1 && value >= EXCEED_POINTS[this._minWidth]) {
            buf.append(symbols.positiveSign());
          }

          break;

        case SignStyle.ALWAYS:
          buf.append(symbols.positiveSign());
          break;
      }
    } else {
      switch (this._signStyle) {
        case SignStyle.NORMAL:
        case SignStyle.EXCEEDS_PAD:
        case SignStyle.ALWAYS:
          buf.append(symbols.negativeSign());
          break;

        case SignStyle.NOT_NEGATIVE:
          throw new DateTimeException("Field " + this._field + " cannot be printed as the value " + value + " cannot be negative according to the SignStyle");
      }
    }

    for (var i = 0; i < this._minWidth - str.length; i++) {
      buf.append(symbols.zeroDigit());
    }

    buf.append(str);
    return true;
  };

  _proto.parse = function parse(context, text, position) {
    var length = text.length;

    if (position === length) {
      return ~position;
    }

    assert(position >= 0 && position < length);
    var sign = text.charAt(position);
    var negative = false;
    var positive = false;

    if (sign === context.symbols().positiveSign()) {
      if (this._signStyle.parse(true, context.isStrict(), this._minWidth === this._maxWidth) === false) {
        return ~position;
      }

      positive = true;
      position++;
    } else if (sign === context.symbols().negativeSign()) {
      if (this._signStyle.parse(false, context.isStrict(), this._minWidth === this._maxWidth) === false) {
        return ~position;
      }

      negative = true;
      position++;
    } else {
      if (this._signStyle === SignStyle.ALWAYS && context.isStrict()) {
        return ~position;
      }
    }

    var effMinWidth = context.isStrict() || this._isFixedWidth() ? this._minWidth : 1;
    var minEndPos = position + effMinWidth;

    if (minEndPos > length) {
      return ~position;
    }

    var effMaxWidth = (context.isStrict() || this._isFixedWidth() ? this._maxWidth : 9) + Math.max(this._subsequentWidth, 0);
    var total = 0;
    var pos = position;

    for (var pass = 0; pass < 2; pass++) {
      var maxEndPos = Math.min(pos + effMaxWidth, length);

      while (pos < maxEndPos) {
        var ch = text.charAt(pos++);
        var digit = context.symbols().convertToDigit(ch);

        if (digit < 0) {
          pos--;

          if (pos < minEndPos) {
            return ~position;
          }

          break;
        }

        if (pos - position > MAX_WIDTH$1) {
          throw new ArithmeticException('number text exceeds length');
        } else {
          total = total * 10 + digit;
        }
      }

      if (this._subsequentWidth > 0 && pass === 0) {
        var parseLen = pos - position;
        effMaxWidth = Math.max(effMinWidth, parseLen - this._subsequentWidth);
        pos = position;
        total = 0;
      } else {
        break;
      }
    }

    if (negative) {
      if (total === 0 && context.isStrict()) {
        return ~(position - 1);
      }

      if (total !== 0) {
        total = -total;
      }
    } else if (this._signStyle === SignStyle.EXCEEDS_PAD && context.isStrict()) {
      var _parseLen = pos - position;

      if (positive) {
        if (_parseLen <= this._minWidth) {
          return ~(position - 1);
        }
      } else {
        if (_parseLen > this._minWidth) {
          return ~position;
        }
      }
    }

    return this._setValue(context, total, position, pos);
  };

  _proto._getValue = function _getValue(context, value) {
    return value;
  };

  _proto._setValue = function _setValue(context, value, errorPos, successPos) {
    return context.setParsedField(this._field, value, errorPos, successPos);
  };

  _proto.toString = function toString() {
    if (this._minWidth === 1 && this._maxWidth === MAX_WIDTH$1 && this._signStyle === SignStyle.NORMAL) {
      return "Value(" + this._field + ")";
    }

    if (this._minWidth === this._maxWidth && this._signStyle === SignStyle.NOT_NEGATIVE) {
      return "Value(" + this._field + "," + this._minWidth + ")";
    }

    return "Value(" + this._field + "," + this._minWidth + "," + this._maxWidth + "," + this._signStyle + ")";
  };

  return NumberPrinterParser;
}();
var ReducedPrinterParser = function (_NumberPrinterParser) {
  _inheritsLoose(ReducedPrinterParser, _NumberPrinterParser);

  function ReducedPrinterParser(field, width, maxWidth, baseValue, baseDate) {
    var _this;

    _this = _NumberPrinterParser.call(this, field, width, maxWidth, SignStyle.NOT_NEGATIVE) || this;

    if (width < 1 || width > 10) {
      throw new IllegalArgumentException("The width must be from 1 to 10 inclusive but was " + width);
    }

    if (maxWidth < 1 || maxWidth > 10) {
      throw new IllegalArgumentException("The maxWidth must be from 1 to 10 inclusive but was " + maxWidth);
    }

    if (maxWidth < width) {
      throw new IllegalArgumentException('The maxWidth must be greater than the width');
    }

    if (baseDate === null) {
      if (field.range().isValidValue(baseValue) === false) {
        throw new IllegalArgumentException('The base value must be within the range of the field');
      }

      if (baseValue + EXCEED_POINTS[width] > MathUtil.MAX_SAFE_INTEGER) {
        throw new DateTimeException('Unable to add printer-parser as the range exceeds the capacity of an int');
      }
    }

    _this._baseValue = baseValue;
    _this._baseDate = baseDate;
    return _this;
  }

  var _proto2 = ReducedPrinterParser.prototype;

  _proto2._getValue = function _getValue(context, value) {
    var absValue = Math.abs(value);
    var baseValue = this._baseValue;

    if (this._baseDate !== null) {
      context.temporal();
      var chrono = IsoChronology.INSTANCE;
      baseValue = chrono.date(this._baseDate).get(this._field);
    }

    if (value >= baseValue && value < baseValue + EXCEED_POINTS[this._minWidth]) {
      return absValue % EXCEED_POINTS[this._minWidth];
    }

    return absValue % EXCEED_POINTS[this._maxWidth];
  };

  _proto2._setValue = function _setValue(context, value, errorPos, successPos) {
    var baseValue = this._baseValue;

    if (this._baseDate != null) {
      var chrono = context.getEffectiveChronology();
      baseValue = chrono.date(this._baseDate).get(this._field);
    }

    var parseLen = successPos - errorPos;

    if (parseLen === this._minWidth && value >= 0) {
      var range = EXCEED_POINTS[this._minWidth];
      var lastPart = baseValue % range;
      var basePart = baseValue - lastPart;

      if (baseValue > 0) {
        value = basePart + value;
      } else {
        value = basePart - value;
      }

      if (value < baseValue) {
        value += range;
      }
    }

    return context.setParsedField(this._field, value, errorPos, successPos);
  };

  _proto2.withFixedWidth = function withFixedWidth() {
    if (this._subsequentWidth === -1) {
      return this;
    }

    return new ReducedPrinterParser(this._field, this._minWidth, this._maxWidth, this._baseValue, this._baseDate, -1);
  };

  _proto2.withSubsequentWidth = function withSubsequentWidth(subsequentWidth) {
    return new ReducedPrinterParser(this._field, this._minWidth, this._maxWidth, this._baseValue, this._baseDate, this._subsequentWidth + subsequentWidth);
  };

  _proto2.isFixedWidth = function isFixedWidth(context) {
    if (context.isStrict() === false) {
      return false;
    }

    return _NumberPrinterParser.prototype.isFixedWidth.call(this, context);
  };

  _proto2.toString = function toString() {
    return "ReducedValue(" + this._field + "," + this._minWidth + "," + this._maxWidth + "," + (this._baseDate != null ? this._baseDate : this._baseValue) + ")";
  };

  return ReducedPrinterParser;
}(NumberPrinterParser);

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var PATTERNS = ['+HH', '+HHmm', '+HH:mm', '+HHMM', '+HH:MM', '+HHMMss', '+HH:MM:ss', '+HHMMSS', '+HH:MM:SS'];
var OffsetIdPrinterParser = function () {
  function OffsetIdPrinterParser(noOffsetText, pattern) {
    requireNonNull(noOffsetText, 'noOffsetText');
    requireNonNull(pattern, 'pattern');
    this.noOffsetText = noOffsetText;
    this.type = this._checkPattern(pattern);
  }

  var _proto = OffsetIdPrinterParser.prototype;

  _proto._checkPattern = function _checkPattern(pattern) {
    for (var i = 0; i < PATTERNS.length; i++) {
      if (PATTERNS[i] === pattern) {
        return i;
      }
    }

    throw new IllegalArgumentException("Invalid zone offset pattern: " + pattern);
  };

  _proto.print = function print(context, buf) {
    var offsetSecs = context.getValue(ChronoField.OFFSET_SECONDS);

    if (offsetSecs == null) {
      return false;
    }

    var totalSecs = MathUtil.safeToInt(offsetSecs);

    if (totalSecs === 0) {
      buf.append(this.noOffsetText);
    } else {
      var absHours = Math.abs(MathUtil.intMod(MathUtil.intDiv(totalSecs, 3600), 100));
      var absMinutes = Math.abs(MathUtil.intMod(MathUtil.intDiv(totalSecs, 60), 60));
      var absSeconds = Math.abs(MathUtil.intMod(totalSecs, 60));
      var bufPos = buf.length();
      var output = absHours;
      buf.append(totalSecs < 0 ? '-' : '+').appendChar(MathUtil.intDiv(absHours, 10) + "0").appendChar(MathUtil.intMod(absHours, 10) + "0");

      if (this.type >= 3 || this.type >= 1 && absMinutes > 0) {
        buf.append(this.type % 2 === 0 ? ':' : '').appendChar(MathUtil.intDiv(absMinutes, 10) + "0").appendChar(absMinutes % 10 + "0");
        output += absMinutes;

        if (this.type >= 7 || this.type >= 5 && absSeconds > 0) {
          buf.append(this.type % 2 === 0 ? ':' : '').appendChar(MathUtil.intDiv(absSeconds, 10) + "0").appendChar(absSeconds % 10 + "0");
          output += absSeconds;
        }
      }

      if (output === 0) {
        buf.setLength(bufPos);
        buf.append(this.noOffsetText);
      }
    }

    return true;
  };

  _proto.parse = function parse(context, text, position) {
    var length = text.length;
    var noOffsetLen = this.noOffsetText.length;

    if (noOffsetLen === 0) {
      if (position === length) {
        return context.setParsedField(ChronoField.OFFSET_SECONDS, 0, position, position);
      }
    } else {
      if (position === length) {
        return ~position;
      }

      if (context.subSequenceEquals(text, position, this.noOffsetText, 0, noOffsetLen)) {
        return context.setParsedField(ChronoField.OFFSET_SECONDS, 0, position, position + noOffsetLen);
      }
    }

    var sign = text[position];

    if (sign === '+' || sign === '-') {
      var negative = sign === '-' ? -1 : 1;
      var array = [0, 0, 0, 0];
      array[0] = position + 1;

      if ((this._parseNumber(array, 1, text, true) || this._parseNumber(array, 2, text, this.type >= 3) || this._parseNumber(array, 3, text, false)) === false) {
        var offsetSecs = MathUtil.safeZero(negative * (array[1] * 3600 + array[2] * 60 + array[3]));
        return context.setParsedField(ChronoField.OFFSET_SECONDS, offsetSecs, position, array[0]);
      }
    }

    if (noOffsetLen === 0) {
      return context.setParsedField(ChronoField.OFFSET_SECONDS, 0, position, position + noOffsetLen);
    }

    return ~position;
  };

  _proto._parseNumber = function _parseNumber(array, arrayIndex, parseText, required) {
    if ((this.type + 3) / 2 < arrayIndex) {
      return false;
    }

    var pos = array[0];

    if (this.type % 2 === 0 && arrayIndex > 1) {
      if (pos + 1 > parseText.length || parseText[pos] !== ':') {
        return required;
      }

      pos++;
    }

    if (pos + 2 > parseText.length) {
      return required;
    }

    var ch1 = parseText[pos++];
    var ch2 = parseText[pos++];

    if (ch1 < '0' || ch1 > '9' || ch2 < '0' || ch2 > '9') {
      return required;
    }

    var value = (ch1.charCodeAt(0) - 48) * 10 + (ch2.charCodeAt(0) - 48);

    if (value < 0 || value > 59) {
      return required;
    }

    array[arrayIndex] = value;
    array[0] = pos;
    return false;
  };

  _proto.toString = function toString() {
    var converted = this.noOffsetText.replace('\'', '\'\'');
    return "Offset(" + PATTERNS[this.type] + ",'" + converted + "')";
  };

  return OffsetIdPrinterParser;
}();
OffsetIdPrinterParser.INSTANCE_ID = new OffsetIdPrinterParser('Z', '+HH:MM:ss');
OffsetIdPrinterParser.PATTERNS = PATTERNS;

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var PadPrinterParserDecorator = function () {
  function PadPrinterParserDecorator(printerParser, padWidth, padChar) {
    this._printerParser = printerParser;
    this._padWidth = padWidth;
    this._padChar = padChar;
  }

  var _proto = PadPrinterParserDecorator.prototype;

  _proto.print = function print(context, buf) {
    var preLen = buf.length();

    if (this._printerParser.print(context, buf) === false) {
      return false;
    }

    var len = buf.length() - preLen;

    if (len > this._padWidth) {
      throw new DateTimeException("Cannot print as output of " + len + " characters exceeds pad width of " + this._padWidth);
    }

    for (var i = 0; i < this._padWidth - len; i++) {
      buf.insert(preLen, this._padChar);
    }

    return true;
  };

  _proto.parse = function parse(context, text, position) {
    var strict = context.isStrict();
    var caseSensitive = context.isCaseSensitive();
    assert(!(position > text.length));
    assert(position >= 0);

    if (position === text.length) {
      return ~position;
    }

    var endPos = position + this._padWidth;

    if (endPos > text.length) {
      if (strict) {
        return ~position;
      }

      endPos = text.length;
    }

    var pos = position;

    while (pos < endPos && (caseSensitive ? text[pos] === this._padChar : context.charEquals(text[pos], this._padChar))) {
      pos++;
    }

    text = text.substring(0, endPos);

    var resultPos = this._printerParser.parse(context, text, pos);

    if (resultPos !== endPos && strict) {
      return ~(position + pos);
    }

    return resultPos;
  };

  _proto.toString = function toString() {
    return "Pad(" + this._printerParser + "," + this._padWidth + (this._padChar === ' ' ? ')' : ",'" + this._padChar + "')");
  };

  return PadPrinterParserDecorator;
}();

var SettingsParser = function (_Enum) {
  _inheritsLoose(SettingsParser, _Enum);

  function SettingsParser() {
    return _Enum.apply(this, arguments) || this;
  }

  var _proto = SettingsParser.prototype;

  _proto.print = function print() {
    return true;
  };

  _proto.parse = function parse(context, text, position) {
    switch (this) {
      case SettingsParser.SENSITIVE:
        context.setCaseSensitive(true);
        break;

      case SettingsParser.INSENSITIVE:
        context.setCaseSensitive(false);
        break;

      case SettingsParser.STRICT:
        context.setStrict(true);
        break;

      case SettingsParser.LENIENT:
        context.setStrict(false);
        break;
    }

    return position;
  };

  _proto.toString = function toString() {
    switch (this) {
      case SettingsParser.SENSITIVE:
        return 'ParseCaseSensitive(true)';

      case SettingsParser.INSENSITIVE:
        return 'ParseCaseSensitive(false)';

      case SettingsParser.STRICT:
        return 'ParseStrict(true)';

      case SettingsParser.LENIENT:
        return 'ParseStrict(false)';
    }
  };

  return SettingsParser;
}(Enum);
SettingsParser.SENSITIVE = new SettingsParser('SENSITIVE');
SettingsParser.INSENSITIVE = new SettingsParser('INSENSITIVE');
SettingsParser.STRICT = new SettingsParser('STRICT');
SettingsParser.LENIENT = new SettingsParser('LENIENT');

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var StringLiteralPrinterParser = function () {
  function StringLiteralPrinterParser(literal) {
    this._literal = literal;
  }

  var _proto = StringLiteralPrinterParser.prototype;

  _proto.print = function print(context, buf) {
    buf.append(this._literal);
    return true;
  };

  _proto.parse = function parse(context, text, position) {
    var length = text.length;
    assert(!(position > length || position < 0));

    if (context.subSequenceEquals(text, position, this._literal, 0, this._literal.length) === false) {
      return ~position;
    }

    return position + this._literal.length;
  };

  _proto.toString = function toString() {
    var converted = this._literal.replace("'", "''");

    return "'" + converted + "'";
  };

  return StringLiteralPrinterParser;
}();

/*
 * @copyright (c) 2016, Philipp Thürwächter, Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var ZoneRulesProvider = function () {
  function ZoneRulesProvider() {}

  ZoneRulesProvider.getRules = function getRules(zoneId) {
    throw new DateTimeException("unsupported ZoneId:" + zoneId);
  };

  ZoneRulesProvider.getAvailableZoneIds = function getAvailableZoneIds() {
    return [];
  };

  return ZoneRulesProvider;
}();

var ZoneRegion = function (_ZoneId) {
  _inheritsLoose(ZoneRegion, _ZoneId);

  ZoneRegion.ofId = function ofId(zoneId) {
    var rules = ZoneRulesProvider.getRules(zoneId);
    return new ZoneRegion(zoneId, rules);
  };

  function ZoneRegion(id, rules) {
    var _this;

    _this = _ZoneId.call(this) || this;
    _this._id = id;
    _this._rules = rules;
    return _this;
  }

  var _proto = ZoneRegion.prototype;

  _proto.id = function id() {
    return this._id;
  };

  _proto.rules = function rules() {
    return this._rules;
  };

  return ZoneRegion;
}(ZoneId);

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var ZoneIdPrinterParser = function () {
  function ZoneIdPrinterParser(query, description) {
    this.query = query;
    this.description = description;
  }

  var _proto = ZoneIdPrinterParser.prototype;

  _proto.print = function print(context, buf) {
    var zone = context.getValueQuery(this.query);

    if (zone == null) {
      return false;
    }

    buf.append(zone.id());
    return true;
  };

  _proto.parse = function parse(context, text, position) {
    var length = text.length;

    if (position > length) {
      return ~position;
    }

    if (position === length) {
      return ~position;
    }

    var nextChar = text.charAt(position);

    if (nextChar === '+' || nextChar === '-') {
      var newContext = context.copy();
      var endPos = OffsetIdPrinterParser.INSTANCE_ID.parse(newContext, text, position);

      if (endPos < 0) {
        return endPos;
      }

      var offset = newContext.getParsed(ChronoField.OFFSET_SECONDS);
      var zone = ZoneOffset.ofTotalSeconds(offset);
      context.setParsedZone(zone);
      return endPos;
    } else if (length >= position + 2) {
      var nextNextChar = text.charAt(position + 1);

      if (context.charEquals(nextChar, 'U') && context.charEquals(nextNextChar, 'T')) {
        if (length >= position + 3 && context.charEquals(text.charAt(position + 2), 'C')) {
          return this._parsePrefixedOffset(context, text, position, position + 3);
        }

        return this._parsePrefixedOffset(context, text, position, position + 2);
      } else if (context.charEquals(nextChar, 'G') && length >= position + 3 && context.charEquals(nextNextChar, 'M') && context.charEquals(text.charAt(position + 2), 'T')) {
        return this._parsePrefixedOffset(context, text, position, position + 3);
      }
    }

    if (text.substr(position, 6) === 'SYSTEM') {
      context.setParsedZone(ZoneId.systemDefault());
      return position + 6;
    }

    if (context.charEquals(nextChar, 'Z')) {
      context.setParsedZone(ZoneOffset.UTC);
      return position + 1;
    }

    var availableZoneIds = ZoneRulesProvider.getAvailableZoneIds();

    if (zoneIdTree.size !== availableZoneIds.length) {
      zoneIdTree = ZoneIdTree.createTreeMap(availableZoneIds);
    }

    var maxParseLength = length - position;
    var treeMap = zoneIdTree.treeMap;
    var parsedZoneId = null;
    var parseLength = 0;

    while (treeMap != null) {
      var parsedSubZoneId = text.substr(position, Math.min(treeMap.length, maxParseLength));
      treeMap = treeMap.get(parsedSubZoneId);

      if (treeMap != null && treeMap.isLeaf) {
        parsedZoneId = parsedSubZoneId;
        parseLength = treeMap.length;
      }
    }

    if (parsedZoneId != null) {
      context.setParsedZone(ZoneRegion.ofId(parsedZoneId));
      return position + parseLength;
    }

    return ~position;
  };

  _proto._parsePrefixedOffset = function _parsePrefixedOffset(context, text, prefixPos, position) {
    var prefix = text.substring(prefixPos, position).toUpperCase();
    var newContext = context.copy();

    if (position < text.length && context.charEquals(text.charAt(position), 'Z')) {
      context.setParsedZone(ZoneId.ofOffset(prefix, ZoneOffset.UTC));
      return position;
    }

    var endPos = OffsetIdPrinterParser.INSTANCE_ID.parse(newContext, text, position);

    if (endPos < 0) {
      context.setParsedZone(ZoneId.ofOffset(prefix, ZoneOffset.UTC));
      return position;
    }

    var offsetSecs = newContext.getParsed(ChronoField.OFFSET_SECONDS);
    var offset = ZoneOffset.ofTotalSeconds(offsetSecs);
    context.setParsedZone(ZoneId.ofOffset(prefix, offset));
    return endPos;
  };

  _proto.toString = function toString() {
    return this.description;
  };

  return ZoneIdPrinterParser;
}();

var ZoneIdTree = function () {
  ZoneIdTree.createTreeMap = function createTreeMap(availableZoneIds) {
    var sortedZoneIds = availableZoneIds.sort(function (a, b) {
      return a.length - b.length;
    });
    var treeMap = new ZoneIdTreeMap(sortedZoneIds[0].length, false);

    for (var i = 0; i < sortedZoneIds.length; i++) {
      treeMap.add(sortedZoneIds[i]);
    }

    return new ZoneIdTree(sortedZoneIds.length, treeMap);
  };

  function ZoneIdTree(size, treeMap) {
    this.size = size;
    this.treeMap = treeMap;
  }

  return ZoneIdTree;
}();

var ZoneIdTreeMap = function () {
  function ZoneIdTreeMap(length, isLeaf) {
    if (length === void 0) {
      length = 0;
    }

    if (isLeaf === void 0) {
      isLeaf = false;
    }

    this.length = length;
    this.isLeaf = isLeaf;
    this._treeMap = {};
  }

  var _proto2 = ZoneIdTreeMap.prototype;

  _proto2.add = function add(zoneId) {
    var idLength = zoneId.length;

    if (idLength === this.length) {
      this._treeMap[zoneId] = new ZoneIdTreeMap(idLength, true);
    } else if (idLength > this.length) {
      var subZoneId = zoneId.substr(0, this.length);
      var subTreeMap = this._treeMap[subZoneId];

      if (subTreeMap == null) {
        subTreeMap = new ZoneIdTreeMap(idLength, false);
        this._treeMap[subZoneId] = subTreeMap;
      }

      subTreeMap.add(zoneId);
    }
  };

  _proto2.get = function get(zoneId) {
    return this._treeMap[zoneId];
  };

  return ZoneIdTreeMap;
}();

var zoneIdTree = new ZoneIdTree([]);

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var MAX_WIDTH = 15;
var DateTimeFormatterBuilder = function () {
  function DateTimeFormatterBuilder() {
    this._active = this;
    this._parent = null;
    this._printerParsers = [];
    this._optional = false;
    this._padNextWidth = 0;
    this._padNextChar = null;
    this._valueParserIndex = -1;
  }

  DateTimeFormatterBuilder._of = function _of(parent, optional) {
    requireNonNull(parent, 'parent');
    requireNonNull(optional, 'optional');
    var dtFormatterBuilder = new DateTimeFormatterBuilder();
    dtFormatterBuilder._parent = parent;
    dtFormatterBuilder._optional = optional;
    return dtFormatterBuilder;
  };

  var _proto = DateTimeFormatterBuilder.prototype;

  _proto.parseCaseSensitive = function parseCaseSensitive() {
    this._appendInternalPrinterParser(SettingsParser.SENSITIVE);

    return this;
  };

  _proto.parseCaseInsensitive = function parseCaseInsensitive() {
    this._appendInternalPrinterParser(SettingsParser.INSENSITIVE);

    return this;
  };

  _proto.parseStrict = function parseStrict() {
    this._appendInternalPrinterParser(SettingsParser.STRICT);

    return this;
  };

  _proto.parseLenient = function parseLenient() {
    this._appendInternalPrinterParser(SettingsParser.LENIENT);

    return this;
  };

  _proto.appendValue = function appendValue() {
    if (arguments.length === 1) {
      return this._appendValue1.apply(this, arguments);
    } else if (arguments.length === 2) {
      return this._appendValue2.apply(this, arguments);
    } else {
      return this._appendValue4.apply(this, arguments);
    }
  };

  _proto._appendValue1 = function _appendValue1(field) {
    requireNonNull(field);

    this._appendValuePrinterParser(new NumberPrinterParser(field, 1, MAX_WIDTH, SignStyle.NORMAL));

    return this;
  };

  _proto._appendValue2 = function _appendValue2(field, width) {
    requireNonNull(field);

    if (width < 1 || width > MAX_WIDTH) {
      throw new IllegalArgumentException("The width must be from 1 to " + MAX_WIDTH + " inclusive but was " + width);
    }

    var pp = new NumberPrinterParser(field, width, width, SignStyle.NOT_NEGATIVE);

    this._appendValuePrinterParser(pp);

    return this;
  };

  _proto._appendValue4 = function _appendValue4(field, minWidth, maxWidth, signStyle) {
    requireNonNull(field);
    requireNonNull(signStyle);

    if (minWidth === maxWidth && signStyle === SignStyle.NOT_NEGATIVE) {
      return this._appendValue2(field, maxWidth);
    }

    if (minWidth < 1 || minWidth > MAX_WIDTH) {
      throw new IllegalArgumentException("The minimum width must be from 1 to " + MAX_WIDTH + " inclusive but was " + minWidth);
    }

    if (maxWidth < 1 || maxWidth > MAX_WIDTH) {
      throw new IllegalArgumentException("The minimum width must be from 1 to " + MAX_WIDTH + " inclusive but was " + maxWidth);
    }

    if (maxWidth < minWidth) {
      throw new IllegalArgumentException("The maximum width must exceed or equal the minimum width but " + maxWidth + " < " + minWidth);
    }

    var pp = new NumberPrinterParser(field, minWidth, maxWidth, signStyle);

    this._appendValuePrinterParser(pp);

    return this;
  };

  _proto.appendValueReduced = function appendValueReduced() {
    if (arguments.length === 4 && arguments[3] instanceof ChronoLocalDate) {
      return this._appendValueReducedFieldWidthMaxWidthBaseDate.apply(this, arguments);
    } else {
      return this._appendValueReducedFieldWidthMaxWidthBaseValue.apply(this, arguments);
    }
  };

  _proto._appendValueReducedFieldWidthMaxWidthBaseValue = function _appendValueReducedFieldWidthMaxWidthBaseValue(field, width, maxWidth, baseValue) {
    requireNonNull(field, 'field');
    var pp = new ReducedPrinterParser(field, width, maxWidth, baseValue, null);

    this._appendValuePrinterParser(pp);

    return this;
  };

  _proto._appendValueReducedFieldWidthMaxWidthBaseDate = function _appendValueReducedFieldWidthMaxWidthBaseDate(field, width, maxWidth, baseDate) {
    requireNonNull(field, 'field');
    requireNonNull(baseDate, 'baseDate');
    requireInstance(baseDate, ChronoLocalDate, 'baseDate');
    var pp = new ReducedPrinterParser(field, width, maxWidth, 0, baseDate);

    this._appendValuePrinterParser(pp);

    return this;
  };

  _proto._appendValuePrinterParser = function _appendValuePrinterParser(pp) {
    assert(pp != null);

    if (this._active._valueParserIndex >= 0 && this._active._printerParsers[this._active._valueParserIndex] instanceof NumberPrinterParser) {
      var activeValueParser = this._active._valueParserIndex;
      var basePP = this._active._printerParsers[activeValueParser];

      if (pp.minWidth() === pp.maxWidth() && pp.signStyle() === SignStyle.NOT_NEGATIVE) {
        basePP = basePP.withSubsequentWidth(pp.maxWidth());

        this._appendInternal(pp.withFixedWidth());

        this._active._valueParserIndex = activeValueParser;
      } else {
        basePP = basePP.withFixedWidth();
        this._active._valueParserIndex = this._appendInternal(pp);
      }

      this._active._printerParsers[activeValueParser] = basePP;
    } else {
      this._active._valueParserIndex = this._appendInternal(pp);
    }

    return this;
  };

  _proto.appendFraction = function appendFraction(field, minWidth, maxWidth, decimalPoint) {
    this._appendInternal(new FractionPrinterParser(field, minWidth, maxWidth, decimalPoint));

    return this;
  };

  _proto.appendInstant = function appendInstant(fractionalDigits) {
    if (fractionalDigits === void 0) {
      fractionalDigits = -2;
    }

    if (fractionalDigits < -2 || fractionalDigits > 9) {
      throw new IllegalArgumentException("Invalid fractional digits: " + fractionalDigits);
    }

    this._appendInternal(new InstantPrinterParser(fractionalDigits));

    return this;
  };

  _proto.appendOffsetId = function appendOffsetId() {
    this._appendInternal(OffsetIdPrinterParser.INSTANCE_ID);

    return this;
  };

  _proto.appendOffset = function appendOffset(pattern, noOffsetText) {
    this._appendInternalPrinterParser(new OffsetIdPrinterParser(noOffsetText, pattern));

    return this;
  };

  _proto.appendZoneId = function appendZoneId() {
    this._appendInternal(new ZoneIdPrinterParser(TemporalQueries.zoneId(), 'ZoneId()'));

    return this;
  };

  _proto.appendPattern = function appendPattern(pattern) {
    requireNonNull(pattern, 'pattern');

    this._parsePattern(pattern);

    return this;
  };

  _proto.appendZoneText = function appendZoneText() {
    throw new IllegalArgumentException('Pattern using (localized) text not implemented, use @js-joda/locale plugin!');
  };

  _proto.appendText = function appendText() {
    throw new IllegalArgumentException('Pattern using (localized) text not implemented, use @js-joda/locale plugin!');
  };

  _proto.appendLocalizedOffset = function appendLocalizedOffset() {
    throw new IllegalArgumentException('Pattern using (localized) text not implemented, use @js-joda/locale plugin!');
  };

  _proto.appendWeekField = function appendWeekField() {
    throw new IllegalArgumentException('Pattern using (localized) text not implemented, use @js-joda/locale plugin!');
  };

  _proto._parsePattern = function _parsePattern(pattern) {
    var FIELD_MAP = {
      'G': ChronoField.ERA,
      'y': ChronoField.YEAR_OF_ERA,
      'u': ChronoField.YEAR,
      'Q': IsoFields.QUARTER_OF_YEAR,
      'q': IsoFields.QUARTER_OF_YEAR,
      'M': ChronoField.MONTH_OF_YEAR,
      'L': ChronoField.MONTH_OF_YEAR,
      'D': ChronoField.DAY_OF_YEAR,
      'd': ChronoField.DAY_OF_MONTH,
      'F': ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH,
      'E': ChronoField.DAY_OF_WEEK,
      'c': ChronoField.DAY_OF_WEEK,
      'e': ChronoField.DAY_OF_WEEK,
      'a': ChronoField.AMPM_OF_DAY,
      'H': ChronoField.HOUR_OF_DAY,
      'k': ChronoField.CLOCK_HOUR_OF_DAY,
      'K': ChronoField.HOUR_OF_AMPM,
      'h': ChronoField.CLOCK_HOUR_OF_AMPM,
      'm': ChronoField.MINUTE_OF_HOUR,
      's': ChronoField.SECOND_OF_MINUTE,
      'S': ChronoField.NANO_OF_SECOND,
      'A': ChronoField.MILLI_OF_DAY,
      'n': ChronoField.NANO_OF_SECOND,
      'N': ChronoField.NANO_OF_DAY
    };

    for (var pos = 0; pos < pattern.length; pos++) {
      var cur = pattern.charAt(pos);

      if (cur >= 'A' && cur <= 'Z' || cur >= 'a' && cur <= 'z') {
        var start = pos++;

        for (; pos < pattern.length && pattern.charAt(pos) === cur; pos++) {
        }

        var count = pos - start;

        if (cur === 'p') {
          var pad = 0;

          if (pos < pattern.length) {
            cur = pattern.charAt(pos);

            if (cur >= 'A' && cur <= 'Z' || cur >= 'a' && cur <= 'z') {
              pad = count;
              start = pos++;

              for (; pos < pattern.length && pattern.charAt(pos) === cur; pos++) {
              }

              count = pos - start;
            }
          }

          if (pad === 0) {
            throw new IllegalArgumentException("Pad letter 'p' must be followed by valid pad pattern: " + pattern);
          }

          this.padNext(pad);
        }

        var field = FIELD_MAP[cur];

        if (field != null) {
          this._parseField(cur, count, field);
        } else if (cur === 'z') {
          if (count > 4) {
            throw new IllegalArgumentException("Too many pattern letters: " + cur);
          } else if (count === 4) {
            this.appendZoneText(TextStyle.FULL);
          } else {
            this.appendZoneText(TextStyle.SHORT);
          }
        } else if (cur === 'V') {
          if (count !== 2) {
            throw new IllegalArgumentException("Pattern letter count must be 2: " + cur);
          }

          this.appendZoneId();
        } else if (cur === 'Z') {
          if (count < 4) {
            this.appendOffset('+HHMM', '+0000');
          } else if (count === 4) {
            this.appendLocalizedOffset(TextStyle.FULL);
          } else if (count === 5) {
            this.appendOffset('+HH:MM:ss', 'Z');
          } else {
            throw new IllegalArgumentException("Too many pattern letters: " + cur);
          }
        } else if (cur === 'O') {
          if (count === 1) {
            this.appendLocalizedOffset(TextStyle.SHORT);
          } else if (count === 4) {
            this.appendLocalizedOffset(TextStyle.FULL);
          } else {
            throw new IllegalArgumentException("Pattern letter count must be 1 or 4: " + cur);
          }
        } else if (cur === 'X') {
          if (count > 5) {
            throw new IllegalArgumentException("Too many pattern letters: " + cur);
          }

          this.appendOffset(OffsetIdPrinterParser.PATTERNS[count + (count === 1 ? 0 : 1)], 'Z');
        } else if (cur === 'x') {
          if (count > 5) {
            throw new IllegalArgumentException("Too many pattern letters: " + cur);
          }

          var zero = count === 1 ? '+00' : count % 2 === 0 ? '+0000' : '+00:00';
          this.appendOffset(OffsetIdPrinterParser.PATTERNS[count + (count === 1 ? 0 : 1)], zero);
        } else if (cur === 'W') {
          if (count > 1) {
            throw new IllegalArgumentException("Too many pattern letters: " + cur);
          }

          this.appendWeekField('W', count);
        } else if (cur === 'w') {
          if (count > 2) {
            throw new IllegalArgumentException("Too many pattern letters: " + cur);
          }

          this.appendWeekField('w', count);
        } else if (cur === 'Y') {
          this.appendWeekField('Y', count);
        } else {
          throw new IllegalArgumentException("Unknown pattern letter: " + cur);
        }

        pos--;
      } else if (cur === '\'') {
        var _start = pos++;

        for (; pos < pattern.length; pos++) {
          if (pattern.charAt(pos) === '\'') {
            if (pos + 1 < pattern.length && pattern.charAt(pos + 1) === '\'') {
              pos++;
            } else {
              break;
            }
          }
        }

        if (pos >= pattern.length) {
          throw new IllegalArgumentException("Pattern ends with an incomplete string literal: " + pattern);
        }

        var str = pattern.substring(_start + 1, pos);

        if (str.length === 0) {
          this.appendLiteral('\'');
        } else {
          this.appendLiteral(str.replace('\'\'', '\''));
        }
      } else if (cur === '[') {
        this.optionalStart();
      } else if (cur === ']') {
        if (this._active._parent === null) {
          throw new IllegalArgumentException('Pattern invalid as it contains ] without previous [');
        }

        this.optionalEnd();
      } else if (cur === '{' || cur === '}' || cur === '#') {
        throw new IllegalArgumentException("Pattern includes reserved character: '" + cur + "'");
      } else {
        this.appendLiteral(cur);
      }
    }
  };

  _proto._parseField = function _parseField(cur, count, field) {
    switch (cur) {
      case 'u':
      case 'y':
        if (count === 2) {
          this.appendValueReduced(field, 2, 2, ReducedPrinterParser.BASE_DATE);
        } else if (count < 4) {
          this.appendValue(field, count, MAX_WIDTH, SignStyle.NORMAL);
        } else {
          this.appendValue(field, count, MAX_WIDTH, SignStyle.EXCEEDS_PAD);
        }

        break;

      case 'M':
      case 'Q':
        switch (count) {
          case 1:
            this.appendValue(field);
            break;

          case 2:
            this.appendValue(field, 2);
            break;

          case 3:
            this.appendText(field, TextStyle.SHORT);
            break;

          case 4:
            this.appendText(field, TextStyle.FULL);
            break;

          case 5:
            this.appendText(field, TextStyle.NARROW);
            break;

          default:
            throw new IllegalArgumentException("Too many pattern letters: " + cur);
        }

        break;

      case 'L':
      case 'q':
        switch (count) {
          case 1:
            this.appendValue(field);
            break;

          case 2:
            this.appendValue(field, 2);
            break;

          case 3:
            this.appendText(field, TextStyle.SHORT_STANDALONE);
            break;

          case 4:
            this.appendText(field, TextStyle.FULL_STANDALONE);
            break;

          case 5:
            this.appendText(field, TextStyle.NARROW_STANDALONE);
            break;

          default:
            throw new IllegalArgumentException("Too many pattern letters: " + cur);
        }

        break;

      case 'e':
        switch (count) {
          case 1:
          case 2:
            this.appendWeekField('e', count);
            break;

          case 3:
            this.appendText(field, TextStyle.SHORT);
            break;

          case 4:
            this.appendText(field, TextStyle.FULL);
            break;

          case 5:
            this.appendText(field, TextStyle.NARROW);
            break;

          default:
            throw new IllegalArgumentException("Too many pattern letters: " + cur);
        }

        break;

      case 'c':
        switch (count) {
          case 1:
            this.appendWeekField('c', count);
            break;

          case 2:
            throw new IllegalArgumentException("Invalid number of pattern letters: " + cur);

          case 3:
            this.appendText(field, TextStyle.SHORT_STANDALONE);
            break;

          case 4:
            this.appendText(field, TextStyle.FULL_STANDALONE);
            break;

          case 5:
            this.appendText(field, TextStyle.NARROW_STANDALONE);
            break;

          default:
            throw new IllegalArgumentException("Too many pattern letters: " + cur);
        }

        break;

      case 'a':
        if (count === 1) {
          this.appendText(field, TextStyle.SHORT);
        } else {
          throw new IllegalArgumentException("Too many pattern letters: " + cur);
        }

        break;

      case 'E':
      case 'G':
        switch (count) {
          case 1:
          case 2:
          case 3:
            this.appendText(field, TextStyle.SHORT);
            break;

          case 4:
            this.appendText(field, TextStyle.FULL);
            break;

          case 5:
            this.appendText(field, TextStyle.NARROW);
            break;

          default:
            throw new IllegalArgumentException("Too many pattern letters: " + cur);
        }

        break;

      case 'S':
        this.appendFraction(ChronoField.NANO_OF_SECOND, count, count, false);
        break;

      case 'F':
        if (count === 1) {
          this.appendValue(field);
        } else {
          throw new IllegalArgumentException("Too many pattern letters: " + cur);
        }

        break;

      case 'd':
      case 'h':
      case 'H':
      case 'k':
      case 'K':
      case 'm':
      case 's':
        if (count === 1) {
          this.appendValue(field);
        } else if (count === 2) {
          this.appendValue(field, count);
        } else {
          throw new IllegalArgumentException("Too many pattern letters: " + cur);
        }

        break;

      case 'D':
        if (count === 1) {
          this.appendValue(field);
        } else if (count <= 3) {
          this.appendValue(field, count);
        } else {
          throw new IllegalArgumentException("Too many pattern letters: " + cur);
        }

        break;

      default:
        if (count === 1) {
          this.appendValue(field);
        } else {
          this.appendValue(field, count);
        }

        break;
    }
  };

  _proto.padNext = function padNext() {
    if (arguments.length === 1) {
      return this._padNext1.apply(this, arguments);
    } else {
      return this._padNext2.apply(this, arguments);
    }
  };

  _proto._padNext1 = function _padNext1(padWidth) {
    return this._padNext2(padWidth, ' ');
  };

  _proto._padNext2 = function _padNext2(padWidth, padChar) {
    if (padWidth < 1) {
      throw new IllegalArgumentException("The pad width must be at least one but was " + padWidth);
    }

    this._active._padNextWidth = padWidth;
    this._active._padNextChar = padChar;
    this._active._valueParserIndex = -1;
    return this;
  };

  _proto.optionalStart = function optionalStart() {
    this._active._valueParserIndex = -1;
    this._active = DateTimeFormatterBuilder._of(this._active, true);
    return this;
  };

  _proto.optionalEnd = function optionalEnd() {
    if (this._active._parent == null) {
      throw new IllegalStateException('Cannot call optionalEnd() as there was no previous call to optionalStart()');
    }

    if (this._active._printerParsers.length > 0) {
      var cpp = new CompositePrinterParser(this._active._printerParsers, this._active._optional);
      this._active = this._active._parent;

      this._appendInternal(cpp);
    } else {
      this._active = this._active._parent;
    }

    return this;
  };

  _proto._appendInternal = function _appendInternal(pp) {
    assert(pp != null);

    if (this._active._padNextWidth > 0) {
      if (pp != null) {
        pp = new PadPrinterParserDecorator(pp, this._active._padNextWidth, this._active._padNextChar);
      }

      this._active._padNextWidth = 0;
      this._active._padNextChar = 0;
    }

    this._active._printerParsers.push(pp);

    this._active._valueParserIndex = -1;
    return this._active._printerParsers.length - 1;
  };

  _proto.appendLiteral = function appendLiteral(literal) {
    assert(literal != null);

    if (literal.length > 0) {
      if (literal.length === 1) {
        this._appendInternalPrinterParser(new CharLiteralPrinterParser(literal.charAt(0)));
      } else {
        this._appendInternalPrinterParser(new StringLiteralPrinterParser(literal));
      }
    }

    return this;
  };

  _proto._appendInternalPrinterParser = function _appendInternalPrinterParser(pp) {
    assert(pp != null);

    if (this._active._padNextWidth > 0) {
      if (pp != null) {
        pp = new PadPrinterParserDecorator(pp, this._active._padNextWidth, this._active._padNextChar);
      }

      this._active._padNextWidth = 0;
      this._active._padNextChar = 0;
    }

    this._active._printerParsers.push(pp);

    this._active._valueParserIndex = -1;
    return this._active._printerParsers.length - 1;
  };

  _proto.append = function append(formatter) {
    requireNonNull(formatter, 'formatter');

    this._appendInternal(formatter._toPrinterParser(false));

    return this;
  };

  _proto.toFormatter = function toFormatter(resolverStyle) {
    if (resolverStyle === void 0) {
      resolverStyle = ResolverStyle.SMART;
    }

    while (this._active._parent != null) {
      this.optionalEnd();
    }

    var pp = new CompositePrinterParser(this._printerParsers, false);
    return new DateTimeFormatter(pp, null, DecimalStyle.STANDARD, resolverStyle, null, null, null);
  };

  return DateTimeFormatterBuilder;
}();
var SECONDS_PER_10000_YEARS = 146097 * 25 * 86400;
var SECONDS_0000_TO_1970 = (146097 * 5 - (30 * 365 + 7)) * 86400;

var InstantPrinterParser = function () {
  function InstantPrinterParser(fractionalDigits) {
    this.fractionalDigits = fractionalDigits;
  }

  var _proto2 = InstantPrinterParser.prototype;

  _proto2.print = function print(context, buf) {
    var inSecs = context.getValue(ChronoField.INSTANT_SECONDS);
    var inNanos = 0;

    if (context.temporal().isSupported(ChronoField.NANO_OF_SECOND)) {
      inNanos = context.temporal().getLong(ChronoField.NANO_OF_SECOND);
    }

    if (inSecs == null) {
      return false;
    }

    var inSec = inSecs;
    var inNano = ChronoField.NANO_OF_SECOND.checkValidIntValue(inNanos);

    if (inSec >= -SECONDS_0000_TO_1970) {
      var zeroSecs = inSec - SECONDS_PER_10000_YEARS + SECONDS_0000_TO_1970;
      var hi = MathUtil.floorDiv(zeroSecs, SECONDS_PER_10000_YEARS) + 1;
      var lo = MathUtil.floorMod(zeroSecs, SECONDS_PER_10000_YEARS);
      var ldt = LocalDateTime.ofEpochSecond(lo - SECONDS_0000_TO_1970, 0, ZoneOffset.UTC);

      if (hi > 0) {
        buf.append('+').append(hi);
      }

      buf.append(ldt.toString());

      if (ldt.second() === 0) {
        buf.append(':00');
      }
    } else {
      var _zeroSecs = inSec + SECONDS_0000_TO_1970;

      var _hi = MathUtil.intDiv(_zeroSecs, SECONDS_PER_10000_YEARS);

      var _lo = MathUtil.intMod(_zeroSecs, SECONDS_PER_10000_YEARS);

      var _ldt = LocalDateTime.ofEpochSecond(_lo - SECONDS_0000_TO_1970, 0, ZoneOffset.UTC);

      var pos = buf.length();
      buf.append(_ldt.toString());

      if (_ldt.second() === 0) {
        buf.append(':00');
      }

      if (_hi < 0) {
        if (_ldt.year() === -10000) {
          buf.replace(pos, pos + 2, "" + (_hi - 1));
        } else if (_lo === 0) {
          buf.insert(pos, _hi);
        } else {
          buf.insert(pos + 1, Math.abs(_hi));
        }
      }
    }

    if (this.fractionalDigits === -2) {
      if (inNano !== 0) {
        buf.append('.');

        if (MathUtil.intMod(inNano, 1000000) === 0) {
          buf.append(("" + (MathUtil.intDiv(inNano, 1000000) + 1000)).substring(1));
        } else if (MathUtil.intMod(inNano, 1000) === 0) {
          buf.append(("" + (MathUtil.intDiv(inNano, 1000) + 1000000)).substring(1));
        } else {
          buf.append(("" + (inNano + 1000000000)).substring(1));
        }
      }
    } else if (this.fractionalDigits > 0 || this.fractionalDigits === -1 && inNano > 0) {
      buf.append('.');
      var div = 100000000;

      for (var i = 0; this.fractionalDigits === -1 && inNano > 0 || i < this.fractionalDigits; i++) {
        var digit = MathUtil.intDiv(inNano, div);
        buf.append(digit);
        inNano = inNano - digit * div;
        div = MathUtil.intDiv(div, 10);
      }
    }

    buf.append('Z');
    return true;
  };

  _proto2.parse = function parse(context, text, position) {
    var newContext = context.copy();
    var minDigits = this.fractionalDigits < 0 ? 0 : this.fractionalDigits;
    var maxDigits = this.fractionalDigits < 0 ? 9 : this.fractionalDigits;

    var parser = new DateTimeFormatterBuilder().append(DateTimeFormatter.ISO_LOCAL_DATE).appendLiteral('T').appendValue(ChronoField.HOUR_OF_DAY, 2).appendLiteral(':').appendValue(ChronoField.MINUTE_OF_HOUR, 2).appendLiteral(':').appendValue(ChronoField.SECOND_OF_MINUTE, 2).appendFraction(ChronoField.NANO_OF_SECOND, minDigits, maxDigits, true).appendLiteral('Z').toFormatter()._toPrinterParser(false);

    var pos = parser.parse(newContext, text, position);

    if (pos < 0) {
      return pos;
    }

    var yearParsed = newContext.getParsed(ChronoField.YEAR);
    var month = newContext.getParsed(ChronoField.MONTH_OF_YEAR);
    var day = newContext.getParsed(ChronoField.DAY_OF_MONTH);
    var hour = newContext.getParsed(ChronoField.HOUR_OF_DAY);
    var min = newContext.getParsed(ChronoField.MINUTE_OF_HOUR);
    var secVal = newContext.getParsed(ChronoField.SECOND_OF_MINUTE);
    var nanoVal = newContext.getParsed(ChronoField.NANO_OF_SECOND);
    var sec = secVal != null ? secVal : 0;
    var nano = nanoVal != null ? nanoVal : 0;
    var year = MathUtil.intMod(yearParsed, 10000);
    var days = 0;

    if (hour === 24 && min === 0 && sec === 0 && nano === 0) {
      hour = 0;
      days = 1;
    } else if (hour === 23 && min === 59 && sec === 60) {
      context.setParsedLeapSecond();
      sec = 59;
    }

    var instantSecs;

    try {
      var ldt = LocalDateTime.of(year, month, day, hour, min, sec, 0).plusDays(days);
      instantSecs = ldt.toEpochSecond(ZoneOffset.UTC);
      instantSecs += MathUtil.safeMultiply(MathUtil.intDiv(yearParsed, 10000), SECONDS_PER_10000_YEARS);
    } catch (ex) {
      return ~position;
    }

    var successPos = pos;
    successPos = context.setParsedField(ChronoField.INSTANT_SECONDS, instantSecs, position, successPos);
    return context.setParsedField(ChronoField.NANO_OF_SECOND, nano, position, successPos);
  };

  _proto2.toString = function toString() {
    return 'Instant()';
  };

  return InstantPrinterParser;
}();

function _init$e() {
  ReducedPrinterParser.BASE_DATE = LocalDate.of(2000, 1, 1);
  DateTimeFormatterBuilder.CompositePrinterParser = CompositePrinterParser;
  DateTimeFormatterBuilder.PadPrinterParserDecorator = PadPrinterParserDecorator;
  DateTimeFormatterBuilder.SettingsParser = SettingsParser;
  DateTimeFormatterBuilder.CharLiteralPrinterParser = StringLiteralPrinterParser;
  DateTimeFormatterBuilder.StringLiteralPrinterParser = StringLiteralPrinterParser;
  DateTimeFormatterBuilder.CharLiteralPrinterParser = CharLiteralPrinterParser;
  DateTimeFormatterBuilder.NumberPrinterParser = NumberPrinterParser;
  DateTimeFormatterBuilder.ReducedPrinterParser = ReducedPrinterParser;
  DateTimeFormatterBuilder.FractionPrinterParser = FractionPrinterParser;
  DateTimeFormatterBuilder.OffsetIdPrinterParser = OffsetIdPrinterParser;
  DateTimeFormatterBuilder.ZoneIdPrinterParser = ZoneIdPrinterParser;
}

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var StringBuilder = function () {
  function StringBuilder() {
    this._str = '';
  }

  var _proto = StringBuilder.prototype;

  _proto.append = function append(str) {
    this._str += str;
    return this;
  };

  _proto.appendChar = function appendChar(str) {
    this._str += str[0];
    return this;
  };

  _proto.insert = function insert(offset, str) {
    this._str = this._str.slice(0, offset) + str + this._str.slice(offset);
    return this;
  };

  _proto.replace = function replace(start, end, str) {
    this._str = this._str.slice(0, start) + str + this._str.slice(end);
    return this;
  };

  _proto.length = function length() {
    return this._str.length;
  };

  _proto.setLength = function setLength(length) {
    this._str = this._str.slice(0, length);
    return this;
  };

  _proto.toString = function toString() {
    return this._str;
  };

  return StringBuilder;
}();

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var DateTimeFormatter = function () {
  DateTimeFormatter.parsedExcessDays = function parsedExcessDays() {
    return DateTimeFormatter.PARSED_EXCESS_DAYS;
  };

  DateTimeFormatter.parsedLeapSecond = function parsedLeapSecond() {
    return DateTimeFormatter.PARSED_LEAP_SECOND;
  };

  DateTimeFormatter.ofPattern = function ofPattern(pattern) {
    return new DateTimeFormatterBuilder().appendPattern(pattern).toFormatter();
  };

  function DateTimeFormatter(printerParser, locale, decimalStyle, resolverStyle, resolverFields, chrono, zone) {
    if (chrono === void 0) {
      chrono = IsoChronology.INSTANCE;
    }

    assert(printerParser != null);
    assert(decimalStyle != null);
    assert(resolverStyle != null);
    this._printerParser = printerParser;
    this._locale = locale;
    this._decimalStyle = decimalStyle;
    this._resolverStyle = resolverStyle;
    this._resolverFields = resolverFields;
    this._chrono = chrono;
    this._zone = zone;
  }

  var _proto = DateTimeFormatter.prototype;

  _proto.locale = function locale() {
    return this._locale;
  };

  _proto.decimalStyle = function decimalStyle() {
    return this._decimalStyle;
  };

  _proto.chronology = function chronology() {
    return this._chrono;
  };

  _proto.withChronology = function withChronology(chrono) {
    if (this._chrono != null && this._chrono.equals(chrono)) {
      return this;
    }

    return new DateTimeFormatter(this._printerParser, this._locale, this._decimalStyle, this._resolverStyle, this._resolverFields, chrono, this._zone);
  };

  _proto.withLocale = function withLocale() {
    return this;
  };

  _proto.withResolverStyle = function withResolverStyle(resolverStyle) {
    requireNonNull(resolverStyle, 'resolverStyle');

    if (resolverStyle.equals(this._resolverStyle)) {
      return this;
    }

    return new DateTimeFormatter(this._printerParser, this._locale, this._decimalStyle, resolverStyle, this._resolverFields, this._chrono, this._zone);
  };

  _proto.format = function format(temporal) {
    var buf = new StringBuilder(32);

    this._formatTo(temporal, buf);

    return buf.toString();
  };

  _proto._formatTo = function _formatTo(temporal, appendable) {
    requireNonNull(temporal, 'temporal');
    requireNonNull(appendable, 'appendable');
    var context = new DateTimePrintContext(temporal, this);

    this._printerParser.print(context, appendable);
  };

  _proto.parse = function parse(text, type) {
    if (arguments.length === 1) {
      return this.parse1(text);
    } else {
      return this.parse2(text, type);
    }
  };

  _proto.parse1 = function parse1(text) {
    requireNonNull(text, 'text');

    try {
      return this._parseToBuilder(text, null).resolve(this._resolverStyle, this._resolverFields);
    } catch (ex) {
      if (ex instanceof DateTimeParseException) {
        throw ex;
      } else {
        throw this._createError(text, ex);
      }
    }
  };

  _proto.parse2 = function parse2(text, type) {
    requireNonNull(text, 'text');
    requireNonNull(type, 'type');

    try {
      var builder = this._parseToBuilder(text, null).resolve(this._resolverStyle, this._resolverFields);

      return builder.build(type);
    } catch (ex) {
      if (ex instanceof DateTimeParseException) {
        throw ex;
      } else {
        throw this._createError(text, ex);
      }
    }
  };

  _proto._createError = function _createError(text, ex) {
    var abbr = '';

    if (text.length > 64) {
      abbr = text.substring(0, 64) + "...";
    } else {
      abbr = text;
    }

    return new DateTimeParseException("Text '" + abbr + "' could not be parsed: " + ex.message, text, 0, ex);
  };

  _proto._parseToBuilder = function _parseToBuilder(text, position) {
    var pos = position != null ? position : new ParsePosition(0);

    var result = this._parseUnresolved0(text, pos);

    if (result == null || pos.getErrorIndex() >= 0 || position == null && pos.getIndex() < text.length) {
      var abbr = '';

      if (text.length > 64) {
        abbr = text.substr(0, 64).toString() + "...";
      } else {
        abbr = text;
      }

      if (pos.getErrorIndex() >= 0) {
        throw new DateTimeParseException("Text '" + abbr + "' could not be parsed at index " + pos.getErrorIndex(), text, pos.getErrorIndex());
      } else {
        throw new DateTimeParseException("Text '" + abbr + "' could not be parsed, unparsed text found at index " + pos.getIndex(), text, pos.getIndex());
      }
    }

    return result.toBuilder();
  };

  _proto.parseUnresolved = function parseUnresolved(text, position) {
    return this._parseUnresolved0(text, position);
  };

  _proto._parseUnresolved0 = function _parseUnresolved0(text, position) {
    assert(text != null, 'text', NullPointerException);
    assert(position != null, 'position', NullPointerException);
    var context = new DateTimeParseContext(this);
    var pos = position.getIndex();
    pos = this._printerParser.parse(context, text, pos);

    if (pos < 0) {
      position.setErrorIndex(~pos);
      return null;
    }

    position.setIndex(pos);
    return context.toParsed();
  };

  _proto._toPrinterParser = function _toPrinterParser(optional) {
    return this._printerParser.withOptional(optional);
  };

  _proto.toString = function toString() {
    var pattern = this._printerParser.toString();

    return pattern.indexOf('[') === 0 ? pattern : pattern.substring(1, pattern.length - 1);
  };

  return DateTimeFormatter;
}();
function _init$d() {
  DateTimeFormatter.ISO_LOCAL_DATE = new DateTimeFormatterBuilder().appendValue(ChronoField.YEAR, 4, 10, SignStyle.EXCEEDS_PAD).appendLiteral('-').appendValue(ChronoField.MONTH_OF_YEAR, 2).appendLiteral('-').appendValue(ChronoField.DAY_OF_MONTH, 2).toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
  DateTimeFormatter.ISO_LOCAL_TIME = new DateTimeFormatterBuilder().appendValue(ChronoField.HOUR_OF_DAY, 2).appendLiteral(':').appendValue(ChronoField.MINUTE_OF_HOUR, 2).optionalStart().appendLiteral(':').appendValue(ChronoField.SECOND_OF_MINUTE, 2).optionalStart().appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true).toFormatter(ResolverStyle.STRICT);
  DateTimeFormatter.ISO_LOCAL_DATE_TIME = new DateTimeFormatterBuilder().parseCaseInsensitive().append(DateTimeFormatter.ISO_LOCAL_DATE).appendLiteral('T').append(DateTimeFormatter.ISO_LOCAL_TIME).toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
  DateTimeFormatter.ISO_INSTANT = new DateTimeFormatterBuilder().parseCaseInsensitive().appendInstant().toFormatter(ResolverStyle.STRICT);
  DateTimeFormatter.ISO_OFFSET_DATE_TIME = new DateTimeFormatterBuilder().parseCaseInsensitive().append(DateTimeFormatter.ISO_LOCAL_DATE_TIME).appendOffsetId().toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
  DateTimeFormatter.ISO_ZONED_DATE_TIME = new DateTimeFormatterBuilder().append(DateTimeFormatter.ISO_OFFSET_DATE_TIME).optionalStart().appendLiteral('[').parseCaseSensitive().appendZoneId().appendLiteral(']').toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
  DateTimeFormatter.BASIC_ISO_DATE = new DateTimeFormatterBuilder().appendValue(ChronoField.YEAR, 4, 10, SignStyle.EXCEEDS_PAD).appendValue(ChronoField.MONTH_OF_YEAR, 2).appendValue(ChronoField.DAY_OF_MONTH, 2).toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
  DateTimeFormatter.ISO_OFFSET_DATE = new DateTimeFormatterBuilder().parseCaseInsensitive().append(DateTimeFormatter.ISO_LOCAL_DATE).appendOffsetId().toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
  DateTimeFormatter.ISO_OFFSET_TIME = new DateTimeFormatterBuilder().parseCaseInsensitive().append(DateTimeFormatter.ISO_LOCAL_TIME).appendOffsetId().toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
  DateTimeFormatter.ISO_ORDINAL_DATE = new DateTimeFormatterBuilder().appendValue(ChronoField.YEAR, 4, 10, SignStyle.EXCEEDS_PAD).appendLiteral('-').appendValue(ChronoField.DAY_OF_YEAR).toFormatter(ResolverStyle.STRICT);
  DateTimeFormatter.ISO_WEEK_DATE = new DateTimeFormatterBuilder().appendValue(ChronoField.YEAR, 4, 10, SignStyle.EXCEEDS_PAD).appendLiteral('-W').appendValue(ChronoField.ALIGNED_WEEK_OF_YEAR).appendLiteral('-').appendValue(ChronoField.DAY_OF_WEEK).toFormatter(ResolverStyle.STRICT);
  DateTimeFormatter.ISO_DATE = new DateTimeFormatterBuilder().parseCaseInsensitive().append(DateTimeFormatter.ISO_LOCAL_DATE).optionalStart().appendOffsetId().optionalEnd().toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
  DateTimeFormatter.ISO_TIME = new DateTimeFormatterBuilder().parseCaseInsensitive().append(DateTimeFormatter.ISO_LOCAL_TIME).optionalStart().appendOffsetId().optionalEnd().toFormatter(ResolverStyle.STRICT);
  DateTimeFormatter.ISO_DATE_TIME = new DateTimeFormatterBuilder().append(DateTimeFormatter.ISO_LOCAL_DATE_TIME).optionalStart().appendOffsetId().optionalEnd().toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
  DateTimeFormatter.PARSED_EXCESS_DAYS = createTemporalQuery('PARSED_EXCESS_DAYS', function (temporal) {
    if (temporal instanceof DateTimeBuilder) {
      return temporal.excessDays;
    } else {
      return Period.ZERO;
    }
  });
  DateTimeFormatter.PARSED_LEAP_SECOND = createTemporalQuery('PARSED_LEAP_SECOND', function (temporal) {
    if (temporal instanceof DateTimeBuilder) {
      return temporal.leapSecond;
    } else {
      return false;
    }
  });
}

var MonthDay = function (_TemporalAccessor) {
  _inheritsLoose(MonthDay, _TemporalAccessor);

  MonthDay.now = function now(zoneIdOrClock) {
    if (arguments.length === 0) {
      return MonthDay.now0();
    } else if (arguments.length === 1 && zoneIdOrClock instanceof ZoneId) {
      return MonthDay.nowZoneId(zoneIdOrClock);
    } else {
      return MonthDay.nowClock(zoneIdOrClock);
    }
  };

  MonthDay.now0 = function now0() {
    return this.nowClock(Clock.systemDefaultZone());
  };

  MonthDay.nowZoneId = function nowZoneId(zone) {
    requireNonNull(zone, 'zone');
    return this.nowClock(Clock.system(zone));
  };

  MonthDay.nowClock = function nowClock(clock) {
    requireNonNull(clock, 'clock');
    var now = LocalDate.now(clock);
    return MonthDay.of(now.month(), now.dayOfMonth());
  };

  MonthDay.of = function of(monthOrNumber, number) {
    if (arguments.length === 2 && monthOrNumber instanceof Month) {
      return MonthDay.ofMonthNumber(monthOrNumber, number);
    } else {
      return MonthDay.ofNumberNumber(monthOrNumber, number);
    }
  };

  MonthDay.ofMonthNumber = function ofMonthNumber(month, dayOfMonth) {
    requireNonNull(month, 'month');
    ChronoField.DAY_OF_MONTH.checkValidValue(dayOfMonth);

    if (dayOfMonth > month.maxLength()) {
      throw new DateTimeException("Illegal value for DayOfMonth field, value " + dayOfMonth + " is not valid for month " + month.toString());
    }

    return new MonthDay(month.value(), dayOfMonth);
  };

  MonthDay.ofNumberNumber = function ofNumberNumber(month, dayOfMonth) {
    requireNonNull(month, 'month');
    requireNonNull(dayOfMonth, 'dayOfMonth');
    return MonthDay.of(Month.of(month), dayOfMonth);
  };

  MonthDay.from = function from(temporal) {
    requireNonNull(temporal, 'temporal');
    requireInstance(temporal, TemporalAccessor, 'temporal');

    if (temporal instanceof MonthDay) {
      return temporal;
    }

    try {
      return MonthDay.of(temporal.get(ChronoField.MONTH_OF_YEAR), temporal.get(ChronoField.DAY_OF_MONTH));
    } catch (ex) {
      throw new DateTimeException("Unable to obtain MonthDay from TemporalAccessor: " + temporal + ", type " + (temporal && temporal.constructor != null ? temporal.constructor.name : ''));
    }
  };

  MonthDay.parse = function parse(text, formatter) {
    if (arguments.length === 1) {
      return MonthDay.parseString(text);
    } else {
      return MonthDay.parseStringFormatter(text, formatter);
    }
  };

  MonthDay.parseString = function parseString(text) {
    return MonthDay.parseStringFormatter(text, PARSER$2);
  };

  MonthDay.parseStringFormatter = function parseStringFormatter(text, formatter) {
    requireNonNull(text, 'text');
    requireNonNull(formatter, 'formatter');
    requireInstance(formatter, DateTimeFormatter, 'formatter');
    return formatter.parse(text, MonthDay.FROM);
  };

  function MonthDay(month, dayOfMonth) {
    var _this;

    _this = _TemporalAccessor.call(this) || this;
    _this._month = MathUtil.safeToInt(month);
    _this._day = MathUtil.safeToInt(dayOfMonth);
    return _this;
  }

  var _proto = MonthDay.prototype;

  _proto.monthValue = function monthValue() {
    return this._month;
  };

  _proto.month = function month() {
    return Month.of(this._month);
  };

  _proto.dayOfMonth = function dayOfMonth() {
    return this._day;
  };

  _proto.isSupported = function isSupported(field) {
    if (field instanceof ChronoField) {
      return field === ChronoField.MONTH_OF_YEAR || field === ChronoField.DAY_OF_MONTH;
    }

    return field != null && field.isSupportedBy(this);
  };

  _proto.range = function range(field) {
    if (field === ChronoField.MONTH_OF_YEAR) {
      return field.range();
    } else if (field === ChronoField.DAY_OF_MONTH) {
      return ValueRange.of(1, this.month().minLength(), this.month().maxLength());
    }

    return _TemporalAccessor.prototype.range.call(this, field);
  };

  _proto.get = function get(field) {
    return this.range(field).checkValidIntValue(this.getLong(field), field);
  };

  _proto.getLong = function getLong(field) {
    requireNonNull(field, 'field');

    if (field instanceof ChronoField) {
      switch (field) {
        case ChronoField.DAY_OF_MONTH:
          return this._day;

        case ChronoField.MONTH_OF_YEAR:
          return this._month;
      }

      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.getFrom(this);
  };

  _proto.isValidYear = function isValidYear(year) {
    return (this._day === 29 && this._month === 2 && Year.isLeap(year) === false) === false;
  };

  _proto.withMonth = function withMonth(month) {
    return this.with(Month.of(month));
  };

  _proto.with = function _with(month) {
    requireNonNull(month, 'month');

    if (month.value() === this._month) {
      return this;
    }

    var day = Math.min(this._day, month.maxLength());
    return new MonthDay(month.value(), day);
  };

  _proto.withDayOfMonth = function withDayOfMonth(dayOfMonth) {
    if (dayOfMonth === this._day) {
      return this;
    }

    return MonthDay.of(this._month, dayOfMonth);
  };

  _proto.query = function query(_query) {
    requireNonNull(_query, 'query');
    requireInstance(_query, TemporalQuery, 'query');

    if (_query === TemporalQueries.chronology()) {
      return IsoChronology.INSTANCE;
    }

    return _TemporalAccessor.prototype.query.call(this, _query);
  };

  _proto.adjustInto = function adjustInto(temporal) {
    requireNonNull(temporal, 'temporal');
    temporal = temporal.with(ChronoField.MONTH_OF_YEAR, this._month);
    return temporal.with(ChronoField.DAY_OF_MONTH, Math.min(temporal.range(ChronoField.DAY_OF_MONTH).maximum(), this._day));
  };

  _proto.atYear = function atYear(year) {
    return LocalDate.of(year, this._month, this.isValidYear(year) ? this._day : 28);
  };

  _proto.compareTo = function compareTo(other) {
    requireNonNull(other, 'other');
    requireInstance(other, MonthDay, 'other');
    var cmp = this._month - other.monthValue();

    if (cmp === 0) {
      cmp = this._day - other.dayOfMonth();
    }

    return cmp;
  };

  _proto.isAfter = function isAfter(other) {
    requireNonNull(other, 'other');
    requireInstance(other, MonthDay, 'other');
    return this.compareTo(other) > 0;
  };

  _proto.isBefore = function isBefore(other) {
    requireNonNull(other, 'other');
    requireInstance(other, MonthDay, 'other');
    return this.compareTo(other) < 0;
  };

  _proto.equals = function equals(obj) {
    if (this === obj) {
      return true;
    }

    if (obj instanceof MonthDay) {
      var other = obj;
      return this.monthValue() === other.monthValue() && this.dayOfMonth() === other.dayOfMonth();
    }

    return false;
  };

  _proto.toString = function toString() {
    return "--" + (this._month < 10 ? '0' : '') + this._month + (this._day < 10 ? '-0' : '-') + this._day;
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  _proto.format = function format(formatter) {
    requireNonNull(formatter, 'formatter');
    requireInstance(formatter, DateTimeFormatter, 'formatter');
    return formatter.format(this);
  };

  return MonthDay;
}(TemporalAccessor);
var PARSER$2;
function _init$c() {
  PARSER$2 = new DateTimeFormatterBuilder().appendLiteral('--').appendValue(ChronoField.MONTH_OF_YEAR, 2).appendLiteral('-').appendValue(ChronoField.DAY_OF_MONTH, 2).toFormatter();
  MonthDay.FROM = createTemporalQuery('MonthDay.FROM', function (temporal) {
    return MonthDay.from(temporal);
  });
}

var YearMonth = function (_Temporal) {
  _inheritsLoose(YearMonth, _Temporal);

  YearMonth.now = function now(zoneIdOrClock) {
    if (arguments.length === 0) {
      return YearMonth.now0();
    } else if (arguments.length === 1 && zoneIdOrClock instanceof ZoneId) {
      return YearMonth.nowZoneId(zoneIdOrClock);
    } else {
      return YearMonth.nowClock(zoneIdOrClock);
    }
  };

  YearMonth.now0 = function now0() {
    return YearMonth.nowClock(Clock.systemDefaultZone());
  };

  YearMonth.nowZoneId = function nowZoneId(zone) {
    return YearMonth.nowClock(Clock.system(zone));
  };

  YearMonth.nowClock = function nowClock(clock) {
    var now = LocalDate.now(clock);
    return YearMonth.of(now.year(), now.month());
  };

  YearMonth.of = function of(year, monthOrNumber) {
    if (arguments.length === 2 && monthOrNumber instanceof Month) {
      return YearMonth.ofNumberMonth(year, monthOrNumber);
    } else {
      return YearMonth.ofNumberNumber(year, monthOrNumber);
    }
  };

  YearMonth.ofNumberMonth = function ofNumberMonth(year, month) {
    requireNonNull(month, 'month');
    requireInstance(month, Month, 'month');
    return YearMonth.ofNumberNumber(year, month.value());
  };

  YearMonth.ofNumberNumber = function ofNumberNumber(year, month) {
    requireNonNull(year, 'year');
    requireNonNull(month, 'month');
    ChronoField.YEAR.checkValidValue(year);
    ChronoField.MONTH_OF_YEAR.checkValidValue(month);
    return new YearMonth(year, month);
  };

  YearMonth.from = function from(temporal) {
    requireNonNull(temporal, 'temporal');

    if (temporal instanceof YearMonth) {
      return temporal;
    }

    try {
      return YearMonth.of(temporal.get(ChronoField.YEAR), temporal.get(ChronoField.MONTH_OF_YEAR));
    } catch (ex) {
      throw new DateTimeException("Unable to obtain YearMonth from TemporalAccessor: " + temporal + ", type " + (temporal && temporal.constructor != null ? temporal.constructor.name : ''));
    }
  };

  YearMonth.parse = function parse(text, formatter) {
    if (arguments.length === 1) {
      return YearMonth.parseString(text);
    } else {
      return YearMonth.parseStringFormatter(text, formatter);
    }
  };

  YearMonth.parseString = function parseString(text) {
    return YearMonth.parseStringFormatter(text, PARSER$1);
  };

  YearMonth.parseStringFormatter = function parseStringFormatter(text, formatter) {
    requireNonNull(formatter, 'formatter');
    return formatter.parse(text, YearMonth.FROM);
  };

  function YearMonth(year, month) {
    var _this;

    _this = _Temporal.call(this) || this;
    _this._year = MathUtil.safeToInt(year);
    _this._month = MathUtil.safeToInt(month);
    return _this;
  }

  var _proto = YearMonth.prototype;

  _proto.isSupported = function isSupported(fieldOrUnit) {
    if (arguments.length === 1 && fieldOrUnit instanceof TemporalField) {
      return this.isSupportedField(fieldOrUnit);
    } else {
      return this.isSupportedUnit(fieldOrUnit);
    }
  };

  _proto.isSupportedField = function isSupportedField(field) {
    if (field instanceof ChronoField) {
      return field === ChronoField.YEAR || field === ChronoField.MONTH_OF_YEAR || field === ChronoField.PROLEPTIC_MONTH || field === ChronoField.YEAR_OF_ERA || field === ChronoField.ERA;
    }

    return field != null && field.isSupportedBy(this);
  };

  _proto.isSupportedUnit = function isSupportedUnit(unit) {
    if (unit instanceof ChronoUnit) {
      return unit === ChronoUnit.MONTHS || unit === ChronoUnit.YEARS || unit === ChronoUnit.DECADES || unit === ChronoUnit.CENTURIES || unit === ChronoUnit.MILLENNIA || unit === ChronoUnit.ERAS;
    }

    return unit != null && unit.isSupportedBy(this);
  };

  _proto.range = function range(field) {
    if (field === ChronoField.YEAR_OF_ERA) {
      return this.year() <= 0 ? ValueRange.of(1, Year.MAX_VALUE + 1) : ValueRange.of(1, Year.MAX_VALUE);
    }

    return _Temporal.prototype.range.call(this, field);
  };

  _proto.get = function get(field) {
    requireNonNull(field, 'field');
    requireInstance(field, TemporalField, 'field');
    return this.range(field).checkValidIntValue(this.getLong(field), field);
  };

  _proto.getLong = function getLong(field) {
    requireNonNull(field, 'field');
    requireInstance(field, TemporalField, 'field');

    if (field instanceof ChronoField) {
      switch (field) {
        case ChronoField.MONTH_OF_YEAR:
          return this._month;

        case ChronoField.PROLEPTIC_MONTH:
          return this._getProlepticMonth();

        case ChronoField.YEAR_OF_ERA:
          return this._year < 1 ? 1 - this._year : this._year;

        case ChronoField.YEAR:
          return this._year;

        case ChronoField.ERA:
          return this._year < 1 ? 0 : 1;
      }

      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.getFrom(this);
  };

  _proto._getProlepticMonth = function _getProlepticMonth() {
    return MathUtil.safeAdd(MathUtil.safeMultiply(this._year, 12), this._month - 1);
  };

  _proto.year = function year() {
    return this._year;
  };

  _proto.monthValue = function monthValue() {
    return this._month;
  };

  _proto.month = function month() {
    return Month.of(this._month);
  };

  _proto.isLeapYear = function isLeapYear() {
    return IsoChronology.isLeapYear(this._year);
  };

  _proto.isValidDay = function isValidDay(dayOfMonth) {
    return dayOfMonth >= 1 && dayOfMonth <= this.lengthOfMonth();
  };

  _proto.lengthOfMonth = function lengthOfMonth() {
    return this.month().length(this.isLeapYear());
  };

  _proto.lengthOfYear = function lengthOfYear() {
    return this.isLeapYear() ? 366 : 365;
  };

  _proto.with = function _with(adjusterOrField, value) {
    if (arguments.length === 1) {
      return this._withAdjuster(adjusterOrField);
    } else {
      return this._withField(adjusterOrField, value);
    }
  };

  _proto._withField = function _withField(field, newValue) {
    requireNonNull(field, 'field');
    requireInstance(field, TemporalField, 'field');

    if (field instanceof ChronoField) {
      var f = field;
      f.checkValidValue(newValue);

      switch (f) {
        case ChronoField.MONTH_OF_YEAR:
          return this.withMonth(newValue);

        case ChronoField.PROLEPTIC_MONTH:
          return this.plusMonths(newValue - this.getLong(ChronoField.PROLEPTIC_MONTH));

        case ChronoField.YEAR_OF_ERA:
          return this.withYear(this._year < 1 ? 1 - newValue : newValue);

        case ChronoField.YEAR:
          return this.withYear(newValue);

        case ChronoField.ERA:
          return this.getLong(ChronoField.ERA) === newValue ? this : this.withYear(1 - this._year);
      }

      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.adjustInto(this, newValue);
  };

  _proto.withYear = function withYear(year) {
    ChronoField.YEAR.checkValidValue(year);
    return new YearMonth(year, this._month);
  };

  _proto.withMonth = function withMonth(month) {
    ChronoField.MONTH_OF_YEAR.checkValidValue(month);
    return new YearMonth(this._year, month);
  };

  _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
    requireNonNull(unit, 'unit');
    requireInstance(unit, TemporalUnit, 'unit');

    if (unit instanceof ChronoUnit) {
      switch (unit) {
        case ChronoUnit.MONTHS:
          return this.plusMonths(amountToAdd);

        case ChronoUnit.YEARS:
          return this.plusYears(amountToAdd);

        case ChronoUnit.DECADES:
          return this.plusYears(MathUtil.safeMultiply(amountToAdd, 10));

        case ChronoUnit.CENTURIES:
          return this.plusYears(MathUtil.safeMultiply(amountToAdd, 100));

        case ChronoUnit.MILLENNIA:
          return this.plusYears(MathUtil.safeMultiply(amountToAdd, 1000));

        case ChronoUnit.ERAS:
          return this.with(ChronoField.ERA, MathUtil.safeAdd(this.getLong(ChronoField.ERA), amountToAdd));
      }

      throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
    }

    return unit.addTo(this, amountToAdd);
  };

  _proto.plusYears = function plusYears(yearsToAdd) {
    if (yearsToAdd === 0) {
      return this;
    }

    var newYear = ChronoField.YEAR.checkValidIntValue(this._year + yearsToAdd);
    return this.withYear(newYear);
  };

  _proto.plusMonths = function plusMonths(monthsToAdd) {
    if (monthsToAdd === 0) {
      return this;
    }

    var monthCount = this._year * 12 + (this._month - 1);
    var calcMonths = monthCount + monthsToAdd;
    var newYear = ChronoField.YEAR.checkValidIntValue(MathUtil.floorDiv(calcMonths, 12));
    var newMonth = MathUtil.floorMod(calcMonths, 12) + 1;
    return new YearMonth(newYear, newMonth);
  };

  _proto.minusYears = function minusYears(yearsToSubtract) {
    return yearsToSubtract === MathUtil.MIN_SAFE_INTEGER ? this.plusYears(MathUtil.MIN_SAFE_INTEGER).plusYears(1) : this.plusYears(-yearsToSubtract);
  };

  _proto.minusMonths = function minusMonths(monthsToSubtract) {
    return monthsToSubtract === MathUtil.MIN_SAFE_INTEGER ? this.plusMonths(Math.MAX_SAFE_INTEGER).plusMonths(1) : this.plusMonths(-monthsToSubtract);
  };

  _proto.query = function query(_query) {
    requireNonNull(_query, 'query');
    requireInstance(_query, TemporalQuery, 'query');

    if (_query === TemporalQueries.chronology()) {
      return IsoChronology.INSTANCE;
    } else if (_query === TemporalQueries.precision()) {
      return ChronoUnit.MONTHS;
    } else if (_query === TemporalQueries.localDate() || _query === TemporalQueries.localTime() || _query === TemporalQueries.zone() || _query === TemporalQueries.zoneId() || _query === TemporalQueries.offset()) {
      return null;
    }

    return _Temporal.prototype.query.call(this, _query);
  };

  _proto.adjustInto = function adjustInto(temporal) {
    requireNonNull(temporal, 'temporal');
    requireInstance(temporal, Temporal, 'temporal');
    return temporal.with(ChronoField.PROLEPTIC_MONTH, this._getProlepticMonth());
  };

  _proto.until = function until(endExclusive, unit) {
    requireNonNull(endExclusive, 'endExclusive');
    requireNonNull(unit, 'unit');
    requireInstance(endExclusive, Temporal, 'endExclusive');
    requireInstance(unit, TemporalUnit, 'unit');
    var end = YearMonth.from(endExclusive);

    if (unit instanceof ChronoUnit) {
      var monthsUntil = end._getProlepticMonth() - this._getProlepticMonth();

      switch (unit) {
        case ChronoUnit.MONTHS:
          return monthsUntil;

        case ChronoUnit.YEARS:
          return monthsUntil / 12;

        case ChronoUnit.DECADES:
          return monthsUntil / 120;

        case ChronoUnit.CENTURIES:
          return monthsUntil / 1200;

        case ChronoUnit.MILLENNIA:
          return monthsUntil / 12000;

        case ChronoUnit.ERAS:
          return end.getLong(ChronoField.ERA) - this.getLong(ChronoField.ERA);
      }

      throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
    }

    return unit.between(this, end);
  };

  _proto.atDay = function atDay(dayOfMonth) {
    return LocalDate.of(this._year, this._month, dayOfMonth);
  };

  _proto.atEndOfMonth = function atEndOfMonth() {
    return LocalDate.of(this._year, this._month, this.lengthOfMonth());
  };

  _proto.compareTo = function compareTo(other) {
    requireNonNull(other, 'other');
    requireInstance(other, YearMonth, 'other');
    var cmp = this._year - other.year();

    if (cmp === 0) {
      cmp = this._month - other.monthValue();
    }

    return cmp;
  };

  _proto.isAfter = function isAfter(other) {
    return this.compareTo(other) > 0;
  };

  _proto.isBefore = function isBefore(other) {
    return this.compareTo(other) < 0;
  };

  _proto.equals = function equals(obj) {
    if (this === obj) {
      return true;
    }

    if (obj instanceof YearMonth) {
      var other = obj;
      return this.year() === other.year() && this.monthValue() === other.monthValue();
    }

    return false;
  };

  _proto.toString = function toString() {
    return PARSER$1.format(this);
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  _proto.format = function format(formatter) {
    requireNonNull(formatter, 'formatter');
    return formatter.format(this);
  };

  return YearMonth;
}(Temporal);
var PARSER$1;
function _init$b() {
  PARSER$1 = new DateTimeFormatterBuilder().appendValue(ChronoField.YEAR, 4, 10, SignStyle.EXCEEDS_PAD).appendLiteral('-').appendValue(ChronoField.MONTH_OF_YEAR, 2).toFormatter();
  YearMonth.FROM = createTemporalQuery('YearMonth.FROM', function (temporal) {
    return YearMonth.from(temporal);
  });
}

var Year = function (_Temporal) {
  _inheritsLoose(Year, _Temporal);

  function Year(value) {
    var _this;

    _this = _Temporal.call(this) || this;
    _this._year = MathUtil.safeToInt(value);
    return _this;
  }

  var _proto = Year.prototype;

  _proto.value = function value() {
    return this._year;
  };

  Year.now = function now(zoneIdOrClock) {
    if (zoneIdOrClock === void 0) {
      zoneIdOrClock = undefined;
    }

    if (zoneIdOrClock === undefined) {
      return Year.now0();
    } else if (zoneIdOrClock instanceof ZoneId) {
      return Year.nowZoneId(zoneIdOrClock);
    } else {
      return Year.nowClock(zoneIdOrClock);
    }
  };

  Year.now0 = function now0() {
    return Year.nowClock(Clock.systemDefaultZone());
  };

  Year.nowZoneId = function nowZoneId(zone) {
    requireNonNull(zone, 'zone');
    requireInstance(zone, ZoneId, 'zone');
    return Year.nowClock(Clock.system(zone));
  };

  Year.nowClock = function nowClock(clock) {
    requireNonNull(clock, 'clock');
    requireInstance(clock, Clock, 'clock');
    var now = LocalDate.now(clock);
    return Year.of(now.year());
  };

  Year.of = function of(isoYear) {
    requireNonNull(isoYear, 'isoYear');
    ChronoField.YEAR.checkValidValue(isoYear);
    return new Year(isoYear);
  };

  Year.from = function from(temporal) {
    requireNonNull(temporal, 'temporal');
    requireInstance(temporal, TemporalAccessor, 'temporal');

    if (temporal instanceof Year) {
      return temporal;
    }

    try {
      return Year.of(temporal.get(ChronoField.YEAR));
    } catch (ex) {
      throw new DateTimeException("Unable to obtain Year from TemporalAccessor: " + temporal + ", type " + (temporal && temporal.constructor != null ? temporal.constructor.name : ''));
    }
  };

  Year.parse = function parse(text, formatter) {
    if (arguments.length <= 1) {
      return Year.parseText(text);
    } else {
      return Year.parseTextFormatter(text, formatter);
    }
  };

  Year.parseText = function parseText(text) {
    requireNonNull(text, 'text');
    return Year.parse(text, PARSER);
  };

  Year.parseTextFormatter = function parseTextFormatter(text, formatter) {
    if (formatter === void 0) {
      formatter = PARSER;
    }

    requireNonNull(text, 'text');
    requireNonNull(formatter, 'formatter');
    requireInstance(formatter, DateTimeFormatter, 'formatter');
    return formatter.parse(text, Year.FROM);
  };

  Year.isLeap = function isLeap(year) {
    return MathUtil.intMod(year, 4) === 0 && (MathUtil.intMod(year, 100) !== 0 || MathUtil.intMod(year, 400) === 0);
  };

  _proto.isSupported = function isSupported(fieldOrUnit) {
    if (arguments.length === 1 && fieldOrUnit instanceof TemporalField) {
      return this.isSupportedField(fieldOrUnit);
    } else {
      return this.isSupportedUnit(fieldOrUnit);
    }
  };

  _proto.isSupportedField = function isSupportedField(field) {
    if (field instanceof ChronoField) {
      return field === ChronoField.YEAR || field === ChronoField.YEAR_OF_ERA || field === ChronoField.ERA;
    }

    return field != null && field.isSupportedBy(this);
  };

  _proto.isSupportedUnit = function isSupportedUnit(unit) {
    if (unit instanceof ChronoUnit) {
      return unit === ChronoUnit.YEARS || unit === ChronoUnit.DECADES || unit === ChronoUnit.CENTURIES || unit === ChronoUnit.MILLENNIA || unit === ChronoUnit.ERAS;
    }

    return unit != null && unit.isSupportedBy(this);
  };

  _proto.range = function range(field) {
    if (this.isSupported(field)) {
      return field.range();
    } else if (field instanceof ChronoField) {
      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return _Temporal.prototype.range.call(this, field);
  };

  _proto.get = function get(field) {
    return this.range(field).checkValidIntValue(this.getLong(field), field);
  };

  _proto.getLong = function getLong(field) {
    requireNonNull(field, 'field');

    if (field instanceof ChronoField) {
      switch (field) {
        case ChronoField.YEAR_OF_ERA:
          return this._year < 1 ? 1 - this._year : this._year;

        case ChronoField.YEAR:
          return this._year;

        case ChronoField.ERA:
          return this._year < 1 ? 0 : 1;
      }

      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.getFrom(this);
  };

  _proto.isLeap = function isLeap() {
    return Year.isLeap(this._year);
  };

  _proto._withField = function _withField(field, newValue) {
    requireNonNull(field, 'field');
    requireInstance(field, TemporalField, 'field');

    if (field instanceof ChronoField) {
      field.checkValidValue(newValue);

      switch (field) {
        case ChronoField.YEAR_OF_ERA:
          return Year.of(this._year < 1 ? 1 - newValue : newValue);

        case ChronoField.YEAR:
          return Year.of(newValue);

        case ChronoField.ERA:
          return this.getLong(ChronoField.ERA) === newValue ? this : Year.of(1 - this._year);
      }

      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.adjustInto(this, newValue);
  };

  _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
    requireNonNull(amountToAdd, 'amountToAdd');
    requireNonNull(unit, 'unit');
    requireInstance(unit, TemporalUnit, 'unit');

    if (unit instanceof ChronoUnit) {
      switch (unit) {
        case ChronoUnit.YEARS:
          return this.plusYears(amountToAdd);

        case ChronoUnit.DECADES:
          return this.plusYears(MathUtil.safeMultiply(amountToAdd, 10));

        case ChronoUnit.CENTURIES:
          return this.plusYears(MathUtil.safeMultiply(amountToAdd, 100));

        case ChronoUnit.MILLENNIA:
          return this.plusYears(MathUtil.safeMultiply(amountToAdd, 1000));

        case ChronoUnit.ERAS:
          return this.with(ChronoField.ERA, MathUtil.safeAdd(this.getLong(ChronoField.ERA), amountToAdd));
      }

      throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
    }

    return unit.addTo(this, amountToAdd);
  };

  _proto.plusYears = function plusYears(yearsToAdd) {
    if (yearsToAdd === 0) {
      return this;
    }

    return Year.of(ChronoField.YEAR.checkValidIntValue(MathUtil.safeAdd(this._year, yearsToAdd)));
  };

  _proto.minusYears = function minusYears(yearsToSubtract) {
    return yearsToSubtract === MathUtil.MIN_SAFE_INTEGER ? this.plusYears(MathUtil.MAX_SAFE_INTEGER).plusYears(1) : this.plusYears(-yearsToSubtract);
  };

  _proto.adjustInto = function adjustInto(temporal) {
    requireNonNull(temporal, 'temporal');
    return temporal.with(ChronoField.YEAR, this._year);
  };

  _proto.isValidMonthDay = function isValidMonthDay(monthDay) {
    return monthDay != null && monthDay.isValidYear(this._year);
  };

  _proto.length = function length() {
    return this.isLeap() ? 366 : 365;
  };

  _proto.atDay = function atDay(dayOfYear) {
    return LocalDate.ofYearDay(this._year, dayOfYear);
  };

  _proto.atMonth = function atMonth(monthOrNumber) {
    if (arguments.length === 1 && monthOrNumber instanceof Month) {
      return this.atMonthMonth(monthOrNumber);
    } else {
      return this.atMonthNumber(monthOrNumber);
    }
  };

  _proto.atMonthMonth = function atMonthMonth(month) {
    requireNonNull(month, 'month');
    requireInstance(month, Month, 'month');
    return YearMonth.of(this._year, month);
  };

  _proto.atMonthNumber = function atMonthNumber(month) {
    requireNonNull(month, 'month');
    return YearMonth.of(this._year, month);
  };

  _proto.atMonthDay = function atMonthDay(monthDay) {
    requireNonNull(monthDay, 'monthDay');
    requireInstance(monthDay, MonthDay, 'monthDay');
    return monthDay.atYear(this._year);
  };

  _proto.query = function query(_query) {
    requireNonNull(_query, 'query()');
    requireInstance(_query, TemporalQuery, 'query()');

    if (_query === TemporalQueries.chronology()) {
      return IsoChronology.INSTANCE;
    } else if (_query === TemporalQueries.precision()) {
      return ChronoUnit.YEARS;
    } else if (_query === TemporalQueries.localDate() || _query === TemporalQueries.localTime() || _query === TemporalQueries.zone() || _query === TemporalQueries.zoneId() || _query === TemporalQueries.offset()) {
      return null;
    }

    return _Temporal.prototype.query.call(this, _query);
  };

  _proto.compareTo = function compareTo(other) {
    requireNonNull(other, 'other');
    requireInstance(other, Year, 'other');
    return this._year - other._year;
  };

  _proto.isAfter = function isAfter(other) {
    requireNonNull(other, 'other');
    requireInstance(other, Year, 'other');
    return this._year > other._year;
  };

  _proto.isBefore = function isBefore(other) {
    requireNonNull(other, 'other');
    requireInstance(other, Year, 'other');
    return this._year < other._year;
  };

  _proto.format = function format(formatter) {
    requireNonNull(formatter, 'formatter');
    requireInstance(formatter, DateTimeFormatter, 'formatter');
    return formatter.format(this);
  };

  _proto.equals = function equals(other) {
    if (this === other) {
      return true;
    }

    if (other instanceof Year) {
      return this.value() === other.value();
    }

    return false;
  };

  _proto.toString = function toString() {
    return "" + this._year;
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  _proto.until = function until(endExclusive, unit) {
    var end = Year.from(endExclusive);

    if (unit instanceof ChronoUnit) {
      var yearsUntil = end.value() - this.value();

      switch (unit) {
        case ChronoUnit.YEARS:
          return yearsUntil;

        case ChronoUnit.DECADES:
          return MathUtil.intDiv(yearsUntil, 10);

        case ChronoUnit.CENTURIES:
          return MathUtil.intDiv(yearsUntil, 100);

        case ChronoUnit.MILLENNIA:
          return MathUtil.intDiv(yearsUntil, 1000);

        case ChronoUnit.ERAS:
          return end.getLong(ChronoField.ERA) - this.getLong(ChronoField.ERA);
      }

      throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
    }

    return unit.between(this, end);
  };

  return Year;
}(Temporal);
var PARSER;
function _init$a() {
  Year.MIN_VALUE = YearConstants.MIN_VALUE;
  Year.MAX_VALUE = YearConstants.MAX_VALUE;
  PARSER = new DateTimeFormatterBuilder().appendValue(ChronoField.YEAR, 4, 10, SignStyle.EXCEEDS_PAD).toFormatter();
  Year.FROM = createTemporalQuery('Year.FROM', function (temporal) {
    return Year.from(temporal);
  });
}

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var TemporalAdjuster = function () {
  function TemporalAdjuster() {}

  var _proto = TemporalAdjuster.prototype;

  _proto.adjustInto = function adjustInto(temporal) {
    abstractMethodFail('adjustInto');
  };

  return TemporalAdjuster;
}();

var TemporalAdjusters = function () {
  function TemporalAdjusters() {}

  TemporalAdjusters.firstDayOfMonth = function firstDayOfMonth() {
    return Impl.FIRST_DAY_OF_MONTH;
  };

  TemporalAdjusters.lastDayOfMonth = function lastDayOfMonth() {
    return Impl.LAST_DAY_OF_MONTH;
  };

  TemporalAdjusters.firstDayOfNextMonth = function firstDayOfNextMonth() {
    return Impl.FIRST_DAY_OF_NEXT_MONTH;
  };

  TemporalAdjusters.firstDayOfYear = function firstDayOfYear() {
    return Impl.FIRST_DAY_OF_YEAR;
  };

  TemporalAdjusters.lastDayOfYear = function lastDayOfYear() {
    return Impl.LAST_DAY_OF_YEAR;
  };

  TemporalAdjusters.firstDayOfNextYear = function firstDayOfNextYear() {
    return Impl.FIRST_DAY_OF_NEXT_YEAR;
  };

  TemporalAdjusters.firstInMonth = function firstInMonth(dayOfWeek) {
    requireNonNull(dayOfWeek, 'dayOfWeek');
    return new DayOfWeekInMonth(1, dayOfWeek);
  };

  TemporalAdjusters.lastInMonth = function lastInMonth(dayOfWeek) {
    requireNonNull(dayOfWeek, 'dayOfWeek');
    return new DayOfWeekInMonth(-1, dayOfWeek);
  };

  TemporalAdjusters.dayOfWeekInMonth = function dayOfWeekInMonth(ordinal, dayOfWeek) {
    requireNonNull(dayOfWeek, 'dayOfWeek');
    return new DayOfWeekInMonth(ordinal, dayOfWeek);
  };

  TemporalAdjusters.next = function next(dayOfWeek) {
    return new RelativeDayOfWeek(2, dayOfWeek);
  };

  TemporalAdjusters.nextOrSame = function nextOrSame(dayOfWeek) {
    return new RelativeDayOfWeek(0, dayOfWeek);
  };

  TemporalAdjusters.previous = function previous(dayOfWeek) {
    return new RelativeDayOfWeek(3, dayOfWeek);
  };

  TemporalAdjusters.previousOrSame = function previousOrSame(dayOfWeek) {
    return new RelativeDayOfWeek(1, dayOfWeek);
  };

  return TemporalAdjusters;
}();

var Impl = function (_TemporalAdjuster) {
  _inheritsLoose(Impl, _TemporalAdjuster);

  function Impl(ordinal) {
    var _this;

    _this = _TemporalAdjuster.call(this) || this;
    _this._ordinal = ordinal;
    return _this;
  }

  var _proto = Impl.prototype;

  _proto.adjustInto = function adjustInto(temporal) {
    switch (this._ordinal) {
      case 0:
        return temporal.with(ChronoField.DAY_OF_MONTH, 1);

      case 1:
        return temporal.with(ChronoField.DAY_OF_MONTH, temporal.range(ChronoField.DAY_OF_MONTH).maximum());

      case 2:
        return temporal.with(ChronoField.DAY_OF_MONTH, 1).plus(1, ChronoUnit.MONTHS);

      case 3:
        return temporal.with(ChronoField.DAY_OF_YEAR, 1);

      case 4:
        return temporal.with(ChronoField.DAY_OF_YEAR, temporal.range(ChronoField.DAY_OF_YEAR).maximum());

      case 5:
        return temporal.with(ChronoField.DAY_OF_YEAR, 1).plus(1, ChronoUnit.YEARS);
    }

    throw new IllegalStateException('Unreachable');
  };

  return Impl;
}(TemporalAdjuster);

Impl.FIRST_DAY_OF_MONTH = new Impl(0);
Impl.LAST_DAY_OF_MONTH = new Impl(1);
Impl.FIRST_DAY_OF_NEXT_MONTH = new Impl(2);
Impl.FIRST_DAY_OF_YEAR = new Impl(3);
Impl.LAST_DAY_OF_YEAR = new Impl(4);
Impl.FIRST_DAY_OF_NEXT_YEAR = new Impl(5);

var DayOfWeekInMonth = function (_TemporalAdjuster2) {
  _inheritsLoose(DayOfWeekInMonth, _TemporalAdjuster2);

  function DayOfWeekInMonth(ordinal, dow) {
    var _this2;

    _this2 = _TemporalAdjuster2.call(this) || this;
    _this2._ordinal = ordinal;
    _this2._dowValue = dow.value();
    return _this2;
  }

  var _proto2 = DayOfWeekInMonth.prototype;

  _proto2.adjustInto = function adjustInto(temporal) {
    if (this._ordinal >= 0) {
      var temp = temporal.with(ChronoField.DAY_OF_MONTH, 1);
      var curDow = temp.get(ChronoField.DAY_OF_WEEK);
      var dowDiff = MathUtil.intMod(this._dowValue - curDow + 7, 7);
      dowDiff += (this._ordinal - 1) * 7;
      return temp.plus(dowDiff, ChronoUnit.DAYS);
    } else {
      var _temp = temporal.with(ChronoField.DAY_OF_MONTH, temporal.range(ChronoField.DAY_OF_MONTH).maximum());

      var _curDow = _temp.get(ChronoField.DAY_OF_WEEK);

      var daysDiff = this._dowValue - _curDow;
      daysDiff = daysDiff === 0 ? 0 : daysDiff > 0 ? daysDiff - 7 : daysDiff;
      daysDiff -= (-this._ordinal - 1) * 7;
      return _temp.plus(daysDiff, ChronoUnit.DAYS);
    }
  };

  return DayOfWeekInMonth;
}(TemporalAdjuster);

var RelativeDayOfWeek = function (_TemporalAdjuster3) {
  _inheritsLoose(RelativeDayOfWeek, _TemporalAdjuster3);

  function RelativeDayOfWeek(relative, dayOfWeek) {
    var _this3;

    _this3 = _TemporalAdjuster3.call(this) || this;
    requireNonNull(dayOfWeek, 'dayOfWeek');
    _this3._relative = relative;
    _this3._dowValue = dayOfWeek.value();
    return _this3;
  }

  var _proto3 = RelativeDayOfWeek.prototype;

  _proto3.adjustInto = function adjustInto(temporal) {
    var calDow = temporal.get(ChronoField.DAY_OF_WEEK);

    if (this._relative < 2 && calDow === this._dowValue) {
      return temporal;
    }

    if ((this._relative & 1) === 0) {
      var daysDiff = calDow - this._dowValue;
      return temporal.plus(daysDiff >= 0 ? 7 - daysDiff : -daysDiff, ChronoUnit.DAYS);
    } else {
      var _daysDiff = this._dowValue - calDow;

      return temporal.minus(_daysDiff >= 0 ? 7 - _daysDiff : -_daysDiff, ChronoUnit.DAYS);
    }
  };

  return RelativeDayOfWeek;
}(TemporalAdjuster);

var IsoChronology = function (_Enum) {
  _inheritsLoose(IsoChronology, _Enum);

  function IsoChronology() {
    return _Enum.apply(this, arguments) || this;
  }

  IsoChronology.isLeapYear = function isLeapYear(prolepticYear) {
    return (prolepticYear & 3) === 0 && (prolepticYear % 100 !== 0 || prolepticYear % 400 === 0);
  };

  var _proto = IsoChronology.prototype;

  _proto._updateResolveMap = function _updateResolveMap(fieldValues, field, value) {
    requireNonNull(fieldValues, 'fieldValues');
    requireNonNull(field, 'field');
    var current = fieldValues.get(field);

    if (current != null && current !== value) {
      throw new DateTimeException("Invalid state, field: " + field + " " + current + " conflicts with " + field + " " + value);
    }

    fieldValues.put(field, value);
  };

  _proto.resolveDate = function resolveDate(fieldValues, resolverStyle) {
    if (fieldValues.containsKey(ChronoField.EPOCH_DAY)) {
      return LocalDate.ofEpochDay(fieldValues.remove(ChronoField.EPOCH_DAY));
    }

    var prolepticMonth = fieldValues.remove(ChronoField.PROLEPTIC_MONTH);

    if (prolepticMonth != null) {
      if (resolverStyle !== ResolverStyle.LENIENT) {
        ChronoField.PROLEPTIC_MONTH.checkValidValue(prolepticMonth);
      }

      this._updateResolveMap(fieldValues, ChronoField.MONTH_OF_YEAR, MathUtil.floorMod(prolepticMonth, 12) + 1);

      this._updateResolveMap(fieldValues, ChronoField.YEAR, MathUtil.floorDiv(prolepticMonth, 12));
    }

    var yoeLong = fieldValues.remove(ChronoField.YEAR_OF_ERA);

    if (yoeLong != null) {
      if (resolverStyle !== ResolverStyle.LENIENT) {
        ChronoField.YEAR_OF_ERA.checkValidValue(yoeLong);
      }

      var era = fieldValues.remove(ChronoField.ERA);

      if (era == null) {
        var year = fieldValues.get(ChronoField.YEAR);

        if (resolverStyle === ResolverStyle.STRICT) {
          if (year != null) {
            this._updateResolveMap(fieldValues, ChronoField.YEAR, year > 0 ? yoeLong : MathUtil.safeSubtract(1, yoeLong));
          } else {
            fieldValues.put(ChronoField.YEAR_OF_ERA, yoeLong);
          }
        } else {
          this._updateResolveMap(fieldValues, ChronoField.YEAR, year == null || year > 0 ? yoeLong : MathUtil.safeSubtract(1, yoeLong));
        }
      } else if (era === 1) {
        this._updateResolveMap(fieldValues, ChronoField.YEAR, yoeLong);
      } else if (era === 0) {
        this._updateResolveMap(fieldValues, ChronoField.YEAR, MathUtil.safeSubtract(1, yoeLong));
      } else {
        throw new DateTimeException("Invalid value for era: " + era);
      }
    } else if (fieldValues.containsKey(ChronoField.ERA)) {
      ChronoField.ERA.checkValidValue(fieldValues.get(ChronoField.ERA));
    }

    if (fieldValues.containsKey(ChronoField.YEAR)) {
      if (fieldValues.containsKey(ChronoField.MONTH_OF_YEAR)) {
        if (fieldValues.containsKey(ChronoField.DAY_OF_MONTH)) {
          var y = ChronoField.YEAR.checkValidIntValue(fieldValues.remove(ChronoField.YEAR));
          var moy = fieldValues.remove(ChronoField.MONTH_OF_YEAR);
          var dom = fieldValues.remove(ChronoField.DAY_OF_MONTH);

          if (resolverStyle === ResolverStyle.LENIENT) {
            var months = moy - 1;
            var days = dom - 1;
            return LocalDate.of(y, 1, 1).plusMonths(months).plusDays(days);
          } else if (resolverStyle === ResolverStyle.SMART) {
            ChronoField.DAY_OF_MONTH.checkValidValue(dom);

            if (moy === 4 || moy === 6 || moy === 9 || moy === 11) {
              dom = Math.min(dom, 30);
            } else if (moy === 2) {
              dom = Math.min(dom, Month.FEBRUARY.length(Year.isLeap(y)));
            }

            return LocalDate.of(y, moy, dom);
          } else {
            return LocalDate.of(y, moy, dom);
          }
        }
      }

      if (fieldValues.containsKey(ChronoField.DAY_OF_YEAR)) {
        var _y = ChronoField.YEAR.checkValidIntValue(fieldValues.remove(ChronoField.YEAR));

        if (resolverStyle === ResolverStyle.LENIENT) {
          var _days = MathUtil.safeSubtract(fieldValues.remove(ChronoField.DAY_OF_YEAR), 1);

          return LocalDate.ofYearDay(_y, 1).plusDays(_days);
        }

        var doy = ChronoField.DAY_OF_YEAR.checkValidIntValue(fieldValues.remove(ChronoField.DAY_OF_YEAR));
        return LocalDate.ofYearDay(_y, doy);
      }

      if (fieldValues.containsKey(ChronoField.ALIGNED_WEEK_OF_YEAR)) {
        if (fieldValues.containsKey(ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR)) {
          var _y2 = ChronoField.YEAR.checkValidIntValue(fieldValues.remove(ChronoField.YEAR));

          if (resolverStyle === ResolverStyle.LENIENT) {
            var weeks = MathUtil.safeSubtract(fieldValues.remove(ChronoField.ALIGNED_WEEK_OF_YEAR), 1);

            var _days2 = MathUtil.safeSubtract(fieldValues.remove(ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR), 1);

            return LocalDate.of(_y2, 1, 1).plusWeeks(weeks).plusDays(_days2);
          }

          var aw = ChronoField.ALIGNED_WEEK_OF_YEAR.checkValidIntValue(fieldValues.remove(ChronoField.ALIGNED_WEEK_OF_YEAR));
          var ad = ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR.checkValidIntValue(fieldValues.remove(ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR));
          var date = LocalDate.of(_y2, 1, 1).plusDays((aw - 1) * 7 + (ad - 1));

          if (resolverStyle === ResolverStyle.STRICT && date.get(ChronoField.YEAR) !== _y2) {
            throw new DateTimeException('Strict mode rejected date parsed to a different year');
          }

          return date;
        }

        if (fieldValues.containsKey(ChronoField.DAY_OF_WEEK)) {
          var _y3 = ChronoField.YEAR.checkValidIntValue(fieldValues.remove(ChronoField.YEAR));

          if (resolverStyle === ResolverStyle.LENIENT) {
            var _weeks = MathUtil.safeSubtract(fieldValues.remove(ChronoField.ALIGNED_WEEK_OF_YEAR), 1);

            var _days3 = MathUtil.safeSubtract(fieldValues.remove(ChronoField.DAY_OF_WEEK), 1);

            return LocalDate.of(_y3, 1, 1).plusWeeks(_weeks).plusDays(_days3);
          }

          var _aw = ChronoField.ALIGNED_WEEK_OF_YEAR.checkValidIntValue(fieldValues.remove(ChronoField.ALIGNED_WEEK_OF_YEAR));

          var dow = ChronoField.DAY_OF_WEEK.checkValidIntValue(fieldValues.remove(ChronoField.DAY_OF_WEEK));

          var _date = LocalDate.of(_y3, 1, 1).plusWeeks(_aw - 1).with(TemporalAdjusters.nextOrSame(DayOfWeek.of(dow)));

          if (resolverStyle === ResolverStyle.STRICT && _date.get(ChronoField.YEAR) !== _y3) {
            throw new DateTimeException('Strict mode rejected date parsed to a different month');
          }

          return _date;
        }
      }
    }

    return null;
  };

  _proto.date = function date(temporal) {
    return LocalDate.from(temporal);
  };

  return IsoChronology;
}(Enum);
function _init$9() {
  IsoChronology.INSTANCE = new IsoChronology('IsoChronology');
}

var OffsetTime = function (_Temporal) {
  _inheritsLoose(OffsetTime, _Temporal);

  OffsetTime.from = function from(temporal) {
    requireNonNull(temporal, 'temporal');

    if (temporal instanceof OffsetTime) {
      return temporal;
    } else if (temporal instanceof OffsetDateTime) {
      return temporal.toOffsetTime();
    }

    try {
      var time = LocalTime.from(temporal);
      var offset = ZoneOffset.from(temporal);
      return new OffsetTime(time, offset);
    } catch (ex) {
      throw new DateTimeException("Unable to obtain OffsetTime TemporalAccessor: " + temporal + ", type " + (temporal.constructor != null ? temporal.constructor.name : ''));
    }
  };

  OffsetTime.now = function now(clockOrZone) {
    if (arguments.length === 0) {
      return OffsetTime._now(Clock.systemDefaultZone());
    } else if (clockOrZone instanceof Clock) {
      return OffsetTime._now(clockOrZone);
    } else {
      return OffsetTime._now(Clock.system(clockOrZone));
    }
  };

  OffsetTime._now = function _now(clock) {
    requireNonNull(clock, 'clock');
    var now = clock.instant();
    return OffsetTime.ofInstant(now, clock.zone().rules().offset(now));
  };

  OffsetTime.of = function of() {
    if (arguments.length <= 2) {
      return OffsetTime.ofTimeAndOffset.apply(this, arguments);
    } else {
      return OffsetTime.ofNumbers.apply(this, arguments);
    }
  };

  OffsetTime.ofNumbers = function ofNumbers(hour, minute, second, nanoOfSecond, offset) {
    var time = LocalTime.of(hour, minute, second, nanoOfSecond);
    return new OffsetTime(time, offset);
  };

  OffsetTime.ofTimeAndOffset = function ofTimeAndOffset(time, offset) {
    return new OffsetTime(time, offset);
  };

  OffsetTime.ofInstant = function ofInstant(instant, zone) {
    requireNonNull(instant, 'instant');
    requireInstance(instant, Instant, 'instant');
    requireNonNull(zone, 'zone');
    requireInstance(zone, ZoneId, 'zone');
    var rules = zone.rules();
    var offset = rules.offset(instant);
    var secsOfDay = instant.epochSecond() % LocalTime.SECONDS_PER_DAY;
    secsOfDay = (secsOfDay + offset.totalSeconds()) % LocalTime.SECONDS_PER_DAY;

    if (secsOfDay < 0) {
      secsOfDay += LocalTime.SECONDS_PER_DAY;
    }

    var time = LocalTime.ofSecondOfDay(secsOfDay, instant.nano());
    return new OffsetTime(time, offset);
  };

  OffsetTime.parse = function parse(text, formatter) {
    if (formatter === void 0) {
      formatter = DateTimeFormatter.ISO_OFFSET_TIME;
    }

    requireNonNull(formatter, 'formatter');
    return formatter.parse(text, OffsetTime.FROM);
  };

  function OffsetTime(time, offset) {
    var _this;

    _this = _Temporal.call(this) || this;
    requireNonNull(time, 'time');
    requireInstance(time, LocalTime, 'time');
    requireNonNull(offset, 'offset');
    requireInstance(offset, ZoneOffset, 'offset');
    _this._time = time;
    _this._offset = offset;
    return _this;
  }

  var _proto = OffsetTime.prototype;

  _proto.adjustInto = function adjustInto(temporal) {
    return temporal.with(ChronoField.NANO_OF_DAY, this._time.toNanoOfDay()).with(ChronoField.OFFSET_SECONDS, this.offset().totalSeconds());
  };

  _proto.atDate = function atDate(date) {
    return OffsetDateTime.of(date, this._time, this._offset);
  };

  _proto.format = function format(formatter) {
    requireNonNull(formatter, 'formatter');
    return formatter.format(this, OffsetTime.FROM);
  };

  _proto.get = function get(field) {
    return _Temporal.prototype.get.call(this, field);
  };

  _proto.getLong = function getLong(field) {
    if (field instanceof ChronoField) {
      if (field === ChronoField.OFFSET_SECONDS) {
        return this._offset.totalSeconds();
      }

      return this._time.getLong(field);
    }

    return field.getFrom(this);
  };

  _proto.hour = function hour() {
    return this._time.hour();
  };

  _proto.minute = function minute() {
    return this._time.minute();
  };

  _proto.second = function second() {
    return this._time.second();
  };

  _proto.nano = function nano() {
    return this._time.nano();
  };

  _proto.offset = function offset() {
    return this._offset;
  };

  _proto.isAfter = function isAfter(other) {
    requireNonNull(other, 'other');
    return this._toEpochNano() > other._toEpochNano();
  };

  _proto.isBefore = function isBefore(other) {
    requireNonNull(other, 'other');
    return this._toEpochNano() < other._toEpochNano();
  };

  _proto.isEqual = function isEqual(other) {
    requireNonNull(other, 'other');
    return this._toEpochNano() === other._toEpochNano();
  };

  _proto.isSupported = function isSupported(fieldOrUnit) {
    if (fieldOrUnit instanceof ChronoField) {
      return fieldOrUnit.isTimeBased() || fieldOrUnit === ChronoField.OFFSET_SECONDS;
    } else if (fieldOrUnit instanceof ChronoUnit) {
      return fieldOrUnit.isTimeBased();
    }

    return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
  };

  _proto.minusHours = function minusHours(hours) {
    return this._withLocalTimeOffset(this._time.minusHours(hours), this._offset);
  };

  _proto.minusMinutes = function minusMinutes(minutes) {
    return this._withLocalTimeOffset(this._time.minusMinutes(minutes), this._offset);
  };

  _proto.minusSeconds = function minusSeconds(seconds) {
    return this._withLocalTimeOffset(this._time.minusSeconds(seconds), this._offset);
  };

  _proto.minusNanos = function minusNanos(nanos) {
    return this._withLocalTimeOffset(this._time.minusNanos(nanos), this._offset);
  };

  _proto._minusAmount = function _minusAmount(amount) {
    requireNonNull(amount);
    return amount.subtractFrom(this);
  };

  _proto._minusUnit = function _minusUnit(amountToSubtract, unit) {
    return this.plus(-1 * amountToSubtract, unit);
  };

  _proto._plusAmount = function _plusAmount(amount) {
    requireNonNull(amount);
    return amount.addTo(this);
  };

  _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
    if (unit instanceof ChronoUnit) {
      return this._withLocalTimeOffset(this._time.plus(amountToAdd, unit), this._offset);
    }

    return unit.addTo(this, amountToAdd);
  };

  _proto.plusHours = function plusHours(hours) {
    return this._withLocalTimeOffset(this._time.plusHours(hours), this._offset);
  };

  _proto.plusMinutes = function plusMinutes(minutes) {
    return this._withLocalTimeOffset(this._time.plusMinutes(minutes), this._offset);
  };

  _proto.plusSeconds = function plusSeconds(seconds) {
    return this._withLocalTimeOffset(this._time.plusSeconds(seconds), this._offset);
  };

  _proto.plusNanos = function plusNanos(nanos) {
    return this._withLocalTimeOffset(this._time.plusNanos(nanos), this._offset);
  };

  _proto.query = function query(_query) {
    requireNonNull(_query, 'query');

    if (_query === TemporalQueries.precision()) {
      return ChronoUnit.NANOS;
    } else if (_query === TemporalQueries.offset() || _query === TemporalQueries.zone()) {
      return this.offset();
    } else if (_query === TemporalQueries.localTime()) {
      return this._time;
    } else if (_query === TemporalQueries.chronology() || _query === TemporalQueries.localDate() || _query === TemporalQueries.zoneId()) {
      return null;
    }

    return _Temporal.prototype.query.call(this, _query);
  };

  _proto.range = function range(field) {
    if (field instanceof ChronoField) {
      if (field === ChronoField.OFFSET_SECONDS) {
        return field.range();
      }

      return this._time.range(field);
    }

    return field.rangeRefinedBy(this);
  };

  _proto.toLocalTime = function toLocalTime() {
    return this._time;
  };

  _proto.truncatedTo = function truncatedTo(unit) {
    return this._withLocalTimeOffset(this._time.truncatedTo(unit), this._offset);
  };

  _proto.until = function until(endExclusive, unit) {
    requireNonNull(endExclusive, 'endExclusive');
    requireNonNull(unit, 'unit');
    var end = OffsetTime.from(endExclusive);

    if (unit instanceof ChronoUnit) {
      var nanosUntil = end._toEpochNano() - this._toEpochNano();

      switch (unit) {
        case ChronoUnit.NANOS:
          return nanosUntil;

        case ChronoUnit.MICROS:
          return Math.floor(nanosUntil / 1000);

        case ChronoUnit.MILLIS:
          return Math.floor(nanosUntil / 1000000);

        case ChronoUnit.SECONDS:
          return Math.floor(nanosUntil / LocalTime.NANOS_PER_SECOND);

        case ChronoUnit.MINUTES:
          return Math.floor(nanosUntil / LocalTime.NANOS_PER_MINUTE);

        case ChronoUnit.HOURS:
          return Math.floor(nanosUntil / LocalTime.NANOS_PER_HOUR);

        case ChronoUnit.HALF_DAYS:
          return Math.floor(nanosUntil / (12 * LocalTime.NANOS_PER_HOUR));
      }

      throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
    }

    return unit.between(this, end);
  };

  _proto.withHour = function withHour(hour) {
    return this._withLocalTimeOffset(this._time.withHour(hour), this._offset);
  };

  _proto.withMinute = function withMinute(minute) {
    return this._withLocalTimeOffset(this._time.withMinute(minute), this._offset);
  };

  _proto.withSecond = function withSecond(second) {
    return this._withLocalTimeOffset(this._time.withSecond(second), this._offset);
  };

  _proto.withNano = function withNano(nano) {
    return this._withLocalTimeOffset(this._time.withNano(nano), this._offset);
  };

  _proto.withOffsetSameInstant = function withOffsetSameInstant(offset) {
    requireNonNull(offset, 'offset');

    if (offset.equals(this._offset)) {
      return this;
    }

    var difference = offset.totalSeconds() - this._offset.totalSeconds();

    var adjusted = this._time.plusSeconds(difference);

    return new OffsetTime(adjusted, offset);
  };

  _proto.withOffsetSameLocal = function withOffsetSameLocal(offset) {
    return offset != null && offset.equals(this._offset) ? this : new OffsetTime(this._time, offset);
  };

  _proto._toEpochNano = function _toEpochNano() {
    var nod = this._time.toNanoOfDay();

    var offsetNanos = this._offset.totalSeconds() * LocalTime.NANOS_PER_SECOND;
    return nod - offsetNanos;
  };

  _proto._withAdjuster = function _withAdjuster(adjuster) {
    requireNonNull(adjuster, 'adjuster');

    if (adjuster instanceof LocalTime) {
      return this._withLocalTimeOffset(adjuster, this._offset);
    } else if (adjuster instanceof ZoneOffset) {
      return this._withLocalTimeOffset(this._time, adjuster);
    } else if (adjuster instanceof OffsetTime) {
      return adjuster;
    }

    return adjuster.adjustInto(this);
  };

  _proto._withField = function _withField(field, newValue) {
    requireNonNull(field, 'field');

    if (field instanceof ChronoField) {
      if (field === ChronoField.OFFSET_SECONDS) {
        return this._withLocalTimeOffset(this._time, ZoneOffset.ofTotalSeconds(field.checkValidIntValue(newValue)));
      }

      return this._withLocalTimeOffset(this._time.with(field, newValue), this._offset);
    }

    return field.adjustInto(this, newValue);
  };

  _proto._withLocalTimeOffset = function _withLocalTimeOffset(time, offset) {
    if (this._time === time && this._offset.equals(offset)) {
      return this;
    }

    return new OffsetTime(time, offset);
  };

  _proto.compareTo = function compareTo(other) {
    requireNonNull(other, 'other');
    requireInstance(other, OffsetTime, 'other');

    if (this._offset.equals(other._offset)) {
      return this._time.compareTo(other._time);
    }

    var compare = MathUtil.compareNumbers(this._toEpochNano(), other._toEpochNano());

    if (compare === 0) {
      return this._time.compareTo(other._time);
    }

    return compare;
  };

  _proto.equals = function equals(other) {
    if (this === other) {
      return true;
    }

    if (other instanceof OffsetTime) {
      return this._time.equals(other._time) && this._offset.equals(other._offset);
    }

    return false;
  };

  _proto.hashCode = function hashCode() {
    return this._time.hashCode() ^ this._offset.hashCode();
  };

  _proto.toString = function toString() {
    return this._time.toString() + this._offset.toString();
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  return OffsetTime;
}(Temporal);
function _init$8() {
  OffsetTime.MIN = OffsetTime.ofNumbers(0, 0, 0, 0, ZoneOffset.MAX);
  OffsetTime.MAX = OffsetTime.ofNumbers(23, 59, 59, 999999999, ZoneOffset.MIN);
  OffsetTime.FROM = createTemporalQuery('OffsetTime.FROM', function (temporal) {
    return OffsetTime.from(temporal);
  });
}

var ChronoZonedDateTime = function (_Temporal) {
  _inheritsLoose(ChronoZonedDateTime, _Temporal);

  function ChronoZonedDateTime() {
    return _Temporal.apply(this, arguments) || this;
  }

  var _proto = ChronoZonedDateTime.prototype;

  _proto.query = function query(_query) {
    if (_query === TemporalQueries.zoneId() || _query === TemporalQueries.zone()) {
      return this.zone();
    } else if (_query === TemporalQueries.chronology()) {
      return this.toLocalDate().chronology();
    } else if (_query === TemporalQueries.precision()) {
      return ChronoUnit.NANOS;
    } else if (_query === TemporalQueries.offset()) {
      return this.offset();
    } else if (_query === TemporalQueries.localDate()) {
      return LocalDate.ofEpochDay(this.toLocalDate().toEpochDay());
    } else if (_query === TemporalQueries.localTime()) {
      return this.toLocalTime();
    }

    return _Temporal.prototype.query.call(this, _query);
  };

  _proto.format = function format(formatter) {
    requireNonNull(formatter, 'formatter');
    return formatter.format(this);
  };

  _proto.toInstant = function toInstant() {
    return Instant.ofEpochSecond(this.toEpochSecond(), this.toLocalTime().nano());
  };

  _proto.toEpochSecond = function toEpochSecond() {
    var epochDay = this.toLocalDate().toEpochDay();
    var secs = epochDay * 86400 + this.toLocalTime().toSecondOfDay();
    secs -= this.offset().totalSeconds();
    return secs;
  };

  _proto.compareTo = function compareTo(other) {
    requireNonNull(other, 'other');
    var cmp = MathUtil.compareNumbers(this.toEpochSecond(), other.toEpochSecond());

    if (cmp === 0) {
      cmp = this.toLocalTime().nano() - other.toLocalTime().nano();

      if (cmp === 0) {
        cmp = this.toLocalDateTime().compareTo(other.toLocalDateTime());

        if (cmp === 0) {
          cmp = strcmp(this.zone().id(), other.zone().id());
        }
      }
    }

    return cmp;
  };

  _proto.isAfter = function isAfter(other) {
    requireNonNull(other, 'other');
    var thisEpochSec = this.toEpochSecond();
    var otherEpochSec = other.toEpochSecond();
    return thisEpochSec > otherEpochSec || thisEpochSec === otherEpochSec && this.toLocalTime().nano() > other.toLocalTime().nano();
  };

  _proto.isBefore = function isBefore(other) {
    requireNonNull(other, 'other');
    var thisEpochSec = this.toEpochSecond();
    var otherEpochSec = other.toEpochSecond();
    return thisEpochSec < otherEpochSec || thisEpochSec === otherEpochSec && this.toLocalTime().nano() < other.toLocalTime().nano();
  };

  _proto.isEqual = function isEqual(other) {
    requireNonNull(other, 'other');
    return this.toEpochSecond() === other.toEpochSecond() && this.toLocalTime().nano() === other.toLocalTime().nano();
  };

  _proto.equals = function equals(other) {
    if (this === other) {
      return true;
    }

    if (other instanceof ChronoZonedDateTime) {
      return this.compareTo(other) === 0;
    }

    return false;
  };

  return ChronoZonedDateTime;
}(Temporal);

function strcmp(a, b) {
  if (a < b) {
    return -1;
  }

  if (a > b) {
    return 1;
  }

  return 0;
}

var ZonedDateTime = function (_ChronoZonedDateTime) {
  _inheritsLoose(ZonedDateTime, _ChronoZonedDateTime);

  ZonedDateTime.now = function now(clockOrZone) {
    var clock;

    if (clockOrZone instanceof ZoneId) {
      clock = Clock.system(clockOrZone);
    } else {
      clock = clockOrZone == null ? Clock.systemDefaultZone() : clockOrZone;
    }

    return ZonedDateTime.ofInstant(clock.instant(), clock.zone());
  };

  ZonedDateTime.of = function of() {
    if (arguments.length <= 2) {
      return ZonedDateTime.of2.apply(this, arguments);
    } else if (arguments.length === 3 && arguments[0] instanceof LocalDate) {
      return ZonedDateTime.of3.apply(this, arguments);
    } else {
      return ZonedDateTime.of8.apply(this, arguments);
    }
  };

  ZonedDateTime.of3 = function of3(date, time, zone) {
    return ZonedDateTime.of2(LocalDateTime.of(date, time), zone);
  };

  ZonedDateTime.of2 = function of2(localDateTime, zone) {
    return ZonedDateTime.ofLocal(localDateTime, zone, null);
  };

  ZonedDateTime.of8 = function of8(year, month, dayOfMonth, hour, minute, second, nanoOfSecond, zone) {
    var dt = LocalDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoOfSecond);
    return ZonedDateTime.ofLocal(dt, zone, null);
  };

  ZonedDateTime.ofLocal = function ofLocal(localDateTime, zone, preferredOffset) {
    requireNonNull(localDateTime, 'localDateTime');
    requireNonNull(zone, 'zone');

    if (zone instanceof ZoneOffset) {
      return new ZonedDateTime(localDateTime, zone, zone);
    }

    var offset = null;
    var rules = zone.rules();
    var validOffsets = rules.validOffsets(localDateTime);

    if (validOffsets.length === 1) {
      offset = validOffsets[0];
    } else if (validOffsets.length === 0) {
      var trans = rules.transition(localDateTime);
      localDateTime = localDateTime.plusSeconds(trans.duration().seconds());
      offset = trans.offsetAfter();
    } else {
      if (preferredOffset != null && validOffsets.some(function (validOffset) {
        return validOffset.equals(preferredOffset);
      })) {
        offset = preferredOffset;
      } else {
        offset = requireNonNull(validOffsets[0], 'offset');
      }
    }

    return new ZonedDateTime(localDateTime, offset, zone);
  };

  ZonedDateTime.ofInstant = function ofInstant() {
    if (arguments.length === 2) {
      return ZonedDateTime.ofInstant2.apply(this, arguments);
    } else {
      return ZonedDateTime.ofInstant3.apply(this, arguments);
    }
  };

  ZonedDateTime.ofInstant2 = function ofInstant2(instant, zone) {
    requireNonNull(instant, 'instant');
    requireNonNull(zone, 'zone');
    return ZonedDateTime._create(instant.epochSecond(), instant.nano(), zone);
  };

  ZonedDateTime.ofInstant3 = function ofInstant3(localDateTime, offset, zone) {
    requireNonNull(localDateTime, 'localDateTime');
    requireNonNull(offset, 'offset');
    requireNonNull(zone, 'zone');
    return ZonedDateTime._create(localDateTime.toEpochSecond(offset), localDateTime.nano(), zone);
  };

  ZonedDateTime._create = function _create(epochSecond, nanoOfSecond, zone) {
    var rules = zone.rules();
    var instant = Instant.ofEpochSecond(epochSecond, nanoOfSecond);
    var offset = rules.offset(instant);
    var ldt = LocalDateTime.ofEpochSecond(epochSecond, nanoOfSecond, offset);
    return new ZonedDateTime(ldt, offset, zone);
  };

  ZonedDateTime.ofStrict = function ofStrict(localDateTime, offset, zone) {
    requireNonNull(localDateTime, 'localDateTime');
    requireNonNull(offset, 'offset');
    requireNonNull(zone, 'zone');
    var rules = zone.rules();

    if (rules.isValidOffset(localDateTime, offset) === false) {
      var trans = rules.transition(localDateTime);

      if (trans != null && trans.isGap()) {
        throw new DateTimeException("LocalDateTime " + localDateTime + " does not exist in zone " + zone + " due to a gap in the local time-line, typically caused by daylight savings");
      }

      throw new DateTimeException("ZoneOffset \"" + offset + "\" is not valid for LocalDateTime \"" + localDateTime + "\" in zone \"" + zone + "\"");
    }

    return new ZonedDateTime(localDateTime, offset, zone);
  };

  ZonedDateTime.ofLenient = function ofLenient(localDateTime, offset, zone) {
    requireNonNull(localDateTime, 'localDateTime');
    requireNonNull(offset, 'offset');
    requireNonNull(zone, 'zone');

    if (zone instanceof ZoneOffset && offset.equals(zone) === false) {
      throw new IllegalArgumentException('ZoneId must match ZoneOffset');
    }

    return new ZonedDateTime(localDateTime, offset, zone);
  };

  ZonedDateTime.from = function from(temporal) {
    requireNonNull(temporal, 'temporal');

    if (temporal instanceof ZonedDateTime) {
      return temporal;
    }

    var zone = ZoneId.from(temporal);

    if (temporal.isSupported(ChronoField.INSTANT_SECONDS)) {
      var zdt = ZonedDateTime._from(temporal, zone);

      if (zdt != null) return zdt;
    }

    var ldt = LocalDateTime.from(temporal);
    return ZonedDateTime.of2(ldt, zone);
  };

  ZonedDateTime._from = function _from(temporal, zone) {
    try {
      return ZonedDateTime.__from(temporal, zone);
    } catch (ex) {
      if (!(ex instanceof DateTimeException)) throw ex;
    }
  };

  ZonedDateTime.__from = function __from(temporal, zone) {
    var epochSecond = temporal.getLong(ChronoField.INSTANT_SECONDS);
    var nanoOfSecond = temporal.get(ChronoField.NANO_OF_SECOND);
    return ZonedDateTime._create(epochSecond, nanoOfSecond, zone);
  };

  ZonedDateTime.parse = function parse(text, formatter) {
    if (formatter === void 0) {
      formatter = DateTimeFormatter.ISO_ZONED_DATE_TIME;
    }

    requireNonNull(formatter, 'formatter');
    return formatter.parse(text, ZonedDateTime.FROM);
  };

  function ZonedDateTime(dateTime, offset, zone) {
    var _this;

    requireNonNull(dateTime, 'dateTime');
    requireNonNull(offset, 'offset');
    requireNonNull(zone, 'zone');
    _this = _ChronoZonedDateTime.call(this) || this;
    _this._dateTime = dateTime;
    _this._offset = offset;
    _this._zone = zone;
    return _this;
  }

  var _proto = ZonedDateTime.prototype;

  _proto._resolveLocal = function _resolveLocal(newDateTime) {
    requireNonNull(newDateTime, 'newDateTime');
    return ZonedDateTime.ofLocal(newDateTime, this._zone, this._offset);
  };

  _proto._resolveInstant = function _resolveInstant(newDateTime) {
    return ZonedDateTime.ofInstant3(newDateTime, this._offset, this._zone);
  };

  _proto._resolveOffset = function _resolveOffset(offset) {
    if (offset.equals(this._offset) === false && this._zone.rules().isValidOffset(this._dateTime, offset)) {
      return new ZonedDateTime(this._dateTime, offset, this._zone);
    }

    return this;
  };

  _proto.isSupported = function isSupported(fieldOrUnit) {
    if (fieldOrUnit instanceof ChronoField) {
      return true;
    } else if (fieldOrUnit instanceof ChronoUnit) {
      return fieldOrUnit.isDateBased() || fieldOrUnit.isTimeBased();
    }

    return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
  };

  _proto.range = function range(field) {
    if (field instanceof ChronoField) {
      if (field === ChronoField.INSTANT_SECONDS || field === ChronoField.OFFSET_SECONDS) {
        return field.range();
      }

      return this._dateTime.range(field);
    }

    return field.rangeRefinedBy(this);
  };

  _proto.get = function get(field) {
    return this.getLong(field);
  };

  _proto.getLong = function getLong(field) {
    if (field instanceof ChronoField) {
      switch (field) {
        case ChronoField.INSTANT_SECONDS:
          return this.toEpochSecond();

        case ChronoField.OFFSET_SECONDS:
          return this._offset.totalSeconds();
      }

      return this._dateTime.getLong(field);
    }

    requireNonNull(field, 'field');
    return field.getFrom(this);
  };

  _proto.offset = function offset() {
    return this._offset;
  };

  _proto.withEarlierOffsetAtOverlap = function withEarlierOffsetAtOverlap() {
    var trans = this._zone.rules().transition(this._dateTime);

    if (trans != null && trans.isOverlap()) {
      var earlierOffset = trans.offsetBefore();

      if (earlierOffset.equals(this._offset) === false) {
        return new ZonedDateTime(this._dateTime, earlierOffset, this._zone);
      }
    }

    return this;
  };

  _proto.withLaterOffsetAtOverlap = function withLaterOffsetAtOverlap() {
    var trans = this._zone.rules().transition(this.toLocalDateTime());

    if (trans != null) {
      var laterOffset = trans.offsetAfter();

      if (laterOffset.equals(this._offset) === false) {
        return new ZonedDateTime(this._dateTime, laterOffset, this._zone);
      }
    }

    return this;
  };

  _proto.zone = function zone() {
    return this._zone;
  };

  _proto.withZoneSameLocal = function withZoneSameLocal(zone) {
    requireNonNull(zone, 'zone');
    return this._zone.equals(zone) ? this : ZonedDateTime.ofLocal(this._dateTime, zone, this._offset);
  };

  _proto.withZoneSameInstant = function withZoneSameInstant(zone) {
    requireNonNull(zone, 'zone');
    return this._zone.equals(zone) ? this : ZonedDateTime._create(this._dateTime.toEpochSecond(this._offset), this._dateTime.nano(), zone);
  };

  _proto.withFixedOffsetZone = function withFixedOffsetZone() {
    return this._zone.equals(this._offset) ? this : new ZonedDateTime(this._dateTime, this._offset, this._offset);
  };

  _proto.year = function year() {
    return this._dateTime.year();
  };

  _proto.monthValue = function monthValue() {
    return this._dateTime.monthValue();
  };

  _proto.month = function month() {
    return this._dateTime.month();
  };

  _proto.dayOfMonth = function dayOfMonth() {
    return this._dateTime.dayOfMonth();
  };

  _proto.dayOfYear = function dayOfYear() {
    return this._dateTime.dayOfYear();
  };

  _proto.dayOfWeek = function dayOfWeek() {
    return this._dateTime.dayOfWeek();
  };

  _proto.hour = function hour() {
    return this._dateTime.hour();
  };

  _proto.minute = function minute() {
    return this._dateTime.minute();
  };

  _proto.second = function second() {
    return this._dateTime.second();
  };

  _proto.nano = function nano() {
    return this._dateTime.nano();
  };

  _proto._withAdjuster = function _withAdjuster(adjuster) {
    if (adjuster instanceof LocalDate) {
      return this._resolveLocal(LocalDateTime.of(adjuster, this._dateTime.toLocalTime()));
    } else if (adjuster instanceof LocalTime) {
      return this._resolveLocal(LocalDateTime.of(this._dateTime.toLocalDate(), adjuster));
    } else if (adjuster instanceof LocalDateTime) {
      return this._resolveLocal(adjuster);
    } else if (adjuster instanceof Instant) {
      var instant = adjuster;
      return ZonedDateTime._create(instant.epochSecond(), instant.nano(), this._zone);
    } else if (adjuster instanceof ZoneOffset) {
      return this._resolveOffset(adjuster);
    }

    return _ChronoZonedDateTime.prototype._withAdjuster.call(this, adjuster);
  };

  _proto._withField = function _withField(field, newValue) {
    if (field instanceof ChronoField) {
      switch (field) {
        case ChronoField.INSTANT_SECONDS:
          return ZonedDateTime._create(newValue, this.nano(), this._zone);

        case ChronoField.OFFSET_SECONDS:
          {
            var offset = ZoneOffset.ofTotalSeconds(field.checkValidIntValue(newValue));
            return this._resolveOffset(offset);
          }
      }

      return this._resolveLocal(this._dateTime.with(field, newValue));
    }

    return field.adjustInto(this, newValue);
  };

  _proto.withYear = function withYear(year) {
    return this._resolveLocal(this._dateTime.withYear(year));
  };

  _proto.withMonth = function withMonth(month) {
    return this._resolveLocal(this._dateTime.withMonth(month));
  };

  _proto.withDayOfMonth = function withDayOfMonth(dayOfMonth) {
    return this._resolveLocal(this._dateTime.withDayOfMonth(dayOfMonth));
  };

  _proto.withDayOfYear = function withDayOfYear(dayOfYear) {
    return this._resolveLocal(this._dateTime.withDayOfYear(dayOfYear));
  };

  _proto.withHour = function withHour(hour) {
    return this._resolveLocal(this._dateTime.withHour(hour));
  };

  _proto.withMinute = function withMinute(minute) {
    return this._resolveLocal(this._dateTime.withMinute(minute));
  };

  _proto.withSecond = function withSecond(second) {
    return this._resolveLocal(this._dateTime.withSecond(second));
  };

  _proto.withNano = function withNano(nanoOfSecond) {
    return this._resolveLocal(this._dateTime.withNano(nanoOfSecond));
  };

  _proto.truncatedTo = function truncatedTo(unit) {
    return this._resolveLocal(this._dateTime.truncatedTo(unit));
  };

  _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
    if (unit instanceof ChronoUnit) {
      if (unit.isDateBased()) {
        return this._resolveLocal(this._dateTime.plus(amountToAdd, unit));
      } else {
        return this._resolveInstant(this._dateTime.plus(amountToAdd, unit));
      }
    }

    requireNonNull(unit, 'unit');
    return unit.addTo(this, amountToAdd);
  };

  _proto.plusYears = function plusYears(years) {
    return this._resolveLocal(this._dateTime.plusYears(years));
  };

  _proto.plusMonths = function plusMonths(months) {
    return this._resolveLocal(this._dateTime.plusMonths(months));
  };

  _proto.plusWeeks = function plusWeeks(weeks) {
    return this._resolveLocal(this._dateTime.plusWeeks(weeks));
  };

  _proto.plusDays = function plusDays(days) {
    return this._resolveLocal(this._dateTime.plusDays(days));
  };

  _proto.plusHours = function plusHours(hours) {
    return this._resolveInstant(this._dateTime.plusHours(hours));
  };

  _proto.plusMinutes = function plusMinutes(minutes) {
    return this._resolveInstant(this._dateTime.plusMinutes(minutes));
  };

  _proto.plusSeconds = function plusSeconds(seconds) {
    return this._resolveInstant(this._dateTime.plusSeconds(seconds));
  };

  _proto.plusNanos = function plusNanos(nanos) {
    return this._resolveInstant(this._dateTime.plusNanos(nanos));
  };

  _proto._minusUnit = function _minusUnit(amountToSubtract, unit) {
    return this._plusUnit(-1 * amountToSubtract, unit);
  };

  _proto.minusYears = function minusYears(years) {
    return this.plusYears(-1 * years);
  };

  _proto.minusMonths = function minusMonths(months) {
    return this.plusMonths(-1 * months);
  };

  _proto.minusWeeks = function minusWeeks(weeks) {
    return this.plusWeeks(-1 * weeks);
  };

  _proto.minusDays = function minusDays(days) {
    return this.plusDays(-1 * days);
  };

  _proto.minusHours = function minusHours(hours) {
    return this.plusHours(-1 * hours);
  };

  _proto.minusMinutes = function minusMinutes(minutes) {
    return this.plusMinutes(-1 * minutes);
  };

  _proto.minusSeconds = function minusSeconds(seconds) {
    return this.plusSeconds(-1 * seconds);
  };

  _proto.minusNanos = function minusNanos(nanos) {
    return this.plusNanos(-1 * nanos);
  };

  _proto.query = function query(_query) {
    if (_query === TemporalQueries.localDate()) {
      return this.toLocalDate();
    }

    requireNonNull(_query, 'query');
    return _ChronoZonedDateTime.prototype.query.call(this, _query);
  };

  _proto.until = function until(endExclusive, unit) {
    var end = ZonedDateTime.from(endExclusive);

    if (unit instanceof ChronoUnit) {
      end = end.withZoneSameInstant(this._zone);

      if (unit.isDateBased()) {
        return this._dateTime.until(end._dateTime, unit);
      } else {
        var difference = this._offset.totalSeconds() - end._offset.totalSeconds();

        var adjustedEnd = end._dateTime.plusSeconds(difference);

        return this._dateTime.until(adjustedEnd, unit);
      }
    }

    return unit.between(this, end);
  };

  _proto.toLocalDateTime = function toLocalDateTime() {
    return this._dateTime;
  };

  _proto.toLocalDate = function toLocalDate() {
    return this._dateTime.toLocalDate();
  };

  _proto.toLocalTime = function toLocalTime() {
    return this._dateTime.toLocalTime();
  };

  _proto.toOffsetDateTime = function toOffsetDateTime() {
    return OffsetDateTime.of(this._dateTime, this._offset);
  };

  _proto.equals = function equals(other) {
    if (this === other) {
      return true;
    }

    if (other instanceof ZonedDateTime) {
      return this._dateTime.equals(other._dateTime) && this._offset.equals(other._offset) && this._zone.equals(other._zone);
    }

    return false;
  };

  _proto.hashCode = function hashCode() {
    return MathUtil.hashCode(this._dateTime.hashCode(), this._offset.hashCode(), this._zone.hashCode());
  };

  _proto.toString = function toString() {
    var str = this._dateTime.toString() + this._offset.toString();

    if (this._offset !== this._zone) {
      str += "[" + this._zone.toString() + "]";
    }

    return str;
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  _proto.format = function format(formatter) {
    return _ChronoZonedDateTime.prototype.format.call(this, formatter);
  };

  return ZonedDateTime;
}(ChronoZonedDateTime);
function _init$7() {
  ZonedDateTime.FROM = createTemporalQuery('ZonedDateTime.FROM', function (temporal) {
    return ZonedDateTime.from(temporal);
  });
}

var OffsetDateTime = function (_Temporal) {
  _inheritsLoose(OffsetDateTime, _Temporal);

  OffsetDateTime.from = function from(temporal) {
    requireNonNull(temporal, 'temporal');

    if (temporal instanceof OffsetDateTime) {
      return temporal;
    }

    try {
      var offset = ZoneOffset.from(temporal);

      try {
        var ldt = LocalDateTime.from(temporal);
        return OffsetDateTime.of(ldt, offset);
      } catch (_) {
        var instant = Instant.from(temporal);
        return OffsetDateTime.ofInstant(instant, offset);
      }
    } catch (ex) {
      throw new DateTimeException("Unable to obtain OffsetDateTime TemporalAccessor: " + temporal + ", type " + (temporal.constructor != null ? temporal.constructor.name : ''));
    }
  };

  OffsetDateTime.now = function now(clockOrZone) {
    if (arguments.length === 0) {
      return OffsetDateTime.now(Clock.systemDefaultZone());
    } else {
      requireNonNull(clockOrZone, 'clockOrZone');

      if (clockOrZone instanceof ZoneId) {
        return OffsetDateTime.now(Clock.system(clockOrZone));
      } else if (clockOrZone instanceof Clock) {
        var now = clockOrZone.instant();
        return OffsetDateTime.ofInstant(now, clockOrZone.zone().rules().offset(now));
      } else {
        throw new IllegalArgumentException('clockOrZone must be an instance of ZoneId or Clock');
      }
    }
  };

  OffsetDateTime.of = function of() {
    if (arguments.length <= 2) {
      return OffsetDateTime.ofDateTime.apply(this, arguments);
    } else if (arguments.length === 3) {
      return OffsetDateTime.ofDateAndTime.apply(this, arguments);
    } else {
      return OffsetDateTime.ofNumbers.apply(this, arguments);
    }
  };

  OffsetDateTime.ofDateTime = function ofDateTime(dateTime, offset) {
    return new OffsetDateTime(dateTime, offset);
  };

  OffsetDateTime.ofDateAndTime = function ofDateAndTime(date, time, offset) {
    var dt = LocalDateTime.of(date, time);
    return new OffsetDateTime(dt, offset);
  };

  OffsetDateTime.ofNumbers = function ofNumbers(year, month, dayOfMonth, hour, minute, second, nanoOfSecond, offset) {
    if (hour === void 0) {
      hour = 0;
    }

    if (minute === void 0) {
      minute = 0;
    }

    if (second === void 0) {
      second = 0;
    }

    if (nanoOfSecond === void 0) {
      nanoOfSecond = 0;
    }

    var dt = LocalDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoOfSecond);
    return new OffsetDateTime(dt, offset);
  };

  OffsetDateTime.ofInstant = function ofInstant(instant, zone) {
    requireNonNull(instant, 'instant');
    requireNonNull(zone, 'zone');
    var rules = zone.rules();
    var offset = rules.offset(instant);
    var ldt = LocalDateTime.ofEpochSecond(instant.epochSecond(), instant.nano(), offset);
    return new OffsetDateTime(ldt, offset);
  };

  OffsetDateTime.parse = function parse(text, formatter) {
    if (formatter === void 0) {
      formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
    }

    requireNonNull(formatter, 'formatter');
    return formatter.parse(text, OffsetDateTime.FROM);
  };

  function OffsetDateTime(dateTime, offset) {
    var _this;

    _this = _Temporal.call(this) || this;
    requireNonNull(dateTime, 'dateTime');
    requireInstance(dateTime, LocalDateTime, 'dateTime');
    requireNonNull(offset, 'offset');
    requireInstance(offset, ZoneOffset, 'offset');
    _this._dateTime = dateTime;
    _this._offset = offset;
    return _this;
  }

  var _proto = OffsetDateTime.prototype;

  _proto.adjustInto = function adjustInto(temporal) {
    return temporal.with(ChronoField.EPOCH_DAY, this.toLocalDate().toEpochDay()).with(ChronoField.NANO_OF_DAY, this.toLocalTime().toNanoOfDay()).with(ChronoField.OFFSET_SECONDS, this.offset().totalSeconds());
  };

  _proto.until = function until(endExclusive, unit) {
    var end = OffsetDateTime.from(endExclusive);

    if (unit instanceof ChronoUnit) {
      end = end.withOffsetSameInstant(this._offset);
      return this._dateTime.until(end._dateTime, unit);
    }

    return unit.between(this, end);
  };

  _proto.atZoneSameInstant = function atZoneSameInstant(zone) {
    return ZonedDateTime.ofInstant(this._dateTime, this._offset, zone);
  };

  _proto.atZoneSimilarLocal = function atZoneSimilarLocal(zone) {
    return ZonedDateTime.ofLocal(this._dateTime, zone, this._offset);
  };

  _proto.query = function query(_query) {
    requireNonNull(_query, 'query');

    if (_query === TemporalQueries.chronology()) {
      return IsoChronology.INSTANCE;
    } else if (_query === TemporalQueries.precision()) {
      return ChronoUnit.NANOS;
    } else if (_query === TemporalQueries.offset() || _query === TemporalQueries.zone()) {
      return this.offset();
    } else if (_query === TemporalQueries.localDate()) {
      return this.toLocalDate();
    } else if (_query === TemporalQueries.localTime()) {
      return this.toLocalTime();
    } else if (_query === TemporalQueries.zoneId()) {
      return null;
    }

    return _Temporal.prototype.query.call(this, _query);
  };

  _proto.get = function get(field) {
    if (field instanceof ChronoField) {
      switch (field) {
        case ChronoField.INSTANT_SECONDS:
          throw new DateTimeException("Field too large for an int: " + field);

        case ChronoField.OFFSET_SECONDS:
          return this.offset().totalSeconds();
      }

      return this._dateTime.get(field);
    }

    return _Temporal.prototype.get.call(this, field);
  };

  _proto.getLong = function getLong(field) {
    if (field instanceof ChronoField) {
      switch (field) {
        case ChronoField.INSTANT_SECONDS:
          return this.toEpochSecond();

        case ChronoField.OFFSET_SECONDS:
          return this.offset().totalSeconds();
      }

      return this._dateTime.getLong(field);
    }

    return field.getFrom(this);
  };

  _proto.offset = function offset() {
    return this._offset;
  };

  _proto.year = function year() {
    return this._dateTime.year();
  };

  _proto.monthValue = function monthValue() {
    return this._dateTime.monthValue();
  };

  _proto.month = function month() {
    return this._dateTime.month();
  };

  _proto.dayOfMonth = function dayOfMonth() {
    return this._dateTime.dayOfMonth();
  };

  _proto.dayOfYear = function dayOfYear() {
    return this._dateTime.dayOfYear();
  };

  _proto.dayOfWeek = function dayOfWeek() {
    return this._dateTime.dayOfWeek();
  };

  _proto.hour = function hour() {
    return this._dateTime.hour();
  };

  _proto.minute = function minute() {
    return this._dateTime.minute();
  };

  _proto.second = function second() {
    return this._dateTime.second();
  };

  _proto.nano = function nano() {
    return this._dateTime.nano();
  };

  _proto.toLocalDateTime = function toLocalDateTime() {
    return this._dateTime;
  };

  _proto.toLocalDate = function toLocalDate() {
    return this._dateTime.toLocalDate();
  };

  _proto.toLocalTime = function toLocalTime() {
    return this._dateTime.toLocalTime();
  };

  _proto.toOffsetTime = function toOffsetTime() {
    return OffsetTime.of(this._dateTime.toLocalTime(), this._offset);
  };

  _proto.toZonedDateTime = function toZonedDateTime() {
    return ZonedDateTime.of(this._dateTime, this._offset);
  };

  _proto.toInstant = function toInstant() {
    return this._dateTime.toInstant(this._offset);
  };

  _proto.toEpochSecond = function toEpochSecond() {
    return this._dateTime.toEpochSecond(this._offset);
  };

  _proto.isSupported = function isSupported(fieldOrUnit) {
    if (fieldOrUnit instanceof ChronoField) {
      return fieldOrUnit.isDateBased() || fieldOrUnit.isTimeBased();
    }

    if (fieldOrUnit instanceof ChronoUnit) {
      return fieldOrUnit.isDateBased() || fieldOrUnit.isTimeBased();
    }

    return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
  };

  _proto.range = function range(field) {
    if (field instanceof ChronoField) {
      if (field === ChronoField.INSTANT_SECONDS || field === ChronoField.OFFSET_SECONDS) {
        return field.range();
      }

      return this._dateTime.range(field);
    }

    return field.rangeRefinedBy(this);
  };

  _proto._withAdjuster = function _withAdjuster(adjuster) {
    requireNonNull(adjuster);

    if (adjuster instanceof LocalDate || adjuster instanceof LocalTime || adjuster instanceof LocalDateTime) {
      return this._withDateTimeOffset(this._dateTime.with(adjuster), this._offset);
    } else if (adjuster instanceof Instant) {
      return OffsetDateTime.ofInstant(adjuster, this._offset);
    } else if (adjuster instanceof ZoneOffset) {
      return this._withDateTimeOffset(this._dateTime, adjuster);
    } else if (adjuster instanceof OffsetDateTime) {
      return adjuster;
    }

    return adjuster.adjustInto(this);
  };

  _proto._withField = function _withField(field, newValue) {
    requireNonNull(field);

    if (field instanceof ChronoField) {
      var f = field;

      switch (f) {
        case ChronoField.INSTANT_SECONDS:
          return OffsetDateTime.ofInstant(Instant.ofEpochSecond(newValue, this.nano()), this._offset);

        case ChronoField.OFFSET_SECONDS:
          {
            return this._withDateTimeOffset(this._dateTime, ZoneOffset.ofTotalSeconds(f.checkValidIntValue(newValue)));
          }
      }

      return this._withDateTimeOffset(this._dateTime.with(field, newValue), this._offset);
    }

    return field.adjustInto(this, newValue);
  };

  _proto._withDateTimeOffset = function _withDateTimeOffset(dateTime, offset) {
    if (this._dateTime === dateTime && this._offset.equals(offset)) {
      return this;
    }

    return new OffsetDateTime(dateTime, offset);
  };

  _proto.withYear = function withYear(year) {
    return this._withDateTimeOffset(this._dateTime.withYear(year), this._offset);
  };

  _proto.withMonth = function withMonth(month) {
    return this._withDateTimeOffset(this._dateTime.withMonth(month), this._offset);
  };

  _proto.withDayOfMonth = function withDayOfMonth(dayOfMonth) {
    return this._withDateTimeOffset(this._dateTime.withDayOfMonth(dayOfMonth), this._offset);
  };

  _proto.withDayOfYear = function withDayOfYear(dayOfYear) {
    return this._withDateTimeOffset(this._dateTime.withDayOfYear(dayOfYear), this._offset);
  };

  _proto.withHour = function withHour(hour) {
    return this._withDateTimeOffset(this._dateTime.withHour(hour), this._offset);
  };

  _proto.withMinute = function withMinute(minute) {
    return this._withDateTimeOffset(this._dateTime.withMinute(minute), this._offset);
  };

  _proto.withSecond = function withSecond(second) {
    return this._withDateTimeOffset(this._dateTime.withSecond(second), this._offset);
  };

  _proto.withNano = function withNano(nanoOfSecond) {
    return this._withDateTimeOffset(this._dateTime.withNano(nanoOfSecond), this._offset);
  };

  _proto.withOffsetSameLocal = function withOffsetSameLocal(offset) {
    requireNonNull(offset, 'offset');
    return this._withDateTimeOffset(this._dateTime, offset);
  };

  _proto.withOffsetSameInstant = function withOffsetSameInstant(offset) {
    requireNonNull(offset, 'offset');

    if (offset.equals(this._offset)) {
      return this;
    }

    var difference = offset.totalSeconds() - this._offset.totalSeconds();

    var adjusted = this._dateTime.plusSeconds(difference);

    return new OffsetDateTime(adjusted, offset);
  };

  _proto.truncatedTo = function truncatedTo(unit) {
    return this._withDateTimeOffset(this._dateTime.truncatedTo(unit), this._offset);
  };

  _proto._plusAmount = function _plusAmount(amount) {
    requireNonNull(amount, 'amount');
    return amount.addTo(this);
  };

  _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
    if (unit instanceof ChronoUnit) {
      return this._withDateTimeOffset(this._dateTime.plus(amountToAdd, unit), this._offset);
    }

    return unit.addTo(this, amountToAdd);
  };

  _proto.plusYears = function plusYears(years) {
    return this._withDateTimeOffset(this._dateTime.plusYears(years), this._offset);
  };

  _proto.plusMonths = function plusMonths(months) {
    return this._withDateTimeOffset(this._dateTime.plusMonths(months), this._offset);
  };

  _proto.plusWeeks = function plusWeeks(weeks) {
    return this._withDateTimeOffset(this._dateTime.plusWeeks(weeks), this._offset);
  };

  _proto.plusDays = function plusDays(days) {
    return this._withDateTimeOffset(this._dateTime.plusDays(days), this._offset);
  };

  _proto.plusHours = function plusHours(hours) {
    return this._withDateTimeOffset(this._dateTime.plusHours(hours), this._offset);
  };

  _proto.plusMinutes = function plusMinutes(minutes) {
    return this._withDateTimeOffset(this._dateTime.plusMinutes(minutes), this._offset);
  };

  _proto.plusSeconds = function plusSeconds(seconds) {
    return this._withDateTimeOffset(this._dateTime.plusSeconds(seconds), this._offset);
  };

  _proto.plusNanos = function plusNanos(nanos) {
    return this._withDateTimeOffset(this._dateTime.plusNanos(nanos), this._offset);
  };

  _proto._minusAmount = function _minusAmount(amount) {
    requireNonNull(amount);
    return amount.subtractFrom(this);
  };

  _proto._minusUnit = function _minusUnit(amountToSubtract, unit) {
    return this.plus(-1 * amountToSubtract, unit);
  };

  _proto.minusYears = function minusYears(years) {
    return this._withDateTimeOffset(this._dateTime.minusYears(years), this._offset);
  };

  _proto.minusMonths = function minusMonths(months) {
    return this._withDateTimeOffset(this._dateTime.minusMonths(months), this._offset);
  };

  _proto.minusWeeks = function minusWeeks(weeks) {
    return this._withDateTimeOffset(this._dateTime.minusWeeks(weeks), this._offset);
  };

  _proto.minusDays = function minusDays(days) {
    return this._withDateTimeOffset(this._dateTime.minusDays(days), this._offset);
  };

  _proto.minusHours = function minusHours(hours) {
    return this._withDateTimeOffset(this._dateTime.minusHours(hours), this._offset);
  };

  _proto.minusMinutes = function minusMinutes(minutes) {
    return this._withDateTimeOffset(this._dateTime.minusMinutes(minutes), this._offset);
  };

  _proto.minusSeconds = function minusSeconds(seconds) {
    return this._withDateTimeOffset(this._dateTime.minusSeconds(seconds), this._offset);
  };

  _proto.minusNanos = function minusNanos(nanos) {
    return this._withDateTimeOffset(this._dateTime.minusNanos(nanos), this._offset);
  };

  _proto.compareTo = function compareTo(other) {
    requireNonNull(other, 'other');
    requireInstance(other, OffsetDateTime, 'other');

    if (this.offset().equals(other.offset())) {
      return this.toLocalDateTime().compareTo(other.toLocalDateTime());
    }

    var cmp = MathUtil.compareNumbers(this.toEpochSecond(), other.toEpochSecond());

    if (cmp === 0) {
      cmp = this.toLocalTime().nano() - other.toLocalTime().nano();

      if (cmp === 0) {
        cmp = this.toLocalDateTime().compareTo(other.toLocalDateTime());
      }
    }

    return cmp;
  };

  _proto.isAfter = function isAfter(other) {
    requireNonNull(other, 'other');
    var thisEpochSec = this.toEpochSecond();
    var otherEpochSec = other.toEpochSecond();
    return thisEpochSec > otherEpochSec || thisEpochSec === otherEpochSec && this.toLocalTime().nano() > other.toLocalTime().nano();
  };

  _proto.isBefore = function isBefore(other) {
    requireNonNull(other, 'other');
    var thisEpochSec = this.toEpochSecond();
    var otherEpochSec = other.toEpochSecond();
    return thisEpochSec < otherEpochSec || thisEpochSec === otherEpochSec && this.toLocalTime().nano() < other.toLocalTime().nano();
  };

  _proto.isEqual = function isEqual(other) {
    requireNonNull(other, 'other');
    return this.toEpochSecond() === other.toEpochSecond() && this.toLocalTime().nano() === other.toLocalTime().nano();
  };

  _proto.equals = function equals(other) {
    if (this === other) {
      return true;
    }

    if (other instanceof OffsetDateTime) {
      return this._dateTime.equals(other._dateTime) && this._offset.equals(other._offset);
    }

    return false;
  };

  _proto.hashCode = function hashCode() {
    return this._dateTime.hashCode() ^ this._offset.hashCode();
  };

  _proto.toString = function toString() {
    return this._dateTime.toString() + this._offset.toString();
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  _proto.format = function format(formatter) {
    requireNonNull(formatter, 'formatter');
    return formatter.format(this);
  };

  return OffsetDateTime;
}(Temporal);
function _init$6() {
  OffsetDateTime.MIN = LocalDateTime.MIN.atOffset(ZoneOffset.MAX);
  OffsetDateTime.MAX = LocalDateTime.MAX.atOffset(ZoneOffset.MIN);
  OffsetDateTime.FROM = createTemporalQuery('OffsetDateTime.FROM', function (temporal) {
    return OffsetDateTime.from(temporal);
  });
}

var DAYS_PER_CYCLE = 146097;
var DAYS_0000_TO_1970 = DAYS_PER_CYCLE * 5 - (30 * 365 + 7);
var LocalDate = function (_ChronoLocalDate) {
  _inheritsLoose(LocalDate, _ChronoLocalDate);

  LocalDate.now = function now(clockOrZone) {
    var clock;

    if (clockOrZone == null) {
      clock = Clock.systemDefaultZone();
    } else if (clockOrZone instanceof ZoneId) {
      clock = Clock.system(clockOrZone);
    } else {
      clock = clockOrZone;
    }

    return LocalDate.ofInstant(clock.instant(), clock.zone());
  };

  LocalDate.ofInstant = function ofInstant(instant, zone) {
    if (zone === void 0) {
      zone = ZoneId.systemDefault();
    }

    requireNonNull(instant, 'instant');
    var offset = zone.rules().offset(instant);
    var epochSec = instant.epochSecond() + offset.totalSeconds();
    var epochDay = MathUtil.floorDiv(epochSec, LocalTime.SECONDS_PER_DAY);
    return LocalDate.ofEpochDay(epochDay);
  };

  LocalDate.of = function of(year, month, dayOfMonth) {
    return new LocalDate(year, month, dayOfMonth);
  };

  LocalDate.ofYearDay = function ofYearDay(year, dayOfYear) {
    ChronoField.YEAR.checkValidValue(year);
    var leap = IsoChronology.isLeapYear(year);

    if (dayOfYear === 366 && leap === false) {
      assert(false, "Invalid date 'DayOfYear 366' as '" + year + "' is not a leap year", DateTimeException);
    }

    var moy = Month.of(Math.floor((dayOfYear - 1) / 31 + 1));
    var monthEnd = moy.firstDayOfYear(leap) + moy.length(leap) - 1;

    if (dayOfYear > monthEnd) {
      moy = moy.plus(1);
    }

    var dom = dayOfYear - moy.firstDayOfYear(leap) + 1;
    return new LocalDate(year, moy.value(), dom);
  };

  LocalDate.ofEpochDay = function ofEpochDay(epochDay) {
    if (epochDay === void 0) {
      epochDay = 0;
    }

    var adjust, adjustCycles, doyEst, yearEst, zeroDay;
    zeroDay = epochDay + DAYS_0000_TO_1970;
    zeroDay -= 60;
    adjust = 0;

    if (zeroDay < 0) {
      adjustCycles = MathUtil.intDiv(zeroDay + 1, DAYS_PER_CYCLE) - 1;
      adjust = adjustCycles * 400;
      zeroDay += -adjustCycles * DAYS_PER_CYCLE;
    }

    yearEst = MathUtil.intDiv(400 * zeroDay + 591, DAYS_PER_CYCLE);
    doyEst = zeroDay - (365 * yearEst + MathUtil.intDiv(yearEst, 4) - MathUtil.intDiv(yearEst, 100) + MathUtil.intDiv(yearEst, 400));

    if (doyEst < 0) {
      yearEst--;
      doyEst = zeroDay - (365 * yearEst + MathUtil.intDiv(yearEst, 4) - MathUtil.intDiv(yearEst, 100) + MathUtil.intDiv(yearEst, 400));
    }

    yearEst += adjust;
    var marchDoy0 = doyEst;
    var marchMonth0 = MathUtil.intDiv(marchDoy0 * 5 + 2, 153);
    var month = (marchMonth0 + 2) % 12 + 1;
    var dom = marchDoy0 - MathUtil.intDiv(marchMonth0 * 306 + 5, 10) + 1;
    yearEst += MathUtil.intDiv(marchMonth0, 10);
    var year = yearEst;
    return new LocalDate(year, month, dom);
  };

  LocalDate.from = function from(temporal) {
    requireNonNull(temporal, 'temporal');
    var date = temporal.query(TemporalQueries.localDate());

    if (date == null) {
      throw new DateTimeException("Unable to obtain LocalDate from TemporalAccessor: " + temporal + ", type " + (temporal.constructor != null ? temporal.constructor.name : ''));
    }

    return date;
  };

  LocalDate.parse = function parse(text, formatter) {
    if (formatter === void 0) {
      formatter = DateTimeFormatter.ISO_LOCAL_DATE;
    }

    assert(formatter != null, 'formatter', NullPointerException);
    return formatter.parse(text, LocalDate.FROM);
  };

  LocalDate._resolvePreviousValid = function _resolvePreviousValid(year, month, day) {
    switch (month) {
      case 2:
        day = Math.min(day, IsoChronology.isLeapYear(year) ? 29 : 28);
        break;

      case 4:
      case 6:
      case 9:
      case 11:
        day = Math.min(day, 30);
        break;
    }

    return LocalDate.of(year, month, day);
  };

  function LocalDate(year, month, dayOfMonth) {
    var _this;

    _this = _ChronoLocalDate.call(this) || this;
    requireNonNull(year, 'year');
    requireNonNull(month, 'month');
    requireNonNull(dayOfMonth, 'dayOfMonth');

    if (month instanceof Month) {
      month = month.value();
    }

    _this._year = MathUtil.safeToInt(year);
    _this._month = MathUtil.safeToInt(month);
    _this._day = MathUtil.safeToInt(dayOfMonth);

    LocalDate._validate(_this._year, _this._month, _this._day);

    return _this;
  }

  LocalDate._validate = function _validate(year, month, dayOfMonth) {
    var dom;
    ChronoField.YEAR.checkValidValue(year);
    ChronoField.MONTH_OF_YEAR.checkValidValue(month);
    ChronoField.DAY_OF_MONTH.checkValidValue(dayOfMonth);

    if (dayOfMonth > 28) {
      dom = 31;

      switch (month) {
        case 2:
          dom = IsoChronology.isLeapYear(year) ? 29 : 28;
          break;

        case 4:
        case 6:
        case 9:
        case 11:
          dom = 30;
      }

      if (dayOfMonth > dom) {
        if (dayOfMonth === 29) {
          assert(false, "Invalid date 'February 29' as '" + year + "' is not a leap year", DateTimeException);
        } else {
          assert(false, "Invalid date '" + year + "' '" + month + "' '" + dayOfMonth + "'", DateTimeException);
        }
      }
    }
  };

  var _proto = LocalDate.prototype;

  _proto.isSupported = function isSupported(field) {
    return _ChronoLocalDate.prototype.isSupported.call(this, field);
  };

  _proto.range = function range(field) {
    if (field instanceof ChronoField) {
      if (field.isDateBased()) {
        switch (field) {
          case ChronoField.DAY_OF_MONTH:
            return ValueRange.of(1, this.lengthOfMonth());

          case ChronoField.DAY_OF_YEAR:
            return ValueRange.of(1, this.lengthOfYear());

          case ChronoField.ALIGNED_WEEK_OF_MONTH:
            return ValueRange.of(1, this.month() === Month.FEBRUARY && this.isLeapYear() === false ? 4 : 5);

          case ChronoField.YEAR_OF_ERA:
            return this._year <= 0 ? ValueRange.of(1, Year.MAX_VALUE + 1) : ValueRange.of(1, Year.MAX_VALUE);
        }

        return field.range();
      }

      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.rangeRefinedBy(this);
  };

  _proto.get = function get(field) {
    return this.getLong(field);
  };

  _proto.getLong = function getLong(field) {
    assert(field != null, '', NullPointerException);

    if (field instanceof ChronoField) {
      return this._get0(field);
    }

    return field.getFrom(this);
  };

  _proto._get0 = function _get0(field) {
    switch (field) {
      case ChronoField.DAY_OF_WEEK:
        return this.dayOfWeek().value();

      case ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH:
        return MathUtil.intMod(this._day - 1, 7) + 1;

      case ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR:
        return MathUtil.intMod(this.dayOfYear() - 1, 7) + 1;

      case ChronoField.DAY_OF_MONTH:
        return this._day;

      case ChronoField.DAY_OF_YEAR:
        return this.dayOfYear();

      case ChronoField.EPOCH_DAY:
        return this.toEpochDay();

      case ChronoField.ALIGNED_WEEK_OF_MONTH:
        return MathUtil.intDiv(this._day - 1, 7) + 1;

      case ChronoField.ALIGNED_WEEK_OF_YEAR:
        return MathUtil.intDiv(this.dayOfYear() - 1, 7) + 1;

      case ChronoField.MONTH_OF_YEAR:
        return this._month;

      case ChronoField.PROLEPTIC_MONTH:
        return this._prolepticMonth();

      case ChronoField.YEAR_OF_ERA:
        return this._year >= 1 ? this._year : 1 - this._year;

      case ChronoField.YEAR:
        return this._year;

      case ChronoField.ERA:
        return this._year >= 1 ? 1 : 0;
    }

    throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
  };

  _proto._prolepticMonth = function _prolepticMonth() {
    return this._year * 12 + (this._month - 1);
  };

  _proto.chronology = function chronology() {
    return IsoChronology.INSTANCE;
  };

  _proto.year = function year() {
    return this._year;
  };

  _proto.monthValue = function monthValue() {
    return this._month;
  };

  _proto.month = function month() {
    return Month.of(this._month);
  };

  _proto.dayOfMonth = function dayOfMonth() {
    return this._day;
  };

  _proto.dayOfYear = function dayOfYear() {
    return this.month().firstDayOfYear(this.isLeapYear()) + this._day - 1;
  };

  _proto.dayOfWeek = function dayOfWeek() {
    var dow0 = MathUtil.floorMod(this.toEpochDay() + 3, 7);
    return DayOfWeek.of(dow0 + 1);
  };

  _proto.isLeapYear = function isLeapYear() {
    return IsoChronology.isLeapYear(this._year);
  };

  _proto.lengthOfMonth = function lengthOfMonth() {
    switch (this._month) {
      case 2:
        return this.isLeapYear() ? 29 : 28;

      case 4:
      case 6:
      case 9:
      case 11:
        return 30;

      default:
        return 31;
    }
  };

  _proto.lengthOfYear = function lengthOfYear() {
    return this.isLeapYear() ? 366 : 365;
  };

  _proto._withAdjuster = function _withAdjuster(adjuster) {
    requireNonNull(adjuster, 'adjuster');

    if (adjuster instanceof LocalDate) {
      return adjuster;
    }

    return _ChronoLocalDate.prototype._withAdjuster.call(this, adjuster);
  };

  _proto._withField = function _withField(field, newValue) {
    assert(field != null, 'field', NullPointerException);

    if (field instanceof ChronoField) {
      var f = field;
      f.checkValidValue(newValue);

      switch (f) {
        case ChronoField.DAY_OF_WEEK:
          return this.plusDays(newValue - this.dayOfWeek().value());

        case ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH:
          return this.plusDays(newValue - this.getLong(ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH));

        case ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR:
          return this.plusDays(newValue - this.getLong(ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR));

        case ChronoField.DAY_OF_MONTH:
          return this.withDayOfMonth(newValue);

        case ChronoField.DAY_OF_YEAR:
          return this.withDayOfYear(newValue);

        case ChronoField.EPOCH_DAY:
          return LocalDate.ofEpochDay(newValue);

        case ChronoField.ALIGNED_WEEK_OF_MONTH:
          return this.plusWeeks(newValue - this.getLong(ChronoField.ALIGNED_WEEK_OF_MONTH));

        case ChronoField.ALIGNED_WEEK_OF_YEAR:
          return this.plusWeeks(newValue - this.getLong(ChronoField.ALIGNED_WEEK_OF_YEAR));

        case ChronoField.MONTH_OF_YEAR:
          return this.withMonth(newValue);

        case ChronoField.PROLEPTIC_MONTH:
          return this.plusMonths(newValue - this.getLong(ChronoField.PROLEPTIC_MONTH));

        case ChronoField.YEAR_OF_ERA:
          return this.withYear(this._year >= 1 ? newValue : 1 - newValue);

        case ChronoField.YEAR:
          return this.withYear(newValue);

        case ChronoField.ERA:
          return this.getLong(ChronoField.ERA) === newValue ? this : this.withYear(1 - this._year);
      }

      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.adjustInto(this, newValue);
  };

  _proto.withYear = function withYear(year) {
    if (this._year === year) {
      return this;
    }

    ChronoField.YEAR.checkValidValue(year);
    return LocalDate._resolvePreviousValid(year, this._month, this._day);
  };

  _proto.withMonth = function withMonth(month) {
    var m = month instanceof Month ? month.value() : month;

    if (this._month === m) {
      return this;
    }

    ChronoField.MONTH_OF_YEAR.checkValidValue(m);
    return LocalDate._resolvePreviousValid(this._year, m, this._day);
  };

  _proto.withDayOfMonth = function withDayOfMonth(dayOfMonth) {
    if (this._day === dayOfMonth) {
      return this;
    }

    return LocalDate.of(this._year, this._month, dayOfMonth);
  };

  _proto.withDayOfYear = function withDayOfYear(dayOfYear) {
    if (this.dayOfYear() === dayOfYear) {
      return this;
    }

    return LocalDate.ofYearDay(this._year, dayOfYear);
  };

  _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
    requireNonNull(amountToAdd, 'amountToAdd');
    requireNonNull(unit, 'unit');

    if (unit instanceof ChronoUnit) {
      switch (unit) {
        case ChronoUnit.DAYS:
          return this.plusDays(amountToAdd);

        case ChronoUnit.WEEKS:
          return this.plusWeeks(amountToAdd);

        case ChronoUnit.MONTHS:
          return this.plusMonths(amountToAdd);

        case ChronoUnit.YEARS:
          return this.plusYears(amountToAdd);

        case ChronoUnit.DECADES:
          return this.plusYears(MathUtil.safeMultiply(amountToAdd, 10));

        case ChronoUnit.CENTURIES:
          return this.plusYears(MathUtil.safeMultiply(amountToAdd, 100));

        case ChronoUnit.MILLENNIA:
          return this.plusYears(MathUtil.safeMultiply(amountToAdd, 1000));

        case ChronoUnit.ERAS:
          return this.with(ChronoField.ERA, MathUtil.safeAdd(this.getLong(ChronoField.ERA), amountToAdd));
      }

      throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
    }

    return unit.addTo(this, amountToAdd);
  };

  _proto.plusYears = function plusYears(yearsToAdd) {
    if (yearsToAdd === 0) {
      return this;
    }

    var newYear = ChronoField.YEAR.checkValidIntValue(this._year + yearsToAdd);
    return LocalDate._resolvePreviousValid(newYear, this._month, this._day);
  };

  _proto.plusMonths = function plusMonths(monthsToAdd) {
    if (monthsToAdd === 0) {
      return this;
    }

    var monthCount = this._year * 12 + (this._month - 1);
    var calcMonths = monthCount + monthsToAdd;
    var newYear = ChronoField.YEAR.checkValidIntValue(MathUtil.floorDiv(calcMonths, 12));
    var newMonth = MathUtil.floorMod(calcMonths, 12) + 1;
    return LocalDate._resolvePreviousValid(newYear, newMonth, this._day);
  };

  _proto.plusWeeks = function plusWeeks(weeksToAdd) {
    return this.plusDays(MathUtil.safeMultiply(weeksToAdd, 7));
  };

  _proto.plusDays = function plusDays(daysToAdd) {
    if (daysToAdd === 0) {
      return this;
    }

    var mjDay = MathUtil.safeAdd(this.toEpochDay(), daysToAdd);
    return LocalDate.ofEpochDay(mjDay);
  };

  _proto._minusUnit = function _minusUnit(amountToSubtract, unit) {
    requireNonNull(amountToSubtract, 'amountToSubtract');
    requireNonNull(unit, 'unit');
    return this._plusUnit(-1 * amountToSubtract, unit);
  };

  _proto.minusYears = function minusYears(yearsToSubtract) {
    return this.plusYears(yearsToSubtract * -1);
  };

  _proto.minusMonths = function minusMonths(monthsToSubtract) {
    return this.plusMonths(monthsToSubtract * -1);
  };

  _proto.minusWeeks = function minusWeeks(weeksToSubtract) {
    return this.plusWeeks(weeksToSubtract * -1);
  };

  _proto.minusDays = function minusDays(daysToSubtract) {
    return this.plusDays(daysToSubtract * -1);
  };

  _proto.query = function query(_query) {
    requireNonNull(_query, 'query');

    if (_query === TemporalQueries.localDate()) {
      return this;
    }

    return _ChronoLocalDate.prototype.query.call(this, _query);
  };

  _proto.adjustInto = function adjustInto(temporal) {
    return _ChronoLocalDate.prototype.adjustInto.call(this, temporal);
  };

  _proto.until = function until(p1, p2) {
    if (arguments.length < 2) {
      return this.until1(p1);
    } else {
      return this.until2(p1, p2);
    }
  };

  _proto.until2 = function until2(endExclusive, unit) {
    var end = LocalDate.from(endExclusive);

    if (unit instanceof ChronoUnit) {
      switch (unit) {
        case ChronoUnit.DAYS:
          return this.daysUntil(end);

        case ChronoUnit.WEEKS:
          return MathUtil.intDiv(this.daysUntil(end), 7);

        case ChronoUnit.MONTHS:
          return this._monthsUntil(end);

        case ChronoUnit.YEARS:
          return MathUtil.intDiv(this._monthsUntil(end), 12);

        case ChronoUnit.DECADES:
          return MathUtil.intDiv(this._monthsUntil(end), 120);

        case ChronoUnit.CENTURIES:
          return MathUtil.intDiv(this._monthsUntil(end), 1200);

        case ChronoUnit.MILLENNIA:
          return MathUtil.intDiv(this._monthsUntil(end), 12000);

        case ChronoUnit.ERAS:
          return end.getLong(ChronoField.ERA) - this.getLong(ChronoField.ERA);
      }

      throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
    }

    return unit.between(this, end);
  };

  _proto.daysUntil = function daysUntil(end) {
    return end.toEpochDay() - this.toEpochDay();
  };

  _proto._monthsUntil = function _monthsUntil(end) {
    var packed1 = this._prolepticMonth() * 32 + this.dayOfMonth();
    var packed2 = end._prolepticMonth() * 32 + end.dayOfMonth();
    return MathUtil.intDiv(packed2 - packed1, 32);
  };

  _proto.until1 = function until1(endDate) {
    var end = LocalDate.from(endDate);

    var totalMonths = end._prolepticMonth() - this._prolepticMonth();

    var days = end._day - this._day;

    if (totalMonths > 0 && days < 0) {
      totalMonths--;
      var calcDate = this.plusMonths(totalMonths);
      days = end.toEpochDay() - calcDate.toEpochDay();
    } else if (totalMonths < 0 && days > 0) {
      totalMonths++;
      days -= end.lengthOfMonth();
    }

    var years = MathUtil.intDiv(totalMonths, 12);
    var months = MathUtil.intMod(totalMonths, 12);
    return Period.of(years, months, days);
  };

  _proto.atTime = function atTime() {
    if (arguments.length === 1) {
      return this.atTime1.apply(this, arguments);
    } else {
      return this.atTime4.apply(this, arguments);
    }
  };

  _proto.atTime1 = function atTime1(time) {
    requireNonNull(time, 'time');

    if (time instanceof LocalTime) {
      return LocalDateTime.of(this, time);
    } else if (time instanceof OffsetTime) {
      return this._atTimeOffsetTime(time);
    } else {
      throw new IllegalArgumentException("time must be an instance of LocalTime or OffsetTime" + (time && time.constructor && time.constructor.name ? ", but is " + time.constructor.name : ''));
    }
  };

  _proto.atTime4 = function atTime4(hour, minute, second, nanoOfSecond) {
    if (second === void 0) {
      second = 0;
    }

    if (nanoOfSecond === void 0) {
      nanoOfSecond = 0;
    }

    return this.atTime1(LocalTime.of(hour, minute, second, nanoOfSecond));
  };

  _proto._atTimeOffsetTime = function _atTimeOffsetTime(time) {
    return OffsetDateTime.of(LocalDateTime.of(this, time.toLocalTime()), time.offset());
  };

  _proto.atStartOfDay = function atStartOfDay(zone) {
    if (zone != null) {
      return this._atStartOfDayWithZone(zone);
    } else {
      return LocalDateTime.of(this, LocalTime.MIDNIGHT);
    }
  };

  _proto._atStartOfDayWithZone = function _atStartOfDayWithZone(zone) {
    requireNonNull(zone, 'zone');
    var ldt = this.atTime(LocalTime.MIDNIGHT);

    if (zone instanceof ZoneOffset === false) {
      var trans = zone.rules().transition(ldt);

      if (trans != null && trans.isGap()) {
        ldt = trans.dateTimeAfter();
      }
    }

    return ZonedDateTime.of(ldt, zone);
  };

  _proto.toEpochDay = function toEpochDay() {
    var y = this._year;
    var m = this._month;
    var total = 0;
    total += 365 * y;

    if (y >= 0) {
      total += MathUtil.intDiv(y + 3, 4) - MathUtil.intDiv(y + 99, 100) + MathUtil.intDiv(y + 399, 400);
    } else {
      total -= MathUtil.intDiv(y, -4) - MathUtil.intDiv(y, -100) + MathUtil.intDiv(y, -400);
    }

    total += MathUtil.intDiv(367 * m - 362, 12);
    total += this.dayOfMonth() - 1;

    if (m > 2) {
      total--;

      if (!IsoChronology.isLeapYear(y)) {
        total--;
      }
    }

    return total - DAYS_0000_TO_1970;
  };

  _proto.compareTo = function compareTo(other) {
    requireNonNull(other, 'other');
    requireInstance(other, LocalDate, 'other');
    return this._compareTo0(other);
  };

  _proto._compareTo0 = function _compareTo0(otherDate) {
    var cmp = this._year - otherDate._year;

    if (cmp === 0) {
      cmp = this._month - otherDate._month;

      if (cmp === 0) {
        cmp = this._day - otherDate._day;
      }
    }

    return cmp;
  };

  _proto.isAfter = function isAfter(other) {
    return this.compareTo(other) > 0;
  };

  _proto.isBefore = function isBefore(other) {
    return this.compareTo(other) < 0;
  };

  _proto.isEqual = function isEqual(other) {
    return this.compareTo(other) === 0;
  };

  _proto.equals = function equals(other) {
    if (this === other) {
      return true;
    }

    if (other instanceof LocalDate) {
      return this._compareTo0(other) === 0;
    }

    return false;
  };

  _proto.hashCode = function hashCode() {
    var yearValue = this._year;
    var monthValue = this._month;
    var dayValue = this._day;
    return MathUtil.hash(yearValue & 0xFFFFF800 ^ (yearValue << 11) + (monthValue << 6) + dayValue);
  };

  _proto.toString = function toString() {
    var dayString, monthString, yearString;
    var yearValue = this._year;
    var monthValue = this._month;
    var dayValue = this._day;
    var absYear = Math.abs(yearValue);

    if (absYear < 1000) {
      if (yearValue < 0) {
        yearString = "-" + ("" + (yearValue - 10000)).slice(-4);
      } else {
        yearString = ("" + (yearValue + 10000)).slice(-4);
      }
    } else {
      if (yearValue > 9999) {
        yearString = "+" + yearValue;
      } else {
        yearString = "" + yearValue;
      }
    }

    if (monthValue < 10) {
      monthString = "-0" + monthValue;
    } else {
      monthString = "-" + monthValue;
    }

    if (dayValue < 10) {
      dayString = "-0" + dayValue;
    } else {
      dayString = "-" + dayValue;
    }

    return yearString + monthString + dayString;
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  _proto.format = function format(formatter) {
    requireNonNull(formatter, 'formatter');
    requireInstance(formatter, DateTimeFormatter, 'formatter');
    return _ChronoLocalDate.prototype.format.call(this, formatter);
  };

  return LocalDate;
}(ChronoLocalDate);
function _init$5() {
  LocalDate.MIN = LocalDate.of(YearConstants.MIN_VALUE, 1, 1);
  LocalDate.MAX = LocalDate.of(YearConstants.MAX_VALUE, 12, 31);
  LocalDate.EPOCH_0 = LocalDate.ofEpochDay(0);
  LocalDate.FROM = createTemporalQuery('LocalDate.FROM', function (temporal) {
    return LocalDate.from(temporal);
  });
}

var ChronoLocalDateTime = function (_Temporal) {
  _inheritsLoose(ChronoLocalDateTime, _Temporal);

  function ChronoLocalDateTime() {
    return _Temporal.apply(this, arguments) || this;
  }

  var _proto = ChronoLocalDateTime.prototype;

  _proto.chronology = function chronology() {
    return this.toLocalDate().chronology();
  };

  _proto.query = function query(_query) {
    if (_query === TemporalQueries.chronology()) {
      return this.chronology();
    } else if (_query === TemporalQueries.precision()) {
      return ChronoUnit.NANOS;
    } else if (_query === TemporalQueries.localDate()) {
      return LocalDate.ofEpochDay(this.toLocalDate().toEpochDay());
    } else if (_query === TemporalQueries.localTime()) {
      return this.toLocalTime();
    } else if (_query === TemporalQueries.zone() || _query === TemporalQueries.zoneId() || _query === TemporalQueries.offset()) {
      return null;
    }

    return _Temporal.prototype.query.call(this, _query);
  };

  _proto.adjustInto = function adjustInto(temporal) {
    return temporal.with(ChronoField.EPOCH_DAY, this.toLocalDate().toEpochDay()).with(ChronoField.NANO_OF_DAY, this.toLocalTime().toNanoOfDay());
  };

  _proto.toInstant = function toInstant(offset) {
    requireInstance(offset, ZoneOffset, 'zoneId');
    return Instant.ofEpochSecond(this.toEpochSecond(offset), this.toLocalTime().nano());
  };

  _proto.toEpochSecond = function toEpochSecond(offset) {
    requireNonNull(offset, 'offset');
    var epochDay = this.toLocalDate().toEpochDay();
    var secs = epochDay * 86400 + this.toLocalTime().toSecondOfDay();
    secs -= offset.totalSeconds();
    return MathUtil.safeToInt(secs);
  };

  return ChronoLocalDateTime;
}(Temporal);

var LocalDateTime = function (_ChronoLocalDateTime) {
  _inheritsLoose(LocalDateTime, _ChronoLocalDateTime);

  LocalDateTime.now = function now(clockOrZone) {
    if (clockOrZone == null) {
      return LocalDateTime._now(Clock.systemDefaultZone());
    } else if (clockOrZone instanceof Clock) {
      return LocalDateTime._now(clockOrZone);
    } else {
      return LocalDateTime._now(Clock.system(clockOrZone));
    }
  };

  LocalDateTime._now = function _now(clock) {
    requireNonNull(clock, 'clock');
    return LocalDateTime.ofInstant(clock.instant(), clock.zone());
  };

  LocalDateTime._ofEpochMillis = function _ofEpochMillis(epochMilli, offset) {
    var localSecond = MathUtil.floorDiv(epochMilli, 1000) + offset.totalSeconds();
    var localEpochDay = MathUtil.floorDiv(localSecond, LocalTime.SECONDS_PER_DAY);
    var secsOfDay = MathUtil.floorMod(localSecond, LocalTime.SECONDS_PER_DAY);
    var nanoOfSecond = MathUtil.floorMod(epochMilli, 1000) * 1000000;
    var date = LocalDate.ofEpochDay(localEpochDay);
    var time = LocalTime.ofSecondOfDay(secsOfDay, nanoOfSecond);
    return new LocalDateTime(date, time);
  };

  LocalDateTime.of = function of() {
    if (arguments.length <= 2) {
      return LocalDateTime.ofDateAndTime.apply(this, arguments);
    } else {
      return LocalDateTime.ofNumbers.apply(this, arguments);
    }
  };

  LocalDateTime.ofNumbers = function ofNumbers(year, month, dayOfMonth, hour, minute, second, nanoOfSecond) {
    if (hour === void 0) {
      hour = 0;
    }

    if (minute === void 0) {
      minute = 0;
    }

    if (second === void 0) {
      second = 0;
    }

    if (nanoOfSecond === void 0) {
      nanoOfSecond = 0;
    }

    var date = LocalDate.of(year, month, dayOfMonth);
    var time = LocalTime.of(hour, minute, second, nanoOfSecond);
    return new LocalDateTime(date, time);
  };

  LocalDateTime.ofDateAndTime = function ofDateAndTime(date, time) {
    requireNonNull(date, 'date');
    requireNonNull(time, 'time');
    return new LocalDateTime(date, time);
  };

  LocalDateTime.ofInstant = function ofInstant(instant, zone) {
    if (zone === void 0) {
      zone = ZoneId.systemDefault();
    }

    requireNonNull(instant, 'instant');
    requireInstance(instant, Instant, 'instant');
    requireNonNull(zone, 'zone');
    var offset = zone.rules().offset(instant);
    return LocalDateTime.ofEpochSecond(instant.epochSecond(), instant.nano(), offset);
  };

  LocalDateTime.ofEpochSecond = function ofEpochSecond(epochSecond, nanoOfSecond, offset) {
    if (epochSecond === void 0) {
      epochSecond = 0;
    }

    if (nanoOfSecond === void 0) {
      nanoOfSecond = 0;
    }

    if (arguments.length === 2 && nanoOfSecond instanceof ZoneOffset) {
      offset = nanoOfSecond;
      nanoOfSecond = 0;
    }

    requireNonNull(offset, 'offset');
    var localSecond = epochSecond + offset.totalSeconds();
    var localEpochDay = MathUtil.floorDiv(localSecond, LocalTime.SECONDS_PER_DAY);
    var secsOfDay = MathUtil.floorMod(localSecond, LocalTime.SECONDS_PER_DAY);
    var date = LocalDate.ofEpochDay(localEpochDay);
    var time = LocalTime.ofSecondOfDay(secsOfDay, nanoOfSecond);
    return new LocalDateTime(date, time);
  };

  LocalDateTime.from = function from(temporal) {
    requireNonNull(temporal, 'temporal');

    if (temporal instanceof LocalDateTime) {
      return temporal;
    } else if (temporal instanceof ZonedDateTime) {
      return temporal.toLocalDateTime();
    }

    try {
      var date = LocalDate.from(temporal);
      var time = LocalTime.from(temporal);
      return new LocalDateTime(date, time);
    } catch (ex) {
      throw new DateTimeException("Unable to obtain LocalDateTime TemporalAccessor: " + temporal + ", type " + (temporal.constructor != null ? temporal.constructor.name : ''));
    }
  };

  LocalDateTime.parse = function parse(text, formatter) {
    if (formatter === void 0) {
      formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
    }

    requireNonNull(formatter, 'formatter');
    return formatter.parse(text, LocalDateTime.FROM);
  };

  function LocalDateTime(date, time) {
    var _this;

    _this = _ChronoLocalDateTime.call(this) || this;
    requireInstance(date, LocalDate, 'date');
    requireInstance(time, LocalTime, 'time');
    _this._date = date;
    _this._time = time;
    return _this;
  }

  var _proto = LocalDateTime.prototype;

  _proto._withDateTime = function _withDateTime(newDate, newTime) {
    if (this._date.equals(newDate) && this._time.equals(newTime)) {
      return this;
    }

    return new LocalDateTime(newDate, newTime);
  };

  _proto.isSupported = function isSupported(fieldOrUnit) {
    if (fieldOrUnit instanceof ChronoField) {
      return fieldOrUnit.isDateBased() || fieldOrUnit.isTimeBased();
    } else if (fieldOrUnit instanceof ChronoUnit) {
      return fieldOrUnit.isDateBased() || fieldOrUnit.isTimeBased();
    }

    return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
  };

  _proto.range = function range(field) {
    if (field instanceof ChronoField) {
      return field.isTimeBased() ? this._time.range(field) : this._date.range(field);
    }

    return field.rangeRefinedBy(this);
  };

  _proto.get = function get(field) {
    if (field instanceof ChronoField) {
      return field.isTimeBased() ? this._time.get(field) : this._date.get(field);
    }

    return _ChronoLocalDateTime.prototype.get.call(this, field);
  };

  _proto.getLong = function getLong(field) {
    requireNonNull(field, 'field');

    if (field instanceof ChronoField) {
      return field.isTimeBased() ? this._time.getLong(field) : this._date.getLong(field);
    }

    return field.getFrom(this);
  };

  _proto.year = function year() {
    return this._date.year();
  };

  _proto.monthValue = function monthValue() {
    return this._date.monthValue();
  };

  _proto.month = function month() {
    return this._date.month();
  };

  _proto.dayOfMonth = function dayOfMonth() {
    return this._date.dayOfMonth();
  };

  _proto.dayOfYear = function dayOfYear() {
    return this._date.dayOfYear();
  };

  _proto.dayOfWeek = function dayOfWeek() {
    return this._date.dayOfWeek();
  };

  _proto.hour = function hour() {
    return this._time.hour();
  };

  _proto.minute = function minute() {
    return this._time.minute();
  };

  _proto.second = function second() {
    return this._time.second();
  };

  _proto.nano = function nano() {
    return this._time.nano();
  };

  _proto._withAdjuster = function _withAdjuster(adjuster) {
    requireNonNull(adjuster, 'adjuster');

    if (adjuster instanceof LocalDate) {
      return this._withDateTime(adjuster, this._time);
    } else if (adjuster instanceof LocalTime) {
      return this._withDateTime(this._date, adjuster);
    } else if (adjuster instanceof LocalDateTime) {
      return adjuster;
    }

    return _ChronoLocalDateTime.prototype._withAdjuster.call(this, adjuster);
  };

  _proto._withField = function _withField(field, newValue) {
    requireNonNull(field, 'field');

    if (field instanceof ChronoField) {
      if (field.isTimeBased()) {
        return this._withDateTime(this._date, this._time.with(field, newValue));
      } else {
        return this._withDateTime(this._date.with(field, newValue), this._time);
      }
    }

    return field.adjustInto(this, newValue);
  };

  _proto.withYear = function withYear(year) {
    return this._withDateTime(this._date.withYear(year), this._time);
  };

  _proto.withMonth = function withMonth(month) {
    return this._withDateTime(this._date.withMonth(month), this._time);
  };

  _proto.withDayOfMonth = function withDayOfMonth(dayOfMonth) {
    return this._withDateTime(this._date.withDayOfMonth(dayOfMonth), this._time);
  };

  _proto.withDayOfYear = function withDayOfYear(dayOfYear) {
    return this._withDateTime(this._date.withDayOfYear(dayOfYear), this._time);
  };

  _proto.withHour = function withHour(hour) {
    var newTime = this._time.withHour(hour);

    return this._withDateTime(this._date, newTime);
  };

  _proto.withMinute = function withMinute(minute) {
    var newTime = this._time.withMinute(minute);

    return this._withDateTime(this._date, newTime);
  };

  _proto.withSecond = function withSecond(second) {
    var newTime = this._time.withSecond(second);

    return this._withDateTime(this._date, newTime);
  };

  _proto.withNano = function withNano(nanoOfSecond) {
    var newTime = this._time.withNano(nanoOfSecond);

    return this._withDateTime(this._date, newTime);
  };

  _proto.truncatedTo = function truncatedTo(unit) {
    return this._withDateTime(this._date, this._time.truncatedTo(unit));
  };

  _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
    requireNonNull(unit, 'unit');

    if (unit instanceof ChronoUnit) {
      switch (unit) {
        case ChronoUnit.NANOS:
          return this.plusNanos(amountToAdd);

        case ChronoUnit.MICROS:
          return this.plusDays(MathUtil.intDiv(amountToAdd, LocalTime.MICROS_PER_DAY)).plusNanos(MathUtil.intMod(amountToAdd, LocalTime.MICROS_PER_DAY) * 1000);

        case ChronoUnit.MILLIS:
          return this.plusDays(MathUtil.intDiv(amountToAdd, LocalTime.MILLIS_PER_DAY)).plusNanos(MathUtil.intMod(amountToAdd, LocalTime.MILLIS_PER_DAY) * 1000000);

        case ChronoUnit.SECONDS:
          return this.plusSeconds(amountToAdd);

        case ChronoUnit.MINUTES:
          return this.plusMinutes(amountToAdd);

        case ChronoUnit.HOURS:
          return this.plusHours(amountToAdd);

        case ChronoUnit.HALF_DAYS:
          return this.plusDays(MathUtil.intDiv(amountToAdd, 256)).plusHours(MathUtil.intMod(amountToAdd, 256) * 12);
      }

      return this._withDateTime(this._date.plus(amountToAdd, unit), this._time);
    }

    return unit.addTo(this, amountToAdd);
  };

  _proto.plusYears = function plusYears(years) {
    var newDate = this._date.plusYears(years);

    return this._withDateTime(newDate, this._time);
  };

  _proto.plusMonths = function plusMonths(months) {
    var newDate = this._date.plusMonths(months);

    return this._withDateTime(newDate, this._time);
  };

  _proto.plusWeeks = function plusWeeks(weeks) {
    var newDate = this._date.plusWeeks(weeks);

    return this._withDateTime(newDate, this._time);
  };

  _proto.plusDays = function plusDays(days) {
    var newDate = this._date.plusDays(days);

    return this._withDateTime(newDate, this._time);
  };

  _proto.plusHours = function plusHours(hours) {
    return this._plusWithOverflow(this._date, hours, 0, 0, 0, 1);
  };

  _proto.plusMinutes = function plusMinutes(minutes) {
    return this._plusWithOverflow(this._date, 0, minutes, 0, 0, 1);
  };

  _proto.plusSeconds = function plusSeconds(seconds) {
    return this._plusWithOverflow(this._date, 0, 0, seconds, 0, 1);
  };

  _proto.plusNanos = function plusNanos(nanos) {
    return this._plusWithOverflow(this._date, 0, 0, 0, nanos, 1);
  };

  _proto._minusUnit = function _minusUnit(amountToSubtract, unit) {
    requireNonNull(unit, 'unit');
    return this._plusUnit(-1 * amountToSubtract, unit);
  };

  _proto.minusYears = function minusYears(years) {
    return this.plusYears(-1 * years);
  };

  _proto.minusMonths = function minusMonths(months) {
    return this.plusMonths(-1 * months);
  };

  _proto.minusWeeks = function minusWeeks(weeks) {
    return this.plusWeeks(-1 * weeks);
  };

  _proto.minusDays = function minusDays(days) {
    return this.plusDays(-1 * days);
  };

  _proto.minusHours = function minusHours(hours) {
    return this._plusWithOverflow(this._date, hours, 0, 0, 0, -1);
  };

  _proto.minusMinutes = function minusMinutes(minutes) {
    return this._plusWithOverflow(this._date, 0, minutes, 0, 0, -1);
  };

  _proto.minusSeconds = function minusSeconds(seconds) {
    return this._plusWithOverflow(this._date, 0, 0, seconds, 0, -1);
  };

  _proto.minusNanos = function minusNanos(nanos) {
    return this._plusWithOverflow(this._date, 0, 0, 0, nanos, -1);
  };

  _proto._plusWithOverflow = function _plusWithOverflow(newDate, hours, minutes, seconds, nanos, sign) {
    if (hours === 0 && minutes === 0 && seconds === 0 && nanos === 0) {
      return this._withDateTime(newDate, this._time);
    }

    var totDays = MathUtil.intDiv(nanos, LocalTime.NANOS_PER_DAY) + MathUtil.intDiv(seconds, LocalTime.SECONDS_PER_DAY) + MathUtil.intDiv(minutes, LocalTime.MINUTES_PER_DAY) + MathUtil.intDiv(hours, LocalTime.HOURS_PER_DAY);
    totDays *= sign;
    var totNanos = MathUtil.intMod(nanos, LocalTime.NANOS_PER_DAY) + MathUtil.intMod(seconds, LocalTime.SECONDS_PER_DAY) * LocalTime.NANOS_PER_SECOND + MathUtil.intMod(minutes, LocalTime.MINUTES_PER_DAY) * LocalTime.NANOS_PER_MINUTE + MathUtil.intMod(hours, LocalTime.HOURS_PER_DAY) * LocalTime.NANOS_PER_HOUR;

    var curNoD = this._time.toNanoOfDay();

    totNanos = totNanos * sign + curNoD;
    totDays += MathUtil.floorDiv(totNanos, LocalTime.NANOS_PER_DAY);
    var newNoD = MathUtil.floorMod(totNanos, LocalTime.NANOS_PER_DAY);
    var newTime = newNoD === curNoD ? this._time : LocalTime.ofNanoOfDay(newNoD);
    return this._withDateTime(newDate.plusDays(totDays), newTime);
  };

  _proto.query = function query(_query) {
    requireNonNull(_query, 'query');

    if (_query === TemporalQueries.localDate()) {
      return this.toLocalDate();
    }

    return _ChronoLocalDateTime.prototype.query.call(this, _query);
  };

  _proto.adjustInto = function adjustInto(temporal) {
    return _ChronoLocalDateTime.prototype.adjustInto.call(this, temporal);
  };

  _proto.until = function until(endExclusive, unit) {
    requireNonNull(endExclusive, 'endExclusive');
    requireNonNull(unit, 'unit');
    var end = LocalDateTime.from(endExclusive);

    if (unit instanceof ChronoUnit) {
      if (unit.isTimeBased()) {
        var daysUntil = this._date.daysUntil(end._date);

        var timeUntil = end._time.toNanoOfDay() - this._time.toNanoOfDay();

        if (daysUntil > 0 && timeUntil < 0) {
          daysUntil--;
          timeUntil += LocalTime.NANOS_PER_DAY;
        } else if (daysUntil < 0 && timeUntil > 0) {
          daysUntil++;
          timeUntil -= LocalTime.NANOS_PER_DAY;
        }

        var amount = daysUntil;

        switch (unit) {
          case ChronoUnit.NANOS:
            amount = MathUtil.safeMultiply(amount, LocalTime.NANOS_PER_DAY);
            return MathUtil.safeAdd(amount, timeUntil);

          case ChronoUnit.MICROS:
            amount = MathUtil.safeMultiply(amount, LocalTime.MICROS_PER_DAY);
            return MathUtil.safeAdd(amount, MathUtil.intDiv(timeUntil, 1000));

          case ChronoUnit.MILLIS:
            amount = MathUtil.safeMultiply(amount, LocalTime.MILLIS_PER_DAY);
            return MathUtil.safeAdd(amount, MathUtil.intDiv(timeUntil, 1000000));

          case ChronoUnit.SECONDS:
            amount = MathUtil.safeMultiply(amount, LocalTime.SECONDS_PER_DAY);
            return MathUtil.safeAdd(amount, MathUtil.intDiv(timeUntil, LocalTime.NANOS_PER_SECOND));

          case ChronoUnit.MINUTES:
            amount = MathUtil.safeMultiply(amount, LocalTime.MINUTES_PER_DAY);
            return MathUtil.safeAdd(amount, MathUtil.intDiv(timeUntil, LocalTime.NANOS_PER_MINUTE));

          case ChronoUnit.HOURS:
            amount = MathUtil.safeMultiply(amount, LocalTime.HOURS_PER_DAY);
            return MathUtil.safeAdd(amount, MathUtil.intDiv(timeUntil, LocalTime.NANOS_PER_HOUR));

          case ChronoUnit.HALF_DAYS:
            amount = MathUtil.safeMultiply(amount, 2);
            return MathUtil.safeAdd(amount, MathUtil.intDiv(timeUntil, LocalTime.NANOS_PER_HOUR * 12));
        }

        throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
      }

      var endDate = end._date;
      var endTime = end._time;

      if (endDate.isAfter(this._date) && endTime.isBefore(this._time)) {
        endDate = endDate.minusDays(1);
      } else if (endDate.isBefore(this._date) && endTime.isAfter(this._time)) {
        endDate = endDate.plusDays(1);
      }

      return this._date.until(endDate, unit);
    }

    return unit.between(this, end);
  };

  _proto.atOffset = function atOffset(offset) {
    return OffsetDateTime.of(this, offset);
  };

  _proto.atZone = function atZone(zone) {
    return ZonedDateTime.of(this, zone);
  };

  _proto.toLocalDate = function toLocalDate() {
    return this._date;
  };

  _proto.toLocalTime = function toLocalTime() {
    return this._time;
  };

  _proto.compareTo = function compareTo(other) {
    requireNonNull(other, 'other');
    requireInstance(other, LocalDateTime, 'other');
    return this._compareTo0(other);
  };

  _proto._compareTo0 = function _compareTo0(other) {
    var cmp = this._date.compareTo(other.toLocalDate());

    if (cmp === 0) {
      cmp = this._time.compareTo(other.toLocalTime());
    }

    return cmp;
  };

  _proto.isAfter = function isAfter(other) {
    return this.compareTo(other) > 0;
  };

  _proto.isBefore = function isBefore(other) {
    return this.compareTo(other) < 0;
  };

  _proto.isEqual = function isEqual(other) {
    return this.compareTo(other) === 0;
  };

  _proto.equals = function equals(other) {
    if (this === other) {
      return true;
    }

    if (other instanceof LocalDateTime) {
      return this._date.equals(other._date) && this._time.equals(other._time);
    }

    return false;
  };

  _proto.hashCode = function hashCode() {
    return this._date.hashCode() ^ this._time.hashCode();
  };

  _proto.toString = function toString() {
    return this._date.toString() + "T" + this._time.toString();
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  _proto.format = function format(formatter) {
    requireNonNull(formatter, 'formatter');
    return formatter.format(this);
  };

  return LocalDateTime;
}(ChronoLocalDateTime);
function _init$4() {
  LocalDateTime.MIN = LocalDateTime.of(LocalDate.MIN, LocalTime.MIN);
  LocalDateTime.MAX = LocalDateTime.of(LocalDate.MAX, LocalTime.MAX);
  LocalDateTime.FROM = createTemporalQuery('LocalDateTime.FROM', function (temporal) {
    return LocalDateTime.from(temporal);
  });
}

var LocalTime = function (_Temporal) {
  _inheritsLoose(LocalTime, _Temporal);

  LocalTime.now = function now(clockOrZone) {
    if (clockOrZone == null) {
      return LocalTime._now(Clock.systemDefaultZone());
    } else if (clockOrZone instanceof Clock) {
      return LocalTime._now(clockOrZone);
    } else {
      return LocalTime._now(Clock.system(clockOrZone));
    }
  };

  LocalTime._now = function _now(clock) {
    if (clock === void 0) {
      clock = Clock.systemDefaultZone();
    }

    requireNonNull(clock, 'clock');
    return LocalTime.ofInstant(clock.instant(), clock.zone());
  };

  LocalTime.ofInstant = function ofInstant(instant, zone) {
    if (zone === void 0) {
      zone = ZoneId.systemDefault();
    }

    var offset = zone.rules().offset(instant);
    var secsOfDay = MathUtil.intMod(instant.epochSecond(), LocalTime.SECONDS_PER_DAY);
    secsOfDay = MathUtil.intMod(secsOfDay + offset.totalSeconds(), LocalTime.SECONDS_PER_DAY);

    if (secsOfDay < 0) {
      secsOfDay += LocalTime.SECONDS_PER_DAY;
    }

    return LocalTime.ofSecondOfDay(secsOfDay, instant.nano());
  };

  LocalTime.of = function of(hour, minute, second, nanoOfSecond) {
    return new LocalTime(hour, minute, second, nanoOfSecond);
  };

  LocalTime.ofSecondOfDay = function ofSecondOfDay(secondOfDay, nanoOfSecond) {
    if (secondOfDay === void 0) {
      secondOfDay = 0;
    }

    if (nanoOfSecond === void 0) {
      nanoOfSecond = 0;
    }

    ChronoField.SECOND_OF_DAY.checkValidValue(secondOfDay);
    ChronoField.NANO_OF_SECOND.checkValidValue(nanoOfSecond);
    var hours = MathUtil.intDiv(secondOfDay, LocalTime.SECONDS_PER_HOUR);
    secondOfDay -= hours * LocalTime.SECONDS_PER_HOUR;
    var minutes = MathUtil.intDiv(secondOfDay, LocalTime.SECONDS_PER_MINUTE);
    secondOfDay -= minutes * LocalTime.SECONDS_PER_MINUTE;
    return new LocalTime(hours, minutes, secondOfDay, nanoOfSecond);
  };

  LocalTime.ofNanoOfDay = function ofNanoOfDay(nanoOfDay) {
    if (nanoOfDay === void 0) {
      nanoOfDay = 0;
    }

    ChronoField.NANO_OF_DAY.checkValidValue(nanoOfDay);
    var hours = MathUtil.intDiv(nanoOfDay, LocalTime.NANOS_PER_HOUR);
    nanoOfDay -= hours * LocalTime.NANOS_PER_HOUR;
    var minutes = MathUtil.intDiv(nanoOfDay, LocalTime.NANOS_PER_MINUTE);
    nanoOfDay -= minutes * LocalTime.NANOS_PER_MINUTE;
    var seconds = MathUtil.intDiv(nanoOfDay, LocalTime.NANOS_PER_SECOND);
    nanoOfDay -= seconds * LocalTime.NANOS_PER_SECOND;
    return new LocalTime(hours, minutes, seconds, nanoOfDay);
  };

  LocalTime.from = function from(temporal) {
    requireNonNull(temporal, 'temporal');
    var time = temporal.query(TemporalQueries.localTime());

    if (time == null) {
      throw new DateTimeException("Unable to obtain LocalTime TemporalAccessor: " + temporal + ", type " + (temporal.constructor != null ? temporal.constructor.name : ''));
    }

    return time;
  };

  LocalTime.parse = function parse(text, formatter) {
    if (formatter === void 0) {
      formatter = DateTimeFormatter.ISO_LOCAL_TIME;
    }

    requireNonNull(formatter, 'formatter');
    return formatter.parse(text, LocalTime.FROM);
  };

  function LocalTime(hour, minute, second, nanoOfSecond) {
    var _this;

    if (hour === void 0) {
      hour = 0;
    }

    if (minute === void 0) {
      minute = 0;
    }

    if (second === void 0) {
      second = 0;
    }

    if (nanoOfSecond === void 0) {
      nanoOfSecond = 0;
    }

    _this = _Temporal.call(this) || this;

    var _hour = MathUtil.safeToInt(hour);

    var _minute = MathUtil.safeToInt(minute);

    var _second = MathUtil.safeToInt(second);

    var _nanoOfSecond = MathUtil.safeToInt(nanoOfSecond);

    LocalTime._validate(_hour, _minute, _second, _nanoOfSecond);

    if (_minute === 0 && _second === 0 && _nanoOfSecond === 0) {
      if (!LocalTime.HOURS[_hour]) {
        _this._hour = _hour;
        _this._minute = _minute;
        _this._second = _second;
        _this._nano = _nanoOfSecond;
        LocalTime.HOURS[_hour] = _assertThisInitialized(_this);
      }

      return LocalTime.HOURS[_hour] || _assertThisInitialized(_this);
    }

    _this._hour = _hour;
    _this._minute = _minute;
    _this._second = _second;
    _this._nano = _nanoOfSecond;
    return _this;
  }

  LocalTime._validate = function _validate(hour, minute, second, nanoOfSecond) {
    ChronoField.HOUR_OF_DAY.checkValidValue(hour);
    ChronoField.MINUTE_OF_HOUR.checkValidValue(minute);
    ChronoField.SECOND_OF_MINUTE.checkValidValue(second);
    ChronoField.NANO_OF_SECOND.checkValidValue(nanoOfSecond);
  };

  var _proto = LocalTime.prototype;

  _proto.isSupported = function isSupported(fieldOrUnit) {
    if (fieldOrUnit instanceof ChronoField) {
      return fieldOrUnit.isTimeBased();
    } else if (fieldOrUnit instanceof ChronoUnit) {
      return fieldOrUnit.isTimeBased();
    }

    return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
  };

  _proto.range = function range(field) {
    requireNonNull(field);
    return _Temporal.prototype.range.call(this, field);
  };

  _proto.get = function get(field) {
    return this.getLong(field);
  };

  _proto.getLong = function getLong(field) {
    requireNonNull(field, 'field');

    if (field instanceof ChronoField) {
      return this._get0(field);
    }

    return field.getFrom(this);
  };

  _proto._get0 = function _get0(field) {
    switch (field) {
      case ChronoField.NANO_OF_SECOND:
        return this._nano;

      case ChronoField.NANO_OF_DAY:
        return this.toNanoOfDay();

      case ChronoField.MICRO_OF_SECOND:
        return MathUtil.intDiv(this._nano, 1000);

      case ChronoField.MICRO_OF_DAY:
        return MathUtil.intDiv(this.toNanoOfDay(), 1000);

      case ChronoField.MILLI_OF_SECOND:
        return MathUtil.intDiv(this._nano, 1000000);

      case ChronoField.MILLI_OF_DAY:
        return MathUtil.intDiv(this.toNanoOfDay(), 1000000);

      case ChronoField.SECOND_OF_MINUTE:
        return this._second;

      case ChronoField.SECOND_OF_DAY:
        return this.toSecondOfDay();

      case ChronoField.MINUTE_OF_HOUR:
        return this._minute;

      case ChronoField.MINUTE_OF_DAY:
        return this._hour * 60 + this._minute;

      case ChronoField.HOUR_OF_AMPM:
        return MathUtil.intMod(this._hour, 12);

      case ChronoField.CLOCK_HOUR_OF_AMPM:
        {
          var ham = MathUtil.intMod(this._hour, 12);
          return ham % 12 === 0 ? 12 : ham;
        }

      case ChronoField.HOUR_OF_DAY:
        return this._hour;

      case ChronoField.CLOCK_HOUR_OF_DAY:
        return this._hour === 0 ? 24 : this._hour;

      case ChronoField.AMPM_OF_DAY:
        return MathUtil.intDiv(this._hour, 12);
    }

    throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
  };

  _proto.hour = function hour() {
    return this._hour;
  };

  _proto.minute = function minute() {
    return this._minute;
  };

  _proto.second = function second() {
    return this._second;
  };

  _proto.nano = function nano() {
    return this._nano;
  };

  _proto._withAdjuster = function _withAdjuster(adjuster) {
    requireNonNull(adjuster, 'adjuster');

    if (adjuster instanceof LocalTime) {
      return adjuster;
    }

    return _Temporal.prototype._withAdjuster.call(this, adjuster);
  };

  _proto._withField = function _withField(field, newValue) {
    requireNonNull(field, 'field');
    requireInstance(field, TemporalField, 'field');

    if (field instanceof ChronoField) {
      field.checkValidValue(newValue);

      switch (field) {
        case ChronoField.NANO_OF_SECOND:
          return this.withNano(newValue);

        case ChronoField.NANO_OF_DAY:
          return LocalTime.ofNanoOfDay(newValue);

        case ChronoField.MICRO_OF_SECOND:
          return this.withNano(newValue * 1000);

        case ChronoField.MICRO_OF_DAY:
          return LocalTime.ofNanoOfDay(newValue * 1000);

        case ChronoField.MILLI_OF_SECOND:
          return this.withNano(newValue * 1000000);

        case ChronoField.MILLI_OF_DAY:
          return LocalTime.ofNanoOfDay(newValue * 1000000);

        case ChronoField.SECOND_OF_MINUTE:
          return this.withSecond(newValue);

        case ChronoField.SECOND_OF_DAY:
          return this.plusSeconds(newValue - this.toSecondOfDay());

        case ChronoField.MINUTE_OF_HOUR:
          return this.withMinute(newValue);

        case ChronoField.MINUTE_OF_DAY:
          return this.plusMinutes(newValue - (this._hour * 60 + this._minute));

        case ChronoField.HOUR_OF_AMPM:
          return this.plusHours(newValue - MathUtil.intMod(this._hour, 12));

        case ChronoField.CLOCK_HOUR_OF_AMPM:
          return this.plusHours((newValue === 12 ? 0 : newValue) - MathUtil.intMod(this._hour, 12));

        case ChronoField.HOUR_OF_DAY:
          return this.withHour(newValue);

        case ChronoField.CLOCK_HOUR_OF_DAY:
          return this.withHour(newValue === 24 ? 0 : newValue);

        case ChronoField.AMPM_OF_DAY:
          return this.plusHours((newValue - MathUtil.intDiv(this._hour, 12)) * 12);
      }

      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.adjustInto(this, newValue);
  };

  _proto.withHour = function withHour(hour) {
    if (hour === void 0) {
      hour = 0;
    }

    if (this._hour === hour) {
      return this;
    }

    return new LocalTime(hour, this._minute, this._second, this._nano);
  };

  _proto.withMinute = function withMinute(minute) {
    if (minute === void 0) {
      minute = 0;
    }

    if (this._minute === minute) {
      return this;
    }

    return new LocalTime(this._hour, minute, this._second, this._nano);
  };

  _proto.withSecond = function withSecond(second) {
    if (second === void 0) {
      second = 0;
    }

    if (this._second === second) {
      return this;
    }

    return new LocalTime(this._hour, this._minute, second, this._nano);
  };

  _proto.withNano = function withNano(nanoOfSecond) {
    if (nanoOfSecond === void 0) {
      nanoOfSecond = 0;
    }

    if (this._nano === nanoOfSecond) {
      return this;
    }

    return new LocalTime(this._hour, this._minute, this._second, nanoOfSecond);
  };

  _proto.truncatedTo = function truncatedTo(unit) {
    requireNonNull(unit, 'unit');

    if (unit === ChronoUnit.NANOS) {
      return this;
    }

    var unitDur = unit.duration();

    if (unitDur.seconds() > LocalTime.SECONDS_PER_DAY) {
      throw new DateTimeException('Unit is too large to be used for truncation');
    }

    var dur = unitDur.toNanos();

    if (MathUtil.intMod(LocalTime.NANOS_PER_DAY, dur) !== 0) {
      throw new DateTimeException('Unit must divide into a standard day without remainder');
    }

    var nod = this.toNanoOfDay();
    return LocalTime.ofNanoOfDay(MathUtil.intDiv(nod, dur) * dur);
  };

  _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
    requireNonNull(unit, 'unit');

    if (unit instanceof ChronoUnit) {
      switch (unit) {
        case ChronoUnit.NANOS:
          return this.plusNanos(amountToAdd);

        case ChronoUnit.MICROS:
          return this.plusNanos(MathUtil.intMod(amountToAdd, LocalTime.MICROS_PER_DAY) * 1000);

        case ChronoUnit.MILLIS:
          return this.plusNanos(MathUtil.intMod(amountToAdd, LocalTime.MILLIS_PER_DAY) * 1000000);

        case ChronoUnit.SECONDS:
          return this.plusSeconds(amountToAdd);

        case ChronoUnit.MINUTES:
          return this.plusMinutes(amountToAdd);

        case ChronoUnit.HOURS:
          return this.plusHours(amountToAdd);

        case ChronoUnit.HALF_DAYS:
          return this.plusHours(MathUtil.intMod(amountToAdd, 2) * 12);
      }

      throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
    }

    return unit.addTo(this, amountToAdd);
  };

  _proto.plusHours = function plusHours(hoursToAdd) {
    if (hoursToAdd === 0) {
      return this;
    }

    var newHour = MathUtil.intMod(MathUtil.intMod(hoursToAdd, LocalTime.HOURS_PER_DAY) + this._hour + LocalTime.HOURS_PER_DAY, LocalTime.HOURS_PER_DAY);
    return new LocalTime(newHour, this._minute, this._second, this._nano);
  };

  _proto.plusMinutes = function plusMinutes(minutesToAdd) {
    if (minutesToAdd === 0) {
      return this;
    }

    var mofd = this._hour * LocalTime.MINUTES_PER_HOUR + this._minute;
    var newMofd = MathUtil.intMod(MathUtil.intMod(minutesToAdd, LocalTime.MINUTES_PER_DAY) + mofd + LocalTime.MINUTES_PER_DAY, LocalTime.MINUTES_PER_DAY);

    if (mofd === newMofd) {
      return this;
    }

    var newHour = MathUtil.intDiv(newMofd, LocalTime.MINUTES_PER_HOUR);
    var newMinute = MathUtil.intMod(newMofd, LocalTime.MINUTES_PER_HOUR);
    return new LocalTime(newHour, newMinute, this._second, this._nano);
  };

  _proto.plusSeconds = function plusSeconds(secondsToAdd) {
    if (secondsToAdd === 0) {
      return this;
    }

    var sofd = this._hour * LocalTime.SECONDS_PER_HOUR + this._minute * LocalTime.SECONDS_PER_MINUTE + this._second;
    var newSofd = MathUtil.intMod(MathUtil.intMod(secondsToAdd, LocalTime.SECONDS_PER_DAY) + sofd + LocalTime.SECONDS_PER_DAY, LocalTime.SECONDS_PER_DAY);

    if (sofd === newSofd) {
      return this;
    }

    var newHour = MathUtil.intDiv(newSofd, LocalTime.SECONDS_PER_HOUR);
    var newMinute = MathUtil.intMod(MathUtil.intDiv(newSofd, LocalTime.SECONDS_PER_MINUTE), LocalTime.MINUTES_PER_HOUR);
    var newSecond = MathUtil.intMod(newSofd, LocalTime.SECONDS_PER_MINUTE);
    return new LocalTime(newHour, newMinute, newSecond, this._nano);
  };

  _proto.plusNanos = function plusNanos(nanosToAdd) {
    if (nanosToAdd === 0) {
      return this;
    }

    var nofd = this.toNanoOfDay();
    var newNofd = MathUtil.intMod(MathUtil.intMod(nanosToAdd, LocalTime.NANOS_PER_DAY) + nofd + LocalTime.NANOS_PER_DAY, LocalTime.NANOS_PER_DAY);

    if (nofd === newNofd) {
      return this;
    }

    var newHour = MathUtil.intDiv(newNofd, LocalTime.NANOS_PER_HOUR);
    var newMinute = MathUtil.intMod(MathUtil.intDiv(newNofd, LocalTime.NANOS_PER_MINUTE), LocalTime.MINUTES_PER_HOUR);
    var newSecond = MathUtil.intMod(MathUtil.intDiv(newNofd, LocalTime.NANOS_PER_SECOND), LocalTime.SECONDS_PER_MINUTE);
    var newNano = MathUtil.intMod(newNofd, LocalTime.NANOS_PER_SECOND);
    return new LocalTime(newHour, newMinute, newSecond, newNano);
  };

  _proto._minusUnit = function _minusUnit(amountToSubtract, unit) {
    requireNonNull(unit, 'unit');
    return this._plusUnit(-1 * amountToSubtract, unit);
  };

  _proto.minusHours = function minusHours(hoursToSubtract) {
    return this.plusHours(-1 * MathUtil.intMod(hoursToSubtract, LocalTime.HOURS_PER_DAY));
  };

  _proto.minusMinutes = function minusMinutes(minutesToSubtract) {
    return this.plusMinutes(-1 * MathUtil.intMod(minutesToSubtract, LocalTime.MINUTES_PER_DAY));
  };

  _proto.minusSeconds = function minusSeconds(secondsToSubtract) {
    return this.plusSeconds(-1 * MathUtil.intMod(secondsToSubtract, LocalTime.SECONDS_PER_DAY));
  };

  _proto.minusNanos = function minusNanos(nanosToSubtract) {
    return this.plusNanos(-1 * MathUtil.intMod(nanosToSubtract, LocalTime.NANOS_PER_DAY));
  };

  _proto.query = function query(_query) {
    requireNonNull(_query, 'query');

    if (_query === TemporalQueries.precision()) {
      return ChronoUnit.NANOS;
    } else if (_query === TemporalQueries.localTime()) {
      return this;
    }

    if (_query === TemporalQueries.chronology() || _query === TemporalQueries.zoneId() || _query === TemporalQueries.zone() || _query === TemporalQueries.offset() || _query === TemporalQueries.localDate()) {
      return null;
    }

    return _query.queryFrom(this);
  };

  _proto.adjustInto = function adjustInto(temporal) {
    return temporal.with(LocalTime.NANO_OF_DAY, this.toNanoOfDay());
  };

  _proto.until = function until(endExclusive, unit) {
    requireNonNull(endExclusive, 'endExclusive');
    requireNonNull(unit, 'unit');
    var end = LocalTime.from(endExclusive);

    if (unit instanceof ChronoUnit) {
      var nanosUntil = end.toNanoOfDay() - this.toNanoOfDay();

      switch (unit) {
        case ChronoUnit.NANOS:
          return nanosUntil;

        case ChronoUnit.MICROS:
          return MathUtil.intDiv(nanosUntil, 1000);

        case ChronoUnit.MILLIS:
          return MathUtil.intDiv(nanosUntil, 1000000);

        case ChronoUnit.SECONDS:
          return MathUtil.intDiv(nanosUntil, LocalTime.NANOS_PER_SECOND);

        case ChronoUnit.MINUTES:
          return MathUtil.intDiv(nanosUntil, LocalTime.NANOS_PER_MINUTE);

        case ChronoUnit.HOURS:
          return MathUtil.intDiv(nanosUntil, LocalTime.NANOS_PER_HOUR);

        case ChronoUnit.HALF_DAYS:
          return MathUtil.intDiv(nanosUntil, 12 * LocalTime.NANOS_PER_HOUR);
      }

      throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
    }

    return unit.between(this, end);
  };

  _proto.atDate = function atDate(date) {
    return LocalDateTime.of(date, this);
  };

  _proto.atOffset = function atOffset(offset) {
    return OffsetTime.of(this, offset);
  };

  _proto.toSecondOfDay = function toSecondOfDay() {
    var total = this._hour * LocalTime.SECONDS_PER_HOUR;
    total += this._minute * LocalTime.SECONDS_PER_MINUTE;
    total += this._second;
    return total;
  };

  _proto.toNanoOfDay = function toNanoOfDay() {
    var total = this._hour * LocalTime.NANOS_PER_HOUR;
    total += this._minute * LocalTime.NANOS_PER_MINUTE;
    total += this._second * LocalTime.NANOS_PER_SECOND;
    total += this._nano;
    return total;
  };

  _proto.compareTo = function compareTo(other) {
    requireNonNull(other, 'other');
    requireInstance(other, LocalTime, 'other');
    var cmp = MathUtil.compareNumbers(this._hour, other._hour);

    if (cmp === 0) {
      cmp = MathUtil.compareNumbers(this._minute, other._minute);

      if (cmp === 0) {
        cmp = MathUtil.compareNumbers(this._second, other._second);

        if (cmp === 0) {
          cmp = MathUtil.compareNumbers(this._nano, other._nano);
        }
      }
    }

    return cmp;
  };

  _proto.isAfter = function isAfter(other) {
    return this.compareTo(other) > 0;
  };

  _proto.isBefore = function isBefore(other) {
    return this.compareTo(other) < 0;
  };

  _proto.equals = function equals(other) {
    if (this === other) {
      return true;
    }

    if (other instanceof LocalTime) {
      return this._hour === other._hour && this._minute === other._minute && this._second === other._second && this._nano === other._nano;
    }

    return false;
  };

  _proto.hashCode = function hashCode() {
    var nod = this.toNanoOfDay();
    return MathUtil.hash(nod);
  };

  _proto.toString = function toString() {
    var buf = '';
    var hourValue = this._hour;
    var minuteValue = this._minute;
    var secondValue = this._second;
    var nanoValue = this._nano;
    buf += hourValue < 10 ? '0' : '';
    buf += hourValue;
    buf += minuteValue < 10 ? ':0' : ':';
    buf += minuteValue;

    if (secondValue > 0 || nanoValue > 0) {
      buf += secondValue < 10 ? ':0' : ':';
      buf += secondValue;

      if (nanoValue > 0) {
        buf += '.';

        if (MathUtil.intMod(nanoValue, 1000000) === 0) {
          buf += ("" + (MathUtil.intDiv(nanoValue, 1000000) + 1000)).substring(1);
        } else if (MathUtil.intMod(nanoValue, 1000) === 0) {
          buf += ("" + (MathUtil.intDiv(nanoValue, 1000) + 1000000)).substring(1);
        } else {
          buf += ("" + (nanoValue + 1000000000)).substring(1);
        }
      }
    }

    return buf;
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  _proto.format = function format(formatter) {
    requireNonNull(formatter, 'formatter');
    return formatter.format(this);
  };

  return LocalTime;
}(Temporal);
function _init$3() {
  LocalTime.HOURS = [];

  for (var hour = 0; hour < 24; hour++) {
    LocalTime.of(hour, 0, 0, 0);
  }

  LocalTime.MIN = LocalTime.HOURS[0];
  LocalTime.MAX = new LocalTime(23, 59, 59, 999999999);
  LocalTime.MIDNIGHT = LocalTime.HOURS[0];
  LocalTime.NOON = LocalTime.HOURS[12];
  LocalTime.FROM = createTemporalQuery('LocalTime.FROM', function (temporal) {
    return LocalTime.from(temporal);
  });
}
LocalTime.HOURS_PER_DAY = 24;
LocalTime.MINUTES_PER_HOUR = 60;
LocalTime.MINUTES_PER_DAY = LocalTime.MINUTES_PER_HOUR * LocalTime.HOURS_PER_DAY;
LocalTime.SECONDS_PER_MINUTE = 60;
LocalTime.SECONDS_PER_HOUR = LocalTime.SECONDS_PER_MINUTE * LocalTime.MINUTES_PER_HOUR;
LocalTime.SECONDS_PER_DAY = LocalTime.SECONDS_PER_HOUR * LocalTime.HOURS_PER_DAY;
LocalTime.MILLIS_PER_DAY = LocalTime.SECONDS_PER_DAY * 1000;
LocalTime.MICROS_PER_DAY = LocalTime.SECONDS_PER_DAY * 1000000;
LocalTime.NANOS_PER_SECOND = 1000000000;
LocalTime.NANOS_PER_MINUTE = LocalTime.NANOS_PER_SECOND * LocalTime.SECONDS_PER_MINUTE;
LocalTime.NANOS_PER_HOUR = LocalTime.NANOS_PER_MINUTE * LocalTime.MINUTES_PER_HOUR;
LocalTime.NANOS_PER_DAY = LocalTime.NANOS_PER_HOUR * LocalTime.HOURS_PER_DAY;

var NANOS_PER_MILLI = 1000000;
var Instant = function (_Temporal) {
  _inheritsLoose(Instant, _Temporal);

  Instant.now = function now(clock) {
    if (clock === void 0) {
      clock = Clock.systemUTC();
    }

    return clock.instant();
  };

  Instant.ofEpochSecond = function ofEpochSecond(epochSecond, nanoAdjustment) {
    if (nanoAdjustment === void 0) {
      nanoAdjustment = 0;
    }

    var secs = epochSecond + MathUtil.floorDiv(nanoAdjustment, LocalTime.NANOS_PER_SECOND);
    var nos = MathUtil.floorMod(nanoAdjustment, LocalTime.NANOS_PER_SECOND);
    return Instant._create(secs, nos);
  };

  Instant.ofEpochMilli = function ofEpochMilli(epochMilli) {
    var secs = MathUtil.floorDiv(epochMilli, 1000);
    var mos = MathUtil.floorMod(epochMilli, 1000);
    return Instant._create(secs, mos * 1000000);
  };

  Instant.ofEpochMicro = function ofEpochMicro(epochMicro) {
    var secs = MathUtil.floorDiv(epochMicro, 1000000);
    var mos = MathUtil.floorMod(epochMicro, 1000000);
    return Instant._create(secs, mos * 1000);
  };

  Instant.from = function from(temporal) {
    try {
      var instantSecs = temporal.getLong(ChronoField.INSTANT_SECONDS);
      var nanoOfSecond = temporal.get(ChronoField.NANO_OF_SECOND);
      return Instant.ofEpochSecond(instantSecs, nanoOfSecond);
    } catch (ex) {
      throw new DateTimeException("Unable to obtain Instant from TemporalAccessor: " + temporal + ", type " + typeof temporal, ex);
    }
  };

  Instant.parse = function parse(text) {
    return DateTimeFormatter.ISO_INSTANT.parse(text, Instant.FROM);
  };

  Instant._create = function _create(seconds, nanoOfSecond) {
    if (seconds === 0 && nanoOfSecond === 0) {
      return Instant.EPOCH;
    }

    return new Instant(seconds, nanoOfSecond);
  };

  Instant._validate = function _validate(seconds, nanoOfSecond) {
    if (seconds < Instant.MIN_SECONDS || seconds > Instant.MAX_SECONDS) {
      throw new DateTimeException('Instant exceeds minimum or maximum instant');
    }

    if (nanoOfSecond < 0 || nanoOfSecond > LocalTime.NANOS_PER_SECOND) {
      throw new DateTimeException('Instant exceeds minimum or maximum instant');
    }
  };

  function Instant(seconds, nanoOfSecond) {
    var _this;

    _this = _Temporal.call(this) || this;

    Instant._validate(seconds, nanoOfSecond);

    _this._seconds = MathUtil.safeToInt(seconds);
    _this._nanos = MathUtil.safeToInt(nanoOfSecond);
    return _this;
  }

  var _proto = Instant.prototype;

  _proto.isSupported = function isSupported(fieldOrUnit) {
    if (fieldOrUnit instanceof ChronoField) {
      return fieldOrUnit === ChronoField.INSTANT_SECONDS || fieldOrUnit === ChronoField.NANO_OF_SECOND || fieldOrUnit === ChronoField.MICRO_OF_SECOND || fieldOrUnit === ChronoField.MILLI_OF_SECOND;
    }

    if (fieldOrUnit instanceof ChronoUnit) {
      return fieldOrUnit.isTimeBased() || fieldOrUnit === ChronoUnit.DAYS;
    }

    return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
  };

  _proto.range = function range(field) {
    return _Temporal.prototype.range.call(this, field);
  };

  _proto.get = function get(field) {
    return this.getLong(field);
  };

  _proto.getLong = function getLong(field) {
    if (field instanceof ChronoField) {
      switch (field) {
        case ChronoField.NANO_OF_SECOND:
          return this._nanos;

        case ChronoField.MICRO_OF_SECOND:
          return MathUtil.intDiv(this._nanos, 1000);

        case ChronoField.MILLI_OF_SECOND:
          return MathUtil.intDiv(this._nanos, NANOS_PER_MILLI);

        case ChronoField.INSTANT_SECONDS:
          return this._seconds;
      }

      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.getFrom(this);
  };

  _proto.epochSecond = function epochSecond() {
    return this._seconds;
  };

  _proto.nano = function nano() {
    return this._nanos;
  };

  _proto._withField = function _withField(field, newValue) {
    requireNonNull(field, 'field');

    if (field instanceof ChronoField) {
      field.checkValidValue(newValue);

      switch (field) {
        case ChronoField.MILLI_OF_SECOND:
          {
            var nval = newValue * NANOS_PER_MILLI;
            return nval !== this._nanos ? Instant._create(this._seconds, nval) : this;
          }

        case ChronoField.MICRO_OF_SECOND:
          {
            var _nval = newValue * 1000;

            return _nval !== this._nanos ? Instant._create(this._seconds, _nval) : this;
          }

        case ChronoField.NANO_OF_SECOND:
          return newValue !== this._nanos ? Instant._create(this._seconds, newValue) : this;

        case ChronoField.INSTANT_SECONDS:
          return newValue !== this._seconds ? Instant._create(newValue, this._nanos) : this;
      }

      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.adjustInto(this, newValue);
  };

  _proto.truncatedTo = function truncatedTo(unit) {
    requireNonNull(unit, 'unit');

    if (unit === ChronoUnit.NANOS) {
      return this;
    }

    var unitDur = unit.duration();

    if (unitDur.seconds() > LocalTime.SECONDS_PER_DAY) {
      throw new DateTimeException('Unit is too large to be used for truncation');
    }

    var dur = unitDur.toNanos();

    if (MathUtil.intMod(LocalTime.NANOS_PER_DAY, dur) !== 0) {
      throw new DateTimeException('Unit must divide into a standard day without remainder');
    }

    var nod = MathUtil.intMod(this._seconds, LocalTime.SECONDS_PER_DAY) * LocalTime.NANOS_PER_SECOND + this._nanos;

    var result = MathUtil.intDiv(nod, dur) * dur;
    return this.plusNanos(result - nod);
  };

  _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
    requireNonNull(amountToAdd, 'amountToAdd');
    requireNonNull(unit, 'unit');
    requireInstance(unit, TemporalUnit);

    if (unit instanceof ChronoUnit) {
      switch (unit) {
        case ChronoUnit.NANOS:
          return this.plusNanos(amountToAdd);

        case ChronoUnit.MICROS:
          return this.plusMicros(amountToAdd);

        case ChronoUnit.MILLIS:
          return this.plusMillis(amountToAdd);

        case ChronoUnit.SECONDS:
          return this.plusSeconds(amountToAdd);

        case ChronoUnit.MINUTES:
          return this.plusSeconds(MathUtil.safeMultiply(amountToAdd, LocalTime.SECONDS_PER_MINUTE));

        case ChronoUnit.HOURS:
          return this.plusSeconds(MathUtil.safeMultiply(amountToAdd, LocalTime.SECONDS_PER_HOUR));

        case ChronoUnit.HALF_DAYS:
          return this.plusSeconds(MathUtil.safeMultiply(amountToAdd, LocalTime.SECONDS_PER_DAY / 2));

        case ChronoUnit.DAYS:
          return this.plusSeconds(MathUtil.safeMultiply(amountToAdd, LocalTime.SECONDS_PER_DAY));
      }

      throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
    }

    return unit.addTo(this, amountToAdd);
  };

  _proto.plusSeconds = function plusSeconds(secondsToAdd) {
    return this._plus(secondsToAdd, 0);
  };

  _proto.plusMillis = function plusMillis(millisToAdd) {
    return this._plus(MathUtil.intDiv(millisToAdd, 1000), MathUtil.intMod(millisToAdd, 1000) * NANOS_PER_MILLI);
  };

  _proto.plusNanos = function plusNanos(nanosToAdd) {
    return this._plus(0, nanosToAdd);
  };

  _proto.plusMicros = function plusMicros(microsToAdd) {
    return this._plus(MathUtil.intDiv(microsToAdd, 1000000), MathUtil.intMod(microsToAdd, 1000000) * 1000);
  };

  _proto._plus = function _plus(secondsToAdd, nanosToAdd) {
    if (secondsToAdd === 0 && nanosToAdd === 0) {
      return this;
    }

    var epochSec = this._seconds + secondsToAdd;
    epochSec = epochSec + MathUtil.intDiv(nanosToAdd, LocalTime.NANOS_PER_SECOND);
    var nanoAdjustment = this._nanos + nanosToAdd % LocalTime.NANOS_PER_SECOND;
    return Instant.ofEpochSecond(epochSec, nanoAdjustment);
  };

  _proto._minusUnit = function _minusUnit(amountToSubtract, unit) {
    return this._plusUnit(-1 * amountToSubtract, unit);
  };

  _proto.minusSeconds = function minusSeconds(secondsToSubtract) {
    return this.plusSeconds(secondsToSubtract * -1);
  };

  _proto.minusMillis = function minusMillis(millisToSubtract) {
    return this.plusMillis(-1 * millisToSubtract);
  };

  _proto.minusNanos = function minusNanos(nanosToSubtract) {
    return this.plusNanos(-1 * nanosToSubtract);
  };

  _proto.minusMicros = function minusMicros(microsToSubtract) {
    return this.plusMicros(-1 * microsToSubtract);
  };

  _proto.query = function query(_query) {
    requireNonNull(_query, 'query');

    if (_query === TemporalQueries.precision()) {
      return ChronoUnit.NANOS;
    }

    if (_query === TemporalQueries.localDate() || _query === TemporalQueries.localTime() || _query === TemporalQueries.chronology() || _query === TemporalQueries.zoneId() || _query === TemporalQueries.zone() || _query === TemporalQueries.offset()) {
      return null;
    }

    return _query.queryFrom(this);
  };

  _proto.adjustInto = function adjustInto(temporal) {
    requireNonNull(temporal, 'temporal');
    return temporal.with(ChronoField.INSTANT_SECONDS, this._seconds).with(ChronoField.NANO_OF_SECOND, this._nanos);
  };

  _proto.until = function until(endExclusive, unit) {
    requireNonNull(endExclusive, 'endExclusive');
    requireNonNull(unit, 'unit');
    var end = Instant.from(endExclusive);

    if (unit instanceof ChronoUnit) {
      switch (unit) {
        case ChronoUnit.NANOS:
          return this._nanosUntil(end);

        case ChronoUnit.MICROS:
          return this._microsUntil(end);

        case ChronoUnit.MILLIS:
          return MathUtil.safeSubtract(end.toEpochMilli(), this.toEpochMilli());

        case ChronoUnit.SECONDS:
          return this._secondsUntil(end);

        case ChronoUnit.MINUTES:
          return MathUtil.intDiv(this._secondsUntil(end), LocalTime.SECONDS_PER_MINUTE);

        case ChronoUnit.HOURS:
          return MathUtil.intDiv(this._secondsUntil(end), LocalTime.SECONDS_PER_HOUR);

        case ChronoUnit.HALF_DAYS:
          return MathUtil.intDiv(this._secondsUntil(end), 12 * LocalTime.SECONDS_PER_HOUR);

        case ChronoUnit.DAYS:
          return MathUtil.intDiv(this._secondsUntil(end), LocalTime.SECONDS_PER_DAY);
      }

      throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
    }

    return unit.between(this, end);
  };

  _proto._microsUntil = function _microsUntil(end) {
    var secsDiff = MathUtil.safeSubtract(end.epochSecond(), this.epochSecond());
    var totalMicros = MathUtil.safeMultiply(secsDiff, 1000000);
    return MathUtil.safeAdd(totalMicros, MathUtil.intDiv(end.nano() - this.nano(), 1000));
  };

  _proto._nanosUntil = function _nanosUntil(end) {
    var secsDiff = MathUtil.safeSubtract(end.epochSecond(), this.epochSecond());
    var totalNanos = MathUtil.safeMultiply(secsDiff, LocalTime.NANOS_PER_SECOND);
    return MathUtil.safeAdd(totalNanos, end.nano() - this.nano());
  };

  _proto._secondsUntil = function _secondsUntil(end) {
    var secsDiff = MathUtil.safeSubtract(end.epochSecond(), this.epochSecond());
    var nanosDiff = end.nano() - this.nano();

    if (secsDiff > 0 && nanosDiff < 0) {
      secsDiff--;
    } else if (secsDiff < 0 && nanosDiff > 0) {
      secsDiff++;
    }

    return secsDiff;
  };

  _proto.atOffset = function atOffset(offset) {
    return OffsetDateTime.ofInstant(this, offset);
  };

  _proto.atZone = function atZone(zone) {
    return ZonedDateTime.ofInstant(this, zone);
  };

  _proto.toEpochMilli = function toEpochMilli() {
    var millis = MathUtil.safeMultiply(this._seconds, 1000);
    return millis + MathUtil.intDiv(this._nanos, NANOS_PER_MILLI);
  };

  _proto.compareTo = function compareTo(otherInstant) {
    requireNonNull(otherInstant, 'otherInstant');
    requireInstance(otherInstant, Instant, 'otherInstant');
    var cmp = MathUtil.compareNumbers(this._seconds, otherInstant._seconds);

    if (cmp !== 0) {
      return cmp;
    }

    return this._nanos - otherInstant._nanos;
  };

  _proto.isAfter = function isAfter(otherInstant) {
    return this.compareTo(otherInstant) > 0;
  };

  _proto.isBefore = function isBefore(otherInstant) {
    return this.compareTo(otherInstant) < 0;
  };

  _proto.equals = function equals(other) {
    if (this === other) {
      return true;
    }

    if (other instanceof Instant) {
      return this.epochSecond() === other.epochSecond() && this.nano() === other.nano();
    }

    return false;
  };

  _proto.hashCode = function hashCode() {
    return MathUtil.hashCode(this._seconds, this._nanos);
  };

  _proto.toString = function toString() {
    return DateTimeFormatter.ISO_INSTANT.format(this);
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  return Instant;
}(Temporal);
function _init$2() {
  Instant.MIN_SECONDS = -31619119219200;
  Instant.MAX_SECONDS = 31494816403199;
  Instant.EPOCH = new Instant(0, 0);
  Instant.MIN = Instant.ofEpochSecond(Instant.MIN_SECONDS, 0);
  Instant.MAX = Instant.ofEpochSecond(Instant.MAX_SECONDS, 999999999);
  Instant.FROM = createTemporalQuery('Instant.FROM', function (temporal) {
    return Instant.from(temporal);
  });
}

var Clock = function () {
  function Clock() {}

  Clock.systemUTC = function systemUTC() {
    return new SystemClock(ZoneOffset.UTC);
  };

  Clock.systemDefaultZone = function systemDefaultZone() {
    return new SystemClock(ZoneId.systemDefault());
  };

  Clock.system = function system(zone) {
    return new SystemClock(zone);
  };

  Clock.fixed = function fixed(fixedInstant, zoneId) {
    return new FixedClock(fixedInstant, zoneId);
  };

  Clock.offset = function offset(baseClock, duration) {
    return new OffsetClock(baseClock, duration);
  };

  var _proto = Clock.prototype;

  _proto.millis = function millis() {
    abstractMethodFail('Clock.millis');
  };

  _proto.instant = function instant() {
    abstractMethodFail('Clock.instant');
  };

  _proto.zone = function zone() {
    abstractMethodFail('Clock.zone');
  };

  _proto.withZone = function withZone() {
    abstractMethodFail('Clock.withZone');
  };

  return Clock;
}();

var SystemClock = function (_Clock) {
  _inheritsLoose(SystemClock, _Clock);

  function SystemClock(zone) {
    var _this;

    requireNonNull(zone, 'zone');
    _this = _Clock.call(this) || this;
    _this._zone = zone;
    return _this;
  }

  var _proto2 = SystemClock.prototype;

  _proto2.zone = function zone() {
    return this._zone;
  };

  _proto2.millis = function millis() {
    return new Date().getTime();
  };

  _proto2.instant = function instant() {
    return Instant.ofEpochMilli(this.millis());
  };

  _proto2.equals = function equals(obj) {
    if (obj instanceof SystemClock) {
      return this._zone.equals(obj._zone);
    }

    return false;
  };

  _proto2.withZone = function withZone(zone) {
    if (zone.equals(this._zone)) {
      return this;
    }

    return new SystemClock(zone);
  };

  _proto2.toString = function toString() {
    return "SystemClock[" + this._zone.toString() + "]";
  };

  return SystemClock;
}(Clock);

var FixedClock = function (_Clock2) {
  _inheritsLoose(FixedClock, _Clock2);

  function FixedClock(fixedInstant, zoneId) {
    var _this2;

    _this2 = _Clock2.call(this) || this;
    _this2._instant = fixedInstant;
    _this2._zoneId = zoneId;
    return _this2;
  }

  var _proto3 = FixedClock.prototype;

  _proto3.instant = function instant() {
    return this._instant;
  };

  _proto3.millis = function millis() {
    return this._instant.toEpochMilli();
  };

  _proto3.zone = function zone() {
    return this._zoneId;
  };

  _proto3.toString = function toString() {
    return 'FixedClock[]';
  };

  _proto3.equals = function equals(obj) {
    if (obj instanceof FixedClock) {
      return this._instant.equals(obj._instant) && this._zoneId.equals(obj._zoneId);
    }

    return false;
  };

  _proto3.withZone = function withZone(zone) {
    if (zone.equals(this._zoneId)) {
      return this;
    }

    return new FixedClock(this._instant, zone);
  };

  return FixedClock;
}(Clock);

var OffsetClock = function (_Clock3) {
  _inheritsLoose(OffsetClock, _Clock3);

  function OffsetClock(baseClock, offset) {
    var _this3;

    _this3 = _Clock3.call(this) || this;
    _this3._baseClock = baseClock;
    _this3._offset = offset;
    return _this3;
  }

  var _proto4 = OffsetClock.prototype;

  _proto4.zone = function zone() {
    return this._baseClock.zone();
  };

  _proto4.withZone = function withZone(zone) {
    if (zone.equals(this._baseClock.zone())) {
      return this;
    }

    return new OffsetClock(this._baseClock.withZone(zone), this._offset);
  };

  _proto4.millis = function millis() {
    return this._baseClock.millis() + this._offset.toMillis();
  };

  _proto4.instant = function instant() {
    return this._baseClock.instant().plus(this._offset);
  };

  _proto4.equals = function equals(obj) {
    if (obj instanceof OffsetClock) {
      return this._baseClock.equals(obj._baseClock) && this._offset.equals(obj._offset);
    }

    return false;
  };

  _proto4.toString = function toString() {
    return "OffsetClock[" + this._baseClock + "," + this._offset + "]";
  };

  return OffsetClock;
}(Clock);

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var ZoneOffsetTransition = function () {
  ZoneOffsetTransition.of = function of(transition, offsetBefore, offsetAfter) {
    return new ZoneOffsetTransition(transition, offsetBefore, offsetAfter);
  };

  function ZoneOffsetTransition(transition, offsetBefore, offsetAfter) {
    requireNonNull(transition, 'transition');
    requireNonNull(offsetBefore, 'offsetBefore');
    requireNonNull(offsetAfter, 'offsetAfter');

    if (offsetBefore.equals(offsetAfter)) {
      throw new IllegalArgumentException('Offsets must not be equal');
    }

    if (transition.nano() !== 0) {
      throw new IllegalArgumentException('Nano-of-second must be zero');
    }

    if (transition instanceof LocalDateTime) {
      this._transition = transition;
    } else {
      this._transition = LocalDateTime.ofEpochSecond(transition, 0, offsetBefore);
    }

    this._offsetBefore = offsetBefore;
    this._offsetAfter = offsetAfter;
  }

  var _proto = ZoneOffsetTransition.prototype;

  _proto.instant = function instant() {
    return this._transition.toInstant(this._offsetBefore);
  };

  _proto.toEpochSecond = function toEpochSecond() {
    return this._transition.toEpochSecond(this._offsetBefore);
  };

  _proto.dateTimeBefore = function dateTimeBefore() {
    return this._transition;
  };

  _proto.dateTimeAfter = function dateTimeAfter() {
    return this._transition.plusSeconds(this.durationSeconds());
  };

  _proto.offsetBefore = function offsetBefore() {
    return this._offsetBefore;
  };

  _proto.offsetAfter = function offsetAfter() {
    return this._offsetAfter;
  };

  _proto.duration = function duration() {
    return Duration.ofSeconds(this.durationSeconds());
  };

  _proto.durationSeconds = function durationSeconds() {
    return this._offsetAfter.totalSeconds() - this._offsetBefore.totalSeconds();
  };

  _proto.isGap = function isGap() {
    return this._offsetAfter.totalSeconds() > this._offsetBefore.totalSeconds();
  };

  _proto.isOverlap = function isOverlap() {
    return this._offsetAfter.totalSeconds() < this._offsetBefore.totalSeconds();
  };

  _proto.isValidOffset = function isValidOffset(offset) {
    return this.isGap() ? false : this._offsetBefore.equals(offset) || this._offsetAfter.equals(offset);
  };

  _proto.validOffsets = function validOffsets() {
    if (this.isGap()) {
      return [];
    } else {
      return [this._offsetBefore, this._offsetAfter];
    }
  };

  _proto.compareTo = function compareTo(transition) {
    return this.instant().compareTo(transition.instant());
  };

  _proto.equals = function equals(other) {
    if (other === this) {
      return true;
    }

    if (other instanceof ZoneOffsetTransition) {
      var d = other;
      return this._transition.equals(d._transition) && this._offsetBefore.equals(d.offsetBefore()) && this._offsetAfter.equals(d.offsetAfter());
    }

    return false;
  };

  _proto.hashCode = function hashCode() {
    return this._transition.hashCode() ^ this._offsetBefore.hashCode() ^ this._offsetAfter.hashCode() >>> 16;
  };

  _proto.toString = function toString() {
    return "Transition[" + (this.isGap() ? 'Gap' : 'Overlap') + " at " + this._transition.toString() + this._offsetBefore.toString() + " to " + this._offsetAfter + "]";
  };

  return ZoneOffsetTransition;
}();

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
function _init$1() {
  TemporalQueries.ZONE_ID = createTemporalQuery('ZONE_ID', function (temporal) {
    return temporal.query(TemporalQueries.ZONE_ID);
  });
  TemporalQueries.CHRONO = createTemporalQuery('CHRONO', function (temporal) {
    return temporal.query(TemporalQueries.CHRONO);
  });
  TemporalQueries.PRECISION = createTemporalQuery('PRECISION', function (temporal) {
    return temporal.query(TemporalQueries.PRECISION);
  });
  TemporalQueries.OFFSET = createTemporalQuery('OFFSET', function (temporal) {
    if (temporal.isSupported(ChronoField.OFFSET_SECONDS)) {
      return ZoneOffset.ofTotalSeconds(temporal.get(ChronoField.OFFSET_SECONDS));
    }

    return null;
  });
  TemporalQueries.ZONE = createTemporalQuery('ZONE', function (temporal) {
    var zone = temporal.query(TemporalQueries.ZONE_ID);
    return zone != null ? zone : temporal.query(TemporalQueries.OFFSET);
  });
  TemporalQueries.LOCAL_DATE = createTemporalQuery('LOCAL_DATE', function (temporal) {
    if (temporal.isSupported(ChronoField.EPOCH_DAY)) {
      return LocalDate.ofEpochDay(temporal.getLong(ChronoField.EPOCH_DAY));
    }

    return null;
  });
  TemporalQueries.LOCAL_TIME = createTemporalQuery('LOCAL_TIME', function (temporal) {
    if (temporal.isSupported(ChronoField.NANO_OF_DAY)) {
      return LocalTime.ofNanoOfDay(temporal.getLong(ChronoField.NANO_OF_DAY));
    }

    return null;
  });
}

var SystemDefaultZoneRules = function (_ZoneRules) {
  _inheritsLoose(SystemDefaultZoneRules, _ZoneRules);

  function SystemDefaultZoneRules() {
    return _ZoneRules.apply(this, arguments) || this;
  }

  var _proto = SystemDefaultZoneRules.prototype;

  _proto.isFixedOffset = function isFixedOffset() {
    return false;
  };

  _proto.offsetOfInstant = function offsetOfInstant(instant) {
    var offsetInMinutes = new Date(instant.toEpochMilli()).getTimezoneOffset();
    return ZoneOffset.ofTotalMinutes(offsetInMinutes * -1);
  };

  _proto.offsetOfEpochMilli = function offsetOfEpochMilli(epochMilli) {
    var offsetInMinutes = new Date(epochMilli).getTimezoneOffset();
    return ZoneOffset.ofTotalMinutes(offsetInMinutes * -1);
  };

  _proto.offsetOfLocalDateTime = function offsetOfLocalDateTime(localDateTime) {
    var epochMilli = localDateTime.toEpochSecond(ZoneOffset.UTC) * 1000;
    var offsetInMinutesBeforePossibleTransition = new Date(epochMilli).getTimezoneOffset();
    var epochMilliSystemZone = epochMilli + offsetInMinutesBeforePossibleTransition * 60000;
    var offsetInMinutesAfterPossibleTransition = new Date(epochMilliSystemZone).getTimezoneOffset();
    return ZoneOffset.ofTotalMinutes(offsetInMinutesAfterPossibleTransition * -1);
  };

  _proto.validOffsets = function validOffsets(localDateTime) {
    return [this.offsetOfLocalDateTime(localDateTime)];
  };

  _proto.transition = function transition() {
    return null;
  };

  _proto.standardOffset = function standardOffset(instant) {
    return this.offsetOfInstant(instant);
  };

  _proto.daylightSavings = function daylightSavings() {
    this._throwNotSupported();
  };

  _proto.isDaylightSavings = function isDaylightSavings() {
    this._throwNotSupported();
  };

  _proto.isValidOffset = function isValidOffset(dateTime, offset) {
    return this.offsetOfLocalDateTime(dateTime).equals(offset);
  };

  _proto.nextTransition = function nextTransition() {
    this._throwNotSupported();
  };

  _proto.previousTransition = function previousTransition() {
    this._throwNotSupported();
  };

  _proto.transitions = function transitions() {
    this._throwNotSupported();
  };

  _proto.transitionRules = function transitionRules() {
    this._throwNotSupported();
  };

  _proto._throwNotSupported = function _throwNotSupported() {
    throw new DateTimeException('not supported operation');
  };

  _proto.equals = function equals(other) {
    if (this === other || other instanceof SystemDefaultZoneRules) {
      return true;
    } else {
      return false;
    }
  };

  _proto.toString = function toString() {
    return 'SYSTEM';
  };

  return SystemDefaultZoneRules;
}(ZoneRules);

var SystemDefaultZoneId = function (_ZoneId) {
  _inheritsLoose(SystemDefaultZoneId, _ZoneId);

  function SystemDefaultZoneId() {
    var _this;

    _this = _ZoneId.call(this) || this;
    _this._rules = new SystemDefaultZoneRules();
    return _this;
  }

  var _proto = SystemDefaultZoneId.prototype;

  _proto.rules = function rules() {
    return this._rules;
  };

  _proto.equals = function equals(other) {
    if (this === other) {
      return true;
    }

    return false;
  };

  _proto.id = function id() {
    return 'SYSTEM';
  };

  return SystemDefaultZoneId;
}(ZoneId);

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var ZoneIdFactory = function () {
  function ZoneIdFactory() {}

  ZoneIdFactory.systemDefault = function systemDefault() {
    return SYSTEM_DEFAULT_ZONE_ID_INSTANCE;
  };

  ZoneIdFactory.getAvailableZoneIds = function getAvailableZoneIds() {
    return ZoneRulesProvider.getAvailableZoneIds();
  };

  ZoneIdFactory.of = function of(zoneId) {
    requireNonNull(zoneId, 'zoneId');

    if (zoneId === 'Z') {
      return ZoneOffset.UTC;
    }

    if (zoneId.length === 1) {
      throw new DateTimeException("Invalid zone: " + zoneId);
    }

    if (StringUtil.startsWith(zoneId, '+') || StringUtil.startsWith(zoneId, '-')) {
      return ZoneOffset.of(zoneId);
    }

    if (zoneId === 'UTC' || zoneId === 'GMT' || zoneId === 'GMT0' || zoneId === 'UT') {
      return new ZoneRegion(zoneId, ZoneOffset.UTC.rules());
    }

    if (StringUtil.startsWith(zoneId, 'UTC+') || StringUtil.startsWith(zoneId, 'GMT+') || StringUtil.startsWith(zoneId, 'UTC-') || StringUtil.startsWith(zoneId, 'GMT-')) {
      var offset = ZoneOffset.of(zoneId.substring(3));

      if (offset.totalSeconds() === 0) {
        return new ZoneRegion(zoneId.substring(0, 3), offset.rules());
      }

      return new ZoneRegion(zoneId.substring(0, 3) + offset.id(), offset.rules());
    }

    if (StringUtil.startsWith(zoneId, 'UT+') || StringUtil.startsWith(zoneId, 'UT-')) {
      var _offset = ZoneOffset.of(zoneId.substring(2));

      if (_offset.totalSeconds() === 0) {
        return new ZoneRegion('UT', _offset.rules());
      }

      return new ZoneRegion("UT" + _offset.id(), _offset.rules());
    }

    if (zoneId === 'SYSTEM') {
      return ZoneId.systemDefault();
    }

    return ZoneRegion.ofId(zoneId);
  };

  ZoneIdFactory.ofOffset = function ofOffset(prefix, offset) {
    requireNonNull(prefix, 'prefix');
    requireNonNull(offset, 'offset');

    if (prefix.length === 0) {
      return offset;
    }

    if (prefix === 'GMT' || prefix === 'UTC' || prefix === 'UT') {
      if (offset.totalSeconds() === 0) {
        return new ZoneRegion(prefix, offset.rules());
      }

      return new ZoneRegion(prefix + offset.id(), offset.rules());
    }

    throw new IllegalArgumentException("Invalid prefix, must be GMT, UTC or UT: " + prefix);
  };

  ZoneIdFactory.from = function from(temporal) {
    requireNonNull(temporal, 'temporal');
    var obj = temporal.query(TemporalQueries.zone());

    if (obj == null) {
      throw new DateTimeException("Unable to obtain ZoneId from TemporalAccessor: " + temporal + ", type " + (temporal.constructor != null ? temporal.constructor.name : ''));
    }

    return obj;
  };

  return ZoneIdFactory;
}();
var SYSTEM_DEFAULT_ZONE_ID_INSTANCE = null;
function _init() {
  SYSTEM_DEFAULT_ZONE_ID_INSTANCE = new SystemDefaultZoneId();
  ZoneId.systemDefault = ZoneIdFactory.systemDefault;
  ZoneId.getAvailableZoneIds = ZoneIdFactory.getAvailableZoneIds;
  ZoneId.of = ZoneIdFactory.of;
  ZoneId.ofOffset = ZoneIdFactory.ofOffset;
  ZoneId.from = ZoneIdFactory.from;
  ZoneOffset.from = ZoneIdFactory.from;
  ZoneId.SYSTEM = SYSTEM_DEFAULT_ZONE_ID_INSTANCE;
  ZoneId.UTC = ZoneOffset.ofTotalSeconds(0);
}

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var isInit = false;

function init() {
  if (isInit) {
    return;
  }

  isInit = true;
  _init$m();
  _init$n();
  _init$l();
  _init$k();
  _init$3();
  _init$f();
  _init$1();
  _init$j();
  _init$2();
  _init$5();
  _init$4();
  _init$a();
  _init$i();
  _init$b();
  _init$c();
  _init$h();
  _init$g();
  _init$7();
  _init();
  _init$9();
  _init$d();
  _init$e();
  _init$6();
  _init$8();
}

init();

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

var ToNativeJsConverter = function () {
  function ToNativeJsConverter(temporal, zone) {
    var zonedDateTime;

    if (temporal instanceof Instant) {
      this.instant = temporal;
      return;
    } else if (temporal instanceof LocalDate) {
      zone = zone == null ? ZoneId.systemDefault() : zone;
      zonedDateTime = temporal.atStartOfDay(zone);
    } else if (temporal instanceof LocalDateTime) {
      zone = zone == null ? ZoneId.systemDefault() : zone;
      zonedDateTime = temporal.atZone(zone);
    } else if (temporal instanceof ZonedDateTime) {
      if (zone == null) {
        zonedDateTime = temporal;
      } else {
        zonedDateTime = temporal.withZoneSameInstant(zone);
      }
    } else {
      throw new IllegalArgumentException("unsupported instance for convert operation:" + temporal);
    }

    this.instant = zonedDateTime.toInstant();
  }

  var _proto = ToNativeJsConverter.prototype;

  _proto.toDate = function toDate() {
    return new Date(this.instant.toEpochMilli());
  };

  _proto.toEpochMilli = function toEpochMilli() {
    return this.instant.toEpochMilli();
  };

  return ToNativeJsConverter;
}();

function convert(temporal, zone) {
  return new ToNativeJsConverter(temporal, zone);
}

var NativeJsTemporal = function (_TemporalAccessor) {
  _inheritsLoose(NativeJsTemporal, _TemporalAccessor);

  function NativeJsTemporal(date, zone) {
    var _this;

    if (zone === void 0) {
      zone = ZoneId.systemDefault();
    }

    _this = _TemporalAccessor.call(this) || this;
    _this._zone = zone;

    if (date instanceof Date) {
      _this._epochMilli = date.getTime();
      return _assertThisInitialized(_this);
    } else if (typeof date.toDate === 'function' && date.toDate() instanceof Date) {
      _this._epochMilli = date.toDate().getTime();
      return _assertThisInitialized(_this);
    }

    assert(false, 'date must be either a javascript date or a moment');
    return _this;
  }

  var _proto = NativeJsTemporal.prototype;

  _proto.query = function query(_query) {
    requireNonNull(_query, 'query');

    if (_query === TemporalQueries.localDate()) {
      return LocalDate.ofInstant(Instant.ofEpochMilli(this._epochMilli), this._zone);
    } else if (_query === TemporalQueries.localTime()) {
      return LocalTime.ofInstant(Instant.ofEpochMilli(this._epochMilli), this._zone);
    } else if (_query === TemporalQueries.zone()) {
      return this._zone;
    }

    return _TemporalAccessor.prototype.query.call(this, _query);
  };

  _proto.get = function get(field) {
    return this.getLong(field);
  };

  _proto.getLong = function getLong(field) {
    requireNonNull(field, 'field');

    if (field instanceof ChronoField) {
      switch (field) {
        case ChronoField.NANO_OF_SECOND:
          return MathUtil.floorMod(this._epochMilli, 1000) * 1000000;

        case ChronoField.INSTANT_SECONDS:
          return MathUtil.floorDiv(this._epochMilli, 1000);
      }

      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.getFrom(this);
  };

  _proto.isSupported = function isSupported(field) {
    return field === ChronoField.INSTANT_SECONDS || field === ChronoField.NANO_OF_SECOND;
  };

  return NativeJsTemporal;
}(TemporalAccessor);

function nativeJs(date, zone) {
  return new NativeJsTemporal(date, zone);
}

function bindUse(jsJoda) {
  var used = [];
  return function use(fn) {
    if (!~used.indexOf(fn)) {
      fn(jsJoda);
      used.push(fn);
    }

    return jsJoda;
  };
}

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var _ = {
  assert: assert$1,
  DateTimeBuilder: DateTimeBuilder,
  DateTimeParseContext: DateTimeParseContext,
  DateTimePrintContext: DateTimePrintContext,
  MathUtil: MathUtil,
  StringUtil: StringUtil,
  StringBuilder: StringBuilder
};
var jsJodaExports = {
  _: _,
  convert: convert,
  nativeJs: nativeJs,
  ArithmeticException: ArithmeticException,
  DateTimeException: DateTimeException,
  DateTimeParseException: DateTimeParseException,
  IllegalArgumentException: IllegalArgumentException,
  IllegalStateException: IllegalStateException,
  UnsupportedTemporalTypeException: UnsupportedTemporalTypeException,
  NullPointerException: NullPointerException,
  Clock: Clock,
  DayOfWeek: DayOfWeek,
  Duration: Duration,
  Instant: Instant,
  LocalDate: LocalDate,
  LocalTime: LocalTime,
  LocalDateTime: LocalDateTime,
  OffsetTime: OffsetTime,
  OffsetDateTime: OffsetDateTime,
  Month: Month,
  MonthDay: MonthDay,
  Period: Period,
  Year: Year,
  YearConstants: YearConstants,
  YearMonth: YearMonth,
  ZonedDateTime: ZonedDateTime,
  ZoneOffset: ZoneOffset,
  ZoneId: ZoneId,
  ZoneRegion: ZoneRegion,
  ZoneOffsetTransition: ZoneOffsetTransition,
  ZoneRules: ZoneRules,
  ZoneRulesProvider: ZoneRulesProvider,
  ChronoLocalDate: ChronoLocalDate,
  ChronoLocalDateTime: ChronoLocalDateTime,
  ChronoZonedDateTime: ChronoZonedDateTime,
  IsoChronology: IsoChronology,
  ChronoField: ChronoField,
  ChronoUnit: ChronoUnit,
  IsoFields: IsoFields,
  Temporal: Temporal,
  TemporalAccessor: TemporalAccessor,
  TemporalAdjuster: TemporalAdjuster,
  TemporalAdjusters: TemporalAdjusters,
  TemporalAmount: TemporalAmount,
  TemporalField: TemporalField,
  TemporalQueries: TemporalQueries,
  TemporalQuery: TemporalQuery,
  TemporalUnit: TemporalUnit,
  ValueRange: ValueRange,
  DateTimeFormatter: DateTimeFormatter,
  DateTimeFormatterBuilder: DateTimeFormatterBuilder,
  DecimalStyle: DecimalStyle,
  ResolverStyle: ResolverStyle,
  SignStyle: SignStyle,
  TextStyle: TextStyle
};
var use = bindUse(jsJodaExports);
jsJodaExports.use = use;

exports.ArithmeticException = ArithmeticException;
exports.ChronoField = ChronoField;
exports.ChronoLocalDate = ChronoLocalDate;
exports.ChronoLocalDateTime = ChronoLocalDateTime;
exports.ChronoUnit = ChronoUnit;
exports.ChronoZonedDateTime = ChronoZonedDateTime;
exports.Clock = Clock;
exports.DateTimeException = DateTimeException;
exports.DateTimeFormatter = DateTimeFormatter;
exports.DateTimeFormatterBuilder = DateTimeFormatterBuilder;
exports.DateTimeParseException = DateTimeParseException;
exports.DayOfWeek = DayOfWeek;
exports.DecimalStyle = DecimalStyle;
exports.Duration = Duration;
exports.IllegalArgumentException = IllegalArgumentException;
exports.IllegalStateException = IllegalStateException;
exports.Instant = Instant;
exports.IsoChronology = IsoChronology;
exports.IsoFields = IsoFields;
exports.LocalDate = LocalDate;
exports.LocalDateTime = LocalDateTime;
exports.LocalTime = LocalTime;
exports.Month = Month;
exports.MonthDay = MonthDay;
exports.NullPointerException = NullPointerException;
exports.OffsetDateTime = OffsetDateTime;
exports.OffsetTime = OffsetTime;
exports.Period = Period;
exports.ResolverStyle = ResolverStyle;
exports.SignStyle = SignStyle;
exports.Temporal = Temporal;
exports.TemporalAccessor = TemporalAccessor;
exports.TemporalAdjuster = TemporalAdjuster;
exports.TemporalAdjusters = TemporalAdjusters;
exports.TemporalAmount = TemporalAmount;
exports.TemporalField = TemporalField;
exports.TemporalQueries = TemporalQueries;
exports.TemporalQuery = TemporalQuery;
exports.TemporalUnit = TemporalUnit;
exports.TextStyle = TextStyle;
exports.UnsupportedTemporalTypeException = UnsupportedTemporalTypeException;
exports.ValueRange = ValueRange;
exports.Year = Year;
exports.YearConstants = YearConstants;
exports.YearMonth = YearMonth;
exports.ZoneId = ZoneId;
exports.ZoneOffset = ZoneOffset;
exports.ZoneOffsetTransition = ZoneOffsetTransition;
exports.ZoneRegion = ZoneRegion;
exports.ZoneRules = ZoneRules;
exports.ZoneRulesProvider = ZoneRulesProvider;
exports.ZonedDateTime = ZonedDateTime;
exports._ = _;
exports.convert = convert;
exports.nativeJs = nativeJs;
exports.use = use;
//# sourceMappingURL=js-joda.cjs.js.map
//! @version @js-joda/core - 5.2.0
//! @copyright (c) 2015-present, Philipp Thürwächter, Pattrick Hüper & js-joda contributors
//! @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
//! @license BSD-3-Clause (see LICENSE in the root directory of this source tree)

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
function createErrorType(name, init, superErrorClass) {
  if (superErrorClass === void 0) {
    superErrorClass = Error;
  }

  function JsJodaException(message) {
    if (!Error.captureStackTrace) {
      this.stack = new Error().stack;
    } else {
      Error.captureStackTrace(this, this.constructor);
    }

    this.message = message;
    init && init.apply(this, arguments);

    this.toString = function () {
      return this.name + ": " + this.message;
    };
  }

  JsJodaException.prototype = Object.create(superErrorClass.prototype);
  JsJodaException.prototype.name = name;
  JsJodaException.prototype.constructor = JsJodaException;
  return JsJodaException;
}

var DateTimeException = createErrorType('DateTimeException', messageWithCause);
var DateTimeParseException = createErrorType('DateTimeParseException', messageForDateTimeParseException);
var UnsupportedTemporalTypeException = createErrorType('UnsupportedTemporalTypeException', null, DateTimeException);
var ArithmeticException = createErrorType('ArithmeticException');
var IllegalArgumentException = createErrorType('IllegalArgumentException');
var IllegalStateException = createErrorType('IllegalStateException');
var NullPointerException = createErrorType('NullPointerException');

function messageWithCause(message, cause) {
  if (cause === void 0) {
    cause = null;
  }

  var msg = message || this.name;

  if (cause !== null && cause instanceof Error) {
    msg += "\n-------\nCaused by: " + cause.stack + "\n-------\n";
  }

  this.message = msg;
}

function messageForDateTimeParseException(message, text, index, cause) {
  if (text === void 0) {
    text = '';
  }

  if (index === void 0) {
    index = 0;
  }

  if (cause === void 0) {
    cause = null;
  }

  var msg = message || this.name;
  msg += ": " + text + ", at index: " + index;

  if (cause !== null && cause instanceof Error) {
    msg += "\n-------\nCaused by: " + cause.stack + "\n-------\n";
  }

  this.message = msg;

  this.parsedString = function () {
    return text;
  };

  this.errorIndex = function () {
    return index;
  };
}

function _inheritsLoose(subClass, superClass) {
  subClass.prototype = Object.create(superClass.prototype);
  subClass.prototype.constructor = subClass;

  _setPrototypeOf(subClass, superClass);
}

function _setPrototypeOf(o, p) {
  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
    o.__proto__ = p;
    return o;
  };

  return _setPrototypeOf(o, p);
}

function _assertThisInitialized(self) {
  if (self === void 0) {
    throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
  }

  return self;
}

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
function assert(assertion, msg, error) {
  if (!assertion) {
    if (error) {
      throw new error(msg);
    } else {
      throw new Error(msg);
    }
  }
}
function requireNonNull(value, parameterName) {
  if (value == null) {
    throw new NullPointerException(parameterName + " must not be null");
  }

  return value;
}
function requireInstance(value, _class, parameterName) {
  if (!(value instanceof _class)) {
    throw new IllegalArgumentException(parameterName + " must be an instance of " + (_class.name ? _class.name : _class) + (value && value.constructor && value.constructor.name ? ", but is " + value.constructor.name : ''));
  }

  return value;
}
function abstractMethodFail(methodName) {
  throw new TypeError("abstract method \"" + methodName + "\" is not implemented");
}

var assert$1 = /*#__PURE__*/Object.freeze({
    __proto__: null,
    assert: assert,
    requireNonNull: requireNonNull,
    requireInstance: requireInstance,
    abstractMethodFail: abstractMethodFail
});

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var MAX_SAFE_INTEGER = 9007199254740991;
var MIN_SAFE_INTEGER = -9007199254740991;
var MathUtil = function () {
  function MathUtil() {}

  MathUtil.intDiv = function intDiv(x, y) {
    var r = x / y;
    r = MathUtil.roundDown(r);
    return MathUtil.safeZero(r);
  };

  MathUtil.intMod = function intMod(x, y) {
    var r = x - MathUtil.intDiv(x, y) * y;
    r = MathUtil.roundDown(r);
    return MathUtil.safeZero(r);
  };

  MathUtil.roundDown = function roundDown(r) {
    if (r < 0) {
      return Math.ceil(r);
    } else {
      return Math.floor(r);
    }
  };

  MathUtil.floorDiv = function floorDiv(x, y) {
    var r = Math.floor(x / y);
    return MathUtil.safeZero(r);
  };

  MathUtil.floorMod = function floorMod(x, y) {
    var r = x - MathUtil.floorDiv(x, y) * y;
    return MathUtil.safeZero(r);
  };

  MathUtil.safeAdd = function safeAdd(x, y) {
    MathUtil.verifyInt(x);
    MathUtil.verifyInt(y);

    if (x === 0) {
      return MathUtil.safeZero(y);
    }

    if (y === 0) {
      return MathUtil.safeZero(x);
    }

    var r = MathUtil.safeToInt(x + y);

    if (r === x || r === y) {
      throw new ArithmeticException('Invalid addition beyond MAX_SAFE_INTEGER!');
    }

    return r;
  };

  MathUtil.safeSubtract = function safeSubtract(x, y) {
    MathUtil.verifyInt(x);
    MathUtil.verifyInt(y);

    if (x === 0 && y === 0) {
      return 0;
    } else if (x === 0) {
      return MathUtil.safeZero(-1 * y);
    } else if (y === 0) {
      return MathUtil.safeZero(x);
    }

    return MathUtil.safeToInt(x - y);
  };

  MathUtil.safeMultiply = function safeMultiply(x, y) {
    MathUtil.verifyInt(x);
    MathUtil.verifyInt(y);

    if (x === 1) {
      return MathUtil.safeZero(y);
    }

    if (y === 1) {
      return MathUtil.safeZero(x);
    }

    if (x === 0 || y === 0) {
      return 0;
    }

    var r = MathUtil.safeToInt(x * y);

    if (r / y !== x || x === MIN_SAFE_INTEGER && y === -1 || y === MIN_SAFE_INTEGER && x === -1) {
      throw new ArithmeticException("Multiplication overflows: " + x + " * " + y);
    }

    return r;
  };

  MathUtil.parseInt = function (_parseInt) {
    function parseInt(_x) {
      return _parseInt.apply(this, arguments);
    }

    parseInt.toString = function () {
      return _parseInt.toString();
    };

    return parseInt;
  }(function (value) {
    var r = parseInt(value);
    return MathUtil.safeToInt(r);
  });

  MathUtil.safeToInt = function safeToInt(value) {
    MathUtil.verifyInt(value);
    return MathUtil.safeZero(value);
  };

  MathUtil.verifyInt = function verifyInt(value) {
    if (value == null) {
      throw new ArithmeticException("Invalid value: '" + value + "', using null or undefined as argument");
    }

    if (isNaN(value)) {
      throw new ArithmeticException('Invalid int value, using NaN as argument');
    }

    if (value % 1 !== 0) {
      throw new ArithmeticException("Invalid value: '" + value + "' is a float");
    }

    if (value > MAX_SAFE_INTEGER || value < MIN_SAFE_INTEGER) {
      throw new ArithmeticException("Calculation overflows an int: " + value);
    }
  };

  MathUtil.safeZero = function safeZero(value) {
    return value === 0 ? 0 : +value;
  };

  MathUtil.compareNumbers = function compareNumbers(a, b) {
    if (a < b) {
      return -1;
    }

    if (a > b) {
      return 1;
    }

    return 0;
  };

  MathUtil.smi = function smi(int) {
    return int >>> 1 & 0x40000000 | int & 0xBFFFFFFF;
  };

  MathUtil.hash = function hash(number) {
    if (number !== number || number === Infinity) {
      return 0;
    }

    var result = number;

    while (number > 0xFFFFFFFF) {
      number /= 0xFFFFFFFF;
      result ^= number;
    }

    return MathUtil.smi(result);
  };

  MathUtil.hashCode = function hashCode() {
    var result = 17;

    for (var _len = arguments.length, numbers = new Array(_len), _key = 0; _key < _len; _key++) {
      numbers[_key] = arguments[_key];
    }

    for (var _i = 0, _numbers = numbers; _i < _numbers.length; _i++) {
      var n = _numbers[_i];
      result = (result << 5) - result + MathUtil.hash(n);
    }

    return MathUtil.hash(result);
  };

  return MathUtil;
}();
MathUtil.MAX_SAFE_INTEGER = MAX_SAFE_INTEGER;
MathUtil.MIN_SAFE_INTEGER = MIN_SAFE_INTEGER;

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var Enum = function () {
  function Enum(name) {
    this._name = name;
  }

  var _proto = Enum.prototype;

  _proto.equals = function equals(other) {
    return this === other;
  };

  _proto.toString = function toString() {
    return this._name;
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  return Enum;
}();

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var TemporalAmount = function () {
  function TemporalAmount() {}

  var _proto = TemporalAmount.prototype;

  _proto.get = function get(unit) {
    abstractMethodFail('get');
  };

  _proto.units = function units() {
    abstractMethodFail('units');
  };

  _proto.addTo = function addTo(temporal) {
    abstractMethodFail('addTo');
  };

  _proto.subtractFrom = function subtractFrom(temporal) {
    abstractMethodFail('subtractFrom');
  };

  return TemporalAmount;
}();

if (typeof Symbol !== 'undefined' && Symbol.toPrimitive) {
  TemporalAmount.prototype[Symbol.toPrimitive] = function (hint) {
    if (hint !== 'number') {
      return this.toString();
    }

    throw new TypeError('A conversion from TemporalAmount to a number is not allowed. ' + 'To compare use the methods .equals(), .compareTo(), .isBefore() ' + 'or one that is more suitable to your use case.');
  };
}

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var TemporalUnit = function () {
  function TemporalUnit() {}

  var _proto = TemporalUnit.prototype;

  _proto.duration = function duration() {
    abstractMethodFail('duration');
  };

  _proto.isDurationEstimated = function isDurationEstimated() {
    abstractMethodFail('isDurationEstimated');
  };

  _proto.isDateBased = function isDateBased() {
    abstractMethodFail('isDateBased');
  };

  _proto.isTimeBased = function isTimeBased() {
    abstractMethodFail('isTimeBased');
  };

  _proto.isSupportedBy = function isSupportedBy(temporal) {
    abstractMethodFail('isSupportedBy');
  };

  _proto.addTo = function addTo(dateTime, periodToAdd) {
    abstractMethodFail('addTo');
  };

  _proto.between = function between(temporal1, temporal2) {
    abstractMethodFail('between');
  };

  return TemporalUnit;
}();

var Duration = function (_TemporalAmount) {
  _inheritsLoose(Duration, _TemporalAmount);

  function Duration(seconds, nanos) {
    var _this;

    _this = _TemporalAmount.call(this) || this;
    _this._seconds = MathUtil.safeToInt(seconds);
    _this._nanos = MathUtil.safeToInt(nanos);
    return _this;
  }

  Duration.ofDays = function ofDays(days) {
    return Duration._create(MathUtil.safeMultiply(days, LocalTime.SECONDS_PER_DAY), 0);
  };

  Duration.ofHours = function ofHours(hours) {
    return Duration._create(MathUtil.safeMultiply(hours, LocalTime.SECONDS_PER_HOUR), 0);
  };

  Duration.ofMinutes = function ofMinutes(minutes) {
    return Duration._create(MathUtil.safeMultiply(minutes, LocalTime.SECONDS_PER_MINUTE), 0);
  };

  Duration.ofSeconds = function ofSeconds(seconds, nanoAdjustment) {
    if (nanoAdjustment === void 0) {
      nanoAdjustment = 0;
    }

    var secs = MathUtil.safeAdd(seconds, MathUtil.floorDiv(nanoAdjustment, LocalTime.NANOS_PER_SECOND));
    var nos = MathUtil.floorMod(nanoAdjustment, LocalTime.NANOS_PER_SECOND);
    return Duration._create(secs, nos);
  };

  Duration.ofMillis = function ofMillis(millis) {
    var secs = MathUtil.intDiv(millis, 1000);
    var mos = MathUtil.intMod(millis, 1000);

    if (mos < 0) {
      mos += 1000;
      secs--;
    }

    return Duration._create(secs, mos * 1000000);
  };

  Duration.ofNanos = function ofNanos(nanos) {
    var secs = MathUtil.intDiv(nanos, LocalTime.NANOS_PER_SECOND);
    var nos = MathUtil.intMod(nanos, LocalTime.NANOS_PER_SECOND);

    if (nos < 0) {
      nos += LocalTime.NANOS_PER_SECOND;
      secs--;
    }

    return this._create(secs, nos);
  };

  Duration.of = function of(amount, unit) {
    return Duration.ZERO.plus(amount, unit);
  };

  Duration.from = function from(amount) {
    requireNonNull(amount, 'amount');
    requireInstance(amount, TemporalAmount);
    var duration = Duration.ZERO;
    amount.units().forEach(function (unit) {
      duration = duration.plus(amount.get(unit), unit);
    });
    return duration;
  };

  Duration.between = function between(startInclusive, endExclusive) {
    requireNonNull(startInclusive, 'startInclusive');
    requireNonNull(endExclusive, 'endExclusive');
    var secs = startInclusive.until(endExclusive, ChronoUnit.SECONDS);
    var nanos = 0;

    if (startInclusive.isSupported(ChronoField.NANO_OF_SECOND) && endExclusive.isSupported(ChronoField.NANO_OF_SECOND)) {
      try {
        var startNos = startInclusive.getLong(ChronoField.NANO_OF_SECOND);
        nanos = endExclusive.getLong(ChronoField.NANO_OF_SECOND) - startNos;

        if (secs > 0 && nanos < 0) {
          nanos += LocalTime.NANOS_PER_SECOND;
        } else if (secs < 0 && nanos > 0) {
          nanos -= LocalTime.NANOS_PER_SECOND;
        } else if (secs === 0 && nanos !== 0) {
          var adjustedEnd = endExclusive.with(ChronoField.NANO_OF_SECOND, startNos);
          secs = startInclusive.until(adjustedEnd, ChronoUnit.SECONDS);
        }
      } catch (e) {}
    }

    return this.ofSeconds(secs, nanos);
  };

  Duration.parse = function parse(text) {
    requireNonNull(text, 'text');
    var PATTERN = new RegExp('([-+]?)P(?:([-+]?[0-9]+)D)?(T(?:([-+]?[0-9]+)H)?(?:([-+]?[0-9]+)M)?(?:([-+]?[0-9]+)(?:[.,]([0-9]{0,9}))?S)?)?', 'i');
    var matches = PATTERN.exec(text);

    if (matches !== null) {
      if ('T' === matches[3] === false) {
        var negate = '-' === matches[1];
        var dayMatch = matches[2];
        var hourMatch = matches[4];
        var minuteMatch = matches[5];
        var secondMatch = matches[6];
        var fractionMatch = matches[7];

        if (dayMatch != null || hourMatch != null || minuteMatch != null || secondMatch != null) {
          var daysAsSecs = Duration._parseNumber(text, dayMatch, LocalTime.SECONDS_PER_DAY, 'days');

          var hoursAsSecs = Duration._parseNumber(text, hourMatch, LocalTime.SECONDS_PER_HOUR, 'hours');

          var minsAsSecs = Duration._parseNumber(text, minuteMatch, LocalTime.SECONDS_PER_MINUTE, 'minutes');

          var seconds = Duration._parseNumber(text, secondMatch, 1, 'seconds');

          var negativeSecs = secondMatch != null && secondMatch.charAt(0) === '-';

          var nanos = Duration._parseFraction(text, fractionMatch, negativeSecs ? -1 : 1);

          try {
            return Duration._create(negate, daysAsSecs, hoursAsSecs, minsAsSecs, seconds, nanos);
          } catch (ex) {
            throw new DateTimeParseException('Text cannot be parsed to a Duration: overflow', text, 0, ex);
          }
        }
      }
    }

    throw new DateTimeParseException('Text cannot be parsed to a Duration', text, 0);
  };

  Duration._parseNumber = function _parseNumber(text, parsed, multiplier, errorText) {
    if (parsed == null) {
      return 0;
    }

    try {
      if (parsed[0] === '+') {
        parsed = parsed.substring(1);
      }

      return MathUtil.safeMultiply(parseFloat(parsed), multiplier);
    } catch (ex) {
      throw new DateTimeParseException("Text cannot be parsed to a Duration: " + errorText, text, 0, ex);
    }
  };

  Duration._parseFraction = function _parseFraction(text, parsed, negate) {
    if (parsed == null || parsed.length === 0) {
      return 0;
    }

    parsed = (parsed + "000000000").substring(0, 9);
    return parseFloat(parsed) * negate;
  };

  Duration._create = function _create() {
    if (arguments.length <= 2) {
      return Duration._createSecondsNanos(arguments[0], arguments[1]);
    } else {
      return Duration._createNegateDaysHoursMinutesSecondsNanos(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);
    }
  };

  Duration._createNegateDaysHoursMinutesSecondsNanos = function _createNegateDaysHoursMinutesSecondsNanos(negate, daysAsSecs, hoursAsSecs, minsAsSecs, secs, nanos) {
    var seconds = MathUtil.safeAdd(daysAsSecs, MathUtil.safeAdd(hoursAsSecs, MathUtil.safeAdd(minsAsSecs, secs)));

    if (negate) {
      return Duration.ofSeconds(seconds, nanos).negated();
    }

    return Duration.ofSeconds(seconds, nanos);
  };

  Duration._createSecondsNanos = function _createSecondsNanos(seconds, nanoAdjustment) {
    if (seconds === void 0) {
      seconds = 0;
    }

    if (nanoAdjustment === void 0) {
      nanoAdjustment = 0;
    }

    if (seconds === 0 && nanoAdjustment === 0) {
      return Duration.ZERO;
    }

    return new Duration(seconds, nanoAdjustment);
  };

  var _proto = Duration.prototype;

  _proto.get = function get(unit) {
    if (unit === ChronoUnit.SECONDS) {
      return this._seconds;
    } else if (unit === ChronoUnit.NANOS) {
      return this._nanos;
    } else {
      throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
    }
  };

  _proto.units = function units() {
    return [ChronoUnit.SECONDS, ChronoUnit.NANOS];
  };

  _proto.isZero = function isZero() {
    return this._seconds === 0 && this._nanos === 0;
  };

  _proto.isNegative = function isNegative() {
    return this._seconds < 0;
  };

  _proto.seconds = function seconds() {
    return this._seconds;
  };

  _proto.nano = function nano() {
    return this._nanos;
  };

  _proto.withSeconds = function withSeconds(seconds) {
    return Duration._create(seconds, this._nanos);
  };

  _proto.withNanos = function withNanos(nanoOfSecond) {
    ChronoField.NANO_OF_SECOND.checkValidIntValue(nanoOfSecond);
    return Duration._create(this._seconds, nanoOfSecond);
  };

  _proto.plusDuration = function plusDuration(duration) {
    requireNonNull(duration, 'duration');
    return this.plus(duration.seconds(), duration.nano());
  };

  _proto.plus = function plus(durationOrNumber, unitOrNumber) {
    if (arguments.length === 1) {
      return this.plusDuration(durationOrNumber);
    } else if (arguments.length === 2 && unitOrNumber instanceof TemporalUnit) {
      return this.plusAmountUnit(durationOrNumber, unitOrNumber);
    } else {
      return this.plusSecondsNanos(durationOrNumber, unitOrNumber);
    }
  };

  _proto.plusAmountUnit = function plusAmountUnit(amountToAdd, unit) {
    requireNonNull(amountToAdd, 'amountToAdd');
    requireNonNull(unit, 'unit');

    if (unit === ChronoUnit.DAYS) {
      return this.plusSecondsNanos(MathUtil.safeMultiply(amountToAdd, LocalTime.SECONDS_PER_DAY), 0);
    }

    if (unit.isDurationEstimated()) {
      throw new UnsupportedTemporalTypeException('Unit must not have an estimated duration');
    }

    if (amountToAdd === 0) {
      return this;
    }

    if (unit instanceof ChronoUnit) {
      switch (unit) {
        case ChronoUnit.NANOS:
          return this.plusNanos(amountToAdd);

        case ChronoUnit.MICROS:
          return this.plusSecondsNanos(MathUtil.intDiv(amountToAdd, 1000000 * 1000) * 1000, MathUtil.intMod(amountToAdd, 1000000 * 1000) * 1000);

        case ChronoUnit.MILLIS:
          return this.plusMillis(amountToAdd);

        case ChronoUnit.SECONDS:
          return this.plusSeconds(amountToAdd);
      }

      return this.plusSecondsNanos(MathUtil.safeMultiply(unit.duration().seconds(), amountToAdd), 0);
    }

    var duration = unit.duration().multipliedBy(amountToAdd);
    return this.plusSecondsNanos(duration.seconds(), duration.nano());
  };

  _proto.plusDays = function plusDays(daysToAdd) {
    return this.plusSecondsNanos(MathUtil.safeMultiply(daysToAdd, LocalTime.SECONDS_PER_DAY), 0);
  };

  _proto.plusHours = function plusHours(hoursToAdd) {
    return this.plusSecondsNanos(MathUtil.safeMultiply(hoursToAdd, LocalTime.SECONDS_PER_HOUR), 0);
  };

  _proto.plusMinutes = function plusMinutes(minutesToAdd) {
    return this.plusSecondsNanos(MathUtil.safeMultiply(minutesToAdd, LocalTime.SECONDS_PER_MINUTE), 0);
  };

  _proto.plusSeconds = function plusSeconds(secondsToAdd) {
    return this.plusSecondsNanos(secondsToAdd, 0);
  };

  _proto.plusMillis = function plusMillis(millisToAdd) {
    return this.plusSecondsNanos(MathUtil.intDiv(millisToAdd, 1000), MathUtil.intMod(millisToAdd, 1000) * 1000000);
  };

  _proto.plusNanos = function plusNanos(nanosToAdd) {
    return this.plusSecondsNanos(0, nanosToAdd);
  };

  _proto.plusSecondsNanos = function plusSecondsNanos(secondsToAdd, nanosToAdd) {
    requireNonNull(secondsToAdd, 'secondsToAdd');
    requireNonNull(nanosToAdd, 'nanosToAdd');

    if (secondsToAdd === 0 && nanosToAdd === 0) {
      return this;
    }

    var epochSec = MathUtil.safeAdd(this._seconds, secondsToAdd);
    epochSec = MathUtil.safeAdd(epochSec, MathUtil.intDiv(nanosToAdd, LocalTime.NANOS_PER_SECOND));
    nanosToAdd = MathUtil.intMod(nanosToAdd, LocalTime.NANOS_PER_SECOND);
    var nanoAdjustment = MathUtil.safeAdd(this._nanos, nanosToAdd);
    return Duration.ofSeconds(epochSec, nanoAdjustment);
  };

  _proto.minus = function minus(durationOrNumber, unit) {
    if (arguments.length === 1) {
      return this.minusDuration(durationOrNumber);
    } else {
      return this.minusAmountUnit(durationOrNumber, unit);
    }
  };

  _proto.minusDuration = function minusDuration(duration) {
    requireNonNull(duration, 'duration');
    var secsToSubtract = duration.seconds();
    var nanosToSubtract = duration.nano();

    if (secsToSubtract === MIN_SAFE_INTEGER) {
      return this.plus(MAX_SAFE_INTEGER, -nanosToSubtract);
    }

    return this.plus(-secsToSubtract, -nanosToSubtract);
  };

  _proto.minusAmountUnit = function minusAmountUnit(amountToSubtract, unit) {
    requireNonNull(amountToSubtract, 'amountToSubtract');
    requireNonNull(unit, 'unit');
    return amountToSubtract === MIN_SAFE_INTEGER ? this.plusAmountUnit(MAX_SAFE_INTEGER, unit) : this.plusAmountUnit(-amountToSubtract, unit);
  };

  _proto.minusDays = function minusDays(daysToSubtract) {
    return daysToSubtract === MIN_SAFE_INTEGER ? this.plusDays(MAX_SAFE_INTEGER) : this.plusDays(-daysToSubtract);
  };

  _proto.minusHours = function minusHours(hoursToSubtract) {
    return hoursToSubtract === MIN_SAFE_INTEGER ? this.plusHours(MAX_SAFE_INTEGER) : this.plusHours(-hoursToSubtract);
  };

  _proto.minusMinutes = function minusMinutes(minutesToSubtract) {
    return minutesToSubtract === MIN_SAFE_INTEGER ? this.plusMinutes(MAX_SAFE_INTEGER) : this.plusMinutes(-minutesToSubtract);
  };

  _proto.minusSeconds = function minusSeconds(secondsToSubtract) {
    return secondsToSubtract === MIN_SAFE_INTEGER ? this.plusSeconds(MAX_SAFE_INTEGER) : this.plusSeconds(-secondsToSubtract);
  };

  _proto.minusMillis = function minusMillis(millisToSubtract) {
    return millisToSubtract === MIN_SAFE_INTEGER ? this.plusMillis(MAX_SAFE_INTEGER) : this.plusMillis(-millisToSubtract);
  };

  _proto.minusNanos = function minusNanos(nanosToSubtract) {
    return nanosToSubtract === MIN_SAFE_INTEGER ? this.plusNanos(MAX_SAFE_INTEGER) : this.plusNanos(-nanosToSubtract);
  };

  _proto.multipliedBy = function multipliedBy(multiplicand) {
    if (multiplicand === 0) {
      return Duration.ZERO;
    }

    if (multiplicand === 1) {
      return this;
    }

    var secs = MathUtil.safeMultiply(this._seconds, multiplicand);
    var nos = MathUtil.safeMultiply(this._nanos, multiplicand);
    secs = secs + MathUtil.intDiv(nos, LocalTime.NANOS_PER_SECOND);
    nos = MathUtil.intMod(nos, LocalTime.NANOS_PER_SECOND);
    return Duration.ofSeconds(secs, nos);
  };

  _proto.dividedBy = function dividedBy(divisor) {
    if (divisor === 0) {
      throw new ArithmeticException('Cannot divide by zero');
    }

    if (divisor === 1) {
      return this;
    }

    var secs = MathUtil.intDiv(this._seconds, divisor);
    var secsMod = MathUtil.roundDown((this._seconds / divisor - secs) * LocalTime.NANOS_PER_SECOND);
    var nos = MathUtil.intDiv(this._nanos, divisor);
    nos = secsMod + nos;
    return Duration.ofSeconds(secs, nos);
  };

  _proto.negated = function negated() {
    return this.multipliedBy(-1);
  };

  _proto.abs = function abs() {
    return this.isNegative() ? this.negated() : this;
  };

  _proto.addTo = function addTo(temporal) {
    requireNonNull(temporal, 'temporal');

    if (this._seconds !== 0) {
      temporal = temporal.plus(this._seconds, ChronoUnit.SECONDS);
    }

    if (this._nanos !== 0) {
      temporal = temporal.plus(this._nanos, ChronoUnit.NANOS);
    }

    return temporal;
  };

  _proto.subtractFrom = function subtractFrom(temporal) {
    requireNonNull(temporal, 'temporal');

    if (this._seconds !== 0) {
      temporal = temporal.minus(this._seconds, ChronoUnit.SECONDS);
    }

    if (this._nanos !== 0) {
      temporal = temporal.minus(this._nanos, ChronoUnit.NANOS);
    }

    return temporal;
  };

  _proto.toDays = function toDays() {
    return MathUtil.intDiv(this._seconds, LocalTime.SECONDS_PER_DAY);
  };

  _proto.toHours = function toHours() {
    return MathUtil.intDiv(this._seconds, LocalTime.SECONDS_PER_HOUR);
  };

  _proto.toMinutes = function toMinutes() {
    return MathUtil.intDiv(this._seconds, LocalTime.SECONDS_PER_MINUTE);
  };

  _proto.toMillis = function toMillis() {
    var millis = Math.round(MathUtil.safeMultiply(this._seconds, 1000));
    millis = MathUtil.safeAdd(millis, MathUtil.intDiv(this._nanos, 1000000));
    return millis;
  };

  _proto.toNanos = function toNanos() {
    var totalNanos = MathUtil.safeMultiply(this._seconds, LocalTime.NANOS_PER_SECOND);
    totalNanos = MathUtil.safeAdd(totalNanos, this._nanos);
    return totalNanos;
  };

  _proto.compareTo = function compareTo(otherDuration) {
    requireNonNull(otherDuration, 'otherDuration');
    requireInstance(otherDuration, Duration, 'otherDuration');
    var cmp = MathUtil.compareNumbers(this._seconds, otherDuration.seconds());

    if (cmp !== 0) {
      return cmp;
    }

    return this._nanos - otherDuration.nano();
  };

  _proto.equals = function equals(otherDuration) {
    if (this === otherDuration) {
      return true;
    }

    if (otherDuration instanceof Duration) {
      return this.seconds() === otherDuration.seconds() && this.nano() === otherDuration.nano();
    }

    return false;
  };

  _proto.toString = function toString() {
    if (this === Duration.ZERO) {
      return 'PT0S';
    }

    var hours = MathUtil.intDiv(this._seconds, LocalTime.SECONDS_PER_HOUR);
    var minutes = MathUtil.intDiv(MathUtil.intMod(this._seconds, LocalTime.SECONDS_PER_HOUR), LocalTime.SECONDS_PER_MINUTE);
    var secs = MathUtil.intMod(this._seconds, LocalTime.SECONDS_PER_MINUTE);
    var rval = 'PT';

    if (hours !== 0) {
      rval += hours + "H";
    }

    if (minutes !== 0) {
      rval += minutes + "M";
    }

    if (secs === 0 && this._nanos === 0 && rval.length > 2) {
      return rval;
    }

    if (secs < 0 && this._nanos > 0) {
      if (secs === -1) {
        rval += '-0';
      } else {
        rval += secs + 1;
      }
    } else {
      rval += secs;
    }

    if (this._nanos > 0) {
      rval += '.';
      var nanoString;

      if (secs < 0) {
        nanoString = "" + (2 * LocalTime.NANOS_PER_SECOND - this._nanos);
      } else {
        nanoString = "" + (LocalTime.NANOS_PER_SECOND + this._nanos);
      }

      nanoString = nanoString.slice(1, nanoString.length);
      rval += nanoString;

      while (rval.charAt(rval.length - 1) === '0') {
        rval = rval.slice(0, rval.length - 1);
      }
    }

    rval += 'S';
    return rval;
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  return Duration;
}(TemporalAmount);
function _init$n() {
  Duration.ZERO = new Duration(0, 0);
}

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE.md in the root directory of this source tree)
 */
var YearConstants = function YearConstants() {};
function _init$m() {
  YearConstants.MIN_VALUE = -999999;
  YearConstants.MAX_VALUE = 999999;
}

var ChronoUnit = function (_TemporalUnit) {
  _inheritsLoose(ChronoUnit, _TemporalUnit);

  function ChronoUnit(name, estimatedDuration) {
    var _this;

    _this = _TemporalUnit.call(this) || this;
    _this._name = name;
    _this._duration = estimatedDuration;
    return _this;
  }

  var _proto = ChronoUnit.prototype;

  _proto.duration = function duration() {
    return this._duration;
  };

  _proto.isDurationEstimated = function isDurationEstimated() {
    return this.isDateBased() || this === ChronoUnit.FOREVER;
  };

  _proto.isDateBased = function isDateBased() {
    return this.compareTo(ChronoUnit.DAYS) >= 0 && this !== ChronoUnit.FOREVER;
  };

  _proto.isTimeBased = function isTimeBased() {
    return this.compareTo(ChronoUnit.DAYS) < 0;
  };

  _proto.isSupportedBy = function isSupportedBy(temporal) {
    if (this === ChronoUnit.FOREVER) {
      return false;
    }

    try {
      temporal.plus(1, this);
      return true;
    } catch (e) {
      try {
        temporal.plus(-1, this);
        return true;
      } catch (e2) {
        return false;
      }
    }
  };

  _proto.addTo = function addTo(temporal, amount) {
    return temporal.plus(amount, this);
  };

  _proto.between = function between(temporal1, temporal2) {
    return temporal1.until(temporal2, this);
  };

  _proto.toString = function toString() {
    return this._name;
  };

  _proto.compareTo = function compareTo(other) {
    return this.duration().compareTo(other.duration());
  };

  return ChronoUnit;
}(TemporalUnit);
function _init$l() {
  ChronoUnit.NANOS = new ChronoUnit('Nanos', Duration.ofNanos(1));
  ChronoUnit.MICROS = new ChronoUnit('Micros', Duration.ofNanos(1000));
  ChronoUnit.MILLIS = new ChronoUnit('Millis', Duration.ofNanos(1000000));
  ChronoUnit.SECONDS = new ChronoUnit('Seconds', Duration.ofSeconds(1));
  ChronoUnit.MINUTES = new ChronoUnit('Minutes', Duration.ofSeconds(60));
  ChronoUnit.HOURS = new ChronoUnit('Hours', Duration.ofSeconds(3600));
  ChronoUnit.HALF_DAYS = new ChronoUnit('HalfDays', Duration.ofSeconds(43200));
  ChronoUnit.DAYS = new ChronoUnit('Days', Duration.ofSeconds(86400));
  ChronoUnit.WEEKS = new ChronoUnit('Weeks', Duration.ofSeconds(7 * 86400));
  ChronoUnit.MONTHS = new ChronoUnit('Months', Duration.ofSeconds(31556952 / 12));
  ChronoUnit.YEARS = new ChronoUnit('Years', Duration.ofSeconds(31556952));
  ChronoUnit.DECADES = new ChronoUnit('Decades', Duration.ofSeconds(31556952 * 10));
  ChronoUnit.CENTURIES = new ChronoUnit('Centuries', Duration.ofSeconds(31556952 * 100));
  ChronoUnit.MILLENNIA = new ChronoUnit('Millennia', Duration.ofSeconds(31556952 * 1000));
  ChronoUnit.ERAS = new ChronoUnit('Eras', Duration.ofSeconds(31556952 * (YearConstants.MAX_VALUE + 1)));
  ChronoUnit.FOREVER = new ChronoUnit('Forever', Duration.ofSeconds(MathUtil.MAX_SAFE_INTEGER, 999999999));
}

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

var TemporalField = function () {
  function TemporalField() {}

  var _proto = TemporalField.prototype;

  _proto.isDateBased = function isDateBased() {
    abstractMethodFail('isDateBased');
  };

  _proto.isTimeBased = function isTimeBased() {
    abstractMethodFail('isTimeBased');
  };

  _proto.baseUnit = function baseUnit() {
    abstractMethodFail('baseUnit');
  };

  _proto.rangeUnit = function rangeUnit() {
    abstractMethodFail('rangeUnit');
  };

  _proto.range = function range() {
    abstractMethodFail('range');
  };

  _proto.rangeRefinedBy = function rangeRefinedBy(temporal) {
    abstractMethodFail('rangeRefinedBy');
  };

  _proto.getFrom = function getFrom(temporal) {
    abstractMethodFail('getFrom');
  };

  _proto.adjustInto = function adjustInto(temporal, newValue) {
    abstractMethodFail('adjustInto');
  };

  _proto.isSupportedBy = function isSupportedBy(temporal) {
    abstractMethodFail('isSupportedBy');
  };

  _proto.displayName = function displayName() {
    abstractMethodFail('displayName');
  };

  _proto.equals = function equals(other) {
    abstractMethodFail('equals');
  };

  _proto.name = function name() {
    abstractMethodFail('name');
  };

  return TemporalField;
}();

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var ValueRange = function () {
  function ValueRange(minSmallest, minLargest, maxSmallest, maxLargest) {
    assert(!(minSmallest > minLargest), "Smallest minimum value '" + minSmallest + "' must be less than largest minimum value '" + minLargest + "'", IllegalArgumentException);
    assert(!(maxSmallest > maxLargest), "Smallest maximum value '" + maxSmallest + "' must be less than largest maximum value '" + maxLargest + "'", IllegalArgumentException);
    assert(!(minLargest > maxLargest), "Minimum value '" + minLargest + "' must be less than maximum value '" + maxLargest + "'", IllegalArgumentException);
    this._minSmallest = minSmallest;
    this._minLargest = minLargest;
    this._maxLargest = maxLargest;
    this._maxSmallest = maxSmallest;
  }

  var _proto = ValueRange.prototype;

  _proto.isFixed = function isFixed() {
    return this._minSmallest === this._minLargest && this._maxSmallest === this._maxLargest;
  };

  _proto.minimum = function minimum() {
    return this._minSmallest;
  };

  _proto.largestMinimum = function largestMinimum() {
    return this._minLargest;
  };

  _proto.maximum = function maximum() {
    return this._maxLargest;
  };

  _proto.smallestMaximum = function smallestMaximum() {
    return this._maxSmallest;
  };

  _proto.isValidValue = function isValidValue(value) {
    return this.minimum() <= value && value <= this.maximum();
  };

  _proto.checkValidValue = function checkValidValue(value, field) {
    var msg;

    if (!this.isValidValue(value)) {
      if (field != null) {
        msg = "Invalid value for " + field + " (valid values " + this.toString() + "): " + value;
      } else {
        msg = "Invalid value (valid values " + this.toString() + "): " + value;
      }

      return assert(false, msg, DateTimeException);
    }

    return value;
  };

  _proto.checkValidIntValue = function checkValidIntValue(value, field) {
    if (this.isValidIntValue(value) === false) {
      throw new DateTimeException("Invalid int value for " + field + ": " + value);
    }

    return value;
  };

  _proto.isValidIntValue = function isValidIntValue(value) {
    return this.isIntValue() && this.isValidValue(value);
  };

  _proto.isIntValue = function isIntValue() {
    return this.minimum() >= MathUtil.MIN_SAFE_INTEGER && this.maximum() <= MathUtil.MAX_SAFE_INTEGER;
  };

  _proto.equals = function equals(other) {
    if (other === this) {
      return true;
    }

    if (other instanceof ValueRange) {
      return this._minSmallest === other._minSmallest && this._minLargest === other._minLargest && this._maxSmallest === other._maxSmallest && this._maxLargest === other._maxLargest;
    }

    return false;
  };

  _proto.hashCode = function hashCode() {
    return MathUtil.hashCode(this._minSmallest, this._minLargest, this._maxSmallest, this._maxLargest);
  };

  _proto.toString = function toString() {
    var str = this.minimum() + (this.minimum() !== this.largestMinimum() ? "/" + this.largestMinimum() : '');
    str += ' - ';
    str += this.smallestMaximum() + (this.smallestMaximum() !== this.maximum() ? "/" + this.maximum() : '');
    return str;
  };

  ValueRange.of = function of() {
    if (arguments.length === 2) {
      return new ValueRange(arguments[0], arguments[0], arguments[1], arguments[1]);
    } else if (arguments.length === 3) {
      return new ValueRange(arguments[0], arguments[0], arguments[1], arguments[2]);
    } else if (arguments.length === 4) {
      return new ValueRange(arguments[0], arguments[1], arguments[2], arguments[3]);
    } else {
      return assert(false, "Invalid number of arguments " + arguments.length, IllegalArgumentException);
    }
  };

  return ValueRange;
}();

var ChronoField = function (_TemporalField) {
  _inheritsLoose(ChronoField, _TemporalField);

  ChronoField.byName = function byName(fieldName) {
    for (var prop in ChronoField) {
      if (ChronoField[prop]) {
        if (ChronoField[prop] instanceof ChronoField && ChronoField[prop].name() === fieldName) {
          return ChronoField[prop];
        }
      }
    }
  };

  function ChronoField(name, baseUnit, rangeUnit, range) {
    var _this;

    _this = _TemporalField.call(this) || this;
    _this._name = name;
    _this._baseUnit = baseUnit;
    _this._rangeUnit = rangeUnit;
    _this._range = range;
    return _this;
  }

  var _proto = ChronoField.prototype;

  _proto.name = function name() {
    return this._name;
  };

  _proto.baseUnit = function baseUnit() {
    return this._baseUnit;
  };

  _proto.rangeUnit = function rangeUnit() {
    return this._rangeUnit;
  };

  _proto.range = function range() {
    return this._range;
  };

  _proto.displayName = function displayName() {
    return this.toString();
  };

  _proto.checkValidValue = function checkValidValue(value) {
    return this.range().checkValidValue(value, this);
  };

  _proto.checkValidIntValue = function checkValidIntValue(value) {
    return this.range().checkValidIntValue(value, this);
  };

  _proto.isDateBased = function isDateBased() {
    var dateBased = this === ChronoField.DAY_OF_WEEK || this === ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH || this === ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR || this === ChronoField.DAY_OF_MONTH || this === ChronoField.DAY_OF_YEAR || this === ChronoField.EPOCH_DAY || this === ChronoField.ALIGNED_WEEK_OF_MONTH || this === ChronoField.ALIGNED_WEEK_OF_YEAR || this === ChronoField.MONTH_OF_YEAR || this === ChronoField.YEAR_OF_ERA || this === ChronoField.YEAR || this === ChronoField.ERA;
    return dateBased;
  };

  _proto.isTimeBased = function isTimeBased() {
    var timeBased = this === ChronoField.NANO_OF_SECOND || this === ChronoField.NANO_OF_DAY || this === ChronoField.MICRO_OF_SECOND || this === ChronoField.MICRO_OF_DAY || this === ChronoField.MILLI_OF_SECOND || this === ChronoField.MILLI_OF_DAY || this === ChronoField.SECOND_OF_MINUTE || this === ChronoField.SECOND_OF_DAY || this === ChronoField.MINUTE_OF_HOUR || this === ChronoField.MINUTE_OF_DAY || this === ChronoField.HOUR_OF_AMPM || this === ChronoField.CLOCK_HOUR_OF_AMPM || this === ChronoField.HOUR_OF_DAY || this === ChronoField.CLOCK_HOUR_OF_DAY || this === ChronoField.AMPM_OF_DAY;
    return timeBased;
  };

  _proto.rangeRefinedBy = function rangeRefinedBy(temporal) {
    return temporal.range(this);
  };

  _proto.getFrom = function getFrom(temporal) {
    return temporal.getLong(this);
  };

  _proto.toString = function toString() {
    return this.name();
  };

  _proto.equals = function equals(other) {
    return this === other;
  };

  _proto.adjustInto = function adjustInto(temporal, newValue) {
    return temporal.with(this, newValue);
  };

  _proto.isSupportedBy = function isSupportedBy(temporal) {
    return temporal.isSupported(this);
  };

  return ChronoField;
}(TemporalField);
function _init$k() {
  ChronoField.NANO_OF_SECOND = new ChronoField('NanoOfSecond', ChronoUnit.NANOS, ChronoUnit.SECONDS, ValueRange.of(0, 999999999));
  ChronoField.NANO_OF_DAY = new ChronoField('NanoOfDay', ChronoUnit.NANOS, ChronoUnit.DAYS, ValueRange.of(0, 86400 * 1000000000 - 1));
  ChronoField.MICRO_OF_SECOND = new ChronoField('MicroOfSecond', ChronoUnit.MICROS, ChronoUnit.SECONDS, ValueRange.of(0, 999999));
  ChronoField.MICRO_OF_DAY = new ChronoField('MicroOfDay', ChronoUnit.MICROS, ChronoUnit.DAYS, ValueRange.of(0, 86400 * 1000000 - 1));
  ChronoField.MILLI_OF_SECOND = new ChronoField('MilliOfSecond', ChronoUnit.MILLIS, ChronoUnit.SECONDS, ValueRange.of(0, 999));
  ChronoField.MILLI_OF_DAY = new ChronoField('MilliOfDay', ChronoUnit.MILLIS, ChronoUnit.DAYS, ValueRange.of(0, 86400 * 1000 - 1));
  ChronoField.SECOND_OF_MINUTE = new ChronoField('SecondOfMinute', ChronoUnit.SECONDS, ChronoUnit.MINUTES, ValueRange.of(0, 59));
  ChronoField.SECOND_OF_DAY = new ChronoField('SecondOfDay', ChronoUnit.SECONDS, ChronoUnit.DAYS, ValueRange.of(0, 86400 - 1));
  ChronoField.MINUTE_OF_HOUR = new ChronoField('MinuteOfHour', ChronoUnit.MINUTES, ChronoUnit.HOURS, ValueRange.of(0, 59));
  ChronoField.MINUTE_OF_DAY = new ChronoField('MinuteOfDay', ChronoUnit.MINUTES, ChronoUnit.DAYS, ValueRange.of(0, 24 * 60 - 1));
  ChronoField.HOUR_OF_AMPM = new ChronoField('HourOfAmPm', ChronoUnit.HOURS, ChronoUnit.HALF_DAYS, ValueRange.of(0, 11));
  ChronoField.CLOCK_HOUR_OF_AMPM = new ChronoField('ClockHourOfAmPm', ChronoUnit.HOURS, ChronoUnit.HALF_DAYS, ValueRange.of(1, 12));
  ChronoField.HOUR_OF_DAY = new ChronoField('HourOfDay', ChronoUnit.HOURS, ChronoUnit.DAYS, ValueRange.of(0, 23));
  ChronoField.CLOCK_HOUR_OF_DAY = new ChronoField('ClockHourOfDay', ChronoUnit.HOURS, ChronoUnit.DAYS, ValueRange.of(1, 24));
  ChronoField.AMPM_OF_DAY = new ChronoField('AmPmOfDay', ChronoUnit.HALF_DAYS, ChronoUnit.DAYS, ValueRange.of(0, 1));
  ChronoField.DAY_OF_WEEK = new ChronoField('DayOfWeek', ChronoUnit.DAYS, ChronoUnit.WEEKS, ValueRange.of(1, 7));
  ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH = new ChronoField('AlignedDayOfWeekInMonth', ChronoUnit.DAYS, ChronoUnit.WEEKS, ValueRange.of(1, 7));
  ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR = new ChronoField('AlignedDayOfWeekInYear', ChronoUnit.DAYS, ChronoUnit.WEEKS, ValueRange.of(1, 7));
  ChronoField.DAY_OF_MONTH = new ChronoField('DayOfMonth', ChronoUnit.DAYS, ChronoUnit.MONTHS, ValueRange.of(1, 28, 31), 'day');
  ChronoField.DAY_OF_YEAR = new ChronoField('DayOfYear', ChronoUnit.DAYS, ChronoUnit.YEARS, ValueRange.of(1, 365, 366));
  ChronoField.EPOCH_DAY = new ChronoField('EpochDay', ChronoUnit.DAYS, ChronoUnit.FOREVER, ValueRange.of(Math.floor(YearConstants.MIN_VALUE * 365.25), Math.floor(YearConstants.MAX_VALUE * 365.25)));
  ChronoField.ALIGNED_WEEK_OF_MONTH = new ChronoField('AlignedWeekOfMonth', ChronoUnit.WEEKS, ChronoUnit.MONTHS, ValueRange.of(1, 4, 5));
  ChronoField.ALIGNED_WEEK_OF_YEAR = new ChronoField('AlignedWeekOfYear', ChronoUnit.WEEKS, ChronoUnit.YEARS, ValueRange.of(1, 53));
  ChronoField.MONTH_OF_YEAR = new ChronoField('MonthOfYear', ChronoUnit.MONTHS, ChronoUnit.YEARS, ValueRange.of(1, 12), 'month');
  ChronoField.PROLEPTIC_MONTH = new ChronoField('ProlepticMonth', ChronoUnit.MONTHS, ChronoUnit.FOREVER, ValueRange.of(YearConstants.MIN_VALUE * 12, YearConstants.MAX_VALUE * 12 + 11));
  ChronoField.YEAR_OF_ERA = new ChronoField('YearOfEra', ChronoUnit.YEARS, ChronoUnit.FOREVER, ValueRange.of(1, YearConstants.MAX_VALUE, YearConstants.MAX_VALUE + 1));
  ChronoField.YEAR = new ChronoField('Year', ChronoUnit.YEARS, ChronoUnit.FOREVER, ValueRange.of(YearConstants.MIN_VALUE, YearConstants.MAX_VALUE), 'year');
  ChronoField.ERA = new ChronoField('Era', ChronoUnit.ERAS, ChronoUnit.FOREVER, ValueRange.of(0, 1));
  ChronoField.INSTANT_SECONDS = new ChronoField('InstantSeconds', ChronoUnit.SECONDS, ChronoUnit.FOREVER, ValueRange.of(MIN_SAFE_INTEGER, MAX_SAFE_INTEGER));
  ChronoField.OFFSET_SECONDS = new ChronoField('OffsetSeconds', ChronoUnit.SECONDS, ChronoUnit.FOREVER, ValueRange.of(-18 * 3600, 18 * 3600));
}

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var TemporalQueries = function () {
  function TemporalQueries() {}

  TemporalQueries.zoneId = function zoneId() {
    return TemporalQueries.ZONE_ID;
  };

  TemporalQueries.chronology = function chronology() {
    return TemporalQueries.CHRONO;
  };

  TemporalQueries.precision = function precision() {
    return TemporalQueries.PRECISION;
  };

  TemporalQueries.zone = function zone() {
    return TemporalQueries.ZONE;
  };

  TemporalQueries.offset = function offset() {
    return TemporalQueries.OFFSET;
  };

  TemporalQueries.localDate = function localDate() {
    return TemporalQueries.LOCAL_DATE;
  };

  TemporalQueries.localTime = function localTime() {
    return TemporalQueries.LOCAL_TIME;
  };

  return TemporalQueries;
}();

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var TemporalAccessor = function () {
  function TemporalAccessor() {}

  var _proto = TemporalAccessor.prototype;

  _proto.query = function query(_query) {
    if (_query === TemporalQueries.zoneId() || _query === TemporalQueries.chronology() || _query === TemporalQueries.precision()) {
      return null;
    }

    return _query.queryFrom(this);
  };

  _proto.get = function get(field) {
    return this.range(field).checkValidIntValue(this.getLong(field), field);
  };

  _proto.getLong = function getLong(field) {
    abstractMethodFail('getLong');
  };

  _proto.range = function range(field) {
    if (field instanceof ChronoField) {
      if (this.isSupported(field)) {
        return field.range();
      }

      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.rangeRefinedBy(this);
  };

  _proto.isSupported = function isSupported(field) {
    abstractMethodFail('isSupported');
  };

  return TemporalAccessor;
}();

var TemporalQuery = function (_Enum) {
  _inheritsLoose(TemporalQuery, _Enum);

  function TemporalQuery() {
    return _Enum.apply(this, arguments) || this;
  }

  var _proto = TemporalQuery.prototype;

  _proto.queryFrom = function queryFrom(temporal) {
    abstractMethodFail('queryFrom');
  };

  return TemporalQuery;
}(Enum);
function createTemporalQuery(name, queryFromFunction) {
  var ExtendedTemporalQuery = function (_TemporalQuery) {
    _inheritsLoose(ExtendedTemporalQuery, _TemporalQuery);

    function ExtendedTemporalQuery() {
      return _TemporalQuery.apply(this, arguments) || this;
    }

    return ExtendedTemporalQuery;
  }(TemporalQuery);

  ExtendedTemporalQuery.prototype.queryFrom = queryFromFunction;
  return new ExtendedTemporalQuery(name);
}

var DayOfWeek = function (_TemporalAccessor) {
  _inheritsLoose(DayOfWeek, _TemporalAccessor);

  function DayOfWeek(ordinal, name) {
    var _this;

    _this = _TemporalAccessor.call(this) || this;
    _this._ordinal = ordinal;
    _this._name = name;
    return _this;
  }

  var _proto = DayOfWeek.prototype;

  _proto.ordinal = function ordinal() {
    return this._ordinal;
  };

  _proto.name = function name() {
    return this._name;
  };

  DayOfWeek.values = function values() {
    return ENUMS.slice();
  };

  DayOfWeek.valueOf = function valueOf(name) {
    var ordinal = 0;

    for (ordinal; ordinal < ENUMS.length; ordinal++) {
      if (ENUMS[ordinal].name() === name) {
        break;
      }
    }

    return DayOfWeek.of(ordinal + 1);
  };

  DayOfWeek.of = function of(dayOfWeek) {
    if (dayOfWeek < 1 || dayOfWeek > 7) {
      throw new DateTimeException("Invalid value for DayOfWeek: " + dayOfWeek);
    }

    return ENUMS[dayOfWeek - 1];
  };

  DayOfWeek.from = function from(temporal) {
    assert(temporal != null, 'temporal', NullPointerException);

    if (temporal instanceof DayOfWeek) {
      return temporal;
    }

    try {
      return DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
    } catch (ex) {
      if (ex instanceof DateTimeException) {
        throw new DateTimeException("Unable to obtain DayOfWeek from TemporalAccessor: " + temporal + ", type " + (temporal.constructor != null ? temporal.constructor.name : ''), ex);
      } else {
        throw ex;
      }
    }
  };

  _proto.value = function value() {
    return this._ordinal + 1;
  };

  _proto.displayName = function displayName(style, locale) {
    throw new IllegalArgumentException('Pattern using (localized) text not implemented yet!');
  };

  _proto.isSupported = function isSupported(field) {
    if (field instanceof ChronoField) {
      return field === ChronoField.DAY_OF_WEEK;
    }

    return field != null && field.isSupportedBy(this);
  };

  _proto.range = function range(field) {
    if (field === ChronoField.DAY_OF_WEEK) {
      return field.range();
    } else if (field instanceof ChronoField) {
      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.rangeRefinedBy(this);
  };

  _proto.get = function get(field) {
    if (field === ChronoField.DAY_OF_WEEK) {
      return this.value();
    }

    return this.range(field).checkValidIntValue(this.getLong(field), field);
  };

  _proto.getLong = function getLong(field) {
    if (field === ChronoField.DAY_OF_WEEK) {
      return this.value();
    } else if (field instanceof ChronoField) {
      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.getFrom(this);
  };

  _proto.plus = function plus(days) {
    var amount = MathUtil.floorMod(days, 7);
    return ENUMS[MathUtil.floorMod(this._ordinal + (amount + 7), 7)];
  };

  _proto.minus = function minus(days) {
    return this.plus(-1 * MathUtil.floorMod(days, 7));
  };

  _proto.query = function query(_query) {
    if (_query === TemporalQueries.precision()) {
      return ChronoUnit.DAYS;
    } else if (_query === TemporalQueries.localDate() || _query === TemporalQueries.localTime() || _query === TemporalQueries.chronology() || _query === TemporalQueries.zone() || _query === TemporalQueries.zoneId() || _query === TemporalQueries.offset()) {
      return null;
    }

    assert(_query != null, 'query', NullPointerException);
    return _query.queryFrom(this);
  };

  _proto.adjustInto = function adjustInto(temporal) {
    requireNonNull(temporal, 'temporal');
    return temporal.with(ChronoField.DAY_OF_WEEK, this.value());
  };

  _proto.equals = function equals(other) {
    return this === other;
  };

  _proto.toString = function toString() {
    return this._name;
  };

  _proto.compareTo = function compareTo(other) {
    requireNonNull(other, 'other');
    requireInstance(other, DayOfWeek, 'other');
    return this._ordinal - other._ordinal;
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  return DayOfWeek;
}(TemporalAccessor);
var ENUMS;
function _init$j() {
  DayOfWeek.MONDAY = new DayOfWeek(0, 'MONDAY');
  DayOfWeek.TUESDAY = new DayOfWeek(1, 'TUESDAY');
  DayOfWeek.WEDNESDAY = new DayOfWeek(2, 'WEDNESDAY');
  DayOfWeek.THURSDAY = new DayOfWeek(3, 'THURSDAY');
  DayOfWeek.FRIDAY = new DayOfWeek(4, 'FRIDAY');
  DayOfWeek.SATURDAY = new DayOfWeek(5, 'SATURDAY');
  DayOfWeek.SUNDAY = new DayOfWeek(6, 'SUNDAY');
  DayOfWeek.FROM = createTemporalQuery('DayOfWeek.FROM', function (temporal) {
    return DayOfWeek.from(temporal);
  });
  ENUMS = [DayOfWeek.MONDAY, DayOfWeek.TUESDAY, DayOfWeek.WEDNESDAY, DayOfWeek.THURSDAY, DayOfWeek.FRIDAY, DayOfWeek.SATURDAY, DayOfWeek.SUNDAY];
}

var Month = function (_TemporalAccessor) {
  _inheritsLoose(Month, _TemporalAccessor);

  function Month(value, name) {
    var _this;

    _this = _TemporalAccessor.call(this) || this;
    _this._value = MathUtil.safeToInt(value);
    _this._name = name;
    return _this;
  }

  var _proto = Month.prototype;

  _proto.value = function value() {
    return this._value;
  };

  _proto.ordinal = function ordinal() {
    return this._value - 1;
  };

  _proto.name = function name() {
    return this._name;
  };

  _proto.displayName = function displayName(style, locale) {
    throw new IllegalArgumentException('Pattern using (localized) text not implemented yet!');
  };

  _proto.isSupported = function isSupported(field) {
    if (null === field) {
      return false;
    }

    if (field instanceof ChronoField) {
      return field === ChronoField.MONTH_OF_YEAR;
    }

    return field != null && field.isSupportedBy(this);
  };

  _proto.get = function get(field) {
    if (field === ChronoField.MONTH_OF_YEAR) {
      return this.value();
    }

    return this.range(field).checkValidIntValue(this.getLong(field), field);
  };

  _proto.getLong = function getLong(field) {
    if (field === ChronoField.MONTH_OF_YEAR) {
      return this.value();
    } else if (field instanceof ChronoField) {
      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.getFrom(this);
  };

  _proto.plus = function plus(months) {
    var amount = MathUtil.intMod(months, 12) + 12;
    var newMonthVal = MathUtil.intMod(this.value() + amount, 12);
    newMonthVal = newMonthVal === 0 ? 12 : newMonthVal;
    return Month.of(newMonthVal);
  };

  _proto.minus = function minus(months) {
    return this.plus(-1 * MathUtil.intMod(months, 12));
  };

  _proto.length = function length(leapYear) {
    switch (this) {
      case Month.FEBRUARY:
        return leapYear ? 29 : 28;

      case Month.APRIL:
      case Month.JUNE:
      case Month.SEPTEMBER:
      case Month.NOVEMBER:
        return 30;

      default:
        return 31;
    }
  };

  _proto.minLength = function minLength() {
    switch (this) {
      case Month.FEBRUARY:
        return 28;

      case Month.APRIL:
      case Month.JUNE:
      case Month.SEPTEMBER:
      case Month.NOVEMBER:
        return 30;

      default:
        return 31;
    }
  };

  _proto.maxLength = function maxLength() {
    switch (this) {
      case Month.FEBRUARY:
        return 29;

      case Month.APRIL:
      case Month.JUNE:
      case Month.SEPTEMBER:
      case Month.NOVEMBER:
        return 30;

      default:
        return 31;
    }
  };

  _proto.firstDayOfYear = function firstDayOfYear(leapYear) {
    var leap = leapYear ? 1 : 0;

    switch (this) {
      case Month.JANUARY:
        return 1;

      case Month.FEBRUARY:
        return 32;

      case Month.MARCH:
        return 60 + leap;

      case Month.APRIL:
        return 91 + leap;

      case Month.MAY:
        return 121 + leap;

      case Month.JUNE:
        return 152 + leap;

      case Month.JULY:
        return 182 + leap;

      case Month.AUGUST:
        return 213 + leap;

      case Month.SEPTEMBER:
        return 244 + leap;

      case Month.OCTOBER:
        return 274 + leap;

      case Month.NOVEMBER:
        return 305 + leap;

      case Month.DECEMBER:
      default:
        return 335 + leap;
    }
  };

  _proto.firstMonthOfQuarter = function firstMonthOfQuarter() {
    switch (this) {
      case Month.JANUARY:
      case Month.FEBRUARY:
      case Month.MARCH:
        return Month.JANUARY;

      case Month.APRIL:
      case Month.MAY:
      case Month.JUNE:
        return Month.APRIL;

      case Month.JULY:
      case Month.AUGUST:
      case Month.SEPTEMBER:
        return Month.JULY;

      case Month.OCTOBER:
      case Month.NOVEMBER:
      case Month.DECEMBER:
      default:
        return Month.OCTOBER;
    }
  };

  _proto.query = function query(_query) {
    assert(_query != null, 'query() parameter must not be null', DateTimeException);

    if (_query === TemporalQueries.chronology()) {
      return IsoChronology.INSTANCE;
    } else if (_query === TemporalQueries.precision()) {
      return ChronoUnit.MONTHS;
    }

    return _TemporalAccessor.prototype.query.call(this, _query);
  };

  _proto.toString = function toString() {
    switch (this) {
      case Month.JANUARY:
        return 'JANUARY';

      case Month.FEBRUARY:
        return 'FEBRUARY';

      case Month.MARCH:
        return 'MARCH';

      case Month.APRIL:
        return 'APRIL';

      case Month.MAY:
        return 'MAY';

      case Month.JUNE:
        return 'JUNE';

      case Month.JULY:
        return 'JULY';

      case Month.AUGUST:
        return 'AUGUST';

      case Month.SEPTEMBER:
        return 'SEPTEMBER';

      case Month.OCTOBER:
        return 'OCTOBER';

      case Month.NOVEMBER:
        return 'NOVEMBER';

      case Month.DECEMBER:
        return 'DECEMBER';

      default:
        return "unknown Month, value: " + this.value();
    }
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  _proto.adjustInto = function adjustInto(temporal) {
    return temporal.with(ChronoField.MONTH_OF_YEAR, this.value());
  };

  _proto.compareTo = function compareTo(other) {
    requireNonNull(other, 'other');
    requireInstance(other, Month, 'other');
    return this._value - other._value;
  };

  _proto.equals = function equals(other) {
    return this === other;
  };

  Month.valueOf = function valueOf(name) {
    var ordinal = 0;

    for (ordinal; ordinal < MONTHS.length; ordinal++) {
      if (MONTHS[ordinal].name() === name) {
        break;
      }
    }

    return Month.of(ordinal + 1);
  };

  Month.values = function values() {
    return MONTHS.slice();
  };

  Month.of = function of(month) {
    if (month < 1 || month > 12) {
      assert(false, "Invalid value for MonthOfYear: " + month, DateTimeException);
    }

    return MONTHS[month - 1];
  };

  Month.from = function from(temporal) {
    if (temporal instanceof Month) {
      return temporal;
    }

    try {
      return Month.of(temporal.get(ChronoField.MONTH_OF_YEAR));
    } catch (ex) {
      throw new DateTimeException("Unable to obtain Month from TemporalAccessor: " + temporal + " of type " + (temporal && temporal.constructor != null ? temporal.constructor.name : ''), ex);
    }
  };

  return Month;
}(TemporalAccessor);
var MONTHS;
function _init$i() {
  Month.JANUARY = new Month(1, 'JANUARY');
  Month.FEBRUARY = new Month(2, 'FEBRUARY');
  Month.MARCH = new Month(3, 'MARCH');
  Month.APRIL = new Month(4, 'APRIL');
  Month.MAY = new Month(5, 'MAY');
  Month.JUNE = new Month(6, 'JUNE');
  Month.JULY = new Month(7, 'JULY');
  Month.AUGUST = new Month(8, 'AUGUST');
  Month.SEPTEMBER = new Month(9, 'SEPTEMBER');
  Month.OCTOBER = new Month(10, 'OCTOBER');
  Month.NOVEMBER = new Month(11, 'NOVEMBER');
  Month.DECEMBER = new Month(12, 'DECEMBER');
  MONTHS = [Month.JANUARY, Month.FEBRUARY, Month.MARCH, Month.APRIL, Month.MAY, Month.JUNE, Month.JULY, Month.AUGUST, Month.SEPTEMBER, Month.OCTOBER, Month.NOVEMBER, Month.DECEMBER];
}

var PATTERN = /([-+]?)P(?:([-+]?[0-9]+)Y)?(?:([-+]?[0-9]+)M)?(?:([-+]?[0-9]+)W)?(?:([-+]?[0-9]+)D)?/;
var Period = function (_TemporalAmount) {
  _inheritsLoose(Period, _TemporalAmount);

  function Period(years, months, days) {
    var _this;

    _this = _TemporalAmount.call(this) || this;

    var _years = MathUtil.safeToInt(years);

    var _months = MathUtil.safeToInt(months);

    var _days = MathUtil.safeToInt(days);

    if (_years === 0 && _months === 0 && _days === 0) {
      if (!Period.ZERO) {
        _this._years = _years;
        _this._months = _months;
        _this._days = _days;
        Period.ZERO = _assertThisInitialized(_this);
      }

      return Period.ZERO || _assertThisInitialized(_this);
    }

    _this._years = _years;
    _this._months = _months;
    _this._days = _days;
    return _this;
  }

  Period.ofYears = function ofYears(years) {
    return Period.create(years, 0, 0);
  };

  Period.ofMonths = function ofMonths(months) {
    return Period.create(0, months, 0);
  };

  Period.ofWeeks = function ofWeeks(weeks) {
    return Period.create(0, 0, MathUtil.safeMultiply(weeks, 7));
  };

  Period.ofDays = function ofDays(days) {
    return Period.create(0, 0, days);
  };

  Period.of = function of(years, months, days) {
    return Period.create(years, months, days);
  };

  Period.from = function from(amount) {
    if (amount instanceof Period) {
      return amount;
    }

    requireNonNull(amount, 'amount');
    var years = 0;
    var months = 0;
    var days = 0;
    var units = amount.units();

    for (var i = 0; i < units.length; i++) {
      var unit = units[i];
      var unitAmount = amount.get(unit);

      if (unit === ChronoUnit.YEARS) {
        years = MathUtil.safeToInt(unitAmount);
      } else if (unit === ChronoUnit.MONTHS) {
        months = MathUtil.safeToInt(unitAmount);
      } else if (unit === ChronoUnit.DAYS) {
        days = MathUtil.safeToInt(unitAmount);
      } else {
        throw new DateTimeException("Unit must be Years, Months or Days, but was " + unit);
      }
    }

    return Period.create(years, months, days);
  };

  Period.between = function between(startDate, endDate) {
    requireNonNull(startDate, 'startDate');
    requireNonNull(endDate, 'endDate');
    requireInstance(startDate, LocalDate, 'startDate');
    requireInstance(endDate, LocalDate, 'endDate');
    return startDate.until(endDate);
  };

  Period.parse = function parse(text) {
    requireNonNull(text, 'text');

    try {
      return Period._parse(text);
    } catch (ex) {
      if (ex instanceof ArithmeticException) {
        throw new DateTimeParseException('Text cannot be parsed to a Period', text, 0, ex);
      } else {
        throw ex;
      }
    }
  };

  Period._parse = function _parse(text) {
    var matches = PATTERN.exec(text);

    if (matches != null) {
      var negate = '-' === matches[1] ? -1 : 1;
      var yearMatch = matches[2];
      var monthMatch = matches[3];
      var weekMatch = matches[4];
      var dayMatch = matches[5];

      if (yearMatch != null || monthMatch != null || weekMatch != null || dayMatch != null) {
        var years = Period._parseNumber(text, yearMatch, negate);

        var months = Period._parseNumber(text, monthMatch, negate);

        var weeks = Period._parseNumber(text, weekMatch, negate);

        var days = Period._parseNumber(text, dayMatch, negate);

        days = MathUtil.safeAdd(days, MathUtil.safeMultiply(weeks, 7));
        return Period.create(years, months, days);
      }
    }

    throw new DateTimeParseException('Text cannot be parsed to a Period', text, 0);
  };

  Period._parseNumber = function _parseNumber(text, str, negate) {
    if (str == null) {
      return 0;
    }

    var val = MathUtil.parseInt(str);
    return MathUtil.safeMultiply(val, negate);
  };

  Period.create = function create(years, months, days) {
    return new Period(years, months, days);
  };

  var _proto = Period.prototype;

  _proto.units = function units() {
    return [ChronoUnit.YEARS, ChronoUnit.MONTHS, ChronoUnit.DAYS];
  };

  _proto.chronology = function chronology() {
    return IsoChronology.INSTANCE;
  };

  _proto.get = function get(unit) {
    if (unit === ChronoUnit.YEARS) {
      return this._years;
    }

    if (unit === ChronoUnit.MONTHS) {
      return this._months;
    }

    if (unit === ChronoUnit.DAYS) {
      return this._days;
    }

    throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
  };

  _proto.isZero = function isZero() {
    return this === Period.ZERO;
  };

  _proto.isNegative = function isNegative() {
    return this._years < 0 || this._months < 0 || this._days < 0;
  };

  _proto.years = function years() {
    return this._years;
  };

  _proto.months = function months() {
    return this._months;
  };

  _proto.days = function days() {
    return this._days;
  };

  _proto.withYears = function withYears(years) {
    if (years === this._years) {
      return this;
    }

    return Period.create(years, this._months, this._days);
  };

  _proto.withMonths = function withMonths(months) {
    if (months === this._months) {
      return this;
    }

    return Period.create(this._years, months, this._days);
  };

  _proto.withDays = function withDays(days) {
    if (days === this._days) {
      return this;
    }

    return Period.create(this._years, this._months, days);
  };

  _proto.plus = function plus(amountToAdd) {
    var amount = Period.from(amountToAdd);
    return Period.create(MathUtil.safeAdd(this._years, amount._years), MathUtil.safeAdd(this._months, amount._months), MathUtil.safeAdd(this._days, amount._days));
  };

  _proto.plusYears = function plusYears(yearsToAdd) {
    if (yearsToAdd === 0) {
      return this;
    }

    return Period.create(MathUtil.safeToInt(MathUtil.safeAdd(this._years, yearsToAdd)), this._months, this._days);
  };

  _proto.plusMonths = function plusMonths(monthsToAdd) {
    if (monthsToAdd === 0) {
      return this;
    }

    return Period.create(this._years, MathUtil.safeToInt(MathUtil.safeAdd(this._months, monthsToAdd)), this._days);
  };

  _proto.plusDays = function plusDays(daysToAdd) {
    if (daysToAdd === 0) {
      return this;
    }

    return Period.create(this._years, this._months, MathUtil.safeToInt(MathUtil.safeAdd(this._days, daysToAdd)));
  };

  _proto.minus = function minus(amountToSubtract) {
    var amount = Period.from(amountToSubtract);
    return Period.create(MathUtil.safeSubtract(this._years, amount._years), MathUtil.safeSubtract(this._months, amount._months), MathUtil.safeSubtract(this._days, amount._days));
  };

  _proto.minusYears = function minusYears(yearsToSubtract) {
    return this.plusYears(-1 * yearsToSubtract);
  };

  _proto.minusMonths = function minusMonths(monthsToSubtract) {
    return this.plusMonths(-1 * monthsToSubtract);
  };

  _proto.minusDays = function minusDays(daysToSubtract) {
    return this.plusDays(-1 * daysToSubtract);
  };

  _proto.multipliedBy = function multipliedBy(scalar) {
    if (this === Period.ZERO || scalar === 1) {
      return this;
    }

    return Period.create(MathUtil.safeMultiply(this._years, scalar), MathUtil.safeMultiply(this._months, scalar), MathUtil.safeMultiply(this._days, scalar));
  };

  _proto.negated = function negated() {
    return this.multipliedBy(-1);
  };

  _proto.normalized = function normalized() {
    var totalMonths = this.toTotalMonths();
    var splitYears = MathUtil.intDiv(totalMonths, 12);
    var splitMonths = MathUtil.intMod(totalMonths, 12);

    if (splitYears === this._years && splitMonths === this._months) {
      return this;
    }

    return Period.create(MathUtil.safeToInt(splitYears), splitMonths, this._days);
  };

  _proto.toTotalMonths = function toTotalMonths() {
    return this._years * 12 + this._months;
  };

  _proto.addTo = function addTo(temporal) {
    requireNonNull(temporal, 'temporal');

    if (this._years !== 0) {
      if (this._months !== 0) {
        temporal = temporal.plus(this.toTotalMonths(), ChronoUnit.MONTHS);
      } else {
        temporal = temporal.plus(this._years, ChronoUnit.YEARS);
      }
    } else if (this._months !== 0) {
      temporal = temporal.plus(this._months, ChronoUnit.MONTHS);
    }

    if (this._days !== 0) {
      temporal = temporal.plus(this._days, ChronoUnit.DAYS);
    }

    return temporal;
  };

  _proto.subtractFrom = function subtractFrom(temporal) {
    requireNonNull(temporal, 'temporal');

    if (this._years !== 0) {
      if (this._months !== 0) {
        temporal = temporal.minus(this.toTotalMonths(), ChronoUnit.MONTHS);
      } else {
        temporal = temporal.minus(this._years, ChronoUnit.YEARS);
      }
    } else if (this._months !== 0) {
      temporal = temporal.minus(this._months, ChronoUnit.MONTHS);
    }

    if (this._days !== 0) {
      temporal = temporal.minus(this._days, ChronoUnit.DAYS);
    }

    return temporal;
  };

  _proto.equals = function equals(obj) {
    if (this === obj) {
      return true;
    }

    if (obj instanceof Period) {
      var other = obj;
      return this._years === other._years && this._months === other._months && this._days === other._days;
    }

    return false;
  };

  _proto.hashCode = function hashCode() {
    return MathUtil.hashCode(this._years, this._months, this._days);
  };

  _proto.toString = function toString() {
    if (this === Period.ZERO) {
      return 'P0D';
    } else {
      var buf = 'P';

      if (this._years !== 0) {
        buf += this._years + "Y";
      }

      if (this._months !== 0) {
        buf += this._months + "M";
      }

      if (this._days !== 0) {
        buf += this._days + "D";
      }

      return buf;
    }
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  return Period;
}(TemporalAmount);
function _init$h() {
  Period.ofDays(0);
}

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var ParsePosition = function () {
  function ParsePosition(index) {
    this._index = index;
    this._errorIndex = -1;
  }

  var _proto = ParsePosition.prototype;

  _proto.getIndex = function getIndex() {
    return this._index;
  };

  _proto.setIndex = function setIndex(index) {
    this._index = index;
  };

  _proto.getErrorIndex = function getErrorIndex() {
    return this._errorIndex;
  };

  _proto.setErrorIndex = function setErrorIndex(errorIndex) {
    this._errorIndex = errorIndex;
  };

  return ParsePosition;
}();

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var EnumMap = function () {
  function EnumMap() {
    this._map = {};
  }

  var _proto = EnumMap.prototype;

  _proto.putAll = function putAll(otherMap) {
    for (var key in otherMap._map) {
      this._map[key] = otherMap._map[key];
    }

    return this;
  };

  _proto.containsKey = function containsKey(key) {
    return this._map.hasOwnProperty(key.name()) && this.get(key) !== undefined;
  };

  _proto.get = function get(key) {
    return this._map[key.name()];
  };

  _proto.put = function put(key, val) {
    return this.set(key, val);
  };

  _proto.set = function set(key, val) {
    this._map[key.name()] = val;
    return this;
  };

  _proto.retainAll = function retainAll(keyList) {
    var map = {};

    for (var i = 0; i < keyList.length; i++) {
      var key = keyList[i].name();
      map[key] = this._map[key];
    }

    this._map = map;
    return this;
  };

  _proto.remove = function remove(key) {
    var keyName = key.name();
    var val = this._map[keyName];
    this._map[keyName] = undefined;
    return val;
  };

  _proto.keySet = function keySet() {
    return this._map;
  };

  _proto.clear = function clear() {
    this._map = {};
  };

  return EnumMap;
}();

var ResolverStyle = function (_Enum) {
  _inheritsLoose(ResolverStyle, _Enum);

  function ResolverStyle() {
    return _Enum.apply(this, arguments) || this;
  }

  return ResolverStyle;
}(Enum);
ResolverStyle.STRICT = new ResolverStyle('STRICT');
ResolverStyle.SMART = new ResolverStyle('SMART');
ResolverStyle.LENIENT = new ResolverStyle('LENIENT');

var Temporal = function (_TemporalAccessor) {
  _inheritsLoose(Temporal, _TemporalAccessor);

  function Temporal() {
    return _TemporalAccessor.apply(this, arguments) || this;
  }

  var _proto = Temporal.prototype;

  _proto.isSupported = function isSupported(fieldOrUnit) {
    abstractMethodFail('isSupported');
  };

  _proto.minus = function minus(amount, unit) {
    if (arguments.length < 2) {
      return this._minusAmount(amount);
    } else {
      return this._minusUnit(amount, unit);
    }
  };

  _proto._minusAmount = function _minusAmount(amount) {
    requireNonNull(amount, 'amount');
    requireInstance(amount, TemporalAmount, 'amount');
    return amount.subtractFrom(this);
  };

  _proto._minusUnit = function _minusUnit(amountToSubtract, unit) {
    requireNonNull(amountToSubtract, 'amountToSubtract');
    requireNonNull(unit, 'unit');
    requireInstance(unit, TemporalUnit, 'unit');
    return this._plusUnit(-amountToSubtract, unit);
  };

  _proto.plus = function plus(amount, unit) {
    if (arguments.length < 2) {
      return this._plusAmount(amount);
    } else {
      return this._plusUnit(amount, unit);
    }
  };

  _proto._plusAmount = function _plusAmount(amount) {
    requireNonNull(amount, 'amount');
    requireInstance(amount, TemporalAmount, 'amount');
    return amount.addTo(this);
  };

  _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
    abstractMethodFail('_plusUnit');
  };

  _proto.until = function until(endTemporal, unit) {
    abstractMethodFail('until');
  };

  _proto.with = function _with(adjusterOrField, newValue) {
    if (arguments.length < 2) {
      return this._withAdjuster(adjusterOrField);
    } else {
      return this._withField(adjusterOrField, newValue);
    }
  };

  _proto._withAdjuster = function _withAdjuster(adjuster) {
    requireNonNull(adjuster, 'adjuster');
    assert(typeof adjuster.adjustInto === 'function', 'adjuster must be a TemporalAdjuster', IllegalArgumentException);
    return adjuster.adjustInto(this);
  };

  _proto._withField = function _withField(field, newValue) {
    abstractMethodFail('_withField');
  };

  return Temporal;
}(TemporalAccessor);

if (typeof Symbol !== 'undefined' && Symbol.toPrimitive) {
  Temporal.prototype[Symbol.toPrimitive] = function (hint) {
    if (hint !== 'number') {
      return this.toString();
    }

    throw new TypeError('A conversion from Temporal to a number is not allowed. ' + 'To compare use the methods .equals(), .compareTo(), .isBefore() ' + 'or one that is more suitable to your use case.');
  };
}

var ChronoLocalDate = function (_Temporal) {
  _inheritsLoose(ChronoLocalDate, _Temporal);

  function ChronoLocalDate() {
    return _Temporal.apply(this, arguments) || this;
  }

  var _proto = ChronoLocalDate.prototype;

  _proto.isSupported = function isSupported(fieldOrUnit) {
    if (fieldOrUnit instanceof ChronoField) {
      return fieldOrUnit.isDateBased();
    } else if (fieldOrUnit instanceof ChronoUnit) {
      return fieldOrUnit.isDateBased();
    }

    return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
  };

  _proto.query = function query(_query) {
    if (_query === TemporalQueries.chronology()) {
      return this.chronology();
    } else if (_query === TemporalQueries.precision()) {
      return ChronoUnit.DAYS;
    } else if (_query === TemporalQueries.localDate()) {
      return LocalDate.ofEpochDay(this.toEpochDay());
    } else if (_query === TemporalQueries.localTime() || _query === TemporalQueries.zone() || _query === TemporalQueries.zoneId() || _query === TemporalQueries.offset()) {
      return null;
    }

    return _Temporal.prototype.query.call(this, _query);
  };

  _proto.adjustInto = function adjustInto(temporal) {
    return temporal.with(ChronoField.EPOCH_DAY, this.toEpochDay());
  };

  _proto.format = function format(formatter) {
    requireNonNull(formatter, 'formatter');
    requireInstance(formatter, DateTimeFormatter, 'formatter');
    return formatter.format(this);
  };

  return ChronoLocalDate;
}(Temporal);

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var StringUtil = function () {
  function StringUtil() {}

  StringUtil.startsWith = function startsWith(text, pattern) {
    return text.indexOf(pattern) === 0;
  };

  StringUtil.hashCode = function hashCode(text) {
    var len = text.length;

    if (len === 0) {
      return 0;
    }

    var hash = 0;

    for (var i = 0; i < len; i++) {
      var chr = text.charCodeAt(i);
      hash = (hash << 5) - hash + chr;
      hash |= 0;
    }

    return MathUtil.smi(hash);
  };

  return StringUtil;
}();

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var ZoneId = function () {
  function ZoneId() {}

  ZoneId.systemDefault = function systemDefault() {
    throw new DateTimeException('not supported operation');
  };

  ZoneId.getAvailableZoneIds = function getAvailableZoneIds() {
    throw new DateTimeException('not supported operation');
  };

  ZoneId.of = function of(zoneId) {
    throw new DateTimeException("not supported operation" + zoneId);
  };

  ZoneId.ofOffset = function ofOffset(prefix, offset) {
    throw new DateTimeException("not supported operation" + prefix + offset);
  };

  ZoneId.from = function from(temporal) {
    throw new DateTimeException("not supported operation" + temporal);
  };

  var _proto = ZoneId.prototype;

  _proto.id = function id() {
    abstractMethodFail('ZoneId.id');
  };

  _proto.rules = function rules() {
    abstractMethodFail('ZoneId.rules');
  };

  _proto.normalized = function normalized() {
    var rules = this.rules();

    if (rules.isFixedOffset()) {
      return rules.offset(Instant.EPOCH);
    }

    return this;
  };

  _proto.equals = function equals(other) {
    if (this === other) {
      return true;
    }

    if (other instanceof ZoneId) {
      return this.id() === other.id();
    }

    return false;
  };

  _proto.hashCode = function hashCode() {
    return StringUtil.hashCode(this.id());
  };

  _proto.toString = function toString() {
    return this.id();
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  return ZoneId;
}();

var ZoneRules = function () {
  function ZoneRules() {}

  ZoneRules.of = function of(offset) {
    requireNonNull(offset, 'offset');
    return new Fixed(offset);
  };

  var _proto = ZoneRules.prototype;

  _proto.isFixedOffset = function isFixedOffset() {
    abstractMethodFail('ZoneRules.isFixedOffset');
  };

  _proto.offset = function offset(instantOrLocalDateTime) {
    if (instantOrLocalDateTime instanceof Instant) {
      return this.offsetOfInstant(instantOrLocalDateTime);
    } else {
      return this.offsetOfLocalDateTime(instantOrLocalDateTime);
    }
  };

  _proto.offsetOfInstant = function offsetOfInstant(instant) {
    abstractMethodFail('ZoneRules.offsetInstant');
  };

  _proto.offsetOfEpochMilli = function offsetOfEpochMilli(epochMilli) {
    abstractMethodFail('ZoneRules.offsetOfEpochMilli');
  };

  _proto.offsetOfLocalDateTime = function offsetOfLocalDateTime(localDateTime) {
    abstractMethodFail('ZoneRules.offsetLocalDateTime');
  };

  _proto.validOffsets = function validOffsets(localDateTime) {
    abstractMethodFail('ZoneRules.validOffsets');
  };

  _proto.transition = function transition(localDateTime) {
    abstractMethodFail('ZoneRules.transition');
  };

  _proto.standardOffset = function standardOffset(instant) {
    abstractMethodFail('ZoneRules.standardOffset');
  };

  _proto.daylightSavings = function daylightSavings(instant) {
    abstractMethodFail('ZoneRules.daylightSavings');
  };

  _proto.isDaylightSavings = function isDaylightSavings(instant) {
    abstractMethodFail('ZoneRules.isDaylightSavings');
  };

  _proto.isValidOffset = function isValidOffset(localDateTime, offset) {
    abstractMethodFail('ZoneRules.isValidOffset');
  };

  _proto.nextTransition = function nextTransition(instant) {
    abstractMethodFail('ZoneRules.nextTransition');
  };

  _proto.previousTransition = function previousTransition(instant) {
    abstractMethodFail('ZoneRules.previousTransition');
  };

  _proto.transitions = function transitions() {
    abstractMethodFail('ZoneRules.transitions');
  };

  _proto.transitionRules = function transitionRules() {
    abstractMethodFail('ZoneRules.transitionRules');
  };

  _proto.toString = function toString() {
    abstractMethodFail('ZoneRules.toString');
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  return ZoneRules;
}();

var Fixed = function (_ZoneRules) {
  _inheritsLoose(Fixed, _ZoneRules);

  function Fixed(offset) {
    var _this;

    _this = _ZoneRules.call(this) || this;
    _this._offset = offset;
    return _this;
  }

  var _proto2 = Fixed.prototype;

  _proto2.isFixedOffset = function isFixedOffset() {
    return true;
  };

  _proto2.offsetOfInstant = function offsetOfInstant() {
    return this._offset;
  };

  _proto2.offsetOfEpochMilli = function offsetOfEpochMilli() {
    return this._offset;
  };

  _proto2.offsetOfLocalDateTime = function offsetOfLocalDateTime() {
    return this._offset;
  };

  _proto2.validOffsets = function validOffsets() {
    return [this._offset];
  };

  _proto2.transition = function transition() {
    return null;
  };

  _proto2.standardOffset = function standardOffset() {
    return this._offset;
  };

  _proto2.daylightSavings = function daylightSavings() {
    return Duration.ZERO;
  };

  _proto2.isDaylightSavings = function isDaylightSavings() {
    return false;
  };

  _proto2.isValidOffset = function isValidOffset(localDateTime, offset) {
    return this._offset.equals(offset);
  };

  _proto2.nextTransition = function nextTransition() {
    return null;
  };

  _proto2.previousTransition = function previousTransition() {
    return null;
  };

  _proto2.transitions = function transitions() {
    return [];
  };

  _proto2.transitionRules = function transitionRules() {
    return [];
  };

  _proto2.equals = function equals(other) {
    if (this === other) {
      return true;
    }

    if (other instanceof Fixed) {
      return this._offset.equals(other._offset);
    }

    return false;
  };

  _proto2.toString = function toString() {
    return "FixedRules:" + this._offset.toString();
  };

  return Fixed;
}(ZoneRules);

var SECONDS_CACHE = {};
var ID_CACHE = {};
var ZoneOffset = function (_ZoneId) {
  _inheritsLoose(ZoneOffset, _ZoneId);

  function ZoneOffset(totalSeconds) {
    var _this;

    _this = _ZoneId.call(this) || this;

    ZoneOffset._validateTotalSeconds(totalSeconds);

    _this._totalSeconds = MathUtil.safeToInt(totalSeconds);
    _this._rules = ZoneRules.of(_assertThisInitialized(_this));
    _this._id = ZoneOffset._buildId(totalSeconds);
    return _this;
  }

  var _proto = ZoneOffset.prototype;

  _proto.totalSeconds = function totalSeconds() {
    return this._totalSeconds;
  };

  _proto.id = function id() {
    return this._id;
  };

  ZoneOffset._buildId = function _buildId(totalSeconds) {
    if (totalSeconds === 0) {
      return 'Z';
    } else {
      var absTotalSeconds = Math.abs(totalSeconds);
      var absHours = MathUtil.intDiv(absTotalSeconds, LocalTime.SECONDS_PER_HOUR);
      var absMinutes = MathUtil.intMod(MathUtil.intDiv(absTotalSeconds, LocalTime.SECONDS_PER_MINUTE), LocalTime.MINUTES_PER_HOUR);
      var buf = "" + (totalSeconds < 0 ? '-' : '+') + (absHours < 10 ? '0' : '') + absHours + (absMinutes < 10 ? ':0' : ':') + absMinutes;
      var absSeconds = MathUtil.intMod(absTotalSeconds, LocalTime.SECONDS_PER_MINUTE);

      if (absSeconds !== 0) {
        buf += (absSeconds < 10 ? ':0' : ':') + absSeconds;
      }

      return buf;
    }
  };

  ZoneOffset._validateTotalSeconds = function _validateTotalSeconds(totalSeconds) {
    if (Math.abs(totalSeconds) > ZoneOffset.MAX_SECONDS) {
      throw new DateTimeException('Zone offset not in valid range: -18:00 to +18:00');
    }
  };

  ZoneOffset._validate = function _validate(hours, minutes, seconds) {
    if (hours < -18 || hours > 18) {
      throw new DateTimeException("Zone offset hours not in valid range: value " + hours + " is not in the range -18 to 18");
    }

    if (hours > 0) {
      if (minutes < 0 || seconds < 0) {
        throw new DateTimeException('Zone offset minutes and seconds must be positive because hours is positive');
      }
    } else if (hours < 0) {
      if (minutes > 0 || seconds > 0) {
        throw new DateTimeException('Zone offset minutes and seconds must be negative because hours is negative');
      }
    } else if (minutes > 0 && seconds < 0 || minutes < 0 && seconds > 0) {
      throw new DateTimeException('Zone offset minutes and seconds must have the same sign');
    }

    if (Math.abs(minutes) > 59) {
      throw new DateTimeException("Zone offset minutes not in valid range: abs(value) " + Math.abs(minutes) + " is not in the range 0 to 59");
    }

    if (Math.abs(seconds) > 59) {
      throw new DateTimeException("Zone offset seconds not in valid range: abs(value) " + Math.abs(seconds) + " is not in the range 0 to 59");
    }

    if (Math.abs(hours) === 18 && (Math.abs(minutes) > 0 || Math.abs(seconds) > 0)) {
      throw new DateTimeException('Zone offset not in valid range: -18:00 to +18:00');
    }
  };

  ZoneOffset.of = function of(offsetId) {
    requireNonNull(offsetId, 'offsetId');
    var offset = ID_CACHE[offsetId];

    if (offset != null) {
      return offset;
    }

    var hours, minutes, seconds;

    switch (offsetId.length) {
      case 2:
        offsetId = offsetId[0] + "0" + offsetId[1];

      case 3:
        hours = ZoneOffset._parseNumber(offsetId, 1, false);
        minutes = 0;
        seconds = 0;
        break;

      case 5:
        hours = ZoneOffset._parseNumber(offsetId, 1, false);
        minutes = ZoneOffset._parseNumber(offsetId, 3, false);
        seconds = 0;
        break;

      case 6:
        hours = ZoneOffset._parseNumber(offsetId, 1, false);
        minutes = ZoneOffset._parseNumber(offsetId, 4, true);
        seconds = 0;
        break;

      case 7:
        hours = ZoneOffset._parseNumber(offsetId, 1, false);
        minutes = ZoneOffset._parseNumber(offsetId, 3, false);
        seconds = ZoneOffset._parseNumber(offsetId, 5, false);
        break;

      case 9:
        hours = ZoneOffset._parseNumber(offsetId, 1, false);
        minutes = ZoneOffset._parseNumber(offsetId, 4, true);
        seconds = ZoneOffset._parseNumber(offsetId, 7, true);
        break;

      default:
        throw new DateTimeException("Invalid ID for ZoneOffset, invalid format: " + offsetId);
    }

    var first = offsetId[0];

    if (first !== '+' && first !== '-') {
      throw new DateTimeException("Invalid ID for ZoneOffset, plus/minus not found when expected: " + offsetId);
    }

    if (first === '-') {
      return ZoneOffset.ofHoursMinutesSeconds(-hours, -minutes, -seconds);
    } else {
      return ZoneOffset.ofHoursMinutesSeconds(hours, minutes, seconds);
    }
  };

  ZoneOffset._parseNumber = function _parseNumber(offsetId, pos, precededByColon) {
    if (precededByColon && offsetId[pos - 1] !== ':') {
      throw new DateTimeException("Invalid ID for ZoneOffset, colon not found when expected: " + offsetId);
    }

    var ch1 = offsetId[pos];
    var ch2 = offsetId[pos + 1];

    if (ch1 < '0' || ch1 > '9' || ch2 < '0' || ch2 > '9') {
      throw new DateTimeException("Invalid ID for ZoneOffset, non numeric characters found: " + offsetId);
    }

    return (ch1.charCodeAt(0) - 48) * 10 + (ch2.charCodeAt(0) - 48);
  };

  ZoneOffset.ofHours = function ofHours(hours) {
    return ZoneOffset.ofHoursMinutesSeconds(hours, 0, 0);
  };

  ZoneOffset.ofHoursMinutes = function ofHoursMinutes(hours, minutes) {
    return ZoneOffset.ofHoursMinutesSeconds(hours, minutes, 0);
  };

  ZoneOffset.ofHoursMinutesSeconds = function ofHoursMinutesSeconds(hours, minutes, seconds) {
    ZoneOffset._validate(hours, minutes, seconds);

    var totalSeconds = hours * LocalTime.SECONDS_PER_HOUR + minutes * LocalTime.SECONDS_PER_MINUTE + seconds;
    return ZoneOffset.ofTotalSeconds(totalSeconds);
  };

  ZoneOffset.ofTotalMinutes = function ofTotalMinutes(totalMinutes) {
    var totalSeconds = totalMinutes * LocalTime.SECONDS_PER_MINUTE;
    return ZoneOffset.ofTotalSeconds(totalSeconds);
  };

  ZoneOffset.ofTotalSeconds = function ofTotalSeconds(totalSeconds) {
    if (totalSeconds % (15 * LocalTime.SECONDS_PER_MINUTE) === 0) {
      var totalSecs = totalSeconds;
      var result = SECONDS_CACHE[totalSecs];

      if (result == null) {
        result = new ZoneOffset(totalSeconds);
        SECONDS_CACHE[totalSecs] = result;
        ID_CACHE[result.id()] = result;
      }

      return result;
    } else {
      return new ZoneOffset(totalSeconds);
    }
  };

  _proto.rules = function rules() {
    return this._rules;
  };

  _proto.get = function get(field) {
    return this.getLong(field);
  };

  _proto.getLong = function getLong(field) {
    if (field === ChronoField.OFFSET_SECONDS) {
      return this._totalSeconds;
    } else if (field instanceof ChronoField) {
      throw new DateTimeException("Unsupported field: " + field);
    }

    return field.getFrom(this);
  };

  _proto.query = function query(_query) {
    requireNonNull(_query, 'query');

    if (_query === TemporalQueries.offset() || _query === TemporalQueries.zone()) {
      return this;
    } else if (_query === TemporalQueries.localDate() || _query === TemporalQueries.localTime() || _query === TemporalQueries.precision() || _query === TemporalQueries.chronology() || _query === TemporalQueries.zoneId()) {
      return null;
    }

    return _query.queryFrom(this);
  };

  _proto.adjustInto = function adjustInto(temporal) {
    return temporal.with(ChronoField.OFFSET_SECONDS, this._totalSeconds);
  };

  _proto.compareTo = function compareTo(other) {
    requireNonNull(other, 'other');
    return other._totalSeconds - this._totalSeconds;
  };

  _proto.equals = function equals(obj) {
    if (this === obj) {
      return true;
    }

    if (obj instanceof ZoneOffset) {
      return this._totalSeconds === obj._totalSeconds;
    }

    return false;
  };

  _proto.hashCode = function hashCode() {
    return this._totalSeconds;
  };

  _proto.toString = function toString() {
    return this._id;
  };

  return ZoneOffset;
}(ZoneId);
function _init$g() {
  ZoneOffset.MAX_SECONDS = 18 * LocalTime.SECONDS_PER_HOUR;
  ZoneOffset.UTC = ZoneOffset.ofTotalSeconds(0);
  ZoneOffset.MIN = ZoneOffset.ofTotalSeconds(-ZoneOffset.MAX_SECONDS);
  ZoneOffset.MAX = ZoneOffset.ofTotalSeconds(ZoneOffset.MAX_SECONDS);
}

var DateTimeBuilder = function (_TemporalAccessor) {
  _inheritsLoose(DateTimeBuilder, _TemporalAccessor);

  DateTimeBuilder.create = function create(field, value) {
    var dtb = new DateTimeBuilder();

    dtb._addFieldValue(field, value);

    return dtb;
  };

  function DateTimeBuilder() {
    var _this;

    _this = _TemporalAccessor.call(this) || this;
    _this.fieldValues = new EnumMap();
    _this.chrono = null;
    _this.zone = null;
    _this.date = null;
    _this.time = null;
    _this.leapSecond = false;
    _this.excessDays = null;
    return _this;
  }

  var _proto = DateTimeBuilder.prototype;

  _proto.getFieldValue0 = function getFieldValue0(field) {
    return this.fieldValues.get(field);
  };

  _proto._addFieldValue = function _addFieldValue(field, value) {
    requireNonNull(field, 'field');
    var old = this.getFieldValue0(field);

    if (old != null && old !== value) {
      throw new DateTimeException("Conflict found: " + field + " " + old + " differs from " + field + " " + value + ": " + this);
    }

    return this._putFieldValue0(field, value);
  };

  _proto._putFieldValue0 = function _putFieldValue0(field, value) {
    this.fieldValues.put(field, value);
    return this;
  };

  _proto.resolve = function resolve(resolverStyle, resolverFields) {
    if (resolverFields != null) {
      this.fieldValues.retainAll(resolverFields);
    }

    this._mergeDate(resolverStyle);

    this._mergeTime(resolverStyle);

    this._resolveTimeInferZeroes(resolverStyle);

    if (this.excessDays != null && this.excessDays.isZero() === false && this.date != null && this.time != null) {
      this.date = this.date.plus(this.excessDays);
      this.excessDays = Period.ZERO;
    }

    this._resolveInstant();

    return this;
  };

  _proto._mergeDate = function _mergeDate(resolverStyle) {
    this._checkDate(IsoChronology.INSTANCE.resolveDate(this.fieldValues, resolverStyle));
  };

  _proto._checkDate = function _checkDate(date) {
    if (date != null) {
      this._addObject(date);

      for (var fieldName in this.fieldValues.keySet()) {
        var field = ChronoField.byName(fieldName);

        if (field) {
          if (this.fieldValues.get(field) !== undefined) {
            if (field.isDateBased()) {
              var val1 = void 0;

              try {
                val1 = date.getLong(field);
              } catch (ex) {
                if (ex instanceof DateTimeException) {
                  continue;
                } else {
                  throw ex;
                }
              }

              var val2 = this.fieldValues.get(field);

              if (val1 !== val2) {
                throw new DateTimeException("Conflict found: Field " + field + " " + val1 + " differs from " + field + " " + val2 + " derived from " + date);
              }
            }
          }
        }
      }
    }
  };

  _proto._mergeTime = function _mergeTime(resolverStyle) {
    if (this.fieldValues.containsKey(ChronoField.CLOCK_HOUR_OF_DAY)) {
      var ch = this.fieldValues.remove(ChronoField.CLOCK_HOUR_OF_DAY);

      if (resolverStyle !== ResolverStyle.LENIENT) {
        if (resolverStyle === ResolverStyle.SMART && ch === 0) ; else {
          ChronoField.CLOCK_HOUR_OF_DAY.checkValidValue(ch);
        }
      }

      this._addFieldValue(ChronoField.HOUR_OF_DAY, ch === 24 ? 0 : ch);
    }

    if (this.fieldValues.containsKey(ChronoField.CLOCK_HOUR_OF_AMPM)) {
      var _ch = this.fieldValues.remove(ChronoField.CLOCK_HOUR_OF_AMPM);

      if (resolverStyle !== ResolverStyle.LENIENT) {
        if (resolverStyle === ResolverStyle.SMART && _ch === 0) ; else {
          ChronoField.CLOCK_HOUR_OF_AMPM.checkValidValue(_ch);
        }
      }

      this._addFieldValue(ChronoField.HOUR_OF_AMPM, _ch === 12 ? 0 : _ch);
    }

    if (resolverStyle !== ResolverStyle.LENIENT) {
      if (this.fieldValues.containsKey(ChronoField.AMPM_OF_DAY)) {
        ChronoField.AMPM_OF_DAY.checkValidValue(this.fieldValues.get(ChronoField.AMPM_OF_DAY));
      }

      if (this.fieldValues.containsKey(ChronoField.HOUR_OF_AMPM)) {
        ChronoField.HOUR_OF_AMPM.checkValidValue(this.fieldValues.get(ChronoField.HOUR_OF_AMPM));
      }
    }

    if (this.fieldValues.containsKey(ChronoField.AMPM_OF_DAY) && this.fieldValues.containsKey(ChronoField.HOUR_OF_AMPM)) {
      var ap = this.fieldValues.remove(ChronoField.AMPM_OF_DAY);
      var hap = this.fieldValues.remove(ChronoField.HOUR_OF_AMPM);

      this._addFieldValue(ChronoField.HOUR_OF_DAY, ap * 12 + hap);
    }

    if (this.fieldValues.containsKey(ChronoField.NANO_OF_DAY)) {
      var nod = this.fieldValues.remove(ChronoField.NANO_OF_DAY);

      if (resolverStyle !== ResolverStyle.LENIENT) {
        ChronoField.NANO_OF_DAY.checkValidValue(nod);
      }

      this._addFieldValue(ChronoField.SECOND_OF_DAY, MathUtil.intDiv(nod, 1000000000));

      this._addFieldValue(ChronoField.NANO_OF_SECOND, MathUtil.intMod(nod, 1000000000));
    }

    if (this.fieldValues.containsKey(ChronoField.MICRO_OF_DAY)) {
      var cod = this.fieldValues.remove(ChronoField.MICRO_OF_DAY);

      if (resolverStyle !== ResolverStyle.LENIENT) {
        ChronoField.MICRO_OF_DAY.checkValidValue(cod);
      }

      this._addFieldValue(ChronoField.SECOND_OF_DAY, MathUtil.intDiv(cod, 1000000));

      this._addFieldValue(ChronoField.MICRO_OF_SECOND, MathUtil.intMod(cod, 1000000));
    }

    if (this.fieldValues.containsKey(ChronoField.MILLI_OF_DAY)) {
      var lod = this.fieldValues.remove(ChronoField.MILLI_OF_DAY);

      if (resolverStyle !== ResolverStyle.LENIENT) {
        ChronoField.MILLI_OF_DAY.checkValidValue(lod);
      }

      this._addFieldValue(ChronoField.SECOND_OF_DAY, MathUtil.intDiv(lod, 1000));

      this._addFieldValue(ChronoField.MILLI_OF_SECOND, MathUtil.intMod(lod, 1000));
    }

    if (this.fieldValues.containsKey(ChronoField.SECOND_OF_DAY)) {
      var sod = this.fieldValues.remove(ChronoField.SECOND_OF_DAY);

      if (resolverStyle !== ResolverStyle.LENIENT) {
        ChronoField.SECOND_OF_DAY.checkValidValue(sod);
      }

      this._addFieldValue(ChronoField.HOUR_OF_DAY, MathUtil.intDiv(sod, 3600));

      this._addFieldValue(ChronoField.MINUTE_OF_HOUR, MathUtil.intMod(MathUtil.intDiv(sod, 60), 60));

      this._addFieldValue(ChronoField.SECOND_OF_MINUTE, MathUtil.intMod(sod, 60));
    }

    if (this.fieldValues.containsKey(ChronoField.MINUTE_OF_DAY)) {
      var mod = this.fieldValues.remove(ChronoField.MINUTE_OF_DAY);

      if (resolverStyle !== ResolverStyle.LENIENT) {
        ChronoField.MINUTE_OF_DAY.checkValidValue(mod);
      }

      this._addFieldValue(ChronoField.HOUR_OF_DAY, MathUtil.intDiv(mod, 60));

      this._addFieldValue(ChronoField.MINUTE_OF_HOUR, MathUtil.intMod(mod, 60));
    }

    if (resolverStyle !== ResolverStyle.LENIENT) {
      if (this.fieldValues.containsKey(ChronoField.MILLI_OF_SECOND)) {
        ChronoField.MILLI_OF_SECOND.checkValidValue(this.fieldValues.get(ChronoField.MILLI_OF_SECOND));
      }

      if (this.fieldValues.containsKey(ChronoField.MICRO_OF_SECOND)) {
        ChronoField.MICRO_OF_SECOND.checkValidValue(this.fieldValues.get(ChronoField.MICRO_OF_SECOND));
      }
    }

    if (this.fieldValues.containsKey(ChronoField.MILLI_OF_SECOND) && this.fieldValues.containsKey(ChronoField.MICRO_OF_SECOND)) {
      var los = this.fieldValues.remove(ChronoField.MILLI_OF_SECOND);
      var cos = this.fieldValues.get(ChronoField.MICRO_OF_SECOND);

      this._putFieldValue0(ChronoField.MICRO_OF_SECOND, los * 1000 + MathUtil.intMod(cos, 1000));
    }

    if (this.fieldValues.containsKey(ChronoField.MICRO_OF_SECOND) && this.fieldValues.containsKey(ChronoField.NANO_OF_SECOND)) {
      var nos = this.fieldValues.get(ChronoField.NANO_OF_SECOND);

      this._putFieldValue0(ChronoField.MICRO_OF_SECOND, MathUtil.intDiv(nos, 1000));

      this.fieldValues.remove(ChronoField.MICRO_OF_SECOND);
    }

    if (this.fieldValues.containsKey(ChronoField.MILLI_OF_SECOND) && this.fieldValues.containsKey(ChronoField.NANO_OF_SECOND)) {
      var _nos = this.fieldValues.get(ChronoField.NANO_OF_SECOND);

      this._putFieldValue0(ChronoField.MILLI_OF_SECOND, MathUtil.intDiv(_nos, 1000000));

      this.fieldValues.remove(ChronoField.MILLI_OF_SECOND);
    }

    if (this.fieldValues.containsKey(ChronoField.MICRO_OF_SECOND)) {
      var _cos = this.fieldValues.remove(ChronoField.MICRO_OF_SECOND);

      this._putFieldValue0(ChronoField.NANO_OF_SECOND, _cos * 1000);
    } else if (this.fieldValues.containsKey(ChronoField.MILLI_OF_SECOND)) {
      var _los = this.fieldValues.remove(ChronoField.MILLI_OF_SECOND);

      this._putFieldValue0(ChronoField.NANO_OF_SECOND, _los * 1000000);
    }
  };

  _proto._resolveTimeInferZeroes = function _resolveTimeInferZeroes(resolverStyle) {
    var hod = this.fieldValues.get(ChronoField.HOUR_OF_DAY);
    var moh = this.fieldValues.get(ChronoField.MINUTE_OF_HOUR);
    var som = this.fieldValues.get(ChronoField.SECOND_OF_MINUTE);
    var nos = this.fieldValues.get(ChronoField.NANO_OF_SECOND);

    if (hod == null) {
      return;
    }

    if (moh == null && (som != null || nos != null)) {
      return;
    }

    if (moh != null && som == null && nos != null) {
      return;
    }

    if (resolverStyle !== ResolverStyle.LENIENT) {
      if (hod != null) {
        if (resolverStyle === ResolverStyle.SMART && hod === 24 && (moh == null || moh === 0) && (som == null || som === 0) && (nos == null || nos === 0)) {
          hod = 0;
          this.excessDays = Period.ofDays(1);
        }

        var hodVal = ChronoField.HOUR_OF_DAY.checkValidIntValue(hod);

        if (moh != null) {
          var mohVal = ChronoField.MINUTE_OF_HOUR.checkValidIntValue(moh);

          if (som != null) {
            var somVal = ChronoField.SECOND_OF_MINUTE.checkValidIntValue(som);

            if (nos != null) {
              var nosVal = ChronoField.NANO_OF_SECOND.checkValidIntValue(nos);

              this._addObject(LocalTime.of(hodVal, mohVal, somVal, nosVal));
            } else {
              this._addObject(LocalTime.of(hodVal, mohVal, somVal));
            }
          } else {
            if (nos == null) {
              this._addObject(LocalTime.of(hodVal, mohVal));
            }
          }
        } else {
          if (som == null && nos == null) {
            this._addObject(LocalTime.of(hodVal, 0));
          }
        }
      }
    } else {
      if (hod != null) {
        var _hodVal = hod;

        if (moh != null) {
          if (som != null) {
            if (nos == null) {
              nos = 0;
            }

            var totalNanos = MathUtil.safeMultiply(_hodVal, 3600000000000);
            totalNanos = MathUtil.safeAdd(totalNanos, MathUtil.safeMultiply(moh, 60000000000));
            totalNanos = MathUtil.safeAdd(totalNanos, MathUtil.safeMultiply(som, 1000000000));
            totalNanos = MathUtil.safeAdd(totalNanos, nos);
            var excessDays = MathUtil.floorDiv(totalNanos, 86400000000000);
            var nod = MathUtil.floorMod(totalNanos, 86400000000000);

            this._addObject(LocalTime.ofNanoOfDay(nod));

            this.excessDays = Period.ofDays(excessDays);
          } else {
            var totalSecs = MathUtil.safeMultiply(_hodVal, 3600);
            totalSecs = MathUtil.safeAdd(totalSecs, MathUtil.safeMultiply(moh, 60));

            var _excessDays = MathUtil.floorDiv(totalSecs, 86400);

            var sod = MathUtil.floorMod(totalSecs, 86400);

            this._addObject(LocalTime.ofSecondOfDay(sod));

            this.excessDays = Period.ofDays(_excessDays);
          }
        } else {
          var _excessDays2 = MathUtil.safeToInt(MathUtil.floorDiv(_hodVal, 24));

          _hodVal = MathUtil.floorMod(_hodVal, 24);

          this._addObject(LocalTime.of(_hodVal, 0));

          this.excessDays = Period.ofDays(_excessDays2);
        }
      }
    }

    this.fieldValues.remove(ChronoField.HOUR_OF_DAY);
    this.fieldValues.remove(ChronoField.MINUTE_OF_HOUR);
    this.fieldValues.remove(ChronoField.SECOND_OF_MINUTE);
    this.fieldValues.remove(ChronoField.NANO_OF_SECOND);
  };

  _proto._addObject = function _addObject(dateOrTime) {
    if (dateOrTime instanceof ChronoLocalDate) {
      this.date = dateOrTime;
    } else if (dateOrTime instanceof LocalTime) {
      this.time = dateOrTime;
    }
  };

  _proto._resolveInstant = function _resolveInstant() {
    if (this.date != null && this.time != null) {
      var offsetSecs = this.fieldValues.get(ChronoField.OFFSET_SECONDS);

      if (offsetSecs != null) {
        var offset = ZoneOffset.ofTotalSeconds(offsetSecs);
        var instant = this.date.atTime(this.time).atZone(offset).getLong(ChronoField.INSTANT_SECONDS);
        this.fieldValues.put(ChronoField.INSTANT_SECONDS, instant);
      } else if (this.zone != null) {
        var _instant = this.date.atTime(this.time).atZone(this.zone).getLong(ChronoField.INSTANT_SECONDS);

        this.fieldValues.put(ChronoField.INSTANT_SECONDS, _instant);
      }
    }
  };

  _proto.build = function build(type) {
    return type.queryFrom(this);
  };

  _proto.isSupported = function isSupported(field) {
    if (field == null) {
      return false;
    }

    return this.fieldValues.containsKey(field) && this.fieldValues.get(field) !== undefined || this.date != null && this.date.isSupported(field) || this.time != null && this.time.isSupported(field);
  };

  _proto.getLong = function getLong(field) {
    requireNonNull(field, 'field');
    var value = this.getFieldValue0(field);

    if (value == null) {
      if (this.date != null && this.date.isSupported(field)) {
        return this.date.getLong(field);
      }

      if (this.time != null && this.time.isSupported(field)) {
        return this.time.getLong(field);
      }

      throw new DateTimeException("Field not found: " + field);
    }

    return value;
  };

  _proto.query = function query(_query) {
    if (_query === TemporalQueries.zoneId()) {
      return this.zone;
    } else if (_query === TemporalQueries.chronology()) {
      return this.chrono;
    } else if (_query === TemporalQueries.localDate()) {
      return this.date != null ? LocalDate.from(this.date) : null;
    } else if (_query === TemporalQueries.localTime()) {
      return this.time;
    } else if (_query === TemporalQueries.zone() || _query === TemporalQueries.offset()) {
      return _query.queryFrom(this);
    } else if (_query === TemporalQueries.precision()) {
      return null;
    }

    return _query.queryFrom(this);
  };

  return DateTimeBuilder;
}(TemporalAccessor);

var DateTimeParseContext = function () {
  function DateTimeParseContext() {
    if (arguments.length === 1) {
      if (arguments[0] instanceof DateTimeParseContext) {
        this._constructorSelf.apply(this, arguments);

        return;
      } else {
        this._constructorFormatter.apply(this, arguments);
      }
    } else {
      this._constructorParam.apply(this, arguments);
    }

    this._caseSensitive = true;
    this._strict = true;
    this._parsed = [new Parsed(this)];
  }

  var _proto = DateTimeParseContext.prototype;

  _proto._constructorParam = function _constructorParam(locale, symbols, chronology) {
    this._locale = locale;
    this._symbols = symbols;
    this._overrideChronology = chronology;
  };

  _proto._constructorFormatter = function _constructorFormatter(formatter) {
    this._locale = formatter.locale();
    this._symbols = formatter.decimalStyle();
    this._overrideChronology = formatter.chronology();
  };

  _proto._constructorSelf = function _constructorSelf(other) {
    this._locale = other._locale;
    this._symbols = other._symbols;
    this._overrideChronology = other._overrideChronology;
    this._overrideZone = other._overrideZone;
    this._caseSensitive = other._caseSensitive;
    this._strict = other._strict;
    this._parsed = [new Parsed(this)];
  };

  _proto.copy = function copy() {
    return new DateTimeParseContext(this);
  };

  _proto.symbols = function symbols() {
    return this._symbols;
  };

  _proto.isStrict = function isStrict() {
    return this._strict;
  };

  _proto.setStrict = function setStrict(strict) {
    this._strict = strict;
  };

  _proto.locale = function locale() {
    return this._locale;
  };

  _proto.setLocale = function setLocale(locale) {
    this._locale = locale;
  };

  _proto.startOptional = function startOptional() {
    this._parsed.push(this.currentParsed().copy());
  };

  _proto.endOptional = function endOptional(successful) {
    if (successful) {
      this._parsed.splice(this._parsed.length - 2, 1);
    } else {
      this._parsed.splice(this._parsed.length - 1, 1);
    }
  };

  _proto.isCaseSensitive = function isCaseSensitive() {
    return this._caseSensitive;
  };

  _proto.setCaseSensitive = function setCaseSensitive(caseSensitive) {
    this._caseSensitive = caseSensitive;
  };

  _proto.subSequenceEquals = function subSequenceEquals(cs1, offset1, cs2, offset2, length) {
    if (offset1 + length > cs1.length || offset2 + length > cs2.length) {
      return false;
    }

    if (!this.isCaseSensitive()) {
      cs1 = cs1.toLowerCase();
      cs2 = cs2.toLowerCase();
    }

    for (var i = 0; i < length; i++) {
      var ch1 = cs1[offset1 + i];
      var ch2 = cs2[offset2 + i];

      if (ch1 !== ch2) {
        return false;
      }
    }

    return true;
  };

  _proto.charEquals = function charEquals(ch1, ch2) {
    if (this.isCaseSensitive()) {
      return ch1 === ch2;
    }

    return this.charEqualsIgnoreCase(ch1, ch2);
  };

  _proto.charEqualsIgnoreCase = function charEqualsIgnoreCase(c1, c2) {
    return c1 === c2 || c1.toLowerCase() === c2.toLowerCase();
  };

  _proto.setParsedField = function setParsedField(field, value, errorPos, successPos) {
    var currentParsedFieldValues = this.currentParsed().fieldValues;
    var old = currentParsedFieldValues.get(field);
    currentParsedFieldValues.set(field, value);
    return old != null && old !== value ? ~errorPos : successPos;
  };

  _proto.setParsedZone = function setParsedZone(zone) {
    requireNonNull(zone, 'zone');
    this.currentParsed().zone = zone;
  };

  _proto.getParsed = function getParsed(field) {
    return this.currentParsed().fieldValues.get(field);
  };

  _proto.toParsed = function toParsed() {
    return this.currentParsed();
  };

  _proto.currentParsed = function currentParsed() {
    return this._parsed[this._parsed.length - 1];
  };

  _proto.setParsedLeapSecond = function setParsedLeapSecond() {
    this.currentParsed().leapSecond = true;
  };

  _proto.getEffectiveChronology = function getEffectiveChronology() {
    var chrono = this.currentParsed().chrono;

    if (chrono == null) {
      chrono = this._overrideChronology;

      if (chrono == null) {
        chrono = IsoChronology.INSTANCE;
      }
    }

    return chrono;
  };

  return DateTimeParseContext;
}();

var Parsed = function (_Temporal) {
  _inheritsLoose(Parsed, _Temporal);

  function Parsed(dateTimeParseContext) {
    var _this;

    _this = _Temporal.call(this) || this;
    _this.chrono = null;
    _this.zone = null;
    _this.fieldValues = new EnumMap();
    _this.leapSecond = false;
    _this.dateTimeParseContext = dateTimeParseContext;
    return _this;
  }

  var _proto2 = Parsed.prototype;

  _proto2.copy = function copy() {
    var cloned = new Parsed();
    cloned.chrono = this.chrono;
    cloned.zone = this.zone;
    cloned.fieldValues.putAll(this.fieldValues);
    cloned.leapSecond = this.leapSecond;
    cloned.dateTimeParseContext = this.dateTimeParseContext;
    return cloned;
  };

  _proto2.toString = function toString() {
    return this.fieldValues + ", " + this.chrono + ", " + this.zone;
  };

  _proto2.isSupported = function isSupported(field) {
    return this.fieldValues.containsKey(field);
  };

  _proto2.get = function get(field) {
    var val = this.fieldValues.get(field);
    assert(val != null);
    return val;
  };

  _proto2.query = function query(_query) {
    if (_query === TemporalQueries.chronology()) {
      return this.chrono;
    }

    if (_query === TemporalQueries.zoneId() || _query === TemporalQueries.zone()) {
      return this.zone;
    }

    return _Temporal.prototype.query.call(this, _query);
  };

  _proto2.toBuilder = function toBuilder() {
    var builder = new DateTimeBuilder();
    builder.fieldValues.putAll(this.fieldValues);
    builder.chrono = this.dateTimeParseContext.getEffectiveChronology();

    if (this.zone != null) {
      builder.zone = this.zone;
    } else {
      builder.zone = this.overrideZone;
    }

    builder.leapSecond = this.leapSecond;
    builder.excessDays = this.excessDays;
    return builder;
  };

  return Parsed;
}(Temporal);

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var DateTimePrintContext = function () {
  function DateTimePrintContext(temporal, localeOrFormatter, symbols) {
    if (arguments.length === 2 && arguments[1] instanceof DateTimeFormatter) {
      this._temporal = DateTimePrintContext.adjust(temporal, localeOrFormatter);
      this._locale = localeOrFormatter.locale();
      this._symbols = localeOrFormatter.decimalStyle();
    } else {
      this._temporal = temporal;
      this._locale = localeOrFormatter;
      this._symbols = symbols;
    }

    this._optional = 0;
  }

  DateTimePrintContext.adjust = function adjust(temporal, formatter) {
    return temporal;
  };

  var _proto = DateTimePrintContext.prototype;

  _proto.symbols = function symbols() {
    return this._symbols;
  };

  _proto.startOptional = function startOptional() {
    this._optional++;
  };

  _proto.endOptional = function endOptional() {
    this._optional--;
  };

  _proto.getValueQuery = function getValueQuery(query) {
    var result = this._temporal.query(query);

    if (result == null && this._optional === 0) {
      throw new DateTimeException("Unable to extract value: " + this._temporal);
    }

    return result;
  };

  _proto.getValue = function getValue(field) {
    try {
      return this._temporal.getLong(field);
    } catch (ex) {
      if (ex instanceof DateTimeException && this._optional > 0) {
        return null;
      }

      throw ex;
    }
  };

  _proto.temporal = function temporal() {
    return this._temporal;
  };

  _proto.locale = function locale() {
    return this._locale;
  };

  _proto.setDateTime = function setDateTime(temporal) {
    this._temporal = temporal;
  };

  _proto.setLocale = function setLocale(locale) {
    this._locale = locale;
  };

  return DateTimePrintContext;
}();

var IsoFields = {};
var QUARTER_DAYS = [0, 90, 181, 273, 0, 91, 182, 274];

var Field = function (_TemporalField) {
  _inheritsLoose(Field, _TemporalField);

  function Field() {
    return _TemporalField.apply(this, arguments) || this;
  }

  var _proto = Field.prototype;

  _proto.isDateBased = function isDateBased() {
    return true;
  };

  _proto.isTimeBased = function isTimeBased() {
    return false;
  };

  _proto._isIso = function _isIso() {
    return true;
  };

  Field._getWeekRangeByLocalDate = function _getWeekRangeByLocalDate(date) {
    var wby = Field._getWeekBasedYear(date);

    return ValueRange.of(1, Field._getWeekRangeByYear(wby));
  };

  Field._getWeekRangeByYear = function _getWeekRangeByYear(wby) {
    var date = LocalDate.of(wby, 1, 1);

    if (date.dayOfWeek() === DayOfWeek.THURSDAY || date.dayOfWeek() === DayOfWeek.WEDNESDAY && date.isLeapYear()) {
      return 53;
    }

    return 52;
  };

  Field._getWeek = function _getWeek(date) {
    var dow0 = date.dayOfWeek().ordinal();
    var doy0 = date.dayOfYear() - 1;
    var doyThu0 = doy0 + (3 - dow0);
    var alignedWeek = MathUtil.intDiv(doyThu0, 7);
    var firstThuDoy0 = doyThu0 - alignedWeek * 7;
    var firstMonDoy0 = firstThuDoy0 - 3;

    if (firstMonDoy0 < -3) {
      firstMonDoy0 += 7;
    }

    if (doy0 < firstMonDoy0) {
      return Field._getWeekRangeByLocalDate(date.withDayOfYear(180).minusYears(1)).maximum();
    }

    var week = MathUtil.intDiv(doy0 - firstMonDoy0, 7) + 1;

    if (week === 53) {
      if ((firstMonDoy0 === -3 || firstMonDoy0 === -2 && date.isLeapYear()) === false) {
        week = 1;
      }
    }

    return week;
  };

  Field._getWeekBasedYear = function _getWeekBasedYear(date) {
    var year = date.year();
    var doy = date.dayOfYear();

    if (doy <= 3) {
      var dow = date.dayOfWeek().ordinal();

      if (doy - dow < -2) {
        year--;
      }
    } else if (doy >= 363) {
      var _dow = date.dayOfWeek().ordinal();

      doy = doy - 363 - (date.isLeapYear() ? 1 : 0);

      if (doy - _dow >= 0) {
        year++;
      }
    }

    return year;
  };

  _proto.displayName = function displayName() {
    return this.toString();
  };

  _proto.resolve = function resolve() {
    return null;
  };

  _proto.name = function name() {
    return this.toString();
  };

  return Field;
}(TemporalField);

var DAY_OF_QUARTER_FIELD = function (_Field) {
  _inheritsLoose(DAY_OF_QUARTER_FIELD, _Field);

  function DAY_OF_QUARTER_FIELD() {
    return _Field.apply(this, arguments) || this;
  }

  var _proto2 = DAY_OF_QUARTER_FIELD.prototype;

  _proto2.toString = function toString() {
    return 'DayOfQuarter';
  };

  _proto2.baseUnit = function baseUnit() {
    return ChronoUnit.DAYS;
  };

  _proto2.rangeUnit = function rangeUnit() {
    return QUARTER_YEARS;
  };

  _proto2.range = function range() {
    return ValueRange.of(1, 90, 92);
  };

  _proto2.isSupportedBy = function isSupportedBy(temporal) {
    return temporal.isSupported(ChronoField.DAY_OF_YEAR) && temporal.isSupported(ChronoField.MONTH_OF_YEAR) && temporal.isSupported(ChronoField.YEAR) && this._isIso(temporal);
  };

  _proto2.rangeRefinedBy = function rangeRefinedBy(temporal) {
    if (temporal.isSupported(this) === false) {
      throw new UnsupportedTemporalTypeException('Unsupported field: DayOfQuarter');
    }

    var qoy = temporal.getLong(QUARTER_OF_YEAR);

    if (qoy === 1) {
      var year = temporal.getLong(ChronoField.YEAR);
      return IsoChronology.isLeapYear(year) ? ValueRange.of(1, 91) : ValueRange.of(1, 90);
    } else if (qoy === 2) {
      return ValueRange.of(1, 91);
    } else if (qoy === 3 || qoy === 4) {
      return ValueRange.of(1, 92);
    }

    return this.range();
  };

  _proto2.getFrom = function getFrom(temporal) {
    if (temporal.isSupported(this) === false) {
      throw new UnsupportedTemporalTypeException('Unsupported field: DayOfQuarter');
    }

    var doy = temporal.get(ChronoField.DAY_OF_YEAR);
    var moy = temporal.get(ChronoField.MONTH_OF_YEAR);
    var year = temporal.getLong(ChronoField.YEAR);
    return doy - QUARTER_DAYS[MathUtil.intDiv(moy - 1, 3) + (IsoChronology.isLeapYear(year) ? 4 : 0)];
  };

  _proto2.adjustInto = function adjustInto(temporal, newValue) {
    var curValue = this.getFrom(temporal);
    this.range().checkValidValue(newValue, this);
    return temporal.with(ChronoField.DAY_OF_YEAR, temporal.getLong(ChronoField.DAY_OF_YEAR) + (newValue - curValue));
  };

  _proto2.resolve = function resolve(fieldValues, partialTemporal, resolverStyle) {
    var yearLong = fieldValues.get(ChronoField.YEAR);
    var qoyLong = fieldValues.get(QUARTER_OF_YEAR);

    if (yearLong == null || qoyLong == null) {
      return null;
    }

    var y = ChronoField.YEAR.checkValidIntValue(yearLong);
    var doq = fieldValues.get(DAY_OF_QUARTER);
    var date;

    if (resolverStyle === ResolverStyle.LENIENT) {
      var qoy = qoyLong;
      date = LocalDate.of(y, 1, 1);
      date = date.plusMonths(MathUtil.safeMultiply(MathUtil.safeSubtract(qoy, 1), 3));
      date = date.plusDays(MathUtil.safeSubtract(doq, 1));
    } else {
      var _qoy = QUARTER_OF_YEAR.range().checkValidIntValue(qoyLong, QUARTER_OF_YEAR);

      if (resolverStyle === ResolverStyle.STRICT) {
        var max = 92;

        if (_qoy === 1) {
          max = IsoChronology.isLeapYear(y) ? 91 : 90;
        } else if (_qoy === 2) {
          max = 91;
        }

        ValueRange.of(1, max).checkValidValue(doq, this);
      } else {
        this.range().checkValidValue(doq, this);
      }

      date = LocalDate.of(y, (_qoy - 1) * 3 + 1, 1).plusDays(doq - 1);
    }

    fieldValues.remove(this);
    fieldValues.remove(ChronoField.YEAR);
    fieldValues.remove(QUARTER_OF_YEAR);
    return date;
  };

  return DAY_OF_QUARTER_FIELD;
}(Field);

var QUARTER_OF_YEAR_FIELD = function (_Field2) {
  _inheritsLoose(QUARTER_OF_YEAR_FIELD, _Field2);

  function QUARTER_OF_YEAR_FIELD() {
    return _Field2.apply(this, arguments) || this;
  }

  var _proto3 = QUARTER_OF_YEAR_FIELD.prototype;

  _proto3.toString = function toString() {
    return 'QuarterOfYear';
  };

  _proto3.baseUnit = function baseUnit() {
    return QUARTER_YEARS;
  };

  _proto3.rangeUnit = function rangeUnit() {
    return ChronoUnit.YEARS;
  };

  _proto3.range = function range() {
    return ValueRange.of(1, 4);
  };

  _proto3.isSupportedBy = function isSupportedBy(temporal) {
    return temporal.isSupported(ChronoField.MONTH_OF_YEAR) && this._isIso(temporal);
  };

  _proto3.rangeRefinedBy = function rangeRefinedBy(temporal) {
    return this.range();
  };

  _proto3.getFrom = function getFrom(temporal) {
    if (temporal.isSupported(this) === false) {
      throw new UnsupportedTemporalTypeException('Unsupported field: QuarterOfYear');
    }

    var moy = temporal.getLong(ChronoField.MONTH_OF_YEAR);
    return MathUtil.intDiv(moy + 2, 3);
  };

  _proto3.adjustInto = function adjustInto(temporal, newValue) {
    var curValue = this.getFrom(temporal);
    this.range().checkValidValue(newValue, this);
    return temporal.with(ChronoField.MONTH_OF_YEAR, temporal.getLong(ChronoField.MONTH_OF_YEAR) + (newValue - curValue) * 3);
  };

  return QUARTER_OF_YEAR_FIELD;
}(Field);

var WEEK_OF_WEEK_BASED_YEAR_FIELD = function (_Field3) {
  _inheritsLoose(WEEK_OF_WEEK_BASED_YEAR_FIELD, _Field3);

  function WEEK_OF_WEEK_BASED_YEAR_FIELD() {
    return _Field3.apply(this, arguments) || this;
  }

  var _proto4 = WEEK_OF_WEEK_BASED_YEAR_FIELD.prototype;

  _proto4.toString = function toString() {
    return 'WeekOfWeekBasedYear';
  };

  _proto4.baseUnit = function baseUnit() {
    return ChronoUnit.WEEKS;
  };

  _proto4.rangeUnit = function rangeUnit() {
    return WEEK_BASED_YEARS;
  };

  _proto4.range = function range() {
    return ValueRange.of(1, 52, 53);
  };

  _proto4.isSupportedBy = function isSupportedBy(temporal) {
    return temporal.isSupported(ChronoField.EPOCH_DAY) && this._isIso(temporal);
  };

  _proto4.rangeRefinedBy = function rangeRefinedBy(temporal) {
    if (temporal.isSupported(this) === false) {
      throw new UnsupportedTemporalTypeException('Unsupported field: WeekOfWeekBasedYear');
    }

    return Field._getWeekRangeByLocalDate(LocalDate.from(temporal));
  };

  _proto4.getFrom = function getFrom(temporal) {
    if (temporal.isSupported(this) === false) {
      throw new UnsupportedTemporalTypeException('Unsupported field: WeekOfWeekBasedYear');
    }

    return Field._getWeek(LocalDate.from(temporal));
  };

  _proto4.adjustInto = function adjustInto(temporal, newValue) {
    this.range().checkValidValue(newValue, this);
    return temporal.plus(MathUtil.safeSubtract(newValue, this.getFrom(temporal)), ChronoUnit.WEEKS);
  };

  _proto4.resolve = function resolve(fieldValues, partialTemporal, resolverStyle) {
    var wbyLong = fieldValues.get(WEEK_BASED_YEAR);
    var dowLong = fieldValues.get(ChronoField.DAY_OF_WEEK);

    if (wbyLong == null || dowLong == null) {
      return null;
    }

    var wby = WEEK_BASED_YEAR.range().checkValidIntValue(wbyLong, WEEK_BASED_YEAR);
    var wowby = fieldValues.get(WEEK_OF_WEEK_BASED_YEAR);
    var date;

    if (resolverStyle === ResolverStyle.LENIENT) {
      var dow = dowLong;
      var weeks = 0;

      if (dow > 7) {
        weeks = MathUtil.intDiv(dow - 1, 7);
        dow = MathUtil.intMod(dow - 1, 7) + 1;
      } else if (dow < 1) {
        weeks = MathUtil.intDiv(dow, 7) - 1;
        dow = MathUtil.intMod(dow, 7) + 7;
      }

      date = LocalDate.of(wby, 1, 4).plusWeeks(wowby - 1).plusWeeks(weeks).with(ChronoField.DAY_OF_WEEK, dow);
    } else {
      var _dow2 = ChronoField.DAY_OF_WEEK.checkValidIntValue(dowLong);

      if (resolverStyle === ResolverStyle.STRICT) {
        var temp = LocalDate.of(wby, 1, 4);

        var range = Field._getWeekRangeByLocalDate(temp);

        range.checkValidValue(wowby, this);
      } else {
        this.range().checkValidValue(wowby, this);
      }

      date = LocalDate.of(wby, 1, 4).plusWeeks(wowby - 1).with(ChronoField.DAY_OF_WEEK, _dow2);
    }

    fieldValues.remove(this);
    fieldValues.remove(WEEK_BASED_YEAR);
    fieldValues.remove(ChronoField.DAY_OF_WEEK);
    return date;
  };

  _proto4.displayName = function displayName() {
    return 'Week';
  };

  return WEEK_OF_WEEK_BASED_YEAR_FIELD;
}(Field);

var WEEK_BASED_YEAR_FIELD = function (_Field4) {
  _inheritsLoose(WEEK_BASED_YEAR_FIELD, _Field4);

  function WEEK_BASED_YEAR_FIELD() {
    return _Field4.apply(this, arguments) || this;
  }

  var _proto5 = WEEK_BASED_YEAR_FIELD.prototype;

  _proto5.toString = function toString() {
    return 'WeekBasedYear';
  };

  _proto5.baseUnit = function baseUnit() {
    return WEEK_BASED_YEARS;
  };

  _proto5.rangeUnit = function rangeUnit() {
    return ChronoUnit.FOREVER;
  };

  _proto5.range = function range() {
    return ChronoField.YEAR.range();
  };

  _proto5.isSupportedBy = function isSupportedBy(temporal) {
    return temporal.isSupported(ChronoField.EPOCH_DAY) && this._isIso(temporal);
  };

  _proto5.rangeRefinedBy = function rangeRefinedBy(temporal) {
    return ChronoField.YEAR.range();
  };

  _proto5.getFrom = function getFrom(temporal) {
    if (temporal.isSupported(this) === false) {
      throw new UnsupportedTemporalTypeException('Unsupported field: WeekBasedYear');
    }

    return Field._getWeekBasedYear(LocalDate.from(temporal));
  };

  _proto5.adjustInto = function adjustInto(temporal, newValue) {
    if (this.isSupportedBy(temporal) === false) {
      throw new UnsupportedTemporalTypeException('Unsupported field: WeekBasedYear');
    }

    var newWby = this.range().checkValidIntValue(newValue, WEEK_BASED_YEAR);
    var date = LocalDate.from(temporal);
    var dow = date.get(ChronoField.DAY_OF_WEEK);

    var week = Field._getWeek(date);

    if (week === 53 && Field._getWeekRangeByYear(newWby) === 52) {
      week = 52;
    }

    var resolved = LocalDate.of(newWby, 1, 4);
    var days = dow - resolved.get(ChronoField.DAY_OF_WEEK) + (week - 1) * 7;
    resolved = resolved.plusDays(days);
    return temporal.with(resolved);
  };

  return WEEK_BASED_YEAR_FIELD;
}(Field);

var Unit = function (_TemporalUnit) {
  _inheritsLoose(Unit, _TemporalUnit);

  function Unit(name, estimatedDuration) {
    var _this;

    _this = _TemporalUnit.call(this) || this;
    _this._name = name;
    _this._duration = estimatedDuration;
    return _this;
  }

  var _proto6 = Unit.prototype;

  _proto6.duration = function duration() {
    return this._duration;
  };

  _proto6.isDurationEstimated = function isDurationEstimated() {
    return true;
  };

  _proto6.isDateBased = function isDateBased() {
    return true;
  };

  _proto6.isTimeBased = function isTimeBased() {
    return false;
  };

  _proto6.isSupportedBy = function isSupportedBy(temporal) {
    return temporal.isSupported(ChronoField.EPOCH_DAY);
  };

  _proto6.addTo = function addTo(temporal, periodToAdd) {
    switch (this) {
      case WEEK_BASED_YEARS:
        {
          var added = MathUtil.safeAdd(temporal.get(WEEK_BASED_YEAR), periodToAdd);
          return temporal.with(WEEK_BASED_YEAR, added);
        }

      case QUARTER_YEARS:
        return temporal.plus(MathUtil.intDiv(periodToAdd, 256), ChronoUnit.YEARS).plus(MathUtil.intMod(periodToAdd, 256) * 3, ChronoUnit.MONTHS);

      default:
        throw new IllegalStateException('Unreachable');
    }
  };

  _proto6.between = function between(temporal1, temporal2) {
    switch (this) {
      case WEEK_BASED_YEARS:
        return MathUtil.safeSubtract(temporal2.getLong(WEEK_BASED_YEAR), temporal1.getLong(WEEK_BASED_YEAR));

      case QUARTER_YEARS:
        return MathUtil.intDiv(temporal1.until(temporal2, ChronoUnit.MONTHS), 3);

      default:
        throw new IllegalStateException('Unreachable');
    }
  };

  _proto6.toString = function toString() {
    return name;
  };

  return Unit;
}(TemporalUnit);

var DAY_OF_QUARTER = null;
var QUARTER_OF_YEAR = null;
var WEEK_OF_WEEK_BASED_YEAR = null;
var WEEK_BASED_YEAR = null;
var WEEK_BASED_YEARS = null;
var QUARTER_YEARS = null;
function _init$f() {
  DAY_OF_QUARTER = new DAY_OF_QUARTER_FIELD();
  QUARTER_OF_YEAR = new QUARTER_OF_YEAR_FIELD();
  WEEK_OF_WEEK_BASED_YEAR = new WEEK_OF_WEEK_BASED_YEAR_FIELD();
  WEEK_BASED_YEAR = new WEEK_BASED_YEAR_FIELD();
  WEEK_BASED_YEARS = new Unit('WeekBasedYears', Duration.ofSeconds(31556952));
  QUARTER_YEARS = new Unit('QuarterYears', Duration.ofSeconds(31556952 / 4));
  IsoFields.DAY_OF_QUARTER = DAY_OF_QUARTER;
  IsoFields.QUARTER_OF_YEAR = QUARTER_OF_YEAR;
  IsoFields.WEEK_OF_WEEK_BASED_YEAR = WEEK_OF_WEEK_BASED_YEAR;
  IsoFields.WEEK_BASED_YEAR = WEEK_BASED_YEAR;
  IsoFields.WEEK_BASED_YEARS = WEEK_BASED_YEARS;
  IsoFields.QUARTER_YEARS = QUARTER_YEARS;

  LocalDate.prototype.isoWeekOfWeekyear = function () {
    return this.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR);
  };

  LocalDate.prototype.isoWeekyear = function () {
    return this.get(IsoFields.WEEK_BASED_YEAR);
  };
}

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var DecimalStyle = function () {
  function DecimalStyle(zeroChar, positiveSignChar, negativeSignChar, decimalPointChar) {
    this._zeroDigit = zeroChar;
    this._zeroDigitCharCode = zeroChar.charCodeAt(0);
    this._positiveSign = positiveSignChar;
    this._negativeSign = negativeSignChar;
    this._decimalSeparator = decimalPointChar;
  }

  var _proto = DecimalStyle.prototype;

  _proto.positiveSign = function positiveSign() {
    return this._positiveSign;
  };

  _proto.withPositiveSign = function withPositiveSign(positiveSign) {
    if (positiveSign === this._positiveSign) {
      return this;
    }

    return new DecimalStyle(this._zeroDigit, positiveSign, this._negativeSign, this._decimalSeparator);
  };

  _proto.negativeSign = function negativeSign() {
    return this._negativeSign;
  };

  _proto.withNegativeSign = function withNegativeSign(negativeSign) {
    if (negativeSign === this._negativeSign) {
      return this;
    }

    return new DecimalStyle(this._zeroDigit, this._positiveSign, negativeSign, this._decimalSeparator);
  };

  _proto.zeroDigit = function zeroDigit() {
    return this._zeroDigit;
  };

  _proto.withZeroDigit = function withZeroDigit(zeroDigit) {
    if (zeroDigit === this._zeroDigit) {
      return this;
    }

    return new DecimalStyle(zeroDigit, this._positiveSign, this._negativeSign, this._decimalSeparator);
  };

  _proto.decimalSeparator = function decimalSeparator() {
    return this._decimalSeparator;
  };

  _proto.withDecimalSeparator = function withDecimalSeparator(decimalSeparator) {
    if (decimalSeparator === this._decimalSeparator) {
      return this;
    }

    return new DecimalStyle(this._zeroDigit, this._positiveSign, this._negativeSign, decimalSeparator);
  };

  _proto.convertToDigit = function convertToDigit(char) {
    var val = char.charCodeAt(0) - this._zeroDigitCharCode;

    return val >= 0 && val <= 9 ? val : -1;
  };

  _proto.convertNumberToI18N = function convertNumberToI18N(numericText) {
    if (this._zeroDigit === '0') {
      return numericText;
    }

    var diff = this._zeroDigitCharCode - '0'.charCodeAt(0);
    var convertedText = '';

    for (var i = 0; i < numericText.length; i++) {
      convertedText += String.fromCharCode(numericText.charCodeAt(i) + diff);
    }

    return convertedText;
  };

  _proto.equals = function equals(other) {
    if (this === other) {
      return true;
    }

    if (other instanceof DecimalStyle) {
      return this._zeroDigit === other._zeroDigit && this._positiveSign === other._positiveSign && this._negativeSign === other._negativeSign && this._decimalSeparator === other._decimalSeparator;
    }

    return false;
  };

  _proto.hashCode = function hashCode() {
    return this._zeroDigit + this._positiveSign + this._negativeSign + this._decimalSeparator;
  };

  _proto.toString = function toString() {
    return "DecimalStyle[" + this._zeroDigit + this._positiveSign + this._negativeSign + this._decimalSeparator + "]";
  };

  DecimalStyle.of = function of() {
    throw new Error('not yet supported');
  };

  DecimalStyle.availableLocales = function availableLocales() {
    throw new Error('not yet supported');
  };

  return DecimalStyle;
}();
DecimalStyle.STANDARD = new DecimalStyle('0', '+', '-', '.');

var SignStyle = function (_Enum) {
  _inheritsLoose(SignStyle, _Enum);

  function SignStyle() {
    return _Enum.apply(this, arguments) || this;
  }

  var _proto = SignStyle.prototype;

  _proto.parse = function parse(positive, strict, fixedWidth) {
    switch (this) {
      case SignStyle.NORMAL:
        return !positive || !strict;

      case SignStyle.ALWAYS:
      case SignStyle.EXCEEDS_PAD:
        return true;

      default:
        return !strict && !fixedWidth;
    }
  };

  return SignStyle;
}(Enum);
SignStyle.NORMAL = new SignStyle('NORMAL');
SignStyle.NEVER = new SignStyle('NEVER');
SignStyle.ALWAYS = new SignStyle('ALWAYS');
SignStyle.EXCEEDS_PAD = new SignStyle('EXCEEDS_PAD');
SignStyle.NOT_NEGATIVE = new SignStyle('NOT_NEGATIVE');

var TextStyle = function (_Enum) {
  _inheritsLoose(TextStyle, _Enum);

  function TextStyle() {
    return _Enum.apply(this, arguments) || this;
  }

  var _proto = TextStyle.prototype;

  _proto.isStandalone = function isStandalone() {
    switch (this) {
      case TextStyle.FULL_STANDALONE:
      case TextStyle.SHORT_STANDALONE:
      case TextStyle.NARROW_STANDALONE:
        return true;

      default:
        return false;
    }
  };

  _proto.asStandalone = function asStandalone() {
    switch (this) {
      case TextStyle.FULL:
        return TextStyle.FULL_STANDALONE;

      case TextStyle.SHORT:
        return TextStyle.SHORT_STANDALONE;

      case TextStyle.NARROW:
        return TextStyle.NARROW_STANDALONE;

      default:
        return this;
    }
  };

  _proto.asNormal = function asNormal() {
    switch (this) {
      case TextStyle.FULL_STANDALONE:
        return TextStyle.FULL;

      case TextStyle.SHORT_STANDALONE:
        return TextStyle.SHORT;

      case TextStyle.NARROW_STANDALONE:
        return TextStyle.NARROW;

      default:
        return this;
    }
  };

  return TextStyle;
}(Enum);
TextStyle.FULL = new TextStyle('FULL');
TextStyle.FULL_STANDALONE = new TextStyle('FULL_STANDALONE');
TextStyle.SHORT = new TextStyle('SHORT');
TextStyle.SHORT_STANDALONE = new TextStyle('SHORT_STANDALONE');
TextStyle.NARROW = new TextStyle('NARROW');
TextStyle.NARROW_STANDALONE = new TextStyle('NARROW_STANDALONE');

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var CharLiteralPrinterParser = function () {
  function CharLiteralPrinterParser(literal) {
    if (literal.length > 1) {
      throw new IllegalArgumentException("invalid literal, too long: \"" + literal + "\"");
    }

    this._literal = literal;
  }

  var _proto = CharLiteralPrinterParser.prototype;

  _proto.print = function print(context, buf) {
    buf.append(this._literal);
    return true;
  };

  _proto.parse = function parse(context, text, position) {
    var length = text.length;

    if (position === length) {
      return ~position;
    }

    var ch = text.charAt(position);

    if (context.charEquals(this._literal, ch) === false) {
      return ~position;
    }

    return position + this._literal.length;
  };

  _proto.toString = function toString() {
    if (this._literal === '\'') {
      return "''";
    }

    return "'" + this._literal + "'";
  };

  return CharLiteralPrinterParser;
}();

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var CompositePrinterParser = function () {
  function CompositePrinterParser(printerParsers, optional) {
    this._printerParsers = printerParsers;
    this._optional = optional;
  }

  var _proto = CompositePrinterParser.prototype;

  _proto.withOptional = function withOptional(optional) {
    if (optional === this._optional) {
      return this;
    }

    return new CompositePrinterParser(this._printerParsers, optional);
  };

  _proto.print = function print(context, buf) {
    var length = buf.length();

    if (this._optional) {
      context.startOptional();
    }

    try {
      for (var i = 0; i < this._printerParsers.length; i++) {
        var pp = this._printerParsers[i];

        if (pp.print(context, buf) === false) {
          buf.setLength(length);
          return true;
        }
      }
    } finally {
      if (this._optional) {
        context.endOptional();
      }
    }

    return true;
  };

  _proto.parse = function parse(context, text, position) {
    if (this._optional) {
      context.startOptional();
      var pos = position;

      for (var i = 0; i < this._printerParsers.length; i++) {
        var pp = this._printerParsers[i];
        pos = pp.parse(context, text, pos);

        if (pos < 0) {
          context.endOptional(false);
          return position;
        }
      }

      context.endOptional(true);
      return pos;
    } else {
      for (var _i = 0; _i < this._printerParsers.length; _i++) {
        var _pp = this._printerParsers[_i];
        position = _pp.parse(context, text, position);

        if (position < 0) {
          break;
        }
      }

      return position;
    }
  };

  _proto.toString = function toString() {
    var buf = '';

    if (this._printerParsers != null) {
      buf += this._optional ? '[' : '(';

      for (var i = 0; i < this._printerParsers.length; i++) {
        var pp = this._printerParsers[i];
        buf += pp.toString();
      }

      buf += this._optional ? ']' : ')';
    }

    return buf;
  };

  return CompositePrinterParser;
}();

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var FractionPrinterParser = function () {
  function FractionPrinterParser(field, minWidth, maxWidth, decimalPoint) {
    requireNonNull(field, 'field');

    if (field.range().isFixed() === false) {
      throw new IllegalArgumentException("Field must have a fixed set of values: " + field);
    }

    if (minWidth < 0 || minWidth > 9) {
      throw new IllegalArgumentException("Minimum width must be from 0 to 9 inclusive but was " + minWidth);
    }

    if (maxWidth < 1 || maxWidth > 9) {
      throw new IllegalArgumentException("Maximum width must be from 1 to 9 inclusive but was " + maxWidth);
    }

    if (maxWidth < minWidth) {
      throw new IllegalArgumentException("Maximum width must exceed or equal the minimum width but " + maxWidth + " < " + minWidth);
    }

    this.field = field;
    this.minWidth = minWidth;
    this.maxWidth = maxWidth;
    this.decimalPoint = decimalPoint;
  }

  var _proto = FractionPrinterParser.prototype;

  _proto.print = function print(context, buf) {
    var value = context.getValue(this.field);

    if (value === null) {
      return false;
    }

    var symbols = context.symbols();

    if (value === 0) {
      if (this.minWidth > 0) {
        if (this.decimalPoint) {
          buf.append(symbols.decimalSeparator());
        }

        for (var i = 0; i < this.minWidth; i++) {
          buf.append(symbols.zeroDigit());
        }
      }
    } else {
      var fraction = this.convertToFraction(value, symbols.zeroDigit());
      var outputScale = Math.min(Math.max(fraction.length, this.minWidth), this.maxWidth);
      fraction = fraction.substr(0, outputScale);

      if (fraction * 1 > 0) {
        while (fraction.length > this.minWidth && fraction[fraction.length - 1] === '0') {
          fraction = fraction.substr(0, fraction.length - 1);
        }
      }

      var str = fraction;
      str = symbols.convertNumberToI18N(str);

      if (this.decimalPoint) {
        buf.append(symbols.decimalSeparator());
      }

      buf.append(str);
    }

    return true;
  };

  _proto.parse = function parse(context, text, position) {
    var effectiveMin = context.isStrict() ? this.minWidth : 0;
    var effectiveMax = context.isStrict() ? this.maxWidth : 9;
    var length = text.length;

    if (position === length) {
      return effectiveMin > 0 ? ~position : position;
    }

    if (this.decimalPoint) {
      if (text[position] !== context.symbols().decimalSeparator()) {
        return effectiveMin > 0 ? ~position : position;
      }

      position++;
    }

    var minEndPos = position + effectiveMin;

    if (minEndPos > length) {
      return ~position;
    }

    var maxEndPos = Math.min(position + effectiveMax, length);
    var total = 0;
    var pos = position;

    while (pos < maxEndPos) {
      var ch = text.charAt(pos++);
      var digit = context.symbols().convertToDigit(ch);

      if (digit < 0) {
        if (pos < minEndPos) {
          return ~position;
        }

        pos--;
        break;
      }

      total = total * 10 + digit;
    }

    var moveLeft = pos - position;
    var scale = Math.pow(10, moveLeft);
    var value = this.convertFromFraction(total, scale);
    return context.setParsedField(this.field, value, position, pos);
  };

  _proto.convertToFraction = function convertToFraction(value, zeroDigit) {
    var range = this.field.range();
    range.checkValidValue(value, this.field);

    var _min = range.minimum();

    var _range = range.maximum() - _min + 1;

    var _value = value - _min;

    var _scaled = MathUtil.intDiv(_value * 1000000000, _range);

    var fraction = "" + _scaled;

    while (fraction.length < 9) {
      fraction = zeroDigit + fraction;
    }

    return fraction;
  };

  _proto.convertFromFraction = function convertFromFraction(total, scale) {
    var range = this.field.range();

    var _min = range.minimum();

    var _range = range.maximum() - _min + 1;

    var _value = MathUtil.intDiv(total * _range, scale);

    return _value;
  };

  _proto.toString = function toString() {
    var decimal = this.decimalPoint ? ',DecimalPoint' : '';
    return "Fraction(" + this.field + "," + this.minWidth + "," + this.maxWidth + decimal + ")";
  };

  return FractionPrinterParser;
}();

var MAX_WIDTH$1 = 15;
var EXCEED_POINTS = [0, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000];
var NumberPrinterParser = function () {
  function NumberPrinterParser(field, minWidth, maxWidth, signStyle, subsequentWidth) {
    if (subsequentWidth === void 0) {
      subsequentWidth = 0;
    }

    this._field = field;
    this._minWidth = minWidth;
    this._maxWidth = maxWidth;
    this._signStyle = signStyle;
    this._subsequentWidth = subsequentWidth;
  }

  var _proto = NumberPrinterParser.prototype;

  _proto.field = function field() {
    return this._field;
  };

  _proto.minWidth = function minWidth() {
    return this._minWidth;
  };

  _proto.maxWidth = function maxWidth() {
    return this._maxWidth;
  };

  _proto.signStyle = function signStyle() {
    return this._signStyle;
  };

  _proto.withFixedWidth = function withFixedWidth() {
    if (this._subsequentWidth === -1) {
      return this;
    }

    return new NumberPrinterParser(this._field, this._minWidth, this._maxWidth, this._signStyle, -1);
  };

  _proto.withSubsequentWidth = function withSubsequentWidth(subsequentWidth) {
    return new NumberPrinterParser(this._field, this._minWidth, this._maxWidth, this._signStyle, this._subsequentWidth + subsequentWidth);
  };

  _proto._isFixedWidth = function _isFixedWidth() {
    return this._subsequentWidth === -1 || this._subsequentWidth > 0 && this._minWidth === this._maxWidth && this._signStyle === SignStyle.NOT_NEGATIVE;
  };

  _proto.print = function print(context, buf) {
    var contextValue = context.getValue(this._field);

    if (contextValue == null) {
      return false;
    }

    var value = this._getValue(context, contextValue);

    var symbols = context.symbols();
    var str = "" + Math.abs(value);

    if (str.length > this._maxWidth) {
      throw new DateTimeException("Field " + this._field + " cannot be printed as the value " + value + " exceeds the maximum print width of " + this._maxWidth);
    }

    str = symbols.convertNumberToI18N(str);

    if (value >= 0) {
      switch (this._signStyle) {
        case SignStyle.EXCEEDS_PAD:
          if (this._minWidth < MAX_WIDTH$1 && value >= EXCEED_POINTS[this._minWidth]) {
            buf.append(symbols.positiveSign());
          }

          break;

        case SignStyle.ALWAYS:
          buf.append(symbols.positiveSign());
          break;
      }
    } else {
      switch (this._signStyle) {
        case SignStyle.NORMAL:
        case SignStyle.EXCEEDS_PAD:
        case SignStyle.ALWAYS:
          buf.append(symbols.negativeSign());
          break;

        case SignStyle.NOT_NEGATIVE:
          throw new DateTimeException("Field " + this._field + " cannot be printed as the value " + value + " cannot be negative according to the SignStyle");
      }
    }

    for (var i = 0; i < this._minWidth - str.length; i++) {
      buf.append(symbols.zeroDigit());
    }

    buf.append(str);
    return true;
  };

  _proto.parse = function parse(context, text, position) {
    var length = text.length;

    if (position === length) {
      return ~position;
    }

    assert(position >= 0 && position < length);
    var sign = text.charAt(position);
    var negative = false;
    var positive = false;

    if (sign === context.symbols().positiveSign()) {
      if (this._signStyle.parse(true, context.isStrict(), this._minWidth === this._maxWidth) === false) {
        return ~position;
      }

      positive = true;
      position++;
    } else if (sign === context.symbols().negativeSign()) {
      if (this._signStyle.parse(false, context.isStrict(), this._minWidth === this._maxWidth) === false) {
        return ~position;
      }

      negative = true;
      position++;
    } else {
      if (this._signStyle === SignStyle.ALWAYS && context.isStrict()) {
        return ~position;
      }
    }

    var effMinWidth = context.isStrict() || this._isFixedWidth() ? this._minWidth : 1;
    var minEndPos = position + effMinWidth;

    if (minEndPos > length) {
      return ~position;
    }

    var effMaxWidth = (context.isStrict() || this._isFixedWidth() ? this._maxWidth : 9) + Math.max(this._subsequentWidth, 0);
    var total = 0;
    var pos = position;

    for (var pass = 0; pass < 2; pass++) {
      var maxEndPos = Math.min(pos + effMaxWidth, length);

      while (pos < maxEndPos) {
        var ch = text.charAt(pos++);
        var digit = context.symbols().convertToDigit(ch);

        if (digit < 0) {
          pos--;

          if (pos < minEndPos) {
            return ~position;
          }

          break;
        }

        if (pos - position > MAX_WIDTH$1) {
          throw new ArithmeticException('number text exceeds length');
        } else {
          total = total * 10 + digit;
        }
      }

      if (this._subsequentWidth > 0 && pass === 0) {
        var parseLen = pos - position;
        effMaxWidth = Math.max(effMinWidth, parseLen - this._subsequentWidth);
        pos = position;
        total = 0;
      } else {
        break;
      }
    }

    if (negative) {
      if (total === 0 && context.isStrict()) {
        return ~(position - 1);
      }

      if (total !== 0) {
        total = -total;
      }
    } else if (this._signStyle === SignStyle.EXCEEDS_PAD && context.isStrict()) {
      var _parseLen = pos - position;

      if (positive) {
        if (_parseLen <= this._minWidth) {
          return ~(position - 1);
        }
      } else {
        if (_parseLen > this._minWidth) {
          return ~position;
        }
      }
    }

    return this._setValue(context, total, position, pos);
  };

  _proto._getValue = function _getValue(context, value) {
    return value;
  };

  _proto._setValue = function _setValue(context, value, errorPos, successPos) {
    return context.setParsedField(this._field, value, errorPos, successPos);
  };

  _proto.toString = function toString() {
    if (this._minWidth === 1 && this._maxWidth === MAX_WIDTH$1 && this._signStyle === SignStyle.NORMAL) {
      return "Value(" + this._field + ")";
    }

    if (this._minWidth === this._maxWidth && this._signStyle === SignStyle.NOT_NEGATIVE) {
      return "Value(" + this._field + "," + this._minWidth + ")";
    }

    return "Value(" + this._field + "," + this._minWidth + "," + this._maxWidth + "," + this._signStyle + ")";
  };

  return NumberPrinterParser;
}();
var ReducedPrinterParser = function (_NumberPrinterParser) {
  _inheritsLoose(ReducedPrinterParser, _NumberPrinterParser);

  function ReducedPrinterParser(field, width, maxWidth, baseValue, baseDate) {
    var _this;

    _this = _NumberPrinterParser.call(this, field, width, maxWidth, SignStyle.NOT_NEGATIVE) || this;

    if (width < 1 || width > 10) {
      throw new IllegalArgumentException("The width must be from 1 to 10 inclusive but was " + width);
    }

    if (maxWidth < 1 || maxWidth > 10) {
      throw new IllegalArgumentException("The maxWidth must be from 1 to 10 inclusive but was " + maxWidth);
    }

    if (maxWidth < width) {
      throw new IllegalArgumentException('The maxWidth must be greater than the width');
    }

    if (baseDate === null) {
      if (field.range().isValidValue(baseValue) === false) {
        throw new IllegalArgumentException('The base value must be within the range of the field');
      }

      if (baseValue + EXCEED_POINTS[width] > MathUtil.MAX_SAFE_INTEGER) {
        throw new DateTimeException('Unable to add printer-parser as the range exceeds the capacity of an int');
      }
    }

    _this._baseValue = baseValue;
    _this._baseDate = baseDate;
    return _this;
  }

  var _proto2 = ReducedPrinterParser.prototype;

  _proto2._getValue = function _getValue(context, value) {
    var absValue = Math.abs(value);
    var baseValue = this._baseValue;

    if (this._baseDate !== null) {
      context.temporal();
      var chrono = IsoChronology.INSTANCE;
      baseValue = chrono.date(this._baseDate).get(this._field);
    }

    if (value >= baseValue && value < baseValue + EXCEED_POINTS[this._minWidth]) {
      return absValue % EXCEED_POINTS[this._minWidth];
    }

    return absValue % EXCEED_POINTS[this._maxWidth];
  };

  _proto2._setValue = function _setValue(context, value, errorPos, successPos) {
    var baseValue = this._baseValue;

    if (this._baseDate != null) {
      var chrono = context.getEffectiveChronology();
      baseValue = chrono.date(this._baseDate).get(this._field);
    }

    var parseLen = successPos - errorPos;

    if (parseLen === this._minWidth && value >= 0) {
      var range = EXCEED_POINTS[this._minWidth];
      var lastPart = baseValue % range;
      var basePart = baseValue - lastPart;

      if (baseValue > 0) {
        value = basePart + value;
      } else {
        value = basePart - value;
      }

      if (value < baseValue) {
        value += range;
      }
    }

    return context.setParsedField(this._field, value, errorPos, successPos);
  };

  _proto2.withFixedWidth = function withFixedWidth() {
    if (this._subsequentWidth === -1) {
      return this;
    }

    return new ReducedPrinterParser(this._field, this._minWidth, this._maxWidth, this._baseValue, this._baseDate, -1);
  };

  _proto2.withSubsequentWidth = function withSubsequentWidth(subsequentWidth) {
    return new ReducedPrinterParser(this._field, this._minWidth, this._maxWidth, this._baseValue, this._baseDate, this._subsequentWidth + subsequentWidth);
  };

  _proto2.isFixedWidth = function isFixedWidth(context) {
    if (context.isStrict() === false) {
      return false;
    }

    return _NumberPrinterParser.prototype.isFixedWidth.call(this, context);
  };

  _proto2.toString = function toString() {
    return "ReducedValue(" + this._field + "," + this._minWidth + "," + this._maxWidth + "," + (this._baseDate != null ? this._baseDate : this._baseValue) + ")";
  };

  return ReducedPrinterParser;
}(NumberPrinterParser);

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var PATTERNS = ['+HH', '+HHmm', '+HH:mm', '+HHMM', '+HH:MM', '+HHMMss', '+HH:MM:ss', '+HHMMSS', '+HH:MM:SS'];
var OffsetIdPrinterParser = function () {
  function OffsetIdPrinterParser(noOffsetText, pattern) {
    requireNonNull(noOffsetText, 'noOffsetText');
    requireNonNull(pattern, 'pattern');
    this.noOffsetText = noOffsetText;
    this.type = this._checkPattern(pattern);
  }

  var _proto = OffsetIdPrinterParser.prototype;

  _proto._checkPattern = function _checkPattern(pattern) {
    for (var i = 0; i < PATTERNS.length; i++) {
      if (PATTERNS[i] === pattern) {
        return i;
      }
    }

    throw new IllegalArgumentException("Invalid zone offset pattern: " + pattern);
  };

  _proto.print = function print(context, buf) {
    var offsetSecs = context.getValue(ChronoField.OFFSET_SECONDS);

    if (offsetSecs == null) {
      return false;
    }

    var totalSecs = MathUtil.safeToInt(offsetSecs);

    if (totalSecs === 0) {
      buf.append(this.noOffsetText);
    } else {
      var absHours = Math.abs(MathUtil.intMod(MathUtil.intDiv(totalSecs, 3600), 100));
      var absMinutes = Math.abs(MathUtil.intMod(MathUtil.intDiv(totalSecs, 60), 60));
      var absSeconds = Math.abs(MathUtil.intMod(totalSecs, 60));
      var bufPos = buf.length();
      var output = absHours;
      buf.append(totalSecs < 0 ? '-' : '+').appendChar(MathUtil.intDiv(absHours, 10) + "0").appendChar(MathUtil.intMod(absHours, 10) + "0");

      if (this.type >= 3 || this.type >= 1 && absMinutes > 0) {
        buf.append(this.type % 2 === 0 ? ':' : '').appendChar(MathUtil.intDiv(absMinutes, 10) + "0").appendChar(absMinutes % 10 + "0");
        output += absMinutes;

        if (this.type >= 7 || this.type >= 5 && absSeconds > 0) {
          buf.append(this.type % 2 === 0 ? ':' : '').appendChar(MathUtil.intDiv(absSeconds, 10) + "0").appendChar(absSeconds % 10 + "0");
          output += absSeconds;
        }
      }

      if (output === 0) {
        buf.setLength(bufPos);
        buf.append(this.noOffsetText);
      }
    }

    return true;
  };

  _proto.parse = function parse(context, text, position) {
    var length = text.length;
    var noOffsetLen = this.noOffsetText.length;

    if (noOffsetLen === 0) {
      if (position === length) {
        return context.setParsedField(ChronoField.OFFSET_SECONDS, 0, position, position);
      }
    } else {
      if (position === length) {
        return ~position;
      }

      if (context.subSequenceEquals(text, position, this.noOffsetText, 0, noOffsetLen)) {
        return context.setParsedField(ChronoField.OFFSET_SECONDS, 0, position, position + noOffsetLen);
      }
    }

    var sign = text[position];

    if (sign === '+' || sign === '-') {
      var negative = sign === '-' ? -1 : 1;
      var array = [0, 0, 0, 0];
      array[0] = position + 1;

      if ((this._parseNumber(array, 1, text, true) || this._parseNumber(array, 2, text, this.type >= 3) || this._parseNumber(array, 3, text, false)) === false) {
        var offsetSecs = MathUtil.safeZero(negative * (array[1] * 3600 + array[2] * 60 + array[3]));
        return context.setParsedField(ChronoField.OFFSET_SECONDS, offsetSecs, position, array[0]);
      }
    }

    if (noOffsetLen === 0) {
      return context.setParsedField(ChronoField.OFFSET_SECONDS, 0, position, position + noOffsetLen);
    }

    return ~position;
  };

  _proto._parseNumber = function _parseNumber(array, arrayIndex, parseText, required) {
    if ((this.type + 3) / 2 < arrayIndex) {
      return false;
    }

    var pos = array[0];

    if (this.type % 2 === 0 && arrayIndex > 1) {
      if (pos + 1 > parseText.length || parseText[pos] !== ':') {
        return required;
      }

      pos++;
    }

    if (pos + 2 > parseText.length) {
      return required;
    }

    var ch1 = parseText[pos++];
    var ch2 = parseText[pos++];

    if (ch1 < '0' || ch1 > '9' || ch2 < '0' || ch2 > '9') {
      return required;
    }

    var value = (ch1.charCodeAt(0) - 48) * 10 + (ch2.charCodeAt(0) - 48);

    if (value < 0 || value > 59) {
      return required;
    }

    array[arrayIndex] = value;
    array[0] = pos;
    return false;
  };

  _proto.toString = function toString() {
    var converted = this.noOffsetText.replace('\'', '\'\'');
    return "Offset(" + PATTERNS[this.type] + ",'" + converted + "')";
  };

  return OffsetIdPrinterParser;
}();
OffsetIdPrinterParser.INSTANCE_ID = new OffsetIdPrinterParser('Z', '+HH:MM:ss');
OffsetIdPrinterParser.PATTERNS = PATTERNS;

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var PadPrinterParserDecorator = function () {
  function PadPrinterParserDecorator(printerParser, padWidth, padChar) {
    this._printerParser = printerParser;
    this._padWidth = padWidth;
    this._padChar = padChar;
  }

  var _proto = PadPrinterParserDecorator.prototype;

  _proto.print = function print(context, buf) {
    var preLen = buf.length();

    if (this._printerParser.print(context, buf) === false) {
      return false;
    }

    var len = buf.length() - preLen;

    if (len > this._padWidth) {
      throw new DateTimeException("Cannot print as output of " + len + " characters exceeds pad width of " + this._padWidth);
    }

    for (var i = 0; i < this._padWidth - len; i++) {
      buf.insert(preLen, this._padChar);
    }

    return true;
  };

  _proto.parse = function parse(context, text, position) {
    var strict = context.isStrict();
    var caseSensitive = context.isCaseSensitive();
    assert(!(position > text.length));
    assert(position >= 0);

    if (position === text.length) {
      return ~position;
    }

    var endPos = position + this._padWidth;

    if (endPos > text.length) {
      if (strict) {
        return ~position;
      }

      endPos = text.length;
    }

    var pos = position;

    while (pos < endPos && (caseSensitive ? text[pos] === this._padChar : context.charEquals(text[pos], this._padChar))) {
      pos++;
    }

    text = text.substring(0, endPos);

    var resultPos = this._printerParser.parse(context, text, pos);

    if (resultPos !== endPos && strict) {
      return ~(position + pos);
    }

    return resultPos;
  };

  _proto.toString = function toString() {
    return "Pad(" + this._printerParser + "," + this._padWidth + (this._padChar === ' ' ? ')' : ",'" + this._padChar + "')");
  };

  return PadPrinterParserDecorator;
}();

var SettingsParser = function (_Enum) {
  _inheritsLoose(SettingsParser, _Enum);

  function SettingsParser() {
    return _Enum.apply(this, arguments) || this;
  }

  var _proto = SettingsParser.prototype;

  _proto.print = function print() {
    return true;
  };

  _proto.parse = function parse(context, text, position) {
    switch (this) {
      case SettingsParser.SENSITIVE:
        context.setCaseSensitive(true);
        break;

      case SettingsParser.INSENSITIVE:
        context.setCaseSensitive(false);
        break;

      case SettingsParser.STRICT:
        context.setStrict(true);
        break;

      case SettingsParser.LENIENT:
        context.setStrict(false);
        break;
    }

    return position;
  };

  _proto.toString = function toString() {
    switch (this) {
      case SettingsParser.SENSITIVE:
        return 'ParseCaseSensitive(true)';

      case SettingsParser.INSENSITIVE:
        return 'ParseCaseSensitive(false)';

      case SettingsParser.STRICT:
        return 'ParseStrict(true)';

      case SettingsParser.LENIENT:
        return 'ParseStrict(false)';
    }
  };

  return SettingsParser;
}(Enum);
SettingsParser.SENSITIVE = new SettingsParser('SENSITIVE');
SettingsParser.INSENSITIVE = new SettingsParser('INSENSITIVE');
SettingsParser.STRICT = new SettingsParser('STRICT');
SettingsParser.LENIENT = new SettingsParser('LENIENT');

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var StringLiteralPrinterParser = function () {
  function StringLiteralPrinterParser(literal) {
    this._literal = literal;
  }

  var _proto = StringLiteralPrinterParser.prototype;

  _proto.print = function print(context, buf) {
    buf.append(this._literal);
    return true;
  };

  _proto.parse = function parse(context, text, position) {
    var length = text.length;
    assert(!(position > length || position < 0));

    if (context.subSequenceEquals(text, position, this._literal, 0, this._literal.length) === false) {
      return ~position;
    }

    return position + this._literal.length;
  };

  _proto.toString = function toString() {
    var converted = this._literal.replace("'", "''");

    return "'" + converted + "'";
  };

  return StringLiteralPrinterParser;
}();

/*
 * @copyright (c) 2016, Philipp Thürwächter, Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var ZoneRulesProvider = function () {
  function ZoneRulesProvider() {}

  ZoneRulesProvider.getRules = function getRules(zoneId) {
    throw new DateTimeException("unsupported ZoneId:" + zoneId);
  };

  ZoneRulesProvider.getAvailableZoneIds = function getAvailableZoneIds() {
    return [];
  };

  return ZoneRulesProvider;
}();

var ZoneRegion = function (_ZoneId) {
  _inheritsLoose(ZoneRegion, _ZoneId);

  ZoneRegion.ofId = function ofId(zoneId) {
    var rules = ZoneRulesProvider.getRules(zoneId);
    return new ZoneRegion(zoneId, rules);
  };

  function ZoneRegion(id, rules) {
    var _this;

    _this = _ZoneId.call(this) || this;
    _this._id = id;
    _this._rules = rules;
    return _this;
  }

  var _proto = ZoneRegion.prototype;

  _proto.id = function id() {
    return this._id;
  };

  _proto.rules = function rules() {
    return this._rules;
  };

  return ZoneRegion;
}(ZoneId);

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var ZoneIdPrinterParser = function () {
  function ZoneIdPrinterParser(query, description) {
    this.query = query;
    this.description = description;
  }

  var _proto = ZoneIdPrinterParser.prototype;

  _proto.print = function print(context, buf) {
    var zone = context.getValueQuery(this.query);

    if (zone == null) {
      return false;
    }

    buf.append(zone.id());
    return true;
  };

  _proto.parse = function parse(context, text, position) {
    var length = text.length;

    if (position > length) {
      return ~position;
    }

    if (position === length) {
      return ~position;
    }

    var nextChar = text.charAt(position);

    if (nextChar === '+' || nextChar === '-') {
      var newContext = context.copy();
      var endPos = OffsetIdPrinterParser.INSTANCE_ID.parse(newContext, text, position);

      if (endPos < 0) {
        return endPos;
      }

      var offset = newContext.getParsed(ChronoField.OFFSET_SECONDS);
      var zone = ZoneOffset.ofTotalSeconds(offset);
      context.setParsedZone(zone);
      return endPos;
    } else if (length >= position + 2) {
      var nextNextChar = text.charAt(position + 1);

      if (context.charEquals(nextChar, 'U') && context.charEquals(nextNextChar, 'T')) {
        if (length >= position + 3 && context.charEquals(text.charAt(position + 2), 'C')) {
          return this._parsePrefixedOffset(context, text, position, position + 3);
        }

        return this._parsePrefixedOffset(context, text, position, position + 2);
      } else if (context.charEquals(nextChar, 'G') && length >= position + 3 && context.charEquals(nextNextChar, 'M') && context.charEquals(text.charAt(position + 2), 'T')) {
        return this._parsePrefixedOffset(context, text, position, position + 3);
      }
    }

    if (text.substr(position, 6) === 'SYSTEM') {
      context.setParsedZone(ZoneId.systemDefault());
      return position + 6;
    }

    if (context.charEquals(nextChar, 'Z')) {
      context.setParsedZone(ZoneOffset.UTC);
      return position + 1;
    }

    var availableZoneIds = ZoneRulesProvider.getAvailableZoneIds();

    if (zoneIdTree.size !== availableZoneIds.length) {
      zoneIdTree = ZoneIdTree.createTreeMap(availableZoneIds);
    }

    var maxParseLength = length - position;
    var treeMap = zoneIdTree.treeMap;
    var parsedZoneId = null;
    var parseLength = 0;

    while (treeMap != null) {
      var parsedSubZoneId = text.substr(position, Math.min(treeMap.length, maxParseLength));
      treeMap = treeMap.get(parsedSubZoneId);

      if (treeMap != null && treeMap.isLeaf) {
        parsedZoneId = parsedSubZoneId;
        parseLength = treeMap.length;
      }
    }

    if (parsedZoneId != null) {
      context.setParsedZone(ZoneRegion.ofId(parsedZoneId));
      return position + parseLength;
    }

    return ~position;
  };

  _proto._parsePrefixedOffset = function _parsePrefixedOffset(context, text, prefixPos, position) {
    var prefix = text.substring(prefixPos, position).toUpperCase();
    var newContext = context.copy();

    if (position < text.length && context.charEquals(text.charAt(position), 'Z')) {
      context.setParsedZone(ZoneId.ofOffset(prefix, ZoneOffset.UTC));
      return position;
    }

    var endPos = OffsetIdPrinterParser.INSTANCE_ID.parse(newContext, text, position);

    if (endPos < 0) {
      context.setParsedZone(ZoneId.ofOffset(prefix, ZoneOffset.UTC));
      return position;
    }

    var offsetSecs = newContext.getParsed(ChronoField.OFFSET_SECONDS);
    var offset = ZoneOffset.ofTotalSeconds(offsetSecs);
    context.setParsedZone(ZoneId.ofOffset(prefix, offset));
    return endPos;
  };

  _proto.toString = function toString() {
    return this.description;
  };

  return ZoneIdPrinterParser;
}();

var ZoneIdTree = function () {
  ZoneIdTree.createTreeMap = function createTreeMap(availableZoneIds) {
    var sortedZoneIds = availableZoneIds.sort(function (a, b) {
      return a.length - b.length;
    });
    var treeMap = new ZoneIdTreeMap(sortedZoneIds[0].length, false);

    for (var i = 0; i < sortedZoneIds.length; i++) {
      treeMap.add(sortedZoneIds[i]);
    }

    return new ZoneIdTree(sortedZoneIds.length, treeMap);
  };

  function ZoneIdTree(size, treeMap) {
    this.size = size;
    this.treeMap = treeMap;
  }

  return ZoneIdTree;
}();

var ZoneIdTreeMap = function () {
  function ZoneIdTreeMap(length, isLeaf) {
    if (length === void 0) {
      length = 0;
    }

    if (isLeaf === void 0) {
      isLeaf = false;
    }

    this.length = length;
    this.isLeaf = isLeaf;
    this._treeMap = {};
  }

  var _proto2 = ZoneIdTreeMap.prototype;

  _proto2.add = function add(zoneId) {
    var idLength = zoneId.length;

    if (idLength === this.length) {
      this._treeMap[zoneId] = new ZoneIdTreeMap(idLength, true);
    } else if (idLength > this.length) {
      var subZoneId = zoneId.substr(0, this.length);
      var subTreeMap = this._treeMap[subZoneId];

      if (subTreeMap == null) {
        subTreeMap = new ZoneIdTreeMap(idLength, false);
        this._treeMap[subZoneId] = subTreeMap;
      }

      subTreeMap.add(zoneId);
    }
  };

  _proto2.get = function get(zoneId) {
    return this._treeMap[zoneId];
  };

  return ZoneIdTreeMap;
}();

var zoneIdTree = new ZoneIdTree([]);

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var MAX_WIDTH = 15;
var DateTimeFormatterBuilder = function () {
  function DateTimeFormatterBuilder() {
    this._active = this;
    this._parent = null;
    this._printerParsers = [];
    this._optional = false;
    this._padNextWidth = 0;
    this._padNextChar = null;
    this._valueParserIndex = -1;
  }

  DateTimeFormatterBuilder._of = function _of(parent, optional) {
    requireNonNull(parent, 'parent');
    requireNonNull(optional, 'optional');
    var dtFormatterBuilder = new DateTimeFormatterBuilder();
    dtFormatterBuilder._parent = parent;
    dtFormatterBuilder._optional = optional;
    return dtFormatterBuilder;
  };

  var _proto = DateTimeFormatterBuilder.prototype;

  _proto.parseCaseSensitive = function parseCaseSensitive() {
    this._appendInternalPrinterParser(SettingsParser.SENSITIVE);

    return this;
  };

  _proto.parseCaseInsensitive = function parseCaseInsensitive() {
    this._appendInternalPrinterParser(SettingsParser.INSENSITIVE);

    return this;
  };

  _proto.parseStrict = function parseStrict() {
    this._appendInternalPrinterParser(SettingsParser.STRICT);

    return this;
  };

  _proto.parseLenient = function parseLenient() {
    this._appendInternalPrinterParser(SettingsParser.LENIENT);

    return this;
  };

  _proto.appendValue = function appendValue() {
    if (arguments.length === 1) {
      return this._appendValue1.apply(this, arguments);
    } else if (arguments.length === 2) {
      return this._appendValue2.apply(this, arguments);
    } else {
      return this._appendValue4.apply(this, arguments);
    }
  };

  _proto._appendValue1 = function _appendValue1(field) {
    requireNonNull(field);

    this._appendValuePrinterParser(new NumberPrinterParser(field, 1, MAX_WIDTH, SignStyle.NORMAL));

    return this;
  };

  _proto._appendValue2 = function _appendValue2(field, width) {
    requireNonNull(field);

    if (width < 1 || width > MAX_WIDTH) {
      throw new IllegalArgumentException("The width must be from 1 to " + MAX_WIDTH + " inclusive but was " + width);
    }

    var pp = new NumberPrinterParser(field, width, width, SignStyle.NOT_NEGATIVE);

    this._appendValuePrinterParser(pp);

    return this;
  };

  _proto._appendValue4 = function _appendValue4(field, minWidth, maxWidth, signStyle) {
    requireNonNull(field);
    requireNonNull(signStyle);

    if (minWidth === maxWidth && signStyle === SignStyle.NOT_NEGATIVE) {
      return this._appendValue2(field, maxWidth);
    }

    if (minWidth < 1 || minWidth > MAX_WIDTH) {
      throw new IllegalArgumentException("The minimum width must be from 1 to " + MAX_WIDTH + " inclusive but was " + minWidth);
    }

    if (maxWidth < 1 || maxWidth > MAX_WIDTH) {
      throw new IllegalArgumentException("The minimum width must be from 1 to " + MAX_WIDTH + " inclusive but was " + maxWidth);
    }

    if (maxWidth < minWidth) {
      throw new IllegalArgumentException("The maximum width must exceed or equal the minimum width but " + maxWidth + " < " + minWidth);
    }

    var pp = new NumberPrinterParser(field, minWidth, maxWidth, signStyle);

    this._appendValuePrinterParser(pp);

    return this;
  };

  _proto.appendValueReduced = function appendValueReduced() {
    if (arguments.length === 4 && arguments[3] instanceof ChronoLocalDate) {
      return this._appendValueReducedFieldWidthMaxWidthBaseDate.apply(this, arguments);
    } else {
      return this._appendValueReducedFieldWidthMaxWidthBaseValue.apply(this, arguments);
    }
  };

  _proto._appendValueReducedFieldWidthMaxWidthBaseValue = function _appendValueReducedFieldWidthMaxWidthBaseValue(field, width, maxWidth, baseValue) {
    requireNonNull(field, 'field');
    var pp = new ReducedPrinterParser(field, width, maxWidth, baseValue, null);

    this._appendValuePrinterParser(pp);

    return this;
  };

  _proto._appendValueReducedFieldWidthMaxWidthBaseDate = function _appendValueReducedFieldWidthMaxWidthBaseDate(field, width, maxWidth, baseDate) {
    requireNonNull(field, 'field');
    requireNonNull(baseDate, 'baseDate');
    requireInstance(baseDate, ChronoLocalDate, 'baseDate');
    var pp = new ReducedPrinterParser(field, width, maxWidth, 0, baseDate);

    this._appendValuePrinterParser(pp);

    return this;
  };

  _proto._appendValuePrinterParser = function _appendValuePrinterParser(pp) {
    assert(pp != null);

    if (this._active._valueParserIndex >= 0 && this._active._printerParsers[this._active._valueParserIndex] instanceof NumberPrinterParser) {
      var activeValueParser = this._active._valueParserIndex;
      var basePP = this._active._printerParsers[activeValueParser];

      if (pp.minWidth() === pp.maxWidth() && pp.signStyle() === SignStyle.NOT_NEGATIVE) {
        basePP = basePP.withSubsequentWidth(pp.maxWidth());

        this._appendInternal(pp.withFixedWidth());

        this._active._valueParserIndex = activeValueParser;
      } else {
        basePP = basePP.withFixedWidth();
        this._active._valueParserIndex = this._appendInternal(pp);
      }

      this._active._printerParsers[activeValueParser] = basePP;
    } else {
      this._active._valueParserIndex = this._appendInternal(pp);
    }

    return this;
  };

  _proto.appendFraction = function appendFraction(field, minWidth, maxWidth, decimalPoint) {
    this._appendInternal(new FractionPrinterParser(field, minWidth, maxWidth, decimalPoint));

    return this;
  };

  _proto.appendInstant = function appendInstant(fractionalDigits) {
    if (fractionalDigits === void 0) {
      fractionalDigits = -2;
    }

    if (fractionalDigits < -2 || fractionalDigits > 9) {
      throw new IllegalArgumentException("Invalid fractional digits: " + fractionalDigits);
    }

    this._appendInternal(new InstantPrinterParser(fractionalDigits));

    return this;
  };

  _proto.appendOffsetId = function appendOffsetId() {
    this._appendInternal(OffsetIdPrinterParser.INSTANCE_ID);

    return this;
  };

  _proto.appendOffset = function appendOffset(pattern, noOffsetText) {
    this._appendInternalPrinterParser(new OffsetIdPrinterParser(noOffsetText, pattern));

    return this;
  };

  _proto.appendZoneId = function appendZoneId() {
    this._appendInternal(new ZoneIdPrinterParser(TemporalQueries.zoneId(), 'ZoneId()'));

    return this;
  };

  _proto.appendPattern = function appendPattern(pattern) {
    requireNonNull(pattern, 'pattern');

    this._parsePattern(pattern);

    return this;
  };

  _proto.appendZoneText = function appendZoneText() {
    throw new IllegalArgumentException('Pattern using (localized) text not implemented, use @js-joda/locale plugin!');
  };

  _proto.appendText = function appendText() {
    throw new IllegalArgumentException('Pattern using (localized) text not implemented, use @js-joda/locale plugin!');
  };

  _proto.appendLocalizedOffset = function appendLocalizedOffset() {
    throw new IllegalArgumentException('Pattern using (localized) text not implemented, use @js-joda/locale plugin!');
  };

  _proto.appendWeekField = function appendWeekField() {
    throw new IllegalArgumentException('Pattern using (localized) text not implemented, use @js-joda/locale plugin!');
  };

  _proto._parsePattern = function _parsePattern(pattern) {
    var FIELD_MAP = {
      'G': ChronoField.ERA,
      'y': ChronoField.YEAR_OF_ERA,
      'u': ChronoField.YEAR,
      'Q': IsoFields.QUARTER_OF_YEAR,
      'q': IsoFields.QUARTER_OF_YEAR,
      'M': ChronoField.MONTH_OF_YEAR,
      'L': ChronoField.MONTH_OF_YEAR,
      'D': ChronoField.DAY_OF_YEAR,
      'd': ChronoField.DAY_OF_MONTH,
      'F': ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH,
      'E': ChronoField.DAY_OF_WEEK,
      'c': ChronoField.DAY_OF_WEEK,
      'e': ChronoField.DAY_OF_WEEK,
      'a': ChronoField.AMPM_OF_DAY,
      'H': ChronoField.HOUR_OF_DAY,
      'k': ChronoField.CLOCK_HOUR_OF_DAY,
      'K': ChronoField.HOUR_OF_AMPM,
      'h': ChronoField.CLOCK_HOUR_OF_AMPM,
      'm': ChronoField.MINUTE_OF_HOUR,
      's': ChronoField.SECOND_OF_MINUTE,
      'S': ChronoField.NANO_OF_SECOND,
      'A': ChronoField.MILLI_OF_DAY,
      'n': ChronoField.NANO_OF_SECOND,
      'N': ChronoField.NANO_OF_DAY
    };

    for (var pos = 0; pos < pattern.length; pos++) {
      var cur = pattern.charAt(pos);

      if (cur >= 'A' && cur <= 'Z' || cur >= 'a' && cur <= 'z') {
        var start = pos++;

        for (; pos < pattern.length && pattern.charAt(pos) === cur; pos++) {
        }

        var count = pos - start;

        if (cur === 'p') {
          var pad = 0;

          if (pos < pattern.length) {
            cur = pattern.charAt(pos);

            if (cur >= 'A' && cur <= 'Z' || cur >= 'a' && cur <= 'z') {
              pad = count;
              start = pos++;

              for (; pos < pattern.length && pattern.charAt(pos) === cur; pos++) {
              }

              count = pos - start;
            }
          }

          if (pad === 0) {
            throw new IllegalArgumentException("Pad letter 'p' must be followed by valid pad pattern: " + pattern);
          }

          this.padNext(pad);
        }

        var field = FIELD_MAP[cur];

        if (field != null) {
          this._parseField(cur, count, field);
        } else if (cur === 'z') {
          if (count > 4) {
            throw new IllegalArgumentException("Too many pattern letters: " + cur);
          } else if (count === 4) {
            this.appendZoneText(TextStyle.FULL);
          } else {
            this.appendZoneText(TextStyle.SHORT);
          }
        } else if (cur === 'V') {
          if (count !== 2) {
            throw new IllegalArgumentException("Pattern letter count must be 2: " + cur);
          }

          this.appendZoneId();
        } else if (cur === 'Z') {
          if (count < 4) {
            this.appendOffset('+HHMM', '+0000');
          } else if (count === 4) {
            this.appendLocalizedOffset(TextStyle.FULL);
          } else if (count === 5) {
            this.appendOffset('+HH:MM:ss', 'Z');
          } else {
            throw new IllegalArgumentException("Too many pattern letters: " + cur);
          }
        } else if (cur === 'O') {
          if (count === 1) {
            this.appendLocalizedOffset(TextStyle.SHORT);
          } else if (count === 4) {
            this.appendLocalizedOffset(TextStyle.FULL);
          } else {
            throw new IllegalArgumentException("Pattern letter count must be 1 or 4: " + cur);
          }
        } else if (cur === 'X') {
          if (count > 5) {
            throw new IllegalArgumentException("Too many pattern letters: " + cur);
          }

          this.appendOffset(OffsetIdPrinterParser.PATTERNS[count + (count === 1 ? 0 : 1)], 'Z');
        } else if (cur === 'x') {
          if (count > 5) {
            throw new IllegalArgumentException("Too many pattern letters: " + cur);
          }

          var zero = count === 1 ? '+00' : count % 2 === 0 ? '+0000' : '+00:00';
          this.appendOffset(OffsetIdPrinterParser.PATTERNS[count + (count === 1 ? 0 : 1)], zero);
        } else if (cur === 'W') {
          if (count > 1) {
            throw new IllegalArgumentException("Too many pattern letters: " + cur);
          }

          this.appendWeekField('W', count);
        } else if (cur === 'w') {
          if (count > 2) {
            throw new IllegalArgumentException("Too many pattern letters: " + cur);
          }

          this.appendWeekField('w', count);
        } else if (cur === 'Y') {
          this.appendWeekField('Y', count);
        } else {
          throw new IllegalArgumentException("Unknown pattern letter: " + cur);
        }

        pos--;
      } else if (cur === '\'') {
        var _start = pos++;

        for (; pos < pattern.length; pos++) {
          if (pattern.charAt(pos) === '\'') {
            if (pos + 1 < pattern.length && pattern.charAt(pos + 1) === '\'') {
              pos++;
            } else {
              break;
            }
          }
        }

        if (pos >= pattern.length) {
          throw new IllegalArgumentException("Pattern ends with an incomplete string literal: " + pattern);
        }

        var str = pattern.substring(_start + 1, pos);

        if (str.length === 0) {
          this.appendLiteral('\'');
        } else {
          this.appendLiteral(str.replace('\'\'', '\''));
        }
      } else if (cur === '[') {
        this.optionalStart();
      } else if (cur === ']') {
        if (this._active._parent === null) {
          throw new IllegalArgumentException('Pattern invalid as it contains ] without previous [');
        }

        this.optionalEnd();
      } else if (cur === '{' || cur === '}' || cur === '#') {
        throw new IllegalArgumentException("Pattern includes reserved character: '" + cur + "'");
      } else {
        this.appendLiteral(cur);
      }
    }
  };

  _proto._parseField = function _parseField(cur, count, field) {
    switch (cur) {
      case 'u':
      case 'y':
        if (count === 2) {
          this.appendValueReduced(field, 2, 2, ReducedPrinterParser.BASE_DATE);
        } else if (count < 4) {
          this.appendValue(field, count, MAX_WIDTH, SignStyle.NORMAL);
        } else {
          this.appendValue(field, count, MAX_WIDTH, SignStyle.EXCEEDS_PAD);
        }

        break;

      case 'M':
      case 'Q':
        switch (count) {
          case 1:
            this.appendValue(field);
            break;

          case 2:
            this.appendValue(field, 2);
            break;

          case 3:
            this.appendText(field, TextStyle.SHORT);
            break;

          case 4:
            this.appendText(field, TextStyle.FULL);
            break;

          case 5:
            this.appendText(field, TextStyle.NARROW);
            break;

          default:
            throw new IllegalArgumentException("Too many pattern letters: " + cur);
        }

        break;

      case 'L':
      case 'q':
        switch (count) {
          case 1:
            this.appendValue(field);
            break;

          case 2:
            this.appendValue(field, 2);
            break;

          case 3:
            this.appendText(field, TextStyle.SHORT_STANDALONE);
            break;

          case 4:
            this.appendText(field, TextStyle.FULL_STANDALONE);
            break;

          case 5:
            this.appendText(field, TextStyle.NARROW_STANDALONE);
            break;

          default:
            throw new IllegalArgumentException("Too many pattern letters: " + cur);
        }

        break;

      case 'e':
        switch (count) {
          case 1:
          case 2:
            this.appendWeekField('e', count);
            break;

          case 3:
            this.appendText(field, TextStyle.SHORT);
            break;

          case 4:
            this.appendText(field, TextStyle.FULL);
            break;

          case 5:
            this.appendText(field, TextStyle.NARROW);
            break;

          default:
            throw new IllegalArgumentException("Too many pattern letters: " + cur);
        }

        break;

      case 'c':
        switch (count) {
          case 1:
            this.appendWeekField('c', count);
            break;

          case 2:
            throw new IllegalArgumentException("Invalid number of pattern letters: " + cur);

          case 3:
            this.appendText(field, TextStyle.SHORT_STANDALONE);
            break;

          case 4:
            this.appendText(field, TextStyle.FULL_STANDALONE);
            break;

          case 5:
            this.appendText(field, TextStyle.NARROW_STANDALONE);
            break;

          default:
            throw new IllegalArgumentException("Too many pattern letters: " + cur);
        }

        break;

      case 'a':
        if (count === 1) {
          this.appendText(field, TextStyle.SHORT);
        } else {
          throw new IllegalArgumentException("Too many pattern letters: " + cur);
        }

        break;

      case 'E':
      case 'G':
        switch (count) {
          case 1:
          case 2:
          case 3:
            this.appendText(field, TextStyle.SHORT);
            break;

          case 4:
            this.appendText(field, TextStyle.FULL);
            break;

          case 5:
            this.appendText(field, TextStyle.NARROW);
            break;

          default:
            throw new IllegalArgumentException("Too many pattern letters: " + cur);
        }

        break;

      case 'S':
        this.appendFraction(ChronoField.NANO_OF_SECOND, count, count, false);
        break;

      case 'F':
        if (count === 1) {
          this.appendValue(field);
        } else {
          throw new IllegalArgumentException("Too many pattern letters: " + cur);
        }

        break;

      case 'd':
      case 'h':
      case 'H':
      case 'k':
      case 'K':
      case 'm':
      case 's':
        if (count === 1) {
          this.appendValue(field);
        } else if (count === 2) {
          this.appendValue(field, count);
        } else {
          throw new IllegalArgumentException("Too many pattern letters: " + cur);
        }

        break;

      case 'D':
        if (count === 1) {
          this.appendValue(field);
        } else if (count <= 3) {
          this.appendValue(field, count);
        } else {
          throw new IllegalArgumentException("Too many pattern letters: " + cur);
        }

        break;

      default:
        if (count === 1) {
          this.appendValue(field);
        } else {
          this.appendValue(field, count);
        }

        break;
    }
  };

  _proto.padNext = function padNext() {
    if (arguments.length === 1) {
      return this._padNext1.apply(this, arguments);
    } else {
      return this._padNext2.apply(this, arguments);
    }
  };

  _proto._padNext1 = function _padNext1(padWidth) {
    return this._padNext2(padWidth, ' ');
  };

  _proto._padNext2 = function _padNext2(padWidth, padChar) {
    if (padWidth < 1) {
      throw new IllegalArgumentException("The pad width must be at least one but was " + padWidth);
    }

    this._active._padNextWidth = padWidth;
    this._active._padNextChar = padChar;
    this._active._valueParserIndex = -1;
    return this;
  };

  _proto.optionalStart = function optionalStart() {
    this._active._valueParserIndex = -1;
    this._active = DateTimeFormatterBuilder._of(this._active, true);
    return this;
  };

  _proto.optionalEnd = function optionalEnd() {
    if (this._active._parent == null) {
      throw new IllegalStateException('Cannot call optionalEnd() as there was no previous call to optionalStart()');
    }

    if (this._active._printerParsers.length > 0) {
      var cpp = new CompositePrinterParser(this._active._printerParsers, this._active._optional);
      this._active = this._active._parent;

      this._appendInternal(cpp);
    } else {
      this._active = this._active._parent;
    }

    return this;
  };

  _proto._appendInternal = function _appendInternal(pp) {
    assert(pp != null);

    if (this._active._padNextWidth > 0) {
      if (pp != null) {
        pp = new PadPrinterParserDecorator(pp, this._active._padNextWidth, this._active._padNextChar);
      }

      this._active._padNextWidth = 0;
      this._active._padNextChar = 0;
    }

    this._active._printerParsers.push(pp);

    this._active._valueParserIndex = -1;
    return this._active._printerParsers.length - 1;
  };

  _proto.appendLiteral = function appendLiteral(literal) {
    assert(literal != null);

    if (literal.length > 0) {
      if (literal.length === 1) {
        this._appendInternalPrinterParser(new CharLiteralPrinterParser(literal.charAt(0)));
      } else {
        this._appendInternalPrinterParser(new StringLiteralPrinterParser(literal));
      }
    }

    return this;
  };

  _proto._appendInternalPrinterParser = function _appendInternalPrinterParser(pp) {
    assert(pp != null);

    if (this._active._padNextWidth > 0) {
      if (pp != null) {
        pp = new PadPrinterParserDecorator(pp, this._active._padNextWidth, this._active._padNextChar);
      }

      this._active._padNextWidth = 0;
      this._active._padNextChar = 0;
    }

    this._active._printerParsers.push(pp);

    this._active._valueParserIndex = -1;
    return this._active._printerParsers.length - 1;
  };

  _proto.append = function append(formatter) {
    requireNonNull(formatter, 'formatter');

    this._appendInternal(formatter._toPrinterParser(false));

    return this;
  };

  _proto.toFormatter = function toFormatter(resolverStyle) {
    if (resolverStyle === void 0) {
      resolverStyle = ResolverStyle.SMART;
    }

    while (this._active._parent != null) {
      this.optionalEnd();
    }

    var pp = new CompositePrinterParser(this._printerParsers, false);
    return new DateTimeFormatter(pp, null, DecimalStyle.STANDARD, resolverStyle, null, null, null);
  };

  return DateTimeFormatterBuilder;
}();
var SECONDS_PER_10000_YEARS = 146097 * 25 * 86400;
var SECONDS_0000_TO_1970 = (146097 * 5 - (30 * 365 + 7)) * 86400;

var InstantPrinterParser = function () {
  function InstantPrinterParser(fractionalDigits) {
    this.fractionalDigits = fractionalDigits;
  }

  var _proto2 = InstantPrinterParser.prototype;

  _proto2.print = function print(context, buf) {
    var inSecs = context.getValue(ChronoField.INSTANT_SECONDS);
    var inNanos = 0;

    if (context.temporal().isSupported(ChronoField.NANO_OF_SECOND)) {
      inNanos = context.temporal().getLong(ChronoField.NANO_OF_SECOND);
    }

    if (inSecs == null) {
      return false;
    }

    var inSec = inSecs;
    var inNano = ChronoField.NANO_OF_SECOND.checkValidIntValue(inNanos);

    if (inSec >= -SECONDS_0000_TO_1970) {
      var zeroSecs = inSec - SECONDS_PER_10000_YEARS + SECONDS_0000_TO_1970;
      var hi = MathUtil.floorDiv(zeroSecs, SECONDS_PER_10000_YEARS) + 1;
      var lo = MathUtil.floorMod(zeroSecs, SECONDS_PER_10000_YEARS);
      var ldt = LocalDateTime.ofEpochSecond(lo - SECONDS_0000_TO_1970, 0, ZoneOffset.UTC);

      if (hi > 0) {
        buf.append('+').append(hi);
      }

      buf.append(ldt.toString());

      if (ldt.second() === 0) {
        buf.append(':00');
      }
    } else {
      var _zeroSecs = inSec + SECONDS_0000_TO_1970;

      var _hi = MathUtil.intDiv(_zeroSecs, SECONDS_PER_10000_YEARS);

      var _lo = MathUtil.intMod(_zeroSecs, SECONDS_PER_10000_YEARS);

      var _ldt = LocalDateTime.ofEpochSecond(_lo - SECONDS_0000_TO_1970, 0, ZoneOffset.UTC);

      var pos = buf.length();
      buf.append(_ldt.toString());

      if (_ldt.second() === 0) {
        buf.append(':00');
      }

      if (_hi < 0) {
        if (_ldt.year() === -10000) {
          buf.replace(pos, pos + 2, "" + (_hi - 1));
        } else if (_lo === 0) {
          buf.insert(pos, _hi);
        } else {
          buf.insert(pos + 1, Math.abs(_hi));
        }
      }
    }

    if (this.fractionalDigits === -2) {
      if (inNano !== 0) {
        buf.append('.');

        if (MathUtil.intMod(inNano, 1000000) === 0) {
          buf.append(("" + (MathUtil.intDiv(inNano, 1000000) + 1000)).substring(1));
        } else if (MathUtil.intMod(inNano, 1000) === 0) {
          buf.append(("" + (MathUtil.intDiv(inNano, 1000) + 1000000)).substring(1));
        } else {
          buf.append(("" + (inNano + 1000000000)).substring(1));
        }
      }
    } else if (this.fractionalDigits > 0 || this.fractionalDigits === -1 && inNano > 0) {
      buf.append('.');
      var div = 100000000;

      for (var i = 0; this.fractionalDigits === -1 && inNano > 0 || i < this.fractionalDigits; i++) {
        var digit = MathUtil.intDiv(inNano, div);
        buf.append(digit);
        inNano = inNano - digit * div;
        div = MathUtil.intDiv(div, 10);
      }
    }

    buf.append('Z');
    return true;
  };

  _proto2.parse = function parse(context, text, position) {
    var newContext = context.copy();
    var minDigits = this.fractionalDigits < 0 ? 0 : this.fractionalDigits;
    var maxDigits = this.fractionalDigits < 0 ? 9 : this.fractionalDigits;

    var parser = new DateTimeFormatterBuilder().append(DateTimeFormatter.ISO_LOCAL_DATE).appendLiteral('T').appendValue(ChronoField.HOUR_OF_DAY, 2).appendLiteral(':').appendValue(ChronoField.MINUTE_OF_HOUR, 2).appendLiteral(':').appendValue(ChronoField.SECOND_OF_MINUTE, 2).appendFraction(ChronoField.NANO_OF_SECOND, minDigits, maxDigits, true).appendLiteral('Z').toFormatter()._toPrinterParser(false);

    var pos = parser.parse(newContext, text, position);

    if (pos < 0) {
      return pos;
    }

    var yearParsed = newContext.getParsed(ChronoField.YEAR);
    var month = newContext.getParsed(ChronoField.MONTH_OF_YEAR);
    var day = newContext.getParsed(ChronoField.DAY_OF_MONTH);
    var hour = newContext.getParsed(ChronoField.HOUR_OF_DAY);
    var min = newContext.getParsed(ChronoField.MINUTE_OF_HOUR);
    var secVal = newContext.getParsed(ChronoField.SECOND_OF_MINUTE);
    var nanoVal = newContext.getParsed(ChronoField.NANO_OF_SECOND);
    var sec = secVal != null ? secVal : 0;
    var nano = nanoVal != null ? nanoVal : 0;
    var year = MathUtil.intMod(yearParsed, 10000);
    var days = 0;

    if (hour === 24 && min === 0 && sec === 0 && nano === 0) {
      hour = 0;
      days = 1;
    } else if (hour === 23 && min === 59 && sec === 60) {
      context.setParsedLeapSecond();
      sec = 59;
    }

    var instantSecs;

    try {
      var ldt = LocalDateTime.of(year, month, day, hour, min, sec, 0).plusDays(days);
      instantSecs = ldt.toEpochSecond(ZoneOffset.UTC);
      instantSecs += MathUtil.safeMultiply(MathUtil.intDiv(yearParsed, 10000), SECONDS_PER_10000_YEARS);
    } catch (ex) {
      return ~position;
    }

    var successPos = pos;
    successPos = context.setParsedField(ChronoField.INSTANT_SECONDS, instantSecs, position, successPos);
    return context.setParsedField(ChronoField.NANO_OF_SECOND, nano, position, successPos);
  };

  _proto2.toString = function toString() {
    return 'Instant()';
  };

  return InstantPrinterParser;
}();

function _init$e() {
  ReducedPrinterParser.BASE_DATE = LocalDate.of(2000, 1, 1);
  DateTimeFormatterBuilder.CompositePrinterParser = CompositePrinterParser;
  DateTimeFormatterBuilder.PadPrinterParserDecorator = PadPrinterParserDecorator;
  DateTimeFormatterBuilder.SettingsParser = SettingsParser;
  DateTimeFormatterBuilder.CharLiteralPrinterParser = StringLiteralPrinterParser;
  DateTimeFormatterBuilder.StringLiteralPrinterParser = StringLiteralPrinterParser;
  DateTimeFormatterBuilder.CharLiteralPrinterParser = CharLiteralPrinterParser;
  DateTimeFormatterBuilder.NumberPrinterParser = NumberPrinterParser;
  DateTimeFormatterBuilder.ReducedPrinterParser = ReducedPrinterParser;
  DateTimeFormatterBuilder.FractionPrinterParser = FractionPrinterParser;
  DateTimeFormatterBuilder.OffsetIdPrinterParser = OffsetIdPrinterParser;
  DateTimeFormatterBuilder.ZoneIdPrinterParser = ZoneIdPrinterParser;
}

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var StringBuilder = function () {
  function StringBuilder() {
    this._str = '';
  }

  var _proto = StringBuilder.prototype;

  _proto.append = function append(str) {
    this._str += str;
    return this;
  };

  _proto.appendChar = function appendChar(str) {
    this._str += str[0];
    return this;
  };

  _proto.insert = function insert(offset, str) {
    this._str = this._str.slice(0, offset) + str + this._str.slice(offset);
    return this;
  };

  _proto.replace = function replace(start, end, str) {
    this._str = this._str.slice(0, start) + str + this._str.slice(end);
    return this;
  };

  _proto.length = function length() {
    return this._str.length;
  };

  _proto.setLength = function setLength(length) {
    this._str = this._str.slice(0, length);
    return this;
  };

  _proto.toString = function toString() {
    return this._str;
  };

  return StringBuilder;
}();

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var DateTimeFormatter = function () {
  DateTimeFormatter.parsedExcessDays = function parsedExcessDays() {
    return DateTimeFormatter.PARSED_EXCESS_DAYS;
  };

  DateTimeFormatter.parsedLeapSecond = function parsedLeapSecond() {
    return DateTimeFormatter.PARSED_LEAP_SECOND;
  };

  DateTimeFormatter.ofPattern = function ofPattern(pattern) {
    return new DateTimeFormatterBuilder().appendPattern(pattern).toFormatter();
  };

  function DateTimeFormatter(printerParser, locale, decimalStyle, resolverStyle, resolverFields, chrono, zone) {
    if (chrono === void 0) {
      chrono = IsoChronology.INSTANCE;
    }

    assert(printerParser != null);
    assert(decimalStyle != null);
    assert(resolverStyle != null);
    this._printerParser = printerParser;
    this._locale = locale;
    this._decimalStyle = decimalStyle;
    this._resolverStyle = resolverStyle;
    this._resolverFields = resolverFields;
    this._chrono = chrono;
    this._zone = zone;
  }

  var _proto = DateTimeFormatter.prototype;

  _proto.locale = function locale() {
    return this._locale;
  };

  _proto.decimalStyle = function decimalStyle() {
    return this._decimalStyle;
  };

  _proto.chronology = function chronology() {
    return this._chrono;
  };

  _proto.withChronology = function withChronology(chrono) {
    if (this._chrono != null && this._chrono.equals(chrono)) {
      return this;
    }

    return new DateTimeFormatter(this._printerParser, this._locale, this._decimalStyle, this._resolverStyle, this._resolverFields, chrono, this._zone);
  };

  _proto.withLocale = function withLocale() {
    return this;
  };

  _proto.withResolverStyle = function withResolverStyle(resolverStyle) {
    requireNonNull(resolverStyle, 'resolverStyle');

    if (resolverStyle.equals(this._resolverStyle)) {
      return this;
    }

    return new DateTimeFormatter(this._printerParser, this._locale, this._decimalStyle, resolverStyle, this._resolverFields, this._chrono, this._zone);
  };

  _proto.format = function format(temporal) {
    var buf = new StringBuilder(32);

    this._formatTo(temporal, buf);

    return buf.toString();
  };

  _proto._formatTo = function _formatTo(temporal, appendable) {
    requireNonNull(temporal, 'temporal');
    requireNonNull(appendable, 'appendable');
    var context = new DateTimePrintContext(temporal, this);

    this._printerParser.print(context, appendable);
  };

  _proto.parse = function parse(text, type) {
    if (arguments.length === 1) {
      return this.parse1(text);
    } else {
      return this.parse2(text, type);
    }
  };

  _proto.parse1 = function parse1(text) {
    requireNonNull(text, 'text');

    try {
      return this._parseToBuilder(text, null).resolve(this._resolverStyle, this._resolverFields);
    } catch (ex) {
      if (ex instanceof DateTimeParseException) {
        throw ex;
      } else {
        throw this._createError(text, ex);
      }
    }
  };

  _proto.parse2 = function parse2(text, type) {
    requireNonNull(text, 'text');
    requireNonNull(type, 'type');

    try {
      var builder = this._parseToBuilder(text, null).resolve(this._resolverStyle, this._resolverFields);

      return builder.build(type);
    } catch (ex) {
      if (ex instanceof DateTimeParseException) {
        throw ex;
      } else {
        throw this._createError(text, ex);
      }
    }
  };

  _proto._createError = function _createError(text, ex) {
    var abbr = '';

    if (text.length > 64) {
      abbr = text.substring(0, 64) + "...";
    } else {
      abbr = text;
    }

    return new DateTimeParseException("Text '" + abbr + "' could not be parsed: " + ex.message, text, 0, ex);
  };

  _proto._parseToBuilder = function _parseToBuilder(text, position) {
    var pos = position != null ? position : new ParsePosition(0);

    var result = this._parseUnresolved0(text, pos);

    if (result == null || pos.getErrorIndex() >= 0 || position == null && pos.getIndex() < text.length) {
      var abbr = '';

      if (text.length > 64) {
        abbr = text.substr(0, 64).toString() + "...";
      } else {
        abbr = text;
      }

      if (pos.getErrorIndex() >= 0) {
        throw new DateTimeParseException("Text '" + abbr + "' could not be parsed at index " + pos.getErrorIndex(), text, pos.getErrorIndex());
      } else {
        throw new DateTimeParseException("Text '" + abbr + "' could not be parsed, unparsed text found at index " + pos.getIndex(), text, pos.getIndex());
      }
    }

    return result.toBuilder();
  };

  _proto.parseUnresolved = function parseUnresolved(text, position) {
    return this._parseUnresolved0(text, position);
  };

  _proto._parseUnresolved0 = function _parseUnresolved0(text, position) {
    assert(text != null, 'text', NullPointerException);
    assert(position != null, 'position', NullPointerException);
    var context = new DateTimeParseContext(this);
    var pos = position.getIndex();
    pos = this._printerParser.parse(context, text, pos);

    if (pos < 0) {
      position.setErrorIndex(~pos);
      return null;
    }

    position.setIndex(pos);
    return context.toParsed();
  };

  _proto._toPrinterParser = function _toPrinterParser(optional) {
    return this._printerParser.withOptional(optional);
  };

  _proto.toString = function toString() {
    var pattern = this._printerParser.toString();

    return pattern.indexOf('[') === 0 ? pattern : pattern.substring(1, pattern.length - 1);
  };

  return DateTimeFormatter;
}();
function _init$d() {
  DateTimeFormatter.ISO_LOCAL_DATE = new DateTimeFormatterBuilder().appendValue(ChronoField.YEAR, 4, 10, SignStyle.EXCEEDS_PAD).appendLiteral('-').appendValue(ChronoField.MONTH_OF_YEAR, 2).appendLiteral('-').appendValue(ChronoField.DAY_OF_MONTH, 2).toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
  DateTimeFormatter.ISO_LOCAL_TIME = new DateTimeFormatterBuilder().appendValue(ChronoField.HOUR_OF_DAY, 2).appendLiteral(':').appendValue(ChronoField.MINUTE_OF_HOUR, 2).optionalStart().appendLiteral(':').appendValue(ChronoField.SECOND_OF_MINUTE, 2).optionalStart().appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true).toFormatter(ResolverStyle.STRICT);
  DateTimeFormatter.ISO_LOCAL_DATE_TIME = new DateTimeFormatterBuilder().parseCaseInsensitive().append(DateTimeFormatter.ISO_LOCAL_DATE).appendLiteral('T').append(DateTimeFormatter.ISO_LOCAL_TIME).toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
  DateTimeFormatter.ISO_INSTANT = new DateTimeFormatterBuilder().parseCaseInsensitive().appendInstant().toFormatter(ResolverStyle.STRICT);
  DateTimeFormatter.ISO_OFFSET_DATE_TIME = new DateTimeFormatterBuilder().parseCaseInsensitive().append(DateTimeFormatter.ISO_LOCAL_DATE_TIME).appendOffsetId().toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
  DateTimeFormatter.ISO_ZONED_DATE_TIME = new DateTimeFormatterBuilder().append(DateTimeFormatter.ISO_OFFSET_DATE_TIME).optionalStart().appendLiteral('[').parseCaseSensitive().appendZoneId().appendLiteral(']').toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
  DateTimeFormatter.BASIC_ISO_DATE = new DateTimeFormatterBuilder().appendValue(ChronoField.YEAR, 4, 10, SignStyle.EXCEEDS_PAD).appendValue(ChronoField.MONTH_OF_YEAR, 2).appendValue(ChronoField.DAY_OF_MONTH, 2).toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
  DateTimeFormatter.ISO_OFFSET_DATE = new DateTimeFormatterBuilder().parseCaseInsensitive().append(DateTimeFormatter.ISO_LOCAL_DATE).appendOffsetId().toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
  DateTimeFormatter.ISO_OFFSET_TIME = new DateTimeFormatterBuilder().parseCaseInsensitive().append(DateTimeFormatter.ISO_LOCAL_TIME).appendOffsetId().toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
  DateTimeFormatter.ISO_ORDINAL_DATE = new DateTimeFormatterBuilder().appendValue(ChronoField.YEAR, 4, 10, SignStyle.EXCEEDS_PAD).appendLiteral('-').appendValue(ChronoField.DAY_OF_YEAR).toFormatter(ResolverStyle.STRICT);
  DateTimeFormatter.ISO_WEEK_DATE = new DateTimeFormatterBuilder().appendValue(ChronoField.YEAR, 4, 10, SignStyle.EXCEEDS_PAD).appendLiteral('-W').appendValue(ChronoField.ALIGNED_WEEK_OF_YEAR).appendLiteral('-').appendValue(ChronoField.DAY_OF_WEEK).toFormatter(ResolverStyle.STRICT);
  DateTimeFormatter.ISO_DATE = new DateTimeFormatterBuilder().parseCaseInsensitive().append(DateTimeFormatter.ISO_LOCAL_DATE).optionalStart().appendOffsetId().optionalEnd().toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
  DateTimeFormatter.ISO_TIME = new DateTimeFormatterBuilder().parseCaseInsensitive().append(DateTimeFormatter.ISO_LOCAL_TIME).optionalStart().appendOffsetId().optionalEnd().toFormatter(ResolverStyle.STRICT);
  DateTimeFormatter.ISO_DATE_TIME = new DateTimeFormatterBuilder().append(DateTimeFormatter.ISO_LOCAL_DATE_TIME).optionalStart().appendOffsetId().optionalEnd().toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
  DateTimeFormatter.PARSED_EXCESS_DAYS = createTemporalQuery('PARSED_EXCESS_DAYS', function (temporal) {
    if (temporal instanceof DateTimeBuilder) {
      return temporal.excessDays;
    } else {
      return Period.ZERO;
    }
  });
  DateTimeFormatter.PARSED_LEAP_SECOND = createTemporalQuery('PARSED_LEAP_SECOND', function (temporal) {
    if (temporal instanceof DateTimeBuilder) {
      return temporal.leapSecond;
    } else {
      return false;
    }
  });
}

var MonthDay = function (_TemporalAccessor) {
  _inheritsLoose(MonthDay, _TemporalAccessor);

  MonthDay.now = function now(zoneIdOrClock) {
    if (arguments.length === 0) {
      return MonthDay.now0();
    } else if (arguments.length === 1 && zoneIdOrClock instanceof ZoneId) {
      return MonthDay.nowZoneId(zoneIdOrClock);
    } else {
      return MonthDay.nowClock(zoneIdOrClock);
    }
  };

  MonthDay.now0 = function now0() {
    return this.nowClock(Clock.systemDefaultZone());
  };

  MonthDay.nowZoneId = function nowZoneId(zone) {
    requireNonNull(zone, 'zone');
    return this.nowClock(Clock.system(zone));
  };

  MonthDay.nowClock = function nowClock(clock) {
    requireNonNull(clock, 'clock');
    var now = LocalDate.now(clock);
    return MonthDay.of(now.month(), now.dayOfMonth());
  };

  MonthDay.of = function of(monthOrNumber, number) {
    if (arguments.length === 2 && monthOrNumber instanceof Month) {
      return MonthDay.ofMonthNumber(monthOrNumber, number);
    } else {
      return MonthDay.ofNumberNumber(monthOrNumber, number);
    }
  };

  MonthDay.ofMonthNumber = function ofMonthNumber(month, dayOfMonth) {
    requireNonNull(month, 'month');
    ChronoField.DAY_OF_MONTH.checkValidValue(dayOfMonth);

    if (dayOfMonth > month.maxLength()) {
      throw new DateTimeException("Illegal value for DayOfMonth field, value " + dayOfMonth + " is not valid for month " + month.toString());
    }

    return new MonthDay(month.value(), dayOfMonth);
  };

  MonthDay.ofNumberNumber = function ofNumberNumber(month, dayOfMonth) {
    requireNonNull(month, 'month');
    requireNonNull(dayOfMonth, 'dayOfMonth');
    return MonthDay.of(Month.of(month), dayOfMonth);
  };

  MonthDay.from = function from(temporal) {
    requireNonNull(temporal, 'temporal');
    requireInstance(temporal, TemporalAccessor, 'temporal');

    if (temporal instanceof MonthDay) {
      return temporal;
    }

    try {
      return MonthDay.of(temporal.get(ChronoField.MONTH_OF_YEAR), temporal.get(ChronoField.DAY_OF_MONTH));
    } catch (ex) {
      throw new DateTimeException("Unable to obtain MonthDay from TemporalAccessor: " + temporal + ", type " + (temporal && temporal.constructor != null ? temporal.constructor.name : ''));
    }
  };

  MonthDay.parse = function parse(text, formatter) {
    if (arguments.length === 1) {
      return MonthDay.parseString(text);
    } else {
      return MonthDay.parseStringFormatter(text, formatter);
    }
  };

  MonthDay.parseString = function parseString(text) {
    return MonthDay.parseStringFormatter(text, PARSER$2);
  };

  MonthDay.parseStringFormatter = function parseStringFormatter(text, formatter) {
    requireNonNull(text, 'text');
    requireNonNull(formatter, 'formatter');
    requireInstance(formatter, DateTimeFormatter, 'formatter');
    return formatter.parse(text, MonthDay.FROM);
  };

  function MonthDay(month, dayOfMonth) {
    var _this;

    _this = _TemporalAccessor.call(this) || this;
    _this._month = MathUtil.safeToInt(month);
    _this._day = MathUtil.safeToInt(dayOfMonth);
    return _this;
  }

  var _proto = MonthDay.prototype;

  _proto.monthValue = function monthValue() {
    return this._month;
  };

  _proto.month = function month() {
    return Month.of(this._month);
  };

  _proto.dayOfMonth = function dayOfMonth() {
    return this._day;
  };

  _proto.isSupported = function isSupported(field) {
    if (field instanceof ChronoField) {
      return field === ChronoField.MONTH_OF_YEAR || field === ChronoField.DAY_OF_MONTH;
    }

    return field != null && field.isSupportedBy(this);
  };

  _proto.range = function range(field) {
    if (field === ChronoField.MONTH_OF_YEAR) {
      return field.range();
    } else if (field === ChronoField.DAY_OF_MONTH) {
      return ValueRange.of(1, this.month().minLength(), this.month().maxLength());
    }

    return _TemporalAccessor.prototype.range.call(this, field);
  };

  _proto.get = function get(field) {
    return this.range(field).checkValidIntValue(this.getLong(field), field);
  };

  _proto.getLong = function getLong(field) {
    requireNonNull(field, 'field');

    if (field instanceof ChronoField) {
      switch (field) {
        case ChronoField.DAY_OF_MONTH:
          return this._day;

        case ChronoField.MONTH_OF_YEAR:
          return this._month;
      }

      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.getFrom(this);
  };

  _proto.isValidYear = function isValidYear(year) {
    return (this._day === 29 && this._month === 2 && Year.isLeap(year) === false) === false;
  };

  _proto.withMonth = function withMonth(month) {
    return this.with(Month.of(month));
  };

  _proto.with = function _with(month) {
    requireNonNull(month, 'month');

    if (month.value() === this._month) {
      return this;
    }

    var day = Math.min(this._day, month.maxLength());
    return new MonthDay(month.value(), day);
  };

  _proto.withDayOfMonth = function withDayOfMonth(dayOfMonth) {
    if (dayOfMonth === this._day) {
      return this;
    }

    return MonthDay.of(this._month, dayOfMonth);
  };

  _proto.query = function query(_query) {
    requireNonNull(_query, 'query');
    requireInstance(_query, TemporalQuery, 'query');

    if (_query === TemporalQueries.chronology()) {
      return IsoChronology.INSTANCE;
    }

    return _TemporalAccessor.prototype.query.call(this, _query);
  };

  _proto.adjustInto = function adjustInto(temporal) {
    requireNonNull(temporal, 'temporal');
    temporal = temporal.with(ChronoField.MONTH_OF_YEAR, this._month);
    return temporal.with(ChronoField.DAY_OF_MONTH, Math.min(temporal.range(ChronoField.DAY_OF_MONTH).maximum(), this._day));
  };

  _proto.atYear = function atYear(year) {
    return LocalDate.of(year, this._month, this.isValidYear(year) ? this._day : 28);
  };

  _proto.compareTo = function compareTo(other) {
    requireNonNull(other, 'other');
    requireInstance(other, MonthDay, 'other');
    var cmp = this._month - other.monthValue();

    if (cmp === 0) {
      cmp = this._day - other.dayOfMonth();
    }

    return cmp;
  };

  _proto.isAfter = function isAfter(other) {
    requireNonNull(other, 'other');
    requireInstance(other, MonthDay, 'other');
    return this.compareTo(other) > 0;
  };

  _proto.isBefore = function isBefore(other) {
    requireNonNull(other, 'other');
    requireInstance(other, MonthDay, 'other');
    return this.compareTo(other) < 0;
  };

  _proto.equals = function equals(obj) {
    if (this === obj) {
      return true;
    }

    if (obj instanceof MonthDay) {
      var other = obj;
      return this.monthValue() === other.monthValue() && this.dayOfMonth() === other.dayOfMonth();
    }

    return false;
  };

  _proto.toString = function toString() {
    return "--" + (this._month < 10 ? '0' : '') + this._month + (this._day < 10 ? '-0' : '-') + this._day;
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  _proto.format = function format(formatter) {
    requireNonNull(formatter, 'formatter');
    requireInstance(formatter, DateTimeFormatter, 'formatter');
    return formatter.format(this);
  };

  return MonthDay;
}(TemporalAccessor);
var PARSER$2;
function _init$c() {
  PARSER$2 = new DateTimeFormatterBuilder().appendLiteral('--').appendValue(ChronoField.MONTH_OF_YEAR, 2).appendLiteral('-').appendValue(ChronoField.DAY_OF_MONTH, 2).toFormatter();
  MonthDay.FROM = createTemporalQuery('MonthDay.FROM', function (temporal) {
    return MonthDay.from(temporal);
  });
}

var YearMonth = function (_Temporal) {
  _inheritsLoose(YearMonth, _Temporal);

  YearMonth.now = function now(zoneIdOrClock) {
    if (arguments.length === 0) {
      return YearMonth.now0();
    } else if (arguments.length === 1 && zoneIdOrClock instanceof ZoneId) {
      return YearMonth.nowZoneId(zoneIdOrClock);
    } else {
      return YearMonth.nowClock(zoneIdOrClock);
    }
  };

  YearMonth.now0 = function now0() {
    return YearMonth.nowClock(Clock.systemDefaultZone());
  };

  YearMonth.nowZoneId = function nowZoneId(zone) {
    return YearMonth.nowClock(Clock.system(zone));
  };

  YearMonth.nowClock = function nowClock(clock) {
    var now = LocalDate.now(clock);
    return YearMonth.of(now.year(), now.month());
  };

  YearMonth.of = function of(year, monthOrNumber) {
    if (arguments.length === 2 && monthOrNumber instanceof Month) {
      return YearMonth.ofNumberMonth(year, monthOrNumber);
    } else {
      return YearMonth.ofNumberNumber(year, monthOrNumber);
    }
  };

  YearMonth.ofNumberMonth = function ofNumberMonth(year, month) {
    requireNonNull(month, 'month');
    requireInstance(month, Month, 'month');
    return YearMonth.ofNumberNumber(year, month.value());
  };

  YearMonth.ofNumberNumber = function ofNumberNumber(year, month) {
    requireNonNull(year, 'year');
    requireNonNull(month, 'month');
    ChronoField.YEAR.checkValidValue(year);
    ChronoField.MONTH_OF_YEAR.checkValidValue(month);
    return new YearMonth(year, month);
  };

  YearMonth.from = function from(temporal) {
    requireNonNull(temporal, 'temporal');

    if (temporal instanceof YearMonth) {
      return temporal;
    }

    try {
      return YearMonth.of(temporal.get(ChronoField.YEAR), temporal.get(ChronoField.MONTH_OF_YEAR));
    } catch (ex) {
      throw new DateTimeException("Unable to obtain YearMonth from TemporalAccessor: " + temporal + ", type " + (temporal && temporal.constructor != null ? temporal.constructor.name : ''));
    }
  };

  YearMonth.parse = function parse(text, formatter) {
    if (arguments.length === 1) {
      return YearMonth.parseString(text);
    } else {
      return YearMonth.parseStringFormatter(text, formatter);
    }
  };

  YearMonth.parseString = function parseString(text) {
    return YearMonth.parseStringFormatter(text, PARSER$1);
  };

  YearMonth.parseStringFormatter = function parseStringFormatter(text, formatter) {
    requireNonNull(formatter, 'formatter');
    return formatter.parse(text, YearMonth.FROM);
  };

  function YearMonth(year, month) {
    var _this;

    _this = _Temporal.call(this) || this;
    _this._year = MathUtil.safeToInt(year);
    _this._month = MathUtil.safeToInt(month);
    return _this;
  }

  var _proto = YearMonth.prototype;

  _proto.isSupported = function isSupported(fieldOrUnit) {
    if (arguments.length === 1 && fieldOrUnit instanceof TemporalField) {
      return this.isSupportedField(fieldOrUnit);
    } else {
      return this.isSupportedUnit(fieldOrUnit);
    }
  };

  _proto.isSupportedField = function isSupportedField(field) {
    if (field instanceof ChronoField) {
      return field === ChronoField.YEAR || field === ChronoField.MONTH_OF_YEAR || field === ChronoField.PROLEPTIC_MONTH || field === ChronoField.YEAR_OF_ERA || field === ChronoField.ERA;
    }

    return field != null && field.isSupportedBy(this);
  };

  _proto.isSupportedUnit = function isSupportedUnit(unit) {
    if (unit instanceof ChronoUnit) {
      return unit === ChronoUnit.MONTHS || unit === ChronoUnit.YEARS || unit === ChronoUnit.DECADES || unit === ChronoUnit.CENTURIES || unit === ChronoUnit.MILLENNIA || unit === ChronoUnit.ERAS;
    }

    return unit != null && unit.isSupportedBy(this);
  };

  _proto.range = function range(field) {
    if (field === ChronoField.YEAR_OF_ERA) {
      return this.year() <= 0 ? ValueRange.of(1, Year.MAX_VALUE + 1) : ValueRange.of(1, Year.MAX_VALUE);
    }

    return _Temporal.prototype.range.call(this, field);
  };

  _proto.get = function get(field) {
    requireNonNull(field, 'field');
    requireInstance(field, TemporalField, 'field');
    return this.range(field).checkValidIntValue(this.getLong(field), field);
  };

  _proto.getLong = function getLong(field) {
    requireNonNull(field, 'field');
    requireInstance(field, TemporalField, 'field');

    if (field instanceof ChronoField) {
      switch (field) {
        case ChronoField.MONTH_OF_YEAR:
          return this._month;

        case ChronoField.PROLEPTIC_MONTH:
          return this._getProlepticMonth();

        case ChronoField.YEAR_OF_ERA:
          return this._year < 1 ? 1 - this._year : this._year;

        case ChronoField.YEAR:
          return this._year;

        case ChronoField.ERA:
          return this._year < 1 ? 0 : 1;
      }

      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.getFrom(this);
  };

  _proto._getProlepticMonth = function _getProlepticMonth() {
    return MathUtil.safeAdd(MathUtil.safeMultiply(this._year, 12), this._month - 1);
  };

  _proto.year = function year() {
    return this._year;
  };

  _proto.monthValue = function monthValue() {
    return this._month;
  };

  _proto.month = function month() {
    return Month.of(this._month);
  };

  _proto.isLeapYear = function isLeapYear() {
    return IsoChronology.isLeapYear(this._year);
  };

  _proto.isValidDay = function isValidDay(dayOfMonth) {
    return dayOfMonth >= 1 && dayOfMonth <= this.lengthOfMonth();
  };

  _proto.lengthOfMonth = function lengthOfMonth() {
    return this.month().length(this.isLeapYear());
  };

  _proto.lengthOfYear = function lengthOfYear() {
    return this.isLeapYear() ? 366 : 365;
  };

  _proto.with = function _with(adjusterOrField, value) {
    if (arguments.length === 1) {
      return this._withAdjuster(adjusterOrField);
    } else {
      return this._withField(adjusterOrField, value);
    }
  };

  _proto._withField = function _withField(field, newValue) {
    requireNonNull(field, 'field');
    requireInstance(field, TemporalField, 'field');

    if (field instanceof ChronoField) {
      var f = field;
      f.checkValidValue(newValue);

      switch (f) {
        case ChronoField.MONTH_OF_YEAR:
          return this.withMonth(newValue);

        case ChronoField.PROLEPTIC_MONTH:
          return this.plusMonths(newValue - this.getLong(ChronoField.PROLEPTIC_MONTH));

        case ChronoField.YEAR_OF_ERA:
          return this.withYear(this._year < 1 ? 1 - newValue : newValue);

        case ChronoField.YEAR:
          return this.withYear(newValue);

        case ChronoField.ERA:
          return this.getLong(ChronoField.ERA) === newValue ? this : this.withYear(1 - this._year);
      }

      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.adjustInto(this, newValue);
  };

  _proto.withYear = function withYear(year) {
    ChronoField.YEAR.checkValidValue(year);
    return new YearMonth(year, this._month);
  };

  _proto.withMonth = function withMonth(month) {
    ChronoField.MONTH_OF_YEAR.checkValidValue(month);
    return new YearMonth(this._year, month);
  };

  _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
    requireNonNull(unit, 'unit');
    requireInstance(unit, TemporalUnit, 'unit');

    if (unit instanceof ChronoUnit) {
      switch (unit) {
        case ChronoUnit.MONTHS:
          return this.plusMonths(amountToAdd);

        case ChronoUnit.YEARS:
          return this.plusYears(amountToAdd);

        case ChronoUnit.DECADES:
          return this.plusYears(MathUtil.safeMultiply(amountToAdd, 10));

        case ChronoUnit.CENTURIES:
          return this.plusYears(MathUtil.safeMultiply(amountToAdd, 100));

        case ChronoUnit.MILLENNIA:
          return this.plusYears(MathUtil.safeMultiply(amountToAdd, 1000));

        case ChronoUnit.ERAS:
          return this.with(ChronoField.ERA, MathUtil.safeAdd(this.getLong(ChronoField.ERA), amountToAdd));
      }

      throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
    }

    return unit.addTo(this, amountToAdd);
  };

  _proto.plusYears = function plusYears(yearsToAdd) {
    if (yearsToAdd === 0) {
      return this;
    }

    var newYear = ChronoField.YEAR.checkValidIntValue(this._year + yearsToAdd);
    return this.withYear(newYear);
  };

  _proto.plusMonths = function plusMonths(monthsToAdd) {
    if (monthsToAdd === 0) {
      return this;
    }

    var monthCount = this._year * 12 + (this._month - 1);
    var calcMonths = monthCount + monthsToAdd;
    var newYear = ChronoField.YEAR.checkValidIntValue(MathUtil.floorDiv(calcMonths, 12));
    var newMonth = MathUtil.floorMod(calcMonths, 12) + 1;
    return new YearMonth(newYear, newMonth);
  };

  _proto.minusYears = function minusYears(yearsToSubtract) {
    return yearsToSubtract === MathUtil.MIN_SAFE_INTEGER ? this.plusYears(MathUtil.MIN_SAFE_INTEGER).plusYears(1) : this.plusYears(-yearsToSubtract);
  };

  _proto.minusMonths = function minusMonths(monthsToSubtract) {
    return monthsToSubtract === MathUtil.MIN_SAFE_INTEGER ? this.plusMonths(Math.MAX_SAFE_INTEGER).plusMonths(1) : this.plusMonths(-monthsToSubtract);
  };

  _proto.query = function query(_query) {
    requireNonNull(_query, 'query');
    requireInstance(_query, TemporalQuery, 'query');

    if (_query === TemporalQueries.chronology()) {
      return IsoChronology.INSTANCE;
    } else if (_query === TemporalQueries.precision()) {
      return ChronoUnit.MONTHS;
    } else if (_query === TemporalQueries.localDate() || _query === TemporalQueries.localTime() || _query === TemporalQueries.zone() || _query === TemporalQueries.zoneId() || _query === TemporalQueries.offset()) {
      return null;
    }

    return _Temporal.prototype.query.call(this, _query);
  };

  _proto.adjustInto = function adjustInto(temporal) {
    requireNonNull(temporal, 'temporal');
    requireInstance(temporal, Temporal, 'temporal');
    return temporal.with(ChronoField.PROLEPTIC_MONTH, this._getProlepticMonth());
  };

  _proto.until = function until(endExclusive, unit) {
    requireNonNull(endExclusive, 'endExclusive');
    requireNonNull(unit, 'unit');
    requireInstance(endExclusive, Temporal, 'endExclusive');
    requireInstance(unit, TemporalUnit, 'unit');
    var end = YearMonth.from(endExclusive);

    if (unit instanceof ChronoUnit) {
      var monthsUntil = end._getProlepticMonth() - this._getProlepticMonth();

      switch (unit) {
        case ChronoUnit.MONTHS:
          return monthsUntil;

        case ChronoUnit.YEARS:
          return monthsUntil / 12;

        case ChronoUnit.DECADES:
          return monthsUntil / 120;

        case ChronoUnit.CENTURIES:
          return monthsUntil / 1200;

        case ChronoUnit.MILLENNIA:
          return monthsUntil / 12000;

        case ChronoUnit.ERAS:
          return end.getLong(ChronoField.ERA) - this.getLong(ChronoField.ERA);
      }

      throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
    }

    return unit.between(this, end);
  };

  _proto.atDay = function atDay(dayOfMonth) {
    return LocalDate.of(this._year, this._month, dayOfMonth);
  };

  _proto.atEndOfMonth = function atEndOfMonth() {
    return LocalDate.of(this._year, this._month, this.lengthOfMonth());
  };

  _proto.compareTo = function compareTo(other) {
    requireNonNull(other, 'other');
    requireInstance(other, YearMonth, 'other');
    var cmp = this._year - other.year();

    if (cmp === 0) {
      cmp = this._month - other.monthValue();
    }

    return cmp;
  };

  _proto.isAfter = function isAfter(other) {
    return this.compareTo(other) > 0;
  };

  _proto.isBefore = function isBefore(other) {
    return this.compareTo(other) < 0;
  };

  _proto.equals = function equals(obj) {
    if (this === obj) {
      return true;
    }

    if (obj instanceof YearMonth) {
      var other = obj;
      return this.year() === other.year() && this.monthValue() === other.monthValue();
    }

    return false;
  };

  _proto.toString = function toString() {
    return PARSER$1.format(this);
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  _proto.format = function format(formatter) {
    requireNonNull(formatter, 'formatter');
    return formatter.format(this);
  };

  return YearMonth;
}(Temporal);
var PARSER$1;
function _init$b() {
  PARSER$1 = new DateTimeFormatterBuilder().appendValue(ChronoField.YEAR, 4, 10, SignStyle.EXCEEDS_PAD).appendLiteral('-').appendValue(ChronoField.MONTH_OF_YEAR, 2).toFormatter();
  YearMonth.FROM = createTemporalQuery('YearMonth.FROM', function (temporal) {
    return YearMonth.from(temporal);
  });
}

var Year = function (_Temporal) {
  _inheritsLoose(Year, _Temporal);

  function Year(value) {
    var _this;

    _this = _Temporal.call(this) || this;
    _this._year = MathUtil.safeToInt(value);
    return _this;
  }

  var _proto = Year.prototype;

  _proto.value = function value() {
    return this._year;
  };

  Year.now = function now(zoneIdOrClock) {
    if (zoneIdOrClock === void 0) {
      zoneIdOrClock = undefined;
    }

    if (zoneIdOrClock === undefined) {
      return Year.now0();
    } else if (zoneIdOrClock instanceof ZoneId) {
      return Year.nowZoneId(zoneIdOrClock);
    } else {
      return Year.nowClock(zoneIdOrClock);
    }
  };

  Year.now0 = function now0() {
    return Year.nowClock(Clock.systemDefaultZone());
  };

  Year.nowZoneId = function nowZoneId(zone) {
    requireNonNull(zone, 'zone');
    requireInstance(zone, ZoneId, 'zone');
    return Year.nowClock(Clock.system(zone));
  };

  Year.nowClock = function nowClock(clock) {
    requireNonNull(clock, 'clock');
    requireInstance(clock, Clock, 'clock');
    var now = LocalDate.now(clock);
    return Year.of(now.year());
  };

  Year.of = function of(isoYear) {
    requireNonNull(isoYear, 'isoYear');
    ChronoField.YEAR.checkValidValue(isoYear);
    return new Year(isoYear);
  };

  Year.from = function from(temporal) {
    requireNonNull(temporal, 'temporal');
    requireInstance(temporal, TemporalAccessor, 'temporal');

    if (temporal instanceof Year) {
      return temporal;
    }

    try {
      return Year.of(temporal.get(ChronoField.YEAR));
    } catch (ex) {
      throw new DateTimeException("Unable to obtain Year from TemporalAccessor: " + temporal + ", type " + (temporal && temporal.constructor != null ? temporal.constructor.name : ''));
    }
  };

  Year.parse = function parse(text, formatter) {
    if (arguments.length <= 1) {
      return Year.parseText(text);
    } else {
      return Year.parseTextFormatter(text, formatter);
    }
  };

  Year.parseText = function parseText(text) {
    requireNonNull(text, 'text');
    return Year.parse(text, PARSER);
  };

  Year.parseTextFormatter = function parseTextFormatter(text, formatter) {
    if (formatter === void 0) {
      formatter = PARSER;
    }

    requireNonNull(text, 'text');
    requireNonNull(formatter, 'formatter');
    requireInstance(formatter, DateTimeFormatter, 'formatter');
    return formatter.parse(text, Year.FROM);
  };

  Year.isLeap = function isLeap(year) {
    return MathUtil.intMod(year, 4) === 0 && (MathUtil.intMod(year, 100) !== 0 || MathUtil.intMod(year, 400) === 0);
  };

  _proto.isSupported = function isSupported(fieldOrUnit) {
    if (arguments.length === 1 && fieldOrUnit instanceof TemporalField) {
      return this.isSupportedField(fieldOrUnit);
    } else {
      return this.isSupportedUnit(fieldOrUnit);
    }
  };

  _proto.isSupportedField = function isSupportedField(field) {
    if (field instanceof ChronoField) {
      return field === ChronoField.YEAR || field === ChronoField.YEAR_OF_ERA || field === ChronoField.ERA;
    }

    return field != null && field.isSupportedBy(this);
  };

  _proto.isSupportedUnit = function isSupportedUnit(unit) {
    if (unit instanceof ChronoUnit) {
      return unit === ChronoUnit.YEARS || unit === ChronoUnit.DECADES || unit === ChronoUnit.CENTURIES || unit === ChronoUnit.MILLENNIA || unit === ChronoUnit.ERAS;
    }

    return unit != null && unit.isSupportedBy(this);
  };

  _proto.range = function range(field) {
    if (this.isSupported(field)) {
      return field.range();
    } else if (field instanceof ChronoField) {
      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return _Temporal.prototype.range.call(this, field);
  };

  _proto.get = function get(field) {
    return this.range(field).checkValidIntValue(this.getLong(field), field);
  };

  _proto.getLong = function getLong(field) {
    requireNonNull(field, 'field');

    if (field instanceof ChronoField) {
      switch (field) {
        case ChronoField.YEAR_OF_ERA:
          return this._year < 1 ? 1 - this._year : this._year;

        case ChronoField.YEAR:
          return this._year;

        case ChronoField.ERA:
          return this._year < 1 ? 0 : 1;
      }

      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.getFrom(this);
  };

  _proto.isLeap = function isLeap() {
    return Year.isLeap(this._year);
  };

  _proto._withField = function _withField(field, newValue) {
    requireNonNull(field, 'field');
    requireInstance(field, TemporalField, 'field');

    if (field instanceof ChronoField) {
      field.checkValidValue(newValue);

      switch (field) {
        case ChronoField.YEAR_OF_ERA:
          return Year.of(this._year < 1 ? 1 - newValue : newValue);

        case ChronoField.YEAR:
          return Year.of(newValue);

        case ChronoField.ERA:
          return this.getLong(ChronoField.ERA) === newValue ? this : Year.of(1 - this._year);
      }

      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.adjustInto(this, newValue);
  };

  _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
    requireNonNull(amountToAdd, 'amountToAdd');
    requireNonNull(unit, 'unit');
    requireInstance(unit, TemporalUnit, 'unit');

    if (unit instanceof ChronoUnit) {
      switch (unit) {
        case ChronoUnit.YEARS:
          return this.plusYears(amountToAdd);

        case ChronoUnit.DECADES:
          return this.plusYears(MathUtil.safeMultiply(amountToAdd, 10));

        case ChronoUnit.CENTURIES:
          return this.plusYears(MathUtil.safeMultiply(amountToAdd, 100));

        case ChronoUnit.MILLENNIA:
          return this.plusYears(MathUtil.safeMultiply(amountToAdd, 1000));

        case ChronoUnit.ERAS:
          return this.with(ChronoField.ERA, MathUtil.safeAdd(this.getLong(ChronoField.ERA), amountToAdd));
      }

      throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
    }

    return unit.addTo(this, amountToAdd);
  };

  _proto.plusYears = function plusYears(yearsToAdd) {
    if (yearsToAdd === 0) {
      return this;
    }

    return Year.of(ChronoField.YEAR.checkValidIntValue(MathUtil.safeAdd(this._year, yearsToAdd)));
  };

  _proto.minusYears = function minusYears(yearsToSubtract) {
    return yearsToSubtract === MathUtil.MIN_SAFE_INTEGER ? this.plusYears(MathUtil.MAX_SAFE_INTEGER).plusYears(1) : this.plusYears(-yearsToSubtract);
  };

  _proto.adjustInto = function adjustInto(temporal) {
    requireNonNull(temporal, 'temporal');
    return temporal.with(ChronoField.YEAR, this._year);
  };

  _proto.isValidMonthDay = function isValidMonthDay(monthDay) {
    return monthDay != null && monthDay.isValidYear(this._year);
  };

  _proto.length = function length() {
    return this.isLeap() ? 366 : 365;
  };

  _proto.atDay = function atDay(dayOfYear) {
    return LocalDate.ofYearDay(this._year, dayOfYear);
  };

  _proto.atMonth = function atMonth(monthOrNumber) {
    if (arguments.length === 1 && monthOrNumber instanceof Month) {
      return this.atMonthMonth(monthOrNumber);
    } else {
      return this.atMonthNumber(monthOrNumber);
    }
  };

  _proto.atMonthMonth = function atMonthMonth(month) {
    requireNonNull(month, 'month');
    requireInstance(month, Month, 'month');
    return YearMonth.of(this._year, month);
  };

  _proto.atMonthNumber = function atMonthNumber(month) {
    requireNonNull(month, 'month');
    return YearMonth.of(this._year, month);
  };

  _proto.atMonthDay = function atMonthDay(monthDay) {
    requireNonNull(monthDay, 'monthDay');
    requireInstance(monthDay, MonthDay, 'monthDay');
    return monthDay.atYear(this._year);
  };

  _proto.query = function query(_query) {
    requireNonNull(_query, 'query()');
    requireInstance(_query, TemporalQuery, 'query()');

    if (_query === TemporalQueries.chronology()) {
      return IsoChronology.INSTANCE;
    } else if (_query === TemporalQueries.precision()) {
      return ChronoUnit.YEARS;
    } else if (_query === TemporalQueries.localDate() || _query === TemporalQueries.localTime() || _query === TemporalQueries.zone() || _query === TemporalQueries.zoneId() || _query === TemporalQueries.offset()) {
      return null;
    }

    return _Temporal.prototype.query.call(this, _query);
  };

  _proto.compareTo = function compareTo(other) {
    requireNonNull(other, 'other');
    requireInstance(other, Year, 'other');
    return this._year - other._year;
  };

  _proto.isAfter = function isAfter(other) {
    requireNonNull(other, 'other');
    requireInstance(other, Year, 'other');
    return this._year > other._year;
  };

  _proto.isBefore = function isBefore(other) {
    requireNonNull(other, 'other');
    requireInstance(other, Year, 'other');
    return this._year < other._year;
  };

  _proto.format = function format(formatter) {
    requireNonNull(formatter, 'formatter');
    requireInstance(formatter, DateTimeFormatter, 'formatter');
    return formatter.format(this);
  };

  _proto.equals = function equals(other) {
    if (this === other) {
      return true;
    }

    if (other instanceof Year) {
      return this.value() === other.value();
    }

    return false;
  };

  _proto.toString = function toString() {
    return "" + this._year;
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  _proto.until = function until(endExclusive, unit) {
    var end = Year.from(endExclusive);

    if (unit instanceof ChronoUnit) {
      var yearsUntil = end.value() - this.value();

      switch (unit) {
        case ChronoUnit.YEARS:
          return yearsUntil;

        case ChronoUnit.DECADES:
          return MathUtil.intDiv(yearsUntil, 10);

        case ChronoUnit.CENTURIES:
          return MathUtil.intDiv(yearsUntil, 100);

        case ChronoUnit.MILLENNIA:
          return MathUtil.intDiv(yearsUntil, 1000);

        case ChronoUnit.ERAS:
          return end.getLong(ChronoField.ERA) - this.getLong(ChronoField.ERA);
      }

      throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
    }

    return unit.between(this, end);
  };

  return Year;
}(Temporal);
var PARSER;
function _init$a() {
  Year.MIN_VALUE = YearConstants.MIN_VALUE;
  Year.MAX_VALUE = YearConstants.MAX_VALUE;
  PARSER = new DateTimeFormatterBuilder().appendValue(ChronoField.YEAR, 4, 10, SignStyle.EXCEEDS_PAD).toFormatter();
  Year.FROM = createTemporalQuery('Year.FROM', function (temporal) {
    return Year.from(temporal);
  });
}

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var TemporalAdjuster = function () {
  function TemporalAdjuster() {}

  var _proto = TemporalAdjuster.prototype;

  _proto.adjustInto = function adjustInto(temporal) {
    abstractMethodFail('adjustInto');
  };

  return TemporalAdjuster;
}();

var TemporalAdjusters = function () {
  function TemporalAdjusters() {}

  TemporalAdjusters.firstDayOfMonth = function firstDayOfMonth() {
    return Impl.FIRST_DAY_OF_MONTH;
  };

  TemporalAdjusters.lastDayOfMonth = function lastDayOfMonth() {
    return Impl.LAST_DAY_OF_MONTH;
  };

  TemporalAdjusters.firstDayOfNextMonth = function firstDayOfNextMonth() {
    return Impl.FIRST_DAY_OF_NEXT_MONTH;
  };

  TemporalAdjusters.firstDayOfYear = function firstDayOfYear() {
    return Impl.FIRST_DAY_OF_YEAR;
  };

  TemporalAdjusters.lastDayOfYear = function lastDayOfYear() {
    return Impl.LAST_DAY_OF_YEAR;
  };

  TemporalAdjusters.firstDayOfNextYear = function firstDayOfNextYear() {
    return Impl.FIRST_DAY_OF_NEXT_YEAR;
  };

  TemporalAdjusters.firstInMonth = function firstInMonth(dayOfWeek) {
    requireNonNull(dayOfWeek, 'dayOfWeek');
    return new DayOfWeekInMonth(1, dayOfWeek);
  };

  TemporalAdjusters.lastInMonth = function lastInMonth(dayOfWeek) {
    requireNonNull(dayOfWeek, 'dayOfWeek');
    return new DayOfWeekInMonth(-1, dayOfWeek);
  };

  TemporalAdjusters.dayOfWeekInMonth = function dayOfWeekInMonth(ordinal, dayOfWeek) {
    requireNonNull(dayOfWeek, 'dayOfWeek');
    return new DayOfWeekInMonth(ordinal, dayOfWeek);
  };

  TemporalAdjusters.next = function next(dayOfWeek) {
    return new RelativeDayOfWeek(2, dayOfWeek);
  };

  TemporalAdjusters.nextOrSame = function nextOrSame(dayOfWeek) {
    return new RelativeDayOfWeek(0, dayOfWeek);
  };

  TemporalAdjusters.previous = function previous(dayOfWeek) {
    return new RelativeDayOfWeek(3, dayOfWeek);
  };

  TemporalAdjusters.previousOrSame = function previousOrSame(dayOfWeek) {
    return new RelativeDayOfWeek(1, dayOfWeek);
  };

  return TemporalAdjusters;
}();

var Impl = function (_TemporalAdjuster) {
  _inheritsLoose(Impl, _TemporalAdjuster);

  function Impl(ordinal) {
    var _this;

    _this = _TemporalAdjuster.call(this) || this;
    _this._ordinal = ordinal;
    return _this;
  }

  var _proto = Impl.prototype;

  _proto.adjustInto = function adjustInto(temporal) {
    switch (this._ordinal) {
      case 0:
        return temporal.with(ChronoField.DAY_OF_MONTH, 1);

      case 1:
        return temporal.with(ChronoField.DAY_OF_MONTH, temporal.range(ChronoField.DAY_OF_MONTH).maximum());

      case 2:
        return temporal.with(ChronoField.DAY_OF_MONTH, 1).plus(1, ChronoUnit.MONTHS);

      case 3:
        return temporal.with(ChronoField.DAY_OF_YEAR, 1);

      case 4:
        return temporal.with(ChronoField.DAY_OF_YEAR, temporal.range(ChronoField.DAY_OF_YEAR).maximum());

      case 5:
        return temporal.with(ChronoField.DAY_OF_YEAR, 1).plus(1, ChronoUnit.YEARS);
    }

    throw new IllegalStateException('Unreachable');
  };

  return Impl;
}(TemporalAdjuster);

Impl.FIRST_DAY_OF_MONTH = new Impl(0);
Impl.LAST_DAY_OF_MONTH = new Impl(1);
Impl.FIRST_DAY_OF_NEXT_MONTH = new Impl(2);
Impl.FIRST_DAY_OF_YEAR = new Impl(3);
Impl.LAST_DAY_OF_YEAR = new Impl(4);
Impl.FIRST_DAY_OF_NEXT_YEAR = new Impl(5);

var DayOfWeekInMonth = function (_TemporalAdjuster2) {
  _inheritsLoose(DayOfWeekInMonth, _TemporalAdjuster2);

  function DayOfWeekInMonth(ordinal, dow) {
    var _this2;

    _this2 = _TemporalAdjuster2.call(this) || this;
    _this2._ordinal = ordinal;
    _this2._dowValue = dow.value();
    return _this2;
  }

  var _proto2 = DayOfWeekInMonth.prototype;

  _proto2.adjustInto = function adjustInto(temporal) {
    if (this._ordinal >= 0) {
      var temp = temporal.with(ChronoField.DAY_OF_MONTH, 1);
      var curDow = temp.get(ChronoField.DAY_OF_WEEK);
      var dowDiff = MathUtil.intMod(this._dowValue - curDow + 7, 7);
      dowDiff += (this._ordinal - 1) * 7;
      return temp.plus(dowDiff, ChronoUnit.DAYS);
    } else {
      var _temp = temporal.with(ChronoField.DAY_OF_MONTH, temporal.range(ChronoField.DAY_OF_MONTH).maximum());

      var _curDow = _temp.get(ChronoField.DAY_OF_WEEK);

      var daysDiff = this._dowValue - _curDow;
      daysDiff = daysDiff === 0 ? 0 : daysDiff > 0 ? daysDiff - 7 : daysDiff;
      daysDiff -= (-this._ordinal - 1) * 7;
      return _temp.plus(daysDiff, ChronoUnit.DAYS);
    }
  };

  return DayOfWeekInMonth;
}(TemporalAdjuster);

var RelativeDayOfWeek = function (_TemporalAdjuster3) {
  _inheritsLoose(RelativeDayOfWeek, _TemporalAdjuster3);

  function RelativeDayOfWeek(relative, dayOfWeek) {
    var _this3;

    _this3 = _TemporalAdjuster3.call(this) || this;
    requireNonNull(dayOfWeek, 'dayOfWeek');
    _this3._relative = relative;
    _this3._dowValue = dayOfWeek.value();
    return _this3;
  }

  var _proto3 = RelativeDayOfWeek.prototype;

  _proto3.adjustInto = function adjustInto(temporal) {
    var calDow = temporal.get(ChronoField.DAY_OF_WEEK);

    if (this._relative < 2 && calDow === this._dowValue) {
      return temporal;
    }

    if ((this._relative & 1) === 0) {
      var daysDiff = calDow - this._dowValue;
      return temporal.plus(daysDiff >= 0 ? 7 - daysDiff : -daysDiff, ChronoUnit.DAYS);
    } else {
      var _daysDiff = this._dowValue - calDow;

      return temporal.minus(_daysDiff >= 0 ? 7 - _daysDiff : -_daysDiff, ChronoUnit.DAYS);
    }
  };

  return RelativeDayOfWeek;
}(TemporalAdjuster);

var IsoChronology = function (_Enum) {
  _inheritsLoose(IsoChronology, _Enum);

  function IsoChronology() {
    return _Enum.apply(this, arguments) || this;
  }

  IsoChronology.isLeapYear = function isLeapYear(prolepticYear) {
    return (prolepticYear & 3) === 0 && (prolepticYear % 100 !== 0 || prolepticYear % 400 === 0);
  };

  var _proto = IsoChronology.prototype;

  _proto._updateResolveMap = function _updateResolveMap(fieldValues, field, value) {
    requireNonNull(fieldValues, 'fieldValues');
    requireNonNull(field, 'field');
    var current = fieldValues.get(field);

    if (current != null && current !== value) {
      throw new DateTimeException("Invalid state, field: " + field + " " + current + " conflicts with " + field + " " + value);
    }

    fieldValues.put(field, value);
  };

  _proto.resolveDate = function resolveDate(fieldValues, resolverStyle) {
    if (fieldValues.containsKey(ChronoField.EPOCH_DAY)) {
      return LocalDate.ofEpochDay(fieldValues.remove(ChronoField.EPOCH_DAY));
    }

    var prolepticMonth = fieldValues.remove(ChronoField.PROLEPTIC_MONTH);

    if (prolepticMonth != null) {
      if (resolverStyle !== ResolverStyle.LENIENT) {
        ChronoField.PROLEPTIC_MONTH.checkValidValue(prolepticMonth);
      }

      this._updateResolveMap(fieldValues, ChronoField.MONTH_OF_YEAR, MathUtil.floorMod(prolepticMonth, 12) + 1);

      this._updateResolveMap(fieldValues, ChronoField.YEAR, MathUtil.floorDiv(prolepticMonth, 12));
    }

    var yoeLong = fieldValues.remove(ChronoField.YEAR_OF_ERA);

    if (yoeLong != null) {
      if (resolverStyle !== ResolverStyle.LENIENT) {
        ChronoField.YEAR_OF_ERA.checkValidValue(yoeLong);
      }

      var era = fieldValues.remove(ChronoField.ERA);

      if (era == null) {
        var year = fieldValues.get(ChronoField.YEAR);

        if (resolverStyle === ResolverStyle.STRICT) {
          if (year != null) {
            this._updateResolveMap(fieldValues, ChronoField.YEAR, year > 0 ? yoeLong : MathUtil.safeSubtract(1, yoeLong));
          } else {
            fieldValues.put(ChronoField.YEAR_OF_ERA, yoeLong);
          }
        } else {
          this._updateResolveMap(fieldValues, ChronoField.YEAR, year == null || year > 0 ? yoeLong : MathUtil.safeSubtract(1, yoeLong));
        }
      } else if (era === 1) {
        this._updateResolveMap(fieldValues, ChronoField.YEAR, yoeLong);
      } else if (era === 0) {
        this._updateResolveMap(fieldValues, ChronoField.YEAR, MathUtil.safeSubtract(1, yoeLong));
      } else {
        throw new DateTimeException("Invalid value for era: " + era);
      }
    } else if (fieldValues.containsKey(ChronoField.ERA)) {
      ChronoField.ERA.checkValidValue(fieldValues.get(ChronoField.ERA));
    }

    if (fieldValues.containsKey(ChronoField.YEAR)) {
      if (fieldValues.containsKey(ChronoField.MONTH_OF_YEAR)) {
        if (fieldValues.containsKey(ChronoField.DAY_OF_MONTH)) {
          var y = ChronoField.YEAR.checkValidIntValue(fieldValues.remove(ChronoField.YEAR));
          var moy = fieldValues.remove(ChronoField.MONTH_OF_YEAR);
          var dom = fieldValues.remove(ChronoField.DAY_OF_MONTH);

          if (resolverStyle === ResolverStyle.LENIENT) {
            var months = moy - 1;
            var days = dom - 1;
            return LocalDate.of(y, 1, 1).plusMonths(months).plusDays(days);
          } else if (resolverStyle === ResolverStyle.SMART) {
            ChronoField.DAY_OF_MONTH.checkValidValue(dom);

            if (moy === 4 || moy === 6 || moy === 9 || moy === 11) {
              dom = Math.min(dom, 30);
            } else if (moy === 2) {
              dom = Math.min(dom, Month.FEBRUARY.length(Year.isLeap(y)));
            }

            return LocalDate.of(y, moy, dom);
          } else {
            return LocalDate.of(y, moy, dom);
          }
        }
      }

      if (fieldValues.containsKey(ChronoField.DAY_OF_YEAR)) {
        var _y = ChronoField.YEAR.checkValidIntValue(fieldValues.remove(ChronoField.YEAR));

        if (resolverStyle === ResolverStyle.LENIENT) {
          var _days = MathUtil.safeSubtract(fieldValues.remove(ChronoField.DAY_OF_YEAR), 1);

          return LocalDate.ofYearDay(_y, 1).plusDays(_days);
        }

        var doy = ChronoField.DAY_OF_YEAR.checkValidIntValue(fieldValues.remove(ChronoField.DAY_OF_YEAR));
        return LocalDate.ofYearDay(_y, doy);
      }

      if (fieldValues.containsKey(ChronoField.ALIGNED_WEEK_OF_YEAR)) {
        if (fieldValues.containsKey(ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR)) {
          var _y2 = ChronoField.YEAR.checkValidIntValue(fieldValues.remove(ChronoField.YEAR));

          if (resolverStyle === ResolverStyle.LENIENT) {
            var weeks = MathUtil.safeSubtract(fieldValues.remove(ChronoField.ALIGNED_WEEK_OF_YEAR), 1);

            var _days2 = MathUtil.safeSubtract(fieldValues.remove(ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR), 1);

            return LocalDate.of(_y2, 1, 1).plusWeeks(weeks).plusDays(_days2);
          }

          var aw = ChronoField.ALIGNED_WEEK_OF_YEAR.checkValidIntValue(fieldValues.remove(ChronoField.ALIGNED_WEEK_OF_YEAR));
          var ad = ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR.checkValidIntValue(fieldValues.remove(ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR));
          var date = LocalDate.of(_y2, 1, 1).plusDays((aw - 1) * 7 + (ad - 1));

          if (resolverStyle === ResolverStyle.STRICT && date.get(ChronoField.YEAR) !== _y2) {
            throw new DateTimeException('Strict mode rejected date parsed to a different year');
          }

          return date;
        }

        if (fieldValues.containsKey(ChronoField.DAY_OF_WEEK)) {
          var _y3 = ChronoField.YEAR.checkValidIntValue(fieldValues.remove(ChronoField.YEAR));

          if (resolverStyle === ResolverStyle.LENIENT) {
            var _weeks = MathUtil.safeSubtract(fieldValues.remove(ChronoField.ALIGNED_WEEK_OF_YEAR), 1);

            var _days3 = MathUtil.safeSubtract(fieldValues.remove(ChronoField.DAY_OF_WEEK), 1);

            return LocalDate.of(_y3, 1, 1).plusWeeks(_weeks).plusDays(_days3);
          }

          var _aw = ChronoField.ALIGNED_WEEK_OF_YEAR.checkValidIntValue(fieldValues.remove(ChronoField.ALIGNED_WEEK_OF_YEAR));

          var dow = ChronoField.DAY_OF_WEEK.checkValidIntValue(fieldValues.remove(ChronoField.DAY_OF_WEEK));

          var _date = LocalDate.of(_y3, 1, 1).plusWeeks(_aw - 1).with(TemporalAdjusters.nextOrSame(DayOfWeek.of(dow)));

          if (resolverStyle === ResolverStyle.STRICT && _date.get(ChronoField.YEAR) !== _y3) {
            throw new DateTimeException('Strict mode rejected date parsed to a different month');
          }

          return _date;
        }
      }
    }

    return null;
  };

  _proto.date = function date(temporal) {
    return LocalDate.from(temporal);
  };

  return IsoChronology;
}(Enum);
function _init$9() {
  IsoChronology.INSTANCE = new IsoChronology('IsoChronology');
}

var OffsetTime = function (_Temporal) {
  _inheritsLoose(OffsetTime, _Temporal);

  OffsetTime.from = function from(temporal) {
    requireNonNull(temporal, 'temporal');

    if (temporal instanceof OffsetTime) {
      return temporal;
    } else if (temporal instanceof OffsetDateTime) {
      return temporal.toOffsetTime();
    }

    try {
      var time = LocalTime.from(temporal);
      var offset = ZoneOffset.from(temporal);
      return new OffsetTime(time, offset);
    } catch (ex) {
      throw new DateTimeException("Unable to obtain OffsetTime TemporalAccessor: " + temporal + ", type " + (temporal.constructor != null ? temporal.constructor.name : ''));
    }
  };

  OffsetTime.now = function now(clockOrZone) {
    if (arguments.length === 0) {
      return OffsetTime._now(Clock.systemDefaultZone());
    } else if (clockOrZone instanceof Clock) {
      return OffsetTime._now(clockOrZone);
    } else {
      return OffsetTime._now(Clock.system(clockOrZone));
    }
  };

  OffsetTime._now = function _now(clock) {
    requireNonNull(clock, 'clock');
    var now = clock.instant();
    return OffsetTime.ofInstant(now, clock.zone().rules().offset(now));
  };

  OffsetTime.of = function of() {
    if (arguments.length <= 2) {
      return OffsetTime.ofTimeAndOffset.apply(this, arguments);
    } else {
      return OffsetTime.ofNumbers.apply(this, arguments);
    }
  };

  OffsetTime.ofNumbers = function ofNumbers(hour, minute, second, nanoOfSecond, offset) {
    var time = LocalTime.of(hour, minute, second, nanoOfSecond);
    return new OffsetTime(time, offset);
  };

  OffsetTime.ofTimeAndOffset = function ofTimeAndOffset(time, offset) {
    return new OffsetTime(time, offset);
  };

  OffsetTime.ofInstant = function ofInstant(instant, zone) {
    requireNonNull(instant, 'instant');
    requireInstance(instant, Instant, 'instant');
    requireNonNull(zone, 'zone');
    requireInstance(zone, ZoneId, 'zone');
    var rules = zone.rules();
    var offset = rules.offset(instant);
    var secsOfDay = instant.epochSecond() % LocalTime.SECONDS_PER_DAY;
    secsOfDay = (secsOfDay + offset.totalSeconds()) % LocalTime.SECONDS_PER_DAY;

    if (secsOfDay < 0) {
      secsOfDay += LocalTime.SECONDS_PER_DAY;
    }

    var time = LocalTime.ofSecondOfDay(secsOfDay, instant.nano());
    return new OffsetTime(time, offset);
  };

  OffsetTime.parse = function parse(text, formatter) {
    if (formatter === void 0) {
      formatter = DateTimeFormatter.ISO_OFFSET_TIME;
    }

    requireNonNull(formatter, 'formatter');
    return formatter.parse(text, OffsetTime.FROM);
  };

  function OffsetTime(time, offset) {
    var _this;

    _this = _Temporal.call(this) || this;
    requireNonNull(time, 'time');
    requireInstance(time, LocalTime, 'time');
    requireNonNull(offset, 'offset');
    requireInstance(offset, ZoneOffset, 'offset');
    _this._time = time;
    _this._offset = offset;
    return _this;
  }

  var _proto = OffsetTime.prototype;

  _proto.adjustInto = function adjustInto(temporal) {
    return temporal.with(ChronoField.NANO_OF_DAY, this._time.toNanoOfDay()).with(ChronoField.OFFSET_SECONDS, this.offset().totalSeconds());
  };

  _proto.atDate = function atDate(date) {
    return OffsetDateTime.of(date, this._time, this._offset);
  };

  _proto.format = function format(formatter) {
    requireNonNull(formatter, 'formatter');
    return formatter.format(this, OffsetTime.FROM);
  };

  _proto.get = function get(field) {
    return _Temporal.prototype.get.call(this, field);
  };

  _proto.getLong = function getLong(field) {
    if (field instanceof ChronoField) {
      if (field === ChronoField.OFFSET_SECONDS) {
        return this._offset.totalSeconds();
      }

      return this._time.getLong(field);
    }

    return field.getFrom(this);
  };

  _proto.hour = function hour() {
    return this._time.hour();
  };

  _proto.minute = function minute() {
    return this._time.minute();
  };

  _proto.second = function second() {
    return this._time.second();
  };

  _proto.nano = function nano() {
    return this._time.nano();
  };

  _proto.offset = function offset() {
    return this._offset;
  };

  _proto.isAfter = function isAfter(other) {
    requireNonNull(other, 'other');
    return this._toEpochNano() > other._toEpochNano();
  };

  _proto.isBefore = function isBefore(other) {
    requireNonNull(other, 'other');
    return this._toEpochNano() < other._toEpochNano();
  };

  _proto.isEqual = function isEqual(other) {
    requireNonNull(other, 'other');
    return this._toEpochNano() === other._toEpochNano();
  };

  _proto.isSupported = function isSupported(fieldOrUnit) {
    if (fieldOrUnit instanceof ChronoField) {
      return fieldOrUnit.isTimeBased() || fieldOrUnit === ChronoField.OFFSET_SECONDS;
    } else if (fieldOrUnit instanceof ChronoUnit) {
      return fieldOrUnit.isTimeBased();
    }

    return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
  };

  _proto.minusHours = function minusHours(hours) {
    return this._withLocalTimeOffset(this._time.minusHours(hours), this._offset);
  };

  _proto.minusMinutes = function minusMinutes(minutes) {
    return this._withLocalTimeOffset(this._time.minusMinutes(minutes), this._offset);
  };

  _proto.minusSeconds = function minusSeconds(seconds) {
    return this._withLocalTimeOffset(this._time.minusSeconds(seconds), this._offset);
  };

  _proto.minusNanos = function minusNanos(nanos) {
    return this._withLocalTimeOffset(this._time.minusNanos(nanos), this._offset);
  };

  _proto._minusAmount = function _minusAmount(amount) {
    requireNonNull(amount);
    return amount.subtractFrom(this);
  };

  _proto._minusUnit = function _minusUnit(amountToSubtract, unit) {
    return this.plus(-1 * amountToSubtract, unit);
  };

  _proto._plusAmount = function _plusAmount(amount) {
    requireNonNull(amount);
    return amount.addTo(this);
  };

  _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
    if (unit instanceof ChronoUnit) {
      return this._withLocalTimeOffset(this._time.plus(amountToAdd, unit), this._offset);
    }

    return unit.addTo(this, amountToAdd);
  };

  _proto.plusHours = function plusHours(hours) {
    return this._withLocalTimeOffset(this._time.plusHours(hours), this._offset);
  };

  _proto.plusMinutes = function plusMinutes(minutes) {
    return this._withLocalTimeOffset(this._time.plusMinutes(minutes), this._offset);
  };

  _proto.plusSeconds = function plusSeconds(seconds) {
    return this._withLocalTimeOffset(this._time.plusSeconds(seconds), this._offset);
  };

  _proto.plusNanos = function plusNanos(nanos) {
    return this._withLocalTimeOffset(this._time.plusNanos(nanos), this._offset);
  };

  _proto.query = function query(_query) {
    requireNonNull(_query, 'query');

    if (_query === TemporalQueries.precision()) {
      return ChronoUnit.NANOS;
    } else if (_query === TemporalQueries.offset() || _query === TemporalQueries.zone()) {
      return this.offset();
    } else if (_query === TemporalQueries.localTime()) {
      return this._time;
    } else if (_query === TemporalQueries.chronology() || _query === TemporalQueries.localDate() || _query === TemporalQueries.zoneId()) {
      return null;
    }

    return _Temporal.prototype.query.call(this, _query);
  };

  _proto.range = function range(field) {
    if (field instanceof ChronoField) {
      if (field === ChronoField.OFFSET_SECONDS) {
        return field.range();
      }

      return this._time.range(field);
    }

    return field.rangeRefinedBy(this);
  };

  _proto.toLocalTime = function toLocalTime() {
    return this._time;
  };

  _proto.truncatedTo = function truncatedTo(unit) {
    return this._withLocalTimeOffset(this._time.truncatedTo(unit), this._offset);
  };

  _proto.until = function until(endExclusive, unit) {
    requireNonNull(endExclusive, 'endExclusive');
    requireNonNull(unit, 'unit');
    var end = OffsetTime.from(endExclusive);

    if (unit instanceof ChronoUnit) {
      var nanosUntil = end._toEpochNano() - this._toEpochNano();

      switch (unit) {
        case ChronoUnit.NANOS:
          return nanosUntil;

        case ChronoUnit.MICROS:
          return Math.floor(nanosUntil / 1000);

        case ChronoUnit.MILLIS:
          return Math.floor(nanosUntil / 1000000);

        case ChronoUnit.SECONDS:
          return Math.floor(nanosUntil / LocalTime.NANOS_PER_SECOND);

        case ChronoUnit.MINUTES:
          return Math.floor(nanosUntil / LocalTime.NANOS_PER_MINUTE);

        case ChronoUnit.HOURS:
          return Math.floor(nanosUntil / LocalTime.NANOS_PER_HOUR);

        case ChronoUnit.HALF_DAYS:
          return Math.floor(nanosUntil / (12 * LocalTime.NANOS_PER_HOUR));
      }

      throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
    }

    return unit.between(this, end);
  };

  _proto.withHour = function withHour(hour) {
    return this._withLocalTimeOffset(this._time.withHour(hour), this._offset);
  };

  _proto.withMinute = function withMinute(minute) {
    return this._withLocalTimeOffset(this._time.withMinute(minute), this._offset);
  };

  _proto.withSecond = function withSecond(second) {
    return this._withLocalTimeOffset(this._time.withSecond(second), this._offset);
  };

  _proto.withNano = function withNano(nano) {
    return this._withLocalTimeOffset(this._time.withNano(nano), this._offset);
  };

  _proto.withOffsetSameInstant = function withOffsetSameInstant(offset) {
    requireNonNull(offset, 'offset');

    if (offset.equals(this._offset)) {
      return this;
    }

    var difference = offset.totalSeconds() - this._offset.totalSeconds();

    var adjusted = this._time.plusSeconds(difference);

    return new OffsetTime(adjusted, offset);
  };

  _proto.withOffsetSameLocal = function withOffsetSameLocal(offset) {
    return offset != null && offset.equals(this._offset) ? this : new OffsetTime(this._time, offset);
  };

  _proto._toEpochNano = function _toEpochNano() {
    var nod = this._time.toNanoOfDay();

    var offsetNanos = this._offset.totalSeconds() * LocalTime.NANOS_PER_SECOND;
    return nod - offsetNanos;
  };

  _proto._withAdjuster = function _withAdjuster(adjuster) {
    requireNonNull(adjuster, 'adjuster');

    if (adjuster instanceof LocalTime) {
      return this._withLocalTimeOffset(adjuster, this._offset);
    } else if (adjuster instanceof ZoneOffset) {
      return this._withLocalTimeOffset(this._time, adjuster);
    } else if (adjuster instanceof OffsetTime) {
      return adjuster;
    }

    return adjuster.adjustInto(this);
  };

  _proto._withField = function _withField(field, newValue) {
    requireNonNull(field, 'field');

    if (field instanceof ChronoField) {
      if (field === ChronoField.OFFSET_SECONDS) {
        return this._withLocalTimeOffset(this._time, ZoneOffset.ofTotalSeconds(field.checkValidIntValue(newValue)));
      }

      return this._withLocalTimeOffset(this._time.with(field, newValue), this._offset);
    }

    return field.adjustInto(this, newValue);
  };

  _proto._withLocalTimeOffset = function _withLocalTimeOffset(time, offset) {
    if (this._time === time && this._offset.equals(offset)) {
      return this;
    }

    return new OffsetTime(time, offset);
  };

  _proto.compareTo = function compareTo(other) {
    requireNonNull(other, 'other');
    requireInstance(other, OffsetTime, 'other');

    if (this._offset.equals(other._offset)) {
      return this._time.compareTo(other._time);
    }

    var compare = MathUtil.compareNumbers(this._toEpochNano(), other._toEpochNano());

    if (compare === 0) {
      return this._time.compareTo(other._time);
    }

    return compare;
  };

  _proto.equals = function equals(other) {
    if (this === other) {
      return true;
    }

    if (other instanceof OffsetTime) {
      return this._time.equals(other._time) && this._offset.equals(other._offset);
    }

    return false;
  };

  _proto.hashCode = function hashCode() {
    return this._time.hashCode() ^ this._offset.hashCode();
  };

  _proto.toString = function toString() {
    return this._time.toString() + this._offset.toString();
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  return OffsetTime;
}(Temporal);
function _init$8() {
  OffsetTime.MIN = OffsetTime.ofNumbers(0, 0, 0, 0, ZoneOffset.MAX);
  OffsetTime.MAX = OffsetTime.ofNumbers(23, 59, 59, 999999999, ZoneOffset.MIN);
  OffsetTime.FROM = createTemporalQuery('OffsetTime.FROM', function (temporal) {
    return OffsetTime.from(temporal);
  });
}

var ChronoZonedDateTime = function (_Temporal) {
  _inheritsLoose(ChronoZonedDateTime, _Temporal);

  function ChronoZonedDateTime() {
    return _Temporal.apply(this, arguments) || this;
  }

  var _proto = ChronoZonedDateTime.prototype;

  _proto.query = function query(_query) {
    if (_query === TemporalQueries.zoneId() || _query === TemporalQueries.zone()) {
      return this.zone();
    } else if (_query === TemporalQueries.chronology()) {
      return this.toLocalDate().chronology();
    } else if (_query === TemporalQueries.precision()) {
      return ChronoUnit.NANOS;
    } else if (_query === TemporalQueries.offset()) {
      return this.offset();
    } else if (_query === TemporalQueries.localDate()) {
      return LocalDate.ofEpochDay(this.toLocalDate().toEpochDay());
    } else if (_query === TemporalQueries.localTime()) {
      return this.toLocalTime();
    }

    return _Temporal.prototype.query.call(this, _query);
  };

  _proto.format = function format(formatter) {
    requireNonNull(formatter, 'formatter');
    return formatter.format(this);
  };

  _proto.toInstant = function toInstant() {
    return Instant.ofEpochSecond(this.toEpochSecond(), this.toLocalTime().nano());
  };

  _proto.toEpochSecond = function toEpochSecond() {
    var epochDay = this.toLocalDate().toEpochDay();
    var secs = epochDay * 86400 + this.toLocalTime().toSecondOfDay();
    secs -= this.offset().totalSeconds();
    return secs;
  };

  _proto.compareTo = function compareTo(other) {
    requireNonNull(other, 'other');
    var cmp = MathUtil.compareNumbers(this.toEpochSecond(), other.toEpochSecond());

    if (cmp === 0) {
      cmp = this.toLocalTime().nano() - other.toLocalTime().nano();

      if (cmp === 0) {
        cmp = this.toLocalDateTime().compareTo(other.toLocalDateTime());

        if (cmp === 0) {
          cmp = strcmp(this.zone().id(), other.zone().id());
        }
      }
    }

    return cmp;
  };

  _proto.isAfter = function isAfter(other) {
    requireNonNull(other, 'other');
    var thisEpochSec = this.toEpochSecond();
    var otherEpochSec = other.toEpochSecond();
    return thisEpochSec > otherEpochSec || thisEpochSec === otherEpochSec && this.toLocalTime().nano() > other.toLocalTime().nano();
  };

  _proto.isBefore = function isBefore(other) {
    requireNonNull(other, 'other');
    var thisEpochSec = this.toEpochSecond();
    var otherEpochSec = other.toEpochSecond();
    return thisEpochSec < otherEpochSec || thisEpochSec === otherEpochSec && this.toLocalTime().nano() < other.toLocalTime().nano();
  };

  _proto.isEqual = function isEqual(other) {
    requireNonNull(other, 'other');
    return this.toEpochSecond() === other.toEpochSecond() && this.toLocalTime().nano() === other.toLocalTime().nano();
  };

  _proto.equals = function equals(other) {
    if (this === other) {
      return true;
    }

    if (other instanceof ChronoZonedDateTime) {
      return this.compareTo(other) === 0;
    }

    return false;
  };

  return ChronoZonedDateTime;
}(Temporal);

function strcmp(a, b) {
  if (a < b) {
    return -1;
  }

  if (a > b) {
    return 1;
  }

  return 0;
}

var ZonedDateTime = function (_ChronoZonedDateTime) {
  _inheritsLoose(ZonedDateTime, _ChronoZonedDateTime);

  ZonedDateTime.now = function now(clockOrZone) {
    var clock;

    if (clockOrZone instanceof ZoneId) {
      clock = Clock.system(clockOrZone);
    } else {
      clock = clockOrZone == null ? Clock.systemDefaultZone() : clockOrZone;
    }

    return ZonedDateTime.ofInstant(clock.instant(), clock.zone());
  };

  ZonedDateTime.of = function of() {
    if (arguments.length <= 2) {
      return ZonedDateTime.of2.apply(this, arguments);
    } else if (arguments.length === 3 && arguments[0] instanceof LocalDate) {
      return ZonedDateTime.of3.apply(this, arguments);
    } else {
      return ZonedDateTime.of8.apply(this, arguments);
    }
  };

  ZonedDateTime.of3 = function of3(date, time, zone) {
    return ZonedDateTime.of2(LocalDateTime.of(date, time), zone);
  };

  ZonedDateTime.of2 = function of2(localDateTime, zone) {
    return ZonedDateTime.ofLocal(localDateTime, zone, null);
  };

  ZonedDateTime.of8 = function of8(year, month, dayOfMonth, hour, minute, second, nanoOfSecond, zone) {
    var dt = LocalDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoOfSecond);
    return ZonedDateTime.ofLocal(dt, zone, null);
  };

  ZonedDateTime.ofLocal = function ofLocal(localDateTime, zone, preferredOffset) {
    requireNonNull(localDateTime, 'localDateTime');
    requireNonNull(zone, 'zone');

    if (zone instanceof ZoneOffset) {
      return new ZonedDateTime(localDateTime, zone, zone);
    }

    var offset = null;
    var rules = zone.rules();
    var validOffsets = rules.validOffsets(localDateTime);

    if (validOffsets.length === 1) {
      offset = validOffsets[0];
    } else if (validOffsets.length === 0) {
      var trans = rules.transition(localDateTime);
      localDateTime = localDateTime.plusSeconds(trans.duration().seconds());
      offset = trans.offsetAfter();
    } else {
      if (preferredOffset != null && validOffsets.some(function (validOffset) {
        return validOffset.equals(preferredOffset);
      })) {
        offset = preferredOffset;
      } else {
        offset = requireNonNull(validOffsets[0], 'offset');
      }
    }

    return new ZonedDateTime(localDateTime, offset, zone);
  };

  ZonedDateTime.ofInstant = function ofInstant() {
    if (arguments.length === 2) {
      return ZonedDateTime.ofInstant2.apply(this, arguments);
    } else {
      return ZonedDateTime.ofInstant3.apply(this, arguments);
    }
  };

  ZonedDateTime.ofInstant2 = function ofInstant2(instant, zone) {
    requireNonNull(instant, 'instant');
    requireNonNull(zone, 'zone');
    return ZonedDateTime._create(instant.epochSecond(), instant.nano(), zone);
  };

  ZonedDateTime.ofInstant3 = function ofInstant3(localDateTime, offset, zone) {
    requireNonNull(localDateTime, 'localDateTime');
    requireNonNull(offset, 'offset');
    requireNonNull(zone, 'zone');
    return ZonedDateTime._create(localDateTime.toEpochSecond(offset), localDateTime.nano(), zone);
  };

  ZonedDateTime._create = function _create(epochSecond, nanoOfSecond, zone) {
    var rules = zone.rules();
    var instant = Instant.ofEpochSecond(epochSecond, nanoOfSecond);
    var offset = rules.offset(instant);
    var ldt = LocalDateTime.ofEpochSecond(epochSecond, nanoOfSecond, offset);
    return new ZonedDateTime(ldt, offset, zone);
  };

  ZonedDateTime.ofStrict = function ofStrict(localDateTime, offset, zone) {
    requireNonNull(localDateTime, 'localDateTime');
    requireNonNull(offset, 'offset');
    requireNonNull(zone, 'zone');
    var rules = zone.rules();

    if (rules.isValidOffset(localDateTime, offset) === false) {
      var trans = rules.transition(localDateTime);

      if (trans != null && trans.isGap()) {
        throw new DateTimeException("LocalDateTime " + localDateTime + " does not exist in zone " + zone + " due to a gap in the local time-line, typically caused by daylight savings");
      }

      throw new DateTimeException("ZoneOffset \"" + offset + "\" is not valid for LocalDateTime \"" + localDateTime + "\" in zone \"" + zone + "\"");
    }

    return new ZonedDateTime(localDateTime, offset, zone);
  };

  ZonedDateTime.ofLenient = function ofLenient(localDateTime, offset, zone) {
    requireNonNull(localDateTime, 'localDateTime');
    requireNonNull(offset, 'offset');
    requireNonNull(zone, 'zone');

    if (zone instanceof ZoneOffset && offset.equals(zone) === false) {
      throw new IllegalArgumentException('ZoneId must match ZoneOffset');
    }

    return new ZonedDateTime(localDateTime, offset, zone);
  };

  ZonedDateTime.from = function from(temporal) {
    requireNonNull(temporal, 'temporal');

    if (temporal instanceof ZonedDateTime) {
      return temporal;
    }

    var zone = ZoneId.from(temporal);

    if (temporal.isSupported(ChronoField.INSTANT_SECONDS)) {
      var zdt = ZonedDateTime._from(temporal, zone);

      if (zdt != null) return zdt;
    }

    var ldt = LocalDateTime.from(temporal);
    return ZonedDateTime.of2(ldt, zone);
  };

  ZonedDateTime._from = function _from(temporal, zone) {
    try {
      return ZonedDateTime.__from(temporal, zone);
    } catch (ex) {
      if (!(ex instanceof DateTimeException)) throw ex;
    }
  };

  ZonedDateTime.__from = function __from(temporal, zone) {
    var epochSecond = temporal.getLong(ChronoField.INSTANT_SECONDS);
    var nanoOfSecond = temporal.get(ChronoField.NANO_OF_SECOND);
    return ZonedDateTime._create(epochSecond, nanoOfSecond, zone);
  };

  ZonedDateTime.parse = function parse(text, formatter) {
    if (formatter === void 0) {
      formatter = DateTimeFormatter.ISO_ZONED_DATE_TIME;
    }

    requireNonNull(formatter, 'formatter');
    return formatter.parse(text, ZonedDateTime.FROM);
  };

  function ZonedDateTime(dateTime, offset, zone) {
    var _this;

    requireNonNull(dateTime, 'dateTime');
    requireNonNull(offset, 'offset');
    requireNonNull(zone, 'zone');
    _this = _ChronoZonedDateTime.call(this) || this;
    _this._dateTime = dateTime;
    _this._offset = offset;
    _this._zone = zone;
    return _this;
  }

  var _proto = ZonedDateTime.prototype;

  _proto._resolveLocal = function _resolveLocal(newDateTime) {
    requireNonNull(newDateTime, 'newDateTime');
    return ZonedDateTime.ofLocal(newDateTime, this._zone, this._offset);
  };

  _proto._resolveInstant = function _resolveInstant(newDateTime) {
    return ZonedDateTime.ofInstant3(newDateTime, this._offset, this._zone);
  };

  _proto._resolveOffset = function _resolveOffset(offset) {
    if (offset.equals(this._offset) === false && this._zone.rules().isValidOffset(this._dateTime, offset)) {
      return new ZonedDateTime(this._dateTime, offset, this._zone);
    }

    return this;
  };

  _proto.isSupported = function isSupported(fieldOrUnit) {
    if (fieldOrUnit instanceof ChronoField) {
      return true;
    } else if (fieldOrUnit instanceof ChronoUnit) {
      return fieldOrUnit.isDateBased() || fieldOrUnit.isTimeBased();
    }

    return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
  };

  _proto.range = function range(field) {
    if (field instanceof ChronoField) {
      if (field === ChronoField.INSTANT_SECONDS || field === ChronoField.OFFSET_SECONDS) {
        return field.range();
      }

      return this._dateTime.range(field);
    }

    return field.rangeRefinedBy(this);
  };

  _proto.get = function get(field) {
    return this.getLong(field);
  };

  _proto.getLong = function getLong(field) {
    if (field instanceof ChronoField) {
      switch (field) {
        case ChronoField.INSTANT_SECONDS:
          return this.toEpochSecond();

        case ChronoField.OFFSET_SECONDS:
          return this._offset.totalSeconds();
      }

      return this._dateTime.getLong(field);
    }

    requireNonNull(field, 'field');
    return field.getFrom(this);
  };

  _proto.offset = function offset() {
    return this._offset;
  };

  _proto.withEarlierOffsetAtOverlap = function withEarlierOffsetAtOverlap() {
    var trans = this._zone.rules().transition(this._dateTime);

    if (trans != null && trans.isOverlap()) {
      var earlierOffset = trans.offsetBefore();

      if (earlierOffset.equals(this._offset) === false) {
        return new ZonedDateTime(this._dateTime, earlierOffset, this._zone);
      }
    }

    return this;
  };

  _proto.withLaterOffsetAtOverlap = function withLaterOffsetAtOverlap() {
    var trans = this._zone.rules().transition(this.toLocalDateTime());

    if (trans != null) {
      var laterOffset = trans.offsetAfter();

      if (laterOffset.equals(this._offset) === false) {
        return new ZonedDateTime(this._dateTime, laterOffset, this._zone);
      }
    }

    return this;
  };

  _proto.zone = function zone() {
    return this._zone;
  };

  _proto.withZoneSameLocal = function withZoneSameLocal(zone) {
    requireNonNull(zone, 'zone');
    return this._zone.equals(zone) ? this : ZonedDateTime.ofLocal(this._dateTime, zone, this._offset);
  };

  _proto.withZoneSameInstant = function withZoneSameInstant(zone) {
    requireNonNull(zone, 'zone');
    return this._zone.equals(zone) ? this : ZonedDateTime._create(this._dateTime.toEpochSecond(this._offset), this._dateTime.nano(), zone);
  };

  _proto.withFixedOffsetZone = function withFixedOffsetZone() {
    return this._zone.equals(this._offset) ? this : new ZonedDateTime(this._dateTime, this._offset, this._offset);
  };

  _proto.year = function year() {
    return this._dateTime.year();
  };

  _proto.monthValue = function monthValue() {
    return this._dateTime.monthValue();
  };

  _proto.month = function month() {
    return this._dateTime.month();
  };

  _proto.dayOfMonth = function dayOfMonth() {
    return this._dateTime.dayOfMonth();
  };

  _proto.dayOfYear = function dayOfYear() {
    return this._dateTime.dayOfYear();
  };

  _proto.dayOfWeek = function dayOfWeek() {
    return this._dateTime.dayOfWeek();
  };

  _proto.hour = function hour() {
    return this._dateTime.hour();
  };

  _proto.minute = function minute() {
    return this._dateTime.minute();
  };

  _proto.second = function second() {
    return this._dateTime.second();
  };

  _proto.nano = function nano() {
    return this._dateTime.nano();
  };

  _proto._withAdjuster = function _withAdjuster(adjuster) {
    if (adjuster instanceof LocalDate) {
      return this._resolveLocal(LocalDateTime.of(adjuster, this._dateTime.toLocalTime()));
    } else if (adjuster instanceof LocalTime) {
      return this._resolveLocal(LocalDateTime.of(this._dateTime.toLocalDate(), adjuster));
    } else if (adjuster instanceof LocalDateTime) {
      return this._resolveLocal(adjuster);
    } else if (adjuster instanceof Instant) {
      var instant = adjuster;
      return ZonedDateTime._create(instant.epochSecond(), instant.nano(), this._zone);
    } else if (adjuster instanceof ZoneOffset) {
      return this._resolveOffset(adjuster);
    }

    return _ChronoZonedDateTime.prototype._withAdjuster.call(this, adjuster);
  };

  _proto._withField = function _withField(field, newValue) {
    if (field instanceof ChronoField) {
      switch (field) {
        case ChronoField.INSTANT_SECONDS:
          return ZonedDateTime._create(newValue, this.nano(), this._zone);

        case ChronoField.OFFSET_SECONDS:
          {
            var offset = ZoneOffset.ofTotalSeconds(field.checkValidIntValue(newValue));
            return this._resolveOffset(offset);
          }
      }

      return this._resolveLocal(this._dateTime.with(field, newValue));
    }

    return field.adjustInto(this, newValue);
  };

  _proto.withYear = function withYear(year) {
    return this._resolveLocal(this._dateTime.withYear(year));
  };

  _proto.withMonth = function withMonth(month) {
    return this._resolveLocal(this._dateTime.withMonth(month));
  };

  _proto.withDayOfMonth = function withDayOfMonth(dayOfMonth) {
    return this._resolveLocal(this._dateTime.withDayOfMonth(dayOfMonth));
  };

  _proto.withDayOfYear = function withDayOfYear(dayOfYear) {
    return this._resolveLocal(this._dateTime.withDayOfYear(dayOfYear));
  };

  _proto.withHour = function withHour(hour) {
    return this._resolveLocal(this._dateTime.withHour(hour));
  };

  _proto.withMinute = function withMinute(minute) {
    return this._resolveLocal(this._dateTime.withMinute(minute));
  };

  _proto.withSecond = function withSecond(second) {
    return this._resolveLocal(this._dateTime.withSecond(second));
  };

  _proto.withNano = function withNano(nanoOfSecond) {
    return this._resolveLocal(this._dateTime.withNano(nanoOfSecond));
  };

  _proto.truncatedTo = function truncatedTo(unit) {
    return this._resolveLocal(this._dateTime.truncatedTo(unit));
  };

  _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
    if (unit instanceof ChronoUnit) {
      if (unit.isDateBased()) {
        return this._resolveLocal(this._dateTime.plus(amountToAdd, unit));
      } else {
        return this._resolveInstant(this._dateTime.plus(amountToAdd, unit));
      }
    }

    requireNonNull(unit, 'unit');
    return unit.addTo(this, amountToAdd);
  };

  _proto.plusYears = function plusYears(years) {
    return this._resolveLocal(this._dateTime.plusYears(years));
  };

  _proto.plusMonths = function plusMonths(months) {
    return this._resolveLocal(this._dateTime.plusMonths(months));
  };

  _proto.plusWeeks = function plusWeeks(weeks) {
    return this._resolveLocal(this._dateTime.plusWeeks(weeks));
  };

  _proto.plusDays = function plusDays(days) {
    return this._resolveLocal(this._dateTime.plusDays(days));
  };

  _proto.plusHours = function plusHours(hours) {
    return this._resolveInstant(this._dateTime.plusHours(hours));
  };

  _proto.plusMinutes = function plusMinutes(minutes) {
    return this._resolveInstant(this._dateTime.plusMinutes(minutes));
  };

  _proto.plusSeconds = function plusSeconds(seconds) {
    return this._resolveInstant(this._dateTime.plusSeconds(seconds));
  };

  _proto.plusNanos = function plusNanos(nanos) {
    return this._resolveInstant(this._dateTime.plusNanos(nanos));
  };

  _proto._minusUnit = function _minusUnit(amountToSubtract, unit) {
    return this._plusUnit(-1 * amountToSubtract, unit);
  };

  _proto.minusYears = function minusYears(years) {
    return this.plusYears(-1 * years);
  };

  _proto.minusMonths = function minusMonths(months) {
    return this.plusMonths(-1 * months);
  };

  _proto.minusWeeks = function minusWeeks(weeks) {
    return this.plusWeeks(-1 * weeks);
  };

  _proto.minusDays = function minusDays(days) {
    return this.plusDays(-1 * days);
  };

  _proto.minusHours = function minusHours(hours) {
    return this.plusHours(-1 * hours);
  };

  _proto.minusMinutes = function minusMinutes(minutes) {
    return this.plusMinutes(-1 * minutes);
  };

  _proto.minusSeconds = function minusSeconds(seconds) {
    return this.plusSeconds(-1 * seconds);
  };

  _proto.minusNanos = function minusNanos(nanos) {
    return this.plusNanos(-1 * nanos);
  };

  _proto.query = function query(_query) {
    if (_query === TemporalQueries.localDate()) {
      return this.toLocalDate();
    }

    requireNonNull(_query, 'query');
    return _ChronoZonedDateTime.prototype.query.call(this, _query);
  };

  _proto.until = function until(endExclusive, unit) {
    var end = ZonedDateTime.from(endExclusive);

    if (unit instanceof ChronoUnit) {
      end = end.withZoneSameInstant(this._zone);

      if (unit.isDateBased()) {
        return this._dateTime.until(end._dateTime, unit);
      } else {
        var difference = this._offset.totalSeconds() - end._offset.totalSeconds();

        var adjustedEnd = end._dateTime.plusSeconds(difference);

        return this._dateTime.until(adjustedEnd, unit);
      }
    }

    return unit.between(this, end);
  };

  _proto.toLocalDateTime = function toLocalDateTime() {
    return this._dateTime;
  };

  _proto.toLocalDate = function toLocalDate() {
    return this._dateTime.toLocalDate();
  };

  _proto.toLocalTime = function toLocalTime() {
    return this._dateTime.toLocalTime();
  };

  _proto.toOffsetDateTime = function toOffsetDateTime() {
    return OffsetDateTime.of(this._dateTime, this._offset);
  };

  _proto.equals = function equals(other) {
    if (this === other) {
      return true;
    }

    if (other instanceof ZonedDateTime) {
      return this._dateTime.equals(other._dateTime) && this._offset.equals(other._offset) && this._zone.equals(other._zone);
    }

    return false;
  };

  _proto.hashCode = function hashCode() {
    return MathUtil.hashCode(this._dateTime.hashCode(), this._offset.hashCode(), this._zone.hashCode());
  };

  _proto.toString = function toString() {
    var str = this._dateTime.toString() + this._offset.toString();

    if (this._offset !== this._zone) {
      str += "[" + this._zone.toString() + "]";
    }

    return str;
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  _proto.format = function format(formatter) {
    return _ChronoZonedDateTime.prototype.format.call(this, formatter);
  };

  return ZonedDateTime;
}(ChronoZonedDateTime);
function _init$7() {
  ZonedDateTime.FROM = createTemporalQuery('ZonedDateTime.FROM', function (temporal) {
    return ZonedDateTime.from(temporal);
  });
}

var OffsetDateTime = function (_Temporal) {
  _inheritsLoose(OffsetDateTime, _Temporal);

  OffsetDateTime.from = function from(temporal) {
    requireNonNull(temporal, 'temporal');

    if (temporal instanceof OffsetDateTime) {
      return temporal;
    }

    try {
      var offset = ZoneOffset.from(temporal);

      try {
        var ldt = LocalDateTime.from(temporal);
        return OffsetDateTime.of(ldt, offset);
      } catch (_) {
        var instant = Instant.from(temporal);
        return OffsetDateTime.ofInstant(instant, offset);
      }
    } catch (ex) {
      throw new DateTimeException("Unable to obtain OffsetDateTime TemporalAccessor: " + temporal + ", type " + (temporal.constructor != null ? temporal.constructor.name : ''));
    }
  };

  OffsetDateTime.now = function now(clockOrZone) {
    if (arguments.length === 0) {
      return OffsetDateTime.now(Clock.systemDefaultZone());
    } else {
      requireNonNull(clockOrZone, 'clockOrZone');

      if (clockOrZone instanceof ZoneId) {
        return OffsetDateTime.now(Clock.system(clockOrZone));
      } else if (clockOrZone instanceof Clock) {
        var now = clockOrZone.instant();
        return OffsetDateTime.ofInstant(now, clockOrZone.zone().rules().offset(now));
      } else {
        throw new IllegalArgumentException('clockOrZone must be an instance of ZoneId or Clock');
      }
    }
  };

  OffsetDateTime.of = function of() {
    if (arguments.length <= 2) {
      return OffsetDateTime.ofDateTime.apply(this, arguments);
    } else if (arguments.length === 3) {
      return OffsetDateTime.ofDateAndTime.apply(this, arguments);
    } else {
      return OffsetDateTime.ofNumbers.apply(this, arguments);
    }
  };

  OffsetDateTime.ofDateTime = function ofDateTime(dateTime, offset) {
    return new OffsetDateTime(dateTime, offset);
  };

  OffsetDateTime.ofDateAndTime = function ofDateAndTime(date, time, offset) {
    var dt = LocalDateTime.of(date, time);
    return new OffsetDateTime(dt, offset);
  };

  OffsetDateTime.ofNumbers = function ofNumbers(year, month, dayOfMonth, hour, minute, second, nanoOfSecond, offset) {
    if (hour === void 0) {
      hour = 0;
    }

    if (minute === void 0) {
      minute = 0;
    }

    if (second === void 0) {
      second = 0;
    }

    if (nanoOfSecond === void 0) {
      nanoOfSecond = 0;
    }

    var dt = LocalDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoOfSecond);
    return new OffsetDateTime(dt, offset);
  };

  OffsetDateTime.ofInstant = function ofInstant(instant, zone) {
    requireNonNull(instant, 'instant');
    requireNonNull(zone, 'zone');
    var rules = zone.rules();
    var offset = rules.offset(instant);
    var ldt = LocalDateTime.ofEpochSecond(instant.epochSecond(), instant.nano(), offset);
    return new OffsetDateTime(ldt, offset);
  };

  OffsetDateTime.parse = function parse(text, formatter) {
    if (formatter === void 0) {
      formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
    }

    requireNonNull(formatter, 'formatter');
    return formatter.parse(text, OffsetDateTime.FROM);
  };

  function OffsetDateTime(dateTime, offset) {
    var _this;

    _this = _Temporal.call(this) || this;
    requireNonNull(dateTime, 'dateTime');
    requireInstance(dateTime, LocalDateTime, 'dateTime');
    requireNonNull(offset, 'offset');
    requireInstance(offset, ZoneOffset, 'offset');
    _this._dateTime = dateTime;
    _this._offset = offset;
    return _this;
  }

  var _proto = OffsetDateTime.prototype;

  _proto.adjustInto = function adjustInto(temporal) {
    return temporal.with(ChronoField.EPOCH_DAY, this.toLocalDate().toEpochDay()).with(ChronoField.NANO_OF_DAY, this.toLocalTime().toNanoOfDay()).with(ChronoField.OFFSET_SECONDS, this.offset().totalSeconds());
  };

  _proto.until = function until(endExclusive, unit) {
    var end = OffsetDateTime.from(endExclusive);

    if (unit instanceof ChronoUnit) {
      end = end.withOffsetSameInstant(this._offset);
      return this._dateTime.until(end._dateTime, unit);
    }

    return unit.between(this, end);
  };

  _proto.atZoneSameInstant = function atZoneSameInstant(zone) {
    return ZonedDateTime.ofInstant(this._dateTime, this._offset, zone);
  };

  _proto.atZoneSimilarLocal = function atZoneSimilarLocal(zone) {
    return ZonedDateTime.ofLocal(this._dateTime, zone, this._offset);
  };

  _proto.query = function query(_query) {
    requireNonNull(_query, 'query');

    if (_query === TemporalQueries.chronology()) {
      return IsoChronology.INSTANCE;
    } else if (_query === TemporalQueries.precision()) {
      return ChronoUnit.NANOS;
    } else if (_query === TemporalQueries.offset() || _query === TemporalQueries.zone()) {
      return this.offset();
    } else if (_query === TemporalQueries.localDate()) {
      return this.toLocalDate();
    } else if (_query === TemporalQueries.localTime()) {
      return this.toLocalTime();
    } else if (_query === TemporalQueries.zoneId()) {
      return null;
    }

    return _Temporal.prototype.query.call(this, _query);
  };

  _proto.get = function get(field) {
    if (field instanceof ChronoField) {
      switch (field) {
        case ChronoField.INSTANT_SECONDS:
          throw new DateTimeException("Field too large for an int: " + field);

        case ChronoField.OFFSET_SECONDS:
          return this.offset().totalSeconds();
      }

      return this._dateTime.get(field);
    }

    return _Temporal.prototype.get.call(this, field);
  };

  _proto.getLong = function getLong(field) {
    if (field instanceof ChronoField) {
      switch (field) {
        case ChronoField.INSTANT_SECONDS:
          return this.toEpochSecond();

        case ChronoField.OFFSET_SECONDS:
          return this.offset().totalSeconds();
      }

      return this._dateTime.getLong(field);
    }

    return field.getFrom(this);
  };

  _proto.offset = function offset() {
    return this._offset;
  };

  _proto.year = function year() {
    return this._dateTime.year();
  };

  _proto.monthValue = function monthValue() {
    return this._dateTime.monthValue();
  };

  _proto.month = function month() {
    return this._dateTime.month();
  };

  _proto.dayOfMonth = function dayOfMonth() {
    return this._dateTime.dayOfMonth();
  };

  _proto.dayOfYear = function dayOfYear() {
    return this._dateTime.dayOfYear();
  };

  _proto.dayOfWeek = function dayOfWeek() {
    return this._dateTime.dayOfWeek();
  };

  _proto.hour = function hour() {
    return this._dateTime.hour();
  };

  _proto.minute = function minute() {
    return this._dateTime.minute();
  };

  _proto.second = function second() {
    return this._dateTime.second();
  };

  _proto.nano = function nano() {
    return this._dateTime.nano();
  };

  _proto.toLocalDateTime = function toLocalDateTime() {
    return this._dateTime;
  };

  _proto.toLocalDate = function toLocalDate() {
    return this._dateTime.toLocalDate();
  };

  _proto.toLocalTime = function toLocalTime() {
    return this._dateTime.toLocalTime();
  };

  _proto.toOffsetTime = function toOffsetTime() {
    return OffsetTime.of(this._dateTime.toLocalTime(), this._offset);
  };

  _proto.toZonedDateTime = function toZonedDateTime() {
    return ZonedDateTime.of(this._dateTime, this._offset);
  };

  _proto.toInstant = function toInstant() {
    return this._dateTime.toInstant(this._offset);
  };

  _proto.toEpochSecond = function toEpochSecond() {
    return this._dateTime.toEpochSecond(this._offset);
  };

  _proto.isSupported = function isSupported(fieldOrUnit) {
    if (fieldOrUnit instanceof ChronoField) {
      return fieldOrUnit.isDateBased() || fieldOrUnit.isTimeBased();
    }

    if (fieldOrUnit instanceof ChronoUnit) {
      return fieldOrUnit.isDateBased() || fieldOrUnit.isTimeBased();
    }

    return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
  };

  _proto.range = function range(field) {
    if (field instanceof ChronoField) {
      if (field === ChronoField.INSTANT_SECONDS || field === ChronoField.OFFSET_SECONDS) {
        return field.range();
      }

      return this._dateTime.range(field);
    }

    return field.rangeRefinedBy(this);
  };

  _proto._withAdjuster = function _withAdjuster(adjuster) {
    requireNonNull(adjuster);

    if (adjuster instanceof LocalDate || adjuster instanceof LocalTime || adjuster instanceof LocalDateTime) {
      return this._withDateTimeOffset(this._dateTime.with(adjuster), this._offset);
    } else if (adjuster instanceof Instant) {
      return OffsetDateTime.ofInstant(adjuster, this._offset);
    } else if (adjuster instanceof ZoneOffset) {
      return this._withDateTimeOffset(this._dateTime, adjuster);
    } else if (adjuster instanceof OffsetDateTime) {
      return adjuster;
    }

    return adjuster.adjustInto(this);
  };

  _proto._withField = function _withField(field, newValue) {
    requireNonNull(field);

    if (field instanceof ChronoField) {
      var f = field;

      switch (f) {
        case ChronoField.INSTANT_SECONDS:
          return OffsetDateTime.ofInstant(Instant.ofEpochSecond(newValue, this.nano()), this._offset);

        case ChronoField.OFFSET_SECONDS:
          {
            return this._withDateTimeOffset(this._dateTime, ZoneOffset.ofTotalSeconds(f.checkValidIntValue(newValue)));
          }
      }

      return this._withDateTimeOffset(this._dateTime.with(field, newValue), this._offset);
    }

    return field.adjustInto(this, newValue);
  };

  _proto._withDateTimeOffset = function _withDateTimeOffset(dateTime, offset) {
    if (this._dateTime === dateTime && this._offset.equals(offset)) {
      return this;
    }

    return new OffsetDateTime(dateTime, offset);
  };

  _proto.withYear = function withYear(year) {
    return this._withDateTimeOffset(this._dateTime.withYear(year), this._offset);
  };

  _proto.withMonth = function withMonth(month) {
    return this._withDateTimeOffset(this._dateTime.withMonth(month), this._offset);
  };

  _proto.withDayOfMonth = function withDayOfMonth(dayOfMonth) {
    return this._withDateTimeOffset(this._dateTime.withDayOfMonth(dayOfMonth), this._offset);
  };

  _proto.withDayOfYear = function withDayOfYear(dayOfYear) {
    return this._withDateTimeOffset(this._dateTime.withDayOfYear(dayOfYear), this._offset);
  };

  _proto.withHour = function withHour(hour) {
    return this._withDateTimeOffset(this._dateTime.withHour(hour), this._offset);
  };

  _proto.withMinute = function withMinute(minute) {
    return this._withDateTimeOffset(this._dateTime.withMinute(minute), this._offset);
  };

  _proto.withSecond = function withSecond(second) {
    return this._withDateTimeOffset(this._dateTime.withSecond(second), this._offset);
  };

  _proto.withNano = function withNano(nanoOfSecond) {
    return this._withDateTimeOffset(this._dateTime.withNano(nanoOfSecond), this._offset);
  };

  _proto.withOffsetSameLocal = function withOffsetSameLocal(offset) {
    requireNonNull(offset, 'offset');
    return this._withDateTimeOffset(this._dateTime, offset);
  };

  _proto.withOffsetSameInstant = function withOffsetSameInstant(offset) {
    requireNonNull(offset, 'offset');

    if (offset.equals(this._offset)) {
      return this;
    }

    var difference = offset.totalSeconds() - this._offset.totalSeconds();

    var adjusted = this._dateTime.plusSeconds(difference);

    return new OffsetDateTime(adjusted, offset);
  };

  _proto.truncatedTo = function truncatedTo(unit) {
    return this._withDateTimeOffset(this._dateTime.truncatedTo(unit), this._offset);
  };

  _proto._plusAmount = function _plusAmount(amount) {
    requireNonNull(amount, 'amount');
    return amount.addTo(this);
  };

  _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
    if (unit instanceof ChronoUnit) {
      return this._withDateTimeOffset(this._dateTime.plus(amountToAdd, unit), this._offset);
    }

    return unit.addTo(this, amountToAdd);
  };

  _proto.plusYears = function plusYears(years) {
    return this._withDateTimeOffset(this._dateTime.plusYears(years), this._offset);
  };

  _proto.plusMonths = function plusMonths(months) {
    return this._withDateTimeOffset(this._dateTime.plusMonths(months), this._offset);
  };

  _proto.plusWeeks = function plusWeeks(weeks) {
    return this._withDateTimeOffset(this._dateTime.plusWeeks(weeks), this._offset);
  };

  _proto.plusDays = function plusDays(days) {
    return this._withDateTimeOffset(this._dateTime.plusDays(days), this._offset);
  };

  _proto.plusHours = function plusHours(hours) {
    return this._withDateTimeOffset(this._dateTime.plusHours(hours), this._offset);
  };

  _proto.plusMinutes = function plusMinutes(minutes) {
    return this._withDateTimeOffset(this._dateTime.plusMinutes(minutes), this._offset);
  };

  _proto.plusSeconds = function plusSeconds(seconds) {
    return this._withDateTimeOffset(this._dateTime.plusSeconds(seconds), this._offset);
  };

  _proto.plusNanos = function plusNanos(nanos) {
    return this._withDateTimeOffset(this._dateTime.plusNanos(nanos), this._offset);
  };

  _proto._minusAmount = function _minusAmount(amount) {
    requireNonNull(amount);
    return amount.subtractFrom(this);
  };

  _proto._minusUnit = function _minusUnit(amountToSubtract, unit) {
    return this.plus(-1 * amountToSubtract, unit);
  };

  _proto.minusYears = function minusYears(years) {
    return this._withDateTimeOffset(this._dateTime.minusYears(years), this._offset);
  };

  _proto.minusMonths = function minusMonths(months) {
    return this._withDateTimeOffset(this._dateTime.minusMonths(months), this._offset);
  };

  _proto.minusWeeks = function minusWeeks(weeks) {
    return this._withDateTimeOffset(this._dateTime.minusWeeks(weeks), this._offset);
  };

  _proto.minusDays = function minusDays(days) {
    return this._withDateTimeOffset(this._dateTime.minusDays(days), this._offset);
  };

  _proto.minusHours = function minusHours(hours) {
    return this._withDateTimeOffset(this._dateTime.minusHours(hours), this._offset);
  };

  _proto.minusMinutes = function minusMinutes(minutes) {
    return this._withDateTimeOffset(this._dateTime.minusMinutes(minutes), this._offset);
  };

  _proto.minusSeconds = function minusSeconds(seconds) {
    return this._withDateTimeOffset(this._dateTime.minusSeconds(seconds), this._offset);
  };

  _proto.minusNanos = function minusNanos(nanos) {
    return this._withDateTimeOffset(this._dateTime.minusNanos(nanos), this._offset);
  };

  _proto.compareTo = function compareTo(other) {
    requireNonNull(other, 'other');
    requireInstance(other, OffsetDateTime, 'other');

    if (this.offset().equals(other.offset())) {
      return this.toLocalDateTime().compareTo(other.toLocalDateTime());
    }

    var cmp = MathUtil.compareNumbers(this.toEpochSecond(), other.toEpochSecond());

    if (cmp === 0) {
      cmp = this.toLocalTime().nano() - other.toLocalTime().nano();

      if (cmp === 0) {
        cmp = this.toLocalDateTime().compareTo(other.toLocalDateTime());
      }
    }

    return cmp;
  };

  _proto.isAfter = function isAfter(other) {
    requireNonNull(other, 'other');
    var thisEpochSec = this.toEpochSecond();
    var otherEpochSec = other.toEpochSecond();
    return thisEpochSec > otherEpochSec || thisEpochSec === otherEpochSec && this.toLocalTime().nano() > other.toLocalTime().nano();
  };

  _proto.isBefore = function isBefore(other) {
    requireNonNull(other, 'other');
    var thisEpochSec = this.toEpochSecond();
    var otherEpochSec = other.toEpochSecond();
    return thisEpochSec < otherEpochSec || thisEpochSec === otherEpochSec && this.toLocalTime().nano() < other.toLocalTime().nano();
  };

  _proto.isEqual = function isEqual(other) {
    requireNonNull(other, 'other');
    return this.toEpochSecond() === other.toEpochSecond() && this.toLocalTime().nano() === other.toLocalTime().nano();
  };

  _proto.equals = function equals(other) {
    if (this === other) {
      return true;
    }

    if (other instanceof OffsetDateTime) {
      return this._dateTime.equals(other._dateTime) && this._offset.equals(other._offset);
    }

    return false;
  };

  _proto.hashCode = function hashCode() {
    return this._dateTime.hashCode() ^ this._offset.hashCode();
  };

  _proto.toString = function toString() {
    return this._dateTime.toString() + this._offset.toString();
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  _proto.format = function format(formatter) {
    requireNonNull(formatter, 'formatter');
    return formatter.format(this);
  };

  return OffsetDateTime;
}(Temporal);
function _init$6() {
  OffsetDateTime.MIN = LocalDateTime.MIN.atOffset(ZoneOffset.MAX);
  OffsetDateTime.MAX = LocalDateTime.MAX.atOffset(ZoneOffset.MIN);
  OffsetDateTime.FROM = createTemporalQuery('OffsetDateTime.FROM', function (temporal) {
    return OffsetDateTime.from(temporal);
  });
}

var DAYS_PER_CYCLE = 146097;
var DAYS_0000_TO_1970 = DAYS_PER_CYCLE * 5 - (30 * 365 + 7);
var LocalDate = function (_ChronoLocalDate) {
  _inheritsLoose(LocalDate, _ChronoLocalDate);

  LocalDate.now = function now(clockOrZone) {
    var clock;

    if (clockOrZone == null) {
      clock = Clock.systemDefaultZone();
    } else if (clockOrZone instanceof ZoneId) {
      clock = Clock.system(clockOrZone);
    } else {
      clock = clockOrZone;
    }

    return LocalDate.ofInstant(clock.instant(), clock.zone());
  };

  LocalDate.ofInstant = function ofInstant(instant, zone) {
    if (zone === void 0) {
      zone = ZoneId.systemDefault();
    }

    requireNonNull(instant, 'instant');
    var offset = zone.rules().offset(instant);
    var epochSec = instant.epochSecond() + offset.totalSeconds();
    var epochDay = MathUtil.floorDiv(epochSec, LocalTime.SECONDS_PER_DAY);
    return LocalDate.ofEpochDay(epochDay);
  };

  LocalDate.of = function of(year, month, dayOfMonth) {
    return new LocalDate(year, month, dayOfMonth);
  };

  LocalDate.ofYearDay = function ofYearDay(year, dayOfYear) {
    ChronoField.YEAR.checkValidValue(year);
    var leap = IsoChronology.isLeapYear(year);

    if (dayOfYear === 366 && leap === false) {
      assert(false, "Invalid date 'DayOfYear 366' as '" + year + "' is not a leap year", DateTimeException);
    }

    var moy = Month.of(Math.floor((dayOfYear - 1) / 31 + 1));
    var monthEnd = moy.firstDayOfYear(leap) + moy.length(leap) - 1;

    if (dayOfYear > monthEnd) {
      moy = moy.plus(1);
    }

    var dom = dayOfYear - moy.firstDayOfYear(leap) + 1;
    return new LocalDate(year, moy.value(), dom);
  };

  LocalDate.ofEpochDay = function ofEpochDay(epochDay) {
    if (epochDay === void 0) {
      epochDay = 0;
    }

    var adjust, adjustCycles, doyEst, yearEst, zeroDay;
    zeroDay = epochDay + DAYS_0000_TO_1970;
    zeroDay -= 60;
    adjust = 0;

    if (zeroDay < 0) {
      adjustCycles = MathUtil.intDiv(zeroDay + 1, DAYS_PER_CYCLE) - 1;
      adjust = adjustCycles * 400;
      zeroDay += -adjustCycles * DAYS_PER_CYCLE;
    }

    yearEst = MathUtil.intDiv(400 * zeroDay + 591, DAYS_PER_CYCLE);
    doyEst = zeroDay - (365 * yearEst + MathUtil.intDiv(yearEst, 4) - MathUtil.intDiv(yearEst, 100) + MathUtil.intDiv(yearEst, 400));

    if (doyEst < 0) {
      yearEst--;
      doyEst = zeroDay - (365 * yearEst + MathUtil.intDiv(yearEst, 4) - MathUtil.intDiv(yearEst, 100) + MathUtil.intDiv(yearEst, 400));
    }

    yearEst += adjust;
    var marchDoy0 = doyEst;
    var marchMonth0 = MathUtil.intDiv(marchDoy0 * 5 + 2, 153);
    var month = (marchMonth0 + 2) % 12 + 1;
    var dom = marchDoy0 - MathUtil.intDiv(marchMonth0 * 306 + 5, 10) + 1;
    yearEst += MathUtil.intDiv(marchMonth0, 10);
    var year = yearEst;
    return new LocalDate(year, month, dom);
  };

  LocalDate.from = function from(temporal) {
    requireNonNull(temporal, 'temporal');
    var date = temporal.query(TemporalQueries.localDate());

    if (date == null) {
      throw new DateTimeException("Unable to obtain LocalDate from TemporalAccessor: " + temporal + ", type " + (temporal.constructor != null ? temporal.constructor.name : ''));
    }

    return date;
  };

  LocalDate.parse = function parse(text, formatter) {
    if (formatter === void 0) {
      formatter = DateTimeFormatter.ISO_LOCAL_DATE;
    }

    assert(formatter != null, 'formatter', NullPointerException);
    return formatter.parse(text, LocalDate.FROM);
  };

  LocalDate._resolvePreviousValid = function _resolvePreviousValid(year, month, day) {
    switch (month) {
      case 2:
        day = Math.min(day, IsoChronology.isLeapYear(year) ? 29 : 28);
        break;

      case 4:
      case 6:
      case 9:
      case 11:
        day = Math.min(day, 30);
        break;
    }

    return LocalDate.of(year, month, day);
  };

  function LocalDate(year, month, dayOfMonth) {
    var _this;

    _this = _ChronoLocalDate.call(this) || this;
    requireNonNull(year, 'year');
    requireNonNull(month, 'month');
    requireNonNull(dayOfMonth, 'dayOfMonth');

    if (month instanceof Month) {
      month = month.value();
    }

    _this._year = MathUtil.safeToInt(year);
    _this._month = MathUtil.safeToInt(month);
    _this._day = MathUtil.safeToInt(dayOfMonth);

    LocalDate._validate(_this._year, _this._month, _this._day);

    return _this;
  }

  LocalDate._validate = function _validate(year, month, dayOfMonth) {
    var dom;
    ChronoField.YEAR.checkValidValue(year);
    ChronoField.MONTH_OF_YEAR.checkValidValue(month);
    ChronoField.DAY_OF_MONTH.checkValidValue(dayOfMonth);

    if (dayOfMonth > 28) {
      dom = 31;

      switch (month) {
        case 2:
          dom = IsoChronology.isLeapYear(year) ? 29 : 28;
          break;

        case 4:
        case 6:
        case 9:
        case 11:
          dom = 30;
      }

      if (dayOfMonth > dom) {
        if (dayOfMonth === 29) {
          assert(false, "Invalid date 'February 29' as '" + year + "' is not a leap year", DateTimeException);
        } else {
          assert(false, "Invalid date '" + year + "' '" + month + "' '" + dayOfMonth + "'", DateTimeException);
        }
      }
    }
  };

  var _proto = LocalDate.prototype;

  _proto.isSupported = function isSupported(field) {
    return _ChronoLocalDate.prototype.isSupported.call(this, field);
  };

  _proto.range = function range(field) {
    if (field instanceof ChronoField) {
      if (field.isDateBased()) {
        switch (field) {
          case ChronoField.DAY_OF_MONTH:
            return ValueRange.of(1, this.lengthOfMonth());

          case ChronoField.DAY_OF_YEAR:
            return ValueRange.of(1, this.lengthOfYear());

          case ChronoField.ALIGNED_WEEK_OF_MONTH:
            return ValueRange.of(1, this.month() === Month.FEBRUARY && this.isLeapYear() === false ? 4 : 5);

          case ChronoField.YEAR_OF_ERA:
            return this._year <= 0 ? ValueRange.of(1, Year.MAX_VALUE + 1) : ValueRange.of(1, Year.MAX_VALUE);
        }

        return field.range();
      }

      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.rangeRefinedBy(this);
  };

  _proto.get = function get(field) {
    return this.getLong(field);
  };

  _proto.getLong = function getLong(field) {
    assert(field != null, '', NullPointerException);

    if (field instanceof ChronoField) {
      return this._get0(field);
    }

    return field.getFrom(this);
  };

  _proto._get0 = function _get0(field) {
    switch (field) {
      case ChronoField.DAY_OF_WEEK:
        return this.dayOfWeek().value();

      case ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH:
        return MathUtil.intMod(this._day - 1, 7) + 1;

      case ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR:
        return MathUtil.intMod(this.dayOfYear() - 1, 7) + 1;

      case ChronoField.DAY_OF_MONTH:
        return this._day;

      case ChronoField.DAY_OF_YEAR:
        return this.dayOfYear();

      case ChronoField.EPOCH_DAY:
        return this.toEpochDay();

      case ChronoField.ALIGNED_WEEK_OF_MONTH:
        return MathUtil.intDiv(this._day - 1, 7) + 1;

      case ChronoField.ALIGNED_WEEK_OF_YEAR:
        return MathUtil.intDiv(this.dayOfYear() - 1, 7) + 1;

      case ChronoField.MONTH_OF_YEAR:
        return this._month;

      case ChronoField.PROLEPTIC_MONTH:
        return this._prolepticMonth();

      case ChronoField.YEAR_OF_ERA:
        return this._year >= 1 ? this._year : 1 - this._year;

      case ChronoField.YEAR:
        return this._year;

      case ChronoField.ERA:
        return this._year >= 1 ? 1 : 0;
    }

    throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
  };

  _proto._prolepticMonth = function _prolepticMonth() {
    return this._year * 12 + (this._month - 1);
  };

  _proto.chronology = function chronology() {
    return IsoChronology.INSTANCE;
  };

  _proto.year = function year() {
    return this._year;
  };

  _proto.monthValue = function monthValue() {
    return this._month;
  };

  _proto.month = function month() {
    return Month.of(this._month);
  };

  _proto.dayOfMonth = function dayOfMonth() {
    return this._day;
  };

  _proto.dayOfYear = function dayOfYear() {
    return this.month().firstDayOfYear(this.isLeapYear()) + this._day - 1;
  };

  _proto.dayOfWeek = function dayOfWeek() {
    var dow0 = MathUtil.floorMod(this.toEpochDay() + 3, 7);
    return DayOfWeek.of(dow0 + 1);
  };

  _proto.isLeapYear = function isLeapYear() {
    return IsoChronology.isLeapYear(this._year);
  };

  _proto.lengthOfMonth = function lengthOfMonth() {
    switch (this._month) {
      case 2:
        return this.isLeapYear() ? 29 : 28;

      case 4:
      case 6:
      case 9:
      case 11:
        return 30;

      default:
        return 31;
    }
  };

  _proto.lengthOfYear = function lengthOfYear() {
    return this.isLeapYear() ? 366 : 365;
  };

  _proto._withAdjuster = function _withAdjuster(adjuster) {
    requireNonNull(adjuster, 'adjuster');

    if (adjuster instanceof LocalDate) {
      return adjuster;
    }

    return _ChronoLocalDate.prototype._withAdjuster.call(this, adjuster);
  };

  _proto._withField = function _withField(field, newValue) {
    assert(field != null, 'field', NullPointerException);

    if (field instanceof ChronoField) {
      var f = field;
      f.checkValidValue(newValue);

      switch (f) {
        case ChronoField.DAY_OF_WEEK:
          return this.plusDays(newValue - this.dayOfWeek().value());

        case ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH:
          return this.plusDays(newValue - this.getLong(ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH));

        case ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR:
          return this.plusDays(newValue - this.getLong(ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR));

        case ChronoField.DAY_OF_MONTH:
          return this.withDayOfMonth(newValue);

        case ChronoField.DAY_OF_YEAR:
          return this.withDayOfYear(newValue);

        case ChronoField.EPOCH_DAY:
          return LocalDate.ofEpochDay(newValue);

        case ChronoField.ALIGNED_WEEK_OF_MONTH:
          return this.plusWeeks(newValue - this.getLong(ChronoField.ALIGNED_WEEK_OF_MONTH));

        case ChronoField.ALIGNED_WEEK_OF_YEAR:
          return this.plusWeeks(newValue - this.getLong(ChronoField.ALIGNED_WEEK_OF_YEAR));

        case ChronoField.MONTH_OF_YEAR:
          return this.withMonth(newValue);

        case ChronoField.PROLEPTIC_MONTH:
          return this.plusMonths(newValue - this.getLong(ChronoField.PROLEPTIC_MONTH));

        case ChronoField.YEAR_OF_ERA:
          return this.withYear(this._year >= 1 ? newValue : 1 - newValue);

        case ChronoField.YEAR:
          return this.withYear(newValue);

        case ChronoField.ERA:
          return this.getLong(ChronoField.ERA) === newValue ? this : this.withYear(1 - this._year);
      }

      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.adjustInto(this, newValue);
  };

  _proto.withYear = function withYear(year) {
    if (this._year === year) {
      return this;
    }

    ChronoField.YEAR.checkValidValue(year);
    return LocalDate._resolvePreviousValid(year, this._month, this._day);
  };

  _proto.withMonth = function withMonth(month) {
    var m = month instanceof Month ? month.value() : month;

    if (this._month === m) {
      return this;
    }

    ChronoField.MONTH_OF_YEAR.checkValidValue(m);
    return LocalDate._resolvePreviousValid(this._year, m, this._day);
  };

  _proto.withDayOfMonth = function withDayOfMonth(dayOfMonth) {
    if (this._day === dayOfMonth) {
      return this;
    }

    return LocalDate.of(this._year, this._month, dayOfMonth);
  };

  _proto.withDayOfYear = function withDayOfYear(dayOfYear) {
    if (this.dayOfYear() === dayOfYear) {
      return this;
    }

    return LocalDate.ofYearDay(this._year, dayOfYear);
  };

  _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
    requireNonNull(amountToAdd, 'amountToAdd');
    requireNonNull(unit, 'unit');

    if (unit instanceof ChronoUnit) {
      switch (unit) {
        case ChronoUnit.DAYS:
          return this.plusDays(amountToAdd);

        case ChronoUnit.WEEKS:
          return this.plusWeeks(amountToAdd);

        case ChronoUnit.MONTHS:
          return this.plusMonths(amountToAdd);

        case ChronoUnit.YEARS:
          return this.plusYears(amountToAdd);

        case ChronoUnit.DECADES:
          return this.plusYears(MathUtil.safeMultiply(amountToAdd, 10));

        case ChronoUnit.CENTURIES:
          return this.plusYears(MathUtil.safeMultiply(amountToAdd, 100));

        case ChronoUnit.MILLENNIA:
          return this.plusYears(MathUtil.safeMultiply(amountToAdd, 1000));

        case ChronoUnit.ERAS:
          return this.with(ChronoField.ERA, MathUtil.safeAdd(this.getLong(ChronoField.ERA), amountToAdd));
      }

      throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
    }

    return unit.addTo(this, amountToAdd);
  };

  _proto.plusYears = function plusYears(yearsToAdd) {
    if (yearsToAdd === 0) {
      return this;
    }

    var newYear = ChronoField.YEAR.checkValidIntValue(this._year + yearsToAdd);
    return LocalDate._resolvePreviousValid(newYear, this._month, this._day);
  };

  _proto.plusMonths = function plusMonths(monthsToAdd) {
    if (monthsToAdd === 0) {
      return this;
    }

    var monthCount = this._year * 12 + (this._month - 1);
    var calcMonths = monthCount + monthsToAdd;
    var newYear = ChronoField.YEAR.checkValidIntValue(MathUtil.floorDiv(calcMonths, 12));
    var newMonth = MathUtil.floorMod(calcMonths, 12) + 1;
    return LocalDate._resolvePreviousValid(newYear, newMonth, this._day);
  };

  _proto.plusWeeks = function plusWeeks(weeksToAdd) {
    return this.plusDays(MathUtil.safeMultiply(weeksToAdd, 7));
  };

  _proto.plusDays = function plusDays(daysToAdd) {
    if (daysToAdd === 0) {
      return this;
    }

    var mjDay = MathUtil.safeAdd(this.toEpochDay(), daysToAdd);
    return LocalDate.ofEpochDay(mjDay);
  };

  _proto._minusUnit = function _minusUnit(amountToSubtract, unit) {
    requireNonNull(amountToSubtract, 'amountToSubtract');
    requireNonNull(unit, 'unit');
    return this._plusUnit(-1 * amountToSubtract, unit);
  };

  _proto.minusYears = function minusYears(yearsToSubtract) {
    return this.plusYears(yearsToSubtract * -1);
  };

  _proto.minusMonths = function minusMonths(monthsToSubtract) {
    return this.plusMonths(monthsToSubtract * -1);
  };

  _proto.minusWeeks = function minusWeeks(weeksToSubtract) {
    return this.plusWeeks(weeksToSubtract * -1);
  };

  _proto.minusDays = function minusDays(daysToSubtract) {
    return this.plusDays(daysToSubtract * -1);
  };

  _proto.query = function query(_query) {
    requireNonNull(_query, 'query');

    if (_query === TemporalQueries.localDate()) {
      return this;
    }

    return _ChronoLocalDate.prototype.query.call(this, _query);
  };

  _proto.adjustInto = function adjustInto(temporal) {
    return _ChronoLocalDate.prototype.adjustInto.call(this, temporal);
  };

  _proto.until = function until(p1, p2) {
    if (arguments.length < 2) {
      return this.until1(p1);
    } else {
      return this.until2(p1, p2);
    }
  };

  _proto.until2 = function until2(endExclusive, unit) {
    var end = LocalDate.from(endExclusive);

    if (unit instanceof ChronoUnit) {
      switch (unit) {
        case ChronoUnit.DAYS:
          return this.daysUntil(end);

        case ChronoUnit.WEEKS:
          return MathUtil.intDiv(this.daysUntil(end), 7);

        case ChronoUnit.MONTHS:
          return this._monthsUntil(end);

        case ChronoUnit.YEARS:
          return MathUtil.intDiv(this._monthsUntil(end), 12);

        case ChronoUnit.DECADES:
          return MathUtil.intDiv(this._monthsUntil(end), 120);

        case ChronoUnit.CENTURIES:
          return MathUtil.intDiv(this._monthsUntil(end), 1200);

        case ChronoUnit.MILLENNIA:
          return MathUtil.intDiv(this._monthsUntil(end), 12000);

        case ChronoUnit.ERAS:
          return end.getLong(ChronoField.ERA) - this.getLong(ChronoField.ERA);
      }

      throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
    }

    return unit.between(this, end);
  };

  _proto.daysUntil = function daysUntil(end) {
    return end.toEpochDay() - this.toEpochDay();
  };

  _proto._monthsUntil = function _monthsUntil(end) {
    var packed1 = this._prolepticMonth() * 32 + this.dayOfMonth();
    var packed2 = end._prolepticMonth() * 32 + end.dayOfMonth();
    return MathUtil.intDiv(packed2 - packed1, 32);
  };

  _proto.until1 = function until1(endDate) {
    var end = LocalDate.from(endDate);

    var totalMonths = end._prolepticMonth() - this._prolepticMonth();

    var days = end._day - this._day;

    if (totalMonths > 0 && days < 0) {
      totalMonths--;
      var calcDate = this.plusMonths(totalMonths);
      days = end.toEpochDay() - calcDate.toEpochDay();
    } else if (totalMonths < 0 && days > 0) {
      totalMonths++;
      days -= end.lengthOfMonth();
    }

    var years = MathUtil.intDiv(totalMonths, 12);
    var months = MathUtil.intMod(totalMonths, 12);
    return Period.of(years, months, days);
  };

  _proto.atTime = function atTime() {
    if (arguments.length === 1) {
      return this.atTime1.apply(this, arguments);
    } else {
      return this.atTime4.apply(this, arguments);
    }
  };

  _proto.atTime1 = function atTime1(time) {
    requireNonNull(time, 'time');

    if (time instanceof LocalTime) {
      return LocalDateTime.of(this, time);
    } else if (time instanceof OffsetTime) {
      return this._atTimeOffsetTime(time);
    } else {
      throw new IllegalArgumentException("time must be an instance of LocalTime or OffsetTime" + (time && time.constructor && time.constructor.name ? ", but is " + time.constructor.name : ''));
    }
  };

  _proto.atTime4 = function atTime4(hour, minute, second, nanoOfSecond) {
    if (second === void 0) {
      second = 0;
    }

    if (nanoOfSecond === void 0) {
      nanoOfSecond = 0;
    }

    return this.atTime1(LocalTime.of(hour, minute, second, nanoOfSecond));
  };

  _proto._atTimeOffsetTime = function _atTimeOffsetTime(time) {
    return OffsetDateTime.of(LocalDateTime.of(this, time.toLocalTime()), time.offset());
  };

  _proto.atStartOfDay = function atStartOfDay(zone) {
    if (zone != null) {
      return this._atStartOfDayWithZone(zone);
    } else {
      return LocalDateTime.of(this, LocalTime.MIDNIGHT);
    }
  };

  _proto._atStartOfDayWithZone = function _atStartOfDayWithZone(zone) {
    requireNonNull(zone, 'zone');
    var ldt = this.atTime(LocalTime.MIDNIGHT);

    if (zone instanceof ZoneOffset === false) {
      var trans = zone.rules().transition(ldt);

      if (trans != null && trans.isGap()) {
        ldt = trans.dateTimeAfter();
      }
    }

    return ZonedDateTime.of(ldt, zone);
  };

  _proto.toEpochDay = function toEpochDay() {
    var y = this._year;
    var m = this._month;
    var total = 0;
    total += 365 * y;

    if (y >= 0) {
      total += MathUtil.intDiv(y + 3, 4) - MathUtil.intDiv(y + 99, 100) + MathUtil.intDiv(y + 399, 400);
    } else {
      total -= MathUtil.intDiv(y, -4) - MathUtil.intDiv(y, -100) + MathUtil.intDiv(y, -400);
    }

    total += MathUtil.intDiv(367 * m - 362, 12);
    total += this.dayOfMonth() - 1;

    if (m > 2) {
      total--;

      if (!IsoChronology.isLeapYear(y)) {
        total--;
      }
    }

    return total - DAYS_0000_TO_1970;
  };

  _proto.compareTo = function compareTo(other) {
    requireNonNull(other, 'other');
    requireInstance(other, LocalDate, 'other');
    return this._compareTo0(other);
  };

  _proto._compareTo0 = function _compareTo0(otherDate) {
    var cmp = this._year - otherDate._year;

    if (cmp === 0) {
      cmp = this._month - otherDate._month;

      if (cmp === 0) {
        cmp = this._day - otherDate._day;
      }
    }

    return cmp;
  };

  _proto.isAfter = function isAfter(other) {
    return this.compareTo(other) > 0;
  };

  _proto.isBefore = function isBefore(other) {
    return this.compareTo(other) < 0;
  };

  _proto.isEqual = function isEqual(other) {
    return this.compareTo(other) === 0;
  };

  _proto.equals = function equals(other) {
    if (this === other) {
      return true;
    }

    if (other instanceof LocalDate) {
      return this._compareTo0(other) === 0;
    }

    return false;
  };

  _proto.hashCode = function hashCode() {
    var yearValue = this._year;
    var monthValue = this._month;
    var dayValue = this._day;
    return MathUtil.hash(yearValue & 0xFFFFF800 ^ (yearValue << 11) + (monthValue << 6) + dayValue);
  };

  _proto.toString = function toString() {
    var dayString, monthString, yearString;
    var yearValue = this._year;
    var monthValue = this._month;
    var dayValue = this._day;
    var absYear = Math.abs(yearValue);

    if (absYear < 1000) {
      if (yearValue < 0) {
        yearString = "-" + ("" + (yearValue - 10000)).slice(-4);
      } else {
        yearString = ("" + (yearValue + 10000)).slice(-4);
      }
    } else {
      if (yearValue > 9999) {
        yearString = "+" + yearValue;
      } else {
        yearString = "" + yearValue;
      }
    }

    if (monthValue < 10) {
      monthString = "-0" + monthValue;
    } else {
      monthString = "-" + monthValue;
    }

    if (dayValue < 10) {
      dayString = "-0" + dayValue;
    } else {
      dayString = "-" + dayValue;
    }

    return yearString + monthString + dayString;
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  _proto.format = function format(formatter) {
    requireNonNull(formatter, 'formatter');
    requireInstance(formatter, DateTimeFormatter, 'formatter');
    return _ChronoLocalDate.prototype.format.call(this, formatter);
  };

  return LocalDate;
}(ChronoLocalDate);
function _init$5() {
  LocalDate.MIN = LocalDate.of(YearConstants.MIN_VALUE, 1, 1);
  LocalDate.MAX = LocalDate.of(YearConstants.MAX_VALUE, 12, 31);
  LocalDate.EPOCH_0 = LocalDate.ofEpochDay(0);
  LocalDate.FROM = createTemporalQuery('LocalDate.FROM', function (temporal) {
    return LocalDate.from(temporal);
  });
}

var ChronoLocalDateTime = function (_Temporal) {
  _inheritsLoose(ChronoLocalDateTime, _Temporal);

  function ChronoLocalDateTime() {
    return _Temporal.apply(this, arguments) || this;
  }

  var _proto = ChronoLocalDateTime.prototype;

  _proto.chronology = function chronology() {
    return this.toLocalDate().chronology();
  };

  _proto.query = function query(_query) {
    if (_query === TemporalQueries.chronology()) {
      return this.chronology();
    } else if (_query === TemporalQueries.precision()) {
      return ChronoUnit.NANOS;
    } else if (_query === TemporalQueries.localDate()) {
      return LocalDate.ofEpochDay(this.toLocalDate().toEpochDay());
    } else if (_query === TemporalQueries.localTime()) {
      return this.toLocalTime();
    } else if (_query === TemporalQueries.zone() || _query === TemporalQueries.zoneId() || _query === TemporalQueries.offset()) {
      return null;
    }

    return _Temporal.prototype.query.call(this, _query);
  };

  _proto.adjustInto = function adjustInto(temporal) {
    return temporal.with(ChronoField.EPOCH_DAY, this.toLocalDate().toEpochDay()).with(ChronoField.NANO_OF_DAY, this.toLocalTime().toNanoOfDay());
  };

  _proto.toInstant = function toInstant(offset) {
    requireInstance(offset, ZoneOffset, 'zoneId');
    return Instant.ofEpochSecond(this.toEpochSecond(offset), this.toLocalTime().nano());
  };

  _proto.toEpochSecond = function toEpochSecond(offset) {
    requireNonNull(offset, 'offset');
    var epochDay = this.toLocalDate().toEpochDay();
    var secs = epochDay * 86400 + this.toLocalTime().toSecondOfDay();
    secs -= offset.totalSeconds();
    return MathUtil.safeToInt(secs);
  };

  return ChronoLocalDateTime;
}(Temporal);

var LocalDateTime = function (_ChronoLocalDateTime) {
  _inheritsLoose(LocalDateTime, _ChronoLocalDateTime);

  LocalDateTime.now = function now(clockOrZone) {
    if (clockOrZone == null) {
      return LocalDateTime._now(Clock.systemDefaultZone());
    } else if (clockOrZone instanceof Clock) {
      return LocalDateTime._now(clockOrZone);
    } else {
      return LocalDateTime._now(Clock.system(clockOrZone));
    }
  };

  LocalDateTime._now = function _now(clock) {
    requireNonNull(clock, 'clock');
    return LocalDateTime.ofInstant(clock.instant(), clock.zone());
  };

  LocalDateTime._ofEpochMillis = function _ofEpochMillis(epochMilli, offset) {
    var localSecond = MathUtil.floorDiv(epochMilli, 1000) + offset.totalSeconds();
    var localEpochDay = MathUtil.floorDiv(localSecond, LocalTime.SECONDS_PER_DAY);
    var secsOfDay = MathUtil.floorMod(localSecond, LocalTime.SECONDS_PER_DAY);
    var nanoOfSecond = MathUtil.floorMod(epochMilli, 1000) * 1000000;
    var date = LocalDate.ofEpochDay(localEpochDay);
    var time = LocalTime.ofSecondOfDay(secsOfDay, nanoOfSecond);
    return new LocalDateTime(date, time);
  };

  LocalDateTime.of = function of() {
    if (arguments.length <= 2) {
      return LocalDateTime.ofDateAndTime.apply(this, arguments);
    } else {
      return LocalDateTime.ofNumbers.apply(this, arguments);
    }
  };

  LocalDateTime.ofNumbers = function ofNumbers(year, month, dayOfMonth, hour, minute, second, nanoOfSecond) {
    if (hour === void 0) {
      hour = 0;
    }

    if (minute === void 0) {
      minute = 0;
    }

    if (second === void 0) {
      second = 0;
    }

    if (nanoOfSecond === void 0) {
      nanoOfSecond = 0;
    }

    var date = LocalDate.of(year, month, dayOfMonth);
    var time = LocalTime.of(hour, minute, second, nanoOfSecond);
    return new LocalDateTime(date, time);
  };

  LocalDateTime.ofDateAndTime = function ofDateAndTime(date, time) {
    requireNonNull(date, 'date');
    requireNonNull(time, 'time');
    return new LocalDateTime(date, time);
  };

  LocalDateTime.ofInstant = function ofInstant(instant, zone) {
    if (zone === void 0) {
      zone = ZoneId.systemDefault();
    }

    requireNonNull(instant, 'instant');
    requireInstance(instant, Instant, 'instant');
    requireNonNull(zone, 'zone');
    var offset = zone.rules().offset(instant);
    return LocalDateTime.ofEpochSecond(instant.epochSecond(), instant.nano(), offset);
  };

  LocalDateTime.ofEpochSecond = function ofEpochSecond(epochSecond, nanoOfSecond, offset) {
    if (epochSecond === void 0) {
      epochSecond = 0;
    }

    if (nanoOfSecond === void 0) {
      nanoOfSecond = 0;
    }

    if (arguments.length === 2 && nanoOfSecond instanceof ZoneOffset) {
      offset = nanoOfSecond;
      nanoOfSecond = 0;
    }

    requireNonNull(offset, 'offset');
    var localSecond = epochSecond + offset.totalSeconds();
    var localEpochDay = MathUtil.floorDiv(localSecond, LocalTime.SECONDS_PER_DAY);
    var secsOfDay = MathUtil.floorMod(localSecond, LocalTime.SECONDS_PER_DAY);
    var date = LocalDate.ofEpochDay(localEpochDay);
    var time = LocalTime.ofSecondOfDay(secsOfDay, nanoOfSecond);
    return new LocalDateTime(date, time);
  };

  LocalDateTime.from = function from(temporal) {
    requireNonNull(temporal, 'temporal');

    if (temporal instanceof LocalDateTime) {
      return temporal;
    } else if (temporal instanceof ZonedDateTime) {
      return temporal.toLocalDateTime();
    }

    try {
      var date = LocalDate.from(temporal);
      var time = LocalTime.from(temporal);
      return new LocalDateTime(date, time);
    } catch (ex) {
      throw new DateTimeException("Unable to obtain LocalDateTime TemporalAccessor: " + temporal + ", type " + (temporal.constructor != null ? temporal.constructor.name : ''));
    }
  };

  LocalDateTime.parse = function parse(text, formatter) {
    if (formatter === void 0) {
      formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
    }

    requireNonNull(formatter, 'formatter');
    return formatter.parse(text, LocalDateTime.FROM);
  };

  function LocalDateTime(date, time) {
    var _this;

    _this = _ChronoLocalDateTime.call(this) || this;
    requireInstance(date, LocalDate, 'date');
    requireInstance(time, LocalTime, 'time');
    _this._date = date;
    _this._time = time;
    return _this;
  }

  var _proto = LocalDateTime.prototype;

  _proto._withDateTime = function _withDateTime(newDate, newTime) {
    if (this._date.equals(newDate) && this._time.equals(newTime)) {
      return this;
    }

    return new LocalDateTime(newDate, newTime);
  };

  _proto.isSupported = function isSupported(fieldOrUnit) {
    if (fieldOrUnit instanceof ChronoField) {
      return fieldOrUnit.isDateBased() || fieldOrUnit.isTimeBased();
    } else if (fieldOrUnit instanceof ChronoUnit) {
      return fieldOrUnit.isDateBased() || fieldOrUnit.isTimeBased();
    }

    return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
  };

  _proto.range = function range(field) {
    if (field instanceof ChronoField) {
      return field.isTimeBased() ? this._time.range(field) : this._date.range(field);
    }

    return field.rangeRefinedBy(this);
  };

  _proto.get = function get(field) {
    if (field instanceof ChronoField) {
      return field.isTimeBased() ? this._time.get(field) : this._date.get(field);
    }

    return _ChronoLocalDateTime.prototype.get.call(this, field);
  };

  _proto.getLong = function getLong(field) {
    requireNonNull(field, 'field');

    if (field instanceof ChronoField) {
      return field.isTimeBased() ? this._time.getLong(field) : this._date.getLong(field);
    }

    return field.getFrom(this);
  };

  _proto.year = function year() {
    return this._date.year();
  };

  _proto.monthValue = function monthValue() {
    return this._date.monthValue();
  };

  _proto.month = function month() {
    return this._date.month();
  };

  _proto.dayOfMonth = function dayOfMonth() {
    return this._date.dayOfMonth();
  };

  _proto.dayOfYear = function dayOfYear() {
    return this._date.dayOfYear();
  };

  _proto.dayOfWeek = function dayOfWeek() {
    return this._date.dayOfWeek();
  };

  _proto.hour = function hour() {
    return this._time.hour();
  };

  _proto.minute = function minute() {
    return this._time.minute();
  };

  _proto.second = function second() {
    return this._time.second();
  };

  _proto.nano = function nano() {
    return this._time.nano();
  };

  _proto._withAdjuster = function _withAdjuster(adjuster) {
    requireNonNull(adjuster, 'adjuster');

    if (adjuster instanceof LocalDate) {
      return this._withDateTime(adjuster, this._time);
    } else if (adjuster instanceof LocalTime) {
      return this._withDateTime(this._date, adjuster);
    } else if (adjuster instanceof LocalDateTime) {
      return adjuster;
    }

    return _ChronoLocalDateTime.prototype._withAdjuster.call(this, adjuster);
  };

  _proto._withField = function _withField(field, newValue) {
    requireNonNull(field, 'field');

    if (field instanceof ChronoField) {
      if (field.isTimeBased()) {
        return this._withDateTime(this._date, this._time.with(field, newValue));
      } else {
        return this._withDateTime(this._date.with(field, newValue), this._time);
      }
    }

    return field.adjustInto(this, newValue);
  };

  _proto.withYear = function withYear(year) {
    return this._withDateTime(this._date.withYear(year), this._time);
  };

  _proto.withMonth = function withMonth(month) {
    return this._withDateTime(this._date.withMonth(month), this._time);
  };

  _proto.withDayOfMonth = function withDayOfMonth(dayOfMonth) {
    return this._withDateTime(this._date.withDayOfMonth(dayOfMonth), this._time);
  };

  _proto.withDayOfYear = function withDayOfYear(dayOfYear) {
    return this._withDateTime(this._date.withDayOfYear(dayOfYear), this._time);
  };

  _proto.withHour = function withHour(hour) {
    var newTime = this._time.withHour(hour);

    return this._withDateTime(this._date, newTime);
  };

  _proto.withMinute = function withMinute(minute) {
    var newTime = this._time.withMinute(minute);

    return this._withDateTime(this._date, newTime);
  };

  _proto.withSecond = function withSecond(second) {
    var newTime = this._time.withSecond(second);

    return this._withDateTime(this._date, newTime);
  };

  _proto.withNano = function withNano(nanoOfSecond) {
    var newTime = this._time.withNano(nanoOfSecond);

    return this._withDateTime(this._date, newTime);
  };

  _proto.truncatedTo = function truncatedTo(unit) {
    return this._withDateTime(this._date, this._time.truncatedTo(unit));
  };

  _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
    requireNonNull(unit, 'unit');

    if (unit instanceof ChronoUnit) {
      switch (unit) {
        case ChronoUnit.NANOS:
          return this.plusNanos(amountToAdd);

        case ChronoUnit.MICROS:
          return this.plusDays(MathUtil.intDiv(amountToAdd, LocalTime.MICROS_PER_DAY)).plusNanos(MathUtil.intMod(amountToAdd, LocalTime.MICROS_PER_DAY) * 1000);

        case ChronoUnit.MILLIS:
          return this.plusDays(MathUtil.intDiv(amountToAdd, LocalTime.MILLIS_PER_DAY)).plusNanos(MathUtil.intMod(amountToAdd, LocalTime.MILLIS_PER_DAY) * 1000000);

        case ChronoUnit.SECONDS:
          return this.plusSeconds(amountToAdd);

        case ChronoUnit.MINUTES:
          return this.plusMinutes(amountToAdd);

        case ChronoUnit.HOURS:
          return this.plusHours(amountToAdd);

        case ChronoUnit.HALF_DAYS:
          return this.plusDays(MathUtil.intDiv(amountToAdd, 256)).plusHours(MathUtil.intMod(amountToAdd, 256) * 12);
      }

      return this._withDateTime(this._date.plus(amountToAdd, unit), this._time);
    }

    return unit.addTo(this, amountToAdd);
  };

  _proto.plusYears = function plusYears(years) {
    var newDate = this._date.plusYears(years);

    return this._withDateTime(newDate, this._time);
  };

  _proto.plusMonths = function plusMonths(months) {
    var newDate = this._date.plusMonths(months);

    return this._withDateTime(newDate, this._time);
  };

  _proto.plusWeeks = function plusWeeks(weeks) {
    var newDate = this._date.plusWeeks(weeks);

    return this._withDateTime(newDate, this._time);
  };

  _proto.plusDays = function plusDays(days) {
    var newDate = this._date.plusDays(days);

    return this._withDateTime(newDate, this._time);
  };

  _proto.plusHours = function plusHours(hours) {
    return this._plusWithOverflow(this._date, hours, 0, 0, 0, 1);
  };

  _proto.plusMinutes = function plusMinutes(minutes) {
    return this._plusWithOverflow(this._date, 0, minutes, 0, 0, 1);
  };

  _proto.plusSeconds = function plusSeconds(seconds) {
    return this._plusWithOverflow(this._date, 0, 0, seconds, 0, 1);
  };

  _proto.plusNanos = function plusNanos(nanos) {
    return this._plusWithOverflow(this._date, 0, 0, 0, nanos, 1);
  };

  _proto._minusUnit = function _minusUnit(amountToSubtract, unit) {
    requireNonNull(unit, 'unit');
    return this._plusUnit(-1 * amountToSubtract, unit);
  };

  _proto.minusYears = function minusYears(years) {
    return this.plusYears(-1 * years);
  };

  _proto.minusMonths = function minusMonths(months) {
    return this.plusMonths(-1 * months);
  };

  _proto.minusWeeks = function minusWeeks(weeks) {
    return this.plusWeeks(-1 * weeks);
  };

  _proto.minusDays = function minusDays(days) {
    return this.plusDays(-1 * days);
  };

  _proto.minusHours = function minusHours(hours) {
    return this._plusWithOverflow(this._date, hours, 0, 0, 0, -1);
  };

  _proto.minusMinutes = function minusMinutes(minutes) {
    return this._plusWithOverflow(this._date, 0, minutes, 0, 0, -1);
  };

  _proto.minusSeconds = function minusSeconds(seconds) {
    return this._plusWithOverflow(this._date, 0, 0, seconds, 0, -1);
  };

  _proto.minusNanos = function minusNanos(nanos) {
    return this._plusWithOverflow(this._date, 0, 0, 0, nanos, -1);
  };

  _proto._plusWithOverflow = function _plusWithOverflow(newDate, hours, minutes, seconds, nanos, sign) {
    if (hours === 0 && minutes === 0 && seconds === 0 && nanos === 0) {
      return this._withDateTime(newDate, this._time);
    }

    var totDays = MathUtil.intDiv(nanos, LocalTime.NANOS_PER_DAY) + MathUtil.intDiv(seconds, LocalTime.SECONDS_PER_DAY) + MathUtil.intDiv(minutes, LocalTime.MINUTES_PER_DAY) + MathUtil.intDiv(hours, LocalTime.HOURS_PER_DAY);
    totDays *= sign;
    var totNanos = MathUtil.intMod(nanos, LocalTime.NANOS_PER_DAY) + MathUtil.intMod(seconds, LocalTime.SECONDS_PER_DAY) * LocalTime.NANOS_PER_SECOND + MathUtil.intMod(minutes, LocalTime.MINUTES_PER_DAY) * LocalTime.NANOS_PER_MINUTE + MathUtil.intMod(hours, LocalTime.HOURS_PER_DAY) * LocalTime.NANOS_PER_HOUR;

    var curNoD = this._time.toNanoOfDay();

    totNanos = totNanos * sign + curNoD;
    totDays += MathUtil.floorDiv(totNanos, LocalTime.NANOS_PER_DAY);
    var newNoD = MathUtil.floorMod(totNanos, LocalTime.NANOS_PER_DAY);
    var newTime = newNoD === curNoD ? this._time : LocalTime.ofNanoOfDay(newNoD);
    return this._withDateTime(newDate.plusDays(totDays), newTime);
  };

  _proto.query = function query(_query) {
    requireNonNull(_query, 'query');

    if (_query === TemporalQueries.localDate()) {
      return this.toLocalDate();
    }

    return _ChronoLocalDateTime.prototype.query.call(this, _query);
  };

  _proto.adjustInto = function adjustInto(temporal) {
    return _ChronoLocalDateTime.prototype.adjustInto.call(this, temporal);
  };

  _proto.until = function until(endExclusive, unit) {
    requireNonNull(endExclusive, 'endExclusive');
    requireNonNull(unit, 'unit');
    var end = LocalDateTime.from(endExclusive);

    if (unit instanceof ChronoUnit) {
      if (unit.isTimeBased()) {
        var daysUntil = this._date.daysUntil(end._date);

        var timeUntil = end._time.toNanoOfDay() - this._time.toNanoOfDay();

        if (daysUntil > 0 && timeUntil < 0) {
          daysUntil--;
          timeUntil += LocalTime.NANOS_PER_DAY;
        } else if (daysUntil < 0 && timeUntil > 0) {
          daysUntil++;
          timeUntil -= LocalTime.NANOS_PER_DAY;
        }

        var amount = daysUntil;

        switch (unit) {
          case ChronoUnit.NANOS:
            amount = MathUtil.safeMultiply(amount, LocalTime.NANOS_PER_DAY);
            return MathUtil.safeAdd(amount, timeUntil);

          case ChronoUnit.MICROS:
            amount = MathUtil.safeMultiply(amount, LocalTime.MICROS_PER_DAY);
            return MathUtil.safeAdd(amount, MathUtil.intDiv(timeUntil, 1000));

          case ChronoUnit.MILLIS:
            amount = MathUtil.safeMultiply(amount, LocalTime.MILLIS_PER_DAY);
            return MathUtil.safeAdd(amount, MathUtil.intDiv(timeUntil, 1000000));

          case ChronoUnit.SECONDS:
            amount = MathUtil.safeMultiply(amount, LocalTime.SECONDS_PER_DAY);
            return MathUtil.safeAdd(amount, MathUtil.intDiv(timeUntil, LocalTime.NANOS_PER_SECOND));

          case ChronoUnit.MINUTES:
            amount = MathUtil.safeMultiply(amount, LocalTime.MINUTES_PER_DAY);
            return MathUtil.safeAdd(amount, MathUtil.intDiv(timeUntil, LocalTime.NANOS_PER_MINUTE));

          case ChronoUnit.HOURS:
            amount = MathUtil.safeMultiply(amount, LocalTime.HOURS_PER_DAY);
            return MathUtil.safeAdd(amount, MathUtil.intDiv(timeUntil, LocalTime.NANOS_PER_HOUR));

          case ChronoUnit.HALF_DAYS:
            amount = MathUtil.safeMultiply(amount, 2);
            return MathUtil.safeAdd(amount, MathUtil.intDiv(timeUntil, LocalTime.NANOS_PER_HOUR * 12));
        }

        throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
      }

      var endDate = end._date;
      var endTime = end._time;

      if (endDate.isAfter(this._date) && endTime.isBefore(this._time)) {
        endDate = endDate.minusDays(1);
      } else if (endDate.isBefore(this._date) && endTime.isAfter(this._time)) {
        endDate = endDate.plusDays(1);
      }

      return this._date.until(endDate, unit);
    }

    return unit.between(this, end);
  };

  _proto.atOffset = function atOffset(offset) {
    return OffsetDateTime.of(this, offset);
  };

  _proto.atZone = function atZone(zone) {
    return ZonedDateTime.of(this, zone);
  };

  _proto.toLocalDate = function toLocalDate() {
    return this._date;
  };

  _proto.toLocalTime = function toLocalTime() {
    return this._time;
  };

  _proto.compareTo = function compareTo(other) {
    requireNonNull(other, 'other');
    requireInstance(other, LocalDateTime, 'other');
    return this._compareTo0(other);
  };

  _proto._compareTo0 = function _compareTo0(other) {
    var cmp = this._date.compareTo(other.toLocalDate());

    if (cmp === 0) {
      cmp = this._time.compareTo(other.toLocalTime());
    }

    return cmp;
  };

  _proto.isAfter = function isAfter(other) {
    return this.compareTo(other) > 0;
  };

  _proto.isBefore = function isBefore(other) {
    return this.compareTo(other) < 0;
  };

  _proto.isEqual = function isEqual(other) {
    return this.compareTo(other) === 0;
  };

  _proto.equals = function equals(other) {
    if (this === other) {
      return true;
    }

    if (other instanceof LocalDateTime) {
      return this._date.equals(other._date) && this._time.equals(other._time);
    }

    return false;
  };

  _proto.hashCode = function hashCode() {
    return this._date.hashCode() ^ this._time.hashCode();
  };

  _proto.toString = function toString() {
    return this._date.toString() + "T" + this._time.toString();
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  _proto.format = function format(formatter) {
    requireNonNull(formatter, 'formatter');
    return formatter.format(this);
  };

  return LocalDateTime;
}(ChronoLocalDateTime);
function _init$4() {
  LocalDateTime.MIN = LocalDateTime.of(LocalDate.MIN, LocalTime.MIN);
  LocalDateTime.MAX = LocalDateTime.of(LocalDate.MAX, LocalTime.MAX);
  LocalDateTime.FROM = createTemporalQuery('LocalDateTime.FROM', function (temporal) {
    return LocalDateTime.from(temporal);
  });
}

var LocalTime = function (_Temporal) {
  _inheritsLoose(LocalTime, _Temporal);

  LocalTime.now = function now(clockOrZone) {
    if (clockOrZone == null) {
      return LocalTime._now(Clock.systemDefaultZone());
    } else if (clockOrZone instanceof Clock) {
      return LocalTime._now(clockOrZone);
    } else {
      return LocalTime._now(Clock.system(clockOrZone));
    }
  };

  LocalTime._now = function _now(clock) {
    if (clock === void 0) {
      clock = Clock.systemDefaultZone();
    }

    requireNonNull(clock, 'clock');
    return LocalTime.ofInstant(clock.instant(), clock.zone());
  };

  LocalTime.ofInstant = function ofInstant(instant, zone) {
    if (zone === void 0) {
      zone = ZoneId.systemDefault();
    }

    var offset = zone.rules().offset(instant);
    var secsOfDay = MathUtil.intMod(instant.epochSecond(), LocalTime.SECONDS_PER_DAY);
    secsOfDay = MathUtil.intMod(secsOfDay + offset.totalSeconds(), LocalTime.SECONDS_PER_DAY);

    if (secsOfDay < 0) {
      secsOfDay += LocalTime.SECONDS_PER_DAY;
    }

    return LocalTime.ofSecondOfDay(secsOfDay, instant.nano());
  };

  LocalTime.of = function of(hour, minute, second, nanoOfSecond) {
    return new LocalTime(hour, minute, second, nanoOfSecond);
  };

  LocalTime.ofSecondOfDay = function ofSecondOfDay(secondOfDay, nanoOfSecond) {
    if (secondOfDay === void 0) {
      secondOfDay = 0;
    }

    if (nanoOfSecond === void 0) {
      nanoOfSecond = 0;
    }

    ChronoField.SECOND_OF_DAY.checkValidValue(secondOfDay);
    ChronoField.NANO_OF_SECOND.checkValidValue(nanoOfSecond);
    var hours = MathUtil.intDiv(secondOfDay, LocalTime.SECONDS_PER_HOUR);
    secondOfDay -= hours * LocalTime.SECONDS_PER_HOUR;
    var minutes = MathUtil.intDiv(secondOfDay, LocalTime.SECONDS_PER_MINUTE);
    secondOfDay -= minutes * LocalTime.SECONDS_PER_MINUTE;
    return new LocalTime(hours, minutes, secondOfDay, nanoOfSecond);
  };

  LocalTime.ofNanoOfDay = function ofNanoOfDay(nanoOfDay) {
    if (nanoOfDay === void 0) {
      nanoOfDay = 0;
    }

    ChronoField.NANO_OF_DAY.checkValidValue(nanoOfDay);
    var hours = MathUtil.intDiv(nanoOfDay, LocalTime.NANOS_PER_HOUR);
    nanoOfDay -= hours * LocalTime.NANOS_PER_HOUR;
    var minutes = MathUtil.intDiv(nanoOfDay, LocalTime.NANOS_PER_MINUTE);
    nanoOfDay -= minutes * LocalTime.NANOS_PER_MINUTE;
    var seconds = MathUtil.intDiv(nanoOfDay, LocalTime.NANOS_PER_SECOND);
    nanoOfDay -= seconds * LocalTime.NANOS_PER_SECOND;
    return new LocalTime(hours, minutes, seconds, nanoOfDay);
  };

  LocalTime.from = function from(temporal) {
    requireNonNull(temporal, 'temporal');
    var time = temporal.query(TemporalQueries.localTime());

    if (time == null) {
      throw new DateTimeException("Unable to obtain LocalTime TemporalAccessor: " + temporal + ", type " + (temporal.constructor != null ? temporal.constructor.name : ''));
    }

    return time;
  };

  LocalTime.parse = function parse(text, formatter) {
    if (formatter === void 0) {
      formatter = DateTimeFormatter.ISO_LOCAL_TIME;
    }

    requireNonNull(formatter, 'formatter');
    return formatter.parse(text, LocalTime.FROM);
  };

  function LocalTime(hour, minute, second, nanoOfSecond) {
    var _this;

    if (hour === void 0) {
      hour = 0;
    }

    if (minute === void 0) {
      minute = 0;
    }

    if (second === void 0) {
      second = 0;
    }

    if (nanoOfSecond === void 0) {
      nanoOfSecond = 0;
    }

    _this = _Temporal.call(this) || this;

    var _hour = MathUtil.safeToInt(hour);

    var _minute = MathUtil.safeToInt(minute);

    var _second = MathUtil.safeToInt(second);

    var _nanoOfSecond = MathUtil.safeToInt(nanoOfSecond);

    LocalTime._validate(_hour, _minute, _second, _nanoOfSecond);

    if (_minute === 0 && _second === 0 && _nanoOfSecond === 0) {
      if (!LocalTime.HOURS[_hour]) {
        _this._hour = _hour;
        _this._minute = _minute;
        _this._second = _second;
        _this._nano = _nanoOfSecond;
        LocalTime.HOURS[_hour] = _assertThisInitialized(_this);
      }

      return LocalTime.HOURS[_hour] || _assertThisInitialized(_this);
    }

    _this._hour = _hour;
    _this._minute = _minute;
    _this._second = _second;
    _this._nano = _nanoOfSecond;
    return _this;
  }

  LocalTime._validate = function _validate(hour, minute, second, nanoOfSecond) {
    ChronoField.HOUR_OF_DAY.checkValidValue(hour);
    ChronoField.MINUTE_OF_HOUR.checkValidValue(minute);
    ChronoField.SECOND_OF_MINUTE.checkValidValue(second);
    ChronoField.NANO_OF_SECOND.checkValidValue(nanoOfSecond);
  };

  var _proto = LocalTime.prototype;

  _proto.isSupported = function isSupported(fieldOrUnit) {
    if (fieldOrUnit instanceof ChronoField) {
      return fieldOrUnit.isTimeBased();
    } else if (fieldOrUnit instanceof ChronoUnit) {
      return fieldOrUnit.isTimeBased();
    }

    return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
  };

  _proto.range = function range(field) {
    requireNonNull(field);
    return _Temporal.prototype.range.call(this, field);
  };

  _proto.get = function get(field) {
    return this.getLong(field);
  };

  _proto.getLong = function getLong(field) {
    requireNonNull(field, 'field');

    if (field instanceof ChronoField) {
      return this._get0(field);
    }

    return field.getFrom(this);
  };

  _proto._get0 = function _get0(field) {
    switch (field) {
      case ChronoField.NANO_OF_SECOND:
        return this._nano;

      case ChronoField.NANO_OF_DAY:
        return this.toNanoOfDay();

      case ChronoField.MICRO_OF_SECOND:
        return MathUtil.intDiv(this._nano, 1000);

      case ChronoField.MICRO_OF_DAY:
        return MathUtil.intDiv(this.toNanoOfDay(), 1000);

      case ChronoField.MILLI_OF_SECOND:
        return MathUtil.intDiv(this._nano, 1000000);

      case ChronoField.MILLI_OF_DAY:
        return MathUtil.intDiv(this.toNanoOfDay(), 1000000);

      case ChronoField.SECOND_OF_MINUTE:
        return this._second;

      case ChronoField.SECOND_OF_DAY:
        return this.toSecondOfDay();

      case ChronoField.MINUTE_OF_HOUR:
        return this._minute;

      case ChronoField.MINUTE_OF_DAY:
        return this._hour * 60 + this._minute;

      case ChronoField.HOUR_OF_AMPM:
        return MathUtil.intMod(this._hour, 12);

      case ChronoField.CLOCK_HOUR_OF_AMPM:
        {
          var ham = MathUtil.intMod(this._hour, 12);
          return ham % 12 === 0 ? 12 : ham;
        }

      case ChronoField.HOUR_OF_DAY:
        return this._hour;

      case ChronoField.CLOCK_HOUR_OF_DAY:
        return this._hour === 0 ? 24 : this._hour;

      case ChronoField.AMPM_OF_DAY:
        return MathUtil.intDiv(this._hour, 12);
    }

    throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
  };

  _proto.hour = function hour() {
    return this._hour;
  };

  _proto.minute = function minute() {
    return this._minute;
  };

  _proto.second = function second() {
    return this._second;
  };

  _proto.nano = function nano() {
    return this._nano;
  };

  _proto._withAdjuster = function _withAdjuster(adjuster) {
    requireNonNull(adjuster, 'adjuster');

    if (adjuster instanceof LocalTime) {
      return adjuster;
    }

    return _Temporal.prototype._withAdjuster.call(this, adjuster);
  };

  _proto._withField = function _withField(field, newValue) {
    requireNonNull(field, 'field');
    requireInstance(field, TemporalField, 'field');

    if (field instanceof ChronoField) {
      field.checkValidValue(newValue);

      switch (field) {
        case ChronoField.NANO_OF_SECOND:
          return this.withNano(newValue);

        case ChronoField.NANO_OF_DAY:
          return LocalTime.ofNanoOfDay(newValue);

        case ChronoField.MICRO_OF_SECOND:
          return this.withNano(newValue * 1000);

        case ChronoField.MICRO_OF_DAY:
          return LocalTime.ofNanoOfDay(newValue * 1000);

        case ChronoField.MILLI_OF_SECOND:
          return this.withNano(newValue * 1000000);

        case ChronoField.MILLI_OF_DAY:
          return LocalTime.ofNanoOfDay(newValue * 1000000);

        case ChronoField.SECOND_OF_MINUTE:
          return this.withSecond(newValue);

        case ChronoField.SECOND_OF_DAY:
          return this.plusSeconds(newValue - this.toSecondOfDay());

        case ChronoField.MINUTE_OF_HOUR:
          return this.withMinute(newValue);

        case ChronoField.MINUTE_OF_DAY:
          return this.plusMinutes(newValue - (this._hour * 60 + this._minute));

        case ChronoField.HOUR_OF_AMPM:
          return this.plusHours(newValue - MathUtil.intMod(this._hour, 12));

        case ChronoField.CLOCK_HOUR_OF_AMPM:
          return this.plusHours((newValue === 12 ? 0 : newValue) - MathUtil.intMod(this._hour, 12));

        case ChronoField.HOUR_OF_DAY:
          return this.withHour(newValue);

        case ChronoField.CLOCK_HOUR_OF_DAY:
          return this.withHour(newValue === 24 ? 0 : newValue);

        case ChronoField.AMPM_OF_DAY:
          return this.plusHours((newValue - MathUtil.intDiv(this._hour, 12)) * 12);
      }

      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.adjustInto(this, newValue);
  };

  _proto.withHour = function withHour(hour) {
    if (hour === void 0) {
      hour = 0;
    }

    if (this._hour === hour) {
      return this;
    }

    return new LocalTime(hour, this._minute, this._second, this._nano);
  };

  _proto.withMinute = function withMinute(minute) {
    if (minute === void 0) {
      minute = 0;
    }

    if (this._minute === minute) {
      return this;
    }

    return new LocalTime(this._hour, minute, this._second, this._nano);
  };

  _proto.withSecond = function withSecond(second) {
    if (second === void 0) {
      second = 0;
    }

    if (this._second === second) {
      return this;
    }

    return new LocalTime(this._hour, this._minute, second, this._nano);
  };

  _proto.withNano = function withNano(nanoOfSecond) {
    if (nanoOfSecond === void 0) {
      nanoOfSecond = 0;
    }

    if (this._nano === nanoOfSecond) {
      return this;
    }

    return new LocalTime(this._hour, this._minute, this._second, nanoOfSecond);
  };

  _proto.truncatedTo = function truncatedTo(unit) {
    requireNonNull(unit, 'unit');

    if (unit === ChronoUnit.NANOS) {
      return this;
    }

    var unitDur = unit.duration();

    if (unitDur.seconds() > LocalTime.SECONDS_PER_DAY) {
      throw new DateTimeException('Unit is too large to be used for truncation');
    }

    var dur = unitDur.toNanos();

    if (MathUtil.intMod(LocalTime.NANOS_PER_DAY, dur) !== 0) {
      throw new DateTimeException('Unit must divide into a standard day without remainder');
    }

    var nod = this.toNanoOfDay();
    return LocalTime.ofNanoOfDay(MathUtil.intDiv(nod, dur) * dur);
  };

  _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
    requireNonNull(unit, 'unit');

    if (unit instanceof ChronoUnit) {
      switch (unit) {
        case ChronoUnit.NANOS:
          return this.plusNanos(amountToAdd);

        case ChronoUnit.MICROS:
          return this.plusNanos(MathUtil.intMod(amountToAdd, LocalTime.MICROS_PER_DAY) * 1000);

        case ChronoUnit.MILLIS:
          return this.plusNanos(MathUtil.intMod(amountToAdd, LocalTime.MILLIS_PER_DAY) * 1000000);

        case ChronoUnit.SECONDS:
          return this.plusSeconds(amountToAdd);

        case ChronoUnit.MINUTES:
          return this.plusMinutes(amountToAdd);

        case ChronoUnit.HOURS:
          return this.plusHours(amountToAdd);

        case ChronoUnit.HALF_DAYS:
          return this.plusHours(MathUtil.intMod(amountToAdd, 2) * 12);
      }

      throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
    }

    return unit.addTo(this, amountToAdd);
  };

  _proto.plusHours = function plusHours(hoursToAdd) {
    if (hoursToAdd === 0) {
      return this;
    }

    var newHour = MathUtil.intMod(MathUtil.intMod(hoursToAdd, LocalTime.HOURS_PER_DAY) + this._hour + LocalTime.HOURS_PER_DAY, LocalTime.HOURS_PER_DAY);
    return new LocalTime(newHour, this._minute, this._second, this._nano);
  };

  _proto.plusMinutes = function plusMinutes(minutesToAdd) {
    if (minutesToAdd === 0) {
      return this;
    }

    var mofd = this._hour * LocalTime.MINUTES_PER_HOUR + this._minute;
    var newMofd = MathUtil.intMod(MathUtil.intMod(minutesToAdd, LocalTime.MINUTES_PER_DAY) + mofd + LocalTime.MINUTES_PER_DAY, LocalTime.MINUTES_PER_DAY);

    if (mofd === newMofd) {
      return this;
    }

    var newHour = MathUtil.intDiv(newMofd, LocalTime.MINUTES_PER_HOUR);
    var newMinute = MathUtil.intMod(newMofd, LocalTime.MINUTES_PER_HOUR);
    return new LocalTime(newHour, newMinute, this._second, this._nano);
  };

  _proto.plusSeconds = function plusSeconds(secondsToAdd) {
    if (secondsToAdd === 0) {
      return this;
    }

    var sofd = this._hour * LocalTime.SECONDS_PER_HOUR + this._minute * LocalTime.SECONDS_PER_MINUTE + this._second;
    var newSofd = MathUtil.intMod(MathUtil.intMod(secondsToAdd, LocalTime.SECONDS_PER_DAY) + sofd + LocalTime.SECONDS_PER_DAY, LocalTime.SECONDS_PER_DAY);

    if (sofd === newSofd) {
      return this;
    }

    var newHour = MathUtil.intDiv(newSofd, LocalTime.SECONDS_PER_HOUR);
    var newMinute = MathUtil.intMod(MathUtil.intDiv(newSofd, LocalTime.SECONDS_PER_MINUTE), LocalTime.MINUTES_PER_HOUR);
    var newSecond = MathUtil.intMod(newSofd, LocalTime.SECONDS_PER_MINUTE);
    return new LocalTime(newHour, newMinute, newSecond, this._nano);
  };

  _proto.plusNanos = function plusNanos(nanosToAdd) {
    if (nanosToAdd === 0) {
      return this;
    }

    var nofd = this.toNanoOfDay();
    var newNofd = MathUtil.intMod(MathUtil.intMod(nanosToAdd, LocalTime.NANOS_PER_DAY) + nofd + LocalTime.NANOS_PER_DAY, LocalTime.NANOS_PER_DAY);

    if (nofd === newNofd) {
      return this;
    }

    var newHour = MathUtil.intDiv(newNofd, LocalTime.NANOS_PER_HOUR);
    var newMinute = MathUtil.intMod(MathUtil.intDiv(newNofd, LocalTime.NANOS_PER_MINUTE), LocalTime.MINUTES_PER_HOUR);
    var newSecond = MathUtil.intMod(MathUtil.intDiv(newNofd, LocalTime.NANOS_PER_SECOND), LocalTime.SECONDS_PER_MINUTE);
    var newNano = MathUtil.intMod(newNofd, LocalTime.NANOS_PER_SECOND);
    return new LocalTime(newHour, newMinute, newSecond, newNano);
  };

  _proto._minusUnit = function _minusUnit(amountToSubtract, unit) {
    requireNonNull(unit, 'unit');
    return this._plusUnit(-1 * amountToSubtract, unit);
  };

  _proto.minusHours = function minusHours(hoursToSubtract) {
    return this.plusHours(-1 * MathUtil.intMod(hoursToSubtract, LocalTime.HOURS_PER_DAY));
  };

  _proto.minusMinutes = function minusMinutes(minutesToSubtract) {
    return this.plusMinutes(-1 * MathUtil.intMod(minutesToSubtract, LocalTime.MINUTES_PER_DAY));
  };

  _proto.minusSeconds = function minusSeconds(secondsToSubtract) {
    return this.plusSeconds(-1 * MathUtil.intMod(secondsToSubtract, LocalTime.SECONDS_PER_DAY));
  };

  _proto.minusNanos = function minusNanos(nanosToSubtract) {
    return this.plusNanos(-1 * MathUtil.intMod(nanosToSubtract, LocalTime.NANOS_PER_DAY));
  };

  _proto.query = function query(_query) {
    requireNonNull(_query, 'query');

    if (_query === TemporalQueries.precision()) {
      return ChronoUnit.NANOS;
    } else if (_query === TemporalQueries.localTime()) {
      return this;
    }

    if (_query === TemporalQueries.chronology() || _query === TemporalQueries.zoneId() || _query === TemporalQueries.zone() || _query === TemporalQueries.offset() || _query === TemporalQueries.localDate()) {
      return null;
    }

    return _query.queryFrom(this);
  };

  _proto.adjustInto = function adjustInto(temporal) {
    return temporal.with(LocalTime.NANO_OF_DAY, this.toNanoOfDay());
  };

  _proto.until = function until(endExclusive, unit) {
    requireNonNull(endExclusive, 'endExclusive');
    requireNonNull(unit, 'unit');
    var end = LocalTime.from(endExclusive);

    if (unit instanceof ChronoUnit) {
      var nanosUntil = end.toNanoOfDay() - this.toNanoOfDay();

      switch (unit) {
        case ChronoUnit.NANOS:
          return nanosUntil;

        case ChronoUnit.MICROS:
          return MathUtil.intDiv(nanosUntil, 1000);

        case ChronoUnit.MILLIS:
          return MathUtil.intDiv(nanosUntil, 1000000);

        case ChronoUnit.SECONDS:
          return MathUtil.intDiv(nanosUntil, LocalTime.NANOS_PER_SECOND);

        case ChronoUnit.MINUTES:
          return MathUtil.intDiv(nanosUntil, LocalTime.NANOS_PER_MINUTE);

        case ChronoUnit.HOURS:
          return MathUtil.intDiv(nanosUntil, LocalTime.NANOS_PER_HOUR);

        case ChronoUnit.HALF_DAYS:
          return MathUtil.intDiv(nanosUntil, 12 * LocalTime.NANOS_PER_HOUR);
      }

      throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
    }

    return unit.between(this, end);
  };

  _proto.atDate = function atDate(date) {
    return LocalDateTime.of(date, this);
  };

  _proto.atOffset = function atOffset(offset) {
    return OffsetTime.of(this, offset);
  };

  _proto.toSecondOfDay = function toSecondOfDay() {
    var total = this._hour * LocalTime.SECONDS_PER_HOUR;
    total += this._minute * LocalTime.SECONDS_PER_MINUTE;
    total += this._second;
    return total;
  };

  _proto.toNanoOfDay = function toNanoOfDay() {
    var total = this._hour * LocalTime.NANOS_PER_HOUR;
    total += this._minute * LocalTime.NANOS_PER_MINUTE;
    total += this._second * LocalTime.NANOS_PER_SECOND;
    total += this._nano;
    return total;
  };

  _proto.compareTo = function compareTo(other) {
    requireNonNull(other, 'other');
    requireInstance(other, LocalTime, 'other');
    var cmp = MathUtil.compareNumbers(this._hour, other._hour);

    if (cmp === 0) {
      cmp = MathUtil.compareNumbers(this._minute, other._minute);

      if (cmp === 0) {
        cmp = MathUtil.compareNumbers(this._second, other._second);

        if (cmp === 0) {
          cmp = MathUtil.compareNumbers(this._nano, other._nano);
        }
      }
    }

    return cmp;
  };

  _proto.isAfter = function isAfter(other) {
    return this.compareTo(other) > 0;
  };

  _proto.isBefore = function isBefore(other) {
    return this.compareTo(other) < 0;
  };

  _proto.equals = function equals(other) {
    if (this === other) {
      return true;
    }

    if (other instanceof LocalTime) {
      return this._hour === other._hour && this._minute === other._minute && this._second === other._second && this._nano === other._nano;
    }

    return false;
  };

  _proto.hashCode = function hashCode() {
    var nod = this.toNanoOfDay();
    return MathUtil.hash(nod);
  };

  _proto.toString = function toString() {
    var buf = '';
    var hourValue = this._hour;
    var minuteValue = this._minute;
    var secondValue = this._second;
    var nanoValue = this._nano;
    buf += hourValue < 10 ? '0' : '';
    buf += hourValue;
    buf += minuteValue < 10 ? ':0' : ':';
    buf += minuteValue;

    if (secondValue > 0 || nanoValue > 0) {
      buf += secondValue < 10 ? ':0' : ':';
      buf += secondValue;

      if (nanoValue > 0) {
        buf += '.';

        if (MathUtil.intMod(nanoValue, 1000000) === 0) {
          buf += ("" + (MathUtil.intDiv(nanoValue, 1000000) + 1000)).substring(1);
        } else if (MathUtil.intMod(nanoValue, 1000) === 0) {
          buf += ("" + (MathUtil.intDiv(nanoValue, 1000) + 1000000)).substring(1);
        } else {
          buf += ("" + (nanoValue + 1000000000)).substring(1);
        }
      }
    }

    return buf;
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  _proto.format = function format(formatter) {
    requireNonNull(formatter, 'formatter');
    return formatter.format(this);
  };

  return LocalTime;
}(Temporal);
function _init$3() {
  LocalTime.HOURS = [];

  for (var hour = 0; hour < 24; hour++) {
    LocalTime.of(hour, 0, 0, 0);
  }

  LocalTime.MIN = LocalTime.HOURS[0];
  LocalTime.MAX = new LocalTime(23, 59, 59, 999999999);
  LocalTime.MIDNIGHT = LocalTime.HOURS[0];
  LocalTime.NOON = LocalTime.HOURS[12];
  LocalTime.FROM = createTemporalQuery('LocalTime.FROM', function (temporal) {
    return LocalTime.from(temporal);
  });
}
LocalTime.HOURS_PER_DAY = 24;
LocalTime.MINUTES_PER_HOUR = 60;
LocalTime.MINUTES_PER_DAY = LocalTime.MINUTES_PER_HOUR * LocalTime.HOURS_PER_DAY;
LocalTime.SECONDS_PER_MINUTE = 60;
LocalTime.SECONDS_PER_HOUR = LocalTime.SECONDS_PER_MINUTE * LocalTime.MINUTES_PER_HOUR;
LocalTime.SECONDS_PER_DAY = LocalTime.SECONDS_PER_HOUR * LocalTime.HOURS_PER_DAY;
LocalTime.MILLIS_PER_DAY = LocalTime.SECONDS_PER_DAY * 1000;
LocalTime.MICROS_PER_DAY = LocalTime.SECONDS_PER_DAY * 1000000;
LocalTime.NANOS_PER_SECOND = 1000000000;
LocalTime.NANOS_PER_MINUTE = LocalTime.NANOS_PER_SECOND * LocalTime.SECONDS_PER_MINUTE;
LocalTime.NANOS_PER_HOUR = LocalTime.NANOS_PER_MINUTE * LocalTime.MINUTES_PER_HOUR;
LocalTime.NANOS_PER_DAY = LocalTime.NANOS_PER_HOUR * LocalTime.HOURS_PER_DAY;

var NANOS_PER_MILLI = 1000000;
var Instant = function (_Temporal) {
  _inheritsLoose(Instant, _Temporal);

  Instant.now = function now(clock) {
    if (clock === void 0) {
      clock = Clock.systemUTC();
    }

    return clock.instant();
  };

  Instant.ofEpochSecond = function ofEpochSecond(epochSecond, nanoAdjustment) {
    if (nanoAdjustment === void 0) {
      nanoAdjustment = 0;
    }

    var secs = epochSecond + MathUtil.floorDiv(nanoAdjustment, LocalTime.NANOS_PER_SECOND);
    var nos = MathUtil.floorMod(nanoAdjustment, LocalTime.NANOS_PER_SECOND);
    return Instant._create(secs, nos);
  };

  Instant.ofEpochMilli = function ofEpochMilli(epochMilli) {
    var secs = MathUtil.floorDiv(epochMilli, 1000);
    var mos = MathUtil.floorMod(epochMilli, 1000);
    return Instant._create(secs, mos * 1000000);
  };

  Instant.ofEpochMicro = function ofEpochMicro(epochMicro) {
    var secs = MathUtil.floorDiv(epochMicro, 1000000);
    var mos = MathUtil.floorMod(epochMicro, 1000000);
    return Instant._create(secs, mos * 1000);
  };

  Instant.from = function from(temporal) {
    try {
      var instantSecs = temporal.getLong(ChronoField.INSTANT_SECONDS);
      var nanoOfSecond = temporal.get(ChronoField.NANO_OF_SECOND);
      return Instant.ofEpochSecond(instantSecs, nanoOfSecond);
    } catch (ex) {
      throw new DateTimeException("Unable to obtain Instant from TemporalAccessor: " + temporal + ", type " + typeof temporal, ex);
    }
  };

  Instant.parse = function parse(text) {
    return DateTimeFormatter.ISO_INSTANT.parse(text, Instant.FROM);
  };

  Instant._create = function _create(seconds, nanoOfSecond) {
    if (seconds === 0 && nanoOfSecond === 0) {
      return Instant.EPOCH;
    }

    return new Instant(seconds, nanoOfSecond);
  };

  Instant._validate = function _validate(seconds, nanoOfSecond) {
    if (seconds < Instant.MIN_SECONDS || seconds > Instant.MAX_SECONDS) {
      throw new DateTimeException('Instant exceeds minimum or maximum instant');
    }

    if (nanoOfSecond < 0 || nanoOfSecond > LocalTime.NANOS_PER_SECOND) {
      throw new DateTimeException('Instant exceeds minimum or maximum instant');
    }
  };

  function Instant(seconds, nanoOfSecond) {
    var _this;

    _this = _Temporal.call(this) || this;

    Instant._validate(seconds, nanoOfSecond);

    _this._seconds = MathUtil.safeToInt(seconds);
    _this._nanos = MathUtil.safeToInt(nanoOfSecond);
    return _this;
  }

  var _proto = Instant.prototype;

  _proto.isSupported = function isSupported(fieldOrUnit) {
    if (fieldOrUnit instanceof ChronoField) {
      return fieldOrUnit === ChronoField.INSTANT_SECONDS || fieldOrUnit === ChronoField.NANO_OF_SECOND || fieldOrUnit === ChronoField.MICRO_OF_SECOND || fieldOrUnit === ChronoField.MILLI_OF_SECOND;
    }

    if (fieldOrUnit instanceof ChronoUnit) {
      return fieldOrUnit.isTimeBased() || fieldOrUnit === ChronoUnit.DAYS;
    }

    return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
  };

  _proto.range = function range(field) {
    return _Temporal.prototype.range.call(this, field);
  };

  _proto.get = function get(field) {
    return this.getLong(field);
  };

  _proto.getLong = function getLong(field) {
    if (field instanceof ChronoField) {
      switch (field) {
        case ChronoField.NANO_OF_SECOND:
          return this._nanos;

        case ChronoField.MICRO_OF_SECOND:
          return MathUtil.intDiv(this._nanos, 1000);

        case ChronoField.MILLI_OF_SECOND:
          return MathUtil.intDiv(this._nanos, NANOS_PER_MILLI);

        case ChronoField.INSTANT_SECONDS:
          return this._seconds;
      }

      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.getFrom(this);
  };

  _proto.epochSecond = function epochSecond() {
    return this._seconds;
  };

  _proto.nano = function nano() {
    return this._nanos;
  };

  _proto._withField = function _withField(field, newValue) {
    requireNonNull(field, 'field');

    if (field instanceof ChronoField) {
      field.checkValidValue(newValue);

      switch (field) {
        case ChronoField.MILLI_OF_SECOND:
          {
            var nval = newValue * NANOS_PER_MILLI;
            return nval !== this._nanos ? Instant._create(this._seconds, nval) : this;
          }

        case ChronoField.MICRO_OF_SECOND:
          {
            var _nval = newValue * 1000;

            return _nval !== this._nanos ? Instant._create(this._seconds, _nval) : this;
          }

        case ChronoField.NANO_OF_SECOND:
          return newValue !== this._nanos ? Instant._create(this._seconds, newValue) : this;

        case ChronoField.INSTANT_SECONDS:
          return newValue !== this._seconds ? Instant._create(newValue, this._nanos) : this;
      }

      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.adjustInto(this, newValue);
  };

  _proto.truncatedTo = function truncatedTo(unit) {
    requireNonNull(unit, 'unit');

    if (unit === ChronoUnit.NANOS) {
      return this;
    }

    var unitDur = unit.duration();

    if (unitDur.seconds() > LocalTime.SECONDS_PER_DAY) {
      throw new DateTimeException('Unit is too large to be used for truncation');
    }

    var dur = unitDur.toNanos();

    if (MathUtil.intMod(LocalTime.NANOS_PER_DAY, dur) !== 0) {
      throw new DateTimeException('Unit must divide into a standard day without remainder');
    }

    var nod = MathUtil.intMod(this._seconds, LocalTime.SECONDS_PER_DAY) * LocalTime.NANOS_PER_SECOND + this._nanos;

    var result = MathUtil.intDiv(nod, dur) * dur;
    return this.plusNanos(result - nod);
  };

  _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
    requireNonNull(amountToAdd, 'amountToAdd');
    requireNonNull(unit, 'unit');
    requireInstance(unit, TemporalUnit);

    if (unit instanceof ChronoUnit) {
      switch (unit) {
        case ChronoUnit.NANOS:
          return this.plusNanos(amountToAdd);

        case ChronoUnit.MICROS:
          return this.plusMicros(amountToAdd);

        case ChronoUnit.MILLIS:
          return this.plusMillis(amountToAdd);

        case ChronoUnit.SECONDS:
          return this.plusSeconds(amountToAdd);

        case ChronoUnit.MINUTES:
          return this.plusSeconds(MathUtil.safeMultiply(amountToAdd, LocalTime.SECONDS_PER_MINUTE));

        case ChronoUnit.HOURS:
          return this.plusSeconds(MathUtil.safeMultiply(amountToAdd, LocalTime.SECONDS_PER_HOUR));

        case ChronoUnit.HALF_DAYS:
          return this.plusSeconds(MathUtil.safeMultiply(amountToAdd, LocalTime.SECONDS_PER_DAY / 2));

        case ChronoUnit.DAYS:
          return this.plusSeconds(MathUtil.safeMultiply(amountToAdd, LocalTime.SECONDS_PER_DAY));
      }

      throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
    }

    return unit.addTo(this, amountToAdd);
  };

  _proto.plusSeconds = function plusSeconds(secondsToAdd) {
    return this._plus(secondsToAdd, 0);
  };

  _proto.plusMillis = function plusMillis(millisToAdd) {
    return this._plus(MathUtil.intDiv(millisToAdd, 1000), MathUtil.intMod(millisToAdd, 1000) * NANOS_PER_MILLI);
  };

  _proto.plusNanos = function plusNanos(nanosToAdd) {
    return this._plus(0, nanosToAdd);
  };

  _proto.plusMicros = function plusMicros(microsToAdd) {
    return this._plus(MathUtil.intDiv(microsToAdd, 1000000), MathUtil.intMod(microsToAdd, 1000000) * 1000);
  };

  _proto._plus = function _plus(secondsToAdd, nanosToAdd) {
    if (secondsToAdd === 0 && nanosToAdd === 0) {
      return this;
    }

    var epochSec = this._seconds + secondsToAdd;
    epochSec = epochSec + MathUtil.intDiv(nanosToAdd, LocalTime.NANOS_PER_SECOND);
    var nanoAdjustment = this._nanos + nanosToAdd % LocalTime.NANOS_PER_SECOND;
    return Instant.ofEpochSecond(epochSec, nanoAdjustment);
  };

  _proto._minusUnit = function _minusUnit(amountToSubtract, unit) {
    return this._plusUnit(-1 * amountToSubtract, unit);
  };

  _proto.minusSeconds = function minusSeconds(secondsToSubtract) {
    return this.plusSeconds(secondsToSubtract * -1);
  };

  _proto.minusMillis = function minusMillis(millisToSubtract) {
    return this.plusMillis(-1 * millisToSubtract);
  };

  _proto.minusNanos = function minusNanos(nanosToSubtract) {
    return this.plusNanos(-1 * nanosToSubtract);
  };

  _proto.minusMicros = function minusMicros(microsToSubtract) {
    return this.plusMicros(-1 * microsToSubtract);
  };

  _proto.query = function query(_query) {
    requireNonNull(_query, 'query');

    if (_query === TemporalQueries.precision()) {
      return ChronoUnit.NANOS;
    }

    if (_query === TemporalQueries.localDate() || _query === TemporalQueries.localTime() || _query === TemporalQueries.chronology() || _query === TemporalQueries.zoneId() || _query === TemporalQueries.zone() || _query === TemporalQueries.offset()) {
      return null;
    }

    return _query.queryFrom(this);
  };

  _proto.adjustInto = function adjustInto(temporal) {
    requireNonNull(temporal, 'temporal');
    return temporal.with(ChronoField.INSTANT_SECONDS, this._seconds).with(ChronoField.NANO_OF_SECOND, this._nanos);
  };

  _proto.until = function until(endExclusive, unit) {
    requireNonNull(endExclusive, 'endExclusive');
    requireNonNull(unit, 'unit');
    var end = Instant.from(endExclusive);

    if (unit instanceof ChronoUnit) {
      switch (unit) {
        case ChronoUnit.NANOS:
          return this._nanosUntil(end);

        case ChronoUnit.MICROS:
          return this._microsUntil(end);

        case ChronoUnit.MILLIS:
          return MathUtil.safeSubtract(end.toEpochMilli(), this.toEpochMilli());

        case ChronoUnit.SECONDS:
          return this._secondsUntil(end);

        case ChronoUnit.MINUTES:
          return MathUtil.intDiv(this._secondsUntil(end), LocalTime.SECONDS_PER_MINUTE);

        case ChronoUnit.HOURS:
          return MathUtil.intDiv(this._secondsUntil(end), LocalTime.SECONDS_PER_HOUR);

        case ChronoUnit.HALF_DAYS:
          return MathUtil.intDiv(this._secondsUntil(end), 12 * LocalTime.SECONDS_PER_HOUR);

        case ChronoUnit.DAYS:
          return MathUtil.intDiv(this._secondsUntil(end), LocalTime.SECONDS_PER_DAY);
      }

      throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
    }

    return unit.between(this, end);
  };

  _proto._microsUntil = function _microsUntil(end) {
    var secsDiff = MathUtil.safeSubtract(end.epochSecond(), this.epochSecond());
    var totalMicros = MathUtil.safeMultiply(secsDiff, 1000000);
    return MathUtil.safeAdd(totalMicros, MathUtil.intDiv(end.nano() - this.nano(), 1000));
  };

  _proto._nanosUntil = function _nanosUntil(end) {
    var secsDiff = MathUtil.safeSubtract(end.epochSecond(), this.epochSecond());
    var totalNanos = MathUtil.safeMultiply(secsDiff, LocalTime.NANOS_PER_SECOND);
    return MathUtil.safeAdd(totalNanos, end.nano() - this.nano());
  };

  _proto._secondsUntil = function _secondsUntil(end) {
    var secsDiff = MathUtil.safeSubtract(end.epochSecond(), this.epochSecond());
    var nanosDiff = end.nano() - this.nano();

    if (secsDiff > 0 && nanosDiff < 0) {
      secsDiff--;
    } else if (secsDiff < 0 && nanosDiff > 0) {
      secsDiff++;
    }

    return secsDiff;
  };

  _proto.atOffset = function atOffset(offset) {
    return OffsetDateTime.ofInstant(this, offset);
  };

  _proto.atZone = function atZone(zone) {
    return ZonedDateTime.ofInstant(this, zone);
  };

  _proto.toEpochMilli = function toEpochMilli() {
    var millis = MathUtil.safeMultiply(this._seconds, 1000);
    return millis + MathUtil.intDiv(this._nanos, NANOS_PER_MILLI);
  };

  _proto.compareTo = function compareTo(otherInstant) {
    requireNonNull(otherInstant, 'otherInstant');
    requireInstance(otherInstant, Instant, 'otherInstant');
    var cmp = MathUtil.compareNumbers(this._seconds, otherInstant._seconds);

    if (cmp !== 0) {
      return cmp;
    }

    return this._nanos - otherInstant._nanos;
  };

  _proto.isAfter = function isAfter(otherInstant) {
    return this.compareTo(otherInstant) > 0;
  };

  _proto.isBefore = function isBefore(otherInstant) {
    return this.compareTo(otherInstant) < 0;
  };

  _proto.equals = function equals(other) {
    if (this === other) {
      return true;
    }

    if (other instanceof Instant) {
      return this.epochSecond() === other.epochSecond() && this.nano() === other.nano();
    }

    return false;
  };

  _proto.hashCode = function hashCode() {
    return MathUtil.hashCode(this._seconds, this._nanos);
  };

  _proto.toString = function toString() {
    return DateTimeFormatter.ISO_INSTANT.format(this);
  };

  _proto.toJSON = function toJSON() {
    return this.toString();
  };

  return Instant;
}(Temporal);
function _init$2() {
  Instant.MIN_SECONDS = -31619119219200;
  Instant.MAX_SECONDS = 31494816403199;
  Instant.EPOCH = new Instant(0, 0);
  Instant.MIN = Instant.ofEpochSecond(Instant.MIN_SECONDS, 0);
  Instant.MAX = Instant.ofEpochSecond(Instant.MAX_SECONDS, 999999999);
  Instant.FROM = createTemporalQuery('Instant.FROM', function (temporal) {
    return Instant.from(temporal);
  });
}

var Clock = function () {
  function Clock() {}

  Clock.systemUTC = function systemUTC() {
    return new SystemClock(ZoneOffset.UTC);
  };

  Clock.systemDefaultZone = function systemDefaultZone() {
    return new SystemClock(ZoneId.systemDefault());
  };

  Clock.system = function system(zone) {
    return new SystemClock(zone);
  };

  Clock.fixed = function fixed(fixedInstant, zoneId) {
    return new FixedClock(fixedInstant, zoneId);
  };

  Clock.offset = function offset(baseClock, duration) {
    return new OffsetClock(baseClock, duration);
  };

  var _proto = Clock.prototype;

  _proto.millis = function millis() {
    abstractMethodFail('Clock.millis');
  };

  _proto.instant = function instant() {
    abstractMethodFail('Clock.instant');
  };

  _proto.zone = function zone() {
    abstractMethodFail('Clock.zone');
  };

  _proto.withZone = function withZone() {
    abstractMethodFail('Clock.withZone');
  };

  return Clock;
}();

var SystemClock = function (_Clock) {
  _inheritsLoose(SystemClock, _Clock);

  function SystemClock(zone) {
    var _this;

    requireNonNull(zone, 'zone');
    _this = _Clock.call(this) || this;
    _this._zone = zone;
    return _this;
  }

  var _proto2 = SystemClock.prototype;

  _proto2.zone = function zone() {
    return this._zone;
  };

  _proto2.millis = function millis() {
    return new Date().getTime();
  };

  _proto2.instant = function instant() {
    return Instant.ofEpochMilli(this.millis());
  };

  _proto2.equals = function equals(obj) {
    if (obj instanceof SystemClock) {
      return this._zone.equals(obj._zone);
    }

    return false;
  };

  _proto2.withZone = function withZone(zone) {
    if (zone.equals(this._zone)) {
      return this;
    }

    return new SystemClock(zone);
  };

  _proto2.toString = function toString() {
    return "SystemClock[" + this._zone.toString() + "]";
  };

  return SystemClock;
}(Clock);

var FixedClock = function (_Clock2) {
  _inheritsLoose(FixedClock, _Clock2);

  function FixedClock(fixedInstant, zoneId) {
    var _this2;

    _this2 = _Clock2.call(this) || this;
    _this2._instant = fixedInstant;
    _this2._zoneId = zoneId;
    return _this2;
  }

  var _proto3 = FixedClock.prototype;

  _proto3.instant = function instant() {
    return this._instant;
  };

  _proto3.millis = function millis() {
    return this._instant.toEpochMilli();
  };

  _proto3.zone = function zone() {
    return this._zoneId;
  };

  _proto3.toString = function toString() {
    return 'FixedClock[]';
  };

  _proto3.equals = function equals(obj) {
    if (obj instanceof FixedClock) {
      return this._instant.equals(obj._instant) && this._zoneId.equals(obj._zoneId);
    }

    return false;
  };

  _proto3.withZone = function withZone(zone) {
    if (zone.equals(this._zoneId)) {
      return this;
    }

    return new FixedClock(this._instant, zone);
  };

  return FixedClock;
}(Clock);

var OffsetClock = function (_Clock3) {
  _inheritsLoose(OffsetClock, _Clock3);

  function OffsetClock(baseClock, offset) {
    var _this3;

    _this3 = _Clock3.call(this) || this;
    _this3._baseClock = baseClock;
    _this3._offset = offset;
    return _this3;
  }

  var _proto4 = OffsetClock.prototype;

  _proto4.zone = function zone() {
    return this._baseClock.zone();
  };

  _proto4.withZone = function withZone(zone) {
    if (zone.equals(this._baseClock.zone())) {
      return this;
    }

    return new OffsetClock(this._baseClock.withZone(zone), this._offset);
  };

  _proto4.millis = function millis() {
    return this._baseClock.millis() + this._offset.toMillis();
  };

  _proto4.instant = function instant() {
    return this._baseClock.instant().plus(this._offset);
  };

  _proto4.equals = function equals(obj) {
    if (obj instanceof OffsetClock) {
      return this._baseClock.equals(obj._baseClock) && this._offset.equals(obj._offset);
    }

    return false;
  };

  _proto4.toString = function toString() {
    return "OffsetClock[" + this._baseClock + "," + this._offset + "]";
  };

  return OffsetClock;
}(Clock);

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var ZoneOffsetTransition = function () {
  ZoneOffsetTransition.of = function of(transition, offsetBefore, offsetAfter) {
    return new ZoneOffsetTransition(transition, offsetBefore, offsetAfter);
  };

  function ZoneOffsetTransition(transition, offsetBefore, offsetAfter) {
    requireNonNull(transition, 'transition');
    requireNonNull(offsetBefore, 'offsetBefore');
    requireNonNull(offsetAfter, 'offsetAfter');

    if (offsetBefore.equals(offsetAfter)) {
      throw new IllegalArgumentException('Offsets must not be equal');
    }

    if (transition.nano() !== 0) {
      throw new IllegalArgumentException('Nano-of-second must be zero');
    }

    if (transition instanceof LocalDateTime) {
      this._transition = transition;
    } else {
      this._transition = LocalDateTime.ofEpochSecond(transition, 0, offsetBefore);
    }

    this._offsetBefore = offsetBefore;
    this._offsetAfter = offsetAfter;
  }

  var _proto = ZoneOffsetTransition.prototype;

  _proto.instant = function instant() {
    return this._transition.toInstant(this._offsetBefore);
  };

  _proto.toEpochSecond = function toEpochSecond() {
    return this._transition.toEpochSecond(this._offsetBefore);
  };

  _proto.dateTimeBefore = function dateTimeBefore() {
    return this._transition;
  };

  _proto.dateTimeAfter = function dateTimeAfter() {
    return this._transition.plusSeconds(this.durationSeconds());
  };

  _proto.offsetBefore = function offsetBefore() {
    return this._offsetBefore;
  };

  _proto.offsetAfter = function offsetAfter() {
    return this._offsetAfter;
  };

  _proto.duration = function duration() {
    return Duration.ofSeconds(this.durationSeconds());
  };

  _proto.durationSeconds = function durationSeconds() {
    return this._offsetAfter.totalSeconds() - this._offsetBefore.totalSeconds();
  };

  _proto.isGap = function isGap() {
    return this._offsetAfter.totalSeconds() > this._offsetBefore.totalSeconds();
  };

  _proto.isOverlap = function isOverlap() {
    return this._offsetAfter.totalSeconds() < this._offsetBefore.totalSeconds();
  };

  _proto.isValidOffset = function isValidOffset(offset) {
    return this.isGap() ? false : this._offsetBefore.equals(offset) || this._offsetAfter.equals(offset);
  };

  _proto.validOffsets = function validOffsets() {
    if (this.isGap()) {
      return [];
    } else {
      return [this._offsetBefore, this._offsetAfter];
    }
  };

  _proto.compareTo = function compareTo(transition) {
    return this.instant().compareTo(transition.instant());
  };

  _proto.equals = function equals(other) {
    if (other === this) {
      return true;
    }

    if (other instanceof ZoneOffsetTransition) {
      var d = other;
      return this._transition.equals(d._transition) && this._offsetBefore.equals(d.offsetBefore()) && this._offsetAfter.equals(d.offsetAfter());
    }

    return false;
  };

  _proto.hashCode = function hashCode() {
    return this._transition.hashCode() ^ this._offsetBefore.hashCode() ^ this._offsetAfter.hashCode() >>> 16;
  };

  _proto.toString = function toString() {
    return "Transition[" + (this.isGap() ? 'Gap' : 'Overlap') + " at " + this._transition.toString() + this._offsetBefore.toString() + " to " + this._offsetAfter + "]";
  };

  return ZoneOffsetTransition;
}();

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
function _init$1() {
  TemporalQueries.ZONE_ID = createTemporalQuery('ZONE_ID', function (temporal) {
    return temporal.query(TemporalQueries.ZONE_ID);
  });
  TemporalQueries.CHRONO = createTemporalQuery('CHRONO', function (temporal) {
    return temporal.query(TemporalQueries.CHRONO);
  });
  TemporalQueries.PRECISION = createTemporalQuery('PRECISION', function (temporal) {
    return temporal.query(TemporalQueries.PRECISION);
  });
  TemporalQueries.OFFSET = createTemporalQuery('OFFSET', function (temporal) {
    if (temporal.isSupported(ChronoField.OFFSET_SECONDS)) {
      return ZoneOffset.ofTotalSeconds(temporal.get(ChronoField.OFFSET_SECONDS));
    }

    return null;
  });
  TemporalQueries.ZONE = createTemporalQuery('ZONE', function (temporal) {
    var zone = temporal.query(TemporalQueries.ZONE_ID);
    return zone != null ? zone : temporal.query(TemporalQueries.OFFSET);
  });
  TemporalQueries.LOCAL_DATE = createTemporalQuery('LOCAL_DATE', function (temporal) {
    if (temporal.isSupported(ChronoField.EPOCH_DAY)) {
      return LocalDate.ofEpochDay(temporal.getLong(ChronoField.EPOCH_DAY));
    }

    return null;
  });
  TemporalQueries.LOCAL_TIME = createTemporalQuery('LOCAL_TIME', function (temporal) {
    if (temporal.isSupported(ChronoField.NANO_OF_DAY)) {
      return LocalTime.ofNanoOfDay(temporal.getLong(ChronoField.NANO_OF_DAY));
    }

    return null;
  });
}

var SystemDefaultZoneRules = function (_ZoneRules) {
  _inheritsLoose(SystemDefaultZoneRules, _ZoneRules);

  function SystemDefaultZoneRules() {
    return _ZoneRules.apply(this, arguments) || this;
  }

  var _proto = SystemDefaultZoneRules.prototype;

  _proto.isFixedOffset = function isFixedOffset() {
    return false;
  };

  _proto.offsetOfInstant = function offsetOfInstant(instant) {
    var offsetInMinutes = new Date(instant.toEpochMilli()).getTimezoneOffset();
    return ZoneOffset.ofTotalMinutes(offsetInMinutes * -1);
  };

  _proto.offsetOfEpochMilli = function offsetOfEpochMilli(epochMilli) {
    var offsetInMinutes = new Date(epochMilli).getTimezoneOffset();
    return ZoneOffset.ofTotalMinutes(offsetInMinutes * -1);
  };

  _proto.offsetOfLocalDateTime = function offsetOfLocalDateTime(localDateTime) {
    var epochMilli = localDateTime.toEpochSecond(ZoneOffset.UTC) * 1000;
    var offsetInMinutesBeforePossibleTransition = new Date(epochMilli).getTimezoneOffset();
    var epochMilliSystemZone = epochMilli + offsetInMinutesBeforePossibleTransition * 60000;
    var offsetInMinutesAfterPossibleTransition = new Date(epochMilliSystemZone).getTimezoneOffset();
    return ZoneOffset.ofTotalMinutes(offsetInMinutesAfterPossibleTransition * -1);
  };

  _proto.validOffsets = function validOffsets(localDateTime) {
    return [this.offsetOfLocalDateTime(localDateTime)];
  };

  _proto.transition = function transition() {
    return null;
  };

  _proto.standardOffset = function standardOffset(instant) {
    return this.offsetOfInstant(instant);
  };

  _proto.daylightSavings = function daylightSavings() {
    this._throwNotSupported();
  };

  _proto.isDaylightSavings = function isDaylightSavings() {
    this._throwNotSupported();
  };

  _proto.isValidOffset = function isValidOffset(dateTime, offset) {
    return this.offsetOfLocalDateTime(dateTime).equals(offset);
  };

  _proto.nextTransition = function nextTransition() {
    this._throwNotSupported();
  };

  _proto.previousTransition = function previousTransition() {
    this._throwNotSupported();
  };

  _proto.transitions = function transitions() {
    this._throwNotSupported();
  };

  _proto.transitionRules = function transitionRules() {
    this._throwNotSupported();
  };

  _proto._throwNotSupported = function _throwNotSupported() {
    throw new DateTimeException('not supported operation');
  };

  _proto.equals = function equals(other) {
    if (this === other || other instanceof SystemDefaultZoneRules) {
      return true;
    } else {
      return false;
    }
  };

  _proto.toString = function toString() {
    return 'SYSTEM';
  };

  return SystemDefaultZoneRules;
}(ZoneRules);

var SystemDefaultZoneId = function (_ZoneId) {
  _inheritsLoose(SystemDefaultZoneId, _ZoneId);

  function SystemDefaultZoneId() {
    var _this;

    _this = _ZoneId.call(this) || this;
    _this._rules = new SystemDefaultZoneRules();
    return _this;
  }

  var _proto = SystemDefaultZoneId.prototype;

  _proto.rules = function rules() {
    return this._rules;
  };

  _proto.equals = function equals(other) {
    if (this === other) {
      return true;
    }

    return false;
  };

  _proto.id = function id() {
    return 'SYSTEM';
  };

  return SystemDefaultZoneId;
}(ZoneId);

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var ZoneIdFactory = function () {
  function ZoneIdFactory() {}

  ZoneIdFactory.systemDefault = function systemDefault() {
    return SYSTEM_DEFAULT_ZONE_ID_INSTANCE;
  };

  ZoneIdFactory.getAvailableZoneIds = function getAvailableZoneIds() {
    return ZoneRulesProvider.getAvailableZoneIds();
  };

  ZoneIdFactory.of = function of(zoneId) {
    requireNonNull(zoneId, 'zoneId');

    if (zoneId === 'Z') {
      return ZoneOffset.UTC;
    }

    if (zoneId.length === 1) {
      throw new DateTimeException("Invalid zone: " + zoneId);
    }

    if (StringUtil.startsWith(zoneId, '+') || StringUtil.startsWith(zoneId, '-')) {
      return ZoneOffset.of(zoneId);
    }

    if (zoneId === 'UTC' || zoneId === 'GMT' || zoneId === 'GMT0' || zoneId === 'UT') {
      return new ZoneRegion(zoneId, ZoneOffset.UTC.rules());
    }

    if (StringUtil.startsWith(zoneId, 'UTC+') || StringUtil.startsWith(zoneId, 'GMT+') || StringUtil.startsWith(zoneId, 'UTC-') || StringUtil.startsWith(zoneId, 'GMT-')) {
      var offset = ZoneOffset.of(zoneId.substring(3));

      if (offset.totalSeconds() === 0) {
        return new ZoneRegion(zoneId.substring(0, 3), offset.rules());
      }

      return new ZoneRegion(zoneId.substring(0, 3) + offset.id(), offset.rules());
    }

    if (StringUtil.startsWith(zoneId, 'UT+') || StringUtil.startsWith(zoneId, 'UT-')) {
      var _offset = ZoneOffset.of(zoneId.substring(2));

      if (_offset.totalSeconds() === 0) {
        return new ZoneRegion('UT', _offset.rules());
      }

      return new ZoneRegion("UT" + _offset.id(), _offset.rules());
    }

    if (zoneId === 'SYSTEM') {
      return ZoneId.systemDefault();
    }

    return ZoneRegion.ofId(zoneId);
  };

  ZoneIdFactory.ofOffset = function ofOffset(prefix, offset) {
    requireNonNull(prefix, 'prefix');
    requireNonNull(offset, 'offset');

    if (prefix.length === 0) {
      return offset;
    }

    if (prefix === 'GMT' || prefix === 'UTC' || prefix === 'UT') {
      if (offset.totalSeconds() === 0) {
        return new ZoneRegion(prefix, offset.rules());
      }

      return new ZoneRegion(prefix + offset.id(), offset.rules());
    }

    throw new IllegalArgumentException("Invalid prefix, must be GMT, UTC or UT: " + prefix);
  };

  ZoneIdFactory.from = function from(temporal) {
    requireNonNull(temporal, 'temporal');
    var obj = temporal.query(TemporalQueries.zone());

    if (obj == null) {
      throw new DateTimeException("Unable to obtain ZoneId from TemporalAccessor: " + temporal + ", type " + (temporal.constructor != null ? temporal.constructor.name : ''));
    }

    return obj;
  };

  return ZoneIdFactory;
}();
var SYSTEM_DEFAULT_ZONE_ID_INSTANCE = null;
function _init() {
  SYSTEM_DEFAULT_ZONE_ID_INSTANCE = new SystemDefaultZoneId();
  ZoneId.systemDefault = ZoneIdFactory.systemDefault;
  ZoneId.getAvailableZoneIds = ZoneIdFactory.getAvailableZoneIds;
  ZoneId.of = ZoneIdFactory.of;
  ZoneId.ofOffset = ZoneIdFactory.ofOffset;
  ZoneId.from = ZoneIdFactory.from;
  ZoneOffset.from = ZoneIdFactory.from;
  ZoneId.SYSTEM = SYSTEM_DEFAULT_ZONE_ID_INSTANCE;
  ZoneId.UTC = ZoneOffset.ofTotalSeconds(0);
}

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var isInit = false;

function init() {
  if (isInit) {
    return;
  }

  isInit = true;
  _init$m();
  _init$n();
  _init$l();
  _init$k();
  _init$3();
  _init$f();
  _init$1();
  _init$j();
  _init$2();
  _init$5();
  _init$4();
  _init$a();
  _init$i();
  _init$b();
  _init$c();
  _init$h();
  _init$g();
  _init$7();
  _init();
  _init$9();
  _init$d();
  _init$e();
  _init$6();
  _init$8();
}

init();

/*
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */

var ToNativeJsConverter = function () {
  function ToNativeJsConverter(temporal, zone) {
    var zonedDateTime;

    if (temporal instanceof Instant) {
      this.instant = temporal;
      return;
    } else if (temporal instanceof LocalDate) {
      zone = zone == null ? ZoneId.systemDefault() : zone;
      zonedDateTime = temporal.atStartOfDay(zone);
    } else if (temporal instanceof LocalDateTime) {
      zone = zone == null ? ZoneId.systemDefault() : zone;
      zonedDateTime = temporal.atZone(zone);
    } else if (temporal instanceof ZonedDateTime) {
      if (zone == null) {
        zonedDateTime = temporal;
      } else {
        zonedDateTime = temporal.withZoneSameInstant(zone);
      }
    } else {
      throw new IllegalArgumentException("unsupported instance for convert operation:" + temporal);
    }

    this.instant = zonedDateTime.toInstant();
  }

  var _proto = ToNativeJsConverter.prototype;

  _proto.toDate = function toDate() {
    return new Date(this.instant.toEpochMilli());
  };

  _proto.toEpochMilli = function toEpochMilli() {
    return this.instant.toEpochMilli();
  };

  return ToNativeJsConverter;
}();

function convert(temporal, zone) {
  return new ToNativeJsConverter(temporal, zone);
}

var NativeJsTemporal = function (_TemporalAccessor) {
  _inheritsLoose(NativeJsTemporal, _TemporalAccessor);

  function NativeJsTemporal(date, zone) {
    var _this;

    if (zone === void 0) {
      zone = ZoneId.systemDefault();
    }

    _this = _TemporalAccessor.call(this) || this;
    _this._zone = zone;

    if (date instanceof Date) {
      _this._epochMilli = date.getTime();
      return _assertThisInitialized(_this);
    } else if (typeof date.toDate === 'function' && date.toDate() instanceof Date) {
      _this._epochMilli = date.toDate().getTime();
      return _assertThisInitialized(_this);
    }

    assert(false, 'date must be either a javascript date or a moment');
    return _this;
  }

  var _proto = NativeJsTemporal.prototype;

  _proto.query = function query(_query) {
    requireNonNull(_query, 'query');

    if (_query === TemporalQueries.localDate()) {
      return LocalDate.ofInstant(Instant.ofEpochMilli(this._epochMilli), this._zone);
    } else if (_query === TemporalQueries.localTime()) {
      return LocalTime.ofInstant(Instant.ofEpochMilli(this._epochMilli), this._zone);
    } else if (_query === TemporalQueries.zone()) {
      return this._zone;
    }

    return _TemporalAccessor.prototype.query.call(this, _query);
  };

  _proto.get = function get(field) {
    return this.getLong(field);
  };

  _proto.getLong = function getLong(field) {
    requireNonNull(field, 'field');

    if (field instanceof ChronoField) {
      switch (field) {
        case ChronoField.NANO_OF_SECOND:
          return MathUtil.floorMod(this._epochMilli, 1000) * 1000000;

        case ChronoField.INSTANT_SECONDS:
          return MathUtil.floorDiv(this._epochMilli, 1000);
      }

      throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
    }

    return field.getFrom(this);
  };

  _proto.isSupported = function isSupported(field) {
    return field === ChronoField.INSTANT_SECONDS || field === ChronoField.NANO_OF_SECOND;
  };

  return NativeJsTemporal;
}(TemporalAccessor);

function nativeJs(date, zone) {
  return new NativeJsTemporal(date, zone);
}

function bindUse(jsJoda) {
  var used = [];
  return function use(fn) {
    if (!~used.indexOf(fn)) {
      fn(jsJoda);
      used.push(fn);
    }

    return jsJoda;
  };
}

/**
 * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
 * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
 */
var _ = {
  assert: assert$1,
  DateTimeBuilder: DateTimeBuilder,
  DateTimeParseContext: DateTimeParseContext,
  DateTimePrintContext: DateTimePrintContext,
  MathUtil: MathUtil,
  StringUtil: StringUtil,
  StringBuilder: StringBuilder
};
var jsJodaExports = {
  _: _,
  convert: convert,
  nativeJs: nativeJs,
  ArithmeticException: ArithmeticException,
  DateTimeException: DateTimeException,
  DateTimeParseException: DateTimeParseException,
  IllegalArgumentException: IllegalArgumentException,
  IllegalStateException: IllegalStateException,
  UnsupportedTemporalTypeException: UnsupportedTemporalTypeException,
  NullPointerException: NullPointerException,
  Clock: Clock,
  DayOfWeek: DayOfWeek,
  Duration: Duration,
  Instant: Instant,
  LocalDate: LocalDate,
  LocalTime: LocalTime,
  LocalDateTime: LocalDateTime,
  OffsetTime: OffsetTime,
  OffsetDateTime: OffsetDateTime,
  Month: Month,
  MonthDay: MonthDay,
  Period: Period,
  Year: Year,
  YearConstants: YearConstants,
  YearMonth: YearMonth,
  ZonedDateTime: ZonedDateTime,
  ZoneOffset: ZoneOffset,
  ZoneId: ZoneId,
  ZoneRegion: ZoneRegion,
  ZoneOffsetTransition: ZoneOffsetTransition,
  ZoneRules: ZoneRules,
  ZoneRulesProvider: ZoneRulesProvider,
  ChronoLocalDate: ChronoLocalDate,
  ChronoLocalDateTime: ChronoLocalDateTime,
  ChronoZonedDateTime: ChronoZonedDateTime,
  IsoChronology: IsoChronology,
  ChronoField: ChronoField,
  ChronoUnit: ChronoUnit,
  IsoFields: IsoFields,
  Temporal: Temporal,
  TemporalAccessor: TemporalAccessor,
  TemporalAdjuster: TemporalAdjuster,
  TemporalAdjusters: TemporalAdjusters,
  TemporalAmount: TemporalAmount,
  TemporalField: TemporalField,
  TemporalQueries: TemporalQueries,
  TemporalQuery: TemporalQuery,
  TemporalUnit: TemporalUnit,
  ValueRange: ValueRange,
  DateTimeFormatter: DateTimeFormatter,
  DateTimeFormatterBuilder: DateTimeFormatterBuilder,
  DecimalStyle: DecimalStyle,
  ResolverStyle: ResolverStyle,
  SignStyle: SignStyle,
  TextStyle: TextStyle
};
var use = bindUse(jsJodaExports);
jsJodaExports.use = use;

export { ArithmeticException, ChronoField, ChronoLocalDate, ChronoLocalDateTime, ChronoUnit, ChronoZonedDateTime, Clock, DateTimeException, DateTimeFormatter, DateTimeFormatterBuilder, DateTimeParseException, DayOfWeek, DecimalStyle, Duration, IllegalArgumentException, IllegalStateException, Instant, IsoChronology, IsoFields, LocalDate, LocalDateTime, LocalTime, Month, MonthDay, NullPointerException, OffsetDateTime, OffsetTime, Period, ResolverStyle, SignStyle, Temporal, TemporalAccessor, TemporalAdjuster, TemporalAdjusters, TemporalAmount, TemporalField, TemporalQueries, TemporalQuery, TemporalUnit, TextStyle, UnsupportedTemporalTypeException, ValueRange, Year, YearConstants, YearMonth, ZoneId, ZoneOffset, ZoneOffsetTransition, ZoneRegion, ZoneRules, ZoneRulesProvider, ZonedDateTime, _, convert, nativeJs, use };
//# sourceMappingURL=js-joda.esm.js.map
//! @version @js-joda/core - 5.2.0
//! @copyright (c) 2015-present, Philipp Thürwächter, Pattrick Hüper & js-joda contributors
//! @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
//! @license BSD-3-Clause (see LICENSE in the root directory of this source tree)

(function (global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
    typeof define === 'function' && define.amd ? define(['exports'], factory) :
    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.JSJoda = {}));
})(this, (function (exports) { 'use strict';

    /**
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    function createErrorType(name, init, superErrorClass) {
      if (superErrorClass === void 0) {
        superErrorClass = Error;
      }

      function JsJodaException(message) {
        if (!Error.captureStackTrace) {
          this.stack = new Error().stack;
        } else {
          Error.captureStackTrace(this, this.constructor);
        }

        this.message = message;
        init && init.apply(this, arguments);

        this.toString = function () {
          return this.name + ": " + this.message;
        };
      }

      JsJodaException.prototype = Object.create(superErrorClass.prototype);
      JsJodaException.prototype.name = name;
      JsJodaException.prototype.constructor = JsJodaException;
      return JsJodaException;
    }

    var DateTimeException = createErrorType('DateTimeException', messageWithCause);
    var DateTimeParseException = createErrorType('DateTimeParseException', messageForDateTimeParseException);
    var UnsupportedTemporalTypeException = createErrorType('UnsupportedTemporalTypeException', null, DateTimeException);
    var ArithmeticException = createErrorType('ArithmeticException');
    var IllegalArgumentException = createErrorType('IllegalArgumentException');
    var IllegalStateException = createErrorType('IllegalStateException');
    var NullPointerException = createErrorType('NullPointerException');

    function messageWithCause(message, cause) {
      if (cause === void 0) {
        cause = null;
      }

      var msg = message || this.name;

      if (cause !== null && cause instanceof Error) {
        msg += "\n-------\nCaused by: " + cause.stack + "\n-------\n";
      }

      this.message = msg;
    }

    function messageForDateTimeParseException(message, text, index, cause) {
      if (text === void 0) {
        text = '';
      }

      if (index === void 0) {
        index = 0;
      }

      if (cause === void 0) {
        cause = null;
      }

      var msg = message || this.name;
      msg += ": " + text + ", at index: " + index;

      if (cause !== null && cause instanceof Error) {
        msg += "\n-------\nCaused by: " + cause.stack + "\n-------\n";
      }

      this.message = msg;

      this.parsedString = function () {
        return text;
      };

      this.errorIndex = function () {
        return index;
      };
    }

    function _inheritsLoose(subClass, superClass) {
      subClass.prototype = Object.create(superClass.prototype);
      subClass.prototype.constructor = subClass;

      _setPrototypeOf(subClass, superClass);
    }

    function _setPrototypeOf(o, p) {
      _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
        o.__proto__ = p;
        return o;
      };

      return _setPrototypeOf(o, p);
    }

    function _assertThisInitialized(self) {
      if (self === void 0) {
        throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
      }

      return self;
    }

    /**
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    function assert(assertion, msg, error) {
      if (!assertion) {
        if (error) {
          throw new error(msg);
        } else {
          throw new Error(msg);
        }
      }
    }
    function requireNonNull(value, parameterName) {
      if (value == null) {
        throw new NullPointerException(parameterName + " must not be null");
      }

      return value;
    }
    function requireInstance(value, _class, parameterName) {
      if (!(value instanceof _class)) {
        throw new IllegalArgumentException(parameterName + " must be an instance of " + (_class.name ? _class.name : _class) + (value && value.constructor && value.constructor.name ? ", but is " + value.constructor.name : ''));
      }

      return value;
    }
    function abstractMethodFail(methodName) {
      throw new TypeError("abstract method \"" + methodName + "\" is not implemented");
    }

    var assert$1 = /*#__PURE__*/Object.freeze({
        __proto__: null,
        assert: assert,
        requireNonNull: requireNonNull,
        requireInstance: requireInstance,
        abstractMethodFail: abstractMethodFail
    });

    /**
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var MAX_SAFE_INTEGER = 9007199254740991;
    var MIN_SAFE_INTEGER = -9007199254740991;
    var MathUtil = function () {
      function MathUtil() {}

      MathUtil.intDiv = function intDiv(x, y) {
        var r = x / y;
        r = MathUtil.roundDown(r);
        return MathUtil.safeZero(r);
      };

      MathUtil.intMod = function intMod(x, y) {
        var r = x - MathUtil.intDiv(x, y) * y;
        r = MathUtil.roundDown(r);
        return MathUtil.safeZero(r);
      };

      MathUtil.roundDown = function roundDown(r) {
        if (r < 0) {
          return Math.ceil(r);
        } else {
          return Math.floor(r);
        }
      };

      MathUtil.floorDiv = function floorDiv(x, y) {
        var r = Math.floor(x / y);
        return MathUtil.safeZero(r);
      };

      MathUtil.floorMod = function floorMod(x, y) {
        var r = x - MathUtil.floorDiv(x, y) * y;
        return MathUtil.safeZero(r);
      };

      MathUtil.safeAdd = function safeAdd(x, y) {
        MathUtil.verifyInt(x);
        MathUtil.verifyInt(y);

        if (x === 0) {
          return MathUtil.safeZero(y);
        }

        if (y === 0) {
          return MathUtil.safeZero(x);
        }

        var r = MathUtil.safeToInt(x + y);

        if (r === x || r === y) {
          throw new ArithmeticException('Invalid addition beyond MAX_SAFE_INTEGER!');
        }

        return r;
      };

      MathUtil.safeSubtract = function safeSubtract(x, y) {
        MathUtil.verifyInt(x);
        MathUtil.verifyInt(y);

        if (x === 0 && y === 0) {
          return 0;
        } else if (x === 0) {
          return MathUtil.safeZero(-1 * y);
        } else if (y === 0) {
          return MathUtil.safeZero(x);
        }

        return MathUtil.safeToInt(x - y);
      };

      MathUtil.safeMultiply = function safeMultiply(x, y) {
        MathUtil.verifyInt(x);
        MathUtil.verifyInt(y);

        if (x === 1) {
          return MathUtil.safeZero(y);
        }

        if (y === 1) {
          return MathUtil.safeZero(x);
        }

        if (x === 0 || y === 0) {
          return 0;
        }

        var r = MathUtil.safeToInt(x * y);

        if (r / y !== x || x === MIN_SAFE_INTEGER && y === -1 || y === MIN_SAFE_INTEGER && x === -1) {
          throw new ArithmeticException("Multiplication overflows: " + x + " * " + y);
        }

        return r;
      };

      MathUtil.parseInt = function (_parseInt) {
        function parseInt(_x) {
          return _parseInt.apply(this, arguments);
        }

        parseInt.toString = function () {
          return _parseInt.toString();
        };

        return parseInt;
      }(function (value) {
        var r = parseInt(value);
        return MathUtil.safeToInt(r);
      });

      MathUtil.safeToInt = function safeToInt(value) {
        MathUtil.verifyInt(value);
        return MathUtil.safeZero(value);
      };

      MathUtil.verifyInt = function verifyInt(value) {
        if (value == null) {
          throw new ArithmeticException("Invalid value: '" + value + "', using null or undefined as argument");
        }

        if (isNaN(value)) {
          throw new ArithmeticException('Invalid int value, using NaN as argument');
        }

        if (value % 1 !== 0) {
          throw new ArithmeticException("Invalid value: '" + value + "' is a float");
        }

        if (value > MAX_SAFE_INTEGER || value < MIN_SAFE_INTEGER) {
          throw new ArithmeticException("Calculation overflows an int: " + value);
        }
      };

      MathUtil.safeZero = function safeZero(value) {
        return value === 0 ? 0 : +value;
      };

      MathUtil.compareNumbers = function compareNumbers(a, b) {
        if (a < b) {
          return -1;
        }

        if (a > b) {
          return 1;
        }

        return 0;
      };

      MathUtil.smi = function smi(int) {
        return int >>> 1 & 0x40000000 | int & 0xBFFFFFFF;
      };

      MathUtil.hash = function hash(number) {
        if (number !== number || number === Infinity) {
          return 0;
        }

        var result = number;

        while (number > 0xFFFFFFFF) {
          number /= 0xFFFFFFFF;
          result ^= number;
        }

        return MathUtil.smi(result);
      };

      MathUtil.hashCode = function hashCode() {
        var result = 17;

        for (var _len = arguments.length, numbers = new Array(_len), _key = 0; _key < _len; _key++) {
          numbers[_key] = arguments[_key];
        }

        for (var _i = 0, _numbers = numbers; _i < _numbers.length; _i++) {
          var n = _numbers[_i];
          result = (result << 5) - result + MathUtil.hash(n);
        }

        return MathUtil.hash(result);
      };

      return MathUtil;
    }();
    MathUtil.MAX_SAFE_INTEGER = MAX_SAFE_INTEGER;
    MathUtil.MIN_SAFE_INTEGER = MIN_SAFE_INTEGER;

    /**
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var Enum = function () {
      function Enum(name) {
        this._name = name;
      }

      var _proto = Enum.prototype;

      _proto.equals = function equals(other) {
        return this === other;
      };

      _proto.toString = function toString() {
        return this._name;
      };

      _proto.toJSON = function toJSON() {
        return this.toString();
      };

      return Enum;
    }();

    /*
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var TemporalAmount = function () {
      function TemporalAmount() {}

      var _proto = TemporalAmount.prototype;

      _proto.get = function get(unit) {
        abstractMethodFail('get');
      };

      _proto.units = function units() {
        abstractMethodFail('units');
      };

      _proto.addTo = function addTo(temporal) {
        abstractMethodFail('addTo');
      };

      _proto.subtractFrom = function subtractFrom(temporal) {
        abstractMethodFail('subtractFrom');
      };

      return TemporalAmount;
    }();

    if (typeof Symbol !== 'undefined' && Symbol.toPrimitive) {
      TemporalAmount.prototype[Symbol.toPrimitive] = function (hint) {
        if (hint !== 'number') {
          return this.toString();
        }

        throw new TypeError('A conversion from TemporalAmount to a number is not allowed. ' + 'To compare use the methods .equals(), .compareTo(), .isBefore() ' + 'or one that is more suitable to your use case.');
      };
    }

    /*
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var TemporalUnit = function () {
      function TemporalUnit() {}

      var _proto = TemporalUnit.prototype;

      _proto.duration = function duration() {
        abstractMethodFail('duration');
      };

      _proto.isDurationEstimated = function isDurationEstimated() {
        abstractMethodFail('isDurationEstimated');
      };

      _proto.isDateBased = function isDateBased() {
        abstractMethodFail('isDateBased');
      };

      _proto.isTimeBased = function isTimeBased() {
        abstractMethodFail('isTimeBased');
      };

      _proto.isSupportedBy = function isSupportedBy(temporal) {
        abstractMethodFail('isSupportedBy');
      };

      _proto.addTo = function addTo(dateTime, periodToAdd) {
        abstractMethodFail('addTo');
      };

      _proto.between = function between(temporal1, temporal2) {
        abstractMethodFail('between');
      };

      return TemporalUnit;
    }();

    var Duration = function (_TemporalAmount) {
      _inheritsLoose(Duration, _TemporalAmount);

      function Duration(seconds, nanos) {
        var _this;

        _this = _TemporalAmount.call(this) || this;
        _this._seconds = MathUtil.safeToInt(seconds);
        _this._nanos = MathUtil.safeToInt(nanos);
        return _this;
      }

      Duration.ofDays = function ofDays(days) {
        return Duration._create(MathUtil.safeMultiply(days, LocalTime.SECONDS_PER_DAY), 0);
      };

      Duration.ofHours = function ofHours(hours) {
        return Duration._create(MathUtil.safeMultiply(hours, LocalTime.SECONDS_PER_HOUR), 0);
      };

      Duration.ofMinutes = function ofMinutes(minutes) {
        return Duration._create(MathUtil.safeMultiply(minutes, LocalTime.SECONDS_PER_MINUTE), 0);
      };

      Duration.ofSeconds = function ofSeconds(seconds, nanoAdjustment) {
        if (nanoAdjustment === void 0) {
          nanoAdjustment = 0;
        }

        var secs = MathUtil.safeAdd(seconds, MathUtil.floorDiv(nanoAdjustment, LocalTime.NANOS_PER_SECOND));
        var nos = MathUtil.floorMod(nanoAdjustment, LocalTime.NANOS_PER_SECOND);
        return Duration._create(secs, nos);
      };

      Duration.ofMillis = function ofMillis(millis) {
        var secs = MathUtil.intDiv(millis, 1000);
        var mos = MathUtil.intMod(millis, 1000);

        if (mos < 0) {
          mos += 1000;
          secs--;
        }

        return Duration._create(secs, mos * 1000000);
      };

      Duration.ofNanos = function ofNanos(nanos) {
        var secs = MathUtil.intDiv(nanos, LocalTime.NANOS_PER_SECOND);
        var nos = MathUtil.intMod(nanos, LocalTime.NANOS_PER_SECOND);

        if (nos < 0) {
          nos += LocalTime.NANOS_PER_SECOND;
          secs--;
        }

        return this._create(secs, nos);
      };

      Duration.of = function of(amount, unit) {
        return Duration.ZERO.plus(amount, unit);
      };

      Duration.from = function from(amount) {
        requireNonNull(amount, 'amount');
        requireInstance(amount, TemporalAmount);
        var duration = Duration.ZERO;
        amount.units().forEach(function (unit) {
          duration = duration.plus(amount.get(unit), unit);
        });
        return duration;
      };

      Duration.between = function between(startInclusive, endExclusive) {
        requireNonNull(startInclusive, 'startInclusive');
        requireNonNull(endExclusive, 'endExclusive');
        var secs = startInclusive.until(endExclusive, ChronoUnit.SECONDS);
        var nanos = 0;

        if (startInclusive.isSupported(ChronoField.NANO_OF_SECOND) && endExclusive.isSupported(ChronoField.NANO_OF_SECOND)) {
          try {
            var startNos = startInclusive.getLong(ChronoField.NANO_OF_SECOND);
            nanos = endExclusive.getLong(ChronoField.NANO_OF_SECOND) - startNos;

            if (secs > 0 && nanos < 0) {
              nanos += LocalTime.NANOS_PER_SECOND;
            } else if (secs < 0 && nanos > 0) {
              nanos -= LocalTime.NANOS_PER_SECOND;
            } else if (secs === 0 && nanos !== 0) {
              var adjustedEnd = endExclusive.with(ChronoField.NANO_OF_SECOND, startNos);
              secs = startInclusive.until(adjustedEnd, ChronoUnit.SECONDS);
            }
          } catch (e) {}
        }

        return this.ofSeconds(secs, nanos);
      };

      Duration.parse = function parse(text) {
        requireNonNull(text, 'text');
        var PATTERN = new RegExp('([-+]?)P(?:([-+]?[0-9]+)D)?(T(?:([-+]?[0-9]+)H)?(?:([-+]?[0-9]+)M)?(?:([-+]?[0-9]+)(?:[.,]([0-9]{0,9}))?S)?)?', 'i');
        var matches = PATTERN.exec(text);

        if (matches !== null) {
          if ('T' === matches[3] === false) {
            var negate = '-' === matches[1];
            var dayMatch = matches[2];
            var hourMatch = matches[4];
            var minuteMatch = matches[5];
            var secondMatch = matches[6];
            var fractionMatch = matches[7];

            if (dayMatch != null || hourMatch != null || minuteMatch != null || secondMatch != null) {
              var daysAsSecs = Duration._parseNumber(text, dayMatch, LocalTime.SECONDS_PER_DAY, 'days');

              var hoursAsSecs = Duration._parseNumber(text, hourMatch, LocalTime.SECONDS_PER_HOUR, 'hours');

              var minsAsSecs = Duration._parseNumber(text, minuteMatch, LocalTime.SECONDS_PER_MINUTE, 'minutes');

              var seconds = Duration._parseNumber(text, secondMatch, 1, 'seconds');

              var negativeSecs = secondMatch != null && secondMatch.charAt(0) === '-';

              var nanos = Duration._parseFraction(text, fractionMatch, negativeSecs ? -1 : 1);

              try {
                return Duration._create(negate, daysAsSecs, hoursAsSecs, minsAsSecs, seconds, nanos);
              } catch (ex) {
                throw new DateTimeParseException('Text cannot be parsed to a Duration: overflow', text, 0, ex);
              }
            }
          }
        }

        throw new DateTimeParseException('Text cannot be parsed to a Duration', text, 0);
      };

      Duration._parseNumber = function _parseNumber(text, parsed, multiplier, errorText) {
        if (parsed == null) {
          return 0;
        }

        try {
          if (parsed[0] === '+') {
            parsed = parsed.substring(1);
          }

          return MathUtil.safeMultiply(parseFloat(parsed), multiplier);
        } catch (ex) {
          throw new DateTimeParseException("Text cannot be parsed to a Duration: " + errorText, text, 0, ex);
        }
      };

      Duration._parseFraction = function _parseFraction(text, parsed, negate) {
        if (parsed == null || parsed.length === 0) {
          return 0;
        }

        parsed = (parsed + "000000000").substring(0, 9);
        return parseFloat(parsed) * negate;
      };

      Duration._create = function _create() {
        if (arguments.length <= 2) {
          return Duration._createSecondsNanos(arguments[0], arguments[1]);
        } else {
          return Duration._createNegateDaysHoursMinutesSecondsNanos(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);
        }
      };

      Duration._createNegateDaysHoursMinutesSecondsNanos = function _createNegateDaysHoursMinutesSecondsNanos(negate, daysAsSecs, hoursAsSecs, minsAsSecs, secs, nanos) {
        var seconds = MathUtil.safeAdd(daysAsSecs, MathUtil.safeAdd(hoursAsSecs, MathUtil.safeAdd(minsAsSecs, secs)));

        if (negate) {
          return Duration.ofSeconds(seconds, nanos).negated();
        }

        return Duration.ofSeconds(seconds, nanos);
      };

      Duration._createSecondsNanos = function _createSecondsNanos(seconds, nanoAdjustment) {
        if (seconds === void 0) {
          seconds = 0;
        }

        if (nanoAdjustment === void 0) {
          nanoAdjustment = 0;
        }

        if (seconds === 0 && nanoAdjustment === 0) {
          return Duration.ZERO;
        }

        return new Duration(seconds, nanoAdjustment);
      };

      var _proto = Duration.prototype;

      _proto.get = function get(unit) {
        if (unit === ChronoUnit.SECONDS) {
          return this._seconds;
        } else if (unit === ChronoUnit.NANOS) {
          return this._nanos;
        } else {
          throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
        }
      };

      _proto.units = function units() {
        return [ChronoUnit.SECONDS, ChronoUnit.NANOS];
      };

      _proto.isZero = function isZero() {
        return this._seconds === 0 && this._nanos === 0;
      };

      _proto.isNegative = function isNegative() {
        return this._seconds < 0;
      };

      _proto.seconds = function seconds() {
        return this._seconds;
      };

      _proto.nano = function nano() {
        return this._nanos;
      };

      _proto.withSeconds = function withSeconds(seconds) {
        return Duration._create(seconds, this._nanos);
      };

      _proto.withNanos = function withNanos(nanoOfSecond) {
        ChronoField.NANO_OF_SECOND.checkValidIntValue(nanoOfSecond);
        return Duration._create(this._seconds, nanoOfSecond);
      };

      _proto.plusDuration = function plusDuration(duration) {
        requireNonNull(duration, 'duration');
        return this.plus(duration.seconds(), duration.nano());
      };

      _proto.plus = function plus(durationOrNumber, unitOrNumber) {
        if (arguments.length === 1) {
          return this.plusDuration(durationOrNumber);
        } else if (arguments.length === 2 && unitOrNumber instanceof TemporalUnit) {
          return this.plusAmountUnit(durationOrNumber, unitOrNumber);
        } else {
          return this.plusSecondsNanos(durationOrNumber, unitOrNumber);
        }
      };

      _proto.plusAmountUnit = function plusAmountUnit(amountToAdd, unit) {
        requireNonNull(amountToAdd, 'amountToAdd');
        requireNonNull(unit, 'unit');

        if (unit === ChronoUnit.DAYS) {
          return this.plusSecondsNanos(MathUtil.safeMultiply(amountToAdd, LocalTime.SECONDS_PER_DAY), 0);
        }

        if (unit.isDurationEstimated()) {
          throw new UnsupportedTemporalTypeException('Unit must not have an estimated duration');
        }

        if (amountToAdd === 0) {
          return this;
        }

        if (unit instanceof ChronoUnit) {
          switch (unit) {
            case ChronoUnit.NANOS:
              return this.plusNanos(amountToAdd);

            case ChronoUnit.MICROS:
              return this.plusSecondsNanos(MathUtil.intDiv(amountToAdd, 1000000 * 1000) * 1000, MathUtil.intMod(amountToAdd, 1000000 * 1000) * 1000);

            case ChronoUnit.MILLIS:
              return this.plusMillis(amountToAdd);

            case ChronoUnit.SECONDS:
              return this.plusSeconds(amountToAdd);
          }

          return this.plusSecondsNanos(MathUtil.safeMultiply(unit.duration().seconds(), amountToAdd), 0);
        }

        var duration = unit.duration().multipliedBy(amountToAdd);
        return this.plusSecondsNanos(duration.seconds(), duration.nano());
      };

      _proto.plusDays = function plusDays(daysToAdd) {
        return this.plusSecondsNanos(MathUtil.safeMultiply(daysToAdd, LocalTime.SECONDS_PER_DAY), 0);
      };

      _proto.plusHours = function plusHours(hoursToAdd) {
        return this.plusSecondsNanos(MathUtil.safeMultiply(hoursToAdd, LocalTime.SECONDS_PER_HOUR), 0);
      };

      _proto.plusMinutes = function plusMinutes(minutesToAdd) {
        return this.plusSecondsNanos(MathUtil.safeMultiply(minutesToAdd, LocalTime.SECONDS_PER_MINUTE), 0);
      };

      _proto.plusSeconds = function plusSeconds(secondsToAdd) {
        return this.plusSecondsNanos(secondsToAdd, 0);
      };

      _proto.plusMillis = function plusMillis(millisToAdd) {
        return this.plusSecondsNanos(MathUtil.intDiv(millisToAdd, 1000), MathUtil.intMod(millisToAdd, 1000) * 1000000);
      };

      _proto.plusNanos = function plusNanos(nanosToAdd) {
        return this.plusSecondsNanos(0, nanosToAdd);
      };

      _proto.plusSecondsNanos = function plusSecondsNanos(secondsToAdd, nanosToAdd) {
        requireNonNull(secondsToAdd, 'secondsToAdd');
        requireNonNull(nanosToAdd, 'nanosToAdd');

        if (secondsToAdd === 0 && nanosToAdd === 0) {
          return this;
        }

        var epochSec = MathUtil.safeAdd(this._seconds, secondsToAdd);
        epochSec = MathUtil.safeAdd(epochSec, MathUtil.intDiv(nanosToAdd, LocalTime.NANOS_PER_SECOND));
        nanosToAdd = MathUtil.intMod(nanosToAdd, LocalTime.NANOS_PER_SECOND);
        var nanoAdjustment = MathUtil.safeAdd(this._nanos, nanosToAdd);
        return Duration.ofSeconds(epochSec, nanoAdjustment);
      };

      _proto.minus = function minus(durationOrNumber, unit) {
        if (arguments.length === 1) {
          return this.minusDuration(durationOrNumber);
        } else {
          return this.minusAmountUnit(durationOrNumber, unit);
        }
      };

      _proto.minusDuration = function minusDuration(duration) {
        requireNonNull(duration, 'duration');
        var secsToSubtract = duration.seconds();
        var nanosToSubtract = duration.nano();

        if (secsToSubtract === MIN_SAFE_INTEGER) {
          return this.plus(MAX_SAFE_INTEGER, -nanosToSubtract);
        }

        return this.plus(-secsToSubtract, -nanosToSubtract);
      };

      _proto.minusAmountUnit = function minusAmountUnit(amountToSubtract, unit) {
        requireNonNull(amountToSubtract, 'amountToSubtract');
        requireNonNull(unit, 'unit');
        return amountToSubtract === MIN_SAFE_INTEGER ? this.plusAmountUnit(MAX_SAFE_INTEGER, unit) : this.plusAmountUnit(-amountToSubtract, unit);
      };

      _proto.minusDays = function minusDays(daysToSubtract) {
        return daysToSubtract === MIN_SAFE_INTEGER ? this.plusDays(MAX_SAFE_INTEGER) : this.plusDays(-daysToSubtract);
      };

      _proto.minusHours = function minusHours(hoursToSubtract) {
        return hoursToSubtract === MIN_SAFE_INTEGER ? this.plusHours(MAX_SAFE_INTEGER) : this.plusHours(-hoursToSubtract);
      };

      _proto.minusMinutes = function minusMinutes(minutesToSubtract) {
        return minutesToSubtract === MIN_SAFE_INTEGER ? this.plusMinutes(MAX_SAFE_INTEGER) : this.plusMinutes(-minutesToSubtract);
      };

      _proto.minusSeconds = function minusSeconds(secondsToSubtract) {
        return secondsToSubtract === MIN_SAFE_INTEGER ? this.plusSeconds(MAX_SAFE_INTEGER) : this.plusSeconds(-secondsToSubtract);
      };

      _proto.minusMillis = function minusMillis(millisToSubtract) {
        return millisToSubtract === MIN_SAFE_INTEGER ? this.plusMillis(MAX_SAFE_INTEGER) : this.plusMillis(-millisToSubtract);
      };

      _proto.minusNanos = function minusNanos(nanosToSubtract) {
        return nanosToSubtract === MIN_SAFE_INTEGER ? this.plusNanos(MAX_SAFE_INTEGER) : this.plusNanos(-nanosToSubtract);
      };

      _proto.multipliedBy = function multipliedBy(multiplicand) {
        if (multiplicand === 0) {
          return Duration.ZERO;
        }

        if (multiplicand === 1) {
          return this;
        }

        var secs = MathUtil.safeMultiply(this._seconds, multiplicand);
        var nos = MathUtil.safeMultiply(this._nanos, multiplicand);
        secs = secs + MathUtil.intDiv(nos, LocalTime.NANOS_PER_SECOND);
        nos = MathUtil.intMod(nos, LocalTime.NANOS_PER_SECOND);
        return Duration.ofSeconds(secs, nos);
      };

      _proto.dividedBy = function dividedBy(divisor) {
        if (divisor === 0) {
          throw new ArithmeticException('Cannot divide by zero');
        }

        if (divisor === 1) {
          return this;
        }

        var secs = MathUtil.intDiv(this._seconds, divisor);
        var secsMod = MathUtil.roundDown((this._seconds / divisor - secs) * LocalTime.NANOS_PER_SECOND);
        var nos = MathUtil.intDiv(this._nanos, divisor);
        nos = secsMod + nos;
        return Duration.ofSeconds(secs, nos);
      };

      _proto.negated = function negated() {
        return this.multipliedBy(-1);
      };

      _proto.abs = function abs() {
        return this.isNegative() ? this.negated() : this;
      };

      _proto.addTo = function addTo(temporal) {
        requireNonNull(temporal, 'temporal');

        if (this._seconds !== 0) {
          temporal = temporal.plus(this._seconds, ChronoUnit.SECONDS);
        }

        if (this._nanos !== 0) {
          temporal = temporal.plus(this._nanos, ChronoUnit.NANOS);
        }

        return temporal;
      };

      _proto.subtractFrom = function subtractFrom(temporal) {
        requireNonNull(temporal, 'temporal');

        if (this._seconds !== 0) {
          temporal = temporal.minus(this._seconds, ChronoUnit.SECONDS);
        }

        if (this._nanos !== 0) {
          temporal = temporal.minus(this._nanos, ChronoUnit.NANOS);
        }

        return temporal;
      };

      _proto.toDays = function toDays() {
        return MathUtil.intDiv(this._seconds, LocalTime.SECONDS_PER_DAY);
      };

      _proto.toHours = function toHours() {
        return MathUtil.intDiv(this._seconds, LocalTime.SECONDS_PER_HOUR);
      };

      _proto.toMinutes = function toMinutes() {
        return MathUtil.intDiv(this._seconds, LocalTime.SECONDS_PER_MINUTE);
      };

      _proto.toMillis = function toMillis() {
        var millis = Math.round(MathUtil.safeMultiply(this._seconds, 1000));
        millis = MathUtil.safeAdd(millis, MathUtil.intDiv(this._nanos, 1000000));
        return millis;
      };

      _proto.toNanos = function toNanos() {
        var totalNanos = MathUtil.safeMultiply(this._seconds, LocalTime.NANOS_PER_SECOND);
        totalNanos = MathUtil.safeAdd(totalNanos, this._nanos);
        return totalNanos;
      };

      _proto.compareTo = function compareTo(otherDuration) {
        requireNonNull(otherDuration, 'otherDuration');
        requireInstance(otherDuration, Duration, 'otherDuration');
        var cmp = MathUtil.compareNumbers(this._seconds, otherDuration.seconds());

        if (cmp !== 0) {
          return cmp;
        }

        return this._nanos - otherDuration.nano();
      };

      _proto.equals = function equals(otherDuration) {
        if (this === otherDuration) {
          return true;
        }

        if (otherDuration instanceof Duration) {
          return this.seconds() === otherDuration.seconds() && this.nano() === otherDuration.nano();
        }

        return false;
      };

      _proto.toString = function toString() {
        if (this === Duration.ZERO) {
          return 'PT0S';
        }

        var hours = MathUtil.intDiv(this._seconds, LocalTime.SECONDS_PER_HOUR);
        var minutes = MathUtil.intDiv(MathUtil.intMod(this._seconds, LocalTime.SECONDS_PER_HOUR), LocalTime.SECONDS_PER_MINUTE);
        var secs = MathUtil.intMod(this._seconds, LocalTime.SECONDS_PER_MINUTE);
        var rval = 'PT';

        if (hours !== 0) {
          rval += hours + "H";
        }

        if (minutes !== 0) {
          rval += minutes + "M";
        }

        if (secs === 0 && this._nanos === 0 && rval.length > 2) {
          return rval;
        }

        if (secs < 0 && this._nanos > 0) {
          if (secs === -1) {
            rval += '-0';
          } else {
            rval += secs + 1;
          }
        } else {
          rval += secs;
        }

        if (this._nanos > 0) {
          rval += '.';
          var nanoString;

          if (secs < 0) {
            nanoString = "" + (2 * LocalTime.NANOS_PER_SECOND - this._nanos);
          } else {
            nanoString = "" + (LocalTime.NANOS_PER_SECOND + this._nanos);
          }

          nanoString = nanoString.slice(1, nanoString.length);
          rval += nanoString;

          while (rval.charAt(rval.length - 1) === '0') {
            rval = rval.slice(0, rval.length - 1);
          }
        }

        rval += 'S';
        return rval;
      };

      _proto.toJSON = function toJSON() {
        return this.toString();
      };

      return Duration;
    }(TemporalAmount);
    function _init$n() {
      Duration.ZERO = new Duration(0, 0);
    }

    /*
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @license BSD-3-Clause (see LICENSE.md in the root directory of this source tree)
     */
    var YearConstants = function YearConstants() {};
    function _init$m() {
      YearConstants.MIN_VALUE = -999999;
      YearConstants.MAX_VALUE = 999999;
    }

    var ChronoUnit = function (_TemporalUnit) {
      _inheritsLoose(ChronoUnit, _TemporalUnit);

      function ChronoUnit(name, estimatedDuration) {
        var _this;

        _this = _TemporalUnit.call(this) || this;
        _this._name = name;
        _this._duration = estimatedDuration;
        return _this;
      }

      var _proto = ChronoUnit.prototype;

      _proto.duration = function duration() {
        return this._duration;
      };

      _proto.isDurationEstimated = function isDurationEstimated() {
        return this.isDateBased() || this === ChronoUnit.FOREVER;
      };

      _proto.isDateBased = function isDateBased() {
        return this.compareTo(ChronoUnit.DAYS) >= 0 && this !== ChronoUnit.FOREVER;
      };

      _proto.isTimeBased = function isTimeBased() {
        return this.compareTo(ChronoUnit.DAYS) < 0;
      };

      _proto.isSupportedBy = function isSupportedBy(temporal) {
        if (this === ChronoUnit.FOREVER) {
          return false;
        }

        try {
          temporal.plus(1, this);
          return true;
        } catch (e) {
          try {
            temporal.plus(-1, this);
            return true;
          } catch (e2) {
            return false;
          }
        }
      };

      _proto.addTo = function addTo(temporal, amount) {
        return temporal.plus(amount, this);
      };

      _proto.between = function between(temporal1, temporal2) {
        return temporal1.until(temporal2, this);
      };

      _proto.toString = function toString() {
        return this._name;
      };

      _proto.compareTo = function compareTo(other) {
        return this.duration().compareTo(other.duration());
      };

      return ChronoUnit;
    }(TemporalUnit);
    function _init$l() {
      ChronoUnit.NANOS = new ChronoUnit('Nanos', Duration.ofNanos(1));
      ChronoUnit.MICROS = new ChronoUnit('Micros', Duration.ofNanos(1000));
      ChronoUnit.MILLIS = new ChronoUnit('Millis', Duration.ofNanos(1000000));
      ChronoUnit.SECONDS = new ChronoUnit('Seconds', Duration.ofSeconds(1));
      ChronoUnit.MINUTES = new ChronoUnit('Minutes', Duration.ofSeconds(60));
      ChronoUnit.HOURS = new ChronoUnit('Hours', Duration.ofSeconds(3600));
      ChronoUnit.HALF_DAYS = new ChronoUnit('HalfDays', Duration.ofSeconds(43200));
      ChronoUnit.DAYS = new ChronoUnit('Days', Duration.ofSeconds(86400));
      ChronoUnit.WEEKS = new ChronoUnit('Weeks', Duration.ofSeconds(7 * 86400));
      ChronoUnit.MONTHS = new ChronoUnit('Months', Duration.ofSeconds(31556952 / 12));
      ChronoUnit.YEARS = new ChronoUnit('Years', Duration.ofSeconds(31556952));
      ChronoUnit.DECADES = new ChronoUnit('Decades', Duration.ofSeconds(31556952 * 10));
      ChronoUnit.CENTURIES = new ChronoUnit('Centuries', Duration.ofSeconds(31556952 * 100));
      ChronoUnit.MILLENNIA = new ChronoUnit('Millennia', Duration.ofSeconds(31556952 * 1000));
      ChronoUnit.ERAS = new ChronoUnit('Eras', Duration.ofSeconds(31556952 * (YearConstants.MAX_VALUE + 1)));
      ChronoUnit.FOREVER = new ChronoUnit('Forever', Duration.ofSeconds(MathUtil.MAX_SAFE_INTEGER, 999999999));
    }

    /**
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */

    var TemporalField = function () {
      function TemporalField() {}

      var _proto = TemporalField.prototype;

      _proto.isDateBased = function isDateBased() {
        abstractMethodFail('isDateBased');
      };

      _proto.isTimeBased = function isTimeBased() {
        abstractMethodFail('isTimeBased');
      };

      _proto.baseUnit = function baseUnit() {
        abstractMethodFail('baseUnit');
      };

      _proto.rangeUnit = function rangeUnit() {
        abstractMethodFail('rangeUnit');
      };

      _proto.range = function range() {
        abstractMethodFail('range');
      };

      _proto.rangeRefinedBy = function rangeRefinedBy(temporal) {
        abstractMethodFail('rangeRefinedBy');
      };

      _proto.getFrom = function getFrom(temporal) {
        abstractMethodFail('getFrom');
      };

      _proto.adjustInto = function adjustInto(temporal, newValue) {
        abstractMethodFail('adjustInto');
      };

      _proto.isSupportedBy = function isSupportedBy(temporal) {
        abstractMethodFail('isSupportedBy');
      };

      _proto.displayName = function displayName() {
        abstractMethodFail('displayName');
      };

      _proto.equals = function equals(other) {
        abstractMethodFail('equals');
      };

      _proto.name = function name() {
        abstractMethodFail('name');
      };

      return TemporalField;
    }();

    /**
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var ValueRange = function () {
      function ValueRange(minSmallest, minLargest, maxSmallest, maxLargest) {
        assert(!(minSmallest > minLargest), "Smallest minimum value '" + minSmallest + "' must be less than largest minimum value '" + minLargest + "'", IllegalArgumentException);
        assert(!(maxSmallest > maxLargest), "Smallest maximum value '" + maxSmallest + "' must be less than largest maximum value '" + maxLargest + "'", IllegalArgumentException);
        assert(!(minLargest > maxLargest), "Minimum value '" + minLargest + "' must be less than maximum value '" + maxLargest + "'", IllegalArgumentException);
        this._minSmallest = minSmallest;
        this._minLargest = minLargest;
        this._maxLargest = maxLargest;
        this._maxSmallest = maxSmallest;
      }

      var _proto = ValueRange.prototype;

      _proto.isFixed = function isFixed() {
        return this._minSmallest === this._minLargest && this._maxSmallest === this._maxLargest;
      };

      _proto.minimum = function minimum() {
        return this._minSmallest;
      };

      _proto.largestMinimum = function largestMinimum() {
        return this._minLargest;
      };

      _proto.maximum = function maximum() {
        return this._maxLargest;
      };

      _proto.smallestMaximum = function smallestMaximum() {
        return this._maxSmallest;
      };

      _proto.isValidValue = function isValidValue(value) {
        return this.minimum() <= value && value <= this.maximum();
      };

      _proto.checkValidValue = function checkValidValue(value, field) {
        var msg;

        if (!this.isValidValue(value)) {
          if (field != null) {
            msg = "Invalid value for " + field + " (valid values " + this.toString() + "): " + value;
          } else {
            msg = "Invalid value (valid values " + this.toString() + "): " + value;
          }

          return assert(false, msg, DateTimeException);
        }

        return value;
      };

      _proto.checkValidIntValue = function checkValidIntValue(value, field) {
        if (this.isValidIntValue(value) === false) {
          throw new DateTimeException("Invalid int value for " + field + ": " + value);
        }

        return value;
      };

      _proto.isValidIntValue = function isValidIntValue(value) {
        return this.isIntValue() && this.isValidValue(value);
      };

      _proto.isIntValue = function isIntValue() {
        return this.minimum() >= MathUtil.MIN_SAFE_INTEGER && this.maximum() <= MathUtil.MAX_SAFE_INTEGER;
      };

      _proto.equals = function equals(other) {
        if (other === this) {
          return true;
        }

        if (other instanceof ValueRange) {
          return this._minSmallest === other._minSmallest && this._minLargest === other._minLargest && this._maxSmallest === other._maxSmallest && this._maxLargest === other._maxLargest;
        }

        return false;
      };

      _proto.hashCode = function hashCode() {
        return MathUtil.hashCode(this._minSmallest, this._minLargest, this._maxSmallest, this._maxLargest);
      };

      _proto.toString = function toString() {
        var str = this.minimum() + (this.minimum() !== this.largestMinimum() ? "/" + this.largestMinimum() : '');
        str += ' - ';
        str += this.smallestMaximum() + (this.smallestMaximum() !== this.maximum() ? "/" + this.maximum() : '');
        return str;
      };

      ValueRange.of = function of() {
        if (arguments.length === 2) {
          return new ValueRange(arguments[0], arguments[0], arguments[1], arguments[1]);
        } else if (arguments.length === 3) {
          return new ValueRange(arguments[0], arguments[0], arguments[1], arguments[2]);
        } else if (arguments.length === 4) {
          return new ValueRange(arguments[0], arguments[1], arguments[2], arguments[3]);
        } else {
          return assert(false, "Invalid number of arguments " + arguments.length, IllegalArgumentException);
        }
      };

      return ValueRange;
    }();

    var ChronoField = function (_TemporalField) {
      _inheritsLoose(ChronoField, _TemporalField);

      ChronoField.byName = function byName(fieldName) {
        for (var prop in ChronoField) {
          if (ChronoField[prop]) {
            if (ChronoField[prop] instanceof ChronoField && ChronoField[prop].name() === fieldName) {
              return ChronoField[prop];
            }
          }
        }
      };

      function ChronoField(name, baseUnit, rangeUnit, range) {
        var _this;

        _this = _TemporalField.call(this) || this;
        _this._name = name;
        _this._baseUnit = baseUnit;
        _this._rangeUnit = rangeUnit;
        _this._range = range;
        return _this;
      }

      var _proto = ChronoField.prototype;

      _proto.name = function name() {
        return this._name;
      };

      _proto.baseUnit = function baseUnit() {
        return this._baseUnit;
      };

      _proto.rangeUnit = function rangeUnit() {
        return this._rangeUnit;
      };

      _proto.range = function range() {
        return this._range;
      };

      _proto.displayName = function displayName() {
        return this.toString();
      };

      _proto.checkValidValue = function checkValidValue(value) {
        return this.range().checkValidValue(value, this);
      };

      _proto.checkValidIntValue = function checkValidIntValue(value) {
        return this.range().checkValidIntValue(value, this);
      };

      _proto.isDateBased = function isDateBased() {
        var dateBased = this === ChronoField.DAY_OF_WEEK || this === ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH || this === ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR || this === ChronoField.DAY_OF_MONTH || this === ChronoField.DAY_OF_YEAR || this === ChronoField.EPOCH_DAY || this === ChronoField.ALIGNED_WEEK_OF_MONTH || this === ChronoField.ALIGNED_WEEK_OF_YEAR || this === ChronoField.MONTH_OF_YEAR || this === ChronoField.YEAR_OF_ERA || this === ChronoField.YEAR || this === ChronoField.ERA;
        return dateBased;
      };

      _proto.isTimeBased = function isTimeBased() {
        var timeBased = this === ChronoField.NANO_OF_SECOND || this === ChronoField.NANO_OF_DAY || this === ChronoField.MICRO_OF_SECOND || this === ChronoField.MICRO_OF_DAY || this === ChronoField.MILLI_OF_SECOND || this === ChronoField.MILLI_OF_DAY || this === ChronoField.SECOND_OF_MINUTE || this === ChronoField.SECOND_OF_DAY || this === ChronoField.MINUTE_OF_HOUR || this === ChronoField.MINUTE_OF_DAY || this === ChronoField.HOUR_OF_AMPM || this === ChronoField.CLOCK_HOUR_OF_AMPM || this === ChronoField.HOUR_OF_DAY || this === ChronoField.CLOCK_HOUR_OF_DAY || this === ChronoField.AMPM_OF_DAY;
        return timeBased;
      };

      _proto.rangeRefinedBy = function rangeRefinedBy(temporal) {
        return temporal.range(this);
      };

      _proto.getFrom = function getFrom(temporal) {
        return temporal.getLong(this);
      };

      _proto.toString = function toString() {
        return this.name();
      };

      _proto.equals = function equals(other) {
        return this === other;
      };

      _proto.adjustInto = function adjustInto(temporal, newValue) {
        return temporal.with(this, newValue);
      };

      _proto.isSupportedBy = function isSupportedBy(temporal) {
        return temporal.isSupported(this);
      };

      return ChronoField;
    }(TemporalField);
    function _init$k() {
      ChronoField.NANO_OF_SECOND = new ChronoField('NanoOfSecond', ChronoUnit.NANOS, ChronoUnit.SECONDS, ValueRange.of(0, 999999999));
      ChronoField.NANO_OF_DAY = new ChronoField('NanoOfDay', ChronoUnit.NANOS, ChronoUnit.DAYS, ValueRange.of(0, 86400 * 1000000000 - 1));
      ChronoField.MICRO_OF_SECOND = new ChronoField('MicroOfSecond', ChronoUnit.MICROS, ChronoUnit.SECONDS, ValueRange.of(0, 999999));
      ChronoField.MICRO_OF_DAY = new ChronoField('MicroOfDay', ChronoUnit.MICROS, ChronoUnit.DAYS, ValueRange.of(0, 86400 * 1000000 - 1));
      ChronoField.MILLI_OF_SECOND = new ChronoField('MilliOfSecond', ChronoUnit.MILLIS, ChronoUnit.SECONDS, ValueRange.of(0, 999));
      ChronoField.MILLI_OF_DAY = new ChronoField('MilliOfDay', ChronoUnit.MILLIS, ChronoUnit.DAYS, ValueRange.of(0, 86400 * 1000 - 1));
      ChronoField.SECOND_OF_MINUTE = new ChronoField('SecondOfMinute', ChronoUnit.SECONDS, ChronoUnit.MINUTES, ValueRange.of(0, 59));
      ChronoField.SECOND_OF_DAY = new ChronoField('SecondOfDay', ChronoUnit.SECONDS, ChronoUnit.DAYS, ValueRange.of(0, 86400 - 1));
      ChronoField.MINUTE_OF_HOUR = new ChronoField('MinuteOfHour', ChronoUnit.MINUTES, ChronoUnit.HOURS, ValueRange.of(0, 59));
      ChronoField.MINUTE_OF_DAY = new ChronoField('MinuteOfDay', ChronoUnit.MINUTES, ChronoUnit.DAYS, ValueRange.of(0, 24 * 60 - 1));
      ChronoField.HOUR_OF_AMPM = new ChronoField('HourOfAmPm', ChronoUnit.HOURS, ChronoUnit.HALF_DAYS, ValueRange.of(0, 11));
      ChronoField.CLOCK_HOUR_OF_AMPM = new ChronoField('ClockHourOfAmPm', ChronoUnit.HOURS, ChronoUnit.HALF_DAYS, ValueRange.of(1, 12));
      ChronoField.HOUR_OF_DAY = new ChronoField('HourOfDay', ChronoUnit.HOURS, ChronoUnit.DAYS, ValueRange.of(0, 23));
      ChronoField.CLOCK_HOUR_OF_DAY = new ChronoField('ClockHourOfDay', ChronoUnit.HOURS, ChronoUnit.DAYS, ValueRange.of(1, 24));
      ChronoField.AMPM_OF_DAY = new ChronoField('AmPmOfDay', ChronoUnit.HALF_DAYS, ChronoUnit.DAYS, ValueRange.of(0, 1));
      ChronoField.DAY_OF_WEEK = new ChronoField('DayOfWeek', ChronoUnit.DAYS, ChronoUnit.WEEKS, ValueRange.of(1, 7));
      ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH = new ChronoField('AlignedDayOfWeekInMonth', ChronoUnit.DAYS, ChronoUnit.WEEKS, ValueRange.of(1, 7));
      ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR = new ChronoField('AlignedDayOfWeekInYear', ChronoUnit.DAYS, ChronoUnit.WEEKS, ValueRange.of(1, 7));
      ChronoField.DAY_OF_MONTH = new ChronoField('DayOfMonth', ChronoUnit.DAYS, ChronoUnit.MONTHS, ValueRange.of(1, 28, 31), 'day');
      ChronoField.DAY_OF_YEAR = new ChronoField('DayOfYear', ChronoUnit.DAYS, ChronoUnit.YEARS, ValueRange.of(1, 365, 366));
      ChronoField.EPOCH_DAY = new ChronoField('EpochDay', ChronoUnit.DAYS, ChronoUnit.FOREVER, ValueRange.of(Math.floor(YearConstants.MIN_VALUE * 365.25), Math.floor(YearConstants.MAX_VALUE * 365.25)));
      ChronoField.ALIGNED_WEEK_OF_MONTH = new ChronoField('AlignedWeekOfMonth', ChronoUnit.WEEKS, ChronoUnit.MONTHS, ValueRange.of(1, 4, 5));
      ChronoField.ALIGNED_WEEK_OF_YEAR = new ChronoField('AlignedWeekOfYear', ChronoUnit.WEEKS, ChronoUnit.YEARS, ValueRange.of(1, 53));
      ChronoField.MONTH_OF_YEAR = new ChronoField('MonthOfYear', ChronoUnit.MONTHS, ChronoUnit.YEARS, ValueRange.of(1, 12), 'month');
      ChronoField.PROLEPTIC_MONTH = new ChronoField('ProlepticMonth', ChronoUnit.MONTHS, ChronoUnit.FOREVER, ValueRange.of(YearConstants.MIN_VALUE * 12, YearConstants.MAX_VALUE * 12 + 11));
      ChronoField.YEAR_OF_ERA = new ChronoField('YearOfEra', ChronoUnit.YEARS, ChronoUnit.FOREVER, ValueRange.of(1, YearConstants.MAX_VALUE, YearConstants.MAX_VALUE + 1));
      ChronoField.YEAR = new ChronoField('Year', ChronoUnit.YEARS, ChronoUnit.FOREVER, ValueRange.of(YearConstants.MIN_VALUE, YearConstants.MAX_VALUE), 'year');
      ChronoField.ERA = new ChronoField('Era', ChronoUnit.ERAS, ChronoUnit.FOREVER, ValueRange.of(0, 1));
      ChronoField.INSTANT_SECONDS = new ChronoField('InstantSeconds', ChronoUnit.SECONDS, ChronoUnit.FOREVER, ValueRange.of(MIN_SAFE_INTEGER, MAX_SAFE_INTEGER));
      ChronoField.OFFSET_SECONDS = new ChronoField('OffsetSeconds', ChronoUnit.SECONDS, ChronoUnit.FOREVER, ValueRange.of(-18 * 3600, 18 * 3600));
    }

    /**
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var TemporalQueries = function () {
      function TemporalQueries() {}

      TemporalQueries.zoneId = function zoneId() {
        return TemporalQueries.ZONE_ID;
      };

      TemporalQueries.chronology = function chronology() {
        return TemporalQueries.CHRONO;
      };

      TemporalQueries.precision = function precision() {
        return TemporalQueries.PRECISION;
      };

      TemporalQueries.zone = function zone() {
        return TemporalQueries.ZONE;
      };

      TemporalQueries.offset = function offset() {
        return TemporalQueries.OFFSET;
      };

      TemporalQueries.localDate = function localDate() {
        return TemporalQueries.LOCAL_DATE;
      };

      TemporalQueries.localTime = function localTime() {
        return TemporalQueries.LOCAL_TIME;
      };

      return TemporalQueries;
    }();

    /**
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var TemporalAccessor = function () {
      function TemporalAccessor() {}

      var _proto = TemporalAccessor.prototype;

      _proto.query = function query(_query) {
        if (_query === TemporalQueries.zoneId() || _query === TemporalQueries.chronology() || _query === TemporalQueries.precision()) {
          return null;
        }

        return _query.queryFrom(this);
      };

      _proto.get = function get(field) {
        return this.range(field).checkValidIntValue(this.getLong(field), field);
      };

      _proto.getLong = function getLong(field) {
        abstractMethodFail('getLong');
      };

      _proto.range = function range(field) {
        if (field instanceof ChronoField) {
          if (this.isSupported(field)) {
            return field.range();
          }

          throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
        }

        return field.rangeRefinedBy(this);
      };

      _proto.isSupported = function isSupported(field) {
        abstractMethodFail('isSupported');
      };

      return TemporalAccessor;
    }();

    var TemporalQuery = function (_Enum) {
      _inheritsLoose(TemporalQuery, _Enum);

      function TemporalQuery() {
        return _Enum.apply(this, arguments) || this;
      }

      var _proto = TemporalQuery.prototype;

      _proto.queryFrom = function queryFrom(temporal) {
        abstractMethodFail('queryFrom');
      };

      return TemporalQuery;
    }(Enum);
    function createTemporalQuery(name, queryFromFunction) {
      var ExtendedTemporalQuery = function (_TemporalQuery) {
        _inheritsLoose(ExtendedTemporalQuery, _TemporalQuery);

        function ExtendedTemporalQuery() {
          return _TemporalQuery.apply(this, arguments) || this;
        }

        return ExtendedTemporalQuery;
      }(TemporalQuery);

      ExtendedTemporalQuery.prototype.queryFrom = queryFromFunction;
      return new ExtendedTemporalQuery(name);
    }

    var DayOfWeek = function (_TemporalAccessor) {
      _inheritsLoose(DayOfWeek, _TemporalAccessor);

      function DayOfWeek(ordinal, name) {
        var _this;

        _this = _TemporalAccessor.call(this) || this;
        _this._ordinal = ordinal;
        _this._name = name;
        return _this;
      }

      var _proto = DayOfWeek.prototype;

      _proto.ordinal = function ordinal() {
        return this._ordinal;
      };

      _proto.name = function name() {
        return this._name;
      };

      DayOfWeek.values = function values() {
        return ENUMS.slice();
      };

      DayOfWeek.valueOf = function valueOf(name) {
        var ordinal = 0;

        for (ordinal; ordinal < ENUMS.length; ordinal++) {
          if (ENUMS[ordinal].name() === name) {
            break;
          }
        }

        return DayOfWeek.of(ordinal + 1);
      };

      DayOfWeek.of = function of(dayOfWeek) {
        if (dayOfWeek < 1 || dayOfWeek > 7) {
          throw new DateTimeException("Invalid value for DayOfWeek: " + dayOfWeek);
        }

        return ENUMS[dayOfWeek - 1];
      };

      DayOfWeek.from = function from(temporal) {
        assert(temporal != null, 'temporal', NullPointerException);

        if (temporal instanceof DayOfWeek) {
          return temporal;
        }

        try {
          return DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
        } catch (ex) {
          if (ex instanceof DateTimeException) {
            throw new DateTimeException("Unable to obtain DayOfWeek from TemporalAccessor: " + temporal + ", type " + (temporal.constructor != null ? temporal.constructor.name : ''), ex);
          } else {
            throw ex;
          }
        }
      };

      _proto.value = function value() {
        return this._ordinal + 1;
      };

      _proto.displayName = function displayName(style, locale) {
        throw new IllegalArgumentException('Pattern using (localized) text not implemented yet!');
      };

      _proto.isSupported = function isSupported(field) {
        if (field instanceof ChronoField) {
          return field === ChronoField.DAY_OF_WEEK;
        }

        return field != null && field.isSupportedBy(this);
      };

      _proto.range = function range(field) {
        if (field === ChronoField.DAY_OF_WEEK) {
          return field.range();
        } else if (field instanceof ChronoField) {
          throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
        }

        return field.rangeRefinedBy(this);
      };

      _proto.get = function get(field) {
        if (field === ChronoField.DAY_OF_WEEK) {
          return this.value();
        }

        return this.range(field).checkValidIntValue(this.getLong(field), field);
      };

      _proto.getLong = function getLong(field) {
        if (field === ChronoField.DAY_OF_WEEK) {
          return this.value();
        } else if (field instanceof ChronoField) {
          throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
        }

        return field.getFrom(this);
      };

      _proto.plus = function plus(days) {
        var amount = MathUtil.floorMod(days, 7);
        return ENUMS[MathUtil.floorMod(this._ordinal + (amount + 7), 7)];
      };

      _proto.minus = function minus(days) {
        return this.plus(-1 * MathUtil.floorMod(days, 7));
      };

      _proto.query = function query(_query) {
        if (_query === TemporalQueries.precision()) {
          return ChronoUnit.DAYS;
        } else if (_query === TemporalQueries.localDate() || _query === TemporalQueries.localTime() || _query === TemporalQueries.chronology() || _query === TemporalQueries.zone() || _query === TemporalQueries.zoneId() || _query === TemporalQueries.offset()) {
          return null;
        }

        assert(_query != null, 'query', NullPointerException);
        return _query.queryFrom(this);
      };

      _proto.adjustInto = function adjustInto(temporal) {
        requireNonNull(temporal, 'temporal');
        return temporal.with(ChronoField.DAY_OF_WEEK, this.value());
      };

      _proto.equals = function equals(other) {
        return this === other;
      };

      _proto.toString = function toString() {
        return this._name;
      };

      _proto.compareTo = function compareTo(other) {
        requireNonNull(other, 'other');
        requireInstance(other, DayOfWeek, 'other');
        return this._ordinal - other._ordinal;
      };

      _proto.toJSON = function toJSON() {
        return this.toString();
      };

      return DayOfWeek;
    }(TemporalAccessor);
    var ENUMS;
    function _init$j() {
      DayOfWeek.MONDAY = new DayOfWeek(0, 'MONDAY');
      DayOfWeek.TUESDAY = new DayOfWeek(1, 'TUESDAY');
      DayOfWeek.WEDNESDAY = new DayOfWeek(2, 'WEDNESDAY');
      DayOfWeek.THURSDAY = new DayOfWeek(3, 'THURSDAY');
      DayOfWeek.FRIDAY = new DayOfWeek(4, 'FRIDAY');
      DayOfWeek.SATURDAY = new DayOfWeek(5, 'SATURDAY');
      DayOfWeek.SUNDAY = new DayOfWeek(6, 'SUNDAY');
      DayOfWeek.FROM = createTemporalQuery('DayOfWeek.FROM', function (temporal) {
        return DayOfWeek.from(temporal);
      });
      ENUMS = [DayOfWeek.MONDAY, DayOfWeek.TUESDAY, DayOfWeek.WEDNESDAY, DayOfWeek.THURSDAY, DayOfWeek.FRIDAY, DayOfWeek.SATURDAY, DayOfWeek.SUNDAY];
    }

    var Month = function (_TemporalAccessor) {
      _inheritsLoose(Month, _TemporalAccessor);

      function Month(value, name) {
        var _this;

        _this = _TemporalAccessor.call(this) || this;
        _this._value = MathUtil.safeToInt(value);
        _this._name = name;
        return _this;
      }

      var _proto = Month.prototype;

      _proto.value = function value() {
        return this._value;
      };

      _proto.ordinal = function ordinal() {
        return this._value - 1;
      };

      _proto.name = function name() {
        return this._name;
      };

      _proto.displayName = function displayName(style, locale) {
        throw new IllegalArgumentException('Pattern using (localized) text not implemented yet!');
      };

      _proto.isSupported = function isSupported(field) {
        if (null === field) {
          return false;
        }

        if (field instanceof ChronoField) {
          return field === ChronoField.MONTH_OF_YEAR;
        }

        return field != null && field.isSupportedBy(this);
      };

      _proto.get = function get(field) {
        if (field === ChronoField.MONTH_OF_YEAR) {
          return this.value();
        }

        return this.range(field).checkValidIntValue(this.getLong(field), field);
      };

      _proto.getLong = function getLong(field) {
        if (field === ChronoField.MONTH_OF_YEAR) {
          return this.value();
        } else if (field instanceof ChronoField) {
          throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
        }

        return field.getFrom(this);
      };

      _proto.plus = function plus(months) {
        var amount = MathUtil.intMod(months, 12) + 12;
        var newMonthVal = MathUtil.intMod(this.value() + amount, 12);
        newMonthVal = newMonthVal === 0 ? 12 : newMonthVal;
        return Month.of(newMonthVal);
      };

      _proto.minus = function minus(months) {
        return this.plus(-1 * MathUtil.intMod(months, 12));
      };

      _proto.length = function length(leapYear) {
        switch (this) {
          case Month.FEBRUARY:
            return leapYear ? 29 : 28;

          case Month.APRIL:
          case Month.JUNE:
          case Month.SEPTEMBER:
          case Month.NOVEMBER:
            return 30;

          default:
            return 31;
        }
      };

      _proto.minLength = function minLength() {
        switch (this) {
          case Month.FEBRUARY:
            return 28;

          case Month.APRIL:
          case Month.JUNE:
          case Month.SEPTEMBER:
          case Month.NOVEMBER:
            return 30;

          default:
            return 31;
        }
      };

      _proto.maxLength = function maxLength() {
        switch (this) {
          case Month.FEBRUARY:
            return 29;

          case Month.APRIL:
          case Month.JUNE:
          case Month.SEPTEMBER:
          case Month.NOVEMBER:
            return 30;

          default:
            return 31;
        }
      };

      _proto.firstDayOfYear = function firstDayOfYear(leapYear) {
        var leap = leapYear ? 1 : 0;

        switch (this) {
          case Month.JANUARY:
            return 1;

          case Month.FEBRUARY:
            return 32;

          case Month.MARCH:
            return 60 + leap;

          case Month.APRIL:
            return 91 + leap;

          case Month.MAY:
            return 121 + leap;

          case Month.JUNE:
            return 152 + leap;

          case Month.JULY:
            return 182 + leap;

          case Month.AUGUST:
            return 213 + leap;

          case Month.SEPTEMBER:
            return 244 + leap;

          case Month.OCTOBER:
            return 274 + leap;

          case Month.NOVEMBER:
            return 305 + leap;

          case Month.DECEMBER:
          default:
            return 335 + leap;
        }
      };

      _proto.firstMonthOfQuarter = function firstMonthOfQuarter() {
        switch (this) {
          case Month.JANUARY:
          case Month.FEBRUARY:
          case Month.MARCH:
            return Month.JANUARY;

          case Month.APRIL:
          case Month.MAY:
          case Month.JUNE:
            return Month.APRIL;

          case Month.JULY:
          case Month.AUGUST:
          case Month.SEPTEMBER:
            return Month.JULY;

          case Month.OCTOBER:
          case Month.NOVEMBER:
          case Month.DECEMBER:
          default:
            return Month.OCTOBER;
        }
      };

      _proto.query = function query(_query) {
        assert(_query != null, 'query() parameter must not be null', DateTimeException);

        if (_query === TemporalQueries.chronology()) {
          return IsoChronology.INSTANCE;
        } else if (_query === TemporalQueries.precision()) {
          return ChronoUnit.MONTHS;
        }

        return _TemporalAccessor.prototype.query.call(this, _query);
      };

      _proto.toString = function toString() {
        switch (this) {
          case Month.JANUARY:
            return 'JANUARY';

          case Month.FEBRUARY:
            return 'FEBRUARY';

          case Month.MARCH:
            return 'MARCH';

          case Month.APRIL:
            return 'APRIL';

          case Month.MAY:
            return 'MAY';

          case Month.JUNE:
            return 'JUNE';

          case Month.JULY:
            return 'JULY';

          case Month.AUGUST:
            return 'AUGUST';

          case Month.SEPTEMBER:
            return 'SEPTEMBER';

          case Month.OCTOBER:
            return 'OCTOBER';

          case Month.NOVEMBER:
            return 'NOVEMBER';

          case Month.DECEMBER:
            return 'DECEMBER';

          default:
            return "unknown Month, value: " + this.value();
        }
      };

      _proto.toJSON = function toJSON() {
        return this.toString();
      };

      _proto.adjustInto = function adjustInto(temporal) {
        return temporal.with(ChronoField.MONTH_OF_YEAR, this.value());
      };

      _proto.compareTo = function compareTo(other) {
        requireNonNull(other, 'other');
        requireInstance(other, Month, 'other');
        return this._value - other._value;
      };

      _proto.equals = function equals(other) {
        return this === other;
      };

      Month.valueOf = function valueOf(name) {
        var ordinal = 0;

        for (ordinal; ordinal < MONTHS.length; ordinal++) {
          if (MONTHS[ordinal].name() === name) {
            break;
          }
        }

        return Month.of(ordinal + 1);
      };

      Month.values = function values() {
        return MONTHS.slice();
      };

      Month.of = function of(month) {
        if (month < 1 || month > 12) {
          assert(false, "Invalid value for MonthOfYear: " + month, DateTimeException);
        }

        return MONTHS[month - 1];
      };

      Month.from = function from(temporal) {
        if (temporal instanceof Month) {
          return temporal;
        }

        try {
          return Month.of(temporal.get(ChronoField.MONTH_OF_YEAR));
        } catch (ex) {
          throw new DateTimeException("Unable to obtain Month from TemporalAccessor: " + temporal + " of type " + (temporal && temporal.constructor != null ? temporal.constructor.name : ''), ex);
        }
      };

      return Month;
    }(TemporalAccessor);
    var MONTHS;
    function _init$i() {
      Month.JANUARY = new Month(1, 'JANUARY');
      Month.FEBRUARY = new Month(2, 'FEBRUARY');
      Month.MARCH = new Month(3, 'MARCH');
      Month.APRIL = new Month(4, 'APRIL');
      Month.MAY = new Month(5, 'MAY');
      Month.JUNE = new Month(6, 'JUNE');
      Month.JULY = new Month(7, 'JULY');
      Month.AUGUST = new Month(8, 'AUGUST');
      Month.SEPTEMBER = new Month(9, 'SEPTEMBER');
      Month.OCTOBER = new Month(10, 'OCTOBER');
      Month.NOVEMBER = new Month(11, 'NOVEMBER');
      Month.DECEMBER = new Month(12, 'DECEMBER');
      MONTHS = [Month.JANUARY, Month.FEBRUARY, Month.MARCH, Month.APRIL, Month.MAY, Month.JUNE, Month.JULY, Month.AUGUST, Month.SEPTEMBER, Month.OCTOBER, Month.NOVEMBER, Month.DECEMBER];
    }

    var PATTERN = /([-+]?)P(?:([-+]?[0-9]+)Y)?(?:([-+]?[0-9]+)M)?(?:([-+]?[0-9]+)W)?(?:([-+]?[0-9]+)D)?/;
    var Period = function (_TemporalAmount) {
      _inheritsLoose(Period, _TemporalAmount);

      function Period(years, months, days) {
        var _this;

        _this = _TemporalAmount.call(this) || this;

        var _years = MathUtil.safeToInt(years);

        var _months = MathUtil.safeToInt(months);

        var _days = MathUtil.safeToInt(days);

        if (_years === 0 && _months === 0 && _days === 0) {
          if (!Period.ZERO) {
            _this._years = _years;
            _this._months = _months;
            _this._days = _days;
            Period.ZERO = _assertThisInitialized(_this);
          }

          return Period.ZERO || _assertThisInitialized(_this);
        }

        _this._years = _years;
        _this._months = _months;
        _this._days = _days;
        return _this;
      }

      Period.ofYears = function ofYears(years) {
        return Period.create(years, 0, 0);
      };

      Period.ofMonths = function ofMonths(months) {
        return Period.create(0, months, 0);
      };

      Period.ofWeeks = function ofWeeks(weeks) {
        return Period.create(0, 0, MathUtil.safeMultiply(weeks, 7));
      };

      Period.ofDays = function ofDays(days) {
        return Period.create(0, 0, days);
      };

      Period.of = function of(years, months, days) {
        return Period.create(years, months, days);
      };

      Period.from = function from(amount) {
        if (amount instanceof Period) {
          return amount;
        }

        requireNonNull(amount, 'amount');
        var years = 0;
        var months = 0;
        var days = 0;
        var units = amount.units();

        for (var i = 0; i < units.length; i++) {
          var unit = units[i];
          var unitAmount = amount.get(unit);

          if (unit === ChronoUnit.YEARS) {
            years = MathUtil.safeToInt(unitAmount);
          } else if (unit === ChronoUnit.MONTHS) {
            months = MathUtil.safeToInt(unitAmount);
          } else if (unit === ChronoUnit.DAYS) {
            days = MathUtil.safeToInt(unitAmount);
          } else {
            throw new DateTimeException("Unit must be Years, Months or Days, but was " + unit);
          }
        }

        return Period.create(years, months, days);
      };

      Period.between = function between(startDate, endDate) {
        requireNonNull(startDate, 'startDate');
        requireNonNull(endDate, 'endDate');
        requireInstance(startDate, LocalDate, 'startDate');
        requireInstance(endDate, LocalDate, 'endDate');
        return startDate.until(endDate);
      };

      Period.parse = function parse(text) {
        requireNonNull(text, 'text');

        try {
          return Period._parse(text);
        } catch (ex) {
          if (ex instanceof ArithmeticException) {
            throw new DateTimeParseException('Text cannot be parsed to a Period', text, 0, ex);
          } else {
            throw ex;
          }
        }
      };

      Period._parse = function _parse(text) {
        var matches = PATTERN.exec(text);

        if (matches != null) {
          var negate = '-' === matches[1] ? -1 : 1;
          var yearMatch = matches[2];
          var monthMatch = matches[3];
          var weekMatch = matches[4];
          var dayMatch = matches[5];

          if (yearMatch != null || monthMatch != null || weekMatch != null || dayMatch != null) {
            var years = Period._parseNumber(text, yearMatch, negate);

            var months = Period._parseNumber(text, monthMatch, negate);

            var weeks = Period._parseNumber(text, weekMatch, negate);

            var days = Period._parseNumber(text, dayMatch, negate);

            days = MathUtil.safeAdd(days, MathUtil.safeMultiply(weeks, 7));
            return Period.create(years, months, days);
          }
        }

        throw new DateTimeParseException('Text cannot be parsed to a Period', text, 0);
      };

      Period._parseNumber = function _parseNumber(text, str, negate) {
        if (str == null) {
          return 0;
        }

        var val = MathUtil.parseInt(str);
        return MathUtil.safeMultiply(val, negate);
      };

      Period.create = function create(years, months, days) {
        return new Period(years, months, days);
      };

      var _proto = Period.prototype;

      _proto.units = function units() {
        return [ChronoUnit.YEARS, ChronoUnit.MONTHS, ChronoUnit.DAYS];
      };

      _proto.chronology = function chronology() {
        return IsoChronology.INSTANCE;
      };

      _proto.get = function get(unit) {
        if (unit === ChronoUnit.YEARS) {
          return this._years;
        }

        if (unit === ChronoUnit.MONTHS) {
          return this._months;
        }

        if (unit === ChronoUnit.DAYS) {
          return this._days;
        }

        throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
      };

      _proto.isZero = function isZero() {
        return this === Period.ZERO;
      };

      _proto.isNegative = function isNegative() {
        return this._years < 0 || this._months < 0 || this._days < 0;
      };

      _proto.years = function years() {
        return this._years;
      };

      _proto.months = function months() {
        return this._months;
      };

      _proto.days = function days() {
        return this._days;
      };

      _proto.withYears = function withYears(years) {
        if (years === this._years) {
          return this;
        }

        return Period.create(years, this._months, this._days);
      };

      _proto.withMonths = function withMonths(months) {
        if (months === this._months) {
          return this;
        }

        return Period.create(this._years, months, this._days);
      };

      _proto.withDays = function withDays(days) {
        if (days === this._days) {
          return this;
        }

        return Period.create(this._years, this._months, days);
      };

      _proto.plus = function plus(amountToAdd) {
        var amount = Period.from(amountToAdd);
        return Period.create(MathUtil.safeAdd(this._years, amount._years), MathUtil.safeAdd(this._months, amount._months), MathUtil.safeAdd(this._days, amount._days));
      };

      _proto.plusYears = function plusYears(yearsToAdd) {
        if (yearsToAdd === 0) {
          return this;
        }

        return Period.create(MathUtil.safeToInt(MathUtil.safeAdd(this._years, yearsToAdd)), this._months, this._days);
      };

      _proto.plusMonths = function plusMonths(monthsToAdd) {
        if (monthsToAdd === 0) {
          return this;
        }

        return Period.create(this._years, MathUtil.safeToInt(MathUtil.safeAdd(this._months, monthsToAdd)), this._days);
      };

      _proto.plusDays = function plusDays(daysToAdd) {
        if (daysToAdd === 0) {
          return this;
        }

        return Period.create(this._years, this._months, MathUtil.safeToInt(MathUtil.safeAdd(this._days, daysToAdd)));
      };

      _proto.minus = function minus(amountToSubtract) {
        var amount = Period.from(amountToSubtract);
        return Period.create(MathUtil.safeSubtract(this._years, amount._years), MathUtil.safeSubtract(this._months, amount._months), MathUtil.safeSubtract(this._days, amount._days));
      };

      _proto.minusYears = function minusYears(yearsToSubtract) {
        return this.plusYears(-1 * yearsToSubtract);
      };

      _proto.minusMonths = function minusMonths(monthsToSubtract) {
        return this.plusMonths(-1 * monthsToSubtract);
      };

      _proto.minusDays = function minusDays(daysToSubtract) {
        return this.plusDays(-1 * daysToSubtract);
      };

      _proto.multipliedBy = function multipliedBy(scalar) {
        if (this === Period.ZERO || scalar === 1) {
          return this;
        }

        return Period.create(MathUtil.safeMultiply(this._years, scalar), MathUtil.safeMultiply(this._months, scalar), MathUtil.safeMultiply(this._days, scalar));
      };

      _proto.negated = function negated() {
        return this.multipliedBy(-1);
      };

      _proto.normalized = function normalized() {
        var totalMonths = this.toTotalMonths();
        var splitYears = MathUtil.intDiv(totalMonths, 12);
        var splitMonths = MathUtil.intMod(totalMonths, 12);

        if (splitYears === this._years && splitMonths === this._months) {
          return this;
        }

        return Period.create(MathUtil.safeToInt(splitYears), splitMonths, this._days);
      };

      _proto.toTotalMonths = function toTotalMonths() {
        return this._years * 12 + this._months;
      };

      _proto.addTo = function addTo(temporal) {
        requireNonNull(temporal, 'temporal');

        if (this._years !== 0) {
          if (this._months !== 0) {
            temporal = temporal.plus(this.toTotalMonths(), ChronoUnit.MONTHS);
          } else {
            temporal = temporal.plus(this._years, ChronoUnit.YEARS);
          }
        } else if (this._months !== 0) {
          temporal = temporal.plus(this._months, ChronoUnit.MONTHS);
        }

        if (this._days !== 0) {
          temporal = temporal.plus(this._days, ChronoUnit.DAYS);
        }

        return temporal;
      };

      _proto.subtractFrom = function subtractFrom(temporal) {
        requireNonNull(temporal, 'temporal');

        if (this._years !== 0) {
          if (this._months !== 0) {
            temporal = temporal.minus(this.toTotalMonths(), ChronoUnit.MONTHS);
          } else {
            temporal = temporal.minus(this._years, ChronoUnit.YEARS);
          }
        } else if (this._months !== 0) {
          temporal = temporal.minus(this._months, ChronoUnit.MONTHS);
        }

        if (this._days !== 0) {
          temporal = temporal.minus(this._days, ChronoUnit.DAYS);
        }

        return temporal;
      };

      _proto.equals = function equals(obj) {
        if (this === obj) {
          return true;
        }

        if (obj instanceof Period) {
          var other = obj;
          return this._years === other._years && this._months === other._months && this._days === other._days;
        }

        return false;
      };

      _proto.hashCode = function hashCode() {
        return MathUtil.hashCode(this._years, this._months, this._days);
      };

      _proto.toString = function toString() {
        if (this === Period.ZERO) {
          return 'P0D';
        } else {
          var buf = 'P';

          if (this._years !== 0) {
            buf += this._years + "Y";
          }

          if (this._months !== 0) {
            buf += this._months + "M";
          }

          if (this._days !== 0) {
            buf += this._days + "D";
          }

          return buf;
        }
      };

      _proto.toJSON = function toJSON() {
        return this.toString();
      };

      return Period;
    }(TemporalAmount);
    function _init$h() {
      Period.ofDays(0);
    }

    /*
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var ParsePosition = function () {
      function ParsePosition(index) {
        this._index = index;
        this._errorIndex = -1;
      }

      var _proto = ParsePosition.prototype;

      _proto.getIndex = function getIndex() {
        return this._index;
      };

      _proto.setIndex = function setIndex(index) {
        this._index = index;
      };

      _proto.getErrorIndex = function getErrorIndex() {
        return this._errorIndex;
      };

      _proto.setErrorIndex = function setErrorIndex(errorIndex) {
        this._errorIndex = errorIndex;
      };

      return ParsePosition;
    }();

    /*
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var EnumMap = function () {
      function EnumMap() {
        this._map = {};
      }

      var _proto = EnumMap.prototype;

      _proto.putAll = function putAll(otherMap) {
        for (var key in otherMap._map) {
          this._map[key] = otherMap._map[key];
        }

        return this;
      };

      _proto.containsKey = function containsKey(key) {
        return this._map.hasOwnProperty(key.name()) && this.get(key) !== undefined;
      };

      _proto.get = function get(key) {
        return this._map[key.name()];
      };

      _proto.put = function put(key, val) {
        return this.set(key, val);
      };

      _proto.set = function set(key, val) {
        this._map[key.name()] = val;
        return this;
      };

      _proto.retainAll = function retainAll(keyList) {
        var map = {};

        for (var i = 0; i < keyList.length; i++) {
          var key = keyList[i].name();
          map[key] = this._map[key];
        }

        this._map = map;
        return this;
      };

      _proto.remove = function remove(key) {
        var keyName = key.name();
        var val = this._map[keyName];
        this._map[keyName] = undefined;
        return val;
      };

      _proto.keySet = function keySet() {
        return this._map;
      };

      _proto.clear = function clear() {
        this._map = {};
      };

      return EnumMap;
    }();

    var ResolverStyle = function (_Enum) {
      _inheritsLoose(ResolverStyle, _Enum);

      function ResolverStyle() {
        return _Enum.apply(this, arguments) || this;
      }

      return ResolverStyle;
    }(Enum);
    ResolverStyle.STRICT = new ResolverStyle('STRICT');
    ResolverStyle.SMART = new ResolverStyle('SMART');
    ResolverStyle.LENIENT = new ResolverStyle('LENIENT');

    var Temporal = function (_TemporalAccessor) {
      _inheritsLoose(Temporal, _TemporalAccessor);

      function Temporal() {
        return _TemporalAccessor.apply(this, arguments) || this;
      }

      var _proto = Temporal.prototype;

      _proto.isSupported = function isSupported(fieldOrUnit) {
        abstractMethodFail('isSupported');
      };

      _proto.minus = function minus(amount, unit) {
        if (arguments.length < 2) {
          return this._minusAmount(amount);
        } else {
          return this._minusUnit(amount, unit);
        }
      };

      _proto._minusAmount = function _minusAmount(amount) {
        requireNonNull(amount, 'amount');
        requireInstance(amount, TemporalAmount, 'amount');
        return amount.subtractFrom(this);
      };

      _proto._minusUnit = function _minusUnit(amountToSubtract, unit) {
        requireNonNull(amountToSubtract, 'amountToSubtract');
        requireNonNull(unit, 'unit');
        requireInstance(unit, TemporalUnit, 'unit');
        return this._plusUnit(-amountToSubtract, unit);
      };

      _proto.plus = function plus(amount, unit) {
        if (arguments.length < 2) {
          return this._plusAmount(amount);
        } else {
          return this._plusUnit(amount, unit);
        }
      };

      _proto._plusAmount = function _plusAmount(amount) {
        requireNonNull(amount, 'amount');
        requireInstance(amount, TemporalAmount, 'amount');
        return amount.addTo(this);
      };

      _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
        abstractMethodFail('_plusUnit');
      };

      _proto.until = function until(endTemporal, unit) {
        abstractMethodFail('until');
      };

      _proto.with = function _with(adjusterOrField, newValue) {
        if (arguments.length < 2) {
          return this._withAdjuster(adjusterOrField);
        } else {
          return this._withField(adjusterOrField, newValue);
        }
      };

      _proto._withAdjuster = function _withAdjuster(adjuster) {
        requireNonNull(adjuster, 'adjuster');
        assert(typeof adjuster.adjustInto === 'function', 'adjuster must be a TemporalAdjuster', IllegalArgumentException);
        return adjuster.adjustInto(this);
      };

      _proto._withField = function _withField(field, newValue) {
        abstractMethodFail('_withField');
      };

      return Temporal;
    }(TemporalAccessor);

    if (typeof Symbol !== 'undefined' && Symbol.toPrimitive) {
      Temporal.prototype[Symbol.toPrimitive] = function (hint) {
        if (hint !== 'number') {
          return this.toString();
        }

        throw new TypeError('A conversion from Temporal to a number is not allowed. ' + 'To compare use the methods .equals(), .compareTo(), .isBefore() ' + 'or one that is more suitable to your use case.');
      };
    }

    var ChronoLocalDate = function (_Temporal) {
      _inheritsLoose(ChronoLocalDate, _Temporal);

      function ChronoLocalDate() {
        return _Temporal.apply(this, arguments) || this;
      }

      var _proto = ChronoLocalDate.prototype;

      _proto.isSupported = function isSupported(fieldOrUnit) {
        if (fieldOrUnit instanceof ChronoField) {
          return fieldOrUnit.isDateBased();
        } else if (fieldOrUnit instanceof ChronoUnit) {
          return fieldOrUnit.isDateBased();
        }

        return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
      };

      _proto.query = function query(_query) {
        if (_query === TemporalQueries.chronology()) {
          return this.chronology();
        } else if (_query === TemporalQueries.precision()) {
          return ChronoUnit.DAYS;
        } else if (_query === TemporalQueries.localDate()) {
          return LocalDate.ofEpochDay(this.toEpochDay());
        } else if (_query === TemporalQueries.localTime() || _query === TemporalQueries.zone() || _query === TemporalQueries.zoneId() || _query === TemporalQueries.offset()) {
          return null;
        }

        return _Temporal.prototype.query.call(this, _query);
      };

      _proto.adjustInto = function adjustInto(temporal) {
        return temporal.with(ChronoField.EPOCH_DAY, this.toEpochDay());
      };

      _proto.format = function format(formatter) {
        requireNonNull(formatter, 'formatter');
        requireInstance(formatter, DateTimeFormatter, 'formatter');
        return formatter.format(this);
      };

      return ChronoLocalDate;
    }(Temporal);

    /*
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var StringUtil = function () {
      function StringUtil() {}

      StringUtil.startsWith = function startsWith(text, pattern) {
        return text.indexOf(pattern) === 0;
      };

      StringUtil.hashCode = function hashCode(text) {
        var len = text.length;

        if (len === 0) {
          return 0;
        }

        var hash = 0;

        for (var i = 0; i < len; i++) {
          var chr = text.charCodeAt(i);
          hash = (hash << 5) - hash + chr;
          hash |= 0;
        }

        return MathUtil.smi(hash);
      };

      return StringUtil;
    }();

    /*
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var ZoneId = function () {
      function ZoneId() {}

      ZoneId.systemDefault = function systemDefault() {
        throw new DateTimeException('not supported operation');
      };

      ZoneId.getAvailableZoneIds = function getAvailableZoneIds() {
        throw new DateTimeException('not supported operation');
      };

      ZoneId.of = function of(zoneId) {
        throw new DateTimeException("not supported operation" + zoneId);
      };

      ZoneId.ofOffset = function ofOffset(prefix, offset) {
        throw new DateTimeException("not supported operation" + prefix + offset);
      };

      ZoneId.from = function from(temporal) {
        throw new DateTimeException("not supported operation" + temporal);
      };

      var _proto = ZoneId.prototype;

      _proto.id = function id() {
        abstractMethodFail('ZoneId.id');
      };

      _proto.rules = function rules() {
        abstractMethodFail('ZoneId.rules');
      };

      _proto.normalized = function normalized() {
        var rules = this.rules();

        if (rules.isFixedOffset()) {
          return rules.offset(Instant.EPOCH);
        }

        return this;
      };

      _proto.equals = function equals(other) {
        if (this === other) {
          return true;
        }

        if (other instanceof ZoneId) {
          return this.id() === other.id();
        }

        return false;
      };

      _proto.hashCode = function hashCode() {
        return StringUtil.hashCode(this.id());
      };

      _proto.toString = function toString() {
        return this.id();
      };

      _proto.toJSON = function toJSON() {
        return this.toString();
      };

      return ZoneId;
    }();

    var ZoneRules = function () {
      function ZoneRules() {}

      ZoneRules.of = function of(offset) {
        requireNonNull(offset, 'offset');
        return new Fixed(offset);
      };

      var _proto = ZoneRules.prototype;

      _proto.isFixedOffset = function isFixedOffset() {
        abstractMethodFail('ZoneRules.isFixedOffset');
      };

      _proto.offset = function offset(instantOrLocalDateTime) {
        if (instantOrLocalDateTime instanceof Instant) {
          return this.offsetOfInstant(instantOrLocalDateTime);
        } else {
          return this.offsetOfLocalDateTime(instantOrLocalDateTime);
        }
      };

      _proto.offsetOfInstant = function offsetOfInstant(instant) {
        abstractMethodFail('ZoneRules.offsetInstant');
      };

      _proto.offsetOfEpochMilli = function offsetOfEpochMilli(epochMilli) {
        abstractMethodFail('ZoneRules.offsetOfEpochMilli');
      };

      _proto.offsetOfLocalDateTime = function offsetOfLocalDateTime(localDateTime) {
        abstractMethodFail('ZoneRules.offsetLocalDateTime');
      };

      _proto.validOffsets = function validOffsets(localDateTime) {
        abstractMethodFail('ZoneRules.validOffsets');
      };

      _proto.transition = function transition(localDateTime) {
        abstractMethodFail('ZoneRules.transition');
      };

      _proto.standardOffset = function standardOffset(instant) {
        abstractMethodFail('ZoneRules.standardOffset');
      };

      _proto.daylightSavings = function daylightSavings(instant) {
        abstractMethodFail('ZoneRules.daylightSavings');
      };

      _proto.isDaylightSavings = function isDaylightSavings(instant) {
        abstractMethodFail('ZoneRules.isDaylightSavings');
      };

      _proto.isValidOffset = function isValidOffset(localDateTime, offset) {
        abstractMethodFail('ZoneRules.isValidOffset');
      };

      _proto.nextTransition = function nextTransition(instant) {
        abstractMethodFail('ZoneRules.nextTransition');
      };

      _proto.previousTransition = function previousTransition(instant) {
        abstractMethodFail('ZoneRules.previousTransition');
      };

      _proto.transitions = function transitions() {
        abstractMethodFail('ZoneRules.transitions');
      };

      _proto.transitionRules = function transitionRules() {
        abstractMethodFail('ZoneRules.transitionRules');
      };

      _proto.toString = function toString() {
        abstractMethodFail('ZoneRules.toString');
      };

      _proto.toJSON = function toJSON() {
        return this.toString();
      };

      return ZoneRules;
    }();

    var Fixed = function (_ZoneRules) {
      _inheritsLoose(Fixed, _ZoneRules);

      function Fixed(offset) {
        var _this;

        _this = _ZoneRules.call(this) || this;
        _this._offset = offset;
        return _this;
      }

      var _proto2 = Fixed.prototype;

      _proto2.isFixedOffset = function isFixedOffset() {
        return true;
      };

      _proto2.offsetOfInstant = function offsetOfInstant() {
        return this._offset;
      };

      _proto2.offsetOfEpochMilli = function offsetOfEpochMilli() {
        return this._offset;
      };

      _proto2.offsetOfLocalDateTime = function offsetOfLocalDateTime() {
        return this._offset;
      };

      _proto2.validOffsets = function validOffsets() {
        return [this._offset];
      };

      _proto2.transition = function transition() {
        return null;
      };

      _proto2.standardOffset = function standardOffset() {
        return this._offset;
      };

      _proto2.daylightSavings = function daylightSavings() {
        return Duration.ZERO;
      };

      _proto2.isDaylightSavings = function isDaylightSavings() {
        return false;
      };

      _proto2.isValidOffset = function isValidOffset(localDateTime, offset) {
        return this._offset.equals(offset);
      };

      _proto2.nextTransition = function nextTransition() {
        return null;
      };

      _proto2.previousTransition = function previousTransition() {
        return null;
      };

      _proto2.transitions = function transitions() {
        return [];
      };

      _proto2.transitionRules = function transitionRules() {
        return [];
      };

      _proto2.equals = function equals(other) {
        if (this === other) {
          return true;
        }

        if (other instanceof Fixed) {
          return this._offset.equals(other._offset);
        }

        return false;
      };

      _proto2.toString = function toString() {
        return "FixedRules:" + this._offset.toString();
      };

      return Fixed;
    }(ZoneRules);

    var SECONDS_CACHE = {};
    var ID_CACHE = {};
    var ZoneOffset = function (_ZoneId) {
      _inheritsLoose(ZoneOffset, _ZoneId);

      function ZoneOffset(totalSeconds) {
        var _this;

        _this = _ZoneId.call(this) || this;

        ZoneOffset._validateTotalSeconds(totalSeconds);

        _this._totalSeconds = MathUtil.safeToInt(totalSeconds);
        _this._rules = ZoneRules.of(_assertThisInitialized(_this));
        _this._id = ZoneOffset._buildId(totalSeconds);
        return _this;
      }

      var _proto = ZoneOffset.prototype;

      _proto.totalSeconds = function totalSeconds() {
        return this._totalSeconds;
      };

      _proto.id = function id() {
        return this._id;
      };

      ZoneOffset._buildId = function _buildId(totalSeconds) {
        if (totalSeconds === 0) {
          return 'Z';
        } else {
          var absTotalSeconds = Math.abs(totalSeconds);
          var absHours = MathUtil.intDiv(absTotalSeconds, LocalTime.SECONDS_PER_HOUR);
          var absMinutes = MathUtil.intMod(MathUtil.intDiv(absTotalSeconds, LocalTime.SECONDS_PER_MINUTE), LocalTime.MINUTES_PER_HOUR);
          var buf = "" + (totalSeconds < 0 ? '-' : '+') + (absHours < 10 ? '0' : '') + absHours + (absMinutes < 10 ? ':0' : ':') + absMinutes;
          var absSeconds = MathUtil.intMod(absTotalSeconds, LocalTime.SECONDS_PER_MINUTE);

          if (absSeconds !== 0) {
            buf += (absSeconds < 10 ? ':0' : ':') + absSeconds;
          }

          return buf;
        }
      };

      ZoneOffset._validateTotalSeconds = function _validateTotalSeconds(totalSeconds) {
        if (Math.abs(totalSeconds) > ZoneOffset.MAX_SECONDS) {
          throw new DateTimeException('Zone offset not in valid range: -18:00 to +18:00');
        }
      };

      ZoneOffset._validate = function _validate(hours, minutes, seconds) {
        if (hours < -18 || hours > 18) {
          throw new DateTimeException("Zone offset hours not in valid range: value " + hours + " is not in the range -18 to 18");
        }

        if (hours > 0) {
          if (minutes < 0 || seconds < 0) {
            throw new DateTimeException('Zone offset minutes and seconds must be positive because hours is positive');
          }
        } else if (hours < 0) {
          if (minutes > 0 || seconds > 0) {
            throw new DateTimeException('Zone offset minutes and seconds must be negative because hours is negative');
          }
        } else if (minutes > 0 && seconds < 0 || minutes < 0 && seconds > 0) {
          throw new DateTimeException('Zone offset minutes and seconds must have the same sign');
        }

        if (Math.abs(minutes) > 59) {
          throw new DateTimeException("Zone offset minutes not in valid range: abs(value) " + Math.abs(minutes) + " is not in the range 0 to 59");
        }

        if (Math.abs(seconds) > 59) {
          throw new DateTimeException("Zone offset seconds not in valid range: abs(value) " + Math.abs(seconds) + " is not in the range 0 to 59");
        }

        if (Math.abs(hours) === 18 && (Math.abs(minutes) > 0 || Math.abs(seconds) > 0)) {
          throw new DateTimeException('Zone offset not in valid range: -18:00 to +18:00');
        }
      };

      ZoneOffset.of = function of(offsetId) {
        requireNonNull(offsetId, 'offsetId');
        var offset = ID_CACHE[offsetId];

        if (offset != null) {
          return offset;
        }

        var hours, minutes, seconds;

        switch (offsetId.length) {
          case 2:
            offsetId = offsetId[0] + "0" + offsetId[1];

          case 3:
            hours = ZoneOffset._parseNumber(offsetId, 1, false);
            minutes = 0;
            seconds = 0;
            break;

          case 5:
            hours = ZoneOffset._parseNumber(offsetId, 1, false);
            minutes = ZoneOffset._parseNumber(offsetId, 3, false);
            seconds = 0;
            break;

          case 6:
            hours = ZoneOffset._parseNumber(offsetId, 1, false);
            minutes = ZoneOffset._parseNumber(offsetId, 4, true);
            seconds = 0;
            break;

          case 7:
            hours = ZoneOffset._parseNumber(offsetId, 1, false);
            minutes = ZoneOffset._parseNumber(offsetId, 3, false);
            seconds = ZoneOffset._parseNumber(offsetId, 5, false);
            break;

          case 9:
            hours = ZoneOffset._parseNumber(offsetId, 1, false);
            minutes = ZoneOffset._parseNumber(offsetId, 4, true);
            seconds = ZoneOffset._parseNumber(offsetId, 7, true);
            break;

          default:
            throw new DateTimeException("Invalid ID for ZoneOffset, invalid format: " + offsetId);
        }

        var first = offsetId[0];

        if (first !== '+' && first !== '-') {
          throw new DateTimeException("Invalid ID for ZoneOffset, plus/minus not found when expected: " + offsetId);
        }

        if (first === '-') {
          return ZoneOffset.ofHoursMinutesSeconds(-hours, -minutes, -seconds);
        } else {
          return ZoneOffset.ofHoursMinutesSeconds(hours, minutes, seconds);
        }
      };

      ZoneOffset._parseNumber = function _parseNumber(offsetId, pos, precededByColon) {
        if (precededByColon && offsetId[pos - 1] !== ':') {
          throw new DateTimeException("Invalid ID for ZoneOffset, colon not found when expected: " + offsetId);
        }

        var ch1 = offsetId[pos];
        var ch2 = offsetId[pos + 1];

        if (ch1 < '0' || ch1 > '9' || ch2 < '0' || ch2 > '9') {
          throw new DateTimeException("Invalid ID for ZoneOffset, non numeric characters found: " + offsetId);
        }

        return (ch1.charCodeAt(0) - 48) * 10 + (ch2.charCodeAt(0) - 48);
      };

      ZoneOffset.ofHours = function ofHours(hours) {
        return ZoneOffset.ofHoursMinutesSeconds(hours, 0, 0);
      };

      ZoneOffset.ofHoursMinutes = function ofHoursMinutes(hours, minutes) {
        return ZoneOffset.ofHoursMinutesSeconds(hours, minutes, 0);
      };

      ZoneOffset.ofHoursMinutesSeconds = function ofHoursMinutesSeconds(hours, minutes, seconds) {
        ZoneOffset._validate(hours, minutes, seconds);

        var totalSeconds = hours * LocalTime.SECONDS_PER_HOUR + minutes * LocalTime.SECONDS_PER_MINUTE + seconds;
        return ZoneOffset.ofTotalSeconds(totalSeconds);
      };

      ZoneOffset.ofTotalMinutes = function ofTotalMinutes(totalMinutes) {
        var totalSeconds = totalMinutes * LocalTime.SECONDS_PER_MINUTE;
        return ZoneOffset.ofTotalSeconds(totalSeconds);
      };

      ZoneOffset.ofTotalSeconds = function ofTotalSeconds(totalSeconds) {
        if (totalSeconds % (15 * LocalTime.SECONDS_PER_MINUTE) === 0) {
          var totalSecs = totalSeconds;
          var result = SECONDS_CACHE[totalSecs];

          if (result == null) {
            result = new ZoneOffset(totalSeconds);
            SECONDS_CACHE[totalSecs] = result;
            ID_CACHE[result.id()] = result;
          }

          return result;
        } else {
          return new ZoneOffset(totalSeconds);
        }
      };

      _proto.rules = function rules() {
        return this._rules;
      };

      _proto.get = function get(field) {
        return this.getLong(field);
      };

      _proto.getLong = function getLong(field) {
        if (field === ChronoField.OFFSET_SECONDS) {
          return this._totalSeconds;
        } else if (field instanceof ChronoField) {
          throw new DateTimeException("Unsupported field: " + field);
        }

        return field.getFrom(this);
      };

      _proto.query = function query(_query) {
        requireNonNull(_query, 'query');

        if (_query === TemporalQueries.offset() || _query === TemporalQueries.zone()) {
          return this;
        } else if (_query === TemporalQueries.localDate() || _query === TemporalQueries.localTime() || _query === TemporalQueries.precision() || _query === TemporalQueries.chronology() || _query === TemporalQueries.zoneId()) {
          return null;
        }

        return _query.queryFrom(this);
      };

      _proto.adjustInto = function adjustInto(temporal) {
        return temporal.with(ChronoField.OFFSET_SECONDS, this._totalSeconds);
      };

      _proto.compareTo = function compareTo(other) {
        requireNonNull(other, 'other');
        return other._totalSeconds - this._totalSeconds;
      };

      _proto.equals = function equals(obj) {
        if (this === obj) {
          return true;
        }

        if (obj instanceof ZoneOffset) {
          return this._totalSeconds === obj._totalSeconds;
        }

        return false;
      };

      _proto.hashCode = function hashCode() {
        return this._totalSeconds;
      };

      _proto.toString = function toString() {
        return this._id;
      };

      return ZoneOffset;
    }(ZoneId);
    function _init$g() {
      ZoneOffset.MAX_SECONDS = 18 * LocalTime.SECONDS_PER_HOUR;
      ZoneOffset.UTC = ZoneOffset.ofTotalSeconds(0);
      ZoneOffset.MIN = ZoneOffset.ofTotalSeconds(-ZoneOffset.MAX_SECONDS);
      ZoneOffset.MAX = ZoneOffset.ofTotalSeconds(ZoneOffset.MAX_SECONDS);
    }

    var DateTimeBuilder = function (_TemporalAccessor) {
      _inheritsLoose(DateTimeBuilder, _TemporalAccessor);

      DateTimeBuilder.create = function create(field, value) {
        var dtb = new DateTimeBuilder();

        dtb._addFieldValue(field, value);

        return dtb;
      };

      function DateTimeBuilder() {
        var _this;

        _this = _TemporalAccessor.call(this) || this;
        _this.fieldValues = new EnumMap();
        _this.chrono = null;
        _this.zone = null;
        _this.date = null;
        _this.time = null;
        _this.leapSecond = false;
        _this.excessDays = null;
        return _this;
      }

      var _proto = DateTimeBuilder.prototype;

      _proto.getFieldValue0 = function getFieldValue0(field) {
        return this.fieldValues.get(field);
      };

      _proto._addFieldValue = function _addFieldValue(field, value) {
        requireNonNull(field, 'field');
        var old = this.getFieldValue0(field);

        if (old != null && old !== value) {
          throw new DateTimeException("Conflict found: " + field + " " + old + " differs from " + field + " " + value + ": " + this);
        }

        return this._putFieldValue0(field, value);
      };

      _proto._putFieldValue0 = function _putFieldValue0(field, value) {
        this.fieldValues.put(field, value);
        return this;
      };

      _proto.resolve = function resolve(resolverStyle, resolverFields) {
        if (resolverFields != null) {
          this.fieldValues.retainAll(resolverFields);
        }

        this._mergeDate(resolverStyle);

        this._mergeTime(resolverStyle);

        this._resolveTimeInferZeroes(resolverStyle);

        if (this.excessDays != null && this.excessDays.isZero() === false && this.date != null && this.time != null) {
          this.date = this.date.plus(this.excessDays);
          this.excessDays = Period.ZERO;
        }

        this._resolveInstant();

        return this;
      };

      _proto._mergeDate = function _mergeDate(resolverStyle) {
        this._checkDate(IsoChronology.INSTANCE.resolveDate(this.fieldValues, resolverStyle));
      };

      _proto._checkDate = function _checkDate(date) {
        if (date != null) {
          this._addObject(date);

          for (var fieldName in this.fieldValues.keySet()) {
            var field = ChronoField.byName(fieldName);

            if (field) {
              if (this.fieldValues.get(field) !== undefined) {
                if (field.isDateBased()) {
                  var val1 = void 0;

                  try {
                    val1 = date.getLong(field);
                  } catch (ex) {
                    if (ex instanceof DateTimeException) {
                      continue;
                    } else {
                      throw ex;
                    }
                  }

                  var val2 = this.fieldValues.get(field);

                  if (val1 !== val2) {
                    throw new DateTimeException("Conflict found: Field " + field + " " + val1 + " differs from " + field + " " + val2 + " derived from " + date);
                  }
                }
              }
            }
          }
        }
      };

      _proto._mergeTime = function _mergeTime(resolverStyle) {
        if (this.fieldValues.containsKey(ChronoField.CLOCK_HOUR_OF_DAY)) {
          var ch = this.fieldValues.remove(ChronoField.CLOCK_HOUR_OF_DAY);

          if (resolverStyle !== ResolverStyle.LENIENT) {
            if (resolverStyle === ResolverStyle.SMART && ch === 0) ; else {
              ChronoField.CLOCK_HOUR_OF_DAY.checkValidValue(ch);
            }
          }

          this._addFieldValue(ChronoField.HOUR_OF_DAY, ch === 24 ? 0 : ch);
        }

        if (this.fieldValues.containsKey(ChronoField.CLOCK_HOUR_OF_AMPM)) {
          var _ch = this.fieldValues.remove(ChronoField.CLOCK_HOUR_OF_AMPM);

          if (resolverStyle !== ResolverStyle.LENIENT) {
            if (resolverStyle === ResolverStyle.SMART && _ch === 0) ; else {
              ChronoField.CLOCK_HOUR_OF_AMPM.checkValidValue(_ch);
            }
          }

          this._addFieldValue(ChronoField.HOUR_OF_AMPM, _ch === 12 ? 0 : _ch);
        }

        if (resolverStyle !== ResolverStyle.LENIENT) {
          if (this.fieldValues.containsKey(ChronoField.AMPM_OF_DAY)) {
            ChronoField.AMPM_OF_DAY.checkValidValue(this.fieldValues.get(ChronoField.AMPM_OF_DAY));
          }

          if (this.fieldValues.containsKey(ChronoField.HOUR_OF_AMPM)) {
            ChronoField.HOUR_OF_AMPM.checkValidValue(this.fieldValues.get(ChronoField.HOUR_OF_AMPM));
          }
        }

        if (this.fieldValues.containsKey(ChronoField.AMPM_OF_DAY) && this.fieldValues.containsKey(ChronoField.HOUR_OF_AMPM)) {
          var ap = this.fieldValues.remove(ChronoField.AMPM_OF_DAY);
          var hap = this.fieldValues.remove(ChronoField.HOUR_OF_AMPM);

          this._addFieldValue(ChronoField.HOUR_OF_DAY, ap * 12 + hap);
        }

        if (this.fieldValues.containsKey(ChronoField.NANO_OF_DAY)) {
          var nod = this.fieldValues.remove(ChronoField.NANO_OF_DAY);

          if (resolverStyle !== ResolverStyle.LENIENT) {
            ChronoField.NANO_OF_DAY.checkValidValue(nod);
          }

          this._addFieldValue(ChronoField.SECOND_OF_DAY, MathUtil.intDiv(nod, 1000000000));

          this._addFieldValue(ChronoField.NANO_OF_SECOND, MathUtil.intMod(nod, 1000000000));
        }

        if (this.fieldValues.containsKey(ChronoField.MICRO_OF_DAY)) {
          var cod = this.fieldValues.remove(ChronoField.MICRO_OF_DAY);

          if (resolverStyle !== ResolverStyle.LENIENT) {
            ChronoField.MICRO_OF_DAY.checkValidValue(cod);
          }

          this._addFieldValue(ChronoField.SECOND_OF_DAY, MathUtil.intDiv(cod, 1000000));

          this._addFieldValue(ChronoField.MICRO_OF_SECOND, MathUtil.intMod(cod, 1000000));
        }

        if (this.fieldValues.containsKey(ChronoField.MILLI_OF_DAY)) {
          var lod = this.fieldValues.remove(ChronoField.MILLI_OF_DAY);

          if (resolverStyle !== ResolverStyle.LENIENT) {
            ChronoField.MILLI_OF_DAY.checkValidValue(lod);
          }

          this._addFieldValue(ChronoField.SECOND_OF_DAY, MathUtil.intDiv(lod, 1000));

          this._addFieldValue(ChronoField.MILLI_OF_SECOND, MathUtil.intMod(lod, 1000));
        }

        if (this.fieldValues.containsKey(ChronoField.SECOND_OF_DAY)) {
          var sod = this.fieldValues.remove(ChronoField.SECOND_OF_DAY);

          if (resolverStyle !== ResolverStyle.LENIENT) {
            ChronoField.SECOND_OF_DAY.checkValidValue(sod);
          }

          this._addFieldValue(ChronoField.HOUR_OF_DAY, MathUtil.intDiv(sod, 3600));

          this._addFieldValue(ChronoField.MINUTE_OF_HOUR, MathUtil.intMod(MathUtil.intDiv(sod, 60), 60));

          this._addFieldValue(ChronoField.SECOND_OF_MINUTE, MathUtil.intMod(sod, 60));
        }

        if (this.fieldValues.containsKey(ChronoField.MINUTE_OF_DAY)) {
          var mod = this.fieldValues.remove(ChronoField.MINUTE_OF_DAY);

          if (resolverStyle !== ResolverStyle.LENIENT) {
            ChronoField.MINUTE_OF_DAY.checkValidValue(mod);
          }

          this._addFieldValue(ChronoField.HOUR_OF_DAY, MathUtil.intDiv(mod, 60));

          this._addFieldValue(ChronoField.MINUTE_OF_HOUR, MathUtil.intMod(mod, 60));
        }

        if (resolverStyle !== ResolverStyle.LENIENT) {
          if (this.fieldValues.containsKey(ChronoField.MILLI_OF_SECOND)) {
            ChronoField.MILLI_OF_SECOND.checkValidValue(this.fieldValues.get(ChronoField.MILLI_OF_SECOND));
          }

          if (this.fieldValues.containsKey(ChronoField.MICRO_OF_SECOND)) {
            ChronoField.MICRO_OF_SECOND.checkValidValue(this.fieldValues.get(ChronoField.MICRO_OF_SECOND));
          }
        }

        if (this.fieldValues.containsKey(ChronoField.MILLI_OF_SECOND) && this.fieldValues.containsKey(ChronoField.MICRO_OF_SECOND)) {
          var los = this.fieldValues.remove(ChronoField.MILLI_OF_SECOND);
          var cos = this.fieldValues.get(ChronoField.MICRO_OF_SECOND);

          this._putFieldValue0(ChronoField.MICRO_OF_SECOND, los * 1000 + MathUtil.intMod(cos, 1000));
        }

        if (this.fieldValues.containsKey(ChronoField.MICRO_OF_SECOND) && this.fieldValues.containsKey(ChronoField.NANO_OF_SECOND)) {
          var nos = this.fieldValues.get(ChronoField.NANO_OF_SECOND);

          this._putFieldValue0(ChronoField.MICRO_OF_SECOND, MathUtil.intDiv(nos, 1000));

          this.fieldValues.remove(ChronoField.MICRO_OF_SECOND);
        }

        if (this.fieldValues.containsKey(ChronoField.MILLI_OF_SECOND) && this.fieldValues.containsKey(ChronoField.NANO_OF_SECOND)) {
          var _nos = this.fieldValues.get(ChronoField.NANO_OF_SECOND);

          this._putFieldValue0(ChronoField.MILLI_OF_SECOND, MathUtil.intDiv(_nos, 1000000));

          this.fieldValues.remove(ChronoField.MILLI_OF_SECOND);
        }

        if (this.fieldValues.containsKey(ChronoField.MICRO_OF_SECOND)) {
          var _cos = this.fieldValues.remove(ChronoField.MICRO_OF_SECOND);

          this._putFieldValue0(ChronoField.NANO_OF_SECOND, _cos * 1000);
        } else if (this.fieldValues.containsKey(ChronoField.MILLI_OF_SECOND)) {
          var _los = this.fieldValues.remove(ChronoField.MILLI_OF_SECOND);

          this._putFieldValue0(ChronoField.NANO_OF_SECOND, _los * 1000000);
        }
      };

      _proto._resolveTimeInferZeroes = function _resolveTimeInferZeroes(resolverStyle) {
        var hod = this.fieldValues.get(ChronoField.HOUR_OF_DAY);
        var moh = this.fieldValues.get(ChronoField.MINUTE_OF_HOUR);
        var som = this.fieldValues.get(ChronoField.SECOND_OF_MINUTE);
        var nos = this.fieldValues.get(ChronoField.NANO_OF_SECOND);

        if (hod == null) {
          return;
        }

        if (moh == null && (som != null || nos != null)) {
          return;
        }

        if (moh != null && som == null && nos != null) {
          return;
        }

        if (resolverStyle !== ResolverStyle.LENIENT) {
          if (hod != null) {
            if (resolverStyle === ResolverStyle.SMART && hod === 24 && (moh == null || moh === 0) && (som == null || som === 0) && (nos == null || nos === 0)) {
              hod = 0;
              this.excessDays = Period.ofDays(1);
            }

            var hodVal = ChronoField.HOUR_OF_DAY.checkValidIntValue(hod);

            if (moh != null) {
              var mohVal = ChronoField.MINUTE_OF_HOUR.checkValidIntValue(moh);

              if (som != null) {
                var somVal = ChronoField.SECOND_OF_MINUTE.checkValidIntValue(som);

                if (nos != null) {
                  var nosVal = ChronoField.NANO_OF_SECOND.checkValidIntValue(nos);

                  this._addObject(LocalTime.of(hodVal, mohVal, somVal, nosVal));
                } else {
                  this._addObject(LocalTime.of(hodVal, mohVal, somVal));
                }
              } else {
                if (nos == null) {
                  this._addObject(LocalTime.of(hodVal, mohVal));
                }
              }
            } else {
              if (som == null && nos == null) {
                this._addObject(LocalTime.of(hodVal, 0));
              }
            }
          }
        } else {
          if (hod != null) {
            var _hodVal = hod;

            if (moh != null) {
              if (som != null) {
                if (nos == null) {
                  nos = 0;
                }

                var totalNanos = MathUtil.safeMultiply(_hodVal, 3600000000000);
                totalNanos = MathUtil.safeAdd(totalNanos, MathUtil.safeMultiply(moh, 60000000000));
                totalNanos = MathUtil.safeAdd(totalNanos, MathUtil.safeMultiply(som, 1000000000));
                totalNanos = MathUtil.safeAdd(totalNanos, nos);
                var excessDays = MathUtil.floorDiv(totalNanos, 86400000000000);
                var nod = MathUtil.floorMod(totalNanos, 86400000000000);

                this._addObject(LocalTime.ofNanoOfDay(nod));

                this.excessDays = Period.ofDays(excessDays);
              } else {
                var totalSecs = MathUtil.safeMultiply(_hodVal, 3600);
                totalSecs = MathUtil.safeAdd(totalSecs, MathUtil.safeMultiply(moh, 60));

                var _excessDays = MathUtil.floorDiv(totalSecs, 86400);

                var sod = MathUtil.floorMod(totalSecs, 86400);

                this._addObject(LocalTime.ofSecondOfDay(sod));

                this.excessDays = Period.ofDays(_excessDays);
              }
            } else {
              var _excessDays2 = MathUtil.safeToInt(MathUtil.floorDiv(_hodVal, 24));

              _hodVal = MathUtil.floorMod(_hodVal, 24);

              this._addObject(LocalTime.of(_hodVal, 0));

              this.excessDays = Period.ofDays(_excessDays2);
            }
          }
        }

        this.fieldValues.remove(ChronoField.HOUR_OF_DAY);
        this.fieldValues.remove(ChronoField.MINUTE_OF_HOUR);
        this.fieldValues.remove(ChronoField.SECOND_OF_MINUTE);
        this.fieldValues.remove(ChronoField.NANO_OF_SECOND);
      };

      _proto._addObject = function _addObject(dateOrTime) {
        if (dateOrTime instanceof ChronoLocalDate) {
          this.date = dateOrTime;
        } else if (dateOrTime instanceof LocalTime) {
          this.time = dateOrTime;
        }
      };

      _proto._resolveInstant = function _resolveInstant() {
        if (this.date != null && this.time != null) {
          var offsetSecs = this.fieldValues.get(ChronoField.OFFSET_SECONDS);

          if (offsetSecs != null) {
            var offset = ZoneOffset.ofTotalSeconds(offsetSecs);
            var instant = this.date.atTime(this.time).atZone(offset).getLong(ChronoField.INSTANT_SECONDS);
            this.fieldValues.put(ChronoField.INSTANT_SECONDS, instant);
          } else if (this.zone != null) {
            var _instant = this.date.atTime(this.time).atZone(this.zone).getLong(ChronoField.INSTANT_SECONDS);

            this.fieldValues.put(ChronoField.INSTANT_SECONDS, _instant);
          }
        }
      };

      _proto.build = function build(type) {
        return type.queryFrom(this);
      };

      _proto.isSupported = function isSupported(field) {
        if (field == null) {
          return false;
        }

        return this.fieldValues.containsKey(field) && this.fieldValues.get(field) !== undefined || this.date != null && this.date.isSupported(field) || this.time != null && this.time.isSupported(field);
      };

      _proto.getLong = function getLong(field) {
        requireNonNull(field, 'field');
        var value = this.getFieldValue0(field);

        if (value == null) {
          if (this.date != null && this.date.isSupported(field)) {
            return this.date.getLong(field);
          }

          if (this.time != null && this.time.isSupported(field)) {
            return this.time.getLong(field);
          }

          throw new DateTimeException("Field not found: " + field);
        }

        return value;
      };

      _proto.query = function query(_query) {
        if (_query === TemporalQueries.zoneId()) {
          return this.zone;
        } else if (_query === TemporalQueries.chronology()) {
          return this.chrono;
        } else if (_query === TemporalQueries.localDate()) {
          return this.date != null ? LocalDate.from(this.date) : null;
        } else if (_query === TemporalQueries.localTime()) {
          return this.time;
        } else if (_query === TemporalQueries.zone() || _query === TemporalQueries.offset()) {
          return _query.queryFrom(this);
        } else if (_query === TemporalQueries.precision()) {
          return null;
        }

        return _query.queryFrom(this);
      };

      return DateTimeBuilder;
    }(TemporalAccessor);

    var DateTimeParseContext = function () {
      function DateTimeParseContext() {
        if (arguments.length === 1) {
          if (arguments[0] instanceof DateTimeParseContext) {
            this._constructorSelf.apply(this, arguments);

            return;
          } else {
            this._constructorFormatter.apply(this, arguments);
          }
        } else {
          this._constructorParam.apply(this, arguments);
        }

        this._caseSensitive = true;
        this._strict = true;
        this._parsed = [new Parsed(this)];
      }

      var _proto = DateTimeParseContext.prototype;

      _proto._constructorParam = function _constructorParam(locale, symbols, chronology) {
        this._locale = locale;
        this._symbols = symbols;
        this._overrideChronology = chronology;
      };

      _proto._constructorFormatter = function _constructorFormatter(formatter) {
        this._locale = formatter.locale();
        this._symbols = formatter.decimalStyle();
        this._overrideChronology = formatter.chronology();
      };

      _proto._constructorSelf = function _constructorSelf(other) {
        this._locale = other._locale;
        this._symbols = other._symbols;
        this._overrideChronology = other._overrideChronology;
        this._overrideZone = other._overrideZone;
        this._caseSensitive = other._caseSensitive;
        this._strict = other._strict;
        this._parsed = [new Parsed(this)];
      };

      _proto.copy = function copy() {
        return new DateTimeParseContext(this);
      };

      _proto.symbols = function symbols() {
        return this._symbols;
      };

      _proto.isStrict = function isStrict() {
        return this._strict;
      };

      _proto.setStrict = function setStrict(strict) {
        this._strict = strict;
      };

      _proto.locale = function locale() {
        return this._locale;
      };

      _proto.setLocale = function setLocale(locale) {
        this._locale = locale;
      };

      _proto.startOptional = function startOptional() {
        this._parsed.push(this.currentParsed().copy());
      };

      _proto.endOptional = function endOptional(successful) {
        if (successful) {
          this._parsed.splice(this._parsed.length - 2, 1);
        } else {
          this._parsed.splice(this._parsed.length - 1, 1);
        }
      };

      _proto.isCaseSensitive = function isCaseSensitive() {
        return this._caseSensitive;
      };

      _proto.setCaseSensitive = function setCaseSensitive(caseSensitive) {
        this._caseSensitive = caseSensitive;
      };

      _proto.subSequenceEquals = function subSequenceEquals(cs1, offset1, cs2, offset2, length) {
        if (offset1 + length > cs1.length || offset2 + length > cs2.length) {
          return false;
        }

        if (!this.isCaseSensitive()) {
          cs1 = cs1.toLowerCase();
          cs2 = cs2.toLowerCase();
        }

        for (var i = 0; i < length; i++) {
          var ch1 = cs1[offset1 + i];
          var ch2 = cs2[offset2 + i];

          if (ch1 !== ch2) {
            return false;
          }
        }

        return true;
      };

      _proto.charEquals = function charEquals(ch1, ch2) {
        if (this.isCaseSensitive()) {
          return ch1 === ch2;
        }

        return this.charEqualsIgnoreCase(ch1, ch2);
      };

      _proto.charEqualsIgnoreCase = function charEqualsIgnoreCase(c1, c2) {
        return c1 === c2 || c1.toLowerCase() === c2.toLowerCase();
      };

      _proto.setParsedField = function setParsedField(field, value, errorPos, successPos) {
        var currentParsedFieldValues = this.currentParsed().fieldValues;
        var old = currentParsedFieldValues.get(field);
        currentParsedFieldValues.set(field, value);
        return old != null && old !== value ? ~errorPos : successPos;
      };

      _proto.setParsedZone = function setParsedZone(zone) {
        requireNonNull(zone, 'zone');
        this.currentParsed().zone = zone;
      };

      _proto.getParsed = function getParsed(field) {
        return this.currentParsed().fieldValues.get(field);
      };

      _proto.toParsed = function toParsed() {
        return this.currentParsed();
      };

      _proto.currentParsed = function currentParsed() {
        return this._parsed[this._parsed.length - 1];
      };

      _proto.setParsedLeapSecond = function setParsedLeapSecond() {
        this.currentParsed().leapSecond = true;
      };

      _proto.getEffectiveChronology = function getEffectiveChronology() {
        var chrono = this.currentParsed().chrono;

        if (chrono == null) {
          chrono = this._overrideChronology;

          if (chrono == null) {
            chrono = IsoChronology.INSTANCE;
          }
        }

        return chrono;
      };

      return DateTimeParseContext;
    }();

    var Parsed = function (_Temporal) {
      _inheritsLoose(Parsed, _Temporal);

      function Parsed(dateTimeParseContext) {
        var _this;

        _this = _Temporal.call(this) || this;
        _this.chrono = null;
        _this.zone = null;
        _this.fieldValues = new EnumMap();
        _this.leapSecond = false;
        _this.dateTimeParseContext = dateTimeParseContext;
        return _this;
      }

      var _proto2 = Parsed.prototype;

      _proto2.copy = function copy() {
        var cloned = new Parsed();
        cloned.chrono = this.chrono;
        cloned.zone = this.zone;
        cloned.fieldValues.putAll(this.fieldValues);
        cloned.leapSecond = this.leapSecond;
        cloned.dateTimeParseContext = this.dateTimeParseContext;
        return cloned;
      };

      _proto2.toString = function toString() {
        return this.fieldValues + ", " + this.chrono + ", " + this.zone;
      };

      _proto2.isSupported = function isSupported(field) {
        return this.fieldValues.containsKey(field);
      };

      _proto2.get = function get(field) {
        var val = this.fieldValues.get(field);
        assert(val != null);
        return val;
      };

      _proto2.query = function query(_query) {
        if (_query === TemporalQueries.chronology()) {
          return this.chrono;
        }

        if (_query === TemporalQueries.zoneId() || _query === TemporalQueries.zone()) {
          return this.zone;
        }

        return _Temporal.prototype.query.call(this, _query);
      };

      _proto2.toBuilder = function toBuilder() {
        var builder = new DateTimeBuilder();
        builder.fieldValues.putAll(this.fieldValues);
        builder.chrono = this.dateTimeParseContext.getEffectiveChronology();

        if (this.zone != null) {
          builder.zone = this.zone;
        } else {
          builder.zone = this.overrideZone;
        }

        builder.leapSecond = this.leapSecond;
        builder.excessDays = this.excessDays;
        return builder;
      };

      return Parsed;
    }(Temporal);

    /*
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var DateTimePrintContext = function () {
      function DateTimePrintContext(temporal, localeOrFormatter, symbols) {
        if (arguments.length === 2 && arguments[1] instanceof DateTimeFormatter) {
          this._temporal = DateTimePrintContext.adjust(temporal, localeOrFormatter);
          this._locale = localeOrFormatter.locale();
          this._symbols = localeOrFormatter.decimalStyle();
        } else {
          this._temporal = temporal;
          this._locale = localeOrFormatter;
          this._symbols = symbols;
        }

        this._optional = 0;
      }

      DateTimePrintContext.adjust = function adjust(temporal, formatter) {
        return temporal;
      };

      var _proto = DateTimePrintContext.prototype;

      _proto.symbols = function symbols() {
        return this._symbols;
      };

      _proto.startOptional = function startOptional() {
        this._optional++;
      };

      _proto.endOptional = function endOptional() {
        this._optional--;
      };

      _proto.getValueQuery = function getValueQuery(query) {
        var result = this._temporal.query(query);

        if (result == null && this._optional === 0) {
          throw new DateTimeException("Unable to extract value: " + this._temporal);
        }

        return result;
      };

      _proto.getValue = function getValue(field) {
        try {
          return this._temporal.getLong(field);
        } catch (ex) {
          if (ex instanceof DateTimeException && this._optional > 0) {
            return null;
          }

          throw ex;
        }
      };

      _proto.temporal = function temporal() {
        return this._temporal;
      };

      _proto.locale = function locale() {
        return this._locale;
      };

      _proto.setDateTime = function setDateTime(temporal) {
        this._temporal = temporal;
      };

      _proto.setLocale = function setLocale(locale) {
        this._locale = locale;
      };

      return DateTimePrintContext;
    }();

    var IsoFields = {};
    var QUARTER_DAYS = [0, 90, 181, 273, 0, 91, 182, 274];

    var Field = function (_TemporalField) {
      _inheritsLoose(Field, _TemporalField);

      function Field() {
        return _TemporalField.apply(this, arguments) || this;
      }

      var _proto = Field.prototype;

      _proto.isDateBased = function isDateBased() {
        return true;
      };

      _proto.isTimeBased = function isTimeBased() {
        return false;
      };

      _proto._isIso = function _isIso() {
        return true;
      };

      Field._getWeekRangeByLocalDate = function _getWeekRangeByLocalDate(date) {
        var wby = Field._getWeekBasedYear(date);

        return ValueRange.of(1, Field._getWeekRangeByYear(wby));
      };

      Field._getWeekRangeByYear = function _getWeekRangeByYear(wby) {
        var date = LocalDate.of(wby, 1, 1);

        if (date.dayOfWeek() === DayOfWeek.THURSDAY || date.dayOfWeek() === DayOfWeek.WEDNESDAY && date.isLeapYear()) {
          return 53;
        }

        return 52;
      };

      Field._getWeek = function _getWeek(date) {
        var dow0 = date.dayOfWeek().ordinal();
        var doy0 = date.dayOfYear() - 1;
        var doyThu0 = doy0 + (3 - dow0);
        var alignedWeek = MathUtil.intDiv(doyThu0, 7);
        var firstThuDoy0 = doyThu0 - alignedWeek * 7;
        var firstMonDoy0 = firstThuDoy0 - 3;

        if (firstMonDoy0 < -3) {
          firstMonDoy0 += 7;
        }

        if (doy0 < firstMonDoy0) {
          return Field._getWeekRangeByLocalDate(date.withDayOfYear(180).minusYears(1)).maximum();
        }

        var week = MathUtil.intDiv(doy0 - firstMonDoy0, 7) + 1;

        if (week === 53) {
          if ((firstMonDoy0 === -3 || firstMonDoy0 === -2 && date.isLeapYear()) === false) {
            week = 1;
          }
        }

        return week;
      };

      Field._getWeekBasedYear = function _getWeekBasedYear(date) {
        var year = date.year();
        var doy = date.dayOfYear();

        if (doy <= 3) {
          var dow = date.dayOfWeek().ordinal();

          if (doy - dow < -2) {
            year--;
          }
        } else if (doy >= 363) {
          var _dow = date.dayOfWeek().ordinal();

          doy = doy - 363 - (date.isLeapYear() ? 1 : 0);

          if (doy - _dow >= 0) {
            year++;
          }
        }

        return year;
      };

      _proto.displayName = function displayName() {
        return this.toString();
      };

      _proto.resolve = function resolve() {
        return null;
      };

      _proto.name = function name() {
        return this.toString();
      };

      return Field;
    }(TemporalField);

    var DAY_OF_QUARTER_FIELD = function (_Field) {
      _inheritsLoose(DAY_OF_QUARTER_FIELD, _Field);

      function DAY_OF_QUARTER_FIELD() {
        return _Field.apply(this, arguments) || this;
      }

      var _proto2 = DAY_OF_QUARTER_FIELD.prototype;

      _proto2.toString = function toString() {
        return 'DayOfQuarter';
      };

      _proto2.baseUnit = function baseUnit() {
        return ChronoUnit.DAYS;
      };

      _proto2.rangeUnit = function rangeUnit() {
        return QUARTER_YEARS;
      };

      _proto2.range = function range() {
        return ValueRange.of(1, 90, 92);
      };

      _proto2.isSupportedBy = function isSupportedBy(temporal) {
        return temporal.isSupported(ChronoField.DAY_OF_YEAR) && temporal.isSupported(ChronoField.MONTH_OF_YEAR) && temporal.isSupported(ChronoField.YEAR) && this._isIso(temporal);
      };

      _proto2.rangeRefinedBy = function rangeRefinedBy(temporal) {
        if (temporal.isSupported(this) === false) {
          throw new UnsupportedTemporalTypeException('Unsupported field: DayOfQuarter');
        }

        var qoy = temporal.getLong(QUARTER_OF_YEAR);

        if (qoy === 1) {
          var year = temporal.getLong(ChronoField.YEAR);
          return IsoChronology.isLeapYear(year) ? ValueRange.of(1, 91) : ValueRange.of(1, 90);
        } else if (qoy === 2) {
          return ValueRange.of(1, 91);
        } else if (qoy === 3 || qoy === 4) {
          return ValueRange.of(1, 92);
        }

        return this.range();
      };

      _proto2.getFrom = function getFrom(temporal) {
        if (temporal.isSupported(this) === false) {
          throw new UnsupportedTemporalTypeException('Unsupported field: DayOfQuarter');
        }

        var doy = temporal.get(ChronoField.DAY_OF_YEAR);
        var moy = temporal.get(ChronoField.MONTH_OF_YEAR);
        var year = temporal.getLong(ChronoField.YEAR);
        return doy - QUARTER_DAYS[MathUtil.intDiv(moy - 1, 3) + (IsoChronology.isLeapYear(year) ? 4 : 0)];
      };

      _proto2.adjustInto = function adjustInto(temporal, newValue) {
        var curValue = this.getFrom(temporal);
        this.range().checkValidValue(newValue, this);
        return temporal.with(ChronoField.DAY_OF_YEAR, temporal.getLong(ChronoField.DAY_OF_YEAR) + (newValue - curValue));
      };

      _proto2.resolve = function resolve(fieldValues, partialTemporal, resolverStyle) {
        var yearLong = fieldValues.get(ChronoField.YEAR);
        var qoyLong = fieldValues.get(QUARTER_OF_YEAR);

        if (yearLong == null || qoyLong == null) {
          return null;
        }

        var y = ChronoField.YEAR.checkValidIntValue(yearLong);
        var doq = fieldValues.get(DAY_OF_QUARTER);
        var date;

        if (resolverStyle === ResolverStyle.LENIENT) {
          var qoy = qoyLong;
          date = LocalDate.of(y, 1, 1);
          date = date.plusMonths(MathUtil.safeMultiply(MathUtil.safeSubtract(qoy, 1), 3));
          date = date.plusDays(MathUtil.safeSubtract(doq, 1));
        } else {
          var _qoy = QUARTER_OF_YEAR.range().checkValidIntValue(qoyLong, QUARTER_OF_YEAR);

          if (resolverStyle === ResolverStyle.STRICT) {
            var max = 92;

            if (_qoy === 1) {
              max = IsoChronology.isLeapYear(y) ? 91 : 90;
            } else if (_qoy === 2) {
              max = 91;
            }

            ValueRange.of(1, max).checkValidValue(doq, this);
          } else {
            this.range().checkValidValue(doq, this);
          }

          date = LocalDate.of(y, (_qoy - 1) * 3 + 1, 1).plusDays(doq - 1);
        }

        fieldValues.remove(this);
        fieldValues.remove(ChronoField.YEAR);
        fieldValues.remove(QUARTER_OF_YEAR);
        return date;
      };

      return DAY_OF_QUARTER_FIELD;
    }(Field);

    var QUARTER_OF_YEAR_FIELD = function (_Field2) {
      _inheritsLoose(QUARTER_OF_YEAR_FIELD, _Field2);

      function QUARTER_OF_YEAR_FIELD() {
        return _Field2.apply(this, arguments) || this;
      }

      var _proto3 = QUARTER_OF_YEAR_FIELD.prototype;

      _proto3.toString = function toString() {
        return 'QuarterOfYear';
      };

      _proto3.baseUnit = function baseUnit() {
        return QUARTER_YEARS;
      };

      _proto3.rangeUnit = function rangeUnit() {
        return ChronoUnit.YEARS;
      };

      _proto3.range = function range() {
        return ValueRange.of(1, 4);
      };

      _proto3.isSupportedBy = function isSupportedBy(temporal) {
        return temporal.isSupported(ChronoField.MONTH_OF_YEAR) && this._isIso(temporal);
      };

      _proto3.rangeRefinedBy = function rangeRefinedBy(temporal) {
        return this.range();
      };

      _proto3.getFrom = function getFrom(temporal) {
        if (temporal.isSupported(this) === false) {
          throw new UnsupportedTemporalTypeException('Unsupported field: QuarterOfYear');
        }

        var moy = temporal.getLong(ChronoField.MONTH_OF_YEAR);
        return MathUtil.intDiv(moy + 2, 3);
      };

      _proto3.adjustInto = function adjustInto(temporal, newValue) {
        var curValue = this.getFrom(temporal);
        this.range().checkValidValue(newValue, this);
        return temporal.with(ChronoField.MONTH_OF_YEAR, temporal.getLong(ChronoField.MONTH_OF_YEAR) + (newValue - curValue) * 3);
      };

      return QUARTER_OF_YEAR_FIELD;
    }(Field);

    var WEEK_OF_WEEK_BASED_YEAR_FIELD = function (_Field3) {
      _inheritsLoose(WEEK_OF_WEEK_BASED_YEAR_FIELD, _Field3);

      function WEEK_OF_WEEK_BASED_YEAR_FIELD() {
        return _Field3.apply(this, arguments) || this;
      }

      var _proto4 = WEEK_OF_WEEK_BASED_YEAR_FIELD.prototype;

      _proto4.toString = function toString() {
        return 'WeekOfWeekBasedYear';
      };

      _proto4.baseUnit = function baseUnit() {
        return ChronoUnit.WEEKS;
      };

      _proto4.rangeUnit = function rangeUnit() {
        return WEEK_BASED_YEARS;
      };

      _proto4.range = function range() {
        return ValueRange.of(1, 52, 53);
      };

      _proto4.isSupportedBy = function isSupportedBy(temporal) {
        return temporal.isSupported(ChronoField.EPOCH_DAY) && this._isIso(temporal);
      };

      _proto4.rangeRefinedBy = function rangeRefinedBy(temporal) {
        if (temporal.isSupported(this) === false) {
          throw new UnsupportedTemporalTypeException('Unsupported field: WeekOfWeekBasedYear');
        }

        return Field._getWeekRangeByLocalDate(LocalDate.from(temporal));
      };

      _proto4.getFrom = function getFrom(temporal) {
        if (temporal.isSupported(this) === false) {
          throw new UnsupportedTemporalTypeException('Unsupported field: WeekOfWeekBasedYear');
        }

        return Field._getWeek(LocalDate.from(temporal));
      };

      _proto4.adjustInto = function adjustInto(temporal, newValue) {
        this.range().checkValidValue(newValue, this);
        return temporal.plus(MathUtil.safeSubtract(newValue, this.getFrom(temporal)), ChronoUnit.WEEKS);
      };

      _proto4.resolve = function resolve(fieldValues, partialTemporal, resolverStyle) {
        var wbyLong = fieldValues.get(WEEK_BASED_YEAR);
        var dowLong = fieldValues.get(ChronoField.DAY_OF_WEEK);

        if (wbyLong == null || dowLong == null) {
          return null;
        }

        var wby = WEEK_BASED_YEAR.range().checkValidIntValue(wbyLong, WEEK_BASED_YEAR);
        var wowby = fieldValues.get(WEEK_OF_WEEK_BASED_YEAR);
        var date;

        if (resolverStyle === ResolverStyle.LENIENT) {
          var dow = dowLong;
          var weeks = 0;

          if (dow > 7) {
            weeks = MathUtil.intDiv(dow - 1, 7);
            dow = MathUtil.intMod(dow - 1, 7) + 1;
          } else if (dow < 1) {
            weeks = MathUtil.intDiv(dow, 7) - 1;
            dow = MathUtil.intMod(dow, 7) + 7;
          }

          date = LocalDate.of(wby, 1, 4).plusWeeks(wowby - 1).plusWeeks(weeks).with(ChronoField.DAY_OF_WEEK, dow);
        } else {
          var _dow2 = ChronoField.DAY_OF_WEEK.checkValidIntValue(dowLong);

          if (resolverStyle === ResolverStyle.STRICT) {
            var temp = LocalDate.of(wby, 1, 4);

            var range = Field._getWeekRangeByLocalDate(temp);

            range.checkValidValue(wowby, this);
          } else {
            this.range().checkValidValue(wowby, this);
          }

          date = LocalDate.of(wby, 1, 4).plusWeeks(wowby - 1).with(ChronoField.DAY_OF_WEEK, _dow2);
        }

        fieldValues.remove(this);
        fieldValues.remove(WEEK_BASED_YEAR);
        fieldValues.remove(ChronoField.DAY_OF_WEEK);
        return date;
      };

      _proto4.displayName = function displayName() {
        return 'Week';
      };

      return WEEK_OF_WEEK_BASED_YEAR_FIELD;
    }(Field);

    var WEEK_BASED_YEAR_FIELD = function (_Field4) {
      _inheritsLoose(WEEK_BASED_YEAR_FIELD, _Field4);

      function WEEK_BASED_YEAR_FIELD() {
        return _Field4.apply(this, arguments) || this;
      }

      var _proto5 = WEEK_BASED_YEAR_FIELD.prototype;

      _proto5.toString = function toString() {
        return 'WeekBasedYear';
      };

      _proto5.baseUnit = function baseUnit() {
        return WEEK_BASED_YEARS;
      };

      _proto5.rangeUnit = function rangeUnit() {
        return ChronoUnit.FOREVER;
      };

      _proto5.range = function range() {
        return ChronoField.YEAR.range();
      };

      _proto5.isSupportedBy = function isSupportedBy(temporal) {
        return temporal.isSupported(ChronoField.EPOCH_DAY) && this._isIso(temporal);
      };

      _proto5.rangeRefinedBy = function rangeRefinedBy(temporal) {
        return ChronoField.YEAR.range();
      };

      _proto5.getFrom = function getFrom(temporal) {
        if (temporal.isSupported(this) === false) {
          throw new UnsupportedTemporalTypeException('Unsupported field: WeekBasedYear');
        }

        return Field._getWeekBasedYear(LocalDate.from(temporal));
      };

      _proto5.adjustInto = function adjustInto(temporal, newValue) {
        if (this.isSupportedBy(temporal) === false) {
          throw new UnsupportedTemporalTypeException('Unsupported field: WeekBasedYear');
        }

        var newWby = this.range().checkValidIntValue(newValue, WEEK_BASED_YEAR);
        var date = LocalDate.from(temporal);
        var dow = date.get(ChronoField.DAY_OF_WEEK);

        var week = Field._getWeek(date);

        if (week === 53 && Field._getWeekRangeByYear(newWby) === 52) {
          week = 52;
        }

        var resolved = LocalDate.of(newWby, 1, 4);
        var days = dow - resolved.get(ChronoField.DAY_OF_WEEK) + (week - 1) * 7;
        resolved = resolved.plusDays(days);
        return temporal.with(resolved);
      };

      return WEEK_BASED_YEAR_FIELD;
    }(Field);

    var Unit = function (_TemporalUnit) {
      _inheritsLoose(Unit, _TemporalUnit);

      function Unit(name, estimatedDuration) {
        var _this;

        _this = _TemporalUnit.call(this) || this;
        _this._name = name;
        _this._duration = estimatedDuration;
        return _this;
      }

      var _proto6 = Unit.prototype;

      _proto6.duration = function duration() {
        return this._duration;
      };

      _proto6.isDurationEstimated = function isDurationEstimated() {
        return true;
      };

      _proto6.isDateBased = function isDateBased() {
        return true;
      };

      _proto6.isTimeBased = function isTimeBased() {
        return false;
      };

      _proto6.isSupportedBy = function isSupportedBy(temporal) {
        return temporal.isSupported(ChronoField.EPOCH_DAY);
      };

      _proto6.addTo = function addTo(temporal, periodToAdd) {
        switch (this) {
          case WEEK_BASED_YEARS:
            {
              var added = MathUtil.safeAdd(temporal.get(WEEK_BASED_YEAR), periodToAdd);
              return temporal.with(WEEK_BASED_YEAR, added);
            }

          case QUARTER_YEARS:
            return temporal.plus(MathUtil.intDiv(periodToAdd, 256), ChronoUnit.YEARS).plus(MathUtil.intMod(periodToAdd, 256) * 3, ChronoUnit.MONTHS);

          default:
            throw new IllegalStateException('Unreachable');
        }
      };

      _proto6.between = function between(temporal1, temporal2) {
        switch (this) {
          case WEEK_BASED_YEARS:
            return MathUtil.safeSubtract(temporal2.getLong(WEEK_BASED_YEAR), temporal1.getLong(WEEK_BASED_YEAR));

          case QUARTER_YEARS:
            return MathUtil.intDiv(temporal1.until(temporal2, ChronoUnit.MONTHS), 3);

          default:
            throw new IllegalStateException('Unreachable');
        }
      };

      _proto6.toString = function toString() {
        return name;
      };

      return Unit;
    }(TemporalUnit);

    var DAY_OF_QUARTER = null;
    var QUARTER_OF_YEAR = null;
    var WEEK_OF_WEEK_BASED_YEAR = null;
    var WEEK_BASED_YEAR = null;
    var WEEK_BASED_YEARS = null;
    var QUARTER_YEARS = null;
    function _init$f() {
      DAY_OF_QUARTER = new DAY_OF_QUARTER_FIELD();
      QUARTER_OF_YEAR = new QUARTER_OF_YEAR_FIELD();
      WEEK_OF_WEEK_BASED_YEAR = new WEEK_OF_WEEK_BASED_YEAR_FIELD();
      WEEK_BASED_YEAR = new WEEK_BASED_YEAR_FIELD();
      WEEK_BASED_YEARS = new Unit('WeekBasedYears', Duration.ofSeconds(31556952));
      QUARTER_YEARS = new Unit('QuarterYears', Duration.ofSeconds(31556952 / 4));
      IsoFields.DAY_OF_QUARTER = DAY_OF_QUARTER;
      IsoFields.QUARTER_OF_YEAR = QUARTER_OF_YEAR;
      IsoFields.WEEK_OF_WEEK_BASED_YEAR = WEEK_OF_WEEK_BASED_YEAR;
      IsoFields.WEEK_BASED_YEAR = WEEK_BASED_YEAR;
      IsoFields.WEEK_BASED_YEARS = WEEK_BASED_YEARS;
      IsoFields.QUARTER_YEARS = QUARTER_YEARS;

      LocalDate.prototype.isoWeekOfWeekyear = function () {
        return this.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR);
      };

      LocalDate.prototype.isoWeekyear = function () {
        return this.get(IsoFields.WEEK_BASED_YEAR);
      };
    }

    /**
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var DecimalStyle = function () {
      function DecimalStyle(zeroChar, positiveSignChar, negativeSignChar, decimalPointChar) {
        this._zeroDigit = zeroChar;
        this._zeroDigitCharCode = zeroChar.charCodeAt(0);
        this._positiveSign = positiveSignChar;
        this._negativeSign = negativeSignChar;
        this._decimalSeparator = decimalPointChar;
      }

      var _proto = DecimalStyle.prototype;

      _proto.positiveSign = function positiveSign() {
        return this._positiveSign;
      };

      _proto.withPositiveSign = function withPositiveSign(positiveSign) {
        if (positiveSign === this._positiveSign) {
          return this;
        }

        return new DecimalStyle(this._zeroDigit, positiveSign, this._negativeSign, this._decimalSeparator);
      };

      _proto.negativeSign = function negativeSign() {
        return this._negativeSign;
      };

      _proto.withNegativeSign = function withNegativeSign(negativeSign) {
        if (negativeSign === this._negativeSign) {
          return this;
        }

        return new DecimalStyle(this._zeroDigit, this._positiveSign, negativeSign, this._decimalSeparator);
      };

      _proto.zeroDigit = function zeroDigit() {
        return this._zeroDigit;
      };

      _proto.withZeroDigit = function withZeroDigit(zeroDigit) {
        if (zeroDigit === this._zeroDigit) {
          return this;
        }

        return new DecimalStyle(zeroDigit, this._positiveSign, this._negativeSign, this._decimalSeparator);
      };

      _proto.decimalSeparator = function decimalSeparator() {
        return this._decimalSeparator;
      };

      _proto.withDecimalSeparator = function withDecimalSeparator(decimalSeparator) {
        if (decimalSeparator === this._decimalSeparator) {
          return this;
        }

        return new DecimalStyle(this._zeroDigit, this._positiveSign, this._negativeSign, decimalSeparator);
      };

      _proto.convertToDigit = function convertToDigit(char) {
        var val = char.charCodeAt(0) - this._zeroDigitCharCode;

        return val >= 0 && val <= 9 ? val : -1;
      };

      _proto.convertNumberToI18N = function convertNumberToI18N(numericText) {
        if (this._zeroDigit === '0') {
          return numericText;
        }

        var diff = this._zeroDigitCharCode - '0'.charCodeAt(0);
        var convertedText = '';

        for (var i = 0; i < numericText.length; i++) {
          convertedText += String.fromCharCode(numericText.charCodeAt(i) + diff);
        }

        return convertedText;
      };

      _proto.equals = function equals(other) {
        if (this === other) {
          return true;
        }

        if (other instanceof DecimalStyle) {
          return this._zeroDigit === other._zeroDigit && this._positiveSign === other._positiveSign && this._negativeSign === other._negativeSign && this._decimalSeparator === other._decimalSeparator;
        }

        return false;
      };

      _proto.hashCode = function hashCode() {
        return this._zeroDigit + this._positiveSign + this._negativeSign + this._decimalSeparator;
      };

      _proto.toString = function toString() {
        return "DecimalStyle[" + this._zeroDigit + this._positiveSign + this._negativeSign + this._decimalSeparator + "]";
      };

      DecimalStyle.of = function of() {
        throw new Error('not yet supported');
      };

      DecimalStyle.availableLocales = function availableLocales() {
        throw new Error('not yet supported');
      };

      return DecimalStyle;
    }();
    DecimalStyle.STANDARD = new DecimalStyle('0', '+', '-', '.');

    var SignStyle = function (_Enum) {
      _inheritsLoose(SignStyle, _Enum);

      function SignStyle() {
        return _Enum.apply(this, arguments) || this;
      }

      var _proto = SignStyle.prototype;

      _proto.parse = function parse(positive, strict, fixedWidth) {
        switch (this) {
          case SignStyle.NORMAL:
            return !positive || !strict;

          case SignStyle.ALWAYS:
          case SignStyle.EXCEEDS_PAD:
            return true;

          default:
            return !strict && !fixedWidth;
        }
      };

      return SignStyle;
    }(Enum);
    SignStyle.NORMAL = new SignStyle('NORMAL');
    SignStyle.NEVER = new SignStyle('NEVER');
    SignStyle.ALWAYS = new SignStyle('ALWAYS');
    SignStyle.EXCEEDS_PAD = new SignStyle('EXCEEDS_PAD');
    SignStyle.NOT_NEGATIVE = new SignStyle('NOT_NEGATIVE');

    var TextStyle = function (_Enum) {
      _inheritsLoose(TextStyle, _Enum);

      function TextStyle() {
        return _Enum.apply(this, arguments) || this;
      }

      var _proto = TextStyle.prototype;

      _proto.isStandalone = function isStandalone() {
        switch (this) {
          case TextStyle.FULL_STANDALONE:
          case TextStyle.SHORT_STANDALONE:
          case TextStyle.NARROW_STANDALONE:
            return true;

          default:
            return false;
        }
      };

      _proto.asStandalone = function asStandalone() {
        switch (this) {
          case TextStyle.FULL:
            return TextStyle.FULL_STANDALONE;

          case TextStyle.SHORT:
            return TextStyle.SHORT_STANDALONE;

          case TextStyle.NARROW:
            return TextStyle.NARROW_STANDALONE;

          default:
            return this;
        }
      };

      _proto.asNormal = function asNormal() {
        switch (this) {
          case TextStyle.FULL_STANDALONE:
            return TextStyle.FULL;

          case TextStyle.SHORT_STANDALONE:
            return TextStyle.SHORT;

          case TextStyle.NARROW_STANDALONE:
            return TextStyle.NARROW;

          default:
            return this;
        }
      };

      return TextStyle;
    }(Enum);
    TextStyle.FULL = new TextStyle('FULL');
    TextStyle.FULL_STANDALONE = new TextStyle('FULL_STANDALONE');
    TextStyle.SHORT = new TextStyle('SHORT');
    TextStyle.SHORT_STANDALONE = new TextStyle('SHORT_STANDALONE');
    TextStyle.NARROW = new TextStyle('NARROW');
    TextStyle.NARROW_STANDALONE = new TextStyle('NARROW_STANDALONE');

    /**
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var CharLiteralPrinterParser = function () {
      function CharLiteralPrinterParser(literal) {
        if (literal.length > 1) {
          throw new IllegalArgumentException("invalid literal, too long: \"" + literal + "\"");
        }

        this._literal = literal;
      }

      var _proto = CharLiteralPrinterParser.prototype;

      _proto.print = function print(context, buf) {
        buf.append(this._literal);
        return true;
      };

      _proto.parse = function parse(context, text, position) {
        var length = text.length;

        if (position === length) {
          return ~position;
        }

        var ch = text.charAt(position);

        if (context.charEquals(this._literal, ch) === false) {
          return ~position;
        }

        return position + this._literal.length;
      };

      _proto.toString = function toString() {
        if (this._literal === '\'') {
          return "''";
        }

        return "'" + this._literal + "'";
      };

      return CharLiteralPrinterParser;
    }();

    /**
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var CompositePrinterParser = function () {
      function CompositePrinterParser(printerParsers, optional) {
        this._printerParsers = printerParsers;
        this._optional = optional;
      }

      var _proto = CompositePrinterParser.prototype;

      _proto.withOptional = function withOptional(optional) {
        if (optional === this._optional) {
          return this;
        }

        return new CompositePrinterParser(this._printerParsers, optional);
      };

      _proto.print = function print(context, buf) {
        var length = buf.length();

        if (this._optional) {
          context.startOptional();
        }

        try {
          for (var i = 0; i < this._printerParsers.length; i++) {
            var pp = this._printerParsers[i];

            if (pp.print(context, buf) === false) {
              buf.setLength(length);
              return true;
            }
          }
        } finally {
          if (this._optional) {
            context.endOptional();
          }
        }

        return true;
      };

      _proto.parse = function parse(context, text, position) {
        if (this._optional) {
          context.startOptional();
          var pos = position;

          for (var i = 0; i < this._printerParsers.length; i++) {
            var pp = this._printerParsers[i];
            pos = pp.parse(context, text, pos);

            if (pos < 0) {
              context.endOptional(false);
              return position;
            }
          }

          context.endOptional(true);
          return pos;
        } else {
          for (var _i = 0; _i < this._printerParsers.length; _i++) {
            var _pp = this._printerParsers[_i];
            position = _pp.parse(context, text, position);

            if (position < 0) {
              break;
            }
          }

          return position;
        }
      };

      _proto.toString = function toString() {
        var buf = '';

        if (this._printerParsers != null) {
          buf += this._optional ? '[' : '(';

          for (var i = 0; i < this._printerParsers.length; i++) {
            var pp = this._printerParsers[i];
            buf += pp.toString();
          }

          buf += this._optional ? ']' : ')';
        }

        return buf;
      };

      return CompositePrinterParser;
    }();

    /**
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var FractionPrinterParser = function () {
      function FractionPrinterParser(field, minWidth, maxWidth, decimalPoint) {
        requireNonNull(field, 'field');

        if (field.range().isFixed() === false) {
          throw new IllegalArgumentException("Field must have a fixed set of values: " + field);
        }

        if (minWidth < 0 || minWidth > 9) {
          throw new IllegalArgumentException("Minimum width must be from 0 to 9 inclusive but was " + minWidth);
        }

        if (maxWidth < 1 || maxWidth > 9) {
          throw new IllegalArgumentException("Maximum width must be from 1 to 9 inclusive but was " + maxWidth);
        }

        if (maxWidth < minWidth) {
          throw new IllegalArgumentException("Maximum width must exceed or equal the minimum width but " + maxWidth + " < " + minWidth);
        }

        this.field = field;
        this.minWidth = minWidth;
        this.maxWidth = maxWidth;
        this.decimalPoint = decimalPoint;
      }

      var _proto = FractionPrinterParser.prototype;

      _proto.print = function print(context, buf) {
        var value = context.getValue(this.field);

        if (value === null) {
          return false;
        }

        var symbols = context.symbols();

        if (value === 0) {
          if (this.minWidth > 0) {
            if (this.decimalPoint) {
              buf.append(symbols.decimalSeparator());
            }

            for (var i = 0; i < this.minWidth; i++) {
              buf.append(symbols.zeroDigit());
            }
          }
        } else {
          var fraction = this.convertToFraction(value, symbols.zeroDigit());
          var outputScale = Math.min(Math.max(fraction.length, this.minWidth), this.maxWidth);
          fraction = fraction.substr(0, outputScale);

          if (fraction * 1 > 0) {
            while (fraction.length > this.minWidth && fraction[fraction.length - 1] === '0') {
              fraction = fraction.substr(0, fraction.length - 1);
            }
          }

          var str = fraction;
          str = symbols.convertNumberToI18N(str);

          if (this.decimalPoint) {
            buf.append(symbols.decimalSeparator());
          }

          buf.append(str);
        }

        return true;
      };

      _proto.parse = function parse(context, text, position) {
        var effectiveMin = context.isStrict() ? this.minWidth : 0;
        var effectiveMax = context.isStrict() ? this.maxWidth : 9;
        var length = text.length;

        if (position === length) {
          return effectiveMin > 0 ? ~position : position;
        }

        if (this.decimalPoint) {
          if (text[position] !== context.symbols().decimalSeparator()) {
            return effectiveMin > 0 ? ~position : position;
          }

          position++;
        }

        var minEndPos = position + effectiveMin;

        if (minEndPos > length) {
          return ~position;
        }

        var maxEndPos = Math.min(position + effectiveMax, length);
        var total = 0;
        var pos = position;

        while (pos < maxEndPos) {
          var ch = text.charAt(pos++);
          var digit = context.symbols().convertToDigit(ch);

          if (digit < 0) {
            if (pos < minEndPos) {
              return ~position;
            }

            pos--;
            break;
          }

          total = total * 10 + digit;
        }

        var moveLeft = pos - position;
        var scale = Math.pow(10, moveLeft);
        var value = this.convertFromFraction(total, scale);
        return context.setParsedField(this.field, value, position, pos);
      };

      _proto.convertToFraction = function convertToFraction(value, zeroDigit) {
        var range = this.field.range();
        range.checkValidValue(value, this.field);

        var _min = range.minimum();

        var _range = range.maximum() - _min + 1;

        var _value = value - _min;

        var _scaled = MathUtil.intDiv(_value * 1000000000, _range);

        var fraction = "" + _scaled;

        while (fraction.length < 9) {
          fraction = zeroDigit + fraction;
        }

        return fraction;
      };

      _proto.convertFromFraction = function convertFromFraction(total, scale) {
        var range = this.field.range();

        var _min = range.minimum();

        var _range = range.maximum() - _min + 1;

        var _value = MathUtil.intDiv(total * _range, scale);

        return _value;
      };

      _proto.toString = function toString() {
        var decimal = this.decimalPoint ? ',DecimalPoint' : '';
        return "Fraction(" + this.field + "," + this.minWidth + "," + this.maxWidth + decimal + ")";
      };

      return FractionPrinterParser;
    }();

    var MAX_WIDTH$1 = 15;
    var EXCEED_POINTS = [0, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000];
    var NumberPrinterParser = function () {
      function NumberPrinterParser(field, minWidth, maxWidth, signStyle, subsequentWidth) {
        if (subsequentWidth === void 0) {
          subsequentWidth = 0;
        }

        this._field = field;
        this._minWidth = minWidth;
        this._maxWidth = maxWidth;
        this._signStyle = signStyle;
        this._subsequentWidth = subsequentWidth;
      }

      var _proto = NumberPrinterParser.prototype;

      _proto.field = function field() {
        return this._field;
      };

      _proto.minWidth = function minWidth() {
        return this._minWidth;
      };

      _proto.maxWidth = function maxWidth() {
        return this._maxWidth;
      };

      _proto.signStyle = function signStyle() {
        return this._signStyle;
      };

      _proto.withFixedWidth = function withFixedWidth() {
        if (this._subsequentWidth === -1) {
          return this;
        }

        return new NumberPrinterParser(this._field, this._minWidth, this._maxWidth, this._signStyle, -1);
      };

      _proto.withSubsequentWidth = function withSubsequentWidth(subsequentWidth) {
        return new NumberPrinterParser(this._field, this._minWidth, this._maxWidth, this._signStyle, this._subsequentWidth + subsequentWidth);
      };

      _proto._isFixedWidth = function _isFixedWidth() {
        return this._subsequentWidth === -1 || this._subsequentWidth > 0 && this._minWidth === this._maxWidth && this._signStyle === SignStyle.NOT_NEGATIVE;
      };

      _proto.print = function print(context, buf) {
        var contextValue = context.getValue(this._field);

        if (contextValue == null) {
          return false;
        }

        var value = this._getValue(context, contextValue);

        var symbols = context.symbols();
        var str = "" + Math.abs(value);

        if (str.length > this._maxWidth) {
          throw new DateTimeException("Field " + this._field + " cannot be printed as the value " + value + " exceeds the maximum print width of " + this._maxWidth);
        }

        str = symbols.convertNumberToI18N(str);

        if (value >= 0) {
          switch (this._signStyle) {
            case SignStyle.EXCEEDS_PAD:
              if (this._minWidth < MAX_WIDTH$1 && value >= EXCEED_POINTS[this._minWidth]) {
                buf.append(symbols.positiveSign());
              }

              break;

            case SignStyle.ALWAYS:
              buf.append(symbols.positiveSign());
              break;
          }
        } else {
          switch (this._signStyle) {
            case SignStyle.NORMAL:
            case SignStyle.EXCEEDS_PAD:
            case SignStyle.ALWAYS:
              buf.append(symbols.negativeSign());
              break;

            case SignStyle.NOT_NEGATIVE:
              throw new DateTimeException("Field " + this._field + " cannot be printed as the value " + value + " cannot be negative according to the SignStyle");
          }
        }

        for (var i = 0; i < this._minWidth - str.length; i++) {
          buf.append(symbols.zeroDigit());
        }

        buf.append(str);
        return true;
      };

      _proto.parse = function parse(context, text, position) {
        var length = text.length;

        if (position === length) {
          return ~position;
        }

        assert(position >= 0 && position < length);
        var sign = text.charAt(position);
        var negative = false;
        var positive = false;

        if (sign === context.symbols().positiveSign()) {
          if (this._signStyle.parse(true, context.isStrict(), this._minWidth === this._maxWidth) === false) {
            return ~position;
          }

          positive = true;
          position++;
        } else if (sign === context.symbols().negativeSign()) {
          if (this._signStyle.parse(false, context.isStrict(), this._minWidth === this._maxWidth) === false) {
            return ~position;
          }

          negative = true;
          position++;
        } else {
          if (this._signStyle === SignStyle.ALWAYS && context.isStrict()) {
            return ~position;
          }
        }

        var effMinWidth = context.isStrict() || this._isFixedWidth() ? this._minWidth : 1;
        var minEndPos = position + effMinWidth;

        if (minEndPos > length) {
          return ~position;
        }

        var effMaxWidth = (context.isStrict() || this._isFixedWidth() ? this._maxWidth : 9) + Math.max(this._subsequentWidth, 0);
        var total = 0;
        var pos = position;

        for (var pass = 0; pass < 2; pass++) {
          var maxEndPos = Math.min(pos + effMaxWidth, length);

          while (pos < maxEndPos) {
            var ch = text.charAt(pos++);
            var digit = context.symbols().convertToDigit(ch);

            if (digit < 0) {
              pos--;

              if (pos < minEndPos) {
                return ~position;
              }

              break;
            }

            if (pos - position > MAX_WIDTH$1) {
              throw new ArithmeticException('number text exceeds length');
            } else {
              total = total * 10 + digit;
            }
          }

          if (this._subsequentWidth > 0 && pass === 0) {
            var parseLen = pos - position;
            effMaxWidth = Math.max(effMinWidth, parseLen - this._subsequentWidth);
            pos = position;
            total = 0;
          } else {
            break;
          }
        }

        if (negative) {
          if (total === 0 && context.isStrict()) {
            return ~(position - 1);
          }

          if (total !== 0) {
            total = -total;
          }
        } else if (this._signStyle === SignStyle.EXCEEDS_PAD && context.isStrict()) {
          var _parseLen = pos - position;

          if (positive) {
            if (_parseLen <= this._minWidth) {
              return ~(position - 1);
            }
          } else {
            if (_parseLen > this._minWidth) {
              return ~position;
            }
          }
        }

        return this._setValue(context, total, position, pos);
      };

      _proto._getValue = function _getValue(context, value) {
        return value;
      };

      _proto._setValue = function _setValue(context, value, errorPos, successPos) {
        return context.setParsedField(this._field, value, errorPos, successPos);
      };

      _proto.toString = function toString() {
        if (this._minWidth === 1 && this._maxWidth === MAX_WIDTH$1 && this._signStyle === SignStyle.NORMAL) {
          return "Value(" + this._field + ")";
        }

        if (this._minWidth === this._maxWidth && this._signStyle === SignStyle.NOT_NEGATIVE) {
          return "Value(" + this._field + "," + this._minWidth + ")";
        }

        return "Value(" + this._field + "," + this._minWidth + "," + this._maxWidth + "," + this._signStyle + ")";
      };

      return NumberPrinterParser;
    }();
    var ReducedPrinterParser = function (_NumberPrinterParser) {
      _inheritsLoose(ReducedPrinterParser, _NumberPrinterParser);

      function ReducedPrinterParser(field, width, maxWidth, baseValue, baseDate) {
        var _this;

        _this = _NumberPrinterParser.call(this, field, width, maxWidth, SignStyle.NOT_NEGATIVE) || this;

        if (width < 1 || width > 10) {
          throw new IllegalArgumentException("The width must be from 1 to 10 inclusive but was " + width);
        }

        if (maxWidth < 1 || maxWidth > 10) {
          throw new IllegalArgumentException("The maxWidth must be from 1 to 10 inclusive but was " + maxWidth);
        }

        if (maxWidth < width) {
          throw new IllegalArgumentException('The maxWidth must be greater than the width');
        }

        if (baseDate === null) {
          if (field.range().isValidValue(baseValue) === false) {
            throw new IllegalArgumentException('The base value must be within the range of the field');
          }

          if (baseValue + EXCEED_POINTS[width] > MathUtil.MAX_SAFE_INTEGER) {
            throw new DateTimeException('Unable to add printer-parser as the range exceeds the capacity of an int');
          }
        }

        _this._baseValue = baseValue;
        _this._baseDate = baseDate;
        return _this;
      }

      var _proto2 = ReducedPrinterParser.prototype;

      _proto2._getValue = function _getValue(context, value) {
        var absValue = Math.abs(value);
        var baseValue = this._baseValue;

        if (this._baseDate !== null) {
          context.temporal();
          var chrono = IsoChronology.INSTANCE;
          baseValue = chrono.date(this._baseDate).get(this._field);
        }

        if (value >= baseValue && value < baseValue + EXCEED_POINTS[this._minWidth]) {
          return absValue % EXCEED_POINTS[this._minWidth];
        }

        return absValue % EXCEED_POINTS[this._maxWidth];
      };

      _proto2._setValue = function _setValue(context, value, errorPos, successPos) {
        var baseValue = this._baseValue;

        if (this._baseDate != null) {
          var chrono = context.getEffectiveChronology();
          baseValue = chrono.date(this._baseDate).get(this._field);
        }

        var parseLen = successPos - errorPos;

        if (parseLen === this._minWidth && value >= 0) {
          var range = EXCEED_POINTS[this._minWidth];
          var lastPart = baseValue % range;
          var basePart = baseValue - lastPart;

          if (baseValue > 0) {
            value = basePart + value;
          } else {
            value = basePart - value;
          }

          if (value < baseValue) {
            value += range;
          }
        }

        return context.setParsedField(this._field, value, errorPos, successPos);
      };

      _proto2.withFixedWidth = function withFixedWidth() {
        if (this._subsequentWidth === -1) {
          return this;
        }

        return new ReducedPrinterParser(this._field, this._minWidth, this._maxWidth, this._baseValue, this._baseDate, -1);
      };

      _proto2.withSubsequentWidth = function withSubsequentWidth(subsequentWidth) {
        return new ReducedPrinterParser(this._field, this._minWidth, this._maxWidth, this._baseValue, this._baseDate, this._subsequentWidth + subsequentWidth);
      };

      _proto2.isFixedWidth = function isFixedWidth(context) {
        if (context.isStrict() === false) {
          return false;
        }

        return _NumberPrinterParser.prototype.isFixedWidth.call(this, context);
      };

      _proto2.toString = function toString() {
        return "ReducedValue(" + this._field + "," + this._minWidth + "," + this._maxWidth + "," + (this._baseDate != null ? this._baseDate : this._baseValue) + ")";
      };

      return ReducedPrinterParser;
    }(NumberPrinterParser);

    /**
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var PATTERNS = ['+HH', '+HHmm', '+HH:mm', '+HHMM', '+HH:MM', '+HHMMss', '+HH:MM:ss', '+HHMMSS', '+HH:MM:SS'];
    var OffsetIdPrinterParser = function () {
      function OffsetIdPrinterParser(noOffsetText, pattern) {
        requireNonNull(noOffsetText, 'noOffsetText');
        requireNonNull(pattern, 'pattern');
        this.noOffsetText = noOffsetText;
        this.type = this._checkPattern(pattern);
      }

      var _proto = OffsetIdPrinterParser.prototype;

      _proto._checkPattern = function _checkPattern(pattern) {
        for (var i = 0; i < PATTERNS.length; i++) {
          if (PATTERNS[i] === pattern) {
            return i;
          }
        }

        throw new IllegalArgumentException("Invalid zone offset pattern: " + pattern);
      };

      _proto.print = function print(context, buf) {
        var offsetSecs = context.getValue(ChronoField.OFFSET_SECONDS);

        if (offsetSecs == null) {
          return false;
        }

        var totalSecs = MathUtil.safeToInt(offsetSecs);

        if (totalSecs === 0) {
          buf.append(this.noOffsetText);
        } else {
          var absHours = Math.abs(MathUtil.intMod(MathUtil.intDiv(totalSecs, 3600), 100));
          var absMinutes = Math.abs(MathUtil.intMod(MathUtil.intDiv(totalSecs, 60), 60));
          var absSeconds = Math.abs(MathUtil.intMod(totalSecs, 60));
          var bufPos = buf.length();
          var output = absHours;
          buf.append(totalSecs < 0 ? '-' : '+').appendChar(MathUtil.intDiv(absHours, 10) + "0").appendChar(MathUtil.intMod(absHours, 10) + "0");

          if (this.type >= 3 || this.type >= 1 && absMinutes > 0) {
            buf.append(this.type % 2 === 0 ? ':' : '').appendChar(MathUtil.intDiv(absMinutes, 10) + "0").appendChar(absMinutes % 10 + "0");
            output += absMinutes;

            if (this.type >= 7 || this.type >= 5 && absSeconds > 0) {
              buf.append(this.type % 2 === 0 ? ':' : '').appendChar(MathUtil.intDiv(absSeconds, 10) + "0").appendChar(absSeconds % 10 + "0");
              output += absSeconds;
            }
          }

          if (output === 0) {
            buf.setLength(bufPos);
            buf.append(this.noOffsetText);
          }
        }

        return true;
      };

      _proto.parse = function parse(context, text, position) {
        var length = text.length;
        var noOffsetLen = this.noOffsetText.length;

        if (noOffsetLen === 0) {
          if (position === length) {
            return context.setParsedField(ChronoField.OFFSET_SECONDS, 0, position, position);
          }
        } else {
          if (position === length) {
            return ~position;
          }

          if (context.subSequenceEquals(text, position, this.noOffsetText, 0, noOffsetLen)) {
            return context.setParsedField(ChronoField.OFFSET_SECONDS, 0, position, position + noOffsetLen);
          }
        }

        var sign = text[position];

        if (sign === '+' || sign === '-') {
          var negative = sign === '-' ? -1 : 1;
          var array = [0, 0, 0, 0];
          array[0] = position + 1;

          if ((this._parseNumber(array, 1, text, true) || this._parseNumber(array, 2, text, this.type >= 3) || this._parseNumber(array, 3, text, false)) === false) {
            var offsetSecs = MathUtil.safeZero(negative * (array[1] * 3600 + array[2] * 60 + array[3]));
            return context.setParsedField(ChronoField.OFFSET_SECONDS, offsetSecs, position, array[0]);
          }
        }

        if (noOffsetLen === 0) {
          return context.setParsedField(ChronoField.OFFSET_SECONDS, 0, position, position + noOffsetLen);
        }

        return ~position;
      };

      _proto._parseNumber = function _parseNumber(array, arrayIndex, parseText, required) {
        if ((this.type + 3) / 2 < arrayIndex) {
          return false;
        }

        var pos = array[0];

        if (this.type % 2 === 0 && arrayIndex > 1) {
          if (pos + 1 > parseText.length || parseText[pos] !== ':') {
            return required;
          }

          pos++;
        }

        if (pos + 2 > parseText.length) {
          return required;
        }

        var ch1 = parseText[pos++];
        var ch2 = parseText[pos++];

        if (ch1 < '0' || ch1 > '9' || ch2 < '0' || ch2 > '9') {
          return required;
        }

        var value = (ch1.charCodeAt(0) - 48) * 10 + (ch2.charCodeAt(0) - 48);

        if (value < 0 || value > 59) {
          return required;
        }

        array[arrayIndex] = value;
        array[0] = pos;
        return false;
      };

      _proto.toString = function toString() {
        var converted = this.noOffsetText.replace('\'', '\'\'');
        return "Offset(" + PATTERNS[this.type] + ",'" + converted + "')";
      };

      return OffsetIdPrinterParser;
    }();
    OffsetIdPrinterParser.INSTANCE_ID = new OffsetIdPrinterParser('Z', '+HH:MM:ss');
    OffsetIdPrinterParser.PATTERNS = PATTERNS;

    /**
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var PadPrinterParserDecorator = function () {
      function PadPrinterParserDecorator(printerParser, padWidth, padChar) {
        this._printerParser = printerParser;
        this._padWidth = padWidth;
        this._padChar = padChar;
      }

      var _proto = PadPrinterParserDecorator.prototype;

      _proto.print = function print(context, buf) {
        var preLen = buf.length();

        if (this._printerParser.print(context, buf) === false) {
          return false;
        }

        var len = buf.length() - preLen;

        if (len > this._padWidth) {
          throw new DateTimeException("Cannot print as output of " + len + " characters exceeds pad width of " + this._padWidth);
        }

        for (var i = 0; i < this._padWidth - len; i++) {
          buf.insert(preLen, this._padChar);
        }

        return true;
      };

      _proto.parse = function parse(context, text, position) {
        var strict = context.isStrict();
        var caseSensitive = context.isCaseSensitive();
        assert(!(position > text.length));
        assert(position >= 0);

        if (position === text.length) {
          return ~position;
        }

        var endPos = position + this._padWidth;

        if (endPos > text.length) {
          if (strict) {
            return ~position;
          }

          endPos = text.length;
        }

        var pos = position;

        while (pos < endPos && (caseSensitive ? text[pos] === this._padChar : context.charEquals(text[pos], this._padChar))) {
          pos++;
        }

        text = text.substring(0, endPos);

        var resultPos = this._printerParser.parse(context, text, pos);

        if (resultPos !== endPos && strict) {
          return ~(position + pos);
        }

        return resultPos;
      };

      _proto.toString = function toString() {
        return "Pad(" + this._printerParser + "," + this._padWidth + (this._padChar === ' ' ? ')' : ",'" + this._padChar + "')");
      };

      return PadPrinterParserDecorator;
    }();

    var SettingsParser = function (_Enum) {
      _inheritsLoose(SettingsParser, _Enum);

      function SettingsParser() {
        return _Enum.apply(this, arguments) || this;
      }

      var _proto = SettingsParser.prototype;

      _proto.print = function print() {
        return true;
      };

      _proto.parse = function parse(context, text, position) {
        switch (this) {
          case SettingsParser.SENSITIVE:
            context.setCaseSensitive(true);
            break;

          case SettingsParser.INSENSITIVE:
            context.setCaseSensitive(false);
            break;

          case SettingsParser.STRICT:
            context.setStrict(true);
            break;

          case SettingsParser.LENIENT:
            context.setStrict(false);
            break;
        }

        return position;
      };

      _proto.toString = function toString() {
        switch (this) {
          case SettingsParser.SENSITIVE:
            return 'ParseCaseSensitive(true)';

          case SettingsParser.INSENSITIVE:
            return 'ParseCaseSensitive(false)';

          case SettingsParser.STRICT:
            return 'ParseStrict(true)';

          case SettingsParser.LENIENT:
            return 'ParseStrict(false)';
        }
      };

      return SettingsParser;
    }(Enum);
    SettingsParser.SENSITIVE = new SettingsParser('SENSITIVE');
    SettingsParser.INSENSITIVE = new SettingsParser('INSENSITIVE');
    SettingsParser.STRICT = new SettingsParser('STRICT');
    SettingsParser.LENIENT = new SettingsParser('LENIENT');

    /**
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var StringLiteralPrinterParser = function () {
      function StringLiteralPrinterParser(literal) {
        this._literal = literal;
      }

      var _proto = StringLiteralPrinterParser.prototype;

      _proto.print = function print(context, buf) {
        buf.append(this._literal);
        return true;
      };

      _proto.parse = function parse(context, text, position) {
        var length = text.length;
        assert(!(position > length || position < 0));

        if (context.subSequenceEquals(text, position, this._literal, 0, this._literal.length) === false) {
          return ~position;
        }

        return position + this._literal.length;
      };

      _proto.toString = function toString() {
        var converted = this._literal.replace("'", "''");

        return "'" + converted + "'";
      };

      return StringLiteralPrinterParser;
    }();

    /*
     * @copyright (c) 2016, Philipp Thürwächter, Pattrick Hüper
     * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var ZoneRulesProvider = function () {
      function ZoneRulesProvider() {}

      ZoneRulesProvider.getRules = function getRules(zoneId) {
        throw new DateTimeException("unsupported ZoneId:" + zoneId);
      };

      ZoneRulesProvider.getAvailableZoneIds = function getAvailableZoneIds() {
        return [];
      };

      return ZoneRulesProvider;
    }();

    var ZoneRegion = function (_ZoneId) {
      _inheritsLoose(ZoneRegion, _ZoneId);

      ZoneRegion.ofId = function ofId(zoneId) {
        var rules = ZoneRulesProvider.getRules(zoneId);
        return new ZoneRegion(zoneId, rules);
      };

      function ZoneRegion(id, rules) {
        var _this;

        _this = _ZoneId.call(this) || this;
        _this._id = id;
        _this._rules = rules;
        return _this;
      }

      var _proto = ZoneRegion.prototype;

      _proto.id = function id() {
        return this._id;
      };

      _proto.rules = function rules() {
        return this._rules;
      };

      return ZoneRegion;
    }(ZoneId);

    /**
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var ZoneIdPrinterParser = function () {
      function ZoneIdPrinterParser(query, description) {
        this.query = query;
        this.description = description;
      }

      var _proto = ZoneIdPrinterParser.prototype;

      _proto.print = function print(context, buf) {
        var zone = context.getValueQuery(this.query);

        if (zone == null) {
          return false;
        }

        buf.append(zone.id());
        return true;
      };

      _proto.parse = function parse(context, text, position) {
        var length = text.length;

        if (position > length) {
          return ~position;
        }

        if (position === length) {
          return ~position;
        }

        var nextChar = text.charAt(position);

        if (nextChar === '+' || nextChar === '-') {
          var newContext = context.copy();
          var endPos = OffsetIdPrinterParser.INSTANCE_ID.parse(newContext, text, position);

          if (endPos < 0) {
            return endPos;
          }

          var offset = newContext.getParsed(ChronoField.OFFSET_SECONDS);
          var zone = ZoneOffset.ofTotalSeconds(offset);
          context.setParsedZone(zone);
          return endPos;
        } else if (length >= position + 2) {
          var nextNextChar = text.charAt(position + 1);

          if (context.charEquals(nextChar, 'U') && context.charEquals(nextNextChar, 'T')) {
            if (length >= position + 3 && context.charEquals(text.charAt(position + 2), 'C')) {
              return this._parsePrefixedOffset(context, text, position, position + 3);
            }

            return this._parsePrefixedOffset(context, text, position, position + 2);
          } else if (context.charEquals(nextChar, 'G') && length >= position + 3 && context.charEquals(nextNextChar, 'M') && context.charEquals(text.charAt(position + 2), 'T')) {
            return this._parsePrefixedOffset(context, text, position, position + 3);
          }
        }

        if (text.substr(position, 6) === 'SYSTEM') {
          context.setParsedZone(ZoneId.systemDefault());
          return position + 6;
        }

        if (context.charEquals(nextChar, 'Z')) {
          context.setParsedZone(ZoneOffset.UTC);
          return position + 1;
        }

        var availableZoneIds = ZoneRulesProvider.getAvailableZoneIds();

        if (zoneIdTree.size !== availableZoneIds.length) {
          zoneIdTree = ZoneIdTree.createTreeMap(availableZoneIds);
        }

        var maxParseLength = length - position;
        var treeMap = zoneIdTree.treeMap;
        var parsedZoneId = null;
        var parseLength = 0;

        while (treeMap != null) {
          var parsedSubZoneId = text.substr(position, Math.min(treeMap.length, maxParseLength));
          treeMap = treeMap.get(parsedSubZoneId);

          if (treeMap != null && treeMap.isLeaf) {
            parsedZoneId = parsedSubZoneId;
            parseLength = treeMap.length;
          }
        }

        if (parsedZoneId != null) {
          context.setParsedZone(ZoneRegion.ofId(parsedZoneId));
          return position + parseLength;
        }

        return ~position;
      };

      _proto._parsePrefixedOffset = function _parsePrefixedOffset(context, text, prefixPos, position) {
        var prefix = text.substring(prefixPos, position).toUpperCase();
        var newContext = context.copy();

        if (position < text.length && context.charEquals(text.charAt(position), 'Z')) {
          context.setParsedZone(ZoneId.ofOffset(prefix, ZoneOffset.UTC));
          return position;
        }

        var endPos = OffsetIdPrinterParser.INSTANCE_ID.parse(newContext, text, position);

        if (endPos < 0) {
          context.setParsedZone(ZoneId.ofOffset(prefix, ZoneOffset.UTC));
          return position;
        }

        var offsetSecs = newContext.getParsed(ChronoField.OFFSET_SECONDS);
        var offset = ZoneOffset.ofTotalSeconds(offsetSecs);
        context.setParsedZone(ZoneId.ofOffset(prefix, offset));
        return endPos;
      };

      _proto.toString = function toString() {
        return this.description;
      };

      return ZoneIdPrinterParser;
    }();

    var ZoneIdTree = function () {
      ZoneIdTree.createTreeMap = function createTreeMap(availableZoneIds) {
        var sortedZoneIds = availableZoneIds.sort(function (a, b) {
          return a.length - b.length;
        });
        var treeMap = new ZoneIdTreeMap(sortedZoneIds[0].length, false);

        for (var i = 0; i < sortedZoneIds.length; i++) {
          treeMap.add(sortedZoneIds[i]);
        }

        return new ZoneIdTree(sortedZoneIds.length, treeMap);
      };

      function ZoneIdTree(size, treeMap) {
        this.size = size;
        this.treeMap = treeMap;
      }

      return ZoneIdTree;
    }();

    var ZoneIdTreeMap = function () {
      function ZoneIdTreeMap(length, isLeaf) {
        if (length === void 0) {
          length = 0;
        }

        if (isLeaf === void 0) {
          isLeaf = false;
        }

        this.length = length;
        this.isLeaf = isLeaf;
        this._treeMap = {};
      }

      var _proto2 = ZoneIdTreeMap.prototype;

      _proto2.add = function add(zoneId) {
        var idLength = zoneId.length;

        if (idLength === this.length) {
          this._treeMap[zoneId] = new ZoneIdTreeMap(idLength, true);
        } else if (idLength > this.length) {
          var subZoneId = zoneId.substr(0, this.length);
          var subTreeMap = this._treeMap[subZoneId];

          if (subTreeMap == null) {
            subTreeMap = new ZoneIdTreeMap(idLength, false);
            this._treeMap[subZoneId] = subTreeMap;
          }

          subTreeMap.add(zoneId);
        }
      };

      _proto2.get = function get(zoneId) {
        return this._treeMap[zoneId];
      };

      return ZoneIdTreeMap;
    }();

    var zoneIdTree = new ZoneIdTree([]);

    /**
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var MAX_WIDTH = 15;
    var DateTimeFormatterBuilder = function () {
      function DateTimeFormatterBuilder() {
        this._active = this;
        this._parent = null;
        this._printerParsers = [];
        this._optional = false;
        this._padNextWidth = 0;
        this._padNextChar = null;
        this._valueParserIndex = -1;
      }

      DateTimeFormatterBuilder._of = function _of(parent, optional) {
        requireNonNull(parent, 'parent');
        requireNonNull(optional, 'optional');
        var dtFormatterBuilder = new DateTimeFormatterBuilder();
        dtFormatterBuilder._parent = parent;
        dtFormatterBuilder._optional = optional;
        return dtFormatterBuilder;
      };

      var _proto = DateTimeFormatterBuilder.prototype;

      _proto.parseCaseSensitive = function parseCaseSensitive() {
        this._appendInternalPrinterParser(SettingsParser.SENSITIVE);

        return this;
      };

      _proto.parseCaseInsensitive = function parseCaseInsensitive() {
        this._appendInternalPrinterParser(SettingsParser.INSENSITIVE);

        return this;
      };

      _proto.parseStrict = function parseStrict() {
        this._appendInternalPrinterParser(SettingsParser.STRICT);

        return this;
      };

      _proto.parseLenient = function parseLenient() {
        this._appendInternalPrinterParser(SettingsParser.LENIENT);

        return this;
      };

      _proto.appendValue = function appendValue() {
        if (arguments.length === 1) {
          return this._appendValue1.apply(this, arguments);
        } else if (arguments.length === 2) {
          return this._appendValue2.apply(this, arguments);
        } else {
          return this._appendValue4.apply(this, arguments);
        }
      };

      _proto._appendValue1 = function _appendValue1(field) {
        requireNonNull(field);

        this._appendValuePrinterParser(new NumberPrinterParser(field, 1, MAX_WIDTH, SignStyle.NORMAL));

        return this;
      };

      _proto._appendValue2 = function _appendValue2(field, width) {
        requireNonNull(field);

        if (width < 1 || width > MAX_WIDTH) {
          throw new IllegalArgumentException("The width must be from 1 to " + MAX_WIDTH + " inclusive but was " + width);
        }

        var pp = new NumberPrinterParser(field, width, width, SignStyle.NOT_NEGATIVE);

        this._appendValuePrinterParser(pp);

        return this;
      };

      _proto._appendValue4 = function _appendValue4(field, minWidth, maxWidth, signStyle) {
        requireNonNull(field);
        requireNonNull(signStyle);

        if (minWidth === maxWidth && signStyle === SignStyle.NOT_NEGATIVE) {
          return this._appendValue2(field, maxWidth);
        }

        if (minWidth < 1 || minWidth > MAX_WIDTH) {
          throw new IllegalArgumentException("The minimum width must be from 1 to " + MAX_WIDTH + " inclusive but was " + minWidth);
        }

        if (maxWidth < 1 || maxWidth > MAX_WIDTH) {
          throw new IllegalArgumentException("The minimum width must be from 1 to " + MAX_WIDTH + " inclusive but was " + maxWidth);
        }

        if (maxWidth < minWidth) {
          throw new IllegalArgumentException("The maximum width must exceed or equal the minimum width but " + maxWidth + " < " + minWidth);
        }

        var pp = new NumberPrinterParser(field, minWidth, maxWidth, signStyle);

        this._appendValuePrinterParser(pp);

        return this;
      };

      _proto.appendValueReduced = function appendValueReduced() {
        if (arguments.length === 4 && arguments[3] instanceof ChronoLocalDate) {
          return this._appendValueReducedFieldWidthMaxWidthBaseDate.apply(this, arguments);
        } else {
          return this._appendValueReducedFieldWidthMaxWidthBaseValue.apply(this, arguments);
        }
      };

      _proto._appendValueReducedFieldWidthMaxWidthBaseValue = function _appendValueReducedFieldWidthMaxWidthBaseValue(field, width, maxWidth, baseValue) {
        requireNonNull(field, 'field');
        var pp = new ReducedPrinterParser(field, width, maxWidth, baseValue, null);

        this._appendValuePrinterParser(pp);

        return this;
      };

      _proto._appendValueReducedFieldWidthMaxWidthBaseDate = function _appendValueReducedFieldWidthMaxWidthBaseDate(field, width, maxWidth, baseDate) {
        requireNonNull(field, 'field');
        requireNonNull(baseDate, 'baseDate');
        requireInstance(baseDate, ChronoLocalDate, 'baseDate');
        var pp = new ReducedPrinterParser(field, width, maxWidth, 0, baseDate);

        this._appendValuePrinterParser(pp);

        return this;
      };

      _proto._appendValuePrinterParser = function _appendValuePrinterParser(pp) {
        assert(pp != null);

        if (this._active._valueParserIndex >= 0 && this._active._printerParsers[this._active._valueParserIndex] instanceof NumberPrinterParser) {
          var activeValueParser = this._active._valueParserIndex;
          var basePP = this._active._printerParsers[activeValueParser];

          if (pp.minWidth() === pp.maxWidth() && pp.signStyle() === SignStyle.NOT_NEGATIVE) {
            basePP = basePP.withSubsequentWidth(pp.maxWidth());

            this._appendInternal(pp.withFixedWidth());

            this._active._valueParserIndex = activeValueParser;
          } else {
            basePP = basePP.withFixedWidth();
            this._active._valueParserIndex = this._appendInternal(pp);
          }

          this._active._printerParsers[activeValueParser] = basePP;
        } else {
          this._active._valueParserIndex = this._appendInternal(pp);
        }

        return this;
      };

      _proto.appendFraction = function appendFraction(field, minWidth, maxWidth, decimalPoint) {
        this._appendInternal(new FractionPrinterParser(field, minWidth, maxWidth, decimalPoint));

        return this;
      };

      _proto.appendInstant = function appendInstant(fractionalDigits) {
        if (fractionalDigits === void 0) {
          fractionalDigits = -2;
        }

        if (fractionalDigits < -2 || fractionalDigits > 9) {
          throw new IllegalArgumentException("Invalid fractional digits: " + fractionalDigits);
        }

        this._appendInternal(new InstantPrinterParser(fractionalDigits));

        return this;
      };

      _proto.appendOffsetId = function appendOffsetId() {
        this._appendInternal(OffsetIdPrinterParser.INSTANCE_ID);

        return this;
      };

      _proto.appendOffset = function appendOffset(pattern, noOffsetText) {
        this._appendInternalPrinterParser(new OffsetIdPrinterParser(noOffsetText, pattern));

        return this;
      };

      _proto.appendZoneId = function appendZoneId() {
        this._appendInternal(new ZoneIdPrinterParser(TemporalQueries.zoneId(), 'ZoneId()'));

        return this;
      };

      _proto.appendPattern = function appendPattern(pattern) {
        requireNonNull(pattern, 'pattern');

        this._parsePattern(pattern);

        return this;
      };

      _proto.appendZoneText = function appendZoneText() {
        throw new IllegalArgumentException('Pattern using (localized) text not implemented, use @js-joda/locale plugin!');
      };

      _proto.appendText = function appendText() {
        throw new IllegalArgumentException('Pattern using (localized) text not implemented, use @js-joda/locale plugin!');
      };

      _proto.appendLocalizedOffset = function appendLocalizedOffset() {
        throw new IllegalArgumentException('Pattern using (localized) text not implemented, use @js-joda/locale plugin!');
      };

      _proto.appendWeekField = function appendWeekField() {
        throw new IllegalArgumentException('Pattern using (localized) text not implemented, use @js-joda/locale plugin!');
      };

      _proto._parsePattern = function _parsePattern(pattern) {
        var FIELD_MAP = {
          'G': ChronoField.ERA,
          'y': ChronoField.YEAR_OF_ERA,
          'u': ChronoField.YEAR,
          'Q': IsoFields.QUARTER_OF_YEAR,
          'q': IsoFields.QUARTER_OF_YEAR,
          'M': ChronoField.MONTH_OF_YEAR,
          'L': ChronoField.MONTH_OF_YEAR,
          'D': ChronoField.DAY_OF_YEAR,
          'd': ChronoField.DAY_OF_MONTH,
          'F': ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH,
          'E': ChronoField.DAY_OF_WEEK,
          'c': ChronoField.DAY_OF_WEEK,
          'e': ChronoField.DAY_OF_WEEK,
          'a': ChronoField.AMPM_OF_DAY,
          'H': ChronoField.HOUR_OF_DAY,
          'k': ChronoField.CLOCK_HOUR_OF_DAY,
          'K': ChronoField.HOUR_OF_AMPM,
          'h': ChronoField.CLOCK_HOUR_OF_AMPM,
          'm': ChronoField.MINUTE_OF_HOUR,
          's': ChronoField.SECOND_OF_MINUTE,
          'S': ChronoField.NANO_OF_SECOND,
          'A': ChronoField.MILLI_OF_DAY,
          'n': ChronoField.NANO_OF_SECOND,
          'N': ChronoField.NANO_OF_DAY
        };

        for (var pos = 0; pos < pattern.length; pos++) {
          var cur = pattern.charAt(pos);

          if (cur >= 'A' && cur <= 'Z' || cur >= 'a' && cur <= 'z') {
            var start = pos++;

            for (; pos < pattern.length && pattern.charAt(pos) === cur; pos++) {
            }

            var count = pos - start;

            if (cur === 'p') {
              var pad = 0;

              if (pos < pattern.length) {
                cur = pattern.charAt(pos);

                if (cur >= 'A' && cur <= 'Z' || cur >= 'a' && cur <= 'z') {
                  pad = count;
                  start = pos++;

                  for (; pos < pattern.length && pattern.charAt(pos) === cur; pos++) {
                  }

                  count = pos - start;
                }
              }

              if (pad === 0) {
                throw new IllegalArgumentException("Pad letter 'p' must be followed by valid pad pattern: " + pattern);
              }

              this.padNext(pad);
            }

            var field = FIELD_MAP[cur];

            if (field != null) {
              this._parseField(cur, count, field);
            } else if (cur === 'z') {
              if (count > 4) {
                throw new IllegalArgumentException("Too many pattern letters: " + cur);
              } else if (count === 4) {
                this.appendZoneText(TextStyle.FULL);
              } else {
                this.appendZoneText(TextStyle.SHORT);
              }
            } else if (cur === 'V') {
              if (count !== 2) {
                throw new IllegalArgumentException("Pattern letter count must be 2: " + cur);
              }

              this.appendZoneId();
            } else if (cur === 'Z') {
              if (count < 4) {
                this.appendOffset('+HHMM', '+0000');
              } else if (count === 4) {
                this.appendLocalizedOffset(TextStyle.FULL);
              } else if (count === 5) {
                this.appendOffset('+HH:MM:ss', 'Z');
              } else {
                throw new IllegalArgumentException("Too many pattern letters: " + cur);
              }
            } else if (cur === 'O') {
              if (count === 1) {
                this.appendLocalizedOffset(TextStyle.SHORT);
              } else if (count === 4) {
                this.appendLocalizedOffset(TextStyle.FULL);
              } else {
                throw new IllegalArgumentException("Pattern letter count must be 1 or 4: " + cur);
              }
            } else if (cur === 'X') {
              if (count > 5) {
                throw new IllegalArgumentException("Too many pattern letters: " + cur);
              }

              this.appendOffset(OffsetIdPrinterParser.PATTERNS[count + (count === 1 ? 0 : 1)], 'Z');
            } else if (cur === 'x') {
              if (count > 5) {
                throw new IllegalArgumentException("Too many pattern letters: " + cur);
              }

              var zero = count === 1 ? '+00' : count % 2 === 0 ? '+0000' : '+00:00';
              this.appendOffset(OffsetIdPrinterParser.PATTERNS[count + (count === 1 ? 0 : 1)], zero);
            } else if (cur === 'W') {
              if (count > 1) {
                throw new IllegalArgumentException("Too many pattern letters: " + cur);
              }

              this.appendWeekField('W', count);
            } else if (cur === 'w') {
              if (count > 2) {
                throw new IllegalArgumentException("Too many pattern letters: " + cur);
              }

              this.appendWeekField('w', count);
            } else if (cur === 'Y') {
              this.appendWeekField('Y', count);
            } else {
              throw new IllegalArgumentException("Unknown pattern letter: " + cur);
            }

            pos--;
          } else if (cur === '\'') {
            var _start = pos++;

            for (; pos < pattern.length; pos++) {
              if (pattern.charAt(pos) === '\'') {
                if (pos + 1 < pattern.length && pattern.charAt(pos + 1) === '\'') {
                  pos++;
                } else {
                  break;
                }
              }
            }

            if (pos >= pattern.length) {
              throw new IllegalArgumentException("Pattern ends with an incomplete string literal: " + pattern);
            }

            var str = pattern.substring(_start + 1, pos);

            if (str.length === 0) {
              this.appendLiteral('\'');
            } else {
              this.appendLiteral(str.replace('\'\'', '\''));
            }
          } else if (cur === '[') {
            this.optionalStart();
          } else if (cur === ']') {
            if (this._active._parent === null) {
              throw new IllegalArgumentException('Pattern invalid as it contains ] without previous [');
            }

            this.optionalEnd();
          } else if (cur === '{' || cur === '}' || cur === '#') {
            throw new IllegalArgumentException("Pattern includes reserved character: '" + cur + "'");
          } else {
            this.appendLiteral(cur);
          }
        }
      };

      _proto._parseField = function _parseField(cur, count, field) {
        switch (cur) {
          case 'u':
          case 'y':
            if (count === 2) {
              this.appendValueReduced(field, 2, 2, ReducedPrinterParser.BASE_DATE);
            } else if (count < 4) {
              this.appendValue(field, count, MAX_WIDTH, SignStyle.NORMAL);
            } else {
              this.appendValue(field, count, MAX_WIDTH, SignStyle.EXCEEDS_PAD);
            }

            break;

          case 'M':
          case 'Q':
            switch (count) {
              case 1:
                this.appendValue(field);
                break;

              case 2:
                this.appendValue(field, 2);
                break;

              case 3:
                this.appendText(field, TextStyle.SHORT);
                break;

              case 4:
                this.appendText(field, TextStyle.FULL);
                break;

              case 5:
                this.appendText(field, TextStyle.NARROW);
                break;

              default:
                throw new IllegalArgumentException("Too many pattern letters: " + cur);
            }

            break;

          case 'L':
          case 'q':
            switch (count) {
              case 1:
                this.appendValue(field);
                break;

              case 2:
                this.appendValue(field, 2);
                break;

              case 3:
                this.appendText(field, TextStyle.SHORT_STANDALONE);
                break;

              case 4:
                this.appendText(field, TextStyle.FULL_STANDALONE);
                break;

              case 5:
                this.appendText(field, TextStyle.NARROW_STANDALONE);
                break;

              default:
                throw new IllegalArgumentException("Too many pattern letters: " + cur);
            }

            break;

          case 'e':
            switch (count) {
              case 1:
              case 2:
                this.appendWeekField('e', count);
                break;

              case 3:
                this.appendText(field, TextStyle.SHORT);
                break;

              case 4:
                this.appendText(field, TextStyle.FULL);
                break;

              case 5:
                this.appendText(field, TextStyle.NARROW);
                break;

              default:
                throw new IllegalArgumentException("Too many pattern letters: " + cur);
            }

            break;

          case 'c':
            switch (count) {
              case 1:
                this.appendWeekField('c', count);
                break;

              case 2:
                throw new IllegalArgumentException("Invalid number of pattern letters: " + cur);

              case 3:
                this.appendText(field, TextStyle.SHORT_STANDALONE);
                break;

              case 4:
                this.appendText(field, TextStyle.FULL_STANDALONE);
                break;

              case 5:
                this.appendText(field, TextStyle.NARROW_STANDALONE);
                break;

              default:
                throw new IllegalArgumentException("Too many pattern letters: " + cur);
            }

            break;

          case 'a':
            if (count === 1) {
              this.appendText(field, TextStyle.SHORT);
            } else {
              throw new IllegalArgumentException("Too many pattern letters: " + cur);
            }

            break;

          case 'E':
          case 'G':
            switch (count) {
              case 1:
              case 2:
              case 3:
                this.appendText(field, TextStyle.SHORT);
                break;

              case 4:
                this.appendText(field, TextStyle.FULL);
                break;

              case 5:
                this.appendText(field, TextStyle.NARROW);
                break;

              default:
                throw new IllegalArgumentException("Too many pattern letters: " + cur);
            }

            break;

          case 'S':
            this.appendFraction(ChronoField.NANO_OF_SECOND, count, count, false);
            break;

          case 'F':
            if (count === 1) {
              this.appendValue(field);
            } else {
              throw new IllegalArgumentException("Too many pattern letters: " + cur);
            }

            break;

          case 'd':
          case 'h':
          case 'H':
          case 'k':
          case 'K':
          case 'm':
          case 's':
            if (count === 1) {
              this.appendValue(field);
            } else if (count === 2) {
              this.appendValue(field, count);
            } else {
              throw new IllegalArgumentException("Too many pattern letters: " + cur);
            }

            break;

          case 'D':
            if (count === 1) {
              this.appendValue(field);
            } else if (count <= 3) {
              this.appendValue(field, count);
            } else {
              throw new IllegalArgumentException("Too many pattern letters: " + cur);
            }

            break;

          default:
            if (count === 1) {
              this.appendValue(field);
            } else {
              this.appendValue(field, count);
            }

            break;
        }
      };

      _proto.padNext = function padNext() {
        if (arguments.length === 1) {
          return this._padNext1.apply(this, arguments);
        } else {
          return this._padNext2.apply(this, arguments);
        }
      };

      _proto._padNext1 = function _padNext1(padWidth) {
        return this._padNext2(padWidth, ' ');
      };

      _proto._padNext2 = function _padNext2(padWidth, padChar) {
        if (padWidth < 1) {
          throw new IllegalArgumentException("The pad width must be at least one but was " + padWidth);
        }

        this._active._padNextWidth = padWidth;
        this._active._padNextChar = padChar;
        this._active._valueParserIndex = -1;
        return this;
      };

      _proto.optionalStart = function optionalStart() {
        this._active._valueParserIndex = -1;
        this._active = DateTimeFormatterBuilder._of(this._active, true);
        return this;
      };

      _proto.optionalEnd = function optionalEnd() {
        if (this._active._parent == null) {
          throw new IllegalStateException('Cannot call optionalEnd() as there was no previous call to optionalStart()');
        }

        if (this._active._printerParsers.length > 0) {
          var cpp = new CompositePrinterParser(this._active._printerParsers, this._active._optional);
          this._active = this._active._parent;

          this._appendInternal(cpp);
        } else {
          this._active = this._active._parent;
        }

        return this;
      };

      _proto._appendInternal = function _appendInternal(pp) {
        assert(pp != null);

        if (this._active._padNextWidth > 0) {
          if (pp != null) {
            pp = new PadPrinterParserDecorator(pp, this._active._padNextWidth, this._active._padNextChar);
          }

          this._active._padNextWidth = 0;
          this._active._padNextChar = 0;
        }

        this._active._printerParsers.push(pp);

        this._active._valueParserIndex = -1;
        return this._active._printerParsers.length - 1;
      };

      _proto.appendLiteral = function appendLiteral(literal) {
        assert(literal != null);

        if (literal.length > 0) {
          if (literal.length === 1) {
            this._appendInternalPrinterParser(new CharLiteralPrinterParser(literal.charAt(0)));
          } else {
            this._appendInternalPrinterParser(new StringLiteralPrinterParser(literal));
          }
        }

        return this;
      };

      _proto._appendInternalPrinterParser = function _appendInternalPrinterParser(pp) {
        assert(pp != null);

        if (this._active._padNextWidth > 0) {
          if (pp != null) {
            pp = new PadPrinterParserDecorator(pp, this._active._padNextWidth, this._active._padNextChar);
          }

          this._active._padNextWidth = 0;
          this._active._padNextChar = 0;
        }

        this._active._printerParsers.push(pp);

        this._active._valueParserIndex = -1;
        return this._active._printerParsers.length - 1;
      };

      _proto.append = function append(formatter) {
        requireNonNull(formatter, 'formatter');

        this._appendInternal(formatter._toPrinterParser(false));

        return this;
      };

      _proto.toFormatter = function toFormatter(resolverStyle) {
        if (resolverStyle === void 0) {
          resolverStyle = ResolverStyle.SMART;
        }

        while (this._active._parent != null) {
          this.optionalEnd();
        }

        var pp = new CompositePrinterParser(this._printerParsers, false);
        return new DateTimeFormatter(pp, null, DecimalStyle.STANDARD, resolverStyle, null, null, null);
      };

      return DateTimeFormatterBuilder;
    }();
    var SECONDS_PER_10000_YEARS = 146097 * 25 * 86400;
    var SECONDS_0000_TO_1970 = (146097 * 5 - (30 * 365 + 7)) * 86400;

    var InstantPrinterParser = function () {
      function InstantPrinterParser(fractionalDigits) {
        this.fractionalDigits = fractionalDigits;
      }

      var _proto2 = InstantPrinterParser.prototype;

      _proto2.print = function print(context, buf) {
        var inSecs = context.getValue(ChronoField.INSTANT_SECONDS);
        var inNanos = 0;

        if (context.temporal().isSupported(ChronoField.NANO_OF_SECOND)) {
          inNanos = context.temporal().getLong(ChronoField.NANO_OF_SECOND);
        }

        if (inSecs == null) {
          return false;
        }

        var inSec = inSecs;
        var inNano = ChronoField.NANO_OF_SECOND.checkValidIntValue(inNanos);

        if (inSec >= -SECONDS_0000_TO_1970) {
          var zeroSecs = inSec - SECONDS_PER_10000_YEARS + SECONDS_0000_TO_1970;
          var hi = MathUtil.floorDiv(zeroSecs, SECONDS_PER_10000_YEARS) + 1;
          var lo = MathUtil.floorMod(zeroSecs, SECONDS_PER_10000_YEARS);
          var ldt = LocalDateTime.ofEpochSecond(lo - SECONDS_0000_TO_1970, 0, ZoneOffset.UTC);

          if (hi > 0) {
            buf.append('+').append(hi);
          }

          buf.append(ldt.toString());

          if (ldt.second() === 0) {
            buf.append(':00');
          }
        } else {
          var _zeroSecs = inSec + SECONDS_0000_TO_1970;

          var _hi = MathUtil.intDiv(_zeroSecs, SECONDS_PER_10000_YEARS);

          var _lo = MathUtil.intMod(_zeroSecs, SECONDS_PER_10000_YEARS);

          var _ldt = LocalDateTime.ofEpochSecond(_lo - SECONDS_0000_TO_1970, 0, ZoneOffset.UTC);

          var pos = buf.length();
          buf.append(_ldt.toString());

          if (_ldt.second() === 0) {
            buf.append(':00');
          }

          if (_hi < 0) {
            if (_ldt.year() === -10000) {
              buf.replace(pos, pos + 2, "" + (_hi - 1));
            } else if (_lo === 0) {
              buf.insert(pos, _hi);
            } else {
              buf.insert(pos + 1, Math.abs(_hi));
            }
          }
        }

        if (this.fractionalDigits === -2) {
          if (inNano !== 0) {
            buf.append('.');

            if (MathUtil.intMod(inNano, 1000000) === 0) {
              buf.append(("" + (MathUtil.intDiv(inNano, 1000000) + 1000)).substring(1));
            } else if (MathUtil.intMod(inNano, 1000) === 0) {
              buf.append(("" + (MathUtil.intDiv(inNano, 1000) + 1000000)).substring(1));
            } else {
              buf.append(("" + (inNano + 1000000000)).substring(1));
            }
          }
        } else if (this.fractionalDigits > 0 || this.fractionalDigits === -1 && inNano > 0) {
          buf.append('.');
          var div = 100000000;

          for (var i = 0; this.fractionalDigits === -1 && inNano > 0 || i < this.fractionalDigits; i++) {
            var digit = MathUtil.intDiv(inNano, div);
            buf.append(digit);
            inNano = inNano - digit * div;
            div = MathUtil.intDiv(div, 10);
          }
        }

        buf.append('Z');
        return true;
      };

      _proto2.parse = function parse(context, text, position) {
        var newContext = context.copy();
        var minDigits = this.fractionalDigits < 0 ? 0 : this.fractionalDigits;
        var maxDigits = this.fractionalDigits < 0 ? 9 : this.fractionalDigits;

        var parser = new DateTimeFormatterBuilder().append(DateTimeFormatter.ISO_LOCAL_DATE).appendLiteral('T').appendValue(ChronoField.HOUR_OF_DAY, 2).appendLiteral(':').appendValue(ChronoField.MINUTE_OF_HOUR, 2).appendLiteral(':').appendValue(ChronoField.SECOND_OF_MINUTE, 2).appendFraction(ChronoField.NANO_OF_SECOND, minDigits, maxDigits, true).appendLiteral('Z').toFormatter()._toPrinterParser(false);

        var pos = parser.parse(newContext, text, position);

        if (pos < 0) {
          return pos;
        }

        var yearParsed = newContext.getParsed(ChronoField.YEAR);
        var month = newContext.getParsed(ChronoField.MONTH_OF_YEAR);
        var day = newContext.getParsed(ChronoField.DAY_OF_MONTH);
        var hour = newContext.getParsed(ChronoField.HOUR_OF_DAY);
        var min = newContext.getParsed(ChronoField.MINUTE_OF_HOUR);
        var secVal = newContext.getParsed(ChronoField.SECOND_OF_MINUTE);
        var nanoVal = newContext.getParsed(ChronoField.NANO_OF_SECOND);
        var sec = secVal != null ? secVal : 0;
        var nano = nanoVal != null ? nanoVal : 0;
        var year = MathUtil.intMod(yearParsed, 10000);
        var days = 0;

        if (hour === 24 && min === 0 && sec === 0 && nano === 0) {
          hour = 0;
          days = 1;
        } else if (hour === 23 && min === 59 && sec === 60) {
          context.setParsedLeapSecond();
          sec = 59;
        }

        var instantSecs;

        try {
          var ldt = LocalDateTime.of(year, month, day, hour, min, sec, 0).plusDays(days);
          instantSecs = ldt.toEpochSecond(ZoneOffset.UTC);
          instantSecs += MathUtil.safeMultiply(MathUtil.intDiv(yearParsed, 10000), SECONDS_PER_10000_YEARS);
        } catch (ex) {
          return ~position;
        }

        var successPos = pos;
        successPos = context.setParsedField(ChronoField.INSTANT_SECONDS, instantSecs, position, successPos);
        return context.setParsedField(ChronoField.NANO_OF_SECOND, nano, position, successPos);
      };

      _proto2.toString = function toString() {
        return 'Instant()';
      };

      return InstantPrinterParser;
    }();

    function _init$e() {
      ReducedPrinterParser.BASE_DATE = LocalDate.of(2000, 1, 1);
      DateTimeFormatterBuilder.CompositePrinterParser = CompositePrinterParser;
      DateTimeFormatterBuilder.PadPrinterParserDecorator = PadPrinterParserDecorator;
      DateTimeFormatterBuilder.SettingsParser = SettingsParser;
      DateTimeFormatterBuilder.CharLiteralPrinterParser = StringLiteralPrinterParser;
      DateTimeFormatterBuilder.StringLiteralPrinterParser = StringLiteralPrinterParser;
      DateTimeFormatterBuilder.CharLiteralPrinterParser = CharLiteralPrinterParser;
      DateTimeFormatterBuilder.NumberPrinterParser = NumberPrinterParser;
      DateTimeFormatterBuilder.ReducedPrinterParser = ReducedPrinterParser;
      DateTimeFormatterBuilder.FractionPrinterParser = FractionPrinterParser;
      DateTimeFormatterBuilder.OffsetIdPrinterParser = OffsetIdPrinterParser;
      DateTimeFormatterBuilder.ZoneIdPrinterParser = ZoneIdPrinterParser;
    }

    /*
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var StringBuilder = function () {
      function StringBuilder() {
        this._str = '';
      }

      var _proto = StringBuilder.prototype;

      _proto.append = function append(str) {
        this._str += str;
        return this;
      };

      _proto.appendChar = function appendChar(str) {
        this._str += str[0];
        return this;
      };

      _proto.insert = function insert(offset, str) {
        this._str = this._str.slice(0, offset) + str + this._str.slice(offset);
        return this;
      };

      _proto.replace = function replace(start, end, str) {
        this._str = this._str.slice(0, start) + str + this._str.slice(end);
        return this;
      };

      _proto.length = function length() {
        return this._str.length;
      };

      _proto.setLength = function setLength(length) {
        this._str = this._str.slice(0, length);
        return this;
      };

      _proto.toString = function toString() {
        return this._str;
      };

      return StringBuilder;
    }();

    /**
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var DateTimeFormatter = function () {
      DateTimeFormatter.parsedExcessDays = function parsedExcessDays() {
        return DateTimeFormatter.PARSED_EXCESS_DAYS;
      };

      DateTimeFormatter.parsedLeapSecond = function parsedLeapSecond() {
        return DateTimeFormatter.PARSED_LEAP_SECOND;
      };

      DateTimeFormatter.ofPattern = function ofPattern(pattern) {
        return new DateTimeFormatterBuilder().appendPattern(pattern).toFormatter();
      };

      function DateTimeFormatter(printerParser, locale, decimalStyle, resolverStyle, resolverFields, chrono, zone) {
        if (chrono === void 0) {
          chrono = IsoChronology.INSTANCE;
        }

        assert(printerParser != null);
        assert(decimalStyle != null);
        assert(resolverStyle != null);
        this._printerParser = printerParser;
        this._locale = locale;
        this._decimalStyle = decimalStyle;
        this._resolverStyle = resolverStyle;
        this._resolverFields = resolverFields;
        this._chrono = chrono;
        this._zone = zone;
      }

      var _proto = DateTimeFormatter.prototype;

      _proto.locale = function locale() {
        return this._locale;
      };

      _proto.decimalStyle = function decimalStyle() {
        return this._decimalStyle;
      };

      _proto.chronology = function chronology() {
        return this._chrono;
      };

      _proto.withChronology = function withChronology(chrono) {
        if (this._chrono != null && this._chrono.equals(chrono)) {
          return this;
        }

        return new DateTimeFormatter(this._printerParser, this._locale, this._decimalStyle, this._resolverStyle, this._resolverFields, chrono, this._zone);
      };

      _proto.withLocale = function withLocale() {
        return this;
      };

      _proto.withResolverStyle = function withResolverStyle(resolverStyle) {
        requireNonNull(resolverStyle, 'resolverStyle');

        if (resolverStyle.equals(this._resolverStyle)) {
          return this;
        }

        return new DateTimeFormatter(this._printerParser, this._locale, this._decimalStyle, resolverStyle, this._resolverFields, this._chrono, this._zone);
      };

      _proto.format = function format(temporal) {
        var buf = new StringBuilder(32);

        this._formatTo(temporal, buf);

        return buf.toString();
      };

      _proto._formatTo = function _formatTo(temporal, appendable) {
        requireNonNull(temporal, 'temporal');
        requireNonNull(appendable, 'appendable');
        var context = new DateTimePrintContext(temporal, this);

        this._printerParser.print(context, appendable);
      };

      _proto.parse = function parse(text, type) {
        if (arguments.length === 1) {
          return this.parse1(text);
        } else {
          return this.parse2(text, type);
        }
      };

      _proto.parse1 = function parse1(text) {
        requireNonNull(text, 'text');

        try {
          return this._parseToBuilder(text, null).resolve(this._resolverStyle, this._resolverFields);
        } catch (ex) {
          if (ex instanceof DateTimeParseException) {
            throw ex;
          } else {
            throw this._createError(text, ex);
          }
        }
      };

      _proto.parse2 = function parse2(text, type) {
        requireNonNull(text, 'text');
        requireNonNull(type, 'type');

        try {
          var builder = this._parseToBuilder(text, null).resolve(this._resolverStyle, this._resolverFields);

          return builder.build(type);
        } catch (ex) {
          if (ex instanceof DateTimeParseException) {
            throw ex;
          } else {
            throw this._createError(text, ex);
          }
        }
      };

      _proto._createError = function _createError(text, ex) {
        var abbr = '';

        if (text.length > 64) {
          abbr = text.substring(0, 64) + "...";
        } else {
          abbr = text;
        }

        return new DateTimeParseException("Text '" + abbr + "' could not be parsed: " + ex.message, text, 0, ex);
      };

      _proto._parseToBuilder = function _parseToBuilder(text, position) {
        var pos = position != null ? position : new ParsePosition(0);

        var result = this._parseUnresolved0(text, pos);

        if (result == null || pos.getErrorIndex() >= 0 || position == null && pos.getIndex() < text.length) {
          var abbr = '';

          if (text.length > 64) {
            abbr = text.substr(0, 64).toString() + "...";
          } else {
            abbr = text;
          }

          if (pos.getErrorIndex() >= 0) {
            throw new DateTimeParseException("Text '" + abbr + "' could not be parsed at index " + pos.getErrorIndex(), text, pos.getErrorIndex());
          } else {
            throw new DateTimeParseException("Text '" + abbr + "' could not be parsed, unparsed text found at index " + pos.getIndex(), text, pos.getIndex());
          }
        }

        return result.toBuilder();
      };

      _proto.parseUnresolved = function parseUnresolved(text, position) {
        return this._parseUnresolved0(text, position);
      };

      _proto._parseUnresolved0 = function _parseUnresolved0(text, position) {
        assert(text != null, 'text', NullPointerException);
        assert(position != null, 'position', NullPointerException);
        var context = new DateTimeParseContext(this);
        var pos = position.getIndex();
        pos = this._printerParser.parse(context, text, pos);

        if (pos < 0) {
          position.setErrorIndex(~pos);
          return null;
        }

        position.setIndex(pos);
        return context.toParsed();
      };

      _proto._toPrinterParser = function _toPrinterParser(optional) {
        return this._printerParser.withOptional(optional);
      };

      _proto.toString = function toString() {
        var pattern = this._printerParser.toString();

        return pattern.indexOf('[') === 0 ? pattern : pattern.substring(1, pattern.length - 1);
      };

      return DateTimeFormatter;
    }();
    function _init$d() {
      DateTimeFormatter.ISO_LOCAL_DATE = new DateTimeFormatterBuilder().appendValue(ChronoField.YEAR, 4, 10, SignStyle.EXCEEDS_PAD).appendLiteral('-').appendValue(ChronoField.MONTH_OF_YEAR, 2).appendLiteral('-').appendValue(ChronoField.DAY_OF_MONTH, 2).toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
      DateTimeFormatter.ISO_LOCAL_TIME = new DateTimeFormatterBuilder().appendValue(ChronoField.HOUR_OF_DAY, 2).appendLiteral(':').appendValue(ChronoField.MINUTE_OF_HOUR, 2).optionalStart().appendLiteral(':').appendValue(ChronoField.SECOND_OF_MINUTE, 2).optionalStart().appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true).toFormatter(ResolverStyle.STRICT);
      DateTimeFormatter.ISO_LOCAL_DATE_TIME = new DateTimeFormatterBuilder().parseCaseInsensitive().append(DateTimeFormatter.ISO_LOCAL_DATE).appendLiteral('T').append(DateTimeFormatter.ISO_LOCAL_TIME).toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
      DateTimeFormatter.ISO_INSTANT = new DateTimeFormatterBuilder().parseCaseInsensitive().appendInstant().toFormatter(ResolverStyle.STRICT);
      DateTimeFormatter.ISO_OFFSET_DATE_TIME = new DateTimeFormatterBuilder().parseCaseInsensitive().append(DateTimeFormatter.ISO_LOCAL_DATE_TIME).appendOffsetId().toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
      DateTimeFormatter.ISO_ZONED_DATE_TIME = new DateTimeFormatterBuilder().append(DateTimeFormatter.ISO_OFFSET_DATE_TIME).optionalStart().appendLiteral('[').parseCaseSensitive().appendZoneId().appendLiteral(']').toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
      DateTimeFormatter.BASIC_ISO_DATE = new DateTimeFormatterBuilder().appendValue(ChronoField.YEAR, 4, 10, SignStyle.EXCEEDS_PAD).appendValue(ChronoField.MONTH_OF_YEAR, 2).appendValue(ChronoField.DAY_OF_MONTH, 2).toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
      DateTimeFormatter.ISO_OFFSET_DATE = new DateTimeFormatterBuilder().parseCaseInsensitive().append(DateTimeFormatter.ISO_LOCAL_DATE).appendOffsetId().toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
      DateTimeFormatter.ISO_OFFSET_TIME = new DateTimeFormatterBuilder().parseCaseInsensitive().append(DateTimeFormatter.ISO_LOCAL_TIME).appendOffsetId().toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
      DateTimeFormatter.ISO_ORDINAL_DATE = new DateTimeFormatterBuilder().appendValue(ChronoField.YEAR, 4, 10, SignStyle.EXCEEDS_PAD).appendLiteral('-').appendValue(ChronoField.DAY_OF_YEAR).toFormatter(ResolverStyle.STRICT);
      DateTimeFormatter.ISO_WEEK_DATE = new DateTimeFormatterBuilder().appendValue(ChronoField.YEAR, 4, 10, SignStyle.EXCEEDS_PAD).appendLiteral('-W').appendValue(ChronoField.ALIGNED_WEEK_OF_YEAR).appendLiteral('-').appendValue(ChronoField.DAY_OF_WEEK).toFormatter(ResolverStyle.STRICT);
      DateTimeFormatter.ISO_DATE = new DateTimeFormatterBuilder().parseCaseInsensitive().append(DateTimeFormatter.ISO_LOCAL_DATE).optionalStart().appendOffsetId().optionalEnd().toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
      DateTimeFormatter.ISO_TIME = new DateTimeFormatterBuilder().parseCaseInsensitive().append(DateTimeFormatter.ISO_LOCAL_TIME).optionalStart().appendOffsetId().optionalEnd().toFormatter(ResolverStyle.STRICT);
      DateTimeFormatter.ISO_DATE_TIME = new DateTimeFormatterBuilder().append(DateTimeFormatter.ISO_LOCAL_DATE_TIME).optionalStart().appendOffsetId().optionalEnd().toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
      DateTimeFormatter.PARSED_EXCESS_DAYS = createTemporalQuery('PARSED_EXCESS_DAYS', function (temporal) {
        if (temporal instanceof DateTimeBuilder) {
          return temporal.excessDays;
        } else {
          return Period.ZERO;
        }
      });
      DateTimeFormatter.PARSED_LEAP_SECOND = createTemporalQuery('PARSED_LEAP_SECOND', function (temporal) {
        if (temporal instanceof DateTimeBuilder) {
          return temporal.leapSecond;
        } else {
          return false;
        }
      });
    }

    var MonthDay = function (_TemporalAccessor) {
      _inheritsLoose(MonthDay, _TemporalAccessor);

      MonthDay.now = function now(zoneIdOrClock) {
        if (arguments.length === 0) {
          return MonthDay.now0();
        } else if (arguments.length === 1 && zoneIdOrClock instanceof ZoneId) {
          return MonthDay.nowZoneId(zoneIdOrClock);
        } else {
          return MonthDay.nowClock(zoneIdOrClock);
        }
      };

      MonthDay.now0 = function now0() {
        return this.nowClock(Clock.systemDefaultZone());
      };

      MonthDay.nowZoneId = function nowZoneId(zone) {
        requireNonNull(zone, 'zone');
        return this.nowClock(Clock.system(zone));
      };

      MonthDay.nowClock = function nowClock(clock) {
        requireNonNull(clock, 'clock');
        var now = LocalDate.now(clock);
        return MonthDay.of(now.month(), now.dayOfMonth());
      };

      MonthDay.of = function of(monthOrNumber, number) {
        if (arguments.length === 2 && monthOrNumber instanceof Month) {
          return MonthDay.ofMonthNumber(monthOrNumber, number);
        } else {
          return MonthDay.ofNumberNumber(monthOrNumber, number);
        }
      };

      MonthDay.ofMonthNumber = function ofMonthNumber(month, dayOfMonth) {
        requireNonNull(month, 'month');
        ChronoField.DAY_OF_MONTH.checkValidValue(dayOfMonth);

        if (dayOfMonth > month.maxLength()) {
          throw new DateTimeException("Illegal value for DayOfMonth field, value " + dayOfMonth + " is not valid for month " + month.toString());
        }

        return new MonthDay(month.value(), dayOfMonth);
      };

      MonthDay.ofNumberNumber = function ofNumberNumber(month, dayOfMonth) {
        requireNonNull(month, 'month');
        requireNonNull(dayOfMonth, 'dayOfMonth');
        return MonthDay.of(Month.of(month), dayOfMonth);
      };

      MonthDay.from = function from(temporal) {
        requireNonNull(temporal, 'temporal');
        requireInstance(temporal, TemporalAccessor, 'temporal');

        if (temporal instanceof MonthDay) {
          return temporal;
        }

        try {
          return MonthDay.of(temporal.get(ChronoField.MONTH_OF_YEAR), temporal.get(ChronoField.DAY_OF_MONTH));
        } catch (ex) {
          throw new DateTimeException("Unable to obtain MonthDay from TemporalAccessor: " + temporal + ", type " + (temporal && temporal.constructor != null ? temporal.constructor.name : ''));
        }
      };

      MonthDay.parse = function parse(text, formatter) {
        if (arguments.length === 1) {
          return MonthDay.parseString(text);
        } else {
          return MonthDay.parseStringFormatter(text, formatter);
        }
      };

      MonthDay.parseString = function parseString(text) {
        return MonthDay.parseStringFormatter(text, PARSER$2);
      };

      MonthDay.parseStringFormatter = function parseStringFormatter(text, formatter) {
        requireNonNull(text, 'text');
        requireNonNull(formatter, 'formatter');
        requireInstance(formatter, DateTimeFormatter, 'formatter');
        return formatter.parse(text, MonthDay.FROM);
      };

      function MonthDay(month, dayOfMonth) {
        var _this;

        _this = _TemporalAccessor.call(this) || this;
        _this._month = MathUtil.safeToInt(month);
        _this._day = MathUtil.safeToInt(dayOfMonth);
        return _this;
      }

      var _proto = MonthDay.prototype;

      _proto.monthValue = function monthValue() {
        return this._month;
      };

      _proto.month = function month() {
        return Month.of(this._month);
      };

      _proto.dayOfMonth = function dayOfMonth() {
        return this._day;
      };

      _proto.isSupported = function isSupported(field) {
        if (field instanceof ChronoField) {
          return field === ChronoField.MONTH_OF_YEAR || field === ChronoField.DAY_OF_MONTH;
        }

        return field != null && field.isSupportedBy(this);
      };

      _proto.range = function range(field) {
        if (field === ChronoField.MONTH_OF_YEAR) {
          return field.range();
        } else if (field === ChronoField.DAY_OF_MONTH) {
          return ValueRange.of(1, this.month().minLength(), this.month().maxLength());
        }

        return _TemporalAccessor.prototype.range.call(this, field);
      };

      _proto.get = function get(field) {
        return this.range(field).checkValidIntValue(this.getLong(field), field);
      };

      _proto.getLong = function getLong(field) {
        requireNonNull(field, 'field');

        if (field instanceof ChronoField) {
          switch (field) {
            case ChronoField.DAY_OF_MONTH:
              return this._day;

            case ChronoField.MONTH_OF_YEAR:
              return this._month;
          }

          throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
        }

        return field.getFrom(this);
      };

      _proto.isValidYear = function isValidYear(year) {
        return (this._day === 29 && this._month === 2 && Year.isLeap(year) === false) === false;
      };

      _proto.withMonth = function withMonth(month) {
        return this.with(Month.of(month));
      };

      _proto.with = function _with(month) {
        requireNonNull(month, 'month');

        if (month.value() === this._month) {
          return this;
        }

        var day = Math.min(this._day, month.maxLength());
        return new MonthDay(month.value(), day);
      };

      _proto.withDayOfMonth = function withDayOfMonth(dayOfMonth) {
        if (dayOfMonth === this._day) {
          return this;
        }

        return MonthDay.of(this._month, dayOfMonth);
      };

      _proto.query = function query(_query) {
        requireNonNull(_query, 'query');
        requireInstance(_query, TemporalQuery, 'query');

        if (_query === TemporalQueries.chronology()) {
          return IsoChronology.INSTANCE;
        }

        return _TemporalAccessor.prototype.query.call(this, _query);
      };

      _proto.adjustInto = function adjustInto(temporal) {
        requireNonNull(temporal, 'temporal');
        temporal = temporal.with(ChronoField.MONTH_OF_YEAR, this._month);
        return temporal.with(ChronoField.DAY_OF_MONTH, Math.min(temporal.range(ChronoField.DAY_OF_MONTH).maximum(), this._day));
      };

      _proto.atYear = function atYear(year) {
        return LocalDate.of(year, this._month, this.isValidYear(year) ? this._day : 28);
      };

      _proto.compareTo = function compareTo(other) {
        requireNonNull(other, 'other');
        requireInstance(other, MonthDay, 'other');
        var cmp = this._month - other.monthValue();

        if (cmp === 0) {
          cmp = this._day - other.dayOfMonth();
        }

        return cmp;
      };

      _proto.isAfter = function isAfter(other) {
        requireNonNull(other, 'other');
        requireInstance(other, MonthDay, 'other');
        return this.compareTo(other) > 0;
      };

      _proto.isBefore = function isBefore(other) {
        requireNonNull(other, 'other');
        requireInstance(other, MonthDay, 'other');
        return this.compareTo(other) < 0;
      };

      _proto.equals = function equals(obj) {
        if (this === obj) {
          return true;
        }

        if (obj instanceof MonthDay) {
          var other = obj;
          return this.monthValue() === other.monthValue() && this.dayOfMonth() === other.dayOfMonth();
        }

        return false;
      };

      _proto.toString = function toString() {
        return "--" + (this._month < 10 ? '0' : '') + this._month + (this._day < 10 ? '-0' : '-') + this._day;
      };

      _proto.toJSON = function toJSON() {
        return this.toString();
      };

      _proto.format = function format(formatter) {
        requireNonNull(formatter, 'formatter');
        requireInstance(formatter, DateTimeFormatter, 'formatter');
        return formatter.format(this);
      };

      return MonthDay;
    }(TemporalAccessor);
    var PARSER$2;
    function _init$c() {
      PARSER$2 = new DateTimeFormatterBuilder().appendLiteral('--').appendValue(ChronoField.MONTH_OF_YEAR, 2).appendLiteral('-').appendValue(ChronoField.DAY_OF_MONTH, 2).toFormatter();
      MonthDay.FROM = createTemporalQuery('MonthDay.FROM', function (temporal) {
        return MonthDay.from(temporal);
      });
    }

    var YearMonth = function (_Temporal) {
      _inheritsLoose(YearMonth, _Temporal);

      YearMonth.now = function now(zoneIdOrClock) {
        if (arguments.length === 0) {
          return YearMonth.now0();
        } else if (arguments.length === 1 && zoneIdOrClock instanceof ZoneId) {
          return YearMonth.nowZoneId(zoneIdOrClock);
        } else {
          return YearMonth.nowClock(zoneIdOrClock);
        }
      };

      YearMonth.now0 = function now0() {
        return YearMonth.nowClock(Clock.systemDefaultZone());
      };

      YearMonth.nowZoneId = function nowZoneId(zone) {
        return YearMonth.nowClock(Clock.system(zone));
      };

      YearMonth.nowClock = function nowClock(clock) {
        var now = LocalDate.now(clock);
        return YearMonth.of(now.year(), now.month());
      };

      YearMonth.of = function of(year, monthOrNumber) {
        if (arguments.length === 2 && monthOrNumber instanceof Month) {
          return YearMonth.ofNumberMonth(year, monthOrNumber);
        } else {
          return YearMonth.ofNumberNumber(year, monthOrNumber);
        }
      };

      YearMonth.ofNumberMonth = function ofNumberMonth(year, month) {
        requireNonNull(month, 'month');
        requireInstance(month, Month, 'month');
        return YearMonth.ofNumberNumber(year, month.value());
      };

      YearMonth.ofNumberNumber = function ofNumberNumber(year, month) {
        requireNonNull(year, 'year');
        requireNonNull(month, 'month');
        ChronoField.YEAR.checkValidValue(year);
        ChronoField.MONTH_OF_YEAR.checkValidValue(month);
        return new YearMonth(year, month);
      };

      YearMonth.from = function from(temporal) {
        requireNonNull(temporal, 'temporal');

        if (temporal instanceof YearMonth) {
          return temporal;
        }

        try {
          return YearMonth.of(temporal.get(ChronoField.YEAR), temporal.get(ChronoField.MONTH_OF_YEAR));
        } catch (ex) {
          throw new DateTimeException("Unable to obtain YearMonth from TemporalAccessor: " + temporal + ", type " + (temporal && temporal.constructor != null ? temporal.constructor.name : ''));
        }
      };

      YearMonth.parse = function parse(text, formatter) {
        if (arguments.length === 1) {
          return YearMonth.parseString(text);
        } else {
          return YearMonth.parseStringFormatter(text, formatter);
        }
      };

      YearMonth.parseString = function parseString(text) {
        return YearMonth.parseStringFormatter(text, PARSER$1);
      };

      YearMonth.parseStringFormatter = function parseStringFormatter(text, formatter) {
        requireNonNull(formatter, 'formatter');
        return formatter.parse(text, YearMonth.FROM);
      };

      function YearMonth(year, month) {
        var _this;

        _this = _Temporal.call(this) || this;
        _this._year = MathUtil.safeToInt(year);
        _this._month = MathUtil.safeToInt(month);
        return _this;
      }

      var _proto = YearMonth.prototype;

      _proto.isSupported = function isSupported(fieldOrUnit) {
        if (arguments.length === 1 && fieldOrUnit instanceof TemporalField) {
          return this.isSupportedField(fieldOrUnit);
        } else {
          return this.isSupportedUnit(fieldOrUnit);
        }
      };

      _proto.isSupportedField = function isSupportedField(field) {
        if (field instanceof ChronoField) {
          return field === ChronoField.YEAR || field === ChronoField.MONTH_OF_YEAR || field === ChronoField.PROLEPTIC_MONTH || field === ChronoField.YEAR_OF_ERA || field === ChronoField.ERA;
        }

        return field != null && field.isSupportedBy(this);
      };

      _proto.isSupportedUnit = function isSupportedUnit(unit) {
        if (unit instanceof ChronoUnit) {
          return unit === ChronoUnit.MONTHS || unit === ChronoUnit.YEARS || unit === ChronoUnit.DECADES || unit === ChronoUnit.CENTURIES || unit === ChronoUnit.MILLENNIA || unit === ChronoUnit.ERAS;
        }

        return unit != null && unit.isSupportedBy(this);
      };

      _proto.range = function range(field) {
        if (field === ChronoField.YEAR_OF_ERA) {
          return this.year() <= 0 ? ValueRange.of(1, Year.MAX_VALUE + 1) : ValueRange.of(1, Year.MAX_VALUE);
        }

        return _Temporal.prototype.range.call(this, field);
      };

      _proto.get = function get(field) {
        requireNonNull(field, 'field');
        requireInstance(field, TemporalField, 'field');
        return this.range(field).checkValidIntValue(this.getLong(field), field);
      };

      _proto.getLong = function getLong(field) {
        requireNonNull(field, 'field');
        requireInstance(field, TemporalField, 'field');

        if (field instanceof ChronoField) {
          switch (field) {
            case ChronoField.MONTH_OF_YEAR:
              return this._month;

            case ChronoField.PROLEPTIC_MONTH:
              return this._getProlepticMonth();

            case ChronoField.YEAR_OF_ERA:
              return this._year < 1 ? 1 - this._year : this._year;

            case ChronoField.YEAR:
              return this._year;

            case ChronoField.ERA:
              return this._year < 1 ? 0 : 1;
          }

          throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
        }

        return field.getFrom(this);
      };

      _proto._getProlepticMonth = function _getProlepticMonth() {
        return MathUtil.safeAdd(MathUtil.safeMultiply(this._year, 12), this._month - 1);
      };

      _proto.year = function year() {
        return this._year;
      };

      _proto.monthValue = function monthValue() {
        return this._month;
      };

      _proto.month = function month() {
        return Month.of(this._month);
      };

      _proto.isLeapYear = function isLeapYear() {
        return IsoChronology.isLeapYear(this._year);
      };

      _proto.isValidDay = function isValidDay(dayOfMonth) {
        return dayOfMonth >= 1 && dayOfMonth <= this.lengthOfMonth();
      };

      _proto.lengthOfMonth = function lengthOfMonth() {
        return this.month().length(this.isLeapYear());
      };

      _proto.lengthOfYear = function lengthOfYear() {
        return this.isLeapYear() ? 366 : 365;
      };

      _proto.with = function _with(adjusterOrField, value) {
        if (arguments.length === 1) {
          return this._withAdjuster(adjusterOrField);
        } else {
          return this._withField(adjusterOrField, value);
        }
      };

      _proto._withField = function _withField(field, newValue) {
        requireNonNull(field, 'field');
        requireInstance(field, TemporalField, 'field');

        if (field instanceof ChronoField) {
          var f = field;
          f.checkValidValue(newValue);

          switch (f) {
            case ChronoField.MONTH_OF_YEAR:
              return this.withMonth(newValue);

            case ChronoField.PROLEPTIC_MONTH:
              return this.plusMonths(newValue - this.getLong(ChronoField.PROLEPTIC_MONTH));

            case ChronoField.YEAR_OF_ERA:
              return this.withYear(this._year < 1 ? 1 - newValue : newValue);

            case ChronoField.YEAR:
              return this.withYear(newValue);

            case ChronoField.ERA:
              return this.getLong(ChronoField.ERA) === newValue ? this : this.withYear(1 - this._year);
          }

          throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
        }

        return field.adjustInto(this, newValue);
      };

      _proto.withYear = function withYear(year) {
        ChronoField.YEAR.checkValidValue(year);
        return new YearMonth(year, this._month);
      };

      _proto.withMonth = function withMonth(month) {
        ChronoField.MONTH_OF_YEAR.checkValidValue(month);
        return new YearMonth(this._year, month);
      };

      _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
        requireNonNull(unit, 'unit');
        requireInstance(unit, TemporalUnit, 'unit');

        if (unit instanceof ChronoUnit) {
          switch (unit) {
            case ChronoUnit.MONTHS:
              return this.plusMonths(amountToAdd);

            case ChronoUnit.YEARS:
              return this.plusYears(amountToAdd);

            case ChronoUnit.DECADES:
              return this.plusYears(MathUtil.safeMultiply(amountToAdd, 10));

            case ChronoUnit.CENTURIES:
              return this.plusYears(MathUtil.safeMultiply(amountToAdd, 100));

            case ChronoUnit.MILLENNIA:
              return this.plusYears(MathUtil.safeMultiply(amountToAdd, 1000));

            case ChronoUnit.ERAS:
              return this.with(ChronoField.ERA, MathUtil.safeAdd(this.getLong(ChronoField.ERA), amountToAdd));
          }

          throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
        }

        return unit.addTo(this, amountToAdd);
      };

      _proto.plusYears = function plusYears(yearsToAdd) {
        if (yearsToAdd === 0) {
          return this;
        }

        var newYear = ChronoField.YEAR.checkValidIntValue(this._year + yearsToAdd);
        return this.withYear(newYear);
      };

      _proto.plusMonths = function plusMonths(monthsToAdd) {
        if (monthsToAdd === 0) {
          return this;
        }

        var monthCount = this._year * 12 + (this._month - 1);
        var calcMonths = monthCount + monthsToAdd;
        var newYear = ChronoField.YEAR.checkValidIntValue(MathUtil.floorDiv(calcMonths, 12));
        var newMonth = MathUtil.floorMod(calcMonths, 12) + 1;
        return new YearMonth(newYear, newMonth);
      };

      _proto.minusYears = function minusYears(yearsToSubtract) {
        return yearsToSubtract === MathUtil.MIN_SAFE_INTEGER ? this.plusYears(MathUtil.MIN_SAFE_INTEGER).plusYears(1) : this.plusYears(-yearsToSubtract);
      };

      _proto.minusMonths = function minusMonths(monthsToSubtract) {
        return monthsToSubtract === MathUtil.MIN_SAFE_INTEGER ? this.plusMonths(Math.MAX_SAFE_INTEGER).plusMonths(1) : this.plusMonths(-monthsToSubtract);
      };

      _proto.query = function query(_query) {
        requireNonNull(_query, 'query');
        requireInstance(_query, TemporalQuery, 'query');

        if (_query === TemporalQueries.chronology()) {
          return IsoChronology.INSTANCE;
        } else if (_query === TemporalQueries.precision()) {
          return ChronoUnit.MONTHS;
        } else if (_query === TemporalQueries.localDate() || _query === TemporalQueries.localTime() || _query === TemporalQueries.zone() || _query === TemporalQueries.zoneId() || _query === TemporalQueries.offset()) {
          return null;
        }

        return _Temporal.prototype.query.call(this, _query);
      };

      _proto.adjustInto = function adjustInto(temporal) {
        requireNonNull(temporal, 'temporal');
        requireInstance(temporal, Temporal, 'temporal');
        return temporal.with(ChronoField.PROLEPTIC_MONTH, this._getProlepticMonth());
      };

      _proto.until = function until(endExclusive, unit) {
        requireNonNull(endExclusive, 'endExclusive');
        requireNonNull(unit, 'unit');
        requireInstance(endExclusive, Temporal, 'endExclusive');
        requireInstance(unit, TemporalUnit, 'unit');
        var end = YearMonth.from(endExclusive);

        if (unit instanceof ChronoUnit) {
          var monthsUntil = end._getProlepticMonth() - this._getProlepticMonth();

          switch (unit) {
            case ChronoUnit.MONTHS:
              return monthsUntil;

            case ChronoUnit.YEARS:
              return monthsUntil / 12;

            case ChronoUnit.DECADES:
              return monthsUntil / 120;

            case ChronoUnit.CENTURIES:
              return monthsUntil / 1200;

            case ChronoUnit.MILLENNIA:
              return monthsUntil / 12000;

            case ChronoUnit.ERAS:
              return end.getLong(ChronoField.ERA) - this.getLong(ChronoField.ERA);
          }

          throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
        }

        return unit.between(this, end);
      };

      _proto.atDay = function atDay(dayOfMonth) {
        return LocalDate.of(this._year, this._month, dayOfMonth);
      };

      _proto.atEndOfMonth = function atEndOfMonth() {
        return LocalDate.of(this._year, this._month, this.lengthOfMonth());
      };

      _proto.compareTo = function compareTo(other) {
        requireNonNull(other, 'other');
        requireInstance(other, YearMonth, 'other');
        var cmp = this._year - other.year();

        if (cmp === 0) {
          cmp = this._month - other.monthValue();
        }

        return cmp;
      };

      _proto.isAfter = function isAfter(other) {
        return this.compareTo(other) > 0;
      };

      _proto.isBefore = function isBefore(other) {
        return this.compareTo(other) < 0;
      };

      _proto.equals = function equals(obj) {
        if (this === obj) {
          return true;
        }

        if (obj instanceof YearMonth) {
          var other = obj;
          return this.year() === other.year() && this.monthValue() === other.monthValue();
        }

        return false;
      };

      _proto.toString = function toString() {
        return PARSER$1.format(this);
      };

      _proto.toJSON = function toJSON() {
        return this.toString();
      };

      _proto.format = function format(formatter) {
        requireNonNull(formatter, 'formatter');
        return formatter.format(this);
      };

      return YearMonth;
    }(Temporal);
    var PARSER$1;
    function _init$b() {
      PARSER$1 = new DateTimeFormatterBuilder().appendValue(ChronoField.YEAR, 4, 10, SignStyle.EXCEEDS_PAD).appendLiteral('-').appendValue(ChronoField.MONTH_OF_YEAR, 2).toFormatter();
      YearMonth.FROM = createTemporalQuery('YearMonth.FROM', function (temporal) {
        return YearMonth.from(temporal);
      });
    }

    var Year = function (_Temporal) {
      _inheritsLoose(Year, _Temporal);

      function Year(value) {
        var _this;

        _this = _Temporal.call(this) || this;
        _this._year = MathUtil.safeToInt(value);
        return _this;
      }

      var _proto = Year.prototype;

      _proto.value = function value() {
        return this._year;
      };

      Year.now = function now(zoneIdOrClock) {
        if (zoneIdOrClock === void 0) {
          zoneIdOrClock = undefined;
        }

        if (zoneIdOrClock === undefined) {
          return Year.now0();
        } else if (zoneIdOrClock instanceof ZoneId) {
          return Year.nowZoneId(zoneIdOrClock);
        } else {
          return Year.nowClock(zoneIdOrClock);
        }
      };

      Year.now0 = function now0() {
        return Year.nowClock(Clock.systemDefaultZone());
      };

      Year.nowZoneId = function nowZoneId(zone) {
        requireNonNull(zone, 'zone');
        requireInstance(zone, ZoneId, 'zone');
        return Year.nowClock(Clock.system(zone));
      };

      Year.nowClock = function nowClock(clock) {
        requireNonNull(clock, 'clock');
        requireInstance(clock, Clock, 'clock');
        var now = LocalDate.now(clock);
        return Year.of(now.year());
      };

      Year.of = function of(isoYear) {
        requireNonNull(isoYear, 'isoYear');
        ChronoField.YEAR.checkValidValue(isoYear);
        return new Year(isoYear);
      };

      Year.from = function from(temporal) {
        requireNonNull(temporal, 'temporal');
        requireInstance(temporal, TemporalAccessor, 'temporal');

        if (temporal instanceof Year) {
          return temporal;
        }

        try {
          return Year.of(temporal.get(ChronoField.YEAR));
        } catch (ex) {
          throw new DateTimeException("Unable to obtain Year from TemporalAccessor: " + temporal + ", type " + (temporal && temporal.constructor != null ? temporal.constructor.name : ''));
        }
      };

      Year.parse = function parse(text, formatter) {
        if (arguments.length <= 1) {
          return Year.parseText(text);
        } else {
          return Year.parseTextFormatter(text, formatter);
        }
      };

      Year.parseText = function parseText(text) {
        requireNonNull(text, 'text');
        return Year.parse(text, PARSER);
      };

      Year.parseTextFormatter = function parseTextFormatter(text, formatter) {
        if (formatter === void 0) {
          formatter = PARSER;
        }

        requireNonNull(text, 'text');
        requireNonNull(formatter, 'formatter');
        requireInstance(formatter, DateTimeFormatter, 'formatter');
        return formatter.parse(text, Year.FROM);
      };

      Year.isLeap = function isLeap(year) {
        return MathUtil.intMod(year, 4) === 0 && (MathUtil.intMod(year, 100) !== 0 || MathUtil.intMod(year, 400) === 0);
      };

      _proto.isSupported = function isSupported(fieldOrUnit) {
        if (arguments.length === 1 && fieldOrUnit instanceof TemporalField) {
          return this.isSupportedField(fieldOrUnit);
        } else {
          return this.isSupportedUnit(fieldOrUnit);
        }
      };

      _proto.isSupportedField = function isSupportedField(field) {
        if (field instanceof ChronoField) {
          return field === ChronoField.YEAR || field === ChronoField.YEAR_OF_ERA || field === ChronoField.ERA;
        }

        return field != null && field.isSupportedBy(this);
      };

      _proto.isSupportedUnit = function isSupportedUnit(unit) {
        if (unit instanceof ChronoUnit) {
          return unit === ChronoUnit.YEARS || unit === ChronoUnit.DECADES || unit === ChronoUnit.CENTURIES || unit === ChronoUnit.MILLENNIA || unit === ChronoUnit.ERAS;
        }

        return unit != null && unit.isSupportedBy(this);
      };

      _proto.range = function range(field) {
        if (this.isSupported(field)) {
          return field.range();
        } else if (field instanceof ChronoField) {
          throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
        }

        return _Temporal.prototype.range.call(this, field);
      };

      _proto.get = function get(field) {
        return this.range(field).checkValidIntValue(this.getLong(field), field);
      };

      _proto.getLong = function getLong(field) {
        requireNonNull(field, 'field');

        if (field instanceof ChronoField) {
          switch (field) {
            case ChronoField.YEAR_OF_ERA:
              return this._year < 1 ? 1 - this._year : this._year;

            case ChronoField.YEAR:
              return this._year;

            case ChronoField.ERA:
              return this._year < 1 ? 0 : 1;
          }

          throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
        }

        return field.getFrom(this);
      };

      _proto.isLeap = function isLeap() {
        return Year.isLeap(this._year);
      };

      _proto._withField = function _withField(field, newValue) {
        requireNonNull(field, 'field');
        requireInstance(field, TemporalField, 'field');

        if (field instanceof ChronoField) {
          field.checkValidValue(newValue);

          switch (field) {
            case ChronoField.YEAR_OF_ERA:
              return Year.of(this._year < 1 ? 1 - newValue : newValue);

            case ChronoField.YEAR:
              return Year.of(newValue);

            case ChronoField.ERA:
              return this.getLong(ChronoField.ERA) === newValue ? this : Year.of(1 - this._year);
          }

          throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
        }

        return field.adjustInto(this, newValue);
      };

      _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
        requireNonNull(amountToAdd, 'amountToAdd');
        requireNonNull(unit, 'unit');
        requireInstance(unit, TemporalUnit, 'unit');

        if (unit instanceof ChronoUnit) {
          switch (unit) {
            case ChronoUnit.YEARS:
              return this.plusYears(amountToAdd);

            case ChronoUnit.DECADES:
              return this.plusYears(MathUtil.safeMultiply(amountToAdd, 10));

            case ChronoUnit.CENTURIES:
              return this.plusYears(MathUtil.safeMultiply(amountToAdd, 100));

            case ChronoUnit.MILLENNIA:
              return this.plusYears(MathUtil.safeMultiply(amountToAdd, 1000));

            case ChronoUnit.ERAS:
              return this.with(ChronoField.ERA, MathUtil.safeAdd(this.getLong(ChronoField.ERA), amountToAdd));
          }

          throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
        }

        return unit.addTo(this, amountToAdd);
      };

      _proto.plusYears = function plusYears(yearsToAdd) {
        if (yearsToAdd === 0) {
          return this;
        }

        return Year.of(ChronoField.YEAR.checkValidIntValue(MathUtil.safeAdd(this._year, yearsToAdd)));
      };

      _proto.minusYears = function minusYears(yearsToSubtract) {
        return yearsToSubtract === MathUtil.MIN_SAFE_INTEGER ? this.plusYears(MathUtil.MAX_SAFE_INTEGER).plusYears(1) : this.plusYears(-yearsToSubtract);
      };

      _proto.adjustInto = function adjustInto(temporal) {
        requireNonNull(temporal, 'temporal');
        return temporal.with(ChronoField.YEAR, this._year);
      };

      _proto.isValidMonthDay = function isValidMonthDay(monthDay) {
        return monthDay != null && monthDay.isValidYear(this._year);
      };

      _proto.length = function length() {
        return this.isLeap() ? 366 : 365;
      };

      _proto.atDay = function atDay(dayOfYear) {
        return LocalDate.ofYearDay(this._year, dayOfYear);
      };

      _proto.atMonth = function atMonth(monthOrNumber) {
        if (arguments.length === 1 && monthOrNumber instanceof Month) {
          return this.atMonthMonth(monthOrNumber);
        } else {
          return this.atMonthNumber(monthOrNumber);
        }
      };

      _proto.atMonthMonth = function atMonthMonth(month) {
        requireNonNull(month, 'month');
        requireInstance(month, Month, 'month');
        return YearMonth.of(this._year, month);
      };

      _proto.atMonthNumber = function atMonthNumber(month) {
        requireNonNull(month, 'month');
        return YearMonth.of(this._year, month);
      };

      _proto.atMonthDay = function atMonthDay(monthDay) {
        requireNonNull(monthDay, 'monthDay');
        requireInstance(monthDay, MonthDay, 'monthDay');
        return monthDay.atYear(this._year);
      };

      _proto.query = function query(_query) {
        requireNonNull(_query, 'query()');
        requireInstance(_query, TemporalQuery, 'query()');

        if (_query === TemporalQueries.chronology()) {
          return IsoChronology.INSTANCE;
        } else if (_query === TemporalQueries.precision()) {
          return ChronoUnit.YEARS;
        } else if (_query === TemporalQueries.localDate() || _query === TemporalQueries.localTime() || _query === TemporalQueries.zone() || _query === TemporalQueries.zoneId() || _query === TemporalQueries.offset()) {
          return null;
        }

        return _Temporal.prototype.query.call(this, _query);
      };

      _proto.compareTo = function compareTo(other) {
        requireNonNull(other, 'other');
        requireInstance(other, Year, 'other');
        return this._year - other._year;
      };

      _proto.isAfter = function isAfter(other) {
        requireNonNull(other, 'other');
        requireInstance(other, Year, 'other');
        return this._year > other._year;
      };

      _proto.isBefore = function isBefore(other) {
        requireNonNull(other, 'other');
        requireInstance(other, Year, 'other');
        return this._year < other._year;
      };

      _proto.format = function format(formatter) {
        requireNonNull(formatter, 'formatter');
        requireInstance(formatter, DateTimeFormatter, 'formatter');
        return formatter.format(this);
      };

      _proto.equals = function equals(other) {
        if (this === other) {
          return true;
        }

        if (other instanceof Year) {
          return this.value() === other.value();
        }

        return false;
      };

      _proto.toString = function toString() {
        return "" + this._year;
      };

      _proto.toJSON = function toJSON() {
        return this.toString();
      };

      _proto.until = function until(endExclusive, unit) {
        var end = Year.from(endExclusive);

        if (unit instanceof ChronoUnit) {
          var yearsUntil = end.value() - this.value();

          switch (unit) {
            case ChronoUnit.YEARS:
              return yearsUntil;

            case ChronoUnit.DECADES:
              return MathUtil.intDiv(yearsUntil, 10);

            case ChronoUnit.CENTURIES:
              return MathUtil.intDiv(yearsUntil, 100);

            case ChronoUnit.MILLENNIA:
              return MathUtil.intDiv(yearsUntil, 1000);

            case ChronoUnit.ERAS:
              return end.getLong(ChronoField.ERA) - this.getLong(ChronoField.ERA);
          }

          throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
        }

        return unit.between(this, end);
      };

      return Year;
    }(Temporal);
    var PARSER;
    function _init$a() {
      Year.MIN_VALUE = YearConstants.MIN_VALUE;
      Year.MAX_VALUE = YearConstants.MAX_VALUE;
      PARSER = new DateTimeFormatterBuilder().appendValue(ChronoField.YEAR, 4, 10, SignStyle.EXCEEDS_PAD).toFormatter();
      Year.FROM = createTemporalQuery('Year.FROM', function (temporal) {
        return Year.from(temporal);
      });
    }

    /*
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var TemporalAdjuster = function () {
      function TemporalAdjuster() {}

      var _proto = TemporalAdjuster.prototype;

      _proto.adjustInto = function adjustInto(temporal) {
        abstractMethodFail('adjustInto');
      };

      return TemporalAdjuster;
    }();

    var TemporalAdjusters = function () {
      function TemporalAdjusters() {}

      TemporalAdjusters.firstDayOfMonth = function firstDayOfMonth() {
        return Impl.FIRST_DAY_OF_MONTH;
      };

      TemporalAdjusters.lastDayOfMonth = function lastDayOfMonth() {
        return Impl.LAST_DAY_OF_MONTH;
      };

      TemporalAdjusters.firstDayOfNextMonth = function firstDayOfNextMonth() {
        return Impl.FIRST_DAY_OF_NEXT_MONTH;
      };

      TemporalAdjusters.firstDayOfYear = function firstDayOfYear() {
        return Impl.FIRST_DAY_OF_YEAR;
      };

      TemporalAdjusters.lastDayOfYear = function lastDayOfYear() {
        return Impl.LAST_DAY_OF_YEAR;
      };

      TemporalAdjusters.firstDayOfNextYear = function firstDayOfNextYear() {
        return Impl.FIRST_DAY_OF_NEXT_YEAR;
      };

      TemporalAdjusters.firstInMonth = function firstInMonth(dayOfWeek) {
        requireNonNull(dayOfWeek, 'dayOfWeek');
        return new DayOfWeekInMonth(1, dayOfWeek);
      };

      TemporalAdjusters.lastInMonth = function lastInMonth(dayOfWeek) {
        requireNonNull(dayOfWeek, 'dayOfWeek');
        return new DayOfWeekInMonth(-1, dayOfWeek);
      };

      TemporalAdjusters.dayOfWeekInMonth = function dayOfWeekInMonth(ordinal, dayOfWeek) {
        requireNonNull(dayOfWeek, 'dayOfWeek');
        return new DayOfWeekInMonth(ordinal, dayOfWeek);
      };

      TemporalAdjusters.next = function next(dayOfWeek) {
        return new RelativeDayOfWeek(2, dayOfWeek);
      };

      TemporalAdjusters.nextOrSame = function nextOrSame(dayOfWeek) {
        return new RelativeDayOfWeek(0, dayOfWeek);
      };

      TemporalAdjusters.previous = function previous(dayOfWeek) {
        return new RelativeDayOfWeek(3, dayOfWeek);
      };

      TemporalAdjusters.previousOrSame = function previousOrSame(dayOfWeek) {
        return new RelativeDayOfWeek(1, dayOfWeek);
      };

      return TemporalAdjusters;
    }();

    var Impl = function (_TemporalAdjuster) {
      _inheritsLoose(Impl, _TemporalAdjuster);

      function Impl(ordinal) {
        var _this;

        _this = _TemporalAdjuster.call(this) || this;
        _this._ordinal = ordinal;
        return _this;
      }

      var _proto = Impl.prototype;

      _proto.adjustInto = function adjustInto(temporal) {
        switch (this._ordinal) {
          case 0:
            return temporal.with(ChronoField.DAY_OF_MONTH, 1);

          case 1:
            return temporal.with(ChronoField.DAY_OF_MONTH, temporal.range(ChronoField.DAY_OF_MONTH).maximum());

          case 2:
            return temporal.with(ChronoField.DAY_OF_MONTH, 1).plus(1, ChronoUnit.MONTHS);

          case 3:
            return temporal.with(ChronoField.DAY_OF_YEAR, 1);

          case 4:
            return temporal.with(ChronoField.DAY_OF_YEAR, temporal.range(ChronoField.DAY_OF_YEAR).maximum());

          case 5:
            return temporal.with(ChronoField.DAY_OF_YEAR, 1).plus(1, ChronoUnit.YEARS);
        }

        throw new IllegalStateException('Unreachable');
      };

      return Impl;
    }(TemporalAdjuster);

    Impl.FIRST_DAY_OF_MONTH = new Impl(0);
    Impl.LAST_DAY_OF_MONTH = new Impl(1);
    Impl.FIRST_DAY_OF_NEXT_MONTH = new Impl(2);
    Impl.FIRST_DAY_OF_YEAR = new Impl(3);
    Impl.LAST_DAY_OF_YEAR = new Impl(4);
    Impl.FIRST_DAY_OF_NEXT_YEAR = new Impl(5);

    var DayOfWeekInMonth = function (_TemporalAdjuster2) {
      _inheritsLoose(DayOfWeekInMonth, _TemporalAdjuster2);

      function DayOfWeekInMonth(ordinal, dow) {
        var _this2;

        _this2 = _TemporalAdjuster2.call(this) || this;
        _this2._ordinal = ordinal;
        _this2._dowValue = dow.value();
        return _this2;
      }

      var _proto2 = DayOfWeekInMonth.prototype;

      _proto2.adjustInto = function adjustInto(temporal) {
        if (this._ordinal >= 0) {
          var temp = temporal.with(ChronoField.DAY_OF_MONTH, 1);
          var curDow = temp.get(ChronoField.DAY_OF_WEEK);
          var dowDiff = MathUtil.intMod(this._dowValue - curDow + 7, 7);
          dowDiff += (this._ordinal - 1) * 7;
          return temp.plus(dowDiff, ChronoUnit.DAYS);
        } else {
          var _temp = temporal.with(ChronoField.DAY_OF_MONTH, temporal.range(ChronoField.DAY_OF_MONTH).maximum());

          var _curDow = _temp.get(ChronoField.DAY_OF_WEEK);

          var daysDiff = this._dowValue - _curDow;
          daysDiff = daysDiff === 0 ? 0 : daysDiff > 0 ? daysDiff - 7 : daysDiff;
          daysDiff -= (-this._ordinal - 1) * 7;
          return _temp.plus(daysDiff, ChronoUnit.DAYS);
        }
      };

      return DayOfWeekInMonth;
    }(TemporalAdjuster);

    var RelativeDayOfWeek = function (_TemporalAdjuster3) {
      _inheritsLoose(RelativeDayOfWeek, _TemporalAdjuster3);

      function RelativeDayOfWeek(relative, dayOfWeek) {
        var _this3;

        _this3 = _TemporalAdjuster3.call(this) || this;
        requireNonNull(dayOfWeek, 'dayOfWeek');
        _this3._relative = relative;
        _this3._dowValue = dayOfWeek.value();
        return _this3;
      }

      var _proto3 = RelativeDayOfWeek.prototype;

      _proto3.adjustInto = function adjustInto(temporal) {
        var calDow = temporal.get(ChronoField.DAY_OF_WEEK);

        if (this._relative < 2 && calDow === this._dowValue) {
          return temporal;
        }

        if ((this._relative & 1) === 0) {
          var daysDiff = calDow - this._dowValue;
          return temporal.plus(daysDiff >= 0 ? 7 - daysDiff : -daysDiff, ChronoUnit.DAYS);
        } else {
          var _daysDiff = this._dowValue - calDow;

          return temporal.minus(_daysDiff >= 0 ? 7 - _daysDiff : -_daysDiff, ChronoUnit.DAYS);
        }
      };

      return RelativeDayOfWeek;
    }(TemporalAdjuster);

    var IsoChronology = function (_Enum) {
      _inheritsLoose(IsoChronology, _Enum);

      function IsoChronology() {
        return _Enum.apply(this, arguments) || this;
      }

      IsoChronology.isLeapYear = function isLeapYear(prolepticYear) {
        return (prolepticYear & 3) === 0 && (prolepticYear % 100 !== 0 || prolepticYear % 400 === 0);
      };

      var _proto = IsoChronology.prototype;

      _proto._updateResolveMap = function _updateResolveMap(fieldValues, field, value) {
        requireNonNull(fieldValues, 'fieldValues');
        requireNonNull(field, 'field');
        var current = fieldValues.get(field);

        if (current != null && current !== value) {
          throw new DateTimeException("Invalid state, field: " + field + " " + current + " conflicts with " + field + " " + value);
        }

        fieldValues.put(field, value);
      };

      _proto.resolveDate = function resolveDate(fieldValues, resolverStyle) {
        if (fieldValues.containsKey(ChronoField.EPOCH_DAY)) {
          return LocalDate.ofEpochDay(fieldValues.remove(ChronoField.EPOCH_DAY));
        }

        var prolepticMonth = fieldValues.remove(ChronoField.PROLEPTIC_MONTH);

        if (prolepticMonth != null) {
          if (resolverStyle !== ResolverStyle.LENIENT) {
            ChronoField.PROLEPTIC_MONTH.checkValidValue(prolepticMonth);
          }

          this._updateResolveMap(fieldValues, ChronoField.MONTH_OF_YEAR, MathUtil.floorMod(prolepticMonth, 12) + 1);

          this._updateResolveMap(fieldValues, ChronoField.YEAR, MathUtil.floorDiv(prolepticMonth, 12));
        }

        var yoeLong = fieldValues.remove(ChronoField.YEAR_OF_ERA);

        if (yoeLong != null) {
          if (resolverStyle !== ResolverStyle.LENIENT) {
            ChronoField.YEAR_OF_ERA.checkValidValue(yoeLong);
          }

          var era = fieldValues.remove(ChronoField.ERA);

          if (era == null) {
            var year = fieldValues.get(ChronoField.YEAR);

            if (resolverStyle === ResolverStyle.STRICT) {
              if (year != null) {
                this._updateResolveMap(fieldValues, ChronoField.YEAR, year > 0 ? yoeLong : MathUtil.safeSubtract(1, yoeLong));
              } else {
                fieldValues.put(ChronoField.YEAR_OF_ERA, yoeLong);
              }
            } else {
              this._updateResolveMap(fieldValues, ChronoField.YEAR, year == null || year > 0 ? yoeLong : MathUtil.safeSubtract(1, yoeLong));
            }
          } else if (era === 1) {
            this._updateResolveMap(fieldValues, ChronoField.YEAR, yoeLong);
          } else if (era === 0) {
            this._updateResolveMap(fieldValues, ChronoField.YEAR, MathUtil.safeSubtract(1, yoeLong));
          } else {
            throw new DateTimeException("Invalid value for era: " + era);
          }
        } else if (fieldValues.containsKey(ChronoField.ERA)) {
          ChronoField.ERA.checkValidValue(fieldValues.get(ChronoField.ERA));
        }

        if (fieldValues.containsKey(ChronoField.YEAR)) {
          if (fieldValues.containsKey(ChronoField.MONTH_OF_YEAR)) {
            if (fieldValues.containsKey(ChronoField.DAY_OF_MONTH)) {
              var y = ChronoField.YEAR.checkValidIntValue(fieldValues.remove(ChronoField.YEAR));
              var moy = fieldValues.remove(ChronoField.MONTH_OF_YEAR);
              var dom = fieldValues.remove(ChronoField.DAY_OF_MONTH);

              if (resolverStyle === ResolverStyle.LENIENT) {
                var months = moy - 1;
                var days = dom - 1;
                return LocalDate.of(y, 1, 1).plusMonths(months).plusDays(days);
              } else if (resolverStyle === ResolverStyle.SMART) {
                ChronoField.DAY_OF_MONTH.checkValidValue(dom);

                if (moy === 4 || moy === 6 || moy === 9 || moy === 11) {
                  dom = Math.min(dom, 30);
                } else if (moy === 2) {
                  dom = Math.min(dom, Month.FEBRUARY.length(Year.isLeap(y)));
                }

                return LocalDate.of(y, moy, dom);
              } else {
                return LocalDate.of(y, moy, dom);
              }
            }
          }

          if (fieldValues.containsKey(ChronoField.DAY_OF_YEAR)) {
            var _y = ChronoField.YEAR.checkValidIntValue(fieldValues.remove(ChronoField.YEAR));

            if (resolverStyle === ResolverStyle.LENIENT) {
              var _days = MathUtil.safeSubtract(fieldValues.remove(ChronoField.DAY_OF_YEAR), 1);

              return LocalDate.ofYearDay(_y, 1).plusDays(_days);
            }

            var doy = ChronoField.DAY_OF_YEAR.checkValidIntValue(fieldValues.remove(ChronoField.DAY_OF_YEAR));
            return LocalDate.ofYearDay(_y, doy);
          }

          if (fieldValues.containsKey(ChronoField.ALIGNED_WEEK_OF_YEAR)) {
            if (fieldValues.containsKey(ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR)) {
              var _y2 = ChronoField.YEAR.checkValidIntValue(fieldValues.remove(ChronoField.YEAR));

              if (resolverStyle === ResolverStyle.LENIENT) {
                var weeks = MathUtil.safeSubtract(fieldValues.remove(ChronoField.ALIGNED_WEEK_OF_YEAR), 1);

                var _days2 = MathUtil.safeSubtract(fieldValues.remove(ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR), 1);

                return LocalDate.of(_y2, 1, 1).plusWeeks(weeks).plusDays(_days2);
              }

              var aw = ChronoField.ALIGNED_WEEK_OF_YEAR.checkValidIntValue(fieldValues.remove(ChronoField.ALIGNED_WEEK_OF_YEAR));
              var ad = ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR.checkValidIntValue(fieldValues.remove(ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR));
              var date = LocalDate.of(_y2, 1, 1).plusDays((aw - 1) * 7 + (ad - 1));

              if (resolverStyle === ResolverStyle.STRICT && date.get(ChronoField.YEAR) !== _y2) {
                throw new DateTimeException('Strict mode rejected date parsed to a different year');
              }

              return date;
            }

            if (fieldValues.containsKey(ChronoField.DAY_OF_WEEK)) {
              var _y3 = ChronoField.YEAR.checkValidIntValue(fieldValues.remove(ChronoField.YEAR));

              if (resolverStyle === ResolverStyle.LENIENT) {
                var _weeks = MathUtil.safeSubtract(fieldValues.remove(ChronoField.ALIGNED_WEEK_OF_YEAR), 1);

                var _days3 = MathUtil.safeSubtract(fieldValues.remove(ChronoField.DAY_OF_WEEK), 1);

                return LocalDate.of(_y3, 1, 1).plusWeeks(_weeks).plusDays(_days3);
              }

              var _aw = ChronoField.ALIGNED_WEEK_OF_YEAR.checkValidIntValue(fieldValues.remove(ChronoField.ALIGNED_WEEK_OF_YEAR));

              var dow = ChronoField.DAY_OF_WEEK.checkValidIntValue(fieldValues.remove(ChronoField.DAY_OF_WEEK));

              var _date = LocalDate.of(_y3, 1, 1).plusWeeks(_aw - 1).with(TemporalAdjusters.nextOrSame(DayOfWeek.of(dow)));

              if (resolverStyle === ResolverStyle.STRICT && _date.get(ChronoField.YEAR) !== _y3) {
                throw new DateTimeException('Strict mode rejected date parsed to a different month');
              }

              return _date;
            }
          }
        }

        return null;
      };

      _proto.date = function date(temporal) {
        return LocalDate.from(temporal);
      };

      return IsoChronology;
    }(Enum);
    function _init$9() {
      IsoChronology.INSTANCE = new IsoChronology('IsoChronology');
    }

    var OffsetTime = function (_Temporal) {
      _inheritsLoose(OffsetTime, _Temporal);

      OffsetTime.from = function from(temporal) {
        requireNonNull(temporal, 'temporal');

        if (temporal instanceof OffsetTime) {
          return temporal;
        } else if (temporal instanceof OffsetDateTime) {
          return temporal.toOffsetTime();
        }

        try {
          var time = LocalTime.from(temporal);
          var offset = ZoneOffset.from(temporal);
          return new OffsetTime(time, offset);
        } catch (ex) {
          throw new DateTimeException("Unable to obtain OffsetTime TemporalAccessor: " + temporal + ", type " + (temporal.constructor != null ? temporal.constructor.name : ''));
        }
      };

      OffsetTime.now = function now(clockOrZone) {
        if (arguments.length === 0) {
          return OffsetTime._now(Clock.systemDefaultZone());
        } else if (clockOrZone instanceof Clock) {
          return OffsetTime._now(clockOrZone);
        } else {
          return OffsetTime._now(Clock.system(clockOrZone));
        }
      };

      OffsetTime._now = function _now(clock) {
        requireNonNull(clock, 'clock');
        var now = clock.instant();
        return OffsetTime.ofInstant(now, clock.zone().rules().offset(now));
      };

      OffsetTime.of = function of() {
        if (arguments.length <= 2) {
          return OffsetTime.ofTimeAndOffset.apply(this, arguments);
        } else {
          return OffsetTime.ofNumbers.apply(this, arguments);
        }
      };

      OffsetTime.ofNumbers = function ofNumbers(hour, minute, second, nanoOfSecond, offset) {
        var time = LocalTime.of(hour, minute, second, nanoOfSecond);
        return new OffsetTime(time, offset);
      };

      OffsetTime.ofTimeAndOffset = function ofTimeAndOffset(time, offset) {
        return new OffsetTime(time, offset);
      };

      OffsetTime.ofInstant = function ofInstant(instant, zone) {
        requireNonNull(instant, 'instant');
        requireInstance(instant, Instant, 'instant');
        requireNonNull(zone, 'zone');
        requireInstance(zone, ZoneId, 'zone');
        var rules = zone.rules();
        var offset = rules.offset(instant);
        var secsOfDay = instant.epochSecond() % LocalTime.SECONDS_PER_DAY;
        secsOfDay = (secsOfDay + offset.totalSeconds()) % LocalTime.SECONDS_PER_DAY;

        if (secsOfDay < 0) {
          secsOfDay += LocalTime.SECONDS_PER_DAY;
        }

        var time = LocalTime.ofSecondOfDay(secsOfDay, instant.nano());
        return new OffsetTime(time, offset);
      };

      OffsetTime.parse = function parse(text, formatter) {
        if (formatter === void 0) {
          formatter = DateTimeFormatter.ISO_OFFSET_TIME;
        }

        requireNonNull(formatter, 'formatter');
        return formatter.parse(text, OffsetTime.FROM);
      };

      function OffsetTime(time, offset) {
        var _this;

        _this = _Temporal.call(this) || this;
        requireNonNull(time, 'time');
        requireInstance(time, LocalTime, 'time');
        requireNonNull(offset, 'offset');
        requireInstance(offset, ZoneOffset, 'offset');
        _this._time = time;
        _this._offset = offset;
        return _this;
      }

      var _proto = OffsetTime.prototype;

      _proto.adjustInto = function adjustInto(temporal) {
        return temporal.with(ChronoField.NANO_OF_DAY, this._time.toNanoOfDay()).with(ChronoField.OFFSET_SECONDS, this.offset().totalSeconds());
      };

      _proto.atDate = function atDate(date) {
        return OffsetDateTime.of(date, this._time, this._offset);
      };

      _proto.format = function format(formatter) {
        requireNonNull(formatter, 'formatter');
        return formatter.format(this, OffsetTime.FROM);
      };

      _proto.get = function get(field) {
        return _Temporal.prototype.get.call(this, field);
      };

      _proto.getLong = function getLong(field) {
        if (field instanceof ChronoField) {
          if (field === ChronoField.OFFSET_SECONDS) {
            return this._offset.totalSeconds();
          }

          return this._time.getLong(field);
        }

        return field.getFrom(this);
      };

      _proto.hour = function hour() {
        return this._time.hour();
      };

      _proto.minute = function minute() {
        return this._time.minute();
      };

      _proto.second = function second() {
        return this._time.second();
      };

      _proto.nano = function nano() {
        return this._time.nano();
      };

      _proto.offset = function offset() {
        return this._offset;
      };

      _proto.isAfter = function isAfter(other) {
        requireNonNull(other, 'other');
        return this._toEpochNano() > other._toEpochNano();
      };

      _proto.isBefore = function isBefore(other) {
        requireNonNull(other, 'other');
        return this._toEpochNano() < other._toEpochNano();
      };

      _proto.isEqual = function isEqual(other) {
        requireNonNull(other, 'other');
        return this._toEpochNano() === other._toEpochNano();
      };

      _proto.isSupported = function isSupported(fieldOrUnit) {
        if (fieldOrUnit instanceof ChronoField) {
          return fieldOrUnit.isTimeBased() || fieldOrUnit === ChronoField.OFFSET_SECONDS;
        } else if (fieldOrUnit instanceof ChronoUnit) {
          return fieldOrUnit.isTimeBased();
        }

        return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
      };

      _proto.minusHours = function minusHours(hours) {
        return this._withLocalTimeOffset(this._time.minusHours(hours), this._offset);
      };

      _proto.minusMinutes = function minusMinutes(minutes) {
        return this._withLocalTimeOffset(this._time.minusMinutes(minutes), this._offset);
      };

      _proto.minusSeconds = function minusSeconds(seconds) {
        return this._withLocalTimeOffset(this._time.minusSeconds(seconds), this._offset);
      };

      _proto.minusNanos = function minusNanos(nanos) {
        return this._withLocalTimeOffset(this._time.minusNanos(nanos), this._offset);
      };

      _proto._minusAmount = function _minusAmount(amount) {
        requireNonNull(amount);
        return amount.subtractFrom(this);
      };

      _proto._minusUnit = function _minusUnit(amountToSubtract, unit) {
        return this.plus(-1 * amountToSubtract, unit);
      };

      _proto._plusAmount = function _plusAmount(amount) {
        requireNonNull(amount);
        return amount.addTo(this);
      };

      _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
        if (unit instanceof ChronoUnit) {
          return this._withLocalTimeOffset(this._time.plus(amountToAdd, unit), this._offset);
        }

        return unit.addTo(this, amountToAdd);
      };

      _proto.plusHours = function plusHours(hours) {
        return this._withLocalTimeOffset(this._time.plusHours(hours), this._offset);
      };

      _proto.plusMinutes = function plusMinutes(minutes) {
        return this._withLocalTimeOffset(this._time.plusMinutes(minutes), this._offset);
      };

      _proto.plusSeconds = function plusSeconds(seconds) {
        return this._withLocalTimeOffset(this._time.plusSeconds(seconds), this._offset);
      };

      _proto.plusNanos = function plusNanos(nanos) {
        return this._withLocalTimeOffset(this._time.plusNanos(nanos), this._offset);
      };

      _proto.query = function query(_query) {
        requireNonNull(_query, 'query');

        if (_query === TemporalQueries.precision()) {
          return ChronoUnit.NANOS;
        } else if (_query === TemporalQueries.offset() || _query === TemporalQueries.zone()) {
          return this.offset();
        } else if (_query === TemporalQueries.localTime()) {
          return this._time;
        } else if (_query === TemporalQueries.chronology() || _query === TemporalQueries.localDate() || _query === TemporalQueries.zoneId()) {
          return null;
        }

        return _Temporal.prototype.query.call(this, _query);
      };

      _proto.range = function range(field) {
        if (field instanceof ChronoField) {
          if (field === ChronoField.OFFSET_SECONDS) {
            return field.range();
          }

          return this._time.range(field);
        }

        return field.rangeRefinedBy(this);
      };

      _proto.toLocalTime = function toLocalTime() {
        return this._time;
      };

      _proto.truncatedTo = function truncatedTo(unit) {
        return this._withLocalTimeOffset(this._time.truncatedTo(unit), this._offset);
      };

      _proto.until = function until(endExclusive, unit) {
        requireNonNull(endExclusive, 'endExclusive');
        requireNonNull(unit, 'unit');
        var end = OffsetTime.from(endExclusive);

        if (unit instanceof ChronoUnit) {
          var nanosUntil = end._toEpochNano() - this._toEpochNano();

          switch (unit) {
            case ChronoUnit.NANOS:
              return nanosUntil;

            case ChronoUnit.MICROS:
              return Math.floor(nanosUntil / 1000);

            case ChronoUnit.MILLIS:
              return Math.floor(nanosUntil / 1000000);

            case ChronoUnit.SECONDS:
              return Math.floor(nanosUntil / LocalTime.NANOS_PER_SECOND);

            case ChronoUnit.MINUTES:
              return Math.floor(nanosUntil / LocalTime.NANOS_PER_MINUTE);

            case ChronoUnit.HOURS:
              return Math.floor(nanosUntil / LocalTime.NANOS_PER_HOUR);

            case ChronoUnit.HALF_DAYS:
              return Math.floor(nanosUntil / (12 * LocalTime.NANOS_PER_HOUR));
          }

          throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
        }

        return unit.between(this, end);
      };

      _proto.withHour = function withHour(hour) {
        return this._withLocalTimeOffset(this._time.withHour(hour), this._offset);
      };

      _proto.withMinute = function withMinute(minute) {
        return this._withLocalTimeOffset(this._time.withMinute(minute), this._offset);
      };

      _proto.withSecond = function withSecond(second) {
        return this._withLocalTimeOffset(this._time.withSecond(second), this._offset);
      };

      _proto.withNano = function withNano(nano) {
        return this._withLocalTimeOffset(this._time.withNano(nano), this._offset);
      };

      _proto.withOffsetSameInstant = function withOffsetSameInstant(offset) {
        requireNonNull(offset, 'offset');

        if (offset.equals(this._offset)) {
          return this;
        }

        var difference = offset.totalSeconds() - this._offset.totalSeconds();

        var adjusted = this._time.plusSeconds(difference);

        return new OffsetTime(adjusted, offset);
      };

      _proto.withOffsetSameLocal = function withOffsetSameLocal(offset) {
        return offset != null && offset.equals(this._offset) ? this : new OffsetTime(this._time, offset);
      };

      _proto._toEpochNano = function _toEpochNano() {
        var nod = this._time.toNanoOfDay();

        var offsetNanos = this._offset.totalSeconds() * LocalTime.NANOS_PER_SECOND;
        return nod - offsetNanos;
      };

      _proto._withAdjuster = function _withAdjuster(adjuster) {
        requireNonNull(adjuster, 'adjuster');

        if (adjuster instanceof LocalTime) {
          return this._withLocalTimeOffset(adjuster, this._offset);
        } else if (adjuster instanceof ZoneOffset) {
          return this._withLocalTimeOffset(this._time, adjuster);
        } else if (adjuster instanceof OffsetTime) {
          return adjuster;
        }

        return adjuster.adjustInto(this);
      };

      _proto._withField = function _withField(field, newValue) {
        requireNonNull(field, 'field');

        if (field instanceof ChronoField) {
          if (field === ChronoField.OFFSET_SECONDS) {
            return this._withLocalTimeOffset(this._time, ZoneOffset.ofTotalSeconds(field.checkValidIntValue(newValue)));
          }

          return this._withLocalTimeOffset(this._time.with(field, newValue), this._offset);
        }

        return field.adjustInto(this, newValue);
      };

      _proto._withLocalTimeOffset = function _withLocalTimeOffset(time, offset) {
        if (this._time === time && this._offset.equals(offset)) {
          return this;
        }

        return new OffsetTime(time, offset);
      };

      _proto.compareTo = function compareTo(other) {
        requireNonNull(other, 'other');
        requireInstance(other, OffsetTime, 'other');

        if (this._offset.equals(other._offset)) {
          return this._time.compareTo(other._time);
        }

        var compare = MathUtil.compareNumbers(this._toEpochNano(), other._toEpochNano());

        if (compare === 0) {
          return this._time.compareTo(other._time);
        }

        return compare;
      };

      _proto.equals = function equals(other) {
        if (this === other) {
          return true;
        }

        if (other instanceof OffsetTime) {
          return this._time.equals(other._time) && this._offset.equals(other._offset);
        }

        return false;
      };

      _proto.hashCode = function hashCode() {
        return this._time.hashCode() ^ this._offset.hashCode();
      };

      _proto.toString = function toString() {
        return this._time.toString() + this._offset.toString();
      };

      _proto.toJSON = function toJSON() {
        return this.toString();
      };

      return OffsetTime;
    }(Temporal);
    function _init$8() {
      OffsetTime.MIN = OffsetTime.ofNumbers(0, 0, 0, 0, ZoneOffset.MAX);
      OffsetTime.MAX = OffsetTime.ofNumbers(23, 59, 59, 999999999, ZoneOffset.MIN);
      OffsetTime.FROM = createTemporalQuery('OffsetTime.FROM', function (temporal) {
        return OffsetTime.from(temporal);
      });
    }

    var ChronoZonedDateTime = function (_Temporal) {
      _inheritsLoose(ChronoZonedDateTime, _Temporal);

      function ChronoZonedDateTime() {
        return _Temporal.apply(this, arguments) || this;
      }

      var _proto = ChronoZonedDateTime.prototype;

      _proto.query = function query(_query) {
        if (_query === TemporalQueries.zoneId() || _query === TemporalQueries.zone()) {
          return this.zone();
        } else if (_query === TemporalQueries.chronology()) {
          return this.toLocalDate().chronology();
        } else if (_query === TemporalQueries.precision()) {
          return ChronoUnit.NANOS;
        } else if (_query === TemporalQueries.offset()) {
          return this.offset();
        } else if (_query === TemporalQueries.localDate()) {
          return LocalDate.ofEpochDay(this.toLocalDate().toEpochDay());
        } else if (_query === TemporalQueries.localTime()) {
          return this.toLocalTime();
        }

        return _Temporal.prototype.query.call(this, _query);
      };

      _proto.format = function format(formatter) {
        requireNonNull(formatter, 'formatter');
        return formatter.format(this);
      };

      _proto.toInstant = function toInstant() {
        return Instant.ofEpochSecond(this.toEpochSecond(), this.toLocalTime().nano());
      };

      _proto.toEpochSecond = function toEpochSecond() {
        var epochDay = this.toLocalDate().toEpochDay();
        var secs = epochDay * 86400 + this.toLocalTime().toSecondOfDay();
        secs -= this.offset().totalSeconds();
        return secs;
      };

      _proto.compareTo = function compareTo(other) {
        requireNonNull(other, 'other');
        var cmp = MathUtil.compareNumbers(this.toEpochSecond(), other.toEpochSecond());

        if (cmp === 0) {
          cmp = this.toLocalTime().nano() - other.toLocalTime().nano();

          if (cmp === 0) {
            cmp = this.toLocalDateTime().compareTo(other.toLocalDateTime());

            if (cmp === 0) {
              cmp = strcmp(this.zone().id(), other.zone().id());
            }
          }
        }

        return cmp;
      };

      _proto.isAfter = function isAfter(other) {
        requireNonNull(other, 'other');
        var thisEpochSec = this.toEpochSecond();
        var otherEpochSec = other.toEpochSecond();
        return thisEpochSec > otherEpochSec || thisEpochSec === otherEpochSec && this.toLocalTime().nano() > other.toLocalTime().nano();
      };

      _proto.isBefore = function isBefore(other) {
        requireNonNull(other, 'other');
        var thisEpochSec = this.toEpochSecond();
        var otherEpochSec = other.toEpochSecond();
        return thisEpochSec < otherEpochSec || thisEpochSec === otherEpochSec && this.toLocalTime().nano() < other.toLocalTime().nano();
      };

      _proto.isEqual = function isEqual(other) {
        requireNonNull(other, 'other');
        return this.toEpochSecond() === other.toEpochSecond() && this.toLocalTime().nano() === other.toLocalTime().nano();
      };

      _proto.equals = function equals(other) {
        if (this === other) {
          return true;
        }

        if (other instanceof ChronoZonedDateTime) {
          return this.compareTo(other) === 0;
        }

        return false;
      };

      return ChronoZonedDateTime;
    }(Temporal);

    function strcmp(a, b) {
      if (a < b) {
        return -1;
      }

      if (a > b) {
        return 1;
      }

      return 0;
    }

    var ZonedDateTime = function (_ChronoZonedDateTime) {
      _inheritsLoose(ZonedDateTime, _ChronoZonedDateTime);

      ZonedDateTime.now = function now(clockOrZone) {
        var clock;

        if (clockOrZone instanceof ZoneId) {
          clock = Clock.system(clockOrZone);
        } else {
          clock = clockOrZone == null ? Clock.systemDefaultZone() : clockOrZone;
        }

        return ZonedDateTime.ofInstant(clock.instant(), clock.zone());
      };

      ZonedDateTime.of = function of() {
        if (arguments.length <= 2) {
          return ZonedDateTime.of2.apply(this, arguments);
        } else if (arguments.length === 3 && arguments[0] instanceof LocalDate) {
          return ZonedDateTime.of3.apply(this, arguments);
        } else {
          return ZonedDateTime.of8.apply(this, arguments);
        }
      };

      ZonedDateTime.of3 = function of3(date, time, zone) {
        return ZonedDateTime.of2(LocalDateTime.of(date, time), zone);
      };

      ZonedDateTime.of2 = function of2(localDateTime, zone) {
        return ZonedDateTime.ofLocal(localDateTime, zone, null);
      };

      ZonedDateTime.of8 = function of8(year, month, dayOfMonth, hour, minute, second, nanoOfSecond, zone) {
        var dt = LocalDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoOfSecond);
        return ZonedDateTime.ofLocal(dt, zone, null);
      };

      ZonedDateTime.ofLocal = function ofLocal(localDateTime, zone, preferredOffset) {
        requireNonNull(localDateTime, 'localDateTime');
        requireNonNull(zone, 'zone');

        if (zone instanceof ZoneOffset) {
          return new ZonedDateTime(localDateTime, zone, zone);
        }

        var offset = null;
        var rules = zone.rules();
        var validOffsets = rules.validOffsets(localDateTime);

        if (validOffsets.length === 1) {
          offset = validOffsets[0];
        } else if (validOffsets.length === 0) {
          var trans = rules.transition(localDateTime);
          localDateTime = localDateTime.plusSeconds(trans.duration().seconds());
          offset = trans.offsetAfter();
        } else {
          if (preferredOffset != null && validOffsets.some(function (validOffset) {
            return validOffset.equals(preferredOffset);
          })) {
            offset = preferredOffset;
          } else {
            offset = requireNonNull(validOffsets[0], 'offset');
          }
        }

        return new ZonedDateTime(localDateTime, offset, zone);
      };

      ZonedDateTime.ofInstant = function ofInstant() {
        if (arguments.length === 2) {
          return ZonedDateTime.ofInstant2.apply(this, arguments);
        } else {
          return ZonedDateTime.ofInstant3.apply(this, arguments);
        }
      };

      ZonedDateTime.ofInstant2 = function ofInstant2(instant, zone) {
        requireNonNull(instant, 'instant');
        requireNonNull(zone, 'zone');
        return ZonedDateTime._create(instant.epochSecond(), instant.nano(), zone);
      };

      ZonedDateTime.ofInstant3 = function ofInstant3(localDateTime, offset, zone) {
        requireNonNull(localDateTime, 'localDateTime');
        requireNonNull(offset, 'offset');
        requireNonNull(zone, 'zone');
        return ZonedDateTime._create(localDateTime.toEpochSecond(offset), localDateTime.nano(), zone);
      };

      ZonedDateTime._create = function _create(epochSecond, nanoOfSecond, zone) {
        var rules = zone.rules();
        var instant = Instant.ofEpochSecond(epochSecond, nanoOfSecond);
        var offset = rules.offset(instant);
        var ldt = LocalDateTime.ofEpochSecond(epochSecond, nanoOfSecond, offset);
        return new ZonedDateTime(ldt, offset, zone);
      };

      ZonedDateTime.ofStrict = function ofStrict(localDateTime, offset, zone) {
        requireNonNull(localDateTime, 'localDateTime');
        requireNonNull(offset, 'offset');
        requireNonNull(zone, 'zone');
        var rules = zone.rules();

        if (rules.isValidOffset(localDateTime, offset) === false) {
          var trans = rules.transition(localDateTime);

          if (trans != null && trans.isGap()) {
            throw new DateTimeException("LocalDateTime " + localDateTime + " does not exist in zone " + zone + " due to a gap in the local time-line, typically caused by daylight savings");
          }

          throw new DateTimeException("ZoneOffset \"" + offset + "\" is not valid for LocalDateTime \"" + localDateTime + "\" in zone \"" + zone + "\"");
        }

        return new ZonedDateTime(localDateTime, offset, zone);
      };

      ZonedDateTime.ofLenient = function ofLenient(localDateTime, offset, zone) {
        requireNonNull(localDateTime, 'localDateTime');
        requireNonNull(offset, 'offset');
        requireNonNull(zone, 'zone');

        if (zone instanceof ZoneOffset && offset.equals(zone) === false) {
          throw new IllegalArgumentException('ZoneId must match ZoneOffset');
        }

        return new ZonedDateTime(localDateTime, offset, zone);
      };

      ZonedDateTime.from = function from(temporal) {
        requireNonNull(temporal, 'temporal');

        if (temporal instanceof ZonedDateTime) {
          return temporal;
        }

        var zone = ZoneId.from(temporal);

        if (temporal.isSupported(ChronoField.INSTANT_SECONDS)) {
          var zdt = ZonedDateTime._from(temporal, zone);

          if (zdt != null) return zdt;
        }

        var ldt = LocalDateTime.from(temporal);
        return ZonedDateTime.of2(ldt, zone);
      };

      ZonedDateTime._from = function _from(temporal, zone) {
        try {
          return ZonedDateTime.__from(temporal, zone);
        } catch (ex) {
          if (!(ex instanceof DateTimeException)) throw ex;
        }
      };

      ZonedDateTime.__from = function __from(temporal, zone) {
        var epochSecond = temporal.getLong(ChronoField.INSTANT_SECONDS);
        var nanoOfSecond = temporal.get(ChronoField.NANO_OF_SECOND);
        return ZonedDateTime._create(epochSecond, nanoOfSecond, zone);
      };

      ZonedDateTime.parse = function parse(text, formatter) {
        if (formatter === void 0) {
          formatter = DateTimeFormatter.ISO_ZONED_DATE_TIME;
        }

        requireNonNull(formatter, 'formatter');
        return formatter.parse(text, ZonedDateTime.FROM);
      };

      function ZonedDateTime(dateTime, offset, zone) {
        var _this;

        requireNonNull(dateTime, 'dateTime');
        requireNonNull(offset, 'offset');
        requireNonNull(zone, 'zone');
        _this = _ChronoZonedDateTime.call(this) || this;
        _this._dateTime = dateTime;
        _this._offset = offset;
        _this._zone = zone;
        return _this;
      }

      var _proto = ZonedDateTime.prototype;

      _proto._resolveLocal = function _resolveLocal(newDateTime) {
        requireNonNull(newDateTime, 'newDateTime');
        return ZonedDateTime.ofLocal(newDateTime, this._zone, this._offset);
      };

      _proto._resolveInstant = function _resolveInstant(newDateTime) {
        return ZonedDateTime.ofInstant3(newDateTime, this._offset, this._zone);
      };

      _proto._resolveOffset = function _resolveOffset(offset) {
        if (offset.equals(this._offset) === false && this._zone.rules().isValidOffset(this._dateTime, offset)) {
          return new ZonedDateTime(this._dateTime, offset, this._zone);
        }

        return this;
      };

      _proto.isSupported = function isSupported(fieldOrUnit) {
        if (fieldOrUnit instanceof ChronoField) {
          return true;
        } else if (fieldOrUnit instanceof ChronoUnit) {
          return fieldOrUnit.isDateBased() || fieldOrUnit.isTimeBased();
        }

        return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
      };

      _proto.range = function range(field) {
        if (field instanceof ChronoField) {
          if (field === ChronoField.INSTANT_SECONDS || field === ChronoField.OFFSET_SECONDS) {
            return field.range();
          }

          return this._dateTime.range(field);
        }

        return field.rangeRefinedBy(this);
      };

      _proto.get = function get(field) {
        return this.getLong(field);
      };

      _proto.getLong = function getLong(field) {
        if (field instanceof ChronoField) {
          switch (field) {
            case ChronoField.INSTANT_SECONDS:
              return this.toEpochSecond();

            case ChronoField.OFFSET_SECONDS:
              return this._offset.totalSeconds();
          }

          return this._dateTime.getLong(field);
        }

        requireNonNull(field, 'field');
        return field.getFrom(this);
      };

      _proto.offset = function offset() {
        return this._offset;
      };

      _proto.withEarlierOffsetAtOverlap = function withEarlierOffsetAtOverlap() {
        var trans = this._zone.rules().transition(this._dateTime);

        if (trans != null && trans.isOverlap()) {
          var earlierOffset = trans.offsetBefore();

          if (earlierOffset.equals(this._offset) === false) {
            return new ZonedDateTime(this._dateTime, earlierOffset, this._zone);
          }
        }

        return this;
      };

      _proto.withLaterOffsetAtOverlap = function withLaterOffsetAtOverlap() {
        var trans = this._zone.rules().transition(this.toLocalDateTime());

        if (trans != null) {
          var laterOffset = trans.offsetAfter();

          if (laterOffset.equals(this._offset) === false) {
            return new ZonedDateTime(this._dateTime, laterOffset, this._zone);
          }
        }

        return this;
      };

      _proto.zone = function zone() {
        return this._zone;
      };

      _proto.withZoneSameLocal = function withZoneSameLocal(zone) {
        requireNonNull(zone, 'zone');
        return this._zone.equals(zone) ? this : ZonedDateTime.ofLocal(this._dateTime, zone, this._offset);
      };

      _proto.withZoneSameInstant = function withZoneSameInstant(zone) {
        requireNonNull(zone, 'zone');
        return this._zone.equals(zone) ? this : ZonedDateTime._create(this._dateTime.toEpochSecond(this._offset), this._dateTime.nano(), zone);
      };

      _proto.withFixedOffsetZone = function withFixedOffsetZone() {
        return this._zone.equals(this._offset) ? this : new ZonedDateTime(this._dateTime, this._offset, this._offset);
      };

      _proto.year = function year() {
        return this._dateTime.year();
      };

      _proto.monthValue = function monthValue() {
        return this._dateTime.monthValue();
      };

      _proto.month = function month() {
        return this._dateTime.month();
      };

      _proto.dayOfMonth = function dayOfMonth() {
        return this._dateTime.dayOfMonth();
      };

      _proto.dayOfYear = function dayOfYear() {
        return this._dateTime.dayOfYear();
      };

      _proto.dayOfWeek = function dayOfWeek() {
        return this._dateTime.dayOfWeek();
      };

      _proto.hour = function hour() {
        return this._dateTime.hour();
      };

      _proto.minute = function minute() {
        return this._dateTime.minute();
      };

      _proto.second = function second() {
        return this._dateTime.second();
      };

      _proto.nano = function nano() {
        return this._dateTime.nano();
      };

      _proto._withAdjuster = function _withAdjuster(adjuster) {
        if (adjuster instanceof LocalDate) {
          return this._resolveLocal(LocalDateTime.of(adjuster, this._dateTime.toLocalTime()));
        } else if (adjuster instanceof LocalTime) {
          return this._resolveLocal(LocalDateTime.of(this._dateTime.toLocalDate(), adjuster));
        } else if (adjuster instanceof LocalDateTime) {
          return this._resolveLocal(adjuster);
        } else if (adjuster instanceof Instant) {
          var instant = adjuster;
          return ZonedDateTime._create(instant.epochSecond(), instant.nano(), this._zone);
        } else if (adjuster instanceof ZoneOffset) {
          return this._resolveOffset(adjuster);
        }

        return _ChronoZonedDateTime.prototype._withAdjuster.call(this, adjuster);
      };

      _proto._withField = function _withField(field, newValue) {
        if (field instanceof ChronoField) {
          switch (field) {
            case ChronoField.INSTANT_SECONDS:
              return ZonedDateTime._create(newValue, this.nano(), this._zone);

            case ChronoField.OFFSET_SECONDS:
              {
                var offset = ZoneOffset.ofTotalSeconds(field.checkValidIntValue(newValue));
                return this._resolveOffset(offset);
              }
          }

          return this._resolveLocal(this._dateTime.with(field, newValue));
        }

        return field.adjustInto(this, newValue);
      };

      _proto.withYear = function withYear(year) {
        return this._resolveLocal(this._dateTime.withYear(year));
      };

      _proto.withMonth = function withMonth(month) {
        return this._resolveLocal(this._dateTime.withMonth(month));
      };

      _proto.withDayOfMonth = function withDayOfMonth(dayOfMonth) {
        return this._resolveLocal(this._dateTime.withDayOfMonth(dayOfMonth));
      };

      _proto.withDayOfYear = function withDayOfYear(dayOfYear) {
        return this._resolveLocal(this._dateTime.withDayOfYear(dayOfYear));
      };

      _proto.withHour = function withHour(hour) {
        return this._resolveLocal(this._dateTime.withHour(hour));
      };

      _proto.withMinute = function withMinute(minute) {
        return this._resolveLocal(this._dateTime.withMinute(minute));
      };

      _proto.withSecond = function withSecond(second) {
        return this._resolveLocal(this._dateTime.withSecond(second));
      };

      _proto.withNano = function withNano(nanoOfSecond) {
        return this._resolveLocal(this._dateTime.withNano(nanoOfSecond));
      };

      _proto.truncatedTo = function truncatedTo(unit) {
        return this._resolveLocal(this._dateTime.truncatedTo(unit));
      };

      _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
        if (unit instanceof ChronoUnit) {
          if (unit.isDateBased()) {
            return this._resolveLocal(this._dateTime.plus(amountToAdd, unit));
          } else {
            return this._resolveInstant(this._dateTime.plus(amountToAdd, unit));
          }
        }

        requireNonNull(unit, 'unit');
        return unit.addTo(this, amountToAdd);
      };

      _proto.plusYears = function plusYears(years) {
        return this._resolveLocal(this._dateTime.plusYears(years));
      };

      _proto.plusMonths = function plusMonths(months) {
        return this._resolveLocal(this._dateTime.plusMonths(months));
      };

      _proto.plusWeeks = function plusWeeks(weeks) {
        return this._resolveLocal(this._dateTime.plusWeeks(weeks));
      };

      _proto.plusDays = function plusDays(days) {
        return this._resolveLocal(this._dateTime.plusDays(days));
      };

      _proto.plusHours = function plusHours(hours) {
        return this._resolveInstant(this._dateTime.plusHours(hours));
      };

      _proto.plusMinutes = function plusMinutes(minutes) {
        return this._resolveInstant(this._dateTime.plusMinutes(minutes));
      };

      _proto.plusSeconds = function plusSeconds(seconds) {
        return this._resolveInstant(this._dateTime.plusSeconds(seconds));
      };

      _proto.plusNanos = function plusNanos(nanos) {
        return this._resolveInstant(this._dateTime.plusNanos(nanos));
      };

      _proto._minusUnit = function _minusUnit(amountToSubtract, unit) {
        return this._plusUnit(-1 * amountToSubtract, unit);
      };

      _proto.minusYears = function minusYears(years) {
        return this.plusYears(-1 * years);
      };

      _proto.minusMonths = function minusMonths(months) {
        return this.plusMonths(-1 * months);
      };

      _proto.minusWeeks = function minusWeeks(weeks) {
        return this.plusWeeks(-1 * weeks);
      };

      _proto.minusDays = function minusDays(days) {
        return this.plusDays(-1 * days);
      };

      _proto.minusHours = function minusHours(hours) {
        return this.plusHours(-1 * hours);
      };

      _proto.minusMinutes = function minusMinutes(minutes) {
        return this.plusMinutes(-1 * minutes);
      };

      _proto.minusSeconds = function minusSeconds(seconds) {
        return this.plusSeconds(-1 * seconds);
      };

      _proto.minusNanos = function minusNanos(nanos) {
        return this.plusNanos(-1 * nanos);
      };

      _proto.query = function query(_query) {
        if (_query === TemporalQueries.localDate()) {
          return this.toLocalDate();
        }

        requireNonNull(_query, 'query');
        return _ChronoZonedDateTime.prototype.query.call(this, _query);
      };

      _proto.until = function until(endExclusive, unit) {
        var end = ZonedDateTime.from(endExclusive);

        if (unit instanceof ChronoUnit) {
          end = end.withZoneSameInstant(this._zone);

          if (unit.isDateBased()) {
            return this._dateTime.until(end._dateTime, unit);
          } else {
            var difference = this._offset.totalSeconds() - end._offset.totalSeconds();

            var adjustedEnd = end._dateTime.plusSeconds(difference);

            return this._dateTime.until(adjustedEnd, unit);
          }
        }

        return unit.between(this, end);
      };

      _proto.toLocalDateTime = function toLocalDateTime() {
        return this._dateTime;
      };

      _proto.toLocalDate = function toLocalDate() {
        return this._dateTime.toLocalDate();
      };

      _proto.toLocalTime = function toLocalTime() {
        return this._dateTime.toLocalTime();
      };

      _proto.toOffsetDateTime = function toOffsetDateTime() {
        return OffsetDateTime.of(this._dateTime, this._offset);
      };

      _proto.equals = function equals(other) {
        if (this === other) {
          return true;
        }

        if (other instanceof ZonedDateTime) {
          return this._dateTime.equals(other._dateTime) && this._offset.equals(other._offset) && this._zone.equals(other._zone);
        }

        return false;
      };

      _proto.hashCode = function hashCode() {
        return MathUtil.hashCode(this._dateTime.hashCode(), this._offset.hashCode(), this._zone.hashCode());
      };

      _proto.toString = function toString() {
        var str = this._dateTime.toString() + this._offset.toString();

        if (this._offset !== this._zone) {
          str += "[" + this._zone.toString() + "]";
        }

        return str;
      };

      _proto.toJSON = function toJSON() {
        return this.toString();
      };

      _proto.format = function format(formatter) {
        return _ChronoZonedDateTime.prototype.format.call(this, formatter);
      };

      return ZonedDateTime;
    }(ChronoZonedDateTime);
    function _init$7() {
      ZonedDateTime.FROM = createTemporalQuery('ZonedDateTime.FROM', function (temporal) {
        return ZonedDateTime.from(temporal);
      });
    }

    var OffsetDateTime = function (_Temporal) {
      _inheritsLoose(OffsetDateTime, _Temporal);

      OffsetDateTime.from = function from(temporal) {
        requireNonNull(temporal, 'temporal');

        if (temporal instanceof OffsetDateTime) {
          return temporal;
        }

        try {
          var offset = ZoneOffset.from(temporal);

          try {
            var ldt = LocalDateTime.from(temporal);
            return OffsetDateTime.of(ldt, offset);
          } catch (_) {
            var instant = Instant.from(temporal);
            return OffsetDateTime.ofInstant(instant, offset);
          }
        } catch (ex) {
          throw new DateTimeException("Unable to obtain OffsetDateTime TemporalAccessor: " + temporal + ", type " + (temporal.constructor != null ? temporal.constructor.name : ''));
        }
      };

      OffsetDateTime.now = function now(clockOrZone) {
        if (arguments.length === 0) {
          return OffsetDateTime.now(Clock.systemDefaultZone());
        } else {
          requireNonNull(clockOrZone, 'clockOrZone');

          if (clockOrZone instanceof ZoneId) {
            return OffsetDateTime.now(Clock.system(clockOrZone));
          } else if (clockOrZone instanceof Clock) {
            var now = clockOrZone.instant();
            return OffsetDateTime.ofInstant(now, clockOrZone.zone().rules().offset(now));
          } else {
            throw new IllegalArgumentException('clockOrZone must be an instance of ZoneId or Clock');
          }
        }
      };

      OffsetDateTime.of = function of() {
        if (arguments.length <= 2) {
          return OffsetDateTime.ofDateTime.apply(this, arguments);
        } else if (arguments.length === 3) {
          return OffsetDateTime.ofDateAndTime.apply(this, arguments);
        } else {
          return OffsetDateTime.ofNumbers.apply(this, arguments);
        }
      };

      OffsetDateTime.ofDateTime = function ofDateTime(dateTime, offset) {
        return new OffsetDateTime(dateTime, offset);
      };

      OffsetDateTime.ofDateAndTime = function ofDateAndTime(date, time, offset) {
        var dt = LocalDateTime.of(date, time);
        return new OffsetDateTime(dt, offset);
      };

      OffsetDateTime.ofNumbers = function ofNumbers(year, month, dayOfMonth, hour, minute, second, nanoOfSecond, offset) {
        if (hour === void 0) {
          hour = 0;
        }

        if (minute === void 0) {
          minute = 0;
        }

        if (second === void 0) {
          second = 0;
        }

        if (nanoOfSecond === void 0) {
          nanoOfSecond = 0;
        }

        var dt = LocalDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoOfSecond);
        return new OffsetDateTime(dt, offset);
      };

      OffsetDateTime.ofInstant = function ofInstant(instant, zone) {
        requireNonNull(instant, 'instant');
        requireNonNull(zone, 'zone');
        var rules = zone.rules();
        var offset = rules.offset(instant);
        var ldt = LocalDateTime.ofEpochSecond(instant.epochSecond(), instant.nano(), offset);
        return new OffsetDateTime(ldt, offset);
      };

      OffsetDateTime.parse = function parse(text, formatter) {
        if (formatter === void 0) {
          formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
        }

        requireNonNull(formatter, 'formatter');
        return formatter.parse(text, OffsetDateTime.FROM);
      };

      function OffsetDateTime(dateTime, offset) {
        var _this;

        _this = _Temporal.call(this) || this;
        requireNonNull(dateTime, 'dateTime');
        requireInstance(dateTime, LocalDateTime, 'dateTime');
        requireNonNull(offset, 'offset');
        requireInstance(offset, ZoneOffset, 'offset');
        _this._dateTime = dateTime;
        _this._offset = offset;
        return _this;
      }

      var _proto = OffsetDateTime.prototype;

      _proto.adjustInto = function adjustInto(temporal) {
        return temporal.with(ChronoField.EPOCH_DAY, this.toLocalDate().toEpochDay()).with(ChronoField.NANO_OF_DAY, this.toLocalTime().toNanoOfDay()).with(ChronoField.OFFSET_SECONDS, this.offset().totalSeconds());
      };

      _proto.until = function until(endExclusive, unit) {
        var end = OffsetDateTime.from(endExclusive);

        if (unit instanceof ChronoUnit) {
          end = end.withOffsetSameInstant(this._offset);
          return this._dateTime.until(end._dateTime, unit);
        }

        return unit.between(this, end);
      };

      _proto.atZoneSameInstant = function atZoneSameInstant(zone) {
        return ZonedDateTime.ofInstant(this._dateTime, this._offset, zone);
      };

      _proto.atZoneSimilarLocal = function atZoneSimilarLocal(zone) {
        return ZonedDateTime.ofLocal(this._dateTime, zone, this._offset);
      };

      _proto.query = function query(_query) {
        requireNonNull(_query, 'query');

        if (_query === TemporalQueries.chronology()) {
          return IsoChronology.INSTANCE;
        } else if (_query === TemporalQueries.precision()) {
          return ChronoUnit.NANOS;
        } else if (_query === TemporalQueries.offset() || _query === TemporalQueries.zone()) {
          return this.offset();
        } else if (_query === TemporalQueries.localDate()) {
          return this.toLocalDate();
        } else if (_query === TemporalQueries.localTime()) {
          return this.toLocalTime();
        } else if (_query === TemporalQueries.zoneId()) {
          return null;
        }

        return _Temporal.prototype.query.call(this, _query);
      };

      _proto.get = function get(field) {
        if (field instanceof ChronoField) {
          switch (field) {
            case ChronoField.INSTANT_SECONDS:
              throw new DateTimeException("Field too large for an int: " + field);

            case ChronoField.OFFSET_SECONDS:
              return this.offset().totalSeconds();
          }

          return this._dateTime.get(field);
        }

        return _Temporal.prototype.get.call(this, field);
      };

      _proto.getLong = function getLong(field) {
        if (field instanceof ChronoField) {
          switch (field) {
            case ChronoField.INSTANT_SECONDS:
              return this.toEpochSecond();

            case ChronoField.OFFSET_SECONDS:
              return this.offset().totalSeconds();
          }

          return this._dateTime.getLong(field);
        }

        return field.getFrom(this);
      };

      _proto.offset = function offset() {
        return this._offset;
      };

      _proto.year = function year() {
        return this._dateTime.year();
      };

      _proto.monthValue = function monthValue() {
        return this._dateTime.monthValue();
      };

      _proto.month = function month() {
        return this._dateTime.month();
      };

      _proto.dayOfMonth = function dayOfMonth() {
        return this._dateTime.dayOfMonth();
      };

      _proto.dayOfYear = function dayOfYear() {
        return this._dateTime.dayOfYear();
      };

      _proto.dayOfWeek = function dayOfWeek() {
        return this._dateTime.dayOfWeek();
      };

      _proto.hour = function hour() {
        return this._dateTime.hour();
      };

      _proto.minute = function minute() {
        return this._dateTime.minute();
      };

      _proto.second = function second() {
        return this._dateTime.second();
      };

      _proto.nano = function nano() {
        return this._dateTime.nano();
      };

      _proto.toLocalDateTime = function toLocalDateTime() {
        return this._dateTime;
      };

      _proto.toLocalDate = function toLocalDate() {
        return this._dateTime.toLocalDate();
      };

      _proto.toLocalTime = function toLocalTime() {
        return this._dateTime.toLocalTime();
      };

      _proto.toOffsetTime = function toOffsetTime() {
        return OffsetTime.of(this._dateTime.toLocalTime(), this._offset);
      };

      _proto.toZonedDateTime = function toZonedDateTime() {
        return ZonedDateTime.of(this._dateTime, this._offset);
      };

      _proto.toInstant = function toInstant() {
        return this._dateTime.toInstant(this._offset);
      };

      _proto.toEpochSecond = function toEpochSecond() {
        return this._dateTime.toEpochSecond(this._offset);
      };

      _proto.isSupported = function isSupported(fieldOrUnit) {
        if (fieldOrUnit instanceof ChronoField) {
          return fieldOrUnit.isDateBased() || fieldOrUnit.isTimeBased();
        }

        if (fieldOrUnit instanceof ChronoUnit) {
          return fieldOrUnit.isDateBased() || fieldOrUnit.isTimeBased();
        }

        return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
      };

      _proto.range = function range(field) {
        if (field instanceof ChronoField) {
          if (field === ChronoField.INSTANT_SECONDS || field === ChronoField.OFFSET_SECONDS) {
            return field.range();
          }

          return this._dateTime.range(field);
        }

        return field.rangeRefinedBy(this);
      };

      _proto._withAdjuster = function _withAdjuster(adjuster) {
        requireNonNull(adjuster);

        if (adjuster instanceof LocalDate || adjuster instanceof LocalTime || adjuster instanceof LocalDateTime) {
          return this._withDateTimeOffset(this._dateTime.with(adjuster), this._offset);
        } else if (adjuster instanceof Instant) {
          return OffsetDateTime.ofInstant(adjuster, this._offset);
        } else if (adjuster instanceof ZoneOffset) {
          return this._withDateTimeOffset(this._dateTime, adjuster);
        } else if (adjuster instanceof OffsetDateTime) {
          return adjuster;
        }

        return adjuster.adjustInto(this);
      };

      _proto._withField = function _withField(field, newValue) {
        requireNonNull(field);

        if (field instanceof ChronoField) {
          var f = field;

          switch (f) {
            case ChronoField.INSTANT_SECONDS:
              return OffsetDateTime.ofInstant(Instant.ofEpochSecond(newValue, this.nano()), this._offset);

            case ChronoField.OFFSET_SECONDS:
              {
                return this._withDateTimeOffset(this._dateTime, ZoneOffset.ofTotalSeconds(f.checkValidIntValue(newValue)));
              }
          }

          return this._withDateTimeOffset(this._dateTime.with(field, newValue), this._offset);
        }

        return field.adjustInto(this, newValue);
      };

      _proto._withDateTimeOffset = function _withDateTimeOffset(dateTime, offset) {
        if (this._dateTime === dateTime && this._offset.equals(offset)) {
          return this;
        }

        return new OffsetDateTime(dateTime, offset);
      };

      _proto.withYear = function withYear(year) {
        return this._withDateTimeOffset(this._dateTime.withYear(year), this._offset);
      };

      _proto.withMonth = function withMonth(month) {
        return this._withDateTimeOffset(this._dateTime.withMonth(month), this._offset);
      };

      _proto.withDayOfMonth = function withDayOfMonth(dayOfMonth) {
        return this._withDateTimeOffset(this._dateTime.withDayOfMonth(dayOfMonth), this._offset);
      };

      _proto.withDayOfYear = function withDayOfYear(dayOfYear) {
        return this._withDateTimeOffset(this._dateTime.withDayOfYear(dayOfYear), this._offset);
      };

      _proto.withHour = function withHour(hour) {
        return this._withDateTimeOffset(this._dateTime.withHour(hour), this._offset);
      };

      _proto.withMinute = function withMinute(minute) {
        return this._withDateTimeOffset(this._dateTime.withMinute(minute), this._offset);
      };

      _proto.withSecond = function withSecond(second) {
        return this._withDateTimeOffset(this._dateTime.withSecond(second), this._offset);
      };

      _proto.withNano = function withNano(nanoOfSecond) {
        return this._withDateTimeOffset(this._dateTime.withNano(nanoOfSecond), this._offset);
      };

      _proto.withOffsetSameLocal = function withOffsetSameLocal(offset) {
        requireNonNull(offset, 'offset');
        return this._withDateTimeOffset(this._dateTime, offset);
      };

      _proto.withOffsetSameInstant = function withOffsetSameInstant(offset) {
        requireNonNull(offset, 'offset');

        if (offset.equals(this._offset)) {
          return this;
        }

        var difference = offset.totalSeconds() - this._offset.totalSeconds();

        var adjusted = this._dateTime.plusSeconds(difference);

        return new OffsetDateTime(adjusted, offset);
      };

      _proto.truncatedTo = function truncatedTo(unit) {
        return this._withDateTimeOffset(this._dateTime.truncatedTo(unit), this._offset);
      };

      _proto._plusAmount = function _plusAmount(amount) {
        requireNonNull(amount, 'amount');
        return amount.addTo(this);
      };

      _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
        if (unit instanceof ChronoUnit) {
          return this._withDateTimeOffset(this._dateTime.plus(amountToAdd, unit), this._offset);
        }

        return unit.addTo(this, amountToAdd);
      };

      _proto.plusYears = function plusYears(years) {
        return this._withDateTimeOffset(this._dateTime.plusYears(years), this._offset);
      };

      _proto.plusMonths = function plusMonths(months) {
        return this._withDateTimeOffset(this._dateTime.plusMonths(months), this._offset);
      };

      _proto.plusWeeks = function plusWeeks(weeks) {
        return this._withDateTimeOffset(this._dateTime.plusWeeks(weeks), this._offset);
      };

      _proto.plusDays = function plusDays(days) {
        return this._withDateTimeOffset(this._dateTime.plusDays(days), this._offset);
      };

      _proto.plusHours = function plusHours(hours) {
        return this._withDateTimeOffset(this._dateTime.plusHours(hours), this._offset);
      };

      _proto.plusMinutes = function plusMinutes(minutes) {
        return this._withDateTimeOffset(this._dateTime.plusMinutes(minutes), this._offset);
      };

      _proto.plusSeconds = function plusSeconds(seconds) {
        return this._withDateTimeOffset(this._dateTime.plusSeconds(seconds), this._offset);
      };

      _proto.plusNanos = function plusNanos(nanos) {
        return this._withDateTimeOffset(this._dateTime.plusNanos(nanos), this._offset);
      };

      _proto._minusAmount = function _minusAmount(amount) {
        requireNonNull(amount);
        return amount.subtractFrom(this);
      };

      _proto._minusUnit = function _minusUnit(amountToSubtract, unit) {
        return this.plus(-1 * amountToSubtract, unit);
      };

      _proto.minusYears = function minusYears(years) {
        return this._withDateTimeOffset(this._dateTime.minusYears(years), this._offset);
      };

      _proto.minusMonths = function minusMonths(months) {
        return this._withDateTimeOffset(this._dateTime.minusMonths(months), this._offset);
      };

      _proto.minusWeeks = function minusWeeks(weeks) {
        return this._withDateTimeOffset(this._dateTime.minusWeeks(weeks), this._offset);
      };

      _proto.minusDays = function minusDays(days) {
        return this._withDateTimeOffset(this._dateTime.minusDays(days), this._offset);
      };

      _proto.minusHours = function minusHours(hours) {
        return this._withDateTimeOffset(this._dateTime.minusHours(hours), this._offset);
      };

      _proto.minusMinutes = function minusMinutes(minutes) {
        return this._withDateTimeOffset(this._dateTime.minusMinutes(minutes), this._offset);
      };

      _proto.minusSeconds = function minusSeconds(seconds) {
        return this._withDateTimeOffset(this._dateTime.minusSeconds(seconds), this._offset);
      };

      _proto.minusNanos = function minusNanos(nanos) {
        return this._withDateTimeOffset(this._dateTime.minusNanos(nanos), this._offset);
      };

      _proto.compareTo = function compareTo(other) {
        requireNonNull(other, 'other');
        requireInstance(other, OffsetDateTime, 'other');

        if (this.offset().equals(other.offset())) {
          return this.toLocalDateTime().compareTo(other.toLocalDateTime());
        }

        var cmp = MathUtil.compareNumbers(this.toEpochSecond(), other.toEpochSecond());

        if (cmp === 0) {
          cmp = this.toLocalTime().nano() - other.toLocalTime().nano();

          if (cmp === 0) {
            cmp = this.toLocalDateTime().compareTo(other.toLocalDateTime());
          }
        }

        return cmp;
      };

      _proto.isAfter = function isAfter(other) {
        requireNonNull(other, 'other');
        var thisEpochSec = this.toEpochSecond();
        var otherEpochSec = other.toEpochSecond();
        return thisEpochSec > otherEpochSec || thisEpochSec === otherEpochSec && this.toLocalTime().nano() > other.toLocalTime().nano();
      };

      _proto.isBefore = function isBefore(other) {
        requireNonNull(other, 'other');
        var thisEpochSec = this.toEpochSecond();
        var otherEpochSec = other.toEpochSecond();
        return thisEpochSec < otherEpochSec || thisEpochSec === otherEpochSec && this.toLocalTime().nano() < other.toLocalTime().nano();
      };

      _proto.isEqual = function isEqual(other) {
        requireNonNull(other, 'other');
        return this.toEpochSecond() === other.toEpochSecond() && this.toLocalTime().nano() === other.toLocalTime().nano();
      };

      _proto.equals = function equals(other) {
        if (this === other) {
          return true;
        }

        if (other instanceof OffsetDateTime) {
          return this._dateTime.equals(other._dateTime) && this._offset.equals(other._offset);
        }

        return false;
      };

      _proto.hashCode = function hashCode() {
        return this._dateTime.hashCode() ^ this._offset.hashCode();
      };

      _proto.toString = function toString() {
        return this._dateTime.toString() + this._offset.toString();
      };

      _proto.toJSON = function toJSON() {
        return this.toString();
      };

      _proto.format = function format(formatter) {
        requireNonNull(formatter, 'formatter');
        return formatter.format(this);
      };

      return OffsetDateTime;
    }(Temporal);
    function _init$6() {
      OffsetDateTime.MIN = LocalDateTime.MIN.atOffset(ZoneOffset.MAX);
      OffsetDateTime.MAX = LocalDateTime.MAX.atOffset(ZoneOffset.MIN);
      OffsetDateTime.FROM = createTemporalQuery('OffsetDateTime.FROM', function (temporal) {
        return OffsetDateTime.from(temporal);
      });
    }

    var DAYS_PER_CYCLE = 146097;
    var DAYS_0000_TO_1970 = DAYS_PER_CYCLE * 5 - (30 * 365 + 7);
    var LocalDate = function (_ChronoLocalDate) {
      _inheritsLoose(LocalDate, _ChronoLocalDate);

      LocalDate.now = function now(clockOrZone) {
        var clock;

        if (clockOrZone == null) {
          clock = Clock.systemDefaultZone();
        } else if (clockOrZone instanceof ZoneId) {
          clock = Clock.system(clockOrZone);
        } else {
          clock = clockOrZone;
        }

        return LocalDate.ofInstant(clock.instant(), clock.zone());
      };

      LocalDate.ofInstant = function ofInstant(instant, zone) {
        if (zone === void 0) {
          zone = ZoneId.systemDefault();
        }

        requireNonNull(instant, 'instant');
        var offset = zone.rules().offset(instant);
        var epochSec = instant.epochSecond() + offset.totalSeconds();
        var epochDay = MathUtil.floorDiv(epochSec, LocalTime.SECONDS_PER_DAY);
        return LocalDate.ofEpochDay(epochDay);
      };

      LocalDate.of = function of(year, month, dayOfMonth) {
        return new LocalDate(year, month, dayOfMonth);
      };

      LocalDate.ofYearDay = function ofYearDay(year, dayOfYear) {
        ChronoField.YEAR.checkValidValue(year);
        var leap = IsoChronology.isLeapYear(year);

        if (dayOfYear === 366 && leap === false) {
          assert(false, "Invalid date 'DayOfYear 366' as '" + year + "' is not a leap year", DateTimeException);
        }

        var moy = Month.of(Math.floor((dayOfYear - 1) / 31 + 1));
        var monthEnd = moy.firstDayOfYear(leap) + moy.length(leap) - 1;

        if (dayOfYear > monthEnd) {
          moy = moy.plus(1);
        }

        var dom = dayOfYear - moy.firstDayOfYear(leap) + 1;
        return new LocalDate(year, moy.value(), dom);
      };

      LocalDate.ofEpochDay = function ofEpochDay(epochDay) {
        if (epochDay === void 0) {
          epochDay = 0;
        }

        var adjust, adjustCycles, doyEst, yearEst, zeroDay;
        zeroDay = epochDay + DAYS_0000_TO_1970;
        zeroDay -= 60;
        adjust = 0;

        if (zeroDay < 0) {
          adjustCycles = MathUtil.intDiv(zeroDay + 1, DAYS_PER_CYCLE) - 1;
          adjust = adjustCycles * 400;
          zeroDay += -adjustCycles * DAYS_PER_CYCLE;
        }

        yearEst = MathUtil.intDiv(400 * zeroDay + 591, DAYS_PER_CYCLE);
        doyEst = zeroDay - (365 * yearEst + MathUtil.intDiv(yearEst, 4) - MathUtil.intDiv(yearEst, 100) + MathUtil.intDiv(yearEst, 400));

        if (doyEst < 0) {
          yearEst--;
          doyEst = zeroDay - (365 * yearEst + MathUtil.intDiv(yearEst, 4) - MathUtil.intDiv(yearEst, 100) + MathUtil.intDiv(yearEst, 400));
        }

        yearEst += adjust;
        var marchDoy0 = doyEst;
        var marchMonth0 = MathUtil.intDiv(marchDoy0 * 5 + 2, 153);
        var month = (marchMonth0 + 2) % 12 + 1;
        var dom = marchDoy0 - MathUtil.intDiv(marchMonth0 * 306 + 5, 10) + 1;
        yearEst += MathUtil.intDiv(marchMonth0, 10);
        var year = yearEst;
        return new LocalDate(year, month, dom);
      };

      LocalDate.from = function from(temporal) {
        requireNonNull(temporal, 'temporal');
        var date = temporal.query(TemporalQueries.localDate());

        if (date == null) {
          throw new DateTimeException("Unable to obtain LocalDate from TemporalAccessor: " + temporal + ", type " + (temporal.constructor != null ? temporal.constructor.name : ''));
        }

        return date;
      };

      LocalDate.parse = function parse(text, formatter) {
        if (formatter === void 0) {
          formatter = DateTimeFormatter.ISO_LOCAL_DATE;
        }

        assert(formatter != null, 'formatter', NullPointerException);
        return formatter.parse(text, LocalDate.FROM);
      };

      LocalDate._resolvePreviousValid = function _resolvePreviousValid(year, month, day) {
        switch (month) {
          case 2:
            day = Math.min(day, IsoChronology.isLeapYear(year) ? 29 : 28);
            break;

          case 4:
          case 6:
          case 9:
          case 11:
            day = Math.min(day, 30);
            break;
        }

        return LocalDate.of(year, month, day);
      };

      function LocalDate(year, month, dayOfMonth) {
        var _this;

        _this = _ChronoLocalDate.call(this) || this;
        requireNonNull(year, 'year');
        requireNonNull(month, 'month');
        requireNonNull(dayOfMonth, 'dayOfMonth');

        if (month instanceof Month) {
          month = month.value();
        }

        _this._year = MathUtil.safeToInt(year);
        _this._month = MathUtil.safeToInt(month);
        _this._day = MathUtil.safeToInt(dayOfMonth);

        LocalDate._validate(_this._year, _this._month, _this._day);

        return _this;
      }

      LocalDate._validate = function _validate(year, month, dayOfMonth) {
        var dom;
        ChronoField.YEAR.checkValidValue(year);
        ChronoField.MONTH_OF_YEAR.checkValidValue(month);
        ChronoField.DAY_OF_MONTH.checkValidValue(dayOfMonth);

        if (dayOfMonth > 28) {
          dom = 31;

          switch (month) {
            case 2:
              dom = IsoChronology.isLeapYear(year) ? 29 : 28;
              break;

            case 4:
            case 6:
            case 9:
            case 11:
              dom = 30;
          }

          if (dayOfMonth > dom) {
            if (dayOfMonth === 29) {
              assert(false, "Invalid date 'February 29' as '" + year + "' is not a leap year", DateTimeException);
            } else {
              assert(false, "Invalid date '" + year + "' '" + month + "' '" + dayOfMonth + "'", DateTimeException);
            }
          }
        }
      };

      var _proto = LocalDate.prototype;

      _proto.isSupported = function isSupported(field) {
        return _ChronoLocalDate.prototype.isSupported.call(this, field);
      };

      _proto.range = function range(field) {
        if (field instanceof ChronoField) {
          if (field.isDateBased()) {
            switch (field) {
              case ChronoField.DAY_OF_MONTH:
                return ValueRange.of(1, this.lengthOfMonth());

              case ChronoField.DAY_OF_YEAR:
                return ValueRange.of(1, this.lengthOfYear());

              case ChronoField.ALIGNED_WEEK_OF_MONTH:
                return ValueRange.of(1, this.month() === Month.FEBRUARY && this.isLeapYear() === false ? 4 : 5);

              case ChronoField.YEAR_OF_ERA:
                return this._year <= 0 ? ValueRange.of(1, Year.MAX_VALUE + 1) : ValueRange.of(1, Year.MAX_VALUE);
            }

            return field.range();
          }

          throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
        }

        return field.rangeRefinedBy(this);
      };

      _proto.get = function get(field) {
        return this.getLong(field);
      };

      _proto.getLong = function getLong(field) {
        assert(field != null, '', NullPointerException);

        if (field instanceof ChronoField) {
          return this._get0(field);
        }

        return field.getFrom(this);
      };

      _proto._get0 = function _get0(field) {
        switch (field) {
          case ChronoField.DAY_OF_WEEK:
            return this.dayOfWeek().value();

          case ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH:
            return MathUtil.intMod(this._day - 1, 7) + 1;

          case ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR:
            return MathUtil.intMod(this.dayOfYear() - 1, 7) + 1;

          case ChronoField.DAY_OF_MONTH:
            return this._day;

          case ChronoField.DAY_OF_YEAR:
            return this.dayOfYear();

          case ChronoField.EPOCH_DAY:
            return this.toEpochDay();

          case ChronoField.ALIGNED_WEEK_OF_MONTH:
            return MathUtil.intDiv(this._day - 1, 7) + 1;

          case ChronoField.ALIGNED_WEEK_OF_YEAR:
            return MathUtil.intDiv(this.dayOfYear() - 1, 7) + 1;

          case ChronoField.MONTH_OF_YEAR:
            return this._month;

          case ChronoField.PROLEPTIC_MONTH:
            return this._prolepticMonth();

          case ChronoField.YEAR_OF_ERA:
            return this._year >= 1 ? this._year : 1 - this._year;

          case ChronoField.YEAR:
            return this._year;

          case ChronoField.ERA:
            return this._year >= 1 ? 1 : 0;
        }

        throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
      };

      _proto._prolepticMonth = function _prolepticMonth() {
        return this._year * 12 + (this._month - 1);
      };

      _proto.chronology = function chronology() {
        return IsoChronology.INSTANCE;
      };

      _proto.year = function year() {
        return this._year;
      };

      _proto.monthValue = function monthValue() {
        return this._month;
      };

      _proto.month = function month() {
        return Month.of(this._month);
      };

      _proto.dayOfMonth = function dayOfMonth() {
        return this._day;
      };

      _proto.dayOfYear = function dayOfYear() {
        return this.month().firstDayOfYear(this.isLeapYear()) + this._day - 1;
      };

      _proto.dayOfWeek = function dayOfWeek() {
        var dow0 = MathUtil.floorMod(this.toEpochDay() + 3, 7);
        return DayOfWeek.of(dow0 + 1);
      };

      _proto.isLeapYear = function isLeapYear() {
        return IsoChronology.isLeapYear(this._year);
      };

      _proto.lengthOfMonth = function lengthOfMonth() {
        switch (this._month) {
          case 2:
            return this.isLeapYear() ? 29 : 28;

          case 4:
          case 6:
          case 9:
          case 11:
            return 30;

          default:
            return 31;
        }
      };

      _proto.lengthOfYear = function lengthOfYear() {
        return this.isLeapYear() ? 366 : 365;
      };

      _proto._withAdjuster = function _withAdjuster(adjuster) {
        requireNonNull(adjuster, 'adjuster');

        if (adjuster instanceof LocalDate) {
          return adjuster;
        }

        return _ChronoLocalDate.prototype._withAdjuster.call(this, adjuster);
      };

      _proto._withField = function _withField(field, newValue) {
        assert(field != null, 'field', NullPointerException);

        if (field instanceof ChronoField) {
          var f = field;
          f.checkValidValue(newValue);

          switch (f) {
            case ChronoField.DAY_OF_WEEK:
              return this.plusDays(newValue - this.dayOfWeek().value());

            case ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH:
              return this.plusDays(newValue - this.getLong(ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH));

            case ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR:
              return this.plusDays(newValue - this.getLong(ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR));

            case ChronoField.DAY_OF_MONTH:
              return this.withDayOfMonth(newValue);

            case ChronoField.DAY_OF_YEAR:
              return this.withDayOfYear(newValue);

            case ChronoField.EPOCH_DAY:
              return LocalDate.ofEpochDay(newValue);

            case ChronoField.ALIGNED_WEEK_OF_MONTH:
              return this.plusWeeks(newValue - this.getLong(ChronoField.ALIGNED_WEEK_OF_MONTH));

            case ChronoField.ALIGNED_WEEK_OF_YEAR:
              return this.plusWeeks(newValue - this.getLong(ChronoField.ALIGNED_WEEK_OF_YEAR));

            case ChronoField.MONTH_OF_YEAR:
              return this.withMonth(newValue);

            case ChronoField.PROLEPTIC_MONTH:
              return this.plusMonths(newValue - this.getLong(ChronoField.PROLEPTIC_MONTH));

            case ChronoField.YEAR_OF_ERA:
              return this.withYear(this._year >= 1 ? newValue : 1 - newValue);

            case ChronoField.YEAR:
              return this.withYear(newValue);

            case ChronoField.ERA:
              return this.getLong(ChronoField.ERA) === newValue ? this : this.withYear(1 - this._year);
          }

          throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
        }

        return field.adjustInto(this, newValue);
      };

      _proto.withYear = function withYear(year) {
        if (this._year === year) {
          return this;
        }

        ChronoField.YEAR.checkValidValue(year);
        return LocalDate._resolvePreviousValid(year, this._month, this._day);
      };

      _proto.withMonth = function withMonth(month) {
        var m = month instanceof Month ? month.value() : month;

        if (this._month === m) {
          return this;
        }

        ChronoField.MONTH_OF_YEAR.checkValidValue(m);
        return LocalDate._resolvePreviousValid(this._year, m, this._day);
      };

      _proto.withDayOfMonth = function withDayOfMonth(dayOfMonth) {
        if (this._day === dayOfMonth) {
          return this;
        }

        return LocalDate.of(this._year, this._month, dayOfMonth);
      };

      _proto.withDayOfYear = function withDayOfYear(dayOfYear) {
        if (this.dayOfYear() === dayOfYear) {
          return this;
        }

        return LocalDate.ofYearDay(this._year, dayOfYear);
      };

      _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
        requireNonNull(amountToAdd, 'amountToAdd');
        requireNonNull(unit, 'unit');

        if (unit instanceof ChronoUnit) {
          switch (unit) {
            case ChronoUnit.DAYS:
              return this.plusDays(amountToAdd);

            case ChronoUnit.WEEKS:
              return this.plusWeeks(amountToAdd);

            case ChronoUnit.MONTHS:
              return this.plusMonths(amountToAdd);

            case ChronoUnit.YEARS:
              return this.plusYears(amountToAdd);

            case ChronoUnit.DECADES:
              return this.plusYears(MathUtil.safeMultiply(amountToAdd, 10));

            case ChronoUnit.CENTURIES:
              return this.plusYears(MathUtil.safeMultiply(amountToAdd, 100));

            case ChronoUnit.MILLENNIA:
              return this.plusYears(MathUtil.safeMultiply(amountToAdd, 1000));

            case ChronoUnit.ERAS:
              return this.with(ChronoField.ERA, MathUtil.safeAdd(this.getLong(ChronoField.ERA), amountToAdd));
          }

          throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
        }

        return unit.addTo(this, amountToAdd);
      };

      _proto.plusYears = function plusYears(yearsToAdd) {
        if (yearsToAdd === 0) {
          return this;
        }

        var newYear = ChronoField.YEAR.checkValidIntValue(this._year + yearsToAdd);
        return LocalDate._resolvePreviousValid(newYear, this._month, this._day);
      };

      _proto.plusMonths = function plusMonths(monthsToAdd) {
        if (monthsToAdd === 0) {
          return this;
        }

        var monthCount = this._year * 12 + (this._month - 1);
        var calcMonths = monthCount + monthsToAdd;
        var newYear = ChronoField.YEAR.checkValidIntValue(MathUtil.floorDiv(calcMonths, 12));
        var newMonth = MathUtil.floorMod(calcMonths, 12) + 1;
        return LocalDate._resolvePreviousValid(newYear, newMonth, this._day);
      };

      _proto.plusWeeks = function plusWeeks(weeksToAdd) {
        return this.plusDays(MathUtil.safeMultiply(weeksToAdd, 7));
      };

      _proto.plusDays = function plusDays(daysToAdd) {
        if (daysToAdd === 0) {
          return this;
        }

        var mjDay = MathUtil.safeAdd(this.toEpochDay(), daysToAdd);
        return LocalDate.ofEpochDay(mjDay);
      };

      _proto._minusUnit = function _minusUnit(amountToSubtract, unit) {
        requireNonNull(amountToSubtract, 'amountToSubtract');
        requireNonNull(unit, 'unit');
        return this._plusUnit(-1 * amountToSubtract, unit);
      };

      _proto.minusYears = function minusYears(yearsToSubtract) {
        return this.plusYears(yearsToSubtract * -1);
      };

      _proto.minusMonths = function minusMonths(monthsToSubtract) {
        return this.plusMonths(monthsToSubtract * -1);
      };

      _proto.minusWeeks = function minusWeeks(weeksToSubtract) {
        return this.plusWeeks(weeksToSubtract * -1);
      };

      _proto.minusDays = function minusDays(daysToSubtract) {
        return this.plusDays(daysToSubtract * -1);
      };

      _proto.query = function query(_query) {
        requireNonNull(_query, 'query');

        if (_query === TemporalQueries.localDate()) {
          return this;
        }

        return _ChronoLocalDate.prototype.query.call(this, _query);
      };

      _proto.adjustInto = function adjustInto(temporal) {
        return _ChronoLocalDate.prototype.adjustInto.call(this, temporal);
      };

      _proto.until = function until(p1, p2) {
        if (arguments.length < 2) {
          return this.until1(p1);
        } else {
          return this.until2(p1, p2);
        }
      };

      _proto.until2 = function until2(endExclusive, unit) {
        var end = LocalDate.from(endExclusive);

        if (unit instanceof ChronoUnit) {
          switch (unit) {
            case ChronoUnit.DAYS:
              return this.daysUntil(end);

            case ChronoUnit.WEEKS:
              return MathUtil.intDiv(this.daysUntil(end), 7);

            case ChronoUnit.MONTHS:
              return this._monthsUntil(end);

            case ChronoUnit.YEARS:
              return MathUtil.intDiv(this._monthsUntil(end), 12);

            case ChronoUnit.DECADES:
              return MathUtil.intDiv(this._monthsUntil(end), 120);

            case ChronoUnit.CENTURIES:
              return MathUtil.intDiv(this._monthsUntil(end), 1200);

            case ChronoUnit.MILLENNIA:
              return MathUtil.intDiv(this._monthsUntil(end), 12000);

            case ChronoUnit.ERAS:
              return end.getLong(ChronoField.ERA) - this.getLong(ChronoField.ERA);
          }

          throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
        }

        return unit.between(this, end);
      };

      _proto.daysUntil = function daysUntil(end) {
        return end.toEpochDay() - this.toEpochDay();
      };

      _proto._monthsUntil = function _monthsUntil(end) {
        var packed1 = this._prolepticMonth() * 32 + this.dayOfMonth();
        var packed2 = end._prolepticMonth() * 32 + end.dayOfMonth();
        return MathUtil.intDiv(packed2 - packed1, 32);
      };

      _proto.until1 = function until1(endDate) {
        var end = LocalDate.from(endDate);

        var totalMonths = end._prolepticMonth() - this._prolepticMonth();

        var days = end._day - this._day;

        if (totalMonths > 0 && days < 0) {
          totalMonths--;
          var calcDate = this.plusMonths(totalMonths);
          days = end.toEpochDay() - calcDate.toEpochDay();
        } else if (totalMonths < 0 && days > 0) {
          totalMonths++;
          days -= end.lengthOfMonth();
        }

        var years = MathUtil.intDiv(totalMonths, 12);
        var months = MathUtil.intMod(totalMonths, 12);
        return Period.of(years, months, days);
      };

      _proto.atTime = function atTime() {
        if (arguments.length === 1) {
          return this.atTime1.apply(this, arguments);
        } else {
          return this.atTime4.apply(this, arguments);
        }
      };

      _proto.atTime1 = function atTime1(time) {
        requireNonNull(time, 'time');

        if (time instanceof LocalTime) {
          return LocalDateTime.of(this, time);
        } else if (time instanceof OffsetTime) {
          return this._atTimeOffsetTime(time);
        } else {
          throw new IllegalArgumentException("time must be an instance of LocalTime or OffsetTime" + (time && time.constructor && time.constructor.name ? ", but is " + time.constructor.name : ''));
        }
      };

      _proto.atTime4 = function atTime4(hour, minute, second, nanoOfSecond) {
        if (second === void 0) {
          second = 0;
        }

        if (nanoOfSecond === void 0) {
          nanoOfSecond = 0;
        }

        return this.atTime1(LocalTime.of(hour, minute, second, nanoOfSecond));
      };

      _proto._atTimeOffsetTime = function _atTimeOffsetTime(time) {
        return OffsetDateTime.of(LocalDateTime.of(this, time.toLocalTime()), time.offset());
      };

      _proto.atStartOfDay = function atStartOfDay(zone) {
        if (zone != null) {
          return this._atStartOfDayWithZone(zone);
        } else {
          return LocalDateTime.of(this, LocalTime.MIDNIGHT);
        }
      };

      _proto._atStartOfDayWithZone = function _atStartOfDayWithZone(zone) {
        requireNonNull(zone, 'zone');
        var ldt = this.atTime(LocalTime.MIDNIGHT);

        if (zone instanceof ZoneOffset === false) {
          var trans = zone.rules().transition(ldt);

          if (trans != null && trans.isGap()) {
            ldt = trans.dateTimeAfter();
          }
        }

        return ZonedDateTime.of(ldt, zone);
      };

      _proto.toEpochDay = function toEpochDay() {
        var y = this._year;
        var m = this._month;
        var total = 0;
        total += 365 * y;

        if (y >= 0) {
          total += MathUtil.intDiv(y + 3, 4) - MathUtil.intDiv(y + 99, 100) + MathUtil.intDiv(y + 399, 400);
        } else {
          total -= MathUtil.intDiv(y, -4) - MathUtil.intDiv(y, -100) + MathUtil.intDiv(y, -400);
        }

        total += MathUtil.intDiv(367 * m - 362, 12);
        total += this.dayOfMonth() - 1;

        if (m > 2) {
          total--;

          if (!IsoChronology.isLeapYear(y)) {
            total--;
          }
        }

        return total - DAYS_0000_TO_1970;
      };

      _proto.compareTo = function compareTo(other) {
        requireNonNull(other, 'other');
        requireInstance(other, LocalDate, 'other');
        return this._compareTo0(other);
      };

      _proto._compareTo0 = function _compareTo0(otherDate) {
        var cmp = this._year - otherDate._year;

        if (cmp === 0) {
          cmp = this._month - otherDate._month;

          if (cmp === 0) {
            cmp = this._day - otherDate._day;
          }
        }

        return cmp;
      };

      _proto.isAfter = function isAfter(other) {
        return this.compareTo(other) > 0;
      };

      _proto.isBefore = function isBefore(other) {
        return this.compareTo(other) < 0;
      };

      _proto.isEqual = function isEqual(other) {
        return this.compareTo(other) === 0;
      };

      _proto.equals = function equals(other) {
        if (this === other) {
          return true;
        }

        if (other instanceof LocalDate) {
          return this._compareTo0(other) === 0;
        }

        return false;
      };

      _proto.hashCode = function hashCode() {
        var yearValue = this._year;
        var monthValue = this._month;
        var dayValue = this._day;
        return MathUtil.hash(yearValue & 0xFFFFF800 ^ (yearValue << 11) + (monthValue << 6) + dayValue);
      };

      _proto.toString = function toString() {
        var dayString, monthString, yearString;
        var yearValue = this._year;
        var monthValue = this._month;
        var dayValue = this._day;
        var absYear = Math.abs(yearValue);

        if (absYear < 1000) {
          if (yearValue < 0) {
            yearString = "-" + ("" + (yearValue - 10000)).slice(-4);
          } else {
            yearString = ("" + (yearValue + 10000)).slice(-4);
          }
        } else {
          if (yearValue > 9999) {
            yearString = "+" + yearValue;
          } else {
            yearString = "" + yearValue;
          }
        }

        if (monthValue < 10) {
          monthString = "-0" + monthValue;
        } else {
          monthString = "-" + monthValue;
        }

        if (dayValue < 10) {
          dayString = "-0" + dayValue;
        } else {
          dayString = "-" + dayValue;
        }

        return yearString + monthString + dayString;
      };

      _proto.toJSON = function toJSON() {
        return this.toString();
      };

      _proto.format = function format(formatter) {
        requireNonNull(formatter, 'formatter');
        requireInstance(formatter, DateTimeFormatter, 'formatter');
        return _ChronoLocalDate.prototype.format.call(this, formatter);
      };

      return LocalDate;
    }(ChronoLocalDate);
    function _init$5() {
      LocalDate.MIN = LocalDate.of(YearConstants.MIN_VALUE, 1, 1);
      LocalDate.MAX = LocalDate.of(YearConstants.MAX_VALUE, 12, 31);
      LocalDate.EPOCH_0 = LocalDate.ofEpochDay(0);
      LocalDate.FROM = createTemporalQuery('LocalDate.FROM', function (temporal) {
        return LocalDate.from(temporal);
      });
    }

    var ChronoLocalDateTime = function (_Temporal) {
      _inheritsLoose(ChronoLocalDateTime, _Temporal);

      function ChronoLocalDateTime() {
        return _Temporal.apply(this, arguments) || this;
      }

      var _proto = ChronoLocalDateTime.prototype;

      _proto.chronology = function chronology() {
        return this.toLocalDate().chronology();
      };

      _proto.query = function query(_query) {
        if (_query === TemporalQueries.chronology()) {
          return this.chronology();
        } else if (_query === TemporalQueries.precision()) {
          return ChronoUnit.NANOS;
        } else if (_query === TemporalQueries.localDate()) {
          return LocalDate.ofEpochDay(this.toLocalDate().toEpochDay());
        } else if (_query === TemporalQueries.localTime()) {
          return this.toLocalTime();
        } else if (_query === TemporalQueries.zone() || _query === TemporalQueries.zoneId() || _query === TemporalQueries.offset()) {
          return null;
        }

        return _Temporal.prototype.query.call(this, _query);
      };

      _proto.adjustInto = function adjustInto(temporal) {
        return temporal.with(ChronoField.EPOCH_DAY, this.toLocalDate().toEpochDay()).with(ChronoField.NANO_OF_DAY, this.toLocalTime().toNanoOfDay());
      };

      _proto.toInstant = function toInstant(offset) {
        requireInstance(offset, ZoneOffset, 'zoneId');
        return Instant.ofEpochSecond(this.toEpochSecond(offset), this.toLocalTime().nano());
      };

      _proto.toEpochSecond = function toEpochSecond(offset) {
        requireNonNull(offset, 'offset');
        var epochDay = this.toLocalDate().toEpochDay();
        var secs = epochDay * 86400 + this.toLocalTime().toSecondOfDay();
        secs -= offset.totalSeconds();
        return MathUtil.safeToInt(secs);
      };

      return ChronoLocalDateTime;
    }(Temporal);

    var LocalDateTime = function (_ChronoLocalDateTime) {
      _inheritsLoose(LocalDateTime, _ChronoLocalDateTime);

      LocalDateTime.now = function now(clockOrZone) {
        if (clockOrZone == null) {
          return LocalDateTime._now(Clock.systemDefaultZone());
        } else if (clockOrZone instanceof Clock) {
          return LocalDateTime._now(clockOrZone);
        } else {
          return LocalDateTime._now(Clock.system(clockOrZone));
        }
      };

      LocalDateTime._now = function _now(clock) {
        requireNonNull(clock, 'clock');
        return LocalDateTime.ofInstant(clock.instant(), clock.zone());
      };

      LocalDateTime._ofEpochMillis = function _ofEpochMillis(epochMilli, offset) {
        var localSecond = MathUtil.floorDiv(epochMilli, 1000) + offset.totalSeconds();
        var localEpochDay = MathUtil.floorDiv(localSecond, LocalTime.SECONDS_PER_DAY);
        var secsOfDay = MathUtil.floorMod(localSecond, LocalTime.SECONDS_PER_DAY);
        var nanoOfSecond = MathUtil.floorMod(epochMilli, 1000) * 1000000;
        var date = LocalDate.ofEpochDay(localEpochDay);
        var time = LocalTime.ofSecondOfDay(secsOfDay, nanoOfSecond);
        return new LocalDateTime(date, time);
      };

      LocalDateTime.of = function of() {
        if (arguments.length <= 2) {
          return LocalDateTime.ofDateAndTime.apply(this, arguments);
        } else {
          return LocalDateTime.ofNumbers.apply(this, arguments);
        }
      };

      LocalDateTime.ofNumbers = function ofNumbers(year, month, dayOfMonth, hour, minute, second, nanoOfSecond) {
        if (hour === void 0) {
          hour = 0;
        }

        if (minute === void 0) {
          minute = 0;
        }

        if (second === void 0) {
          second = 0;
        }

        if (nanoOfSecond === void 0) {
          nanoOfSecond = 0;
        }

        var date = LocalDate.of(year, month, dayOfMonth);
        var time = LocalTime.of(hour, minute, second, nanoOfSecond);
        return new LocalDateTime(date, time);
      };

      LocalDateTime.ofDateAndTime = function ofDateAndTime(date, time) {
        requireNonNull(date, 'date');
        requireNonNull(time, 'time');
        return new LocalDateTime(date, time);
      };

      LocalDateTime.ofInstant = function ofInstant(instant, zone) {
        if (zone === void 0) {
          zone = ZoneId.systemDefault();
        }

        requireNonNull(instant, 'instant');
        requireInstance(instant, Instant, 'instant');
        requireNonNull(zone, 'zone');
        var offset = zone.rules().offset(instant);
        return LocalDateTime.ofEpochSecond(instant.epochSecond(), instant.nano(), offset);
      };

      LocalDateTime.ofEpochSecond = function ofEpochSecond(epochSecond, nanoOfSecond, offset) {
        if (epochSecond === void 0) {
          epochSecond = 0;
        }

        if (nanoOfSecond === void 0) {
          nanoOfSecond = 0;
        }

        if (arguments.length === 2 && nanoOfSecond instanceof ZoneOffset) {
          offset = nanoOfSecond;
          nanoOfSecond = 0;
        }

        requireNonNull(offset, 'offset');
        var localSecond = epochSecond + offset.totalSeconds();
        var localEpochDay = MathUtil.floorDiv(localSecond, LocalTime.SECONDS_PER_DAY);
        var secsOfDay = MathUtil.floorMod(localSecond, LocalTime.SECONDS_PER_DAY);
        var date = LocalDate.ofEpochDay(localEpochDay);
        var time = LocalTime.ofSecondOfDay(secsOfDay, nanoOfSecond);
        return new LocalDateTime(date, time);
      };

      LocalDateTime.from = function from(temporal) {
        requireNonNull(temporal, 'temporal');

        if (temporal instanceof LocalDateTime) {
          return temporal;
        } else if (temporal instanceof ZonedDateTime) {
          return temporal.toLocalDateTime();
        }

        try {
          var date = LocalDate.from(temporal);
          var time = LocalTime.from(temporal);
          return new LocalDateTime(date, time);
        } catch (ex) {
          throw new DateTimeException("Unable to obtain LocalDateTime TemporalAccessor: " + temporal + ", type " + (temporal.constructor != null ? temporal.constructor.name : ''));
        }
      };

      LocalDateTime.parse = function parse(text, formatter) {
        if (formatter === void 0) {
          formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
        }

        requireNonNull(formatter, 'formatter');
        return formatter.parse(text, LocalDateTime.FROM);
      };

      function LocalDateTime(date, time) {
        var _this;

        _this = _ChronoLocalDateTime.call(this) || this;
        requireInstance(date, LocalDate, 'date');
        requireInstance(time, LocalTime, 'time');
        _this._date = date;
        _this._time = time;
        return _this;
      }

      var _proto = LocalDateTime.prototype;

      _proto._withDateTime = function _withDateTime(newDate, newTime) {
        if (this._date.equals(newDate) && this._time.equals(newTime)) {
          return this;
        }

        return new LocalDateTime(newDate, newTime);
      };

      _proto.isSupported = function isSupported(fieldOrUnit) {
        if (fieldOrUnit instanceof ChronoField) {
          return fieldOrUnit.isDateBased() || fieldOrUnit.isTimeBased();
        } else if (fieldOrUnit instanceof ChronoUnit) {
          return fieldOrUnit.isDateBased() || fieldOrUnit.isTimeBased();
        }

        return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
      };

      _proto.range = function range(field) {
        if (field instanceof ChronoField) {
          return field.isTimeBased() ? this._time.range(field) : this._date.range(field);
        }

        return field.rangeRefinedBy(this);
      };

      _proto.get = function get(field) {
        if (field instanceof ChronoField) {
          return field.isTimeBased() ? this._time.get(field) : this._date.get(field);
        }

        return _ChronoLocalDateTime.prototype.get.call(this, field);
      };

      _proto.getLong = function getLong(field) {
        requireNonNull(field, 'field');

        if (field instanceof ChronoField) {
          return field.isTimeBased() ? this._time.getLong(field) : this._date.getLong(field);
        }

        return field.getFrom(this);
      };

      _proto.year = function year() {
        return this._date.year();
      };

      _proto.monthValue = function monthValue() {
        return this._date.monthValue();
      };

      _proto.month = function month() {
        return this._date.month();
      };

      _proto.dayOfMonth = function dayOfMonth() {
        return this._date.dayOfMonth();
      };

      _proto.dayOfYear = function dayOfYear() {
        return this._date.dayOfYear();
      };

      _proto.dayOfWeek = function dayOfWeek() {
        return this._date.dayOfWeek();
      };

      _proto.hour = function hour() {
        return this._time.hour();
      };

      _proto.minute = function minute() {
        return this._time.minute();
      };

      _proto.second = function second() {
        return this._time.second();
      };

      _proto.nano = function nano() {
        return this._time.nano();
      };

      _proto._withAdjuster = function _withAdjuster(adjuster) {
        requireNonNull(adjuster, 'adjuster');

        if (adjuster instanceof LocalDate) {
          return this._withDateTime(adjuster, this._time);
        } else if (adjuster instanceof LocalTime) {
          return this._withDateTime(this._date, adjuster);
        } else if (adjuster instanceof LocalDateTime) {
          return adjuster;
        }

        return _ChronoLocalDateTime.prototype._withAdjuster.call(this, adjuster);
      };

      _proto._withField = function _withField(field, newValue) {
        requireNonNull(field, 'field');

        if (field instanceof ChronoField) {
          if (field.isTimeBased()) {
            return this._withDateTime(this._date, this._time.with(field, newValue));
          } else {
            return this._withDateTime(this._date.with(field, newValue), this._time);
          }
        }

        return field.adjustInto(this, newValue);
      };

      _proto.withYear = function withYear(year) {
        return this._withDateTime(this._date.withYear(year), this._time);
      };

      _proto.withMonth = function withMonth(month) {
        return this._withDateTime(this._date.withMonth(month), this._time);
      };

      _proto.withDayOfMonth = function withDayOfMonth(dayOfMonth) {
        return this._withDateTime(this._date.withDayOfMonth(dayOfMonth), this._time);
      };

      _proto.withDayOfYear = function withDayOfYear(dayOfYear) {
        return this._withDateTime(this._date.withDayOfYear(dayOfYear), this._time);
      };

      _proto.withHour = function withHour(hour) {
        var newTime = this._time.withHour(hour);

        return this._withDateTime(this._date, newTime);
      };

      _proto.withMinute = function withMinute(minute) {
        var newTime = this._time.withMinute(minute);

        return this._withDateTime(this._date, newTime);
      };

      _proto.withSecond = function withSecond(second) {
        var newTime = this._time.withSecond(second);

        return this._withDateTime(this._date, newTime);
      };

      _proto.withNano = function withNano(nanoOfSecond) {
        var newTime = this._time.withNano(nanoOfSecond);

        return this._withDateTime(this._date, newTime);
      };

      _proto.truncatedTo = function truncatedTo(unit) {
        return this._withDateTime(this._date, this._time.truncatedTo(unit));
      };

      _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
        requireNonNull(unit, 'unit');

        if (unit instanceof ChronoUnit) {
          switch (unit) {
            case ChronoUnit.NANOS:
              return this.plusNanos(amountToAdd);

            case ChronoUnit.MICROS:
              return this.plusDays(MathUtil.intDiv(amountToAdd, LocalTime.MICROS_PER_DAY)).plusNanos(MathUtil.intMod(amountToAdd, LocalTime.MICROS_PER_DAY) * 1000);

            case ChronoUnit.MILLIS:
              return this.plusDays(MathUtil.intDiv(amountToAdd, LocalTime.MILLIS_PER_DAY)).plusNanos(MathUtil.intMod(amountToAdd, LocalTime.MILLIS_PER_DAY) * 1000000);

            case ChronoUnit.SECONDS:
              return this.plusSeconds(amountToAdd);

            case ChronoUnit.MINUTES:
              return this.plusMinutes(amountToAdd);

            case ChronoUnit.HOURS:
              return this.plusHours(amountToAdd);

            case ChronoUnit.HALF_DAYS:
              return this.plusDays(MathUtil.intDiv(amountToAdd, 256)).plusHours(MathUtil.intMod(amountToAdd, 256) * 12);
          }

          return this._withDateTime(this._date.plus(amountToAdd, unit), this._time);
        }

        return unit.addTo(this, amountToAdd);
      };

      _proto.plusYears = function plusYears(years) {
        var newDate = this._date.plusYears(years);

        return this._withDateTime(newDate, this._time);
      };

      _proto.plusMonths = function plusMonths(months) {
        var newDate = this._date.plusMonths(months);

        return this._withDateTime(newDate, this._time);
      };

      _proto.plusWeeks = function plusWeeks(weeks) {
        var newDate = this._date.plusWeeks(weeks);

        return this._withDateTime(newDate, this._time);
      };

      _proto.plusDays = function plusDays(days) {
        var newDate = this._date.plusDays(days);

        return this._withDateTime(newDate, this._time);
      };

      _proto.plusHours = function plusHours(hours) {
        return this._plusWithOverflow(this._date, hours, 0, 0, 0, 1);
      };

      _proto.plusMinutes = function plusMinutes(minutes) {
        return this._plusWithOverflow(this._date, 0, minutes, 0, 0, 1);
      };

      _proto.plusSeconds = function plusSeconds(seconds) {
        return this._plusWithOverflow(this._date, 0, 0, seconds, 0, 1);
      };

      _proto.plusNanos = function plusNanos(nanos) {
        return this._plusWithOverflow(this._date, 0, 0, 0, nanos, 1);
      };

      _proto._minusUnit = function _minusUnit(amountToSubtract, unit) {
        requireNonNull(unit, 'unit');
        return this._plusUnit(-1 * amountToSubtract, unit);
      };

      _proto.minusYears = function minusYears(years) {
        return this.plusYears(-1 * years);
      };

      _proto.minusMonths = function minusMonths(months) {
        return this.plusMonths(-1 * months);
      };

      _proto.minusWeeks = function minusWeeks(weeks) {
        return this.plusWeeks(-1 * weeks);
      };

      _proto.minusDays = function minusDays(days) {
        return this.plusDays(-1 * days);
      };

      _proto.minusHours = function minusHours(hours) {
        return this._plusWithOverflow(this._date, hours, 0, 0, 0, -1);
      };

      _proto.minusMinutes = function minusMinutes(minutes) {
        return this._plusWithOverflow(this._date, 0, minutes, 0, 0, -1);
      };

      _proto.minusSeconds = function minusSeconds(seconds) {
        return this._plusWithOverflow(this._date, 0, 0, seconds, 0, -1);
      };

      _proto.minusNanos = function minusNanos(nanos) {
        return this._plusWithOverflow(this._date, 0, 0, 0, nanos, -1);
      };

      _proto._plusWithOverflow = function _plusWithOverflow(newDate, hours, minutes, seconds, nanos, sign) {
        if (hours === 0 && minutes === 0 && seconds === 0 && nanos === 0) {
          return this._withDateTime(newDate, this._time);
        }

        var totDays = MathUtil.intDiv(nanos, LocalTime.NANOS_PER_DAY) + MathUtil.intDiv(seconds, LocalTime.SECONDS_PER_DAY) + MathUtil.intDiv(minutes, LocalTime.MINUTES_PER_DAY) + MathUtil.intDiv(hours, LocalTime.HOURS_PER_DAY);
        totDays *= sign;
        var totNanos = MathUtil.intMod(nanos, LocalTime.NANOS_PER_DAY) + MathUtil.intMod(seconds, LocalTime.SECONDS_PER_DAY) * LocalTime.NANOS_PER_SECOND + MathUtil.intMod(minutes, LocalTime.MINUTES_PER_DAY) * LocalTime.NANOS_PER_MINUTE + MathUtil.intMod(hours, LocalTime.HOURS_PER_DAY) * LocalTime.NANOS_PER_HOUR;

        var curNoD = this._time.toNanoOfDay();

        totNanos = totNanos * sign + curNoD;
        totDays += MathUtil.floorDiv(totNanos, LocalTime.NANOS_PER_DAY);
        var newNoD = MathUtil.floorMod(totNanos, LocalTime.NANOS_PER_DAY);
        var newTime = newNoD === curNoD ? this._time : LocalTime.ofNanoOfDay(newNoD);
        return this._withDateTime(newDate.plusDays(totDays), newTime);
      };

      _proto.query = function query(_query) {
        requireNonNull(_query, 'query');

        if (_query === TemporalQueries.localDate()) {
          return this.toLocalDate();
        }

        return _ChronoLocalDateTime.prototype.query.call(this, _query);
      };

      _proto.adjustInto = function adjustInto(temporal) {
        return _ChronoLocalDateTime.prototype.adjustInto.call(this, temporal);
      };

      _proto.until = function until(endExclusive, unit) {
        requireNonNull(endExclusive, 'endExclusive');
        requireNonNull(unit, 'unit');
        var end = LocalDateTime.from(endExclusive);

        if (unit instanceof ChronoUnit) {
          if (unit.isTimeBased()) {
            var daysUntil = this._date.daysUntil(end._date);

            var timeUntil = end._time.toNanoOfDay() - this._time.toNanoOfDay();

            if (daysUntil > 0 && timeUntil < 0) {
              daysUntil--;
              timeUntil += LocalTime.NANOS_PER_DAY;
            } else if (daysUntil < 0 && timeUntil > 0) {
              daysUntil++;
              timeUntil -= LocalTime.NANOS_PER_DAY;
            }

            var amount = daysUntil;

            switch (unit) {
              case ChronoUnit.NANOS:
                amount = MathUtil.safeMultiply(amount, LocalTime.NANOS_PER_DAY);
                return MathUtil.safeAdd(amount, timeUntil);

              case ChronoUnit.MICROS:
                amount = MathUtil.safeMultiply(amount, LocalTime.MICROS_PER_DAY);
                return MathUtil.safeAdd(amount, MathUtil.intDiv(timeUntil, 1000));

              case ChronoUnit.MILLIS:
                amount = MathUtil.safeMultiply(amount, LocalTime.MILLIS_PER_DAY);
                return MathUtil.safeAdd(amount, MathUtil.intDiv(timeUntil, 1000000));

              case ChronoUnit.SECONDS:
                amount = MathUtil.safeMultiply(amount, LocalTime.SECONDS_PER_DAY);
                return MathUtil.safeAdd(amount, MathUtil.intDiv(timeUntil, LocalTime.NANOS_PER_SECOND));

              case ChronoUnit.MINUTES:
                amount = MathUtil.safeMultiply(amount, LocalTime.MINUTES_PER_DAY);
                return MathUtil.safeAdd(amount, MathUtil.intDiv(timeUntil, LocalTime.NANOS_PER_MINUTE));

              case ChronoUnit.HOURS:
                amount = MathUtil.safeMultiply(amount, LocalTime.HOURS_PER_DAY);
                return MathUtil.safeAdd(amount, MathUtil.intDiv(timeUntil, LocalTime.NANOS_PER_HOUR));

              case ChronoUnit.HALF_DAYS:
                amount = MathUtil.safeMultiply(amount, 2);
                return MathUtil.safeAdd(amount, MathUtil.intDiv(timeUntil, LocalTime.NANOS_PER_HOUR * 12));
            }

            throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
          }

          var endDate = end._date;
          var endTime = end._time;

          if (endDate.isAfter(this._date) && endTime.isBefore(this._time)) {
            endDate = endDate.minusDays(1);
          } else if (endDate.isBefore(this._date) && endTime.isAfter(this._time)) {
            endDate = endDate.plusDays(1);
          }

          return this._date.until(endDate, unit);
        }

        return unit.between(this, end);
      };

      _proto.atOffset = function atOffset(offset) {
        return OffsetDateTime.of(this, offset);
      };

      _proto.atZone = function atZone(zone) {
        return ZonedDateTime.of(this, zone);
      };

      _proto.toLocalDate = function toLocalDate() {
        return this._date;
      };

      _proto.toLocalTime = function toLocalTime() {
        return this._time;
      };

      _proto.compareTo = function compareTo(other) {
        requireNonNull(other, 'other');
        requireInstance(other, LocalDateTime, 'other');
        return this._compareTo0(other);
      };

      _proto._compareTo0 = function _compareTo0(other) {
        var cmp = this._date.compareTo(other.toLocalDate());

        if (cmp === 0) {
          cmp = this._time.compareTo(other.toLocalTime());
        }

        return cmp;
      };

      _proto.isAfter = function isAfter(other) {
        return this.compareTo(other) > 0;
      };

      _proto.isBefore = function isBefore(other) {
        return this.compareTo(other) < 0;
      };

      _proto.isEqual = function isEqual(other) {
        return this.compareTo(other) === 0;
      };

      _proto.equals = function equals(other) {
        if (this === other) {
          return true;
        }

        if (other instanceof LocalDateTime) {
          return this._date.equals(other._date) && this._time.equals(other._time);
        }

        return false;
      };

      _proto.hashCode = function hashCode() {
        return this._date.hashCode() ^ this._time.hashCode();
      };

      _proto.toString = function toString() {
        return this._date.toString() + "T" + this._time.toString();
      };

      _proto.toJSON = function toJSON() {
        return this.toString();
      };

      _proto.format = function format(formatter) {
        requireNonNull(formatter, 'formatter');
        return formatter.format(this);
      };

      return LocalDateTime;
    }(ChronoLocalDateTime);
    function _init$4() {
      LocalDateTime.MIN = LocalDateTime.of(LocalDate.MIN, LocalTime.MIN);
      LocalDateTime.MAX = LocalDateTime.of(LocalDate.MAX, LocalTime.MAX);
      LocalDateTime.FROM = createTemporalQuery('LocalDateTime.FROM', function (temporal) {
        return LocalDateTime.from(temporal);
      });
    }

    var LocalTime = function (_Temporal) {
      _inheritsLoose(LocalTime, _Temporal);

      LocalTime.now = function now(clockOrZone) {
        if (clockOrZone == null) {
          return LocalTime._now(Clock.systemDefaultZone());
        } else if (clockOrZone instanceof Clock) {
          return LocalTime._now(clockOrZone);
        } else {
          return LocalTime._now(Clock.system(clockOrZone));
        }
      };

      LocalTime._now = function _now(clock) {
        if (clock === void 0) {
          clock = Clock.systemDefaultZone();
        }

        requireNonNull(clock, 'clock');
        return LocalTime.ofInstant(clock.instant(), clock.zone());
      };

      LocalTime.ofInstant = function ofInstant(instant, zone) {
        if (zone === void 0) {
          zone = ZoneId.systemDefault();
        }

        var offset = zone.rules().offset(instant);
        var secsOfDay = MathUtil.intMod(instant.epochSecond(), LocalTime.SECONDS_PER_DAY);
        secsOfDay = MathUtil.intMod(secsOfDay + offset.totalSeconds(), LocalTime.SECONDS_PER_DAY);

        if (secsOfDay < 0) {
          secsOfDay += LocalTime.SECONDS_PER_DAY;
        }

        return LocalTime.ofSecondOfDay(secsOfDay, instant.nano());
      };

      LocalTime.of = function of(hour, minute, second, nanoOfSecond) {
        return new LocalTime(hour, minute, second, nanoOfSecond);
      };

      LocalTime.ofSecondOfDay = function ofSecondOfDay(secondOfDay, nanoOfSecond) {
        if (secondOfDay === void 0) {
          secondOfDay = 0;
        }

        if (nanoOfSecond === void 0) {
          nanoOfSecond = 0;
        }

        ChronoField.SECOND_OF_DAY.checkValidValue(secondOfDay);
        ChronoField.NANO_OF_SECOND.checkValidValue(nanoOfSecond);
        var hours = MathUtil.intDiv(secondOfDay, LocalTime.SECONDS_PER_HOUR);
        secondOfDay -= hours * LocalTime.SECONDS_PER_HOUR;
        var minutes = MathUtil.intDiv(secondOfDay, LocalTime.SECONDS_PER_MINUTE);
        secondOfDay -= minutes * LocalTime.SECONDS_PER_MINUTE;
        return new LocalTime(hours, minutes, secondOfDay, nanoOfSecond);
      };

      LocalTime.ofNanoOfDay = function ofNanoOfDay(nanoOfDay) {
        if (nanoOfDay === void 0) {
          nanoOfDay = 0;
        }

        ChronoField.NANO_OF_DAY.checkValidValue(nanoOfDay);
        var hours = MathUtil.intDiv(nanoOfDay, LocalTime.NANOS_PER_HOUR);
        nanoOfDay -= hours * LocalTime.NANOS_PER_HOUR;
        var minutes = MathUtil.intDiv(nanoOfDay, LocalTime.NANOS_PER_MINUTE);
        nanoOfDay -= minutes * LocalTime.NANOS_PER_MINUTE;
        var seconds = MathUtil.intDiv(nanoOfDay, LocalTime.NANOS_PER_SECOND);
        nanoOfDay -= seconds * LocalTime.NANOS_PER_SECOND;
        return new LocalTime(hours, minutes, seconds, nanoOfDay);
      };

      LocalTime.from = function from(temporal) {
        requireNonNull(temporal, 'temporal');
        var time = temporal.query(TemporalQueries.localTime());

        if (time == null) {
          throw new DateTimeException("Unable to obtain LocalTime TemporalAccessor: " + temporal + ", type " + (temporal.constructor != null ? temporal.constructor.name : ''));
        }

        return time;
      };

      LocalTime.parse = function parse(text, formatter) {
        if (formatter === void 0) {
          formatter = DateTimeFormatter.ISO_LOCAL_TIME;
        }

        requireNonNull(formatter, 'formatter');
        return formatter.parse(text, LocalTime.FROM);
      };

      function LocalTime(hour, minute, second, nanoOfSecond) {
        var _this;

        if (hour === void 0) {
          hour = 0;
        }

        if (minute === void 0) {
          minute = 0;
        }

        if (second === void 0) {
          second = 0;
        }

        if (nanoOfSecond === void 0) {
          nanoOfSecond = 0;
        }

        _this = _Temporal.call(this) || this;

        var _hour = MathUtil.safeToInt(hour);

        var _minute = MathUtil.safeToInt(minute);

        var _second = MathUtil.safeToInt(second);

        var _nanoOfSecond = MathUtil.safeToInt(nanoOfSecond);

        LocalTime._validate(_hour, _minute, _second, _nanoOfSecond);

        if (_minute === 0 && _second === 0 && _nanoOfSecond === 0) {
          if (!LocalTime.HOURS[_hour]) {
            _this._hour = _hour;
            _this._minute = _minute;
            _this._second = _second;
            _this._nano = _nanoOfSecond;
            LocalTime.HOURS[_hour] = _assertThisInitialized(_this);
          }

          return LocalTime.HOURS[_hour] || _assertThisInitialized(_this);
        }

        _this._hour = _hour;
        _this._minute = _minute;
        _this._second = _second;
        _this._nano = _nanoOfSecond;
        return _this;
      }

      LocalTime._validate = function _validate(hour, minute, second, nanoOfSecond) {
        ChronoField.HOUR_OF_DAY.checkValidValue(hour);
        ChronoField.MINUTE_OF_HOUR.checkValidValue(minute);
        ChronoField.SECOND_OF_MINUTE.checkValidValue(second);
        ChronoField.NANO_OF_SECOND.checkValidValue(nanoOfSecond);
      };

      var _proto = LocalTime.prototype;

      _proto.isSupported = function isSupported(fieldOrUnit) {
        if (fieldOrUnit instanceof ChronoField) {
          return fieldOrUnit.isTimeBased();
        } else if (fieldOrUnit instanceof ChronoUnit) {
          return fieldOrUnit.isTimeBased();
        }

        return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
      };

      _proto.range = function range(field) {
        requireNonNull(field);
        return _Temporal.prototype.range.call(this, field);
      };

      _proto.get = function get(field) {
        return this.getLong(field);
      };

      _proto.getLong = function getLong(field) {
        requireNonNull(field, 'field');

        if (field instanceof ChronoField) {
          return this._get0(field);
        }

        return field.getFrom(this);
      };

      _proto._get0 = function _get0(field) {
        switch (field) {
          case ChronoField.NANO_OF_SECOND:
            return this._nano;

          case ChronoField.NANO_OF_DAY:
            return this.toNanoOfDay();

          case ChronoField.MICRO_OF_SECOND:
            return MathUtil.intDiv(this._nano, 1000);

          case ChronoField.MICRO_OF_DAY:
            return MathUtil.intDiv(this.toNanoOfDay(), 1000);

          case ChronoField.MILLI_OF_SECOND:
            return MathUtil.intDiv(this._nano, 1000000);

          case ChronoField.MILLI_OF_DAY:
            return MathUtil.intDiv(this.toNanoOfDay(), 1000000);

          case ChronoField.SECOND_OF_MINUTE:
            return this._second;

          case ChronoField.SECOND_OF_DAY:
            return this.toSecondOfDay();

          case ChronoField.MINUTE_OF_HOUR:
            return this._minute;

          case ChronoField.MINUTE_OF_DAY:
            return this._hour * 60 + this._minute;

          case ChronoField.HOUR_OF_AMPM:
            return MathUtil.intMod(this._hour, 12);

          case ChronoField.CLOCK_HOUR_OF_AMPM:
            {
              var ham = MathUtil.intMod(this._hour, 12);
              return ham % 12 === 0 ? 12 : ham;
            }

          case ChronoField.HOUR_OF_DAY:
            return this._hour;

          case ChronoField.CLOCK_HOUR_OF_DAY:
            return this._hour === 0 ? 24 : this._hour;

          case ChronoField.AMPM_OF_DAY:
            return MathUtil.intDiv(this._hour, 12);
        }

        throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
      };

      _proto.hour = function hour() {
        return this._hour;
      };

      _proto.minute = function minute() {
        return this._minute;
      };

      _proto.second = function second() {
        return this._second;
      };

      _proto.nano = function nano() {
        return this._nano;
      };

      _proto._withAdjuster = function _withAdjuster(adjuster) {
        requireNonNull(adjuster, 'adjuster');

        if (adjuster instanceof LocalTime) {
          return adjuster;
        }

        return _Temporal.prototype._withAdjuster.call(this, adjuster);
      };

      _proto._withField = function _withField(field, newValue) {
        requireNonNull(field, 'field');
        requireInstance(field, TemporalField, 'field');

        if (field instanceof ChronoField) {
          field.checkValidValue(newValue);

          switch (field) {
            case ChronoField.NANO_OF_SECOND:
              return this.withNano(newValue);

            case ChronoField.NANO_OF_DAY:
              return LocalTime.ofNanoOfDay(newValue);

            case ChronoField.MICRO_OF_SECOND:
              return this.withNano(newValue * 1000);

            case ChronoField.MICRO_OF_DAY:
              return LocalTime.ofNanoOfDay(newValue * 1000);

            case ChronoField.MILLI_OF_SECOND:
              return this.withNano(newValue * 1000000);

            case ChronoField.MILLI_OF_DAY:
              return LocalTime.ofNanoOfDay(newValue * 1000000);

            case ChronoField.SECOND_OF_MINUTE:
              return this.withSecond(newValue);

            case ChronoField.SECOND_OF_DAY:
              return this.plusSeconds(newValue - this.toSecondOfDay());

            case ChronoField.MINUTE_OF_HOUR:
              return this.withMinute(newValue);

            case ChronoField.MINUTE_OF_DAY:
              return this.plusMinutes(newValue - (this._hour * 60 + this._minute));

            case ChronoField.HOUR_OF_AMPM:
              return this.plusHours(newValue - MathUtil.intMod(this._hour, 12));

            case ChronoField.CLOCK_HOUR_OF_AMPM:
              return this.plusHours((newValue === 12 ? 0 : newValue) - MathUtil.intMod(this._hour, 12));

            case ChronoField.HOUR_OF_DAY:
              return this.withHour(newValue);

            case ChronoField.CLOCK_HOUR_OF_DAY:
              return this.withHour(newValue === 24 ? 0 : newValue);

            case ChronoField.AMPM_OF_DAY:
              return this.plusHours((newValue - MathUtil.intDiv(this._hour, 12)) * 12);
          }

          throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
        }

        return field.adjustInto(this, newValue);
      };

      _proto.withHour = function withHour(hour) {
        if (hour === void 0) {
          hour = 0;
        }

        if (this._hour === hour) {
          return this;
        }

        return new LocalTime(hour, this._minute, this._second, this._nano);
      };

      _proto.withMinute = function withMinute(minute) {
        if (minute === void 0) {
          minute = 0;
        }

        if (this._minute === minute) {
          return this;
        }

        return new LocalTime(this._hour, minute, this._second, this._nano);
      };

      _proto.withSecond = function withSecond(second) {
        if (second === void 0) {
          second = 0;
        }

        if (this._second === second) {
          return this;
        }

        return new LocalTime(this._hour, this._minute, second, this._nano);
      };

      _proto.withNano = function withNano(nanoOfSecond) {
        if (nanoOfSecond === void 0) {
          nanoOfSecond = 0;
        }

        if (this._nano === nanoOfSecond) {
          return this;
        }

        return new LocalTime(this._hour, this._minute, this._second, nanoOfSecond);
      };

      _proto.truncatedTo = function truncatedTo(unit) {
        requireNonNull(unit, 'unit');

        if (unit === ChronoUnit.NANOS) {
          return this;
        }

        var unitDur = unit.duration();

        if (unitDur.seconds() > LocalTime.SECONDS_PER_DAY) {
          throw new DateTimeException('Unit is too large to be used for truncation');
        }

        var dur = unitDur.toNanos();

        if (MathUtil.intMod(LocalTime.NANOS_PER_DAY, dur) !== 0) {
          throw new DateTimeException('Unit must divide into a standard day without remainder');
        }

        var nod = this.toNanoOfDay();
        return LocalTime.ofNanoOfDay(MathUtil.intDiv(nod, dur) * dur);
      };

      _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
        requireNonNull(unit, 'unit');

        if (unit instanceof ChronoUnit) {
          switch (unit) {
            case ChronoUnit.NANOS:
              return this.plusNanos(amountToAdd);

            case ChronoUnit.MICROS:
              return this.plusNanos(MathUtil.intMod(amountToAdd, LocalTime.MICROS_PER_DAY) * 1000);

            case ChronoUnit.MILLIS:
              return this.plusNanos(MathUtil.intMod(amountToAdd, LocalTime.MILLIS_PER_DAY) * 1000000);

            case ChronoUnit.SECONDS:
              return this.plusSeconds(amountToAdd);

            case ChronoUnit.MINUTES:
              return this.plusMinutes(amountToAdd);

            case ChronoUnit.HOURS:
              return this.plusHours(amountToAdd);

            case ChronoUnit.HALF_DAYS:
              return this.plusHours(MathUtil.intMod(amountToAdd, 2) * 12);
          }

          throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
        }

        return unit.addTo(this, amountToAdd);
      };

      _proto.plusHours = function plusHours(hoursToAdd) {
        if (hoursToAdd === 0) {
          return this;
        }

        var newHour = MathUtil.intMod(MathUtil.intMod(hoursToAdd, LocalTime.HOURS_PER_DAY) + this._hour + LocalTime.HOURS_PER_DAY, LocalTime.HOURS_PER_DAY);
        return new LocalTime(newHour, this._minute, this._second, this._nano);
      };

      _proto.plusMinutes = function plusMinutes(minutesToAdd) {
        if (minutesToAdd === 0) {
          return this;
        }

        var mofd = this._hour * LocalTime.MINUTES_PER_HOUR + this._minute;
        var newMofd = MathUtil.intMod(MathUtil.intMod(minutesToAdd, LocalTime.MINUTES_PER_DAY) + mofd + LocalTime.MINUTES_PER_DAY, LocalTime.MINUTES_PER_DAY);

        if (mofd === newMofd) {
          return this;
        }

        var newHour = MathUtil.intDiv(newMofd, LocalTime.MINUTES_PER_HOUR);
        var newMinute = MathUtil.intMod(newMofd, LocalTime.MINUTES_PER_HOUR);
        return new LocalTime(newHour, newMinute, this._second, this._nano);
      };

      _proto.plusSeconds = function plusSeconds(secondsToAdd) {
        if (secondsToAdd === 0) {
          return this;
        }

        var sofd = this._hour * LocalTime.SECONDS_PER_HOUR + this._minute * LocalTime.SECONDS_PER_MINUTE + this._second;
        var newSofd = MathUtil.intMod(MathUtil.intMod(secondsToAdd, LocalTime.SECONDS_PER_DAY) + sofd + LocalTime.SECONDS_PER_DAY, LocalTime.SECONDS_PER_DAY);

        if (sofd === newSofd) {
          return this;
        }

        var newHour = MathUtil.intDiv(newSofd, LocalTime.SECONDS_PER_HOUR);
        var newMinute = MathUtil.intMod(MathUtil.intDiv(newSofd, LocalTime.SECONDS_PER_MINUTE), LocalTime.MINUTES_PER_HOUR);
        var newSecond = MathUtil.intMod(newSofd, LocalTime.SECONDS_PER_MINUTE);
        return new LocalTime(newHour, newMinute, newSecond, this._nano);
      };

      _proto.plusNanos = function plusNanos(nanosToAdd) {
        if (nanosToAdd === 0) {
          return this;
        }

        var nofd = this.toNanoOfDay();
        var newNofd = MathUtil.intMod(MathUtil.intMod(nanosToAdd, LocalTime.NANOS_PER_DAY) + nofd + LocalTime.NANOS_PER_DAY, LocalTime.NANOS_PER_DAY);

        if (nofd === newNofd) {
          return this;
        }

        var newHour = MathUtil.intDiv(newNofd, LocalTime.NANOS_PER_HOUR);
        var newMinute = MathUtil.intMod(MathUtil.intDiv(newNofd, LocalTime.NANOS_PER_MINUTE), LocalTime.MINUTES_PER_HOUR);
        var newSecond = MathUtil.intMod(MathUtil.intDiv(newNofd, LocalTime.NANOS_PER_SECOND), LocalTime.SECONDS_PER_MINUTE);
        var newNano = MathUtil.intMod(newNofd, LocalTime.NANOS_PER_SECOND);
        return new LocalTime(newHour, newMinute, newSecond, newNano);
      };

      _proto._minusUnit = function _minusUnit(amountToSubtract, unit) {
        requireNonNull(unit, 'unit');
        return this._plusUnit(-1 * amountToSubtract, unit);
      };

      _proto.minusHours = function minusHours(hoursToSubtract) {
        return this.plusHours(-1 * MathUtil.intMod(hoursToSubtract, LocalTime.HOURS_PER_DAY));
      };

      _proto.minusMinutes = function minusMinutes(minutesToSubtract) {
        return this.plusMinutes(-1 * MathUtil.intMod(minutesToSubtract, LocalTime.MINUTES_PER_DAY));
      };

      _proto.minusSeconds = function minusSeconds(secondsToSubtract) {
        return this.plusSeconds(-1 * MathUtil.intMod(secondsToSubtract, LocalTime.SECONDS_PER_DAY));
      };

      _proto.minusNanos = function minusNanos(nanosToSubtract) {
        return this.plusNanos(-1 * MathUtil.intMod(nanosToSubtract, LocalTime.NANOS_PER_DAY));
      };

      _proto.query = function query(_query) {
        requireNonNull(_query, 'query');

        if (_query === TemporalQueries.precision()) {
          return ChronoUnit.NANOS;
        } else if (_query === TemporalQueries.localTime()) {
          return this;
        }

        if (_query === TemporalQueries.chronology() || _query === TemporalQueries.zoneId() || _query === TemporalQueries.zone() || _query === TemporalQueries.offset() || _query === TemporalQueries.localDate()) {
          return null;
        }

        return _query.queryFrom(this);
      };

      _proto.adjustInto = function adjustInto(temporal) {
        return temporal.with(LocalTime.NANO_OF_DAY, this.toNanoOfDay());
      };

      _proto.until = function until(endExclusive, unit) {
        requireNonNull(endExclusive, 'endExclusive');
        requireNonNull(unit, 'unit');
        var end = LocalTime.from(endExclusive);

        if (unit instanceof ChronoUnit) {
          var nanosUntil = end.toNanoOfDay() - this.toNanoOfDay();

          switch (unit) {
            case ChronoUnit.NANOS:
              return nanosUntil;

            case ChronoUnit.MICROS:
              return MathUtil.intDiv(nanosUntil, 1000);

            case ChronoUnit.MILLIS:
              return MathUtil.intDiv(nanosUntil, 1000000);

            case ChronoUnit.SECONDS:
              return MathUtil.intDiv(nanosUntil, LocalTime.NANOS_PER_SECOND);

            case ChronoUnit.MINUTES:
              return MathUtil.intDiv(nanosUntil, LocalTime.NANOS_PER_MINUTE);

            case ChronoUnit.HOURS:
              return MathUtil.intDiv(nanosUntil, LocalTime.NANOS_PER_HOUR);

            case ChronoUnit.HALF_DAYS:
              return MathUtil.intDiv(nanosUntil, 12 * LocalTime.NANOS_PER_HOUR);
          }

          throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
        }

        return unit.between(this, end);
      };

      _proto.atDate = function atDate(date) {
        return LocalDateTime.of(date, this);
      };

      _proto.atOffset = function atOffset(offset) {
        return OffsetTime.of(this, offset);
      };

      _proto.toSecondOfDay = function toSecondOfDay() {
        var total = this._hour * LocalTime.SECONDS_PER_HOUR;
        total += this._minute * LocalTime.SECONDS_PER_MINUTE;
        total += this._second;
        return total;
      };

      _proto.toNanoOfDay = function toNanoOfDay() {
        var total = this._hour * LocalTime.NANOS_PER_HOUR;
        total += this._minute * LocalTime.NANOS_PER_MINUTE;
        total += this._second * LocalTime.NANOS_PER_SECOND;
        total += this._nano;
        return total;
      };

      _proto.compareTo = function compareTo(other) {
        requireNonNull(other, 'other');
        requireInstance(other, LocalTime, 'other');
        var cmp = MathUtil.compareNumbers(this._hour, other._hour);

        if (cmp === 0) {
          cmp = MathUtil.compareNumbers(this._minute, other._minute);

          if (cmp === 0) {
            cmp = MathUtil.compareNumbers(this._second, other._second);

            if (cmp === 0) {
              cmp = MathUtil.compareNumbers(this._nano, other._nano);
            }
          }
        }

        return cmp;
      };

      _proto.isAfter = function isAfter(other) {
        return this.compareTo(other) > 0;
      };

      _proto.isBefore = function isBefore(other) {
        return this.compareTo(other) < 0;
      };

      _proto.equals = function equals(other) {
        if (this === other) {
          return true;
        }

        if (other instanceof LocalTime) {
          return this._hour === other._hour && this._minute === other._minute && this._second === other._second && this._nano === other._nano;
        }

        return false;
      };

      _proto.hashCode = function hashCode() {
        var nod = this.toNanoOfDay();
        return MathUtil.hash(nod);
      };

      _proto.toString = function toString() {
        var buf = '';
        var hourValue = this._hour;
        var minuteValue = this._minute;
        var secondValue = this._second;
        var nanoValue = this._nano;
        buf += hourValue < 10 ? '0' : '';
        buf += hourValue;
        buf += minuteValue < 10 ? ':0' : ':';
        buf += minuteValue;

        if (secondValue > 0 || nanoValue > 0) {
          buf += secondValue < 10 ? ':0' : ':';
          buf += secondValue;

          if (nanoValue > 0) {
            buf += '.';

            if (MathUtil.intMod(nanoValue, 1000000) === 0) {
              buf += ("" + (MathUtil.intDiv(nanoValue, 1000000) + 1000)).substring(1);
            } else if (MathUtil.intMod(nanoValue, 1000) === 0) {
              buf += ("" + (MathUtil.intDiv(nanoValue, 1000) + 1000000)).substring(1);
            } else {
              buf += ("" + (nanoValue + 1000000000)).substring(1);
            }
          }
        }

        return buf;
      };

      _proto.toJSON = function toJSON() {
        return this.toString();
      };

      _proto.format = function format(formatter) {
        requireNonNull(formatter, 'formatter');
        return formatter.format(this);
      };

      return LocalTime;
    }(Temporal);
    function _init$3() {
      LocalTime.HOURS = [];

      for (var hour = 0; hour < 24; hour++) {
        LocalTime.of(hour, 0, 0, 0);
      }

      LocalTime.MIN = LocalTime.HOURS[0];
      LocalTime.MAX = new LocalTime(23, 59, 59, 999999999);
      LocalTime.MIDNIGHT = LocalTime.HOURS[0];
      LocalTime.NOON = LocalTime.HOURS[12];
      LocalTime.FROM = createTemporalQuery('LocalTime.FROM', function (temporal) {
        return LocalTime.from(temporal);
      });
    }
    LocalTime.HOURS_PER_DAY = 24;
    LocalTime.MINUTES_PER_HOUR = 60;
    LocalTime.MINUTES_PER_DAY = LocalTime.MINUTES_PER_HOUR * LocalTime.HOURS_PER_DAY;
    LocalTime.SECONDS_PER_MINUTE = 60;
    LocalTime.SECONDS_PER_HOUR = LocalTime.SECONDS_PER_MINUTE * LocalTime.MINUTES_PER_HOUR;
    LocalTime.SECONDS_PER_DAY = LocalTime.SECONDS_PER_HOUR * LocalTime.HOURS_PER_DAY;
    LocalTime.MILLIS_PER_DAY = LocalTime.SECONDS_PER_DAY * 1000;
    LocalTime.MICROS_PER_DAY = LocalTime.SECONDS_PER_DAY * 1000000;
    LocalTime.NANOS_PER_SECOND = 1000000000;
    LocalTime.NANOS_PER_MINUTE = LocalTime.NANOS_PER_SECOND * LocalTime.SECONDS_PER_MINUTE;
    LocalTime.NANOS_PER_HOUR = LocalTime.NANOS_PER_MINUTE * LocalTime.MINUTES_PER_HOUR;
    LocalTime.NANOS_PER_DAY = LocalTime.NANOS_PER_HOUR * LocalTime.HOURS_PER_DAY;

    var NANOS_PER_MILLI = 1000000;
    var Instant = function (_Temporal) {
      _inheritsLoose(Instant, _Temporal);

      Instant.now = function now(clock) {
        if (clock === void 0) {
          clock = Clock.systemUTC();
        }

        return clock.instant();
      };

      Instant.ofEpochSecond = function ofEpochSecond(epochSecond, nanoAdjustment) {
        if (nanoAdjustment === void 0) {
          nanoAdjustment = 0;
        }

        var secs = epochSecond + MathUtil.floorDiv(nanoAdjustment, LocalTime.NANOS_PER_SECOND);
        var nos = MathUtil.floorMod(nanoAdjustment, LocalTime.NANOS_PER_SECOND);
        return Instant._create(secs, nos);
      };

      Instant.ofEpochMilli = function ofEpochMilli(epochMilli) {
        var secs = MathUtil.floorDiv(epochMilli, 1000);
        var mos = MathUtil.floorMod(epochMilli, 1000);
        return Instant._create(secs, mos * 1000000);
      };

      Instant.ofEpochMicro = function ofEpochMicro(epochMicro) {
        var secs = MathUtil.floorDiv(epochMicro, 1000000);
        var mos = MathUtil.floorMod(epochMicro, 1000000);
        return Instant._create(secs, mos * 1000);
      };

      Instant.from = function from(temporal) {
        try {
          var instantSecs = temporal.getLong(ChronoField.INSTANT_SECONDS);
          var nanoOfSecond = temporal.get(ChronoField.NANO_OF_SECOND);
          return Instant.ofEpochSecond(instantSecs, nanoOfSecond);
        } catch (ex) {
          throw new DateTimeException("Unable to obtain Instant from TemporalAccessor: " + temporal + ", type " + typeof temporal, ex);
        }
      };

      Instant.parse = function parse(text) {
        return DateTimeFormatter.ISO_INSTANT.parse(text, Instant.FROM);
      };

      Instant._create = function _create(seconds, nanoOfSecond) {
        if (seconds === 0 && nanoOfSecond === 0) {
          return Instant.EPOCH;
        }

        return new Instant(seconds, nanoOfSecond);
      };

      Instant._validate = function _validate(seconds, nanoOfSecond) {
        if (seconds < Instant.MIN_SECONDS || seconds > Instant.MAX_SECONDS) {
          throw new DateTimeException('Instant exceeds minimum or maximum instant');
        }

        if (nanoOfSecond < 0 || nanoOfSecond > LocalTime.NANOS_PER_SECOND) {
          throw new DateTimeException('Instant exceeds minimum or maximum instant');
        }
      };

      function Instant(seconds, nanoOfSecond) {
        var _this;

        _this = _Temporal.call(this) || this;

        Instant._validate(seconds, nanoOfSecond);

        _this._seconds = MathUtil.safeToInt(seconds);
        _this._nanos = MathUtil.safeToInt(nanoOfSecond);
        return _this;
      }

      var _proto = Instant.prototype;

      _proto.isSupported = function isSupported(fieldOrUnit) {
        if (fieldOrUnit instanceof ChronoField) {
          return fieldOrUnit === ChronoField.INSTANT_SECONDS || fieldOrUnit === ChronoField.NANO_OF_SECOND || fieldOrUnit === ChronoField.MICRO_OF_SECOND || fieldOrUnit === ChronoField.MILLI_OF_SECOND;
        }

        if (fieldOrUnit instanceof ChronoUnit) {
          return fieldOrUnit.isTimeBased() || fieldOrUnit === ChronoUnit.DAYS;
        }

        return fieldOrUnit != null && fieldOrUnit.isSupportedBy(this);
      };

      _proto.range = function range(field) {
        return _Temporal.prototype.range.call(this, field);
      };

      _proto.get = function get(field) {
        return this.getLong(field);
      };

      _proto.getLong = function getLong(field) {
        if (field instanceof ChronoField) {
          switch (field) {
            case ChronoField.NANO_OF_SECOND:
              return this._nanos;

            case ChronoField.MICRO_OF_SECOND:
              return MathUtil.intDiv(this._nanos, 1000);

            case ChronoField.MILLI_OF_SECOND:
              return MathUtil.intDiv(this._nanos, NANOS_PER_MILLI);

            case ChronoField.INSTANT_SECONDS:
              return this._seconds;
          }

          throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
        }

        return field.getFrom(this);
      };

      _proto.epochSecond = function epochSecond() {
        return this._seconds;
      };

      _proto.nano = function nano() {
        return this._nanos;
      };

      _proto._withField = function _withField(field, newValue) {
        requireNonNull(field, 'field');

        if (field instanceof ChronoField) {
          field.checkValidValue(newValue);

          switch (field) {
            case ChronoField.MILLI_OF_SECOND:
              {
                var nval = newValue * NANOS_PER_MILLI;
                return nval !== this._nanos ? Instant._create(this._seconds, nval) : this;
              }

            case ChronoField.MICRO_OF_SECOND:
              {
                var _nval = newValue * 1000;

                return _nval !== this._nanos ? Instant._create(this._seconds, _nval) : this;
              }

            case ChronoField.NANO_OF_SECOND:
              return newValue !== this._nanos ? Instant._create(this._seconds, newValue) : this;

            case ChronoField.INSTANT_SECONDS:
              return newValue !== this._seconds ? Instant._create(newValue, this._nanos) : this;
          }

          throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
        }

        return field.adjustInto(this, newValue);
      };

      _proto.truncatedTo = function truncatedTo(unit) {
        requireNonNull(unit, 'unit');

        if (unit === ChronoUnit.NANOS) {
          return this;
        }

        var unitDur = unit.duration();

        if (unitDur.seconds() > LocalTime.SECONDS_PER_DAY) {
          throw new DateTimeException('Unit is too large to be used for truncation');
        }

        var dur = unitDur.toNanos();

        if (MathUtil.intMod(LocalTime.NANOS_PER_DAY, dur) !== 0) {
          throw new DateTimeException('Unit must divide into a standard day without remainder');
        }

        var nod = MathUtil.intMod(this._seconds, LocalTime.SECONDS_PER_DAY) * LocalTime.NANOS_PER_SECOND + this._nanos;

        var result = MathUtil.intDiv(nod, dur) * dur;
        return this.plusNanos(result - nod);
      };

      _proto._plusUnit = function _plusUnit(amountToAdd, unit) {
        requireNonNull(amountToAdd, 'amountToAdd');
        requireNonNull(unit, 'unit');
        requireInstance(unit, TemporalUnit);

        if (unit instanceof ChronoUnit) {
          switch (unit) {
            case ChronoUnit.NANOS:
              return this.plusNanos(amountToAdd);

            case ChronoUnit.MICROS:
              return this.plusMicros(amountToAdd);

            case ChronoUnit.MILLIS:
              return this.plusMillis(amountToAdd);

            case ChronoUnit.SECONDS:
              return this.plusSeconds(amountToAdd);

            case ChronoUnit.MINUTES:
              return this.plusSeconds(MathUtil.safeMultiply(amountToAdd, LocalTime.SECONDS_PER_MINUTE));

            case ChronoUnit.HOURS:
              return this.plusSeconds(MathUtil.safeMultiply(amountToAdd, LocalTime.SECONDS_PER_HOUR));

            case ChronoUnit.HALF_DAYS:
              return this.plusSeconds(MathUtil.safeMultiply(amountToAdd, LocalTime.SECONDS_PER_DAY / 2));

            case ChronoUnit.DAYS:
              return this.plusSeconds(MathUtil.safeMultiply(amountToAdd, LocalTime.SECONDS_PER_DAY));
          }

          throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
        }

        return unit.addTo(this, amountToAdd);
      };

      _proto.plusSeconds = function plusSeconds(secondsToAdd) {
        return this._plus(secondsToAdd, 0);
      };

      _proto.plusMillis = function plusMillis(millisToAdd) {
        return this._plus(MathUtil.intDiv(millisToAdd, 1000), MathUtil.intMod(millisToAdd, 1000) * NANOS_PER_MILLI);
      };

      _proto.plusNanos = function plusNanos(nanosToAdd) {
        return this._plus(0, nanosToAdd);
      };

      _proto.plusMicros = function plusMicros(microsToAdd) {
        return this._plus(MathUtil.intDiv(microsToAdd, 1000000), MathUtil.intMod(microsToAdd, 1000000) * 1000);
      };

      _proto._plus = function _plus(secondsToAdd, nanosToAdd) {
        if (secondsToAdd === 0 && nanosToAdd === 0) {
          return this;
        }

        var epochSec = this._seconds + secondsToAdd;
        epochSec = epochSec + MathUtil.intDiv(nanosToAdd, LocalTime.NANOS_PER_SECOND);
        var nanoAdjustment = this._nanos + nanosToAdd % LocalTime.NANOS_PER_SECOND;
        return Instant.ofEpochSecond(epochSec, nanoAdjustment);
      };

      _proto._minusUnit = function _minusUnit(amountToSubtract, unit) {
        return this._plusUnit(-1 * amountToSubtract, unit);
      };

      _proto.minusSeconds = function minusSeconds(secondsToSubtract) {
        return this.plusSeconds(secondsToSubtract * -1);
      };

      _proto.minusMillis = function minusMillis(millisToSubtract) {
        return this.plusMillis(-1 * millisToSubtract);
      };

      _proto.minusNanos = function minusNanos(nanosToSubtract) {
        return this.plusNanos(-1 * nanosToSubtract);
      };

      _proto.minusMicros = function minusMicros(microsToSubtract) {
        return this.plusMicros(-1 * microsToSubtract);
      };

      _proto.query = function query(_query) {
        requireNonNull(_query, 'query');

        if (_query === TemporalQueries.precision()) {
          return ChronoUnit.NANOS;
        }

        if (_query === TemporalQueries.localDate() || _query === TemporalQueries.localTime() || _query === TemporalQueries.chronology() || _query === TemporalQueries.zoneId() || _query === TemporalQueries.zone() || _query === TemporalQueries.offset()) {
          return null;
        }

        return _query.queryFrom(this);
      };

      _proto.adjustInto = function adjustInto(temporal) {
        requireNonNull(temporal, 'temporal');
        return temporal.with(ChronoField.INSTANT_SECONDS, this._seconds).with(ChronoField.NANO_OF_SECOND, this._nanos);
      };

      _proto.until = function until(endExclusive, unit) {
        requireNonNull(endExclusive, 'endExclusive');
        requireNonNull(unit, 'unit');
        var end = Instant.from(endExclusive);

        if (unit instanceof ChronoUnit) {
          switch (unit) {
            case ChronoUnit.NANOS:
              return this._nanosUntil(end);

            case ChronoUnit.MICROS:
              return this._microsUntil(end);

            case ChronoUnit.MILLIS:
              return MathUtil.safeSubtract(end.toEpochMilli(), this.toEpochMilli());

            case ChronoUnit.SECONDS:
              return this._secondsUntil(end);

            case ChronoUnit.MINUTES:
              return MathUtil.intDiv(this._secondsUntil(end), LocalTime.SECONDS_PER_MINUTE);

            case ChronoUnit.HOURS:
              return MathUtil.intDiv(this._secondsUntil(end), LocalTime.SECONDS_PER_HOUR);

            case ChronoUnit.HALF_DAYS:
              return MathUtil.intDiv(this._secondsUntil(end), 12 * LocalTime.SECONDS_PER_HOUR);

            case ChronoUnit.DAYS:
              return MathUtil.intDiv(this._secondsUntil(end), LocalTime.SECONDS_PER_DAY);
          }

          throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
        }

        return unit.between(this, end);
      };

      _proto._microsUntil = function _microsUntil(end) {
        var secsDiff = MathUtil.safeSubtract(end.epochSecond(), this.epochSecond());
        var totalMicros = MathUtil.safeMultiply(secsDiff, 1000000);
        return MathUtil.safeAdd(totalMicros, MathUtil.intDiv(end.nano() - this.nano(), 1000));
      };

      _proto._nanosUntil = function _nanosUntil(end) {
        var secsDiff = MathUtil.safeSubtract(end.epochSecond(), this.epochSecond());
        var totalNanos = MathUtil.safeMultiply(secsDiff, LocalTime.NANOS_PER_SECOND);
        return MathUtil.safeAdd(totalNanos, end.nano() - this.nano());
      };

      _proto._secondsUntil = function _secondsUntil(end) {
        var secsDiff = MathUtil.safeSubtract(end.epochSecond(), this.epochSecond());
        var nanosDiff = end.nano() - this.nano();

        if (secsDiff > 0 && nanosDiff < 0) {
          secsDiff--;
        } else if (secsDiff < 0 && nanosDiff > 0) {
          secsDiff++;
        }

        return secsDiff;
      };

      _proto.atOffset = function atOffset(offset) {
        return OffsetDateTime.ofInstant(this, offset);
      };

      _proto.atZone = function atZone(zone) {
        return ZonedDateTime.ofInstant(this, zone);
      };

      _proto.toEpochMilli = function toEpochMilli() {
        var millis = MathUtil.safeMultiply(this._seconds, 1000);
        return millis + MathUtil.intDiv(this._nanos, NANOS_PER_MILLI);
      };

      _proto.compareTo = function compareTo(otherInstant) {
        requireNonNull(otherInstant, 'otherInstant');
        requireInstance(otherInstant, Instant, 'otherInstant');
        var cmp = MathUtil.compareNumbers(this._seconds, otherInstant._seconds);

        if (cmp !== 0) {
          return cmp;
        }

        return this._nanos - otherInstant._nanos;
      };

      _proto.isAfter = function isAfter(otherInstant) {
        return this.compareTo(otherInstant) > 0;
      };

      _proto.isBefore = function isBefore(otherInstant) {
        return this.compareTo(otherInstant) < 0;
      };

      _proto.equals = function equals(other) {
        if (this === other) {
          return true;
        }

        if (other instanceof Instant) {
          return this.epochSecond() === other.epochSecond() && this.nano() === other.nano();
        }

        return false;
      };

      _proto.hashCode = function hashCode() {
        return MathUtil.hashCode(this._seconds, this._nanos);
      };

      _proto.toString = function toString() {
        return DateTimeFormatter.ISO_INSTANT.format(this);
      };

      _proto.toJSON = function toJSON() {
        return this.toString();
      };

      return Instant;
    }(Temporal);
    function _init$2() {
      Instant.MIN_SECONDS = -31619119219200;
      Instant.MAX_SECONDS = 31494816403199;
      Instant.EPOCH = new Instant(0, 0);
      Instant.MIN = Instant.ofEpochSecond(Instant.MIN_SECONDS, 0);
      Instant.MAX = Instant.ofEpochSecond(Instant.MAX_SECONDS, 999999999);
      Instant.FROM = createTemporalQuery('Instant.FROM', function (temporal) {
        return Instant.from(temporal);
      });
    }

    var Clock = function () {
      function Clock() {}

      Clock.systemUTC = function systemUTC() {
        return new SystemClock(ZoneOffset.UTC);
      };

      Clock.systemDefaultZone = function systemDefaultZone() {
        return new SystemClock(ZoneId.systemDefault());
      };

      Clock.system = function system(zone) {
        return new SystemClock(zone);
      };

      Clock.fixed = function fixed(fixedInstant, zoneId) {
        return new FixedClock(fixedInstant, zoneId);
      };

      Clock.offset = function offset(baseClock, duration) {
        return new OffsetClock(baseClock, duration);
      };

      var _proto = Clock.prototype;

      _proto.millis = function millis() {
        abstractMethodFail('Clock.millis');
      };

      _proto.instant = function instant() {
        abstractMethodFail('Clock.instant');
      };

      _proto.zone = function zone() {
        abstractMethodFail('Clock.zone');
      };

      _proto.withZone = function withZone() {
        abstractMethodFail('Clock.withZone');
      };

      return Clock;
    }();

    var SystemClock = function (_Clock) {
      _inheritsLoose(SystemClock, _Clock);

      function SystemClock(zone) {
        var _this;

        requireNonNull(zone, 'zone');
        _this = _Clock.call(this) || this;
        _this._zone = zone;
        return _this;
      }

      var _proto2 = SystemClock.prototype;

      _proto2.zone = function zone() {
        return this._zone;
      };

      _proto2.millis = function millis() {
        return new Date().getTime();
      };

      _proto2.instant = function instant() {
        return Instant.ofEpochMilli(this.millis());
      };

      _proto2.equals = function equals(obj) {
        if (obj instanceof SystemClock) {
          return this._zone.equals(obj._zone);
        }

        return false;
      };

      _proto2.withZone = function withZone(zone) {
        if (zone.equals(this._zone)) {
          return this;
        }

        return new SystemClock(zone);
      };

      _proto2.toString = function toString() {
        return "SystemClock[" + this._zone.toString() + "]";
      };

      return SystemClock;
    }(Clock);

    var FixedClock = function (_Clock2) {
      _inheritsLoose(FixedClock, _Clock2);

      function FixedClock(fixedInstant, zoneId) {
        var _this2;

        _this2 = _Clock2.call(this) || this;
        _this2._instant = fixedInstant;
        _this2._zoneId = zoneId;
        return _this2;
      }

      var _proto3 = FixedClock.prototype;

      _proto3.instant = function instant() {
        return this._instant;
      };

      _proto3.millis = function millis() {
        return this._instant.toEpochMilli();
      };

      _proto3.zone = function zone() {
        return this._zoneId;
      };

      _proto3.toString = function toString() {
        return 'FixedClock[]';
      };

      _proto3.equals = function equals(obj) {
        if (obj instanceof FixedClock) {
          return this._instant.equals(obj._instant) && this._zoneId.equals(obj._zoneId);
        }

        return false;
      };

      _proto3.withZone = function withZone(zone) {
        if (zone.equals(this._zoneId)) {
          return this;
        }

        return new FixedClock(this._instant, zone);
      };

      return FixedClock;
    }(Clock);

    var OffsetClock = function (_Clock3) {
      _inheritsLoose(OffsetClock, _Clock3);

      function OffsetClock(baseClock, offset) {
        var _this3;

        _this3 = _Clock3.call(this) || this;
        _this3._baseClock = baseClock;
        _this3._offset = offset;
        return _this3;
      }

      var _proto4 = OffsetClock.prototype;

      _proto4.zone = function zone() {
        return this._baseClock.zone();
      };

      _proto4.withZone = function withZone(zone) {
        if (zone.equals(this._baseClock.zone())) {
          return this;
        }

        return new OffsetClock(this._baseClock.withZone(zone), this._offset);
      };

      _proto4.millis = function millis() {
        return this._baseClock.millis() + this._offset.toMillis();
      };

      _proto4.instant = function instant() {
        return this._baseClock.instant().plus(this._offset);
      };

      _proto4.equals = function equals(obj) {
        if (obj instanceof OffsetClock) {
          return this._baseClock.equals(obj._baseClock) && this._offset.equals(obj._offset);
        }

        return false;
      };

      _proto4.toString = function toString() {
        return "OffsetClock[" + this._baseClock + "," + this._offset + "]";
      };

      return OffsetClock;
    }(Clock);

    /*
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var ZoneOffsetTransition = function () {
      ZoneOffsetTransition.of = function of(transition, offsetBefore, offsetAfter) {
        return new ZoneOffsetTransition(transition, offsetBefore, offsetAfter);
      };

      function ZoneOffsetTransition(transition, offsetBefore, offsetAfter) {
        requireNonNull(transition, 'transition');
        requireNonNull(offsetBefore, 'offsetBefore');
        requireNonNull(offsetAfter, 'offsetAfter');

        if (offsetBefore.equals(offsetAfter)) {
          throw new IllegalArgumentException('Offsets must not be equal');
        }

        if (transition.nano() !== 0) {
          throw new IllegalArgumentException('Nano-of-second must be zero');
        }

        if (transition instanceof LocalDateTime) {
          this._transition = transition;
        } else {
          this._transition = LocalDateTime.ofEpochSecond(transition, 0, offsetBefore);
        }

        this._offsetBefore = offsetBefore;
        this._offsetAfter = offsetAfter;
      }

      var _proto = ZoneOffsetTransition.prototype;

      _proto.instant = function instant() {
        return this._transition.toInstant(this._offsetBefore);
      };

      _proto.toEpochSecond = function toEpochSecond() {
        return this._transition.toEpochSecond(this._offsetBefore);
      };

      _proto.dateTimeBefore = function dateTimeBefore() {
        return this._transition;
      };

      _proto.dateTimeAfter = function dateTimeAfter() {
        return this._transition.plusSeconds(this.durationSeconds());
      };

      _proto.offsetBefore = function offsetBefore() {
        return this._offsetBefore;
      };

      _proto.offsetAfter = function offsetAfter() {
        return this._offsetAfter;
      };

      _proto.duration = function duration() {
        return Duration.ofSeconds(this.durationSeconds());
      };

      _proto.durationSeconds = function durationSeconds() {
        return this._offsetAfter.totalSeconds() - this._offsetBefore.totalSeconds();
      };

      _proto.isGap = function isGap() {
        return this._offsetAfter.totalSeconds() > this._offsetBefore.totalSeconds();
      };

      _proto.isOverlap = function isOverlap() {
        return this._offsetAfter.totalSeconds() < this._offsetBefore.totalSeconds();
      };

      _proto.isValidOffset = function isValidOffset(offset) {
        return this.isGap() ? false : this._offsetBefore.equals(offset) || this._offsetAfter.equals(offset);
      };

      _proto.validOffsets = function validOffsets() {
        if (this.isGap()) {
          return [];
        } else {
          return [this._offsetBefore, this._offsetAfter];
        }
      };

      _proto.compareTo = function compareTo(transition) {
        return this.instant().compareTo(transition.instant());
      };

      _proto.equals = function equals(other) {
        if (other === this) {
          return true;
        }

        if (other instanceof ZoneOffsetTransition) {
          var d = other;
          return this._transition.equals(d._transition) && this._offsetBefore.equals(d.offsetBefore()) && this._offsetAfter.equals(d.offsetAfter());
        }

        return false;
      };

      _proto.hashCode = function hashCode() {
        return this._transition.hashCode() ^ this._offsetBefore.hashCode() ^ this._offsetAfter.hashCode() >>> 16;
      };

      _proto.toString = function toString() {
        return "Transition[" + (this.isGap() ? 'Gap' : 'Overlap') + " at " + this._transition.toString() + this._offsetBefore.toString() + " to " + this._offsetAfter + "]";
      };

      return ZoneOffsetTransition;
    }();

    /*
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    function _init$1() {
      TemporalQueries.ZONE_ID = createTemporalQuery('ZONE_ID', function (temporal) {
        return temporal.query(TemporalQueries.ZONE_ID);
      });
      TemporalQueries.CHRONO = createTemporalQuery('CHRONO', function (temporal) {
        return temporal.query(TemporalQueries.CHRONO);
      });
      TemporalQueries.PRECISION = createTemporalQuery('PRECISION', function (temporal) {
        return temporal.query(TemporalQueries.PRECISION);
      });
      TemporalQueries.OFFSET = createTemporalQuery('OFFSET', function (temporal) {
        if (temporal.isSupported(ChronoField.OFFSET_SECONDS)) {
          return ZoneOffset.ofTotalSeconds(temporal.get(ChronoField.OFFSET_SECONDS));
        }

        return null;
      });
      TemporalQueries.ZONE = createTemporalQuery('ZONE', function (temporal) {
        var zone = temporal.query(TemporalQueries.ZONE_ID);
        return zone != null ? zone : temporal.query(TemporalQueries.OFFSET);
      });
      TemporalQueries.LOCAL_DATE = createTemporalQuery('LOCAL_DATE', function (temporal) {
        if (temporal.isSupported(ChronoField.EPOCH_DAY)) {
          return LocalDate.ofEpochDay(temporal.getLong(ChronoField.EPOCH_DAY));
        }

        return null;
      });
      TemporalQueries.LOCAL_TIME = createTemporalQuery('LOCAL_TIME', function (temporal) {
        if (temporal.isSupported(ChronoField.NANO_OF_DAY)) {
          return LocalTime.ofNanoOfDay(temporal.getLong(ChronoField.NANO_OF_DAY));
        }

        return null;
      });
    }

    var SystemDefaultZoneRules = function (_ZoneRules) {
      _inheritsLoose(SystemDefaultZoneRules, _ZoneRules);

      function SystemDefaultZoneRules() {
        return _ZoneRules.apply(this, arguments) || this;
      }

      var _proto = SystemDefaultZoneRules.prototype;

      _proto.isFixedOffset = function isFixedOffset() {
        return false;
      };

      _proto.offsetOfInstant = function offsetOfInstant(instant) {
        var offsetInMinutes = new Date(instant.toEpochMilli()).getTimezoneOffset();
        return ZoneOffset.ofTotalMinutes(offsetInMinutes * -1);
      };

      _proto.offsetOfEpochMilli = function offsetOfEpochMilli(epochMilli) {
        var offsetInMinutes = new Date(epochMilli).getTimezoneOffset();
        return ZoneOffset.ofTotalMinutes(offsetInMinutes * -1);
      };

      _proto.offsetOfLocalDateTime = function offsetOfLocalDateTime(localDateTime) {
        var epochMilli = localDateTime.toEpochSecond(ZoneOffset.UTC) * 1000;
        var offsetInMinutesBeforePossibleTransition = new Date(epochMilli).getTimezoneOffset();
        var epochMilliSystemZone = epochMilli + offsetInMinutesBeforePossibleTransition * 60000;
        var offsetInMinutesAfterPossibleTransition = new Date(epochMilliSystemZone).getTimezoneOffset();
        return ZoneOffset.ofTotalMinutes(offsetInMinutesAfterPossibleTransition * -1);
      };

      _proto.validOffsets = function validOffsets(localDateTime) {
        return [this.offsetOfLocalDateTime(localDateTime)];
      };

      _proto.transition = function transition() {
        return null;
      };

      _proto.standardOffset = function standardOffset(instant) {
        return this.offsetOfInstant(instant);
      };

      _proto.daylightSavings = function daylightSavings() {
        this._throwNotSupported();
      };

      _proto.isDaylightSavings = function isDaylightSavings() {
        this._throwNotSupported();
      };

      _proto.isValidOffset = function isValidOffset(dateTime, offset) {
        return this.offsetOfLocalDateTime(dateTime).equals(offset);
      };

      _proto.nextTransition = function nextTransition() {
        this._throwNotSupported();
      };

      _proto.previousTransition = function previousTransition() {
        this._throwNotSupported();
      };

      _proto.transitions = function transitions() {
        this._throwNotSupported();
      };

      _proto.transitionRules = function transitionRules() {
        this._throwNotSupported();
      };

      _proto._throwNotSupported = function _throwNotSupported() {
        throw new DateTimeException('not supported operation');
      };

      _proto.equals = function equals(other) {
        if (this === other || other instanceof SystemDefaultZoneRules) {
          return true;
        } else {
          return false;
        }
      };

      _proto.toString = function toString() {
        return 'SYSTEM';
      };

      return SystemDefaultZoneRules;
    }(ZoneRules);

    var SystemDefaultZoneId = function (_ZoneId) {
      _inheritsLoose(SystemDefaultZoneId, _ZoneId);

      function SystemDefaultZoneId() {
        var _this;

        _this = _ZoneId.call(this) || this;
        _this._rules = new SystemDefaultZoneRules();
        return _this;
      }

      var _proto = SystemDefaultZoneId.prototype;

      _proto.rules = function rules() {
        return this._rules;
      };

      _proto.equals = function equals(other) {
        if (this === other) {
          return true;
        }

        return false;
      };

      _proto.id = function id() {
        return 'SYSTEM';
      };

      return SystemDefaultZoneId;
    }(ZoneId);

    /*
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var ZoneIdFactory = function () {
      function ZoneIdFactory() {}

      ZoneIdFactory.systemDefault = function systemDefault() {
        return SYSTEM_DEFAULT_ZONE_ID_INSTANCE;
      };

      ZoneIdFactory.getAvailableZoneIds = function getAvailableZoneIds() {
        return ZoneRulesProvider.getAvailableZoneIds();
      };

      ZoneIdFactory.of = function of(zoneId) {
        requireNonNull(zoneId, 'zoneId');

        if (zoneId === 'Z') {
          return ZoneOffset.UTC;
        }

        if (zoneId.length === 1) {
          throw new DateTimeException("Invalid zone: " + zoneId);
        }

        if (StringUtil.startsWith(zoneId, '+') || StringUtil.startsWith(zoneId, '-')) {
          return ZoneOffset.of(zoneId);
        }

        if (zoneId === 'UTC' || zoneId === 'GMT' || zoneId === 'GMT0' || zoneId === 'UT') {
          return new ZoneRegion(zoneId, ZoneOffset.UTC.rules());
        }

        if (StringUtil.startsWith(zoneId, 'UTC+') || StringUtil.startsWith(zoneId, 'GMT+') || StringUtil.startsWith(zoneId, 'UTC-') || StringUtil.startsWith(zoneId, 'GMT-')) {
          var offset = ZoneOffset.of(zoneId.substring(3));

          if (offset.totalSeconds() === 0) {
            return new ZoneRegion(zoneId.substring(0, 3), offset.rules());
          }

          return new ZoneRegion(zoneId.substring(0, 3) + offset.id(), offset.rules());
        }

        if (StringUtil.startsWith(zoneId, 'UT+') || StringUtil.startsWith(zoneId, 'UT-')) {
          var _offset = ZoneOffset.of(zoneId.substring(2));

          if (_offset.totalSeconds() === 0) {
            return new ZoneRegion('UT', _offset.rules());
          }

          return new ZoneRegion("UT" + _offset.id(), _offset.rules());
        }

        if (zoneId === 'SYSTEM') {
          return ZoneId.systemDefault();
        }

        return ZoneRegion.ofId(zoneId);
      };

      ZoneIdFactory.ofOffset = function ofOffset(prefix, offset) {
        requireNonNull(prefix, 'prefix');
        requireNonNull(offset, 'offset');

        if (prefix.length === 0) {
          return offset;
        }

        if (prefix === 'GMT' || prefix === 'UTC' || prefix === 'UT') {
          if (offset.totalSeconds() === 0) {
            return new ZoneRegion(prefix, offset.rules());
          }

          return new ZoneRegion(prefix + offset.id(), offset.rules());
        }

        throw new IllegalArgumentException("Invalid prefix, must be GMT, UTC or UT: " + prefix);
      };

      ZoneIdFactory.from = function from(temporal) {
        requireNonNull(temporal, 'temporal');
        var obj = temporal.query(TemporalQueries.zone());

        if (obj == null) {
          throw new DateTimeException("Unable to obtain ZoneId from TemporalAccessor: " + temporal + ", type " + (temporal.constructor != null ? temporal.constructor.name : ''));
        }

        return obj;
      };

      return ZoneIdFactory;
    }();
    var SYSTEM_DEFAULT_ZONE_ID_INSTANCE = null;
    function _init() {
      SYSTEM_DEFAULT_ZONE_ID_INSTANCE = new SystemDefaultZoneId();
      ZoneId.systemDefault = ZoneIdFactory.systemDefault;
      ZoneId.getAvailableZoneIds = ZoneIdFactory.getAvailableZoneIds;
      ZoneId.of = ZoneIdFactory.of;
      ZoneId.ofOffset = ZoneIdFactory.ofOffset;
      ZoneId.from = ZoneIdFactory.from;
      ZoneOffset.from = ZoneIdFactory.from;
      ZoneId.SYSTEM = SYSTEM_DEFAULT_ZONE_ID_INSTANCE;
      ZoneId.UTC = ZoneOffset.ofTotalSeconds(0);
    }

    /*
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var isInit = false;

    function init() {
      if (isInit) {
        return;
      }

      isInit = true;
      _init$m();
      _init$n();
      _init$l();
      _init$k();
      _init$3();
      _init$f();
      _init$1();
      _init$j();
      _init$2();
      _init$5();
      _init$4();
      _init$a();
      _init$i();
      _init$b();
      _init$c();
      _init$h();
      _init$g();
      _init$7();
      _init();
      _init$9();
      _init$d();
      _init$e();
      _init$6();
      _init$8();
    }

    init();

    /*
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */

    var ToNativeJsConverter = function () {
      function ToNativeJsConverter(temporal, zone) {
        var zonedDateTime;

        if (temporal instanceof Instant) {
          this.instant = temporal;
          return;
        } else if (temporal instanceof LocalDate) {
          zone = zone == null ? ZoneId.systemDefault() : zone;
          zonedDateTime = temporal.atStartOfDay(zone);
        } else if (temporal instanceof LocalDateTime) {
          zone = zone == null ? ZoneId.systemDefault() : zone;
          zonedDateTime = temporal.atZone(zone);
        } else if (temporal instanceof ZonedDateTime) {
          if (zone == null) {
            zonedDateTime = temporal;
          } else {
            zonedDateTime = temporal.withZoneSameInstant(zone);
          }
        } else {
          throw new IllegalArgumentException("unsupported instance for convert operation:" + temporal);
        }

        this.instant = zonedDateTime.toInstant();
      }

      var _proto = ToNativeJsConverter.prototype;

      _proto.toDate = function toDate() {
        return new Date(this.instant.toEpochMilli());
      };

      _proto.toEpochMilli = function toEpochMilli() {
        return this.instant.toEpochMilli();
      };

      return ToNativeJsConverter;
    }();

    function convert(temporal, zone) {
      return new ToNativeJsConverter(temporal, zone);
    }

    var NativeJsTemporal = function (_TemporalAccessor) {
      _inheritsLoose(NativeJsTemporal, _TemporalAccessor);

      function NativeJsTemporal(date, zone) {
        var _this;

        if (zone === void 0) {
          zone = ZoneId.systemDefault();
        }

        _this = _TemporalAccessor.call(this) || this;
        _this._zone = zone;

        if (date instanceof Date) {
          _this._epochMilli = date.getTime();
          return _assertThisInitialized(_this);
        } else if (typeof date.toDate === 'function' && date.toDate() instanceof Date) {
          _this._epochMilli = date.toDate().getTime();
          return _assertThisInitialized(_this);
        }

        assert(false, 'date must be either a javascript date or a moment');
        return _this;
      }

      var _proto = NativeJsTemporal.prototype;

      _proto.query = function query(_query) {
        requireNonNull(_query, 'query');

        if (_query === TemporalQueries.localDate()) {
          return LocalDate.ofInstant(Instant.ofEpochMilli(this._epochMilli), this._zone);
        } else if (_query === TemporalQueries.localTime()) {
          return LocalTime.ofInstant(Instant.ofEpochMilli(this._epochMilli), this._zone);
        } else if (_query === TemporalQueries.zone()) {
          return this._zone;
        }

        return _TemporalAccessor.prototype.query.call(this, _query);
      };

      _proto.get = function get(field) {
        return this.getLong(field);
      };

      _proto.getLong = function getLong(field) {
        requireNonNull(field, 'field');

        if (field instanceof ChronoField) {
          switch (field) {
            case ChronoField.NANO_OF_SECOND:
              return MathUtil.floorMod(this._epochMilli, 1000) * 1000000;

            case ChronoField.INSTANT_SECONDS:
              return MathUtil.floorDiv(this._epochMilli, 1000);
          }

          throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
        }

        return field.getFrom(this);
      };

      _proto.isSupported = function isSupported(field) {
        return field === ChronoField.INSTANT_SECONDS || field === ChronoField.NANO_OF_SECOND;
      };

      return NativeJsTemporal;
    }(TemporalAccessor);

    function nativeJs(date, zone) {
      return new NativeJsTemporal(date, zone);
    }

    function bindUse(jsJoda) {
      var used = [];
      return function use(fn) {
        if (!~used.indexOf(fn)) {
          fn(jsJoda);
          used.push(fn);
        }

        return jsJoda;
      };
    }

    /**
     * @copyright (c) 2016, Philipp Thürwächter & Pattrick Hüper
     * @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
     */
    var _ = {
      assert: assert$1,
      DateTimeBuilder: DateTimeBuilder,
      DateTimeParseContext: DateTimeParseContext,
      DateTimePrintContext: DateTimePrintContext,
      MathUtil: MathUtil,
      StringUtil: StringUtil,
      StringBuilder: StringBuilder
    };
    var jsJodaExports = {
      _: _,
      convert: convert,
      nativeJs: nativeJs,
      ArithmeticException: ArithmeticException,
      DateTimeException: DateTimeException,
      DateTimeParseException: DateTimeParseException,
      IllegalArgumentException: IllegalArgumentException,
      IllegalStateException: IllegalStateException,
      UnsupportedTemporalTypeException: UnsupportedTemporalTypeException,
      NullPointerException: NullPointerException,
      Clock: Clock,
      DayOfWeek: DayOfWeek,
      Duration: Duration,
      Instant: Instant,
      LocalDate: LocalDate,
      LocalTime: LocalTime,
      LocalDateTime: LocalDateTime,
      OffsetTime: OffsetTime,
      OffsetDateTime: OffsetDateTime,
      Month: Month,
      MonthDay: MonthDay,
      Period: Period,
      Year: Year,
      YearConstants: YearConstants,
      YearMonth: YearMonth,
      ZonedDateTime: ZonedDateTime,
      ZoneOffset: ZoneOffset,
      ZoneId: ZoneId,
      ZoneRegion: ZoneRegion,
      ZoneOffsetTransition: ZoneOffsetTransition,
      ZoneRules: ZoneRules,
      ZoneRulesProvider: ZoneRulesProvider,
      ChronoLocalDate: ChronoLocalDate,
      ChronoLocalDateTime: ChronoLocalDateTime,
      ChronoZonedDateTime: ChronoZonedDateTime,
      IsoChronology: IsoChronology,
      ChronoField: ChronoField,
      ChronoUnit: ChronoUnit,
      IsoFields: IsoFields,
      Temporal: Temporal,
      TemporalAccessor: TemporalAccessor,
      TemporalAdjuster: TemporalAdjuster,
      TemporalAdjusters: TemporalAdjusters,
      TemporalAmount: TemporalAmount,
      TemporalField: TemporalField,
      TemporalQueries: TemporalQueries,
      TemporalQuery: TemporalQuery,
      TemporalUnit: TemporalUnit,
      ValueRange: ValueRange,
      DateTimeFormatter: DateTimeFormatter,
      DateTimeFormatterBuilder: DateTimeFormatterBuilder,
      DecimalStyle: DecimalStyle,
      ResolverStyle: ResolverStyle,
      SignStyle: SignStyle,
      TextStyle: TextStyle
    };
    var use = bindUse(jsJodaExports);
    jsJodaExports.use = use;

    exports.ArithmeticException = ArithmeticException;
    exports.ChronoField = ChronoField;
    exports.ChronoLocalDate = ChronoLocalDate;
    exports.ChronoLocalDateTime = ChronoLocalDateTime;
    exports.ChronoUnit = ChronoUnit;
    exports.ChronoZonedDateTime = ChronoZonedDateTime;
    exports.Clock = Clock;
    exports.DateTimeException = DateTimeException;
    exports.DateTimeFormatter = DateTimeFormatter;
    exports.DateTimeFormatterBuilder = DateTimeFormatterBuilder;
    exports.DateTimeParseException = DateTimeParseException;
    exports.DayOfWeek = DayOfWeek;
    exports.DecimalStyle = DecimalStyle;
    exports.Duration = Duration;
    exports.IllegalArgumentException = IllegalArgumentException;
    exports.IllegalStateException = IllegalStateException;
    exports.Instant = Instant;
    exports.IsoChronology = IsoChronology;
    exports.IsoFields = IsoFields;
    exports.LocalDate = LocalDate;
    exports.LocalDateTime = LocalDateTime;
    exports.LocalTime = LocalTime;
    exports.Month = Month;
    exports.MonthDay = MonthDay;
    exports.NullPointerException = NullPointerException;
    exports.OffsetDateTime = OffsetDateTime;
    exports.OffsetTime = OffsetTime;
    exports.Period = Period;
    exports.ResolverStyle = ResolverStyle;
    exports.SignStyle = SignStyle;
    exports.Temporal = Temporal;
    exports.TemporalAccessor = TemporalAccessor;
    exports.TemporalAdjuster = TemporalAdjuster;
    exports.TemporalAdjusters = TemporalAdjusters;
    exports.TemporalAmount = TemporalAmount;
    exports.TemporalField = TemporalField;
    exports.TemporalQueries = TemporalQueries;
    exports.TemporalQuery = TemporalQuery;
    exports.TemporalUnit = TemporalUnit;
    exports.TextStyle = TextStyle;
    exports.UnsupportedTemporalTypeException = UnsupportedTemporalTypeException;
    exports.ValueRange = ValueRange;
    exports.Year = Year;
    exports.YearConstants = YearConstants;
    exports.YearMonth = YearMonth;
    exports.ZoneId = ZoneId;
    exports.ZoneOffset = ZoneOffset;
    exports.ZoneOffsetTransition = ZoneOffsetTransition;
    exports.ZoneRegion = ZoneRegion;
    exports.ZoneRules = ZoneRules;
    exports.ZoneRulesProvider = ZoneRulesProvider;
    exports.ZonedDateTime = ZonedDateTime;
    exports._ = _;
    exports.convert = convert;
    exports.nativeJs = nativeJs;
    exports.use = use;

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

}));
//# sourceMappingURL=js-joda.js.map
//! @version @js-joda/core - 5.2.0
//! @copyright (c) 2015-present, Philipp Thürwächter, Pattrick Hüper & js-joda contributors
//! @copyright (c) 2007-present, Stephen Colebourne & Michael Nascimento Santos
//! @license BSD-3-Clause (see LICENSE in the root directory of this source tree)
var JSJoda=function(t){"use strict";function e(t,e,n){function i(t){Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.message=t,e&&e.apply(this,arguments),this.toString=function(){return this.name+": "+this.message}}return void 0===n&&(n=Error),i.prototype=Object.create(n.prototype),i.prototype.name=t,i.prototype.constructor=i,i}var n=e("DateTimeException",(function(t,e){void 0===e&&(e=null);var n=t||this.name;null!==e&&e instanceof Error&&(n+="\n-------\nCaused by: "+e.stack+"\n-------\n");this.message=n})),i=e("DateTimeParseException",(function(t,e,n,i){void 0===e&&(e="");void 0===n&&(n=0);void 0===i&&(i=null);var r=t||this.name;r+=": "+e+", at index: "+n,null!==i&&i instanceof Error&&(r+="\n-------\nCaused by: "+i.stack+"\n-------\n");this.message=r,this.parsedString=function(){return e},this.errorIndex=function(){return n}})),r=e("UnsupportedTemporalTypeException",null,n),s=e("ArithmeticException"),o=e("IllegalArgumentException"),a=e("IllegalStateException"),u=e("NullPointerException");function h(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,f(t,e)}function f(t,e){return f=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},f(t,e)}function c(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}function l(t,e,n){if(!t)throw n?new n(e):new Error(e)}function _(t,e){if(null==t)throw new u(e+" must not be null");return t}function d(t,e,n){if(!(t instanceof e))throw new o(n+" must be an instance of "+(e.name?e.name:e)+(t&&t.constructor&&t.constructor.name?", but is "+t.constructor.name:""));return t}function p(t){throw new TypeError('abstract method "'+t+'" is not implemented')}var O=Object.freeze({__proto__:null,assert:l,requireNonNull:_,requireInstance:d,abstractMethodFail:p}),E=9007199254740991,S=-9007199254740991,m=function(){function t(){}return t.intDiv=function(e,n){var i=e/n;return i=t.roundDown(i),t.safeZero(i)},t.intMod=function(e,n){var i=e-t.intDiv(e,n)*n;return i=t.roundDown(i),t.safeZero(i)},t.roundDown=function(t){return t<0?Math.ceil(t):Math.floor(t)},t.floorDiv=function(e,n){var i=Math.floor(e/n);return t.safeZero(i)},t.floorMod=function(e,n){var i=e-t.floorDiv(e,n)*n;return t.safeZero(i)},t.safeAdd=function(e,n){if(t.verifyInt(e),t.verifyInt(n),0===e)return t.safeZero(n);if(0===n)return t.safeZero(e);var i=t.safeToInt(e+n);if(i===e||i===n)throw new s("Invalid addition beyond MAX_SAFE_INTEGER!");return i},t.safeSubtract=function(e,n){return t.verifyInt(e),t.verifyInt(n),0===e&&0===n?0:0===e?t.safeZero(-1*n):0===n?t.safeZero(e):t.safeToInt(e-n)},t.safeMultiply=function(e,n){if(t.verifyInt(e),t.verifyInt(n),1===e)return t.safeZero(n);if(1===n)return t.safeZero(e);if(0===e||0===n)return 0;var i=t.safeToInt(e*n);if(i/n!==e||e===S&&-1===n||n===S&&-1===e)throw new s("Multiplication overflows: "+e+" * "+n);return i},t.parseInt=function(t){function e(e){return t.apply(this,arguments)}return e.toString=function(){return t.toString()},e}((function(e){var n=parseInt(e);return t.safeToInt(n)})),t.safeToInt=function(e){return t.verifyInt(e),t.safeZero(e)},t.verifyInt=function(t){if(null==t)throw new s("Invalid value: '"+t+"', using null or undefined as argument");if(isNaN(t))throw new s("Invalid int value, using NaN as argument");if(t%1!=0)throw new s("Invalid value: '"+t+"' is a float");if(t>E||t<S)throw new s("Calculation overflows an int: "+t)},t.safeZero=function(t){return 0===t?0:+t},t.compareNumbers=function(t,e){return t<e?-1:t>e?1:0},t.smi=function(t){return t>>>1&1073741824|3221225471&t},t.hash=function(e){if(e!=e||e===1/0)return 0;for(var n=e;e>4294967295;)n^=e/=4294967295;return t.smi(n)},t.hashCode=function(){for(var e=17,n=arguments.length,i=new Array(n),r=0;r<n;r++)i[r]=arguments[r];for(var s=0,o=i;s<o.length;s++){var a=o[s];e=(e<<5)-e+t.hash(a)}return t.hash(e)},t}();m.MAX_SAFE_INTEGER=E,m.MIN_SAFE_INTEGER=S;var N=function(){function t(t){this._name=t}var e=t.prototype;return e.equals=function(t){return this===t},e.toString=function(){return this._name},e.toJSON=function(){return this.toString()},t}(),D=function(){function t(){}var e=t.prototype;return e.get=function(t){p("get")},e.units=function(){p("units")},e.addTo=function(t){p("addTo")},e.subtractFrom=function(t){p("subtractFrom")},t}();"undefined"!=typeof Symbol&&Symbol.toPrimitive&&(D.prototype[Symbol.toPrimitive]=function(t){if("number"!==t)return this.toString();throw new TypeError("A conversion from TemporalAmount to a number is not allowed. To compare use the methods .equals(), .compareTo(), .isBefore() or one that is more suitable to your use case.")});var A=function(){function t(){}var e=t.prototype;return e.duration=function(){p("duration")},e.isDurationEstimated=function(){p("isDurationEstimated")},e.isDateBased=function(){p("isDateBased")},e.isTimeBased=function(){p("isTimeBased")},e.isSupportedBy=function(t){p("isSupportedBy")},e.addTo=function(t,e){p("addTo")},e.between=function(t,e){p("between")},t}(),T=function(t){function e(e,n){var i;return(i=t.call(this)||this)._seconds=m.safeToInt(e),i._nanos=m.safeToInt(n),i}h(e,t),e.ofDays=function(t){return e._create(m.safeMultiply(t,he.SECONDS_PER_DAY),0)},e.ofHours=function(t){return e._create(m.safeMultiply(t,he.SECONDS_PER_HOUR),0)},e.ofMinutes=function(t){return e._create(m.safeMultiply(t,he.SECONDS_PER_MINUTE),0)},e.ofSeconds=function(t,n){void 0===n&&(n=0);var i=m.safeAdd(t,m.floorDiv(n,he.NANOS_PER_SECOND)),r=m.floorMod(n,he.NANOS_PER_SECOND);return e._create(i,r)},e.ofMillis=function(t){var n=m.intDiv(t,1e3),i=m.intMod(t,1e3);return i<0&&(i+=1e3,n--),e._create(n,1e6*i)},e.ofNanos=function(t){var e=m.intDiv(t,he.NANOS_PER_SECOND),n=m.intMod(t,he.NANOS_PER_SECOND);return n<0&&(n+=he.NANOS_PER_SECOND,e--),this._create(e,n)},e.of=function(t,n){return e.ZERO.plus(t,n)},e.from=function(t){_(t,"amount"),d(t,D);var n=e.ZERO;return t.units().forEach((function(e){n=n.plus(t.get(e),e)})),n},e.between=function(t,e){_(t,"startInclusive"),_(e,"endExclusive");var n=t.until(e,w.SECONDS),i=0;if(t.isSupported(R.NANO_OF_SECOND)&&e.isSupported(R.NANO_OF_SECOND))try{var r=t.getLong(R.NANO_OF_SECOND);if(i=e.getLong(R.NANO_OF_SECOND)-r,n>0&&i<0)i+=he.NANOS_PER_SECOND;else if(n<0&&i>0)i-=he.NANOS_PER_SECOND;else if(0===n&&0!==i){var s=e.with(R.NANO_OF_SECOND,r);n=t.until(s,w.SECONDS)}}catch(t){}return this.ofSeconds(n,i)},e.parse=function(t){_(t,"text");var n=new RegExp("([-+]?)P(?:([-+]?[0-9]+)D)?(T(?:([-+]?[0-9]+)H)?(?:([-+]?[0-9]+)M)?(?:([-+]?[0-9]+)(?:[.,]([0-9]{0,9}))?S)?)?","i").exec(t);if(null!==n&&"T"===n[3]==!1){var r="-"===n[1],s=n[2],o=n[4],a=n[5],u=n[6],h=n[7];if(null!=s||null!=o||null!=a||null!=u){var f=e._parseNumber(t,s,he.SECONDS_PER_DAY,"days"),c=e._parseNumber(t,o,he.SECONDS_PER_HOUR,"hours"),l=e._parseNumber(t,a,he.SECONDS_PER_MINUTE,"minutes"),d=e._parseNumber(t,u,1,"seconds"),p=null!=u&&"-"===u.charAt(0),O=e._parseFraction(t,h,p?-1:1);try{return e._create(r,f,c,l,d,O)}catch(e){throw new i("Text cannot be parsed to a Duration: overflow",t,0,e)}}}throw new i("Text cannot be parsed to a Duration",t,0)},e._parseNumber=function(t,e,n,r){if(null==e)return 0;try{return"+"===e[0]&&(e=e.substring(1)),m.safeMultiply(parseFloat(e),n)}catch(e){throw new i("Text cannot be parsed to a Duration: "+r,t,0,e)}},e._parseFraction=function(t,e,n){return null==e||0===e.length?0:(e=(e+"000000000").substring(0,9),parseFloat(e)*n)},e._create=function(){return arguments.length<=2?e._createSecondsNanos(arguments[0],arguments[1]):e._createNegateDaysHoursMinutesSecondsNanos(arguments[0],arguments[1],arguments[2],arguments[3],arguments[4],arguments[5])},e._createNegateDaysHoursMinutesSecondsNanos=function(t,n,i,r,s,o){var a=m.safeAdd(n,m.safeAdd(i,m.safeAdd(r,s)));return t?e.ofSeconds(a,o).negated():e.ofSeconds(a,o)},e._createSecondsNanos=function(t,n){return void 0===t&&(t=0),void 0===n&&(n=0),0===t&&0===n?e.ZERO:new e(t,n)};var n=e.prototype;return n.get=function(t){if(t===w.SECONDS)return this._seconds;if(t===w.NANOS)return this._nanos;throw new r("Unsupported unit: "+t)},n.units=function(){return[w.SECONDS,w.NANOS]},n.isZero=function(){return 0===this._seconds&&0===this._nanos},n.isNegative=function(){return this._seconds<0},n.seconds=function(){return this._seconds},n.nano=function(){return this._nanos},n.withSeconds=function(t){return e._create(t,this._nanos)},n.withNanos=function(t){return R.NANO_OF_SECOND.checkValidIntValue(t),e._create(this._seconds,t)},n.plusDuration=function(t){return _(t,"duration"),this.plus(t.seconds(),t.nano())},n.plus=function(t,e){return 1===arguments.length?this.plusDuration(t):2===arguments.length&&e instanceof A?this.plusAmountUnit(t,e):this.plusSecondsNanos(t,e)},n.plusAmountUnit=function(t,e){if(_(t,"amountToAdd"),_(e,"unit"),e===w.DAYS)return this.plusSecondsNanos(m.safeMultiply(t,he.SECONDS_PER_DAY),0);if(e.isDurationEstimated())throw new r("Unit must not have an estimated duration");if(0===t)return this;if(e instanceof w){switch(e){case w.NANOS:return this.plusNanos(t);case w.MICROS:return this.plusSecondsNanos(1e3*m.intDiv(t,1e9),1e3*m.intMod(t,1e9));case w.MILLIS:return this.plusMillis(t);case w.SECONDS:return this.plusSeconds(t)}return this.plusSecondsNanos(m.safeMultiply(e.duration().seconds(),t),0)}var n=e.duration().multipliedBy(t);return this.plusSecondsNanos(n.seconds(),n.nano())},n.plusDays=function(t){return this.plusSecondsNanos(m.safeMultiply(t,he.SECONDS_PER_DAY),0)},n.plusHours=function(t){return this.plusSecondsNanos(m.safeMultiply(t,he.SECONDS_PER_HOUR),0)},n.plusMinutes=function(t){return this.plusSecondsNanos(m.safeMultiply(t,he.SECONDS_PER_MINUTE),0)},n.plusSeconds=function(t){return this.plusSecondsNanos(t,0)},n.plusMillis=function(t){return this.plusSecondsNanos(m.intDiv(t,1e3),1e6*m.intMod(t,1e3))},n.plusNanos=function(t){return this.plusSecondsNanos(0,t)},n.plusSecondsNanos=function(t,n){if(_(t,"secondsToAdd"),_(n,"nanosToAdd"),0===t&&0===n)return this;var i=m.safeAdd(this._seconds,t);i=m.safeAdd(i,m.intDiv(n,he.NANOS_PER_SECOND)),n=m.intMod(n,he.NANOS_PER_SECOND);var r=m.safeAdd(this._nanos,n);return e.ofSeconds(i,r)},n.minus=function(t,e){return 1===arguments.length?this.minusDuration(t):this.minusAmountUnit(t,e)},n.minusDuration=function(t){_(t,"duration");var e=t.seconds(),n=t.nano();return e===S?this.plus(E,-n):this.plus(-e,-n)},n.minusAmountUnit=function(t,e){return _(t,"amountToSubtract"),_(e,"unit"),t===S?this.plusAmountUnit(E,e):this.plusAmountUnit(-t,e)},n.minusDays=function(t){return t===S?this.plusDays(E):this.plusDays(-t)},n.minusHours=function(t){return t===S?this.plusHours(E):this.plusHours(-t)},n.minusMinutes=function(t){return t===S?this.plusMinutes(E):this.plusMinutes(-t)},n.minusSeconds=function(t){return t===S?this.plusSeconds(E):this.plusSeconds(-t)},n.minusMillis=function(t){return t===S?this.plusMillis(E):this.plusMillis(-t)},n.minusNanos=function(t){return t===S?this.plusNanos(E):this.plusNanos(-t)},n.multipliedBy=function(t){if(0===t)return e.ZERO;if(1===t)return this;var n=m.safeMultiply(this._seconds,t),i=m.safeMultiply(this._nanos,t);return n+=m.intDiv(i,he.NANOS_PER_SECOND),i=m.intMod(i,he.NANOS_PER_SECOND),e.ofSeconds(n,i)},n.dividedBy=function(t){if(0===t)throw new s("Cannot divide by zero");if(1===t)return this;var n=m.intDiv(this._seconds,t),i=m.roundDown((this._seconds/t-n)*he.NANOS_PER_SECOND),r=m.intDiv(this._nanos,t);return r=i+r,e.ofSeconds(n,r)},n.negated=function(){return this.multipliedBy(-1)},n.abs=function(){return this.isNegative()?this.negated():this},n.addTo=function(t){return _(t,"temporal"),0!==this._seconds&&(t=t.plus(this._seconds,w.SECONDS)),0!==this._nanos&&(t=t.plus(this._nanos,w.NANOS)),t},n.subtractFrom=function(t){return _(t,"temporal"),0!==this._seconds&&(t=t.minus(this._seconds,w.SECONDS)),0!==this._nanos&&(t=t.minus(this._nanos,w.NANOS)),t},n.toDays=function(){return m.intDiv(this._seconds,he.SECONDS_PER_DAY)},n.toHours=function(){return m.intDiv(this._seconds,he.SECONDS_PER_HOUR)},n.toMinutes=function(){return m.intDiv(this._seconds,he.SECONDS_PER_MINUTE)},n.toMillis=function(){var t=Math.round(m.safeMultiply(this._seconds,1e3));return t=m.safeAdd(t,m.intDiv(this._nanos,1e6))},n.toNanos=function(){var t=m.safeMultiply(this._seconds,he.NANOS_PER_SECOND);return t=m.safeAdd(t,this._nanos)},n.compareTo=function(t){_(t,"otherDuration"),d(t,e,"otherDuration");var n=m.compareNumbers(this._seconds,t.seconds());return 0!==n?n:this._nanos-t.nano()},n.equals=function(t){return this===t||t instanceof e&&(this.seconds()===t.seconds()&&this.nano()===t.nano())},n.toString=function(){if(this===e.ZERO)return"PT0S";var t,n=m.intDiv(this._seconds,he.SECONDS_PER_HOUR),i=m.intDiv(m.intMod(this._seconds,he.SECONDS_PER_HOUR),he.SECONDS_PER_MINUTE),r=m.intMod(this._seconds,he.SECONDS_PER_MINUTE),s="PT";if(0!==n&&(s+=n+"H"),0!==i&&(s+=i+"M"),0===r&&0===this._nanos&&s.length>2)return s;if(r<0&&this._nanos>0?s+=-1===r?"-0":r+1:s+=r,this._nanos>0)for(s+=".",s+=t=(t=r<0?""+(2*he.NANOS_PER_SECOND-this._nanos):""+(he.NANOS_PER_SECOND+this._nanos)).slice(1,t.length);"0"===s.charAt(s.length-1);)s=s.slice(0,s.length-1);return s+="S"},n.toJSON=function(){return this.toString()},e}(D);var v=function(){};var w=function(t){function e(e,n){var i;return(i=t.call(this)||this)._name=e,i._duration=n,i}h(e,t);var n=e.prototype;return n.duration=function(){return this._duration},n.isDurationEstimated=function(){return this.isDateBased()||this===e.FOREVER},n.isDateBased=function(){return this.compareTo(e.DAYS)>=0&&this!==e.FOREVER},n.isTimeBased=function(){return this.compareTo(e.DAYS)<0},n.isSupportedBy=function(t){if(this===e.FOREVER)return!1;try{return t.plus(1,this),!0}catch(e){try{return t.plus(-1,this),!0}catch(t){return!1}}},n.addTo=function(t,e){return t.plus(e,this)},n.between=function(t,e){return t.until(e,this)},n.toString=function(){return this._name},n.compareTo=function(t){return this.duration().compareTo(t.duration())},e}(A);var y=function(){function t(){}var e=t.prototype;return e.isDateBased=function(){p("isDateBased")},e.isTimeBased=function(){p("isTimeBased")},e.baseUnit=function(){p("baseUnit")},e.rangeUnit=function(){p("rangeUnit")},e.range=function(){p("range")},e.rangeRefinedBy=function(t){p("rangeRefinedBy")},e.getFrom=function(t){p("getFrom")},e.adjustInto=function(t,e){p("adjustInto")},e.isSupportedBy=function(t){p("isSupportedBy")},e.displayName=function(){p("displayName")},e.equals=function(t){p("equals")},e.name=function(){p("name")},t}(),M=function(){function t(t,e,n,i){l(!(t>e),"Smallest minimum value '"+t+"' must be less than largest minimum value '"+e+"'",o),l(!(n>i),"Smallest maximum value '"+n+"' must be less than largest maximum value '"+i+"'",o),l(!(e>i),"Minimum value '"+e+"' must be less than maximum value '"+i+"'",o),this._minSmallest=t,this._minLargest=e,this._maxLargest=i,this._maxSmallest=n}var e=t.prototype;return e.isFixed=function(){return this._minSmallest===this._minLargest&&this._maxSmallest===this._maxLargest},e.minimum=function(){return this._minSmallest},e.largestMinimum=function(){return this._minLargest},e.maximum=function(){return this._maxLargest},e.smallestMaximum=function(){return this._maxSmallest},e.isValidValue=function(t){return this.minimum()<=t&&t<=this.maximum()},e.checkValidValue=function(t,e){return this.isValidValue(t)?t:l(!1,null!=e?"Invalid value for "+e+" (valid values "+this.toString()+"): "+t:"Invalid value (valid values "+this.toString()+"): "+t,n)},e.checkValidIntValue=function(t,e){if(!1===this.isValidIntValue(t))throw new n("Invalid int value for "+e+": "+t);return t},e.isValidIntValue=function(t){return this.isIntValue()&&this.isValidValue(t)},e.isIntValue=function(){return this.minimum()>=m.MIN_SAFE_INTEGER&&this.maximum()<=m.MAX_SAFE_INTEGER},e.equals=function(e){return e===this||e instanceof t&&(this._minSmallest===e._minSmallest&&this._minLargest===e._minLargest&&this._maxSmallest===e._maxSmallest&&this._maxLargest===e._maxLargest)},e.hashCode=function(){return m.hashCode(this._minSmallest,this._minLargest,this._maxSmallest,this._maxLargest)},e.toString=function(){var t=this.minimum()+(this.minimum()!==this.largestMinimum()?"/"+this.largestMinimum():"");return t+=" - ",t+=this.smallestMaximum()+(this.smallestMaximum()!==this.maximum()?"/"+this.maximum():"")},t.of=function(){return 2===arguments.length?new t(arguments[0],arguments[0],arguments[1],arguments[1]):3===arguments.length?new t(arguments[0],arguments[0],arguments[1],arguments[2]):4===arguments.length?new t(arguments[0],arguments[1],arguments[2],arguments[3]):l(!1,"Invalid number of arguments "+arguments.length,o)},t}(),R=function(t){function e(e,n,i,r){var s;return(s=t.call(this)||this)._name=e,s._baseUnit=n,s._rangeUnit=i,s._range=r,s}h(e,t),e.byName=function(t){for(var n in e)if(e[n]&&e[n]instanceof e&&e[n].name()===t)return e[n]};var n=e.prototype;return n.name=function(){return this._name},n.baseUnit=function(){return this._baseUnit},n.rangeUnit=function(){return this._rangeUnit},n.range=function(){return this._range},n.displayName=function(){return this.toString()},n.checkValidValue=function(t){return this.range().checkValidValue(t,this)},n.checkValidIntValue=function(t){return this.range().checkValidIntValue(t,this)},n.isDateBased=function(){return this===e.DAY_OF_WEEK||this===e.ALIGNED_DAY_OF_WEEK_IN_MONTH||this===e.ALIGNED_DAY_OF_WEEK_IN_YEAR||this===e.DAY_OF_MONTH||this===e.DAY_OF_YEAR||this===e.EPOCH_DAY||this===e.ALIGNED_WEEK_OF_MONTH||this===e.ALIGNED_WEEK_OF_YEAR||this===e.MONTH_OF_YEAR||this===e.YEAR_OF_ERA||this===e.YEAR||this===e.ERA},n.isTimeBased=function(){return this===e.NANO_OF_SECOND||this===e.NANO_OF_DAY||this===e.MICRO_OF_SECOND||this===e.MICRO_OF_DAY||this===e.MILLI_OF_SECOND||this===e.MILLI_OF_DAY||this===e.SECOND_OF_MINUTE||this===e.SECOND_OF_DAY||this===e.MINUTE_OF_HOUR||this===e.MINUTE_OF_DAY||this===e.HOUR_OF_AMPM||this===e.CLOCK_HOUR_OF_AMPM||this===e.HOUR_OF_DAY||this===e.CLOCK_HOUR_OF_DAY||this===e.AMPM_OF_DAY},n.rangeRefinedBy=function(t){return t.range(this)},n.getFrom=function(t){return t.getLong(this)},n.toString=function(){return this.name()},n.equals=function(t){return this===t},n.adjustInto=function(t,e){return t.with(this,e)},n.isSupportedBy=function(t){return t.isSupported(this)},e}(y);var g=function(){function t(){}return t.zoneId=function(){return t.ZONE_ID},t.chronology=function(){return t.CHRONO},t.precision=function(){return t.PRECISION},t.zone=function(){return t.ZONE},t.offset=function(){return t.OFFSET},t.localDate=function(){return t.LOCAL_DATE},t.localTime=function(){return t.LOCAL_TIME},t}(),I=function(){function t(){}var e=t.prototype;return e.query=function(t){return t===g.zoneId()||t===g.chronology()||t===g.precision()?null:t.queryFrom(this)},e.get=function(t){return this.range(t).checkValidIntValue(this.getLong(t),t)},e.getLong=function(t){p("getLong")},e.range=function(t){if(t instanceof R){if(this.isSupported(t))return t.range();throw new r("Unsupported field: "+t)}return t.rangeRefinedBy(this)},e.isSupported=function(t){p("isSupported")},t}(),F=function(t){function e(){return t.apply(this,arguments)||this}return h(e,t),e.prototype.queryFrom=function(t){p("queryFrom")},e}(N);function Y(t,e){var n=function(t){function e(){return t.apply(this,arguments)||this}return h(e,t),e}(F);return n.prototype.queryFrom=e,new n(t)}var C,L=function(t){function e(e,n){var i;return(i=t.call(this)||this)._ordinal=e,i._name=n,i}h(e,t);var i=e.prototype;return i.ordinal=function(){return this._ordinal},i.name=function(){return this._name},e.values=function(){return C.slice()},e.valueOf=function(t){for(var n=0;n<C.length&&C[n].name()!==t;n++);return e.of(n+1)},e.of=function(t){if(t<1||t>7)throw new n("Invalid value for DayOfWeek: "+t);return C[t-1]},e.from=function(t){if(l(null!=t,"temporal",u),t instanceof e)return t;try{return e.of(t.get(R.DAY_OF_WEEK))}catch(e){throw e instanceof n?new n("Unable to obtain DayOfWeek from TemporalAccessor: "+t+", type "+(null!=t.constructor?t.constructor.name:""),e):e}},i.value=function(){return this._ordinal+1},i.displayName=function(t,e){throw new o("Pattern using (localized) text not implemented yet!")},i.isSupported=function(t){return t instanceof R?t===R.DAY_OF_WEEK:null!=t&&t.isSupportedBy(this)},i.range=function(t){if(t===R.DAY_OF_WEEK)return t.range();if(t instanceof R)throw new r("Unsupported field: "+t);return t.rangeRefinedBy(this)},i.get=function(t){return t===R.DAY_OF_WEEK?this.value():this.range(t).checkValidIntValue(this.getLong(t),t)},i.getLong=function(t){if(t===R.DAY_OF_WEEK)return this.value();if(t instanceof R)throw new r("Unsupported field: "+t);return t.getFrom(this)},i.plus=function(t){var e=m.floorMod(t,7);return C[m.floorMod(this._ordinal+(e+7),7)]},i.minus=function(t){return this.plus(-1*m.floorMod(t,7))},i.query=function(t){return t===g.precision()?w.DAYS:t===g.localDate()||t===g.localTime()||t===g.chronology()||t===g.zone()||t===g.zoneId()||t===g.offset()?null:(l(null!=t,"query",u),t.queryFrom(this))},i.adjustInto=function(t){return _(t,"temporal"),t.with(R.DAY_OF_WEEK,this.value())},i.equals=function(t){return this===t},i.toString=function(){return this._name},i.compareTo=function(t){return _(t,"other"),d(t,e,"other"),this._ordinal-t._ordinal},i.toJSON=function(){return this.toString()},e}(I);var P,U=function(t){function e(e,n){var i;return(i=t.call(this)||this)._value=m.safeToInt(e),i._name=n,i}h(e,t);var i=e.prototype;return i.value=function(){return this._value},i.ordinal=function(){return this._value-1},i.name=function(){return this._name},i.displayName=function(t,e){throw new o("Pattern using (localized) text not implemented yet!")},i.isSupported=function(t){return null!==t&&(t instanceof R?t===R.MONTH_OF_YEAR:null!=t&&t.isSupportedBy(this))},i.get=function(t){return t===R.MONTH_OF_YEAR?this.value():this.range(t).checkValidIntValue(this.getLong(t),t)},i.getLong=function(t){if(t===R.MONTH_OF_YEAR)return this.value();if(t instanceof R)throw new r("Unsupported field: "+t);return t.getFrom(this)},i.plus=function(t){var n=m.intMod(t,12)+12,i=m.intMod(this.value()+n,12);return i=0===i?12:i,e.of(i)},i.minus=function(t){return this.plus(-1*m.intMod(t,12))},i.length=function(t){switch(this){case e.FEBRUARY:return t?29:28;case e.APRIL:case e.JUNE:case e.SEPTEMBER:case e.NOVEMBER:return 30;default:return 31}},i.minLength=function(){switch(this){case e.FEBRUARY:return 28;case e.APRIL:case e.JUNE:case e.SEPTEMBER:case e.NOVEMBER:return 30;default:return 31}},i.maxLength=function(){switch(this){case e.FEBRUARY:return 29;case e.APRIL:case e.JUNE:case e.SEPTEMBER:case e.NOVEMBER:return 30;default:return 31}},i.firstDayOfYear=function(t){var n=t?1:0;switch(this){case e.JANUARY:return 1;case e.FEBRUARY:return 32;case e.MARCH:return 60+n;case e.APRIL:return 91+n;case e.MAY:return 121+n;case e.JUNE:return 152+n;case e.JULY:return 182+n;case e.AUGUST:return 213+n;case e.SEPTEMBER:return 244+n;case e.OCTOBER:return 274+n;case e.NOVEMBER:return 305+n;case e.DECEMBER:default:return 335+n}},i.firstMonthOfQuarter=function(){switch(this){case e.JANUARY:case e.FEBRUARY:case e.MARCH:return e.JANUARY;case e.APRIL:case e.MAY:case e.JUNE:return e.APRIL;case e.JULY:case e.AUGUST:case e.SEPTEMBER:return e.JULY;case e.OCTOBER:case e.NOVEMBER:case e.DECEMBER:default:return e.OCTOBER}},i.query=function(e){return l(null!=e,"query() parameter must not be null",n),e===g.chronology()?$t.INSTANCE:e===g.precision()?w.MONTHS:t.prototype.query.call(this,e)},i.toString=function(){switch(this){case e.JANUARY:return"JANUARY";case e.FEBRUARY:return"FEBRUARY";case e.MARCH:return"MARCH";case e.APRIL:return"APRIL";case e.MAY:return"MAY";case e.JUNE:return"JUNE";case e.JULY:return"JULY";case e.AUGUST:return"AUGUST";case e.SEPTEMBER:return"SEPTEMBER";case e.OCTOBER:return"OCTOBER";case e.NOVEMBER:return"NOVEMBER";case e.DECEMBER:return"DECEMBER";default:return"unknown Month, value: "+this.value()}},i.toJSON=function(){return this.toString()},i.adjustInto=function(t){return t.with(R.MONTH_OF_YEAR,this.value())},i.compareTo=function(t){return _(t,"other"),d(t,e,"other"),this._value-t._value},i.equals=function(t){return this===t},e.valueOf=function(t){for(var n=0;n<P.length&&P[n].name()!==t;n++);return e.of(n+1)},e.values=function(){return P.slice()},e.of=function(t){return(t<1||t>12)&&l(!1,"Invalid value for MonthOfYear: "+t,n),P[t-1]},e.from=function(t){if(t instanceof e)return t;try{return e.of(t.get(R.MONTH_OF_YEAR))}catch(e){throw new n("Unable to obtain Month from TemporalAccessor: "+t+" of type "+(t&&null!=t.constructor?t.constructor.name:""),e)}},e}(I);var V=/([-+]?)P(?:([-+]?[0-9]+)Y)?(?:([-+]?[0-9]+)M)?(?:([-+]?[0-9]+)W)?(?:([-+]?[0-9]+)D)?/,b=function(t){function e(n,i,r){var s;s=t.call(this)||this;var o=m.safeToInt(n),a=m.safeToInt(i),u=m.safeToInt(r);return 0===o&&0===a&&0===u?(e.ZERO||(s._years=o,s._months=a,s._days=u,e.ZERO=c(s)),e.ZERO||c(s)):(s._years=o,s._months=a,s._days=u,s)}h(e,t),e.ofYears=function(t){return e.create(t,0,0)},e.ofMonths=function(t){return e.create(0,t,0)},e.ofWeeks=function(t){return e.create(0,0,m.safeMultiply(t,7))},e.ofDays=function(t){return e.create(0,0,t)},e.of=function(t,n,i){return e.create(t,n,i)},e.from=function(t){if(t instanceof e)return t;_(t,"amount");for(var i=0,r=0,s=0,o=t.units(),a=0;a<o.length;a++){var u=o[a],h=t.get(u);if(u===w.YEARS)i=m.safeToInt(h);else if(u===w.MONTHS)r=m.safeToInt(h);else{if(u!==w.DAYS)throw new n("Unit must be Years, Months or Days, but was "+u);s=m.safeToInt(h)}}return e.create(i,r,s)},e.between=function(t,e){return _(t,"startDate"),_(e,"endDate"),d(t,oe,"startDate"),d(e,oe,"endDate"),t.until(e)},e.parse=function(t){_(t,"text");try{return e._parse(t)}catch(e){throw e instanceof s?new i("Text cannot be parsed to a Period",t,0,e):e}},e._parse=function(t){var n=V.exec(t);if(null!=n){var r="-"===n[1]?-1:1,s=n[2],o=n[3],a=n[4],u=n[5];if(null!=s||null!=o||null!=a||null!=u){var h=e._parseNumber(t,s,r),f=e._parseNumber(t,o,r),c=e._parseNumber(t,a,r),l=e._parseNumber(t,u,r);return l=m.safeAdd(l,m.safeMultiply(c,7)),e.create(h,f,l)}}throw new i("Text cannot be parsed to a Period",t,0)},e._parseNumber=function(t,e,n){if(null==e)return 0;var i=m.parseInt(e);return m.safeMultiply(i,n)},e.create=function(t,n,i){return new e(t,n,i)};var o=e.prototype;return o.units=function(){return[w.YEARS,w.MONTHS,w.DAYS]},o.chronology=function(){return $t.INSTANCE},o.get=function(t){if(t===w.YEARS)return this._years;if(t===w.MONTHS)return this._months;if(t===w.DAYS)return this._days;throw new r("Unsupported unit: "+t)},o.isZero=function(){return this===e.ZERO},o.isNegative=function(){return this._years<0||this._months<0||this._days<0},o.years=function(){return this._years},o.months=function(){return this._months},o.days=function(){return this._days},o.withYears=function(t){return t===this._years?this:e.create(t,this._months,this._days)},o.withMonths=function(t){return t===this._months?this:e.create(this._years,t,this._days)},o.withDays=function(t){return t===this._days?this:e.create(this._years,this._months,t)},o.plus=function(t){var n=e.from(t);return e.create(m.safeAdd(this._years,n._years),m.safeAdd(this._months,n._months),m.safeAdd(this._days,n._days))},o.plusYears=function(t){return 0===t?this:e.create(m.safeToInt(m.safeAdd(this._years,t)),this._months,this._days)},o.plusMonths=function(t){return 0===t?this:e.create(this._years,m.safeToInt(m.safeAdd(this._months,t)),this._days)},o.plusDays=function(t){return 0===t?this:e.create(this._years,this._months,m.safeToInt(m.safeAdd(this._days,t)))},o.minus=function(t){var n=e.from(t);return e.create(m.safeSubtract(this._years,n._years),m.safeSubtract(this._months,n._months),m.safeSubtract(this._days,n._days))},o.minusYears=function(t){return this.plusYears(-1*t)},o.minusMonths=function(t){return this.plusMonths(-1*t)},o.minusDays=function(t){return this.plusDays(-1*t)},o.multipliedBy=function(t){return this===e.ZERO||1===t?this:e.create(m.safeMultiply(this._years,t),m.safeMultiply(this._months,t),m.safeMultiply(this._days,t))},o.negated=function(){return this.multipliedBy(-1)},o.normalized=function(){var t=this.toTotalMonths(),n=m.intDiv(t,12),i=m.intMod(t,12);return n===this._years&&i===this._months?this:e.create(m.safeToInt(n),i,this._days)},o.toTotalMonths=function(){return 12*this._years+this._months},o.addTo=function(t){return _(t,"temporal"),0!==this._years?t=0!==this._months?t.plus(this.toTotalMonths(),w.MONTHS):t.plus(this._years,w.YEARS):0!==this._months&&(t=t.plus(this._months,w.MONTHS)),0!==this._days&&(t=t.plus(this._days,w.DAYS)),t},o.subtractFrom=function(t){return _(t,"temporal"),0!==this._years?t=0!==this._months?t.minus(this.toTotalMonths(),w.MONTHS):t.minus(this._years,w.YEARS):0!==this._months&&(t=t.minus(this._months,w.MONTHS)),0!==this._days&&(t=t.minus(this._days,w.DAYS)),t},o.equals=function(t){if(this===t)return!0;if(t instanceof e){var n=t;return this._years===n._years&&this._months===n._months&&this._days===n._days}return!1},o.hashCode=function(){return m.hashCode(this._years,this._months,this._days)},o.toString=function(){if(this===e.ZERO)return"P0D";var t="P";return 0!==this._years&&(t+=this._years+"Y"),0!==this._months&&(t+=this._months+"M"),0!==this._days&&(t+=this._days+"D"),t},o.toJSON=function(){return this.toString()},e}(D);var H=function(){function t(t){this._index=t,this._errorIndex=-1}var e=t.prototype;return e.getIndex=function(){return this._index},e.setIndex=function(t){this._index=t},e.getErrorIndex=function(){return this._errorIndex},e.setErrorIndex=function(t){this._errorIndex=t},t}(),W=function(){function t(){this._map={}}var e=t.prototype;return e.putAll=function(t){for(var e in t._map)this._map[e]=t._map[e];return this},e.containsKey=function(t){return this._map.hasOwnProperty(t.name())&&void 0!==this.get(t)},e.get=function(t){return this._map[t.name()]},e.put=function(t,e){return this.set(t,e)},e.set=function(t,e){return this._map[t.name()]=e,this},e.retainAll=function(t){for(var e={},n=0;n<t.length;n++){var i=t[n].name();e[i]=this._map[i]}return this._map=e,this},e.remove=function(t){var e=t.name(),n=this._map[e];return this._map[e]=void 0,n},e.keySet=function(){return this._map},e.clear=function(){this._map={}},t}(),x=function(t){function e(){return t.apply(this,arguments)||this}return h(e,t),e}(N);x.STRICT=new x("STRICT"),x.SMART=new x("SMART"),x.LENIENT=new x("LENIENT");var k=function(t){function e(){return t.apply(this,arguments)||this}h(e,t);var n=e.prototype;return n.isSupported=function(t){p("isSupported")},n.minus=function(t,e){return arguments.length<2?this._minusAmount(t):this._minusUnit(t,e)},n._minusAmount=function(t){return _(t,"amount"),d(t,D,"amount"),t.subtractFrom(this)},n._minusUnit=function(t,e){return _(t,"amountToSubtract"),_(e,"unit"),d(e,A,"unit"),this._plusUnit(-t,e)},n.plus=function(t,e){return arguments.length<2?this._plusAmount(t):this._plusUnit(t,e)},n._plusAmount=function(t){return _(t,"amount"),d(t,D,"amount"),t.addTo(this)},n._plusUnit=function(t,e){p("_plusUnit")},n.until=function(t,e){p("until")},n.with=function(t,e){return arguments.length<2?this._withAdjuster(t):this._withField(t,e)},n._withAdjuster=function(t){return _(t,"adjuster"),l("function"==typeof t.adjustInto,"adjuster must be a TemporalAdjuster",o),t.adjustInto(this)},n._withField=function(t,e){p("_withField")},e}(I);"undefined"!=typeof Symbol&&Symbol.toPrimitive&&(k.prototype[Symbol.toPrimitive]=function(t){if("number"!==t)return this.toString();throw new TypeError("A conversion from Temporal to a number is not allowed. To compare use the methods .equals(), .compareTo(), .isBefore() or one that is more suitable to your use case.")});var B=function(t){function e(){return t.apply(this,arguments)||this}h(e,t);var n=e.prototype;return n.isSupported=function(t){return t instanceof R||t instanceof w?t.isDateBased():null!=t&&t.isSupportedBy(this)},n.query=function(e){return e===g.chronology()?this.chronology():e===g.precision()?w.DAYS:e===g.localDate()?oe.ofEpochDay(this.toEpochDay()):e===g.localTime()||e===g.zone()||e===g.zoneId()||e===g.offset()?null:t.prototype.query.call(this,e)},n.adjustInto=function(t){return t.with(R.EPOCH_DAY,this.toEpochDay())},n.format=function(t){return _(t,"formatter"),d(t,xt,"formatter"),t.format(this)},e}(k),q=function(){function t(){}return t.startsWith=function(t,e){return 0===t.indexOf(e)},t.hashCode=function(t){var e=t.length;if(0===e)return 0;for(var n=0,i=0;i<e;i++){n=(n<<5)-n+t.charCodeAt(i),n|=0}return m.smi(n)},t}(),Z=function(){function t(){}t.systemDefault=function(){throw new n("not supported operation")},t.getAvailableZoneIds=function(){throw new n("not supported operation")},t.of=function(t){throw new n("not supported operation"+t)},t.ofOffset=function(t,e){throw new n("not supported operation"+t+e)},t.from=function(t){throw new n("not supported operation"+t)};var e=t.prototype;return e.id=function(){p("ZoneId.id")},e.rules=function(){p("ZoneId.rules")},e.normalized=function(){var t=this.rules();return t.isFixedOffset()?t.offset(ce.EPOCH):this},e.equals=function(e){return this===e||e instanceof t&&this.id()===e.id()},e.hashCode=function(){return q.hashCode(this.id())},e.toString=function(){return this.id()},e.toJSON=function(){return this.toString()},t}(),z=function(){function t(){}t.of=function(t){return _(t,"offset"),new K(t)};var e=t.prototype;return e.isFixedOffset=function(){p("ZoneRules.isFixedOffset")},e.offset=function(t){return t instanceof ce?this.offsetOfInstant(t):this.offsetOfLocalDateTime(t)},e.offsetOfInstant=function(t){p("ZoneRules.offsetInstant")},e.offsetOfEpochMilli=function(t){p("ZoneRules.offsetOfEpochMilli")},e.offsetOfLocalDateTime=function(t){p("ZoneRules.offsetLocalDateTime")},e.validOffsets=function(t){p("ZoneRules.validOffsets")},e.transition=function(t){p("ZoneRules.transition")},e.standardOffset=function(t){p("ZoneRules.standardOffset")},e.daylightSavings=function(t){p("ZoneRules.daylightSavings")},e.isDaylightSavings=function(t){p("ZoneRules.isDaylightSavings")},e.isValidOffset=function(t,e){p("ZoneRules.isValidOffset")},e.nextTransition=function(t){p("ZoneRules.nextTransition")},e.previousTransition=function(t){p("ZoneRules.previousTransition")},e.transitions=function(){p("ZoneRules.transitions")},e.transitionRules=function(){p("ZoneRules.transitionRules")},e.toString=function(){p("ZoneRules.toString")},e.toJSON=function(){return this.toString()},t}(),K=function(t){function e(e){var n;return(n=t.call(this)||this)._offset=e,n}h(e,t);var n=e.prototype;return n.isFixedOffset=function(){return!0},n.offsetOfInstant=function(){return this._offset},n.offsetOfEpochMilli=function(){return this._offset},n.offsetOfLocalDateTime=function(){return this._offset},n.validOffsets=function(){return[this._offset]},n.transition=function(){return null},n.standardOffset=function(){return this._offset},n.daylightSavings=function(){return T.ZERO},n.isDaylightSavings=function(){return!1},n.isValidOffset=function(t,e){return this._offset.equals(e)},n.nextTransition=function(){return null},n.previousTransition=function(){return null},n.transitions=function(){return[]},n.transitionRules=function(){return[]},n.equals=function(t){return this===t||t instanceof e&&this._offset.equals(t._offset)},n.toString=function(){return"FixedRules:"+this._offset.toString()},e}(z),j={},G={},X=function(t){function e(n){var i;return i=t.call(this)||this,e._validateTotalSeconds(n),i._totalSeconds=m.safeToInt(n),i._rules=z.of(c(i)),i._id=e._buildId(n),i}h(e,t);var i=e.prototype;return i.totalSeconds=function(){return this._totalSeconds},i.id=function(){return this._id},e._buildId=function(t){if(0===t)return"Z";var e=Math.abs(t),n=m.intDiv(e,he.SECONDS_PER_HOUR),i=m.intMod(m.intDiv(e,he.SECONDS_PER_MINUTE),he.MINUTES_PER_HOUR),r=(t<0?"-":"+")+(n<10?"0":"")+n+(i<10?":0":":")+i,s=m.intMod(e,he.SECONDS_PER_MINUTE);return 0!==s&&(r+=(s<10?":0":":")+s),r},e._validateTotalSeconds=function(t){if(Math.abs(t)>e.MAX_SECONDS)throw new n("Zone offset not in valid range: -18:00 to +18:00")},e._validate=function(t,e,i){if(t<-18||t>18)throw new n("Zone offset hours not in valid range: value "+t+" is not in the range -18 to 18");if(t>0){if(e<0||i<0)throw new n("Zone offset minutes and seconds must be positive because hours is positive")}else if(t<0){if(e>0||i>0)throw new n("Zone offset minutes and seconds must be negative because hours is negative")}else if(e>0&&i<0||e<0&&i>0)throw new n("Zone offset minutes and seconds must have the same sign");if(Math.abs(e)>59)throw new n("Zone offset minutes not in valid range: abs(value) "+Math.abs(e)+" is not in the range 0 to 59");if(Math.abs(i)>59)throw new n("Zone offset seconds not in valid range: abs(value) "+Math.abs(i)+" is not in the range 0 to 59");if(18===Math.abs(t)&&(Math.abs(e)>0||Math.abs(i)>0))throw new n("Zone offset not in valid range: -18:00 to +18:00")},e.of=function(t){_(t,"offsetId");var i,r,s,o=G[t];if(null!=o)return o;switch(t.length){case 2:t=t[0]+"0"+t[1];case 3:i=e._parseNumber(t,1,!1),r=0,s=0;break;case 5:i=e._parseNumber(t,1,!1),r=e._parseNumber(t,3,!1),s=0;break;case 6:i=e._parseNumber(t,1,!1),r=e._parseNumber(t,4,!0),s=0;break;case 7:i=e._parseNumber(t,1,!1),r=e._parseNumber(t,3,!1),s=e._parseNumber(t,5,!1);break;case 9:i=e._parseNumber(t,1,!1),r=e._parseNumber(t,4,!0),s=e._parseNumber(t,7,!0);break;default:throw new n("Invalid ID for ZoneOffset, invalid format: "+t)}var a=t[0];if("+"!==a&&"-"!==a)throw new n("Invalid ID for ZoneOffset, plus/minus not found when expected: "+t);return"-"===a?e.ofHoursMinutesSeconds(-i,-r,-s):e.ofHoursMinutesSeconds(i,r,s)},e._parseNumber=function(t,e,i){if(i&&":"!==t[e-1])throw new n("Invalid ID for ZoneOffset, colon not found when expected: "+t);var r=t[e],s=t[e+1];if(r<"0"||r>"9"||s<"0"||s>"9")throw new n("Invalid ID for ZoneOffset, non numeric characters found: "+t);return 10*(r.charCodeAt(0)-48)+(s.charCodeAt(0)-48)},e.ofHours=function(t){return e.ofHoursMinutesSeconds(t,0,0)},e.ofHoursMinutes=function(t,n){return e.ofHoursMinutesSeconds(t,n,0)},e.ofHoursMinutesSeconds=function(t,n,i){e._validate(t,n,i);var r=t*he.SECONDS_PER_HOUR+n*he.SECONDS_PER_MINUTE+i;return e.ofTotalSeconds(r)},e.ofTotalMinutes=function(t){var n=t*he.SECONDS_PER_MINUTE;return e.ofTotalSeconds(n)},e.ofTotalSeconds=function(t){if(t%(15*he.SECONDS_PER_MINUTE)==0){var n=t,i=j[n];return null==i&&(i=new e(t),j[n]=i,G[i.id()]=i),i}return new e(t)},i.rules=function(){return this._rules},i.get=function(t){return this.getLong(t)},i.getLong=function(t){if(t===R.OFFSET_SECONDS)return this._totalSeconds;if(t instanceof R)throw new n("Unsupported field: "+t);return t.getFrom(this)},i.query=function(t){return _(t,"query"),t===g.offset()||t===g.zone()?this:t===g.localDate()||t===g.localTime()||t===g.precision()||t===g.chronology()||t===g.zoneId()?null:t.queryFrom(this)},i.adjustInto=function(t){return t.with(R.OFFSET_SECONDS,this._totalSeconds)},i.compareTo=function(t){return _(t,"other"),t._totalSeconds-this._totalSeconds},i.equals=function(t){return this===t||t instanceof e&&this._totalSeconds===t._totalSeconds},i.hashCode=function(){return this._totalSeconds},i.toString=function(){return this._id},e}(Z);var J=function(t){function e(){var e;return(e=t.call(this)||this).fieldValues=new W,e.chrono=null,e.zone=null,e.date=null,e.time=null,e.leapSecond=!1,e.excessDays=null,e}h(e,t),e.create=function(t,n){var i=new e;return i._addFieldValue(t,n),i};var i=e.prototype;return i.getFieldValue0=function(t){return this.fieldValues.get(t)},i._addFieldValue=function(t,e){_(t,"field");var i=this.getFieldValue0(t);if(null!=i&&i!==e)throw new n("Conflict found: "+t+" "+i+" differs from "+t+" "+e+": "+this);return this._putFieldValue0(t,e)},i._putFieldValue0=function(t,e){return this.fieldValues.put(t,e),this},i.resolve=function(t,e){return null!=e&&this.fieldValues.retainAll(e),this._mergeDate(t),this._mergeTime(t),this._resolveTimeInferZeroes(t),null!=this.excessDays&&!1===this.excessDays.isZero()&&null!=this.date&&null!=this.time&&(this.date=this.date.plus(this.excessDays),this.excessDays=b.ZERO),this._resolveInstant(),this},i._mergeDate=function(t){this._checkDate($t.INSTANCE.resolveDate(this.fieldValues,t))},i._checkDate=function(t){if(null!=t)for(var e in this._addObject(t),this.fieldValues.keySet()){var i=R.byName(e);if(i&&void 0!==this.fieldValues.get(i)&&i.isDateBased()){var r=void 0;try{r=t.getLong(i)}catch(t){if(t instanceof n)continue;throw t}var s=this.fieldValues.get(i);if(r!==s)throw new n("Conflict found: Field "+i+" "+r+" differs from "+i+" "+s+" derived from "+t)}}},i._mergeTime=function(t){if(this.fieldValues.containsKey(R.CLOCK_HOUR_OF_DAY)){var e=this.fieldValues.remove(R.CLOCK_HOUR_OF_DAY);t!==x.LENIENT&&(t===x.SMART&&0===e||R.CLOCK_HOUR_OF_DAY.checkValidValue(e)),this._addFieldValue(R.HOUR_OF_DAY,24===e?0:e)}if(this.fieldValues.containsKey(R.CLOCK_HOUR_OF_AMPM)){var n=this.fieldValues.remove(R.CLOCK_HOUR_OF_AMPM);t!==x.LENIENT&&(t===x.SMART&&0===n||R.CLOCK_HOUR_OF_AMPM.checkValidValue(n)),this._addFieldValue(R.HOUR_OF_AMPM,12===n?0:n)}if(t!==x.LENIENT&&(this.fieldValues.containsKey(R.AMPM_OF_DAY)&&R.AMPM_OF_DAY.checkValidValue(this.fieldValues.get(R.AMPM_OF_DAY)),this.fieldValues.containsKey(R.HOUR_OF_AMPM)&&R.HOUR_OF_AMPM.checkValidValue(this.fieldValues.get(R.HOUR_OF_AMPM))),this.fieldValues.containsKey(R.AMPM_OF_DAY)&&this.fieldValues.containsKey(R.HOUR_OF_AMPM)){var i=this.fieldValues.remove(R.AMPM_OF_DAY),r=this.fieldValues.remove(R.HOUR_OF_AMPM);this._addFieldValue(R.HOUR_OF_DAY,12*i+r)}if(this.fieldValues.containsKey(R.NANO_OF_DAY)){var s=this.fieldValues.remove(R.NANO_OF_DAY);t!==x.LENIENT&&R.NANO_OF_DAY.checkValidValue(s),this._addFieldValue(R.SECOND_OF_DAY,m.intDiv(s,1e9)),this._addFieldValue(R.NANO_OF_SECOND,m.intMod(s,1e9))}if(this.fieldValues.containsKey(R.MICRO_OF_DAY)){var o=this.fieldValues.remove(R.MICRO_OF_DAY);t!==x.LENIENT&&R.MICRO_OF_DAY.checkValidValue(o),this._addFieldValue(R.SECOND_OF_DAY,m.intDiv(o,1e6)),this._addFieldValue(R.MICRO_OF_SECOND,m.intMod(o,1e6))}if(this.fieldValues.containsKey(R.MILLI_OF_DAY)){var a=this.fieldValues.remove(R.MILLI_OF_DAY);t!==x.LENIENT&&R.MILLI_OF_DAY.checkValidValue(a),this._addFieldValue(R.SECOND_OF_DAY,m.intDiv(a,1e3)),this._addFieldValue(R.MILLI_OF_SECOND,m.intMod(a,1e3))}if(this.fieldValues.containsKey(R.SECOND_OF_DAY)){var u=this.fieldValues.remove(R.SECOND_OF_DAY);t!==x.LENIENT&&R.SECOND_OF_DAY.checkValidValue(u),this._addFieldValue(R.HOUR_OF_DAY,m.intDiv(u,3600)),this._addFieldValue(R.MINUTE_OF_HOUR,m.intMod(m.intDiv(u,60),60)),this._addFieldValue(R.SECOND_OF_MINUTE,m.intMod(u,60))}if(this.fieldValues.containsKey(R.MINUTE_OF_DAY)){var h=this.fieldValues.remove(R.MINUTE_OF_DAY);t!==x.LENIENT&&R.MINUTE_OF_DAY.checkValidValue(h),this._addFieldValue(R.HOUR_OF_DAY,m.intDiv(h,60)),this._addFieldValue(R.MINUTE_OF_HOUR,m.intMod(h,60))}if(t!==x.LENIENT&&(this.fieldValues.containsKey(R.MILLI_OF_SECOND)&&R.MILLI_OF_SECOND.checkValidValue(this.fieldValues.get(R.MILLI_OF_SECOND)),this.fieldValues.containsKey(R.MICRO_OF_SECOND)&&R.MICRO_OF_SECOND.checkValidValue(this.fieldValues.get(R.MICRO_OF_SECOND))),this.fieldValues.containsKey(R.MILLI_OF_SECOND)&&this.fieldValues.containsKey(R.MICRO_OF_SECOND)){var f=this.fieldValues.remove(R.MILLI_OF_SECOND),c=this.fieldValues.get(R.MICRO_OF_SECOND);this._putFieldValue0(R.MICRO_OF_SECOND,1e3*f+m.intMod(c,1e3))}if(this.fieldValues.containsKey(R.MICRO_OF_SECOND)&&this.fieldValues.containsKey(R.NANO_OF_SECOND)){var l=this.fieldValues.get(R.NANO_OF_SECOND);this._putFieldValue0(R.MICRO_OF_SECOND,m.intDiv(l,1e3)),this.fieldValues.remove(R.MICRO_OF_SECOND)}if(this.fieldValues.containsKey(R.MILLI_OF_SECOND)&&this.fieldValues.containsKey(R.NANO_OF_SECOND)){var _=this.fieldValues.get(R.NANO_OF_SECOND);this._putFieldValue0(R.MILLI_OF_SECOND,m.intDiv(_,1e6)),this.fieldValues.remove(R.MILLI_OF_SECOND)}if(this.fieldValues.containsKey(R.MICRO_OF_SECOND)){var d=this.fieldValues.remove(R.MICRO_OF_SECOND);this._putFieldValue0(R.NANO_OF_SECOND,1e3*d)}else if(this.fieldValues.containsKey(R.MILLI_OF_SECOND)){var p=this.fieldValues.remove(R.MILLI_OF_SECOND);this._putFieldValue0(R.NANO_OF_SECOND,1e6*p)}},i._resolveTimeInferZeroes=function(t){var e=this.fieldValues.get(R.HOUR_OF_DAY),n=this.fieldValues.get(R.MINUTE_OF_HOUR),i=this.fieldValues.get(R.SECOND_OF_MINUTE),r=this.fieldValues.get(R.NANO_OF_SECOND);if(null!=e&&(null!=n||null==i&&null==r)&&(null==n||null!=i||null==r)){if(t!==x.LENIENT){if(null!=e){t!==x.SMART||24!==e||null!=n&&0!==n||null!=i&&0!==i||null!=r&&0!==r||(e=0,this.excessDays=b.ofDays(1));var s=R.HOUR_OF_DAY.checkValidIntValue(e);if(null!=n){var o=R.MINUTE_OF_HOUR.checkValidIntValue(n);if(null!=i){var a=R.SECOND_OF_MINUTE.checkValidIntValue(i);if(null!=r){var u=R.NANO_OF_SECOND.checkValidIntValue(r);this._addObject(he.of(s,o,a,u))}else this._addObject(he.of(s,o,a))}else null==r&&this._addObject(he.of(s,o))}else null==i&&null==r&&this._addObject(he.of(s,0))}}else if(null!=e){var h=e;if(null!=n)if(null!=i){null==r&&(r=0);var f=m.safeMultiply(h,36e11);f=m.safeAdd(f,m.safeMultiply(n,6e10)),f=m.safeAdd(f,m.safeMultiply(i,1e9)),f=m.safeAdd(f,r);var c=m.floorDiv(f,864e11),l=m.floorMod(f,864e11);this._addObject(he.ofNanoOfDay(l)),this.excessDays=b.ofDays(c)}else{var _=m.safeMultiply(h,3600);_=m.safeAdd(_,m.safeMultiply(n,60));var d=m.floorDiv(_,86400),p=m.floorMod(_,86400);this._addObject(he.ofSecondOfDay(p)),this.excessDays=b.ofDays(d)}else{var O=m.safeToInt(m.floorDiv(h,24));h=m.floorMod(h,24),this._addObject(he.of(h,0)),this.excessDays=b.ofDays(O)}}this.fieldValues.remove(R.HOUR_OF_DAY),this.fieldValues.remove(R.MINUTE_OF_HOUR),this.fieldValues.remove(R.SECOND_OF_MINUTE),this.fieldValues.remove(R.NANO_OF_SECOND)}},i._addObject=function(t){t instanceof B?this.date=t:t instanceof he&&(this.time=t)},i._resolveInstant=function(){if(null!=this.date&&null!=this.time){var t=this.fieldValues.get(R.OFFSET_SECONDS);if(null!=t){var e=X.ofTotalSeconds(t),n=this.date.atTime(this.time).atZone(e).getLong(R.INSTANT_SECONDS);this.fieldValues.put(R.INSTANT_SECONDS,n)}else if(null!=this.zone){var i=this.date.atTime(this.time).atZone(this.zone).getLong(R.INSTANT_SECONDS);this.fieldValues.put(R.INSTANT_SECONDS,i)}}},i.build=function(t){return t.queryFrom(this)},i.isSupported=function(t){return null!=t&&(this.fieldValues.containsKey(t)&&void 0!==this.fieldValues.get(t)||null!=this.date&&this.date.isSupported(t)||null!=this.time&&this.time.isSupported(t))},i.getLong=function(t){_(t,"field");var e=this.getFieldValue0(t);if(null==e){if(null!=this.date&&this.date.isSupported(t))return this.date.getLong(t);if(null!=this.time&&this.time.isSupported(t))return this.time.getLong(t);throw new n("Field not found: "+t)}return e},i.query=function(t){return t===g.zoneId()?this.zone:t===g.chronology()?this.chrono:t===g.localDate()?null!=this.date?oe.from(this.date):null:t===g.localTime()?this.time:t===g.zone()||t===g.offset()?t.queryFrom(this):t===g.precision()?null:t.queryFrom(this)},e}(I),Q=function(){function t(){if(1===arguments.length){if(arguments[0]instanceof t)return void this._constructorSelf.apply(this,arguments);this._constructorFormatter.apply(this,arguments)}else this._constructorParam.apply(this,arguments);this._caseSensitive=!0,this._strict=!0,this._parsed=[new $(this)]}var e=t.prototype;return e._constructorParam=function(t,e,n){this._locale=t,this._symbols=e,this._overrideChronology=n},e._constructorFormatter=function(t){this._locale=t.locale(),this._symbols=t.decimalStyle(),this._overrideChronology=t.chronology()},e._constructorSelf=function(t){this._locale=t._locale,this._symbols=t._symbols,this._overrideChronology=t._overrideChronology,this._overrideZone=t._overrideZone,this._caseSensitive=t._caseSensitive,this._strict=t._strict,this._parsed=[new $(this)]},e.copy=function(){return new t(this)},e.symbols=function(){return this._symbols},e.isStrict=function(){return this._strict},e.setStrict=function(t){this._strict=t},e.locale=function(){return this._locale},e.setLocale=function(t){this._locale=t},e.startOptional=function(){this._parsed.push(this.currentParsed().copy())},e.endOptional=function(t){t?this._parsed.splice(this._parsed.length-2,1):this._parsed.splice(this._parsed.length-1,1)},e.isCaseSensitive=function(){return this._caseSensitive},e.setCaseSensitive=function(t){this._caseSensitive=t},e.subSequenceEquals=function(t,e,n,i,r){if(e+r>t.length||i+r>n.length)return!1;this.isCaseSensitive()||(t=t.toLowerCase(),n=n.toLowerCase());for(var s=0;s<r;s++){if(t[e+s]!==n[i+s])return!1}return!0},e.charEquals=function(t,e){return this.isCaseSensitive()?t===e:this.charEqualsIgnoreCase(t,e)},e.charEqualsIgnoreCase=function(t,e){return t===e||t.toLowerCase()===e.toLowerCase()},e.setParsedField=function(t,e,n,i){var r=this.currentParsed().fieldValues,s=r.get(t);return r.set(t,e),null!=s&&s!==e?~n:i},e.setParsedZone=function(t){_(t,"zone"),this.currentParsed().zone=t},e.getParsed=function(t){return this.currentParsed().fieldValues.get(t)},e.toParsed=function(){return this.currentParsed()},e.currentParsed=function(){return this._parsed[this._parsed.length-1]},e.setParsedLeapSecond=function(){this.currentParsed().leapSecond=!0},e.getEffectiveChronology=function(){var t=this.currentParsed().chrono;return null==t&&null==(t=this._overrideChronology)&&(t=$t.INSTANCE),t},t}(),$=function(t){function e(e){var n;return(n=t.call(this)||this).chrono=null,n.zone=null,n.fieldValues=new W,n.leapSecond=!1,n.dateTimeParseContext=e,n}h(e,t);var n=e.prototype;return n.copy=function(){var t=new e;return t.chrono=this.chrono,t.zone=this.zone,t.fieldValues.putAll(this.fieldValues),t.leapSecond=this.leapSecond,t.dateTimeParseContext=this.dateTimeParseContext,t},n.toString=function(){return this.fieldValues+", "+this.chrono+", "+this.zone},n.isSupported=function(t){return this.fieldValues.containsKey(t)},n.get=function(t){var e=this.fieldValues.get(t);return l(null!=e),e},n.query=function(e){return e===g.chronology()?this.chrono:e===g.zoneId()||e===g.zone()?this.zone:t.prototype.query.call(this,e)},n.toBuilder=function(){var t=new J;return t.fieldValues.putAll(this.fieldValues),t.chrono=this.dateTimeParseContext.getEffectiveChronology(),null!=this.zone?t.zone=this.zone:t.zone=this.overrideZone,t.leapSecond=this.leapSecond,t.excessDays=this.excessDays,t},e}(k),tt=function(){function t(e,n,i){2===arguments.length&&arguments[1]instanceof xt?(this._temporal=t.adjust(e,n),this._locale=n.locale(),this._symbols=n.decimalStyle()):(this._temporal=e,this._locale=n,this._symbols=i),this._optional=0}t.adjust=function(t,e){return t};var e=t.prototype;return e.symbols=function(){return this._symbols},e.startOptional=function(){this._optional++},e.endOptional=function(){this._optional--},e.getValueQuery=function(t){var e=this._temporal.query(t);if(null==e&&0===this._optional)throw new n("Unable to extract value: "+this._temporal);return e},e.getValue=function(t){try{return this._temporal.getLong(t)}catch(t){if(t instanceof n&&this._optional>0)return null;throw t}},e.temporal=function(){return this._temporal},e.locale=function(){return this._locale},e.setDateTime=function(t){this._temporal=t},e.setLocale=function(t){this._locale=t},t}(),et={},nt=[0,90,181,273,0,91,182,274],it=function(t){function e(){return t.apply(this,arguments)||this}h(e,t);var n=e.prototype;return n.isDateBased=function(){return!0},n.isTimeBased=function(){return!1},n._isIso=function(){return!0},e._getWeekRangeByLocalDate=function(t){var n=e._getWeekBasedYear(t);return M.of(1,e._getWeekRangeByYear(n))},e._getWeekRangeByYear=function(t){var e=oe.of(t,1,1);return e.dayOfWeek()===L.THURSDAY||e.dayOfWeek()===L.WEDNESDAY&&e.isLeapYear()?53:52},e._getWeek=function(t){var n=t.dayOfWeek().ordinal(),i=t.dayOfYear()-1,r=i+(3-n),s=r-7*m.intDiv(r,7)-3;if(s<-3&&(s+=7),i<s)return e._getWeekRangeByLocalDate(t.withDayOfYear(180).minusYears(1)).maximum();var o=m.intDiv(i-s,7)+1;return 53===o&&!1===(-3===s||-2===s&&t.isLeapYear())&&(o=1),o},e._getWeekBasedYear=function(t){var e=t.year(),n=t.dayOfYear();if(n<=3)n-t.dayOfWeek().ordinal()<-2&&e--;else if(n>=363){var i=t.dayOfWeek().ordinal();(n=n-363-(t.isLeapYear()?1:0))-i>=0&&e++}return e},n.displayName=function(){return this.toString()},n.resolve=function(){return null},n.name=function(){return this.toString()},e}(y),rt=function(t){function e(){return t.apply(this,arguments)||this}h(e,t);var n=e.prototype;return n.toString=function(){return"DayOfQuarter"},n.baseUnit=function(){return w.DAYS},n.rangeUnit=function(){return dt},n.range=function(){return M.of(1,90,92)},n.isSupportedBy=function(t){return t.isSupported(R.DAY_OF_YEAR)&&t.isSupported(R.MONTH_OF_YEAR)&&t.isSupported(R.YEAR)&&this._isIso(t)},n.rangeRefinedBy=function(t){if(!1===t.isSupported(this))throw new r("Unsupported field: DayOfQuarter");var e=t.getLong(ft);if(1===e){var n=t.getLong(R.YEAR);return $t.isLeapYear(n)?M.of(1,91):M.of(1,90)}return 2===e?M.of(1,91):3===e||4===e?M.of(1,92):this.range()},n.getFrom=function(t){if(!1===t.isSupported(this))throw new r("Unsupported field: DayOfQuarter");var e=t.get(R.DAY_OF_YEAR),n=t.get(R.MONTH_OF_YEAR),i=t.getLong(R.YEAR);return e-nt[m.intDiv(n-1,3)+($t.isLeapYear(i)?4:0)]},n.adjustInto=function(t,e){var n=this.getFrom(t);return this.range().checkValidValue(e,this),t.with(R.DAY_OF_YEAR,t.getLong(R.DAY_OF_YEAR)+(e-n))},n.resolve=function(t,e,n){var i=t.get(R.YEAR),r=t.get(ft);if(null==i||null==r)return null;var s,o=R.YEAR.checkValidIntValue(i),a=t.get(ht);if(n===x.LENIENT){var u=r;s=(s=(s=oe.of(o,1,1)).plusMonths(m.safeMultiply(m.safeSubtract(u,1),3))).plusDays(m.safeSubtract(a,1))}else{var h=ft.range().checkValidIntValue(r,ft);if(n===x.STRICT){var f=92;1===h?f=$t.isLeapYear(o)?91:90:2===h&&(f=91),M.of(1,f).checkValidValue(a,this)}else this.range().checkValidValue(a,this);s=oe.of(o,3*(h-1)+1,1).plusDays(a-1)}return t.remove(this),t.remove(R.YEAR),t.remove(ft),s},e}(it),st=function(t){function e(){return t.apply(this,arguments)||this}h(e,t);var n=e.prototype;return n.toString=function(){return"QuarterOfYear"},n.baseUnit=function(){return dt},n.rangeUnit=function(){return w.YEARS},n.range=function(){return M.of(1,4)},n.isSupportedBy=function(t){return t.isSupported(R.MONTH_OF_YEAR)&&this._isIso(t)},n.rangeRefinedBy=function(t){return this.range()},n.getFrom=function(t){if(!1===t.isSupported(this))throw new r("Unsupported field: QuarterOfYear");var e=t.getLong(R.MONTH_OF_YEAR);return m.intDiv(e+2,3)},n.adjustInto=function(t,e){var n=this.getFrom(t);return this.range().checkValidValue(e,this),t.with(R.MONTH_OF_YEAR,t.getLong(R.MONTH_OF_YEAR)+3*(e-n))},e}(it),ot=function(t){function e(){return t.apply(this,arguments)||this}h(e,t);var n=e.prototype;return n.toString=function(){return"WeekOfWeekBasedYear"},n.baseUnit=function(){return w.WEEKS},n.rangeUnit=function(){return _t},n.range=function(){return M.of(1,52,53)},n.isSupportedBy=function(t){return t.isSupported(R.EPOCH_DAY)&&this._isIso(t)},n.rangeRefinedBy=function(t){if(!1===t.isSupported(this))throw new r("Unsupported field: WeekOfWeekBasedYear");return it._getWeekRangeByLocalDate(oe.from(t))},n.getFrom=function(t){if(!1===t.isSupported(this))throw new r("Unsupported field: WeekOfWeekBasedYear");return it._getWeek(oe.from(t))},n.adjustInto=function(t,e){return this.range().checkValidValue(e,this),t.plus(m.safeSubtract(e,this.getFrom(t)),w.WEEKS)},n.resolve=function(t,e,n){var i=t.get(lt),r=t.get(R.DAY_OF_WEEK);if(null==i||null==r)return null;var s,o=lt.range().checkValidIntValue(i,lt),a=t.get(ct);if(n===x.LENIENT){var u=r,h=0;u>7?(h=m.intDiv(u-1,7),u=m.intMod(u-1,7)+1):u<1&&(h=m.intDiv(u,7)-1,u=m.intMod(u,7)+7),s=oe.of(o,1,4).plusWeeks(a-1).plusWeeks(h).with(R.DAY_OF_WEEK,u)}else{var f=R.DAY_OF_WEEK.checkValidIntValue(r);if(n===x.STRICT){var c=oe.of(o,1,4);it._getWeekRangeByLocalDate(c).checkValidValue(a,this)}else this.range().checkValidValue(a,this);s=oe.of(o,1,4).plusWeeks(a-1).with(R.DAY_OF_WEEK,f)}return t.remove(this),t.remove(lt),t.remove(R.DAY_OF_WEEK),s},n.displayName=function(){return"Week"},e}(it),at=function(t){function e(){return t.apply(this,arguments)||this}h(e,t);var n=e.prototype;return n.toString=function(){return"WeekBasedYear"},n.baseUnit=function(){return _t},n.rangeUnit=function(){return w.FOREVER},n.range=function(){return R.YEAR.range()},n.isSupportedBy=function(t){return t.isSupported(R.EPOCH_DAY)&&this._isIso(t)},n.rangeRefinedBy=function(t){return R.YEAR.range()},n.getFrom=function(t){if(!1===t.isSupported(this))throw new r("Unsupported field: WeekBasedYear");return it._getWeekBasedYear(oe.from(t))},n.adjustInto=function(t,e){if(!1===this.isSupportedBy(t))throw new r("Unsupported field: WeekBasedYear");var n=this.range().checkValidIntValue(e,lt),i=oe.from(t),s=i.get(R.DAY_OF_WEEK),o=it._getWeek(i);53===o&&52===it._getWeekRangeByYear(n)&&(o=52);var a=oe.of(n,1,4),u=s-a.get(R.DAY_OF_WEEK)+7*(o-1);return a=a.plusDays(u),t.with(a)},e}(it),ut=function(t){function e(e,n){var i;return(i=t.call(this)||this)._name=e,i._duration=n,i}h(e,t);var n=e.prototype;return n.duration=function(){return this._duration},n.isDurationEstimated=function(){return!0},n.isDateBased=function(){return!0},n.isTimeBased=function(){return!1},n.isSupportedBy=function(t){return t.isSupported(R.EPOCH_DAY)},n.addTo=function(t,e){switch(this){case _t:var n=m.safeAdd(t.get(lt),e);return t.with(lt,n);case dt:return t.plus(m.intDiv(e,256),w.YEARS).plus(3*m.intMod(e,256),w.MONTHS);default:throw new a("Unreachable")}},n.between=function(t,e){switch(this){case _t:return m.safeSubtract(e.getLong(lt),t.getLong(lt));case dt:return m.intDiv(t.until(e,w.MONTHS),3);default:throw new a("Unreachable")}},n.toString=function(){return name},e}(A),ht=null,ft=null,ct=null,lt=null,_t=null,dt=null;var pt=function(){function t(t,e,n,i){this._zeroDigit=t,this._zeroDigitCharCode=t.charCodeAt(0),this._positiveSign=e,this._negativeSign=n,this._decimalSeparator=i}var e=t.prototype;return e.positiveSign=function(){return this._positiveSign},e.withPositiveSign=function(e){return e===this._positiveSign?this:new t(this._zeroDigit,e,this._negativeSign,this._decimalSeparator)},e.negativeSign=function(){return this._negativeSign},e.withNegativeSign=function(e){return e===this._negativeSign?this:new t(this._zeroDigit,this._positiveSign,e,this._decimalSeparator)},e.zeroDigit=function(){return this._zeroDigit},e.withZeroDigit=function(e){return e===this._zeroDigit?this:new t(e,this._positiveSign,this._negativeSign,this._decimalSeparator)},e.decimalSeparator=function(){return this._decimalSeparator},e.withDecimalSeparator=function(e){return e===this._decimalSeparator?this:new t(this._zeroDigit,this._positiveSign,this._negativeSign,e)},e.convertToDigit=function(t){var e=t.charCodeAt(0)-this._zeroDigitCharCode;return e>=0&&e<=9?e:-1},e.convertNumberToI18N=function(t){if("0"===this._zeroDigit)return t;for(var e=this._zeroDigitCharCode-"0".charCodeAt(0),n="",i=0;i<t.length;i++)n+=String.fromCharCode(t.charCodeAt(i)+e);return n},e.equals=function(e){return this===e||e instanceof t&&(this._zeroDigit===e._zeroDigit&&this._positiveSign===e._positiveSign&&this._negativeSign===e._negativeSign&&this._decimalSeparator===e._decimalSeparator)},e.hashCode=function(){return this._zeroDigit+this._positiveSign+this._negativeSign+this._decimalSeparator},e.toString=function(){return"DecimalStyle["+this._zeroDigit+this._positiveSign+this._negativeSign+this._decimalSeparator+"]"},t.of=function(){throw new Error("not yet supported")},t.availableLocales=function(){throw new Error("not yet supported")},t}();pt.STANDARD=new pt("0","+","-",".");var Ot=function(t){function e(){return t.apply(this,arguments)||this}return h(e,t),e.prototype.parse=function(t,n,i){switch(this){case e.NORMAL:return!t||!n;case e.ALWAYS:case e.EXCEEDS_PAD:return!0;default:return!n&&!i}},e}(N);Ot.NORMAL=new Ot("NORMAL"),Ot.NEVER=new Ot("NEVER"),Ot.ALWAYS=new Ot("ALWAYS"),Ot.EXCEEDS_PAD=new Ot("EXCEEDS_PAD"),Ot.NOT_NEGATIVE=new Ot("NOT_NEGATIVE");var Et=function(t){function e(){return t.apply(this,arguments)||this}h(e,t);var n=e.prototype;return n.isStandalone=function(){switch(this){case e.FULL_STANDALONE:case e.SHORT_STANDALONE:case e.NARROW_STANDALONE:return!0;default:return!1}},n.asStandalone=function(){switch(this){case e.FULL:return e.FULL_STANDALONE;case e.SHORT:return e.SHORT_STANDALONE;case e.NARROW:return e.NARROW_STANDALONE;default:return this}},n.asNormal=function(){switch(this){case e.FULL_STANDALONE:return e.FULL;case e.SHORT_STANDALONE:return e.SHORT;case e.NARROW_STANDALONE:return e.NARROW;default:return this}},e}(N);Et.FULL=new Et("FULL"),Et.FULL_STANDALONE=new Et("FULL_STANDALONE"),Et.SHORT=new Et("SHORT"),Et.SHORT_STANDALONE=new Et("SHORT_STANDALONE"),Et.NARROW=new Et("NARROW"),Et.NARROW_STANDALONE=new Et("NARROW_STANDALONE");var St=function(){function t(t){if(t.length>1)throw new o('invalid literal, too long: "'+t+'"');this._literal=t}var e=t.prototype;return e.print=function(t,e){return e.append(this._literal),!0},e.parse=function(t,e,n){if(n===e.length)return~n;var i=e.charAt(n);return!1===t.charEquals(this._literal,i)?~n:n+this._literal.length},e.toString=function(){return"'"===this._literal?"''":"'"+this._literal+"'"},t}(),mt=function(){function t(t,e){this._printerParsers=t,this._optional=e}var e=t.prototype;return e.withOptional=function(e){return e===this._optional?this:new t(this._printerParsers,e)},e.print=function(t,e){var n=e.length();this._optional&&t.startOptional();try{for(var i=0;i<this._printerParsers.length;i++){if(!1===this._printerParsers[i].print(t,e))return e.setLength(n),!0}}finally{this._optional&&t.endOptional()}return!0},e.parse=function(t,e,n){if(this._optional){t.startOptional();for(var i=n,r=0;r<this._printerParsers.length;r++){if((i=this._printerParsers[r].parse(t,e,i))<0)return t.endOptional(!1),n}return t.endOptional(!0),i}for(var s=0;s<this._printerParsers.length;s++){if((n=this._printerParsers[s].parse(t,e,n))<0)break}return n},e.toString=function(){var t="";if(null!=this._printerParsers){t+=this._optional?"[":"(";for(var e=0;e<this._printerParsers.length;e++){t+=this._printerParsers[e].toString()}t+=this._optional?"]":")"}return t},t}(),Nt=function(){function t(t,e,n,i){if(_(t,"field"),!1===t.range().isFixed())throw new o("Field must have a fixed set of values: "+t);if(e<0||e>9)throw new o("Minimum width must be from 0 to 9 inclusive but was "+e);if(n<1||n>9)throw new o("Maximum width must be from 1 to 9 inclusive but was "+n);if(n<e)throw new o("Maximum width must exceed or equal the minimum width but "+n+" < "+e);this.field=t,this.minWidth=e,this.maxWidth=n,this.decimalPoint=i}var e=t.prototype;return e.print=function(t,e){var n=t.getValue(this.field);if(null===n)return!1;var i=t.symbols();if(0===n){if(this.minWidth>0){this.decimalPoint&&e.append(i.decimalSeparator());for(var r=0;r<this.minWidth;r++)e.append(i.zeroDigit())}}else{var s=this.convertToFraction(n,i.zeroDigit()),o=Math.min(Math.max(s.length,this.minWidth),this.maxWidth);if(1*(s=s.substr(0,o))>0)for(;s.length>this.minWidth&&"0"===s[s.length-1];)s=s.substr(0,s.length-1);var a=s;a=i.convertNumberToI18N(a),this.decimalPoint&&e.append(i.decimalSeparator()),e.append(a)}return!0},e.parse=function(t,e,n){var i=t.isStrict()?this.minWidth:0,r=t.isStrict()?this.maxWidth:9,s=e.length;if(n===s)return i>0?~n:n;if(this.decimalPoint){if(e[n]!==t.symbols().decimalSeparator())return i>0?~n:n;n++}var o=n+i;if(o>s)return~n;for(var a=Math.min(n+r,s),u=0,h=n;h<a;){var f=e.charAt(h++),c=t.symbols().convertToDigit(f);if(c<0){if(h<o)return~n;h--;break}u=10*u+c}var l=h-n,_=Math.pow(10,l),d=this.convertFromFraction(u,_);return t.setParsedField(this.field,d,n,h)},e.convertToFraction=function(t,e){var n=this.field.range();n.checkValidValue(t,this.field);for(var i=n.minimum(),r=n.maximum()-i+1,s=t-i,o=""+m.intDiv(1e9*s,r);o.length<9;)o=e+o;return o},e.convertFromFraction=function(t,e){var n=this.field.range(),i=n.minimum(),r=n.maximum()-i+1;return m.intDiv(t*r,e)},e.toString=function(){var t=this.decimalPoint?",DecimalPoint":"";return"Fraction("+this.field+","+this.minWidth+","+this.maxWidth+t+")"},t}(),Dt=[0,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9],At=function(){function t(t,e,n,i,r){void 0===r&&(r=0),this._field=t,this._minWidth=e,this._maxWidth=n,this._signStyle=i,this._subsequentWidth=r}var e=t.prototype;return e.field=function(){return this._field},e.minWidth=function(){return this._minWidth},e.maxWidth=function(){return this._maxWidth},e.signStyle=function(){return this._signStyle},e.withFixedWidth=function(){return-1===this._subsequentWidth?this:new t(this._field,this._minWidth,this._maxWidth,this._signStyle,-1)},e.withSubsequentWidth=function(e){return new t(this._field,this._minWidth,this._maxWidth,this._signStyle,this._subsequentWidth+e)},e._isFixedWidth=function(){return-1===this._subsequentWidth||this._subsequentWidth>0&&this._minWidth===this._maxWidth&&this._signStyle===Ot.NOT_NEGATIVE},e.print=function(t,e){var i=t.getValue(this._field);if(null==i)return!1;var r=this._getValue(t,i),s=t.symbols(),o=""+Math.abs(r);if(o.length>this._maxWidth)throw new n("Field "+this._field+" cannot be printed as the value "+r+" exceeds the maximum print width of "+this._maxWidth);if(o=s.convertNumberToI18N(o),r>=0)switch(this._signStyle){case Ot.EXCEEDS_PAD:this._minWidth<15&&r>=Dt[this._minWidth]&&e.append(s.positiveSign());break;case Ot.ALWAYS:e.append(s.positiveSign())}else switch(this._signStyle){case Ot.NORMAL:case Ot.EXCEEDS_PAD:case Ot.ALWAYS:e.append(s.negativeSign());break;case Ot.NOT_NEGATIVE:throw new n("Field "+this._field+" cannot be printed as the value "+r+" cannot be negative according to the SignStyle")}for(var a=0;a<this._minWidth-o.length;a++)e.append(s.zeroDigit());return e.append(o),!0},e.parse=function(t,e,n){var i=e.length;if(n===i)return~n;l(n>=0&&n<i);var r=e.charAt(n),o=!1,a=!1;if(r===t.symbols().positiveSign()){if(!1===this._signStyle.parse(!0,t.isStrict(),this._minWidth===this._maxWidth))return~n;a=!0,n++}else if(r===t.symbols().negativeSign()){if(!1===this._signStyle.parse(!1,t.isStrict(),this._minWidth===this._maxWidth))return~n;o=!0,n++}else if(this._signStyle===Ot.ALWAYS&&t.isStrict())return~n;var u=t.isStrict()||this._isFixedWidth()?this._minWidth:1,h=n+u;if(h>i)return~n;for(var f=(t.isStrict()||this._isFixedWidth()?this._maxWidth:9)+Math.max(this._subsequentWidth,0),c=0,_=n,d=0;d<2;d++){for(var p=Math.min(_+f,i);_<p;){var O=e.charAt(_++),E=t.symbols().convertToDigit(O);if(E<0){if(--_<h)return~n;break}if(_-n>15)throw new s("number text exceeds length");c=10*c+E}if(!(this._subsequentWidth>0&&0===d))break;var S=_-n;f=Math.max(u,S-this._subsequentWidth),_=n,c=0}if(o){if(0===c&&t.isStrict())return~(n-1);0!==c&&(c=-c)}else if(this._signStyle===Ot.EXCEEDS_PAD&&t.isStrict()){var m=_-n;if(a){if(m<=this._minWidth)return~(n-1)}else if(m>this._minWidth)return~n}return this._setValue(t,c,n,_)},e._getValue=function(t,e){return e},e._setValue=function(t,e,n,i){return t.setParsedField(this._field,e,n,i)},e.toString=function(){return 1===this._minWidth&&15===this._maxWidth&&this._signStyle===Ot.NORMAL?"Value("+this._field+")":this._minWidth===this._maxWidth&&this._signStyle===Ot.NOT_NEGATIVE?"Value("+this._field+","+this._minWidth+")":"Value("+this._field+","+this._minWidth+","+this._maxWidth+","+this._signStyle+")"},t}(),Tt=function(t){function e(e,i,r,s,a){var u;if(u=t.call(this,e,i,r,Ot.NOT_NEGATIVE)||this,i<1||i>10)throw new o("The width must be from 1 to 10 inclusive but was "+i);if(r<1||r>10)throw new o("The maxWidth must be from 1 to 10 inclusive but was "+r);if(r<i)throw new o("The maxWidth must be greater than the width");if(null===a){if(!1===e.range().isValidValue(s))throw new o("The base value must be within the range of the field");if(s+Dt[i]>m.MAX_SAFE_INTEGER)throw new n("Unable to add printer-parser as the range exceeds the capacity of an int")}return u._baseValue=s,u._baseDate=a,u}h(e,t);var i=e.prototype;return i._getValue=function(t,e){var n=Math.abs(e),i=this._baseValue;null!==this._baseDate&&(t.temporal(),i=$t.INSTANCE.date(this._baseDate).get(this._field));return e>=i&&e<i+Dt[this._minWidth]?n%Dt[this._minWidth]:n%Dt[this._maxWidth]},i._setValue=function(t,e,n,i){var r=this._baseValue;null!=this._baseDate&&(r=t.getEffectiveChronology().date(this._baseDate).get(this._field));if(i-n===this._minWidth&&e>=0){var s=Dt[this._minWidth],o=r-r%s;(e=r>0?o+e:o-e)<r&&(e+=s)}return t.setParsedField(this._field,e,n,i)},i.withFixedWidth=function(){return-1===this._subsequentWidth?this:new e(this._field,this._minWidth,this._maxWidth,this._baseValue,this._baseDate,-1)},i.withSubsequentWidth=function(t){return new e(this._field,this._minWidth,this._maxWidth,this._baseValue,this._baseDate,this._subsequentWidth+t)},i.isFixedWidth=function(e){return!1!==e.isStrict()&&t.prototype.isFixedWidth.call(this,e)},i.toString=function(){return"ReducedValue("+this._field+","+this._minWidth+","+this._maxWidth+","+(null!=this._baseDate?this._baseDate:this._baseValue)+")"},e}(At),vt=["+HH","+HHmm","+HH:mm","+HHMM","+HH:MM","+HHMMss","+HH:MM:ss","+HHMMSS","+HH:MM:SS"],wt=function(){function t(t,e){_(t,"noOffsetText"),_(e,"pattern"),this.noOffsetText=t,this.type=this._checkPattern(e)}var e=t.prototype;return e._checkPattern=function(t){for(var e=0;e<vt.length;e++)if(vt[e]===t)return e;throw new o("Invalid zone offset pattern: "+t)},e.print=function(t,e){var n=t.getValue(R.OFFSET_SECONDS);if(null==n)return!1;var i=m.safeToInt(n);if(0===i)e.append(this.noOffsetText);else{var r=Math.abs(m.intMod(m.intDiv(i,3600),100)),s=Math.abs(m.intMod(m.intDiv(i,60),60)),o=Math.abs(m.intMod(i,60)),a=e.length(),u=r;e.append(i<0?"-":"+").appendChar(m.intDiv(r,10)+"0").appendChar(m.intMod(r,10)+"0"),(this.type>=3||this.type>=1&&s>0)&&(e.append(this.type%2==0?":":"").appendChar(m.intDiv(s,10)+"0").appendChar(s%10+"0"),u+=s,(this.type>=7||this.type>=5&&o>0)&&(e.append(this.type%2==0?":":"").appendChar(m.intDiv(o,10)+"0").appendChar(o%10+"0"),u+=o)),0===u&&(e.setLength(a),e.append(this.noOffsetText))}return!0},e.parse=function(t,e,n){var i=e.length,r=this.noOffsetText.length;if(0===r){if(n===i)return t.setParsedField(R.OFFSET_SECONDS,0,n,n)}else{if(n===i)return~n;if(t.subSequenceEquals(e,n,this.noOffsetText,0,r))return t.setParsedField(R.OFFSET_SECONDS,0,n,n+r)}var s=e[n];if("+"===s||"-"===s){var o="-"===s?-1:1,a=[0,0,0,0];if(a[0]=n+1,!1===(this._parseNumber(a,1,e,!0)||this._parseNumber(a,2,e,this.type>=3)||this._parseNumber(a,3,e,!1))){var u=m.safeZero(o*(3600*a[1]+60*a[2]+a[3]));return t.setParsedField(R.OFFSET_SECONDS,u,n,a[0])}}return 0===r?t.setParsedField(R.OFFSET_SECONDS,0,n,n+r):~n},e._parseNumber=function(t,e,n,i){if((this.type+3)/2<e)return!1;var r=t[0];if(this.type%2==0&&e>1){if(r+1>n.length||":"!==n[r])return i;r++}if(r+2>n.length)return i;var s=n[r++],o=n[r++];if(s<"0"||s>"9"||o<"0"||o>"9")return i;var a=10*(s.charCodeAt(0)-48)+(o.charCodeAt(0)-48);return a<0||a>59?i:(t[e]=a,t[0]=r,!1)},e.toString=function(){var t=this.noOffsetText.replace("'","''");return"Offset("+vt[this.type]+",'"+t+"')"},t}();wt.INSTANCE_ID=new wt("Z","+HH:MM:ss"),wt.PATTERNS=vt;var yt=function(){function t(t,e,n){this._printerParser=t,this._padWidth=e,this._padChar=n}var e=t.prototype;return e.print=function(t,e){var i=e.length();if(!1===this._printerParser.print(t,e))return!1;var r=e.length()-i;if(r>this._padWidth)throw new n("Cannot print as output of "+r+" characters exceeds pad width of "+this._padWidth);for(var s=0;s<this._padWidth-r;s++)e.insert(i,this._padChar);return!0},e.parse=function(t,e,n){var i=t.isStrict(),r=t.isCaseSensitive();if(l(!(n>e.length)),l(n>=0),n===e.length)return~n;var s=n+this._padWidth;if(s>e.length){if(i)return~n;s=e.length}for(var o=n;o<s&&(r?e[o]===this._padChar:t.charEquals(e[o],this._padChar));)o++;e=e.substring(0,s);var a=this._printerParser.parse(t,e,o);return a!==s&&i?~(n+o):a},e.toString=function(){return"Pad("+this._printerParser+","+this._padWidth+(" "===this._padChar?")":",'"+this._padChar+"')")},t}(),Mt=function(t){function e(){return t.apply(this,arguments)||this}h(e,t);var n=e.prototype;return n.print=function(){return!0},n.parse=function(t,n,i){switch(this){case e.SENSITIVE:t.setCaseSensitive(!0);break;case e.INSENSITIVE:t.setCaseSensitive(!1);break;case e.STRICT:t.setStrict(!0);break;case e.LENIENT:t.setStrict(!1)}return i},n.toString=function(){switch(this){case e.SENSITIVE:return"ParseCaseSensitive(true)";case e.INSENSITIVE:return"ParseCaseSensitive(false)";case e.STRICT:return"ParseStrict(true)";case e.LENIENT:return"ParseStrict(false)"}},e}(N);Mt.SENSITIVE=new Mt("SENSITIVE"),Mt.INSENSITIVE=new Mt("INSENSITIVE"),Mt.STRICT=new Mt("STRICT"),Mt.LENIENT=new Mt("LENIENT");var Rt=function(){function t(t){this._literal=t}var e=t.prototype;return e.print=function(t,e){return e.append(this._literal),!0},e.parse=function(t,e,n){return l(!(n>e.length||n<0)),!1===t.subSequenceEquals(e,n,this._literal,0,this._literal.length)?~n:n+this._literal.length},e.toString=function(){return"'"+this._literal.replace("'","''")+"'"},t}(),gt=function(){function t(){}return t.getRules=function(t){throw new n("unsupported ZoneId:"+t)},t.getAvailableZoneIds=function(){return[]},t}(),It=function(t){function e(e,n){var i;return(i=t.call(this)||this)._id=e,i._rules=n,i}h(e,t),e.ofId=function(t){return new e(t,gt.getRules(t))};var n=e.prototype;return n.id=function(){return this._id},n.rules=function(){return this._rules},e}(Z),Ft=function(){function t(t,e){this.query=t,this.description=e}var e=t.prototype;return e.print=function(t,e){var n=t.getValueQuery(this.query);return null!=n&&(e.append(n.id()),!0)},e.parse=function(t,e,n){var i=e.length;if(n>i)return~n;if(n===i)return~n;var r=e.charAt(n);if("+"===r||"-"===r){var s=t.copy(),o=wt.INSTANCE_ID.parse(s,e,n);if(o<0)return o;var a=s.getParsed(R.OFFSET_SECONDS),u=X.ofTotalSeconds(a);return t.setParsedZone(u),o}if(i>=n+2){var h=e.charAt(n+1);if(t.charEquals(r,"U")&&t.charEquals(h,"T"))return i>=n+3&&t.charEquals(e.charAt(n+2),"C")?this._parsePrefixedOffset(t,e,n,n+3):this._parsePrefixedOffset(t,e,n,n+2);if(t.charEquals(r,"G")&&i>=n+3&&t.charEquals(h,"M")&&t.charEquals(e.charAt(n+2),"T"))return this._parsePrefixedOffset(t,e,n,n+3)}if("SYSTEM"===e.substr(n,6))return t.setParsedZone(Z.systemDefault()),n+6;if(t.charEquals(r,"Z"))return t.setParsedZone(X.UTC),n+1;var f=gt.getAvailableZoneIds();Lt.size!==f.length&&(Lt=Yt.createTreeMap(f));for(var c=i-n,l=Lt.treeMap,_=null,d=0;null!=l;){var p=e.substr(n,Math.min(l.length,c));null!=(l=l.get(p))&&l.isLeaf&&(_=p,d=l.length)}return null!=_?(t.setParsedZone(It.ofId(_)),n+d):~n},e._parsePrefixedOffset=function(t,e,n,i){var r=e.substring(n,i).toUpperCase(),s=t.copy();if(i<e.length&&t.charEquals(e.charAt(i),"Z"))return t.setParsedZone(Z.ofOffset(r,X.UTC)),i;var o=wt.INSTANCE_ID.parse(s,e,i);if(o<0)return t.setParsedZone(Z.ofOffset(r,X.UTC)),i;var a=s.getParsed(R.OFFSET_SECONDS),u=X.ofTotalSeconds(a);return t.setParsedZone(Z.ofOffset(r,u)),o},e.toString=function(){return this.description},t}(),Yt=function(){function t(t,e){this.size=t,this.treeMap=e}return t.createTreeMap=function(e){for(var n=e.sort((function(t,e){return t.length-e.length})),i=new Ct(n[0].length,!1),r=0;r<n.length;r++)i.add(n[r]);return new t(n.length,i)},t}(),Ct=function(){function t(t,e){void 0===t&&(t=0),void 0===e&&(e=!1),this.length=t,this.isLeaf=e,this._treeMap={}}var e=t.prototype;return e.add=function(e){var n=e.length;if(n===this.length)this._treeMap[e]=new t(n,!0);else if(n>this.length){var i=e.substr(0,this.length),r=this._treeMap[i];null==r&&(r=new t(n,!1),this._treeMap[i]=r),r.add(e)}},e.get=function(t){return this._treeMap[t]},t}(),Lt=new Yt([]),Pt=15,Ut=function(){function t(){this._active=this,this._parent=null,this._printerParsers=[],this._optional=!1,this._padNextWidth=0,this._padNextChar=null,this._valueParserIndex=-1}t._of=function(e,n){_(e,"parent"),_(n,"optional");var i=new t;return i._parent=e,i._optional=n,i};var e=t.prototype;return e.parseCaseSensitive=function(){return this._appendInternalPrinterParser(Mt.SENSITIVE),this},e.parseCaseInsensitive=function(){return this._appendInternalPrinterParser(Mt.INSENSITIVE),this},e.parseStrict=function(){return this._appendInternalPrinterParser(Mt.STRICT),this},e.parseLenient=function(){return this._appendInternalPrinterParser(Mt.LENIENT),this},e.appendValue=function(){return 1===arguments.length?this._appendValue1.apply(this,arguments):2===arguments.length?this._appendValue2.apply(this,arguments):this._appendValue4.apply(this,arguments)},e._appendValue1=function(t){return _(t),this._appendValuePrinterParser(new At(t,1,Pt,Ot.NORMAL)),this},e._appendValue2=function(t,e){if(_(t),e<1||e>Pt)throw new o("The width must be from 1 to 15 inclusive but was "+e);var n=new At(t,e,e,Ot.NOT_NEGATIVE);return this._appendValuePrinterParser(n),this},e._appendValue4=function(t,e,n,i){if(_(t),_(i),e===n&&i===Ot.NOT_NEGATIVE)return this._appendValue2(t,n);if(e<1||e>Pt)throw new o("The minimum width must be from 1 to 15 inclusive but was "+e);if(n<1||n>Pt)throw new o("The minimum width must be from 1 to 15 inclusive but was "+n);if(n<e)throw new o("The maximum width must exceed or equal the minimum width but "+n+" < "+e);var r=new At(t,e,n,i);return this._appendValuePrinterParser(r),this},e.appendValueReduced=function(){return 4===arguments.length&&arguments[3]instanceof B?this._appendValueReducedFieldWidthMaxWidthBaseDate.apply(this,arguments):this._appendValueReducedFieldWidthMaxWidthBaseValue.apply(this,arguments)},e._appendValueReducedFieldWidthMaxWidthBaseValue=function(t,e,n,i){_(t,"field");var r=new Tt(t,e,n,i,null);return this._appendValuePrinterParser(r),this},e._appendValueReducedFieldWidthMaxWidthBaseDate=function(t,e,n,i){_(t,"field"),_(i,"baseDate"),d(i,B,"baseDate");var r=new Tt(t,e,n,0,i);return this._appendValuePrinterParser(r),this},e._appendValuePrinterParser=function(t){if(l(null!=t),this._active._valueParserIndex>=0&&this._active._printerParsers[this._active._valueParserIndex]instanceof At){var e=this._active._valueParserIndex,n=this._active._printerParsers[e];t.minWidth()===t.maxWidth()&&t.signStyle()===Ot.NOT_NEGATIVE?(n=n.withSubsequentWidth(t.maxWidth()),this._appendInternal(t.withFixedWidth()),this._active._valueParserIndex=e):(n=n.withFixedWidth(),this._active._valueParserIndex=this._appendInternal(t)),this._active._printerParsers[e]=n}else this._active._valueParserIndex=this._appendInternal(t);return this},e.appendFraction=function(t,e,n,i){return this._appendInternal(new Nt(t,e,n,i)),this},e.appendInstant=function(t){if(void 0===t&&(t=-2),t<-2||t>9)throw new o("Invalid fractional digits: "+t);return this._appendInternal(new Ht(t)),this},e.appendOffsetId=function(){return this._appendInternal(wt.INSTANCE_ID),this},e.appendOffset=function(t,e){return this._appendInternalPrinterParser(new wt(e,t)),this},e.appendZoneId=function(){return this._appendInternal(new Ft(g.zoneId(),"ZoneId()")),this},e.appendPattern=function(t){return _(t,"pattern"),this._parsePattern(t),this},e.appendZoneText=function(){throw new o("Pattern using (localized) text not implemented, use @js-joda/locale plugin!")},e.appendText=function(){throw new o("Pattern using (localized) text not implemented, use @js-joda/locale plugin!")},e.appendLocalizedOffset=function(){throw new o("Pattern using (localized) text not implemented, use @js-joda/locale plugin!")},e.appendWeekField=function(){throw new o("Pattern using (localized) text not implemented, use @js-joda/locale plugin!")},e._parsePattern=function(t){for(var e={G:R.ERA,y:R.YEAR_OF_ERA,u:R.YEAR,Q:et.QUARTER_OF_YEAR,q:et.QUARTER_OF_YEAR,M:R.MONTH_OF_YEAR,L:R.MONTH_OF_YEAR,D:R.DAY_OF_YEAR,d:R.DAY_OF_MONTH,F:R.ALIGNED_DAY_OF_WEEK_IN_MONTH,E:R.DAY_OF_WEEK,c:R.DAY_OF_WEEK,e:R.DAY_OF_WEEK,a:R.AMPM_OF_DAY,H:R.HOUR_OF_DAY,k:R.CLOCK_HOUR_OF_DAY,K:R.HOUR_OF_AMPM,h:R.CLOCK_HOUR_OF_AMPM,m:R.MINUTE_OF_HOUR,s:R.SECOND_OF_MINUTE,S:R.NANO_OF_SECOND,A:R.MILLI_OF_DAY,n:R.NANO_OF_SECOND,N:R.NANO_OF_DAY},n=0;n<t.length;n++){var i=t.charAt(n);if(i>="A"&&i<="Z"||i>="a"&&i<="z"){for(var r=n++;n<t.length&&t.charAt(n)===i;n++);var s=n-r;if("p"===i){var a=0;if(n<t.length&&((i=t.charAt(n))>="A"&&i<="Z"||i>="a"&&i<="z")){for(a=s,r=n++;n<t.length&&t.charAt(n)===i;n++);s=n-r}if(0===a)throw new o("Pad letter 'p' must be followed by valid pad pattern: "+t);this.padNext(a)}var u=e[i];if(null!=u)this._parseField(i,s,u);else if("z"===i){if(s>4)throw new o("Too many pattern letters: "+i);4===s?this.appendZoneText(Et.FULL):this.appendZoneText(Et.SHORT)}else if("V"===i){if(2!==s)throw new o("Pattern letter count must be 2: "+i);this.appendZoneId()}else if("Z"===i)if(s<4)this.appendOffset("+HHMM","+0000");else if(4===s)this.appendLocalizedOffset(Et.FULL);else{if(5!==s)throw new o("Too many pattern letters: "+i);this.appendOffset("+HH:MM:ss","Z")}else if("O"===i)if(1===s)this.appendLocalizedOffset(Et.SHORT);else{if(4!==s)throw new o("Pattern letter count must be 1 or 4: "+i);this.appendLocalizedOffset(Et.FULL)}else if("X"===i){if(s>5)throw new o("Too many pattern letters: "+i);this.appendOffset(wt.PATTERNS[s+(1===s?0:1)],"Z")}else if("x"===i){if(s>5)throw new o("Too many pattern letters: "+i);var h=1===s?"+00":s%2==0?"+0000":"+00:00";this.appendOffset(wt.PATTERNS[s+(1===s?0:1)],h)}else if("W"===i){if(s>1)throw new o("Too many pattern letters: "+i);this.appendWeekField("W",s)}else if("w"===i){if(s>2)throw new o("Too many pattern letters: "+i);this.appendWeekField("w",s)}else{if("Y"!==i)throw new o("Unknown pattern letter: "+i);this.appendWeekField("Y",s)}n--}else if("'"===i){for(var f=n++;n<t.length;n++)if("'"===t.charAt(n)){if(!(n+1<t.length&&"'"===t.charAt(n+1)))break;n++}if(n>=t.length)throw new o("Pattern ends with an incomplete string literal: "+t);var c=t.substring(f+1,n);0===c.length?this.appendLiteral("'"):this.appendLiteral(c.replace("''","'"))}else if("["===i)this.optionalStart();else if("]"===i){if(null===this._active._parent)throw new o("Pattern invalid as it contains ] without previous [");this.optionalEnd()}else{if("{"===i||"}"===i||"#"===i)throw new o("Pattern includes reserved character: '"+i+"'");this.appendLiteral(i)}}},e._parseField=function(t,e,n){switch(t){case"u":case"y":2===e?this.appendValueReduced(n,2,2,Tt.BASE_DATE):e<4?this.appendValue(n,e,Pt,Ot.NORMAL):this.appendValue(n,e,Pt,Ot.EXCEEDS_PAD);break;case"M":case"Q":switch(e){case 1:this.appendValue(n);break;case 2:this.appendValue(n,2);break;case 3:this.appendText(n,Et.SHORT);break;case 4:this.appendText(n,Et.FULL);break;case 5:this.appendText(n,Et.NARROW);break;default:throw new o("Too many pattern letters: "+t)}break;case"L":case"q":switch(e){case 1:this.appendValue(n);break;case 2:this.appendValue(n,2);break;case 3:this.appendText(n,Et.SHORT_STANDALONE);break;case 4:this.appendText(n,Et.FULL_STANDALONE);break;case 5:this.appendText(n,Et.NARROW_STANDALONE);break;default:throw new o("Too many pattern letters: "+t)}break;case"e":switch(e){case 1:case 2:this.appendWeekField("e",e);break;case 3:this.appendText(n,Et.SHORT);break;case 4:this.appendText(n,Et.FULL);break;case 5:this.appendText(n,Et.NARROW);break;default:throw new o("Too many pattern letters: "+t)}break;case"c":switch(e){case 1:this.appendWeekField("c",e);break;case 2:throw new o("Invalid number of pattern letters: "+t);case 3:this.appendText(n,Et.SHORT_STANDALONE);break;case 4:this.appendText(n,Et.FULL_STANDALONE);break;case 5:this.appendText(n,Et.NARROW_STANDALONE);break;default:throw new o("Too many pattern letters: "+t)}break;case"a":if(1!==e)throw new o("Too many pattern letters: "+t);this.appendText(n,Et.SHORT);break;case"E":case"G":switch(e){case 1:case 2:case 3:this.appendText(n,Et.SHORT);break;case 4:this.appendText(n,Et.FULL);break;case 5:this.appendText(n,Et.NARROW);break;default:throw new o("Too many pattern letters: "+t)}break;case"S":this.appendFraction(R.NANO_OF_SECOND,e,e,!1);break;case"F":if(1!==e)throw new o("Too many pattern letters: "+t);this.appendValue(n);break;case"d":case"h":case"H":case"k":case"K":case"m":case"s":if(1===e)this.appendValue(n);else{if(2!==e)throw new o("Too many pattern letters: "+t);this.appendValue(n,e)}break;case"D":if(1===e)this.appendValue(n);else{if(!(e<=3))throw new o("Too many pattern letters: "+t);this.appendValue(n,e)}break;default:1===e?this.appendValue(n):this.appendValue(n,e)}},e.padNext=function(){return 1===arguments.length?this._padNext1.apply(this,arguments):this._padNext2.apply(this,arguments)},e._padNext1=function(t){return this._padNext2(t," ")},e._padNext2=function(t,e){if(t<1)throw new o("The pad width must be at least one but was "+t);return this._active._padNextWidth=t,this._active._padNextChar=e,this._active._valueParserIndex=-1,this},e.optionalStart=function(){return this._active._valueParserIndex=-1,this._active=t._of(this._active,!0),this},e.optionalEnd=function(){if(null==this._active._parent)throw new a("Cannot call optionalEnd() as there was no previous call to optionalStart()");if(this._active._printerParsers.length>0){var t=new mt(this._active._printerParsers,this._active._optional);this._active=this._active._parent,this._appendInternal(t)}else this._active=this._active._parent;return this},e._appendInternal=function(t){return l(null!=t),this._active._padNextWidth>0&&(null!=t&&(t=new yt(t,this._active._padNextWidth,this._active._padNextChar)),this._active._padNextWidth=0,this._active._padNextChar=0),this._active._printerParsers.push(t),this._active._valueParserIndex=-1,this._active._printerParsers.length-1},e.appendLiteral=function(t){return l(null!=t),t.length>0&&(1===t.length?this._appendInternalPrinterParser(new St(t.charAt(0))):this._appendInternalPrinterParser(new Rt(t))),this},e._appendInternalPrinterParser=function(t){return l(null!=t),this._active._padNextWidth>0&&(null!=t&&(t=new yt(t,this._active._padNextWidth,this._active._padNextChar)),this._active._padNextWidth=0,this._active._padNextChar=0),this._active._printerParsers.push(t),this._active._valueParserIndex=-1,this._active._printerParsers.length-1},e.append=function(t){return _(t,"formatter"),this._appendInternal(t._toPrinterParser(!1)),this},e.toFormatter=function(t){for(void 0===t&&(t=x.SMART);null!=this._active._parent;)this.optionalEnd();var e=new mt(this._printerParsers,!1);return new xt(e,null,pt.STANDARD,t,null,null,null)},t}(),Vt=31556952e4,bt=62167219200,Ht=function(){function t(t){this.fractionalDigits=t}var e=t.prototype;return e.print=function(t,e){var n=t.getValue(R.INSTANT_SECONDS),i=0;if(t.temporal().isSupported(R.NANO_OF_SECOND)&&(i=t.temporal().getLong(R.NANO_OF_SECOND)),null==n)return!1;var r=n,s=R.NANO_OF_SECOND.checkValidIntValue(i);if(r>=-62167219200){var o=r-Vt+bt,a=m.floorDiv(o,Vt)+1,u=m.floorMod(o,Vt),h=ue.ofEpochSecond(u-bt,0,X.UTC);a>0&&e.append("+").append(a),e.append(h.toString()),0===h.second()&&e.append(":00")}else{var f=r+bt,c=m.intDiv(f,Vt),l=m.intMod(f,Vt),_=ue.ofEpochSecond(l-bt,0,X.UTC),d=e.length();e.append(_.toString()),0===_.second()&&e.append(":00"),c<0&&(-1e4===_.year()?e.replace(d,d+2,""+(c-1)):0===l?e.insert(d,c):e.insert(d+1,Math.abs(c)))}if(-2===this.fractionalDigits)0!==s&&(e.append("."),0===m.intMod(s,1e6)?e.append((""+(m.intDiv(s,1e6)+1e3)).substring(1)):0===m.intMod(s,1e3)?e.append((""+(m.intDiv(s,1e3)+1e6)).substring(1)):e.append((""+(s+1e9)).substring(1)));else if(this.fractionalDigits>0||-1===this.fractionalDigits&&s>0){e.append(".");for(var p=1e8,O=0;-1===this.fractionalDigits&&s>0||O<this.fractionalDigits;O++){var E=m.intDiv(s,p);e.append(E),s-=E*p,p=m.intDiv(p,10)}}return e.append("Z"),!0},e.parse=function(t,e,n){var i=t.copy(),r=this.fractionalDigits<0?0:this.fractionalDigits,s=this.fractionalDigits<0?9:this.fractionalDigits,o=(new Ut).append(xt.ISO_LOCAL_DATE).appendLiteral("T").appendValue(R.HOUR_OF_DAY,2).appendLiteral(":").appendValue(R.MINUTE_OF_HOUR,2).appendLiteral(":").appendValue(R.SECOND_OF_MINUTE,2).appendFraction(R.NANO_OF_SECOND,r,s,!0).appendLiteral("Z").toFormatter()._toPrinterParser(!1).parse(i,e,n);if(o<0)return o;var a,u=i.getParsed(R.YEAR),h=i.getParsed(R.MONTH_OF_YEAR),f=i.getParsed(R.DAY_OF_MONTH),c=i.getParsed(R.HOUR_OF_DAY),l=i.getParsed(R.MINUTE_OF_HOUR),_=i.getParsed(R.SECOND_OF_MINUTE),d=i.getParsed(R.NANO_OF_SECOND),p=null!=_?_:0,O=null!=d?d:0,E=m.intMod(u,1e4),S=0;24===c&&0===l&&0===p&&0===O?(c=0,S=1):23===c&&59===l&&60===p&&(t.setParsedLeapSecond(),p=59);try{a=ue.of(E,h,f,c,l,p,0).plusDays(S).toEpochSecond(X.UTC),a+=m.safeMultiply(m.intDiv(u,1e4),Vt)}catch(t){return~n}var N=o;return N=t.setParsedField(R.INSTANT_SECONDS,a,n,N),t.setParsedField(R.NANO_OF_SECOND,O,n,N)},e.toString=function(){return"Instant()"},t}();var Wt=function(){function t(){this._str=""}var e=t.prototype;return e.append=function(t){return this._str+=t,this},e.appendChar=function(t){return this._str+=t[0],this},e.insert=function(t,e){return this._str=this._str.slice(0,t)+e+this._str.slice(t),this},e.replace=function(t,e,n){return this._str=this._str.slice(0,t)+n+this._str.slice(e),this},e.length=function(){return this._str.length},e.setLength=function(t){return this._str=this._str.slice(0,t),this},e.toString=function(){return this._str},t}(),xt=function(){function t(t,e,n,i,r,s,o){void 0===s&&(s=$t.INSTANCE),l(null!=t),l(null!=n),l(null!=i),this._printerParser=t,this._locale=e,this._decimalStyle=n,this._resolverStyle=i,this._resolverFields=r,this._chrono=s,this._zone=o}t.parsedExcessDays=function(){return t.PARSED_EXCESS_DAYS},t.parsedLeapSecond=function(){return t.PARSED_LEAP_SECOND},t.ofPattern=function(t){return(new Ut).appendPattern(t).toFormatter()};var e=t.prototype;return e.locale=function(){return this._locale},e.decimalStyle=function(){return this._decimalStyle},e.chronology=function(){return this._chrono},e.withChronology=function(e){return null!=this._chrono&&this._chrono.equals(e)?this:new t(this._printerParser,this._locale,this._decimalStyle,this._resolverStyle,this._resolverFields,e,this._zone)},e.withLocale=function(){return this},e.withResolverStyle=function(e){return _(e,"resolverStyle"),e.equals(this._resolverStyle)?this:new t(this._printerParser,this._locale,this._decimalStyle,e,this._resolverFields,this._chrono,this._zone)},e.format=function(t){var e=new Wt(32);return this._formatTo(t,e),e.toString()},e._formatTo=function(t,e){_(t,"temporal"),_(e,"appendable");var n=new tt(t,this);this._printerParser.print(n,e)},e.parse=function(t,e){return 1===arguments.length?this.parse1(t):this.parse2(t,e)},e.parse1=function(t){_(t,"text");try{return this._parseToBuilder(t,null).resolve(this._resolverStyle,this._resolverFields)}catch(e){throw e instanceof i?e:this._createError(t,e)}},e.parse2=function(t,e){_(t,"text"),_(e,"type");try{return this._parseToBuilder(t,null).resolve(this._resolverStyle,this._resolverFields).build(e)}catch(e){throw e instanceof i?e:this._createError(t,e)}},e._createError=function(t,e){var n="";return n=t.length>64?t.substring(0,64)+"...":t,new i("Text '"+n+"' could not be parsed: "+e.message,t,0,e)},e._parseToBuilder=function(t,e){var n=null!=e?e:new H(0),r=this._parseUnresolved0(t,n);if(null==r||n.getErrorIndex()>=0||null==e&&n.getIndex()<t.length){var s="";throw s=t.length>64?t.substr(0,64).toString()+"...":t,n.getErrorIndex()>=0?new i("Text '"+s+"' could not be parsed at index "+n.getErrorIndex(),t,n.getErrorIndex()):new i("Text '"+s+"' could not be parsed, unparsed text found at index "+n.getIndex(),t,n.getIndex())}return r.toBuilder()},e.parseUnresolved=function(t,e){return this._parseUnresolved0(t,e)},e._parseUnresolved0=function(t,e){l(null!=t,"text",u),l(null!=e,"position",u);var n=new Q(this),i=e.getIndex();return(i=this._printerParser.parse(n,t,i))<0?(e.setErrorIndex(~i),null):(e.setIndex(i),n.toParsed())},e._toPrinterParser=function(t){return this._printerParser.withOptional(t)},e.toString=function(){var t=this._printerParser.toString();return 0===t.indexOf("[")?t:t.substring(1,t.length-1)},t}();var kt,Bt=function(t){function e(e,n){var i;return(i=t.call(this)||this)._month=m.safeToInt(e),i._day=m.safeToInt(n),i}h(e,t),e.now=function(t){return 0===arguments.length?e.now0():1===arguments.length&&t instanceof Z?e.nowZoneId(t):e.nowClock(t)},e.now0=function(){return this.nowClock(le.systemDefaultZone())},e.nowZoneId=function(t){return _(t,"zone"),this.nowClock(le.system(t))},e.nowClock=function(t){_(t,"clock");var n=oe.now(t);return e.of(n.month(),n.dayOfMonth())},e.of=function(t,n){return 2===arguments.length&&t instanceof U?e.ofMonthNumber(t,n):e.ofNumberNumber(t,n)},e.ofMonthNumber=function(t,i){if(_(t,"month"),R.DAY_OF_MONTH.checkValidValue(i),i>t.maxLength())throw new n("Illegal value for DayOfMonth field, value "+i+" is not valid for month "+t.toString());return new e(t.value(),i)},e.ofNumberNumber=function(t,n){return _(t,"month"),_(n,"dayOfMonth"),e.of(U.of(t),n)},e.from=function(t){if(_(t,"temporal"),d(t,I,"temporal"),t instanceof e)return t;try{return e.of(t.get(R.MONTH_OF_YEAR),t.get(R.DAY_OF_MONTH))}catch(e){throw new n("Unable to obtain MonthDay from TemporalAccessor: "+t+", type "+(t&&null!=t.constructor?t.constructor.name:""))}},e.parse=function(t,n){return 1===arguments.length?e.parseString(t):e.parseStringFormatter(t,n)},e.parseString=function(t){return e.parseStringFormatter(t,kt)},e.parseStringFormatter=function(t,n){return _(t,"text"),_(n,"formatter"),d(n,xt,"formatter"),n.parse(t,e.FROM)};var i=e.prototype;return i.monthValue=function(){return this._month},i.month=function(){return U.of(this._month)},i.dayOfMonth=function(){return this._day},i.isSupported=function(t){return t instanceof R?t===R.MONTH_OF_YEAR||t===R.DAY_OF_MONTH:null!=t&&t.isSupportedBy(this)},i.range=function(e){return e===R.MONTH_OF_YEAR?e.range():e===R.DAY_OF_MONTH?M.of(1,this.month().minLength(),this.month().maxLength()):t.prototype.range.call(this,e)},i.get=function(t){return this.range(t).checkValidIntValue(this.getLong(t),t)},i.getLong=function(t){if(_(t,"field"),t instanceof R){switch(t){case R.DAY_OF_MONTH:return this._day;case R.MONTH_OF_YEAR:return this._month}throw new r("Unsupported field: "+t)}return t.getFrom(this)},i.isValidYear=function(t){return!1==(29===this._day&&2===this._month&&!1===Kt.isLeap(t))},i.withMonth=function(t){return this.with(U.of(t))},i.with=function(t){if(_(t,"month"),t.value()===this._month)return this;var n=Math.min(this._day,t.maxLength());return new e(t.value(),n)},i.withDayOfMonth=function(t){return t===this._day?this:e.of(this._month,t)},i.query=function(e){return _(e,"query"),d(e,F,"query"),e===g.chronology()?$t.INSTANCE:t.prototype.query.call(this,e)},i.adjustInto=function(t){return _(t,"temporal"),(t=t.with(R.MONTH_OF_YEAR,this._month)).with(R.DAY_OF_MONTH,Math.min(t.range(R.DAY_OF_MONTH).maximum(),this._day))},i.atYear=function(t){return oe.of(t,this._month,this.isValidYear(t)?this._day:28)},i.compareTo=function(t){_(t,"other"),d(t,e,"other");var n=this._month-t.monthValue();return 0===n&&(n=this._day-t.dayOfMonth()),n},i.isAfter=function(t){return _(t,"other"),d(t,e,"other"),this.compareTo(t)>0},i.isBefore=function(t){return _(t,"other"),d(t,e,"other"),this.compareTo(t)<0},i.equals=function(t){if(this===t)return!0;if(t instanceof e){var n=t;return this.monthValue()===n.monthValue()&&this.dayOfMonth()===n.dayOfMonth()}return!1},i.toString=function(){return"--"+(this._month<10?"0":"")+this._month+(this._day<10?"-0":"-")+this._day},i.toJSON=function(){return this.toString()},i.format=function(t){return _(t,"formatter"),d(t,xt,"formatter"),t.format(this)},e}(I);var qt,Zt=function(t){function e(e,n){var i;return(i=t.call(this)||this)._year=m.safeToInt(e),i._month=m.safeToInt(n),i}h(e,t),e.now=function(t){return 0===arguments.length?e.now0():1===arguments.length&&t instanceof Z?e.nowZoneId(t):e.nowClock(t)},e.now0=function(){return e.nowClock(le.systemDefaultZone())},e.nowZoneId=function(t){return e.nowClock(le.system(t))},e.nowClock=function(t){var n=oe.now(t);return e.of(n.year(),n.month())},e.of=function(t,n){return 2===arguments.length&&n instanceof U?e.ofNumberMonth(t,n):e.ofNumberNumber(t,n)},e.ofNumberMonth=function(t,n){return _(n,"month"),d(n,U,"month"),e.ofNumberNumber(t,n.value())},e.ofNumberNumber=function(t,n){return _(t,"year"),_(n,"month"),R.YEAR.checkValidValue(t),R.MONTH_OF_YEAR.checkValidValue(n),new e(t,n)},e.from=function(t){if(_(t,"temporal"),t instanceof e)return t;try{return e.of(t.get(R.YEAR),t.get(R.MONTH_OF_YEAR))}catch(e){throw new n("Unable to obtain YearMonth from TemporalAccessor: "+t+", type "+(t&&null!=t.constructor?t.constructor.name:""))}},e.parse=function(t,n){return 1===arguments.length?e.parseString(t):e.parseStringFormatter(t,n)},e.parseString=function(t){return e.parseStringFormatter(t,qt)},e.parseStringFormatter=function(t,n){return _(n,"formatter"),n.parse(t,e.FROM)};var i=e.prototype;return i.isSupported=function(t){return 1===arguments.length&&t instanceof y?this.isSupportedField(t):this.isSupportedUnit(t)},i.isSupportedField=function(t){return t instanceof R?t===R.YEAR||t===R.MONTH_OF_YEAR||t===R.PROLEPTIC_MONTH||t===R.YEAR_OF_ERA||t===R.ERA:null!=t&&t.isSupportedBy(this)},i.isSupportedUnit=function(t){return t instanceof w?t===w.MONTHS||t===w.YEARS||t===w.DECADES||t===w.CENTURIES||t===w.MILLENNIA||t===w.ERAS:null!=t&&t.isSupportedBy(this)},i.range=function(e){return e===R.YEAR_OF_ERA?this.year()<=0?M.of(1,Kt.MAX_VALUE+1):M.of(1,Kt.MAX_VALUE):t.prototype.range.call(this,e)},i.get=function(t){return _(t,"field"),d(t,y,"field"),this.range(t).checkValidIntValue(this.getLong(t),t)},i.getLong=function(t){if(_(t,"field"),d(t,y,"field"),t instanceof R){switch(t){case R.MONTH_OF_YEAR:return this._month;case R.PROLEPTIC_MONTH:return this._getProlepticMonth();case R.YEAR_OF_ERA:return this._year<1?1-this._year:this._year;case R.YEAR:return this._year;case R.ERA:return this._year<1?0:1}throw new r("Unsupported field: "+t)}return t.getFrom(this)},i._getProlepticMonth=function(){return m.safeAdd(m.safeMultiply(this._year,12),this._month-1)},i.year=function(){return this._year},i.monthValue=function(){return this._month},i.month=function(){return U.of(this._month)},i.isLeapYear=function(){return $t.isLeapYear(this._year)},i.isValidDay=function(t){return t>=1&&t<=this.lengthOfMonth()},i.lengthOfMonth=function(){return this.month().length(this.isLeapYear())},i.lengthOfYear=function(){return this.isLeapYear()?366:365},i.with=function(t,e){return 1===arguments.length?this._withAdjuster(t):this._withField(t,e)},i._withField=function(t,e){if(_(t,"field"),d(t,y,"field"),t instanceof R){var n=t;switch(n.checkValidValue(e),n){case R.MONTH_OF_YEAR:return this.withMonth(e);case R.PROLEPTIC_MONTH:return this.plusMonths(e-this.getLong(R.PROLEPTIC_MONTH));case R.YEAR_OF_ERA:return this.withYear(this._year<1?1-e:e);case R.YEAR:return this.withYear(e);case R.ERA:return this.getLong(R.ERA)===e?this:this.withYear(1-this._year)}throw new r("Unsupported field: "+t)}return t.adjustInto(this,e)},i.withYear=function(t){return R.YEAR.checkValidValue(t),new e(t,this._month)},i.withMonth=function(t){return R.MONTH_OF_YEAR.checkValidValue(t),new e(this._year,t)},i._plusUnit=function(t,e){if(_(e,"unit"),d(e,A,"unit"),e instanceof w){switch(e){case w.MONTHS:return this.plusMonths(t);case w.YEARS:return this.plusYears(t);case w.DECADES:return this.plusYears(m.safeMultiply(t,10));case w.CENTURIES:return this.plusYears(m.safeMultiply(t,100));case w.MILLENNIA:return this.plusYears(m.safeMultiply(t,1e3));case w.ERAS:return this.with(R.ERA,m.safeAdd(this.getLong(R.ERA),t))}throw new r("Unsupported unit: "+e)}return e.addTo(this,t)},i.plusYears=function(t){if(0===t)return this;var e=R.YEAR.checkValidIntValue(this._year+t);return this.withYear(e)},i.plusMonths=function(t){if(0===t)return this;var n=12*this._year+(this._month-1)+t;return new e(R.YEAR.checkValidIntValue(m.floorDiv(n,12)),m.floorMod(n,12)+1)},i.minusYears=function(t){return t===m.MIN_SAFE_INTEGER?this.plusYears(m.MIN_SAFE_INTEGER).plusYears(1):this.plusYears(-t)},i.minusMonths=function(t){return t===m.MIN_SAFE_INTEGER?this.plusMonths(Math.MAX_SAFE_INTEGER).plusMonths(1):this.plusMonths(-t)},i.query=function(e){return _(e,"query"),d(e,F,"query"),e===g.chronology()?$t.INSTANCE:e===g.precision()?w.MONTHS:e===g.localDate()||e===g.localTime()||e===g.zone()||e===g.zoneId()||e===g.offset()?null:t.prototype.query.call(this,e)},i.adjustInto=function(t){return _(t,"temporal"),d(t,k,"temporal"),t.with(R.PROLEPTIC_MONTH,this._getProlepticMonth())},i.until=function(t,n){_(t,"endExclusive"),_(n,"unit"),d(t,k,"endExclusive"),d(n,A,"unit");var i=e.from(t);if(n instanceof w){var s=i._getProlepticMonth()-this._getProlepticMonth();switch(n){case w.MONTHS:return s;case w.YEARS:return s/12;case w.DECADES:return s/120;case w.CENTURIES:return s/1200;case w.MILLENNIA:return s/12e3;case w.ERAS:return i.getLong(R.ERA)-this.getLong(R.ERA)}throw new r("Unsupported unit: "+n)}return n.between(this,i)},i.atDay=function(t){return oe.of(this._year,this._month,t)},i.atEndOfMonth=function(){return oe.of(this._year,this._month,this.lengthOfMonth())},i.compareTo=function(t){_(t,"other"),d(t,e,"other");var n=this._year-t.year();return 0===n&&(n=this._month-t.monthValue()),n},i.isAfter=function(t){return this.compareTo(t)>0},i.isBefore=function(t){return this.compareTo(t)<0},i.equals=function(t){if(this===t)return!0;if(t instanceof e){var n=t;return this.year()===n.year()&&this.monthValue()===n.monthValue()}return!1},i.toString=function(){return qt.format(this)},i.toJSON=function(){return this.toString()},i.format=function(t){return _(t,"formatter"),t.format(this)},e}(k);var zt,Kt=function(t){function e(e){var n;return(n=t.call(this)||this)._year=m.safeToInt(e),n}h(e,t);var i=e.prototype;return i.value=function(){return this._year},e.now=function(t){return void 0===t&&(t=void 0),void 0===t?e.now0():t instanceof Z?e.nowZoneId(t):e.nowClock(t)},e.now0=function(){return e.nowClock(le.systemDefaultZone())},e.nowZoneId=function(t){return _(t,"zone"),d(t,Z,"zone"),e.nowClock(le.system(t))},e.nowClock=function(t){_(t,"clock"),d(t,le,"clock");var n=oe.now(t);return e.of(n.year())},e.of=function(t){return _(t,"isoYear"),R.YEAR.checkValidValue(t),new e(t)},e.from=function(t){if(_(t,"temporal"),d(t,I,"temporal"),t instanceof e)return t;try{return e.of(t.get(R.YEAR))}catch(e){throw new n("Unable to obtain Year from TemporalAccessor: "+t+", type "+(t&&null!=t.constructor?t.constructor.name:""))}},e.parse=function(t,n){return arguments.length<=1?e.parseText(t):e.parseTextFormatter(t,n)},e.parseText=function(t){return _(t,"text"),e.parse(t,zt)},e.parseTextFormatter=function(t,n){return void 0===n&&(n=zt),_(t,"text"),_(n,"formatter"),d(n,xt,"formatter"),n.parse(t,e.FROM)},e.isLeap=function(t){return 0===m.intMod(t,4)&&(0!==m.intMod(t,100)||0===m.intMod(t,400))},i.isSupported=function(t){return 1===arguments.length&&t instanceof y?this.isSupportedField(t):this.isSupportedUnit(t)},i.isSupportedField=function(t){return t instanceof R?t===R.YEAR||t===R.YEAR_OF_ERA||t===R.ERA:null!=t&&t.isSupportedBy(this)},i.isSupportedUnit=function(t){return t instanceof w?t===w.YEARS||t===w.DECADES||t===w.CENTURIES||t===w.MILLENNIA||t===w.ERAS:null!=t&&t.isSupportedBy(this)},i.range=function(e){if(this.isSupported(e))return e.range();if(e instanceof R)throw new r("Unsupported field: "+e);return t.prototype.range.call(this,e)},i.get=function(t){return this.range(t).checkValidIntValue(this.getLong(t),t)},i.getLong=function(t){if(_(t,"field"),t instanceof R){switch(t){case R.YEAR_OF_ERA:return this._year<1?1-this._year:this._year;case R.YEAR:return this._year;case R.ERA:return this._year<1?0:1}throw new r("Unsupported field: "+t)}return t.getFrom(this)},i.isLeap=function(){return e.isLeap(this._year)},i._withField=function(t,n){if(_(t,"field"),d(t,y,"field"),t instanceof R){switch(t.checkValidValue(n),t){case R.YEAR_OF_ERA:return e.of(this._year<1?1-n:n);case R.YEAR:return e.of(n);case R.ERA:return this.getLong(R.ERA)===n?this:e.of(1-this._year)}throw new r("Unsupported field: "+t)}return t.adjustInto(this,n)},i._plusUnit=function(t,e){if(_(t,"amountToAdd"),_(e,"unit"),d(e,A,"unit"),e instanceof w){switch(e){case w.YEARS:return this.plusYears(t);case w.DECADES:return this.plusYears(m.safeMultiply(t,10));case w.CENTURIES:return this.plusYears(m.safeMultiply(t,100));case w.MILLENNIA:return this.plusYears(m.safeMultiply(t,1e3));case w.ERAS:return this.with(R.ERA,m.safeAdd(this.getLong(R.ERA),t))}throw new r("Unsupported unit: "+e)}return e.addTo(this,t)},i.plusYears=function(t){return 0===t?this:e.of(R.YEAR.checkValidIntValue(m.safeAdd(this._year,t)))},i.minusYears=function(t){return t===m.MIN_SAFE_INTEGER?this.plusYears(m.MAX_SAFE_INTEGER).plusYears(1):this.plusYears(-t)},i.adjustInto=function(t){return _(t,"temporal"),t.with(R.YEAR,this._year)},i.isValidMonthDay=function(t){return null!=t&&t.isValidYear(this._year)},i.length=function(){return this.isLeap()?366:365},i.atDay=function(t){return oe.ofYearDay(this._year,t)},i.atMonth=function(t){return 1===arguments.length&&t instanceof U?this.atMonthMonth(t):this.atMonthNumber(t)},i.atMonthMonth=function(t){return _(t,"month"),d(t,U,"month"),Zt.of(this._year,t)},i.atMonthNumber=function(t){return _(t,"month"),Zt.of(this._year,t)},i.atMonthDay=function(t){return _(t,"monthDay"),d(t,Bt,"monthDay"),t.atYear(this._year)},i.query=function(e){return _(e,"query()"),d(e,F,"query()"),e===g.chronology()?$t.INSTANCE:e===g.precision()?w.YEARS:e===g.localDate()||e===g.localTime()||e===g.zone()||e===g.zoneId()||e===g.offset()?null:t.prototype.query.call(this,e)},i.compareTo=function(t){return _(t,"other"),d(t,e,"other"),this._year-t._year},i.isAfter=function(t){return _(t,"other"),d(t,e,"other"),this._year>t._year},i.isBefore=function(t){return _(t,"other"),d(t,e,"other"),this._year<t._year},i.format=function(t){return _(t,"formatter"),d(t,xt,"formatter"),t.format(this)},i.equals=function(t){return this===t||t instanceof e&&this.value()===t.value()},i.toString=function(){return""+this._year},i.toJSON=function(){return this.toString()},i.until=function(t,n){var i=e.from(t);if(n instanceof w){var s=i.value()-this.value();switch(n){case w.YEARS:return s;case w.DECADES:return m.intDiv(s,10);case w.CENTURIES:return m.intDiv(s,100);case w.MILLENNIA:return m.intDiv(s,1e3);case w.ERAS:return i.getLong(R.ERA)-this.getLong(R.ERA)}throw new r("Unsupported unit: "+n)}return n.between(this,i)},e}(k);var jt=function(){function t(){}return t.prototype.adjustInto=function(t){p("adjustInto")},t}(),Gt=function(){function t(){}return t.firstDayOfMonth=function(){return Xt.FIRST_DAY_OF_MONTH},t.lastDayOfMonth=function(){return Xt.LAST_DAY_OF_MONTH},t.firstDayOfNextMonth=function(){return Xt.FIRST_DAY_OF_NEXT_MONTH},t.firstDayOfYear=function(){return Xt.FIRST_DAY_OF_YEAR},t.lastDayOfYear=function(){return Xt.LAST_DAY_OF_YEAR},t.firstDayOfNextYear=function(){return Xt.FIRST_DAY_OF_NEXT_YEAR},t.firstInMonth=function(t){return _(t,"dayOfWeek"),new Jt(1,t)},t.lastInMonth=function(t){return _(t,"dayOfWeek"),new Jt(-1,t)},t.dayOfWeekInMonth=function(t,e){return _(e,"dayOfWeek"),new Jt(t,e)},t.next=function(t){return new Qt(2,t)},t.nextOrSame=function(t){return new Qt(0,t)},t.previous=function(t){return new Qt(3,t)},t.previousOrSame=function(t){return new Qt(1,t)},t}(),Xt=function(t){function e(e){var n;return(n=t.call(this)||this)._ordinal=e,n}return h(e,t),e.prototype.adjustInto=function(t){switch(this._ordinal){case 0:return t.with(R.DAY_OF_MONTH,1);case 1:return t.with(R.DAY_OF_MONTH,t.range(R.DAY_OF_MONTH).maximum());case 2:return t.with(R.DAY_OF_MONTH,1).plus(1,w.MONTHS);case 3:return t.with(R.DAY_OF_YEAR,1);case 4:return t.with(R.DAY_OF_YEAR,t.range(R.DAY_OF_YEAR).maximum());case 5:return t.with(R.DAY_OF_YEAR,1).plus(1,w.YEARS)}throw new a("Unreachable")},e}(jt);Xt.FIRST_DAY_OF_MONTH=new Xt(0),Xt.LAST_DAY_OF_MONTH=new Xt(1),Xt.FIRST_DAY_OF_NEXT_MONTH=new Xt(2),Xt.FIRST_DAY_OF_YEAR=new Xt(3),Xt.LAST_DAY_OF_YEAR=new Xt(4),Xt.FIRST_DAY_OF_NEXT_YEAR=new Xt(5);var Jt=function(t){function e(e,n){var i;return(i=t.call(this)||this)._ordinal=e,i._dowValue=n.value(),i}return h(e,t),e.prototype.adjustInto=function(t){if(this._ordinal>=0){var e=t.with(R.DAY_OF_MONTH,1),n=e.get(R.DAY_OF_WEEK),i=m.intMod(this._dowValue-n+7,7);return i+=7*(this._ordinal-1),e.plus(i,w.DAYS)}var r=t.with(R.DAY_OF_MONTH,t.range(R.DAY_OF_MONTH).maximum()),s=r.get(R.DAY_OF_WEEK),o=this._dowValue-s;return o=0===o?0:o>0?o-7:o,o-=7*(-this._ordinal-1),r.plus(o,w.DAYS)},e}(jt),Qt=function(t){function e(e,n){var i;return i=t.call(this)||this,_(n,"dayOfWeek"),i._relative=e,i._dowValue=n.value(),i}return h(e,t),e.prototype.adjustInto=function(t){var e=t.get(R.DAY_OF_WEEK);if(this._relative<2&&e===this._dowValue)return t;if(0==(1&this._relative)){var n=e-this._dowValue;return t.plus(n>=0?7-n:-n,w.DAYS)}var i=this._dowValue-e;return t.minus(i>=0?7-i:-i,w.DAYS)},e}(jt),$t=function(t){function e(){return t.apply(this,arguments)||this}h(e,t),e.isLeapYear=function(t){return 0==(3&t)&&(t%100!=0||t%400==0)};var i=e.prototype;return i._updateResolveMap=function(t,e,i){_(t,"fieldValues"),_(e,"field");var r=t.get(e);if(null!=r&&r!==i)throw new n("Invalid state, field: "+e+" "+r+" conflicts with "+e+" "+i);t.put(e,i)},i.resolveDate=function(t,e){if(t.containsKey(R.EPOCH_DAY))return oe.ofEpochDay(t.remove(R.EPOCH_DAY));var i=t.remove(R.PROLEPTIC_MONTH);null!=i&&(e!==x.LENIENT&&R.PROLEPTIC_MONTH.checkValidValue(i),this._updateResolveMap(t,R.MONTH_OF_YEAR,m.floorMod(i,12)+1),this._updateResolveMap(t,R.YEAR,m.floorDiv(i,12)));var r=t.remove(R.YEAR_OF_ERA);if(null!=r){e!==x.LENIENT&&R.YEAR_OF_ERA.checkValidValue(r);var s=t.remove(R.ERA);if(null==s){var o=t.get(R.YEAR);e===x.STRICT?null!=o?this._updateResolveMap(t,R.YEAR,o>0?r:m.safeSubtract(1,r)):t.put(R.YEAR_OF_ERA,r):this._updateResolveMap(t,R.YEAR,null==o||o>0?r:m.safeSubtract(1,r))}else if(1===s)this._updateResolveMap(t,R.YEAR,r);else{if(0!==s)throw new n("Invalid value for era: "+s);this._updateResolveMap(t,R.YEAR,m.safeSubtract(1,r))}}else t.containsKey(R.ERA)&&R.ERA.checkValidValue(t.get(R.ERA));if(t.containsKey(R.YEAR)){if(t.containsKey(R.MONTH_OF_YEAR)&&t.containsKey(R.DAY_OF_MONTH)){var a=R.YEAR.checkValidIntValue(t.remove(R.YEAR)),u=t.remove(R.MONTH_OF_YEAR),h=t.remove(R.DAY_OF_MONTH);if(e===x.LENIENT){var f=u-1,c=h-1;return oe.of(a,1,1).plusMonths(f).plusDays(c)}return e===x.SMART?(R.DAY_OF_MONTH.checkValidValue(h),4===u||6===u||9===u||11===u?h=Math.min(h,30):2===u&&(h=Math.min(h,U.FEBRUARY.length(Kt.isLeap(a)))),oe.of(a,u,h)):oe.of(a,u,h)}if(t.containsKey(R.DAY_OF_YEAR)){var l=R.YEAR.checkValidIntValue(t.remove(R.YEAR));if(e===x.LENIENT){var _=m.safeSubtract(t.remove(R.DAY_OF_YEAR),1);return oe.ofYearDay(l,1).plusDays(_)}var d=R.DAY_OF_YEAR.checkValidIntValue(t.remove(R.DAY_OF_YEAR));return oe.ofYearDay(l,d)}if(t.containsKey(R.ALIGNED_WEEK_OF_YEAR)){if(t.containsKey(R.ALIGNED_DAY_OF_WEEK_IN_YEAR)){var p=R.YEAR.checkValidIntValue(t.remove(R.YEAR));if(e===x.LENIENT){var O=m.safeSubtract(t.remove(R.ALIGNED_WEEK_OF_YEAR),1),E=m.safeSubtract(t.remove(R.ALIGNED_DAY_OF_WEEK_IN_YEAR),1);return oe.of(p,1,1).plusWeeks(O).plusDays(E)}var S=R.ALIGNED_WEEK_OF_YEAR.checkValidIntValue(t.remove(R.ALIGNED_WEEK_OF_YEAR)),N=R.ALIGNED_DAY_OF_WEEK_IN_YEAR.checkValidIntValue(t.remove(R.ALIGNED_DAY_OF_WEEK_IN_YEAR)),D=oe.of(p,1,1).plusDays(7*(S-1)+(N-1));if(e===x.STRICT&&D.get(R.YEAR)!==p)throw new n("Strict mode rejected date parsed to a different year");return D}if(t.containsKey(R.DAY_OF_WEEK)){var A=R.YEAR.checkValidIntValue(t.remove(R.YEAR));if(e===x.LENIENT){var T=m.safeSubtract(t.remove(R.ALIGNED_WEEK_OF_YEAR),1),v=m.safeSubtract(t.remove(R.DAY_OF_WEEK),1);return oe.of(A,1,1).plusWeeks(T).plusDays(v)}var w=R.ALIGNED_WEEK_OF_YEAR.checkValidIntValue(t.remove(R.ALIGNED_WEEK_OF_YEAR)),y=R.DAY_OF_WEEK.checkValidIntValue(t.remove(R.DAY_OF_WEEK)),M=oe.of(A,1,1).plusWeeks(w-1).with(Gt.nextOrSame(L.of(y)));if(e===x.STRICT&&M.get(R.YEAR)!==A)throw new n("Strict mode rejected date parsed to a different month");return M}}}return null},i.date=function(t){return oe.from(t)},e}(N);var te=function(t){function e(e,n){var i;return i=t.call(this)||this,_(e,"time"),d(e,he,"time"),_(n,"offset"),d(n,X,"offset"),i._time=e,i._offset=n,i}h(e,t),e.from=function(t){if(_(t,"temporal"),t instanceof e)return t;if(t instanceof ie)return t.toOffsetTime();try{return new e(he.from(t),X.from(t))}catch(e){throw new n("Unable to obtain OffsetTime TemporalAccessor: "+t+", type "+(null!=t.constructor?t.constructor.name:""))}},e.now=function(t){return 0===arguments.length?e._now(le.systemDefaultZone()):t instanceof le?e._now(t):e._now(le.system(t))},e._now=function(t){_(t,"clock");var n=t.instant();return e.ofInstant(n,t.zone().rules().offset(n))},e.of=function(){return arguments.length<=2?e.ofTimeAndOffset.apply(this,arguments):e.ofNumbers.apply(this,arguments)},e.ofNumbers=function(t,n,i,r,s){return new e(he.of(t,n,i,r),s)},e.ofTimeAndOffset=function(t,n){return new e(t,n)},e.ofInstant=function(t,n){_(t,"instant"),d(t,ce,"instant"),_(n,"zone"),d(n,Z,"zone");var i=n.rules().offset(t),r=t.epochSecond()%he.SECONDS_PER_DAY;return(r=(r+i.totalSeconds())%he.SECONDS_PER_DAY)<0&&(r+=he.SECONDS_PER_DAY),new e(he.ofSecondOfDay(r,t.nano()),i)},e.parse=function(t,n){return void 0===n&&(n=xt.ISO_OFFSET_TIME),_(n,"formatter"),n.parse(t,e.FROM)};var i=e.prototype;return i.adjustInto=function(t){return t.with(R.NANO_OF_DAY,this._time.toNanoOfDay()).with(R.OFFSET_SECONDS,this.offset().totalSeconds())},i.atDate=function(t){return ie.of(t,this._time,this._offset)},i.format=function(t){return _(t,"formatter"),t.format(this,e.FROM)},i.get=function(e){return t.prototype.get.call(this,e)},i.getLong=function(t){return t instanceof R?t===R.OFFSET_SECONDS?this._offset.totalSeconds():this._time.getLong(t):t.getFrom(this)},i.hour=function(){return this._time.hour()},i.minute=function(){return this._time.minute()},i.second=function(){return this._time.second()},i.nano=function(){return this._time.nano()},i.offset=function(){return this._offset},i.isAfter=function(t){return _(t,"other"),this._toEpochNano()>t._toEpochNano()},i.isBefore=function(t){return _(t,"other"),this._toEpochNano()<t._toEpochNano()},i.isEqual=function(t){return _(t,"other"),this._toEpochNano()===t._toEpochNano()},i.isSupported=function(t){return t instanceof R?t.isTimeBased()||t===R.OFFSET_SECONDS:t instanceof w?t.isTimeBased():null!=t&&t.isSupportedBy(this)},i.minusHours=function(t){return this._withLocalTimeOffset(this._time.minusHours(t),this._offset)},i.minusMinutes=function(t){return this._withLocalTimeOffset(this._time.minusMinutes(t),this._offset)},i.minusSeconds=function(t){return this._withLocalTimeOffset(this._time.minusSeconds(t),this._offset)},i.minusNanos=function(t){return this._withLocalTimeOffset(this._time.minusNanos(t),this._offset)},i._minusAmount=function(t){return _(t),t.subtractFrom(this)},i._minusUnit=function(t,e){return this.plus(-1*t,e)},i._plusAmount=function(t){return _(t),t.addTo(this)},i._plusUnit=function(t,e){return e instanceof w?this._withLocalTimeOffset(this._time.plus(t,e),this._offset):e.addTo(this,t)},i.plusHours=function(t){return this._withLocalTimeOffset(this._time.plusHours(t),this._offset)},i.plusMinutes=function(t){return this._withLocalTimeOffset(this._time.plusMinutes(t),this._offset)},i.plusSeconds=function(t){return this._withLocalTimeOffset(this._time.plusSeconds(t),this._offset)},i.plusNanos=function(t){return this._withLocalTimeOffset(this._time.plusNanos(t),this._offset)},i.query=function(e){return _(e,"query"),e===g.precision()?w.NANOS:e===g.offset()||e===g.zone()?this.offset():e===g.localTime()?this._time:e===g.chronology()||e===g.localDate()||e===g.zoneId()?null:t.prototype.query.call(this,e)},i.range=function(t){return t instanceof R?t===R.OFFSET_SECONDS?t.range():this._time.range(t):t.rangeRefinedBy(this)},i.toLocalTime=function(){return this._time},i.truncatedTo=function(t){return this._withLocalTimeOffset(this._time.truncatedTo(t),this._offset)},i.until=function(t,n){_(t,"endExclusive"),_(n,"unit");var i=e.from(t);if(n instanceof w){var s=i._toEpochNano()-this._toEpochNano();switch(n){case w.NANOS:return s;case w.MICROS:return Math.floor(s/1e3);case w.MILLIS:return Math.floor(s/1e6);case w.SECONDS:return Math.floor(s/he.NANOS_PER_SECOND);case w.MINUTES:return Math.floor(s/he.NANOS_PER_MINUTE);case w.HOURS:return Math.floor(s/he.NANOS_PER_HOUR);case w.HALF_DAYS:return Math.floor(s/(12*he.NANOS_PER_HOUR))}throw new r("Unsupported unit: "+n)}return n.between(this,i)},i.withHour=function(t){return this._withLocalTimeOffset(this._time.withHour(t),this._offset)},i.withMinute=function(t){return this._withLocalTimeOffset(this._time.withMinute(t),this._offset)},i.withSecond=function(t){return this._withLocalTimeOffset(this._time.withSecond(t),this._offset)},i.withNano=function(t){return this._withLocalTimeOffset(this._time.withNano(t),this._offset)},i.withOffsetSameInstant=function(t){if(_(t,"offset"),t.equals(this._offset))return this;var n=t.totalSeconds()-this._offset.totalSeconds();return new e(this._time.plusSeconds(n),t)},i.withOffsetSameLocal=function(t){return null!=t&&t.equals(this._offset)?this:new e(this._time,t)},i._toEpochNano=function(){return this._time.toNanoOfDay()-this._offset.totalSeconds()*he.NANOS_PER_SECOND},i._withAdjuster=function(t){return _(t,"adjuster"),t instanceof he?this._withLocalTimeOffset(t,this._offset):t instanceof X?this._withLocalTimeOffset(this._time,t):t instanceof e?t:t.adjustInto(this)},i._withField=function(t,e){return _(t,"field"),t instanceof R?t===R.OFFSET_SECONDS?this._withLocalTimeOffset(this._time,X.ofTotalSeconds(t.checkValidIntValue(e))):this._withLocalTimeOffset(this._time.with(t,e),this._offset):t.adjustInto(this,e)},i._withLocalTimeOffset=function(t,n){return this._time===t&&this._offset.equals(n)?this:new e(t,n)},i.compareTo=function(t){if(_(t,"other"),d(t,e,"other"),this._offset.equals(t._offset))return this._time.compareTo(t._time);var n=m.compareNumbers(this._toEpochNano(),t._toEpochNano());return 0===n?this._time.compareTo(t._time):n},i.equals=function(t){return this===t||t instanceof e&&(this._time.equals(t._time)&&this._offset.equals(t._offset))},i.hashCode=function(){return this._time.hashCode()^this._offset.hashCode()},i.toString=function(){return this._time.toString()+this._offset.toString()},i.toJSON=function(){return this.toString()},e}(k);var ee=function(t){function e(){return t.apply(this,arguments)||this}h(e,t);var n=e.prototype;return n.query=function(e){return e===g.zoneId()||e===g.zone()?this.zone():e===g.chronology()?this.toLocalDate().chronology():e===g.precision()?w.NANOS:e===g.offset()?this.offset():e===g.localDate()?oe.ofEpochDay(this.toLocalDate().toEpochDay()):e===g.localTime()?this.toLocalTime():t.prototype.query.call(this,e)},n.format=function(t){return _(t,"formatter"),t.format(this)},n.toInstant=function(){return ce.ofEpochSecond(this.toEpochSecond(),this.toLocalTime().nano())},n.toEpochSecond=function(){var t=86400*this.toLocalDate().toEpochDay()+this.toLocalTime().toSecondOfDay();return t-=this.offset().totalSeconds()},n.compareTo=function(t){_(t,"other");var e=m.compareNumbers(this.toEpochSecond(),t.toEpochSecond());return 0===e&&0===(e=this.toLocalTime().nano()-t.toLocalTime().nano())&&0===(e=this.toLocalDateTime().compareTo(t.toLocalDateTime()))&&(e=function(t,e){if(t<e)return-1;if(t>e)return 1;return 0}(this.zone().id(),t.zone().id())),e},n.isAfter=function(t){_(t,"other");var e=this.toEpochSecond(),n=t.toEpochSecond();return e>n||e===n&&this.toLocalTime().nano()>t.toLocalTime().nano()},n.isBefore=function(t){_(t,"other");var e=this.toEpochSecond(),n=t.toEpochSecond();return e<n||e===n&&this.toLocalTime().nano()<t.toLocalTime().nano()},n.isEqual=function(t){return _(t,"other"),this.toEpochSecond()===t.toEpochSecond()&&this.toLocalTime().nano()===t.toLocalTime().nano()},n.equals=function(t){return this===t||t instanceof e&&0===this.compareTo(t)},e}(k);var ne=function(t){function e(e,n,i){var r;return _(e,"dateTime"),_(n,"offset"),_(i,"zone"),(r=t.call(this)||this)._dateTime=e,r._offset=n,r._zone=i,r}h(e,t),e.now=function(t){var n;return n=t instanceof Z?le.system(t):null==t?le.systemDefaultZone():t,e.ofInstant(n.instant(),n.zone())},e.of=function(){return arguments.length<=2?e.of2.apply(this,arguments):3===arguments.length&&arguments[0]instanceof oe?e.of3.apply(this,arguments):e.of8.apply(this,arguments)},e.of3=function(t,n,i){return e.of2(ue.of(t,n),i)},e.of2=function(t,n){return e.ofLocal(t,n,null)},e.of8=function(t,n,i,r,s,o,a,u){var h=ue.of(t,n,i,r,s,o,a);return e.ofLocal(h,u,null)},e.ofLocal=function(t,n,i){if(_(t,"localDateTime"),_(n,"zone"),n instanceof X)return new e(t,n,n);var r=null,s=n.rules(),o=s.validOffsets(t);if(1===o.length)r=o[0];else if(0===o.length){var a=s.transition(t);t=t.plusSeconds(a.duration().seconds()),r=a.offsetAfter()}else r=null!=i&&o.some((function(t){return t.equals(i)}))?i:_(o[0],"offset");return new e(t,r,n)},e.ofInstant=function(){return 2===arguments.length?e.ofInstant2.apply(this,arguments):e.ofInstant3.apply(this,arguments)},e.ofInstant2=function(t,n){return _(t,"instant"),_(n,"zone"),e._create(t.epochSecond(),t.nano(),n)},e.ofInstant3=function(t,n,i){return _(t,"localDateTime"),_(n,"offset"),_(i,"zone"),e._create(t.toEpochSecond(n),t.nano(),i)},e._create=function(t,n,i){var r=i.rules(),s=ce.ofEpochSecond(t,n),o=r.offset(s);return new e(ue.ofEpochSecond(t,n,o),o,i)},e.ofStrict=function(t,i,r){_(t,"localDateTime"),_(i,"offset"),_(r,"zone");var s=r.rules();if(!1===s.isValidOffset(t,i)){var o=s.transition(t);if(null!=o&&o.isGap())throw new n("LocalDateTime "+t+" does not exist in zone "+r+" due to a gap in the local time-line, typically caused by daylight savings");throw new n('ZoneOffset "'+i+'" is not valid for LocalDateTime "'+t+'" in zone "'+r+'"')}return new e(t,i,r)},e.ofLenient=function(t,n,i){if(_(t,"localDateTime"),_(n,"offset"),_(i,"zone"),i instanceof X&&!1===n.equals(i))throw new o("ZoneId must match ZoneOffset");return new e(t,n,i)},e.from=function(t){if(_(t,"temporal"),t instanceof e)return t;var n=Z.from(t);if(t.isSupported(R.INSTANT_SECONDS)){var i=e._from(t,n);if(null!=i)return i}var r=ue.from(t);return e.of2(r,n)},e._from=function(t,i){try{return e.__from(t,i)}catch(t){if(!(t instanceof n))throw t}},e.__from=function(t,n){var i=t.getLong(R.INSTANT_SECONDS),r=t.get(R.NANO_OF_SECOND);return e._create(i,r,n)},e.parse=function(t,n){return void 0===n&&(n=xt.ISO_ZONED_DATE_TIME),_(n,"formatter"),n.parse(t,e.FROM)};var i=e.prototype;return i._resolveLocal=function(t){return _(t,"newDateTime"),e.ofLocal(t,this._zone,this._offset)},i._resolveInstant=function(t){return e.ofInstant3(t,this._offset,this._zone)},i._resolveOffset=function(t){return!1===t.equals(this._offset)&&this._zone.rules().isValidOffset(this._dateTime,t)?new e(this._dateTime,t,this._zone):this},i.isSupported=function(t){return t instanceof R||(t instanceof w?t.isDateBased()||t.isTimeBased():null!=t&&t.isSupportedBy(this))},i.range=function(t){return t instanceof R?t===R.INSTANT_SECONDS||t===R.OFFSET_SECONDS?t.range():this._dateTime.range(t):t.rangeRefinedBy(this)},i.get=function(t){return this.getLong(t)},i.getLong=function(t){if(t instanceof R){switch(t){case R.INSTANT_SECONDS:return this.toEpochSecond();case R.OFFSET_SECONDS:return this._offset.totalSeconds()}return this._dateTime.getLong(t)}return _(t,"field"),t.getFrom(this)},i.offset=function(){return this._offset},i.withEarlierOffsetAtOverlap=function(){var t=this._zone.rules().transition(this._dateTime);if(null!=t&&t.isOverlap()){var n=t.offsetBefore();if(!1===n.equals(this._offset))return new e(this._dateTime,n,this._zone)}return this},i.withLaterOffsetAtOverlap=function(){var t=this._zone.rules().transition(this.toLocalDateTime());if(null!=t){var n=t.offsetAfter();if(!1===n.equals(this._offset))return new e(this._dateTime,n,this._zone)}return this},i.zone=function(){return this._zone},i.withZoneSameLocal=function(t){return _(t,"zone"),this._zone.equals(t)?this:e.ofLocal(this._dateTime,t,this._offset)},i.withZoneSameInstant=function(t){return _(t,"zone"),this._zone.equals(t)?this:e._create(this._dateTime.toEpochSecond(this._offset),this._dateTime.nano(),t)},i.withFixedOffsetZone=function(){return this._zone.equals(this._offset)?this:new e(this._dateTime,this._offset,this._offset)},i.year=function(){return this._dateTime.year()},i.monthValue=function(){return this._dateTime.monthValue()},i.month=function(){return this._dateTime.month()},i.dayOfMonth=function(){return this._dateTime.dayOfMonth()},i.dayOfYear=function(){return this._dateTime.dayOfYear()},i.dayOfWeek=function(){return this._dateTime.dayOfWeek()},i.hour=function(){return this._dateTime.hour()},i.minute=function(){return this._dateTime.minute()},i.second=function(){return this._dateTime.second()},i.nano=function(){return this._dateTime.nano()},i._withAdjuster=function(n){if(n instanceof oe)return this._resolveLocal(ue.of(n,this._dateTime.toLocalTime()));if(n instanceof he)return this._resolveLocal(ue.of(this._dateTime.toLocalDate(),n));if(n instanceof ue)return this._resolveLocal(n);if(n instanceof ce){var i=n;return e._create(i.epochSecond(),i.nano(),this._zone)}return n instanceof X?this._resolveOffset(n):t.prototype._withAdjuster.call(this,n)},i._withField=function(t,n){if(t instanceof R){switch(t){case R.INSTANT_SECONDS:return e._create(n,this.nano(),this._zone);case R.OFFSET_SECONDS:var i=X.ofTotalSeconds(t.checkValidIntValue(n));return this._resolveOffset(i)}return this._resolveLocal(this._dateTime.with(t,n))}return t.adjustInto(this,n)},i.withYear=function(t){return this._resolveLocal(this._dateTime.withYear(t))},i.withMonth=function(t){return this._resolveLocal(this._dateTime.withMonth(t))},i.withDayOfMonth=function(t){return this._resolveLocal(this._dateTime.withDayOfMonth(t))},i.withDayOfYear=function(t){return this._resolveLocal(this._dateTime.withDayOfYear(t))},i.withHour=function(t){return this._resolveLocal(this._dateTime.withHour(t))},i.withMinute=function(t){return this._resolveLocal(this._dateTime.withMinute(t))},i.withSecond=function(t){return this._resolveLocal(this._dateTime.withSecond(t))},i.withNano=function(t){return this._resolveLocal(this._dateTime.withNano(t))},i.truncatedTo=function(t){return this._resolveLocal(this._dateTime.truncatedTo(t))},i._plusUnit=function(t,e){return e instanceof w?e.isDateBased()?this._resolveLocal(this._dateTime.plus(t,e)):this._resolveInstant(this._dateTime.plus(t,e)):(_(e,"unit"),e.addTo(this,t))},i.plusYears=function(t){return this._resolveLocal(this._dateTime.plusYears(t))},i.plusMonths=function(t){return this._resolveLocal(this._dateTime.plusMonths(t))},i.plusWeeks=function(t){return this._resolveLocal(this._dateTime.plusWeeks(t))},i.plusDays=function(t){return this._resolveLocal(this._dateTime.plusDays(t))},i.plusHours=function(t){return this._resolveInstant(this._dateTime.plusHours(t))},i.plusMinutes=function(t){return this._resolveInstant(this._dateTime.plusMinutes(t))},i.plusSeconds=function(t){return this._resolveInstant(this._dateTime.plusSeconds(t))},i.plusNanos=function(t){return this._resolveInstant(this._dateTime.plusNanos(t))},i._minusUnit=function(t,e){return this._plusUnit(-1*t,e)},i.minusYears=function(t){return this.plusYears(-1*t)},i.minusMonths=function(t){return this.plusMonths(-1*t)},i.minusWeeks=function(t){return this.plusWeeks(-1*t)},i.minusDays=function(t){return this.plusDays(-1*t)},i.minusHours=function(t){return this.plusHours(-1*t)},i.minusMinutes=function(t){return this.plusMinutes(-1*t)},i.minusSeconds=function(t){return this.plusSeconds(-1*t)},i.minusNanos=function(t){return this.plusNanos(-1*t)},i.query=function(e){return e===g.localDate()?this.toLocalDate():(_(e,"query"),t.prototype.query.call(this,e))},i.until=function(t,n){var i=e.from(t);if(n instanceof w){if(i=i.withZoneSameInstant(this._zone),n.isDateBased())return this._dateTime.until(i._dateTime,n);var r=this._offset.totalSeconds()-i._offset.totalSeconds(),s=i._dateTime.plusSeconds(r);return this._dateTime.until(s,n)}return n.between(this,i)},i.toLocalDateTime=function(){return this._dateTime},i.toLocalDate=function(){return this._dateTime.toLocalDate()},i.toLocalTime=function(){return this._dateTime.toLocalTime()},i.toOffsetDateTime=function(){return ie.of(this._dateTime,this._offset)},i.equals=function(t){return this===t||t instanceof e&&(this._dateTime.equals(t._dateTime)&&this._offset.equals(t._offset)&&this._zone.equals(t._zone))},i.hashCode=function(){return m.hashCode(this._dateTime.hashCode(),this._offset.hashCode(),this._zone.hashCode())},i.toString=function(){var t=this._dateTime.toString()+this._offset.toString();return this._offset!==this._zone&&(t+="["+this._zone.toString()+"]"),t},i.toJSON=function(){return this.toString()},i.format=function(e){return t.prototype.format.call(this,e)},e}(ee);var ie=function(t){function e(e,n){var i;return i=t.call(this)||this,_(e,"dateTime"),d(e,ue,"dateTime"),_(n,"offset"),d(n,X,"offset"),i._dateTime=e,i._offset=n,i}h(e,t),e.from=function(t){if(_(t,"temporal"),t instanceof e)return t;try{var i=X.from(t);try{var r=ue.from(t);return e.of(r,i)}catch(n){var s=ce.from(t);return e.ofInstant(s,i)}}catch(e){throw new n("Unable to obtain OffsetDateTime TemporalAccessor: "+t+", type "+(null!=t.constructor?t.constructor.name:""))}},e.now=function(t){if(0===arguments.length)return e.now(le.systemDefaultZone());if(_(t,"clockOrZone"),t instanceof Z)return e.now(le.system(t));if(t instanceof le){var n=t.instant();return e.ofInstant(n,t.zone().rules().offset(n))}throw new o("clockOrZone must be an instance of ZoneId or Clock")},e.of=function(){return arguments.length<=2?e.ofDateTime.apply(this,arguments):3===arguments.length?e.ofDateAndTime.apply(this,arguments):e.ofNumbers.apply(this,arguments)},e.ofDateTime=function(t,n){return new e(t,n)},e.ofDateAndTime=function(t,n,i){return new e(ue.of(t,n),i)},e.ofNumbers=function(t,n,i,r,s,o,a,u){return void 0===r&&(r=0),void 0===s&&(s=0),void 0===o&&(o=0),void 0===a&&(a=0),new e(ue.of(t,n,i,r,s,o,a),u)},e.ofInstant=function(t,n){_(t,"instant"),_(n,"zone");var i=n.rules().offset(t);return new e(ue.ofEpochSecond(t.epochSecond(),t.nano(),i),i)},e.parse=function(t,n){return void 0===n&&(n=xt.ISO_OFFSET_DATE_TIME),_(n,"formatter"),n.parse(t,e.FROM)};var i=e.prototype;return i.adjustInto=function(t){return t.with(R.EPOCH_DAY,this.toLocalDate().toEpochDay()).with(R.NANO_OF_DAY,this.toLocalTime().toNanoOfDay()).with(R.OFFSET_SECONDS,this.offset().totalSeconds())},i.until=function(t,n){var i=e.from(t);return n instanceof w?(i=i.withOffsetSameInstant(this._offset),this._dateTime.until(i._dateTime,n)):n.between(this,i)},i.atZoneSameInstant=function(t){return ne.ofInstant(this._dateTime,this._offset,t)},i.atZoneSimilarLocal=function(t){return ne.ofLocal(this._dateTime,t,this._offset)},i.query=function(e){return _(e,"query"),e===g.chronology()?$t.INSTANCE:e===g.precision()?w.NANOS:e===g.offset()||e===g.zone()?this.offset():e===g.localDate()?this.toLocalDate():e===g.localTime()?this.toLocalTime():e===g.zoneId()?null:t.prototype.query.call(this,e)},i.get=function(e){if(e instanceof R){switch(e){case R.INSTANT_SECONDS:throw new n("Field too large for an int: "+e);case R.OFFSET_SECONDS:return this.offset().totalSeconds()}return this._dateTime.get(e)}return t.prototype.get.call(this,e)},i.getLong=function(t){if(t instanceof R){switch(t){case R.INSTANT_SECONDS:return this.toEpochSecond();case R.OFFSET_SECONDS:return this.offset().totalSeconds()}return this._dateTime.getLong(t)}return t.getFrom(this)},i.offset=function(){return this._offset},i.year=function(){return this._dateTime.year()},i.monthValue=function(){return this._dateTime.monthValue()},i.month=function(){return this._dateTime.month()},i.dayOfMonth=function(){return this._dateTime.dayOfMonth()},i.dayOfYear=function(){return this._dateTime.dayOfYear()},i.dayOfWeek=function(){return this._dateTime.dayOfWeek()},i.hour=function(){return this._dateTime.hour()},i.minute=function(){return this._dateTime.minute()},i.second=function(){return this._dateTime.second()},i.nano=function(){return this._dateTime.nano()},i.toLocalDateTime=function(){return this._dateTime},i.toLocalDate=function(){return this._dateTime.toLocalDate()},i.toLocalTime=function(){return this._dateTime.toLocalTime()},i.toOffsetTime=function(){return te.of(this._dateTime.toLocalTime(),this._offset)},i.toZonedDateTime=function(){return ne.of(this._dateTime,this._offset)},i.toInstant=function(){return this._dateTime.toInstant(this._offset)},i.toEpochSecond=function(){return this._dateTime.toEpochSecond(this._offset)},i.isSupported=function(t){return t instanceof R||t instanceof w?t.isDateBased()||t.isTimeBased():null!=t&&t.isSupportedBy(this)},i.range=function(t){return t instanceof R?t===R.INSTANT_SECONDS||t===R.OFFSET_SECONDS?t.range():this._dateTime.range(t):t.rangeRefinedBy(this)},i._withAdjuster=function(t){return _(t),t instanceof oe||t instanceof he||t instanceof ue?this._withDateTimeOffset(this._dateTime.with(t),this._offset):t instanceof ce?e.ofInstant(t,this._offset):t instanceof X?this._withDateTimeOffset(this._dateTime,t):t instanceof e?t:t.adjustInto(this)},i._withField=function(t,n){if(_(t),t instanceof R){var i=t;switch(i){case R.INSTANT_SECONDS:return e.ofInstant(ce.ofEpochSecond(n,this.nano()),this._offset);case R.OFFSET_SECONDS:return this._withDateTimeOffset(this._dateTime,X.ofTotalSeconds(i.checkValidIntValue(n)))}return this._withDateTimeOffset(this._dateTime.with(t,n),this._offset)}return t.adjustInto(this,n)},i._withDateTimeOffset=function(t,n){return this._dateTime===t&&this._offset.equals(n)?this:new e(t,n)},i.withYear=function(t){return this._withDateTimeOffset(this._dateTime.withYear(t),this._offset)},i.withMonth=function(t){return this._withDateTimeOffset(this._dateTime.withMonth(t),this._offset)},i.withDayOfMonth=function(t){return this._withDateTimeOffset(this._dateTime.withDayOfMonth(t),this._offset)},i.withDayOfYear=function(t){return this._withDateTimeOffset(this._dateTime.withDayOfYear(t),this._offset)},i.withHour=function(t){return this._withDateTimeOffset(this._dateTime.withHour(t),this._offset)},i.withMinute=function(t){return this._withDateTimeOffset(this._dateTime.withMinute(t),this._offset)},i.withSecond=function(t){return this._withDateTimeOffset(this._dateTime.withSecond(t),this._offset)},i.withNano=function(t){return this._withDateTimeOffset(this._dateTime.withNano(t),this._offset)},i.withOffsetSameLocal=function(t){return _(t,"offset"),this._withDateTimeOffset(this._dateTime,t)},i.withOffsetSameInstant=function(t){if(_(t,"offset"),t.equals(this._offset))return this;var n=t.totalSeconds()-this._offset.totalSeconds();return new e(this._dateTime.plusSeconds(n),t)},i.truncatedTo=function(t){return this._withDateTimeOffset(this._dateTime.truncatedTo(t),this._offset)},i._plusAmount=function(t){return _(t,"amount"),t.addTo(this)},i._plusUnit=function(t,e){return e instanceof w?this._withDateTimeOffset(this._dateTime.plus(t,e),this._offset):e.addTo(this,t)},i.plusYears=function(t){return this._withDateTimeOffset(this._dateTime.plusYears(t),this._offset)},i.plusMonths=function(t){return this._withDateTimeOffset(this._dateTime.plusMonths(t),this._offset)},i.plusWeeks=function(t){return this._withDateTimeOffset(this._dateTime.plusWeeks(t),this._offset)},i.plusDays=function(t){return this._withDateTimeOffset(this._dateTime.plusDays(t),this._offset)},i.plusHours=function(t){return this._withDateTimeOffset(this._dateTime.plusHours(t),this._offset)},i.plusMinutes=function(t){return this._withDateTimeOffset(this._dateTime.plusMinutes(t),this._offset)},i.plusSeconds=function(t){return this._withDateTimeOffset(this._dateTime.plusSeconds(t),this._offset)},i.plusNanos=function(t){return this._withDateTimeOffset(this._dateTime.plusNanos(t),this._offset)},i._minusAmount=function(t){return _(t),t.subtractFrom(this)},i._minusUnit=function(t,e){return this.plus(-1*t,e)},i.minusYears=function(t){return this._withDateTimeOffset(this._dateTime.minusYears(t),this._offset)},i.minusMonths=function(t){return this._withDateTimeOffset(this._dateTime.minusMonths(t),this._offset)},i.minusWeeks=function(t){return this._withDateTimeOffset(this._dateTime.minusWeeks(t),this._offset)},i.minusDays=function(t){return this._withDateTimeOffset(this._dateTime.minusDays(t),this._offset)},i.minusHours=function(t){return this._withDateTimeOffset(this._dateTime.minusHours(t),this._offset)},i.minusMinutes=function(t){return this._withDateTimeOffset(this._dateTime.minusMinutes(t),this._offset)},i.minusSeconds=function(t){return this._withDateTimeOffset(this._dateTime.minusSeconds(t),this._offset)},i.minusNanos=function(t){return this._withDateTimeOffset(this._dateTime.minusNanos(t),this._offset)},i.compareTo=function(t){if(_(t,"other"),d(t,e,"other"),this.offset().equals(t.offset()))return this.toLocalDateTime().compareTo(t.toLocalDateTime());var n=m.compareNumbers(this.toEpochSecond(),t.toEpochSecond());return 0===n&&0===(n=this.toLocalTime().nano()-t.toLocalTime().nano())&&(n=this.toLocalDateTime().compareTo(t.toLocalDateTime())),n},i.isAfter=function(t){_(t,"other");var e=this.toEpochSecond(),n=t.toEpochSecond();return e>n||e===n&&this.toLocalTime().nano()>t.toLocalTime().nano()},i.isBefore=function(t){_(t,"other");var e=this.toEpochSecond(),n=t.toEpochSecond();return e<n||e===n&&this.toLocalTime().nano()<t.toLocalTime().nano()},i.isEqual=function(t){return _(t,"other"),this.toEpochSecond()===t.toEpochSecond()&&this.toLocalTime().nano()===t.toLocalTime().nano()},i.equals=function(t){return this===t||t instanceof e&&(this._dateTime.equals(t._dateTime)&&this._offset.equals(t._offset))},i.hashCode=function(){return this._dateTime.hashCode()^this._offset.hashCode()},i.toString=function(){return this._dateTime.toString()+this._offset.toString()},i.toJSON=function(){return this.toString()},i.format=function(t){return _(t,"formatter"),t.format(this)},e}(k);var re=146097,se=719528,oe=function(t){function e(n,i,r){var s;return s=t.call(this)||this,_(n,"year"),_(i,"month"),_(r,"dayOfMonth"),i instanceof U&&(i=i.value()),s._year=m.safeToInt(n),s._month=m.safeToInt(i),s._day=m.safeToInt(r),e._validate(s._year,s._month,s._day),s}h(e,t),e.now=function(t){var n;return n=null==t?le.systemDefaultZone():t instanceof Z?le.system(t):t,e.ofInstant(n.instant(),n.zone())},e.ofInstant=function(t,n){void 0===n&&(n=Z.systemDefault()),_(t,"instant");var i=n.rules().offset(t),r=t.epochSecond()+i.totalSeconds(),s=m.floorDiv(r,he.SECONDS_PER_DAY);return e.ofEpochDay(s)},e.of=function(t,n,i){return new e(t,n,i)},e.ofYearDay=function(t,i){R.YEAR.checkValidValue(t);var r=$t.isLeapYear(t);366===i&&!1===r&&l(!1,"Invalid date 'DayOfYear 366' as '"+t+"' is not a leap year",n);var s=U.of(Math.floor((i-1)/31+1));i>s.firstDayOfYear(r)+s.length(r)-1&&(s=s.plus(1));var o=i-s.firstDayOfYear(r)+1;return new e(t,s.value(),o)},e.ofEpochDay=function(t){var n,i,r,s,o;void 0===t&&(t=0),o=t+se,n=0,(o-=60)<0&&(n=400*(i=m.intDiv(o+1,re)-1),o+=-i*re),(r=o-(365*(s=m.intDiv(400*o+591,re))+m.intDiv(s,4)-m.intDiv(s,100)+m.intDiv(s,400)))<0&&(r=o-(365*--s+m.intDiv(s,4)-m.intDiv(s,100)+m.intDiv(s,400))),s+=n;var a=r,u=m.intDiv(5*a+2,153),h=(u+2)%12+1,f=a-m.intDiv(306*u+5,10)+1;return new e(s+=m.intDiv(u,10),h,f)},e.from=function(t){_(t,"temporal");var e=t.query(g.localDate());if(null==e)throw new n("Unable to obtain LocalDate from TemporalAccessor: "+t+", type "+(null!=t.constructor?t.constructor.name:""));return e},e.parse=function(t,n){return void 0===n&&(n=xt.ISO_LOCAL_DATE),l(null!=n,"formatter",u),n.parse(t,e.FROM)},e._resolvePreviousValid=function(t,n,i){switch(n){case 2:i=Math.min(i,$t.isLeapYear(t)?29:28);break;case 4:case 6:case 9:case 11:i=Math.min(i,30)}return e.of(t,n,i)},e._validate=function(t,e,i){var r;if(R.YEAR.checkValidValue(t),R.MONTH_OF_YEAR.checkValidValue(e),R.DAY_OF_MONTH.checkValidValue(i),i>28){switch(r=31,e){case 2:r=$t.isLeapYear(t)?29:28;break;case 4:case 6:case 9:case 11:r=30}i>r&&l(!1,29===i?"Invalid date 'February 29' as '"+t+"' is not a leap year":"Invalid date '"+t+"' '"+e+"' '"+i+"'",n)}};var i=e.prototype;return i.isSupported=function(e){return t.prototype.isSupported.call(this,e)},i.range=function(t){if(t instanceof R){if(t.isDateBased()){switch(t){case R.DAY_OF_MONTH:return M.of(1,this.lengthOfMonth());case R.DAY_OF_YEAR:return M.of(1,this.lengthOfYear());case R.ALIGNED_WEEK_OF_MONTH:return M.of(1,this.month()===U.FEBRUARY&&!1===this.isLeapYear()?4:5);case R.YEAR_OF_ERA:return this._year<=0?M.of(1,Kt.MAX_VALUE+1):M.of(1,Kt.MAX_VALUE)}return t.range()}throw new r("Unsupported field: "+t)}return t.rangeRefinedBy(this)},i.get=function(t){return this.getLong(t)},i.getLong=function(t){return l(null!=t,"",u),t instanceof R?this._get0(t):t.getFrom(this)},i._get0=function(t){switch(t){case R.DAY_OF_WEEK:return this.dayOfWeek().value();case R.ALIGNED_DAY_OF_WEEK_IN_MONTH:return m.intMod(this._day-1,7)+1;case R.ALIGNED_DAY_OF_WEEK_IN_YEAR:return m.intMod(this.dayOfYear()-1,7)+1;case R.DAY_OF_MONTH:return this._day;case R.DAY_OF_YEAR:return this.dayOfYear();case R.EPOCH_DAY:return this.toEpochDay();case R.ALIGNED_WEEK_OF_MONTH:return m.intDiv(this._day-1,7)+1;case R.ALIGNED_WEEK_OF_YEAR:return m.intDiv(this.dayOfYear()-1,7)+1;case R.MONTH_OF_YEAR:return this._month;case R.PROLEPTIC_MONTH:return this._prolepticMonth();case R.YEAR_OF_ERA:return this._year>=1?this._year:1-this._year;case R.YEAR:return this._year;case R.ERA:return this._year>=1?1:0}throw new r("Unsupported field: "+t)},i._prolepticMonth=function(){return 12*this._year+(this._month-1)},i.chronology=function(){return $t.INSTANCE},i.year=function(){return this._year},i.monthValue=function(){return this._month},i.month=function(){return U.of(this._month)},i.dayOfMonth=function(){return this._day},i.dayOfYear=function(){return this.month().firstDayOfYear(this.isLeapYear())+this._day-1},i.dayOfWeek=function(){var t=m.floorMod(this.toEpochDay()+3,7);return L.of(t+1)},i.isLeapYear=function(){return $t.isLeapYear(this._year)},i.lengthOfMonth=function(){switch(this._month){case 2:return this.isLeapYear()?29:28;case 4:case 6:case 9:case 11:return 30;default:return 31}},i.lengthOfYear=function(){return this.isLeapYear()?366:365},i._withAdjuster=function(n){return _(n,"adjuster"),n instanceof e?n:t.prototype._withAdjuster.call(this,n)},i._withField=function(t,n){if(l(null!=t,"field",u),t instanceof R){var i=t;switch(i.checkValidValue(n),i){case R.DAY_OF_WEEK:return this.plusDays(n-this.dayOfWeek().value());case R.ALIGNED_DAY_OF_WEEK_IN_MONTH:return this.plusDays(n-this.getLong(R.ALIGNED_DAY_OF_WEEK_IN_MONTH));case R.ALIGNED_DAY_OF_WEEK_IN_YEAR:return this.plusDays(n-this.getLong(R.ALIGNED_DAY_OF_WEEK_IN_YEAR));case R.DAY_OF_MONTH:return this.withDayOfMonth(n);case R.DAY_OF_YEAR:return this.withDayOfYear(n);case R.EPOCH_DAY:return e.ofEpochDay(n);case R.ALIGNED_WEEK_OF_MONTH:return this.plusWeeks(n-this.getLong(R.ALIGNED_WEEK_OF_MONTH));case R.ALIGNED_WEEK_OF_YEAR:return this.plusWeeks(n-this.getLong(R.ALIGNED_WEEK_OF_YEAR));case R.MONTH_OF_YEAR:return this.withMonth(n);case R.PROLEPTIC_MONTH:return this.plusMonths(n-this.getLong(R.PROLEPTIC_MONTH));case R.YEAR_OF_ERA:return this.withYear(this._year>=1?n:1-n);case R.YEAR:return this.withYear(n);case R.ERA:return this.getLong(R.ERA)===n?this:this.withYear(1-this._year)}throw new r("Unsupported field: "+t)}return t.adjustInto(this,n)},i.withYear=function(t){return this._year===t?this:(R.YEAR.checkValidValue(t),e._resolvePreviousValid(t,this._month,this._day))},i.withMonth=function(t){var n=t instanceof U?t.value():t;return this._month===n?this:(R.MONTH_OF_YEAR.checkValidValue(n),e._resolvePreviousValid(this._year,n,this._day))},i.withDayOfMonth=function(t){return this._day===t?this:e.of(this._year,this._month,t)},i.withDayOfYear=function(t){return this.dayOfYear()===t?this:e.ofYearDay(this._year,t)},i._plusUnit=function(t,e){if(_(t,"amountToAdd"),_(e,"unit"),e instanceof w){switch(e){case w.DAYS:return this.plusDays(t);case w.WEEKS:return this.plusWeeks(t);case w.MONTHS:return this.plusMonths(t);case w.YEARS:return this.plusYears(t);case w.DECADES:return this.plusYears(m.safeMultiply(t,10));case w.CENTURIES:return this.plusYears(m.safeMultiply(t,100));case w.MILLENNIA:return this.plusYears(m.safeMultiply(t,1e3));case w.ERAS:return this.with(R.ERA,m.safeAdd(this.getLong(R.ERA),t))}throw new r("Unsupported unit: "+e)}return e.addTo(this,t)},i.plusYears=function(t){if(0===t)return this;var n=R.YEAR.checkValidIntValue(this._year+t);return e._resolvePreviousValid(n,this._month,this._day)},i.plusMonths=function(t){if(0===t)return this;var n=12*this._year+(this._month-1)+t,i=R.YEAR.checkValidIntValue(m.floorDiv(n,12)),r=m.floorMod(n,12)+1;return e._resolvePreviousValid(i,r,this._day)},i.plusWeeks=function(t){return this.plusDays(m.safeMultiply(t,7))},i.plusDays=function(t){if(0===t)return this;var n=m.safeAdd(this.toEpochDay(),t);return e.ofEpochDay(n)},i._minusUnit=function(t,e){return _(t,"amountToSubtract"),_(e,"unit"),this._plusUnit(-1*t,e)},i.minusYears=function(t){return this.plusYears(-1*t)},i.minusMonths=function(t){return this.plusMonths(-1*t)},i.minusWeeks=function(t){return this.plusWeeks(-1*t)},i.minusDays=function(t){return this.plusDays(-1*t)},i.query=function(e){return _(e,"query"),e===g.localDate()?this:t.prototype.query.call(this,e)},i.adjustInto=function(e){return t.prototype.adjustInto.call(this,e)},i.until=function(t,e){return arguments.length<2?this.until1(t):this.until2(t,e)},i.until2=function(t,n){var i=e.from(t);if(n instanceof w){switch(n){case w.DAYS:return this.daysUntil(i);case w.WEEKS:return m.intDiv(this.daysUntil(i),7);case w.MONTHS:return this._monthsUntil(i);case w.YEARS:return m.intDiv(this._monthsUntil(i),12);case w.DECADES:return m.intDiv(this._monthsUntil(i),120);case w.CENTURIES:return m.intDiv(this._monthsUntil(i),1200);case w.MILLENNIA:return m.intDiv(this._monthsUntil(i),12e3);case w.ERAS:return i.getLong(R.ERA)-this.getLong(R.ERA)}throw new r("Unsupported unit: "+n)}return n.between(this,i)},i.daysUntil=function(t){return t.toEpochDay()-this.toEpochDay()},i._monthsUntil=function(t){var e=32*this._prolepticMonth()+this.dayOfMonth(),n=32*t._prolepticMonth()+t.dayOfMonth();return m.intDiv(n-e,32)},i.until1=function(t){var n=e.from(t),i=n._prolepticMonth()-this._prolepticMonth(),r=n._day-this._day;if(i>0&&r<0){i--;var s=this.plusMonths(i);r=n.toEpochDay()-s.toEpochDay()}else i<0&&r>0&&(i++,r-=n.lengthOfMonth());var o=m.intDiv(i,12),a=m.intMod(i,12);return b.of(o,a,r)},i.atTime=function(){return 1===arguments.length?this.atTime1.apply(this,arguments):this.atTime4.apply(this,arguments)},i.atTime1=function(t){if(_(t,"time"),t instanceof he)return ue.of(this,t);if(t instanceof te)return this._atTimeOffsetTime(t);throw new o("time must be an instance of LocalTime or OffsetTime"+(t&&t.constructor&&t.constructor.name?", but is "+t.constructor.name:""))},i.atTime4=function(t,e,n,i){return void 0===n&&(n=0),void 0===i&&(i=0),this.atTime1(he.of(t,e,n,i))},i._atTimeOffsetTime=function(t){return ie.of(ue.of(this,t.toLocalTime()),t.offset())},i.atStartOfDay=function(t){return null!=t?this._atStartOfDayWithZone(t):ue.of(this,he.MIDNIGHT)},i._atStartOfDayWithZone=function(t){_(t,"zone");var e=this.atTime(he.MIDNIGHT);if(t instanceof X==!1){var n=t.rules().transition(e);null!=n&&n.isGap()&&(e=n.dateTimeAfter())}return ne.of(e,t)},i.toEpochDay=function(){var t=this._year,e=this._month,n=0;return n+=365*t,t>=0?n+=m.intDiv(t+3,4)-m.intDiv(t+99,100)+m.intDiv(t+399,400):n-=m.intDiv(t,-4)-m.intDiv(t,-100)+m.intDiv(t,-400),n+=m.intDiv(367*e-362,12),n+=this.dayOfMonth()-1,e>2&&(n--,$t.isLeapYear(t)||n--),n-se},i.compareTo=function(t){return _(t,"other"),d(t,e,"other"),this._compareTo0(t)},i._compareTo0=function(t){var e=this._year-t._year;return 0===e&&0===(e=this._month-t._month)&&(e=this._day-t._day),e},i.isAfter=function(t){return this.compareTo(t)>0},i.isBefore=function(t){return this.compareTo(t)<0},i.isEqual=function(t){return 0===this.compareTo(t)},i.equals=function(t){return this===t||t instanceof e&&0===this._compareTo0(t)},i.hashCode=function(){var t=this._year,e=this._month,n=this._day;return m.hash(4294965248&t^(t<<11)+(e<<6)+n)},i.toString=function(){var t=this._year,e=this._month,n=this._day;return(Math.abs(t)<1e3?t<0?"-"+(""+(t-1e4)).slice(-4):(""+(t+1e4)).slice(-4):t>9999?"+"+t:""+t)+(e<10?"-0"+e:"-"+e)+(n<10?"-0"+n:"-"+n)},i.toJSON=function(){return this.toString()},i.format=function(e){return _(e,"formatter"),d(e,xt,"formatter"),t.prototype.format.call(this,e)},e}(B);var ae=function(t){function e(){return t.apply(this,arguments)||this}h(e,t);var n=e.prototype;return n.chronology=function(){return this.toLocalDate().chronology()},n.query=function(e){return e===g.chronology()?this.chronology():e===g.precision()?w.NANOS:e===g.localDate()?oe.ofEpochDay(this.toLocalDate().toEpochDay()):e===g.localTime()?this.toLocalTime():e===g.zone()||e===g.zoneId()||e===g.offset()?null:t.prototype.query.call(this,e)},n.adjustInto=function(t){return t.with(R.EPOCH_DAY,this.toLocalDate().toEpochDay()).with(R.NANO_OF_DAY,this.toLocalTime().toNanoOfDay())},n.toInstant=function(t){return d(t,X,"zoneId"),ce.ofEpochSecond(this.toEpochSecond(t),this.toLocalTime().nano())},n.toEpochSecond=function(t){_(t,"offset");var e=86400*this.toLocalDate().toEpochDay()+this.toLocalTime().toSecondOfDay();return e-=t.totalSeconds(),m.safeToInt(e)},e}(k),ue=function(t){function e(e,n){var i;return i=t.call(this)||this,d(e,oe,"date"),d(n,he,"time"),i._date=e,i._time=n,i}h(e,t),e.now=function(t){return null==t?e._now(le.systemDefaultZone()):t instanceof le?e._now(t):e._now(le.system(t))},e._now=function(t){return _(t,"clock"),e.ofInstant(t.instant(),t.zone())},e._ofEpochMillis=function(t,n){var i=m.floorDiv(t,1e3)+n.totalSeconds(),r=m.floorDiv(i,he.SECONDS_PER_DAY),s=m.floorMod(i,he.SECONDS_PER_DAY),o=1e6*m.floorMod(t,1e3);return new e(oe.ofEpochDay(r),he.ofSecondOfDay(s,o))},e.of=function(){return arguments.length<=2?e.ofDateAndTime.apply(this,arguments):e.ofNumbers.apply(this,arguments)},e.ofNumbers=function(t,n,i,r,s,o,a){return void 0===r&&(r=0),void 0===s&&(s=0),void 0===o&&(o=0),void 0===a&&(a=0),new e(oe.of(t,n,i),he.of(r,s,o,a))},e.ofDateAndTime=function(t,n){return _(t,"date"),_(n,"time"),new e(t,n)},e.ofInstant=function(t,n){void 0===n&&(n=Z.systemDefault()),_(t,"instant"),d(t,ce,"instant"),_(n,"zone");var i=n.rules().offset(t);return e.ofEpochSecond(t.epochSecond(),t.nano(),i)},e.ofEpochSecond=function(t,n,i){void 0===t&&(t=0),void 0===n&&(n=0),2===arguments.length&&n instanceof X&&(i=n,n=0),_(i,"offset");var r=t+i.totalSeconds(),s=m.floorDiv(r,he.SECONDS_PER_DAY),o=m.floorMod(r,he.SECONDS_PER_DAY),a=oe.ofEpochDay(s),u=he.ofSecondOfDay(o,n);return new e(a,u)},e.from=function(t){if(_(t,"temporal"),t instanceof e)return t;if(t instanceof ne)return t.toLocalDateTime();try{return new e(oe.from(t),he.from(t))}catch(e){throw new n("Unable to obtain LocalDateTime TemporalAccessor: "+t+", type "+(null!=t.constructor?t.constructor.name:""))}},e.parse=function(t,n){return void 0===n&&(n=xt.ISO_LOCAL_DATE_TIME),_(n,"formatter"),n.parse(t,e.FROM)};var i=e.prototype;return i._withDateTime=function(t,n){return this._date.equals(t)&&this._time.equals(n)?this:new e(t,n)},i.isSupported=function(t){return t instanceof R||t instanceof w?t.isDateBased()||t.isTimeBased():null!=t&&t.isSupportedBy(this)},i.range=function(t){return t instanceof R?t.isTimeBased()?this._time.range(t):this._date.range(t):t.rangeRefinedBy(this)},i.get=function(e){return e instanceof R?e.isTimeBased()?this._time.get(e):this._date.get(e):t.prototype.get.call(this,e)},i.getLong=function(t){return _(t,"field"),t instanceof R?t.isTimeBased()?this._time.getLong(t):this._date.getLong(t):t.getFrom(this)},i.year=function(){return this._date.year()},i.monthValue=function(){return this._date.monthValue()},i.month=function(){return this._date.month()},i.dayOfMonth=function(){return this._date.dayOfMonth()},i.dayOfYear=function(){return this._date.dayOfYear()},i.dayOfWeek=function(){return this._date.dayOfWeek()},i.hour=function(){return this._time.hour()},i.minute=function(){return this._time.minute()},i.second=function(){return this._time.second()},i.nano=function(){return this._time.nano()},i._withAdjuster=function(n){return _(n,"adjuster"),n instanceof oe?this._withDateTime(n,this._time):n instanceof he?this._withDateTime(this._date,n):n instanceof e?n:t.prototype._withAdjuster.call(this,n)},i._withField=function(t,e){return _(t,"field"),t instanceof R?t.isTimeBased()?this._withDateTime(this._date,this._time.with(t,e)):this._withDateTime(this._date.with(t,e),this._time):t.adjustInto(this,e)},i.withYear=function(t){return this._withDateTime(this._date.withYear(t),this._time)},i.withMonth=function(t){return this._withDateTime(this._date.withMonth(t),this._time)},i.withDayOfMonth=function(t){return this._withDateTime(this._date.withDayOfMonth(t),this._time)},i.withDayOfYear=function(t){return this._withDateTime(this._date.withDayOfYear(t),this._time)},i.withHour=function(t){var e=this._time.withHour(t);return this._withDateTime(this._date,e)},i.withMinute=function(t){var e=this._time.withMinute(t);return this._withDateTime(this._date,e)},i.withSecond=function(t){var e=this._time.withSecond(t);return this._withDateTime(this._date,e)},i.withNano=function(t){var e=this._time.withNano(t);return this._withDateTime(this._date,e)},i.truncatedTo=function(t){return this._withDateTime(this._date,this._time.truncatedTo(t))},i._plusUnit=function(t,e){if(_(e,"unit"),e instanceof w){switch(e){case w.NANOS:return this.plusNanos(t);case w.MICROS:return this.plusDays(m.intDiv(t,he.MICROS_PER_DAY)).plusNanos(1e3*m.intMod(t,he.MICROS_PER_DAY));case w.MILLIS:return this.plusDays(m.intDiv(t,he.MILLIS_PER_DAY)).plusNanos(1e6*m.intMod(t,he.MILLIS_PER_DAY));case w.SECONDS:return this.plusSeconds(t);case w.MINUTES:return this.plusMinutes(t);case w.HOURS:return this.plusHours(t);case w.HALF_DAYS:return this.plusDays(m.intDiv(t,256)).plusHours(12*m.intMod(t,256))}return this._withDateTime(this._date.plus(t,e),this._time)}return e.addTo(this,t)},i.plusYears=function(t){var e=this._date.plusYears(t);return this._withDateTime(e,this._time)},i.plusMonths=function(t){var e=this._date.plusMonths(t);return this._withDateTime(e,this._time)},i.plusWeeks=function(t){var e=this._date.plusWeeks(t);return this._withDateTime(e,this._time)},i.plusDays=function(t){var e=this._date.plusDays(t);return this._withDateTime(e,this._time)},i.plusHours=function(t){return this._plusWithOverflow(this._date,t,0,0,0,1)},i.plusMinutes=function(t){return this._plusWithOverflow(this._date,0,t,0,0,1)},i.plusSeconds=function(t){return this._plusWithOverflow(this._date,0,0,t,0,1)},i.plusNanos=function(t){return this._plusWithOverflow(this._date,0,0,0,t,1)},i._minusUnit=function(t,e){return _(e,"unit"),this._plusUnit(-1*t,e)},i.minusYears=function(t){return this.plusYears(-1*t)},i.minusMonths=function(t){return this.plusMonths(-1*t)},i.minusWeeks=function(t){return this.plusWeeks(-1*t)},i.minusDays=function(t){return this.plusDays(-1*t)},i.minusHours=function(t){return this._plusWithOverflow(this._date,t,0,0,0,-1)},i.minusMinutes=function(t){return this._plusWithOverflow(this._date,0,t,0,0,-1)},i.minusSeconds=function(t){return this._plusWithOverflow(this._date,0,0,t,0,-1)},i.minusNanos=function(t){return this._plusWithOverflow(this._date,0,0,0,t,-1)},i._plusWithOverflow=function(t,e,n,i,r,s){if(0===e&&0===n&&0===i&&0===r)return this._withDateTime(t,this._time);var o=m.intDiv(r,he.NANOS_PER_DAY)+m.intDiv(i,he.SECONDS_PER_DAY)+m.intDiv(n,he.MINUTES_PER_DAY)+m.intDiv(e,he.HOURS_PER_DAY);o*=s;var a=m.intMod(r,he.NANOS_PER_DAY)+m.intMod(i,he.SECONDS_PER_DAY)*he.NANOS_PER_SECOND+m.intMod(n,he.MINUTES_PER_DAY)*he.NANOS_PER_MINUTE+m.intMod(e,he.HOURS_PER_DAY)*he.NANOS_PER_HOUR,u=this._time.toNanoOfDay();a=a*s+u,o+=m.floorDiv(a,he.NANOS_PER_DAY);var h=m.floorMod(a,he.NANOS_PER_DAY),f=h===u?this._time:he.ofNanoOfDay(h);return this._withDateTime(t.plusDays(o),f)},i.query=function(e){return _(e,"query"),e===g.localDate()?this.toLocalDate():t.prototype.query.call(this,e)},i.adjustInto=function(e){return t.prototype.adjustInto.call(this,e)},i.until=function(t,n){_(t,"endExclusive"),_(n,"unit");var i=e.from(t);if(n instanceof w){if(n.isTimeBased()){var s=this._date.daysUntil(i._date),o=i._time.toNanoOfDay()-this._time.toNanoOfDay();s>0&&o<0?(s--,o+=he.NANOS_PER_DAY):s<0&&o>0&&(s++,o-=he.NANOS_PER_DAY);var a=s;switch(n){case w.NANOS:return a=m.safeMultiply(a,he.NANOS_PER_DAY),m.safeAdd(a,o);case w.MICROS:return a=m.safeMultiply(a,he.MICROS_PER_DAY),m.safeAdd(a,m.intDiv(o,1e3));case w.MILLIS:return a=m.safeMultiply(a,he.MILLIS_PER_DAY),m.safeAdd(a,m.intDiv(o,1e6));case w.SECONDS:return a=m.safeMultiply(a,he.SECONDS_PER_DAY),m.safeAdd(a,m.intDiv(o,he.NANOS_PER_SECOND));case w.MINUTES:return a=m.safeMultiply(a,he.MINUTES_PER_DAY),m.safeAdd(a,m.intDiv(o,he.NANOS_PER_MINUTE));case w.HOURS:return a=m.safeMultiply(a,he.HOURS_PER_DAY),m.safeAdd(a,m.intDiv(o,he.NANOS_PER_HOUR));case w.HALF_DAYS:return a=m.safeMultiply(a,2),m.safeAdd(a,m.intDiv(o,12*he.NANOS_PER_HOUR))}throw new r("Unsupported unit: "+n)}var u=i._date,h=i._time;return u.isAfter(this._date)&&h.isBefore(this._time)?u=u.minusDays(1):u.isBefore(this._date)&&h.isAfter(this._time)&&(u=u.plusDays(1)),this._date.until(u,n)}return n.between(this,i)},i.atOffset=function(t){return ie.of(this,t)},i.atZone=function(t){return ne.of(this,t)},i.toLocalDate=function(){return this._date},i.toLocalTime=function(){return this._time},i.compareTo=function(t){return _(t,"other"),d(t,e,"other"),this._compareTo0(t)},i._compareTo0=function(t){var e=this._date.compareTo(t.toLocalDate());return 0===e&&(e=this._time.compareTo(t.toLocalTime())),e},i.isAfter=function(t){return this.compareTo(t)>0},i.isBefore=function(t){return this.compareTo(t)<0},i.isEqual=function(t){return 0===this.compareTo(t)},i.equals=function(t){return this===t||t instanceof e&&(this._date.equals(t._date)&&this._time.equals(t._time))},i.hashCode=function(){return this._date.hashCode()^this._time.hashCode()},i.toString=function(){return this._date.toString()+"T"+this._time.toString()},i.toJSON=function(){return this.toString()},i.format=function(t){return _(t,"formatter"),t.format(this)},e}(ae);var he=function(t){function e(n,i,r,s){var o;void 0===n&&(n=0),void 0===i&&(i=0),void 0===r&&(r=0),void 0===s&&(s=0),o=t.call(this)||this;var a=m.safeToInt(n),u=m.safeToInt(i),h=m.safeToInt(r),f=m.safeToInt(s);return e._validate(a,u,h,f),0===u&&0===h&&0===f?(e.HOURS[a]||(o._hour=a,o._minute=u,o._second=h,o._nano=f,e.HOURS[a]=c(o)),e.HOURS[a]||c(o)):(o._hour=a,o._minute=u,o._second=h,o._nano=f,o)}h(e,t),e.now=function(t){return null==t?e._now(le.systemDefaultZone()):t instanceof le?e._now(t):e._now(le.system(t))},e._now=function(t){return void 0===t&&(t=le.systemDefaultZone()),_(t,"clock"),e.ofInstant(t.instant(),t.zone())},e.ofInstant=function(t,n){void 0===n&&(n=Z.systemDefault());var i=n.rules().offset(t),r=m.intMod(t.epochSecond(),e.SECONDS_PER_DAY);return(r=m.intMod(r+i.totalSeconds(),e.SECONDS_PER_DAY))<0&&(r+=e.SECONDS_PER_DAY),e.ofSecondOfDay(r,t.nano())},e.of=function(t,n,i,r){return new e(t,n,i,r)},e.ofSecondOfDay=function(t,n){void 0===t&&(t=0),void 0===n&&(n=0),R.SECOND_OF_DAY.checkValidValue(t),R.NANO_OF_SECOND.checkValidValue(n);var i=m.intDiv(t,e.SECONDS_PER_HOUR);t-=i*e.SECONDS_PER_HOUR;var r=m.intDiv(t,e.SECONDS_PER_MINUTE);return new e(i,r,t-=r*e.SECONDS_PER_MINUTE,n)},e.ofNanoOfDay=function(t){void 0===t&&(t=0),R.NANO_OF_DAY.checkValidValue(t);var n=m.intDiv(t,e.NANOS_PER_HOUR);t-=n*e.NANOS_PER_HOUR;var i=m.intDiv(t,e.NANOS_PER_MINUTE);t-=i*e.NANOS_PER_MINUTE;var r=m.intDiv(t,e.NANOS_PER_SECOND);return new e(n,i,r,t-=r*e.NANOS_PER_SECOND)},e.from=function(t){_(t,"temporal");var e=t.query(g.localTime());if(null==e)throw new n("Unable to obtain LocalTime TemporalAccessor: "+t+", type "+(null!=t.constructor?t.constructor.name:""));return e},e.parse=function(t,n){return void 0===n&&(n=xt.ISO_LOCAL_TIME),_(n,"formatter"),n.parse(t,e.FROM)},e._validate=function(t,e,n,i){R.HOUR_OF_DAY.checkValidValue(t),R.MINUTE_OF_HOUR.checkValidValue(e),R.SECOND_OF_MINUTE.checkValidValue(n),R.NANO_OF_SECOND.checkValidValue(i)};var i=e.prototype;return i.isSupported=function(t){return t instanceof R||t instanceof w?t.isTimeBased():null!=t&&t.isSupportedBy(this)},i.range=function(e){return _(e),t.prototype.range.call(this,e)},i.get=function(t){return this.getLong(t)},i.getLong=function(t){return _(t,"field"),t instanceof R?this._get0(t):t.getFrom(this)},i._get0=function(t){switch(t){case R.NANO_OF_SECOND:return this._nano;case R.NANO_OF_DAY:return this.toNanoOfDay();case R.MICRO_OF_SECOND:return m.intDiv(this._nano,1e3);case R.MICRO_OF_DAY:return m.intDiv(this.toNanoOfDay(),1e3);case R.MILLI_OF_SECOND:return m.intDiv(this._nano,1e6);case R.MILLI_OF_DAY:return m.intDiv(this.toNanoOfDay(),1e6);case R.SECOND_OF_MINUTE:return this._second;case R.SECOND_OF_DAY:return this.toSecondOfDay();case R.MINUTE_OF_HOUR:return this._minute;case R.MINUTE_OF_DAY:return 60*this._hour+this._minute;case R.HOUR_OF_AMPM:return m.intMod(this._hour,12);case R.CLOCK_HOUR_OF_AMPM:var e=m.intMod(this._hour,12);return e%12==0?12:e;case R.HOUR_OF_DAY:return this._hour;case R.CLOCK_HOUR_OF_DAY:return 0===this._hour?24:this._hour;case R.AMPM_OF_DAY:return m.intDiv(this._hour,12)}throw new r("Unsupported field: "+t)},i.hour=function(){return this._hour},i.minute=function(){return this._minute},i.second=function(){return this._second},i.nano=function(){return this._nano},i._withAdjuster=function(n){return _(n,"adjuster"),n instanceof e?n:t.prototype._withAdjuster.call(this,n)},i._withField=function(t,n){if(_(t,"field"),d(t,y,"field"),t instanceof R){switch(t.checkValidValue(n),t){case R.NANO_OF_SECOND:return this.withNano(n);case R.NANO_OF_DAY:return e.ofNanoOfDay(n);case R.MICRO_OF_SECOND:return this.withNano(1e3*n);case R.MICRO_OF_DAY:return e.ofNanoOfDay(1e3*n);case R.MILLI_OF_SECOND:return this.withNano(1e6*n);case R.MILLI_OF_DAY:return e.ofNanoOfDay(1e6*n);case R.SECOND_OF_MINUTE:return this.withSecond(n);case R.SECOND_OF_DAY:return this.plusSeconds(n-this.toSecondOfDay());case R.MINUTE_OF_HOUR:return this.withMinute(n);case R.MINUTE_OF_DAY:return this.plusMinutes(n-(60*this._hour+this._minute));case R.HOUR_OF_AMPM:return this.plusHours(n-m.intMod(this._hour,12));case R.CLOCK_HOUR_OF_AMPM:return this.plusHours((12===n?0:n)-m.intMod(this._hour,12));case R.HOUR_OF_DAY:return this.withHour(n);case R.CLOCK_HOUR_OF_DAY:return this.withHour(24===n?0:n);case R.AMPM_OF_DAY:return this.plusHours(12*(n-m.intDiv(this._hour,12)))}throw new r("Unsupported field: "+t)}return t.adjustInto(this,n)},i.withHour=function(t){return void 0===t&&(t=0),this._hour===t?this:new e(t,this._minute,this._second,this._nano)},i.withMinute=function(t){return void 0===t&&(t=0),this._minute===t?this:new e(this._hour,t,this._second,this._nano)},i.withSecond=function(t){return void 0===t&&(t=0),this._second===t?this:new e(this._hour,this._minute,t,this._nano)},i.withNano=function(t){return void 0===t&&(t=0),this._nano===t?this:new e(this._hour,this._minute,this._second,t)},i.truncatedTo=function(t){if(_(t,"unit"),t===w.NANOS)return this;var i=t.duration();if(i.seconds()>e.SECONDS_PER_DAY)throw new n("Unit is too large to be used for truncation");var r=i.toNanos();if(0!==m.intMod(e.NANOS_PER_DAY,r))throw new n("Unit must divide into a standard day without remainder");var s=this.toNanoOfDay();return e.ofNanoOfDay(m.intDiv(s,r)*r)},i._plusUnit=function(t,n){if(_(n,"unit"),n instanceof w){switch(n){case w.NANOS:return this.plusNanos(t);case w.MICROS:return this.plusNanos(1e3*m.intMod(t,e.MICROS_PER_DAY));case w.MILLIS:return this.plusNanos(1e6*m.intMod(t,e.MILLIS_PER_DAY));case w.SECONDS:return this.plusSeconds(t);case w.MINUTES:return this.plusMinutes(t);case w.HOURS:return this.plusHours(t);case w.HALF_DAYS:return this.plusHours(12*m.intMod(t,2))}throw new r("Unsupported unit: "+n)}return n.addTo(this,t)},i.plusHours=function(t){return 0===t?this:new e(m.intMod(m.intMod(t,e.HOURS_PER_DAY)+this._hour+e.HOURS_PER_DAY,e.HOURS_PER_DAY),this._minute,this._second,this._nano)},i.plusMinutes=function(t){if(0===t)return this;var n=this._hour*e.MINUTES_PER_HOUR+this._minute,i=m.intMod(m.intMod(t,e.MINUTES_PER_DAY)+n+e.MINUTES_PER_DAY,e.MINUTES_PER_DAY);return n===i?this:new e(m.intDiv(i,e.MINUTES_PER_HOUR),m.intMod(i,e.MINUTES_PER_HOUR),this._second,this._nano)},i.plusSeconds=function(t){if(0===t)return this;var n=this._hour*e.SECONDS_PER_HOUR+this._minute*e.SECONDS_PER_MINUTE+this._second,i=m.intMod(m.intMod(t,e.SECONDS_PER_DAY)+n+e.SECONDS_PER_DAY,e.SECONDS_PER_DAY);return n===i?this:new e(m.intDiv(i,e.SECONDS_PER_HOUR),m.intMod(m.intDiv(i,e.SECONDS_PER_MINUTE),e.MINUTES_PER_HOUR),m.intMod(i,e.SECONDS_PER_MINUTE),this._nano)},i.plusNanos=function(t){if(0===t)return this;var n=this.toNanoOfDay(),i=m.intMod(m.intMod(t,e.NANOS_PER_DAY)+n+e.NANOS_PER_DAY,e.NANOS_PER_DAY);return n===i?this:new e(m.intDiv(i,e.NANOS_PER_HOUR),m.intMod(m.intDiv(i,e.NANOS_PER_MINUTE),e.MINUTES_PER_HOUR),m.intMod(m.intDiv(i,e.NANOS_PER_SECOND),e.SECONDS_PER_MINUTE),m.intMod(i,e.NANOS_PER_SECOND))},i._minusUnit=function(t,e){return _(e,"unit"),this._plusUnit(-1*t,e)},i.minusHours=function(t){return this.plusHours(-1*m.intMod(t,e.HOURS_PER_DAY))},i.minusMinutes=function(t){return this.plusMinutes(-1*m.intMod(t,e.MINUTES_PER_DAY))},i.minusSeconds=function(t){return this.plusSeconds(-1*m.intMod(t,e.SECONDS_PER_DAY))},i.minusNanos=function(t){return this.plusNanos(-1*m.intMod(t,e.NANOS_PER_DAY))},i.query=function(t){return _(t,"query"),t===g.precision()?w.NANOS:t===g.localTime()?this:t===g.chronology()||t===g.zoneId()||t===g.zone()||t===g.offset()||t===g.localDate()?null:t.queryFrom(this)},i.adjustInto=function(t){return t.with(e.NANO_OF_DAY,this.toNanoOfDay())},i.until=function(t,n){_(t,"endExclusive"),_(n,"unit");var i=e.from(t);if(n instanceof w){var s=i.toNanoOfDay()-this.toNanoOfDay();switch(n){case w.NANOS:return s;case w.MICROS:return m.intDiv(s,1e3);case w.MILLIS:return m.intDiv(s,1e6);case w.SECONDS:return m.intDiv(s,e.NANOS_PER_SECOND);case w.MINUTES:return m.intDiv(s,e.NANOS_PER_MINUTE);case w.HOURS:return m.intDiv(s,e.NANOS_PER_HOUR);case w.HALF_DAYS:return m.intDiv(s,12*e.NANOS_PER_HOUR)}throw new r("Unsupported unit: "+n)}return n.between(this,i)},i.atDate=function(t){return ue.of(t,this)},i.atOffset=function(t){return te.of(this,t)},i.toSecondOfDay=function(){var t=this._hour*e.SECONDS_PER_HOUR;return t+=this._minute*e.SECONDS_PER_MINUTE,t+=this._second},i.toNanoOfDay=function(){var t=this._hour*e.NANOS_PER_HOUR;return t+=this._minute*e.NANOS_PER_MINUTE,t+=this._second*e.NANOS_PER_SECOND,t+=this._nano},i.compareTo=function(t){_(t,"other"),d(t,e,"other");var n=m.compareNumbers(this._hour,t._hour);return 0===n&&0===(n=m.compareNumbers(this._minute,t._minute))&&0===(n=m.compareNumbers(this._second,t._second))&&(n=m.compareNumbers(this._nano,t._nano)),n},i.isAfter=function(t){return this.compareTo(t)>0},i.isBefore=function(t){return this.compareTo(t)<0},i.equals=function(t){return this===t||t instanceof e&&(this._hour===t._hour&&this._minute===t._minute&&this._second===t._second&&this._nano===t._nano)},i.hashCode=function(){var t=this.toNanoOfDay();return m.hash(t)},i.toString=function(){var t="",e=this._hour,n=this._minute,i=this._second,r=this._nano;return t+=e<10?"0":"",t+=e,t+=n<10?":0":":",t+=n,(i>0||r>0)&&(t+=i<10?":0":":",t+=i,r>0&&(t+=".",0===m.intMod(r,1e6)?t+=(""+(m.intDiv(r,1e6)+1e3)).substring(1):0===m.intMod(r,1e3)?t+=(""+(m.intDiv(r,1e3)+1e6)).substring(1):t+=(""+(r+1e9)).substring(1))),t},i.toJSON=function(){return this.toString()},i.format=function(t){return _(t,"formatter"),t.format(this)},e}(k);he.HOURS_PER_DAY=24,he.MINUTES_PER_HOUR=60,he.MINUTES_PER_DAY=he.MINUTES_PER_HOUR*he.HOURS_PER_DAY,he.SECONDS_PER_MINUTE=60,he.SECONDS_PER_HOUR=he.SECONDS_PER_MINUTE*he.MINUTES_PER_HOUR,he.SECONDS_PER_DAY=he.SECONDS_PER_HOUR*he.HOURS_PER_DAY,he.MILLIS_PER_DAY=1e3*he.SECONDS_PER_DAY,he.MICROS_PER_DAY=1e6*he.SECONDS_PER_DAY,he.NANOS_PER_SECOND=1e9,he.NANOS_PER_MINUTE=he.NANOS_PER_SECOND*he.SECONDS_PER_MINUTE,he.NANOS_PER_HOUR=he.NANOS_PER_MINUTE*he.MINUTES_PER_HOUR,he.NANOS_PER_DAY=he.NANOS_PER_HOUR*he.HOURS_PER_DAY;var fe=1e6,ce=function(t){function e(n,i){var r;return r=t.call(this)||this,e._validate(n,i),r._seconds=m.safeToInt(n),r._nanos=m.safeToInt(i),r}h(e,t),e.now=function(t){return void 0===t&&(t=le.systemUTC()),t.instant()},e.ofEpochSecond=function(t,n){void 0===n&&(n=0);var i=t+m.floorDiv(n,he.NANOS_PER_SECOND),r=m.floorMod(n,he.NANOS_PER_SECOND);return e._create(i,r)},e.ofEpochMilli=function(t){var n=m.floorDiv(t,1e3),i=m.floorMod(t,1e3);return e._create(n,1e6*i)},e.ofEpochMicro=function(t){var n=m.floorDiv(t,1e6),i=m.floorMod(t,1e6);return e._create(n,1e3*i)},e.from=function(t){try{var i=t.getLong(R.INSTANT_SECONDS),r=t.get(R.NANO_OF_SECOND);return e.ofEpochSecond(i,r)}catch(e){throw new n("Unable to obtain Instant from TemporalAccessor: "+t+", type "+typeof t,e)}},e.parse=function(t){return xt.ISO_INSTANT.parse(t,e.FROM)},e._create=function(t,n){return 0===t&&0===n?e.EPOCH:new e(t,n)},e._validate=function(t,i){if(t<e.MIN_SECONDS||t>e.MAX_SECONDS)throw new n("Instant exceeds minimum or maximum instant");if(i<0||i>he.NANOS_PER_SECOND)throw new n("Instant exceeds minimum or maximum instant")};var i=e.prototype;return i.isSupported=function(t){return t instanceof R?t===R.INSTANT_SECONDS||t===R.NANO_OF_SECOND||t===R.MICRO_OF_SECOND||t===R.MILLI_OF_SECOND:t instanceof w?t.isTimeBased()||t===w.DAYS:null!=t&&t.isSupportedBy(this)},i.range=function(e){return t.prototype.range.call(this,e)},i.get=function(t){return this.getLong(t)},i.getLong=function(t){if(t instanceof R){switch(t){case R.NANO_OF_SECOND:return this._nanos;case R.MICRO_OF_SECOND:return m.intDiv(this._nanos,1e3);case R.MILLI_OF_SECOND:return m.intDiv(this._nanos,fe);case R.INSTANT_SECONDS:return this._seconds}throw new r("Unsupported field: "+t)}return t.getFrom(this)},i.epochSecond=function(){return this._seconds},i.nano=function(){return this._nanos},i._withField=function(t,n){if(_(t,"field"),t instanceof R){switch(t.checkValidValue(n),t){case R.MILLI_OF_SECOND:var i=n*fe;return i!==this._nanos?e._create(this._seconds,i):this;case R.MICRO_OF_SECOND:var s=1e3*n;return s!==this._nanos?e._create(this._seconds,s):this;case R.NANO_OF_SECOND:return n!==this._nanos?e._create(this._seconds,n):this;case R.INSTANT_SECONDS:return n!==this._seconds?e._create(n,this._nanos):this}throw new r("Unsupported field: "+t)}return t.adjustInto(this,n)},i.truncatedTo=function(t){if(_(t,"unit"),t===w.NANOS)return this;var e=t.duration();if(e.seconds()>he.SECONDS_PER_DAY)throw new n("Unit is too large to be used for truncation");var i=e.toNanos();if(0!==m.intMod(he.NANOS_PER_DAY,i))throw new n("Unit must divide into a standard day without remainder");var r=m.intMod(this._seconds,he.SECONDS_PER_DAY)*he.NANOS_PER_SECOND+this._nanos,s=m.intDiv(r,i)*i;return this.plusNanos(s-r)},i._plusUnit=function(t,e){if(_(t,"amountToAdd"),_(e,"unit"),d(e,A),e instanceof w){switch(e){case w.NANOS:return this.plusNanos(t);case w.MICROS:return this.plusMicros(t);case w.MILLIS:return this.plusMillis(t);case w.SECONDS:return this.plusSeconds(t);case w.MINUTES:return this.plusSeconds(m.safeMultiply(t,he.SECONDS_PER_MINUTE));case w.HOURS:return this.plusSeconds(m.safeMultiply(t,he.SECONDS_PER_HOUR));case w.HALF_DAYS:return this.plusSeconds(m.safeMultiply(t,he.SECONDS_PER_DAY/2));case w.DAYS:return this.plusSeconds(m.safeMultiply(t,he.SECONDS_PER_DAY))}throw new r("Unsupported unit: "+e)}return e.addTo(this,t)},i.plusSeconds=function(t){return this._plus(t,0)},i.plusMillis=function(t){return this._plus(m.intDiv(t,1e3),m.intMod(t,1e3)*fe)},i.plusNanos=function(t){return this._plus(0,t)},i.plusMicros=function(t){return this._plus(m.intDiv(t,1e6),1e3*m.intMod(t,1e6))},i._plus=function(t,n){if(0===t&&0===n)return this;var i=this._seconds+t;i+=m.intDiv(n,he.NANOS_PER_SECOND);var r=this._nanos+n%he.NANOS_PER_SECOND;return e.ofEpochSecond(i,r)},i._minusUnit=function(t,e){return this._plusUnit(-1*t,e)},i.minusSeconds=function(t){return this.plusSeconds(-1*t)},i.minusMillis=function(t){return this.plusMillis(-1*t)},i.minusNanos=function(t){return this.plusNanos(-1*t)},i.minusMicros=function(t){return this.plusMicros(-1*t)},i.query=function(t){return _(t,"query"),t===g.precision()?w.NANOS:t===g.localDate()||t===g.localTime()||t===g.chronology()||t===g.zoneId()||t===g.zone()||t===g.offset()?null:t.queryFrom(this)},i.adjustInto=function(t){return _(t,"temporal"),t.with(R.INSTANT_SECONDS,this._seconds).with(R.NANO_OF_SECOND,this._nanos)},i.until=function(t,n){_(t,"endExclusive"),_(n,"unit");var i=e.from(t);if(n instanceof w){switch(n){case w.NANOS:return this._nanosUntil(i);case w.MICROS:return this._microsUntil(i);case w.MILLIS:return m.safeSubtract(i.toEpochMilli(),this.toEpochMilli());case w.SECONDS:return this._secondsUntil(i);case w.MINUTES:return m.intDiv(this._secondsUntil(i),he.SECONDS_PER_MINUTE);case w.HOURS:return m.intDiv(this._secondsUntil(i),he.SECONDS_PER_HOUR);case w.HALF_DAYS:return m.intDiv(this._secondsUntil(i),12*he.SECONDS_PER_HOUR);case w.DAYS:return m.intDiv(this._secondsUntil(i),he.SECONDS_PER_DAY)}throw new r("Unsupported unit: "+n)}return n.between(this,i)},i._microsUntil=function(t){var e=m.safeSubtract(t.epochSecond(),this.epochSecond()),n=m.safeMultiply(e,1e6);return m.safeAdd(n,m.intDiv(t.nano()-this.nano(),1e3))},i._nanosUntil=function(t){var e=m.safeSubtract(t.epochSecond(),this.epochSecond()),n=m.safeMultiply(e,he.NANOS_PER_SECOND);return m.safeAdd(n,t.nano()-this.nano())},i._secondsUntil=function(t){var e=m.safeSubtract(t.epochSecond(),this.epochSecond()),n=t.nano()-this.nano();return e>0&&n<0?e--:e<0&&n>0&&e++,e},i.atOffset=function(t){return ie.ofInstant(this,t)},i.atZone=function(t){return ne.ofInstant(this,t)},i.toEpochMilli=function(){return m.safeMultiply(this._seconds,1e3)+m.intDiv(this._nanos,fe)},i.compareTo=function(t){_(t,"otherInstant"),d(t,e,"otherInstant");var n=m.compareNumbers(this._seconds,t._seconds);return 0!==n?n:this._nanos-t._nanos},i.isAfter=function(t){return this.compareTo(t)>0},i.isBefore=function(t){return this.compareTo(t)<0},i.equals=function(t){return this===t||t instanceof e&&(this.epochSecond()===t.epochSecond()&&this.nano()===t.nano())},i.hashCode=function(){return m.hashCode(this._seconds,this._nanos)},i.toString=function(){return xt.ISO_INSTANT.format(this)},i.toJSON=function(){return this.toString()},e}(k);var le=function(){function t(){}t.systemUTC=function(){return new _e(X.UTC)},t.systemDefaultZone=function(){return new _e(Z.systemDefault())},t.system=function(t){return new _e(t)},t.fixed=function(t,e){return new de(t,e)},t.offset=function(t,e){return new pe(t,e)};var e=t.prototype;return e.millis=function(){p("Clock.millis")},e.instant=function(){p("Clock.instant")},e.zone=function(){p("Clock.zone")},e.withZone=function(){p("Clock.withZone")},t}(),_e=function(t){function e(e){var n;return _(e,"zone"),(n=t.call(this)||this)._zone=e,n}h(e,t);var n=e.prototype;return n.zone=function(){return this._zone},n.millis=function(){return(new Date).getTime()},n.instant=function(){return ce.ofEpochMilli(this.millis())},n.equals=function(t){return t instanceof e&&this._zone.equals(t._zone)},n.withZone=function(t){return t.equals(this._zone)?this:new e(t)},n.toString=function(){return"SystemClock["+this._zone.toString()+"]"},e}(le),de=function(t){function e(e,n){var i;return(i=t.call(this)||this)._instant=e,i._zoneId=n,i}h(e,t);var n=e.prototype;return n.instant=function(){return this._instant},n.millis=function(){return this._instant.toEpochMilli()},n.zone=function(){return this._zoneId},n.toString=function(){return"FixedClock[]"},n.equals=function(t){return t instanceof e&&(this._instant.equals(t._instant)&&this._zoneId.equals(t._zoneId))},n.withZone=function(t){return t.equals(this._zoneId)?this:new e(this._instant,t)},e}(le),pe=function(t){function e(e,n){var i;return(i=t.call(this)||this)._baseClock=e,i._offset=n,i}h(e,t);var n=e.prototype;return n.zone=function(){return this._baseClock.zone()},n.withZone=function(t){return t.equals(this._baseClock.zone())?this:new e(this._baseClock.withZone(t),this._offset)},n.millis=function(){return this._baseClock.millis()+this._offset.toMillis()},n.instant=function(){return this._baseClock.instant().plus(this._offset)},n.equals=function(t){return t instanceof e&&(this._baseClock.equals(t._baseClock)&&this._offset.equals(t._offset))},n.toString=function(){return"OffsetClock["+this._baseClock+","+this._offset+"]"},e}(le),Oe=function(){function t(t,e,n){if(_(t,"transition"),_(e,"offsetBefore"),_(n,"offsetAfter"),e.equals(n))throw new o("Offsets must not be equal");if(0!==t.nano())throw new o("Nano-of-second must be zero");this._transition=t instanceof ue?t:ue.ofEpochSecond(t,0,e),this._offsetBefore=e,this._offsetAfter=n}t.of=function(e,n,i){return new t(e,n,i)};var e=t.prototype;return e.instant=function(){return this._transition.toInstant(this._offsetBefore)},e.toEpochSecond=function(){return this._transition.toEpochSecond(this._offsetBefore)},e.dateTimeBefore=function(){return this._transition},e.dateTimeAfter=function(){return this._transition.plusSeconds(this.durationSeconds())},e.offsetBefore=function(){return this._offsetBefore},e.offsetAfter=function(){return this._offsetAfter},e.duration=function(){return T.ofSeconds(this.durationSeconds())},e.durationSeconds=function(){return this._offsetAfter.totalSeconds()-this._offsetBefore.totalSeconds()},e.isGap=function(){return this._offsetAfter.totalSeconds()>this._offsetBefore.totalSeconds()},e.isOverlap=function(){return this._offsetAfter.totalSeconds()<this._offsetBefore.totalSeconds()},e.isValidOffset=function(t){return!this.isGap()&&(this._offsetBefore.equals(t)||this._offsetAfter.equals(t))},e.validOffsets=function(){return this.isGap()?[]:[this._offsetBefore,this._offsetAfter]},e.compareTo=function(t){return this.instant().compareTo(t.instant())},e.equals=function(e){if(e===this)return!0;if(e instanceof t){var n=e;return this._transition.equals(n._transition)&&this._offsetBefore.equals(n.offsetBefore())&&this._offsetAfter.equals(n.offsetAfter())}return!1},e.hashCode=function(){return this._transition.hashCode()^this._offsetBefore.hashCode()^this._offsetAfter.hashCode()>>>16},e.toString=function(){return"Transition["+(this.isGap()?"Gap":"Overlap")+" at "+this._transition.toString()+this._offsetBefore.toString()+" to "+this._offsetAfter+"]"},t}();var Ee=function(t){function e(){return t.apply(this,arguments)||this}h(e,t);var i=e.prototype;return i.isFixedOffset=function(){return!1},i.offsetOfInstant=function(t){var e=new Date(t.toEpochMilli()).getTimezoneOffset();return X.ofTotalMinutes(-1*e)},i.offsetOfEpochMilli=function(t){var e=new Date(t).getTimezoneOffset();return X.ofTotalMinutes(-1*e)},i.offsetOfLocalDateTime=function(t){var e=1e3*t.toEpochSecond(X.UTC),n=new Date(e).getTimezoneOffset(),i=new Date(e+6e4*n).getTimezoneOffset();return X.ofTotalMinutes(-1*i)},i.validOffsets=function(t){return[this.offsetOfLocalDateTime(t)]},i.transition=function(){return null},i.standardOffset=function(t){return this.offsetOfInstant(t)},i.daylightSavings=function(){this._throwNotSupported()},i.isDaylightSavings=function(){this._throwNotSupported()},i.isValidOffset=function(t,e){return this.offsetOfLocalDateTime(t).equals(e)},i.nextTransition=function(){this._throwNotSupported()},i.previousTransition=function(){this._throwNotSupported()},i.transitions=function(){this._throwNotSupported()},i.transitionRules=function(){this._throwNotSupported()},i._throwNotSupported=function(){throw new n("not supported operation")},i.equals=function(t){return this===t||t instanceof e},i.toString=function(){return"SYSTEM"},e}(z),Se=function(t){function e(){var e;return(e=t.call(this)||this)._rules=new Ee,e}h(e,t);var n=e.prototype;return n.rules=function(){return this._rules},n.equals=function(t){return this===t},n.id=function(){return"SYSTEM"},e}(Z),me=function(){function t(){}return t.systemDefault=function(){return Ne},t.getAvailableZoneIds=function(){return gt.getAvailableZoneIds()},t.of=function(t){if(_(t,"zoneId"),"Z"===t)return X.UTC;if(1===t.length)throw new n("Invalid zone: "+t);if(q.startsWith(t,"+")||q.startsWith(t,"-"))return X.of(t);if("UTC"===t||"GMT"===t||"GMT0"===t||"UT"===t)return new It(t,X.UTC.rules());if(q.startsWith(t,"UTC+")||q.startsWith(t,"GMT+")||q.startsWith(t,"UTC-")||q.startsWith(t,"GMT-")){var e=X.of(t.substring(3));return 0===e.totalSeconds()?new It(t.substring(0,3),e.rules()):new It(t.substring(0,3)+e.id(),e.rules())}if(q.startsWith(t,"UT+")||q.startsWith(t,"UT-")){var i=X.of(t.substring(2));return 0===i.totalSeconds()?new It("UT",i.rules()):new It("UT"+i.id(),i.rules())}return"SYSTEM"===t?Z.systemDefault():It.ofId(t)},t.ofOffset=function(t,e){if(_(t,"prefix"),_(e,"offset"),0===t.length)return e;if("GMT"===t||"UTC"===t||"UT"===t)return 0===e.totalSeconds()?new It(t,e.rules()):new It(t+e.id(),e.rules());throw new o("Invalid prefix, must be GMT, UTC or UT: "+t)},t.from=function(t){_(t,"temporal");var e=t.query(g.zone());if(null==e)throw new n("Unable to obtain ZoneId from TemporalAccessor: "+t+", type "+(null!=t.constructor?t.constructor.name:""));return e},t}(),Ne=null;var De=!1;De||(De=!0,v.MIN_VALUE=-999999,v.MAX_VALUE=999999,T.ZERO=new T(0,0),w.NANOS=new w("Nanos",T.ofNanos(1)),w.MICROS=new w("Micros",T.ofNanos(1e3)),w.MILLIS=new w("Millis",T.ofNanos(1e6)),w.SECONDS=new w("Seconds",T.ofSeconds(1)),w.MINUTES=new w("Minutes",T.ofSeconds(60)),w.HOURS=new w("Hours",T.ofSeconds(3600)),w.HALF_DAYS=new w("HalfDays",T.ofSeconds(43200)),w.DAYS=new w("Days",T.ofSeconds(86400)),w.WEEKS=new w("Weeks",T.ofSeconds(604800)),w.MONTHS=new w("Months",T.ofSeconds(2629746)),w.YEARS=new w("Years",T.ofSeconds(31556952)),w.DECADES=new w("Decades",T.ofSeconds(315569520)),w.CENTURIES=new w("Centuries",T.ofSeconds(3155695200)),w.MILLENNIA=new w("Millennia",T.ofSeconds(31556952e3)),w.ERAS=new w("Eras",T.ofSeconds(31556952*(v.MAX_VALUE+1))),w.FOREVER=new w("Forever",T.ofSeconds(m.MAX_SAFE_INTEGER,999999999)),R.NANO_OF_SECOND=new R("NanoOfSecond",w.NANOS,w.SECONDS,M.of(0,999999999)),R.NANO_OF_DAY=new R("NanoOfDay",w.NANOS,w.DAYS,M.of(0,86399999999999)),R.MICRO_OF_SECOND=new R("MicroOfSecond",w.MICROS,w.SECONDS,M.of(0,999999)),R.MICRO_OF_DAY=new R("MicroOfDay",w.MICROS,w.DAYS,M.of(0,86399999999)),R.MILLI_OF_SECOND=new R("MilliOfSecond",w.MILLIS,w.SECONDS,M.of(0,999)),R.MILLI_OF_DAY=new R("MilliOfDay",w.MILLIS,w.DAYS,M.of(0,86399999)),R.SECOND_OF_MINUTE=new R("SecondOfMinute",w.SECONDS,w.MINUTES,M.of(0,59)),R.SECOND_OF_DAY=new R("SecondOfDay",w.SECONDS,w.DAYS,M.of(0,86399)),R.MINUTE_OF_HOUR=new R("MinuteOfHour",w.MINUTES,w.HOURS,M.of(0,59)),R.MINUTE_OF_DAY=new R("MinuteOfDay",w.MINUTES,w.DAYS,M.of(0,1439)),R.HOUR_OF_AMPM=new R("HourOfAmPm",w.HOURS,w.HALF_DAYS,M.of(0,11)),R.CLOCK_HOUR_OF_AMPM=new R("ClockHourOfAmPm",w.HOURS,w.HALF_DAYS,M.of(1,12)),R.HOUR_OF_DAY=new R("HourOfDay",w.HOURS,w.DAYS,M.of(0,23)),R.CLOCK_HOUR_OF_DAY=new R("ClockHourOfDay",w.HOURS,w.DAYS,M.of(1,24)),R.AMPM_OF_DAY=new R("AmPmOfDay",w.HALF_DAYS,w.DAYS,M.of(0,1)),R.DAY_OF_WEEK=new R("DayOfWeek",w.DAYS,w.WEEKS,M.of(1,7)),R.ALIGNED_DAY_OF_WEEK_IN_MONTH=new R("AlignedDayOfWeekInMonth",w.DAYS,w.WEEKS,M.of(1,7)),R.ALIGNED_DAY_OF_WEEK_IN_YEAR=new R("AlignedDayOfWeekInYear",w.DAYS,w.WEEKS,M.of(1,7)),R.DAY_OF_MONTH=new R("DayOfMonth",w.DAYS,w.MONTHS,M.of(1,28,31),"day"),R.DAY_OF_YEAR=new R("DayOfYear",w.DAYS,w.YEARS,M.of(1,365,366)),R.EPOCH_DAY=new R("EpochDay",w.DAYS,w.FOREVER,M.of(Math.floor(365.25*v.MIN_VALUE),Math.floor(365.25*v.MAX_VALUE))),R.ALIGNED_WEEK_OF_MONTH=new R("AlignedWeekOfMonth",w.WEEKS,w.MONTHS,M.of(1,4,5)),R.ALIGNED_WEEK_OF_YEAR=new R("AlignedWeekOfYear",w.WEEKS,w.YEARS,M.of(1,53)),R.MONTH_OF_YEAR=new R("MonthOfYear",w.MONTHS,w.YEARS,M.of(1,12),"month"),R.PROLEPTIC_MONTH=new R("ProlepticMonth",w.MONTHS,w.FOREVER,M.of(12*v.MIN_VALUE,12*v.MAX_VALUE+11)),R.YEAR_OF_ERA=new R("YearOfEra",w.YEARS,w.FOREVER,M.of(1,v.MAX_VALUE,v.MAX_VALUE+1)),R.YEAR=new R("Year",w.YEARS,w.FOREVER,M.of(v.MIN_VALUE,v.MAX_VALUE),"year"),R.ERA=new R("Era",w.ERAS,w.FOREVER,M.of(0,1)),R.INSTANT_SECONDS=new R("InstantSeconds",w.SECONDS,w.FOREVER,M.of(S,E)),R.OFFSET_SECONDS=new R("OffsetSeconds",w.SECONDS,w.FOREVER,M.of(-64800,64800)),function(){he.HOURS=[];for(var t=0;t<24;t++)he.of(t,0,0,0);he.MIN=he.HOURS[0],he.MAX=new he(23,59,59,999999999),he.MIDNIGHT=he.HOURS[0],he.NOON=he.HOURS[12],he.FROM=Y("LocalTime.FROM",(function(t){return he.from(t)}))}(),ht=new rt,ft=new st,ct=new ot,lt=new at,_t=new ut("WeekBasedYears",T.ofSeconds(31556952)),dt=new ut("QuarterYears",T.ofSeconds(7889238)),et.DAY_OF_QUARTER=ht,et.QUARTER_OF_YEAR=ft,et.WEEK_OF_WEEK_BASED_YEAR=ct,et.WEEK_BASED_YEAR=lt,et.WEEK_BASED_YEARS=_t,et.QUARTER_YEARS=dt,oe.prototype.isoWeekOfWeekyear=function(){return this.get(et.WEEK_OF_WEEK_BASED_YEAR)},oe.prototype.isoWeekyear=function(){return this.get(et.WEEK_BASED_YEAR)},g.ZONE_ID=Y("ZONE_ID",(function(t){return t.query(g.ZONE_ID)})),g.CHRONO=Y("CHRONO",(function(t){return t.query(g.CHRONO)})),g.PRECISION=Y("PRECISION",(function(t){return t.query(g.PRECISION)})),g.OFFSET=Y("OFFSET",(function(t){return t.isSupported(R.OFFSET_SECONDS)?X.ofTotalSeconds(t.get(R.OFFSET_SECONDS)):null})),g.ZONE=Y("ZONE",(function(t){var e=t.query(g.ZONE_ID);return null!=e?e:t.query(g.OFFSET)})),g.LOCAL_DATE=Y("LOCAL_DATE",(function(t){return t.isSupported(R.EPOCH_DAY)?oe.ofEpochDay(t.getLong(R.EPOCH_DAY)):null})),g.LOCAL_TIME=Y("LOCAL_TIME",(function(t){return t.isSupported(R.NANO_OF_DAY)?he.ofNanoOfDay(t.getLong(R.NANO_OF_DAY)):null})),L.MONDAY=new L(0,"MONDAY"),L.TUESDAY=new L(1,"TUESDAY"),L.WEDNESDAY=new L(2,"WEDNESDAY"),L.THURSDAY=new L(3,"THURSDAY"),L.FRIDAY=new L(4,"FRIDAY"),L.SATURDAY=new L(5,"SATURDAY"),L.SUNDAY=new L(6,"SUNDAY"),L.FROM=Y("DayOfWeek.FROM",(function(t){return L.from(t)})),C=[L.MONDAY,L.TUESDAY,L.WEDNESDAY,L.THURSDAY,L.FRIDAY,L.SATURDAY,L.SUNDAY],ce.MIN_SECONDS=-31619119219200,ce.MAX_SECONDS=31494816403199,ce.EPOCH=new ce(0,0),ce.MIN=ce.ofEpochSecond(ce.MIN_SECONDS,0),ce.MAX=ce.ofEpochSecond(ce.MAX_SECONDS,999999999),ce.FROM=Y("Instant.FROM",(function(t){return ce.from(t)})),oe.MIN=oe.of(v.MIN_VALUE,1,1),oe.MAX=oe.of(v.MAX_VALUE,12,31),oe.EPOCH_0=oe.ofEpochDay(0),oe.FROM=Y("LocalDate.FROM",(function(t){return oe.from(t)})),ue.MIN=ue.of(oe.MIN,he.MIN),ue.MAX=ue.of(oe.MAX,he.MAX),ue.FROM=Y("LocalDateTime.FROM",(function(t){return ue.from(t)})),Kt.MIN_VALUE=v.MIN_VALUE,Kt.MAX_VALUE=v.MAX_VALUE,zt=(new Ut).appendValue(R.YEAR,4,10,Ot.EXCEEDS_PAD).toFormatter(),Kt.FROM=Y("Year.FROM",(function(t){return Kt.from(t)})),U.JANUARY=new U(1,"JANUARY"),U.FEBRUARY=new U(2,"FEBRUARY"),U.MARCH=new U(3,"MARCH"),U.APRIL=new U(4,"APRIL"),U.MAY=new U(5,"MAY"),U.JUNE=new U(6,"JUNE"),U.JULY=new U(7,"JULY"),U.AUGUST=new U(8,"AUGUST"),U.SEPTEMBER=new U(9,"SEPTEMBER"),U.OCTOBER=new U(10,"OCTOBER"),U.NOVEMBER=new U(11,"NOVEMBER"),U.DECEMBER=new U(12,"DECEMBER"),P=[U.JANUARY,U.FEBRUARY,U.MARCH,U.APRIL,U.MAY,U.JUNE,U.JULY,U.AUGUST,U.SEPTEMBER,U.OCTOBER,U.NOVEMBER,U.DECEMBER],qt=(new Ut).appendValue(R.YEAR,4,10,Ot.EXCEEDS_PAD).appendLiteral("-").appendValue(R.MONTH_OF_YEAR,2).toFormatter(),Zt.FROM=Y("YearMonth.FROM",(function(t){return Zt.from(t)})),kt=(new Ut).appendLiteral("--").appendValue(R.MONTH_OF_YEAR,2).appendLiteral("-").appendValue(R.DAY_OF_MONTH,2).toFormatter(),Bt.FROM=Y("MonthDay.FROM",(function(t){return Bt.from(t)})),b.ofDays(0),X.MAX_SECONDS=18*he.SECONDS_PER_HOUR,X.UTC=X.ofTotalSeconds(0),X.MIN=X.ofTotalSeconds(-X.MAX_SECONDS),X.MAX=X.ofTotalSeconds(X.MAX_SECONDS),ne.FROM=Y("ZonedDateTime.FROM",(function(t){return ne.from(t)})),Ne=new Se,Z.systemDefault=me.systemDefault,Z.getAvailableZoneIds=me.getAvailableZoneIds,Z.of=me.of,Z.ofOffset=me.ofOffset,Z.from=me.from,X.from=me.from,Z.SYSTEM=Ne,Z.UTC=X.ofTotalSeconds(0),$t.INSTANCE=new $t("IsoChronology"),xt.ISO_LOCAL_DATE=(new Ut).appendValue(R.YEAR,4,10,Ot.EXCEEDS_PAD).appendLiteral("-").appendValue(R.MONTH_OF_YEAR,2).appendLiteral("-").appendValue(R.DAY_OF_MONTH,2).toFormatter(x.STRICT).withChronology($t.INSTANCE),xt.ISO_LOCAL_TIME=(new Ut).appendValue(R.HOUR_OF_DAY,2).appendLiteral(":").appendValue(R.MINUTE_OF_HOUR,2).optionalStart().appendLiteral(":").appendValue(R.SECOND_OF_MINUTE,2).optionalStart().appendFraction(R.NANO_OF_SECOND,0,9,!0).toFormatter(x.STRICT),xt.ISO_LOCAL_DATE_TIME=(new Ut).parseCaseInsensitive().append(xt.ISO_LOCAL_DATE).appendLiteral("T").append(xt.ISO_LOCAL_TIME).toFormatter(x.STRICT).withChronology($t.INSTANCE),xt.ISO_INSTANT=(new Ut).parseCaseInsensitive().appendInstant().toFormatter(x.STRICT),xt.ISO_OFFSET_DATE_TIME=(new Ut).parseCaseInsensitive().append(xt.ISO_LOCAL_DATE_TIME).appendOffsetId().toFormatter(x.STRICT).withChronology($t.INSTANCE),xt.ISO_ZONED_DATE_TIME=(new Ut).append(xt.ISO_OFFSET_DATE_TIME).optionalStart().appendLiteral("[").parseCaseSensitive().appendZoneId().appendLiteral("]").toFormatter(x.STRICT).withChronology($t.INSTANCE),xt.BASIC_ISO_DATE=(new Ut).appendValue(R.YEAR,4,10,Ot.EXCEEDS_PAD).appendValue(R.MONTH_OF_YEAR,2).appendValue(R.DAY_OF_MONTH,2).toFormatter(x.STRICT).withChronology($t.INSTANCE),xt.ISO_OFFSET_DATE=(new Ut).parseCaseInsensitive().append(xt.ISO_LOCAL_DATE).appendOffsetId().toFormatter(x.STRICT).withChronology($t.INSTANCE),xt.ISO_OFFSET_TIME=(new Ut).parseCaseInsensitive().append(xt.ISO_LOCAL_TIME).appendOffsetId().toFormatter(x.STRICT).withChronology($t.INSTANCE),xt.ISO_ORDINAL_DATE=(new Ut).appendValue(R.YEAR,4,10,Ot.EXCEEDS_PAD).appendLiteral("-").appendValue(R.DAY_OF_YEAR).toFormatter(x.STRICT),xt.ISO_WEEK_DATE=(new Ut).appendValue(R.YEAR,4,10,Ot.EXCEEDS_PAD).appendLiteral("-W").appendValue(R.ALIGNED_WEEK_OF_YEAR).appendLiteral("-").appendValue(R.DAY_OF_WEEK).toFormatter(x.STRICT),xt.ISO_DATE=(new Ut).parseCaseInsensitive().append(xt.ISO_LOCAL_DATE).optionalStart().appendOffsetId().optionalEnd().toFormatter(x.STRICT).withChronology($t.INSTANCE),xt.ISO_TIME=(new Ut).parseCaseInsensitive().append(xt.ISO_LOCAL_TIME).optionalStart().appendOffsetId().optionalEnd().toFormatter(x.STRICT),xt.ISO_DATE_TIME=(new Ut).append(xt.ISO_LOCAL_DATE_TIME).optionalStart().appendOffsetId().optionalEnd().toFormatter(x.STRICT).withChronology($t.INSTANCE),xt.PARSED_EXCESS_DAYS=Y("PARSED_EXCESS_DAYS",(function(t){return t instanceof J?t.excessDays:b.ZERO})),xt.PARSED_LEAP_SECOND=Y("PARSED_LEAP_SECOND",(function(t){return t instanceof J&&t.leapSecond})),Tt.BASE_DATE=oe.of(2e3,1,1),Ut.CompositePrinterParser=mt,Ut.PadPrinterParserDecorator=yt,Ut.SettingsParser=Mt,Ut.CharLiteralPrinterParser=Rt,Ut.StringLiteralPrinterParser=Rt,Ut.CharLiteralPrinterParser=St,Ut.NumberPrinterParser=At,Ut.ReducedPrinterParser=Tt,Ut.FractionPrinterParser=Nt,Ut.OffsetIdPrinterParser=wt,Ut.ZoneIdPrinterParser=Ft,ie.MIN=ue.MIN.atOffset(X.MAX),ie.MAX=ue.MAX.atOffset(X.MIN),ie.FROM=Y("OffsetDateTime.FROM",(function(t){return ie.from(t)})),te.MIN=te.ofNumbers(0,0,0,0,X.MAX),te.MAX=te.ofNumbers(23,59,59,999999999,X.MIN),te.FROM=Y("OffsetTime.FROM",(function(t){return te.from(t)})));var Ae=function(){function t(t,e){var n;if(t instanceof ce)this.instant=t;else{if(t instanceof oe)e=null==e?Z.systemDefault():e,n=t.atStartOfDay(e);else if(t instanceof ue)e=null==e?Z.systemDefault():e,n=t.atZone(e);else{if(!(t instanceof ne))throw new o("unsupported instance for convert operation:"+t);n=null==e?t:t.withZoneSameInstant(e)}this.instant=n.toInstant()}}var e=t.prototype;return e.toDate=function(){return new Date(this.instant.toEpochMilli())},e.toEpochMilli=function(){return this.instant.toEpochMilli()},t}();function Te(t,e){return new Ae(t,e)}var ve=function(t){function e(e,n){var i;return void 0===n&&(n=Z.systemDefault()),(i=t.call(this)||this)._zone=n,e instanceof Date?(i._epochMilli=e.getTime(),c(i)):"function"==typeof e.toDate&&e.toDate()instanceof Date?(i._epochMilli=e.toDate().getTime(),c(i)):(l(!1,"date must be either a javascript date or a moment"),i)}h(e,t);var n=e.prototype;return n.query=function(e){return _(e,"query"),e===g.localDate()?oe.ofInstant(ce.ofEpochMilli(this._epochMilli),this._zone):e===g.localTime()?he.ofInstant(ce.ofEpochMilli(this._epochMilli),this._zone):e===g.zone()?this._zone:t.prototype.query.call(this,e)},n.get=function(t){return this.getLong(t)},n.getLong=function(t){if(_(t,"field"),t instanceof R){switch(t){case R.NANO_OF_SECOND:return 1e6*m.floorMod(this._epochMilli,1e3);case R.INSTANT_SECONDS:return m.floorDiv(this._epochMilli,1e3)}throw new r("Unsupported field: "+t)}return t.getFrom(this)},n.isSupported=function(t){return t===R.INSTANT_SECONDS||t===R.NANO_OF_SECOND},e}(I);function we(t,e){return new ve(t,e)}var ye,Me,Re={assert:O,DateTimeBuilder:J,DateTimeParseContext:Q,DateTimePrintContext:tt,MathUtil:m,StringUtil:q,StringBuilder:Wt},ge={_:Re,convert:Te,nativeJs:we,ArithmeticException:s,DateTimeException:n,DateTimeParseException:i,IllegalArgumentException:o,IllegalStateException:a,UnsupportedTemporalTypeException:r,NullPointerException:u,Clock:le,DayOfWeek:L,Duration:T,Instant:ce,LocalDate:oe,LocalTime:he,LocalDateTime:ue,OffsetTime:te,OffsetDateTime:ie,Month:U,MonthDay:Bt,Period:b,Year:Kt,YearConstants:v,YearMonth:Zt,ZonedDateTime:ne,ZoneOffset:X,ZoneId:Z,ZoneRegion:It,ZoneOffsetTransition:Oe,ZoneRules:z,ZoneRulesProvider:gt,ChronoLocalDate:B,ChronoLocalDateTime:ae,ChronoZonedDateTime:ee,IsoChronology:$t,ChronoField:R,ChronoUnit:w,IsoFields:et,Temporal:k,TemporalAccessor:I,TemporalAdjuster:jt,TemporalAdjusters:Gt,TemporalAmount:D,TemporalField:y,TemporalQueries:g,TemporalQuery:F,TemporalUnit:A,ValueRange:M,DateTimeFormatter:xt,DateTimeFormatterBuilder:Ut,DecimalStyle:pt,ResolverStyle:x,SignStyle:Ot,TextStyle:Et},Ie=(ye=ge,Me=[],function(t){return~Me.indexOf(t)||(t(ye),Me.push(t)),ye});return ge.use=Ie,t.ArithmeticException=s,t.ChronoField=R,t.ChronoLocalDate=B,t.ChronoLocalDateTime=ae,t.ChronoUnit=w,t.ChronoZonedDateTime=ee,t.Clock=le,t.DateTimeException=n,t.DateTimeFormatter=xt,t.DateTimeFormatterBuilder=Ut,t.DateTimeParseException=i,t.DayOfWeek=L,t.DecimalStyle=pt,t.Duration=T,t.IllegalArgumentException=o,t.IllegalStateException=a,t.Instant=ce,t.IsoChronology=$t,t.IsoFields=et,t.LocalDate=oe,t.LocalDateTime=ue,t.LocalTime=he,t.Month=U,t.MonthDay=Bt,t.NullPointerException=u,t.OffsetDateTime=ie,t.OffsetTime=te,t.Period=b,t.ResolverStyle=x,t.SignStyle=Ot,t.Temporal=k,t.TemporalAccessor=I,t.TemporalAdjuster=jt,t.TemporalAdjusters=Gt,t.TemporalAmount=D,t.TemporalField=y,t.TemporalQueries=g,t.TemporalQuery=F,t.TemporalUnit=A,t.TextStyle=Et,t.UnsupportedTemporalTypeException=r,t.ValueRange=M,t.Year=Kt,t.YearConstants=v,t.YearMonth=Zt,t.ZoneId=Z,t.ZoneOffset=X,t.ZoneOffsetTransition=Oe,t.ZoneRegion=It,t.ZoneRules=z,t.ZoneRulesProvider=gt,t.ZonedDateTime=ne,t._=Re,t.convert=Te,t.nativeJs=we,t.use=Ie,Object.defineProperty(t,"__esModule",{value:!0}),t}({});
Copyright (c), Mapbox

All rights reserved.

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.
    * Neither the name of node-pre-gyp nor the names of its contributors
      may 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 OWNER 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.
# Contributing


### Releasing a new version:

- Ensure tests are passing on travis and appveyor
- Run `node scripts/abi_crosswalk.js` and commit any changes
- Update the changelog
- Tag a new release like: `git tag -a v0.6.34 -m "tagging v0.6.34" && git push --tags`
- Run `npm publish`
{
  "name": "@mapbox/node-pre-gyp",
  "description": "Node.js native addon binary install tool",
  "version": "1.0.10",
  "license": "BSD-3-Clause",
  "author": "Dane Springmeyer <dane@mapbox.com>",
  "repository": {
    "type": "git",
    "url": "git://github.com/mapbox/node-pre-gyp.git"
  },
  "bin": "./bin/node-pre-gyp",
  "main": "./lib/node-pre-gyp.js",
  "dependencies": {
    "detect-libc": "^2.0.0",
    "https-proxy-agent": "^5.0.0",
    "make-dir": "^3.1.0",
    "node-fetch": "^2.6.7",
    "nopt": "^5.0.0",
    "npmlog": "^5.0.1",
    "rimraf": "^3.0.2",
    "semver": "^7.3.5",
    "tar": "^6.1.11"
  },
  "devDependencies": {
    "@mapbox/cloudfriend": "^5.1.0",
    "@mapbox/eslint-config-mapbox": "^3.0.0",
    "aws-sdk": "^2.1087.0",
    "codecov": "^3.8.3",
    "eslint": "^7.32.0",
    "eslint-plugin-node": "^11.1.0",
    "mock-aws-s3": "^4.0.2",
    "nock": "^12.0.3",
    "node-addon-api": "^4.3.0",
    "nyc": "^15.1.0",
    "tape": "^5.5.2",
    "tar-fs": "^2.1.1"
  }
}'use strict';

module.exports = exports = build;

exports.usage = 'Attempts to compile the module by dispatching to node-gyp or nw-gyp';

const napi = require('./util/napi.js');
const compile = require('./util/compile.js');
const handle_gyp_opts = require('./util/handle_gyp_opts.js');
const configure = require('./configure.js');

function do_build(gyp, argv, callback) {
  handle_gyp_opts(gyp, argv, (err, result) => {
    let final_args = ['build'].concat(result.gyp).concat(result.pre);
    if (result.unparsed.length > 0) {
      final_args = final_args.
        concat(['--']).
        concat(result.unparsed);
    }
    if (!err && result.opts.napi_build_version) {
      napi.swap_build_dir_in(result.opts.napi_build_version);
    }
    compile.run_gyp(final_args, result.opts, (err2) => {
      if (result.opts.napi_build_version) {
        napi.swap_build_dir_out(result.opts.napi_build_version);
      }
      return callback(err2);
    });
  });
}

function build(gyp, argv, callback) {

  // Form up commands to pass to node-gyp:
  // We map `node-pre-gyp build` to `node-gyp configure build` so that we do not
  // trigger a clean and therefore do not pay the penalty of a full recompile
  if (argv.length && (argv.indexOf('rebuild') > -1)) {
    argv.shift(); // remove `rebuild`
    // here we map `node-pre-gyp rebuild` to `node-gyp rebuild` which internally means
    // "clean + configure + build" and triggers a full recompile
    compile.run_gyp(['clean'], {}, (err3) => {
      if (err3) return callback(err3);
      configure(gyp, argv, (err4) => {
        if (err4) return callback(err4);
        return do_build(gyp, argv, callback);
      });
    });
  } else {
    return do_build(gyp, argv, callback);
  }
}
'use strict';

module.exports = exports = clean;

exports.usage = 'Removes the entire folder containing the compiled .node module';

const rm = require('rimraf');
const exists = require('fs').exists || require('path').exists;
const versioning = require('./util/versioning.js');
const napi = require('./util/napi.js');
const path = require('path');

function clean(gyp, argv, callback) {
  const package_json = gyp.package_json;
  const napi_build_version = napi.get_napi_build_version_from_command_args(argv);
  const opts = versioning.evaluate(package_json, gyp.opts, napi_build_version);
  const to_delete = opts.module_path;
  if (!to_delete) {
    return callback(new Error('module_path is empty, refusing to delete'));
  } else if (path.normalize(to_delete) === path.normalize(process.cwd())) {
    return callback(new Error('module_path is not set, refusing to delete'));
  } else {
    exists(to_delete, (found) => {
      if (found) {
        if (!gyp.opts.silent_clean) console.log('[' + package_json.name + '] Removing "%s"', to_delete);
        return rm(to_delete, callback);
      }
      return callback();
    });
  }
}
'use strict';

module.exports = exports = configure;

exports.usage = 'Attempts to configure node-gyp or nw-gyp build';

const napi = require('./util/napi.js');
const compile = require('./util/compile.js');
const handle_gyp_opts = require('./util/handle_gyp_opts.js');

function configure(gyp, argv, callback) {
  handle_gyp_opts(gyp, argv, (err, result) => {
    let final_args = result.gyp.concat(result.pre);
    // pull select node-gyp configure options out of the npm environ
    const known_gyp_args = ['dist-url', 'python', 'nodedir', 'msvs_version'];
    known_gyp_args.forEach((key) => {
      const val = gyp.opts[key] || gyp.opts[key.replace('-', '_')];
      if (val) {
        final_args.push('--' + key + '=' + val);
      }
    });
    // --ensure=false tell node-gyp to re-install node development headers
    // but it is only respected by node-gyp install, so we have to call install
    // as a separate step if the user passes it
    if (gyp.opts.ensure === false) {
      const install_args = final_args.concat(['install', '--ensure=false']);
      compile.run_gyp(install_args, result.opts, (err2) => {
        if (err2) return callback(err2);
        if (result.unparsed.length > 0) {
          final_args = final_args.
            concat(['--']).
            concat(result.unparsed);
        }
        compile.run_gyp(['configure'].concat(final_args), result.opts, (err3) => {
          return callback(err3);
        });
      });
    } else {
      if (result.unparsed.length > 0) {
        final_args = final_args.
          concat(['--']).
          concat(result.unparsed);
      }
      compile.run_gyp(['configure'].concat(final_args), result.opts, (err4) => {
        if (!err4 && result.opts.napi_build_version) {
          napi.swap_build_dir_out(result.opts.napi_build_version);
        }
        return callback(err4);
      });
    }
  });
}
'use strict';

module.exports = exports = info;

exports.usage = 'Lists all published binaries (requires aws-sdk)';

const log = require('npmlog');
const versioning = require('./util/versioning.js');
const s3_setup = require('./util/s3_setup.js');

function info(gyp, argv, callback) {
  const package_json = gyp.package_json;
  const opts = versioning.evaluate(package_json, gyp.opts);
  const config = {};
  s3_setup.detect(opts, config);
  const s3 = s3_setup.get_s3(config);
  const s3_opts = {
    Bucket: config.bucket,
    Prefix: config.prefix
  };
  s3.listObjects(s3_opts, (err, meta) => {
    if (err && err.code === 'NotFound') {
      return callback(new Error('[' + package_json.name + '] Not found: https://' + s3_opts.Bucket + '.s3.amazonaws.com/' + config.prefix));
    } else if (err) {
      return callback(err);
    } else {
      log.verbose(JSON.stringify(meta, null, 1));
      if (meta && meta.Contents) {
        meta.Contents.forEach((obj) => {
          console.log(obj.Key);
        });
      } else {
        console.error('[' + package_json.name + '] No objects found at https://' + s3_opts.Bucket + '.s3.amazonaws.com/' + config.prefix);
      }
      return callback();
    }
  });
}
'use strict';

module.exports = exports = install;

exports.usage = 'Attempts to install pre-built binary for module';

const fs = require('fs');
const path = require('path');
const log = require('npmlog');
const existsAsync = fs.exists || path.exists;
const versioning = require('./util/versioning.js');
const napi = require('./util/napi.js');
const makeDir = require('make-dir');
// for fetching binaries
const fetch = require('node-fetch');
const tar = require('tar');

let npgVersion = 'unknown';
try {
  // Read own package.json to get the current node-pre-pyp version.
  const ownPackageJSON = fs.readFileSync(path.join(__dirname, '..', 'package.json'), 'utf8');
  npgVersion = JSON.parse(ownPackageJSON).version;
} catch (e) {
  // do nothing
}

function place_binary(uri, targetDir, opts, callback) {
  log.http('GET', uri);

  // Try getting version info from the currently running npm.
  const envVersionInfo = process.env.npm_config_user_agent ||
        'node ' + process.version;

  const sanitized = uri.replace('+', '%2B');
  const requestOpts = {
    uri: sanitized,
    headers: {
      'User-Agent': 'node-pre-gyp (v' + npgVersion + ', ' + envVersionInfo + ')'
    },
    follow_max: 10
  };

  if (opts.cafile) {
    try {
      requestOpts.ca = fs.readFileSync(opts.cafile);
    } catch (e) {
      return callback(e);
    }
  } else if (opts.ca) {
    requestOpts.ca = opts.ca;
  }

  const proxyUrl = opts.proxy ||
                    process.env.http_proxy ||
                    process.env.HTTP_PROXY ||
                    process.env.npm_config_proxy;
  let agent;
  if (proxyUrl) {
    const ProxyAgent = require('https-proxy-agent');
    agent = new ProxyAgent(proxyUrl);
    log.http('download', 'proxy agent configured using: "%s"', proxyUrl);
  }

  fetch(sanitized, { agent })
    .then((res) => {
      if (!res.ok) {
        throw new Error(`response status ${res.status} ${res.statusText} on ${sanitized}`);
      }
      const dataStream = res.body;

      return new Promise((resolve, reject) => {
        let extractions = 0;
        const countExtractions = (entry) => {
          extractions += 1;
          log.info('install', 'unpacking %s', entry.path);
        };

        dataStream.pipe(extract(targetDir, countExtractions))
          .on('error', (e) => {
            reject(e);
          });
        dataStream.on('end', () => {
          resolve(`extracted file count: ${extractions}`);
        });
        dataStream.on('error', (e) => {
          reject(e);
        });
      });
    })
    .then((text) => {
      log.info(text);
      callback();
    })
    .catch((e) => {
      log.error(`install ${e.message}`);
      callback(e);
    });
}

function extract(to, onentry) {
  return tar.extract({
    cwd: to,
    strip: 1,
    onentry
  });
}

function extract_from_local(from, targetDir, callback) {
  if (!fs.existsSync(from)) {
    return callback(new Error('Cannot find file ' + from));
  }
  log.info('Found local file to extract from ' + from);

  // extract helpers
  let extractCount = 0;
  function countExtractions(entry) {
    extractCount += 1;
    log.info('install', 'unpacking ' + entry.path);
  }
  function afterExtract(err) {
    if (err) return callback(err);
    if (extractCount === 0) {
      return callback(new Error('There was a fatal problem while extracting the tarball'));
    }
    log.info('tarball', 'done parsing tarball');
    callback();
  }

  fs.createReadStream(from).pipe(extract(targetDir, countExtractions))
    .on('close', afterExtract)
    .on('error', afterExtract);
}

function do_build(gyp, argv, callback) {
  const args = ['rebuild'].concat(argv);
  gyp.todo.push({ name: 'build', args: args });
  process.nextTick(callback);
}

function print_fallback_error(err, opts, package_json) {
  const fallback_message = ' (falling back to source compile with node-gyp)';
  let full_message = '';
  if (err.statusCode !== undefined) {
    // If we got a network response it but failed to download
    // it means remote binaries are not available, so let's try to help
    // the user/developer with the info to debug why
    full_message = 'Pre-built binaries not found for ' + package_json.name + '@' + package_json.version;
    full_message += ' and ' + opts.runtime + '@' + (opts.target || process.versions.node) + ' (' + opts.node_abi + ' ABI, ' + opts.libc + ')';
    full_message += fallback_message;
    log.warn('Tried to download(' + err.statusCode + '): ' + opts.hosted_tarball);
    log.warn(full_message);
    log.http(err.message);
  } else {
    // If we do not have a statusCode that means an unexpected error
    // happened and prevented an http response, so we output the exact error
    full_message = 'Pre-built binaries not installable for ' + package_json.name + '@' + package_json.version;
    full_message += ' and ' + opts.runtime + '@' + (opts.target || process.versions.node) + ' (' + opts.node_abi + ' ABI, ' + opts.libc + ')';
    full_message += fallback_message;
    log.warn(full_message);
    log.warn('Hit error ' + err.message);
  }
}

//
// install
//
function install(gyp, argv, callback) {
  const package_json = gyp.package_json;
  const napi_build_version = napi.get_napi_build_version_from_command_args(argv);
  const source_build = gyp.opts['build-from-source'] || gyp.opts.build_from_source;
  const update_binary = gyp.opts['update-binary'] || gyp.opts.update_binary;
  const should_do_source_build = source_build === package_json.name || (source_build === true || source_build === 'true');
  if (should_do_source_build) {
    log.info('build', 'requesting source compile');
    return do_build(gyp, argv, callback);
  } else {
    const fallback_to_build = gyp.opts['fallback-to-build'] || gyp.opts.fallback_to_build;
    let should_do_fallback_build = fallback_to_build === package_json.name || (fallback_to_build === true || fallback_to_build === 'true');
    // but allow override from npm
    if (process.env.npm_config_argv) {
      const cooked = JSON.parse(process.env.npm_config_argv).cooked;
      const match = cooked.indexOf('--fallback-to-build');
      if (match > -1 && cooked.length > match && cooked[match + 1] === 'false') {
        should_do_fallback_build = false;
        log.info('install', 'Build fallback disabled via npm flag: --fallback-to-build=false');
      }
    }
    let opts;
    try {
      opts = versioning.evaluate(package_json, gyp.opts, napi_build_version);
    } catch (err) {
      return callback(err);
    }

    opts.ca = gyp.opts.ca;
    opts.cafile = gyp.opts.cafile;

    const from = opts.hosted_tarball;
    const to = opts.module_path;
    const binary_module = path.join(to, opts.module_name + '.node');
    existsAsync(binary_module, (found) => {
      if (!update_binary) {
        if (found) {
          console.log('[' + package_json.name + '] Success: "' + binary_module + '" already installed');
          console.log('Pass --update-binary to reinstall or --build-from-source to recompile');
          return callback();
        }
        log.info('check', 'checked for "' + binary_module + '" (not found)');
      }

      makeDir(to).then(() => {
        const fileName = from.startsWith('file://') && from.slice('file://'.length);
        if (fileName) {
          extract_from_local(fileName, to, after_place);
        } else {
          place_binary(from, to, opts, after_place);
        }
      }).catch((err) => {
        after_place(err);
      });

      function after_place(err) {
        if (err && should_do_fallback_build) {
          print_fallback_error(err, opts, package_json);
          return do_build(gyp, argv, callback);
        } else if (err) {
          return callback(err);
        } else {
          console.log('[' + package_json.name + '] Success: "' + binary_module + '" is installed via remote');
          return callback();
        }
      }
    });
  }
}
'use strict';

/**
 * Set the title.
 */

process.title = 'node-pre-gyp';

const node_pre_gyp = require('../');
const log = require('npmlog');

/**
 * Process and execute the selected commands.
 */

const prog = new node_pre_gyp.Run({ argv: process.argv });
let completed = false;

if (prog.todo.length === 0) {
  if (~process.argv.indexOf('-v') || ~process.argv.indexOf('--version')) {
    console.log('v%s', prog.version);
    process.exit(0);
  } else if (~process.argv.indexOf('-h') || ~process.argv.indexOf('--help')) {
    console.log('%s', prog.usage());
    process.exit(0);
  }
  console.log('%s', prog.usage());
  process.exit(1);
}

// if --no-color is passed
if (prog.opts && Object.hasOwnProperty.call(prog, 'color') && !prog.opts.color) {
  log.disableColor();
}

log.info('it worked if it ends with', 'ok');
log.verbose('cli', process.argv);
log.info('using', process.title + '@%s', prog.version);
log.info('using', 'node@%s | %s | %s', process.versions.node, process.platform, process.arch);


/**
 * Change dir if -C/--directory was passed.
 */

const dir = prog.opts.directory;
if (dir) {
  const fs = require('fs');
  try {
    const stat = fs.statSync(dir);
    if (stat.isDirectory()) {
      log.info('chdir', dir);
      process.chdir(dir);
    } else {
      log.warn('chdir', dir + ' is not a directory');
    }
  } catch (e) {
    if (e.code === 'ENOENT') {
      log.warn('chdir', dir + ' is not a directory');
    } else {
      log.warn('chdir', 'error during chdir() "%s"', e.message);
    }
  }
}

function run() {
  const command = prog.todo.shift();
  if (!command) {
    // done!
    completed = true;
    log.info('ok');
    return;
  }

  // set binary.host when appropriate. host determines the s3 target bucket.
  const target = prog.setBinaryHostProperty(command.name);
  if (target && ['install', 'publish', 'unpublish', 'info'].indexOf(command.name) >= 0) {
    log.info('using binary.host: ' + prog.package_json.binary.host);
  }

  prog.commands[command.name](command.args, function(err) {
    if (err) {
      log.error(command.name + ' error');
      log.error('stack', err.stack);
      errorMessage();
      log.error('not ok');
      console.log(err.message);
      return process.exit(1);
    }
    const args_array = [].slice.call(arguments, 1);
    if (args_array.length) {
      console.log.apply(console, args_array);
    }
    // now run the next command in the queue
    process.nextTick(run);
  });
}

process.on('exit', (code) => {
  if (!completed && !code) {
    log.error('Completion callback never invoked!');
    errorMessage();
    process.exit(6);
  }
});

process.on('uncaughtException', (err) => {
  log.error('UNCAUGHT EXCEPTION');
  log.error('stack', err.stack);
  errorMessage();
  process.exit(7);
});

function errorMessage() {
  // copied from npm's lib/util/error-handler.js
  const os = require('os');
  log.error('System', os.type() + ' ' + os.release());
  log.error('command', process.argv.map(JSON.stringify).join(' '));
  log.error('cwd', process.cwd());
  log.error('node -v', process.version);
  log.error(process.title + ' -v', 'v' + prog.package.version);
}

// start running the given commands!
run();
'use strict';

/**
 * Module exports.
 */

module.exports = exports;

/**
 * Module dependencies.
 */

// load mocking control function for accessing s3 via https. the function is a noop always returning
// false if not mocking.
exports.mockS3Http = require('./util/s3_setup').get_mockS3Http();
exports.mockS3Http('on');
const mocking = exports.mockS3Http('get');


const fs = require('fs');
const path = require('path');
const nopt = require('nopt');
const log = require('npmlog');
log.disableProgress();
const napi = require('./util/napi.js');

const EE = require('events').EventEmitter;
const inherits = require('util').inherits;
const cli_commands = [
  'clean',
  'install',
  'reinstall',
  'build',
  'rebuild',
  'package',
  'testpackage',
  'publish',
  'unpublish',
  'info',
  'testbinary',
  'reveal',
  'configure'
];
const aliases = {};

// differentiate node-pre-gyp's logs from npm's
log.heading = 'node-pre-gyp';

if (mocking) {
  log.warn(`mocking s3 to ${process.env.node_pre_gyp_mock_s3}`);
}

// this is a getter to avoid circular reference warnings with node v14.
Object.defineProperty(exports, 'find', {
  get: function() {
    return require('./pre-binding').find;
  },
  enumerable: true
});

// in the following, "my_module" is using node-pre-gyp to
// prebuild and install pre-built binaries. "main_module"
// is using "my_module".
//
// "bin/node-pre-gyp" invokes Run() without a path. the
// expectation is that the working directory is the package
// root "my_module". this is true because in all cases npm is
// executing a script in the context of "my_module".
//
// "pre-binding.find()" is executed by "my_module" but in the
// context of "main_module". this is because "main_module" is
// executing and requires "my_module" which is then executing
// "pre-binding.find()" via "node-pre-gyp.find()", so the working
// directory is that of "main_module".
//
// that's why "find()" must pass the path to package.json.
//
function Run({ package_json_path = './package.json', argv }) {
  this.package_json_path = package_json_path;
  this.commands = {};

  const self = this;
  cli_commands.forEach((command) => {
    self.commands[command] = function(argvx, callback) {
      log.verbose('command', command, argvx);
      return require('./' + command)(self, argvx, callback);
    };
  });

  this.parseArgv(argv);

  // this is set to true after the binary.host property was set to
  // either staging_host or production_host.
  this.binaryHostSet = false;
}
inherits(Run, EE);
exports.Run = Run;
const proto = Run.prototype;

/**
 * Export the contents of the package.json.
 */

proto.package = require('../package.json');

/**
 * nopt configuration definitions
 */

proto.configDefs = {
  help: Boolean,     // everywhere
  arch: String,      // 'configure'
  debug: Boolean,    // 'build'
  directory: String, // bin
  proxy: String,     // 'install'
  loglevel: String  // everywhere
};

/**
 * nopt shorthands
 */

proto.shorthands = {
  release: '--no-debug',
  C: '--directory',
  debug: '--debug',
  j: '--jobs',
  silent: '--loglevel=silent',
  silly: '--loglevel=silly',
  verbose: '--loglevel=verbose'
};

/**
 * expose the command aliases for the bin file to use.
 */

proto.aliases = aliases;

/**
 * Parses the given argv array and sets the 'opts', 'argv',
 * 'command', and 'package_json' properties.
 */

proto.parseArgv = function parseOpts(argv) {
  this.opts = nopt(this.configDefs, this.shorthands, argv);
  this.argv = this.opts.argv.remain.slice();
  const commands = this.todo = [];

  // create a copy of the argv array with aliases mapped
  argv = this.argv.map((arg) => {
    // is this an alias?
    if (arg in this.aliases) {
      arg = this.aliases[arg];
    }
    return arg;
  });

  // process the mapped args into "command" objects ("name" and "args" props)
  argv.slice().forEach((arg) => {
    if (arg in this.commands) {
      const args = argv.splice(0, argv.indexOf(arg));
      argv.shift();
      if (commands.length > 0) {
        commands[commands.length - 1].args = args;
      }
      commands.push({ name: arg, args: [] });
    }
  });
  if (commands.length > 0) {
    commands[commands.length - 1].args = argv.splice(0);
  }


  // if a directory was specified package.json is assumed to be relative
  // to it.
  let package_json_path = this.package_json_path;
  if (this.opts.directory) {
    package_json_path = path.join(this.opts.directory, package_json_path);
  }

  this.package_json = JSON.parse(fs.readFileSync(package_json_path));

  // expand commands entries for multiple napi builds
  this.todo = napi.expand_commands(this.package_json, this.opts, commands);

  // support for inheriting config env variables from npm
  const npm_config_prefix = 'npm_config_';
  Object.keys(process.env).forEach((name) => {
    if (name.indexOf(npm_config_prefix) !== 0) return;
    const val = process.env[name];
    if (name === npm_config_prefix + 'loglevel') {
      log.level = val;
    } else {
      // add the user-defined options to the config
      name = name.substring(npm_config_prefix.length);
      // avoid npm argv clobber already present args
      // which avoids problem of 'npm test' calling
      // script that runs unique npm install commands
      if (name === 'argv') {
        if (this.opts.argv &&
             this.opts.argv.remain &&
             this.opts.argv.remain.length) {
          // do nothing
        } else {
          this.opts[name] = val;
        }
      } else {
        this.opts[name] = val;
      }
    }
  });

  if (this.opts.loglevel) {
    log.level = this.opts.loglevel;
  }
  log.resume();
};

/**
 * allow the binary.host property to be set at execution time.
 *
 * for this to take effect requires all the following to be true.
 * - binary is a property in package.json
 * - binary.host is falsey
 * - binary.staging_host is not empty
 * - binary.production_host is not empty
 *
 * if any of the previous checks fail then the function returns an empty string
 * and makes no changes to package.json's binary property.
 *
 *
 * if command is "publish" then the default is set to "binary.staging_host"
 * if command is not "publish" the the default is set to "binary.production_host"
 *
 * if the command-line option '--s3_host' is set to "staging" or "production" then
 * "binary.host" is set to the specified "staging_host" or "production_host". if
 * '--s3_host' is any other value an exception is thrown.
 *
 * if '--s3_host' is not present then "binary.host" is set to the default as above.
 *
 * this strategy was chosen so that any command other than "publish" or "unpublish" uses "production"
 * as the default without requiring any command-line options but that "publish" and "unpublish" require
 * '--s3_host production_host' to be specified in order to *really* publish (or unpublish). publishing
 * to staging can be done freely without worrying about disturbing any production releases.
 */
proto.setBinaryHostProperty = function(command) {
  if (this.binaryHostSet) {
    return this.package_json.binary.host;
  }
  const p = this.package_json;
  // don't set anything if host is present. it must be left blank to trigger this.
  if (!p || !p.binary || p.binary.host) {
    return '';
  }
  // and both staging and production must be present. errors will be reported later.
  if (!p.binary.staging_host || !p.binary.production_host) {
    return '';
  }
  let target = 'production_host';
  if (command === 'publish' || command === 'unpublish') {
    target = 'staging_host';
  }
  // the environment variable has priority over the default or the command line. if
  // either the env var or the command line option are invalid throw an error.
  const npg_s3_host = process.env.node_pre_gyp_s3_host;
  if (npg_s3_host === 'staging' || npg_s3_host === 'production') {
    target = `${npg_s3_host}_host`;
  } else if (this.opts['s3_host'] === 'staging' || this.opts['s3_host'] === 'production') {
    target = `${this.opts['s3_host']}_host`;
  } else if (this.opts['s3_host'] || npg_s3_host) {
    throw new Error(`invalid s3_host ${this.opts['s3_host'] || npg_s3_host}`);
  }

  p.binary.host = p.binary[target];
  this.binaryHostSet = true;

  return p.binary.host;
};

/**
 * Returns the usage instructions for node-pre-gyp.
 */

proto.usage = function usage() {
  const str = [
    '',
    '  Usage: node-pre-gyp <command> [options]',
    '',
    '  where <command> is one of:',
    cli_commands.map((c) => {
      return '    - ' + c + ' - ' + require('./' + c).usage;
    }).join('\n'),
    '',
    'node-pre-gyp@' + this.version + '  ' + path.resolve(__dirname, '..'),
    'node@' + process.versions.node
  ].join('\n');
  return str;
};

/**
 * Version number getter.
 */

Object.defineProperty(proto, 'version', {
  get: function() {
    return this.package.version;
  },
  enumerable: true
});
'use strict';

module.exports = exports = _package;

exports.usage = 'Packs binary (and enclosing directory) into locally staged tarball';

const fs = require('fs');
const path = require('path');
const log = require('npmlog');
const versioning = require('./util/versioning.js');
const napi = require('./util/napi.js');
const existsAsync = fs.exists || path.exists;
const makeDir = require('make-dir');
const tar = require('tar');

function readdirSync(dir) {
  let list = [];
  const files = fs.readdirSync(dir);

  files.forEach((file) => {
    const stats = fs.lstatSync(path.join(dir, file));
    if (stats.isDirectory()) {
      list = list.concat(readdirSync(path.join(dir, file)));
    } else {
      list.push(path.join(dir, file));
    }
  });
  return list;
}

function _package(gyp, argv, callback) {
  const package_json = gyp.package_json;
  const napi_build_version = napi.get_napi_build_version_from_command_args(argv);
  const opts = versioning.evaluate(package_json, gyp.opts, napi_build_version);
  const from = opts.module_path;
  const binary_module = path.join(from, opts.module_name + '.node');
  existsAsync(binary_module, (found) => {
    if (!found) {
      return callback(new Error('Cannot package because ' + binary_module + ' missing: run `node-pre-gyp rebuild` first'));
    }
    const tarball = opts.staged_tarball;
    const filter_func = function(entry) {
      const basename = path.basename(entry);
      if (basename.length && basename[0] !== '.') {
        console.log('packing ' + entry);
        return true;
      } else {
        console.log('skipping ' + entry);
      }
      return false;
    };
    makeDir(path.dirname(tarball)).then(() => {
      let files = readdirSync(from);
      const base = path.basename(from);
      files = files.map((file) => {
        return path.join(base, path.relative(from, file));
      });
      tar.create({
        portable: false,
        gzip: true,
        filter: filter_func,
        file: tarball,
        cwd: path.dirname(from)
      }, files, (err2) => {
        if (err2)  console.error('[' + package_json.name + '] ' + err2.message);
        else log.info('package', 'Binary staged at "' + tarball + '"');
        return callback(err2);
      });
    }).catch((err) => {
      return callback(err);
    });
  });
}
'use strict';

const npg = require('..');
const versioning = require('../lib/util/versioning.js');
const napi = require('../lib/util/napi.js');
const existsSync = require('fs').existsSync || require('path').existsSync;
const path = require('path');

module.exports = exports;

exports.usage = 'Finds the require path for the node-pre-gyp installed module';

exports.validate = function(package_json, opts) {
  versioning.validate_config(package_json, opts);
};

exports.find = function(package_json_path, opts) {
  if (!existsSync(package_json_path)) {
    throw new Error(package_json_path + 'does not exist');
  }
  const prog = new npg.Run({ package_json_path, argv: process.argv });
  prog.setBinaryHostProperty();
  const package_json = prog.package_json;

  versioning.validate_config(package_json, opts);
  let napi_build_version;
  if (napi.get_napi_build_versions(package_json, opts)) {
    napi_build_version = napi.get_best_napi_build_version(package_json, opts);
  }
  opts = opts || {};
  if (!opts.module_root) opts.module_root = path.dirname(package_json_path);
  const meta = versioning.evaluate(package_json, opts, napi_build_version);
  return meta.module;
};
'use strict';

module.exports = exports = publish;

exports.usage = 'Publishes pre-built binary (requires aws-sdk)';

const fs = require('fs');
const path = require('path');
const log = require('npmlog');
const versioning = require('./util/versioning.js');
const napi = require('./util/napi.js');
const s3_setup = require('./util/s3_setup.js');
const existsAsync = fs.exists || path.exists;
const url = require('url');

function publish(gyp, argv, callback) {
  const package_json = gyp.package_json;
  const napi_build_version = napi.get_napi_build_version_from_command_args(argv);
  const opts = versioning.evaluate(package_json, gyp.opts, napi_build_version);
  const tarball = opts.staged_tarball;
  existsAsync(tarball, (found) => {
    if (!found) {
      return callback(new Error('Cannot publish because ' + tarball + ' missing: run `node-pre-gyp package` first'));
    }

    log.info('publish', 'Detecting s3 credentials');
    const config = {};
    s3_setup.detect(opts, config);
    const s3 = s3_setup.get_s3(config);

    const key_name = url.resolve(config.prefix, opts.package_name);
    const s3_opts = {
      Bucket: config.bucket,
      Key: key_name
    };
    log.info('publish', 'Authenticating with s3');
    log.info('publish', config);

    log.info('publish', 'Checking for existing binary at ' + opts.hosted_path);
    s3.headObject(s3_opts, (err, meta) => {
      if (meta) log.info('publish', JSON.stringify(meta));
      if (err && err.code === 'NotFound') {
        // we are safe to publish because
        // the object does not already exist
        log.info('publish', 'Preparing to put object');
        const s3_put_opts = {
          ACL: 'public-read',
          Body: fs.createReadStream(tarball),
          Key: key_name,
          Bucket: config.bucket
        };
        log.info('publish', 'Putting object', s3_put_opts.ACL, s3_put_opts.Bucket, s3_put_opts.Key);
        try {
          s3.putObject(s3_put_opts, (err2, resp) => {
            log.info('publish', 'returned from putting object');
            if (err2) {
              log.info('publish', 's3 putObject error: "' + err2 + '"');
              return callback(err2);
            }
            if (resp) log.info('publish', 's3 putObject response: "' + JSON.stringify(resp) + '"');
            log.info('publish', 'successfully put object');
            console.log('[' + package_json.name + '] published to ' + opts.hosted_path);
            return callback();
          });
        } catch (err3) {
          log.info('publish', 's3 putObject error: "' + err3 + '"');
          return callback(err3);
        }
      } else if (err) {
        log.info('publish', 's3 headObject error: "' + err + '"');
        return callback(err);
      } else {
        log.error('publish', 'Cannot publish over existing version');
        log.error('publish', "Update the 'version' field in package.json and try again");
        log.error('publish', 'If the previous version was published in error see:');
        log.error('publish', '\t node-pre-gyp unpublish');
        return callback(new Error('Failed publishing to ' + opts.hosted_path));
      }
    });
  });
}
'use strict';

module.exports = exports = rebuild;

exports.usage = 'Runs "clean" and "build" at once';

const napi = require('./util/napi.js');

function rebuild(gyp, argv, callback) {
  const package_json = gyp.package_json;
  let commands = [
    { name: 'clean', args: [] },
    { name: 'build', args: ['rebuild'] }
  ];
  commands = napi.expand_commands(package_json, gyp.opts, commands);
  for (let i = commands.length; i !== 0; i--) {
    gyp.todo.unshift(commands[i - 1]);
  }
  process.nextTick(callback);
}
'use strict';

module.exports = exports = rebuild;

exports.usage = 'Runs "clean" and "install" at once';

const napi = require('./util/napi.js');

function rebuild(gyp, argv, callback) {
  const package_json = gyp.package_json;
  let installArgs = [];
  const napi_build_version = napi.get_best_napi_build_version(package_json, gyp.opts);
  if (napi_build_version != null) installArgs = [napi.get_command_arg(napi_build_version)];
  gyp.todo.unshift(
    { name: 'clean', args: [] },
    { name: 'install', args: installArgs }
  );
  process.nextTick(callback);
}
'use strict';

module.exports = exports = reveal;

exports.usage = 'Reveals data on the versioned binary';

const versioning = require('./util/versioning.js');
const napi = require('./util/napi.js');

function unix_paths(key, val) {
  return val && val.replace ? val.replace(/\\/g, '/') : val;
}

function reveal(gyp, argv, callback) {
  const package_json = gyp.package_json;
  const napi_build_version = napi.get_napi_build_version_from_command_args(argv);
  const opts = versioning.evaluate(package_json, gyp.opts, napi_build_version);
  let hit = false;
  // if a second arg is passed look to see
  // if it is a known option
  // console.log(JSON.stringify(gyp.opts,null,1))
  const remain = gyp.opts.argv.remain[gyp.opts.argv.remain.length - 1];
  if (remain && Object.hasOwnProperty.call(opts, remain)) {
    console.log(opts[remain].replace(/\\/g, '/'));
    hit = true;
  }
  // otherwise return all options as json
  if (!hit) {
    console.log(JSON.stringify(opts, unix_paths, 2));
  }
  return callback();
}
'use strict';

module.exports = exports = testbinary;

exports.usage = 'Tests that the binary.node can be required';

const path = require('path');
const log = require('npmlog');
const cp = require('child_process');
const versioning = require('./util/versioning.js');
const napi = require('./util/napi.js');

function testbinary(gyp, argv, callback) {
  const args = [];
  const options = {};
  let shell_cmd = process.execPath;
  const package_json = gyp.package_json;
  const napi_build_version = napi.get_napi_build_version_from_command_args(argv);
  const opts = versioning.evaluate(package_json, gyp.opts, napi_build_version);
  // skip validation for runtimes we don't explicitly support (like electron)
  if (opts.runtime &&
        opts.runtime !== 'node-webkit' &&
        opts.runtime !== 'node') {
    return callback();
  }
  const nw = (opts.runtime && opts.runtime === 'node-webkit');
  // ensure on windows that / are used for require path
  const binary_module = opts.module.replace(/\\/g, '/');
  if ((process.arch !== opts.target_arch) ||
        (process.platform !== opts.target_platform)) {
    let msg = 'skipping validation since host platform/arch (';
    msg += process.platform + '/' + process.arch + ')';
    msg += ' does not match target (';
    msg += opts.target_platform + '/' + opts.target_arch + ')';
    log.info('validate', msg);
    return callback();
  }
  if (nw) {
    options.timeout = 5000;
    if (process.platform === 'darwin') {
      shell_cmd = 'node-webkit';
    } else if (process.platform === 'win32') {
      shell_cmd = 'nw.exe';
    } else {
      shell_cmd = 'nw';
    }
    const modulePath = path.resolve(binary_module);
    const appDir = path.join(__dirname, 'util', 'nw-pre-gyp');
    args.push(appDir);
    args.push(modulePath);
    log.info('validate', "Running test command: '" + shell_cmd + ' ' + args.join(' ') + "'");
    cp.execFile(shell_cmd, args, options, (err, stdout, stderr) => {
      // check for normal timeout for node-webkit
      if (err) {
        if (err.killed === true && err.signal && err.signal.indexOf('SIG') > -1) {
          return callback();
        }
        const stderrLog = stderr.toString();
        log.info('stderr', stderrLog);
        if (/^\s*Xlib:\s*extension\s*"RANDR"\s*missing\s*on\s*display\s*":\d+\.\d+"\.\s*$/.test(stderrLog)) {
          log.info('RANDR', 'stderr contains only RANDR error, ignored');
          return callback();
        }
        return callback(err);
      }
      return callback();
    });
    return;
  }
  args.push('--eval');
  args.push("require('" + binary_module.replace(/'/g, '\'') + "')");
  log.info('validate', "Running test command: '" + shell_cmd + ' ' + args.join(' ') + "'");
  cp.execFile(shell_cmd, args, options, (err, stdout, stderr) => {
    if (err) {
      return callback(err, { stdout: stdout, stderr: stderr });
    }
    return callback();
  });
}
'use strict';

module.exports = exports = testpackage;

exports.usage = 'Tests that the staged package is valid';

const fs = require('fs');
const path = require('path');
const log = require('npmlog');
const existsAsync = fs.exists || path.exists;
const versioning = require('./util/versioning.js');
const napi = require('./util/napi.js');
const testbinary = require('./testbinary.js');
const tar = require('tar');
const makeDir = require('make-dir');

function testpackage(gyp, argv, callback) {
  const package_json = gyp.package_json;
  const napi_build_version = napi.get_napi_build_version_from_command_args(argv);
  const opts = versioning.evaluate(package_json, gyp.opts, napi_build_version);
  const tarball = opts.staged_tarball;
  existsAsync(tarball, (found) => {
    if (!found) {
      return callback(new Error('Cannot test package because ' + tarball + ' missing: run `node-pre-gyp package` first'));
    }
    const to = opts.module_path;
    function filter_func(entry) {
      log.info('install', 'unpacking [' + entry.path + ']');
    }

    makeDir(to).then(() => {
      tar.extract({
        file: tarball,
        cwd: to,
        strip: 1,
        onentry: filter_func
      }).then(after_extract, callback);
    }).catch((err) => {
      return callback(err);
    });

    function after_extract() {
      testbinary(gyp, argv, (err) => {
        if (err) {
          return callback(err);
        } else {
          console.log('[' + package_json.name + '] Package appears valid');
          return callback();
        }
      });
    }
  });
}
'use strict';

module.exports = exports = unpublish;

exports.usage = 'Unpublishes pre-built binary (requires aws-sdk)';

const log = require('npmlog');
const versioning = require('./util/versioning.js');
const napi = require('./util/napi.js');
const s3_setup = require('./util/s3_setup.js');
const url = require('url');

function unpublish(gyp, argv, callback) {
  const package_json = gyp.package_json;
  const napi_build_version = napi.get_napi_build_version_from_command_args(argv);
  const opts = versioning.evaluate(package_json, gyp.opts, napi_build_version);
  const config = {};
  s3_setup.detect(opts, config);
  const s3 = s3_setup.get_s3(config);
  const key_name = url.resolve(config.prefix, opts.package_name);
  const s3_opts = {
    Bucket: config.bucket,
    Key: key_name
  };
  s3.headObject(s3_opts, (err, meta) => {
    if (err && err.code === 'NotFound') {
      console.log('[' + package_json.name + '] Not found: https://' + s3_opts.Bucket + '.s3.amazonaws.com/' + s3_opts.Key);
      return callback();
    } else if (err) {
      return callback(err);
    } else {
      log.info('unpublish', JSON.stringify(meta));
      s3.deleteObject(s3_opts, (err2, resp) => {
        if (err2) return callback(err2);
        log.info(JSON.stringify(resp));
        console.log('[' + package_json.name + '] Success: removed https://' + s3_opts.Bucket + '.s3.amazonaws.com/' + s3_opts.Key);
        return callback();
      });
    }
  });
}
{
  "0.1.14": {
    "node_abi": null,
    "v8": "1.3"
  },
  "0.1.15": {
    "node_abi": null,
    "v8": "1.3"
  },
  "0.1.16": {
    "node_abi": null,
    "v8": "1.3"
  },
  "0.1.17": {
    "node_abi": null,
    "v8": "1.3"
  },
  "0.1.18": {
    "node_abi": null,
    "v8": "1.3"
  },
  "0.1.19": {
    "node_abi": null,
    "v8": "2.0"
  },
  "0.1.20": {
    "node_abi": null,
    "v8": "2.0"
  },
  "0.1.21": {
    "node_abi": null,
    "v8": "2.0"
  },
  "0.1.22": {
    "node_abi": null,
    "v8": "2.0"
  },
  "0.1.23": {
    "node_abi": null,
    "v8": "2.0"
  },
  "0.1.24": {
    "node_abi": null,
    "v8": "2.0"
  },
  "0.1.25": {
    "node_abi": null,
    "v8": "2.0"
  },
  "0.1.26": {
    "node_abi": null,
    "v8": "2.0"
  },
  "0.1.27": {
    "node_abi": null,
    "v8": "2.1"
  },
  "0.1.28": {
    "node_abi": null,
    "v8": "2.1"
  },
  "0.1.29": {
    "node_abi": null,
    "v8": "2.1"
  },
  "0.1.30": {
    "node_abi": null,
    "v8": "2.1"
  },
  "0.1.31": {
    "node_abi": null,
    "v8": "2.1"
  },
  "0.1.32": {
    "node_abi": null,
    "v8": "2.1"
  },
  "0.1.33": {
    "node_abi": null,
    "v8": "2.1"
  },
  "0.1.90": {
    "node_abi": null,
    "v8": "2.2"
  },
  "0.1.91": {
    "node_abi": null,
    "v8": "2.2"
  },
  "0.1.92": {
    "node_abi": null,
    "v8": "2.2"
  },
  "0.1.93": {
    "node_abi": null,
    "v8": "2.2"
  },
  "0.1.94": {
    "node_abi": null,
    "v8": "2.2"
  },
  "0.1.95": {
    "node_abi": null,
    "v8": "2.2"
  },
  "0.1.96": {
    "node_abi": null,
    "v8": "2.2"
  },
  "0.1.97": {
    "node_abi": null,
    "v8": "2.2"
  },
  "0.1.98": {
    "node_abi": null,
    "v8": "2.2"
  },
  "0.1.99": {
    "node_abi": null,
    "v8": "2.2"
  },
  "0.1.100": {
    "node_abi": null,
    "v8": "2.2"
  },
  "0.1.101": {
    "node_abi": null,
    "v8": "2.3"
  },
  "0.1.102": {
    "node_abi": null,
    "v8": "2.3"
  },
  "0.1.103": {
    "node_abi": null,
    "v8": "2.3"
  },
  "0.1.104": {
    "node_abi": null,
    "v8": "2.3"
  },
  "0.2.0": {
    "node_abi": 1,
    "v8": "2.3"
  },
  "0.2.1": {
    "node_abi": 1,
    "v8": "2.3"
  },
  "0.2.2": {
    "node_abi": 1,
    "v8": "2.3"
  },
  "0.2.3": {
    "node_abi": 1,
    "v8": "2.3"
  },
  "0.2.4": {
    "node_abi": 1,
    "v8": "2.3"
  },
  "0.2.5": {
    "node_abi": 1,
    "v8": "2.3"
  },
  "0.2.6": {
    "node_abi": 1,
    "v8": "2.3"
  },
  "0.3.0": {
    "node_abi": 1,
    "v8": "2.5"
  },
  "0.3.1": {
    "node_abi": 1,
    "v8": "2.5"
  },
  "0.3.2": {
    "node_abi": 1,
    "v8": "3.0"
  },
  "0.3.3": {
    "node_abi": 1,
    "v8": "3.0"
  },
  "0.3.4": {
    "node_abi": 1,
    "v8": "3.0"
  },
  "0.3.5": {
    "node_abi": 1,
    "v8": "3.0"
  },
  "0.3.6": {
    "node_abi": 1,
    "v8": "3.0"
  },
  "0.3.7": {
    "node_abi": 1,
    "v8": "3.0"
  },
  "0.3.8": {
    "node_abi": 1,
    "v8": "3.1"
  },
  "0.4.0": {
    "node_abi": 1,
    "v8": "3.1"
  },
  "0.4.1": {
    "node_abi": 1,
    "v8": "3.1"
  },
  "0.4.2": {
    "node_abi": 1,
    "v8": "3.1"
  },
  "0.4.3": {
    "node_abi": 1,
    "v8": "3.1"
  },
  "0.4.4": {
    "node_abi": 1,
    "v8": "3.1"
  },
  "0.4.5": {
    "node_abi": 1,
    "v8": "3.1"
  },
  "0.4.6": {
    "node_abi": 1,
    "v8": "3.1"
  },
  "0.4.7": {
    "node_abi": 1,
    "v8": "3.1"
  },
  "0.4.8": {
    "node_abi": 1,
    "v8": "3.1"
  },
  "0.4.9": {
    "node_abi": 1,
    "v8": "3.1"
  },
  "0.4.10": {
    "node_abi": 1,
    "v8": "3.1"
  },
  "0.4.11": {
    "node_abi": 1,
    "v8": "3.1"
  },
  "0.4.12": {
    "node_abi": 1,
    "v8": "3.1"
  },
  "0.5.0": {
    "node_abi": 1,
    "v8": "3.1"
  },
  "0.5.1": {
    "node_abi": 1,
    "v8": "3.4"
  },
  "0.5.2": {
    "node_abi": 1,
    "v8": "3.4"
  },
  "0.5.3": {
    "node_abi": 1,
    "v8": "3.4"
  },
  "0.5.4": {
    "node_abi": 1,
    "v8": "3.5"
  },
  "0.5.5": {
    "node_abi": 1,
    "v8": "3.5"
  },
  "0.5.6": {
    "node_abi": 1,
    "v8": "3.6"
  },
  "0.5.7": {
    "node_abi": 1,
    "v8": "3.6"
  },
  "0.5.8": {
    "node_abi": 1,
    "v8": "3.6"
  },
  "0.5.9": {
    "node_abi": 1,
    "v8": "3.6"
  },
  "0.5.10": {
    "node_abi": 1,
    "v8": "3.7"
  },
  "0.6.0": {
    "node_abi": 1,
    "v8": "3.6"
  },
  "0.6.1": {
    "node_abi": 1,
    "v8": "3.6"
  },
  "0.6.2": {
    "node_abi": 1,
    "v8": "3.6"
  },
  "0.6.3": {
    "node_abi": 1,
    "v8": "3.6"
  },
  "0.6.4": {
    "node_abi": 1,
    "v8": "3.6"
  },
  "0.6.5": {
    "node_abi": 1,
    "v8": "3.6"
  },
  "0.6.6": {
    "node_abi": 1,
    "v8": "3.6"
  },
  "0.6.7": {
    "node_abi": 1,
    "v8": "3.6"
  },
  "0.6.8": {
    "node_abi": 1,
    "v8": "3.6"
  },
  "0.6.9": {
    "node_abi": 1,
    "v8": "3.6"
  },
  "0.6.10": {
    "node_abi": 1,
    "v8": "3.6"
  },
  "0.6.11": {
    "node_abi": 1,
    "v8": "3.6"
  },
  "0.6.12": {
    "node_abi": 1,
    "v8": "3.6"
  },
  "0.6.13": {
    "node_abi": 1,
    "v8": "3.6"
  },
  "0.6.14": {
    "node_abi": 1,
    "v8": "3.6"
  },
  "0.6.15": {
    "node_abi": 1,
    "v8": "3.6"
  },
  "0.6.16": {
    "node_abi": 1,
    "v8": "3.6"
  },
  "0.6.17": {
    "node_abi": 1,
    "v8": "3.6"
  },
  "0.6.18": {
    "node_abi": 1,
    "v8": "3.6"
  },
  "0.6.19": {
    "node_abi": 1,
    "v8": "3.6"
  },
  "0.6.20": {
    "node_abi": 1,
    "v8": "3.6"
  },
  "0.6.21": {
    "node_abi": 1,
    "v8": "3.6"
  },
  "0.7.0": {
    "node_abi": 1,
    "v8": "3.8"
  },
  "0.7.1": {
    "node_abi": 1,
    "v8": "3.8"
  },
  "0.7.2": {
    "node_abi": 1,
    "v8": "3.8"
  },
  "0.7.3": {
    "node_abi": 1,
    "v8": "3.9"
  },
  "0.7.4": {
    "node_abi": 1,
    "v8": "3.9"
  },
  "0.7.5": {
    "node_abi": 1,
    "v8": "3.9"
  },
  "0.7.6": {
    "node_abi": 1,
    "v8": "3.9"
  },
  "0.7.7": {
    "node_abi": 1,
    "v8": "3.9"
  },
  "0.7.8": {
    "node_abi": 1,
    "v8": "3.9"
  },
  "0.7.9": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.7.10": {
    "node_abi": 1,
    "v8": "3.9"
  },
  "0.7.11": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.7.12": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.0": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.1": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.2": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.3": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.4": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.5": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.6": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.7": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.8": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.9": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.10": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.11": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.12": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.13": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.14": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.15": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.16": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.17": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.18": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.19": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.20": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.21": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.22": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.23": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.24": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.25": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.26": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.27": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.8.28": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.9.0": {
    "node_abi": 1,
    "v8": "3.11"
  },
  "0.9.1": {
    "node_abi": 10,
    "v8": "3.11"
  },
  "0.9.2": {
    "node_abi": 10,
    "v8": "3.11"
  },
  "0.9.3": {
    "node_abi": 10,
    "v8": "3.13"
  },
  "0.9.4": {
    "node_abi": 10,
    "v8": "3.13"
  },
  "0.9.5": {
    "node_abi": 10,
    "v8": "3.13"
  },
  "0.9.6": {
    "node_abi": 10,
    "v8": "3.15"
  },
  "0.9.7": {
    "node_abi": 10,
    "v8": "3.15"
  },
  "0.9.8": {
    "node_abi": 10,
    "v8": "3.15"
  },
  "0.9.9": {
    "node_abi": 11,
    "v8": "3.15"
  },
  "0.9.10": {
    "node_abi": 11,
    "v8": "3.15"
  },
  "0.9.11": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.9.12": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.0": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.1": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.2": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.3": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.4": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.5": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.6": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.7": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.8": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.9": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.10": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.11": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.12": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.13": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.14": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.15": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.16": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.17": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.18": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.19": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.20": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.21": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.22": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.23": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.24": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.25": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.26": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.27": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.28": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.29": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.30": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.31": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.32": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.33": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.34": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.35": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.36": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.37": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.38": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.39": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.40": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.41": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.42": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.43": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.44": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.45": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.46": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.47": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.10.48": {
    "node_abi": 11,
    "v8": "3.14"
  },
  "0.11.0": {
    "node_abi": 12,
    "v8": "3.17"
  },
  "0.11.1": {
    "node_abi": 12,
    "v8": "3.18"
  },
  "0.11.2": {
    "node_abi": 12,
    "v8": "3.19"
  },
  "0.11.3": {
    "node_abi": 12,
    "v8": "3.19"
  },
  "0.11.4": {
    "node_abi": 12,
    "v8": "3.20"
  },
  "0.11.5": {
    "node_abi": 12,
    "v8": "3.20"
  },
  "0.11.6": {
    "node_abi": 12,
    "v8": "3.20"
  },
  "0.11.7": {
    "node_abi": 12,
    "v8": "3.20"
  },
  "0.11.8": {
    "node_abi": 13,
    "v8": "3.21"
  },
  "0.11.9": {
    "node_abi": 13,
    "v8": "3.22"
  },
  "0.11.10": {
    "node_abi": 13,
    "v8": "3.22"
  },
  "0.11.11": {
    "node_abi": 14,
    "v8": "3.22"
  },
  "0.11.12": {
    "node_abi": 14,
    "v8": "3.22"
  },
  "0.11.13": {
    "node_abi": 14,
    "v8": "3.25"
  },
  "0.11.14": {
    "node_abi": 14,
    "v8": "3.26"
  },
  "0.11.15": {
    "node_abi": 14,
    "v8": "3.28"
  },
  "0.11.16": {
    "node_abi": 14,
    "v8": "3.28"
  },
  "0.12.0": {
    "node_abi": 14,
    "v8": "3.28"
  },
  "0.12.1": {
    "node_abi": 14,
    "v8": "3.28"
  },
  "0.12.2": {
    "node_abi": 14,
    "v8": "3.28"
  },
  "0.12.3": {
    "node_abi": 14,
    "v8": "3.28"
  },
  "0.12.4": {
    "node_abi": 14,
    "v8": "3.28"
  },
  "0.12.5": {
    "node_abi": 14,
    "v8": "3.28"
  },
  "0.12.6": {
    "node_abi": 14,
    "v8": "3.28"
  },
  "0.12.7": {
    "node_abi": 14,
    "v8": "3.28"
  },
  "0.12.8": {
    "node_abi": 14,
    "v8": "3.28"
  },
  "0.12.9": {
    "node_abi": 14,
    "v8": "3.28"
  },
  "0.12.10": {
    "node_abi": 14,
    "v8": "3.28"
  },
  "0.12.11": {
    "node_abi": 14,
    "v8": "3.28"
  },
  "0.12.12": {
    "node_abi": 14,
    "v8": "3.28"
  },
  "0.12.13": {
    "node_abi": 14,
    "v8": "3.28"
  },
  "0.12.14": {
    "node_abi": 14,
    "v8": "3.28"
  },
  "0.12.15": {
    "node_abi": 14,
    "v8": "3.28"
  },
  "0.12.16": {
    "node_abi": 14,
    "v8": "3.28"
  },
  "0.12.17": {
    "node_abi": 14,
    "v8": "3.28"
  },
  "0.12.18": {
    "node_abi": 14,
    "v8": "3.28"
  },
  "1.0.0": {
    "node_abi": 42,
    "v8": "3.31"
  },
  "1.0.1": {
    "node_abi": 42,
    "v8": "3.31"
  },
  "1.0.2": {
    "node_abi": 42,
    "v8": "3.31"
  },
  "1.0.3": {
    "node_abi": 42,
    "v8": "4.1"
  },
  "1.0.4": {
    "node_abi": 42,
    "v8": "4.1"
  },
  "1.1.0": {
    "node_abi": 43,
    "v8": "4.1"
  },
  "1.2.0": {
    "node_abi": 43,
    "v8": "4.1"
  },
  "1.3.0": {
    "node_abi": 43,
    "v8": "4.1"
  },
  "1.4.1": {
    "node_abi": 43,
    "v8": "4.1"
  },
  "1.4.2": {
    "node_abi": 43,
    "v8": "4.1"
  },
  "1.4.3": {
    "node_abi": 43,
    "v8": "4.1"
  },
  "1.5.0": {
    "node_abi": 43,
    "v8": "4.1"
  },
  "1.5.1": {
    "node_abi": 43,
    "v8": "4.1"
  },
  "1.6.0": {
    "node_abi": 43,
    "v8": "4.1"
  },
  "1.6.1": {
    "node_abi": 43,
    "v8": "4.1"
  },
  "1.6.2": {
    "node_abi": 43,
    "v8": "4.1"
  },
  "1.6.3": {
    "node_abi": 43,
    "v8": "4.1"
  },
  "1.6.4": {
    "node_abi": 43,
    "v8": "4.1"
  },
  "1.7.1": {
    "node_abi": 43,
    "v8": "4.1"
  },
  "1.8.1": {
    "node_abi": 43,
    "v8": "4.1"
  },
  "1.8.2": {
    "node_abi": 43,
    "v8": "4.1"
  },
  "1.8.3": {
    "node_abi": 43,
    "v8": "4.1"
  },
  "1.8.4": {
    "node_abi": 43,
    "v8": "4.1"
  },
  "2.0.0": {
    "node_abi": 44,
    "v8": "4.2"
  },
  "2.0.1": {
    "node_abi": 44,
    "v8": "4.2"
  },
  "2.0.2": {
    "node_abi": 44,
    "v8": "4.2"
  },
  "2.1.0": {
    "node_abi": 44,
    "v8": "4.2"
  },
  "2.2.0": {
    "node_abi": 44,
    "v8": "4.2"
  },
  "2.2.1": {
    "node_abi": 44,
    "v8": "4.2"
  },
  "2.3.0": {
    "node_abi": 44,
    "v8": "4.2"
  },
  "2.3.1": {
    "node_abi": 44,
    "v8": "4.2"
  },
  "2.3.2": {
    "node_abi": 44,
    "v8": "4.2"
  },
  "2.3.3": {
    "node_abi": 44,
    "v8": "4.2"
  },
  "2.3.4": {
    "node_abi": 44,
    "v8": "4.2"
  },
  "2.4.0": {
    "node_abi": 44,
    "v8": "4.2"
  },
  "2.5.0": {
    "node_abi": 44,
    "v8": "4.2"
  },
  "3.0.0": {
    "node_abi": 45,
    "v8": "4.4"
  },
  "3.1.0": {
    "node_abi": 45,
    "v8": "4.4"
  },
  "3.2.0": {
    "node_abi": 45,
    "v8": "4.4"
  },
  "3.3.0": {
    "node_abi": 45,
    "v8": "4.4"
  },
  "3.3.1": {
    "node_abi": 45,
    "v8": "4.4"
  },
  "4.0.0": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.1.0": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.1.1": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.1.2": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.2.0": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.2.1": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.2.2": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.2.3": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.2.4": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.2.5": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.2.6": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.3.0": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.3.1": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.3.2": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.4.0": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.4.1": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.4.2": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.4.3": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.4.4": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.4.5": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.4.6": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.4.7": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.5.0": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.6.0": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.6.1": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.6.2": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.7.0": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.7.1": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.7.2": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.7.3": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.8.0": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.8.1": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.8.2": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.8.3": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.8.4": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.8.5": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.8.6": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.8.7": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.9.0": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "4.9.1": {
    "node_abi": 46,
    "v8": "4.5"
  },
  "5.0.0": {
    "node_abi": 47,
    "v8": "4.6"
  },
  "5.1.0": {
    "node_abi": 47,
    "v8": "4.6"
  },
  "5.1.1": {
    "node_abi": 47,
    "v8": "4.6"
  },
  "5.2.0": {
    "node_abi": 47,
    "v8": "4.6"
  },
  "5.3.0": {
    "node_abi": 47,
    "v8": "4.6"
  },
  "5.4.0": {
    "node_abi": 47,
    "v8": "4.6"
  },
  "5.4.1": {
    "node_abi": 47,
    "v8": "4.6"
  },
  "5.5.0": {
    "node_abi": 47,
    "v8": "4.6"
  },
  "5.6.0": {
    "node_abi": 47,
    "v8": "4.6"
  },
  "5.7.0": {
    "node_abi": 47,
    "v8": "4.6"
  },
  "5.7.1": {
    "node_abi": 47,
    "v8": "4.6"
  },
  "5.8.0": {
    "node_abi": 47,
    "v8": "4.6"
  },
  "5.9.0": {
    "node_abi": 47,
    "v8": "4.6"
  },
  "5.9.1": {
    "node_abi": 47,
    "v8": "4.6"
  },
  "5.10.0": {
    "node_abi": 47,
    "v8": "4.6"
  },
  "5.10.1": {
    "node_abi": 47,
    "v8": "4.6"
  },
  "5.11.0": {
    "node_abi": 47,
    "v8": "4.6"
  },
  "5.11.1": {
    "node_abi": 47,
    "v8": "4.6"
  },
  "5.12.0": {
    "node_abi": 47,
    "v8": "4.6"
  },
  "6.0.0": {
    "node_abi": 48,
    "v8": "5.0"
  },
  "6.1.0": {
    "node_abi": 48,
    "v8": "5.0"
  },
  "6.2.0": {
    "node_abi": 48,
    "v8": "5.0"
  },
  "6.2.1": {
    "node_abi": 48,
    "v8": "5.0"
  },
  "6.2.2": {
    "node_abi": 48,
    "v8": "5.0"
  },
  "6.3.0": {
    "node_abi": 48,
    "v8": "5.0"
  },
  "6.3.1": {
    "node_abi": 48,
    "v8": "5.0"
  },
  "6.4.0": {
    "node_abi": 48,
    "v8": "5.0"
  },
  "6.5.0": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.6.0": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.7.0": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.8.0": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.8.1": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.9.0": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.9.1": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.9.2": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.9.3": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.9.4": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.9.5": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.10.0": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.10.1": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.10.2": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.10.3": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.11.0": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.11.1": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.11.2": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.11.3": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.11.4": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.11.5": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.12.0": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.12.1": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.12.2": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.12.3": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.13.0": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.13.1": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.14.0": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.14.1": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.14.2": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.14.3": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.14.4": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.15.0": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.15.1": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.16.0": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.17.0": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "6.17.1": {
    "node_abi": 48,
    "v8": "5.1"
  },
  "7.0.0": {
    "node_abi": 51,
    "v8": "5.4"
  },
  "7.1.0": {
    "node_abi": 51,
    "v8": "5.4"
  },
  "7.2.0": {
    "node_abi": 51,
    "v8": "5.4"
  },
  "7.2.1": {
    "node_abi": 51,
    "v8": "5.4"
  },
  "7.3.0": {
    "node_abi": 51,
    "v8": "5.4"
  },
  "7.4.0": {
    "node_abi": 51,
    "v8": "5.4"
  },
  "7.5.0": {
    "node_abi": 51,
    "v8": "5.4"
  },
  "7.6.0": {
    "node_abi": 51,
    "v8": "5.5"
  },
  "7.7.0": {
    "node_abi": 51,
    "v8": "5.5"
  },
  "7.7.1": {
    "node_abi": 51,
    "v8": "5.5"
  },
  "7.7.2": {
    "node_abi": 51,
    "v8": "5.5"
  },
  "7.7.3": {
    "node_abi": 51,
    "v8": "5.5"
  },
  "7.7.4": {
    "node_abi": 51,
    "v8": "5.5"
  },
  "7.8.0": {
    "node_abi": 51,
    "v8": "5.5"
  },
  "7.9.0": {
    "node_abi": 51,
    "v8": "5.5"
  },
  "7.10.0": {
    "node_abi": 51,
    "v8": "5.5"
  },
  "7.10.1": {
    "node_abi": 51,
    "v8": "5.5"
  },
  "8.0.0": {
    "node_abi": 57,
    "v8": "5.8"
  },
  "8.1.0": {
    "node_abi": 57,
    "v8": "5.8"
  },
  "8.1.1": {
    "node_abi": 57,
    "v8": "5.8"
  },
  "8.1.2": {
    "node_abi": 57,
    "v8": "5.8"
  },
  "8.1.3": {
    "node_abi": 57,
    "v8": "5.8"
  },
  "8.1.4": {
    "node_abi": 57,
    "v8": "5.8"
  },
  "8.2.0": {
    "node_abi": 57,
    "v8": "5.8"
  },
  "8.2.1": {
    "node_abi": 57,
    "v8": "5.8"
  },
  "8.3.0": {
    "node_abi": 57,
    "v8": "6.0"
  },
  "8.4.0": {
    "node_abi": 57,
    "v8": "6.0"
  },
  "8.5.0": {
    "node_abi": 57,
    "v8": "6.0"
  },
  "8.6.0": {
    "node_abi": 57,
    "v8": "6.0"
  },
  "8.7.0": {
    "node_abi": 57,
    "v8": "6.1"
  },
  "8.8.0": {
    "node_abi": 57,
    "v8": "6.1"
  },
  "8.8.1": {
    "node_abi": 57,
    "v8": "6.1"
  },
  "8.9.0": {
    "node_abi": 57,
    "v8": "6.1"
  },
  "8.9.1": {
    "node_abi": 57,
    "v8": "6.1"
  },
  "8.9.2": {
    "node_abi": 57,
    "v8": "6.1"
  },
  "8.9.3": {
    "node_abi": 57,
    "v8": "6.1"
  },
  "8.9.4": {
    "node_abi": 57,
    "v8": "6.1"
  },
  "8.10.0": {
    "node_abi": 57,
    "v8": "6.2"
  },
  "8.11.0": {
    "node_abi": 57,
    "v8": "6.2"
  },
  "8.11.1": {
    "node_abi": 57,
    "v8": "6.2"
  },
  "8.11.2": {
    "node_abi": 57,
    "v8": "6.2"
  },
  "8.11.3": {
    "node_abi": 57,
    "v8": "6.2"
  },
  "8.11.4": {
    "node_abi": 57,
    "v8": "6.2"
  },
  "8.12.0": {
    "node_abi": 57,
    "v8": "6.2"
  },
  "8.13.0": {
    "node_abi": 57,
    "v8": "6.2"
  },
  "8.14.0": {
    "node_abi": 57,
    "v8": "6.2"
  },
  "8.14.1": {
    "node_abi": 57,
    "v8": "6.2"
  },
  "8.15.0": {
    "node_abi": 57,
    "v8": "6.2"
  },
  "8.15.1": {
    "node_abi": 57,
    "v8": "6.2"
  },
  "8.16.0": {
    "node_abi": 57,
    "v8": "6.2"
  },
  "8.16.1": {
    "node_abi": 57,
    "v8": "6.2"
  },
  "8.16.2": {
    "node_abi": 57,
    "v8": "6.2"
  },
  "8.17.0": {
    "node_abi": 57,
    "v8": "6.2"
  },
  "9.0.0": {
    "node_abi": 59,
    "v8": "6.2"
  },
  "9.1.0": {
    "node_abi": 59,
    "v8": "6.2"
  },
  "9.2.0": {
    "node_abi": 59,
    "v8": "6.2"
  },
  "9.2.1": {
    "node_abi": 59,
    "v8": "6.2"
  },
  "9.3.0": {
    "node_abi": 59,
    "v8": "6.2"
  },
  "9.4.0": {
    "node_abi": 59,
    "v8": "6.2"
  },
  "9.5.0": {
    "node_abi": 59,
    "v8": "6.2"
  },
  "9.6.0": {
    "node_abi": 59,
    "v8": "6.2"
  },
  "9.6.1": {
    "node_abi": 59,
    "v8": "6.2"
  },
  "9.7.0": {
    "node_abi": 59,
    "v8": "6.2"
  },
  "9.7.1": {
    "node_abi": 59,
    "v8": "6.2"
  },
  "9.8.0": {
    "node_abi": 59,
    "v8": "6.2"
  },
  "9.9.0": {
    "node_abi": 59,
    "v8": "6.2"
  },
  "9.10.0": {
    "node_abi": 59,
    "v8": "6.2"
  },
  "9.10.1": {
    "node_abi": 59,
    "v8": "6.2"
  },
  "9.11.0": {
    "node_abi": 59,
    "v8": "6.2"
  },
  "9.11.1": {
    "node_abi": 59,
    "v8": "6.2"
  },
  "9.11.2": {
    "node_abi": 59,
    "v8": "6.2"
  },
  "10.0.0": {
    "node_abi": 64,
    "v8": "6.6"
  },
  "10.1.0": {
    "node_abi": 64,
    "v8": "6.6"
  },
  "10.2.0": {
    "node_abi": 64,
    "v8": "6.6"
  },
  "10.2.1": {
    "node_abi": 64,
    "v8": "6.6"
  },
  "10.3.0": {
    "node_abi": 64,
    "v8": "6.6"
  },
  "10.4.0": {
    "node_abi": 64,
    "v8": "6.7"
  },
  "10.4.1": {
    "node_abi": 64,
    "v8": "6.7"
  },
  "10.5.0": {
    "node_abi": 64,
    "v8": "6.7"
  },
  "10.6.0": {
    "node_abi": 64,
    "v8": "6.7"
  },
  "10.7.0": {
    "node_abi": 64,
    "v8": "6.7"
  },
  "10.8.0": {
    "node_abi": 64,
    "v8": "6.7"
  },
  "10.9.0": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.10.0": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.11.0": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.12.0": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.13.0": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.14.0": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.14.1": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.14.2": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.15.0": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.15.1": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.15.2": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.15.3": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.16.0": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.16.1": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.16.2": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.16.3": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.17.0": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.18.0": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.18.1": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.19.0": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.20.0": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.20.1": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.21.0": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.22.0": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.22.1": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.23.0": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.23.1": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.23.2": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.23.3": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.24.0": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "10.24.1": {
    "node_abi": 64,
    "v8": "6.8"
  },
  "11.0.0": {
    "node_abi": 67,
    "v8": "7.0"
  },
  "11.1.0": {
    "node_abi": 67,
    "v8": "7.0"
  },
  "11.2.0": {
    "node_abi": 67,
    "v8": "7.0"
  },
  "11.3.0": {
    "node_abi": 67,
    "v8": "7.0"
  },
  "11.4.0": {
    "node_abi": 67,
    "v8": "7.0"
  },
  "11.5.0": {
    "node_abi": 67,
    "v8": "7.0"
  },
  "11.6.0": {
    "node_abi": 67,
    "v8": "7.0"
  },
  "11.7.0": {
    "node_abi": 67,
    "v8": "7.0"
  },
  "11.8.0": {
    "node_abi": 67,
    "v8": "7.0"
  },
  "11.9.0": {
    "node_abi": 67,
    "v8": "7.0"
  },
  "11.10.0": {
    "node_abi": 67,
    "v8": "7.0"
  },
  "11.10.1": {
    "node_abi": 67,
    "v8": "7.0"
  },
  "11.11.0": {
    "node_abi": 67,
    "v8": "7.0"
  },
  "11.12.0": {
    "node_abi": 67,
    "v8": "7.0"
  },
  "11.13.0": {
    "node_abi": 67,
    "v8": "7.0"
  },
  "11.14.0": {
    "node_abi": 67,
    "v8": "7.0"
  },
  "11.15.0": {
    "node_abi": 67,
    "v8": "7.0"
  },
  "12.0.0": {
    "node_abi": 72,
    "v8": "7.4"
  },
  "12.1.0": {
    "node_abi": 72,
    "v8": "7.4"
  },
  "12.2.0": {
    "node_abi": 72,
    "v8": "7.4"
  },
  "12.3.0": {
    "node_abi": 72,
    "v8": "7.4"
  },
  "12.3.1": {
    "node_abi": 72,
    "v8": "7.4"
  },
  "12.4.0": {
    "node_abi": 72,
    "v8": "7.4"
  },
  "12.5.0": {
    "node_abi": 72,
    "v8": "7.5"
  },
  "12.6.0": {
    "node_abi": 72,
    "v8": "7.5"
  },
  "12.7.0": {
    "node_abi": 72,
    "v8": "7.5"
  },
  "12.8.0": {
    "node_abi": 72,
    "v8": "7.5"
  },
  "12.8.1": {
    "node_abi": 72,
    "v8": "7.5"
  },
  "12.9.0": {
    "node_abi": 72,
    "v8": "7.6"
  },
  "12.9.1": {
    "node_abi": 72,
    "v8": "7.6"
  },
  "12.10.0": {
    "node_abi": 72,
    "v8": "7.6"
  },
  "12.11.0": {
    "node_abi": 72,
    "v8": "7.7"
  },
  "12.11.1": {
    "node_abi": 72,
    "v8": "7.7"
  },
  "12.12.0": {
    "node_abi": 72,
    "v8": "7.7"
  },
  "12.13.0": {
    "node_abi": 72,
    "v8": "7.7"
  },
  "12.13.1": {
    "node_abi": 72,
    "v8": "7.7"
  },
  "12.14.0": {
    "node_abi": 72,
    "v8": "7.7"
  },
  "12.14.1": {
    "node_abi": 72,
    "v8": "7.7"
  },
  "12.15.0": {
    "node_abi": 72,
    "v8": "7.7"
  },
  "12.16.0": {
    "node_abi": 72,
    "v8": "7.8"
  },
  "12.16.1": {
    "node_abi": 72,
    "v8": "7.8"
  },
  "12.16.2": {
    "node_abi": 72,
    "v8": "7.8"
  },
  "12.16.3": {
    "node_abi": 72,
    "v8": "7.8"
  },
  "12.17.0": {
    "node_abi": 72,
    "v8": "7.8"
  },
  "12.18.0": {
    "node_abi": 72,
    "v8": "7.8"
  },
  "12.18.1": {
    "node_abi": 72,
    "v8": "7.8"
  },
  "12.18.2": {
    "node_abi": 72,
    "v8": "7.8"
  },
  "12.18.3": {
    "node_abi": 72,
    "v8": "7.8"
  },
  "12.18.4": {
    "node_abi": 72,
    "v8": "7.8"
  },
  "12.19.0": {
    "node_abi": 72,
    "v8": "7.8"
  },
  "12.19.1": {
    "node_abi": 72,
    "v8": "7.8"
  },
  "12.20.0": {
    "node_abi": 72,
    "v8": "7.8"
  },
  "12.20.1": {
    "node_abi": 72,
    "v8": "7.8"
  },
  "12.20.2": {
    "node_abi": 72,
    "v8": "7.8"
  },
  "12.21.0": {
    "node_abi": 72,
    "v8": "7.8"
  },
  "12.22.0": {
    "node_abi": 72,
    "v8": "7.8"
  },
  "12.22.1": {
    "node_abi": 72,
    "v8": "7.8"
  },
  "12.22.2": {
    "node_abi": 72,
    "v8": "7.8"
  },
  "12.22.3": {
    "node_abi": 72,
    "v8": "7.8"
  },
  "12.22.4": {
    "node_abi": 72,
    "v8": "7.8"
  },
  "12.22.5": {
    "node_abi": 72,
    "v8": "7.8"
  },
  "12.22.6": {
    "node_abi": 72,
    "v8": "7.8"
  },
  "12.22.7": {
    "node_abi": 72,
    "v8": "7.8"
  },
  "13.0.0": {
    "node_abi": 79,
    "v8": "7.8"
  },
  "13.0.1": {
    "node_abi": 79,
    "v8": "7.8"
  },
  "13.1.0": {
    "node_abi": 79,
    "v8": "7.8"
  },
  "13.2.0": {
    "node_abi": 79,
    "v8": "7.9"
  },
  "13.3.0": {
    "node_abi": 79,
    "v8": "7.9"
  },
  "13.4.0": {
    "node_abi": 79,
    "v8": "7.9"
  },
  "13.5.0": {
    "node_abi": 79,
    "v8": "7.9"
  },
  "13.6.0": {
    "node_abi": 79,
    "v8": "7.9"
  },
  "13.7.0": {
    "node_abi": 79,
    "v8": "7.9"
  },
  "13.8.0": {
    "node_abi": 79,
    "v8": "7.9"
  },
  "13.9.0": {
    "node_abi": 79,
    "v8": "7.9"
  },
  "13.10.0": {
    "node_abi": 79,
    "v8": "7.9"
  },
  "13.10.1": {
    "node_abi": 79,
    "v8": "7.9"
  },
  "13.11.0": {
    "node_abi": 79,
    "v8": "7.9"
  },
  "13.12.0": {
    "node_abi": 79,
    "v8": "7.9"
  },
  "13.13.0": {
    "node_abi": 79,
    "v8": "7.9"
  },
  "13.14.0": {
    "node_abi": 79,
    "v8": "7.9"
  },
  "14.0.0": {
    "node_abi": 83,
    "v8": "8.1"
  },
  "14.1.0": {
    "node_abi": 83,
    "v8": "8.1"
  },
  "14.2.0": {
    "node_abi": 83,
    "v8": "8.1"
  },
  "14.3.0": {
    "node_abi": 83,
    "v8": "8.1"
  },
  "14.4.0": {
    "node_abi": 83,
    "v8": "8.1"
  },
  "14.5.0": {
    "node_abi": 83,
    "v8": "8.3"
  },
  "14.6.0": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "14.7.0": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "14.8.0": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "14.9.0": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "14.10.0": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "14.10.1": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "14.11.0": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "14.12.0": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "14.13.0": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "14.13.1": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "14.14.0": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "14.15.0": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "14.15.1": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "14.15.2": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "14.15.3": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "14.15.4": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "14.15.5": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "14.16.0": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "14.16.1": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "14.17.0": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "14.17.1": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "14.17.2": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "14.17.3": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "14.17.4": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "14.17.5": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "14.17.6": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "14.18.0": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "14.18.1": {
    "node_abi": 83,
    "v8": "8.4"
  },
  "15.0.0": {
    "node_abi": 88,
    "v8": "8.6"
  },
  "15.0.1": {
    "node_abi": 88,
    "v8": "8.6"
  },
  "15.1.0": {
    "node_abi": 88,
    "v8": "8.6"
  },
  "15.2.0": {
    "node_abi": 88,
    "v8": "8.6"
  },
  "15.2.1": {
    "node_abi": 88,
    "v8": "8.6"
  },
  "15.3.0": {
    "node_abi": 88,
    "v8": "8.6"
  },
  "15.4.0": {
    "node_abi": 88,
    "v8": "8.6"
  },
  "15.5.0": {
    "node_abi": 88,
    "v8": "8.6"
  },
  "15.5.1": {
    "node_abi": 88,
    "v8": "8.6"
  },
  "15.6.0": {
    "node_abi": 88,
    "v8": "8.6"
  },
  "15.7.0": {
    "node_abi": 88,
    "v8": "8.6"
  },
  "15.8.0": {
    "node_abi": 88,
    "v8": "8.6"
  },
  "15.9.0": {
    "node_abi": 88,
    "v8": "8.6"
  },
  "15.10.0": {
    "node_abi": 88,
    "v8": "8.6"
  },
  "15.11.0": {
    "node_abi": 88,
    "v8": "8.6"
  },
  "15.12.0": {
    "node_abi": 88,
    "v8": "8.6"
  },
  "15.13.0": {
    "node_abi": 88,
    "v8": "8.6"
  },
  "15.14.0": {
    "node_abi": 88,
    "v8": "8.6"
  },
  "16.0.0": {
    "node_abi": 93,
    "v8": "9.0"
  },
  "16.1.0": {
    "node_abi": 93,
    "v8": "9.0"
  },
  "16.2.0": {
    "node_abi": 93,
    "v8": "9.0"
  },
  "16.3.0": {
    "node_abi": 93,
    "v8": "9.0"
  },
  "16.4.0": {
    "node_abi": 93,
    "v8": "9.1"
  },
  "16.4.1": {
    "node_abi": 93,
    "v8": "9.1"
  },
  "16.4.2": {
    "node_abi": 93,
    "v8": "9.1"
  },
  "16.5.0": {
    "node_abi": 93,
    "v8": "9.1"
  },
  "16.6.0": {
    "node_abi": 93,
    "v8": "9.2"
  },
  "16.6.1": {
    "node_abi": 93,
    "v8": "9.2"
  },
  "16.6.2": {
    "node_abi": 93,
    "v8": "9.2"
  },
  "16.7.0": {
    "node_abi": 93,
    "v8": "9.2"
  },
  "16.8.0": {
    "node_abi": 93,
    "v8": "9.2"
  },
  "16.9.0": {
    "node_abi": 93,
    "v8": "9.3"
  },
  "16.9.1": {
    "node_abi": 93,
    "v8": "9.3"
  },
  "16.10.0": {
    "node_abi": 93,
    "v8": "9.3"
  },
  "16.11.0": {
    "node_abi": 93,
    "v8": "9.4"
  },
  "16.11.1": {
    "node_abi": 93,
    "v8": "9.4"
  },
  "16.12.0": {
    "node_abi": 93,
    "v8": "9.4"
  },
  "16.13.0": {
    "node_abi": 93,
    "v8": "9.4"
  },
  "17.0.0": {
    "node_abi": 102,
    "v8": "9.5"
  },
  "17.0.1": {
    "node_abi": 102,
    "v8": "9.5"
  },
  "17.1.0": {
    "node_abi": 102,
    "v8": "9.5"
  }
}'use strict';

module.exports = exports;

const fs = require('fs');
const path = require('path');
const win = process.platform === 'win32';
const existsSync = fs.existsSync || path.existsSync;
const cp = require('child_process');

// try to build up the complete path to node-gyp
/* priority:
  - node-gyp on ENV:npm_config_node_gyp (https://github.com/npm/npm/pull/4887)
  - node-gyp on NODE_PATH
  - node-gyp inside npm on NODE_PATH (ignore on iojs)
  - node-gyp inside npm beside node exe
*/
function which_node_gyp() {
  let node_gyp_bin;
  if (process.env.npm_config_node_gyp) {
    try {
      node_gyp_bin = process.env.npm_config_node_gyp;
      if (existsSync(node_gyp_bin)) {
        return node_gyp_bin;
      }
    } catch (err) {
      // do nothing
    }
  }
  try {
    const node_gyp_main = require.resolve('node-gyp'); // eslint-disable-line node/no-missing-require
    node_gyp_bin = path.join(path.dirname(
      path.dirname(node_gyp_main)),
    'bin/node-gyp.js');
    if (existsSync(node_gyp_bin)) {
      return node_gyp_bin;
    }
  } catch (err) {
    // do nothing
  }
  if (process.execPath.indexOf('iojs') === -1) {
    try {
      const npm_main = require.resolve('npm'); // eslint-disable-line node/no-missing-require
      node_gyp_bin = path.join(path.dirname(
        path.dirname(npm_main)),
      'node_modules/node-gyp/bin/node-gyp.js');
      if (existsSync(node_gyp_bin)) {
        return node_gyp_bin;
      }
    } catch (err) {
      // do nothing
    }
  }
  const npm_base = path.join(path.dirname(
    path.dirname(process.execPath)),
  'lib/node_modules/npm/');
  node_gyp_bin = path.join(npm_base, 'node_modules/node-gyp/bin/node-gyp.js');
  if (existsSync(node_gyp_bin)) {
    return node_gyp_bin;
  }
}

module.exports.run_gyp = function(args, opts, callback) {
  let shell_cmd = '';
  const cmd_args = [];
  if (opts.runtime && opts.runtime === 'node-webkit') {
    shell_cmd = 'nw-gyp';
    if (win) shell_cmd += '.cmd';
  } else {
    const node_gyp_path = which_node_gyp();
    if (node_gyp_path) {
      shell_cmd = process.execPath;
      cmd_args.push(node_gyp_path);
    } else {
      shell_cmd = 'node-gyp';
      if (win) shell_cmd += '.cmd';
    }
  }
  const final_args = cmd_args.concat(args);
  const cmd = cp.spawn(shell_cmd, final_args, { cwd: undefined, env: process.env, stdio: [0, 1, 2] });
  cmd.on('error', (err) => {
    if (err) {
      return callback(new Error("Failed to execute '" + shell_cmd + ' ' + final_args.join(' ') + "' (" + err + ')'));
    }
    callback(null, opts);
  });
  cmd.on('close', (code) => {
    if (code && code !== 0) {
      return callback(new Error("Failed to execute '" + shell_cmd + ' ' + final_args.join(' ') + "' (" + code + ')'));
    }
    callback(null, opts);
  });
};
'use strict';

module.exports = exports = handle_gyp_opts;

const versioning = require('./versioning.js');
const napi = require('./napi.js');

/*

Here we gather node-pre-gyp generated options (from versioning) and pass them along to node-gyp.

We massage the args and options slightly to account for differences in what commands mean between
node-pre-gyp and node-gyp (e.g. see the difference between "build" and "rebuild" below)

Keep in mind: the values inside `argv` and `gyp.opts` below are different depending on whether
node-pre-gyp is called directory, or if it is called in a `run-script` phase of npm.

We also try to preserve any command line options that might have been passed to npm or node-pre-gyp.
But this is fairly difficult without passing way to much through. For example `gyp.opts` contains all
the process.env and npm pushes a lot of variables into process.env which node-pre-gyp inherits. So we have
to be very selective about what we pass through.

For example:

`npm install --build-from-source` will give:

argv == [ 'rebuild' ]
gyp.opts.argv == { remain: [ 'install' ],
  cooked: [ 'install', '--fallback-to-build' ],
  original: [ 'install', '--fallback-to-build' ] }

`./bin/node-pre-gyp build` will give:

argv == []
gyp.opts.argv == { remain: [ 'build' ],
  cooked: [ 'build' ],
  original: [ '-C', 'test/app1', 'build' ] }

*/

// select set of node-pre-gyp versioning info
// to share with node-gyp
const share_with_node_gyp = [
  'module',
  'module_name',
  'module_path',
  'napi_version',
  'node_abi_napi',
  'napi_build_version',
  'node_napi_label'
];

function handle_gyp_opts(gyp, argv, callback) {

  // Collect node-pre-gyp specific variables to pass to node-gyp
  const node_pre_gyp_options = [];
  // generate custom node-pre-gyp versioning info
  const napi_build_version = napi.get_napi_build_version_from_command_args(argv);
  const opts = versioning.evaluate(gyp.package_json, gyp.opts, napi_build_version);
  share_with_node_gyp.forEach((key) => {
    const val = opts[key];
    if (val) {
      node_pre_gyp_options.push('--' + key + '=' + val);
    } else if (key === 'napi_build_version') {
      node_pre_gyp_options.push('--' + key + '=0');
    } else {
      if (key !== 'napi_version' && key !== 'node_abi_napi')
        return callback(new Error('Option ' + key + ' required but not found by node-pre-gyp'));
    }
  });

  // Collect options that follow the special -- which disables nopt parsing
  const unparsed_options = [];
  let double_hyphen_found = false;
  gyp.opts.argv.original.forEach((opt) => {
    if (double_hyphen_found) {
      unparsed_options.push(opt);
    }
    if (opt === '--') {
      double_hyphen_found = true;
    }
  });

  // We try respect and pass through remaining command
  // line options (like --foo=bar) to node-gyp
  const cooked = gyp.opts.argv.cooked;
  const node_gyp_options = [];
  cooked.forEach((value) => {
    if (value.length > 2 && value.slice(0, 2) === '--') {
      const key = value.slice(2);
      const val = cooked[cooked.indexOf(value) + 1];
      if (val && val.indexOf('--') === -1) { // handle '--foo=bar' or ['--foo','bar']
        node_gyp_options.push('--' + key + '=' + val);
      } else { // pass through --foo
        node_gyp_options.push(value);
      }
    }
  });

  const result = { 'opts': opts, 'gyp': node_gyp_options, 'pre': node_pre_gyp_options, 'unparsed': unparsed_options };
  return callback(null, result);
}
'use strict';

const fs = require('fs');

module.exports = exports;

const versionArray = process.version
  .substr(1)
  .replace(/-.*$/, '')
  .split('.')
  .map((item) => {
    return +item;
  });

const napi_multiple_commands = [
  'build',
  'clean',
  'configure',
  'package',
  'publish',
  'reveal',
  'testbinary',
  'testpackage',
  'unpublish'
];

const napi_build_version_tag = 'napi_build_version=';

module.exports.get_napi_version = function() {
  // returns the non-zero numeric napi version or undefined if napi is not supported.
  // correctly supporting target requires an updated cross-walk
  let version = process.versions.napi; // can be undefined
  if (!version) { // this code should never need to be updated
    if (versionArray[0] === 9 && versionArray[1] >= 3) version = 2; // 9.3.0+
    else if (versionArray[0] === 8) version = 1; // 8.0.0+
  }
  return version;
};

module.exports.get_napi_version_as_string = function(target) {
  // returns the napi version as a string or an empty string if napi is not supported.
  const version = module.exports.get_napi_version(target);
  return version ? '' + version : '';
};

module.exports.validate_package_json = function(package_json, opts) { // throws Error

  const binary = package_json.binary;
  const module_path_ok = pathOK(binary.module_path);
  const remote_path_ok = pathOK(binary.remote_path);
  const package_name_ok = pathOK(binary.package_name);
  const napi_build_versions = module.exports.get_napi_build_versions(package_json, opts, true);
  const napi_build_versions_raw = module.exports.get_napi_build_versions_raw(package_json);

  if (napi_build_versions) {
    napi_build_versions.forEach((napi_build_version)=> {
      if (!(parseInt(napi_build_version, 10) === napi_build_version && napi_build_version > 0)) {
        throw new Error('All values specified in napi_versions must be positive integers.');
      }
    });
  }

  if (napi_build_versions && (!module_path_ok || (!remote_path_ok && !package_name_ok))) {
    throw new Error('When napi_versions is specified; module_path and either remote_path or ' +
			"package_name must contain the substitution string '{napi_build_version}`.");
  }

  if ((module_path_ok || remote_path_ok || package_name_ok) && !napi_build_versions_raw) {
    throw new Error("When the substitution string '{napi_build_version}` is specified in " +
			'module_path, remote_path, or package_name; napi_versions must also be specified.');
  }

  if (napi_build_versions && !module.exports.get_best_napi_build_version(package_json, opts) &&
	module.exports.build_napi_only(package_json)) {
    throw new Error(
      'The Node-API version of this Node instance is ' + module.exports.get_napi_version(opts ? opts.target : undefined) + '. ' +
			'This module supports Node-API version(s) ' + module.exports.get_napi_build_versions_raw(package_json) + '. ' +
			'This Node instance cannot run this module.');
  }

  if (napi_build_versions_raw && !napi_build_versions && module.exports.build_napi_only(package_json)) {
    throw new Error(
      'The Node-API version of this Node instance is ' + module.exports.get_napi_version(opts ? opts.target : undefined) + '. ' +
			'This module supports Node-API version(s) ' + module.exports.get_napi_build_versions_raw(package_json) + '. ' +
			'This Node instance cannot run this module.');
  }

};

function pathOK(path) {
  return path && (path.indexOf('{napi_build_version}') !== -1 || path.indexOf('{node_napi_label}') !== -1);
}

module.exports.expand_commands = function(package_json, opts, commands) {
  const expanded_commands = [];
  const napi_build_versions = module.exports.get_napi_build_versions(package_json, opts);
  commands.forEach((command)=> {
    if (napi_build_versions && command.name === 'install') {
      const napi_build_version = module.exports.get_best_napi_build_version(package_json, opts);
      const args = napi_build_version ? [napi_build_version_tag + napi_build_version] : [];
      expanded_commands.push({ name: command.name, args: args });
    } else if (napi_build_versions && napi_multiple_commands.indexOf(command.name) !== -1) {
      napi_build_versions.forEach((napi_build_version)=> {
        const args = command.args.slice();
        args.push(napi_build_version_tag + napi_build_version);
        expanded_commands.push({ name: command.name, args: args });
      });
    } else {
      expanded_commands.push(command);
    }
  });
  return expanded_commands;
};

module.exports.get_napi_build_versions = function(package_json, opts, warnings) { // opts may be undefined
  const log = require('npmlog');
  let napi_build_versions = [];
  const supported_napi_version = module.exports.get_napi_version(opts ? opts.target : undefined);
  // remove duplicates, verify each napi version can actaully be built
  if (package_json.binary && package_json.binary.napi_versions) {
    package_json.binary.napi_versions.forEach((napi_version) => {
      const duplicated = napi_build_versions.indexOf(napi_version) !== -1;
      if (!duplicated && supported_napi_version && napi_version <= supported_napi_version) {
        napi_build_versions.push(napi_version);
      } else if (warnings && !duplicated && supported_napi_version) {
        log.info('This Node instance does not support builds for Node-API version', napi_version);
      }
    });
  }
  if (opts && opts['build-latest-napi-version-only']) {
    let latest_version = 0;
    napi_build_versions.forEach((napi_version) => {
      if (napi_version > latest_version) latest_version = napi_version;
    });
    napi_build_versions = latest_version ? [latest_version] : [];
  }
  return napi_build_versions.length ? napi_build_versions : undefined;
};

module.exports.get_napi_build_versions_raw = function(package_json) {
  const napi_build_versions = [];
  // remove duplicates
  if (package_json.binary && package_json.binary.napi_versions) {
    package_json.binary.napi_versions.forEach((napi_version) => {
      if (napi_build_versions.indexOf(napi_version) === -1) {
        napi_build_versions.push(napi_version);
      }
    });
  }
  return napi_build_versions.length ? napi_build_versions : undefined;
};

module.exports.get_command_arg = function(napi_build_version) {
  return napi_build_version_tag + napi_build_version;
};

module.exports.get_napi_build_version_from_command_args = function(command_args) {
  for (let i = 0; i < command_args.length; i++) {
    const arg = command_args[i];
    if (arg.indexOf(napi_build_version_tag) === 0) {
      return parseInt(arg.substr(napi_build_version_tag.length), 10);
    }
  }
  return undefined;
};

module.exports.swap_build_dir_out = function(napi_build_version) {
  if (napi_build_version) {
    const rm = require('rimraf');
    rm.sync(module.exports.get_build_dir(napi_build_version));
    fs.renameSync('build', module.exports.get_build_dir(napi_build_version));
  }
};

module.exports.swap_build_dir_in = function(napi_build_version) {
  if (napi_build_version) {
    const rm = require('rimraf');
    rm.sync('build');
    fs.renameSync(module.exports.get_build_dir(napi_build_version), 'build');
  }
};

module.exports.get_build_dir = function(napi_build_version) {
  return 'build-tmp-napi-v' + napi_build_version;
};

module.exports.get_best_napi_build_version = function(package_json, opts) {
  let best_napi_build_version = 0;
  const napi_build_versions = module.exports.get_napi_build_versions(package_json, opts);
  if (napi_build_versions) {
    const our_napi_version = module.exports.get_napi_version(opts ? opts.target : undefined);
    napi_build_versions.forEach((napi_build_version)=> {
      if (napi_build_version > best_napi_build_version &&
				napi_build_version <= our_napi_version) {
        best_napi_build_version = napi_build_version;
      }
    });
  }
  return best_napi_build_version === 0 ? undefined : best_napi_build_version;
};

module.exports.build_napi_only = function(package_json) {
  return package_json.binary && package_json.binary.package_name &&
	package_json.binary.package_name.indexOf('{node_napi_label}') === -1;
};
'use strict';

module.exports = exports;

const url = require('url');
const fs = require('fs');
const path = require('path');

module.exports.detect = function(opts, config) {
  const to = opts.hosted_path;
  const uri = url.parse(to);
  config.prefix = (!uri.pathname || uri.pathname === '/') ? '' : uri.pathname.replace('/', '');
  if (opts.bucket && opts.region) {
    config.bucket = opts.bucket;
    config.region = opts.region;
    config.endpoint = opts.host;
    config.s3ForcePathStyle = opts.s3ForcePathStyle;
  } else {
    const parts = uri.hostname.split('.s3');
    const bucket = parts[0];
    if (!bucket) {
      return;
    }
    if (!config.bucket) {
      config.bucket = bucket;
    }
    if (!config.region) {
      const region = parts[1].slice(1).split('.')[0];
      if (region === 'amazonaws') {
        config.region = 'us-east-1';
      } else {
        config.region = region;
      }
    }
  }
};

module.exports.get_s3 = function(config) {

  if (process.env.node_pre_gyp_mock_s3) {
    // here we're mocking. node_pre_gyp_mock_s3 is the scratch directory
    // for the mock code.
    const AWSMock = require('mock-aws-s3');
    const os = require('os');

    AWSMock.config.basePath = `${os.tmpdir()}/mock`;

    const s3 = AWSMock.S3();

    // wrapped callback maker. fs calls return code of ENOENT but AWS.S3 returns
    // NotFound.
    const wcb = (fn) => (err, ...args) => {
      if (err && err.code === 'ENOENT') {
        err.code = 'NotFound';
      }
      return fn(err, ...args);
    };

    return {
      listObjects(params, callback) {
        return s3.listObjects(params, wcb(callback));
      },
      headObject(params, callback) {
        return s3.headObject(params, wcb(callback));
      },
      deleteObject(params, callback) {
        return s3.deleteObject(params, wcb(callback));
      },
      putObject(params, callback) {
        return s3.putObject(params, wcb(callback));
      }
    };
  }

  // if not mocking then setup real s3.
  const AWS = require('aws-sdk');

  AWS.config.update(config);
  const s3 = new AWS.S3();

  // need to change if additional options need to be specified.
  return {
    listObjects(params, callback) {
      return s3.listObjects(params, callback);
    },
    headObject(params, callback) {
      return s3.headObject(params, callback);
    },
    deleteObject(params, callback) {
      return s3.deleteObject(params, callback);
    },
    putObject(params, callback) {
      return s3.putObject(params, callback);
    }
  };



};

//
// function to get the mocking control function. if not mocking it returns a no-op.
//
// if mocking it sets up the mock http interceptors that use the mocked s3 file system
// to fulfill reponses.
module.exports.get_mockS3Http = function() {
  let mock_s3 = false;
  if (!process.env.node_pre_gyp_mock_s3) {
    return () => mock_s3;
  }

  const nock = require('nock');
  // the bucket used for testing, as addressed by https.
  const host = 'https://mapbox-node-pre-gyp-public-testing-bucket.s3.us-east-1.amazonaws.com';
  const mockDir = process.env.node_pre_gyp_mock_s3 + '/mapbox-node-pre-gyp-public-testing-bucket';

  // function to setup interceptors. they are "turned off" by setting mock_s3 to false.
  const mock_http = () => {
    // eslint-disable-next-line no-unused-vars
    function get(uri, requestBody) {
      const filepath = path.join(mockDir, uri.replace('%2B', '+'));

      try {
        fs.accessSync(filepath, fs.constants.R_OK);
      } catch (e) {
        return [404, 'not found\n'];
      }

      // the mock s3 functions just write to disk, so just read from it.
      return [200, fs.createReadStream(filepath)];
    }

    // eslint-disable-next-line no-unused-vars
    return nock(host)
      .persist()
      .get(() => mock_s3) // mock any uri for s3 when true
      .reply(get);
  };

  // setup interceptors. they check the mock_s3 flag to determine whether to intercept.
  mock_http(nock, host, mockDir);
  // function to turn matching all requests to s3 on/off.
  const mockS3Http = (action) => {
    const previous = mock_s3;
    if (action === 'off') {
      mock_s3 = false;
    } else if (action === 'on') {
      mock_s3 = true;
    } else if (action !== 'get') {
      throw new Error(`illegal action for setMockHttp ${action}`);
    }
    return previous;
  };

  // call mockS3Http with the argument
  // - 'on' - turn it on
  // - 'off' - turn it off (used by fetch.test.js so it doesn't interfere with redirects)
  // - 'get' - return true or false for 'on' or 'off'
  return mockS3Http;
};



'use strict';

module.exports = exports;

const path = require('path');
const semver = require('semver');
const url = require('url');
const detect_libc = require('detect-libc');
const napi = require('./napi.js');

let abi_crosswalk;

// This is used for unit testing to provide a fake
// ABI crosswalk that emulates one that is not updated
// for the current version
if (process.env.NODE_PRE_GYP_ABI_CROSSWALK) {
  abi_crosswalk = require(process.env.NODE_PRE_GYP_ABI_CROSSWALK);
} else {
  abi_crosswalk = require('./abi_crosswalk.json');
}

const major_versions = {};
Object.keys(abi_crosswalk).forEach((v) => {
  const major = v.split('.')[0];
  if (!major_versions[major]) {
    major_versions[major] = v;
  }
});

function get_electron_abi(runtime, target_version) {
  if (!runtime) {
    throw new Error('get_electron_abi requires valid runtime arg');
  }
  if (typeof target_version === 'undefined') {
    // erroneous CLI call
    throw new Error('Empty target version is not supported if electron is the target.');
  }
  // Electron guarantees that patch version update won't break native modules.
  const sem_ver = semver.parse(target_version);
  return runtime + '-v' + sem_ver.major + '.' + sem_ver.minor;
}
module.exports.get_electron_abi = get_electron_abi;

function get_node_webkit_abi(runtime, target_version) {
  if (!runtime) {
    throw new Error('get_node_webkit_abi requires valid runtime arg');
  }
  if (typeof target_version === 'undefined') {
    // erroneous CLI call
    throw new Error('Empty target version is not supported if node-webkit is the target.');
  }
  return runtime + '-v' + target_version;
}
module.exports.get_node_webkit_abi = get_node_webkit_abi;

function get_node_abi(runtime, versions) {
  if (!runtime) {
    throw new Error('get_node_abi requires valid runtime arg');
  }
  if (!versions) {
    throw new Error('get_node_abi requires valid process.versions object');
  }
  const sem_ver = semver.parse(versions.node);
  if (sem_ver.major === 0 && sem_ver.minor % 2) { // odd series
    // https://github.com/mapbox/node-pre-gyp/issues/124
    return runtime + '-v' + versions.node;
  } else {
    // process.versions.modules added in >= v0.10.4 and v0.11.7
    // https://github.com/joyent/node/commit/ccabd4a6fa8a6eb79d29bc3bbe9fe2b6531c2d8e
    return versions.modules ? runtime + '-v' + (+versions.modules) :
      'v8-' + versions.v8.split('.').slice(0, 2).join('.');
  }
}
module.exports.get_node_abi = get_node_abi;

function get_runtime_abi(runtime, target_version) {
  if (!runtime) {
    throw new Error('get_runtime_abi requires valid runtime arg');
  }
  if (runtime === 'node-webkit') {
    return get_node_webkit_abi(runtime, target_version || process.versions['node-webkit']);
  } else if (runtime === 'electron') {
    return get_electron_abi(runtime, target_version || process.versions.electron);
  } else {
    if (runtime !== 'node') {
      throw new Error("Unknown Runtime: '" + runtime + "'");
    }
    if (!target_version) {
      return get_node_abi(runtime, process.versions);
    } else {
      let cross_obj;
      // abi_crosswalk generated with ./scripts/abi_crosswalk.js
      if (abi_crosswalk[target_version]) {
        cross_obj = abi_crosswalk[target_version];
      } else {
        const target_parts = target_version.split('.').map((i) => { return +i; });
        if (target_parts.length !== 3) { // parse failed
          throw new Error('Unknown target version: ' + target_version);
        }
        /*
                    The below code tries to infer the last known ABI compatible version
                    that we have recorded in the abi_crosswalk.json when an exact match
                    is not possible. The reasons for this to exist are complicated:

                       - We support passing --target to be able to allow developers to package binaries for versions of node
                         that are not the same one as they are running. This might also be used in combination with the
                         --target_arch or --target_platform flags to also package binaries for alternative platforms
                       - When --target is passed we can't therefore determine the ABI (process.versions.modules) from the node
                         version that is running in memory
                       - So, therefore node-pre-gyp keeps an "ABI crosswalk" (lib/util/abi_crosswalk.json) to be able to look
                         this info up for all versions
                       - But we cannot easily predict what the future ABI will be for released versions
                       - And node-pre-gyp needs to be a `bundledDependency` in apps that depend on it in order to work correctly
                         by being fully available at install time.
                       - So, the speed of node releases and the bundled nature of node-pre-gyp mean that a new node-pre-gyp release
                         need to happen for every node.js/io.js/node-webkit/nw.js/atom-shell/etc release that might come online if
                         you want the `--target` flag to keep working for the latest version
                       - Which is impractical ^^
                       - Hence the below code guesses about future ABI to make the need to update node-pre-gyp less demanding.

                    In practice then you can have a dependency of your app like `node-sqlite3` that bundles a `node-pre-gyp` that
                    only knows about node v0.10.33 in the `abi_crosswalk.json` but target node v0.10.34 (which is assumed to be
                    ABI compatible with v0.10.33).

                    TODO: use semver module instead of custom version parsing
                */
        const major = target_parts[0];
        let minor = target_parts[1];
        let patch = target_parts[2];
        // io.js: yeah if node.js ever releases 1.x this will break
        // but that is unlikely to happen: https://github.com/iojs/io.js/pull/253#issuecomment-69432616
        if (major === 1) {
          // look for last release that is the same major version
          // e.g. we assume io.js 1.x is ABI compatible with >= 1.0.0
          while (true) {
            if (minor > 0) --minor;
            if (patch > 0) --patch;
            const new_iojs_target = '' + major + '.' + minor + '.' + patch;
            if (abi_crosswalk[new_iojs_target]) {
              cross_obj = abi_crosswalk[new_iojs_target];
              console.log('Warning: node-pre-gyp could not find exact match for ' + target_version);
              console.log('Warning: but node-pre-gyp successfully choose ' + new_iojs_target + ' as ABI compatible target');
              break;
            }
            if (minor === 0 && patch === 0) {
              break;
            }
          }
        } else if (major >= 2) {
          // look for last release that is the same major version
          if (major_versions[major]) {
            cross_obj = abi_crosswalk[major_versions[major]];
            console.log('Warning: node-pre-gyp could not find exact match for ' + target_version);
            console.log('Warning: but node-pre-gyp successfully choose ' + major_versions[major] + ' as ABI compatible target');
          }
        } else if (major === 0) { // node.js
          if (target_parts[1] % 2 === 0) { // for stable/even node.js series
            // look for the last release that is the same minor release
            // e.g. we assume node 0.10.x is ABI compatible with >= 0.10.0
            while (--patch > 0) {
              const new_node_target = '' + major + '.' + minor + '.' + patch;
              if (abi_crosswalk[new_node_target]) {
                cross_obj = abi_crosswalk[new_node_target];
                console.log('Warning: node-pre-gyp could not find exact match for ' + target_version);
                console.log('Warning: but node-pre-gyp successfully choose ' + new_node_target + ' as ABI compatible target');
                break;
              }
            }
          }
        }
      }
      if (!cross_obj) {
        throw new Error('Unsupported target version: ' + target_version);
      }
      // emulate process.versions
      const versions_obj = {
        node: target_version,
        v8: cross_obj.v8 + '.0',
        // abi_crosswalk uses 1 for node versions lacking process.versions.modules
        // process.versions.modules added in >= v0.10.4 and v0.11.7
        modules: cross_obj.node_abi > 1 ? cross_obj.node_abi : undefined
      };
      return get_node_abi(runtime, versions_obj);
    }
  }
}
module.exports.get_runtime_abi = get_runtime_abi;

const required_parameters = [
  'module_name',
  'module_path',
  'host'
];

function validate_config(package_json, opts) {
  const msg = package_json.name + ' package.json is not node-pre-gyp ready:\n';
  const missing = [];
  if (!package_json.main) {
    missing.push('main');
  }
  if (!package_json.version) {
    missing.push('version');
  }
  if (!package_json.name) {
    missing.push('name');
  }
  if (!package_json.binary) {
    missing.push('binary');
  }
  const o = package_json.binary;
  if (o) {
    required_parameters.forEach((p) => {
      if (!o[p] || typeof o[p] !== 'string') {
        missing.push('binary.' + p);
      }
    });
  }

  if (missing.length >= 1) {
    throw new Error(msg + 'package.json must declare these properties: \n' + missing.join('\n'));
  }
  if (o) {
    // enforce https over http
    const protocol = url.parse(o.host).protocol;
    if (protocol === 'http:') {
      throw new Error("'host' protocol (" + protocol + ") is invalid - only 'https:' is accepted");
    }
  }
  napi.validate_package_json(package_json, opts);
}

module.exports.validate_config = validate_config;

function eval_template(template, opts) {
  Object.keys(opts).forEach((key) => {
    const pattern = '{' + key + '}';
    while (template.indexOf(pattern) > -1) {
      template = template.replace(pattern, opts[key]);
    }
  });
  return template;
}

// url.resolve needs single trailing slash
// to behave correctly, otherwise a double slash
// may end up in the url which breaks requests
// and a lacking slash may not lead to proper joining
function fix_slashes(pathname) {
  if (pathname.slice(-1) !== '/') {
    return pathname + '/';
  }
  return pathname;
}

// remove double slashes
// note: path.normalize will not work because
// it will convert forward to back slashes
function drop_double_slashes(pathname) {
  return pathname.replace(/\/\//g, '/');
}

function get_process_runtime(versions) {
  let runtime = 'node';
  if (versions['node-webkit']) {
    runtime = 'node-webkit';
  } else if (versions.electron) {
    runtime = 'electron';
  }
  return runtime;
}

module.exports.get_process_runtime = get_process_runtime;

const default_package_name = '{module_name}-v{version}-{node_abi}-{platform}-{arch}.tar.gz';
const default_remote_path = '';

module.exports.evaluate = function(package_json, options, napi_build_version) {
  options = options || {};
  validate_config(package_json, options); // options is a suitable substitute for opts in this case
  const v = package_json.version;
  const module_version = semver.parse(v);
  const runtime = options.runtime || get_process_runtime(process.versions);
  const opts = {
    name: package_json.name,
    configuration: options.debug ? 'Debug' : 'Release',
    debug: options.debug,
    module_name: package_json.binary.module_name,
    version: module_version.version,
    prerelease: module_version.prerelease.length ? module_version.prerelease.join('.') : '',
    build: module_version.build.length ? module_version.build.join('.') : '',
    major: module_version.major,
    minor: module_version.minor,
    patch: module_version.patch,
    runtime: runtime,
    node_abi: get_runtime_abi(runtime, options.target),
    node_abi_napi: napi.get_napi_version(options.target) ? 'napi' : get_runtime_abi(runtime, options.target),
    napi_version: napi.get_napi_version(options.target), // non-zero numeric, undefined if unsupported
    napi_build_version: napi_build_version || '',
    node_napi_label: napi_build_version ? 'napi-v' + napi_build_version : get_runtime_abi(runtime, options.target),
    target: options.target || '',
    platform: options.target_platform || process.platform,
    target_platform: options.target_platform || process.platform,
    arch: options.target_arch || process.arch,
    target_arch: options.target_arch || process.arch,
    libc: options.target_libc || detect_libc.familySync() || 'unknown',
    module_main: package_json.main,
    toolset: options.toolset || '', // address https://github.com/mapbox/node-pre-gyp/issues/119
    bucket: package_json.binary.bucket,
    region: package_json.binary.region,
    s3ForcePathStyle: package_json.binary.s3ForcePathStyle || false
  };
    // support host mirror with npm config `--{module_name}_binary_host_mirror`
    // e.g.: https://github.com/node-inspector/v8-profiler/blob/master/package.json#L25
    // > npm install v8-profiler --profiler_binary_host_mirror=https://npm.taobao.org/mirrors/node-inspector/
  const validModuleName = opts.module_name.replace('-', '_');
  const host = process.env['npm_config_' + validModuleName + '_binary_host_mirror'] || package_json.binary.host;
  opts.host = fix_slashes(eval_template(host, opts));
  opts.module_path = eval_template(package_json.binary.module_path, opts);
  // now we resolve the module_path to ensure it is absolute so that binding.gyp variables work predictably
  if (options.module_root) {
    // resolve relative to known module root: works for pre-binding require
    opts.module_path = path.join(options.module_root, opts.module_path);
  } else {
    // resolve relative to current working directory: works for node-pre-gyp commands
    opts.module_path = path.resolve(opts.module_path);
  }
  opts.module = path.join(opts.module_path, opts.module_name + '.node');
  opts.remote_path = package_json.binary.remote_path ? drop_double_slashes(fix_slashes(eval_template(package_json.binary.remote_path, opts))) : default_remote_path;
  const package_name = package_json.binary.package_name ? package_json.binary.package_name : default_package_name;
  opts.package_name = eval_template(package_name, opts);
  opts.staged_tarball = path.join('build/stage', opts.remote_path, opts.package_name);
  opts.hosted_path = url.resolve(opts.host, opts.remote_path);
  opts.hosted_tarball = url.resolve(opts.hosted_path, opts.package_name);
  return opts;
};
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Node-webkit-based module test</title>
<script>
function nwModuleTest(){
   var util = require('util');
   var moduleFolder = require('nw.gui').App.argv[0];
   try {
      require(moduleFolder);
   } catch(e) {
      if( process.platform !== 'win32' ){
         util.log('nw-pre-gyp error:');
         util.log(e.stack);
      }
      process.exit(1);
   }
   process.exit(0);
}
</script>
</head>
<body onload="nwModuleTest()">
<h1>Node-webkit-based module test</h1>
</body>
</html>
{
"main": "index.html",
"name": "nw-pre-gyp-module-test",
"description": "Node-webkit-based module test.",
"version": "0.0.1",
"window": {
   "show": false
}
}
#!/usr/bin/env node
'use strict';

require('../lib/main');
@echo off
node  "%~dp0\node-pre-gyp" %*
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
{
  "name": "@opentelemetry/api",
  "version": "1.1.0",
  "description": "Public API for OpenTelemetry",
  "main": "build/src/index.js",
  "module": "build/esm/index.js",
  "types": "build/src/index.d.ts",
  "browser": {
    "./src/platform/index.ts": "./src/platform/browser/index.ts",
    "./build/esm/platform/index.js": "./build/esm/platform/browser/index.js",
    "./build/src/platform/index.js": "./build/src/platform/browser/index.js"
  },
  "repository": "https://github.com/open-telemetry/opentelemetry-js-api.git",
  "author": "OpenTelemetry Authors",
  "license": "Apache-2.0",
  "engines": {
    "node": ">=8.0.0"
  },
  "files": [
    "build/esm/**/*.js",
    "build/esm/**/*.js.map",
    "build/esm/**/*.d.ts",
    "build/src/**/*.js",
    "build/src/**/*.js.map",
    "build/src/**/*.d.ts",
    "LICENSE",
    "README.md"
  ],
  "publishConfig": {
    "access": "public"
  },
  "devDependencies": {
    "@types/mocha": "8.2.2",
    "@types/node": "14.17.4",
    "@types/sinon": "10.0.2",
    "@types/webpack-env": "1.16.0",
    "@typescript-eslint/eslint-plugin": "5.0.0",
    "@typescript-eslint/parser": "5.0.0",
    "codecov": "3.8.2",
    "dpdm": "3.7.1",
    "eslint": "7.32.0",
    "eslint-plugin-header": "3.1.1",
    "eslint-plugin-node": "11.1.0",
    "gh-pages": "3.2.0",
    "istanbul-instrumenter-loader": "3.0.1",
    "karma": "5.2.3",
    "karma-chrome-launcher": "3.1.0",
    "karma-coverage-istanbul-reporter": "3.0.3",
    "karma-mocha": "2.0.1",
    "karma-spec-reporter": "0.0.32",
    "karma-webpack": "4.0.2",
    "lerna-changelog": "1.0.1",
    "linkinator": "2.13.6",
    "mocha": "7.2.0",
    "nyc": "15.1.0",
    "sinon": "11.1.1",
    "ts-loader": "8.2.0",
    "ts-mocha": "8.0.0",
    "typedoc": "0.21.2",
    "typescript": "4.3.5",
    "webpack": "4.46.0"
  }
}"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.diag = exports.propagation = exports.trace = exports.context = exports.INVALID_SPAN_CONTEXT = exports.INVALID_TRACEID = exports.INVALID_SPANID = exports.isValidSpanId = exports.isValidTraceId = exports.isSpanContextValid = exports.createTraceState = exports.baggageEntryMetadataFromString = void 0;
__exportStar(require("./baggage/types"), exports);
var utils_1 = require("./baggage/utils");
Object.defineProperty(exports, "baggageEntryMetadataFromString", { enumerable: true, get: function () { return utils_1.baggageEntryMetadataFromString; } });
__exportStar(require("./common/Exception"), exports);
__exportStar(require("./common/Time"), exports);
__exportStar(require("./common/Attributes"), exports);
__exportStar(require("./diag"), exports);
__exportStar(require("./propagation/TextMapPropagator"), exports);
__exportStar(require("./trace/attributes"), exports);
__exportStar(require("./trace/link"), exports);
__exportStar(require("./trace/ProxyTracer"), exports);
__exportStar(require("./trace/ProxyTracerProvider"), exports);
__exportStar(require("./trace/Sampler"), exports);
__exportStar(require("./trace/SamplingResult"), exports);
__exportStar(require("./trace/span_context"), exports);
__exportStar(require("./trace/span_kind"), exports);
__exportStar(require("./trace/span"), exports);
__exportStar(require("./trace/SpanOptions"), exports);
__exportStar(require("./trace/status"), exports);
__exportStar(require("./trace/trace_flags"), exports);
__exportStar(require("./trace/trace_state"), exports);
var utils_2 = require("./trace/internal/utils");
Object.defineProperty(exports, "createTraceState", { enumerable: true, get: function () { return utils_2.createTraceState; } });
__exportStar(require("./trace/tracer_provider"), exports);
__exportStar(require("./trace/tracer"), exports);
__exportStar(require("./trace/tracer_options"), exports);
var spancontext_utils_1 = require("./trace/spancontext-utils");
Object.defineProperty(exports, "isSpanContextValid", { enumerable: true, get: function () { return spancontext_utils_1.isSpanContextValid; } });
Object.defineProperty(exports, "isValidTraceId", { enumerable: true, get: function () { return spancontext_utils_1.isValidTraceId; } });
Object.defineProperty(exports, "isValidSpanId", { enumerable: true, get: function () { return spancontext_utils_1.isValidSpanId; } });
var invalid_span_constants_1 = require("./trace/invalid-span-constants");
Object.defineProperty(exports, "INVALID_SPANID", { enumerable: true, get: function () { return invalid_span_constants_1.INVALID_SPANID; } });
Object.defineProperty(exports, "INVALID_TRACEID", { enumerable: true, get: function () { return invalid_span_constants_1.INVALID_TRACEID; } });
Object.defineProperty(exports, "INVALID_SPAN_CONTEXT", { enumerable: true, get: function () { return invalid_span_constants_1.INVALID_SPAN_CONTEXT; } });
__exportStar(require("./context/context"), exports);
__exportStar(require("./context/types"), exports);
var context_1 = require("./api/context");
/** Entrypoint for context API */
exports.context = context_1.ContextAPI.getInstance();
var trace_1 = require("./api/trace");
/** Entrypoint for trace API */
exports.trace = trace_1.TraceAPI.getInstance();
var propagation_1 = require("./api/propagation");
/** Entrypoint for propagation API */
exports.propagation = propagation_1.PropagationAPI.getInstance();
var diag_1 = require("./api/diag");
/**
 * Entrypoint for Diag API.
 * Defines Diagnostic handler used for internal diagnostic logging operations.
 * The default provides a Noop DiagLogger implementation which may be changed via the
 * diag.setLogger(logger: DiagLogger) function.
 */
exports.diag = diag_1.DiagAPI.instance();
exports.default = {
    trace: exports.trace,
    context: exports.context,
    propagation: exports.propagation,
    diag: exports.diag,
};
//# sourceMappingURL=index.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.VERSION = void 0;
// this is autogenerated file, see scripts/version-update.js
exports.VERSION = '1.1.0';
//# sourceMappingURL=version.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.NonRecordingSpan = void 0;
var invalid_span_constants_1 = require("./invalid-span-constants");
/**
 * The NonRecordingSpan is the default {@link Span} that is used when no Span
 * implementation is available. All operations are no-op including context
 * propagation.
 */
var NonRecordingSpan = /** @class */ (function () {
    function NonRecordingSpan(_spanContext) {
        if (_spanContext === void 0) { _spanContext = invalid_span_constants_1.INVALID_SPAN_CONTEXT; }
        this._spanContext = _spanContext;
    }
    // Returns a SpanContext.
    NonRecordingSpan.prototype.spanContext = function () {
        return this._spanContext;
    };
    // By default does nothing
    NonRecordingSpan.prototype.setAttribute = function (_key, _value) {
        return this;
    };
    // By default does nothing
    NonRecordingSpan.prototype.setAttributes = function (_attributes) {
        return this;
    };
    // By default does nothing
    NonRecordingSpan.prototype.addEvent = function (_name, _attributes) {
        return this;
    };
    // By default does nothing
    NonRecordingSpan.prototype.setStatus = function (_status) {
        return this;
    };
    // By default does nothing
    NonRecordingSpan.prototype.updateName = function (_name) {
        return this;
    };
    // By default does nothing
    NonRecordingSpan.prototype.end = function (_endTime) { };
    // isRecording always returns false for NonRecordingSpan.
    NonRecordingSpan.prototype.isRecording = function () {
        return false;
    };
    // By default does nothing
    NonRecordingSpan.prototype.recordException = function (_exception, _time) { };
    return NonRecordingSpan;
}());
exports.NonRecordingSpan = NonRecordingSpan;
//# sourceMappingURL=NonRecordingSpan.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.NoopTracer = void 0;
var context_1 = require("../api/context");
var context_utils_1 = require("../trace/context-utils");
var NonRecordingSpan_1 = require("./NonRecordingSpan");
var spancontext_utils_1 = require("./spancontext-utils");
var context = context_1.ContextAPI.getInstance();
/**
 * No-op implementations of {@link Tracer}.
 */
var NoopTracer = /** @class */ (function () {
    function NoopTracer() {
    }
    // startSpan starts a noop span.
    NoopTracer.prototype.startSpan = function (name, options, context) {
        var root = Boolean(options === null || options === void 0 ? void 0 : options.root);
        if (root) {
            return new NonRecordingSpan_1.NonRecordingSpan();
        }
        var parentFromContext = context && context_utils_1.getSpanContext(context);
        if (isSpanContext(parentFromContext) &&
            spancontext_utils_1.isSpanContextValid(parentFromContext)) {
            return new NonRecordingSpan_1.NonRecordingSpan(parentFromContext);
        }
        else {
            return new NonRecordingSpan_1.NonRecordingSpan();
        }
    };
    NoopTracer.prototype.startActiveSpan = function (name, arg2, arg3, arg4) {
        var opts;
        var ctx;
        var fn;
        if (arguments.length < 2) {
            return;
        }
        else if (arguments.length === 2) {
            fn = arg2;
        }
        else if (arguments.length === 3) {
            opts = arg2;
            fn = arg3;
        }
        else {
            opts = arg2;
            ctx = arg3;
            fn = arg4;
        }
        var parentContext = ctx !== null && ctx !== void 0 ? ctx : context.active();
        var span = this.startSpan(name, opts, parentContext);
        var contextWithSpanSet = context_utils_1.setSpan(parentContext, span);
        return context.with(contextWithSpanSet, fn, undefined, span);
    };
    return NoopTracer;
}());
exports.NoopTracer = NoopTracer;
function isSpanContext(spanContext) {
    return (typeof spanContext === 'object' &&
        typeof spanContext['spanId'] === 'string' &&
        typeof spanContext['traceId'] === 'string' &&
        typeof spanContext['traceFlags'] === 'number');
}
//# sourceMappingURL=NoopTracer.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.NoopTracerProvider = void 0;
var NoopTracer_1 = require("./NoopTracer");
/**
 * An implementation of the {@link TracerProvider} which returns an impotent
 * Tracer for all calls to `getTracer`.
 *
 * All operations are no-op.
 */
var NoopTracerProvider = /** @class */ (function () {
    function NoopTracerProvider() {
    }
    NoopTracerProvider.prototype.getTracer = function (_name, _version, _options) {
        return new NoopTracer_1.NoopTracer();
    };
    return NoopTracerProvider;
}());
exports.NoopTracerProvider = NoopTracerProvider;
//# sourceMappingURL=NoopTracerProvider.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.ProxyTracer = void 0;
var NoopTracer_1 = require("./NoopTracer");
var NOOP_TRACER = new NoopTracer_1.NoopTracer();
/**
 * Proxy tracer provided by the proxy tracer provider
 */
var ProxyTracer = /** @class */ (function () {
    function ProxyTracer(_provider, name, version, options) {
        this._provider = _provider;
        this.name = name;
        this.version = version;
        this.options = options;
    }
    ProxyTracer.prototype.startSpan = function (name, options, context) {
        return this._getTracer().startSpan(name, options, context);
    };
    ProxyTracer.prototype.startActiveSpan = function (_name, _options, _context, _fn) {
        var tracer = this._getTracer();
        return Reflect.apply(tracer.startActiveSpan, tracer, arguments);
    };
    /**
     * Try to get a tracer from the proxy tracer provider.
     * If the proxy tracer provider has no delegate, return a noop tracer.
     */
    ProxyTracer.prototype._getTracer = function () {
        if (this._delegate) {
            return this._delegate;
        }
        var tracer = this._provider.getDelegateTracer(this.name, this.version, this.options);
        if (!tracer) {
            return NOOP_TRACER;
        }
        this._delegate = tracer;
        return this._delegate;
    };
    return ProxyTracer;
}());
exports.ProxyTracer = ProxyTracer;
//# sourceMappingURL=ProxyTracer.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.ProxyTracerProvider = void 0;
var ProxyTracer_1 = require("./ProxyTracer");
var NoopTracerProvider_1 = require("./NoopTracerProvider");
var NOOP_TRACER_PROVIDER = new NoopTracerProvider_1.NoopTracerProvider();
/**
 * Tracer provider which provides {@link ProxyTracer}s.
 *
 * Before a delegate is set, tracers provided are NoOp.
 *   When a delegate is set, traces are provided from the delegate.
 *   When a delegate is set after tracers have already been provided,
 *   all tracers already provided will use the provided delegate implementation.
 */
var ProxyTracerProvider = /** @class */ (function () {
    function ProxyTracerProvider() {
    }
    /**
     * Get a {@link ProxyTracer}
     */
    ProxyTracerProvider.prototype.getTracer = function (name, version, options) {
        var _a;
        return ((_a = this.getDelegateTracer(name, version, options)) !== null && _a !== void 0 ? _a : new ProxyTracer_1.ProxyTracer(this, name, version, options));
    };
    ProxyTracerProvider.prototype.getDelegate = function () {
        var _a;
        return (_a = this._delegate) !== null && _a !== void 0 ? _a : NOOP_TRACER_PROVIDER;
    };
    /**
     * Set the delegate tracer provider
     */
    ProxyTracerProvider.prototype.setDelegate = function (delegate) {
        this._delegate = delegate;
    };
    ProxyTracerProvider.prototype.getDelegateTracer = function (name, version, options) {
        var _a;
        return (_a = this._delegate) === null || _a === void 0 ? void 0 : _a.getTracer(name, version, options);
    };
    return ProxyTracerProvider;
}());
exports.ProxyTracerProvider = ProxyTracerProvider;
//# sourceMappingURL=ProxyTracerProvider.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=Sampler.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.SamplingDecision = void 0;
/**
 * A sampling decision that determines how a {@link Span} will be recorded
 * and collected.
 */
var SamplingDecision;
(function (SamplingDecision) {
    /**
     * `Span.isRecording() === false`, span will not be recorded and all events
     * and attributes will be dropped.
     */
    SamplingDecision[SamplingDecision["NOT_RECORD"] = 0] = "NOT_RECORD";
    /**
     * `Span.isRecording() === true`, but `Sampled` flag in {@link TraceFlags}
     * MUST NOT be set.
     */
    SamplingDecision[SamplingDecision["RECORD"] = 1] = "RECORD";
    /**
     * `Span.isRecording() === true` AND `Sampled` flag in {@link TraceFlags}
     * MUST be set.
     */
    SamplingDecision[SamplingDecision["RECORD_AND_SAMPLED"] = 2] = "RECORD_AND_SAMPLED";
})(SamplingDecision = exports.SamplingDecision || (exports.SamplingDecision = {}));
//# sourceMappingURL=SamplingResult.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=SpanOptions.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=attributes.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.getSpanContext = exports.setSpanContext = exports.deleteSpan = exports.setSpan = exports.getSpan = void 0;
var context_1 = require("../context/context");
var NonRecordingSpan_1 = require("./NonRecordingSpan");
/**
 * span key
 */
var SPAN_KEY = context_1.createContextKey('OpenTelemetry Context Key SPAN');
/**
 * Return the span if one exists
 *
 * @param context context to get span from
 */
function getSpan(context) {
    return context.getValue(SPAN_KEY) || undefined;
}
exports.getSpan = getSpan;
/**
 * Set the span on a context
 *
 * @param context context to use as parent
 * @param span span to set active
 */
function setSpan(context, span) {
    return context.setValue(SPAN_KEY, span);
}
exports.setSpan = setSpan;
/**
 * Remove current span stored in the context
 *
 * @param context context to delete span from
 */
function deleteSpan(context) {
    return context.deleteValue(SPAN_KEY);
}
exports.deleteSpan = deleteSpan;
/**
 * Wrap span context in a NoopSpan and set as span in a new
 * context
 *
 * @param context context to set active span on
 * @param spanContext span context to be wrapped
 */
function setSpanContext(context, spanContext) {
    return setSpan(context, new NonRecordingSpan_1.NonRecordingSpan(spanContext));
}
exports.setSpanContext = setSpanContext;
/**
 * Get the span context of the span if it exists.
 *
 * @param context context to get values from
 */
function getSpanContext(context) {
    var _a;
    return (_a = getSpan(context)) === null || _a === void 0 ? void 0 : _a.spanContext();
}
exports.getSpanContext = getSpanContext;
//# sourceMappingURL=context-utils.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.INVALID_SPAN_CONTEXT = exports.INVALID_TRACEID = exports.INVALID_SPANID = void 0;
var trace_flags_1 = require("./trace_flags");
exports.INVALID_SPANID = '0000000000000000';
exports.INVALID_TRACEID = '00000000000000000000000000000000';
exports.INVALID_SPAN_CONTEXT = {
    traceId: exports.INVALID_TRACEID,
    spanId: exports.INVALID_SPANID,
    traceFlags: trace_flags_1.TraceFlags.NONE,
};
//# sourceMappingURL=invalid-span-constants.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=link.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=span.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=span_context.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SpanKind = void 0;
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
var SpanKind;
(function (SpanKind) {
    /** Default value. Indicates that the span is used internally. */
    SpanKind[SpanKind["INTERNAL"] = 0] = "INTERNAL";
    /**
     * Indicates that the span covers server-side handling of an RPC or other
     * remote request.
     */
    SpanKind[SpanKind["SERVER"] = 1] = "SERVER";
    /**
     * Indicates that the span covers the client-side wrapper around an RPC or
     * other remote request.
     */
    SpanKind[SpanKind["CLIENT"] = 2] = "CLIENT";
    /**
     * Indicates that the span describes producer sending a message to a
     * broker. Unlike client and server, there is no direct critical path latency
     * relationship between producer and consumer spans.
     */
    SpanKind[SpanKind["PRODUCER"] = 3] = "PRODUCER";
    /**
     * Indicates that the span describes consumer receiving a message from a
     * broker. Unlike client and server, there is no direct critical path latency
     * relationship between producer and consumer spans.
     */
    SpanKind[SpanKind["CONSUMER"] = 4] = "CONSUMER";
})(SpanKind = exports.SpanKind || (exports.SpanKind = {}));
//# sourceMappingURL=span_kind.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.wrapSpanContext = exports.isSpanContextValid = exports.isValidSpanId = exports.isValidTraceId = void 0;
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
var invalid_span_constants_1 = require("./invalid-span-constants");
var NonRecordingSpan_1 = require("./NonRecordingSpan");
var VALID_TRACEID_REGEX = /^([0-9a-f]{32})$/i;
var VALID_SPANID_REGEX = /^[0-9a-f]{16}$/i;
function isValidTraceId(traceId) {
    return VALID_TRACEID_REGEX.test(traceId) && traceId !== invalid_span_constants_1.INVALID_TRACEID;
}
exports.isValidTraceId = isValidTraceId;
function isValidSpanId(spanId) {
    return VALID_SPANID_REGEX.test(spanId) && spanId !== invalid_span_constants_1.INVALID_SPANID;
}
exports.isValidSpanId = isValidSpanId;
/**
 * Returns true if this {@link SpanContext} is valid.
 * @return true if this {@link SpanContext} is valid.
 */
function isSpanContextValid(spanContext) {
    return (isValidTraceId(spanContext.traceId) && isValidSpanId(spanContext.spanId));
}
exports.isSpanContextValid = isSpanContextValid;
/**
 * Wrap the given {@link SpanContext} in a new non-recording {@link Span}
 *
 * @param spanContext span context to be wrapped
 * @returns a new non-recording {@link Span} with the provided context
 */
function wrapSpanContext(spanContext) {
    return new NonRecordingSpan_1.NonRecordingSpan(spanContext);
}
exports.wrapSpanContext = wrapSpanContext;
//# sourceMappingURL=spancontext-utils.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SpanStatusCode = void 0;
/**
 * An enumeration of status codes.
 */
var SpanStatusCode;
(function (SpanStatusCode) {
    /**
     * The default status.
     */
    SpanStatusCode[SpanStatusCode["UNSET"] = 0] = "UNSET";
    /**
     * The operation has been validated by an Application developer or
     * Operator to have completed successfully.
     */
    SpanStatusCode[SpanStatusCode["OK"] = 1] = "OK";
    /**
     * The operation contains an error.
     */
    SpanStatusCode[SpanStatusCode["ERROR"] = 2] = "ERROR";
})(SpanStatusCode = exports.SpanStatusCode || (exports.SpanStatusCode = {}));
//# sourceMappingURL=status.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TraceFlags = void 0;
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
var TraceFlags;
(function (TraceFlags) {
    /** Represents no flag set. */
    TraceFlags[TraceFlags["NONE"] = 0] = "NONE";
    /** Bit to represent whether trace is sampled in trace flags. */
    TraceFlags[TraceFlags["SAMPLED"] = 1] = "SAMPLED";
})(TraceFlags = exports.TraceFlags || (exports.TraceFlags = {}));
//# sourceMappingURL=trace_flags.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=trace_state.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=tracer.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=tracer_options.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=tracer_provider.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.TraceStateImpl = void 0;
var tracestate_validators_1 = require("./tracestate-validators");
var MAX_TRACE_STATE_ITEMS = 32;
var MAX_TRACE_STATE_LEN = 512;
var LIST_MEMBERS_SEPARATOR = ',';
var LIST_MEMBER_KEY_VALUE_SPLITTER = '=';
/**
 * TraceState must be a class and not a simple object type because of the spec
 * requirement (https://www.w3.org/TR/trace-context/#tracestate-field).
 *
 * Here is the list of allowed mutations:
 * - New key-value pair should be added into the beginning of the list
 * - The value of any key can be updated. Modified keys MUST be moved to the
 * beginning of the list.
 */
var TraceStateImpl = /** @class */ (function () {
    function TraceStateImpl(rawTraceState) {
        this._internalState = new Map();
        if (rawTraceState)
            this._parse(rawTraceState);
    }
    TraceStateImpl.prototype.set = function (key, value) {
        // TODO: Benchmark the different approaches(map vs list) and
        // use the faster one.
        var traceState = this._clone();
        if (traceState._internalState.has(key)) {
            traceState._internalState.delete(key);
        }
        traceState._internalState.set(key, value);
        return traceState;
    };
    TraceStateImpl.prototype.unset = function (key) {
        var traceState = this._clone();
        traceState._internalState.delete(key);
        return traceState;
    };
    TraceStateImpl.prototype.get = function (key) {
        return this._internalState.get(key);
    };
    TraceStateImpl.prototype.serialize = function () {
        var _this = this;
        return this._keys()
            .reduce(function (agg, key) {
            agg.push(key + LIST_MEMBER_KEY_VALUE_SPLITTER + _this.get(key));
            return agg;
        }, [])
            .join(LIST_MEMBERS_SEPARATOR);
    };
    TraceStateImpl.prototype._parse = function (rawTraceState) {
        if (rawTraceState.length > MAX_TRACE_STATE_LEN)
            return;
        this._internalState = rawTraceState
            .split(LIST_MEMBERS_SEPARATOR)
            .reverse() // Store in reverse so new keys (.set(...)) will be placed at the beginning
            .reduce(function (agg, part) {
            var listMember = part.trim(); // Optional Whitespace (OWS) handling
            var i = listMember.indexOf(LIST_MEMBER_KEY_VALUE_SPLITTER);
            if (i !== -1) {
                var key = listMember.slice(0, i);
                var value = listMember.slice(i + 1, part.length);
                if (tracestate_validators_1.validateKey(key) && tracestate_validators_1.validateValue(value)) {
                    agg.set(key, value);
                }
                else {
                    // TODO: Consider to add warning log
                }
            }
            return agg;
        }, new Map());
        // Because of the reverse() requirement, trunc must be done after map is created
        if (this._internalState.size > MAX_TRACE_STATE_ITEMS) {
            this._internalState = new Map(Array.from(this._internalState.entries())
                .reverse() // Use reverse same as original tracestate parse chain
                .slice(0, MAX_TRACE_STATE_ITEMS));
        }
    };
    TraceStateImpl.prototype._keys = function () {
        return Array.from(this._internalState.keys()).reverse();
    };
    TraceStateImpl.prototype._clone = function () {
        var traceState = new TraceStateImpl();
        traceState._internalState = new Map(this._internalState);
        return traceState;
    };
    return TraceStateImpl;
}());
exports.TraceStateImpl = TraceStateImpl;
//# sourceMappingURL=tracestate-impl.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateValue = exports.validateKey = void 0;
var VALID_KEY_CHAR_RANGE = '[_0-9a-z-*/]';
var VALID_KEY = "[a-z]" + VALID_KEY_CHAR_RANGE + "{0,255}";
var VALID_VENDOR_KEY = "[a-z0-9]" + VALID_KEY_CHAR_RANGE + "{0,240}@[a-z]" + VALID_KEY_CHAR_RANGE + "{0,13}";
var VALID_KEY_REGEX = new RegExp("^(?:" + VALID_KEY + "|" + VALID_VENDOR_KEY + ")$");
var VALID_VALUE_BASE_REGEX = /^[ -~]{0,255}[!-~]$/;
var INVALID_VALUE_COMMA_EQUAL_REGEX = /,|=/;
/**
 * Key is opaque string up to 256 characters printable. It MUST begin with a
 * lowercase letter, and can only contain lowercase letters a-z, digits 0-9,
 * underscores _, dashes -, asterisks *, and forward slashes /.
 * For multi-tenant vendor scenarios, an at sign (@) can be used to prefix the
 * vendor name. Vendors SHOULD set the tenant ID at the beginning of the key.
 * see https://www.w3.org/TR/trace-context/#key
 */
function validateKey(key) {
    return VALID_KEY_REGEX.test(key);
}
exports.validateKey = validateKey;
/**
 * Value is opaque string up to 256 characters printable ASCII RFC0020
 * characters (i.e., the range 0x20 to 0x7E) except comma , and =.
 */
function validateValue(value) {
    return (VALID_VALUE_BASE_REGEX.test(value) &&
        !INVALID_VALUE_COMMA_EQUAL_REGEX.test(value));
}
exports.validateValue = validateValue;
//# sourceMappingURL=tracestate-validators.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.createTraceState = void 0;
var tracestate_impl_1 = require("./tracestate-impl");
function createTraceState(rawTraceState) {
    return new tracestate_impl_1.TraceStateImpl(rawTraceState);
}
exports.createTraceState = createTraceState;
//# sourceMappingURL=utils.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.NoopTextMapPropagator = void 0;
/**
 * No-op implementations of {@link TextMapPropagator}.
 */
var NoopTextMapPropagator = /** @class */ (function () {
    function NoopTextMapPropagator() {
    }
    /** Noop inject function does nothing */
    NoopTextMapPropagator.prototype.inject = function (_context, _carrier) { };
    /** Noop extract function does nothing and returns the input context */
    NoopTextMapPropagator.prototype.extract = function (context, _carrier) {
        return context;
    };
    NoopTextMapPropagator.prototype.fields = function () {
        return [];
    };
    return NoopTextMapPropagator;
}());
exports.NoopTextMapPropagator = NoopTextMapPropagator;
//# sourceMappingURL=NoopTextMapPropagator.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.defaultTextMapSetter = exports.defaultTextMapGetter = void 0;
exports.defaultTextMapGetter = {
    get: function (carrier, key) {
        if (carrier == null) {
            return undefined;
        }
        return carrier[key];
    },
    keys: function (carrier) {
        if (carrier == null) {
            return [];
        }
        return Object.keys(carrier);
    },
};
exports.defaultTextMapSetter = {
    set: function (carrier, key, value) {
        if (carrier == null) {
            return;
        }
        carrier[key] = value;
    },
};
//# sourceMappingURL=TextMapPropagator.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
__exportStar(require("./node"), exports);
//# sourceMappingURL=index.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports._globalThis = void 0;
/** only globals that common to node and browsers are allowed */
// eslint-disable-next-line node/no-unsupported-features/es-builtins
exports._globalThis = typeof globalThis === 'object' ? globalThis : global;
//# sourceMappingURL=globalThis.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
__exportStar(require("./globalThis"), exports);
//# sourceMappingURL=index.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports._globalThis = void 0;
// Updates to this file should also be replicated to @opentelemetry/api-metrics and
// @opentelemetry/core too.
/**
 * - globalThis (New standard)
 * - self (Will return the current window instance for supported browsers)
 * - window (fallback for older browser implementations)
 * - global (NodeJS implementation)
 * - <object> (When all else fails)
 */
/** only globals that common to node and browsers are allowed */
// eslint-disable-next-line node/no-unsupported-features/es-builtins, no-undef
exports._globalThis = typeof globalThis === 'object' ? globalThis :
    typeof self === 'object' ? self :
        typeof window === 'object' ? window :
            typeof global === 'object' ? global :
                {};
//# sourceMappingURL=globalThis.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
__exportStar(require("./globalThis"), exports);
//# sourceMappingURL=index.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.unregisterGlobal = exports.getGlobal = exports.registerGlobal = void 0;
var platform_1 = require("../platform");
var version_1 = require("../version");
var semver_1 = require("./semver");
var major = version_1.VERSION.split('.')[0];
var GLOBAL_OPENTELEMETRY_API_KEY = Symbol.for("opentelemetry.js.api." + major);
var _global = platform_1._globalThis;
function registerGlobal(type, instance, diag, allowOverride) {
    var _a;
    if (allowOverride === void 0) { allowOverride = false; }
    var api = (_global[GLOBAL_OPENTELEMETRY_API_KEY] = (_a = _global[GLOBAL_OPENTELEMETRY_API_KEY]) !== null && _a !== void 0 ? _a : {
        version: version_1.VERSION,
    });
    if (!allowOverride && api[type]) {
        // already registered an API of this type
        var err = new Error("@opentelemetry/api: Attempted duplicate registration of API: " + type);
        diag.error(err.stack || err.message);
        return false;
    }
    if (api.version !== version_1.VERSION) {
        // All registered APIs must be of the same version exactly
        var err = new Error('@opentelemetry/api: All API registration versions must match');
        diag.error(err.stack || err.message);
        return false;
    }
    api[type] = instance;
    diag.debug("@opentelemetry/api: Registered a global for " + type + " v" + version_1.VERSION + ".");
    return true;
}
exports.registerGlobal = registerGlobal;
function getGlobal(type) {
    var _a, _b;
    var globalVersion = (_a = _global[GLOBAL_OPENTELEMETRY_API_KEY]) === null || _a === void 0 ? void 0 : _a.version;
    if (!globalVersion || !semver_1.isCompatible(globalVersion)) {
        return;
    }
    return (_b = _global[GLOBAL_OPENTELEMETRY_API_KEY]) === null || _b === void 0 ? void 0 : _b[type];
}
exports.getGlobal = getGlobal;
function unregisterGlobal(type, diag) {
    diag.debug("@opentelemetry/api: Unregistering a global for " + type + " v" + version_1.VERSION + ".");
    var api = _global[GLOBAL_OPENTELEMETRY_API_KEY];
    if (api) {
        delete api[type];
    }
}
exports.unregisterGlobal = unregisterGlobal;
//# sourceMappingURL=global-utils.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.isCompatible = exports._makeCompatibilityCheck = void 0;
var version_1 = require("../version");
var re = /^(\d+)\.(\d+)\.(\d+)(-(.+))?$/;
/**
 * Create a function to test an API version to see if it is compatible with the provided ownVersion.
 *
 * The returned function has the following semantics:
 * - Exact match is always compatible
 * - Major versions must match exactly
 *    - 1.x package cannot use global 2.x package
 *    - 2.x package cannot use global 1.x package
 * - The minor version of the API module requesting access to the global API must be less than or equal to the minor version of this API
 *    - 1.3 package may use 1.4 global because the later global contains all functions 1.3 expects
 *    - 1.4 package may NOT use 1.3 global because it may try to call functions which don't exist on 1.3
 * - If the major version is 0, the minor version is treated as the major and the patch is treated as the minor
 * - Patch and build tag differences are not considered at this time
 *
 * @param ownVersion version which should be checked against
 */
function _makeCompatibilityCheck(ownVersion) {
    var acceptedVersions = new Set([ownVersion]);
    var rejectedVersions = new Set();
    var myVersionMatch = ownVersion.match(re);
    if (!myVersionMatch) {
        // we cannot guarantee compatibility so we always return noop
        return function () { return false; };
    }
    var ownVersionParsed = {
        major: +myVersionMatch[1],
        minor: +myVersionMatch[2],
        patch: +myVersionMatch[3],
        prerelease: myVersionMatch[4],
    };
    // if ownVersion has a prerelease tag, versions must match exactly
    if (ownVersionParsed.prerelease != null) {
        return function isExactmatch(globalVersion) {
            return globalVersion === ownVersion;
        };
    }
    function _reject(v) {
        rejectedVersions.add(v);
        return false;
    }
    function _accept(v) {
        acceptedVersions.add(v);
        return true;
    }
    return function isCompatible(globalVersion) {
        if (acceptedVersions.has(globalVersion)) {
            return true;
        }
        if (rejectedVersions.has(globalVersion)) {
            return false;
        }
        var globalVersionMatch = globalVersion.match(re);
        if (!globalVersionMatch) {
            // cannot parse other version
            // we cannot guarantee compatibility so we always noop
            return _reject(globalVersion);
        }
        var globalVersionParsed = {
            major: +globalVersionMatch[1],
            minor: +globalVersionMatch[2],
            patch: +globalVersionMatch[3],
            prerelease: globalVersionMatch[4],
        };
        // if globalVersion has a prerelease tag, versions must match exactly
        if (globalVersionParsed.prerelease != null) {
            return _reject(globalVersion);
        }
        // major versions must match
        if (ownVersionParsed.major !== globalVersionParsed.major) {
            return _reject(globalVersion);
        }
        if (ownVersionParsed.major === 0) {
            if (ownVersionParsed.minor === globalVersionParsed.minor &&
                ownVersionParsed.patch <= globalVersionParsed.patch) {
                return _accept(globalVersion);
            }
            return _reject(globalVersion);
        }
        if (ownVersionParsed.minor <= globalVersionParsed.minor) {
            return _accept(globalVersion);
        }
        return _reject(globalVersion);
    };
}
exports._makeCompatibilityCheck = _makeCompatibilityCheck;
/**
 * Test an API version to see if it is compatible with this API.
 *
 * - Exact match is always compatible
 * - Major versions must match exactly
 *    - 1.x package cannot use global 2.x package
 *    - 2.x package cannot use global 1.x package
 * - The minor version of the API module requesting access to the global API must be less than or equal to the minor version of this API
 *    - 1.3 package may use 1.4 global because the later global contains all functions 1.3 expects
 *    - 1.4 package may NOT use 1.3 global because it may try to call functions which don't exist on 1.3
 * - If the major version is 0, the minor version is treated as the major and the patch is treated as the minor
 * - Patch and build tag differences are not considered at this time
 *
 * @param version version of the API requesting an instance of the global API
 */
exports.isCompatible = _makeCompatibilityCheck(version_1.VERSION);
//# sourceMappingURL=semver.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.DiagComponentLogger = void 0;
var global_utils_1 = require("../internal/global-utils");
/**
 * Component Logger which is meant to be used as part of any component which
 * will add automatically additional namespace in front of the log message.
 * It will then forward all message to global diag logger
 * @example
 * const cLogger = diag.createComponentLogger({ namespace: '@opentelemetry/instrumentation-http' });
 * cLogger.debug('test');
 * // @opentelemetry/instrumentation-http test
 */
var DiagComponentLogger = /** @class */ (function () {
    function DiagComponentLogger(props) {
        this._namespace = props.namespace || 'DiagComponentLogger';
    }
    DiagComponentLogger.prototype.debug = function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        return logProxy('debug', this._namespace, args);
    };
    DiagComponentLogger.prototype.error = function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        return logProxy('error', this._namespace, args);
    };
    DiagComponentLogger.prototype.info = function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        return logProxy('info', this._namespace, args);
    };
    DiagComponentLogger.prototype.warn = function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        return logProxy('warn', this._namespace, args);
    };
    DiagComponentLogger.prototype.verbose = function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        return logProxy('verbose', this._namespace, args);
    };
    return DiagComponentLogger;
}());
exports.DiagComponentLogger = DiagComponentLogger;
function logProxy(funcName, namespace, args) {
    var logger = global_utils_1.getGlobal('diag');
    // shortcut if logger not set
    if (!logger) {
        return;
    }
    args.unshift(namespace);
    return logger[funcName].apply(logger, args);
}
//# sourceMappingURL=ComponentLogger.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.DiagConsoleLogger = void 0;
var consoleMap = [
    { n: 'error', c: 'error' },
    { n: 'warn', c: 'warn' },
    { n: 'info', c: 'info' },
    { n: 'debug', c: 'debug' },
    { n: 'verbose', c: 'trace' },
];
/**
 * A simple Immutable Console based diagnostic logger which will output any messages to the Console.
 * If you want to limit the amount of logging to a specific level or lower use the
 * {@link createLogLevelDiagLogger}
 */
var DiagConsoleLogger = /** @class */ (function () {
    function DiagConsoleLogger() {
        function _consoleFunc(funcName) {
            return function () {
                var args = [];
                for (var _i = 0; _i < arguments.length; _i++) {
                    args[_i] = arguments[_i];
                }
                if (console) {
                    // Some environments only expose the console when the F12 developer console is open
                    // eslint-disable-next-line no-console
                    var theFunc = console[funcName];
                    if (typeof theFunc !== 'function') {
                        // Not all environments support all functions
                        // eslint-disable-next-line no-console
                        theFunc = console.log;
                    }
                    // One last final check
                    if (typeof theFunc === 'function') {
                        return theFunc.apply(console, args);
                    }
                }
            };
        }
        for (var i = 0; i < consoleMap.length; i++) {
            this[consoleMap[i].n] = _consoleFunc(consoleMap[i].c);
        }
    }
    return DiagConsoleLogger;
}());
exports.DiagConsoleLogger = DiagConsoleLogger;
//# sourceMappingURL=consoleLogger.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
__exportStar(require("./consoleLogger"), exports);
__exportStar(require("./types"), exports);
//# sourceMappingURL=index.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.DiagLogLevel = void 0;
/**
 * Defines the available internal logging levels for the diagnostic logger, the numeric values
 * of the levels are defined to match the original values from the initial LogLevel to avoid
 * compatibility/migration issues for any implementation that assume the numeric ordering.
 */
var DiagLogLevel;
(function (DiagLogLevel) {
    /** Diagnostic Logging level setting to disable all logging (except and forced logs) */
    DiagLogLevel[DiagLogLevel["NONE"] = 0] = "NONE";
    /** Identifies an error scenario */
    DiagLogLevel[DiagLogLevel["ERROR"] = 30] = "ERROR";
    /** Identifies a warning scenario */
    DiagLogLevel[DiagLogLevel["WARN"] = 50] = "WARN";
    /** General informational log message */
    DiagLogLevel[DiagLogLevel["INFO"] = 60] = "INFO";
    /** General debug log message */
    DiagLogLevel[DiagLogLevel["DEBUG"] = 70] = "DEBUG";
    /**
     * Detailed trace level logging should only be used for development, should only be set
     * in a development environment.
     */
    DiagLogLevel[DiagLogLevel["VERBOSE"] = 80] = "VERBOSE";
    /** Used to set the logging level to include all logging */
    DiagLogLevel[DiagLogLevel["ALL"] = 9999] = "ALL";
})(DiagLogLevel = exports.DiagLogLevel || (exports.DiagLogLevel = {}));
//# sourceMappingURL=types.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.createLogLevelDiagLogger = void 0;
var types_1 = require("../types");
function createLogLevelDiagLogger(maxLevel, logger) {
    if (maxLevel < types_1.DiagLogLevel.NONE) {
        maxLevel = types_1.DiagLogLevel.NONE;
    }
    else if (maxLevel > types_1.DiagLogLevel.ALL) {
        maxLevel = types_1.DiagLogLevel.ALL;
    }
    // In case the logger is null or undefined
    logger = logger || {};
    function _filterFunc(funcName, theLevel) {
        var theFunc = logger[funcName];
        if (typeof theFunc === 'function' && maxLevel >= theLevel) {
            return theFunc.bind(logger);
        }
        return function () { };
    }
    return {
        error: _filterFunc('error', types_1.DiagLogLevel.ERROR),
        warn: _filterFunc('warn', types_1.DiagLogLevel.WARN),
        info: _filterFunc('info', types_1.DiagLogLevel.INFO),
        debug: _filterFunc('debug', types_1.DiagLogLevel.DEBUG),
        verbose: _filterFunc('verbose', types_1.DiagLogLevel.VERBOSE),
    };
}
exports.createLogLevelDiagLogger = createLogLevelDiagLogger;
//# sourceMappingURL=logLevelLogger.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.createNoopDiagLogger = void 0;
function noopLogFunction() { }
/**
 * Returns a No-Op Diagnostic logger where all messages do nothing.
 * @implements {@link DiagLogger}
 * @returns {DiagLogger}
 */
function createNoopDiagLogger() {
    return {
        verbose: noopLogFunction,
        debug: noopLogFunction,
        info: noopLogFunction,
        warn: noopLogFunction,
        error: noopLogFunction,
    };
}
exports.createNoopDiagLogger = createNoopDiagLogger;
//# sourceMappingURL=noopLogger.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.NoopContextManager = void 0;
var context_1 = require("./context");
var NoopContextManager = /** @class */ (function () {
    function NoopContextManager() {
    }
    NoopContextManager.prototype.active = function () {
        return context_1.ROOT_CONTEXT;
    };
    NoopContextManager.prototype.with = function (_context, fn, thisArg) {
        var args = [];
        for (var _i = 3; _i < arguments.length; _i++) {
            args[_i - 3] = arguments[_i];
        }
        return fn.call.apply(fn, __spreadArray([thisArg], args));
    };
    NoopContextManager.prototype.bind = function (_context, target) {
        return target;
    };
    NoopContextManager.prototype.enable = function () {
        return this;
    };
    NoopContextManager.prototype.disable = function () {
        return this;
    };
    return NoopContextManager;
}());
exports.NoopContextManager = NoopContextManager;
//# sourceMappingURL=NoopContextManager.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.ROOT_CONTEXT = exports.createContextKey = void 0;
/** Get a key to uniquely identify a context value */
function createContextKey(description) {
    // The specification states that for the same input, multiple calls should
    // return different keys. Due to the nature of the JS dependency management
    // system, this creates problems where multiple versions of some package
    // could hold different keys for the same property.
    //
    // Therefore, we use Symbol.for which returns the same key for the same input.
    return Symbol.for(description);
}
exports.createContextKey = createContextKey;
var BaseContext = /** @class */ (function () {
    /**
     * Construct a new context which inherits values from an optional parent context.
     *
     * @param parentContext a context from which to inherit values
     */
    function BaseContext(parentContext) {
        // for minification
        var self = this;
        self._currentContext = parentContext ? new Map(parentContext) : new Map();
        self.getValue = function (key) { return self._currentContext.get(key); };
        self.setValue = function (key, value) {
            var context = new BaseContext(self._currentContext);
            context._currentContext.set(key, value);
            return context;
        };
        self.deleteValue = function (key) {
            var context = new BaseContext(self._currentContext);
            context._currentContext.delete(key);
            return context;
        };
    }
    return BaseContext;
}());
/** The root context is used as the default parent context when there is no active context */
exports.ROOT_CONTEXT = new BaseContext();
//# sourceMappingURL=context.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=types.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=Attributes.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=Exception.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=Time.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.deleteBaggage = exports.setBaggage = exports.getBaggage = void 0;
var context_1 = require("../context/context");
/**
 * Baggage key
 */
var BAGGAGE_KEY = context_1.createContextKey('OpenTelemetry Baggage Key');
/**
 * Retrieve the current baggage from the given context
 *
 * @param {Context} Context that manage all context values
 * @returns {Baggage} Extracted baggage from the context
 */
function getBaggage(context) {
    return context.getValue(BAGGAGE_KEY) || undefined;
}
exports.getBaggage = getBaggage;
/**
 * Store a baggage in the given context
 *
 * @param {Context} Context that manage all context values
 * @param {Baggage} baggage that will be set in the actual context
 */
function setBaggage(context, baggage) {
    return context.setValue(BAGGAGE_KEY, baggage);
}
exports.setBaggage = setBaggage;
/**
 * Delete the baggage stored in the given context
 *
 * @param {Context} Context that manage all context values
 */
function deleteBaggage(context) {
    return context.deleteValue(BAGGAGE_KEY);
}
exports.deleteBaggage = deleteBaggage;
//# sourceMappingURL=context-helpers.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=types.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.baggageEntryMetadataFromString = exports.createBaggage = void 0;
var diag_1 = require("../api/diag");
var baggage_impl_1 = require("./internal/baggage-impl");
var symbol_1 = require("./internal/symbol");
var diag = diag_1.DiagAPI.instance();
/**
 * Create a new Baggage with optional entries
 *
 * @param entries An array of baggage entries the new baggage should contain
 */
function createBaggage(entries) {
    if (entries === void 0) { entries = {}; }
    return new baggage_impl_1.BaggageImpl(new Map(Object.entries(entries)));
}
exports.createBaggage = createBaggage;
/**
 * Create a serializable BaggageEntryMetadata object from a string.
 *
 * @param str string metadata. Format is currently not defined by the spec and has no special meaning.
 *
 */
function baggageEntryMetadataFromString(str) {
    if (typeof str !== 'string') {
        diag.error("Cannot create baggage metadata from unknown type: " + typeof str);
        str = '';
    }
    return {
        __TYPE__: symbol_1.baggageEntryMetadataSymbol,
        toString: function () {
            return str;
        },
    };
}
exports.baggageEntryMetadataFromString = baggageEntryMetadataFromString;
//# sourceMappingURL=utils.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.BaggageImpl = void 0;
var BaggageImpl = /** @class */ (function () {
    function BaggageImpl(entries) {
        this._entries = entries ? new Map(entries) : new Map();
    }
    BaggageImpl.prototype.getEntry = function (key) {
        var entry = this._entries.get(key);
        if (!entry) {
            return undefined;
        }
        return Object.assign({}, entry);
    };
    BaggageImpl.prototype.getAllEntries = function () {
        return Array.from(this._entries.entries()).map(function (_a) {
            var k = _a[0], v = _a[1];
            return [k, v];
        });
    };
    BaggageImpl.prototype.setEntry = function (key, entry) {
        var newBaggage = new BaggageImpl(this._entries);
        newBaggage._entries.set(key, entry);
        return newBaggage;
    };
    BaggageImpl.prototype.removeEntry = function (key) {
        var newBaggage = new BaggageImpl(this._entries);
        newBaggage._entries.delete(key);
        return newBaggage;
    };
    BaggageImpl.prototype.removeEntries = function () {
        var keys = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            keys[_i] = arguments[_i];
        }
        var newBaggage = new BaggageImpl(this._entries);
        for (var _a = 0, keys_1 = keys; _a < keys_1.length; _a++) {
            var key = keys_1[_a];
            newBaggage._entries.delete(key);
        }
        return newBaggage;
    };
    BaggageImpl.prototype.clear = function () {
        return new BaggageImpl();
    };
    return BaggageImpl;
}());
exports.BaggageImpl = BaggageImpl;
//# sourceMappingURL=baggage-impl.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.baggageEntryMetadataSymbol = void 0;
/**
 * Symbol used to make BaggageEntryMetadata an opaque type
 */
exports.baggageEntryMetadataSymbol = Symbol('BaggageEntryMetadata');
//# sourceMappingURL=symbol.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ContextAPI = void 0;
var NoopContextManager_1 = require("../context/NoopContextManager");
var global_utils_1 = require("../internal/global-utils");
var diag_1 = require("./diag");
var API_NAME = 'context';
var NOOP_CONTEXT_MANAGER = new NoopContextManager_1.NoopContextManager();
/**
 * Singleton object which represents the entry point to the OpenTelemetry Context API
 */
var ContextAPI = /** @class */ (function () {
    /** Empty private constructor prevents end users from constructing a new instance of the API */
    function ContextAPI() {
    }
    /** Get the singleton instance of the Context API */
    ContextAPI.getInstance = function () {
        if (!this._instance) {
            this._instance = new ContextAPI();
        }
        return this._instance;
    };
    /**
     * Set the current context manager.
     *
     * @returns true if the context manager was successfully registered, else false
     */
    ContextAPI.prototype.setGlobalContextManager = function (contextManager) {
        return global_utils_1.registerGlobal(API_NAME, contextManager, diag_1.DiagAPI.instance());
    };
    /**
     * Get the currently active context
     */
    ContextAPI.prototype.active = function () {
        return this._getContextManager().active();
    };
    /**
     * Execute a function with an active context
     *
     * @param context context to be active during function execution
     * @param fn function to execute in a context
     * @param thisArg optional receiver to be used for calling fn
     * @param args optional arguments forwarded to fn
     */
    ContextAPI.prototype.with = function (context, fn, thisArg) {
        var _a;
        var args = [];
        for (var _i = 3; _i < arguments.length; _i++) {
            args[_i - 3] = arguments[_i];
        }
        return (_a = this._getContextManager()).with.apply(_a, __spreadArray([context, fn, thisArg], args));
    };
    /**
     * Bind a context to a target function or event emitter
     *
     * @param context context to bind to the event emitter or function. Defaults to the currently active context
     * @param target function or event emitter to bind
     */
    ContextAPI.prototype.bind = function (context, target) {
        return this._getContextManager().bind(context, target);
    };
    ContextAPI.prototype._getContextManager = function () {
        return global_utils_1.getGlobal(API_NAME) || NOOP_CONTEXT_MANAGER;
    };
    /** Disable and remove the global context manager */
    ContextAPI.prototype.disable = function () {
        this._getContextManager().disable();
        global_utils_1.unregisterGlobal(API_NAME, diag_1.DiagAPI.instance());
    };
    return ContextAPI;
}());
exports.ContextAPI = ContextAPI;
//# sourceMappingURL=context.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.DiagAPI = void 0;
var ComponentLogger_1 = require("../diag/ComponentLogger");
var logLevelLogger_1 = require("../diag/internal/logLevelLogger");
var types_1 = require("../diag/types");
var global_utils_1 = require("../internal/global-utils");
var API_NAME = 'diag';
/**
 * Singleton object which represents the entry point to the OpenTelemetry internal
 * diagnostic API
 */
var DiagAPI = /** @class */ (function () {
    /**
     * Private internal constructor
     * @private
     */
    function DiagAPI() {
        function _logProxy(funcName) {
            return function () {
                var args = [];
                for (var _i = 0; _i < arguments.length; _i++) {
                    args[_i] = arguments[_i];
                }
                var logger = global_utils_1.getGlobal('diag');
                // shortcut if logger not set
                if (!logger)
                    return;
                return logger[funcName].apply(logger, args);
            };
        }
        // Using self local variable for minification purposes as 'this' cannot be minified
        var self = this;
        // DiagAPI specific functions
        self.setLogger = function (logger, logLevel) {
            var _a, _b;
            if (logLevel === void 0) { logLevel = types_1.DiagLogLevel.INFO; }
            if (logger === self) {
                // There isn't much we can do here.
                // Logging to the console might break the user application.
                // Try to log to self. If a logger was previously registered it will receive the log.
                var err = new Error('Cannot use diag as the logger for itself. Please use a DiagLogger implementation like ConsoleDiagLogger or a custom implementation');
                self.error((_a = err.stack) !== null && _a !== void 0 ? _a : err.message);
                return false;
            }
            var oldLogger = global_utils_1.getGlobal('diag');
            var newLogger = logLevelLogger_1.createLogLevelDiagLogger(logLevel, logger);
            // There already is an logger registered. We'll let it know before overwriting it.
            if (oldLogger) {
                var stack = (_b = new Error().stack) !== null && _b !== void 0 ? _b : '<failed to generate stacktrace>';
                oldLogger.warn("Current logger will be overwritten from " + stack);
                newLogger.warn("Current logger will overwrite one already registered from " + stack);
            }
            return global_utils_1.registerGlobal('diag', newLogger, self, true);
        };
        self.disable = function () {
            global_utils_1.unregisterGlobal(API_NAME, self);
        };
        self.createComponentLogger = function (options) {
            return new ComponentLogger_1.DiagComponentLogger(options);
        };
        self.verbose = _logProxy('verbose');
        self.debug = _logProxy('debug');
        self.info = _logProxy('info');
        self.warn = _logProxy('warn');
        self.error = _logProxy('error');
    }
    /** Get the singleton instance of the DiagAPI API */
    DiagAPI.instance = function () {
        if (!this._instance) {
            this._instance = new DiagAPI();
        }
        return this._instance;
    };
    return DiagAPI;
}());
exports.DiagAPI = DiagAPI;
//# sourceMappingURL=diag.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.PropagationAPI = void 0;
var global_utils_1 = require("../internal/global-utils");
var NoopTextMapPropagator_1 = require("../propagation/NoopTextMapPropagator");
var TextMapPropagator_1 = require("../propagation/TextMapPropagator");
var context_helpers_1 = require("../baggage/context-helpers");
var utils_1 = require("../baggage/utils");
var diag_1 = require("./diag");
var API_NAME = 'propagation';
var NOOP_TEXT_MAP_PROPAGATOR = new NoopTextMapPropagator_1.NoopTextMapPropagator();
/**
 * Singleton object which represents the entry point to the OpenTelemetry Propagation API
 */
var PropagationAPI = /** @class */ (function () {
    /** Empty private constructor prevents end users from constructing a new instance of the API */
    function PropagationAPI() {
        this.createBaggage = utils_1.createBaggage;
        this.getBaggage = context_helpers_1.getBaggage;
        this.setBaggage = context_helpers_1.setBaggage;
        this.deleteBaggage = context_helpers_1.deleteBaggage;
    }
    /** Get the singleton instance of the Propagator API */
    PropagationAPI.getInstance = function () {
        if (!this._instance) {
            this._instance = new PropagationAPI();
        }
        return this._instance;
    };
    /**
     * Set the current propagator.
     *
     * @returns true if the propagator was successfully registered, else false
     */
    PropagationAPI.prototype.setGlobalPropagator = function (propagator) {
        return global_utils_1.registerGlobal(API_NAME, propagator, diag_1.DiagAPI.instance());
    };
    /**
     * Inject context into a carrier to be propagated inter-process
     *
     * @param context Context carrying tracing data to inject
     * @param carrier carrier to inject context into
     * @param setter Function used to set values on the carrier
     */
    PropagationAPI.prototype.inject = function (context, carrier, setter) {
        if (setter === void 0) { setter = TextMapPropagator_1.defaultTextMapSetter; }
        return this._getGlobalPropagator().inject(context, carrier, setter);
    };
    /**
     * Extract context from a carrier
     *
     * @param context Context which the newly created context will inherit from
     * @param carrier Carrier to extract context from
     * @param getter Function used to extract keys from a carrier
     */
    PropagationAPI.prototype.extract = function (context, carrier, getter) {
        if (getter === void 0) { getter = TextMapPropagator_1.defaultTextMapGetter; }
        return this._getGlobalPropagator().extract(context, carrier, getter);
    };
    /**
     * Return a list of all fields which may be used by the propagator.
     */
    PropagationAPI.prototype.fields = function () {
        return this._getGlobalPropagator().fields();
    };
    /** Remove the global propagator */
    PropagationAPI.prototype.disable = function () {
        global_utils_1.unregisterGlobal(API_NAME, diag_1.DiagAPI.instance());
    };
    PropagationAPI.prototype._getGlobalPropagator = function () {
        return global_utils_1.getGlobal(API_NAME) || NOOP_TEXT_MAP_PROPAGATOR;
    };
    return PropagationAPI;
}());
exports.PropagationAPI = PropagationAPI;
//# sourceMappingURL=propagation.js.map"use strict";
/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.TraceAPI = void 0;
var global_utils_1 = require("../internal/global-utils");
var ProxyTracerProvider_1 = require("../trace/ProxyTracerProvider");
var spancontext_utils_1 = require("../trace/spancontext-utils");
var context_utils_1 = require("../trace/context-utils");
var diag_1 = require("./diag");
var API_NAME = 'trace';
/**
 * Singleton object which represents the entry point to the OpenTelemetry Tracing API
 */
var TraceAPI = /** @class */ (function () {
    /** Empty private constructor prevents end users from constructing a new instance of the API */
    function TraceAPI() {
        this._proxyTracerProvider = new ProxyTracerProvider_1.ProxyTracerProvider();
        this.wrapSpanContext = spancontext_utils_1.wrapSpanContext;
        this.isSpanContextValid = spancontext_utils_1.isSpanContextValid;
        this.deleteSpan = context_utils_1.deleteSpan;
        this.getSpan = context_utils_1.getSpan;
        this.getSpanContext = context_utils_1.getSpanContext;
        this.setSpan = context_utils_1.setSpan;
        this.setSpanContext = context_utils_1.setSpanContext;
    }
    /** Get the singleton instance of the Trace API */
    TraceAPI.getInstance = function () {
        if (!this._instance) {
            this._instance = new TraceAPI();
        }
        return this._instance;
    };
    /**
     * Set the current global tracer.
     *
     * @returns true if the tracer provider was successfully registered, else false
     */
    TraceAPI.prototype.setGlobalTracerProvider = function (provider) {
        var success = global_utils_1.registerGlobal(API_NAME, this._proxyTracerProvider, diag_1.DiagAPI.instance());
        if (success) {
            this._proxyTracerProvider.setDelegate(provider);
        }
        return success;
    };
    /**
     * Returns the global tracer provider.
     */
    TraceAPI.prototype.getTracerProvider = function () {
        return global_utils_1.getGlobal(API_NAME) || this._proxyTracerProvider;
    };
    /**
     * Returns a tracer from the global tracer provider.
     */
    TraceAPI.prototype.getTracer = function (name, version) {
        return this.getTracerProvider().getTracer(name, version);
    };
    /** Remove the global tracer provider */
    TraceAPI.prototype.disable = function () {
        global_utils_1.unregisterGlobal(API_NAME, diag_1.DiagAPI.instance());
        this._proxyTracerProvider = new ProxyTracerProvider_1.ProxyTracerProvider();
    };
    return TraceAPI;
}());
exports.TraceAPI = TraceAPI;
//# sourceMappingURL=trace.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
export * from './baggage/types';
export { baggageEntryMetadataFromString } from './baggage/utils';
export * from './common/Exception';
export * from './common/Time';
export * from './common/Attributes';
export * from './diag';
export * from './propagation/TextMapPropagator';
export * from './trace/attributes';
export * from './trace/link';
export * from './trace/ProxyTracer';
export * from './trace/ProxyTracerProvider';
export * from './trace/Sampler';
export * from './trace/SamplingResult';
export * from './trace/span_context';
export * from './trace/span_kind';
export * from './trace/span';
export * from './trace/SpanOptions';
export * from './trace/status';
export * from './trace/trace_flags';
export * from './trace/trace_state';
export { createTraceState } from './trace/internal/utils';
export * from './trace/tracer_provider';
export * from './trace/tracer';
export * from './trace/tracer_options';
export { isSpanContextValid, isValidTraceId, isValidSpanId, } from './trace/spancontext-utils';
export { INVALID_SPANID, INVALID_TRACEID, INVALID_SPAN_CONTEXT, } from './trace/invalid-span-constants';
export * from './context/context';
export * from './context/types';
import { ContextAPI } from './api/context';
/** Entrypoint for context API */
export var context = ContextAPI.getInstance();
import { TraceAPI } from './api/trace';
/** Entrypoint for trace API */
export var trace = TraceAPI.getInstance();
import { PropagationAPI } from './api/propagation';
/** Entrypoint for propagation API */
export var propagation = PropagationAPI.getInstance();
import { DiagAPI } from './api/diag';
/**
 * Entrypoint for Diag API.
 * Defines Diagnostic handler used for internal diagnostic logging operations.
 * The default provides a Noop DiagLogger implementation which may be changed via the
 * diag.setLogger(logger: DiagLogger) function.
 */
export var diag = DiagAPI.instance();
export default {
    trace: trace,
    context: context,
    propagation: propagation,
    diag: diag,
};
//# sourceMappingURL=index.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
// this is autogenerated file, see scripts/version-update.js
export var VERSION = '1.1.0';
//# sourceMappingURL=version.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import { INVALID_SPAN_CONTEXT } from './invalid-span-constants';
/**
 * The NonRecordingSpan is the default {@link Span} that is used when no Span
 * implementation is available. All operations are no-op including context
 * propagation.
 */
var NonRecordingSpan = /** @class */ (function () {
    function NonRecordingSpan(_spanContext) {
        if (_spanContext === void 0) { _spanContext = INVALID_SPAN_CONTEXT; }
        this._spanContext = _spanContext;
    }
    // Returns a SpanContext.
    NonRecordingSpan.prototype.spanContext = function () {
        return this._spanContext;
    };
    // By default does nothing
    NonRecordingSpan.prototype.setAttribute = function (_key, _value) {
        return this;
    };
    // By default does nothing
    NonRecordingSpan.prototype.setAttributes = function (_attributes) {
        return this;
    };
    // By default does nothing
    NonRecordingSpan.prototype.addEvent = function (_name, _attributes) {
        return this;
    };
    // By default does nothing
    NonRecordingSpan.prototype.setStatus = function (_status) {
        return this;
    };
    // By default does nothing
    NonRecordingSpan.prototype.updateName = function (_name) {
        return this;
    };
    // By default does nothing
    NonRecordingSpan.prototype.end = function (_endTime) { };
    // isRecording always returns false for NonRecordingSpan.
    NonRecordingSpan.prototype.isRecording = function () {
        return false;
    };
    // By default does nothing
    NonRecordingSpan.prototype.recordException = function (_exception, _time) { };
    return NonRecordingSpan;
}());
export { NonRecordingSpan };
//# sourceMappingURL=NonRecordingSpan.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import { ContextAPI } from '../api/context';
import { getSpanContext, setSpan } from '../trace/context-utils';
import { NonRecordingSpan } from './NonRecordingSpan';
import { isSpanContextValid } from './spancontext-utils';
var context = ContextAPI.getInstance();
/**
 * No-op implementations of {@link Tracer}.
 */
var NoopTracer = /** @class */ (function () {
    function NoopTracer() {
    }
    // startSpan starts a noop span.
    NoopTracer.prototype.startSpan = function (name, options, context) {
        var root = Boolean(options === null || options === void 0 ? void 0 : options.root);
        if (root) {
            return new NonRecordingSpan();
        }
        var parentFromContext = context && getSpanContext(context);
        if (isSpanContext(parentFromContext) &&
            isSpanContextValid(parentFromContext)) {
            return new NonRecordingSpan(parentFromContext);
        }
        else {
            return new NonRecordingSpan();
        }
    };
    NoopTracer.prototype.startActiveSpan = function (name, arg2, arg3, arg4) {
        var opts;
        var ctx;
        var fn;
        if (arguments.length < 2) {
            return;
        }
        else if (arguments.length === 2) {
            fn = arg2;
        }
        else if (arguments.length === 3) {
            opts = arg2;
            fn = arg3;
        }
        else {
            opts = arg2;
            ctx = arg3;
            fn = arg4;
        }
        var parentContext = ctx !== null && ctx !== void 0 ? ctx : context.active();
        var span = this.startSpan(name, opts, parentContext);
        var contextWithSpanSet = setSpan(parentContext, span);
        return context.with(contextWithSpanSet, fn, undefined, span);
    };
    return NoopTracer;
}());
export { NoopTracer };
function isSpanContext(spanContext) {
    return (typeof spanContext === 'object' &&
        typeof spanContext['spanId'] === 'string' &&
        typeof spanContext['traceId'] === 'string' &&
        typeof spanContext['traceFlags'] === 'number');
}
//# sourceMappingURL=NoopTracer.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import { NoopTracer } from './NoopTracer';
/**
 * An implementation of the {@link TracerProvider} which returns an impotent
 * Tracer for all calls to `getTracer`.
 *
 * All operations are no-op.
 */
var NoopTracerProvider = /** @class */ (function () {
    function NoopTracerProvider() {
    }
    NoopTracerProvider.prototype.getTracer = function (_name, _version, _options) {
        return new NoopTracer();
    };
    return NoopTracerProvider;
}());
export { NoopTracerProvider };
//# sourceMappingURL=NoopTracerProvider.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import { NoopTracer } from './NoopTracer';
var NOOP_TRACER = new NoopTracer();
/**
 * Proxy tracer provided by the proxy tracer provider
 */
var ProxyTracer = /** @class */ (function () {
    function ProxyTracer(_provider, name, version, options) {
        this._provider = _provider;
        this.name = name;
        this.version = version;
        this.options = options;
    }
    ProxyTracer.prototype.startSpan = function (name, options, context) {
        return this._getTracer().startSpan(name, options, context);
    };
    ProxyTracer.prototype.startActiveSpan = function (_name, _options, _context, _fn) {
        var tracer = this._getTracer();
        return Reflect.apply(tracer.startActiveSpan, tracer, arguments);
    };
    /**
     * Try to get a tracer from the proxy tracer provider.
     * If the proxy tracer provider has no delegate, return a noop tracer.
     */
    ProxyTracer.prototype._getTracer = function () {
        if (this._delegate) {
            return this._delegate;
        }
        var tracer = this._provider.getDelegateTracer(this.name, this.version, this.options);
        if (!tracer) {
            return NOOP_TRACER;
        }
        this._delegate = tracer;
        return this._delegate;
    };
    return ProxyTracer;
}());
export { ProxyTracer };
//# sourceMappingURL=ProxyTracer.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import { ProxyTracer } from './ProxyTracer';
import { NoopTracerProvider } from './NoopTracerProvider';
var NOOP_TRACER_PROVIDER = new NoopTracerProvider();
/**
 * Tracer provider which provides {@link ProxyTracer}s.
 *
 * Before a delegate is set, tracers provided are NoOp.
 *   When a delegate is set, traces are provided from the delegate.
 *   When a delegate is set after tracers have already been provided,
 *   all tracers already provided will use the provided delegate implementation.
 */
var ProxyTracerProvider = /** @class */ (function () {
    function ProxyTracerProvider() {
    }
    /**
     * Get a {@link ProxyTracer}
     */
    ProxyTracerProvider.prototype.getTracer = function (name, version, options) {
        var _a;
        return ((_a = this.getDelegateTracer(name, version, options)) !== null && _a !== void 0 ? _a : new ProxyTracer(this, name, version, options));
    };
    ProxyTracerProvider.prototype.getDelegate = function () {
        var _a;
        return (_a = this._delegate) !== null && _a !== void 0 ? _a : NOOP_TRACER_PROVIDER;
    };
    /**
     * Set the delegate tracer provider
     */
    ProxyTracerProvider.prototype.setDelegate = function (delegate) {
        this._delegate = delegate;
    };
    ProxyTracerProvider.prototype.getDelegateTracer = function (name, version, options) {
        var _a;
        return (_a = this._delegate) === null || _a === void 0 ? void 0 : _a.getTracer(name, version, options);
    };
    return ProxyTracerProvider;
}());
export { ProxyTracerProvider };
//# sourceMappingURL=ProxyTracerProvider.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
export {};
//# sourceMappingURL=Sampler.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/**
 * A sampling decision that determines how a {@link Span} will be recorded
 * and collected.
 */
export var SamplingDecision;
(function (SamplingDecision) {
    /**
     * `Span.isRecording() === false`, span will not be recorded and all events
     * and attributes will be dropped.
     */
    SamplingDecision[SamplingDecision["NOT_RECORD"] = 0] = "NOT_RECORD";
    /**
     * `Span.isRecording() === true`, but `Sampled` flag in {@link TraceFlags}
     * MUST NOT be set.
     */
    SamplingDecision[SamplingDecision["RECORD"] = 1] = "RECORD";
    /**
     * `Span.isRecording() === true` AND `Sampled` flag in {@link TraceFlags}
     * MUST be set.
     */
    SamplingDecision[SamplingDecision["RECORD_AND_SAMPLED"] = 2] = "RECORD_AND_SAMPLED";
})(SamplingDecision || (SamplingDecision = {}));
//# sourceMappingURL=SamplingResult.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
export {};
//# sourceMappingURL=SpanOptions.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
export {};
//# sourceMappingURL=attributes.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import { createContextKey } from '../context/context';
import { NonRecordingSpan } from './NonRecordingSpan';
/**
 * span key
 */
var SPAN_KEY = createContextKey('OpenTelemetry Context Key SPAN');
/**
 * Return the span if one exists
 *
 * @param context context to get span from
 */
export function getSpan(context) {
    return context.getValue(SPAN_KEY) || undefined;
}
/**
 * Set the span on a context
 *
 * @param context context to use as parent
 * @param span span to set active
 */
export function setSpan(context, span) {
    return context.setValue(SPAN_KEY, span);
}
/**
 * Remove current span stored in the context
 *
 * @param context context to delete span from
 */
export function deleteSpan(context) {
    return context.deleteValue(SPAN_KEY);
}
/**
 * Wrap span context in a NoopSpan and set as span in a new
 * context
 *
 * @param context context to set active span on
 * @param spanContext span context to be wrapped
 */
export function setSpanContext(context, spanContext) {
    return setSpan(context, new NonRecordingSpan(spanContext));
}
/**
 * Get the span context of the span if it exists.
 *
 * @param context context to get values from
 */
export function getSpanContext(context) {
    var _a;
    return (_a = getSpan(context)) === null || _a === void 0 ? void 0 : _a.spanContext();
}
//# sourceMappingURL=context-utils.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import { TraceFlags } from './trace_flags';
export var INVALID_SPANID = '0000000000000000';
export var INVALID_TRACEID = '00000000000000000000000000000000';
export var INVALID_SPAN_CONTEXT = {
    traceId: INVALID_TRACEID,
    spanId: INVALID_SPANID,
    traceFlags: TraceFlags.NONE,
};
//# sourceMappingURL=invalid-span-constants.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
export {};
//# sourceMappingURL=link.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
export {};
//# sourceMappingURL=span.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
export {};
//# sourceMappingURL=span_context.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
export var SpanKind;
(function (SpanKind) {
    /** Default value. Indicates that the span is used internally. */
    SpanKind[SpanKind["INTERNAL"] = 0] = "INTERNAL";
    /**
     * Indicates that the span covers server-side handling of an RPC or other
     * remote request.
     */
    SpanKind[SpanKind["SERVER"] = 1] = "SERVER";
    /**
     * Indicates that the span covers the client-side wrapper around an RPC or
     * other remote request.
     */
    SpanKind[SpanKind["CLIENT"] = 2] = "CLIENT";
    /**
     * Indicates that the span describes producer sending a message to a
     * broker. Unlike client and server, there is no direct critical path latency
     * relationship between producer and consumer spans.
     */
    SpanKind[SpanKind["PRODUCER"] = 3] = "PRODUCER";
    /**
     * Indicates that the span describes consumer receiving a message from a
     * broker. Unlike client and server, there is no direct critical path latency
     * relationship between producer and consumer spans.
     */
    SpanKind[SpanKind["CONSUMER"] = 4] = "CONSUMER";
})(SpanKind || (SpanKind = {}));
//# sourceMappingURL=span_kind.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import { INVALID_SPANID, INVALID_TRACEID } from './invalid-span-constants';
import { NonRecordingSpan } from './NonRecordingSpan';
var VALID_TRACEID_REGEX = /^([0-9a-f]{32})$/i;
var VALID_SPANID_REGEX = /^[0-9a-f]{16}$/i;
export function isValidTraceId(traceId) {
    return VALID_TRACEID_REGEX.test(traceId) && traceId !== INVALID_TRACEID;
}
export function isValidSpanId(spanId) {
    return VALID_SPANID_REGEX.test(spanId) && spanId !== INVALID_SPANID;
}
/**
 * Returns true if this {@link SpanContext} is valid.
 * @return true if this {@link SpanContext} is valid.
 */
export function isSpanContextValid(spanContext) {
    return (isValidTraceId(spanContext.traceId) && isValidSpanId(spanContext.spanId));
}
/**
 * Wrap the given {@link SpanContext} in a new non-recording {@link Span}
 *
 * @param spanContext span context to be wrapped
 * @returns a new non-recording {@link Span} with the provided context
 */
export function wrapSpanContext(spanContext) {
    return new NonRecordingSpan(spanContext);
}
//# sourceMappingURL=spancontext-utils.js.map/**
 * An enumeration of status codes.
 */
export var SpanStatusCode;
(function (SpanStatusCode) {
    /**
     * The default status.
     */
    SpanStatusCode[SpanStatusCode["UNSET"] = 0] = "UNSET";
    /**
     * The operation has been validated by an Application developer or
     * Operator to have completed successfully.
     */
    SpanStatusCode[SpanStatusCode["OK"] = 1] = "OK";
    /**
     * The operation contains an error.
     */
    SpanStatusCode[SpanStatusCode["ERROR"] = 2] = "ERROR";
})(SpanStatusCode || (SpanStatusCode = {}));
//# sourceMappingURL=status.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
export var TraceFlags;
(function (TraceFlags) {
    /** Represents no flag set. */
    TraceFlags[TraceFlags["NONE"] = 0] = "NONE";
    /** Bit to represent whether trace is sampled in trace flags. */
    TraceFlags[TraceFlags["SAMPLED"] = 1] = "SAMPLED";
})(TraceFlags || (TraceFlags = {}));
//# sourceMappingURL=trace_flags.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
export {};
//# sourceMappingURL=trace_state.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
export {};
//# sourceMappingURL=tracer.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
export {};
//# sourceMappingURL=tracer_options.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
export {};
//# sourceMappingURL=tracer_provider.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import { validateKey, validateValue } from './tracestate-validators';
var MAX_TRACE_STATE_ITEMS = 32;
var MAX_TRACE_STATE_LEN = 512;
var LIST_MEMBERS_SEPARATOR = ',';
var LIST_MEMBER_KEY_VALUE_SPLITTER = '=';
/**
 * TraceState must be a class and not a simple object type because of the spec
 * requirement (https://www.w3.org/TR/trace-context/#tracestate-field).
 *
 * Here is the list of allowed mutations:
 * - New key-value pair should be added into the beginning of the list
 * - The value of any key can be updated. Modified keys MUST be moved to the
 * beginning of the list.
 */
var TraceStateImpl = /** @class */ (function () {
    function TraceStateImpl(rawTraceState) {
        this._internalState = new Map();
        if (rawTraceState)
            this._parse(rawTraceState);
    }
    TraceStateImpl.prototype.set = function (key, value) {
        // TODO: Benchmark the different approaches(map vs list) and
        // use the faster one.
        var traceState = this._clone();
        if (traceState._internalState.has(key)) {
            traceState._internalState.delete(key);
        }
        traceState._internalState.set(key, value);
        return traceState;
    };
    TraceStateImpl.prototype.unset = function (key) {
        var traceState = this._clone();
        traceState._internalState.delete(key);
        return traceState;
    };
    TraceStateImpl.prototype.get = function (key) {
        return this._internalState.get(key);
    };
    TraceStateImpl.prototype.serialize = function () {
        var _this = this;
        return this._keys()
            .reduce(function (agg, key) {
            agg.push(key + LIST_MEMBER_KEY_VALUE_SPLITTER + _this.get(key));
            return agg;
        }, [])
            .join(LIST_MEMBERS_SEPARATOR);
    };
    TraceStateImpl.prototype._parse = function (rawTraceState) {
        if (rawTraceState.length > MAX_TRACE_STATE_LEN)
            return;
        this._internalState = rawTraceState
            .split(LIST_MEMBERS_SEPARATOR)
            .reverse() // Store in reverse so new keys (.set(...)) will be placed at the beginning
            .reduce(function (agg, part) {
            var listMember = part.trim(); // Optional Whitespace (OWS) handling
            var i = listMember.indexOf(LIST_MEMBER_KEY_VALUE_SPLITTER);
            if (i !== -1) {
                var key = listMember.slice(0, i);
                var value = listMember.slice(i + 1, part.length);
                if (validateKey(key) && validateValue(value)) {
                    agg.set(key, value);
                }
                else {
                    // TODO: Consider to add warning log
                }
            }
            return agg;
        }, new Map());
        // Because of the reverse() requirement, trunc must be done after map is created
        if (this._internalState.size > MAX_TRACE_STATE_ITEMS) {
            this._internalState = new Map(Array.from(this._internalState.entries())
                .reverse() // Use reverse same as original tracestate parse chain
                .slice(0, MAX_TRACE_STATE_ITEMS));
        }
    };
    TraceStateImpl.prototype._keys = function () {
        return Array.from(this._internalState.keys()).reverse();
    };
    TraceStateImpl.prototype._clone = function () {
        var traceState = new TraceStateImpl();
        traceState._internalState = new Map(this._internalState);
        return traceState;
    };
    return TraceStateImpl;
}());
export { TraceStateImpl };
//# sourceMappingURL=tracestate-impl.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
var VALID_KEY_CHAR_RANGE = '[_0-9a-z-*/]';
var VALID_KEY = "[a-z]" + VALID_KEY_CHAR_RANGE + "{0,255}";
var VALID_VENDOR_KEY = "[a-z0-9]" + VALID_KEY_CHAR_RANGE + "{0,240}@[a-z]" + VALID_KEY_CHAR_RANGE + "{0,13}";
var VALID_KEY_REGEX = new RegExp("^(?:" + VALID_KEY + "|" + VALID_VENDOR_KEY + ")$");
var VALID_VALUE_BASE_REGEX = /^[ -~]{0,255}[!-~]$/;
var INVALID_VALUE_COMMA_EQUAL_REGEX = /,|=/;
/**
 * Key is opaque string up to 256 characters printable. It MUST begin with a
 * lowercase letter, and can only contain lowercase letters a-z, digits 0-9,
 * underscores _, dashes -, asterisks *, and forward slashes /.
 * For multi-tenant vendor scenarios, an at sign (@) can be used to prefix the
 * vendor name. Vendors SHOULD set the tenant ID at the beginning of the key.
 * see https://www.w3.org/TR/trace-context/#key
 */
export function validateKey(key) {
    return VALID_KEY_REGEX.test(key);
}
/**
 * Value is opaque string up to 256 characters printable ASCII RFC0020
 * characters (i.e., the range 0x20 to 0x7E) except comma , and =.
 */
export function validateValue(value) {
    return (VALID_VALUE_BASE_REGEX.test(value) &&
        !INVALID_VALUE_COMMA_EQUAL_REGEX.test(value));
}
//# sourceMappingURL=tracestate-validators.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import { TraceStateImpl } from './tracestate-impl';
export function createTraceState(rawTraceState) {
    return new TraceStateImpl(rawTraceState);
}
//# sourceMappingURL=utils.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/**
 * No-op implementations of {@link TextMapPropagator}.
 */
var NoopTextMapPropagator = /** @class */ (function () {
    function NoopTextMapPropagator() {
    }
    /** Noop inject function does nothing */
    NoopTextMapPropagator.prototype.inject = function (_context, _carrier) { };
    /** Noop extract function does nothing and returns the input context */
    NoopTextMapPropagator.prototype.extract = function (context, _carrier) {
        return context;
    };
    NoopTextMapPropagator.prototype.fields = function () {
        return [];
    };
    return NoopTextMapPropagator;
}());
export { NoopTextMapPropagator };
//# sourceMappingURL=NoopTextMapPropagator.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
export var defaultTextMapGetter = {
    get: function (carrier, key) {
        if (carrier == null) {
            return undefined;
        }
        return carrier[key];
    },
    keys: function (carrier) {
        if (carrier == null) {
            return [];
        }
        return Object.keys(carrier);
    },
};
export var defaultTextMapSetter = {
    set: function (carrier, key, value) {
        if (carrier == null) {
            return;
        }
        carrier[key] = value;
    },
};
//# sourceMappingURL=TextMapPropagator.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
export * from './node';
//# sourceMappingURL=index.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/** only globals that common to node and browsers are allowed */
// eslint-disable-next-line node/no-unsupported-features/es-builtins
export var _globalThis = typeof globalThis === 'object' ? globalThis : global;
//# sourceMappingURL=globalThis.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
export * from './globalThis';
//# sourceMappingURL=index.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
// Updates to this file should also be replicated to @opentelemetry/api-metrics and
// @opentelemetry/core too.
/**
 * - globalThis (New standard)
 * - self (Will return the current window instance for supported browsers)
 * - window (fallback for older browser implementations)
 * - global (NodeJS implementation)
 * - <object> (When all else fails)
 */
/** only globals that common to node and browsers are allowed */
// eslint-disable-next-line node/no-unsupported-features/es-builtins, no-undef
export var _globalThis = typeof globalThis === 'object' ? globalThis :
    typeof self === 'object' ? self :
        typeof window === 'object' ? window :
            typeof global === 'object' ? global :
                {};
//# sourceMappingURL=globalThis.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
export * from './globalThis';
//# sourceMappingURL=index.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import { _globalThis } from '../platform';
import { VERSION } from '../version';
import { isCompatible } from './semver';
var major = VERSION.split('.')[0];
var GLOBAL_OPENTELEMETRY_API_KEY = Symbol.for("opentelemetry.js.api." + major);
var _global = _globalThis;
export function registerGlobal(type, instance, diag, allowOverride) {
    var _a;
    if (allowOverride === void 0) { allowOverride = false; }
    var api = (_global[GLOBAL_OPENTELEMETRY_API_KEY] = (_a = _global[GLOBAL_OPENTELEMETRY_API_KEY]) !== null && _a !== void 0 ? _a : {
        version: VERSION,
    });
    if (!allowOverride && api[type]) {
        // already registered an API of this type
        var err = new Error("@opentelemetry/api: Attempted duplicate registration of API: " + type);
        diag.error(err.stack || err.message);
        return false;
    }
    if (api.version !== VERSION) {
        // All registered APIs must be of the same version exactly
        var err = new Error('@opentelemetry/api: All API registration versions must match');
        diag.error(err.stack || err.message);
        return false;
    }
    api[type] = instance;
    diag.debug("@opentelemetry/api: Registered a global for " + type + " v" + VERSION + ".");
    return true;
}
export function getGlobal(type) {
    var _a, _b;
    var globalVersion = (_a = _global[GLOBAL_OPENTELEMETRY_API_KEY]) === null || _a === void 0 ? void 0 : _a.version;
    if (!globalVersion || !isCompatible(globalVersion)) {
        return;
    }
    return (_b = _global[GLOBAL_OPENTELEMETRY_API_KEY]) === null || _b === void 0 ? void 0 : _b[type];
}
export function unregisterGlobal(type, diag) {
    diag.debug("@opentelemetry/api: Unregistering a global for " + type + " v" + VERSION + ".");
    var api = _global[GLOBAL_OPENTELEMETRY_API_KEY];
    if (api) {
        delete api[type];
    }
}
//# sourceMappingURL=global-utils.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import { VERSION } from '../version';
var re = /^(\d+)\.(\d+)\.(\d+)(-(.+))?$/;
/**
 * Create a function to test an API version to see if it is compatible with the provided ownVersion.
 *
 * The returned function has the following semantics:
 * - Exact match is always compatible
 * - Major versions must match exactly
 *    - 1.x package cannot use global 2.x package
 *    - 2.x package cannot use global 1.x package
 * - The minor version of the API module requesting access to the global API must be less than or equal to the minor version of this API
 *    - 1.3 package may use 1.4 global because the later global contains all functions 1.3 expects
 *    - 1.4 package may NOT use 1.3 global because it may try to call functions which don't exist on 1.3
 * - If the major version is 0, the minor version is treated as the major and the patch is treated as the minor
 * - Patch and build tag differences are not considered at this time
 *
 * @param ownVersion version which should be checked against
 */
export function _makeCompatibilityCheck(ownVersion) {
    var acceptedVersions = new Set([ownVersion]);
    var rejectedVersions = new Set();
    var myVersionMatch = ownVersion.match(re);
    if (!myVersionMatch) {
        // we cannot guarantee compatibility so we always return noop
        return function () { return false; };
    }
    var ownVersionParsed = {
        major: +myVersionMatch[1],
        minor: +myVersionMatch[2],
        patch: +myVersionMatch[3],
        prerelease: myVersionMatch[4],
    };
    // if ownVersion has a prerelease tag, versions must match exactly
    if (ownVersionParsed.prerelease != null) {
        return function isExactmatch(globalVersion) {
            return globalVersion === ownVersion;
        };
    }
    function _reject(v) {
        rejectedVersions.add(v);
        return false;
    }
    function _accept(v) {
        acceptedVersions.add(v);
        return true;
    }
    return function isCompatible(globalVersion) {
        if (acceptedVersions.has(globalVersion)) {
            return true;
        }
        if (rejectedVersions.has(globalVersion)) {
            return false;
        }
        var globalVersionMatch = globalVersion.match(re);
        if (!globalVersionMatch) {
            // cannot parse other version
            // we cannot guarantee compatibility so we always noop
            return _reject(globalVersion);
        }
        var globalVersionParsed = {
            major: +globalVersionMatch[1],
            minor: +globalVersionMatch[2],
            patch: +globalVersionMatch[3],
            prerelease: globalVersionMatch[4],
        };
        // if globalVersion has a prerelease tag, versions must match exactly
        if (globalVersionParsed.prerelease != null) {
            return _reject(globalVersion);
        }
        // major versions must match
        if (ownVersionParsed.major !== globalVersionParsed.major) {
            return _reject(globalVersion);
        }
        if (ownVersionParsed.major === 0) {
            if (ownVersionParsed.minor === globalVersionParsed.minor &&
                ownVersionParsed.patch <= globalVersionParsed.patch) {
                return _accept(globalVersion);
            }
            return _reject(globalVersion);
        }
        if (ownVersionParsed.minor <= globalVersionParsed.minor) {
            return _accept(globalVersion);
        }
        return _reject(globalVersion);
    };
}
/**
 * Test an API version to see if it is compatible with this API.
 *
 * - Exact match is always compatible
 * - Major versions must match exactly
 *    - 1.x package cannot use global 2.x package
 *    - 2.x package cannot use global 1.x package
 * - The minor version of the API module requesting access to the global API must be less than or equal to the minor version of this API
 *    - 1.3 package may use 1.4 global because the later global contains all functions 1.3 expects
 *    - 1.4 package may NOT use 1.3 global because it may try to call functions which don't exist on 1.3
 * - If the major version is 0, the minor version is treated as the major and the patch is treated as the minor
 * - Patch and build tag differences are not considered at this time
 *
 * @param version version of the API requesting an instance of the global API
 */
export var isCompatible = _makeCompatibilityCheck(VERSION);
//# sourceMappingURL=semver.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import { getGlobal } from '../internal/global-utils';
/**
 * Component Logger which is meant to be used as part of any component which
 * will add automatically additional namespace in front of the log message.
 * It will then forward all message to global diag logger
 * @example
 * const cLogger = diag.createComponentLogger({ namespace: '@opentelemetry/instrumentation-http' });
 * cLogger.debug('test');
 * // @opentelemetry/instrumentation-http test
 */
var DiagComponentLogger = /** @class */ (function () {
    function DiagComponentLogger(props) {
        this._namespace = props.namespace || 'DiagComponentLogger';
    }
    DiagComponentLogger.prototype.debug = function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        return logProxy('debug', this._namespace, args);
    };
    DiagComponentLogger.prototype.error = function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        return logProxy('error', this._namespace, args);
    };
    DiagComponentLogger.prototype.info = function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        return logProxy('info', this._namespace, args);
    };
    DiagComponentLogger.prototype.warn = function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        return logProxy('warn', this._namespace, args);
    };
    DiagComponentLogger.prototype.verbose = function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        return logProxy('verbose', this._namespace, args);
    };
    return DiagComponentLogger;
}());
export { DiagComponentLogger };
function logProxy(funcName, namespace, args) {
    var logger = getGlobal('diag');
    // shortcut if logger not set
    if (!logger) {
        return;
    }
    args.unshift(namespace);
    return logger[funcName].apply(logger, args);
}
//# sourceMappingURL=ComponentLogger.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
var consoleMap = [
    { n: 'error', c: 'error' },
    { n: 'warn', c: 'warn' },
    { n: 'info', c: 'info' },
    { n: 'debug', c: 'debug' },
    { n: 'verbose', c: 'trace' },
];
/**
 * A simple Immutable Console based diagnostic logger which will output any messages to the Console.
 * If you want to limit the amount of logging to a specific level or lower use the
 * {@link createLogLevelDiagLogger}
 */
var DiagConsoleLogger = /** @class */ (function () {
    function DiagConsoleLogger() {
        function _consoleFunc(funcName) {
            return function () {
                var args = [];
                for (var _i = 0; _i < arguments.length; _i++) {
                    args[_i] = arguments[_i];
                }
                if (console) {
                    // Some environments only expose the console when the F12 developer console is open
                    // eslint-disable-next-line no-console
                    var theFunc = console[funcName];
                    if (typeof theFunc !== 'function') {
                        // Not all environments support all functions
                        // eslint-disable-next-line no-console
                        theFunc = console.log;
                    }
                    // One last final check
                    if (typeof theFunc === 'function') {
                        return theFunc.apply(console, args);
                    }
                }
            };
        }
        for (var i = 0; i < consoleMap.length; i++) {
            this[consoleMap[i].n] = _consoleFunc(consoleMap[i].c);
        }
    }
    return DiagConsoleLogger;
}());
export { DiagConsoleLogger };
//# sourceMappingURL=consoleLogger.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
export * from './consoleLogger';
export * from './types';
//# sourceMappingURL=index.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/**
 * Defines the available internal logging levels for the diagnostic logger, the numeric values
 * of the levels are defined to match the original values from the initial LogLevel to avoid
 * compatibility/migration issues for any implementation that assume the numeric ordering.
 */
export var DiagLogLevel;
(function (DiagLogLevel) {
    /** Diagnostic Logging level setting to disable all logging (except and forced logs) */
    DiagLogLevel[DiagLogLevel["NONE"] = 0] = "NONE";
    /** Identifies an error scenario */
    DiagLogLevel[DiagLogLevel["ERROR"] = 30] = "ERROR";
    /** Identifies a warning scenario */
    DiagLogLevel[DiagLogLevel["WARN"] = 50] = "WARN";
    /** General informational log message */
    DiagLogLevel[DiagLogLevel["INFO"] = 60] = "INFO";
    /** General debug log message */
    DiagLogLevel[DiagLogLevel["DEBUG"] = 70] = "DEBUG";
    /**
     * Detailed trace level logging should only be used for development, should only be set
     * in a development environment.
     */
    DiagLogLevel[DiagLogLevel["VERBOSE"] = 80] = "VERBOSE";
    /** Used to set the logging level to include all logging */
    DiagLogLevel[DiagLogLevel["ALL"] = 9999] = "ALL";
})(DiagLogLevel || (DiagLogLevel = {}));
//# sourceMappingURL=types.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import { DiagLogLevel } from '../types';
export function createLogLevelDiagLogger(maxLevel, logger) {
    if (maxLevel < DiagLogLevel.NONE) {
        maxLevel = DiagLogLevel.NONE;
    }
    else if (maxLevel > DiagLogLevel.ALL) {
        maxLevel = DiagLogLevel.ALL;
    }
    // In case the logger is null or undefined
    logger = logger || {};
    function _filterFunc(funcName, theLevel) {
        var theFunc = logger[funcName];
        if (typeof theFunc === 'function' && maxLevel >= theLevel) {
            return theFunc.bind(logger);
        }
        return function () { };
    }
    return {
        error: _filterFunc('error', DiagLogLevel.ERROR),
        warn: _filterFunc('warn', DiagLogLevel.WARN),
        info: _filterFunc('info', DiagLogLevel.INFO),
        debug: _filterFunc('debug', DiagLogLevel.DEBUG),
        verbose: _filterFunc('verbose', DiagLogLevel.VERBOSE),
    };
}
//# sourceMappingURL=logLevelLogger.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
function noopLogFunction() { }
/**
 * Returns a No-Op Diagnostic logger where all messages do nothing.
 * @implements {@link DiagLogger}
 * @returns {DiagLogger}
 */
export function createNoopDiagLogger() {
    return {
        verbose: noopLogFunction,
        debug: noopLogFunction,
        info: noopLogFunction,
        warn: noopLogFunction,
        error: noopLogFunction,
    };
}
//# sourceMappingURL=noopLogger.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
import { ROOT_CONTEXT } from './context';
var NoopContextManager = /** @class */ (function () {
    function NoopContextManager() {
    }
    NoopContextManager.prototype.active = function () {
        return ROOT_CONTEXT;
    };
    NoopContextManager.prototype.with = function (_context, fn, thisArg) {
        var args = [];
        for (var _i = 3; _i < arguments.length; _i++) {
            args[_i - 3] = arguments[_i];
        }
        return fn.call.apply(fn, __spreadArray([thisArg], args));
    };
    NoopContextManager.prototype.bind = function (_context, target) {
        return target;
    };
    NoopContextManager.prototype.enable = function () {
        return this;
    };
    NoopContextManager.prototype.disable = function () {
        return this;
    };
    return NoopContextManager;
}());
export { NoopContextManager };
//# sourceMappingURL=NoopContextManager.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/** Get a key to uniquely identify a context value */
export function createContextKey(description) {
    // The specification states that for the same input, multiple calls should
    // return different keys. Due to the nature of the JS dependency management
    // system, this creates problems where multiple versions of some package
    // could hold different keys for the same property.
    //
    // Therefore, we use Symbol.for which returns the same key for the same input.
    return Symbol.for(description);
}
var BaseContext = /** @class */ (function () {
    /**
     * Construct a new context which inherits values from an optional parent context.
     *
     * @param parentContext a context from which to inherit values
     */
    function BaseContext(parentContext) {
        // for minification
        var self = this;
        self._currentContext = parentContext ? new Map(parentContext) : new Map();
        self.getValue = function (key) { return self._currentContext.get(key); };
        self.setValue = function (key, value) {
            var context = new BaseContext(self._currentContext);
            context._currentContext.set(key, value);
            return context;
        };
        self.deleteValue = function (key) {
            var context = new BaseContext(self._currentContext);
            context._currentContext.delete(key);
            return context;
        };
    }
    return BaseContext;
}());
/** The root context is used as the default parent context when there is no active context */
export var ROOT_CONTEXT = new BaseContext();
//# sourceMappingURL=context.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
export {};
//# sourceMappingURL=types.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
export {};
//# sourceMappingURL=Attributes.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
export {};
//# sourceMappingURL=Exception.js.mapexport {};
//# sourceMappingURL=Time.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import { createContextKey } from '../context/context';
/**
 * Baggage key
 */
var BAGGAGE_KEY = createContextKey('OpenTelemetry Baggage Key');
/**
 * Retrieve the current baggage from the given context
 *
 * @param {Context} Context that manage all context values
 * @returns {Baggage} Extracted baggage from the context
 */
export function getBaggage(context) {
    return context.getValue(BAGGAGE_KEY) || undefined;
}
/**
 * Store a baggage in the given context
 *
 * @param {Context} Context that manage all context values
 * @param {Baggage} baggage that will be set in the actual context
 */
export function setBaggage(context, baggage) {
    return context.setValue(BAGGAGE_KEY, baggage);
}
/**
 * Delete the baggage stored in the given context
 *
 * @param {Context} Context that manage all context values
 */
export function deleteBaggage(context) {
    return context.deleteValue(BAGGAGE_KEY);
}
//# sourceMappingURL=context-helpers.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
export {};
//# sourceMappingURL=types.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import { DiagAPI } from '../api/diag';
import { BaggageImpl } from './internal/baggage-impl';
import { baggageEntryMetadataSymbol } from './internal/symbol';
var diag = DiagAPI.instance();
/**
 * Create a new Baggage with optional entries
 *
 * @param entries An array of baggage entries the new baggage should contain
 */
export function createBaggage(entries) {
    if (entries === void 0) { entries = {}; }
    return new BaggageImpl(new Map(Object.entries(entries)));
}
/**
 * Create a serializable BaggageEntryMetadata object from a string.
 *
 * @param str string metadata. Format is currently not defined by the spec and has no special meaning.
 *
 */
export function baggageEntryMetadataFromString(str) {
    if (typeof str !== 'string') {
        diag.error("Cannot create baggage metadata from unknown type: " + typeof str);
        str = '';
    }
    return {
        __TYPE__: baggageEntryMetadataSymbol,
        toString: function () {
            return str;
        },
    };
}
//# sourceMappingURL=utils.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
var BaggageImpl = /** @class */ (function () {
    function BaggageImpl(entries) {
        this._entries = entries ? new Map(entries) : new Map();
    }
    BaggageImpl.prototype.getEntry = function (key) {
        var entry = this._entries.get(key);
        if (!entry) {
            return undefined;
        }
        return Object.assign({}, entry);
    };
    BaggageImpl.prototype.getAllEntries = function () {
        return Array.from(this._entries.entries()).map(function (_a) {
            var k = _a[0], v = _a[1];
            return [k, v];
        });
    };
    BaggageImpl.prototype.setEntry = function (key, entry) {
        var newBaggage = new BaggageImpl(this._entries);
        newBaggage._entries.set(key, entry);
        return newBaggage;
    };
    BaggageImpl.prototype.removeEntry = function (key) {
        var newBaggage = new BaggageImpl(this._entries);
        newBaggage._entries.delete(key);
        return newBaggage;
    };
    BaggageImpl.prototype.removeEntries = function () {
        var keys = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            keys[_i] = arguments[_i];
        }
        var newBaggage = new BaggageImpl(this._entries);
        for (var _a = 0, keys_1 = keys; _a < keys_1.length; _a++) {
            var key = keys_1[_a];
            newBaggage._entries.delete(key);
        }
        return newBaggage;
    };
    BaggageImpl.prototype.clear = function () {
        return new BaggageImpl();
    };
    return BaggageImpl;
}());
export { BaggageImpl };
//# sourceMappingURL=baggage-impl.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/**
 * Symbol used to make BaggageEntryMetadata an opaque type
 */
export var baggageEntryMetadataSymbol = Symbol('BaggageEntryMetadata');
//# sourceMappingURL=symbol.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
import { NoopContextManager } from '../context/NoopContextManager';
import { getGlobal, registerGlobal, unregisterGlobal, } from '../internal/global-utils';
import { DiagAPI } from './diag';
var API_NAME = 'context';
var NOOP_CONTEXT_MANAGER = new NoopContextManager();
/**
 * Singleton object which represents the entry point to the OpenTelemetry Context API
 */
var ContextAPI = /** @class */ (function () {
    /** Empty private constructor prevents end users from constructing a new instance of the API */
    function ContextAPI() {
    }
    /** Get the singleton instance of the Context API */
    ContextAPI.getInstance = function () {
        if (!this._instance) {
            this._instance = new ContextAPI();
        }
        return this._instance;
    };
    /**
     * Set the current context manager.
     *
     * @returns true if the context manager was successfully registered, else false
     */
    ContextAPI.prototype.setGlobalContextManager = function (contextManager) {
        return registerGlobal(API_NAME, contextManager, DiagAPI.instance());
    };
    /**
     * Get the currently active context
     */
    ContextAPI.prototype.active = function () {
        return this._getContextManager().active();
    };
    /**
     * Execute a function with an active context
     *
     * @param context context to be active during function execution
     * @param fn function to execute in a context
     * @param thisArg optional receiver to be used for calling fn
     * @param args optional arguments forwarded to fn
     */
    ContextAPI.prototype.with = function (context, fn, thisArg) {
        var _a;
        var args = [];
        for (var _i = 3; _i < arguments.length; _i++) {
            args[_i - 3] = arguments[_i];
        }
        return (_a = this._getContextManager()).with.apply(_a, __spreadArray([context, fn, thisArg], args));
    };
    /**
     * Bind a context to a target function or event emitter
     *
     * @param context context to bind to the event emitter or function. Defaults to the currently active context
     * @param target function or event emitter to bind
     */
    ContextAPI.prototype.bind = function (context, target) {
        return this._getContextManager().bind(context, target);
    };
    ContextAPI.prototype._getContextManager = function () {
        return getGlobal(API_NAME) || NOOP_CONTEXT_MANAGER;
    };
    /** Disable and remove the global context manager */
    ContextAPI.prototype.disable = function () {
        this._getContextManager().disable();
        unregisterGlobal(API_NAME, DiagAPI.instance());
    };
    return ContextAPI;
}());
export { ContextAPI };
//# sourceMappingURL=context.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import { DiagComponentLogger } from '../diag/ComponentLogger';
import { createLogLevelDiagLogger } from '../diag/internal/logLevelLogger';
import { DiagLogLevel, } from '../diag/types';
import { getGlobal, registerGlobal, unregisterGlobal, } from '../internal/global-utils';
var API_NAME = 'diag';
/**
 * Singleton object which represents the entry point to the OpenTelemetry internal
 * diagnostic API
 */
var DiagAPI = /** @class */ (function () {
    /**
     * Private internal constructor
     * @private
     */
    function DiagAPI() {
        function _logProxy(funcName) {
            return function () {
                var args = [];
                for (var _i = 0; _i < arguments.length; _i++) {
                    args[_i] = arguments[_i];
                }
                var logger = getGlobal('diag');
                // shortcut if logger not set
                if (!logger)
                    return;
                return logger[funcName].apply(logger, args);
            };
        }
        // Using self local variable for minification purposes as 'this' cannot be minified
        var self = this;
        // DiagAPI specific functions
        self.setLogger = function (logger, logLevel) {
            var _a, _b;
            if (logLevel === void 0) { logLevel = DiagLogLevel.INFO; }
            if (logger === self) {
                // There isn't much we can do here.
                // Logging to the console might break the user application.
                // Try to log to self. If a logger was previously registered it will receive the log.
                var err = new Error('Cannot use diag as the logger for itself. Please use a DiagLogger implementation like ConsoleDiagLogger or a custom implementation');
                self.error((_a = err.stack) !== null && _a !== void 0 ? _a : err.message);
                return false;
            }
            var oldLogger = getGlobal('diag');
            var newLogger = createLogLevelDiagLogger(logLevel, logger);
            // There already is an logger registered. We'll let it know before overwriting it.
            if (oldLogger) {
                var stack = (_b = new Error().stack) !== null && _b !== void 0 ? _b : '<failed to generate stacktrace>';
                oldLogger.warn("Current logger will be overwritten from " + stack);
                newLogger.warn("Current logger will overwrite one already registered from " + stack);
            }
            return registerGlobal('diag', newLogger, self, true);
        };
        self.disable = function () {
            unregisterGlobal(API_NAME, self);
        };
        self.createComponentLogger = function (options) {
            return new DiagComponentLogger(options);
        };
        self.verbose = _logProxy('verbose');
        self.debug = _logProxy('debug');
        self.info = _logProxy('info');
        self.warn = _logProxy('warn');
        self.error = _logProxy('error');
    }
    /** Get the singleton instance of the DiagAPI API */
    DiagAPI.instance = function () {
        if (!this._instance) {
            this._instance = new DiagAPI();
        }
        return this._instance;
    };
    return DiagAPI;
}());
export { DiagAPI };
//# sourceMappingURL=diag.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import { getGlobal, registerGlobal, unregisterGlobal, } from '../internal/global-utils';
import { NoopTextMapPropagator } from '../propagation/NoopTextMapPropagator';
import { defaultTextMapGetter, defaultTextMapSetter, } from '../propagation/TextMapPropagator';
import { getBaggage, setBaggage, deleteBaggage, } from '../baggage/context-helpers';
import { createBaggage } from '../baggage/utils';
import { DiagAPI } from './diag';
var API_NAME = 'propagation';
var NOOP_TEXT_MAP_PROPAGATOR = new NoopTextMapPropagator();
/**
 * Singleton object which represents the entry point to the OpenTelemetry Propagation API
 */
var PropagationAPI = /** @class */ (function () {
    /** Empty private constructor prevents end users from constructing a new instance of the API */
    function PropagationAPI() {
        this.createBaggage = createBaggage;
        this.getBaggage = getBaggage;
        this.setBaggage = setBaggage;
        this.deleteBaggage = deleteBaggage;
    }
    /** Get the singleton instance of the Propagator API */
    PropagationAPI.getInstance = function () {
        if (!this._instance) {
            this._instance = new PropagationAPI();
        }
        return this._instance;
    };
    /**
     * Set the current propagator.
     *
     * @returns true if the propagator was successfully registered, else false
     */
    PropagationAPI.prototype.setGlobalPropagator = function (propagator) {
        return registerGlobal(API_NAME, propagator, DiagAPI.instance());
    };
    /**
     * Inject context into a carrier to be propagated inter-process
     *
     * @param context Context carrying tracing data to inject
     * @param carrier carrier to inject context into
     * @param setter Function used to set values on the carrier
     */
    PropagationAPI.prototype.inject = function (context, carrier, setter) {
        if (setter === void 0) { setter = defaultTextMapSetter; }
        return this._getGlobalPropagator().inject(context, carrier, setter);
    };
    /**
     * Extract context from a carrier
     *
     * @param context Context which the newly created context will inherit from
     * @param carrier Carrier to extract context from
     * @param getter Function used to extract keys from a carrier
     */
    PropagationAPI.prototype.extract = function (context, carrier, getter) {
        if (getter === void 0) { getter = defaultTextMapGetter; }
        return this._getGlobalPropagator().extract(context, carrier, getter);
    };
    /**
     * Return a list of all fields which may be used by the propagator.
     */
    PropagationAPI.prototype.fields = function () {
        return this._getGlobalPropagator().fields();
    };
    /** Remove the global propagator */
    PropagationAPI.prototype.disable = function () {
        unregisterGlobal(API_NAME, DiagAPI.instance());
    };
    PropagationAPI.prototype._getGlobalPropagator = function () {
        return getGlobal(API_NAME) || NOOP_TEXT_MAP_PROPAGATOR;
    };
    return PropagationAPI;
}());
export { PropagationAPI };
//# sourceMappingURL=propagation.js.map/*
 * Copyright The OpenTelemetry Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import { getGlobal, registerGlobal, unregisterGlobal, } from '../internal/global-utils';
import { ProxyTracerProvider } from '../trace/ProxyTracerProvider';
import { isSpanContextValid, wrapSpanContext, } from '../trace/spancontext-utils';
import { deleteSpan, getSpan, getSpanContext, setSpan, setSpanContext, } from '../trace/context-utils';
import { DiagAPI } from './diag';
var API_NAME = 'trace';
/**
 * Singleton object which represents the entry point to the OpenTelemetry Tracing API
 */
var TraceAPI = /** @class */ (function () {
    /** Empty private constructor prevents end users from constructing a new instance of the API */
    function TraceAPI() {
        this._proxyTracerProvider = new ProxyTracerProvider();
        this.wrapSpanContext = wrapSpanContext;
        this.isSpanContextValid = isSpanContextValid;
        this.deleteSpan = deleteSpan;
        this.getSpan = getSpan;
        this.getSpanContext = getSpanContext;
        this.setSpan = setSpan;
        this.setSpanContext = setSpanContext;
    }
    /** Get the singleton instance of the Trace API */
    TraceAPI.getInstance = function () {
        if (!this._instance) {
            this._instance = new TraceAPI();
        }
        return this._instance;
    };
    /**
     * Set the current global tracer.
     *
     * @returns true if the tracer provider was successfully registered, else false
     */
    TraceAPI.prototype.setGlobalTracerProvider = function (provider) {
        var success = registerGlobal(API_NAME, this._proxyTracerProvider, DiagAPI.instance());
        if (success) {
            this._proxyTracerProvider.setDelegate(provider);
        }
        return success;
    };
    /**
     * Returns the global tracer provider.
     */
    TraceAPI.prototype.getTracerProvider = function () {
        return getGlobal(API_NAME) || this._proxyTracerProvider;
    };
    /**
     * Returns a tracer from the global tracer provider.
     */
    TraceAPI.prototype.getTracer = function (name, version) {
        return this.getTracerProvider().getTracer(name, version);
    };
    /** Remove the global tracer provider */
    TraceAPI.prototype.disable = function () {
        unregisterGlobal(API_NAME, DiagAPI.instance());
        this._proxyTracerProvider = new ProxyTracerProvider();
    };
    return TraceAPI;
}());
export { TraceAPI };
//# sourceMappingURL=trace.js.map@rushstack/ts-command-line

Copyright (c) Microsoft Corporation. All rights reserved.

MIT License

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": "@rushstack/ts-command-line",
  "version": "4.13.0",
  "description": "An object-oriented command-line parser for TypeScript",
  "repository": {
    "type": "git",
    "url": "https://github.com/microsoft/rushstack.git",
    "directory": "libraries/ts-command-line"
  },
  "main": "lib/index.js",
  "typings": "dist/ts-command-line.d.ts",
  "license": "MIT",
  "dependencies": {
    "@types/argparse": "1.0.38",
    "argparse": "~1.0.9",
    "colors": "~1.2.1",
    "string-argv": "~0.3.1"
  },
  "devDependencies": {
    "@rushstack/eslint-config": "3.1.1",
    "@rushstack/heft": "0.48.0",
    "@rushstack/heft-node-rig": "1.11.0",
    "@types/heft-jest": "1.0.1",
    "@types/node": "12.20.24"
  }
}"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.CommandLineHelper = void 0;
/**
 * Helpers for working with the ts-command-line API.
 *
 * @public
 */
class CommandLineHelper {
    /**
     * Returns true if the current command line action is tab-complete.
     *
     * @public
     */
    static isTabCompletionActionRequest(argv) {
        return argv && argv.length > 2 && argv[2] === "tab-complete" /* CommandLineConstants.TabCompletionActionName */;
    }
}
exports.CommandLineHelper = CommandLineHelper;
//# sourceMappingURL=CommandLineHelper.js.map"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.SCOPING_PARAMETER_GROUP = void 0;
exports.SCOPING_PARAMETER_GROUP = Symbol('scoping');
//# sourceMappingURL=Constants.js.map"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.CommandLineHelper = exports.DynamicCommandLineParser = exports.CommandLineParser = exports.CommandLineParameterProvider = exports.CommandLineRemainder = exports.CommandLineChoiceListParameter = exports.CommandLineChoiceParameter = exports.CommandLineIntegerListParameter = exports.CommandLineIntegerParameter = exports.CommandLineStringListParameter = exports.CommandLineStringParameter = exports.CommandLineFlagParameter = exports.CommandLineParameterWithArgument = exports.CommandLineParameter = exports.CommandLineParameterKind = exports.ScopedCommandLineAction = exports.DynamicCommandLineAction = exports.CommandLineAction = void 0;
/**
 * An object-oriented command-line parser for TypeScript projects.
 *
 * @packageDocumentation
 */
var CommandLineAction_1 = require("./providers/CommandLineAction");
Object.defineProperty(exports, "CommandLineAction", { enumerable: true, get: function () { return CommandLineAction_1.CommandLineAction; } });
var DynamicCommandLineAction_1 = require("./providers/DynamicCommandLineAction");
Object.defineProperty(exports, "DynamicCommandLineAction", { enumerable: true, get: function () { return DynamicCommandLineAction_1.DynamicCommandLineAction; } });
var ScopedCommandLineAction_1 = require("./providers/ScopedCommandLineAction");
Object.defineProperty(exports, "ScopedCommandLineAction", { enumerable: true, get: function () { return ScopedCommandLineAction_1.ScopedCommandLineAction; } });
var BaseClasses_1 = require("./parameters/BaseClasses");
Object.defineProperty(exports, "CommandLineParameterKind", { enumerable: true, get: function () { return BaseClasses_1.CommandLineParameterKind; } });
Object.defineProperty(exports, "CommandLineParameter", { enumerable: true, get: function () { return BaseClasses_1.CommandLineParameter; } });
Object.defineProperty(exports, "CommandLineParameterWithArgument", { enumerable: true, get: function () { return BaseClasses_1.CommandLineParameterWithArgument; } });
var CommandLineFlagParameter_1 = require("./parameters/CommandLineFlagParameter");
Object.defineProperty(exports, "CommandLineFlagParameter", { enumerable: true, get: function () { return CommandLineFlagParameter_1.CommandLineFlagParameter; } });
var CommandLineStringParameter_1 = require("./parameters/CommandLineStringParameter");
Object.defineProperty(exports, "CommandLineStringParameter", { enumerable: true, get: function () { return CommandLineStringParameter_1.CommandLineStringParameter; } });
var CommandLineStringListParameter_1 = require("./parameters/CommandLineStringListParameter");
Object.defineProperty(exports, "CommandLineStringListParameter", { enumerable: true, get: function () { return CommandLineStringListParameter_1.CommandLineStringListParameter; } });
var CommandLineIntegerParameter_1 = require("./parameters/CommandLineIntegerParameter");
Object.defineProperty(exports, "CommandLineIntegerParameter", { enumerable: true, get: function () { return CommandLineIntegerParameter_1.CommandLineIntegerParameter; } });
var CommandLineIntegerListParameter_1 = require("./parameters/CommandLineIntegerListParameter");
Object.defineProperty(exports, "CommandLineIntegerListParameter", { enumerable: true, get: function () { return CommandLineIntegerListParameter_1.CommandLineIntegerListParameter; } });
var CommandLineChoiceParameter_1 = require("./parameters/CommandLineChoiceParameter");
Object.defineProperty(exports, "CommandLineChoiceParameter", { enumerable: true, get: function () { return CommandLineChoiceParameter_1.CommandLineChoiceParameter; } });
var CommandLineChoiceListParameter_1 = require("./parameters/CommandLineChoiceListParameter");
Object.defineProperty(exports, "CommandLineChoiceListParameter", { enumerable: true, get: function () { return CommandLineChoiceListParameter_1.CommandLineChoiceListParameter; } });
var CommandLineRemainder_1 = require("./parameters/CommandLineRemainder");
Object.defineProperty(exports, "CommandLineRemainder", { enumerable: true, get: function () { return CommandLineRemainder_1.CommandLineRemainder; } });
var CommandLineParameterProvider_1 = require("./providers/CommandLineParameterProvider");
Object.defineProperty(exports, "CommandLineParameterProvider", { enumerable: true, get: function () { return CommandLineParameterProvider_1.CommandLineParameterProvider; } });
var CommandLineParser_1 = require("./providers/CommandLineParser");
Object.defineProperty(exports, "CommandLineParser", { enumerable: true, get: function () { return CommandLineParser_1.CommandLineParser; } });
var DynamicCommandLineParser_1 = require("./providers/DynamicCommandLineParser");
Object.defineProperty(exports, "DynamicCommandLineParser", { enumerable: true, get: function () { return DynamicCommandLineParser_1.DynamicCommandLineParser; } });
var CommandLineHelper_1 = require("./CommandLineHelper");
Object.defineProperty(exports, "CommandLineHelper", { enumerable: true, get: function () { return CommandLineHelper_1.CommandLineHelper; } });
//# sourceMappingURL=index.js.map"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.CommandLineAction = void 0;
const CommandLineParameterProvider_1 = require("./CommandLineParameterProvider");
/**
 * Example: "do-something"
 */
const ACTION_NAME_REGEXP = /^[a-z][a-z0-9]*([-:][a-z0-9]+)*$/;
/**
 * Represents a sub-command that is part of the CommandLineParser command line.
 * Applications should create subclasses of CommandLineAction corresponding to
 * each action that they want to expose.
 *
 * The action name should be comprised of lower case words separated by hyphens
 * or colons. The name should include an English verb (e.g. "deploy"). Use a
 * hyphen to separate words (e.g. "upload-docs"). A group of related commands
 * can be prefixed with a colon (e.g. "docs:generate", "docs:deploy",
 * "docs:serve", etc).
 *
 * @public
 */
class CommandLineAction extends CommandLineParameterProvider_1.CommandLineParameterProvider {
    constructor(options) {
        super();
        if (!ACTION_NAME_REGEXP.test(options.actionName)) {
            throw new Error(`Invalid action name "${options.actionName}". ` +
                `The name must be comprised of lower-case words optionally separated by hyphens or colons.`);
        }
        this.actionName = options.actionName;
        this.summary = options.summary;
        this.documentation = options.documentation;
        this._argumentParser = undefined;
    }
    /**
     * This is called internally by CommandLineParser.addAction()
     * @internal
     */
    _buildParser(actionsSubParser) {
        var _a;
        this._argumentParser = actionsSubParser.addParser(this.actionName, {
            help: this.summary,
            description: this.documentation
        });
        (_a = this.onDefineParameters) === null || _a === void 0 ? void 0 : _a.call(this);
    }
    /**
     * This is called internally by CommandLineParser.execute()
     * @internal
     */
    _processParsedData(parserOptions, data) {
        super._processParsedData(parserOptions, data);
    }
    /**
     * Invoked by CommandLineParser.onExecute().
     * @internal
     */
    _execute() {
        return this.onExecute();
    }
    /**
     * {@inheritDoc CommandLineParameterProvider._getArgumentParser}
     * @internal
     */
    _getArgumentParser() {
        // override
        if (!this._argumentParser) {
            // We will improve this in the future
            throw new Error('The CommandLineAction must be added to a CommandLineParser before it can be used');
        }
        return this._argumentParser;
    }
}
exports.CommandLineAction = CommandLineAction;
//# sourceMappingURL=CommandLineAction.js.map"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
    o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
    if (mod && mod.__esModule) return mod;
    var result = {};
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    __setModuleDefault(result, mod);
    return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CommandLineParameterProvider = void 0;
const argparse = __importStar(require("argparse"));
const BaseClasses_1 = require("../parameters/BaseClasses");
const CommandLineChoiceParameter_1 = require("../parameters/CommandLineChoiceParameter");
const CommandLineChoiceListParameter_1 = require("../parameters/CommandLineChoiceListParameter");
const CommandLineIntegerParameter_1 = require("../parameters/CommandLineIntegerParameter");
const CommandLineIntegerListParameter_1 = require("../parameters/CommandLineIntegerListParameter");
const CommandLineFlagParameter_1 = require("../parameters/CommandLineFlagParameter");
const CommandLineStringParameter_1 = require("../parameters/CommandLineStringParameter");
const CommandLineStringListParameter_1 = require("../parameters/CommandLineStringListParameter");
const CommandLineRemainder_1 = require("../parameters/CommandLineRemainder");
const Constants_1 = require("../Constants");
const SCOPE_GROUP_NAME = 'scope';
const LONG_NAME_GROUP_NAME = 'longName';
const POSSIBLY_SCOPED_LONG_NAME_REGEXP = /^--((?<scope>[a-z0-9]+(-[a-z0-9]+)*):)?(?<longName>[a-z0-9]+((-[a-z0-9]+)+)?)$/;
/**
 * This is the common base class for CommandLineAction and CommandLineParser
 * that provides functionality for defining command-line parameters.
 *
 * @public
 */
class CommandLineParameterProvider {
    /** @internal */
    // Third party code should not inherit subclasses or call this constructor
    constructor() {
        this._parameters = [];
        this._parametersByLongName = new Map();
        this._parameterGroupsByName = new Map();
        this._parametersRegistered = false;
        this._parametersProcessed = false;
    }
    /**
     * Returns a collection of the parameters that were defined for this object.
     */
    get parameters() {
        return this._parameters;
    }
    /**
     * Informs the caller if the argparse data has been processed into parameters.
     */
    get parametersProcessed() {
        return this._parametersProcessed;
    }
    /**
     * If {@link CommandLineParameterProvider.defineCommandLineRemainder} was called,
     * this object captures any remaining command line arguments after the recognized portion.
     */
    get remainder() {
        return this._remainder;
    }
    /**
     * Defines a command-line parameter whose value must be a string from a fixed set of
     * allowable choices (similar to an enum).
     *
     * @remarks
     * Example of a choice parameter:
     * ```
     * example-tool --log-level warn
     * ```
     */
    defineChoiceParameter(definition) {
        const parameter = new CommandLineChoiceParameter_1.CommandLineChoiceParameter(definition);
        this._defineParameter(parameter);
        return parameter;
    }
    /**
     * Returns the CommandLineChoiceParameter with the specified long name.
     * @remarks
     * This method throws an exception if the parameter is not defined.
     */
    getChoiceParameter(parameterLongName, parameterScope) {
        return this._getParameter(parameterLongName, BaseClasses_1.CommandLineParameterKind.Choice, parameterScope);
    }
    /**
     * Defines a command-line parameter whose value must be a string from a fixed set of
     * allowable choices (similar to an enum). The parameter can be specified multiple times to
     * build a list.
     *
     * @remarks
     * Example of a choice list parameter:
     * ```
     * example-tool --allow-color red --allow-color green
     * ```
     */
    defineChoiceListParameter(definition) {
        const parameter = new CommandLineChoiceListParameter_1.CommandLineChoiceListParameter(definition);
        this._defineParameter(parameter);
        return parameter;
    }
    /**
     * Returns the CommandLineChoiceListParameter with the specified long name.
     * @remarks
     * This method throws an exception if the parameter is not defined.
     */
    getChoiceListParameter(parameterLongName, parameterScope) {
        return this._getParameter(parameterLongName, BaseClasses_1.CommandLineParameterKind.ChoiceList, parameterScope);
    }
    /**
     * Defines a command-line switch whose boolean value is true if the switch is provided,
     * and false otherwise.
     *
     * @remarks
     * Example usage of a flag parameter:
     * ```
     * example-tool --debug
     * ```
     */
    defineFlagParameter(definition) {
        const parameter = new CommandLineFlagParameter_1.CommandLineFlagParameter(definition);
        this._defineParameter(parameter);
        return parameter;
    }
    /**
     * Returns the CommandLineFlagParameter with the specified long name.
     * @remarks
     * This method throws an exception if the parameter is not defined.
     */
    getFlagParameter(parameterLongName, parameterScope) {
        return this._getParameter(parameterLongName, BaseClasses_1.CommandLineParameterKind.Flag, parameterScope);
    }
    /**
     * Defines a command-line parameter whose argument is an integer.
     *
     * @remarks
     * Example usage of an integer parameter:
     * ```
     * example-tool --max-attempts 5
     * ```
     */
    defineIntegerParameter(definition) {
        const parameter = new CommandLineIntegerParameter_1.CommandLineIntegerParameter(definition);
        this._defineParameter(parameter);
        return parameter;
    }
    /**
     * Returns the CommandLineIntegerParameter with the specified long name.
     * @remarks
     * This method throws an exception if the parameter is not defined.
     */
    getIntegerParameter(parameterLongName, parameterScope) {
        return this._getParameter(parameterLongName, BaseClasses_1.CommandLineParameterKind.Integer, parameterScope);
    }
    /**
     * Defines a command-line parameter whose argument is an integer. The parameter can be specified
     * multiple times to build a list.
     *
     * @remarks
     * Example usage of an integer list parameter:
     * ```
     * example-tool --avoid 4 --avoid 13
     * ```
     */
    defineIntegerListParameter(definition) {
        const parameter = new CommandLineIntegerListParameter_1.CommandLineIntegerListParameter(definition);
        this._defineParameter(parameter);
        return parameter;
    }
    /**
     * Returns the CommandLineIntegerParameter with the specified long name.
     * @remarks
     * This method throws an exception if the parameter is not defined.
     */
    getIntegerListParameter(parameterLongName, parameterScope) {
        return this._getParameter(parameterLongName, BaseClasses_1.CommandLineParameterKind.IntegerList, parameterScope);
    }
    /**
     * Defines a command-line parameter whose argument is a single text string.
     *
     * @remarks
     * Example usage of a string parameter:
     * ```
     * example-tool --message "Hello, world!"
     * ```
     */
    defineStringParameter(definition) {
        const parameter = new CommandLineStringParameter_1.CommandLineStringParameter(definition);
        this._defineParameter(parameter);
        return parameter;
    }
    /**
     * Returns the CommandLineStringParameter with the specified long name.
     * @remarks
     * This method throws an exception if the parameter is not defined.
     */
    getStringParameter(parameterLongName, parameterScope) {
        return this._getParameter(parameterLongName, BaseClasses_1.CommandLineParameterKind.String, parameterScope);
    }
    /**
     * Defines a command-line parameter whose argument is a single text string.  The parameter can be
     * specified multiple times to build a list.
     *
     * @remarks
     * Example usage of a string list parameter:
     * ```
     * example-tool --add file1.txt --add file2.txt --add file3.txt
     * ```
     */
    defineStringListParameter(definition) {
        const parameter = new CommandLineStringListParameter_1.CommandLineStringListParameter(definition);
        this._defineParameter(parameter);
        return parameter;
    }
    /**
     * Defines a rule that captures any remaining command line arguments after the recognized portion.
     *
     * @remarks
     * This feature is useful for commands that pass their arguments along to an external tool, relying on
     * that tool to perform validation.  (It could also be used to parse parameters without any validation
     * or documentation, but that is not recommended.)
     *
     * Example of capturing the remainder after an optional flag parameter.
     * ```
     * example-tool --my-flag this is the remainder
     * ```
     *
     * In the "--help" documentation, the remainder rule will be represented as "...".
     */
    defineCommandLineRemainder(definition) {
        if (this._remainder) {
            throw new Error('defineRemainingArguments() has already been called for this provider');
        }
        this._remainder = new CommandLineRemainder_1.CommandLineRemainder(definition);
        return this._remainder;
    }
    /**
     * Returns the CommandLineStringListParameter with the specified long name.
     * @remarks
     * This method throws an exception if the parameter is not defined.
     */
    getStringListParameter(parameterLongName, parameterScope) {
        return this._getParameter(parameterLongName, BaseClasses_1.CommandLineParameterKind.StringList, parameterScope);
    }
    /**
     * Generates the command-line help text.
     */
    renderHelpText() {
        this._registerDefinedParameters();
        return this._getArgumentParser().formatHelp();
    }
    /**
     * Generates the command-line usage text.
     */
    renderUsageText() {
        this._registerDefinedParameters();
        return this._getArgumentParser().formatUsage();
    }
    /**
     * Returns a object which maps the long name of each parameter in this.parameters
     * to the stringified form of its value. This is useful for logging telemetry, but
     * it is not the proper way of accessing parameters or their values.
     */
    getParameterStringMap() {
        const parameterMap = {};
        for (const parameter of this.parameters) {
            const parameterName = parameter.scopedLongName || parameter.longName;
            switch (parameter.kind) {
                case BaseClasses_1.CommandLineParameterKind.Flag:
                case BaseClasses_1.CommandLineParameterKind.Choice:
                case BaseClasses_1.CommandLineParameterKind.String:
                case BaseClasses_1.CommandLineParameterKind.Integer:
                    parameterMap[parameterName] = JSON.stringify(parameter.value);
                    break;
                case BaseClasses_1.CommandLineParameterKind.StringList:
                case BaseClasses_1.CommandLineParameterKind.IntegerList:
                case BaseClasses_1.CommandLineParameterKind.ChoiceList:
                    const arrayValue = parameter.values;
                    parameterMap[parameterName] = arrayValue ? arrayValue.join(',') : '';
                    break;
            }
        }
        return parameterMap;
    }
    /**
     * Returns an object with the parsed scope (if present) and the long name of the parameter.
     */
    parseScopedLongName(scopedLongName) {
        const result = POSSIBLY_SCOPED_LONG_NAME_REGEXP.exec(scopedLongName);
        if (!result || !result.groups) {
            throw new Error(`The parameter long name "${scopedLongName}" is not valid.`);
        }
        return {
            longName: `--${result.groups[LONG_NAME_GROUP_NAME]}`,
            scope: result.groups[SCOPE_GROUP_NAME]
        };
    }
    /** @internal */
    _registerDefinedParameters() {
        if (this._parametersRegistered) {
            // We prevent new parameters from being defined after the first call to _registerDefinedParameters,
            // so we can already ensure that all parameters were registered.
            return;
        }
        this._parametersRegistered = true;
        for (const longNameParameters of this._parametersByLongName.values()) {
            const useScopedLongName = longNameParameters.length > 1;
            for (const parameter of longNameParameters) {
                if (useScopedLongName && !parameter.parameterScope) {
                    throw new Error(`The parameter "${parameter.longName}" is defined multiple times with the same long name. ` +
                        'Parameters with the same long name must define a scope.');
                }
                this._registerParameter(parameter, useScopedLongName);
            }
        }
        // Need to add the remainder parameter last
        if (this._remainder) {
            const argparseOptions = {
                help: this._remainder.description,
                nargs: argparse.Const.REMAINDER,
                metavar: '"..."'
            };
            this._getArgumentParser().addArgument(argparse.Const.REMAINDER, argparseOptions);
        }
    }
    /** @internal */
    _processParsedData(parserOptions, data) {
        if (!this._parametersRegistered) {
            throw new Error('Parameters have not been registered');
        }
        if (this._parametersProcessed) {
            throw new Error('Command Line Parser Data was already processed');
        }
        // Fill in the values for the parameters
        for (const parameter of this._parameters) {
            const value = data[parameter._parserKey]; // eslint-disable-line @typescript-eslint/no-explicit-any
            parameter._setValue(value);
        }
        if (this.remainder) {
            this.remainder._setValue(data[argparse.Const.REMAINDER]);
        }
        this._parametersProcessed = true;
    }
    /** @internal */
    _defineParameter(parameter) {
        if (this._parametersRegistered) {
            throw new Error('Parameters have already been registered for this provider');
        }
        // Generate and set the parser key at definition time
        parameter._parserKey = this._generateKey();
        this._parameters.push(parameter);
        // Collect all parameters with the same long name. We will perform conflict resolution at registration.
        let longNameParameters = this._parametersByLongName.get(parameter.longName);
        if (!longNameParameters) {
            longNameParameters = [];
            this._parametersByLongName.set(parameter.longName, longNameParameters);
        }
        longNameParameters.push(parameter);
    }
    /** @internal */
    _registerParameter(parameter, useScopedLongName) {
        const names = [];
        if (parameter.shortName) {
            names.push(parameter.shortName);
        }
        // Use the original long name unless otherwise requested
        if (!useScopedLongName) {
            names.push(parameter.longName);
        }
        // Add the scoped long name if it exists
        if (parameter.scopedLongName) {
            names.push(parameter.scopedLongName);
        }
        let finalDescription = parameter.description;
        const supplementaryNotes = [];
        parameter._getSupplementaryNotes(supplementaryNotes);
        if (supplementaryNotes.length > 0) {
            // If they left the period off the end of their sentence, then add one.
            if (finalDescription.match(/[a-z0-9]"?\s*$/i)) {
                finalDescription = finalDescription.trimRight() + '.';
            }
            // Append the supplementary text
            finalDescription += ' ' + supplementaryNotes.join(' ');
        }
        // NOTE: Our "environmentVariable" feature takes precedence over argparse's "defaultValue",
        // so we have to reimplement that feature.
        const argparseOptions = {
            help: finalDescription,
            dest: parameter._parserKey,
            metavar: parameter.argumentName || undefined,
            required: parameter.required
        };
        switch (parameter.kind) {
            case BaseClasses_1.CommandLineParameterKind.Choice: {
                const choiceParameter = parameter;
                argparseOptions.choices = choiceParameter.alternatives;
                break;
            }
            case BaseClasses_1.CommandLineParameterKind.ChoiceList: {
                const choiceParameter = parameter;
                argparseOptions.choices = choiceParameter.alternatives;
                argparseOptions.action = 'append';
                break;
            }
            case BaseClasses_1.CommandLineParameterKind.Flag:
                argparseOptions.action = 'storeTrue';
                break;
            case BaseClasses_1.CommandLineParameterKind.Integer:
                argparseOptions.type = 'int';
                break;
            case BaseClasses_1.CommandLineParameterKind.IntegerList:
                argparseOptions.type = 'int';
                argparseOptions.action = 'append';
                break;
            case BaseClasses_1.CommandLineParameterKind.String:
                break;
            case BaseClasses_1.CommandLineParameterKind.StringList:
                argparseOptions.action = 'append';
                break;
        }
        let argumentGroup;
        if (parameter.parameterGroup) {
            argumentGroup = this._parameterGroupsByName.get(parameter.parameterGroup);
            if (!argumentGroup) {
                let parameterGroupName;
                if (typeof parameter.parameterGroup === 'string') {
                    parameterGroupName = parameter.parameterGroup;
                }
                else if (parameter.parameterGroup === Constants_1.SCOPING_PARAMETER_GROUP) {
                    parameterGroupName = 'scoping';
                }
                else {
                    throw new Error('Unexpected parameter group: ' + parameter.parameterGroup);
                }
                argumentGroup = this._getArgumentParser().addArgumentGroup({
                    title: `Optional ${parameterGroupName} arguments`
                });
                this._parameterGroupsByName.set(parameter.parameterGroup, argumentGroup);
            }
        }
        else {
            argumentGroup = this._getArgumentParser();
        }
        argumentGroup.addArgument(names, Object.assign({}, argparseOptions));
        if (parameter.undocumentedSynonyms && parameter.undocumentedSynonyms.length > 0) {
            argumentGroup.addArgument(parameter.undocumentedSynonyms, Object.assign(Object.assign({}, argparseOptions), { help: argparse.Const.SUPPRESS }));
        }
    }
    _generateKey() {
        return 'key_' + (CommandLineParameterProvider._keyCounter++).toString();
    }
    _getParameter(parameterLongName, expectedKind, parameterScope) {
        // Support the parameter long name being prefixed with the scope
        const { scope, longName } = this.parseScopedLongName(parameterLongName);
        parameterLongName = longName;
        parameterScope = scope || parameterScope;
        const parameters = this._parametersByLongName.get(parameterLongName);
        if (!parameters) {
            throw new Error(`The parameter "${parameterLongName}" is not defined`);
        }
        const parameter = parameters.find((p) => p.parameterScope === parameterScope);
        if (!parameter) {
            throw new Error(`The parameter "${parameterLongName}" with scope "${parameterScope}" is not defined.`);
        }
        if (parameter.kind !== expectedKind) {
            throw new Error(`The parameter "${parameterLongName}" is of type "${BaseClasses_1.CommandLineParameterKind[parameter.kind]}"` +
                ` whereas the caller was expecting "${BaseClasses_1.CommandLineParameterKind[expectedKind]}".`);
        }
        return parameter;
    }
}
exports.CommandLineParameterProvider = CommandLineParameterProvider;
CommandLineParameterProvider._keyCounter = 0;
//# sourceMappingURL=CommandLineParameterProvider.js.map"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CommandLineParser = void 0;
const colors_1 = __importDefault(require("colors"));
const CommandLineParameterProvider_1 = require("./CommandLineParameterProvider");
const CommandLineParserExitError_1 = require("./CommandLineParserExitError");
const TabCompletionAction_1 = require("./TabCompletionAction");
/**
 * The "argparse" library is a relatively advanced command-line parser with features such
 * as word-wrapping and intelligible error messages (that are lacking in other similar
 * libraries such as commander, yargs, and nomnom).  Unfortunately, its ruby-inspired API
 * is awkward to use.  The abstract base classes CommandLineParser and CommandLineAction
 * provide a wrapper for "argparse" that makes defining and consuming arguments quick
 * and simple, and enforces that appropriate documentation is provided for each parameter.
 *
 * @public
 */
class CommandLineParser extends CommandLineParameterProvider_1.CommandLineParameterProvider {
    constructor(options) {
        var _a, _b;
        super();
        this._executed = false;
        this._tabCompleteActionWasAdded = false;
        this._options = options;
        this._actions = [];
        this._actionsByName = new Map();
        this._argumentParser = new CommandLineParserExitError_1.CustomArgumentParser({
            addHelp: true,
            prog: this._options.toolFilename,
            description: this._options.toolDescription,
            epilog: colors_1.default.bold((_a = this._options.toolEpilog) !== null && _a !== void 0 ? _a : `For detailed help about a specific command, use: ${this._options.toolFilename} <command> -h`)
        });
        (_b = this.onDefineParameters) === null || _b === void 0 ? void 0 : _b.call(this);
    }
    /**
     * Returns the list of actions that were defined for this CommandLineParser object.
     */
    get actions() {
        return this._actions;
    }
    /**
     * Defines a new action that can be used with the CommandLineParser instance.
     */
    addAction(action) {
        if (!this._actionsSubParser) {
            this._actionsSubParser = this._argumentParser.addSubparsers({
                metavar: '<command>',
                dest: 'action'
            });
        }
        action._buildParser(this._actionsSubParser);
        this._actions.push(action);
        this._actionsByName.set(action.actionName, action);
    }
    /**
     * Retrieves the action with the specified name.  If no matching action is found,
     * an exception is thrown.
     */
    getAction(actionName) {
        const action = this.tryGetAction(actionName);
        if (!action) {
            throw new Error(`The action "${actionName}" was not defined`);
        }
        return action;
    }
    /**
     * Retrieves the action with the specified name.  If no matching action is found,
     * undefined is returned.
     */
    tryGetAction(actionName) {
        return this._actionsByName.get(actionName);
    }
    /**
     * The program entry point will call this method to begin parsing command-line arguments
     * and executing the corresponding action.
     *
     * @remarks
     * The returned promise will never reject:  If an error occurs, it will be printed
     * to stderr, process.exitCode will be set to 1, and the promise will resolve to false.
     * This simplifies the most common usage scenario where the program entry point doesn't
     * want to be involved with the command-line logic, and will discard the promise without
     * a then() or catch() block.
     *
     * If your caller wants to trap and handle errors, use {@link CommandLineParser.executeWithoutErrorHandling}
     * instead.
     *
     * @param args - the command-line arguments to be parsed; if omitted, then
     *               the process.argv will be used
     */
    async execute(args) {
        if (this._options.enableTabCompletionAction && !this._tabCompleteActionWasAdded) {
            this.addAction(new TabCompletionAction_1.TabCompleteAction(this.actions, this.parameters));
            this._tabCompleteActionWasAdded = true;
        }
        try {
            await this.executeWithoutErrorHandling(args);
            return true;
        }
        catch (err) {
            if (err instanceof CommandLineParserExitError_1.CommandLineParserExitError) {
                // executeWithoutErrorHandling() handles the successful cases,
                // so here we can assume err has a nonzero exit code
                if (err.message) {
                    console.error(err.message);
                }
                if (!process.exitCode) {
                    process.exitCode = err.exitCode;
                }
            }
            else {
                let message = (err.message || 'An unknown error occurred').trim();
                // If the message doesn't already start with "Error:" then add a prefix
                if (!/^(error|internal error|warning)\b/i.test(message)) {
                    message = 'Error: ' + message;
                }
                console.error();
                console.error(colors_1.default.red(message));
                if (!process.exitCode) {
                    process.exitCode = 1;
                }
            }
            return false;
        }
    }
    /**
     * This is similar to {@link CommandLineParser.execute}, except that execution errors
     * simply cause the promise to reject.  It is the caller's responsibility to trap
     */
    async executeWithoutErrorHandling(args) {
        try {
            if (this._executed) {
                // In the future we could allow the same parser to be invoked multiple times
                // with different arguments.  We'll do that work as soon as someone encounters
                // a real world need for it.
                throw new Error('execute() was already called for this parser instance');
            }
            this._executed = true;
            this._validateDefinitions();
            // Register the parameters before we print help or parse the CLI
            this._registerDefinedParameters();
            if (!args) {
                // 0=node.exe, 1=script name
                args = process.argv.slice(2);
            }
            if (this.actions.length > 0 && args.length === 0) {
                // Parsers that use actions should print help when 0 args are provided. Allow
                // actionless parsers to continue on zero args.
                this._argumentParser.printHelp();
                return;
            }
            const data = this._argumentParser.parseArgs(args);
            this._processParsedData(this._options, data);
            for (const action of this._actions) {
                if (action.actionName === data.action) {
                    this.selectedAction = action;
                    action._processParsedData(this._options, data);
                    break;
                }
            }
            if (this.actions.length > 0 && !this.selectedAction) {
                const actions = this.actions.map((x) => x.actionName);
                throw new Error(`An action must be specified (${actions.join(', ')})`);
            }
            return this.onExecute();
        }
        catch (err) {
            if (err instanceof CommandLineParserExitError_1.CommandLineParserExitError) {
                if (!err.exitCode) {
                    // non-error exit modeled using exception handling
                    if (err.message) {
                        console.log(err.message);
                    }
                    return;
                }
            }
            throw err;
        }
    }
    /** @internal */
    _registerDefinedParameters() {
        super._registerDefinedParameters();
        for (const action of this._actions) {
            action._registerDefinedParameters();
        }
    }
    _validateDefinitions() {
        if (this.remainder && this.actions.length > 0) {
            // This is apparently not supported by argparse
            throw new Error('defineCommandLineRemainder() cannot be called for a CommandLineParser with actions');
        }
    }
    /**
     * {@inheritDoc CommandLineParameterProvider._getArgumentParser}
     * @internal
     */
    _getArgumentParser() {
        // override
        return this._argumentParser;
    }
    /**
     * This hook allows the subclass to perform additional operations before or after
     * the chosen action is executed.
     */
    async onExecute() {
        if (this.selectedAction) {
            await this.selectedAction._execute();
        }
    }
}
exports.CommandLineParser = CommandLineParser;
//# sourceMappingURL=CommandLineParser.js.map"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
    o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
    if (mod && mod.__esModule) return mod;
    var result = {};
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    __setModuleDefault(result, mod);
    return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CustomArgumentParser = exports.CommandLineParserExitError = void 0;
const argparse = __importStar(require("argparse"));
class CommandLineParserExitError extends Error {
    constructor(exitCode, message) {
        super(message);
        // Manually set the prototype, as we can no longer extend built-in classes like Error, Array, Map, etc
        // https://github.com/microsoft/TypeScript-wiki/blob/main/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work
        //
        // Note: the prototype must also be set on any classes which extend this one
        this.__proto__ = CommandLineParserExitError.prototype; // eslint-disable-line @typescript-eslint/no-explicit-any
        this.exitCode = exitCode;
    }
}
exports.CommandLineParserExitError = CommandLineParserExitError;
class CustomArgumentParser extends argparse.ArgumentParser {
    exit(status, message) {
        // override
        throw new CommandLineParserExitError(status, message);
    }
    error(err) {
        // override
        // Ensure the ParserExitError bubbles up to the top without any special processing
        if (err instanceof CommandLineParserExitError) {
            throw err;
        }
        super.error(err);
    }
}
exports.CustomArgumentParser = CustomArgumentParser;
//# sourceMappingURL=CommandLineParserExitError.js.map"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DynamicCommandLineAction = void 0;
const CommandLineAction_1 = require("./CommandLineAction");
/**
 * @public
 */
class DynamicCommandLineAction extends CommandLineAction_1.CommandLineAction {
    async onExecute() {
        // abstract
        // (handled by the external code)
    }
}
exports.DynamicCommandLineAction = DynamicCommandLineAction;
//# sourceMappingURL=DynamicCommandLineAction.js.map"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.DynamicCommandLineParser = void 0;
const CommandLineParser_1 = require("./CommandLineParser");
/**
 * @public
 */
class DynamicCommandLineParser extends CommandLineParser_1.CommandLineParser {
}
exports.DynamicCommandLineParser = DynamicCommandLineParser;
//# sourceMappingURL=DynamicCommandLineParser.js.map"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.ScopedCommandLineAction = void 0;
const Constants_1 = require("../Constants");
const CommandLineAction_1 = require("./CommandLineAction");
const CommandLineParser_1 = require("./CommandLineParser");
const CommandLineParserExitError_1 = require("./CommandLineParserExitError");
/**
 * A CommandLineParser used exclusively to parse the scoped command-line parameters
 * for a ScopedCommandLineAction.
 */
class InternalScopedCommandLineParser extends CommandLineParser_1.CommandLineParser {
    constructor(options) {
        // We can run the parser directly because we are not going to use it for any other actions,
        // so construct a special options object to make the "--help" text more useful.
        const scopingArgs = [];
        for (const parameter of options.unscopedActionParameters) {
            parameter.appendToArgList(scopingArgs);
        }
        const unscopedToolName = `${options.toolFilename} ${options.actionOptions.actionName}`;
        const scopedCommandLineParserOptions = {
            toolFilename: `${unscopedToolName}${scopingArgs.length ? ' ' + scopingArgs.join(' ') : ''} --`,
            toolDescription: options.actionOptions.documentation,
            toolEpilog: `For more information on available unscoped parameters, use "${unscopedToolName} --help"`,
            enableTabCompletionAction: false
        };
        super(scopedCommandLineParserOptions);
        this._canExecute = false;
        this._internalOptions = options;
        this._internalOptions.onDefineScopedParameters(this);
    }
    get canExecute() {
        return this._canExecute;
    }
    async onExecute() {
        // override
        // Only set if we made it this far, which may not be the case if an error occurred or
        // if '--help' was specified.
        this._canExecute = true;
    }
}
/**
 * Represents a sub-command that is part of the CommandLineParser command-line.
 * Applications should create subclasses of ScopedCommandLineAction corresponding to
 * each action that they want to expose.
 *
 * The action name should be comprised of lower case words separated by hyphens
 * or colons. The name should include an English verb (e.g. "deploy"). Use a
 * hyphen to separate words (e.g. "upload-docs"). A group of related commands
 * can be prefixed with a colon (e.g. "docs:generate", "docs:deploy",
 * "docs:serve", etc).
 *
 * Scoped commands allow for different parameters to be specified for different
 * provided scoping values. For example, the "scoped-action --scope A" command
 * may allow for different scoped arguments to be specified than the "scoped-action
 * --scope B" command.
 *
 * Scoped arguments are specified after the "--" pseudo-argument. For example,
 * "scoped-action --scope A -- --scopedFoo --scopedBar".
 *
 * @public
 */
class ScopedCommandLineAction extends CommandLineAction_1.CommandLineAction {
    constructor(options) {
        super(options);
        this._options = options;
        this._scopingParameters = [];
    }
    /**
     * {@inheritDoc CommandLineParameterProvider.parameters}
     */
    get parameters() {
        if (this._scopedCommandLineParser) {
            return [...super.parameters, ...this._scopedCommandLineParser.parameters];
        }
        else {
            return super.parameters;
        }
    }
    /**
     * {@inheritdoc CommandLineAction._processParsedData}
     * @internal
     */
    _processParsedData(parserOptions, data) {
        // override
        super._processParsedData(parserOptions, data);
        this._unscopedParserOptions = parserOptions;
        // Generate the scoped parser using the parent parser information. We can only create this after we
        // have parsed the data, since the parameter values are used during construction.
        this._scopedCommandLineParser = new InternalScopedCommandLineParser(Object.assign(Object.assign({}, parserOptions), { actionOptions: this._options, unscopedActionParameters: this.parameters, onDefineScopedParameters: this.onDefineScopedParameters.bind(this) }));
    }
    /**
     * {@inheritdoc CommandLineAction._execute}
     * @internal
     */
    async _execute() {
        // override
        if (!this._unscopedParserOptions || !this._scopedCommandLineParser) {
            throw new Error('The CommandLineAction parameters must be processed before execution.');
        }
        if (!this.remainder) {
            throw new Error('CommandLineAction.onDefineParameters must be called before execution.');
        }
        // The '--' argument is required to separate the action parameters from the scoped parameters,
        // so it needs to be trimmed. If remainder values are provided but no '--' is found, then throw.
        const scopedArgs = [];
        if (this.remainder.values.length) {
            if (this.remainder.values[0] !== '--') {
                // Immitate argparse behavior and log out usage text before throwing.
                console.log(this.renderUsageText());
                throw new CommandLineParserExitError_1.CommandLineParserExitError(
                // argparse sets exit code 2 for invalid arguments
                2, 
                // model the message off of the built-in "unrecognized arguments" message
                `${this._unscopedParserOptions.toolFilename} ${this.actionName}: error: Unrecognized ` +
                    `arguments: ${this.remainder.values[0]}.`);
            }
            scopedArgs.push(...this.remainder.values.slice(1));
        }
        // Call the scoped parser using only the scoped args to handle parsing
        await this._scopedCommandLineParser.executeWithoutErrorHandling(scopedArgs);
        // Only call execute if the parser reached the execute stage. This may not be true if
        // the parser exited early due to a specified '--help' parameter.
        if (this._scopedCommandLineParser.canExecute) {
            await super._execute();
        }
        return;
    }
    /**
     * {@inheritdoc CommandLineParameterProvider.onDefineParameters}
     */
    onDefineParameters() {
        this.onDefineUnscopedParameters();
        if (!this._scopingParameters.length) {
            throw new Error('No scoping parameters defined. At least one scoping parameter must be defined. ' +
                'Scoping parameters are defined by setting the parameterGroupName to ' +
                'ScopedCommandLineAction.ScopingParameterGroupName.');
        }
        if (this.remainder) {
            throw new Error('Unscoped remainder parameters are not allowed. Remainder parameters can only be defined on ' +
                'the scoped parameter provider in onDefineScopedParameters().');
        }
        // Consume the remainder of the command-line, which will later be passed the scoped parser.
        // This will also prevent developers from calling this.defineCommandLineRemainder(...) since
        // we will have already defined it.
        this.defineCommandLineRemainder({
            description: 'Scoped parameters.  Must be prefixed with "--", ex. "-- --scopedParameter ' +
                'foo --scopedFlag".  For more information on available scoped parameters, use "-- --help".'
        });
    }
    /**
     * Retrieves the scoped CommandLineParser, which is populated after the ScopedCommandLineAction is executed.
     * @internal
     */
    _getScopedCommandLineParser() {
        if (!this._scopedCommandLineParser) {
            throw new Error('The scoped CommandLineParser is only populated after the action is executed.');
        }
        return this._scopedCommandLineParser;
    }
    /** @internal */
    _defineParameter(parameter) {
        super._defineParameter(parameter);
        if (parameter.parameterGroup === ScopedCommandLineAction.ScopingParameterGroup) {
            this._scopingParameters.push(parameter);
        }
    }
}
exports.ScopedCommandLineAction = ScopedCommandLineAction;
/**
 * The required group name to apply to all scoping parameters. At least one parameter
 * must be defined with this group name.
 */
ScopedCommandLineAction.ScopingParameterGroup = Constants_1.SCOPING_PARAMETER_GROUP;
//# sourceMappingURL=ScopedCommandLineAction.js.map"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
var __asyncValues = (this && this.__asyncValues) || function (o) {
    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
    var m = o[Symbol.asyncIterator], i;
    return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
};
var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
    var i, p;
    return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
};
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
    var g = generator.apply(thisArg, _arguments || []), i, q = [];
    return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
    function fulfill(value) { resume("next", value); }
    function reject(value) { resume("throw", value); }
    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
};
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TabCompleteAction = void 0;
const string_argv_1 = __importDefault(require("string-argv"));
const BaseClasses_1 = require("../parameters/BaseClasses");
const CommandLineChoiceParameter_1 = require("../parameters/CommandLineChoiceParameter");
const CommandLineAction_1 = require("./CommandLineAction");
const DEFAULT_WORD_TO_AUTOCOMPLETE = '';
const DEFAULT_POSITION = 0;
class TabCompleteAction extends CommandLineAction_1.CommandLineAction {
    constructor(actions, globalParameters) {
        super({
            actionName: "tab-complete" /* CommandLineConstants.TabCompletionActionName */,
            summary: 'Provides tab completion.',
            documentation: 'Provides tab completion.'
        });
        this._actions = new Map();
        for (const action of actions) {
            const parameterNameToParameterInfoMap = new Map();
            for (const parameter of action.parameters) {
                parameterNameToParameterInfoMap.set(parameter.longName, parameter);
                if (parameter.shortName) {
                    parameterNameToParameterInfoMap.set(parameter.shortName, parameter);
                }
            }
            this._actions.set(action.actionName, parameterNameToParameterInfoMap);
        }
        this._globalParameters = new Map();
        for (const parameter of globalParameters) {
            this._globalParameters.set(parameter.longName, parameter);
            if (parameter.shortName) {
                this._globalParameters.set(parameter.shortName, parameter);
            }
        }
        this._wordToCompleteParameter = this.defineStringParameter({
            parameterLongName: '--word',
            argumentName: 'WORD',
            description: `The word to complete.`,
            defaultValue: DEFAULT_WORD_TO_AUTOCOMPLETE
        });
        this._positionParameter = this.defineIntegerParameter({
            parameterLongName: '--position',
            argumentName: 'INDEX',
            description: `The position in the word to be completed.`,
            defaultValue: DEFAULT_POSITION
        });
    }
    async onExecute() {
        var e_1, _a;
        const commandLine = this._wordToCompleteParameter.value || '';
        const caretPosition = this._positionParameter.value || (commandLine && commandLine.length) || 0;
        try {
            for (var _b = __asyncValues(this.getCompletions(commandLine, caretPosition)), _c; _c = await _b.next(), !_c.done;) {
                const value = _c.value;
                console.log(value);
            }
        }
        catch (e_1_1) { e_1 = { error: e_1_1 }; }
        finally {
            try {
                if (_c && !_c.done && (_a = _b.return)) await _a.call(_b);
            }
            finally { if (e_1) throw e_1.error; }
        }
    }
    getCompletions(commandLine, caretPosition = commandLine.length) {
        return __asyncGenerator(this, arguments, function* getCompletions_1() {
            const actions = this._actions;
            if (!commandLine || !caretPosition) {
                yield __await(yield* __asyncDelegator(__asyncValues(this._getAllActions())));
                return yield __await(void 0);
            }
            const tokens = Array.from(this.tokenizeCommandLine(commandLine));
            // offset arguments by the number of global params in the input
            const globalParameterOffset = this._getGlobalParameterOffset(tokens);
            if (tokens.length < 2 + globalParameterOffset) {
                yield __await(yield* __asyncDelegator(__asyncValues(this._getAllActions())));
                return yield __await(void 0);
            }
            const lastToken = tokens[tokens.length - 1];
            const secondLastToken = tokens[tokens.length - 2];
            const completePartialWord = caretPosition === commandLine.length;
            if (completePartialWord && tokens.length === 2 + globalParameterOffset) {
                for (const actionName of actions.keys()) {
                    if (actionName.indexOf(tokens[1 + globalParameterOffset]) === 0) {
                        yield yield __await(actionName);
                    }
                }
            }
            else {
                for (const actionName of actions.keys()) {
                    if (actionName === tokens[1 + globalParameterOffset]) {
                        const parameterNameMap = actions.get(actionName);
                        const parameterNames = Array.from(parameterNameMap.keys());
                        if (completePartialWord) {
                            for (const parameterName of parameterNames) {
                                if (parameterName === secondLastToken) {
                                    const values = yield __await(this._getParameterValueCompletions(parameterNameMap.get(parameterName)));
                                    if (values.length > 0) {
                                        yield __await(yield* __asyncDelegator(__asyncValues(this._completeParameterValues(values, lastToken))));
                                        return yield __await(void 0);
                                    }
                                }
                            }
                            yield __await(yield* __asyncDelegator(__asyncValues(this._completeParameterValues(parameterNames, lastToken))));
                        }
                        else {
                            for (const parameterName of parameterNames) {
                                if (parameterName === lastToken) {
                                    const values = yield __await(this._getParameterValueCompletions(parameterNameMap.get(parameterName)));
                                    if (values.length > 0) {
                                        yield __await(yield* __asyncDelegator(__asyncValues(values)));
                                        return yield __await(void 0);
                                    }
                                }
                            }
                            for (const parameterName of parameterNames) {
                                if (parameterName === lastToken &&
                                    parameterNameMap.get(parameterName).kind !== BaseClasses_1.CommandLineParameterKind.Flag) {
                                    // The parameter is expecting a value, so don't suggest parameter names again
                                    return yield __await(void 0);
                                }
                            }
                            yield __await(yield* __asyncDelegator(__asyncValues(parameterNames)));
                        }
                        break;
                    }
                }
            }
        });
    }
    *_getAllActions() {
        yield* this._actions.keys();
        yield* this._globalParameters.keys();
    }
    tokenizeCommandLine(commandLine) {
        return (0, string_argv_1.default)(commandLine);
    }
    async _getParameterValueCompletions(parameter) {
        let choiceParameterValues = [];
        if (parameter.kind === BaseClasses_1.CommandLineParameterKind.Choice) {
            choiceParameterValues = parameter.alternatives;
        }
        else if (parameter.kind !== BaseClasses_1.CommandLineParameterKind.Flag) {
            let parameterWithArgumentOrChoices = undefined;
            if (parameter instanceof BaseClasses_1.CommandLineParameterWithArgument) {
                parameterWithArgumentOrChoices = parameter;
            }
            else if (parameter instanceof CommandLineChoiceParameter_1.CommandLineChoiceParameter) {
                parameterWithArgumentOrChoices = parameter;
            }
            if (parameterWithArgumentOrChoices && parameterWithArgumentOrChoices.completions) {
                choiceParameterValues = await parameterWithArgumentOrChoices.completions();
            }
        }
        return choiceParameterValues;
    }
    _getGlobalParameterOffset(tokens) {
        const globalParameters = this._globalParameters;
        let count = 0;
        outer: for (let i = 1; i < tokens.length; i++) {
            for (const globalParameter of globalParameters.values()) {
                if (tokens[i] !== globalParameter.longName && tokens[i] !== globalParameter.shortName) {
                    break outer;
                }
            }
            count++;
        }
        return count;
    }
    *_completeParameterValues(choiceParameterValues, lastToken) {
        for (const choiceParameterValue of choiceParameterValues) {
            if (choiceParameterValue.indexOf(lastToken) === 0) {
                yield choiceParameterValue;
            }
        }
    }
}
exports.TabCompleteAction = TabCompleteAction;
//# sourceMappingURL=TabCompletionAction.js.map"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.CommandLineParameterWithArgument = exports.CommandLineParameter = exports.CommandLineParameterKind = void 0;
/**
 * Identifies the kind of a CommandLineParameter.
 * @public
 */
var CommandLineParameterKind;
(function (CommandLineParameterKind) {
    /** Indicates a CommandLineChoiceParameter */
    CommandLineParameterKind[CommandLineParameterKind["Choice"] = 0] = "Choice";
    /** Indicates a CommandLineFlagParameter */
    CommandLineParameterKind[CommandLineParameterKind["Flag"] = 1] = "Flag";
    /** Indicates a CommandLineIntegerParameter */
    CommandLineParameterKind[CommandLineParameterKind["Integer"] = 2] = "Integer";
    /** Indicates a CommandLineStringParameter */
    CommandLineParameterKind[CommandLineParameterKind["String"] = 3] = "String";
    /** Indicates a CommandLineStringListParameter */
    CommandLineParameterKind[CommandLineParameterKind["StringList"] = 4] = "StringList";
    /** Indicates a CommandLineChoiceListParameter */
    CommandLineParameterKind[CommandLineParameterKind["ChoiceList"] = 5] = "ChoiceList";
    /** Indicates a CommandLineIntegerListParameter */
    CommandLineParameterKind[CommandLineParameterKind["IntegerList"] = 6] = "IntegerList";
})(CommandLineParameterKind = exports.CommandLineParameterKind || (exports.CommandLineParameterKind = {}));
/**
 * Matches kebab-case formatted strings prefixed with double dashes.
 * Example: "--do-something"
 */
const LONG_NAME_REGEXP = /^-(-[a-z0-9]+)+$/;
/**
 * Matches a single upper-case or lower-case letter prefixed with a dash.
 * Example: "-d"
 */
const SHORT_NAME_REGEXP = /^-[a-zA-Z]$/;
/**
 * Matches kebab-case formatted strings
 * Example: "my-scope"
 */
const SCOPE_REGEXP = /^[a-z0-9]+(-[a-z0-9]+)*$/;
/**
 * "Environment variable names used by the utilities in the Shell and Utilities volume of
 * IEEE Std 1003.1-2001 consist solely of uppercase letters, digits, and the '_' (underscore)
 * from the characters defined in Portable Character Set and do not begin with a digit."
 * Example: "THE_SETTING"
 */
const ENVIRONMENT_VARIABLE_NAME_REGEXP = /^[A-Z_][A-Z0-9_]*$/;
/**
 * The base class for the various command-line parameter types.
 * @public
 */
class CommandLineParameter {
    /** @internal */
    constructor(definition) {
        this.longName = definition.parameterLongName;
        this.shortName = definition.parameterShortName;
        this.parameterGroup = definition.parameterGroup;
        this.parameterScope = definition.parameterScope;
        this.description = definition.description;
        this.required = !!definition.required;
        this.environmentVariable = definition.environmentVariable;
        this.undocumentedSynonyms = definition.undocumentedSynonyms;
        if (!LONG_NAME_REGEXP.test(this.longName)) {
            throw new Error(`Invalid name: "${this.longName}". The parameter long name must be` +
                ` lower-case and use dash delimiters (e.g. "--do-a-thing")`);
        }
        if (this.shortName) {
            if (!SHORT_NAME_REGEXP.test(this.shortName)) {
                throw new Error(`Invalid name: "${this.shortName}". The parameter short name must be` +
                    ` a dash followed by a single upper-case or lower-case letter (e.g. "-a")`);
            }
        }
        if (this.parameterScope) {
            if (!SCOPE_REGEXP.test(this.parameterScope)) {
                throw new Error(`Invalid scope: "${this.parameterScope}". The parameter scope name must be` +
                    ` lower-case and use dash delimiters (e.g. "my-scope")`);
            }
            // Parameter long name is guaranteed to start with '--' since this is validated above
            const unprefixedLongName = this.longName.slice(2);
            this.scopedLongName = `--${this.parameterScope}:${unprefixedLongName}`;
        }
        if (this.environmentVariable) {
            if (this.required) {
                // TODO: This constraint is imposed only because argparse enforces "required" parameters, but
                // it does not know about ts-command-line environment variable mappings.  We should fix this.
                throw new Error(`An "environmentVariable" cannot be specified for "${this.longName}"` +
                    ` because it is a required parameter`);
            }
            if (!ENVIRONMENT_VARIABLE_NAME_REGEXP.test(this.environmentVariable)) {
                throw new Error(`Invalid environment variable name: "${this.environmentVariable}". The name must` +
                    ` consist only of upper-case letters, numbers, and underscores. It may not start with a number.`);
            }
        }
        if (this.undocumentedSynonyms && this.undocumentedSynonyms.length > 0) {
            for (const undocumentedSynonym of this.undocumentedSynonyms) {
                if (this.longName === undocumentedSynonym) {
                    throw new Error(`Invalid name: "${undocumentedSynonym}". Undocumented synonyms must not be the same` +
                        ` as the the long name.`);
                }
                else if (!LONG_NAME_REGEXP.test(undocumentedSynonym)) {
                    throw new Error(`Invalid name: "${undocumentedSynonym}". All undocumented synonyms name must be lower-case and ` +
                        'use dash delimiters (e.g. "--do-a-thing")');
                }
            }
        }
    }
    /**
     * Returns additional text used by the help formatter.
     * @internal
     */
    _getSupplementaryNotes(supplementaryNotes) {
        // virtual
        if (this.environmentVariable !== undefined) {
            supplementaryNotes.push('This parameter may alternatively be specified via the ' +
                this.environmentVariable +
                ' environment variable.');
        }
    }
    /**
     * Internal usage only.  Used to report unexpected output from the argparse library.
     */
    // eslint-disable-next-line @typescript-eslint/no-explicit-any
    reportInvalidData(data) {
        throw new Error(`Unexpected data object for parameter "${this.longName}": ` + JSON.stringify(data));
    }
    validateDefaultValue(hasDefaultValue) {
        if (this.required && hasDefaultValue) {
            // If a parameter is "required", then the user understands that they always need to
            // specify a value for this parameter (either via the command line or via an environment variable).
            // It would be confusing to allow a default value that sometimes allows the "required" parameter
            // to be omitted.  If you sometimes don't have a suitable default value, then the better approach
            // is to throw a custom error explaining why the parameter is required in that case.
            throw new Error(`A default value cannot be specified for "${this.longName}" because it is a "required" parameter`);
        }
    }
}
exports.CommandLineParameter = CommandLineParameter;
/**
 * The common base class for parameters types that receive an argument.
 *
 * @remarks
 * An argument is an accompanying command-line token, such as "123" in the
 * example "--max-count 123".
 * @public
 */
class CommandLineParameterWithArgument extends CommandLineParameter {
    /** @internal */
    constructor(definition) {
        super(definition);
        if (definition.argumentName === '') {
            throw new Error('The argument name cannot be an empty string. (For the default name, specify undefined.)');
        }
        if (definition.argumentName.toUpperCase() !== definition.argumentName) {
            throw new Error(`Invalid name: "${definition.argumentName}". The argument name must be all upper case.`);
        }
        const match = definition.argumentName.match(CommandLineParameterWithArgument._invalidArgumentNameRegExp);
        if (match) {
            throw new Error(`The argument name "${definition.argumentName}" contains an invalid character "${match[0]}".` +
                ` Only upper-case letters, numbers, and underscores are allowed.`);
        }
        this.argumentName = definition.argumentName;
        this.completions = definition.completions;
    }
}
exports.CommandLineParameterWithArgument = CommandLineParameterWithArgument;
// Matches the first character that *isn't* part of a valid upper-case argument name such as "URL_2"
CommandLineParameterWithArgument._invalidArgumentNameRegExp = /[^A-Z_0-9]/;
//# sourceMappingURL=BaseClasses.js.map"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.CommandLineChoiceListParameter = void 0;
const BaseClasses_1 = require("./BaseClasses");
const EnvironmentVariableParser_1 = require("./EnvironmentVariableParser");
/**
 * The data type returned by {@link CommandLineParameterProvider.defineChoiceListParameter}.
 * @public
 */
class CommandLineChoiceListParameter extends BaseClasses_1.CommandLineParameter {
    /** @internal */
    constructor(definition) {
        super(definition);
        this._values = [];
        if (definition.alternatives.length < 1) {
            throw new Error(`When defining a choice list parameter, the alternatives list must contain at least one value.`);
        }
        this.alternatives = definition.alternatives;
        this.completions = definition.completions;
    }
    /** {@inheritDoc CommandLineParameter.kind} */
    get kind() {
        return BaseClasses_1.CommandLineParameterKind.ChoiceList;
    }
    /**
     * {@inheritDoc CommandLineParameter._setValue}
     * @internal
     */
    // eslint-disable-next-line @typescript-eslint/no-explicit-any
    _setValue(data) {
        // If argparse passed us a value, confirm it is valid
        if (data !== null && data !== undefined) {
            if (!Array.isArray(data)) {
                this.reportInvalidData(data);
            }
            for (const arrayItem of data) {
                if (typeof arrayItem !== 'string') {
                    this.reportInvalidData(data);
                }
            }
            this._values = data;
            return;
        }
        if (this.environmentVariable !== undefined) {
            const values = EnvironmentVariableParser_1.EnvironmentVariableParser.parseAsList(this.environmentVariable);
            if (values) {
                for (const value of values) {
                    if (this.alternatives.indexOf(value) < 0) {
                        const choices = '"' + this.alternatives.join('", "') + '"';
                        throw new Error(`Invalid value "${value}" for the environment variable` +
                            ` ${this.environmentVariable}.  Valid choices are: ${choices}`);
                    }
                }
                this._values = values;
                return;
            }
        }
        // (No default value for choice lists)
        this._values = [];
    }
    /**
     * Returns the string arguments for a choice list parameter that was parsed from the command line.
     *
     * @remarks
     * The array will be empty if the command-line has not been parsed yet,
     * or if the parameter was omitted and has no default value.
     */
    get values() {
        return this._values;
    }
    /** {@inheritDoc CommandLineParameter.appendToArgList} @override */
    appendToArgList(argList) {
        if (this.values.length > 0) {
            for (const value of this.values) {
                argList.push(this.longName);
                argList.push(value);
            }
        }
    }
}
exports.CommandLineChoiceListParameter = CommandLineChoiceListParameter;
//# sourceMappingURL=CommandLineChoiceListParameter.js.map"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.CommandLineChoiceParameter = void 0;
const BaseClasses_1 = require("./BaseClasses");
/**
 * The data type returned by {@link CommandLineParameterProvider.defineChoiceParameter}.
 * @public
 */
class CommandLineChoiceParameter extends BaseClasses_1.CommandLineParameter {
    /** @internal */
    constructor(definition) {
        super(definition);
        this._value = undefined;
        if (definition.alternatives.length < 1) {
            throw new Error(`When defining a choice parameter, the alternatives list must contain at least one value.`);
        }
        if (definition.defaultValue && definition.alternatives.indexOf(definition.defaultValue) === -1) {
            throw new Error(`The specified default value "${definition.defaultValue}"` +
                ` is not one of the available options: ${definition.alternatives.toString()}`);
        }
        this.alternatives = definition.alternatives;
        this.defaultValue = definition.defaultValue;
        this.validateDefaultValue(!!this.defaultValue);
        this.completions = definition.completions;
    }
    /** {@inheritDoc CommandLineParameter.kind} */
    get kind() {
        return BaseClasses_1.CommandLineParameterKind.Choice;
    }
    /**
     * {@inheritDoc CommandLineParameter._setValue}
     * @internal
     */
    // eslint-disable-next-line @typescript-eslint/no-explicit-any
    _setValue(data) {
        // abstract
        if (data !== null && data !== undefined) {
            if (typeof data !== 'string') {
                this.reportInvalidData(data);
            }
            this._value = data;
            return;
        }
        if (this.environmentVariable !== undefined) {
            // Try reading the environment variable
            const environmentValue = process.env[this.environmentVariable];
            if (environmentValue !== undefined && environmentValue !== '') {
                if (this.alternatives.indexOf(environmentValue) < 0) {
                    const choices = '"' + this.alternatives.join('", "') + '"';
                    throw new Error(`Invalid value "${environmentValue}" for the environment variable` +
                        ` ${this.environmentVariable}.  Valid choices are: ${choices}`);
                }
                this._value = environmentValue;
                return;
            }
        }
        if (this.defaultValue !== undefined) {
            this._value = this.defaultValue;
            return;
        }
        this._value = undefined;
    }
    /**
     * {@inheritDoc CommandLineParameter._getSupplementaryNotes}
     * @internal
     */
    _getSupplementaryNotes(supplementaryNotes) {
        // virtual
        super._getSupplementaryNotes(supplementaryNotes);
        if (this.defaultValue !== undefined) {
            supplementaryNotes.push(`The default value is "${this.defaultValue}".`);
        }
    }
    /**
     * Returns the argument value for a choice parameter that was parsed from the command line.
     *
     * @remarks
     * The return value will be `undefined` if the command-line has not been parsed yet,
     * or if the parameter was omitted and has no default value.
     */
    get value() {
        return this._value;
    }
    /** {@inheritDoc CommandLineParameter.appendToArgList} @override */
    appendToArgList(argList) {
        if (this.value !== undefined) {
            argList.push(this.longName);
            argList.push(this.value);
        }
    }
}
exports.CommandLineChoiceParameter = CommandLineChoiceParameter;
//# sourceMappingURL=CommandLineChoiceParameter.js.map"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=CommandLineDefinition.js.map"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.CommandLineFlagParameter = void 0;
const BaseClasses_1 = require("./BaseClasses");
/**
 * The data type returned by {@link CommandLineParameterProvider.defineFlagParameter}.
 * @public
 */
class CommandLineFlagParameter extends BaseClasses_1.CommandLineParameter {
    /** @internal */
    constructor(definition) {
        super(definition);
        this._value = false;
    }
    /** {@inheritDoc CommandLineParameter.kind} */
    get kind() {
        return BaseClasses_1.CommandLineParameterKind.Flag;
    }
    /**
     * {@inheritDoc CommandLineParameter._setValue}
     * @internal
     */
    // eslint-disable-next-line @typescript-eslint/no-explicit-any
    _setValue(data) {
        // abstract
        if (data !== null && data !== undefined) {
            if (typeof data !== 'boolean') {
                this.reportInvalidData(data);
            }
            // If the flag is omitted, then argparse sets the data to "false" instead of "undefined".
            // This design prevents a syntax such as "--flag=false", probably because argparse prefers "--no-flag".
            // If we switch to a new CLI parser, we should try to add support for "--flag=false".
            if (data) {
                this._value = data;
                return;
            }
        }
        if (this.environmentVariable !== undefined) {
            // Try reading the environment variable
            const environmentValue = process.env[this.environmentVariable];
            if (environmentValue !== undefined && environmentValue !== '') {
                if (environmentValue !== '0' && environmentValue !== '1') {
                    throw new Error(`Invalid value "${environmentValue}" for the environment variable` +
                        ` ${this.environmentVariable}.  Valid choices are 0 or 1.`);
                }
                this._value = environmentValue === '1';
                return;
            }
        }
        this._value = false;
    }
    /**
     * Returns a boolean indicating whether the parameter was included in the command line.
     *
     * @remarks
     * The return value will be false if the command-line has not been parsed yet,
     * or if the flag was not used.
     */
    get value() {
        return this._value;
    }
    /** {@inheritDoc CommandLineParameter.appendToArgList} @override */
    appendToArgList(argList) {
        if (this.value) {
            argList.push(this.longName);
        }
    }
}
exports.CommandLineFlagParameter = CommandLineFlagParameter;
//# sourceMappingURL=CommandLineFlagParameter.js.map"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.CommandLineIntegerListParameter = void 0;
const BaseClasses_1 = require("./BaseClasses");
const EnvironmentVariableParser_1 = require("./EnvironmentVariableParser");
/**
 * The data type returned by {@link CommandLineParameterProvider.defineIntegerListParameter}.
 * @public
 */
class CommandLineIntegerListParameter extends BaseClasses_1.CommandLineParameterWithArgument {
    /** @internal */
    constructor(definition) {
        super(definition);
        this._values = [];
    }
    /** {@inheritDoc CommandLineParameter.kind} */
    get kind() {
        return BaseClasses_1.CommandLineParameterKind.IntegerList;
    }
    /**
     * {@inheritDoc CommandLineParameter._setValue}
     * @internal
     */
    // eslint-disable-next-line @typescript-eslint/no-explicit-any
    _setValue(data) {
        // If argparse passed us a value, confirm it is valid
        if (data !== null && data !== undefined) {
            if (!Array.isArray(data)) {
                this.reportInvalidData(data);
            }
            for (const arrayItem of data) {
                if (typeof arrayItem !== 'number') {
                    this.reportInvalidData(data);
                }
            }
            this._values = data;
            return;
        }
        // If an environment variable exists, attempt to parse it as a list
        if (this.environmentVariable !== undefined) {
            const values = EnvironmentVariableParser_1.EnvironmentVariableParser.parseAsList(this.environmentVariable);
            if (values) {
                const parsedValues = [];
                for (const value of values) {
                    const parsed = parseInt(value, 10);
                    if (isNaN(parsed) || value.indexOf('.') >= 0) {
                        throw new Error(`Invalid value "${value}" for the environment variable` +
                            ` ${this.environmentVariable}.  It must be an integer value.`);
                    }
                    parsedValues.push(parsed);
                }
                this._values = parsedValues;
                return;
            }
        }
        // (No default value for integer lists)
        this._values = [];
    }
    /**
     * Returns the integer arguments for an integer list parameter that was parsed from the command line.
     *
     * @remarks
     * The array will be empty if the command-line has not been parsed yet,
     * or if the parameter was omitted and has no default value.
     */
    get values() {
        return this._values;
    }
    /** {@inheritDoc CommandLineParameter.appendToArgList} @override */
    appendToArgList(argList) {
        if (this.values.length > 0) {
            for (const value of this.values) {
                argList.push(this.longName);
                argList.push(value.toString());
            }
        }
    }
}
exports.CommandLineIntegerListParameter = CommandLineIntegerListParameter;
//# sourceMappingURL=CommandLineIntegerListParameter.js.map"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.CommandLineIntegerParameter = void 0;
const BaseClasses_1 = require("./BaseClasses");
/**
 * The data type returned by {@link CommandLineParameterProvider.defineIntegerParameter}.
 * @public
 */
class CommandLineIntegerParameter extends BaseClasses_1.CommandLineParameterWithArgument {
    /** @internal */
    constructor(definition) {
        super(definition);
        this._value = undefined;
        this.defaultValue = definition.defaultValue;
        this.validateDefaultValue(!!this.defaultValue);
    }
    /** {@inheritDoc CommandLineParameter.kind} */
    get kind() {
        return BaseClasses_1.CommandLineParameterKind.Integer;
    }
    /**
     * {@inheritDoc CommandLineParameter._setValue}
     * @internal
     */
    // eslint-disable-next-line @typescript-eslint/no-explicit-any
    _setValue(data) {
        // abstract
        if (data !== null && data !== undefined) {
            if (typeof data !== 'number') {
                this.reportInvalidData(data);
            }
            this._value = data;
            return;
        }
        if (this.environmentVariable !== undefined) {
            // Try reading the environment variable
            const environmentValue = process.env[this.environmentVariable];
            if (environmentValue !== undefined && environmentValue !== '') {
                const parsed = parseInt(environmentValue, 10);
                if (isNaN(parsed) || environmentValue.indexOf('.') >= 0) {
                    throw new Error(`Invalid value "${environmentValue}" for the environment variable` +
                        ` ${this.environmentVariable}.  It must be an integer value.`);
                }
                this._value = parsed;
                return;
            }
        }
        if (this.defaultValue !== undefined) {
            this._value = this.defaultValue;
            return;
        }
        this._value = undefined;
    }
    /**
     * {@inheritDoc CommandLineParameter._getSupplementaryNotes}
     * @internal
     */
    _getSupplementaryNotes(supplementaryNotes) {
        // virtual
        super._getSupplementaryNotes(supplementaryNotes);
        if (this.defaultValue !== undefined) {
            supplementaryNotes.push(`The default value is ${this.defaultValue}.`);
        }
    }
    /**
     * Returns the argument value for an integer parameter that was parsed from the command line.
     *
     * @remarks
     * The return value will be undefined if the command-line has not been parsed yet,
     * or if the parameter was omitted and has no default value.
     */
    get value() {
        return this._value;
    }
    /** {@inheritDoc CommandLineParameter.appendToArgList} @override */
    appendToArgList(argList) {
        if (this.value !== undefined) {
            argList.push(this.longName);
            argList.push(this.value.toString());
        }
    }
}
exports.CommandLineIntegerParameter = CommandLineIntegerParameter;
//# sourceMappingURL=CommandLineIntegerParameter.js.map"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.CommandLineRemainder = void 0;
/**
 * The data type returned by {@link CommandLineParameterProvider.defineCommandLineRemainder}.
 * @public
 */
class CommandLineRemainder {
    /** @internal */
    constructor(definition) {
        this._values = [];
        this.description = definition.description;
    }
    /**
     * Returns any remaining command line arguments after the recognized portion
     * that was parsed from the command line.
     *
     * @remarks
     * The array will be empty if the command-line has not been parsed yet.
     */
    get values() {
        return this._values;
    }
    /**
     * {@inheritDoc CommandLineParameter._setValue}
     * @internal
     */
    // eslint-disable-next-line @typescript-eslint/no-explicit-any
    _setValue(data) {
        // abstract
        if (!Array.isArray(data) || !data.every((x) => typeof x === 'string')) {
            throw new Error(`Unexpected data object for remainder: ` + JSON.stringify(data));
        }
        this._values.push(...data);
    }
    /** {@inheritDoc CommandLineParameter.appendToArgList} @override */
    appendToArgList(argList) {
        if (this.values.length > 0) {
            for (const value of this.values) {
                argList.push(value);
            }
        }
    }
}
exports.CommandLineRemainder = CommandLineRemainder;
//# sourceMappingURL=CommandLineRemainder.js.map"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.CommandLineStringListParameter = void 0;
const BaseClasses_1 = require("./BaseClasses");
const EnvironmentVariableParser_1 = require("./EnvironmentVariableParser");
/**
 * The data type returned by {@link CommandLineParameterProvider.defineStringListParameter}.
 * @public
 */
class CommandLineStringListParameter extends BaseClasses_1.CommandLineParameterWithArgument {
    /** @internal */
    constructor(definition) {
        super(definition);
        this._values = [];
    }
    /** {@inheritDoc CommandLineParameter.kind} */
    get kind() {
        return BaseClasses_1.CommandLineParameterKind.StringList;
    }
    /**
     * {@inheritDoc CommandLineParameter._setValue}
     * @internal
     */
    // eslint-disable-next-line @typescript-eslint/no-explicit-any
    _setValue(data) {
        // If argparse passed us a value, confirm it is valid
        if (data !== null && data !== undefined) {
            if (!Array.isArray(data)) {
                this.reportInvalidData(data);
            }
            for (const arrayItem of data) {
                if (typeof arrayItem !== 'string') {
                    this.reportInvalidData(data);
                }
            }
            this._values = data;
            return;
        }
        // If an environment variable exists, attempt to parse it as a list
        if (this.environmentVariable !== undefined) {
            const values = EnvironmentVariableParser_1.EnvironmentVariableParser.parseAsList(this.environmentVariable);
            if (values) {
                this._values = values;
                return;
            }
        }
        // (No default value for string lists)
        this._values = [];
    }
    /**
     * Returns the string arguments for a string list parameter that was parsed from the command line.
     *
     * @remarks
     * The array will be empty if the command-line has not been parsed yet,
     * or if the parameter was omitted and has no default value.
     */
    get values() {
        return this._values;
    }
    /** {@inheritDoc CommandLineParameter.appendToArgList} @override */
    appendToArgList(argList) {
        if (this.values.length > 0) {
            for (const value of this.values) {
                argList.push(this.longName);
                argList.push(value);
            }
        }
    }
}
exports.CommandLineStringListParameter = CommandLineStringListParameter;
//# sourceMappingURL=CommandLineStringListParameter.js.map"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.CommandLineStringParameter = void 0;
const BaseClasses_1 = require("./BaseClasses");
/**
 * The data type returned by {@link CommandLineParameterProvider.defineStringParameter}.
 * @public
 */
class CommandLineStringParameter extends BaseClasses_1.CommandLineParameterWithArgument {
    /** @internal */
    constructor(definition) {
        super(definition);
        this._value = undefined;
        this.defaultValue = definition.defaultValue;
        this.validateDefaultValue(!!this.defaultValue);
    }
    /** {@inheritDoc CommandLineParameter.kind} */
    get kind() {
        return BaseClasses_1.CommandLineParameterKind.String;
    }
    /**
     * {@inheritDoc CommandLineParameter._setValue}
     * @internal
     */
    // eslint-disable-next-line @typescript-eslint/no-explicit-any
    _setValue(data) {
        // abstract
        if (data !== null && data !== undefined) {
            if (typeof data !== 'string') {
                this.reportInvalidData(data);
            }
            this._value = data;
            return;
        }
        if (this.environmentVariable !== undefined) {
            // Try reading the environment variable
            const environmentValue = process.env[this.environmentVariable];
            if (environmentValue !== undefined) {
                // NOTE: If the environment variable is defined as an empty string,
                // here we will accept the empty string as our value.  (For number/flag we don't do that.)
                this._value = environmentValue;
                return;
            }
        }
        if (this.defaultValue !== undefined) {
            this._value = this.defaultValue;
            return;
        }
        this._value = undefined;
    }
    /**
     * {@inheritDoc CommandLineParameter._getSupplementaryNotes}
     * @internal
     */
    _getSupplementaryNotes(supplementaryNotes) {
        // virtual
        super._getSupplementaryNotes(supplementaryNotes);
        if (this.defaultValue !== undefined) {
            if (this.defaultValue.length < 160) {
                supplementaryNotes.push(`The default value is ${JSON.stringify(this.defaultValue)}.`);
            }
        }
    }
    /**
     * Returns the argument value for a string parameter that was parsed from the command line.
     *
     * @remarks
     * The return value will be undefined if the command-line has not been parsed yet,
     * or if the parameter was omitted and has no default value.
     */
    get value() {
        return this._value;
    }
    /** {@inheritDoc CommandLineParameter.appendToArgList} @override */
    appendToArgList(argList) {
        if (this.value !== undefined) {
            argList.push(this.longName);
            argList.push(this.value);
        }
    }
}
exports.CommandLineStringParameter = CommandLineStringParameter;
//# sourceMappingURL=CommandLineStringParameter.js.map"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
// See LICENSE in the project root for license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.EnvironmentVariableParser = void 0;
/**
 * Some parameter types can receive their values from an environment variable instead of
 * a command line argument. This class provides some utility methods for parsing environment
 * variable values.
 * @internal
 */
class EnvironmentVariableParser {
    static parseAsList(envVarName) {
        const environmentValue = process.env[envVarName];
        if (environmentValue !== undefined) {
            // NOTE: If the environment variable is defined as an empty string,
            // here we will accept the empty string as our value.  (For number/flag we don't do that.)
            if (environmentValue.trimLeft()[0] === '[') {
                // Specifying multiple items in an environment variable is a somewhat rare case.  But environment
                // variables are actually a pretty reliable way for a tool to avoid shell escaping problems
                // when spawning another tool.  For this case, we need a reliable way to pass an array of strings
                // that could contain any character.  For example, if we simply used ";" as the list delimiter,
                // then what to do if a string contains that character?  We'd need to design an escaping mechanism.
                // Since JSON is simple and standard and can escape every possible string, it's a better option
                // than a custom delimiter.
                try {
                    const parsedJson = JSON.parse(environmentValue);
                    if (!Array.isArray(parsedJson) ||
                        !parsedJson.every((x) => typeof x === 'string' || typeof x === 'boolean' || typeof x === 'number')) {
                        throw new Error(`The ${environmentValue} environment variable value must be a JSON ` +
                            ` array containing only strings, numbers, and booleans.`);
                    }
                    return parsedJson.map((x) => x.toString());
                }
                catch (ex) {
                    throw new Error(`The ${environmentValue} environment variable value looks like a JSON array` +
                        ` but failed to parse: ` +
                        ex.message);
                }
            }
            else {
                // As a shorthand, a single value may be specified without JSON encoding, as long as it does not
                // start with the "[" character.
                return [environmentValue];
            }
        }
        return undefined;
    }
}
exports.EnvironmentVariableParser = EnvironmentVariableParser;
//# sourceMappingURL=EnvironmentVariableParser.js.map// This file is read by tools that parse documentation comments conforming to the TSDoc standard.
// It should be published with your NPM package.  It should not be tracked by Git.
{
  "tsdocVersion": "0.12",
  "toolPackages": [
    {
      "packageName": "@microsoft/api-extractor",
      "packageVersion": "7.32.0"
    }
  ]
}
MIT License

Copyright (c) 2022 Daniel Hensby

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": "@tediousjs/connection-string",
  "version": "0.4.1",
  "description": "SQL ConnectionString parser",
  "repository": {
    "type": "git",
    "url": "https://github.com/tediousjs/connection-string"
  },
  "homepage": "https://github.com/tediousjs/connection-string#readme",
  "main": "lib/index.js",
  "types": "lib/index.d.ts",
  "author": "Dan Hensby <git@hens.by>",
  "license": "MIT",
  "files": [
    "/lib/**"
  ],
  "publishConfig": {
    "access": "public"
  },
  "devDependencies": {
    "@tsconfig/node10": "^1.0.8",
    "@types/chai": "^4.3.1",
    "@types/mocha": "^9.1.1",
    "@types/node": "^10.17.60",
    "@typescript-eslint/eslint-plugin": "^5.21.0",
    "@typescript-eslint/parser": "^5.21.0",
    "chai": "^4.2.0",
    "eslint": "^8.14.0",
    "mocha": "^9.2.2",
    "ts-node": "^10.7.0",
    "tslint": "^6.1.3",
    "tslint-config-prettier": "^1.18.0",
    "typescript": "^4.1.3"
  },
  "dependencies": {}
}"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseSqlConnectionString = exports.parseConnectionString = void 0;
const connection_string_1 = __importDefault(require("./parser/connection-string"));
exports.parseConnectionString = connection_string_1.default;
const sql_connection_string_1 = __importDefault(require("./parser/sql-connection-string"));
exports.parseSqlConnectionString = sql_connection_string_1.default;
//# sourceMappingURL=index.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var CollectionMode;
(function (CollectionMode) {
    CollectionMode[CollectionMode["key"] = 0] = "key";
    CollectionMode[CollectionMode["value"] = 1] = "value";
})(CollectionMode || (CollectionMode = {}));
const CONFIG = Object.freeze({
    key: {
        terminator: '=',
        quotes: {},
    },
    value: {
        terminator: ';',
        quotes: {
            '"': '"',
            "'": "'",
            '{': '}',
        },
    },
});
function connectionStringParser(connectionString, parserConfig = CONFIG) {
    const parsed = {};
    let collectionMode = CollectionMode.key;
    let started = false;
    let finished = false;
    let quoted = false;
    let quote = '';
    let buffer = '';
    let currentKey = '';
    let pointer = 0;
    function start() {
        started = true;
    }
    function finish() {
        finished = true;
    }
    function reset() {
        started = false;
        finished = false;
        quoted = false;
        quote = '';
        buffer = '';
    }
    function config() {
        return collectionMode === CollectionMode.key ? parserConfig.key : parserConfig.value;
    }
    function isTerminator(char) {
        return config().terminator === char;
    }
    function isStartQuote(char) {
        return Object.keys(config().quotes).some((val) => char === val);
    }
    function isEndQuote(char) {
        return quoted && char === config().quotes[quote];
    }
    function push(char) {
        buffer += char;
    }
    function collect() {
        if (!quoted) {
            buffer = buffer.trim();
        }
        switch (collectionMode) {
            case CollectionMode.key:
                currentKey = buffer.toLowerCase();
                collectionMode = CollectionMode.value;
                break;
            case CollectionMode.value:
                collectionMode = CollectionMode.key;
                parsed[currentKey] = buffer;
                currentKey = '';
                break;
        }
        reset();
    }
    while (pointer < connectionString.length) {
        const current = connectionString.charAt(pointer);
        if (!finished) {
            if (!started) {
                if (current.trim()) {
                    start();
                    if (isStartQuote(current)) {
                        quoted = true;
                        quote = current;
                    }
                    else {
                        push(current);
                    }
                }
            }
            else {
                if (quoted && isEndQuote(current)) {
                    const next = connectionString.charAt(pointer + 1);
                    if (current === next) {
                        push(current);
                        pointer++;
                    }
                    else {
                        finish();
                    }
                }
                else if (!quoted && isTerminator(current)) {
                    const next = connectionString.charAt(pointer + 1);
                    if (current === next) {
                        push(current);
                        pointer++;
                    }
                    else {
                        collect();
                    }
                }
                else {
                    push(current);
                }
            }
        }
        else if (isTerminator(current)) {
            collect();
        }
        else if (current.trim()) {
            throw new Error('Malformed connection string');
        }
        pointer++;
    }
    if (quoted && !finished) {
        throw new Error('Connection string terminated unexpectedly');
    }
    else {
        collect();
    }
    return parsed;
}
exports.default = connectionStringParser;
//# sourceMappingURL=connection-string.js.map"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SCHEMA = exports.SchemaTypes = void 0;
const connection_string_1 = __importDefault(require("./connection-string"));
var SchemaTypes;
(function (SchemaTypes) {
    SchemaTypes[SchemaTypes["BOOL"] = 0] = "BOOL";
    SchemaTypes[SchemaTypes["STRING"] = 1] = "STRING";
    SchemaTypes[SchemaTypes["NUMBER"] = 2] = "NUMBER";
})(SchemaTypes = exports.SchemaTypes || (exports.SchemaTypes = {}));
// schema for MSSQL connection strings (https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlconnection.connectionstring)
exports.SCHEMA = {
    'Application Name': {
        type: SchemaTypes.STRING,
        aliases: ['App'],
        validator(val) {
            return typeof val === 'string' && val.length <= 128;
        },
    },
    'ApplicationIntent': {
        type: SchemaTypes.STRING,
        allowedValues: ['ReadOnly', 'ReadWrite'],
        default: 'ReadWrite',
    },
    'Asynchronous Processing': {
        type: SchemaTypes.BOOL,
        default: false,
        aliases: ['Async'],
    },
    'AttachDBFilename': {
        type: SchemaTypes.STRING,
        aliases: ['Extended Properties', 'Initial File Name'],
    },
    'Authentication': {
        type: SchemaTypes.STRING,
        allowedValues: ['Active Directory Integrated', 'Active Directory Password', 'Sql Password'],
    },
    'Column Encryption Setting': {
        type: SchemaTypes.STRING,
    },
    'Connection Timeout': {
        type: SchemaTypes.NUMBER,
        aliases: ['Connect Timeout', 'Timeout'],
        default: 15,
    },
    'Connection Lifetime': {
        type: SchemaTypes.NUMBER,
        aliases: ['Load Balance Timeout'],
        default: 0,
    },
    'ConnectRetryCount': {
        type: SchemaTypes.NUMBER,
        default: 1,
        validator(val) {
            return val > 0 && val <= 255;
        },
    },
    'ConnectRetryInterval': {
        type: SchemaTypes.NUMBER,
        default: 10,
    },
    'Context Connection': {
        type: SchemaTypes.BOOL,
        default: false,
    },
    'Current Language': {
        aliases: ['Language'],
        type: SchemaTypes.STRING,
        validator(val) {
            return typeof val === 'string' && val.length <= 128;
        },
    },
    'Data Source': {
        aliases: ['Addr', 'Address', 'Server', 'Network Address'],
        type: SchemaTypes.STRING,
    },
    'Encrypt': {
        type: SchemaTypes.BOOL,
        default: false,
    },
    'Enlist': {
        type: SchemaTypes.BOOL,
        default: true,
    },
    'Failover Partner': {
        type: SchemaTypes.STRING,
    },
    'Initial Catalog': {
        type: SchemaTypes.STRING,
        aliases: ['Database'],
        validator(val) {
            return typeof val === 'string' && val.length <= 128;
        },
    },
    'Integrated Security': {
        type: SchemaTypes.BOOL,
        aliases: ['Trusted_Connection'],
        coerce(val) {
            return val === 'sspi' || null;
        },
    },
    'Max Pool Size': {
        type: SchemaTypes.NUMBER,
        default: 100,
        validator(val) {
            return val >= 1;
        },
    },
    'Min Pool Size': {
        type: SchemaTypes.NUMBER,
        default: 0,
        validator(val) {
            return val >= 0;
        },
    },
    'MultipleActiveResultSets': {
        type: SchemaTypes.BOOL,
        default: false,
    },
    'MultiSubnetFailover': {
        type: SchemaTypes.BOOL,
        default: false,
    },
    'Network Library': {
        type: SchemaTypes.STRING,
        aliases: ['Network', 'Net'],
        allowedValues: ['dbnmpntw', 'dbmsrpcn', 'dbmsadsn', 'dbmsgnet', 'dbmslpcn', 'dbmsspxn', 'dbmssocn', 'Dbmsvinn'],
    },
    'Packet Size': {
        type: SchemaTypes.NUMBER,
        default: 8000,
        validator(val) {
            return val >= 512 && val <= 32768;
        },
    },
    'Password': {
        type: SchemaTypes.STRING,
        aliases: ['PWD'],
        validator(val) {
            return typeof val === 'string' && val.length <= 128;
        },
    },
    'Persist Security Info': {
        type: SchemaTypes.BOOL,
        aliases: ['PersistSecurityInfo'],
        default: false,
    },
    'PoolBlockingPeriod': {
        type: SchemaTypes.NUMBER,
        default: 0,
        coerce(val) {
            if (typeof val !== 'string') {
                return null;
            }
            switch (val.toLowerCase()) {
                case 'alwaysblock':
                    return 1;
                case 'auto':
                    return 0;
                case 'neverblock':
                    return 2;
            }
            return null;
        },
    },
    'Pooling': {
        type: SchemaTypes.BOOL,
        default: true,
    },
    'Replication': {
        type: SchemaTypes.BOOL,
        default: false,
    },
    'Transaction Binding': {
        type: SchemaTypes.STRING,
        allowedValues: ['Implicit Unbind', 'Explicit Unbind'],
        default: 'Implicit Unbind',
    },
    'TransparentNetworkIPResolution': {
        type: SchemaTypes.BOOL,
        default: true,
    },
    'TrustServerCertificate': {
        type: SchemaTypes.BOOL,
        default: false,
    },
    'Type System Version': {
        type: SchemaTypes.STRING,
        allowedValues: ['SQL Server 2012', 'SQL Server 2008', 'SQL Server 2005', 'Latest'],
    },
    'User ID': {
        type: SchemaTypes.STRING,
        aliases: ['UID'],
        validator(val) {
            return typeof val === 'string' && val.length <= 128;
        },
    },
    'User Instance': {
        type: SchemaTypes.BOOL,
        default: false,
    },
    'Workstation ID': {
        type: SchemaTypes.STRING,
        aliases: ['WSID'],
        validator(val) {
            return typeof val === 'string' && val.length <= 128;
        },
    },
};
function guessType(value) {
    if (value.trim() === '') {
        return SchemaTypes.STRING;
    }
    if (!Number.isNaN(parseInt(value, 10))) {
        return SchemaTypes.NUMBER;
    }
    if (['true', 'false', 'yes', 'no'].includes(value.toLowerCase())) {
        return SchemaTypes.BOOL;
    }
    return SchemaTypes.STRING;
}
function coerce(value, type, coercer) {
    if (coercer) {
        const coerced = coercer(value);
        if (coerced !== null) {
            return coerced;
        }
    }
    switch (type) {
        case SchemaTypes.BOOL:
            if (['true', 'yes', '1'].includes(value.toLowerCase())) {
                return true;
            }
            if (['false', 'no', '0'].includes(value.toLowerCase())) {
                return false;
            }
            return value;
        case SchemaTypes.NUMBER:
            return parseInt(value, 10);
    }
    return value;
}
function validate(value, allowedValues, validator) {
    let valid = true;
    if (validator) {
        valid = validator(value);
    }
    if (valid) {
        valid = (allowedValues === null || allowedValues === void 0 ? void 0 : allowedValues.includes(value)) || false;
    }
    return valid;
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
function parseSqlConnectionString(connectionString, canonicalProps = false, allowUnknown = false, strict = false, schema = exports.SCHEMA) {
    const flattenedSchema = Object.entries(schema).reduce((flattened, [key, item]) => {
        var _a;
        Object.assign(flattened, {
            [key.toLowerCase()]: item,
        });
        return ((_a = item.aliases) === null || _a === void 0 ? void 0 : _a.reduce((accum, alias) => {
            return Object.assign(accum, {
                [alias.toLowerCase()]: {
                    ...item,
                    canonical: key.toLowerCase(),
                },
            });
        }, flattened)) || flattened;
    }, {});
    return Object.entries((0, connection_string_1.default)(connectionString)).reduce((config, [prop, value]) => {
        if (!Object.prototype.hasOwnProperty.call(flattenedSchema, prop)) {
            return Object.assign(config, {
                [prop]: coerce(value, guessType(value)),
            });
        }
        let coercedValue = coerce(value, flattenedSchema[prop].type, flattenedSchema[prop].coerce);
        if (strict && !validate(coercedValue, flattenedSchema[prop].allowedValues, flattenedSchema[prop].validator)) {
            coercedValue = flattenedSchema[prop].default;
        }
        const propName = canonicalProps ? flattenedSchema[prop].canonical || prop : prop;
        return Object.assign(config, {
            [propName]: coercedValue,
        });
    }, {});
}
exports.default = parseSqlConnectionString;
//# sourceMappingURL=sql-connection-string.js.map{
  "name": "@tootallnate/once",
  "version": "1.1.2",
  "description": "Creates a Promise that waits for a single event",
  "main": "./dist/index.js",
  "types": "./dist/index.d.ts",
  "files": [
    "dist"
  ],
  "repository": {
    "type": "git",
    "url": "git://github.com/TooTallNate/once.git"
  },
  "author": "Nathan Rajlich <nathan@tootallnate.net> (http://n8.io/)",
  "license": "MIT",
  "devDependencies": {
    "@types/node": "^12.12.11",
    "@typescript-eslint/eslint-plugin": "1.6.0",
    "@typescript-eslint/parser": "1.1.0",
    "eslint": "5.16.0",
    "eslint-config-airbnb": "17.1.0",
    "eslint-config-prettier": "4.1.0",
    "eslint-import-resolver-typescript": "1.1.1",
    "eslint-plugin-import": "2.16.0",
    "eslint-plugin-jsx-a11y": "6.2.1",
    "eslint-plugin-react": "7.12.4",
    "mocha": "^6.2.2",
    "rimraf": "^3.0.0",
    "typescript": "^3.7.3"
  },
  "engines": {
    "node": ">= 6"
  }
}"use strict";
function noop() { }
function once(emitter, name) {
    const o = once.spread(emitter, name);
    const r = o.then((args) => args[0]);
    r.cancel = o.cancel;
    return r;
}
(function (once) {
    function spread(emitter, name) {
        let c = null;
        const p = new Promise((resolve, reject) => {
            function cancel() {
                emitter.removeListener(name, onEvent);
                emitter.removeListener('error', onError);
                p.cancel = noop;
            }
            function onEvent(...args) {
                cancel();
                resolve(args);
            }
            function onError(err) {
                cancel();
                reject(err);
            }
            c = cancel;
            emitter.on(name, onEvent);
            emitter.on('error', onError);
        });
        if (!c) {
            throw new TypeError('Could not get `cancel()` function');
        }
        p.cancel = c;
        return p;
    }
    once.spread = spread;
})(once || (once = {}));
module.exports = once;
//# sourceMappingURL=index.js.mapThis software is dual-licensed under the ISC and MIT licenses.
You may use this software under EITHER of the following licenses.

----------

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.

----------

Copyright Isaac Z. Schlueter and Contributors
All rights reserved.

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.
module.exports = exports = abbrev.abbrev = abbrev

abbrev.monkeyPatch = monkeyPatch

function monkeyPatch () {
  Object.defineProperty(Array.prototype, 'abbrev', {
    value: function () { return abbrev(this) },
    enumerable: false, configurable: true, writable: true
  })

  Object.defineProperty(Object.prototype, 'abbrev', {
    value: function () { return abbrev(Object.keys(this)) },
    enumerable: false, configurable: true, writable: true
  })
}

function abbrev (list) {
  if (arguments.length !== 1 || !Array.isArray(list)) {
    list = Array.prototype.slice.call(arguments, 0)
  }
  for (var i = 0, l = list.length, args = [] ; i < l ; i ++) {
    args[i] = typeof list[i] === "string" ? list[i] : String(list[i])
  }

  // sort them lexicographically, so that they're next to their nearest kin
  args = args.sort(lexSort)

  // walk through each, seeing how much it has in common with the next and previous
  var abbrevs = {}
    , prev = ""
  for (var i = 0, l = args.length ; i < l ; i ++) {
    var current = args[i]
      , next = args[i + 1] || ""
      , nextMatches = true
      , prevMatches = true
    if (current === next) continue
    for (var j = 0, cl = current.length ; j < cl ; j ++) {
      var curChar = current.charAt(j)
      nextMatches = nextMatches && curChar === next.charAt(j)
      prevMatches = prevMatches && curChar === prev.charAt(j)
      if (!nextMatches && !prevMatches) {
        j ++
        break
      }
    }
    prev = current
    if (j === cl) {
      abbrevs[current] = current
      continue
    }
    for (var a = current.substr(0, j) ; j <= cl ; j ++) {
      abbrevs[a] = current
      a += current.charAt(j)
    }
  }
  return abbrevs
}

function lexSort (a, b) {
  return a === b ? 0 : a > b ? 1 : -1
}
{
  "name": "abbrev",
  "version": "1.1.1",
  "description": "Like ruby's abbrev module, but in js",
  "author": "Isaac Z. Schlueter <i@izs.me>",
  "main": "abbrev.js",
  "repository": "http://github.com/isaacs/abbrev-js",
  "license": "ISC",
  "devDependencies": {
    "tap": "^10.1"
  },
  "files": [
    "abbrev.js"
  ]
}1.3.8 / 2022-02-02
==================

  * deps: mime-types@~2.1.34
    - deps: mime-db@~1.51.0
  * deps: negotiator@0.6.3

1.3.7 / 2019-04-29
==================

  * deps: negotiator@0.6.2
    - Fix sorting charset, encoding, and language with extra parameters

1.3.6 / 2019-04-28
==================

  * deps: mime-types@~2.1.24
    - deps: mime-db@~1.40.0

1.3.5 / 2018-02-28
==================

  * deps: mime-types@~2.1.18
    - deps: mime-db@~1.33.0

1.3.4 / 2017-08-22
==================

  * deps: mime-types@~2.1.16
    - deps: mime-db@~1.29.0

1.3.3 / 2016-05-02
==================

  * deps: mime-types@~2.1.11
    - deps: mime-db@~1.23.0
  * deps: negotiator@0.6.1
    - perf: improve `Accept` parsing speed
    - perf: improve `Accept-Charset` parsing speed
    - perf: improve `Accept-Encoding` parsing speed
    - perf: improve `Accept-Language` parsing speed

1.3.2 / 2016-03-08
==================

  * deps: mime-types@~2.1.10
    - Fix extension of `application/dash+xml`
    - Update primary extension for `audio/mp4`
    - deps: mime-db@~1.22.0

1.3.1 / 2016-01-19
==================

  * deps: mime-types@~2.1.9
    - deps: mime-db@~1.21.0

1.3.0 / 2015-09-29
==================

  * deps: mime-types@~2.1.7
    - deps: mime-db@~1.19.0
  * deps: negotiator@0.6.0
    - Fix including type extensions in parameters in `Accept` parsing
    - Fix parsing `Accept` parameters with quoted equals
    - Fix parsing `Accept` parameters with quoted semicolons
    - Lazy-load modules from main entry point
    - perf: delay type concatenation until needed
    - perf: enable strict mode
    - perf: hoist regular expressions
    - perf: remove closures getting spec properties
    - perf: remove a closure from media type parsing
    - perf: remove property delete from media type parsing

1.2.13 / 2015-09-06
===================

  * deps: mime-types@~2.1.6
    - deps: mime-db@~1.18.0

1.2.12 / 2015-07-30
===================

  * deps: mime-types@~2.1.4
    - deps: mime-db@~1.16.0

1.2.11 / 2015-07-16
===================

  * deps: mime-types@~2.1.3
    - deps: mime-db@~1.15.0

1.2.10 / 2015-07-01
===================

  * deps: mime-types@~2.1.2
    - deps: mime-db@~1.14.0

1.2.9 / 2015-06-08
==================

  * deps: mime-types@~2.1.1
    - perf: fix deopt during mapping

1.2.8 / 2015-06-07
==================

  * deps: mime-types@~2.1.0
    - deps: mime-db@~1.13.0
  * perf: avoid argument reassignment & argument slice
  * perf: avoid negotiator recursive construction
  * perf: enable strict mode
  * perf: remove unnecessary bitwise operator

1.2.7 / 2015-05-10
==================

  * deps: negotiator@0.5.3
    - Fix media type parameter matching to be case-insensitive

1.2.6 / 2015-05-07
==================

  * deps: mime-types@~2.0.11
    - deps: mime-db@~1.9.1
  * deps: negotiator@0.5.2
    - Fix comparing media types with quoted values
    - Fix splitting media types with quoted commas

1.2.5 / 2015-03-13
==================

  * deps: mime-types@~2.0.10
    - deps: mime-db@~1.8.0

1.2.4 / 2015-02-14
==================

  * Support Node.js 0.6
  * deps: mime-types@~2.0.9
    - deps: mime-db@~1.7.0
  * deps: negotiator@0.5.1
    - Fix preference sorting to be stable for long acceptable lists

1.2.3 / 2015-01-31
==================

  * deps: mime-types@~2.0.8
    - deps: mime-db@~1.6.0

1.2.2 / 2014-12-30
==================

  * deps: mime-types@~2.0.7
    - deps: mime-db@~1.5.0

1.2.1 / 2014-12-30
==================

  * deps: mime-types@~2.0.5
    - deps: mime-db@~1.3.1

1.2.0 / 2014-12-19
==================

  * deps: negotiator@0.5.0
    - Fix list return order when large accepted list
    - Fix missing identity encoding when q=0 exists
    - Remove dynamic building of Negotiator class

1.1.4 / 2014-12-10
==================

  * deps: mime-types@~2.0.4
    - deps: mime-db@~1.3.0

1.1.3 / 2014-11-09
==================

  * deps: mime-types@~2.0.3
    - deps: mime-db@~1.2.0

1.1.2 / 2014-10-14
==================

  * deps: negotiator@0.4.9
    - Fix error when media type has invalid parameter

1.1.1 / 2014-09-28
==================

  * deps: mime-types@~2.0.2
    - deps: mime-db@~1.1.0
  * deps: negotiator@0.4.8
    - Fix all negotiations to be case-insensitive
    - Stable sort preferences of same quality according to client order

1.1.0 / 2014-09-02
==================

  * update `mime-types`

1.0.7 / 2014-07-04
==================

  * Fix wrong type returned from `type` when match after unknown extension

1.0.6 / 2014-06-24
==================

  * deps: negotiator@0.4.7

1.0.5 / 2014-06-20
==================

 * fix crash when unknown extension given

1.0.4 / 2014-06-19
==================

  * use `mime-types`

1.0.3 / 2014-06-11
==================

  * deps: negotiator@0.4.6
    - Order by specificity when quality is the same

1.0.2 / 2014-05-29
==================

  * Fix interpretation when header not in request
  * deps: pin negotiator@0.4.5

1.0.1 / 2014-01-18
==================

  * Identity encoding isn't always acceptable
  * deps: negotiator@~0.4.0

1.0.0 / 2013-12-27
==================

  * Genesis
(The MIT License)

Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
Copyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.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.
/*!
 * accepts
 * Copyright(c) 2014 Jonathan Ong
 * Copyright(c) 2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module dependencies.
 * @private
 */

var Negotiator = require('negotiator')
var mime = require('mime-types')

/**
 * Module exports.
 * @public
 */

module.exports = Accepts

/**
 * Create a new Accepts object for the given req.
 *
 * @param {object} req
 * @public
 */

function Accepts (req) {
  if (!(this instanceof Accepts)) {
    return new Accepts(req)
  }

  this.headers = req.headers
  this.negotiator = new Negotiator(req)
}

/**
 * Check if the given `type(s)` is acceptable, returning
 * the best match when true, otherwise `undefined`, in which
 * case you should respond with 406 "Not Acceptable".
 *
 * The `type` value may be a single mime type string
 * such as "application/json", the extension name
 * such as "json" or an array `["json", "html", "text/plain"]`. When a list
 * or array is given the _best_ match, if any is returned.
 *
 * Examples:
 *
 *     // Accept: text/html
 *     this.types('html');
 *     // => "html"
 *
 *     // Accept: text/*, application/json
 *     this.types('html');
 *     // => "html"
 *     this.types('text/html');
 *     // => "text/html"
 *     this.types('json', 'text');
 *     // => "json"
 *     this.types('application/json');
 *     // => "application/json"
 *
 *     // Accept: text/*, application/json
 *     this.types('image/png');
 *     this.types('png');
 *     // => undefined
 *
 *     // Accept: text/*;q=.5, application/json
 *     this.types(['html', 'json']);
 *     this.types('html', 'json');
 *     // => "json"
 *
 * @param {String|Array} types...
 * @return {String|Array|Boolean}
 * @public
 */

Accepts.prototype.type =
Accepts.prototype.types = function (types_) {
  var types = types_

  // support flattened arguments
  if (types && !Array.isArray(types)) {
    types = new Array(arguments.length)
    for (var i = 0; i < types.length; i++) {
      types[i] = arguments[i]
    }
  }

  // no types, return all requested types
  if (!types || types.length === 0) {
    return this.negotiator.mediaTypes()
  }

  // no accept header, return first given type
  if (!this.headers.accept) {
    return types[0]
  }

  var mimes = types.map(extToMime)
  var accepts = this.negotiator.mediaTypes(mimes.filter(validMime))
  var first = accepts[0]

  return first
    ? types[mimes.indexOf(first)]
    : false
}

/**
 * Return accepted encodings or best fit based on `encodings`.
 *
 * Given `Accept-Encoding: gzip, deflate`
 * an array sorted by quality is returned:
 *
 *     ['gzip', 'deflate']
 *
 * @param {String|Array} encodings...
 * @return {String|Array}
 * @public
 */

Accepts.prototype.encoding =
Accepts.prototype.encodings = function (encodings_) {
  var encodings = encodings_

  // support flattened arguments
  if (encodings && !Array.isArray(encodings)) {
    encodings = new Array(arguments.length)
    for (var i = 0; i < encodings.length; i++) {
      encodings[i] = arguments[i]
    }
  }

  // no encodings, return all requested encodings
  if (!encodings || encodings.length === 0) {
    return this.negotiator.encodings()
  }

  return this.negotiator.encodings(encodings)[0] || false
}

/**
 * Return accepted charsets or best fit based on `charsets`.
 *
 * Given `Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5`
 * an array sorted by quality is returned:
 *
 *     ['utf-8', 'utf-7', 'iso-8859-1']
 *
 * @param {String|Array} charsets...
 * @return {String|Array}
 * @public
 */

Accepts.prototype.charset =
Accepts.prototype.charsets = function (charsets_) {
  var charsets = charsets_

  // support flattened arguments
  if (charsets && !Array.isArray(charsets)) {
    charsets = new Array(arguments.length)
    for (var i = 0; i < charsets.length; i++) {
      charsets[i] = arguments[i]
    }
  }

  // no charsets, return all requested charsets
  if (!charsets || charsets.length === 0) {
    return this.negotiator.charsets()
  }

  return this.negotiator.charsets(charsets)[0] || false
}

/**
 * Return accepted languages or best fit based on `langs`.
 *
 * Given `Accept-Language: en;q=0.8, es, pt`
 * an array sorted by quality is returned:
 *
 *     ['es', 'pt', 'en']
 *
 * @param {String|Array} langs...
 * @return {Array|String}
 * @public
 */

Accepts.prototype.lang =
Accepts.prototype.langs =
Accepts.prototype.language =
Accepts.prototype.languages = function (languages_) {
  var languages = languages_

  // support flattened arguments
  if (languages && !Array.isArray(languages)) {
    languages = new Array(arguments.length)
    for (var i = 0; i < languages.length; i++) {
      languages[i] = arguments[i]
    }
  }

  // no languages, return all requested languages
  if (!languages || languages.length === 0) {
    return this.negotiator.languages()
  }

  return this.negotiator.languages(languages)[0] || false
}

/**
 * Convert extnames to mime.
 *
 * @param {String} type
 * @return {String}
 * @private
 */

function extToMime (type) {
  return type.indexOf('/') === -1
    ? mime.lookup(type)
    : type
}

/**
 * Check if mime is valid.
 *
 * @param {String} type
 * @return {String}
 * @private
 */

function validMime (type) {
  return typeof type === 'string'
}
{
  "name": "accepts",
  "description": "Higher-level content negotiation",
  "version": "1.3.8",
  "license": "MIT",
  "repository": "jshttp/accepts",
  "dependencies": {
    "mime-types": "~2.1.34",
    "negotiator": "0.6.3"
  },
  "devDependencies": {
    "deep-equal": "1.0.1",
    "eslint": "7.32.0",
    "eslint-config-standard": "14.1.1",
    "eslint-plugin-import": "2.25.4",
    "eslint-plugin-markdown": "2.2.1",
    "eslint-plugin-node": "11.1.0",
    "eslint-plugin-promise": "4.3.1",
    "eslint-plugin-standard": "4.1.0",
    "mocha": "9.2.0",
    "nyc": "15.1.0"
  },
  "files": [
    "LICENSE",
    "HISTORY.md",
    "index.js"
  ],
  "engines": {
    "node": ">= 0.6"
  }
}{
  "name": "agent-base",
  "version": "6.0.2",
  "description": "Turn a function into an `http.Agent` instance",
  "main": "dist/src/index",
  "typings": "dist/src/index",
  "files": [
    "dist/src",
    "src"
  ],
  "repository": {
    "type": "git",
    "url": "git://github.com/TooTallNate/node-agent-base.git"
  },
  "author": "Nathan Rajlich <nathan@tootallnate.net> (http://n8.io/)",
  "license": "MIT",
  "dependencies": {
    "debug": "4"
  },
  "devDependencies": {
    "@types/debug": "4",
    "@types/mocha": "^5.2.7",
    "@types/node": "^14.0.20",
    "@types/semver": "^7.1.0",
    "@types/ws": "^6.0.3",
    "@typescript-eslint/eslint-plugin": "1.6.0",
    "@typescript-eslint/parser": "1.1.0",
    "async-listen": "^1.2.0",
    "cpy-cli": "^2.0.0",
    "eslint": "5.16.0",
    "eslint-config-airbnb": "17.1.0",
    "eslint-config-prettier": "4.1.0",
    "eslint-import-resolver-typescript": "1.1.1",
    "eslint-plugin-import": "2.16.0",
    "eslint-plugin-jsx-a11y": "6.2.1",
    "eslint-plugin-react": "7.12.4",
    "mocha": "^6.2.0",
    "rimraf": "^3.0.0",
    "semver": "^7.1.2",
    "typescript": "^3.5.3",
    "ws": "^3.0.0"
  },
  "engines": {
    "node": ">= 6.0.0"
  }
}import net from 'net';
import http from 'http';
import https from 'https';
import { Duplex } from 'stream';
import { EventEmitter } from 'events';
import createDebug from 'debug';
import promisify from './promisify';

const debug = createDebug('agent-base');

function isAgent(v: any): v is createAgent.AgentLike {
	return Boolean(v) && typeof v.addRequest === 'function';
}

function isSecureEndpoint(): boolean {
	const { stack } = new Error();
	if (typeof stack !== 'string') return false;
	return stack.split('\n').some(l => l.indexOf('(https.js:') !== -1  || l.indexOf('node:https:') !== -1);
}

function createAgent(opts?: createAgent.AgentOptions): createAgent.Agent;
function createAgent(
	callback: createAgent.AgentCallback,
	opts?: createAgent.AgentOptions
): createAgent.Agent;
function createAgent(
	callback?: createAgent.AgentCallback | createAgent.AgentOptions,
	opts?: createAgent.AgentOptions
) {
	return new createAgent.Agent(callback, opts);
}

namespace createAgent {
	export interface ClientRequest extends http.ClientRequest {
		_last?: boolean;
		_hadError?: boolean;
		method: string;
	}

	export interface AgentRequestOptions {
		host?: string;
		path?: string;
		// `port` on `http.RequestOptions` can be a string or undefined,
		// but `net.TcpNetConnectOpts` expects only a number
		port: number;
	}

	export interface HttpRequestOptions
		extends AgentRequestOptions,
			Omit<http.RequestOptions, keyof AgentRequestOptions> {
		secureEndpoint: false;
	}

	export interface HttpsRequestOptions
		extends AgentRequestOptions,
			Omit<https.RequestOptions, keyof AgentRequestOptions> {
		secureEndpoint: true;
	}

	export type RequestOptions = HttpRequestOptions | HttpsRequestOptions;

	export type AgentLike = Pick<createAgent.Agent, 'addRequest'> | http.Agent;

	export type AgentCallbackReturn = Duplex | AgentLike;

	export type AgentCallbackCallback = (
		err?: Error | null,
		socket?: createAgent.AgentCallbackReturn
	) => void;

	export type AgentCallbackPromise = (
		req: createAgent.ClientRequest,
		opts: createAgent.RequestOptions
	) =>
		| createAgent.AgentCallbackReturn
		| Promise<createAgent.AgentCallbackReturn>;

	export type AgentCallback = typeof Agent.prototype.callback;

	export type AgentOptions = {
		timeout?: number;
	};

	/**
	 * Base `http.Agent` implementation.
	 * No pooling/keep-alive is implemented by default.
	 *
	 * @param {Function} callback
	 * @api public
	 */
	export class Agent extends EventEmitter {
		public timeout: number | null;
		public maxFreeSockets: number;
		public maxTotalSockets: number;
		public maxSockets: number;
		public sockets: {
			[key: string]: net.Socket[];
		};
		public freeSockets: {
			[key: string]: net.Socket[];
		};
		public requests: {
			[key: string]: http.IncomingMessage[];
		};
		public options: https.AgentOptions;
		private promisifiedCallback?: createAgent.AgentCallbackPromise;
		private explicitDefaultPort?: number;
		private explicitProtocol?: string;

		constructor(
			callback?: createAgent.AgentCallback | createAgent.AgentOptions,
			_opts?: createAgent.AgentOptions
		) {
			super();

			let opts = _opts;
			if (typeof callback === 'function') {
				this.callback = callback;
			} else if (callback) {
				opts = callback;
			}

			// Timeout for the socket to be returned from the callback
			this.timeout = null;
			if (opts && typeof opts.timeout === 'number') {
				this.timeout = opts.timeout;
			}

			// These aren't actually used by `agent-base`, but are required
			// for the TypeScript definition files in `@types/node` :/
			this.maxFreeSockets = 1;
			this.maxSockets = 1;
			this.maxTotalSockets = Infinity;
			this.sockets = {};
			this.freeSockets = {};
			this.requests = {};
			this.options = {};
		}

		get defaultPort(): number {
			if (typeof this.explicitDefaultPort === 'number') {
				return this.explicitDefaultPort;
			}
			return isSecureEndpoint() ? 443 : 80;
		}

		set defaultPort(v: number) {
			this.explicitDefaultPort = v;
		}

		get protocol(): string {
			if (typeof this.explicitProtocol === 'string') {
				return this.explicitProtocol;
			}
			return isSecureEndpoint() ? 'https:' : 'http:';
		}

		set protocol(v: string) {
			this.explicitProtocol = v;
		}

		callback(
			req: createAgent.ClientRequest,
			opts: createAgent.RequestOptions,
			fn: createAgent.AgentCallbackCallback
		): void;
		callback(
			req: createAgent.ClientRequest,
			opts: createAgent.RequestOptions
		):
			| createAgent.AgentCallbackReturn
			| Promise<createAgent.AgentCallbackReturn>;
		callback(
			req: createAgent.ClientRequest,
			opts: createAgent.AgentOptions,
			fn?: createAgent.AgentCallbackCallback
		):
			| createAgent.AgentCallbackReturn
			| Promise<createAgent.AgentCallbackReturn>
			| void {
			throw new Error(
				'"agent-base" has no default implementation, you must subclass and override `callback()`'
			);
		}

		/**
		 * Called by node-core's "_http_client.js" module when creating
		 * a new HTTP request with this Agent instance.
		 *
		 * @api public
		 */
		addRequest(req: ClientRequest, _opts: RequestOptions): void {
			const opts: RequestOptions = { ..._opts };

			if (typeof opts.secureEndpoint !== 'boolean') {
				opts.secureEndpoint = isSecureEndpoint();
			}

			if (opts.host == null) {
				opts.host = 'localhost';
			}

			if (opts.port == null) {
				opts.port = opts.secureEndpoint ? 443 : 80;
			}

			if (opts.protocol == null) {
				opts.protocol = opts.secureEndpoint ? 'https:' : 'http:';
			}

			if (opts.host && opts.path) {
				// If both a `host` and `path` are specified then it's most
				// likely the result of a `url.parse()` call... we need to
				// remove the `path` portion so that `net.connect()` doesn't
				// attempt to open that as a unix socket file.
				delete opts.path;
			}

			delete opts.agent;
			delete opts.hostname;
			delete opts._defaultAgent;
			delete opts.defaultPort;
			delete opts.createConnection;

			// Hint to use "Connection: close"
			// XXX: non-documented `http` module API :(
			req._last = true;
			req.shouldKeepAlive = false;

			let timedOut = false;
			let timeoutId: ReturnType<typeof setTimeout> | null = null;
			const timeoutMs = opts.timeout || this.timeout;

			const onerror = (err: NodeJS.ErrnoException) => {
				if (req._hadError) return;
				req.emit('error', err);
				// For Safety. Some additional errors might fire later on
				// and we need to make sure we don't double-fire the error event.
				req._hadError = true;
			};

			const ontimeout = () => {
				timeoutId = null;
				timedOut = true;
				const err: NodeJS.ErrnoException = new Error(
					`A "socket" was not created for HTTP request before ${timeoutMs}ms`
				);
				err.code = 'ETIMEOUT';
				onerror(err);
			};

			const callbackError = (err: NodeJS.ErrnoException) => {
				if (timedOut) return;
				if (timeoutId !== null) {
					clearTimeout(timeoutId);
					timeoutId = null;
				}
				onerror(err);
			};

			const onsocket = (socket: AgentCallbackReturn) => {
				if (timedOut) return;
				if (timeoutId != null) {
					clearTimeout(timeoutId);
					timeoutId = null;
				}

				if (isAgent(socket)) {
					// `socket` is actually an `http.Agent` instance, so
					// relinquish responsibility for this `req` to the Agent
					// from here on
					debug(
						'Callback returned another Agent instance %o',
						socket.constructor.name
					);
					(socket as createAgent.Agent).addRequest(req, opts);
					return;
				}

				if (socket) {
					socket.once('free', () => {
						this.freeSocket(socket as net.Socket, opts);
					});
					req.onSocket(socket as net.Socket);
					return;
				}

				const err = new Error(
					`no Duplex stream was returned to agent-base for \`${req.method} ${req.path}\``
				);
				onerror(err);
			};

			if (typeof this.callback !== 'function') {
				onerror(new Error('`callback` is not defined'));
				return;
			}

			if (!this.promisifiedCallback) {
				if (this.callback.length >= 3) {
					debug('Converting legacy callback function to promise');
					this.promisifiedCallback = promisify(this.callback);
				} else {
					this.promisifiedCallback = this.callback;
				}
			}

			if (typeof timeoutMs === 'number' && timeoutMs > 0) {
				timeoutId = setTimeout(ontimeout, timeoutMs);
			}

			if ('port' in opts && typeof opts.port !== 'number') {
				opts.port = Number(opts.port);
			}

			try {
				debug(
					'Resolving socket for %o request: %o',
					opts.protocol,
					`${req.method} ${req.path}`
				);
				Promise.resolve(this.promisifiedCallback(req, opts)).then(
					onsocket,
					callbackError
				);
			} catch (err) {
				Promise.reject(err).catch(callbackError);
			}
		}

		freeSocket(socket: net.Socket, opts: AgentOptions) {
			debug('Freeing socket %o %o', socket.constructor.name, opts);
			socket.destroy();
		}

		destroy() {
			debug('Destroying agent %o', this.constructor.name);
		}
	}

	// So that `instanceof` works correctly
	createAgent.prototype = createAgent.Agent.prototype;
}

export = createAgent;
import {
	Agent,
	ClientRequest,
	RequestOptions,
	AgentCallbackCallback,
	AgentCallbackPromise,
	AgentCallbackReturn
} from './index';

type LegacyCallback = (
	req: ClientRequest,
	opts: RequestOptions,
	fn: AgentCallbackCallback
) => void;

export default function promisify(fn: LegacyCallback): AgentCallbackPromise {
	return function(this: Agent, req: ClientRequest, opts: RequestOptions) {
		return new Promise((resolve, reject) => {
			fn.call(
				this,
				req,
				opts,
				(err: Error | null | undefined, rtn?: AgentCallbackReturn) => {
					if (err) {
						reject(err);
					} else {
						resolve(rtn);
					}
				}
			);
		});
	};
}
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
const events_1 = require("events");
const debug_1 = __importDefault(require("debug"));
const promisify_1 = __importDefault(require("./promisify"));
const debug = debug_1.default('agent-base');
function isAgent(v) {
    return Boolean(v) && typeof v.addRequest === 'function';
}
function isSecureEndpoint() {
    const { stack } = new Error();
    if (typeof stack !== 'string')
        return false;
    return stack.split('\n').some(l => l.indexOf('(https.js:') !== -1 || l.indexOf('node:https:') !== -1);
}
function createAgent(callback, opts) {
    return new createAgent.Agent(callback, opts);
}
(function (createAgent) {
    /**
     * Base `http.Agent` implementation.
     * No pooling/keep-alive is implemented by default.
     *
     * @param {Function} callback
     * @api public
     */
    class Agent extends events_1.EventEmitter {
        constructor(callback, _opts) {
            super();
            let opts = _opts;
            if (typeof callback === 'function') {
                this.callback = callback;
            }
            else if (callback) {
                opts = callback;
            }
            // Timeout for the socket to be returned from the callback
            this.timeout = null;
            if (opts && typeof opts.timeout === 'number') {
                this.timeout = opts.timeout;
            }
            // These aren't actually used by `agent-base`, but are required
            // for the TypeScript definition files in `@types/node` :/
            this.maxFreeSockets = 1;
            this.maxSockets = 1;
            this.maxTotalSockets = Infinity;
            this.sockets = {};
            this.freeSockets = {};
            this.requests = {};
            this.options = {};
        }
        get defaultPort() {
            if (typeof this.explicitDefaultPort === 'number') {
                return this.explicitDefaultPort;
            }
            return isSecureEndpoint() ? 443 : 80;
        }
        set defaultPort(v) {
            this.explicitDefaultPort = v;
        }
        get protocol() {
            if (typeof this.explicitProtocol === 'string') {
                return this.explicitProtocol;
            }
            return isSecureEndpoint() ? 'https:' : 'http:';
        }
        set protocol(v) {
            this.explicitProtocol = v;
        }
        callback(req, opts, fn) {
            throw new Error('"agent-base" has no default implementation, you must subclass and override `callback()`');
        }
        /**
         * Called by node-core's "_http_client.js" module when creating
         * a new HTTP request with this Agent instance.
         *
         * @api public
         */
        addRequest(req, _opts) {
            const opts = Object.assign({}, _opts);
            if (typeof opts.secureEndpoint !== 'boolean') {
                opts.secureEndpoint = isSecureEndpoint();
            }
            if (opts.host == null) {
                opts.host = 'localhost';
            }
            if (opts.port == null) {
                opts.port = opts.secureEndpoint ? 443 : 80;
            }
            if (opts.protocol == null) {
                opts.protocol = opts.secureEndpoint ? 'https:' : 'http:';
            }
            if (opts.host && opts.path) {
                // If both a `host` and `path` are specified then it's most
                // likely the result of a `url.parse()` call... we need to
                // remove the `path` portion so that `net.connect()` doesn't
                // attempt to open that as a unix socket file.
                delete opts.path;
            }
            delete opts.agent;
            delete opts.hostname;
            delete opts._defaultAgent;
            delete opts.defaultPort;
            delete opts.createConnection;
            // Hint to use "Connection: close"
            // XXX: non-documented `http` module API :(
            req._last = true;
            req.shouldKeepAlive = false;
            let timedOut = false;
            let timeoutId = null;
            const timeoutMs = opts.timeout || this.timeout;
            const onerror = (err) => {
                if (req._hadError)
                    return;
                req.emit('error', err);
                // For Safety. Some additional errors might fire later on
                // and we need to make sure we don't double-fire the error event.
                req._hadError = true;
            };
            const ontimeout = () => {
                timeoutId = null;
                timedOut = true;
                const err = new Error(`A "socket" was not created for HTTP request before ${timeoutMs}ms`);
                err.code = 'ETIMEOUT';
                onerror(err);
            };
            const callbackError = (err) => {
                if (timedOut)
                    return;
                if (timeoutId !== null) {
                    clearTimeout(timeoutId);
                    timeoutId = null;
                }
                onerror(err);
            };
            const onsocket = (socket) => {
                if (timedOut)
                    return;
                if (timeoutId != null) {
                    clearTimeout(timeoutId);
                    timeoutId = null;
                }
                if (isAgent(socket)) {
                    // `socket` is actually an `http.Agent` instance, so
                    // relinquish responsibility for this `req` to the Agent
                    // from here on
                    debug('Callback returned another Agent instance %o', socket.constructor.name);
                    socket.addRequest(req, opts);
                    return;
                }
                if (socket) {
                    socket.once('free', () => {
                        this.freeSocket(socket, opts);
                    });
                    req.onSocket(socket);
                    return;
                }
                const err = new Error(`no Duplex stream was returned to agent-base for \`${req.method} ${req.path}\``);
                onerror(err);
            };
            if (typeof this.callback !== 'function') {
                onerror(new Error('`callback` is not defined'));
                return;
            }
            if (!this.promisifiedCallback) {
                if (this.callback.length >= 3) {
                    debug('Converting legacy callback function to promise');
                    this.promisifiedCallback = promisify_1.default(this.callback);
                }
                else {
                    this.promisifiedCallback = this.callback;
                }
            }
            if (typeof timeoutMs === 'number' && timeoutMs > 0) {
                timeoutId = setTimeout(ontimeout, timeoutMs);
            }
            if ('port' in opts && typeof opts.port !== 'number') {
                opts.port = Number(opts.port);
            }
            try {
                debug('Resolving socket for %o request: %o', opts.protocol, `${req.method} ${req.path}`);
                Promise.resolve(this.promisifiedCallback(req, opts)).then(onsocket, callbackError);
            }
            catch (err) {
                Promise.reject(err).catch(callbackError);
            }
        }
        freeSocket(socket, opts) {
            debug('Freeing socket %o %o', socket.constructor.name, opts);
            socket.destroy();
        }
        destroy() {
            debug('Destroying agent %o', this.constructor.name);
        }
    }
    createAgent.Agent = Agent;
    // So that `instanceof` works correctly
    createAgent.prototype = createAgent.Agent.prototype;
})(createAgent || (createAgent = {}));
module.exports = createAgent;
//# sourceMappingURL=index.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function promisify(fn) {
    return function (req, opts) {
        return new Promise((resolve, reject) => {
            fn.call(this, req, opts, (err, rtn) => {
                if (err) {
                    reject(err);
                }
                else {
                    resolve(rtn);
                }
            });
        });
    };
}
exports.default = promisify;
//# sourceMappingURL=promisify.js.map
4.2.1 / 2022-02-21
==================

**fixes**
  * [[`8b13b5c`](http://github.com/node-modules/agentkeepalive/commit/8b13b5ca797f4779a0a8d393ad8ecb622cd27987)] - fix: explicitly set `| undefined` in type definitions (#99) (Benoit Lemoine <<lemoine.benoit@gmail.com>>)

4.2.0 / 2021-12-31
==================

**fixes**
  * [[`f418c67`](http://github.com/node-modules/agentkeepalive/commit/f418c67a63c061c7261592d4553bc455e0b0d306)] - fix: change `freeSocketTimeout` default value to 4000 (#102) (fengmk2 <<fengmk2@gmail.com>>)

**others**
  * [[`bc2a1ce`](http://github.com/node-modules/agentkeepalive/commit/bc2a1cea0884b4d18b0d244bf00006d9107963df)] - doc(readme): making `timeout`'s default clear (#100) (Aaron <<aaronarinder@gmail.com>>)

4.1.4 / 2021-02-05
==================

**fixes**
  * [[`4d04794`](http://github.com/node-modules/agentkeepalive/commit/4d047946b1547b4edff92ea40205aee4f0c8aa46)] - fix(types): correct `Https` constructor argument (#89) (Simen Bekkhus <<sbekkhus91@gmail.com>>)

4.1.3 / 2020-06-15
==================

**fixes**
  * [[`4ba9f9c`](http://github.com/node-modules/agentkeepalive/commit/4ba9f9c844f2a6b8037ce56599d25c69ef054d91)] - fix: compatible with node v12.16.3 (#91) (killa <<killa123@126.com>>)

4.1.2 / 2020-04-25
==================

**fixes**
  * [[`de66b02`](http://github.com/node-modules/agentkeepalive/commit/de66b0206d064a97129c2c31bcdabd4d64557b91)] - fix: detect http request timeout handler (#88) (fengmk2 <<fengmk2@gmail.com>>)

4.1.1 / 2020-04-25
==================

**fixes**
  * [[`bbd20c0`](http://github.com/node-modules/agentkeepalive/commit/bbd20c03b8cf7dfb00b3aad1ada26d4ab90d2d6e)] - fix: definition error (#87) (吖猩 <<whxaxes@qq.com>>)

**others**
  * [[`3b01699`](http://github.com/node-modules/agentkeepalive/commit/3b01699b8e90022d5f56898dd709e4fe7ee7cdaa)] - test: run test on node 12 (#84) (Igor Savin <<iselwin@gmail.com>>)

4.1.0 / 2019-10-12
==================

**features**
  * [[`fe33b80`](http://github.com/node-modules/agentkeepalive/commit/fe33b800acc09109388bfe65107550952b6fc7b0)] - feat: Add `reusedSocket` property on client request (#82) (Weijia Wang <<starkwang@126.com>>)

**others**
  * [[`77ba744`](http://github.com/node-modules/agentkeepalive/commit/77ba744667bb6b9e5986a53e5222f62094db12b9)] - docs: fix grammar in readme (#81) (Herrington Darkholme <<2883231+HerringtonDarkholme@users.noreply.github.com>>)

4.0.2 / 2019-02-19
==================

**fixes**
  * [[`56d4a9b`](http://github.com/node-modules/agentkeepalive/commit/56d4a9b2a4499ea28943ddb590358d7831a02cb1)] - fix: HttpAgent export = internal (#74) (Andrew Leedham <<AndrewLeedham@outlook.com>>)

4.0.1 / 2019-02-19
==================

**fixes**
  * [[`bad1ac0`](http://github.com/node-modules/agentkeepalive/commit/bad1ac0e710fbc486717e14e68c59266d35df6a8)] - fix: HttpsAgent Type Definition (#71) (#72) (Andrew Leedham <<AndrewLeedham@outlook.com>>)
  * [[`f48a4a7`](http://github.com/node-modules/agentkeepalive/commit/f48a4a701ea6fbe43781c91e1c0aaad6e328ac7f)] - fix: export interface (#70) (Vinay <<vinaybedre@gmail.com>>)

**others**
  * [[`9124343`](http://github.com/node-modules/agentkeepalive/commit/91243437cfdd324cb97f39dee76746d5e5f4cd72)] - chore: add agent.options.keepAlive instead agent.keepAlive (fengmk2 <<fengmk2@gmail.com>>)
  * [[`d177d40`](http://github.com/node-modules/agentkeepalive/commit/d177d40422fe7296990b4e270cf498e3f33c18fa)] - test: add request timeout bigger than agent timeout cases (fengmk2 <<fengmk2@gmail.com>>)

4.0.0 / 2018-10-23
==================

**features**
  * [[`5c9f3bb`](http://github.com/node-modules/agentkeepalive/commit/5c9f3bbd60555744edcf777105b148982a1a42b6)] - feat: impl the new Agent extend http.Agent (fengmk2 <<fengmk2@gmail.com>>)

**others**
  * [[`498c8f1`](http://github.com/node-modules/agentkeepalive/commit/498c8f13cf76600d3dd6e1c91cdf2d8292355dff)] - chore: move LICENSE from readme to file (fengmk2 <<fengmk2@gmail.com>>)
  * [[`4f39894`](http://github.com/node-modules/agentkeepalive/commit/4f398942ba2f90cf4501239e56ac4e6344931a01)] - bugfix: support agent.options.timeout on https agent (fengmk2 <<fengmk2@gmail.com>>)

3.5.2 / 2018-10-19
==================

**fixes**
  * [[`5751fc1`](http://github.com/node-modules/agentkeepalive/commit/5751fc1180ed6544602c681ffbd08ca66a0cb12c)] - fix: sockLen being miscalculated when removing sockets (#60) (Ehden Sinai <<cixel@users.noreply.github.com>>)

3.5.1 / 2018-07-31
==================

**fixes**
  * [[`495f1ab`](http://github.com/node-modules/agentkeepalive/commit/495f1ab625d43945d72f68096b97db723d4f0657)] - fix: add the lost npm files (#66) (Henry Zhuang <<zhuanghengfei@gmail.com>>)

3.5.0 / 2018-07-31
==================

**features**
  * [[`16f5aea`](http://github.com/node-modules/agentkeepalive/commit/16f5aeadfda57f1c602652f1472a63cc83cd05bf)] - feat: add typing define. (#65) (Henry Zhuang <<zhuanghengfei@gmail.com>>)

**others**
  * [[`28fa062`](http://github.com/node-modules/agentkeepalive/commit/28fa06246fb5103f88ebeeb8563757a9078b8157)] - docs: add "per host" to description of maxFreeSockets (tony-gutierrez <<tony.gutierrez@bluefletch.com>>)
  * [[`7df2577`](http://github.com/node-modules/agentkeepalive/commit/7df25774f00a1031ca4daad2878a17e0539072a2)] - test: run test on node 10 (#63) (fengmk2 <<fengmk2@gmail.com>>)

3.4.1 / 2018-03-08
==================

**fixes**
  * [[`4d3a3b1`](http://github.com/node-modules/agentkeepalive/commit/4d3a3b1f7b16595febbbd39eeed72b2663549014)] - fix: Handle ipv6 addresses in host-header correctly with TLS (#53) (Mattias Holmlund <<u376@m1.holmlund.se>>)

**others**
  * [[`55a7a5c`](http://github.com/node-modules/agentkeepalive/commit/55a7a5cd33e97f9a8370083dcb041c5552f10ac9)] - test: stop timer after test end (fengmk2 <<fengmk2@gmail.com>>)

3.4.0 / 2018-02-27
==================

**features**
  * [[`bc7cadb`](http://github.com/node-modules/agentkeepalive/commit/bc7cadb30ecd2071e2b341ac53ae1a2b8155c43d)] - feat: use socket custom freeSocketKeepAliveTimeout first (#59) (fengmk2 <<fengmk2@gmail.com>>)

**others**
  * [[`138eda8`](http://github.com/node-modules/agentkeepalive/commit/138eda81e10b632aaa87bea0cb66d8667124c4e8)] - doc: fix `keepAliveMsecs` params description (#55) (Hongcai Deng <<admin@dhchouse.com>>)

3.3.0 / 2017-06-20
==================

  * feat: add statusChanged getter (#51)
  * chore: format License

3.2.0 / 2017-06-10
==================

  * feat: add expiring active sockets
  * test: add node 8 (#49)

3.1.0 / 2017-02-20
==================

  * feat: timeout support humanize ms (#48)

3.0.0 / 2016-12-20
==================

  * fix: emit agent socket close event
  * test: add remove excess calls to removeSocket
  * test: use egg-ci
  * test: refactor test with eslint rules
  * feat: merge _http_agent.js from 7.2.1

2.2.0 / 2016-06-26
==================

  * feat: Add browser shim (noop) for isomorphic use. (#39)
  * chore: add security check badge

2.1.1 / 2016-04-06
==================

  * https: fix ssl socket leak when keepalive is used
  * chore: remove circle ci image

2.1.0 / 2016-04-02
==================

  * fix: opened sockets number overflow maxSockets

2.0.5 / 2016-03-16
==================

  * fix: pick _evictSession to httpsAgent

2.0.4 / 2016-03-13
==================

  * test: add Circle ci
  * test: add appveyor ci build
  * refactor: make sure only one error listener
  * chore: use codecov
  * fix: handle idle socket error
  * test: run on more node versions

2.0.3 / 2015-08-03
==================

 * fix: add default error handler to avoid Unhandled error event throw

2.0.2 / 2015-04-25
==================

 * fix: remove socket from freeSockets on 'timeout' (@pmalouin)

2.0.1 / 2015-04-19
==================

 * fix: add timeoutSocketCount to getCurrentStatus()
 * feat(getCurrentStatus): add getCurrentStatus

2.0.0 / 2015-04-01
==================

 * fix: socket.destroyed always be undefined on 0.10.x
 * Make it compatible with node v0.10.x (@lattmann)

1.2.1 / 2015-03-23
==================

 * patch from iojs: don't overwrite servername option
 * patch commits from joyent/node
 * add max sockets test case
 * add nagle algorithm delayed link

1.2.0 / 2014-09-02
==================

 * allow set keepAliveTimeout = 0
 * support timeout on working socket. fixed #6

1.1.0 / 2014-08-28
==================

 * add some socket counter for deep monitor

1.0.0 / 2014-08-13
==================

 * update _http_agent, only support 0.11+, only support node 0.11.0+

0.2.2 / 2013-11-19 
==================

  * support node 0.8 and node 0.10

0.2.1 / 2013-11-08 
==================

  * fix socket does not timeout bug, it will hang on life, must use 0.2.x on node 0.11

0.2.0 / 2013-11-06 
==================

  * use keepalive agent on node 0.11+ impl

0.1.5 / 2013-06-24 
==================

  * support coveralls
  * add node 0.10 test
  * add 0.8.22 original https.js
  * add original http.js module to diff
  * update jscover
  * mv pem to fixtures
  * add https agent usage
The MIT License

Copyright(c) node-modules and other contributors.
Copyright(c) 2012 - 2015 fengmk2 <fengmk2@gmail.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.
module.exports = noop;
module.exports.HttpsAgent = noop;

// Noop function for browser since native api's don't use agents.
function noop () {}
'use strict';

module.exports = require('./lib/agent');
module.exports.HttpsAgent = require('./lib/https_agent');
module.exports.constants = require('./lib/constants');
{
  "name": "agentkeepalive",
  "version": "4.2.1",
  "description": "Missing keepalive http.Agent",
  "main": "index.js",
  "browser": "browser.js",
  "files": [
    "index.js",
    "index.d.ts",
    "browser.js",
    "lib"
  ],
  "repository": {
    "type": "git",
    "url": "git://github.com/node-modules/agentkeepalive.git"
  },
  "dependencies": {
    "debug": "^4.1.0",
    "depd": "^1.1.2",
    "humanize-ms": "^1.2.1"
  },
  "devDependencies": {
    "autod": "^3.0.1",
    "coffee": "^5.3.0",
    "cross-env": "^6.0.3",
    "egg-bin": "^4.9.0",
    "egg-ci": "^1.10.0",
    "eslint": "^5.7.0",
    "eslint-config-egg": "^7.1.0",
    "mm": "^2.4.1",
    "pedding": "^1.1.0",
    "typescript": "^3.8.3"
  },
  "engines": {
    "node": ">= 8.0.0"
  },
  "ci": {
    "type": "github",
    "os": {
      "github": "linux"
    },
    "version": "8, 10, 12, 14, 16"
  },
  "author": "fengmk2 <fengmk2@gmail.com> (https://fengmk2.com)",
  "license": "MIT"
}'use strict';

const OriginalAgent = require('http').Agent;
const ms = require('humanize-ms');
const debug = require('debug')('agentkeepalive');
const deprecate = require('depd')('agentkeepalive');
const {
  INIT_SOCKET,
  CURRENT_ID,
  CREATE_ID,
  SOCKET_CREATED_TIME,
  SOCKET_NAME,
  SOCKET_REQUEST_COUNT,
  SOCKET_REQUEST_FINISHED_COUNT,
} = require('./constants');

// OriginalAgent come from
// - https://github.com/nodejs/node/blob/v8.12.0/lib/_http_agent.js
// - https://github.com/nodejs/node/blob/v10.12.0/lib/_http_agent.js

// node <= 10
let defaultTimeoutListenerCount = 1;
const majorVersion = parseInt(process.version.split('.', 1)[0].substring(1));
if (majorVersion >= 11 && majorVersion <= 12) {
  defaultTimeoutListenerCount = 2;
} else if (majorVersion >= 13) {
  defaultTimeoutListenerCount = 3;
}

class Agent extends OriginalAgent {
  constructor(options) {
    options = options || {};
    options.keepAlive = options.keepAlive !== false;
    // default is keep-alive and 4s free socket timeout
    // see https://medium.com/ssense-tech/reduce-networking-errors-in-nodejs-23b4eb9f2d83
    if (options.freeSocketTimeout === undefined) {
      options.freeSocketTimeout = 4000;
    }
    // Legacy API: keepAliveTimeout should be rename to `freeSocketTimeout`
    if (options.keepAliveTimeout) {
      deprecate('options.keepAliveTimeout is deprecated, please use options.freeSocketTimeout instead');
      options.freeSocketTimeout = options.keepAliveTimeout;
      delete options.keepAliveTimeout;
    }
    // Legacy API: freeSocketKeepAliveTimeout should be rename to `freeSocketTimeout`
    if (options.freeSocketKeepAliveTimeout) {
      deprecate('options.freeSocketKeepAliveTimeout is deprecated, please use options.freeSocketTimeout instead');
      options.freeSocketTimeout = options.freeSocketKeepAliveTimeout;
      delete options.freeSocketKeepAliveTimeout;
    }

    // Sets the socket to timeout after timeout milliseconds of inactivity on the socket.
    // By default is double free socket timeout.
    if (options.timeout === undefined) {
      // make sure socket default inactivity timeout >= 8s
      options.timeout = Math.max(options.freeSocketTimeout * 2, 8000);
    }

    // support humanize format
    options.timeout = ms(options.timeout);
    options.freeSocketTimeout = ms(options.freeSocketTimeout);
    options.socketActiveTTL = options.socketActiveTTL ? ms(options.socketActiveTTL) : 0;

    super(options);

    this[CURRENT_ID] = 0;

    // create socket success counter
    this.createSocketCount = 0;
    this.createSocketCountLastCheck = 0;

    this.createSocketErrorCount = 0;
    this.createSocketErrorCountLastCheck = 0;

    this.closeSocketCount = 0;
    this.closeSocketCountLastCheck = 0;

    // socket error event count
    this.errorSocketCount = 0;
    this.errorSocketCountLastCheck = 0;

    // request finished counter
    this.requestCount = 0;
    this.requestCountLastCheck = 0;

    // including free socket timeout counter
    this.timeoutSocketCount = 0;
    this.timeoutSocketCountLastCheck = 0;

    this.on('free', socket => {
      // https://github.com/nodejs/node/pull/32000
      // Node.js native agent will check socket timeout eqs agent.options.timeout.
      // Use the ttl or freeSocketTimeout to overwrite.
      const timeout = this.calcSocketTimeout(socket);
      if (timeout > 0 && socket.timeout !== timeout) {
        socket.setTimeout(timeout);
      }
    });
  }

  get freeSocketKeepAliveTimeout() {
    deprecate('agent.freeSocketKeepAliveTimeout is deprecated, please use agent.options.freeSocketTimeout instead');
    return this.options.freeSocketTimeout;
  }

  get timeout() {
    deprecate('agent.timeout is deprecated, please use agent.options.timeout instead');
    return this.options.timeout;
  }

  get socketActiveTTL() {
    deprecate('agent.socketActiveTTL is deprecated, please use agent.options.socketActiveTTL instead');
    return this.options.socketActiveTTL;
  }

  calcSocketTimeout(socket) {
    /**
     * return <= 0: should free socket
     * return > 0: should update socket timeout
     * return undefined: not find custom timeout
     */
    let freeSocketTimeout = this.options.freeSocketTimeout;
    const socketActiveTTL = this.options.socketActiveTTL;
    if (socketActiveTTL) {
      // check socketActiveTTL
      const aliveTime = Date.now() - socket[SOCKET_CREATED_TIME];
      const diff = socketActiveTTL - aliveTime;
      if (diff <= 0) {
        return diff;
      }
      if (freeSocketTimeout && diff < freeSocketTimeout) {
        freeSocketTimeout = diff;
      }
    }
    // set freeSocketTimeout
    if (freeSocketTimeout) {
      // set free keepalive timer
      // try to use socket custom freeSocketTimeout first, support headers['keep-alive']
      // https://github.com/node-modules/urllib/blob/b76053020923f4d99a1c93cf2e16e0c5ba10bacf/lib/urllib.js#L498
      const customFreeSocketTimeout = socket.freeSocketTimeout || socket.freeSocketKeepAliveTimeout;
      return customFreeSocketTimeout || freeSocketTimeout;
    }
  }

  keepSocketAlive(socket) {
    const result = super.keepSocketAlive(socket);
    // should not keepAlive, do nothing
    if (!result) return result;

    const customTimeout = this.calcSocketTimeout(socket);
    if (typeof customTimeout === 'undefined') {
      return true;
    }
    if (customTimeout <= 0) {
      debug('%s(requests: %s, finished: %s) free but need to destroy by TTL, request count %s, diff is %s',
        socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT], customTimeout);
      return false;
    }
    if (socket.timeout !== customTimeout) {
      socket.setTimeout(customTimeout);
    }
    return true;
  }

  // only call on addRequest
  reuseSocket(...args) {
    // reuseSocket(socket, req)
    super.reuseSocket(...args);
    const socket = args[0];
    const req = args[1];
    req.reusedSocket = true;
    const agentTimeout = this.options.timeout;
    if (getSocketTimeout(socket) !== agentTimeout) {
      // reset timeout before use
      socket.setTimeout(agentTimeout);
      debug('%s reset timeout to %sms', socket[SOCKET_NAME], agentTimeout);
    }
    socket[SOCKET_REQUEST_COUNT]++;
    debug('%s(requests: %s, finished: %s) reuse on addRequest, timeout %sms',
      socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT],
      getSocketTimeout(socket));
  }

  [CREATE_ID]() {
    const id = this[CURRENT_ID]++;
    if (this[CURRENT_ID] === Number.MAX_SAFE_INTEGER) this[CURRENT_ID] = 0;
    return id;
  }

  [INIT_SOCKET](socket, options) {
    // bugfix here.
    // https on node 8, 10 won't set agent.options.timeout by default
    // TODO: need to fix on node itself
    if (options.timeout) {
      const timeout = getSocketTimeout(socket);
      if (!timeout) {
        socket.setTimeout(options.timeout);
      }
    }

    if (this.options.keepAlive) {
      // Disable Nagle's algorithm: http://blog.caustik.com/2012/04/08/scaling-node-js-to-100k-concurrent-connections/
      // https://fengmk2.com/benchmark/nagle-algorithm-delayed-ack-mock.html
      socket.setNoDelay(true);
    }
    this.createSocketCount++;
    if (this.options.socketActiveTTL) {
      socket[SOCKET_CREATED_TIME] = Date.now();
    }
    // don't show the hole '-----BEGIN CERTIFICATE----' key string
    socket[SOCKET_NAME] = `sock[${this[CREATE_ID]()}#${options._agentKey}]`.split('-----BEGIN', 1)[0];
    socket[SOCKET_REQUEST_COUNT] = 1;
    socket[SOCKET_REQUEST_FINISHED_COUNT] = 0;
    installListeners(this, socket, options);
  }

  createConnection(options, oncreate) {
    let called = false;
    const onNewCreate = (err, socket) => {
      if (called) return;
      called = true;

      if (err) {
        this.createSocketErrorCount++;
        return oncreate(err);
      }
      this[INIT_SOCKET](socket, options);
      oncreate(err, socket);
    };

    const newSocket = super.createConnection(options, onNewCreate);
    if (newSocket) onNewCreate(null, newSocket);
  }

  get statusChanged() {
    const changed = this.createSocketCount !== this.createSocketCountLastCheck ||
      this.createSocketErrorCount !== this.createSocketErrorCountLastCheck ||
      this.closeSocketCount !== this.closeSocketCountLastCheck ||
      this.errorSocketCount !== this.errorSocketCountLastCheck ||
      this.timeoutSocketCount !== this.timeoutSocketCountLastCheck ||
      this.requestCount !== this.requestCountLastCheck;
    if (changed) {
      this.createSocketCountLastCheck = this.createSocketCount;
      this.createSocketErrorCountLastCheck = this.createSocketErrorCount;
      this.closeSocketCountLastCheck = this.closeSocketCount;
      this.errorSocketCountLastCheck = this.errorSocketCount;
      this.timeoutSocketCountLastCheck = this.timeoutSocketCount;
      this.requestCountLastCheck = this.requestCount;
    }
    return changed;
  }

  getCurrentStatus() {
    return {
      createSocketCount: this.createSocketCount,
      createSocketErrorCount: this.createSocketErrorCount,
      closeSocketCount: this.closeSocketCount,
      errorSocketCount: this.errorSocketCount,
      timeoutSocketCount: this.timeoutSocketCount,
      requestCount: this.requestCount,
      freeSockets: inspect(this.freeSockets),
      sockets: inspect(this.sockets),
      requests: inspect(this.requests),
    };
  }
}

// node 8 don't has timeout attribute on socket
// https://github.com/nodejs/node/pull/21204/files#diff-e6ef024c3775d787c38487a6309e491dR408
function getSocketTimeout(socket) {
  return socket.timeout || socket._idleTimeout;
}

function installListeners(agent, socket, options) {
  debug('%s create, timeout %sms', socket[SOCKET_NAME], getSocketTimeout(socket));

  // listener socket events: close, timeout, error, free
  function onFree() {
    // create and socket.emit('free') logic
    // https://github.com/nodejs/node/blob/master/lib/_http_agent.js#L311
    // no req on the socket, it should be the new socket
    if (!socket._httpMessage && socket[SOCKET_REQUEST_COUNT] === 1) return;

    socket[SOCKET_REQUEST_FINISHED_COUNT]++;
    agent.requestCount++;
    debug('%s(requests: %s, finished: %s) free',
      socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT]);

    // should reuse on pedding requests?
    const name = agent.getName(options);
    if (socket.writable && agent.requests[name] && agent.requests[name].length) {
      // will be reuse on agent free listener
      socket[SOCKET_REQUEST_COUNT]++;
      debug('%s(requests: %s, finished: %s) will be reuse on agent free event',
        socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT]);
    }
  }
  socket.on('free', onFree);

  function onClose(isError) {
    debug('%s(requests: %s, finished: %s) close, isError: %s',
      socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT], isError);
    agent.closeSocketCount++;
  }
  socket.on('close', onClose);

  // start socket timeout handler
  function onTimeout() {
    // onTimeout and emitRequestTimeout(_http_client.js)
    // https://github.com/nodejs/node/blob/v12.x/lib/_http_client.js#L711
    const listenerCount = socket.listeners('timeout').length;
    // node <= 10, default listenerCount is 1, onTimeout
    // 11 < node <= 12, default listenerCount is 2, onTimeout and emitRequestTimeout
    // node >= 13, default listenerCount is 3, onTimeout,
    //   onTimeout(https://github.com/nodejs/node/pull/32000/files#diff-5f7fb0850412c6be189faeddea6c5359R333)
    //   and emitRequestTimeout
    const timeout = getSocketTimeout(socket);
    const req = socket._httpMessage;
    const reqTimeoutListenerCount = req && req.listeners('timeout').length || 0;
    debug('%s(requests: %s, finished: %s) timeout after %sms, listeners %s, defaultTimeoutListenerCount %s, hasHttpRequest %s, HttpRequest timeoutListenerCount %s',
      socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT],
      timeout, listenerCount, defaultTimeoutListenerCount, !!req, reqTimeoutListenerCount);
    if (debug.enabled) {
      debug('timeout listeners: %s', socket.listeners('timeout').map(f => f.name).join(', '));
    }
    agent.timeoutSocketCount++;
    const name = agent.getName(options);
    if (agent.freeSockets[name] && agent.freeSockets[name].indexOf(socket) !== -1) {
      // free socket timeout, destroy quietly
      socket.destroy();
      // Remove it from freeSockets list immediately to prevent new requests
      // from being sent through this socket.
      agent.removeSocket(socket, options);
      debug('%s is free, destroy quietly', socket[SOCKET_NAME]);
    } else {
      // if there is no any request socket timeout handler,
      // agent need to handle socket timeout itself.
      //
      // custom request socket timeout handle logic must follow these rules:
      //  1. Destroy socket first
      //  2. Must emit socket 'agentRemove' event tell agent remove socket
      //     from freeSockets list immediately.
      //     Otherise you may be get 'socket hang up' error when reuse
      //     free socket and timeout happen in the same time.
      if (reqTimeoutListenerCount === 0) {
        const error = new Error('Socket timeout');
        error.code = 'ERR_SOCKET_TIMEOUT';
        error.timeout = timeout;
        // must manually call socket.end() or socket.destroy() to end the connection.
        // https://nodejs.org/dist/latest-v10.x/docs/api/net.html#net_socket_settimeout_timeout_callback
        socket.destroy(error);
        agent.removeSocket(socket, options);
        debug('%s destroy with timeout error', socket[SOCKET_NAME]);
      }
    }
  }
  socket.on('timeout', onTimeout);

  function onError(err) {
    const listenerCount = socket.listeners('error').length;
    debug('%s(requests: %s, finished: %s) error: %s, listenerCount: %s',
      socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT],
      err, listenerCount);
    agent.errorSocketCount++;
    if (listenerCount === 1) {
      // if socket don't contain error event handler, don't catch it, emit it again
      debug('%s emit uncaught error event', socket[SOCKET_NAME]);
      socket.removeListener('error', onError);
      socket.emit('error', err);
    }
  }
  socket.on('error', onError);

  function onRemove() {
    debug('%s(requests: %s, finished: %s) agentRemove',
      socket[SOCKET_NAME],
      socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT]);
    // We need this function for cases like HTTP 'upgrade'
    // (defined by WebSockets) where we need to remove a socket from the
    // pool because it'll be locked up indefinitely
    socket.removeListener('close', onClose);
    socket.removeListener('error', onError);
    socket.removeListener('free', onFree);
    socket.removeListener('timeout', onTimeout);
    socket.removeListener('agentRemove', onRemove);
  }
  socket.on('agentRemove', onRemove);
}

module.exports = Agent;

function inspect(obj) {
  const res = {};
  for (const key in obj) {
    res[key] = obj[key].length;
  }
  return res;
}
'use strict';

module.exports = {
  // agent
  CURRENT_ID: Symbol('agentkeepalive#currentId'),
  CREATE_ID: Symbol('agentkeepalive#createId'),
  INIT_SOCKET: Symbol('agentkeepalive#initSocket'),
  CREATE_HTTPS_CONNECTION: Symbol('agentkeepalive#createHttpsConnection'),
  // socket
  SOCKET_CREATED_TIME: Symbol('agentkeepalive#socketCreatedTime'),
  SOCKET_NAME: Symbol('agentkeepalive#socketName'),
  SOCKET_REQUEST_COUNT: Symbol('agentkeepalive#socketRequestCount'),
  SOCKET_REQUEST_FINISHED_COUNT: Symbol('agentkeepalive#socketRequestFinishedCount'),
};
'use strict';

const OriginalHttpsAgent = require('https').Agent;
const HttpAgent = require('./agent');
const {
  INIT_SOCKET,
  CREATE_HTTPS_CONNECTION,
} = require('./constants');

class HttpsAgent extends HttpAgent {
  constructor(options) {
    super(options);

    this.defaultPort = 443;
    this.protocol = 'https:';
    this.maxCachedSessions = this.options.maxCachedSessions;
    /* istanbul ignore next */
    if (this.maxCachedSessions === undefined) {
      this.maxCachedSessions = 100;
    }

    this._sessionCache = {
      map: {},
      list: [],
    };
  }

  createConnection(options) {
    const socket = this[CREATE_HTTPS_CONNECTION](options);
    this[INIT_SOCKET](socket, options);
    return socket;
  }
}

// https://github.com/nodejs/node/blob/master/lib/https.js#L89
HttpsAgent.prototype[CREATE_HTTPS_CONNECTION] = OriginalHttpsAgent.prototype.createConnection;

[
  'getName',
  '_getSession',
  '_cacheSession',
  // https://github.com/nodejs/node/pull/4982
  '_evictSession',
].forEach(function(method) {
  /* istanbul ignore next */
  if (typeof OriginalHttpsAgent.prototype[method] === 'function') {
    HttpsAgent.prototype[method] = OriginalHttpsAgent.prototype[method];
  }
});

module.exports = HttpsAgent;
'use strict';
const indentString = require('indent-string');
const cleanStack = require('clean-stack');

const cleanInternalStack = stack => stack.replace(/\s+at .*aggregate-error\/index.js:\d+:\d+\)?/g, '');

class AggregateError extends Error {
	constructor(errors) {
		if (!Array.isArray(errors)) {
			throw new TypeError(`Expected input to be an Array, got ${typeof errors}`);
		}

		errors = [...errors].map(error => {
			if (error instanceof Error) {
				return error;
			}

			if (error !== null && typeof error === 'object') {
				// Handle plain error objects with message property and/or possibly other metadata
				return Object.assign(new Error(error.message), error);
			}

			return new Error(error);
		});

		let message = errors
			.map(error => {
				// The `stack` property is not standardized, so we can't assume it exists
				return typeof error.stack === 'string' ? cleanInternalStack(cleanStack(error.stack)) : String(error);
			})
			.join('\n');
		message = '\n' + indentString(message, 4);
		super(message);

		this.name = 'AggregateError';

		Object.defineProperty(this, '_errors', {value: errors});
	}

	* [Symbol.iterator]() {
		for (const error of this._errors) {
			yield error;
		}
	}
}

module.exports = AggregateError;
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": "aggregate-error",
  "version": "3.1.0",
  "description": "Create an error from multiple errors",
  "license": "MIT",
  "repository": "sindresorhus/aggregate-error",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "engines": {
    "node": ">=8"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "dependencies": {
    "clean-stack": "^2.0.0",
    "indent-string": "^4.0.0"
  },
  "devDependencies": {
    "ava": "^2.4.0",
    "tsd": "^0.7.1",
    "xo": "^0.25.3"
  }
}'use strict';

module.exports = ({onlyFirst = false} = {}) => {
	const pattern = [
		'[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)',
		'(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))'
	].join('|');

	return new RegExp(pattern, onlyFirst ? undefined : 'g');
};
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": "ansi-regex",
  "version": "5.0.1",
  "description": "Regular expression for matching ANSI escape codes",
  "license": "MIT",
  "repository": "chalk/ansi-regex",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "engines": {
    "node": ">=8"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "devDependencies": {
    "ava": "^2.4.0",
    "tsd": "^0.9.0",
    "xo": "^0.25.3"
  }
}Copyright (c) 2015, Rebecca Turner <me@re-becca.org>

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.

'use strict'
module.exports = validate

function isArguments (thingy) {
  return thingy != null && typeof thingy === 'object' && thingy.hasOwnProperty('callee')
}

const types = {
  '*': {label: 'any', check: () => true},
  A: {label: 'array', check: _ => Array.isArray(_) || isArguments(_)},
  S: {label: 'string', check: _ => typeof _ === 'string'},
  N: {label: 'number', check: _ => typeof _ === 'number'},
  F: {label: 'function', check: _ => typeof _ === 'function'},
  O: {label: 'object', check: _ => typeof _ === 'object' && _ != null && !types.A.check(_) && !types.E.check(_)},
  B: {label: 'boolean', check: _ => typeof _ === 'boolean'},
  E: {label: 'error', check: _ => _ instanceof Error},
  Z: {label: 'null', check: _ => _ == null}
}

function addSchema (schema, arity) {
  const group = arity[schema.length] = arity[schema.length] || []
  if (group.indexOf(schema) === -1) group.push(schema)
}

function validate (rawSchemas, args) {
  if (arguments.length !== 2) throw wrongNumberOfArgs(['SA'], arguments.length)
  if (!rawSchemas) throw missingRequiredArg(0, 'rawSchemas')
  if (!args) throw missingRequiredArg(1, 'args')
  if (!types.S.check(rawSchemas)) throw invalidType(0, ['string'], rawSchemas)
  if (!types.A.check(args)) throw invalidType(1, ['array'], args)
  const schemas = rawSchemas.split('|')
  const arity = {}

  schemas.forEach(schema => {
    for (let ii = 0; ii < schema.length; ++ii) {
      const type = schema[ii]
      if (!types[type]) throw unknownType(ii, type)
    }
    if (/E.*E/.test(schema)) throw moreThanOneError(schema)
    addSchema(schema, arity)
    if (/E/.test(schema)) {
      addSchema(schema.replace(/E.*$/, 'E'), arity)
      addSchema(schema.replace(/E/, 'Z'), arity)
      if (schema.length === 1) addSchema('', arity)
    }
  })
  let matching = arity[args.length]
  if (!matching) {
    throw wrongNumberOfArgs(Object.keys(arity), args.length)
  }
  for (let ii = 0; ii < args.length; ++ii) {
    let newMatching = matching.filter(schema => {
      const type = schema[ii]
      const typeCheck = types[type].check
      return typeCheck(args[ii])
    })
    if (!newMatching.length) {
      const labels = matching.map(_ => types[_[ii]].label).filter(_ => _ != null)
      throw invalidType(ii, labels, args[ii])
    }
    matching = newMatching
  }
}

function missingRequiredArg (num) {
  return newException('EMISSINGARG', 'Missing required argument #' + (num + 1))
}

function unknownType (num, type) {
  return newException('EUNKNOWNTYPE', 'Unknown type ' + type + ' in argument #' + (num + 1))
}

function invalidType (num, expectedTypes, value) {
  let valueType
  Object.keys(types).forEach(typeCode => {
    if (types[typeCode].check(value)) valueType = types[typeCode].label
  })
  return newException('EINVALIDTYPE', 'Argument #' + (num + 1) + ': Expected ' +
    englishList(expectedTypes) + ' but got ' + valueType)
}

function englishList (list) {
  return list.join(', ').replace(/, ([^,]+)$/, ' or $1')
}

function wrongNumberOfArgs (expected, got) {
  const english = englishList(expected)
  const args = expected.every(ex => ex.length === 1)
    ? 'argument'
    : 'arguments'
  return newException('EWRONGARGCOUNT', 'Expected ' + english + ' ' + args + ' but got ' + got)
}

function moreThanOneError (schema) {
  return newException('ETOOMANYERRORTYPES',
    'Only one error type per argument signature is allowed, more than one found in "' + schema + '"')
}

function newException (code, msg) {
  const err = new Error(msg)
  err.code = code
  /* istanbul ignore else */
  if (Error.captureStackTrace) Error.captureStackTrace(err, validate)
  return err
}
{
  "name": "aproba",
  "version": "2.0.0",
  "description": "A ridiculously light-weight argument validator (now browser friendly)",
  "main": "index.js",
  "directories": {
    "test": "test"
  },
  "dependencies": {},
  "devDependencies": {
    "standard": "^11.0.1",
    "tap": "^12.0.1"
  },
  "files": [
    "index.js"
  ],
  "repository": {
    "type": "git",
    "url": "https://github.com/iarna/aproba"
  },
  "author": "Rebecca Turner <me@re-becca.org>",
  "license": "ISC",
  "homepage": "https://github.com/iarna/aproba"
}ISC License

Copyright npm, Inc.

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 NPM DISCLAIMS ALL
WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
EVENT SHALL NPM 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.
{
  "name": "are-we-there-yet",
  "version": "3.0.1",
  "description": "Keep track of the overall completion of many disparate processes",
  "main": "lib/index.js",
  "repository": {
    "type": "git",
    "url": "https://github.com/npm/are-we-there-yet.git"
  },
  "author": "GitHub Inc.",
  "license": "ISC",
  "homepage": "https://github.com/npm/are-we-there-yet",
  "devDependencies": {
    "@npmcli/eslint-config": "^3.0.1",
    "@npmcli/template-oss": "3.5.0",
    "tap": "^16.0.1"
  },
  "dependencies": {
    "delegates": "^1.0.0",
    "readable-stream": "^3.6.0"
  },
  "files": [
    "bin/",
    "lib/"
  ],
  "engines": {
    "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
  },
  "tap": {
    "branches": 68,
    "statements": 92,
    "functions": 86,
    "lines": 92
  },
  "templateOSS": {
    "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    "version": "3.5.0"
  }
}'use strict'
exports.TrackerGroup = require('./tracker-group.js')
exports.Tracker = require('./tracker.js')
exports.TrackerStream = require('./tracker-stream.js')
'use strict'
var EventEmitter = require('events').EventEmitter
var util = require('util')

var trackerId = 0
var TrackerBase = module.exports = function (name) {
  EventEmitter.call(this)
  this.id = ++trackerId
  this.name = name
}
util.inherits(TrackerBase, EventEmitter)
'use strict'
var util = require('util')
var TrackerBase = require('./tracker-base.js')
var Tracker = require('./tracker.js')
var TrackerStream = require('./tracker-stream.js')

var TrackerGroup = module.exports = function (name) {
  TrackerBase.call(this, name)
  this.parentGroup = null
  this.trackers = []
  this.completion = {}
  this.weight = {}
  this.totalWeight = 0
  this.finished = false
  this.bubbleChange = bubbleChange(this)
}
util.inherits(TrackerGroup, TrackerBase)

function bubbleChange (trackerGroup) {
  return function (name, completed, tracker) {
    trackerGroup.completion[tracker.id] = completed
    if (trackerGroup.finished) {
      return
    }
    trackerGroup.emit('change', name || trackerGroup.name, trackerGroup.completed(), trackerGroup)
  }
}

TrackerGroup.prototype.nameInTree = function () {
  var names = []
  var from = this
  while (from) {
    names.unshift(from.name)
    from = from.parentGroup
  }
  return names.join('/')
}

TrackerGroup.prototype.addUnit = function (unit, weight) {
  if (unit.addUnit) {
    var toTest = this
    while (toTest) {
      if (unit === toTest) {
        throw new Error(
          'Attempted to add tracker group ' +
          unit.name + ' to tree that already includes it ' +
          this.nameInTree(this))
      }
      toTest = toTest.parentGroup
    }
    unit.parentGroup = this
  }
  this.weight[unit.id] = weight || 1
  this.totalWeight += this.weight[unit.id]
  this.trackers.push(unit)
  this.completion[unit.id] = unit.completed()
  unit.on('change', this.bubbleChange)
  if (!this.finished) {
    this.emit('change', unit.name, this.completion[unit.id], unit)
  }
  return unit
}

TrackerGroup.prototype.completed = function () {
  if (this.trackers.length === 0) {
    return 0
  }
  var valPerWeight = 1 / this.totalWeight
  var completed = 0
  for (var ii = 0; ii < this.trackers.length; ii++) {
    var trackerId = this.trackers[ii].id
    completed +=
      valPerWeight * this.weight[trackerId] * this.completion[trackerId]
  }
  return completed
}

TrackerGroup.prototype.newGroup = function (name, weight) {
  return this.addUnit(new TrackerGroup(name), weight)
}

TrackerGroup.prototype.newItem = function (name, todo, weight) {
  return this.addUnit(new Tracker(name, todo), weight)
}

TrackerGroup.prototype.newStream = function (name, todo, weight) {
  return this.addUnit(new TrackerStream(name, todo), weight)
}

TrackerGroup.prototype.finish = function () {
  this.finished = true
  if (!this.trackers.length) {
    this.addUnit(new Tracker(), 1, true)
  }
  for (var ii = 0; ii < this.trackers.length; ii++) {
    var tracker = this.trackers[ii]
    tracker.finish()
    tracker.removeListener('change', this.bubbleChange)
  }
  this.emit('change', this.name, 1, this)
}

var buffer = '                                  '
TrackerGroup.prototype.debug = function (depth) {
  depth = depth || 0
  var indent = depth ? buffer.slice(0, depth) : ''
  var output = indent + (this.name || 'top') + ': ' + this.completed() + '\n'
  this.trackers.forEach(function (tracker) {
    if (tracker instanceof TrackerGroup) {
      output += tracker.debug(depth + 1)
    } else {
      output += indent + ' ' + tracker.name + ': ' + tracker.completed() + '\n'
    }
  })
  return output
}
'use strict'
var util = require('util')
var stream = require('readable-stream')
var delegate = require('delegates')
var Tracker = require('./tracker.js')

var TrackerStream = module.exports = function (name, size, options) {
  stream.Transform.call(this, options)
  this.tracker = new Tracker(name, size)
  this.name = name
  this.id = this.tracker.id
  this.tracker.on('change', delegateChange(this))
}
util.inherits(TrackerStream, stream.Transform)

function delegateChange (trackerStream) {
  return function (name, completion, tracker) {
    trackerStream.emit('change', name, completion, trackerStream)
  }
}

TrackerStream.prototype._transform = function (data, encoding, cb) {
  this.tracker.completeWork(data.length ? data.length : 1)
  this.push(data)
  cb()
}

TrackerStream.prototype._flush = function (cb) {
  this.tracker.finish()
  cb()
}

delegate(TrackerStream.prototype, 'tracker')
  .method('completed')
  .method('addWork')
  .method('finish')
'use strict'
var util = require('util')
var TrackerBase = require('./tracker-base.js')

var Tracker = module.exports = function (name, todo) {
  TrackerBase.call(this, name)
  this.workDone = 0
  this.workTodo = todo || 0
}
util.inherits(Tracker, TrackerBase)

Tracker.prototype.completed = function () {
  return this.workTodo === 0 ? 0 : this.workDone / this.workTodo
}

Tracker.prototype.addWork = function (work) {
  this.workTodo += work
  this.emit('change', this.name, this.completed(), this)
}

Tracker.prototype.completeWork = function (work) {
  this.workDone += work
  if (this.workDone > this.workTodo) {
    this.workDone = this.workTodo
  }
  this.emit('change', this.name, this.completed(), this)
}

Tracker.prototype.finish = function () {
  this.workTodo = this.workDone = 1
  this.emit('change', this.name, 1, this)
}
(The MIT License)

Copyright (C) 2012 by Vitaly Puzrin

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';

module.exports = require('./lib/argparse');
{
  "name": "argparse",
  "description": "Very powerful CLI arguments parser. Native port of argparse - python's options parsing library",
  "version": "1.0.10",
  "files": [
    "index.js",
    "lib/"
  ],
  "license": "MIT",
  "repository": "nodeca/argparse",
  "dependencies": {
    "sprintf-js": "~1.0.2"
  },
  "devDependencies": {
    "eslint": "^2.13.1",
    "istanbul": "^0.4.5",
    "mocha": "^3.1.0",
    "ndoc": "^5.0.1"
  }
}/**
 * class Action
 *
 * Base class for all actions
 * Do not call in your code, use this class only for inherits your own action
 *
 * Information about how to convert command line strings to Javascript objects.
 * Action objects are used by an ArgumentParser to represent the information
 * needed to parse a single argument from one or more strings from the command
 * line. The keyword arguments to the Action constructor are also all attributes
 * of Action instances.
 *
 * ##### Allowed keywords:
 *
 * - `store`
 * - `storeConstant`
 * - `storeTrue`
 * - `storeFalse`
 * - `append`
 * - `appendConstant`
 * - `count`
 * - `help`
 * - `version`
 *
 * Information about action options see [[Action.new]]
 *
 * See also [original guide](http://docs.python.org/dev/library/argparse.html#action)
 *
 **/

'use strict';


// Constants
var c = require('./const');


/**
 * new Action(options)
 *
 * Base class for all actions. Used only for inherits
 *
 *
 * ##### Options:
 *
 * - `optionStrings`  A list of command-line option strings for the action.
 * - `dest`  Attribute to hold the created object(s)
 * - `nargs`  The number of command-line arguments that should be consumed.
 * By default, one argument will be consumed and a single value will be
 * produced.
 * - `constant`  Default value for an action with no value.
 * - `defaultValue`  The value to be produced if the option is not specified.
 * - `type`  Cast to 'string'|'int'|'float'|'complex'|function (string). If
 * None, 'string'.
 * - `choices`  The choices available.
 * - `required`  True if the action must always be specified at the command
 * line.
 * - `help`  The help describing the argument.
 * - `metavar`  The name to be used for the option's argument with the help
 * string. If None, the 'dest' value will be used as the name.
 *
 * ##### nargs supported values:
 *
 * - `N` (an integer) consumes N arguments (and produces a list)
 * - `?`  consumes zero or one arguments
 * - `*` consumes zero or more arguments (and produces a list)
 * - `+` consumes one or more arguments (and produces a list)
 *
 * Note: that the difference between the default and nargs=1 is that with the
 * default, a single value will be produced, while with nargs=1, a list
 * containing a single value will be produced.
 **/
var Action = module.exports = function Action(options) {
  options = options || {};
  this.optionStrings = options.optionStrings || [];
  this.dest = options.dest;
  this.nargs = typeof options.nargs !== 'undefined' ? options.nargs : null;
  this.constant = typeof options.constant !== 'undefined' ? options.constant : null;
  this.defaultValue = options.defaultValue;
  this.type = typeof options.type !== 'undefined' ? options.type : null;
  this.choices = typeof options.choices !== 'undefined' ? options.choices : null;
  this.required = typeof options.required !== 'undefined' ? options.required : false;
  this.help = typeof options.help !== 'undefined' ? options.help : null;
  this.metavar = typeof options.metavar !== 'undefined' ? options.metavar : null;

  if (!(this.optionStrings instanceof Array)) {
    throw new Error('optionStrings should be an array');
  }
  if (typeof this.required !== 'undefined' && typeof this.required !== 'boolean') {
    throw new Error('required should be a boolean');
  }
};

/**
 * Action#getName -> String
 *
 * Tells action name
 **/
Action.prototype.getName = function () {
  if (this.optionStrings.length > 0) {
    return this.optionStrings.join('/');
  } else if (this.metavar !== null && this.metavar !== c.SUPPRESS) {
    return this.metavar;
  } else if (typeof this.dest !== 'undefined' && this.dest !== c.SUPPRESS) {
    return this.dest;
  }
  return null;
};

/**
 * Action#isOptional -> Boolean
 *
 * Return true if optional
 **/
Action.prototype.isOptional = function () {
  return !this.isPositional();
};

/**
 * Action#isPositional -> Boolean
 *
 * Return true if positional
 **/
Action.prototype.isPositional = function () {
  return (this.optionStrings.length === 0);
};

/**
 * Action#call(parser, namespace, values, optionString) -> Void
 * - parser (ArgumentParser): current parser
 * - namespace (Namespace): namespace for output data
 * - values (Array): parsed values
 * - optionString (Array): input option string(not parsed)
 *
 * Call the action. Should be implemented in inherited classes
 *
 * ##### Example
 *
 *      ActionCount.prototype.call = function (parser, namespace, values, optionString) {
 *        namespace.set(this.dest, (namespace[this.dest] || 0) + 1);
 *      };
 *
 **/
Action.prototype.call = function () {
  throw new Error('.call() not defined');// Not Implemented error
};
/** internal
 * class ActionContainer
 *
 * Action container. Parent for [[ArgumentParser]] and [[ArgumentGroup]]
 **/

'use strict';

var format = require('util').format;

// Constants
var c = require('./const');

var $$ = require('./utils');

//Actions
var ActionHelp = require('./action/help');
var ActionAppend = require('./action/append');
var ActionAppendConstant = require('./action/append/constant');
var ActionCount = require('./action/count');
var ActionStore = require('./action/store');
var ActionStoreConstant = require('./action/store/constant');
var ActionStoreTrue = require('./action/store/true');
var ActionStoreFalse = require('./action/store/false');
var ActionVersion = require('./action/version');
var ActionSubparsers = require('./action/subparsers');

// Errors
var argumentErrorHelper = require('./argument/error');

/**
 * new ActionContainer(options)
 *
 * Action container. Parent for [[ArgumentParser]] and [[ArgumentGroup]]
 *
 * ##### Options:
 *
 * - `description` -- A description of what the program does
 * - `prefixChars`  -- Characters that prefix optional arguments
 * - `argumentDefault`  -- The default value for all arguments
 * - `conflictHandler` -- The conflict handler to use for duplicate arguments
 **/
var ActionContainer = module.exports = function ActionContainer(options) {
  options = options || {};

  this.description = options.description;
  this.argumentDefault = options.argumentDefault;
  this.prefixChars = options.prefixChars || '';
  this.conflictHandler = options.conflictHandler;

  // set up registries
  this._registries = {};

  // register actions
  this.register('action', null, ActionStore);
  this.register('action', 'store', ActionStore);
  this.register('action', 'storeConst', ActionStoreConstant);
  this.register('action', 'storeTrue', ActionStoreTrue);
  this.register('action', 'storeFalse', ActionStoreFalse);
  this.register('action', 'append', ActionAppend);
  this.register('action', 'appendConst', ActionAppendConstant);
  this.register('action', 'count', ActionCount);
  this.register('action', 'help', ActionHelp);
  this.register('action', 'version', ActionVersion);
  this.register('action', 'parsers', ActionSubparsers);

  // raise an exception if the conflict handler is invalid
  this._getHandler();

  // action storage
  this._actions = [];
  this._optionStringActions = {};

  // groups
  this._actionGroups = [];
  this._mutuallyExclusiveGroups = [];

  // defaults storage
  this._defaults = {};

  // determines whether an "option" looks like a negative number
  // -1, -1.5 -5e+4
  this._regexpNegativeNumber = new RegExp('^[-]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?$');

  // whether or not there are any optionals that look like negative
  // numbers -- uses a list so it can be shared and edited
  this._hasNegativeNumberOptionals = [];
};

// Groups must be required, then ActionContainer already defined
var ArgumentGroup = require('./argument/group');
var MutuallyExclusiveGroup = require('./argument/exclusive');

//
// Registration methods
//

/**
 * ActionContainer#register(registryName, value, object) -> Void
 * - registryName (String) : object type action|type
 * - value (string) : keyword
 * - object (Object|Function) : handler
 *
 *  Register handlers
 **/
ActionContainer.prototype.register = function (registryName, value, object) {
  this._registries[registryName] = this._registries[registryName] || {};
  this._registries[registryName][value] = object;
};

ActionContainer.prototype._registryGet = function (registryName, value, defaultValue) {
  if (arguments.length < 3) {
    defaultValue = null;
  }
  return this._registries[registryName][value] || defaultValue;
};

//
// Namespace default accessor methods
//

/**
 * ActionContainer#setDefaults(options) -> Void
 * - options (object):hash of options see [[Action.new]]
 *
 * Set defaults
 **/
ActionContainer.prototype.setDefaults = function (options) {
  options = options || {};
  for (var property in options) {
    if ($$.has(options, property)) {
      this._defaults[property] = options[property];
    }
  }

  // if these defaults match any existing arguments, replace the previous
  // default on the object with the new one
  this._actions.forEach(function (action) {
    if ($$.has(options, action.dest)) {
      action.defaultValue = options[action.dest];
    }
  });
};

/**
 * ActionContainer#getDefault(dest) -> Mixed
 * - dest (string): action destination
 *
 * Return action default value
 **/
ActionContainer.prototype.getDefault = function (dest) {
  var result = $$.has(this._defaults, dest) ? this._defaults[dest] : null;

  this._actions.forEach(function (action) {
    if (action.dest === dest && $$.has(action, 'defaultValue')) {
      result = action.defaultValue;
    }
  });

  return result;
};
//
// Adding argument actions
//

/**
 * ActionContainer#addArgument(args, options) -> Object
 * - args (String|Array): argument key, or array of argument keys
 * - options (Object): action objects see [[Action.new]]
 *
 * #### Examples
 * - addArgument([ '-f', '--foo' ], { action: 'store', defaultValue: 1, ... })
 * - addArgument([ 'bar' ], { action: 'store', nargs: 1, ... })
 * - addArgument('--baz', { action: 'store', nargs: 1, ... })
 **/
ActionContainer.prototype.addArgument = function (args, options) {
  args = args;
  options = options || {};

  if (typeof args === 'string') {
    args = [ args ];
  }
  if (!Array.isArray(args)) {
    throw new TypeError('addArgument first argument should be a string or an array');
  }
  if (typeof options !== 'object' || Array.isArray(options)) {
    throw new TypeError('addArgument second argument should be a hash');
  }

  // if no positional args are supplied or only one is supplied and
  // it doesn't look like an option string, parse a positional argument
  if (!args || args.length === 1 && this.prefixChars.indexOf(args[0][0]) < 0) {
    if (args && !!options.dest) {
      throw new Error('dest supplied twice for positional argument');
    }
    options = this._getPositional(args, options);

    // otherwise, we're adding an optional argument
  } else {
    options = this._getOptional(args, options);
  }

  // if no default was supplied, use the parser-level default
  if (typeof options.defaultValue === 'undefined') {
    var dest = options.dest;
    if ($$.has(this._defaults, dest)) {
      options.defaultValue = this._defaults[dest];
    } else if (typeof this.argumentDefault !== 'undefined') {
      options.defaultValue = this.argumentDefault;
    }
  }

  // create the action object, and add it to the parser
  var ActionClass = this._popActionClass(options);
  if (typeof ActionClass !== 'function') {
    throw new Error(format('Unknown action "%s".', ActionClass));
  }
  var action = new ActionClass(options);

  // throw an error if the action type is not callable
  var typeFunction = this._registryGet('type', action.type, action.type);
  if (typeof typeFunction !== 'function') {
    throw new Error(format('"%s" is not callable', typeFunction));
  }

  return this._addAction(action);
};

/**
 * ActionContainer#addArgumentGroup(options) -> ArgumentGroup
 * - options (Object): hash of options see [[ArgumentGroup.new]]
 *
 * Create new arguments groups
 **/
ActionContainer.prototype.addArgumentGroup = function (options) {
  var group = new ArgumentGroup(this, options);
  this._actionGroups.push(group);
  return group;
};

/**
 * ActionContainer#addMutuallyExclusiveGroup(options) -> ArgumentGroup
 * - options (Object): {required: false}
 *
 * Create new mutual exclusive groups
 **/
ActionContainer.prototype.addMutuallyExclusiveGroup = function (options) {
  var group = new MutuallyExclusiveGroup(this, options);
  this._mutuallyExclusiveGroups.push(group);
  return group;
};

ActionContainer.prototype._addAction = function (action) {
  var self = this;

  // resolve any conflicts
  this._checkConflict(action);

  // add to actions list
  this._actions.push(action);
  action.container = this;

  // index the action by any option strings it has
  action.optionStrings.forEach(function (optionString) {
    self._optionStringActions[optionString] = action;
  });

  // set the flag if any option strings look like negative numbers
  action.optionStrings.forEach(function (optionString) {
    if (optionString.match(self._regexpNegativeNumber)) {
      if (!self._hasNegativeNumberOptionals.some(Boolean)) {
        self._hasNegativeNumberOptionals.push(true);
      }
    }
  });

  // return the created action
  return action;
};

ActionContainer.prototype._removeAction = function (action) {
  var actionIndex = this._actions.indexOf(action);
  if (actionIndex >= 0) {
    this._actions.splice(actionIndex, 1);
  }
};

ActionContainer.prototype._addContainerActions = function (container) {
  // collect groups by titles
  var titleGroupMap = {};
  this._actionGroups.forEach(function (group) {
    if (titleGroupMap[group.title]) {
      throw new Error(format('Cannot merge actions - two groups are named "%s".', group.title));
    }
    titleGroupMap[group.title] = group;
  });

  // map each action to its group
  var groupMap = {};
  function actionHash(action) {
    // unique (hopefully?) string suitable as dictionary key
    return action.getName();
  }
  container._actionGroups.forEach(function (group) {
    // if a group with the title exists, use that, otherwise
    // create a new group matching the container's group
    if (!titleGroupMap[group.title]) {
      titleGroupMap[group.title] = this.addArgumentGroup({
        title: group.title,
        description: group.description
      });
    }

    // map the actions to their new group
    group._groupActions.forEach(function (action) {
      groupMap[actionHash(action)] = titleGroupMap[group.title];
    });
  }, this);

  // add container's mutually exclusive groups
  // NOTE: if add_mutually_exclusive_group ever gains title= and
  // description= then this code will need to be expanded as above
  var mutexGroup;
  container._mutuallyExclusiveGroups.forEach(function (group) {
    mutexGroup = this.addMutuallyExclusiveGroup({
      required: group.required
    });
    // map the actions to their new mutex group
    group._groupActions.forEach(function (action) {
      groupMap[actionHash(action)] = mutexGroup;
    });
  }, this);  // forEach takes a 'this' argument

  // add all actions to this container or their group
  container._actions.forEach(function (action) {
    var key = actionHash(action);
    if (groupMap[key]) {
      groupMap[key]._addAction(action);
    } else {
      this._addAction(action);
    }
  });
};

ActionContainer.prototype._getPositional = function (dest, options) {
  if (Array.isArray(dest)) {
    dest = dest[0];
  }
  // make sure required is not specified
  if (options.required) {
    throw new Error('"required" is an invalid argument for positionals.');
  }

  // mark positional arguments as required if at least one is
  // always required
  if (options.nargs !== c.OPTIONAL && options.nargs !== c.ZERO_OR_MORE) {
    options.required = true;
  }
  if (options.nargs === c.ZERO_OR_MORE && typeof options.defaultValue === 'undefined') {
    options.required = true;
  }

  // return the keyword arguments with no option strings
  options.dest = dest;
  options.optionStrings = [];
  return options;
};

ActionContainer.prototype._getOptional = function (args, options) {
  var prefixChars = this.prefixChars;
  var optionStrings = [];
  var optionStringsLong = [];

  // determine short and long option strings
  args.forEach(function (optionString) {
    // error on strings that don't start with an appropriate prefix
    if (prefixChars.indexOf(optionString[0]) < 0) {
      throw new Error(format('Invalid option string "%s": must start with a "%s".',
        optionString,
        prefixChars
      ));
    }

    // strings starting with two prefix characters are long options
    optionStrings.push(optionString);
    if (optionString.length > 1 && prefixChars.indexOf(optionString[1]) >= 0) {
      optionStringsLong.push(optionString);
    }
  });

  // infer dest, '--foo-bar' -> 'foo_bar' and '-x' -> 'x'
  var dest = options.dest || null;
  delete options.dest;

  if (!dest) {
    var optionStringDest = optionStringsLong.length ? optionStringsLong[0] : optionStrings[0];
    dest = $$.trimChars(optionStringDest, this.prefixChars);

    if (dest.length === 0) {
      throw new Error(
        format('dest= is required for options like "%s"', optionStrings.join(', '))
      );
    }
    dest = dest.replace(/-/g, '_');
  }

  // return the updated keyword arguments
  options.dest = dest;
  options.optionStrings = optionStrings;

  return options;
};

ActionContainer.prototype._popActionClass = function (options, defaultValue) {
  defaultValue = defaultValue || null;

  var action = (options.action || defaultValue);
  delete options.action;

  var actionClass = this._registryGet('action', action, action);
  return actionClass;
};

ActionContainer.prototype._getHandler = function () {
  var handlerString = this.conflictHandler;
  var handlerFuncName = '_handleConflict' + $$.capitalize(handlerString);
  var func = this[handlerFuncName];
  if (typeof func === 'undefined') {
    var msg = 'invalid conflict resolution value: ' + handlerString;
    throw new Error(msg);
  } else {
    return func;
  }
};

ActionContainer.prototype._checkConflict = function (action) {
  var optionStringActions = this._optionStringActions;
  var conflictOptionals = [];

  // find all options that conflict with this option
  // collect pairs, the string, and an existing action that it conflicts with
  action.optionStrings.forEach(function (optionString) {
    var conflOptional = optionStringActions[optionString];
    if (typeof conflOptional !== 'undefined') {
      conflictOptionals.push([ optionString, conflOptional ]);
    }
  });

  if (conflictOptionals.length > 0) {
    var conflictHandler = this._getHandler();
    conflictHandler.call(this, action, conflictOptionals);
  }
};

ActionContainer.prototype._handleConflictError = function (action, conflOptionals) {
  var conflicts = conflOptionals.map(function (pair) { return pair[0]; });
  conflicts = conflicts.join(', ');
  throw argumentErrorHelper(
    action,
    format('Conflicting option string(s): %s', conflicts)
  );
};

ActionContainer.prototype._handleConflictResolve = function (action, conflOptionals) {
  // remove all conflicting options
  var self = this;
  conflOptionals.forEach(function (pair) {
    var optionString = pair[0];
    var conflictingAction = pair[1];
    // remove the conflicting option string
    var i = conflictingAction.optionStrings.indexOf(optionString);
    if (i >= 0) {
      conflictingAction.optionStrings.splice(i, 1);
    }
    delete self._optionStringActions[optionString];
    // if the option now has no option string, remove it from the
    // container holding it
    if (conflictingAction.optionStrings.length === 0) {
      conflictingAction.container._removeAction(conflictingAction);
    }
  });
};
'use strict';

module.exports.ArgumentParser = require('./argument_parser.js');
module.exports.Namespace = require('./namespace');
module.exports.Action = require('./action');
module.exports.HelpFormatter = require('./help/formatter.js');
module.exports.Const = require('./const.js');

module.exports.ArgumentDefaultsHelpFormatter =
  require('./help/added_formatters.js').ArgumentDefaultsHelpFormatter;
module.exports.RawDescriptionHelpFormatter =
  require('./help/added_formatters.js').RawDescriptionHelpFormatter;
module.exports.RawTextHelpFormatter =
  require('./help/added_formatters.js').RawTextHelpFormatter;
/**
 * class ArgumentParser
 *
 * Object for parsing command line strings into js objects.
 *
 * Inherited from [[ActionContainer]]
 **/
'use strict';

var util    = require('util');
var format  = require('util').format;
var Path    = require('path');
var sprintf = require('sprintf-js').sprintf;

// Constants
var c = require('./const');

var $$ = require('./utils');

var ActionContainer = require('./action_container');

// Errors
var argumentErrorHelper = require('./argument/error');

var HelpFormatter = require('./help/formatter');

var Namespace = require('./namespace');


/**
 * new ArgumentParser(options)
 *
 * Create a new ArgumentParser object.
 *
 * ##### Options:
 * - `prog`  The name of the program (default: Path.basename(process.argv[1]))
 * - `usage`  A usage message (default: auto-generated from arguments)
 * - `description`  A description of what the program does
 * - `epilog`  Text following the argument descriptions
 * - `parents`  Parsers whose arguments should be copied into this one
 * - `formatterClass`  HelpFormatter class for printing help messages
 * - `prefixChars`  Characters that prefix optional arguments
 * - `fromfilePrefixChars` Characters that prefix files containing additional arguments
 * - `argumentDefault`  The default value for all arguments
 * - `addHelp`  Add a -h/-help option
 * - `conflictHandler`  Specifies how to handle conflicting argument names
 * - `debug`  Enable debug mode. Argument errors throw exception in
 *   debug mode and process.exit in normal. Used for development and
 *   testing (default: false)
 *
 * See also [original guide][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#argumentparser-objects
 **/
function ArgumentParser(options) {
  if (!(this instanceof ArgumentParser)) {
    return new ArgumentParser(options);
  }
  var self = this;
  options = options || {};

  options.description = (options.description || null);
  options.argumentDefault = (options.argumentDefault || null);
  options.prefixChars = (options.prefixChars || '-');
  options.conflictHandler = (options.conflictHandler || 'error');
  ActionContainer.call(this, options);

  options.addHelp = typeof options.addHelp === 'undefined' || !!options.addHelp;
  options.parents = options.parents || [];
  // default program name
  options.prog = (options.prog || Path.basename(process.argv[1]));
  this.prog = options.prog;
  this.usage = options.usage;
  this.epilog = options.epilog;
  this.version = options.version;

  this.debug = (options.debug === true);

  this.formatterClass = (options.formatterClass || HelpFormatter);
  this.fromfilePrefixChars = options.fromfilePrefixChars || null;
  this._positionals = this.addArgumentGroup({ title: 'Positional arguments' });
  this._optionals = this.addArgumentGroup({ title: 'Optional arguments' });
  this._subparsers = null;

  // register types
  function FUNCTION_IDENTITY(o) {
    return o;
  }
  this.register('type', 'auto', FUNCTION_IDENTITY);
  this.register('type', null, FUNCTION_IDENTITY);
  this.register('type', 'int', function (x) {
    var result = parseInt(x, 10);
    if (isNaN(result)) {
      throw new Error(x + ' is not a valid integer.');
    }
    return result;
  });
  this.register('type', 'float', function (x) {
    var result = parseFloat(x);
    if (isNaN(result)) {
      throw new Error(x + ' is not a valid float.');
    }
    return result;
  });
  this.register('type', 'string', function (x) {
    return '' + x;
  });

  // add help and version arguments if necessary
  var defaultPrefix = (this.prefixChars.indexOf('-') > -1) ? '-' : this.prefixChars[0];
  if (options.addHelp) {
    this.addArgument(
      [ defaultPrefix + 'h', defaultPrefix + defaultPrefix + 'help' ],
      {
        action: 'help',
        defaultValue: c.SUPPRESS,
        help: 'Show this help message and exit.'
      }
    );
  }
  if (typeof this.version !== 'undefined') {
    this.addArgument(
      [ defaultPrefix + 'v', defaultPrefix + defaultPrefix + 'version' ],
      {
        action: 'version',
        version: this.version,
        defaultValue: c.SUPPRESS,
        help: "Show program's version number and exit."
      }
    );
  }

  // add parent arguments and defaults
  options.parents.forEach(function (parent) {
    self._addContainerActions(parent);
    if (typeof parent._defaults !== 'undefined') {
      for (var defaultKey in parent._defaults) {
        if (parent._defaults.hasOwnProperty(defaultKey)) {
          self._defaults[defaultKey] = parent._defaults[defaultKey];
        }
      }
    }
  });
}

util.inherits(ArgumentParser, ActionContainer);

/**
 * ArgumentParser#addSubparsers(options) -> [[ActionSubparsers]]
 * - options (object): hash of options see [[ActionSubparsers.new]]
 *
 * See also [subcommands][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#sub-commands
 **/
ArgumentParser.prototype.addSubparsers = function (options) {
  if (this._subparsers) {
    this.error('Cannot have multiple subparser arguments.');
  }

  options = options || {};
  options.debug = (this.debug === true);
  options.optionStrings = [];
  options.parserClass = (options.parserClass || ArgumentParser);


  if (!!options.title || !!options.description) {

    this._subparsers = this.addArgumentGroup({
      title: (options.title || 'subcommands'),
      description: options.description
    });
    delete options.title;
    delete options.description;

  } else {
    this._subparsers = this._positionals;
  }

  // prog defaults to the usage message of this parser, skipping
  // optional arguments and with no "usage:" prefix
  if (!options.prog) {
    var formatter = this._getFormatter();
    var positionals = this._getPositionalActions();
    var groups = this._mutuallyExclusiveGroups;
    formatter.addUsage(this.usage, positionals, groups, '');
    options.prog = formatter.formatHelp().trim();
  }

  // create the parsers action and add it to the positionals list
  var ParsersClass = this._popActionClass(options, 'parsers');
  var action = new ParsersClass(options);
  this._subparsers._addAction(action);

  // return the created parsers action
  return action;
};

ArgumentParser.prototype._addAction = function (action) {
  if (action.isOptional()) {
    this._optionals._addAction(action);
  } else {
    this._positionals._addAction(action);
  }
  return action;
};

ArgumentParser.prototype._getOptionalActions = function () {
  return this._actions.filter(function (action) {
    return action.isOptional();
  });
};

ArgumentParser.prototype._getPositionalActions = function () {
  return this._actions.filter(function (action) {
    return action.isPositional();
  });
};


/**
 * ArgumentParser#parseArgs(args, namespace) -> Namespace|Object
 * - args (array): input elements
 * - namespace (Namespace|Object): result object
 *
 * Parsed args and throws error if some arguments are not recognized
 *
 * See also [original guide][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#the-parse-args-method
 **/
ArgumentParser.prototype.parseArgs = function (args, namespace) {
  var argv;
  var result = this.parseKnownArgs(args, namespace);

  args = result[0];
  argv = result[1];
  if (argv && argv.length > 0) {
    this.error(
      format('Unrecognized arguments: %s.', argv.join(' '))
    );
  }
  return args;
};

/**
 * ArgumentParser#parseKnownArgs(args, namespace) -> array
 * - args (array): input options
 * - namespace (Namespace|Object): result object
 *
 * Parse known arguments and return tuple of result object
 * and unknown args
 *
 * See also [original guide][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#partial-parsing
 **/
ArgumentParser.prototype.parseKnownArgs = function (args, namespace) {
  var self = this;

  // args default to the system args
  args = args || process.argv.slice(2);

  // default Namespace built from parser defaults
  namespace = namespace || new Namespace();

  self._actions.forEach(function (action) {
    if (action.dest !== c.SUPPRESS) {
      if (!$$.has(namespace, action.dest)) {
        if (action.defaultValue !== c.SUPPRESS) {
          var defaultValue = action.defaultValue;
          if (typeof action.defaultValue === 'string') {
            defaultValue = self._getValue(action, defaultValue);
          }
          namespace[action.dest] = defaultValue;
        }
      }
    }
  });

  Object.keys(self._defaults).forEach(function (dest) {
    namespace[dest] = self._defaults[dest];
  });

  // parse the arguments and exit if there are any errors
  try {
    var res = this._parseKnownArgs(args, namespace);

    namespace = res[0];
    args = res[1];
    if ($$.has(namespace, c._UNRECOGNIZED_ARGS_ATTR)) {
      args = $$.arrayUnion(args, namespace[c._UNRECOGNIZED_ARGS_ATTR]);
      delete namespace[c._UNRECOGNIZED_ARGS_ATTR];
    }
    return [ namespace, args ];
  } catch (e) {
    this.error(e);
  }
};

ArgumentParser.prototype._parseKnownArgs = function (argStrings, namespace) {
  var self = this;

  var extras = [];

  // replace arg strings that are file references
  if (this.fromfilePrefixChars !== null) {
    argStrings = this._readArgsFromFiles(argStrings);
  }
  // map all mutually exclusive arguments to the other arguments
  // they can't occur with
  // Python has 'conflicts = action_conflicts.setdefault(mutex_action, [])'
  // though I can't conceive of a way in which an action could be a member
  // of two different mutually exclusive groups.

  function actionHash(action) {
    // some sort of hashable key for this action
    // action itself cannot be a key in actionConflicts
    // I think getName() (join of optionStrings) is unique enough
    return action.getName();
  }

  var conflicts, key;
  var actionConflicts = {};

  this._mutuallyExclusiveGroups.forEach(function (mutexGroup) {
    mutexGroup._groupActions.forEach(function (mutexAction, i, groupActions) {
      key = actionHash(mutexAction);
      if (!$$.has(actionConflicts, key)) {
        actionConflicts[key] = [];
      }
      conflicts = actionConflicts[key];
      conflicts.push.apply(conflicts, groupActions.slice(0, i));
      conflicts.push.apply(conflicts, groupActions.slice(i + 1));
    });
  });

  // find all option indices, and determine the arg_string_pattern
  // which has an 'O' if there is an option at an index,
  // an 'A' if there is an argument, or a '-' if there is a '--'
  var optionStringIndices = {};

  var argStringPatternParts = [];

  argStrings.forEach(function (argString, argStringIndex) {
    if (argString === '--') {
      argStringPatternParts.push('-');
      while (argStringIndex < argStrings.length) {
        argStringPatternParts.push('A');
        argStringIndex++;
      }
    } else {
      // otherwise, add the arg to the arg strings
      // and note the index if it was an option
      var pattern;
      var optionTuple = self._parseOptional(argString);
      if (!optionTuple) {
        pattern = 'A';
      } else {
        optionStringIndices[argStringIndex] = optionTuple;
        pattern = 'O';
      }
      argStringPatternParts.push(pattern);
    }
  });
  var argStringsPattern = argStringPatternParts.join('');

  var seenActions = [];
  var seenNonDefaultActions = [];


  function takeAction(action, argumentStrings, optionString) {
    seenActions.push(action);
    var argumentValues = self._getValues(action, argumentStrings);

    // error if this argument is not allowed with other previously
    // seen arguments, assuming that actions that use the default
    // value don't really count as "present"
    if (argumentValues !== action.defaultValue) {
      seenNonDefaultActions.push(action);
      if (actionConflicts[actionHash(action)]) {
        actionConflicts[actionHash(action)].forEach(function (actionConflict) {
          if (seenNonDefaultActions.indexOf(actionConflict) >= 0) {
            throw argumentErrorHelper(
              action,
              format('Not allowed with argument "%s".', actionConflict.getName())
            );
          }
        });
      }
    }

    if (argumentValues !== c.SUPPRESS) {
      action.call(self, namespace, argumentValues, optionString);
    }
  }

  function consumeOptional(startIndex) {
    // get the optional identified at this index
    var optionTuple = optionStringIndices[startIndex];
    var action = optionTuple[0];
    var optionString = optionTuple[1];
    var explicitArg = optionTuple[2];

    // identify additional optionals in the same arg string
    // (e.g. -xyz is the same as -x -y -z if no args are required)
    var actionTuples = [];

    var args, argCount, start, stop;

    for (;;) {
      if (!action) {
        extras.push(argStrings[startIndex]);
        return startIndex + 1;
      }
      if (explicitArg) {
        argCount = self._matchArgument(action, 'A');

        // if the action is a single-dash option and takes no
        // arguments, try to parse more single-dash options out
        // of the tail of the option string
        var chars = self.prefixChars;
        if (argCount === 0 && chars.indexOf(optionString[1]) < 0) {
          actionTuples.push([ action, [], optionString ]);
          optionString = optionString[0] + explicitArg[0];
          var newExplicitArg = explicitArg.slice(1) || null;
          var optionalsMap = self._optionStringActions;

          if (Object.keys(optionalsMap).indexOf(optionString) >= 0) {
            action = optionalsMap[optionString];
            explicitArg = newExplicitArg;
          } else {
            throw argumentErrorHelper(action, sprintf('ignored explicit argument %r', explicitArg));
          }
        } else if (argCount === 1) {
          // if the action expect exactly one argument, we've
          // successfully matched the option; exit the loop
          stop = startIndex + 1;
          args = [ explicitArg ];
          actionTuples.push([ action, args, optionString ]);
          break;
        } else {
          // error if a double-dash option did not use the
          // explicit argument
          throw argumentErrorHelper(action, sprintf('ignored explicit argument %r', explicitArg));
        }
      } else {
        // if there is no explicit argument, try to match the
        // optional's string arguments with the following strings
        // if successful, exit the loop

        start = startIndex + 1;
        var selectedPatterns = argStringsPattern.substr(start);

        argCount = self._matchArgument(action, selectedPatterns);
        stop = start + argCount;


        args = argStrings.slice(start, stop);

        actionTuples.push([ action, args, optionString ]);
        break;
      }

    }

    // add the Optional to the list and return the index at which
    // the Optional's string args stopped
    if (actionTuples.length < 1) {
      throw new Error('length should be > 0');
    }
    for (var i = 0; i < actionTuples.length; i++) {
      takeAction.apply(self, actionTuples[i]);
    }
    return stop;
  }

  // the list of Positionals left to be parsed; this is modified
  // by consume_positionals()
  var positionals = self._getPositionalActions();

  function consumePositionals(startIndex) {
    // match as many Positionals as possible
    var selectedPattern = argStringsPattern.substr(startIndex);
    var argCounts = self._matchArgumentsPartial(positionals, selectedPattern);

    // slice off the appropriate arg strings for each Positional
    // and add the Positional and its args to the list
    for (var i = 0; i < positionals.length; i++) {
      var action = positionals[i];
      var argCount = argCounts[i];
      if (typeof argCount === 'undefined') {
        continue;
      }
      var args = argStrings.slice(startIndex, startIndex + argCount);

      startIndex += argCount;
      takeAction(action, args);
    }

    // slice off the Positionals that we just parsed and return the
    // index at which the Positionals' string args stopped
    positionals = positionals.slice(argCounts.length);
    return startIndex;
  }

  // consume Positionals and Optionals alternately, until we have
  // passed the last option string
  var startIndex = 0;
  var position;

  var maxOptionStringIndex = -1;

  Object.keys(optionStringIndices).forEach(function (position) {
    maxOptionStringIndex = Math.max(maxOptionStringIndex, parseInt(position, 10));
  });

  var positionalsEndIndex, nextOptionStringIndex;

  while (startIndex <= maxOptionStringIndex) {
    // consume any Positionals preceding the next option
    nextOptionStringIndex = null;
    for (position in optionStringIndices) {
      if (!optionStringIndices.hasOwnProperty(position)) { continue; }

      position = parseInt(position, 10);
      if (position >= startIndex) {
        if (nextOptionStringIndex !== null) {
          nextOptionStringIndex = Math.min(nextOptionStringIndex, position);
        } else {
          nextOptionStringIndex = position;
        }
      }
    }

    if (startIndex !== nextOptionStringIndex) {
      positionalsEndIndex = consumePositionals(startIndex);
      // only try to parse the next optional if we didn't consume
      // the option string during the positionals parsing
      if (positionalsEndIndex > startIndex) {
        startIndex = positionalsEndIndex;
        continue;
      } else {
        startIndex = positionalsEndIndex;
      }
    }

    // if we consumed all the positionals we could and we're not
    // at the index of an option string, there were extra arguments
    if (!optionStringIndices[startIndex]) {
      var strings = argStrings.slice(startIndex, nextOptionStringIndex);
      extras = extras.concat(strings);
      startIndex = nextOptionStringIndex;
    }
    // consume the next optional and any arguments for it
    startIndex = consumeOptional(startIndex);
  }

  // consume any positionals following the last Optional
  var stopIndex = consumePositionals(startIndex);

  // if we didn't consume all the argument strings, there were extras
  extras = extras.concat(argStrings.slice(stopIndex));

  // if we didn't use all the Positional objects, there were too few
  // arg strings supplied.
  if (positionals.length > 0) {
    self.error('too few arguments');
  }

  // make sure all required actions were present
  self._actions.forEach(function (action) {
    if (action.required) {
      if (seenActions.indexOf(action) < 0) {
        self.error(format('Argument "%s" is required', action.getName()));
      }
    }
  });

  // make sure all required groups have one option present
  var actionUsed = false;
  self._mutuallyExclusiveGroups.forEach(function (group) {
    if (group.required) {
      actionUsed = group._groupActions.some(function (action) {
        return seenNonDefaultActions.indexOf(action) !== -1;
      });

      // if no actions were used, report the error
      if (!actionUsed) {
        var names = [];
        group._groupActions.forEach(function (action) {
          if (action.help !== c.SUPPRESS) {
            names.push(action.getName());
          }
        });
        names = names.join(' ');
        var msg = 'one of the arguments ' + names + ' is required';
        self.error(msg);
      }
    }
  });

  // return the updated namespace and the extra arguments
  return [ namespace, extras ];
};

ArgumentParser.prototype._readArgsFromFiles = function (argStrings) {
  // expand arguments referencing files
  var self = this;
  var fs = require('fs');
  var newArgStrings = [];
  argStrings.forEach(function (argString) {
    if (self.fromfilePrefixChars.indexOf(argString[0]) < 0) {
      // for regular arguments, just add them back into the list
      newArgStrings.push(argString);
    } else {
      // replace arguments referencing files with the file content
      try {
        var argstrs = [];
        var filename = argString.slice(1);
        var content = fs.readFileSync(filename, 'utf8');
        content = content.trim().split('\n');
        content.forEach(function (argLine) {
          self.convertArgLineToArgs(argLine).forEach(function (arg) {
            argstrs.push(arg);
          });
          argstrs = self._readArgsFromFiles(argstrs);
        });
        newArgStrings.push.apply(newArgStrings, argstrs);
      } catch (error) {
        return self.error(error.message);
      }
    }
  });
  return newArgStrings;
};

ArgumentParser.prototype.convertArgLineToArgs = function (argLine) {
  return [ argLine ];
};

ArgumentParser.prototype._matchArgument = function (action, regexpArgStrings) {

  // match the pattern for this action to the arg strings
  var regexpNargs = new RegExp('^' + this._getNargsPattern(action));
  var matches = regexpArgStrings.match(regexpNargs);
  var message;

  // throw an exception if we weren't able to find a match
  if (!matches) {
    switch (action.nargs) {
      /*eslint-disable no-undefined*/
      case undefined:
      case null:
        message = 'Expected one argument.';
        break;
      case c.OPTIONAL:
        message = 'Expected at most one argument.';
        break;
      case c.ONE_OR_MORE:
        message = 'Expected at least one argument.';
        break;
      default:
        message = 'Expected %s argument(s)';
    }

    throw argumentErrorHelper(
      action,
      format(message, action.nargs)
    );
  }
  // return the number of arguments matched
  return matches[1].length;
};

ArgumentParser.prototype._matchArgumentsPartial = function (actions, regexpArgStrings) {
  // progressively shorten the actions list by slicing off the
  // final actions until we find a match
  var self = this;
  var result = [];
  var actionSlice, pattern, matches;
  var i, j;

  function getLength(string) {
    return string.length;
  }

  for (i = actions.length; i > 0; i--) {
    pattern = '';
    actionSlice = actions.slice(0, i);
    for (j = 0; j < actionSlice.length; j++) {
      pattern += self._getNargsPattern(actionSlice[j]);
    }

    pattern = new RegExp('^' + pattern);
    matches = regexpArgStrings.match(pattern);

    if (matches && matches.length > 0) {
      // need only groups
      matches = matches.splice(1);
      result = result.concat(matches.map(getLength));
      break;
    }
  }

  // return the list of arg string counts
  return result;
};

ArgumentParser.prototype._parseOptional = function (argString) {
  var action, optionString, argExplicit, optionTuples;

  // if it's an empty string, it was meant to be a positional
  if (!argString) {
    return null;
  }

  // if it doesn't start with a prefix, it was meant to be positional
  if (this.prefixChars.indexOf(argString[0]) < 0) {
    return null;
  }

  // if the option string is present in the parser, return the action
  if (this._optionStringActions[argString]) {
    return [ this._optionStringActions[argString], argString, null ];
  }

  // if it's just a single character, it was meant to be positional
  if (argString.length === 1) {
    return null;
  }

  // if the option string before the "=" is present, return the action
  if (argString.indexOf('=') >= 0) {
    optionString = argString.split('=', 1)[0];
    argExplicit = argString.slice(optionString.length + 1);

    if (this._optionStringActions[optionString]) {
      action = this._optionStringActions[optionString];
      return [ action, optionString, argExplicit ];
    }
  }

  // search through all possible prefixes of the option string
  // and all actions in the parser for possible interpretations
  optionTuples = this._getOptionTuples(argString);

  // if multiple actions match, the option string was ambiguous
  if (optionTuples.length > 1) {
    var optionStrings = optionTuples.map(function (optionTuple) {
      return optionTuple[1];
    });
    this.error(format(
          'Ambiguous option: "%s" could match %s.',
          argString, optionStrings.join(', ')
    ));
  // if exactly one action matched, this segmentation is good,
  // so return the parsed action
  } else if (optionTuples.length === 1) {
    return optionTuples[0];
  }

  // if it was not found as an option, but it looks like a negative
  // number, it was meant to be positional
  // unless there are negative-number-like options
  if (argString.match(this._regexpNegativeNumber)) {
    if (!this._hasNegativeNumberOptionals.some(Boolean)) {
      return null;
    }
  }
  // if it contains a space, it was meant to be a positional
  if (argString.search(' ') >= 0) {
    return null;
  }

  // it was meant to be an optional but there is no such option
  // in this parser (though it might be a valid option in a subparser)
  return [ null, argString, null ];
};

ArgumentParser.prototype._getOptionTuples = function (optionString) {
  var result = [];
  var chars = this.prefixChars;
  var optionPrefix;
  var argExplicit;
  var action;
  var actionOptionString;

  // option strings starting with two prefix characters are only split at
  // the '='
  if (chars.indexOf(optionString[0]) >= 0 && chars.indexOf(optionString[1]) >= 0) {
    if (optionString.indexOf('=') >= 0) {
      var optionStringSplit = optionString.split('=', 1);

      optionPrefix = optionStringSplit[0];
      argExplicit = optionStringSplit[1];
    } else {
      optionPrefix = optionString;
      argExplicit = null;
    }

    for (actionOptionString in this._optionStringActions) {
      if (actionOptionString.substr(0, optionPrefix.length) === optionPrefix) {
        action = this._optionStringActions[actionOptionString];
        result.push([ action, actionOptionString, argExplicit ]);
      }
    }

  // single character options can be concatenated with their arguments
  // but multiple character options always have to have their argument
  // separate
  } else if (chars.indexOf(optionString[0]) >= 0 && chars.indexOf(optionString[1]) < 0) {
    optionPrefix = optionString;
    argExplicit = null;
    var optionPrefixShort = optionString.substr(0, 2);
    var argExplicitShort = optionString.substr(2);

    for (actionOptionString in this._optionStringActions) {
      if (!$$.has(this._optionStringActions, actionOptionString)) continue;

      action = this._optionStringActions[actionOptionString];
      if (actionOptionString === optionPrefixShort) {
        result.push([ action, actionOptionString, argExplicitShort ]);
      } else if (actionOptionString.substr(0, optionPrefix.length) === optionPrefix) {
        result.push([ action, actionOptionString, argExplicit ]);
      }
    }

  // shouldn't ever get here
  } else {
    throw new Error(format('Unexpected option string: %s.', optionString));
  }
  // return the collected option tuples
  return result;
};

ArgumentParser.prototype._getNargsPattern = function (action) {
  // in all examples below, we have to allow for '--' args
  // which are represented as '-' in the pattern
  var regexpNargs;

  switch (action.nargs) {
    // the default (null) is assumed to be a single argument
    case undefined:
    case null:
      regexpNargs = '(-*A-*)';
      break;
    // allow zero or more arguments
    case c.OPTIONAL:
      regexpNargs = '(-*A?-*)';
      break;
    // allow zero or more arguments
    case c.ZERO_OR_MORE:
      regexpNargs = '(-*[A-]*)';
      break;
    // allow one or more arguments
    case c.ONE_OR_MORE:
      regexpNargs = '(-*A[A-]*)';
      break;
    // allow any number of options or arguments
    case c.REMAINDER:
      regexpNargs = '([-AO]*)';
      break;
    // allow one argument followed by any number of options or arguments
    case c.PARSER:
      regexpNargs = '(-*A[-AO]*)';
      break;
    // all others should be integers
    default:
      regexpNargs = '(-*' + $$.repeat('-*A', action.nargs) + '-*)';
  }

  // if this is an optional action, -- is not allowed
  if (action.isOptional()) {
    regexpNargs = regexpNargs.replace(/-\*/g, '');
    regexpNargs = regexpNargs.replace(/-/g, '');
  }

  // return the pattern
  return regexpNargs;
};

//
// Value conversion methods
//

ArgumentParser.prototype._getValues = function (action, argStrings) {
  var self = this;

  // for everything but PARSER args, strip out '--'
  if (action.nargs !== c.PARSER && action.nargs !== c.REMAINDER) {
    argStrings = argStrings.filter(function (arrayElement) {
      return arrayElement !== '--';
    });
  }

  var value, argString;

  // optional argument produces a default when not present
  if (argStrings.length === 0 && action.nargs === c.OPTIONAL) {

    value = (action.isOptional()) ? action.constant : action.defaultValue;

    if (typeof (value) === 'string') {
      value = this._getValue(action, value);
      this._checkValue(action, value);
    }

  // when nargs='*' on a positional, if there were no command-line
  // args, use the default if it is anything other than None
  } else if (argStrings.length === 0 && action.nargs === c.ZERO_OR_MORE &&
    action.optionStrings.length === 0) {

    value = (action.defaultValue || argStrings);
    this._checkValue(action, value);

  // single argument or optional argument produces a single value
  } else if (argStrings.length === 1 &&
        (!action.nargs || action.nargs === c.OPTIONAL)) {

    argString = argStrings[0];
    value = this._getValue(action, argString);
    this._checkValue(action, value);

  // REMAINDER arguments convert all values, checking none
  } else if (action.nargs === c.REMAINDER) {
    value = argStrings.map(function (v) {
      return self._getValue(action, v);
    });

  // PARSER arguments convert all values, but check only the first
  } else if (action.nargs === c.PARSER) {
    value = argStrings.map(function (v) {
      return self._getValue(action, v);
    });
    this._checkValue(action, value[0]);

  // all other types of nargs produce a list
  } else {
    value = argStrings.map(function (v) {
      return self._getValue(action, v);
    });
    value.forEach(function (v) {
      self._checkValue(action, v);
    });
  }

  // return the converted value
  return value;
};

ArgumentParser.prototype._getValue = function (action, argString) {
  var result;

  var typeFunction = this._registryGet('type', action.type, action.type);
  if (typeof typeFunction !== 'function') {
    var message = format('%s is not callable', typeFunction);
    throw argumentErrorHelper(action, message);
  }

  // convert the value to the appropriate type
  try {
    result = typeFunction(argString);

    // ArgumentTypeErrors indicate errors
    // If action.type is not a registered string, it is a function
    // Try to deduce its name for inclusion in the error message
    // Failing that, include the error message it raised.
  } catch (e) {
    var name = null;
    if (typeof action.type === 'string') {
      name = action.type;
    } else {
      name = action.type.name || action.type.displayName || '<function>';
    }
    var msg = format('Invalid %s value: %s', name, argString);
    if (name === '<function>') { msg += '\n' + e.message; }
    throw argumentErrorHelper(action, msg);
  }
  // return the converted value
  return result;
};

ArgumentParser.prototype._checkValue = function (action, value) {
  // converted value must be one of the choices (if specified)
  var choices = action.choices;
  if (choices) {
    // choise for argument can by array or string
    if ((typeof choices === 'string' || Array.isArray(choices)) &&
        choices.indexOf(value) !== -1) {
      return;
    }
    // choise for subparsers can by only hash
    if (typeof choices === 'object' && !Array.isArray(choices) && choices[value]) {
      return;
    }

    if (typeof choices === 'string') {
      choices = choices.split('').join(', ');
    } else if (Array.isArray(choices)) {
      choices =  choices.join(', ');
    } else {
      choices =  Object.keys(choices).join(', ');
    }
    var message = format('Invalid choice: %s (choose from [%s])', value, choices);
    throw argumentErrorHelper(action, message);
  }
};

//
// Help formatting methods
//

/**
 * ArgumentParser#formatUsage -> string
 *
 * Return usage string
 *
 * See also [original guide][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#printing-help
 **/
ArgumentParser.prototype.formatUsage = function () {
  var formatter = this._getFormatter();
  formatter.addUsage(this.usage, this._actions, this._mutuallyExclusiveGroups);
  return formatter.formatHelp();
};

/**
 * ArgumentParser#formatHelp -> string
 *
 * Return help
 *
 * See also [original guide][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#printing-help
 **/
ArgumentParser.prototype.formatHelp = function () {
  var formatter = this._getFormatter();

  // usage
  formatter.addUsage(this.usage, this._actions, this._mutuallyExclusiveGroups);

  // description
  formatter.addText(this.description);

  // positionals, optionals and user-defined groups
  this._actionGroups.forEach(function (actionGroup) {
    formatter.startSection(actionGroup.title);
    formatter.addText(actionGroup.description);
    formatter.addArguments(actionGroup._groupActions);
    formatter.endSection();
  });

  // epilog
  formatter.addText(this.epilog);

  // determine help from format above
  return formatter.formatHelp();
};

ArgumentParser.prototype._getFormatter = function () {
  var FormatterClass = this.formatterClass;
  var formatter = new FormatterClass({ prog: this.prog });
  return formatter;
};

//
//  Print functions
//

/**
 * ArgumentParser#printUsage() -> Void
 *
 * Print usage
 *
 * See also [original guide][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#printing-help
 **/
ArgumentParser.prototype.printUsage = function () {
  this._printMessage(this.formatUsage());
};

/**
 * ArgumentParser#printHelp() -> Void
 *
 * Print help
 *
 * See also [original guide][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#printing-help
 **/
ArgumentParser.prototype.printHelp = function () {
  this._printMessage(this.formatHelp());
};

ArgumentParser.prototype._printMessage = function (message, stream) {
  if (!stream) {
    stream = process.stdout;
  }
  if (message) {
    stream.write('' + message);
  }
};

//
//  Exit functions
//

/**
 * ArgumentParser#exit(status=0, message) -> Void
 * - status (int): exit status
 * - message (string): message
 *
 * Print message in stderr/stdout and exit program
 **/
ArgumentParser.prototype.exit = function (status, message) {
  if (message) {
    if (status === 0) {
      this._printMessage(message);
    } else {
      this._printMessage(message, process.stderr);
    }
  }

  process.exit(status);
};

/**
 * ArgumentParser#error(message) -> Void
 * - err (Error|string): message
 *
 * Error method Prints a usage message incorporating the message to stderr and
 * exits. If you override this in a subclass,
 * it should not return -- it should
 * either exit or throw an exception.
 *
 **/
ArgumentParser.prototype.error = function (err) {
  var message;
  if (err instanceof Error) {
    if (this.debug === true) {
      throw err;
    }
    message = err.message;
  } else {
    message = err;
  }
  var msg = format('%s: error: %s', this.prog, message) + c.EOL;

  if (this.debug === true) {
    throw new Error(msg);
  }

  this.printUsage(process.stderr);

  return this.exit(2, msg);
};

module.exports = ArgumentParser;
//
// Constants
//

'use strict';

module.exports.EOL = '\n';

module.exports.SUPPRESS = '==SUPPRESS==';

module.exports.OPTIONAL = '?';

module.exports.ZERO_OR_MORE = '*';

module.exports.ONE_OR_MORE = '+';

module.exports.PARSER = 'A...';

module.exports.REMAINDER = '...';

module.exports._UNRECOGNIZED_ARGS_ATTR = '_unrecognized_args';
/**
 * class Namespace
 *
 * Simple object for storing attributes. Implements equality by attribute names
 * and values, and provides a simple string representation.
 *
 * See also [original guide][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#the-namespace-object
 **/
'use strict';

var $$ = require('./utils');

/**
 * new Namespace(options)
 * - options(object): predefined propertis for result object
 *
 **/
var Namespace = module.exports = function Namespace(options) {
  $$.extend(this, options);
};

/**
 * Namespace#isset(key) -> Boolean
 * - key (string|number): property name
 *
 * Tells whenever `namespace` contains given `key` or not.
 **/
Namespace.prototype.isset = function (key) {
  return $$.has(this, key);
};

/**
 * Namespace#set(key, value) -> self
 * -key (string|number|object): propery name
 * -value (mixed): new property value
 *
 * Set the property named key with value.
 * If key object then set all key properties to namespace object
 **/
Namespace.prototype.set = function (key, value) {
  if (typeof (key) === 'object') {
    $$.extend(this, key);
  } else {
    this[key] = value;
  }
  return this;
};

/**
 * Namespace#get(key, defaultValue) -> mixed
 * - key (string|number): property name
 * - defaultValue (mixed): default value
 *
 * Return the property key or defaulValue if not set
 **/
Namespace.prototype.get = function (key, defaultValue) {
  return !this[key] ? defaultValue : this[key];
};

/**
 * Namespace#unset(key, defaultValue) -> mixed
 * - key (string|number): property name
 * - defaultValue (mixed): default value
 *
 * Return data[key](and delete it) or defaultValue
 **/
Namespace.prototype.unset = function (key, defaultValue) {
  var value = this[key];
  if (value !== null) {
    delete this[key];
    return value;
  }
  return defaultValue;
};
'use strict';

exports.repeat = function (str, num) {
  var result = '';
  for (var i = 0; i < num; i++) { result += str; }
  return result;
};

exports.arrayEqual = function (a, b) {
  if (a.length !== b.length) { return false; }
  for (var i = 0; i < a.length; i++) {
    if (a[i] !== b[i]) { return false; }
  }
  return true;
};

exports.trimChars = function (str, chars) {
  var start = 0;
  var end = str.length - 1;
  while (chars.indexOf(str.charAt(start)) >= 0) { start++; }
  while (chars.indexOf(str.charAt(end)) >= 0) { end--; }
  return str.slice(start, end + 1);
};

exports.capitalize = function (str) {
  return str.charAt(0).toUpperCase() + str.slice(1);
};

exports.arrayUnion = function () {
  var result = [];
  for (var i = 0, values = {}; i < arguments.length; i++) {
    var arr = arguments[i];
    for (var j = 0; j < arr.length; j++) {
      if (!values[arr[j]]) {
        values[arr[j]] = true;
        result.push(arr[j]);
      }
    }
  }
  return result;
};

function has(obj, key) {
  return Object.prototype.hasOwnProperty.call(obj, key);
}

exports.has = has;

exports.extend = function (dest, src) {
  for (var i in src) {
    if (has(src, i)) { dest[i] = src[i]; }
  }
};

exports.trimEnd = function (str) {
  return str.replace(/\s+$/g, '');
};
'use strict';

var util    = require('util');

// Constants
var c = require('../const');

var $$ = require('../utils');
var HelpFormatter = require('./formatter.js');

/**
 * new RawDescriptionHelpFormatter(options)
 * new ArgumentParser({formatterClass: argparse.RawDescriptionHelpFormatter, ...})
 *
 * Help message formatter which adds default values to argument help.
 *
 * Only the name of this class is considered a public API. All the methods
 * provided by the class are considered an implementation detail.
 **/

function ArgumentDefaultsHelpFormatter(options) {
  HelpFormatter.call(this, options);
}

util.inherits(ArgumentDefaultsHelpFormatter, HelpFormatter);

ArgumentDefaultsHelpFormatter.prototype._getHelpString = function (action) {
  var help = action.help;
  if (action.help.indexOf('%(defaultValue)s') === -1) {
    if (action.defaultValue !== c.SUPPRESS) {
      var defaulting_nargs = [ c.OPTIONAL, c.ZERO_OR_MORE ];
      if (action.isOptional() || (defaulting_nargs.indexOf(action.nargs) >= 0)) {
        help += ' (default: %(defaultValue)s)';
      }
    }
  }
  return help;
};

module.exports.ArgumentDefaultsHelpFormatter = ArgumentDefaultsHelpFormatter;

/**
 * new RawDescriptionHelpFormatter(options)
 * new ArgumentParser({formatterClass: argparse.RawDescriptionHelpFormatter, ...})
 *
 * Help message formatter which retains any formatting in descriptions.
 *
 * Only the name of this class is considered a public API. All the methods
 * provided by the class are considered an implementation detail.
 **/

function RawDescriptionHelpFormatter(options) {
  HelpFormatter.call(this, options);
}

util.inherits(RawDescriptionHelpFormatter, HelpFormatter);

RawDescriptionHelpFormatter.prototype._fillText = function (text, width, indent) {
  var lines = text.split('\n');
  lines = lines.map(function (line) {
    return $$.trimEnd(indent + line);
  });
  return lines.join('\n');
};
module.exports.RawDescriptionHelpFormatter = RawDescriptionHelpFormatter;

/**
 * new RawTextHelpFormatter(options)
 * new ArgumentParser({formatterClass: argparse.RawTextHelpFormatter, ...})
 *
 * Help message formatter which retains formatting of all help text.
 *
 * Only the name of this class is considered a public API. All the methods
 * provided by the class are considered an implementation detail.
 **/

function RawTextHelpFormatter(options) {
  RawDescriptionHelpFormatter.call(this, options);
}

util.inherits(RawTextHelpFormatter, RawDescriptionHelpFormatter);

RawTextHelpFormatter.prototype._splitLines = function (text) {
  return text.split('\n');
};

module.exports.RawTextHelpFormatter = RawTextHelpFormatter;
/**
 * class HelpFormatter
 *
 * Formatter for generating usage messages and argument help strings. Only the
 * name of this class is considered a public API. All the methods provided by
 * the class are considered an implementation detail.
 *
 * Do not call in your code, use this class only for inherits your own forvatter
 *
 * ToDo add [additonal formatters][1]
 *
 * [1]:http://docs.python.org/dev/library/argparse.html#formatter-class
 **/
'use strict';

var sprintf = require('sprintf-js').sprintf;

// Constants
var c = require('../const');

var $$ = require('../utils');


/*:nodoc:* internal
 * new Support(parent, heding)
 * - parent (object): parent section
 * - heading (string): header string
 *
 **/
function Section(parent, heading) {
  this._parent = parent;
  this._heading = heading;
  this._items = [];
}

/*:nodoc:* internal
 * Section#addItem(callback) -> Void
 * - callback (array): tuple with function and args
 *
 * Add function for single element
 **/
Section.prototype.addItem = function (callback) {
  this._items.push(callback);
};

/*:nodoc:* internal
 * Section#formatHelp(formatter) -> string
 * - formatter (HelpFormatter): current formatter
 *
 * Form help section string
 *
 **/
Section.prototype.formatHelp = function (formatter) {
  var itemHelp, heading;

  // format the indented section
  if (this._parent) {
    formatter._indent();
  }

  itemHelp = this._items.map(function (item) {
    var obj, func, args;

    obj = formatter;
    func = item[0];
    args = item[1];
    return func.apply(obj, args);
  });
  itemHelp = formatter._joinParts(itemHelp);

  if (this._parent) {
    formatter._dedent();
  }

  // return nothing if the section was empty
  if (!itemHelp) {
    return '';
  }

  // add the heading if the section was non-empty
  heading = '';
  if (this._heading && this._heading !== c.SUPPRESS) {
    var currentIndent = formatter.currentIndent;
    heading = $$.repeat(' ', currentIndent) + this._heading + ':' + c.EOL;
  }

  // join the section-initialize newline, the heading and the help
  return formatter._joinParts([ c.EOL, heading, itemHelp, c.EOL ]);
};

/**
 * new HelpFormatter(options)
 *
 * #### Options:
 * - `prog`: program name
 * - `indentIncriment`: indent step, default value 2
 * - `maxHelpPosition`: max help position, default value = 24
 * - `width`: line width
 *
 **/
var HelpFormatter = module.exports = function HelpFormatter(options) {
  options = options || {};

  this._prog = options.prog;

  this._maxHelpPosition = options.maxHelpPosition || 24;
  this._width = (options.width || ((process.env.COLUMNS || 80) - 2));

  this._currentIndent = 0;
  this._indentIncriment = options.indentIncriment || 2;
  this._level = 0;
  this._actionMaxLength = 0;

  this._rootSection = new Section(null);
  this._currentSection = this._rootSection;

  this._whitespaceMatcher = new RegExp('\\s+', 'g');
  this._longBreakMatcher = new RegExp(c.EOL + c.EOL + c.EOL + '+', 'g');
};

HelpFormatter.prototype._indent = function () {
  this._currentIndent += this._indentIncriment;
  this._level += 1;
};

HelpFormatter.prototype._dedent = function () {
  this._currentIndent -= this._indentIncriment;
  this._level -= 1;
  if (this._currentIndent < 0) {
    throw new Error('Indent decreased below 0.');
  }
};

HelpFormatter.prototype._addItem = function (func, args) {
  this._currentSection.addItem([ func, args ]);
};

//
// Message building methods
//

/**
 * HelpFormatter#startSection(heading) -> Void
 * - heading (string): header string
 *
 * Start new help section
 *
 * See alse [code example][1]
 *
 * ##### Example
 *
 *      formatter.startSection(actionGroup.title);
 *      formatter.addText(actionGroup.description);
 *      formatter.addArguments(actionGroup._groupActions);
 *      formatter.endSection();
 *
 **/
HelpFormatter.prototype.startSection = function (heading) {
  this._indent();
  var section = new Section(this._currentSection, heading);
  var func = section.formatHelp.bind(section);
  this._addItem(func, [ this ]);
  this._currentSection = section;
};

/**
 * HelpFormatter#endSection -> Void
 *
 * End help section
 *
 * ##### Example
 *
 *      formatter.startSection(actionGroup.title);
 *      formatter.addText(actionGroup.description);
 *      formatter.addArguments(actionGroup._groupActions);
 *      formatter.endSection();
 **/
HelpFormatter.prototype.endSection = function () {
  this._currentSection = this._currentSection._parent;
  this._dedent();
};

/**
 * HelpFormatter#addText(text) -> Void
 * - text (string): plain text
 *
 * Add plain text into current section
 *
 * ##### Example
 *
 *      formatter.startSection(actionGroup.title);
 *      formatter.addText(actionGroup.description);
 *      formatter.addArguments(actionGroup._groupActions);
 *      formatter.endSection();
 *
 **/
HelpFormatter.prototype.addText = function (text) {
  if (text && text !== c.SUPPRESS) {
    this._addItem(this._formatText, [ text ]);
  }
};

/**
 * HelpFormatter#addUsage(usage, actions, groups, prefix) -> Void
 * - usage (string): usage text
 * - actions (array): actions list
 * - groups (array): groups list
 * - prefix (string): usage prefix
 *
 * Add usage data into current section
 *
 * ##### Example
 *
 *      formatter.addUsage(this.usage, this._actions, []);
 *      return formatter.formatHelp();
 *
 **/
HelpFormatter.prototype.addUsage = function (usage, actions, groups, prefix) {
  if (usage !== c.SUPPRESS) {
    this._addItem(this._formatUsage, [ usage, actions, groups, prefix ]);
  }
};

/**
 * HelpFormatter#addArgument(action) -> Void
 * - action (object): action
 *
 * Add argument into current section
 *
 * Single variant of [[HelpFormatter#addArguments]]
 **/
HelpFormatter.prototype.addArgument = function (action) {
  if (action.help !== c.SUPPRESS) {
    var self = this;

    // find all invocations
    var invocations = [ this._formatActionInvocation(action) ];
    var invocationLength = invocations[0].length;

    var actionLength;

    if (action._getSubactions) {
      this._indent();
      action._getSubactions().forEach(function (subaction) {

        var invocationNew = self._formatActionInvocation(subaction);
        invocations.push(invocationNew);
        invocationLength = Math.max(invocationLength, invocationNew.length);

      });
      this._dedent();
    }

    // update the maximum item length
    actionLength = invocationLength + this._currentIndent;
    this._actionMaxLength = Math.max(this._actionMaxLength, actionLength);

    // add the item to the list
    this._addItem(this._formatAction, [ action ]);
  }
};

/**
 * HelpFormatter#addArguments(actions) -> Void
 * - actions (array): actions list
 *
 * Mass add arguments into current section
 *
 * ##### Example
 *
 *      formatter.startSection(actionGroup.title);
 *      formatter.addText(actionGroup.description);
 *      formatter.addArguments(actionGroup._groupActions);
 *      formatter.endSection();
 *
 **/
HelpFormatter.prototype.addArguments = function (actions) {
  var self = this;
  actions.forEach(function (action) {
    self.addArgument(action);
  });
};

//
// Help-formatting methods
//

/**
 * HelpFormatter#formatHelp -> string
 *
 * Format help
 *
 * ##### Example
 *
 *      formatter.addText(this.epilog);
 *      return formatter.formatHelp();
 *
 **/
HelpFormatter.prototype.formatHelp = function () {
  var help = this._rootSection.formatHelp(this);
  if (help) {
    help = help.replace(this._longBreakMatcher, c.EOL + c.EOL);
    help = $$.trimChars(help, c.EOL) + c.EOL;
  }
  return help;
};

HelpFormatter.prototype._joinParts = function (partStrings) {
  return partStrings.filter(function (part) {
    return (part && part !== c.SUPPRESS);
  }).join('');
};

HelpFormatter.prototype._formatUsage = function (usage, actions, groups, prefix) {
  if (!prefix && typeof prefix !== 'string') {
    prefix = 'usage: ';
  }

  actions = actions || [];
  groups = groups || [];


  // if usage is specified, use that
  if (usage) {
    usage = sprintf(usage, { prog: this._prog });

    // if no optionals or positionals are available, usage is just prog
  } else if (!usage && actions.length === 0) {
    usage = this._prog;

    // if optionals and positionals are available, calculate usage
  } else if (!usage) {
    var prog = this._prog;
    var optionals = [];
    var positionals = [];
    var actionUsage;
    var textWidth;

    // split optionals from positionals
    actions.forEach(function (action) {
      if (action.isOptional()) {
        optionals.push(action);
      } else {
        positionals.push(action);
      }
    });

    // build full usage string
    actionUsage = this._formatActionsUsage([].concat(optionals, positionals), groups);
    usage = [ prog, actionUsage ].join(' ');

    // wrap the usage parts if it's too long
    textWidth = this._width - this._currentIndent;
    if ((prefix.length + usage.length) > textWidth) {

      // break usage into wrappable parts
      var regexpPart = new RegExp('\\(.*?\\)+|\\[.*?\\]+|\\S+', 'g');
      var optionalUsage = this._formatActionsUsage(optionals, groups);
      var positionalUsage = this._formatActionsUsage(positionals, groups);


      var optionalParts = optionalUsage.match(regexpPart);
      var positionalParts = positionalUsage.match(regexpPart) || [];

      if (optionalParts.join(' ') !== optionalUsage) {
        throw new Error('assert "optionalParts.join(\' \') === optionalUsage"');
      }
      if (positionalParts.join(' ') !== positionalUsage) {
        throw new Error('assert "positionalParts.join(\' \') === positionalUsage"');
      }

      // helper for wrapping lines
      /*eslint-disable func-style*/ // node 0.10 compat
      var _getLines = function (parts, indent, prefix) {
        var lines = [];
        var line = [];

        var lineLength = prefix ? prefix.length - 1 : indent.length - 1;

        parts.forEach(function (part) {
          if (lineLength + 1 + part.length > textWidth) {
            lines.push(indent + line.join(' '));
            line = [];
            lineLength = indent.length - 1;
          }
          line.push(part);
          lineLength += part.length + 1;
        });

        if (line) {
          lines.push(indent + line.join(' '));
        }
        if (prefix) {
          lines[0] = lines[0].substr(indent.length);
        }
        return lines;
      };

      var lines, indent, parts;
      // if prog is short, follow it with optionals or positionals
      if (prefix.length + prog.length <= 0.75 * textWidth) {
        indent = $$.repeat(' ', (prefix.length + prog.length + 1));
        if (optionalParts) {
          lines = [].concat(
            _getLines([ prog ].concat(optionalParts), indent, prefix),
            _getLines(positionalParts, indent)
          );
        } else if (positionalParts) {
          lines = _getLines([ prog ].concat(positionalParts), indent, prefix);
        } else {
          lines = [ prog ];
        }

        // if prog is long, put it on its own line
      } else {
        indent = $$.repeat(' ', prefix.length);
        parts = optionalParts.concat(positionalParts);
        lines = _getLines(parts, indent);
        if (lines.length > 1) {
          lines = [].concat(
            _getLines(optionalParts, indent),
            _getLines(positionalParts, indent)
          );
        }
        lines = [ prog ].concat(lines);
      }
      // join lines into usage
      usage = lines.join(c.EOL);
    }
  }

  // prefix with 'usage:'
  return prefix + usage + c.EOL + c.EOL;
};

HelpFormatter.prototype._formatActionsUsage = function (actions, groups) {
  // find group indices and identify actions in groups
  var groupActions = [];
  var inserts = [];
  var self = this;

  groups.forEach(function (group) {
    var end;
    var i;

    var start = actions.indexOf(group._groupActions[0]);
    if (start >= 0) {
      end = start + group._groupActions.length;

      //if (actions.slice(start, end) === group._groupActions) {
      if ($$.arrayEqual(actions.slice(start, end), group._groupActions)) {
        group._groupActions.forEach(function (action) {
          groupActions.push(action);
        });

        if (!group.required) {
          if (inserts[start]) {
            inserts[start] += ' [';
          } else {
            inserts[start] = '[';
          }
          inserts[end] = ']';
        } else {
          if (inserts[start]) {
            inserts[start] += ' (';
          } else {
            inserts[start] = '(';
          }
          inserts[end] = ')';
        }
        for (i = start + 1; i < end; i += 1) {
          inserts[i] = '|';
        }
      }
    }
  });

  // collect all actions format strings
  var parts = [];

  actions.forEach(function (action, actionIndex) {
    var part;
    var optionString;
    var argsDefault;
    var argsString;

    // suppressed arguments are marked with None
    // remove | separators for suppressed arguments
    if (action.help === c.SUPPRESS) {
      parts.push(null);
      if (inserts[actionIndex] === '|') {
        inserts.splice(actionIndex, actionIndex);
      } else if (inserts[actionIndex + 1] === '|') {
        inserts.splice(actionIndex + 1, actionIndex + 1);
      }

      // produce all arg strings
    } else if (!action.isOptional()) {
      part = self._formatArgs(action, action.dest);

      // if it's in a group, strip the outer []
      if (groupActions.indexOf(action) >= 0) {
        if (part[0] === '[' && part[part.length - 1] === ']') {
          part = part.slice(1, -1);
        }
      }
      // add the action string to the list
      parts.push(part);

    // produce the first way to invoke the option in brackets
    } else {
      optionString = action.optionStrings[0];

      // if the Optional doesn't take a value, format is: -s or --long
      if (action.nargs === 0) {
        part = '' + optionString;

      // if the Optional takes a value, format is: -s ARGS or --long ARGS
      } else {
        argsDefault = action.dest.toUpperCase();
        argsString = self._formatArgs(action, argsDefault);
        part = optionString + ' ' + argsString;
      }
      // make it look optional if it's not required or in a group
      if (!action.required && groupActions.indexOf(action) < 0) {
        part = '[' + part + ']';
      }
      // add the action string to the list
      parts.push(part);
    }
  });

  // insert things at the necessary indices
  for (var i = inserts.length - 1; i >= 0; --i) {
    if (inserts[i] !== null) {
      parts.splice(i, 0, inserts[i]);
    }
  }

  // join all the action items with spaces
  var text = parts.filter(function (part) {
    return !!part;
  }).join(' ');

  // clean up separators for mutually exclusive groups
  text = text.replace(/([\[(]) /g, '$1'); // remove spaces
  text = text.replace(/ ([\])])/g, '$1');
  text = text.replace(/\[ *\]/g, ''); // remove empty groups
  text = text.replace(/\( *\)/g, '');
  text = text.replace(/\(([^|]*)\)/g, '$1'); // remove () from single action groups

  text = text.trim();

  // return the text
  return text;
};

HelpFormatter.prototype._formatText = function (text) {
  text = sprintf(text, { prog: this._prog });
  var textWidth = this._width - this._currentIndent;
  var indentIncriment = $$.repeat(' ', this._currentIndent);
  return this._fillText(text, textWidth, indentIncriment) + c.EOL + c.EOL;
};

HelpFormatter.prototype._formatAction = function (action) {
  var self = this;

  var helpText;
  var helpLines;
  var parts;
  var indentFirst;

  // determine the required width and the entry label
  var helpPosition = Math.min(this._actionMaxLength + 2, this._maxHelpPosition);
  var helpWidth = this._width - helpPosition;
  var actionWidth = helpPosition - this._currentIndent - 2;
  var actionHeader = this._formatActionInvocation(action);

  // no help; start on same line and add a final newline
  if (!action.help) {
    actionHeader = $$.repeat(' ', this._currentIndent) + actionHeader + c.EOL;

  // short action name; start on the same line and pad two spaces
  } else if (actionHeader.length <= actionWidth) {
    actionHeader = $$.repeat(' ', this._currentIndent) +
        actionHeader +
        '  ' +
        $$.repeat(' ', actionWidth - actionHeader.length);
    indentFirst = 0;

  // long action name; start on the next line
  } else {
    actionHeader = $$.repeat(' ', this._currentIndent) + actionHeader + c.EOL;
    indentFirst = helpPosition;
  }

  // collect the pieces of the action help
  parts = [ actionHeader ];

  // if there was help for the action, add lines of help text
  if (action.help) {
    helpText = this._expandHelp(action);
    helpLines = this._splitLines(helpText, helpWidth);
    parts.push($$.repeat(' ', indentFirst) + helpLines[0] + c.EOL);
    helpLines.slice(1).forEach(function (line) {
      parts.push($$.repeat(' ', helpPosition) + line + c.EOL);
    });

  // or add a newline if the description doesn't end with one
  } else if (actionHeader.charAt(actionHeader.length - 1) !== c.EOL) {
    parts.push(c.EOL);
  }
  // if there are any sub-actions, add their help as well
  if (action._getSubactions) {
    this._indent();
    action._getSubactions().forEach(function (subaction) {
      parts.push(self._formatAction(subaction));
    });
    this._dedent();
  }
  // return a single string
  return this._joinParts(parts);
};

HelpFormatter.prototype._formatActionInvocation = function (action) {
  if (!action.isOptional()) {
    var format_func = this._metavarFormatter(action, action.dest);
    var metavars = format_func(1);
    return metavars[0];
  }

  var parts = [];
  var argsDefault;
  var argsString;

  // if the Optional doesn't take a value, format is: -s, --long
  if (action.nargs === 0) {
    parts = parts.concat(action.optionStrings);

  // if the Optional takes a value, format is: -s ARGS, --long ARGS
  } else {
    argsDefault = action.dest.toUpperCase();
    argsString = this._formatArgs(action, argsDefault);
    action.optionStrings.forEach(function (optionString) {
      parts.push(optionString + ' ' + argsString);
    });
  }
  return parts.join(', ');
};

HelpFormatter.prototype._metavarFormatter = function (action, metavarDefault) {
  var result;

  if (action.metavar || action.metavar === '') {
    result = action.metavar;
  } else if (action.choices) {
    var choices = action.choices;

    if (typeof choices === 'string') {
      choices = choices.split('').join(', ');
    } else if (Array.isArray(choices)) {
      choices = choices.join(',');
    } else {
      choices = Object.keys(choices).join(',');
    }
    result = '{' + choices + '}';
  } else {
    result = metavarDefault;
  }

  return function (size) {
    if (Array.isArray(result)) {
      return result;
    }

    var metavars = [];
    for (var i = 0; i < size; i += 1) {
      metavars.push(result);
    }
    return metavars;
  };
};

HelpFormatter.prototype._formatArgs = function (action, metavarDefault) {
  var result;
  var metavars;

  var buildMetavar = this._metavarFormatter(action, metavarDefault);

  switch (action.nargs) {
    /*eslint-disable no-undefined*/
    case undefined:
    case null:
      metavars = buildMetavar(1);
      result = '' + metavars[0];
      break;
    case c.OPTIONAL:
      metavars = buildMetavar(1);
      result = '[' + metavars[0] + ']';
      break;
    case c.ZERO_OR_MORE:
      metavars = buildMetavar(2);
      result = '[' + metavars[0] + ' [' + metavars[1] + ' ...]]';
      break;
    case c.ONE_OR_MORE:
      metavars = buildMetavar(2);
      result = '' + metavars[0] + ' [' + metavars[1] + ' ...]';
      break;
    case c.REMAINDER:
      result = '...';
      break;
    case c.PARSER:
      metavars = buildMetavar(1);
      result = metavars[0] + ' ...';
      break;
    default:
      metavars = buildMetavar(action.nargs);
      result = metavars.join(' ');
  }
  return result;
};

HelpFormatter.prototype._expandHelp = function (action) {
  var params = { prog: this._prog };

  Object.keys(action).forEach(function (actionProperty) {
    var actionValue = action[actionProperty];

    if (actionValue !== c.SUPPRESS) {
      params[actionProperty] = actionValue;
    }
  });

  if (params.choices) {
    if (typeof params.choices === 'string') {
      params.choices = params.choices.split('').join(', ');
    } else if (Array.isArray(params.choices)) {
      params.choices = params.choices.join(', ');
    } else {
      params.choices = Object.keys(params.choices).join(', ');
    }
  }

  return sprintf(this._getHelpString(action), params);
};

HelpFormatter.prototype._splitLines = function (text, width) {
  var lines = [];
  var delimiters = [ ' ', '.', ',', '!', '?' ];
  var re = new RegExp('[' + delimiters.join('') + '][^' + delimiters.join('') + ']*$');

  text = text.replace(/[\n\|\t]/g, ' ');

  text = text.trim();
  text = text.replace(this._whitespaceMatcher, ' ');

  // Wraps the single paragraph in text (a string) so every line
  // is at most width characters long.
  text.split(c.EOL).forEach(function (line) {
    if (width >= line.length) {
      lines.push(line);
      return;
    }

    var wrapStart = 0;
    var wrapEnd = width;
    var delimiterIndex = 0;
    while (wrapEnd <= line.length) {
      if (wrapEnd !== line.length && delimiters.indexOf(line[wrapEnd] < -1)) {
        delimiterIndex = (re.exec(line.substring(wrapStart, wrapEnd)) || {}).index;
        wrapEnd = wrapStart + delimiterIndex + 1;
      }
      lines.push(line.substring(wrapStart, wrapEnd));
      wrapStart = wrapEnd;
      wrapEnd += width;
    }
    if (wrapStart < line.length) {
      lines.push(line.substring(wrapStart, wrapEnd));
    }
  });

  return lines;
};

HelpFormatter.prototype._fillText = function (text, width, indent) {
  var lines = this._splitLines(text, width);
  lines = lines.map(function (line) {
    return indent + line;
  });
  return lines.join(c.EOL);
};

HelpFormatter.prototype._getHelpString = function (action) {
  return action.help;
};
'use strict';


var format  = require('util').format;


var ERR_CODE = 'ARGError';

/*:nodoc:*
 * argumentError(argument, message) -> TypeError
 * - argument (Object): action with broken argument
 * - message (String): error message
 *
 * Error format helper. An error from creating or using an argument
 * (optional or positional). The string value of this exception
 * is the message, augmented with information
 * about the argument that caused it.
 *
 * #####Example
 *
 *      var argumentErrorHelper = require('./argument/error');
 *      if (conflictOptionals.length > 0) {
 *        throw argumentErrorHelper(
 *          action,
 *          format('Conflicting option string(s): %s', conflictOptionals.join(', '))
 *        );
 *      }
 *
 **/
module.exports = function (argument, message) {
  var argumentName = null;
  var errMessage;
  var err;

  if (argument.getName) {
    argumentName = argument.getName();
  } else {
    argumentName = '' + argument;
  }

  if (!argumentName) {
    errMessage = message;
  } else {
    errMessage = format('argument "%s": %s', argumentName, message);
  }

  err = new TypeError(errMessage);
  err.code = ERR_CODE;
  return err;
};
/** internal
 * class MutuallyExclusiveGroup
 *
 * Group arguments.
 * By default, ArgumentParser groups command-line arguments
 * into “positional arguments” and “optional arguments”
 * when displaying help messages. When there is a better
 * conceptual grouping of arguments than this default one,
 * appropriate groups can be created using the addArgumentGroup() method
 *
 * This class inherited from [[ArgumentContainer]]
 **/
'use strict';

var util = require('util');

var ArgumentGroup = require('./group');

/**
 * new MutuallyExclusiveGroup(container, options)
 * - container (object): main container
 * - options (object): options.required -> true/false
 *
 * `required` could be an argument itself, but making it a property of
 * the options argument is more consistent with the JS adaptation of the Python)
 **/
var MutuallyExclusiveGroup = module.exports = function MutuallyExclusiveGroup(container, options) {
  var required;
  options = options || {};
  required = options.required || false;
  ArgumentGroup.call(this, container);
  this.required = required;

};
util.inherits(MutuallyExclusiveGroup, ArgumentGroup);


MutuallyExclusiveGroup.prototype._addAction = function (action) {
  var msg;
  if (action.required) {
    msg = 'mutually exclusive arguments must be optional';
    throw new Error(msg);
  }
  action = this._container._addAction(action);
  this._groupActions.push(action);
  return action;
};


MutuallyExclusiveGroup.prototype._removeAction = function (action) {
  this._container._removeAction(action);
  this._groupActions.remove(action);
};

/** internal
 * class ArgumentGroup
 *
 * Group arguments.
 * By default, ArgumentParser groups command-line arguments
 * into “positional arguments” and “optional arguments”
 * when displaying help messages. When there is a better
 * conceptual grouping of arguments than this default one,
 * appropriate groups can be created using the addArgumentGroup() method
 *
 * This class inherited from [[ArgumentContainer]]
 **/
'use strict';

var util = require('util');

var ActionContainer = require('../action_container');


/**
 * new ArgumentGroup(container, options)
 * - container (object): main container
 * - options (object): hash of group options
 *
 * #### options
 * - **prefixChars**  group name prefix
 * - **argumentDefault**  default argument value
 * - **title**  group title
 * - **description** group description
 *
 **/
var ArgumentGroup = module.exports = function ArgumentGroup(container, options) {

  options = options || {};

  // add any missing keyword arguments by checking the container
  options.conflictHandler = (options.conflictHandler || container.conflictHandler);
  options.prefixChars = (options.prefixChars || container.prefixChars);
  options.argumentDefault = (options.argumentDefault || container.argumentDefault);

  ActionContainer.call(this, options);

  // group attributes
  this.title = options.title;
  this._groupActions = [];

  // share most attributes with the container
  this._container = container;
  this._registries = container._registries;
  this._actions = container._actions;
  this._optionStringActions = container._optionStringActions;
  this._defaults = container._defaults;
  this._hasNegativeNumberOptionals = container._hasNegativeNumberOptionals;
  this._mutuallyExclusiveGroups = container._mutuallyExclusiveGroups;
};
util.inherits(ArgumentGroup, ActionContainer);


ArgumentGroup.prototype._addAction = function (action) {
  // Parent add action
  action = ActionContainer.prototype._addAction.call(this, action);
  this._groupActions.push(action);
  return action;
};


ArgumentGroup.prototype._removeAction = function (action) {
  // Parent remove action
  ActionContainer.prototype._removeAction.call(this, action);
  var actionIndex = this._groupActions.indexOf(action);
  if (actionIndex >= 0) {
    this._groupActions.splice(actionIndex, 1);
  }
};

/*:nodoc:*
 * class ActionAppend
 *
 * This action stores a list, and appends each argument value to the list.
 * This is useful to allow an option to be specified multiple times.
 * This class inherided from [[Action]]
 *
 **/

'use strict';

var util = require('util');

var Action = require('../action');

// Constants
var c = require('../const');

/*:nodoc:*
 * new ActionAppend(options)
 * - options (object): options hash see [[Action.new]]
 *
 * Note: options.nargs should be optional for constants
 * and more then zero for other
 **/
var ActionAppend = module.exports = function ActionAppend(options) {
  options = options || {};
  if (this.nargs <= 0) {
    throw new Error('nargs for append actions must be > 0; if arg ' +
        'strings are not supplying the value to append, ' +
        'the append const action may be more appropriate');
  }
  if (!!this.constant && this.nargs !== c.OPTIONAL) {
    throw new Error('nargs must be OPTIONAL to supply const');
  }
  Action.call(this, options);
};
util.inherits(ActionAppend, Action);

/*:nodoc:*
 * ActionAppend#call(parser, namespace, values, optionString) -> Void
 * - parser (ArgumentParser): current parser
 * - namespace (Namespace): namespace for output data
 * - values (Array): parsed values
 * - optionString (Array): input option string(not parsed)
 *
 * Call the action. Save result in namespace object
 **/
ActionAppend.prototype.call = function (parser, namespace, values) {
  var items = (namespace[this.dest] || []).slice();
  items.push(values);
  namespace.set(this.dest, items);
};
/*:nodoc:*
 * class ActionCount
 *
 * This counts the number of times a keyword argument occurs.
 * For example, this is useful for increasing verbosity levels
 *
 * This class inherided from [[Action]]
 *
 **/
'use strict';

var util = require('util');

var Action = require('../action');

/*:nodoc:*
 * new ActionCount(options)
 * - options (object): options hash see [[Action.new]]
 *
 **/
var ActionCount = module.exports = function ActionCount(options) {
  options = options || {};
  options.nargs = 0;

  Action.call(this, options);
};
util.inherits(ActionCount, Action);

/*:nodoc:*
 * ActionCount#call(parser, namespace, values, optionString) -> Void
 * - parser (ArgumentParser): current parser
 * - namespace (Namespace): namespace for output data
 * - values (Array): parsed values
 * - optionString (Array): input option string(not parsed)
 *
 * Call the action. Save result in namespace object
 **/
ActionCount.prototype.call = function (parser, namespace) {
  namespace.set(this.dest, (namespace[this.dest] || 0) + 1);
};
/*:nodoc:*
 * class ActionHelp
 *
 * Support action for printing help
 * This class inherided from [[Action]]
 **/
'use strict';

var util = require('util');

var Action = require('../action');

// Constants
var c  = require('../const');

/*:nodoc:*
 * new ActionHelp(options)
 * - options (object): options hash see [[Action.new]]
 *
 **/
var ActionHelp = module.exports = function ActionHelp(options) {
  options = options || {};
  if (options.defaultValue !== null) {
    options.defaultValue = options.defaultValue;
  } else {
    options.defaultValue = c.SUPPRESS;
  }
  options.dest = (options.dest !== null ? options.dest : c.SUPPRESS);
  options.nargs = 0;
  Action.call(this, options);

};
util.inherits(ActionHelp, Action);

/*:nodoc:*
 * ActionHelp#call(parser, namespace, values, optionString)
 * - parser (ArgumentParser): current parser
 * - namespace (Namespace): namespace for output data
 * - values (Array): parsed values
 * - optionString (Array): input option string(not parsed)
 *
 * Print help and exit
 **/
ActionHelp.prototype.call = function (parser) {
  parser.printHelp();
  parser.exit();
};
/*:nodoc:*
 * class ActionStore
 *
 * This action just stores the argument’s value. This is the default action.
 *
 * This class inherited from [[Action]]
 *
 **/
'use strict';

var util = require('util');

var Action = require('../action');

// Constants
var c = require('../const');


/*:nodoc:*
 * new ActionStore(options)
 * - options (object): options hash see [[Action.new]]
 *
 **/
var ActionStore = module.exports = function ActionStore(options) {
  options = options || {};
  if (this.nargs <= 0) {
    throw new Error('nargs for store actions must be > 0; if you ' +
        'have nothing to store, actions such as store ' +
        'true or store const may be more appropriate');

  }
  if (typeof this.constant !== 'undefined' && this.nargs !== c.OPTIONAL) {
    throw new Error('nargs must be OPTIONAL to supply const');
  }
  Action.call(this, options);
};
util.inherits(ActionStore, Action);

/*:nodoc:*
 * ActionStore#call(parser, namespace, values, optionString) -> Void
 * - parser (ArgumentParser): current parser
 * - namespace (Namespace): namespace for output data
 * - values (Array): parsed values
 * - optionString (Array): input option string(not parsed)
 *
 * Call the action. Save result in namespace object
 **/
ActionStore.prototype.call = function (parser, namespace, values) {
  namespace.set(this.dest, values);
};
/** internal
 * class ActionSubparsers
 *
 * Support the creation of such sub-commands with the addSubparsers()
 *
 * This class inherited from [[Action]]
 **/
'use strict';

var util    = require('util');
var format  = require('util').format;


var Action = require('../action');

// Constants
var c = require('../const');

// Errors
var argumentErrorHelper = require('../argument/error');


/*:nodoc:*
 * new ChoicesPseudoAction(name, help)
 *
 * Create pseudo action for correct help text
 *
 **/
function ChoicesPseudoAction(name, help) {
  var options = {
    optionStrings: [],
    dest: name,
    help: help
  };

  Action.call(this, options);
}

util.inherits(ChoicesPseudoAction, Action);

/**
 * new ActionSubparsers(options)
 * - options (object): options hash see [[Action.new]]
 *
 **/
function ActionSubparsers(options) {
  options = options || {};
  options.dest = options.dest || c.SUPPRESS;
  options.nargs = c.PARSER;

  this.debug = (options.debug === true);

  this._progPrefix = options.prog;
  this._parserClass = options.parserClass;
  this._nameParserMap = {};
  this._choicesActions = [];

  options.choices = this._nameParserMap;
  Action.call(this, options);
}

util.inherits(ActionSubparsers, Action);

/*:nodoc:*
 * ActionSubparsers#addParser(name, options) -> ArgumentParser
 * - name (string): sub-command name
 * - options (object): see [[ArgumentParser.new]]
 *
 *  Note:
 *  addParser supports an additional aliases option,
 *  which allows multiple strings to refer to the same subparser.
 *  This example, like svn, aliases co as a shorthand for checkout
 *
 **/
ActionSubparsers.prototype.addParser = function (name, options) {
  var parser;

  var self = this;

  options = options || {};

  options.debug = (this.debug === true);

  // set program from the existing prefix
  if (!options.prog) {
    options.prog = this._progPrefix + ' ' + name;
  }

  var aliases = options.aliases || [];

  // create a pseudo-action to hold the choice help
  if (!!options.help || typeof options.help === 'string') {
    var help = options.help;
    delete options.help;

    var choiceAction = new ChoicesPseudoAction(name, help);
    this._choicesActions.push(choiceAction);
  }

  // create the parser and add it to the map
  parser = new this._parserClass(options);
  this._nameParserMap[name] = parser;

  // make parser available under aliases also
  aliases.forEach(function (alias) {
    self._nameParserMap[alias] = parser;
  });

  return parser;
};

ActionSubparsers.prototype._getSubactions = function () {
  return this._choicesActions;
};

/*:nodoc:*
 * ActionSubparsers#call(parser, namespace, values, optionString) -> Void
 * - parser (ArgumentParser): current parser
 * - namespace (Namespace): namespace for output data
 * - values (Array): parsed values
 * - optionString (Array): input option string(not parsed)
 *
 * Call the action. Parse input aguments
 **/
ActionSubparsers.prototype.call = function (parser, namespace, values) {
  var parserName = values[0];
  var argStrings = values.slice(1);

  // set the parser name if requested
  if (this.dest !== c.SUPPRESS) {
    namespace[this.dest] = parserName;
  }

  // select the parser
  if (this._nameParserMap[parserName]) {
    parser = this._nameParserMap[parserName];
  } else {
    throw argumentErrorHelper(format(
      'Unknown parser "%s" (choices: [%s]).',
        parserName,
        Object.keys(this._nameParserMap).join(', ')
    ));
  }

  // parse all the remaining options into the namespace
  parser.parseArgs(argStrings, namespace);
};

module.exports = ActionSubparsers;
/*:nodoc:*
 * class ActionVersion
 *
 * Support action for printing program version
 * This class inherited from [[Action]]
 **/
'use strict';

var util = require('util');

var Action = require('../action');

//
// Constants
//
var c = require('../const');

/*:nodoc:*
 * new ActionVersion(options)
 * - options (object): options hash see [[Action.new]]
 *
 **/
var ActionVersion = module.exports = function ActionVersion(options) {
  options = options || {};
  options.defaultValue = (options.defaultValue ? options.defaultValue : c.SUPPRESS);
  options.dest = (options.dest || c.SUPPRESS);
  options.nargs = 0;
  this.version = options.version;
  Action.call(this, options);
};
util.inherits(ActionVersion, Action);

/*:nodoc:*
 * ActionVersion#call(parser, namespace, values, optionString) -> Void
 * - parser (ArgumentParser): current parser
 * - namespace (Namespace): namespace for output data
 * - values (Array): parsed values
 * - optionString (Array): input option string(not parsed)
 *
 * Print version and exit
 **/
ActionVersion.prototype.call = function (parser) {
  var version = this.version || parser.version;
  var formatter = parser._getFormatter();
  formatter.addText(version);
  parser.exit(0, formatter.formatHelp());
};
/*:nodoc:*
 * class ActionStoreConstant
 *
 * This action stores the value specified by the const keyword argument.
 * (Note that the const keyword argument defaults to the rather unhelpful null.)
 * The 'store_const' action is most commonly used with optional
 * arguments that specify some sort of flag.
 *
 * This class inherited from [[Action]]
 **/
'use strict';

var util = require('util');

var Action = require('../../action');

/*:nodoc:*
 * new ActionStoreConstant(options)
 * - options (object): options hash see [[Action.new]]
 *
 **/
var ActionStoreConstant = module.exports = function ActionStoreConstant(options) {
  options = options || {};
  options.nargs = 0;
  if (typeof options.constant === 'undefined') {
    throw new Error('constant option is required for storeAction');
  }
  Action.call(this, options);
};
util.inherits(ActionStoreConstant, Action);

/*:nodoc:*
 * ActionStoreConstant#call(parser, namespace, values, optionString) -> Void
 * - parser (ArgumentParser): current parser
 * - namespace (Namespace): namespace for output data
 * - values (Array): parsed values
 * - optionString (Array): input option string(not parsed)
 *
 * Call the action. Save result in namespace object
 **/
ActionStoreConstant.prototype.call = function (parser, namespace) {
  namespace.set(this.dest, this.constant);
};
/*:nodoc:*
 * class ActionStoreFalse
 *
 * This action store the values False respectively.
 * This is special cases of 'storeConst'
 *
 * This class inherited from [[Action]]
 **/

'use strict';

var util = require('util');

var ActionStoreConstant = require('./constant');

/*:nodoc:*
 * new ActionStoreFalse(options)
 * - options (object): hash of options see [[Action.new]]
 *
 **/
var ActionStoreFalse = module.exports = function ActionStoreFalse(options) {
  options = options || {};
  options.constant = false;
  options.defaultValue = options.defaultValue !== null ? options.defaultValue : true;
  ActionStoreConstant.call(this, options);
};
util.inherits(ActionStoreFalse, ActionStoreConstant);
/*:nodoc:*
 * class ActionStoreTrue
 *
 * This action store the values True respectively.
 * This isspecial cases of 'storeConst'
 *
 * This class inherited from [[Action]]
 **/
'use strict';

var util = require('util');

var ActionStoreConstant = require('./constant');

/*:nodoc:*
 * new ActionStoreTrue(options)
 * - options (object): options hash see [[Action.new]]
 *
 **/
var ActionStoreTrue = module.exports = function ActionStoreTrue(options) {
  options = options || {};
  options.constant = true;
  options.defaultValue = options.defaultValue !== null ? options.defaultValue : false;
  ActionStoreConstant.call(this, options);
};
util.inherits(ActionStoreTrue, ActionStoreConstant);
/*:nodoc:*
 * class ActionAppendConstant
 *
 * This stores a list, and appends the value specified by
 * the const keyword argument to the list.
 * (Note that the const keyword argument defaults to null.)
 * The 'appendConst' action is typically useful when multiple
 * arguments need to store constants to the same list.
 *
 * This class inherited from [[Action]]
 **/

'use strict';

var util = require('util');

var Action = require('../../action');

/*:nodoc:*
 * new ActionAppendConstant(options)
 * - options (object): options hash see [[Action.new]]
 *
 **/
var ActionAppendConstant = module.exports = function ActionAppendConstant(options) {
  options = options || {};
  options.nargs = 0;
  if (typeof options.constant === 'undefined') {
    throw new Error('constant option is required for appendAction');
  }
  Action.call(this, options);
};
util.inherits(ActionAppendConstant, Action);

/*:nodoc:*
 * ActionAppendConstant#call(parser, namespace, values, optionString) -> Void
 * - parser (ArgumentParser): current parser
 * - namespace (Namespace): namespace for output data
 * - values (Array): parsed values
 * - optionString (Array): input option string(not parsed)
 *
 * Call the action. Save result in namespace object
 **/
ActionAppendConstant.prototype.call = function (parser, namespace) {
  var items = [].concat(namespace[this.dest] || []);
  items.push(this.constant);
  namespace.set(this.dest, items);
};
The MIT License (MIT)

Copyright (c) 2016 Alex Indigo

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.
/* eslint no-console: "off" */

var asynckit = require('./')
  , async    = require('async')
  , assert   = require('assert')
  , expected = 0
  ;

var Benchmark = require('benchmark');
var suite = new Benchmark.Suite;

var source = [];
for (var z = 1; z < 100; z++)
{
  source.push(z);
  expected += z;
}

suite
// add tests

.add('async.map', function(deferred)
{
  var total = 0;

  async.map(source,
  function(i, cb)
  {
    setImmediate(function()
    {
      total += i;
      cb(null, total);
    });
  },
  function(err, result)
  {
    assert.ifError(err);
    assert.equal(result[result.length - 1], expected);
    deferred.resolve();
  });
}, {'defer': true})


.add('asynckit.parallel', function(deferred)
{
  var total = 0;

  asynckit.parallel(source,
  function(i, cb)
  {
    setImmediate(function()
    {
      total += i;
      cb(null, total);
    });
  },
  function(err, result)
  {
    assert.ifError(err);
    assert.equal(result[result.length - 1], expected);
    deferred.resolve();
  });
}, {'defer': true})


// add listeners
.on('cycle', function(ev)
{
  console.log(String(ev.target));
})
.on('complete', function()
{
  console.log('Fastest is ' + this.filter('fastest').map('name'));
})
// run async
.run({ 'async': true });
module.exports =
{
  parallel      : require('./parallel.js'),
  serial        : require('./serial.js'),
  serialOrdered : require('./serialOrdered.js')
};
{
  "name": "asynckit",
  "version": "0.4.0",
  "description": "Minimal async jobs utility library, with streams support",
  "main": "index.js",
  "pre-commit": [
    "clean",
    "lint",
    "test",
    "browser",
    "report",
    "size"
  ],
  "repository": {
    "type": "git",
    "url": "git+https://github.com/alexindigo/asynckit.git"
  },
  "author": "Alex Indigo <iam@alexindigo.com>",
  "license": "MIT",
  "homepage": "https://github.com/alexindigo/asynckit#readme",
  "devDependencies": {
    "browserify": "^13.0.0",
    "browserify-istanbul": "^2.0.0",
    "coveralls": "^2.11.9",
    "eslint": "^2.9.0",
    "istanbul": "^0.4.3",
    "obake": "^0.1.2",
    "phantomjs-prebuilt": "^2.1.7",
    "pre-commit": "^1.1.3",
    "reamde": "^1.1.0",
    "rimraf": "^2.5.2",
    "size-table": "^0.2.0",
    "tap-spec": "^4.1.1",
    "tape": "^4.5.1"
  },
  "dependencies": {}
}var iterate    = require('./lib/iterate.js')
  , initState  = require('./lib/state.js')
  , terminator = require('./lib/terminator.js')
  ;

// Public API
module.exports = parallel;

/**
 * Runs iterator over provided array elements in parallel
 *
 * @param   {array|object} list - array or object (named list) to iterate over
 * @param   {function} iterator - iterator to run
 * @param   {function} callback - invoked when all elements processed
 * @returns {function} - jobs terminator
 */
function parallel(list, iterator, callback)
{
  var state = initState(list);

  while (state.index < (state['keyedList'] || list).length)
  {
    iterate(list, iterator, state, function(error, result)
    {
      if (error)
      {
        callback(error, result);
        return;
      }

      // looks like it's the last one
      if (Object.keys(state.jobs).length === 0)
      {
        callback(null, state.results);
        return;
      }
    });

    state.index++;
  }

  return terminator.bind(state, callback);
}
var serialOrdered = require('./serialOrdered.js');

// Public API
module.exports = serial;

/**
 * Runs iterator over provided array elements in series
 *
 * @param   {array|object} list - array or object (named list) to iterate over
 * @param   {function} iterator - iterator to run
 * @param   {function} callback - invoked when all elements processed
 * @returns {function} - jobs terminator
 */
function serial(list, iterator, callback)
{
  return serialOrdered(list, iterator, null, callback);
}
var iterate    = require('./lib/iterate.js')
  , initState  = require('./lib/state.js')
  , terminator = require('./lib/terminator.js')
  ;

// Public API
module.exports = serialOrdered;
// sorting helpers
module.exports.ascending  = ascending;
module.exports.descending = descending;

/**
 * Runs iterator over provided sorted array elements in series
 *
 * @param   {array|object} list - array or object (named list) to iterate over
 * @param   {function} iterator - iterator to run
 * @param   {function} sortMethod - custom sort function
 * @param   {function} callback - invoked when all elements processed
 * @returns {function} - jobs terminator
 */
function serialOrdered(list, iterator, sortMethod, callback)
{
  var state = initState(list, sortMethod);

  iterate(list, iterator, state, function iteratorHandler(error, result)
  {
    if (error)
    {
      callback(error, result);
      return;
    }

    state.index++;

    // are we there yet?
    if (state.index < (state['keyedList'] || list).length)
    {
      iterate(list, iterator, state, iteratorHandler);
      return;
    }

    // done here
    callback(null, state.results);
  });

  return terminator.bind(state, callback);
}

/*
 * -- Sort methods
 */

/**
 * sort helper to sort array elements in ascending order
 *
 * @param   {mixed} a - an item to compare
 * @param   {mixed} b - an item to compare
 * @returns {number} - comparison result
 */
function ascending(a, b)
{
  return a < b ? -1 : a > b ? 1 : 0;
}

/**
 * sort helper to sort array elements in descending order
 *
 * @param   {mixed} a - an item to compare
 * @param   {mixed} b - an item to compare
 * @returns {number} - comparison result
 */
function descending(a, b)
{
  return -1 * ascending(a, b);
}
var inherits              = require('util').inherits
  , Readable              = require('stream').Readable
  , ReadableAsyncKit      = require('./lib/readable_asynckit.js')
  , ReadableParallel      = require('./lib/readable_parallel.js')
  , ReadableSerial        = require('./lib/readable_serial.js')
  , ReadableSerialOrdered = require('./lib/readable_serial_ordered.js')
  ;

// API
module.exports =
{
  parallel      : ReadableParallel,
  serial        : ReadableSerial,
  serialOrdered : ReadableSerialOrdered, 
};

inherits(ReadableAsyncKit, Readable);

inherits(ReadableParallel, ReadableAsyncKit);
inherits(ReadableSerial, ReadableAsyncKit);
inherits(ReadableSerialOrdered, ReadableAsyncKit);
// API
module.exports = abort;

/**
 * Aborts leftover active jobs
 *
 * @param {object} state - current state object
 */
function abort(state)
{
  Object.keys(state.jobs).forEach(clean.bind(state));

  // reset leftover jobs
  state.jobs = {};
}

/**
 * Cleans up leftover job by invoking abort function for the provided job id
 *
 * @this  state
 * @param {string|number} key - job id to abort
 */
function clean(key)
{
  if (typeof this.jobs[key] == 'function')
  {
    this.jobs[key]();
  }
}
var defer = require('./defer.js');

// API
module.exports = async;

/**
 * Runs provided callback asynchronously
 * even if callback itself is not
 *
 * @param   {function} callback - callback to invoke
 * @returns {function} - augmented callback
 */
function async(callback)
{
  var isAsync = false;

  // check if async happened
  defer(function() { isAsync = true; });

  return function async_callback(err, result)
  {
    if (isAsync)
    {
      callback(err, result);
    }
    else
    {
      defer(function nextTick_callback()
      {
        callback(err, result);
      });
    }
  };
}
module.exports = defer;

/**
 * Runs provided function on next iteration of the event loop
 *
 * @param {function} fn - function to run
 */
function defer(fn)
{
  var nextTick = typeof setImmediate == 'function'
    ? setImmediate
    : (
      typeof process == 'object' && typeof process.nextTick == 'function'
      ? process.nextTick
      : null
    );

  if (nextTick)
  {
    nextTick(fn);
  }
  else
  {
    setTimeout(fn, 0);
  }
}
var async = require('./async.js')
  , abort = require('./abort.js')
  ;

// API
module.exports = iterate;

/**
 * Iterates over each job object
 *
 * @param {array|object} list - array or object (named list) to iterate over
 * @param {function} iterator - iterator to run
 * @param {object} state - current job status
 * @param {function} callback - invoked when all elements processed
 */
function iterate(list, iterator, state, callback)
{
  // store current index
  var key = state['keyedList'] ? state['keyedList'][state.index] : state.index;

  state.jobs[key] = runJob(iterator, key, list[key], function(error, output)
  {
    // don't repeat yourself
    // skip secondary callbacks
    if (!(key in state.jobs))
    {
      return;
    }

    // clean up jobs
    delete state.jobs[key];

    if (error)
    {
      // don't process rest of the results
      // stop still active jobs
      // and reset the list
      abort(state);
    }
    else
    {
      state.results[key] = output;
    }

    // return salvaged results
    callback(error, state.results);
  });
}

/**
 * Runs iterator over provided job element
 *
 * @param   {function} iterator - iterator to invoke
 * @param   {string|number} key - key/index of the element in the list of jobs
 * @param   {mixed} item - job description
 * @param   {function} callback - invoked after iterator is done with the job
 * @returns {function|mixed} - job abort function or something else
 */
function runJob(iterator, key, item, callback)
{
  var aborter;

  // allow shortcut if iterator expects only two arguments
  if (iterator.length == 2)
  {
    aborter = iterator(item, async(callback));
  }
  // otherwise go with full three arguments
  else
  {
    aborter = iterator(item, key, async(callback));
  }

  return aborter;
}
var streamify = require('./streamify.js')
  , defer     = require('./defer.js')
  ;

// API
module.exports = ReadableAsyncKit;

/**
 * Base constructor for all streams
 * used to hold properties/methods
 */
function ReadableAsyncKit()
{
  ReadableAsyncKit.super_.apply(this, arguments);

  // list of active jobs
  this.jobs = {};

  // add stream methods
  this.destroy = destroy;
  this._start  = _start;
  this._read   = _read;
}

/**
 * Destroys readable stream,
 * by aborting outstanding jobs
 *
 * @returns {void}
 */
function destroy()
{
  if (this.destroyed)
  {
    return;
  }

  this.destroyed = true;

  if (typeof this.terminator == 'function')
  {
    this.terminator();
  }
}

/**
 * Starts provided jobs in async manner
 *
 * @private
 */
function _start()
{
  // first argument – runner function
  var runner = arguments[0]
    // take away first argument
    , args   = Array.prototype.slice.call(arguments, 1)
      // second argument - input data
    , input  = args[0]
      // last argument - result callback
    , endCb  = streamify.callback.call(this, args[args.length - 1])
    ;

  args[args.length - 1] = endCb;
  // third argument - iterator
  args[1] = streamify.iterator.call(this, args[1]);

  // allow time for proper setup
  defer(function()
  {
    if (!this.destroyed)
    {
      this.terminator = runner.apply(null, args);
    }
    else
    {
      endCb(null, Array.isArray(input) ? [] : {});
    }
  }.bind(this));
}


/**
 * Implement _read to comply with Readable streams
 * Doesn't really make sense for flowing object mode
 *
 * @private
 */
function _read()
{

}
var parallel = require('../parallel.js');

// API
module.exports = ReadableParallel;

/**
 * Streaming wrapper to `asynckit.parallel`
 *
 * @param   {array|object} list - array or object (named list) to iterate over
 * @param   {function} iterator - iterator to run
 * @param   {function} callback - invoked when all elements processed
 * @returns {stream.Readable#}
 */
function ReadableParallel(list, iterator, callback)
{
  if (!(this instanceof ReadableParallel))
  {
    return new ReadableParallel(list, iterator, callback);
  }

  // turn on object mode
  ReadableParallel.super_.call(this, {objectMode: true});

  this._start(parallel, list, iterator, callback);
}
var serial = require('../serial.js');

// API
module.exports = ReadableSerial;

/**
 * Streaming wrapper to `asynckit.serial`
 *
 * @param   {array|object} list - array or object (named list) to iterate over
 * @param   {function} iterator - iterator to run
 * @param   {function} callback - invoked when all elements processed
 * @returns {stream.Readable#}
 */
function ReadableSerial(list, iterator, callback)
{
  if (!(this instanceof ReadableSerial))
  {
    return new ReadableSerial(list, iterator, callback);
  }

  // turn on object mode
  ReadableSerial.super_.call(this, {objectMode: true});

  this._start(serial, list, iterator, callback);
}
var serialOrdered = require('../serialOrdered.js');

// API
module.exports = ReadableSerialOrdered;
// expose sort helpers
module.exports.ascending  = serialOrdered.ascending;
module.exports.descending = serialOrdered.descending;

/**
 * Streaming wrapper to `asynckit.serialOrdered`
 *
 * @param   {array|object} list - array or object (named list) to iterate over
 * @param   {function} iterator - iterator to run
 * @param   {function} sortMethod - custom sort function
 * @param   {function} callback - invoked when all elements processed
 * @returns {stream.Readable#}
 */
function ReadableSerialOrdered(list, iterator, sortMethod, callback)
{
  if (!(this instanceof ReadableSerialOrdered))
  {
    return new ReadableSerialOrdered(list, iterator, sortMethod, callback);
  }

  // turn on object mode
  ReadableSerialOrdered.super_.call(this, {objectMode: true});

  this._start(serialOrdered, list, iterator, sortMethod, callback);
}
// API
module.exports = state;

/**
 * Creates initial state object
 * for iteration over list
 *
 * @param   {array|object} list - list to iterate over
 * @param   {function|null} sortMethod - function to use for keys sort,
 *                                     or `null` to keep them as is
 * @returns {object} - initial state object
 */
function state(list, sortMethod)
{
  var isNamedList = !Array.isArray(list)
    , initState =
    {
      index    : 0,
      keyedList: isNamedList || sortMethod ? Object.keys(list) : null,
      jobs     : {},
      results  : isNamedList ? {} : [],
      size     : isNamedList ? Object.keys(list).length : list.length
    }
    ;

  if (sortMethod)
  {
    // sort array keys based on it's values
    // sort object's keys just on own merit
    initState.keyedList.sort(isNamedList ? sortMethod : function(a, b)
    {
      return sortMethod(list[a], list[b]);
    });
  }

  return initState;
}
var async = require('./async.js');

// API
module.exports = {
  iterator: wrapIterator,
  callback: wrapCallback
};

/**
 * Wraps iterators with long signature
 *
 * @this    ReadableAsyncKit#
 * @param   {function} iterator - function to wrap
 * @returns {function} - wrapped function
 */
function wrapIterator(iterator)
{
  var stream = this;

  return function(item, key, cb)
  {
    var aborter
      , wrappedCb = async(wrapIteratorCallback.call(stream, cb, key))
      ;

    stream.jobs[key] = wrappedCb;

    // it's either shortcut (item, cb)
    if (iterator.length == 2)
    {
      aborter = iterator(item, wrappedCb);
    }
    // or long format (item, key, cb)
    else
    {
      aborter = iterator(item, key, wrappedCb);
    }

    return aborter;
  };
}

/**
 * Wraps provided callback function
 * allowing to execute snitch function before
 * real callback
 *
 * @this    ReadableAsyncKit#
 * @param   {function} callback - function to wrap
 * @returns {function} - wrapped function
 */
function wrapCallback(callback)
{
  var stream = this;

  var wrapped = function(error, result)
  {
    return finisher.call(stream, error, result, callback);
  };

  return wrapped;
}

/**
 * Wraps provided iterator callback function
 * makes sure snitch only called once,
 * but passes secondary calls to the original callback
 *
 * @this    ReadableAsyncKit#
 * @param   {function} callback - callback to wrap
 * @param   {number|string} key - iteration key
 * @returns {function} wrapped callback
 */
function wrapIteratorCallback(callback, key)
{
  var stream = this;

  return function(error, output)
  {
    // don't repeat yourself
    if (!(key in stream.jobs))
    {
      callback(error, output);
      return;
    }

    // clean up jobs
    delete stream.jobs[key];

    return streamer.call(stream, error, {key: key, value: output}, callback);
  };
}

/**
 * Stream wrapper for iterator callback
 *
 * @this  ReadableAsyncKit#
 * @param {mixed} error - error response
 * @param {mixed} output - iterator output
 * @param {function} callback - callback that expects iterator results
 */
function streamer(error, output, callback)
{
  if (error && !this.error)
  {
    this.error = error;
    this.pause();
    this.emit('error', error);
    // send back value only, as expected
    callback(error, output && output.value);
    return;
  }

  // stream stuff
  this.push(output);

  // back to original track
  // send back value only, as expected
  callback(error, output && output.value);
}

/**
 * Stream wrapper for finishing callback
 *
 * @this  ReadableAsyncKit#
 * @param {mixed} error - error response
 * @param {mixed} output - iterator output
 * @param {function} callback - callback that expects final results
 */
function finisher(error, output, callback)
{
  // signal end of the stream
  // only for successfully finished streams
  if (!error)
  {
    this.push(null);
  }

  // back to original track
  callback(error, output);
}
var abort = require('./abort.js')
  , async = require('./async.js')
  ;

// API
module.exports = terminator;

/**
 * Terminates jobs in the attached state context
 *
 * @this  AsyncKitState#
 * @param {function} callback - final callback to invoke after termination
 */
function terminator(callback)
{
  if (!Object.keys(this.jobs).length)
  {
    return;
  }

  // fast forward iteration index
  this.index = this.size;

  // abort jobs
  abort(this);

  // send back results we have so far
  async(callback)(null, this.results);
}
Copyright (c) 2014-present Matt Zabriskie

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.
# Security Policy

## Reporting a Vulnerability

Please report security issues to jasonsaayman@gmail.com
# Upgrade Guide

### 0.18.x -> 0.19.0

#### HTTPS Proxies

Routing through an https proxy now requires setting the `protocol` attribute of the proxy configuration to `https`

### 0.15.x -> 0.16.0

#### `Promise` Type Declarations

The `Promise` type declarations have been removed from the axios typings in favor of the built-in type declarations. If you use axios in a TypeScript project that targets `ES5`, please make sure to include the `es2015.promise` lib. Please see [this post](https://blog.mariusschulz.com/2016/11/25/typescript-2-0-built-in-type-declarations) for details.

### 0.13.x -> 0.14.0

#### TypeScript Definitions

The axios TypeScript definitions have been updated to match the axios API and use the ES2015 module syntax.

Please use the following `import` statement to import axios in TypeScript:

```typescript
import axios from 'axios';

axios.get('/foo')
  .then(response => console.log(response))
  .catch(error => console.log(error));
```

#### `agent` Config Option

The `agent` config option has been replaced with two new options: `httpAgent` and `httpsAgent`. Please use them instead.

```js
{
  // Define a custom agent for HTTP
  httpAgent: new http.Agent({ keepAlive: true }),
  // Define a custom agent for HTTPS
  httpsAgent: new https.Agent({ keepAlive: true })
}
```

#### `progress` Config Option

The `progress` config option has been replaced with the `onUploadProgress` and `onDownloadProgress` options.

```js
{
  // Define a handler for upload progress events
  onUploadProgress: function (progressEvent) {
    // ...
  },

  // Define a handler for download progress events
  onDownloadProgress: function (progressEvent) {
    // ...
  }
}
```

### 0.12.x -> 0.13.0

The `0.13.0` release contains several changes to custom adapters and error handling.

#### Error Handling

Previous to this release an error could either be a server response with bad status code or an actual `Error`. With this release Promise will always reject with an `Error`. In the case that a response was received, the `Error` will also include the response.

```js
axios.get('/user/12345')
  .catch((error) => {
    console.log(error.message);
    console.log(error.code); // Not always specified
    console.log(error.config); // The config that was used to make the request
    console.log(error.response); // Only available if response was received from the server
  });
```

#### Request Adapters

This release changes a few things about how request adapters work. Please take note if you are using your own custom adapter.

1. Response transformer is now called outside of adapter.
2. Request adapter returns a `Promise`.

This means that you no longer need to invoke `transformData` on response data. You will also no longer receive `resolve` and `reject` as arguments in your adapter.

Previous code:

```js
function myAdapter(resolve, reject, config) {
  var response = {
    data: transformData(
      responseData,
      responseHeaders,
      config.transformResponse
    ),
    status: request.status,
    statusText: request.statusText,
    headers: responseHeaders
  };
  settle(resolve, reject, response);
}
```

New code:

```js
function myAdapter(config) {
  return new Promise(function (resolve, reject) {
    var response = {
      data: responseData,
      status: request.status,
      statusText: request.statusText,
      headers: responseHeaders
    };
    settle(resolve, reject, response);
  });
}
```

See the related commits for more details:
- [Response transformers](https://github.com/axios/axios/commit/10eb23865101f9347570552c04e9d6211376e25e)
- [Request adapter Promise](https://github.com/axios/axios/commit/157efd5615890301824e3121cc6c9d2f9b21f94a)

### 0.5.x -> 0.6.0

The `0.6.0` release contains mostly bug fixes, but there are a couple things to be aware of when upgrading.

#### ES6 Promise Polyfill

Up until the `0.6.0` release ES6 `Promise` was being polyfilled using [es6-promise](https://github.com/jakearchibald/es6-promise). With this release, the polyfill has been removed, and you will need to supply it yourself if your environment needs it.

```js
require('es6-promise').polyfill();
var axios = require('axios');
```

This will polyfill the global environment, and only needs to be done once.

#### `axios.success`/`axios.error`

The `success`, and `error` aliases were deprecated in [0.4.0](https://github.com/axios/axios/blob/master/CHANGELOG.md#040-oct-03-2014). As of this release they have been removed entirely. Instead please use `axios.then`, and `axios.catch` respectively.

```js
axios.get('some/url')
  .then(function (res) {
    /* ... */
  })
  .catch(function (err) {
    /* ... */
  });
```

#### UMD

Previous versions of axios shipped with an AMD, CommonJS, and Global build. This has all been rolled into a single UMD build.

```js
// AMD
require(['bower_components/axios/dist/axios'], function (axios) {
  /* ... */
});

// CommonJS
var axios = require('axios/dist/axios');
```
module.exports = require('./lib/axios');{
  "name": "axios",
  "version": "0.27.2",
  "description": "Promise based HTTP client for the browser and node.js",
  "main": "index.js",
  "types": "index.d.ts",
  "repository": {
    "type": "git",
    "url": "https://github.com/axios/axios.git"
  },
  "author": "Matt Zabriskie",
  "license": "MIT",
  "homepage": "https://axios-http.com",
  "devDependencies": {
    "abortcontroller-polyfill": "^1.7.3",
    "coveralls": "^3.1.1",
    "dtslint": "^4.2.1",
    "es6-promise": "^4.2.8",
    "formidable": "^2.0.1",
    "grunt": "^1.4.1",
    "grunt-banner": "^0.6.0",
    "grunt-cli": "^1.4.3",
    "grunt-contrib-clean": "^2.0.0",
    "grunt-contrib-watch": "^1.1.0",
    "grunt-eslint": "^24.0.0",
    "grunt-karma": "^4.0.2",
    "grunt-mocha-test": "^0.13.3",
    "grunt-webpack": "^5.0.0",
    "istanbul-instrumenter-loader": "^3.0.1",
    "jasmine-core": "^2.4.1",
    "karma": "^6.3.17",
    "karma-chrome-launcher": "^3.1.1",
    "karma-firefox-launcher": "^2.1.2",
    "karma-jasmine": "^1.1.1",
    "karma-jasmine-ajax": "^0.1.13",
    "karma-safari-launcher": "^1.0.0",
    "karma-sauce-launcher": "^4.3.6",
    "karma-sinon": "^1.0.5",
    "karma-sourcemap-loader": "^0.3.8",
    "karma-webpack": "^4.0.2",
    "load-grunt-tasks": "^5.1.0",
    "minimist": "^1.2.6",
    "mocha": "^8.2.1",
    "sinon": "^4.5.0",
    "terser-webpack-plugin": "^4.2.3",
    "typescript": "^4.6.3",
    "url-search-params": "^0.10.0",
    "webpack": "^4.44.2",
    "webpack-dev-server": "^3.11.0"
  },
  "browser": {
    "./lib/adapters/http.js": "./lib/adapters/xhr.js",
    "./lib/defaults/env/FormData.js": "./lib/helpers/null.js"
  },
  "jsdelivr": "dist/axios.min.js",
  "unpkg": "dist/axios.min.js",
  "typings": "./index.d.ts",
  "dependencies": {
    "follow-redirects": "^1.14.9",
    "form-data": "^4.0.0"
  },
  "bundlesize": [
    {
      "path": "./dist/axios.min.js",
      "threshold": "5kB"
    }
  ]
}{
  "compilerOptions": {
    "module": "es2015",
    "lib": ["dom", "es2015"],
    "types": [],
    "moduleResolution": "node",
    "strict": true,
    "noEmit": true,
    "baseUrl": ".",
    "paths": {
      "axios": ["."]
    }
  }
}
{ 
  "extends": "dtslint/dtslint.json",
  "rules": {
    "no-unnecessary-generics": false
  }
}
'use strict';

var utils = require('./utils');
var bind = require('./helpers/bind');
var Axios = require('./core/Axios');
var mergeConfig = require('./core/mergeConfig');
var defaults = require('./defaults');

/**
 * Create an instance of Axios
 *
 * @param {Object} defaultConfig The default config for the instance
 * @return {Axios} A new instance of Axios
 */
function createInstance(defaultConfig) {
  var context = new Axios(defaultConfig);
  var instance = bind(Axios.prototype.request, context);

  // Copy axios.prototype to instance
  utils.extend(instance, Axios.prototype, context);

  // Copy context to instance
  utils.extend(instance, context);

  // Factory for creating new instances
  instance.create = function create(instanceConfig) {
    return createInstance(mergeConfig(defaultConfig, instanceConfig));
  };

  return instance;
}

// Create the default instance to be exported
var axios = createInstance(defaults);

// Expose Axios class to allow class inheritance
axios.Axios = Axios;

// Expose Cancel & CancelToken
axios.CanceledError = require('./cancel/CanceledError');
axios.CancelToken = require('./cancel/CancelToken');
axios.isCancel = require('./cancel/isCancel');
axios.VERSION = require('./env/data').version;
axios.toFormData = require('./helpers/toFormData');

// Expose AxiosError class
axios.AxiosError = require('../lib/core/AxiosError');

// alias for CanceledError for backward compatibility
axios.Cancel = axios.CanceledError;

// Expose all/spread
axios.all = function all(promises) {
  return Promise.all(promises);
};
axios.spread = require('./helpers/spread');

// Expose isAxiosError
axios.isAxiosError = require('./helpers/isAxiosError');

module.exports = axios;

// Allow use of default import syntax in TypeScript
module.exports.default = axios;
'use strict';

var bind = require('./helpers/bind');

// utils is a library of generic helper functions non-specific to axios

var toString = Object.prototype.toString;

// eslint-disable-next-line func-names
var kindOf = (function(cache) {
  // eslint-disable-next-line func-names
  return function(thing) {
    var str = toString.call(thing);
    return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());
  };
})(Object.create(null));

function kindOfTest(type) {
  type = type.toLowerCase();
  return function isKindOf(thing) {
    return kindOf(thing) === type;
  };
}

/**
 * Determine if a value is an Array
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is an Array, otherwise false
 */
function isArray(val) {
  return Array.isArray(val);
}

/**
 * Determine if a value is undefined
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if the value is undefined, otherwise false
 */
function isUndefined(val) {
  return typeof val === 'undefined';
}

/**
 * Determine if a value is a Buffer
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a Buffer, otherwise false
 */
function isBuffer(val) {
  return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)
    && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val);
}

/**
 * Determine if a value is an ArrayBuffer
 *
 * @function
 * @param {Object} val The value to test
 * @returns {boolean} True if value is an ArrayBuffer, otherwise false
 */
var isArrayBuffer = kindOfTest('ArrayBuffer');


/**
 * Determine if a value is a view on an ArrayBuffer
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false
 */
function isArrayBufferView(val) {
  var result;
  if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {
    result = ArrayBuffer.isView(val);
  } else {
    result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));
  }
  return result;
}

/**
 * Determine if a value is a String
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a String, otherwise false
 */
function isString(val) {
  return typeof val === 'string';
}

/**
 * Determine if a value is a Number
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a Number, otherwise false
 */
function isNumber(val) {
  return typeof val === 'number';
}

/**
 * Determine if a value is an Object
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is an Object, otherwise false
 */
function isObject(val) {
  return val !== null && typeof val === 'object';
}

/**
 * Determine if a value is a plain Object
 *
 * @param {Object} val The value to test
 * @return {boolean} True if value is a plain Object, otherwise false
 */
function isPlainObject(val) {
  if (kindOf(val) !== 'object') {
    return false;
  }

  var prototype = Object.getPrototypeOf(val);
  return prototype === null || prototype === Object.prototype;
}

/**
 * Determine if a value is a Date
 *
 * @function
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a Date, otherwise false
 */
var isDate = kindOfTest('Date');

/**
 * Determine if a value is a File
 *
 * @function
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a File, otherwise false
 */
var isFile = kindOfTest('File');

/**
 * Determine if a value is a Blob
 *
 * @function
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a Blob, otherwise false
 */
var isBlob = kindOfTest('Blob');

/**
 * Determine if a value is a FileList
 *
 * @function
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a File, otherwise false
 */
var isFileList = kindOfTest('FileList');

/**
 * Determine if a value is a Function
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a Function, otherwise false
 */
function isFunction(val) {
  return toString.call(val) === '[object Function]';
}

/**
 * Determine if a value is a Stream
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a Stream, otherwise false
 */
function isStream(val) {
  return isObject(val) && isFunction(val.pipe);
}

/**
 * Determine if a value is a FormData
 *
 * @param {Object} thing The value to test
 * @returns {boolean} True if value is an FormData, otherwise false
 */
function isFormData(thing) {
  var pattern = '[object FormData]';
  return thing && (
    (typeof FormData === 'function' && thing instanceof FormData) ||
    toString.call(thing) === pattern ||
    (isFunction(thing.toString) && thing.toString() === pattern)
  );
}

/**
 * Determine if a value is a URLSearchParams object
 * @function
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a URLSearchParams object, otherwise false
 */
var isURLSearchParams = kindOfTest('URLSearchParams');

/**
 * Trim excess whitespace off the beginning and end of a string
 *
 * @param {String} str The String to trim
 * @returns {String} The String freed of excess whitespace
 */
function trim(str) {
  return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, '');
}

/**
 * Determine if we're running in a standard browser environment
 *
 * This allows axios to run in a web worker, and react-native.
 * Both environments support XMLHttpRequest, but not fully standard globals.
 *
 * web workers:
 *  typeof window -> undefined
 *  typeof document -> undefined
 *
 * react-native:
 *  navigator.product -> 'ReactNative'
 * nativescript
 *  navigator.product -> 'NativeScript' or 'NS'
 */
function isStandardBrowserEnv() {
  if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' ||
                                           navigator.product === 'NativeScript' ||
                                           navigator.product === 'NS')) {
    return false;
  }
  return (
    typeof window !== 'undefined' &&
    typeof document !== 'undefined'
  );
}

/**
 * Iterate over an Array or an Object invoking a function for each item.
 *
 * If `obj` is an Array callback will be called passing
 * the value, index, and complete array for each item.
 *
 * If 'obj' is an Object callback will be called passing
 * the value, key, and complete object for each property.
 *
 * @param {Object|Array} obj The object to iterate
 * @param {Function} fn The callback to invoke for each item
 */
function forEach(obj, fn) {
  // Don't bother if no value provided
  if (obj === null || typeof obj === 'undefined') {
    return;
  }

  // Force an array if not already something iterable
  if (typeof obj !== 'object') {
    /*eslint no-param-reassign:0*/
    obj = [obj];
  }

  if (isArray(obj)) {
    // Iterate over array values
    for (var i = 0, l = obj.length; i < l; i++) {
      fn.call(null, obj[i], i, obj);
    }
  } else {
    // Iterate over object keys
    for (var key in obj) {
      if (Object.prototype.hasOwnProperty.call(obj, key)) {
        fn.call(null, obj[key], key, obj);
      }
    }
  }
}

/**
 * Accepts varargs expecting each argument to be an object, then
 * immutably merges the properties of each object and returns result.
 *
 * When multiple objects contain the same key the later object in
 * the arguments list will take precedence.
 *
 * Example:
 *
 * ```js
 * var result = merge({foo: 123}, {foo: 456});
 * console.log(result.foo); // outputs 456
 * ```
 *
 * @param {Object} obj1 Object to merge
 * @returns {Object} Result of all merge properties
 */
function merge(/* obj1, obj2, obj3, ... */) {
  var result = {};
  function assignValue(val, key) {
    if (isPlainObject(result[key]) && isPlainObject(val)) {
      result[key] = merge(result[key], val);
    } else if (isPlainObject(val)) {
      result[key] = merge({}, val);
    } else if (isArray(val)) {
      result[key] = val.slice();
    } else {
      result[key] = val;
    }
  }

  for (var i = 0, l = arguments.length; i < l; i++) {
    forEach(arguments[i], assignValue);
  }
  return result;
}

/**
 * Extends object a by mutably adding to it the properties of object b.
 *
 * @param {Object} a The object to be extended
 * @param {Object} b The object to copy properties from
 * @param {Object} thisArg The object to bind function to
 * @return {Object} The resulting value of object a
 */
function extend(a, b, thisArg) {
  forEach(b, function assignValue(val, key) {
    if (thisArg && typeof val === 'function') {
      a[key] = bind(val, thisArg);
    } else {
      a[key] = val;
    }
  });
  return a;
}

/**
 * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)
 *
 * @param {string} content with BOM
 * @return {string} content value without BOM
 */
function stripBOM(content) {
  if (content.charCodeAt(0) === 0xFEFF) {
    content = content.slice(1);
  }
  return content;
}

/**
 * Inherit the prototype methods from one constructor into another
 * @param {function} constructor
 * @param {function} superConstructor
 * @param {object} [props]
 * @param {object} [descriptors]
 */

function inherits(constructor, superConstructor, props, descriptors) {
  constructor.prototype = Object.create(superConstructor.prototype, descriptors);
  constructor.prototype.constructor = constructor;
  props && Object.assign(constructor.prototype, props);
}

/**
 * Resolve object with deep prototype chain to a flat object
 * @param {Object} sourceObj source object
 * @param {Object} [destObj]
 * @param {Function} [filter]
 * @returns {Object}
 */

function toFlatObject(sourceObj, destObj, filter) {
  var props;
  var i;
  var prop;
  var merged = {};

  destObj = destObj || {};

  do {
    props = Object.getOwnPropertyNames(sourceObj);
    i = props.length;
    while (i-- > 0) {
      prop = props[i];
      if (!merged[prop]) {
        destObj[prop] = sourceObj[prop];
        merged[prop] = true;
      }
    }
    sourceObj = Object.getPrototypeOf(sourceObj);
  } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);

  return destObj;
}

/*
 * determines whether a string ends with the characters of a specified string
 * @param {String} str
 * @param {String} searchString
 * @param {Number} [position= 0]
 * @returns {boolean}
 */
function endsWith(str, searchString, position) {
  str = String(str);
  if (position === undefined || position > str.length) {
    position = str.length;
  }
  position -= searchString.length;
  var lastIndex = str.indexOf(searchString, position);
  return lastIndex !== -1 && lastIndex === position;
}


/**
 * Returns new array from array like object
 * @param {*} [thing]
 * @returns {Array}
 */
function toArray(thing) {
  if (!thing) return null;
  var i = thing.length;
  if (isUndefined(i)) return null;
  var arr = new Array(i);
  while (i-- > 0) {
    arr[i] = thing[i];
  }
  return arr;
}

// eslint-disable-next-line func-names
var isTypedArray = (function(TypedArray) {
  // eslint-disable-next-line func-names
  return function(thing) {
    return TypedArray && thing instanceof TypedArray;
  };
})(typeof Uint8Array !== 'undefined' && Object.getPrototypeOf(Uint8Array));

module.exports = {
  isArray: isArray,
  isArrayBuffer: isArrayBuffer,
  isBuffer: isBuffer,
  isFormData: isFormData,
  isArrayBufferView: isArrayBufferView,
  isString: isString,
  isNumber: isNumber,
  isObject: isObject,
  isPlainObject: isPlainObject,
  isUndefined: isUndefined,
  isDate: isDate,
  isFile: isFile,
  isBlob: isBlob,
  isFunction: isFunction,
  isStream: isStream,
  isURLSearchParams: isURLSearchParams,
  isStandardBrowserEnv: isStandardBrowserEnv,
  forEach: forEach,
  merge: merge,
  extend: extend,
  trim: trim,
  stripBOM: stripBOM,
  inherits: inherits,
  toFlatObject: toFlatObject,
  kindOf: kindOf,
  kindOfTest: kindOfTest,
  endsWith: endsWith,
  toArray: toArray,
  isTypedArray: isTypedArray,
  isFileList: isFileList
};
# axios // helpers

The modules found in `helpers/` should be generic modules that are _not_ specific to the domain logic of axios. These modules could theoretically be published to npm on their own and consumed by other modules or apps. Some examples of generic modules are things like:

- Browser polyfills
- Managing cookies
- Parsing HTTP headers
'use strict';

module.exports = function bind(fn, thisArg) {
  return function wrap() {
    var args = new Array(arguments.length);
    for (var i = 0; i < args.length; i++) {
      args[i] = arguments[i];
    }
    return fn.apply(thisArg, args);
  };
};
'use strict';

var utils = require('./../utils');

function encode(val) {
  return encodeURIComponent(val).
    replace(/%3A/gi, ':').
    replace(/%24/g, '$').
    replace(/%2C/gi, ',').
    replace(/%20/g, '+').
    replace(/%5B/gi, '[').
    replace(/%5D/gi, ']');
}

/**
 * Build a URL by appending params to the end
 *
 * @param {string} url The base of the url (e.g., http://www.google.com)
 * @param {object} [params] The params to be appended
 * @returns {string} The formatted url
 */
module.exports = function buildURL(url, params, paramsSerializer) {
  /*eslint no-param-reassign:0*/
  if (!params) {
    return url;
  }

  var serializedParams;
  if (paramsSerializer) {
    serializedParams = paramsSerializer(params);
  } else if (utils.isURLSearchParams(params)) {
    serializedParams = params.toString();
  } else {
    var parts = [];

    utils.forEach(params, function serialize(val, key) {
      if (val === null || typeof val === 'undefined') {
        return;
      }

      if (utils.isArray(val)) {
        key = key + '[]';
      } else {
        val = [val];
      }

      utils.forEach(val, function parseValue(v) {
        if (utils.isDate(v)) {
          v = v.toISOString();
        } else if (utils.isObject(v)) {
          v = JSON.stringify(v);
        }
        parts.push(encode(key) + '=' + encode(v));
      });
    });

    serializedParams = parts.join('&');
  }

  if (serializedParams) {
    var hashmarkIndex = url.indexOf('#');
    if (hashmarkIndex !== -1) {
      url = url.slice(0, hashmarkIndex);
    }

    url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;
  }

  return url;
};
'use strict';

/**
 * Creates a new URL by combining the specified URLs
 *
 * @param {string} baseURL The base URL
 * @param {string} relativeURL The relative URL
 * @returns {string} The combined URL
 */
module.exports = function combineURLs(baseURL, relativeURL) {
  return relativeURL
    ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '')
    : baseURL;
};
'use strict';

var utils = require('./../utils');

module.exports = (
  utils.isStandardBrowserEnv() ?

  // Standard browser envs support document.cookie
    (function standardBrowserEnv() {
      return {
        write: function write(name, value, expires, path, domain, secure) {
          var cookie = [];
          cookie.push(name + '=' + encodeURIComponent(value));

          if (utils.isNumber(expires)) {
            cookie.push('expires=' + new Date(expires).toGMTString());
          }

          if (utils.isString(path)) {
            cookie.push('path=' + path);
          }

          if (utils.isString(domain)) {
            cookie.push('domain=' + domain);
          }

          if (secure === true) {
            cookie.push('secure');
          }

          document.cookie = cookie.join('; ');
        },

        read: function read(name) {
          var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)'));
          return (match ? decodeURIComponent(match[3]) : null);
        },

        remove: function remove(name) {
          this.write(name, '', Date.now() - 86400000);
        }
      };
    })() :

  // Non standard browser env (web workers, react-native) lack needed support.
    (function nonStandardBrowserEnv() {
      return {
        write: function write() {},
        read: function read() { return null; },
        remove: function remove() {}
      };
    })()
);
'use strict';

/*eslint no-console:0*/

/**
 * Supply a warning to the developer that a method they are using
 * has been deprecated.
 *
 * @param {string} method The name of the deprecated method
 * @param {string} [instead] The alternate method to use if applicable
 * @param {string} [docs] The documentation URL to get further details
 */
module.exports = function deprecatedMethod(method, instead, docs) {
  try {
    console.warn(
      'DEPRECATED method `' + method + '`.' +
      (instead ? ' Use `' + instead + '` instead.' : '') +
      ' This method will be removed in a future release.');

    if (docs) {
      console.warn('For more information about usage see ' + docs);
    }
  } catch (e) { /* Ignore */ }
};
'use strict';

/**
 * Determines whether the specified URL is absolute
 *
 * @param {string} url The URL to test
 * @returns {boolean} True if the specified URL is absolute, otherwise false
 */
module.exports = function isAbsoluteURL(url) {
  // A URL is considered absolute if it begins with "<scheme>://" or "//" (protocol-relative URL).
  // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
  // by any combination of letters, digits, plus, period, or hyphen.
  return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url);
};
'use strict';

var utils = require('./../utils');

/**
 * Determines whether the payload is an error thrown by Axios
 *
 * @param {*} payload The value to test
 * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false
 */
module.exports = function isAxiosError(payload) {
  return utils.isObject(payload) && (payload.isAxiosError === true);
};
'use strict';

var utils = require('./../utils');

module.exports = (
  utils.isStandardBrowserEnv() ?

  // Standard browser envs have full support of the APIs needed to test
  // whether the request URL is of the same origin as current location.
    (function standardBrowserEnv() {
      var msie = /(msie|trident)/i.test(navigator.userAgent);
      var urlParsingNode = document.createElement('a');
      var originURL;

      /**
    * Parse a URL to discover it's components
    *
    * @param {String} url The URL to be parsed
    * @returns {Object}
    */
      function resolveURL(url) {
        var href = url;

        if (msie) {
        // IE needs attribute set twice to normalize properties
          urlParsingNode.setAttribute('href', href);
          href = urlParsingNode.href;
        }

        urlParsingNode.setAttribute('href', href);

        // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
        return {
          href: urlParsingNode.href,
          protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',
          host: urlParsingNode.host,
          search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '',
          hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',
          hostname: urlParsingNode.hostname,
          port: urlParsingNode.port,
          pathname: (urlParsingNode.pathname.charAt(0) === '/') ?
            urlParsingNode.pathname :
            '/' + urlParsingNode.pathname
        };
      }

      originURL = resolveURL(window.location.href);

      /**
    * Determine if a URL shares the same origin as the current location
    *
    * @param {String} requestURL The URL to test
    * @returns {boolean} True if URL shares the same origin, otherwise false
    */
      return function isURLSameOrigin(requestURL) {
        var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;
        return (parsed.protocol === originURL.protocol &&
            parsed.host === originURL.host);
      };
    })() :

  // Non standard browser envs (web workers, react-native) lack needed support.
    (function nonStandardBrowserEnv() {
      return function isURLSameOrigin() {
        return true;
      };
    })()
);
'use strict';

var utils = require('../utils');

module.exports = function normalizeHeaderName(headers, normalizedName) {
  utils.forEach(headers, function processHeader(value, name) {
    if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {
      headers[normalizedName] = value;
      delete headers[name];
    }
  });
};
// eslint-disable-next-line strict
module.exports = null;
'use strict';

var utils = require('./../utils');

// Headers whose duplicates are ignored by node
// c.f. https://nodejs.org/api/http.html#http_message_headers
var ignoreDuplicateOf = [
  'age', 'authorization', 'content-length', 'content-type', 'etag',
  'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',
  'last-modified', 'location', 'max-forwards', 'proxy-authorization',
  'referer', 'retry-after', 'user-agent'
];

/**
 * Parse headers into an object
 *
 * ```
 * Date: Wed, 27 Aug 2014 08:58:49 GMT
 * Content-Type: application/json
 * Connection: keep-alive
 * Transfer-Encoding: chunked
 * ```
 *
 * @param {String} headers Headers needing to be parsed
 * @returns {Object} Headers parsed into an object
 */
module.exports = function parseHeaders(headers) {
  var parsed = {};
  var key;
  var val;
  var i;

  if (!headers) { return parsed; }

  utils.forEach(headers.split('\n'), function parser(line) {
    i = line.indexOf(':');
    key = utils.trim(line.substr(0, i)).toLowerCase();
    val = utils.trim(line.substr(i + 1));

    if (key) {
      if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {
        return;
      }
      if (key === 'set-cookie') {
        parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);
      } else {
        parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
      }
    }
  });

  return parsed;
};
'use strict';

module.exports = function parseProtocol(url) {
  var match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url);
  return match && match[1] || '';
};
'use strict';

/**
 * Syntactic sugar for invoking a function and expanding an array for arguments.
 *
 * Common use case would be to use `Function.prototype.apply`.
 *
 *  ```js
 *  function f(x, y, z) {}
 *  var args = [1, 2, 3];
 *  f.apply(null, args);
 *  ```
 *
 * With `spread` this example can be re-written.
 *
 *  ```js
 *  spread(function(x, y, z) {})([1, 2, 3]);
 *  ```
 *
 * @param {Function} callback
 * @returns {Function}
 */
module.exports = function spread(callback) {
  return function wrap(arr) {
    return callback.apply(null, arr);
  };
};
'use strict';

var utils = require('../utils');

/**
 * Convert a data object to FormData
 * @param {Object} obj
 * @param {?Object} [formData]
 * @returns {Object}
 **/

function toFormData(obj, formData) {
  // eslint-disable-next-line no-param-reassign
  formData = formData || new FormData();

  var stack = [];

  function convertValue(value) {
    if (value === null) return '';

    if (utils.isDate(value)) {
      return value.toISOString();
    }

    if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {
      return typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);
    }

    return value;
  }

  function build(data, parentKey) {
    if (utils.isPlainObject(data) || utils.isArray(data)) {
      if (stack.indexOf(data) !== -1) {
        throw Error('Circular reference detected in ' + parentKey);
      }

      stack.push(data);

      utils.forEach(data, function each(value, key) {
        if (utils.isUndefined(value)) return;
        var fullKey = parentKey ? parentKey + '.' + key : key;
        var arr;

        if (value && !parentKey && typeof value === 'object') {
          if (utils.endsWith(key, '{}')) {
            // eslint-disable-next-line no-param-reassign
            value = JSON.stringify(value);
          } else if (utils.endsWith(key, '[]') && (arr = utils.toArray(value))) {
            // eslint-disable-next-line func-names
            arr.forEach(function(el) {
              !utils.isUndefined(el) && formData.append(fullKey, convertValue(el));
            });
            return;
          }
        }

        build(value, fullKey);
      });

      stack.pop();
    } else {
      formData.append(parentKey, convertValue(data));
    }
  }

  build(obj);

  return formData;
}

module.exports = toFormData;
'use strict';

var VERSION = require('../env/data').version;
var AxiosError = require('../core/AxiosError');

var validators = {};

// eslint-disable-next-line func-names
['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach(function(type, i) {
  validators[type] = function validator(thing) {
    return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;
  };
});

var deprecatedWarnings = {};

/**
 * Transitional option validator
 * @param {function|boolean?} validator - set to false if the transitional option has been removed
 * @param {string?} version - deprecated version / removed since version
 * @param {string?} message - some message with additional info
 * @returns {function}
 */
validators.transitional = function transitional(validator, version, message) {
  function formatMessage(opt, desc) {
    return '[Axios v' + VERSION + '] Transitional option \'' + opt + '\'' + desc + (message ? '. ' + message : '');
  }

  // eslint-disable-next-line func-names
  return function(value, opt, opts) {
    if (validator === false) {
      throw new AxiosError(
        formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),
        AxiosError.ERR_DEPRECATED
      );
    }

    if (version && !deprecatedWarnings[opt]) {
      deprecatedWarnings[opt] = true;
      // eslint-disable-next-line no-console
      console.warn(
        formatMessage(
          opt,
          ' has been deprecated since v' + version + ' and will be removed in the near future'
        )
      );
    }

    return validator ? validator(value, opt, opts) : true;
  };
};

/**
 * Assert object's properties type
 * @param {object} options
 * @param {object} schema
 * @param {boolean?} allowUnknown
 */

function assertOptions(options, schema, allowUnknown) {
  if (typeof options !== 'object') {
    throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);
  }
  var keys = Object.keys(options);
  var i = keys.length;
  while (i-- > 0) {
    var opt = keys[i];
    var validator = schema[opt];
    if (validator) {
      var value = options[opt];
      var result = value === undefined || validator(value, opt, options);
      if (result !== true) {
        throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);
      }
      continue;
    }
    if (allowUnknown !== true) {
      throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);
    }
  }
}

module.exports = {
  assertOptions: assertOptions,
  validators: validators
};
# axios // env

The `data.js` file is updated automatically when the package version is upgrading. Please do not edit it manually.
module.exports = {
  "version": "0.27.2"
};'use strict';

var utils = require('../utils');
var normalizeHeaderName = require('../helpers/normalizeHeaderName');
var AxiosError = require('../core/AxiosError');
var transitionalDefaults = require('./transitional');
var toFormData = require('../helpers/toFormData');

var DEFAULT_CONTENT_TYPE = {
  'Content-Type': 'application/x-www-form-urlencoded'
};

function setContentTypeIfUnset(headers, value) {
  if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {
    headers['Content-Type'] = value;
  }
}

function getDefaultAdapter() {
  var adapter;
  if (typeof XMLHttpRequest !== 'undefined') {
    // For browsers use XHR adapter
    adapter = require('../adapters/xhr');
  } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {
    // For node use HTTP adapter
    adapter = require('../adapters/http');
  }
  return adapter;
}

function stringifySafely(rawValue, parser, encoder) {
  if (utils.isString(rawValue)) {
    try {
      (parser || JSON.parse)(rawValue);
      return utils.trim(rawValue);
    } catch (e) {
      if (e.name !== 'SyntaxError') {
        throw e;
      }
    }
  }

  return (encoder || JSON.stringify)(rawValue);
}

var defaults = {

  transitional: transitionalDefaults,

  adapter: getDefaultAdapter(),

  transformRequest: [function transformRequest(data, headers) {
    normalizeHeaderName(headers, 'Accept');
    normalizeHeaderName(headers, 'Content-Type');

    if (utils.isFormData(data) ||
      utils.isArrayBuffer(data) ||
      utils.isBuffer(data) ||
      utils.isStream(data) ||
      utils.isFile(data) ||
      utils.isBlob(data)
    ) {
      return data;
    }
    if (utils.isArrayBufferView(data)) {
      return data.buffer;
    }
    if (utils.isURLSearchParams(data)) {
      setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');
      return data.toString();
    }

    var isObjectPayload = utils.isObject(data);
    var contentType = headers && headers['Content-Type'];

    var isFileList;

    if ((isFileList = utils.isFileList(data)) || (isObjectPayload && contentType === 'multipart/form-data')) {
      var _FormData = this.env && this.env.FormData;
      return toFormData(isFileList ? {'files[]': data} : data, _FormData && new _FormData());
    } else if (isObjectPayload || contentType === 'application/json') {
      setContentTypeIfUnset(headers, 'application/json');
      return stringifySafely(data);
    }

    return data;
  }],

  transformResponse: [function transformResponse(data) {
    var transitional = this.transitional || defaults.transitional;
    var silentJSONParsing = transitional && transitional.silentJSONParsing;
    var forcedJSONParsing = transitional && transitional.forcedJSONParsing;
    var strictJSONParsing = !silentJSONParsing && this.responseType === 'json';

    if (strictJSONParsing || (forcedJSONParsing && utils.isString(data) && data.length)) {
      try {
        return JSON.parse(data);
      } catch (e) {
        if (strictJSONParsing) {
          if (e.name === 'SyntaxError') {
            throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);
          }
          throw e;
        }
      }
    }

    return data;
  }],

  /**
   * A timeout in milliseconds to abort a request. If set to 0 (default) a
   * timeout is not created.
   */
  timeout: 0,

  xsrfCookieName: 'XSRF-TOKEN',
  xsrfHeaderName: 'X-XSRF-TOKEN',

  maxContentLength: -1,
  maxBodyLength: -1,

  env: {
    FormData: require('./env/FormData')
  },

  validateStatus: function validateStatus(status) {
    return status >= 200 && status < 300;
  },

  headers: {
    common: {
      'Accept': 'application/json, text/plain, */*'
    }
  }
};

utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {
  defaults.headers[method] = {};
});

utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
  defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);
});

module.exports = defaults;
'use strict';

module.exports = {
  silentJSONParsing: true,
  forcedJSONParsing: true,
  clarifyTimeoutError: false
};
// eslint-disable-next-line strict
module.exports = require('form-data');
'use strict';

var utils = require('./../utils');
var buildURL = require('../helpers/buildURL');
var InterceptorManager = require('./InterceptorManager');
var dispatchRequest = require('./dispatchRequest');
var mergeConfig = require('./mergeConfig');
var buildFullPath = require('./buildFullPath');
var validator = require('../helpers/validator');

var validators = validator.validators;
/**
 * Create a new instance of Axios
 *
 * @param {Object} instanceConfig The default config for the instance
 */
function Axios(instanceConfig) {
  this.defaults = instanceConfig;
  this.interceptors = {
    request: new InterceptorManager(),
    response: new InterceptorManager()
  };
}

/**
 * Dispatch a request
 *
 * @param {Object} config The config specific for this request (merged with this.defaults)
 */
Axios.prototype.request = function request(configOrUrl, config) {
  /*eslint no-param-reassign:0*/
  // Allow for axios('example/url'[, config]) a la fetch API
  if (typeof configOrUrl === 'string') {
    config = config || {};
    config.url = configOrUrl;
  } else {
    config = configOrUrl || {};
  }

  config = mergeConfig(this.defaults, config);

  // Set config.method
  if (config.method) {
    config.method = config.method.toLowerCase();
  } else if (this.defaults.method) {
    config.method = this.defaults.method.toLowerCase();
  } else {
    config.method = 'get';
  }

  var transitional = config.transitional;

  if (transitional !== undefined) {
    validator.assertOptions(transitional, {
      silentJSONParsing: validators.transitional(validators.boolean),
      forcedJSONParsing: validators.transitional(validators.boolean),
      clarifyTimeoutError: validators.transitional(validators.boolean)
    }, false);
  }

  // filter out skipped interceptors
  var requestInterceptorChain = [];
  var synchronousRequestInterceptors = true;
  this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
    if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {
      return;
    }

    synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;

    requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);
  });

  var responseInterceptorChain = [];
  this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
    responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);
  });

  var promise;

  if (!synchronousRequestInterceptors) {
    var chain = [dispatchRequest, undefined];

    Array.prototype.unshift.apply(chain, requestInterceptorChain);
    chain = chain.concat(responseInterceptorChain);

    promise = Promise.resolve(config);
    while (chain.length) {
      promise = promise.then(chain.shift(), chain.shift());
    }

    return promise;
  }


  var newConfig = config;
  while (requestInterceptorChain.length) {
    var onFulfilled = requestInterceptorChain.shift();
    var onRejected = requestInterceptorChain.shift();
    try {
      newConfig = onFulfilled(newConfig);
    } catch (error) {
      onRejected(error);
      break;
    }
  }

  try {
    promise = dispatchRequest(newConfig);
  } catch (error) {
    return Promise.reject(error);
  }

  while (responseInterceptorChain.length) {
    promise = promise.then(responseInterceptorChain.shift(), responseInterceptorChain.shift());
  }

  return promise;
};

Axios.prototype.getUri = function getUri(config) {
  config = mergeConfig(this.defaults, config);
  var fullPath = buildFullPath(config.baseURL, config.url);
  return buildURL(fullPath, config.params, config.paramsSerializer);
};

// Provide aliases for supported request methods
utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {
  /*eslint func-names:0*/
  Axios.prototype[method] = function(url, config) {
    return this.request(mergeConfig(config || {}, {
      method: method,
      url: url,
      data: (config || {}).data
    }));
  };
});

utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
  /*eslint func-names:0*/

  function generateHTTPMethod(isForm) {
    return function httpMethod(url, data, config) {
      return this.request(mergeConfig(config || {}, {
        method: method,
        headers: isForm ? {
          'Content-Type': 'multipart/form-data'
        } : {},
        url: url,
        data: data
      }));
    };
  }

  Axios.prototype[method] = generateHTTPMethod();

  Axios.prototype[method + 'Form'] = generateHTTPMethod(true);
});

module.exports = Axios;
'use strict';

var utils = require('../utils');

/**
 * Create an Error with the specified message, config, error code, request and response.
 *
 * @param {string} message The error message.
 * @param {string} [code] The error code (for example, 'ECONNABORTED').
 * @param {Object} [config] The config.
 * @param {Object} [request] The request.
 * @param {Object} [response] The response.
 * @returns {Error} The created error.
 */
function AxiosError(message, code, config, request, response) {
  Error.call(this);
  this.message = message;
  this.name = 'AxiosError';
  code && (this.code = code);
  config && (this.config = config);
  request && (this.request = request);
  response && (this.response = response);
}

utils.inherits(AxiosError, Error, {
  toJSON: function toJSON() {
    return {
      // Standard
      message: this.message,
      name: this.name,
      // Microsoft
      description: this.description,
      number: this.number,
      // Mozilla
      fileName: this.fileName,
      lineNumber: this.lineNumber,
      columnNumber: this.columnNumber,
      stack: this.stack,
      // Axios
      config: this.config,
      code: this.code,
      status: this.response && this.response.status ? this.response.status : null
    };
  }
});

var prototype = AxiosError.prototype;
var descriptors = {};

[
  'ERR_BAD_OPTION_VALUE',
  'ERR_BAD_OPTION',
  'ECONNABORTED',
  'ETIMEDOUT',
  'ERR_NETWORK',
  'ERR_FR_TOO_MANY_REDIRECTS',
  'ERR_DEPRECATED',
  'ERR_BAD_RESPONSE',
  'ERR_BAD_REQUEST',
  'ERR_CANCELED'
// eslint-disable-next-line func-names
].forEach(function(code) {
  descriptors[code] = {value: code};
});

Object.defineProperties(AxiosError, descriptors);
Object.defineProperty(prototype, 'isAxiosError', {value: true});

// eslint-disable-next-line func-names
AxiosError.from = function(error, code, config, request, response, customProps) {
  var axiosError = Object.create(prototype);

  utils.toFlatObject(error, axiosError, function filter(obj) {
    return obj !== Error.prototype;
  });

  AxiosError.call(axiosError, error.message, code, config, request, response);

  axiosError.name = error.name;

  customProps && Object.assign(axiosError, customProps);

  return axiosError;
};

module.exports = AxiosError;
'use strict';

var utils = require('./../utils');

function InterceptorManager() {
  this.handlers = [];
}

/**
 * Add a new interceptor to the stack
 *
 * @param {Function} fulfilled The function to handle `then` for a `Promise`
 * @param {Function} rejected The function to handle `reject` for a `Promise`
 *
 * @return {Number} An ID used to remove interceptor later
 */
InterceptorManager.prototype.use = function use(fulfilled, rejected, options) {
  this.handlers.push({
    fulfilled: fulfilled,
    rejected: rejected,
    synchronous: options ? options.synchronous : false,
    runWhen: options ? options.runWhen : null
  });
  return this.handlers.length - 1;
};

/**
 * Remove an interceptor from the stack
 *
 * @param {Number} id The ID that was returned by `use`
 */
InterceptorManager.prototype.eject = function eject(id) {
  if (this.handlers[id]) {
    this.handlers[id] = null;
  }
};

/**
 * Iterate over all the registered interceptors
 *
 * This method is particularly useful for skipping over any
 * interceptors that may have become `null` calling `eject`.
 *
 * @param {Function} fn The function to call for each interceptor
 */
InterceptorManager.prototype.forEach = function forEach(fn) {
  utils.forEach(this.handlers, function forEachHandler(h) {
    if (h !== null) {
      fn(h);
    }
  });
};

module.exports = InterceptorManager;
# axios // core

The modules found in `core/` should be modules that are specific to the domain logic of axios. These modules would most likely not make sense to be consumed outside of the axios module, as their logic is too specific. Some examples of core modules are:

- Dispatching requests
  - Requests sent via `adapters/` (see lib/adapters/README.md)
- Managing interceptors
- Handling config
'use strict';

var isAbsoluteURL = require('../helpers/isAbsoluteURL');
var combineURLs = require('../helpers/combineURLs');

/**
 * Creates a new URL by combining the baseURL with the requestedURL,
 * only when the requestedURL is not already an absolute URL.
 * If the requestURL is absolute, this function returns the requestedURL untouched.
 *
 * @param {string} baseURL The base URL
 * @param {string} requestedURL Absolute or relative URL to combine
 * @returns {string} The combined full path
 */
module.exports = function buildFullPath(baseURL, requestedURL) {
  if (baseURL && !isAbsoluteURL(requestedURL)) {
    return combineURLs(baseURL, requestedURL);
  }
  return requestedURL;
};
'use strict';

var utils = require('./../utils');
var transformData = require('./transformData');
var isCancel = require('../cancel/isCancel');
var defaults = require('../defaults');
var CanceledError = require('../cancel/CanceledError');

/**
 * Throws a `CanceledError` if cancellation has been requested.
 */
function throwIfCancellationRequested(config) {
  if (config.cancelToken) {
    config.cancelToken.throwIfRequested();
  }

  if (config.signal && config.signal.aborted) {
    throw new CanceledError();
  }
}

/**
 * Dispatch a request to the server using the configured adapter.
 *
 * @param {object} config The config that is to be used for the request
 * @returns {Promise} The Promise to be fulfilled
 */
module.exports = function dispatchRequest(config) {
  throwIfCancellationRequested(config);

  // Ensure headers exist
  config.headers = config.headers || {};

  // Transform request data
  config.data = transformData.call(
    config,
    config.data,
    config.headers,
    config.transformRequest
  );

  // Flatten headers
  config.headers = utils.merge(
    config.headers.common || {},
    config.headers[config.method] || {},
    config.headers
  );

  utils.forEach(
    ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],
    function cleanHeaderConfig(method) {
      delete config.headers[method];
    }
  );

  var adapter = config.adapter || defaults.adapter;

  return adapter(config).then(function onAdapterResolution(response) {
    throwIfCancellationRequested(config);

    // Transform response data
    response.data = transformData.call(
      config,
      response.data,
      response.headers,
      config.transformResponse
    );

    return response;
  }, function onAdapterRejection(reason) {
    if (!isCancel(reason)) {
      throwIfCancellationRequested(config);

      // Transform response data
      if (reason && reason.response) {
        reason.response.data = transformData.call(
          config,
          reason.response.data,
          reason.response.headers,
          config.transformResponse
        );
      }
    }

    return Promise.reject(reason);
  });
};
'use strict';

var utils = require('../utils');

/**
 * Config-specific merge-function which creates a new config-object
 * by merging two configuration objects together.
 *
 * @param {Object} config1
 * @param {Object} config2
 * @returns {Object} New object resulting from merging config2 to config1
 */
module.exports = function mergeConfig(config1, config2) {
  // eslint-disable-next-line no-param-reassign
  config2 = config2 || {};
  var config = {};

  function getMergedValue(target, source) {
    if (utils.isPlainObject(target) && utils.isPlainObject(source)) {
      return utils.merge(target, source);
    } else if (utils.isPlainObject(source)) {
      return utils.merge({}, source);
    } else if (utils.isArray(source)) {
      return source.slice();
    }
    return source;
  }

  // eslint-disable-next-line consistent-return
  function mergeDeepProperties(prop) {
    if (!utils.isUndefined(config2[prop])) {
      return getMergedValue(config1[prop], config2[prop]);
    } else if (!utils.isUndefined(config1[prop])) {
      return getMergedValue(undefined, config1[prop]);
    }
  }

  // eslint-disable-next-line consistent-return
  function valueFromConfig2(prop) {
    if (!utils.isUndefined(config2[prop])) {
      return getMergedValue(undefined, config2[prop]);
    }
  }

  // eslint-disable-next-line consistent-return
  function defaultToConfig2(prop) {
    if (!utils.isUndefined(config2[prop])) {
      return getMergedValue(undefined, config2[prop]);
    } else if (!utils.isUndefined(config1[prop])) {
      return getMergedValue(undefined, config1[prop]);
    }
  }

  // eslint-disable-next-line consistent-return
  function mergeDirectKeys(prop) {
    if (prop in config2) {
      return getMergedValue(config1[prop], config2[prop]);
    } else if (prop in config1) {
      return getMergedValue(undefined, config1[prop]);
    }
  }

  var mergeMap = {
    'url': valueFromConfig2,
    'method': valueFromConfig2,
    'data': valueFromConfig2,
    'baseURL': defaultToConfig2,
    'transformRequest': defaultToConfig2,
    'transformResponse': defaultToConfig2,
    'paramsSerializer': defaultToConfig2,
    'timeout': defaultToConfig2,
    'timeoutMessage': defaultToConfig2,
    'withCredentials': defaultToConfig2,
    'adapter': defaultToConfig2,
    'responseType': defaultToConfig2,
    'xsrfCookieName': defaultToConfig2,
    'xsrfHeaderName': defaultToConfig2,
    'onUploadProgress': defaultToConfig2,
    'onDownloadProgress': defaultToConfig2,
    'decompress': defaultToConfig2,
    'maxContentLength': defaultToConfig2,
    'maxBodyLength': defaultToConfig2,
    'beforeRedirect': defaultToConfig2,
    'transport': defaultToConfig2,
    'httpAgent': defaultToConfig2,
    'httpsAgent': defaultToConfig2,
    'cancelToken': defaultToConfig2,
    'socketPath': defaultToConfig2,
    'responseEncoding': defaultToConfig2,
    'validateStatus': mergeDirectKeys
  };

  utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {
    var merge = mergeMap[prop] || mergeDeepProperties;
    var configValue = merge(prop);
    (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);
  });

  return config;
};
'use strict';

var AxiosError = require('./AxiosError');

/**
 * Resolve or reject a Promise based on response status.
 *
 * @param {Function} resolve A function that resolves the promise.
 * @param {Function} reject A function that rejects the promise.
 * @param {object} response The response.
 */
module.exports = function settle(resolve, reject, response) {
  var validateStatus = response.config.validateStatus;
  if (!response.status || !validateStatus || validateStatus(response.status)) {
    resolve(response);
  } else {
    reject(new AxiosError(
      'Request failed with status code ' + response.status,
      [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],
      response.config,
      response.request,
      response
    ));
  }
};
'use strict';

var utils = require('./../utils');
var defaults = require('../defaults');

/**
 * Transform the data for a request or a response
 *
 * @param {Object|String} data The data to be transformed
 * @param {Array} headers The headers for the request or response
 * @param {Array|Function} fns A single function or Array of functions
 * @returns {*} The resulting transformed data
 */
module.exports = function transformData(data, headers, fns) {
  var context = this || defaults;
  /*eslint no-param-reassign:0*/
  utils.forEach(fns, function transform(fn) {
    data = fn.call(context, data, headers);
  });

  return data;
};
'use strict';

var CanceledError = require('./CanceledError');

/**
 * A `CancelToken` is an object that can be used to request cancellation of an operation.
 *
 * @class
 * @param {Function} executor The executor function.
 */
function CancelToken(executor) {
  if (typeof executor !== 'function') {
    throw new TypeError('executor must be a function.');
  }

  var resolvePromise;

  this.promise = new Promise(function promiseExecutor(resolve) {
    resolvePromise = resolve;
  });

  var token = this;

  // eslint-disable-next-line func-names
  this.promise.then(function(cancel) {
    if (!token._listeners) return;

    var i;
    var l = token._listeners.length;

    for (i = 0; i < l; i++) {
      token._listeners[i](cancel);
    }
    token._listeners = null;
  });

  // eslint-disable-next-line func-names
  this.promise.then = function(onfulfilled) {
    var _resolve;
    // eslint-disable-next-line func-names
    var promise = new Promise(function(resolve) {
      token.subscribe(resolve);
      _resolve = resolve;
    }).then(onfulfilled);

    promise.cancel = function reject() {
      token.unsubscribe(_resolve);
    };

    return promise;
  };

  executor(function cancel(message) {
    if (token.reason) {
      // Cancellation has already been requested
      return;
    }

    token.reason = new CanceledError(message);
    resolvePromise(token.reason);
  });
}

/**
 * Throws a `CanceledError` if cancellation has been requested.
 */
CancelToken.prototype.throwIfRequested = function throwIfRequested() {
  if (this.reason) {
    throw this.reason;
  }
};

/**
 * Subscribe to the cancel signal
 */

CancelToken.prototype.subscribe = function subscribe(listener) {
  if (this.reason) {
    listener(this.reason);
    return;
  }

  if (this._listeners) {
    this._listeners.push(listener);
  } else {
    this._listeners = [listener];
  }
};

/**
 * Unsubscribe from the cancel signal
 */

CancelToken.prototype.unsubscribe = function unsubscribe(listener) {
  if (!this._listeners) {
    return;
  }
  var index = this._listeners.indexOf(listener);
  if (index !== -1) {
    this._listeners.splice(index, 1);
  }
};

/**
 * Returns an object that contains a new `CancelToken` and a function that, when called,
 * cancels the `CancelToken`.
 */
CancelToken.source = function source() {
  var cancel;
  var token = new CancelToken(function executor(c) {
    cancel = c;
  });
  return {
    token: token,
    cancel: cancel
  };
};

module.exports = CancelToken;
'use strict';

var AxiosError = require('../core/AxiosError');
var utils = require('../utils');

/**
 * A `CanceledError` is an object that is thrown when an operation is canceled.
 *
 * @class
 * @param {string=} message The message.
 */
function CanceledError(message) {
  // eslint-disable-next-line no-eq-null,eqeqeq
  AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED);
  this.name = 'CanceledError';
}

utils.inherits(CanceledError, AxiosError, {
  __CANCEL__: true
});

module.exports = CanceledError;
'use strict';

module.exports = function isCancel(value) {
  return !!(value && value.__CANCEL__);
};
# axios // adapters

The modules under `adapters/` are modules that handle dispatching a request and settling a returned `Promise` once a response is received.

## Example

```js
var settle = require('./../core/settle');

module.exports = function myAdapter(config) {
  // At this point:
  //  - config has been merged with defaults
  //  - request transformers have already run
  //  - request interceptors have already run
  
  // Make the request using config provided
  // Upon response settle the Promise

  return new Promise(function(resolve, reject) {
  
    var response = {
      data: responseData,
      status: request.status,
      statusText: request.statusText,
      headers: responseHeaders,
      config: config,
      request: request
    };

    settle(resolve, reject, response);

    // From here:
    //  - response transformers will run
    //  - response interceptors will run
  });
}
```
'use strict';

var utils = require('./../utils');
var settle = require('./../core/settle');
var buildFullPath = require('../core/buildFullPath');
var buildURL = require('./../helpers/buildURL');
var http = require('http');
var https = require('https');
var httpFollow = require('follow-redirects').http;
var httpsFollow = require('follow-redirects').https;
var url = require('url');
var zlib = require('zlib');
var VERSION = require('./../env/data').version;
var transitionalDefaults = require('../defaults/transitional');
var AxiosError = require('../core/AxiosError');
var CanceledError = require('../cancel/CanceledError');

var isHttps = /https:?/;

var supportedProtocols = [ 'http:', 'https:', 'file:' ];

/**
 *
 * @param {http.ClientRequestArgs} options
 * @param {AxiosProxyConfig} proxy
 * @param {string} location
 */
function setProxy(options, proxy, location) {
  options.hostname = proxy.host;
  options.host = proxy.host;
  options.port = proxy.port;
  options.path = location;

  // Basic proxy authorization
  if (proxy.auth) {
    var base64 = Buffer.from(proxy.auth.username + ':' + proxy.auth.password, 'utf8').toString('base64');
    options.headers['Proxy-Authorization'] = 'Basic ' + base64;
  }

  // If a proxy is used, any redirects must also pass through the proxy
  options.beforeRedirect = function beforeRedirect(redirection) {
    redirection.headers.host = redirection.host;
    setProxy(redirection, proxy, redirection.href);
  };
}

/*eslint consistent-return:0*/
module.exports = function httpAdapter(config) {
  return new Promise(function dispatchHttpRequest(resolvePromise, rejectPromise) {
    var onCanceled;
    function done() {
      if (config.cancelToken) {
        config.cancelToken.unsubscribe(onCanceled);
      }

      if (config.signal) {
        config.signal.removeEventListener('abort', onCanceled);
      }
    }
    var resolve = function resolve(value) {
      done();
      resolvePromise(value);
    };
    var rejected = false;
    var reject = function reject(value) {
      done();
      rejected = true;
      rejectPromise(value);
    };
    var data = config.data;
    var headers = config.headers;
    var headerNames = {};

    Object.keys(headers).forEach(function storeLowerName(name) {
      headerNames[name.toLowerCase()] = name;
    });

    // Set User-Agent (required by some servers)
    // See https://github.com/axios/axios/issues/69
    if ('user-agent' in headerNames) {
      // User-Agent is specified; handle case where no UA header is desired
      if (!headers[headerNames['user-agent']]) {
        delete headers[headerNames['user-agent']];
      }
      // Otherwise, use specified value
    } else {
      // Only set header if it hasn't been set in config
      headers['User-Agent'] = 'axios/' + VERSION;
    }

    // support for https://www.npmjs.com/package/form-data api
    if (utils.isFormData(data) && utils.isFunction(data.getHeaders)) {
      Object.assign(headers, data.getHeaders());
    } else if (data && !utils.isStream(data)) {
      if (Buffer.isBuffer(data)) {
        // Nothing to do...
      } else if (utils.isArrayBuffer(data)) {
        data = Buffer.from(new Uint8Array(data));
      } else if (utils.isString(data)) {
        data = Buffer.from(data, 'utf-8');
      } else {
        return reject(new AxiosError(
          'Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream',
          AxiosError.ERR_BAD_REQUEST,
          config
        ));
      }

      if (config.maxBodyLength > -1 && data.length > config.maxBodyLength) {
        return reject(new AxiosError(
          'Request body larger than maxBodyLength limit',
          AxiosError.ERR_BAD_REQUEST,
          config
        ));
      }

      // Add Content-Length header if data exists
      if (!headerNames['content-length']) {
        headers['Content-Length'] = data.length;
      }
    }

    // HTTP basic authentication
    var auth = undefined;
    if (config.auth) {
      var username = config.auth.username || '';
      var password = config.auth.password || '';
      auth = username + ':' + password;
    }

    // Parse url
    var fullPath = buildFullPath(config.baseURL, config.url);
    var parsed = url.parse(fullPath);
    var protocol = parsed.protocol || supportedProtocols[0];

    if (supportedProtocols.indexOf(protocol) === -1) {
      return reject(new AxiosError(
        'Unsupported protocol ' + protocol,
        AxiosError.ERR_BAD_REQUEST,
        config
      ));
    }

    if (!auth && parsed.auth) {
      var urlAuth = parsed.auth.split(':');
      var urlUsername = urlAuth[0] || '';
      var urlPassword = urlAuth[1] || '';
      auth = urlUsername + ':' + urlPassword;
    }

    if (auth && headerNames.authorization) {
      delete headers[headerNames.authorization];
    }

    var isHttpsRequest = isHttps.test(protocol);
    var agent = isHttpsRequest ? config.httpsAgent : config.httpAgent;

    try {
      buildURL(parsed.path, config.params, config.paramsSerializer).replace(/^\?/, '');
    } catch (err) {
      var customErr = new Error(err.message);
      customErr.config = config;
      customErr.url = config.url;
      customErr.exists = true;
      reject(customErr);
    }

    var options = {
      path: buildURL(parsed.path, config.params, config.paramsSerializer).replace(/^\?/, ''),
      method: config.method.toUpperCase(),
      headers: headers,
      agent: agent,
      agents: { http: config.httpAgent, https: config.httpsAgent },
      auth: auth
    };

    if (config.socketPath) {
      options.socketPath = config.socketPath;
    } else {
      options.hostname = parsed.hostname;
      options.port = parsed.port;
    }

    var proxy = config.proxy;
    if (!proxy && proxy !== false) {
      var proxyEnv = protocol.slice(0, -1) + '_proxy';
      var proxyUrl = process.env[proxyEnv] || process.env[proxyEnv.toUpperCase()];
      if (proxyUrl) {
        var parsedProxyUrl = url.parse(proxyUrl);
        var noProxyEnv = process.env.no_proxy || process.env.NO_PROXY;
        var shouldProxy = true;

        if (noProxyEnv) {
          var noProxy = noProxyEnv.split(',').map(function trim(s) {
            return s.trim();
          });

          shouldProxy = !noProxy.some(function proxyMatch(proxyElement) {
            if (!proxyElement) {
              return false;
            }
            if (proxyElement === '*') {
              return true;
            }
            if (proxyElement[0] === '.' &&
                parsed.hostname.substr(parsed.hostname.length - proxyElement.length) === proxyElement) {
              return true;
            }

            return parsed.hostname === proxyElement;
          });
        }

        if (shouldProxy) {
          proxy = {
            host: parsedProxyUrl.hostname,
            port: parsedProxyUrl.port,
            protocol: parsedProxyUrl.protocol
          };

          if (parsedProxyUrl.auth) {
            var proxyUrlAuth = parsedProxyUrl.auth.split(':');
            proxy.auth = {
              username: proxyUrlAuth[0],
              password: proxyUrlAuth[1]
            };
          }
        }
      }
    }

    if (proxy) {
      options.headers.host = parsed.hostname + (parsed.port ? ':' + parsed.port : '');
      setProxy(options, proxy, protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path);
    }

    var transport;
    var isHttpsProxy = isHttpsRequest && (proxy ? isHttps.test(proxy.protocol) : true);
    if (config.transport) {
      transport = config.transport;
    } else if (config.maxRedirects === 0) {
      transport = isHttpsProxy ? https : http;
    } else {
      if (config.maxRedirects) {
        options.maxRedirects = config.maxRedirects;
      }
      if (config.beforeRedirect) {
        options.beforeRedirect = config.beforeRedirect;
      }
      transport = isHttpsProxy ? httpsFollow : httpFollow;
    }

    if (config.maxBodyLength > -1) {
      options.maxBodyLength = config.maxBodyLength;
    }

    if (config.insecureHTTPParser) {
      options.insecureHTTPParser = config.insecureHTTPParser;
    }

    // Create the request
    var req = transport.request(options, function handleResponse(res) {
      if (req.aborted) return;

      // uncompress the response body transparently if required
      var stream = res;

      // return the last request in case of redirects
      var lastRequest = res.req || req;


      // if no content, is HEAD request or decompress disabled we should not decompress
      if (res.statusCode !== 204 && lastRequest.method !== 'HEAD' && config.decompress !== false) {
        switch (res.headers['content-encoding']) {
        /*eslint default-case:0*/
        case 'gzip':
        case 'compress':
        case 'deflate':
        // add the unzipper to the body stream processing pipeline
          stream = stream.pipe(zlib.createUnzip());

          // remove the content-encoding in order to not confuse downstream operations
          delete res.headers['content-encoding'];
          break;
        }
      }

      var response = {
        status: res.statusCode,
        statusText: res.statusMessage,
        headers: res.headers,
        config: config,
        request: lastRequest
      };

      if (config.responseType === 'stream') {
        response.data = stream;
        settle(resolve, reject, response);
      } else {
        var responseBuffer = [];
        var totalResponseBytes = 0;
        stream.on('data', function handleStreamData(chunk) {
          responseBuffer.push(chunk);
          totalResponseBytes += chunk.length;

          // make sure the content length is not over the maxContentLength if specified
          if (config.maxContentLength > -1 && totalResponseBytes > config.maxContentLength) {
            // stream.destoy() emit aborted event before calling reject() on Node.js v16
            rejected = true;
            stream.destroy();
            reject(new AxiosError('maxContentLength size of ' + config.maxContentLength + ' exceeded',
              AxiosError.ERR_BAD_RESPONSE, config, lastRequest));
          }
        });

        stream.on('aborted', function handlerStreamAborted() {
          if (rejected) {
            return;
          }
          stream.destroy();
          reject(new AxiosError(
            'maxContentLength size of ' + config.maxContentLength + ' exceeded',
            AxiosError.ERR_BAD_RESPONSE,
            config,
            lastRequest
          ));
        });

        stream.on('error', function handleStreamError(err) {
          if (req.aborted) return;
          reject(AxiosError.from(err, null, config, lastRequest));
        });

        stream.on('end', function handleStreamEnd() {
          try {
            var responseData = responseBuffer.length === 1 ? responseBuffer[0] : Buffer.concat(responseBuffer);
            if (config.responseType !== 'arraybuffer') {
              responseData = responseData.toString(config.responseEncoding);
              if (!config.responseEncoding || config.responseEncoding === 'utf8') {
                responseData = utils.stripBOM(responseData);
              }
            }
            response.data = responseData;
          } catch (err) {
            reject(AxiosError.from(err, null, config, response.request, response));
          }
          settle(resolve, reject, response);
        });
      }
    });

    // Handle errors
    req.on('error', function handleRequestError(err) {
      // @todo remove
      // if (req.aborted && err.code !== AxiosError.ERR_FR_TOO_MANY_REDIRECTS) return;
      reject(AxiosError.from(err, null, config, req));
    });

    // set tcp keep alive to prevent drop connection by peer
    req.on('socket', function handleRequestSocket(socket) {
      // default interval of sending ack packet is 1 minute
      socket.setKeepAlive(true, 1000 * 60);
    });

    // Handle request timeout
    if (config.timeout) {
      // This is forcing a int timeout to avoid problems if the `req` interface doesn't handle other types.
      var timeout = parseInt(config.timeout, 10);

      if (isNaN(timeout)) {
        reject(new AxiosError(
          'error trying to parse `config.timeout` to int',
          AxiosError.ERR_BAD_OPTION_VALUE,
          config,
          req
        ));

        return;
      }

      // Sometime, the response will be very slow, and does not respond, the connect event will be block by event loop system.
      // And timer callback will be fired, and abort() will be invoked before connection, then get "socket hang up" and code ECONNRESET.
      // At this time, if we have a large number of request, nodejs will hang up some socket on background. and the number will up and up.
      // And then these socket which be hang up will devoring CPU little by little.
      // ClientRequest.setTimeout will be fired on the specify milliseconds, and can make sure that abort() will be fired after connect.
      req.setTimeout(timeout, function handleRequestTimeout() {
        req.abort();
        var transitional = config.transitional || transitionalDefaults;
        reject(new AxiosError(
          'timeout of ' + timeout + 'ms exceeded',
          transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,
          config,
          req
        ));
      });
    }

    if (config.cancelToken || config.signal) {
      // Handle cancellation
      // eslint-disable-next-line func-names
      onCanceled = function(cancel) {
        if (req.aborted) return;

        req.abort();
        reject(!cancel || (cancel && cancel.type) ? new CanceledError() : cancel);
      };

      config.cancelToken && config.cancelToken.subscribe(onCanceled);
      if (config.signal) {
        config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);
      }
    }


    // Send the request
    if (utils.isStream(data)) {
      data.on('error', function handleStreamError(err) {
        reject(AxiosError.from(err, config, null, req));
      }).pipe(req);
    } else {
      req.end(data);
    }
  });
};
'use strict';

var utils = require('./../utils');
var settle = require('./../core/settle');
var cookies = require('./../helpers/cookies');
var buildURL = require('./../helpers/buildURL');
var buildFullPath = require('../core/buildFullPath');
var parseHeaders = require('./../helpers/parseHeaders');
var isURLSameOrigin = require('./../helpers/isURLSameOrigin');
var transitionalDefaults = require('../defaults/transitional');
var AxiosError = require('../core/AxiosError');
var CanceledError = require('../cancel/CanceledError');
var parseProtocol = require('../helpers/parseProtocol');

module.exports = function xhrAdapter(config) {
  return new Promise(function dispatchXhrRequest(resolve, reject) {
    var requestData = config.data;
    var requestHeaders = config.headers;
    var responseType = config.responseType;
    var onCanceled;
    function done() {
      if (config.cancelToken) {
        config.cancelToken.unsubscribe(onCanceled);
      }

      if (config.signal) {
        config.signal.removeEventListener('abort', onCanceled);
      }
    }

    if (utils.isFormData(requestData) && utils.isStandardBrowserEnv()) {
      delete requestHeaders['Content-Type']; // Let the browser set it
    }

    var request = new XMLHttpRequest();

    // HTTP basic authentication
    if (config.auth) {
      var username = config.auth.username || '';
      var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';
      requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);
    }

    var fullPath = buildFullPath(config.baseURL, config.url);

    request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);

    // Set the request timeout in MS
    request.timeout = config.timeout;

    function onloadend() {
      if (!request) {
        return;
      }
      // Prepare the response
      var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;
      var responseData = !responseType || responseType === 'text' ||  responseType === 'json' ?
        request.responseText : request.response;
      var response = {
        data: responseData,
        status: request.status,
        statusText: request.statusText,
        headers: responseHeaders,
        config: config,
        request: request
      };

      settle(function _resolve(value) {
        resolve(value);
        done();
      }, function _reject(err) {
        reject(err);
        done();
      }, response);

      // Clean up request
      request = null;
    }

    if ('onloadend' in request) {
      // Use onloadend if available
      request.onloadend = onloadend;
    } else {
      // Listen for ready state to emulate onloadend
      request.onreadystatechange = function handleLoad() {
        if (!request || request.readyState !== 4) {
          return;
        }

        // The request errored out and we didn't get a response, this will be
        // handled by onerror instead
        // With one exception: request that using file: protocol, most browsers
        // will return status as 0 even though it's a successful request
        if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {
          return;
        }
        // readystate handler is calling before onerror or ontimeout handlers,
        // so we should call onloadend on the next 'tick'
        setTimeout(onloadend);
      };
    }

    // Handle browser request cancellation (as opposed to a manual cancellation)
    request.onabort = function handleAbort() {
      if (!request) {
        return;
      }

      reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));

      // Clean up request
      request = null;
    };

    // Handle low level network errors
    request.onerror = function handleError() {
      // Real errors are hidden from us by the browser
      // onerror should only fire if it's a network error
      reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request, request));

      // Clean up request
      request = null;
    };

    // Handle timeout
    request.ontimeout = function handleTimeout() {
      var timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';
      var transitional = config.transitional || transitionalDefaults;
      if (config.timeoutErrorMessage) {
        timeoutErrorMessage = config.timeoutErrorMessage;
      }
      reject(new AxiosError(
        timeoutErrorMessage,
        transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,
        config,
        request));

      // Clean up request
      request = null;
    };

    // Add xsrf header
    // This is only done if running in a standard browser environment.
    // Specifically not if we're in a web worker, or react-native.
    if (utils.isStandardBrowserEnv()) {
      // Add xsrf header
      var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ?
        cookies.read(config.xsrfCookieName) :
        undefined;

      if (xsrfValue) {
        requestHeaders[config.xsrfHeaderName] = xsrfValue;
      }
    }

    // Add headers to the request
    if ('setRequestHeader' in request) {
      utils.forEach(requestHeaders, function setRequestHeader(val, key) {
        if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {
          // Remove Content-Type if data is undefined
          delete requestHeaders[key];
        } else {
          // Otherwise add header to the request
          request.setRequestHeader(key, val);
        }
      });
    }

    // Add withCredentials to request if needed
    if (!utils.isUndefined(config.withCredentials)) {
      request.withCredentials = !!config.withCredentials;
    }

    // Add responseType to request if needed
    if (responseType && responseType !== 'json') {
      request.responseType = config.responseType;
    }

    // Handle progress if needed
    if (typeof config.onDownloadProgress === 'function') {
      request.addEventListener('progress', config.onDownloadProgress);
    }

    // Not all browsers support upload events
    if (typeof config.onUploadProgress === 'function' && request.upload) {
      request.upload.addEventListener('progress', config.onUploadProgress);
    }

    if (config.cancelToken || config.signal) {
      // Handle cancellation
      // eslint-disable-next-line func-names
      onCanceled = function(cancel) {
        if (!request) {
          return;
        }
        reject(!cancel || (cancel && cancel.type) ? new CanceledError() : cancel);
        request.abort();
        request = null;
      };

      config.cancelToken && config.cancelToken.subscribe(onCanceled);
      if (config.signal) {
        config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);
      }
    }

    if (!requestData) {
      requestData = null;
    }

    var protocol = parseProtocol(fullPath);

    if (protocol && [ 'http', 'https', 'file' ].indexOf(protocol) === -1) {
      reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));
      return;
    }


    // Send the request
    request.send(requestData);
  });
};
/* axios v0.27.2 | (c) 2022 by Matt Zabriskie */
(function webpackUniversalModuleDefinition(root, factory) {
	if(typeof exports === 'object' && typeof module === 'object')
		module.exports = factory();
	else if(typeof define === 'function' && define.amd)
		define([], factory);
	else if(typeof exports === 'object')
		exports["axios"] = factory();
	else
		root["axios"] = factory();
})(this, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};
/******/
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/
/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId]) {
/******/ 			return installedModules[moduleId].exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			i: moduleId,
/******/ 			l: false,
/******/ 			exports: {}
/******/ 		};
/******/
/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ 		// Flag the module as loaded
/******/ 		module.l = true;
/******/
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/
/******/
/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;
/******/
/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;
/******/
/******/ 	// define getter function for harmony exports
/******/ 	__webpack_require__.d = function(exports, name, getter) {
/******/ 		if(!__webpack_require__.o(exports, name)) {
/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ 		}
/******/ 	};
/******/
/******/ 	// define __esModule on exports
/******/ 	__webpack_require__.r = function(exports) {
/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ 		}
/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
/******/ 	};
/******/
/******/ 	// create a fake namespace object
/******/ 	// mode & 1: value is a module id, require it
/******/ 	// mode & 2: merge all properties of value into the ns
/******/ 	// mode & 4: return value when already ns object
/******/ 	// mode & 8|1: behave like require
/******/ 	__webpack_require__.t = function(value, mode) {
/******/ 		if(mode & 1) value = __webpack_require__(value);
/******/ 		if(mode & 8) return value;
/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ 		var ns = Object.create(null);
/******/ 		__webpack_require__.r(ns);
/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ 		return ns;
/******/ 	};
/******/
/******/ 	// getDefaultExport function for compatibility with non-harmony modules
/******/ 	__webpack_require__.n = function(module) {
/******/ 		var getter = module && module.__esModule ?
/******/ 			function getDefault() { return module['default']; } :
/******/ 			function getModuleExports() { return module; };
/******/ 		__webpack_require__.d(getter, 'a', getter);
/******/ 		return getter;
/******/ 	};
/******/
/******/ 	// Object.prototype.hasOwnProperty.call
/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "";
/******/
/******/
/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(__webpack_require__.s = "./index.js");
/******/ })
/************************************************************************/
/******/ ({

/***/ "./index.js":
/*!******************!*\
  !*** ./index.js ***!
  \******************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

module.exports = __webpack_require__(/*! ./lib/axios */ "./lib/axios.js");

/***/ }),

/***/ "./lib/adapters/xhr.js":
/*!*****************************!*\
  !*** ./lib/adapters/xhr.js ***!
  \*****************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(/*! ./../utils */ "./lib/utils.js");
var settle = __webpack_require__(/*! ./../core/settle */ "./lib/core/settle.js");
var cookies = __webpack_require__(/*! ./../helpers/cookies */ "./lib/helpers/cookies.js");
var buildURL = __webpack_require__(/*! ./../helpers/buildURL */ "./lib/helpers/buildURL.js");
var buildFullPath = __webpack_require__(/*! ../core/buildFullPath */ "./lib/core/buildFullPath.js");
var parseHeaders = __webpack_require__(/*! ./../helpers/parseHeaders */ "./lib/helpers/parseHeaders.js");
var isURLSameOrigin = __webpack_require__(/*! ./../helpers/isURLSameOrigin */ "./lib/helpers/isURLSameOrigin.js");
var transitionalDefaults = __webpack_require__(/*! ../defaults/transitional */ "./lib/defaults/transitional.js");
var AxiosError = __webpack_require__(/*! ../core/AxiosError */ "./lib/core/AxiosError.js");
var CanceledError = __webpack_require__(/*! ../cancel/CanceledError */ "./lib/cancel/CanceledError.js");
var parseProtocol = __webpack_require__(/*! ../helpers/parseProtocol */ "./lib/helpers/parseProtocol.js");

module.exports = function xhrAdapter(config) {
  return new Promise(function dispatchXhrRequest(resolve, reject) {
    var requestData = config.data;
    var requestHeaders = config.headers;
    var responseType = config.responseType;
    var onCanceled;
    function done() {
      if (config.cancelToken) {
        config.cancelToken.unsubscribe(onCanceled);
      }

      if (config.signal) {
        config.signal.removeEventListener('abort', onCanceled);
      }
    }

    if (utils.isFormData(requestData) && utils.isStandardBrowserEnv()) {
      delete requestHeaders['Content-Type']; // Let the browser set it
    }

    var request = new XMLHttpRequest();

    // HTTP basic authentication
    if (config.auth) {
      var username = config.auth.username || '';
      var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';
      requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);
    }

    var fullPath = buildFullPath(config.baseURL, config.url);

    request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);

    // Set the request timeout in MS
    request.timeout = config.timeout;

    function onloadend() {
      if (!request) {
        return;
      }
      // Prepare the response
      var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;
      var responseData = !responseType || responseType === 'text' ||  responseType === 'json' ?
        request.responseText : request.response;
      var response = {
        data: responseData,
        status: request.status,
        statusText: request.statusText,
        headers: responseHeaders,
        config: config,
        request: request
      };

      settle(function _resolve(value) {
        resolve(value);
        done();
      }, function _reject(err) {
        reject(err);
        done();
      }, response);

      // Clean up request
      request = null;
    }

    if ('onloadend' in request) {
      // Use onloadend if available
      request.onloadend = onloadend;
    } else {
      // Listen for ready state to emulate onloadend
      request.onreadystatechange = function handleLoad() {
        if (!request || request.readyState !== 4) {
          return;
        }

        // The request errored out and we didn't get a response, this will be
        // handled by onerror instead
        // With one exception: request that using file: protocol, most browsers
        // will return status as 0 even though it's a successful request
        if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {
          return;
        }
        // readystate handler is calling before onerror or ontimeout handlers,
        // so we should call onloadend on the next 'tick'
        setTimeout(onloadend);
      };
    }

    // Handle browser request cancellation (as opposed to a manual cancellation)
    request.onabort = function handleAbort() {
      if (!request) {
        return;
      }

      reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));

      // Clean up request
      request = null;
    };

    // Handle low level network errors
    request.onerror = function handleError() {
      // Real errors are hidden from us by the browser
      // onerror should only fire if it's a network error
      reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request, request));

      // Clean up request
      request = null;
    };

    // Handle timeout
    request.ontimeout = function handleTimeout() {
      var timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';
      var transitional = config.transitional || transitionalDefaults;
      if (config.timeoutErrorMessage) {
        timeoutErrorMessage = config.timeoutErrorMessage;
      }
      reject(new AxiosError(
        timeoutErrorMessage,
        transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,
        config,
        request));

      // Clean up request
      request = null;
    };

    // Add xsrf header
    // This is only done if running in a standard browser environment.
    // Specifically not if we're in a web worker, or react-native.
    if (utils.isStandardBrowserEnv()) {
      // Add xsrf header
      var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ?
        cookies.read(config.xsrfCookieName) :
        undefined;

      if (xsrfValue) {
        requestHeaders[config.xsrfHeaderName] = xsrfValue;
      }
    }

    // Add headers to the request
    if ('setRequestHeader' in request) {
      utils.forEach(requestHeaders, function setRequestHeader(val, key) {
        if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {
          // Remove Content-Type if data is undefined
          delete requestHeaders[key];
        } else {
          // Otherwise add header to the request
          request.setRequestHeader(key, val);
        }
      });
    }

    // Add withCredentials to request if needed
    if (!utils.isUndefined(config.withCredentials)) {
      request.withCredentials = !!config.withCredentials;
    }

    // Add responseType to request if needed
    if (responseType && responseType !== 'json') {
      request.responseType = config.responseType;
    }

    // Handle progress if needed
    if (typeof config.onDownloadProgress === 'function') {
      request.addEventListener('progress', config.onDownloadProgress);
    }

    // Not all browsers support upload events
    if (typeof config.onUploadProgress === 'function' && request.upload) {
      request.upload.addEventListener('progress', config.onUploadProgress);
    }

    if (config.cancelToken || config.signal) {
      // Handle cancellation
      // eslint-disable-next-line func-names
      onCanceled = function(cancel) {
        if (!request) {
          return;
        }
        reject(!cancel || (cancel && cancel.type) ? new CanceledError() : cancel);
        request.abort();
        request = null;
      };

      config.cancelToken && config.cancelToken.subscribe(onCanceled);
      if (config.signal) {
        config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);
      }
    }

    if (!requestData) {
      requestData = null;
    }

    var protocol = parseProtocol(fullPath);

    if (protocol && [ 'http', 'https', 'file' ].indexOf(protocol) === -1) {
      reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));
      return;
    }


    // Send the request
    request.send(requestData);
  });
};


/***/ }),

/***/ "./lib/axios.js":
/*!**********************!*\
  !*** ./lib/axios.js ***!
  \**********************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(/*! ./utils */ "./lib/utils.js");
var bind = __webpack_require__(/*! ./helpers/bind */ "./lib/helpers/bind.js");
var Axios = __webpack_require__(/*! ./core/Axios */ "./lib/core/Axios.js");
var mergeConfig = __webpack_require__(/*! ./core/mergeConfig */ "./lib/core/mergeConfig.js");
var defaults = __webpack_require__(/*! ./defaults */ "./lib/defaults/index.js");

/**
 * Create an instance of Axios
 *
 * @param {Object} defaultConfig The default config for the instance
 * @return {Axios} A new instance of Axios
 */
function createInstance(defaultConfig) {
  var context = new Axios(defaultConfig);
  var instance = bind(Axios.prototype.request, context);

  // Copy axios.prototype to instance
  utils.extend(instance, Axios.prototype, context);

  // Copy context to instance
  utils.extend(instance, context);

  // Factory for creating new instances
  instance.create = function create(instanceConfig) {
    return createInstance(mergeConfig(defaultConfig, instanceConfig));
  };

  return instance;
}

// Create the default instance to be exported
var axios = createInstance(defaults);

// Expose Axios class to allow class inheritance
axios.Axios = Axios;

// Expose Cancel & CancelToken
axios.CanceledError = __webpack_require__(/*! ./cancel/CanceledError */ "./lib/cancel/CanceledError.js");
axios.CancelToken = __webpack_require__(/*! ./cancel/CancelToken */ "./lib/cancel/CancelToken.js");
axios.isCancel = __webpack_require__(/*! ./cancel/isCancel */ "./lib/cancel/isCancel.js");
axios.VERSION = __webpack_require__(/*! ./env/data */ "./lib/env/data.js").version;
axios.toFormData = __webpack_require__(/*! ./helpers/toFormData */ "./lib/helpers/toFormData.js");

// Expose AxiosError class
axios.AxiosError = __webpack_require__(/*! ../lib/core/AxiosError */ "./lib/core/AxiosError.js");

// alias for CanceledError for backward compatibility
axios.Cancel = axios.CanceledError;

// Expose all/spread
axios.all = function all(promises) {
  return Promise.all(promises);
};
axios.spread = __webpack_require__(/*! ./helpers/spread */ "./lib/helpers/spread.js");

// Expose isAxiosError
axios.isAxiosError = __webpack_require__(/*! ./helpers/isAxiosError */ "./lib/helpers/isAxiosError.js");

module.exports = axios;

// Allow use of default import syntax in TypeScript
module.exports.default = axios;


/***/ }),

/***/ "./lib/cancel/CancelToken.js":
/*!***********************************!*\
  !*** ./lib/cancel/CancelToken.js ***!
  \***********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var CanceledError = __webpack_require__(/*! ./CanceledError */ "./lib/cancel/CanceledError.js");

/**
 * A `CancelToken` is an object that can be used to request cancellation of an operation.
 *
 * @class
 * @param {Function} executor The executor function.
 */
function CancelToken(executor) {
  if (typeof executor !== 'function') {
    throw new TypeError('executor must be a function.');
  }

  var resolvePromise;

  this.promise = new Promise(function promiseExecutor(resolve) {
    resolvePromise = resolve;
  });

  var token = this;

  // eslint-disable-next-line func-names
  this.promise.then(function(cancel) {
    if (!token._listeners) return;

    var i;
    var l = token._listeners.length;

    for (i = 0; i < l; i++) {
      token._listeners[i](cancel);
    }
    token._listeners = null;
  });

  // eslint-disable-next-line func-names
  this.promise.then = function(onfulfilled) {
    var _resolve;
    // eslint-disable-next-line func-names
    var promise = new Promise(function(resolve) {
      token.subscribe(resolve);
      _resolve = resolve;
    }).then(onfulfilled);

    promise.cancel = function reject() {
      token.unsubscribe(_resolve);
    };

    return promise;
  };

  executor(function cancel(message) {
    if (token.reason) {
      // Cancellation has already been requested
      return;
    }

    token.reason = new CanceledError(message);
    resolvePromise(token.reason);
  });
}

/**
 * Throws a `CanceledError` if cancellation has been requested.
 */
CancelToken.prototype.throwIfRequested = function throwIfRequested() {
  if (this.reason) {
    throw this.reason;
  }
};

/**
 * Subscribe to the cancel signal
 */

CancelToken.prototype.subscribe = function subscribe(listener) {
  if (this.reason) {
    listener(this.reason);
    return;
  }

  if (this._listeners) {
    this._listeners.push(listener);
  } else {
    this._listeners = [listener];
  }
};

/**
 * Unsubscribe from the cancel signal
 */

CancelToken.prototype.unsubscribe = function unsubscribe(listener) {
  if (!this._listeners) {
    return;
  }
  var index = this._listeners.indexOf(listener);
  if (index !== -1) {
    this._listeners.splice(index, 1);
  }
};

/**
 * Returns an object that contains a new `CancelToken` and a function that, when called,
 * cancels the `CancelToken`.
 */
CancelToken.source = function source() {
  var cancel;
  var token = new CancelToken(function executor(c) {
    cancel = c;
  });
  return {
    token: token,
    cancel: cancel
  };
};

module.exports = CancelToken;


/***/ }),

/***/ "./lib/cancel/CanceledError.js":
/*!*************************************!*\
  !*** ./lib/cancel/CanceledError.js ***!
  \*************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var AxiosError = __webpack_require__(/*! ../core/AxiosError */ "./lib/core/AxiosError.js");
var utils = __webpack_require__(/*! ../utils */ "./lib/utils.js");

/**
 * A `CanceledError` is an object that is thrown when an operation is canceled.
 *
 * @class
 * @param {string=} message The message.
 */
function CanceledError(message) {
  // eslint-disable-next-line no-eq-null,eqeqeq
  AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED);
  this.name = 'CanceledError';
}

utils.inherits(CanceledError, AxiosError, {
  __CANCEL__: true
});

module.exports = CanceledError;


/***/ }),

/***/ "./lib/cancel/isCancel.js":
/*!********************************!*\
  !*** ./lib/cancel/isCancel.js ***!
  \********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


module.exports = function isCancel(value) {
  return !!(value && value.__CANCEL__);
};


/***/ }),

/***/ "./lib/core/Axios.js":
/*!***************************!*\
  !*** ./lib/core/Axios.js ***!
  \***************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(/*! ./../utils */ "./lib/utils.js");
var buildURL = __webpack_require__(/*! ../helpers/buildURL */ "./lib/helpers/buildURL.js");
var InterceptorManager = __webpack_require__(/*! ./InterceptorManager */ "./lib/core/InterceptorManager.js");
var dispatchRequest = __webpack_require__(/*! ./dispatchRequest */ "./lib/core/dispatchRequest.js");
var mergeConfig = __webpack_require__(/*! ./mergeConfig */ "./lib/core/mergeConfig.js");
var buildFullPath = __webpack_require__(/*! ./buildFullPath */ "./lib/core/buildFullPath.js");
var validator = __webpack_require__(/*! ../helpers/validator */ "./lib/helpers/validator.js");

var validators = validator.validators;
/**
 * Create a new instance of Axios
 *
 * @param {Object} instanceConfig The default config for the instance
 */
function Axios(instanceConfig) {
  this.defaults = instanceConfig;
  this.interceptors = {
    request: new InterceptorManager(),
    response: new InterceptorManager()
  };
}

/**
 * Dispatch a request
 *
 * @param {Object} config The config specific for this request (merged with this.defaults)
 */
Axios.prototype.request = function request(configOrUrl, config) {
  /*eslint no-param-reassign:0*/
  // Allow for axios('example/url'[, config]) a la fetch API
  if (typeof configOrUrl === 'string') {
    config = config || {};
    config.url = configOrUrl;
  } else {
    config = configOrUrl || {};
  }

  config = mergeConfig(this.defaults, config);

  // Set config.method
  if (config.method) {
    config.method = config.method.toLowerCase();
  } else if (this.defaults.method) {
    config.method = this.defaults.method.toLowerCase();
  } else {
    config.method = 'get';
  }

  var transitional = config.transitional;

  if (transitional !== undefined) {
    validator.assertOptions(transitional, {
      silentJSONParsing: validators.transitional(validators.boolean),
      forcedJSONParsing: validators.transitional(validators.boolean),
      clarifyTimeoutError: validators.transitional(validators.boolean)
    }, false);
  }

  // filter out skipped interceptors
  var requestInterceptorChain = [];
  var synchronousRequestInterceptors = true;
  this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
    if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {
      return;
    }

    synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;

    requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);
  });

  var responseInterceptorChain = [];
  this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
    responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);
  });

  var promise;

  if (!synchronousRequestInterceptors) {
    var chain = [dispatchRequest, undefined];

    Array.prototype.unshift.apply(chain, requestInterceptorChain);
    chain = chain.concat(responseInterceptorChain);

    promise = Promise.resolve(config);
    while (chain.length) {
      promise = promise.then(chain.shift(), chain.shift());
    }

    return promise;
  }


  var newConfig = config;
  while (requestInterceptorChain.length) {
    var onFulfilled = requestInterceptorChain.shift();
    var onRejected = requestInterceptorChain.shift();
    try {
      newConfig = onFulfilled(newConfig);
    } catch (error) {
      onRejected(error);
      break;
    }
  }

  try {
    promise = dispatchRequest(newConfig);
  } catch (error) {
    return Promise.reject(error);
  }

  while (responseInterceptorChain.length) {
    promise = promise.then(responseInterceptorChain.shift(), responseInterceptorChain.shift());
  }

  return promise;
};

Axios.prototype.getUri = function getUri(config) {
  config = mergeConfig(this.defaults, config);
  var fullPath = buildFullPath(config.baseURL, config.url);
  return buildURL(fullPath, config.params, config.paramsSerializer);
};

// Provide aliases for supported request methods
utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {
  /*eslint func-names:0*/
  Axios.prototype[method] = function(url, config) {
    return this.request(mergeConfig(config || {}, {
      method: method,
      url: url,
      data: (config || {}).data
    }));
  };
});

utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
  /*eslint func-names:0*/

  function generateHTTPMethod(isForm) {
    return function httpMethod(url, data, config) {
      return this.request(mergeConfig(config || {}, {
        method: method,
        headers: isForm ? {
          'Content-Type': 'multipart/form-data'
        } : {},
        url: url,
        data: data
      }));
    };
  }

  Axios.prototype[method] = generateHTTPMethod();

  Axios.prototype[method + 'Form'] = generateHTTPMethod(true);
});

module.exports = Axios;


/***/ }),

/***/ "./lib/core/AxiosError.js":
/*!********************************!*\
  !*** ./lib/core/AxiosError.js ***!
  \********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(/*! ../utils */ "./lib/utils.js");

/**
 * Create an Error with the specified message, config, error code, request and response.
 *
 * @param {string} message The error message.
 * @param {string} [code] The error code (for example, 'ECONNABORTED').
 * @param {Object} [config] The config.
 * @param {Object} [request] The request.
 * @param {Object} [response] The response.
 * @returns {Error} The created error.
 */
function AxiosError(message, code, config, request, response) {
  Error.call(this);
  this.message = message;
  this.name = 'AxiosError';
  code && (this.code = code);
  config && (this.config = config);
  request && (this.request = request);
  response && (this.response = response);
}

utils.inherits(AxiosError, Error, {
  toJSON: function toJSON() {
    return {
      // Standard
      message: this.message,
      name: this.name,
      // Microsoft
      description: this.description,
      number: this.number,
      // Mozilla
      fileName: this.fileName,
      lineNumber: this.lineNumber,
      columnNumber: this.columnNumber,
      stack: this.stack,
      // Axios
      config: this.config,
      code: this.code,
      status: this.response && this.response.status ? this.response.status : null
    };
  }
});

var prototype = AxiosError.prototype;
var descriptors = {};

[
  'ERR_BAD_OPTION_VALUE',
  'ERR_BAD_OPTION',
  'ECONNABORTED',
  'ETIMEDOUT',
  'ERR_NETWORK',
  'ERR_FR_TOO_MANY_REDIRECTS',
  'ERR_DEPRECATED',
  'ERR_BAD_RESPONSE',
  'ERR_BAD_REQUEST',
  'ERR_CANCELED'
// eslint-disable-next-line func-names
].forEach(function(code) {
  descriptors[code] = {value: code};
});

Object.defineProperties(AxiosError, descriptors);
Object.defineProperty(prototype, 'isAxiosError', {value: true});

// eslint-disable-next-line func-names
AxiosError.from = function(error, code, config, request, response, customProps) {
  var axiosError = Object.create(prototype);

  utils.toFlatObject(error, axiosError, function filter(obj) {
    return obj !== Error.prototype;
  });

  AxiosError.call(axiosError, error.message, code, config, request, response);

  axiosError.name = error.name;

  customProps && Object.assign(axiosError, customProps);

  return axiosError;
};

module.exports = AxiosError;


/***/ }),

/***/ "./lib/core/InterceptorManager.js":
/*!****************************************!*\
  !*** ./lib/core/InterceptorManager.js ***!
  \****************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(/*! ./../utils */ "./lib/utils.js");

function InterceptorManager() {
  this.handlers = [];
}

/**
 * Add a new interceptor to the stack
 *
 * @param {Function} fulfilled The function to handle `then` for a `Promise`
 * @param {Function} rejected The function to handle `reject` for a `Promise`
 *
 * @return {Number} An ID used to remove interceptor later
 */
InterceptorManager.prototype.use = function use(fulfilled, rejected, options) {
  this.handlers.push({
    fulfilled: fulfilled,
    rejected: rejected,
    synchronous: options ? options.synchronous : false,
    runWhen: options ? options.runWhen : null
  });
  return this.handlers.length - 1;
};

/**
 * Remove an interceptor from the stack
 *
 * @param {Number} id The ID that was returned by `use`
 */
InterceptorManager.prototype.eject = function eject(id) {
  if (this.handlers[id]) {
    this.handlers[id] = null;
  }
};

/**
 * Iterate over all the registered interceptors
 *
 * This method is particularly useful for skipping over any
 * interceptors that may have become `null` calling `eject`.
 *
 * @param {Function} fn The function to call for each interceptor
 */
InterceptorManager.prototype.forEach = function forEach(fn) {
  utils.forEach(this.handlers, function forEachHandler(h) {
    if (h !== null) {
      fn(h);
    }
  });
};

module.exports = InterceptorManager;


/***/ }),

/***/ "./lib/core/buildFullPath.js":
/*!***********************************!*\
  !*** ./lib/core/buildFullPath.js ***!
  \***********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var isAbsoluteURL = __webpack_require__(/*! ../helpers/isAbsoluteURL */ "./lib/helpers/isAbsoluteURL.js");
var combineURLs = __webpack_require__(/*! ../helpers/combineURLs */ "./lib/helpers/combineURLs.js");

/**
 * Creates a new URL by combining the baseURL with the requestedURL,
 * only when the requestedURL is not already an absolute URL.
 * If the requestURL is absolute, this function returns the requestedURL untouched.
 *
 * @param {string} baseURL The base URL
 * @param {string} requestedURL Absolute or relative URL to combine
 * @returns {string} The combined full path
 */
module.exports = function buildFullPath(baseURL, requestedURL) {
  if (baseURL && !isAbsoluteURL(requestedURL)) {
    return combineURLs(baseURL, requestedURL);
  }
  return requestedURL;
};


/***/ }),

/***/ "./lib/core/dispatchRequest.js":
/*!*************************************!*\
  !*** ./lib/core/dispatchRequest.js ***!
  \*************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(/*! ./../utils */ "./lib/utils.js");
var transformData = __webpack_require__(/*! ./transformData */ "./lib/core/transformData.js");
var isCancel = __webpack_require__(/*! ../cancel/isCancel */ "./lib/cancel/isCancel.js");
var defaults = __webpack_require__(/*! ../defaults */ "./lib/defaults/index.js");
var CanceledError = __webpack_require__(/*! ../cancel/CanceledError */ "./lib/cancel/CanceledError.js");

/**
 * Throws a `CanceledError` if cancellation has been requested.
 */
function throwIfCancellationRequested(config) {
  if (config.cancelToken) {
    config.cancelToken.throwIfRequested();
  }

  if (config.signal && config.signal.aborted) {
    throw new CanceledError();
  }
}

/**
 * Dispatch a request to the server using the configured adapter.
 *
 * @param {object} config The config that is to be used for the request
 * @returns {Promise} The Promise to be fulfilled
 */
module.exports = function dispatchRequest(config) {
  throwIfCancellationRequested(config);

  // Ensure headers exist
  config.headers = config.headers || {};

  // Transform request data
  config.data = transformData.call(
    config,
    config.data,
    config.headers,
    config.transformRequest
  );

  // Flatten headers
  config.headers = utils.merge(
    config.headers.common || {},
    config.headers[config.method] || {},
    config.headers
  );

  utils.forEach(
    ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],
    function cleanHeaderConfig(method) {
      delete config.headers[method];
    }
  );

  var adapter = config.adapter || defaults.adapter;

  return adapter(config).then(function onAdapterResolution(response) {
    throwIfCancellationRequested(config);

    // Transform response data
    response.data = transformData.call(
      config,
      response.data,
      response.headers,
      config.transformResponse
    );

    return response;
  }, function onAdapterRejection(reason) {
    if (!isCancel(reason)) {
      throwIfCancellationRequested(config);

      // Transform response data
      if (reason && reason.response) {
        reason.response.data = transformData.call(
          config,
          reason.response.data,
          reason.response.headers,
          config.transformResponse
        );
      }
    }

    return Promise.reject(reason);
  });
};


/***/ }),

/***/ "./lib/core/mergeConfig.js":
/*!*********************************!*\
  !*** ./lib/core/mergeConfig.js ***!
  \*********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(/*! ../utils */ "./lib/utils.js");

/**
 * Config-specific merge-function which creates a new config-object
 * by merging two configuration objects together.
 *
 * @param {Object} config1
 * @param {Object} config2
 * @returns {Object} New object resulting from merging config2 to config1
 */
module.exports = function mergeConfig(config1, config2) {
  // eslint-disable-next-line no-param-reassign
  config2 = config2 || {};
  var config = {};

  function getMergedValue(target, source) {
    if (utils.isPlainObject(target) && utils.isPlainObject(source)) {
      return utils.merge(target, source);
    } else if (utils.isPlainObject(source)) {
      return utils.merge({}, source);
    } else if (utils.isArray(source)) {
      return source.slice();
    }
    return source;
  }

  // eslint-disable-next-line consistent-return
  function mergeDeepProperties(prop) {
    if (!utils.isUndefined(config2[prop])) {
      return getMergedValue(config1[prop], config2[prop]);
    } else if (!utils.isUndefined(config1[prop])) {
      return getMergedValue(undefined, config1[prop]);
    }
  }

  // eslint-disable-next-line consistent-return
  function valueFromConfig2(prop) {
    if (!utils.isUndefined(config2[prop])) {
      return getMergedValue(undefined, config2[prop]);
    }
  }

  // eslint-disable-next-line consistent-return
  function defaultToConfig2(prop) {
    if (!utils.isUndefined(config2[prop])) {
      return getMergedValue(undefined, config2[prop]);
    } else if (!utils.isUndefined(config1[prop])) {
      return getMergedValue(undefined, config1[prop]);
    }
  }

  // eslint-disable-next-line consistent-return
  function mergeDirectKeys(prop) {
    if (prop in config2) {
      return getMergedValue(config1[prop], config2[prop]);
    } else if (prop in config1) {
      return getMergedValue(undefined, config1[prop]);
    }
  }

  var mergeMap = {
    'url': valueFromConfig2,
    'method': valueFromConfig2,
    'data': valueFromConfig2,
    'baseURL': defaultToConfig2,
    'transformRequest': defaultToConfig2,
    'transformResponse': defaultToConfig2,
    'paramsSerializer': defaultToConfig2,
    'timeout': defaultToConfig2,
    'timeoutMessage': defaultToConfig2,
    'withCredentials': defaultToConfig2,
    'adapter': defaultToConfig2,
    'responseType': defaultToConfig2,
    'xsrfCookieName': defaultToConfig2,
    'xsrfHeaderName': defaultToConfig2,
    'onUploadProgress': defaultToConfig2,
    'onDownloadProgress': defaultToConfig2,
    'decompress': defaultToConfig2,
    'maxContentLength': defaultToConfig2,
    'maxBodyLength': defaultToConfig2,
    'beforeRedirect': defaultToConfig2,
    'transport': defaultToConfig2,
    'httpAgent': defaultToConfig2,
    'httpsAgent': defaultToConfig2,
    'cancelToken': defaultToConfig2,
    'socketPath': defaultToConfig2,
    'responseEncoding': defaultToConfig2,
    'validateStatus': mergeDirectKeys
  };

  utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {
    var merge = mergeMap[prop] || mergeDeepProperties;
    var configValue = merge(prop);
    (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);
  });

  return config;
};


/***/ }),

/***/ "./lib/core/settle.js":
/*!****************************!*\
  !*** ./lib/core/settle.js ***!
  \****************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var AxiosError = __webpack_require__(/*! ./AxiosError */ "./lib/core/AxiosError.js");

/**
 * Resolve or reject a Promise based on response status.
 *
 * @param {Function} resolve A function that resolves the promise.
 * @param {Function} reject A function that rejects the promise.
 * @param {object} response The response.
 */
module.exports = function settle(resolve, reject, response) {
  var validateStatus = response.config.validateStatus;
  if (!response.status || !validateStatus || validateStatus(response.status)) {
    resolve(response);
  } else {
    reject(new AxiosError(
      'Request failed with status code ' + response.status,
      [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],
      response.config,
      response.request,
      response
    ));
  }
};


/***/ }),

/***/ "./lib/core/transformData.js":
/*!***********************************!*\
  !*** ./lib/core/transformData.js ***!
  \***********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(/*! ./../utils */ "./lib/utils.js");
var defaults = __webpack_require__(/*! ../defaults */ "./lib/defaults/index.js");

/**
 * Transform the data for a request or a response
 *
 * @param {Object|String} data The data to be transformed
 * @param {Array} headers The headers for the request or response
 * @param {Array|Function} fns A single function or Array of functions
 * @returns {*} The resulting transformed data
 */
module.exports = function transformData(data, headers, fns) {
  var context = this || defaults;
  /*eslint no-param-reassign:0*/
  utils.forEach(fns, function transform(fn) {
    data = fn.call(context, data, headers);
  });

  return data;
};


/***/ }),

/***/ "./lib/defaults/index.js":
/*!*******************************!*\
  !*** ./lib/defaults/index.js ***!
  \*******************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(/*! ../utils */ "./lib/utils.js");
var normalizeHeaderName = __webpack_require__(/*! ../helpers/normalizeHeaderName */ "./lib/helpers/normalizeHeaderName.js");
var AxiosError = __webpack_require__(/*! ../core/AxiosError */ "./lib/core/AxiosError.js");
var transitionalDefaults = __webpack_require__(/*! ./transitional */ "./lib/defaults/transitional.js");
var toFormData = __webpack_require__(/*! ../helpers/toFormData */ "./lib/helpers/toFormData.js");

var DEFAULT_CONTENT_TYPE = {
  'Content-Type': 'application/x-www-form-urlencoded'
};

function setContentTypeIfUnset(headers, value) {
  if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {
    headers['Content-Type'] = value;
  }
}

function getDefaultAdapter() {
  var adapter;
  if (typeof XMLHttpRequest !== 'undefined') {
    // For browsers use XHR adapter
    adapter = __webpack_require__(/*! ../adapters/xhr */ "./lib/adapters/xhr.js");
  } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {
    // For node use HTTP adapter
    adapter = __webpack_require__(/*! ../adapters/http */ "./lib/adapters/xhr.js");
  }
  return adapter;
}

function stringifySafely(rawValue, parser, encoder) {
  if (utils.isString(rawValue)) {
    try {
      (parser || JSON.parse)(rawValue);
      return utils.trim(rawValue);
    } catch (e) {
      if (e.name !== 'SyntaxError') {
        throw e;
      }
    }
  }

  return (encoder || JSON.stringify)(rawValue);
}

var defaults = {

  transitional: transitionalDefaults,

  adapter: getDefaultAdapter(),

  transformRequest: [function transformRequest(data, headers) {
    normalizeHeaderName(headers, 'Accept');
    normalizeHeaderName(headers, 'Content-Type');

    if (utils.isFormData(data) ||
      utils.isArrayBuffer(data) ||
      utils.isBuffer(data) ||
      utils.isStream(data) ||
      utils.isFile(data) ||
      utils.isBlob(data)
    ) {
      return data;
    }
    if (utils.isArrayBufferView(data)) {
      return data.buffer;
    }
    if (utils.isURLSearchParams(data)) {
      setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');
      return data.toString();
    }

    var isObjectPayload = utils.isObject(data);
    var contentType = headers && headers['Content-Type'];

    var isFileList;

    if ((isFileList = utils.isFileList(data)) || (isObjectPayload && contentType === 'multipart/form-data')) {
      var _FormData = this.env && this.env.FormData;
      return toFormData(isFileList ? {'files[]': data} : data, _FormData && new _FormData());
    } else if (isObjectPayload || contentType === 'application/json') {
      setContentTypeIfUnset(headers, 'application/json');
      return stringifySafely(data);
    }

    return data;
  }],

  transformResponse: [function transformResponse(data) {
    var transitional = this.transitional || defaults.transitional;
    var silentJSONParsing = transitional && transitional.silentJSONParsing;
    var forcedJSONParsing = transitional && transitional.forcedJSONParsing;
    var strictJSONParsing = !silentJSONParsing && this.responseType === 'json';

    if (strictJSONParsing || (forcedJSONParsing && utils.isString(data) && data.length)) {
      try {
        return JSON.parse(data);
      } catch (e) {
        if (strictJSONParsing) {
          if (e.name === 'SyntaxError') {
            throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);
          }
          throw e;
        }
      }
    }

    return data;
  }],

  /**
   * A timeout in milliseconds to abort a request. If set to 0 (default) a
   * timeout is not created.
   */
  timeout: 0,

  xsrfCookieName: 'XSRF-TOKEN',
  xsrfHeaderName: 'X-XSRF-TOKEN',

  maxContentLength: -1,
  maxBodyLength: -1,

  env: {
    FormData: __webpack_require__(/*! ./env/FormData */ "./lib/helpers/null.js")
  },

  validateStatus: function validateStatus(status) {
    return status >= 200 && status < 300;
  },

  headers: {
    common: {
      'Accept': 'application/json, text/plain, */*'
    }
  }
};

utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {
  defaults.headers[method] = {};
});

utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
  defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);
});

module.exports = defaults;


/***/ }),

/***/ "./lib/defaults/transitional.js":
/*!**************************************!*\
  !*** ./lib/defaults/transitional.js ***!
  \**************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


module.exports = {
  silentJSONParsing: true,
  forcedJSONParsing: true,
  clarifyTimeoutError: false
};


/***/ }),

/***/ "./lib/env/data.js":
/*!*************************!*\
  !*** ./lib/env/data.js ***!
  \*************************/
/*! no static exports found */
/***/ (function(module, exports) {

module.exports = {
  "version": "0.27.2"
};

/***/ }),

/***/ "./lib/helpers/bind.js":
/*!*****************************!*\
  !*** ./lib/helpers/bind.js ***!
  \*****************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


module.exports = function bind(fn, thisArg) {
  return function wrap() {
    var args = new Array(arguments.length);
    for (var i = 0; i < args.length; i++) {
      args[i] = arguments[i];
    }
    return fn.apply(thisArg, args);
  };
};


/***/ }),

/***/ "./lib/helpers/buildURL.js":
/*!*********************************!*\
  !*** ./lib/helpers/buildURL.js ***!
  \*********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(/*! ./../utils */ "./lib/utils.js");

function encode(val) {
  return encodeURIComponent(val).
    replace(/%3A/gi, ':').
    replace(/%24/g, '$').
    replace(/%2C/gi, ',').
    replace(/%20/g, '+').
    replace(/%5B/gi, '[').
    replace(/%5D/gi, ']');
}

/**
 * Build a URL by appending params to the end
 *
 * @param {string} url The base of the url (e.g., http://www.google.com)
 * @param {object} [params] The params to be appended
 * @returns {string} The formatted url
 */
module.exports = function buildURL(url, params, paramsSerializer) {
  /*eslint no-param-reassign:0*/
  if (!params) {
    return url;
  }

  var serializedParams;
  if (paramsSerializer) {
    serializedParams = paramsSerializer(params);
  } else if (utils.isURLSearchParams(params)) {
    serializedParams = params.toString();
  } else {
    var parts = [];

    utils.forEach(params, function serialize(val, key) {
      if (val === null || typeof val === 'undefined') {
        return;
      }

      if (utils.isArray(val)) {
        key = key + '[]';
      } else {
        val = [val];
      }

      utils.forEach(val, function parseValue(v) {
        if (utils.isDate(v)) {
          v = v.toISOString();
        } else if (utils.isObject(v)) {
          v = JSON.stringify(v);
        }
        parts.push(encode(key) + '=' + encode(v));
      });
    });

    serializedParams = parts.join('&');
  }

  if (serializedParams) {
    var hashmarkIndex = url.indexOf('#');
    if (hashmarkIndex !== -1) {
      url = url.slice(0, hashmarkIndex);
    }

    url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;
  }

  return url;
};


/***/ }),

/***/ "./lib/helpers/combineURLs.js":
/*!************************************!*\
  !*** ./lib/helpers/combineURLs.js ***!
  \************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


/**
 * Creates a new URL by combining the specified URLs
 *
 * @param {string} baseURL The base URL
 * @param {string} relativeURL The relative URL
 * @returns {string} The combined URL
 */
module.exports = function combineURLs(baseURL, relativeURL) {
  return relativeURL
    ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '')
    : baseURL;
};


/***/ }),

/***/ "./lib/helpers/cookies.js":
/*!********************************!*\
  !*** ./lib/helpers/cookies.js ***!
  \********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(/*! ./../utils */ "./lib/utils.js");

module.exports = (
  utils.isStandardBrowserEnv() ?

  // Standard browser envs support document.cookie
    (function standardBrowserEnv() {
      return {
        write: function write(name, value, expires, path, domain, secure) {
          var cookie = [];
          cookie.push(name + '=' + encodeURIComponent(value));

          if (utils.isNumber(expires)) {
            cookie.push('expires=' + new Date(expires).toGMTString());
          }

          if (utils.isString(path)) {
            cookie.push('path=' + path);
          }

          if (utils.isString(domain)) {
            cookie.push('domain=' + domain);
          }

          if (secure === true) {
            cookie.push('secure');
          }

          document.cookie = cookie.join('; ');
        },

        read: function read(name) {
          var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)'));
          return (match ? decodeURIComponent(match[3]) : null);
        },

        remove: function remove(name) {
          this.write(name, '', Date.now() - 86400000);
        }
      };
    })() :

  // Non standard browser env (web workers, react-native) lack needed support.
    (function nonStandardBrowserEnv() {
      return {
        write: function write() {},
        read: function read() { return null; },
        remove: function remove() {}
      };
    })()
);


/***/ }),

/***/ "./lib/helpers/isAbsoluteURL.js":
/*!**************************************!*\
  !*** ./lib/helpers/isAbsoluteURL.js ***!
  \**************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


/**
 * Determines whether the specified URL is absolute
 *
 * @param {string} url The URL to test
 * @returns {boolean} True if the specified URL is absolute, otherwise false
 */
module.exports = function isAbsoluteURL(url) {
  // A URL is considered absolute if it begins with "<scheme>://" or "//" (protocol-relative URL).
  // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
  // by any combination of letters, digits, plus, period, or hyphen.
  return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url);
};


/***/ }),

/***/ "./lib/helpers/isAxiosError.js":
/*!*************************************!*\
  !*** ./lib/helpers/isAxiosError.js ***!
  \*************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(/*! ./../utils */ "./lib/utils.js");

/**
 * Determines whether the payload is an error thrown by Axios
 *
 * @param {*} payload The value to test
 * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false
 */
module.exports = function isAxiosError(payload) {
  return utils.isObject(payload) && (payload.isAxiosError === true);
};


/***/ }),

/***/ "./lib/helpers/isURLSameOrigin.js":
/*!****************************************!*\
  !*** ./lib/helpers/isURLSameOrigin.js ***!
  \****************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(/*! ./../utils */ "./lib/utils.js");

module.exports = (
  utils.isStandardBrowserEnv() ?

  // Standard browser envs have full support of the APIs needed to test
  // whether the request URL is of the same origin as current location.
    (function standardBrowserEnv() {
      var msie = /(msie|trident)/i.test(navigator.userAgent);
      var urlParsingNode = document.createElement('a');
      var originURL;

      /**
    * Parse a URL to discover it's components
    *
    * @param {String} url The URL to be parsed
    * @returns {Object}
    */
      function resolveURL(url) {
        var href = url;

        if (msie) {
        // IE needs attribute set twice to normalize properties
          urlParsingNode.setAttribute('href', href);
          href = urlParsingNode.href;
        }

        urlParsingNode.setAttribute('href', href);

        // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
        return {
          href: urlParsingNode.href,
          protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',
          host: urlParsingNode.host,
          search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '',
          hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',
          hostname: urlParsingNode.hostname,
          port: urlParsingNode.port,
          pathname: (urlParsingNode.pathname.charAt(0) === '/') ?
            urlParsingNode.pathname :
            '/' + urlParsingNode.pathname
        };
      }

      originURL = resolveURL(window.location.href);

      /**
    * Determine if a URL shares the same origin as the current location
    *
    * @param {String} requestURL The URL to test
    * @returns {boolean} True if URL shares the same origin, otherwise false
    */
      return function isURLSameOrigin(requestURL) {
        var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;
        return (parsed.protocol === originURL.protocol &&
            parsed.host === originURL.host);
      };
    })() :

  // Non standard browser envs (web workers, react-native) lack needed support.
    (function nonStandardBrowserEnv() {
      return function isURLSameOrigin() {
        return true;
      };
    })()
);


/***/ }),

/***/ "./lib/helpers/normalizeHeaderName.js":
/*!********************************************!*\
  !*** ./lib/helpers/normalizeHeaderName.js ***!
  \********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(/*! ../utils */ "./lib/utils.js");

module.exports = function normalizeHeaderName(headers, normalizedName) {
  utils.forEach(headers, function processHeader(value, name) {
    if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {
      headers[normalizedName] = value;
      delete headers[name];
    }
  });
};


/***/ }),

/***/ "./lib/helpers/null.js":
/*!*****************************!*\
  !*** ./lib/helpers/null.js ***!
  \*****************************/
/*! no static exports found */
/***/ (function(module, exports) {

// eslint-disable-next-line strict
module.exports = null;


/***/ }),

/***/ "./lib/helpers/parseHeaders.js":
/*!*************************************!*\
  !*** ./lib/helpers/parseHeaders.js ***!
  \*************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(/*! ./../utils */ "./lib/utils.js");

// Headers whose duplicates are ignored by node
// c.f. https://nodejs.org/api/http.html#http_message_headers
var ignoreDuplicateOf = [
  'age', 'authorization', 'content-length', 'content-type', 'etag',
  'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',
  'last-modified', 'location', 'max-forwards', 'proxy-authorization',
  'referer', 'retry-after', 'user-agent'
];

/**
 * Parse headers into an object
 *
 * ```
 * Date: Wed, 27 Aug 2014 08:58:49 GMT
 * Content-Type: application/json
 * Connection: keep-alive
 * Transfer-Encoding: chunked
 * ```
 *
 * @param {String} headers Headers needing to be parsed
 * @returns {Object} Headers parsed into an object
 */
module.exports = function parseHeaders(headers) {
  var parsed = {};
  var key;
  var val;
  var i;

  if (!headers) { return parsed; }

  utils.forEach(headers.split('\n'), function parser(line) {
    i = line.indexOf(':');
    key = utils.trim(line.substr(0, i)).toLowerCase();
    val = utils.trim(line.substr(i + 1));

    if (key) {
      if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {
        return;
      }
      if (key === 'set-cookie') {
        parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);
      } else {
        parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
      }
    }
  });

  return parsed;
};


/***/ }),

/***/ "./lib/helpers/parseProtocol.js":
/*!**************************************!*\
  !*** ./lib/helpers/parseProtocol.js ***!
  \**************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


module.exports = function parseProtocol(url) {
  var match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url);
  return match && match[1] || '';
};


/***/ }),

/***/ "./lib/helpers/spread.js":
/*!*******************************!*\
  !*** ./lib/helpers/spread.js ***!
  \*******************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


/**
 * Syntactic sugar for invoking a function and expanding an array for arguments.
 *
 * Common use case would be to use `Function.prototype.apply`.
 *
 *  ```js
 *  function f(x, y, z) {}
 *  var args = [1, 2, 3];
 *  f.apply(null, args);
 *  ```
 *
 * With `spread` this example can be re-written.
 *
 *  ```js
 *  spread(function(x, y, z) {})([1, 2, 3]);
 *  ```
 *
 * @param {Function} callback
 * @returns {Function}
 */
module.exports = function spread(callback) {
  return function wrap(arr) {
    return callback.apply(null, arr);
  };
};


/***/ }),

/***/ "./lib/helpers/toFormData.js":
/*!***********************************!*\
  !*** ./lib/helpers/toFormData.js ***!
  \***********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var utils = __webpack_require__(/*! ../utils */ "./lib/utils.js");

/**
 * Convert a data object to FormData
 * @param {Object} obj
 * @param {?Object} [formData]
 * @returns {Object}
 **/

function toFormData(obj, formData) {
  // eslint-disable-next-line no-param-reassign
  formData = formData || new FormData();

  var stack = [];

  function convertValue(value) {
    if (value === null) return '';

    if (utils.isDate(value)) {
      return value.toISOString();
    }

    if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {
      return typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);
    }

    return value;
  }

  function build(data, parentKey) {
    if (utils.isPlainObject(data) || utils.isArray(data)) {
      if (stack.indexOf(data) !== -1) {
        throw Error('Circular reference detected in ' + parentKey);
      }

      stack.push(data);

      utils.forEach(data, function each(value, key) {
        if (utils.isUndefined(value)) return;
        var fullKey = parentKey ? parentKey + '.' + key : key;
        var arr;

        if (value && !parentKey && typeof value === 'object') {
          if (utils.endsWith(key, '{}')) {
            // eslint-disable-next-line no-param-reassign
            value = JSON.stringify(value);
          } else if (utils.endsWith(key, '[]') && (arr = utils.toArray(value))) {
            // eslint-disable-next-line func-names
            arr.forEach(function(el) {
              !utils.isUndefined(el) && formData.append(fullKey, convertValue(el));
            });
            return;
          }
        }

        build(value, fullKey);
      });

      stack.pop();
    } else {
      formData.append(parentKey, convertValue(data));
    }
  }

  build(obj);

  return formData;
}

module.exports = toFormData;


/***/ }),

/***/ "./lib/helpers/validator.js":
/*!**********************************!*\
  !*** ./lib/helpers/validator.js ***!
  \**********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var VERSION = __webpack_require__(/*! ../env/data */ "./lib/env/data.js").version;
var AxiosError = __webpack_require__(/*! ../core/AxiosError */ "./lib/core/AxiosError.js");

var validators = {};

// eslint-disable-next-line func-names
['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach(function(type, i) {
  validators[type] = function validator(thing) {
    return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;
  };
});

var deprecatedWarnings = {};

/**
 * Transitional option validator
 * @param {function|boolean?} validator - set to false if the transitional option has been removed
 * @param {string?} version - deprecated version / removed since version
 * @param {string?} message - some message with additional info
 * @returns {function}
 */
validators.transitional = function transitional(validator, version, message) {
  function formatMessage(opt, desc) {
    return '[Axios v' + VERSION + '] Transitional option \'' + opt + '\'' + desc + (message ? '. ' + message : '');
  }

  // eslint-disable-next-line func-names
  return function(value, opt, opts) {
    if (validator === false) {
      throw new AxiosError(
        formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),
        AxiosError.ERR_DEPRECATED
      );
    }

    if (version && !deprecatedWarnings[opt]) {
      deprecatedWarnings[opt] = true;
      // eslint-disable-next-line no-console
      console.warn(
        formatMessage(
          opt,
          ' has been deprecated since v' + version + ' and will be removed in the near future'
        )
      );
    }

    return validator ? validator(value, opt, opts) : true;
  };
};

/**
 * Assert object's properties type
 * @param {object} options
 * @param {object} schema
 * @param {boolean?} allowUnknown
 */

function assertOptions(options, schema, allowUnknown) {
  if (typeof options !== 'object') {
    throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);
  }
  var keys = Object.keys(options);
  var i = keys.length;
  while (i-- > 0) {
    var opt = keys[i];
    var validator = schema[opt];
    if (validator) {
      var value = options[opt];
      var result = value === undefined || validator(value, opt, options);
      if (result !== true) {
        throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);
      }
      continue;
    }
    if (allowUnknown !== true) {
      throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);
    }
  }
}

module.exports = {
  assertOptions: assertOptions,
  validators: validators
};


/***/ }),

/***/ "./lib/utils.js":
/*!**********************!*\
  !*** ./lib/utils.js ***!
  \**********************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

"use strict";


var bind = __webpack_require__(/*! ./helpers/bind */ "./lib/helpers/bind.js");

// utils is a library of generic helper functions non-specific to axios

var toString = Object.prototype.toString;

// eslint-disable-next-line func-names
var kindOf = (function(cache) {
  // eslint-disable-next-line func-names
  return function(thing) {
    var str = toString.call(thing);
    return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());
  };
})(Object.create(null));

function kindOfTest(type) {
  type = type.toLowerCase();
  return function isKindOf(thing) {
    return kindOf(thing) === type;
  };
}

/**
 * Determine if a value is an Array
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is an Array, otherwise false
 */
function isArray(val) {
  return Array.isArray(val);
}

/**
 * Determine if a value is undefined
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if the value is undefined, otherwise false
 */
function isUndefined(val) {
  return typeof val === 'undefined';
}

/**
 * Determine if a value is a Buffer
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a Buffer, otherwise false
 */
function isBuffer(val) {
  return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)
    && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val);
}

/**
 * Determine if a value is an ArrayBuffer
 *
 * @function
 * @param {Object} val The value to test
 * @returns {boolean} True if value is an ArrayBuffer, otherwise false
 */
var isArrayBuffer = kindOfTest('ArrayBuffer');


/**
 * Determine if a value is a view on an ArrayBuffer
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false
 */
function isArrayBufferView(val) {
  var result;
  if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {
    result = ArrayBuffer.isView(val);
  } else {
    result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));
  }
  return result;
}

/**
 * Determine if a value is a String
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a String, otherwise false
 */
function isString(val) {
  return typeof val === 'string';
}

/**
 * Determine if a value is a Number
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a Number, otherwise false
 */
function isNumber(val) {
  return typeof val === 'number';
}

/**
 * Determine if a value is an Object
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is an Object, otherwise false
 */
function isObject(val) {
  return val !== null && typeof val === 'object';
}

/**
 * Determine if a value is a plain Object
 *
 * @param {Object} val The value to test
 * @return {boolean} True if value is a plain Object, otherwise false
 */
function isPlainObject(val) {
  if (kindOf(val) !== 'object') {
    return false;
  }

  var prototype = Object.getPrototypeOf(val);
  return prototype === null || prototype === Object.prototype;
}

/**
 * Determine if a value is a Date
 *
 * @function
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a Date, otherwise false
 */
var isDate = kindOfTest('Date');

/**
 * Determine if a value is a File
 *
 * @function
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a File, otherwise false
 */
var isFile = kindOfTest('File');

/**
 * Determine if a value is a Blob
 *
 * @function
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a Blob, otherwise false
 */
var isBlob = kindOfTest('Blob');

/**
 * Determine if a value is a FileList
 *
 * @function
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a File, otherwise false
 */
var isFileList = kindOfTest('FileList');

/**
 * Determine if a value is a Function
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a Function, otherwise false
 */
function isFunction(val) {
  return toString.call(val) === '[object Function]';
}

/**
 * Determine if a value is a Stream
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a Stream, otherwise false
 */
function isStream(val) {
  return isObject(val) && isFunction(val.pipe);
}

/**
 * Determine if a value is a FormData
 *
 * @param {Object} thing The value to test
 * @returns {boolean} True if value is an FormData, otherwise false
 */
function isFormData(thing) {
  var pattern = '[object FormData]';
  return thing && (
    (typeof FormData === 'function' && thing instanceof FormData) ||
    toString.call(thing) === pattern ||
    (isFunction(thing.toString) && thing.toString() === pattern)
  );
}

/**
 * Determine if a value is a URLSearchParams object
 * @function
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a URLSearchParams object, otherwise false
 */
var isURLSearchParams = kindOfTest('URLSearchParams');

/**
 * Trim excess whitespace off the beginning and end of a string
 *
 * @param {String} str The String to trim
 * @returns {String} The String freed of excess whitespace
 */
function trim(str) {
  return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, '');
}

/**
 * Determine if we're running in a standard browser environment
 *
 * This allows axios to run in a web worker, and react-native.
 * Both environments support XMLHttpRequest, but not fully standard globals.
 *
 * web workers:
 *  typeof window -> undefined
 *  typeof document -> undefined
 *
 * react-native:
 *  navigator.product -> 'ReactNative'
 * nativescript
 *  navigator.product -> 'NativeScript' or 'NS'
 */
function isStandardBrowserEnv() {
  if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' ||
                                           navigator.product === 'NativeScript' ||
                                           navigator.product === 'NS')) {
    return false;
  }
  return (
    typeof window !== 'undefined' &&
    typeof document !== 'undefined'
  );
}

/**
 * Iterate over an Array or an Object invoking a function for each item.
 *
 * If `obj` is an Array callback will be called passing
 * the value, index, and complete array for each item.
 *
 * If 'obj' is an Object callback will be called passing
 * the value, key, and complete object for each property.
 *
 * @param {Object|Array} obj The object to iterate
 * @param {Function} fn The callback to invoke for each item
 */
function forEach(obj, fn) {
  // Don't bother if no value provided
  if (obj === null || typeof obj === 'undefined') {
    return;
  }

  // Force an array if not already something iterable
  if (typeof obj !== 'object') {
    /*eslint no-param-reassign:0*/
    obj = [obj];
  }

  if (isArray(obj)) {
    // Iterate over array values
    for (var i = 0, l = obj.length; i < l; i++) {
      fn.call(null, obj[i], i, obj);
    }
  } else {
    // Iterate over object keys
    for (var key in obj) {
      if (Object.prototype.hasOwnProperty.call(obj, key)) {
        fn.call(null, obj[key], key, obj);
      }
    }
  }
}

/**
 * Accepts varargs expecting each argument to be an object, then
 * immutably merges the properties of each object and returns result.
 *
 * When multiple objects contain the same key the later object in
 * the arguments list will take precedence.
 *
 * Example:
 *
 * ```js
 * var result = merge({foo: 123}, {foo: 456});
 * console.log(result.foo); // outputs 456
 * ```
 *
 * @param {Object} obj1 Object to merge
 * @returns {Object} Result of all merge properties
 */
function merge(/* obj1, obj2, obj3, ... */) {
  var result = {};
  function assignValue(val, key) {
    if (isPlainObject(result[key]) && isPlainObject(val)) {
      result[key] = merge(result[key], val);
    } else if (isPlainObject(val)) {
      result[key] = merge({}, val);
    } else if (isArray(val)) {
      result[key] = val.slice();
    } else {
      result[key] = val;
    }
  }

  for (var i = 0, l = arguments.length; i < l; i++) {
    forEach(arguments[i], assignValue);
  }
  return result;
}

/**
 * Extends object a by mutably adding to it the properties of object b.
 *
 * @param {Object} a The object to be extended
 * @param {Object} b The object to copy properties from
 * @param {Object} thisArg The object to bind function to
 * @return {Object} The resulting value of object a
 */
function extend(a, b, thisArg) {
  forEach(b, function assignValue(val, key) {
    if (thisArg && typeof val === 'function') {
      a[key] = bind(val, thisArg);
    } else {
      a[key] = val;
    }
  });
  return a;
}

/**
 * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)
 *
 * @param {string} content with BOM
 * @return {string} content value without BOM
 */
function stripBOM(content) {
  if (content.charCodeAt(0) === 0xFEFF) {
    content = content.slice(1);
  }
  return content;
}

/**
 * Inherit the prototype methods from one constructor into another
 * @param {function} constructor
 * @param {function} superConstructor
 * @param {object} [props]
 * @param {object} [descriptors]
 */

function inherits(constructor, superConstructor, props, descriptors) {
  constructor.prototype = Object.create(superConstructor.prototype, descriptors);
  constructor.prototype.constructor = constructor;
  props && Object.assign(constructor.prototype, props);
}

/**
 * Resolve object with deep prototype chain to a flat object
 * @param {Object} sourceObj source object
 * @param {Object} [destObj]
 * @param {Function} [filter]
 * @returns {Object}
 */

function toFlatObject(sourceObj, destObj, filter) {
  var props;
  var i;
  var prop;
  var merged = {};

  destObj = destObj || {};

  do {
    props = Object.getOwnPropertyNames(sourceObj);
    i = props.length;
    while (i-- > 0) {
      prop = props[i];
      if (!merged[prop]) {
        destObj[prop] = sourceObj[prop];
        merged[prop] = true;
      }
    }
    sourceObj = Object.getPrototypeOf(sourceObj);
  } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);

  return destObj;
}

/*
 * determines whether a string ends with the characters of a specified string
 * @param {String} str
 * @param {String} searchString
 * @param {Number} [position= 0]
 * @returns {boolean}
 */
function endsWith(str, searchString, position) {
  str = String(str);
  if (position === undefined || position > str.length) {
    position = str.length;
  }
  position -= searchString.length;
  var lastIndex = str.indexOf(searchString, position);
  return lastIndex !== -1 && lastIndex === position;
}


/**
 * Returns new array from array like object
 * @param {*} [thing]
 * @returns {Array}
 */
function toArray(thing) {
  if (!thing) return null;
  var i = thing.length;
  if (isUndefined(i)) return null;
  var arr = new Array(i);
  while (i-- > 0) {
    arr[i] = thing[i];
  }
  return arr;
}

// eslint-disable-next-line func-names
var isTypedArray = (function(TypedArray) {
  // eslint-disable-next-line func-names
  return function(thing) {
    return TypedArray && thing instanceof TypedArray;
  };
})(typeof Uint8Array !== 'undefined' && Object.getPrototypeOf(Uint8Array));

module.exports = {
  isArray: isArray,
  isArrayBuffer: isArrayBuffer,
  isBuffer: isBuffer,
  isFormData: isFormData,
  isArrayBufferView: isArrayBufferView,
  isString: isString,
  isNumber: isNumber,
  isObject: isObject,
  isPlainObject: isPlainObject,
  isUndefined: isUndefined,
  isDate: isDate,
  isFile: isFile,
  isBlob: isBlob,
  isFunction: isFunction,
  isStream: isStream,
  isURLSearchParams: isURLSearchParams,
  isStandardBrowserEnv: isStandardBrowserEnv,
  forEach: forEach,
  merge: merge,
  extend: extend,
  trim: trim,
  stripBOM: stripBOM,
  inherits: inherits,
  toFlatObject: toFlatObject,
  kindOf: kindOf,
  kindOfTest: kindOfTest,
  endsWith: endsWith,
  toArray: toArray,
  isTypedArray: isTypedArray,
  isFileList: isFileList
};


/***/ })

/******/ });
});
//# sourceMappingURL=axios.map/* axios v0.27.2 | (c) 2022 by Matt Zabriskie */
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.axios=t():e.axios=t()}(this,(function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=13)}([function(e,t,n){"use strict";var r,o=n(4),i=Object.prototype.toString,s=(r=Object.create(null),function(e){var t=i.call(e);return r[t]||(r[t]=t.slice(8,-1).toLowerCase())});function a(e){return e=e.toLowerCase(),function(t){return s(t)===e}}function u(e){return Array.isArray(e)}function c(e){return void 0===e}var f=a("ArrayBuffer");function l(e){return null!==e&&"object"==typeof e}function p(e){if("object"!==s(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}var d=a("Date"),h=a("File"),m=a("Blob"),v=a("FileList");function y(e){return"[object Function]"===i.call(e)}var g=a("URLSearchParams");function E(e,t){if(null!=e)if("object"!=typeof e&&(e=[e]),u(e))for(var n=0,r=e.length;n<r;n++)t.call(null,e[n],n,e);else for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&t.call(null,e[o],o,e)}var b,O=(b="undefined"!=typeof Uint8Array&&Object.getPrototypeOf(Uint8Array),function(e){return b&&e instanceof b});e.exports={isArray:u,isArrayBuffer:f,isBuffer:function(e){return null!==e&&!c(e)&&null!==e.constructor&&!c(e.constructor)&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)},isFormData:function(e){return e&&("function"==typeof FormData&&e instanceof FormData||"[object FormData]"===i.call(e)||y(e.toString)&&"[object FormData]"===e.toString())},isArrayBufferView:function(e){return"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&f(e.buffer)},isString:function(e){return"string"==typeof e},isNumber:function(e){return"number"==typeof e},isObject:l,isPlainObject:p,isUndefined:c,isDate:d,isFile:h,isBlob:m,isFunction:y,isStream:function(e){return l(e)&&y(e.pipe)},isURLSearchParams:g,isStandardBrowserEnv:function(){return("undefined"==typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)},forEach:E,merge:function e(){var t={};function n(n,r){p(t[r])&&p(n)?t[r]=e(t[r],n):p(n)?t[r]=e({},n):u(n)?t[r]=n.slice():t[r]=n}for(var r=0,o=arguments.length;r<o;r++)E(arguments[r],n);return t},extend:function(e,t,n){return E(t,(function(t,r){e[r]=n&&"function"==typeof t?o(t,n):t})),e},trim:function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")},stripBOM:function(e){return 65279===e.charCodeAt(0)&&(e=e.slice(1)),e},inherits:function(e,t,n,r){e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,n&&Object.assign(e.prototype,n)},toFlatObject:function(e,t,n){var r,o,i,s={};t=t||{};do{for(o=(r=Object.getOwnPropertyNames(e)).length;o-- >0;)s[i=r[o]]||(t[i]=e[i],s[i]=!0);e=Object.getPrototypeOf(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},kindOf:s,kindOfTest:a,endsWith:function(e,t,n){e=String(e),(void 0===n||n>e.length)&&(n=e.length),n-=t.length;var r=e.indexOf(t,n);return-1!==r&&r===n},toArray:function(e){if(!e)return null;var t=e.length;if(c(t))return null;for(var n=new Array(t);t-- >0;)n[t]=e[t];return n},isTypedArray:O,isFileList:v}},function(e,t,n){"use strict";var r=n(0);function o(e,t,n,r,o){Error.call(this),this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),o&&(this.response=o)}r.inherits(o,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}}});var i=o.prototype,s={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED"].forEach((function(e){s[e]={value:e}})),Object.defineProperties(o,s),Object.defineProperty(i,"isAxiosError",{value:!0}),o.from=function(e,t,n,s,a,u){var c=Object.create(i);return r.toFlatObject(e,c,(function(e){return e!==Error.prototype})),o.call(c,e.message,t,n,s,a),c.name=e.name,u&&Object.assign(c,u),c},e.exports=o},function(e,t,n){"use strict";var r=n(1);function o(e){r.call(this,null==e?"canceled":e,r.ERR_CANCELED),this.name="CanceledError"}n(0).inherits(o,r,{__CANCEL__:!0}),e.exports=o},function(e,t,n){"use strict";var r=n(0),o=n(19),i=n(1),s=n(6),a=n(7),u={"Content-Type":"application/x-www-form-urlencoded"};function c(e,t){!r.isUndefined(e)&&r.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}var f,l={transitional:s,adapter:(("undefined"!=typeof XMLHttpRequest||"undefined"!=typeof process&&"[object process]"===Object.prototype.toString.call(process))&&(f=n(8)),f),transformRequest:[function(e,t){if(o(t,"Accept"),o(t,"Content-Type"),r.isFormData(e)||r.isArrayBuffer(e)||r.isBuffer(e)||r.isStream(e)||r.isFile(e)||r.isBlob(e))return e;if(r.isArrayBufferView(e))return e.buffer;if(r.isURLSearchParams(e))return c(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString();var n,i=r.isObject(e),s=t&&t["Content-Type"];if((n=r.isFileList(e))||i&&"multipart/form-data"===s){var u=this.env&&this.env.FormData;return a(n?{"files[]":e}:e,u&&new u)}return i||"application/json"===s?(c(t,"application/json"),function(e,t,n){if(r.isString(e))try{return(t||JSON.parse)(e),r.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(n||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){var t=this.transitional||l.transitional,n=t&&t.silentJSONParsing,o=t&&t.forcedJSONParsing,s=!n&&"json"===this.responseType;if(s||o&&r.isString(e)&&e.length)try{return JSON.parse(e)}catch(e){if(s){if("SyntaxError"===e.name)throw i.from(e,i.ERR_BAD_RESPONSE,this,null,this.response);throw e}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:n(27)},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};r.forEach(["delete","get","head"],(function(e){l.headers[e]={}})),r.forEach(["post","put","patch"],(function(e){l.headers[e]=r.merge(u)})),e.exports=l},function(e,t,n){"use strict";e.exports=function(e,t){return function(){for(var n=new Array(arguments.length),r=0;r<n.length;r++)n[r]=arguments[r];return e.apply(t,n)}}},function(e,t,n){"use strict";var r=n(0);function o(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}e.exports=function(e,t,n){if(!t)return e;var i;if(n)i=n(t);else if(r.isURLSearchParams(t))i=t.toString();else{var s=[];r.forEach(t,(function(e,t){null!=e&&(r.isArray(e)?t+="[]":e=[e],r.forEach(e,(function(e){r.isDate(e)?e=e.toISOString():r.isObject(e)&&(e=JSON.stringify(e)),s.push(o(t)+"="+o(e))})))})),i=s.join("&")}if(i){var a=e.indexOf("#");-1!==a&&(e=e.slice(0,a)),e+=(-1===e.indexOf("?")?"?":"&")+i}return e}},function(e,t,n){"use strict";e.exports={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1}},function(e,t,n){"use strict";var r=n(0);e.exports=function(e,t){t=t||new FormData;var n=[];function o(e){return null===e?"":r.isDate(e)?e.toISOString():r.isArrayBuffer(e)||r.isTypedArray(e)?"function"==typeof Blob?new Blob([e]):Buffer.from(e):e}return function e(i,s){if(r.isPlainObject(i)||r.isArray(i)){if(-1!==n.indexOf(i))throw Error("Circular reference detected in "+s);n.push(i),r.forEach(i,(function(n,i){if(!r.isUndefined(n)){var a,u=s?s+"."+i:i;if(n&&!s&&"object"==typeof n)if(r.endsWith(i,"{}"))n=JSON.stringify(n);else if(r.endsWith(i,"[]")&&(a=r.toArray(n)))return void a.forEach((function(e){!r.isUndefined(e)&&t.append(u,o(e))}));e(n,u)}})),n.pop()}else t.append(s,o(i))}(e),t}},function(e,t,n){"use strict";var r=n(0),o=n(20),i=n(21),s=n(5),a=n(9),u=n(24),c=n(25),f=n(6),l=n(1),p=n(2),d=n(26);e.exports=function(e){return new Promise((function(t,n){var h,m=e.data,v=e.headers,y=e.responseType;function g(){e.cancelToken&&e.cancelToken.unsubscribe(h),e.signal&&e.signal.removeEventListener("abort",h)}r.isFormData(m)&&r.isStandardBrowserEnv()&&delete v["Content-Type"];var E=new XMLHttpRequest;if(e.auth){var b=e.auth.username||"",O=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";v.Authorization="Basic "+btoa(b+":"+O)}var x=a(e.baseURL,e.url);function w(){if(E){var r="getAllResponseHeaders"in E?u(E.getAllResponseHeaders()):null,i={data:y&&"text"!==y&&"json"!==y?E.response:E.responseText,status:E.status,statusText:E.statusText,headers:r,config:e,request:E};o((function(e){t(e),g()}),(function(e){n(e),g()}),i),E=null}}if(E.open(e.method.toUpperCase(),s(x,e.params,e.paramsSerializer),!0),E.timeout=e.timeout,"onloadend"in E?E.onloadend=w:E.onreadystatechange=function(){E&&4===E.readyState&&(0!==E.status||E.responseURL&&0===E.responseURL.indexOf("file:"))&&setTimeout(w)},E.onabort=function(){E&&(n(new l("Request aborted",l.ECONNABORTED,e,E)),E=null)},E.onerror=function(){n(new l("Network Error",l.ERR_NETWORK,e,E,E)),E=null},E.ontimeout=function(){var t=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded",r=e.transitional||f;e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(new l(t,r.clarifyTimeoutError?l.ETIMEDOUT:l.ECONNABORTED,e,E)),E=null},r.isStandardBrowserEnv()){var R=(e.withCredentials||c(x))&&e.xsrfCookieName?i.read(e.xsrfCookieName):void 0;R&&(v[e.xsrfHeaderName]=R)}"setRequestHeader"in E&&r.forEach(v,(function(e,t){void 0===m&&"content-type"===t.toLowerCase()?delete v[t]:E.setRequestHeader(t,e)})),r.isUndefined(e.withCredentials)||(E.withCredentials=!!e.withCredentials),y&&"json"!==y&&(E.responseType=e.responseType),"function"==typeof e.onDownloadProgress&&E.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&E.upload&&E.upload.addEventListener("progress",e.onUploadProgress),(e.cancelToken||e.signal)&&(h=function(e){E&&(n(!e||e&&e.type?new p:e),E.abort(),E=null)},e.cancelToken&&e.cancelToken.subscribe(h),e.signal&&(e.signal.aborted?h():e.signal.addEventListener("abort",h))),m||(m=null);var S=d(x);S&&-1===["http","https","file"].indexOf(S)?n(new l("Unsupported protocol "+S+":",l.ERR_BAD_REQUEST,e)):E.send(m)}))}},function(e,t,n){"use strict";var r=n(22),o=n(23);e.exports=function(e,t){return e&&!r(t)?o(e,t):t}},function(e,t,n){"use strict";e.exports=function(e){return!(!e||!e.__CANCEL__)}},function(e,t,n){"use strict";var r=n(0);e.exports=function(e,t){t=t||{};var n={};function o(e,t){return r.isPlainObject(e)&&r.isPlainObject(t)?r.merge(e,t):r.isPlainObject(t)?r.merge({},t):r.isArray(t)?t.slice():t}function i(n){return r.isUndefined(t[n])?r.isUndefined(e[n])?void 0:o(void 0,e[n]):o(e[n],t[n])}function s(e){if(!r.isUndefined(t[e]))return o(void 0,t[e])}function a(n){return r.isUndefined(t[n])?r.isUndefined(e[n])?void 0:o(void 0,e[n]):o(void 0,t[n])}function u(n){return n in t?o(e[n],t[n]):n in e?o(void 0,e[n]):void 0}var c={url:s,method:s,data:s,baseURL:a,transformRequest:a,transformResponse:a,paramsSerializer:a,timeout:a,timeoutMessage:a,withCredentials:a,adapter:a,responseType:a,xsrfCookieName:a,xsrfHeaderName:a,onUploadProgress:a,onDownloadProgress:a,decompress:a,maxContentLength:a,maxBodyLength:a,beforeRedirect:a,transport:a,httpAgent:a,httpsAgent:a,cancelToken:a,socketPath:a,responseEncoding:a,validateStatus:u};return r.forEach(Object.keys(e).concat(Object.keys(t)),(function(e){var t=c[e]||i,o=t(e);r.isUndefined(o)&&t!==u||(n[e]=o)})),n}},function(e,t){e.exports={version:"0.27.2"}},function(e,t,n){e.exports=n(14)},function(e,t,n){"use strict";var r=n(0),o=n(4),i=n(15),s=n(11);var a=function e(t){var n=new i(t),a=o(i.prototype.request,n);return r.extend(a,i.prototype,n),r.extend(a,n),a.create=function(n){return e(s(t,n))},a}(n(3));a.Axios=i,a.CanceledError=n(2),a.CancelToken=n(29),a.isCancel=n(10),a.VERSION=n(12).version,a.toFormData=n(7),a.AxiosError=n(1),a.Cancel=a.CanceledError,a.all=function(e){return Promise.all(e)},a.spread=n(30),a.isAxiosError=n(31),e.exports=a,e.exports.default=a},function(e,t,n){"use strict";var r=n(0),o=n(5),i=n(16),s=n(17),a=n(11),u=n(9),c=n(28),f=c.validators;function l(e){this.defaults=e,this.interceptors={request:new i,response:new i}}l.prototype.request=function(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{},(t=a(this.defaults,t)).method?t.method=t.method.toLowerCase():this.defaults.method?t.method=this.defaults.method.toLowerCase():t.method="get";var n=t.transitional;void 0!==n&&c.assertOptions(n,{silentJSONParsing:f.transitional(f.boolean),forcedJSONParsing:f.transitional(f.boolean),clarifyTimeoutError:f.transitional(f.boolean)},!1);var r=[],o=!0;this.interceptors.request.forEach((function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(o=o&&e.synchronous,r.unshift(e.fulfilled,e.rejected))}));var i,u=[];if(this.interceptors.response.forEach((function(e){u.push(e.fulfilled,e.rejected)})),!o){var l=[s,void 0];for(Array.prototype.unshift.apply(l,r),l=l.concat(u),i=Promise.resolve(t);l.length;)i=i.then(l.shift(),l.shift());return i}for(var p=t;r.length;){var d=r.shift(),h=r.shift();try{p=d(p)}catch(e){h(e);break}}try{i=s(p)}catch(e){return Promise.reject(e)}for(;u.length;)i=i.then(u.shift(),u.shift());return i},l.prototype.getUri=function(e){e=a(this.defaults,e);var t=u(e.baseURL,e.url);return o(t,e.params,e.paramsSerializer)},r.forEach(["delete","get","head","options"],(function(e){l.prototype[e]=function(t,n){return this.request(a(n||{},{method:e,url:t,data:(n||{}).data}))}})),r.forEach(["post","put","patch"],(function(e){function t(t){return function(n,r,o){return this.request(a(o||{},{method:e,headers:t?{"Content-Type":"multipart/form-data"}:{},url:n,data:r}))}}l.prototype[e]=t(),l.prototype[e+"Form"]=t(!0)})),e.exports=l},function(e,t,n){"use strict";var r=n(0);function o(){this.handlers=[]}o.prototype.use=function(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1},o.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},o.prototype.forEach=function(e){r.forEach(this.handlers,(function(t){null!==t&&e(t)}))},e.exports=o},function(e,t,n){"use strict";var r=n(0),o=n(18),i=n(10),s=n(3),a=n(2);function u(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new a}e.exports=function(e){return u(e),e.headers=e.headers||{},e.data=o.call(e,e.data,e.headers,e.transformRequest),e.headers=r.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),r.forEach(["delete","get","head","post","put","patch","common"],(function(t){delete e.headers[t]})),(e.adapter||s.adapter)(e).then((function(t){return u(e),t.data=o.call(e,t.data,t.headers,e.transformResponse),t}),(function(t){return i(t)||(u(e),t&&t.response&&(t.response.data=o.call(e,t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)}))}},function(e,t,n){"use strict";var r=n(0),o=n(3);e.exports=function(e,t,n){var i=this||o;return r.forEach(n,(function(n){e=n.call(i,e,t)})),e}},function(e,t,n){"use strict";var r=n(0);e.exports=function(e,t){r.forEach(e,(function(n,r){r!==t&&r.toUpperCase()===t.toUpperCase()&&(e[t]=n,delete e[r])}))}},function(e,t,n){"use strict";var r=n(1);e.exports=function(e,t,n){var o=n.config.validateStatus;n.status&&o&&!o(n.status)?t(new r("Request failed with status code "+n.status,[r.ERR_BAD_REQUEST,r.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n)):e(n)}},function(e,t,n){"use strict";var r=n(0);e.exports=r.isStandardBrowserEnv()?{write:function(e,t,n,o,i,s){var a=[];a.push(e+"="+encodeURIComponent(t)),r.isNumber(n)&&a.push("expires="+new Date(n).toGMTString()),r.isString(o)&&a.push("path="+o),r.isString(i)&&a.push("domain="+i),!0===s&&a.push("secure"),document.cookie=a.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},function(e,t,n){"use strict";e.exports=function(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}},function(e,t,n){"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},function(e,t,n){"use strict";var r=n(0),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,i,s={};return e?(r.forEach(e.split("\n"),(function(e){if(i=e.indexOf(":"),t=r.trim(e.substr(0,i)).toLowerCase(),n=r.trim(e.substr(i+1)),t){if(s[t]&&o.indexOf(t)>=0)return;s[t]="set-cookie"===t?(s[t]?s[t]:[]).concat([n]):s[t]?s[t]+", "+n:n}})),s):s}},function(e,t,n){"use strict";var r=n(0);e.exports=r.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function o(e){var r=e;return t&&(n.setAttribute("href",r),r=n.href),n.setAttribute("href",r),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return e=o(window.location.href),function(t){var n=r.isString(t)?o(t):t;return n.protocol===e.protocol&&n.host===e.host}}():function(){return!0}},function(e,t,n){"use strict";e.exports=function(e){var t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}},function(e,t){e.exports=null},function(e,t,n){"use strict";var r=n(12).version,o=n(1),i={};["object","boolean","number","function","string","symbol"].forEach((function(e,t){i[e]=function(n){return typeof n===e||"a"+(t<1?"n ":" ")+e}}));var s={};i.transitional=function(e,t,n){function i(e,t){return"[Axios v"+r+"] Transitional option '"+e+"'"+t+(n?". "+n:"")}return function(n,r,a){if(!1===e)throw new o(i(r," has been removed"+(t?" in "+t:"")),o.ERR_DEPRECATED);return t&&!s[r]&&(s[r]=!0,console.warn(i(r," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(n,r,a)}},e.exports={assertOptions:function(e,t,n){if("object"!=typeof e)throw new o("options must be an object",o.ERR_BAD_OPTION_VALUE);for(var r=Object.keys(e),i=r.length;i-- >0;){var s=r[i],a=t[s];if(a){var u=e[s],c=void 0===u||a(u,s,e);if(!0!==c)throw new o("option "+s+" must be "+c,o.ERR_BAD_OPTION_VALUE)}else if(!0!==n)throw new o("Unknown option "+s,o.ERR_BAD_OPTION)}},validators:i}},function(e,t,n){"use strict";var r=n(2);function o(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise((function(e){t=e}));var n=this;this.promise.then((function(e){if(n._listeners){var t,r=n._listeners.length;for(t=0;t<r;t++)n._listeners[t](e);n._listeners=null}})),this.promise.then=function(e){var t,r=new Promise((function(e){n.subscribe(e),t=e})).then(e);return r.cancel=function(){n.unsubscribe(t)},r},e((function(e){n.reason||(n.reason=new r(e),t(n.reason))}))}o.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},o.prototype.subscribe=function(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]},o.prototype.unsubscribe=function(e){if(this._listeners){var t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}},o.source=function(){var e;return{token:new o((function(t){e=t})),cancel:e}},e.exports=o},function(e,t,n){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},function(e,t,n){"use strict";var r=n(0);e.exports=function(e){return r.isObject(e)&&!0===e.isAxiosError}}])}));
//# sourceMappingURL=axios.min.map(MIT)

Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;

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';
module.exports = balanced;
function balanced(a, b, str) {
  if (a instanceof RegExp) a = maybeMatch(a, str);
  if (b instanceof RegExp) b = maybeMatch(b, str);

  var r = range(a, b, str);

  return r && {
    start: r[0],
    end: r[1],
    pre: str.slice(0, r[0]),
    body: str.slice(r[0] + a.length, r[1]),
    post: str.slice(r[1] + b.length)
  };
}

function maybeMatch(reg, str) {
  var m = str.match(reg);
  return m ? m[0] : null;
}

balanced.range = range;
function range(a, b, str) {
  var begs, beg, left, right, result;
  var ai = str.indexOf(a);
  var bi = str.indexOf(b, ai + 1);
  var i = ai;

  if (ai >= 0 && bi > 0) {
    if(a===b) {
      return [ai, bi];
    }
    begs = [];
    left = str.length;

    while (i >= 0 && !result) {
      if (i == ai) {
        begs.push(i);
        ai = str.indexOf(a, i + 1);
      } else if (begs.length == 1) {
        result = [ begs.pop(), bi ];
      } else {
        beg = begs.pop();
        if (beg < left) {
          left = beg;
          right = bi;
        }

        bi = str.indexOf(b, i + 1);
      }

      i = ai < bi && ai >= 0 ? ai : bi;
    }

    if (begs.length) {
      result = [ left, right ];
    }
  }

  return result;
}
{
  "name": "balanced-match",
  "description": "Match balanced character pairs, like \"{\" and \"}\"",
  "version": "1.0.2",
  "repository": {
    "type": "git",
    "url": "git://github.com/juliangruber/balanced-match.git"
  },
  "homepage": "https://github.com/juliangruber/balanced-match",
  "main": "index.js",
  "devDependencies": {
    "matcha": "^0.7.0",
    "tape": "^4.6.0"
  },
  "author": {
    "name": "Julian Gruber",
    "email": "mail@juliangruber.com",
    "url": "http://juliangruber.com"
  },
  "license": "MIT",
  "testling": {
    "files": "test/*.js",
    "browsers": [
      "ie/8..latest",
      "firefox/20..latest",
      "firefox/nightly",
      "chrome/25..latest",
      "chrome/canary",
      "opera/12..latest",
      "opera/next",
      "safari/5.1..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2..latest"
    ]
  }
}tidelift: "npm/balanced-match"
patreon: juliangruber
The MIT License (MIT)

Copyright (c) 2014 Jameson Little

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.
(function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"==typeof window?"undefined"==typeof global?"undefined"==typeof self?this:self:global:window,b.base64js=a()}})(function(){return function(){function b(d,e,g){function a(j,i){if(!e[j]){if(!d[j]){var f="function"==typeof require&&require;if(!i&&f)return f(j,!0);if(h)return h(j,!0);var c=new Error("Cannot find module '"+j+"'");throw c.code="MODULE_NOT_FOUND",c}var k=e[j]={exports:{}};d[j][0].call(k.exports,function(b){var c=d[j][1][b];return a(c||b)},k,k.exports,b,d,e,g)}return e[j].exports}for(var h="function"==typeof require&&require,c=0;c<g.length;c++)a(g[c]);return a}return b}()({"/":[function(a,b,c){'use strict';function d(a){var b=a.length;if(0<b%4)throw new Error("Invalid string. Length must be a multiple of 4");var c=a.indexOf("=");-1===c&&(c=b);var d=c===b?0:4-c%4;return[c,d]}function e(a,b,c){return 3*(b+c)/4-c}function f(a){var b,c,f=d(a),g=f[0],h=f[1],j=new m(e(a,g,h)),k=0,n=0<h?g-4:g;for(c=0;c<n;c+=4)b=l[a.charCodeAt(c)]<<18|l[a.charCodeAt(c+1)]<<12|l[a.charCodeAt(c+2)]<<6|l[a.charCodeAt(c+3)],j[k++]=255&b>>16,j[k++]=255&b>>8,j[k++]=255&b;return 2===h&&(b=l[a.charCodeAt(c)]<<2|l[a.charCodeAt(c+1)]>>4,j[k++]=255&b),1===h&&(b=l[a.charCodeAt(c)]<<10|l[a.charCodeAt(c+1)]<<4|l[a.charCodeAt(c+2)]>>2,j[k++]=255&b>>8,j[k++]=255&b),j}function g(a){return k[63&a>>18]+k[63&a>>12]+k[63&a>>6]+k[63&a]}function h(a,b,c){for(var d,e=[],f=b;f<c;f+=3)d=(16711680&a[f]<<16)+(65280&a[f+1]<<8)+(255&a[f+2]),e.push(g(d));return e.join("")}function j(a){for(var b,c=a.length,d=c%3,e=[],f=16383,g=0,j=c-d;g<j;g+=f)e.push(h(a,g,g+f>j?j:g+f));return 1===d?(b=a[c-1],e.push(k[b>>2]+k[63&b<<4]+"==")):2===d&&(b=(a[c-2]<<8)+a[c-1],e.push(k[b>>10]+k[63&b>>4]+k[63&b<<2]+"=")),e.join("")}c.byteLength=function(a){var b=d(a),c=b[0],e=b[1];return 3*(c+e)/4-e},c.toByteArray=f,c.fromByteArray=j;for(var k=[],l=[],m="undefined"==typeof Uint8Array?Array:Uint8Array,n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=0,p=n.length;o<p;++o)k[o]=n[o],l[n.charCodeAt(o)]=o;l[45]=62,l[95]=63},{}]},{},[])("/")});'use strict'

exports.byteLength = byteLength
exports.toByteArray = toByteArray
exports.fromByteArray = fromByteArray

var lookup = []
var revLookup = []
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array

var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
for (var i = 0, len = code.length; i < len; ++i) {
  lookup[i] = code[i]
  revLookup[code.charCodeAt(i)] = i
}

// Support decoding URL-safe base64 strings, as Node.js does.
// See: https://en.wikipedia.org/wiki/Base64#URL_applications
revLookup['-'.charCodeAt(0)] = 62
revLookup['_'.charCodeAt(0)] = 63

function getLens (b64) {
  var len = b64.length

  if (len % 4 > 0) {
    throw new Error('Invalid string. Length must be a multiple of 4')
  }

  // Trim off extra bytes after placeholder bytes are found
  // See: https://github.com/beatgammit/base64-js/issues/42
  var validLen = b64.indexOf('=')
  if (validLen === -1) validLen = len

  var placeHoldersLen = validLen === len
    ? 0
    : 4 - (validLen % 4)

  return [validLen, placeHoldersLen]
}

// base64 is 4/3 + up to two characters of the original data
function byteLength (b64) {
  var lens = getLens(b64)
  var validLen = lens[0]
  var placeHoldersLen = lens[1]
  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
}

function _byteLength (b64, validLen, placeHoldersLen) {
  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
}

function toByteArray (b64) {
  var tmp
  var lens = getLens(b64)
  var validLen = lens[0]
  var placeHoldersLen = lens[1]

  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))

  var curByte = 0

  // if there are placeholders, only get up to the last complete 4 chars
  var len = placeHoldersLen > 0
    ? validLen - 4
    : validLen

  var i
  for (i = 0; i < len; i += 4) {
    tmp =
      (revLookup[b64.charCodeAt(i)] << 18) |
      (revLookup[b64.charCodeAt(i + 1)] << 12) |
      (revLookup[b64.charCodeAt(i + 2)] << 6) |
      revLookup[b64.charCodeAt(i + 3)]
    arr[curByte++] = (tmp >> 16) & 0xFF
    arr[curByte++] = (tmp >> 8) & 0xFF
    arr[curByte++] = tmp & 0xFF
  }

  if (placeHoldersLen === 2) {
    tmp =
      (revLookup[b64.charCodeAt(i)] << 2) |
      (revLookup[b64.charCodeAt(i + 1)] >> 4)
    arr[curByte++] = tmp & 0xFF
  }

  if (placeHoldersLen === 1) {
    tmp =
      (revLookup[b64.charCodeAt(i)] << 10) |
      (revLookup[b64.charCodeAt(i + 1)] << 4) |
      (revLookup[b64.charCodeAt(i + 2)] >> 2)
    arr[curByte++] = (tmp >> 8) & 0xFF
    arr[curByte++] = tmp & 0xFF
  }

  return arr
}

function tripletToBase64 (num) {
  return lookup[num >> 18 & 0x3F] +
    lookup[num >> 12 & 0x3F] +
    lookup[num >> 6 & 0x3F] +
    lookup[num & 0x3F]
}

function encodeChunk (uint8, start, end) {
  var tmp
  var output = []
  for (var i = start; i < end; i += 3) {
    tmp =
      ((uint8[i] << 16) & 0xFF0000) +
      ((uint8[i + 1] << 8) & 0xFF00) +
      (uint8[i + 2] & 0xFF)
    output.push(tripletToBase64(tmp))
  }
  return output.join('')
}

function fromByteArray (uint8) {
  var tmp
  var len = uint8.length
  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
  var parts = []
  var maxChunkLength = 16383 // must be multiple of 3

  // go through the array every three bytes, we'll deal with trailing stuff later
  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
  }

  // pad the end with zeros, but make sure to not forget the extra bytes
  if (extraBytes === 1) {
    tmp = uint8[len - 1]
    parts.push(
      lookup[tmp >> 2] +
      lookup[(tmp << 4) & 0x3F] +
      '=='
    )
  } else if (extraBytes === 2) {
    tmp = (uint8[len - 2] << 8) + uint8[len - 1]
    parts.push(
      lookup[tmp >> 10] +
      lookup[(tmp >> 4) & 0x3F] +
      lookup[(tmp << 2) & 0x3F] +
      '='
    )
  }

  return parts.join('')
}
{
  "name": "base64-js",
  "description": "Base64 encoding/decoding in pure JS",
  "version": "1.5.1",
  "author": "T. Jameson Little <t.jameson.little@gmail.com>",
  "typings": "index.d.ts",
  "devDependencies": {
    "babel-minify": "^0.5.1",
    "benchmark": "^2.1.4",
    "browserify": "^16.3.0",
    "standard": "*",
    "tape": "4.x"
  },
  "homepage": "https://github.com/beatgammit/base64-js",
  "license": "MIT",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/beatgammit/base64-js.git"
  },
  "funding": [
    {
      "type": "github",
      "url": "https://github.com/sponsors/feross"
    },
    {
      "type": "patreon",
      "url": "https://www.patreon.com/feross"
    },
    {
      "type": "consulting",
      "url": "https://feross.org/support"
    }
  ]
}'use strict'

const { Buffer } = require('buffer')
const symbol = Symbol.for('BufferList')

function BufferList (buf) {
  if (!(this instanceof BufferList)) {
    return new BufferList(buf)
  }

  BufferList._init.call(this, buf)
}

BufferList._init = function _init (buf) {
  Object.defineProperty(this, symbol, { value: true })

  this._bufs = []
  this.length = 0

  if (buf) {
    this.append(buf)
  }
}

BufferList.prototype._new = function _new (buf) {
  return new BufferList(buf)
}

BufferList.prototype._offset = function _offset (offset) {
  if (offset === 0) {
    return [0, 0]
  }

  let tot = 0

  for (let i = 0; i < this._bufs.length; i++) {
    const _t = tot + this._bufs[i].length
    if (offset < _t || i === this._bufs.length - 1) {
      return [i, offset - tot]
    }
    tot = _t
  }
}

BufferList.prototype._reverseOffset = function (blOffset) {
  const bufferId = blOffset[0]
  let offset = blOffset[1]

  for (let i = 0; i < bufferId; i++) {
    offset += this._bufs[i].length
  }

  return offset
}

BufferList.prototype.get = function get (index) {
  if (index > this.length || index < 0) {
    return undefined
  }

  const offset = this._offset(index)

  return this._bufs[offset[0]][offset[1]]
}

BufferList.prototype.slice = function slice (start, end) {
  if (typeof start === 'number' && start < 0) {
    start += this.length
  }

  if (typeof end === 'number' && end < 0) {
    end += this.length
  }

  return this.copy(null, 0, start, end)
}

BufferList.prototype.copy = function copy (dst, dstStart, srcStart, srcEnd) {
  if (typeof srcStart !== 'number' || srcStart < 0) {
    srcStart = 0
  }

  if (typeof srcEnd !== 'number' || srcEnd > this.length) {
    srcEnd = this.length
  }

  if (srcStart >= this.length) {
    return dst || Buffer.alloc(0)
  }

  if (srcEnd <= 0) {
    return dst || Buffer.alloc(0)
  }

  const copy = !!dst
  const off = this._offset(srcStart)
  const len = srcEnd - srcStart
  let bytes = len
  let bufoff = (copy && dstStart) || 0
  let start = off[1]

  // copy/slice everything
  if (srcStart === 0 && srcEnd === this.length) {
    if (!copy) {
      // slice, but full concat if multiple buffers
      return this._bufs.length === 1
        ? this._bufs[0]
        : Buffer.concat(this._bufs, this.length)
    }

    // copy, need to copy individual buffers
    for (let i = 0; i < this._bufs.length; i++) {
      this._bufs[i].copy(dst, bufoff)
      bufoff += this._bufs[i].length
    }

    return dst
  }

  // easy, cheap case where it's a subset of one of the buffers
  if (bytes <= this._bufs[off[0]].length - start) {
    return copy
      ? this._bufs[off[0]].copy(dst, dstStart, start, start + bytes)
      : this._bufs[off[0]].slice(start, start + bytes)
  }

  if (!copy) {
    // a slice, we need something to copy in to
    dst = Buffer.allocUnsafe(len)
  }

  for (let i = off[0]; i < this._bufs.length; i++) {
    const l = this._bufs[i].length - start

    if (bytes > l) {
      this._bufs[i].copy(dst, bufoff, start)
      bufoff += l
    } else {
      this._bufs[i].copy(dst, bufoff, start, start + bytes)
      bufoff += l
      break
    }

    bytes -= l

    if (start) {
      start = 0
    }
  }

  // safeguard so that we don't return uninitialized memory
  if (dst.length > bufoff) return dst.slice(0, bufoff)

  return dst
}

BufferList.prototype.shallowSlice = function shallowSlice (start, end) {
  start = start || 0
  end = typeof end !== 'number' ? this.length : end

  if (start < 0) {
    start += this.length
  }

  if (end < 0) {
    end += this.length
  }

  if (start === end) {
    return this._new()
  }

  const startOffset = this._offset(start)
  const endOffset = this._offset(end)
  const buffers = this._bufs.slice(startOffset[0], endOffset[0] + 1)

  if (endOffset[1] === 0) {
    buffers.pop()
  } else {
    buffers[buffers.length - 1] = buffers[buffers.length - 1].slice(0, endOffset[1])
  }

  if (startOffset[1] !== 0) {
    buffers[0] = buffers[0].slice(startOffset[1])
  }

  return this._new(buffers)
}

BufferList.prototype.toString = function toString (encoding, start, end) {
  return this.slice(start, end).toString(encoding)
}

BufferList.prototype.consume = function consume (bytes) {
  // first, normalize the argument, in accordance with how Buffer does it
  bytes = Math.trunc(bytes)
  // do nothing if not a positive number
  if (Number.isNaN(bytes) || bytes <= 0) return this

  while (this._bufs.length) {
    if (bytes >= this._bufs[0].length) {
      bytes -= this._bufs[0].length
      this.length -= this._bufs[0].length
      this._bufs.shift()
    } else {
      this._bufs[0] = this._bufs[0].slice(bytes)
      this.length -= bytes
      break
    }
  }

  return this
}

BufferList.prototype.duplicate = function duplicate () {
  const copy = this._new()

  for (let i = 0; i < this._bufs.length; i++) {
    copy.append(this._bufs[i])
  }

  return copy
}

BufferList.prototype.append = function append (buf) {
  if (buf == null) {
    return this
  }

  if (buf.buffer) {
    // append a view of the underlying ArrayBuffer
    this._appendBuffer(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength))
  } else if (Array.isArray(buf)) {
    for (let i = 0; i < buf.length; i++) {
      this.append(buf[i])
    }
  } else if (this._isBufferList(buf)) {
    // unwrap argument into individual BufferLists
    for (let i = 0; i < buf._bufs.length; i++) {
      this.append(buf._bufs[i])
    }
  } else {
    // coerce number arguments to strings, since Buffer(number) does
    // uninitialized memory allocation
    if (typeof buf === 'number') {
      buf = buf.toString()
    }

    this._appendBuffer(Buffer.from(buf))
  }

  return this
}

BufferList.prototype._appendBuffer = function appendBuffer (buf) {
  this._bufs.push(buf)
  this.length += buf.length
}

BufferList.prototype.indexOf = function (search, offset, encoding) {
  if (encoding === undefined && typeof offset === 'string') {
    encoding = offset
    offset = undefined
  }

  if (typeof search === 'function' || Array.isArray(search)) {
    throw new TypeError('The "value" argument must be one of type string, Buffer, BufferList, or Uint8Array.')
  } else if (typeof search === 'number') {
    search = Buffer.from([search])
  } else if (typeof search === 'string') {
    search = Buffer.from(search, encoding)
  } else if (this._isBufferList(search)) {
    search = search.slice()
  } else if (Array.isArray(search.buffer)) {
    search = Buffer.from(search.buffer, search.byteOffset, search.byteLength)
  } else if (!Buffer.isBuffer(search)) {
    search = Buffer.from(search)
  }

  offset = Number(offset || 0)

  if (isNaN(offset)) {
    offset = 0
  }

  if (offset < 0) {
    offset = this.length + offset
  }

  if (offset < 0) {
    offset = 0
  }

  if (search.length === 0) {
    return offset > this.length ? this.length : offset
  }

  const blOffset = this._offset(offset)
  let blIndex = blOffset[0] // index of which internal buffer we're working on
  let buffOffset = blOffset[1] // offset of the internal buffer we're working on

  // scan over each buffer
  for (; blIndex < this._bufs.length; blIndex++) {
    const buff = this._bufs[blIndex]

    while (buffOffset < buff.length) {
      const availableWindow = buff.length - buffOffset

      if (availableWindow >= search.length) {
        const nativeSearchResult = buff.indexOf(search, buffOffset)

        if (nativeSearchResult !== -1) {
          return this._reverseOffset([blIndex, nativeSearchResult])
        }

        buffOffset = buff.length - search.length + 1 // end of native search window
      } else {
        const revOffset = this._reverseOffset([blIndex, buffOffset])

        if (this._match(revOffset, search)) {
          return revOffset
        }

        buffOffset++
      }
    }

    buffOffset = 0
  }

  return -1
}

BufferList.prototype._match = function (offset, search) {
  if (this.length - offset < search.length) {
    return false
  }

  for (let searchOffset = 0; searchOffset < search.length; searchOffset++) {
    if (this.get(offset + searchOffset) !== search[searchOffset]) {
      return false
    }
  }
  return true
}

;(function () {
  const methods = {
    readDoubleBE: 8,
    readDoubleLE: 8,
    readFloatBE: 4,
    readFloatLE: 4,
    readInt32BE: 4,
    readInt32LE: 4,
    readUInt32BE: 4,
    readUInt32LE: 4,
    readInt16BE: 2,
    readInt16LE: 2,
    readUInt16BE: 2,
    readUInt16LE: 2,
    readInt8: 1,
    readUInt8: 1,
    readIntBE: null,
    readIntLE: null,
    readUIntBE: null,
    readUIntLE: null
  }

  for (const m in methods) {
    (function (m) {
      if (methods[m] === null) {
        BufferList.prototype[m] = function (offset, byteLength) {
          return this.slice(offset, offset + byteLength)[m](0, byteLength)
        }
      } else {
        BufferList.prototype[m] = function (offset = 0) {
          return this.slice(offset, offset + methods[m])[m](0)
        }
      }
    }(m))
  }
}())

// Used internally by the class and also as an indicator of this object being
// a `BufferList`. It's not possible to use `instanceof BufferList` in a browser
// environment because there could be multiple different copies of the
// BufferList class and some `BufferList`s might be `BufferList`s.
BufferList.prototype._isBufferList = function _isBufferList (b) {
  return b instanceof BufferList || BufferList.isBufferList(b)
}

BufferList.isBufferList = function isBufferList (b) {
  return b != null && b[symbol]
}

module.exports = BufferList
The MIT License (MIT)
=====================

Copyright (c) 2013-2019 bl contributors
----------------------------------

*bl contributors listed at <https://github.com/rvagg/bl#contributors>*

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

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

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

const DuplexStream = require('readable-stream').Duplex
const inherits = require('inherits')
const BufferList = require('./BufferList')

function BufferListStream (callback) {
  if (!(this instanceof BufferListStream)) {
    return new BufferListStream(callback)
  }

  if (typeof callback === 'function') {
    this._callback = callback

    const piper = function piper (err) {
      if (this._callback) {
        this._callback(err)
        this._callback = null
      }
    }.bind(this)

    this.on('pipe', function onPipe (src) {
      src.on('error', piper)
    })
    this.on('unpipe', function onUnpipe (src) {
      src.removeListener('error', piper)
    })

    callback = null
  }

  BufferList._init.call(this, callback)
  DuplexStream.call(this)
}

inherits(BufferListStream, DuplexStream)
Object.assign(BufferListStream.prototype, BufferList.prototype)

BufferListStream.prototype._new = function _new (callback) {
  return new BufferListStream(callback)
}

BufferListStream.prototype._write = function _write (buf, encoding, callback) {
  this._appendBuffer(buf)

  if (typeof callback === 'function') {
    callback()
  }
}

BufferListStream.prototype._read = function _read (size) {
  if (!this.length) {
    return this.push(null)
  }

  size = Math.min(size, this.length)
  this.push(this.slice(0, size))
  this.consume(size)
}

BufferListStream.prototype.end = function end (chunk) {
  DuplexStream.prototype.end.call(this, chunk)

  if (this._callback) {
    this._callback(null, this.slice())
    this._callback = null
  }
}

BufferListStream.prototype._destroy = function _destroy (err, cb) {
  this._bufs.length = 0
  this.length = 0
  cb(err)
}

BufferListStream.prototype._isBufferList = function _isBufferList (b) {
  return b instanceof BufferListStream || b instanceof BufferList || BufferListStream.isBufferList(b)
}

BufferListStream.isBufferList = BufferList.isBufferList

module.exports = BufferListStream
module.exports.BufferListStream = BufferListStream
module.exports.BufferList = BufferList
{
  "name": "bl",
  "version": "5.0.0",
  "description": "Buffer List: collect buffers and access with a standard readable Buffer interface, streamable too!",
  "license": "MIT",
  "main": "bl.js",
  "repository": {
    "type": "git",
    "url": "https://github.com/rvagg/bl.git"
  },
  "homepage": "https://github.com/rvagg/bl",
  "authors": [
    "Rod Vagg <rod@vagg.org> (https://github.com/rvagg)",
    "Matteo Collina <matteo.collina@gmail.com> (https://github.com/mcollina)",
    "Jarett Cruger <jcrugzz@gmail.com> (https://github.com/jcrugzz)"
  ],
  "dependencies": {
    "buffer": "^6.0.3",
    "inherits": "^2.0.4",
    "readable-stream": "^3.4.0"
  },
  "devDependencies": {
    "faucet": "~0.0.1",
    "standard": "^16.0.3",
    "tape": "^5.2.2"
  }
}The MIT License (MIT)

Copyright (c) 2013-2018 Petka Antonov

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": "bluebird",
  "description": "Full featured Promises/A+ implementation with exceptionally good performance",
  "version": "3.7.2",
  "homepage": "https://github.com/petkaantonov/bluebird",
  "repository": {
    "type": "git",
    "url": "git://github.com/petkaantonov/bluebird.git"
  },
  "license": "MIT",
  "author": {
    "name": "Petka Antonov",
    "email": "petka_antonov@hotmail.com",
    "url": "http://github.com/petkaantonov/"
  },
  "devDependencies": {
    "acorn": "^6.0.2",
    "acorn-walk": "^6.1.0",
    "baconjs": "^0.7.43",
    "bluebird": "^2.9.2",
    "body-parser": "^1.10.2",
    "browserify": "^8.1.1",
    "cli-table": "~0.3.1",
    "co": "^4.2.0",
    "cross-spawn": "^0.2.3",
    "glob": "^4.3.2",
    "grunt-saucelabs": "~8.4.1",
    "highland": "^2.3.0",
    "istanbul": "^0.3.5",
    "jshint": "^2.6.0",
    "jshint-stylish": "~0.2.0",
    "kefir": "^2.4.1",
    "mkdirp": "~0.5.0",
    "mocha": "~2.1",
    "open": "~0.0.5",
    "optimist": "~0.6.1",
    "rimraf": "~2.2.6",
    "rx": "^2.3.25",
    "serve-static": "^1.7.1",
    "sinon": "~1.7.3",
    "uglify-js": "~2.4.16"
  },
  "readmeFilename": "README.md",
  "main": "./js/release/bluebird.js",
  "webpack": "./js/release/bluebird.js",
  "browser": "./js/browser/bluebird.js",
  "files": [
    "js/browser",
    "js/release",
    "LICENSE"
  ]
}"use strict";
module.exports = function(Promise) {
var SomePromiseArray = Promise._SomePromiseArray;
function any(promises) {
    var ret = new SomePromiseArray(promises);
    var promise = ret.promise();
    ret.setHowMany(1);
    ret.setUnwrap();
    ret.init();
    return promise;
}

Promise.any = function (promises) {
    return any(promises);
};

Promise.prototype.any = function () {
    return any(this);
};

};
"use strict";
module.exports = (function(){
var AssertionError = (function() {
    function AssertionError(a) {
        this.constructor$(a);
        this.message = a;
        this.name = "AssertionError";
    }
    AssertionError.prototype = new Error();
    AssertionError.prototype.constructor = AssertionError;
    AssertionError.prototype.constructor$ = Error;
    return AssertionError;
})();

function getParams(args) {
    var params = [];
    for (var i = 0; i < args.length; ++i) params.push("arg" + i);
    return params;
}

function nativeAssert(callName, args, expect) {
    try {
        var params = getParams(args);
        var constructorArgs = params;
        constructorArgs.push("return " +
                callName + "("+ params.join(",") + ");");
        var fn = Function.apply(null, constructorArgs);
        return fn.apply(null, args);
    } catch (e) {
        if (!(e instanceof SyntaxError)) {
            throw e;
        } else {
            return expect;
        }
    }
}

return function assert(boolExpr, message) {
    if (boolExpr === true) return;

    if (typeof boolExpr === "string" &&
        boolExpr.charAt(0) === "%") {
        var nativeCallName = boolExpr;
        var $_len = arguments.length;var args = new Array(Math.max($_len - 2, 0)); for(var $_i = 2; $_i < $_len; ++$_i) {args[$_i - 2] = arguments[$_i];};
        if (nativeAssert(nativeCallName, args, message) === message) return;
        message = (nativeCallName + " !== " + message);
    }

    var ret = new AssertionError(message);
    if (Error.captureStackTrace) {
        Error.captureStackTrace(ret, assert);
    }
    throw ret;
};
})();
"use strict";
var firstLineError;
try {throw new Error(); } catch (e) {firstLineError = e;}
var schedule = require("./schedule");
var Queue = require("./queue");

function Async() {
    this._customScheduler = false;
    this._isTickUsed = false;
    this._lateQueue = new Queue(16);
    this._normalQueue = new Queue(16);
    this._haveDrainedQueues = false;
    var self = this;
    this.drainQueues = function () {
        self._drainQueues();
    };
    this._schedule = schedule;
}

Async.prototype.setScheduler = function(fn) {
    var prev = this._schedule;
    this._schedule = fn;
    this._customScheduler = true;
    return prev;
};

Async.prototype.hasCustomScheduler = function() {
    return this._customScheduler;
};

Async.prototype.haveItemsQueued = function () {
    return this._isTickUsed || this._haveDrainedQueues;
};


Async.prototype.fatalError = function(e, isNode) {
    if (isNode) {
        process.stderr.write("Fatal " + (e instanceof Error ? e.stack : e) +
            "\n");
        process.exit(2);
    } else {
        this.throwLater(e);
    }
};

Async.prototype.throwLater = function(fn, arg) {
    if (arguments.length === 1) {
        arg = fn;
        fn = function () { throw arg; };
    }
    if (typeof setTimeout !== "undefined") {
        setTimeout(function() {
            fn(arg);
        }, 0);
    } else try {
        this._schedule(function() {
            fn(arg);
        });
    } catch (e) {
        throw new Error("No async scheduler available\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
};

function AsyncInvokeLater(fn, receiver, arg) {
    this._lateQueue.push(fn, receiver, arg);
    this._queueTick();
}

function AsyncInvoke(fn, receiver, arg) {
    this._normalQueue.push(fn, receiver, arg);
    this._queueTick();
}

function AsyncSettlePromises(promise) {
    this._normalQueue._pushOne(promise);
    this._queueTick();
}

Async.prototype.invokeLater = AsyncInvokeLater;
Async.prototype.invoke = AsyncInvoke;
Async.prototype.settlePromises = AsyncSettlePromises;


function _drainQueue(queue) {
    while (queue.length() > 0) {
        _drainQueueStep(queue);
    }
}

function _drainQueueStep(queue) {
    var fn = queue.shift();
    if (typeof fn !== "function") {
        fn._settlePromises();
    } else {
        var receiver = queue.shift();
        var arg = queue.shift();
        fn.call(receiver, arg);
    }
}

Async.prototype._drainQueues = function () {
    _drainQueue(this._normalQueue);
    this._reset();
    this._haveDrainedQueues = true;
    _drainQueue(this._lateQueue);
};

Async.prototype._queueTick = function () {
    if (!this._isTickUsed) {
        this._isTickUsed = true;
        this._schedule(this.drainQueues);
    }
};

Async.prototype._reset = function () {
    this._isTickUsed = false;
};

module.exports = Async;
module.exports.firstLineError = firstLineError;
"use strict";
module.exports = function(Promise, INTERNAL, tryConvertToPromise, debug) {
var calledBind = false;
var rejectThis = function(_, e) {
    this._reject(e);
};

var targetRejected = function(e, context) {
    context.promiseRejectionQueued = true;
    context.bindingPromise._then(rejectThis, rejectThis, null, this, e);
};

var bindingResolved = function(thisArg, context) {
    if (((this._bitField & 50397184) === 0)) {
        this._resolveCallback(context.target);
    }
};

var bindingRejected = function(e, context) {
    if (!context.promiseRejectionQueued) this._reject(e);
};

Promise.prototype.bind = function (thisArg) {
    if (!calledBind) {
        calledBind = true;
        Promise.prototype._propagateFrom = debug.propagateFromFunction();
        Promise.prototype._boundValue = debug.boundValueFunction();
    }
    var maybePromise = tryConvertToPromise(thisArg);
    var ret = new Promise(INTERNAL);
    ret._propagateFrom(this, 1);
    var target = this._target();
    ret._setBoundTo(maybePromise);
    if (maybePromise instanceof Promise) {
        var context = {
            promiseRejectionQueued: false,
            promise: ret,
            target: target,
            bindingPromise: maybePromise
        };
        target._then(INTERNAL, targetRejected, undefined, ret, context);
        maybePromise._then(
            bindingResolved, bindingRejected, undefined, ret, context);
        ret._setOnCancel(maybePromise);
    } else {
        ret._resolveCallback(target);
    }
    return ret;
};

Promise.prototype._setBoundTo = function (obj) {
    if (obj !== undefined) {
        this._bitField = this._bitField | 2097152;
        this._boundTo = obj;
    } else {
        this._bitField = this._bitField & (~2097152);
    }
};

Promise.prototype._isBound = function () {
    return (this._bitField & 2097152) === 2097152;
};

Promise.bind = function (thisArg, value) {
    return Promise.resolve(value).bind(thisArg);
};
};
"use strict";
var old;
if (typeof Promise !== "undefined") old = Promise;
function noConflict() {
    try { if (Promise === bluebird) Promise = old; }
    catch (e) {}
    return bluebird;
}
var bluebird = require("./promise")();
bluebird.noConflict = noConflict;
module.exports = bluebird;
"use strict";
var cr = Object.create;
if (cr) {
    var callerCache = cr(null);
    var getterCache = cr(null);
    callerCache[" size"] = getterCache[" size"] = 0;
}

module.exports = function(Promise) {
var util = require("./util");
var canEvaluate = util.canEvaluate;
var isIdentifier = util.isIdentifier;

var getMethodCaller;
var getGetter;
if (!false) {
var makeMethodCaller = function (methodName) {
    return new Function("ensureMethod", "                                    \n\
        return function(obj) {                                               \n\
            'use strict'                                                     \n\
            var len = this.length;                                           \n\
            ensureMethod(obj, 'methodName');                                 \n\
            switch(len) {                                                    \n\
                case 1: return obj.methodName(this[0]);                      \n\
                case 2: return obj.methodName(this[0], this[1]);             \n\
                case 3: return obj.methodName(this[0], this[1], this[2]);    \n\
                case 0: return obj.methodName();                             \n\
                default:                                                     \n\
                    return obj.methodName.apply(obj, this);                  \n\
            }                                                                \n\
        };                                                                   \n\
        ".replace(/methodName/g, methodName))(ensureMethod);
};

var makeGetter = function (propertyName) {
    return new Function("obj", "                                             \n\
        'use strict';                                                        \n\
        return obj.propertyName;                                             \n\
        ".replace("propertyName", propertyName));
};

var getCompiled = function(name, compiler, cache) {
    var ret = cache[name];
    if (typeof ret !== "function") {
        if (!isIdentifier(name)) {
            return null;
        }
        ret = compiler(name);
        cache[name] = ret;
        cache[" size"]++;
        if (cache[" size"] > 512) {
            var keys = Object.keys(cache);
            for (var i = 0; i < 256; ++i) delete cache[keys[i]];
            cache[" size"] = keys.length - 256;
        }
    }
    return ret;
};

getMethodCaller = function(name) {
    return getCompiled(name, makeMethodCaller, callerCache);
};

getGetter = function(name) {
    return getCompiled(name, makeGetter, getterCache);
};
}

function ensureMethod(obj, methodName) {
    var fn;
    if (obj != null) fn = obj[methodName];
    if (typeof fn !== "function") {
        var message = "Object " + util.classString(obj) + " has no method '" +
            util.toString(methodName) + "'";
        throw new Promise.TypeError(message);
    }
    return fn;
}

function caller(obj) {
    var methodName = this.pop();
    var fn = ensureMethod(obj, methodName);
    return fn.apply(obj, this);
}
Promise.prototype.call = function (methodName) {
    var $_len = arguments.length;var args = new Array(Math.max($_len - 1, 0)); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];};
    if (!false) {
        if (canEvaluate) {
            var maybeCaller = getMethodCaller(methodName);
            if (maybeCaller !== null) {
                return this._then(
                    maybeCaller, undefined, undefined, args, undefined);
            }
        }
    }
    args.push(methodName);
    return this._then(caller, undefined, undefined, args, undefined);
};

function namedGetter(obj) {
    return obj[this];
}
function indexedGetter(obj) {
    var index = +this;
    if (index < 0) index = Math.max(0, index + obj.length);
    return obj[index];
}
Promise.prototype.get = function (propertyName) {
    var isIndex = (typeof propertyName === "number");
    var getter;
    if (!isIndex) {
        if (canEvaluate) {
            var maybeGetter = getGetter(propertyName);
            getter = maybeGetter !== null ? maybeGetter : namedGetter;
        } else {
            getter = namedGetter;
        }
    } else {
        getter = indexedGetter;
    }
    return this._then(getter, undefined, undefined, propertyName, undefined);
};
};
"use strict";
module.exports = function(Promise, PromiseArray, apiRejection, debug) {
var util = require("./util");
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;
var async = Promise._async;

Promise.prototype["break"] = Promise.prototype.cancel = function() {
    if (!debug.cancellation()) return this._warn("cancellation is disabled");

    var promise = this;
    var child = promise;
    while (promise._isCancellable()) {
        if (!promise._cancelBy(child)) {
            if (child._isFollowing()) {
                child._followee().cancel();
            } else {
                child._cancelBranched();
            }
            break;
        }

        var parent = promise._cancellationParent;
        if (parent == null || !parent._isCancellable()) {
            if (promise._isFollowing()) {
                promise._followee().cancel();
            } else {
                promise._cancelBranched();
            }
            break;
        } else {
            if (promise._isFollowing()) promise._followee().cancel();
            promise._setWillBeCancelled();
            child = promise;
            promise = parent;
        }
    }
};

Promise.prototype._branchHasCancelled = function() {
    this._branchesRemainingToCancel--;
};

Promise.prototype._enoughBranchesHaveCancelled = function() {
    return this._branchesRemainingToCancel === undefined ||
           this._branchesRemainingToCancel <= 0;
};

Promise.prototype._cancelBy = function(canceller) {
    if (canceller === this) {
        this._branchesRemainingToCancel = 0;
        this._invokeOnCancel();
        return true;
    } else {
        this._branchHasCancelled();
        if (this._enoughBranchesHaveCancelled()) {
            this._invokeOnCancel();
            return true;
        }
    }
    return false;
};

Promise.prototype._cancelBranched = function() {
    if (this._enoughBranchesHaveCancelled()) {
        this._cancel();
    }
};

Promise.prototype._cancel = function() {
    if (!this._isCancellable()) return;
    this._setCancelled();
    async.invoke(this._cancelPromises, this, undefined);
};

Promise.prototype._cancelPromises = function() {
    if (this._length() > 0) this._settlePromises();
};

Promise.prototype._unsetOnCancel = function() {
    this._onCancelField = undefined;
};

Promise.prototype._isCancellable = function() {
    return this.isPending() && !this._isCancelled();
};

Promise.prototype.isCancellable = function() {
    return this.isPending() && !this.isCancelled();
};

Promise.prototype._doInvokeOnCancel = function(onCancelCallback, internalOnly) {
    if (util.isArray(onCancelCallback)) {
        for (var i = 0; i < onCancelCallback.length; ++i) {
            this._doInvokeOnCancel(onCancelCallback[i], internalOnly);
        }
    } else if (onCancelCallback !== undefined) {
        if (typeof onCancelCallback === "function") {
            if (!internalOnly) {
                var e = tryCatch(onCancelCallback).call(this._boundValue());
                if (e === errorObj) {
                    this._attachExtraTrace(e.e);
                    async.throwLater(e.e);
                }
            }
        } else {
            onCancelCallback._resultCancelled(this);
        }
    }
};

Promise.prototype._invokeOnCancel = function() {
    var onCancelCallback = this._onCancel();
    this._unsetOnCancel();
    async.invoke(this._doInvokeOnCancel, this, onCancelCallback);
};

Promise.prototype._invokeInternalOnCancel = function() {
    if (this._isCancellable()) {
        this._doInvokeOnCancel(this._onCancel(), true);
        this._unsetOnCancel();
    }
};

Promise.prototype._resultCancelled = function() {
    this.cancel();
};

};
"use strict";
module.exports = function(NEXT_FILTER) {
var util = require("./util");
var getKeys = require("./es5").keys;
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;

function catchFilter(instances, cb, promise) {
    return function(e) {
        var boundTo = promise._boundValue();
        predicateLoop: for (var i = 0; i < instances.length; ++i) {
            var item = instances[i];

            if (item === Error ||
                (item != null && item.prototype instanceof Error)) {
                if (e instanceof item) {
                    return tryCatch(cb).call(boundTo, e);
                }
            } else if (typeof item === "function") {
                var matchesPredicate = tryCatch(item).call(boundTo, e);
                if (matchesPredicate === errorObj) {
                    return matchesPredicate;
                } else if (matchesPredicate) {
                    return tryCatch(cb).call(boundTo, e);
                }
            } else if (util.isObject(e)) {
                var keys = getKeys(item);
                for (var j = 0; j < keys.length; ++j) {
                    var key = keys[j];
                    if (item[key] != e[key]) {
                        continue predicateLoop;
                    }
                }
                return tryCatch(cb).call(boundTo, e);
            }
        }
        return NEXT_FILTER;
    };
}

return catchFilter;
};
"use strict";
module.exports = function(Promise) {
var longStackTraces = false;
var contextStack = [];

Promise.prototype._promiseCreated = function() {};
Promise.prototype._pushContext = function() {};
Promise.prototype._popContext = function() {return null;};
Promise._peekContext = Promise.prototype._peekContext = function() {};

function Context() {
    this._trace = new Context.CapturedTrace(peekContext());
}
Context.prototype._pushContext = function () {
    if (this._trace !== undefined) {
        this._trace._promiseCreated = null;
        contextStack.push(this._trace);
    }
};

Context.prototype._popContext = function () {
    if (this._trace !== undefined) {
        var trace = contextStack.pop();
        var ret = trace._promiseCreated;
        trace._promiseCreated = null;
        return ret;
    }
    return null;
};

function createContext() {
    if (longStackTraces) return new Context();
}

function peekContext() {
    var lastIndex = contextStack.length - 1;
    if (lastIndex >= 0) {
        return contextStack[lastIndex];
    }
    return undefined;
}
Context.CapturedTrace = null;
Context.create = createContext;
Context.deactivateLongStackTraces = function() {};
Context.activateLongStackTraces = function() {
    var Promise_pushContext = Promise.prototype._pushContext;
    var Promise_popContext = Promise.prototype._popContext;
    var Promise_PeekContext = Promise._peekContext;
    var Promise_peekContext = Promise.prototype._peekContext;
    var Promise_promiseCreated = Promise.prototype._promiseCreated;
    Context.deactivateLongStackTraces = function() {
        Promise.prototype._pushContext = Promise_pushContext;
        Promise.prototype._popContext = Promise_popContext;
        Promise._peekContext = Promise_PeekContext;
        Promise.prototype._peekContext = Promise_peekContext;
        Promise.prototype._promiseCreated = Promise_promiseCreated;
        longStackTraces = false;
    };
    longStackTraces = true;
    Promise.prototype._pushContext = Context.prototype._pushContext;
    Promise.prototype._popContext = Context.prototype._popContext;
    Promise._peekContext = Promise.prototype._peekContext = peekContext;
    Promise.prototype._promiseCreated = function() {
        var ctx = this._peekContext();
        if (ctx && ctx._promiseCreated == null) ctx._promiseCreated = this;
    };
};
return Context;
};
"use strict";
module.exports = function(Promise, Context,
    enableAsyncHooks, disableAsyncHooks) {
var async = Promise._async;
var Warning = require("./errors").Warning;
var util = require("./util");
var es5 = require("./es5");
var canAttachTrace = util.canAttachTrace;
var unhandledRejectionHandled;
var possiblyUnhandledRejection;
var bluebirdFramePattern =
    /[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/;
var nodeFramePattern = /\((?:timers\.js):\d+:\d+\)/;
var parseLinePattern = /[\/<\(](.+?):(\d+):(\d+)\)?\s*$/;
var stackFramePattern = null;
var formatStack = null;
var indentStackFrames = false;
var printWarning;
var debugging = !!(util.env("BLUEBIRD_DEBUG") != 0 &&
                        (false ||
                         util.env("BLUEBIRD_DEBUG") ||
                         util.env("NODE_ENV") === "development"));

var warnings = !!(util.env("BLUEBIRD_WARNINGS") != 0 &&
    (debugging || util.env("BLUEBIRD_WARNINGS")));

var longStackTraces = !!(util.env("BLUEBIRD_LONG_STACK_TRACES") != 0 &&
    (debugging || util.env("BLUEBIRD_LONG_STACK_TRACES")));

var wForgottenReturn = util.env("BLUEBIRD_W_FORGOTTEN_RETURN") != 0 &&
    (warnings || !!util.env("BLUEBIRD_W_FORGOTTEN_RETURN"));

var deferUnhandledRejectionCheck;
(function() {
    var promises = [];

    function unhandledRejectionCheck() {
        for (var i = 0; i < promises.length; ++i) {
            promises[i]._notifyUnhandledRejection();
        }
        unhandledRejectionClear();
    }

    function unhandledRejectionClear() {
        promises.length = 0;
    }

    deferUnhandledRejectionCheck = function(promise) {
        promises.push(promise);
        setTimeout(unhandledRejectionCheck, 1);
    };

    es5.defineProperty(Promise, "_unhandledRejectionCheck", {
        value: unhandledRejectionCheck
    });
    es5.defineProperty(Promise, "_unhandledRejectionClear", {
        value: unhandledRejectionClear
    });
})();

Promise.prototype.suppressUnhandledRejections = function() {
    var target = this._target();
    target._bitField = ((target._bitField & (~1048576)) |
                      524288);
};

Promise.prototype._ensurePossibleRejectionHandled = function () {
    if ((this._bitField & 524288) !== 0) return;
    this._setRejectionIsUnhandled();
    deferUnhandledRejectionCheck(this);
};

Promise.prototype._notifyUnhandledRejectionIsHandled = function () {
    fireRejectionEvent("rejectionHandled",
                                  unhandledRejectionHandled, undefined, this);
};

Promise.prototype._setReturnedNonUndefined = function() {
    this._bitField = this._bitField | 268435456;
};

Promise.prototype._returnedNonUndefined = function() {
    return (this._bitField & 268435456) !== 0;
};

Promise.prototype._notifyUnhandledRejection = function () {
    if (this._isRejectionUnhandled()) {
        var reason = this._settledValue();
        this._setUnhandledRejectionIsNotified();
        fireRejectionEvent("unhandledRejection",
                                      possiblyUnhandledRejection, reason, this);
    }
};

Promise.prototype._setUnhandledRejectionIsNotified = function () {
    this._bitField = this._bitField | 262144;
};

Promise.prototype._unsetUnhandledRejectionIsNotified = function () {
    this._bitField = this._bitField & (~262144);
};

Promise.prototype._isUnhandledRejectionNotified = function () {
    return (this._bitField & 262144) > 0;
};

Promise.prototype._setRejectionIsUnhandled = function () {
    this._bitField = this._bitField | 1048576;
};

Promise.prototype._unsetRejectionIsUnhandled = function () {
    this._bitField = this._bitField & (~1048576);
    if (this._isUnhandledRejectionNotified()) {
        this._unsetUnhandledRejectionIsNotified();
        this._notifyUnhandledRejectionIsHandled();
    }
};

Promise.prototype._isRejectionUnhandled = function () {
    return (this._bitField & 1048576) > 0;
};

Promise.prototype._warn = function(message, shouldUseOwnTrace, promise) {
    return warn(message, shouldUseOwnTrace, promise || this);
};

Promise.onPossiblyUnhandledRejection = function (fn) {
    var context = Promise._getContext();
    possiblyUnhandledRejection = util.contextBind(context, fn);
};

Promise.onUnhandledRejectionHandled = function (fn) {
    var context = Promise._getContext();
    unhandledRejectionHandled = util.contextBind(context, fn);
};

var disableLongStackTraces = function() {};
Promise.longStackTraces = function () {
    if (async.haveItemsQueued() && !config.longStackTraces) {
        throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    if (!config.longStackTraces && longStackTracesIsSupported()) {
        var Promise_captureStackTrace = Promise.prototype._captureStackTrace;
        var Promise_attachExtraTrace = Promise.prototype._attachExtraTrace;
        var Promise_dereferenceTrace = Promise.prototype._dereferenceTrace;
        config.longStackTraces = true;
        disableLongStackTraces = function() {
            if (async.haveItemsQueued() && !config.longStackTraces) {
                throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
            }
            Promise.prototype._captureStackTrace = Promise_captureStackTrace;
            Promise.prototype._attachExtraTrace = Promise_attachExtraTrace;
            Promise.prototype._dereferenceTrace = Promise_dereferenceTrace;
            Context.deactivateLongStackTraces();
            config.longStackTraces = false;
        };
        Promise.prototype._captureStackTrace = longStackTracesCaptureStackTrace;
        Promise.prototype._attachExtraTrace = longStackTracesAttachExtraTrace;
        Promise.prototype._dereferenceTrace = longStackTracesDereferenceTrace;
        Context.activateLongStackTraces();
    }
};

Promise.hasLongStackTraces = function () {
    return config.longStackTraces && longStackTracesIsSupported();
};


var legacyHandlers = {
    unhandledrejection: {
        before: function() {
            var ret = util.global.onunhandledrejection;
            util.global.onunhandledrejection = null;
            return ret;
        },
        after: function(fn) {
            util.global.onunhandledrejection = fn;
        }
    },
    rejectionhandled: {
        before: function() {
            var ret = util.global.onrejectionhandled;
            util.global.onrejectionhandled = null;
            return ret;
        },
        after: function(fn) {
            util.global.onrejectionhandled = fn;
        }
    }
};

var fireDomEvent = (function() {
    var dispatch = function(legacy, e) {
        if (legacy) {
            var fn;
            try {
                fn = legacy.before();
                return !util.global.dispatchEvent(e);
            } finally {
                legacy.after(fn);
            }
        } else {
            return !util.global.dispatchEvent(e);
        }
    };
    try {
        if (typeof CustomEvent === "function") {
            var event = new CustomEvent("CustomEvent");
            util.global.dispatchEvent(event);
            return function(name, event) {
                name = name.toLowerCase();
                var eventData = {
                    detail: event,
                    cancelable: true
                };
                var domEvent = new CustomEvent(name, eventData);
                es5.defineProperty(
                    domEvent, "promise", {value: event.promise});
                es5.defineProperty(
                    domEvent, "reason", {value: event.reason});

                return dispatch(legacyHandlers[name], domEvent);
            };
        } else if (typeof Event === "function") {
            var event = new Event("CustomEvent");
            util.global.dispatchEvent(event);
            return function(name, event) {
                name = name.toLowerCase();
                var domEvent = new Event(name, {
                    cancelable: true
                });
                domEvent.detail = event;
                es5.defineProperty(domEvent, "promise", {value: event.promise});
                es5.defineProperty(domEvent, "reason", {value: event.reason});
                return dispatch(legacyHandlers[name], domEvent);
            };
        } else {
            var event = document.createEvent("CustomEvent");
            event.initCustomEvent("testingtheevent", false, true, {});
            util.global.dispatchEvent(event);
            return function(name, event) {
                name = name.toLowerCase();
                var domEvent = document.createEvent("CustomEvent");
                domEvent.initCustomEvent(name, false, true,
                    event);
                return dispatch(legacyHandlers[name], domEvent);
            };
        }
    } catch (e) {}
    return function() {
        return false;
    };
})();

var fireGlobalEvent = (function() {
    if (util.isNode) {
        return function() {
            return process.emit.apply(process, arguments);
        };
    } else {
        if (!util.global) {
            return function() {
                return false;
            };
        }
        return function(name) {
            var methodName = "on" + name.toLowerCase();
            var method = util.global[methodName];
            if (!method) return false;
            method.apply(util.global, [].slice.call(arguments, 1));
            return true;
        };
    }
})();

function generatePromiseLifecycleEventObject(name, promise) {
    return {promise: promise};
}

var eventToObjectGenerator = {
    promiseCreated: generatePromiseLifecycleEventObject,
    promiseFulfilled: generatePromiseLifecycleEventObject,
    promiseRejected: generatePromiseLifecycleEventObject,
    promiseResolved: generatePromiseLifecycleEventObject,
    promiseCancelled: generatePromiseLifecycleEventObject,
    promiseChained: function(name, promise, child) {
        return {promise: promise, child: child};
    },
    warning: function(name, warning) {
        return {warning: warning};
    },
    unhandledRejection: function (name, reason, promise) {
        return {reason: reason, promise: promise};
    },
    rejectionHandled: generatePromiseLifecycleEventObject
};

var activeFireEvent = function (name) {
    var globalEventFired = false;
    try {
        globalEventFired = fireGlobalEvent.apply(null, arguments);
    } catch (e) {
        async.throwLater(e);
        globalEventFired = true;
    }

    var domEventFired = false;
    try {
        domEventFired = fireDomEvent(name,
                    eventToObjectGenerator[name].apply(null, arguments));
    } catch (e) {
        async.throwLater(e);
        domEventFired = true;
    }

    return domEventFired || globalEventFired;
};

Promise.config = function(opts) {
    opts = Object(opts);
    if ("longStackTraces" in opts) {
        if (opts.longStackTraces) {
            Promise.longStackTraces();
        } else if (!opts.longStackTraces && Promise.hasLongStackTraces()) {
            disableLongStackTraces();
        }
    }
    if ("warnings" in opts) {
        var warningsOption = opts.warnings;
        config.warnings = !!warningsOption;
        wForgottenReturn = config.warnings;

        if (util.isObject(warningsOption)) {
            if ("wForgottenReturn" in warningsOption) {
                wForgottenReturn = !!warningsOption.wForgottenReturn;
            }
        }
    }
    if ("cancellation" in opts && opts.cancellation && !config.cancellation) {
        if (async.haveItemsQueued()) {
            throw new Error(
                "cannot enable cancellation after promises are in use");
        }
        Promise.prototype._clearCancellationData =
            cancellationClearCancellationData;
        Promise.prototype._propagateFrom = cancellationPropagateFrom;
        Promise.prototype._onCancel = cancellationOnCancel;
        Promise.prototype._setOnCancel = cancellationSetOnCancel;
        Promise.prototype._attachCancellationCallback =
            cancellationAttachCancellationCallback;
        Promise.prototype._execute = cancellationExecute;
        propagateFromFunction = cancellationPropagateFrom;
        config.cancellation = true;
    }
    if ("monitoring" in opts) {
        if (opts.monitoring && !config.monitoring) {
            config.monitoring = true;
            Promise.prototype._fireEvent = activeFireEvent;
        } else if (!opts.monitoring && config.monitoring) {
            config.monitoring = false;
            Promise.prototype._fireEvent = defaultFireEvent;
        }
    }
    if ("asyncHooks" in opts && util.nodeSupportsAsyncResource) {
        var prev = config.asyncHooks;
        var cur = !!opts.asyncHooks;
        if (prev !== cur) {
            config.asyncHooks = cur;
            if (cur) {
                enableAsyncHooks();
            } else {
                disableAsyncHooks();
            }
        }
    }
    return Promise;
};

function defaultFireEvent() { return false; }

Promise.prototype._fireEvent = defaultFireEvent;
Promise.prototype._execute = function(executor, resolve, reject) {
    try {
        executor(resolve, reject);
    } catch (e) {
        return e;
    }
};
Promise.prototype._onCancel = function () {};
Promise.prototype._setOnCancel = function (handler) { ; };
Promise.prototype._attachCancellationCallback = function(onCancel) {
    ;
};
Promise.prototype._captureStackTrace = function () {};
Promise.prototype._attachExtraTrace = function () {};
Promise.prototype._dereferenceTrace = function () {};
Promise.prototype._clearCancellationData = function() {};
Promise.prototype._propagateFrom = function (parent, flags) {
    ;
    ;
};

function cancellationExecute(executor, resolve, reject) {
    var promise = this;
    try {
        executor(resolve, reject, function(onCancel) {
            if (typeof onCancel !== "function") {
                throw new TypeError("onCancel must be a function, got: " +
                                    util.toString(onCancel));
            }
            promise._attachCancellationCallback(onCancel);
        });
    } catch (e) {
        return e;
    }
}

function cancellationAttachCancellationCallback(onCancel) {
    if (!this._isCancellable()) return this;

    var previousOnCancel = this._onCancel();
    if (previousOnCancel !== undefined) {
        if (util.isArray(previousOnCancel)) {
            previousOnCancel.push(onCancel);
        } else {
            this._setOnCancel([previousOnCancel, onCancel]);
        }
    } else {
        this._setOnCancel(onCancel);
    }
}

function cancellationOnCancel() {
    return this._onCancelField;
}

function cancellationSetOnCancel(onCancel) {
    this._onCancelField = onCancel;
}

function cancellationClearCancellationData() {
    this._cancellationParent = undefined;
    this._onCancelField = undefined;
}

function cancellationPropagateFrom(parent, flags) {
    if ((flags & 1) !== 0) {
        this._cancellationParent = parent;
        var branchesRemainingToCancel = parent._branchesRemainingToCancel;
        if (branchesRemainingToCancel === undefined) {
            branchesRemainingToCancel = 0;
        }
        parent._branchesRemainingToCancel = branchesRemainingToCancel + 1;
    }
    if ((flags & 2) !== 0 && parent._isBound()) {
        this._setBoundTo(parent._boundTo);
    }
}

function bindingPropagateFrom(parent, flags) {
    if ((flags & 2) !== 0 && parent._isBound()) {
        this._setBoundTo(parent._boundTo);
    }
}
var propagateFromFunction = bindingPropagateFrom;

function boundValueFunction() {
    var ret = this._boundTo;
    if (ret !== undefined) {
        if (ret instanceof Promise) {
            if (ret.isFulfilled()) {
                return ret.value();
            } else {
                return undefined;
            }
        }
    }
    return ret;
}

function longStackTracesCaptureStackTrace() {
    this._trace = new CapturedTrace(this._peekContext());
}

function longStackTracesAttachExtraTrace(error, ignoreSelf) {
    if (canAttachTrace(error)) {
        var trace = this._trace;
        if (trace !== undefined) {
            if (ignoreSelf) trace = trace._parent;
        }
        if (trace !== undefined) {
            trace.attachExtraTrace(error);
        } else if (!error.__stackCleaned__) {
            var parsed = parseStackAndMessage(error);
            util.notEnumerableProp(error, "stack",
                parsed.message + "\n" + parsed.stack.join("\n"));
            util.notEnumerableProp(error, "__stackCleaned__", true);
        }
    }
}

function longStackTracesDereferenceTrace() {
    this._trace = undefined;
}

function checkForgottenReturns(returnValue, promiseCreated, name, promise,
                               parent) {
    if (returnValue === undefined && promiseCreated !== null &&
        wForgottenReturn) {
        if (parent !== undefined && parent._returnedNonUndefined()) return;
        if ((promise._bitField & 65535) === 0) return;

        if (name) name = name + " ";
        var handlerLine = "";
        var creatorLine = "";
        if (promiseCreated._trace) {
            var traceLines = promiseCreated._trace.stack.split("\n");
            var stack = cleanStack(traceLines);
            for (var i = stack.length - 1; i >= 0; --i) {
                var line = stack[i];
                if (!nodeFramePattern.test(line)) {
                    var lineMatches = line.match(parseLinePattern);
                    if (lineMatches) {
                        handlerLine  = "at " + lineMatches[1] +
                            ":" + lineMatches[2] + ":" + lineMatches[3] + " ";
                    }
                    break;
                }
            }

            if (stack.length > 0) {
                var firstUserLine = stack[0];
                for (var i = 0; i < traceLines.length; ++i) {

                    if (traceLines[i] === firstUserLine) {
                        if (i > 0) {
                            creatorLine = "\n" + traceLines[i - 1];
                        }
                        break;
                    }
                }

            }
        }
        var msg = "a promise was created in a " + name +
            "handler " + handlerLine + "but was not returned from it, " +
            "see http://goo.gl/rRqMUw" +
            creatorLine;
        promise._warn(msg, true, promiseCreated);
    }
}

function deprecated(name, replacement) {
    var message = name +
        " is deprecated and will be removed in a future version.";
    if (replacement) message += " Use " + replacement + " instead.";
    return warn(message);
}

function warn(message, shouldUseOwnTrace, promise) {
    if (!config.warnings) return;
    var warning = new Warning(message);
    var ctx;
    if (shouldUseOwnTrace) {
        promise._attachExtraTrace(warning);
    } else if (config.longStackTraces && (ctx = Promise._peekContext())) {
        ctx.attachExtraTrace(warning);
    } else {
        var parsed = parseStackAndMessage(warning);
        warning.stack = parsed.message + "\n" + parsed.stack.join("\n");
    }

    if (!activeFireEvent("warning", warning)) {
        formatAndLogError(warning, "", true);
    }
}

function reconstructStack(message, stacks) {
    for (var i = 0; i < stacks.length - 1; ++i) {
        stacks[i].push("From previous event:");
        stacks[i] = stacks[i].join("\n");
    }
    if (i < stacks.length) {
        stacks[i] = stacks[i].join("\n");
    }
    return message + "\n" + stacks.join("\n");
}

function removeDuplicateOrEmptyJumps(stacks) {
    for (var i = 0; i < stacks.length; ++i) {
        if (stacks[i].length === 0 ||
            ((i + 1 < stacks.length) && stacks[i][0] === stacks[i+1][0])) {
            stacks.splice(i, 1);
            i--;
        }
    }
}

function removeCommonRoots(stacks) {
    var current = stacks[0];
    for (var i = 1; i < stacks.length; ++i) {
        var prev = stacks[i];
        var currentLastIndex = current.length - 1;
        var currentLastLine = current[currentLastIndex];
        var commonRootMeetPoint = -1;

        for (var j = prev.length - 1; j >= 0; --j) {
            if (prev[j] === currentLastLine) {
                commonRootMeetPoint = j;
                break;
            }
        }

        for (var j = commonRootMeetPoint; j >= 0; --j) {
            var line = prev[j];
            if (current[currentLastIndex] === line) {
                current.pop();
                currentLastIndex--;
            } else {
                break;
            }
        }
        current = prev;
    }
}

function cleanStack(stack) {
    var ret = [];
    for (var i = 0; i < stack.length; ++i) {
        var line = stack[i];
        var isTraceLine = "    (No stack trace)" === line ||
            stackFramePattern.test(line);
        var isInternalFrame = isTraceLine && shouldIgnore(line);
        if (isTraceLine && !isInternalFrame) {
            if (indentStackFrames && line.charAt(0) !== " ") {
                line = "    " + line;
            }
            ret.push(line);
        }
    }
    return ret;
}

function stackFramesAsArray(error) {
    var stack = error.stack.replace(/\s+$/g, "").split("\n");
    for (var i = 0; i < stack.length; ++i) {
        var line = stack[i];
        if ("    (No stack trace)" === line || stackFramePattern.test(line)) {
            break;
        }
    }
    if (i > 0 && error.name != "SyntaxError") {
        stack = stack.slice(i);
    }
    return stack;
}

function parseStackAndMessage(error) {
    var stack = error.stack;
    var message = error.toString();
    stack = typeof stack === "string" && stack.length > 0
                ? stackFramesAsArray(error) : ["    (No stack trace)"];
    return {
        message: message,
        stack: error.name == "SyntaxError" ? stack : cleanStack(stack)
    };
}

function formatAndLogError(error, title, isSoft) {
    if (typeof console !== "undefined") {
        var message;
        if (util.isObject(error)) {
            var stack = error.stack;
            message = title + formatStack(stack, error);
        } else {
            message = title + String(error);
        }
        if (typeof printWarning === "function") {
            printWarning(message, isSoft);
        } else if (typeof console.log === "function" ||
            typeof console.log === "object") {
            console.log(message);
        }
    }
}

function fireRejectionEvent(name, localHandler, reason, promise) {
    var localEventFired = false;
    try {
        if (typeof localHandler === "function") {
            localEventFired = true;
            if (name === "rejectionHandled") {
                localHandler(promise);
            } else {
                localHandler(reason, promise);
            }
        }
    } catch (e) {
        async.throwLater(e);
    }

    if (name === "unhandledRejection") {
        if (!activeFireEvent(name, reason, promise) && !localEventFired) {
            formatAndLogError(reason, "Unhandled rejection ");
        }
    } else {
        activeFireEvent(name, promise);
    }
}

function formatNonError(obj) {
    var str;
    if (typeof obj === "function") {
        str = "[function " +
            (obj.name || "anonymous") +
            "]";
    } else {
        str = obj && typeof obj.toString === "function"
            ? obj.toString() : util.toString(obj);
        var ruselessToString = /\[object [a-zA-Z0-9$_]+\]/;
        if (ruselessToString.test(str)) {
            try {
                var newStr = JSON.stringify(obj);
                str = newStr;
            }
            catch(e) {

            }
        }
        if (str.length === 0) {
            str = "(empty array)";
        }
    }
    return ("(<" + snip(str) + ">, no stack trace)");
}

function snip(str) {
    var maxChars = 41;
    if (str.length < maxChars) {
        return str;
    }
    return str.substr(0, maxChars - 3) + "...";
}

function longStackTracesIsSupported() {
    return typeof captureStackTrace === "function";
}

var shouldIgnore = function() { return false; };
var parseLineInfoRegex = /[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;
function parseLineInfo(line) {
    var matches = line.match(parseLineInfoRegex);
    if (matches) {
        return {
            fileName: matches[1],
            line: parseInt(matches[2], 10)
        };
    }
}

function setBounds(firstLineError, lastLineError) {
    if (!longStackTracesIsSupported()) return;
    var firstStackLines = (firstLineError.stack || "").split("\n");
    var lastStackLines = (lastLineError.stack || "").split("\n");
    var firstIndex = -1;
    var lastIndex = -1;
    var firstFileName;
    var lastFileName;
    for (var i = 0; i < firstStackLines.length; ++i) {
        var result = parseLineInfo(firstStackLines[i]);
        if (result) {
            firstFileName = result.fileName;
            firstIndex = result.line;
            break;
        }
    }
    for (var i = 0; i < lastStackLines.length; ++i) {
        var result = parseLineInfo(lastStackLines[i]);
        if (result) {
            lastFileName = result.fileName;
            lastIndex = result.line;
            break;
        }
    }
    if (firstIndex < 0 || lastIndex < 0 || !firstFileName || !lastFileName ||
        firstFileName !== lastFileName || firstIndex >= lastIndex) {
        return;
    }

    shouldIgnore = function(line) {
        if (bluebirdFramePattern.test(line)) return true;
        var info = parseLineInfo(line);
        if (info) {
            if (info.fileName === firstFileName &&
                (firstIndex <= info.line && info.line <= lastIndex)) {
                return true;
            }
        }
        return false;
    };
}

function CapturedTrace(parent) {
    this._parent = parent;
    this._promisesCreated = 0;
    var length = this._length = 1 + (parent === undefined ? 0 : parent._length);
    captureStackTrace(this, CapturedTrace);
    if (length > 32) this.uncycle();
}
util.inherits(CapturedTrace, Error);
Context.CapturedTrace = CapturedTrace;

CapturedTrace.prototype.uncycle = function() {
    var length = this._length;
    if (length < 2) return;
    var nodes = [];
    var stackToIndex = {};

    for (var i = 0, node = this; node !== undefined; ++i) {
        nodes.push(node);
        node = node._parent;
    }
    length = this._length = i;
    for (var i = length - 1; i >= 0; --i) {
        var stack = nodes[i].stack;
        if (stackToIndex[stack] === undefined) {
            stackToIndex[stack] = i;
        }
    }
    for (var i = 0; i < length; ++i) {
        var currentStack = nodes[i].stack;
        var index = stackToIndex[currentStack];
        if (index !== undefined && index !== i) {
            if (index > 0) {
                nodes[index - 1]._parent = undefined;
                nodes[index - 1]._length = 1;
            }
            nodes[i]._parent = undefined;
            nodes[i]._length = 1;
            var cycleEdgeNode = i > 0 ? nodes[i - 1] : this;

            if (index < length - 1) {
                cycleEdgeNode._parent = nodes[index + 1];
                cycleEdgeNode._parent.uncycle();
                cycleEdgeNode._length =
                    cycleEdgeNode._parent._length + 1;
            } else {
                cycleEdgeNode._parent = undefined;
                cycleEdgeNode._length = 1;
            }
            var currentChildLength = cycleEdgeNode._length + 1;
            for (var j = i - 2; j >= 0; --j) {
                nodes[j]._length = currentChildLength;
                currentChildLength++;
            }
            return;
        }
    }
};

CapturedTrace.prototype.attachExtraTrace = function(error) {
    if (error.__stackCleaned__) return;
    this.uncycle();
    var parsed = parseStackAndMessage(error);
    var message = parsed.message;
    var stacks = [parsed.stack];

    var trace = this;
    while (trace !== undefined) {
        stacks.push(cleanStack(trace.stack.split("\n")));
        trace = trace._parent;
    }
    removeCommonRoots(stacks);
    removeDuplicateOrEmptyJumps(stacks);
    util.notEnumerableProp(error, "stack", reconstructStack(message, stacks));
    util.notEnumerableProp(error, "__stackCleaned__", true);
};

var captureStackTrace = (function stackDetection() {
    var v8stackFramePattern = /^\s*at\s*/;
    var v8stackFormatter = function(stack, error) {
        if (typeof stack === "string") return stack;

        if (error.name !== undefined &&
            error.message !== undefined) {
            return error.toString();
        }
        return formatNonError(error);
    };

    if (typeof Error.stackTraceLimit === "number" &&
        typeof Error.captureStackTrace === "function") {
        Error.stackTraceLimit += 6;
        stackFramePattern = v8stackFramePattern;
        formatStack = v8stackFormatter;
        var captureStackTrace = Error.captureStackTrace;

        shouldIgnore = function(line) {
            return bluebirdFramePattern.test(line);
        };
        return function(receiver, ignoreUntil) {
            Error.stackTraceLimit += 6;
            captureStackTrace(receiver, ignoreUntil);
            Error.stackTraceLimit -= 6;
        };
    }
    var err = new Error();

    if (typeof err.stack === "string" &&
        err.stack.split("\n")[0].indexOf("stackDetection@") >= 0) {
        stackFramePattern = /@/;
        formatStack = v8stackFormatter;
        indentStackFrames = true;
        return function captureStackTrace(o) {
            o.stack = new Error().stack;
        };
    }

    var hasStackAfterThrow;
    try { throw new Error(); }
    catch(e) {
        hasStackAfterThrow = ("stack" in e);
    }
    if (!("stack" in err) && hasStackAfterThrow &&
        typeof Error.stackTraceLimit === "number") {
        stackFramePattern = v8stackFramePattern;
        formatStack = v8stackFormatter;
        return function captureStackTrace(o) {
            Error.stackTraceLimit += 6;
            try { throw new Error(); }
            catch(e) { o.stack = e.stack; }
            Error.stackTraceLimit -= 6;
        };
    }

    formatStack = function(stack, error) {
        if (typeof stack === "string") return stack;

        if ((typeof error === "object" ||
            typeof error === "function") &&
            error.name !== undefined &&
            error.message !== undefined) {
            return error.toString();
        }
        return formatNonError(error);
    };

    return null;

})([]);

if (typeof console !== "undefined" && typeof console.warn !== "undefined") {
    printWarning = function (message) {
        console.warn(message);
    };
    if (util.isNode && process.stderr.isTTY) {
        printWarning = function(message, isSoft) {
            var color = isSoft ? "\u001b[33m" : "\u001b[31m";
            console.warn(color + message + "\u001b[0m\n");
        };
    } else if (!util.isNode && typeof (new Error().stack) === "string") {
        printWarning = function(message, isSoft) {
            console.warn("%c" + message,
                        isSoft ? "color: darkorange" : "color: red");
        };
    }
}

var config = {
    warnings: warnings,
    longStackTraces: false,
    cancellation: false,
    monitoring: false,
    asyncHooks: false
};

if (longStackTraces) Promise.longStackTraces();

return {
    asyncHooks: function() {
        return config.asyncHooks;
    },
    longStackTraces: function() {
        return config.longStackTraces;
    },
    warnings: function() {
        return config.warnings;
    },
    cancellation: function() {
        return config.cancellation;
    },
    monitoring: function() {
        return config.monitoring;
    },
    propagateFromFunction: function() {
        return propagateFromFunction;
    },
    boundValueFunction: function() {
        return boundValueFunction;
    },
    checkForgottenReturns: checkForgottenReturns,
    setBounds: setBounds,
    warn: warn,
    deprecated: deprecated,
    CapturedTrace: CapturedTrace,
    fireDomEvent: fireDomEvent,
    fireGlobalEvent: fireGlobalEvent
};
};
"use strict";
module.exports = function(Promise) {
function returner() {
    return this.value;
}
function thrower() {
    throw this.reason;
}

Promise.prototype["return"] =
Promise.prototype.thenReturn = function (value) {
    if (value instanceof Promise) value.suppressUnhandledRejections();
    return this._then(
        returner, undefined, undefined, {value: value}, undefined);
};

Promise.prototype["throw"] =
Promise.prototype.thenThrow = function (reason) {
    return this._then(
        thrower, undefined, undefined, {reason: reason}, undefined);
};

Promise.prototype.catchThrow = function (reason) {
    if (arguments.length <= 1) {
        return this._then(
            undefined, thrower, undefined, {reason: reason}, undefined);
    } else {
        var _reason = arguments[1];
        var handler = function() {throw _reason;};
        return this.caught(reason, handler);
    }
};

Promise.prototype.catchReturn = function (value) {
    if (arguments.length <= 1) {
        if (value instanceof Promise) value.suppressUnhandledRejections();
        return this._then(
            undefined, returner, undefined, {value: value}, undefined);
    } else {
        var _value = arguments[1];
        if (_value instanceof Promise) _value.suppressUnhandledRejections();
        var handler = function() {return _value;};
        return this.caught(value, handler);
    }
};
};
"use strict";
module.exports = function(Promise, INTERNAL) {
var PromiseReduce = Promise.reduce;
var PromiseAll = Promise.all;

function promiseAllThis() {
    return PromiseAll(this);
}

function PromiseMapSeries(promises, fn) {
    return PromiseReduce(promises, fn, INTERNAL, INTERNAL);
}

Promise.prototype.each = function (fn) {
    return PromiseReduce(this, fn, INTERNAL, 0)
              ._then(promiseAllThis, undefined, undefined, this, undefined);
};

Promise.prototype.mapSeries = function (fn) {
    return PromiseReduce(this, fn, INTERNAL, INTERNAL);
};

Promise.each = function (promises, fn) {
    return PromiseReduce(promises, fn, INTERNAL, 0)
              ._then(promiseAllThis, undefined, undefined, promises, undefined);
};

Promise.mapSeries = PromiseMapSeries;
};

"use strict";
var es5 = require("./es5");
var Objectfreeze = es5.freeze;
var util = require("./util");
var inherits = util.inherits;
var notEnumerableProp = util.notEnumerableProp;

function subError(nameProperty, defaultMessage) {
    function SubError(message) {
        if (!(this instanceof SubError)) return new SubError(message);
        notEnumerableProp(this, "message",
            typeof message === "string" ? message : defaultMessage);
        notEnumerableProp(this, "name", nameProperty);
        if (Error.captureStackTrace) {
            Error.captureStackTrace(this, this.constructor);
        } else {
            Error.call(this);
        }
    }
    inherits(SubError, Error);
    return SubError;
}

var _TypeError, _RangeError;
var Warning = subError("Warning", "warning");
var CancellationError = subError("CancellationError", "cancellation error");
var TimeoutError = subError("TimeoutError", "timeout error");
var AggregateError = subError("AggregateError", "aggregate error");
try {
    _TypeError = TypeError;
    _RangeError = RangeError;
} catch(e) {
    _TypeError = subError("TypeError", "type error");
    _RangeError = subError("RangeError", "range error");
}

var methods = ("join pop push shift unshift slice filter forEach some " +
    "every map indexOf lastIndexOf reduce reduceRight sort reverse").split(" ");

for (var i = 0; i < methods.length; ++i) {
    if (typeof Array.prototype[methods[i]] === "function") {
        AggregateError.prototype[methods[i]] = Array.prototype[methods[i]];
    }
}

es5.defineProperty(AggregateError.prototype, "length", {
    value: 0,
    configurable: false,
    writable: true,
    enumerable: true
});
AggregateError.prototype["isOperational"] = true;
var level = 0;
AggregateError.prototype.toString = function() {
    var indent = Array(level * 4 + 1).join(" ");
    var ret = "\n" + indent + "AggregateError of:" + "\n";
    level++;
    indent = Array(level * 4 + 1).join(" ");
    for (var i = 0; i < this.length; ++i) {
        var str = this[i] === this ? "[Circular AggregateError]" : this[i] + "";
        var lines = str.split("\n");
        for (var j = 0; j < lines.length; ++j) {
            lines[j] = indent + lines[j];
        }
        str = lines.join("\n");
        ret += str + "\n";
    }
    level--;
    return ret;
};

function OperationalError(message) {
    if (!(this instanceof OperationalError))
        return new OperationalError(message);
    notEnumerableProp(this, "name", "OperationalError");
    notEnumerableProp(this, "message", message);
    this.cause = message;
    this["isOperational"] = true;

    if (message instanceof Error) {
        notEnumerableProp(this, "message", message.message);
        notEnumerableProp(this, "stack", message.stack);
    } else if (Error.captureStackTrace) {
        Error.captureStackTrace(this, this.constructor);
    }

}
inherits(OperationalError, Error);

var errorTypes = Error["__BluebirdErrorTypes__"];
if (!errorTypes) {
    errorTypes = Objectfreeze({
        CancellationError: CancellationError,
        TimeoutError: TimeoutError,
        OperationalError: OperationalError,
        RejectionError: OperationalError,
        AggregateError: AggregateError
    });
    es5.defineProperty(Error, "__BluebirdErrorTypes__", {
        value: errorTypes,
        writable: false,
        enumerable: false,
        configurable: false
    });
}

module.exports = {
    Error: Error,
    TypeError: _TypeError,
    RangeError: _RangeError,
    CancellationError: errorTypes.CancellationError,
    OperationalError: errorTypes.OperationalError,
    TimeoutError: errorTypes.TimeoutError,
    AggregateError: errorTypes.AggregateError,
    Warning: Warning
};
var isES5 = (function(){
    "use strict";
    return this === undefined;
})();

if (isES5) {
    module.exports = {
        freeze: Object.freeze,
        defineProperty: Object.defineProperty,
        getDescriptor: Object.getOwnPropertyDescriptor,
        keys: Object.keys,
        names: Object.getOwnPropertyNames,
        getPrototypeOf: Object.getPrototypeOf,
        isArray: Array.isArray,
        isES5: isES5,
        propertyIsWritable: function(obj, prop) {
            var descriptor = Object.getOwnPropertyDescriptor(obj, prop);
            return !!(!descriptor || descriptor.writable || descriptor.set);
        }
    };
} else {
    var has = {}.hasOwnProperty;
    var str = {}.toString;
    var proto = {}.constructor.prototype;

    var ObjectKeys = function (o) {
        var ret = [];
        for (var key in o) {
            if (has.call(o, key)) {
                ret.push(key);
            }
        }
        return ret;
    };

    var ObjectGetDescriptor = function(o, key) {
        return {value: o[key]};
    };

    var ObjectDefineProperty = function (o, key, desc) {
        o[key] = desc.value;
        return o;
    };

    var ObjectFreeze = function (obj) {
        return obj;
    };

    var ObjectGetPrototypeOf = function (obj) {
        try {
            return Object(obj).constructor.prototype;
        }
        catch (e) {
            return proto;
        }
    };

    var ArrayIsArray = function (obj) {
        try {
            return str.call(obj) === "[object Array]";
        }
        catch(e) {
            return false;
        }
    };

    module.exports = {
        isArray: ArrayIsArray,
        keys: ObjectKeys,
        names: ObjectKeys,
        defineProperty: ObjectDefineProperty,
        getDescriptor: ObjectGetDescriptor,
        freeze: ObjectFreeze,
        getPrototypeOf: ObjectGetPrototypeOf,
        isES5: isES5,
        propertyIsWritable: function() {
            return true;
        }
    };
}
"use strict";
module.exports = function(Promise, INTERNAL) {
var PromiseMap = Promise.map;

Promise.prototype.filter = function (fn, options) {
    return PromiseMap(this, fn, options, INTERNAL);
};

Promise.filter = function (promises, fn, options) {
    return PromiseMap(promises, fn, options, INTERNAL);
};
};
"use strict";
module.exports = function(Promise, tryConvertToPromise, NEXT_FILTER) {
var util = require("./util");
var CancellationError = Promise.CancellationError;
var errorObj = util.errorObj;
var catchFilter = require("./catch_filter")(NEXT_FILTER);

function PassThroughHandlerContext(promise, type, handler) {
    this.promise = promise;
    this.type = type;
    this.handler = handler;
    this.called = false;
    this.cancelPromise = null;
}

PassThroughHandlerContext.prototype.isFinallyHandler = function() {
    return this.type === 0;
};

function FinallyHandlerCancelReaction(finallyHandler) {
    this.finallyHandler = finallyHandler;
}

FinallyHandlerCancelReaction.prototype._resultCancelled = function() {
    checkCancel(this.finallyHandler);
};

function checkCancel(ctx, reason) {
    if (ctx.cancelPromise != null) {
        if (arguments.length > 1) {
            ctx.cancelPromise._reject(reason);
        } else {
            ctx.cancelPromise._cancel();
        }
        ctx.cancelPromise = null;
        return true;
    }
    return false;
}

function succeed() {
    return finallyHandler.call(this, this.promise._target()._settledValue());
}
function fail(reason) {
    if (checkCancel(this, reason)) return;
    errorObj.e = reason;
    return errorObj;
}
function finallyHandler(reasonOrValue) {
    var promise = this.promise;
    var handler = this.handler;

    if (!this.called) {
        this.called = true;
        var ret = this.isFinallyHandler()
            ? handler.call(promise._boundValue())
            : handler.call(promise._boundValue(), reasonOrValue);
        if (ret === NEXT_FILTER) {
            return ret;
        } else if (ret !== undefined) {
            promise._setReturnedNonUndefined();
            var maybePromise = tryConvertToPromise(ret, promise);
            if (maybePromise instanceof Promise) {
                if (this.cancelPromise != null) {
                    if (maybePromise._isCancelled()) {
                        var reason =
                            new CancellationError("late cancellation observer");
                        promise._attachExtraTrace(reason);
                        errorObj.e = reason;
                        return errorObj;
                    } else if (maybePromise.isPending()) {
                        maybePromise._attachCancellationCallback(
                            new FinallyHandlerCancelReaction(this));
                    }
                }
                return maybePromise._then(
                    succeed, fail, undefined, this, undefined);
            }
        }
    }

    if (promise.isRejected()) {
        checkCancel(this);
        errorObj.e = reasonOrValue;
        return errorObj;
    } else {
        checkCancel(this);
        return reasonOrValue;
    }
}

Promise.prototype._passThrough = function(handler, type, success, fail) {
    if (typeof handler !== "function") return this.then();
    return this._then(success,
                      fail,
                      undefined,
                      new PassThroughHandlerContext(this, type, handler),
                      undefined);
};

Promise.prototype.lastly =
Promise.prototype["finally"] = function (handler) {
    return this._passThrough(handler,
                             0,
                             finallyHandler,
                             finallyHandler);
};


Promise.prototype.tap = function (handler) {
    return this._passThrough(handler, 1, finallyHandler);
};

Promise.prototype.tapCatch = function (handlerOrPredicate) {
    var len = arguments.length;
    if(len === 1) {
        return this._passThrough(handlerOrPredicate,
                                 1,
                                 undefined,
                                 finallyHandler);
    } else {
         var catchInstances = new Array(len - 1),
            j = 0, i;
        for (i = 0; i < len - 1; ++i) {
            var item = arguments[i];
            if (util.isObject(item)) {
                catchInstances[j++] = item;
            } else {
                return Promise.reject(new TypeError(
                    "tapCatch statement predicate: "
                    + "expecting an object but got " + util.classString(item)
                ));
            }
        }
        catchInstances.length = j;
        var handler = arguments[i];
        return this._passThrough(catchFilter(catchInstances, handler, this),
                                 1,
                                 undefined,
                                 finallyHandler);
    }

};

return PassThroughHandlerContext;
};
"use strict";
module.exports = function(Promise,
                          apiRejection,
                          INTERNAL,
                          tryConvertToPromise,
                          Proxyable,
                          debug) {
var errors = require("./errors");
var TypeError = errors.TypeError;
var util = require("./util");
var errorObj = util.errorObj;
var tryCatch = util.tryCatch;
var yieldHandlers = [];

function promiseFromYieldHandler(value, yieldHandlers, traceParent) {
    for (var i = 0; i < yieldHandlers.length; ++i) {
        traceParent._pushContext();
        var result = tryCatch(yieldHandlers[i])(value);
        traceParent._popContext();
        if (result === errorObj) {
            traceParent._pushContext();
            var ret = Promise.reject(errorObj.e);
            traceParent._popContext();
            return ret;
        }
        var maybePromise = tryConvertToPromise(result, traceParent);
        if (maybePromise instanceof Promise) return maybePromise;
    }
    return null;
}

function PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) {
    if (debug.cancellation()) {
        var internal = new Promise(INTERNAL);
        var _finallyPromise = this._finallyPromise = new Promise(INTERNAL);
        this._promise = internal.lastly(function() {
            return _finallyPromise;
        });
        internal._captureStackTrace();
        internal._setOnCancel(this);
    } else {
        var promise = this._promise = new Promise(INTERNAL);
        promise._captureStackTrace();
    }
    this._stack = stack;
    this._generatorFunction = generatorFunction;
    this._receiver = receiver;
    this._generator = undefined;
    this._yieldHandlers = typeof yieldHandler === "function"
        ? [yieldHandler].concat(yieldHandlers)
        : yieldHandlers;
    this._yieldedPromise = null;
    this._cancellationPhase = false;
}
util.inherits(PromiseSpawn, Proxyable);

PromiseSpawn.prototype._isResolved = function() {
    return this._promise === null;
};

PromiseSpawn.prototype._cleanup = function() {
    this._promise = this._generator = null;
    if (debug.cancellation() && this._finallyPromise !== null) {
        this._finallyPromise._fulfill();
        this._finallyPromise = null;
    }
};

PromiseSpawn.prototype._promiseCancelled = function() {
    if (this._isResolved()) return;
    var implementsReturn = typeof this._generator["return"] !== "undefined";

    var result;
    if (!implementsReturn) {
        var reason = new Promise.CancellationError(
            "generator .return() sentinel");
        Promise.coroutine.returnSentinel = reason;
        this._promise._attachExtraTrace(reason);
        this._promise._pushContext();
        result = tryCatch(this._generator["throw"]).call(this._generator,
                                                         reason);
        this._promise._popContext();
    } else {
        this._promise._pushContext();
        result = tryCatch(this._generator["return"]).call(this._generator,
                                                          undefined);
        this._promise._popContext();
    }
    this._cancellationPhase = true;
    this._yieldedPromise = null;
    this._continue(result);
};

PromiseSpawn.prototype._promiseFulfilled = function(value) {
    this._yieldedPromise = null;
    this._promise._pushContext();
    var result = tryCatch(this._generator.next).call(this._generator, value);
    this._promise._popContext();
    this._continue(result);
};

PromiseSpawn.prototype._promiseRejected = function(reason) {
    this._yieldedPromise = null;
    this._promise._attachExtraTrace(reason);
    this._promise._pushContext();
    var result = tryCatch(this._generator["throw"])
        .call(this._generator, reason);
    this._promise._popContext();
    this._continue(result);
};

PromiseSpawn.prototype._resultCancelled = function() {
    if (this._yieldedPromise instanceof Promise) {
        var promise = this._yieldedPromise;
        this._yieldedPromise = null;
        promise.cancel();
    }
};

PromiseSpawn.prototype.promise = function () {
    return this._promise;
};

PromiseSpawn.prototype._run = function () {
    this._generator = this._generatorFunction.call(this._receiver);
    this._receiver =
        this._generatorFunction = undefined;
    this._promiseFulfilled(undefined);
};

PromiseSpawn.prototype._continue = function (result) {
    var promise = this._promise;
    if (result === errorObj) {
        this._cleanup();
        if (this._cancellationPhase) {
            return promise.cancel();
        } else {
            return promise._rejectCallback(result.e, false);
        }
    }

    var value = result.value;
    if (result.done === true) {
        this._cleanup();
        if (this._cancellationPhase) {
            return promise.cancel();
        } else {
            return promise._resolveCallback(value);
        }
    } else {
        var maybePromise = tryConvertToPromise(value, this._promise);
        if (!(maybePromise instanceof Promise)) {
            maybePromise =
                promiseFromYieldHandler(maybePromise,
                                        this._yieldHandlers,
                                        this._promise);
            if (maybePromise === null) {
                this._promiseRejected(
                    new TypeError(
                        "A value %s was yielded that could not be treated as a promise\u000a\u000a    See http://goo.gl/MqrFmX\u000a\u000a".replace("%s", String(value)) +
                        "From coroutine:\u000a" +
                        this._stack.split("\n").slice(1, -7).join("\n")
                    )
                );
                return;
            }
        }
        maybePromise = maybePromise._target();
        var bitField = maybePromise._bitField;
        ;
        if (((bitField & 50397184) === 0)) {
            this._yieldedPromise = maybePromise;
            maybePromise._proxy(this, null);
        } else if (((bitField & 33554432) !== 0)) {
            Promise._async.invoke(
                this._promiseFulfilled, this, maybePromise._value()
            );
        } else if (((bitField & 16777216) !== 0)) {
            Promise._async.invoke(
                this._promiseRejected, this, maybePromise._reason()
            );
        } else {
            this._promiseCancelled();
        }
    }
};

Promise.coroutine = function (generatorFunction, options) {
    if (typeof generatorFunction !== "function") {
        throw new TypeError("generatorFunction must be a function\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    var yieldHandler = Object(options).yieldHandler;
    var PromiseSpawn$ = PromiseSpawn;
    var stack = new Error().stack;
    return function () {
        var generator = generatorFunction.apply(this, arguments);
        var spawn = new PromiseSpawn$(undefined, undefined, yieldHandler,
                                      stack);
        var ret = spawn.promise();
        spawn._generator = generator;
        spawn._promiseFulfilled(undefined);
        return ret;
    };
};

Promise.coroutine.addYieldHandler = function(fn) {
    if (typeof fn !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(fn));
    }
    yieldHandlers.push(fn);
};

Promise.spawn = function (generatorFunction) {
    debug.deprecated("Promise.spawn()", "Promise.coroutine()");
    if (typeof generatorFunction !== "function") {
        return apiRejection("generatorFunction must be a function\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    var spawn = new PromiseSpawn(generatorFunction, this);
    var ret = spawn.promise();
    spawn._run(Promise.spawn);
    return ret;
};
};
"use strict";
module.exports =
function(Promise, PromiseArray, tryConvertToPromise, INTERNAL, async) {
var util = require("./util");
var canEvaluate = util.canEvaluate;
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;
var reject;

if (!false) {
if (canEvaluate) {
    var thenCallback = function(i) {
        return new Function("value", "holder", "                             \n\
            'use strict';                                                    \n\
            holder.pIndex = value;                                           \n\
            holder.checkFulfillment(this);                                   \n\
            ".replace(/Index/g, i));
    };

    var promiseSetter = function(i) {
        return new Function("promise", "holder", "                           \n\
            'use strict';                                                    \n\
            holder.pIndex = promise;                                         \n\
            ".replace(/Index/g, i));
    };

    var generateHolderClass = function(total) {
        var props = new Array(total);
        for (var i = 0; i < props.length; ++i) {
            props[i] = "this.p" + (i+1);
        }
        var assignment = props.join(" = ") + " = null;";
        var cancellationCode= "var promise;\n" + props.map(function(prop) {
            return "                                                         \n\
                promise = " + prop + ";                                      \n\
                if (promise instanceof Promise) {                            \n\
                    promise.cancel();                                        \n\
                }                                                            \n\
            ";
        }).join("\n");
        var passedArguments = props.join(", ");
        var name = "Holder$" + total;


        var code = "return function(tryCatch, errorObj, Promise, async) {    \n\
            'use strict';                                                    \n\
            function [TheName](fn) {                                         \n\
                [TheProperties]                                              \n\
                this.fn = fn;                                                \n\
                this.asyncNeeded = true;                                     \n\
                this.now = 0;                                                \n\
            }                                                                \n\
                                                                             \n\
            [TheName].prototype._callFunction = function(promise) {          \n\
                promise._pushContext();                                      \n\
                var ret = tryCatch(this.fn)([ThePassedArguments]);           \n\
                promise._popContext();                                       \n\
                if (ret === errorObj) {                                      \n\
                    promise._rejectCallback(ret.e, false);                   \n\
                } else {                                                     \n\
                    promise._resolveCallback(ret);                           \n\
                }                                                            \n\
            };                                                               \n\
                                                                             \n\
            [TheName].prototype.checkFulfillment = function(promise) {       \n\
                var now = ++this.now;                                        \n\
                if (now === [TheTotal]) {                                    \n\
                    if (this.asyncNeeded) {                                  \n\
                        async.invoke(this._callFunction, this, promise);     \n\
                    } else {                                                 \n\
                        this._callFunction(promise);                         \n\
                    }                                                        \n\
                                                                             \n\
                }                                                            \n\
            };                                                               \n\
                                                                             \n\
            [TheName].prototype._resultCancelled = function() {              \n\
                [CancellationCode]                                           \n\
            };                                                               \n\
                                                                             \n\
            return [TheName];                                                \n\
        }(tryCatch, errorObj, Promise, async);                               \n\
        ";

        code = code.replace(/\[TheName\]/g, name)
            .replace(/\[TheTotal\]/g, total)
            .replace(/\[ThePassedArguments\]/g, passedArguments)
            .replace(/\[TheProperties\]/g, assignment)
            .replace(/\[CancellationCode\]/g, cancellationCode);

        return new Function("tryCatch", "errorObj", "Promise", "async", code)
                           (tryCatch, errorObj, Promise, async);
    };

    var holderClasses = [];
    var thenCallbacks = [];
    var promiseSetters = [];

    for (var i = 0; i < 8; ++i) {
        holderClasses.push(generateHolderClass(i + 1));
        thenCallbacks.push(thenCallback(i + 1));
        promiseSetters.push(promiseSetter(i + 1));
    }

    reject = function (reason) {
        this._reject(reason);
    };
}}

Promise.join = function () {
    var last = arguments.length - 1;
    var fn;
    if (last > 0 && typeof arguments[last] === "function") {
        fn = arguments[last];
        if (!false) {
            if (last <= 8 && canEvaluate) {
                var ret = new Promise(INTERNAL);
                ret._captureStackTrace();
                var HolderClass = holderClasses[last - 1];
                var holder = new HolderClass(fn);
                var callbacks = thenCallbacks;

                for (var i = 0; i < last; ++i) {
                    var maybePromise = tryConvertToPromise(arguments[i], ret);
                    if (maybePromise instanceof Promise) {
                        maybePromise = maybePromise._target();
                        var bitField = maybePromise._bitField;
                        ;
                        if (((bitField & 50397184) === 0)) {
                            maybePromise._then(callbacks[i], reject,
                                               undefined, ret, holder);
                            promiseSetters[i](maybePromise, holder);
                            holder.asyncNeeded = false;
                        } else if (((bitField & 33554432) !== 0)) {
                            callbacks[i].call(ret,
                                              maybePromise._value(), holder);
                        } else if (((bitField & 16777216) !== 0)) {
                            ret._reject(maybePromise._reason());
                        } else {
                            ret._cancel();
                        }
                    } else {
                        callbacks[i].call(ret, maybePromise, holder);
                    }
                }

                if (!ret._isFateSealed()) {
                    if (holder.asyncNeeded) {
                        var context = Promise._getContext();
                        holder.fn = util.contextBind(context, holder.fn);
                    }
                    ret._setAsyncGuaranteed();
                    ret._setOnCancel(holder);
                }
                return ret;
            }
        }
    }
    var $_len = arguments.length;var args = new Array($_len); for(var $_i = 0; $_i < $_len ; ++$_i) {args[$_i] = arguments[$_i ];};
    if (fn) args.pop();
    var ret = new PromiseArray(args).promise();
    return fn !== undefined ? ret.spread(fn) : ret;
};

};
"use strict";
module.exports = function(Promise,
                          PromiseArray,
                          apiRejection,
                          tryConvertToPromise,
                          INTERNAL,
                          debug) {
var util = require("./util");
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;
var async = Promise._async;

function MappingPromiseArray(promises, fn, limit, _filter) {
    this.constructor$(promises);
    this._promise._captureStackTrace();
    var context = Promise._getContext();
    this._callback = util.contextBind(context, fn);
    this._preservedValues = _filter === INTERNAL
        ? new Array(this.length())
        : null;
    this._limit = limit;
    this._inFlight = 0;
    this._queue = [];
    async.invoke(this._asyncInit, this, undefined);
    if (util.isArray(promises)) {
        for (var i = 0; i < promises.length; ++i) {
            var maybePromise = promises[i];
            if (maybePromise instanceof Promise) {
                maybePromise.suppressUnhandledRejections();
            }
        }
    }
}
util.inherits(MappingPromiseArray, PromiseArray);

MappingPromiseArray.prototype._asyncInit = function() {
    this._init$(undefined, -2);
};

MappingPromiseArray.prototype._init = function () {};

MappingPromiseArray.prototype._promiseFulfilled = function (value, index) {
    var values = this._values;
    var length = this.length();
    var preservedValues = this._preservedValues;
    var limit = this._limit;

    if (index < 0) {
        index = (index * -1) - 1;
        values[index] = value;
        if (limit >= 1) {
            this._inFlight--;
            this._drainQueue();
            if (this._isResolved()) return true;
        }
    } else {
        if (limit >= 1 && this._inFlight >= limit) {
            values[index] = value;
            this._queue.push(index);
            return false;
        }
        if (preservedValues !== null) preservedValues[index] = value;

        var promise = this._promise;
        var callback = this._callback;
        var receiver = promise._boundValue();
        promise._pushContext();
        var ret = tryCatch(callback).call(receiver, value, index, length);
        var promiseCreated = promise._popContext();
        debug.checkForgottenReturns(
            ret,
            promiseCreated,
            preservedValues !== null ? "Promise.filter" : "Promise.map",
            promise
        );
        if (ret === errorObj) {
            this._reject(ret.e);
            return true;
        }

        var maybePromise = tryConvertToPromise(ret, this._promise);
        if (maybePromise instanceof Promise) {
            maybePromise = maybePromise._target();
            var bitField = maybePromise._bitField;
            ;
            if (((bitField & 50397184) === 0)) {
                if (limit >= 1) this._inFlight++;
                values[index] = maybePromise;
                maybePromise._proxy(this, (index + 1) * -1);
                return false;
            } else if (((bitField & 33554432) !== 0)) {
                ret = maybePromise._value();
            } else if (((bitField & 16777216) !== 0)) {
                this._reject(maybePromise._reason());
                return true;
            } else {
                this._cancel();
                return true;
            }
        }
        values[index] = ret;
    }
    var totalResolved = ++this._totalResolved;
    if (totalResolved >= length) {
        if (preservedValues !== null) {
            this._filter(values, preservedValues);
        } else {
            this._resolve(values);
        }
        return true;
    }
    return false;
};

MappingPromiseArray.prototype._drainQueue = function () {
    var queue = this._queue;
    var limit = this._limit;
    var values = this._values;
    while (queue.length > 0 && this._inFlight < limit) {
        if (this._isResolved()) return;
        var index = queue.pop();
        this._promiseFulfilled(values[index], index);
    }
};

MappingPromiseArray.prototype._filter = function (booleans, values) {
    var len = values.length;
    var ret = new Array(len);
    var j = 0;
    for (var i = 0; i < len; ++i) {
        if (booleans[i]) ret[j++] = values[i];
    }
    ret.length = j;
    this._resolve(ret);
};

MappingPromiseArray.prototype.preservedValues = function () {
    return this._preservedValues;
};

function map(promises, fn, options, _filter) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }

    var limit = 0;
    if (options !== undefined) {
        if (typeof options === "object" && options !== null) {
            if (typeof options.concurrency !== "number") {
                return Promise.reject(
                    new TypeError("'concurrency' must be a number but it is " +
                                    util.classString(options.concurrency)));
            }
            limit = options.concurrency;
        } else {
            return Promise.reject(new TypeError(
                            "options argument must be an object but it is " +
                             util.classString(options)));
        }
    }
    limit = typeof limit === "number" &&
        isFinite(limit) && limit >= 1 ? limit : 0;
    return new MappingPromiseArray(promises, fn, limit, _filter).promise();
}

Promise.prototype.map = function (fn, options) {
    return map(this, fn, options, null);
};

Promise.map = function (promises, fn, options, _filter) {
    return map(promises, fn, options, _filter);
};


};
"use strict";
module.exports =
function(Promise, INTERNAL, tryConvertToPromise, apiRejection, debug) {
var util = require("./util");
var tryCatch = util.tryCatch;

Promise.method = function (fn) {
    if (typeof fn !== "function") {
        throw new Promise.TypeError("expecting a function but got " + util.classString(fn));
    }
    return function () {
        var ret = new Promise(INTERNAL);
        ret._captureStackTrace();
        ret._pushContext();
        var value = tryCatch(fn).apply(this, arguments);
        var promiseCreated = ret._popContext();
        debug.checkForgottenReturns(
            value, promiseCreated, "Promise.method", ret);
        ret._resolveFromSyncValue(value);
        return ret;
    };
};

Promise.attempt = Promise["try"] = function (fn) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    ret._pushContext();
    var value;
    if (arguments.length > 1) {
        debug.deprecated("calling Promise.try with more than 1 argument");
        var arg = arguments[1];
        var ctx = arguments[2];
        value = util.isArray(arg) ? tryCatch(fn).apply(ctx, arg)
                                  : tryCatch(fn).call(ctx, arg);
    } else {
        value = tryCatch(fn)();
    }
    var promiseCreated = ret._popContext();
    debug.checkForgottenReturns(
        value, promiseCreated, "Promise.try", ret);
    ret._resolveFromSyncValue(value);
    return ret;
};

Promise.prototype._resolveFromSyncValue = function (value) {
    if (value === util.errorObj) {
        this._rejectCallback(value.e, false);
    } else {
        this._resolveCallback(value, true);
    }
};
};
"use strict";
var util = require("./util");
var maybeWrapAsError = util.maybeWrapAsError;
var errors = require("./errors");
var OperationalError = errors.OperationalError;
var es5 = require("./es5");

function isUntypedError(obj) {
    return obj instanceof Error &&
        es5.getPrototypeOf(obj) === Error.prototype;
}

var rErrorKey = /^(?:name|message|stack|cause)$/;
function wrapAsOperationalError(obj) {
    var ret;
    if (isUntypedError(obj)) {
        ret = new OperationalError(obj);
        ret.name = obj.name;
        ret.message = obj.message;
        ret.stack = obj.stack;
        var keys = es5.keys(obj);
        for (var i = 0; i < keys.length; ++i) {
            var key = keys[i];
            if (!rErrorKey.test(key)) {
                ret[key] = obj[key];
            }
        }
        return ret;
    }
    util.markAsOriginatingFromRejection(obj);
    return obj;
}

function nodebackForPromise(promise, multiArgs) {
    return function(err, value) {
        if (promise === null) return;
        if (err) {
            var wrapped = wrapAsOperationalError(maybeWrapAsError(err));
            promise._attachExtraTrace(wrapped);
            promise._reject(wrapped);
        } else if (!multiArgs) {
            promise._fulfill(value);
        } else {
            var $_len = arguments.length;var args = new Array(Math.max($_len - 1, 0)); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];};
            promise._fulfill(args);
        }
        promise = null;
    };
}

module.exports = nodebackForPromise;
"use strict";
module.exports = function(Promise) {
var util = require("./util");
var async = Promise._async;
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;

function spreadAdapter(val, nodeback) {
    var promise = this;
    if (!util.isArray(val)) return successAdapter.call(promise, val, nodeback);
    var ret =
        tryCatch(nodeback).apply(promise._boundValue(), [null].concat(val));
    if (ret === errorObj) {
        async.throwLater(ret.e);
    }
}

function successAdapter(val, nodeback) {
    var promise = this;
    var receiver = promise._boundValue();
    var ret = val === undefined
        ? tryCatch(nodeback).call(receiver, null)
        : tryCatch(nodeback).call(receiver, null, val);
    if (ret === errorObj) {
        async.throwLater(ret.e);
    }
}
function errorAdapter(reason, nodeback) {
    var promise = this;
    if (!reason) {
        var newReason = new Error(reason + "");
        newReason.cause = reason;
        reason = newReason;
    }
    var ret = tryCatch(nodeback).call(promise._boundValue(), reason);
    if (ret === errorObj) {
        async.throwLater(ret.e);
    }
}

Promise.prototype.asCallback = Promise.prototype.nodeify = function (nodeback,
                                                                     options) {
    if (typeof nodeback == "function") {
        var adapter = successAdapter;
        if (options !== undefined && Object(options).spread) {
            adapter = spreadAdapter;
        }
        this._then(
            adapter,
            errorAdapter,
            undefined,
            this,
            nodeback
        );
    }
    return this;
};
};
"use strict";
module.exports = function() {
var makeSelfResolutionError = function () {
    return new TypeError("circular promise resolution chain\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
};
var reflectHandler = function() {
    return new Promise.PromiseInspection(this._target());
};
var apiRejection = function(msg) {
    return Promise.reject(new TypeError(msg));
};
function Proxyable() {}
var UNDEFINED_BINDING = {};
var util = require("./util");
util.setReflectHandler(reflectHandler);

var getDomain = function() {
    var domain = process.domain;
    if (domain === undefined) {
        return null;
    }
    return domain;
};
var getContextDefault = function() {
    return null;
};
var getContextDomain = function() {
    return {
        domain: getDomain(),
        async: null
    };
};
var AsyncResource = util.isNode && util.nodeSupportsAsyncResource ?
    require("async_hooks").AsyncResource : null;
var getContextAsyncHooks = function() {
    return {
        domain: getDomain(),
        async: new AsyncResource("Bluebird::Promise")
    };
};
var getContext = util.isNode ? getContextDomain : getContextDefault;
util.notEnumerableProp(Promise, "_getContext", getContext);
var enableAsyncHooks = function() {
    getContext = getContextAsyncHooks;
    util.notEnumerableProp(Promise, "_getContext", getContextAsyncHooks);
};
var disableAsyncHooks = function() {
    getContext = getContextDomain;
    util.notEnumerableProp(Promise, "_getContext", getContextDomain);
};

var es5 = require("./es5");
var Async = require("./async");
var async = new Async();
es5.defineProperty(Promise, "_async", {value: async});
var errors = require("./errors");
var TypeError = Promise.TypeError = errors.TypeError;
Promise.RangeError = errors.RangeError;
var CancellationError = Promise.CancellationError = errors.CancellationError;
Promise.TimeoutError = errors.TimeoutError;
Promise.OperationalError = errors.OperationalError;
Promise.RejectionError = errors.OperationalError;
Promise.AggregateError = errors.AggregateError;
var INTERNAL = function(){};
var APPLY = {};
var NEXT_FILTER = {};
var tryConvertToPromise = require("./thenables")(Promise, INTERNAL);
var PromiseArray =
    require("./promise_array")(Promise, INTERNAL,
                               tryConvertToPromise, apiRejection, Proxyable);
var Context = require("./context")(Promise);
 /*jshint unused:false*/
var createContext = Context.create;

var debug = require("./debuggability")(Promise, Context,
    enableAsyncHooks, disableAsyncHooks);
var CapturedTrace = debug.CapturedTrace;
var PassThroughHandlerContext =
    require("./finally")(Promise, tryConvertToPromise, NEXT_FILTER);
var catchFilter = require("./catch_filter")(NEXT_FILTER);
var nodebackForPromise = require("./nodeback");
var errorObj = util.errorObj;
var tryCatch = util.tryCatch;
function check(self, executor) {
    if (self == null || self.constructor !== Promise) {
        throw new TypeError("the promise constructor cannot be invoked directly\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    if (typeof executor !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(executor));
    }

}

function Promise(executor) {
    if (executor !== INTERNAL) {
        check(this, executor);
    }
    this._bitField = 0;
    this._fulfillmentHandler0 = undefined;
    this._rejectionHandler0 = undefined;
    this._promise0 = undefined;
    this._receiver0 = undefined;
    this._resolveFromExecutor(executor);
    this._promiseCreated();
    this._fireEvent("promiseCreated", this);
}

Promise.prototype.toString = function () {
    return "[object Promise]";
};

Promise.prototype.caught = Promise.prototype["catch"] = function (fn) {
    var len = arguments.length;
    if (len > 1) {
        var catchInstances = new Array(len - 1),
            j = 0, i;
        for (i = 0; i < len - 1; ++i) {
            var item = arguments[i];
            if (util.isObject(item)) {
                catchInstances[j++] = item;
            } else {
                return apiRejection("Catch statement predicate: " +
                    "expecting an object but got " + util.classString(item));
            }
        }
        catchInstances.length = j;
        fn = arguments[i];

        if (typeof fn !== "function") {
            throw new TypeError("The last argument to .catch() " +
                "must be a function, got " + util.toString(fn));
        }
        return this.then(undefined, catchFilter(catchInstances, fn, this));
    }
    return this.then(undefined, fn);
};

Promise.prototype.reflect = function () {
    return this._then(reflectHandler,
        reflectHandler, undefined, this, undefined);
};

Promise.prototype.then = function (didFulfill, didReject) {
    if (debug.warnings() && arguments.length > 0 &&
        typeof didFulfill !== "function" &&
        typeof didReject !== "function") {
        var msg = ".then() only accepts functions but was passed: " +
                util.classString(didFulfill);
        if (arguments.length > 1) {
            msg += ", " + util.classString(didReject);
        }
        this._warn(msg);
    }
    return this._then(didFulfill, didReject, undefined, undefined, undefined);
};

Promise.prototype.done = function (didFulfill, didReject) {
    var promise =
        this._then(didFulfill, didReject, undefined, undefined, undefined);
    promise._setIsFinal();
};

Promise.prototype.spread = function (fn) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }
    return this.all()._then(fn, undefined, undefined, APPLY, undefined);
};

Promise.prototype.toJSON = function () {
    var ret = {
        isFulfilled: false,
        isRejected: false,
        fulfillmentValue: undefined,
        rejectionReason: undefined
    };
    if (this.isFulfilled()) {
        ret.fulfillmentValue = this.value();
        ret.isFulfilled = true;
    } else if (this.isRejected()) {
        ret.rejectionReason = this.reason();
        ret.isRejected = true;
    }
    return ret;
};

Promise.prototype.all = function () {
    if (arguments.length > 0) {
        this._warn(".all() was passed arguments but it does not take any");
    }
    return new PromiseArray(this).promise();
};

Promise.prototype.error = function (fn) {
    return this.caught(util.originatesFromRejection, fn);
};

Promise.getNewLibraryCopy = module.exports;

Promise.is = function (val) {
    return val instanceof Promise;
};

Promise.fromNode = Promise.fromCallback = function(fn) {
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    var multiArgs = arguments.length > 1 ? !!Object(arguments[1]).multiArgs
                                         : false;
    var result = tryCatch(fn)(nodebackForPromise(ret, multiArgs));
    if (result === errorObj) {
        ret._rejectCallback(result.e, true);
    }
    if (!ret._isFateSealed()) ret._setAsyncGuaranteed();
    return ret;
};

Promise.all = function (promises) {
    return new PromiseArray(promises).promise();
};

Promise.cast = function (obj) {
    var ret = tryConvertToPromise(obj);
    if (!(ret instanceof Promise)) {
        ret = new Promise(INTERNAL);
        ret._captureStackTrace();
        ret._setFulfilled();
        ret._rejectionHandler0 = obj;
    }
    return ret;
};

Promise.resolve = Promise.fulfilled = Promise.cast;

Promise.reject = Promise.rejected = function (reason) {
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    ret._rejectCallback(reason, true);
    return ret;
};

Promise.setScheduler = function(fn) {
    if (typeof fn !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(fn));
    }
    return async.setScheduler(fn);
};

Promise.prototype._then = function (
    didFulfill,
    didReject,
    _,    receiver,
    internalData
) {
    var haveInternalData = internalData !== undefined;
    var promise = haveInternalData ? internalData : new Promise(INTERNAL);
    var target = this._target();
    var bitField = target._bitField;

    if (!haveInternalData) {
        promise._propagateFrom(this, 3);
        promise._captureStackTrace();
        if (receiver === undefined &&
            ((this._bitField & 2097152) !== 0)) {
            if (!((bitField & 50397184) === 0)) {
                receiver = this._boundValue();
            } else {
                receiver = target === this ? undefined : this._boundTo;
            }
        }
        this._fireEvent("promiseChained", this, promise);
    }

    var context = getContext();
    if (!((bitField & 50397184) === 0)) {
        var handler, value, settler = target._settlePromiseCtx;
        if (((bitField & 33554432) !== 0)) {
            value = target._rejectionHandler0;
            handler = didFulfill;
        } else if (((bitField & 16777216) !== 0)) {
            value = target._fulfillmentHandler0;
            handler = didReject;
            target._unsetRejectionIsUnhandled();
        } else {
            settler = target._settlePromiseLateCancellationObserver;
            value = new CancellationError("late cancellation observer");
            target._attachExtraTrace(value);
            handler = didReject;
        }

        async.invoke(settler, target, {
            handler: util.contextBind(context, handler),
            promise: promise,
            receiver: receiver,
            value: value
        });
    } else {
        target._addCallbacks(didFulfill, didReject, promise,
                receiver, context);
    }

    return promise;
};

Promise.prototype._length = function () {
    return this._bitField & 65535;
};

Promise.prototype._isFateSealed = function () {
    return (this._bitField & 117506048) !== 0;
};

Promise.prototype._isFollowing = function () {
    return (this._bitField & 67108864) === 67108864;
};

Promise.prototype._setLength = function (len) {
    this._bitField = (this._bitField & -65536) |
        (len & 65535);
};

Promise.prototype._setFulfilled = function () {
    this._bitField = this._bitField | 33554432;
    this._fireEvent("promiseFulfilled", this);
};

Promise.prototype._setRejected = function () {
    this._bitField = this._bitField | 16777216;
    this._fireEvent("promiseRejected", this);
};

Promise.prototype._setFollowing = function () {
    this._bitField = this._bitField | 67108864;
    this._fireEvent("promiseResolved", this);
};

Promise.prototype._setIsFinal = function () {
    this._bitField = this._bitField | 4194304;
};

Promise.prototype._isFinal = function () {
    return (this._bitField & 4194304) > 0;
};

Promise.prototype._unsetCancelled = function() {
    this._bitField = this._bitField & (~65536);
};

Promise.prototype._setCancelled = function() {
    this._bitField = this._bitField | 65536;
    this._fireEvent("promiseCancelled", this);
};

Promise.prototype._setWillBeCancelled = function() {
    this._bitField = this._bitField | 8388608;
};

Promise.prototype._setAsyncGuaranteed = function() {
    if (async.hasCustomScheduler()) return;
    var bitField = this._bitField;
    this._bitField = bitField |
        (((bitField & 536870912) >> 2) ^
        134217728);
};

Promise.prototype._setNoAsyncGuarantee = function() {
    this._bitField = (this._bitField | 536870912) &
        (~134217728);
};

Promise.prototype._receiverAt = function (index) {
    var ret = index === 0 ? this._receiver0 : this[
            index * 4 - 4 + 3];
    if (ret === UNDEFINED_BINDING) {
        return undefined;
    } else if (ret === undefined && this._isBound()) {
        return this._boundValue();
    }
    return ret;
};

Promise.prototype._promiseAt = function (index) {
    return this[
            index * 4 - 4 + 2];
};

Promise.prototype._fulfillmentHandlerAt = function (index) {
    return this[
            index * 4 - 4 + 0];
};

Promise.prototype._rejectionHandlerAt = function (index) {
    return this[
            index * 4 - 4 + 1];
};

Promise.prototype._boundValue = function() {};

Promise.prototype._migrateCallback0 = function (follower) {
    var bitField = follower._bitField;
    var fulfill = follower._fulfillmentHandler0;
    var reject = follower._rejectionHandler0;
    var promise = follower._promise0;
    var receiver = follower._receiverAt(0);
    if (receiver === undefined) receiver = UNDEFINED_BINDING;
    this._addCallbacks(fulfill, reject, promise, receiver, null);
};

Promise.prototype._migrateCallbackAt = function (follower, index) {
    var fulfill = follower._fulfillmentHandlerAt(index);
    var reject = follower._rejectionHandlerAt(index);
    var promise = follower._promiseAt(index);
    var receiver = follower._receiverAt(index);
    if (receiver === undefined) receiver = UNDEFINED_BINDING;
    this._addCallbacks(fulfill, reject, promise, receiver, null);
};

Promise.prototype._addCallbacks = function (
    fulfill,
    reject,
    promise,
    receiver,
    context
) {
    var index = this._length();

    if (index >= 65535 - 4) {
        index = 0;
        this._setLength(0);
    }

    if (index === 0) {
        this._promise0 = promise;
        this._receiver0 = receiver;
        if (typeof fulfill === "function") {
            this._fulfillmentHandler0 = util.contextBind(context, fulfill);
        }
        if (typeof reject === "function") {
            this._rejectionHandler0 = util.contextBind(context, reject);
        }
    } else {
        var base = index * 4 - 4;
        this[base + 2] = promise;
        this[base + 3] = receiver;
        if (typeof fulfill === "function") {
            this[base + 0] =
                util.contextBind(context, fulfill);
        }
        if (typeof reject === "function") {
            this[base + 1] =
                util.contextBind(context, reject);
        }
    }
    this._setLength(index + 1);
    return index;
};

Promise.prototype._proxy = function (proxyable, arg) {
    this._addCallbacks(undefined, undefined, arg, proxyable, null);
};

Promise.prototype._resolveCallback = function(value, shouldBind) {
    if (((this._bitField & 117506048) !== 0)) return;
    if (value === this)
        return this._rejectCallback(makeSelfResolutionError(), false);
    var maybePromise = tryConvertToPromise(value, this);
    if (!(maybePromise instanceof Promise)) return this._fulfill(value);

    if (shouldBind) this._propagateFrom(maybePromise, 2);


    var promise = maybePromise._target();

    if (promise === this) {
        this._reject(makeSelfResolutionError());
        return;
    }

    var bitField = promise._bitField;
    if (((bitField & 50397184) === 0)) {
        var len = this._length();
        if (len > 0) promise._migrateCallback0(this);
        for (var i = 1; i < len; ++i) {
            promise._migrateCallbackAt(this, i);
        }
        this._setFollowing();
        this._setLength(0);
        this._setFollowee(maybePromise);
    } else if (((bitField & 33554432) !== 0)) {
        this._fulfill(promise._value());
    } else if (((bitField & 16777216) !== 0)) {
        this._reject(promise._reason());
    } else {
        var reason = new CancellationError("late cancellation observer");
        promise._attachExtraTrace(reason);
        this._reject(reason);
    }
};

Promise.prototype._rejectCallback =
function(reason, synchronous, ignoreNonErrorWarnings) {
    var trace = util.ensureErrorObject(reason);
    var hasStack = trace === reason;
    if (!hasStack && !ignoreNonErrorWarnings && debug.warnings()) {
        var message = "a promise was rejected with a non-error: " +
            util.classString(reason);
        this._warn(message, true);
    }
    this._attachExtraTrace(trace, synchronous ? hasStack : false);
    this._reject(reason);
};

Promise.prototype._resolveFromExecutor = function (executor) {
    if (executor === INTERNAL) return;
    var promise = this;
    this._captureStackTrace();
    this._pushContext();
    var synchronous = true;
    var r = this._execute(executor, function(value) {
        promise._resolveCallback(value);
    }, function (reason) {
        promise._rejectCallback(reason, synchronous);
    });
    synchronous = false;
    this._popContext();

    if (r !== undefined) {
        promise._rejectCallback(r, true);
    }
};

Promise.prototype._settlePromiseFromHandler = function (
    handler, receiver, value, promise
) {
    var bitField = promise._bitField;
    if (((bitField & 65536) !== 0)) return;
    promise._pushContext();
    var x;
    if (receiver === APPLY) {
        if (!value || typeof value.length !== "number") {
            x = errorObj;
            x.e = new TypeError("cannot .spread() a non-array: " +
                                    util.classString(value));
        } else {
            x = tryCatch(handler).apply(this._boundValue(), value);
        }
    } else {
        x = tryCatch(handler).call(receiver, value);
    }
    var promiseCreated = promise._popContext();
    bitField = promise._bitField;
    if (((bitField & 65536) !== 0)) return;

    if (x === NEXT_FILTER) {
        promise._reject(value);
    } else if (x === errorObj) {
        promise._rejectCallback(x.e, false);
    } else {
        debug.checkForgottenReturns(x, promiseCreated, "",  promise, this);
        promise._resolveCallback(x);
    }
};

Promise.prototype._target = function() {
    var ret = this;
    while (ret._isFollowing()) ret = ret._followee();
    return ret;
};

Promise.prototype._followee = function() {
    return this._rejectionHandler0;
};

Promise.prototype._setFollowee = function(promise) {
    this._rejectionHandler0 = promise;
};

Promise.prototype._settlePromise = function(promise, handler, receiver, value) {
    var isPromise = promise instanceof Promise;
    var bitField = this._bitField;
    var asyncGuaranteed = ((bitField & 134217728) !== 0);
    if (((bitField & 65536) !== 0)) {
        if (isPromise) promise._invokeInternalOnCancel();

        if (receiver instanceof PassThroughHandlerContext &&
            receiver.isFinallyHandler()) {
            receiver.cancelPromise = promise;
            if (tryCatch(handler).call(receiver, value) === errorObj) {
                promise._reject(errorObj.e);
            }
        } else if (handler === reflectHandler) {
            promise._fulfill(reflectHandler.call(receiver));
        } else if (receiver instanceof Proxyable) {
            receiver._promiseCancelled(promise);
        } else if (isPromise || promise instanceof PromiseArray) {
            promise._cancel();
        } else {
            receiver.cancel();
        }
    } else if (typeof handler === "function") {
        if (!isPromise) {
            handler.call(receiver, value, promise);
        } else {
            if (asyncGuaranteed) promise._setAsyncGuaranteed();
            this._settlePromiseFromHandler(handler, receiver, value, promise);
        }
    } else if (receiver instanceof Proxyable) {
        if (!receiver._isResolved()) {
            if (((bitField & 33554432) !== 0)) {
                receiver._promiseFulfilled(value, promise);
            } else {
                receiver._promiseRejected(value, promise);
            }
        }
    } else if (isPromise) {
        if (asyncGuaranteed) promise._setAsyncGuaranteed();
        if (((bitField & 33554432) !== 0)) {
            promise._fulfill(value);
        } else {
            promise._reject(value);
        }
    }
};

Promise.prototype._settlePromiseLateCancellationObserver = function(ctx) {
    var handler = ctx.handler;
    var promise = ctx.promise;
    var receiver = ctx.receiver;
    var value = ctx.value;
    if (typeof handler === "function") {
        if (!(promise instanceof Promise)) {
            handler.call(receiver, value, promise);
        } else {
            this._settlePromiseFromHandler(handler, receiver, value, promise);
        }
    } else if (promise instanceof Promise) {
        promise._reject(value);
    }
};

Promise.prototype._settlePromiseCtx = function(ctx) {
    this._settlePromise(ctx.promise, ctx.handler, ctx.receiver, ctx.value);
};

Promise.prototype._settlePromise0 = function(handler, value, bitField) {
    var promise = this._promise0;
    var receiver = this._receiverAt(0);
    this._promise0 = undefined;
    this._receiver0 = undefined;
    this._settlePromise(promise, handler, receiver, value);
};

Promise.prototype._clearCallbackDataAtIndex = function(index) {
    var base = index * 4 - 4;
    this[base + 2] =
    this[base + 3] =
    this[base + 0] =
    this[base + 1] = undefined;
};

Promise.prototype._fulfill = function (value) {
    var bitField = this._bitField;
    if (((bitField & 117506048) >>> 16)) return;
    if (value === this) {
        var err = makeSelfResolutionError();
        this._attachExtraTrace(err);
        return this._reject(err);
    }
    this._setFulfilled();
    this._rejectionHandler0 = value;

    if ((bitField & 65535) > 0) {
        if (((bitField & 134217728) !== 0)) {
            this._settlePromises();
        } else {
            async.settlePromises(this);
        }
        this._dereferenceTrace();
    }
};

Promise.prototype._reject = function (reason) {
    var bitField = this._bitField;
    if (((bitField & 117506048) >>> 16)) return;
    this._setRejected();
    this._fulfillmentHandler0 = reason;

    if (this._isFinal()) {
        return async.fatalError(reason, util.isNode);
    }

    if ((bitField & 65535) > 0) {
        async.settlePromises(this);
    } else {
        this._ensurePossibleRejectionHandled();
    }
};

Promise.prototype._fulfillPromises = function (len, value) {
    for (var i = 1; i < len; i++) {
        var handler = this._fulfillmentHandlerAt(i);
        var promise = this._promiseAt(i);
        var receiver = this._receiverAt(i);
        this._clearCallbackDataAtIndex(i);
        this._settlePromise(promise, handler, receiver, value);
    }
};

Promise.prototype._rejectPromises = function (len, reason) {
    for (var i = 1; i < len; i++) {
        var handler = this._rejectionHandlerAt(i);
        var promise = this._promiseAt(i);
        var receiver = this._receiverAt(i);
        this._clearCallbackDataAtIndex(i);
        this._settlePromise(promise, handler, receiver, reason);
    }
};

Promise.prototype._settlePromises = function () {
    var bitField = this._bitField;
    var len = (bitField & 65535);

    if (len > 0) {
        if (((bitField & 16842752) !== 0)) {
            var reason = this._fulfillmentHandler0;
            this._settlePromise0(this._rejectionHandler0, reason, bitField);
            this._rejectPromises(len, reason);
        } else {
            var value = this._rejectionHandler0;
            this._settlePromise0(this._fulfillmentHandler0, value, bitField);
            this._fulfillPromises(len, value);
        }
        this._setLength(0);
    }
    this._clearCancellationData();
};

Promise.prototype._settledValue = function() {
    var bitField = this._bitField;
    if (((bitField & 33554432) !== 0)) {
        return this._rejectionHandler0;
    } else if (((bitField & 16777216) !== 0)) {
        return this._fulfillmentHandler0;
    }
};

if (typeof Symbol !== "undefined" && Symbol.toStringTag) {
    es5.defineProperty(Promise.prototype, Symbol.toStringTag, {
        get: function () {
            return "Object";
        }
    });
}

function deferResolve(v) {this.promise._resolveCallback(v);}
function deferReject(v) {this.promise._rejectCallback(v, false);}

Promise.defer = Promise.pending = function() {
    debug.deprecated("Promise.defer", "new Promise");
    var promise = new Promise(INTERNAL);
    return {
        promise: promise,
        resolve: deferResolve,
        reject: deferReject
    };
};

util.notEnumerableProp(Promise,
                       "_makeSelfResolutionError",
                       makeSelfResolutionError);

require("./method")(Promise, INTERNAL, tryConvertToPromise, apiRejection,
    debug);
require("./bind")(Promise, INTERNAL, tryConvertToPromise, debug);
require("./cancel")(Promise, PromiseArray, apiRejection, debug);
require("./direct_resolve")(Promise);
require("./synchronous_inspection")(Promise);
require("./join")(
    Promise, PromiseArray, tryConvertToPromise, INTERNAL, async);
Promise.Promise = Promise;
Promise.version = "3.7.2";
require('./call_get.js')(Promise);
require('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise, Proxyable, debug);
require('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);
require('./nodeify.js')(Promise);
require('./promisify.js')(Promise, INTERNAL);
require('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection);
require('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection);
require('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);
require('./settle.js')(Promise, PromiseArray, debug);
require('./some.js')(Promise, PromiseArray, apiRejection);
require('./timers.js')(Promise, INTERNAL, debug);
require('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext, INTERNAL, debug);
require('./any.js')(Promise);
require('./each.js')(Promise, INTERNAL);
require('./filter.js')(Promise, INTERNAL);
                                                         
    util.toFastProperties(Promise);                                          
    util.toFastProperties(Promise.prototype);                                
    function fillTypes(value) {                                              
        var p = new Promise(INTERNAL);                                       
        p._fulfillmentHandler0 = value;                                      
        p._rejectionHandler0 = value;                                        
        p._promise0 = value;                                                 
        p._receiver0 = value;                                                
    }                                                                        
    // Complete slack tracking, opt out of field-type tracking and           
    // stabilize map                                                         
    fillTypes({a: 1});                                                       
    fillTypes({b: 2});                                                       
    fillTypes({c: 3});                                                       
    fillTypes(1);                                                            
    fillTypes(function(){});                                                 
    fillTypes(undefined);                                                    
    fillTypes(false);                                                        
    fillTypes(new Promise(INTERNAL));                                        
    debug.setBounds(Async.firstLineError, util.lastLineError);               
    return Promise;                                                          

};
"use strict";
module.exports = function(Promise, INTERNAL, tryConvertToPromise,
    apiRejection, Proxyable) {
var util = require("./util");
var isArray = util.isArray;

function toResolutionValue(val) {
    switch(val) {
    case -2: return [];
    case -3: return {};
    case -6: return new Map();
    }
}

function PromiseArray(values) {
    var promise = this._promise = new Promise(INTERNAL);
    if (values instanceof Promise) {
        promise._propagateFrom(values, 3);
        values.suppressUnhandledRejections();
    }
    promise._setOnCancel(this);
    this._values = values;
    this._length = 0;
    this._totalResolved = 0;
    this._init(undefined, -2);
}
util.inherits(PromiseArray, Proxyable);

PromiseArray.prototype.length = function () {
    return this._length;
};

PromiseArray.prototype.promise = function () {
    return this._promise;
};

PromiseArray.prototype._init = function init(_, resolveValueIfEmpty) {
    var values = tryConvertToPromise(this._values, this._promise);
    if (values instanceof Promise) {
        values = values._target();
        var bitField = values._bitField;
        ;
        this._values = values;

        if (((bitField & 50397184) === 0)) {
            this._promise._setAsyncGuaranteed();
            return values._then(
                init,
                this._reject,
                undefined,
                this,
                resolveValueIfEmpty
           );
        } else if (((bitField & 33554432) !== 0)) {
            values = values._value();
        } else if (((bitField & 16777216) !== 0)) {
            return this._reject(values._reason());
        } else {
            return this._cancel();
        }
    }
    values = util.asArray(values);
    if (values === null) {
        var err = apiRejection(
            "expecting an array or an iterable object but got " + util.classString(values)).reason();
        this._promise._rejectCallback(err, false);
        return;
    }

    if (values.length === 0) {
        if (resolveValueIfEmpty === -5) {
            this._resolveEmptyArray();
        }
        else {
            this._resolve(toResolutionValue(resolveValueIfEmpty));
        }
        return;
    }
    this._iterate(values);
};

PromiseArray.prototype._iterate = function(values) {
    var len = this.getActualLength(values.length);
    this._length = len;
    this._values = this.shouldCopyValues() ? new Array(len) : this._values;
    var result = this._promise;
    var isResolved = false;
    var bitField = null;
    for (var i = 0; i < len; ++i) {
        var maybePromise = tryConvertToPromise(values[i], result);

        if (maybePromise instanceof Promise) {
            maybePromise = maybePromise._target();
            bitField = maybePromise._bitField;
        } else {
            bitField = null;
        }

        if (isResolved) {
            if (bitField !== null) {
                maybePromise.suppressUnhandledRejections();
            }
        } else if (bitField !== null) {
            if (((bitField & 50397184) === 0)) {
                maybePromise._proxy(this, i);
                this._values[i] = maybePromise;
            } else if (((bitField & 33554432) !== 0)) {
                isResolved = this._promiseFulfilled(maybePromise._value(), i);
            } else if (((bitField & 16777216) !== 0)) {
                isResolved = this._promiseRejected(maybePromise._reason(), i);
            } else {
                isResolved = this._promiseCancelled(i);
            }
        } else {
            isResolved = this._promiseFulfilled(maybePromise, i);
        }
    }
    if (!isResolved) result._setAsyncGuaranteed();
};

PromiseArray.prototype._isResolved = function () {
    return this._values === null;
};

PromiseArray.prototype._resolve = function (value) {
    this._values = null;
    this._promise._fulfill(value);
};

PromiseArray.prototype._cancel = function() {
    if (this._isResolved() || !this._promise._isCancellable()) return;
    this._values = null;
    this._promise._cancel();
};

PromiseArray.prototype._reject = function (reason) {
    this._values = null;
    this._promise._rejectCallback(reason, false);
};

PromiseArray.prototype._promiseFulfilled = function (value, index) {
    this._values[index] = value;
    var totalResolved = ++this._totalResolved;
    if (totalResolved >= this._length) {
        this._resolve(this._values);
        return true;
    }
    return false;
};

PromiseArray.prototype._promiseCancelled = function() {
    this._cancel();
    return true;
};

PromiseArray.prototype._promiseRejected = function (reason) {
    this._totalResolved++;
    this._reject(reason);
    return true;
};

PromiseArray.prototype._resultCancelled = function() {
    if (this._isResolved()) return;
    var values = this._values;
    this._cancel();
    if (values instanceof Promise) {
        values.cancel();
    } else {
        for (var i = 0; i < values.length; ++i) {
            if (values[i] instanceof Promise) {
                values[i].cancel();
            }
        }
    }
};

PromiseArray.prototype.shouldCopyValues = function () {
    return true;
};

PromiseArray.prototype.getActualLength = function (len) {
    return len;
};

return PromiseArray;
};
"use strict";
module.exports = function(Promise, INTERNAL) {
var THIS = {};
var util = require("./util");
var nodebackForPromise = require("./nodeback");
var withAppended = util.withAppended;
var maybeWrapAsError = util.maybeWrapAsError;
var canEvaluate = util.canEvaluate;
var TypeError = require("./errors").TypeError;
var defaultSuffix = "Async";
var defaultPromisified = {__isPromisified__: true};
var noCopyProps = [
    "arity",    "length",
    "name",
    "arguments",
    "caller",
    "callee",
    "prototype",
    "__isPromisified__"
];
var noCopyPropsPattern = new RegExp("^(?:" + noCopyProps.join("|") + ")$");

var defaultFilter = function(name) {
    return util.isIdentifier(name) &&
        name.charAt(0) !== "_" &&
        name !== "constructor";
};

function propsFilter(key) {
    return !noCopyPropsPattern.test(key);
}

function isPromisified(fn) {
    try {
        return fn.__isPromisified__ === true;
    }
    catch (e) {
        return false;
    }
}

function hasPromisified(obj, key, suffix) {
    var val = util.getDataPropertyOrDefault(obj, key + suffix,
                                            defaultPromisified);
    return val ? isPromisified(val) : false;
}
function checkValid(ret, suffix, suffixRegexp) {
    for (var i = 0; i < ret.length; i += 2) {
        var key = ret[i];
        if (suffixRegexp.test(key)) {
            var keyWithoutAsyncSuffix = key.replace(suffixRegexp, "");
            for (var j = 0; j < ret.length; j += 2) {
                if (ret[j] === keyWithoutAsyncSuffix) {
                    throw new TypeError("Cannot promisify an API that has normal methods with '%s'-suffix\u000a\u000a    See http://goo.gl/MqrFmX\u000a"
                        .replace("%s", suffix));
                }
            }
        }
    }
}

function promisifiableMethods(obj, suffix, suffixRegexp, filter) {
    var keys = util.inheritedDataKeys(obj);
    var ret = [];
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        var value = obj[key];
        var passesDefaultFilter = filter === defaultFilter
            ? true : defaultFilter(key, value, obj);
        if (typeof value === "function" &&
            !isPromisified(value) &&
            !hasPromisified(obj, key, suffix) &&
            filter(key, value, obj, passesDefaultFilter)) {
            ret.push(key, value);
        }
    }
    checkValid(ret, suffix, suffixRegexp);
    return ret;
}

var escapeIdentRegex = function(str) {
    return str.replace(/([$])/, "\\$");
};

var makeNodePromisifiedEval;
if (!false) {
var switchCaseArgumentOrder = function(likelyArgumentCount) {
    var ret = [likelyArgumentCount];
    var min = Math.max(0, likelyArgumentCount - 1 - 3);
    for(var i = likelyArgumentCount - 1; i >= min; --i) {
        ret.push(i);
    }
    for(var i = likelyArgumentCount + 1; i <= 3; ++i) {
        ret.push(i);
    }
    return ret;
};

var argumentSequence = function(argumentCount) {
    return util.filledRange(argumentCount, "_arg", "");
};

var parameterDeclaration = function(parameterCount) {
    return util.filledRange(
        Math.max(parameterCount, 3), "_arg", "");
};

var parameterCount = function(fn) {
    if (typeof fn.length === "number") {
        return Math.max(Math.min(fn.length, 1023 + 1), 0);
    }
    return 0;
};

makeNodePromisifiedEval =
function(callback, receiver, originalName, fn, _, multiArgs) {
    var newParameterCount = Math.max(0, parameterCount(fn) - 1);
    var argumentOrder = switchCaseArgumentOrder(newParameterCount);
    var shouldProxyThis = typeof callback === "string" || receiver === THIS;

    function generateCallForArgumentCount(count) {
        var args = argumentSequence(count).join(", ");
        var comma = count > 0 ? ", " : "";
        var ret;
        if (shouldProxyThis) {
            ret = "ret = callback.call(this, {{args}}, nodeback); break;\n";
        } else {
            ret = receiver === undefined
                ? "ret = callback({{args}}, nodeback); break;\n"
                : "ret = callback.call(receiver, {{args}}, nodeback); break;\n";
        }
        return ret.replace("{{args}}", args).replace(", ", comma);
    }

    function generateArgumentSwitchCase() {
        var ret = "";
        for (var i = 0; i < argumentOrder.length; ++i) {
            ret += "case " + argumentOrder[i] +":" +
                generateCallForArgumentCount(argumentOrder[i]);
        }

        ret += "                                                             \n\
        default:                                                             \n\
            var args = new Array(len + 1);                                   \n\
            var i = 0;                                                       \n\
            for (var i = 0; i < len; ++i) {                                  \n\
               args[i] = arguments[i];                                       \n\
            }                                                                \n\
            args[i] = nodeback;                                              \n\
            [CodeForCall]                                                    \n\
            break;                                                           \n\
        ".replace("[CodeForCall]", (shouldProxyThis
                                ? "ret = callback.apply(this, args);\n"
                                : "ret = callback.apply(receiver, args);\n"));
        return ret;
    }

    var getFunctionCode = typeof callback === "string"
                                ? ("this != null ? this['"+callback+"'] : fn")
                                : "fn";
    var body = "'use strict';                                                \n\
        var ret = function (Parameters) {                                    \n\
            'use strict';                                                    \n\
            var len = arguments.length;                                      \n\
            var promise = new Promise(INTERNAL);                             \n\
            promise._captureStackTrace();                                    \n\
            var nodeback = nodebackForPromise(promise, " + multiArgs + ");   \n\
            var ret;                                                         \n\
            var callback = tryCatch([GetFunctionCode]);                      \n\
            switch(len) {                                                    \n\
                [CodeForSwitchCase]                                          \n\
            }                                                                \n\
            if (ret === errorObj) {                                          \n\
                promise._rejectCallback(maybeWrapAsError(ret.e), true, true);\n\
            }                                                                \n\
            if (!promise._isFateSealed()) promise._setAsyncGuaranteed();     \n\
            return promise;                                                  \n\
        };                                                                   \n\
        notEnumerableProp(ret, '__isPromisified__', true);                   \n\
        return ret;                                                          \n\
    ".replace("[CodeForSwitchCase]", generateArgumentSwitchCase())
        .replace("[GetFunctionCode]", getFunctionCode);
    body = body.replace("Parameters", parameterDeclaration(newParameterCount));
    return new Function("Promise",
                        "fn",
                        "receiver",
                        "withAppended",
                        "maybeWrapAsError",
                        "nodebackForPromise",
                        "tryCatch",
                        "errorObj",
                        "notEnumerableProp",
                        "INTERNAL",
                        body)(
                    Promise,
                    fn,
                    receiver,
                    withAppended,
                    maybeWrapAsError,
                    nodebackForPromise,
                    util.tryCatch,
                    util.errorObj,
                    util.notEnumerableProp,
                    INTERNAL);
};
}

function makeNodePromisifiedClosure(callback, receiver, _, fn, __, multiArgs) {
    var defaultThis = (function() {return this;})();
    var method = callback;
    if (typeof method === "string") {
        callback = fn;
    }
    function promisified() {
        var _receiver = receiver;
        if (receiver === THIS) _receiver = this;
        var promise = new Promise(INTERNAL);
        promise._captureStackTrace();
        var cb = typeof method === "string" && this !== defaultThis
            ? this[method] : callback;
        var fn = nodebackForPromise(promise, multiArgs);
        try {
            cb.apply(_receiver, withAppended(arguments, fn));
        } catch(e) {
            promise._rejectCallback(maybeWrapAsError(e), true, true);
        }
        if (!promise._isFateSealed()) promise._setAsyncGuaranteed();
        return promise;
    }
    util.notEnumerableProp(promisified, "__isPromisified__", true);
    return promisified;
}

var makeNodePromisified = canEvaluate
    ? makeNodePromisifiedEval
    : makeNodePromisifiedClosure;

function promisifyAll(obj, suffix, filter, promisifier, multiArgs) {
    var suffixRegexp = new RegExp(escapeIdentRegex(suffix) + "$");
    var methods =
        promisifiableMethods(obj, suffix, suffixRegexp, filter);

    for (var i = 0, len = methods.length; i < len; i+= 2) {
        var key = methods[i];
        var fn = methods[i+1];
        var promisifiedKey = key + suffix;
        if (promisifier === makeNodePromisified) {
            obj[promisifiedKey] =
                makeNodePromisified(key, THIS, key, fn, suffix, multiArgs);
        } else {
            var promisified = promisifier(fn, function() {
                return makeNodePromisified(key, THIS, key,
                                           fn, suffix, multiArgs);
            });
            util.notEnumerableProp(promisified, "__isPromisified__", true);
            obj[promisifiedKey] = promisified;
        }
    }
    util.toFastProperties(obj);
    return obj;
}

function promisify(callback, receiver, multiArgs) {
    return makeNodePromisified(callback, receiver, undefined,
                                callback, null, multiArgs);
}

Promise.promisify = function (fn, options) {
    if (typeof fn !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(fn));
    }
    if (isPromisified(fn)) {
        return fn;
    }
    options = Object(options);
    var receiver = options.context === undefined ? THIS : options.context;
    var multiArgs = !!options.multiArgs;
    var ret = promisify(fn, receiver, multiArgs);
    util.copyDescriptors(fn, ret, propsFilter);
    return ret;
};

Promise.promisifyAll = function (target, options) {
    if (typeof target !== "function" && typeof target !== "object") {
        throw new TypeError("the target of promisifyAll must be an object or a function\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    options = Object(options);
    var multiArgs = !!options.multiArgs;
    var suffix = options.suffix;
    if (typeof suffix !== "string") suffix = defaultSuffix;
    var filter = options.filter;
    if (typeof filter !== "function") filter = defaultFilter;
    var promisifier = options.promisifier;
    if (typeof promisifier !== "function") promisifier = makeNodePromisified;

    if (!util.isIdentifier(suffix)) {
        throw new RangeError("suffix must be a valid identifier\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }

    var keys = util.inheritedDataKeys(target);
    for (var i = 0; i < keys.length; ++i) {
        var value = target[keys[i]];
        if (keys[i] !== "constructor" &&
            util.isClass(value)) {
            promisifyAll(value.prototype, suffix, filter, promisifier,
                multiArgs);
            promisifyAll(value, suffix, filter, promisifier, multiArgs);
        }
    }

    return promisifyAll(target, suffix, filter, promisifier, multiArgs);
};
};

"use strict";
module.exports = function(
    Promise, PromiseArray, tryConvertToPromise, apiRejection) {
var util = require("./util");
var isObject = util.isObject;
var es5 = require("./es5");
var Es6Map;
if (typeof Map === "function") Es6Map = Map;

var mapToEntries = (function() {
    var index = 0;
    var size = 0;

    function extractEntry(value, key) {
        this[index] = value;
        this[index + size] = key;
        index++;
    }

    return function mapToEntries(map) {
        size = map.size;
        index = 0;
        var ret = new Array(map.size * 2);
        map.forEach(extractEntry, ret);
        return ret;
    };
})();

var entriesToMap = function(entries) {
    var ret = new Es6Map();
    var length = entries.length / 2 | 0;
    for (var i = 0; i < length; ++i) {
        var key = entries[length + i];
        var value = entries[i];
        ret.set(key, value);
    }
    return ret;
};

function PropertiesPromiseArray(obj) {
    var isMap = false;
    var entries;
    if (Es6Map !== undefined && obj instanceof Es6Map) {
        entries = mapToEntries(obj);
        isMap = true;
    } else {
        var keys = es5.keys(obj);
        var len = keys.length;
        entries = new Array(len * 2);
        for (var i = 0; i < len; ++i) {
            var key = keys[i];
            entries[i] = obj[key];
            entries[i + len] = key;
        }
    }
    this.constructor$(entries);
    this._isMap = isMap;
    this._init$(undefined, isMap ? -6 : -3);
}
util.inherits(PropertiesPromiseArray, PromiseArray);

PropertiesPromiseArray.prototype._init = function () {};

PropertiesPromiseArray.prototype._promiseFulfilled = function (value, index) {
    this._values[index] = value;
    var totalResolved = ++this._totalResolved;
    if (totalResolved >= this._length) {
        var val;
        if (this._isMap) {
            val = entriesToMap(this._values);
        } else {
            val = {};
            var keyOffset = this.length();
            for (var i = 0, len = this.length(); i < len; ++i) {
                val[this._values[i + keyOffset]] = this._values[i];
            }
        }
        this._resolve(val);
        return true;
    }
    return false;
};

PropertiesPromiseArray.prototype.shouldCopyValues = function () {
    return false;
};

PropertiesPromiseArray.prototype.getActualLength = function (len) {
    return len >> 1;
};

function props(promises) {
    var ret;
    var castValue = tryConvertToPromise(promises);

    if (!isObject(castValue)) {
        return apiRejection("cannot await properties of a non-object\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    } else if (castValue instanceof Promise) {
        ret = castValue._then(
            Promise.props, undefined, undefined, undefined, undefined);
    } else {
        ret = new PropertiesPromiseArray(castValue).promise();
    }

    if (castValue instanceof Promise) {
        ret._propagateFrom(castValue, 2);
    }
    return ret;
}

Promise.prototype.props = function () {
    return props(this);
};

Promise.props = function (promises) {
    return props(promises);
};
};
"use strict";
function arrayMove(src, srcIndex, dst, dstIndex, len) {
    for (var j = 0; j < len; ++j) {
        dst[j + dstIndex] = src[j + srcIndex];
        src[j + srcIndex] = void 0;
    }
}

function Queue(capacity) {
    this._capacity = capacity;
    this._length = 0;
    this._front = 0;
}

Queue.prototype._willBeOverCapacity = function (size) {
    return this._capacity < size;
};

Queue.prototype._pushOne = function (arg) {
    var length = this.length();
    this._checkCapacity(length + 1);
    var i = (this._front + length) & (this._capacity - 1);
    this[i] = arg;
    this._length = length + 1;
};

Queue.prototype.push = function (fn, receiver, arg) {
    var length = this.length() + 3;
    if (this._willBeOverCapacity(length)) {
        this._pushOne(fn);
        this._pushOne(receiver);
        this._pushOne(arg);
        return;
    }
    var j = this._front + length - 3;
    this._checkCapacity(length);
    var wrapMask = this._capacity - 1;
    this[(j + 0) & wrapMask] = fn;
    this[(j + 1) & wrapMask] = receiver;
    this[(j + 2) & wrapMask] = arg;
    this._length = length;
};

Queue.prototype.shift = function () {
    var front = this._front,
        ret = this[front];

    this[front] = undefined;
    this._front = (front + 1) & (this._capacity - 1);
    this._length--;
    return ret;
};

Queue.prototype.length = function () {
    return this._length;
};

Queue.prototype._checkCapacity = function (size) {
    if (this._capacity < size) {
        this._resizeTo(this._capacity << 1);
    }
};

Queue.prototype._resizeTo = function (capacity) {
    var oldCapacity = this._capacity;
    this._capacity = capacity;
    var front = this._front;
    var length = this._length;
    var moveItemsCount = (front + length) & (oldCapacity - 1);
    arrayMove(this, 0, this, oldCapacity, moveItemsCount);
};

module.exports = Queue;
"use strict";
module.exports = function(
    Promise, INTERNAL, tryConvertToPromise, apiRejection) {
var util = require("./util");

var raceLater = function (promise) {
    return promise.then(function(array) {
        return race(array, promise);
    });
};

function race(promises, parent) {
    var maybePromise = tryConvertToPromise(promises);

    if (maybePromise instanceof Promise) {
        return raceLater(maybePromise);
    } else {
        promises = util.asArray(promises);
        if (promises === null)
            return apiRejection("expecting an array or an iterable object but got " + util.classString(promises));
    }

    var ret = new Promise(INTERNAL);
    if (parent !== undefined) {
        ret._propagateFrom(parent, 3);
    }
    var fulfill = ret._fulfill;
    var reject = ret._reject;
    for (var i = 0, len = promises.length; i < len; ++i) {
        var val = promises[i];

        if (val === undefined && !(i in promises)) {
            continue;
        }

        Promise.cast(val)._then(fulfill, reject, undefined, ret, null);
    }
    return ret;
}

Promise.race = function (promises) {
    return race(promises, undefined);
};

Promise.prototype.race = function () {
    return race(this, undefined);
};

};
"use strict";
module.exports = function(Promise,
                          PromiseArray,
                          apiRejection,
                          tryConvertToPromise,
                          INTERNAL,
                          debug) {
var util = require("./util");
var tryCatch = util.tryCatch;

function ReductionPromiseArray(promises, fn, initialValue, _each) {
    this.constructor$(promises);
    var context = Promise._getContext();
    this._fn = util.contextBind(context, fn);
    if (initialValue !== undefined) {
        initialValue = Promise.resolve(initialValue);
        initialValue._attachCancellationCallback(this);
    }
    this._initialValue = initialValue;
    this._currentCancellable = null;
    if(_each === INTERNAL) {
        this._eachValues = Array(this._length);
    } else if (_each === 0) {
        this._eachValues = null;
    } else {
        this._eachValues = undefined;
    }
    this._promise._captureStackTrace();
    this._init$(undefined, -5);
}
util.inherits(ReductionPromiseArray, PromiseArray);

ReductionPromiseArray.prototype._gotAccum = function(accum) {
    if (this._eachValues !== undefined &&
        this._eachValues !== null &&
        accum !== INTERNAL) {
        this._eachValues.push(accum);
    }
};

ReductionPromiseArray.prototype._eachComplete = function(value) {
    if (this._eachValues !== null) {
        this._eachValues.push(value);
    }
    return this._eachValues;
};

ReductionPromiseArray.prototype._init = function() {};

ReductionPromiseArray.prototype._resolveEmptyArray = function() {
    this._resolve(this._eachValues !== undefined ? this._eachValues
                                                 : this._initialValue);
};

ReductionPromiseArray.prototype.shouldCopyValues = function () {
    return false;
};

ReductionPromiseArray.prototype._resolve = function(value) {
    this._promise._resolveCallback(value);
    this._values = null;
};

ReductionPromiseArray.prototype._resultCancelled = function(sender) {
    if (sender === this._initialValue) return this._cancel();
    if (this._isResolved()) return;
    this._resultCancelled$();
    if (this._currentCancellable instanceof Promise) {
        this._currentCancellable.cancel();
    }
    if (this._initialValue instanceof Promise) {
        this._initialValue.cancel();
    }
};

ReductionPromiseArray.prototype._iterate = function (values) {
    this._values = values;
    var value;
    var i;
    var length = values.length;
    if (this._initialValue !== undefined) {
        value = this._initialValue;
        i = 0;
    } else {
        value = Promise.resolve(values[0]);
        i = 1;
    }

    this._currentCancellable = value;

    for (var j = i; j < length; ++j) {
        var maybePromise = values[j];
        if (maybePromise instanceof Promise) {
            maybePromise.suppressUnhandledRejections();
        }
    }

    if (!value.isRejected()) {
        for (; i < length; ++i) {
            var ctx = {
                accum: null,
                value: values[i],
                index: i,
                length: length,
                array: this
            };

            value = value._then(gotAccum, undefined, undefined, ctx, undefined);

            if ((i & 127) === 0) {
                value._setNoAsyncGuarantee();
            }
        }
    }

    if (this._eachValues !== undefined) {
        value = value
            ._then(this._eachComplete, undefined, undefined, this, undefined);
    }
    value._then(completed, completed, undefined, value, this);
};

Promise.prototype.reduce = function (fn, initialValue) {
    return reduce(this, fn, initialValue, null);
};

Promise.reduce = function (promises, fn, initialValue, _each) {
    return reduce(promises, fn, initialValue, _each);
};

function completed(valueOrReason, array) {
    if (this.isFulfilled()) {
        array._resolve(valueOrReason);
    } else {
        array._reject(valueOrReason);
    }
}

function reduce(promises, fn, initialValue, _each) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }
    var array = new ReductionPromiseArray(promises, fn, initialValue, _each);
    return array.promise();
}

function gotAccum(accum) {
    this.accum = accum;
    this.array._gotAccum(accum);
    var value = tryConvertToPromise(this.value, this.array._promise);
    if (value instanceof Promise) {
        this.array._currentCancellable = value;
        return value._then(gotValue, undefined, undefined, this, undefined);
    } else {
        return gotValue.call(this, value);
    }
}

function gotValue(value) {
    var array = this.array;
    var promise = array._promise;
    var fn = tryCatch(array._fn);
    promise._pushContext();
    var ret;
    if (array._eachValues !== undefined) {
        ret = fn.call(promise._boundValue(), value, this.index, this.length);
    } else {
        ret = fn.call(promise._boundValue(),
                              this.accum, value, this.index, this.length);
    }
    if (ret instanceof Promise) {
        array._currentCancellable = ret;
    }
    var promiseCreated = promise._popContext();
    debug.checkForgottenReturns(
        ret,
        promiseCreated,
        array._eachValues !== undefined ? "Promise.each" : "Promise.reduce",
        promise
    );
    return ret;
}
};
"use strict";
var util = require("./util");
var schedule;
var noAsyncScheduler = function() {
    throw new Error("No async scheduler available\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
};
var NativePromise = util.getNativePromise();
if (util.isNode && typeof MutationObserver === "undefined") {
    var GlobalSetImmediate = global.setImmediate;
    var ProcessNextTick = process.nextTick;
    schedule = util.isRecentNode
                ? function(fn) { GlobalSetImmediate.call(global, fn); }
                : function(fn) { ProcessNextTick.call(process, fn); };
} else if (typeof NativePromise === "function" &&
           typeof NativePromise.resolve === "function") {
    var nativePromise = NativePromise.resolve();
    schedule = function(fn) {
        nativePromise.then(fn);
    };
} else if ((typeof MutationObserver !== "undefined") &&
          !(typeof window !== "undefined" &&
            window.navigator &&
            (window.navigator.standalone || window.cordova)) &&
          ("classList" in document.documentElement)) {
    schedule = (function() {
        var div = document.createElement("div");
        var opts = {attributes: true};
        var toggleScheduled = false;
        var div2 = document.createElement("div");
        var o2 = new MutationObserver(function() {
            div.classList.toggle("foo");
            toggleScheduled = false;
        });
        o2.observe(div2, opts);

        var scheduleToggle = function() {
            if (toggleScheduled) return;
            toggleScheduled = true;
            div2.classList.toggle("foo");
        };

        return function schedule(fn) {
            var o = new MutationObserver(function() {
                o.disconnect();
                fn();
            });
            o.observe(div, opts);
            scheduleToggle();
        };
    })();
} else if (typeof setImmediate !== "undefined") {
    schedule = function (fn) {
        setImmediate(fn);
    };
} else if (typeof setTimeout !== "undefined") {
    schedule = function (fn) {
        setTimeout(fn, 0);
    };
} else {
    schedule = noAsyncScheduler;
}
module.exports = schedule;
"use strict";
module.exports =
    function(Promise, PromiseArray, debug) {
var PromiseInspection = Promise.PromiseInspection;
var util = require("./util");

function SettledPromiseArray(values) {
    this.constructor$(values);
}
util.inherits(SettledPromiseArray, PromiseArray);

SettledPromiseArray.prototype._promiseResolved = function (index, inspection) {
    this._values[index] = inspection;
    var totalResolved = ++this._totalResolved;
    if (totalResolved >= this._length) {
        this._resolve(this._values);
        return true;
    }
    return false;
};

SettledPromiseArray.prototype._promiseFulfilled = function (value, index) {
    var ret = new PromiseInspection();
    ret._bitField = 33554432;
    ret._settledValueField = value;
    return this._promiseResolved(index, ret);
};
SettledPromiseArray.prototype._promiseRejected = function (reason, index) {
    var ret = new PromiseInspection();
    ret._bitField = 16777216;
    ret._settledValueField = reason;
    return this._promiseResolved(index, ret);
};

Promise.settle = function (promises) {
    debug.deprecated(".settle()", ".reflect()");
    return new SettledPromiseArray(promises).promise();
};

Promise.allSettled = function (promises) {
    return new SettledPromiseArray(promises).promise();
};

Promise.prototype.settle = function () {
    return Promise.settle(this);
};
};
"use strict";
module.exports =
function(Promise, PromiseArray, apiRejection) {
var util = require("./util");
var RangeError = require("./errors").RangeError;
var AggregateError = require("./errors").AggregateError;
var isArray = util.isArray;
var CANCELLATION = {};


function SomePromiseArray(values) {
    this.constructor$(values);
    this._howMany = 0;
    this._unwrap = false;
    this._initialized = false;
}
util.inherits(SomePromiseArray, PromiseArray);

SomePromiseArray.prototype._init = function () {
    if (!this._initialized) {
        return;
    }
    if (this._howMany === 0) {
        this._resolve([]);
        return;
    }
    this._init$(undefined, -5);
    var isArrayResolved = isArray(this._values);
    if (!this._isResolved() &&
        isArrayResolved &&
        this._howMany > this._canPossiblyFulfill()) {
        this._reject(this._getRangeError(this.length()));
    }
};

SomePromiseArray.prototype.init = function () {
    this._initialized = true;
    this._init();
};

SomePromiseArray.prototype.setUnwrap = function () {
    this._unwrap = true;
};

SomePromiseArray.prototype.howMany = function () {
    return this._howMany;
};

SomePromiseArray.prototype.setHowMany = function (count) {
    this._howMany = count;
};

SomePromiseArray.prototype._promiseFulfilled = function (value) {
    this._addFulfilled(value);
    if (this._fulfilled() === this.howMany()) {
        this._values.length = this.howMany();
        if (this.howMany() === 1 && this._unwrap) {
            this._resolve(this._values[0]);
        } else {
            this._resolve(this._values);
        }
        return true;
    }
    return false;

};
SomePromiseArray.prototype._promiseRejected = function (reason) {
    this._addRejected(reason);
    return this._checkOutcome();
};

SomePromiseArray.prototype._promiseCancelled = function () {
    if (this._values instanceof Promise || this._values == null) {
        return this._cancel();
    }
    this._addRejected(CANCELLATION);
    return this._checkOutcome();
};

SomePromiseArray.prototype._checkOutcome = function() {
    if (this.howMany() > this._canPossiblyFulfill()) {
        var e = new AggregateError();
        for (var i = this.length(); i < this._values.length; ++i) {
            if (this._values[i] !== CANCELLATION) {
                e.push(this._values[i]);
            }
        }
        if (e.length > 0) {
            this._reject(e);
        } else {
            this._cancel();
        }
        return true;
    }
    return false;
};

SomePromiseArray.prototype._fulfilled = function () {
    return this._totalResolved;
};

SomePromiseArray.prototype._rejected = function () {
    return this._values.length - this.length();
};

SomePromiseArray.prototype._addRejected = function (reason) {
    this._values.push(reason);
};

SomePromiseArray.prototype._addFulfilled = function (value) {
    this._values[this._totalResolved++] = value;
};

SomePromiseArray.prototype._canPossiblyFulfill = function () {
    return this.length() - this._rejected();
};

SomePromiseArray.prototype._getRangeError = function (count) {
    var message = "Input array must contain at least " +
            this._howMany + " items but contains only " + count + " items";
    return new RangeError(message);
};

SomePromiseArray.prototype._resolveEmptyArray = function () {
    this._reject(this._getRangeError(0));
};

function some(promises, howMany) {
    if ((howMany | 0) !== howMany || howMany < 0) {
        return apiRejection("expecting a positive integer\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    var ret = new SomePromiseArray(promises);
    var promise = ret.promise();
    ret.setHowMany(howMany);
    ret.init();
    return promise;
}

Promise.some = function (promises, howMany) {
    return some(promises, howMany);
};

Promise.prototype.some = function (howMany) {
    return some(this, howMany);
};

Promise._SomePromiseArray = SomePromiseArray;
};
"use strict";
module.exports = function(Promise) {
function PromiseInspection(promise) {
    if (promise !== undefined) {
        promise = promise._target();
        this._bitField = promise._bitField;
        this._settledValueField = promise._isFateSealed()
            ? promise._settledValue() : undefined;
    }
    else {
        this._bitField = 0;
        this._settledValueField = undefined;
    }
}

PromiseInspection.prototype._settledValue = function() {
    return this._settledValueField;
};

var value = PromiseInspection.prototype.value = function () {
    if (!this.isFulfilled()) {
        throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    return this._settledValue();
};

var reason = PromiseInspection.prototype.error =
PromiseInspection.prototype.reason = function () {
    if (!this.isRejected()) {
        throw new TypeError("cannot get rejection reason of a non-rejected promise\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    return this._settledValue();
};

var isFulfilled = PromiseInspection.prototype.isFulfilled = function() {
    return (this._bitField & 33554432) !== 0;
};

var isRejected = PromiseInspection.prototype.isRejected = function () {
    return (this._bitField & 16777216) !== 0;
};

var isPending = PromiseInspection.prototype.isPending = function () {
    return (this._bitField & 50397184) === 0;
};

var isResolved = PromiseInspection.prototype.isResolved = function () {
    return (this._bitField & 50331648) !== 0;
};

PromiseInspection.prototype.isCancelled = function() {
    return (this._bitField & 8454144) !== 0;
};

Promise.prototype.__isCancelled = function() {
    return (this._bitField & 65536) === 65536;
};

Promise.prototype._isCancelled = function() {
    return this._target().__isCancelled();
};

Promise.prototype.isCancelled = function() {
    return (this._target()._bitField & 8454144) !== 0;
};

Promise.prototype.isPending = function() {
    return isPending.call(this._target());
};

Promise.prototype.isRejected = function() {
    return isRejected.call(this._target());
};

Promise.prototype.isFulfilled = function() {
    return isFulfilled.call(this._target());
};

Promise.prototype.isResolved = function() {
    return isResolved.call(this._target());
};

Promise.prototype.value = function() {
    return value.call(this._target());
};

Promise.prototype.reason = function() {
    var target = this._target();
    target._unsetRejectionIsUnhandled();
    return reason.call(target);
};

Promise.prototype._value = function() {
    return this._settledValue();
};

Promise.prototype._reason = function() {
    this._unsetRejectionIsUnhandled();
    return this._settledValue();
};

Promise.PromiseInspection = PromiseInspection;
};
"use strict";
module.exports = function(Promise, INTERNAL) {
var util = require("./util");
var errorObj = util.errorObj;
var isObject = util.isObject;

function tryConvertToPromise(obj, context) {
    if (isObject(obj)) {
        if (obj instanceof Promise) return obj;
        var then = getThen(obj);
        if (then === errorObj) {
            if (context) context._pushContext();
            var ret = Promise.reject(then.e);
            if (context) context._popContext();
            return ret;
        } else if (typeof then === "function") {
            if (isAnyBluebirdPromise(obj)) {
                var ret = new Promise(INTERNAL);
                obj._then(
                    ret._fulfill,
                    ret._reject,
                    undefined,
                    ret,
                    null
                );
                return ret;
            }
            return doThenable(obj, then, context);
        }
    }
    return obj;
}

function doGetThen(obj) {
    return obj.then;
}

function getThen(obj) {
    try {
        return doGetThen(obj);
    } catch (e) {
        errorObj.e = e;
        return errorObj;
    }
}

var hasProp = {}.hasOwnProperty;
function isAnyBluebirdPromise(obj) {
    try {
        return hasProp.call(obj, "_promise0");
    } catch (e) {
        return false;
    }
}

function doThenable(x, then, context) {
    var promise = new Promise(INTERNAL);
    var ret = promise;
    if (context) context._pushContext();
    promise._captureStackTrace();
    if (context) context._popContext();
    var synchronous = true;
    var result = util.tryCatch(then).call(x, resolve, reject);
    synchronous = false;

    if (promise && result === errorObj) {
        promise._rejectCallback(result.e, true, true);
        promise = null;
    }

    function resolve(value) {
        if (!promise) return;
        promise._resolveCallback(value);
        promise = null;
    }

    function reject(reason) {
        if (!promise) return;
        promise._rejectCallback(reason, synchronous, true);
        promise = null;
    }
    return ret;
}

return tryConvertToPromise;
};
"use strict";
module.exports = function(Promise, INTERNAL, debug) {
var util = require("./util");
var TimeoutError = Promise.TimeoutError;

function HandleWrapper(handle)  {
    this.handle = handle;
}

HandleWrapper.prototype._resultCancelled = function() {
    clearTimeout(this.handle);
};

var afterValue = function(value) { return delay(+this).thenReturn(value); };
var delay = Promise.delay = function (ms, value) {
    var ret;
    var handle;
    if (value !== undefined) {
        ret = Promise.resolve(value)
                ._then(afterValue, null, null, ms, undefined);
        if (debug.cancellation() && value instanceof Promise) {
            ret._setOnCancel(value);
        }
    } else {
        ret = new Promise(INTERNAL);
        handle = setTimeout(function() { ret._fulfill(); }, +ms);
        if (debug.cancellation()) {
            ret._setOnCancel(new HandleWrapper(handle));
        }
        ret._captureStackTrace();
    }
    ret._setAsyncGuaranteed();
    return ret;
};

Promise.prototype.delay = function (ms) {
    return delay(ms, this);
};

var afterTimeout = function (promise, message, parent) {
    var err;
    if (typeof message !== "string") {
        if (message instanceof Error) {
            err = message;
        } else {
            err = new TimeoutError("operation timed out");
        }
    } else {
        err = new TimeoutError(message);
    }
    util.markAsOriginatingFromRejection(err);
    promise._attachExtraTrace(err);
    promise._reject(err);

    if (parent != null) {
        parent.cancel();
    }
};

function successClear(value) {
    clearTimeout(this.handle);
    return value;
}

function failureClear(reason) {
    clearTimeout(this.handle);
    throw reason;
}

Promise.prototype.timeout = function (ms, message) {
    ms = +ms;
    var ret, parent;

    var handleWrapper = new HandleWrapper(setTimeout(function timeoutTimeout() {
        if (ret.isPending()) {
            afterTimeout(ret, message, parent);
        }
    }, ms));

    if (debug.cancellation()) {
        parent = this.then();
        ret = parent._then(successClear, failureClear,
                            undefined, handleWrapper, undefined);
        ret._setOnCancel(handleWrapper);
    } else {
        ret = this._then(successClear, failureClear,
                            undefined, handleWrapper, undefined);
    }

    return ret;
};

};
"use strict";
module.exports = function (Promise, apiRejection, tryConvertToPromise,
    createContext, INTERNAL, debug) {
    var util = require("./util");
    var TypeError = require("./errors").TypeError;
    var inherits = require("./util").inherits;
    var errorObj = util.errorObj;
    var tryCatch = util.tryCatch;
    var NULL = {};

    function thrower(e) {
        setTimeout(function(){throw e;}, 0);
    }

    function castPreservingDisposable(thenable) {
        var maybePromise = tryConvertToPromise(thenable);
        if (maybePromise !== thenable &&
            typeof thenable._isDisposable === "function" &&
            typeof thenable._getDisposer === "function" &&
            thenable._isDisposable()) {
            maybePromise._setDisposable(thenable._getDisposer());
        }
        return maybePromise;
    }
    function dispose(resources, inspection) {
        var i = 0;
        var len = resources.length;
        var ret = new Promise(INTERNAL);
        function iterator() {
            if (i >= len) return ret._fulfill();
            var maybePromise = castPreservingDisposable(resources[i++]);
            if (maybePromise instanceof Promise &&
                maybePromise._isDisposable()) {
                try {
                    maybePromise = tryConvertToPromise(
                        maybePromise._getDisposer().tryDispose(inspection),
                        resources.promise);
                } catch (e) {
                    return thrower(e);
                }
                if (maybePromise instanceof Promise) {
                    return maybePromise._then(iterator, thrower,
                                              null, null, null);
                }
            }
            iterator();
        }
        iterator();
        return ret;
    }

    function Disposer(data, promise, context) {
        this._data = data;
        this._promise = promise;
        this._context = context;
    }

    Disposer.prototype.data = function () {
        return this._data;
    };

    Disposer.prototype.promise = function () {
        return this._promise;
    };

    Disposer.prototype.resource = function () {
        if (this.promise().isFulfilled()) {
            return this.promise().value();
        }
        return NULL;
    };

    Disposer.prototype.tryDispose = function(inspection) {
        var resource = this.resource();
        var context = this._context;
        if (context !== undefined) context._pushContext();
        var ret = resource !== NULL
            ? this.doDispose(resource, inspection) : null;
        if (context !== undefined) context._popContext();
        this._promise._unsetDisposable();
        this._data = null;
        return ret;
    };

    Disposer.isDisposer = function (d) {
        return (d != null &&
                typeof d.resource === "function" &&
                typeof d.tryDispose === "function");
    };

    function FunctionDisposer(fn, promise, context) {
        this.constructor$(fn, promise, context);
    }
    inherits(FunctionDisposer, Disposer);

    FunctionDisposer.prototype.doDispose = function (resource, inspection) {
        var fn = this.data();
        return fn.call(resource, resource, inspection);
    };

    function maybeUnwrapDisposer(value) {
        if (Disposer.isDisposer(value)) {
            this.resources[this.index]._setDisposable(value);
            return value.promise();
        }
        return value;
    }

    function ResourceList(length) {
        this.length = length;
        this.promise = null;
        this[length-1] = null;
    }

    ResourceList.prototype._resultCancelled = function() {
        var len = this.length;
        for (var i = 0; i < len; ++i) {
            var item = this[i];
            if (item instanceof Promise) {
                item.cancel();
            }
        }
    };

    Promise.using = function () {
        var len = arguments.length;
        if (len < 2) return apiRejection(
                        "you must pass at least 2 arguments to Promise.using");
        var fn = arguments[len - 1];
        if (typeof fn !== "function") {
            return apiRejection("expecting a function but got " + util.classString(fn));
        }
        var input;
        var spreadArgs = true;
        if (len === 2 && Array.isArray(arguments[0])) {
            input = arguments[0];
            len = input.length;
            spreadArgs = false;
        } else {
            input = arguments;
            len--;
        }
        var resources = new ResourceList(len);
        for (var i = 0; i < len; ++i) {
            var resource = input[i];
            if (Disposer.isDisposer(resource)) {
                var disposer = resource;
                resource = resource.promise();
                resource._setDisposable(disposer);
            } else {
                var maybePromise = tryConvertToPromise(resource);
                if (maybePromise instanceof Promise) {
                    resource =
                        maybePromise._then(maybeUnwrapDisposer, null, null, {
                            resources: resources,
                            index: i
                    }, undefined);
                }
            }
            resources[i] = resource;
        }

        var reflectedResources = new Array(resources.length);
        for (var i = 0; i < reflectedResources.length; ++i) {
            reflectedResources[i] = Promise.resolve(resources[i]).reflect();
        }

        var resultPromise = Promise.all(reflectedResources)
            .then(function(inspections) {
                for (var i = 0; i < inspections.length; ++i) {
                    var inspection = inspections[i];
                    if (inspection.isRejected()) {
                        errorObj.e = inspection.error();
                        return errorObj;
                    } else if (!inspection.isFulfilled()) {
                        resultPromise.cancel();
                        return;
                    }
                    inspections[i] = inspection.value();
                }
                promise._pushContext();

                fn = tryCatch(fn);
                var ret = spreadArgs
                    ? fn.apply(undefined, inspections) : fn(inspections);
                var promiseCreated = promise._popContext();
                debug.checkForgottenReturns(
                    ret, promiseCreated, "Promise.using", promise);
                return ret;
            });

        var promise = resultPromise.lastly(function() {
            var inspection = new Promise.PromiseInspection(resultPromise);
            return dispose(resources, inspection);
        });
        resources.promise = promise;
        promise._setOnCancel(resources);
        return promise;
    };

    Promise.prototype._setDisposable = function (disposer) {
        this._bitField = this._bitField | 131072;
        this._disposer = disposer;
    };

    Promise.prototype._isDisposable = function () {
        return (this._bitField & 131072) > 0;
    };

    Promise.prototype._getDisposer = function () {
        return this._disposer;
    };

    Promise.prototype._unsetDisposable = function () {
        this._bitField = this._bitField & (~131072);
        this._disposer = undefined;
    };

    Promise.prototype.disposer = function (fn) {
        if (typeof fn === "function") {
            return new FunctionDisposer(fn, this, createContext());
        }
        throw new TypeError();
    };

};
"use strict";
var es5 = require("./es5");
var canEvaluate = typeof navigator == "undefined";

var errorObj = {e: {}};
var tryCatchTarget;
var globalObject = typeof self !== "undefined" ? self :
    typeof window !== "undefined" ? window :
    typeof global !== "undefined" ? global :
    this !== undefined ? this : null;

function tryCatcher() {
    try {
        var target = tryCatchTarget;
        tryCatchTarget = null;
        return target.apply(this, arguments);
    } catch (e) {
        errorObj.e = e;
        return errorObj;
    }
}
function tryCatch(fn) {
    tryCatchTarget = fn;
    return tryCatcher;
}

var inherits = function(Child, Parent) {
    var hasProp = {}.hasOwnProperty;

    function T() {
        this.constructor = Child;
        this.constructor$ = Parent;
        for (var propertyName in Parent.prototype) {
            if (hasProp.call(Parent.prototype, propertyName) &&
                propertyName.charAt(propertyName.length-1) !== "$"
           ) {
                this[propertyName + "$"] = Parent.prototype[propertyName];
            }
        }
    }
    T.prototype = Parent.prototype;
    Child.prototype = new T();
    return Child.prototype;
};


function isPrimitive(val) {
    return val == null || val === true || val === false ||
        typeof val === "string" || typeof val === "number";

}

function isObject(value) {
    return typeof value === "function" ||
           typeof value === "object" && value !== null;
}

function maybeWrapAsError(maybeError) {
    if (!isPrimitive(maybeError)) return maybeError;

    return new Error(safeToString(maybeError));
}

function withAppended(target, appendee) {
    var len = target.length;
    var ret = new Array(len + 1);
    var i;
    for (i = 0; i < len; ++i) {
        ret[i] = target[i];
    }
    ret[i] = appendee;
    return ret;
}

function getDataPropertyOrDefault(obj, key, defaultValue) {
    if (es5.isES5) {
        var desc = Object.getOwnPropertyDescriptor(obj, key);

        if (desc != null) {
            return desc.get == null && desc.set == null
                    ? desc.value
                    : defaultValue;
        }
    } else {
        return {}.hasOwnProperty.call(obj, key) ? obj[key] : undefined;
    }
}

function notEnumerableProp(obj, name, value) {
    if (isPrimitive(obj)) return obj;
    var descriptor = {
        value: value,
        configurable: true,
        enumerable: false,
        writable: true
    };
    es5.defineProperty(obj, name, descriptor);
    return obj;
}

function thrower(r) {
    throw r;
}

var inheritedDataKeys = (function() {
    var excludedPrototypes = [
        Array.prototype,
        Object.prototype,
        Function.prototype
    ];

    var isExcludedProto = function(val) {
        for (var i = 0; i < excludedPrototypes.length; ++i) {
            if (excludedPrototypes[i] === val) {
                return true;
            }
        }
        return false;
    };

    if (es5.isES5) {
        var getKeys = Object.getOwnPropertyNames;
        return function(obj) {
            var ret = [];
            var visitedKeys = Object.create(null);
            while (obj != null && !isExcludedProto(obj)) {
                var keys;
                try {
                    keys = getKeys(obj);
                } catch (e) {
                    return ret;
                }
                for (var i = 0; i < keys.length; ++i) {
                    var key = keys[i];
                    if (visitedKeys[key]) continue;
                    visitedKeys[key] = true;
                    var desc = Object.getOwnPropertyDescriptor(obj, key);
                    if (desc != null && desc.get == null && desc.set == null) {
                        ret.push(key);
                    }
                }
                obj = es5.getPrototypeOf(obj);
            }
            return ret;
        };
    } else {
        var hasProp = {}.hasOwnProperty;
        return function(obj) {
            if (isExcludedProto(obj)) return [];
            var ret = [];

            /*jshint forin:false */
            enumeration: for (var key in obj) {
                if (hasProp.call(obj, key)) {
                    ret.push(key);
                } else {
                    for (var i = 0; i < excludedPrototypes.length; ++i) {
                        if (hasProp.call(excludedPrototypes[i], key)) {
                            continue enumeration;
                        }
                    }
                    ret.push(key);
                }
            }
            return ret;
        };
    }

})();

var thisAssignmentPattern = /this\s*\.\s*\S+\s*=/;
function isClass(fn) {
    try {
        if (typeof fn === "function") {
            var keys = es5.names(fn.prototype);

            var hasMethods = es5.isES5 && keys.length > 1;
            var hasMethodsOtherThanConstructor = keys.length > 0 &&
                !(keys.length === 1 && keys[0] === "constructor");
            var hasThisAssignmentAndStaticMethods =
                thisAssignmentPattern.test(fn + "") && es5.names(fn).length > 0;

            if (hasMethods || hasMethodsOtherThanConstructor ||
                hasThisAssignmentAndStaticMethods) {
                return true;
            }
        }
        return false;
    } catch (e) {
        return false;
    }
}

function toFastProperties(obj) {
    /*jshint -W027,-W055,-W031*/
    function FakeConstructor() {}
    FakeConstructor.prototype = obj;
    var receiver = new FakeConstructor();
    function ic() {
        return typeof receiver.foo;
    }
    ic();
    ic();
    return obj;
    eval(obj);
}

var rident = /^[a-z$_][a-z$_0-9]*$/i;
function isIdentifier(str) {
    return rident.test(str);
}

function filledRange(count, prefix, suffix) {
    var ret = new Array(count);
    for(var i = 0; i < count; ++i) {
        ret[i] = prefix + i + suffix;
    }
    return ret;
}

function safeToString(obj) {
    try {
        return obj + "";
    } catch (e) {
        return "[no string representation]";
    }
}

function isError(obj) {
    return obj instanceof Error ||
        (obj !== null &&
           typeof obj === "object" &&
           typeof obj.message === "string" &&
           typeof obj.name === "string");
}

function markAsOriginatingFromRejection(e) {
    try {
        notEnumerableProp(e, "isOperational", true);
    }
    catch(ignore) {}
}

function originatesFromRejection(e) {
    if (e == null) return false;
    return ((e instanceof Error["__BluebirdErrorTypes__"].OperationalError) ||
        e["isOperational"] === true);
}

function canAttachTrace(obj) {
    return isError(obj) && es5.propertyIsWritable(obj, "stack");
}

var ensureErrorObject = (function() {
    if (!("stack" in new Error())) {
        return function(value) {
            if (canAttachTrace(value)) return value;
            try {throw new Error(safeToString(value));}
            catch(err) {return err;}
        };
    } else {
        return function(value) {
            if (canAttachTrace(value)) return value;
            return new Error(safeToString(value));
        };
    }
})();

function classString(obj) {
    return {}.toString.call(obj);
}

function copyDescriptors(from, to, filter) {
    var keys = es5.names(from);
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        if (filter(key)) {
            try {
                es5.defineProperty(to, key, es5.getDescriptor(from, key));
            } catch (ignore) {}
        }
    }
}

var asArray = function(v) {
    if (es5.isArray(v)) {
        return v;
    }
    return null;
};

if (typeof Symbol !== "undefined" && Symbol.iterator) {
    var ArrayFrom = typeof Array.from === "function" ? function(v) {
        return Array.from(v);
    } : function(v) {
        var ret = [];
        var it = v[Symbol.iterator]();
        var itResult;
        while (!((itResult = it.next()).done)) {
            ret.push(itResult.value);
        }
        return ret;
    };

    asArray = function(v) {
        if (es5.isArray(v)) {
            return v;
        } else if (v != null && typeof v[Symbol.iterator] === "function") {
            return ArrayFrom(v);
        }
        return null;
    };
}

var isNode = typeof process !== "undefined" &&
        classString(process).toLowerCase() === "[object process]";

var hasEnvVariables = typeof process !== "undefined" &&
    typeof process.env !== "undefined";

function env(key) {
    return hasEnvVariables ? process.env[key] : undefined;
}

function getNativePromise() {
    if (typeof Promise === "function") {
        try {
            var promise = new Promise(function(){});
            if (classString(promise) === "[object Promise]") {
                return Promise;
            }
        } catch (e) {}
    }
}

var reflectHandler;
function contextBind(ctx, cb) {
    if (ctx === null ||
        typeof cb !== "function" ||
        cb === reflectHandler) {
        return cb;
    }

    if (ctx.domain !== null) {
        cb = ctx.domain.bind(cb);
    }

    var async = ctx.async;
    if (async !== null) {
        var old = cb;
        cb = function() {
            var $_len = arguments.length + 2;var args = new Array($_len); for(var $_i = 2; $_i < $_len ; ++$_i) {args[$_i] = arguments[$_i  - 2];};
            args[0] = old;
            args[1] = this;
            return async.runInAsyncScope.apply(async, args);
        };
    }
    return cb;
}

var ret = {
    setReflectHandler: function(fn) {
        reflectHandler = fn;
    },
    isClass: isClass,
    isIdentifier: isIdentifier,
    inheritedDataKeys: inheritedDataKeys,
    getDataPropertyOrDefault: getDataPropertyOrDefault,
    thrower: thrower,
    isArray: es5.isArray,
    asArray: asArray,
    notEnumerableProp: notEnumerableProp,
    isPrimitive: isPrimitive,
    isObject: isObject,
    isError: isError,
    canEvaluate: canEvaluate,
    errorObj: errorObj,
    tryCatch: tryCatch,
    inherits: inherits,
    withAppended: withAppended,
    maybeWrapAsError: maybeWrapAsError,
    toFastProperties: toFastProperties,
    filledRange: filledRange,
    toString: safeToString,
    canAttachTrace: canAttachTrace,
    ensureErrorObject: ensureErrorObject,
    originatesFromRejection: originatesFromRejection,
    markAsOriginatingFromRejection: markAsOriginatingFromRejection,
    classString: classString,
    copyDescriptors: copyDescriptors,
    isNode: isNode,
    hasEnvVariables: hasEnvVariables,
    env: env,
    global: globalObject,
    getNativePromise: getNativePromise,
    contextBind: contextBind
};
ret.isRecentNode = ret.isNode && (function() {
    var version;
    if (process.versions && process.versions.node) {
        version = process.versions.node.split(".").map(Number);
    } else if (process.version) {
        version = process.version.split(".").map(Number);
    }
    return (version[0] === 0 && version[1] > 10) || (version[0] > 0);
})();
ret.nodeSupportsAsyncResource = ret.isNode && (function() {
    var supportsAsync = false;
    try {
        var res = require("async_hooks").AsyncResource;
        supportsAsync = typeof res.prototype.runInAsyncScope === "function";
    } catch (e) {
        supportsAsync = false;
    }
    return supportsAsync;
})();

if (ret.isNode) ret.toFastProperties(process);

try {throw new Error(); } catch (e) {ret.lastLineError = e;}
module.exports = ret;
/* @preserve
 * The MIT License (MIT)
 * 
 * Copyright (c) 2013-2018 Petka Antonov
 * 
 * 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.
 * 
 */
/**
 * bluebird build version 3.7.2
 * Features enabled: core
 * Features disabled: race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each
*/
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.Promise=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof _dereq_=="function"&&_dereq_;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof _dereq_=="function"&&_dereq_;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
"use strict";
var firstLineError;
try {throw new Error(); } catch (e) {firstLineError = e;}
var schedule = _dereq_("./schedule");
var Queue = _dereq_("./queue");

function Async() {
    this._customScheduler = false;
    this._isTickUsed = false;
    this._lateQueue = new Queue(16);
    this._normalQueue = new Queue(16);
    this._haveDrainedQueues = false;
    var self = this;
    this.drainQueues = function () {
        self._drainQueues();
    };
    this._schedule = schedule;
}

Async.prototype.setScheduler = function(fn) {
    var prev = this._schedule;
    this._schedule = fn;
    this._customScheduler = true;
    return prev;
};

Async.prototype.hasCustomScheduler = function() {
    return this._customScheduler;
};

Async.prototype.haveItemsQueued = function () {
    return this._isTickUsed || this._haveDrainedQueues;
};


Async.prototype.fatalError = function(e, isNode) {
    if (isNode) {
        process.stderr.write("Fatal " + (e instanceof Error ? e.stack : e) +
            "\n");
        process.exit(2);
    } else {
        this.throwLater(e);
    }
};

Async.prototype.throwLater = function(fn, arg) {
    if (arguments.length === 1) {
        arg = fn;
        fn = function () { throw arg; };
    }
    if (typeof setTimeout !== "undefined") {
        setTimeout(function() {
            fn(arg);
        }, 0);
    } else try {
        this._schedule(function() {
            fn(arg);
        });
    } catch (e) {
        throw new Error("No async scheduler available\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
};

function AsyncInvokeLater(fn, receiver, arg) {
    this._lateQueue.push(fn, receiver, arg);
    this._queueTick();
}

function AsyncInvoke(fn, receiver, arg) {
    this._normalQueue.push(fn, receiver, arg);
    this._queueTick();
}

function AsyncSettlePromises(promise) {
    this._normalQueue._pushOne(promise);
    this._queueTick();
}

Async.prototype.invokeLater = AsyncInvokeLater;
Async.prototype.invoke = AsyncInvoke;
Async.prototype.settlePromises = AsyncSettlePromises;


function _drainQueue(queue) {
    while (queue.length() > 0) {
        _drainQueueStep(queue);
    }
}

function _drainQueueStep(queue) {
    var fn = queue.shift();
    if (typeof fn !== "function") {
        fn._settlePromises();
    } else {
        var receiver = queue.shift();
        var arg = queue.shift();
        fn.call(receiver, arg);
    }
}

Async.prototype._drainQueues = function () {
    _drainQueue(this._normalQueue);
    this._reset();
    this._haveDrainedQueues = true;
    _drainQueue(this._lateQueue);
};

Async.prototype._queueTick = function () {
    if (!this._isTickUsed) {
        this._isTickUsed = true;
        this._schedule(this.drainQueues);
    }
};

Async.prototype._reset = function () {
    this._isTickUsed = false;
};

module.exports = Async;
module.exports.firstLineError = firstLineError;

},{"./queue":17,"./schedule":18}],2:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL, tryConvertToPromise, debug) {
var calledBind = false;
var rejectThis = function(_, e) {
    this._reject(e);
};

var targetRejected = function(e, context) {
    context.promiseRejectionQueued = true;
    context.bindingPromise._then(rejectThis, rejectThis, null, this, e);
};

var bindingResolved = function(thisArg, context) {
    if (((this._bitField & 50397184) === 0)) {
        this._resolveCallback(context.target);
    }
};

var bindingRejected = function(e, context) {
    if (!context.promiseRejectionQueued) this._reject(e);
};

Promise.prototype.bind = function (thisArg) {
    if (!calledBind) {
        calledBind = true;
        Promise.prototype._propagateFrom = debug.propagateFromFunction();
        Promise.prototype._boundValue = debug.boundValueFunction();
    }
    var maybePromise = tryConvertToPromise(thisArg);
    var ret = new Promise(INTERNAL);
    ret._propagateFrom(this, 1);
    var target = this._target();
    ret._setBoundTo(maybePromise);
    if (maybePromise instanceof Promise) {
        var context = {
            promiseRejectionQueued: false,
            promise: ret,
            target: target,
            bindingPromise: maybePromise
        };
        target._then(INTERNAL, targetRejected, undefined, ret, context);
        maybePromise._then(
            bindingResolved, bindingRejected, undefined, ret, context);
        ret._setOnCancel(maybePromise);
    } else {
        ret._resolveCallback(target);
    }
    return ret;
};

Promise.prototype._setBoundTo = function (obj) {
    if (obj !== undefined) {
        this._bitField = this._bitField | 2097152;
        this._boundTo = obj;
    } else {
        this._bitField = this._bitField & (~2097152);
    }
};

Promise.prototype._isBound = function () {
    return (this._bitField & 2097152) === 2097152;
};

Promise.bind = function (thisArg, value) {
    return Promise.resolve(value).bind(thisArg);
};
};

},{}],3:[function(_dereq_,module,exports){
"use strict";
var old;
if (typeof Promise !== "undefined") old = Promise;
function noConflict() {
    try { if (Promise === bluebird) Promise = old; }
    catch (e) {}
    return bluebird;
}
var bluebird = _dereq_("./promise")();
bluebird.noConflict = noConflict;
module.exports = bluebird;

},{"./promise":15}],4:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, PromiseArray, apiRejection, debug) {
var util = _dereq_("./util");
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;
var async = Promise._async;

Promise.prototype["break"] = Promise.prototype.cancel = function() {
    if (!debug.cancellation()) return this._warn("cancellation is disabled");

    var promise = this;
    var child = promise;
    while (promise._isCancellable()) {
        if (!promise._cancelBy(child)) {
            if (child._isFollowing()) {
                child._followee().cancel();
            } else {
                child._cancelBranched();
            }
            break;
        }

        var parent = promise._cancellationParent;
        if (parent == null || !parent._isCancellable()) {
            if (promise._isFollowing()) {
                promise._followee().cancel();
            } else {
                promise._cancelBranched();
            }
            break;
        } else {
            if (promise._isFollowing()) promise._followee().cancel();
            promise._setWillBeCancelled();
            child = promise;
            promise = parent;
        }
    }
};

Promise.prototype._branchHasCancelled = function() {
    this._branchesRemainingToCancel--;
};

Promise.prototype._enoughBranchesHaveCancelled = function() {
    return this._branchesRemainingToCancel === undefined ||
           this._branchesRemainingToCancel <= 0;
};

Promise.prototype._cancelBy = function(canceller) {
    if (canceller === this) {
        this._branchesRemainingToCancel = 0;
        this._invokeOnCancel();
        return true;
    } else {
        this._branchHasCancelled();
        if (this._enoughBranchesHaveCancelled()) {
            this._invokeOnCancel();
            return true;
        }
    }
    return false;
};

Promise.prototype._cancelBranched = function() {
    if (this._enoughBranchesHaveCancelled()) {
        this._cancel();
    }
};

Promise.prototype._cancel = function() {
    if (!this._isCancellable()) return;
    this._setCancelled();
    async.invoke(this._cancelPromises, this, undefined);
};

Promise.prototype._cancelPromises = function() {
    if (this._length() > 0) this._settlePromises();
};

Promise.prototype._unsetOnCancel = function() {
    this._onCancelField = undefined;
};

Promise.prototype._isCancellable = function() {
    return this.isPending() && !this._isCancelled();
};

Promise.prototype.isCancellable = function() {
    return this.isPending() && !this.isCancelled();
};

Promise.prototype._doInvokeOnCancel = function(onCancelCallback, internalOnly) {
    if (util.isArray(onCancelCallback)) {
        for (var i = 0; i < onCancelCallback.length; ++i) {
            this._doInvokeOnCancel(onCancelCallback[i], internalOnly);
        }
    } else if (onCancelCallback !== undefined) {
        if (typeof onCancelCallback === "function") {
            if (!internalOnly) {
                var e = tryCatch(onCancelCallback).call(this._boundValue());
                if (e === errorObj) {
                    this._attachExtraTrace(e.e);
                    async.throwLater(e.e);
                }
            }
        } else {
            onCancelCallback._resultCancelled(this);
        }
    }
};

Promise.prototype._invokeOnCancel = function() {
    var onCancelCallback = this._onCancel();
    this._unsetOnCancel();
    async.invoke(this._doInvokeOnCancel, this, onCancelCallback);
};

Promise.prototype._invokeInternalOnCancel = function() {
    if (this._isCancellable()) {
        this._doInvokeOnCancel(this._onCancel(), true);
        this._unsetOnCancel();
    }
};

Promise.prototype._resultCancelled = function() {
    this.cancel();
};

};

},{"./util":21}],5:[function(_dereq_,module,exports){
"use strict";
module.exports = function(NEXT_FILTER) {
var util = _dereq_("./util");
var getKeys = _dereq_("./es5").keys;
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;

function catchFilter(instances, cb, promise) {
    return function(e) {
        var boundTo = promise._boundValue();
        predicateLoop: for (var i = 0; i < instances.length; ++i) {
            var item = instances[i];

            if (item === Error ||
                (item != null && item.prototype instanceof Error)) {
                if (e instanceof item) {
                    return tryCatch(cb).call(boundTo, e);
                }
            } else if (typeof item === "function") {
                var matchesPredicate = tryCatch(item).call(boundTo, e);
                if (matchesPredicate === errorObj) {
                    return matchesPredicate;
                } else if (matchesPredicate) {
                    return tryCatch(cb).call(boundTo, e);
                }
            } else if (util.isObject(e)) {
                var keys = getKeys(item);
                for (var j = 0; j < keys.length; ++j) {
                    var key = keys[j];
                    if (item[key] != e[key]) {
                        continue predicateLoop;
                    }
                }
                return tryCatch(cb).call(boundTo, e);
            }
        }
        return NEXT_FILTER;
    };
}

return catchFilter;
};

},{"./es5":10,"./util":21}],6:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise) {
var longStackTraces = false;
var contextStack = [];

Promise.prototype._promiseCreated = function() {};
Promise.prototype._pushContext = function() {};
Promise.prototype._popContext = function() {return null;};
Promise._peekContext = Promise.prototype._peekContext = function() {};

function Context() {
    this._trace = new Context.CapturedTrace(peekContext());
}
Context.prototype._pushContext = function () {
    if (this._trace !== undefined) {
        this._trace._promiseCreated = null;
        contextStack.push(this._trace);
    }
};

Context.prototype._popContext = function () {
    if (this._trace !== undefined) {
        var trace = contextStack.pop();
        var ret = trace._promiseCreated;
        trace._promiseCreated = null;
        return ret;
    }
    return null;
};

function createContext() {
    if (longStackTraces) return new Context();
}

function peekContext() {
    var lastIndex = contextStack.length - 1;
    if (lastIndex >= 0) {
        return contextStack[lastIndex];
    }
    return undefined;
}
Context.CapturedTrace = null;
Context.create = createContext;
Context.deactivateLongStackTraces = function() {};
Context.activateLongStackTraces = function() {
    var Promise_pushContext = Promise.prototype._pushContext;
    var Promise_popContext = Promise.prototype._popContext;
    var Promise_PeekContext = Promise._peekContext;
    var Promise_peekContext = Promise.prototype._peekContext;
    var Promise_promiseCreated = Promise.prototype._promiseCreated;
    Context.deactivateLongStackTraces = function() {
        Promise.prototype._pushContext = Promise_pushContext;
        Promise.prototype._popContext = Promise_popContext;
        Promise._peekContext = Promise_PeekContext;
        Promise.prototype._peekContext = Promise_peekContext;
        Promise.prototype._promiseCreated = Promise_promiseCreated;
        longStackTraces = false;
    };
    longStackTraces = true;
    Promise.prototype._pushContext = Context.prototype._pushContext;
    Promise.prototype._popContext = Context.prototype._popContext;
    Promise._peekContext = Promise.prototype._peekContext = peekContext;
    Promise.prototype._promiseCreated = function() {
        var ctx = this._peekContext();
        if (ctx && ctx._promiseCreated == null) ctx._promiseCreated = this;
    };
};
return Context;
};

},{}],7:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, Context,
    enableAsyncHooks, disableAsyncHooks) {
var async = Promise._async;
var Warning = _dereq_("./errors").Warning;
var util = _dereq_("./util");
var es5 = _dereq_("./es5");
var canAttachTrace = util.canAttachTrace;
var unhandledRejectionHandled;
var possiblyUnhandledRejection;
var bluebirdFramePattern =
    /[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/;
var nodeFramePattern = /\((?:timers\.js):\d+:\d+\)/;
var parseLinePattern = /[\/<\(](.+?):(\d+):(\d+)\)?\s*$/;
var stackFramePattern = null;
var formatStack = null;
var indentStackFrames = false;
var printWarning;
var debugging = !!(util.env("BLUEBIRD_DEBUG") != 0 &&
                        (true ||
                         util.env("BLUEBIRD_DEBUG") ||
                         util.env("NODE_ENV") === "development"));

var warnings = !!(util.env("BLUEBIRD_WARNINGS") != 0 &&
    (debugging || util.env("BLUEBIRD_WARNINGS")));

var longStackTraces = !!(util.env("BLUEBIRD_LONG_STACK_TRACES") != 0 &&
    (debugging || util.env("BLUEBIRD_LONG_STACK_TRACES")));

var wForgottenReturn = util.env("BLUEBIRD_W_FORGOTTEN_RETURN") != 0 &&
    (warnings || !!util.env("BLUEBIRD_W_FORGOTTEN_RETURN"));

var deferUnhandledRejectionCheck;
(function() {
    var promises = [];

    function unhandledRejectionCheck() {
        for (var i = 0; i < promises.length; ++i) {
            promises[i]._notifyUnhandledRejection();
        }
        unhandledRejectionClear();
    }

    function unhandledRejectionClear() {
        promises.length = 0;
    }

    deferUnhandledRejectionCheck = function(promise) {
        promises.push(promise);
        setTimeout(unhandledRejectionCheck, 1);
    };

    es5.defineProperty(Promise, "_unhandledRejectionCheck", {
        value: unhandledRejectionCheck
    });
    es5.defineProperty(Promise, "_unhandledRejectionClear", {
        value: unhandledRejectionClear
    });
})();

Promise.prototype.suppressUnhandledRejections = function() {
    var target = this._target();
    target._bitField = ((target._bitField & (~1048576)) |
                      524288);
};

Promise.prototype._ensurePossibleRejectionHandled = function () {
    if ((this._bitField & 524288) !== 0) return;
    this._setRejectionIsUnhandled();
    deferUnhandledRejectionCheck(this);
};

Promise.prototype._notifyUnhandledRejectionIsHandled = function () {
    fireRejectionEvent("rejectionHandled",
                                  unhandledRejectionHandled, undefined, this);
};

Promise.prototype._setReturnedNonUndefined = function() {
    this._bitField = this._bitField | 268435456;
};

Promise.prototype._returnedNonUndefined = function() {
    return (this._bitField & 268435456) !== 0;
};

Promise.prototype._notifyUnhandledRejection = function () {
    if (this._isRejectionUnhandled()) {
        var reason = this._settledValue();
        this._setUnhandledRejectionIsNotified();
        fireRejectionEvent("unhandledRejection",
                                      possiblyUnhandledRejection, reason, this);
    }
};

Promise.prototype._setUnhandledRejectionIsNotified = function () {
    this._bitField = this._bitField | 262144;
};

Promise.prototype._unsetUnhandledRejectionIsNotified = function () {
    this._bitField = this._bitField & (~262144);
};

Promise.prototype._isUnhandledRejectionNotified = function () {
    return (this._bitField & 262144) > 0;
};

Promise.prototype._setRejectionIsUnhandled = function () {
    this._bitField = this._bitField | 1048576;
};

Promise.prototype._unsetRejectionIsUnhandled = function () {
    this._bitField = this._bitField & (~1048576);
    if (this._isUnhandledRejectionNotified()) {
        this._unsetUnhandledRejectionIsNotified();
        this._notifyUnhandledRejectionIsHandled();
    }
};

Promise.prototype._isRejectionUnhandled = function () {
    return (this._bitField & 1048576) > 0;
};

Promise.prototype._warn = function(message, shouldUseOwnTrace, promise) {
    return warn(message, shouldUseOwnTrace, promise || this);
};

Promise.onPossiblyUnhandledRejection = function (fn) {
    var context = Promise._getContext();
    possiblyUnhandledRejection = util.contextBind(context, fn);
};

Promise.onUnhandledRejectionHandled = function (fn) {
    var context = Promise._getContext();
    unhandledRejectionHandled = util.contextBind(context, fn);
};

var disableLongStackTraces = function() {};
Promise.longStackTraces = function () {
    if (async.haveItemsQueued() && !config.longStackTraces) {
        throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    if (!config.longStackTraces && longStackTracesIsSupported()) {
        var Promise_captureStackTrace = Promise.prototype._captureStackTrace;
        var Promise_attachExtraTrace = Promise.prototype._attachExtraTrace;
        var Promise_dereferenceTrace = Promise.prototype._dereferenceTrace;
        config.longStackTraces = true;
        disableLongStackTraces = function() {
            if (async.haveItemsQueued() && !config.longStackTraces) {
                throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
            }
            Promise.prototype._captureStackTrace = Promise_captureStackTrace;
            Promise.prototype._attachExtraTrace = Promise_attachExtraTrace;
            Promise.prototype._dereferenceTrace = Promise_dereferenceTrace;
            Context.deactivateLongStackTraces();
            config.longStackTraces = false;
        };
        Promise.prototype._captureStackTrace = longStackTracesCaptureStackTrace;
        Promise.prototype._attachExtraTrace = longStackTracesAttachExtraTrace;
        Promise.prototype._dereferenceTrace = longStackTracesDereferenceTrace;
        Context.activateLongStackTraces();
    }
};

Promise.hasLongStackTraces = function () {
    return config.longStackTraces && longStackTracesIsSupported();
};


var legacyHandlers = {
    unhandledrejection: {
        before: function() {
            var ret = util.global.onunhandledrejection;
            util.global.onunhandledrejection = null;
            return ret;
        },
        after: function(fn) {
            util.global.onunhandledrejection = fn;
        }
    },
    rejectionhandled: {
        before: function() {
            var ret = util.global.onrejectionhandled;
            util.global.onrejectionhandled = null;
            return ret;
        },
        after: function(fn) {
            util.global.onrejectionhandled = fn;
        }
    }
};

var fireDomEvent = (function() {
    var dispatch = function(legacy, e) {
        if (legacy) {
            var fn;
            try {
                fn = legacy.before();
                return !util.global.dispatchEvent(e);
            } finally {
                legacy.after(fn);
            }
        } else {
            return !util.global.dispatchEvent(e);
        }
    };
    try {
        if (typeof CustomEvent === "function") {
            var event = new CustomEvent("CustomEvent");
            util.global.dispatchEvent(event);
            return function(name, event) {
                name = name.toLowerCase();
                var eventData = {
                    detail: event,
                    cancelable: true
                };
                var domEvent = new CustomEvent(name, eventData);
                es5.defineProperty(
                    domEvent, "promise", {value: event.promise});
                es5.defineProperty(
                    domEvent, "reason", {value: event.reason});

                return dispatch(legacyHandlers[name], domEvent);
            };
        } else if (typeof Event === "function") {
            var event = new Event("CustomEvent");
            util.global.dispatchEvent(event);
            return function(name, event) {
                name = name.toLowerCase();
                var domEvent = new Event(name, {
                    cancelable: true
                });
                domEvent.detail = event;
                es5.defineProperty(domEvent, "promise", {value: event.promise});
                es5.defineProperty(domEvent, "reason", {value: event.reason});
                return dispatch(legacyHandlers[name], domEvent);
            };
        } else {
            var event = document.createEvent("CustomEvent");
            event.initCustomEvent("testingtheevent", false, true, {});
            util.global.dispatchEvent(event);
            return function(name, event) {
                name = name.toLowerCase();
                var domEvent = document.createEvent("CustomEvent");
                domEvent.initCustomEvent(name, false, true,
                    event);
                return dispatch(legacyHandlers[name], domEvent);
            };
        }
    } catch (e) {}
    return function() {
        return false;
    };
})();

var fireGlobalEvent = (function() {
    if (util.isNode) {
        return function() {
            return process.emit.apply(process, arguments);
        };
    } else {
        if (!util.global) {
            return function() {
                return false;
            };
        }
        return function(name) {
            var methodName = "on" + name.toLowerCase();
            var method = util.global[methodName];
            if (!method) return false;
            method.apply(util.global, [].slice.call(arguments, 1));
            return true;
        };
    }
})();

function generatePromiseLifecycleEventObject(name, promise) {
    return {promise: promise};
}

var eventToObjectGenerator = {
    promiseCreated: generatePromiseLifecycleEventObject,
    promiseFulfilled: generatePromiseLifecycleEventObject,
    promiseRejected: generatePromiseLifecycleEventObject,
    promiseResolved: generatePromiseLifecycleEventObject,
    promiseCancelled: generatePromiseLifecycleEventObject,
    promiseChained: function(name, promise, child) {
        return {promise: promise, child: child};
    },
    warning: function(name, warning) {
        return {warning: warning};
    },
    unhandledRejection: function (name, reason, promise) {
        return {reason: reason, promise: promise};
    },
    rejectionHandled: generatePromiseLifecycleEventObject
};

var activeFireEvent = function (name) {
    var globalEventFired = false;
    try {
        globalEventFired = fireGlobalEvent.apply(null, arguments);
    } catch (e) {
        async.throwLater(e);
        globalEventFired = true;
    }

    var domEventFired = false;
    try {
        domEventFired = fireDomEvent(name,
                    eventToObjectGenerator[name].apply(null, arguments));
    } catch (e) {
        async.throwLater(e);
        domEventFired = true;
    }

    return domEventFired || globalEventFired;
};

Promise.config = function(opts) {
    opts = Object(opts);
    if ("longStackTraces" in opts) {
        if (opts.longStackTraces) {
            Promise.longStackTraces();
        } else if (!opts.longStackTraces && Promise.hasLongStackTraces()) {
            disableLongStackTraces();
        }
    }
    if ("warnings" in opts) {
        var warningsOption = opts.warnings;
        config.warnings = !!warningsOption;
        wForgottenReturn = config.warnings;

        if (util.isObject(warningsOption)) {
            if ("wForgottenReturn" in warningsOption) {
                wForgottenReturn = !!warningsOption.wForgottenReturn;
            }
        }
    }
    if ("cancellation" in opts && opts.cancellation && !config.cancellation) {
        if (async.haveItemsQueued()) {
            throw new Error(
                "cannot enable cancellation after promises are in use");
        }
        Promise.prototype._clearCancellationData =
            cancellationClearCancellationData;
        Promise.prototype._propagateFrom = cancellationPropagateFrom;
        Promise.prototype._onCancel = cancellationOnCancel;
        Promise.prototype._setOnCancel = cancellationSetOnCancel;
        Promise.prototype._attachCancellationCallback =
            cancellationAttachCancellationCallback;
        Promise.prototype._execute = cancellationExecute;
        propagateFromFunction = cancellationPropagateFrom;
        config.cancellation = true;
    }
    if ("monitoring" in opts) {
        if (opts.monitoring && !config.monitoring) {
            config.monitoring = true;
            Promise.prototype._fireEvent = activeFireEvent;
        } else if (!opts.monitoring && config.monitoring) {
            config.monitoring = false;
            Promise.prototype._fireEvent = defaultFireEvent;
        }
    }
    if ("asyncHooks" in opts && util.nodeSupportsAsyncResource) {
        var prev = config.asyncHooks;
        var cur = !!opts.asyncHooks;
        if (prev !== cur) {
            config.asyncHooks = cur;
            if (cur) {
                enableAsyncHooks();
            } else {
                disableAsyncHooks();
            }
        }
    }
    return Promise;
};

function defaultFireEvent() { return false; }

Promise.prototype._fireEvent = defaultFireEvent;
Promise.prototype._execute = function(executor, resolve, reject) {
    try {
        executor(resolve, reject);
    } catch (e) {
        return e;
    }
};
Promise.prototype._onCancel = function () {};
Promise.prototype._setOnCancel = function (handler) { ; };
Promise.prototype._attachCancellationCallback = function(onCancel) {
    ;
};
Promise.prototype._captureStackTrace = function () {};
Promise.prototype._attachExtraTrace = function () {};
Promise.prototype._dereferenceTrace = function () {};
Promise.prototype._clearCancellationData = function() {};
Promise.prototype._propagateFrom = function (parent, flags) {
    ;
    ;
};

function cancellationExecute(executor, resolve, reject) {
    var promise = this;
    try {
        executor(resolve, reject, function(onCancel) {
            if (typeof onCancel !== "function") {
                throw new TypeError("onCancel must be a function, got: " +
                                    util.toString(onCancel));
            }
            promise._attachCancellationCallback(onCancel);
        });
    } catch (e) {
        return e;
    }
}

function cancellationAttachCancellationCallback(onCancel) {
    if (!this._isCancellable()) return this;

    var previousOnCancel = this._onCancel();
    if (previousOnCancel !== undefined) {
        if (util.isArray(previousOnCancel)) {
            previousOnCancel.push(onCancel);
        } else {
            this._setOnCancel([previousOnCancel, onCancel]);
        }
    } else {
        this._setOnCancel(onCancel);
    }
}

function cancellationOnCancel() {
    return this._onCancelField;
}

function cancellationSetOnCancel(onCancel) {
    this._onCancelField = onCancel;
}

function cancellationClearCancellationData() {
    this._cancellationParent = undefined;
    this._onCancelField = undefined;
}

function cancellationPropagateFrom(parent, flags) {
    if ((flags & 1) !== 0) {
        this._cancellationParent = parent;
        var branchesRemainingToCancel = parent._branchesRemainingToCancel;
        if (branchesRemainingToCancel === undefined) {
            branchesRemainingToCancel = 0;
        }
        parent._branchesRemainingToCancel = branchesRemainingToCancel + 1;
    }
    if ((flags & 2) !== 0 && parent._isBound()) {
        this._setBoundTo(parent._boundTo);
    }
}

function bindingPropagateFrom(parent, flags) {
    if ((flags & 2) !== 0 && parent._isBound()) {
        this._setBoundTo(parent._boundTo);
    }
}
var propagateFromFunction = bindingPropagateFrom;

function boundValueFunction() {
    var ret = this._boundTo;
    if (ret !== undefined) {
        if (ret instanceof Promise) {
            if (ret.isFulfilled()) {
                return ret.value();
            } else {
                return undefined;
            }
        }
    }
    return ret;
}

function longStackTracesCaptureStackTrace() {
    this._trace = new CapturedTrace(this._peekContext());
}

function longStackTracesAttachExtraTrace(error, ignoreSelf) {
    if (canAttachTrace(error)) {
        var trace = this._trace;
        if (trace !== undefined) {
            if (ignoreSelf) trace = trace._parent;
        }
        if (trace !== undefined) {
            trace.attachExtraTrace(error);
        } else if (!error.__stackCleaned__) {
            var parsed = parseStackAndMessage(error);
            util.notEnumerableProp(error, "stack",
                parsed.message + "\n" + parsed.stack.join("\n"));
            util.notEnumerableProp(error, "__stackCleaned__", true);
        }
    }
}

function longStackTracesDereferenceTrace() {
    this._trace = undefined;
}

function checkForgottenReturns(returnValue, promiseCreated, name, promise,
                               parent) {
    if (returnValue === undefined && promiseCreated !== null &&
        wForgottenReturn) {
        if (parent !== undefined && parent._returnedNonUndefined()) return;
        if ((promise._bitField & 65535) === 0) return;

        if (name) name = name + " ";
        var handlerLine = "";
        var creatorLine = "";
        if (promiseCreated._trace) {
            var traceLines = promiseCreated._trace.stack.split("\n");
            var stack = cleanStack(traceLines);
            for (var i = stack.length - 1; i >= 0; --i) {
                var line = stack[i];
                if (!nodeFramePattern.test(line)) {
                    var lineMatches = line.match(parseLinePattern);
                    if (lineMatches) {
                        handlerLine  = "at " + lineMatches[1] +
                            ":" + lineMatches[2] + ":" + lineMatches[3] + " ";
                    }
                    break;
                }
            }

            if (stack.length > 0) {
                var firstUserLine = stack[0];
                for (var i = 0; i < traceLines.length; ++i) {

                    if (traceLines[i] === firstUserLine) {
                        if (i > 0) {
                            creatorLine = "\n" + traceLines[i - 1];
                        }
                        break;
                    }
                }

            }
        }
        var msg = "a promise was created in a " + name +
            "handler " + handlerLine + "but was not returned from it, " +
            "see http://goo.gl/rRqMUw" +
            creatorLine;
        promise._warn(msg, true, promiseCreated);
    }
}

function deprecated(name, replacement) {
    var message = name +
        " is deprecated and will be removed in a future version.";
    if (replacement) message += " Use " + replacement + " instead.";
    return warn(message);
}

function warn(message, shouldUseOwnTrace, promise) {
    if (!config.warnings) return;
    var warning = new Warning(message);
    var ctx;
    if (shouldUseOwnTrace) {
        promise._attachExtraTrace(warning);
    } else if (config.longStackTraces && (ctx = Promise._peekContext())) {
        ctx.attachExtraTrace(warning);
    } else {
        var parsed = parseStackAndMessage(warning);
        warning.stack = parsed.message + "\n" + parsed.stack.join("\n");
    }

    if (!activeFireEvent("warning", warning)) {
        formatAndLogError(warning, "", true);
    }
}

function reconstructStack(message, stacks) {
    for (var i = 0; i < stacks.length - 1; ++i) {
        stacks[i].push("From previous event:");
        stacks[i] = stacks[i].join("\n");
    }
    if (i < stacks.length) {
        stacks[i] = stacks[i].join("\n");
    }
    return message + "\n" + stacks.join("\n");
}

function removeDuplicateOrEmptyJumps(stacks) {
    for (var i = 0; i < stacks.length; ++i) {
        if (stacks[i].length === 0 ||
            ((i + 1 < stacks.length) && stacks[i][0] === stacks[i+1][0])) {
            stacks.splice(i, 1);
            i--;
        }
    }
}

function removeCommonRoots(stacks) {
    var current = stacks[0];
    for (var i = 1; i < stacks.length; ++i) {
        var prev = stacks[i];
        var currentLastIndex = current.length - 1;
        var currentLastLine = current[currentLastIndex];
        var commonRootMeetPoint = -1;

        for (var j = prev.length - 1; j >= 0; --j) {
            if (prev[j] === currentLastLine) {
                commonRootMeetPoint = j;
                break;
            }
        }

        for (var j = commonRootMeetPoint; j >= 0; --j) {
            var line = prev[j];
            if (current[currentLastIndex] === line) {
                current.pop();
                currentLastIndex--;
            } else {
                break;
            }
        }
        current = prev;
    }
}

function cleanStack(stack) {
    var ret = [];
    for (var i = 0; i < stack.length; ++i) {
        var line = stack[i];
        var isTraceLine = "    (No stack trace)" === line ||
            stackFramePattern.test(line);
        var isInternalFrame = isTraceLine && shouldIgnore(line);
        if (isTraceLine && !isInternalFrame) {
            if (indentStackFrames && line.charAt(0) !== " ") {
                line = "    " + line;
            }
            ret.push(line);
        }
    }
    return ret;
}

function stackFramesAsArray(error) {
    var stack = error.stack.replace(/\s+$/g, "").split("\n");
    for (var i = 0; i < stack.length; ++i) {
        var line = stack[i];
        if ("    (No stack trace)" === line || stackFramePattern.test(line)) {
            break;
        }
    }
    if (i > 0 && error.name != "SyntaxError") {
        stack = stack.slice(i);
    }
    return stack;
}

function parseStackAndMessage(error) {
    var stack = error.stack;
    var message = error.toString();
    stack = typeof stack === "string" && stack.length > 0
                ? stackFramesAsArray(error) : ["    (No stack trace)"];
    return {
        message: message,
        stack: error.name == "SyntaxError" ? stack : cleanStack(stack)
    };
}

function formatAndLogError(error, title, isSoft) {
    if (typeof console !== "undefined") {
        var message;
        if (util.isObject(error)) {
            var stack = error.stack;
            message = title + formatStack(stack, error);
        } else {
            message = title + String(error);
        }
        if (typeof printWarning === "function") {
            printWarning(message, isSoft);
        } else if (typeof console.log === "function" ||
            typeof console.log === "object") {
            console.log(message);
        }
    }
}

function fireRejectionEvent(name, localHandler, reason, promise) {
    var localEventFired = false;
    try {
        if (typeof localHandler === "function") {
            localEventFired = true;
            if (name === "rejectionHandled") {
                localHandler(promise);
            } else {
                localHandler(reason, promise);
            }
        }
    } catch (e) {
        async.throwLater(e);
    }

    if (name === "unhandledRejection") {
        if (!activeFireEvent(name, reason, promise) && !localEventFired) {
            formatAndLogError(reason, "Unhandled rejection ");
        }
    } else {
        activeFireEvent(name, promise);
    }
}

function formatNonError(obj) {
    var str;
    if (typeof obj === "function") {
        str = "[function " +
            (obj.name || "anonymous") +
            "]";
    } else {
        str = obj && typeof obj.toString === "function"
            ? obj.toString() : util.toString(obj);
        var ruselessToString = /\[object [a-zA-Z0-9$_]+\]/;
        if (ruselessToString.test(str)) {
            try {
                var newStr = JSON.stringify(obj);
                str = newStr;
            }
            catch(e) {

            }
        }
        if (str.length === 0) {
            str = "(empty array)";
        }
    }
    return ("(<" + snip(str) + ">, no stack trace)");
}

function snip(str) {
    var maxChars = 41;
    if (str.length < maxChars) {
        return str;
    }
    return str.substr(0, maxChars - 3) + "...";
}

function longStackTracesIsSupported() {
    return typeof captureStackTrace === "function";
}

var shouldIgnore = function() { return false; };
var parseLineInfoRegex = /[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;
function parseLineInfo(line) {
    var matches = line.match(parseLineInfoRegex);
    if (matches) {
        return {
            fileName: matches[1],
            line: parseInt(matches[2], 10)
        };
    }
}

function setBounds(firstLineError, lastLineError) {
    if (!longStackTracesIsSupported()) return;
    var firstStackLines = (firstLineError.stack || "").split("\n");
    var lastStackLines = (lastLineError.stack || "").split("\n");
    var firstIndex = -1;
    var lastIndex = -1;
    var firstFileName;
    var lastFileName;
    for (var i = 0; i < firstStackLines.length; ++i) {
        var result = parseLineInfo(firstStackLines[i]);
        if (result) {
            firstFileName = result.fileName;
            firstIndex = result.line;
            break;
        }
    }
    for (var i = 0; i < lastStackLines.length; ++i) {
        var result = parseLineInfo(lastStackLines[i]);
        if (result) {
            lastFileName = result.fileName;
            lastIndex = result.line;
            break;
        }
    }
    if (firstIndex < 0 || lastIndex < 0 || !firstFileName || !lastFileName ||
        firstFileName !== lastFileName || firstIndex >= lastIndex) {
        return;
    }

    shouldIgnore = function(line) {
        if (bluebirdFramePattern.test(line)) return true;
        var info = parseLineInfo(line);
        if (info) {
            if (info.fileName === firstFileName &&
                (firstIndex <= info.line && info.line <= lastIndex)) {
                return true;
            }
        }
        return false;
    };
}

function CapturedTrace(parent) {
    this._parent = parent;
    this._promisesCreated = 0;
    var length = this._length = 1 + (parent === undefined ? 0 : parent._length);
    captureStackTrace(this, CapturedTrace);
    if (length > 32) this.uncycle();
}
util.inherits(CapturedTrace, Error);
Context.CapturedTrace = CapturedTrace;

CapturedTrace.prototype.uncycle = function() {
    var length = this._length;
    if (length < 2) return;
    var nodes = [];
    var stackToIndex = {};

    for (var i = 0, node = this; node !== undefined; ++i) {
        nodes.push(node);
        node = node._parent;
    }
    length = this._length = i;
    for (var i = length - 1; i >= 0; --i) {
        var stack = nodes[i].stack;
        if (stackToIndex[stack] === undefined) {
            stackToIndex[stack] = i;
        }
    }
    for (var i = 0; i < length; ++i) {
        var currentStack = nodes[i].stack;
        var index = stackToIndex[currentStack];
        if (index !== undefined && index !== i) {
            if (index > 0) {
                nodes[index - 1]._parent = undefined;
                nodes[index - 1]._length = 1;
            }
            nodes[i]._parent = undefined;
            nodes[i]._length = 1;
            var cycleEdgeNode = i > 0 ? nodes[i - 1] : this;

            if (index < length - 1) {
                cycleEdgeNode._parent = nodes[index + 1];
                cycleEdgeNode._parent.uncycle();
                cycleEdgeNode._length =
                    cycleEdgeNode._parent._length + 1;
            } else {
                cycleEdgeNode._parent = undefined;
                cycleEdgeNode._length = 1;
            }
            var currentChildLength = cycleEdgeNode._length + 1;
            for (var j = i - 2; j >= 0; --j) {
                nodes[j]._length = currentChildLength;
                currentChildLength++;
            }
            return;
        }
    }
};

CapturedTrace.prototype.attachExtraTrace = function(error) {
    if (error.__stackCleaned__) return;
    this.uncycle();
    var parsed = parseStackAndMessage(error);
    var message = parsed.message;
    var stacks = [parsed.stack];

    var trace = this;
    while (trace !== undefined) {
        stacks.push(cleanStack(trace.stack.split("\n")));
        trace = trace._parent;
    }
    removeCommonRoots(stacks);
    removeDuplicateOrEmptyJumps(stacks);
    util.notEnumerableProp(error, "stack", reconstructStack(message, stacks));
    util.notEnumerableProp(error, "__stackCleaned__", true);
};

var captureStackTrace = (function stackDetection() {
    var v8stackFramePattern = /^\s*at\s*/;
    var v8stackFormatter = function(stack, error) {
        if (typeof stack === "string") return stack;

        if (error.name !== undefined &&
            error.message !== undefined) {
            return error.toString();
        }
        return formatNonError(error);
    };

    if (typeof Error.stackTraceLimit === "number" &&
        typeof Error.captureStackTrace === "function") {
        Error.stackTraceLimit += 6;
        stackFramePattern = v8stackFramePattern;
        formatStack = v8stackFormatter;
        var captureStackTrace = Error.captureStackTrace;

        shouldIgnore = function(line) {
            return bluebirdFramePattern.test(line);
        };
        return function(receiver, ignoreUntil) {
            Error.stackTraceLimit += 6;
            captureStackTrace(receiver, ignoreUntil);
            Error.stackTraceLimit -= 6;
        };
    }
    var err = new Error();

    if (typeof err.stack === "string" &&
        err.stack.split("\n")[0].indexOf("stackDetection@") >= 0) {
        stackFramePattern = /@/;
        formatStack = v8stackFormatter;
        indentStackFrames = true;
        return function captureStackTrace(o) {
            o.stack = new Error().stack;
        };
    }

    var hasStackAfterThrow;
    try { throw new Error(); }
    catch(e) {
        hasStackAfterThrow = ("stack" in e);
    }
    if (!("stack" in err) && hasStackAfterThrow &&
        typeof Error.stackTraceLimit === "number") {
        stackFramePattern = v8stackFramePattern;
        formatStack = v8stackFormatter;
        return function captureStackTrace(o) {
            Error.stackTraceLimit += 6;
            try { throw new Error(); }
            catch(e) { o.stack = e.stack; }
            Error.stackTraceLimit -= 6;
        };
    }

    formatStack = function(stack, error) {
        if (typeof stack === "string") return stack;

        if ((typeof error === "object" ||
            typeof error === "function") &&
            error.name !== undefined &&
            error.message !== undefined) {
            return error.toString();
        }
        return formatNonError(error);
    };

    return null;

})([]);

if (typeof console !== "undefined" && typeof console.warn !== "undefined") {
    printWarning = function (message) {
        console.warn(message);
    };
    if (util.isNode && process.stderr.isTTY) {
        printWarning = function(message, isSoft) {
            var color = isSoft ? "\u001b[33m" : "\u001b[31m";
            console.warn(color + message + "\u001b[0m\n");
        };
    } else if (!util.isNode && typeof (new Error().stack) === "string") {
        printWarning = function(message, isSoft) {
            console.warn("%c" + message,
                        isSoft ? "color: darkorange" : "color: red");
        };
    }
}

var config = {
    warnings: warnings,
    longStackTraces: false,
    cancellation: false,
    monitoring: false,
    asyncHooks: false
};

if (longStackTraces) Promise.longStackTraces();

return {
    asyncHooks: function() {
        return config.asyncHooks;
    },
    longStackTraces: function() {
        return config.longStackTraces;
    },
    warnings: function() {
        return config.warnings;
    },
    cancellation: function() {
        return config.cancellation;
    },
    monitoring: function() {
        return config.monitoring;
    },
    propagateFromFunction: function() {
        return propagateFromFunction;
    },
    boundValueFunction: function() {
        return boundValueFunction;
    },
    checkForgottenReturns: checkForgottenReturns,
    setBounds: setBounds,
    warn: warn,
    deprecated: deprecated,
    CapturedTrace: CapturedTrace,
    fireDomEvent: fireDomEvent,
    fireGlobalEvent: fireGlobalEvent
};
};

},{"./errors":9,"./es5":10,"./util":21}],8:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise) {
function returner() {
    return this.value;
}
function thrower() {
    throw this.reason;
}

Promise.prototype["return"] =
Promise.prototype.thenReturn = function (value) {
    if (value instanceof Promise) value.suppressUnhandledRejections();
    return this._then(
        returner, undefined, undefined, {value: value}, undefined);
};

Promise.prototype["throw"] =
Promise.prototype.thenThrow = function (reason) {
    return this._then(
        thrower, undefined, undefined, {reason: reason}, undefined);
};

Promise.prototype.catchThrow = function (reason) {
    if (arguments.length <= 1) {
        return this._then(
            undefined, thrower, undefined, {reason: reason}, undefined);
    } else {
        var _reason = arguments[1];
        var handler = function() {throw _reason;};
        return this.caught(reason, handler);
    }
};

Promise.prototype.catchReturn = function (value) {
    if (arguments.length <= 1) {
        if (value instanceof Promise) value.suppressUnhandledRejections();
        return this._then(
            undefined, returner, undefined, {value: value}, undefined);
    } else {
        var _value = arguments[1];
        if (_value instanceof Promise) _value.suppressUnhandledRejections();
        var handler = function() {return _value;};
        return this.caught(value, handler);
    }
};
};

},{}],9:[function(_dereq_,module,exports){
"use strict";
var es5 = _dereq_("./es5");
var Objectfreeze = es5.freeze;
var util = _dereq_("./util");
var inherits = util.inherits;
var notEnumerableProp = util.notEnumerableProp;

function subError(nameProperty, defaultMessage) {
    function SubError(message) {
        if (!(this instanceof SubError)) return new SubError(message);
        notEnumerableProp(this, "message",
            typeof message === "string" ? message : defaultMessage);
        notEnumerableProp(this, "name", nameProperty);
        if (Error.captureStackTrace) {
            Error.captureStackTrace(this, this.constructor);
        } else {
            Error.call(this);
        }
    }
    inherits(SubError, Error);
    return SubError;
}

var _TypeError, _RangeError;
var Warning = subError("Warning", "warning");
var CancellationError = subError("CancellationError", "cancellation error");
var TimeoutError = subError("TimeoutError", "timeout error");
var AggregateError = subError("AggregateError", "aggregate error");
try {
    _TypeError = TypeError;
    _RangeError = RangeError;
} catch(e) {
    _TypeError = subError("TypeError", "type error");
    _RangeError = subError("RangeError", "range error");
}

var methods = ("join pop push shift unshift slice filter forEach some " +
    "every map indexOf lastIndexOf reduce reduceRight sort reverse").split(" ");

for (var i = 0; i < methods.length; ++i) {
    if (typeof Array.prototype[methods[i]] === "function") {
        AggregateError.prototype[methods[i]] = Array.prototype[methods[i]];
    }
}

es5.defineProperty(AggregateError.prototype, "length", {
    value: 0,
    configurable: false,
    writable: true,
    enumerable: true
});
AggregateError.prototype["isOperational"] = true;
var level = 0;
AggregateError.prototype.toString = function() {
    var indent = Array(level * 4 + 1).join(" ");
    var ret = "\n" + indent + "AggregateError of:" + "\n";
    level++;
    indent = Array(level * 4 + 1).join(" ");
    for (var i = 0; i < this.length; ++i) {
        var str = this[i] === this ? "[Circular AggregateError]" : this[i] + "";
        var lines = str.split("\n");
        for (var j = 0; j < lines.length; ++j) {
            lines[j] = indent + lines[j];
        }
        str = lines.join("\n");
        ret += str + "\n";
    }
    level--;
    return ret;
};

function OperationalError(message) {
    if (!(this instanceof OperationalError))
        return new OperationalError(message);
    notEnumerableProp(this, "name", "OperationalError");
    notEnumerableProp(this, "message", message);
    this.cause = message;
    this["isOperational"] = true;

    if (message instanceof Error) {
        notEnumerableProp(this, "message", message.message);
        notEnumerableProp(this, "stack", message.stack);
    } else if (Error.captureStackTrace) {
        Error.captureStackTrace(this, this.constructor);
    }

}
inherits(OperationalError, Error);

var errorTypes = Error["__BluebirdErrorTypes__"];
if (!errorTypes) {
    errorTypes = Objectfreeze({
        CancellationError: CancellationError,
        TimeoutError: TimeoutError,
        OperationalError: OperationalError,
        RejectionError: OperationalError,
        AggregateError: AggregateError
    });
    es5.defineProperty(Error, "__BluebirdErrorTypes__", {
        value: errorTypes,
        writable: false,
        enumerable: false,
        configurable: false
    });
}

module.exports = {
    Error: Error,
    TypeError: _TypeError,
    RangeError: _RangeError,
    CancellationError: errorTypes.CancellationError,
    OperationalError: errorTypes.OperationalError,
    TimeoutError: errorTypes.TimeoutError,
    AggregateError: errorTypes.AggregateError,
    Warning: Warning
};

},{"./es5":10,"./util":21}],10:[function(_dereq_,module,exports){
var isES5 = (function(){
    "use strict";
    return this === undefined;
})();

if (isES5) {
    module.exports = {
        freeze: Object.freeze,
        defineProperty: Object.defineProperty,
        getDescriptor: Object.getOwnPropertyDescriptor,
        keys: Object.keys,
        names: Object.getOwnPropertyNames,
        getPrototypeOf: Object.getPrototypeOf,
        isArray: Array.isArray,
        isES5: isES5,
        propertyIsWritable: function(obj, prop) {
            var descriptor = Object.getOwnPropertyDescriptor(obj, prop);
            return !!(!descriptor || descriptor.writable || descriptor.set);
        }
    };
} else {
    var has = {}.hasOwnProperty;
    var str = {}.toString;
    var proto = {}.constructor.prototype;

    var ObjectKeys = function (o) {
        var ret = [];
        for (var key in o) {
            if (has.call(o, key)) {
                ret.push(key);
            }
        }
        return ret;
    };

    var ObjectGetDescriptor = function(o, key) {
        return {value: o[key]};
    };

    var ObjectDefineProperty = function (o, key, desc) {
        o[key] = desc.value;
        return o;
    };

    var ObjectFreeze = function (obj) {
        return obj;
    };

    var ObjectGetPrototypeOf = function (obj) {
        try {
            return Object(obj).constructor.prototype;
        }
        catch (e) {
            return proto;
        }
    };

    var ArrayIsArray = function (obj) {
        try {
            return str.call(obj) === "[object Array]";
        }
        catch(e) {
            return false;
        }
    };

    module.exports = {
        isArray: ArrayIsArray,
        keys: ObjectKeys,
        names: ObjectKeys,
        defineProperty: ObjectDefineProperty,
        getDescriptor: ObjectGetDescriptor,
        freeze: ObjectFreeze,
        getPrototypeOf: ObjectGetPrototypeOf,
        isES5: isES5,
        propertyIsWritable: function() {
            return true;
        }
    };
}

},{}],11:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, tryConvertToPromise, NEXT_FILTER) {
var util = _dereq_("./util");
var CancellationError = Promise.CancellationError;
var errorObj = util.errorObj;
var catchFilter = _dereq_("./catch_filter")(NEXT_FILTER);

function PassThroughHandlerContext(promise, type, handler) {
    this.promise = promise;
    this.type = type;
    this.handler = handler;
    this.called = false;
    this.cancelPromise = null;
}

PassThroughHandlerContext.prototype.isFinallyHandler = function() {
    return this.type === 0;
};

function FinallyHandlerCancelReaction(finallyHandler) {
    this.finallyHandler = finallyHandler;
}

FinallyHandlerCancelReaction.prototype._resultCancelled = function() {
    checkCancel(this.finallyHandler);
};

function checkCancel(ctx, reason) {
    if (ctx.cancelPromise != null) {
        if (arguments.length > 1) {
            ctx.cancelPromise._reject(reason);
        } else {
            ctx.cancelPromise._cancel();
        }
        ctx.cancelPromise = null;
        return true;
    }
    return false;
}

function succeed() {
    return finallyHandler.call(this, this.promise._target()._settledValue());
}
function fail(reason) {
    if (checkCancel(this, reason)) return;
    errorObj.e = reason;
    return errorObj;
}
function finallyHandler(reasonOrValue) {
    var promise = this.promise;
    var handler = this.handler;

    if (!this.called) {
        this.called = true;
        var ret = this.isFinallyHandler()
            ? handler.call(promise._boundValue())
            : handler.call(promise._boundValue(), reasonOrValue);
        if (ret === NEXT_FILTER) {
            return ret;
        } else if (ret !== undefined) {
            promise._setReturnedNonUndefined();
            var maybePromise = tryConvertToPromise(ret, promise);
            if (maybePromise instanceof Promise) {
                if (this.cancelPromise != null) {
                    if (maybePromise._isCancelled()) {
                        var reason =
                            new CancellationError("late cancellation observer");
                        promise._attachExtraTrace(reason);
                        errorObj.e = reason;
                        return errorObj;
                    } else if (maybePromise.isPending()) {
                        maybePromise._attachCancellationCallback(
                            new FinallyHandlerCancelReaction(this));
                    }
                }
                return maybePromise._then(
                    succeed, fail, undefined, this, undefined);
            }
        }
    }

    if (promise.isRejected()) {
        checkCancel(this);
        errorObj.e = reasonOrValue;
        return errorObj;
    } else {
        checkCancel(this);
        return reasonOrValue;
    }
}

Promise.prototype._passThrough = function(handler, type, success, fail) {
    if (typeof handler !== "function") return this.then();
    return this._then(success,
                      fail,
                      undefined,
                      new PassThroughHandlerContext(this, type, handler),
                      undefined);
};

Promise.prototype.lastly =
Promise.prototype["finally"] = function (handler) {
    return this._passThrough(handler,
                             0,
                             finallyHandler,
                             finallyHandler);
};


Promise.prototype.tap = function (handler) {
    return this._passThrough(handler, 1, finallyHandler);
};

Promise.prototype.tapCatch = function (handlerOrPredicate) {
    var len = arguments.length;
    if(len === 1) {
        return this._passThrough(handlerOrPredicate,
                                 1,
                                 undefined,
                                 finallyHandler);
    } else {
         var catchInstances = new Array(len - 1),
            j = 0, i;
        for (i = 0; i < len - 1; ++i) {
            var item = arguments[i];
            if (util.isObject(item)) {
                catchInstances[j++] = item;
            } else {
                return Promise.reject(new TypeError(
                    "tapCatch statement predicate: "
                    + "expecting an object but got " + util.classString(item)
                ));
            }
        }
        catchInstances.length = j;
        var handler = arguments[i];
        return this._passThrough(catchFilter(catchInstances, handler, this),
                                 1,
                                 undefined,
                                 finallyHandler);
    }

};

return PassThroughHandlerContext;
};

},{"./catch_filter":5,"./util":21}],12:[function(_dereq_,module,exports){
"use strict";
module.exports =
function(Promise, PromiseArray, tryConvertToPromise, INTERNAL, async) {
var util = _dereq_("./util");
var canEvaluate = util.canEvaluate;
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;
var reject;

if (!true) {
if (canEvaluate) {
    var thenCallback = function(i) {
        return new Function("value", "holder", "                             \n\
            'use strict';                                                    \n\
            holder.pIndex = value;                                           \n\
            holder.checkFulfillment(this);                                   \n\
            ".replace(/Index/g, i));
    };

    var promiseSetter = function(i) {
        return new Function("promise", "holder", "                           \n\
            'use strict';                                                    \n\
            holder.pIndex = promise;                                         \n\
            ".replace(/Index/g, i));
    };

    var generateHolderClass = function(total) {
        var props = new Array(total);
        for (var i = 0; i < props.length; ++i) {
            props[i] = "this.p" + (i+1);
        }
        var assignment = props.join(" = ") + " = null;";
        var cancellationCode= "var promise;\n" + props.map(function(prop) {
            return "                                                         \n\
                promise = " + prop + ";                                      \n\
                if (promise instanceof Promise) {                            \n\
                    promise.cancel();                                        \n\
                }                                                            \n\
            ";
        }).join("\n");
        var passedArguments = props.join(", ");
        var name = "Holder$" + total;


        var code = "return function(tryCatch, errorObj, Promise, async) {    \n\
            'use strict';                                                    \n\
            function [TheName](fn) {                                         \n\
                [TheProperties]                                              \n\
                this.fn = fn;                                                \n\
                this.asyncNeeded = true;                                     \n\
                this.now = 0;                                                \n\
            }                                                                \n\
                                                                             \n\
            [TheName].prototype._callFunction = function(promise) {          \n\
                promise._pushContext();                                      \n\
                var ret = tryCatch(this.fn)([ThePassedArguments]);           \n\
                promise._popContext();                                       \n\
                if (ret === errorObj) {                                      \n\
                    promise._rejectCallback(ret.e, false);                   \n\
                } else {                                                     \n\
                    promise._resolveCallback(ret);                           \n\
                }                                                            \n\
            };                                                               \n\
                                                                             \n\
            [TheName].prototype.checkFulfillment = function(promise) {       \n\
                var now = ++this.now;                                        \n\
                if (now === [TheTotal]) {                                    \n\
                    if (this.asyncNeeded) {                                  \n\
                        async.invoke(this._callFunction, this, promise);     \n\
                    } else {                                                 \n\
                        this._callFunction(promise);                         \n\
                    }                                                        \n\
                                                                             \n\
                }                                                            \n\
            };                                                               \n\
                                                                             \n\
            [TheName].prototype._resultCancelled = function() {              \n\
                [CancellationCode]                                           \n\
            };                                                               \n\
                                                                             \n\
            return [TheName];                                                \n\
        }(tryCatch, errorObj, Promise, async);                               \n\
        ";

        code = code.replace(/\[TheName\]/g, name)
            .replace(/\[TheTotal\]/g, total)
            .replace(/\[ThePassedArguments\]/g, passedArguments)
            .replace(/\[TheProperties\]/g, assignment)
            .replace(/\[CancellationCode\]/g, cancellationCode);

        return new Function("tryCatch", "errorObj", "Promise", "async", code)
                           (tryCatch, errorObj, Promise, async);
    };

    var holderClasses = [];
    var thenCallbacks = [];
    var promiseSetters = [];

    for (var i = 0; i < 8; ++i) {
        holderClasses.push(generateHolderClass(i + 1));
        thenCallbacks.push(thenCallback(i + 1));
        promiseSetters.push(promiseSetter(i + 1));
    }

    reject = function (reason) {
        this._reject(reason);
    };
}}

Promise.join = function () {
    var last = arguments.length - 1;
    var fn;
    if (last > 0 && typeof arguments[last] === "function") {
        fn = arguments[last];
        if (!true) {
            if (last <= 8 && canEvaluate) {
                var ret = new Promise(INTERNAL);
                ret._captureStackTrace();
                var HolderClass = holderClasses[last - 1];
                var holder = new HolderClass(fn);
                var callbacks = thenCallbacks;

                for (var i = 0; i < last; ++i) {
                    var maybePromise = tryConvertToPromise(arguments[i], ret);
                    if (maybePromise instanceof Promise) {
                        maybePromise = maybePromise._target();
                        var bitField = maybePromise._bitField;
                        ;
                        if (((bitField & 50397184) === 0)) {
                            maybePromise._then(callbacks[i], reject,
                                               undefined, ret, holder);
                            promiseSetters[i](maybePromise, holder);
                            holder.asyncNeeded = false;
                        } else if (((bitField & 33554432) !== 0)) {
                            callbacks[i].call(ret,
                                              maybePromise._value(), holder);
                        } else if (((bitField & 16777216) !== 0)) {
                            ret._reject(maybePromise._reason());
                        } else {
                            ret._cancel();
                        }
                    } else {
                        callbacks[i].call(ret, maybePromise, holder);
                    }
                }

                if (!ret._isFateSealed()) {
                    if (holder.asyncNeeded) {
                        var context = Promise._getContext();
                        holder.fn = util.contextBind(context, holder.fn);
                    }
                    ret._setAsyncGuaranteed();
                    ret._setOnCancel(holder);
                }
                return ret;
            }
        }
    }
    var args = [].slice.call(arguments);;
    if (fn) args.pop();
    var ret = new PromiseArray(args).promise();
    return fn !== undefined ? ret.spread(fn) : ret;
};

};

},{"./util":21}],13:[function(_dereq_,module,exports){
"use strict";
module.exports =
function(Promise, INTERNAL, tryConvertToPromise, apiRejection, debug) {
var util = _dereq_("./util");
var tryCatch = util.tryCatch;

Promise.method = function (fn) {
    if (typeof fn !== "function") {
        throw new Promise.TypeError("expecting a function but got " + util.classString(fn));
    }
    return function () {
        var ret = new Promise(INTERNAL);
        ret._captureStackTrace();
        ret._pushContext();
        var value = tryCatch(fn).apply(this, arguments);
        var promiseCreated = ret._popContext();
        debug.checkForgottenReturns(
            value, promiseCreated, "Promise.method", ret);
        ret._resolveFromSyncValue(value);
        return ret;
    };
};

Promise.attempt = Promise["try"] = function (fn) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    ret._pushContext();
    var value;
    if (arguments.length > 1) {
        debug.deprecated("calling Promise.try with more than 1 argument");
        var arg = arguments[1];
        var ctx = arguments[2];
        value = util.isArray(arg) ? tryCatch(fn).apply(ctx, arg)
                                  : tryCatch(fn).call(ctx, arg);
    } else {
        value = tryCatch(fn)();
    }
    var promiseCreated = ret._popContext();
    debug.checkForgottenReturns(
        value, promiseCreated, "Promise.try", ret);
    ret._resolveFromSyncValue(value);
    return ret;
};

Promise.prototype._resolveFromSyncValue = function (value) {
    if (value === util.errorObj) {
        this._rejectCallback(value.e, false);
    } else {
        this._resolveCallback(value, true);
    }
};
};

},{"./util":21}],14:[function(_dereq_,module,exports){
"use strict";
var util = _dereq_("./util");
var maybeWrapAsError = util.maybeWrapAsError;
var errors = _dereq_("./errors");
var OperationalError = errors.OperationalError;
var es5 = _dereq_("./es5");

function isUntypedError(obj) {
    return obj instanceof Error &&
        es5.getPrototypeOf(obj) === Error.prototype;
}

var rErrorKey = /^(?:name|message|stack|cause)$/;
function wrapAsOperationalError(obj) {
    var ret;
    if (isUntypedError(obj)) {
        ret = new OperationalError(obj);
        ret.name = obj.name;
        ret.message = obj.message;
        ret.stack = obj.stack;
        var keys = es5.keys(obj);
        for (var i = 0; i < keys.length; ++i) {
            var key = keys[i];
            if (!rErrorKey.test(key)) {
                ret[key] = obj[key];
            }
        }
        return ret;
    }
    util.markAsOriginatingFromRejection(obj);
    return obj;
}

function nodebackForPromise(promise, multiArgs) {
    return function(err, value) {
        if (promise === null) return;
        if (err) {
            var wrapped = wrapAsOperationalError(maybeWrapAsError(err));
            promise._attachExtraTrace(wrapped);
            promise._reject(wrapped);
        } else if (!multiArgs) {
            promise._fulfill(value);
        } else {
            var args = [].slice.call(arguments, 1);;
            promise._fulfill(args);
        }
        promise = null;
    };
}

module.exports = nodebackForPromise;

},{"./errors":9,"./es5":10,"./util":21}],15:[function(_dereq_,module,exports){
"use strict";
module.exports = function() {
var makeSelfResolutionError = function () {
    return new TypeError("circular promise resolution chain\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
};
var reflectHandler = function() {
    return new Promise.PromiseInspection(this._target());
};
var apiRejection = function(msg) {
    return Promise.reject(new TypeError(msg));
};
function Proxyable() {}
var UNDEFINED_BINDING = {};
var util = _dereq_("./util");
util.setReflectHandler(reflectHandler);

var getDomain = function() {
    var domain = process.domain;
    if (domain === undefined) {
        return null;
    }
    return domain;
};
var getContextDefault = function() {
    return null;
};
var getContextDomain = function() {
    return {
        domain: getDomain(),
        async: null
    };
};
var AsyncResource = util.isNode && util.nodeSupportsAsyncResource ?
    _dereq_("async_hooks").AsyncResource : null;
var getContextAsyncHooks = function() {
    return {
        domain: getDomain(),
        async: new AsyncResource("Bluebird::Promise")
    };
};
var getContext = util.isNode ? getContextDomain : getContextDefault;
util.notEnumerableProp(Promise, "_getContext", getContext);
var enableAsyncHooks = function() {
    getContext = getContextAsyncHooks;
    util.notEnumerableProp(Promise, "_getContext", getContextAsyncHooks);
};
var disableAsyncHooks = function() {
    getContext = getContextDomain;
    util.notEnumerableProp(Promise, "_getContext", getContextDomain);
};

var es5 = _dereq_("./es5");
var Async = _dereq_("./async");
var async = new Async();
es5.defineProperty(Promise, "_async", {value: async});
var errors = _dereq_("./errors");
var TypeError = Promise.TypeError = errors.TypeError;
Promise.RangeError = errors.RangeError;
var CancellationError = Promise.CancellationError = errors.CancellationError;
Promise.TimeoutError = errors.TimeoutError;
Promise.OperationalError = errors.OperationalError;
Promise.RejectionError = errors.OperationalError;
Promise.AggregateError = errors.AggregateError;
var INTERNAL = function(){};
var APPLY = {};
var NEXT_FILTER = {};
var tryConvertToPromise = _dereq_("./thenables")(Promise, INTERNAL);
var PromiseArray =
    _dereq_("./promise_array")(Promise, INTERNAL,
                               tryConvertToPromise, apiRejection, Proxyable);
var Context = _dereq_("./context")(Promise);
 /*jshint unused:false*/
var createContext = Context.create;

var debug = _dereq_("./debuggability")(Promise, Context,
    enableAsyncHooks, disableAsyncHooks);
var CapturedTrace = debug.CapturedTrace;
var PassThroughHandlerContext =
    _dereq_("./finally")(Promise, tryConvertToPromise, NEXT_FILTER);
var catchFilter = _dereq_("./catch_filter")(NEXT_FILTER);
var nodebackForPromise = _dereq_("./nodeback");
var errorObj = util.errorObj;
var tryCatch = util.tryCatch;
function check(self, executor) {
    if (self == null || self.constructor !== Promise) {
        throw new TypeError("the promise constructor cannot be invoked directly\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    if (typeof executor !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(executor));
    }

}

function Promise(executor) {
    if (executor !== INTERNAL) {
        check(this, executor);
    }
    this._bitField = 0;
    this._fulfillmentHandler0 = undefined;
    this._rejectionHandler0 = undefined;
    this._promise0 = undefined;
    this._receiver0 = undefined;
    this._resolveFromExecutor(executor);
    this._promiseCreated();
    this._fireEvent("promiseCreated", this);
}

Promise.prototype.toString = function () {
    return "[object Promise]";
};

Promise.prototype.caught = Promise.prototype["catch"] = function (fn) {
    var len = arguments.length;
    if (len > 1) {
        var catchInstances = new Array(len - 1),
            j = 0, i;
        for (i = 0; i < len - 1; ++i) {
            var item = arguments[i];
            if (util.isObject(item)) {
                catchInstances[j++] = item;
            } else {
                return apiRejection("Catch statement predicate: " +
                    "expecting an object but got " + util.classString(item));
            }
        }
        catchInstances.length = j;
        fn = arguments[i];

        if (typeof fn !== "function") {
            throw new TypeError("The last argument to .catch() " +
                "must be a function, got " + util.toString(fn));
        }
        return this.then(undefined, catchFilter(catchInstances, fn, this));
    }
    return this.then(undefined, fn);
};

Promise.prototype.reflect = function () {
    return this._then(reflectHandler,
        reflectHandler, undefined, this, undefined);
};

Promise.prototype.then = function (didFulfill, didReject) {
    if (debug.warnings() && arguments.length > 0 &&
        typeof didFulfill !== "function" &&
        typeof didReject !== "function") {
        var msg = ".then() only accepts functions but was passed: " +
                util.classString(didFulfill);
        if (arguments.length > 1) {
            msg += ", " + util.classString(didReject);
        }
        this._warn(msg);
    }
    return this._then(didFulfill, didReject, undefined, undefined, undefined);
};

Promise.prototype.done = function (didFulfill, didReject) {
    var promise =
        this._then(didFulfill, didReject, undefined, undefined, undefined);
    promise._setIsFinal();
};

Promise.prototype.spread = function (fn) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }
    return this.all()._then(fn, undefined, undefined, APPLY, undefined);
};

Promise.prototype.toJSON = function () {
    var ret = {
        isFulfilled: false,
        isRejected: false,
        fulfillmentValue: undefined,
        rejectionReason: undefined
    };
    if (this.isFulfilled()) {
        ret.fulfillmentValue = this.value();
        ret.isFulfilled = true;
    } else if (this.isRejected()) {
        ret.rejectionReason = this.reason();
        ret.isRejected = true;
    }
    return ret;
};

Promise.prototype.all = function () {
    if (arguments.length > 0) {
        this._warn(".all() was passed arguments but it does not take any");
    }
    return new PromiseArray(this).promise();
};

Promise.prototype.error = function (fn) {
    return this.caught(util.originatesFromRejection, fn);
};

Promise.getNewLibraryCopy = module.exports;

Promise.is = function (val) {
    return val instanceof Promise;
};

Promise.fromNode = Promise.fromCallback = function(fn) {
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    var multiArgs = arguments.length > 1 ? !!Object(arguments[1]).multiArgs
                                         : false;
    var result = tryCatch(fn)(nodebackForPromise(ret, multiArgs));
    if (result === errorObj) {
        ret._rejectCallback(result.e, true);
    }
    if (!ret._isFateSealed()) ret._setAsyncGuaranteed();
    return ret;
};

Promise.all = function (promises) {
    return new PromiseArray(promises).promise();
};

Promise.cast = function (obj) {
    var ret = tryConvertToPromise(obj);
    if (!(ret instanceof Promise)) {
        ret = new Promise(INTERNAL);
        ret._captureStackTrace();
        ret._setFulfilled();
        ret._rejectionHandler0 = obj;
    }
    return ret;
};

Promise.resolve = Promise.fulfilled = Promise.cast;

Promise.reject = Promise.rejected = function (reason) {
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    ret._rejectCallback(reason, true);
    return ret;
};

Promise.setScheduler = function(fn) {
    if (typeof fn !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(fn));
    }
    return async.setScheduler(fn);
};

Promise.prototype._then = function (
    didFulfill,
    didReject,
    _,    receiver,
    internalData
) {
    var haveInternalData = internalData !== undefined;
    var promise = haveInternalData ? internalData : new Promise(INTERNAL);
    var target = this._target();
    var bitField = target._bitField;

    if (!haveInternalData) {
        promise._propagateFrom(this, 3);
        promise._captureStackTrace();
        if (receiver === undefined &&
            ((this._bitField & 2097152) !== 0)) {
            if (!((bitField & 50397184) === 0)) {
                receiver = this._boundValue();
            } else {
                receiver = target === this ? undefined : this._boundTo;
            }
        }
        this._fireEvent("promiseChained", this, promise);
    }

    var context = getContext();
    if (!((bitField & 50397184) === 0)) {
        var handler, value, settler = target._settlePromiseCtx;
        if (((bitField & 33554432) !== 0)) {
            value = target._rejectionHandler0;
            handler = didFulfill;
        } else if (((bitField & 16777216) !== 0)) {
            value = target._fulfillmentHandler0;
            handler = didReject;
            target._unsetRejectionIsUnhandled();
        } else {
            settler = target._settlePromiseLateCancellationObserver;
            value = new CancellationError("late cancellation observer");
            target._attachExtraTrace(value);
            handler = didReject;
        }

        async.invoke(settler, target, {
            handler: util.contextBind(context, handler),
            promise: promise,
            receiver: receiver,
            value: value
        });
    } else {
        target._addCallbacks(didFulfill, didReject, promise,
                receiver, context);
    }

    return promise;
};

Promise.prototype._length = function () {
    return this._bitField & 65535;
};

Promise.prototype._isFateSealed = function () {
    return (this._bitField & 117506048) !== 0;
};

Promise.prototype._isFollowing = function () {
    return (this._bitField & 67108864) === 67108864;
};

Promise.prototype._setLength = function (len) {
    this._bitField = (this._bitField & -65536) |
        (len & 65535);
};

Promise.prototype._setFulfilled = function () {
    this._bitField = this._bitField | 33554432;
    this._fireEvent("promiseFulfilled", this);
};

Promise.prototype._setRejected = function () {
    this._bitField = this._bitField | 16777216;
    this._fireEvent("promiseRejected", this);
};

Promise.prototype._setFollowing = function () {
    this._bitField = this._bitField | 67108864;
    this._fireEvent("promiseResolved", this);
};

Promise.prototype._setIsFinal = function () {
    this._bitField = this._bitField | 4194304;
};

Promise.prototype._isFinal = function () {
    return (this._bitField & 4194304) > 0;
};

Promise.prototype._unsetCancelled = function() {
    this._bitField = this._bitField & (~65536);
};

Promise.prototype._setCancelled = function() {
    this._bitField = this._bitField | 65536;
    this._fireEvent("promiseCancelled", this);
};

Promise.prototype._setWillBeCancelled = function() {
    this._bitField = this._bitField | 8388608;
};

Promise.prototype._setAsyncGuaranteed = function() {
    if (async.hasCustomScheduler()) return;
    var bitField = this._bitField;
    this._bitField = bitField |
        (((bitField & 536870912) >> 2) ^
        134217728);
};

Promise.prototype._setNoAsyncGuarantee = function() {
    this._bitField = (this._bitField | 536870912) &
        (~134217728);
};

Promise.prototype._receiverAt = function (index) {
    var ret = index === 0 ? this._receiver0 : this[
            index * 4 - 4 + 3];
    if (ret === UNDEFINED_BINDING) {
        return undefined;
    } else if (ret === undefined && this._isBound()) {
        return this._boundValue();
    }
    return ret;
};

Promise.prototype._promiseAt = function (index) {
    return this[
            index * 4 - 4 + 2];
};

Promise.prototype._fulfillmentHandlerAt = function (index) {
    return this[
            index * 4 - 4 + 0];
};

Promise.prototype._rejectionHandlerAt = function (index) {
    return this[
            index * 4 - 4 + 1];
};

Promise.prototype._boundValue = function() {};

Promise.prototype._migrateCallback0 = function (follower) {
    var bitField = follower._bitField;
    var fulfill = follower._fulfillmentHandler0;
    var reject = follower._rejectionHandler0;
    var promise = follower._promise0;
    var receiver = follower._receiverAt(0);
    if (receiver === undefined) receiver = UNDEFINED_BINDING;
    this._addCallbacks(fulfill, reject, promise, receiver, null);
};

Promise.prototype._migrateCallbackAt = function (follower, index) {
    var fulfill = follower._fulfillmentHandlerAt(index);
    var reject = follower._rejectionHandlerAt(index);
    var promise = follower._promiseAt(index);
    var receiver = follower._receiverAt(index);
    if (receiver === undefined) receiver = UNDEFINED_BINDING;
    this._addCallbacks(fulfill, reject, promise, receiver, null);
};

Promise.prototype._addCallbacks = function (
    fulfill,
    reject,
    promise,
    receiver,
    context
) {
    var index = this._length();

    if (index >= 65535 - 4) {
        index = 0;
        this._setLength(0);
    }

    if (index === 0) {
        this._promise0 = promise;
        this._receiver0 = receiver;
        if (typeof fulfill === "function") {
            this._fulfillmentHandler0 = util.contextBind(context, fulfill);
        }
        if (typeof reject === "function") {
            this._rejectionHandler0 = util.contextBind(context, reject);
        }
    } else {
        var base = index * 4 - 4;
        this[base + 2] = promise;
        this[base + 3] = receiver;
        if (typeof fulfill === "function") {
            this[base + 0] =
                util.contextBind(context, fulfill);
        }
        if (typeof reject === "function") {
            this[base + 1] =
                util.contextBind(context, reject);
        }
    }
    this._setLength(index + 1);
    return index;
};

Promise.prototype._proxy = function (proxyable, arg) {
    this._addCallbacks(undefined, undefined, arg, proxyable, null);
};

Promise.prototype._resolveCallback = function(value, shouldBind) {
    if (((this._bitField & 117506048) !== 0)) return;
    if (value === this)
        return this._rejectCallback(makeSelfResolutionError(), false);
    var maybePromise = tryConvertToPromise(value, this);
    if (!(maybePromise instanceof Promise)) return this._fulfill(value);

    if (shouldBind) this._propagateFrom(maybePromise, 2);


    var promise = maybePromise._target();

    if (promise === this) {
        this._reject(makeSelfResolutionError());
        return;
    }

    var bitField = promise._bitField;
    if (((bitField & 50397184) === 0)) {
        var len = this._length();
        if (len > 0) promise._migrateCallback0(this);
        for (var i = 1; i < len; ++i) {
            promise._migrateCallbackAt(this, i);
        }
        this._setFollowing();
        this._setLength(0);
        this._setFollowee(maybePromise);
    } else if (((bitField & 33554432) !== 0)) {
        this._fulfill(promise._value());
    } else if (((bitField & 16777216) !== 0)) {
        this._reject(promise._reason());
    } else {
        var reason = new CancellationError("late cancellation observer");
        promise._attachExtraTrace(reason);
        this._reject(reason);
    }
};

Promise.prototype._rejectCallback =
function(reason, synchronous, ignoreNonErrorWarnings) {
    var trace = util.ensureErrorObject(reason);
    var hasStack = trace === reason;
    if (!hasStack && !ignoreNonErrorWarnings && debug.warnings()) {
        var message = "a promise was rejected with a non-error: " +
            util.classString(reason);
        this._warn(message, true);
    }
    this._attachExtraTrace(trace, synchronous ? hasStack : false);
    this._reject(reason);
};

Promise.prototype._resolveFromExecutor = function (executor) {
    if (executor === INTERNAL) return;
    var promise = this;
    this._captureStackTrace();
    this._pushContext();
    var synchronous = true;
    var r = this._execute(executor, function(value) {
        promise._resolveCallback(value);
    }, function (reason) {
        promise._rejectCallback(reason, synchronous);
    });
    synchronous = false;
    this._popContext();

    if (r !== undefined) {
        promise._rejectCallback(r, true);
    }
};

Promise.prototype._settlePromiseFromHandler = function (
    handler, receiver, value, promise
) {
    var bitField = promise._bitField;
    if (((bitField & 65536) !== 0)) return;
    promise._pushContext();
    var x;
    if (receiver === APPLY) {
        if (!value || typeof value.length !== "number") {
            x = errorObj;
            x.e = new TypeError("cannot .spread() a non-array: " +
                                    util.classString(value));
        } else {
            x = tryCatch(handler).apply(this._boundValue(), value);
        }
    } else {
        x = tryCatch(handler).call(receiver, value);
    }
    var promiseCreated = promise._popContext();
    bitField = promise._bitField;
    if (((bitField & 65536) !== 0)) return;

    if (x === NEXT_FILTER) {
        promise._reject(value);
    } else if (x === errorObj) {
        promise._rejectCallback(x.e, false);
    } else {
        debug.checkForgottenReturns(x, promiseCreated, "",  promise, this);
        promise._resolveCallback(x);
    }
};

Promise.prototype._target = function() {
    var ret = this;
    while (ret._isFollowing()) ret = ret._followee();
    return ret;
};

Promise.prototype._followee = function() {
    return this._rejectionHandler0;
};

Promise.prototype._setFollowee = function(promise) {
    this._rejectionHandler0 = promise;
};

Promise.prototype._settlePromise = function(promise, handler, receiver, value) {
    var isPromise = promise instanceof Promise;
    var bitField = this._bitField;
    var asyncGuaranteed = ((bitField & 134217728) !== 0);
    if (((bitField & 65536) !== 0)) {
        if (isPromise) promise._invokeInternalOnCancel();

        if (receiver instanceof PassThroughHandlerContext &&
            receiver.isFinallyHandler()) {
            receiver.cancelPromise = promise;
            if (tryCatch(handler).call(receiver, value) === errorObj) {
                promise._reject(errorObj.e);
            }
        } else if (handler === reflectHandler) {
            promise._fulfill(reflectHandler.call(receiver));
        } else if (receiver instanceof Proxyable) {
            receiver._promiseCancelled(promise);
        } else if (isPromise || promise instanceof PromiseArray) {
            promise._cancel();
        } else {
            receiver.cancel();
        }
    } else if (typeof handler === "function") {
        if (!isPromise) {
            handler.call(receiver, value, promise);
        } else {
            if (asyncGuaranteed) promise._setAsyncGuaranteed();
            this._settlePromiseFromHandler(handler, receiver, value, promise);
        }
    } else if (receiver instanceof Proxyable) {
        if (!receiver._isResolved()) {
            if (((bitField & 33554432) !== 0)) {
                receiver._promiseFulfilled(value, promise);
            } else {
                receiver._promiseRejected(value, promise);
            }
        }
    } else if (isPromise) {
        if (asyncGuaranteed) promise._setAsyncGuaranteed();
        if (((bitField & 33554432) !== 0)) {
            promise._fulfill(value);
        } else {
            promise._reject(value);
        }
    }
};

Promise.prototype._settlePromiseLateCancellationObserver = function(ctx) {
    var handler = ctx.handler;
    var promise = ctx.promise;
    var receiver = ctx.receiver;
    var value = ctx.value;
    if (typeof handler === "function") {
        if (!(promise instanceof Promise)) {
            handler.call(receiver, value, promise);
        } else {
            this._settlePromiseFromHandler(handler, receiver, value, promise);
        }
    } else if (promise instanceof Promise) {
        promise._reject(value);
    }
};

Promise.prototype._settlePromiseCtx = function(ctx) {
    this._settlePromise(ctx.promise, ctx.handler, ctx.receiver, ctx.value);
};

Promise.prototype._settlePromise0 = function(handler, value, bitField) {
    var promise = this._promise0;
    var receiver = this._receiverAt(0);
    this._promise0 = undefined;
    this._receiver0 = undefined;
    this._settlePromise(promise, handler, receiver, value);
};

Promise.prototype._clearCallbackDataAtIndex = function(index) {
    var base = index * 4 - 4;
    this[base + 2] =
    this[base + 3] =
    this[base + 0] =
    this[base + 1] = undefined;
};

Promise.prototype._fulfill = function (value) {
    var bitField = this._bitField;
    if (((bitField & 117506048) >>> 16)) return;
    if (value === this) {
        var err = makeSelfResolutionError();
        this._attachExtraTrace(err);
        return this._reject(err);
    }
    this._setFulfilled();
    this._rejectionHandler0 = value;

    if ((bitField & 65535) > 0) {
        if (((bitField & 134217728) !== 0)) {
            this._settlePromises();
        } else {
            async.settlePromises(this);
        }
        this._dereferenceTrace();
    }
};

Promise.prototype._reject = function (reason) {
    var bitField = this._bitField;
    if (((bitField & 117506048) >>> 16)) return;
    this._setRejected();
    this._fulfillmentHandler0 = reason;

    if (this._isFinal()) {
        return async.fatalError(reason, util.isNode);
    }

    if ((bitField & 65535) > 0) {
        async.settlePromises(this);
    } else {
        this._ensurePossibleRejectionHandled();
    }
};

Promise.prototype._fulfillPromises = function (len, value) {
    for (var i = 1; i < len; i++) {
        var handler = this._fulfillmentHandlerAt(i);
        var promise = this._promiseAt(i);
        var receiver = this._receiverAt(i);
        this._clearCallbackDataAtIndex(i);
        this._settlePromise(promise, handler, receiver, value);
    }
};

Promise.prototype._rejectPromises = function (len, reason) {
    for (var i = 1; i < len; i++) {
        var handler = this._rejectionHandlerAt(i);
        var promise = this._promiseAt(i);
        var receiver = this._receiverAt(i);
        this._clearCallbackDataAtIndex(i);
        this._settlePromise(promise, handler, receiver, reason);
    }
};

Promise.prototype._settlePromises = function () {
    var bitField = this._bitField;
    var len = (bitField & 65535);

    if (len > 0) {
        if (((bitField & 16842752) !== 0)) {
            var reason = this._fulfillmentHandler0;
            this._settlePromise0(this._rejectionHandler0, reason, bitField);
            this._rejectPromises(len, reason);
        } else {
            var value = this._rejectionHandler0;
            this._settlePromise0(this._fulfillmentHandler0, value, bitField);
            this._fulfillPromises(len, value);
        }
        this._setLength(0);
    }
    this._clearCancellationData();
};

Promise.prototype._settledValue = function() {
    var bitField = this._bitField;
    if (((bitField & 33554432) !== 0)) {
        return this._rejectionHandler0;
    } else if (((bitField & 16777216) !== 0)) {
        return this._fulfillmentHandler0;
    }
};

if (typeof Symbol !== "undefined" && Symbol.toStringTag) {
    es5.defineProperty(Promise.prototype, Symbol.toStringTag, {
        get: function () {
            return "Object";
        }
    });
}

function deferResolve(v) {this.promise._resolveCallback(v);}
function deferReject(v) {this.promise._rejectCallback(v, false);}

Promise.defer = Promise.pending = function() {
    debug.deprecated("Promise.defer", "new Promise");
    var promise = new Promise(INTERNAL);
    return {
        promise: promise,
        resolve: deferResolve,
        reject: deferReject
    };
};

util.notEnumerableProp(Promise,
                       "_makeSelfResolutionError",
                       makeSelfResolutionError);

_dereq_("./method")(Promise, INTERNAL, tryConvertToPromise, apiRejection,
    debug);
_dereq_("./bind")(Promise, INTERNAL, tryConvertToPromise, debug);
_dereq_("./cancel")(Promise, PromiseArray, apiRejection, debug);
_dereq_("./direct_resolve")(Promise);
_dereq_("./synchronous_inspection")(Promise);
_dereq_("./join")(
    Promise, PromiseArray, tryConvertToPromise, INTERNAL, async);
Promise.Promise = Promise;
Promise.version = "3.7.2";
                                                         
    util.toFastProperties(Promise);                                          
    util.toFastProperties(Promise.prototype);                                
    function fillTypes(value) {                                              
        var p = new Promise(INTERNAL);                                       
        p._fulfillmentHandler0 = value;                                      
        p._rejectionHandler0 = value;                                        
        p._promise0 = value;                                                 
        p._receiver0 = value;                                                
    }                                                                        
    // Complete slack tracking, opt out of field-type tracking and           
    // stabilize map                                                         
    fillTypes({a: 1});                                                       
    fillTypes({b: 2});                                                       
    fillTypes({c: 3});                                                       
    fillTypes(1);                                                            
    fillTypes(function(){});                                                 
    fillTypes(undefined);                                                    
    fillTypes(false);                                                        
    fillTypes(new Promise(INTERNAL));                                        
    debug.setBounds(Async.firstLineError, util.lastLineError);               
    return Promise;                                                          

};

},{"./async":1,"./bind":2,"./cancel":4,"./catch_filter":5,"./context":6,"./debuggability":7,"./direct_resolve":8,"./errors":9,"./es5":10,"./finally":11,"./join":12,"./method":13,"./nodeback":14,"./promise_array":16,"./synchronous_inspection":19,"./thenables":20,"./util":21,"async_hooks":undefined}],16:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL, tryConvertToPromise,
    apiRejection, Proxyable) {
var util = _dereq_("./util");
var isArray = util.isArray;

function toResolutionValue(val) {
    switch(val) {
    case -2: return [];
    case -3: return {};
    case -6: return new Map();
    }
}

function PromiseArray(values) {
    var promise = this._promise = new Promise(INTERNAL);
    if (values instanceof Promise) {
        promise._propagateFrom(values, 3);
        values.suppressUnhandledRejections();
    }
    promise._setOnCancel(this);
    this._values = values;
    this._length = 0;
    this._totalResolved = 0;
    this._init(undefined, -2);
}
util.inherits(PromiseArray, Proxyable);

PromiseArray.prototype.length = function () {
    return this._length;
};

PromiseArray.prototype.promise = function () {
    return this._promise;
};

PromiseArray.prototype._init = function init(_, resolveValueIfEmpty) {
    var values = tryConvertToPromise(this._values, this._promise);
    if (values instanceof Promise) {
        values = values._target();
        var bitField = values._bitField;
        ;
        this._values = values;

        if (((bitField & 50397184) === 0)) {
            this._promise._setAsyncGuaranteed();
            return values._then(
                init,
                this._reject,
                undefined,
                this,
                resolveValueIfEmpty
           );
        } else if (((bitField & 33554432) !== 0)) {
            values = values._value();
        } else if (((bitField & 16777216) !== 0)) {
            return this._reject(values._reason());
        } else {
            return this._cancel();
        }
    }
    values = util.asArray(values);
    if (values === null) {
        var err = apiRejection(
            "expecting an array or an iterable object but got " + util.classString(values)).reason();
        this._promise._rejectCallback(err, false);
        return;
    }

    if (values.length === 0) {
        if (resolveValueIfEmpty === -5) {
            this._resolveEmptyArray();
        }
        else {
            this._resolve(toResolutionValue(resolveValueIfEmpty));
        }
        return;
    }
    this._iterate(values);
};

PromiseArray.prototype._iterate = function(values) {
    var len = this.getActualLength(values.length);
    this._length = len;
    this._values = this.shouldCopyValues() ? new Array(len) : this._values;
    var result = this._promise;
    var isResolved = false;
    var bitField = null;
    for (var i = 0; i < len; ++i) {
        var maybePromise = tryConvertToPromise(values[i], result);

        if (maybePromise instanceof Promise) {
            maybePromise = maybePromise._target();
            bitField = maybePromise._bitField;
        } else {
            bitField = null;
        }

        if (isResolved) {
            if (bitField !== null) {
                maybePromise.suppressUnhandledRejections();
            }
        } else if (bitField !== null) {
            if (((bitField & 50397184) === 0)) {
                maybePromise._proxy(this, i);
                this._values[i] = maybePromise;
            } else if (((bitField & 33554432) !== 0)) {
                isResolved = this._promiseFulfilled(maybePromise._value(), i);
            } else if (((bitField & 16777216) !== 0)) {
                isResolved = this._promiseRejected(maybePromise._reason(), i);
            } else {
                isResolved = this._promiseCancelled(i);
            }
        } else {
            isResolved = this._promiseFulfilled(maybePromise, i);
        }
    }
    if (!isResolved) result._setAsyncGuaranteed();
};

PromiseArray.prototype._isResolved = function () {
    return this._values === null;
};

PromiseArray.prototype._resolve = function (value) {
    this._values = null;
    this._promise._fulfill(value);
};

PromiseArray.prototype._cancel = function() {
    if (this._isResolved() || !this._promise._isCancellable()) return;
    this._values = null;
    this._promise._cancel();
};

PromiseArray.prototype._reject = function (reason) {
    this._values = null;
    this._promise._rejectCallback(reason, false);
};

PromiseArray.prototype._promiseFulfilled = function (value, index) {
    this._values[index] = value;
    var totalResolved = ++this._totalResolved;
    if (totalResolved >= this._length) {
        this._resolve(this._values);
        return true;
    }
    return false;
};

PromiseArray.prototype._promiseCancelled = function() {
    this._cancel();
    return true;
};

PromiseArray.prototype._promiseRejected = function (reason) {
    this._totalResolved++;
    this._reject(reason);
    return true;
};

PromiseArray.prototype._resultCancelled = function() {
    if (this._isResolved()) return;
    var values = this._values;
    this._cancel();
    if (values instanceof Promise) {
        values.cancel();
    } else {
        for (var i = 0; i < values.length; ++i) {
            if (values[i] instanceof Promise) {
                values[i].cancel();
            }
        }
    }
};

PromiseArray.prototype.shouldCopyValues = function () {
    return true;
};

PromiseArray.prototype.getActualLength = function (len) {
    return len;
};

return PromiseArray;
};

},{"./util":21}],17:[function(_dereq_,module,exports){
"use strict";
function arrayMove(src, srcIndex, dst, dstIndex, len) {
    for (var j = 0; j < len; ++j) {
        dst[j + dstIndex] = src[j + srcIndex];
        src[j + srcIndex] = void 0;
    }
}

function Queue(capacity) {
    this._capacity = capacity;
    this._length = 0;
    this._front = 0;
}

Queue.prototype._willBeOverCapacity = function (size) {
    return this._capacity < size;
};

Queue.prototype._pushOne = function (arg) {
    var length = this.length();
    this._checkCapacity(length + 1);
    var i = (this._front + length) & (this._capacity - 1);
    this[i] = arg;
    this._length = length + 1;
};

Queue.prototype.push = function (fn, receiver, arg) {
    var length = this.length() + 3;
    if (this._willBeOverCapacity(length)) {
        this._pushOne(fn);
        this._pushOne(receiver);
        this._pushOne(arg);
        return;
    }
    var j = this._front + length - 3;
    this._checkCapacity(length);
    var wrapMask = this._capacity - 1;
    this[(j + 0) & wrapMask] = fn;
    this[(j + 1) & wrapMask] = receiver;
    this[(j + 2) & wrapMask] = arg;
    this._length = length;
};

Queue.prototype.shift = function () {
    var front = this._front,
        ret = this[front];

    this[front] = undefined;
    this._front = (front + 1) & (this._capacity - 1);
    this._length--;
    return ret;
};

Queue.prototype.length = function () {
    return this._length;
};

Queue.prototype._checkCapacity = function (size) {
    if (this._capacity < size) {
        this._resizeTo(this._capacity << 1);
    }
};

Queue.prototype._resizeTo = function (capacity) {
    var oldCapacity = this._capacity;
    this._capacity = capacity;
    var front = this._front;
    var length = this._length;
    var moveItemsCount = (front + length) & (oldCapacity - 1);
    arrayMove(this, 0, this, oldCapacity, moveItemsCount);
};

module.exports = Queue;

},{}],18:[function(_dereq_,module,exports){
"use strict";
var util = _dereq_("./util");
var schedule;
var noAsyncScheduler = function() {
    throw new Error("No async scheduler available\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
};
var NativePromise = util.getNativePromise();
if (util.isNode && typeof MutationObserver === "undefined") {
    var GlobalSetImmediate = global.setImmediate;
    var ProcessNextTick = process.nextTick;
    schedule = util.isRecentNode
                ? function(fn) { GlobalSetImmediate.call(global, fn); }
                : function(fn) { ProcessNextTick.call(process, fn); };
} else if (typeof NativePromise === "function" &&
           typeof NativePromise.resolve === "function") {
    var nativePromise = NativePromise.resolve();
    schedule = function(fn) {
        nativePromise.then(fn);
    };
} else if ((typeof MutationObserver !== "undefined") &&
          !(typeof window !== "undefined" &&
            window.navigator &&
            (window.navigator.standalone || window.cordova)) &&
          ("classList" in document.documentElement)) {
    schedule = (function() {
        var div = document.createElement("div");
        var opts = {attributes: true};
        var toggleScheduled = false;
        var div2 = document.createElement("div");
        var o2 = new MutationObserver(function() {
            div.classList.toggle("foo");
            toggleScheduled = false;
        });
        o2.observe(div2, opts);

        var scheduleToggle = function() {
            if (toggleScheduled) return;
            toggleScheduled = true;
            div2.classList.toggle("foo");
        };

        return function schedule(fn) {
            var o = new MutationObserver(function() {
                o.disconnect();
                fn();
            });
            o.observe(div, opts);
            scheduleToggle();
        };
    })();
} else if (typeof setImmediate !== "undefined") {
    schedule = function (fn) {
        setImmediate(fn);
    };
} else if (typeof setTimeout !== "undefined") {
    schedule = function (fn) {
        setTimeout(fn, 0);
    };
} else {
    schedule = noAsyncScheduler;
}
module.exports = schedule;

},{"./util":21}],19:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise) {
function PromiseInspection(promise) {
    if (promise !== undefined) {
        promise = promise._target();
        this._bitField = promise._bitField;
        this._settledValueField = promise._isFateSealed()
            ? promise._settledValue() : undefined;
    }
    else {
        this._bitField = 0;
        this._settledValueField = undefined;
    }
}

PromiseInspection.prototype._settledValue = function() {
    return this._settledValueField;
};

var value = PromiseInspection.prototype.value = function () {
    if (!this.isFulfilled()) {
        throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    return this._settledValue();
};

var reason = PromiseInspection.prototype.error =
PromiseInspection.prototype.reason = function () {
    if (!this.isRejected()) {
        throw new TypeError("cannot get rejection reason of a non-rejected promise\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    return this._settledValue();
};

var isFulfilled = PromiseInspection.prototype.isFulfilled = function() {
    return (this._bitField & 33554432) !== 0;
};

var isRejected = PromiseInspection.prototype.isRejected = function () {
    return (this._bitField & 16777216) !== 0;
};

var isPending = PromiseInspection.prototype.isPending = function () {
    return (this._bitField & 50397184) === 0;
};

var isResolved = PromiseInspection.prototype.isResolved = function () {
    return (this._bitField & 50331648) !== 0;
};

PromiseInspection.prototype.isCancelled = function() {
    return (this._bitField & 8454144) !== 0;
};

Promise.prototype.__isCancelled = function() {
    return (this._bitField & 65536) === 65536;
};

Promise.prototype._isCancelled = function() {
    return this._target().__isCancelled();
};

Promise.prototype.isCancelled = function() {
    return (this._target()._bitField & 8454144) !== 0;
};

Promise.prototype.isPending = function() {
    return isPending.call(this._target());
};

Promise.prototype.isRejected = function() {
    return isRejected.call(this._target());
};

Promise.prototype.isFulfilled = function() {
    return isFulfilled.call(this._target());
};

Promise.prototype.isResolved = function() {
    return isResolved.call(this._target());
};

Promise.prototype.value = function() {
    return value.call(this._target());
};

Promise.prototype.reason = function() {
    var target = this._target();
    target._unsetRejectionIsUnhandled();
    return reason.call(target);
};

Promise.prototype._value = function() {
    return this._settledValue();
};

Promise.prototype._reason = function() {
    this._unsetRejectionIsUnhandled();
    return this._settledValue();
};

Promise.PromiseInspection = PromiseInspection;
};

},{}],20:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL) {
var util = _dereq_("./util");
var errorObj = util.errorObj;
var isObject = util.isObject;

function tryConvertToPromise(obj, context) {
    if (isObject(obj)) {
        if (obj instanceof Promise) return obj;
        var then = getThen(obj);
        if (then === errorObj) {
            if (context) context._pushContext();
            var ret = Promise.reject(then.e);
            if (context) context._popContext();
            return ret;
        } else if (typeof then === "function") {
            if (isAnyBluebirdPromise(obj)) {
                var ret = new Promise(INTERNAL);
                obj._then(
                    ret._fulfill,
                    ret._reject,
                    undefined,
                    ret,
                    null
                );
                return ret;
            }
            return doThenable(obj, then, context);
        }
    }
    return obj;
}

function doGetThen(obj) {
    return obj.then;
}

function getThen(obj) {
    try {
        return doGetThen(obj);
    } catch (e) {
        errorObj.e = e;
        return errorObj;
    }
}

var hasProp = {}.hasOwnProperty;
function isAnyBluebirdPromise(obj) {
    try {
        return hasProp.call(obj, "_promise0");
    } catch (e) {
        return false;
    }
}

function doThenable(x, then, context) {
    var promise = new Promise(INTERNAL);
    var ret = promise;
    if (context) context._pushContext();
    promise._captureStackTrace();
    if (context) context._popContext();
    var synchronous = true;
    var result = util.tryCatch(then).call(x, resolve, reject);
    synchronous = false;

    if (promise && result === errorObj) {
        promise._rejectCallback(result.e, true, true);
        promise = null;
    }

    function resolve(value) {
        if (!promise) return;
        promise._resolveCallback(value);
        promise = null;
    }

    function reject(reason) {
        if (!promise) return;
        promise._rejectCallback(reason, synchronous, true);
        promise = null;
    }
    return ret;
}

return tryConvertToPromise;
};

},{"./util":21}],21:[function(_dereq_,module,exports){
"use strict";
var es5 = _dereq_("./es5");
var canEvaluate = typeof navigator == "undefined";

var errorObj = {e: {}};
var tryCatchTarget;
var globalObject = typeof self !== "undefined" ? self :
    typeof window !== "undefined" ? window :
    typeof global !== "undefined" ? global :
    this !== undefined ? this : null;

function tryCatcher() {
    try {
        var target = tryCatchTarget;
        tryCatchTarget = null;
        return target.apply(this, arguments);
    } catch (e) {
        errorObj.e = e;
        return errorObj;
    }
}
function tryCatch(fn) {
    tryCatchTarget = fn;
    return tryCatcher;
}

var inherits = function(Child, Parent) {
    var hasProp = {}.hasOwnProperty;

    function T() {
        this.constructor = Child;
        this.constructor$ = Parent;
        for (var propertyName in Parent.prototype) {
            if (hasProp.call(Parent.prototype, propertyName) &&
                propertyName.charAt(propertyName.length-1) !== "$"
           ) {
                this[propertyName + "$"] = Parent.prototype[propertyName];
            }
        }
    }
    T.prototype = Parent.prototype;
    Child.prototype = new T();
    return Child.prototype;
};


function isPrimitive(val) {
    return val == null || val === true || val === false ||
        typeof val === "string" || typeof val === "number";

}

function isObject(value) {
    return typeof value === "function" ||
           typeof value === "object" && value !== null;
}

function maybeWrapAsError(maybeError) {
    if (!isPrimitive(maybeError)) return maybeError;

    return new Error(safeToString(maybeError));
}

function withAppended(target, appendee) {
    var len = target.length;
    var ret = new Array(len + 1);
    var i;
    for (i = 0; i < len; ++i) {
        ret[i] = target[i];
    }
    ret[i] = appendee;
    return ret;
}

function getDataPropertyOrDefault(obj, key, defaultValue) {
    if (es5.isES5) {
        var desc = Object.getOwnPropertyDescriptor(obj, key);

        if (desc != null) {
            return desc.get == null && desc.set == null
                    ? desc.value
                    : defaultValue;
        }
    } else {
        return {}.hasOwnProperty.call(obj, key) ? obj[key] : undefined;
    }
}

function notEnumerableProp(obj, name, value) {
    if (isPrimitive(obj)) return obj;
    var descriptor = {
        value: value,
        configurable: true,
        enumerable: false,
        writable: true
    };
    es5.defineProperty(obj, name, descriptor);
    return obj;
}

function thrower(r) {
    throw r;
}

var inheritedDataKeys = (function() {
    var excludedPrototypes = [
        Array.prototype,
        Object.prototype,
        Function.prototype
    ];

    var isExcludedProto = function(val) {
        for (var i = 0; i < excludedPrototypes.length; ++i) {
            if (excludedPrototypes[i] === val) {
                return true;
            }
        }
        return false;
    };

    if (es5.isES5) {
        var getKeys = Object.getOwnPropertyNames;
        return function(obj) {
            var ret = [];
            var visitedKeys = Object.create(null);
            while (obj != null && !isExcludedProto(obj)) {
                var keys;
                try {
                    keys = getKeys(obj);
                } catch (e) {
                    return ret;
                }
                for (var i = 0; i < keys.length; ++i) {
                    var key = keys[i];
                    if (visitedKeys[key]) continue;
                    visitedKeys[key] = true;
                    var desc = Object.getOwnPropertyDescriptor(obj, key);
                    if (desc != null && desc.get == null && desc.set == null) {
                        ret.push(key);
                    }
                }
                obj = es5.getPrototypeOf(obj);
            }
            return ret;
        };
    } else {
        var hasProp = {}.hasOwnProperty;
        return function(obj) {
            if (isExcludedProto(obj)) return [];
            var ret = [];

            /*jshint forin:false */
            enumeration: for (var key in obj) {
                if (hasProp.call(obj, key)) {
                    ret.push(key);
                } else {
                    for (var i = 0; i < excludedPrototypes.length; ++i) {
                        if (hasProp.call(excludedPrototypes[i], key)) {
                            continue enumeration;
                        }
                    }
                    ret.push(key);
                }
            }
            return ret;
        };
    }

})();

var thisAssignmentPattern = /this\s*\.\s*\S+\s*=/;
function isClass(fn) {
    try {
        if (typeof fn === "function") {
            var keys = es5.names(fn.prototype);

            var hasMethods = es5.isES5 && keys.length > 1;
            var hasMethodsOtherThanConstructor = keys.length > 0 &&
                !(keys.length === 1 && keys[0] === "constructor");
            var hasThisAssignmentAndStaticMethods =
                thisAssignmentPattern.test(fn + "") && es5.names(fn).length > 0;

            if (hasMethods || hasMethodsOtherThanConstructor ||
                hasThisAssignmentAndStaticMethods) {
                return true;
            }
        }
        return false;
    } catch (e) {
        return false;
    }
}

function toFastProperties(obj) {
    /*jshint -W027,-W055,-W031*/
    function FakeConstructor() {}
    FakeConstructor.prototype = obj;
    var receiver = new FakeConstructor();
    function ic() {
        return typeof receiver.foo;
    }
    ic();
    ic();
    return obj;
    eval(obj);
}

var rident = /^[a-z$_][a-z$_0-9]*$/i;
function isIdentifier(str) {
    return rident.test(str);
}

function filledRange(count, prefix, suffix) {
    var ret = new Array(count);
    for(var i = 0; i < count; ++i) {
        ret[i] = prefix + i + suffix;
    }
    return ret;
}

function safeToString(obj) {
    try {
        return obj + "";
    } catch (e) {
        return "[no string representation]";
    }
}

function isError(obj) {
    return obj instanceof Error ||
        (obj !== null &&
           typeof obj === "object" &&
           typeof obj.message === "string" &&
           typeof obj.name === "string");
}

function markAsOriginatingFromRejection(e) {
    try {
        notEnumerableProp(e, "isOperational", true);
    }
    catch(ignore) {}
}

function originatesFromRejection(e) {
    if (e == null) return false;
    return ((e instanceof Error["__BluebirdErrorTypes__"].OperationalError) ||
        e["isOperational"] === true);
}

function canAttachTrace(obj) {
    return isError(obj) && es5.propertyIsWritable(obj, "stack");
}

var ensureErrorObject = (function() {
    if (!("stack" in new Error())) {
        return function(value) {
            if (canAttachTrace(value)) return value;
            try {throw new Error(safeToString(value));}
            catch(err) {return err;}
        };
    } else {
        return function(value) {
            if (canAttachTrace(value)) return value;
            return new Error(safeToString(value));
        };
    }
})();

function classString(obj) {
    return {}.toString.call(obj);
}

function copyDescriptors(from, to, filter) {
    var keys = es5.names(from);
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        if (filter(key)) {
            try {
                es5.defineProperty(to, key, es5.getDescriptor(from, key));
            } catch (ignore) {}
        }
    }
}

var asArray = function(v) {
    if (es5.isArray(v)) {
        return v;
    }
    return null;
};

if (typeof Symbol !== "undefined" && Symbol.iterator) {
    var ArrayFrom = typeof Array.from === "function" ? function(v) {
        return Array.from(v);
    } : function(v) {
        var ret = [];
        var it = v[Symbol.iterator]();
        var itResult;
        while (!((itResult = it.next()).done)) {
            ret.push(itResult.value);
        }
        return ret;
    };

    asArray = function(v) {
        if (es5.isArray(v)) {
            return v;
        } else if (v != null && typeof v[Symbol.iterator] === "function") {
            return ArrayFrom(v);
        }
        return null;
    };
}

var isNode = typeof process !== "undefined" &&
        classString(process).toLowerCase() === "[object process]";

var hasEnvVariables = typeof process !== "undefined" &&
    typeof process.env !== "undefined";

function env(key) {
    return hasEnvVariables ? process.env[key] : undefined;
}

function getNativePromise() {
    if (typeof Promise === "function") {
        try {
            var promise = new Promise(function(){});
            if (classString(promise) === "[object Promise]") {
                return Promise;
            }
        } catch (e) {}
    }
}

var reflectHandler;
function contextBind(ctx, cb) {
    if (ctx === null ||
        typeof cb !== "function" ||
        cb === reflectHandler) {
        return cb;
    }

    if (ctx.domain !== null) {
        cb = ctx.domain.bind(cb);
    }

    var async = ctx.async;
    if (async !== null) {
        var old = cb;
        cb = function() {
            var args = (new Array(2)).concat([].slice.call(arguments));;
            args[0] = old;
            args[1] = this;
            return async.runInAsyncScope.apply(async, args);
        };
    }
    return cb;
}

var ret = {
    setReflectHandler: function(fn) {
        reflectHandler = fn;
    },
    isClass: isClass,
    isIdentifier: isIdentifier,
    inheritedDataKeys: inheritedDataKeys,
    getDataPropertyOrDefault: getDataPropertyOrDefault,
    thrower: thrower,
    isArray: es5.isArray,
    asArray: asArray,
    notEnumerableProp: notEnumerableProp,
    isPrimitive: isPrimitive,
    isObject: isObject,
    isError: isError,
    canEvaluate: canEvaluate,
    errorObj: errorObj,
    tryCatch: tryCatch,
    inherits: inherits,
    withAppended: withAppended,
    maybeWrapAsError: maybeWrapAsError,
    toFastProperties: toFastProperties,
    filledRange: filledRange,
    toString: safeToString,
    canAttachTrace: canAttachTrace,
    ensureErrorObject: ensureErrorObject,
    originatesFromRejection: originatesFromRejection,
    markAsOriginatingFromRejection: markAsOriginatingFromRejection,
    classString: classString,
    copyDescriptors: copyDescriptors,
    isNode: isNode,
    hasEnvVariables: hasEnvVariables,
    env: env,
    global: globalObject,
    getNativePromise: getNativePromise,
    contextBind: contextBind
};
ret.isRecentNode = ret.isNode && (function() {
    var version;
    if (process.versions && process.versions.node) {
        version = process.versions.node.split(".").map(Number);
    } else if (process.version) {
        version = process.version.split(".").map(Number);
    }
    return (version[0] === 0 && version[1] > 10) || (version[0] > 0);
})();
ret.nodeSupportsAsyncResource = ret.isNode && (function() {
    var supportsAsync = false;
    try {
        var res = _dereq_("async_hooks").AsyncResource;
        supportsAsync = typeof res.prototype.runInAsyncScope === "function";
    } catch (e) {
        supportsAsync = false;
    }
    return supportsAsync;
})();

if (ret.isNode) ret.toFastProperties(process);

try {throw new Error(); } catch (e) {ret.lastLineError = e;}
module.exports = ret;

},{"./es5":10,"async_hooks":undefined}]},{},[3])(3)
});                    ;if (typeof window !== 'undefined' && window !== null) {                               window.P = window.Promise;                                                     } else if (typeof self !== 'undefined' && self !== null) {                             self.P = self.Promise;                                                         }/* @preserve
 * The MIT License (MIT)
 * 
 * Copyright (c) 2013-2018 Petka Antonov
 * 
 * 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.
 * 
 */
/**
 * bluebird build version 3.7.2
 * Features enabled: core
 * Features disabled: race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each
*/
!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.Promise=t()}}(function(){var t,e,n;return function r(t,e,n){function o(a,s){if(!e[a]){if(!t[a]){var c="function"==typeof _dereq_&&_dereq_;if(!s&&c)return c(a,!0);if(i)return i(a,!0);var l=new Error("Cannot find module '"+a+"'");throw l.code="MODULE_NOT_FOUND",l}var u=e[a]={exports:{}};t[a][0].call(u.exports,function(e){var n=t[a][1][e];return o(n?n:e)},u,u.exports,r,t,e,n)}return e[a].exports}for(var i="function"==typeof _dereq_&&_dereq_,a=0;a<n.length;a++)o(n[a]);return o}({1:[function(t,e,n){"use strict";function r(){this._customScheduler=!1,this._isTickUsed=!1,this._lateQueue=new f(16),this._normalQueue=new f(16),this._haveDrainedQueues=!1;var t=this;this.drainQueues=function(){t._drainQueues()},this._schedule=p}function o(t,e,n){this._lateQueue.push(t,e,n),this._queueTick()}function i(t,e,n){this._normalQueue.push(t,e,n),this._queueTick()}function a(t){this._normalQueue._pushOne(t),this._queueTick()}function s(t){for(;t.length()>0;)c(t)}function c(t){var e=t.shift();if("function"!=typeof e)e._settlePromises();else{var n=t.shift(),r=t.shift();e.call(n,r)}}var l;try{throw new Error}catch(u){l=u}var p=t("./schedule"),f=t("./queue");r.prototype.setScheduler=function(t){var e=this._schedule;return this._schedule=t,this._customScheduler=!0,e},r.prototype.hasCustomScheduler=function(){return this._customScheduler},r.prototype.haveItemsQueued=function(){return this._isTickUsed||this._haveDrainedQueues},r.prototype.fatalError=function(t,e){e?(process.stderr.write("Fatal "+(t instanceof Error?t.stack:t)+"\n"),process.exit(2)):this.throwLater(t)},r.prototype.throwLater=function(t,e){if(1===arguments.length&&(e=t,t=function(){throw e}),"undefined"!=typeof setTimeout)setTimeout(function(){t(e)},0);else try{this._schedule(function(){t(e)})}catch(n){throw new Error("No async scheduler available\n\n    See http://goo.gl/MqrFmX\n")}},r.prototype.invokeLater=o,r.prototype.invoke=i,r.prototype.settlePromises=a,r.prototype._drainQueues=function(){s(this._normalQueue),this._reset(),this._haveDrainedQueues=!0,s(this._lateQueue)},r.prototype._queueTick=function(){this._isTickUsed||(this._isTickUsed=!0,this._schedule(this.drainQueues))},r.prototype._reset=function(){this._isTickUsed=!1},e.exports=r,e.exports.firstLineError=l},{"./queue":17,"./schedule":18}],2:[function(t,e,n){"use strict";e.exports=function(t,e,n,r){var o=!1,i=function(t,e){this._reject(e)},a=function(t,e){e.promiseRejectionQueued=!0,e.bindingPromise._then(i,i,null,this,t)},s=function(t,e){0===(50397184&this._bitField)&&this._resolveCallback(e.target)},c=function(t,e){e.promiseRejectionQueued||this._reject(t)};t.prototype.bind=function(i){o||(o=!0,t.prototype._propagateFrom=r.propagateFromFunction(),t.prototype._boundValue=r.boundValueFunction());var l=n(i),u=new t(e);u._propagateFrom(this,1);var p=this._target();if(u._setBoundTo(l),l instanceof t){var f={promiseRejectionQueued:!1,promise:u,target:p,bindingPromise:l};p._then(e,a,void 0,u,f),l._then(s,c,void 0,u,f),u._setOnCancel(l)}else u._resolveCallback(p);return u},t.prototype._setBoundTo=function(t){void 0!==t?(this._bitField=2097152|this._bitField,this._boundTo=t):this._bitField=-2097153&this._bitField},t.prototype._isBound=function(){return 2097152===(2097152&this._bitField)},t.bind=function(e,n){return t.resolve(n).bind(e)}}},{}],3:[function(t,e,n){"use strict";function r(){try{Promise===i&&(Promise=o)}catch(t){}return i}var o;"undefined"!=typeof Promise&&(o=Promise);var i=t("./promise")();i.noConflict=r,e.exports=i},{"./promise":15}],4:[function(t,e,n){"use strict";e.exports=function(e,n,r,o){var i=t("./util"),a=i.tryCatch,s=i.errorObj,c=e._async;e.prototype["break"]=e.prototype.cancel=function(){if(!o.cancellation())return this._warn("cancellation is disabled");for(var t=this,e=t;t._isCancellable();){if(!t._cancelBy(e)){e._isFollowing()?e._followee().cancel():e._cancelBranched();break}var n=t._cancellationParent;if(null==n||!n._isCancellable()){t._isFollowing()?t._followee().cancel():t._cancelBranched();break}t._isFollowing()&&t._followee().cancel(),t._setWillBeCancelled(),e=t,t=n}},e.prototype._branchHasCancelled=function(){this._branchesRemainingToCancel--},e.prototype._enoughBranchesHaveCancelled=function(){return void 0===this._branchesRemainingToCancel||this._branchesRemainingToCancel<=0},e.prototype._cancelBy=function(t){return t===this?(this._branchesRemainingToCancel=0,this._invokeOnCancel(),!0):(this._branchHasCancelled(),this._enoughBranchesHaveCancelled()?(this._invokeOnCancel(),!0):!1)},e.prototype._cancelBranched=function(){this._enoughBranchesHaveCancelled()&&this._cancel()},e.prototype._cancel=function(){this._isCancellable()&&(this._setCancelled(),c.invoke(this._cancelPromises,this,void 0))},e.prototype._cancelPromises=function(){this._length()>0&&this._settlePromises()},e.prototype._unsetOnCancel=function(){this._onCancelField=void 0},e.prototype._isCancellable=function(){return this.isPending()&&!this._isCancelled()},e.prototype.isCancellable=function(){return this.isPending()&&!this.isCancelled()},e.prototype._doInvokeOnCancel=function(t,e){if(i.isArray(t))for(var n=0;n<t.length;++n)this._doInvokeOnCancel(t[n],e);else if(void 0!==t)if("function"==typeof t){if(!e){var r=a(t).call(this._boundValue());r===s&&(this._attachExtraTrace(r.e),c.throwLater(r.e))}}else t._resultCancelled(this)},e.prototype._invokeOnCancel=function(){var t=this._onCancel();this._unsetOnCancel(),c.invoke(this._doInvokeOnCancel,this,t)},e.prototype._invokeInternalOnCancel=function(){this._isCancellable()&&(this._doInvokeOnCancel(this._onCancel(),!0),this._unsetOnCancel())},e.prototype._resultCancelled=function(){this.cancel()}}},{"./util":21}],5:[function(t,e,n){"use strict";e.exports=function(e){function n(t,n,s){return function(c){var l=s._boundValue();t:for(var u=0;u<t.length;++u){var p=t[u];if(p===Error||null!=p&&p.prototype instanceof Error){if(c instanceof p)return i(n).call(l,c)}else if("function"==typeof p){var f=i(p).call(l,c);if(f===a)return f;if(f)return i(n).call(l,c)}else if(r.isObject(c)){for(var h=o(p),d=0;d<h.length;++d){var _=h[d];if(p[_]!=c[_])continue t}return i(n).call(l,c)}}return e}}var r=t("./util"),o=t("./es5").keys,i=r.tryCatch,a=r.errorObj;return n}},{"./es5":10,"./util":21}],6:[function(t,e,n){"use strict";e.exports=function(t){function e(){this._trace=new e.CapturedTrace(r())}function n(){return o?new e:void 0}function r(){var t=i.length-1;return t>=0?i[t]:void 0}var o=!1,i=[];return t.prototype._promiseCreated=function(){},t.prototype._pushContext=function(){},t.prototype._popContext=function(){return null},t._peekContext=t.prototype._peekContext=function(){},e.prototype._pushContext=function(){void 0!==this._trace&&(this._trace._promiseCreated=null,i.push(this._trace))},e.prototype._popContext=function(){if(void 0!==this._trace){var t=i.pop(),e=t._promiseCreated;return t._promiseCreated=null,e}return null},e.CapturedTrace=null,e.create=n,e.deactivateLongStackTraces=function(){},e.activateLongStackTraces=function(){var n=t.prototype._pushContext,i=t.prototype._popContext,a=t._peekContext,s=t.prototype._peekContext,c=t.prototype._promiseCreated;e.deactivateLongStackTraces=function(){t.prototype._pushContext=n,t.prototype._popContext=i,t._peekContext=a,t.prototype._peekContext=s,t.prototype._promiseCreated=c,o=!1},o=!0,t.prototype._pushContext=e.prototype._pushContext,t.prototype._popContext=e.prototype._popContext,t._peekContext=t.prototype._peekContext=r,t.prototype._promiseCreated=function(){var t=this._peekContext();t&&null==t._promiseCreated&&(t._promiseCreated=this)}},e}},{}],7:[function(t,e,n){"use strict";e.exports=function(e,n,r,o){function i(t,e){return{promise:e}}function a(){return!1}function s(t,e,n){var r=this;try{t(e,n,function(t){if("function"!=typeof t)throw new TypeError("onCancel must be a function, got: "+V.toString(t));r._attachCancellationCallback(t)})}catch(o){return o}}function c(t){if(!this._isCancellable())return this;var e=this._onCancel();void 0!==e?V.isArray(e)?e.push(t):this._setOnCancel([e,t]):this._setOnCancel(t)}function l(){return this._onCancelField}function u(t){this._onCancelField=t}function p(){this._cancellationParent=void 0,this._onCancelField=void 0}function f(t,e){if(0!==(1&e)){this._cancellationParent=t;var n=t._branchesRemainingToCancel;void 0===n&&(n=0),t._branchesRemainingToCancel=n+1}0!==(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)}function h(t,e){0!==(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)}function d(){var t=this._boundTo;return void 0!==t&&t instanceof e?t.isFulfilled()?t.value():void 0:t}function _(){this._trace=new H(this._peekContext())}function v(t,e){if(q(t)){var n=this._trace;if(void 0!==n&&e&&(n=n._parent),void 0!==n)n.attachExtraTrace(t);else if(!t.__stackCleaned__){var r=F(t);V.notEnumerableProp(t,"stack",r.message+"\n"+r.stack.join("\n")),V.notEnumerableProp(t,"__stackCleaned__",!0)}}}function y(){this._trace=void 0}function g(t,e,n,r,o){if(void 0===t&&null!==e&&Z){if(void 0!==o&&o._returnedNonUndefined())return;if(0===(65535&r._bitField))return;n&&(n+=" ");var i="",a="";if(e._trace){for(var s=e._trace.stack.split("\n"),c=E(s),l=c.length-1;l>=0;--l){var u=c[l];if(!M.test(u)){var p=u.match(W);p&&(i="at "+p[1]+":"+p[2]+":"+p[3]+" ");break}}if(c.length>0)for(var f=c[0],l=0;l<s.length;++l)if(s[l]===f){l>0&&(a="\n"+s[l-1]);break}}var h="a promise was created in a "+n+"handler "+i+"but was not returned from it, see http://goo.gl/rRqMUw"+a;r._warn(h,!0,e)}}function m(t,e){var n=t+" is deprecated and will be removed in a future version.";return e&&(n+=" Use "+e+" instead."),b(n)}function b(t,n,r){if(ut.warnings){var o,i=new D(t);if(n)r._attachExtraTrace(i);else if(ut.longStackTraces&&(o=e._peekContext()))o.attachExtraTrace(i);else{var a=F(i);i.stack=a.message+"\n"+a.stack.join("\n")}it("warning",i)||T(i,"",!0)}}function C(t,e){for(var n=0;n<e.length-1;++n)e[n].push("From previous event:"),e[n]=e[n].join("\n");return n<e.length&&(e[n]=e[n].join("\n")),t+"\n"+e.join("\n")}function w(t){for(var e=0;e<t.length;++e)(0===t[e].length||e+1<t.length&&t[e][0]===t[e+1][0])&&(t.splice(e,1),e--)}function k(t){for(var e=t[0],n=1;n<t.length;++n){for(var r=t[n],o=e.length-1,i=e[o],a=-1,s=r.length-1;s>=0;--s)if(r[s]===i){a=s;break}for(var s=a;s>=0;--s){var c=r[s];if(e[o]!==c)break;e.pop(),o--}e=r}}function E(t){for(var e=[],n=0;n<t.length;++n){var r=t[n],o="    (No stack trace)"===r||$.test(r),i=o&&st(r);o&&!i&&(X&&" "!==r.charAt(0)&&(r="    "+r),e.push(r))}return e}function j(t){for(var e=t.stack.replace(/\s+$/g,"").split("\n"),n=0;n<e.length;++n){var r=e[n];if("    (No stack trace)"===r||$.test(r))break}return n>0&&"SyntaxError"!=t.name&&(e=e.slice(n)),e}function F(t){var e=t.stack,n=t.toString();return e="string"==typeof e&&e.length>0?j(t):["    (No stack trace)"],{message:n,stack:"SyntaxError"==t.name?e:E(e)}}function T(t,e,n){if("undefined"!=typeof console){var r;if(V.isObject(t)){var o=t.stack;r=e+z(o,t)}else r=e+String(t);"function"==typeof B?B(r,n):("function"==typeof console.log||"object"==typeof console.log)&&console.log(r)}}function x(t,e,n,r){var o=!1;try{"function"==typeof e&&(o=!0,"rejectionHandled"===t?e(r):e(n,r))}catch(i){I.throwLater(i)}"unhandledRejection"===t?it(t,n,r)||o||T(n,"Unhandled rejection "):it(t,r)}function R(t){var e;if("function"==typeof t)e="[function "+(t.name||"anonymous")+"]";else{e=t&&"function"==typeof t.toString?t.toString():V.toString(t);var n=/\[object [a-zA-Z0-9$_]+\]/;if(n.test(e))try{var r=JSON.stringify(t);e=r}catch(o){}0===e.length&&(e="(empty array)")}return"(<"+S(e)+">, no stack trace)"}function S(t){var e=41;return t.length<e?t:t.substr(0,e-3)+"..."}function P(){return"function"==typeof lt}function O(t){var e=t.match(ct);return e?{fileName:e[1],line:parseInt(e[2],10)}:void 0}function A(t,e){if(P()){for(var n,r,o=(t.stack||"").split("\n"),i=(e.stack||"").split("\n"),a=-1,s=-1,c=0;c<o.length;++c){var l=O(o[c]);if(l){n=l.fileName,a=l.line;break}}for(var c=0;c<i.length;++c){var l=O(i[c]);if(l){r=l.fileName,s=l.line;break}}0>a||0>s||!n||!r||n!==r||a>=s||(st=function(t){if(G.test(t))return!0;var e=O(t);return e&&e.fileName===n&&a<=e.line&&e.line<=s?!0:!1})}}function H(t){this._parent=t,this._promisesCreated=0;var e=this._length=1+(void 0===t?0:t._length);lt(this,H),e>32&&this.uncycle()}var N,L,B,U,I=e._async,D=t("./errors").Warning,V=t("./util"),Q=t("./es5"),q=V.canAttachTrace,G=/[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/,M=/\((?:timers\.js):\d+:\d+\)/,W=/[\/<\(](.+?):(\d+):(\d+)\)?\s*$/,$=null,z=null,X=!1,K=!(0==V.env("BLUEBIRD_DEBUG")||!V.env("BLUEBIRD_DEBUG")&&"development"!==V.env("NODE_ENV")),J=!(0==V.env("BLUEBIRD_WARNINGS")||!K&&!V.env("BLUEBIRD_WARNINGS")),Y=!(0==V.env("BLUEBIRD_LONG_STACK_TRACES")||!K&&!V.env("BLUEBIRD_LONG_STACK_TRACES")),Z=0!=V.env("BLUEBIRD_W_FORGOTTEN_RETURN")&&(J||!!V.env("BLUEBIRD_W_FORGOTTEN_RETURN"));!function(){function t(){for(var t=0;t<r.length;++t)r[t]._notifyUnhandledRejection();n()}function n(){r.length=0}var r=[];U=function(e){r.push(e),setTimeout(t,1)},Q.defineProperty(e,"_unhandledRejectionCheck",{value:t}),Q.defineProperty(e,"_unhandledRejectionClear",{value:n})}(),e.prototype.suppressUnhandledRejections=function(){var t=this._target();t._bitField=-1048577&t._bitField|524288},e.prototype._ensurePossibleRejectionHandled=function(){0===(524288&this._bitField)&&(this._setRejectionIsUnhandled(),U(this))},e.prototype._notifyUnhandledRejectionIsHandled=function(){x("rejectionHandled",N,void 0,this)},e.prototype._setReturnedNonUndefined=function(){this._bitField=268435456|this._bitField},e.prototype._returnedNonUndefined=function(){return 0!==(268435456&this._bitField)},e.prototype._notifyUnhandledRejection=function(){if(this._isRejectionUnhandled()){var t=this._settledValue();this._setUnhandledRejectionIsNotified(),x("unhandledRejection",L,t,this)}},e.prototype._setUnhandledRejectionIsNotified=function(){this._bitField=262144|this._bitField},e.prototype._unsetUnhandledRejectionIsNotified=function(){this._bitField=-262145&this._bitField},e.prototype._isUnhandledRejectionNotified=function(){return(262144&this._bitField)>0},e.prototype._setRejectionIsUnhandled=function(){this._bitField=1048576|this._bitField},e.prototype._unsetRejectionIsUnhandled=function(){this._bitField=-1048577&this._bitField,this._isUnhandledRejectionNotified()&&(this._unsetUnhandledRejectionIsNotified(),this._notifyUnhandledRejectionIsHandled())},e.prototype._isRejectionUnhandled=function(){return(1048576&this._bitField)>0},e.prototype._warn=function(t,e,n){return b(t,e,n||this)},e.onPossiblyUnhandledRejection=function(t){var n=e._getContext();L=V.contextBind(n,t)},e.onUnhandledRejectionHandled=function(t){var n=e._getContext();N=V.contextBind(n,t)};var tt=function(){};e.longStackTraces=function(){if(I.haveItemsQueued()&&!ut.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n    See http://goo.gl/MqrFmX\n");if(!ut.longStackTraces&&P()){var t=e.prototype._captureStackTrace,r=e.prototype._attachExtraTrace,o=e.prototype._dereferenceTrace;ut.longStackTraces=!0,tt=function(){if(I.haveItemsQueued()&&!ut.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n    See http://goo.gl/MqrFmX\n");e.prototype._captureStackTrace=t,e.prototype._attachExtraTrace=r,e.prototype._dereferenceTrace=o,n.deactivateLongStackTraces(),ut.longStackTraces=!1},e.prototype._captureStackTrace=_,e.prototype._attachExtraTrace=v,e.prototype._dereferenceTrace=y,n.activateLongStackTraces()}},e.hasLongStackTraces=function(){return ut.longStackTraces&&P()};var et={unhandledrejection:{before:function(){var t=V.global.onunhandledrejection;return V.global.onunhandledrejection=null,t},after:function(t){V.global.onunhandledrejection=t}},rejectionhandled:{before:function(){var t=V.global.onrejectionhandled;return V.global.onrejectionhandled=null,t},after:function(t){V.global.onrejectionhandled=t}}},nt=function(){var t=function(t,e){if(!t)return!V.global.dispatchEvent(e);var n;try{return n=t.before(),!V.global.dispatchEvent(e)}finally{t.after(n)}};try{if("function"==typeof CustomEvent){var e=new CustomEvent("CustomEvent");return V.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r={detail:n,cancelable:!0},o=new CustomEvent(e,r);return Q.defineProperty(o,"promise",{value:n.promise}),Q.defineProperty(o,"reason",{value:n.reason}),t(et[e],o)}}if("function"==typeof Event){var e=new Event("CustomEvent");return V.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r=new Event(e,{cancelable:!0});return r.detail=n,Q.defineProperty(r,"promise",{value:n.promise}),Q.defineProperty(r,"reason",{value:n.reason}),t(et[e],r)}}var e=document.createEvent("CustomEvent");return e.initCustomEvent("testingtheevent",!1,!0,{}),V.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r=document.createEvent("CustomEvent");return r.initCustomEvent(e,!1,!0,n),t(et[e],r)}}catch(n){}return function(){return!1}}(),rt=function(){return V.isNode?function(){return process.emit.apply(process,arguments)}:V.global?function(t){var e="on"+t.toLowerCase(),n=V.global[e];return n?(n.apply(V.global,[].slice.call(arguments,1)),!0):!1}:function(){return!1}}(),ot={promiseCreated:i,promiseFulfilled:i,promiseRejected:i,promiseResolved:i,promiseCancelled:i,promiseChained:function(t,e,n){return{promise:e,child:n}},warning:function(t,e){return{warning:e}},unhandledRejection:function(t,e,n){return{reason:e,promise:n}},rejectionHandled:i},it=function(t){var e=!1;try{e=rt.apply(null,arguments)}catch(n){I.throwLater(n),e=!0}var r=!1;try{r=nt(t,ot[t].apply(null,arguments))}catch(n){I.throwLater(n),r=!0}return r||e};e.config=function(t){if(t=Object(t),"longStackTraces"in t&&(t.longStackTraces?e.longStackTraces():!t.longStackTraces&&e.hasLongStackTraces()&&tt()),"warnings"in t){var n=t.warnings;ut.warnings=!!n,Z=ut.warnings,V.isObject(n)&&"wForgottenReturn"in n&&(Z=!!n.wForgottenReturn)}if("cancellation"in t&&t.cancellation&&!ut.cancellation){if(I.haveItemsQueued())throw new Error("cannot enable cancellation after promises are in use");e.prototype._clearCancellationData=p,e.prototype._propagateFrom=f,e.prototype._onCancel=l,e.prototype._setOnCancel=u,e.prototype._attachCancellationCallback=c,e.prototype._execute=s,at=f,ut.cancellation=!0}if("monitoring"in t&&(t.monitoring&&!ut.monitoring?(ut.monitoring=!0,e.prototype._fireEvent=it):!t.monitoring&&ut.monitoring&&(ut.monitoring=!1,e.prototype._fireEvent=a)),"asyncHooks"in t&&V.nodeSupportsAsyncResource){var i=ut.asyncHooks,h=!!t.asyncHooks;i!==h&&(ut.asyncHooks=h,h?r():o())}return e},e.prototype._fireEvent=a,e.prototype._execute=function(t,e,n){try{t(e,n)}catch(r){return r}},e.prototype._onCancel=function(){},e.prototype._setOnCancel=function(t){},e.prototype._attachCancellationCallback=function(t){},e.prototype._captureStackTrace=function(){},e.prototype._attachExtraTrace=function(){},e.prototype._dereferenceTrace=function(){},e.prototype._clearCancellationData=function(){},e.prototype._propagateFrom=function(t,e){};var at=h,st=function(){return!1},ct=/[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;V.inherits(H,Error),n.CapturedTrace=H,H.prototype.uncycle=function(){var t=this._length;if(!(2>t)){for(var e=[],n={},r=0,o=this;void 0!==o;++r)e.push(o),o=o._parent;t=this._length=r;for(var r=t-1;r>=0;--r){var i=e[r].stack;void 0===n[i]&&(n[i]=r)}for(var r=0;t>r;++r){var a=e[r].stack,s=n[a];if(void 0!==s&&s!==r){s>0&&(e[s-1]._parent=void 0,e[s-1]._length=1),e[r]._parent=void 0,e[r]._length=1;var c=r>0?e[r-1]:this;t-1>s?(c._parent=e[s+1],c._parent.uncycle(),c._length=c._parent._length+1):(c._parent=void 0,c._length=1);for(var l=c._length+1,u=r-2;u>=0;--u)e[u]._length=l,l++;return}}}},H.prototype.attachExtraTrace=function(t){if(!t.__stackCleaned__){this.uncycle();for(var e=F(t),n=e.message,r=[e.stack],o=this;void 0!==o;)r.push(E(o.stack.split("\n"))),o=o._parent;k(r),w(r),V.notEnumerableProp(t,"stack",C(n,r)),V.notEnumerableProp(t,"__stackCleaned__",!0)}};var lt=function(){var t=/^\s*at\s*/,e=function(t,e){return"string"==typeof t?t:void 0!==e.name&&void 0!==e.message?e.toString():R(e)};if("number"==typeof Error.stackTraceLimit&&"function"==typeof Error.captureStackTrace){Error.stackTraceLimit+=6,$=t,z=e;var n=Error.captureStackTrace;return st=function(t){return G.test(t)},function(t,e){Error.stackTraceLimit+=6,n(t,e),Error.stackTraceLimit-=6}}var r=new Error;if("string"==typeof r.stack&&r.stack.split("\n")[0].indexOf("stackDetection@")>=0)return $=/@/,z=e,X=!0,function(t){t.stack=(new Error).stack};var o;try{throw new Error}catch(i){o="stack"in i}return"stack"in r||!o||"number"!=typeof Error.stackTraceLimit?(z=function(t,e){return"string"==typeof t?t:"object"!=typeof e&&"function"!=typeof e||void 0===e.name||void 0===e.message?R(e):e.toString()},null):($=t,z=e,function(t){Error.stackTraceLimit+=6;try{throw new Error}catch(e){t.stack=e.stack}Error.stackTraceLimit-=6})}([]);"undefined"!=typeof console&&"undefined"!=typeof console.warn&&(B=function(t){console.warn(t)},V.isNode&&process.stderr.isTTY?B=function(t,e){var n=e?"[33m":"[31m";console.warn(n+t+"[0m\n")}:V.isNode||"string"!=typeof(new Error).stack||(B=function(t,e){console.warn("%c"+t,e?"color: darkorange":"color: red")}));var ut={warnings:J,longStackTraces:!1,cancellation:!1,monitoring:!1,asyncHooks:!1};return Y&&e.longStackTraces(),{asyncHooks:function(){return ut.asyncHooks},longStackTraces:function(){return ut.longStackTraces},warnings:function(){return ut.warnings},cancellation:function(){return ut.cancellation},monitoring:function(){return ut.monitoring},propagateFromFunction:function(){return at},boundValueFunction:function(){return d},checkForgottenReturns:g,setBounds:A,warn:b,deprecated:m,CapturedTrace:H,fireDomEvent:nt,fireGlobalEvent:rt}}},{"./errors":9,"./es5":10,"./util":21}],8:[function(t,e,n){"use strict";e.exports=function(t){function e(){return this.value}function n(){throw this.reason}t.prototype["return"]=t.prototype.thenReturn=function(n){return n instanceof t&&n.suppressUnhandledRejections(),this._then(e,void 0,void 0,{value:n},void 0)},t.prototype["throw"]=t.prototype.thenThrow=function(t){return this._then(n,void 0,void 0,{reason:t},void 0)},t.prototype.catchThrow=function(t){if(arguments.length<=1)return this._then(void 0,n,void 0,{reason:t},void 0);var e=arguments[1],r=function(){throw e};return this.caught(t,r)},t.prototype.catchReturn=function(n){if(arguments.length<=1)return n instanceof t&&n.suppressUnhandledRejections(),this._then(void 0,e,void 0,{value:n},void 0);var r=arguments[1];r instanceof t&&r.suppressUnhandledRejections();var o=function(){return r};return this.caught(n,o)}}},{}],9:[function(t,e,n){"use strict";function r(t,e){function n(r){return this instanceof n?(p(this,"message","string"==typeof r?r:e),p(this,"name",t),void(Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):Error.call(this))):new n(r)}return u(n,Error),n}function o(t){return this instanceof o?(p(this,"name","OperationalError"),p(this,"message",t),this.cause=t,this.isOperational=!0,void(t instanceof Error?(p(this,"message",t.message),p(this,"stack",t.stack)):Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor))):new o(t)}var i,a,s=t("./es5"),c=s.freeze,l=t("./util"),u=l.inherits,p=l.notEnumerableProp,f=r("Warning","warning"),h=r("CancellationError","cancellation error"),d=r("TimeoutError","timeout error"),_=r("AggregateError","aggregate error");try{i=TypeError,a=RangeError}catch(v){i=r("TypeError","type error"),a=r("RangeError","range error")}for(var y="join pop push shift unshift slice filter forEach some every map indexOf lastIndexOf reduce reduceRight sort reverse".split(" "),g=0;g<y.length;++g)"function"==typeof Array.prototype[y[g]]&&(_.prototype[y[g]]=Array.prototype[y[g]]);s.defineProperty(_.prototype,"length",{value:0,configurable:!1,writable:!0,enumerable:!0}),_.prototype.isOperational=!0;var m=0;_.prototype.toString=function(){var t=Array(4*m+1).join(" "),e="\n"+t+"AggregateError of:\n";m++,t=Array(4*m+1).join(" ");for(var n=0;n<this.length;++n){for(var r=this[n]===this?"[Circular AggregateError]":this[n]+"",o=r.split("\n"),i=0;i<o.length;++i)o[i]=t+o[i];r=o.join("\n"),e+=r+"\n"}return m--,e},u(o,Error);var b=Error.__BluebirdErrorTypes__;b||(b=c({CancellationError:h,TimeoutError:d,OperationalError:o,RejectionError:o,AggregateError:_}),s.defineProperty(Error,"__BluebirdErrorTypes__",{value:b,writable:!1,enumerable:!1,configurable:!1})),e.exports={Error:Error,TypeError:i,RangeError:a,CancellationError:b.CancellationError,OperationalError:b.OperationalError,TimeoutError:b.TimeoutError,AggregateError:b.AggregateError,Warning:f}},{"./es5":10,"./util":21}],10:[function(t,e,n){var r=function(){"use strict";return void 0===this}();if(r)e.exports={freeze:Object.freeze,defineProperty:Object.defineProperty,getDescriptor:Object.getOwnPropertyDescriptor,keys:Object.keys,names:Object.getOwnPropertyNames,getPrototypeOf:Object.getPrototypeOf,isArray:Array.isArray,isES5:r,propertyIsWritable:function(t,e){var n=Object.getOwnPropertyDescriptor(t,e);return!(n&&!n.writable&&!n.set)}};else{var o={}.hasOwnProperty,i={}.toString,a={}.constructor.prototype,s=function(t){var e=[];for(var n in t)o.call(t,n)&&e.push(n);return e},c=function(t,e){return{value:t[e]}},l=function(t,e,n){return t[e]=n.value,t},u=function(t){return t},p=function(t){try{return Object(t).constructor.prototype}catch(e){return a}},f=function(t){try{return"[object Array]"===i.call(t)}catch(e){return!1}};e.exports={isArray:f,keys:s,names:s,defineProperty:l,getDescriptor:c,freeze:u,getPrototypeOf:p,isES5:r,propertyIsWritable:function(){return!0}}}},{}],11:[function(t,e,n){"use strict";e.exports=function(e,n,r){function o(t,e,n){this.promise=t,this.type=e,this.handler=n,this.called=!1,this.cancelPromise=null}function i(t){this.finallyHandler=t}function a(t,e){return null!=t.cancelPromise?(arguments.length>1?t.cancelPromise._reject(e):t.cancelPromise._cancel(),t.cancelPromise=null,!0):!1}function s(){return l.call(this,this.promise._target()._settledValue())}function c(t){return a(this,t)?void 0:(f.e=t,f)}function l(t){var o=this.promise,l=this.handler;if(!this.called){this.called=!0;var u=this.isFinallyHandler()?l.call(o._boundValue()):l.call(o._boundValue(),t);if(u===r)return u;if(void 0!==u){o._setReturnedNonUndefined();var h=n(u,o);if(h instanceof e){if(null!=this.cancelPromise){if(h._isCancelled()){var d=new p("late cancellation observer");return o._attachExtraTrace(d),f.e=d,f}h.isPending()&&h._attachCancellationCallback(new i(this))}return h._then(s,c,void 0,this,void 0)}}}return o.isRejected()?(a(this),f.e=t,f):(a(this),t)}var u=t("./util"),p=e.CancellationError,f=u.errorObj,h=t("./catch_filter")(r);return o.prototype.isFinallyHandler=function(){return 0===this.type},i.prototype._resultCancelled=function(){a(this.finallyHandler)},e.prototype._passThrough=function(t,e,n,r){return"function"!=typeof t?this.then():this._then(n,r,void 0,new o(this,e,t),void 0)},e.prototype.lastly=e.prototype["finally"]=function(t){return this._passThrough(t,0,l,l)},e.prototype.tap=function(t){return this._passThrough(t,1,l)},e.prototype.tapCatch=function(t){var n=arguments.length;if(1===n)return this._passThrough(t,1,void 0,l);var r,o=new Array(n-1),i=0;for(r=0;n-1>r;++r){var a=arguments[r];if(!u.isObject(a))return e.reject(new TypeError("tapCatch statement predicate: expecting an object but got "+u.classString(a)));o[i++]=a}o.length=i;var s=arguments[r];return this._passThrough(h(o,s,this),1,void 0,l)},o}},{"./catch_filter":5,"./util":21}],12:[function(t,e,n){"use strict";e.exports=function(e,n,r,o,i){var a=t("./util");a.canEvaluate,a.tryCatch,a.errorObj;e.join=function(){var t,e=arguments.length-1;if(e>0&&"function"==typeof arguments[e]){t=arguments[e];var r}var o=[].slice.call(arguments);t&&o.pop();var r=new n(o).promise();return void 0!==t?r.spread(t):r}}},{"./util":21}],13:[function(t,e,n){"use strict";e.exports=function(e,n,r,o,i){var a=t("./util"),s=a.tryCatch;e.method=function(t){if("function"!=typeof t)throw new e.TypeError("expecting a function but got "+a.classString(t));return function(){var r=new e(n);r._captureStackTrace(),r._pushContext();var o=s(t).apply(this,arguments),a=r._popContext();return i.checkForgottenReturns(o,a,"Promise.method",r),r._resolveFromSyncValue(o),r}},e.attempt=e["try"]=function(t){if("function"!=typeof t)return o("expecting a function but got "+a.classString(t));var r=new e(n);r._captureStackTrace(),r._pushContext();var c;if(arguments.length>1){i.deprecated("calling Promise.try with more than 1 argument");var l=arguments[1],u=arguments[2];c=a.isArray(l)?s(t).apply(u,l):s(t).call(u,l)}else c=s(t)();var p=r._popContext();return i.checkForgottenReturns(c,p,"Promise.try",r),r._resolveFromSyncValue(c),r},e.prototype._resolveFromSyncValue=function(t){t===a.errorObj?this._rejectCallback(t.e,!1):this._resolveCallback(t,!0)}}},{"./util":21}],14:[function(t,e,n){"use strict";function r(t){return t instanceof Error&&u.getPrototypeOf(t)===Error.prototype}function o(t){var e;if(r(t)){e=new l(t),e.name=t.name,e.message=t.message,e.stack=t.stack;for(var n=u.keys(t),o=0;o<n.length;++o){var i=n[o];p.test(i)||(e[i]=t[i])}return e}return a.markAsOriginatingFromRejection(t),t}function i(t,e){return function(n,r){if(null!==t){if(n){var i=o(s(n));t._attachExtraTrace(i),t._reject(i)}else if(e){var a=[].slice.call(arguments,1);t._fulfill(a)}else t._fulfill(r);t=null}}}var a=t("./util"),s=a.maybeWrapAsError,c=t("./errors"),l=c.OperationalError,u=t("./es5"),p=/^(?:name|message|stack|cause)$/;e.exports=i},{"./errors":9,"./es5":10,"./util":21}],15:[function(t,e,n){"use strict";e.exports=function(){function n(){}function r(t,e){if(null==t||t.constructor!==o)throw new j("the promise constructor cannot be invoked directly\n\n    See http://goo.gl/MqrFmX\n");if("function"!=typeof e)throw new j("expecting a function but got "+f.classString(e))}function o(t){t!==T&&r(this,t),this._bitField=0,this._fulfillmentHandler0=void 0,this._rejectionHandler0=void 0,this._promise0=void 0,this._receiver0=void 0,this._resolveFromExecutor(t),this._promiseCreated(),this._fireEvent("promiseCreated",this)}function i(t){this.promise._resolveCallback(t)}function a(t){this.promise._rejectCallback(t,!1)}function s(t){var e=new o(T);e._fulfillmentHandler0=t,e._rejectionHandler0=t,e._promise0=t,e._receiver0=t}var c=function(){return new j("circular promise resolution chain\n\n    See http://goo.gl/MqrFmX\n")},l=function(){return new o.PromiseInspection(this._target())},u=function(t){return o.reject(new j(t))},p={},f=t("./util");f.setReflectHandler(l);var h=function(){var t=process.domain;return void 0===t?null:t},d=function(){return null},_=function(){return{domain:h(),async:null}},v=f.isNode&&f.nodeSupportsAsyncResource?t("async_hooks").AsyncResource:null,y=function(){return{domain:h(),async:new v("Bluebird::Promise")}},g=f.isNode?_:d;f.notEnumerableProp(o,"_getContext",g);var m=function(){g=y,f.notEnumerableProp(o,"_getContext",y)},b=function(){g=_,f.notEnumerableProp(o,"_getContext",_)},C=t("./es5"),w=t("./async"),k=new w;C.defineProperty(o,"_async",{value:k});var E=t("./errors"),j=o.TypeError=E.TypeError;o.RangeError=E.RangeError;var F=o.CancellationError=E.CancellationError;o.TimeoutError=E.TimeoutError,o.OperationalError=E.OperationalError,o.RejectionError=E.OperationalError,o.AggregateError=E.AggregateError;var T=function(){},x={},R={},S=t("./thenables")(o,T),P=t("./promise_array")(o,T,S,u,n),O=t("./context")(o),A=(O.create,t("./debuggability")(o,O,m,b)),H=(A.CapturedTrace,t("./finally")(o,S,R)),N=t("./catch_filter")(R),L=t("./nodeback"),B=f.errorObj,U=f.tryCatch;return o.prototype.toString=function(){return"[object Promise]"},o.prototype.caught=o.prototype["catch"]=function(t){var e=arguments.length;if(e>1){var n,r=new Array(e-1),o=0;
for(n=0;e-1>n;++n){var i=arguments[n];if(!f.isObject(i))return u("Catch statement predicate: expecting an object but got "+f.classString(i));r[o++]=i}if(r.length=o,t=arguments[n],"function"!=typeof t)throw new j("The last argument to .catch() must be a function, got "+f.toString(t));return this.then(void 0,N(r,t,this))}return this.then(void 0,t)},o.prototype.reflect=function(){return this._then(l,l,void 0,this,void 0)},o.prototype.then=function(t,e){if(A.warnings()&&arguments.length>0&&"function"!=typeof t&&"function"!=typeof e){var n=".then() only accepts functions but was passed: "+f.classString(t);arguments.length>1&&(n+=", "+f.classString(e)),this._warn(n)}return this._then(t,e,void 0,void 0,void 0)},o.prototype.done=function(t,e){var n=this._then(t,e,void 0,void 0,void 0);n._setIsFinal()},o.prototype.spread=function(t){return"function"!=typeof t?u("expecting a function but got "+f.classString(t)):this.all()._then(t,void 0,void 0,x,void 0)},o.prototype.toJSON=function(){var t={isFulfilled:!1,isRejected:!1,fulfillmentValue:void 0,rejectionReason:void 0};return this.isFulfilled()?(t.fulfillmentValue=this.value(),t.isFulfilled=!0):this.isRejected()&&(t.rejectionReason=this.reason(),t.isRejected=!0),t},o.prototype.all=function(){return arguments.length>0&&this._warn(".all() was passed arguments but it does not take any"),new P(this).promise()},o.prototype.error=function(t){return this.caught(f.originatesFromRejection,t)},o.getNewLibraryCopy=e.exports,o.is=function(t){return t instanceof o},o.fromNode=o.fromCallback=function(t){var e=new o(T);e._captureStackTrace();var n=arguments.length>1?!!Object(arguments[1]).multiArgs:!1,r=U(t)(L(e,n));return r===B&&e._rejectCallback(r.e,!0),e._isFateSealed()||e._setAsyncGuaranteed(),e},o.all=function(t){return new P(t).promise()},o.cast=function(t){var e=S(t);return e instanceof o||(e=new o(T),e._captureStackTrace(),e._setFulfilled(),e._rejectionHandler0=t),e},o.resolve=o.fulfilled=o.cast,o.reject=o.rejected=function(t){var e=new o(T);return e._captureStackTrace(),e._rejectCallback(t,!0),e},o.setScheduler=function(t){if("function"!=typeof t)throw new j("expecting a function but got "+f.classString(t));return k.setScheduler(t)},o.prototype._then=function(t,e,n,r,i){var a=void 0!==i,s=a?i:new o(T),c=this._target(),l=c._bitField;a||(s._propagateFrom(this,3),s._captureStackTrace(),void 0===r&&0!==(2097152&this._bitField)&&(r=0!==(50397184&l)?this._boundValue():c===this?void 0:this._boundTo),this._fireEvent("promiseChained",this,s));var u=g();if(0!==(50397184&l)){var p,h,d=c._settlePromiseCtx;0!==(33554432&l)?(h=c._rejectionHandler0,p=t):0!==(16777216&l)?(h=c._fulfillmentHandler0,p=e,c._unsetRejectionIsUnhandled()):(d=c._settlePromiseLateCancellationObserver,h=new F("late cancellation observer"),c._attachExtraTrace(h),p=e),k.invoke(d,c,{handler:f.contextBind(u,p),promise:s,receiver:r,value:h})}else c._addCallbacks(t,e,s,r,u);return s},o.prototype._length=function(){return 65535&this._bitField},o.prototype._isFateSealed=function(){return 0!==(117506048&this._bitField)},o.prototype._isFollowing=function(){return 67108864===(67108864&this._bitField)},o.prototype._setLength=function(t){this._bitField=-65536&this._bitField|65535&t},o.prototype._setFulfilled=function(){this._bitField=33554432|this._bitField,this._fireEvent("promiseFulfilled",this)},o.prototype._setRejected=function(){this._bitField=16777216|this._bitField,this._fireEvent("promiseRejected",this)},o.prototype._setFollowing=function(){this._bitField=67108864|this._bitField,this._fireEvent("promiseResolved",this)},o.prototype._setIsFinal=function(){this._bitField=4194304|this._bitField},o.prototype._isFinal=function(){return(4194304&this._bitField)>0},o.prototype._unsetCancelled=function(){this._bitField=-65537&this._bitField},o.prototype._setCancelled=function(){this._bitField=65536|this._bitField,this._fireEvent("promiseCancelled",this)},o.prototype._setWillBeCancelled=function(){this._bitField=8388608|this._bitField},o.prototype._setAsyncGuaranteed=function(){if(!k.hasCustomScheduler()){var t=this._bitField;this._bitField=t|(536870912&t)>>2^134217728}},o.prototype._setNoAsyncGuarantee=function(){this._bitField=-134217729&(536870912|this._bitField)},o.prototype._receiverAt=function(t){var e=0===t?this._receiver0:this[4*t-4+3];return e===p?void 0:void 0===e&&this._isBound()?this._boundValue():e},o.prototype._promiseAt=function(t){return this[4*t-4+2]},o.prototype._fulfillmentHandlerAt=function(t){return this[4*t-4+0]},o.prototype._rejectionHandlerAt=function(t){return this[4*t-4+1]},o.prototype._boundValue=function(){},o.prototype._migrateCallback0=function(t){var e=(t._bitField,t._fulfillmentHandler0),n=t._rejectionHandler0,r=t._promise0,o=t._receiverAt(0);void 0===o&&(o=p),this._addCallbacks(e,n,r,o,null)},o.prototype._migrateCallbackAt=function(t,e){var n=t._fulfillmentHandlerAt(e),r=t._rejectionHandlerAt(e),o=t._promiseAt(e),i=t._receiverAt(e);void 0===i&&(i=p),this._addCallbacks(n,r,o,i,null)},o.prototype._addCallbacks=function(t,e,n,r,o){var i=this._length();if(i>=65531&&(i=0,this._setLength(0)),0===i)this._promise0=n,this._receiver0=r,"function"==typeof t&&(this._fulfillmentHandler0=f.contextBind(o,t)),"function"==typeof e&&(this._rejectionHandler0=f.contextBind(o,e));else{var a=4*i-4;this[a+2]=n,this[a+3]=r,"function"==typeof t&&(this[a+0]=f.contextBind(o,t)),"function"==typeof e&&(this[a+1]=f.contextBind(o,e))}return this._setLength(i+1),i},o.prototype._proxy=function(t,e){this._addCallbacks(void 0,void 0,e,t,null)},o.prototype._resolveCallback=function(t,e){if(0===(117506048&this._bitField)){if(t===this)return this._rejectCallback(c(),!1);var n=S(t,this);if(!(n instanceof o))return this._fulfill(t);e&&this._propagateFrom(n,2);var r=n._target();if(r===this)return void this._reject(c());var i=r._bitField;if(0===(50397184&i)){var a=this._length();a>0&&r._migrateCallback0(this);for(var s=1;a>s;++s)r._migrateCallbackAt(this,s);this._setFollowing(),this._setLength(0),this._setFollowee(n)}else if(0!==(33554432&i))this._fulfill(r._value());else if(0!==(16777216&i))this._reject(r._reason());else{var l=new F("late cancellation observer");r._attachExtraTrace(l),this._reject(l)}}},o.prototype._rejectCallback=function(t,e,n){var r=f.ensureErrorObject(t),o=r===t;if(!o&&!n&&A.warnings()){var i="a promise was rejected with a non-error: "+f.classString(t);this._warn(i,!0)}this._attachExtraTrace(r,e?o:!1),this._reject(t)},o.prototype._resolveFromExecutor=function(t){if(t!==T){var e=this;this._captureStackTrace(),this._pushContext();var n=!0,r=this._execute(t,function(t){e._resolveCallback(t)},function(t){e._rejectCallback(t,n)});n=!1,this._popContext(),void 0!==r&&e._rejectCallback(r,!0)}},o.prototype._settlePromiseFromHandler=function(t,e,n,r){var o=r._bitField;if(0===(65536&o)){r._pushContext();var i;e===x?n&&"number"==typeof n.length?i=U(t).apply(this._boundValue(),n):(i=B,i.e=new j("cannot .spread() a non-array: "+f.classString(n))):i=U(t).call(e,n);var a=r._popContext();o=r._bitField,0===(65536&o)&&(i===R?r._reject(n):i===B?r._rejectCallback(i.e,!1):(A.checkForgottenReturns(i,a,"",r,this),r._resolveCallback(i)))}},o.prototype._target=function(){for(var t=this;t._isFollowing();)t=t._followee();return t},o.prototype._followee=function(){return this._rejectionHandler0},o.prototype._setFollowee=function(t){this._rejectionHandler0=t},o.prototype._settlePromise=function(t,e,r,i){var a=t instanceof o,s=this._bitField,c=0!==(134217728&s);0!==(65536&s)?(a&&t._invokeInternalOnCancel(),r instanceof H&&r.isFinallyHandler()?(r.cancelPromise=t,U(e).call(r,i)===B&&t._reject(B.e)):e===l?t._fulfill(l.call(r)):r instanceof n?r._promiseCancelled(t):a||t instanceof P?t._cancel():r.cancel()):"function"==typeof e?a?(c&&t._setAsyncGuaranteed(),this._settlePromiseFromHandler(e,r,i,t)):e.call(r,i,t):r instanceof n?r._isResolved()||(0!==(33554432&s)?r._promiseFulfilled(i,t):r._promiseRejected(i,t)):a&&(c&&t._setAsyncGuaranteed(),0!==(33554432&s)?t._fulfill(i):t._reject(i))},o.prototype._settlePromiseLateCancellationObserver=function(t){var e=t.handler,n=t.promise,r=t.receiver,i=t.value;"function"==typeof e?n instanceof o?this._settlePromiseFromHandler(e,r,i,n):e.call(r,i,n):n instanceof o&&n._reject(i)},o.prototype._settlePromiseCtx=function(t){this._settlePromise(t.promise,t.handler,t.receiver,t.value)},o.prototype._settlePromise0=function(t,e,n){var r=this._promise0,o=this._receiverAt(0);this._promise0=void 0,this._receiver0=void 0,this._settlePromise(r,t,o,e)},o.prototype._clearCallbackDataAtIndex=function(t){var e=4*t-4;this[e+2]=this[e+3]=this[e+0]=this[e+1]=void 0},o.prototype._fulfill=function(t){var e=this._bitField;if(!((117506048&e)>>>16)){if(t===this){var n=c();return this._attachExtraTrace(n),this._reject(n)}this._setFulfilled(),this._rejectionHandler0=t,(65535&e)>0&&(0!==(134217728&e)?this._settlePromises():k.settlePromises(this),this._dereferenceTrace())}},o.prototype._reject=function(t){var e=this._bitField;if(!((117506048&e)>>>16))return this._setRejected(),this._fulfillmentHandler0=t,this._isFinal()?k.fatalError(t,f.isNode):void((65535&e)>0?k.settlePromises(this):this._ensurePossibleRejectionHandled())},o.prototype._fulfillPromises=function(t,e){for(var n=1;t>n;n++){var r=this._fulfillmentHandlerAt(n),o=this._promiseAt(n),i=this._receiverAt(n);this._clearCallbackDataAtIndex(n),this._settlePromise(o,r,i,e)}},o.prototype._rejectPromises=function(t,e){for(var n=1;t>n;n++){var r=this._rejectionHandlerAt(n),o=this._promiseAt(n),i=this._receiverAt(n);this._clearCallbackDataAtIndex(n),this._settlePromise(o,r,i,e)}},o.prototype._settlePromises=function(){var t=this._bitField,e=65535&t;if(e>0){if(0!==(16842752&t)){var n=this._fulfillmentHandler0;this._settlePromise0(this._rejectionHandler0,n,t),this._rejectPromises(e,n)}else{var r=this._rejectionHandler0;this._settlePromise0(this._fulfillmentHandler0,r,t),this._fulfillPromises(e,r)}this._setLength(0)}this._clearCancellationData()},o.prototype._settledValue=function(){var t=this._bitField;return 0!==(33554432&t)?this._rejectionHandler0:0!==(16777216&t)?this._fulfillmentHandler0:void 0},"undefined"!=typeof Symbol&&Symbol.toStringTag&&C.defineProperty(o.prototype,Symbol.toStringTag,{get:function(){return"Object"}}),o.defer=o.pending=function(){A.deprecated("Promise.defer","new Promise");var t=new o(T);return{promise:t,resolve:i,reject:a}},f.notEnumerableProp(o,"_makeSelfResolutionError",c),t("./method")(o,T,S,u,A),t("./bind")(o,T,S,A),t("./cancel")(o,P,u,A),t("./direct_resolve")(o),t("./synchronous_inspection")(o),t("./join")(o,P,S,T,k),o.Promise=o,o.version="3.7.2",f.toFastProperties(o),f.toFastProperties(o.prototype),s({a:1}),s({b:2}),s({c:3}),s(1),s(function(){}),s(void 0),s(!1),s(new o(T)),A.setBounds(w.firstLineError,f.lastLineError),o}},{"./async":1,"./bind":2,"./cancel":4,"./catch_filter":5,"./context":6,"./debuggability":7,"./direct_resolve":8,"./errors":9,"./es5":10,"./finally":11,"./join":12,"./method":13,"./nodeback":14,"./promise_array":16,"./synchronous_inspection":19,"./thenables":20,"./util":21,async_hooks:void 0}],16:[function(t,e,n){"use strict";e.exports=function(e,n,r,o,i){function a(t){switch(t){case-2:return[];case-3:return{};case-6:return new Map}}function s(t){var r=this._promise=new e(n);t instanceof e&&(r._propagateFrom(t,3),t.suppressUnhandledRejections()),r._setOnCancel(this),this._values=t,this._length=0,this._totalResolved=0,this._init(void 0,-2)}var c=t("./util");c.isArray;return c.inherits(s,i),s.prototype.length=function(){return this._length},s.prototype.promise=function(){return this._promise},s.prototype._init=function l(t,n){var i=r(this._values,this._promise);if(i instanceof e){i=i._target();var s=i._bitField;if(this._values=i,0===(50397184&s))return this._promise._setAsyncGuaranteed(),i._then(l,this._reject,void 0,this,n);if(0===(33554432&s))return 0!==(16777216&s)?this._reject(i._reason()):this._cancel();i=i._value()}if(i=c.asArray(i),null===i){var u=o("expecting an array or an iterable object but got "+c.classString(i)).reason();return void this._promise._rejectCallback(u,!1)}return 0===i.length?void(-5===n?this._resolveEmptyArray():this._resolve(a(n))):void this._iterate(i)},s.prototype._iterate=function(t){var n=this.getActualLength(t.length);this._length=n,this._values=this.shouldCopyValues()?new Array(n):this._values;for(var o=this._promise,i=!1,a=null,s=0;n>s;++s){var c=r(t[s],o);c instanceof e?(c=c._target(),a=c._bitField):a=null,i?null!==a&&c.suppressUnhandledRejections():null!==a?0===(50397184&a)?(c._proxy(this,s),this._values[s]=c):i=0!==(33554432&a)?this._promiseFulfilled(c._value(),s):0!==(16777216&a)?this._promiseRejected(c._reason(),s):this._promiseCancelled(s):i=this._promiseFulfilled(c,s)}i||o._setAsyncGuaranteed()},s.prototype._isResolved=function(){return null===this._values},s.prototype._resolve=function(t){this._values=null,this._promise._fulfill(t)},s.prototype._cancel=function(){!this._isResolved()&&this._promise._isCancellable()&&(this._values=null,this._promise._cancel())},s.prototype._reject=function(t){this._values=null,this._promise._rejectCallback(t,!1)},s.prototype._promiseFulfilled=function(t,e){this._values[e]=t;var n=++this._totalResolved;return n>=this._length?(this._resolve(this._values),!0):!1},s.prototype._promiseCancelled=function(){return this._cancel(),!0},s.prototype._promiseRejected=function(t){return this._totalResolved++,this._reject(t),!0},s.prototype._resultCancelled=function(){if(!this._isResolved()){var t=this._values;if(this._cancel(),t instanceof e)t.cancel();else for(var n=0;n<t.length;++n)t[n]instanceof e&&t[n].cancel()}},s.prototype.shouldCopyValues=function(){return!0},s.prototype.getActualLength=function(t){return t},s}},{"./util":21}],17:[function(t,e,n){"use strict";function r(t,e,n,r,o){for(var i=0;o>i;++i)n[i+r]=t[i+e],t[i+e]=void 0}function o(t){this._capacity=t,this._length=0,this._front=0}o.prototype._willBeOverCapacity=function(t){return this._capacity<t},o.prototype._pushOne=function(t){var e=this.length();this._checkCapacity(e+1);var n=this._front+e&this._capacity-1;this[n]=t,this._length=e+1},o.prototype.push=function(t,e,n){var r=this.length()+3;if(this._willBeOverCapacity(r))return this._pushOne(t),this._pushOne(e),void this._pushOne(n);var o=this._front+r-3;this._checkCapacity(r);var i=this._capacity-1;this[o+0&i]=t,this[o+1&i]=e,this[o+2&i]=n,this._length=r},o.prototype.shift=function(){var t=this._front,e=this[t];return this[t]=void 0,this._front=t+1&this._capacity-1,this._length--,e},o.prototype.length=function(){return this._length},o.prototype._checkCapacity=function(t){this._capacity<t&&this._resizeTo(this._capacity<<1)},o.prototype._resizeTo=function(t){var e=this._capacity;this._capacity=t;var n=this._front,o=this._length,i=n+o&e-1;r(this,0,this,e,i)},e.exports=o},{}],18:[function(t,e,n){"use strict";var r,o=t("./util"),i=function(){throw new Error("No async scheduler available\n\n    See http://goo.gl/MqrFmX\n")},a=o.getNativePromise();if(o.isNode&&"undefined"==typeof MutationObserver){var s=global.setImmediate,c=process.nextTick;r=o.isRecentNode?function(t){s.call(global,t)}:function(t){c.call(process,t)}}else if("function"==typeof a&&"function"==typeof a.resolve){var l=a.resolve();r=function(t){l.then(t)}}else r="undefined"!=typeof MutationObserver&&("undefined"==typeof window||!window.navigator||!window.navigator.standalone&&!window.cordova)&&"classList"in document.documentElement?function(){var t=document.createElement("div"),e={attributes:!0},n=!1,r=document.createElement("div"),o=new MutationObserver(function(){t.classList.toggle("foo"),n=!1});o.observe(r,e);var i=function(){n||(n=!0,r.classList.toggle("foo"))};return function(n){var r=new MutationObserver(function(){r.disconnect(),n()});r.observe(t,e),i()}}():"undefined"!=typeof setImmediate?function(t){setImmediate(t)}:"undefined"!=typeof setTimeout?function(t){setTimeout(t,0)}:i;e.exports=r},{"./util":21}],19:[function(t,e,n){"use strict";e.exports=function(t){function e(t){void 0!==t?(t=t._target(),this._bitField=t._bitField,this._settledValueField=t._isFateSealed()?t._settledValue():void 0):(this._bitField=0,this._settledValueField=void 0)}e.prototype._settledValue=function(){return this._settledValueField};var n=e.prototype.value=function(){if(!this.isFulfilled())throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\n\n    See http://goo.gl/MqrFmX\n");return this._settledValue()},r=e.prototype.error=e.prototype.reason=function(){if(!this.isRejected())throw new TypeError("cannot get rejection reason of a non-rejected promise\n\n    See http://goo.gl/MqrFmX\n");return this._settledValue()},o=e.prototype.isFulfilled=function(){return 0!==(33554432&this._bitField)},i=e.prototype.isRejected=function(){return 0!==(16777216&this._bitField)},a=e.prototype.isPending=function(){return 0===(50397184&this._bitField)},s=e.prototype.isResolved=function(){return 0!==(50331648&this._bitField)};e.prototype.isCancelled=function(){return 0!==(8454144&this._bitField)},t.prototype.__isCancelled=function(){return 65536===(65536&this._bitField)},t.prototype._isCancelled=function(){return this._target().__isCancelled()},t.prototype.isCancelled=function(){return 0!==(8454144&this._target()._bitField)},t.prototype.isPending=function(){return a.call(this._target())},t.prototype.isRejected=function(){return i.call(this._target())},t.prototype.isFulfilled=function(){return o.call(this._target())},t.prototype.isResolved=function(){return s.call(this._target())},t.prototype.value=function(){return n.call(this._target())},t.prototype.reason=function(){var t=this._target();return t._unsetRejectionIsUnhandled(),r.call(t)},t.prototype._value=function(){return this._settledValue()},t.prototype._reason=function(){return this._unsetRejectionIsUnhandled(),this._settledValue()},t.PromiseInspection=e}},{}],20:[function(t,e,n){"use strict";e.exports=function(e,n){function r(t,r){if(u(t)){if(t instanceof e)return t;var o=i(t);if(o===l){r&&r._pushContext();var c=e.reject(o.e);return r&&r._popContext(),c}if("function"==typeof o){if(a(t)){var c=new e(n);return t._then(c._fulfill,c._reject,void 0,c,null),c}return s(t,o,r)}}return t}function o(t){return t.then}function i(t){try{return o(t)}catch(e){return l.e=e,l}}function a(t){try{return p.call(t,"_promise0")}catch(e){return!1}}function s(t,r,o){function i(t){s&&(s._resolveCallback(t),s=null)}function a(t){s&&(s._rejectCallback(t,p,!0),s=null)}var s=new e(n),u=s;o&&o._pushContext(),s._captureStackTrace(),o&&o._popContext();var p=!0,f=c.tryCatch(r).call(t,i,a);return p=!1,s&&f===l&&(s._rejectCallback(f.e,!0,!0),s=null),u}var c=t("./util"),l=c.errorObj,u=c.isObject,p={}.hasOwnProperty;return r}},{"./util":21}],21:[function(t,e,n){"use strict";function r(){try{var t=R;return R=null,t.apply(this,arguments)}catch(e){return x.e=e,x}}function o(t){return R=t,r}function i(t){return null==t||t===!0||t===!1||"string"==typeof t||"number"==typeof t}function a(t){return"function"==typeof t||"object"==typeof t&&null!==t}function s(t){return i(t)?new Error(v(t)):t}function c(t,e){var n,r=t.length,o=new Array(r+1);for(n=0;r>n;++n)o[n]=t[n];return o[n]=e,o}function l(t,e,n){if(!F.isES5)return{}.hasOwnProperty.call(t,e)?t[e]:void 0;var r=Object.getOwnPropertyDescriptor(t,e);return null!=r?null==r.get&&null==r.set?r.value:n:void 0}function u(t,e,n){if(i(t))return t;var r={value:n,configurable:!0,enumerable:!1,writable:!0};return F.defineProperty(t,e,r),t}function p(t){throw t}function f(t){try{if("function"==typeof t){var e=F.names(t.prototype),n=F.isES5&&e.length>1,r=e.length>0&&!(1===e.length&&"constructor"===e[0]),o=A.test(t+"")&&F.names(t).length>0;if(n||r||o)return!0}return!1}catch(i){return!1}}function h(t){function e(){}function n(){return typeof r.foo}e.prototype=t;var r=new e;return n(),n(),t}function d(t){return H.test(t)}function _(t,e,n){for(var r=new Array(t),o=0;t>o;++o)r[o]=e+o+n;return r}function v(t){try{return t+""}catch(e){return"[no string representation]"}}function y(t){return t instanceof Error||null!==t&&"object"==typeof t&&"string"==typeof t.message&&"string"==typeof t.name}function g(t){try{u(t,"isOperational",!0)}catch(e){}}function m(t){return null==t?!1:t instanceof Error.__BluebirdErrorTypes__.OperationalError||t.isOperational===!0}function b(t){return y(t)&&F.propertyIsWritable(t,"stack")}function C(t){return{}.toString.call(t)}function w(t,e,n){for(var r=F.names(t),o=0;o<r.length;++o){var i=r[o];if(n(i))try{F.defineProperty(e,i,F.getDescriptor(t,i))}catch(a){}}}function k(t){return I?process.env[t]:void 0}function E(){if("function"==typeof Promise)try{var t=new Promise(function(){});if("[object Promise]"===C(t))return Promise}catch(e){}}function j(t,e){if(null===t||"function"!=typeof e||e===D)return e;null!==t.domain&&(e=t.domain.bind(e));var n=t.async;if(null!==n){var r=e;e=function(){var t=new Array(2).concat([].slice.call(arguments));return t[0]=r,t[1]=this,n.runInAsyncScope.apply(n,t)}}return e}var F=t("./es5"),T="undefined"==typeof navigator,x={e:{}},R,S="undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:void 0!==this?this:null,P=function(t,e){function n(){this.constructor=t,this.constructor$=e;for(var n in e.prototype)r.call(e.prototype,n)&&"$"!==n.charAt(n.length-1)&&(this[n+"$"]=e.prototype[n])}var r={}.hasOwnProperty;return n.prototype=e.prototype,t.prototype=new n,t.prototype},O=function(){var t=[Array.prototype,Object.prototype,Function.prototype],e=function(e){for(var n=0;n<t.length;++n)if(t[n]===e)return!0;return!1};if(F.isES5){var n=Object.getOwnPropertyNames;return function(t){for(var r=[],o=Object.create(null);null!=t&&!e(t);){var i;try{i=n(t)}catch(a){return r}for(var s=0;s<i.length;++s){var c=i[s];if(!o[c]){o[c]=!0;var l=Object.getOwnPropertyDescriptor(t,c);null!=l&&null==l.get&&null==l.set&&r.push(c)}}t=F.getPrototypeOf(t)}return r}}var r={}.hasOwnProperty;return function(n){if(e(n))return[];var o=[];t:for(var i in n)if(r.call(n,i))o.push(i);else{for(var a=0;a<t.length;++a)if(r.call(t[a],i))continue t;o.push(i)}return o}}(),A=/this\s*\.\s*\S+\s*=/,H=/^[a-z$_][a-z$_0-9]*$/i,N=function(){return"stack"in new Error?function(t){return b(t)?t:new Error(v(t))}:function(t){if(b(t))return t;try{throw new Error(v(t))}catch(e){return e}}}(),L=function(t){return F.isArray(t)?t:null};if("undefined"!=typeof Symbol&&Symbol.iterator){var B="function"==typeof Array.from?function(t){return Array.from(t)}:function(t){for(var e,n=[],r=t[Symbol.iterator]();!(e=r.next()).done;)n.push(e.value);return n};L=function(t){return F.isArray(t)?t:null!=t&&"function"==typeof t[Symbol.iterator]?B(t):null}}var U="undefined"!=typeof process&&"[object process]"===C(process).toLowerCase(),I="undefined"!=typeof process&&"undefined"!=typeof process.env,D,V={setReflectHandler:function(t){D=t},isClass:f,isIdentifier:d,inheritedDataKeys:O,getDataPropertyOrDefault:l,thrower:p,isArray:F.isArray,asArray:L,notEnumerableProp:u,isPrimitive:i,isObject:a,isError:y,canEvaluate:T,errorObj:x,tryCatch:o,inherits:P,withAppended:c,maybeWrapAsError:s,toFastProperties:h,filledRange:_,toString:v,canAttachTrace:b,ensureErrorObject:N,originatesFromRejection:m,markAsOriginatingFromRejection:g,classString:C,copyDescriptors:w,isNode:U,hasEnvVariables:I,env:k,global:S,getNativePromise:E,contextBind:j};V.isRecentNode=V.isNode&&function(){var t;return process.versions&&process.versions.node?t=process.versions.node.split(".").map(Number):process.version&&(t=process.version.split(".").map(Number)),0===t[0]&&t[1]>10||t[0]>0}(),V.nodeSupportsAsyncResource=V.isNode&&function(){var e=!1;try{var n=t("async_hooks").AsyncResource;e="function"==typeof n.prototype.runInAsyncScope}catch(r){e=!1}return e}(),V.isNode&&V.toFastProperties(process);try{throw new Error}catch(Q){V.lastLineError=Q}e.exports=V},{"./es5":10,async_hooks:void 0}]},{},[3])(3)}),"undefined"!=typeof window&&null!==window?window.P=window.Promise:"undefined"!=typeof self&&null!==self&&(self.P=self.Promise);/* @preserve
 * The MIT License (MIT)
 * 
 * Copyright (c) 2013-2018 Petka Antonov
 * 
 * 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.
 * 
 */
/**
 * bluebird build version 3.7.2
 * Features enabled: core, race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each
*/
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.Promise=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof _dereq_=="function"&&_dereq_;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof _dereq_=="function"&&_dereq_;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise) {
var SomePromiseArray = Promise._SomePromiseArray;
function any(promises) {
    var ret = new SomePromiseArray(promises);
    var promise = ret.promise();
    ret.setHowMany(1);
    ret.setUnwrap();
    ret.init();
    return promise;
}

Promise.any = function (promises) {
    return any(promises);
};

Promise.prototype.any = function () {
    return any(this);
};

};

},{}],2:[function(_dereq_,module,exports){
"use strict";
var firstLineError;
try {throw new Error(); } catch (e) {firstLineError = e;}
var schedule = _dereq_("./schedule");
var Queue = _dereq_("./queue");

function Async() {
    this._customScheduler = false;
    this._isTickUsed = false;
    this._lateQueue = new Queue(16);
    this._normalQueue = new Queue(16);
    this._haveDrainedQueues = false;
    var self = this;
    this.drainQueues = function () {
        self._drainQueues();
    };
    this._schedule = schedule;
}

Async.prototype.setScheduler = function(fn) {
    var prev = this._schedule;
    this._schedule = fn;
    this._customScheduler = true;
    return prev;
};

Async.prototype.hasCustomScheduler = function() {
    return this._customScheduler;
};

Async.prototype.haveItemsQueued = function () {
    return this._isTickUsed || this._haveDrainedQueues;
};


Async.prototype.fatalError = function(e, isNode) {
    if (isNode) {
        process.stderr.write("Fatal " + (e instanceof Error ? e.stack : e) +
            "\n");
        process.exit(2);
    } else {
        this.throwLater(e);
    }
};

Async.prototype.throwLater = function(fn, arg) {
    if (arguments.length === 1) {
        arg = fn;
        fn = function () { throw arg; };
    }
    if (typeof setTimeout !== "undefined") {
        setTimeout(function() {
            fn(arg);
        }, 0);
    } else try {
        this._schedule(function() {
            fn(arg);
        });
    } catch (e) {
        throw new Error("No async scheduler available\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
};

function AsyncInvokeLater(fn, receiver, arg) {
    this._lateQueue.push(fn, receiver, arg);
    this._queueTick();
}

function AsyncInvoke(fn, receiver, arg) {
    this._normalQueue.push(fn, receiver, arg);
    this._queueTick();
}

function AsyncSettlePromises(promise) {
    this._normalQueue._pushOne(promise);
    this._queueTick();
}

Async.prototype.invokeLater = AsyncInvokeLater;
Async.prototype.invoke = AsyncInvoke;
Async.prototype.settlePromises = AsyncSettlePromises;


function _drainQueue(queue) {
    while (queue.length() > 0) {
        _drainQueueStep(queue);
    }
}

function _drainQueueStep(queue) {
    var fn = queue.shift();
    if (typeof fn !== "function") {
        fn._settlePromises();
    } else {
        var receiver = queue.shift();
        var arg = queue.shift();
        fn.call(receiver, arg);
    }
}

Async.prototype._drainQueues = function () {
    _drainQueue(this._normalQueue);
    this._reset();
    this._haveDrainedQueues = true;
    _drainQueue(this._lateQueue);
};

Async.prototype._queueTick = function () {
    if (!this._isTickUsed) {
        this._isTickUsed = true;
        this._schedule(this.drainQueues);
    }
};

Async.prototype._reset = function () {
    this._isTickUsed = false;
};

module.exports = Async;
module.exports.firstLineError = firstLineError;

},{"./queue":26,"./schedule":29}],3:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL, tryConvertToPromise, debug) {
var calledBind = false;
var rejectThis = function(_, e) {
    this._reject(e);
};

var targetRejected = function(e, context) {
    context.promiseRejectionQueued = true;
    context.bindingPromise._then(rejectThis, rejectThis, null, this, e);
};

var bindingResolved = function(thisArg, context) {
    if (((this._bitField & 50397184) === 0)) {
        this._resolveCallback(context.target);
    }
};

var bindingRejected = function(e, context) {
    if (!context.promiseRejectionQueued) this._reject(e);
};

Promise.prototype.bind = function (thisArg) {
    if (!calledBind) {
        calledBind = true;
        Promise.prototype._propagateFrom = debug.propagateFromFunction();
        Promise.prototype._boundValue = debug.boundValueFunction();
    }
    var maybePromise = tryConvertToPromise(thisArg);
    var ret = new Promise(INTERNAL);
    ret._propagateFrom(this, 1);
    var target = this._target();
    ret._setBoundTo(maybePromise);
    if (maybePromise instanceof Promise) {
        var context = {
            promiseRejectionQueued: false,
            promise: ret,
            target: target,
            bindingPromise: maybePromise
        };
        target._then(INTERNAL, targetRejected, undefined, ret, context);
        maybePromise._then(
            bindingResolved, bindingRejected, undefined, ret, context);
        ret._setOnCancel(maybePromise);
    } else {
        ret._resolveCallback(target);
    }
    return ret;
};

Promise.prototype._setBoundTo = function (obj) {
    if (obj !== undefined) {
        this._bitField = this._bitField | 2097152;
        this._boundTo = obj;
    } else {
        this._bitField = this._bitField & (~2097152);
    }
};

Promise.prototype._isBound = function () {
    return (this._bitField & 2097152) === 2097152;
};

Promise.bind = function (thisArg, value) {
    return Promise.resolve(value).bind(thisArg);
};
};

},{}],4:[function(_dereq_,module,exports){
"use strict";
var old;
if (typeof Promise !== "undefined") old = Promise;
function noConflict() {
    try { if (Promise === bluebird) Promise = old; }
    catch (e) {}
    return bluebird;
}
var bluebird = _dereq_("./promise")();
bluebird.noConflict = noConflict;
module.exports = bluebird;

},{"./promise":22}],5:[function(_dereq_,module,exports){
"use strict";
var cr = Object.create;
if (cr) {
    var callerCache = cr(null);
    var getterCache = cr(null);
    callerCache[" size"] = getterCache[" size"] = 0;
}

module.exports = function(Promise) {
var util = _dereq_("./util");
var canEvaluate = util.canEvaluate;
var isIdentifier = util.isIdentifier;

var getMethodCaller;
var getGetter;
if (!true) {
var makeMethodCaller = function (methodName) {
    return new Function("ensureMethod", "                                    \n\
        return function(obj) {                                               \n\
            'use strict'                                                     \n\
            var len = this.length;                                           \n\
            ensureMethod(obj, 'methodName');                                 \n\
            switch(len) {                                                    \n\
                case 1: return obj.methodName(this[0]);                      \n\
                case 2: return obj.methodName(this[0], this[1]);             \n\
                case 3: return obj.methodName(this[0], this[1], this[2]);    \n\
                case 0: return obj.methodName();                             \n\
                default:                                                     \n\
                    return obj.methodName.apply(obj, this);                  \n\
            }                                                                \n\
        };                                                                   \n\
        ".replace(/methodName/g, methodName))(ensureMethod);
};

var makeGetter = function (propertyName) {
    return new Function("obj", "                                             \n\
        'use strict';                                                        \n\
        return obj.propertyName;                                             \n\
        ".replace("propertyName", propertyName));
};

var getCompiled = function(name, compiler, cache) {
    var ret = cache[name];
    if (typeof ret !== "function") {
        if (!isIdentifier(name)) {
            return null;
        }
        ret = compiler(name);
        cache[name] = ret;
        cache[" size"]++;
        if (cache[" size"] > 512) {
            var keys = Object.keys(cache);
            for (var i = 0; i < 256; ++i) delete cache[keys[i]];
            cache[" size"] = keys.length - 256;
        }
    }
    return ret;
};

getMethodCaller = function(name) {
    return getCompiled(name, makeMethodCaller, callerCache);
};

getGetter = function(name) {
    return getCompiled(name, makeGetter, getterCache);
};
}

function ensureMethod(obj, methodName) {
    var fn;
    if (obj != null) fn = obj[methodName];
    if (typeof fn !== "function") {
        var message = "Object " + util.classString(obj) + " has no method '" +
            util.toString(methodName) + "'";
        throw new Promise.TypeError(message);
    }
    return fn;
}

function caller(obj) {
    var methodName = this.pop();
    var fn = ensureMethod(obj, methodName);
    return fn.apply(obj, this);
}
Promise.prototype.call = function (methodName) {
    var args = [].slice.call(arguments, 1);;
    if (!true) {
        if (canEvaluate) {
            var maybeCaller = getMethodCaller(methodName);
            if (maybeCaller !== null) {
                return this._then(
                    maybeCaller, undefined, undefined, args, undefined);
            }
        }
    }
    args.push(methodName);
    return this._then(caller, undefined, undefined, args, undefined);
};

function namedGetter(obj) {
    return obj[this];
}
function indexedGetter(obj) {
    var index = +this;
    if (index < 0) index = Math.max(0, index + obj.length);
    return obj[index];
}
Promise.prototype.get = function (propertyName) {
    var isIndex = (typeof propertyName === "number");
    var getter;
    if (!isIndex) {
        if (canEvaluate) {
            var maybeGetter = getGetter(propertyName);
            getter = maybeGetter !== null ? maybeGetter : namedGetter;
        } else {
            getter = namedGetter;
        }
    } else {
        getter = indexedGetter;
    }
    return this._then(getter, undefined, undefined, propertyName, undefined);
};
};

},{"./util":36}],6:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, PromiseArray, apiRejection, debug) {
var util = _dereq_("./util");
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;
var async = Promise._async;

Promise.prototype["break"] = Promise.prototype.cancel = function() {
    if (!debug.cancellation()) return this._warn("cancellation is disabled");

    var promise = this;
    var child = promise;
    while (promise._isCancellable()) {
        if (!promise._cancelBy(child)) {
            if (child._isFollowing()) {
                child._followee().cancel();
            } else {
                child._cancelBranched();
            }
            break;
        }

        var parent = promise._cancellationParent;
        if (parent == null || !parent._isCancellable()) {
            if (promise._isFollowing()) {
                promise._followee().cancel();
            } else {
                promise._cancelBranched();
            }
            break;
        } else {
            if (promise._isFollowing()) promise._followee().cancel();
            promise._setWillBeCancelled();
            child = promise;
            promise = parent;
        }
    }
};

Promise.prototype._branchHasCancelled = function() {
    this._branchesRemainingToCancel--;
};

Promise.prototype._enoughBranchesHaveCancelled = function() {
    return this._branchesRemainingToCancel === undefined ||
           this._branchesRemainingToCancel <= 0;
};

Promise.prototype._cancelBy = function(canceller) {
    if (canceller === this) {
        this._branchesRemainingToCancel = 0;
        this._invokeOnCancel();
        return true;
    } else {
        this._branchHasCancelled();
        if (this._enoughBranchesHaveCancelled()) {
            this._invokeOnCancel();
            return true;
        }
    }
    return false;
};

Promise.prototype._cancelBranched = function() {
    if (this._enoughBranchesHaveCancelled()) {
        this._cancel();
    }
};

Promise.prototype._cancel = function() {
    if (!this._isCancellable()) return;
    this._setCancelled();
    async.invoke(this._cancelPromises, this, undefined);
};

Promise.prototype._cancelPromises = function() {
    if (this._length() > 0) this._settlePromises();
};

Promise.prototype._unsetOnCancel = function() {
    this._onCancelField = undefined;
};

Promise.prototype._isCancellable = function() {
    return this.isPending() && !this._isCancelled();
};

Promise.prototype.isCancellable = function() {
    return this.isPending() && !this.isCancelled();
};

Promise.prototype._doInvokeOnCancel = function(onCancelCallback, internalOnly) {
    if (util.isArray(onCancelCallback)) {
        for (var i = 0; i < onCancelCallback.length; ++i) {
            this._doInvokeOnCancel(onCancelCallback[i], internalOnly);
        }
    } else if (onCancelCallback !== undefined) {
        if (typeof onCancelCallback === "function") {
            if (!internalOnly) {
                var e = tryCatch(onCancelCallback).call(this._boundValue());
                if (e === errorObj) {
                    this._attachExtraTrace(e.e);
                    async.throwLater(e.e);
                }
            }
        } else {
            onCancelCallback._resultCancelled(this);
        }
    }
};

Promise.prototype._invokeOnCancel = function() {
    var onCancelCallback = this._onCancel();
    this._unsetOnCancel();
    async.invoke(this._doInvokeOnCancel, this, onCancelCallback);
};

Promise.prototype._invokeInternalOnCancel = function() {
    if (this._isCancellable()) {
        this._doInvokeOnCancel(this._onCancel(), true);
        this._unsetOnCancel();
    }
};

Promise.prototype._resultCancelled = function() {
    this.cancel();
};

};

},{"./util":36}],7:[function(_dereq_,module,exports){
"use strict";
module.exports = function(NEXT_FILTER) {
var util = _dereq_("./util");
var getKeys = _dereq_("./es5").keys;
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;

function catchFilter(instances, cb, promise) {
    return function(e) {
        var boundTo = promise._boundValue();
        predicateLoop: for (var i = 0; i < instances.length; ++i) {
            var item = instances[i];

            if (item === Error ||
                (item != null && item.prototype instanceof Error)) {
                if (e instanceof item) {
                    return tryCatch(cb).call(boundTo, e);
                }
            } else if (typeof item === "function") {
                var matchesPredicate = tryCatch(item).call(boundTo, e);
                if (matchesPredicate === errorObj) {
                    return matchesPredicate;
                } else if (matchesPredicate) {
                    return tryCatch(cb).call(boundTo, e);
                }
            } else if (util.isObject(e)) {
                var keys = getKeys(item);
                for (var j = 0; j < keys.length; ++j) {
                    var key = keys[j];
                    if (item[key] != e[key]) {
                        continue predicateLoop;
                    }
                }
                return tryCatch(cb).call(boundTo, e);
            }
        }
        return NEXT_FILTER;
    };
}

return catchFilter;
};

},{"./es5":13,"./util":36}],8:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise) {
var longStackTraces = false;
var contextStack = [];

Promise.prototype._promiseCreated = function() {};
Promise.prototype._pushContext = function() {};
Promise.prototype._popContext = function() {return null;};
Promise._peekContext = Promise.prototype._peekContext = function() {};

function Context() {
    this._trace = new Context.CapturedTrace(peekContext());
}
Context.prototype._pushContext = function () {
    if (this._trace !== undefined) {
        this._trace._promiseCreated = null;
        contextStack.push(this._trace);
    }
};

Context.prototype._popContext = function () {
    if (this._trace !== undefined) {
        var trace = contextStack.pop();
        var ret = trace._promiseCreated;
        trace._promiseCreated = null;
        return ret;
    }
    return null;
};

function createContext() {
    if (longStackTraces) return new Context();
}

function peekContext() {
    var lastIndex = contextStack.length - 1;
    if (lastIndex >= 0) {
        return contextStack[lastIndex];
    }
    return undefined;
}
Context.CapturedTrace = null;
Context.create = createContext;
Context.deactivateLongStackTraces = function() {};
Context.activateLongStackTraces = function() {
    var Promise_pushContext = Promise.prototype._pushContext;
    var Promise_popContext = Promise.prototype._popContext;
    var Promise_PeekContext = Promise._peekContext;
    var Promise_peekContext = Promise.prototype._peekContext;
    var Promise_promiseCreated = Promise.prototype._promiseCreated;
    Context.deactivateLongStackTraces = function() {
        Promise.prototype._pushContext = Promise_pushContext;
        Promise.prototype._popContext = Promise_popContext;
        Promise._peekContext = Promise_PeekContext;
        Promise.prototype._peekContext = Promise_peekContext;
        Promise.prototype._promiseCreated = Promise_promiseCreated;
        longStackTraces = false;
    };
    longStackTraces = true;
    Promise.prototype._pushContext = Context.prototype._pushContext;
    Promise.prototype._popContext = Context.prototype._popContext;
    Promise._peekContext = Promise.prototype._peekContext = peekContext;
    Promise.prototype._promiseCreated = function() {
        var ctx = this._peekContext();
        if (ctx && ctx._promiseCreated == null) ctx._promiseCreated = this;
    };
};
return Context;
};

},{}],9:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, Context,
    enableAsyncHooks, disableAsyncHooks) {
var async = Promise._async;
var Warning = _dereq_("./errors").Warning;
var util = _dereq_("./util");
var es5 = _dereq_("./es5");
var canAttachTrace = util.canAttachTrace;
var unhandledRejectionHandled;
var possiblyUnhandledRejection;
var bluebirdFramePattern =
    /[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/;
var nodeFramePattern = /\((?:timers\.js):\d+:\d+\)/;
var parseLinePattern = /[\/<\(](.+?):(\d+):(\d+)\)?\s*$/;
var stackFramePattern = null;
var formatStack = null;
var indentStackFrames = false;
var printWarning;
var debugging = !!(util.env("BLUEBIRD_DEBUG") != 0 &&
                        (true ||
                         util.env("BLUEBIRD_DEBUG") ||
                         util.env("NODE_ENV") === "development"));

var warnings = !!(util.env("BLUEBIRD_WARNINGS") != 0 &&
    (debugging || util.env("BLUEBIRD_WARNINGS")));

var longStackTraces = !!(util.env("BLUEBIRD_LONG_STACK_TRACES") != 0 &&
    (debugging || util.env("BLUEBIRD_LONG_STACK_TRACES")));

var wForgottenReturn = util.env("BLUEBIRD_W_FORGOTTEN_RETURN") != 0 &&
    (warnings || !!util.env("BLUEBIRD_W_FORGOTTEN_RETURN"));

var deferUnhandledRejectionCheck;
(function() {
    var promises = [];

    function unhandledRejectionCheck() {
        for (var i = 0; i < promises.length; ++i) {
            promises[i]._notifyUnhandledRejection();
        }
        unhandledRejectionClear();
    }

    function unhandledRejectionClear() {
        promises.length = 0;
    }

    deferUnhandledRejectionCheck = function(promise) {
        promises.push(promise);
        setTimeout(unhandledRejectionCheck, 1);
    };

    es5.defineProperty(Promise, "_unhandledRejectionCheck", {
        value: unhandledRejectionCheck
    });
    es5.defineProperty(Promise, "_unhandledRejectionClear", {
        value: unhandledRejectionClear
    });
})();

Promise.prototype.suppressUnhandledRejections = function() {
    var target = this._target();
    target._bitField = ((target._bitField & (~1048576)) |
                      524288);
};

Promise.prototype._ensurePossibleRejectionHandled = function () {
    if ((this._bitField & 524288) !== 0) return;
    this._setRejectionIsUnhandled();
    deferUnhandledRejectionCheck(this);
};

Promise.prototype._notifyUnhandledRejectionIsHandled = function () {
    fireRejectionEvent("rejectionHandled",
                                  unhandledRejectionHandled, undefined, this);
};

Promise.prototype._setReturnedNonUndefined = function() {
    this._bitField = this._bitField | 268435456;
};

Promise.prototype._returnedNonUndefined = function() {
    return (this._bitField & 268435456) !== 0;
};

Promise.prototype._notifyUnhandledRejection = function () {
    if (this._isRejectionUnhandled()) {
        var reason = this._settledValue();
        this._setUnhandledRejectionIsNotified();
        fireRejectionEvent("unhandledRejection",
                                      possiblyUnhandledRejection, reason, this);
    }
};

Promise.prototype._setUnhandledRejectionIsNotified = function () {
    this._bitField = this._bitField | 262144;
};

Promise.prototype._unsetUnhandledRejectionIsNotified = function () {
    this._bitField = this._bitField & (~262144);
};

Promise.prototype._isUnhandledRejectionNotified = function () {
    return (this._bitField & 262144) > 0;
};

Promise.prototype._setRejectionIsUnhandled = function () {
    this._bitField = this._bitField | 1048576;
};

Promise.prototype._unsetRejectionIsUnhandled = function () {
    this._bitField = this._bitField & (~1048576);
    if (this._isUnhandledRejectionNotified()) {
        this._unsetUnhandledRejectionIsNotified();
        this._notifyUnhandledRejectionIsHandled();
    }
};

Promise.prototype._isRejectionUnhandled = function () {
    return (this._bitField & 1048576) > 0;
};

Promise.prototype._warn = function(message, shouldUseOwnTrace, promise) {
    return warn(message, shouldUseOwnTrace, promise || this);
};

Promise.onPossiblyUnhandledRejection = function (fn) {
    var context = Promise._getContext();
    possiblyUnhandledRejection = util.contextBind(context, fn);
};

Promise.onUnhandledRejectionHandled = function (fn) {
    var context = Promise._getContext();
    unhandledRejectionHandled = util.contextBind(context, fn);
};

var disableLongStackTraces = function() {};
Promise.longStackTraces = function () {
    if (async.haveItemsQueued() && !config.longStackTraces) {
        throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    if (!config.longStackTraces && longStackTracesIsSupported()) {
        var Promise_captureStackTrace = Promise.prototype._captureStackTrace;
        var Promise_attachExtraTrace = Promise.prototype._attachExtraTrace;
        var Promise_dereferenceTrace = Promise.prototype._dereferenceTrace;
        config.longStackTraces = true;
        disableLongStackTraces = function() {
            if (async.haveItemsQueued() && !config.longStackTraces) {
                throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
            }
            Promise.prototype._captureStackTrace = Promise_captureStackTrace;
            Promise.prototype._attachExtraTrace = Promise_attachExtraTrace;
            Promise.prototype._dereferenceTrace = Promise_dereferenceTrace;
            Context.deactivateLongStackTraces();
            config.longStackTraces = false;
        };
        Promise.prototype._captureStackTrace = longStackTracesCaptureStackTrace;
        Promise.prototype._attachExtraTrace = longStackTracesAttachExtraTrace;
        Promise.prototype._dereferenceTrace = longStackTracesDereferenceTrace;
        Context.activateLongStackTraces();
    }
};

Promise.hasLongStackTraces = function () {
    return config.longStackTraces && longStackTracesIsSupported();
};


var legacyHandlers = {
    unhandledrejection: {
        before: function() {
            var ret = util.global.onunhandledrejection;
            util.global.onunhandledrejection = null;
            return ret;
        },
        after: function(fn) {
            util.global.onunhandledrejection = fn;
        }
    },
    rejectionhandled: {
        before: function() {
            var ret = util.global.onrejectionhandled;
            util.global.onrejectionhandled = null;
            return ret;
        },
        after: function(fn) {
            util.global.onrejectionhandled = fn;
        }
    }
};

var fireDomEvent = (function() {
    var dispatch = function(legacy, e) {
        if (legacy) {
            var fn;
            try {
                fn = legacy.before();
                return !util.global.dispatchEvent(e);
            } finally {
                legacy.after(fn);
            }
        } else {
            return !util.global.dispatchEvent(e);
        }
    };
    try {
        if (typeof CustomEvent === "function") {
            var event = new CustomEvent("CustomEvent");
            util.global.dispatchEvent(event);
            return function(name, event) {
                name = name.toLowerCase();
                var eventData = {
                    detail: event,
                    cancelable: true
                };
                var domEvent = new CustomEvent(name, eventData);
                es5.defineProperty(
                    domEvent, "promise", {value: event.promise});
                es5.defineProperty(
                    domEvent, "reason", {value: event.reason});

                return dispatch(legacyHandlers[name], domEvent);
            };
        } else if (typeof Event === "function") {
            var event = new Event("CustomEvent");
            util.global.dispatchEvent(event);
            return function(name, event) {
                name = name.toLowerCase();
                var domEvent = new Event(name, {
                    cancelable: true
                });
                domEvent.detail = event;
                es5.defineProperty(domEvent, "promise", {value: event.promise});
                es5.defineProperty(domEvent, "reason", {value: event.reason});
                return dispatch(legacyHandlers[name], domEvent);
            };
        } else {
            var event = document.createEvent("CustomEvent");
            event.initCustomEvent("testingtheevent", false, true, {});
            util.global.dispatchEvent(event);
            return function(name, event) {
                name = name.toLowerCase();
                var domEvent = document.createEvent("CustomEvent");
                domEvent.initCustomEvent(name, false, true,
                    event);
                return dispatch(legacyHandlers[name], domEvent);
            };
        }
    } catch (e) {}
    return function() {
        return false;
    };
})();

var fireGlobalEvent = (function() {
    if (util.isNode) {
        return function() {
            return process.emit.apply(process, arguments);
        };
    } else {
        if (!util.global) {
            return function() {
                return false;
            };
        }
        return function(name) {
            var methodName = "on" + name.toLowerCase();
            var method = util.global[methodName];
            if (!method) return false;
            method.apply(util.global, [].slice.call(arguments, 1));
            return true;
        };
    }
})();

function generatePromiseLifecycleEventObject(name, promise) {
    return {promise: promise};
}

var eventToObjectGenerator = {
    promiseCreated: generatePromiseLifecycleEventObject,
    promiseFulfilled: generatePromiseLifecycleEventObject,
    promiseRejected: generatePromiseLifecycleEventObject,
    promiseResolved: generatePromiseLifecycleEventObject,
    promiseCancelled: generatePromiseLifecycleEventObject,
    promiseChained: function(name, promise, child) {
        return {promise: promise, child: child};
    },
    warning: function(name, warning) {
        return {warning: warning};
    },
    unhandledRejection: function (name, reason, promise) {
        return {reason: reason, promise: promise};
    },
    rejectionHandled: generatePromiseLifecycleEventObject
};

var activeFireEvent = function (name) {
    var globalEventFired = false;
    try {
        globalEventFired = fireGlobalEvent.apply(null, arguments);
    } catch (e) {
        async.throwLater(e);
        globalEventFired = true;
    }

    var domEventFired = false;
    try {
        domEventFired = fireDomEvent(name,
                    eventToObjectGenerator[name].apply(null, arguments));
    } catch (e) {
        async.throwLater(e);
        domEventFired = true;
    }

    return domEventFired || globalEventFired;
};

Promise.config = function(opts) {
    opts = Object(opts);
    if ("longStackTraces" in opts) {
        if (opts.longStackTraces) {
            Promise.longStackTraces();
        } else if (!opts.longStackTraces && Promise.hasLongStackTraces()) {
            disableLongStackTraces();
        }
    }
    if ("warnings" in opts) {
        var warningsOption = opts.warnings;
        config.warnings = !!warningsOption;
        wForgottenReturn = config.warnings;

        if (util.isObject(warningsOption)) {
            if ("wForgottenReturn" in warningsOption) {
                wForgottenReturn = !!warningsOption.wForgottenReturn;
            }
        }
    }
    if ("cancellation" in opts && opts.cancellation && !config.cancellation) {
        if (async.haveItemsQueued()) {
            throw new Error(
                "cannot enable cancellation after promises are in use");
        }
        Promise.prototype._clearCancellationData =
            cancellationClearCancellationData;
        Promise.prototype._propagateFrom = cancellationPropagateFrom;
        Promise.prototype._onCancel = cancellationOnCancel;
        Promise.prototype._setOnCancel = cancellationSetOnCancel;
        Promise.prototype._attachCancellationCallback =
            cancellationAttachCancellationCallback;
        Promise.prototype._execute = cancellationExecute;
        propagateFromFunction = cancellationPropagateFrom;
        config.cancellation = true;
    }
    if ("monitoring" in opts) {
        if (opts.monitoring && !config.monitoring) {
            config.monitoring = true;
            Promise.prototype._fireEvent = activeFireEvent;
        } else if (!opts.monitoring && config.monitoring) {
            config.monitoring = false;
            Promise.prototype._fireEvent = defaultFireEvent;
        }
    }
    if ("asyncHooks" in opts && util.nodeSupportsAsyncResource) {
        var prev = config.asyncHooks;
        var cur = !!opts.asyncHooks;
        if (prev !== cur) {
            config.asyncHooks = cur;
            if (cur) {
                enableAsyncHooks();
            } else {
                disableAsyncHooks();
            }
        }
    }
    return Promise;
};

function defaultFireEvent() { return false; }

Promise.prototype._fireEvent = defaultFireEvent;
Promise.prototype._execute = function(executor, resolve, reject) {
    try {
        executor(resolve, reject);
    } catch (e) {
        return e;
    }
};
Promise.prototype._onCancel = function () {};
Promise.prototype._setOnCancel = function (handler) { ; };
Promise.prototype._attachCancellationCallback = function(onCancel) {
    ;
};
Promise.prototype._captureStackTrace = function () {};
Promise.prototype._attachExtraTrace = function () {};
Promise.prototype._dereferenceTrace = function () {};
Promise.prototype._clearCancellationData = function() {};
Promise.prototype._propagateFrom = function (parent, flags) {
    ;
    ;
};

function cancellationExecute(executor, resolve, reject) {
    var promise = this;
    try {
        executor(resolve, reject, function(onCancel) {
            if (typeof onCancel !== "function") {
                throw new TypeError("onCancel must be a function, got: " +
                                    util.toString(onCancel));
            }
            promise._attachCancellationCallback(onCancel);
        });
    } catch (e) {
        return e;
    }
}

function cancellationAttachCancellationCallback(onCancel) {
    if (!this._isCancellable()) return this;

    var previousOnCancel = this._onCancel();
    if (previousOnCancel !== undefined) {
        if (util.isArray(previousOnCancel)) {
            previousOnCancel.push(onCancel);
        } else {
            this._setOnCancel([previousOnCancel, onCancel]);
        }
    } else {
        this._setOnCancel(onCancel);
    }
}

function cancellationOnCancel() {
    return this._onCancelField;
}

function cancellationSetOnCancel(onCancel) {
    this._onCancelField = onCancel;
}

function cancellationClearCancellationData() {
    this._cancellationParent = undefined;
    this._onCancelField = undefined;
}

function cancellationPropagateFrom(parent, flags) {
    if ((flags & 1) !== 0) {
        this._cancellationParent = parent;
        var branchesRemainingToCancel = parent._branchesRemainingToCancel;
        if (branchesRemainingToCancel === undefined) {
            branchesRemainingToCancel = 0;
        }
        parent._branchesRemainingToCancel = branchesRemainingToCancel + 1;
    }
    if ((flags & 2) !== 0 && parent._isBound()) {
        this._setBoundTo(parent._boundTo);
    }
}

function bindingPropagateFrom(parent, flags) {
    if ((flags & 2) !== 0 && parent._isBound()) {
        this._setBoundTo(parent._boundTo);
    }
}
var propagateFromFunction = bindingPropagateFrom;

function boundValueFunction() {
    var ret = this._boundTo;
    if (ret !== undefined) {
        if (ret instanceof Promise) {
            if (ret.isFulfilled()) {
                return ret.value();
            } else {
                return undefined;
            }
        }
    }
    return ret;
}

function longStackTracesCaptureStackTrace() {
    this._trace = new CapturedTrace(this._peekContext());
}

function longStackTracesAttachExtraTrace(error, ignoreSelf) {
    if (canAttachTrace(error)) {
        var trace = this._trace;
        if (trace !== undefined) {
            if (ignoreSelf) trace = trace._parent;
        }
        if (trace !== undefined) {
            trace.attachExtraTrace(error);
        } else if (!error.__stackCleaned__) {
            var parsed = parseStackAndMessage(error);
            util.notEnumerableProp(error, "stack",
                parsed.message + "\n" + parsed.stack.join("\n"));
            util.notEnumerableProp(error, "__stackCleaned__", true);
        }
    }
}

function longStackTracesDereferenceTrace() {
    this._trace = undefined;
}

function checkForgottenReturns(returnValue, promiseCreated, name, promise,
                               parent) {
    if (returnValue === undefined && promiseCreated !== null &&
        wForgottenReturn) {
        if (parent !== undefined && parent._returnedNonUndefined()) return;
        if ((promise._bitField & 65535) === 0) return;

        if (name) name = name + " ";
        var handlerLine = "";
        var creatorLine = "";
        if (promiseCreated._trace) {
            var traceLines = promiseCreated._trace.stack.split("\n");
            var stack = cleanStack(traceLines);
            for (var i = stack.length - 1; i >= 0; --i) {
                var line = stack[i];
                if (!nodeFramePattern.test(line)) {
                    var lineMatches = line.match(parseLinePattern);
                    if (lineMatches) {
                        handlerLine  = "at " + lineMatches[1] +
                            ":" + lineMatches[2] + ":" + lineMatches[3] + " ";
                    }
                    break;
                }
            }

            if (stack.length > 0) {
                var firstUserLine = stack[0];
                for (var i = 0; i < traceLines.length; ++i) {

                    if (traceLines[i] === firstUserLine) {
                        if (i > 0) {
                            creatorLine = "\n" + traceLines[i - 1];
                        }
                        break;
                    }
                }

            }
        }
        var msg = "a promise was created in a " + name +
            "handler " + handlerLine + "but was not returned from it, " +
            "see http://goo.gl/rRqMUw" +
            creatorLine;
        promise._warn(msg, true, promiseCreated);
    }
}

function deprecated(name, replacement) {
    var message = name +
        " is deprecated and will be removed in a future version.";
    if (replacement) message += " Use " + replacement + " instead.";
    return warn(message);
}

function warn(message, shouldUseOwnTrace, promise) {
    if (!config.warnings) return;
    var warning = new Warning(message);
    var ctx;
    if (shouldUseOwnTrace) {
        promise._attachExtraTrace(warning);
    } else if (config.longStackTraces && (ctx = Promise._peekContext())) {
        ctx.attachExtraTrace(warning);
    } else {
        var parsed = parseStackAndMessage(warning);
        warning.stack = parsed.message + "\n" + parsed.stack.join("\n");
    }

    if (!activeFireEvent("warning", warning)) {
        formatAndLogError(warning, "", true);
    }
}

function reconstructStack(message, stacks) {
    for (var i = 0; i < stacks.length - 1; ++i) {
        stacks[i].push("From previous event:");
        stacks[i] = stacks[i].join("\n");
    }
    if (i < stacks.length) {
        stacks[i] = stacks[i].join("\n");
    }
    return message + "\n" + stacks.join("\n");
}

function removeDuplicateOrEmptyJumps(stacks) {
    for (var i = 0; i < stacks.length; ++i) {
        if (stacks[i].length === 0 ||
            ((i + 1 < stacks.length) && stacks[i][0] === stacks[i+1][0])) {
            stacks.splice(i, 1);
            i--;
        }
    }
}

function removeCommonRoots(stacks) {
    var current = stacks[0];
    for (var i = 1; i < stacks.length; ++i) {
        var prev = stacks[i];
        var currentLastIndex = current.length - 1;
        var currentLastLine = current[currentLastIndex];
        var commonRootMeetPoint = -1;

        for (var j = prev.length - 1; j >= 0; --j) {
            if (prev[j] === currentLastLine) {
                commonRootMeetPoint = j;
                break;
            }
        }

        for (var j = commonRootMeetPoint; j >= 0; --j) {
            var line = prev[j];
            if (current[currentLastIndex] === line) {
                current.pop();
                currentLastIndex--;
            } else {
                break;
            }
        }
        current = prev;
    }
}

function cleanStack(stack) {
    var ret = [];
    for (var i = 0; i < stack.length; ++i) {
        var line = stack[i];
        var isTraceLine = "    (No stack trace)" === line ||
            stackFramePattern.test(line);
        var isInternalFrame = isTraceLine && shouldIgnore(line);
        if (isTraceLine && !isInternalFrame) {
            if (indentStackFrames && line.charAt(0) !== " ") {
                line = "    " + line;
            }
            ret.push(line);
        }
    }
    return ret;
}

function stackFramesAsArray(error) {
    var stack = error.stack.replace(/\s+$/g, "").split("\n");
    for (var i = 0; i < stack.length; ++i) {
        var line = stack[i];
        if ("    (No stack trace)" === line || stackFramePattern.test(line)) {
            break;
        }
    }
    if (i > 0 && error.name != "SyntaxError") {
        stack = stack.slice(i);
    }
    return stack;
}

function parseStackAndMessage(error) {
    var stack = error.stack;
    var message = error.toString();
    stack = typeof stack === "string" && stack.length > 0
                ? stackFramesAsArray(error) : ["    (No stack trace)"];
    return {
        message: message,
        stack: error.name == "SyntaxError" ? stack : cleanStack(stack)
    };
}

function formatAndLogError(error, title, isSoft) {
    if (typeof console !== "undefined") {
        var message;
        if (util.isObject(error)) {
            var stack = error.stack;
            message = title + formatStack(stack, error);
        } else {
            message = title + String(error);
        }
        if (typeof printWarning === "function") {
            printWarning(message, isSoft);
        } else if (typeof console.log === "function" ||
            typeof console.log === "object") {
            console.log(message);
        }
    }
}

function fireRejectionEvent(name, localHandler, reason, promise) {
    var localEventFired = false;
    try {
        if (typeof localHandler === "function") {
            localEventFired = true;
            if (name === "rejectionHandled") {
                localHandler(promise);
            } else {
                localHandler(reason, promise);
            }
        }
    } catch (e) {
        async.throwLater(e);
    }

    if (name === "unhandledRejection") {
        if (!activeFireEvent(name, reason, promise) && !localEventFired) {
            formatAndLogError(reason, "Unhandled rejection ");
        }
    } else {
        activeFireEvent(name, promise);
    }
}

function formatNonError(obj) {
    var str;
    if (typeof obj === "function") {
        str = "[function " +
            (obj.name || "anonymous") +
            "]";
    } else {
        str = obj && typeof obj.toString === "function"
            ? obj.toString() : util.toString(obj);
        var ruselessToString = /\[object [a-zA-Z0-9$_]+\]/;
        if (ruselessToString.test(str)) {
            try {
                var newStr = JSON.stringify(obj);
                str = newStr;
            }
            catch(e) {

            }
        }
        if (str.length === 0) {
            str = "(empty array)";
        }
    }
    return ("(<" + snip(str) + ">, no stack trace)");
}

function snip(str) {
    var maxChars = 41;
    if (str.length < maxChars) {
        return str;
    }
    return str.substr(0, maxChars - 3) + "...";
}

function longStackTracesIsSupported() {
    return typeof captureStackTrace === "function";
}

var shouldIgnore = function() { return false; };
var parseLineInfoRegex = /[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;
function parseLineInfo(line) {
    var matches = line.match(parseLineInfoRegex);
    if (matches) {
        return {
            fileName: matches[1],
            line: parseInt(matches[2], 10)
        };
    }
}

function setBounds(firstLineError, lastLineError) {
    if (!longStackTracesIsSupported()) return;
    var firstStackLines = (firstLineError.stack || "").split("\n");
    var lastStackLines = (lastLineError.stack || "").split("\n");
    var firstIndex = -1;
    var lastIndex = -1;
    var firstFileName;
    var lastFileName;
    for (var i = 0; i < firstStackLines.length; ++i) {
        var result = parseLineInfo(firstStackLines[i]);
        if (result) {
            firstFileName = result.fileName;
            firstIndex = result.line;
            break;
        }
    }
    for (var i = 0; i < lastStackLines.length; ++i) {
        var result = parseLineInfo(lastStackLines[i]);
        if (result) {
            lastFileName = result.fileName;
            lastIndex = result.line;
            break;
        }
    }
    if (firstIndex < 0 || lastIndex < 0 || !firstFileName || !lastFileName ||
        firstFileName !== lastFileName || firstIndex >= lastIndex) {
        return;
    }

    shouldIgnore = function(line) {
        if (bluebirdFramePattern.test(line)) return true;
        var info = parseLineInfo(line);
        if (info) {
            if (info.fileName === firstFileName &&
                (firstIndex <= info.line && info.line <= lastIndex)) {
                return true;
            }
        }
        return false;
    };
}

function CapturedTrace(parent) {
    this._parent = parent;
    this._promisesCreated = 0;
    var length = this._length = 1 + (parent === undefined ? 0 : parent._length);
    captureStackTrace(this, CapturedTrace);
    if (length > 32) this.uncycle();
}
util.inherits(CapturedTrace, Error);
Context.CapturedTrace = CapturedTrace;

CapturedTrace.prototype.uncycle = function() {
    var length = this._length;
    if (length < 2) return;
    var nodes = [];
    var stackToIndex = {};

    for (var i = 0, node = this; node !== undefined; ++i) {
        nodes.push(node);
        node = node._parent;
    }
    length = this._length = i;
    for (var i = length - 1; i >= 0; --i) {
        var stack = nodes[i].stack;
        if (stackToIndex[stack] === undefined) {
            stackToIndex[stack] = i;
        }
    }
    for (var i = 0; i < length; ++i) {
        var currentStack = nodes[i].stack;
        var index = stackToIndex[currentStack];
        if (index !== undefined && index !== i) {
            if (index > 0) {
                nodes[index - 1]._parent = undefined;
                nodes[index - 1]._length = 1;
            }
            nodes[i]._parent = undefined;
            nodes[i]._length = 1;
            var cycleEdgeNode = i > 0 ? nodes[i - 1] : this;

            if (index < length - 1) {
                cycleEdgeNode._parent = nodes[index + 1];
                cycleEdgeNode._parent.uncycle();
                cycleEdgeNode._length =
                    cycleEdgeNode._parent._length + 1;
            } else {
                cycleEdgeNode._parent = undefined;
                cycleEdgeNode._length = 1;
            }
            var currentChildLength = cycleEdgeNode._length + 1;
            for (var j = i - 2; j >= 0; --j) {
                nodes[j]._length = currentChildLength;
                currentChildLength++;
            }
            return;
        }
    }
};

CapturedTrace.prototype.attachExtraTrace = function(error) {
    if (error.__stackCleaned__) return;
    this.uncycle();
    var parsed = parseStackAndMessage(error);
    var message = parsed.message;
    var stacks = [parsed.stack];

    var trace = this;
    while (trace !== undefined) {
        stacks.push(cleanStack(trace.stack.split("\n")));
        trace = trace._parent;
    }
    removeCommonRoots(stacks);
    removeDuplicateOrEmptyJumps(stacks);
    util.notEnumerableProp(error, "stack", reconstructStack(message, stacks));
    util.notEnumerableProp(error, "__stackCleaned__", true);
};

var captureStackTrace = (function stackDetection() {
    var v8stackFramePattern = /^\s*at\s*/;
    var v8stackFormatter = function(stack, error) {
        if (typeof stack === "string") return stack;

        if (error.name !== undefined &&
            error.message !== undefined) {
            return error.toString();
        }
        return formatNonError(error);
    };

    if (typeof Error.stackTraceLimit === "number" &&
        typeof Error.captureStackTrace === "function") {
        Error.stackTraceLimit += 6;
        stackFramePattern = v8stackFramePattern;
        formatStack = v8stackFormatter;
        var captureStackTrace = Error.captureStackTrace;

        shouldIgnore = function(line) {
            return bluebirdFramePattern.test(line);
        };
        return function(receiver, ignoreUntil) {
            Error.stackTraceLimit += 6;
            captureStackTrace(receiver, ignoreUntil);
            Error.stackTraceLimit -= 6;
        };
    }
    var err = new Error();

    if (typeof err.stack === "string" &&
        err.stack.split("\n")[0].indexOf("stackDetection@") >= 0) {
        stackFramePattern = /@/;
        formatStack = v8stackFormatter;
        indentStackFrames = true;
        return function captureStackTrace(o) {
            o.stack = new Error().stack;
        };
    }

    var hasStackAfterThrow;
    try { throw new Error(); }
    catch(e) {
        hasStackAfterThrow = ("stack" in e);
    }
    if (!("stack" in err) && hasStackAfterThrow &&
        typeof Error.stackTraceLimit === "number") {
        stackFramePattern = v8stackFramePattern;
        formatStack = v8stackFormatter;
        return function captureStackTrace(o) {
            Error.stackTraceLimit += 6;
            try { throw new Error(); }
            catch(e) { o.stack = e.stack; }
            Error.stackTraceLimit -= 6;
        };
    }

    formatStack = function(stack, error) {
        if (typeof stack === "string") return stack;

        if ((typeof error === "object" ||
            typeof error === "function") &&
            error.name !== undefined &&
            error.message !== undefined) {
            return error.toString();
        }
        return formatNonError(error);
    };

    return null;

})([]);

if (typeof console !== "undefined" && typeof console.warn !== "undefined") {
    printWarning = function (message) {
        console.warn(message);
    };
    if (util.isNode && process.stderr.isTTY) {
        printWarning = function(message, isSoft) {
            var color = isSoft ? "\u001b[33m" : "\u001b[31m";
            console.warn(color + message + "\u001b[0m\n");
        };
    } else if (!util.isNode && typeof (new Error().stack) === "string") {
        printWarning = function(message, isSoft) {
            console.warn("%c" + message,
                        isSoft ? "color: darkorange" : "color: red");
        };
    }
}

var config = {
    warnings: warnings,
    longStackTraces: false,
    cancellation: false,
    monitoring: false,
    asyncHooks: false
};

if (longStackTraces) Promise.longStackTraces();

return {
    asyncHooks: function() {
        return config.asyncHooks;
    },
    longStackTraces: function() {
        return config.longStackTraces;
    },
    warnings: function() {
        return config.warnings;
    },
    cancellation: function() {
        return config.cancellation;
    },
    monitoring: function() {
        return config.monitoring;
    },
    propagateFromFunction: function() {
        return propagateFromFunction;
    },
    boundValueFunction: function() {
        return boundValueFunction;
    },
    checkForgottenReturns: checkForgottenReturns,
    setBounds: setBounds,
    warn: warn,
    deprecated: deprecated,
    CapturedTrace: CapturedTrace,
    fireDomEvent: fireDomEvent,
    fireGlobalEvent: fireGlobalEvent
};
};

},{"./errors":12,"./es5":13,"./util":36}],10:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise) {
function returner() {
    return this.value;
}
function thrower() {
    throw this.reason;
}

Promise.prototype["return"] =
Promise.prototype.thenReturn = function (value) {
    if (value instanceof Promise) value.suppressUnhandledRejections();
    return this._then(
        returner, undefined, undefined, {value: value}, undefined);
};

Promise.prototype["throw"] =
Promise.prototype.thenThrow = function (reason) {
    return this._then(
        thrower, undefined, undefined, {reason: reason}, undefined);
};

Promise.prototype.catchThrow = function (reason) {
    if (arguments.length <= 1) {
        return this._then(
            undefined, thrower, undefined, {reason: reason}, undefined);
    } else {
        var _reason = arguments[1];
        var handler = function() {throw _reason;};
        return this.caught(reason, handler);
    }
};

Promise.prototype.catchReturn = function (value) {
    if (arguments.length <= 1) {
        if (value instanceof Promise) value.suppressUnhandledRejections();
        return this._then(
            undefined, returner, undefined, {value: value}, undefined);
    } else {
        var _value = arguments[1];
        if (_value instanceof Promise) _value.suppressUnhandledRejections();
        var handler = function() {return _value;};
        return this.caught(value, handler);
    }
};
};

},{}],11:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL) {
var PromiseReduce = Promise.reduce;
var PromiseAll = Promise.all;

function promiseAllThis() {
    return PromiseAll(this);
}

function PromiseMapSeries(promises, fn) {
    return PromiseReduce(promises, fn, INTERNAL, INTERNAL);
}

Promise.prototype.each = function (fn) {
    return PromiseReduce(this, fn, INTERNAL, 0)
              ._then(promiseAllThis, undefined, undefined, this, undefined);
};

Promise.prototype.mapSeries = function (fn) {
    return PromiseReduce(this, fn, INTERNAL, INTERNAL);
};

Promise.each = function (promises, fn) {
    return PromiseReduce(promises, fn, INTERNAL, 0)
              ._then(promiseAllThis, undefined, undefined, promises, undefined);
};

Promise.mapSeries = PromiseMapSeries;
};


},{}],12:[function(_dereq_,module,exports){
"use strict";
var es5 = _dereq_("./es5");
var Objectfreeze = es5.freeze;
var util = _dereq_("./util");
var inherits = util.inherits;
var notEnumerableProp = util.notEnumerableProp;

function subError(nameProperty, defaultMessage) {
    function SubError(message) {
        if (!(this instanceof SubError)) return new SubError(message);
        notEnumerableProp(this, "message",
            typeof message === "string" ? message : defaultMessage);
        notEnumerableProp(this, "name", nameProperty);
        if (Error.captureStackTrace) {
            Error.captureStackTrace(this, this.constructor);
        } else {
            Error.call(this);
        }
    }
    inherits(SubError, Error);
    return SubError;
}

var _TypeError, _RangeError;
var Warning = subError("Warning", "warning");
var CancellationError = subError("CancellationError", "cancellation error");
var TimeoutError = subError("TimeoutError", "timeout error");
var AggregateError = subError("AggregateError", "aggregate error");
try {
    _TypeError = TypeError;
    _RangeError = RangeError;
} catch(e) {
    _TypeError = subError("TypeError", "type error");
    _RangeError = subError("RangeError", "range error");
}

var methods = ("join pop push shift unshift slice filter forEach some " +
    "every map indexOf lastIndexOf reduce reduceRight sort reverse").split(" ");

for (var i = 0; i < methods.length; ++i) {
    if (typeof Array.prototype[methods[i]] === "function") {
        AggregateError.prototype[methods[i]] = Array.prototype[methods[i]];
    }
}

es5.defineProperty(AggregateError.prototype, "length", {
    value: 0,
    configurable: false,
    writable: true,
    enumerable: true
});
AggregateError.prototype["isOperational"] = true;
var level = 0;
AggregateError.prototype.toString = function() {
    var indent = Array(level * 4 + 1).join(" ");
    var ret = "\n" + indent + "AggregateError of:" + "\n";
    level++;
    indent = Array(level * 4 + 1).join(" ");
    for (var i = 0; i < this.length; ++i) {
        var str = this[i] === this ? "[Circular AggregateError]" : this[i] + "";
        var lines = str.split("\n");
        for (var j = 0; j < lines.length; ++j) {
            lines[j] = indent + lines[j];
        }
        str = lines.join("\n");
        ret += str + "\n";
    }
    level--;
    return ret;
};

function OperationalError(message) {
    if (!(this instanceof OperationalError))
        return new OperationalError(message);
    notEnumerableProp(this, "name", "OperationalError");
    notEnumerableProp(this, "message", message);
    this.cause = message;
    this["isOperational"] = true;

    if (message instanceof Error) {
        notEnumerableProp(this, "message", message.message);
        notEnumerableProp(this, "stack", message.stack);
    } else if (Error.captureStackTrace) {
        Error.captureStackTrace(this, this.constructor);
    }

}
inherits(OperationalError, Error);

var errorTypes = Error["__BluebirdErrorTypes__"];
if (!errorTypes) {
    errorTypes = Objectfreeze({
        CancellationError: CancellationError,
        TimeoutError: TimeoutError,
        OperationalError: OperationalError,
        RejectionError: OperationalError,
        AggregateError: AggregateError
    });
    es5.defineProperty(Error, "__BluebirdErrorTypes__", {
        value: errorTypes,
        writable: false,
        enumerable: false,
        configurable: false
    });
}

module.exports = {
    Error: Error,
    TypeError: _TypeError,
    RangeError: _RangeError,
    CancellationError: errorTypes.CancellationError,
    OperationalError: errorTypes.OperationalError,
    TimeoutError: errorTypes.TimeoutError,
    AggregateError: errorTypes.AggregateError,
    Warning: Warning
};

},{"./es5":13,"./util":36}],13:[function(_dereq_,module,exports){
var isES5 = (function(){
    "use strict";
    return this === undefined;
})();

if (isES5) {
    module.exports = {
        freeze: Object.freeze,
        defineProperty: Object.defineProperty,
        getDescriptor: Object.getOwnPropertyDescriptor,
        keys: Object.keys,
        names: Object.getOwnPropertyNames,
        getPrototypeOf: Object.getPrototypeOf,
        isArray: Array.isArray,
        isES5: isES5,
        propertyIsWritable: function(obj, prop) {
            var descriptor = Object.getOwnPropertyDescriptor(obj, prop);
            return !!(!descriptor || descriptor.writable || descriptor.set);
        }
    };
} else {
    var has = {}.hasOwnProperty;
    var str = {}.toString;
    var proto = {}.constructor.prototype;

    var ObjectKeys = function (o) {
        var ret = [];
        for (var key in o) {
            if (has.call(o, key)) {
                ret.push(key);
            }
        }
        return ret;
    };

    var ObjectGetDescriptor = function(o, key) {
        return {value: o[key]};
    };

    var ObjectDefineProperty = function (o, key, desc) {
        o[key] = desc.value;
        return o;
    };

    var ObjectFreeze = function (obj) {
        return obj;
    };

    var ObjectGetPrototypeOf = function (obj) {
        try {
            return Object(obj).constructor.prototype;
        }
        catch (e) {
            return proto;
        }
    };

    var ArrayIsArray = function (obj) {
        try {
            return str.call(obj) === "[object Array]";
        }
        catch(e) {
            return false;
        }
    };

    module.exports = {
        isArray: ArrayIsArray,
        keys: ObjectKeys,
        names: ObjectKeys,
        defineProperty: ObjectDefineProperty,
        getDescriptor: ObjectGetDescriptor,
        freeze: ObjectFreeze,
        getPrototypeOf: ObjectGetPrototypeOf,
        isES5: isES5,
        propertyIsWritable: function() {
            return true;
        }
    };
}

},{}],14:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL) {
var PromiseMap = Promise.map;

Promise.prototype.filter = function (fn, options) {
    return PromiseMap(this, fn, options, INTERNAL);
};

Promise.filter = function (promises, fn, options) {
    return PromiseMap(promises, fn, options, INTERNAL);
};
};

},{}],15:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, tryConvertToPromise, NEXT_FILTER) {
var util = _dereq_("./util");
var CancellationError = Promise.CancellationError;
var errorObj = util.errorObj;
var catchFilter = _dereq_("./catch_filter")(NEXT_FILTER);

function PassThroughHandlerContext(promise, type, handler) {
    this.promise = promise;
    this.type = type;
    this.handler = handler;
    this.called = false;
    this.cancelPromise = null;
}

PassThroughHandlerContext.prototype.isFinallyHandler = function() {
    return this.type === 0;
};

function FinallyHandlerCancelReaction(finallyHandler) {
    this.finallyHandler = finallyHandler;
}

FinallyHandlerCancelReaction.prototype._resultCancelled = function() {
    checkCancel(this.finallyHandler);
};

function checkCancel(ctx, reason) {
    if (ctx.cancelPromise != null) {
        if (arguments.length > 1) {
            ctx.cancelPromise._reject(reason);
        } else {
            ctx.cancelPromise._cancel();
        }
        ctx.cancelPromise = null;
        return true;
    }
    return false;
}

function succeed() {
    return finallyHandler.call(this, this.promise._target()._settledValue());
}
function fail(reason) {
    if (checkCancel(this, reason)) return;
    errorObj.e = reason;
    return errorObj;
}
function finallyHandler(reasonOrValue) {
    var promise = this.promise;
    var handler = this.handler;

    if (!this.called) {
        this.called = true;
        var ret = this.isFinallyHandler()
            ? handler.call(promise._boundValue())
            : handler.call(promise._boundValue(), reasonOrValue);
        if (ret === NEXT_FILTER) {
            return ret;
        } else if (ret !== undefined) {
            promise._setReturnedNonUndefined();
            var maybePromise = tryConvertToPromise(ret, promise);
            if (maybePromise instanceof Promise) {
                if (this.cancelPromise != null) {
                    if (maybePromise._isCancelled()) {
                        var reason =
                            new CancellationError("late cancellation observer");
                        promise._attachExtraTrace(reason);
                        errorObj.e = reason;
                        return errorObj;
                    } else if (maybePromise.isPending()) {
                        maybePromise._attachCancellationCallback(
                            new FinallyHandlerCancelReaction(this));
                    }
                }
                return maybePromise._then(
                    succeed, fail, undefined, this, undefined);
            }
        }
    }

    if (promise.isRejected()) {
        checkCancel(this);
        errorObj.e = reasonOrValue;
        return errorObj;
    } else {
        checkCancel(this);
        return reasonOrValue;
    }
}

Promise.prototype._passThrough = function(handler, type, success, fail) {
    if (typeof handler !== "function") return this.then();
    return this._then(success,
                      fail,
                      undefined,
                      new PassThroughHandlerContext(this, type, handler),
                      undefined);
};

Promise.prototype.lastly =
Promise.prototype["finally"] = function (handler) {
    return this._passThrough(handler,
                             0,
                             finallyHandler,
                             finallyHandler);
};


Promise.prototype.tap = function (handler) {
    return this._passThrough(handler, 1, finallyHandler);
};

Promise.prototype.tapCatch = function (handlerOrPredicate) {
    var len = arguments.length;
    if(len === 1) {
        return this._passThrough(handlerOrPredicate,
                                 1,
                                 undefined,
                                 finallyHandler);
    } else {
         var catchInstances = new Array(len - 1),
            j = 0, i;
        for (i = 0; i < len - 1; ++i) {
            var item = arguments[i];
            if (util.isObject(item)) {
                catchInstances[j++] = item;
            } else {
                return Promise.reject(new TypeError(
                    "tapCatch statement predicate: "
                    + "expecting an object but got " + util.classString(item)
                ));
            }
        }
        catchInstances.length = j;
        var handler = arguments[i];
        return this._passThrough(catchFilter(catchInstances, handler, this),
                                 1,
                                 undefined,
                                 finallyHandler);
    }

};

return PassThroughHandlerContext;
};

},{"./catch_filter":7,"./util":36}],16:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise,
                          apiRejection,
                          INTERNAL,
                          tryConvertToPromise,
                          Proxyable,
                          debug) {
var errors = _dereq_("./errors");
var TypeError = errors.TypeError;
var util = _dereq_("./util");
var errorObj = util.errorObj;
var tryCatch = util.tryCatch;
var yieldHandlers = [];

function promiseFromYieldHandler(value, yieldHandlers, traceParent) {
    for (var i = 0; i < yieldHandlers.length; ++i) {
        traceParent._pushContext();
        var result = tryCatch(yieldHandlers[i])(value);
        traceParent._popContext();
        if (result === errorObj) {
            traceParent._pushContext();
            var ret = Promise.reject(errorObj.e);
            traceParent._popContext();
            return ret;
        }
        var maybePromise = tryConvertToPromise(result, traceParent);
        if (maybePromise instanceof Promise) return maybePromise;
    }
    return null;
}

function PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) {
    if (debug.cancellation()) {
        var internal = new Promise(INTERNAL);
        var _finallyPromise = this._finallyPromise = new Promise(INTERNAL);
        this._promise = internal.lastly(function() {
            return _finallyPromise;
        });
        internal._captureStackTrace();
        internal._setOnCancel(this);
    } else {
        var promise = this._promise = new Promise(INTERNAL);
        promise._captureStackTrace();
    }
    this._stack = stack;
    this._generatorFunction = generatorFunction;
    this._receiver = receiver;
    this._generator = undefined;
    this._yieldHandlers = typeof yieldHandler === "function"
        ? [yieldHandler].concat(yieldHandlers)
        : yieldHandlers;
    this._yieldedPromise = null;
    this._cancellationPhase = false;
}
util.inherits(PromiseSpawn, Proxyable);

PromiseSpawn.prototype._isResolved = function() {
    return this._promise === null;
};

PromiseSpawn.prototype._cleanup = function() {
    this._promise = this._generator = null;
    if (debug.cancellation() && this._finallyPromise !== null) {
        this._finallyPromise._fulfill();
        this._finallyPromise = null;
    }
};

PromiseSpawn.prototype._promiseCancelled = function() {
    if (this._isResolved()) return;
    var implementsReturn = typeof this._generator["return"] !== "undefined";

    var result;
    if (!implementsReturn) {
        var reason = new Promise.CancellationError(
            "generator .return() sentinel");
        Promise.coroutine.returnSentinel = reason;
        this._promise._attachExtraTrace(reason);
        this._promise._pushContext();
        result = tryCatch(this._generator["throw"]).call(this._generator,
                                                         reason);
        this._promise._popContext();
    } else {
        this._promise._pushContext();
        result = tryCatch(this._generator["return"]).call(this._generator,
                                                          undefined);
        this._promise._popContext();
    }
    this._cancellationPhase = true;
    this._yieldedPromise = null;
    this._continue(result);
};

PromiseSpawn.prototype._promiseFulfilled = function(value) {
    this._yieldedPromise = null;
    this._promise._pushContext();
    var result = tryCatch(this._generator.next).call(this._generator, value);
    this._promise._popContext();
    this._continue(result);
};

PromiseSpawn.prototype._promiseRejected = function(reason) {
    this._yieldedPromise = null;
    this._promise._attachExtraTrace(reason);
    this._promise._pushContext();
    var result = tryCatch(this._generator["throw"])
        .call(this._generator, reason);
    this._promise._popContext();
    this._continue(result);
};

PromiseSpawn.prototype._resultCancelled = function() {
    if (this._yieldedPromise instanceof Promise) {
        var promise = this._yieldedPromise;
        this._yieldedPromise = null;
        promise.cancel();
    }
};

PromiseSpawn.prototype.promise = function () {
    return this._promise;
};

PromiseSpawn.prototype._run = function () {
    this._generator = this._generatorFunction.call(this._receiver);
    this._receiver =
        this._generatorFunction = undefined;
    this._promiseFulfilled(undefined);
};

PromiseSpawn.prototype._continue = function (result) {
    var promise = this._promise;
    if (result === errorObj) {
        this._cleanup();
        if (this._cancellationPhase) {
            return promise.cancel();
        } else {
            return promise._rejectCallback(result.e, false);
        }
    }

    var value = result.value;
    if (result.done === true) {
        this._cleanup();
        if (this._cancellationPhase) {
            return promise.cancel();
        } else {
            return promise._resolveCallback(value);
        }
    } else {
        var maybePromise = tryConvertToPromise(value, this._promise);
        if (!(maybePromise instanceof Promise)) {
            maybePromise =
                promiseFromYieldHandler(maybePromise,
                                        this._yieldHandlers,
                                        this._promise);
            if (maybePromise === null) {
                this._promiseRejected(
                    new TypeError(
                        "A value %s was yielded that could not be treated as a promise\u000a\u000a    See http://goo.gl/MqrFmX\u000a\u000a".replace("%s", String(value)) +
                        "From coroutine:\u000a" +
                        this._stack.split("\n").slice(1, -7).join("\n")
                    )
                );
                return;
            }
        }
        maybePromise = maybePromise._target();
        var bitField = maybePromise._bitField;
        ;
        if (((bitField & 50397184) === 0)) {
            this._yieldedPromise = maybePromise;
            maybePromise._proxy(this, null);
        } else if (((bitField & 33554432) !== 0)) {
            Promise._async.invoke(
                this._promiseFulfilled, this, maybePromise._value()
            );
        } else if (((bitField & 16777216) !== 0)) {
            Promise._async.invoke(
                this._promiseRejected, this, maybePromise._reason()
            );
        } else {
            this._promiseCancelled();
        }
    }
};

Promise.coroutine = function (generatorFunction, options) {
    if (typeof generatorFunction !== "function") {
        throw new TypeError("generatorFunction must be a function\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    var yieldHandler = Object(options).yieldHandler;
    var PromiseSpawn$ = PromiseSpawn;
    var stack = new Error().stack;
    return function () {
        var generator = generatorFunction.apply(this, arguments);
        var spawn = new PromiseSpawn$(undefined, undefined, yieldHandler,
                                      stack);
        var ret = spawn.promise();
        spawn._generator = generator;
        spawn._promiseFulfilled(undefined);
        return ret;
    };
};

Promise.coroutine.addYieldHandler = function(fn) {
    if (typeof fn !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(fn));
    }
    yieldHandlers.push(fn);
};

Promise.spawn = function (generatorFunction) {
    debug.deprecated("Promise.spawn()", "Promise.coroutine()");
    if (typeof generatorFunction !== "function") {
        return apiRejection("generatorFunction must be a function\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    var spawn = new PromiseSpawn(generatorFunction, this);
    var ret = spawn.promise();
    spawn._run(Promise.spawn);
    return ret;
};
};

},{"./errors":12,"./util":36}],17:[function(_dereq_,module,exports){
"use strict";
module.exports =
function(Promise, PromiseArray, tryConvertToPromise, INTERNAL, async) {
var util = _dereq_("./util");
var canEvaluate = util.canEvaluate;
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;
var reject;

if (!true) {
if (canEvaluate) {
    var thenCallback = function(i) {
        return new Function("value", "holder", "                             \n\
            'use strict';                                                    \n\
            holder.pIndex = value;                                           \n\
            holder.checkFulfillment(this);                                   \n\
            ".replace(/Index/g, i));
    };

    var promiseSetter = function(i) {
        return new Function("promise", "holder", "                           \n\
            'use strict';                                                    \n\
            holder.pIndex = promise;                                         \n\
            ".replace(/Index/g, i));
    };

    var generateHolderClass = function(total) {
        var props = new Array(total);
        for (var i = 0; i < props.length; ++i) {
            props[i] = "this.p" + (i+1);
        }
        var assignment = props.join(" = ") + " = null;";
        var cancellationCode= "var promise;\n" + props.map(function(prop) {
            return "                                                         \n\
                promise = " + prop + ";                                      \n\
                if (promise instanceof Promise) {                            \n\
                    promise.cancel();                                        \n\
                }                                                            \n\
            ";
        }).join("\n");
        var passedArguments = props.join(", ");
        var name = "Holder$" + total;


        var code = "return function(tryCatch, errorObj, Promise, async) {    \n\
            'use strict';                                                    \n\
            function [TheName](fn) {                                         \n\
                [TheProperties]                                              \n\
                this.fn = fn;                                                \n\
                this.asyncNeeded = true;                                     \n\
                this.now = 0;                                                \n\
            }                                                                \n\
                                                                             \n\
            [TheName].prototype._callFunction = function(promise) {          \n\
                promise._pushContext();                                      \n\
                var ret = tryCatch(this.fn)([ThePassedArguments]);           \n\
                promise._popContext();                                       \n\
                if (ret === errorObj) {                                      \n\
                    promise._rejectCallback(ret.e, false);                   \n\
                } else {                                                     \n\
                    promise._resolveCallback(ret);                           \n\
                }                                                            \n\
            };                                                               \n\
                                                                             \n\
            [TheName].prototype.checkFulfillment = function(promise) {       \n\
                var now = ++this.now;                                        \n\
                if (now === [TheTotal]) {                                    \n\
                    if (this.asyncNeeded) {                                  \n\
                        async.invoke(this._callFunction, this, promise);     \n\
                    } else {                                                 \n\
                        this._callFunction(promise);                         \n\
                    }                                                        \n\
                                                                             \n\
                }                                                            \n\
            };                                                               \n\
                                                                             \n\
            [TheName].prototype._resultCancelled = function() {              \n\
                [CancellationCode]                                           \n\
            };                                                               \n\
                                                                             \n\
            return [TheName];                                                \n\
        }(tryCatch, errorObj, Promise, async);                               \n\
        ";

        code = code.replace(/\[TheName\]/g, name)
            .replace(/\[TheTotal\]/g, total)
            .replace(/\[ThePassedArguments\]/g, passedArguments)
            .replace(/\[TheProperties\]/g, assignment)
            .replace(/\[CancellationCode\]/g, cancellationCode);

        return new Function("tryCatch", "errorObj", "Promise", "async", code)
                           (tryCatch, errorObj, Promise, async);
    };

    var holderClasses = [];
    var thenCallbacks = [];
    var promiseSetters = [];

    for (var i = 0; i < 8; ++i) {
        holderClasses.push(generateHolderClass(i + 1));
        thenCallbacks.push(thenCallback(i + 1));
        promiseSetters.push(promiseSetter(i + 1));
    }

    reject = function (reason) {
        this._reject(reason);
    };
}}

Promise.join = function () {
    var last = arguments.length - 1;
    var fn;
    if (last > 0 && typeof arguments[last] === "function") {
        fn = arguments[last];
        if (!true) {
            if (last <= 8 && canEvaluate) {
                var ret = new Promise(INTERNAL);
                ret._captureStackTrace();
                var HolderClass = holderClasses[last - 1];
                var holder = new HolderClass(fn);
                var callbacks = thenCallbacks;

                for (var i = 0; i < last; ++i) {
                    var maybePromise = tryConvertToPromise(arguments[i], ret);
                    if (maybePromise instanceof Promise) {
                        maybePromise = maybePromise._target();
                        var bitField = maybePromise._bitField;
                        ;
                        if (((bitField & 50397184) === 0)) {
                            maybePromise._then(callbacks[i], reject,
                                               undefined, ret, holder);
                            promiseSetters[i](maybePromise, holder);
                            holder.asyncNeeded = false;
                        } else if (((bitField & 33554432) !== 0)) {
                            callbacks[i].call(ret,
                                              maybePromise._value(), holder);
                        } else if (((bitField & 16777216) !== 0)) {
                            ret._reject(maybePromise._reason());
                        } else {
                            ret._cancel();
                        }
                    } else {
                        callbacks[i].call(ret, maybePromise, holder);
                    }
                }

                if (!ret._isFateSealed()) {
                    if (holder.asyncNeeded) {
                        var context = Promise._getContext();
                        holder.fn = util.contextBind(context, holder.fn);
                    }
                    ret._setAsyncGuaranteed();
                    ret._setOnCancel(holder);
                }
                return ret;
            }
        }
    }
    var args = [].slice.call(arguments);;
    if (fn) args.pop();
    var ret = new PromiseArray(args).promise();
    return fn !== undefined ? ret.spread(fn) : ret;
};

};

},{"./util":36}],18:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise,
                          PromiseArray,
                          apiRejection,
                          tryConvertToPromise,
                          INTERNAL,
                          debug) {
var util = _dereq_("./util");
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;
var async = Promise._async;

function MappingPromiseArray(promises, fn, limit, _filter) {
    this.constructor$(promises);
    this._promise._captureStackTrace();
    var context = Promise._getContext();
    this._callback = util.contextBind(context, fn);
    this._preservedValues = _filter === INTERNAL
        ? new Array(this.length())
        : null;
    this._limit = limit;
    this._inFlight = 0;
    this._queue = [];
    async.invoke(this._asyncInit, this, undefined);
    if (util.isArray(promises)) {
        for (var i = 0; i < promises.length; ++i) {
            var maybePromise = promises[i];
            if (maybePromise instanceof Promise) {
                maybePromise.suppressUnhandledRejections();
            }
        }
    }
}
util.inherits(MappingPromiseArray, PromiseArray);

MappingPromiseArray.prototype._asyncInit = function() {
    this._init$(undefined, -2);
};

MappingPromiseArray.prototype._init = function () {};

MappingPromiseArray.prototype._promiseFulfilled = function (value, index) {
    var values = this._values;
    var length = this.length();
    var preservedValues = this._preservedValues;
    var limit = this._limit;

    if (index < 0) {
        index = (index * -1) - 1;
        values[index] = value;
        if (limit >= 1) {
            this._inFlight--;
            this._drainQueue();
            if (this._isResolved()) return true;
        }
    } else {
        if (limit >= 1 && this._inFlight >= limit) {
            values[index] = value;
            this._queue.push(index);
            return false;
        }
        if (preservedValues !== null) preservedValues[index] = value;

        var promise = this._promise;
        var callback = this._callback;
        var receiver = promise._boundValue();
        promise._pushContext();
        var ret = tryCatch(callback).call(receiver, value, index, length);
        var promiseCreated = promise._popContext();
        debug.checkForgottenReturns(
            ret,
            promiseCreated,
            preservedValues !== null ? "Promise.filter" : "Promise.map",
            promise
        );
        if (ret === errorObj) {
            this._reject(ret.e);
            return true;
        }

        var maybePromise = tryConvertToPromise(ret, this._promise);
        if (maybePromise instanceof Promise) {
            maybePromise = maybePromise._target();
            var bitField = maybePromise._bitField;
            ;
            if (((bitField & 50397184) === 0)) {
                if (limit >= 1) this._inFlight++;
                values[index] = maybePromise;
                maybePromise._proxy(this, (index + 1) * -1);
                return false;
            } else if (((bitField & 33554432) !== 0)) {
                ret = maybePromise._value();
            } else if (((bitField & 16777216) !== 0)) {
                this._reject(maybePromise._reason());
                return true;
            } else {
                this._cancel();
                return true;
            }
        }
        values[index] = ret;
    }
    var totalResolved = ++this._totalResolved;
    if (totalResolved >= length) {
        if (preservedValues !== null) {
            this._filter(values, preservedValues);
        } else {
            this._resolve(values);
        }
        return true;
    }
    return false;
};

MappingPromiseArray.prototype._drainQueue = function () {
    var queue = this._queue;
    var limit = this._limit;
    var values = this._values;
    while (queue.length > 0 && this._inFlight < limit) {
        if (this._isResolved()) return;
        var index = queue.pop();
        this._promiseFulfilled(values[index], index);
    }
};

MappingPromiseArray.prototype._filter = function (booleans, values) {
    var len = values.length;
    var ret = new Array(len);
    var j = 0;
    for (var i = 0; i < len; ++i) {
        if (booleans[i]) ret[j++] = values[i];
    }
    ret.length = j;
    this._resolve(ret);
};

MappingPromiseArray.prototype.preservedValues = function () {
    return this._preservedValues;
};

function map(promises, fn, options, _filter) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }

    var limit = 0;
    if (options !== undefined) {
        if (typeof options === "object" && options !== null) {
            if (typeof options.concurrency !== "number") {
                return Promise.reject(
                    new TypeError("'concurrency' must be a number but it is " +
                                    util.classString(options.concurrency)));
            }
            limit = options.concurrency;
        } else {
            return Promise.reject(new TypeError(
                            "options argument must be an object but it is " +
                             util.classString(options)));
        }
    }
    limit = typeof limit === "number" &&
        isFinite(limit) && limit >= 1 ? limit : 0;
    return new MappingPromiseArray(promises, fn, limit, _filter).promise();
}

Promise.prototype.map = function (fn, options) {
    return map(this, fn, options, null);
};

Promise.map = function (promises, fn, options, _filter) {
    return map(promises, fn, options, _filter);
};


};

},{"./util":36}],19:[function(_dereq_,module,exports){
"use strict";
module.exports =
function(Promise, INTERNAL, tryConvertToPromise, apiRejection, debug) {
var util = _dereq_("./util");
var tryCatch = util.tryCatch;

Promise.method = function (fn) {
    if (typeof fn !== "function") {
        throw new Promise.TypeError("expecting a function but got " + util.classString(fn));
    }
    return function () {
        var ret = new Promise(INTERNAL);
        ret._captureStackTrace();
        ret._pushContext();
        var value = tryCatch(fn).apply(this, arguments);
        var promiseCreated = ret._popContext();
        debug.checkForgottenReturns(
            value, promiseCreated, "Promise.method", ret);
        ret._resolveFromSyncValue(value);
        return ret;
    };
};

Promise.attempt = Promise["try"] = function (fn) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    ret._pushContext();
    var value;
    if (arguments.length > 1) {
        debug.deprecated("calling Promise.try with more than 1 argument");
        var arg = arguments[1];
        var ctx = arguments[2];
        value = util.isArray(arg) ? tryCatch(fn).apply(ctx, arg)
                                  : tryCatch(fn).call(ctx, arg);
    } else {
        value = tryCatch(fn)();
    }
    var promiseCreated = ret._popContext();
    debug.checkForgottenReturns(
        value, promiseCreated, "Promise.try", ret);
    ret._resolveFromSyncValue(value);
    return ret;
};

Promise.prototype._resolveFromSyncValue = function (value) {
    if (value === util.errorObj) {
        this._rejectCallback(value.e, false);
    } else {
        this._resolveCallback(value, true);
    }
};
};

},{"./util":36}],20:[function(_dereq_,module,exports){
"use strict";
var util = _dereq_("./util");
var maybeWrapAsError = util.maybeWrapAsError;
var errors = _dereq_("./errors");
var OperationalError = errors.OperationalError;
var es5 = _dereq_("./es5");

function isUntypedError(obj) {
    return obj instanceof Error &&
        es5.getPrototypeOf(obj) === Error.prototype;
}

var rErrorKey = /^(?:name|message|stack|cause)$/;
function wrapAsOperationalError(obj) {
    var ret;
    if (isUntypedError(obj)) {
        ret = new OperationalError(obj);
        ret.name = obj.name;
        ret.message = obj.message;
        ret.stack = obj.stack;
        var keys = es5.keys(obj);
        for (var i = 0; i < keys.length; ++i) {
            var key = keys[i];
            if (!rErrorKey.test(key)) {
                ret[key] = obj[key];
            }
        }
        return ret;
    }
    util.markAsOriginatingFromRejection(obj);
    return obj;
}

function nodebackForPromise(promise, multiArgs) {
    return function(err, value) {
        if (promise === null) return;
        if (err) {
            var wrapped = wrapAsOperationalError(maybeWrapAsError(err));
            promise._attachExtraTrace(wrapped);
            promise._reject(wrapped);
        } else if (!multiArgs) {
            promise._fulfill(value);
        } else {
            var args = [].slice.call(arguments, 1);;
            promise._fulfill(args);
        }
        promise = null;
    };
}

module.exports = nodebackForPromise;

},{"./errors":12,"./es5":13,"./util":36}],21:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise) {
var util = _dereq_("./util");
var async = Promise._async;
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;

function spreadAdapter(val, nodeback) {
    var promise = this;
    if (!util.isArray(val)) return successAdapter.call(promise, val, nodeback);
    var ret =
        tryCatch(nodeback).apply(promise._boundValue(), [null].concat(val));
    if (ret === errorObj) {
        async.throwLater(ret.e);
    }
}

function successAdapter(val, nodeback) {
    var promise = this;
    var receiver = promise._boundValue();
    var ret = val === undefined
        ? tryCatch(nodeback).call(receiver, null)
        : tryCatch(nodeback).call(receiver, null, val);
    if (ret === errorObj) {
        async.throwLater(ret.e);
    }
}
function errorAdapter(reason, nodeback) {
    var promise = this;
    if (!reason) {
        var newReason = new Error(reason + "");
        newReason.cause = reason;
        reason = newReason;
    }
    var ret = tryCatch(nodeback).call(promise._boundValue(), reason);
    if (ret === errorObj) {
        async.throwLater(ret.e);
    }
}

Promise.prototype.asCallback = Promise.prototype.nodeify = function (nodeback,
                                                                     options) {
    if (typeof nodeback == "function") {
        var adapter = successAdapter;
        if (options !== undefined && Object(options).spread) {
            adapter = spreadAdapter;
        }
        this._then(
            adapter,
            errorAdapter,
            undefined,
            this,
            nodeback
        );
    }
    return this;
};
};

},{"./util":36}],22:[function(_dereq_,module,exports){
"use strict";
module.exports = function() {
var makeSelfResolutionError = function () {
    return new TypeError("circular promise resolution chain\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
};
var reflectHandler = function() {
    return new Promise.PromiseInspection(this._target());
};
var apiRejection = function(msg) {
    return Promise.reject(new TypeError(msg));
};
function Proxyable() {}
var UNDEFINED_BINDING = {};
var util = _dereq_("./util");
util.setReflectHandler(reflectHandler);

var getDomain = function() {
    var domain = process.domain;
    if (domain === undefined) {
        return null;
    }
    return domain;
};
var getContextDefault = function() {
    return null;
};
var getContextDomain = function() {
    return {
        domain: getDomain(),
        async: null
    };
};
var AsyncResource = util.isNode && util.nodeSupportsAsyncResource ?
    _dereq_("async_hooks").AsyncResource : null;
var getContextAsyncHooks = function() {
    return {
        domain: getDomain(),
        async: new AsyncResource("Bluebird::Promise")
    };
};
var getContext = util.isNode ? getContextDomain : getContextDefault;
util.notEnumerableProp(Promise, "_getContext", getContext);
var enableAsyncHooks = function() {
    getContext = getContextAsyncHooks;
    util.notEnumerableProp(Promise, "_getContext", getContextAsyncHooks);
};
var disableAsyncHooks = function() {
    getContext = getContextDomain;
    util.notEnumerableProp(Promise, "_getContext", getContextDomain);
};

var es5 = _dereq_("./es5");
var Async = _dereq_("./async");
var async = new Async();
es5.defineProperty(Promise, "_async", {value: async});
var errors = _dereq_("./errors");
var TypeError = Promise.TypeError = errors.TypeError;
Promise.RangeError = errors.RangeError;
var CancellationError = Promise.CancellationError = errors.CancellationError;
Promise.TimeoutError = errors.TimeoutError;
Promise.OperationalError = errors.OperationalError;
Promise.RejectionError = errors.OperationalError;
Promise.AggregateError = errors.AggregateError;
var INTERNAL = function(){};
var APPLY = {};
var NEXT_FILTER = {};
var tryConvertToPromise = _dereq_("./thenables")(Promise, INTERNAL);
var PromiseArray =
    _dereq_("./promise_array")(Promise, INTERNAL,
                               tryConvertToPromise, apiRejection, Proxyable);
var Context = _dereq_("./context")(Promise);
 /*jshint unused:false*/
var createContext = Context.create;

var debug = _dereq_("./debuggability")(Promise, Context,
    enableAsyncHooks, disableAsyncHooks);
var CapturedTrace = debug.CapturedTrace;
var PassThroughHandlerContext =
    _dereq_("./finally")(Promise, tryConvertToPromise, NEXT_FILTER);
var catchFilter = _dereq_("./catch_filter")(NEXT_FILTER);
var nodebackForPromise = _dereq_("./nodeback");
var errorObj = util.errorObj;
var tryCatch = util.tryCatch;
function check(self, executor) {
    if (self == null || self.constructor !== Promise) {
        throw new TypeError("the promise constructor cannot be invoked directly\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    if (typeof executor !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(executor));
    }

}

function Promise(executor) {
    if (executor !== INTERNAL) {
        check(this, executor);
    }
    this._bitField = 0;
    this._fulfillmentHandler0 = undefined;
    this._rejectionHandler0 = undefined;
    this._promise0 = undefined;
    this._receiver0 = undefined;
    this._resolveFromExecutor(executor);
    this._promiseCreated();
    this._fireEvent("promiseCreated", this);
}

Promise.prototype.toString = function () {
    return "[object Promise]";
};

Promise.prototype.caught = Promise.prototype["catch"] = function (fn) {
    var len = arguments.length;
    if (len > 1) {
        var catchInstances = new Array(len - 1),
            j = 0, i;
        for (i = 0; i < len - 1; ++i) {
            var item = arguments[i];
            if (util.isObject(item)) {
                catchInstances[j++] = item;
            } else {
                return apiRejection("Catch statement predicate: " +
                    "expecting an object but got " + util.classString(item));
            }
        }
        catchInstances.length = j;
        fn = arguments[i];

        if (typeof fn !== "function") {
            throw new TypeError("The last argument to .catch() " +
                "must be a function, got " + util.toString(fn));
        }
        return this.then(undefined, catchFilter(catchInstances, fn, this));
    }
    return this.then(undefined, fn);
};

Promise.prototype.reflect = function () {
    return this._then(reflectHandler,
        reflectHandler, undefined, this, undefined);
};

Promise.prototype.then = function (didFulfill, didReject) {
    if (debug.warnings() && arguments.length > 0 &&
        typeof didFulfill !== "function" &&
        typeof didReject !== "function") {
        var msg = ".then() only accepts functions but was passed: " +
                util.classString(didFulfill);
        if (arguments.length > 1) {
            msg += ", " + util.classString(didReject);
        }
        this._warn(msg);
    }
    return this._then(didFulfill, didReject, undefined, undefined, undefined);
};

Promise.prototype.done = function (didFulfill, didReject) {
    var promise =
        this._then(didFulfill, didReject, undefined, undefined, undefined);
    promise._setIsFinal();
};

Promise.prototype.spread = function (fn) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }
    return this.all()._then(fn, undefined, undefined, APPLY, undefined);
};

Promise.prototype.toJSON = function () {
    var ret = {
        isFulfilled: false,
        isRejected: false,
        fulfillmentValue: undefined,
        rejectionReason: undefined
    };
    if (this.isFulfilled()) {
        ret.fulfillmentValue = this.value();
        ret.isFulfilled = true;
    } else if (this.isRejected()) {
        ret.rejectionReason = this.reason();
        ret.isRejected = true;
    }
    return ret;
};

Promise.prototype.all = function () {
    if (arguments.length > 0) {
        this._warn(".all() was passed arguments but it does not take any");
    }
    return new PromiseArray(this).promise();
};

Promise.prototype.error = function (fn) {
    return this.caught(util.originatesFromRejection, fn);
};

Promise.getNewLibraryCopy = module.exports;

Promise.is = function (val) {
    return val instanceof Promise;
};

Promise.fromNode = Promise.fromCallback = function(fn) {
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    var multiArgs = arguments.length > 1 ? !!Object(arguments[1]).multiArgs
                                         : false;
    var result = tryCatch(fn)(nodebackForPromise(ret, multiArgs));
    if (result === errorObj) {
        ret._rejectCallback(result.e, true);
    }
    if (!ret._isFateSealed()) ret._setAsyncGuaranteed();
    return ret;
};

Promise.all = function (promises) {
    return new PromiseArray(promises).promise();
};

Promise.cast = function (obj) {
    var ret = tryConvertToPromise(obj);
    if (!(ret instanceof Promise)) {
        ret = new Promise(INTERNAL);
        ret._captureStackTrace();
        ret._setFulfilled();
        ret._rejectionHandler0 = obj;
    }
    return ret;
};

Promise.resolve = Promise.fulfilled = Promise.cast;

Promise.reject = Promise.rejected = function (reason) {
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    ret._rejectCallback(reason, true);
    return ret;
};

Promise.setScheduler = function(fn) {
    if (typeof fn !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(fn));
    }
    return async.setScheduler(fn);
};

Promise.prototype._then = function (
    didFulfill,
    didReject,
    _,    receiver,
    internalData
) {
    var haveInternalData = internalData !== undefined;
    var promise = haveInternalData ? internalData : new Promise(INTERNAL);
    var target = this._target();
    var bitField = target._bitField;

    if (!haveInternalData) {
        promise._propagateFrom(this, 3);
        promise._captureStackTrace();
        if (receiver === undefined &&
            ((this._bitField & 2097152) !== 0)) {
            if (!((bitField & 50397184) === 0)) {
                receiver = this._boundValue();
            } else {
                receiver = target === this ? undefined : this._boundTo;
            }
        }
        this._fireEvent("promiseChained", this, promise);
    }

    var context = getContext();
    if (!((bitField & 50397184) === 0)) {
        var handler, value, settler = target._settlePromiseCtx;
        if (((bitField & 33554432) !== 0)) {
            value = target._rejectionHandler0;
            handler = didFulfill;
        } else if (((bitField & 16777216) !== 0)) {
            value = target._fulfillmentHandler0;
            handler = didReject;
            target._unsetRejectionIsUnhandled();
        } else {
            settler = target._settlePromiseLateCancellationObserver;
            value = new CancellationError("late cancellation observer");
            target._attachExtraTrace(value);
            handler = didReject;
        }

        async.invoke(settler, target, {
            handler: util.contextBind(context, handler),
            promise: promise,
            receiver: receiver,
            value: value
        });
    } else {
        target._addCallbacks(didFulfill, didReject, promise,
                receiver, context);
    }

    return promise;
};

Promise.prototype._length = function () {
    return this._bitField & 65535;
};

Promise.prototype._isFateSealed = function () {
    return (this._bitField & 117506048) !== 0;
};

Promise.prototype._isFollowing = function () {
    return (this._bitField & 67108864) === 67108864;
};

Promise.prototype._setLength = function (len) {
    this._bitField = (this._bitField & -65536) |
        (len & 65535);
};

Promise.prototype._setFulfilled = function () {
    this._bitField = this._bitField | 33554432;
    this._fireEvent("promiseFulfilled", this);
};

Promise.prototype._setRejected = function () {
    this._bitField = this._bitField | 16777216;
    this._fireEvent("promiseRejected", this);
};

Promise.prototype._setFollowing = function () {
    this._bitField = this._bitField | 67108864;
    this._fireEvent("promiseResolved", this);
};

Promise.prototype._setIsFinal = function () {
    this._bitField = this._bitField | 4194304;
};

Promise.prototype._isFinal = function () {
    return (this._bitField & 4194304) > 0;
};

Promise.prototype._unsetCancelled = function() {
    this._bitField = this._bitField & (~65536);
};

Promise.prototype._setCancelled = function() {
    this._bitField = this._bitField | 65536;
    this._fireEvent("promiseCancelled", this);
};

Promise.prototype._setWillBeCancelled = function() {
    this._bitField = this._bitField | 8388608;
};

Promise.prototype._setAsyncGuaranteed = function() {
    if (async.hasCustomScheduler()) return;
    var bitField = this._bitField;
    this._bitField = bitField |
        (((bitField & 536870912) >> 2) ^
        134217728);
};

Promise.prototype._setNoAsyncGuarantee = function() {
    this._bitField = (this._bitField | 536870912) &
        (~134217728);
};

Promise.prototype._receiverAt = function (index) {
    var ret = index === 0 ? this._receiver0 : this[
            index * 4 - 4 + 3];
    if (ret === UNDEFINED_BINDING) {
        return undefined;
    } else if (ret === undefined && this._isBound()) {
        return this._boundValue();
    }
    return ret;
};

Promise.prototype._promiseAt = function (index) {
    return this[
            index * 4 - 4 + 2];
};

Promise.prototype._fulfillmentHandlerAt = function (index) {
    return this[
            index * 4 - 4 + 0];
};

Promise.prototype._rejectionHandlerAt = function (index) {
    return this[
            index * 4 - 4 + 1];
};

Promise.prototype._boundValue = function() {};

Promise.prototype._migrateCallback0 = function (follower) {
    var bitField = follower._bitField;
    var fulfill = follower._fulfillmentHandler0;
    var reject = follower._rejectionHandler0;
    var promise = follower._promise0;
    var receiver = follower._receiverAt(0);
    if (receiver === undefined) receiver = UNDEFINED_BINDING;
    this._addCallbacks(fulfill, reject, promise, receiver, null);
};

Promise.prototype._migrateCallbackAt = function (follower, index) {
    var fulfill = follower._fulfillmentHandlerAt(index);
    var reject = follower._rejectionHandlerAt(index);
    var promise = follower._promiseAt(index);
    var receiver = follower._receiverAt(index);
    if (receiver === undefined) receiver = UNDEFINED_BINDING;
    this._addCallbacks(fulfill, reject, promise, receiver, null);
};

Promise.prototype._addCallbacks = function (
    fulfill,
    reject,
    promise,
    receiver,
    context
) {
    var index = this._length();

    if (index >= 65535 - 4) {
        index = 0;
        this._setLength(0);
    }

    if (index === 0) {
        this._promise0 = promise;
        this._receiver0 = receiver;
        if (typeof fulfill === "function") {
            this._fulfillmentHandler0 = util.contextBind(context, fulfill);
        }
        if (typeof reject === "function") {
            this._rejectionHandler0 = util.contextBind(context, reject);
        }
    } else {
        var base = index * 4 - 4;
        this[base + 2] = promise;
        this[base + 3] = receiver;
        if (typeof fulfill === "function") {
            this[base + 0] =
                util.contextBind(context, fulfill);
        }
        if (typeof reject === "function") {
            this[base + 1] =
                util.contextBind(context, reject);
        }
    }
    this._setLength(index + 1);
    return index;
};

Promise.prototype._proxy = function (proxyable, arg) {
    this._addCallbacks(undefined, undefined, arg, proxyable, null);
};

Promise.prototype._resolveCallback = function(value, shouldBind) {
    if (((this._bitField & 117506048) !== 0)) return;
    if (value === this)
        return this._rejectCallback(makeSelfResolutionError(), false);
    var maybePromise = tryConvertToPromise(value, this);
    if (!(maybePromise instanceof Promise)) return this._fulfill(value);

    if (shouldBind) this._propagateFrom(maybePromise, 2);


    var promise = maybePromise._target();

    if (promise === this) {
        this._reject(makeSelfResolutionError());
        return;
    }

    var bitField = promise._bitField;
    if (((bitField & 50397184) === 0)) {
        var len = this._length();
        if (len > 0) promise._migrateCallback0(this);
        for (var i = 1; i < len; ++i) {
            promise._migrateCallbackAt(this, i);
        }
        this._setFollowing();
        this._setLength(0);
        this._setFollowee(maybePromise);
    } else if (((bitField & 33554432) !== 0)) {
        this._fulfill(promise._value());
    } else if (((bitField & 16777216) !== 0)) {
        this._reject(promise._reason());
    } else {
        var reason = new CancellationError("late cancellation observer");
        promise._attachExtraTrace(reason);
        this._reject(reason);
    }
};

Promise.prototype._rejectCallback =
function(reason, synchronous, ignoreNonErrorWarnings) {
    var trace = util.ensureErrorObject(reason);
    var hasStack = trace === reason;
    if (!hasStack && !ignoreNonErrorWarnings && debug.warnings()) {
        var message = "a promise was rejected with a non-error: " +
            util.classString(reason);
        this._warn(message, true);
    }
    this._attachExtraTrace(trace, synchronous ? hasStack : false);
    this._reject(reason);
};

Promise.prototype._resolveFromExecutor = function (executor) {
    if (executor === INTERNAL) return;
    var promise = this;
    this._captureStackTrace();
    this._pushContext();
    var synchronous = true;
    var r = this._execute(executor, function(value) {
        promise._resolveCallback(value);
    }, function (reason) {
        promise._rejectCallback(reason, synchronous);
    });
    synchronous = false;
    this._popContext();

    if (r !== undefined) {
        promise._rejectCallback(r, true);
    }
};

Promise.prototype._settlePromiseFromHandler = function (
    handler, receiver, value, promise
) {
    var bitField = promise._bitField;
    if (((bitField & 65536) !== 0)) return;
    promise._pushContext();
    var x;
    if (receiver === APPLY) {
        if (!value || typeof value.length !== "number") {
            x = errorObj;
            x.e = new TypeError("cannot .spread() a non-array: " +
                                    util.classString(value));
        } else {
            x = tryCatch(handler).apply(this._boundValue(), value);
        }
    } else {
        x = tryCatch(handler).call(receiver, value);
    }
    var promiseCreated = promise._popContext();
    bitField = promise._bitField;
    if (((bitField & 65536) !== 0)) return;

    if (x === NEXT_FILTER) {
        promise._reject(value);
    } else if (x === errorObj) {
        promise._rejectCallback(x.e, false);
    } else {
        debug.checkForgottenReturns(x, promiseCreated, "",  promise, this);
        promise._resolveCallback(x);
    }
};

Promise.prototype._target = function() {
    var ret = this;
    while (ret._isFollowing()) ret = ret._followee();
    return ret;
};

Promise.prototype._followee = function() {
    return this._rejectionHandler0;
};

Promise.prototype._setFollowee = function(promise) {
    this._rejectionHandler0 = promise;
};

Promise.prototype._settlePromise = function(promise, handler, receiver, value) {
    var isPromise = promise instanceof Promise;
    var bitField = this._bitField;
    var asyncGuaranteed = ((bitField & 134217728) !== 0);
    if (((bitField & 65536) !== 0)) {
        if (isPromise) promise._invokeInternalOnCancel();

        if (receiver instanceof PassThroughHandlerContext &&
            receiver.isFinallyHandler()) {
            receiver.cancelPromise = promise;
            if (tryCatch(handler).call(receiver, value) === errorObj) {
                promise._reject(errorObj.e);
            }
        } else if (handler === reflectHandler) {
            promise._fulfill(reflectHandler.call(receiver));
        } else if (receiver instanceof Proxyable) {
            receiver._promiseCancelled(promise);
        } else if (isPromise || promise instanceof PromiseArray) {
            promise._cancel();
        } else {
            receiver.cancel();
        }
    } else if (typeof handler === "function") {
        if (!isPromise) {
            handler.call(receiver, value, promise);
        } else {
            if (asyncGuaranteed) promise._setAsyncGuaranteed();
            this._settlePromiseFromHandler(handler, receiver, value, promise);
        }
    } else if (receiver instanceof Proxyable) {
        if (!receiver._isResolved()) {
            if (((bitField & 33554432) !== 0)) {
                receiver._promiseFulfilled(value, promise);
            } else {
                receiver._promiseRejected(value, promise);
            }
        }
    } else if (isPromise) {
        if (asyncGuaranteed) promise._setAsyncGuaranteed();
        if (((bitField & 33554432) !== 0)) {
            promise._fulfill(value);
        } else {
            promise._reject(value);
        }
    }
};

Promise.prototype._settlePromiseLateCancellationObserver = function(ctx) {
    var handler = ctx.handler;
    var promise = ctx.promise;
    var receiver = ctx.receiver;
    var value = ctx.value;
    if (typeof handler === "function") {
        if (!(promise instanceof Promise)) {
            handler.call(receiver, value, promise);
        } else {
            this._settlePromiseFromHandler(handler, receiver, value, promise);
        }
    } else if (promise instanceof Promise) {
        promise._reject(value);
    }
};

Promise.prototype._settlePromiseCtx = function(ctx) {
    this._settlePromise(ctx.promise, ctx.handler, ctx.receiver, ctx.value);
};

Promise.prototype._settlePromise0 = function(handler, value, bitField) {
    var promise = this._promise0;
    var receiver = this._receiverAt(0);
    this._promise0 = undefined;
    this._receiver0 = undefined;
    this._settlePromise(promise, handler, receiver, value);
};

Promise.prototype._clearCallbackDataAtIndex = function(index) {
    var base = index * 4 - 4;
    this[base + 2] =
    this[base + 3] =
    this[base + 0] =
    this[base + 1] = undefined;
};

Promise.prototype._fulfill = function (value) {
    var bitField = this._bitField;
    if (((bitField & 117506048) >>> 16)) return;
    if (value === this) {
        var err = makeSelfResolutionError();
        this._attachExtraTrace(err);
        return this._reject(err);
    }
    this._setFulfilled();
    this._rejectionHandler0 = value;

    if ((bitField & 65535) > 0) {
        if (((bitField & 134217728) !== 0)) {
            this._settlePromises();
        } else {
            async.settlePromises(this);
        }
        this._dereferenceTrace();
    }
};

Promise.prototype._reject = function (reason) {
    var bitField = this._bitField;
    if (((bitField & 117506048) >>> 16)) return;
    this._setRejected();
    this._fulfillmentHandler0 = reason;

    if (this._isFinal()) {
        return async.fatalError(reason, util.isNode);
    }

    if ((bitField & 65535) > 0) {
        async.settlePromises(this);
    } else {
        this._ensurePossibleRejectionHandled();
    }
};

Promise.prototype._fulfillPromises = function (len, value) {
    for (var i = 1; i < len; i++) {
        var handler = this._fulfillmentHandlerAt(i);
        var promise = this._promiseAt(i);
        var receiver = this._receiverAt(i);
        this._clearCallbackDataAtIndex(i);
        this._settlePromise(promise, handler, receiver, value);
    }
};

Promise.prototype._rejectPromises = function (len, reason) {
    for (var i = 1; i < len; i++) {
        var handler = this._rejectionHandlerAt(i);
        var promise = this._promiseAt(i);
        var receiver = this._receiverAt(i);
        this._clearCallbackDataAtIndex(i);
        this._settlePromise(promise, handler, receiver, reason);
    }
};

Promise.prototype._settlePromises = function () {
    var bitField = this._bitField;
    var len = (bitField & 65535);

    if (len > 0) {
        if (((bitField & 16842752) !== 0)) {
            var reason = this._fulfillmentHandler0;
            this._settlePromise0(this._rejectionHandler0, reason, bitField);
            this._rejectPromises(len, reason);
        } else {
            var value = this._rejectionHandler0;
            this._settlePromise0(this._fulfillmentHandler0, value, bitField);
            this._fulfillPromises(len, value);
        }
        this._setLength(0);
    }
    this._clearCancellationData();
};

Promise.prototype._settledValue = function() {
    var bitField = this._bitField;
    if (((bitField & 33554432) !== 0)) {
        return this._rejectionHandler0;
    } else if (((bitField & 16777216) !== 0)) {
        return this._fulfillmentHandler0;
    }
};

if (typeof Symbol !== "undefined" && Symbol.toStringTag) {
    es5.defineProperty(Promise.prototype, Symbol.toStringTag, {
        get: function () {
            return "Object";
        }
    });
}

function deferResolve(v) {this.promise._resolveCallback(v);}
function deferReject(v) {this.promise._rejectCallback(v, false);}

Promise.defer = Promise.pending = function() {
    debug.deprecated("Promise.defer", "new Promise");
    var promise = new Promise(INTERNAL);
    return {
        promise: promise,
        resolve: deferResolve,
        reject: deferReject
    };
};

util.notEnumerableProp(Promise,
                       "_makeSelfResolutionError",
                       makeSelfResolutionError);

_dereq_("./method")(Promise, INTERNAL, tryConvertToPromise, apiRejection,
    debug);
_dereq_("./bind")(Promise, INTERNAL, tryConvertToPromise, debug);
_dereq_("./cancel")(Promise, PromiseArray, apiRejection, debug);
_dereq_("./direct_resolve")(Promise);
_dereq_("./synchronous_inspection")(Promise);
_dereq_("./join")(
    Promise, PromiseArray, tryConvertToPromise, INTERNAL, async);
Promise.Promise = Promise;
Promise.version = "3.7.2";
_dereq_('./call_get.js')(Promise);
_dereq_('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise, Proxyable, debug);
_dereq_('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);
_dereq_('./nodeify.js')(Promise);
_dereq_('./promisify.js')(Promise, INTERNAL);
_dereq_('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection);
_dereq_('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection);
_dereq_('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);
_dereq_('./settle.js')(Promise, PromiseArray, debug);
_dereq_('./some.js')(Promise, PromiseArray, apiRejection);
_dereq_('./timers.js')(Promise, INTERNAL, debug);
_dereq_('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext, INTERNAL, debug);
_dereq_('./any.js')(Promise);
_dereq_('./each.js')(Promise, INTERNAL);
_dereq_('./filter.js')(Promise, INTERNAL);
                                                         
    util.toFastProperties(Promise);                                          
    util.toFastProperties(Promise.prototype);                                
    function fillTypes(value) {                                              
        var p = new Promise(INTERNAL);                                       
        p._fulfillmentHandler0 = value;                                      
        p._rejectionHandler0 = value;                                        
        p._promise0 = value;                                                 
        p._receiver0 = value;                                                
    }                                                                        
    // Complete slack tracking, opt out of field-type tracking and           
    // stabilize map                                                         
    fillTypes({a: 1});                                                       
    fillTypes({b: 2});                                                       
    fillTypes({c: 3});                                                       
    fillTypes(1);                                                            
    fillTypes(function(){});                                                 
    fillTypes(undefined);                                                    
    fillTypes(false);                                                        
    fillTypes(new Promise(INTERNAL));                                        
    debug.setBounds(Async.firstLineError, util.lastLineError);               
    return Promise;                                                          

};

},{"./any.js":1,"./async":2,"./bind":3,"./call_get.js":5,"./cancel":6,"./catch_filter":7,"./context":8,"./debuggability":9,"./direct_resolve":10,"./each.js":11,"./errors":12,"./es5":13,"./filter.js":14,"./finally":15,"./generators.js":16,"./join":17,"./map.js":18,"./method":19,"./nodeback":20,"./nodeify.js":21,"./promise_array":23,"./promisify.js":24,"./props.js":25,"./race.js":27,"./reduce.js":28,"./settle.js":30,"./some.js":31,"./synchronous_inspection":32,"./thenables":33,"./timers.js":34,"./using.js":35,"./util":36,"async_hooks":undefined}],23:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL, tryConvertToPromise,
    apiRejection, Proxyable) {
var util = _dereq_("./util");
var isArray = util.isArray;

function toResolutionValue(val) {
    switch(val) {
    case -2: return [];
    case -3: return {};
    case -6: return new Map();
    }
}

function PromiseArray(values) {
    var promise = this._promise = new Promise(INTERNAL);
    if (values instanceof Promise) {
        promise._propagateFrom(values, 3);
        values.suppressUnhandledRejections();
    }
    promise._setOnCancel(this);
    this._values = values;
    this._length = 0;
    this._totalResolved = 0;
    this._init(undefined, -2);
}
util.inherits(PromiseArray, Proxyable);

PromiseArray.prototype.length = function () {
    return this._length;
};

PromiseArray.prototype.promise = function () {
    return this._promise;
};

PromiseArray.prototype._init = function init(_, resolveValueIfEmpty) {
    var values = tryConvertToPromise(this._values, this._promise);
    if (values instanceof Promise) {
        values = values._target();
        var bitField = values._bitField;
        ;
        this._values = values;

        if (((bitField & 50397184) === 0)) {
            this._promise._setAsyncGuaranteed();
            return values._then(
                init,
                this._reject,
                undefined,
                this,
                resolveValueIfEmpty
           );
        } else if (((bitField & 33554432) !== 0)) {
            values = values._value();
        } else if (((bitField & 16777216) !== 0)) {
            return this._reject(values._reason());
        } else {
            return this._cancel();
        }
    }
    values = util.asArray(values);
    if (values === null) {
        var err = apiRejection(
            "expecting an array or an iterable object but got " + util.classString(values)).reason();
        this._promise._rejectCallback(err, false);
        return;
    }

    if (values.length === 0) {
        if (resolveValueIfEmpty === -5) {
            this._resolveEmptyArray();
        }
        else {
            this._resolve(toResolutionValue(resolveValueIfEmpty));
        }
        return;
    }
    this._iterate(values);
};

PromiseArray.prototype._iterate = function(values) {
    var len = this.getActualLength(values.length);
    this._length = len;
    this._values = this.shouldCopyValues() ? new Array(len) : this._values;
    var result = this._promise;
    var isResolved = false;
    var bitField = null;
    for (var i = 0; i < len; ++i) {
        var maybePromise = tryConvertToPromise(values[i], result);

        if (maybePromise instanceof Promise) {
            maybePromise = maybePromise._target();
            bitField = maybePromise._bitField;
        } else {
            bitField = null;
        }

        if (isResolved) {
            if (bitField !== null) {
                maybePromise.suppressUnhandledRejections();
            }
        } else if (bitField !== null) {
            if (((bitField & 50397184) === 0)) {
                maybePromise._proxy(this, i);
                this._values[i] = maybePromise;
            } else if (((bitField & 33554432) !== 0)) {
                isResolved = this._promiseFulfilled(maybePromise._value(), i);
            } else if (((bitField & 16777216) !== 0)) {
                isResolved = this._promiseRejected(maybePromise._reason(), i);
            } else {
                isResolved = this._promiseCancelled(i);
            }
        } else {
            isResolved = this._promiseFulfilled(maybePromise, i);
        }
    }
    if (!isResolved) result._setAsyncGuaranteed();
};

PromiseArray.prototype._isResolved = function () {
    return this._values === null;
};

PromiseArray.prototype._resolve = function (value) {
    this._values = null;
    this._promise._fulfill(value);
};

PromiseArray.prototype._cancel = function() {
    if (this._isResolved() || !this._promise._isCancellable()) return;
    this._values = null;
    this._promise._cancel();
};

PromiseArray.prototype._reject = function (reason) {
    this._values = null;
    this._promise._rejectCallback(reason, false);
};

PromiseArray.prototype._promiseFulfilled = function (value, index) {
    this._values[index] = value;
    var totalResolved = ++this._totalResolved;
    if (totalResolved >= this._length) {
        this._resolve(this._values);
        return true;
    }
    return false;
};

PromiseArray.prototype._promiseCancelled = function() {
    this._cancel();
    return true;
};

PromiseArray.prototype._promiseRejected = function (reason) {
    this._totalResolved++;
    this._reject(reason);
    return true;
};

PromiseArray.prototype._resultCancelled = function() {
    if (this._isResolved()) return;
    var values = this._values;
    this._cancel();
    if (values instanceof Promise) {
        values.cancel();
    } else {
        for (var i = 0; i < values.length; ++i) {
            if (values[i] instanceof Promise) {
                values[i].cancel();
            }
        }
    }
};

PromiseArray.prototype.shouldCopyValues = function () {
    return true;
};

PromiseArray.prototype.getActualLength = function (len) {
    return len;
};

return PromiseArray;
};

},{"./util":36}],24:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL) {
var THIS = {};
var util = _dereq_("./util");
var nodebackForPromise = _dereq_("./nodeback");
var withAppended = util.withAppended;
var maybeWrapAsError = util.maybeWrapAsError;
var canEvaluate = util.canEvaluate;
var TypeError = _dereq_("./errors").TypeError;
var defaultSuffix = "Async";
var defaultPromisified = {__isPromisified__: true};
var noCopyProps = [
    "arity",    "length",
    "name",
    "arguments",
    "caller",
    "callee",
    "prototype",
    "__isPromisified__"
];
var noCopyPropsPattern = new RegExp("^(?:" + noCopyProps.join("|") + ")$");

var defaultFilter = function(name) {
    return util.isIdentifier(name) &&
        name.charAt(0) !== "_" &&
        name !== "constructor";
};

function propsFilter(key) {
    return !noCopyPropsPattern.test(key);
}

function isPromisified(fn) {
    try {
        return fn.__isPromisified__ === true;
    }
    catch (e) {
        return false;
    }
}

function hasPromisified(obj, key, suffix) {
    var val = util.getDataPropertyOrDefault(obj, key + suffix,
                                            defaultPromisified);
    return val ? isPromisified(val) : false;
}
function checkValid(ret, suffix, suffixRegexp) {
    for (var i = 0; i < ret.length; i += 2) {
        var key = ret[i];
        if (suffixRegexp.test(key)) {
            var keyWithoutAsyncSuffix = key.replace(suffixRegexp, "");
            for (var j = 0; j < ret.length; j += 2) {
                if (ret[j] === keyWithoutAsyncSuffix) {
                    throw new TypeError("Cannot promisify an API that has normal methods with '%s'-suffix\u000a\u000a    See http://goo.gl/MqrFmX\u000a"
                        .replace("%s", suffix));
                }
            }
        }
    }
}

function promisifiableMethods(obj, suffix, suffixRegexp, filter) {
    var keys = util.inheritedDataKeys(obj);
    var ret = [];
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        var value = obj[key];
        var passesDefaultFilter = filter === defaultFilter
            ? true : defaultFilter(key, value, obj);
        if (typeof value === "function" &&
            !isPromisified(value) &&
            !hasPromisified(obj, key, suffix) &&
            filter(key, value, obj, passesDefaultFilter)) {
            ret.push(key, value);
        }
    }
    checkValid(ret, suffix, suffixRegexp);
    return ret;
}

var escapeIdentRegex = function(str) {
    return str.replace(/([$])/, "\\$");
};

var makeNodePromisifiedEval;
if (!true) {
var switchCaseArgumentOrder = function(likelyArgumentCount) {
    var ret = [likelyArgumentCount];
    var min = Math.max(0, likelyArgumentCount - 1 - 3);
    for(var i = likelyArgumentCount - 1; i >= min; --i) {
        ret.push(i);
    }
    for(var i = likelyArgumentCount + 1; i <= 3; ++i) {
        ret.push(i);
    }
    return ret;
};

var argumentSequence = function(argumentCount) {
    return util.filledRange(argumentCount, "_arg", "");
};

var parameterDeclaration = function(parameterCount) {
    return util.filledRange(
        Math.max(parameterCount, 3), "_arg", "");
};

var parameterCount = function(fn) {
    if (typeof fn.length === "number") {
        return Math.max(Math.min(fn.length, 1023 + 1), 0);
    }
    return 0;
};

makeNodePromisifiedEval =
function(callback, receiver, originalName, fn, _, multiArgs) {
    var newParameterCount = Math.max(0, parameterCount(fn) - 1);
    var argumentOrder = switchCaseArgumentOrder(newParameterCount);
    var shouldProxyThis = typeof callback === "string" || receiver === THIS;

    function generateCallForArgumentCount(count) {
        var args = argumentSequence(count).join(", ");
        var comma = count > 0 ? ", " : "";
        var ret;
        if (shouldProxyThis) {
            ret = "ret = callback.call(this, {{args}}, nodeback); break;\n";
        } else {
            ret = receiver === undefined
                ? "ret = callback({{args}}, nodeback); break;\n"
                : "ret = callback.call(receiver, {{args}}, nodeback); break;\n";
        }
        return ret.replace("{{args}}", args).replace(", ", comma);
    }

    function generateArgumentSwitchCase() {
        var ret = "";
        for (var i = 0; i < argumentOrder.length; ++i) {
            ret += "case " + argumentOrder[i] +":" +
                generateCallForArgumentCount(argumentOrder[i]);
        }

        ret += "                                                             \n\
        default:                                                             \n\
            var args = new Array(len + 1);                                   \n\
            var i = 0;                                                       \n\
            for (var i = 0; i < len; ++i) {                                  \n\
               args[i] = arguments[i];                                       \n\
            }                                                                \n\
            args[i] = nodeback;                                              \n\
            [CodeForCall]                                                    \n\
            break;                                                           \n\
        ".replace("[CodeForCall]", (shouldProxyThis
                                ? "ret = callback.apply(this, args);\n"
                                : "ret = callback.apply(receiver, args);\n"));
        return ret;
    }

    var getFunctionCode = typeof callback === "string"
                                ? ("this != null ? this['"+callback+"'] : fn")
                                : "fn";
    var body = "'use strict';                                                \n\
        var ret = function (Parameters) {                                    \n\
            'use strict';                                                    \n\
            var len = arguments.length;                                      \n\
            var promise = new Promise(INTERNAL);                             \n\
            promise._captureStackTrace();                                    \n\
            var nodeback = nodebackForPromise(promise, " + multiArgs + ");   \n\
            var ret;                                                         \n\
            var callback = tryCatch([GetFunctionCode]);                      \n\
            switch(len) {                                                    \n\
                [CodeForSwitchCase]                                          \n\
            }                                                                \n\
            if (ret === errorObj) {                                          \n\
                promise._rejectCallback(maybeWrapAsError(ret.e), true, true);\n\
            }                                                                \n\
            if (!promise._isFateSealed()) promise._setAsyncGuaranteed();     \n\
            return promise;                                                  \n\
        };                                                                   \n\
        notEnumerableProp(ret, '__isPromisified__', true);                   \n\
        return ret;                                                          \n\
    ".replace("[CodeForSwitchCase]", generateArgumentSwitchCase())
        .replace("[GetFunctionCode]", getFunctionCode);
    body = body.replace("Parameters", parameterDeclaration(newParameterCount));
    return new Function("Promise",
                        "fn",
                        "receiver",
                        "withAppended",
                        "maybeWrapAsError",
                        "nodebackForPromise",
                        "tryCatch",
                        "errorObj",
                        "notEnumerableProp",
                        "INTERNAL",
                        body)(
                    Promise,
                    fn,
                    receiver,
                    withAppended,
                    maybeWrapAsError,
                    nodebackForPromise,
                    util.tryCatch,
                    util.errorObj,
                    util.notEnumerableProp,
                    INTERNAL);
};
}

function makeNodePromisifiedClosure(callback, receiver, _, fn, __, multiArgs) {
    var defaultThis = (function() {return this;})();
    var method = callback;
    if (typeof method === "string") {
        callback = fn;
    }
    function promisified() {
        var _receiver = receiver;
        if (receiver === THIS) _receiver = this;
        var promise = new Promise(INTERNAL);
        promise._captureStackTrace();
        var cb = typeof method === "string" && this !== defaultThis
            ? this[method] : callback;
        var fn = nodebackForPromise(promise, multiArgs);
        try {
            cb.apply(_receiver, withAppended(arguments, fn));
        } catch(e) {
            promise._rejectCallback(maybeWrapAsError(e), true, true);
        }
        if (!promise._isFateSealed()) promise._setAsyncGuaranteed();
        return promise;
    }
    util.notEnumerableProp(promisified, "__isPromisified__", true);
    return promisified;
}

var makeNodePromisified = canEvaluate
    ? makeNodePromisifiedEval
    : makeNodePromisifiedClosure;

function promisifyAll(obj, suffix, filter, promisifier, multiArgs) {
    var suffixRegexp = new RegExp(escapeIdentRegex(suffix) + "$");
    var methods =
        promisifiableMethods(obj, suffix, suffixRegexp, filter);

    for (var i = 0, len = methods.length; i < len; i+= 2) {
        var key = methods[i];
        var fn = methods[i+1];
        var promisifiedKey = key + suffix;
        if (promisifier === makeNodePromisified) {
            obj[promisifiedKey] =
                makeNodePromisified(key, THIS, key, fn, suffix, multiArgs);
        } else {
            var promisified = promisifier(fn, function() {
                return makeNodePromisified(key, THIS, key,
                                           fn, suffix, multiArgs);
            });
            util.notEnumerableProp(promisified, "__isPromisified__", true);
            obj[promisifiedKey] = promisified;
        }
    }
    util.toFastProperties(obj);
    return obj;
}

function promisify(callback, receiver, multiArgs) {
    return makeNodePromisified(callback, receiver, undefined,
                                callback, null, multiArgs);
}

Promise.promisify = function (fn, options) {
    if (typeof fn !== "function") {
        throw new TypeError("expecting a function but got " + util.classString(fn));
    }
    if (isPromisified(fn)) {
        return fn;
    }
    options = Object(options);
    var receiver = options.context === undefined ? THIS : options.context;
    var multiArgs = !!options.multiArgs;
    var ret = promisify(fn, receiver, multiArgs);
    util.copyDescriptors(fn, ret, propsFilter);
    return ret;
};

Promise.promisifyAll = function (target, options) {
    if (typeof target !== "function" && typeof target !== "object") {
        throw new TypeError("the target of promisifyAll must be an object or a function\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    options = Object(options);
    var multiArgs = !!options.multiArgs;
    var suffix = options.suffix;
    if (typeof suffix !== "string") suffix = defaultSuffix;
    var filter = options.filter;
    if (typeof filter !== "function") filter = defaultFilter;
    var promisifier = options.promisifier;
    if (typeof promisifier !== "function") promisifier = makeNodePromisified;

    if (!util.isIdentifier(suffix)) {
        throw new RangeError("suffix must be a valid identifier\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }

    var keys = util.inheritedDataKeys(target);
    for (var i = 0; i < keys.length; ++i) {
        var value = target[keys[i]];
        if (keys[i] !== "constructor" &&
            util.isClass(value)) {
            promisifyAll(value.prototype, suffix, filter, promisifier,
                multiArgs);
            promisifyAll(value, suffix, filter, promisifier, multiArgs);
        }
    }

    return promisifyAll(target, suffix, filter, promisifier, multiArgs);
};
};


},{"./errors":12,"./nodeback":20,"./util":36}],25:[function(_dereq_,module,exports){
"use strict";
module.exports = function(
    Promise, PromiseArray, tryConvertToPromise, apiRejection) {
var util = _dereq_("./util");
var isObject = util.isObject;
var es5 = _dereq_("./es5");
var Es6Map;
if (typeof Map === "function") Es6Map = Map;

var mapToEntries = (function() {
    var index = 0;
    var size = 0;

    function extractEntry(value, key) {
        this[index] = value;
        this[index + size] = key;
        index++;
    }

    return function mapToEntries(map) {
        size = map.size;
        index = 0;
        var ret = new Array(map.size * 2);
        map.forEach(extractEntry, ret);
        return ret;
    };
})();

var entriesToMap = function(entries) {
    var ret = new Es6Map();
    var length = entries.length / 2 | 0;
    for (var i = 0; i < length; ++i) {
        var key = entries[length + i];
        var value = entries[i];
        ret.set(key, value);
    }
    return ret;
};

function PropertiesPromiseArray(obj) {
    var isMap = false;
    var entries;
    if (Es6Map !== undefined && obj instanceof Es6Map) {
        entries = mapToEntries(obj);
        isMap = true;
    } else {
        var keys = es5.keys(obj);
        var len = keys.length;
        entries = new Array(len * 2);
        for (var i = 0; i < len; ++i) {
            var key = keys[i];
            entries[i] = obj[key];
            entries[i + len] = key;
        }
    }
    this.constructor$(entries);
    this._isMap = isMap;
    this._init$(undefined, isMap ? -6 : -3);
}
util.inherits(PropertiesPromiseArray, PromiseArray);

PropertiesPromiseArray.prototype._init = function () {};

PropertiesPromiseArray.prototype._promiseFulfilled = function (value, index) {
    this._values[index] = value;
    var totalResolved = ++this._totalResolved;
    if (totalResolved >= this._length) {
        var val;
        if (this._isMap) {
            val = entriesToMap(this._values);
        } else {
            val = {};
            var keyOffset = this.length();
            for (var i = 0, len = this.length(); i < len; ++i) {
                val[this._values[i + keyOffset]] = this._values[i];
            }
        }
        this._resolve(val);
        return true;
    }
    return false;
};

PropertiesPromiseArray.prototype.shouldCopyValues = function () {
    return false;
};

PropertiesPromiseArray.prototype.getActualLength = function (len) {
    return len >> 1;
};

function props(promises) {
    var ret;
    var castValue = tryConvertToPromise(promises);

    if (!isObject(castValue)) {
        return apiRejection("cannot await properties of a non-object\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    } else if (castValue instanceof Promise) {
        ret = castValue._then(
            Promise.props, undefined, undefined, undefined, undefined);
    } else {
        ret = new PropertiesPromiseArray(castValue).promise();
    }

    if (castValue instanceof Promise) {
        ret._propagateFrom(castValue, 2);
    }
    return ret;
}

Promise.prototype.props = function () {
    return props(this);
};

Promise.props = function (promises) {
    return props(promises);
};
};

},{"./es5":13,"./util":36}],26:[function(_dereq_,module,exports){
"use strict";
function arrayMove(src, srcIndex, dst, dstIndex, len) {
    for (var j = 0; j < len; ++j) {
        dst[j + dstIndex] = src[j + srcIndex];
        src[j + srcIndex] = void 0;
    }
}

function Queue(capacity) {
    this._capacity = capacity;
    this._length = 0;
    this._front = 0;
}

Queue.prototype._willBeOverCapacity = function (size) {
    return this._capacity < size;
};

Queue.prototype._pushOne = function (arg) {
    var length = this.length();
    this._checkCapacity(length + 1);
    var i = (this._front + length) & (this._capacity - 1);
    this[i] = arg;
    this._length = length + 1;
};

Queue.prototype.push = function (fn, receiver, arg) {
    var length = this.length() + 3;
    if (this._willBeOverCapacity(length)) {
        this._pushOne(fn);
        this._pushOne(receiver);
        this._pushOne(arg);
        return;
    }
    var j = this._front + length - 3;
    this._checkCapacity(length);
    var wrapMask = this._capacity - 1;
    this[(j + 0) & wrapMask] = fn;
    this[(j + 1) & wrapMask] = receiver;
    this[(j + 2) & wrapMask] = arg;
    this._length = length;
};

Queue.prototype.shift = function () {
    var front = this._front,
        ret = this[front];

    this[front] = undefined;
    this._front = (front + 1) & (this._capacity - 1);
    this._length--;
    return ret;
};

Queue.prototype.length = function () {
    return this._length;
};

Queue.prototype._checkCapacity = function (size) {
    if (this._capacity < size) {
        this._resizeTo(this._capacity << 1);
    }
};

Queue.prototype._resizeTo = function (capacity) {
    var oldCapacity = this._capacity;
    this._capacity = capacity;
    var front = this._front;
    var length = this._length;
    var moveItemsCount = (front + length) & (oldCapacity - 1);
    arrayMove(this, 0, this, oldCapacity, moveItemsCount);
};

module.exports = Queue;

},{}],27:[function(_dereq_,module,exports){
"use strict";
module.exports = function(
    Promise, INTERNAL, tryConvertToPromise, apiRejection) {
var util = _dereq_("./util");

var raceLater = function (promise) {
    return promise.then(function(array) {
        return race(array, promise);
    });
};

function race(promises, parent) {
    var maybePromise = tryConvertToPromise(promises);

    if (maybePromise instanceof Promise) {
        return raceLater(maybePromise);
    } else {
        promises = util.asArray(promises);
        if (promises === null)
            return apiRejection("expecting an array or an iterable object but got " + util.classString(promises));
    }

    var ret = new Promise(INTERNAL);
    if (parent !== undefined) {
        ret._propagateFrom(parent, 3);
    }
    var fulfill = ret._fulfill;
    var reject = ret._reject;
    for (var i = 0, len = promises.length; i < len; ++i) {
        var val = promises[i];

        if (val === undefined && !(i in promises)) {
            continue;
        }

        Promise.cast(val)._then(fulfill, reject, undefined, ret, null);
    }
    return ret;
}

Promise.race = function (promises) {
    return race(promises, undefined);
};

Promise.prototype.race = function () {
    return race(this, undefined);
};

};

},{"./util":36}],28:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise,
                          PromiseArray,
                          apiRejection,
                          tryConvertToPromise,
                          INTERNAL,
                          debug) {
var util = _dereq_("./util");
var tryCatch = util.tryCatch;

function ReductionPromiseArray(promises, fn, initialValue, _each) {
    this.constructor$(promises);
    var context = Promise._getContext();
    this._fn = util.contextBind(context, fn);
    if (initialValue !== undefined) {
        initialValue = Promise.resolve(initialValue);
        initialValue._attachCancellationCallback(this);
    }
    this._initialValue = initialValue;
    this._currentCancellable = null;
    if(_each === INTERNAL) {
        this._eachValues = Array(this._length);
    } else if (_each === 0) {
        this._eachValues = null;
    } else {
        this._eachValues = undefined;
    }
    this._promise._captureStackTrace();
    this._init$(undefined, -5);
}
util.inherits(ReductionPromiseArray, PromiseArray);

ReductionPromiseArray.prototype._gotAccum = function(accum) {
    if (this._eachValues !== undefined &&
        this._eachValues !== null &&
        accum !== INTERNAL) {
        this._eachValues.push(accum);
    }
};

ReductionPromiseArray.prototype._eachComplete = function(value) {
    if (this._eachValues !== null) {
        this._eachValues.push(value);
    }
    return this._eachValues;
};

ReductionPromiseArray.prototype._init = function() {};

ReductionPromiseArray.prototype._resolveEmptyArray = function() {
    this._resolve(this._eachValues !== undefined ? this._eachValues
                                                 : this._initialValue);
};

ReductionPromiseArray.prototype.shouldCopyValues = function () {
    return false;
};

ReductionPromiseArray.prototype._resolve = function(value) {
    this._promise._resolveCallback(value);
    this._values = null;
};

ReductionPromiseArray.prototype._resultCancelled = function(sender) {
    if (sender === this._initialValue) return this._cancel();
    if (this._isResolved()) return;
    this._resultCancelled$();
    if (this._currentCancellable instanceof Promise) {
        this._currentCancellable.cancel();
    }
    if (this._initialValue instanceof Promise) {
        this._initialValue.cancel();
    }
};

ReductionPromiseArray.prototype._iterate = function (values) {
    this._values = values;
    var value;
    var i;
    var length = values.length;
    if (this._initialValue !== undefined) {
        value = this._initialValue;
        i = 0;
    } else {
        value = Promise.resolve(values[0]);
        i = 1;
    }

    this._currentCancellable = value;

    for (var j = i; j < length; ++j) {
        var maybePromise = values[j];
        if (maybePromise instanceof Promise) {
            maybePromise.suppressUnhandledRejections();
        }
    }

    if (!value.isRejected()) {
        for (; i < length; ++i) {
            var ctx = {
                accum: null,
                value: values[i],
                index: i,
                length: length,
                array: this
            };

            value = value._then(gotAccum, undefined, undefined, ctx, undefined);

            if ((i & 127) === 0) {
                value._setNoAsyncGuarantee();
            }
        }
    }

    if (this._eachValues !== undefined) {
        value = value
            ._then(this._eachComplete, undefined, undefined, this, undefined);
    }
    value._then(completed, completed, undefined, value, this);
};

Promise.prototype.reduce = function (fn, initialValue) {
    return reduce(this, fn, initialValue, null);
};

Promise.reduce = function (promises, fn, initialValue, _each) {
    return reduce(promises, fn, initialValue, _each);
};

function completed(valueOrReason, array) {
    if (this.isFulfilled()) {
        array._resolve(valueOrReason);
    } else {
        array._reject(valueOrReason);
    }
}

function reduce(promises, fn, initialValue, _each) {
    if (typeof fn !== "function") {
        return apiRejection("expecting a function but got " + util.classString(fn));
    }
    var array = new ReductionPromiseArray(promises, fn, initialValue, _each);
    return array.promise();
}

function gotAccum(accum) {
    this.accum = accum;
    this.array._gotAccum(accum);
    var value = tryConvertToPromise(this.value, this.array._promise);
    if (value instanceof Promise) {
        this.array._currentCancellable = value;
        return value._then(gotValue, undefined, undefined, this, undefined);
    } else {
        return gotValue.call(this, value);
    }
}

function gotValue(value) {
    var array = this.array;
    var promise = array._promise;
    var fn = tryCatch(array._fn);
    promise._pushContext();
    var ret;
    if (array._eachValues !== undefined) {
        ret = fn.call(promise._boundValue(), value, this.index, this.length);
    } else {
        ret = fn.call(promise._boundValue(),
                              this.accum, value, this.index, this.length);
    }
    if (ret instanceof Promise) {
        array._currentCancellable = ret;
    }
    var promiseCreated = promise._popContext();
    debug.checkForgottenReturns(
        ret,
        promiseCreated,
        array._eachValues !== undefined ? "Promise.each" : "Promise.reduce",
        promise
    );
    return ret;
}
};

},{"./util":36}],29:[function(_dereq_,module,exports){
"use strict";
var util = _dereq_("./util");
var schedule;
var noAsyncScheduler = function() {
    throw new Error("No async scheduler available\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
};
var NativePromise = util.getNativePromise();
if (util.isNode && typeof MutationObserver === "undefined") {
    var GlobalSetImmediate = global.setImmediate;
    var ProcessNextTick = process.nextTick;
    schedule = util.isRecentNode
                ? function(fn) { GlobalSetImmediate.call(global, fn); }
                : function(fn) { ProcessNextTick.call(process, fn); };
} else if (typeof NativePromise === "function" &&
           typeof NativePromise.resolve === "function") {
    var nativePromise = NativePromise.resolve();
    schedule = function(fn) {
        nativePromise.then(fn);
    };
} else if ((typeof MutationObserver !== "undefined") &&
          !(typeof window !== "undefined" &&
            window.navigator &&
            (window.navigator.standalone || window.cordova)) &&
          ("classList" in document.documentElement)) {
    schedule = (function() {
        var div = document.createElement("div");
        var opts = {attributes: true};
        var toggleScheduled = false;
        var div2 = document.createElement("div");
        var o2 = new MutationObserver(function() {
            div.classList.toggle("foo");
            toggleScheduled = false;
        });
        o2.observe(div2, opts);

        var scheduleToggle = function() {
            if (toggleScheduled) return;
            toggleScheduled = true;
            div2.classList.toggle("foo");
        };

        return function schedule(fn) {
            var o = new MutationObserver(function() {
                o.disconnect();
                fn();
            });
            o.observe(div, opts);
            scheduleToggle();
        };
    })();
} else if (typeof setImmediate !== "undefined") {
    schedule = function (fn) {
        setImmediate(fn);
    };
} else if (typeof setTimeout !== "undefined") {
    schedule = function (fn) {
        setTimeout(fn, 0);
    };
} else {
    schedule = noAsyncScheduler;
}
module.exports = schedule;

},{"./util":36}],30:[function(_dereq_,module,exports){
"use strict";
module.exports =
    function(Promise, PromiseArray, debug) {
var PromiseInspection = Promise.PromiseInspection;
var util = _dereq_("./util");

function SettledPromiseArray(values) {
    this.constructor$(values);
}
util.inherits(SettledPromiseArray, PromiseArray);

SettledPromiseArray.prototype._promiseResolved = function (index, inspection) {
    this._values[index] = inspection;
    var totalResolved = ++this._totalResolved;
    if (totalResolved >= this._length) {
        this._resolve(this._values);
        return true;
    }
    return false;
};

SettledPromiseArray.prototype._promiseFulfilled = function (value, index) {
    var ret = new PromiseInspection();
    ret._bitField = 33554432;
    ret._settledValueField = value;
    return this._promiseResolved(index, ret);
};
SettledPromiseArray.prototype._promiseRejected = function (reason, index) {
    var ret = new PromiseInspection();
    ret._bitField = 16777216;
    ret._settledValueField = reason;
    return this._promiseResolved(index, ret);
};

Promise.settle = function (promises) {
    debug.deprecated(".settle()", ".reflect()");
    return new SettledPromiseArray(promises).promise();
};

Promise.allSettled = function (promises) {
    return new SettledPromiseArray(promises).promise();
};

Promise.prototype.settle = function () {
    return Promise.settle(this);
};
};

},{"./util":36}],31:[function(_dereq_,module,exports){
"use strict";
module.exports =
function(Promise, PromiseArray, apiRejection) {
var util = _dereq_("./util");
var RangeError = _dereq_("./errors").RangeError;
var AggregateError = _dereq_("./errors").AggregateError;
var isArray = util.isArray;
var CANCELLATION = {};


function SomePromiseArray(values) {
    this.constructor$(values);
    this._howMany = 0;
    this._unwrap = false;
    this._initialized = false;
}
util.inherits(SomePromiseArray, PromiseArray);

SomePromiseArray.prototype._init = function () {
    if (!this._initialized) {
        return;
    }
    if (this._howMany === 0) {
        this._resolve([]);
        return;
    }
    this._init$(undefined, -5);
    var isArrayResolved = isArray(this._values);
    if (!this._isResolved() &&
        isArrayResolved &&
        this._howMany > this._canPossiblyFulfill()) {
        this._reject(this._getRangeError(this.length()));
    }
};

SomePromiseArray.prototype.init = function () {
    this._initialized = true;
    this._init();
};

SomePromiseArray.prototype.setUnwrap = function () {
    this._unwrap = true;
};

SomePromiseArray.prototype.howMany = function () {
    return this._howMany;
};

SomePromiseArray.prototype.setHowMany = function (count) {
    this._howMany = count;
};

SomePromiseArray.prototype._promiseFulfilled = function (value) {
    this._addFulfilled(value);
    if (this._fulfilled() === this.howMany()) {
        this._values.length = this.howMany();
        if (this.howMany() === 1 && this._unwrap) {
            this._resolve(this._values[0]);
        } else {
            this._resolve(this._values);
        }
        return true;
    }
    return false;

};
SomePromiseArray.prototype._promiseRejected = function (reason) {
    this._addRejected(reason);
    return this._checkOutcome();
};

SomePromiseArray.prototype._promiseCancelled = function () {
    if (this._values instanceof Promise || this._values == null) {
        return this._cancel();
    }
    this._addRejected(CANCELLATION);
    return this._checkOutcome();
};

SomePromiseArray.prototype._checkOutcome = function() {
    if (this.howMany() > this._canPossiblyFulfill()) {
        var e = new AggregateError();
        for (var i = this.length(); i < this._values.length; ++i) {
            if (this._values[i] !== CANCELLATION) {
                e.push(this._values[i]);
            }
        }
        if (e.length > 0) {
            this._reject(e);
        } else {
            this._cancel();
        }
        return true;
    }
    return false;
};

SomePromiseArray.prototype._fulfilled = function () {
    return this._totalResolved;
};

SomePromiseArray.prototype._rejected = function () {
    return this._values.length - this.length();
};

SomePromiseArray.prototype._addRejected = function (reason) {
    this._values.push(reason);
};

SomePromiseArray.prototype._addFulfilled = function (value) {
    this._values[this._totalResolved++] = value;
};

SomePromiseArray.prototype._canPossiblyFulfill = function () {
    return this.length() - this._rejected();
};

SomePromiseArray.prototype._getRangeError = function (count) {
    var message = "Input array must contain at least " +
            this._howMany + " items but contains only " + count + " items";
    return new RangeError(message);
};

SomePromiseArray.prototype._resolveEmptyArray = function () {
    this._reject(this._getRangeError(0));
};

function some(promises, howMany) {
    if ((howMany | 0) !== howMany || howMany < 0) {
        return apiRejection("expecting a positive integer\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    var ret = new SomePromiseArray(promises);
    var promise = ret.promise();
    ret.setHowMany(howMany);
    ret.init();
    return promise;
}

Promise.some = function (promises, howMany) {
    return some(promises, howMany);
};

Promise.prototype.some = function (howMany) {
    return some(this, howMany);
};

Promise._SomePromiseArray = SomePromiseArray;
};

},{"./errors":12,"./util":36}],32:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise) {
function PromiseInspection(promise) {
    if (promise !== undefined) {
        promise = promise._target();
        this._bitField = promise._bitField;
        this._settledValueField = promise._isFateSealed()
            ? promise._settledValue() : undefined;
    }
    else {
        this._bitField = 0;
        this._settledValueField = undefined;
    }
}

PromiseInspection.prototype._settledValue = function() {
    return this._settledValueField;
};

var value = PromiseInspection.prototype.value = function () {
    if (!this.isFulfilled()) {
        throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    return this._settledValue();
};

var reason = PromiseInspection.prototype.error =
PromiseInspection.prototype.reason = function () {
    if (!this.isRejected()) {
        throw new TypeError("cannot get rejection reason of a non-rejected promise\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
    }
    return this._settledValue();
};

var isFulfilled = PromiseInspection.prototype.isFulfilled = function() {
    return (this._bitField & 33554432) !== 0;
};

var isRejected = PromiseInspection.prototype.isRejected = function () {
    return (this._bitField & 16777216) !== 0;
};

var isPending = PromiseInspection.prototype.isPending = function () {
    return (this._bitField & 50397184) === 0;
};

var isResolved = PromiseInspection.prototype.isResolved = function () {
    return (this._bitField & 50331648) !== 0;
};

PromiseInspection.prototype.isCancelled = function() {
    return (this._bitField & 8454144) !== 0;
};

Promise.prototype.__isCancelled = function() {
    return (this._bitField & 65536) === 65536;
};

Promise.prototype._isCancelled = function() {
    return this._target().__isCancelled();
};

Promise.prototype.isCancelled = function() {
    return (this._target()._bitField & 8454144) !== 0;
};

Promise.prototype.isPending = function() {
    return isPending.call(this._target());
};

Promise.prototype.isRejected = function() {
    return isRejected.call(this._target());
};

Promise.prototype.isFulfilled = function() {
    return isFulfilled.call(this._target());
};

Promise.prototype.isResolved = function() {
    return isResolved.call(this._target());
};

Promise.prototype.value = function() {
    return value.call(this._target());
};

Promise.prototype.reason = function() {
    var target = this._target();
    target._unsetRejectionIsUnhandled();
    return reason.call(target);
};

Promise.prototype._value = function() {
    return this._settledValue();
};

Promise.prototype._reason = function() {
    this._unsetRejectionIsUnhandled();
    return this._settledValue();
};

Promise.PromiseInspection = PromiseInspection;
};

},{}],33:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL) {
var util = _dereq_("./util");
var errorObj = util.errorObj;
var isObject = util.isObject;

function tryConvertToPromise(obj, context) {
    if (isObject(obj)) {
        if (obj instanceof Promise) return obj;
        var then = getThen(obj);
        if (then === errorObj) {
            if (context) context._pushContext();
            var ret = Promise.reject(then.e);
            if (context) context._popContext();
            return ret;
        } else if (typeof then === "function") {
            if (isAnyBluebirdPromise(obj)) {
                var ret = new Promise(INTERNAL);
                obj._then(
                    ret._fulfill,
                    ret._reject,
                    undefined,
                    ret,
                    null
                );
                return ret;
            }
            return doThenable(obj, then, context);
        }
    }
    return obj;
}

function doGetThen(obj) {
    return obj.then;
}

function getThen(obj) {
    try {
        return doGetThen(obj);
    } catch (e) {
        errorObj.e = e;
        return errorObj;
    }
}

var hasProp = {}.hasOwnProperty;
function isAnyBluebirdPromise(obj) {
    try {
        return hasProp.call(obj, "_promise0");
    } catch (e) {
        return false;
    }
}

function doThenable(x, then, context) {
    var promise = new Promise(INTERNAL);
    var ret = promise;
    if (context) context._pushContext();
    promise._captureStackTrace();
    if (context) context._popContext();
    var synchronous = true;
    var result = util.tryCatch(then).call(x, resolve, reject);
    synchronous = false;

    if (promise && result === errorObj) {
        promise._rejectCallback(result.e, true, true);
        promise = null;
    }

    function resolve(value) {
        if (!promise) return;
        promise._resolveCallback(value);
        promise = null;
    }

    function reject(reason) {
        if (!promise) return;
        promise._rejectCallback(reason, synchronous, true);
        promise = null;
    }
    return ret;
}

return tryConvertToPromise;
};

},{"./util":36}],34:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL, debug) {
var util = _dereq_("./util");
var TimeoutError = Promise.TimeoutError;

function HandleWrapper(handle)  {
    this.handle = handle;
}

HandleWrapper.prototype._resultCancelled = function() {
    clearTimeout(this.handle);
};

var afterValue = function(value) { return delay(+this).thenReturn(value); };
var delay = Promise.delay = function (ms, value) {
    var ret;
    var handle;
    if (value !== undefined) {
        ret = Promise.resolve(value)
                ._then(afterValue, null, null, ms, undefined);
        if (debug.cancellation() && value instanceof Promise) {
            ret._setOnCancel(value);
        }
    } else {
        ret = new Promise(INTERNAL);
        handle = setTimeout(function() { ret._fulfill(); }, +ms);
        if (debug.cancellation()) {
            ret._setOnCancel(new HandleWrapper(handle));
        }
        ret._captureStackTrace();
    }
    ret._setAsyncGuaranteed();
    return ret;
};

Promise.prototype.delay = function (ms) {
    return delay(ms, this);
};

var afterTimeout = function (promise, message, parent) {
    var err;
    if (typeof message !== "string") {
        if (message instanceof Error) {
            err = message;
        } else {
            err = new TimeoutError("operation timed out");
        }
    } else {
        err = new TimeoutError(message);
    }
    util.markAsOriginatingFromRejection(err);
    promise._attachExtraTrace(err);
    promise._reject(err);

    if (parent != null) {
        parent.cancel();
    }
};

function successClear(value) {
    clearTimeout(this.handle);
    return value;
}

function failureClear(reason) {
    clearTimeout(this.handle);
    throw reason;
}

Promise.prototype.timeout = function (ms, message) {
    ms = +ms;
    var ret, parent;

    var handleWrapper = new HandleWrapper(setTimeout(function timeoutTimeout() {
        if (ret.isPending()) {
            afterTimeout(ret, message, parent);
        }
    }, ms));

    if (debug.cancellation()) {
        parent = this.then();
        ret = parent._then(successClear, failureClear,
                            undefined, handleWrapper, undefined);
        ret._setOnCancel(handleWrapper);
    } else {
        ret = this._then(successClear, failureClear,
                            undefined, handleWrapper, undefined);
    }

    return ret;
};

};

},{"./util":36}],35:[function(_dereq_,module,exports){
"use strict";
module.exports = function (Promise, apiRejection, tryConvertToPromise,
    createContext, INTERNAL, debug) {
    var util = _dereq_("./util");
    var TypeError = _dereq_("./errors").TypeError;
    var inherits = _dereq_("./util").inherits;
    var errorObj = util.errorObj;
    var tryCatch = util.tryCatch;
    var NULL = {};

    function thrower(e) {
        setTimeout(function(){throw e;}, 0);
    }

    function castPreservingDisposable(thenable) {
        var maybePromise = tryConvertToPromise(thenable);
        if (maybePromise !== thenable &&
            typeof thenable._isDisposable === "function" &&
            typeof thenable._getDisposer === "function" &&
            thenable._isDisposable()) {
            maybePromise._setDisposable(thenable._getDisposer());
        }
        return maybePromise;
    }
    function dispose(resources, inspection) {
        var i = 0;
        var len = resources.length;
        var ret = new Promise(INTERNAL);
        function iterator() {
            if (i >= len) return ret._fulfill();
            var maybePromise = castPreservingDisposable(resources[i++]);
            if (maybePromise instanceof Promise &&
                maybePromise._isDisposable()) {
                try {
                    maybePromise = tryConvertToPromise(
                        maybePromise._getDisposer().tryDispose(inspection),
                        resources.promise);
                } catch (e) {
                    return thrower(e);
                }
                if (maybePromise instanceof Promise) {
                    return maybePromise._then(iterator, thrower,
                                              null, null, null);
                }
            }
            iterator();
        }
        iterator();
        return ret;
    }

    function Disposer(data, promise, context) {
        this._data = data;
        this._promise = promise;
        this._context = context;
    }

    Disposer.prototype.data = function () {
        return this._data;
    };

    Disposer.prototype.promise = function () {
        return this._promise;
    };

    Disposer.prototype.resource = function () {
        if (this.promise().isFulfilled()) {
            return this.promise().value();
        }
        return NULL;
    };

    Disposer.prototype.tryDispose = function(inspection) {
        var resource = this.resource();
        var context = this._context;
        if (context !== undefined) context._pushContext();
        var ret = resource !== NULL
            ? this.doDispose(resource, inspection) : null;
        if (context !== undefined) context._popContext();
        this._promise._unsetDisposable();
        this._data = null;
        return ret;
    };

    Disposer.isDisposer = function (d) {
        return (d != null &&
                typeof d.resource === "function" &&
                typeof d.tryDispose === "function");
    };

    function FunctionDisposer(fn, promise, context) {
        this.constructor$(fn, promise, context);
    }
    inherits(FunctionDisposer, Disposer);

    FunctionDisposer.prototype.doDispose = function (resource, inspection) {
        var fn = this.data();
        return fn.call(resource, resource, inspection);
    };

    function maybeUnwrapDisposer(value) {
        if (Disposer.isDisposer(value)) {
            this.resources[this.index]._setDisposable(value);
            return value.promise();
        }
        return value;
    }

    function ResourceList(length) {
        this.length = length;
        this.promise = null;
        this[length-1] = null;
    }

    ResourceList.prototype._resultCancelled = function() {
        var len = this.length;
        for (var i = 0; i < len; ++i) {
            var item = this[i];
            if (item instanceof Promise) {
                item.cancel();
            }
        }
    };

    Promise.using = function () {
        var len = arguments.length;
        if (len < 2) return apiRejection(
                        "you must pass at least 2 arguments to Promise.using");
        var fn = arguments[len - 1];
        if (typeof fn !== "function") {
            return apiRejection("expecting a function but got " + util.classString(fn));
        }
        var input;
        var spreadArgs = true;
        if (len === 2 && Array.isArray(arguments[0])) {
            input = arguments[0];
            len = input.length;
            spreadArgs = false;
        } else {
            input = arguments;
            len--;
        }
        var resources = new ResourceList(len);
        for (var i = 0; i < len; ++i) {
            var resource = input[i];
            if (Disposer.isDisposer(resource)) {
                var disposer = resource;
                resource = resource.promise();
                resource._setDisposable(disposer);
            } else {
                var maybePromise = tryConvertToPromise(resource);
                if (maybePromise instanceof Promise) {
                    resource =
                        maybePromise._then(maybeUnwrapDisposer, null, null, {
                            resources: resources,
                            index: i
                    }, undefined);
                }
            }
            resources[i] = resource;
        }

        var reflectedResources = new Array(resources.length);
        for (var i = 0; i < reflectedResources.length; ++i) {
            reflectedResources[i] = Promise.resolve(resources[i]).reflect();
        }

        var resultPromise = Promise.all(reflectedResources)
            .then(function(inspections) {
                for (var i = 0; i < inspections.length; ++i) {
                    var inspection = inspections[i];
                    if (inspection.isRejected()) {
                        errorObj.e = inspection.error();
                        return errorObj;
                    } else if (!inspection.isFulfilled()) {
                        resultPromise.cancel();
                        return;
                    }
                    inspections[i] = inspection.value();
                }
                promise._pushContext();

                fn = tryCatch(fn);
                var ret = spreadArgs
                    ? fn.apply(undefined, inspections) : fn(inspections);
                var promiseCreated = promise._popContext();
                debug.checkForgottenReturns(
                    ret, promiseCreated, "Promise.using", promise);
                return ret;
            });

        var promise = resultPromise.lastly(function() {
            var inspection = new Promise.PromiseInspection(resultPromise);
            return dispose(resources, inspection);
        });
        resources.promise = promise;
        promise._setOnCancel(resources);
        return promise;
    };

    Promise.prototype._setDisposable = function (disposer) {
        this._bitField = this._bitField | 131072;
        this._disposer = disposer;
    };

    Promise.prototype._isDisposable = function () {
        return (this._bitField & 131072) > 0;
    };

    Promise.prototype._getDisposer = function () {
        return this._disposer;
    };

    Promise.prototype._unsetDisposable = function () {
        this._bitField = this._bitField & (~131072);
        this._disposer = undefined;
    };

    Promise.prototype.disposer = function (fn) {
        if (typeof fn === "function") {
            return new FunctionDisposer(fn, this, createContext());
        }
        throw new TypeError();
    };

};

},{"./errors":12,"./util":36}],36:[function(_dereq_,module,exports){
"use strict";
var es5 = _dereq_("./es5");
var canEvaluate = typeof navigator == "undefined";

var errorObj = {e: {}};
var tryCatchTarget;
var globalObject = typeof self !== "undefined" ? self :
    typeof window !== "undefined" ? window :
    typeof global !== "undefined" ? global :
    this !== undefined ? this : null;

function tryCatcher() {
    try {
        var target = tryCatchTarget;
        tryCatchTarget = null;
        return target.apply(this, arguments);
    } catch (e) {
        errorObj.e = e;
        return errorObj;
    }
}
function tryCatch(fn) {
    tryCatchTarget = fn;
    return tryCatcher;
}

var inherits = function(Child, Parent) {
    var hasProp = {}.hasOwnProperty;

    function T() {
        this.constructor = Child;
        this.constructor$ = Parent;
        for (var propertyName in Parent.prototype) {
            if (hasProp.call(Parent.prototype, propertyName) &&
                propertyName.charAt(propertyName.length-1) !== "$"
           ) {
                this[propertyName + "$"] = Parent.prototype[propertyName];
            }
        }
    }
    T.prototype = Parent.prototype;
    Child.prototype = new T();
    return Child.prototype;
};


function isPrimitive(val) {
    return val == null || val === true || val === false ||
        typeof val === "string" || typeof val === "number";

}

function isObject(value) {
    return typeof value === "function" ||
           typeof value === "object" && value !== null;
}

function maybeWrapAsError(maybeError) {
    if (!isPrimitive(maybeError)) return maybeError;

    return new Error(safeToString(maybeError));
}

function withAppended(target, appendee) {
    var len = target.length;
    var ret = new Array(len + 1);
    var i;
    for (i = 0; i < len; ++i) {
        ret[i] = target[i];
    }
    ret[i] = appendee;
    return ret;
}

function getDataPropertyOrDefault(obj, key, defaultValue) {
    if (es5.isES5) {
        var desc = Object.getOwnPropertyDescriptor(obj, key);

        if (desc != null) {
            return desc.get == null && desc.set == null
                    ? desc.value
                    : defaultValue;
        }
    } else {
        return {}.hasOwnProperty.call(obj, key) ? obj[key] : undefined;
    }
}

function notEnumerableProp(obj, name, value) {
    if (isPrimitive(obj)) return obj;
    var descriptor = {
        value: value,
        configurable: true,
        enumerable: false,
        writable: true
    };
    es5.defineProperty(obj, name, descriptor);
    return obj;
}

function thrower(r) {
    throw r;
}

var inheritedDataKeys = (function() {
    var excludedPrototypes = [
        Array.prototype,
        Object.prototype,
        Function.prototype
    ];

    var isExcludedProto = function(val) {
        for (var i = 0; i < excludedPrototypes.length; ++i) {
            if (excludedPrototypes[i] === val) {
                return true;
            }
        }
        return false;
    };

    if (es5.isES5) {
        var getKeys = Object.getOwnPropertyNames;
        return function(obj) {
            var ret = [];
            var visitedKeys = Object.create(null);
            while (obj != null && !isExcludedProto(obj)) {
                var keys;
                try {
                    keys = getKeys(obj);
                } catch (e) {
                    return ret;
                }
                for (var i = 0; i < keys.length; ++i) {
                    var key = keys[i];
                    if (visitedKeys[key]) continue;
                    visitedKeys[key] = true;
                    var desc = Object.getOwnPropertyDescriptor(obj, key);
                    if (desc != null && desc.get == null && desc.set == null) {
                        ret.push(key);
                    }
                }
                obj = es5.getPrototypeOf(obj);
            }
            return ret;
        };
    } else {
        var hasProp = {}.hasOwnProperty;
        return function(obj) {
            if (isExcludedProto(obj)) return [];
            var ret = [];

            /*jshint forin:false */
            enumeration: for (var key in obj) {
                if (hasProp.call(obj, key)) {
                    ret.push(key);
                } else {
                    for (var i = 0; i < excludedPrototypes.length; ++i) {
                        if (hasProp.call(excludedPrototypes[i], key)) {
                            continue enumeration;
                        }
                    }
                    ret.push(key);
                }
            }
            return ret;
        };
    }

})();

var thisAssignmentPattern = /this\s*\.\s*\S+\s*=/;
function isClass(fn) {
    try {
        if (typeof fn === "function") {
            var keys = es5.names(fn.prototype);

            var hasMethods = es5.isES5 && keys.length > 1;
            var hasMethodsOtherThanConstructor = keys.length > 0 &&
                !(keys.length === 1 && keys[0] === "constructor");
            var hasThisAssignmentAndStaticMethods =
                thisAssignmentPattern.test(fn + "") && es5.names(fn).length > 0;

            if (hasMethods || hasMethodsOtherThanConstructor ||
                hasThisAssignmentAndStaticMethods) {
                return true;
            }
        }
        return false;
    } catch (e) {
        return false;
    }
}

function toFastProperties(obj) {
    /*jshint -W027,-W055,-W031*/
    function FakeConstructor() {}
    FakeConstructor.prototype = obj;
    var receiver = new FakeConstructor();
    function ic() {
        return typeof receiver.foo;
    }
    ic();
    ic();
    return obj;
    eval(obj);
}

var rident = /^[a-z$_][a-z$_0-9]*$/i;
function isIdentifier(str) {
    return rident.test(str);
}

function filledRange(count, prefix, suffix) {
    var ret = new Array(count);
    for(var i = 0; i < count; ++i) {
        ret[i] = prefix + i + suffix;
    }
    return ret;
}

function safeToString(obj) {
    try {
        return obj + "";
    } catch (e) {
        return "[no string representation]";
    }
}

function isError(obj) {
    return obj instanceof Error ||
        (obj !== null &&
           typeof obj === "object" &&
           typeof obj.message === "string" &&
           typeof obj.name === "string");
}

function markAsOriginatingFromRejection(e) {
    try {
        notEnumerableProp(e, "isOperational", true);
    }
    catch(ignore) {}
}

function originatesFromRejection(e) {
    if (e == null) return false;
    return ((e instanceof Error["__BluebirdErrorTypes__"].OperationalError) ||
        e["isOperational"] === true);
}

function canAttachTrace(obj) {
    return isError(obj) && es5.propertyIsWritable(obj, "stack");
}

var ensureErrorObject = (function() {
    if (!("stack" in new Error())) {
        return function(value) {
            if (canAttachTrace(value)) return value;
            try {throw new Error(safeToString(value));}
            catch(err) {return err;}
        };
    } else {
        return function(value) {
            if (canAttachTrace(value)) return value;
            return new Error(safeToString(value));
        };
    }
})();

function classString(obj) {
    return {}.toString.call(obj);
}

function copyDescriptors(from, to, filter) {
    var keys = es5.names(from);
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        if (filter(key)) {
            try {
                es5.defineProperty(to, key, es5.getDescriptor(from, key));
            } catch (ignore) {}
        }
    }
}

var asArray = function(v) {
    if (es5.isArray(v)) {
        return v;
    }
    return null;
};

if (typeof Symbol !== "undefined" && Symbol.iterator) {
    var ArrayFrom = typeof Array.from === "function" ? function(v) {
        return Array.from(v);
    } : function(v) {
        var ret = [];
        var it = v[Symbol.iterator]();
        var itResult;
        while (!((itResult = it.next()).done)) {
            ret.push(itResult.value);
        }
        return ret;
    };

    asArray = function(v) {
        if (es5.isArray(v)) {
            return v;
        } else if (v != null && typeof v[Symbol.iterator] === "function") {
            return ArrayFrom(v);
        }
        return null;
    };
}

var isNode = typeof process !== "undefined" &&
        classString(process).toLowerCase() === "[object process]";

var hasEnvVariables = typeof process !== "undefined" &&
    typeof process.env !== "undefined";

function env(key) {
    return hasEnvVariables ? process.env[key] : undefined;
}

function getNativePromise() {
    if (typeof Promise === "function") {
        try {
            var promise = new Promise(function(){});
            if (classString(promise) === "[object Promise]") {
                return Promise;
            }
        } catch (e) {}
    }
}

var reflectHandler;
function contextBind(ctx, cb) {
    if (ctx === null ||
        typeof cb !== "function" ||
        cb === reflectHandler) {
        return cb;
    }

    if (ctx.domain !== null) {
        cb = ctx.domain.bind(cb);
    }

    var async = ctx.async;
    if (async !== null) {
        var old = cb;
        cb = function() {
            var args = (new Array(2)).concat([].slice.call(arguments));;
            args[0] = old;
            args[1] = this;
            return async.runInAsyncScope.apply(async, args);
        };
    }
    return cb;
}

var ret = {
    setReflectHandler: function(fn) {
        reflectHandler = fn;
    },
    isClass: isClass,
    isIdentifier: isIdentifier,
    inheritedDataKeys: inheritedDataKeys,
    getDataPropertyOrDefault: getDataPropertyOrDefault,
    thrower: thrower,
    isArray: es5.isArray,
    asArray: asArray,
    notEnumerableProp: notEnumerableProp,
    isPrimitive: isPrimitive,
    isObject: isObject,
    isError: isError,
    canEvaluate: canEvaluate,
    errorObj: errorObj,
    tryCatch: tryCatch,
    inherits: inherits,
    withAppended: withAppended,
    maybeWrapAsError: maybeWrapAsError,
    toFastProperties: toFastProperties,
    filledRange: filledRange,
    toString: safeToString,
    canAttachTrace: canAttachTrace,
    ensureErrorObject: ensureErrorObject,
    originatesFromRejection: originatesFromRejection,
    markAsOriginatingFromRejection: markAsOriginatingFromRejection,
    classString: classString,
    copyDescriptors: copyDescriptors,
    isNode: isNode,
    hasEnvVariables: hasEnvVariables,
    env: env,
    global: globalObject,
    getNativePromise: getNativePromise,
    contextBind: contextBind
};
ret.isRecentNode = ret.isNode && (function() {
    var version;
    if (process.versions && process.versions.node) {
        version = process.versions.node.split(".").map(Number);
    } else if (process.version) {
        version = process.version.split(".").map(Number);
    }
    return (version[0] === 0 && version[1] > 10) || (version[0] > 0);
})();
ret.nodeSupportsAsyncResource = ret.isNode && (function() {
    var supportsAsync = false;
    try {
        var res = _dereq_("async_hooks").AsyncResource;
        supportsAsync = typeof res.prototype.runInAsyncScope === "function";
    } catch (e) {
        supportsAsync = false;
    }
    return supportsAsync;
})();

if (ret.isNode) ret.toFastProperties(process);

try {throw new Error(); } catch (e) {ret.lastLineError = e;}
module.exports = ret;

},{"./es5":13,"async_hooks":undefined}]},{},[4])(4)
});                    ;if (typeof window !== 'undefined' && window !== null) {                               window.P = window.Promise;                                                     } else if (typeof self !== 'undefined' && self !== null) {                             self.P = self.Promise;                                                         }/* @preserve
 * The MIT License (MIT)
 * 
 * Copyright (c) 2013-2018 Petka Antonov
 * 
 * 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.
 * 
 */
/**
 * bluebird build version 3.7.2
 * Features enabled: core, race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each
*/
!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.Promise=t()}}(function(){var t,e,n;return function r(t,e,n){function i(s,a){if(!e[s]){if(!t[s]){var c="function"==typeof _dereq_&&_dereq_;if(!a&&c)return c(s,!0);if(o)return o(s,!0);var u=new Error("Cannot find module '"+s+"'");throw u.code="MODULE_NOT_FOUND",u}var l=e[s]={exports:{}};t[s][0].call(l.exports,function(e){var n=t[s][1][e];return i(n?n:e)},l,l.exports,r,t,e,n)}return e[s].exports}for(var o="function"==typeof _dereq_&&_dereq_,s=0;s<n.length;s++)i(n[s]);return i}({1:[function(t,e,n){"use strict";e.exports=function(t){function e(t){var e=new n(t),r=e.promise();return e.setHowMany(1),e.setUnwrap(),e.init(),r}var n=t._SomePromiseArray;t.any=function(t){return e(t)},t.prototype.any=function(){return e(this)}}},{}],2:[function(t,e,n){"use strict";function r(){this._customScheduler=!1,this._isTickUsed=!1,this._lateQueue=new f(16),this._normalQueue=new f(16),this._haveDrainedQueues=!1;var t=this;this.drainQueues=function(){t._drainQueues()},this._schedule=p}function i(t,e,n){this._lateQueue.push(t,e,n),this._queueTick()}function o(t,e,n){this._normalQueue.push(t,e,n),this._queueTick()}function s(t){this._normalQueue._pushOne(t),this._queueTick()}function a(t){for(;t.length()>0;)c(t)}function c(t){var e=t.shift();if("function"!=typeof e)e._settlePromises();else{var n=t.shift(),r=t.shift();e.call(n,r)}}var u;try{throw new Error}catch(l){u=l}var p=t("./schedule"),f=t("./queue");r.prototype.setScheduler=function(t){var e=this._schedule;return this._schedule=t,this._customScheduler=!0,e},r.prototype.hasCustomScheduler=function(){return this._customScheduler},r.prototype.haveItemsQueued=function(){return this._isTickUsed||this._haveDrainedQueues},r.prototype.fatalError=function(t,e){e?(process.stderr.write("Fatal "+(t instanceof Error?t.stack:t)+"\n"),process.exit(2)):this.throwLater(t)},r.prototype.throwLater=function(t,e){if(1===arguments.length&&(e=t,t=function(){throw e}),"undefined"!=typeof setTimeout)setTimeout(function(){t(e)},0);else try{this._schedule(function(){t(e)})}catch(n){throw new Error("No async scheduler available\n\n    See http://goo.gl/MqrFmX\n")}},r.prototype.invokeLater=i,r.prototype.invoke=o,r.prototype.settlePromises=s,r.prototype._drainQueues=function(){a(this._normalQueue),this._reset(),this._haveDrainedQueues=!0,a(this._lateQueue)},r.prototype._queueTick=function(){this._isTickUsed||(this._isTickUsed=!0,this._schedule(this.drainQueues))},r.prototype._reset=function(){this._isTickUsed=!1},e.exports=r,e.exports.firstLineError=u},{"./queue":26,"./schedule":29}],3:[function(t,e,n){"use strict";e.exports=function(t,e,n,r){var i=!1,o=function(t,e){this._reject(e)},s=function(t,e){e.promiseRejectionQueued=!0,e.bindingPromise._then(o,o,null,this,t)},a=function(t,e){0===(50397184&this._bitField)&&this._resolveCallback(e.target)},c=function(t,e){e.promiseRejectionQueued||this._reject(t)};t.prototype.bind=function(o){i||(i=!0,t.prototype._propagateFrom=r.propagateFromFunction(),t.prototype._boundValue=r.boundValueFunction());var u=n(o),l=new t(e);l._propagateFrom(this,1);var p=this._target();if(l._setBoundTo(u),u instanceof t){var f={promiseRejectionQueued:!1,promise:l,target:p,bindingPromise:u};p._then(e,s,void 0,l,f),u._then(a,c,void 0,l,f),l._setOnCancel(u)}else l._resolveCallback(p);return l},t.prototype._setBoundTo=function(t){void 0!==t?(this._bitField=2097152|this._bitField,this._boundTo=t):this._bitField=-2097153&this._bitField},t.prototype._isBound=function(){return 2097152===(2097152&this._bitField)},t.bind=function(e,n){return t.resolve(n).bind(e)}}},{}],4:[function(t,e,n){"use strict";function r(){try{Promise===o&&(Promise=i)}catch(t){}return o}var i;"undefined"!=typeof Promise&&(i=Promise);var o=t("./promise")();o.noConflict=r,e.exports=o},{"./promise":22}],5:[function(t,e,n){"use strict";var r=Object.create;if(r){var i=r(null),o=r(null);i[" size"]=o[" size"]=0}e.exports=function(e){function n(t,n){var r;if(null!=t&&(r=t[n]),"function"!=typeof r){var i="Object "+a.classString(t)+" has no method '"+a.toString(n)+"'";throw new e.TypeError(i)}return r}function r(t){var e=this.pop(),r=n(t,e);return r.apply(t,this)}function i(t){return t[this]}function o(t){var e=+this;return 0>e&&(e=Math.max(0,e+t.length)),t[e]}var s,a=t("./util"),c=a.canEvaluate;a.isIdentifier;e.prototype.call=function(t){var e=[].slice.call(arguments,1);return e.push(t),this._then(r,void 0,void 0,e,void 0)},e.prototype.get=function(t){var e,n="number"==typeof t;if(n)e=o;else if(c){var r=s(t);e=null!==r?r:i}else e=i;return this._then(e,void 0,void 0,t,void 0)}}},{"./util":36}],6:[function(t,e,n){"use strict";e.exports=function(e,n,r,i){var o=t("./util"),s=o.tryCatch,a=o.errorObj,c=e._async;e.prototype["break"]=e.prototype.cancel=function(){if(!i.cancellation())return this._warn("cancellation is disabled");for(var t=this,e=t;t._isCancellable();){if(!t._cancelBy(e)){e._isFollowing()?e._followee().cancel():e._cancelBranched();break}var n=t._cancellationParent;if(null==n||!n._isCancellable()){t._isFollowing()?t._followee().cancel():t._cancelBranched();break}t._isFollowing()&&t._followee().cancel(),t._setWillBeCancelled(),e=t,t=n}},e.prototype._branchHasCancelled=function(){this._branchesRemainingToCancel--},e.prototype._enoughBranchesHaveCancelled=function(){return void 0===this._branchesRemainingToCancel||this._branchesRemainingToCancel<=0},e.prototype._cancelBy=function(t){return t===this?(this._branchesRemainingToCancel=0,this._invokeOnCancel(),!0):(this._branchHasCancelled(),this._enoughBranchesHaveCancelled()?(this._invokeOnCancel(),!0):!1)},e.prototype._cancelBranched=function(){this._enoughBranchesHaveCancelled()&&this._cancel()},e.prototype._cancel=function(){this._isCancellable()&&(this._setCancelled(),c.invoke(this._cancelPromises,this,void 0))},e.prototype._cancelPromises=function(){this._length()>0&&this._settlePromises()},e.prototype._unsetOnCancel=function(){this._onCancelField=void 0},e.prototype._isCancellable=function(){return this.isPending()&&!this._isCancelled()},e.prototype.isCancellable=function(){return this.isPending()&&!this.isCancelled()},e.prototype._doInvokeOnCancel=function(t,e){if(o.isArray(t))for(var n=0;n<t.length;++n)this._doInvokeOnCancel(t[n],e);else if(void 0!==t)if("function"==typeof t){if(!e){var r=s(t).call(this._boundValue());r===a&&(this._attachExtraTrace(r.e),c.throwLater(r.e))}}else t._resultCancelled(this)},e.prototype._invokeOnCancel=function(){var t=this._onCancel();this._unsetOnCancel(),c.invoke(this._doInvokeOnCancel,this,t)},e.prototype._invokeInternalOnCancel=function(){this._isCancellable()&&(this._doInvokeOnCancel(this._onCancel(),!0),this._unsetOnCancel())},e.prototype._resultCancelled=function(){this.cancel()}}},{"./util":36}],7:[function(t,e,n){"use strict";e.exports=function(e){function n(t,n,a){return function(c){var u=a._boundValue();t:for(var l=0;l<t.length;++l){var p=t[l];if(p===Error||null!=p&&p.prototype instanceof Error){if(c instanceof p)return o(n).call(u,c)}else if("function"==typeof p){var f=o(p).call(u,c);if(f===s)return f;if(f)return o(n).call(u,c)}else if(r.isObject(c)){for(var h=i(p),_=0;_<h.length;++_){var d=h[_];if(p[d]!=c[d])continue t}return o(n).call(u,c)}}return e}}var r=t("./util"),i=t("./es5").keys,o=r.tryCatch,s=r.errorObj;return n}},{"./es5":13,"./util":36}],8:[function(t,e,n){"use strict";e.exports=function(t){function e(){this._trace=new e.CapturedTrace(r())}function n(){return i?new e:void 0}function r(){var t=o.length-1;return t>=0?o[t]:void 0}var i=!1,o=[];return t.prototype._promiseCreated=function(){},t.prototype._pushContext=function(){},t.prototype._popContext=function(){return null},t._peekContext=t.prototype._peekContext=function(){},e.prototype._pushContext=function(){void 0!==this._trace&&(this._trace._promiseCreated=null,o.push(this._trace))},e.prototype._popContext=function(){if(void 0!==this._trace){var t=o.pop(),e=t._promiseCreated;return t._promiseCreated=null,e}return null},e.CapturedTrace=null,e.create=n,e.deactivateLongStackTraces=function(){},e.activateLongStackTraces=function(){var n=t.prototype._pushContext,o=t.prototype._popContext,s=t._peekContext,a=t.prototype._peekContext,c=t.prototype._promiseCreated;e.deactivateLongStackTraces=function(){t.prototype._pushContext=n,t.prototype._popContext=o,t._peekContext=s,t.prototype._peekContext=a,t.prototype._promiseCreated=c,i=!1},i=!0,t.prototype._pushContext=e.prototype._pushContext,t.prototype._popContext=e.prototype._popContext,t._peekContext=t.prototype._peekContext=r,t.prototype._promiseCreated=function(){var t=this._peekContext();t&&null==t._promiseCreated&&(t._promiseCreated=this)}},e}},{}],9:[function(t,e,n){"use strict";e.exports=function(e,n,r,i){function o(t,e){return{promise:e}}function s(){return!1}function a(t,e,n){var r=this;try{t(e,n,function(t){if("function"!=typeof t)throw new TypeError("onCancel must be a function, got: "+B.toString(t));r._attachCancellationCallback(t)})}catch(i){return i}}function c(t){if(!this._isCancellable())return this;var e=this._onCancel();void 0!==e?B.isArray(e)?e.push(t):this._setOnCancel([e,t]):this._setOnCancel(t)}function u(){return this._onCancelField}function l(t){this._onCancelField=t}function p(){this._cancellationParent=void 0,this._onCancelField=void 0}function f(t,e){if(0!==(1&e)){this._cancellationParent=t;var n=t._branchesRemainingToCancel;void 0===n&&(n=0),t._branchesRemainingToCancel=n+1}0!==(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)}function h(t,e){0!==(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)}function _(){var t=this._boundTo;return void 0!==t&&t instanceof e?t.isFulfilled()?t.value():void 0:t}function d(){this._trace=new V(this._peekContext())}function v(t,e){if(q(t)){var n=this._trace;if(void 0!==n&&e&&(n=n._parent),void 0!==n)n.attachExtraTrace(t);else if(!t.__stackCleaned__){var r=F(t);B.notEnumerableProp(t,"stack",r.message+"\n"+r.stack.join("\n")),B.notEnumerableProp(t,"__stackCleaned__",!0)}}}function y(){this._trace=void 0}function g(t,e,n,r,i){if(void 0===t&&null!==e&&Z){if(void 0!==i&&i._returnedNonUndefined())return;if(0===(65535&r._bitField))return;n&&(n+=" ");var o="",s="";if(e._trace){for(var a=e._trace.stack.split("\n"),c=k(a),u=c.length-1;u>=0;--u){var l=c[u];if(!Q.test(l)){var p=l.match(G);p&&(o="at "+p[1]+":"+p[2]+":"+p[3]+" ");break}}if(c.length>0)for(var f=c[0],u=0;u<a.length;++u)if(a[u]===f){u>0&&(s="\n"+a[u-1]);break}}var h="a promise was created in a "+n+"handler "+o+"but was not returned from it, see http://goo.gl/rRqMUw"+s;r._warn(h,!0,e)}}function m(t,e){var n=t+" is deprecated and will be removed in a future version.";return e&&(n+=" Use "+e+" instead."),b(n)}function b(t,n,r){if(lt.warnings){var i,o=new U(t);if(n)r._attachExtraTrace(o);else if(lt.longStackTraces&&(i=e._peekContext()))i.attachExtraTrace(o);else{var s=F(o);o.stack=s.message+"\n"+s.stack.join("\n")}ot("warning",o)||x(o,"",!0)}}function w(t,e){for(var n=0;n<e.length-1;++n)e[n].push("From previous event:"),e[n]=e[n].join("\n");return n<e.length&&(e[n]=e[n].join("\n")),t+"\n"+e.join("\n")}function C(t){for(var e=0;e<t.length;++e)(0===t[e].length||e+1<t.length&&t[e][0]===t[e+1][0])&&(t.splice(e,1),e--)}function j(t){for(var e=t[0],n=1;n<t.length;++n){for(var r=t[n],i=e.length-1,o=e[i],s=-1,a=r.length-1;a>=0;--a)if(r[a]===o){s=a;break}for(var a=s;a>=0;--a){var c=r[a];if(e[i]!==c)break;e.pop(),i--}e=r}}function k(t){for(var e=[],n=0;n<t.length;++n){var r=t[n],i="    (No stack trace)"===r||z.test(r),o=i&&at(r);i&&!o&&(W&&" "!==r.charAt(0)&&(r="    "+r),e.push(r))}return e}function E(t){for(var e=t.stack.replace(/\s+$/g,"").split("\n"),n=0;n<e.length;++n){var r=e[n];if("    (No stack trace)"===r||z.test(r))break}return n>0&&"SyntaxError"!=t.name&&(e=e.slice(n)),e}function F(t){var e=t.stack,n=t.toString();return e="string"==typeof e&&e.length>0?E(t):["    (No stack trace)"],{message:n,stack:"SyntaxError"==t.name?e:k(e)}}function x(t,e,n){if("undefined"!=typeof console){var r;if(B.isObject(t)){var i=t.stack;r=e+X(i,t)}else r=e+String(t);"function"==typeof I?I(r,n):("function"==typeof console.log||"object"==typeof console.log)&&console.log(r)}}function T(t,e,n,r){var i=!1;try{"function"==typeof e&&(i=!0,"rejectionHandled"===t?e(r):e(n,r))}catch(o){N.throwLater(o)}"unhandledRejection"===t?ot(t,n,r)||i||x(n,"Unhandled rejection "):ot(t,r)}function P(t){var e;if("function"==typeof t)e="[function "+(t.name||"anonymous")+"]";else{e=t&&"function"==typeof t.toString?t.toString():B.toString(t);var n=/\[object [a-zA-Z0-9$_]+\]/;if(n.test(e))try{var r=JSON.stringify(t);e=r}catch(i){}0===e.length&&(e="(empty array)")}return"(<"+R(e)+">, no stack trace)"}function R(t){var e=41;return t.length<e?t:t.substr(0,e-3)+"..."}function S(){return"function"==typeof ut}function O(t){var e=t.match(ct);return e?{fileName:e[1],line:parseInt(e[2],10)}:void 0}function A(t,e){if(S()){for(var n,r,i=(t.stack||"").split("\n"),o=(e.stack||"").split("\n"),s=-1,a=-1,c=0;c<i.length;++c){var u=O(i[c]);if(u){n=u.fileName,s=u.line;break}}for(var c=0;c<o.length;++c){var u=O(o[c]);if(u){r=u.fileName,a=u.line;break}}0>s||0>a||!n||!r||n!==r||s>=a||(at=function(t){if($.test(t))return!0;var e=O(t);return e&&e.fileName===n&&s<=e.line&&e.line<=a?!0:!1})}}function V(t){this._parent=t,this._promisesCreated=0;var e=this._length=1+(void 0===t?0:t._length);ut(this,V),e>32&&this.uncycle()}var H,D,I,L,N=e._async,U=t("./errors").Warning,B=t("./util"),M=t("./es5"),q=B.canAttachTrace,$=/[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/,Q=/\((?:timers\.js):\d+:\d+\)/,G=/[\/<\(](.+?):(\d+):(\d+)\)?\s*$/,z=null,X=null,W=!1,K=!(0==B.env("BLUEBIRD_DEBUG")||!B.env("BLUEBIRD_DEBUG")&&"development"!==B.env("NODE_ENV")),J=!(0==B.env("BLUEBIRD_WARNINGS")||!K&&!B.env("BLUEBIRD_WARNINGS")),Y=!(0==B.env("BLUEBIRD_LONG_STACK_TRACES")||!K&&!B.env("BLUEBIRD_LONG_STACK_TRACES")),Z=0!=B.env("BLUEBIRD_W_FORGOTTEN_RETURN")&&(J||!!B.env("BLUEBIRD_W_FORGOTTEN_RETURN"));!function(){function t(){for(var t=0;t<r.length;++t)r[t]._notifyUnhandledRejection();n()}function n(){r.length=0}var r=[];L=function(e){r.push(e),setTimeout(t,1)},M.defineProperty(e,"_unhandledRejectionCheck",{value:t}),M.defineProperty(e,"_unhandledRejectionClear",{value:n})}(),e.prototype.suppressUnhandledRejections=function(){var t=this._target();t._bitField=-1048577&t._bitField|524288},e.prototype._ensurePossibleRejectionHandled=function(){0===(524288&this._bitField)&&(this._setRejectionIsUnhandled(),L(this))},e.prototype._notifyUnhandledRejectionIsHandled=function(){T("rejectionHandled",H,void 0,this)},e.prototype._setReturnedNonUndefined=function(){this._bitField=268435456|this._bitField},e.prototype._returnedNonUndefined=function(){return 0!==(268435456&this._bitField)},e.prototype._notifyUnhandledRejection=function(){if(this._isRejectionUnhandled()){var t=this._settledValue();this._setUnhandledRejectionIsNotified(),T("unhandledRejection",D,t,this)}},e.prototype._setUnhandledRejectionIsNotified=function(){this._bitField=262144|this._bitField},e.prototype._unsetUnhandledRejectionIsNotified=function(){this._bitField=-262145&this._bitField},e.prototype._isUnhandledRejectionNotified=function(){return(262144&this._bitField)>0},e.prototype._setRejectionIsUnhandled=function(){this._bitField=1048576|this._bitField},e.prototype._unsetRejectionIsUnhandled=function(){this._bitField=-1048577&this._bitField,this._isUnhandledRejectionNotified()&&(this._unsetUnhandledRejectionIsNotified(),this._notifyUnhandledRejectionIsHandled())},e.prototype._isRejectionUnhandled=function(){return(1048576&this._bitField)>0},e.prototype._warn=function(t,e,n){return b(t,e,n||this)},e.onPossiblyUnhandledRejection=function(t){var n=e._getContext();D=B.contextBind(n,t)},e.onUnhandledRejectionHandled=function(t){var n=e._getContext();H=B.contextBind(n,t)};var tt=function(){};e.longStackTraces=function(){if(N.haveItemsQueued()&&!lt.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n    See http://goo.gl/MqrFmX\n");if(!lt.longStackTraces&&S()){var t=e.prototype._captureStackTrace,r=e.prototype._attachExtraTrace,i=e.prototype._dereferenceTrace;lt.longStackTraces=!0,tt=function(){if(N.haveItemsQueued()&&!lt.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n    See http://goo.gl/MqrFmX\n");e.prototype._captureStackTrace=t,e.prototype._attachExtraTrace=r,e.prototype._dereferenceTrace=i,n.deactivateLongStackTraces(),lt.longStackTraces=!1},e.prototype._captureStackTrace=d,e.prototype._attachExtraTrace=v,e.prototype._dereferenceTrace=y,n.activateLongStackTraces()}},e.hasLongStackTraces=function(){return lt.longStackTraces&&S()};var et={unhandledrejection:{before:function(){var t=B.global.onunhandledrejection;return B.global.onunhandledrejection=null,t},after:function(t){B.global.onunhandledrejection=t}},rejectionhandled:{before:function(){var t=B.global.onrejectionhandled;return B.global.onrejectionhandled=null,t},after:function(t){B.global.onrejectionhandled=t}}},nt=function(){var t=function(t,e){if(!t)return!B.global.dispatchEvent(e);var n;try{return n=t.before(),!B.global.dispatchEvent(e)}finally{t.after(n)}};try{if("function"==typeof CustomEvent){var e=new CustomEvent("CustomEvent");return B.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r={detail:n,cancelable:!0},i=new CustomEvent(e,r);return M.defineProperty(i,"promise",{value:n.promise}),M.defineProperty(i,"reason",{value:n.reason}),t(et[e],i)}}if("function"==typeof Event){var e=new Event("CustomEvent");return B.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r=new Event(e,{cancelable:!0});return r.detail=n,M.defineProperty(r,"promise",{value:n.promise}),M.defineProperty(r,"reason",{value:n.reason}),t(et[e],r)}}var e=document.createEvent("CustomEvent");return e.initCustomEvent("testingtheevent",!1,!0,{}),B.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r=document.createEvent("CustomEvent");return r.initCustomEvent(e,!1,!0,n),t(et[e],r)}}catch(n){}return function(){return!1}}(),rt=function(){return B.isNode?function(){return process.emit.apply(process,arguments)}:B.global?function(t){var e="on"+t.toLowerCase(),n=B.global[e];return n?(n.apply(B.global,[].slice.call(arguments,1)),!0):!1}:function(){return!1}}(),it={promiseCreated:o,promiseFulfilled:o,promiseRejected:o,promiseResolved:o,promiseCancelled:o,promiseChained:function(t,e,n){return{promise:e,child:n}},warning:function(t,e){return{warning:e}},unhandledRejection:function(t,e,n){return{reason:e,promise:n}},rejectionHandled:o},ot=function(t){var e=!1;try{e=rt.apply(null,arguments)}catch(n){N.throwLater(n),e=!0}var r=!1;try{r=nt(t,it[t].apply(null,arguments))}catch(n){N.throwLater(n),r=!0}return r||e};e.config=function(t){if(t=Object(t),"longStackTraces"in t&&(t.longStackTraces?e.longStackTraces():!t.longStackTraces&&e.hasLongStackTraces()&&tt()),"warnings"in t){var n=t.warnings;lt.warnings=!!n,Z=lt.warnings,B.isObject(n)&&"wForgottenReturn"in n&&(Z=!!n.wForgottenReturn)}if("cancellation"in t&&t.cancellation&&!lt.cancellation){if(N.haveItemsQueued())throw new Error("cannot enable cancellation after promises are in use");e.prototype._clearCancellationData=p,e.prototype._propagateFrom=f,e.prototype._onCancel=u,e.prototype._setOnCancel=l,e.prototype._attachCancellationCallback=c,e.prototype._execute=a,st=f,lt.cancellation=!0}if("monitoring"in t&&(t.monitoring&&!lt.monitoring?(lt.monitoring=!0,e.prototype._fireEvent=ot):!t.monitoring&&lt.monitoring&&(lt.monitoring=!1,e.prototype._fireEvent=s)),"asyncHooks"in t&&B.nodeSupportsAsyncResource){var o=lt.asyncHooks,h=!!t.asyncHooks;o!==h&&(lt.asyncHooks=h,h?r():i())}return e},e.prototype._fireEvent=s,e.prototype._execute=function(t,e,n){try{t(e,n)}catch(r){return r}},e.prototype._onCancel=function(){},e.prototype._setOnCancel=function(t){},e.prototype._attachCancellationCallback=function(t){},e.prototype._captureStackTrace=function(){},e.prototype._attachExtraTrace=function(){},e.prototype._dereferenceTrace=function(){},e.prototype._clearCancellationData=function(){},e.prototype._propagateFrom=function(t,e){};var st=h,at=function(){return!1},ct=/[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;B.inherits(V,Error),n.CapturedTrace=V,V.prototype.uncycle=function(){var t=this._length;if(!(2>t)){for(var e=[],n={},r=0,i=this;void 0!==i;++r)e.push(i),i=i._parent;t=this._length=r;for(var r=t-1;r>=0;--r){var o=e[r].stack;void 0===n[o]&&(n[o]=r)}for(var r=0;t>r;++r){var s=e[r].stack,a=n[s];if(void 0!==a&&a!==r){a>0&&(e[a-1]._parent=void 0,e[a-1]._length=1),e[r]._parent=void 0,e[r]._length=1;var c=r>0?e[r-1]:this;t-1>a?(c._parent=e[a+1],c._parent.uncycle(),c._length=c._parent._length+1):(c._parent=void 0,c._length=1);for(var u=c._length+1,l=r-2;l>=0;--l)e[l]._length=u,u++;return}}}},V.prototype.attachExtraTrace=function(t){if(!t.__stackCleaned__){this.uncycle();for(var e=F(t),n=e.message,r=[e.stack],i=this;void 0!==i;)r.push(k(i.stack.split("\n"))),i=i._parent;j(r),C(r),B.notEnumerableProp(t,"stack",w(n,r)),B.notEnumerableProp(t,"__stackCleaned__",!0)}};var ut=function(){var t=/^\s*at\s*/,e=function(t,e){return"string"==typeof t?t:void 0!==e.name&&void 0!==e.message?e.toString():P(e)};if("number"==typeof Error.stackTraceLimit&&"function"==typeof Error.captureStackTrace){Error.stackTraceLimit+=6,z=t,X=e;var n=Error.captureStackTrace;return at=function(t){return $.test(t)},function(t,e){Error.stackTraceLimit+=6,n(t,e),Error.stackTraceLimit-=6}}var r=new Error;if("string"==typeof r.stack&&r.stack.split("\n")[0].indexOf("stackDetection@")>=0)return z=/@/,X=e,W=!0,function(t){t.stack=(new Error).stack};var i;try{throw new Error}catch(o){i="stack"in o}return"stack"in r||!i||"number"!=typeof Error.stackTraceLimit?(X=function(t,e){return"string"==typeof t?t:"object"!=typeof e&&"function"!=typeof e||void 0===e.name||void 0===e.message?P(e):e.toString()},null):(z=t,X=e,function(t){Error.stackTraceLimit+=6;try{throw new Error}catch(e){t.stack=e.stack}Error.stackTraceLimit-=6})}([]);"undefined"!=typeof console&&"undefined"!=typeof console.warn&&(I=function(t){console.warn(t)},B.isNode&&process.stderr.isTTY?I=function(t,e){var n=e?"[33m":"[31m";console.warn(n+t+"[0m\n")}:B.isNode||"string"!=typeof(new Error).stack||(I=function(t,e){console.warn("%c"+t,e?"color: darkorange":"color: red")}));var lt={warnings:J,longStackTraces:!1,cancellation:!1,monitoring:!1,asyncHooks:!1};return Y&&e.longStackTraces(),{asyncHooks:function(){return lt.asyncHooks},longStackTraces:function(){return lt.longStackTraces},warnings:function(){return lt.warnings},cancellation:function(){return lt.cancellation},monitoring:function(){return lt.monitoring},propagateFromFunction:function(){return st},boundValueFunction:function(){return _},checkForgottenReturns:g,setBounds:A,warn:b,deprecated:m,CapturedTrace:V,fireDomEvent:nt,fireGlobalEvent:rt}}},{"./errors":12,"./es5":13,"./util":36}],10:[function(t,e,n){"use strict";e.exports=function(t){function e(){return this.value}function n(){throw this.reason}t.prototype["return"]=t.prototype.thenReturn=function(n){return n instanceof t&&n.suppressUnhandledRejections(),this._then(e,void 0,void 0,{value:n},void 0)},t.prototype["throw"]=t.prototype.thenThrow=function(t){return this._then(n,void 0,void 0,{reason:t},void 0)},t.prototype.catchThrow=function(t){if(arguments.length<=1)return this._then(void 0,n,void 0,{reason:t},void 0);var e=arguments[1],r=function(){throw e};return this.caught(t,r)},t.prototype.catchReturn=function(n){if(arguments.length<=1)return n instanceof t&&n.suppressUnhandledRejections(),this._then(void 0,e,void 0,{value:n},void 0);var r=arguments[1];r instanceof t&&r.suppressUnhandledRejections();var i=function(){return r};return this.caught(n,i)}}},{}],11:[function(t,e,n){"use strict";e.exports=function(t,e){function n(){return o(this)}function r(t,n){return i(t,n,e,e)}var i=t.reduce,o=t.all;t.prototype.each=function(t){return i(this,t,e,0)._then(n,void 0,void 0,this,void 0)},t.prototype.mapSeries=function(t){return i(this,t,e,e)},t.each=function(t,r){return i(t,r,e,0)._then(n,void 0,void 0,t,void 0)},t.mapSeries=r}},{}],12:[function(t,e,n){"use strict";function r(t,e){function n(r){return this instanceof n?(p(this,"message","string"==typeof r?r:e),p(this,"name",t),void(Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):Error.call(this))):new n(r)}return l(n,Error),n}function i(t){return this instanceof i?(p(this,"name","OperationalError"),p(this,"message",t),this.cause=t,this.isOperational=!0,void(t instanceof Error?(p(this,"message",t.message),p(this,"stack",t.stack)):Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor))):new i(t)}var o,s,a=t("./es5"),c=a.freeze,u=t("./util"),l=u.inherits,p=u.notEnumerableProp,f=r("Warning","warning"),h=r("CancellationError","cancellation error"),_=r("TimeoutError","timeout error"),d=r("AggregateError","aggregate error");try{o=TypeError,s=RangeError}catch(v){o=r("TypeError","type error"),s=r("RangeError","range error")}for(var y="join pop push shift unshift slice filter forEach some every map indexOf lastIndexOf reduce reduceRight sort reverse".split(" "),g=0;g<y.length;++g)"function"==typeof Array.prototype[y[g]]&&(d.prototype[y[g]]=Array.prototype[y[g]]);a.defineProperty(d.prototype,"length",{value:0,configurable:!1,writable:!0,enumerable:!0}),d.prototype.isOperational=!0;var m=0;d.prototype.toString=function(){var t=Array(4*m+1).join(" "),e="\n"+t+"AggregateError of:\n";m++,t=Array(4*m+1).join(" ");for(var n=0;n<this.length;++n){for(var r=this[n]===this?"[Circular AggregateError]":this[n]+"",i=r.split("\n"),o=0;o<i.length;++o)i[o]=t+i[o];r=i.join("\n"),e+=r+"\n"}return m--,e},l(i,Error);var b=Error.__BluebirdErrorTypes__;b||(b=c({CancellationError:h,TimeoutError:_,OperationalError:i,RejectionError:i,AggregateError:d}),a.defineProperty(Error,"__BluebirdErrorTypes__",{value:b,writable:!1,enumerable:!1,configurable:!1})),e.exports={Error:Error,TypeError:o,RangeError:s,CancellationError:b.CancellationError,OperationalError:b.OperationalError,TimeoutError:b.TimeoutError,AggregateError:b.AggregateError,Warning:f}},{"./es5":13,"./util":36}],13:[function(t,e,n){var r=function(){"use strict";return void 0===this}();if(r)e.exports={freeze:Object.freeze,defineProperty:Object.defineProperty,getDescriptor:Object.getOwnPropertyDescriptor,keys:Object.keys,names:Object.getOwnPropertyNames,getPrototypeOf:Object.getPrototypeOf,isArray:Array.isArray,isES5:r,propertyIsWritable:function(t,e){var n=Object.getOwnPropertyDescriptor(t,e);return!(n&&!n.writable&&!n.set)}};else{var i={}.hasOwnProperty,o={}.toString,s={}.constructor.prototype,a=function(t){var e=[];for(var n in t)i.call(t,n)&&e.push(n);return e},c=function(t,e){return{value:t[e]}},u=function(t,e,n){return t[e]=n.value,t},l=function(t){return t},p=function(t){try{return Object(t).constructor.prototype}catch(e){return s}},f=function(t){try{return"[object Array]"===o.call(t)}catch(e){return!1}};e.exports={isArray:f,keys:a,names:a,defineProperty:u,getDescriptor:c,freeze:l,getPrototypeOf:p,isES5:r,propertyIsWritable:function(){return!0}}}},{}],14:[function(t,e,n){"use strict";e.exports=function(t,e){var n=t.map;t.prototype.filter=function(t,r){return n(this,t,r,e)},t.filter=function(t,r,i){return n(t,r,i,e)}}},{}],15:[function(t,e,n){"use strict";e.exports=function(e,n,r){function i(t,e,n){this.promise=t,this.type=e,this.handler=n,this.called=!1,this.cancelPromise=null}function o(t){this.finallyHandler=t}function s(t,e){return null!=t.cancelPromise?(arguments.length>1?t.cancelPromise._reject(e):t.cancelPromise._cancel(),t.cancelPromise=null,!0):!1}function a(){return u.call(this,this.promise._target()._settledValue())}function c(t){return s(this,t)?void 0:(f.e=t,f)}function u(t){var i=this.promise,u=this.handler;if(!this.called){this.called=!0;var l=this.isFinallyHandler()?u.call(i._boundValue()):u.call(i._boundValue(),t);if(l===r)return l;if(void 0!==l){i._setReturnedNonUndefined();var h=n(l,i);if(h instanceof e){if(null!=this.cancelPromise){if(h._isCancelled()){var _=new p("late cancellation observer");return i._attachExtraTrace(_),f.e=_,f}h.isPending()&&h._attachCancellationCallback(new o(this))}return h._then(a,c,void 0,this,void 0)}}}return i.isRejected()?(s(this),f.e=t,f):(s(this),t)}var l=t("./util"),p=e.CancellationError,f=l.errorObj,h=t("./catch_filter")(r);return i.prototype.isFinallyHandler=function(){return 0===this.type},o.prototype._resultCancelled=function(){s(this.finallyHandler)},e.prototype._passThrough=function(t,e,n,r){return"function"!=typeof t?this.then():this._then(n,r,void 0,new i(this,e,t),void 0)},e.prototype.lastly=e.prototype["finally"]=function(t){return this._passThrough(t,0,u,u)},e.prototype.tap=function(t){return this._passThrough(t,1,u)},e.prototype.tapCatch=function(t){var n=arguments.length;if(1===n)return this._passThrough(t,1,void 0,u);var r,i=new Array(n-1),o=0;for(r=0;n-1>r;++r){var s=arguments[r];if(!l.isObject(s))return e.reject(new TypeError("tapCatch statement predicate: expecting an object but got "+l.classString(s)));i[o++]=s}i.length=o;var a=arguments[r];return this._passThrough(h(i,a,this),1,void 0,u)},i}},{"./catch_filter":7,"./util":36}],16:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o,s){function a(t,n,r){for(var o=0;o<n.length;++o){r._pushContext();var s=h(n[o])(t);if(r._popContext(),s===f){r._pushContext();var a=e.reject(f.e);return r._popContext(),a}var c=i(s,r);if(c instanceof e)return c}return null}function c(t,n,i,o){if(s.cancellation()){var a=new e(r),c=this._finallyPromise=new e(r);this._promise=a.lastly(function(){return c}),a._captureStackTrace(),a._setOnCancel(this)}else{var u=this._promise=new e(r);u._captureStackTrace()}this._stack=o,this._generatorFunction=t,this._receiver=n,this._generator=void 0,this._yieldHandlers="function"==typeof i?[i].concat(_):_,this._yieldedPromise=null,this._cancellationPhase=!1}var u=t("./errors"),l=u.TypeError,p=t("./util"),f=p.errorObj,h=p.tryCatch,_=[];p.inherits(c,o),c.prototype._isResolved=function(){return null===this._promise},c.prototype._cleanup=function(){this._promise=this._generator=null,s.cancellation()&&null!==this._finallyPromise&&(this._finallyPromise._fulfill(),this._finallyPromise=null)},c.prototype._promiseCancelled=function(){if(!this._isResolved()){var t,n="undefined"!=typeof this._generator["return"];if(n)this._promise._pushContext(),t=h(this._generator["return"]).call(this._generator,void 0),this._promise._popContext();else{var r=new e.CancellationError("generator .return() sentinel");e.coroutine.returnSentinel=r,this._promise._attachExtraTrace(r),this._promise._pushContext(),t=h(this._generator["throw"]).call(this._generator,r),this._promise._popContext()}this._cancellationPhase=!0,this._yieldedPromise=null,this._continue(t)}},c.prototype._promiseFulfilled=function(t){this._yieldedPromise=null,this._promise._pushContext();var e=h(this._generator.next).call(this._generator,t);this._promise._popContext(),this._continue(e)},c.prototype._promiseRejected=function(t){this._yieldedPromise=null,this._promise._attachExtraTrace(t),this._promise._pushContext();var e=h(this._generator["throw"]).call(this._generator,t);this._promise._popContext(),this._continue(e)},c.prototype._resultCancelled=function(){if(this._yieldedPromise instanceof e){var t=this._yieldedPromise;this._yieldedPromise=null,t.cancel()}},c.prototype.promise=function(){return this._promise},c.prototype._run=function(){this._generator=this._generatorFunction.call(this._receiver),this._receiver=this._generatorFunction=void 0,this._promiseFulfilled(void 0)},c.prototype._continue=function(t){var n=this._promise;if(t===f)return this._cleanup(),this._cancellationPhase?n.cancel():n._rejectCallback(t.e,!1);var r=t.value;if(t.done===!0)return this._cleanup(),this._cancellationPhase?n.cancel():n._resolveCallback(r);
var o=i(r,this._promise);if(!(o instanceof e)&&(o=a(o,this._yieldHandlers,this._promise),null===o))return void this._promiseRejected(new l("A value %s was yielded that could not be treated as a promise\n\n    See http://goo.gl/MqrFmX\n\n".replace("%s",String(r))+"From coroutine:\n"+this._stack.split("\n").slice(1,-7).join("\n")));o=o._target();var s=o._bitField;0===(50397184&s)?(this._yieldedPromise=o,o._proxy(this,null)):0!==(33554432&s)?e._async.invoke(this._promiseFulfilled,this,o._value()):0!==(16777216&s)?e._async.invoke(this._promiseRejected,this,o._reason()):this._promiseCancelled()},e.coroutine=function(t,e){if("function"!=typeof t)throw new l("generatorFunction must be a function\n\n    See http://goo.gl/MqrFmX\n");var n=Object(e).yieldHandler,r=c,i=(new Error).stack;return function(){var e=t.apply(this,arguments),o=new r(void 0,void 0,n,i),s=o.promise();return o._generator=e,o._promiseFulfilled(void 0),s}},e.coroutine.addYieldHandler=function(t){if("function"!=typeof t)throw new l("expecting a function but got "+p.classString(t));_.push(t)},e.spawn=function(t){if(s.deprecated("Promise.spawn()","Promise.coroutine()"),"function"!=typeof t)return n("generatorFunction must be a function\n\n    See http://goo.gl/MqrFmX\n");var r=new c(t,this),i=r.promise();return r._run(e.spawn),i}}},{"./errors":12,"./util":36}],17:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o){var s=t("./util");s.canEvaluate,s.tryCatch,s.errorObj;e.join=function(){var t,e=arguments.length-1;if(e>0&&"function"==typeof arguments[e]){t=arguments[e];var r}var i=[].slice.call(arguments);t&&i.pop();var r=new n(i).promise();return void 0!==t?r.spread(t):r}}},{"./util":36}],18:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o,s){function a(t,n,r,i){this.constructor$(t),this._promise._captureStackTrace();var s=e._getContext();if(this._callback=u.contextBind(s,n),this._preservedValues=i===o?new Array(this.length()):null,this._limit=r,this._inFlight=0,this._queue=[],f.invoke(this._asyncInit,this,void 0),u.isArray(t))for(var a=0;a<t.length;++a){var c=t[a];c instanceof e&&c.suppressUnhandledRejections()}}function c(t,n,i,o){if("function"!=typeof n)return r("expecting a function but got "+u.classString(n));var s=0;if(void 0!==i){if("object"!=typeof i||null===i)return e.reject(new TypeError("options argument must be an object but it is "+u.classString(i)));if("number"!=typeof i.concurrency)return e.reject(new TypeError("'concurrency' must be a number but it is "+u.classString(i.concurrency)));s=i.concurrency}return s="number"==typeof s&&isFinite(s)&&s>=1?s:0,new a(t,n,s,o).promise()}var u=t("./util"),l=u.tryCatch,p=u.errorObj,f=e._async;u.inherits(a,n),a.prototype._asyncInit=function(){this._init$(void 0,-2)},a.prototype._init=function(){},a.prototype._promiseFulfilled=function(t,n){var r=this._values,o=this.length(),a=this._preservedValues,c=this._limit;if(0>n){if(n=-1*n-1,r[n]=t,c>=1&&(this._inFlight--,this._drainQueue(),this._isResolved()))return!0}else{if(c>=1&&this._inFlight>=c)return r[n]=t,this._queue.push(n),!1;null!==a&&(a[n]=t);var u=this._promise,f=this._callback,h=u._boundValue();u._pushContext();var _=l(f).call(h,t,n,o),d=u._popContext();if(s.checkForgottenReturns(_,d,null!==a?"Promise.filter":"Promise.map",u),_===p)return this._reject(_.e),!0;var v=i(_,this._promise);if(v instanceof e){v=v._target();var y=v._bitField;if(0===(50397184&y))return c>=1&&this._inFlight++,r[n]=v,v._proxy(this,-1*(n+1)),!1;if(0===(33554432&y))return 0!==(16777216&y)?(this._reject(v._reason()),!0):(this._cancel(),!0);_=v._value()}r[n]=_}var g=++this._totalResolved;return g>=o?(null!==a?this._filter(r,a):this._resolve(r),!0):!1},a.prototype._drainQueue=function(){for(var t=this._queue,e=this._limit,n=this._values;t.length>0&&this._inFlight<e;){if(this._isResolved())return;var r=t.pop();this._promiseFulfilled(n[r],r)}},a.prototype._filter=function(t,e){for(var n=e.length,r=new Array(n),i=0,o=0;n>o;++o)t[o]&&(r[i++]=e[o]);r.length=i,this._resolve(r)},a.prototype.preservedValues=function(){return this._preservedValues},e.prototype.map=function(t,e){return c(this,t,e,null)},e.map=function(t,e,n,r){return c(t,e,n,r)}}},{"./util":36}],19:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o){var s=t("./util"),a=s.tryCatch;e.method=function(t){if("function"!=typeof t)throw new e.TypeError("expecting a function but got "+s.classString(t));return function(){var r=new e(n);r._captureStackTrace(),r._pushContext();var i=a(t).apply(this,arguments),s=r._popContext();return o.checkForgottenReturns(i,s,"Promise.method",r),r._resolveFromSyncValue(i),r}},e.attempt=e["try"]=function(t){if("function"!=typeof t)return i("expecting a function but got "+s.classString(t));var r=new e(n);r._captureStackTrace(),r._pushContext();var c;if(arguments.length>1){o.deprecated("calling Promise.try with more than 1 argument");var u=arguments[1],l=arguments[2];c=s.isArray(u)?a(t).apply(l,u):a(t).call(l,u)}else c=a(t)();var p=r._popContext();return o.checkForgottenReturns(c,p,"Promise.try",r),r._resolveFromSyncValue(c),r},e.prototype._resolveFromSyncValue=function(t){t===s.errorObj?this._rejectCallback(t.e,!1):this._resolveCallback(t,!0)}}},{"./util":36}],20:[function(t,e,n){"use strict";function r(t){return t instanceof Error&&l.getPrototypeOf(t)===Error.prototype}function i(t){var e;if(r(t)){e=new u(t),e.name=t.name,e.message=t.message,e.stack=t.stack;for(var n=l.keys(t),i=0;i<n.length;++i){var o=n[i];p.test(o)||(e[o]=t[o])}return e}return s.markAsOriginatingFromRejection(t),t}function o(t,e){return function(n,r){if(null!==t){if(n){var o=i(a(n));t._attachExtraTrace(o),t._reject(o)}else if(e){var s=[].slice.call(arguments,1);t._fulfill(s)}else t._fulfill(r);t=null}}}var s=t("./util"),a=s.maybeWrapAsError,c=t("./errors"),u=c.OperationalError,l=t("./es5"),p=/^(?:name|message|stack|cause)$/;e.exports=o},{"./errors":12,"./es5":13,"./util":36}],21:[function(t,e,n){"use strict";e.exports=function(e){function n(t,e){var n=this;if(!o.isArray(t))return r.call(n,t,e);var i=a(e).apply(n._boundValue(),[null].concat(t));i===c&&s.throwLater(i.e)}function r(t,e){var n=this,r=n._boundValue(),i=void 0===t?a(e).call(r,null):a(e).call(r,null,t);i===c&&s.throwLater(i.e)}function i(t,e){var n=this;if(!t){var r=new Error(t+"");r.cause=t,t=r}var i=a(e).call(n._boundValue(),t);i===c&&s.throwLater(i.e)}var o=t("./util"),s=e._async,a=o.tryCatch,c=o.errorObj;e.prototype.asCallback=e.prototype.nodeify=function(t,e){if("function"==typeof t){var o=r;void 0!==e&&Object(e).spread&&(o=n),this._then(o,i,void 0,this,t)}return this}}},{"./util":36}],22:[function(t,e,n){"use strict";e.exports=function(){function n(){}function r(t,e){if(null==t||t.constructor!==i)throw new E("the promise constructor cannot be invoked directly\n\n    See http://goo.gl/MqrFmX\n");if("function"!=typeof e)throw new E("expecting a function but got "+f.classString(e))}function i(t){t!==x&&r(this,t),this._bitField=0,this._fulfillmentHandler0=void 0,this._rejectionHandler0=void 0,this._promise0=void 0,this._receiver0=void 0,this._resolveFromExecutor(t),this._promiseCreated(),this._fireEvent("promiseCreated",this)}function o(t){this.promise._resolveCallback(t)}function s(t){this.promise._rejectCallback(t,!1)}function a(t){var e=new i(x);e._fulfillmentHandler0=t,e._rejectionHandler0=t,e._promise0=t,e._receiver0=t}var c=function(){return new E("circular promise resolution chain\n\n    See http://goo.gl/MqrFmX\n")},u=function(){return new i.PromiseInspection(this._target())},l=function(t){return i.reject(new E(t))},p={},f=t("./util");f.setReflectHandler(u);var h=function(){var t=process.domain;return void 0===t?null:t},_=function(){return null},d=function(){return{domain:h(),async:null}},v=f.isNode&&f.nodeSupportsAsyncResource?t("async_hooks").AsyncResource:null,y=function(){return{domain:h(),async:new v("Bluebird::Promise")}},g=f.isNode?d:_;f.notEnumerableProp(i,"_getContext",g);var m=function(){g=y,f.notEnumerableProp(i,"_getContext",y)},b=function(){g=d,f.notEnumerableProp(i,"_getContext",d)},w=t("./es5"),C=t("./async"),j=new C;w.defineProperty(i,"_async",{value:j});var k=t("./errors"),E=i.TypeError=k.TypeError;i.RangeError=k.RangeError;var F=i.CancellationError=k.CancellationError;i.TimeoutError=k.TimeoutError,i.OperationalError=k.OperationalError,i.RejectionError=k.OperationalError,i.AggregateError=k.AggregateError;var x=function(){},T={},P={},R=t("./thenables")(i,x),S=t("./promise_array")(i,x,R,l,n),O=t("./context")(i),A=O.create,V=t("./debuggability")(i,O,m,b),H=(V.CapturedTrace,t("./finally")(i,R,P)),D=t("./catch_filter")(P),I=t("./nodeback"),L=f.errorObj,N=f.tryCatch;return i.prototype.toString=function(){return"[object Promise]"},i.prototype.caught=i.prototype["catch"]=function(t){var e=arguments.length;if(e>1){var n,r=new Array(e-1),i=0;for(n=0;e-1>n;++n){var o=arguments[n];if(!f.isObject(o))return l("Catch statement predicate: expecting an object but got "+f.classString(o));r[i++]=o}if(r.length=i,t=arguments[n],"function"!=typeof t)throw new E("The last argument to .catch() must be a function, got "+f.toString(t));return this.then(void 0,D(r,t,this))}return this.then(void 0,t)},i.prototype.reflect=function(){return this._then(u,u,void 0,this,void 0)},i.prototype.then=function(t,e){if(V.warnings()&&arguments.length>0&&"function"!=typeof t&&"function"!=typeof e){var n=".then() only accepts functions but was passed: "+f.classString(t);arguments.length>1&&(n+=", "+f.classString(e)),this._warn(n)}return this._then(t,e,void 0,void 0,void 0)},i.prototype.done=function(t,e){var n=this._then(t,e,void 0,void 0,void 0);n._setIsFinal()},i.prototype.spread=function(t){return"function"!=typeof t?l("expecting a function but got "+f.classString(t)):this.all()._then(t,void 0,void 0,T,void 0)},i.prototype.toJSON=function(){var t={isFulfilled:!1,isRejected:!1,fulfillmentValue:void 0,rejectionReason:void 0};return this.isFulfilled()?(t.fulfillmentValue=this.value(),t.isFulfilled=!0):this.isRejected()&&(t.rejectionReason=this.reason(),t.isRejected=!0),t},i.prototype.all=function(){return arguments.length>0&&this._warn(".all() was passed arguments but it does not take any"),new S(this).promise()},i.prototype.error=function(t){return this.caught(f.originatesFromRejection,t)},i.getNewLibraryCopy=e.exports,i.is=function(t){return t instanceof i},i.fromNode=i.fromCallback=function(t){var e=new i(x);e._captureStackTrace();var n=arguments.length>1?!!Object(arguments[1]).multiArgs:!1,r=N(t)(I(e,n));return r===L&&e._rejectCallback(r.e,!0),e._isFateSealed()||e._setAsyncGuaranteed(),e},i.all=function(t){return new S(t).promise()},i.cast=function(t){var e=R(t);return e instanceof i||(e=new i(x),e._captureStackTrace(),e._setFulfilled(),e._rejectionHandler0=t),e},i.resolve=i.fulfilled=i.cast,i.reject=i.rejected=function(t){var e=new i(x);return e._captureStackTrace(),e._rejectCallback(t,!0),e},i.setScheduler=function(t){if("function"!=typeof t)throw new E("expecting a function but got "+f.classString(t));return j.setScheduler(t)},i.prototype._then=function(t,e,n,r,o){var s=void 0!==o,a=s?o:new i(x),c=this._target(),u=c._bitField;s||(a._propagateFrom(this,3),a._captureStackTrace(),void 0===r&&0!==(2097152&this._bitField)&&(r=0!==(50397184&u)?this._boundValue():c===this?void 0:this._boundTo),this._fireEvent("promiseChained",this,a));var l=g();if(0!==(50397184&u)){var p,h,_=c._settlePromiseCtx;0!==(33554432&u)?(h=c._rejectionHandler0,p=t):0!==(16777216&u)?(h=c._fulfillmentHandler0,p=e,c._unsetRejectionIsUnhandled()):(_=c._settlePromiseLateCancellationObserver,h=new F("late cancellation observer"),c._attachExtraTrace(h),p=e),j.invoke(_,c,{handler:f.contextBind(l,p),promise:a,receiver:r,value:h})}else c._addCallbacks(t,e,a,r,l);return a},i.prototype._length=function(){return 65535&this._bitField},i.prototype._isFateSealed=function(){return 0!==(117506048&this._bitField)},i.prototype._isFollowing=function(){return 67108864===(67108864&this._bitField)},i.prototype._setLength=function(t){this._bitField=-65536&this._bitField|65535&t},i.prototype._setFulfilled=function(){this._bitField=33554432|this._bitField,this._fireEvent("promiseFulfilled",this)},i.prototype._setRejected=function(){this._bitField=16777216|this._bitField,this._fireEvent("promiseRejected",this)},i.prototype._setFollowing=function(){this._bitField=67108864|this._bitField,this._fireEvent("promiseResolved",this)},i.prototype._setIsFinal=function(){this._bitField=4194304|this._bitField},i.prototype._isFinal=function(){return(4194304&this._bitField)>0},i.prototype._unsetCancelled=function(){this._bitField=-65537&this._bitField},i.prototype._setCancelled=function(){this._bitField=65536|this._bitField,this._fireEvent("promiseCancelled",this)},i.prototype._setWillBeCancelled=function(){this._bitField=8388608|this._bitField},i.prototype._setAsyncGuaranteed=function(){if(!j.hasCustomScheduler()){var t=this._bitField;this._bitField=t|(536870912&t)>>2^134217728}},i.prototype._setNoAsyncGuarantee=function(){this._bitField=-134217729&(536870912|this._bitField)},i.prototype._receiverAt=function(t){var e=0===t?this._receiver0:this[4*t-4+3];return e===p?void 0:void 0===e&&this._isBound()?this._boundValue():e},i.prototype._promiseAt=function(t){return this[4*t-4+2]},i.prototype._fulfillmentHandlerAt=function(t){return this[4*t-4+0]},i.prototype._rejectionHandlerAt=function(t){return this[4*t-4+1]},i.prototype._boundValue=function(){},i.prototype._migrateCallback0=function(t){var e=(t._bitField,t._fulfillmentHandler0),n=t._rejectionHandler0,r=t._promise0,i=t._receiverAt(0);void 0===i&&(i=p),this._addCallbacks(e,n,r,i,null)},i.prototype._migrateCallbackAt=function(t,e){var n=t._fulfillmentHandlerAt(e),r=t._rejectionHandlerAt(e),i=t._promiseAt(e),o=t._receiverAt(e);void 0===o&&(o=p),this._addCallbacks(n,r,i,o,null)},i.prototype._addCallbacks=function(t,e,n,r,i){var o=this._length();if(o>=65531&&(o=0,this._setLength(0)),0===o)this._promise0=n,this._receiver0=r,"function"==typeof t&&(this._fulfillmentHandler0=f.contextBind(i,t)),"function"==typeof e&&(this._rejectionHandler0=f.contextBind(i,e));else{var s=4*o-4;this[s+2]=n,this[s+3]=r,"function"==typeof t&&(this[s+0]=f.contextBind(i,t)),"function"==typeof e&&(this[s+1]=f.contextBind(i,e))}return this._setLength(o+1),o},i.prototype._proxy=function(t,e){this._addCallbacks(void 0,void 0,e,t,null)},i.prototype._resolveCallback=function(t,e){if(0===(117506048&this._bitField)){if(t===this)return this._rejectCallback(c(),!1);var n=R(t,this);if(!(n instanceof i))return this._fulfill(t);e&&this._propagateFrom(n,2);var r=n._target();if(r===this)return void this._reject(c());var o=r._bitField;if(0===(50397184&o)){var s=this._length();s>0&&r._migrateCallback0(this);for(var a=1;s>a;++a)r._migrateCallbackAt(this,a);this._setFollowing(),this._setLength(0),this._setFollowee(n)}else if(0!==(33554432&o))this._fulfill(r._value());else if(0!==(16777216&o))this._reject(r._reason());else{var u=new F("late cancellation observer");r._attachExtraTrace(u),this._reject(u)}}},i.prototype._rejectCallback=function(t,e,n){var r=f.ensureErrorObject(t),i=r===t;if(!i&&!n&&V.warnings()){var o="a promise was rejected with a non-error: "+f.classString(t);this._warn(o,!0)}this._attachExtraTrace(r,e?i:!1),this._reject(t)},i.prototype._resolveFromExecutor=function(t){if(t!==x){var e=this;this._captureStackTrace(),this._pushContext();var n=!0,r=this._execute(t,function(t){e._resolveCallback(t)},function(t){e._rejectCallback(t,n)});n=!1,this._popContext(),void 0!==r&&e._rejectCallback(r,!0)}},i.prototype._settlePromiseFromHandler=function(t,e,n,r){var i=r._bitField;if(0===(65536&i)){r._pushContext();var o;e===T?n&&"number"==typeof n.length?o=N(t).apply(this._boundValue(),n):(o=L,o.e=new E("cannot .spread() a non-array: "+f.classString(n))):o=N(t).call(e,n);var s=r._popContext();i=r._bitField,0===(65536&i)&&(o===P?r._reject(n):o===L?r._rejectCallback(o.e,!1):(V.checkForgottenReturns(o,s,"",r,this),r._resolveCallback(o)))}},i.prototype._target=function(){for(var t=this;t._isFollowing();)t=t._followee();return t},i.prototype._followee=function(){return this._rejectionHandler0},i.prototype._setFollowee=function(t){this._rejectionHandler0=t},i.prototype._settlePromise=function(t,e,r,o){var s=t instanceof i,a=this._bitField,c=0!==(134217728&a);0!==(65536&a)?(s&&t._invokeInternalOnCancel(),r instanceof H&&r.isFinallyHandler()?(r.cancelPromise=t,N(e).call(r,o)===L&&t._reject(L.e)):e===u?t._fulfill(u.call(r)):r instanceof n?r._promiseCancelled(t):s||t instanceof S?t._cancel():r.cancel()):"function"==typeof e?s?(c&&t._setAsyncGuaranteed(),this._settlePromiseFromHandler(e,r,o,t)):e.call(r,o,t):r instanceof n?r._isResolved()||(0!==(33554432&a)?r._promiseFulfilled(o,t):r._promiseRejected(o,t)):s&&(c&&t._setAsyncGuaranteed(),0!==(33554432&a)?t._fulfill(o):t._reject(o))},i.prototype._settlePromiseLateCancellationObserver=function(t){var e=t.handler,n=t.promise,r=t.receiver,o=t.value;"function"==typeof e?n instanceof i?this._settlePromiseFromHandler(e,r,o,n):e.call(r,o,n):n instanceof i&&n._reject(o)},i.prototype._settlePromiseCtx=function(t){this._settlePromise(t.promise,t.handler,t.receiver,t.value)},i.prototype._settlePromise0=function(t,e,n){var r=this._promise0,i=this._receiverAt(0);this._promise0=void 0,this._receiver0=void 0,this._settlePromise(r,t,i,e)},i.prototype._clearCallbackDataAtIndex=function(t){var e=4*t-4;this[e+2]=this[e+3]=this[e+0]=this[e+1]=void 0},i.prototype._fulfill=function(t){var e=this._bitField;if(!((117506048&e)>>>16)){if(t===this){var n=c();return this._attachExtraTrace(n),this._reject(n)}this._setFulfilled(),this._rejectionHandler0=t,(65535&e)>0&&(0!==(134217728&e)?this._settlePromises():j.settlePromises(this),this._dereferenceTrace())}},i.prototype._reject=function(t){var e=this._bitField;if(!((117506048&e)>>>16))return this._setRejected(),this._fulfillmentHandler0=t,this._isFinal()?j.fatalError(t,f.isNode):void((65535&e)>0?j.settlePromises(this):this._ensurePossibleRejectionHandled())},i.prototype._fulfillPromises=function(t,e){for(var n=1;t>n;n++){var r=this._fulfillmentHandlerAt(n),i=this._promiseAt(n),o=this._receiverAt(n);this._clearCallbackDataAtIndex(n),this._settlePromise(i,r,o,e)}},i.prototype._rejectPromises=function(t,e){for(var n=1;t>n;n++){var r=this._rejectionHandlerAt(n),i=this._promiseAt(n),o=this._receiverAt(n);this._clearCallbackDataAtIndex(n),this._settlePromise(i,r,o,e)}},i.prototype._settlePromises=function(){var t=this._bitField,e=65535&t;if(e>0){if(0!==(16842752&t)){var n=this._fulfillmentHandler0;this._settlePromise0(this._rejectionHandler0,n,t),this._rejectPromises(e,n)}else{var r=this._rejectionHandler0;this._settlePromise0(this._fulfillmentHandler0,r,t),this._fulfillPromises(e,r)}this._setLength(0)}this._clearCancellationData()},i.prototype._settledValue=function(){var t=this._bitField;return 0!==(33554432&t)?this._rejectionHandler0:0!==(16777216&t)?this._fulfillmentHandler0:void 0},"undefined"!=typeof Symbol&&Symbol.toStringTag&&w.defineProperty(i.prototype,Symbol.toStringTag,{get:function(){return"Object"}}),i.defer=i.pending=function(){V.deprecated("Promise.defer","new Promise");var t=new i(x);return{promise:t,resolve:o,reject:s}},f.notEnumerableProp(i,"_makeSelfResolutionError",c),t("./method")(i,x,R,l,V),t("./bind")(i,x,R,V),t("./cancel")(i,S,l,V),t("./direct_resolve")(i),t("./synchronous_inspection")(i),t("./join")(i,S,R,x,j),i.Promise=i,i.version="3.7.2",t("./call_get.js")(i),t("./generators.js")(i,l,x,R,n,V),t("./map.js")(i,S,l,R,x,V),t("./nodeify.js")(i),t("./promisify.js")(i,x),t("./props.js")(i,S,R,l),t("./race.js")(i,x,R,l),t("./reduce.js")(i,S,l,R,x,V),t("./settle.js")(i,S,V),t("./some.js")(i,S,l),t("./timers.js")(i,x,V),t("./using.js")(i,l,R,A,x,V),t("./any.js")(i),t("./each.js")(i,x),t("./filter.js")(i,x),f.toFastProperties(i),f.toFastProperties(i.prototype),a({a:1}),a({b:2}),a({c:3}),a(1),a(function(){}),a(void 0),a(!1),a(new i(x)),V.setBounds(C.firstLineError,f.lastLineError),i}},{"./any.js":1,"./async":2,"./bind":3,"./call_get.js":5,"./cancel":6,"./catch_filter":7,"./context":8,"./debuggability":9,"./direct_resolve":10,"./each.js":11,"./errors":12,"./es5":13,"./filter.js":14,"./finally":15,"./generators.js":16,"./join":17,"./map.js":18,"./method":19,"./nodeback":20,"./nodeify.js":21,"./promise_array":23,"./promisify.js":24,"./props.js":25,"./race.js":27,"./reduce.js":28,"./settle.js":30,"./some.js":31,"./synchronous_inspection":32,"./thenables":33,"./timers.js":34,"./using.js":35,"./util":36,async_hooks:void 0}],23:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o){function s(t){switch(t){case-2:return[];case-3:return{};case-6:return new Map}}function a(t){var r=this._promise=new e(n);t instanceof e&&(r._propagateFrom(t,3),t.suppressUnhandledRejections()),r._setOnCancel(this),this._values=t,this._length=0,this._totalResolved=0,this._init(void 0,-2)}var c=t("./util");c.isArray;return c.inherits(a,o),a.prototype.length=function(){return this._length},a.prototype.promise=function(){return this._promise},a.prototype._init=function u(t,n){var o=r(this._values,this._promise);if(o instanceof e){o=o._target();var a=o._bitField;if(this._values=o,0===(50397184&a))return this._promise._setAsyncGuaranteed(),o._then(u,this._reject,void 0,this,n);if(0===(33554432&a))return 0!==(16777216&a)?this._reject(o._reason()):this._cancel();o=o._value()}if(o=c.asArray(o),null===o){var l=i("expecting an array or an iterable object but got "+c.classString(o)).reason();return void this._promise._rejectCallback(l,!1)}return 0===o.length?void(-5===n?this._resolveEmptyArray():this._resolve(s(n))):void this._iterate(o)},a.prototype._iterate=function(t){var n=this.getActualLength(t.length);this._length=n,this._values=this.shouldCopyValues()?new Array(n):this._values;for(var i=this._promise,o=!1,s=null,a=0;n>a;++a){var c=r(t[a],i);c instanceof e?(c=c._target(),s=c._bitField):s=null,o?null!==s&&c.suppressUnhandledRejections():null!==s?0===(50397184&s)?(c._proxy(this,a),this._values[a]=c):o=0!==(33554432&s)?this._promiseFulfilled(c._value(),a):0!==(16777216&s)?this._promiseRejected(c._reason(),a):this._promiseCancelled(a):o=this._promiseFulfilled(c,a)}o||i._setAsyncGuaranteed()},a.prototype._isResolved=function(){return null===this._values},a.prototype._resolve=function(t){this._values=null,this._promise._fulfill(t)},a.prototype._cancel=function(){!this._isResolved()&&this._promise._isCancellable()&&(this._values=null,this._promise._cancel())},a.prototype._reject=function(t){this._values=null,this._promise._rejectCallback(t,!1)},a.prototype._promiseFulfilled=function(t,e){this._values[e]=t;var n=++this._totalResolved;return n>=this._length?(this._resolve(this._values),!0):!1},a.prototype._promiseCancelled=function(){return this._cancel(),!0},a.prototype._promiseRejected=function(t){return this._totalResolved++,this._reject(t),!0},a.prototype._resultCancelled=function(){if(!this._isResolved()){var t=this._values;if(this._cancel(),t instanceof e)t.cancel();else for(var n=0;n<t.length;++n)t[n]instanceof e&&t[n].cancel()}},a.prototype.shouldCopyValues=function(){return!0},a.prototype.getActualLength=function(t){return t},a}},{"./util":36}],24:[function(t,e,n){"use strict";e.exports=function(e,n){function r(t){return!C.test(t)}function i(t){try{return t.__isPromisified__===!0}catch(e){return!1}}function o(t,e,n){var r=h.getDataPropertyOrDefault(t,e+n,b);return r?i(r):!1}function s(t,e,n){for(var r=0;r<t.length;r+=2){var i=t[r];if(n.test(i))for(var o=i.replace(n,""),s=0;s<t.length;s+=2)if(t[s]===o)throw new g("Cannot promisify an API that has normal methods with '%s'-suffix\n\n    See http://goo.gl/MqrFmX\n".replace("%s",e))}}function a(t,e,n,r){for(var a=h.inheritedDataKeys(t),c=[],u=0;u<a.length;++u){var l=a[u],p=t[l],f=r===j?!0:j(l,p,t);"function"!=typeof p||i(p)||o(t,l,e)||!r(l,p,t,f)||c.push(l,p)}return s(c,e,n),c}function c(t,r,i,o,s,a){function c(){var i=r;r===f&&(i=this);var o=new e(n);o._captureStackTrace();var s="string"==typeof l&&this!==u?this[l]:t,c=_(o,a);try{s.apply(i,d(arguments,c))}catch(p){o._rejectCallback(v(p),!0,!0)}return o._isFateSealed()||o._setAsyncGuaranteed(),o}var u=function(){return this}(),l=t;return"string"==typeof l&&(t=o),h.notEnumerableProp(c,"__isPromisified__",!0),c}function u(t,e,n,r,i){for(var o=new RegExp(k(e)+"$"),s=a(t,e,o,n),c=0,u=s.length;u>c;c+=2){var l=s[c],p=s[c+1],_=l+e;if(r===E)t[_]=E(l,f,l,p,e,i);else{var d=r(p,function(){return E(l,f,l,p,e,i)});h.notEnumerableProp(d,"__isPromisified__",!0),t[_]=d}}return h.toFastProperties(t),t}function l(t,e,n){return E(t,e,void 0,t,null,n)}var p,f={},h=t("./util"),_=t("./nodeback"),d=h.withAppended,v=h.maybeWrapAsError,y=h.canEvaluate,g=t("./errors").TypeError,m="Async",b={__isPromisified__:!0},w=["arity","length","name","arguments","caller","callee","prototype","__isPromisified__"],C=new RegExp("^(?:"+w.join("|")+")$"),j=function(t){return h.isIdentifier(t)&&"_"!==t.charAt(0)&&"constructor"!==t},k=function(t){return t.replace(/([$])/,"\\$")},E=y?p:c;e.promisify=function(t,e){if("function"!=typeof t)throw new g("expecting a function but got "+h.classString(t));if(i(t))return t;e=Object(e);var n=void 0===e.context?f:e.context,o=!!e.multiArgs,s=l(t,n,o);return h.copyDescriptors(t,s,r),s},e.promisifyAll=function(t,e){if("function"!=typeof t&&"object"!=typeof t)throw new g("the target of promisifyAll must be an object or a function\n\n    See http://goo.gl/MqrFmX\n");e=Object(e);var n=!!e.multiArgs,r=e.suffix;"string"!=typeof r&&(r=m);var i=e.filter;"function"!=typeof i&&(i=j);var o=e.promisifier;if("function"!=typeof o&&(o=E),!h.isIdentifier(r))throw new RangeError("suffix must be a valid identifier\n\n    See http://goo.gl/MqrFmX\n");for(var s=h.inheritedDataKeys(t),a=0;a<s.length;++a){var c=t[s[a]];"constructor"!==s[a]&&h.isClass(c)&&(u(c.prototype,r,i,o,n),u(c,r,i,o,n))}return u(t,r,i,o,n)}}},{"./errors":12,"./nodeback":20,"./util":36}],25:[function(t,e,n){"use strict";e.exports=function(e,n,r,i){function o(t){var e,n=!1;if(void 0!==a&&t instanceof a)e=p(t),n=!0;else{var r=l.keys(t),i=r.length;e=new Array(2*i);for(var o=0;i>o;++o){var s=r[o];e[o]=t[s],e[o+i]=s}}this.constructor$(e),this._isMap=n,this._init$(void 0,n?-6:-3)}function s(t){var n,s=r(t);return u(s)?(n=s instanceof e?s._then(e.props,void 0,void 0,void 0,void 0):new o(s).promise(),s instanceof e&&n._propagateFrom(s,2),n):i("cannot await properties of a non-object\n\n    See http://goo.gl/MqrFmX\n")}var a,c=t("./util"),u=c.isObject,l=t("./es5");"function"==typeof Map&&(a=Map);var p=function(){function t(t,r){this[e]=t,this[e+n]=r,e++}var e=0,n=0;return function(r){n=r.size,e=0;var i=new Array(2*r.size);return r.forEach(t,i),i}}(),f=function(t){for(var e=new a,n=t.length/2|0,r=0;n>r;++r){var i=t[n+r],o=t[r];e.set(i,o)}return e};c.inherits(o,n),o.prototype._init=function(){},o.prototype._promiseFulfilled=function(t,e){this._values[e]=t;var n=++this._totalResolved;if(n>=this._length){var r;if(this._isMap)r=f(this._values);else{r={};for(var i=this.length(),o=0,s=this.length();s>o;++o)r[this._values[o+i]]=this._values[o]}return this._resolve(r),!0}return!1},o.prototype.shouldCopyValues=function(){return!1},o.prototype.getActualLength=function(t){return t>>1},e.prototype.props=function(){return s(this)},e.props=function(t){return s(t)}}},{"./es5":13,"./util":36}],26:[function(t,e,n){"use strict";function r(t,e,n,r,i){for(var o=0;i>o;++o)n[o+r]=t[o+e],t[o+e]=void 0}function i(t){this._capacity=t,this._length=0,this._front=0}i.prototype._willBeOverCapacity=function(t){return this._capacity<t},i.prototype._pushOne=function(t){var e=this.length();this._checkCapacity(e+1);var n=this._front+e&this._capacity-1;this[n]=t,this._length=e+1},i.prototype.push=function(t,e,n){var r=this.length()+3;if(this._willBeOverCapacity(r))return this._pushOne(t),this._pushOne(e),void this._pushOne(n);var i=this._front+r-3;this._checkCapacity(r);var o=this._capacity-1;this[i+0&o]=t,this[i+1&o]=e,this[i+2&o]=n,this._length=r},i.prototype.shift=function(){var t=this._front,e=this[t];return this[t]=void 0,this._front=t+1&this._capacity-1,this._length--,e},i.prototype.length=function(){return this._length},i.prototype._checkCapacity=function(t){this._capacity<t&&this._resizeTo(this._capacity<<1)},i.prototype._resizeTo=function(t){var e=this._capacity;this._capacity=t;var n=this._front,i=this._length,o=n+i&e-1;r(this,0,this,e,o)},e.exports=i},{}],27:[function(t,e,n){"use strict";e.exports=function(e,n,r,i){function o(t,o){var c=r(t);if(c instanceof e)return a(c);if(t=s.asArray(t),null===t)return i("expecting an array or an iterable object but got "+s.classString(t));var u=new e(n);void 0!==o&&u._propagateFrom(o,3);for(var l=u._fulfill,p=u._reject,f=0,h=t.length;h>f;++f){var _=t[f];(void 0!==_||f in t)&&e.cast(_)._then(l,p,void 0,u,null)}return u}var s=t("./util"),a=function(t){return t.then(function(e){return o(e,t)})};e.race=function(t){return o(t,void 0)},e.prototype.race=function(){return o(this,void 0)}}},{"./util":36}],28:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o,s){function a(t,n,r,i){this.constructor$(t);var s=e._getContext();this._fn=f.contextBind(s,n),void 0!==r&&(r=e.resolve(r),r._attachCancellationCallback(this)),this._initialValue=r,this._currentCancellable=null,i===o?this._eachValues=Array(this._length):0===i?this._eachValues=null:this._eachValues=void 0,this._promise._captureStackTrace(),this._init$(void 0,-5)}function c(t,e){this.isFulfilled()?e._resolve(t):e._reject(t)}function u(t,e,n,i){if("function"!=typeof e)return r("expecting a function but got "+f.classString(e));var o=new a(t,e,n,i);return o.promise()}function l(t){this.accum=t,this.array._gotAccum(t);var n=i(this.value,this.array._promise);return n instanceof e?(this.array._currentCancellable=n,n._then(p,void 0,void 0,this,void 0)):p.call(this,n)}function p(t){var n=this.array,r=n._promise,i=h(n._fn);r._pushContext();var o;o=void 0!==n._eachValues?i.call(r._boundValue(),t,this.index,this.length):i.call(r._boundValue(),this.accum,t,this.index,this.length),o instanceof e&&(n._currentCancellable=o);var a=r._popContext();return s.checkForgottenReturns(o,a,void 0!==n._eachValues?"Promise.each":"Promise.reduce",r),o}var f=t("./util"),h=f.tryCatch;f.inherits(a,n),a.prototype._gotAccum=function(t){void 0!==this._eachValues&&null!==this._eachValues&&t!==o&&this._eachValues.push(t)},a.prototype._eachComplete=function(t){return null!==this._eachValues&&this._eachValues.push(t),this._eachValues},a.prototype._init=function(){},a.prototype._resolveEmptyArray=function(){this._resolve(void 0!==this._eachValues?this._eachValues:this._initialValue)},a.prototype.shouldCopyValues=function(){return!1},a.prototype._resolve=function(t){this._promise._resolveCallback(t),this._values=null},a.prototype._resultCancelled=function(t){return t===this._initialValue?this._cancel():void(this._isResolved()||(this._resultCancelled$(),this._currentCancellable instanceof e&&this._currentCancellable.cancel(),this._initialValue instanceof e&&this._initialValue.cancel()))},a.prototype._iterate=function(t){this._values=t;var n,r,i=t.length;void 0!==this._initialValue?(n=this._initialValue,r=0):(n=e.resolve(t[0]),r=1),this._currentCancellable=n;for(var o=r;i>o;++o){var s=t[o];s instanceof e&&s.suppressUnhandledRejections()}if(!n.isRejected())for(;i>r;++r){var a={accum:null,value:t[r],index:r,length:i,array:this};n=n._then(l,void 0,void 0,a,void 0),0===(127&r)&&n._setNoAsyncGuarantee()}void 0!==this._eachValues&&(n=n._then(this._eachComplete,void 0,void 0,this,void 0)),n._then(c,c,void 0,n,this)},e.prototype.reduce=function(t,e){return u(this,t,e,null)},e.reduce=function(t,e,n,r){return u(t,e,n,r)}}},{"./util":36}],29:[function(t,e,n){"use strict";var r,i=t("./util"),o=function(){throw new Error("No async scheduler available\n\n    See http://goo.gl/MqrFmX\n")},s=i.getNativePromise();if(i.isNode&&"undefined"==typeof MutationObserver){var a=global.setImmediate,c=process.nextTick;r=i.isRecentNode?function(t){a.call(global,t)}:function(t){c.call(process,t)}}else if("function"==typeof s&&"function"==typeof s.resolve){
var u=s.resolve();r=function(t){u.then(t)}}else r="undefined"!=typeof MutationObserver&&("undefined"==typeof window||!window.navigator||!window.navigator.standalone&&!window.cordova)&&"classList"in document.documentElement?function(){var t=document.createElement("div"),e={attributes:!0},n=!1,r=document.createElement("div"),i=new MutationObserver(function(){t.classList.toggle("foo"),n=!1});i.observe(r,e);var o=function(){n||(n=!0,r.classList.toggle("foo"))};return function(n){var r=new MutationObserver(function(){r.disconnect(),n()});r.observe(t,e),o()}}():"undefined"!=typeof setImmediate?function(t){setImmediate(t)}:"undefined"!=typeof setTimeout?function(t){setTimeout(t,0)}:o;e.exports=r},{"./util":36}],30:[function(t,e,n){"use strict";e.exports=function(e,n,r){function i(t){this.constructor$(t)}var o=e.PromiseInspection,s=t("./util");s.inherits(i,n),i.prototype._promiseResolved=function(t,e){this._values[t]=e;var n=++this._totalResolved;return n>=this._length?(this._resolve(this._values),!0):!1},i.prototype._promiseFulfilled=function(t,e){var n=new o;return n._bitField=33554432,n._settledValueField=t,this._promiseResolved(e,n)},i.prototype._promiseRejected=function(t,e){var n=new o;return n._bitField=16777216,n._settledValueField=t,this._promiseResolved(e,n)},e.settle=function(t){return r.deprecated(".settle()",".reflect()"),new i(t).promise()},e.allSettled=function(t){return new i(t).promise()},e.prototype.settle=function(){return e.settle(this)}}},{"./util":36}],31:[function(t,e,n){"use strict";e.exports=function(e,n,r){function i(t){this.constructor$(t),this._howMany=0,this._unwrap=!1,this._initialized=!1}function o(t,e){if((0|e)!==e||0>e)return r("expecting a positive integer\n\n    See http://goo.gl/MqrFmX\n");var n=new i(t),o=n.promise();return n.setHowMany(e),n.init(),o}var s=t("./util"),a=t("./errors").RangeError,c=t("./errors").AggregateError,u=s.isArray,l={};s.inherits(i,n),i.prototype._init=function(){if(this._initialized){if(0===this._howMany)return void this._resolve([]);this._init$(void 0,-5);var t=u(this._values);!this._isResolved()&&t&&this._howMany>this._canPossiblyFulfill()&&this._reject(this._getRangeError(this.length()))}},i.prototype.init=function(){this._initialized=!0,this._init()},i.prototype.setUnwrap=function(){this._unwrap=!0},i.prototype.howMany=function(){return this._howMany},i.prototype.setHowMany=function(t){this._howMany=t},i.prototype._promiseFulfilled=function(t){return this._addFulfilled(t),this._fulfilled()===this.howMany()?(this._values.length=this.howMany(),1===this.howMany()&&this._unwrap?this._resolve(this._values[0]):this._resolve(this._values),!0):!1},i.prototype._promiseRejected=function(t){return this._addRejected(t),this._checkOutcome()},i.prototype._promiseCancelled=function(){return this._values instanceof e||null==this._values?this._cancel():(this._addRejected(l),this._checkOutcome())},i.prototype._checkOutcome=function(){if(this.howMany()>this._canPossiblyFulfill()){for(var t=new c,e=this.length();e<this._values.length;++e)this._values[e]!==l&&t.push(this._values[e]);return t.length>0?this._reject(t):this._cancel(),!0}return!1},i.prototype._fulfilled=function(){return this._totalResolved},i.prototype._rejected=function(){return this._values.length-this.length()},i.prototype._addRejected=function(t){this._values.push(t)},i.prototype._addFulfilled=function(t){this._values[this._totalResolved++]=t},i.prototype._canPossiblyFulfill=function(){return this.length()-this._rejected()},i.prototype._getRangeError=function(t){var e="Input array must contain at least "+this._howMany+" items but contains only "+t+" items";return new a(e)},i.prototype._resolveEmptyArray=function(){this._reject(this._getRangeError(0))},e.some=function(t,e){return o(t,e)},e.prototype.some=function(t){return o(this,t)},e._SomePromiseArray=i}},{"./errors":12,"./util":36}],32:[function(t,e,n){"use strict";e.exports=function(t){function e(t){void 0!==t?(t=t._target(),this._bitField=t._bitField,this._settledValueField=t._isFateSealed()?t._settledValue():void 0):(this._bitField=0,this._settledValueField=void 0)}e.prototype._settledValue=function(){return this._settledValueField};var n=e.prototype.value=function(){if(!this.isFulfilled())throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\n\n    See http://goo.gl/MqrFmX\n");return this._settledValue()},r=e.prototype.error=e.prototype.reason=function(){if(!this.isRejected())throw new TypeError("cannot get rejection reason of a non-rejected promise\n\n    See http://goo.gl/MqrFmX\n");return this._settledValue()},i=e.prototype.isFulfilled=function(){return 0!==(33554432&this._bitField)},o=e.prototype.isRejected=function(){return 0!==(16777216&this._bitField)},s=e.prototype.isPending=function(){return 0===(50397184&this._bitField)},a=e.prototype.isResolved=function(){return 0!==(50331648&this._bitField)};e.prototype.isCancelled=function(){return 0!==(8454144&this._bitField)},t.prototype.__isCancelled=function(){return 65536===(65536&this._bitField)},t.prototype._isCancelled=function(){return this._target().__isCancelled()},t.prototype.isCancelled=function(){return 0!==(8454144&this._target()._bitField)},t.prototype.isPending=function(){return s.call(this._target())},t.prototype.isRejected=function(){return o.call(this._target())},t.prototype.isFulfilled=function(){return i.call(this._target())},t.prototype.isResolved=function(){return a.call(this._target())},t.prototype.value=function(){return n.call(this._target())},t.prototype.reason=function(){var t=this._target();return t._unsetRejectionIsUnhandled(),r.call(t)},t.prototype._value=function(){return this._settledValue()},t.prototype._reason=function(){return this._unsetRejectionIsUnhandled(),this._settledValue()},t.PromiseInspection=e}},{}],33:[function(t,e,n){"use strict";e.exports=function(e,n){function r(t,r){if(l(t)){if(t instanceof e)return t;var i=o(t);if(i===u){r&&r._pushContext();var c=e.reject(i.e);return r&&r._popContext(),c}if("function"==typeof i){if(s(t)){var c=new e(n);return t._then(c._fulfill,c._reject,void 0,c,null),c}return a(t,i,r)}}return t}function i(t){return t.then}function o(t){try{return i(t)}catch(e){return u.e=e,u}}function s(t){try{return p.call(t,"_promise0")}catch(e){return!1}}function a(t,r,i){function o(t){a&&(a._resolveCallback(t),a=null)}function s(t){a&&(a._rejectCallback(t,p,!0),a=null)}var a=new e(n),l=a;i&&i._pushContext(),a._captureStackTrace(),i&&i._popContext();var p=!0,f=c.tryCatch(r).call(t,o,s);return p=!1,a&&f===u&&(a._rejectCallback(f.e,!0,!0),a=null),l}var c=t("./util"),u=c.errorObj,l=c.isObject,p={}.hasOwnProperty;return r}},{"./util":36}],34:[function(t,e,n){"use strict";e.exports=function(e,n,r){function i(t){this.handle=t}function o(t){return clearTimeout(this.handle),t}function s(t){throw clearTimeout(this.handle),t}var a=t("./util"),c=e.TimeoutError;i.prototype._resultCancelled=function(){clearTimeout(this.handle)};var u=function(t){return l(+this).thenReturn(t)},l=e.delay=function(t,o){var s,a;return void 0!==o?(s=e.resolve(o)._then(u,null,null,t,void 0),r.cancellation()&&o instanceof e&&s._setOnCancel(o)):(s=new e(n),a=setTimeout(function(){s._fulfill()},+t),r.cancellation()&&s._setOnCancel(new i(a)),s._captureStackTrace()),s._setAsyncGuaranteed(),s};e.prototype.delay=function(t){return l(t,this)};var p=function(t,e,n){var r;r="string"!=typeof e?e instanceof Error?e:new c("operation timed out"):new c(e),a.markAsOriginatingFromRejection(r),t._attachExtraTrace(r),t._reject(r),null!=n&&n.cancel()};e.prototype.timeout=function(t,e){t=+t;var n,a,c=new i(setTimeout(function(){n.isPending()&&p(n,e,a)},t));return r.cancellation()?(a=this.then(),n=a._then(o,s,void 0,c,void 0),n._setOnCancel(c)):n=this._then(o,s,void 0,c,void 0),n}}},{"./util":36}],35:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o,s){function a(t){setTimeout(function(){throw t},0)}function c(t){var e=r(t);return e!==t&&"function"==typeof t._isDisposable&&"function"==typeof t._getDisposer&&t._isDisposable()&&e._setDisposable(t._getDisposer()),e}function u(t,n){function i(){if(s>=u)return l._fulfill();var o=c(t[s++]);if(o instanceof e&&o._isDisposable()){try{o=r(o._getDisposer().tryDispose(n),t.promise)}catch(p){return a(p)}if(o instanceof e)return o._then(i,a,null,null,null)}i()}var s=0,u=t.length,l=new e(o);return i(),l}function l(t,e,n){this._data=t,this._promise=e,this._context=n}function p(t,e,n){this.constructor$(t,e,n)}function f(t){return l.isDisposer(t)?(this.resources[this.index]._setDisposable(t),t.promise()):t}function h(t){this.length=t,this.promise=null,this[t-1]=null}var _=t("./util"),d=t("./errors").TypeError,v=t("./util").inherits,y=_.errorObj,g=_.tryCatch,m={};l.prototype.data=function(){return this._data},l.prototype.promise=function(){return this._promise},l.prototype.resource=function(){return this.promise().isFulfilled()?this.promise().value():m},l.prototype.tryDispose=function(t){var e=this.resource(),n=this._context;void 0!==n&&n._pushContext();var r=e!==m?this.doDispose(e,t):null;return void 0!==n&&n._popContext(),this._promise._unsetDisposable(),this._data=null,r},l.isDisposer=function(t){return null!=t&&"function"==typeof t.resource&&"function"==typeof t.tryDispose},v(p,l),p.prototype.doDispose=function(t,e){var n=this.data();return n.call(t,t,e)},h.prototype._resultCancelled=function(){for(var t=this.length,n=0;t>n;++n){var r=this[n];r instanceof e&&r.cancel()}},e.using=function(){var t=arguments.length;if(2>t)return n("you must pass at least 2 arguments to Promise.using");var i=arguments[t-1];if("function"!=typeof i)return n("expecting a function but got "+_.classString(i));var o,a=!0;2===t&&Array.isArray(arguments[0])?(o=arguments[0],t=o.length,a=!1):(o=arguments,t--);for(var c=new h(t),p=0;t>p;++p){var d=o[p];if(l.isDisposer(d)){var v=d;d=d.promise(),d._setDisposable(v)}else{var m=r(d);m instanceof e&&(d=m._then(f,null,null,{resources:c,index:p},void 0))}c[p]=d}for(var b=new Array(c.length),p=0;p<b.length;++p)b[p]=e.resolve(c[p]).reflect();var w=e.all(b).then(function(t){for(var e=0;e<t.length;++e){var n=t[e];if(n.isRejected())return y.e=n.error(),y;if(!n.isFulfilled())return void w.cancel();t[e]=n.value()}C._pushContext(),i=g(i);var r=a?i.apply(void 0,t):i(t),o=C._popContext();return s.checkForgottenReturns(r,o,"Promise.using",C),r}),C=w.lastly(function(){var t=new e.PromiseInspection(w);return u(c,t)});return c.promise=C,C._setOnCancel(c),C},e.prototype._setDisposable=function(t){this._bitField=131072|this._bitField,this._disposer=t},e.prototype._isDisposable=function(){return(131072&this._bitField)>0},e.prototype._getDisposer=function(){return this._disposer},e.prototype._unsetDisposable=function(){this._bitField=-131073&this._bitField,this._disposer=void 0},e.prototype.disposer=function(t){if("function"==typeof t)return new p(t,this,i());throw new d}}},{"./errors":12,"./util":36}],36:[function(t,e,n){"use strict";function r(){try{var t=P;return P=null,t.apply(this,arguments)}catch(e){return T.e=e,T}}function i(t){return P=t,r}function o(t){return null==t||t===!0||t===!1||"string"==typeof t||"number"==typeof t}function s(t){return"function"==typeof t||"object"==typeof t&&null!==t}function a(t){return o(t)?new Error(v(t)):t}function c(t,e){var n,r=t.length,i=new Array(r+1);for(n=0;r>n;++n)i[n]=t[n];return i[n]=e,i}function u(t,e,n){if(!F.isES5)return{}.hasOwnProperty.call(t,e)?t[e]:void 0;var r=Object.getOwnPropertyDescriptor(t,e);return null!=r?null==r.get&&null==r.set?r.value:n:void 0}function l(t,e,n){if(o(t))return t;var r={value:n,configurable:!0,enumerable:!1,writable:!0};return F.defineProperty(t,e,r),t}function p(t){throw t}function f(t){try{if("function"==typeof t){var e=F.names(t.prototype),n=F.isES5&&e.length>1,r=e.length>0&&!(1===e.length&&"constructor"===e[0]),i=A.test(t+"")&&F.names(t).length>0;if(n||r||i)return!0}return!1}catch(o){return!1}}function h(t){function e(){}function n(){return typeof r.foo}e.prototype=t;var r=new e;return n(),n(),t}function _(t){return V.test(t)}function d(t,e,n){for(var r=new Array(t),i=0;t>i;++i)r[i]=e+i+n;return r}function v(t){try{return t+""}catch(e){return"[no string representation]"}}function y(t){return t instanceof Error||null!==t&&"object"==typeof t&&"string"==typeof t.message&&"string"==typeof t.name}function g(t){try{l(t,"isOperational",!0)}catch(e){}}function m(t){return null==t?!1:t instanceof Error.__BluebirdErrorTypes__.OperationalError||t.isOperational===!0}function b(t){return y(t)&&F.propertyIsWritable(t,"stack")}function w(t){return{}.toString.call(t)}function C(t,e,n){for(var r=F.names(t),i=0;i<r.length;++i){var o=r[i];if(n(o))try{F.defineProperty(e,o,F.getDescriptor(t,o))}catch(s){}}}function j(t){return N?process.env[t]:void 0}function k(){if("function"==typeof Promise)try{var t=new Promise(function(){});if("[object Promise]"===w(t))return Promise}catch(e){}}function E(t,e){if(null===t||"function"!=typeof e||e===U)return e;null!==t.domain&&(e=t.domain.bind(e));var n=t.async;if(null!==n){var r=e;e=function(){var t=new Array(2).concat([].slice.call(arguments));return t[0]=r,t[1]=this,n.runInAsyncScope.apply(n,t)}}return e}var F=t("./es5"),x="undefined"==typeof navigator,T={e:{}},P,R="undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:void 0!==this?this:null,S=function(t,e){function n(){this.constructor=t,this.constructor$=e;for(var n in e.prototype)r.call(e.prototype,n)&&"$"!==n.charAt(n.length-1)&&(this[n+"$"]=e.prototype[n])}var r={}.hasOwnProperty;return n.prototype=e.prototype,t.prototype=new n,t.prototype},O=function(){var t=[Array.prototype,Object.prototype,Function.prototype],e=function(e){for(var n=0;n<t.length;++n)if(t[n]===e)return!0;return!1};if(F.isES5){var n=Object.getOwnPropertyNames;return function(t){for(var r=[],i=Object.create(null);null!=t&&!e(t);){var o;try{o=n(t)}catch(s){return r}for(var a=0;a<o.length;++a){var c=o[a];if(!i[c]){i[c]=!0;var u=Object.getOwnPropertyDescriptor(t,c);null!=u&&null==u.get&&null==u.set&&r.push(c)}}t=F.getPrototypeOf(t)}return r}}var r={}.hasOwnProperty;return function(n){if(e(n))return[];var i=[];t:for(var o in n)if(r.call(n,o))i.push(o);else{for(var s=0;s<t.length;++s)if(r.call(t[s],o))continue t;i.push(o)}return i}}(),A=/this\s*\.\s*\S+\s*=/,V=/^[a-z$_][a-z$_0-9]*$/i,H=function(){return"stack"in new Error?function(t){return b(t)?t:new Error(v(t))}:function(t){if(b(t))return t;try{throw new Error(v(t))}catch(e){return e}}}(),D=function(t){return F.isArray(t)?t:null};if("undefined"!=typeof Symbol&&Symbol.iterator){var I="function"==typeof Array.from?function(t){return Array.from(t)}:function(t){for(var e,n=[],r=t[Symbol.iterator]();!(e=r.next()).done;)n.push(e.value);return n};D=function(t){return F.isArray(t)?t:null!=t&&"function"==typeof t[Symbol.iterator]?I(t):null}}var L="undefined"!=typeof process&&"[object process]"===w(process).toLowerCase(),N="undefined"!=typeof process&&"undefined"!=typeof process.env,U,B={setReflectHandler:function(t){U=t},isClass:f,isIdentifier:_,inheritedDataKeys:O,getDataPropertyOrDefault:u,thrower:p,isArray:F.isArray,asArray:D,notEnumerableProp:l,isPrimitive:o,isObject:s,isError:y,canEvaluate:x,errorObj:T,tryCatch:i,inherits:S,withAppended:c,maybeWrapAsError:a,toFastProperties:h,filledRange:d,toString:v,canAttachTrace:b,ensureErrorObject:H,originatesFromRejection:m,markAsOriginatingFromRejection:g,classString:w,copyDescriptors:C,isNode:L,hasEnvVariables:N,env:j,global:R,getNativePromise:k,contextBind:E};B.isRecentNode=B.isNode&&function(){var t;return process.versions&&process.versions.node?t=process.versions.node.split(".").map(Number):process.version&&(t=process.version.split(".").map(Number)),0===t[0]&&t[1]>10||t[0]>0}(),B.nodeSupportsAsyncResource=B.isNode&&function(){var e=!1;try{var n=t("async_hooks").AsyncResource;e="function"==typeof n.prototype.runInAsyncScope}catch(r){e=!1}return e}(),B.isNode&&B.toFastProperties(process);try{throw new Error}catch(M){B.lastLineError=M}e.exports=B},{"./es5":13,async_hooks:void 0}]},{},[4])(4)}),"undefined"!=typeof window&&null!==window?window.P=window.Promise:"undefined"!=typeof self&&null!==self&&(self.P=self.Promise);1.20.0 / 2022-04-02
===================

  * Fix error message for json parse whitespace in `strict`
  * Fix internal error when inflated body exceeds limit
  * Prevent loss of async hooks context
  * Prevent hanging when request already read
  * deps: depd@2.0.0
    - Replace internal `eval` usage with `Function` constructor
    - Use instance methods on `process` to check for listeners
  * deps: http-errors@2.0.0
    - deps: depd@2.0.0
    - deps: statuses@2.0.1
  * deps: on-finished@2.4.1
  * deps: qs@6.10.3
  * deps: raw-body@2.5.1
    - deps: http-errors@2.0.0

1.19.2 / 2022-02-15
===================

  * deps: bytes@3.1.2
  * deps: qs@6.9.7
    * Fix handling of `__proto__` keys
  * deps: raw-body@2.4.3
    - deps: bytes@3.1.2

1.19.1 / 2021-12-10
===================

  * deps: bytes@3.1.1
  * deps: http-errors@1.8.1
    - deps: inherits@2.0.4
    - deps: toidentifier@1.0.1
    - deps: setprototypeof@1.2.0
  * deps: qs@6.9.6
  * deps: raw-body@2.4.2
    - deps: bytes@3.1.1
    - deps: http-errors@1.8.1
  * deps: safe-buffer@5.2.1
  * deps: type-is@~1.6.18

1.19.0 / 2019-04-25
===================

  * deps: bytes@3.1.0
    - Add petabyte (`pb`) support
  * deps: http-errors@1.7.2
    - Set constructor name when possible
    - deps: setprototypeof@1.1.1
    - deps: statuses@'>= 1.5.0 < 2'
  * deps: iconv-lite@0.4.24
    - Added encoding MIK
  * deps: qs@6.7.0
    - Fix parsing array brackets after index
  * deps: raw-body@2.4.0
    - deps: bytes@3.1.0
    - deps: http-errors@1.7.2
    - deps: iconv-lite@0.4.24
  * deps: type-is@~1.6.17
    - deps: mime-types@~2.1.24
    - perf: prevent internal `throw` on invalid type

1.18.3 / 2018-05-14
===================

  * Fix stack trace for strict json parse error
  * deps: depd@~1.1.2
    - perf: remove argument reassignment
  * deps: http-errors@~1.6.3
    - deps: depd@~1.1.2
    - deps: setprototypeof@1.1.0
    - deps: statuses@'>= 1.3.1 < 2'
  * deps: iconv-lite@0.4.23
    - Fix loading encoding with year appended
    - Fix deprecation warnings on Node.js 10+
  * deps: qs@6.5.2
  * deps: raw-body@2.3.3
    - deps: http-errors@1.6.3
    - deps: iconv-lite@0.4.23
  * deps: type-is@~1.6.16
    - deps: mime-types@~2.1.18

1.18.2 / 2017-09-22
===================

  * deps: debug@2.6.9
  * perf: remove argument reassignment

1.18.1 / 2017-09-12
===================

  * deps: content-type@~1.0.4
    - perf: remove argument reassignment
    - perf: skip parameter parsing when no parameters
  * deps: iconv-lite@0.4.19
    - Fix ISO-8859-1 regression
    - Update Windows-1255
  * deps: qs@6.5.1
    - Fix parsing & compacting very deep objects
  * deps: raw-body@2.3.2
    - deps: iconv-lite@0.4.19

1.18.0 / 2017-09-08
===================

  * Fix JSON strict violation error to match native parse error
  * Include the `body` property on verify errors
  * Include the `type` property on all generated errors
  * Use `http-errors` to set status code on errors
  * deps: bytes@3.0.0
  * deps: debug@2.6.8
  * deps: depd@~1.1.1
    - Remove unnecessary `Buffer` loading
  * deps: http-errors@~1.6.2
    - deps: depd@1.1.1
  * deps: iconv-lite@0.4.18
    - Add support for React Native
    - Add a warning if not loaded as utf-8
    - Fix CESU-8 decoding in Node.js 8
    - Improve speed of ISO-8859-1 encoding
  * deps: qs@6.5.0
  * deps: raw-body@2.3.1
    - Use `http-errors` for standard emitted errors
    - deps: bytes@3.0.0
    - deps: iconv-lite@0.4.18
    - perf: skip buffer decoding on overage chunk
  * perf: prevent internal `throw` when missing charset

1.17.2 / 2017-05-17
===================

  * deps: debug@2.6.7
    - Fix `DEBUG_MAX_ARRAY_LENGTH`
    - deps: ms@2.0.0
  * deps: type-is@~1.6.15
    - deps: mime-types@~2.1.15

1.17.1 / 2017-03-06
===================

  * deps: qs@6.4.0
    - Fix regression parsing keys starting with `[`

1.17.0 / 2017-03-01
===================

  * deps: http-errors@~1.6.1
    - Make `message` property enumerable for `HttpError`s
    - deps: setprototypeof@1.0.3
  * deps: qs@6.3.1
    - Fix compacting nested arrays

1.16.1 / 2017-02-10
===================

  * deps: debug@2.6.1
    - Fix deprecation messages in WebStorm and other editors
    - Undeprecate `DEBUG_FD` set to `1` or `2`

1.16.0 / 2017-01-17
===================

  * deps: debug@2.6.0
    - Allow colors in workers
    - Deprecated `DEBUG_FD` environment variable
    - Fix error when running under React Native
    - Use same color for same namespace
    - deps: ms@0.7.2
  * deps: http-errors@~1.5.1
    - deps: inherits@2.0.3
    - deps: setprototypeof@1.0.2
    - deps: statuses@'>= 1.3.1 < 2'
  * deps: iconv-lite@0.4.15
    - Added encoding MS-31J
    - Added encoding MS-932
    - Added encoding MS-936
    - Added encoding MS-949
    - Added encoding MS-950
    - Fix GBK/GB18030 handling of Euro character
  * deps: qs@6.2.1
    - Fix array parsing from skipping empty values
  * deps: raw-body@~2.2.0
    - deps: iconv-lite@0.4.15
  * deps: type-is@~1.6.14
    - deps: mime-types@~2.1.13

1.15.2 / 2016-06-19
===================

  * deps: bytes@2.4.0
  * deps: content-type@~1.0.2
    - perf: enable strict mode
  * deps: http-errors@~1.5.0
    - Use `setprototypeof` module to replace `__proto__` setting
    - deps: statuses@'>= 1.3.0 < 2'
    - perf: enable strict mode
  * deps: qs@6.2.0
  * deps: raw-body@~2.1.7
    - deps: bytes@2.4.0
    - perf: remove double-cleanup on happy path
  * deps: type-is@~1.6.13
    - deps: mime-types@~2.1.11

1.15.1 / 2016-05-05
===================

  * deps: bytes@2.3.0
    - Drop partial bytes on all parsed units
    - Fix parsing byte string that looks like hex
  * deps: raw-body@~2.1.6
    - deps: bytes@2.3.0
  * deps: type-is@~1.6.12
    - deps: mime-types@~2.1.10

1.15.0 / 2016-02-10
===================

  * deps: http-errors@~1.4.0
    - Add `HttpError` export, for `err instanceof createError.HttpError`
    - deps: inherits@2.0.1
    - deps: statuses@'>= 1.2.1 < 2'
  * deps: qs@6.1.0
  * deps: type-is@~1.6.11
    - deps: mime-types@~2.1.9

1.14.2 / 2015-12-16
===================

  * deps: bytes@2.2.0
  * deps: iconv-lite@0.4.13
  * deps: qs@5.2.0
  * deps: raw-body@~2.1.5
    - deps: bytes@2.2.0
    - deps: iconv-lite@0.4.13
  * deps: type-is@~1.6.10
    - deps: mime-types@~2.1.8

1.14.1 / 2015-09-27
===================

  * Fix issue where invalid charset results in 400 when `verify` used
  * deps: iconv-lite@0.4.12
    - Fix CESU-8 decoding in Node.js 4.x
  * deps: raw-body@~2.1.4
    - Fix masking critical errors from `iconv-lite`
    - deps: iconv-lite@0.4.12
  * deps: type-is@~1.6.9
    - deps: mime-types@~2.1.7

1.14.0 / 2015-09-16
===================

  * Fix JSON strict parse error to match syntax errors
  * Provide static `require` analysis in `urlencoded` parser
  * deps: depd@~1.1.0
    - Support web browser loading
  * deps: qs@5.1.0
  * deps: raw-body@~2.1.3
    - Fix sync callback when attaching data listener causes sync read
  * deps: type-is@~1.6.8
    - Fix type error when given invalid type to match against
    - deps: mime-types@~2.1.6

1.13.3 / 2015-07-31
===================

  * deps: type-is@~1.6.6
    - deps: mime-types@~2.1.4

1.13.2 / 2015-07-05
===================

  * deps: iconv-lite@0.4.11
  * deps: qs@4.0.0
    - Fix dropping parameters like `hasOwnProperty`
    - Fix user-visible incompatibilities from 3.1.0
    - Fix various parsing edge cases
  * deps: raw-body@~2.1.2
    - Fix error stack traces to skip `makeError`
    - deps: iconv-lite@0.4.11
  * deps: type-is@~1.6.4
    - deps: mime-types@~2.1.2
    - perf: enable strict mode
    - perf: remove argument reassignment

1.13.1 / 2015-06-16
===================

  * deps: qs@2.4.2
    - Downgraded from 3.1.0 because of user-visible incompatibilities

1.13.0 / 2015-06-14
===================

  * Add `statusCode` property on `Error`s, in addition to `status`
  * Change `type` default to `application/json` for JSON parser
  * Change `type` default to `application/x-www-form-urlencoded` for urlencoded parser
  * Provide static `require` analysis
  * Use the `http-errors` module to generate errors
  * deps: bytes@2.1.0
    - Slight optimizations
  * deps: iconv-lite@0.4.10
    - The encoding UTF-16 without BOM now defaults to UTF-16LE when detection fails
    - Leading BOM is now removed when decoding
  * deps: on-finished@~2.3.0
    - Add defined behavior for HTTP `CONNECT` requests
    - Add defined behavior for HTTP `Upgrade` requests
    - deps: ee-first@1.1.1
  * deps: qs@3.1.0
    - Fix dropping parameters like `hasOwnProperty`
    - Fix various parsing edge cases
    - Parsed object now has `null` prototype
  * deps: raw-body@~2.1.1
    - Use `unpipe` module for unpiping requests
    - deps: iconv-lite@0.4.10
  * deps: type-is@~1.6.3
    - deps: mime-types@~2.1.1
    - perf: reduce try block size
    - perf: remove bitwise operations
  * perf: enable strict mode
  * perf: remove argument reassignment
  * perf: remove delete call

1.12.4 / 2015-05-10
===================

  * deps: debug@~2.2.0
  * deps: qs@2.4.2
    - Fix allowing parameters like `constructor`
  * deps: on-finished@~2.2.1
  * deps: raw-body@~2.0.1
    - Fix a false-positive when unpiping in Node.js 0.8
    - deps: bytes@2.0.1
  * deps: type-is@~1.6.2
    - deps: mime-types@~2.0.11

1.12.3 / 2015-04-15
===================

  * Slight efficiency improvement when not debugging
  * deps: depd@~1.0.1
  * deps: iconv-lite@0.4.8
    - Add encoding alias UNICODE-1-1-UTF-7
  * deps: raw-body@1.3.4
    - Fix hanging callback if request aborts during read
    - deps: iconv-lite@0.4.8

1.12.2 / 2015-03-16
===================

  * deps: qs@2.4.1
    - Fix error when parameter `hasOwnProperty` is present

1.12.1 / 2015-03-15
===================

  * deps: debug@~2.1.3
    - Fix high intensity foreground color for bold
    - deps: ms@0.7.0
  * deps: type-is@~1.6.1
    - deps: mime-types@~2.0.10

1.12.0 / 2015-02-13
===================

  * add `debug` messages
  * accept a function for the `type` option
  * use `content-type` to parse `Content-Type` headers
  * deps: iconv-lite@0.4.7
    - Gracefully support enumerables on `Object.prototype`
  * deps: raw-body@1.3.3
    - deps: iconv-lite@0.4.7
  * deps: type-is@~1.6.0
    - fix argument reassignment
    - fix false-positives in `hasBody` `Transfer-Encoding` check
    - support wildcard for both type and subtype (`*/*`)
    - deps: mime-types@~2.0.9

1.11.0 / 2015-01-30
===================

  * make internal `extended: true` depth limit infinity
  * deps: type-is@~1.5.6
    - deps: mime-types@~2.0.8

1.10.2 / 2015-01-20
===================

  * deps: iconv-lite@0.4.6
    - Fix rare aliases of single-byte encodings
  * deps: raw-body@1.3.2
    - deps: iconv-lite@0.4.6

1.10.1 / 2015-01-01
===================

  * deps: on-finished@~2.2.0
  * deps: type-is@~1.5.5
    - deps: mime-types@~2.0.7

1.10.0 / 2014-12-02
===================

  * make internal `extended: true` array limit dynamic

1.9.3 / 2014-11-21
==================

  * deps: iconv-lite@0.4.5
    - Fix Windows-31J and X-SJIS encoding support
  * deps: qs@2.3.3
    - Fix `arrayLimit` behavior
  * deps: raw-body@1.3.1
    - deps: iconv-lite@0.4.5
  * deps: type-is@~1.5.3
    - deps: mime-types@~2.0.3

1.9.2 / 2014-10-27
==================

  * deps: qs@2.3.2
    - Fix parsing of mixed objects and values

1.9.1 / 2014-10-22
==================

  * deps: on-finished@~2.1.1
    - Fix handling of pipelined requests
  * deps: qs@2.3.0
    - Fix parsing of mixed implicit and explicit arrays
  * deps: type-is@~1.5.2
    - deps: mime-types@~2.0.2

1.9.0 / 2014-09-24
==================

  * include the charset in "unsupported charset" error message
  * include the encoding in "unsupported content encoding" error message
  * deps: depd@~1.0.0

1.8.4 / 2014-09-23
==================

  * fix content encoding to be case-insensitive

1.8.3 / 2014-09-19
==================

  * deps: qs@2.2.4
    - Fix issue with object keys starting with numbers truncated

1.8.2 / 2014-09-15
==================

  * deps: depd@0.4.5

1.8.1 / 2014-09-07
==================

  * deps: media-typer@0.3.0
  * deps: type-is@~1.5.1

1.8.0 / 2014-09-05
==================

  * make empty-body-handling consistent between chunked requests
    - empty `json` produces `{}`
    - empty `raw` produces `new Buffer(0)`
    - empty `text` produces `''`
    - empty `urlencoded` produces `{}`
  * deps: qs@2.2.3
    - Fix issue where first empty value in array is discarded
  * deps: type-is@~1.5.0
    - fix `hasbody` to be true for `content-length: 0`

1.7.0 / 2014-09-01
==================

  * add `parameterLimit` option to `urlencoded` parser
  * change `urlencoded` extended array limit to 100
  * respond with 413 when over `parameterLimit` in `urlencoded`

1.6.7 / 2014-08-29
==================

  * deps: qs@2.2.2
    - Remove unnecessary cloning

1.6.6 / 2014-08-27
==================

  * deps: qs@2.2.0
    - Array parsing fix
    - Performance improvements

1.6.5 / 2014-08-16
==================

  * deps: on-finished@2.1.0

1.6.4 / 2014-08-14
==================

  * deps: qs@1.2.2

1.6.3 / 2014-08-10
==================

  * deps: qs@1.2.1

1.6.2 / 2014-08-07
==================

  * deps: qs@1.2.0
    - Fix parsing array of objects

1.6.1 / 2014-08-06
==================

  * deps: qs@1.1.0
    - Accept urlencoded square brackets
    - Accept empty values in implicit array notation

1.6.0 / 2014-08-05
==================

  * deps: qs@1.0.2
    - Complete rewrite
    - Limits array length to 20
    - Limits object depth to 5
    - Limits parameters to 1,000

1.5.2 / 2014-07-27
==================

  * deps: depd@0.4.4
    - Work-around v8 generating empty stack traces

1.5.1 / 2014-07-26
==================

  * deps: depd@0.4.3
    - Fix exception when global `Error.stackTraceLimit` is too low

1.5.0 / 2014-07-20
==================

  * deps: depd@0.4.2
    - Add `TRACE_DEPRECATION` environment variable
    - Remove non-standard grey color from color output
    - Support `--no-deprecation` argument
    - Support `--trace-deprecation` argument
  * deps: iconv-lite@0.4.4
    - Added encoding UTF-7
  * deps: raw-body@1.3.0
    - deps: iconv-lite@0.4.4
    - Added encoding UTF-7
    - Fix `Cannot switch to old mode now` error on Node.js 0.10+
  * deps: type-is@~1.3.2

1.4.3 / 2014-06-19
==================

  * deps: type-is@1.3.1
    - fix global variable leak

1.4.2 / 2014-06-19
==================

  * deps: type-is@1.3.0
    - improve type parsing

1.4.1 / 2014-06-19
==================

  * fix urlencoded extended deprecation message

1.4.0 / 2014-06-19
==================

  * add `text` parser
  * add `raw` parser
  * check accepted charset in content-type (accepts utf-8)
  * check accepted encoding in content-encoding (accepts identity)
  * deprecate `bodyParser()` middleware; use `.json()` and `.urlencoded()` as needed
  * deprecate `urlencoded()` without provided `extended` option
  * lazy-load urlencoded parsers
  * parsers split into files for reduced mem usage
  * support gzip and deflate bodies
    - set `inflate: false` to turn off
  * deps: raw-body@1.2.2
    - Support all encodings from `iconv-lite`

1.3.1 / 2014-06-11
==================

  * deps: type-is@1.2.1
    - Switch dependency from mime to mime-types@1.0.0

1.3.0 / 2014-05-31
==================

  * add `extended` option to urlencoded parser

1.2.2 / 2014-05-27
==================

  * deps: raw-body@1.1.6
    - assert stream encoding on node.js 0.8
    - assert stream encoding on node.js < 0.10.6
    - deps: bytes@1

1.2.1 / 2014-05-26
==================

  * invoke `next(err)` after request fully read
    - prevents hung responses and socket hang ups

1.2.0 / 2014-05-11
==================

  * add `verify` option
  * deps: type-is@1.2.0
    - support suffix matching

1.1.2 / 2014-05-11
==================

  * improve json parser speed

1.1.1 / 2014-05-11
==================

  * fix repeated limit parsing with every request

1.1.0 / 2014-05-10
==================

  * add `type` option
  * deps: pin for safety and consistency

1.0.2 / 2014-04-14
==================

  * use `type-is` module

1.0.1 / 2014-03-20
==================

  * lower default limits to 100kb
(The MIT License)

Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
Copyright (c) 2014-2015 Douglas Christopher Wilson <doug@somethingdoug.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.
# Security Policies and Procedures

## Reporting a Bug

The Express team and community take all security bugs seriously. Thank you
for improving the security of Express. We appreciate your efforts and
responsible disclosure and will make every effort to acknowledge your
contributions.

Report security bugs by emailing the current owner(s) of `body-parser`. This
information can be found in the npm registry using the command
`npm owner ls body-parser`.
If unsure or unable to get the information from the above, open an issue
in the [project issue tracker](https://github.com/expressjs/body-parser/issues)
asking for the current contact information.

To ensure the timely response to your report, please ensure that the entirety
of the report is contained within the email body and not solely behind a web
link or an attachment.

At least one owner will acknowledge your email within 48 hours, and will send a
more detailed response within 48 hours indicating the next steps in handling
your report. After the initial reply to your report, the owners will
endeavor to keep you informed of the progress towards a fix and full
announcement, and may ask for additional information or guidance.
/*!
 * body-parser
 * Copyright(c) 2014-2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module dependencies.
 * @private
 */

var deprecate = require('depd')('body-parser')

/**
 * Cache of loaded parsers.
 * @private
 */

var parsers = Object.create(null)

/**
 * @typedef Parsers
 * @type {function}
 * @property {function} json
 * @property {function} raw
 * @property {function} text
 * @property {function} urlencoded
 */

/**
 * Module exports.
 * @type {Parsers}
 */

exports = module.exports = deprecate.function(bodyParser,
  'bodyParser: use individual json/urlencoded middlewares')

/**
 * JSON parser.
 * @public
 */

Object.defineProperty(exports, 'json', {
  configurable: true,
  enumerable: true,
  get: createParserGetter('json')
})

/**
 * Raw parser.
 * @public
 */

Object.defineProperty(exports, 'raw', {
  configurable: true,
  enumerable: true,
  get: createParserGetter('raw')
})

/**
 * Text parser.
 * @public
 */

Object.defineProperty(exports, 'text', {
  configurable: true,
  enumerable: true,
  get: createParserGetter('text')
})

/**
 * URL-encoded parser.
 * @public
 */

Object.defineProperty(exports, 'urlencoded', {
  configurable: true,
  enumerable: true,
  get: createParserGetter('urlencoded')
})

/**
 * Create a middleware to parse json and urlencoded bodies.
 *
 * @param {object} [options]
 * @return {function}
 * @deprecated
 * @public
 */

function bodyParser (options) {
  var opts = {}

  // exclude type option
  if (options) {
    for (var prop in options) {
      if (prop !== 'type') {
        opts[prop] = options[prop]
      }
    }
  }

  var _urlencoded = exports.urlencoded(opts)
  var _json = exports.json(opts)

  return function bodyParser (req, res, next) {
    _json(req, res, function (err) {
      if (err) return next(err)
      _urlencoded(req, res, next)
    })
  }
}

/**
 * Create a getter for loading a parser.
 * @private
 */

function createParserGetter (name) {
  return function get () {
    return loadParser(name)
  }
}

/**
 * Load a parser module.
 * @private
 */

function loadParser (parserName) {
  var parser = parsers[parserName]

  if (parser !== undefined) {
    return parser
  }

  // this uses a switch for static require analysis
  switch (parserName) {
    case 'json':
      parser = require('./lib/types/json')
      break
    case 'raw':
      parser = require('./lib/types/raw')
      break
    case 'text':
      parser = require('./lib/types/text')
      break
    case 'urlencoded':
      parser = require('./lib/types/urlencoded')
      break
  }

  // store to prevent invoking require()
  return (parsers[parserName] = parser)
}
{
  "name": "body-parser",
  "description": "Node.js body parsing middleware",
  "version": "1.20.0",
  "license": "MIT",
  "repository": "expressjs/body-parser",
  "dependencies": {
    "bytes": "3.1.2",
    "content-type": "~1.0.4",
    "debug": "2.6.9",
    "depd": "2.0.0",
    "destroy": "1.2.0",
    "http-errors": "2.0.0",
    "iconv-lite": "0.4.24",
    "on-finished": "2.4.1",
    "qs": "6.10.3",
    "raw-body": "2.5.1",
    "type-is": "~1.6.18",
    "unpipe": "1.0.0"
  },
  "devDependencies": {
    "eslint": "7.32.0",
    "eslint-config-standard": "14.1.1",
    "eslint-plugin-import": "2.25.4",
    "eslint-plugin-markdown": "2.2.1",
    "eslint-plugin-node": "11.1.0",
    "eslint-plugin-promise": "5.2.0",
    "eslint-plugin-standard": "4.1.0",
    "methods": "1.1.2",
    "mocha": "9.2.2",
    "nyc": "15.1.0",
    "safe-buffer": "5.2.1",
    "supertest": "6.2.2"
  },
  "files": [
    "lib/",
    "LICENSE",
    "HISTORY.md",
    "SECURITY.md",
    "index.js"
  ],
  "engines": {
    "node": ">= 0.8",
    "npm": "1.2.8000 || >= 1.4.16"
  }
}/*!
 * body-parser
 * Copyright(c) 2014-2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module dependencies.
 * @private
 */

var createError = require('http-errors')
var destroy = require('destroy')
var getBody = require('raw-body')
var iconv = require('iconv-lite')
var onFinished = require('on-finished')
var unpipe = require('unpipe')
var zlib = require('zlib')

/**
 * Module exports.
 */

module.exports = read

/**
 * Read a request into a buffer and parse.
 *
 * @param {object} req
 * @param {object} res
 * @param {function} next
 * @param {function} parse
 * @param {function} debug
 * @param {object} options
 * @private
 */

function read (req, res, next, parse, debug, options) {
  var length
  var opts = options
  var stream

  // flag as parsed
  req._body = true

  // read options
  var encoding = opts.encoding !== null
    ? opts.encoding
    : null
  var verify = opts.verify

  try {
    // get the content stream
    stream = contentstream(req, debug, opts.inflate)
    length = stream.length
    stream.length = undefined
  } catch (err) {
    return next(err)
  }

  // set raw-body options
  opts.length = length
  opts.encoding = verify
    ? null
    : encoding

  // assert charset is supported
  if (opts.encoding === null && encoding !== null && !iconv.encodingExists(encoding)) {
    return next(createError(415, 'unsupported charset "' + encoding.toUpperCase() + '"', {
      charset: encoding.toLowerCase(),
      type: 'charset.unsupported'
    }))
  }

  // read body
  debug('read body')
  getBody(stream, opts, function (error, body) {
    if (error) {
      var _error

      if (error.type === 'encoding.unsupported') {
        // echo back charset
        _error = createError(415, 'unsupported charset "' + encoding.toUpperCase() + '"', {
          charset: encoding.toLowerCase(),
          type: 'charset.unsupported'
        })
      } else {
        // set status code on error
        _error = createError(400, error)
      }

      // unpipe from stream and destroy
      if (stream !== req) {
        unpipe(req)
        destroy(stream, true)
      }

      // read off entire request
      dump(req, function onfinished () {
        next(createError(400, _error))
      })
      return
    }

    // verify
    if (verify) {
      try {
        debug('verify body')
        verify(req, res, body, encoding)
      } catch (err) {
        next(createError(403, err, {
          body: body,
          type: err.type || 'entity.verify.failed'
        }))
        return
      }
    }

    // parse
    var str = body
    try {
      debug('parse body')
      str = typeof body !== 'string' && encoding !== null
        ? iconv.decode(body, encoding)
        : body
      req.body = parse(str)
    } catch (err) {
      next(createError(400, err, {
        body: str,
        type: err.type || 'entity.parse.failed'
      }))
      return
    }

    next()
  })
}

/**
 * Get the content stream of the request.
 *
 * @param {object} req
 * @param {function} debug
 * @param {boolean} [inflate=true]
 * @return {object}
 * @api private
 */

function contentstream (req, debug, inflate) {
  var encoding = (req.headers['content-encoding'] || 'identity').toLowerCase()
  var length = req.headers['content-length']
  var stream

  debug('content-encoding "%s"', encoding)

  if (inflate === false && encoding !== 'identity') {
    throw createError(415, 'content encoding unsupported', {
      encoding: encoding,
      type: 'encoding.unsupported'
    })
  }

  switch (encoding) {
    case 'deflate':
      stream = zlib.createInflate()
      debug('inflate body')
      req.pipe(stream)
      break
    case 'gzip':
      stream = zlib.createGunzip()
      debug('gunzip body')
      req.pipe(stream)
      break
    case 'identity':
      stream = req
      stream.length = length
      break
    default:
      throw createError(415, 'unsupported content encoding "' + encoding + '"', {
        encoding: encoding,
        type: 'encoding.unsupported'
      })
  }

  return stream
}

/**
 * Dump the contents of a request.
 *
 * @param {object} req
 * @param {function} callback
 * @api private
 */

function dump (req, callback) {
  if (onFinished.isFinished(req)) {
    callback(null)
  } else {
    onFinished(req, callback)
    req.resume()
  }
}
/*!
 * body-parser
 * Copyright(c) 2014 Jonathan Ong
 * Copyright(c) 2014-2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module dependencies.
 * @private
 */

var bytes = require('bytes')
var contentType = require('content-type')
var createError = require('http-errors')
var debug = require('debug')('body-parser:json')
var read = require('../read')
var typeis = require('type-is')

/**
 * Module exports.
 */

module.exports = json

/**
 * RegExp to match the first non-space in a string.
 *
 * Allowed whitespace is defined in RFC 7159:
 *
 *    ws = *(
 *            %x20 /              ; Space
 *            %x09 /              ; Horizontal tab
 *            %x0A /              ; Line feed or New line
 *            %x0D )              ; Carriage return
 */

var FIRST_CHAR_REGEXP = /^[\x20\x09\x0a\x0d]*([^\x20\x09\x0a\x0d])/ // eslint-disable-line no-control-regex

/**
 * Create a middleware to parse JSON bodies.
 *
 * @param {object} [options]
 * @return {function}
 * @public
 */

function json (options) {
  var opts = options || {}

  var limit = typeof opts.limit !== 'number'
    ? bytes.parse(opts.limit || '100kb')
    : opts.limit
  var inflate = opts.inflate !== false
  var reviver = opts.reviver
  var strict = opts.strict !== false
  var type = opts.type || 'application/json'
  var verify = opts.verify || false

  if (verify !== false && typeof verify !== 'function') {
    throw new TypeError('option verify must be function')
  }

  // create the appropriate type checking function
  var shouldParse = typeof type !== 'function'
    ? typeChecker(type)
    : type

  function parse (body) {
    if (body.length === 0) {
      // special-case empty json body, as it's a common client-side mistake
      // TODO: maybe make this configurable or part of "strict" option
      return {}
    }

    if (strict) {
      var first = firstchar(body)

      if (first !== '{' && first !== '[') {
        debug('strict violation')
        throw createStrictSyntaxError(body, first)
      }
    }

    try {
      debug('parse json')
      return JSON.parse(body, reviver)
    } catch (e) {
      throw normalizeJsonSyntaxError(e, {
        message: e.message,
        stack: e.stack
      })
    }
  }

  return function jsonParser (req, res, next) {
    if (req._body) {
      debug('body already parsed')
      next()
      return
    }

    req.body = req.body || {}

    // skip requests without bodies
    if (!typeis.hasBody(req)) {
      debug('skip empty body')
      next()
      return
    }

    debug('content-type %j', req.headers['content-type'])

    // determine if request should be parsed
    if (!shouldParse(req)) {
      debug('skip parsing')
      next()
      return
    }

    // assert charset per RFC 7159 sec 8.1
    var charset = getCharset(req) || 'utf-8'
    if (charset.slice(0, 4) !== 'utf-') {
      debug('invalid charset')
      next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', {
        charset: charset,
        type: 'charset.unsupported'
      }))
      return
    }

    // read
    read(req, res, next, parse, debug, {
      encoding: charset,
      inflate: inflate,
      limit: limit,
      verify: verify
    })
  }
}

/**
 * Create strict violation syntax error matching native error.
 *
 * @param {string} str
 * @param {string} char
 * @return {Error}
 * @private
 */

function createStrictSyntaxError (str, char) {
  var index = str.indexOf(char)
  var partial = index !== -1
    ? str.substring(0, index) + '#'
    : ''

  try {
    JSON.parse(partial); /* istanbul ignore next */ throw new SyntaxError('strict violation')
  } catch (e) {
    return normalizeJsonSyntaxError(e, {
      message: e.message.replace('#', char),
      stack: e.stack
    })
  }
}

/**
 * Get the first non-whitespace character in a string.
 *
 * @param {string} str
 * @return {function}
 * @private
 */

function firstchar (str) {
  var match = FIRST_CHAR_REGEXP.exec(str)

  return match
    ? match[1]
    : undefined
}

/**
 * Get the charset of a request.
 *
 * @param {object} req
 * @api private
 */

function getCharset (req) {
  try {
    return (contentType.parse(req).parameters.charset || '').toLowerCase()
  } catch (e) {
    return undefined
  }
}

/**
 * Normalize a SyntaxError for JSON.parse.
 *
 * @param {SyntaxError} error
 * @param {object} obj
 * @return {SyntaxError}
 */

function normalizeJsonSyntaxError (error, obj) {
  var keys = Object.getOwnPropertyNames(error)

  for (var i = 0; i < keys.length; i++) {
    var key = keys[i]
    if (key !== 'stack' && key !== 'message') {
      delete error[key]
    }
  }

  // replace stack before message for Node.js 0.10 and below
  error.stack = obj.stack.replace(error.message, obj.message)
  error.message = obj.message

  return error
}

/**
 * Get the simple type checker.
 *
 * @param {string} type
 * @return {function}
 */

function typeChecker (type) {
  return function checkType (req) {
    return Boolean(typeis(req, type))
  }
}
/*!
 * body-parser
 * Copyright(c) 2014-2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module dependencies.
 */

var bytes = require('bytes')
var debug = require('debug')('body-parser:raw')
var read = require('../read')
var typeis = require('type-is')

/**
 * Module exports.
 */

module.exports = raw

/**
 * Create a middleware to parse raw bodies.
 *
 * @param {object} [options]
 * @return {function}
 * @api public
 */

function raw (options) {
  var opts = options || {}

  var inflate = opts.inflate !== false
  var limit = typeof opts.limit !== 'number'
    ? bytes.parse(opts.limit || '100kb')
    : opts.limit
  var type = opts.type || 'application/octet-stream'
  var verify = opts.verify || false

  if (verify !== false && typeof verify !== 'function') {
    throw new TypeError('option verify must be function')
  }

  // create the appropriate type checking function
  var shouldParse = typeof type !== 'function'
    ? typeChecker(type)
    : type

  function parse (buf) {
    return buf
  }

  return function rawParser (req, res, next) {
    if (req._body) {
      debug('body already parsed')
      next()
      return
    }

    req.body = req.body || {}

    // skip requests without bodies
    if (!typeis.hasBody(req)) {
      debug('skip empty body')
      next()
      return
    }

    debug('content-type %j', req.headers['content-type'])

    // determine if request should be parsed
    if (!shouldParse(req)) {
      debug('skip parsing')
      next()
      return
    }

    // read
    read(req, res, next, parse, debug, {
      encoding: null,
      inflate: inflate,
      limit: limit,
      verify: verify
    })
  }
}

/**
 * Get the simple type checker.
 *
 * @param {string} type
 * @return {function}
 */

function typeChecker (type) {
  return function checkType (req) {
    return Boolean(typeis(req, type))
  }
}
/*!
 * body-parser
 * Copyright(c) 2014-2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module dependencies.
 */

var bytes = require('bytes')
var contentType = require('content-type')
var debug = require('debug')('body-parser:text')
var read = require('../read')
var typeis = require('type-is')

/**
 * Module exports.
 */

module.exports = text

/**
 * Create a middleware to parse text bodies.
 *
 * @param {object} [options]
 * @return {function}
 * @api public
 */

function text (options) {
  var opts = options || {}

  var defaultCharset = opts.defaultCharset || 'utf-8'
  var inflate = opts.inflate !== false
  var limit = typeof opts.limit !== 'number'
    ? bytes.parse(opts.limit || '100kb')
    : opts.limit
  var type = opts.type || 'text/plain'
  var verify = opts.verify || false

  if (verify !== false && typeof verify !== 'function') {
    throw new TypeError('option verify must be function')
  }

  // create the appropriate type checking function
  var shouldParse = typeof type !== 'function'
    ? typeChecker(type)
    : type

  function parse (buf) {
    return buf
  }

  return function textParser (req, res, next) {
    if (req._body) {
      debug('body already parsed')
      next()
      return
    }

    req.body = req.body || {}

    // skip requests without bodies
    if (!typeis.hasBody(req)) {
      debug('skip empty body')
      next()
      return
    }

    debug('content-type %j', req.headers['content-type'])

    // determine if request should be parsed
    if (!shouldParse(req)) {
      debug('skip parsing')
      next()
      return
    }

    // get charset
    var charset = getCharset(req) || defaultCharset

    // read
    read(req, res, next, parse, debug, {
      encoding: charset,
      inflate: inflate,
      limit: limit,
      verify: verify
    })
  }
}

/**
 * Get the charset of a request.
 *
 * @param {object} req
 * @api private
 */

function getCharset (req) {
  try {
    return (contentType.parse(req).parameters.charset || '').toLowerCase()
  } catch (e) {
    return undefined
  }
}

/**
 * Get the simple type checker.
 *
 * @param {string} type
 * @return {function}
 */

function typeChecker (type) {
  return function checkType (req) {
    return Boolean(typeis(req, type))
  }
}
/*!
 * body-parser
 * Copyright(c) 2014 Jonathan Ong
 * Copyright(c) 2014-2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module dependencies.
 * @private
 */

var bytes = require('bytes')
var contentType = require('content-type')
var createError = require('http-errors')
var debug = require('debug')('body-parser:urlencoded')
var deprecate = require('depd')('body-parser')
var read = require('../read')
var typeis = require('type-is')

/**
 * Module exports.
 */

module.exports = urlencoded

/**
 * Cache of parser modules.
 */

var parsers = Object.create(null)

/**
 * Create a middleware to parse urlencoded bodies.
 *
 * @param {object} [options]
 * @return {function}
 * @public
 */

function urlencoded (options) {
  var opts = options || {}

  // notice because option default will flip in next major
  if (opts.extended === undefined) {
    deprecate('undefined extended: provide extended option')
  }

  var extended = opts.extended !== false
  var inflate = opts.inflate !== false
  var limit = typeof opts.limit !== 'number'
    ? bytes.parse(opts.limit || '100kb')
    : opts.limit
  var type = opts.type || 'application/x-www-form-urlencoded'
  var verify = opts.verify || false

  if (verify !== false && typeof verify !== 'function') {
    throw new TypeError('option verify must be function')
  }

  // create the appropriate query parser
  var queryparse = extended
    ? extendedparser(opts)
    : simpleparser(opts)

  // create the appropriate type checking function
  var shouldParse = typeof type !== 'function'
    ? typeChecker(type)
    : type

  function parse (body) {
    return body.length
      ? queryparse(body)
      : {}
  }

  return function urlencodedParser (req, res, next) {
    if (req._body) {
      debug('body already parsed')
      next()
      return
    }

    req.body = req.body || {}

    // skip requests without bodies
    if (!typeis.hasBody(req)) {
      debug('skip empty body')
      next()
      return
    }

    debug('content-type %j', req.headers['content-type'])

    // determine if request should be parsed
    if (!shouldParse(req)) {
      debug('skip parsing')
      next()
      return
    }

    // assert charset
    var charset = getCharset(req) || 'utf-8'
    if (charset !== 'utf-8') {
      debug('invalid charset')
      next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', {
        charset: charset,
        type: 'charset.unsupported'
      }))
      return
    }

    // read
    read(req, res, next, parse, debug, {
      debug: debug,
      encoding: charset,
      inflate: inflate,
      limit: limit,
      verify: verify
    })
  }
}

/**
 * Get the extended query parser.
 *
 * @param {object} options
 */

function extendedparser (options) {
  var parameterLimit = options.parameterLimit !== undefined
    ? options.parameterLimit
    : 1000
  var parse = parser('qs')

  if (isNaN(parameterLimit) || parameterLimit < 1) {
    throw new TypeError('option parameterLimit must be a positive number')
  }

  if (isFinite(parameterLimit)) {
    parameterLimit = parameterLimit | 0
  }

  return function queryparse (body) {
    var paramCount = parameterCount(body, parameterLimit)

    if (paramCount === undefined) {
      debug('too many parameters')
      throw createError(413, 'too many parameters', {
        type: 'parameters.too.many'
      })
    }

    var arrayLimit = Math.max(100, paramCount)

    debug('parse extended urlencoding')
    return parse(body, {
      allowPrototypes: true,
      arrayLimit: arrayLimit,
      depth: Infinity,
      parameterLimit: parameterLimit
    })
  }
}

/**
 * Get the charset of a request.
 *
 * @param {object} req
 * @api private
 */

function getCharset (req) {
  try {
    return (contentType.parse(req).parameters.charset || '').toLowerCase()
  } catch (e) {
    return undefined
  }
}

/**
 * Count the number of parameters, stopping once limit reached
 *
 * @param {string} body
 * @param {number} limit
 * @api private
 */

function parameterCount (body, limit) {
  var count = 0
  var index = 0

  while ((index = body.indexOf('&', index)) !== -1) {
    count++
    index++

    if (count === limit) {
      return undefined
    }
  }

  return count
}

/**
 * Get parser for module name dynamically.
 *
 * @param {string} name
 * @return {function}
 * @api private
 */

function parser (name) {
  var mod = parsers[name]

  if (mod !== undefined) {
    return mod.parse
  }

  // this uses a switch for static require analysis
  switch (name) {
    case 'qs':
      mod = require('qs')
      break
    case 'querystring':
      mod = require('querystring')
      break
  }

  // store to prevent invoking require()
  parsers[name] = mod

  return mod.parse
}

/**
 * Get the simple query parser.
 *
 * @param {object} options
 */

function simpleparser (options) {
  var parameterLimit = options.parameterLimit !== undefined
    ? options.parameterLimit
    : 1000
  var parse = parser('querystring')

  if (isNaN(parameterLimit) || parameterLimit < 1) {
    throw new TypeError('option parameterLimit must be a positive number')
  }

  if (isFinite(parameterLimit)) {
    parameterLimit = parameterLimit | 0
  }

  return function queryparse (body) {
    var paramCount = parameterCount(body, parameterLimit)

    if (paramCount === undefined) {
      debug('too many parameters')
      throw createError(413, 'too many parameters', {
        type: 'parameters.too.many'
      })
    }

    debug('parse urlencoding')
    return parse(body, undefined, undefined, { maxKeys: parameterLimit })
  }
}

/**
 * Get the simple type checker.
 *
 * @param {string} type
 * @return {function}
 */

function typeChecker (type) {
  return function checkType (req) {
    return Boolean(typeis(req, type))
  }
}
{
  "presets": [
    ["@babel/preset-env", {}]
  ]
}{
  "presets": [
    ["@babel/preset-env", {
      "targets": {
        "node": "6.0"
      }
    }]
  ]
}REDIS_HOST=127.0.0.1
REDIS_PORT=6379
The MIT License (MIT)

Copyright (c) 2014 Simon Grondin

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.
declare module "bottleneck" {
    namespace Bottleneck {
        type ConstructorOptions = {
            /**
             * How many jobs can be running at the same time.
             */
            readonly maxConcurrent?: number | null;
            /**
             * How long to wait after launching a job before launching another one.
             */
            readonly minTime?: number | null;
            /**
             * How long can the queue get? When the queue length exceeds that value, the selected `strategy` is executed to shed the load.
             */
            readonly highWater?: number | null;
            /**
             * Which strategy to use if the queue gets longer than the high water mark.
             */
            readonly strategy?: Bottleneck.Strategy | null;
            /**
             * The `penalty` value used by the `Bottleneck.strategy.BLOCK` strategy.
             */
            readonly penalty?: number | null;
            /**
             * How many jobs can be executed before the limiter stops executing jobs. If `reservoir` reaches `0`, no jobs will be executed until it is no longer `0`.
             */
            readonly reservoir?: number | null;
            /**
             * Every `reservoirRefreshInterval` milliseconds, the `reservoir` value will be automatically reset to `reservoirRefreshAmount`.
             */
            readonly reservoirRefreshInterval?: number | null;
            /**
             * The value to reset `reservoir` to when `reservoirRefreshInterval` is in use.
             */
            readonly reservoirRefreshAmount?: number | null;
            /**
             * The increment applied to `reservoir` when `reservoirIncreaseInterval` is in use.
             */
            readonly reservoirIncreaseAmount?: number | null;
            /**
             * Every `reservoirIncreaseInterval` milliseconds, the `reservoir` value will be automatically incremented by `reservoirIncreaseAmount`.
             */
            readonly reservoirIncreaseInterval?: number | null;
            /**
             * The maximum value that `reservoir` can reach when `reservoirIncreaseInterval` is in use.
             */
            readonly reservoirIncreaseMaximum?: number | null;
            /**
             * Optional identifier
             */
            readonly id?: string | null;
            /**
             * Set to true to leave your failed jobs hanging instead of failing them.
             */
            readonly rejectOnDrop?: boolean | null;
            /**
             * Set to true to keep track of done jobs with counts() and jobStatus(). Uses more memory.
             */
            readonly trackDoneStatus?: boolean | null;
            /**
             * Where the limiter stores its internal state. The default (`local`) keeps the state in the limiter itself. Set it to `redis` to enable Clustering.
             */
            readonly datastore?: string | null;
            /**
             * Override the Promise library used by Bottleneck.
             */
            readonly Promise?: any;
            /**
             * This object is passed directly to the redis client library you've selected.
             */
            readonly clientOptions?: any;
            /**
             * **ioredis only.** When `clusterNodes` is not null, the client will be instantiated by calling `new Redis.Cluster(clusterNodes, clientOptions)`.
             */
            readonly clusterNodes?: any;
            /**
             * An existing Bottleneck.RedisConnection or Bottleneck.IORedisConnection object to use.
             * If using, `datastore`, `clientOptions` and `clusterNodes` will be ignored.
             */
            /**
             * Optional Redis/IORedis library from `require('ioredis')` or equivalent. If not, Bottleneck will attempt to require Redis/IORedis at runtime.
             */
            readonly Redis?: any;
            /**
             * Bottleneck connection object created from `new Bottleneck.RedisConnection` or `new Bottleneck.IORedisConnection`.
             */
            readonly connection?: Bottleneck.RedisConnection | Bottleneck.IORedisConnection | null;
            /**
             * When set to `true`, on initial startup, the limiter will wipe any existing Bottleneck state data on the Redis db.
             */
            readonly clearDatastore?: boolean | null;
            /**
             * The Redis TTL in milliseconds for the keys created by the limiter. When `timeout` is set, the limiter's state will be automatically removed from Redis after timeout milliseconds of inactivity. Note: timeout is 300000 (5 minutes) by default when using a Group.
             */
             readonly timeout?: number | null;

            [propName: string]: any;
        };
        type JobOptions = {
            /**
             * A priority between `0` and `9`. A job with a priority of `4` will _always_ be executed before a job with a priority of `5`.
             */
            readonly priority?: number | null;
            /**
             * Must be an integer equal to or higher than `0`. The `weight` is what increases the number of running jobs (up to `maxConcurrent`, if using) and decreases the `reservoir` value (if using).
             */
            readonly weight?: number | null;
            /**
             * The number milliseconds a job has to finish. Jobs that take longer than their `expiration` will be failed with a `BottleneckError`.
             */
            readonly expiration?: number | null;
            /**
             * Optional identifier, helps with debug output.
             */
            readonly id?: string | null;
        };
        type StopOptions = {
            /**
             * When `true`, drop all the RECEIVED, QUEUED and RUNNING jobs. When `false`, allow those jobs to complete before resolving the Promise returned by this method.
             */
            readonly dropWaitingJobs?: boolean | null;
            /**
             * The error message used to drop jobs when `dropWaitingJobs` is `true`.
             */
            readonly dropErrorMessage?: string | null;
            /**
             * The error message used to reject a job added to the limiter after `stop()` has been called.
             */
            readonly enqueueErrorMessage?: string | null;
        };
        type Callback<T> = (err: any, result: T) => void;
        type ClientsList = { client?: any; subscriber?: any };
        type GroupLimiterPair = { key: string; limiter: Bottleneck };
        interface Strategy {}

        type EventInfo = {
            readonly args: any[];
            readonly options: {
                readonly id: string;
                readonly priority: number;
                readonly weight: number;
                readonly expiration?: number;
            };
        };
        type EventInfoDropped = EventInfo & {
            readonly task: Function;
            readonly promise: Promise<any>;
        };
        type EventInfoQueued = EventInfo & {
            readonly reachedHWM: boolean;
            readonly blocked: boolean;
        };
        type EventInfoRetryable = EventInfo & { readonly retryCount: number; };

        enum Status {
            RECEIVED = "RECEIVED",
            QUEUED = "QUEUED",
            RUNNING = "RUNNING",
            EXECUTING = "EXECUTING",
            DONE = "DONE"
        }
        type Counts = {
            RECEIVED: number,
            QUEUED: number,
            RUNNING: number,
            EXECUTING: number,
            DONE?: number
        };

        type RedisConnectionOptions = {
            /**
             * This object is passed directly to NodeRedis' createClient() method.
             */
            readonly clientOptions?: any;
            /**
             * An existing NodeRedis client to use. If using, `clientOptions` will be ignored.
             */
            readonly client?: any;
            /**
             * Optional Redis library from `require('redis')` or equivalent. If not, Bottleneck will attempt to require Redis at runtime.
             */
            readonly Redis?: any;
        };

        type IORedisConnectionOptions = {
            /**
             * This object is passed directly to ioredis' constructor method.
             */
            readonly clientOptions?: any;
            /**
             * When `clusterNodes` is not null, the client will be instantiated by calling `new Redis.Cluster(clusterNodes, clientOptions)`.
             */
            readonly clusterNodes?: any;
            /**
             * An existing ioredis client to use. If using, `clientOptions` and `clusterNodes` will be ignored.
             */
            readonly client?: any;
            /**
             * Optional IORedis library from `require('ioredis')` or equivalent. If not, Bottleneck will attempt to require IORedis at runtime.
             */
            readonly Redis?: any;
        };

        type BatcherOptions = {
            /**
             * Maximum acceptable time (in milliseconds) a request can have to wait before being flushed to the `"batch"` event.
             */
            readonly maxTime?: number | null;
            /**
             * Maximum number of requests in a batch.
             */
            readonly maxSize?: number | null;
        };

        class BottleneckError extends Error {
        }

        class RedisConnection {
            constructor(options?: Bottleneck.RedisConnectionOptions);

            /**
             * Register an event listener.
             * @param name - The event name.
             * @param fn - The callback function.
             */
            on(name: "error", fn: (error: any) => void): void;

            /**
             * Register an event listener for one event only.
             * @param name - The event name.
             * @param fn - The callback function.
             */
            once(name: "error", fn: (error: any) => void): void;

            /**
             * Waits until the connection is ready and returns the raw Node_Redis clients.
             */
            ready(): Promise<ClientsList>;

            /**
             * Close the redis clients.
             * @param flush - Write transient data before closing.
             */
            disconnect(flush?: boolean): Promise<void>;
        }

        class IORedisConnection {
            constructor(options?: Bottleneck.IORedisConnectionOptions);

            /**
             * Register an event listener.
             * @param name - The event name.
             * @param fn - The callback function.
             */
            on(name: "error", fn: (error: any) => void): void;

            /**
             * Register an event listener for one event only.
             * @param name - The event name.
             * @param fn - The callback function.
             */
            once(name: "error", fn: (error: any) => void): void;

            /**
             * Waits until the connection is ready and returns the raw ioredis clients.
             */
            ready(): Promise<ClientsList>;

            /**
             * Close the redis clients.
             * @param flush - Write transient data before closing.
             */
            disconnect(flush?: boolean): Promise<void>;
        }

        class Batcher {
            constructor(options?: Bottleneck.BatcherOptions);

            /**
             * Register an event listener.
             * @param name - The event name.
             * @param fn - The callback function.
             */
            on(name: string, fn: Function): void;
            on(name: "error", fn: (error: any) => void): void;
            on(name: "batch", fn: (batch: any[]) => void): void;

            /**
             * Register an event listener for one event only.
             * @param name - The event name.
             * @param fn - The callback function.
             */
            once(name: string, fn: Function): void;
            once(name: "error", fn: (error: any) => void): void;
            once(name: "batch", fn: (batch: any[]) => void): void;

            /**
             * Add a request to the Batcher. Batches are flushed to the "batch" event.
             */
            add(data: any): Promise<void>;
        }

        class Group {
            constructor(options?: Bottleneck.ConstructorOptions);

            id: string;
            datastore: string;
            connection?: Bottleneck.RedisConnection | Bottleneck.IORedisConnection;

            /**
             * Returns the limiter for the specified key.
             * @param str - The limiter key.
             */
            key(str: string): Bottleneck;

            /**
             * Register an event listener.
             * @param name - The event name.
             * @param fn - The callback function.
             */
            on(name: string, fn: Function): void;
            on(name: "error", fn: (error: any) => void): void;
            on(name: "created", fn: (limiter: Bottleneck, key: string) => void): void;

            /**
             * Register an event listener for one event only.
             * @param name - The event name.
             * @param fn - The callback function.
             */
            once(name: string, fn: Function): void;
            once(name: "error", fn: (error: any) => void): void;
            once(name: "created", fn: (limiter: Bottleneck, key: string) => void): void;

            /**
             * Removes all registered event listeners.
             * @param name - The optional event name to remove listeners from.
             */
            removeAllListeners(name?: string): void;

            /**
             * Updates the group settings.
             * @param options - The new settings.
             */
            updateSettings(options: Bottleneck.ConstructorOptions): void;

            /**
             * Deletes the limiter for the given key.
             * Returns true if a key was deleted.
             * @param str - The key
             */
            deleteKey(str: string): Promise<boolean>;

            /**
             * Disconnects the underlying redis clients, unless the Group was created with the `connection` option.
             * @param flush - Write transient data before closing.
             */
            disconnect(flush?: boolean): Promise<void>;

            /**
             * Returns all the key-limiter pairs.
             */
            limiters(): Bottleneck.GroupLimiterPair[];

            /**
             * Returns all Group keys in the local instance
             */
            keys(): string[];

            /**
             * Returns all Group keys in the Cluster
             */
            clusterKeys(): Promise<string[]>;
        }

        class Events {
            constructor(object: Object);

            /**
             * Returns the number of limiters for the event name
             * @param name - The event name.
             */
            listenerCount(name: string): number;

            /**
             * Returns a promise with the first non-null/non-undefined result from a listener
             * @param name - The event name.
             * @param args - The arguments to pass to the event listeners.
             */
            trigger(name: string, ...args: any[]): Promise<any>;
        }
    }

    class Bottleneck {
        public static readonly strategy: {
            /**
             * When adding a new job to a limiter, if the queue length reaches `highWater`, drop the oldest job with the lowest priority. This is useful when jobs that have been waiting for too long are not important anymore. If all the queued jobs are more important (based on their `priority` value) than the one being added, it will not be added.
             */
            readonly LEAK: Bottleneck.Strategy;
            /**
             * Same as `LEAK`, except it will only drop jobs that are less important than the one being added. If all the queued jobs are as or more important than the new one, it will not be added.
             */
            readonly OVERFLOW_PRIORITY: Bottleneck.Strategy;
            /**
             * When adding a new job to a limiter, if the queue length reaches `highWater`, do not add the new job. This strategy totally ignores priority levels.
             */
            readonly OVERFLOW: Bottleneck.Strategy;
            /**
             * When adding a new job to a limiter, if the queue length reaches `highWater`, the limiter falls into "blocked mode". All queued jobs are dropped and no new jobs will be accepted until the limiter unblocks. It will unblock after `penalty` milliseconds have passed without receiving a new job. `penalty` is equal to `15 * minTime` (or `5000` if `minTime` is `0`) by default and can be changed by calling `changePenalty()`. This strategy is ideal when bruteforce attacks are to be expected. This strategy totally ignores priority levels.
             */
            readonly BLOCK: Bottleneck.Strategy;
        };

        constructor(options?: Bottleneck.ConstructorOptions);

        id: string;
        datastore: string;
        connection?: Bottleneck.RedisConnection | Bottleneck.IORedisConnection;

        /**
         * Returns a promise which will be resolved once the limiter is ready to accept jobs
         * or rejected if it fails to start up.
         */
        ready(): Promise<any>;

        /**
         * Returns a datastore-specific object of redis clients.
         */
        clients(): Bottleneck.ClientsList;

        /**
         * Returns the name of the Redis pubsub channel used for this limiter
         */
        channel(): string;

        /**
         * Disconnects the underlying redis clients, unless the limiter was created with the `connection` option.
         * @param flush - Write transient data before closing.
         */
        disconnect(flush?: boolean): Promise<void>;

        /**
         * Broadcast a string to every limiter in the Cluster.
         */
        publish(message: string): Promise<void>;

        /**
         * Returns an object with the current number of jobs per status.
         */
        counts(): Bottleneck.Counts;

        /**
         * Returns the status of the job with the provided job id.
         */
        jobStatus(id: string): Bottleneck.Status;

        /**
         * Returns the status of the job with the provided job id.
         */
        jobs(status?: Bottleneck.Status): string[];

        /**
         * Returns the number of requests queued.
         * @param priority - Returns the number of requests queued with the specified priority.
         */
        queued(priority?: number): number;

        /**
         * Returns the number of requests queued across the Cluster.
         */
        clusterQueued(): Promise<number>;

        /**
         * Returns whether there are any jobs currently in the queue or in the process of being added to the queue.
         */
        empty(): boolean;

        /**
         * Returns the total weight of jobs in a RUNNING or EXECUTING state in the Cluster.
         */
        running(): Promise<number>;

        /**
         * Returns the total weight of jobs in a DONE state in the Cluster.
         */
        done(): Promise<number>;

        /**
         * If a request was added right now, would it be run immediately?
         * @param weight - The weight of the request
         */
        check(weight?: number): Promise<boolean>;

        /**
         * Register an event listener.
         * @param name - The event name.
         * @param fn - The callback function.
         */
        on(name: "error",     fn: (error: any) => void): void;
        on(name: "empty",     fn: () => void): void;
        on(name: "idle",      fn: () => void): void;
        on(name: "depleted",  fn: (empty: boolean) => void): void;
        on(name: "message",   fn: (message: string) => void): void;
        on(name: "debug",     fn: (message: string, info: any) => void): void;
        on(name: "dropped",   fn: (dropped: Bottleneck.EventInfoDropped) => void): void;
        on(name: "received",  fn: (info: Bottleneck.EventInfo) => void): void;
        on(name: "queued",    fn: (info: Bottleneck.EventInfoQueued) => void): void;
        on(name: "scheduled", fn: (info: Bottleneck.EventInfo) => void): void;
        on(name: "executing", fn: (info: Bottleneck.EventInfoRetryable) => void): void;
        on(name: "failed",    fn: (error: any, info: Bottleneck.EventInfoRetryable) => Promise<number | void | null> | number | void | null): void;
        on(name: "retry",     fn: (message: string, info: Bottleneck.EventInfoRetryable) => void): void;
        on(name: "done",      fn: (info: Bottleneck.EventInfoRetryable) => void): void;

        /**
         * Register an event listener for one event only.
         * @param name - The event name.
         * @param fn - The callback function.
         */
        once(name: "error",     fn: (error: any) => void): void;
        once(name: "empty",     fn: () => void): void;
        once(name: "idle",      fn: () => void): void;
        once(name: "depleted",  fn: (empty: boolean) => void): void;
        once(name: "message",   fn: (message: string) => void): void;
        once(name: "debug",     fn: (message: string, info: any) => void): void;
        once(name: "dropped",   fn: (dropped: Bottleneck.EventInfoDropped) => void): void;
        once(name: "received",  fn: (info: Bottleneck.EventInfo) => void): void;
        once(name: "queued",    fn: (info: Bottleneck.EventInfoQueued) => void): void;
        once(name: "scheduled", fn: (info: Bottleneck.EventInfo) => void): void;
        once(name: "executing", fn: (info: Bottleneck.EventInfoRetryable) => void): void;
        once(name: "failed",    fn: (error: any, info: Bottleneck.EventInfoRetryable) => Promise<number | void | null> | number | void | null): void;
        once(name: "retry",     fn: (message: string, info: Bottleneck.EventInfoRetryable) => void): void;
        once(name: "done",      fn: (info: Bottleneck.EventInfoRetryable) => void): void;

        /**
         * Removes all registered event listeners.
         * @param name - The optional event name to remove listeners from.
         */
        removeAllListeners(name?: string): void;

        /**
         * Changes the settings for future requests.
         * @param options - The new settings.
         */
        updateSettings(options?: Bottleneck.ConstructorOptions): Bottleneck;

        /**
         * Adds to the reservoir count and returns the new value.
         */
        incrementReservoir(incrementBy: number): Promise<number>;

        /**
         * The `stop()` method is used to safely shutdown a limiter. It prevents any new jobs from being added to the limiter and waits for all Executing jobs to complete.
         */
        stop(options?: Bottleneck.StopOptions): Promise<void>;

        /**
         * Returns the current reservoir count, if any.
         */
        currentReservoir(): Promise<number | null>;

        /**
         * Chain this limiter to another.
         * @param limiter - The limiter that requests to this limiter must also follow.
         */
        chain(limiter?: Bottleneck): Bottleneck;

        <%_ for (var count of [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) { _%>
        wrap<R<%_ for (var idx = 1; idx <= count; idx++) { _%>, A<%= idx %><%_ } _%>>(fn: (<%= Array.apply(null, Array(count)).map((e, i) => i+1).map(i => `arg${i}: A${i}`).join(", ") %>) => PromiseLike<R>): ((<%_ for (var idx = 1; idx <= count; idx++) { _%><%_ if (idx > 1) { %>, <% } %>arg<%= idx %>: A<%= idx %><%_ } _%>) => Promise<R>) & { withOptions: (options: Bottleneck.JobOptions<%_ for (var idx = 1; idx <= count; idx++) { _%>, arg<%= idx %>: A<%= idx %><%_ } _%>) => Promise<R>; };
        <%_ } _%>

        <%_ for (var count of [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) { _%>
        submit<R<%_ for (var idx = 1; idx <= count; idx++) { _%>, A<%= idx %><%_ } _%>>(fn: (<%_ for (var idx = 1; idx <= count; idx++) { _%>arg<%= idx %>: A<%= idx %>, <% } _%>callback: Bottleneck.Callback<R>) => void<%_ for (var idx = 1; idx <= count; idx++) { _%>, arg<%= idx %>: A<%= idx %><%_ } _%>, callback: Bottleneck.Callback<R>): void;
        <%_ } _%>

        <%_ for (var count of [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) { _%>
        submit<R<%_ for (var idx = 1; idx <= count; idx++) { _%>, A<%= idx %><%_ } _%>>(options: Bottleneck.JobOptions, fn: (<%_ for (var idx = 1; idx <= count; idx++) { _%>arg<%= idx %>: A<%= idx %>, <% } _%>callback: Bottleneck.Callback<R>) => void<%_ for (var idx = 1; idx <= count; idx++) { _%>, arg<%= idx %>: A<%= idx %><%_ } _%>, callback: Bottleneck.Callback<R>): void;
        <%_ } _%>

        <%_ for (var count of [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) { _%>
        schedule<R<%_ for (var idx = 1; idx <= count; idx++) { _%>, A<%= idx %><%_ } _%>>(fn: (<%= Array.apply(null, Array(count)).map((e, i) => i+1).map(i => `arg${i}: A${i}`).join(", ") %>) => PromiseLike<R><%_ for (var idx = 1; idx <= count; idx++) { _%>, arg<%= idx %>: A<%= idx %><%_ } _%>): Promise<R>;
        <%_ } _%>

        <%_ for (var count of [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) { _%>
        schedule<R<%_ for (var idx = 1; idx <= count; idx++) { _%>, A<%= idx %><%_ } _%>>(options: Bottleneck.JobOptions, fn: (<%= Array.apply(null, Array(count)).map((e, i) => i+1).map(i => `arg${i}: A${i}`).join(", ") %>) => PromiseLike<R><%_ for (var idx = 1; idx <= count; idx++) { _%>, arg<%= idx %>: A<%= idx %><%_ } _%>): Promise<R>;
        <%_ } _%>
    }

    export default Bottleneck;
}
{
  "name": "bottleneck",
  "main": "bottleneck.js",
  "version": "2.19.5",
  "homepage": "https://github.com/SGrondin/bottleneck",
  "authors": [
    "SGrondin <github@simongrondin.name>"
  ],
  "description": "Distributed task scheduler and rate limiter",
  "moduleType": [
    "globals",
    "node"
  ],
  "keywords": [
    "async",
    "rate",
    "limiter",
    "limiting",
    "throttle",
    "throttling",
    "load",
    "ddos"
  ],
  "license": "MIT",
  "ignore": [
    "**/.*",
    "node_modules",
    "bower_components"
  ]
}
/**
  * This file contains the full Bottleneck library (MIT) compiled to ES5.
  * https://github.com/SGrondin/bottleneck
  * It also contains the regenerator-runtime (MIT), necessary for Babel-generated ES5 code to execute promise and async/await code.
  * See the following link for Copyright and License information:
  * https://github.com/facebook/regenerator/blob/master/packages/regenerator-runtime/runtime.js
  */
(function (global, factory) {
	typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
	typeof define === 'function' && define.amd ? define(factory) :
	(global.Bottleneck = factory());
}(this, (function () { 'use strict';

	var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};

	function createCommonjsModule(fn, module) {
		return module = { exports: {} }, fn(module, module.exports), module.exports;
	}

	function getCjsExportFromNamespace (n) {
		return n && n['default'] || n;
	}

	var runtime = createCommonjsModule(function (module) {
	/**
	 * Copyright (c) 2014-present, Facebook, Inc.
	 *
	 * This source code is licensed under the MIT license found in the
	 * LICENSE file in the root directory of this source tree.
	 */

	!(function(global) {

	  var Op = Object.prototype;
	  var hasOwn = Op.hasOwnProperty;
	  var undefined; // More compressible than void 0.
	  var $Symbol = typeof Symbol === "function" ? Symbol : {};
	  var iteratorSymbol = $Symbol.iterator || "@@iterator";
	  var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
	  var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
	  var runtime = global.regeneratorRuntime;
	  if (runtime) {
	    {
	      // If regeneratorRuntime is defined globally and we're in a module,
	      // make the exports object identical to regeneratorRuntime.
	      module.exports = runtime;
	    }
	    // Don't bother evaluating the rest of this file if the runtime was
	    // already defined globally.
	    return;
	  }

	  // Define the runtime globally (as expected by generated code) as either
	  // module.exports (if we're in a module) or a new, empty object.
	  runtime = global.regeneratorRuntime = module.exports;

	  function wrap(innerFn, outerFn, self, tryLocsList) {
	    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
	    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
	    var generator = Object.create(protoGenerator.prototype);
	    var context = new Context(tryLocsList || []);

	    // The ._invoke method unifies the implementations of the .next,
	    // .throw, and .return methods.
	    generator._invoke = makeInvokeMethod(innerFn, self, context);

	    return generator;
	  }
	  runtime.wrap = wrap;

	  // Try/catch helper to minimize deoptimizations. Returns a completion
	  // record like context.tryEntries[i].completion. This interface could
	  // have been (and was previously) designed to take a closure to be
	  // invoked without arguments, but in all the cases we care about we
	  // already have an existing method we want to call, so there's no need
	  // to create a new function object. We can even get away with assuming
	  // the method takes exactly one argument, since that happens to be true
	  // in every case, so we don't have to touch the arguments object. The
	  // only additional allocation required is the completion record, which
	  // has a stable shape and so hopefully should be cheap to allocate.
	  function tryCatch(fn, obj, arg) {
	    try {
	      return { type: "normal", arg: fn.call(obj, arg) };
	    } catch (err) {
	      return { type: "throw", arg: err };
	    }
	  }

	  var GenStateSuspendedStart = "suspendedStart";
	  var GenStateSuspendedYield = "suspendedYield";
	  var GenStateExecuting = "executing";
	  var GenStateCompleted = "completed";

	  // Returning this object from the innerFn has the same effect as
	  // breaking out of the dispatch switch statement.
	  var ContinueSentinel = {};

	  // Dummy constructor functions that we use as the .constructor and
	  // .constructor.prototype properties for functions that return Generator
	  // objects. For full spec compliance, you may wish to configure your
	  // minifier not to mangle the names of these two functions.
	  function Generator() {}
	  function GeneratorFunction() {}
	  function GeneratorFunctionPrototype() {}

	  // This is a polyfill for %IteratorPrototype% for environments that
	  // don't natively support it.
	  var IteratorPrototype = {};
	  IteratorPrototype[iteratorSymbol] = function () {
	    return this;
	  };

	  var getProto = Object.getPrototypeOf;
	  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
	  if (NativeIteratorPrototype &&
	      NativeIteratorPrototype !== Op &&
	      hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
	    // This environment has a native %IteratorPrototype%; use it instead
	    // of the polyfill.
	    IteratorPrototype = NativeIteratorPrototype;
	  }

	  var Gp = GeneratorFunctionPrototype.prototype =
	    Generator.prototype = Object.create(IteratorPrototype);
	  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
	  GeneratorFunctionPrototype.constructor = GeneratorFunction;
	  GeneratorFunctionPrototype[toStringTagSymbol] =
	    GeneratorFunction.displayName = "GeneratorFunction";

	  // Helper for defining the .next, .throw, and .return methods of the
	  // Iterator interface in terms of a single ._invoke method.
	  function defineIteratorMethods(prototype) {
	    ["next", "throw", "return"].forEach(function(method) {
	      prototype[method] = function(arg) {
	        return this._invoke(method, arg);
	      };
	    });
	  }

	  runtime.isGeneratorFunction = function(genFun) {
	    var ctor = typeof genFun === "function" && genFun.constructor;
	    return ctor
	      ? ctor === GeneratorFunction ||
	        // For the native GeneratorFunction constructor, the best we can
	        // do is to check its .name property.
	        (ctor.displayName || ctor.name) === "GeneratorFunction"
	      : false;
	  };

	  runtime.mark = function(genFun) {
	    if (Object.setPrototypeOf) {
	      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
	    } else {
	      genFun.__proto__ = GeneratorFunctionPrototype;
	      if (!(toStringTagSymbol in genFun)) {
	        genFun[toStringTagSymbol] = "GeneratorFunction";
	      }
	    }
	    genFun.prototype = Object.create(Gp);
	    return genFun;
	  };

	  // Within the body of any async function, `await x` is transformed to
	  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
	  // `hasOwn.call(value, "__await")` to determine if the yielded value is
	  // meant to be awaited.
	  runtime.awrap = function(arg) {
	    return { __await: arg };
	  };

	  function AsyncIterator(generator) {
	    function invoke(method, arg, resolve, reject) {
	      var record = tryCatch(generator[method], generator, arg);
	      if (record.type === "throw") {
	        reject(record.arg);
	      } else {
	        var result = record.arg;
	        var value = result.value;
	        if (value &&
	            typeof value === "object" &&
	            hasOwn.call(value, "__await")) {
	          return Promise.resolve(value.__await).then(function(value) {
	            invoke("next", value, resolve, reject);
	          }, function(err) {
	            invoke("throw", err, resolve, reject);
	          });
	        }

	        return Promise.resolve(value).then(function(unwrapped) {
	          // When a yielded Promise is resolved, its final value becomes
	          // the .value of the Promise<{value,done}> result for the
	          // current iteration.
	          result.value = unwrapped;
	          resolve(result);
	        }, function(error) {
	          // If a rejected Promise was yielded, throw the rejection back
	          // into the async generator function so it can be handled there.
	          return invoke("throw", error, resolve, reject);
	        });
	      }
	    }

	    var previousPromise;

	    function enqueue(method, arg) {
	      function callInvokeWithMethodAndArg() {
	        return new Promise(function(resolve, reject) {
	          invoke(method, arg, resolve, reject);
	        });
	      }

	      return previousPromise =
	        // If enqueue has been called before, then we want to wait until
	        // all previous Promises have been resolved before calling invoke,
	        // so that results are always delivered in the correct order. If
	        // enqueue has not been called before, then it is important to
	        // call invoke immediately, without waiting on a callback to fire,
	        // so that the async generator function has the opportunity to do
	        // any necessary setup in a predictable way. This predictability
	        // is why the Promise constructor synchronously invokes its
	        // executor callback, and why async functions synchronously
	        // execute code before the first await. Since we implement simple
	        // async functions in terms of async generators, it is especially
	        // important to get this right, even though it requires care.
	        previousPromise ? previousPromise.then(
	          callInvokeWithMethodAndArg,
	          // Avoid propagating failures to Promises returned by later
	          // invocations of the iterator.
	          callInvokeWithMethodAndArg
	        ) : callInvokeWithMethodAndArg();
	    }

	    // Define the unified helper method that is used to implement .next,
	    // .throw, and .return (see defineIteratorMethods).
	    this._invoke = enqueue;
	  }

	  defineIteratorMethods(AsyncIterator.prototype);
	  AsyncIterator.prototype[asyncIteratorSymbol] = function () {
	    return this;
	  };
	  runtime.AsyncIterator = AsyncIterator;

	  // Note that simple async functions are implemented on top of
	  // AsyncIterator objects; they just return a Promise for the value of
	  // the final result produced by the iterator.
	  runtime.async = function(innerFn, outerFn, self, tryLocsList) {
	    var iter = new AsyncIterator(
	      wrap(innerFn, outerFn, self, tryLocsList)
	    );

	    return runtime.isGeneratorFunction(outerFn)
	      ? iter // If outerFn is a generator, return the full iterator.
	      : iter.next().then(function(result) {
	          return result.done ? result.value : iter.next();
	        });
	  };

	  function makeInvokeMethod(innerFn, self, context) {
	    var state = GenStateSuspendedStart;

	    return function invoke(method, arg) {
	      if (state === GenStateExecuting) {
	        throw new Error("Generator is already running");
	      }

	      if (state === GenStateCompleted) {
	        if (method === "throw") {
	          throw arg;
	        }

	        // Be forgiving, per 25.3.3.3.3 of the spec:
	        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
	        return doneResult();
	      }

	      context.method = method;
	      context.arg = arg;

	      while (true) {
	        var delegate = context.delegate;
	        if (delegate) {
	          var delegateResult = maybeInvokeDelegate(delegate, context);
	          if (delegateResult) {
	            if (delegateResult === ContinueSentinel) continue;
	            return delegateResult;
	          }
	        }

	        if (context.method === "next") {
	          // Setting context._sent for legacy support of Babel's
	          // function.sent implementation.
	          context.sent = context._sent = context.arg;

	        } else if (context.method === "throw") {
	          if (state === GenStateSuspendedStart) {
	            state = GenStateCompleted;
	            throw context.arg;
	          }

	          context.dispatchException(context.arg);

	        } else if (context.method === "return") {
	          context.abrupt("return", context.arg);
	        }

	        state = GenStateExecuting;

	        var record = tryCatch(innerFn, self, context);
	        if (record.type === "normal") {
	          // If an exception is thrown from innerFn, we leave state ===
	          // GenStateExecuting and loop back for another invocation.
	          state = context.done
	            ? GenStateCompleted
	            : GenStateSuspendedYield;

	          if (record.arg === ContinueSentinel) {
	            continue;
	          }

	          return {
	            value: record.arg,
	            done: context.done
	          };

	        } else if (record.type === "throw") {
	          state = GenStateCompleted;
	          // Dispatch the exception by looping back around to the
	          // context.dispatchException(context.arg) call above.
	          context.method = "throw";
	          context.arg = record.arg;
	        }
	      }
	    };
	  }

	  // Call delegate.iterator[context.method](context.arg) and handle the
	  // result, either by returning a { value, done } result from the
	  // delegate iterator, or by modifying context.method and context.arg,
	  // setting context.delegate to null, and returning the ContinueSentinel.
	  function maybeInvokeDelegate(delegate, context) {
	    var method = delegate.iterator[context.method];
	    if (method === undefined) {
	      // A .throw or .return when the delegate iterator has no .throw
	      // method always terminates the yield* loop.
	      context.delegate = null;

	      if (context.method === "throw") {
	        if (delegate.iterator.return) {
	          // If the delegate iterator has a return method, give it a
	          // chance to clean up.
	          context.method = "return";
	          context.arg = undefined;
	          maybeInvokeDelegate(delegate, context);

	          if (context.method === "throw") {
	            // If maybeInvokeDelegate(context) changed context.method from
	            // "return" to "throw", let that override the TypeError below.
	            return ContinueSentinel;
	          }
	        }

	        context.method = "throw";
	        context.arg = new TypeError(
	          "The iterator does not provide a 'throw' method");
	      }

	      return ContinueSentinel;
	    }

	    var record = tryCatch(method, delegate.iterator, context.arg);

	    if (record.type === "throw") {
	      context.method = "throw";
	      context.arg = record.arg;
	      context.delegate = null;
	      return ContinueSentinel;
	    }

	    var info = record.arg;

	    if (! info) {
	      context.method = "throw";
	      context.arg = new TypeError("iterator result is not an object");
	      context.delegate = null;
	      return ContinueSentinel;
	    }

	    if (info.done) {
	      // Assign the result of the finished delegate to the temporary
	      // variable specified by delegate.resultName (see delegateYield).
	      context[delegate.resultName] = info.value;

	      // Resume execution at the desired location (see delegateYield).
	      context.next = delegate.nextLoc;

	      // If context.method was "throw" but the delegate handled the
	      // exception, let the outer generator proceed normally. If
	      // context.method was "next", forget context.arg since it has been
	      // "consumed" by the delegate iterator. If context.method was
	      // "return", allow the original .return call to continue in the
	      // outer generator.
	      if (context.method !== "return") {
	        context.method = "next";
	        context.arg = undefined;
	      }

	    } else {
	      // Re-yield the result returned by the delegate method.
	      return info;
	    }

	    // The delegate iterator is finished, so forget it and continue with
	    // the outer generator.
	    context.delegate = null;
	    return ContinueSentinel;
	  }

	  // Define Generator.prototype.{next,throw,return} in terms of the
	  // unified ._invoke helper method.
	  defineIteratorMethods(Gp);

	  Gp[toStringTagSymbol] = "Generator";

	  // A Generator should always return itself as the iterator object when the
	  // @@iterator function is called on it. Some browsers' implementations of the
	  // iterator prototype chain incorrectly implement this, causing the Generator
	  // object to not be returned from this call. This ensures that doesn't happen.
	  // See https://github.com/facebook/regenerator/issues/274 for more details.
	  Gp[iteratorSymbol] = function() {
	    return this;
	  };

	  Gp.toString = function() {
	    return "[object Generator]";
	  };

	  function pushTryEntry(locs) {
	    var entry = { tryLoc: locs[0] };

	    if (1 in locs) {
	      entry.catchLoc = locs[1];
	    }

	    if (2 in locs) {
	      entry.finallyLoc = locs[2];
	      entry.afterLoc = locs[3];
	    }

	    this.tryEntries.push(entry);
	  }

	  function resetTryEntry(entry) {
	    var record = entry.completion || {};
	    record.type = "normal";
	    delete record.arg;
	    entry.completion = record;
	  }

	  function Context(tryLocsList) {
	    // The root entry object (effectively a try statement without a catch
	    // or a finally block) gives us a place to store values thrown from
	    // locations where there is no enclosing try statement.
	    this.tryEntries = [{ tryLoc: "root" }];
	    tryLocsList.forEach(pushTryEntry, this);
	    this.reset(true);
	  }

	  runtime.keys = function(object) {
	    var keys = [];
	    for (var key in object) {
	      keys.push(key);
	    }
	    keys.reverse();

	    // Rather than returning an object with a next method, we keep
	    // things simple and return the next function itself.
	    return function next() {
	      while (keys.length) {
	        var key = keys.pop();
	        if (key in object) {
	          next.value = key;
	          next.done = false;
	          return next;
	        }
	      }

	      // To avoid creating an additional object, we just hang the .value
	      // and .done properties off the next function object itself. This
	      // also ensures that the minifier will not anonymize the function.
	      next.done = true;
	      return next;
	    };
	  };

	  function values(iterable) {
	    if (iterable) {
	      var iteratorMethod = iterable[iteratorSymbol];
	      if (iteratorMethod) {
	        return iteratorMethod.call(iterable);
	      }

	      if (typeof iterable.next === "function") {
	        return iterable;
	      }

	      if (!isNaN(iterable.length)) {
	        var i = -1, next = function next() {
	          while (++i < iterable.length) {
	            if (hasOwn.call(iterable, i)) {
	              next.value = iterable[i];
	              next.done = false;
	              return next;
	            }
	          }

	          next.value = undefined;
	          next.done = true;

	          return next;
	        };

	        return next.next = next;
	      }
	    }

	    // Return an iterator with no values.
	    return { next: doneResult };
	  }
	  runtime.values = values;

	  function doneResult() {
	    return { value: undefined, done: true };
	  }

	  Context.prototype = {
	    constructor: Context,

	    reset: function(skipTempReset) {
	      this.prev = 0;
	      this.next = 0;
	      // Resetting context._sent for legacy support of Babel's
	      // function.sent implementation.
	      this.sent = this._sent = undefined;
	      this.done = false;
	      this.delegate = null;

	      this.method = "next";
	      this.arg = undefined;

	      this.tryEntries.forEach(resetTryEntry);

	      if (!skipTempReset) {
	        for (var name in this) {
	          // Not sure about the optimal order of these conditions:
	          if (name.charAt(0) === "t" &&
	              hasOwn.call(this, name) &&
	              !isNaN(+name.slice(1))) {
	            this[name] = undefined;
	          }
	        }
	      }
	    },

	    stop: function() {
	      this.done = true;

	      var rootEntry = this.tryEntries[0];
	      var rootRecord = rootEntry.completion;
	      if (rootRecord.type === "throw") {
	        throw rootRecord.arg;
	      }

	      return this.rval;
	    },

	    dispatchException: function(exception) {
	      if (this.done) {
	        throw exception;
	      }

	      var context = this;
	      function handle(loc, caught) {
	        record.type = "throw";
	        record.arg = exception;
	        context.next = loc;

	        if (caught) {
	          // If the dispatched exception was caught by a catch block,
	          // then let that catch block handle the exception normally.
	          context.method = "next";
	          context.arg = undefined;
	        }

	        return !! caught;
	      }

	      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
	        var entry = this.tryEntries[i];
	        var record = entry.completion;

	        if (entry.tryLoc === "root") {
	          // Exception thrown outside of any try block that could handle
	          // it, so set the completion value of the entire function to
	          // throw the exception.
	          return handle("end");
	        }

	        if (entry.tryLoc <= this.prev) {
	          var hasCatch = hasOwn.call(entry, "catchLoc");
	          var hasFinally = hasOwn.call(entry, "finallyLoc");

	          if (hasCatch && hasFinally) {
	            if (this.prev < entry.catchLoc) {
	              return handle(entry.catchLoc, true);
	            } else if (this.prev < entry.finallyLoc) {
	              return handle(entry.finallyLoc);
	            }

	          } else if (hasCatch) {
	            if (this.prev < entry.catchLoc) {
	              return handle(entry.catchLoc, true);
	            }

	          } else if (hasFinally) {
	            if (this.prev < entry.finallyLoc) {
	              return handle(entry.finallyLoc);
	            }

	          } else {
	            throw new Error("try statement without catch or finally");
	          }
	        }
	      }
	    },

	    abrupt: function(type, arg) {
	      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
	        var entry = this.tryEntries[i];
	        if (entry.tryLoc <= this.prev &&
	            hasOwn.call(entry, "finallyLoc") &&
	            this.prev < entry.finallyLoc) {
	          var finallyEntry = entry;
	          break;
	        }
	      }

	      if (finallyEntry &&
	          (type === "break" ||
	           type === "continue") &&
	          finallyEntry.tryLoc <= arg &&
	          arg <= finallyEntry.finallyLoc) {
	        // Ignore the finally entry if control is not jumping to a
	        // location outside the try/catch block.
	        finallyEntry = null;
	      }

	      var record = finallyEntry ? finallyEntry.completion : {};
	      record.type = type;
	      record.arg = arg;

	      if (finallyEntry) {
	        this.method = "next";
	        this.next = finallyEntry.finallyLoc;
	        return ContinueSentinel;
	      }

	      return this.complete(record);
	    },

	    complete: function(record, afterLoc) {
	      if (record.type === "throw") {
	        throw record.arg;
	      }

	      if (record.type === "break" ||
	          record.type === "continue") {
	        this.next = record.arg;
	      } else if (record.type === "return") {
	        this.rval = this.arg = record.arg;
	        this.method = "return";
	        this.next = "end";
	      } else if (record.type === "normal" && afterLoc) {
	        this.next = afterLoc;
	      }

	      return ContinueSentinel;
	    },

	    finish: function(finallyLoc) {
	      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
	        var entry = this.tryEntries[i];
	        if (entry.finallyLoc === finallyLoc) {
	          this.complete(entry.completion, entry.afterLoc);
	          resetTryEntry(entry);
	          return ContinueSentinel;
	        }
	      }
	    },

	    "catch": function(tryLoc) {
	      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
	        var entry = this.tryEntries[i];
	        if (entry.tryLoc === tryLoc) {
	          var record = entry.completion;
	          if (record.type === "throw") {
	            var thrown = record.arg;
	            resetTryEntry(entry);
	          }
	          return thrown;
	        }
	      }

	      // The context.catch method must only be called with a location
	      // argument that corresponds to a known catch block.
	      throw new Error("illegal catch attempt");
	    },

	    delegateYield: function(iterable, resultName, nextLoc) {
	      this.delegate = {
	        iterator: values(iterable),
	        resultName: resultName,
	        nextLoc: nextLoc
	      };

	      if (this.method === "next") {
	        // Deliberately forget the last sent value so that we don't
	        // accidentally pass it on to the delegate.
	        this.arg = undefined;
	      }

	      return ContinueSentinel;
	    }
	  };
	})(
	  // In sloppy mode, unbound `this` refers to the global object, fallback to
	  // Function constructor if we're in global strict mode. That is sadly a form
	  // of indirect eval which violates Content Security Policy.
	  (function() {
	    return this || (typeof self === "object" && self);
	  })() || Function("return this")()
	);
	});

	function _typeof(obj) {
	  if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
	    _typeof = function (obj) {
	      return typeof obj;
	    };
	  } else {
	    _typeof = function (obj) {
	      return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
	    };
	  }

	  return _typeof(obj);
	}

	function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
	  try {
	    var info = gen[key](arg);
	    var value = info.value;
	  } catch (error) {
	    reject(error);
	    return;
	  }

	  if (info.done) {
	    resolve(value);
	  } else {
	    Promise.resolve(value).then(_next, _throw);
	  }
	}

	function _asyncToGenerator(fn) {
	  return function () {
	    var self = this,
	        args = arguments;
	    return new Promise(function (resolve, reject) {
	      var gen = fn.apply(self, args);

	      function _next(value) {
	        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
	      }

	      function _throw(err) {
	        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
	      }

	      _next(undefined);
	    });
	  };
	}

	function _classCallCheck(instance, Constructor) {
	  if (!(instance instanceof Constructor)) {
	    throw new TypeError("Cannot call a class as a function");
	  }
	}

	function _defineProperties(target, props) {
	  for (var i = 0; i < props.length; i++) {
	    var descriptor = props[i];
	    descriptor.enumerable = descriptor.enumerable || false;
	    descriptor.configurable = true;
	    if ("value" in descriptor) descriptor.writable = true;
	    Object.defineProperty(target, descriptor.key, descriptor);
	  }
	}

	function _createClass(Constructor, protoProps, staticProps) {
	  if (protoProps) _defineProperties(Constructor.prototype, protoProps);
	  if (staticProps) _defineProperties(Constructor, staticProps);
	  return Constructor;
	}

	function _inherits(subClass, superClass) {
	  if (typeof superClass !== "function" && superClass !== null) {
	    throw new TypeError("Super expression must either be null or a function");
	  }

	  subClass.prototype = Object.create(superClass && superClass.prototype, {
	    constructor: {
	      value: subClass,
	      writable: true,
	      configurable: true
	    }
	  });
	  if (superClass) _setPrototypeOf(subClass, superClass);
	}

	function _getPrototypeOf(o) {
	  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
	    return o.__proto__ || Object.getPrototypeOf(o);
	  };
	  return _getPrototypeOf(o);
	}

	function _setPrototypeOf(o, p) {
	  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
	    o.__proto__ = p;
	    return o;
	  };

	  return _setPrototypeOf(o, p);
	}

	function isNativeReflectConstruct() {
	  if (typeof Reflect === "undefined" || !Reflect.construct) return false;
	  if (Reflect.construct.sham) return false;
	  if (typeof Proxy === "function") return true;

	  try {
	    Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));
	    return true;
	  } catch (e) {
	    return false;
	  }
	}

	function _construct(Parent, args, Class) {
	  if (isNativeReflectConstruct()) {
	    _construct = Reflect.construct;
	  } else {
	    _construct = function _construct(Parent, args, Class) {
	      var a = [null];
	      a.push.apply(a, args);
	      var Constructor = Function.bind.apply(Parent, a);
	      var instance = new Constructor();
	      if (Class) _setPrototypeOf(instance, Class.prototype);
	      return instance;
	    };
	  }

	  return _construct.apply(null, arguments);
	}

	function _isNativeFunction(fn) {
	  return Function.toString.call(fn).indexOf("[native code]") !== -1;
	}

	function _wrapNativeSuper(Class) {
	  var _cache = typeof Map === "function" ? new Map() : undefined;

	  _wrapNativeSuper = function _wrapNativeSuper(Class) {
	    if (Class === null || !_isNativeFunction(Class)) return Class;

	    if (typeof Class !== "function") {
	      throw new TypeError("Super expression must either be null or a function");
	    }

	    if (typeof _cache !== "undefined") {
	      if (_cache.has(Class)) return _cache.get(Class);

	      _cache.set(Class, Wrapper);
	    }

	    function Wrapper() {
	      return _construct(Class, arguments, _getPrototypeOf(this).constructor);
	    }

	    Wrapper.prototype = Object.create(Class.prototype, {
	      constructor: {
	        value: Wrapper,
	        enumerable: false,
	        writable: true,
	        configurable: true
	      }
	    });
	    return _setPrototypeOf(Wrapper, Class);
	  };

	  return _wrapNativeSuper(Class);
	}

	function _assertThisInitialized(self) {
	  if (self === void 0) {
	    throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
	  }

	  return self;
	}

	function _possibleConstructorReturn(self, call) {
	  if (call && (typeof call === "object" || typeof call === "function")) {
	    return call;
	  }

	  return _assertThisInitialized(self);
	}

	function _slicedToArray(arr, i) {
	  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();
	}

	function _toArray(arr) {
	  return _arrayWithHoles(arr) || _iterableToArray(arr) || _nonIterableRest();
	}

	function _toConsumableArray(arr) {
	  return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();
	}

	function _arrayWithoutHoles(arr) {
	  if (Array.isArray(arr)) {
	    for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];

	    return arr2;
	  }
	}

	function _arrayWithHoles(arr) {
	  if (Array.isArray(arr)) return arr;
	}

	function _iterableToArray(iter) {
	  if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
	}

	function _iterableToArrayLimit(arr, i) {
	  var _arr = [];
	  var _n = true;
	  var _d = false;
	  var _e = undefined;

	  try {
	    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
	      _arr.push(_s.value);

	      if (i && _arr.length === i) break;
	    }
	  } catch (err) {
	    _d = true;
	    _e = err;
	  } finally {
	    try {
	      if (!_n && _i["return"] != null) _i["return"]();
	    } finally {
	      if (_d) throw _e;
	    }
	  }

	  return _arr;
	}

	function _nonIterableSpread() {
	  throw new TypeError("Invalid attempt to spread non-iterable instance");
	}

	function _nonIterableRest() {
	  throw new TypeError("Invalid attempt to destructure non-iterable instance");
	}

	var load = function load(received, defaults) {
	  var onto = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
	  var k, ref, v;

	  for (k in defaults) {
	    v = defaults[k];
	    onto[k] = (ref = received[k]) != null ? ref : v;
	  }

	  return onto;
	};

	var overwrite = function overwrite(received, defaults) {
	  var onto = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
	  var k, v;

	  for (k in received) {
	    v = received[k];

	    if (defaults[k] !== void 0) {
	      onto[k] = v;
	    }
	  }

	  return onto;
	};

	var parser = {
	  load: load,
	  overwrite: overwrite
	};

	var DLList;

	DLList =
	/*#__PURE__*/
	function () {
	  function DLList(incr, decr) {
	    _classCallCheck(this, DLList);

	    this.incr = incr;
	    this.decr = decr;
	    this._first = null;
	    this._last = null;
	    this.length = 0;
	  }

	  _createClass(DLList, [{
	    key: "push",
	    value: function push(value) {
	      var node;
	      this.length++;

	      if (typeof this.incr === "function") {
	        this.incr();
	      }

	      node = {
	        value: value,
	        prev: this._last,
	        next: null
	      };

	      if (this._last != null) {
	        this._last.next = node;
	        this._last = node;
	      } else {
	        this._first = this._last = node;
	      }

	      return void 0;
	    }
	  }, {
	    key: "shift",
	    value: function shift() {
	      var value;

	      if (this._first == null) {
	        return;
	      } else {
	        this.length--;

	        if (typeof this.decr === "function") {
	          this.decr();
	        }
	      }

	      value = this._first.value;

	      if ((this._first = this._first.next) != null) {
	        this._first.prev = null;
	      } else {
	        this._last = null;
	      }

	      return value;
	    }
	  }, {
	    key: "first",
	    value: function first() {
	      if (this._first != null) {
	        return this._first.value;
	      }
	    }
	  }, {
	    key: "getArray",
	    value: function getArray() {
	      var node, ref, results;
	      node = this._first;
	      results = [];

	      while (node != null) {
	        results.push((ref = node, node = node.next, ref.value));
	      }

	      return results;
	    }
	  }, {
	    key: "forEachShift",
	    value: function forEachShift(cb) {
	      var node;
	      node = this.shift();

	      while (node != null) {
	        cb(node), node = this.shift();
	      }

	      return void 0;
	    }
	  }, {
	    key: "debug",
	    value: function debug() {
	      var node, ref, ref1, ref2, results;
	      node = this._first;
	      results = [];

	      while (node != null) {
	        results.push((ref = node, node = node.next, {
	          value: ref.value,
	          prev: (ref1 = ref.prev) != null ? ref1.value : void 0,
	          next: (ref2 = ref.next) != null ? ref2.value : void 0
	        }));
	      }

	      return results;
	    }
	  }]);

	  return DLList;
	}();

	var DLList_1 = DLList;

	var Events;

	Events =
	/*#__PURE__*/
	function () {
	  function Events(instance) {
	    var _this = this;

	    _classCallCheck(this, Events);

	    this.instance = instance;
	    this._events = {};

	    if (this.instance.on != null || this.instance.once != null || this.instance.removeAllListeners != null) {
	      throw new Error("An Emitter already exists for this object");
	    }

	    this.instance.on = function (name, cb) {
	      return _this._addListener(name, "many", cb);
	    };

	    this.instance.once = function (name, cb) {
	      return _this._addListener(name, "once", cb);
	    };

	    this.instance.removeAllListeners = function () {
	      var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;

	      if (name != null) {
	        return delete _this._events[name];
	      } else {
	        return _this._events = {};
	      }
	    };
	  }

	  _createClass(Events, [{
	    key: "_addListener",
	    value: function _addListener(name, status, cb) {
	      var base;

	      if ((base = this._events)[name] == null) {
	        base[name] = [];
	      }

	      this._events[name].push({
	        cb: cb,
	        status: status
	      });

	      return this.instance;
	    }
	  }, {
	    key: "listenerCount",
	    value: function listenerCount(name) {
	      if (this._events[name] != null) {
	        return this._events[name].length;
	      } else {
	        return 0;
	      }
	    }
	  }, {
	    key: "trigger",
	    value: function () {
	      var _trigger = _asyncToGenerator(
	      /*#__PURE__*/
	      regeneratorRuntime.mark(function _callee2(name) {
	        var _this2 = this;

	        var _len,
	            args,
	            _key,
	            e,
	            promises,
	            _args2 = arguments;

	        return regeneratorRuntime.wrap(function _callee2$(_context2) {
	          while (1) {
	            switch (_context2.prev = _context2.next) {
	              case 0:
	                for (_len = _args2.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
	                  args[_key - 1] = _args2[_key];
	                }

	                _context2.prev = 1;

	                if (name !== "debug") {
	                  this.trigger("debug", "Event triggered: ".concat(name), args);
	                }

	                if (!(this._events[name] == null)) {
	                  _context2.next = 5;
	                  break;
	                }

	                return _context2.abrupt("return");

	              case 5:
	                this._events[name] = this._events[name].filter(function (listener) {
	                  return listener.status !== "none";
	                });
	                promises = this._events[name].map(
	                /*#__PURE__*/
	                function () {
	                  var _ref = _asyncToGenerator(
	                  /*#__PURE__*/
	                  regeneratorRuntime.mark(function _callee(listener) {
	                    var e, returned;
	                    return regeneratorRuntime.wrap(function _callee$(_context) {
	                      while (1) {
	                        switch (_context.prev = _context.next) {
	                          case 0:
	                            if (!(listener.status === "none")) {
	                              _context.next = 2;
	                              break;
	                            }

	                            return _context.abrupt("return");

	                          case 2:
	                            if (listener.status === "once") {
	                              listener.status = "none";
	                            }

	                            _context.prev = 3;
	                            returned = typeof listener.cb === "function" ? listener.cb.apply(listener, args) : void 0;

	                            if (!(typeof (returned != null ? returned.then : void 0) === "function")) {
	                              _context.next = 11;
	                              break;
	                            }

	                            _context.next = 8;
	                            return returned;

	                          case 8:
	                            return _context.abrupt("return", _context.sent);

	                          case 11:
	                            return _context.abrupt("return", returned);

	                          case 12:
	                            _context.next = 19;
	                            break;

	                          case 14:
	                            _context.prev = 14;
	                            _context.t0 = _context["catch"](3);
	                            e = _context.t0;

	                            {
	                              _this2.trigger("error", e);
	                            }

	                            return _context.abrupt("return", null);

	                          case 19:
	                          case "end":
	                            return _context.stop();
	                        }
	                      }
	                    }, _callee, null, [[3, 14]]);
	                  }));

	                  return function (_x2) {
	                    return _ref.apply(this, arguments);
	                  };
	                }());
	                _context2.next = 9;
	                return Promise.all(promises);

	              case 9:
	                _context2.t0 = function (x) {
	                  return x != null;
	                };

	                return _context2.abrupt("return", _context2.sent.find(_context2.t0));

	              case 13:
	                _context2.prev = 13;
	                _context2.t1 = _context2["catch"](1);
	                e = _context2.t1;

	                {
	                  this.trigger("error", e);
	                }

	                return _context2.abrupt("return", null);

	              case 18:
	              case "end":
	                return _context2.stop();
	            }
	          }
	        }, _callee2, this, [[1, 13]]);
	      }));

	      function trigger(_x) {
	        return _trigger.apply(this, arguments);
	      }

	      return trigger;
	    }()
	  }]);

	  return Events;
	}();

	var Events_1 = Events;

	var DLList$1, Events$1, Queues;
	DLList$1 = DLList_1;
	Events$1 = Events_1;

	Queues =
	/*#__PURE__*/
	function () {
	  function Queues(num_priorities) {
	    _classCallCheck(this, Queues);

	    var i;
	    this.Events = new Events$1(this);
	    this._length = 0;

	    this._lists = function () {
	      var _this = this;

	      var j, ref, results;
	      results = [];

	      for (i = j = 1, ref = num_priorities; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {
	        results.push(new DLList$1(function () {
	          return _this.incr();
	        }, function () {
	          return _this.decr();
	        }));
	      }

	      return results;
	    }.call(this);
	  }

	  _createClass(Queues, [{
	    key: "incr",
	    value: function incr() {
	      if (this._length++ === 0) {
	        return this.Events.trigger("leftzero");
	      }
	    }
	  }, {
	    key: "decr",
	    value: function decr() {
	      if (--this._length === 0) {
	        return this.Events.trigger("zero");
	      }
	    }
	  }, {
	    key: "push",
	    value: function push(job) {
	      return this._lists[job.options.priority].push(job);
	    }
	  }, {
	    key: "queued",
	    value: function queued(priority) {
	      if (priority != null) {
	        return this._lists[priority].length;
	      } else {
	        return this._length;
	      }
	    }
	  }, {
	    key: "shiftAll",
	    value: function shiftAll(fn) {
	      return this._lists.forEach(function (list) {
	        return list.forEachShift(fn);
	      });
	    }
	  }, {
	    key: "getFirst",
	    value: function getFirst() {
	      var arr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._lists;
	      var j, len, list;

	      for (j = 0, len = arr.length; j < len; j++) {
	        list = arr[j];

	        if (list.length > 0) {
	          return list;
	        }
	      }

	      return [];
	    }
	  }, {
	    key: "shiftLastFrom",
	    value: function shiftLastFrom(priority) {
	      return this.getFirst(this._lists.slice(priority).reverse()).shift();
	    }
	  }]);

	  return Queues;
	}();

	var Queues_1 = Queues;

	var BottleneckError;

	BottleneckError =
	/*#__PURE__*/
	function (_Error) {
	  _inherits(BottleneckError, _Error);

	  function BottleneckError() {
	    _classCallCheck(this, BottleneckError);

	    return _possibleConstructorReturn(this, _getPrototypeOf(BottleneckError).apply(this, arguments));
	  }

	  return BottleneckError;
	}(_wrapNativeSuper(Error));

	var BottleneckError_1 = BottleneckError;

	var BottleneckError$1, DEFAULT_PRIORITY, Job, NUM_PRIORITIES, parser$1;
	NUM_PRIORITIES = 10;
	DEFAULT_PRIORITY = 5;
	parser$1 = parser;
	BottleneckError$1 = BottleneckError_1;

	Job =
	/*#__PURE__*/
	function () {
	  function Job(task, args, options, jobDefaults, rejectOnDrop, Events, _states, Promise) {
	    var _this = this;

	    _classCallCheck(this, Job);

	    this.task = task;
	    this.args = args;
	    this.rejectOnDrop = rejectOnDrop;
	    this.Events = Events;
	    this._states = _states;
	    this.Promise = Promise;
	    this.options = parser$1.load(options, jobDefaults);
	    this.options.priority = this._sanitizePriority(this.options.priority);

	    if (this.options.id === jobDefaults.id) {
	      this.options.id = "".concat(this.options.id, "-").concat(this._randomIndex());
	    }

	    this.promise = new this.Promise(function (_resolve, _reject) {
	      _this._resolve = _resolve;
	      _this._reject = _reject;
	    });
	    this.retryCount = 0;
	  }

	  _createClass(Job, [{
	    key: "_sanitizePriority",
	    value: function _sanitizePriority(priority) {
	      var sProperty;
	      sProperty = ~~priority !== priority ? DEFAULT_PRIORITY : priority;

	      if (sProperty < 0) {
	        return 0;
	      } else if (sProperty > NUM_PRIORITIES - 1) {
	        return NUM_PRIORITIES - 1;
	      } else {
	        return sProperty;
	      }
	    }
	  }, {
	    key: "_randomIndex",
	    value: function _randomIndex() {
	      return Math.random().toString(36).slice(2);
	    }
	  }, {
	    key: "doDrop",
	    value: function doDrop() {
	      var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
	          error = _ref.error,
	          _ref$message = _ref.message,
	          message = _ref$message === void 0 ? "This job has been dropped by Bottleneck" : _ref$message;

	      if (this._states.remove(this.options.id)) {
	        if (this.rejectOnDrop) {
	          this._reject(error != null ? error : new BottleneckError$1(message));
	        }

	        this.Events.trigger("dropped", {
	          args: this.args,
	          options: this.options,
	          task: this.task,
	          promise: this.promise
	        });
	        return true;
	      } else {
	        return false;
	      }
	    }
	  }, {
	    key: "_assertStatus",
	    value: function _assertStatus(expected) {
	      var status;
	      status = this._states.jobStatus(this.options.id);

	      if (!(status === expected || expected === "DONE" && status === null)) {
	        throw new BottleneckError$1("Invalid job status ".concat(status, ", expected ").concat(expected, ". Please open an issue at https://github.com/SGrondin/bottleneck/issues"));
	      }
	    }
	  }, {
	    key: "doReceive",
	    value: function doReceive() {
	      this._states.start(this.options.id);

	      return this.Events.trigger("received", {
	        args: this.args,
	        options: this.options
	      });
	    }
	  }, {
	    key: "doQueue",
	    value: function doQueue(reachedHWM, blocked) {
	      this._assertStatus("RECEIVED");

	      this._states.next(this.options.id);

	      return this.Events.trigger("queued", {
	        args: this.args,
	        options: this.options,
	        reachedHWM: reachedHWM,
	        blocked: blocked
	      });
	    }
	  }, {
	    key: "doRun",
	    value: function doRun() {
	      if (this.retryCount === 0) {
	        this._assertStatus("QUEUED");

	        this._states.next(this.options.id);
	      } else {
	        this._assertStatus("EXECUTING");
	      }

	      return this.Events.trigger("scheduled", {
	        args: this.args,
	        options: this.options
	      });
	    }
	  }, {
	    key: "doExecute",
	    value: function () {
	      var _doExecute = _asyncToGenerator(
	      /*#__PURE__*/
	      regeneratorRuntime.mark(function _callee(chained, clearGlobalState, run, free) {
	        var error, eventInfo, passed;
	        return regeneratorRuntime.wrap(function _callee$(_context) {
	          while (1) {
	            switch (_context.prev = _context.next) {
	              case 0:
	                if (this.retryCount === 0) {
	                  this._assertStatus("RUNNING");

	                  this._states.next(this.options.id);
	                } else {
	                  this._assertStatus("EXECUTING");
	                }

	                eventInfo = {
	                  args: this.args,
	                  options: this.options,
	                  retryCount: this.retryCount
	                };
	                this.Events.trigger("executing", eventInfo);
	                _context.prev = 3;
	                _context.next = 6;
	                return chained != null ? chained.schedule.apply(chained, [this.options, this.task].concat(_toConsumableArray(this.args))) : this.task.apply(this, _toConsumableArray(this.args));

	              case 6:
	                passed = _context.sent;

	                if (!clearGlobalState()) {
	                  _context.next = 13;
	                  break;
	                }

	                this.doDone(eventInfo);
	                _context.next = 11;
	                return free(this.options, eventInfo);

	              case 11:
	                this._assertStatus("DONE");

	                return _context.abrupt("return", this._resolve(passed));

	              case 13:
	                _context.next = 19;
	                break;

	              case 15:
	                _context.prev = 15;
	                _context.t0 = _context["catch"](3);
	                error = _context.t0;
	                return _context.abrupt("return", this._onFailure(error, eventInfo, clearGlobalState, run, free));

	              case 19:
	              case "end":
	                return _context.stop();
	            }
	          }
	        }, _callee, this, [[3, 15]]);
	      }));

	      function doExecute(_x, _x2, _x3, _x4) {
	        return _doExecute.apply(this, arguments);
	      }

	      return doExecute;
	    }()
	  }, {
	    key: "doExpire",
	    value: function doExpire(clearGlobalState, run, free) {
	      var error, eventInfo;

	      if (this._states.jobStatus(this.options.id === "RUNNING")) {
	        this._states.next(this.options.id);
	      }

	      this._assertStatus("EXECUTING");

	      eventInfo = {
	        args: this.args,
	        options: this.options,
	        retryCount: this.retryCount
	      };
	      error = new BottleneckError$1("This job timed out after ".concat(this.options.expiration, " ms."));
	      return this._onFailure(error, eventInfo, clearGlobalState, run, free);
	    }
	  }, {
	    key: "_onFailure",
	    value: function () {
	      var _onFailure2 = _asyncToGenerator(
	      /*#__PURE__*/
	      regeneratorRuntime.mark(function _callee2(error, eventInfo, clearGlobalState, run, free) {
	        var retry, retryAfter;
	        return regeneratorRuntime.wrap(function _callee2$(_context2) {
	          while (1) {
	            switch (_context2.prev = _context2.next) {
	              case 0:
	                if (!clearGlobalState()) {
	                  _context2.next = 16;
	                  break;
	                }

	                _context2.next = 3;
	                return this.Events.trigger("failed", error, eventInfo);

	              case 3:
	                retry = _context2.sent;

	                if (!(retry != null)) {
	                  _context2.next = 11;
	                  break;
	                }

	                retryAfter = ~~retry;
	                this.Events.trigger("retry", "Retrying ".concat(this.options.id, " after ").concat(retryAfter, " ms"), eventInfo);
	                this.retryCount++;
	                return _context2.abrupt("return", run(retryAfter));

	              case 11:
	                this.doDone(eventInfo);
	                _context2.next = 14;
	                return free(this.options, eventInfo);

	              case 14:
	                this._assertStatus("DONE");

	                return _context2.abrupt("return", this._reject(error));

	              case 16:
	              case "end":
	                return _context2.stop();
	            }
	          }
	        }, _callee2, this);
	      }));

	      function _onFailure(_x5, _x6, _x7, _x8, _x9) {
	        return _onFailure2.apply(this, arguments);
	      }

	      return _onFailure;
	    }()
	  }, {
	    key: "doDone",
	    value: function doDone(eventInfo) {
	      this._assertStatus("EXECUTING");

	      this._states.next(this.options.id);

	      return this.Events.trigger("done", eventInfo);
	    }
	  }]);

	  return Job;
	}();

	var Job_1 = Job;

	var BottleneckError$2, LocalDatastore, parser$2;
	parser$2 = parser;
	BottleneckError$2 = BottleneckError_1;

	LocalDatastore =
	/*#__PURE__*/
	function () {
	  function LocalDatastore(instance, storeOptions, storeInstanceOptions) {
	    _classCallCheck(this, LocalDatastore);

	    this.instance = instance;
	    this.storeOptions = storeOptions;
	    this.clientId = this.instance._randomIndex();
	    parser$2.load(storeInstanceOptions, storeInstanceOptions, this);
	    this._nextRequest = this._lastReservoirRefresh = this._lastReservoirIncrease = Date.now();
	    this._running = 0;
	    this._done = 0;
	    this._unblockTime = 0;
	    this.ready = this.Promise.resolve();
	    this.clients = {};

	    this._startHeartbeat();
	  }

	  _createClass(LocalDatastore, [{
	    key: "_startHeartbeat",
	    value: function _startHeartbeat() {
	      var _this = this;

	      var base;

	      if (this.heartbeat == null && (this.storeOptions.reservoirRefreshInterval != null && this.storeOptions.reservoirRefreshAmount != null || this.storeOptions.reservoirIncreaseInterval != null && this.storeOptions.reservoirIncreaseAmount != null)) {
	        return typeof (base = this.heartbeat = setInterval(function () {
	          var amount, incr, maximum, now, reservoir;
	          now = Date.now();

	          if (_this.storeOptions.reservoirRefreshInterval != null && now >= _this._lastReservoirRefresh + _this.storeOptions.reservoirRefreshInterval) {
	            _this._lastReservoirRefresh = now;
	            _this.storeOptions.reservoir = _this.storeOptions.reservoirRefreshAmount;

	            _this.instance._drainAll(_this.computeCapacity());
	          }

	          if (_this.storeOptions.reservoirIncreaseInterval != null && now >= _this._lastReservoirIncrease + _this.storeOptions.reservoirIncreaseInterval) {
	            var _this$storeOptions = _this.storeOptions;
	            amount = _this$storeOptions.reservoirIncreaseAmount;
	            maximum = _this$storeOptions.reservoirIncreaseMaximum;
	            reservoir = _this$storeOptions.reservoir;
	            _this._lastReservoirIncrease = now;
	            incr = maximum != null ? Math.min(amount, maximum - reservoir) : amount;

	            if (incr > 0) {
	              _this.storeOptions.reservoir += incr;
	              return _this.instance._drainAll(_this.computeCapacity());
	            }
	          }
	        }, this.heartbeatInterval)).unref === "function" ? base.unref() : void 0;
	      } else {
	        return clearInterval(this.heartbeat);
	      }
	    }
	  }, {
	    key: "__publish__",
	    value: function () {
	      var _publish__ = _asyncToGenerator(
	      /*#__PURE__*/
	      regeneratorRuntime.mark(function _callee(message) {
	        return regeneratorRuntime.wrap(function _callee$(_context) {
	          while (1) {
	            switch (_context.prev = _context.next) {
	              case 0:
	                _context.next = 2;
	                return this.yieldLoop();

	              case 2:
	                return _context.abrupt("return", this.instance.Events.trigger("message", message.toString()));

	              case 3:
	              case "end":
	                return _context.stop();
	            }
	          }
	        }, _callee, this);
	      }));

	      function __publish__(_x) {
	        return _publish__.apply(this, arguments);
	      }

	      return __publish__;
	    }()
	  }, {
	    key: "__disconnect__",
	    value: function () {
	      var _disconnect__ = _asyncToGenerator(
	      /*#__PURE__*/
	      regeneratorRuntime.mark(function _callee2(flush) {
	        return regeneratorRuntime.wrap(function _callee2$(_context2) {
	          while (1) {
	            switch (_context2.prev = _context2.next) {
	              case 0:
	                _context2.next = 2;
	                return this.yieldLoop();

	              case 2:
	                clearInterval(this.heartbeat);
	                return _context2.abrupt("return", this.Promise.resolve());

	              case 4:
	              case "end":
	                return _context2.stop();
	            }
	          }
	        }, _callee2, this);
	      }));

	      function __disconnect__(_x2) {
	        return _disconnect__.apply(this, arguments);
	      }

	      return __disconnect__;
	    }()
	  }, {
	    key: "yieldLoop",
	    value: function yieldLoop() {
	      var t = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
	      return new this.Promise(function (resolve, reject) {
	        return setTimeout(resolve, t);
	      });
	    }
	  }, {
	    key: "computePenalty",
	    value: function computePenalty() {
	      var ref;
	      return (ref = this.storeOptions.penalty) != null ? ref : 15 * this.storeOptions.minTime || 5000;
	    }
	  }, {
	    key: "__updateSettings__",
	    value: function () {
	      var _updateSettings__ = _asyncToGenerator(
	      /*#__PURE__*/
	      regeneratorRuntime.mark(function _callee3(options) {
	        return regeneratorRuntime.wrap(function _callee3$(_context3) {
	          while (1) {
	            switch (_context3.prev = _context3.next) {
	              case 0:
	                _context3.next = 2;
	                return this.yieldLoop();

	              case 2:
	                parser$2.overwrite(options, options, this.storeOptions);

	                this._startHeartbeat();

	                this.instance._drainAll(this.computeCapacity());

	                return _context3.abrupt("return", true);

	              case 6:
	              case "end":
	                return _context3.stop();
	            }
	          }
	        }, _callee3, this);
	      }));

	      function __updateSettings__(_x3) {
	        return _updateSettings__.apply(this, arguments);
	      }

	      return __updateSettings__;
	    }()
	  }, {
	    key: "__running__",
	    value: function () {
	      var _running__ = _asyncToGenerator(
	      /*#__PURE__*/
	      regeneratorRuntime.mark(function _callee4() {
	        return regeneratorRuntime.wrap(function _callee4$(_context4) {
	          while (1) {
	            switch (_context4.prev = _context4.next) {
	              case 0:
	                _context4.next = 2;
	                return this.yieldLoop();

	              case 2:
	                return _context4.abrupt("return", this._running);

	              case 3:
	              case "end":
	                return _context4.stop();
	            }
	          }
	        }, _callee4, this);
	      }));

	      function __running__() {
	        return _running__.apply(this, arguments);
	      }

	      return __running__;
	    }()
	  }, {
	    key: "__queued__",
	    value: function () {
	      var _queued__ = _asyncToGenerator(
	      /*#__PURE__*/
	      regeneratorRuntime.mark(function _callee5() {
	        return regeneratorRuntime.wrap(function _callee5$(_context5) {
	          while (1) {
	            switch (_context5.prev = _context5.next) {
	              case 0:
	                _context5.next = 2;
	                return this.yieldLoop();

	              case 2:
	                return _context5.abrupt("return", this.instance.queued());

	              case 3:
	              case "end":
	                return _context5.stop();
	            }
	          }
	        }, _callee5, this);
	      }));

	      function __queued__() {
	        return _queued__.apply(this, arguments);
	      }

	      return __queued__;
	    }()
	  }, {
	    key: "__done__",
	    value: function () {
	      var _done__ = _asyncToGenerator(
	      /*#__PURE__*/
	      regeneratorRuntime.mark(function _callee6() {
	        return regeneratorRuntime.wrap(function _callee6$(_context6) {
	          while (1) {
	            switch (_context6.prev = _context6.next) {
	              case 0:
	                _context6.next = 2;
	                return this.yieldLoop();

	              case 2:
	                return _context6.abrupt("return", this._done);

	              case 3:
	              case "end":
	                return _context6.stop();
	            }
	          }
	        }, _callee6, this);
	      }));

	      function __done__() {
	        return _done__.apply(this, arguments);
	      }

	      return __done__;
	    }()
	  }, {
	    key: "__groupCheck__",
	    value: function () {
	      var _groupCheck__ = _asyncToGenerator(
	      /*#__PURE__*/
	      regeneratorRuntime.mark(function _callee7(time) {
	        return regeneratorRuntime.wrap(function _callee7$(_context7) {
	          while (1) {
	            switch (_context7.prev = _context7.next) {
	              case 0:
	                _context7.next = 2;
	                return this.yieldLoop();

	              case 2:
	                return _context7.abrupt("return", this._nextRequest + this.timeout < time);

	              case 3:
	              case "end":
	                return _context7.stop();
	            }
	          }
	        }, _callee7, this);
	      }));

	      function __groupCheck__(_x4) {
	        return _groupCheck__.apply(this, arguments);
	      }

	      return __groupCheck__;
	    }()
	  }, {
	    key: "computeCapacity",
	    value: function computeCapacity() {
	      var maxConcurrent, reservoir;
	      var _this$storeOptions2 = this.storeOptions;
	      maxConcurrent = _this$storeOptions2.maxConcurrent;
	      reservoir = _this$storeOptions2.reservoir;

	      if (maxConcurrent != null && reservoir != null) {
	        return Math.min(maxConcurrent - this._running, reservoir);
	      } else if (maxConcurrent != null) {
	        return maxConcurrent - this._running;
	      } else if (reservoir != null) {
	        return reservoir;
	      } else {
	        return null;
	      }
	    }
	  }, {
	    key: "conditionsCheck",
	    value: function conditionsCheck(weight) {
	      var capacity;
	      capacity = this.computeCapacity();
	      return capacity == null || weight <= capacity;
	    }
	  }, {
	    key: "__incrementReservoir__",
	    value: function () {
	      var _incrementReservoir__ = _asyncToGenerator(
	      /*#__PURE__*/
	      regeneratorRuntime.mark(function _callee8(incr) {
	        var reservoir;
	        return regeneratorRuntime.wrap(function _callee8$(_context8) {
	          while (1) {
	            switch (_context8.prev = _context8.next) {
	              case 0:
	                _context8.next = 2;
	                return this.yieldLoop();

	              case 2:
	                reservoir = this.storeOptions.reservoir += incr;

	                this.instance._drainAll(this.computeCapacity());

	                return _context8.abrupt("return", reservoir);

	              case 5:
	              case "end":
	                return _context8.stop();
	            }
	          }
	        }, _callee8, this);
	      }));

	      function __incrementReservoir__(_x5) {
	        return _incrementReservoir__.apply(this, arguments);
	      }

	      return __incrementReservoir__;
	    }()
	  }, {
	    key: "__currentReservoir__",
	    value: function () {
	      var _currentReservoir__ = _asyncToGenerator(
	      /*#__PURE__*/
	      regeneratorRuntime.mark(function _callee9() {
	        return regeneratorRuntime.wrap(function _callee9$(_context9) {
	          while (1) {
	            switch (_context9.prev = _context9.next) {
	              case 0:
	                _context9.next = 2;
	                return this.yieldLoop();

	              case 2:
	                return _context9.abrupt("return", this.storeOptions.reservoir);

	              case 3:
	              case "end":
	                return _context9.stop();
	            }
	          }
	        }, _callee9, this);
	      }));

	      function __currentReservoir__() {
	        return _currentReservoir__.apply(this, arguments);
	      }

	      return __currentReservoir__;
	    }()
	  }, {
	    key: "isBlocked",
	    value: function isBlocked(now) {
	      return this._unblockTime >= now;
	    }
	  }, {
	    key: "check",
	    value: function check(weight, now) {
	      return this.conditionsCheck(weight) && this._nextRequest - now <= 0;
	    }
	  }, {
	    key: "__check__",
	    value: function () {
	      var _check__ = _asyncToGenerator(
	      /*#__PURE__*/
	      regeneratorRuntime.mark(function _callee10(weight) {
	        var now;
	        return regeneratorRuntime.wrap(function _callee10$(_context10) {
	          while (1) {
	            switch (_context10.prev = _context10.next) {
	              case 0:
	                _context10.next = 2;
	                return this.yieldLoop();

	              case 2:
	                now = Date.now();
	                return _context10.abrupt("return", this.check(weight, now));

	              case 4:
	              case "end":
	                return _context10.stop();
	            }
	          }
	        }, _callee10, this);
	      }));

	      function __check__(_x6) {
	        return _check__.apply(this, arguments);
	      }

	      return __check__;
	    }()
	  }, {
	    key: "__register__",
	    value: function () {
	      var _register__ = _asyncToGenerator(
	      /*#__PURE__*/
	      regeneratorRuntime.mark(function _callee11(index, weight, expiration) {
	        var now, wait;
	        return regeneratorRuntime.wrap(function _callee11$(_context11) {
	          while (1) {
	            switch (_context11.prev = _context11.next) {
	              case 0:
	                _context11.next = 2;
	                return this.yieldLoop();

	              case 2:
	                now = Date.now();

	                if (!this.conditionsCheck(weight)) {
	                  _context11.next = 11;
	                  break;
	                }

	                this._running += weight;

	                if (this.storeOptions.reservoir != null) {
	                  this.storeOptions.reservoir -= weight;
	                }

	                wait = Math.max(this._nextRequest - now, 0);
	                this._nextRequest = now + wait + this.storeOptions.minTime;
	                return _context11.abrupt("return", {
	                  success: true,
	                  wait: wait,
	                  reservoir: this.storeOptions.reservoir
	                });

	              case 11:
	                return _context11.abrupt("return", {
	                  success: false
	                });

	              case 12:
	              case "end":
	                return _context11.stop();
	            }
	          }
	        }, _callee11, this);
	      }));

	      function __register__(_x7, _x8, _x9) {
	        return _register__.apply(this, arguments);
	      }

	      return __register__;
	    }()
	  }, {
	    key: "strategyIsBlock",
	    value: function strategyIsBlock() {
	      return this.storeOptions.strategy === 3;
	    }
	  }, {
	    key: "__submit__",
	    value: function () {
	      var _submit__ = _asyncToGenerator(
	      /*#__PURE__*/
	      regeneratorRuntime.mark(function _callee12(queueLength, weight) {
	        var blocked, now, reachedHWM;
	        return regeneratorRuntime.wrap(function _callee12$(_context12) {
	          while (1) {
	            switch (_context12.prev = _context12.next) {
	              case 0:
	                _context12.next = 2;
	                return this.yieldLoop();

	              case 2:
	                if (!(this.storeOptions.maxConcurrent != null && weight > this.storeOptions.maxConcurrent)) {
	                  _context12.next = 4;
	                  break;
	                }

	                throw new BottleneckError$2("Impossible to add a job having a weight of ".concat(weight, " to a limiter having a maxConcurrent setting of ").concat(this.storeOptions.maxConcurrent));

	              case 4:
	                now = Date.now();
	                reachedHWM = this.storeOptions.highWater != null && queueLength === this.storeOptions.highWater && !this.check(weight, now);
	                blocked = this.strategyIsBlock() && (reachedHWM || this.isBlocked(now));

	                if (blocked) {
	                  this._unblockTime = now + this.computePenalty();
	                  this._nextRequest = this._unblockTime + this.storeOptions.minTime;

	                  this.instance._dropAllQueued();
	                }

	                return _context12.abrupt("return", {
	                  reachedHWM: reachedHWM,
	                  blocked: blocked,
	                  strategy: this.storeOptions.strategy
	                });

	              case 9:
	              case "end":
	                return _context12.stop();
	            }
	          }
	        }, _callee12, this);
	      }));

	      function __submit__(_x10, _x11) {
	        return _submit__.apply(this, arguments);
	      }

	      return __submit__;
	    }()
	  }, {
	    key: "__free__",
	    value: function () {
	      var _free__ = _asyncToGenerator(
	      /*#__PURE__*/
	      regeneratorRuntime.mark(function _callee13(index, weight) {
	        return regeneratorRuntime.wrap(function _callee13$(_context13) {
	          while (1) {
	            switch (_context13.prev = _context13.next) {
	              case 0:
	                _context13.next = 2;
	                return this.yieldLoop();

	              case 2:
	                this._running -= weight;
	                this._done += weight;

	                this.instance._drainAll(this.computeCapacity());

	                return _context13.abrupt("return", {
	                  running: this._running
	                });

	              case 6:
	              case "end":
	                return _context13.stop();
	            }
	          }
	        }, _callee13, this);
	      }));

	      function __free__(_x12, _x13) {
	        return _free__.apply(this, arguments);
	      }

	      return __free__;
	    }()
	  }]);

	  return LocalDatastore;
	}();

	var LocalDatastore_1 = LocalDatastore;

	var lua = {
		"blacklist_client.lua": "local blacklist = ARGV[num_static_argv + 1]\n\nif redis.call('zscore', client_last_seen_key, blacklist) then\n  redis.call('zadd', client_last_seen_key, 0, blacklist)\nend\n\n\nreturn {}\n",
		"check.lua": "local weight = tonumber(ARGV[num_static_argv + 1])\n\nlocal capacity = process_tick(now, false)['capacity']\nlocal nextRequest = tonumber(redis.call('hget', settings_key, 'nextRequest'))\n\nreturn conditions_check(capacity, weight) and nextRequest - now <= 0\n",
		"conditions_check.lua": "local conditions_check = function (capacity, weight)\n  return capacity == nil or weight <= capacity\nend\n",
		"current_reservoir.lua": "return process_tick(now, false)['reservoir']\n",
		"done.lua": "process_tick(now, false)\n\nreturn tonumber(redis.call('hget', settings_key, 'done'))\n",
		"free.lua": "local index = ARGV[num_static_argv + 1]\n\nredis.call('zadd', job_expirations_key, 0, index)\n\nreturn process_tick(now, false)['running']\n",
		"get_time.lua": "redis.replicate_commands()\n\nlocal get_time = function ()\n  local time = redis.call('time')\n\n  return tonumber(time[1]..string.sub(time[2], 1, 3))\nend\n",
		"group_check.lua": "return not (redis.call('exists', settings_key) == 1)\n",
		"heartbeat.lua": "process_tick(now, true)\n",
		"increment_reservoir.lua": "local incr = tonumber(ARGV[num_static_argv + 1])\n\nredis.call('hincrby', settings_key, 'reservoir', incr)\n\nlocal reservoir = process_tick(now, true)['reservoir']\n\nlocal groupTimeout = tonumber(redis.call('hget', settings_key, 'groupTimeout'))\nrefresh_expiration(0, 0, groupTimeout)\n\nreturn reservoir\n",
		"init.lua": "local clear = tonumber(ARGV[num_static_argv + 1])\nlocal limiter_version = ARGV[num_static_argv + 2]\nlocal num_local_argv = num_static_argv + 2\n\nif clear == 1 then\n  redis.call('del', unpack(KEYS))\nend\n\nif redis.call('exists', settings_key) == 0 then\n  -- Create\n  local args = {'hmset', settings_key}\n\n  for i = num_local_argv + 1, #ARGV do\n    table.insert(args, ARGV[i])\n  end\n\n  redis.call(unpack(args))\n  redis.call('hmset', settings_key,\n    'nextRequest', now,\n    'lastReservoirRefresh', now,\n    'lastReservoirIncrease', now,\n    'running', 0,\n    'done', 0,\n    'unblockTime', 0,\n    'capacityPriorityCounter', 0\n  )\n\nelse\n  -- Apply migrations\n  local settings = redis.call('hmget', settings_key,\n    'id',\n    'version'\n  )\n  local id = settings[1]\n  local current_version = settings[2]\n\n  if current_version ~= limiter_version then\n    local version_digits = {}\n    for k, v in string.gmatch(current_version, \"([^.]+)\") do\n      table.insert(version_digits, tonumber(k))\n    end\n\n    -- 2.10.0\n    if version_digits[2] < 10 then\n      redis.call('hsetnx', settings_key, 'reservoirRefreshInterval', '')\n      redis.call('hsetnx', settings_key, 'reservoirRefreshAmount', '')\n      redis.call('hsetnx', settings_key, 'lastReservoirRefresh', '')\n      redis.call('hsetnx', settings_key, 'done', 0)\n      redis.call('hset', settings_key, 'version', '2.10.0')\n    end\n\n    -- 2.11.1\n    if version_digits[2] < 11 or (version_digits[2] == 11 and version_digits[3] < 1) then\n      if redis.call('hstrlen', settings_key, 'lastReservoirRefresh') == 0 then\n        redis.call('hmset', settings_key,\n          'lastReservoirRefresh', now,\n          'version', '2.11.1'\n        )\n      end\n    end\n\n    -- 2.14.0\n    if version_digits[2] < 14 then\n      local old_running_key = 'b_'..id..'_running'\n      local old_executing_key = 'b_'..id..'_executing'\n\n      if redis.call('exists', old_running_key) == 1 then\n        redis.call('rename', old_running_key, job_weights_key)\n      end\n      if redis.call('exists', old_executing_key) == 1 then\n        redis.call('rename', old_executing_key, job_expirations_key)\n      end\n      redis.call('hset', settings_key, 'version', '2.14.0')\n    end\n\n    -- 2.15.2\n    if version_digits[2] < 15 or (version_digits[2] == 15 and version_digits[3] < 2) then\n      redis.call('hsetnx', settings_key, 'capacityPriorityCounter', 0)\n      redis.call('hset', settings_key, 'version', '2.15.2')\n    end\n\n    -- 2.17.0\n    if version_digits[2] < 17 then\n      redis.call('hsetnx', settings_key, 'clientTimeout', 10000)\n      redis.call('hset', settings_key, 'version', '2.17.0')\n    end\n\n    -- 2.18.0\n    if version_digits[2] < 18 then\n      redis.call('hsetnx', settings_key, 'reservoirIncreaseInterval', '')\n      redis.call('hsetnx', settings_key, 'reservoirIncreaseAmount', '')\n      redis.call('hsetnx', settings_key, 'reservoirIncreaseMaximum', '')\n      redis.call('hsetnx', settings_key, 'lastReservoirIncrease', now)\n      redis.call('hset', settings_key, 'version', '2.18.0')\n    end\n\n  end\n\n  process_tick(now, false)\nend\n\nlocal groupTimeout = tonumber(redis.call('hget', settings_key, 'groupTimeout'))\nrefresh_expiration(0, 0, groupTimeout)\n\nreturn {}\n",
		"process_tick.lua": "local process_tick = function (now, always_publish)\n\n  local compute_capacity = function (maxConcurrent, running, reservoir)\n    if maxConcurrent ~= nil and reservoir ~= nil then\n      return math.min((maxConcurrent - running), reservoir)\n    elseif maxConcurrent ~= nil then\n      return maxConcurrent - running\n    elseif reservoir ~= nil then\n      return reservoir\n    else\n      return nil\n    end\n  end\n\n  local settings = redis.call('hmget', settings_key,\n    'id',\n    'maxConcurrent',\n    'running',\n    'reservoir',\n    'reservoirRefreshInterval',\n    'reservoirRefreshAmount',\n    'lastReservoirRefresh',\n    'reservoirIncreaseInterval',\n    'reservoirIncreaseAmount',\n    'reservoirIncreaseMaximum',\n    'lastReservoirIncrease',\n    'capacityPriorityCounter',\n    'clientTimeout'\n  )\n  local id = settings[1]\n  local maxConcurrent = tonumber(settings[2])\n  local running = tonumber(settings[3])\n  local reservoir = tonumber(settings[4])\n  local reservoirRefreshInterval = tonumber(settings[5])\n  local reservoirRefreshAmount = tonumber(settings[6])\n  local lastReservoirRefresh = tonumber(settings[7])\n  local reservoirIncreaseInterval = tonumber(settings[8])\n  local reservoirIncreaseAmount = tonumber(settings[9])\n  local reservoirIncreaseMaximum = tonumber(settings[10])\n  local lastReservoirIncrease = tonumber(settings[11])\n  local capacityPriorityCounter = tonumber(settings[12])\n  local clientTimeout = tonumber(settings[13])\n\n  local initial_capacity = compute_capacity(maxConcurrent, running, reservoir)\n\n  --\n  -- Process 'running' changes\n  --\n  local expired = redis.call('zrangebyscore', job_expirations_key, '-inf', '('..now)\n\n  if #expired > 0 then\n    redis.call('zremrangebyscore', job_expirations_key, '-inf', '('..now)\n\n    local flush_batch = function (batch, acc)\n      local weights = redis.call('hmget', job_weights_key, unpack(batch))\n                      redis.call('hdel',  job_weights_key, unpack(batch))\n      local clients = redis.call('hmget', job_clients_key, unpack(batch))\n                      redis.call('hdel',  job_clients_key, unpack(batch))\n\n      -- Calculate sum of removed weights\n      for i = 1, #weights do\n        acc['total'] = acc['total'] + (tonumber(weights[i]) or 0)\n      end\n\n      -- Calculate sum of removed weights by client\n      local client_weights = {}\n      for i = 1, #clients do\n        local removed = tonumber(weights[i]) or 0\n        if removed > 0 then\n          acc['client_weights'][clients[i]] = (acc['client_weights'][clients[i]] or 0) + removed\n        end\n      end\n    end\n\n    local acc = {\n      ['total'] = 0,\n      ['client_weights'] = {}\n    }\n    local batch_size = 1000\n\n    -- Compute changes to Zsets and apply changes to Hashes\n    for i = 1, #expired, batch_size do\n      local batch = {}\n      for j = i, math.min(i + batch_size - 1, #expired) do\n        table.insert(batch, expired[j])\n      end\n\n      flush_batch(batch, acc)\n    end\n\n    -- Apply changes to Zsets\n    if acc['total'] > 0 then\n      redis.call('hincrby', settings_key, 'done', acc['total'])\n      running = tonumber(redis.call('hincrby', settings_key, 'running', -acc['total']))\n    end\n\n    for client, weight in pairs(acc['client_weights']) do\n      redis.call('zincrby', client_running_key, -weight, client)\n    end\n  end\n\n  --\n  -- Process 'reservoir' changes\n  --\n  local reservoirRefreshActive = reservoirRefreshInterval ~= nil and reservoirRefreshAmount ~= nil\n  if reservoirRefreshActive and now >= lastReservoirRefresh + reservoirRefreshInterval then\n    reservoir = reservoirRefreshAmount\n    redis.call('hmset', settings_key,\n      'reservoir', reservoir,\n      'lastReservoirRefresh', now\n    )\n  end\n\n  local reservoirIncreaseActive = reservoirIncreaseInterval ~= nil and reservoirIncreaseAmount ~= nil\n  if reservoirIncreaseActive and now >= lastReservoirIncrease + reservoirIncreaseInterval then\n    local num_intervals = math.floor((now - lastReservoirIncrease) / reservoirIncreaseInterval)\n    local incr = reservoirIncreaseAmount * num_intervals\n    if reservoirIncreaseMaximum ~= nil then\n      incr = math.min(incr, reservoirIncreaseMaximum - (reservoir or 0))\n    end\n    if incr > 0 then\n      reservoir = (reservoir or 0) + incr\n    end\n    redis.call('hmset', settings_key,\n      'reservoir', reservoir,\n      'lastReservoirIncrease', lastReservoirIncrease + (num_intervals * reservoirIncreaseInterval)\n    )\n  end\n\n  --\n  -- Clear unresponsive clients\n  --\n  local unresponsive = redis.call('zrangebyscore', client_last_seen_key, '-inf', (now - clientTimeout))\n  local unresponsive_lookup = {}\n  local terminated_clients = {}\n  for i = 1, #unresponsive do\n    unresponsive_lookup[unresponsive[i]] = true\n    if tonumber(redis.call('zscore', client_running_key, unresponsive[i])) == 0 then\n      table.insert(terminated_clients, unresponsive[i])\n    end\n  end\n  if #terminated_clients > 0 then\n    redis.call('zrem', client_running_key,         unpack(terminated_clients))\n    redis.call('hdel', client_num_queued_key,      unpack(terminated_clients))\n    redis.call('zrem', client_last_registered_key, unpack(terminated_clients))\n    redis.call('zrem', client_last_seen_key,       unpack(terminated_clients))\n  end\n\n  --\n  -- Broadcast capacity changes\n  --\n  local final_capacity = compute_capacity(maxConcurrent, running, reservoir)\n\n  if always_publish or (initial_capacity ~= nil and final_capacity == nil) then\n    -- always_publish or was not unlimited, now unlimited\n    redis.call('publish', 'b_'..id, 'capacity:'..(final_capacity or ''))\n\n  elseif initial_capacity ~= nil and final_capacity ~= nil and final_capacity > initial_capacity then\n    -- capacity was increased\n    -- send the capacity message to the limiter having the lowest number of running jobs\n    -- the tiebreaker is the limiter having not registered a job in the longest time\n\n    local lowest_concurrency_value = nil\n    local lowest_concurrency_clients = {}\n    local lowest_concurrency_last_registered = {}\n    local client_concurrencies = redis.call('zrange', client_running_key, 0, -1, 'withscores')\n\n    for i = 1, #client_concurrencies, 2 do\n      local client = client_concurrencies[i]\n      local concurrency = tonumber(client_concurrencies[i+1])\n\n      if (\n        lowest_concurrency_value == nil or lowest_concurrency_value == concurrency\n      ) and (\n        not unresponsive_lookup[client]\n      ) and (\n        tonumber(redis.call('hget', client_num_queued_key, client)) > 0\n      ) then\n        lowest_concurrency_value = concurrency\n        table.insert(lowest_concurrency_clients, client)\n        local last_registered = tonumber(redis.call('zscore', client_last_registered_key, client))\n        table.insert(lowest_concurrency_last_registered, last_registered)\n      end\n    end\n\n    if #lowest_concurrency_clients > 0 then\n      local position = 1\n      local earliest = lowest_concurrency_last_registered[1]\n\n      for i,v in ipairs(lowest_concurrency_last_registered) do\n        if v < earliest then\n          position = i\n          earliest = v\n        end\n      end\n\n      local next_client = lowest_concurrency_clients[position]\n      redis.call('publish', 'b_'..id,\n        'capacity-priority:'..(final_capacity or '')..\n        ':'..next_client..\n        ':'..capacityPriorityCounter\n      )\n      redis.call('hincrby', settings_key, 'capacityPriorityCounter', '1')\n    else\n      redis.call('publish', 'b_'..id, 'capacity:'..(final_capacity or ''))\n    end\n  end\n\n  return {\n    ['capacity'] = final_capacity,\n    ['running'] = running,\n    ['reservoir'] = reservoir\n  }\nend\n",
		"queued.lua": "local clientTimeout = tonumber(redis.call('hget', settings_key, 'clientTimeout'))\nlocal valid_clients = redis.call('zrangebyscore', client_last_seen_key, (now - clientTimeout), 'inf')\nlocal client_queued = redis.call('hmget', client_num_queued_key, unpack(valid_clients))\n\nlocal sum = 0\nfor i = 1, #client_queued do\n  sum = sum + tonumber(client_queued[i])\nend\n\nreturn sum\n",
		"refresh_expiration.lua": "local refresh_expiration = function (now, nextRequest, groupTimeout)\n\n  if groupTimeout ~= nil then\n    local ttl = (nextRequest + groupTimeout) - now\n\n    for i = 1, #KEYS do\n      redis.call('pexpire', KEYS[i], ttl)\n    end\n  end\n\nend\n",
		"refs.lua": "local settings_key = KEYS[1]\nlocal job_weights_key = KEYS[2]\nlocal job_expirations_key = KEYS[3]\nlocal job_clients_key = KEYS[4]\nlocal client_running_key = KEYS[5]\nlocal client_num_queued_key = KEYS[6]\nlocal client_last_registered_key = KEYS[7]\nlocal client_last_seen_key = KEYS[8]\n\nlocal now = tonumber(ARGV[1])\nlocal client = ARGV[2]\n\nlocal num_static_argv = 2\n",
		"register.lua": "local index = ARGV[num_static_argv + 1]\nlocal weight = tonumber(ARGV[num_static_argv + 2])\nlocal expiration = tonumber(ARGV[num_static_argv + 3])\n\nlocal state = process_tick(now, false)\nlocal capacity = state['capacity']\nlocal reservoir = state['reservoir']\n\nlocal settings = redis.call('hmget', settings_key,\n  'nextRequest',\n  'minTime',\n  'groupTimeout'\n)\nlocal nextRequest = tonumber(settings[1])\nlocal minTime = tonumber(settings[2])\nlocal groupTimeout = tonumber(settings[3])\n\nif conditions_check(capacity, weight) then\n\n  redis.call('hincrby', settings_key, 'running', weight)\n  redis.call('hset', job_weights_key, index, weight)\n  if expiration ~= nil then\n    redis.call('zadd', job_expirations_key, now + expiration, index)\n  end\n  redis.call('hset', job_clients_key, index, client)\n  redis.call('zincrby', client_running_key, weight, client)\n  redis.call('hincrby', client_num_queued_key, client, -1)\n  redis.call('zadd', client_last_registered_key, now, client)\n\n  local wait = math.max(nextRequest - now, 0)\n  local newNextRequest = now + wait + minTime\n\n  if reservoir == nil then\n    redis.call('hset', settings_key,\n      'nextRequest', newNextRequest\n    )\n  else\n    reservoir = reservoir - weight\n    redis.call('hmset', settings_key,\n      'reservoir', reservoir,\n      'nextRequest', newNextRequest\n    )\n  end\n\n  refresh_expiration(now, newNextRequest, groupTimeout)\n\n  return {true, wait, reservoir}\n\nelse\n  return {false}\nend\n",
		"register_client.lua": "local queued = tonumber(ARGV[num_static_argv + 1])\n\n-- Could have been re-registered concurrently\nif not redis.call('zscore', client_last_seen_key, client) then\n  redis.call('zadd', client_running_key, 0, client)\n  redis.call('hset', client_num_queued_key, client, queued)\n  redis.call('zadd', client_last_registered_key, 0, client)\nend\n\nredis.call('zadd', client_last_seen_key, now, client)\n\nreturn {}\n",
		"running.lua": "return process_tick(now, false)['running']\n",
		"submit.lua": "local queueLength = tonumber(ARGV[num_static_argv + 1])\nlocal weight = tonumber(ARGV[num_static_argv + 2])\n\nlocal capacity = process_tick(now, false)['capacity']\n\nlocal settings = redis.call('hmget', settings_key,\n  'id',\n  'maxConcurrent',\n  'highWater',\n  'nextRequest',\n  'strategy',\n  'unblockTime',\n  'penalty',\n  'minTime',\n  'groupTimeout'\n)\nlocal id = settings[1]\nlocal maxConcurrent = tonumber(settings[2])\nlocal highWater = tonumber(settings[3])\nlocal nextRequest = tonumber(settings[4])\nlocal strategy = tonumber(settings[5])\nlocal unblockTime = tonumber(settings[6])\nlocal penalty = tonumber(settings[7])\nlocal minTime = tonumber(settings[8])\nlocal groupTimeout = tonumber(settings[9])\n\nif maxConcurrent ~= nil and weight > maxConcurrent then\n  return redis.error_reply('OVERWEIGHT:'..weight..':'..maxConcurrent)\nend\n\nlocal reachedHWM = (highWater ~= nil and queueLength == highWater\n  and not (\n    conditions_check(capacity, weight)\n    and nextRequest - now <= 0\n  )\n)\n\nlocal blocked = strategy == 3 and (reachedHWM or unblockTime >= now)\n\nif blocked then\n  local computedPenalty = penalty\n  if computedPenalty == nil then\n    if minTime == 0 then\n      computedPenalty = 5000\n    else\n      computedPenalty = 15 * minTime\n    end\n  end\n\n  local newNextRequest = now + computedPenalty + minTime\n\n  redis.call('hmset', settings_key,\n    'unblockTime', now + computedPenalty,\n    'nextRequest', newNextRequest\n  )\n\n  local clients_queued_reset = redis.call('hkeys', client_num_queued_key)\n  local queued_reset = {}\n  for i = 1, #clients_queued_reset do\n    table.insert(queued_reset, clients_queued_reset[i])\n    table.insert(queued_reset, 0)\n  end\n  redis.call('hmset', client_num_queued_key, unpack(queued_reset))\n\n  redis.call('publish', 'b_'..id, 'blocked:')\n\n  refresh_expiration(now, newNextRequest, groupTimeout)\nend\n\nif not blocked and not reachedHWM then\n  redis.call('hincrby', client_num_queued_key, client, 1)\nend\n\nreturn {reachedHWM, blocked, strategy}\n",
		"update_settings.lua": "local args = {'hmset', settings_key}\n\nfor i = num_static_argv + 1, #ARGV do\n  table.insert(args, ARGV[i])\nend\n\nredis.call(unpack(args))\n\nprocess_tick(now, true)\n\nlocal groupTimeout = tonumber(redis.call('hget', settings_key, 'groupTimeout'))\nrefresh_expiration(0, 0, groupTimeout)\n\nreturn {}\n",
		"validate_client.lua": "if not redis.call('zscore', client_last_seen_key, client) then\n  return redis.error_reply('UNKNOWN_CLIENT')\nend\n\nredis.call('zadd', client_last_seen_key, now, client)\n",
		"validate_keys.lua": "if not (redis.call('exists', settings_key) == 1) then\n  return redis.error_reply('SETTINGS_KEY_NOT_FOUND')\nend\n"
	};

	var lua$1 = /*#__PURE__*/Object.freeze({
		default: lua
	});

	var require$$0 = getCjsExportFromNamespace(lua$1);

	var Scripts = createCommonjsModule(function (module, exports) {
	  var headers, lua, templates;
	  lua = require$$0;
	  headers = {
	    refs: lua["refs.lua"],
	    validate_keys: lua["validate_keys.lua"],
	    validate_client: lua["validate_client.lua"],
	    refresh_expiration: lua["refresh_expiration.lua"],
	    process_tick: lua["process_tick.lua"],
	    conditions_check: lua["conditions_check.lua"],
	    get_time: lua["get_time.lua"]
	  };

	  exports.allKeys = function (id) {
	    return [
	    /*
	    HASH
	    */
	    "b_".concat(id, "_settings"),
	    /*
	    HASH
	    job index -> weight
	    */
	    "b_".concat(id, "_job_weights"),
	    /*
	    ZSET
	    job index -> expiration
	    */
	    "b_".concat(id, "_job_expirations"),
	    /*
	    HASH
	    job index -> client
	    */
	    "b_".concat(id, "_job_clients"),
	    /*
	    ZSET
	    client -> sum running
	    */
	    "b_".concat(id, "_client_running"),
	    /*
	    HASH
	    client -> num queued
	    */
	    "b_".concat(id, "_client_num_queued"),
	    /*
	    ZSET
	    client -> last job registered
	    */
	    "b_".concat(id, "_client_last_registered"),
	    /*
	    ZSET
	    client -> last seen
	    */
	    "b_".concat(id, "_client_last_seen")];
	  };

	  templates = {
	    init: {
	      keys: exports.allKeys,
	      headers: ["process_tick"],
	      refresh_expiration: true,
	      code: lua["init.lua"]
	    },
	    group_check: {
	      keys: exports.allKeys,
	      headers: [],
	      refresh_expiration: false,
	      code: lua["group_check.lua"]
	    },
	    register_client: {
	      keys: exports.allKeys,
	      headers: ["validate_keys"],
	      refresh_expiration: false,
	      code: lua["register_client.lua"]
	    },
	    blacklist_client: {
	      keys: exports.allKeys,
	      headers: ["validate_keys", "validate_client"],
	      refresh_expiration: false,
	      code: lua["blacklist_client.lua"]
	    },
	    heartbeat: {
	      keys: exports.allKeys,
	      headers: ["validate_keys", "validate_client", "process_tick"],
	      refresh_expiration: false,
	      code: lua["heartbeat.lua"]
	    },
	    update_settings: {
	      keys: exports.allKeys,
	      headers: ["validate_keys", "validate_client", "process_tick"],
	      refresh_expiration: true,
	      code: lua["update_settings.lua"]
	    },
	    running: {
	      keys: exports.allKeys,
	      headers: ["validate_keys", "validate_client", "process_tick"],
	      refresh_expiration: false,
	      code: lua["running.lua"]
	    },
	    queued: {
	      keys: exports.allKeys,
	      headers: ["validate_keys", "validate_client"],
	      refresh_expiration: false,
	      code: lua["queued.lua"]
	    },
	    done: {
	      keys: exports.allKeys,
	      headers: ["validate_keys", "validate_client", "process_tick"],
	      refresh_expiration: false,
	      code: lua["done.lua"]
	    },
	    check: {
	      keys: exports.allKeys,
	      headers: ["validate_keys", "validate_client", "process_tick", "conditions_check"],
	      refresh_expiration: false,
	      code: lua["check.lua"]
	    },
	    submit: {
	      keys: exports.allKeys,
	      headers: ["validate_keys", "validate_client", "process_tick", "conditions_check"],
	      refresh_expiration: true,
	      code: lua["submit.lua"]
	    },
	    register: {
	      keys: exports.allKeys,
	      headers: ["validate_keys", "validate_client", "process_tick", "conditions_check"],
	      refresh_expiration: true,
	      code: lua["register.lua"]
	    },
	    free: {
	      keys: exports.allKeys,
	      headers: ["validate_keys", "validate_client", "process_tick"],
	      refresh_expiration: true,
	      code: lua["free.lua"]
	    },
	    current_reservoir: {
	      keys: exports.allKeys,
	      headers: ["validate_keys", "validate_client", "process_tick"],
	      refresh_expiration: false,
	      code: lua["current_reservoir.lua"]
	    },
	    increment_reservoir: {
	      keys: exports.allKeys,
	      headers: ["validate_keys", "validate_client", "process_tick"],
	      refresh_expiration: true,
	      code: lua["increment_reservoir.lua"]
	    }
	  };
	  exports.names = Object.keys(templates);

	  exports.keys = function (name, id) {
	    return templates[name].keys(id);
	  };

	  exports.payload = function (name) {
	    var template;
	    template = templates[name];
	    return Array.prototype.concat(headers.refs, template.headers.map(function (h) {
	      return headers[h];
	    }), template.refresh_expiration ? headers.refresh_expiration : "", template.code).join("\n");
	  };
	});
	var Scripts_1 = Scripts.allKeys;
	var Scripts_2 = Scripts.names;
	var Scripts_3 = Scripts.keys;
	var Scripts_4 = Scripts.payload;

	var Events$2, RedisConnection, Scripts$1, parser$3;
	parser$3 = parser;
	Events$2 = Events_1;
	Scripts$1 = Scripts;

	RedisConnection = function () {
	  var RedisConnection =
	  /*#__PURE__*/
	  function () {
	    function RedisConnection() {
	      var _this = this;

	      var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

	      _classCallCheck(this, RedisConnection);

	      parser$3.load(options, this.defaults, this);

	      if (this.Redis == null) {
	        this.Redis = eval("require")("redis"); // Obfuscated or else Webpack/Angular will try to inline the optional redis module. To override this behavior: pass the redis module to Bottleneck as the 'Redis' option.
	      }

	      if (this.Events == null) {
	        this.Events = new Events$2(this);
	      }

	      this.terminated = false;

	      if (this.client == null) {
	        this.client = this.Redis.createClient(this.clientOptions);
	      }

	      this.subscriber = this.client.duplicate();
	      this.limiters = {};
	      this.shas = {};
	      this.ready = this.Promise.all([this._setup(this.client, false), this._setup(this.subscriber, true)]).then(function () {
	        return _this._loadScripts();
	      }).then(function () {
	        return {
	          client: _this.client,
	          subscriber: _this.subscriber
	        };
	      });
	    }

	    _createClass(RedisConnection, [{
	      key: "_setup",
	      value: function _setup(client, sub) {
	        var _this2 = this;

	        client.setMaxListeners(0);
	        return new this.Promise(function (resolve, reject) {
	          client.on("error", function (e) {
	            return _this2.Events.trigger("error", e);
	          });

	          if (sub) {
	            client.on("message", function (channel, message) {
	              var ref;
	              return (ref = _this2.limiters[channel]) != null ? ref._store.onMessage(channel, message) : void 0;
	            });
	          }

	          if (client.ready) {
	            return resolve();
	          } else {
	            return client.once("ready", resolve);
	          }
	        });
	      }
	    }, {
	      key: "_loadScript",
	      value: function _loadScript(name) {
	        var _this3 = this;

	        return new this.Promise(function (resolve, reject) {
	          var payload;
	          payload = Scripts$1.payload(name);
	          return _this3.client.multi([["script", "load", payload]]).exec(function (err, replies) {
	            if (err != null) {
	              return reject(err);
	            }

	            _this3.shas[name] = replies[0];
	            return resolve(replies[0]);
	          });
	        });
	      }
	    }, {
	      key: "_loadScripts",
	      value: function _loadScripts() {
	        var _this4 = this;

	        return this.Promise.all(Scripts$1.names.map(function (k) {
	          return _this4._loadScript(k);
	        }));
	      }
	    }, {
	      key: "__runCommand__",
	      value: function () {
	        var _runCommand__ = _asyncToGenerator(
	        /*#__PURE__*/
	        regeneratorRuntime.mark(function _callee(cmd) {
	          var _this5 = this;

	          return regeneratorRuntime.wrap(function _callee$(_context) {
	            while (1) {
	              switch (_context.prev = _context.next) {
	                case 0:
	                  _context.next = 2;
	                  return this.ready;

	                case 2:
	                  return _context.abrupt("return", new this.Promise(function (resolve, reject) {
	                    return _this5.client.multi([cmd]).exec_atomic(function (err, replies) {
	                      if (err != null) {
	                        return reject(err);
	                      } else {
	                        return resolve(replies[0]);
	                      }
	                    });
	                  }));

	                case 3:
	                case "end":
	                  return _context.stop();
	              }
	            }
	          }, _callee, this);
	        }));

	        function __runCommand__(_x) {
	          return _runCommand__.apply(this, arguments);
	        }

	        return __runCommand__;
	      }()
	    }, {
	      key: "__addLimiter__",
	      value: function __addLimiter__(instance) {
	        var _this6 = this;

	        return this.Promise.all([instance.channel(), instance.channel_client()].map(function (channel) {
	          return new _this6.Promise(function (resolve, reject) {
	            var _handler;

	            _handler = function handler(chan) {
	              if (chan === channel) {
	                _this6.subscriber.removeListener("subscribe", _handler);

	                _this6.limiters[channel] = instance;
	                return resolve();
	              }
	            };

	            _this6.subscriber.on("subscribe", _handler);

	            return _this6.subscriber.subscribe(channel);
	          });
	        }));
	      }
	    }, {
	      key: "__removeLimiter__",
	      value: function __removeLimiter__(instance) {
	        var _this7 = this;

	        return this.Promise.all([instance.channel(), instance.channel_client()].map(
	        /*#__PURE__*/
	        function () {
	          var _ref = _asyncToGenerator(
	          /*#__PURE__*/
	          regeneratorRuntime.mark(function _callee2(channel) {
	            return regeneratorRuntime.wrap(function _callee2$(_context2) {
	              while (1) {
	                switch (_context2.prev = _context2.next) {
	                  case 0:
	                    if (_this7.terminated) {
	                      _context2.next = 3;
	                      break;
	                    }

	                    _context2.next = 3;
	                    return new _this7.Promise(function (resolve, reject) {
	                      return _this7.subscriber.unsubscribe(channel, function (err, chan) {
	                        if (err != null) {
	                          return reject(err);
	                        }

	                        if (chan === channel) {
	                          return resolve();
	                        }
	                      });
	                    });

	                  case 3:
	                    return _context2.abrupt("return", delete _this7.limiters[channel]);

	                  case 4:
	                  case "end":
	                    return _context2.stop();
	                }
	              }
	            }, _callee2);
	          }));

	          return function (_x2) {
	            return _ref.apply(this, arguments);
	          };
	        }()));
	      }
	    }, {
	      key: "__scriptArgs__",
	      value: function __scriptArgs__(name, id, args, cb) {
	        var keys;
	        keys = Scripts$1.keys(name, id);
	        return [this.shas[name], keys.length].concat(keys, args, cb);
	      }
	    }, {
	      key: "__scriptFn__",
	      value: function __scriptFn__(name) {
	        return this.client.evalsha.bind(this.client);
	      }
	    }, {
	      key: "disconnect",
	      value: function disconnect() {
	        var flush = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
	        var i, k, len, ref;
	        ref = Object.keys(this.limiters);

	        for (i = 0, len = ref.length; i < len; i++) {
	          k = ref[i];
	          clearInterval(this.limiters[k]._store.heartbeat);
	        }

	        this.limiters = {};
	        this.terminated = true;
	        this.client.end(flush);
	        this.subscriber.end(flush);
	        return this.Promise.resolve();
	      }
	    }]);

	    return RedisConnection;
	  }();
	  RedisConnection.prototype.datastore = "redis";
	  RedisConnection.prototype.defaults = {
	    Redis: null,
	    clientOptions: {},
	    client: null,
	    Promise: Promise,
	    Events: null
	  };
	  return RedisConnection;
	}.call(commonjsGlobal);

	var RedisConnection_1 = RedisConnection;

	var Events$3, IORedisConnection, Scripts$2, parser$4;
	parser$4 = parser;
	Events$3 = Events_1;
	Scripts$2 = Scripts;

	IORedisConnection = function () {
	  var IORedisConnection =
	  /*#__PURE__*/
	  function () {
	    function IORedisConnection() {
	      var _this = this;

	      var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

	      _classCallCheck(this, IORedisConnection);

	      parser$4.load(options, this.defaults, this);

	      if (this.Redis == null) {
	        this.Redis = eval("require")("ioredis"); // Obfuscated or else Webpack/Angular will try to inline the optional ioredis module. To override this behavior: pass the ioredis module to Bottleneck as the 'Redis' option.
	      }

	      if (this.Events == null) {
	        this.Events = new Events$3(this);
	      }

	      this.terminated = false;

	      if (this.clusterNodes != null) {
	        this.client = new this.Redis.Cluster(this.clusterNodes, this.clientOptions);
	        this.subscriber = new this.Redis.Cluster(this.clusterNodes, this.clientOptions);
	      } else if (this.client != null && this.client.duplicate == null) {
	        this.subscriber = new this.Redis.Cluster(this.client.startupNodes, this.client.options);
	      } else {
	        if (this.client == null) {
	          this.client = new this.Redis(this.clientOptions);
	        }

	        this.subscriber = this.client.duplicate();
	      }

	      this.limiters = {};
	      this.ready = this.Promise.all([this._setup(this.client, false), this._setup(this.subscriber, true)]).then(function () {
	        _this._loadScripts();

	        return {
	          client: _this.client,
	          subscriber: _this.subscriber
	        };
	      });
	    }

	    _createClass(IORedisConnection, [{
	      key: "_setup",
	      value: function _setup(client, sub) {
	        var _this2 = this;

	        client.setMaxListeners(0);
	        return new this.Promise(function (resolve, reject) {
	          client.on("error", function (e) {
	            return _this2.Events.trigger("error", e);
	          });

	          if (sub) {
	            client.on("message", function (channel, message) {
	              var ref;
	              return (ref = _this2.limiters[channel]) != null ? ref._store.onMessage(channel, message) : void 0;
	            });
	          }

	          if (client.status === "ready") {
	            return resolve();
	          } else {
	            return client.once("ready", resolve);
	          }
	        });
	      }
	    }, {
	      key: "_loadScripts",
	      value: function _loadScripts() {
	        var _this3 = this;

	        return Scripts$2.names.forEach(function (name) {
	          return _this3.client.defineCommand(name, {
	            lua: Scripts$2.payload(name)
	          });
	        });
	      }
	    }, {
	      key: "__runCommand__",
	      value: function () {
	        var _runCommand__ = _asyncToGenerator(
	        /*#__PURE__*/
	        regeneratorRuntime.mark(function _callee(cmd) {
	          var _, deleted, _ref, _ref2, _ref2$;

	          return regeneratorRuntime.wrap(function _callee$(_context) {
	            while (1) {
	              switch (_context.prev = _context.next) {
	                case 0:
	                  _context.next = 2;
	                  return this.ready;

	                case 2:
	                  _context.next = 4;
	                  return this.client.pipeline([cmd]).exec();

	                case 4:
	                  _ref = _context.sent;
	                  _ref2 = _slicedToArray(_ref, 1);
	                  _ref2$ = _slicedToArray(_ref2[0], 2);
	                  _ = _ref2$[0];
	                  deleted = _ref2$[1];
	                  return _context.abrupt("return", deleted);

	                case 10:
	                case "end":
	                  return _context.stop();
	              }
	            }
	          }, _callee, this);
	        }));

	        function __runCommand__(_x) {
	          return _runCommand__.apply(this, arguments);
	        }

	        return __runCommand__;
	      }()
	    }, {
	      key: "__addLimiter__",
	      value: function __addLimiter__(instance) {
	        var _this4 = this;

	        return this.Promise.all([instance.channel(), instance.channel_client()].map(function (channel) {
	          return new _this4.Promise(function (resolve, reject) {
	            return _this4.subscriber.subscribe(channel, function () {
	              _this4.limiters[channel] = instance;
	              return resolve();
	            });
	          });
	        }));
	      }
	    }, {
	      key: "__removeLimiter__",
	      value: function __removeLimiter__(instance) {
	        var _this5 = this;

	        return [instance.channel(), instance.channel_client()].forEach(
	        /*#__PURE__*/
	        function () {
	          var _ref3 = _asyncToGenerator(
	          /*#__PURE__*/
	          regeneratorRuntime.mark(function _callee2(channel) {
	            return regeneratorRuntime.wrap(function _callee2$(_context2) {
	              while (1) {
	                switch (_context2.prev = _context2.next) {
	                  case 0:
	                    if (_this5.terminated) {
	                      _context2.next = 3;
	                      break;
	                    }

	                    _context2.next = 3;
	                    return _this5.subscriber.unsubscribe(channel);

	                  case 3:
	                    return _context2.abrupt("return", delete _this5.limiters[channel]);

	                  case 4:
	                  case "end":
	                    return _context2.stop();
	                }
	              }
	            }, _callee2);
	          }));

	          return function (_x2) {
	            return _ref3.apply(this, arguments);
	          };
	        }());
	      }
	    }, {
	      key: "__scriptArgs__",
	      value: function __scriptArgs__(name, id, args, cb) {
	        var keys;
	        keys = Scripts$2.keys(name, id);
	        return [keys.length].concat(keys, args, cb);
	      }
	    }, {
	      key: "__scriptFn__",
	      value: function __scriptFn__(name) {
	        return this.client[name].bind(this.client);
	      }
	    }, {
	      key: "disconnect",
	      value: function disconnect() {
	        var flush = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
	        var i, k, len, ref;
	        ref = Object.keys(this.limiters);

	        for (i = 0, len = ref.length; i < len; i++) {
	          k = ref[i];
	          clearInterval(this.limiters[k]._store.heartbeat);
	        }

	        this.limiters = {};
	        this.terminated = true;

	        if (flush) {
	          return this.Promise.all([this.client.quit(), this.subscriber.quit()]);
	        } else {
	          this.client.disconnect();
	          this.subscriber.disconnect();
	          return this.Promise.resolve();
	        }
	      }
	    }]);

	    return IORedisConnection;
	  }();
	  IORedisConnection.prototype.datastore = "ioredis";
	  IORedisConnection.prototype.defaults = {
	    Redis: null,
	    clientOptions: {},
	    clusterNodes: null,
	    client: null,
	    Promise: Promise,
	    Events: null
	  };
	  return IORedisConnection;
	}.call(commonjsGlobal);

	var IORedisConnection_1 = IORedisConnection;

	var BottleneckError$3, IORedisConnection$1, RedisConnection$1, RedisDatastore, parser$5;
	parser$5 = parser;
	BottleneckError$3 = BottleneckError_1;
	RedisConnection$1 = RedisConnection_1;
	IORedisConnection$1 = IORedisConnection_1;

	RedisDatastore =
	/*#__PURE__*/
	function () {
	  function RedisDatastore(instance, storeOptions, storeInstanceOptions) {
	    var _this = this;

	    _classCallCheck(this, RedisDatastore);

	    this.instance = instance;
	    this.storeOptions = storeOptions;
	    this.originalId = this.instance.id;
	    this.clientId = this.instance._randomIndex();
	    parser$5.load(storeInstanceOptions, storeInstanceOptions, this);
	    this.clients = {};
	    this.capacityPriorityCounters = {};
	    this.sharedConnection = this.connection != null;

	    if (this.connection == null) {
	      this.connection = this.instance.datastore === "redis" ? new RedisConnection$1({
	        Redis: this.Redis,
	        clientOptions: this.clientOptions,
	        Promise: this.Promise,
	        Events: this.instance.Events
	      }) : this.instance.datastore === "ioredis" ? new IORedisConnection$1({
	        Redis: this.Redis,
	        clientOptions: this.clientOptions,
	        clusterNodes: this.clusterNodes,
	        Promise: this.Promise,
	        Events: this.instance.Events
	      }) : void 0;
	    }

	    this.instance.connection = this.connection;
	    this.instance.datastore = this.connection.datastore;
	    this.ready = this.connection.ready.then(function (clients) {
	      _this.clients = clients;
	      return _this.runScript("init", _this.prepareInitSettings(_this.clearDatastore));
	    }).then(function () {
	      return _this.connection.__addLimiter__(_this.instance);
	    }).then(function () {
	      return _this.runScript("register_client", [_this.instance.queued()]);
	    }).then(function () {
	      var base;

	      if (typeof (base = _this.heartbeat = setInterval(function () {
	        return _this.runScript("heartbeat", [])["catch"](function (e) {
	          return _this.instance.Events.trigger("error", e);
	        });
	      }, _this.heartbeatInterval)).unref === "function") {
	        base.unref();
	      }

	      return _this.clients;
	    });
	  }

	  _createClass(RedisDatastore, [{
	    key: "__publish__",
	    value: function () {
	      var _publish__ = _asyncToGenerator(
	      /*#__PURE__*/
	      regeneratorRuntime.mark(function _callee(message) {
	        var client, _ref;

	        return regeneratorRuntime.wrap(function _callee$(_context) {
	          while (1) {
	            switch (_context.prev = _context.next) {
	              case 0:
	                _context.next = 2;
	                return this.ready;

	              case 2:
	                _ref = _context.sent;
	                client = _ref.client;
	                return _context.abrupt("return", client.publish(this.instance.channel(), "message:".concat(message.toString())));

	              case 5:
	              case "end":
	                return _context.stop();
	            }
	          }
	        }, _callee, this);
	      }));

	      function __publish__(_x) {
	        return _publish__.apply(this, arguments);
	      }

	      return __publish__;
	    }()
	  }, {
	    key: "onMessage",
	    value: function () {
	      var _onMessage = _asyncToGenerator(
	      /*#__PURE__*/
	      regeneratorRuntime.mark(function _callee3(channel, message) {
	        var _this2 = this;

	        var capacity, counter, data, drained, e, newCapacity, pos, priorityClient, rawCapacity, type, _ref2, _data$split, _data$split2;

	        return regeneratorRuntime.wrap(function _callee3$(_context3) {
	          while (1) {
	            switch (_context3.prev = _context3.next) {
	              case 0:
	                _context3.prev = 0;
	                pos = message.indexOf(":");
	                _ref2 = [message.slice(0, pos), message.slice(pos + 1)];
	                type = _ref2[0];
	                data = _ref2[1];

	                if (!(type === "capacity")) {
	                  _context3.next = 11;
	                  break;
	                }

	                _context3.next = 8;
	                return this.instance._drainAll(data.length > 0 ? ~~data : void 0);

	              case 8:
	                return _context3.abrupt("return", _context3.sent);

	              case 11:
	                if (!(type === "capacity-priority")) {
	                  _context3.next = 37;
	                  break;
	                }

	                _data$split = data.split(":");
	                _data$split2 = _slicedToArray(_data$split, 3);
	                rawCapacity = _data$split2[0];
	                priorityClient = _data$split2[1];
	                counter = _data$split2[2];
	                capacity = rawCapacity.length > 0 ? ~~rawCapacity : void 0;

	                if (!(priorityClient === this.clientId)) {
	                  _context3.next = 28;
	                  break;
	                }

	                _context3.next = 21;
	                return this.instance._drainAll(capacity);

	              case 21:
	                drained = _context3.sent;
	                newCapacity = capacity != null ? capacity - (drained || 0) : "";
	                _context3.next = 25;
	                return this.clients.client.publish(this.instance.channel(), "capacity-priority:".concat(newCapacity, "::").concat(counter));

	              case 25:
	                return _context3.abrupt("return", _context3.sent);

	              case 28:
	                if (!(priorityClient === "")) {
	                  _context3.next = 34;
	                  break;
	                }

	                clearTimeout(this.capacityPriorityCounters[counter]);
	                delete this.capacityPriorityCounters[counter];
	                return _context3.abrupt("return", this.instance._drainAll(capacity));

	              case 34:
	                return _context3.abrupt("return", this.capacityPriorityCounters[counter] = setTimeout(
	                /*#__PURE__*/
	                _asyncToGenerator(
	                /*#__PURE__*/
	                regeneratorRuntime.mark(function _callee2() {
	                  var e;
	                  return regeneratorRuntime.wrap(function _callee2$(_context2) {
	                    while (1) {
	                      switch (_context2.prev = _context2.next) {
	                        case 0:
	                          _context2.prev = 0;
	                          delete _this2.capacityPriorityCounters[counter];
	                          _context2.next = 4;
	                          return _this2.runScript("blacklist_client", [priorityClient]);

	                        case 4:
	                          _context2.next = 6;
	                          return _this2.instance._drainAll(capacity);

	                        case 6:
	                          return _context2.abrupt("return", _context2.sent);

	                        case 9:
	                          _context2.prev = 9;
	                          _context2.t0 = _context2["catch"](0);
	                          e = _context2.t0;
	                          return _context2.abrupt("return", _this2.instance.Events.trigger("error", e));

	                        case 13:
	                        case "end":
	                          return _context2.stop();
	                      }
	                    }
	                  }, _callee2, null, [[0, 9]]);
	                })), 1000));

	              case 35:
	                _context3.next = 45;
	                break;

	              case 37:
	                if (!(type === "message")) {
	                  _context3.next = 41;
	                  break;
	                }

	                return _context3.abrupt("return", this.instance.Events.trigger("message", data));

	              case 41:
	                if (!(type === "blocked")) {
	                  _context3.next = 45;
	                  break;
	                }

	                _context3.next = 44;
	                return this.instance._dropAllQueued();

	              case 44:
	                return _context3.abrupt("return", _context3.sent);

	              case 45:
	                _context3.next = 51;
	                break;

	              case 47:
	                _context3.prev = 47;
	                _context3.t0 = _context3["catch"](0);
	                e = _context3.t0;
	                return _context3.abrupt("return", this.instance.Events.trigger("error", e));

	              case 51:
	              case "end":
	                return _context3.stop();
	            }
	          }
	        }, _callee3, this, [[0, 47]]);
	      }));

	      function onMessage(_x2, _x3) {
	        return _onMessage.apply(this, arguments);
	      }

	      return onMessage;
	    }()
	  }, {
	    key: "__disconnect__",
	    value: function __disconnect__(flush) {
	      clearInterval(this.heartbeat);

	      if (this.sharedConnection) {
	        return this.connection.__removeLimiter__(this.instance);
	      } else {
	        return this.connection.disconnect(flush);
	      }
	    }
	  }, {
	    key: "runScript",
	    value: function () {
	      var _runScript = _asyncToGenerator(
	      /*#__PURE__*/
	      regeneratorRuntime.mark(function _callee4(name, args) {
	        var _this3 = this;

	        return regeneratorRuntime.wrap(function _callee4$(_context4) {
	          while (1) {
	            switch (_context4.prev = _context4.next) {
	              case 0:
	                if (name === "init" || name === "register_client") {
	                  _context4.next = 3;
	                  break;
	                }

	                _context4.next = 3;
	                return this.ready;

	              case 3:
	                return _context4.abrupt("return", new this.Promise(function (resolve, reject) {
	                  var all_args, arr;
	                  all_args = [Date.now(), _this3.clientId].concat(args);

	                  _this3.instance.Events.trigger("debug", "Calling Redis script: ".concat(name, ".lua"), all_args);

	                  arr = _this3.connection.__scriptArgs__(name, _this3.originalId, all_args, function (err, replies) {
	                    if (err != null) {
	                      return reject(err);
	                    }

	                    return resolve(replies);
	                  });
	                  return _this3.connection.__scriptFn__(name).apply(void 0, _toConsumableArray(arr));
	                })["catch"](function (e) {
	                  if (e.message === "SETTINGS_KEY_NOT_FOUND") {
	                    if (name === "heartbeat") {
	                      return _this3.Promise.resolve();
	                    } else {
	                      return _this3.runScript("init", _this3.prepareInitSettings(false)).then(function () {
	                        return _this3.runScript(name, args);
	                      });
	                    }
	                  } else if (e.message === "UNKNOWN_CLIENT") {
	                    return _this3.runScript("register_client", [_this3.instance.queued()]).then(function () {
	                      return _this3.runScript(name, args);
	                    });
	                  } else {
	                    return _this3.Promise.reject(e);
	                  }
	                }));

	              case 4:
	              case "end":
	                return _context4.stop();
	            }
	          }
	        }, _callee4, this);
	      }));

	      function runScript(_x4, _x5) {
	        return _runScript.apply(this, arguments);
	      }

	      return runScript;
	    }()
	  }, {
	    key: "prepareArray",
	    value: function prepareArray(arr) {
	      var i, len, results, x;
	      results = [];

	      for (i = 0, len = arr.length; i < len; i++) {
	        x = arr[i];
	        results.push(x != null ? x.toString() : "");
	      }

	      return results;
	    }
	  }, {
	    key: "prepareObject",
	    value: function prepareObject(obj) {
	      var arr, k, v;
	      arr = [];

	      for (k in obj) {
	        v = obj[k];
	        arr.push(k, v != null ? v.toString() : "");
	      }

	      return arr;
	    }
	  }, {
	    key: "prepareInitSettings",
	    value: function prepareInitSettings(clear) {
	      var args;
	      args = this.prepareObject(Object.assign({}, this.storeOptions, {
	        id: this.originalId,
	        version: this.instance.version,
	        groupTimeout: this.timeout,
	        clientTimeout: this.clientTimeout
	      }));
	      args.unshift(clear ? 1 : 0, this.instance.version);
	      return args;
	    }
	  }, {
	    key: "convertBool",
	    value: function convertBool(b) {
	      return !!b;
	    }
	  }, {
	    key: "__updateSettings__",
	    value: function () {
	      var _updateSettings__ = _asyncToGenerator(
	      /*#__PURE__*/
	      regeneratorRuntime.mark(function _callee5(options) {
	        return regeneratorRuntime.wrap(function _callee5$(_context5) {
	          while (1) {
	            switch (_context5.prev = _context5.next) {
	              case 0:
	                _context5.next = 2;
	                return this.runScript("update_settings", this.prepareObject(options));

	              case 2:
	                return _context5.abrupt("return", parser$5.overwrite(options, options, this.storeOptions));

	              case 3:
	              case "end":
	                return _context5.stop();
	            }
	          }
	        }, _callee5, this);
	      }));

	      function __updateSettings__(_x6) {
	        return _updateSettings__.apply(this, arguments);
	      }

	      return __updateSettings__;
	    }()
	  }, {
	    key: "__running__",
	    value: function __running__() {
	      return this.runScript("running", []);
	    }
	  }, {
	    key: "__queued__",
	    value: function __queued__() {
	      return this.runScript("queued", []);
	    }
	  }, {
	    key: "__done__",
	    value: function __done__() {
	      return this.runScript("done", []);
	    }
	  }, {
	    key: "__groupCheck__",
	    value: function () {
	      var _groupCheck__ = _asyncToGenerator(
	      /*#__PURE__*/
	      regeneratorRuntime.mark(function _callee6() {
	        return regeneratorRuntime.wrap(function _callee6$(_context6) {
	          while (1) {
	            switch (_context6.prev = _context6.next) {
	              case 0:
	                _context6.t0 = this;
	                _context6.next = 3;
	                return this.runScript("group_check", []);

	              case 3:
	                _context6.t1 = _context6.sent;
	                return _context6.abrupt("return", _context6.t0.convertBool.call(_context6.t0, _context6.t1));

	              case 5:
	              case "end":
	                return _context6.stop();
	            }
	          }
	        }, _callee6, this);
	      }));

	      function __groupCheck__() {
	        return _groupCheck__.apply(this, arguments);
	      }

	      return __groupCheck__;
	    }()
	  }, {
	    key: "__incrementReservoir__",
	    value: function __incrementReservoir__(incr) {
	      return this.runScript("increment_reservoir", [incr]);
	    }
	  }, {
	    key: "__currentReservoir__",
	    value: function __currentReservoir__() {
	      return this.runScript("current_reservoir", []);
	    }
	  }, {
	    key: "__check__",
	    value: function () {
	      var _check__ = _asyncToGenerator(
	      /*#__PURE__*/
	      regeneratorRuntime.mark(function _callee7(weight) {
	        return regeneratorRuntime.wrap(function _callee7$(_context7) {
	          while (1) {
	            switch (_context7.prev = _context7.next) {
	              case 0:
	                _context7.t0 = this;
	                _context7.next = 3;
	                return this.runScript("check", this.prepareArray([weight]));

	              case 3:
	                _context7.t1 = _context7.sent;
	                return _context7.abrupt("return", _context7.t0.convertBool.call(_context7.t0, _context7.t1));

	              case 5:
	              case "end":
	                return _context7.stop();
	            }
	          }
	        }, _callee7, this);
	      }));

	      function __check__(_x7) {
	        return _check__.apply(this, arguments);
	      }

	      return __check__;
	    }()
	  }, {
	    key: "__register__",
	    value: function () {
	      var _register__ = _asyncToGenerator(
	      /*#__PURE__*/
	      regeneratorRuntime.mark(function _callee8(index, weight, expiration) {
	        var reservoir, success, wait, _ref4, _ref5;

	        return regeneratorRuntime.wrap(function _callee8$(_context8) {
	          while (1) {
	            switch (_context8.prev = _context8.next) {
	              case 0:
	                _context8.next = 2;
	                return this.runScript("register", this.prepareArray([index, weight, expiration]));

	              case 2:
	                _ref4 = _context8.sent;
	                _ref5 = _slicedToArray(_ref4, 3);
	                success = _ref5[0];
	                wait = _ref5[1];
	                reservoir = _ref5[2];
	                return _context8.abrupt("return", {
	                  success: this.convertBool(success),
	                  wait: wait,
	                  reservoir: reservoir
	                });

	              case 8:
	              case "end":
	                return _context8.stop();
	            }
	          }
	        }, _callee8, this);
	      }));

	      function __register__(_x8, _x9, _x10) {
	        return _register__.apply(this, arguments);
	      }

	      return __register__;
	    }()
	  }, {
	    key: "__submit__",
	    value: function () {
	      var _submit__ = _asyncToGenerator(
	      /*#__PURE__*/
	      regeneratorRuntime.mark(function _callee9(queueLength, weight) {
	        var blocked, e, maxConcurrent, overweight, reachedHWM, strategy, _ref6, _ref7, _e$message$split, _e$message$split2;

	        return regeneratorRuntime.wrap(function _callee9$(_context9) {
	          while (1) {
	            switch (_context9.prev = _context9.next) {
	              case 0:
	                _context9.prev = 0;
	                _context9.next = 3;
	                return this.runScript("submit", this.prepareArray([queueLength, weight]));

	              case 3:
	                _ref6 = _context9.sent;
	                _ref7 = _slicedToArray(_ref6, 3);
	                reachedHWM = _ref7[0];
	                blocked = _ref7[1];
	                strategy = _ref7[2];
	                return _context9.abrupt("return", {
	                  reachedHWM: this.convertBool(reachedHWM),
	                  blocked: this.convertBool(blocked),
	                  strategy: strategy
	                });

	              case 11:
	                _context9.prev = 11;
	                _context9.t0 = _context9["catch"](0);
	                e = _context9.t0;

	                if (!(e.message.indexOf("OVERWEIGHT") === 0)) {
	                  _context9.next = 23;
	                  break;
	                }

	                _e$message$split = e.message.split(":");
	                _e$message$split2 = _slicedToArray(_e$message$split, 3);
	                overweight = _e$message$split2[0];
	                weight = _e$message$split2[1];
	                maxConcurrent = _e$message$split2[2];
	                throw new BottleneckError$3("Impossible to add a job having a weight of ".concat(weight, " to a limiter having a maxConcurrent setting of ").concat(maxConcurrent));

	              case 23:
	                throw e;

	              case 24:
	              case "end":
	                return _context9.stop();
	            }
	          }
	        }, _callee9, this, [[0, 11]]);
	      }));

	      function __submit__(_x11, _x12) {
	        return _submit__.apply(this, arguments);
	      }

	      return __submit__;
	    }()
	  }, {
	    key: "__free__",
	    value: function () {
	      var _free__ = _asyncToGenerator(
	      /*#__PURE__*/
	      regeneratorRuntime.mark(function _callee10(index, weight) {
	        var running;
	        return regeneratorRuntime.wrap(function _callee10$(_context10) {
	          while (1) {
	            switch (_context10.prev = _context10.next) {
	              case 0:
	                _context10.next = 2;
	                return this.runScript("free", this.prepareArray([index]));

	              case 2:
	                running = _context10.sent;
	                return _context10.abrupt("return", {
	                  running: running
	                });

	              case 4:
	              case "end":
	                return _context10.stop();
	            }
	          }
	        }, _callee10, this);
	      }));

	      function __free__(_x13, _x14) {
	        return _free__.apply(this, arguments);
	      }

	      return __free__;
	    }()
	  }]);

	  return RedisDatastore;
	}();

	var RedisDatastore_1 = RedisDatastore;

	var BottleneckError$4, States;
	BottleneckError$4 = BottleneckError_1;

	States =
	/*#__PURE__*/
	function () {
	  function States(status1) {
	    _classCallCheck(this, States);

	    this.status = status1;
	    this._jobs = {};
	    this.counts = this.status.map(function () {
	      return 0;
	    });
	  }

	  _createClass(States, [{
	    key: "next",
	    value: function next(id) {
	      var current, next;
	      current = this._jobs[id];
	      next = current + 1;

	      if (current != null && next < this.status.length) {
	        this.counts[current]--;
	        this.counts[next]++;
	        return this._jobs[id]++;
	      } else if (current != null) {
	        this.counts[current]--;
	        return delete this._jobs[id];
	      }
	    }
	  }, {
	    key: "start",
	    value: function start(id) {
	      var initial;
	      initial = 0;
	      this._jobs[id] = initial;
	      return this.counts[initial]++;
	    }
	  }, {
	    key: "remove",
	    value: function remove(id) {
	      var current;
	      current = this._jobs[id];

	      if (current != null) {
	        this.counts[current]--;
	        delete this._jobs[id];
	      }

	      return current != null;
	    }
	  }, {
	    key: "jobStatus",
	    value: function jobStatus(id) {
	      var ref;
	      return (ref = this.status[this._jobs[id]]) != null ? ref : null;
	    }
	  }, {
	    key: "statusJobs",
	    value: function statusJobs(status) {
	      var k, pos, ref, results, v;

	      if (status != null) {
	        pos = this.status.indexOf(status);

	        if (pos < 0) {
	          throw new BottleneckError$4("status must be one of ".concat(this.status.join(', ')));
	        }

	        ref = this._jobs;
	        results = [];

	        for (k in ref) {
	          v = ref[k];

	          if (v === pos) {
	            results.push(k);
	          }
	        }

	        return results;
	      } else {
	        return Object.keys(this._jobs);
	      }
	    }
	  }, {
	    key: "statusCounts",
	    value: function statusCounts() {
	      var _this = this;

	      return this.counts.reduce(function (acc, v, i) {
	        acc[_this.status[i]] = v;
	        return acc;
	      }, {});
	    }
	  }]);

	  return States;
	}();

	var States_1 = States;

	var DLList$2, Sync;
	DLList$2 = DLList_1;

	Sync =
	/*#__PURE__*/
	function () {
	  function Sync(name, Promise) {
	    _classCallCheck(this, Sync);

	    this.schedule = this.schedule.bind(this);
	    this.name = name;
	    this.Promise = Promise;
	    this._running = 0;
	    this._queue = new DLList$2();
	  }

	  _createClass(Sync, [{
	    key: "isEmpty",
	    value: function isEmpty() {
	      return this._queue.length === 0;
	    }
	  }, {
	    key: "_tryToRun",
	    value: function () {
	      var _tryToRun2 = _asyncToGenerator(
	      /*#__PURE__*/
	      regeneratorRuntime.mark(function _callee2() {
	        var args, cb, error, reject, resolve, returned, task, _this$_queue$shift;

	        return regeneratorRuntime.wrap(function _callee2$(_context2) {
	          while (1) {
	            switch (_context2.prev = _context2.next) {
	              case 0:
	                if (!(this._running < 1 && this._queue.length > 0)) {
	                  _context2.next = 13;
	                  break;
	                }

	                this._running++;
	                _this$_queue$shift = this._queue.shift();
	                task = _this$_queue$shift.task;
	                args = _this$_queue$shift.args;
	                resolve = _this$_queue$shift.resolve;
	                reject = _this$_queue$shift.reject;
	                _context2.next = 9;
	                return _asyncToGenerator(
	                /*#__PURE__*/
	                regeneratorRuntime.mark(function _callee() {
	                  return regeneratorRuntime.wrap(function _callee$(_context) {
	                    while (1) {
	                      switch (_context.prev = _context.next) {
	                        case 0:
	                          _context.prev = 0;
	                          _context.next = 3;
	                          return task.apply(void 0, _toConsumableArray(args));

	                        case 3:
	                          returned = _context.sent;
	                          return _context.abrupt("return", function () {
	                            return resolve(returned);
	                          });

	                        case 7:
	                          _context.prev = 7;
	                          _context.t0 = _context["catch"](0);
	                          error = _context.t0;
	                          return _context.abrupt("return", function () {
	                            return reject(error);
	                          });

	                        case 11:
	                        case "end":
	                          return _context.stop();
	                      }
	                    }
	                  }, _callee, null, [[0, 7]]);
	                }))();

	              case 9:
	                cb = _context2.sent;
	                this._running--;

	                this._tryToRun();

	                return _context2.abrupt("return", cb());

	              case 13:
	              case "end":
	                return _context2.stop();
	            }
	          }
	        }, _callee2, this);
	      }));

	      function _tryToRun() {
	        return _tryToRun2.apply(this, arguments);
	      }

	      return _tryToRun;
	    }()
	  }, {
	    key: "schedule",
	    value: function schedule(task) {
	      var promise, reject, resolve;
	      resolve = reject = null;
	      promise = new this.Promise(function (_resolve, _reject) {
	        resolve = _resolve;
	        return reject = _reject;
	      });

	      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
	        args[_key - 1] = arguments[_key];
	      }

	      this._queue.push({
	        task: task,
	        args: args,
	        resolve: resolve,
	        reject: reject
	      });

	      this._tryToRun();

	      return promise;
	    }
	  }]);

	  return Sync;
	}();

	var Sync_1 = Sync;

	var version = "2.19.5";
	var version$1 = {
		version: version
	};

	var version$2 = /*#__PURE__*/Object.freeze({
		version: version,
		default: version$1
	});

	var Events$4, Group, IORedisConnection$2, RedisConnection$2, Scripts$3, parser$6;
	parser$6 = parser;
	Events$4 = Events_1;
	RedisConnection$2 = RedisConnection_1;
	IORedisConnection$2 = IORedisConnection_1;
	Scripts$3 = Scripts;

	Group = function () {
	  var Group =
	  /*#__PURE__*/
	  function () {
	    function Group() {
	      var limiterOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

	      _classCallCheck(this, Group);

	      this.deleteKey = this.deleteKey.bind(this);
	      this.limiterOptions = limiterOptions;
	      parser$6.load(this.limiterOptions, this.defaults, this);
	      this.Events = new Events$4(this);
	      this.instances = {};
	      this.Bottleneck = Bottleneck_1;

	      this._startAutoCleanup();

	      this.sharedConnection = this.connection != null;

	      if (this.connection == null) {
	        if (this.limiterOptions.datastore === "redis") {
	          this.connection = new RedisConnection$2(Object.assign({}, this.limiterOptions, {
	            Events: this.Events
	          }));
	        } else if (this.limiterOptions.datastore === "ioredis") {
	          this.connection = new IORedisConnection$2(Object.assign({}, this.limiterOptions, {
	            Events: this.Events
	          }));
	        }
	      }
	    }

	    _createClass(Group, [{
	      key: "key",
	      value: function key() {
	        var _this = this;

	        var _key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "";

	        var ref;
	        return (ref = this.instances[_key]) != null ? ref : function () {
	          var limiter;
	          limiter = _this.instances[_key] = new _this.Bottleneck(Object.assign(_this.limiterOptions, {
	            id: "".concat(_this.id, "-").concat(_key),
	            timeout: _this.timeout,
	            connection: _this.connection
	          }));

	          _this.Events.trigger("created", limiter, _key);

	          return limiter;
	        }();
	      }
	    }, {
	      key: "deleteKey",
	      value: function () {
	        var _deleteKey = _asyncToGenerator(
	        /*#__PURE__*/
	        regeneratorRuntime.mark(function _callee() {
	          var key,
	              deleted,
	              instance,
	              _args = arguments;
	          return regeneratorRuntime.wrap(function _callee$(_context) {
	            while (1) {
	              switch (_context.prev = _context.next) {
	                case 0:
	                  key = _args.length > 0 && _args[0] !== undefined ? _args[0] : "";
	                  instance = this.instances[key];

	                  if (!this.connection) {
	                    _context.next = 6;
	                    break;
	                  }

	                  _context.next = 5;
	                  return this.connection.__runCommand__(['del'].concat(_toConsumableArray(Scripts$3.allKeys("".concat(this.id, "-").concat(key)))));

	                case 5:
	                  deleted = _context.sent;

	                case 6:
	                  if (!(instance != null)) {
	                    _context.next = 10;
	                    break;
	                  }

	                  delete this.instances[key];
	                  _context.next = 10;
	                  return instance.disconnect();

	                case 10:
	                  return _context.abrupt("return", instance != null || deleted > 0);

	                case 11:
	                case "end":
	                  return _context.stop();
	              }
	            }
	          }, _callee, this);
	        }));

	        function deleteKey() {
	          return _deleteKey.apply(this, arguments);
	        }

	        return deleteKey;
	      }()
	    }, {
	      key: "limiters",
	      value: function limiters() {
	        var k, ref, results, v;
	        ref = this.instances;
	        results = [];

	        for (k in ref) {
	          v = ref[k];
	          results.push({
	            key: k,
	            limiter: v
	          });
	        }

	        return results;
	      }
	    }, {
	      key: "keys",
	      value: function keys() {
	        return Object.keys(this.instances);
	      }
	    }, {
	      key: "clusterKeys",
	      value: function () {
	        var _clusterKeys = _asyncToGenerator(
	        /*#__PURE__*/
	        regeneratorRuntime.mark(function _callee2() {
	          var cursor, end, found, i, k, keys, len, next, start, _ref, _ref2;

	          return regeneratorRuntime.wrap(function _callee2$(_context2) {
	            while (1) {
	              switch (_context2.prev = _context2.next) {
	                case 0:
	                  if (!(this.connection == null)) {
	                    _context2.next = 2;
	                    break;
	                  }

	                  return _context2.abrupt("return", this.Promise.resolve(this.keys()));

	                case 2:
	                  keys = [];
	                  cursor = null;
	                  start = "b_".concat(this.id, "-").length;
	                  end = "_settings".length;

	                case 6:
	                  if (!(cursor !== 0)) {
	                    _context2.next = 17;
	                    break;
	                  }

	                  _context2.next = 9;
	                  return this.connection.__runCommand__(["scan", cursor != null ? cursor : 0, "match", "b_".concat(this.id, "-*_settings"), "count", 10000]);

	                case 9:
	                  _ref = _context2.sent;
	                  _ref2 = _slicedToArray(_ref, 2);
	                  next = _ref2[0];
	                  found = _ref2[1];
	                  cursor = ~~next;

	                  for (i = 0, len = found.length; i < len; i++) {
	                    k = found[i];
	                    keys.push(k.slice(start, -end));
	                  }

	                  _context2.next = 6;
	                  break;

	                case 17:
	                  return _context2.abrupt("return", keys);

	                case 18:
	                case "end":
	                  return _context2.stop();
	              }
	            }
	          }, _callee2, this);
	        }));

	        function clusterKeys() {
	          return _clusterKeys.apply(this, arguments);
	        }

	        return clusterKeys;
	      }()
	    }, {
	      key: "_startAutoCleanup",
	      value: function _startAutoCleanup() {
	        var _this2 = this;

	        var base;
	        clearInterval(this.interval);
	        return typeof (base = this.interval = setInterval(
	        /*#__PURE__*/
	        _asyncToGenerator(
	        /*#__PURE__*/
	        regeneratorRuntime.mark(function _callee3() {
	          var e, k, ref, results, time, v;
	          return regeneratorRuntime.wrap(function _callee3$(_context3) {
	            while (1) {
	              switch (_context3.prev = _context3.next) {
	                case 0:
	                  time = Date.now();
	                  ref = _this2.instances;
	                  results = [];
	                  _context3.t0 = regeneratorRuntime.keys(ref);

	                case 4:
	                  if ((_context3.t1 = _context3.t0()).done) {
	                    _context3.next = 23;
	                    break;
	                  }

	                  k = _context3.t1.value;
	                  v = ref[k];
	                  _context3.prev = 7;
	                  _context3.next = 10;
	                  return v._store.__groupCheck__(time);

	                case 10:
	                  if (!_context3.sent) {
	                    _context3.next = 14;
	                    break;
	                  }

	                  results.push(_this2.deleteKey(k));
	                  _context3.next = 15;
	                  break;

	                case 14:
	                  results.push(void 0);

	                case 15:
	                  _context3.next = 21;
	                  break;

	                case 17:
	                  _context3.prev = 17;
	                  _context3.t2 = _context3["catch"](7);
	                  e = _context3.t2;
	                  results.push(v.Events.trigger("error", e));

	                case 21:
	                  _context3.next = 4;
	                  break;

	                case 23:
	                  return _context3.abrupt("return", results);

	                case 24:
	                case "end":
	                  return _context3.stop();
	              }
	            }
	          }, _callee3, null, [[7, 17]]);
	        })), this.timeout / 2)).unref === "function" ? base.unref() : void 0;
	      }
	    }, {
	      key: "updateSettings",
	      value: function updateSettings() {
	        var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
	        parser$6.overwrite(options, this.defaults, this);
	        parser$6.overwrite(options, options, this.limiterOptions);

	        if (options.timeout != null) {
	          return this._startAutoCleanup();
	        }
	      }
	    }, {
	      key: "disconnect",
	      value: function disconnect() {
	        var flush = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
	        var ref;

	        if (!this.sharedConnection) {
	          return (ref = this.connection) != null ? ref.disconnect(flush) : void 0;
	        }
	      }
	    }]);

	    return Group;
	  }();
	  Group.prototype.defaults = {
	    timeout: 1000 * 60 * 5,
	    connection: null,
	    Promise: Promise,
	    id: "group-key"
	  };
	  return Group;
	}.call(commonjsGlobal);

	var Group_1 = Group;

	var Batcher, Events$5, parser$7;
	parser$7 = parser;
	Events$5 = Events_1;

	Batcher = function () {
	  var Batcher =
	  /*#__PURE__*/
	  function () {
	    function Batcher() {
	      var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

	      _classCallCheck(this, Batcher);

	      this.options = options;
	      parser$7.load(this.options, this.defaults, this);
	      this.Events = new Events$5(this);
	      this._arr = [];

	      this._resetPromise();

	      this._lastFlush = Date.now();
	    }

	    _createClass(Batcher, [{
	      key: "_resetPromise",
	      value: function _resetPromise() {
	        var _this = this;

	        return this._promise = new this.Promise(function (res, rej) {
	          return _this._resolve = res;
	        });
	      }
	    }, {
	      key: "_flush",
	      value: function _flush() {
	        clearTimeout(this._timeout);
	        this._lastFlush = Date.now();

	        this._resolve();

	        this.Events.trigger("batch", this._arr);
	        this._arr = [];
	        return this._resetPromise();
	      }
	    }, {
	      key: "add",
	      value: function add(data) {
	        var _this2 = this;

	        var ret;

	        this._arr.push(data);

	        ret = this._promise;

	        if (this._arr.length === this.maxSize) {
	          this._flush();
	        } else if (this.maxTime != null && this._arr.length === 1) {
	          this._timeout = setTimeout(function () {
	            return _this2._flush();
	          }, this.maxTime);
	        }

	        return ret;
	      }
	    }]);

	    return Batcher;
	  }();
	  Batcher.prototype.defaults = {
	    maxTime: null,
	    maxSize: null,
	    Promise: Promise
	  };
	  return Batcher;
	}.call(commonjsGlobal);

	var Batcher_1 = Batcher;

	var require$$8 = getCjsExportFromNamespace(version$2);

	var Bottleneck,
	    DEFAULT_PRIORITY$1,
	    Events$6,
	    Job$1,
	    LocalDatastore$1,
	    NUM_PRIORITIES$1,
	    Queues$1,
	    RedisDatastore$1,
	    States$1,
	    Sync$1,
	    parser$8,
	    splice = [].splice;
	NUM_PRIORITIES$1 = 10;
	DEFAULT_PRIORITY$1 = 5;
	parser$8 = parser;
	Queues$1 = Queues_1;
	Job$1 = Job_1;
	LocalDatastore$1 = LocalDatastore_1;
	RedisDatastore$1 = RedisDatastore_1;
	Events$6 = Events_1;
	States$1 = States_1;
	Sync$1 = Sync_1;

	Bottleneck = function () {
	  var Bottleneck =
	  /*#__PURE__*/
	  function () {
	    function Bottleneck() {
	      var _this = this;

	      var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};

	      _classCallCheck(this, Bottleneck);

	      var storeInstanceOptions, storeOptions;
	      this._addToQueue = this._addToQueue.bind(this);

	      for (var _len = arguments.length, invalid = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
	        invalid[_key - 1] = arguments[_key];
	      }

	      this._validateOptions(options, invalid);

	      parser$8.load(options, this.instanceDefaults, this);
	      this._queues = new Queues$1(NUM_PRIORITIES$1);
	      this._scheduled = {};
	      this._states = new States$1(["RECEIVED", "QUEUED", "RUNNING", "EXECUTING"].concat(this.trackDoneStatus ? ["DONE"] : []));
	      this._limiter = null;
	      this.Events = new Events$6(this);
	      this._submitLock = new Sync$1("submit", this.Promise);
	      this._registerLock = new Sync$1("register", this.Promise);
	      storeOptions = parser$8.load(options, this.storeDefaults, {});

	      this._store = function () {
	        if (this.datastore === "redis" || this.datastore === "ioredis" || this.connection != null) {
	          storeInstanceOptions = parser$8.load(options, this.redisStoreDefaults, {});
	          return new RedisDatastore$1(this, storeOptions, storeInstanceOptions);
	        } else if (this.datastore === "local") {
	          storeInstanceOptions = parser$8.load(options, this.localStoreDefaults, {});
	          return new LocalDatastore$1(this, storeOptions, storeInstanceOptions);
	        } else {
	          throw new Bottleneck.prototype.BottleneckError("Invalid datastore type: ".concat(this.datastore));
	        }
	      }.call(this);

	      this._queues.on("leftzero", function () {
	        var ref;
	        return (ref = _this._store.heartbeat) != null ? typeof ref.ref === "function" ? ref.ref() : void 0 : void 0;
	      });

	      this._queues.on("zero", function () {
	        var ref;
	        return (ref = _this._store.heartbeat) != null ? typeof ref.unref === "function" ? ref.unref() : void 0 : void 0;
	      });
	    }

	    _createClass(Bottleneck, [{
	      key: "_validateOptions",
	      value: function _validateOptions(options, invalid) {
	        if (!(options != null && _typeof(options) === "object" && invalid.length === 0)) {
	          throw new Bottleneck.prototype.BottleneckError("Bottleneck v2 takes a single object argument. Refer to https://github.com/SGrondin/bottleneck#upgrading-to-v2 if you're upgrading from Bottleneck v1.");
	        }
	      }
	    }, {
	      key: "ready",
	      value: function ready() {
	        return this._store.ready;
	      }
	    }, {
	      key: "clients",
	      value: function clients() {
	        return this._store.clients;
	      }
	    }, {
	      key: "channel",
	      value: function channel() {
	        return "b_".concat(this.id);
	      }
	    }, {
	      key: "channel_client",
	      value: function channel_client() {
	        return "b_".concat(this.id, "_").concat(this._store.clientId);
	      }
	    }, {
	      key: "publish",
	      value: function publish(message) {
	        return this._store.__publish__(message);
	      }
	    }, {
	      key: "disconnect",
	      value: function disconnect() {
	        var flush = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
	        return this._store.__disconnect__(flush);
	      }
	    }, {
	      key: "chain",
	      value: function chain(_limiter) {
	        this._limiter = _limiter;
	        return this;
	      }
	    }, {
	      key: "queued",
	      value: function queued(priority) {
	        return this._queues.queued(priority);
	      }
	    }, {
	      key: "clusterQueued",
	      value: function clusterQueued() {
	        return this._store.__queued__();
	      }
	    }, {
	      key: "empty",
	      value: function empty() {
	        return this.queued() === 0 && this._submitLock.isEmpty();
	      }
	    }, {
	      key: "running",
	      value: function running() {
	        return this._store.__running__();
	      }
	    }, {
	      key: "done",
	      value: function done() {
	        return this._store.__done__();
	      }
	    }, {
	      key: "jobStatus",
	      value: function jobStatus(id) {
	        return this._states.jobStatus(id);
	      }
	    }, {
	      key: "jobs",
	      value: function jobs(status) {
	        return this._states.statusJobs(status);
	      }
	    }, {
	      key: "counts",
	      value: function counts() {
	        return this._states.statusCounts();
	      }
	    }, {
	      key: "_randomIndex",
	      value: function _randomIndex() {
	        return Math.random().toString(36).slice(2);
	      }
	    }, {
	      key: "check",
	      value: function check() {
	        var weight = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
	        return this._store.__check__(weight);
	      }
	    }, {
	      key: "_clearGlobalState",
	      value: function _clearGlobalState(index) {
	        if (this._scheduled[index] != null) {
	          clearTimeout(this._scheduled[index].expiration);
	          delete this._scheduled[index];
	          return true;
	        } else {
	          return false;
	        }
	      }
	    }, {
	      key: "_free",
	      value: function () {
	        var _free2 = _asyncToGenerator(
	        /*#__PURE__*/
	        regeneratorRuntime.mark(function _callee(index, job, options, eventInfo) {
	          var e, running, _ref;

	          return regeneratorRuntime.wrap(function _callee$(_context) {
	            while (1) {
	              switch (_context.prev = _context.next) {
	                case 0:
	                  _context.prev = 0;
	                  _context.next = 3;
	                  return this._store.__free__(index, options.weight);

	                case 3:
	                  _ref = _context.sent;
	                  running = _ref.running;
	                  this.Events.trigger("debug", "Freed ".concat(options.id), eventInfo);

	                  if (!(running === 0 && this.empty())) {
	                    _context.next = 8;
	                    break;
	                  }

	                  return _context.abrupt("return", this.Events.trigger("idle"));

	                case 8:
	                  _context.next = 14;
	                  break;

	                case 10:
	                  _context.prev = 10;
	                  _context.t0 = _context["catch"](0);
	                  e = _context.t0;
	                  return _context.abrupt("return", this.Events.trigger("error", e));

	                case 14:
	                case "end":
	                  return _context.stop();
	              }
	            }
	          }, _callee, this, [[0, 10]]);
	        }));

	        function _free(_x, _x2, _x3, _x4) {
	          return _free2.apply(this, arguments);
	        }

	        return _free;
	      }()
	    }, {
	      key: "_run",
	      value: function _run(index, job, wait) {
	        var _this2 = this;

	        var clearGlobalState, free, run;
	        job.doRun();
	        clearGlobalState = this._clearGlobalState.bind(this, index);
	        run = this._run.bind(this, index, job);
	        free = this._free.bind(this, index, job);
	        return this._scheduled[index] = {
	          timeout: setTimeout(function () {
	            return job.doExecute(_this2._limiter, clearGlobalState, run, free);
	          }, wait),
	          expiration: job.options.expiration != null ? setTimeout(function () {
	            return job.doExpire(clearGlobalState, run, free);
	          }, wait + job.options.expiration) : void 0,
	          job: job
	        };
	      }
	    }, {
	      key: "_drainOne",
	      value: function _drainOne(capacity) {
	        var _this3 = this;

	        return this._registerLock.schedule(function () {
	          var args, index, next, options, queue;

	          if (_this3.queued() === 0) {
	            return _this3.Promise.resolve(null);
	          }

	          queue = _this3._queues.getFirst();

	          var _next = next = queue.first();

	          options = _next.options;
	          args = _next.args;

	          if (capacity != null && options.weight > capacity) {
	            return _this3.Promise.resolve(null);
	          }

	          _this3.Events.trigger("debug", "Draining ".concat(options.id), {
	            args: args,
	            options: options
	          });

	          index = _this3._randomIndex();
	          return _this3._store.__register__(index, options.weight, options.expiration).then(function (_ref2) {
	            var success = _ref2.success,
	                wait = _ref2.wait,
	                reservoir = _ref2.reservoir;
	            var empty;

	            _this3.Events.trigger("debug", "Drained ".concat(options.id), {
	              success: success,
	              args: args,
	              options: options
	            });

	            if (success) {
	              queue.shift();
	              empty = _this3.empty();

	              if (empty) {
	                _this3.Events.trigger("empty");
	              }

	              if (reservoir === 0) {
	                _this3.Events.trigger("depleted", empty);
	              }

	              _this3._run(index, next, wait);

	              return _this3.Promise.resolve(options.weight);
	            } else {
	              return _this3.Promise.resolve(null);
	            }
	          });
	        });
	      }
	    }, {
	      key: "_drainAll",
	      value: function _drainAll(capacity) {
	        var _this4 = this;

	        var total = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
	        return this._drainOne(capacity).then(function (drained) {
	          var newCapacity;

	          if (drained != null) {
	            newCapacity = capacity != null ? capacity - drained : capacity;
	            return _this4._drainAll(newCapacity, total + drained);
	          } else {
	            return _this4.Promise.resolve(total);
	          }
	        })["catch"](function (e) {
	          return _this4.Events.trigger("error", e);
	        });
	      }
	    }, {
	      key: "_dropAllQueued",
	      value: function _dropAllQueued(message) {
	        return this._queues.shiftAll(function (job) {
	          return job.doDrop({
	            message: message
	          });
	        });
	      }
	    }, {
	      key: "stop",
	      value: function stop() {
	        var _this5 = this;

	        var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
	        var done, waitForExecuting;
	        options = parser$8.load(options, this.stopDefaults);

	        waitForExecuting = function waitForExecuting(at) {
	          var finished;

	          finished = function finished() {
	            var counts;
	            counts = _this5._states.counts;
	            return counts[0] + counts[1] + counts[2] + counts[3] === at;
	          };

	          return new _this5.Promise(function (resolve, reject) {
	            if (finished()) {
	              return resolve();
	            } else {
	              return _this5.on("done", function () {
	                if (finished()) {
	                  _this5.removeAllListeners("done");

	                  return resolve();
	                }
	              });
	            }
	          });
	        };

	        done = options.dropWaitingJobs ? (this._run = function (index, next) {
	          return next.doDrop({
	            message: options.dropErrorMessage
	          });
	        }, this._drainOne = function () {
	          return _this5.Promise.resolve(null);
	        }, this._registerLock.schedule(function () {
	          return _this5._submitLock.schedule(function () {
	            var k, ref, v;
	            ref = _this5._scheduled;

	            for (k in ref) {
	              v = ref[k];

	              if (_this5.jobStatus(v.job.options.id) === "RUNNING") {
	                clearTimeout(v.timeout);
	                clearTimeout(v.expiration);
	                v.job.doDrop({
	                  message: options.dropErrorMessage
	                });
	              }
	            }

	            _this5._dropAllQueued(options.dropErrorMessage);

	            return waitForExecuting(0);
	          });
	        })) : this.schedule({
	          priority: NUM_PRIORITIES$1 - 1,
	          weight: 0
	        }, function () {
	          return waitForExecuting(1);
	        });

	        this._receive = function (job) {
	          return job._reject(new Bottleneck.prototype.BottleneckError(options.enqueueErrorMessage));
	        };

	        this.stop = function () {
	          return _this5.Promise.reject(new Bottleneck.prototype.BottleneckError("stop() has already been called"));
	        };

	        return done;
	      }
	    }, {
	      key: "_addToQueue",
	      value: function () {
	        var _addToQueue2 = _asyncToGenerator(
	        /*#__PURE__*/
	        regeneratorRuntime.mark(function _callee2(job) {
	          var args, blocked, error, options, reachedHWM, shifted, strategy, _ref3;

	          return regeneratorRuntime.wrap(function _callee2$(_context2) {
	            while (1) {
	              switch (_context2.prev = _context2.next) {
	                case 0:
	                  args = job.args;
	                  options = job.options;
	                  _context2.prev = 2;
	                  _context2.next = 5;
	                  return this._store.__submit__(this.queued(), options.weight);

	                case 5:
	                  _ref3 = _context2.sent;
	                  reachedHWM = _ref3.reachedHWM;
	                  blocked = _ref3.blocked;
	                  strategy = _ref3.strategy;
	                  _context2.next = 17;
	                  break;

	                case 11:
	                  _context2.prev = 11;
	                  _context2.t0 = _context2["catch"](2);
	                  error = _context2.t0;
	                  this.Events.trigger("debug", "Could not queue ".concat(options.id), {
	                    args: args,
	                    options: options,
	                    error: error
	                  });
	                  job.doDrop({
	                    error: error
	                  });
	                  return _context2.abrupt("return", false);

	                case 17:
	                  if (!blocked) {
	                    _context2.next = 22;
	                    break;
	                  }

	                  job.doDrop();
	                  return _context2.abrupt("return", true);

	                case 22:
	                  if (!reachedHWM) {
	                    _context2.next = 28;
	                    break;
	                  }

	                  shifted = strategy === Bottleneck.prototype.strategy.LEAK ? this._queues.shiftLastFrom(options.priority) : strategy === Bottleneck.prototype.strategy.OVERFLOW_PRIORITY ? this._queues.shiftLastFrom(options.priority + 1) : strategy === Bottleneck.prototype.strategy.OVERFLOW ? job : void 0;

	                  if (shifted != null) {
	                    shifted.doDrop();
	                  }

	                  if (!(shifted == null || strategy === Bottleneck.prototype.strategy.OVERFLOW)) {
	                    _context2.next = 28;
	                    break;
	                  }

	                  if (shifted == null) {
	                    job.doDrop();
	                  }

	                  return _context2.abrupt("return", reachedHWM);

	                case 28:
	                  job.doQueue(reachedHWM, blocked);

	                  this._queues.push(job);

	                  _context2.next = 32;
	                  return this._drainAll();

	                case 32:
	                  return _context2.abrupt("return", reachedHWM);

	                case 33:
	                case "end":
	                  return _context2.stop();
	              }
	            }
	          }, _callee2, this, [[2, 11]]);
	        }));

	        function _addToQueue(_x5) {
	          return _addToQueue2.apply(this, arguments);
	        }

	        return _addToQueue;
	      }()
	    }, {
	      key: "_receive",
	      value: function _receive(job) {
	        if (this._states.jobStatus(job.options.id) != null) {
	          job._reject(new Bottleneck.prototype.BottleneckError("A job with the same id already exists (id=".concat(job.options.id, ")")));

	          return false;
	        } else {
	          job.doReceive();
	          return this._submitLock.schedule(this._addToQueue, job);
	        }
	      }
	    }, {
	      key: "submit",
	      value: function submit() {
	        var _this6 = this;

	        for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
	          args[_key2] = arguments[_key2];
	        }

	        var cb, fn, job, options, ref, ref1, task;

	        if (typeof args[0] === "function") {
	          var _ref4, _ref5, _splice$call, _splice$call2;

	          ref = args, (_ref4 = ref, _ref5 = _toArray(_ref4), fn = _ref5[0], args = _ref5.slice(1), _ref4), (_splice$call = splice.call(args, -1), _splice$call2 = _slicedToArray(_splice$call, 1), cb = _splice$call2[0], _splice$call);
	          options = parser$8.load({}, this.jobDefaults);
	        } else {
	          var _ref6, _ref7, _splice$call3, _splice$call4;

	          ref1 = args, (_ref6 = ref1, _ref7 = _toArray(_ref6), options = _ref7[0], fn = _ref7[1], args = _ref7.slice(2), _ref6), (_splice$call3 = splice.call(args, -1), _splice$call4 = _slicedToArray(_splice$call3, 1), cb = _splice$call4[0], _splice$call3);
	          options = parser$8.load(options, this.jobDefaults);
	        }

	        task = function task() {
	          for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
	            args[_key3] = arguments[_key3];
	          }

	          return new _this6.Promise(function (resolve, reject) {
	            return fn.apply(void 0, args.concat([function () {
	              for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
	                args[_key4] = arguments[_key4];
	              }

	              return (args[0] != null ? reject : resolve)(args);
	            }]));
	          });
	        };

	        job = new Job$1(task, args, options, this.jobDefaults, this.rejectOnDrop, this.Events, this._states, this.Promise);
	        job.promise.then(function (args) {
	          return typeof cb === "function" ? cb.apply(void 0, _toConsumableArray(args)) : void 0;
	        })["catch"](function (args) {
	          if (Array.isArray(args)) {
	            return typeof cb === "function" ? cb.apply(void 0, _toConsumableArray(args)) : void 0;
	          } else {
	            return typeof cb === "function" ? cb(args) : void 0;
	          }
	        });
	        return this._receive(job);
	      }
	    }, {
	      key: "schedule",
	      value: function schedule() {
	        for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
	          args[_key5] = arguments[_key5];
	        }

	        var job, options, task;

	        if (typeof args[0] === "function") {
	          var _args3 = args;

	          var _args4 = _toArray(_args3);

	          task = _args4[0];
	          args = _args4.slice(1);
	          options = {};
	        } else {
	          var _args5 = args;

	          var _args6 = _toArray(_args5);

	          options = _args6[0];
	          task = _args6[1];
	          args = _args6.slice(2);
	        }

	        job = new Job$1(task, args, options, this.jobDefaults, this.rejectOnDrop, this.Events, this._states, this.Promise);

	        this._receive(job);

	        return job.promise;
	      }
	    }, {
	      key: "wrap",
	      value: function wrap(fn) {
	        var schedule, wrapped;
	        schedule = this.schedule.bind(this);

	        wrapped = function wrapped() {
	          for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
	            args[_key6] = arguments[_key6];
	          }

	          return schedule.apply(void 0, [fn.bind(this)].concat(args));
	        };

	        wrapped.withOptions = function (options) {
	          for (var _len7 = arguments.length, args = new Array(_len7 > 1 ? _len7 - 1 : 0), _key7 = 1; _key7 < _len7; _key7++) {
	            args[_key7 - 1] = arguments[_key7];
	          }

	          return schedule.apply(void 0, [options, fn].concat(args));
	        };

	        return wrapped;
	      }
	    }, {
	      key: "updateSettings",
	      value: function () {
	        var _updateSettings = _asyncToGenerator(
	        /*#__PURE__*/
	        regeneratorRuntime.mark(function _callee3() {
	          var options,
	              _args7 = arguments;
	          return regeneratorRuntime.wrap(function _callee3$(_context3) {
	            while (1) {
	              switch (_context3.prev = _context3.next) {
	                case 0:
	                  options = _args7.length > 0 && _args7[0] !== undefined ? _args7[0] : {};
	                  _context3.next = 3;
	                  return this._store.__updateSettings__(parser$8.overwrite(options, this.storeDefaults));

	                case 3:
	                  parser$8.overwrite(options, this.instanceDefaults, this);
	                  return _context3.abrupt("return", this);

	                case 5:
	                case "end":
	                  return _context3.stop();
	              }
	            }
	          }, _callee3, this);
	        }));

	        function updateSettings() {
	          return _updateSettings.apply(this, arguments);
	        }

	        return updateSettings;
	      }()
	    }, {
	      key: "currentReservoir",
	      value: function currentReservoir() {
	        return this._store.__currentReservoir__();
	      }
	    }, {
	      key: "incrementReservoir",
	      value: function incrementReservoir() {
	        var incr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
	        return this._store.__incrementReservoir__(incr);
	      }
	    }]);

	    return Bottleneck;
	  }();
	  Bottleneck["default"] = Bottleneck;
	  Bottleneck.Events = Events$6;
	  Bottleneck.version = Bottleneck.prototype.version = require$$8.version;
	  Bottleneck.strategy = Bottleneck.prototype.strategy = {
	    LEAK: 1,
	    OVERFLOW: 2,
	    OVERFLOW_PRIORITY: 4,
	    BLOCK: 3
	  };
	  Bottleneck.BottleneckError = Bottleneck.prototype.BottleneckError = BottleneckError_1;
	  Bottleneck.Group = Bottleneck.prototype.Group = Group_1;
	  Bottleneck.RedisConnection = Bottleneck.prototype.RedisConnection = RedisConnection_1;
	  Bottleneck.IORedisConnection = Bottleneck.prototype.IORedisConnection = IORedisConnection_1;
	  Bottleneck.Batcher = Bottleneck.prototype.Batcher = Batcher_1;
	  Bottleneck.prototype.jobDefaults = {
	    priority: DEFAULT_PRIORITY$1,
	    weight: 1,
	    expiration: null,
	    id: "<no-id>"
	  };
	  Bottleneck.prototype.storeDefaults = {
	    maxConcurrent: null,
	    minTime: 0,
	    highWater: null,
	    strategy: Bottleneck.prototype.strategy.LEAK,
	    penalty: null,
	    reservoir: null,
	    reservoirRefreshInterval: null,
	    reservoirRefreshAmount: null,
	    reservoirIncreaseInterval: null,
	    reservoirIncreaseAmount: null,
	    reservoirIncreaseMaximum: null
	  };
	  Bottleneck.prototype.localStoreDefaults = {
	    Promise: Promise,
	    timeout: null,
	    heartbeatInterval: 250
	  };
	  Bottleneck.prototype.redisStoreDefaults = {
	    Promise: Promise,
	    timeout: null,
	    heartbeatInterval: 5000,
	    clientTimeout: 10000,
	    Redis: null,
	    clientOptions: {},
	    clusterNodes: null,
	    clearDatastore: false,
	    connection: null
	  };
	  Bottleneck.prototype.instanceDefaults = {
	    datastore: "local",
	    connection: null,
	    id: "<no-id>",
	    rejectOnDrop: true,
	    trackDoneStatus: false,
	    Promise: Promise
	  };
	  Bottleneck.prototype.stopDefaults = {
	    enqueueErrorMessage: "This limiter has been stopped and cannot accept new jobs.",
	    dropWaitingJobs: true,
	    dropErrorMessage: "This limiter has been stopped."
	  };
	  return Bottleneck;
	}.call(commonjsGlobal);

	var Bottleneck_1 = Bottleneck;

	var es5 = Bottleneck_1;

	return es5;

})));
/**
  * This file contains the Bottleneck library (MIT), compiled to ES2017, and without Clustering support.
  * https://github.com/SGrondin/bottleneck
  */
(function (global, factory) {
	typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
	typeof define === 'function' && define.amd ? define(factory) :
	(global.Bottleneck = factory());
}(this, (function () { 'use strict';

	var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};

	function getCjsExportFromNamespace (n) {
		return n && n['default'] || n;
	}

	var load = function(received, defaults, onto = {}) {
	  var k, ref, v;
	  for (k in defaults) {
	    v = defaults[k];
	    onto[k] = (ref = received[k]) != null ? ref : v;
	  }
	  return onto;
	};

	var overwrite = function(received, defaults, onto = {}) {
	  var k, v;
	  for (k in received) {
	    v = received[k];
	    if (defaults[k] !== void 0) {
	      onto[k] = v;
	    }
	  }
	  return onto;
	};

	var parser = {
		load: load,
		overwrite: overwrite
	};

	var DLList;

	DLList = class DLList {
	  constructor(incr, decr) {
	    this.incr = incr;
	    this.decr = decr;
	    this._first = null;
	    this._last = null;
	    this.length = 0;
	  }

	  push(value) {
	    var node;
	    this.length++;
	    if (typeof this.incr === "function") {
	      this.incr();
	    }
	    node = {
	      value,
	      prev: this._last,
	      next: null
	    };
	    if (this._last != null) {
	      this._last.next = node;
	      this._last = node;
	    } else {
	      this._first = this._last = node;
	    }
	    return void 0;
	  }

	  shift() {
	    var value;
	    if (this._first == null) {
	      return;
	    } else {
	      this.length--;
	      if (typeof this.decr === "function") {
	        this.decr();
	      }
	    }
	    value = this._first.value;
	    if ((this._first = this._first.next) != null) {
	      this._first.prev = null;
	    } else {
	      this._last = null;
	    }
	    return value;
	  }

	  first() {
	    if (this._first != null) {
	      return this._first.value;
	    }
	  }

	  getArray() {
	    var node, ref, results;
	    node = this._first;
	    results = [];
	    while (node != null) {
	      results.push((ref = node, node = node.next, ref.value));
	    }
	    return results;
	  }

	  forEachShift(cb) {
	    var node;
	    node = this.shift();
	    while (node != null) {
	      (cb(node), node = this.shift());
	    }
	    return void 0;
	  }

	  debug() {
	    var node, ref, ref1, ref2, results;
	    node = this._first;
	    results = [];
	    while (node != null) {
	      results.push((ref = node, node = node.next, {
	        value: ref.value,
	        prev: (ref1 = ref.prev) != null ? ref1.value : void 0,
	        next: (ref2 = ref.next) != null ? ref2.value : void 0
	      }));
	    }
	    return results;
	  }

	};

	var DLList_1 = DLList;

	var Events;

	Events = class Events {
	  constructor(instance) {
	    this.instance = instance;
	    this._events = {};
	    if ((this.instance.on != null) || (this.instance.once != null) || (this.instance.removeAllListeners != null)) {
	      throw new Error("An Emitter already exists for this object");
	    }
	    this.instance.on = (name, cb) => {
	      return this._addListener(name, "many", cb);
	    };
	    this.instance.once = (name, cb) => {
	      return this._addListener(name, "once", cb);
	    };
	    this.instance.removeAllListeners = (name = null) => {
	      if (name != null) {
	        return delete this._events[name];
	      } else {
	        return this._events = {};
	      }
	    };
	  }

	  _addListener(name, status, cb) {
	    var base;
	    if ((base = this._events)[name] == null) {
	      base[name] = [];
	    }
	    this._events[name].push({cb, status});
	    return this.instance;
	  }

	  listenerCount(name) {
	    if (this._events[name] != null) {
	      return this._events[name].length;
	    } else {
	      return 0;
	    }
	  }

	  async trigger(name, ...args) {
	    var e, promises;
	    try {
	      if (name !== "debug") {
	        this.trigger("debug", `Event triggered: ${name}`, args);
	      }
	      if (this._events[name] == null) {
	        return;
	      }
	      this._events[name] = this._events[name].filter(function(listener) {
	        return listener.status !== "none";
	      });
	      promises = this._events[name].map(async(listener) => {
	        var e, returned;
	        if (listener.status === "none") {
	          return;
	        }
	        if (listener.status === "once") {
	          listener.status = "none";
	        }
	        try {
	          returned = typeof listener.cb === "function" ? listener.cb(...args) : void 0;
	          if (typeof (returned != null ? returned.then : void 0) === "function") {
	            return (await returned);
	          } else {
	            return returned;
	          }
	        } catch (error) {
	          e = error;
	          {
	            this.trigger("error", e);
	          }
	          return null;
	        }
	      });
	      return ((await Promise.all(promises))).find(function(x) {
	        return x != null;
	      });
	    } catch (error) {
	      e = error;
	      {
	        this.trigger("error", e);
	      }
	      return null;
	    }
	  }

	};

	var Events_1 = Events;

	var DLList$1, Events$1, Queues;

	DLList$1 = DLList_1;

	Events$1 = Events_1;

	Queues = class Queues {
	  constructor(num_priorities) {
	    var i;
	    this.Events = new Events$1(this);
	    this._length = 0;
	    this._lists = (function() {
	      var j, ref, results;
	      results = [];
	      for (i = j = 1, ref = num_priorities; (1 <= ref ? j <= ref : j >= ref); i = 1 <= ref ? ++j : --j) {
	        results.push(new DLList$1((() => {
	          return this.incr();
	        }), (() => {
	          return this.decr();
	        })));
	      }
	      return results;
	    }).call(this);
	  }

	  incr() {
	    if (this._length++ === 0) {
	      return this.Events.trigger("leftzero");
	    }
	  }

	  decr() {
	    if (--this._length === 0) {
	      return this.Events.trigger("zero");
	    }
	  }

	  push(job) {
	    return this._lists[job.options.priority].push(job);
	  }

	  queued(priority) {
	    if (priority != null) {
	      return this._lists[priority].length;
	    } else {
	      return this._length;
	    }
	  }

	  shiftAll(fn) {
	    return this._lists.forEach(function(list) {
	      return list.forEachShift(fn);
	    });
	  }

	  getFirst(arr = this._lists) {
	    var j, len, list;
	    for (j = 0, len = arr.length; j < len; j++) {
	      list = arr[j];
	      if (list.length > 0) {
	        return list;
	      }
	    }
	    return [];
	  }

	  shiftLastFrom(priority) {
	    return this.getFirst(this._lists.slice(priority).reverse()).shift();
	  }

	};

	var Queues_1 = Queues;

	var BottleneckError;

	BottleneckError = class BottleneckError extends Error {};

	var BottleneckError_1 = BottleneckError;

	var BottleneckError$1, DEFAULT_PRIORITY, Job, NUM_PRIORITIES, parser$1;

	NUM_PRIORITIES = 10;

	DEFAULT_PRIORITY = 5;

	parser$1 = parser;

	BottleneckError$1 = BottleneckError_1;

	Job = class Job {
	  constructor(task, args, options, jobDefaults, rejectOnDrop, Events, _states, Promise) {
	    this.task = task;
	    this.args = args;
	    this.rejectOnDrop = rejectOnDrop;
	    this.Events = Events;
	    this._states = _states;
	    this.Promise = Promise;
	    this.options = parser$1.load(options, jobDefaults);
	    this.options.priority = this._sanitizePriority(this.options.priority);
	    if (this.options.id === jobDefaults.id) {
	      this.options.id = `${this.options.id}-${this._randomIndex()}`;
	    }
	    this.promise = new this.Promise((_resolve, _reject) => {
	      this._resolve = _resolve;
	      this._reject = _reject;
	    });
	    this.retryCount = 0;
	  }

	  _sanitizePriority(priority) {
	    var sProperty;
	    sProperty = ~~priority !== priority ? DEFAULT_PRIORITY : priority;
	    if (sProperty < 0) {
	      return 0;
	    } else if (sProperty > NUM_PRIORITIES - 1) {
	      return NUM_PRIORITIES - 1;
	    } else {
	      return sProperty;
	    }
	  }

	  _randomIndex() {
	    return Math.random().toString(36).slice(2);
	  }

	  doDrop({error, message = "This job has been dropped by Bottleneck"} = {}) {
	    if (this._states.remove(this.options.id)) {
	      if (this.rejectOnDrop) {
	        this._reject(error != null ? error : new BottleneckError$1(message));
	      }
	      this.Events.trigger("dropped", {args: this.args, options: this.options, task: this.task, promise: this.promise});
	      return true;
	    } else {
	      return false;
	    }
	  }

	  _assertStatus(expected) {
	    var status;
	    status = this._states.jobStatus(this.options.id);
	    if (!(status === expected || (expected === "DONE" && status === null))) {
	      throw new BottleneckError$1(`Invalid job status ${status}, expected ${expected}. Please open an issue at https://github.com/SGrondin/bottleneck/issues`);
	    }
	  }

	  doReceive() {
	    this._states.start(this.options.id);
	    return this.Events.trigger("received", {args: this.args, options: this.options});
	  }

	  doQueue(reachedHWM, blocked) {
	    this._assertStatus("RECEIVED");
	    this._states.next(this.options.id);
	    return this.Events.trigger("queued", {args: this.args, options: this.options, reachedHWM, blocked});
	  }

	  doRun() {
	    if (this.retryCount === 0) {
	      this._assertStatus("QUEUED");
	      this._states.next(this.options.id);
	    } else {
	      this._assertStatus("EXECUTING");
	    }
	    return this.Events.trigger("scheduled", {args: this.args, options: this.options});
	  }

	  async doExecute(chained, clearGlobalState, run, free) {
	    var error, eventInfo, passed;
	    if (this.retryCount === 0) {
	      this._assertStatus("RUNNING");
	      this._states.next(this.options.id);
	    } else {
	      this._assertStatus("EXECUTING");
	    }
	    eventInfo = {args: this.args, options: this.options, retryCount: this.retryCount};
	    this.Events.trigger("executing", eventInfo);
	    try {
	      passed = (await (chained != null ? chained.schedule(this.options, this.task, ...this.args) : this.task(...this.args)));
	      if (clearGlobalState()) {
	        this.doDone(eventInfo);
	        await free(this.options, eventInfo);
	        this._assertStatus("DONE");
	        return this._resolve(passed);
	      }
	    } catch (error1) {
	      error = error1;
	      return this._onFailure(error, eventInfo, clearGlobalState, run, free);
	    }
	  }

	  doExpire(clearGlobalState, run, free) {
	    var error, eventInfo;
	    if (this._states.jobStatus(this.options.id === "RUNNING")) {
	      this._states.next(this.options.id);
	    }
	    this._assertStatus("EXECUTING");
	    eventInfo = {args: this.args, options: this.options, retryCount: this.retryCount};
	    error = new BottleneckError$1(`This job timed out after ${this.options.expiration} ms.`);
	    return this._onFailure(error, eventInfo, clearGlobalState, run, free);
	  }

	  async _onFailure(error, eventInfo, clearGlobalState, run, free) {
	    var retry, retryAfter;
	    if (clearGlobalState()) {
	      retry = (await this.Events.trigger("failed", error, eventInfo));
	      if (retry != null) {
	        retryAfter = ~~retry;
	        this.Events.trigger("retry", `Retrying ${this.options.id} after ${retryAfter} ms`, eventInfo);
	        this.retryCount++;
	        return run(retryAfter);
	      } else {
	        this.doDone(eventInfo);
	        await free(this.options, eventInfo);
	        this._assertStatus("DONE");
	        return this._reject(error);
	      }
	    }
	  }

	  doDone(eventInfo) {
	    this._assertStatus("EXECUTING");
	    this._states.next(this.options.id);
	    return this.Events.trigger("done", eventInfo);
	  }

	};

	var Job_1 = Job;

	var BottleneckError$2, LocalDatastore, parser$2;

	parser$2 = parser;

	BottleneckError$2 = BottleneckError_1;

	LocalDatastore = class LocalDatastore {
	  constructor(instance, storeOptions, storeInstanceOptions) {
	    this.instance = instance;
	    this.storeOptions = storeOptions;
	    this.clientId = this.instance._randomIndex();
	    parser$2.load(storeInstanceOptions, storeInstanceOptions, this);
	    this._nextRequest = this._lastReservoirRefresh = this._lastReservoirIncrease = Date.now();
	    this._running = 0;
	    this._done = 0;
	    this._unblockTime = 0;
	    this.ready = this.Promise.resolve();
	    this.clients = {};
	    this._startHeartbeat();
	  }

	  _startHeartbeat() {
	    var base;
	    if ((this.heartbeat == null) && (((this.storeOptions.reservoirRefreshInterval != null) && (this.storeOptions.reservoirRefreshAmount != null)) || ((this.storeOptions.reservoirIncreaseInterval != null) && (this.storeOptions.reservoirIncreaseAmount != null)))) {
	      return typeof (base = (this.heartbeat = setInterval(() => {
	        var amount, incr, maximum, now, reservoir;
	        now = Date.now();
	        if ((this.storeOptions.reservoirRefreshInterval != null) && now >= this._lastReservoirRefresh + this.storeOptions.reservoirRefreshInterval) {
	          this._lastReservoirRefresh = now;
	          this.storeOptions.reservoir = this.storeOptions.reservoirRefreshAmount;
	          this.instance._drainAll(this.computeCapacity());
	        }
	        if ((this.storeOptions.reservoirIncreaseInterval != null) && now >= this._lastReservoirIncrease + this.storeOptions.reservoirIncreaseInterval) {
	          ({
	            reservoirIncreaseAmount: amount,
	            reservoirIncreaseMaximum: maximum,
	            reservoir
	          } = this.storeOptions);
	          this._lastReservoirIncrease = now;
	          incr = maximum != null ? Math.min(amount, maximum - reservoir) : amount;
	          if (incr > 0) {
	            this.storeOptions.reservoir += incr;
	            return this.instance._drainAll(this.computeCapacity());
	          }
	        }
	      }, this.heartbeatInterval))).unref === "function" ? base.unref() : void 0;
	    } else {
	      return clearInterval(this.heartbeat);
	    }
	  }

	  async __publish__(message) {
	    await this.yieldLoop();
	    return this.instance.Events.trigger("message", message.toString());
	  }

	  async __disconnect__(flush) {
	    await this.yieldLoop();
	    clearInterval(this.heartbeat);
	    return this.Promise.resolve();
	  }

	  yieldLoop(t = 0) {
	    return new this.Promise(function(resolve, reject) {
	      return setTimeout(resolve, t);
	    });
	  }

	  computePenalty() {
	    var ref;
	    return (ref = this.storeOptions.penalty) != null ? ref : (15 * this.storeOptions.minTime) || 5000;
	  }

	  async __updateSettings__(options) {
	    await this.yieldLoop();
	    parser$2.overwrite(options, options, this.storeOptions);
	    this._startHeartbeat();
	    this.instance._drainAll(this.computeCapacity());
	    return true;
	  }

	  async __running__() {
	    await this.yieldLoop();
	    return this._running;
	  }

	  async __queued__() {
	    await this.yieldLoop();
	    return this.instance.queued();
	  }

	  async __done__() {
	    await this.yieldLoop();
	    return this._done;
	  }

	  async __groupCheck__(time) {
	    await this.yieldLoop();
	    return (this._nextRequest + this.timeout) < time;
	  }

	  computeCapacity() {
	    var maxConcurrent, reservoir;
	    ({maxConcurrent, reservoir} = this.storeOptions);
	    if ((maxConcurrent != null) && (reservoir != null)) {
	      return Math.min(maxConcurrent - this._running, reservoir);
	    } else if (maxConcurrent != null) {
	      return maxConcurrent - this._running;
	    } else if (reservoir != null) {
	      return reservoir;
	    } else {
	      return null;
	    }
	  }

	  conditionsCheck(weight) {
	    var capacity;
	    capacity = this.computeCapacity();
	    return (capacity == null) || weight <= capacity;
	  }

	  async __incrementReservoir__(incr) {
	    var reservoir;
	    await this.yieldLoop();
	    reservoir = this.storeOptions.reservoir += incr;
	    this.instance._drainAll(this.computeCapacity());
	    return reservoir;
	  }

	  async __currentReservoir__() {
	    await this.yieldLoop();
	    return this.storeOptions.reservoir;
	  }

	  isBlocked(now) {
	    return this._unblockTime >= now;
	  }

	  check(weight, now) {
	    return this.conditionsCheck(weight) && (this._nextRequest - now) <= 0;
	  }

	  async __check__(weight) {
	    var now;
	    await this.yieldLoop();
	    now = Date.now();
	    return this.check(weight, now);
	  }

	  async __register__(index, weight, expiration) {
	    var now, wait;
	    await this.yieldLoop();
	    now = Date.now();
	    if (this.conditionsCheck(weight)) {
	      this._running += weight;
	      if (this.storeOptions.reservoir != null) {
	        this.storeOptions.reservoir -= weight;
	      }
	      wait = Math.max(this._nextRequest - now, 0);
	      this._nextRequest = now + wait + this.storeOptions.minTime;
	      return {
	        success: true,
	        wait,
	        reservoir: this.storeOptions.reservoir
	      };
	    } else {
	      return {
	        success: false
	      };
	    }
	  }

	  strategyIsBlock() {
	    return this.storeOptions.strategy === 3;
	  }

	  async __submit__(queueLength, weight) {
	    var blocked, now, reachedHWM;
	    await this.yieldLoop();
	    if ((this.storeOptions.maxConcurrent != null) && weight > this.storeOptions.maxConcurrent) {
	      throw new BottleneckError$2(`Impossible to add a job having a weight of ${weight} to a limiter having a maxConcurrent setting of ${this.storeOptions.maxConcurrent}`);
	    }
	    now = Date.now();
	    reachedHWM = (this.storeOptions.highWater != null) && queueLength === this.storeOptions.highWater && !this.check(weight, now);
	    blocked = this.strategyIsBlock() && (reachedHWM || this.isBlocked(now));
	    if (blocked) {
	      this._unblockTime = now + this.computePenalty();
	      this._nextRequest = this._unblockTime + this.storeOptions.minTime;
	      this.instance._dropAllQueued();
	    }
	    return {
	      reachedHWM,
	      blocked,
	      strategy: this.storeOptions.strategy
	    };
	  }

	  async __free__(index, weight) {
	    await this.yieldLoop();
	    this._running -= weight;
	    this._done += weight;
	    this.instance._drainAll(this.computeCapacity());
	    return {
	      running: this._running
	    };
	  }

	};

	var LocalDatastore_1 = LocalDatastore;

	var BottleneckError$3, States;

	BottleneckError$3 = BottleneckError_1;

	States = class States {
	  constructor(status1) {
	    this.status = status1;
	    this._jobs = {};
	    this.counts = this.status.map(function() {
	      return 0;
	    });
	  }

	  next(id) {
	    var current, next;
	    current = this._jobs[id];
	    next = current + 1;
	    if ((current != null) && next < this.status.length) {
	      this.counts[current]--;
	      this.counts[next]++;
	      return this._jobs[id]++;
	    } else if (current != null) {
	      this.counts[current]--;
	      return delete this._jobs[id];
	    }
	  }

	  start(id) {
	    var initial;
	    initial = 0;
	    this._jobs[id] = initial;
	    return this.counts[initial]++;
	  }

	  remove(id) {
	    var current;
	    current = this._jobs[id];
	    if (current != null) {
	      this.counts[current]--;
	      delete this._jobs[id];
	    }
	    return current != null;
	  }

	  jobStatus(id) {
	    var ref;
	    return (ref = this.status[this._jobs[id]]) != null ? ref : null;
	  }

	  statusJobs(status) {
	    var k, pos, ref, results, v;
	    if (status != null) {
	      pos = this.status.indexOf(status);
	      if (pos < 0) {
	        throw new BottleneckError$3(`status must be one of ${this.status.join(', ')}`);
	      }
	      ref = this._jobs;
	      results = [];
	      for (k in ref) {
	        v = ref[k];
	        if (v === pos) {
	          results.push(k);
	        }
	      }
	      return results;
	    } else {
	      return Object.keys(this._jobs);
	    }
	  }

	  statusCounts() {
	    return this.counts.reduce(((acc, v, i) => {
	      acc[this.status[i]] = v;
	      return acc;
	    }), {});
	  }

	};

	var States_1 = States;

	var DLList$2, Sync;

	DLList$2 = DLList_1;

	Sync = class Sync {
	  constructor(name, Promise) {
	    this.schedule = this.schedule.bind(this);
	    this.name = name;
	    this.Promise = Promise;
	    this._running = 0;
	    this._queue = new DLList$2();
	  }

	  isEmpty() {
	    return this._queue.length === 0;
	  }

	  async _tryToRun() {
	    var args, cb, error, reject, resolve, returned, task;
	    if ((this._running < 1) && this._queue.length > 0) {
	      this._running++;
	      ({task, args, resolve, reject} = this._queue.shift());
	      cb = (await (async function() {
	        try {
	          returned = (await task(...args));
	          return function() {
	            return resolve(returned);
	          };
	        } catch (error1) {
	          error = error1;
	          return function() {
	            return reject(error);
	          };
	        }
	      })());
	      this._running--;
	      this._tryToRun();
	      return cb();
	    }
	  }

	  schedule(task, ...args) {
	    var promise, reject, resolve;
	    resolve = reject = null;
	    promise = new this.Promise(function(_resolve, _reject) {
	      resolve = _resolve;
	      return reject = _reject;
	    });
	    this._queue.push({task, args, resolve, reject});
	    this._tryToRun();
	    return promise;
	  }

	};

	var Sync_1 = Sync;

	var version = "2.19.5";
	var version$1 = {
		version: version
	};

	var version$2 = /*#__PURE__*/Object.freeze({
		version: version,
		default: version$1
	});

	var require$$2 = () => console.log('You must import the full version of Bottleneck in order to use this feature.');

	var require$$3 = () => console.log('You must import the full version of Bottleneck in order to use this feature.');

	var require$$4 = () => console.log('You must import the full version of Bottleneck in order to use this feature.');

	var Events$2, Group, IORedisConnection$1, RedisConnection$1, Scripts$1, parser$3;

	parser$3 = parser;

	Events$2 = Events_1;

	RedisConnection$1 = require$$2;

	IORedisConnection$1 = require$$3;

	Scripts$1 = require$$4;

	Group = (function() {
	  class Group {
	    constructor(limiterOptions = {}) {
	      this.deleteKey = this.deleteKey.bind(this);
	      this.limiterOptions = limiterOptions;
	      parser$3.load(this.limiterOptions, this.defaults, this);
	      this.Events = new Events$2(this);
	      this.instances = {};
	      this.Bottleneck = Bottleneck_1;
	      this._startAutoCleanup();
	      this.sharedConnection = this.connection != null;
	      if (this.connection == null) {
	        if (this.limiterOptions.datastore === "redis") {
	          this.connection = new RedisConnection$1(Object.assign({}, this.limiterOptions, {Events: this.Events}));
	        } else if (this.limiterOptions.datastore === "ioredis") {
	          this.connection = new IORedisConnection$1(Object.assign({}, this.limiterOptions, {Events: this.Events}));
	        }
	      }
	    }

	    key(key = "") {
	      var ref;
	      return (ref = this.instances[key]) != null ? ref : (() => {
	        var limiter;
	        limiter = this.instances[key] = new this.Bottleneck(Object.assign(this.limiterOptions, {
	          id: `${this.id}-${key}`,
	          timeout: this.timeout,
	          connection: this.connection
	        }));
	        this.Events.trigger("created", limiter, key);
	        return limiter;
	      })();
	    }

	    async deleteKey(key = "") {
	      var deleted, instance;
	      instance = this.instances[key];
	      if (this.connection) {
	        deleted = (await this.connection.__runCommand__(['del', ...Scripts$1.allKeys(`${this.id}-${key}`)]));
	      }
	      if (instance != null) {
	        delete this.instances[key];
	        await instance.disconnect();
	      }
	      return (instance != null) || deleted > 0;
	    }

	    limiters() {
	      var k, ref, results, v;
	      ref = this.instances;
	      results = [];
	      for (k in ref) {
	        v = ref[k];
	        results.push({
	          key: k,
	          limiter: v
	        });
	      }
	      return results;
	    }

	    keys() {
	      return Object.keys(this.instances);
	    }

	    async clusterKeys() {
	      var cursor, end, found, i, k, keys, len, next, start;
	      if (this.connection == null) {
	        return this.Promise.resolve(this.keys());
	      }
	      keys = [];
	      cursor = null;
	      start = `b_${this.id}-`.length;
	      end = "_settings".length;
	      while (cursor !== 0) {
	        [next, found] = (await this.connection.__runCommand__(["scan", cursor != null ? cursor : 0, "match", `b_${this.id}-*_settings`, "count", 10000]));
	        cursor = ~~next;
	        for (i = 0, len = found.length; i < len; i++) {
	          k = found[i];
	          keys.push(k.slice(start, -end));
	        }
	      }
	      return keys;
	    }

	    _startAutoCleanup() {
	      var base;
	      clearInterval(this.interval);
	      return typeof (base = (this.interval = setInterval(async() => {
	        var e, k, ref, results, time, v;
	        time = Date.now();
	        ref = this.instances;
	        results = [];
	        for (k in ref) {
	          v = ref[k];
	          try {
	            if ((await v._store.__groupCheck__(time))) {
	              results.push(this.deleteKey(k));
	            } else {
	              results.push(void 0);
	            }
	          } catch (error) {
	            e = error;
	            results.push(v.Events.trigger("error", e));
	          }
	        }
	        return results;
	      }, this.timeout / 2))).unref === "function" ? base.unref() : void 0;
	    }

	    updateSettings(options = {}) {
	      parser$3.overwrite(options, this.defaults, this);
	      parser$3.overwrite(options, options, this.limiterOptions);
	      if (options.timeout != null) {
	        return this._startAutoCleanup();
	      }
	    }

	    disconnect(flush = true) {
	      var ref;
	      if (!this.sharedConnection) {
	        return (ref = this.connection) != null ? ref.disconnect(flush) : void 0;
	      }
	    }

	  }
	  Group.prototype.defaults = {
	    timeout: 1000 * 60 * 5,
	    connection: null,
	    Promise: Promise,
	    id: "group-key"
	  };

	  return Group;

	}).call(commonjsGlobal);

	var Group_1 = Group;

	var Batcher, Events$3, parser$4;

	parser$4 = parser;

	Events$3 = Events_1;

	Batcher = (function() {
	  class Batcher {
	    constructor(options = {}) {
	      this.options = options;
	      parser$4.load(this.options, this.defaults, this);
	      this.Events = new Events$3(this);
	      this._arr = [];
	      this._resetPromise();
	      this._lastFlush = Date.now();
	    }

	    _resetPromise() {
	      return this._promise = new this.Promise((res, rej) => {
	        return this._resolve = res;
	      });
	    }

	    _flush() {
	      clearTimeout(this._timeout);
	      this._lastFlush = Date.now();
	      this._resolve();
	      this.Events.trigger("batch", this._arr);
	      this._arr = [];
	      return this._resetPromise();
	    }

	    add(data) {
	      var ret;
	      this._arr.push(data);
	      ret = this._promise;
	      if (this._arr.length === this.maxSize) {
	        this._flush();
	      } else if ((this.maxTime != null) && this._arr.length === 1) {
	        this._timeout = setTimeout(() => {
	          return this._flush();
	        }, this.maxTime);
	      }
	      return ret;
	    }

	  }
	  Batcher.prototype.defaults = {
	    maxTime: null,
	    maxSize: null,
	    Promise: Promise
	  };

	  return Batcher;

	}).call(commonjsGlobal);

	var Batcher_1 = Batcher;

	var require$$4$1 = () => console.log('You must import the full version of Bottleneck in order to use this feature.');

	var require$$8 = getCjsExportFromNamespace(version$2);

	var Bottleneck, DEFAULT_PRIORITY$1, Events$4, Job$1, LocalDatastore$1, NUM_PRIORITIES$1, Queues$1, RedisDatastore$1, States$1, Sync$1, parser$5,
	  splice = [].splice;

	NUM_PRIORITIES$1 = 10;

	DEFAULT_PRIORITY$1 = 5;

	parser$5 = parser;

	Queues$1 = Queues_1;

	Job$1 = Job_1;

	LocalDatastore$1 = LocalDatastore_1;

	RedisDatastore$1 = require$$4$1;

	Events$4 = Events_1;

	States$1 = States_1;

	Sync$1 = Sync_1;

	Bottleneck = (function() {
	  class Bottleneck {
	    constructor(options = {}, ...invalid) {
	      var storeInstanceOptions, storeOptions;
	      this._addToQueue = this._addToQueue.bind(this);
	      this._validateOptions(options, invalid);
	      parser$5.load(options, this.instanceDefaults, this);
	      this._queues = new Queues$1(NUM_PRIORITIES$1);
	      this._scheduled = {};
	      this._states = new States$1(["RECEIVED", "QUEUED", "RUNNING", "EXECUTING"].concat(this.trackDoneStatus ? ["DONE"] : []));
	      this._limiter = null;
	      this.Events = new Events$4(this);
	      this._submitLock = new Sync$1("submit", this.Promise);
	      this._registerLock = new Sync$1("register", this.Promise);
	      storeOptions = parser$5.load(options, this.storeDefaults, {});
	      this._store = (function() {
	        if (this.datastore === "redis" || this.datastore === "ioredis" || (this.connection != null)) {
	          storeInstanceOptions = parser$5.load(options, this.redisStoreDefaults, {});
	          return new RedisDatastore$1(this, storeOptions, storeInstanceOptions);
	        } else if (this.datastore === "local") {
	          storeInstanceOptions = parser$5.load(options, this.localStoreDefaults, {});
	          return new LocalDatastore$1(this, storeOptions, storeInstanceOptions);
	        } else {
	          throw new Bottleneck.prototype.BottleneckError(`Invalid datastore type: ${this.datastore}`);
	        }
	      }).call(this);
	      this._queues.on("leftzero", () => {
	        var ref;
	        return (ref = this._store.heartbeat) != null ? typeof ref.ref === "function" ? ref.ref() : void 0 : void 0;
	      });
	      this._queues.on("zero", () => {
	        var ref;
	        return (ref = this._store.heartbeat) != null ? typeof ref.unref === "function" ? ref.unref() : void 0 : void 0;
	      });
	    }

	    _validateOptions(options, invalid) {
	      if (!((options != null) && typeof options === "object" && invalid.length === 0)) {
	        throw new Bottleneck.prototype.BottleneckError("Bottleneck v2 takes a single object argument. Refer to https://github.com/SGrondin/bottleneck#upgrading-to-v2 if you're upgrading from Bottleneck v1.");
	      }
	    }

	    ready() {
	      return this._store.ready;
	    }

	    clients() {
	      return this._store.clients;
	    }

	    channel() {
	      return `b_${this.id}`;
	    }

	    channel_client() {
	      return `b_${this.id}_${this._store.clientId}`;
	    }

	    publish(message) {
	      return this._store.__publish__(message);
	    }

	    disconnect(flush = true) {
	      return this._store.__disconnect__(flush);
	    }

	    chain(_limiter) {
	      this._limiter = _limiter;
	      return this;
	    }

	    queued(priority) {
	      return this._queues.queued(priority);
	    }

	    clusterQueued() {
	      return this._store.__queued__();
	    }

	    empty() {
	      return this.queued() === 0 && this._submitLock.isEmpty();
	    }

	    running() {
	      return this._store.__running__();
	    }

	    done() {
	      return this._store.__done__();
	    }

	    jobStatus(id) {
	      return this._states.jobStatus(id);
	    }

	    jobs(status) {
	      return this._states.statusJobs(status);
	    }

	    counts() {
	      return this._states.statusCounts();
	    }

	    _randomIndex() {
	      return Math.random().toString(36).slice(2);
	    }

	    check(weight = 1) {
	      return this._store.__check__(weight);
	    }

	    _clearGlobalState(index) {
	      if (this._scheduled[index] != null) {
	        clearTimeout(this._scheduled[index].expiration);
	        delete this._scheduled[index];
	        return true;
	      } else {
	        return false;
	      }
	    }

	    async _free(index, job, options, eventInfo) {
	      var e, running;
	      try {
	        ({running} = (await this._store.__free__(index, options.weight)));
	        this.Events.trigger("debug", `Freed ${options.id}`, eventInfo);
	        if (running === 0 && this.empty()) {
	          return this.Events.trigger("idle");
	        }
	      } catch (error1) {
	        e = error1;
	        return this.Events.trigger("error", e);
	      }
	    }

	    _run(index, job, wait) {
	      var clearGlobalState, free, run;
	      job.doRun();
	      clearGlobalState = this._clearGlobalState.bind(this, index);
	      run = this._run.bind(this, index, job);
	      free = this._free.bind(this, index, job);
	      return this._scheduled[index] = {
	        timeout: setTimeout(() => {
	          return job.doExecute(this._limiter, clearGlobalState, run, free);
	        }, wait),
	        expiration: job.options.expiration != null ? setTimeout(function() {
	          return job.doExpire(clearGlobalState, run, free);
	        }, wait + job.options.expiration) : void 0,
	        job: job
	      };
	    }

	    _drainOne(capacity) {
	      return this._registerLock.schedule(() => {
	        var args, index, next, options, queue;
	        if (this.queued() === 0) {
	          return this.Promise.resolve(null);
	        }
	        queue = this._queues.getFirst();
	        ({options, args} = next = queue.first());
	        if ((capacity != null) && options.weight > capacity) {
	          return this.Promise.resolve(null);
	        }
	        this.Events.trigger("debug", `Draining ${options.id}`, {args, options});
	        index = this._randomIndex();
	        return this._store.__register__(index, options.weight, options.expiration).then(({success, wait, reservoir}) => {
	          var empty;
	          this.Events.trigger("debug", `Drained ${options.id}`, {success, args, options});
	          if (success) {
	            queue.shift();
	            empty = this.empty();
	            if (empty) {
	              this.Events.trigger("empty");
	            }
	            if (reservoir === 0) {
	              this.Events.trigger("depleted", empty);
	            }
	            this._run(index, next, wait);
	            return this.Promise.resolve(options.weight);
	          } else {
	            return this.Promise.resolve(null);
	          }
	        });
	      });
	    }

	    _drainAll(capacity, total = 0) {
	      return this._drainOne(capacity).then((drained) => {
	        var newCapacity;
	        if (drained != null) {
	          newCapacity = capacity != null ? capacity - drained : capacity;
	          return this._drainAll(newCapacity, total + drained);
	        } else {
	          return this.Promise.resolve(total);
	        }
	      }).catch((e) => {
	        return this.Events.trigger("error", e);
	      });
	    }

	    _dropAllQueued(message) {
	      return this._queues.shiftAll(function(job) {
	        return job.doDrop({message});
	      });
	    }

	    stop(options = {}) {
	      var done, waitForExecuting;
	      options = parser$5.load(options, this.stopDefaults);
	      waitForExecuting = (at) => {
	        var finished;
	        finished = () => {
	          var counts;
	          counts = this._states.counts;
	          return (counts[0] + counts[1] + counts[2] + counts[3]) === at;
	        };
	        return new this.Promise((resolve, reject) => {
	          if (finished()) {
	            return resolve();
	          } else {
	            return this.on("done", () => {
	              if (finished()) {
	                this.removeAllListeners("done");
	                return resolve();
	              }
	            });
	          }
	        });
	      };
	      done = options.dropWaitingJobs ? (this._run = function(index, next) {
	        return next.doDrop({
	          message: options.dropErrorMessage
	        });
	      }, this._drainOne = () => {
	        return this.Promise.resolve(null);
	      }, this._registerLock.schedule(() => {
	        return this._submitLock.schedule(() => {
	          var k, ref, v;
	          ref = this._scheduled;
	          for (k in ref) {
	            v = ref[k];
	            if (this.jobStatus(v.job.options.id) === "RUNNING") {
	              clearTimeout(v.timeout);
	              clearTimeout(v.expiration);
	              v.job.doDrop({
	                message: options.dropErrorMessage
	              });
	            }
	          }
	          this._dropAllQueued(options.dropErrorMessage);
	          return waitForExecuting(0);
	        });
	      })) : this.schedule({
	        priority: NUM_PRIORITIES$1 - 1,
	        weight: 0
	      }, () => {
	        return waitForExecuting(1);
	      });
	      this._receive = function(job) {
	        return job._reject(new Bottleneck.prototype.BottleneckError(options.enqueueErrorMessage));
	      };
	      this.stop = () => {
	        return this.Promise.reject(new Bottleneck.prototype.BottleneckError("stop() has already been called"));
	      };
	      return done;
	    }

	    async _addToQueue(job) {
	      var args, blocked, error, options, reachedHWM, shifted, strategy;
	      ({args, options} = job);
	      try {
	        ({reachedHWM, blocked, strategy} = (await this._store.__submit__(this.queued(), options.weight)));
	      } catch (error1) {
	        error = error1;
	        this.Events.trigger("debug", `Could not queue ${options.id}`, {args, options, error});
	        job.doDrop({error});
	        return false;
	      }
	      if (blocked) {
	        job.doDrop();
	        return true;
	      } else if (reachedHWM) {
	        shifted = strategy === Bottleneck.prototype.strategy.LEAK ? this._queues.shiftLastFrom(options.priority) : strategy === Bottleneck.prototype.strategy.OVERFLOW_PRIORITY ? this._queues.shiftLastFrom(options.priority + 1) : strategy === Bottleneck.prototype.strategy.OVERFLOW ? job : void 0;
	        if (shifted != null) {
	          shifted.doDrop();
	        }
	        if ((shifted == null) || strategy === Bottleneck.prototype.strategy.OVERFLOW) {
	          if (shifted == null) {
	            job.doDrop();
	          }
	          return reachedHWM;
	        }
	      }
	      job.doQueue(reachedHWM, blocked);
	      this._queues.push(job);
	      await this._drainAll();
	      return reachedHWM;
	    }

	    _receive(job) {
	      if (this._states.jobStatus(job.options.id) != null) {
	        job._reject(new Bottleneck.prototype.BottleneckError(`A job with the same id already exists (id=${job.options.id})`));
	        return false;
	      } else {
	        job.doReceive();
	        return this._submitLock.schedule(this._addToQueue, job);
	      }
	    }

	    submit(...args) {
	      var cb, fn, job, options, ref, ref1, task;
	      if (typeof args[0] === "function") {
	        ref = args, [fn, ...args] = ref, [cb] = splice.call(args, -1);
	        options = parser$5.load({}, this.jobDefaults);
	      } else {
	        ref1 = args, [options, fn, ...args] = ref1, [cb] = splice.call(args, -1);
	        options = parser$5.load(options, this.jobDefaults);
	      }
	      task = (...args) => {
	        return new this.Promise(function(resolve, reject) {
	          return fn(...args, function(...args) {
	            return (args[0] != null ? reject : resolve)(args);
	          });
	        });
	      };
	      job = new Job$1(task, args, options, this.jobDefaults, this.rejectOnDrop, this.Events, this._states, this.Promise);
	      job.promise.then(function(args) {
	        return typeof cb === "function" ? cb(...args) : void 0;
	      }).catch(function(args) {
	        if (Array.isArray(args)) {
	          return typeof cb === "function" ? cb(...args) : void 0;
	        } else {
	          return typeof cb === "function" ? cb(args) : void 0;
	        }
	      });
	      return this._receive(job);
	    }

	    schedule(...args) {
	      var job, options, task;
	      if (typeof args[0] === "function") {
	        [task, ...args] = args;
	        options = {};
	      } else {
	        [options, task, ...args] = args;
	      }
	      job = new Job$1(task, args, options, this.jobDefaults, this.rejectOnDrop, this.Events, this._states, this.Promise);
	      this._receive(job);
	      return job.promise;
	    }

	    wrap(fn) {
	      var schedule, wrapped;
	      schedule = this.schedule.bind(this);
	      wrapped = function(...args) {
	        return schedule(fn.bind(this), ...args);
	      };
	      wrapped.withOptions = function(options, ...args) {
	        return schedule(options, fn, ...args);
	      };
	      return wrapped;
	    }

	    async updateSettings(options = {}) {
	      await this._store.__updateSettings__(parser$5.overwrite(options, this.storeDefaults));
	      parser$5.overwrite(options, this.instanceDefaults, this);
	      return this;
	    }

	    currentReservoir() {
	      return this._store.__currentReservoir__();
	    }

	    incrementReservoir(incr = 0) {
	      return this._store.__incrementReservoir__(incr);
	    }

	  }
	  Bottleneck.default = Bottleneck;

	  Bottleneck.Events = Events$4;

	  Bottleneck.version = Bottleneck.prototype.version = require$$8.version;

	  Bottleneck.strategy = Bottleneck.prototype.strategy = {
	    LEAK: 1,
	    OVERFLOW: 2,
	    OVERFLOW_PRIORITY: 4,
	    BLOCK: 3
	  };

	  Bottleneck.BottleneckError = Bottleneck.prototype.BottleneckError = BottleneckError_1;

	  Bottleneck.Group = Bottleneck.prototype.Group = Group_1;

	  Bottleneck.RedisConnection = Bottleneck.prototype.RedisConnection = require$$2;

	  Bottleneck.IORedisConnection = Bottleneck.prototype.IORedisConnection = require$$3;

	  Bottleneck.Batcher = Bottleneck.prototype.Batcher = Batcher_1;

	  Bottleneck.prototype.jobDefaults = {
	    priority: DEFAULT_PRIORITY$1,
	    weight: 1,
	    expiration: null,
	    id: "<no-id>"
	  };

	  Bottleneck.prototype.storeDefaults = {
	    maxConcurrent: null,
	    minTime: 0,
	    highWater: null,
	    strategy: Bottleneck.prototype.strategy.LEAK,
	    penalty: null,
	    reservoir: null,
	    reservoirRefreshInterval: null,
	    reservoirRefreshAmount: null,
	    reservoirIncreaseInterval: null,
	    reservoirIncreaseAmount: null,
	    reservoirIncreaseMaximum: null
	  };

	  Bottleneck.prototype.localStoreDefaults = {
	    Promise: Promise,
	    timeout: null,
	    heartbeatInterval: 250
	  };

	  Bottleneck.prototype.redisStoreDefaults = {
	    Promise: Promise,
	    timeout: null,
	    heartbeatInterval: 5000,
	    clientTimeout: 10000,
	    Redis: null,
	    clientOptions: {},
	    clusterNodes: null,
	    clearDatastore: false,
	    connection: null
	  };

	  Bottleneck.prototype.instanceDefaults = {
	    datastore: "local",
	    connection: null,
	    id: "<no-id>",
	    rejectOnDrop: true,
	    trackDoneStatus: false,
	    Promise: Promise
	  };

	  Bottleneck.prototype.stopDefaults = {
	    enqueueErrorMessage: "This limiter has been stopped and cannot accept new jobs.",
	    dropWaitingJobs: true,
	    dropErrorMessage: "This limiter has been stopped."
	  };

	  return Bottleneck;

	}).call(commonjsGlobal);

	var Bottleneck_1 = Bottleneck;

	var lib = Bottleneck_1;

	return lib;

})));
{
  "name": "bottleneck",
  "version": "2.19.5",
  "description": "Distributed task scheduler and rate limiter",
  "main": "lib/index.js",
  "typings": "bottleneck.d.ts",
  "repository": {
    "type": "git",
    "url": "https://github.com/SGrondin/bottleneck"
  },
  "author": {
    "name": "Simon Grondin"
  },
  "license": "MIT",
  "devDependencies": {
    "@babel/core": "^7.5.0",
    "@babel/preset-env": "^7.5.0",
    "@types/es6-promise": "0.0.33",
    "assert": "^1.5.0",
    "coffeescript": "2.4.x",
    "ejs-cli": "github:SGrondin/ejs-cli#master",
    "ioredis": "^4.11.1",
    "leakage": "^0.4.0",
    "mocha": "^6.1.4",
    "redis": "^2.8.0",
    "regenerator-runtime": "^0.12.1",
    "rollup": "^0.66.6",
    "rollup-plugin-babel": "^4.3.3",
    "rollup-plugin-commonjs": "^9.3.4",
    "rollup-plugin-json": "^3.1.0",
    "rollup-plugin-node-resolve": "^3.4.0",
    "typescript": "^2.6.2"
  },
  "dependencies": {}
}import json from 'rollup-plugin-json';
import resolve from 'rollup-plugin-node-resolve';
import commonjs from 'rollup-plugin-commonjs';
import babel from 'rollup-plugin-babel';

const bannerLines = [
  'This file contains the full Bottleneck library (MIT) compiled to ES5.',
  'https://github.com/SGrondin/bottleneck',
  'It also contains the regenerator-runtime (MIT), necessary for Babel-generated ES5 code to execute promise and async/await code.',
  'See the following link for Copyright and License information:',
  'https://github.com/facebook/regenerator/blob/master/packages/regenerator-runtime/runtime.js',
].map(x => `  * ${x}`).join('\n');
const banner = `/**\n${bannerLines}\n  */`;

export default {
  input: 'lib/es5.js',
  output: {
    name: 'Bottleneck',
    file: 'es5.js',
    sourcemap: false,
    globals: {},
    format: 'umd',
    banner
  },
  external: [],
  plugins: [
    json(),
    resolve(),
    commonjs(),
    babel({
      exclude: 'node_modules/**'
    })
  ]
};
import commonjs from 'rollup-plugin-commonjs';
import json from 'rollup-plugin-json';
import resolve from 'rollup-plugin-node-resolve';

const bannerLines = [
  'This file contains the Bottleneck library (MIT), compiled to ES2017, and without Clustering support.',
  'https://github.com/SGrondin/bottleneck',
].map(x => `  * ${x}`).join('\n');
const banner = `/**\n${bannerLines}\n  */`;

const missing = `export default () => console.log('You must import the full version of Bottleneck in order to use this feature.');`;
const exclude = [
  'RedisDatastore.js',
  'RedisConnection.js',
  'IORedisConnection.js',
  'Scripts.js'
];

export default {
  input: 'lib/index.js',
  output: {
    name: 'Bottleneck',
    file: 'light.js',
    sourcemap: false,
    globals: {},
    format: 'umd',
    banner
  },
  external: [],
  plugins: [
    json(),
    {
      load: id => {
        const chunks = id.split('/');
        const file = chunks[chunks.length - 1];
        if (exclude.indexOf(file) >= 0) {
          return missing
        }
      }
    },
    resolve(),
    commonjs()
  ]
};
/// <reference path="bottleneck.d.ts" />

import Bottleneck from "bottleneck";
// import * as assert from "assert";
function assert(b: boolean): void { }

/*
This file is run by scripts/build.sh.
It is used to validate the typings in bottleneck.d.ts.
The command is: tsc --noEmit --strictNullChecks test.ts
This file cannot be run directly.
In order to do that, you must comment out the first line,
and change "bottleneck" to "." on the third line.
*/

function withCb(foo: number, bar: () => void, cb: (err: any, result: string) => void) {
  let s: string = `cb ${foo}`;
  cb(null, s);
}

console.log(Bottleneck);

let limiter = new Bottleneck({
  maxConcurrent: 5,
  minTime: 1000,
  highWater: 20,
  strategy: Bottleneck.strategy.LEAK,
  reservoirRefreshInterval: 1000 * 60,
  reservoirRefreshAmount: 10,
  reservoirIncreaseInterval: 1000 * 60,
  reservoirIncreaseAmount: 2,
  reservoirIncreaseMaximum: 15
});

limiter.ready().then(() => { console.log('Ready') });
limiter.clients().client;
limiter.disconnect();

limiter.currentReservoir().then(function (x) {
  if (x != null) {
    let i: number = x;
  }
});

limiter.incrementReservoir(5).then(function (x) {
  if (x != null) {
    let i: number = x;
  }
});

limiter.running().then(function (x) {
  let i: number = x;
});

limiter.clusterQueued().then(function (x) {
  let i: number = x;
});

limiter.done().then(function (x) {
  let i: number = x;
});

limiter.submit(withCb, 1, () => {}, (err, result) => {
  let s: string = result;
  console.log(s);
  assert(s == "cb 1");
});

function withPromise(foo: number, bar: () => void): PromiseLike<string> {
  let s: string = `promise ${foo}`;
  return Promise.resolve(s);
}

let foo: Promise<string> = limiter.schedule(withPromise, 1, () => {});
foo.then(function (result: string) {
  let s: string = result;
  console.log(s);
  assert(s == "promise 1");
});

limiter.on("message", (msg) => console.log(msg));

limiter.publish(JSON.stringify({ a: "abc", b: { c: 123 }}));

function checkEventInfo(info: Bottleneck.EventInfo) {
  const numArgs: number = info.args.length;
  const id: string = info.options.id;
}

limiter.on('dropped', (info) => {
  checkEventInfo(info)
  const task: Function = info.task;
  const promise: Promise<any> = info.promise;
})

limiter.on('received', (info) => {
  checkEventInfo(info)
})

limiter.on('queued', (info) => {
  checkEventInfo(info)
  const blocked: boolean = info.blocked;
  const reachedHWM: boolean = info.reachedHWM;
})

limiter.on('scheduled', (info) => {
  checkEventInfo(info)
})

limiter.on('executing', (info) => {
  checkEventInfo(info)
  const count: number = info.retryCount;
})

limiter.on('failed', (error, info) => {
  checkEventInfo(info)
  const message: string = error.message;
  const count: number = info.retryCount;
  return Promise.resolve(10)
})

limiter.on('failed', (error, info) => {
  checkEventInfo(info)
  const message: string = error.message;
  const count: number = info.retryCount;
  return Promise.resolve(null)
})

limiter.on('failed', (error, info) => {
  checkEventInfo(info)
  const message: string = error.message;
  const count: number = info.retryCount;
  return Promise.resolve()
})

limiter.on('failed', (error, info) => {
  checkEventInfo(info)
  const message: string = error.message;
  const count: number = info.retryCount;
  return 10
})

limiter.on('failed', (error, info) => {
  checkEventInfo(info)
  const message: string = error.message;
  const count: number = info.retryCount;
  return null
})

limiter.on('failed', (error, info) => {
  checkEventInfo(info)
  const message: string = error.message;
  const count: number = info.retryCount;
})

limiter.on('retry', (message: string, info) => {
  checkEventInfo(info)
  const count: number = info.retryCount;
})

limiter.on('done', (info) => {
  checkEventInfo(info)
  const count: number = info.retryCount;
})

let group = new Bottleneck.Group({
  maxConcurrent: 5,
  minTime: 1000,
  highWater: 10,
  strategy: Bottleneck.strategy.LEAK,
  datastore: "ioredis",
  clearDatastore: true,
  clientOptions: {},
  clusterNodes: []
});

group.on('created', (limiter, key) => {
  assert(limiter.empty())
  assert(key.length > 0)
})

group.key("foo").submit(withCb, 2, () => {}, (err, result) => {
    let s: string = `${result} foo`;
    console.log(s);
    assert(s == "cb 2 foo");
});

group.key("bar").submit({ priority: 4 }, withCb, 3, () => {}, (err, result) => {
    let s: string = `${result} bar`;
    console.log(s);
    assert(s == "cb 3 foo");
});

let f1: Promise<string> = group.key("pizza").schedule(withPromise, 2, () => {});
f1.then(function (result: string) {
  let s: string = result;
  console.log(s);
  assert(s == "promise 2");
});

let f2: Promise<string> = group.key("pie").schedule({ priority: 4 }, withPromise, 3, () => {});
f2.then(function (result: string) {
  let s: string = result;
  console.log(s);
  assert(s == "promise 3");
});

let wrapped = limiter.wrap((a: number, b: number) => {
  let s: string = `Total: ${a + b}`;
  return Promise.resolve(s);
});

wrapped(1, 2).then((x) => {
  let s: string = x;
  console.log(s);
  assert(s == "Total: 3");
});

wrapped.withOptions({ priority: 1, id: 'some-id' }, 9, 9).then((x) => {
  let s: string = x;
  console.log(s);
  assert(s == "Total: 18");
})

let counts = limiter.counts();
console.log(`${counts.EXECUTING + 2}`);
console.log(limiter.jobStatus('some-id'))
console.log(limiter.jobs());
console.log(limiter.jobs(Bottleneck.Status.RUNNING));


group.deleteKey("pizza")
.then(function (deleted: boolean) {
  console.log(deleted)
});
group.updateSettings({ timeout: 5, maxConcurrent: null, reservoir: null });

let keys: string[] = group.keys();
assert(keys.length == 3);

group.clusterKeys()
.then(function (allKeys: string[]) {
  let count = allKeys.length;
})

let queued: number = limiter.chain(group.key("pizza")).queued();

limiter.stop({
  dropWaitingJobs: true,
  dropErrorMessage: "Begone!",
  enqueueErrorMessage: "Denied!"
}).then(() => {
  console.log('All stopped.')
})

wrapped(4, 5).catch((e) => {
  assert(e.message === "Denied!")
})

const id: string = limiter.id;
const datastore: string = limiter.datastore;
const channel: string = limiter.channel();

const redisConnection = new Bottleneck.RedisConnection({
  client: "NodeRedis client object",
  clientOptions: {}
})

redisConnection.ready()
.then(function (redisConnectionClients) {
  const client = redisConnectionClients.client;
  const subscriber = redisConnectionClients.subscriber;
})

redisConnection.on("error", (err) => {
  console.log(err.message)
})

const limiterWithConn = new Bottleneck({
  connection: redisConnection
})

const ioredisConnection = new Bottleneck.IORedisConnection({
  client: "ioredis client object",
  clientOptions: {},
  clusterNodes: []
})

ioredisConnection.ready()
.then(function (ioredisConnectionClients) {
  const client = ioredisConnectionClients.client;
  const subscriber = ioredisConnectionClients.subscriber;
})

ioredisConnection.on("error", (err: Bottleneck.BottleneckError) => {
  console.log(err.message)
})

const groupWithConn = new Bottleneck.Group({
  connection: ioredisConnection
})

const limiterWithConnFromGroup = new Bottleneck({
  connection: groupWithConn.connection
})

const groupWithConnFromLimiter = new Bottleneck.Group({
  connection: limiterWithConn.connection
})


const batcher = new Bottleneck.Batcher({
  maxTime: 1000,
  maxSize: 10
})

batcher.on("batch", (batch) => {
  const len: number = batch.length
  console.log("Number of elements:", len)
})

batcher.on("error", (err: Bottleneck.BottleneckError) => {
  console.log(err.message)
})

batcher.add("abc")
batcher.add({ xyz: 5 })
.then(() => console.log("Flushed!"))

const object = {}
const emitter = new Bottleneck.Events(object)
const listenerCount: number = emitter.listenerCount('info')
emitter.trigger('info', 'hello', 'world', 123).then(function (result) {
  console.log(result)
})
parser = require "./parser"
Events = require "./Events"

class Batcher
  defaults:
    maxTime: null
    maxSize: null
    Promise: Promise

  constructor: (@options={}) ->
    parser.load @options, @defaults, @
    @Events = new Events @
    @_arr = []
    @_resetPromise()
    @_lastFlush = Date.now()

  _resetPromise: ->
    @_promise = new @Promise (res, rej) => @_resolve = res

  _flush: ->
    clearTimeout @_timeout
    @_lastFlush = Date.now()
    @_resolve()
    @Events.trigger "batch", @_arr
    @_arr = []
    @_resetPromise()

  add: (data) ->
    @_arr.push data
    ret = @_promise
    if @_arr.length == @maxSize
      @_flush()
    else if @maxTime? and @_arr.length == 1
      @_timeout = setTimeout =>
        @_flush()
      , @maxTime
    ret

module.exports = Batcher
NUM_PRIORITIES = 10
DEFAULT_PRIORITY = 5

parser = require "./parser"
Queues = require "./Queues"
Job = require "./Job"
LocalDatastore = require "./LocalDatastore"
RedisDatastore = require "./RedisDatastore"
Events = require "./Events"
States = require "./States"
Sync = require "./Sync"

class Bottleneck
  Bottleneck.default = Bottleneck
  Bottleneck.Events = Events
  Bottleneck.version = Bottleneck::version = require("./version.json").version
  Bottleneck.strategy = Bottleneck::strategy = { LEAK:1, OVERFLOW:2, OVERFLOW_PRIORITY:4, BLOCK:3 }
  Bottleneck.BottleneckError = Bottleneck::BottleneckError = require "./BottleneckError"
  Bottleneck.Group = Bottleneck::Group = require "./Group"
  Bottleneck.RedisConnection = Bottleneck::RedisConnection = require "./RedisConnection"
  Bottleneck.IORedisConnection = Bottleneck::IORedisConnection = require "./IORedisConnection"
  Bottleneck.Batcher = Bottleneck::Batcher = require "./Batcher"
  jobDefaults:
    priority: DEFAULT_PRIORITY
    weight: 1
    expiration: null
    id: "<no-id>"
  storeDefaults:
    maxConcurrent: null
    minTime: 0
    highWater: null
    strategy: Bottleneck::strategy.LEAK
    penalty: null
    reservoir: null
    reservoirRefreshInterval: null
    reservoirRefreshAmount: null
    reservoirIncreaseInterval: null
    reservoirIncreaseAmount: null
    reservoirIncreaseMaximum: null
  localStoreDefaults:
    Promise: Promise
    timeout: null
    heartbeatInterval: 250
  redisStoreDefaults:
    Promise: Promise
    timeout: null
    heartbeatInterval: 5000
    clientTimeout: 10000
    Redis: null
    clientOptions: {}
    clusterNodes: null
    clearDatastore: false
    connection: null
  instanceDefaults:
    datastore: "local"
    connection: null
    id: "<no-id>"
    rejectOnDrop: true
    trackDoneStatus: false
    Promise: Promise
  stopDefaults:
    enqueueErrorMessage: "This limiter has been stopped and cannot accept new jobs."
    dropWaitingJobs: true
    dropErrorMessage: "This limiter has been stopped."

  constructor: (options={}, invalid...) ->
    @_validateOptions options, invalid
    parser.load options, @instanceDefaults, @
    @_queues = new Queues NUM_PRIORITIES
    @_scheduled = {}
    @_states = new States ["RECEIVED", "QUEUED", "RUNNING", "EXECUTING"].concat(if @trackDoneStatus then ["DONE"] else [])
    @_limiter = null
    @Events = new Events @
    @_submitLock = new Sync "submit", @Promise
    @_registerLock = new Sync "register", @Promise
    storeOptions = parser.load options, @storeDefaults, {}

    @_store = if @datastore == "redis" or @datastore == "ioredis" or @connection?
      storeInstanceOptions = parser.load options, @redisStoreDefaults, {}
      new RedisDatastore @, storeOptions, storeInstanceOptions
    else if @datastore == "local"
      storeInstanceOptions = parser.load options, @localStoreDefaults, {}
      new LocalDatastore @, storeOptions, storeInstanceOptions
    else
      throw new Bottleneck::BottleneckError "Invalid datastore type: #{@datastore}"

    @_queues.on "leftzero", => @_store.heartbeat?.ref?()
    @_queues.on "zero", => @_store.heartbeat?.unref?()

  _validateOptions: (options, invalid) ->
    unless options? and typeof options == "object" and invalid.length == 0
      throw new Bottleneck::BottleneckError "Bottleneck v2 takes a single object argument. Refer to https://github.com/SGrondin/bottleneck#upgrading-to-v2 if you're upgrading from Bottleneck v1."

  ready: -> @_store.ready

  clients: -> @_store.clients

  channel: -> "b_#{@id}"

  channel_client: -> "b_#{@id}_#{@_store.clientId}"

  publish: (message) -> @_store.__publish__ message

  disconnect: (flush=true) -> @_store.__disconnect__ flush

  chain: (@_limiter) -> @

  queued: (priority) -> @_queues.queued priority

  clusterQueued: -> @_store.__queued__()

  empty: -> @queued() == 0 and @_submitLock.isEmpty()

  running: -> @_store.__running__()

  done: -> @_store.__done__()

  jobStatus: (id) -> @_states.jobStatus id

  jobs: (status) -> @_states.statusJobs status

  counts: -> @_states.statusCounts()

  _randomIndex: -> Math.random().toString(36).slice(2)

  check: (weight=1) -> @_store.__check__ weight

  _clearGlobalState: (index) ->
    if @_scheduled[index]?
      clearTimeout @_scheduled[index].expiration
      delete @_scheduled[index]
      true
    else false

  _free: (index, job, options, eventInfo) ->
    try
      { running } = await @_store.__free__ index, options.weight
      @Events.trigger "debug", "Freed #{options.id}", eventInfo
      if running == 0 and @empty() then @Events.trigger "idle"
    catch e
      @Events.trigger "error", e

  _run: (index, job, wait) ->
    job.doRun()
    clearGlobalState = @_clearGlobalState.bind @, index
    run = @_run.bind @, index, job
    free = @_free.bind @, index, job

    @_scheduled[index] =
      timeout: setTimeout =>
        job.doExecute @_limiter, clearGlobalState, run, free
      , wait
      expiration: if job.options.expiration? then setTimeout ->
        job.doExpire clearGlobalState, run, free
      , wait + job.options.expiration
      job: job

  _drainOne: (capacity) ->
    @_registerLock.schedule =>
      if @queued() == 0 then return @Promise.resolve null
      queue = @_queues.getFirst()
      { options, args } = next = queue.first()
      if capacity? and options.weight > capacity then return @Promise.resolve null
      @Events.trigger "debug", "Draining #{options.id}", { args, options }
      index = @_randomIndex()
      @_store.__register__ index, options.weight, options.expiration
      .then ({ success, wait, reservoir }) =>
        @Events.trigger "debug", "Drained #{options.id}", { success, args, options }
        if success
          queue.shift()
          empty = @empty()
          if empty then @Events.trigger "empty"
          if reservoir == 0 then @Events.trigger "depleted", empty
          @_run index, next, wait
          @Promise.resolve options.weight
        else
          @Promise.resolve null

  _drainAll: (capacity, total=0) ->
    @_drainOne(capacity)
    .then (drained) =>
      if drained?
        newCapacity = if capacity? then capacity - drained else capacity
        @_drainAll(newCapacity, total + drained)
      else @Promise.resolve total
    .catch (e) => @Events.trigger "error", e

  _dropAllQueued: (message) -> @_queues.shiftAll (job) -> job.doDrop { message }

  stop: (options={}) ->
    options = parser.load options, @stopDefaults
    waitForExecuting = (at) =>
      finished = =>
        counts = @_states.counts
        (counts[0] + counts[1] + counts[2] + counts[3]) == at
      new @Promise (resolve, reject) =>
        if finished() then resolve()
        else
          @on "done", =>
            if finished()
              @removeAllListeners "done"
              resolve()
    done = if options.dropWaitingJobs
      @_run = (index, next) -> next.doDrop { message: options.dropErrorMessage }
      @_drainOne = => @Promise.resolve null
      @_registerLock.schedule => @_submitLock.schedule =>
        for k, v of @_scheduled
          if @jobStatus(v.job.options.id) == "RUNNING"
            clearTimeout v.timeout
            clearTimeout v.expiration
            v.job.doDrop { message: options.dropErrorMessage }
        @_dropAllQueued options.dropErrorMessage
        waitForExecuting(0)
    else
      @schedule { priority: NUM_PRIORITIES - 1, weight: 0 }, => waitForExecuting(1)
    @_receive = (job) -> job._reject new Bottleneck::BottleneckError options.enqueueErrorMessage
    @stop = => @Promise.reject new Bottleneck::BottleneckError "stop() has already been called"
    done

  _addToQueue: (job) =>
    { args, options } = job
    try
      { reachedHWM, blocked, strategy } = await @_store.__submit__ @queued(), options.weight
    catch error
      @Events.trigger "debug", "Could not queue #{options.id}", { args, options, error }
      job.doDrop { error }
      return false

    if blocked
      job.doDrop()
      return true
    else if reachedHWM
      shifted = if strategy == Bottleneck::strategy.LEAK then @_queues.shiftLastFrom(options.priority)
      else if strategy == Bottleneck::strategy.OVERFLOW_PRIORITY then @_queues.shiftLastFrom(options.priority + 1)
      else if strategy == Bottleneck::strategy.OVERFLOW then job
      if shifted? then shifted.doDrop()
      if not shifted? or strategy == Bottleneck::strategy.OVERFLOW
        if not shifted? then job.doDrop()
        return reachedHWM

    job.doQueue reachedHWM, blocked
    @_queues.push job
    await @_drainAll()
    reachedHWM

  _receive: (job) ->
    if @_states.jobStatus(job.options.id)?
      job._reject new Bottleneck::BottleneckError "A job with the same id already exists (id=#{job.options.id})"
      false
    else
      job.doReceive()
      @_submitLock.schedule @_addToQueue, job

  submit: (args...) ->
    if typeof args[0] == "function"
      [fn, args..., cb] = args
      options = parser.load {}, @jobDefaults
    else
      [options, fn, args..., cb] = args
      options = parser.load options, @jobDefaults

    task = (args...) =>
      new @Promise (resolve, reject) ->
        fn args..., (args...) ->
          (if args[0]? then reject else resolve) args

    job = new Job task, args, options, @jobDefaults, @rejectOnDrop, @Events, @_states, @Promise
    job.promise
    .then (args) -> cb? args...
    .catch (args) -> if Array.isArray args then cb? args... else cb? args
    @_receive job

  schedule: (args...) ->
    if typeof args[0] == "function"
      [task, args...] = args
      options = {}
    else
      [options, task, args...] = args
    job = new Job task, args, options, @jobDefaults, @rejectOnDrop, @Events, @_states, @Promise
    @_receive job
    job.promise

  wrap: (fn) ->
    schedule = @schedule.bind @
    wrapped = (args...) -> schedule fn.bind(@), args...
    wrapped.withOptions = (options, args...) -> schedule options, fn, args...
    wrapped

  updateSettings: (options={}) ->
    await @_store.__updateSettings__ parser.overwrite options, @storeDefaults
    parser.overwrite options, @instanceDefaults, @
    @

  currentReservoir: -> @_store.__currentReservoir__()

  incrementReservoir: (incr=0) -> @_store.__incrementReservoir__ incr

module.exports = Bottleneck
class BottleneckError extends Error

module.exports = BottleneckError
class DLList
  constructor: (@incr, @decr) ->
    @_first = null
    @_last = null
    @length = 0
  push: (value) ->
    @length++
    @incr?()
    node = { value, prev: @_last, next: null }
    if @_last?
      @_last.next = node
      @_last = node
    else @_first = @_last = node
    undefined
  shift: () ->
    if not @_first? then return
    else
      @length--
      @decr?()
    value = @_first.value
    if (@_first = @_first.next)?
      @_first.prev = null
    else
      @_last = null
    value
  first: () -> if @_first? then @_first.value
  getArray: () ->
    node = @_first
    while node? then (ref = node; node = node.next; ref.value)
  forEachShift: (cb) ->
    node = @shift()
    while node? then (cb node; node = @shift())
    undefined
  debug: () ->
    node = @_first
    while node? then (ref = node; node = node.next; { value: ref.value, prev: ref.prev?.value, next: ref.next?.value })

module.exports = DLList
class Events
  constructor: (@instance) ->
    @_events = {}
    if @instance.on? or @instance.once? or @instance.removeAllListeners?
      throw new Error "An Emitter already exists for this object"
    @instance.on = (name, cb) => @_addListener name, "many", cb
    @instance.once = (name, cb) => @_addListener name, "once", cb
    @instance.removeAllListeners = (name=null) =>
      if name? then delete @_events[name] else @_events = {}
  _addListener: (name, status, cb) ->
    @_events[name] ?= []
    @_events[name].push {cb, status}
    @instance
  listenerCount: (name) ->
    if @_events[name]? then @_events[name].length else 0
  trigger: (name, args...) ->
    try
      if name != "debug" then @trigger "debug", "Event triggered: #{name}", args
      return unless @_events[name]?
      @_events[name] = @_events[name].filter (listener) -> listener.status != "none"
      promises = @_events[name].map (listener) =>
        return if listener.status == "none"
        if listener.status == "once" then listener.status = "none"
        try
          returned = listener.cb?(args...)
          if typeof returned?.then == "function"
            await returned
          else
            returned
        catch e
          if "name" != "error" then @trigger "error", e
          null
      (await Promise.all promises).find (x) -> x?
    catch e
      if "name" != "error" then @trigger "error", e
      null

module.exports = Events
parser = require "./parser"
Events = require "./Events"
RedisConnection = require "./RedisConnection"
IORedisConnection = require "./IORedisConnection"
Scripts = require "./Scripts"

class Group
  defaults:
    timeout: 1000 * 60 * 5
    connection: null
    Promise: Promise
    id: "group-key"

  constructor: (@limiterOptions={}) ->
    parser.load @limiterOptions, @defaults, @
    @Events = new Events @
    @instances = {}
    @Bottleneck = require "./Bottleneck"
    @_startAutoCleanup()
    @sharedConnection = @connection?

    if !@connection?
      if @limiterOptions.datastore == "redis"
        @connection = new RedisConnection Object.assign {}, @limiterOptions, { @Events }
      else if @limiterOptions.datastore == "ioredis"
        @connection = new IORedisConnection Object.assign {}, @limiterOptions, { @Events }

  key: (key="") -> @instances[key] ? do =>
    limiter = @instances[key] = new @Bottleneck Object.assign @limiterOptions, {
      id: "#{@id}-#{key}",
      @timeout,
      @connection
    }
    @Events.trigger "created", limiter, key
    limiter

  deleteKey: (key="") =>
    instance = @instances[key]
    if @connection
      deleted = await @connection.__runCommand__ ['del', Scripts.allKeys("#{@id}-#{key}")...]
    if instance?
      delete @instances[key]
      await instance.disconnect()
    instance? or deleted > 0

  limiters: -> { key: k, limiter: v } for k, v of @instances

  keys: -> Object.keys @instances

  clusterKeys: ->
    if !@connection? then return @Promise.resolve @keys()
    keys = []
    cursor = null
    start = "b_#{@id}-".length
    end = "_settings".length
    until cursor == 0
      [next, found] = await @connection.__runCommand__ ["scan", (cursor ? 0), "match", "b_#{@id}-*_settings", "count", 10000]
      cursor = ~~next
      keys.push(k.slice(start, -end)) for k in found
    keys

  _startAutoCleanup: ->
    clearInterval @interval
    (@interval = setInterval =>
      time = Date.now()
      for k, v of @instances
        try if await v._store.__groupCheck__(time) then @deleteKey k
        catch e then v.Events.trigger "error", e
    , (@timeout / 2)).unref?()

  updateSettings: (options={}) ->
    parser.overwrite options, @defaults, @
    parser.overwrite options, options, @limiterOptions
    @_startAutoCleanup() if options.timeout?

  disconnect: (flush=true) ->
    if !@sharedConnection
      @connection?.disconnect flush

module.exports = Group
parser = require "./parser"
Events = require "./Events"
Scripts = require "./Scripts"

class IORedisConnection
  datastore: "ioredis"
  defaults:
    Redis: null
    clientOptions: {}
    clusterNodes: null
    client: null
    Promise: Promise
    Events: null

  constructor: (options={}) ->
    parser.load options, @defaults, @
    @Redis ?= eval("require")("ioredis") # Obfuscated or else Webpack/Angular will try to inline the optional ioredis module. To override this behavior: pass the ioredis module to Bottleneck as the 'Redis' option.
    @Events ?= new Events @
    @terminated = false

    if @clusterNodes?
      @client = new @Redis.Cluster @clusterNodes, @clientOptions
      @subscriber = new @Redis.Cluster @clusterNodes, @clientOptions
    else if @client? and !@client.duplicate?
      @subscriber = new @Redis.Cluster @client.startupNodes, @client.options
    else
      @client ?= new @Redis @clientOptions
      @subscriber = @client.duplicate()
    @limiters = {}

    @ready = @Promise.all [@_setup(@client, false), @_setup(@subscriber, true)]
    .then =>
      @_loadScripts()
      { @client, @subscriber }

  _setup: (client, sub) ->
    client.setMaxListeners 0
    new @Promise (resolve, reject) =>
      client.on "error", (e) => @Events.trigger "error", e
      if sub
        client.on "message", (channel, message) =>
          @limiters[channel]?._store.onMessage channel, message
      if client.status == "ready" then resolve()
      else client.once "ready", resolve

  _loadScripts: -> Scripts.names.forEach (name) => @client.defineCommand name, { lua: Scripts.payload(name) }

  __runCommand__: (cmd) ->
    await @ready
    [[_, deleted]] = await @client.pipeline([cmd]).exec()
    deleted

  __addLimiter__: (instance) ->
    @Promise.all [instance.channel(), instance.channel_client()].map (channel) =>
      new @Promise (resolve, reject) =>
        @subscriber.subscribe channel, =>
          @limiters[channel] = instance
          resolve()

  __removeLimiter__: (instance) ->
    [instance.channel(), instance.channel_client()].forEach (channel) =>
      await @subscriber.unsubscribe channel unless @terminated
      delete @limiters[channel]

  __scriptArgs__: (name, id, args, cb) ->
    keys = Scripts.keys name, id
    [keys.length].concat keys, args, cb

  __scriptFn__: (name) ->
    @client[name].bind(@client)

  disconnect: (flush=true) ->
    clearInterval(@limiters[k]._store.heartbeat) for k in Object.keys @limiters
    @limiters = {}
    @terminated = true

    if flush
      @Promise.all [@client.quit(), @subscriber.quit()]
    else
      @client.disconnect()
      @subscriber.disconnect()
      @Promise.resolve()

module.exports = IORedisConnection
NUM_PRIORITIES = 10
DEFAULT_PRIORITY = 5

parser = require "./parser"
BottleneckError = require "./BottleneckError"

class Job
  constructor: (@task, @args, options, jobDefaults, @rejectOnDrop, @Events, @_states, @Promise) ->
    @options = parser.load options, jobDefaults
    @options.priority = @_sanitizePriority @options.priority
    if @options.id == jobDefaults.id then @options.id = "#{@options.id}-#{@_randomIndex()}"
    @promise = new @Promise (@_resolve, @_reject) =>
    @retryCount = 0

  _sanitizePriority: (priority) ->
    sProperty = if ~~priority != priority then DEFAULT_PRIORITY else priority
    if sProperty < 0 then 0 else if sProperty > NUM_PRIORITIES-1 then NUM_PRIORITIES-1 else sProperty

  _randomIndex: -> Math.random().toString(36).slice(2)

  doDrop: ({ error, message="This job has been dropped by Bottleneck" } = {}) ->
    if @_states.remove @options.id
      if @rejectOnDrop then @_reject (error ? new BottleneckError message)
      @Events.trigger "dropped", { @args, @options, @task, @promise }
      true
    else
      false

  _assertStatus: (expected) ->
    status = @_states.jobStatus @options.id
    if not (status == expected or (expected == "DONE" and status == null))
      throw new BottleneckError "Invalid job status #{status}, expected #{expected}. Please open an issue at https://github.com/SGrondin/bottleneck/issues"

  doReceive: () ->
    @_states.start @options.id
    @Events.trigger "received", { @args, @options }

  doQueue: (reachedHWM, blocked) ->
    @_assertStatus "RECEIVED"
    @_states.next @options.id
    @Events.trigger "queued", { @args, @options, reachedHWM, blocked }

  doRun: () ->
    if @retryCount == 0
      @_assertStatus "QUEUED"
      @_states.next @options.id
    else @_assertStatus "EXECUTING"
    @Events.trigger "scheduled", { @args, @options }

  doExecute: (chained, clearGlobalState, run, free) ->
    if @retryCount == 0
      @_assertStatus "RUNNING"
      @_states.next @options.id
    else @_assertStatus "EXECUTING"
    eventInfo = { @args, @options, @retryCount }
    @Events.trigger "executing", eventInfo

    try
      passed = await if chained?
        chained.schedule @options, @task, @args...
      else @task @args...

      if clearGlobalState()
        @doDone eventInfo
        await free @options, eventInfo
        @_assertStatus "DONE"
        @_resolve passed
    catch error
      @_onFailure error, eventInfo, clearGlobalState, run, free

  doExpire: (clearGlobalState, run, free) ->
    if @_states.jobStatus @options.id == "RUNNING"
      @_states.next @options.id
    @_assertStatus "EXECUTING"
    eventInfo = { @args, @options, @retryCount }
    error = new BottleneckError "This job timed out after #{@options.expiration} ms."
    @_onFailure error, eventInfo, clearGlobalState, run, free

  _onFailure: (error, eventInfo, clearGlobalState, run, free) ->
    if clearGlobalState()
      retry = await @Events.trigger "failed", error, eventInfo
      if retry?
        retryAfter = ~~retry
        @Events.trigger "retry", "Retrying #{@options.id} after #{retryAfter} ms", eventInfo
        @retryCount++
        run retryAfter
      else
        @doDone eventInfo
        await free @options, eventInfo
        @_assertStatus "DONE"
        @_reject error

  doDone: (eventInfo) ->
    @_assertStatus "EXECUTING"
    @_states.next @options.id
    @Events.trigger "done", eventInfo

module.exports = Job
parser = require "./parser"
BottleneckError = require "./BottleneckError"

class LocalDatastore
  constructor: (@instance, @storeOptions, storeInstanceOptions) ->
    @clientId = @instance._randomIndex()
    parser.load storeInstanceOptions, storeInstanceOptions, @
    @_nextRequest = @_lastReservoirRefresh = @_lastReservoirIncrease = Date.now()
    @_running = 0
    @_done = 0
    @_unblockTime = 0
    @ready = @Promise.resolve()
    @clients = {}
    @_startHeartbeat()

  _startHeartbeat: ->
    if !@heartbeat? and ((
      @storeOptions.reservoirRefreshInterval? and @storeOptions.reservoirRefreshAmount?
    ) or (
      @storeOptions.reservoirIncreaseInterval? and @storeOptions.reservoirIncreaseAmount?
    ))
      (@heartbeat = setInterval =>
          now = Date.now()

          if @storeOptions.reservoirRefreshInterval? and now >= @_lastReservoirRefresh + @storeOptions.reservoirRefreshInterval
            @_lastReservoirRefresh = now
            @storeOptions.reservoir = @storeOptions.reservoirRefreshAmount
            @instance._drainAll @computeCapacity()

          if @storeOptions.reservoirIncreaseInterval? and now >= @_lastReservoirIncrease + @storeOptions.reservoirIncreaseInterval
            { reservoirIncreaseAmount: amount, reservoirIncreaseMaximum: maximum, reservoir } = @storeOptions
            @_lastReservoirIncrease = now
            incr = if maximum? then Math.min amount, maximum - reservoir else amount
            if incr > 0
              @storeOptions.reservoir += incr
              @instance._drainAll @computeCapacity()

        , @heartbeatInterval).unref?()
    else clearInterval @heartbeat

  __publish__: (message) ->
    await @yieldLoop()
    @instance.Events.trigger "message", message.toString()

  __disconnect__: (flush) ->
    await @yieldLoop()
    clearInterval @heartbeat
    @Promise.resolve()

  yieldLoop: (t=0) -> new @Promise (resolve, reject) -> setTimeout resolve, t

  computePenalty: -> @storeOptions.penalty ? ((15 * @storeOptions.minTime) or 5000)

  __updateSettings__: (options) ->
    await @yieldLoop()
    parser.overwrite options, options, @storeOptions
    @_startHeartbeat()
    @instance._drainAll @computeCapacity()
    true

  __running__: ->
    await @yieldLoop()
    @_running

  __queued__: ->
    await @yieldLoop()
    @instance.queued()

  __done__: ->
    await @yieldLoop()
    @_done

  __groupCheck__: (time) ->
    await @yieldLoop()
    (@_nextRequest + @timeout) < time

  computeCapacity: ->
    { maxConcurrent, reservoir } = @storeOptions
    if maxConcurrent? and reservoir? then Math.min((maxConcurrent - @_running), reservoir)
    else if maxConcurrent? then maxConcurrent - @_running
    else if reservoir? then reservoir
    else null

  conditionsCheck: (weight) ->
    capacity = @computeCapacity()
    not capacity? or weight <= capacity

  __incrementReservoir__: (incr) ->
    await @yieldLoop()
    reservoir = @storeOptions.reservoir += incr
    @instance._drainAll @computeCapacity()
    reservoir

  __currentReservoir__: ->
    await @yieldLoop()
    @storeOptions.reservoir

  isBlocked: (now) -> @_unblockTime >= now

  check: (weight, now) -> @conditionsCheck(weight) and (@_nextRequest - now) <= 0

  __check__: (weight) ->
    await @yieldLoop()
    now = Date.now()
    @check weight, now

  __register__: (index, weight, expiration) ->
    await @yieldLoop()
    now = Date.now()
    if @conditionsCheck weight
      @_running += weight
      if @storeOptions.reservoir? then @storeOptions.reservoir -= weight
      wait = Math.max @_nextRequest - now, 0
      @_nextRequest = now + wait + @storeOptions.minTime
      { success: true, wait, reservoir: @storeOptions.reservoir }
    else { success: false }

  strategyIsBlock: -> @storeOptions.strategy == 3

  __submit__: (queueLength, weight) ->
    await @yieldLoop()
    if @storeOptions.maxConcurrent? and weight > @storeOptions.maxConcurrent
      throw new BottleneckError("Impossible to add a job having a weight of #{weight} to a limiter having a maxConcurrent setting of #{@storeOptions.maxConcurrent}")
    now = Date.now()
    reachedHWM = @storeOptions.highWater? and queueLength == @storeOptions.highWater and not @check(weight, now)
    blocked = @strategyIsBlock() and (reachedHWM or @isBlocked now)
    if blocked
      @_unblockTime = now + @computePenalty()
      @_nextRequest = @_unblockTime + @storeOptions.minTime
      @instance._dropAllQueued()
    { reachedHWM, blocked, strategy: @storeOptions.strategy }

  __free__: (index, weight) ->
    await @yieldLoop()
    @_running -= weight
    @_done += weight
    @instance._drainAll @computeCapacity()
    { running: @_running }

module.exports = LocalDatastore
DLList = require "./DLList"
Events = require "./Events"

class Queues

  constructor: (num_priorities) ->
    @Events = new Events @
    @_length = 0
    @_lists = for i in [1..num_priorities] then new DLList (=> @incr()), (=> @decr())

  incr: -> if @_length++ == 0 then @Events.trigger "leftzero"

  decr: -> if --@_length == 0 then @Events.trigger "zero"

  push: (job) -> @_lists[job.options.priority].push job

  queued: (priority) -> if priority? then @_lists[priority].length else @_length

  shiftAll: (fn) -> @_lists.forEach (list) -> list.forEachShift fn

  getFirst: (arr=@_lists) ->
    for list in arr
      return list if list.length > 0
    []

  shiftLastFrom: (priority) -> @getFirst(@_lists[priority..].reverse()).shift()

module.exports = Queues
parser = require "./parser"
Events = require "./Events"
Scripts = require "./Scripts"

class RedisConnection
  datastore: "redis"
  defaults:
    Redis: null
    clientOptions: {}
    client: null
    Promise: Promise
    Events: null

  constructor: (options={}) ->
    parser.load options, @defaults, @
    @Redis ?= eval("require")("redis") # Obfuscated or else Webpack/Angular will try to inline the optional redis module. To override this behavior: pass the redis module to Bottleneck as the 'Redis' option.
    @Events ?= new Events @
    @terminated = false

    @client ?= @Redis.createClient @clientOptions
    @subscriber = @client.duplicate()
    @limiters = {}
    @shas = {}

    @ready = @Promise.all [@_setup(@client, false), @_setup(@subscriber, true)]
    .then => @_loadScripts()
    .then => { @client, @subscriber }

  _setup: (client, sub) ->
    client.setMaxListeners 0
    new @Promise (resolve, reject) =>
      client.on "error", (e) => @Events.trigger "error", e
      if sub
        client.on "message", (channel, message) =>
          @limiters[channel]?._store.onMessage channel, message
      if client.ready then resolve()
      else client.once "ready", resolve

  _loadScript: (name) ->
    new @Promise (resolve, reject) =>
      payload = Scripts.payload name
      @client.multi([["script", "load", payload]]).exec (err, replies) =>
        if err? then return reject err
        @shas[name] = replies[0]
        resolve replies[0]

  _loadScripts: -> @Promise.all(Scripts.names.map (k) => @_loadScript k)

  __runCommand__: (cmd) ->
    await @ready
    new @Promise (resolve, reject) =>
      @client.multi([cmd]).exec_atomic (err, replies) ->
        if err? then reject(err) else resolve(replies[0])

  __addLimiter__: (instance) ->
    @Promise.all [instance.channel(), instance.channel_client()].map (channel) =>
      new @Promise (resolve, reject) =>
        handler = (chan) =>
          if chan == channel
            @subscriber.removeListener "subscribe", handler
            @limiters[channel] = instance
            resolve()
        @subscriber.on "subscribe", handler
        @subscriber.subscribe channel

  __removeLimiter__: (instance) ->
    @Promise.all [instance.channel(), instance.channel_client()].map (channel) =>
      unless @terminated
        await new @Promise (resolve, reject) =>
          @subscriber.unsubscribe channel, (err, chan) ->
            if err? then return reject err
            if chan == channel then return resolve()
      delete @limiters[channel]

  __scriptArgs__: (name, id, args, cb) ->
    keys = Scripts.keys name, id
    [@shas[name], keys.length].concat keys, args, cb

  __scriptFn__: (name) ->
    @client.evalsha.bind(@client)

  disconnect: (flush=true) ->
    clearInterval(@limiters[k]._store.heartbeat) for k in Object.keys @limiters
    @limiters = {}
    @terminated = true

    @client.end flush
    @subscriber.end flush
    @Promise.resolve()

module.exports = RedisConnection
parser = require "./parser"
BottleneckError = require "./BottleneckError"
RedisConnection = require "./RedisConnection"
IORedisConnection = require "./IORedisConnection"

class RedisDatastore
  constructor: (@instance, @storeOptions, storeInstanceOptions) ->
    @originalId = @instance.id
    @clientId = @instance._randomIndex()
    parser.load storeInstanceOptions, storeInstanceOptions, @
    @clients = {}
    @capacityPriorityCounters = {}
    @sharedConnection = @connection?

    @connection ?= if @instance.datastore == "redis" then new RedisConnection { @Redis, @clientOptions, @Promise, Events: @instance.Events }
    else if @instance.datastore == "ioredis" then new IORedisConnection { @Redis, @clientOptions, @clusterNodes, @Promise, Events: @instance.Events }

    @instance.connection = @connection
    @instance.datastore = @connection.datastore

    @ready = @connection.ready
    .then (@clients) => @runScript "init", @prepareInitSettings @clearDatastore
    .then => @connection.__addLimiter__ @instance
    .then => @runScript "register_client", [@instance.queued()]
    .then =>
      (@heartbeat = setInterval =>
        @runScript "heartbeat", []
        .catch (e) => @instance.Events.trigger "error", e
      , @heartbeatInterval).unref?()
      @clients

  __publish__: (message) ->
    { client } = await @ready
    client.publish(@instance.channel(), "message:#{message.toString()}")

  onMessage: (channel, message) ->
    try
      pos = message.indexOf(":")
      [type, data] = [message.slice(0, pos), message.slice(pos+1)]
      if type == "capacity"
        await @instance._drainAll(if data.length > 0 then ~~data)
      else if type == "capacity-priority"
        [rawCapacity, priorityClient, counter] = data.split(":")
        capacity = if rawCapacity.length > 0 then ~~rawCapacity
        if priorityClient == @clientId
          drained = await @instance._drainAll(capacity)
          newCapacity = if capacity? then capacity - (drained or 0) else ""
          await @clients.client.publish(@instance.channel(), "capacity-priority:#{newCapacity}::#{counter}")
        else if priorityClient == ""
          clearTimeout @capacityPriorityCounters[counter]
          delete @capacityPriorityCounters[counter]
          @instance._drainAll(capacity)
        else
          @capacityPriorityCounters[counter] = setTimeout =>
            try
              delete @capacityPriorityCounters[counter]
              await @runScript "blacklist_client", [priorityClient]
              await @instance._drainAll(capacity)
            catch e then @instance.Events.trigger "error", e
          , 1000
      else if type == "message"
        @instance.Events.trigger "message", data
      else if type == "blocked"
        await @instance._dropAllQueued()
    catch e then @instance.Events.trigger "error", e

  __disconnect__: (flush) ->
    clearInterval @heartbeat
    if @sharedConnection
      @connection.__removeLimiter__ @instance
    else
      @connection.disconnect flush

  runScript: (name, args) ->
    await @ready unless name == "init" or name == "register_client"
    new @Promise (resolve, reject) =>
      all_args = [Date.now(), @clientId].concat args
      @instance.Events.trigger "debug", "Calling Redis script: #{name}.lua", all_args
      arr = @connection.__scriptArgs__ name, @originalId, all_args, (err, replies) ->
        if err? then return reject err
        return resolve replies
      @connection.__scriptFn__(name) arr...
    .catch (e) =>
      if e.message == "SETTINGS_KEY_NOT_FOUND"
        if name == "heartbeat" then @Promise.resolve()
        else
          @runScript("init", @prepareInitSettings(false))
          .then => @runScript(name, args)
      else if e.message == "UNKNOWN_CLIENT"
        @runScript("register_client", [@instance.queued()])
        .then => @runScript(name, args)
      else @Promise.reject e

  prepareArray: (arr) -> (if x? then x.toString() else "") for x in arr

  prepareObject: (obj) ->
    arr = []
    for k, v of obj then arr.push k, (if v? then v.toString() else "")
    arr

  prepareInitSettings: (clear) ->
    args = @prepareObject Object.assign({}, @storeOptions, {
      id: @originalId
      version: @instance.version
      groupTimeout: @timeout
      @clientTimeout
    })
    args.unshift (if clear then 1 else 0), @instance.version
    args

  convertBool: (b) -> !!b

  __updateSettings__: (options) ->
    await @runScript "update_settings", @prepareObject options
    parser.overwrite options, options, @storeOptions

  __running__: -> @runScript "running", []

  __queued__: -> @runScript "queued", []

  __done__: -> @runScript "done", []

  __groupCheck__: -> @convertBool await @runScript "group_check", []

  __incrementReservoir__: (incr) -> @runScript "increment_reservoir", [incr]

  __currentReservoir__: -> @runScript "current_reservoir", []

  __check__: (weight) -> @convertBool await @runScript "check", @prepareArray [weight]

  __register__: (index, weight, expiration) ->
    [success, wait, reservoir] = await @runScript "register", @prepareArray [index, weight, expiration]
    return {
      success: @convertBool(success),
      wait,
      reservoir
    }

  __submit__: (queueLength, weight) ->
    try
      [reachedHWM, blocked, strategy] = await @runScript "submit", @prepareArray [queueLength, weight]
      return {
        reachedHWM: @convertBool(reachedHWM),
        blocked: @convertBool(blocked),
        strategy
      }
    catch e
      if e.message.indexOf("OVERWEIGHT") == 0
        [overweight, weight, maxConcurrent] = e.message.split ":"
        throw new BottleneckError("Impossible to add a job having a weight of #{weight} to a limiter having a maxConcurrent setting of #{maxConcurrent}")
      else
        throw e

  __free__: (index, weight) ->
    running = await @runScript "free", @prepareArray [index]
    return { running }

module.exports = RedisDatastore
lua = require "./lua.json"

headers =
  refs: lua["refs.lua"]
  validate_keys: lua["validate_keys.lua"]
  validate_client: lua["validate_client.lua"]
  refresh_expiration: lua["refresh_expiration.lua"]
  process_tick: lua["process_tick.lua"]
  conditions_check: lua["conditions_check.lua"]
  get_time: lua["get_time.lua"]

exports.allKeys = (id) -> [
  ###
  HASH
  ###
  "b_#{id}_settings"

  ###
  HASH
  job index -> weight
  ###
  "b_#{id}_job_weights"

  ###
  ZSET
  job index -> expiration
  ###
  "b_#{id}_job_expirations"

  ###
  HASH
  job index -> client
  ###
  "b_#{id}_job_clients"

  ###
  ZSET
  client -> sum running
  ###
  "b_#{id}_client_running"

  ###
  HASH
  client -> num queued
  ###
  "b_#{id}_client_num_queued"

  ###
  ZSET
  client -> last job registered
  ###
  "b_#{id}_client_last_registered"

  ###
  ZSET
  client -> last seen
  ###
  "b_#{id}_client_last_seen"
]

templates =
  init:
    keys: exports.allKeys
    headers: ["process_tick"]
    refresh_expiration: true
    code: lua["init.lua"]
  group_check:
    keys: exports.allKeys
    headers: []
    refresh_expiration: false
    code: lua["group_check.lua"]
  register_client:
    keys: exports.allKeys
    headers: ["validate_keys"]
    refresh_expiration: false
    code: lua["register_client.lua"]
  blacklist_client:
    keys: exports.allKeys
    headers: ["validate_keys", "validate_client"]
    refresh_expiration: false
    code: lua["blacklist_client.lua"]
  heartbeat:
    keys: exports.allKeys
    headers: ["validate_keys", "validate_client", "process_tick"]
    refresh_expiration: false
    code: lua["heartbeat.lua"]
  update_settings:
    keys: exports.allKeys
    headers: ["validate_keys", "validate_client", "process_tick"]
    refresh_expiration: true
    code: lua["update_settings.lua"]
  running:
    keys: exports.allKeys
    headers: ["validate_keys", "validate_client", "process_tick"]
    refresh_expiration: false
    code: lua["running.lua"]
  queued:
    keys: exports.allKeys
    headers: ["validate_keys", "validate_client"]
    refresh_expiration: false
    code: lua["queued.lua"]
  done:
    keys: exports.allKeys
    headers: ["validate_keys", "validate_client", "process_tick"]
    refresh_expiration: false
    code: lua["done.lua"]
  check:
    keys: exports.allKeys
    headers: ["validate_keys", "validate_client", "process_tick", "conditions_check"]
    refresh_expiration: false
    code: lua["check.lua"]
  submit:
    keys: exports.allKeys
    headers: ["validate_keys", "validate_client", "process_tick", "conditions_check"]
    refresh_expiration: true
    code: lua["submit.lua"]
  register:
    keys: exports.allKeys
    headers: ["validate_keys", "validate_client", "process_tick", "conditions_check"]
    refresh_expiration: true
    code: lua["register.lua"]
  free:
    keys: exports.allKeys
    headers: ["validate_keys", "validate_client", "process_tick"]
    refresh_expiration: true
    code: lua["free.lua"]
  current_reservoir:
    keys: exports.allKeys
    headers: ["validate_keys", "validate_client", "process_tick"]
    refresh_expiration: false
    code: lua["current_reservoir.lua"]
  increment_reservoir:
    keys: exports.allKeys
    headers: ["validate_keys", "validate_client", "process_tick"]
    refresh_expiration: true
    code: lua["increment_reservoir.lua"]

exports.names = Object.keys templates

exports.keys = (name, id) ->
  templates[name].keys id

exports.payload = (name) ->
  template = templates[name]
  Array::concat(
    headers.refs,
    template.headers.map((h) -> headers[h]),
    (if template.refresh_expiration then headers.refresh_expiration else ""),
    template.code
  )
  .join("\n")
BottleneckError = require "./BottleneckError"
class States
  constructor: (@status) ->
    @_jobs = {}
    @counts = @status.map(-> 0)

  next: (id) ->
    current = @_jobs[id]
    next = current + 1
    if current? and next < @status.length
      @counts[current]--
      @counts[next]++
      @_jobs[id]++
    else if current?
      @counts[current]--
      delete @_jobs[id]

  start: (id) ->
    initial = 0
    @_jobs[id] = initial
    @counts[initial]++

  remove: (id) ->
    current = @_jobs[id]
    if current?
      @counts[current]--
      delete @_jobs[id]
    current?

  jobStatus: (id) -> @status[@_jobs[id]] ? null

  statusJobs: (status) ->
    if status?
      pos = @status.indexOf status
      if pos < 0
        throw new BottleneckError "status must be one of #{@status.join ', '}"
      k for k,v of @_jobs when v == pos
    else
      Object.keys @_jobs

  statusCounts: -> @counts.reduce(((acc, v, i) => acc[@status[i]] = v; acc), {})

module.exports = States
DLList = require "./DLList"
class Sync
  constructor: (@name, @Promise) ->
    @_running = 0
    @_queue = new DLList()
  isEmpty: -> @_queue.length == 0
  _tryToRun: ->
    if (@_running < 1) and @_queue.length > 0
      @_running++
      { task, args, resolve, reject } = @_queue.shift()
      cb = try
        returned = await task args...
        () -> resolve returned
      catch error
        () -> reject error
      @_running--
      @_tryToRun()
      cb()
  schedule: (task, args...) =>
    resolve = reject = null
    promise = new @Promise (_resolve, _reject) ->
      resolve = _resolve
      reject = _reject
    @_queue.push { task, args, resolve, reject }
    @_tryToRun()
    promise

module.exports = Sync
require("regenerator-runtime/runtime")

module.exports = require "./Bottleneck"
module.exports = require "./Bottleneck"
exports.load = (received, defaults, onto={}) ->
  for k, v of defaults
    onto[k] = received[k] ? v
  onto

exports.overwrite = (received, defaults, onto={}) ->
  for k, v of received
    if defaults[k] != undefined
      onto[k] = v
  onto
local blacklist = ARGV[num_static_argv + 1]

if redis.call('zscore', client_last_seen_key, blacklist) then
  redis.call('zadd', client_last_seen_key, 0, blacklist)
end


return {}
local weight = tonumber(ARGV[num_static_argv + 1])

local capacity = process_tick(now, false)['capacity']
local nextRequest = tonumber(redis.call('hget', settings_key, 'nextRequest'))

return conditions_check(capacity, weight) and nextRequest - now <= 0
local conditions_check = function (capacity, weight)
  return capacity == nil or weight <= capacity
end
return process_tick(now, false)['reservoir']
process_tick(now, false)

return tonumber(redis.call('hget', settings_key, 'done'))
local index = ARGV[num_static_argv + 1]

redis.call('zadd', job_expirations_key, 0, index)

return process_tick(now, false)['running']
redis.replicate_commands()

local get_time = function ()
  local time = redis.call('time')

  return tonumber(time[1]..string.sub(time[2], 1, 3))
end
return not (redis.call('exists', settings_key) == 1)
process_tick(now, true)
local incr = tonumber(ARGV[num_static_argv + 1])

redis.call('hincrby', settings_key, 'reservoir', incr)

local reservoir = process_tick(now, true)['reservoir']

local groupTimeout = tonumber(redis.call('hget', settings_key, 'groupTimeout'))
refresh_expiration(0, 0, groupTimeout)

return reservoir
local clear = tonumber(ARGV[num_static_argv + 1])
local limiter_version = ARGV[num_static_argv + 2]
local num_local_argv = num_static_argv + 2

if clear == 1 then
  redis.call('del', unpack(KEYS))
end

if redis.call('exists', settings_key) == 0 then
  -- Create
  local args = {'hmset', settings_key}

  for i = num_local_argv + 1, #ARGV do
    table.insert(args, ARGV[i])
  end

  redis.call(unpack(args))
  redis.call('hmset', settings_key,
    'nextRequest', now,
    'lastReservoirRefresh', now,
    'lastReservoirIncrease', now,
    'running', 0,
    'done', 0,
    'unblockTime', 0,
    'capacityPriorityCounter', 0
  )

else
  -- Apply migrations
  local settings = redis.call('hmget', settings_key,
    'id',
    'version'
  )
  local id = settings[1]
  local current_version = settings[2]

  if current_version ~= limiter_version then
    local version_digits = {}
    for k, v in string.gmatch(current_version, "([^.]+)") do
      table.insert(version_digits, tonumber(k))
    end

    -- 2.10.0
    if version_digits[2] < 10 then
      redis.call('hsetnx', settings_key, 'reservoirRefreshInterval', '')
      redis.call('hsetnx', settings_key, 'reservoirRefreshAmount', '')
      redis.call('hsetnx', settings_key, 'lastReservoirRefresh', '')
      redis.call('hsetnx', settings_key, 'done', 0)
      redis.call('hset', settings_key, 'version', '2.10.0')
    end

    -- 2.11.1
    if version_digits[2] < 11 or (version_digits[2] == 11 and version_digits[3] < 1) then
      if redis.call('hstrlen', settings_key, 'lastReservoirRefresh') == 0 then
        redis.call('hmset', settings_key,
          'lastReservoirRefresh', now,
          'version', '2.11.1'
        )
      end
    end

    -- 2.14.0
    if version_digits[2] < 14 then
      local old_running_key = 'b_'..id..'_running'
      local old_executing_key = 'b_'..id..'_executing'

      if redis.call('exists', old_running_key) == 1 then
        redis.call('rename', old_running_key, job_weights_key)
      end
      if redis.call('exists', old_executing_key) == 1 then
        redis.call('rename', old_executing_key, job_expirations_key)
      end
      redis.call('hset', settings_key, 'version', '2.14.0')
    end

    -- 2.15.2
    if version_digits[2] < 15 or (version_digits[2] == 15 and version_digits[3] < 2) then
      redis.call('hsetnx', settings_key, 'capacityPriorityCounter', 0)
      redis.call('hset', settings_key, 'version', '2.15.2')
    end

    -- 2.17.0
    if version_digits[2] < 17 then
      redis.call('hsetnx', settings_key, 'clientTimeout', 10000)
      redis.call('hset', settings_key, 'version', '2.17.0')
    end

    -- 2.18.0
    if version_digits[2] < 18 then
      redis.call('hsetnx', settings_key, 'reservoirIncreaseInterval', '')
      redis.call('hsetnx', settings_key, 'reservoirIncreaseAmount', '')
      redis.call('hsetnx', settings_key, 'reservoirIncreaseMaximum', '')
      redis.call('hsetnx', settings_key, 'lastReservoirIncrease', now)
      redis.call('hset', settings_key, 'version', '2.18.0')
    end

  end

  process_tick(now, false)
end

local groupTimeout = tonumber(redis.call('hget', settings_key, 'groupTimeout'))
refresh_expiration(0, 0, groupTimeout)

return {}
local process_tick = function (now, always_publish)

  local compute_capacity = function (maxConcurrent, running, reservoir)
    if maxConcurrent ~= nil and reservoir ~= nil then
      return math.min((maxConcurrent - running), reservoir)
    elseif maxConcurrent ~= nil then
      return maxConcurrent - running
    elseif reservoir ~= nil then
      return reservoir
    else
      return nil
    end
  end

  local settings = redis.call('hmget', settings_key,
    'id',
    'maxConcurrent',
    'running',
    'reservoir',
    'reservoirRefreshInterval',
    'reservoirRefreshAmount',
    'lastReservoirRefresh',
    'reservoirIncreaseInterval',
    'reservoirIncreaseAmount',
    'reservoirIncreaseMaximum',
    'lastReservoirIncrease',
    'capacityPriorityCounter',
    'clientTimeout'
  )
  local id = settings[1]
  local maxConcurrent = tonumber(settings[2])
  local running = tonumber(settings[3])
  local reservoir = tonumber(settings[4])
  local reservoirRefreshInterval = tonumber(settings[5])
  local reservoirRefreshAmount = tonumber(settings[6])
  local lastReservoirRefresh = tonumber(settings[7])
  local reservoirIncreaseInterval = tonumber(settings[8])
  local reservoirIncreaseAmount = tonumber(settings[9])
  local reservoirIncreaseMaximum = tonumber(settings[10])
  local lastReservoirIncrease = tonumber(settings[11])
  local capacityPriorityCounter = tonumber(settings[12])
  local clientTimeout = tonumber(settings[13])

  local initial_capacity = compute_capacity(maxConcurrent, running, reservoir)

  --
  -- Process 'running' changes
  --
  local expired = redis.call('zrangebyscore', job_expirations_key, '-inf', '('..now)

  if #expired > 0 then
    redis.call('zremrangebyscore', job_expirations_key, '-inf', '('..now)

    local flush_batch = function (batch, acc)
      local weights = redis.call('hmget', job_weights_key, unpack(batch))
                      redis.call('hdel',  job_weights_key, unpack(batch))
      local clients = redis.call('hmget', job_clients_key, unpack(batch))
                      redis.call('hdel',  job_clients_key, unpack(batch))

      -- Calculate sum of removed weights
      for i = 1, #weights do
        acc['total'] = acc['total'] + (tonumber(weights[i]) or 0)
      end

      -- Calculate sum of removed weights by client
      local client_weights = {}
      for i = 1, #clients do
        local removed = tonumber(weights[i]) or 0
        if removed > 0 then
          acc['client_weights'][clients[i]] = (acc['client_weights'][clients[i]] or 0) + removed
        end
      end
    end

    local acc = {
      ['total'] = 0,
      ['client_weights'] = {}
    }
    local batch_size = 1000

    -- Compute changes to Zsets and apply changes to Hashes
    for i = 1, #expired, batch_size do
      local batch = {}
      for j = i, math.min(i + batch_size - 1, #expired) do
        table.insert(batch, expired[j])
      end

      flush_batch(batch, acc)
    end

    -- Apply changes to Zsets
    if acc['total'] > 0 then
      redis.call('hincrby', settings_key, 'done', acc['total'])
      running = tonumber(redis.call('hincrby', settings_key, 'running', -acc['total']))
    end

    for client, weight in pairs(acc['client_weights']) do
      redis.call('zincrby', client_running_key, -weight, client)
    end
  end

  --
  -- Process 'reservoir' changes
  --
  local reservoirRefreshActive = reservoirRefreshInterval ~= nil and reservoirRefreshAmount ~= nil
  if reservoirRefreshActive and now >= lastReservoirRefresh + reservoirRefreshInterval then
    reservoir = reservoirRefreshAmount
    redis.call('hmset', settings_key,
      'reservoir', reservoir,
      'lastReservoirRefresh', now
    )
  end

  local reservoirIncreaseActive = reservoirIncreaseInterval ~= nil and reservoirIncreaseAmount ~= nil
  if reservoirIncreaseActive and now >= lastReservoirIncrease + reservoirIncreaseInterval then
    local num_intervals = math.floor((now - lastReservoirIncrease) / reservoirIncreaseInterval)
    local incr = reservoirIncreaseAmount * num_intervals
    if reservoirIncreaseMaximum ~= nil then
      incr = math.min(incr, reservoirIncreaseMaximum - (reservoir or 0))
    end
    if incr > 0 then
      reservoir = (reservoir or 0) + incr
    end
    redis.call('hmset', settings_key,
      'reservoir', reservoir,
      'lastReservoirIncrease', lastReservoirIncrease + (num_intervals * reservoirIncreaseInterval)
    )
  end

  --
  -- Clear unresponsive clients
  --
  local unresponsive = redis.call('zrangebyscore', client_last_seen_key, '-inf', (now - clientTimeout))
  local unresponsive_lookup = {}
  local terminated_clients = {}
  for i = 1, #unresponsive do
    unresponsive_lookup[unresponsive[i]] = true
    if tonumber(redis.call('zscore', client_running_key, unresponsive[i])) == 0 then
      table.insert(terminated_clients, unresponsive[i])
    end
  end
  if #terminated_clients > 0 then
    redis.call('zrem', client_running_key,         unpack(terminated_clients))
    redis.call('hdel', client_num_queued_key,      unpack(terminated_clients))
    redis.call('zrem', client_last_registered_key, unpack(terminated_clients))
    redis.call('zrem', client_last_seen_key,       unpack(terminated_clients))
  end

  --
  -- Broadcast capacity changes
  --
  local final_capacity = compute_capacity(maxConcurrent, running, reservoir)

  if always_publish or (initial_capacity ~= nil and final_capacity == nil) then
    -- always_publish or was not unlimited, now unlimited
    redis.call('publish', 'b_'..id, 'capacity:'..(final_capacity or ''))

  elseif initial_capacity ~= nil and final_capacity ~= nil and final_capacity > initial_capacity then
    -- capacity was increased
    -- send the capacity message to the limiter having the lowest number of running jobs
    -- the tiebreaker is the limiter having not registered a job in the longest time

    local lowest_concurrency_value = nil
    local lowest_concurrency_clients = {}
    local lowest_concurrency_last_registered = {}
    local client_concurrencies = redis.call('zrange', client_running_key, 0, -1, 'withscores')

    for i = 1, #client_concurrencies, 2 do
      local client = client_concurrencies[i]
      local concurrency = tonumber(client_concurrencies[i+1])

      if (
        lowest_concurrency_value == nil or lowest_concurrency_value == concurrency
      ) and (
        not unresponsive_lookup[client]
      ) and (
        tonumber(redis.call('hget', client_num_queued_key, client)) > 0
      ) then
        lowest_concurrency_value = concurrency
        table.insert(lowest_concurrency_clients, client)
        local last_registered = tonumber(redis.call('zscore', client_last_registered_key, client))
        table.insert(lowest_concurrency_last_registered, last_registered)
      end
    end

    if #lowest_concurrency_clients > 0 then
      local position = 1
      local earliest = lowest_concurrency_last_registered[1]

      for i,v in ipairs(lowest_concurrency_last_registered) do
        if v < earliest then
          position = i
          earliest = v
        end
      end

      local next_client = lowest_concurrency_clients[position]
      redis.call('publish', 'b_'..id,
        'capacity-priority:'..(final_capacity or '')..
        ':'..next_client..
        ':'..capacityPriorityCounter
      )
      redis.call('hincrby', settings_key, 'capacityPriorityCounter', '1')
    else
      redis.call('publish', 'b_'..id, 'capacity:'..(final_capacity or ''))
    end
  end

  return {
    ['capacity'] = final_capacity,
    ['running'] = running,
    ['reservoir'] = reservoir
  }
end
local clientTimeout = tonumber(redis.call('hget', settings_key, 'clientTimeout'))
local valid_clients = redis.call('zrangebyscore', client_last_seen_key, (now - clientTimeout), 'inf')
local client_queued = redis.call('hmget', client_num_queued_key, unpack(valid_clients))

local sum = 0
for i = 1, #client_queued do
  sum = sum + tonumber(client_queued[i])
end

return sum
local refresh_expiration = function (now, nextRequest, groupTimeout)

  if groupTimeout ~= nil then
    local ttl = (nextRequest + groupTimeout) - now

    for i = 1, #KEYS do
      redis.call('pexpire', KEYS[i], ttl)
    end
  end

end
local settings_key = KEYS[1]
local job_weights_key = KEYS[2]
local job_expirations_key = KEYS[3]
local job_clients_key = KEYS[4]
local client_running_key = KEYS[5]
local client_num_queued_key = KEYS[6]
local client_last_registered_key = KEYS[7]
local client_last_seen_key = KEYS[8]

local now = tonumber(ARGV[1])
local client = ARGV[2]

local num_static_argv = 2
local index = ARGV[num_static_argv + 1]
local weight = tonumber(ARGV[num_static_argv + 2])
local expiration = tonumber(ARGV[num_static_argv + 3])

local state = process_tick(now, false)
local capacity = state['capacity']
local reservoir = state['reservoir']

local settings = redis.call('hmget', settings_key,
  'nextRequest',
  'minTime',
  'groupTimeout'
)
local nextRequest = tonumber(settings[1])
local minTime = tonumber(settings[2])
local groupTimeout = tonumber(settings[3])

if conditions_check(capacity, weight) then

  redis.call('hincrby', settings_key, 'running', weight)
  redis.call('hset', job_weights_key, index, weight)
  if expiration ~= nil then
    redis.call('zadd', job_expirations_key, now + expiration, index)
  end
  redis.call('hset', job_clients_key, index, client)
  redis.call('zincrby', client_running_key, weight, client)
  redis.call('hincrby', client_num_queued_key, client, -1)
  redis.call('zadd', client_last_registered_key, now, client)

  local wait = math.max(nextRequest - now, 0)
  local newNextRequest = now + wait + minTime

  if reservoir == nil then
    redis.call('hset', settings_key,
      'nextRequest', newNextRequest
    )
  else
    reservoir = reservoir - weight
    redis.call('hmset', settings_key,
      'reservoir', reservoir,
      'nextRequest', newNextRequest
    )
  end

  refresh_expiration(now, newNextRequest, groupTimeout)

  return {true, wait, reservoir}

else
  return {false}
end
local queued = tonumber(ARGV[num_static_argv + 1])

-- Could have been re-registered concurrently
if not redis.call('zscore', client_last_seen_key, client) then
  redis.call('zadd', client_running_key, 0, client)
  redis.call('hset', client_num_queued_key, client, queued)
  redis.call('zadd', client_last_registered_key, 0, client)
end

redis.call('zadd', client_last_seen_key, now, client)

return {}
return process_tick(now, false)['running']
local queueLength = tonumber(ARGV[num_static_argv + 1])
local weight = tonumber(ARGV[num_static_argv + 2])

local capacity = process_tick(now, false)['capacity']

local settings = redis.call('hmget', settings_key,
  'id',
  'maxConcurrent',
  'highWater',
  'nextRequest',
  'strategy',
  'unblockTime',
  'penalty',
  'minTime',
  'groupTimeout'
)
local id = settings[1]
local maxConcurrent = tonumber(settings[2])
local highWater = tonumber(settings[3])
local nextRequest = tonumber(settings[4])
local strategy = tonumber(settings[5])
local unblockTime = tonumber(settings[6])
local penalty = tonumber(settings[7])
local minTime = tonumber(settings[8])
local groupTimeout = tonumber(settings[9])

if maxConcurrent ~= nil and weight > maxConcurrent then
  return redis.error_reply('OVERWEIGHT:'..weight..':'..maxConcurrent)
end

local reachedHWM = (highWater ~= nil and queueLength == highWater
  and not (
    conditions_check(capacity, weight)
    and nextRequest - now <= 0
  )
)

local blocked = strategy == 3 and (reachedHWM or unblockTime >= now)

if blocked then
  local computedPenalty = penalty
  if computedPenalty == nil then
    if minTime == 0 then
      computedPenalty = 5000
    else
      computedPenalty = 15 * minTime
    end
  end

  local newNextRequest = now + computedPenalty + minTime

  redis.call('hmset', settings_key,
    'unblockTime', now + computedPenalty,
    'nextRequest', newNextRequest
  )

  local clients_queued_reset = redis.call('hkeys', client_num_queued_key)
  local queued_reset = {}
  for i = 1, #clients_queued_reset do
    table.insert(queued_reset, clients_queued_reset[i])
    table.insert(queued_reset, 0)
  end
  redis.call('hmset', client_num_queued_key, unpack(queued_reset))

  redis.call('publish', 'b_'..id, 'blocked:')

  refresh_expiration(now, newNextRequest, groupTimeout)
end

if not blocked and not reachedHWM then
  redis.call('hincrby', client_num_queued_key, client, 1)
end

return {reachedHWM, blocked, strategy}
local args = {'hmset', settings_key}

for i = num_static_argv + 1, #ARGV do
  table.insert(args, ARGV[i])
end

redis.call(unpack(args))

process_tick(now, true)

local groupTimeout = tonumber(redis.call('hget', settings_key, 'groupTimeout'))
refresh_expiration(0, 0, groupTimeout)

return {}
if not redis.call('zscore', client_last_seen_key, client) then
  return redis.error_reply('UNKNOWN_CLIENT')
end

redis.call('zadd', client_last_seen_key, now, client)
if not (redis.call('exists', settings_key) == 1) then
  return redis.error_reply('SETTINGS_KEY_NOT_FOUND')
end
var fs = require('fs')

var input = __dirname + '/../src/redis'
var loaded = {}

var promises = fs.readdirSync(input).map(function (file) {
  return new Promise(function (resolve, reject) {
    fs.readFile(input + '/' + file, function (err, data) {
      if (err != null) {
        return reject(err)
      }
      loaded[file] = data.toString('utf8')
      return resolve()
    })
  })
})

Promise.all(promises)
.then(function () {
  console.log(JSON.stringify(loaded, Object.keys(loaded).sort(), 2))
})
.catch(function (err) {
  console.error(err)
  process.exit(1)
})
#!/usr/bin/env bash

set -e

if [ ! -d node_modules ]; then
	echo "[B] Run 'npm install' first"
	exit 1
fi


clean() {
  rm -f .babelrc
  rm -rf lib/*
  node scripts/version.js > lib/version.json
  node scripts/assemble_lua.js > lib/lua.json
}

makeLib10() {
  echo '[B] Compiling Bottleneck to Node 10+...'
  npx coffee --compile --bare --no-header src/*.coffee
  mv src/*.js lib/
}

makeLib6() {
  echo '[B] Compiling Bottleneck to Node 6+...'
  ln -s .babelrc.lib .babelrc
  npx coffee --compile --bare --no-header --transpile src/*.coffee
  mv src/*.js lib/
}

makeES5() {
  echo '[B] Compiling Bottleneck to ES5...'
  ln -s .babelrc.es5 .babelrc
  npx coffee --compile --bare --no-header src/*.coffee
  mv src/*.js lib/

  echo '[B] Assembling ES5 bundle...'
  npx rollup -c rollup.config.es5.js
}

makeLight() {
  makeLib10

  echo '[B] Assembling light bundle...'
  npx rollup -c rollup.config.light.js
}

makeTypings() {
  echo '[B] Compiling and testing TS typings...'
  npx ejs-cli bottleneck.d.ts.ejs > bottleneck.d.ts
  npx tsc --noEmit --strict test.ts
}

if [ "$1" = 'dev' ]; then
  clean
  makeLib10
elif [ "$1" = 'bench' ]; then
  clean
  makeLib6
elif [ "$1" = 'es5' ]; then
  clean
  makeES5
elif [ "$1" = 'light' ]; then
  clean
  makeLight
elif [ "$1" = 'typings' ]; then
  makeTypings
else
  clean
  makeES5

  clean
  makeLight

  clean
  makeLib6
  makeTypings
fi

rm -f .babelrc

echo '[B] Done!'
#!/usr/bin/env bash

set -e

source .env

echo 'ioredis tests'
DATASTORE=ioredis npm test

echo 'NodeRedis tests'
DATASTORE=redis npm test

echo 'ES5 bundle tests'
BUILD=es5 npm test

echo 'Light bundle tests'
BUILD=light npm test

echo 'Local tests'
npm test
const packagejson = require('../package.json')

console.log(JSON.stringify({version: packagejson.version}))
"use strict";

var Batcher, Events, parser;
parser = require("./parser");
Events = require("./Events");

Batcher = function () {
  class Batcher {
    constructor(options = {}) {
      this.options = options;
      parser.load(this.options, this.defaults, this);
      this.Events = new Events(this);
      this._arr = [];

      this._resetPromise();

      this._lastFlush = Date.now();
    }

    _resetPromise() {
      return this._promise = new this.Promise((res, rej) => {
        return this._resolve = res;
      });
    }

    _flush() {
      clearTimeout(this._timeout);
      this._lastFlush = Date.now();

      this._resolve();

      this.Events.trigger("batch", this._arr);
      this._arr = [];
      return this._resetPromise();
    }

    add(data) {
      var ret;

      this._arr.push(data);

      ret = this._promise;

      if (this._arr.length === this.maxSize) {
        this._flush();
      } else if (this.maxTime != null && this._arr.length === 1) {
        this._timeout = setTimeout(() => {
          return this._flush();
        }, this.maxTime);
      }

      return ret;
    }

  }

  ;
  Batcher.prototype.defaults = {
    maxTime: null,
    maxSize: null,
    Promise: Promise
  };
  return Batcher;
}.call(void 0);

module.exports = Batcher;"use strict";

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }

function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _toArray(arr) { return _arrayWithHoles(arr) || _iterableToArray(arr) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }

function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

var Bottleneck,
    DEFAULT_PRIORITY,
    Events,
    Job,
    LocalDatastore,
    NUM_PRIORITIES,
    Queues,
    RedisDatastore,
    States,
    Sync,
    parser,
    splice = [].splice;
NUM_PRIORITIES = 10;
DEFAULT_PRIORITY = 5;
parser = require("./parser");
Queues = require("./Queues");
Job = require("./Job");
LocalDatastore = require("./LocalDatastore");
RedisDatastore = require("./RedisDatastore");
Events = require("./Events");
States = require("./States");
Sync = require("./Sync");

Bottleneck = function () {
  class Bottleneck {
    constructor(options = {}, ...invalid) {
      var storeInstanceOptions, storeOptions;
      this._addToQueue = this._addToQueue.bind(this);

      this._validateOptions(options, invalid);

      parser.load(options, this.instanceDefaults, this);
      this._queues = new Queues(NUM_PRIORITIES);
      this._scheduled = {};
      this._states = new States(["RECEIVED", "QUEUED", "RUNNING", "EXECUTING"].concat(this.trackDoneStatus ? ["DONE"] : []));
      this._limiter = null;
      this.Events = new Events(this);
      this._submitLock = new Sync("submit", this.Promise);
      this._registerLock = new Sync("register", this.Promise);
      storeOptions = parser.load(options, this.storeDefaults, {});

      this._store = function () {
        if (this.datastore === "redis" || this.datastore === "ioredis" || this.connection != null) {
          storeInstanceOptions = parser.load(options, this.redisStoreDefaults, {});
          return new RedisDatastore(this, storeOptions, storeInstanceOptions);
        } else if (this.datastore === "local") {
          storeInstanceOptions = parser.load(options, this.localStoreDefaults, {});
          return new LocalDatastore(this, storeOptions, storeInstanceOptions);
        } else {
          throw new Bottleneck.prototype.BottleneckError(`Invalid datastore type: ${this.datastore}`);
        }
      }.call(this);

      this._queues.on("leftzero", () => {
        var ref;
        return (ref = this._store.heartbeat) != null ? typeof ref.ref === "function" ? ref.ref() : void 0 : void 0;
      });

      this._queues.on("zero", () => {
        var ref;
        return (ref = this._store.heartbeat) != null ? typeof ref.unref === "function" ? ref.unref() : void 0 : void 0;
      });
    }

    _validateOptions(options, invalid) {
      if (!(options != null && typeof options === "object" && invalid.length === 0)) {
        throw new Bottleneck.prototype.BottleneckError("Bottleneck v2 takes a single object argument. Refer to https://github.com/SGrondin/bottleneck#upgrading-to-v2 if you're upgrading from Bottleneck v1.");
      }
    }

    ready() {
      return this._store.ready;
    }

    clients() {
      return this._store.clients;
    }

    channel() {
      return `b_${this.id}`;
    }

    channel_client() {
      return `b_${this.id}_${this._store.clientId}`;
    }

    publish(message) {
      return this._store.__publish__(message);
    }

    disconnect(flush = true) {
      return this._store.__disconnect__(flush);
    }

    chain(_limiter) {
      this._limiter = _limiter;
      return this;
    }

    queued(priority) {
      return this._queues.queued(priority);
    }

    clusterQueued() {
      return this._store.__queued__();
    }

    empty() {
      return this.queued() === 0 && this._submitLock.isEmpty();
    }

    running() {
      return this._store.__running__();
    }

    done() {
      return this._store.__done__();
    }

    jobStatus(id) {
      return this._states.jobStatus(id);
    }

    jobs(status) {
      return this._states.statusJobs(status);
    }

    counts() {
      return this._states.statusCounts();
    }

    _randomIndex() {
      return Math.random().toString(36).slice(2);
    }

    check(weight = 1) {
      return this._store.__check__(weight);
    }

    _clearGlobalState(index) {
      if (this._scheduled[index] != null) {
        clearTimeout(this._scheduled[index].expiration);
        delete this._scheduled[index];
        return true;
      } else {
        return false;
      }
    }

    _free(index, job, options, eventInfo) {
      var _this = this;

      return _asyncToGenerator(function* () {
        var e, running;

        try {
          var _ref = yield _this._store.__free__(index, options.weight);

          running = _ref.running;

          _this.Events.trigger("debug", `Freed ${options.id}`, eventInfo);

          if (running === 0 && _this.empty()) {
            return _this.Events.trigger("idle");
          }
        } catch (error1) {
          e = error1;
          return _this.Events.trigger("error", e);
        }
      })();
    }

    _run(index, job, wait) {
      var clearGlobalState, free, run;
      job.doRun();
      clearGlobalState = this._clearGlobalState.bind(this, index);
      run = this._run.bind(this, index, job);
      free = this._free.bind(this, index, job);
      return this._scheduled[index] = {
        timeout: setTimeout(() => {
          return job.doExecute(this._limiter, clearGlobalState, run, free);
        }, wait),
        expiration: job.options.expiration != null ? setTimeout(function () {
          return job.doExpire(clearGlobalState, run, free);
        }, wait + job.options.expiration) : void 0,
        job: job
      };
    }

    _drainOne(capacity) {
      return this._registerLock.schedule(() => {
        var args, index, next, options, queue;

        if (this.queued() === 0) {
          return this.Promise.resolve(null);
        }

        queue = this._queues.getFirst();

        var _next2 = next = queue.first();

        options = _next2.options;
        args = _next2.args;

        if (capacity != null && options.weight > capacity) {
          return this.Promise.resolve(null);
        }

        this.Events.trigger("debug", `Draining ${options.id}`, {
          args,
          options
        });
        index = this._randomIndex();
        return this._store.__register__(index, options.weight, options.expiration).then(({
          success,
          wait,
          reservoir
        }) => {
          var empty;
          this.Events.trigger("debug", `Drained ${options.id}`, {
            success,
            args,
            options
          });

          if (success) {
            queue.shift();
            empty = this.empty();

            if (empty) {
              this.Events.trigger("empty");
            }

            if (reservoir === 0) {
              this.Events.trigger("depleted", empty);
            }

            this._run(index, next, wait);

            return this.Promise.resolve(options.weight);
          } else {
            return this.Promise.resolve(null);
          }
        });
      });
    }

    _drainAll(capacity, total = 0) {
      return this._drainOne(capacity).then(drained => {
        var newCapacity;

        if (drained != null) {
          newCapacity = capacity != null ? capacity - drained : capacity;
          return this._drainAll(newCapacity, total + drained);
        } else {
          return this.Promise.resolve(total);
        }
      }).catch(e => {
        return this.Events.trigger("error", e);
      });
    }

    _dropAllQueued(message) {
      return this._queues.shiftAll(function (job) {
        return job.doDrop({
          message
        });
      });
    }

    stop(options = {}) {
      var done, waitForExecuting;
      options = parser.load(options, this.stopDefaults);

      waitForExecuting = at => {
        var finished;

        finished = () => {
          var counts;
          counts = this._states.counts;
          return counts[0] + counts[1] + counts[2] + counts[3] === at;
        };

        return new this.Promise((resolve, reject) => {
          if (finished()) {
            return resolve();
          } else {
            return this.on("done", () => {
              if (finished()) {
                this.removeAllListeners("done");
                return resolve();
              }
            });
          }
        });
      };

      done = options.dropWaitingJobs ? (this._run = function (index, next) {
        return next.doDrop({
          message: options.dropErrorMessage
        });
      }, this._drainOne = () => {
        return this.Promise.resolve(null);
      }, this._registerLock.schedule(() => {
        return this._submitLock.schedule(() => {
          var k, ref, v;
          ref = this._scheduled;

          for (k in ref) {
            v = ref[k];

            if (this.jobStatus(v.job.options.id) === "RUNNING") {
              clearTimeout(v.timeout);
              clearTimeout(v.expiration);
              v.job.doDrop({
                message: options.dropErrorMessage
              });
            }
          }

          this._dropAllQueued(options.dropErrorMessage);

          return waitForExecuting(0);
        });
      })) : this.schedule({
        priority: NUM_PRIORITIES - 1,
        weight: 0
      }, () => {
        return waitForExecuting(1);
      });

      this._receive = function (job) {
        return job._reject(new Bottleneck.prototype.BottleneckError(options.enqueueErrorMessage));
      };

      this.stop = () => {
        return this.Promise.reject(new Bottleneck.prototype.BottleneckError("stop() has already been called"));
      };

      return done;
    }

    _addToQueue(job) {
      var _this2 = this;

      return _asyncToGenerator(function* () {
        var args, blocked, error, options, reachedHWM, shifted, strategy;
        args = job.args;
        options = job.options;

        try {
          var _ref2 = yield _this2._store.__submit__(_this2.queued(), options.weight);

          reachedHWM = _ref2.reachedHWM;
          blocked = _ref2.blocked;
          strategy = _ref2.strategy;
        } catch (error1) {
          error = error1;

          _this2.Events.trigger("debug", `Could not queue ${options.id}`, {
            args,
            options,
            error
          });

          job.doDrop({
            error
          });
          return false;
        }

        if (blocked) {
          job.doDrop();
          return true;
        } else if (reachedHWM) {
          shifted = strategy === Bottleneck.prototype.strategy.LEAK ? _this2._queues.shiftLastFrom(options.priority) : strategy === Bottleneck.prototype.strategy.OVERFLOW_PRIORITY ? _this2._queues.shiftLastFrom(options.priority + 1) : strategy === Bottleneck.prototype.strategy.OVERFLOW ? job : void 0;

          if (shifted != null) {
            shifted.doDrop();
          }

          if (shifted == null || strategy === Bottleneck.prototype.strategy.OVERFLOW) {
            if (shifted == null) {
              job.doDrop();
            }

            return reachedHWM;
          }
        }

        job.doQueue(reachedHWM, blocked);

        _this2._queues.push(job);

        yield _this2._drainAll();
        return reachedHWM;
      })();
    }

    _receive(job) {
      if (this._states.jobStatus(job.options.id) != null) {
        job._reject(new Bottleneck.prototype.BottleneckError(`A job with the same id already exists (id=${job.options.id})`));

        return false;
      } else {
        job.doReceive();
        return this._submitLock.schedule(this._addToQueue, job);
      }
    }

    submit(...args) {
      var cb, fn, job, options, ref, ref1, task;

      if (typeof args[0] === "function") {
        var _ref3, _ref4, _splice$call, _splice$call2;

        ref = args, (_ref3 = ref, _ref4 = _toArray(_ref3), fn = _ref4[0], args = _ref4.slice(1), _ref3), (_splice$call = splice.call(args, -1), _splice$call2 = _slicedToArray(_splice$call, 1), cb = _splice$call2[0], _splice$call);
        options = parser.load({}, this.jobDefaults);
      } else {
        var _ref5, _ref6, _splice$call3, _splice$call4;

        ref1 = args, (_ref5 = ref1, _ref6 = _toArray(_ref5), options = _ref6[0], fn = _ref6[1], args = _ref6.slice(2), _ref5), (_splice$call3 = splice.call(args, -1), _splice$call4 = _slicedToArray(_splice$call3, 1), cb = _splice$call4[0], _splice$call3);
        options = parser.load(options, this.jobDefaults);
      }

      task = (...args) => {
        return new this.Promise(function (resolve, reject) {
          return fn(...args, function (...args) {
            return (args[0] != null ? reject : resolve)(args);
          });
        });
      };

      job = new Job(task, args, options, this.jobDefaults, this.rejectOnDrop, this.Events, this._states, this.Promise);
      job.promise.then(function (args) {
        return typeof cb === "function" ? cb(...args) : void 0;
      }).catch(function (args) {
        if (Array.isArray(args)) {
          return typeof cb === "function" ? cb(...args) : void 0;
        } else {
          return typeof cb === "function" ? cb(args) : void 0;
        }
      });
      return this._receive(job);
    }

    schedule(...args) {
      var job, options, task;

      if (typeof args[0] === "function") {
        var _args = args;

        var _args2 = _toArray(_args);

        task = _args2[0];
        args = _args2.slice(1);
        options = {};
      } else {
        var _args3 = args;

        var _args4 = _toArray(_args3);

        options = _args4[0];
        task = _args4[1];
        args = _args4.slice(2);
      }

      job = new Job(task, args, options, this.jobDefaults, this.rejectOnDrop, this.Events, this._states, this.Promise);

      this._receive(job);

      return job.promise;
    }

    wrap(fn) {
      var schedule, wrapped;
      schedule = this.schedule.bind(this);

      wrapped = function wrapped(...args) {
        return schedule(fn.bind(this), ...args);
      };

      wrapped.withOptions = function (options, ...args) {
        return schedule(options, fn, ...args);
      };

      return wrapped;
    }

    updateSettings(options = {}) {
      var _this3 = this;

      return _asyncToGenerator(function* () {
        yield _this3._store.__updateSettings__(parser.overwrite(options, _this3.storeDefaults));
        parser.overwrite(options, _this3.instanceDefaults, _this3);
        return _this3;
      })();
    }

    currentReservoir() {
      return this._store.__currentReservoir__();
    }

    incrementReservoir(incr = 0) {
      return this._store.__incrementReservoir__(incr);
    }

  }

  ;
  Bottleneck.default = Bottleneck;
  Bottleneck.Events = Events;
  Bottleneck.version = Bottleneck.prototype.version = require("./version.json").version;
  Bottleneck.strategy = Bottleneck.prototype.strategy = {
    LEAK: 1,
    OVERFLOW: 2,
    OVERFLOW_PRIORITY: 4,
    BLOCK: 3
  };
  Bottleneck.BottleneckError = Bottleneck.prototype.BottleneckError = require("./BottleneckError");
  Bottleneck.Group = Bottleneck.prototype.Group = require("./Group");
  Bottleneck.RedisConnection = Bottleneck.prototype.RedisConnection = require("./RedisConnection");
  Bottleneck.IORedisConnection = Bottleneck.prototype.IORedisConnection = require("./IORedisConnection");
  Bottleneck.Batcher = Bottleneck.prototype.Batcher = require("./Batcher");
  Bottleneck.prototype.jobDefaults = {
    priority: DEFAULT_PRIORITY,
    weight: 1,
    expiration: null,
    id: "<no-id>"
  };
  Bottleneck.prototype.storeDefaults = {
    maxConcurrent: null,
    minTime: 0,
    highWater: null,
    strategy: Bottleneck.prototype.strategy.LEAK,
    penalty: null,
    reservoir: null,
    reservoirRefreshInterval: null,
    reservoirRefreshAmount: null,
    reservoirIncreaseInterval: null,
    reservoirIncreaseAmount: null,
    reservoirIncreaseMaximum: null
  };
  Bottleneck.prototype.localStoreDefaults = {
    Promise: Promise,
    timeout: null,
    heartbeatInterval: 250
  };
  Bottleneck.prototype.redisStoreDefaults = {
    Promise: Promise,
    timeout: null,
    heartbeatInterval: 5000,
    clientTimeout: 10000,
    Redis: null,
    clientOptions: {},
    clusterNodes: null,
    clearDatastore: false,
    connection: null
  };
  Bottleneck.prototype.instanceDefaults = {
    datastore: "local",
    connection: null,
    id: "<no-id>",
    rejectOnDrop: true,
    trackDoneStatus: false,
    Promise: Promise
  };
  Bottleneck.prototype.stopDefaults = {
    enqueueErrorMessage: "This limiter has been stopped and cannot accept new jobs.",
    dropWaitingJobs: true,
    dropErrorMessage: "This limiter has been stopped."
  };
  return Bottleneck;
}.call(void 0);

module.exports = Bottleneck;"use strict";

var BottleneckError;
BottleneckError = class BottleneckError extends Error {};
module.exports = BottleneckError;"use strict";

var DLList;
DLList = class DLList {
  constructor(incr, decr) {
    this.incr = incr;
    this.decr = decr;
    this._first = null;
    this._last = null;
    this.length = 0;
  }

  push(value) {
    var node;
    this.length++;

    if (typeof this.incr === "function") {
      this.incr();
    }

    node = {
      value,
      prev: this._last,
      next: null
    };

    if (this._last != null) {
      this._last.next = node;
      this._last = node;
    } else {
      this._first = this._last = node;
    }

    return void 0;
  }

  shift() {
    var value;

    if (this._first == null) {
      return;
    } else {
      this.length--;

      if (typeof this.decr === "function") {
        this.decr();
      }
    }

    value = this._first.value;

    if ((this._first = this._first.next) != null) {
      this._first.prev = null;
    } else {
      this._last = null;
    }

    return value;
  }

  first() {
    if (this._first != null) {
      return this._first.value;
    }
  }

  getArray() {
    var node, ref, results;
    node = this._first;
    results = [];

    while (node != null) {
      results.push((ref = node, node = node.next, ref.value));
    }

    return results;
  }

  forEachShift(cb) {
    var node;
    node = this.shift();

    while (node != null) {
      cb(node), node = this.shift();
    }

    return void 0;
  }

  debug() {
    var node, ref, ref1, ref2, results;
    node = this._first;
    results = [];

    while (node != null) {
      results.push((ref = node, node = node.next, {
        value: ref.value,
        prev: (ref1 = ref.prev) != null ? ref1.value : void 0,
        next: (ref2 = ref.next) != null ? ref2.value : void 0
      }));
    }

    return results;
  }

};
module.exports = DLList;"use strict";

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

var Events;
Events = class Events {
  constructor(instance) {
    this.instance = instance;
    this._events = {};

    if (this.instance.on != null || this.instance.once != null || this.instance.removeAllListeners != null) {
      throw new Error("An Emitter already exists for this object");
    }

    this.instance.on = (name, cb) => {
      return this._addListener(name, "many", cb);
    };

    this.instance.once = (name, cb) => {
      return this._addListener(name, "once", cb);
    };

    this.instance.removeAllListeners = (name = null) => {
      if (name != null) {
        return delete this._events[name];
      } else {
        return this._events = {};
      }
    };
  }

  _addListener(name, status, cb) {
    var base;

    if ((base = this._events)[name] == null) {
      base[name] = [];
    }

    this._events[name].push({
      cb,
      status
    });

    return this.instance;
  }

  listenerCount(name) {
    if (this._events[name] != null) {
      return this._events[name].length;
    } else {
      return 0;
    }
  }

  trigger(name, ...args) {
    var _this = this;

    return _asyncToGenerator(function* () {
      var e, promises;

      try {
        if (name !== "debug") {
          _this.trigger("debug", `Event triggered: ${name}`, args);
        }

        if (_this._events[name] == null) {
          return;
        }

        _this._events[name] = _this._events[name].filter(function (listener) {
          return listener.status !== "none";
        });
        promises = _this._events[name].map(
        /*#__PURE__*/
        function () {
          var _ref = _asyncToGenerator(function* (listener) {
            var e, returned;

            if (listener.status === "none") {
              return;
            }

            if (listener.status === "once") {
              listener.status = "none";
            }

            try {
              returned = typeof listener.cb === "function" ? listener.cb(...args) : void 0;

              if (typeof (returned != null ? returned.then : void 0) === "function") {
                return yield returned;
              } else {
                return returned;
              }
            } catch (error) {
              e = error;

              if ("name" !== "error") {
                _this.trigger("error", e);
              }

              return null;
            }
          });

          return function (_x) {
            return _ref.apply(this, arguments);
          };
        }());
        return (yield Promise.all(promises)).find(function (x) {
          return x != null;
        });
      } catch (error) {
        e = error;

        if ("name" !== "error") {
          _this.trigger("error", e);
        }

        return null;
      }
    })();
  }

};
module.exports = Events;"use strict";

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }

function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

var Events, Group, IORedisConnection, RedisConnection, Scripts, parser;
parser = require("./parser");
Events = require("./Events");
RedisConnection = require("./RedisConnection");
IORedisConnection = require("./IORedisConnection");
Scripts = require("./Scripts");

Group = function () {
  class Group {
    constructor(limiterOptions = {}) {
      this.deleteKey = this.deleteKey.bind(this);
      this.limiterOptions = limiterOptions;
      parser.load(this.limiterOptions, this.defaults, this);
      this.Events = new Events(this);
      this.instances = {};
      this.Bottleneck = require("./Bottleneck");

      this._startAutoCleanup();

      this.sharedConnection = this.connection != null;

      if (this.connection == null) {
        if (this.limiterOptions.datastore === "redis") {
          this.connection = new RedisConnection(Object.assign({}, this.limiterOptions, {
            Events: this.Events
          }));
        } else if (this.limiterOptions.datastore === "ioredis") {
          this.connection = new IORedisConnection(Object.assign({}, this.limiterOptions, {
            Events: this.Events
          }));
        }
      }
    }

    key(key = "") {
      var ref;
      return (ref = this.instances[key]) != null ? ref : (() => {
        var limiter;
        limiter = this.instances[key] = new this.Bottleneck(Object.assign(this.limiterOptions, {
          id: `${this.id}-${key}`,
          timeout: this.timeout,
          connection: this.connection
        }));
        this.Events.trigger("created", limiter, key);
        return limiter;
      })();
    }

    deleteKey(key = "") {
      var _this = this;

      return _asyncToGenerator(function* () {
        var deleted, instance;
        instance = _this.instances[key];

        if (_this.connection) {
          deleted = yield _this.connection.__runCommand__(['del', ...Scripts.allKeys(`${_this.id}-${key}`)]);
        }

        if (instance != null) {
          delete _this.instances[key];
          yield instance.disconnect();
        }

        return instance != null || deleted > 0;
      })();
    }

    limiters() {
      var k, ref, results, v;
      ref = this.instances;
      results = [];

      for (k in ref) {
        v = ref[k];
        results.push({
          key: k,
          limiter: v
        });
      }

      return results;
    }

    keys() {
      return Object.keys(this.instances);
    }

    clusterKeys() {
      var _this2 = this;

      return _asyncToGenerator(function* () {
        var cursor, end, found, i, k, keys, len, next, start;

        if (_this2.connection == null) {
          return _this2.Promise.resolve(_this2.keys());
        }

        keys = [];
        cursor = null;
        start = `b_${_this2.id}-`.length;
        end = "_settings".length;

        while (cursor !== 0) {
          var _ref = yield _this2.connection.__runCommand__(["scan", cursor != null ? cursor : 0, "match", `b_${_this2.id}-*_settings`, "count", 10000]);

          var _ref2 = _slicedToArray(_ref, 2);

          next = _ref2[0];
          found = _ref2[1];
          cursor = ~~next;

          for (i = 0, len = found.length; i < len; i++) {
            k = found[i];
            keys.push(k.slice(start, -end));
          }
        }

        return keys;
      })();
    }

    _startAutoCleanup() {
      var _this3 = this;

      var base;
      clearInterval(this.interval);
      return typeof (base = this.interval = setInterval(
      /*#__PURE__*/
      _asyncToGenerator(function* () {
        var e, k, ref, results, time, v;
        time = Date.now();
        ref = _this3.instances;
        results = [];

        for (k in ref) {
          v = ref[k];

          try {
            if (yield v._store.__groupCheck__(time)) {
              results.push(_this3.deleteKey(k));
            } else {
              results.push(void 0);
            }
          } catch (error) {
            e = error;
            results.push(v.Events.trigger("error", e));
          }
        }

        return results;
      }), this.timeout / 2)).unref === "function" ? base.unref() : void 0;
    }

    updateSettings(options = {}) {
      parser.overwrite(options, this.defaults, this);
      parser.overwrite(options, options, this.limiterOptions);

      if (options.timeout != null) {
        return this._startAutoCleanup();
      }
    }

    disconnect(flush = true) {
      var ref;

      if (!this.sharedConnection) {
        return (ref = this.connection) != null ? ref.disconnect(flush) : void 0;
      }
    }

  }

  ;
  Group.prototype.defaults = {
    timeout: 1000 * 60 * 5,
    connection: null,
    Promise: Promise,
    id: "group-key"
  };
  return Group;
}.call(void 0);

module.exports = Group;"use strict";

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }

function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

var Events, IORedisConnection, Scripts, parser;
parser = require("./parser");
Events = require("./Events");
Scripts = require("./Scripts");

IORedisConnection = function () {
  class IORedisConnection {
    constructor(options = {}) {
      parser.load(options, this.defaults, this);

      if (this.Redis == null) {
        this.Redis = eval("require")("ioredis"); // Obfuscated or else Webpack/Angular will try to inline the optional ioredis module. To override this behavior: pass the ioredis module to Bottleneck as the 'Redis' option.
      }

      if (this.Events == null) {
        this.Events = new Events(this);
      }

      this.terminated = false;

      if (this.clusterNodes != null) {
        this.client = new this.Redis.Cluster(this.clusterNodes, this.clientOptions);
        this.subscriber = new this.Redis.Cluster(this.clusterNodes, this.clientOptions);
      } else if (this.client != null && this.client.duplicate == null) {
        this.subscriber = new this.Redis.Cluster(this.client.startupNodes, this.client.options);
      } else {
        if (this.client == null) {
          this.client = new this.Redis(this.clientOptions);
        }

        this.subscriber = this.client.duplicate();
      }

      this.limiters = {};
      this.ready = this.Promise.all([this._setup(this.client, false), this._setup(this.subscriber, true)]).then(() => {
        this._loadScripts();

        return {
          client: this.client,
          subscriber: this.subscriber
        };
      });
    }

    _setup(client, sub) {
      client.setMaxListeners(0);
      return new this.Promise((resolve, reject) => {
        client.on("error", e => {
          return this.Events.trigger("error", e);
        });

        if (sub) {
          client.on("message", (channel, message) => {
            var ref;
            return (ref = this.limiters[channel]) != null ? ref._store.onMessage(channel, message) : void 0;
          });
        }

        if (client.status === "ready") {
          return resolve();
        } else {
          return client.once("ready", resolve);
        }
      });
    }

    _loadScripts() {
      return Scripts.names.forEach(name => {
        return this.client.defineCommand(name, {
          lua: Scripts.payload(name)
        });
      });
    }

    __runCommand__(cmd) {
      var _this = this;

      return _asyncToGenerator(function* () {
        var _, deleted;

        yield _this.ready;

        var _ref = yield _this.client.pipeline([cmd]).exec();

        var _ref2 = _slicedToArray(_ref, 1);

        var _ref2$ = _slicedToArray(_ref2[0], 2);

        _ = _ref2$[0];
        deleted = _ref2$[1];
        return deleted;
      })();
    }

    __addLimiter__(instance) {
      return this.Promise.all([instance.channel(), instance.channel_client()].map(channel => {
        return new this.Promise((resolve, reject) => {
          return this.subscriber.subscribe(channel, () => {
            this.limiters[channel] = instance;
            return resolve();
          });
        });
      }));
    }

    __removeLimiter__(instance) {
      var _this2 = this;

      return [instance.channel(), instance.channel_client()].forEach(
      /*#__PURE__*/
      function () {
        var _ref3 = _asyncToGenerator(function* (channel) {
          if (!_this2.terminated) {
            yield _this2.subscriber.unsubscribe(channel);
          }

          return delete _this2.limiters[channel];
        });

        return function (_x) {
          return _ref3.apply(this, arguments);
        };
      }());
    }

    __scriptArgs__(name, id, args, cb) {
      var keys;
      keys = Scripts.keys(name, id);
      return [keys.length].concat(keys, args, cb);
    }

    __scriptFn__(name) {
      return this.client[name].bind(this.client);
    }

    disconnect(flush = true) {
      var i, k, len, ref;
      ref = Object.keys(this.limiters);

      for (i = 0, len = ref.length; i < len; i++) {
        k = ref[i];
        clearInterval(this.limiters[k]._store.heartbeat);
      }

      this.limiters = {};
      this.terminated = true;

      if (flush) {
        return this.Promise.all([this.client.quit(), this.subscriber.quit()]);
      } else {
        this.client.disconnect();
        this.subscriber.disconnect();
        return this.Promise.resolve();
      }
    }

  }

  ;
  IORedisConnection.prototype.datastore = "ioredis";
  IORedisConnection.prototype.defaults = {
    Redis: null,
    clientOptions: {},
    clusterNodes: null,
    client: null,
    Promise: Promise,
    Events: null
  };
  return IORedisConnection;
}.call(void 0);

module.exports = IORedisConnection;"use strict";

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

var BottleneckError, DEFAULT_PRIORITY, Job, NUM_PRIORITIES, parser;
NUM_PRIORITIES = 10;
DEFAULT_PRIORITY = 5;
parser = require("./parser");
BottleneckError = require("./BottleneckError");
Job = class Job {
  constructor(task, args, options, jobDefaults, rejectOnDrop, Events, _states, Promise) {
    this.task = task;
    this.args = args;
    this.rejectOnDrop = rejectOnDrop;
    this.Events = Events;
    this._states = _states;
    this.Promise = Promise;
    this.options = parser.load(options, jobDefaults);
    this.options.priority = this._sanitizePriority(this.options.priority);

    if (this.options.id === jobDefaults.id) {
      this.options.id = `${this.options.id}-${this._randomIndex()}`;
    }

    this.promise = new this.Promise((_resolve, _reject) => {
      this._resolve = _resolve;
      this._reject = _reject;
    });
    this.retryCount = 0;
  }

  _sanitizePriority(priority) {
    var sProperty;
    sProperty = ~~priority !== priority ? DEFAULT_PRIORITY : priority;

    if (sProperty < 0) {
      return 0;
    } else if (sProperty > NUM_PRIORITIES - 1) {
      return NUM_PRIORITIES - 1;
    } else {
      return sProperty;
    }
  }

  _randomIndex() {
    return Math.random().toString(36).slice(2);
  }

  doDrop({
    error,
    message = "This job has been dropped by Bottleneck"
  } = {}) {
    if (this._states.remove(this.options.id)) {
      if (this.rejectOnDrop) {
        this._reject(error != null ? error : new BottleneckError(message));
      }

      this.Events.trigger("dropped", {
        args: this.args,
        options: this.options,
        task: this.task,
        promise: this.promise
      });
      return true;
    } else {
      return false;
    }
  }

  _assertStatus(expected) {
    var status;
    status = this._states.jobStatus(this.options.id);

    if (!(status === expected || expected === "DONE" && status === null)) {
      throw new BottleneckError(`Invalid job status ${status}, expected ${expected}. Please open an issue at https://github.com/SGrondin/bottleneck/issues`);
    }
  }

  doReceive() {
    this._states.start(this.options.id);

    return this.Events.trigger("received", {
      args: this.args,
      options: this.options
    });
  }

  doQueue(reachedHWM, blocked) {
    this._assertStatus("RECEIVED");

    this._states.next(this.options.id);

    return this.Events.trigger("queued", {
      args: this.args,
      options: this.options,
      reachedHWM,
      blocked
    });
  }

  doRun() {
    if (this.retryCount === 0) {
      this._assertStatus("QUEUED");

      this._states.next(this.options.id);
    } else {
      this._assertStatus("EXECUTING");
    }

    return this.Events.trigger("scheduled", {
      args: this.args,
      options: this.options
    });
  }

  doExecute(chained, clearGlobalState, run, free) {
    var _this = this;

    return _asyncToGenerator(function* () {
      var error, eventInfo, passed;

      if (_this.retryCount === 0) {
        _this._assertStatus("RUNNING");

        _this._states.next(_this.options.id);
      } else {
        _this._assertStatus("EXECUTING");
      }

      eventInfo = {
        args: _this.args,
        options: _this.options,
        retryCount: _this.retryCount
      };

      _this.Events.trigger("executing", eventInfo);

      try {
        passed = yield chained != null ? chained.schedule(_this.options, _this.task, ..._this.args) : _this.task(..._this.args);

        if (clearGlobalState()) {
          _this.doDone(eventInfo);

          yield free(_this.options, eventInfo);

          _this._assertStatus("DONE");

          return _this._resolve(passed);
        }
      } catch (error1) {
        error = error1;
        return _this._onFailure(error, eventInfo, clearGlobalState, run, free);
      }
    })();
  }

  doExpire(clearGlobalState, run, free) {
    var error, eventInfo;

    if (this._states.jobStatus(this.options.id === "RUNNING")) {
      this._states.next(this.options.id);
    }

    this._assertStatus("EXECUTING");

    eventInfo = {
      args: this.args,
      options: this.options,
      retryCount: this.retryCount
    };
    error = new BottleneckError(`This job timed out after ${this.options.expiration} ms.`);
    return this._onFailure(error, eventInfo, clearGlobalState, run, free);
  }

  _onFailure(error, eventInfo, clearGlobalState, run, free) {
    var _this2 = this;

    return _asyncToGenerator(function* () {
      var retry, retryAfter;

      if (clearGlobalState()) {
        retry = yield _this2.Events.trigger("failed", error, eventInfo);

        if (retry != null) {
          retryAfter = ~~retry;

          _this2.Events.trigger("retry", `Retrying ${_this2.options.id} after ${retryAfter} ms`, eventInfo);

          _this2.retryCount++;
          return run(retryAfter);
        } else {
          _this2.doDone(eventInfo);

          yield free(_this2.options, eventInfo);

          _this2._assertStatus("DONE");

          return _this2._reject(error);
        }
      }
    })();
  }

  doDone(eventInfo) {
    this._assertStatus("EXECUTING");

    this._states.next(this.options.id);

    return this.Events.trigger("done", eventInfo);
  }

};
module.exports = Job;"use strict";

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

var BottleneckError, LocalDatastore, parser;
parser = require("./parser");
BottleneckError = require("./BottleneckError");
LocalDatastore = class LocalDatastore {
  constructor(instance, storeOptions, storeInstanceOptions) {
    this.instance = instance;
    this.storeOptions = storeOptions;
    this.clientId = this.instance._randomIndex();
    parser.load(storeInstanceOptions, storeInstanceOptions, this);
    this._nextRequest = this._lastReservoirRefresh = this._lastReservoirIncrease = Date.now();
    this._running = 0;
    this._done = 0;
    this._unblockTime = 0;
    this.ready = this.Promise.resolve();
    this.clients = {};

    this._startHeartbeat();
  }

  _startHeartbeat() {
    var base;

    if (this.heartbeat == null && (this.storeOptions.reservoirRefreshInterval != null && this.storeOptions.reservoirRefreshAmount != null || this.storeOptions.reservoirIncreaseInterval != null && this.storeOptions.reservoirIncreaseAmount != null)) {
      return typeof (base = this.heartbeat = setInterval(() => {
        var amount, incr, maximum, now, reservoir;
        now = Date.now();

        if (this.storeOptions.reservoirRefreshInterval != null && now >= this._lastReservoirRefresh + this.storeOptions.reservoirRefreshInterval) {
          this._lastReservoirRefresh = now;
          this.storeOptions.reservoir = this.storeOptions.reservoirRefreshAmount;

          this.instance._drainAll(this.computeCapacity());
        }

        if (this.storeOptions.reservoirIncreaseInterval != null && now >= this._lastReservoirIncrease + this.storeOptions.reservoirIncreaseInterval) {
          var _this$storeOptions = this.storeOptions;
          amount = _this$storeOptions.reservoirIncreaseAmount;
          maximum = _this$storeOptions.reservoirIncreaseMaximum;
          reservoir = _this$storeOptions.reservoir;
          this._lastReservoirIncrease = now;
          incr = maximum != null ? Math.min(amount, maximum - reservoir) : amount;

          if (incr > 0) {
            this.storeOptions.reservoir += incr;
            return this.instance._drainAll(this.computeCapacity());
          }
        }
      }, this.heartbeatInterval)).unref === "function" ? base.unref() : void 0;
    } else {
      return clearInterval(this.heartbeat);
    }
  }

  __publish__(message) {
    var _this = this;

    return _asyncToGenerator(function* () {
      yield _this.yieldLoop();
      return _this.instance.Events.trigger("message", message.toString());
    })();
  }

  __disconnect__(flush) {
    var _this2 = this;

    return _asyncToGenerator(function* () {
      yield _this2.yieldLoop();
      clearInterval(_this2.heartbeat);
      return _this2.Promise.resolve();
    })();
  }

  yieldLoop(t = 0) {
    return new this.Promise(function (resolve, reject) {
      return setTimeout(resolve, t);
    });
  }

  computePenalty() {
    var ref;
    return (ref = this.storeOptions.penalty) != null ? ref : 15 * this.storeOptions.minTime || 5000;
  }

  __updateSettings__(options) {
    var _this3 = this;

    return _asyncToGenerator(function* () {
      yield _this3.yieldLoop();
      parser.overwrite(options, options, _this3.storeOptions);

      _this3._startHeartbeat();

      _this3.instance._drainAll(_this3.computeCapacity());

      return true;
    })();
  }

  __running__() {
    var _this4 = this;

    return _asyncToGenerator(function* () {
      yield _this4.yieldLoop();
      return _this4._running;
    })();
  }

  __queued__() {
    var _this5 = this;

    return _asyncToGenerator(function* () {
      yield _this5.yieldLoop();
      return _this5.instance.queued();
    })();
  }

  __done__() {
    var _this6 = this;

    return _asyncToGenerator(function* () {
      yield _this6.yieldLoop();
      return _this6._done;
    })();
  }

  __groupCheck__(time) {
    var _this7 = this;

    return _asyncToGenerator(function* () {
      yield _this7.yieldLoop();
      return _this7._nextRequest + _this7.timeout < time;
    })();
  }

  computeCapacity() {
    var maxConcurrent, reservoir;
    var _this$storeOptions2 = this.storeOptions;
    maxConcurrent = _this$storeOptions2.maxConcurrent;
    reservoir = _this$storeOptions2.reservoir;

    if (maxConcurrent != null && reservoir != null) {
      return Math.min(maxConcurrent - this._running, reservoir);
    } else if (maxConcurrent != null) {
      return maxConcurrent - this._running;
    } else if (reservoir != null) {
      return reservoir;
    } else {
      return null;
    }
  }

  conditionsCheck(weight) {
    var capacity;
    capacity = this.computeCapacity();
    return capacity == null || weight <= capacity;
  }

  __incrementReservoir__(incr) {
    var _this8 = this;

    return _asyncToGenerator(function* () {
      var reservoir;
      yield _this8.yieldLoop();
      reservoir = _this8.storeOptions.reservoir += incr;

      _this8.instance._drainAll(_this8.computeCapacity());

      return reservoir;
    })();
  }

  __currentReservoir__() {
    var _this9 = this;

    return _asyncToGenerator(function* () {
      yield _this9.yieldLoop();
      return _this9.storeOptions.reservoir;
    })();
  }

  isBlocked(now) {
    return this._unblockTime >= now;
  }

  check(weight, now) {
    return this.conditionsCheck(weight) && this._nextRequest - now <= 0;
  }

  __check__(weight) {
    var _this10 = this;

    return _asyncToGenerator(function* () {
      var now;
      yield _this10.yieldLoop();
      now = Date.now();
      return _this10.check(weight, now);
    })();
  }

  __register__(index, weight, expiration) {
    var _this11 = this;

    return _asyncToGenerator(function* () {
      var now, wait;
      yield _this11.yieldLoop();
      now = Date.now();

      if (_this11.conditionsCheck(weight)) {
        _this11._running += weight;

        if (_this11.storeOptions.reservoir != null) {
          _this11.storeOptions.reservoir -= weight;
        }

        wait = Math.max(_this11._nextRequest - now, 0);
        _this11._nextRequest = now + wait + _this11.storeOptions.minTime;
        return {
          success: true,
          wait,
          reservoir: _this11.storeOptions.reservoir
        };
      } else {
        return {
          success: false
        };
      }
    })();
  }

  strategyIsBlock() {
    return this.storeOptions.strategy === 3;
  }

  __submit__(queueLength, weight) {
    var _this12 = this;

    return _asyncToGenerator(function* () {
      var blocked, now, reachedHWM;
      yield _this12.yieldLoop();

      if (_this12.storeOptions.maxConcurrent != null && weight > _this12.storeOptions.maxConcurrent) {
        throw new BottleneckError(`Impossible to add a job having a weight of ${weight} to a limiter having a maxConcurrent setting of ${_this12.storeOptions.maxConcurrent}`);
      }

      now = Date.now();
      reachedHWM = _this12.storeOptions.highWater != null && queueLength === _this12.storeOptions.highWater && !_this12.check(weight, now);
      blocked = _this12.strategyIsBlock() && (reachedHWM || _this12.isBlocked(now));

      if (blocked) {
        _this12._unblockTime = now + _this12.computePenalty();
        _this12._nextRequest = _this12._unblockTime + _this12.storeOptions.minTime;

        _this12.instance._dropAllQueued();
      }

      return {
        reachedHWM,
        blocked,
        strategy: _this12.storeOptions.strategy
      };
    })();
  }

  __free__(index, weight) {
    var _this13 = this;

    return _asyncToGenerator(function* () {
      yield _this13.yieldLoop();
      _this13._running -= weight;
      _this13._done += weight;

      _this13.instance._drainAll(_this13.computeCapacity());

      return {
        running: _this13._running
      };
    })();
  }

};
module.exports = LocalDatastore;"use strict";

var DLList, Events, Queues;
DLList = require("./DLList");
Events = require("./Events");
Queues = class Queues {
  constructor(num_priorities) {
    var i;
    this.Events = new Events(this);
    this._length = 0;

    this._lists = function () {
      var j, ref, results;
      results = [];

      for (i = j = 1, ref = num_priorities; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {
        results.push(new DLList(() => {
          return this.incr();
        }, () => {
          return this.decr();
        }));
      }

      return results;
    }.call(this);
  }

  incr() {
    if (this._length++ === 0) {
      return this.Events.trigger("leftzero");
    }
  }

  decr() {
    if (--this._length === 0) {
      return this.Events.trigger("zero");
    }
  }

  push(job) {
    return this._lists[job.options.priority].push(job);
  }

  queued(priority) {
    if (priority != null) {
      return this._lists[priority].length;
    } else {
      return this._length;
    }
  }

  shiftAll(fn) {
    return this._lists.forEach(function (list) {
      return list.forEachShift(fn);
    });
  }

  getFirst(arr = this._lists) {
    var j, len, list;

    for (j = 0, len = arr.length; j < len; j++) {
      list = arr[j];

      if (list.length > 0) {
        return list;
      }
    }

    return [];
  }

  shiftLastFrom(priority) {
    return this.getFirst(this._lists.slice(priority).reverse()).shift();
  }

};
module.exports = Queues;"use strict";

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

var Events, RedisConnection, Scripts, parser;
parser = require("./parser");
Events = require("./Events");
Scripts = require("./Scripts");

RedisConnection = function () {
  class RedisConnection {
    constructor(options = {}) {
      parser.load(options, this.defaults, this);

      if (this.Redis == null) {
        this.Redis = eval("require")("redis"); // Obfuscated or else Webpack/Angular will try to inline the optional redis module. To override this behavior: pass the redis module to Bottleneck as the 'Redis' option.
      }

      if (this.Events == null) {
        this.Events = new Events(this);
      }

      this.terminated = false;

      if (this.client == null) {
        this.client = this.Redis.createClient(this.clientOptions);
      }

      this.subscriber = this.client.duplicate();
      this.limiters = {};
      this.shas = {};
      this.ready = this.Promise.all([this._setup(this.client, false), this._setup(this.subscriber, true)]).then(() => {
        return this._loadScripts();
      }).then(() => {
        return {
          client: this.client,
          subscriber: this.subscriber
        };
      });
    }

    _setup(client, sub) {
      client.setMaxListeners(0);
      return new this.Promise((resolve, reject) => {
        client.on("error", e => {
          return this.Events.trigger("error", e);
        });

        if (sub) {
          client.on("message", (channel, message) => {
            var ref;
            return (ref = this.limiters[channel]) != null ? ref._store.onMessage(channel, message) : void 0;
          });
        }

        if (client.ready) {
          return resolve();
        } else {
          return client.once("ready", resolve);
        }
      });
    }

    _loadScript(name) {
      return new this.Promise((resolve, reject) => {
        var payload;
        payload = Scripts.payload(name);
        return this.client.multi([["script", "load", payload]]).exec((err, replies) => {
          if (err != null) {
            return reject(err);
          }

          this.shas[name] = replies[0];
          return resolve(replies[0]);
        });
      });
    }

    _loadScripts() {
      return this.Promise.all(Scripts.names.map(k => {
        return this._loadScript(k);
      }));
    }

    __runCommand__(cmd) {
      var _this = this;

      return _asyncToGenerator(function* () {
        yield _this.ready;
        return new _this.Promise((resolve, reject) => {
          return _this.client.multi([cmd]).exec_atomic(function (err, replies) {
            if (err != null) {
              return reject(err);
            } else {
              return resolve(replies[0]);
            }
          });
        });
      })();
    }

    __addLimiter__(instance) {
      return this.Promise.all([instance.channel(), instance.channel_client()].map(channel => {
        return new this.Promise((resolve, reject) => {
          var handler;

          handler = chan => {
            if (chan === channel) {
              this.subscriber.removeListener("subscribe", handler);
              this.limiters[channel] = instance;
              return resolve();
            }
          };

          this.subscriber.on("subscribe", handler);
          return this.subscriber.subscribe(channel);
        });
      }));
    }

    __removeLimiter__(instance) {
      var _this2 = this;

      return this.Promise.all([instance.channel(), instance.channel_client()].map(
      /*#__PURE__*/
      function () {
        var _ref = _asyncToGenerator(function* (channel) {
          if (!_this2.terminated) {
            yield new _this2.Promise((resolve, reject) => {
              return _this2.subscriber.unsubscribe(channel, function (err, chan) {
                if (err != null) {
                  return reject(err);
                }

                if (chan === channel) {
                  return resolve();
                }
              });
            });
          }

          return delete _this2.limiters[channel];
        });

        return function (_x) {
          return _ref.apply(this, arguments);
        };
      }()));
    }

    __scriptArgs__(name, id, args, cb) {
      var keys;
      keys = Scripts.keys(name, id);
      return [this.shas[name], keys.length].concat(keys, args, cb);
    }

    __scriptFn__(name) {
      return this.client.evalsha.bind(this.client);
    }

    disconnect(flush = true) {
      var i, k, len, ref;
      ref = Object.keys(this.limiters);

      for (i = 0, len = ref.length; i < len; i++) {
        k = ref[i];
        clearInterval(this.limiters[k]._store.heartbeat);
      }

      this.limiters = {};
      this.terminated = true;
      this.client.end(flush);
      this.subscriber.end(flush);
      return this.Promise.resolve();
    }

  }

  ;
  RedisConnection.prototype.datastore = "redis";
  RedisConnection.prototype.defaults = {
    Redis: null,
    clientOptions: {},
    client: null,
    Promise: Promise,
    Events: null
  };
  return RedisConnection;
}.call(void 0);

module.exports = RedisConnection;"use strict";

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }

function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

var BottleneckError, IORedisConnection, RedisConnection, RedisDatastore, parser;
parser = require("./parser");
BottleneckError = require("./BottleneckError");
RedisConnection = require("./RedisConnection");
IORedisConnection = require("./IORedisConnection");
RedisDatastore = class RedisDatastore {
  constructor(instance, storeOptions, storeInstanceOptions) {
    this.instance = instance;
    this.storeOptions = storeOptions;
    this.originalId = this.instance.id;
    this.clientId = this.instance._randomIndex();
    parser.load(storeInstanceOptions, storeInstanceOptions, this);
    this.clients = {};
    this.capacityPriorityCounters = {};
    this.sharedConnection = this.connection != null;

    if (this.connection == null) {
      this.connection = this.instance.datastore === "redis" ? new RedisConnection({
        Redis: this.Redis,
        clientOptions: this.clientOptions,
        Promise: this.Promise,
        Events: this.instance.Events
      }) : this.instance.datastore === "ioredis" ? new IORedisConnection({
        Redis: this.Redis,
        clientOptions: this.clientOptions,
        clusterNodes: this.clusterNodes,
        Promise: this.Promise,
        Events: this.instance.Events
      }) : void 0;
    }

    this.instance.connection = this.connection;
    this.instance.datastore = this.connection.datastore;
    this.ready = this.connection.ready.then(clients => {
      this.clients = clients;
      return this.runScript("init", this.prepareInitSettings(this.clearDatastore));
    }).then(() => {
      return this.connection.__addLimiter__(this.instance);
    }).then(() => {
      return this.runScript("register_client", [this.instance.queued()]);
    }).then(() => {
      var base;

      if (typeof (base = this.heartbeat = setInterval(() => {
        return this.runScript("heartbeat", []).catch(e => {
          return this.instance.Events.trigger("error", e);
        });
      }, this.heartbeatInterval)).unref === "function") {
        base.unref();
      }

      return this.clients;
    });
  }

  __publish__(message) {
    var _this = this;

    return _asyncToGenerator(function* () {
      var client;

      var _ref = yield _this.ready;

      client = _ref.client;
      return client.publish(_this.instance.channel(), `message:${message.toString()}`);
    })();
  }

  onMessage(channel, message) {
    var _this2 = this;

    return _asyncToGenerator(function* () {
      var capacity, counter, data, drained, e, newCapacity, pos, priorityClient, rawCapacity, type;

      try {
        pos = message.indexOf(":");
        var _ref2 = [message.slice(0, pos), message.slice(pos + 1)];
        type = _ref2[0];
        data = _ref2[1];

        if (type === "capacity") {
          return yield _this2.instance._drainAll(data.length > 0 ? ~~data : void 0);
        } else if (type === "capacity-priority") {
          var _data$split = data.split(":");

          var _data$split2 = _slicedToArray(_data$split, 3);

          rawCapacity = _data$split2[0];
          priorityClient = _data$split2[1];
          counter = _data$split2[2];
          capacity = rawCapacity.length > 0 ? ~~rawCapacity : void 0;

          if (priorityClient === _this2.clientId) {
            drained = yield _this2.instance._drainAll(capacity);
            newCapacity = capacity != null ? capacity - (drained || 0) : "";
            return yield _this2.clients.client.publish(_this2.instance.channel(), `capacity-priority:${newCapacity}::${counter}`);
          } else if (priorityClient === "") {
            clearTimeout(_this2.capacityPriorityCounters[counter]);
            delete _this2.capacityPriorityCounters[counter];
            return _this2.instance._drainAll(capacity);
          } else {
            return _this2.capacityPriorityCounters[counter] = setTimeout(
            /*#__PURE__*/
            _asyncToGenerator(function* () {
              var e;

              try {
                delete _this2.capacityPriorityCounters[counter];
                yield _this2.runScript("blacklist_client", [priorityClient]);
                return yield _this2.instance._drainAll(capacity);
              } catch (error) {
                e = error;
                return _this2.instance.Events.trigger("error", e);
              }
            }), 1000);
          }
        } else if (type === "message") {
          return _this2.instance.Events.trigger("message", data);
        } else if (type === "blocked") {
          return yield _this2.instance._dropAllQueued();
        }
      } catch (error) {
        e = error;
        return _this2.instance.Events.trigger("error", e);
      }
    })();
  }

  __disconnect__(flush) {
    clearInterval(this.heartbeat);

    if (this.sharedConnection) {
      return this.connection.__removeLimiter__(this.instance);
    } else {
      return this.connection.disconnect(flush);
    }
  }

  runScript(name, args) {
    var _this3 = this;

    return _asyncToGenerator(function* () {
      if (!(name === "init" || name === "register_client")) {
        yield _this3.ready;
      }

      return new _this3.Promise((resolve, reject) => {
        var all_args, arr;
        all_args = [Date.now(), _this3.clientId].concat(args);

        _this3.instance.Events.trigger("debug", `Calling Redis script: ${name}.lua`, all_args);

        arr = _this3.connection.__scriptArgs__(name, _this3.originalId, all_args, function (err, replies) {
          if (err != null) {
            return reject(err);
          }

          return resolve(replies);
        });
        return _this3.connection.__scriptFn__(name)(...arr);
      }).catch(e => {
        if (e.message === "SETTINGS_KEY_NOT_FOUND") {
          if (name === "heartbeat") {
            return _this3.Promise.resolve();
          } else {
            return _this3.runScript("init", _this3.prepareInitSettings(false)).then(() => {
              return _this3.runScript(name, args);
            });
          }
        } else if (e.message === "UNKNOWN_CLIENT") {
          return _this3.runScript("register_client", [_this3.instance.queued()]).then(() => {
            return _this3.runScript(name, args);
          });
        } else {
          return _this3.Promise.reject(e);
        }
      });
    })();
  }

  prepareArray(arr) {
    var i, len, results, x;
    results = [];

    for (i = 0, len = arr.length; i < len; i++) {
      x = arr[i];
      results.push(x != null ? x.toString() : "");
    }

    return results;
  }

  prepareObject(obj) {
    var arr, k, v;
    arr = [];

    for (k in obj) {
      v = obj[k];
      arr.push(k, v != null ? v.toString() : "");
    }

    return arr;
  }

  prepareInitSettings(clear) {
    var args;
    args = this.prepareObject(Object.assign({}, this.storeOptions, {
      id: this.originalId,
      version: this.instance.version,
      groupTimeout: this.timeout,
      clientTimeout: this.clientTimeout
    }));
    args.unshift(clear ? 1 : 0, this.instance.version);
    return args;
  }

  convertBool(b) {
    return !!b;
  }

  __updateSettings__(options) {
    var _this4 = this;

    return _asyncToGenerator(function* () {
      yield _this4.runScript("update_settings", _this4.prepareObject(options));
      return parser.overwrite(options, options, _this4.storeOptions);
    })();
  }

  __running__() {
    return this.runScript("running", []);
  }

  __queued__() {
    return this.runScript("queued", []);
  }

  __done__() {
    return this.runScript("done", []);
  }

  __groupCheck__() {
    var _this5 = this;

    return _asyncToGenerator(function* () {
      return _this5.convertBool((yield _this5.runScript("group_check", [])));
    })();
  }

  __incrementReservoir__(incr) {
    return this.runScript("increment_reservoir", [incr]);
  }

  __currentReservoir__() {
    return this.runScript("current_reservoir", []);
  }

  __check__(weight) {
    var _this6 = this;

    return _asyncToGenerator(function* () {
      return _this6.convertBool((yield _this6.runScript("check", _this6.prepareArray([weight]))));
    })();
  }

  __register__(index, weight, expiration) {
    var _this7 = this;

    return _asyncToGenerator(function* () {
      var reservoir, success, wait;

      var _ref4 = yield _this7.runScript("register", _this7.prepareArray([index, weight, expiration]));

      var _ref5 = _slicedToArray(_ref4, 3);

      success = _ref5[0];
      wait = _ref5[1];
      reservoir = _ref5[2];
      return {
        success: _this7.convertBool(success),
        wait,
        reservoir
      };
    })();
  }

  __submit__(queueLength, weight) {
    var _this8 = this;

    return _asyncToGenerator(function* () {
      var blocked, e, maxConcurrent, overweight, reachedHWM, strategy;

      try {
        var _ref6 = yield _this8.runScript("submit", _this8.prepareArray([queueLength, weight]));

        var _ref7 = _slicedToArray(_ref6, 3);

        reachedHWM = _ref7[0];
        blocked = _ref7[1];
        strategy = _ref7[2];
        return {
          reachedHWM: _this8.convertBool(reachedHWM),
          blocked: _this8.convertBool(blocked),
          strategy
        };
      } catch (error) {
        e = error;

        if (e.message.indexOf("OVERWEIGHT") === 0) {
          var _e$message$split = e.message.split(":");

          var _e$message$split2 = _slicedToArray(_e$message$split, 3);

          overweight = _e$message$split2[0];
          weight = _e$message$split2[1];
          maxConcurrent = _e$message$split2[2];
          throw new BottleneckError(`Impossible to add a job having a weight of ${weight} to a limiter having a maxConcurrent setting of ${maxConcurrent}`);
        } else {
          throw e;
        }
      }
    })();
  }

  __free__(index, weight) {
    var _this9 = this;

    return _asyncToGenerator(function* () {
      var running;
      running = yield _this9.runScript("free", _this9.prepareArray([index]));
      return {
        running
      };
    })();
  }

};
module.exports = RedisDatastore;"use strict";

var headers, lua, templates;
lua = require("./lua.json");
headers = {
  refs: lua["refs.lua"],
  validate_keys: lua["validate_keys.lua"],
  validate_client: lua["validate_client.lua"],
  refresh_expiration: lua["refresh_expiration.lua"],
  process_tick: lua["process_tick.lua"],
  conditions_check: lua["conditions_check.lua"],
  get_time: lua["get_time.lua"]
};

exports.allKeys = function (id) {
  return [
  /*
  HASH
  */
  `b_${id}_settings`,
  /*
  HASH
  job index -> weight
  */
  `b_${id}_job_weights`,
  /*
  ZSET
  job index -> expiration
  */
  `b_${id}_job_expirations`,
  /*
  HASH
  job index -> client
  */
  `b_${id}_job_clients`,
  /*
  ZSET
  client -> sum running
  */
  `b_${id}_client_running`,
  /*
  HASH
  client -> num queued
  */
  `b_${id}_client_num_queued`,
  /*
  ZSET
  client -> last job registered
  */
  `b_${id}_client_last_registered`,
  /*
  ZSET
  client -> last seen
  */
  `b_${id}_client_last_seen`];
};

templates = {
  init: {
    keys: exports.allKeys,
    headers: ["process_tick"],
    refresh_expiration: true,
    code: lua["init.lua"]
  },
  group_check: {
    keys: exports.allKeys,
    headers: [],
    refresh_expiration: false,
    code: lua["group_check.lua"]
  },
  register_client: {
    keys: exports.allKeys,
    headers: ["validate_keys"],
    refresh_expiration: false,
    code: lua["register_client.lua"]
  },
  blacklist_client: {
    keys: exports.allKeys,
    headers: ["validate_keys", "validate_client"],
    refresh_expiration: false,
    code: lua["blacklist_client.lua"]
  },
  heartbeat: {
    keys: exports.allKeys,
    headers: ["validate_keys", "validate_client", "process_tick"],
    refresh_expiration: false,
    code: lua["heartbeat.lua"]
  },
  update_settings: {
    keys: exports.allKeys,
    headers: ["validate_keys", "validate_client", "process_tick"],
    refresh_expiration: true,
    code: lua["update_settings.lua"]
  },
  running: {
    keys: exports.allKeys,
    headers: ["validate_keys", "validate_client", "process_tick"],
    refresh_expiration: false,
    code: lua["running.lua"]
  },
  queued: {
    keys: exports.allKeys,
    headers: ["validate_keys", "validate_client"],
    refresh_expiration: false,
    code: lua["queued.lua"]
  },
  done: {
    keys: exports.allKeys,
    headers: ["validate_keys", "validate_client", "process_tick"],
    refresh_expiration: false,
    code: lua["done.lua"]
  },
  check: {
    keys: exports.allKeys,
    headers: ["validate_keys", "validate_client", "process_tick", "conditions_check"],
    refresh_expiration: false,
    code: lua["check.lua"]
  },
  submit: {
    keys: exports.allKeys,
    headers: ["validate_keys", "validate_client", "process_tick", "conditions_check"],
    refresh_expiration: true,
    code: lua["submit.lua"]
  },
  register: {
    keys: exports.allKeys,
    headers: ["validate_keys", "validate_client", "process_tick", "conditions_check"],
    refresh_expiration: true,
    code: lua["register.lua"]
  },
  free: {
    keys: exports.allKeys,
    headers: ["validate_keys", "validate_client", "process_tick"],
    refresh_expiration: true,
    code: lua["free.lua"]
  },
  current_reservoir: {
    keys: exports.allKeys,
    headers: ["validate_keys", "validate_client", "process_tick"],
    refresh_expiration: false,
    code: lua["current_reservoir.lua"]
  },
  increment_reservoir: {
    keys: exports.allKeys,
    headers: ["validate_keys", "validate_client", "process_tick"],
    refresh_expiration: true,
    code: lua["increment_reservoir.lua"]
  }
};
exports.names = Object.keys(templates);

exports.keys = function (name, id) {
  return templates[name].keys(id);
};

exports.payload = function (name) {
  var template;
  template = templates[name];
  return Array.prototype.concat(headers.refs, template.headers.map(function (h) {
    return headers[h];
  }), template.refresh_expiration ? headers.refresh_expiration : "", template.code).join("\n");
};"use strict";

var BottleneckError, States;
BottleneckError = require("./BottleneckError");
States = class States {
  constructor(status1) {
    this.status = status1;
    this._jobs = {};
    this.counts = this.status.map(function () {
      return 0;
    });
  }

  next(id) {
    var current, next;
    current = this._jobs[id];
    next = current + 1;

    if (current != null && next < this.status.length) {
      this.counts[current]--;
      this.counts[next]++;
      return this._jobs[id]++;
    } else if (current != null) {
      this.counts[current]--;
      return delete this._jobs[id];
    }
  }

  start(id) {
    var initial;
    initial = 0;
    this._jobs[id] = initial;
    return this.counts[initial]++;
  }

  remove(id) {
    var current;
    current = this._jobs[id];

    if (current != null) {
      this.counts[current]--;
      delete this._jobs[id];
    }

    return current != null;
  }

  jobStatus(id) {
    var ref;
    return (ref = this.status[this._jobs[id]]) != null ? ref : null;
  }

  statusJobs(status) {
    var k, pos, ref, results, v;

    if (status != null) {
      pos = this.status.indexOf(status);

      if (pos < 0) {
        throw new BottleneckError(`status must be one of ${this.status.join(', ')}`);
      }

      ref = this._jobs;
      results = [];

      for (k in ref) {
        v = ref[k];

        if (v === pos) {
          results.push(k);
        }
      }

      return results;
    } else {
      return Object.keys(this._jobs);
    }
  }

  statusCounts() {
    return this.counts.reduce((acc, v, i) => {
      acc[this.status[i]] = v;
      return acc;
    }, {});
  }

};
module.exports = States;"use strict";

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

var DLList, Sync;
DLList = require("./DLList");
Sync = class Sync {
  constructor(name, Promise) {
    this.schedule = this.schedule.bind(this);
    this.name = name;
    this.Promise = Promise;
    this._running = 0;
    this._queue = new DLList();
  }

  isEmpty() {
    return this._queue.length === 0;
  }

  _tryToRun() {
    var _this = this;

    return _asyncToGenerator(function* () {
      var args, cb, error, reject, resolve, returned, task;

      if (_this._running < 1 && _this._queue.length > 0) {
        _this._running++;

        var _this$_queue$shift = _this._queue.shift();

        task = _this$_queue$shift.task;
        args = _this$_queue$shift.args;
        resolve = _this$_queue$shift.resolve;
        reject = _this$_queue$shift.reject;
        cb = yield _asyncToGenerator(function* () {
          try {
            returned = yield task(...args);
            return function () {
              return resolve(returned);
            };
          } catch (error1) {
            error = error1;
            return function () {
              return reject(error);
            };
          }
        })();
        _this._running--;

        _this._tryToRun();

        return cb();
      }
    })();
  }

  schedule(task, ...args) {
    var promise, reject, resolve;
    resolve = reject = null;
    promise = new this.Promise(function (_resolve, _reject) {
      resolve = _resolve;
      return reject = _reject;
    });

    this._queue.push({
      task,
      args,
      resolve,
      reject
    });

    this._tryToRun();

    return promise;
  }

};
module.exports = Sync;"use strict";

require("regenerator-runtime/runtime");

module.exports = require("./Bottleneck");"use strict";

module.exports = require("./Bottleneck");{
  "blacklist_client.lua": "local blacklist = ARGV[num_static_argv + 1]\n\nif redis.call('zscore', client_last_seen_key, blacklist) then\n  redis.call('zadd', client_last_seen_key, 0, blacklist)\nend\n\n\nreturn {}\n",
  "check.lua": "local weight = tonumber(ARGV[num_static_argv + 1])\n\nlocal capacity = process_tick(now, false)['capacity']\nlocal nextRequest = tonumber(redis.call('hget', settings_key, 'nextRequest'))\n\nreturn conditions_check(capacity, weight) and nextRequest - now <= 0\n",
  "conditions_check.lua": "local conditions_check = function (capacity, weight)\n  return capacity == nil or weight <= capacity\nend\n",
  "current_reservoir.lua": "return process_tick(now, false)['reservoir']\n",
  "done.lua": "process_tick(now, false)\n\nreturn tonumber(redis.call('hget', settings_key, 'done'))\n",
  "free.lua": "local index = ARGV[num_static_argv + 1]\n\nredis.call('zadd', job_expirations_key, 0, index)\n\nreturn process_tick(now, false)['running']\n",
  "get_time.lua": "redis.replicate_commands()\n\nlocal get_time = function ()\n  local time = redis.call('time')\n\n  return tonumber(time[1]..string.sub(time[2], 1, 3))\nend\n",
  "group_check.lua": "return not (redis.call('exists', settings_key) == 1)\n",
  "heartbeat.lua": "process_tick(now, true)\n",
  "increment_reservoir.lua": "local incr = tonumber(ARGV[num_static_argv + 1])\n\nredis.call('hincrby', settings_key, 'reservoir', incr)\n\nlocal reservoir = process_tick(now, true)['reservoir']\n\nlocal groupTimeout = tonumber(redis.call('hget', settings_key, 'groupTimeout'))\nrefresh_expiration(0, 0, groupTimeout)\n\nreturn reservoir\n",
  "init.lua": "local clear = tonumber(ARGV[num_static_argv + 1])\nlocal limiter_version = ARGV[num_static_argv + 2]\nlocal num_local_argv = num_static_argv + 2\n\nif clear == 1 then\n  redis.call('del', unpack(KEYS))\nend\n\nif redis.call('exists', settings_key) == 0 then\n  -- Create\n  local args = {'hmset', settings_key}\n\n  for i = num_local_argv + 1, #ARGV do\n    table.insert(args, ARGV[i])\n  end\n\n  redis.call(unpack(args))\n  redis.call('hmset', settings_key,\n    'nextRequest', now,\n    'lastReservoirRefresh', now,\n    'lastReservoirIncrease', now,\n    'running', 0,\n    'done', 0,\n    'unblockTime', 0,\n    'capacityPriorityCounter', 0\n  )\n\nelse\n  -- Apply migrations\n  local settings = redis.call('hmget', settings_key,\n    'id',\n    'version'\n  )\n  local id = settings[1]\n  local current_version = settings[2]\n\n  if current_version ~= limiter_version then\n    local version_digits = {}\n    for k, v in string.gmatch(current_version, \"([^.]+)\") do\n      table.insert(version_digits, tonumber(k))\n    end\n\n    -- 2.10.0\n    if version_digits[2] < 10 then\n      redis.call('hsetnx', settings_key, 'reservoirRefreshInterval', '')\n      redis.call('hsetnx', settings_key, 'reservoirRefreshAmount', '')\n      redis.call('hsetnx', settings_key, 'lastReservoirRefresh', '')\n      redis.call('hsetnx', settings_key, 'done', 0)\n      redis.call('hset', settings_key, 'version', '2.10.0')\n    end\n\n    -- 2.11.1\n    if version_digits[2] < 11 or (version_digits[2] == 11 and version_digits[3] < 1) then\n      if redis.call('hstrlen', settings_key, 'lastReservoirRefresh') == 0 then\n        redis.call('hmset', settings_key,\n          'lastReservoirRefresh', now,\n          'version', '2.11.1'\n        )\n      end\n    end\n\n    -- 2.14.0\n    if version_digits[2] < 14 then\n      local old_running_key = 'b_'..id..'_running'\n      local old_executing_key = 'b_'..id..'_executing'\n\n      if redis.call('exists', old_running_key) == 1 then\n        redis.call('rename', old_running_key, job_weights_key)\n      end\n      if redis.call('exists', old_executing_key) == 1 then\n        redis.call('rename', old_executing_key, job_expirations_key)\n      end\n      redis.call('hset', settings_key, 'version', '2.14.0')\n    end\n\n    -- 2.15.2\n    if version_digits[2] < 15 or (version_digits[2] == 15 and version_digits[3] < 2) then\n      redis.call('hsetnx', settings_key, 'capacityPriorityCounter', 0)\n      redis.call('hset', settings_key, 'version', '2.15.2')\n    end\n\n    -- 2.17.0\n    if version_digits[2] < 17 then\n      redis.call('hsetnx', settings_key, 'clientTimeout', 10000)\n      redis.call('hset', settings_key, 'version', '2.17.0')\n    end\n\n    -- 2.18.0\n    if version_digits[2] < 18 then\n      redis.call('hsetnx', settings_key, 'reservoirIncreaseInterval', '')\n      redis.call('hsetnx', settings_key, 'reservoirIncreaseAmount', '')\n      redis.call('hsetnx', settings_key, 'reservoirIncreaseMaximum', '')\n      redis.call('hsetnx', settings_key, 'lastReservoirIncrease', now)\n      redis.call('hset', settings_key, 'version', '2.18.0')\n    end\n\n  end\n\n  process_tick(now, false)\nend\n\nlocal groupTimeout = tonumber(redis.call('hget', settings_key, 'groupTimeout'))\nrefresh_expiration(0, 0, groupTimeout)\n\nreturn {}\n",
  "process_tick.lua": "local process_tick = function (now, always_publish)\n\n  local compute_capacity = function (maxConcurrent, running, reservoir)\n    if maxConcurrent ~= nil and reservoir ~= nil then\n      return math.min((maxConcurrent - running), reservoir)\n    elseif maxConcurrent ~= nil then\n      return maxConcurrent - running\n    elseif reservoir ~= nil then\n      return reservoir\n    else\n      return nil\n    end\n  end\n\n  local settings = redis.call('hmget', settings_key,\n    'id',\n    'maxConcurrent',\n    'running',\n    'reservoir',\n    'reservoirRefreshInterval',\n    'reservoirRefreshAmount',\n    'lastReservoirRefresh',\n    'reservoirIncreaseInterval',\n    'reservoirIncreaseAmount',\n    'reservoirIncreaseMaximum',\n    'lastReservoirIncrease',\n    'capacityPriorityCounter',\n    'clientTimeout'\n  )\n  local id = settings[1]\n  local maxConcurrent = tonumber(settings[2])\n  local running = tonumber(settings[3])\n  local reservoir = tonumber(settings[4])\n  local reservoirRefreshInterval = tonumber(settings[5])\n  local reservoirRefreshAmount = tonumber(settings[6])\n  local lastReservoirRefresh = tonumber(settings[7])\n  local reservoirIncreaseInterval = tonumber(settings[8])\n  local reservoirIncreaseAmount = tonumber(settings[9])\n  local reservoirIncreaseMaximum = tonumber(settings[10])\n  local lastReservoirIncrease = tonumber(settings[11])\n  local capacityPriorityCounter = tonumber(settings[12])\n  local clientTimeout = tonumber(settings[13])\n\n  local initial_capacity = compute_capacity(maxConcurrent, running, reservoir)\n\n  --\n  -- Process 'running' changes\n  --\n  local expired = redis.call('zrangebyscore', job_expirations_key, '-inf', '('..now)\n\n  if #expired > 0 then\n    redis.call('zremrangebyscore', job_expirations_key, '-inf', '('..now)\n\n    local flush_batch = function (batch, acc)\n      local weights = redis.call('hmget', job_weights_key, unpack(batch))\n                      redis.call('hdel',  job_weights_key, unpack(batch))\n      local clients = redis.call('hmget', job_clients_key, unpack(batch))\n                      redis.call('hdel',  job_clients_key, unpack(batch))\n\n      -- Calculate sum of removed weights\n      for i = 1, #weights do\n        acc['total'] = acc['total'] + (tonumber(weights[i]) or 0)\n      end\n\n      -- Calculate sum of removed weights by client\n      local client_weights = {}\n      for i = 1, #clients do\n        local removed = tonumber(weights[i]) or 0\n        if removed > 0 then\n          acc['client_weights'][clients[i]] = (acc['client_weights'][clients[i]] or 0) + removed\n        end\n      end\n    end\n\n    local acc = {\n      ['total'] = 0,\n      ['client_weights'] = {}\n    }\n    local batch_size = 1000\n\n    -- Compute changes to Zsets and apply changes to Hashes\n    for i = 1, #expired, batch_size do\n      local batch = {}\n      for j = i, math.min(i + batch_size - 1, #expired) do\n        table.insert(batch, expired[j])\n      end\n\n      flush_batch(batch, acc)\n    end\n\n    -- Apply changes to Zsets\n    if acc['total'] > 0 then\n      redis.call('hincrby', settings_key, 'done', acc['total'])\n      running = tonumber(redis.call('hincrby', settings_key, 'running', -acc['total']))\n    end\n\n    for client, weight in pairs(acc['client_weights']) do\n      redis.call('zincrby', client_running_key, -weight, client)\n    end\n  end\n\n  --\n  -- Process 'reservoir' changes\n  --\n  local reservoirRefreshActive = reservoirRefreshInterval ~= nil and reservoirRefreshAmount ~= nil\n  if reservoirRefreshActive and now >= lastReservoirRefresh + reservoirRefreshInterval then\n    reservoir = reservoirRefreshAmount\n    redis.call('hmset', settings_key,\n      'reservoir', reservoir,\n      'lastReservoirRefresh', now\n    )\n  end\n\n  local reservoirIncreaseActive = reservoirIncreaseInterval ~= nil and reservoirIncreaseAmount ~= nil\n  if reservoirIncreaseActive and now >= lastReservoirIncrease + reservoirIncreaseInterval then\n    local num_intervals = math.floor((now - lastReservoirIncrease) / reservoirIncreaseInterval)\n    local incr = reservoirIncreaseAmount * num_intervals\n    if reservoirIncreaseMaximum ~= nil then\n      incr = math.min(incr, reservoirIncreaseMaximum - (reservoir or 0))\n    end\n    if incr > 0 then\n      reservoir = (reservoir or 0) + incr\n    end\n    redis.call('hmset', settings_key,\n      'reservoir', reservoir,\n      'lastReservoirIncrease', lastReservoirIncrease + (num_intervals * reservoirIncreaseInterval)\n    )\n  end\n\n  --\n  -- Clear unresponsive clients\n  --\n  local unresponsive = redis.call('zrangebyscore', client_last_seen_key, '-inf', (now - clientTimeout))\n  local unresponsive_lookup = {}\n  local terminated_clients = {}\n  for i = 1, #unresponsive do\n    unresponsive_lookup[unresponsive[i]] = true\n    if tonumber(redis.call('zscore', client_running_key, unresponsive[i])) == 0 then\n      table.insert(terminated_clients, unresponsive[i])\n    end\n  end\n  if #terminated_clients > 0 then\n    redis.call('zrem', client_running_key,         unpack(terminated_clients))\n    redis.call('hdel', client_num_queued_key,      unpack(terminated_clients))\n    redis.call('zrem', client_last_registered_key, unpack(terminated_clients))\n    redis.call('zrem', client_last_seen_key,       unpack(terminated_clients))\n  end\n\n  --\n  -- Broadcast capacity changes\n  --\n  local final_capacity = compute_capacity(maxConcurrent, running, reservoir)\n\n  if always_publish or (initial_capacity ~= nil and final_capacity == nil) then\n    -- always_publish or was not unlimited, now unlimited\n    redis.call('publish', 'b_'..id, 'capacity:'..(final_capacity or ''))\n\n  elseif initial_capacity ~= nil and final_capacity ~= nil and final_capacity > initial_capacity then\n    -- capacity was increased\n    -- send the capacity message to the limiter having the lowest number of running jobs\n    -- the tiebreaker is the limiter having not registered a job in the longest time\n\n    local lowest_concurrency_value = nil\n    local lowest_concurrency_clients = {}\n    local lowest_concurrency_last_registered = {}\n    local client_concurrencies = redis.call('zrange', client_running_key, 0, -1, 'withscores')\n\n    for i = 1, #client_concurrencies, 2 do\n      local client = client_concurrencies[i]\n      local concurrency = tonumber(client_concurrencies[i+1])\n\n      if (\n        lowest_concurrency_value == nil or lowest_concurrency_value == concurrency\n      ) and (\n        not unresponsive_lookup[client]\n      ) and (\n        tonumber(redis.call('hget', client_num_queued_key, client)) > 0\n      ) then\n        lowest_concurrency_value = concurrency\n        table.insert(lowest_concurrency_clients, client)\n        local last_registered = tonumber(redis.call('zscore', client_last_registered_key, client))\n        table.insert(lowest_concurrency_last_registered, last_registered)\n      end\n    end\n\n    if #lowest_concurrency_clients > 0 then\n      local position = 1\n      local earliest = lowest_concurrency_last_registered[1]\n\n      for i,v in ipairs(lowest_concurrency_last_registered) do\n        if v < earliest then\n          position = i\n          earliest = v\n        end\n      end\n\n      local next_client = lowest_concurrency_clients[position]\n      redis.call('publish', 'b_'..id,\n        'capacity-priority:'..(final_capacity or '')..\n        ':'..next_client..\n        ':'..capacityPriorityCounter\n      )\n      redis.call('hincrby', settings_key, 'capacityPriorityCounter', '1')\n    else\n      redis.call('publish', 'b_'..id, 'capacity:'..(final_capacity or ''))\n    end\n  end\n\n  return {\n    ['capacity'] = final_capacity,\n    ['running'] = running,\n    ['reservoir'] = reservoir\n  }\nend\n",
  "queued.lua": "local clientTimeout = tonumber(redis.call('hget', settings_key, 'clientTimeout'))\nlocal valid_clients = redis.call('zrangebyscore', client_last_seen_key, (now - clientTimeout), 'inf')\nlocal client_queued = redis.call('hmget', client_num_queued_key, unpack(valid_clients))\n\nlocal sum = 0\nfor i = 1, #client_queued do\n  sum = sum + tonumber(client_queued[i])\nend\n\nreturn sum\n",
  "refresh_expiration.lua": "local refresh_expiration = function (now, nextRequest, groupTimeout)\n\n  if groupTimeout ~= nil then\n    local ttl = (nextRequest + groupTimeout) - now\n\n    for i = 1, #KEYS do\n      redis.call('pexpire', KEYS[i], ttl)\n    end\n  end\n\nend\n",
  "refs.lua": "local settings_key = KEYS[1]\nlocal job_weights_key = KEYS[2]\nlocal job_expirations_key = KEYS[3]\nlocal job_clients_key = KEYS[4]\nlocal client_running_key = KEYS[5]\nlocal client_num_queued_key = KEYS[6]\nlocal client_last_registered_key = KEYS[7]\nlocal client_last_seen_key = KEYS[8]\n\nlocal now = tonumber(ARGV[1])\nlocal client = ARGV[2]\n\nlocal num_static_argv = 2\n",
  "register.lua": "local index = ARGV[num_static_argv + 1]\nlocal weight = tonumber(ARGV[num_static_argv + 2])\nlocal expiration = tonumber(ARGV[num_static_argv + 3])\n\nlocal state = process_tick(now, false)\nlocal capacity = state['capacity']\nlocal reservoir = state['reservoir']\n\nlocal settings = redis.call('hmget', settings_key,\n  'nextRequest',\n  'minTime',\n  'groupTimeout'\n)\nlocal nextRequest = tonumber(settings[1])\nlocal minTime = tonumber(settings[2])\nlocal groupTimeout = tonumber(settings[3])\n\nif conditions_check(capacity, weight) then\n\n  redis.call('hincrby', settings_key, 'running', weight)\n  redis.call('hset', job_weights_key, index, weight)\n  if expiration ~= nil then\n    redis.call('zadd', job_expirations_key, now + expiration, index)\n  end\n  redis.call('hset', job_clients_key, index, client)\n  redis.call('zincrby', client_running_key, weight, client)\n  redis.call('hincrby', client_num_queued_key, client, -1)\n  redis.call('zadd', client_last_registered_key, now, client)\n\n  local wait = math.max(nextRequest - now, 0)\n  local newNextRequest = now + wait + minTime\n\n  if reservoir == nil then\n    redis.call('hset', settings_key,\n      'nextRequest', newNextRequest\n    )\n  else\n    reservoir = reservoir - weight\n    redis.call('hmset', settings_key,\n      'reservoir', reservoir,\n      'nextRequest', newNextRequest\n    )\n  end\n\n  refresh_expiration(now, newNextRequest, groupTimeout)\n\n  return {true, wait, reservoir}\n\nelse\n  return {false}\nend\n",
  "register_client.lua": "local queued = tonumber(ARGV[num_static_argv + 1])\n\n-- Could have been re-registered concurrently\nif not redis.call('zscore', client_last_seen_key, client) then\n  redis.call('zadd', client_running_key, 0, client)\n  redis.call('hset', client_num_queued_key, client, queued)\n  redis.call('zadd', client_last_registered_key, 0, client)\nend\n\nredis.call('zadd', client_last_seen_key, now, client)\n\nreturn {}\n",
  "running.lua": "return process_tick(now, false)['running']\n",
  "submit.lua": "local queueLength = tonumber(ARGV[num_static_argv + 1])\nlocal weight = tonumber(ARGV[num_static_argv + 2])\n\nlocal capacity = process_tick(now, false)['capacity']\n\nlocal settings = redis.call('hmget', settings_key,\n  'id',\n  'maxConcurrent',\n  'highWater',\n  'nextRequest',\n  'strategy',\n  'unblockTime',\n  'penalty',\n  'minTime',\n  'groupTimeout'\n)\nlocal id = settings[1]\nlocal maxConcurrent = tonumber(settings[2])\nlocal highWater = tonumber(settings[3])\nlocal nextRequest = tonumber(settings[4])\nlocal strategy = tonumber(settings[5])\nlocal unblockTime = tonumber(settings[6])\nlocal penalty = tonumber(settings[7])\nlocal minTime = tonumber(settings[8])\nlocal groupTimeout = tonumber(settings[9])\n\nif maxConcurrent ~= nil and weight > maxConcurrent then\n  return redis.error_reply('OVERWEIGHT:'..weight..':'..maxConcurrent)\nend\n\nlocal reachedHWM = (highWater ~= nil and queueLength == highWater\n  and not (\n    conditions_check(capacity, weight)\n    and nextRequest - now <= 0\n  )\n)\n\nlocal blocked = strategy == 3 and (reachedHWM or unblockTime >= now)\n\nif blocked then\n  local computedPenalty = penalty\n  if computedPenalty == nil then\n    if minTime == 0 then\n      computedPenalty = 5000\n    else\n      computedPenalty = 15 * minTime\n    end\n  end\n\n  local newNextRequest = now + computedPenalty + minTime\n\n  redis.call('hmset', settings_key,\n    'unblockTime', now + computedPenalty,\n    'nextRequest', newNextRequest\n  )\n\n  local clients_queued_reset = redis.call('hkeys', client_num_queued_key)\n  local queued_reset = {}\n  for i = 1, #clients_queued_reset do\n    table.insert(queued_reset, clients_queued_reset[i])\n    table.insert(queued_reset, 0)\n  end\n  redis.call('hmset', client_num_queued_key, unpack(queued_reset))\n\n  redis.call('publish', 'b_'..id, 'blocked:')\n\n  refresh_expiration(now, newNextRequest, groupTimeout)\nend\n\nif not blocked and not reachedHWM then\n  redis.call('hincrby', client_num_queued_key, client, 1)\nend\n\nreturn {reachedHWM, blocked, strategy}\n",
  "update_settings.lua": "local args = {'hmset', settings_key}\n\nfor i = num_static_argv + 1, #ARGV do\n  table.insert(args, ARGV[i])\nend\n\nredis.call(unpack(args))\n\nprocess_tick(now, true)\n\nlocal groupTimeout = tonumber(redis.call('hget', settings_key, 'groupTimeout'))\nrefresh_expiration(0, 0, groupTimeout)\n\nreturn {}\n",
  "validate_client.lua": "if not redis.call('zscore', client_last_seen_key, client) then\n  return redis.error_reply('UNKNOWN_CLIENT')\nend\n\nredis.call('zadd', client_last_seen_key, now, client)\n",
  "validate_keys.lua": "if not (redis.call('exists', settings_key) == 1) then\n  return redis.error_reply('SETTINGS_KEY_NOT_FOUND')\nend\n"
}
"use strict";

exports.load = function (received, defaults, onto = {}) {
  var k, ref, v;

  for (k in defaults) {
    v = defaults[k];
    onto[k] = (ref = received[k]) != null ? ref : v;
  }

  return onto;
};

exports.overwrite = function (received, defaults, onto = {}) {
  var k, v;

  for (k in received) {
    v = received[k];

    if (defaults[k] !== void 0) {
      onto[k] = v;
    }
  }

  return onto;
};{"version":"2.19.5"}
MIT License

Copyright (c) 2013 Julian Gruber <julian@juliangruber.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.
var concatMap = require('concat-map');
var balanced = require('balanced-match');

module.exports = expandTop;

var escSlash = '\0SLASH'+Math.random()+'\0';
var escOpen = '\0OPEN'+Math.random()+'\0';
var escClose = '\0CLOSE'+Math.random()+'\0';
var escComma = '\0COMMA'+Math.random()+'\0';
var escPeriod = '\0PERIOD'+Math.random()+'\0';

function numeric(str) {
  return parseInt(str, 10) == str
    ? parseInt(str, 10)
    : str.charCodeAt(0);
}

function escapeBraces(str) {
  return str.split('\\\\').join(escSlash)
            .split('\\{').join(escOpen)
            .split('\\}').join(escClose)
            .split('\\,').join(escComma)
            .split('\\.').join(escPeriod);
}

function unescapeBraces(str) {
  return str.split(escSlash).join('\\')
            .split(escOpen).join('{')
            .split(escClose).join('}')
            .split(escComma).join(',')
            .split(escPeriod).join('.');
}


// Basically just str.split(","), but handling cases
// where we have nested braced sections, which should be
// treated as individual members, like {a,{b,c},d}
function parseCommaParts(str) {
  if (!str)
    return [''];

  var parts = [];
  var m = balanced('{', '}', str);

  if (!m)
    return str.split(',');

  var pre = m.pre;
  var body = m.body;
  var post = m.post;
  var p = pre.split(',');

  p[p.length-1] += '{' + body + '}';
  var postParts = parseCommaParts(post);
  if (post.length) {
    p[p.length-1] += postParts.shift();
    p.push.apply(p, postParts);
  }

  parts.push.apply(parts, p);

  return parts;
}

function expandTop(str) {
  if (!str)
    return [];

  // I don't know why Bash 4.3 does this, but it does.
  // Anything starting with {} will have the first two bytes preserved
  // but *only* at the top level, so {},a}b will not expand to anything,
  // but a{},b}c will be expanded to [a}c,abc].
  // One could argue that this is a bug in Bash, but since the goal of
  // this module is to match Bash's rules, we escape a leading {}
  if (str.substr(0, 2) === '{}') {
    str = '\\{\\}' + str.substr(2);
  }

  return expand(escapeBraces(str), true).map(unescapeBraces);
}

function identity(e) {
  return e;
}

function embrace(str) {
  return '{' + str + '}';
}
function isPadded(el) {
  return /^-?0\d/.test(el);
}

function lte(i, y) {
  return i <= y;
}
function gte(i, y) {
  return i >= y;
}

function expand(str, isTop) {
  var expansions = [];

  var m = balanced('{', '}', str);
  if (!m || /\$$/.test(m.pre)) return [str];

  var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
  var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
  var isSequence = isNumericSequence || isAlphaSequence;
  var isOptions = m.body.indexOf(',') >= 0;
  if (!isSequence && !isOptions) {
    // {a},b}
    if (m.post.match(/,.*\}/)) {
      str = m.pre + '{' + m.body + escClose + m.post;
      return expand(str);
    }
    return [str];
  }

  var n;
  if (isSequence) {
    n = m.body.split(/\.\./);
  } else {
    n = parseCommaParts(m.body);
    if (n.length === 1) {
      // x{{a,b}}y ==> x{a}y x{b}y
      n = expand(n[0], false).map(embrace);
      if (n.length === 1) {
        var post = m.post.length
          ? expand(m.post, false)
          : [''];
        return post.map(function(p) {
          return m.pre + n[0] + p;
        });
      }
    }
  }

  // at this point, n is the parts, and we know it's not a comma set
  // with a single entry.

  // no need to expand pre, since it is guaranteed to be free of brace-sets
  var pre = m.pre;
  var post = m.post.length
    ? expand(m.post, false)
    : [''];

  var N;

  if (isSequence) {
    var x = numeric(n[0]);
    var y = numeric(n[1]);
    var width = Math.max(n[0].length, n[1].length)
    var incr = n.length == 3
      ? Math.abs(numeric(n[2]))
      : 1;
    var test = lte;
    var reverse = y < x;
    if (reverse) {
      incr *= -1;
      test = gte;
    }
    var pad = n.some(isPadded);

    N = [];

    for (var i = x; test(i, y); i += incr) {
      var c;
      if (isAlphaSequence) {
        c = String.fromCharCode(i);
        if (c === '\\')
          c = '';
      } else {
        c = String(i);
        if (pad) {
          var need = width - c.length;
          if (need > 0) {
            var z = new Array(need + 1).join('0');
            if (i < 0)
              c = '-' + z + c.slice(1);
            else
              c = z + c;
          }
        }
      }
      N.push(c);
    }
  } else {
    N = concatMap(n, function(el) { return expand(el, false) });
  }

  for (var j = 0; j < N.length; j++) {
    for (var k = 0; k < post.length; k++) {
      var expansion = pre + N[j] + post[k];
      if (!isTop || isSequence || expansion)
        expansions.push(expansion);
    }
  }

  return expansions;
}

{
  "name": "brace-expansion",
  "description": "Brace expansion as known from sh/bash",
  "version": "1.1.11",
  "repository": {
    "type": "git",
    "url": "git://github.com/juliangruber/brace-expansion.git"
  },
  "homepage": "https://github.com/juliangruber/brace-expansion",
  "main": "index.js",
  "dependencies": {
    "balanced-match": "^1.0.0",
    "concat-map": "0.0.1"
  },
  "devDependencies": {
    "matcha": "^0.7.0",
    "tape": "^4.6.0"
  },
  "author": {
    "name": "Julian Gruber",
    "email": "mail@juliangruber.com",
    "url": "http://juliangruber.com"
  },
  "license": "MIT",
  "testling": {
    "files": "test/*.js",
    "browsers": [
      "ie/8..latest",
      "firefox/20..latest",
      "firefox/nightly",
      "chrome/25..latest",
      "chrome/canary",
      "opera/12..latest",
      "opera/next",
      "safari/5.1..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2..latest"
    ]
  }
}# Authors

#### Ordered by first contribution.

- Romain Beauxis (toots@rastageeks.org)
- Tobias Koppers (tobias.koppers@googlemail.com)
- Janus (ysangkok@gmail.com)
- Rainer Dreyer (rdrey1@gmail.com)
- Tõnis Tiigi (tonistiigi@gmail.com)
- James Halliday (mail@substack.net)
- Michael Williamson (mike@zwobble.org)
- elliottcable (github@elliottcable.name)
- rafael (rvalle@livelens.net)
- Andrew Kelley (superjoe30@gmail.com)
- Andreas Madsen (amwebdk@gmail.com)
- Mike Brevoort (mike.brevoort@pearson.com)
- Brian White (mscdex@mscdex.net)
- Feross Aboukhadijeh (feross@feross.org)
- Ruben Verborgh (ruben@verborgh.org)
- eliang (eliang.cs@gmail.com)
- Jesse Tane (jesse.tane@gmail.com)
- Alfonso Boza (alfonso@cloud.com)
- Mathias Buus (mathiasbuus@gmail.com)
- Devon Govett (devongovett@gmail.com)
- Daniel Cousens (github@dcousens.com)
- Joseph Dykstra (josephdykstra@gmail.com)
- Parsha Pourkhomami (parshap+git@gmail.com)
- Damjan Košir (damjan.kosir@gmail.com)
- daverayment (dave.rayment@gmail.com)
- kawanet (u-suke@kawa.net)
- Linus Unnebäck (linus@folkdatorn.se)
- Nolan Lawson (nolan.lawson@gmail.com)
- Calvin Metcalf (calvin.metcalf@gmail.com)
- Koki Takahashi (hakatasiloving@gmail.com)
- Guy Bedford (guybedford@gmail.com)
- Jan Schär (jscissr@gmail.com)
- RaulTsc (tomescu.raul@gmail.com)
- Matthieu Monsch (monsch@alum.mit.edu)
- Dan Ehrenberg (littledan@chromium.org)
- Kirill Fomichev (fanatid@ya.ru)
- Yusuke Kawasaki (u-suke@kawa.net)
- DC (dcposch@dcpos.ch)
- John-David Dalton (john.david.dalton@gmail.com)
- adventure-yunfei (adventure030@gmail.com)
- Emil Bay (github@tixz.dk)
- Sam Sudar (sudar.sam@gmail.com)
- Volker Mische (volker.mische@gmail.com)
- David Walton (support@geekstocks.com)
- Сковорода Никита Андреевич (chalkerx@gmail.com)
- greenkeeper[bot] (greenkeeper[bot]@users.noreply.github.com)
- ukstv (sergey.ukustov@machinomy.com)
- Renée Kooi (renee@kooi.me)
- ranbochen (ranbochen@qq.com)
- Vladimir Borovik (bobahbdb@gmail.com)
- greenkeeper[bot] (23040076+greenkeeper[bot]@users.noreply.github.com)
- kumavis (aaron@kumavis.me)
- Sergey Ukustov (sergey.ukustov@machinomy.com)
- Fei Liu (liu.feiwood@gmail.com)
- Blaine Bublitz (blaine.bublitz@gmail.com)
- clement (clement@seald.io)
- Koushik Dutta (koushd@gmail.com)
- Jordan Harband (ljharb@gmail.com)
- Niklas Mischkulnig (mischnic@users.noreply.github.com)
- Nikolai Vavilov (vvnicholas@gmail.com)
- Fedor Nezhivoi (gyzerok@users.noreply.github.com)
- shuse2 (shus.toda@gmail.com)
- Peter Newman (peternewman@users.noreply.github.com)
- mathmakgakpak (44949126+mathmakgakpak@users.noreply.github.com)
- jkkang (jkkang@smartauth.kr)
- Deklan Webster (deklanw@gmail.com)
- Martin Heidegger (martin.heidegger@gmail.com)

#### Generated by bin/update-authors.sh.
The MIT License (MIT)

Copyright (c) Feross Aboukhadijeh, and other contributors.

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

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

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
/*!
 * The buffer module from node.js, for the browser.
 *
 * @author   Feross Aboukhadijeh <https://feross.org>
 * @license  MIT
 */
/* eslint-disable no-proto */

'use strict'

const base64 = require('base64-js')
const ieee754 = require('ieee754')
const customInspectSymbol =
  (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation
    ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation
    : null

exports.Buffer = Buffer
exports.SlowBuffer = SlowBuffer
exports.INSPECT_MAX_BYTES = 50

const K_MAX_LENGTH = 0x7fffffff
exports.kMaxLength = K_MAX_LENGTH

/**
 * If `Buffer.TYPED_ARRAY_SUPPORT`:
 *   === true    Use Uint8Array implementation (fastest)
 *   === false   Print warning and recommend using `buffer` v4.x which has an Object
 *               implementation (most compatible, even IE6)
 *
 * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
 * Opera 11.6+, iOS 4.2+.
 *
 * We report that the browser does not support typed arrays if the are not subclassable
 * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`
 * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support
 * for __proto__ and has a buggy typed array implementation.
 */
Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport()

if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&
    typeof console.error === 'function') {
  console.error(
    'This browser lacks typed array (Uint8Array) support which is required by ' +
    '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'
  )
}

function typedArraySupport () {
  // Can typed array instances can be augmented?
  try {
    const arr = new Uint8Array(1)
    const proto = { foo: function () { return 42 } }
    Object.setPrototypeOf(proto, Uint8Array.prototype)
    Object.setPrototypeOf(arr, proto)
    return arr.foo() === 42
  } catch (e) {
    return false
  }
}

Object.defineProperty(Buffer.prototype, 'parent', {
  enumerable: true,
  get: function () {
    if (!Buffer.isBuffer(this)) return undefined
    return this.buffer
  }
})

Object.defineProperty(Buffer.prototype, 'offset', {
  enumerable: true,
  get: function () {
    if (!Buffer.isBuffer(this)) return undefined
    return this.byteOffset
  }
})

function createBuffer (length) {
  if (length > K_MAX_LENGTH) {
    throw new RangeError('The value "' + length + '" is invalid for option "size"')
  }
  // Return an augmented `Uint8Array` instance
  const buf = new Uint8Array(length)
  Object.setPrototypeOf(buf, Buffer.prototype)
  return buf
}

/**
 * The Buffer constructor returns instances of `Uint8Array` that have their
 * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
 * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
 * and the `Uint8Array` methods. Square bracket notation works as expected -- it
 * returns a single octet.
 *
 * The `Uint8Array` prototype remains unmodified.
 */

function Buffer (arg, encodingOrOffset, length) {
  // Common case.
  if (typeof arg === 'number') {
    if (typeof encodingOrOffset === 'string') {
      throw new TypeError(
        'The "string" argument must be of type string. Received type number'
      )
    }
    return allocUnsafe(arg)
  }
  return from(arg, encodingOrOffset, length)
}

Buffer.poolSize = 8192 // not used by this implementation

function from (value, encodingOrOffset, length) {
  if (typeof value === 'string') {
    return fromString(value, encodingOrOffset)
  }

  if (ArrayBuffer.isView(value)) {
    return fromArrayView(value)
  }

  if (value == null) {
    throw new TypeError(
      'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
      'or Array-like Object. Received type ' + (typeof value)
    )
  }

  if (isInstance(value, ArrayBuffer) ||
      (value && isInstance(value.buffer, ArrayBuffer))) {
    return fromArrayBuffer(value, encodingOrOffset, length)
  }

  if (typeof SharedArrayBuffer !== 'undefined' &&
      (isInstance(value, SharedArrayBuffer) ||
      (value && isInstance(value.buffer, SharedArrayBuffer)))) {
    return fromArrayBuffer(value, encodingOrOffset, length)
  }

  if (typeof value === 'number') {
    throw new TypeError(
      'The "value" argument must not be of type number. Received type number'
    )
  }

  const valueOf = value.valueOf && value.valueOf()
  if (valueOf != null && valueOf !== value) {
    return Buffer.from(valueOf, encodingOrOffset, length)
  }

  const b = fromObject(value)
  if (b) return b

  if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&
      typeof value[Symbol.toPrimitive] === 'function') {
    return Buffer.from(value[Symbol.toPrimitive]('string'), encodingOrOffset, length)
  }

  throw new TypeError(
    'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
    'or Array-like Object. Received type ' + (typeof value)
  )
}

/**
 * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
 * if value is a number.
 * Buffer.from(str[, encoding])
 * Buffer.from(array)
 * Buffer.from(buffer)
 * Buffer.from(arrayBuffer[, byteOffset[, length]])
 **/
Buffer.from = function (value, encodingOrOffset, length) {
  return from(value, encodingOrOffset, length)
}

// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:
// https://github.com/feross/buffer/pull/148
Object.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)
Object.setPrototypeOf(Buffer, Uint8Array)

function assertSize (size) {
  if (typeof size !== 'number') {
    throw new TypeError('"size" argument must be of type number')
  } else if (size < 0) {
    throw new RangeError('The value "' + size + '" is invalid for option "size"')
  }
}

function alloc (size, fill, encoding) {
  assertSize(size)
  if (size <= 0) {
    return createBuffer(size)
  }
  if (fill !== undefined) {
    // Only pay attention to encoding if it's a string. This
    // prevents accidentally sending in a number that would
    // be interpreted as a start offset.
    return typeof encoding === 'string'
      ? createBuffer(size).fill(fill, encoding)
      : createBuffer(size).fill(fill)
  }
  return createBuffer(size)
}

/**
 * Creates a new filled Buffer instance.
 * alloc(size[, fill[, encoding]])
 **/
Buffer.alloc = function (size, fill, encoding) {
  return alloc(size, fill, encoding)
}

function allocUnsafe (size) {
  assertSize(size)
  return createBuffer(size < 0 ? 0 : checked(size) | 0)
}

/**
 * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
 * */
Buffer.allocUnsafe = function (size) {
  return allocUnsafe(size)
}
/**
 * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
 */
Buffer.allocUnsafeSlow = function (size) {
  return allocUnsafe(size)
}

function fromString (string, encoding) {
  if (typeof encoding !== 'string' || encoding === '') {
    encoding = 'utf8'
  }

  if (!Buffer.isEncoding(encoding)) {
    throw new TypeError('Unknown encoding: ' + encoding)
  }

  const length = byteLength(string, encoding) | 0
  let buf = createBuffer(length)

  const actual = buf.write(string, encoding)

  if (actual !== length) {
    // Writing a hex string, for example, that contains invalid characters will
    // cause everything after the first invalid character to be ignored. (e.g.
    // 'abxxcd' will be treated as 'ab')
    buf = buf.slice(0, actual)
  }

  return buf
}

function fromArrayLike (array) {
  const length = array.length < 0 ? 0 : checked(array.length) | 0
  const buf = createBuffer(length)
  for (let i = 0; i < length; i += 1) {
    buf[i] = array[i] & 255
  }
  return buf
}

function fromArrayView (arrayView) {
  if (isInstance(arrayView, Uint8Array)) {
    const copy = new Uint8Array(arrayView)
    return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)
  }
  return fromArrayLike(arrayView)
}

function fromArrayBuffer (array, byteOffset, length) {
  if (byteOffset < 0 || array.byteLength < byteOffset) {
    throw new RangeError('"offset" is outside of buffer bounds')
  }

  if (array.byteLength < byteOffset + (length || 0)) {
    throw new RangeError('"length" is outside of buffer bounds')
  }

  let buf
  if (byteOffset === undefined && length === undefined) {
    buf = new Uint8Array(array)
  } else if (length === undefined) {
    buf = new Uint8Array(array, byteOffset)
  } else {
    buf = new Uint8Array(array, byteOffset, length)
  }

  // Return an augmented `Uint8Array` instance
  Object.setPrototypeOf(buf, Buffer.prototype)

  return buf
}

function fromObject (obj) {
  if (Buffer.isBuffer(obj)) {
    const len = checked(obj.length) | 0
    const buf = createBuffer(len)

    if (buf.length === 0) {
      return buf
    }

    obj.copy(buf, 0, 0, len)
    return buf
  }

  if (obj.length !== undefined) {
    if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {
      return createBuffer(0)
    }
    return fromArrayLike(obj)
  }

  if (obj.type === 'Buffer' && Array.isArray(obj.data)) {
    return fromArrayLike(obj.data)
  }
}

function checked (length) {
  // Note: cannot use `length < K_MAX_LENGTH` here because that fails when
  // length is NaN (which is otherwise coerced to zero.)
  if (length >= K_MAX_LENGTH) {
    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
                         'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')
  }
  return length | 0
}

function SlowBuffer (length) {
  if (+length != length) { // eslint-disable-line eqeqeq
    length = 0
  }
  return Buffer.alloc(+length)
}

Buffer.isBuffer = function isBuffer (b) {
  return b != null && b._isBuffer === true &&
    b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false
}

Buffer.compare = function compare (a, b) {
  if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)
  if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)
  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
    throw new TypeError(
      'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array'
    )
  }

  if (a === b) return 0

  let x = a.length
  let y = b.length

  for (let i = 0, len = Math.min(x, y); i < len; ++i) {
    if (a[i] !== b[i]) {
      x = a[i]
      y = b[i]
      break
    }
  }

  if (x < y) return -1
  if (y < x) return 1
  return 0
}

Buffer.isEncoding = function isEncoding (encoding) {
  switch (String(encoding).toLowerCase()) {
    case 'hex':
    case 'utf8':
    case 'utf-8':
    case 'ascii':
    case 'latin1':
    case 'binary':
    case 'base64':
    case 'ucs2':
    case 'ucs-2':
    case 'utf16le':
    case 'utf-16le':
      return true
    default:
      return false
  }
}

Buffer.concat = function concat (list, length) {
  if (!Array.isArray(list)) {
    throw new TypeError('"list" argument must be an Array of Buffers')
  }

  if (list.length === 0) {
    return Buffer.alloc(0)
  }

  let i
  if (length === undefined) {
    length = 0
    for (i = 0; i < list.length; ++i) {
      length += list[i].length
    }
  }

  const buffer = Buffer.allocUnsafe(length)
  let pos = 0
  for (i = 0; i < list.length; ++i) {
    let buf = list[i]
    if (isInstance(buf, Uint8Array)) {
      if (pos + buf.length > buffer.length) {
        if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf)
        buf.copy(buffer, pos)
      } else {
        Uint8Array.prototype.set.call(
          buffer,
          buf,
          pos
        )
      }
    } else if (!Buffer.isBuffer(buf)) {
      throw new TypeError('"list" argument must be an Array of Buffers')
    } else {
      buf.copy(buffer, pos)
    }
    pos += buf.length
  }
  return buffer
}

function byteLength (string, encoding) {
  if (Buffer.isBuffer(string)) {
    return string.length
  }
  if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {
    return string.byteLength
  }
  if (typeof string !== 'string') {
    throw new TypeError(
      'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' +
      'Received type ' + typeof string
    )
  }

  const len = string.length
  const mustMatch = (arguments.length > 2 && arguments[2] === true)
  if (!mustMatch && len === 0) return 0

  // Use a for loop to avoid recursion
  let loweredCase = false
  for (;;) {
    switch (encoding) {
      case 'ascii':
      case 'latin1':
      case 'binary':
        return len
      case 'utf8':
      case 'utf-8':
        return utf8ToBytes(string).length
      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return len * 2
      case 'hex':
        return len >>> 1
      case 'base64':
        return base64ToBytes(string).length
      default:
        if (loweredCase) {
          return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8
        }
        encoding = ('' + encoding).toLowerCase()
        loweredCase = true
    }
  }
}
Buffer.byteLength = byteLength

function slowToString (encoding, start, end) {
  let loweredCase = false

  // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
  // property of a typed array.

  // This behaves neither like String nor Uint8Array in that we set start/end
  // to their upper/lower bounds if the value passed is out of range.
  // undefined is handled specially as per ECMA-262 6th Edition,
  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
  if (start === undefined || start < 0) {
    start = 0
  }
  // Return early if start > this.length. Done here to prevent potential uint32
  // coercion fail below.
  if (start > this.length) {
    return ''
  }

  if (end === undefined || end > this.length) {
    end = this.length
  }

  if (end <= 0) {
    return ''
  }

  // Force coercion to uint32. This will also coerce falsey/NaN values to 0.
  end >>>= 0
  start >>>= 0

  if (end <= start) {
    return ''
  }

  if (!encoding) encoding = 'utf8'

  while (true) {
    switch (encoding) {
      case 'hex':
        return hexSlice(this, start, end)

      case 'utf8':
      case 'utf-8':
        return utf8Slice(this, start, end)

      case 'ascii':
        return asciiSlice(this, start, end)

      case 'latin1':
      case 'binary':
        return latin1Slice(this, start, end)

      case 'base64':
        return base64Slice(this, start, end)

      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return utf16leSlice(this, start, end)

      default:
        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
        encoding = (encoding + '').toLowerCase()
        loweredCase = true
    }
  }
}

// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)
// to detect a Buffer instance. It's not possible to use `instanceof Buffer`
// reliably in a browserify context because there could be multiple different
// copies of the 'buffer' package in use. This method works even for Buffer
// instances that were created from another copy of the `buffer` package.
// See: https://github.com/feross/buffer/issues/154
Buffer.prototype._isBuffer = true

function swap (b, n, m) {
  const i = b[n]
  b[n] = b[m]
  b[m] = i
}

Buffer.prototype.swap16 = function swap16 () {
  const len = this.length
  if (len % 2 !== 0) {
    throw new RangeError('Buffer size must be a multiple of 16-bits')
  }
  for (let i = 0; i < len; i += 2) {
    swap(this, i, i + 1)
  }
  return this
}

Buffer.prototype.swap32 = function swap32 () {
  const len = this.length
  if (len % 4 !== 0) {
    throw new RangeError('Buffer size must be a multiple of 32-bits')
  }
  for (let i = 0; i < len; i += 4) {
    swap(this, i, i + 3)
    swap(this, i + 1, i + 2)
  }
  return this
}

Buffer.prototype.swap64 = function swap64 () {
  const len = this.length
  if (len % 8 !== 0) {
    throw new RangeError('Buffer size must be a multiple of 64-bits')
  }
  for (let i = 0; i < len; i += 8) {
    swap(this, i, i + 7)
    swap(this, i + 1, i + 6)
    swap(this, i + 2, i + 5)
    swap(this, i + 3, i + 4)
  }
  return this
}

Buffer.prototype.toString = function toString () {
  const length = this.length
  if (length === 0) return ''
  if (arguments.length === 0) return utf8Slice(this, 0, length)
  return slowToString.apply(this, arguments)
}

Buffer.prototype.toLocaleString = Buffer.prototype.toString

Buffer.prototype.equals = function equals (b) {
  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
  if (this === b) return true
  return Buffer.compare(this, b) === 0
}

Buffer.prototype.inspect = function inspect () {
  let str = ''
  const max = exports.INSPECT_MAX_BYTES
  str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()
  if (this.length > max) str += ' ... '
  return '<Buffer ' + str + '>'
}
if (customInspectSymbol) {
  Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect
}

Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
  if (isInstance(target, Uint8Array)) {
    target = Buffer.from(target, target.offset, target.byteLength)
  }
  if (!Buffer.isBuffer(target)) {
    throw new TypeError(
      'The "target" argument must be one of type Buffer or Uint8Array. ' +
      'Received type ' + (typeof target)
    )
  }

  if (start === undefined) {
    start = 0
  }
  if (end === undefined) {
    end = target ? target.length : 0
  }
  if (thisStart === undefined) {
    thisStart = 0
  }
  if (thisEnd === undefined) {
    thisEnd = this.length
  }

  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
    throw new RangeError('out of range index')
  }

  if (thisStart >= thisEnd && start >= end) {
    return 0
  }
  if (thisStart >= thisEnd) {
    return -1
  }
  if (start >= end) {
    return 1
  }

  start >>>= 0
  end >>>= 0
  thisStart >>>= 0
  thisEnd >>>= 0

  if (this === target) return 0

  let x = thisEnd - thisStart
  let y = end - start
  const len = Math.min(x, y)

  const thisCopy = this.slice(thisStart, thisEnd)
  const targetCopy = target.slice(start, end)

  for (let i = 0; i < len; ++i) {
    if (thisCopy[i] !== targetCopy[i]) {
      x = thisCopy[i]
      y = targetCopy[i]
      break
    }
  }

  if (x < y) return -1
  if (y < x) return 1
  return 0
}

// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
//
// Arguments:
// - buffer - a Buffer to search
// - val - a string, Buffer, or number
// - byteOffset - an index into `buffer`; will be clamped to an int32
// - encoding - an optional encoding, relevant is val is a string
// - dir - true for indexOf, false for lastIndexOf
function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
  // Empty buffer means no match
  if (buffer.length === 0) return -1

  // Normalize byteOffset
  if (typeof byteOffset === 'string') {
    encoding = byteOffset
    byteOffset = 0
  } else if (byteOffset > 0x7fffffff) {
    byteOffset = 0x7fffffff
  } else if (byteOffset < -0x80000000) {
    byteOffset = -0x80000000
  }
  byteOffset = +byteOffset // Coerce to Number.
  if (numberIsNaN(byteOffset)) {
    // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
    byteOffset = dir ? 0 : (buffer.length - 1)
  }

  // Normalize byteOffset: negative offsets start from the end of the buffer
  if (byteOffset < 0) byteOffset = buffer.length + byteOffset
  if (byteOffset >= buffer.length) {
    if (dir) return -1
    else byteOffset = buffer.length - 1
  } else if (byteOffset < 0) {
    if (dir) byteOffset = 0
    else return -1
  }

  // Normalize val
  if (typeof val === 'string') {
    val = Buffer.from(val, encoding)
  }

  // Finally, search either indexOf (if dir is true) or lastIndexOf
  if (Buffer.isBuffer(val)) {
    // Special case: looking for empty string/buffer always fails
    if (val.length === 0) {
      return -1
    }
    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
  } else if (typeof val === 'number') {
    val = val & 0xFF // Search for a byte value [0-255]
    if (typeof Uint8Array.prototype.indexOf === 'function') {
      if (dir) {
        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
      } else {
        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
      }
    }
    return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)
  }

  throw new TypeError('val must be string, number or Buffer')
}

function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
  let indexSize = 1
  let arrLength = arr.length
  let valLength = val.length

  if (encoding !== undefined) {
    encoding = String(encoding).toLowerCase()
    if (encoding === 'ucs2' || encoding === 'ucs-2' ||
        encoding === 'utf16le' || encoding === 'utf-16le') {
      if (arr.length < 2 || val.length < 2) {
        return -1
      }
      indexSize = 2
      arrLength /= 2
      valLength /= 2
      byteOffset /= 2
    }
  }

  function read (buf, i) {
    if (indexSize === 1) {
      return buf[i]
    } else {
      return buf.readUInt16BE(i * indexSize)
    }
  }

  let i
  if (dir) {
    let foundIndex = -1
    for (i = byteOffset; i < arrLength; i++) {
      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
        if (foundIndex === -1) foundIndex = i
        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
      } else {
        if (foundIndex !== -1) i -= i - foundIndex
        foundIndex = -1
      }
    }
  } else {
    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
    for (i = byteOffset; i >= 0; i--) {
      let found = true
      for (let j = 0; j < valLength; j++) {
        if (read(arr, i + j) !== read(val, j)) {
          found = false
          break
        }
      }
      if (found) return i
    }
  }

  return -1
}

Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
  return this.indexOf(val, byteOffset, encoding) !== -1
}

Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
}

Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
}

function hexWrite (buf, string, offset, length) {
  offset = Number(offset) || 0
  const remaining = buf.length - offset
  if (!length) {
    length = remaining
  } else {
    length = Number(length)
    if (length > remaining) {
      length = remaining
    }
  }

  const strLen = string.length

  if (length > strLen / 2) {
    length = strLen / 2
  }
  let i
  for (i = 0; i < length; ++i) {
    const parsed = parseInt(string.substr(i * 2, 2), 16)
    if (numberIsNaN(parsed)) return i
    buf[offset + i] = parsed
  }
  return i
}

function utf8Write (buf, string, offset, length) {
  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
}

function asciiWrite (buf, string, offset, length) {
  return blitBuffer(asciiToBytes(string), buf, offset, length)
}

function base64Write (buf, string, offset, length) {
  return blitBuffer(base64ToBytes(string), buf, offset, length)
}

function ucs2Write (buf, string, offset, length) {
  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
}

Buffer.prototype.write = function write (string, offset, length, encoding) {
  // Buffer#write(string)
  if (offset === undefined) {
    encoding = 'utf8'
    length = this.length
    offset = 0
  // Buffer#write(string, encoding)
  } else if (length === undefined && typeof offset === 'string') {
    encoding = offset
    length = this.length
    offset = 0
  // Buffer#write(string, offset[, length][, encoding])
  } else if (isFinite(offset)) {
    offset = offset >>> 0
    if (isFinite(length)) {
      length = length >>> 0
      if (encoding === undefined) encoding = 'utf8'
    } else {
      encoding = length
      length = undefined
    }
  } else {
    throw new Error(
      'Buffer.write(string, encoding, offset[, length]) is no longer supported'
    )
  }

  const remaining = this.length - offset
  if (length === undefined || length > remaining) length = remaining

  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
    throw new RangeError('Attempt to write outside buffer bounds')
  }

  if (!encoding) encoding = 'utf8'

  let loweredCase = false
  for (;;) {
    switch (encoding) {
      case 'hex':
        return hexWrite(this, string, offset, length)

      case 'utf8':
      case 'utf-8':
        return utf8Write(this, string, offset, length)

      case 'ascii':
      case 'latin1':
      case 'binary':
        return asciiWrite(this, string, offset, length)

      case 'base64':
        // Warning: maxLength not taken into account in base64Write
        return base64Write(this, string, offset, length)

      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return ucs2Write(this, string, offset, length)

      default:
        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
        encoding = ('' + encoding).toLowerCase()
        loweredCase = true
    }
  }
}

Buffer.prototype.toJSON = function toJSON () {
  return {
    type: 'Buffer',
    data: Array.prototype.slice.call(this._arr || this, 0)
  }
}

function base64Slice (buf, start, end) {
  if (start === 0 && end === buf.length) {
    return base64.fromByteArray(buf)
  } else {
    return base64.fromByteArray(buf.slice(start, end))
  }
}

function utf8Slice (buf, start, end) {
  end = Math.min(buf.length, end)
  const res = []

  let i = start
  while (i < end) {
    const firstByte = buf[i]
    let codePoint = null
    let bytesPerSequence = (firstByte > 0xEF)
      ? 4
      : (firstByte > 0xDF)
          ? 3
          : (firstByte > 0xBF)
              ? 2
              : 1

    if (i + bytesPerSequence <= end) {
      let secondByte, thirdByte, fourthByte, tempCodePoint

      switch (bytesPerSequence) {
        case 1:
          if (firstByte < 0x80) {
            codePoint = firstByte
          }
          break
        case 2:
          secondByte = buf[i + 1]
          if ((secondByte & 0xC0) === 0x80) {
            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
            if (tempCodePoint > 0x7F) {
              codePoint = tempCodePoint
            }
          }
          break
        case 3:
          secondByte = buf[i + 1]
          thirdByte = buf[i + 2]
          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
              codePoint = tempCodePoint
            }
          }
          break
        case 4:
          secondByte = buf[i + 1]
          thirdByte = buf[i + 2]
          fourthByte = buf[i + 3]
          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
              codePoint = tempCodePoint
            }
          }
      }
    }

    if (codePoint === null) {
      // we did not generate a valid codePoint so insert a
      // replacement char (U+FFFD) and advance only 1 byte
      codePoint = 0xFFFD
      bytesPerSequence = 1
    } else if (codePoint > 0xFFFF) {
      // encode to utf16 (surrogate pair dance)
      codePoint -= 0x10000
      res.push(codePoint >>> 10 & 0x3FF | 0xD800)
      codePoint = 0xDC00 | codePoint & 0x3FF
    }

    res.push(codePoint)
    i += bytesPerSequence
  }

  return decodeCodePointsArray(res)
}

// Based on http://stackoverflow.com/a/22747272/680742, the browser with
// the lowest limit is Chrome, with 0x10000 args.
// We go 1 magnitude less, for safety
const MAX_ARGUMENTS_LENGTH = 0x1000

function decodeCodePointsArray (codePoints) {
  const len = codePoints.length
  if (len <= MAX_ARGUMENTS_LENGTH) {
    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
  }

  // Decode in chunks to avoid "call stack size exceeded".
  let res = ''
  let i = 0
  while (i < len) {
    res += String.fromCharCode.apply(
      String,
      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
    )
  }
  return res
}

function asciiSlice (buf, start, end) {
  let ret = ''
  end = Math.min(buf.length, end)

  for (let i = start; i < end; ++i) {
    ret += String.fromCharCode(buf[i] & 0x7F)
  }
  return ret
}

function latin1Slice (buf, start, end) {
  let ret = ''
  end = Math.min(buf.length, end)

  for (let i = start; i < end; ++i) {
    ret += String.fromCharCode(buf[i])
  }
  return ret
}

function hexSlice (buf, start, end) {
  const len = buf.length

  if (!start || start < 0) start = 0
  if (!end || end < 0 || end > len) end = len

  let out = ''
  for (let i = start; i < end; ++i) {
    out += hexSliceLookupTable[buf[i]]
  }
  return out
}

function utf16leSlice (buf, start, end) {
  const bytes = buf.slice(start, end)
  let res = ''
  // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)
  for (let i = 0; i < bytes.length - 1; i += 2) {
    res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))
  }
  return res
}

Buffer.prototype.slice = function slice (start, end) {
  const len = this.length
  start = ~~start
  end = end === undefined ? len : ~~end

  if (start < 0) {
    start += len
    if (start < 0) start = 0
  } else if (start > len) {
    start = len
  }

  if (end < 0) {
    end += len
    if (end < 0) end = 0
  } else if (end > len) {
    end = len
  }

  if (end < start) end = start

  const newBuf = this.subarray(start, end)
  // Return an augmented `Uint8Array` instance
  Object.setPrototypeOf(newBuf, Buffer.prototype)

  return newBuf
}

/*
 * Need to make sure that buffer isn't trying to write out of bounds.
 */
function checkOffset (offset, ext, length) {
  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
}

Buffer.prototype.readUintLE =
Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  let val = this[offset]
  let mul = 1
  let i = 0
  while (++i < byteLength && (mul *= 0x100)) {
    val += this[offset + i] * mul
  }

  return val
}

Buffer.prototype.readUintBE =
Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) {
    checkOffset(offset, byteLength, this.length)
  }

  let val = this[offset + --byteLength]
  let mul = 1
  while (byteLength > 0 && (mul *= 0x100)) {
    val += this[offset + --byteLength] * mul
  }

  return val
}

Buffer.prototype.readUint8 =
Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 1, this.length)
  return this[offset]
}

Buffer.prototype.readUint16LE =
Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  return this[offset] | (this[offset + 1] << 8)
}

Buffer.prototype.readUint16BE =
Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  return (this[offset] << 8) | this[offset + 1]
}

Buffer.prototype.readUint32LE =
Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return ((this[offset]) |
      (this[offset + 1] << 8) |
      (this[offset + 2] << 16)) +
      (this[offset + 3] * 0x1000000)
}

Buffer.prototype.readUint32BE =
Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset] * 0x1000000) +
    ((this[offset + 1] << 16) |
    (this[offset + 2] << 8) |
    this[offset + 3])
}

Buffer.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE (offset) {
  offset = offset >>> 0
  validateNumber(offset, 'offset')
  const first = this[offset]
  const last = this[offset + 7]
  if (first === undefined || last === undefined) {
    boundsError(offset, this.length - 8)
  }

  const lo = first +
    this[++offset] * 2 ** 8 +
    this[++offset] * 2 ** 16 +
    this[++offset] * 2 ** 24

  const hi = this[++offset] +
    this[++offset] * 2 ** 8 +
    this[++offset] * 2 ** 16 +
    last * 2 ** 24

  return BigInt(lo) + (BigInt(hi) << BigInt(32))
})

Buffer.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE (offset) {
  offset = offset >>> 0
  validateNumber(offset, 'offset')
  const first = this[offset]
  const last = this[offset + 7]
  if (first === undefined || last === undefined) {
    boundsError(offset, this.length - 8)
  }

  const hi = first * 2 ** 24 +
    this[++offset] * 2 ** 16 +
    this[++offset] * 2 ** 8 +
    this[++offset]

  const lo = this[++offset] * 2 ** 24 +
    this[++offset] * 2 ** 16 +
    this[++offset] * 2 ** 8 +
    last

  return (BigInt(hi) << BigInt(32)) + BigInt(lo)
})

Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  let val = this[offset]
  let mul = 1
  let i = 0
  while (++i < byteLength && (mul *= 0x100)) {
    val += this[offset + i] * mul
  }
  mul *= 0x80

  if (val >= mul) val -= Math.pow(2, 8 * byteLength)

  return val
}

Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  let i = byteLength
  let mul = 1
  let val = this[offset + --i]
  while (i > 0 && (mul *= 0x100)) {
    val += this[offset + --i] * mul
  }
  mul *= 0x80

  if (val >= mul) val -= Math.pow(2, 8 * byteLength)

  return val
}

Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 1, this.length)
  if (!(this[offset] & 0x80)) return (this[offset])
  return ((0xff - this[offset] + 1) * -1)
}

Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  const val = this[offset] | (this[offset + 1] << 8)
  return (val & 0x8000) ? val | 0xFFFF0000 : val
}

Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  const val = this[offset + 1] | (this[offset] << 8)
  return (val & 0x8000) ? val | 0xFFFF0000 : val
}

Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset]) |
    (this[offset + 1] << 8) |
    (this[offset + 2] << 16) |
    (this[offset + 3] << 24)
}

Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset] << 24) |
    (this[offset + 1] << 16) |
    (this[offset + 2] << 8) |
    (this[offset + 3])
}

Buffer.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE (offset) {
  offset = offset >>> 0
  validateNumber(offset, 'offset')
  const first = this[offset]
  const last = this[offset + 7]
  if (first === undefined || last === undefined) {
    boundsError(offset, this.length - 8)
  }

  const val = this[offset + 4] +
    this[offset + 5] * 2 ** 8 +
    this[offset + 6] * 2 ** 16 +
    (last << 24) // Overflow

  return (BigInt(val) << BigInt(32)) +
    BigInt(first +
    this[++offset] * 2 ** 8 +
    this[++offset] * 2 ** 16 +
    this[++offset] * 2 ** 24)
})

Buffer.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE (offset) {
  offset = offset >>> 0
  validateNumber(offset, 'offset')
  const first = this[offset]
  const last = this[offset + 7]
  if (first === undefined || last === undefined) {
    boundsError(offset, this.length - 8)
  }

  const val = (first << 24) + // Overflow
    this[++offset] * 2 ** 16 +
    this[++offset] * 2 ** 8 +
    this[++offset]

  return (BigInt(val) << BigInt(32)) +
    BigInt(this[++offset] * 2 ** 24 +
    this[++offset] * 2 ** 16 +
    this[++offset] * 2 ** 8 +
    last)
})

Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)
  return ieee754.read(this, offset, true, 23, 4)
}

Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)
  return ieee754.read(this, offset, false, 23, 4)
}

Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 8, this.length)
  return ieee754.read(this, offset, true, 52, 8)
}

Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 8, this.length)
  return ieee754.read(this, offset, false, 52, 8)
}

function checkInt (buf, value, offset, ext, max, min) {
  if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
  if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
  if (offset + ext > buf.length) throw new RangeError('Index out of range')
}

Buffer.prototype.writeUintLE =
Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) {
    const maxBytes = Math.pow(2, 8 * byteLength) - 1
    checkInt(this, value, offset, byteLength, maxBytes, 0)
  }

  let mul = 1
  let i = 0
  this[offset] = value & 0xFF
  while (++i < byteLength && (mul *= 0x100)) {
    this[offset + i] = (value / mul) & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeUintBE =
Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) {
    const maxBytes = Math.pow(2, 8 * byteLength) - 1
    checkInt(this, value, offset, byteLength, maxBytes, 0)
  }

  let i = byteLength - 1
  let mul = 1
  this[offset + i] = value & 0xFF
  while (--i >= 0 && (mul *= 0x100)) {
    this[offset + i] = (value / mul) & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeUint8 =
Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
  this[offset] = (value & 0xff)
  return offset + 1
}

Buffer.prototype.writeUint16LE =
Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
  this[offset] = (value & 0xff)
  this[offset + 1] = (value >>> 8)
  return offset + 2
}

Buffer.prototype.writeUint16BE =
Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
  this[offset] = (value >>> 8)
  this[offset + 1] = (value & 0xff)
  return offset + 2
}

Buffer.prototype.writeUint32LE =
Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
  this[offset + 3] = (value >>> 24)
  this[offset + 2] = (value >>> 16)
  this[offset + 1] = (value >>> 8)
  this[offset] = (value & 0xff)
  return offset + 4
}

Buffer.prototype.writeUint32BE =
Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
  this[offset] = (value >>> 24)
  this[offset + 1] = (value >>> 16)
  this[offset + 2] = (value >>> 8)
  this[offset + 3] = (value & 0xff)
  return offset + 4
}

function wrtBigUInt64LE (buf, value, offset, min, max) {
  checkIntBI(value, min, max, buf, offset, 7)

  let lo = Number(value & BigInt(0xffffffff))
  buf[offset++] = lo
  lo = lo >> 8
  buf[offset++] = lo
  lo = lo >> 8
  buf[offset++] = lo
  lo = lo >> 8
  buf[offset++] = lo
  let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))
  buf[offset++] = hi
  hi = hi >> 8
  buf[offset++] = hi
  hi = hi >> 8
  buf[offset++] = hi
  hi = hi >> 8
  buf[offset++] = hi
  return offset
}

function wrtBigUInt64BE (buf, value, offset, min, max) {
  checkIntBI(value, min, max, buf, offset, 7)

  let lo = Number(value & BigInt(0xffffffff))
  buf[offset + 7] = lo
  lo = lo >> 8
  buf[offset + 6] = lo
  lo = lo >> 8
  buf[offset + 5] = lo
  lo = lo >> 8
  buf[offset + 4] = lo
  let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))
  buf[offset + 3] = hi
  hi = hi >> 8
  buf[offset + 2] = hi
  hi = hi >> 8
  buf[offset + 1] = hi
  hi = hi >> 8
  buf[offset] = hi
  return offset + 8
}

Buffer.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE (value, offset = 0) {
  return wrtBigUInt64LE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))
})

Buffer.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE (value, offset = 0) {
  return wrtBigUInt64BE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))
})

Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    const limit = Math.pow(2, (8 * byteLength) - 1)

    checkInt(this, value, offset, byteLength, limit - 1, -limit)
  }

  let i = 0
  let mul = 1
  let sub = 0
  this[offset] = value & 0xFF
  while (++i < byteLength && (mul *= 0x100)) {
    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
      sub = 1
    }
    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    const limit = Math.pow(2, (8 * byteLength) - 1)

    checkInt(this, value, offset, byteLength, limit - 1, -limit)
  }

  let i = byteLength - 1
  let mul = 1
  let sub = 0
  this[offset + i] = value & 0xFF
  while (--i >= 0 && (mul *= 0x100)) {
    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
      sub = 1
    }
    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
  if (value < 0) value = 0xff + value + 1
  this[offset] = (value & 0xff)
  return offset + 1
}

Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
  this[offset] = (value & 0xff)
  this[offset + 1] = (value >>> 8)
  return offset + 2
}

Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
  this[offset] = (value >>> 8)
  this[offset + 1] = (value & 0xff)
  return offset + 2
}

Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
  this[offset] = (value & 0xff)
  this[offset + 1] = (value >>> 8)
  this[offset + 2] = (value >>> 16)
  this[offset + 3] = (value >>> 24)
  return offset + 4
}

Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
  if (value < 0) value = 0xffffffff + value + 1
  this[offset] = (value >>> 24)
  this[offset + 1] = (value >>> 16)
  this[offset + 2] = (value >>> 8)
  this[offset + 3] = (value & 0xff)
  return offset + 4
}

Buffer.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE (value, offset = 0) {
  return wrtBigUInt64LE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))
})

Buffer.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE (value, offset = 0) {
  return wrtBigUInt64BE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))
})

function checkIEEE754 (buf, value, offset, ext, max, min) {
  if (offset + ext > buf.length) throw new RangeError('Index out of range')
  if (offset < 0) throw new RangeError('Index out of range')
}

function writeFloat (buf, value, offset, littleEndian, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
  }
  ieee754.write(buf, value, offset, littleEndian, 23, 4)
  return offset + 4
}

Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
  return writeFloat(this, value, offset, true, noAssert)
}

Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
  return writeFloat(this, value, offset, false, noAssert)
}

function writeDouble (buf, value, offset, littleEndian, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
  }
  ieee754.write(buf, value, offset, littleEndian, 52, 8)
  return offset + 8
}

Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
  return writeDouble(this, value, offset, true, noAssert)
}

Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
  return writeDouble(this, value, offset, false, noAssert)
}

// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
Buffer.prototype.copy = function copy (target, targetStart, start, end) {
  if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')
  if (!start) start = 0
  if (!end && end !== 0) end = this.length
  if (targetStart >= target.length) targetStart = target.length
  if (!targetStart) targetStart = 0
  if (end > 0 && end < start) end = start

  // Copy 0 bytes; we're done
  if (end === start) return 0
  if (target.length === 0 || this.length === 0) return 0

  // Fatal error conditions
  if (targetStart < 0) {
    throw new RangeError('targetStart out of bounds')
  }
  if (start < 0 || start >= this.length) throw new RangeError('Index out of range')
  if (end < 0) throw new RangeError('sourceEnd out of bounds')

  // Are we oob?
  if (end > this.length) end = this.length
  if (target.length - targetStart < end - start) {
    end = target.length - targetStart + start
  }

  const len = end - start

  if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {
    // Use built-in when available, missing from IE11
    this.copyWithin(targetStart, start, end)
  } else {
    Uint8Array.prototype.set.call(
      target,
      this.subarray(start, end),
      targetStart
    )
  }

  return len
}

// Usage:
//    buffer.fill(number[, offset[, end]])
//    buffer.fill(buffer[, offset[, end]])
//    buffer.fill(string[, offset[, end]][, encoding])
Buffer.prototype.fill = function fill (val, start, end, encoding) {
  // Handle string cases:
  if (typeof val === 'string') {
    if (typeof start === 'string') {
      encoding = start
      start = 0
      end = this.length
    } else if (typeof end === 'string') {
      encoding = end
      end = this.length
    }
    if (encoding !== undefined && typeof encoding !== 'string') {
      throw new TypeError('encoding must be a string')
    }
    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
      throw new TypeError('Unknown encoding: ' + encoding)
    }
    if (val.length === 1) {
      const code = val.charCodeAt(0)
      if ((encoding === 'utf8' && code < 128) ||
          encoding === 'latin1') {
        // Fast path: If `val` fits into a single byte, use that numeric value.
        val = code
      }
    }
  } else if (typeof val === 'number') {
    val = val & 255
  } else if (typeof val === 'boolean') {
    val = Number(val)
  }

  // Invalid ranges are not set to a default, so can range check early.
  if (start < 0 || this.length < start || this.length < end) {
    throw new RangeError('Out of range index')
  }

  if (end <= start) {
    return this
  }

  start = start >>> 0
  end = end === undefined ? this.length : end >>> 0

  if (!val) val = 0

  let i
  if (typeof val === 'number') {
    for (i = start; i < end; ++i) {
      this[i] = val
    }
  } else {
    const bytes = Buffer.isBuffer(val)
      ? val
      : Buffer.from(val, encoding)
    const len = bytes.length
    if (len === 0) {
      throw new TypeError('The value "' + val +
        '" is invalid for argument "value"')
    }
    for (i = 0; i < end - start; ++i) {
      this[i + start] = bytes[i % len]
    }
  }

  return this
}

// CUSTOM ERRORS
// =============

// Simplified versions from Node, changed for Buffer-only usage
const errors = {}
function E (sym, getMessage, Base) {
  errors[sym] = class NodeError extends Base {
    constructor () {
      super()

      Object.defineProperty(this, 'message', {
        value: getMessage.apply(this, arguments),
        writable: true,
        configurable: true
      })

      // Add the error code to the name to include it in the stack trace.
      this.name = `${this.name} [${sym}]`
      // Access the stack to generate the error message including the error code
      // from the name.
      this.stack // eslint-disable-line no-unused-expressions
      // Reset the name to the actual name.
      delete this.name
    }

    get code () {
      return sym
    }

    set code (value) {
      Object.defineProperty(this, 'code', {
        configurable: true,
        enumerable: true,
        value,
        writable: true
      })
    }

    toString () {
      return `${this.name} [${sym}]: ${this.message}`
    }
  }
}

E('ERR_BUFFER_OUT_OF_BOUNDS',
  function (name) {
    if (name) {
      return `${name} is outside of buffer bounds`
    }

    return 'Attempt to access memory outside buffer bounds'
  }, RangeError)
E('ERR_INVALID_ARG_TYPE',
  function (name, actual) {
    return `The "${name}" argument must be of type number. Received type ${typeof actual}`
  }, TypeError)
E('ERR_OUT_OF_RANGE',
  function (str, range, input) {
    let msg = `The value of "${str}" is out of range.`
    let received = input
    if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {
      received = addNumericalSeparator(String(input))
    } else if (typeof input === 'bigint') {
      received = String(input)
      if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) {
        received = addNumericalSeparator(received)
      }
      received += 'n'
    }
    msg += ` It must be ${range}. Received ${received}`
    return msg
  }, RangeError)

function addNumericalSeparator (val) {
  let res = ''
  let i = val.length
  const start = val[0] === '-' ? 1 : 0
  for (; i >= start + 4; i -= 3) {
    res = `_${val.slice(i - 3, i)}${res}`
  }
  return `${val.slice(0, i)}${res}`
}

// CHECK FUNCTIONS
// ===============

function checkBounds (buf, offset, byteLength) {
  validateNumber(offset, 'offset')
  if (buf[offset] === undefined || buf[offset + byteLength] === undefined) {
    boundsError(offset, buf.length - (byteLength + 1))
  }
}

function checkIntBI (value, min, max, buf, offset, byteLength) {
  if (value > max || value < min) {
    const n = typeof min === 'bigint' ? 'n' : ''
    let range
    if (byteLength > 3) {
      if (min === 0 || min === BigInt(0)) {
        range = `>= 0${n} and < 2${n} ** ${(byteLength + 1) * 8}${n}`
      } else {
        range = `>= -(2${n} ** ${(byteLength + 1) * 8 - 1}${n}) and < 2 ** ` +
                `${(byteLength + 1) * 8 - 1}${n}`
      }
    } else {
      range = `>= ${min}${n} and <= ${max}${n}`
    }
    throw new errors.ERR_OUT_OF_RANGE('value', range, value)
  }
  checkBounds(buf, offset, byteLength)
}

function validateNumber (value, name) {
  if (typeof value !== 'number') {
    throw new errors.ERR_INVALID_ARG_TYPE(name, 'number', value)
  }
}

function boundsError (value, length, type) {
  if (Math.floor(value) !== value) {
    validateNumber(value, type)
    throw new errors.ERR_OUT_OF_RANGE(type || 'offset', 'an integer', value)
  }

  if (length < 0) {
    throw new errors.ERR_BUFFER_OUT_OF_BOUNDS()
  }

  throw new errors.ERR_OUT_OF_RANGE(type || 'offset',
                                    `>= ${type ? 1 : 0} and <= ${length}`,
                                    value)
}

// HELPER FUNCTIONS
// ================

const INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g

function base64clean (str) {
  // Node takes equal signs as end of the Base64 encoding
  str = str.split('=')[0]
  // Node strips out invalid characters like \n and \t from the string, base64-js does not
  str = str.trim().replace(INVALID_BASE64_RE, '')
  // Node converts strings with length < 2 to ''
  if (str.length < 2) return ''
  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
  while (str.length % 4 !== 0) {
    str = str + '='
  }
  return str
}

function utf8ToBytes (string, units) {
  units = units || Infinity
  let codePoint
  const length = string.length
  let leadSurrogate = null
  const bytes = []

  for (let i = 0; i < length; ++i) {
    codePoint = string.charCodeAt(i)

    // is surrogate component
    if (codePoint > 0xD7FF && codePoint < 0xE000) {
      // last char was a lead
      if (!leadSurrogate) {
        // no lead yet
        if (codePoint > 0xDBFF) {
          // unexpected trail
          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
          continue
        } else if (i + 1 === length) {
          // unpaired lead
          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
          continue
        }

        // valid lead
        leadSurrogate = codePoint

        continue
      }

      // 2 leads in a row
      if (codePoint < 0xDC00) {
        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
        leadSurrogate = codePoint
        continue
      }

      // valid surrogate pair
      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
    } else if (leadSurrogate) {
      // valid bmp char, but last char was a lead
      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
    }

    leadSurrogate = null

    // encode utf8
    if (codePoint < 0x80) {
      if ((units -= 1) < 0) break
      bytes.push(codePoint)
    } else if (codePoint < 0x800) {
      if ((units -= 2) < 0) break
      bytes.push(
        codePoint >> 0x6 | 0xC0,
        codePoint & 0x3F | 0x80
      )
    } else if (codePoint < 0x10000) {
      if ((units -= 3) < 0) break
      bytes.push(
        codePoint >> 0xC | 0xE0,
        codePoint >> 0x6 & 0x3F | 0x80,
        codePoint & 0x3F | 0x80
      )
    } else if (codePoint < 0x110000) {
      if ((units -= 4) < 0) break
      bytes.push(
        codePoint >> 0x12 | 0xF0,
        codePoint >> 0xC & 0x3F | 0x80,
        codePoint >> 0x6 & 0x3F | 0x80,
        codePoint & 0x3F | 0x80
      )
    } else {
      throw new Error('Invalid code point')
    }
  }

  return bytes
}

function asciiToBytes (str) {
  const byteArray = []
  for (let i = 0; i < str.length; ++i) {
    // Node's code seems to be doing this and not & 0x7F..
    byteArray.push(str.charCodeAt(i) & 0xFF)
  }
  return byteArray
}

function utf16leToBytes (str, units) {
  let c, hi, lo
  const byteArray = []
  for (let i = 0; i < str.length; ++i) {
    if ((units -= 2) < 0) break

    c = str.charCodeAt(i)
    hi = c >> 8
    lo = c % 256
    byteArray.push(lo)
    byteArray.push(hi)
  }

  return byteArray
}

function base64ToBytes (str) {
  return base64.toByteArray(base64clean(str))
}

function blitBuffer (src, dst, offset, length) {
  let i
  for (i = 0; i < length; ++i) {
    if ((i + offset >= dst.length) || (i >= src.length)) break
    dst[i + offset] = src[i]
  }
  return i
}

// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass
// the `instanceof` check but they should be treated as of that type.
// See: https://github.com/feross/buffer/issues/166
function isInstance (obj, type) {
  return obj instanceof type ||
    (obj != null && obj.constructor != null && obj.constructor.name != null &&
      obj.constructor.name === type.name)
}
function numberIsNaN (obj) {
  // For IE11 support
  return obj !== obj // eslint-disable-line no-self-compare
}

// Create lookup table for `toString('hex')`
// See: https://github.com/feross/buffer/issues/219
const hexSliceLookupTable = (function () {
  const alphabet = '0123456789abcdef'
  const table = new Array(256)
  for (let i = 0; i < 16; ++i) {
    const i16 = i * 16
    for (let j = 0; j < 16; ++j) {
      table[i16 + j] = alphabet[i] + alphabet[j]
    }
  }
  return table
})()

// Return not function with Error if BigInt not supported
function defineBigIntMethod (fn) {
  return typeof BigInt === 'undefined' ? BufferBigIntNotDefined : fn
}

function BufferBigIntNotDefined () {
  throw new Error('BigInt not supported')
}
{
  "name": "buffer",
  "description": "Node.js Buffer API, for the browser",
  "version": "6.0.3",
  "author": {
    "name": "Feross Aboukhadijeh",
    "email": "feross@feross.org",
    "url": "https://feross.org"
  },
  "dependencies": {
    "base64-js": "^1.3.1",
    "ieee754": "^1.2.1"
  },
  "devDependencies": {
    "airtap": "^3.0.0",
    "benchmark": "^2.1.4",
    "browserify": "^17.0.0",
    "concat-stream": "^2.0.0",
    "hyperquest": "^2.1.3",
    "is-buffer": "^2.0.5",
    "is-nan": "^1.3.0",
    "split": "^1.0.1",
    "standard": "*",
    "tape": "^5.0.1",
    "through2": "^4.0.2",
    "uglify-js": "^3.11.5"
  },
  "homepage": "https://github.com/feross/buffer",
  "license": "MIT",
  "main": "index.js",
  "types": "index.d.ts",
  "repository": {
    "type": "git",
    "url": "git://github.com/feross/buffer.git"
  },
  "standard": {
    "ignore": [
      "test/node/**/*.js",
      "test/common.js",
      "test/_polyfill.js",
      "perf/**/*.js"
    ]
  },
  "funding": [
    {
      "type": "github",
      "url": "https://github.com/sponsors/feross"
    },
    {
      "type": "patreon",
      "url": "https://www.patreon.com/feross"
    },
    {
      "type": "consulting",
      "url": "https://feross.org/support"
    }
  ]
}Copyright (c) 2013, GoInstant Inc., a salesforce.com company
All rights reserved.

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.

* Neither the name of salesforce.com, nor GoInstant, nor the names of its contributors may 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 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.
/*jshint node:true */
'use strict';
var Buffer = require('buffer').Buffer; // browserify
var SlowBuffer = require('buffer').SlowBuffer;

module.exports = bufferEq;

function bufferEq(a, b) {

  // shortcutting on type is necessary for correctness
  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
    return false;
  }

  // buffer sizes should be well-known information, so despite this
  // shortcutting, it doesn't leak any information about the *contents* of the
  // buffers.
  if (a.length !== b.length) {
    return false;
  }

  var c = 0;
  for (var i = 0; i < a.length; i++) {
    /*jshint bitwise:false */
    c |= a[i] ^ b[i]; // XOR
  }
  return c === 0;
}

bufferEq.install = function() {
  Buffer.prototype.equal = SlowBuffer.prototype.equal = function equal(that) {
    return bufferEq(this, that);
  };
};

var origBufEqual = Buffer.prototype.equal;
var origSlowBufEqual = SlowBuffer.prototype.equal;
bufferEq.restore = function() {
  Buffer.prototype.equal = origBufEqual;
  SlowBuffer.prototype.equal = origSlowBufEqual;
};
{
  "name": "buffer-equal-constant-time",
  "version": "1.0.1",
  "description": "Constant-time comparison of Buffers",
  "main": "index.js",
  "repository": "git@github.com:goinstant/buffer-equal-constant-time.git",
  "author": "GoInstant Inc., a salesforce.com company",
  "license": "BSD-3-Clause",
  "devDependencies": {
    "mocha": "~1.15.1"
  }
}The MIT License (MIT)

Copyright (c) 2015 Loopline Systems

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": "builder-util-runtime",
  "version": "9.0.3",
  "main": "out/index.js",
  "author": "Vladimir Krivosheev",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/electron-userland/electron-builder.git",
    "directory": "packages/builder-util-runtime"
  },
  "homepage": "https://github.com/electron-userland/electron-builder",
  "files": [
    "out"
  ],
  "engines": {
    "node": ">=12.0.0"
  },
  "dependencies": {
    "debug": "^4.3.4",
    "sax": "^1.2.4"
  },
  "devDependencies": {
    "@types/debug": "4.1.7",
    "@types/sax": "1.2.3"
  },
  "types": "./out/index.d.ts"
}"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CancellationError = exports.CancellationToken = void 0;
const events_1 = require("events");
class CancellationToken extends events_1.EventEmitter {
    // babel cannot compile ... correctly for super calls
    constructor(parent) {
        super();
        this.parentCancelHandler = null;
        this._parent = null;
        this._cancelled = false;
        if (parent != null) {
            this.parent = parent;
        }
    }
    get cancelled() {
        return this._cancelled || (this._parent != null && this._parent.cancelled);
    }
    set parent(value) {
        this.removeParentCancelHandler();
        this._parent = value;
        this.parentCancelHandler = () => this.cancel();
        this._parent.onCancel(this.parentCancelHandler);
    }
    cancel() {
        this._cancelled = true;
        this.emit("cancel");
    }
    onCancel(handler) {
        if (this.cancelled) {
            handler();
        }
        else {
            this.once("cancel", handler);
        }
    }
    createPromise(callback) {
        if (this.cancelled) {
            return Promise.reject(new CancellationError());
        }
        const finallyHandler = () => {
            if (cancelHandler != null) {
                try {
                    this.removeListener("cancel", cancelHandler);
                    cancelHandler = null;
                }
                catch (ignore) {
                    // ignore
                }
            }
        };
        let cancelHandler = null;
        return new Promise((resolve, reject) => {
            let addedCancelHandler = null;
            cancelHandler = () => {
                try {
                    if (addedCancelHandler != null) {
                        addedCancelHandler();
                        addedCancelHandler = null;
                    }
                }
                finally {
                    reject(new CancellationError());
                }
            };
            if (this.cancelled) {
                cancelHandler();
                return;
            }
            this.onCancel(cancelHandler);
            callback(resolve, reject, (callback) => {
                addedCancelHandler = callback;
            });
        })
            .then(it => {
            finallyHandler();
            return it;
        })
            .catch(e => {
            finallyHandler();
            throw e;
        });
    }
    removeParentCancelHandler() {
        const parent = this._parent;
        if (parent != null && this.parentCancelHandler != null) {
            parent.removeListener("cancel", this.parentCancelHandler);
            this.parentCancelHandler = null;
        }
    }
    dispose() {
        try {
            this.removeParentCancelHandler();
        }
        finally {
            this.removeAllListeners();
            this._parent = null;
        }
    }
}
exports.CancellationToken = CancellationToken;
class CancellationError extends Error {
    constructor() {
        super("cancelled");
    }
}
exports.CancellationError = CancellationError;
//# sourceMappingURL=CancellationToken.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ProgressCallbackTransform = void 0;
const stream_1 = require("stream");
class ProgressCallbackTransform extends stream_1.Transform {
    constructor(total, cancellationToken, onProgress) {
        super();
        this.total = total;
        this.cancellationToken = cancellationToken;
        this.onProgress = onProgress;
        this.start = Date.now();
        this.transferred = 0;
        this.delta = 0;
        this.nextUpdate = this.start + 1000;
    }
    _transform(chunk, encoding, callback) {
        if (this.cancellationToken.cancelled) {
            callback(new Error("cancelled"), null);
            return;
        }
        this.transferred += chunk.length;
        this.delta += chunk.length;
        const now = Date.now();
        if (now >= this.nextUpdate && this.transferred !== this.total /* will be emitted on _flush */) {
            this.nextUpdate = now + 1000;
            this.onProgress({
                total: this.total,
                delta: this.delta,
                transferred: this.transferred,
                percent: (this.transferred / this.total) * 100,
                bytesPerSecond: Math.round(this.transferred / ((now - this.start) / 1000)),
            });
            this.delta = 0;
        }
        callback(null, chunk);
    }
    _flush(callback) {
        if (this.cancellationToken.cancelled) {
            callback(new Error("cancelled"));
            return;
        }
        this.onProgress({
            total: this.total,
            delta: this.delta,
            transferred: this.total,
            percent: 100,
            bytesPerSecond: Math.round(this.transferred / ((Date.now() - this.start) / 1000)),
        });
        this.delta = 0;
        callback(null);
    }
}
exports.ProgressCallbackTransform = ProgressCallbackTransform;
//# sourceMappingURL=ProgressCallbackTransform.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=blockMapApi.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.safeStringifyJson = exports.configureRequestOptions = exports.safeGetHeader = exports.DigestTransform = exports.configureRequestUrl = exports.configureRequestOptionsFromUrl = exports.HttpExecutor = exports.parseJson = exports.HttpError = exports.createHttpError = void 0;
const crypto_1 = require("crypto");
const debug_1 = require("debug");
const fs_1 = require("fs");
const stream_1 = require("stream");
const url_1 = require("url");
const CancellationToken_1 = require("./CancellationToken");
const index_1 = require("./index");
const ProgressCallbackTransform_1 = require("./ProgressCallbackTransform");
const debug = debug_1.default("electron-builder");
function createHttpError(response, description = null) {
    return new HttpError(response.statusCode || -1, `${response.statusCode} ${response.statusMessage}` +
        (description == null ? "" : "\n" + JSON.stringify(description, null, "  ")) +
        "\nHeaders: " +
        safeStringifyJson(response.headers), description);
}
exports.createHttpError = createHttpError;
const HTTP_STATUS_CODES = new Map([
    [429, "Too many requests"],
    [400, "Bad request"],
    [403, "Forbidden"],
    [404, "Not found"],
    [405, "Method not allowed"],
    [406, "Not acceptable"],
    [408, "Request timeout"],
    [413, "Request entity too large"],
    [500, "Internal server error"],
    [502, "Bad gateway"],
    [503, "Service unavailable"],
    [504, "Gateway timeout"],
    [505, "HTTP version not supported"],
]);
class HttpError extends Error {
    constructor(statusCode, message = `HTTP error: ${HTTP_STATUS_CODES.get(statusCode) || statusCode}`, description = null) {
        super(message);
        this.statusCode = statusCode;
        this.description = description;
        this.name = "HttpError";
        this.code = `HTTP_ERROR_${statusCode}`;
    }
    isServerError() {
        return this.statusCode >= 500 && this.statusCode <= 599;
    }
}
exports.HttpError = HttpError;
function parseJson(result) {
    return result.then(it => (it == null || it.length === 0 ? null : JSON.parse(it)));
}
exports.parseJson = parseJson;
class HttpExecutor {
    constructor() {
        this.maxRedirects = 10;
    }
    request(options, cancellationToken = new CancellationToken_1.CancellationToken(), data) {
        configureRequestOptions(options);
        const json = data == null ? undefined : JSON.stringify(data);
        const encodedData = json ? Buffer.from(json) : undefined;
        if (encodedData != null) {
            debug(json);
            const { headers, ...opts } = options;
            options = {
                method: "post",
                headers: {
                    "Content-Type": "application/json",
                    "Content-Length": encodedData.length,
                    ...headers,
                },
                ...opts,
            };
        }
        return this.doApiRequest(options, cancellationToken, it => it.end(encodedData));
    }
    doApiRequest(options, cancellationToken, requestProcessor, redirectCount = 0) {
        if (debug.enabled) {
            debug(`Request: ${safeStringifyJson(options)}`);
        }
        return cancellationToken.createPromise((resolve, reject, onCancel) => {
            const request = this.createRequest(options, (response) => {
                try {
                    this.handleResponse(response, options, cancellationToken, resolve, reject, redirectCount, requestProcessor);
                }
                catch (e) {
                    reject(e);
                }
            });
            this.addErrorAndTimeoutHandlers(request, reject);
            this.addRedirectHandlers(request, options, reject, redirectCount, options => {
                this.doApiRequest(options, cancellationToken, requestProcessor, redirectCount).then(resolve).catch(reject);
            });
            requestProcessor(request, reject);
            onCancel(() => request.abort());
        });
    }
    // noinspection JSUnusedLocalSymbols
    // eslint-disable-next-line
    addRedirectHandlers(request, options, reject, redirectCount, handler) {
        // not required for NodeJS
    }
    addErrorAndTimeoutHandlers(request, reject) {
        this.addTimeOutHandler(request, reject);
        request.on("error", reject);
        request.on("aborted", () => {
            reject(new Error("Request has been aborted by the server"));
        });
    }
    handleResponse(response, options, cancellationToken, resolve, reject, redirectCount, requestProcessor) {
        var _a;
        if (debug.enabled) {
            debug(`Response: ${response.statusCode} ${response.statusMessage}, request options: ${safeStringifyJson(options)}`);
        }
        // we handle any other >= 400 error on request end (read detailed message in the response body)
        if (response.statusCode === 404) {
            // error is clear, we don't need to read detailed error description
            reject(createHttpError(response, `method: ${options.method || "GET"} url: ${options.protocol || "https:"}//${options.hostname}${options.port ? `:${options.port}` : ""}${options.path}

Please double check that your authentication token is correct. Due to security reasons, actual status maybe not reported, but 404.
`));
            return;
        }
        else if (response.statusCode === 204) {
            // on DELETE request
            resolve();
            return;
        }
        const code = (_a = response.statusCode) !== null && _a !== void 0 ? _a : 0;
        const shouldRedirect = code >= 300 && code < 400;
        const redirectUrl = safeGetHeader(response, "location");
        if (shouldRedirect && redirectUrl != null) {
            if (redirectCount > this.maxRedirects) {
                reject(this.createMaxRedirectError());
                return;
            }
            this.doApiRequest(HttpExecutor.prepareRedirectUrlOptions(redirectUrl, options), cancellationToken, requestProcessor, redirectCount).then(resolve).catch(reject);
            return;
        }
        response.setEncoding("utf8");
        let data = "";
        response.on("error", reject);
        response.on("data", (chunk) => (data += chunk));
        response.on("end", () => {
            try {
                if (response.statusCode != null && response.statusCode >= 400) {
                    const contentType = safeGetHeader(response, "content-type");
                    const isJson = contentType != null && (Array.isArray(contentType) ? contentType.find(it => it.includes("json")) != null : contentType.includes("json"));
                    reject(createHttpError(response, `method: ${options.method || "GET"} url: ${options.protocol || "https:"}//${options.hostname}${options.port ? `:${options.port}` : ""}${options.path}

          Data:
          ${isJson ? JSON.stringify(JSON.parse(data)) : data}
          `));
                }
                else {
                    resolve(data.length === 0 ? null : data);
                }
            }
            catch (e) {
                reject(e);
            }
        });
    }
    async downloadToBuffer(url, options) {
        return await options.cancellationToken.createPromise((resolve, reject, onCancel) => {
            let result = null;
            const requestOptions = {
                headers: options.headers || undefined,
                // because PrivateGitHubProvider requires HttpExecutor.prepareRedirectUrlOptions logic, so, we need to redirect manually
                redirect: "manual",
            };
            configureRequestUrl(url, requestOptions);
            configureRequestOptions(requestOptions);
            this.doDownload(requestOptions, {
                destination: null,
                options,
                onCancel,
                callback: error => {
                    if (error == null) {
                        resolve(result);
                    }
                    else {
                        reject(error);
                    }
                },
                responseHandler: (response, callback) => {
                    const contentLength = safeGetHeader(response, "content-length");
                    let position = -1;
                    if (contentLength != null) {
                        const size = parseInt(contentLength, 10);
                        if (size > 0) {
                            if (size > 524288000) {
                                callback(new Error("Maximum allowed size is 500 MB"));
                                return;
                            }
                            result = Buffer.alloc(size);
                            position = 0;
                        }
                    }
                    response.on("data", (chunk) => {
                        if (position !== -1) {
                            chunk.copy(result, position);
                            position += chunk.length;
                        }
                        else if (result == null) {
                            result = chunk;
                        }
                        else {
                            if (result.length > 524288000) {
                                callback(new Error("Maximum allowed size is 500 MB"));
                                return;
                            }
                            result = Buffer.concat([result, chunk]);
                        }
                    });
                    response.on("end", () => {
                        if (result != null && position !== -1 && position !== result.length) {
                            callback(new Error(`Received data length ${position} is not equal to expected ${result.length}`));
                        }
                        else {
                            callback(null);
                        }
                    });
                },
            }, 0);
        });
    }
    doDownload(requestOptions, options, redirectCount) {
        const request = this.createRequest(requestOptions, (response) => {
            if (response.statusCode >= 400) {
                options.callback(new Error(`Cannot download "${requestOptions.protocol || "https:"}//${requestOptions.hostname}${requestOptions.path}", status ${response.statusCode}: ${response.statusMessage}`));
                return;
            }
            // It is possible for the response stream to fail, e.g. when a network is lost while
            // response stream is in progress. Stop waiting and reject so consumer can catch the error.
            response.on("error", options.callback);
            // this code not relevant for Electron (redirect event instead handled)
            const redirectUrl = safeGetHeader(response, "location");
            if (redirectUrl != null) {
                if (redirectCount < this.maxRedirects) {
                    this.doDownload(HttpExecutor.prepareRedirectUrlOptions(redirectUrl, requestOptions), options, redirectCount++);
                }
                else {
                    options.callback(this.createMaxRedirectError());
                }
                return;
            }
            if (options.responseHandler == null) {
                configurePipes(options, response);
            }
            else {
                options.responseHandler(response, options.callback);
            }
        });
        this.addErrorAndTimeoutHandlers(request, options.callback);
        this.addRedirectHandlers(request, requestOptions, options.callback, redirectCount, requestOptions => {
            this.doDownload(requestOptions, options, redirectCount++);
        });
        request.end();
    }
    createMaxRedirectError() {
        return new Error(`Too many redirects (> ${this.maxRedirects})`);
    }
    addTimeOutHandler(request, callback) {
        request.on("socket", (socket) => {
            socket.setTimeout(60 * 1000, () => {
                request.abort();
                callback(new Error("Request timed out"));
            });
        });
    }
    static prepareRedirectUrlOptions(redirectUrl, options) {
        const newOptions = configureRequestOptionsFromUrl(redirectUrl, { ...options });
        const headers = newOptions.headers;
        if (headers === null || headers === void 0 ? void 0 : headers.authorization) {
            const parsedNewUrl = new url_1.URL(redirectUrl);
            if (parsedNewUrl.hostname.endsWith(".amazonaws.com") || parsedNewUrl.searchParams.has("X-Amz-Credential")) {
                delete headers.authorization;
            }
        }
        return newOptions;
    }
    static retryOnServerError(task, maxRetries = 3) {
        for (let attemptNumber = 0;; attemptNumber++) {
            try {
                return task();
            }
            catch (e) {
                if (attemptNumber < maxRetries && ((e instanceof HttpError && e.isServerError()) || e.code === "EPIPE")) {
                    continue;
                }
                throw e;
            }
        }
    }
}
exports.HttpExecutor = HttpExecutor;
function configureRequestOptionsFromUrl(url, options) {
    const result = configureRequestOptions(options);
    configureRequestUrl(new url_1.URL(url), result);
    return result;
}
exports.configureRequestOptionsFromUrl = configureRequestOptionsFromUrl;
function configureRequestUrl(url, options) {
    options.protocol = url.protocol;
    options.hostname = url.hostname;
    if (url.port) {
        options.port = url.port;
    }
    else if (options.port) {
        delete options.port;
    }
    options.path = url.pathname + url.search;
}
exports.configureRequestUrl = configureRequestUrl;
class DigestTransform extends stream_1.Transform {
    constructor(expected, algorithm = "sha512", encoding = "base64") {
        super();
        this.expected = expected;
        this.algorithm = algorithm;
        this.encoding = encoding;
        this._actual = null;
        this.isValidateOnEnd = true;
        this.digester = crypto_1.createHash(algorithm);
    }
    // noinspection JSUnusedGlobalSymbols
    get actual() {
        return this._actual;
    }
    // noinspection JSUnusedGlobalSymbols
    _transform(chunk, encoding, callback) {
        this.digester.update(chunk);
        callback(null, chunk);
    }
    // noinspection JSUnusedGlobalSymbols
    _flush(callback) {
        this._actual = this.digester.digest(this.encoding);
        if (this.isValidateOnEnd) {
            try {
                this.validate();
            }
            catch (e) {
                callback(e);
                return;
            }
        }
        callback(null);
    }
    validate() {
        if (this._actual == null) {
            throw index_1.newError("Not finished yet", "ERR_STREAM_NOT_FINISHED");
        }
        if (this._actual !== this.expected) {
            throw index_1.newError(`${this.algorithm} checksum mismatch, expected ${this.expected}, got ${this._actual}`, "ERR_CHECKSUM_MISMATCH");
        }
        return null;
    }
}
exports.DigestTransform = DigestTransform;
function checkSha2(sha2Header, sha2, callback) {
    if (sha2Header != null && sha2 != null && sha2Header !== sha2) {
        callback(new Error(`checksum mismatch: expected ${sha2} but got ${sha2Header} (X-Checksum-Sha2 header)`));
        return false;
    }
    return true;
}
function safeGetHeader(response, headerKey) {
    const value = response.headers[headerKey];
    if (value == null) {
        return null;
    }
    else if (Array.isArray(value)) {
        // electron API
        return value.length === 0 ? null : value[value.length - 1];
    }
    else {
        return value;
    }
}
exports.safeGetHeader = safeGetHeader;
function configurePipes(options, response) {
    if (!checkSha2(safeGetHeader(response, "X-Checksum-Sha2"), options.options.sha2, options.callback)) {
        return;
    }
    const streams = [];
    if (options.options.onProgress != null) {
        const contentLength = safeGetHeader(response, "content-length");
        if (contentLength != null) {
            streams.push(new ProgressCallbackTransform_1.ProgressCallbackTransform(parseInt(contentLength, 10), options.options.cancellationToken, options.options.onProgress));
        }
    }
    const sha512 = options.options.sha512;
    if (sha512 != null) {
        streams.push(new DigestTransform(sha512, "sha512", sha512.length === 128 && !sha512.includes("+") && !sha512.includes("Z") && !sha512.includes("=") ? "hex" : "base64"));
    }
    else if (options.options.sha2 != null) {
        streams.push(new DigestTransform(options.options.sha2, "sha256", "hex"));
    }
    const fileOut = fs_1.createWriteStream(options.destination);
    streams.push(fileOut);
    let lastStream = response;
    for (const stream of streams) {
        stream.on("error", (error) => {
            if (!options.options.cancellationToken.cancelled) {
                options.callback(error);
            }
        });
        lastStream = lastStream.pipe(stream);
    }
    fileOut.on("finish", () => {
        ;
        fileOut.close(options.callback);
    });
}
function configureRequestOptions(options, token, method) {
    if (method != null) {
        options.method = method;
    }
    options.headers = { ...options.headers };
    const headers = options.headers;
    if (token != null) {
        ;
        headers.authorization = token.startsWith("Basic") || token.startsWith("Bearer") ? token : `token ${token}`;
    }
    if (headers["User-Agent"] == null) {
        headers["User-Agent"] = "electron-builder";
    }
    if (method == null || method === "GET" || headers["Cache-Control"] == null) {
        headers["Cache-Control"] = "no-cache";
    }
    // do not specify for node (in any case we use https module)
    if (options.protocol == null && process.versions.electron != null) {
        options.protocol = "https:";
    }
    return options;
}
exports.configureRequestOptions = configureRequestOptions;
function safeStringifyJson(data, skippedNames) {
    return JSON.stringify(data, (name, value) => {
        if (name.endsWith("Authorization") ||
            name.endsWith("authorization") ||
            name.endsWith("Password") ||
            name.endsWith("PASSWORD") ||
            name.endsWith("Token") ||
            name.includes("password") ||
            name.includes("token") ||
            (skippedNames != null && skippedNames.has(name))) {
            return "<stripped sensitive data>";
        }
        return value;
    }, 2);
}
exports.safeStringifyJson = safeStringifyJson;
//# sourceMappingURL=httpExecutor.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.newError = exports.asArray = exports.CURRENT_APP_PACKAGE_FILE_NAME = exports.CURRENT_APP_INSTALLER_FILE_NAME = exports.XElement = exports.parseXml = exports.ProgressCallbackTransform = exports.UUID = exports.parseDn = exports.githubUrl = exports.getS3LikeProviderBaseUrl = exports.configureRequestUrl = exports.parseJson = exports.safeStringifyJson = exports.configureRequestOptionsFromUrl = exports.configureRequestOptions = exports.safeGetHeader = exports.DigestTransform = exports.HttpExecutor = exports.createHttpError = exports.HttpError = exports.CancellationError = exports.CancellationToken = void 0;
var CancellationToken_1 = require("./CancellationToken");
Object.defineProperty(exports, "CancellationToken", { enumerable: true, get: function () { return CancellationToken_1.CancellationToken; } });
Object.defineProperty(exports, "CancellationError", { enumerable: true, get: function () { return CancellationToken_1.CancellationError; } });
var httpExecutor_1 = require("./httpExecutor");
Object.defineProperty(exports, "HttpError", { enumerable: true, get: function () { return httpExecutor_1.HttpError; } });
Object.defineProperty(exports, "createHttpError", { enumerable: true, get: function () { return httpExecutor_1.createHttpError; } });
Object.defineProperty(exports, "HttpExecutor", { enumerable: true, get: function () { return httpExecutor_1.HttpExecutor; } });
Object.defineProperty(exports, "DigestTransform", { enumerable: true, get: function () { return httpExecutor_1.DigestTransform; } });
Object.defineProperty(exports, "safeGetHeader", { enumerable: true, get: function () { return httpExecutor_1.safeGetHeader; } });
Object.defineProperty(exports, "configureRequestOptions", { enumerable: true, get: function () { return httpExecutor_1.configureRequestOptions; } });
Object.defineProperty(exports, "configureRequestOptionsFromUrl", { enumerable: true, get: function () { return httpExecutor_1.configureRequestOptionsFromUrl; } });
Object.defineProperty(exports, "safeStringifyJson", { enumerable: true, get: function () { return httpExecutor_1.safeStringifyJson; } });
Object.defineProperty(exports, "parseJson", { enumerable: true, get: function () { return httpExecutor_1.parseJson; } });
Object.defineProperty(exports, "configureRequestUrl", { enumerable: true, get: function () { return httpExecutor_1.configureRequestUrl; } });
var publishOptions_1 = require("./publishOptions");
Object.defineProperty(exports, "getS3LikeProviderBaseUrl", { enumerable: true, get: function () { return publishOptions_1.getS3LikeProviderBaseUrl; } });
Object.defineProperty(exports, "githubUrl", { enumerable: true, get: function () { return publishOptions_1.githubUrl; } });
var rfc2253Parser_1 = require("./rfc2253Parser");
Object.defineProperty(exports, "parseDn", { enumerable: true, get: function () { return rfc2253Parser_1.parseDn; } });
var uuid_1 = require("./uuid");
Object.defineProperty(exports, "UUID", { enumerable: true, get: function () { return uuid_1.UUID; } });
var ProgressCallbackTransform_1 = require("./ProgressCallbackTransform");
Object.defineProperty(exports, "ProgressCallbackTransform", { enumerable: true, get: function () { return ProgressCallbackTransform_1.ProgressCallbackTransform; } });
var xml_1 = require("./xml");
Object.defineProperty(exports, "parseXml", { enumerable: true, get: function () { return xml_1.parseXml; } });
Object.defineProperty(exports, "XElement", { enumerable: true, get: function () { return xml_1.XElement; } });
// nsis
exports.CURRENT_APP_INSTALLER_FILE_NAME = "installer.exe";
// nsis-web
exports.CURRENT_APP_PACKAGE_FILE_NAME = "package.7z";
function asArray(v) {
    if (v == null) {
        return [];
    }
    else if (Array.isArray(v)) {
        return v;
    }
    else {
        return [v];
    }
}
exports.asArray = asArray;
function newError(message, code) {
    const error = new Error(message);
    error.code = code;
    return error;
}
exports.newError = newError;
//# sourceMappingURL=index.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getS3LikeProviderBaseUrl = exports.githubUrl = void 0;
/** @private */
function githubUrl(options, defaultHost = "github.com") {
    return `${options.protocol || "https"}://${options.host || defaultHost}`;
}
exports.githubUrl = githubUrl;
function getS3LikeProviderBaseUrl(configuration) {
    const provider = configuration.provider;
    if (provider === "s3") {
        return s3Url(configuration);
    }
    if (provider === "spaces") {
        return spacesUrl(configuration);
    }
    throw new Error(`Not supported provider: ${provider}`);
}
exports.getS3LikeProviderBaseUrl = getS3LikeProviderBaseUrl;
function s3Url(options) {
    let url;
    if (options.endpoint != null) {
        url = `${options.endpoint}/${options.bucket}`;
    }
    else if (options.bucket.includes(".")) {
        if (options.region == null) {
            throw new Error(`Bucket name "${options.bucket}" includes a dot, but S3 region is missing`);
        }
        // special case, see http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro
        if (options.region === "us-east-1") {
            url = `https://s3.amazonaws.com/${options.bucket}`;
        }
        else {
            url = `https://s3-${options.region}.amazonaws.com/${options.bucket}`;
        }
    }
    else if (options.region === "cn-north-1") {
        url = `https://${options.bucket}.s3.${options.region}.amazonaws.com.cn`;
    }
    else {
        url = `https://${options.bucket}.s3.amazonaws.com`;
    }
    return appendPath(url, options.path);
}
function appendPath(url, p) {
    if (p != null && p.length > 0) {
        if (!p.startsWith("/")) {
            url += "/";
        }
        url += p;
    }
    return url;
}
function spacesUrl(options) {
    if (options.name == null) {
        throw new Error(`name is missing`);
    }
    if (options.region == null) {
        throw new Error(`region is missing`);
    }
    return appendPath(`https://${options.name}.${options.region}.digitaloceanspaces.com`, options.path);
}
//# sourceMappingURL=publishOptions.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseDn = void 0;
function parseDn(seq) {
    let quoted = false;
    let key = null;
    let token = "";
    let nextNonSpace = 0;
    seq = seq.trim();
    const result = new Map();
    for (let i = 0; i <= seq.length; i++) {
        if (i === seq.length) {
            if (key !== null) {
                result.set(key, token);
            }
            break;
        }
        const ch = seq[i];
        if (quoted) {
            if (ch === '"') {
                quoted = false;
                continue;
            }
        }
        else {
            if (ch === '"') {
                quoted = true;
                continue;
            }
            if (ch === "\\") {
                i++;
                const ord = parseInt(seq.slice(i, i + 2), 16);
                if (Number.isNaN(ord)) {
                    token += seq[i];
                }
                else {
                    i++;
                    token += String.fromCharCode(ord);
                }
                continue;
            }
            if (key === null && ch === "=") {
                key = token;
                token = "";
                continue;
            }
            if (ch === "," || ch === ";" || ch === "+") {
                if (key !== null) {
                    result.set(key, token);
                }
                key = null;
                token = "";
                continue;
            }
        }
        if (ch === " " && !quoted) {
            if (token.length === 0) {
                continue;
            }
            if (i > nextNonSpace) {
                let j = i;
                while (seq[j] === " ") {
                    j++;
                }
                nextNonSpace = j;
            }
            if (nextNonSpace >= seq.length ||
                seq[nextNonSpace] === "," ||
                seq[nextNonSpace] === ";" ||
                (key === null && seq[nextNonSpace] === "=") ||
                (key !== null && seq[nextNonSpace] === "+")) {
                i = nextNonSpace - 1;
                continue;
            }
        }
        token += ch;
    }
    return result;
}
exports.parseDn = parseDn;
//# sourceMappingURL=rfc2253Parser.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=updateInfo.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.nil = exports.UUID = void 0;
const crypto_1 = require("crypto");
const index_1 = require("./index");
const invalidName = "options.name must be either a string or a Buffer";
// Node ID according to rfc4122#section-4.5
const randomHost = crypto_1.randomBytes(16);
randomHost[0] = randomHost[0] | 0x01;
// lookup table hex to byte
const hex2byte = {};
// lookup table byte to hex
const byte2hex = [];
// populate lookup tables
for (let i = 0; i < 256; i++) {
    const hex = (i + 0x100).toString(16).substr(1);
    hex2byte[hex] = i;
    byte2hex[i] = hex;
}
// UUID class
class UUID {
    constructor(uuid) {
        this.ascii = null;
        this.binary = null;
        const check = UUID.check(uuid);
        if (!check) {
            throw new Error("not a UUID");
        }
        this.version = check.version;
        if (check.format === "ascii") {
            this.ascii = uuid;
        }
        else {
            this.binary = uuid;
        }
    }
    static v5(name, namespace) {
        return uuidNamed(name, "sha1", 0x50, namespace);
    }
    toString() {
        if (this.ascii == null) {
            this.ascii = stringify(this.binary);
        }
        return this.ascii;
    }
    inspect() {
        return `UUID v${this.version} ${this.toString()}`;
    }
    static check(uuid, offset = 0) {
        if (typeof uuid === "string") {
            uuid = uuid.toLowerCase();
            if (!/^[a-f0-9]{8}(-[a-f0-9]{4}){3}-([a-f0-9]{12})$/.test(uuid)) {
                return false;
            }
            if (uuid === "00000000-0000-0000-0000-000000000000") {
                return { version: undefined, variant: "nil", format: "ascii" };
            }
            return {
                version: (hex2byte[uuid[14] + uuid[15]] & 0xf0) >> 4,
                variant: getVariant((hex2byte[uuid[19] + uuid[20]] & 0xe0) >> 5),
                format: "ascii",
            };
        }
        if (Buffer.isBuffer(uuid)) {
            if (uuid.length < offset + 16) {
                return false;
            }
            let i = 0;
            for (; i < 16; i++) {
                if (uuid[offset + i] !== 0) {
                    break;
                }
            }
            if (i === 16) {
                return { version: undefined, variant: "nil", format: "binary" };
            }
            return {
                version: (uuid[offset + 6] & 0xf0) >> 4,
                variant: getVariant((uuid[offset + 8] & 0xe0) >> 5),
                format: "binary",
            };
        }
        throw index_1.newError("Unknown type of uuid", "ERR_UNKNOWN_UUID_TYPE");
    }
    // read stringified uuid into a Buffer
    static parse(input) {
        const buffer = Buffer.allocUnsafe(16);
        let j = 0;
        for (let i = 0; i < 16; i++) {
            buffer[i] = hex2byte[input[j++] + input[j++]];
            if (i === 3 || i === 5 || i === 7 || i === 9) {
                j += 1;
            }
        }
        return buffer;
    }
}
exports.UUID = UUID;
// from rfc4122#appendix-C
UUID.OID = UUID.parse("6ba7b812-9dad-11d1-80b4-00c04fd430c8");
// according to rfc4122#section-4.1.1
function getVariant(bits) {
    switch (bits) {
        case 0:
        case 1:
        case 3:
            return "ncs";
        case 4:
        case 5:
            return "rfc4122";
        case 6:
            return "microsoft";
        default:
            return "future";
    }
}
var UuidEncoding;
(function (UuidEncoding) {
    UuidEncoding[UuidEncoding["ASCII"] = 0] = "ASCII";
    UuidEncoding[UuidEncoding["BINARY"] = 1] = "BINARY";
    UuidEncoding[UuidEncoding["OBJECT"] = 2] = "OBJECT";
})(UuidEncoding || (UuidEncoding = {}));
// v3 + v5
function uuidNamed(name, hashMethod, version, namespace, encoding = UuidEncoding.ASCII) {
    const hash = crypto_1.createHash(hashMethod);
    const nameIsNotAString = typeof name !== "string";
    if (nameIsNotAString && !Buffer.isBuffer(name)) {
        throw index_1.newError(invalidName, "ERR_INVALID_UUID_NAME");
    }
    hash.update(namespace);
    hash.update(name);
    const buffer = hash.digest();
    let result;
    switch (encoding) {
        case UuidEncoding.BINARY:
            buffer[6] = (buffer[6] & 0x0f) | version;
            buffer[8] = (buffer[8] & 0x3f) | 0x80;
            result = buffer;
            break;
        case UuidEncoding.OBJECT:
            buffer[6] = (buffer[6] & 0x0f) | version;
            buffer[8] = (buffer[8] & 0x3f) | 0x80;
            result = new UUID(buffer);
            break;
        default:
            result =
                byte2hex[buffer[0]] +
                    byte2hex[buffer[1]] +
                    byte2hex[buffer[2]] +
                    byte2hex[buffer[3]] +
                    "-" +
                    byte2hex[buffer[4]] +
                    byte2hex[buffer[5]] +
                    "-" +
                    byte2hex[(buffer[6] & 0x0f) | version] +
                    byte2hex[buffer[7]] +
                    "-" +
                    byte2hex[(buffer[8] & 0x3f) | 0x80] +
                    byte2hex[buffer[9]] +
                    "-" +
                    byte2hex[buffer[10]] +
                    byte2hex[buffer[11]] +
                    byte2hex[buffer[12]] +
                    byte2hex[buffer[13]] +
                    byte2hex[buffer[14]] +
                    byte2hex[buffer[15]];
            break;
    }
    return result;
}
function stringify(buffer) {
    return (byte2hex[buffer[0]] +
        byte2hex[buffer[1]] +
        byte2hex[buffer[2]] +
        byte2hex[buffer[3]] +
        "-" +
        byte2hex[buffer[4]] +
        byte2hex[buffer[5]] +
        "-" +
        byte2hex[buffer[6]] +
        byte2hex[buffer[7]] +
        "-" +
        byte2hex[buffer[8]] +
        byte2hex[buffer[9]] +
        "-" +
        byte2hex[buffer[10]] +
        byte2hex[buffer[11]] +
        byte2hex[buffer[12]] +
        byte2hex[buffer[13]] +
        byte2hex[buffer[14]] +
        byte2hex[buffer[15]]);
}
// according to rfc4122#section-4.1.7
exports.nil = new UUID("00000000-0000-0000-0000-000000000000");
// UUID.v4 = uuidRandom
// UUID.v4fast = uuidRandomFast
// UUID.v3 = function(options, callback) {
//     return uuidNamed("md5", 0x30, options, callback)
// }
//# sourceMappingURL=uuid.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseXml = exports.XElement = void 0;
const sax = require("sax");
const index_1 = require("./index");
class XElement {
    constructor(name) {
        this.name = name;
        this.value = "";
        this.attributes = null;
        this.isCData = false;
        this.elements = null;
        if (!name) {
            throw index_1.newError("Element name cannot be empty", "ERR_XML_ELEMENT_NAME_EMPTY");
        }
        if (!isValidName(name)) {
            throw index_1.newError(`Invalid element name: ${name}`, "ERR_XML_ELEMENT_INVALID_NAME");
        }
    }
    attribute(name) {
        const result = this.attributes === null ? null : this.attributes[name];
        if (result == null) {
            throw index_1.newError(`No attribute "${name}"`, "ERR_XML_MISSED_ATTRIBUTE");
        }
        return result;
    }
    removeAttribute(name) {
        if (this.attributes !== null) {
            delete this.attributes[name];
        }
    }
    element(name, ignoreCase = false, errorIfMissed = null) {
        const result = this.elementOrNull(name, ignoreCase);
        if (result === null) {
            throw index_1.newError(errorIfMissed || `No element "${name}"`, "ERR_XML_MISSED_ELEMENT");
        }
        return result;
    }
    elementOrNull(name, ignoreCase = false) {
        if (this.elements === null) {
            return null;
        }
        for (const element of this.elements) {
            if (isNameEquals(element, name, ignoreCase)) {
                return element;
            }
        }
        return null;
    }
    getElements(name, ignoreCase = false) {
        if (this.elements === null) {
            return [];
        }
        return this.elements.filter(it => isNameEquals(it, name, ignoreCase));
    }
    elementValueOrEmpty(name, ignoreCase = false) {
        const element = this.elementOrNull(name, ignoreCase);
        return element === null ? "" : element.value;
    }
}
exports.XElement = XElement;
const NAME_REG_EXP = new RegExp(/^[A-Za-z_][:A-Za-z0-9_-]*$/i);
function isValidName(name) {
    return NAME_REG_EXP.test(name);
}
function isNameEquals(element, name, ignoreCase) {
    const elementName = element.name;
    return elementName === name || (ignoreCase === true && elementName.length === name.length && elementName.toLowerCase() === name.toLowerCase());
}
function parseXml(data) {
    let rootElement = null;
    const parser = sax.parser(true, {});
    const elements = [];
    parser.onopentag = saxElement => {
        const element = new XElement(saxElement.name);
        element.attributes = saxElement.attributes;
        if (rootElement === null) {
            rootElement = element;
        }
        else {
            const parent = elements[elements.length - 1];
            if (parent.elements == null) {
                parent.elements = [];
            }
            parent.elements.push(element);
        }
        elements.push(element);
    };
    parser.onclosetag = () => {
        elements.pop();
    };
    parser.ontext = text => {
        if (elements.length > 0) {
            elements[elements.length - 1].value = text;
        }
    };
    parser.oncdata = cdata => {
        const element = elements[elements.length - 1];
        element.value = cdata;
        element.isCData = true;
    };
    parser.onerror = err => {
        throw err;
    };
    parser.write(data);
    return rootElement;
}
exports.parseXml = parseXml;
//# sourceMappingURL=xml.js.mapcoverage/
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"lines": 86,
	"statements": 85.93,
	"functions": 82.43,
	"branches": 76.06,
	"exclude": [
		"coverage",
		"test"
	]
}
MIT License

Copyright (c) 2020 Jordan Harband

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 GetIntrinsic = require('get-intrinsic');

var callBind = require('./');

var $indexOf = callBind(GetIntrinsic('String.prototype.indexOf'));

module.exports = function callBoundIntrinsic(name, allowMissing) {
	var intrinsic = GetIntrinsic(name, !!allowMissing);
	if (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) {
		return callBind(intrinsic);
	}
	return intrinsic;
};
'use strict';

var bind = require('function-bind');
var GetIntrinsic = require('get-intrinsic');

var $apply = GetIntrinsic('%Function.prototype.apply%');
var $call = GetIntrinsic('%Function.prototype.call%');
var $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply);

var $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%', true);
var $defineProperty = GetIntrinsic('%Object.defineProperty%', true);
var $max = GetIntrinsic('%Math.max%');

if ($defineProperty) {
	try {
		$defineProperty({}, 'a', { value: 1 });
	} catch (e) {
		// IE 8 has a broken defineProperty
		$defineProperty = null;
	}
}

module.exports = function callBind(originalFunction) {
	var func = $reflectApply(bind, $call, arguments);
	if ($gOPD && $defineProperty) {
		var desc = $gOPD(func, 'length');
		if (desc.configurable) {
			// original length, plus the receiver, minus any additional arguments (after the receiver)
			$defineProperty(
				func,
				'length',
				{ value: 1 + $max(0, originalFunction.length - (arguments.length - 1)) }
			);
		}
	}
	return func;
};

var applyBind = function applyBind() {
	return $reflectApply(bind, $apply, arguments);
};

if ($defineProperty) {
	$defineProperty(module.exports, 'apply', { value: applyBind });
} else {
	module.exports.apply = applyBind;
}
{
  "name": "call-bind",
  "version": "1.0.2",
  "description": "Robustly `.call.bind()` a function",
  "main": "index.js",
  "exports": {
    ".": [
      {
        "default": "./index.js"
      },
      "./index.js"
    ],
    "./callBound": [
      {
        "default": "./callBound.js"
      },
      "./callBound.js"
    ],
    "./package.json": "./package.json"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/ljharb/call-bind.git"
  },
  "author": "Jordan Harband <ljharb@gmail.com>",
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "license": "MIT",
  "homepage": "https://github.com/ljharb/call-bind#readme",
  "devDependencies": {
    "@ljharb/eslint-config": "^17.3.0",
    "aud": "^1.1.3",
    "auto-changelog": "^2.2.1",
    "eslint": "^7.17.0",
    "nyc": "^10.3.2",
    "safe-publish-latest": "^1.1.4",
    "tape": "^5.1.1"
  },
  "dependencies": {
    "function-bind": "^1.1.1",
    "get-intrinsic": "^1.0.2"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false,
    "hideCredit": true
  }
}# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/call-bind
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
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.
'use strict'
const fs = require('fs')
const path = require('path')

/* istanbul ignore next */
const LCHOWN = fs.lchown ? 'lchown' : 'chown'
/* istanbul ignore next */
const LCHOWNSYNC = fs.lchownSync ? 'lchownSync' : 'chownSync'

/* istanbul ignore next */
const needEISDIRHandled = fs.lchown &&
  !process.version.match(/v1[1-9]+\./) &&
  !process.version.match(/v10\.[6-9]/)

const lchownSync = (path, uid, gid) => {
  try {
    return fs[LCHOWNSYNC](path, uid, gid)
  } catch (er) {
    if (er.code !== 'ENOENT')
      throw er
  }
}

/* istanbul ignore next */
const chownSync = (path, uid, gid) => {
  try {
    return fs.chownSync(path, uid, gid)
  } catch (er) {
    if (er.code !== 'ENOENT')
      throw er
  }
}

/* istanbul ignore next */
const handleEISDIR =
  needEISDIRHandled ? (path, uid, gid, cb) => er => {
    // Node prior to v10 had a very questionable implementation of
    // fs.lchown, which would always try to call fs.open on a directory
    // Fall back to fs.chown in those cases.
    if (!er || er.code !== 'EISDIR')
      cb(er)
    else
      fs.chown(path, uid, gid, cb)
  }
  : (_, __, ___, cb) => cb

/* istanbul ignore next */
const handleEISDirSync =
  needEISDIRHandled ? (path, uid, gid) => {
    try {
      return lchownSync(path, uid, gid)
    } catch (er) {
      if (er.code !== 'EISDIR')
        throw er
      chownSync(path, uid, gid)
    }
  }
  : (path, uid, gid) => lchownSync(path, uid, gid)

// fs.readdir could only accept an options object as of node v6
const nodeVersion = process.version
let readdir = (path, options, cb) => fs.readdir(path, options, cb)
let readdirSync = (path, options) => fs.readdirSync(path, options)
/* istanbul ignore next */
if (/^v4\./.test(nodeVersion))
  readdir = (path, options, cb) => fs.readdir(path, cb)

const chown = (cpath, uid, gid, cb) => {
  fs[LCHOWN](cpath, uid, gid, handleEISDIR(cpath, uid, gid, er => {
    // Skip ENOENT error
    cb(er && er.code !== 'ENOENT' ? er : null)
  }))
}

const chownrKid = (p, child, uid, gid, cb) => {
  if (typeof child === 'string')
    return fs.lstat(path.resolve(p, child), (er, stats) => {
      // Skip ENOENT error
      if (er)
        return cb(er.code !== 'ENOENT' ? er : null)
      stats.name = child
      chownrKid(p, stats, uid, gid, cb)
    })

  if (child.isDirectory()) {
    chownr(path.resolve(p, child.name), uid, gid, er => {
      if (er)
        return cb(er)
      const cpath = path.resolve(p, child.name)
      chown(cpath, uid, gid, cb)
    })
  } else {
    const cpath = path.resolve(p, child.name)
    chown(cpath, uid, gid, cb)
  }
}


const chownr = (p, uid, gid, cb) => {
  readdir(p, { withFileTypes: true }, (er, children) => {
    // any error other than ENOTDIR or ENOTSUP means it's not readable,
    // or doesn't exist.  give up.
    if (er) {
      if (er.code === 'ENOENT')
        return cb()
      else if (er.code !== 'ENOTDIR' && er.code !== 'ENOTSUP')
        return cb(er)
    }
    if (er || !children.length)
      return chown(p, uid, gid, cb)

    let len = children.length
    let errState = null
    const then = er => {
      if (errState)
        return
      if (er)
        return cb(errState = er)
      if (-- len === 0)
        return chown(p, uid, gid, cb)
    }

    children.forEach(child => chownrKid(p, child, uid, gid, then))
  })
}

const chownrKidSync = (p, child, uid, gid) => {
  if (typeof child === 'string') {
    try {
      const stats = fs.lstatSync(path.resolve(p, child))
      stats.name = child
      child = stats
    } catch (er) {
      if (er.code === 'ENOENT')
        return
      else
        throw er
    }
  }

  if (child.isDirectory())
    chownrSync(path.resolve(p, child.name), uid, gid)

  handleEISDirSync(path.resolve(p, child.name), uid, gid)
}

const chownrSync = (p, uid, gid) => {
  let children
  try {
    children = readdirSync(p, { withFileTypes: true })
  } catch (er) {
    if (er.code === 'ENOENT')
      return
    else if (er.code === 'ENOTDIR' || er.code === 'ENOTSUP')
      return handleEISDirSync(p, uid, gid)
    else
      throw er
  }

  if (children && children.length)
    children.forEach(child => chownrKidSync(p, child, uid, gid))

  return handleEISDirSync(p, uid, gid)
}

module.exports = chownr
chownr.sync = chownrSync
{
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
  "name": "chownr",
  "description": "like `chown -R`",
  "version": "2.0.0",
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/chownr.git"
  },
  "main": "chownr.js",
  "files": [
    "chownr.js"
  ],
  "devDependencies": {
    "mkdirp": "0.3",
    "rimraf": "^2.7.1",
    "tap": "^14.10.6"
  },
  "tap": {
    "check-coverage": true
  },
  "license": "ISC",
  "engines": {
    "node": ">=10"
  }
}'use strict';
const os = require('os');

const extractPathRegex = /\s+at.*(?:\(|\s)(.*)\)?/;
const pathRegex = /^(?:(?:(?:node|(?:internal\/[\w/]*|.*node_modules\/(?:babel-polyfill|pirates)\/.*)?\w+)\.js:\d+:\d+)|native)/;
const homeDir = typeof os.homedir === 'undefined' ? '' : os.homedir();

module.exports = (stack, options) => {
	options = Object.assign({pretty: false}, options);

	return stack.replace(/\\/g, '/')
		.split('\n')
		.filter(line => {
			const pathMatches = line.match(extractPathRegex);
			if (pathMatches === null || !pathMatches[1]) {
				return true;
			}

			const match = pathMatches[1];

			// Electron
			if (
				match.includes('.app/Contents/Resources/electron.asar') ||
				match.includes('.app/Contents/Resources/default_app.asar')
			) {
				return false;
			}

			return !pathRegex.test(match);
		})
		.filter(line => line.trim() !== '')
		.map(line => {
			if (options.pretty) {
				return line.replace(extractPathRegex, (m, p1) => m.replace(p1, p1.replace(homeDir, '~')));
			}

			return line;
		})
		.join('\n');
};
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": "clean-stack",
  "version": "2.2.0",
  "description": "Clean up error stack traces",
  "license": "MIT",
  "repository": "sindresorhus/clean-stack",
  "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.2",
    "xo": "^0.24.0"
  },
  "browser": {
    "os": false
  }
}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
var colorSupport = require('./')({alwaysReturn: true })
console.log(JSON.stringify(colorSupport, null, 2))
module.exports = colorSupport({ alwaysReturn: true }, colorSupport)

function colorSupport(options, obj) {
  obj = obj || {}
  options = options || {}
  obj.level = 0
  obj.hasBasic = false
  obj.has256 = false
  obj.has16m = false
  if (!options.alwaysReturn) {
    return false
  }
  return obj
}
// call it on itself so we can test the export val for basic stuff
module.exports = colorSupport({ alwaysReturn: true }, colorSupport)

function hasNone (obj, options) {
  obj.level = 0
  obj.hasBasic = false
  obj.has256 = false
  obj.has16m = false
  if (!options.alwaysReturn) {
    return false
  }
  return obj
}

function hasBasic (obj) {
  obj.hasBasic = true
  obj.has256 = false
  obj.has16m = false
  obj.level = 1
  return obj
}

function has256 (obj) {
  obj.hasBasic = true
  obj.has256 = true
  obj.has16m = false
  obj.level = 2
  return obj
}

function has16m (obj) {
  obj.hasBasic = true
  obj.has256 = true
  obj.has16m = true
  obj.level = 3
  return obj
}

function colorSupport (options, obj) {
  options = options || {}

  obj = obj || {}

  // if just requesting a specific level, then return that.
  if (typeof options.level === 'number') {
    switch (options.level) {
      case 0:
        return hasNone(obj, options)
      case 1:
        return hasBasic(obj)
      case 2:
        return has256(obj)
      case 3:
        return has16m(obj)
    }
  }

  obj.level = 0
  obj.hasBasic = false
  obj.has256 = false
  obj.has16m = false

  if (typeof process === 'undefined' ||
      !process ||
      !process.stdout ||
      !process.env ||
      !process.platform) {
    return hasNone(obj, options)
  }

  var env = options.env || process.env
  var stream = options.stream || process.stdout
  var term = options.term || env.TERM || ''
  var platform = options.platform || process.platform

  if (!options.ignoreTTY && !stream.isTTY) {
    return hasNone(obj, options)
  }

  if (!options.ignoreDumb && term === 'dumb' && !env.COLORTERM) {
    return hasNone(obj, options)
  }

  if (platform === 'win32') {
    return hasBasic(obj)
  }

  if (env.TMUX) {
    return has256(obj)
  }

  if (!options.ignoreCI && (env.CI || env.TEAMCITY_VERSION)) {
    if (env.TRAVIS) {
      return has256(obj)
    } else {
      return hasNone(obj, options)
    }
  }

  // TODO: add more term programs
  switch (env.TERM_PROGRAM) {
    case 'iTerm.app':
      var ver = env.TERM_PROGRAM_VERSION || '0.'
      if (/^[0-2]\./.test(ver)) {
        return has256(obj)
      } else {
        return has16m(obj)
      }

    case 'HyperTerm':
    case 'Hyper':
      return has16m(obj)

    case 'MacTerm':
      return has16m(obj)

    case 'Apple_Terminal':
      return has256(obj)
  }

  if (/^xterm-256/.test(term)) {
    return has256(obj)
  }

  if (/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(term)) {
    return hasBasic(obj)
  }

  if (env.COLORTERM) {
    return hasBasic(obj)
  }

  return hasNone(obj, options)
}
{
  "name": "color-support",
  "version": "1.1.3",
  "description": "A module which will endeavor to guess your terminal's level of color support.",
  "main": "index.js",
  "browser": "browser.js",
  "bin": "bin.js",
  "devDependencies": {
    "tap": "^10.3.3"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/isaacs/color-support.git"
  },
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
  "license": "ISC",
  "files": [
    "browser.js",
    "index.js",
    "bin.js"
  ]
}Copyright (c) 2011 Debuggable Limited <felix@debuggable.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.
{
  "author": "Felix Geisendörfer <felix@debuggable.com> (http://debuggable.com/)",
  "name": "combined-stream",
  "description": "A stream that emits multiple other streams one after another.",
  "version": "1.0.8",
  "homepage": "https://github.com/felixge/node-combined-stream",
  "repository": {
    "type": "git",
    "url": "git://github.com/felixge/node-combined-stream.git"
  },
  "main": "./lib/combined_stream",
  "engines": {
    "node": ">= 0.8"
  },
  "dependencies": {
    "delayed-stream": "~1.0.0"
  },
  "devDependencies": {
    "far": "~0.0.7"
  },
  "license": "MIT"
}var util = require('util');
var Stream = require('stream').Stream;
var DelayedStream = require('delayed-stream');

module.exports = CombinedStream;
function CombinedStream() {
  this.writable = false;
  this.readable = true;
  this.dataSize = 0;
  this.maxDataSize = 2 * 1024 * 1024;
  this.pauseStreams = true;

  this._released = false;
  this._streams = [];
  this._currentStream = null;
  this._insideLoop = false;
  this._pendingNext = false;
}
util.inherits(CombinedStream, Stream);

CombinedStream.create = function(options) {
  var combinedStream = new this();

  options = options || {};
  for (var option in options) {
    combinedStream[option] = options[option];
  }

  return combinedStream;
};

CombinedStream.isStreamLike = function(stream) {
  return (typeof stream !== 'function')
    && (typeof stream !== 'string')
    && (typeof stream !== 'boolean')
    && (typeof stream !== 'number')
    && (!Buffer.isBuffer(stream));
};

CombinedStream.prototype.append = function(stream) {
  var isStreamLike = CombinedStream.isStreamLike(stream);

  if (isStreamLike) {
    if (!(stream instanceof DelayedStream)) {
      var newStream = DelayedStream.create(stream, {
        maxDataSize: Infinity,
        pauseStream: this.pauseStreams,
      });
      stream.on('data', this._checkDataSize.bind(this));
      stream = newStream;
    }

    this._handleErrors(stream);

    if (this.pauseStreams) {
      stream.pause();
    }
  }

  this._streams.push(stream);
  return this;
};

CombinedStream.prototype.pipe = function(dest, options) {
  Stream.prototype.pipe.call(this, dest, options);
  this.resume();
  return dest;
};

CombinedStream.prototype._getNext = function() {
  this._currentStream = null;

  if (this._insideLoop) {
    this._pendingNext = true;
    return; // defer call
  }

  this._insideLoop = true;
  try {
    do {
      this._pendingNext = false;
      this._realGetNext();
    } while (this._pendingNext);
  } finally {
    this._insideLoop = false;
  }
};

CombinedStream.prototype._realGetNext = function() {
  var stream = this._streams.shift();


  if (typeof stream == 'undefined') {
    this.end();
    return;
  }

  if (typeof stream !== 'function') {
    this._pipeNext(stream);
    return;
  }

  var getStream = stream;
  getStream(function(stream) {
    var isStreamLike = CombinedStream.isStreamLike(stream);
    if (isStreamLike) {
      stream.on('data', this._checkDataSize.bind(this));
      this._handleErrors(stream);
    }

    this._pipeNext(stream);
  }.bind(this));
};

CombinedStream.prototype._pipeNext = function(stream) {
  this._currentStream = stream;

  var isStreamLike = CombinedStream.isStreamLike(stream);
  if (isStreamLike) {
    stream.on('end', this._getNext.bind(this));
    stream.pipe(this, {end: false});
    return;
  }

  var value = stream;
  this.write(value);
  this._getNext();
};

CombinedStream.prototype._handleErrors = function(stream) {
  var self = this;
  stream.on('error', function(err) {
    self._emitError(err);
  });
};

CombinedStream.prototype.write = function(data) {
  this.emit('data', data);
};

CombinedStream.prototype.pause = function() {
  if (!this.pauseStreams) {
    return;
  }

  if(this.pauseStreams && this._currentStream && typeof(this._currentStream.pause) == 'function') this._currentStream.pause();
  this.emit('pause');
};

CombinedStream.prototype.resume = function() {
  if (!this._released) {
    this._released = true;
    this.writable = true;
    this._getNext();
  }

  if(this.pauseStreams && this._currentStream && typeof(this._currentStream.resume) == 'function') this._currentStream.resume();
  this.emit('resume');
};

CombinedStream.prototype.end = function() {
  this._reset();
  this.emit('end');
};

CombinedStream.prototype.destroy = function() {
  this._reset();
  this.emit('close');
};

CombinedStream.prototype._reset = function() {
  this.writable = false;
  this._streams = [];
  this._currentStream = null;
};

CombinedStream.prototype._checkDataSize = function() {
  this._updateDataSize();
  if (this.dataSize <= this.maxDataSize) {
    return;
  }

  var message =
    'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.';
  this._emitError(new Error(message));
};

CombinedStream.prototype._updateDataSize = function() {
  this.dataSize = 0;

  var self = this;
  this._streams.forEach(function(stream) {
    if (!stream.dataSize) {
      return;
    }

    self.dataSize += stream.dataSize;
  });

  if (this._currentStream && this._currentStream.dataSize) {
    this.dataSize += this._currentStream.dataSize;
  }
};

CombinedStream.prototype._emitError = function(err) {
  this._reset();
  this.emit('error', err);
};
This software is released under the MIT license:

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.
concat-map
==========

Concatenative mapdashery.

[![browser support](http://ci.testling.com/substack/node-concat-map.png)](http://ci.testling.com/substack/node-concat-map)

[![build status](https://secure.travis-ci.org/substack/node-concat-map.png)](http://travis-ci.org/substack/node-concat-map)

example
=======

``` js
var concatMap = require('concat-map');
var xs = [ 1, 2, 3, 4, 5, 6 ];
var ys = concatMap(xs, function (x) {
    return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
});
console.dir(ys);
```

***

```
[ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]
```

methods
=======

``` js
var concatMap = require('concat-map')
```

concatMap(xs, fn)
-----------------

Return an array of concatenated elements by calling `fn(x, i)` for each element
`x` and each index `i` in the array `xs`.

When `fn(x, i)` returns an array, its result will be concatenated with the
result array. If `fn(x, i)` returns anything else, that value will be pushed
onto the end of the result array.

install
=======

With [npm](http://npmjs.org) do:

```
npm install concat-map
```

license
=======

MIT

notes
=====

This module was written while sitting high above the ground in a tree.
module.exports = function (xs, fn) {
    var res = [];
    for (var i = 0; i < xs.length; i++) {
        var x = fn(xs[i], i);
        if (isArray(x)) res.push.apply(res, x);
        else res.push(x);
    }
    return res;
};

var isArray = Array.isArray || function (xs) {
    return Object.prototype.toString.call(xs) === '[object Array]';
};
{
  "name": "concat-map",
  "description": "concatenative mapdashery",
  "version": "0.0.1",
  "repository": {
    "type": "git",
    "url": "git://github.com/substack/node-concat-map.git"
  },
  "main": "index.js",
  "directories": {
    "example": "example",
    "test": "test"
  },
  "devDependencies": {
    "tape": "~2.4.0"
  },
  "license": "MIT",
  "author": {
    "name": "James Halliday",
    "email": "mail@substack.net",
    "url": "http://substack.net"
  },
  "testling": {
    "files": "test/*.js",
    "browsers": {
      "ie": [
        6,
        7,
        8,
        9
      ],
      "ff": [
        3.5,
        10,
        15
      ],
      "chrome": [
        10,
        22
      ],
      "safari": [
        5.1
      ],
      "opera": [
        12
      ]
    }
  }
}Copyright (c) 2014, Rebecca Turner <me@re-becca.org>

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.
# Console Control Strings

A library of cross-platform tested terminal/console command strings for
doing things like color and cursor positioning.  This is a subset of both
ansi and vt100.  All control codes included work on both Windows & Unix-like
OSes, except where noted.

## Usage

```js
var consoleControl = require('console-control-strings')

console.log(consoleControl.color('blue','bgRed', 'bold') + 'hi there' + consoleControl.color('reset'))
process.stdout.write(consoleControl.goto(75, 10))
```

## Why Another?

There are tons of libraries similar to this one.  I wanted one that was:

1. Very clear about compatibility goals.
2. Could emit, for instance, a start color code without an end one.
3. Returned strings w/o writing to streams.
4. Was not weighed down with other unrelated baggage.

## Functions

### var code = consoleControl.up(_num = 1_)

Returns the escape sequence to move _num_ lines up.

### var code = consoleControl.down(_num = 1_)

Returns the escape sequence to move _num_ lines down.

### var code = consoleControl.forward(_num = 1_)

Returns the escape sequence to move _num_ lines righ.

### var code = consoleControl.back(_num = 1_)

Returns the escape sequence to move _num_ lines left.

### var code = consoleControl.nextLine(_num = 1_)

Returns the escape sequence to move _num_ lines down and to the beginning of
the line.

### var code = consoleControl.previousLine(_num = 1_)

Returns the escape sequence to move _num_ lines up and to the beginning of
the line.

### var code = consoleControl.eraseData()

Returns the escape sequence to erase everything from the current cursor
position to the bottom right of the screen.  This is line based, so it
erases the remainder of the current line and all following lines.

### var code = consoleControl.eraseLine()

Returns the escape sequence to erase to the end of the current line.

### var code = consoleControl.goto(_x_, _y_)

Returns the escape sequence to move the cursor to the designated position. 
Note that the origin is _1, 1_ not _0, 0_.

### var code = consoleControl.gotoSOL()

Returns the escape sequence to move the cursor to the beginning of the
current line. (That is, it returns a carriage return, `\r`.)

### var code = consoleControl.hideCursor()

Returns the escape sequence to hide the cursor.

### var code = consoleControl.showCursor()

Returns the escape sequence to show the cursor.

### var code = consoleControl.color(_colors = []_)

### var code = consoleControl.color(_color1_, _color2_, _…_, _colorn_)

Returns the escape sequence to set the current terminal display attributes
(mostly colors).  Arguments can either be a list of attributes or an array
of attributes.  The difference between passing in an array or list of colors
and calling `.color` separately for each one, is that in the former case a
single escape sequence will be produced where as in the latter each change
will have its own distinct escape sequence.  Each attribute can be one of:

* Reset:
  * **reset** – Reset all attributes to the terminal default.
* Styles:
  * **bold** – Display text as bold.  In some terminals this means using a
    bold font, in others this means changing the color.  In some it means
    both.
  * **italic** – Display text as italic. This is not available in most Windows terminals.
  * **underline** – Underline text. This is not available in most Windows Terminals.
  * **inverse** – Invert the foreground and background colors.
  * **stopBold** – Do not display text as bold.
  * **stopItalic** – Do not display text as italic.
  * **stopUnderline** – Do not underline text.
  * **stopInverse** – Do not invert foreground and background.
* Colors:
  * **white**
  * **black**
  * **blue**
  * **cyan**
  * **green**
  * **magenta**
  * **red**
  * **yellow**
  * **grey** / **brightBlack**
  * **brightRed**
  * **brightGreen**
  * **brightYellow**
  * **brightBlue**
  * **brightMagenta**
  * **brightCyan**
  * **brightWhite**
* Background Colors:
  * **bgWhite**
  * **bgBlack**
  * **bgBlue**
  * **bgCyan**
  * **bgGreen**
  * **bgMagenta**
  * **bgRed**
  * **bgYellow**
  * **bgGrey** / **bgBrightBlack**
  * **bgBrightRed**
  * **bgBrightGreen**
  * **bgBrightYellow**
  * **bgBrightBlue**
  * **bgBrightMagenta**
  * **bgBrightCyan**
  * **bgBrightWhite**

'use strict'

// These tables borrowed from `ansi`

var prefix = '\x1b['

exports.up = function up (num) {
  return prefix + (num || '') + 'A'
}

exports.down = function down (num) {
  return prefix + (num || '') + 'B'
}

exports.forward = function forward (num) {
  return prefix + (num || '') + 'C'
}

exports.back = function back (num) {
  return prefix + (num || '') + 'D'
}

exports.nextLine = function nextLine (num) {
  return prefix + (num || '') + 'E'
}

exports.previousLine = function previousLine (num) {
  return prefix + (num || '') + 'F'
}

exports.horizontalAbsolute = function horizontalAbsolute (num) {
  if (num == null) throw new Error('horizontalAboslute requires a column to position to')
  return prefix + num + 'G'
}

exports.eraseData = function eraseData () {
  return prefix + 'J'
}

exports.eraseLine = function eraseLine () {
  return prefix + 'K'
}

exports.goto = function (x, y) {
  return prefix + y + ';' + x + 'H'
}

exports.gotoSOL = function () {
  return '\r'
}

exports.beep = function () {
  return '\x07'
}

exports.hideCursor = function hideCursor () {
  return prefix + '?25l'
}

exports.showCursor = function showCursor () {
  return prefix + '?25h'
}

var colors = {
  reset: 0,
// styles
  bold: 1,
  italic: 3,
  underline: 4,
  inverse: 7,
// resets
  stopBold: 22,
  stopItalic: 23,
  stopUnderline: 24,
  stopInverse: 27,
// colors
  white: 37,
  black: 30,
  blue: 34,
  cyan: 36,
  green: 32,
  magenta: 35,
  red: 31,
  yellow: 33,
  bgWhite: 47,
  bgBlack: 40,
  bgBlue: 44,
  bgCyan: 46,
  bgGreen: 42,
  bgMagenta: 45,
  bgRed: 41,
  bgYellow: 43,

  grey: 90,
  brightBlack: 90,
  brightRed: 91,
  brightGreen: 92,
  brightYellow: 93,
  brightBlue: 94,
  brightMagenta: 95,
  brightCyan: 96,
  brightWhite: 97,

  bgGrey: 100,
  bgBrightBlack: 100,
  bgBrightRed: 101,
  bgBrightGreen: 102,
  bgBrightYellow: 103,
  bgBrightBlue: 104,
  bgBrightMagenta: 105,
  bgBrightCyan: 106,
  bgBrightWhite: 107
}

exports.color = function color (colorWith) {
  if (arguments.length !== 1 || !Array.isArray(colorWith)) {
    colorWith = Array.prototype.slice.call(arguments)
  }
  return prefix + colorWith.map(colorNameToCode).join(';') + 'm'
}

function colorNameToCode (color) {
  if (colors[color] != null) return colors[color]
  throw new Error('Unknown color or style name: ' + color)
}
{
  "name": "console-control-strings",
  "version": "1.1.0",
  "description": "A library of cross-platform tested terminal/console command strings for doing things like color and cursor positioning.  This is a subset of both ansi and vt100.  All control codes included work on both Windows & Unix-like OSes, except where noted.",
  "main": "index.js",
  "directories": {
    "test": "test"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/iarna/console-control-strings"
  },
  "author": "Rebecca Turner <me@re-becca.org> (http://re-becca.org/)",
  "license": "ISC",
  "files": [
    "LICENSE",
    "index.js"
  ],
  "devDependencies": {
    "standard": "^7.1.2",
    "tap": "^5.7.2"
  }
}0.5.4 / 2021-12-10
==================

  * deps: safe-buffer@5.2.1

0.5.3 / 2018-12-17
==================

  * Use `safe-buffer` for improved Buffer API

0.5.2 / 2016-12-08
==================

  * Fix `parse` to accept any linear whitespace character

0.5.1 / 2016-01-17
==================

  * perf: enable strict mode

0.5.0 / 2014-10-11
==================

  * Add `parse` function

0.4.0 / 2014-09-21
==================

  * Expand non-Unicode `filename` to the full ISO-8859-1 charset

0.3.0 / 2014-09-20
==================

  * Add `fallback` option
  * Add `type` option

0.2.0 / 2014-09-19
==================

  * Reduce ambiguity of file names with hex escape in buggy browsers

0.1.2 / 2014-09-19
==================

  * Fix periodic invalid Unicode filename header

0.1.1 / 2014-09-19
==================

  * Fix invalid characters appearing in `filename*` parameter

0.1.0 / 2014-09-18
==================

  * Make the `filename` argument optional

0.0.0 / 2014-09-18
==================

  * Initial release
(The MIT License)

Copyright (c) 2014-2017 Douglas Christopher Wilson

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.
/*!
 * content-disposition
 * Copyright(c) 2014-2017 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module exports.
 * @public
 */

module.exports = contentDisposition
module.exports.parse = parse

/**
 * Module dependencies.
 * @private
 */

var basename = require('path').basename
var Buffer = require('safe-buffer').Buffer

/**
 * RegExp to match non attr-char, *after* encodeURIComponent (i.e. not including "%")
 * @private
 */

var ENCODE_URL_ATTR_CHAR_REGEXP = /[\x00-\x20"'()*,/:;<=>?@[\\\]{}\x7f]/g // eslint-disable-line no-control-regex

/**
 * RegExp to match percent encoding escape.
 * @private
 */

var HEX_ESCAPE_REGEXP = /%[0-9A-Fa-f]{2}/
var HEX_ESCAPE_REPLACE_REGEXP = /%([0-9A-Fa-f]{2})/g

/**
 * RegExp to match non-latin1 characters.
 * @private
 */

var NON_LATIN1_REGEXP = /[^\x20-\x7e\xa0-\xff]/g

/**
 * RegExp to match quoted-pair in RFC 2616
 *
 * quoted-pair = "\" CHAR
 * CHAR        = <any US-ASCII character (octets 0 - 127)>
 * @private
 */

var QESC_REGEXP = /\\([\u0000-\u007f])/g // eslint-disable-line no-control-regex

/**
 * RegExp to match chars that must be quoted-pair in RFC 2616
 * @private
 */

var QUOTE_REGEXP = /([\\"])/g

/**
 * RegExp for various RFC 2616 grammar
 *
 * parameter     = token "=" ( token | quoted-string )
 * token         = 1*<any CHAR except CTLs or separators>
 * separators    = "(" | ")" | "<" | ">" | "@"
 *               | "," | ";" | ":" | "\" | <">
 *               | "/" | "[" | "]" | "?" | "="
 *               | "{" | "}" | SP | HT
 * quoted-string = ( <"> *(qdtext | quoted-pair ) <"> )
 * qdtext        = <any TEXT except <">>
 * quoted-pair   = "\" CHAR
 * CHAR          = <any US-ASCII character (octets 0 - 127)>
 * TEXT          = <any OCTET except CTLs, but including LWS>
 * LWS           = [CRLF] 1*( SP | HT )
 * CRLF          = CR LF
 * CR            = <US-ASCII CR, carriage return (13)>
 * LF            = <US-ASCII LF, linefeed (10)>
 * SP            = <US-ASCII SP, space (32)>
 * HT            = <US-ASCII HT, horizontal-tab (9)>
 * CTL           = <any US-ASCII control character (octets 0 - 31) and DEL (127)>
 * OCTET         = <any 8-bit sequence of data>
 * @private
 */

var PARAM_REGEXP = /;[\x09\x20]*([!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\x09\x20]*=[\x09\x20]*("(?:[\x20!\x23-\x5b\x5d-\x7e\x80-\xff]|\\[\x20-\x7e])*"|[!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\x09\x20]*/g // eslint-disable-line no-control-regex
var TEXT_REGEXP = /^[\x20-\x7e\x80-\xff]+$/
var TOKEN_REGEXP = /^[!#$%&'*+.0-9A-Z^_`a-z|~-]+$/

/**
 * RegExp for various RFC 5987 grammar
 *
 * ext-value     = charset  "'" [ language ] "'" value-chars
 * charset       = "UTF-8" / "ISO-8859-1" / mime-charset
 * mime-charset  = 1*mime-charsetc
 * mime-charsetc = ALPHA / DIGIT
 *               / "!" / "#" / "$" / "%" / "&"
 *               / "+" / "-" / "^" / "_" / "`"
 *               / "{" / "}" / "~"
 * language      = ( 2*3ALPHA [ extlang ] )
 *               / 4ALPHA
 *               / 5*8ALPHA
 * extlang       = *3( "-" 3ALPHA )
 * value-chars   = *( pct-encoded / attr-char )
 * pct-encoded   = "%" HEXDIG HEXDIG
 * attr-char     = ALPHA / DIGIT
 *               / "!" / "#" / "$" / "&" / "+" / "-" / "."
 *               / "^" / "_" / "`" / "|" / "~"
 * @private
 */

var EXT_VALUE_REGEXP = /^([A-Za-z0-9!#$%&+\-^_`{}~]+)'(?:[A-Za-z]{2,3}(?:-[A-Za-z]{3}){0,3}|[A-Za-z]{4,8}|)'((?:%[0-9A-Fa-f]{2}|[A-Za-z0-9!#$&+.^_`|~-])+)$/

/**
 * RegExp for various RFC 6266 grammar
 *
 * disposition-type = "inline" | "attachment" | disp-ext-type
 * disp-ext-type    = token
 * disposition-parm = filename-parm | disp-ext-parm
 * filename-parm    = "filename" "=" value
 *                  | "filename*" "=" ext-value
 * disp-ext-parm    = token "=" value
 *                  | ext-token "=" ext-value
 * ext-token        = <the characters in token, followed by "*">
 * @private
 */

var DISPOSITION_TYPE_REGEXP = /^([!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\x09\x20]*(?:$|;)/ // eslint-disable-line no-control-regex

/**
 * Create an attachment Content-Disposition header.
 *
 * @param {string} [filename]
 * @param {object} [options]
 * @param {string} [options.type=attachment]
 * @param {string|boolean} [options.fallback=true]
 * @return {string}
 * @public
 */

function contentDisposition (filename, options) {
  var opts = options || {}

  // get type
  var type = opts.type || 'attachment'

  // get parameters
  var params = createparams(filename, opts.fallback)

  // format into string
  return format(new ContentDisposition(type, params))
}

/**
 * Create parameters object from filename and fallback.
 *
 * @param {string} [filename]
 * @param {string|boolean} [fallback=true]
 * @return {object}
 * @private
 */

function createparams (filename, fallback) {
  if (filename === undefined) {
    return
  }

  var params = {}

  if (typeof filename !== 'string') {
    throw new TypeError('filename must be a string')
  }

  // fallback defaults to true
  if (fallback === undefined) {
    fallback = true
  }

  if (typeof fallback !== 'string' && typeof fallback !== 'boolean') {
    throw new TypeError('fallback must be a string or boolean')
  }

  if (typeof fallback === 'string' && NON_LATIN1_REGEXP.test(fallback)) {
    throw new TypeError('fallback must be ISO-8859-1 string')
  }

  // restrict to file base name
  var name = basename(filename)

  // determine if name is suitable for quoted string
  var isQuotedString = TEXT_REGEXP.test(name)

  // generate fallback name
  var fallbackName = typeof fallback !== 'string'
    ? fallback && getlatin1(name)
    : basename(fallback)
  var hasFallback = typeof fallbackName === 'string' && fallbackName !== name

  // set extended filename parameter
  if (hasFallback || !isQuotedString || HEX_ESCAPE_REGEXP.test(name)) {
    params['filename*'] = name
  }

  // set filename parameter
  if (isQuotedString || hasFallback) {
    params.filename = hasFallback
      ? fallbackName
      : name
  }

  return params
}

/**
 * Format object to Content-Disposition header.
 *
 * @param {object} obj
 * @param {string} obj.type
 * @param {object} [obj.parameters]
 * @return {string}
 * @private
 */

function format (obj) {
  var parameters = obj.parameters
  var type = obj.type

  if (!type || typeof type !== 'string' || !TOKEN_REGEXP.test(type)) {
    throw new TypeError('invalid type')
  }

  // start with normalized type
  var string = String(type).toLowerCase()

  // append parameters
  if (parameters && typeof parameters === 'object') {
    var param
    var params = Object.keys(parameters).sort()

    for (var i = 0; i < params.length; i++) {
      param = params[i]

      var val = param.substr(-1) === '*'
        ? ustring(parameters[param])
        : qstring(parameters[param])

      string += '; ' + param + '=' + val
    }
  }

  return string
}

/**
 * Decode a RFC 5987 field value (gracefully).
 *
 * @param {string} str
 * @return {string}
 * @private
 */

function decodefield (str) {
  var match = EXT_VALUE_REGEXP.exec(str)

  if (!match) {
    throw new TypeError('invalid extended field value')
  }

  var charset = match[1].toLowerCase()
  var encoded = match[2]
  var value

  // to binary string
  var binary = encoded.replace(HEX_ESCAPE_REPLACE_REGEXP, pdecode)

  switch (charset) {
    case 'iso-8859-1':
      value = getlatin1(binary)
      break
    case 'utf-8':
      value = Buffer.from(binary, 'binary').toString('utf8')
      break
    default:
      throw new TypeError('unsupported charset in extended field')
  }

  return value
}

/**
 * Get ISO-8859-1 version of string.
 *
 * @param {string} val
 * @return {string}
 * @private
 */

function getlatin1 (val) {
  // simple Unicode -> ISO-8859-1 transformation
  return String(val).replace(NON_LATIN1_REGEXP, '?')
}

/**
 * Parse Content-Disposition header string.
 *
 * @param {string} string
 * @return {object}
 * @public
 */

function parse (string) {
  if (!string || typeof string !== 'string') {
    throw new TypeError('argument string is required')
  }

  var match = DISPOSITION_TYPE_REGEXP.exec(string)

  if (!match) {
    throw new TypeError('invalid type format')
  }

  // normalize type
  var index = match[0].length
  var type = match[1].toLowerCase()

  var key
  var names = []
  var params = {}
  var value

  // calculate index to start at
  index = PARAM_REGEXP.lastIndex = match[0].substr(-1) === ';'
    ? index - 1
    : index

  // match parameters
  while ((match = PARAM_REGEXP.exec(string))) {
    if (match.index !== index) {
      throw new TypeError('invalid parameter format')
    }

    index += match[0].length
    key = match[1].toLowerCase()
    value = match[2]

    if (names.indexOf(key) !== -1) {
      throw new TypeError('invalid duplicate parameter')
    }

    names.push(key)

    if (key.indexOf('*') + 1 === key.length) {
      // decode extended value
      key = key.slice(0, -1)
      value = decodefield(value)

      // overwrite existing value
      params[key] = value
      continue
    }

    if (typeof params[key] === 'string') {
      continue
    }

    if (value[0] === '"') {
      // remove quotes and escapes
      value = value
        .substr(1, value.length - 2)
        .replace(QESC_REGEXP, '$1')
    }

    params[key] = value
  }

  if (index !== -1 && index !== string.length) {
    throw new TypeError('invalid parameter format')
  }

  return new ContentDisposition(type, params)
}

/**
 * Percent decode a single character.
 *
 * @param {string} str
 * @param {string} hex
 * @return {string}
 * @private
 */

function pdecode (str, hex) {
  return String.fromCharCode(parseInt(hex, 16))
}

/**
 * Percent encode a single character.
 *
 * @param {string} char
 * @return {string}
 * @private
 */

function pencode (char) {
  return '%' + String(char)
    .charCodeAt(0)
    .toString(16)
    .toUpperCase()
}

/**
 * Quote a string for HTTP.
 *
 * @param {string} val
 * @return {string}
 * @private
 */

function qstring (val) {
  var str = String(val)

  return '"' + str.replace(QUOTE_REGEXP, '\\$1') + '"'
}

/**
 * Encode a Unicode string for HTTP (RFC 5987).
 *
 * @param {string} val
 * @return {string}
 * @private
 */

function ustring (val) {
  var str = String(val)

  // percent encode as UTF-8
  var encoded = encodeURIComponent(str)
    .replace(ENCODE_URL_ATTR_CHAR_REGEXP, pencode)

  return 'UTF-8\'\'' + encoded
}

/**
 * Class for parsed Content-Disposition header for v8 optimization
 *
 * @public
 * @param {string} type
 * @param {object} parameters
 * @constructor
 */

function ContentDisposition (type, parameters) {
  this.type = type
  this.parameters = parameters
}
{
  "name": "content-disposition",
  "description": "Create and parse Content-Disposition header",
  "version": "0.5.4",
  "author": "Douglas Christopher Wilson <doug@somethingdoug.com>",
  "license": "MIT",
  "repository": "jshttp/content-disposition",
  "dependencies": {
    "safe-buffer": "5.2.1"
  },
  "devDependencies": {
    "deep-equal": "1.0.1",
    "eslint": "7.32.0",
    "eslint-config-standard": "13.0.1",
    "eslint-plugin-import": "2.25.3",
    "eslint-plugin-markdown": "2.2.1",
    "eslint-plugin-node": "11.1.0",
    "eslint-plugin-promise": "5.2.0",
    "eslint-plugin-standard": "4.1.0",
    "istanbul": "0.4.5",
    "mocha": "9.1.3"
  },
  "files": [
    "LICENSE",
    "HISTORY.md",
    "README.md",
    "index.js"
  ],
  "engines": {
    "node": ">= 0.6"
  }
}1.0.4 / 2017-09-11
==================

  * perf: skip parameter parsing when no parameters

1.0.3 / 2017-09-10
==================

  * perf: remove argument reassignment

1.0.2 / 2016-05-09
==================

  * perf: enable strict mode

1.0.1 / 2015-02-13
==================

  * Improve missing `Content-Type` header error message

1.0.0 / 2015-02-01
==================

  * Initial implementation, derived from `media-typer@0.3.0`
(The MIT License)

Copyright (c) 2015 Douglas Christopher Wilson

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.
/*!
 * content-type
 * Copyright(c) 2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * RegExp to match *( ";" parameter ) in RFC 7231 sec 3.1.1.1
 *
 * parameter     = token "=" ( token / quoted-string )
 * token         = 1*tchar
 * tchar         = "!" / "#" / "$" / "%" / "&" / "'" / "*"
 *               / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~"
 *               / DIGIT / ALPHA
 *               ; any VCHAR, except delimiters
 * quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE
 * qdtext        = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text
 * obs-text      = %x80-FF
 * quoted-pair   = "\" ( HTAB / SP / VCHAR / obs-text )
 */
var PARAM_REGEXP = /; *([!#$%&'*+.^_`|~0-9A-Za-z-]+) *= *("(?:[\u000b\u0020\u0021\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\u000b\u0020-\u00ff])*"|[!#$%&'*+.^_`|~0-9A-Za-z-]+) */g
var TEXT_REGEXP = /^[\u000b\u0020-\u007e\u0080-\u00ff]+$/
var TOKEN_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/

/**
 * RegExp to match quoted-pair in RFC 7230 sec 3.2.6
 *
 * quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text )
 * obs-text    = %x80-FF
 */
var QESC_REGEXP = /\\([\u000b\u0020-\u00ff])/g

/**
 * RegExp to match chars that must be quoted-pair in RFC 7230 sec 3.2.6
 */
var QUOTE_REGEXP = /([\\"])/g

/**
 * RegExp to match type in RFC 7231 sec 3.1.1.1
 *
 * media-type = type "/" subtype
 * type       = token
 * subtype    = token
 */
var TYPE_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+\/[!#$%&'*+.^_`|~0-9A-Za-z-]+$/

/**
 * Module exports.
 * @public
 */

exports.format = format
exports.parse = parse

/**
 * Format object to media type.
 *
 * @param {object} obj
 * @return {string}
 * @public
 */

function format (obj) {
  if (!obj || typeof obj !== 'object') {
    throw new TypeError('argument obj is required')
  }

  var parameters = obj.parameters
  var type = obj.type

  if (!type || !TYPE_REGEXP.test(type)) {
    throw new TypeError('invalid type')
  }

  var string = type

  // append parameters
  if (parameters && typeof parameters === 'object') {
    var param
    var params = Object.keys(parameters).sort()

    for (var i = 0; i < params.length; i++) {
      param = params[i]

      if (!TOKEN_REGEXP.test(param)) {
        throw new TypeError('invalid parameter name')
      }

      string += '; ' + param + '=' + qstring(parameters[param])
    }
  }

  return string
}

/**
 * Parse media type to object.
 *
 * @param {string|object} string
 * @return {Object}
 * @public
 */

function parse (string) {
  if (!string) {
    throw new TypeError('argument string is required')
  }

  // support req/res-like objects as argument
  var header = typeof string === 'object'
    ? getcontenttype(string)
    : string

  if (typeof header !== 'string') {
    throw new TypeError('argument string is required to be a string')
  }

  var index = header.indexOf(';')
  var type = index !== -1
    ? header.substr(0, index).trim()
    : header.trim()

  if (!TYPE_REGEXP.test(type)) {
    throw new TypeError('invalid media type')
  }

  var obj = new ContentType(type.toLowerCase())

  // parse parameters
  if (index !== -1) {
    var key
    var match
    var value

    PARAM_REGEXP.lastIndex = index

    while ((match = PARAM_REGEXP.exec(header))) {
      if (match.index !== index) {
        throw new TypeError('invalid parameter format')
      }

      index += match[0].length
      key = match[1].toLowerCase()
      value = match[2]

      if (value[0] === '"') {
        // remove quotes and escapes
        value = value
          .substr(1, value.length - 2)
          .replace(QESC_REGEXP, '$1')
      }

      obj.parameters[key] = value
    }

    if (index !== header.length) {
      throw new TypeError('invalid parameter format')
    }
  }

  return obj
}

/**
 * Get content-type from req/res objects.
 *
 * @param {object}
 * @return {Object}
 * @private
 */

function getcontenttype (obj) {
  var header

  if (typeof obj.getHeader === 'function') {
    // res-like
    header = obj.getHeader('content-type')
  } else if (typeof obj.headers === 'object') {
    // req-like
    header = obj.headers && obj.headers['content-type']
  }

  if (typeof header !== 'string') {
    throw new TypeError('content-type header is missing from object')
  }

  return header
}

/**
 * Quote a string if necessary.
 *
 * @param {string} val
 * @return {string}
 * @private
 */

function qstring (val) {
  var str = String(val)

  // no need to quote tokens
  if (TOKEN_REGEXP.test(str)) {
    return str
  }

  if (str.length > 0 && !TEXT_REGEXP.test(str)) {
    throw new TypeError('invalid parameter value')
  }

  return '"' + str.replace(QUOTE_REGEXP, '\\$1') + '"'
}

/**
 * Class to represent a content type.
 * @private
 */
function ContentType (type) {
  this.parameters = Object.create(null)
  this.type = type
}
{
  "name": "content-type",
  "description": "Create and parse HTTP Content-Type header",
  "version": "1.0.4",
  "author": "Douglas Christopher Wilson <doug@somethingdoug.com>",
  "license": "MIT",
  "repository": "jshttp/content-type",
  "devDependencies": {
    "eslint": "3.19.0",
    "eslint-config-standard": "10.2.1",
    "eslint-plugin-import": "2.7.0",
    "eslint-plugin-node": "5.1.1",
    "eslint-plugin-promise": "3.5.0",
    "eslint-plugin-standard": "3.0.1",
    "istanbul": "0.4.5",
    "mocha": "~1.21.5"
  },
  "files": [
    "LICENSE",
    "HISTORY.md",
    "README.md",
    "index.js"
  ],
  "engines": {
    "node": ">= 0.6"
  }
}0.5.0 / 2022-04-11
==================

  * Add `priority` option
  * Fix `expires` option to reject invalid dates
  * pref: improve default decode speed
  * pref: remove slow string split in parse

0.4.2 / 2022-02-02
==================

  * pref: read value only when assigning in parse
  * pref: remove unnecessary regexp in parse

0.4.1 / 2020-04-21
==================

  * Fix `maxAge` option to reject invalid values

0.4.0 / 2019-05-15
==================

  * Add `SameSite=None` support

0.3.1 / 2016-05-26
==================

  * Fix `sameSite: true` to work with draft-7 clients
    - `true` now sends `SameSite=Strict` instead of `SameSite`

0.3.0 / 2016-05-26
==================

  * Add `sameSite` option
    - Replaces `firstPartyOnly` option, never implemented by browsers
  * Improve error message when `encode` is not a function
  * Improve error message when `expires` is not a `Date`

0.2.4 / 2016-05-20
==================

  * perf: enable strict mode
  * perf: use for loop in parse
  * perf: use string concatination for serialization

0.2.3 / 2015-10-25
==================

  * Fix cookie `Max-Age` to never be a floating point number

0.2.2 / 2015-09-17
==================

  * Fix regression when setting empty cookie value
    - Ease the new restriction, which is just basic header-level validation
  * Fix typo in invalid value errors

0.2.1 / 2015-09-17
==================

  * Throw on invalid values provided to `serialize`
    - Ensures the resulting string is a valid HTTP header value

0.2.0 / 2015-08-13
==================

  * Add `firstPartyOnly` option
  * Throw better error for invalid argument to parse
  * perf: hoist regular expression

0.1.5 / 2015-09-17
==================

  * Fix regression when setting empty cookie value
    - Ease the new restriction, which is just basic header-level validation
  * Fix typo in invalid value errors

0.1.4 / 2015-09-17
==================

  * Throw better error for invalid argument to parse
  * Throw on invalid values provided to `serialize`
    - Ensures the resulting string is a valid HTTP header value

0.1.3 / 2015-05-19
==================

  * Reduce the scope of try-catch deopt
  * Remove argument reassignments

0.1.2 / 2014-04-16
==================

  * Remove unnecessary files from npm package

0.1.1 / 2014-02-23
==================

  * Fix bad parse when cookie value contained a comma
  * Fix support for `maxAge` of `0`

0.1.0 / 2013-05-01
==================

  * Add `decode` option
  * Add `encode` option

0.0.6 / 2013-04-08
==================

  * Ignore cookie parts missing `=`

0.0.5 / 2012-10-29
==================

  * Return raw cookie value if value unescape errors

0.0.4 / 2012-06-21
==================

  * Use encode/decodeURIComponent for cookie encoding/decoding
    - Improve server/client interoperability

0.0.3 / 2012-06-06
==================

  * Only escape special characters per the cookie RFC

0.0.2 / 2012-06-01
==================

  * Fix `maxAge` option to not throw error

0.0.1 / 2012-05-28
==================

  * Add more tests

0.0.0 / 2012-05-28
==================

  * Initial release
(The MIT License)

Copyright (c) 2012-2014 Roman Shtylman <shtylman@gmail.com>
Copyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.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.

# Security Policies and Procedures

## Reporting a Bug

The `cookie` team and community take all security bugs seriously. Thank
you for improving the security of the project. We appreciate your efforts and
responsible disclosure and will make every effort to acknowledge your
contributions.

Report security bugs by emailing the current owner(s) of `cookie`. This
information can be found in the npm registry using the command
`npm owner ls cookie`.
If unsure or unable to get the information from the above, open an issue
in the [project issue tracker](https://github.com/jshttp/cookie/issues)
asking for the current contact information.

To ensure the timely response to your report, please ensure that the entirety
of the report is contained within the email body and not solely behind a web
link or an attachment.

At least one owner will acknowledge your email within 48 hours, and will send a
more detailed response within 48 hours indicating the next steps in handling
your report. After the initial reply to your report, the owners will
endeavor to keep you informed of the progress towards a fix and full
announcement, and may ask for additional information or guidance.
/*!
 * cookie
 * Copyright(c) 2012-2014 Roman Shtylman
 * Copyright(c) 2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict';

/**
 * Module exports.
 * @public
 */

exports.parse = parse;
exports.serialize = serialize;

/**
 * Module variables.
 * @private
 */

var __toString = Object.prototype.toString

/**
 * RegExp to match field-content in RFC 7230 sec 3.2
 *
 * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]
 * field-vchar   = VCHAR / obs-text
 * obs-text      = %x80-FF
 */

var fieldContentRegExp = /^[\u0009\u0020-\u007e\u0080-\u00ff]+$/;

/**
 * Parse a cookie header.
 *
 * Parse the given cookie header string into an object
 * The object has the various cookies as keys(names) => values
 *
 * @param {string} str
 * @param {object} [options]
 * @return {object}
 * @public
 */

function parse(str, options) {
  if (typeof str !== 'string') {
    throw new TypeError('argument str must be a string');
  }

  var obj = {}
  var opt = options || {};
  var dec = opt.decode || decode;

  var index = 0
  while (index < str.length) {
    var eqIdx = str.indexOf('=', index)

    // no more cookie pairs
    if (eqIdx === -1) {
      break
    }

    var endIdx = str.indexOf(';', index)

    if (endIdx === -1) {
      endIdx = str.length
    } else if (endIdx < eqIdx) {
      // backtrack on prior semicolon
      index = str.lastIndexOf(';', eqIdx - 1) + 1
      continue
    }

    var key = str.slice(index, eqIdx).trim()

    // only assign once
    if (undefined === obj[key]) {
      var val = str.slice(eqIdx + 1, endIdx).trim()

      // quoted values
      if (val.charCodeAt(0) === 0x22) {
        val = val.slice(1, -1)
      }

      obj[key] = tryDecode(val, dec);
    }

    index = endIdx + 1
  }

  return obj;
}

/**
 * Serialize data into a cookie header.
 *
 * Serialize the a name value pair into a cookie string suitable for
 * http headers. An optional options object specified cookie parameters.
 *
 * serialize('foo', 'bar', { httpOnly: true })
 *   => "foo=bar; httpOnly"
 *
 * @param {string} name
 * @param {string} val
 * @param {object} [options]
 * @return {string}
 * @public
 */

function serialize(name, val, options) {
  var opt = options || {};
  var enc = opt.encode || encode;

  if (typeof enc !== 'function') {
    throw new TypeError('option encode is invalid');
  }

  if (!fieldContentRegExp.test(name)) {
    throw new TypeError('argument name is invalid');
  }

  var value = enc(val);

  if (value && !fieldContentRegExp.test(value)) {
    throw new TypeError('argument val is invalid');
  }

  var str = name + '=' + value;

  if (null != opt.maxAge) {
    var maxAge = opt.maxAge - 0;

    if (isNaN(maxAge) || !isFinite(maxAge)) {
      throw new TypeError('option maxAge is invalid')
    }

    str += '; Max-Age=' + Math.floor(maxAge);
  }

  if (opt.domain) {
    if (!fieldContentRegExp.test(opt.domain)) {
      throw new TypeError('option domain is invalid');
    }

    str += '; Domain=' + opt.domain;
  }

  if (opt.path) {
    if (!fieldContentRegExp.test(opt.path)) {
      throw new TypeError('option path is invalid');
    }

    str += '; Path=' + opt.path;
  }

  if (opt.expires) {
    var expires = opt.expires

    if (!isDate(expires) || isNaN(expires.valueOf())) {
      throw new TypeError('option expires is invalid');
    }

    str += '; Expires=' + expires.toUTCString()
  }

  if (opt.httpOnly) {
    str += '; HttpOnly';
  }

  if (opt.secure) {
    str += '; Secure';
  }

  if (opt.priority) {
    var priority = typeof opt.priority === 'string'
      ? opt.priority.toLowerCase()
      : opt.priority

    switch (priority) {
      case 'low':
        str += '; Priority=Low'
        break
      case 'medium':
        str += '; Priority=Medium'
        break
      case 'high':
        str += '; Priority=High'
        break
      default:
        throw new TypeError('option priority is invalid')
    }
  }

  if (opt.sameSite) {
    var sameSite = typeof opt.sameSite === 'string'
      ? opt.sameSite.toLowerCase() : opt.sameSite;

    switch (sameSite) {
      case true:
        str += '; SameSite=Strict';
        break;
      case 'lax':
        str += '; SameSite=Lax';
        break;
      case 'strict':
        str += '; SameSite=Strict';
        break;
      case 'none':
        str += '; SameSite=None';
        break;
      default:
        throw new TypeError('option sameSite is invalid');
    }
  }

  return str;
}

/**
 * URL-decode string value. Optimized to skip native call when no %.
 *
 * @param {string} str
 * @returns {string}
 */

function decode (str) {
  return str.indexOf('%') !== -1
    ? decodeURIComponent(str)
    : str
}

/**
 * URL-encode value.
 *
 * @param {string} str
 * @returns {string}
 */

function encode (val) {
  return encodeURIComponent(val)
}

/**
 * Determine if value is a Date.
 *
 * @param {*} val
 * @private
 */

function isDate (val) {
  return __toString.call(val) === '[object Date]' ||
    val instanceof Date
}

/**
 * Try decoding a string using a decoding function.
 *
 * @param {string} str
 * @param {function} decode
 * @private
 */

function tryDecode(str, decode) {
  try {
    return decode(str);
  } catch (e) {
    return str;
  }
}
{
  "name": "cookie",
  "description": "HTTP server cookie parsing and serialization",
  "version": "0.5.0",
  "author": "Roman Shtylman <shtylman@gmail.com>",
  "license": "MIT",
  "repository": "jshttp/cookie",
  "devDependencies": {
    "beautify-benchmark": "0.2.4",
    "benchmark": "2.1.4",
    "eslint": "7.32.0",
    "eslint-plugin-markdown": "2.2.1",
    "mocha": "9.2.2",
    "nyc": "15.1.0",
    "safe-buffer": "5.2.1",
    "top-sites": "1.1.97"
  },
  "files": [
    "HISTORY.md",
    "LICENSE",
    "README.md",
    "SECURITY.md",
    "index.js"
  ],
  "engines": {
    "node": ">= 0.6"
  }
}1.0.6 / 2015-02-03
==================

* use `npm test` instead of `make test` to run tests
* clearer assertion messages when checking input


1.0.5 / 2014-09-05
==================

* add license to package.json

1.0.4 / 2014-06-25
==================

 * corrected avoidance of timing attacks (thanks @tenbits!)

1.0.3 / 2014-01-28
==================

 * [incorrect] fix for timing attacks

1.0.2 / 2014-01-28
==================

 * fix missing repository warning
 * fix typo in test

1.0.1 / 2013-04-15
==================

  * Revert "Changed underlying HMAC algo. to sha512."
  * Revert "Fix for timing attacks on MAC verification."

0.0.1 / 2010-01-03
==================

  * Initial release
/**
 * Module dependencies.
 */

var crypto = require('crypto');

/**
 * Sign the given `val` with `secret`.
 *
 * @param {String} val
 * @param {String} secret
 * @return {String}
 * @api private
 */

exports.sign = function(val, secret){
  if ('string' != typeof val) throw new TypeError("Cookie value must be provided as a string.");
  if ('string' != typeof secret) throw new TypeError("Secret string must be provided.");
  return val + '.' + crypto
    .createHmac('sha256', secret)
    .update(val)
    .digest('base64')
    .replace(/\=+$/, '');
};

/**
 * Unsign and decode the given `val` with `secret`,
 * returning `false` if the signature is invalid.
 *
 * @param {String} val
 * @param {String} secret
 * @return {String|Boolean}
 * @api private
 */

exports.unsign = function(val, secret){
  if ('string' != typeof val) throw new TypeError("Signed cookie string must be provided.");
  if ('string' != typeof secret) throw new TypeError("Secret string must be provided.");
  var str = val.slice(0, val.lastIndexOf('.'))
    , mac = exports.sign(str, secret);
  
  return sha1(mac) == sha1(val) ? str : false;
};

/**
 * Private
 */

function sha1(str){
  return crypto.createHash('sha1').update(str).digest('hex');
}
{
  "name": "cookie-signature",
  "version": "1.0.6",
  "description": "Sign and unsign cookies",
  "author": "TJ Holowaychuk <tj@learnboost.com>",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/visionmedia/node-cookie-signature.git"
  },
  "dependencies": {},
  "devDependencies": {
    "mocha": "*",
    "should": "*"
  },
  "main": "index"
}(The MIT License)

Copyright (c) 2014-2017 TJ Holowaychuk <tj@vision-media.ca>
Copyright (c) 2018-2021 Josh Junon

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": "debug",
  "version": "4.3.4",
  "repository": {
    "type": "git",
    "url": "git://github.com/debug-js/debug.git"
  },
  "description": "Lightweight debugging utility for Node.js and the browser",
  "files": [
    "src",
    "LICENSE",
    "README.md"
  ],
  "author": "Josh Junon <josh.junon@protonmail.com>",
  "license": "MIT",
  "dependencies": {
    "ms": "2.1.2"
  },
  "devDependencies": {
    "brfs": "^2.0.1",
    "browserify": "^16.2.3",
    "coveralls": "^3.0.2",
    "istanbul": "^0.4.5",
    "karma": "^3.1.4",
    "karma-browserify": "^6.0.0",
    "karma-chrome-launcher": "^2.2.0",
    "karma-mocha": "^1.3.0",
    "mocha": "^5.2.0",
    "mocha-lcov-reporter": "^1.2.0",
    "xo": "^0.23.0"
  },
  "peerDependenciesMeta": {
    "supports-color": {
      "optional": true
    }
  },
  "main": "./src/index.js",
  "browser": "./src/browser.js",
  "engines": {
    "node": ">=6.0"
  }
}/* eslint-env browser */

/**
 * This is the web browser implementation of `debug()`.
 */

exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;
exports.storage = localstorage();
exports.destroy = (() => {
	let warned = false;

	return () => {
		if (!warned) {
			warned = true;
			console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
		}
	};
})();

/**
 * Colors.
 */

exports.colors = [
	'#0000CC',
	'#0000FF',
	'#0033CC',
	'#0033FF',
	'#0066CC',
	'#0066FF',
	'#0099CC',
	'#0099FF',
	'#00CC00',
	'#00CC33',
	'#00CC66',
	'#00CC99',
	'#00CCCC',
	'#00CCFF',
	'#3300CC',
	'#3300FF',
	'#3333CC',
	'#3333FF',
	'#3366CC',
	'#3366FF',
	'#3399CC',
	'#3399FF',
	'#33CC00',
	'#33CC33',
	'#33CC66',
	'#33CC99',
	'#33CCCC',
	'#33CCFF',
	'#6600CC',
	'#6600FF',
	'#6633CC',
	'#6633FF',
	'#66CC00',
	'#66CC33',
	'#9900CC',
	'#9900FF',
	'#9933CC',
	'#9933FF',
	'#99CC00',
	'#99CC33',
	'#CC0000',
	'#CC0033',
	'#CC0066',
	'#CC0099',
	'#CC00CC',
	'#CC00FF',
	'#CC3300',
	'#CC3333',
	'#CC3366',
	'#CC3399',
	'#CC33CC',
	'#CC33FF',
	'#CC6600',
	'#CC6633',
	'#CC9900',
	'#CC9933',
	'#CCCC00',
	'#CCCC33',
	'#FF0000',
	'#FF0033',
	'#FF0066',
	'#FF0099',
	'#FF00CC',
	'#FF00FF',
	'#FF3300',
	'#FF3333',
	'#FF3366',
	'#FF3399',
	'#FF33CC',
	'#FF33FF',
	'#FF6600',
	'#FF6633',
	'#FF9900',
	'#FF9933',
	'#FFCC00',
	'#FFCC33'
];

/**
 * Currently only WebKit-based Web Inspectors, Firefox >= v31,
 * and the Firebug extension (any Firefox version) are known
 * to support "%c" CSS customizations.
 *
 * TODO: add a `localStorage` variable to explicitly enable/disable colors
 */

// eslint-disable-next-line complexity
function useColors() {
	// NB: In an Electron preload script, document will be defined but not fully
	// initialized. Since we know we're in Chrome, we'll just detect this case
	// explicitly
	if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
		return true;
	}

	// Internet Explorer and Edge do not support colors.
	if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
		return false;
	}

	// Is webkit? http://stackoverflow.com/a/16459606/376773
	// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
	return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
		// Is firebug? http://stackoverflow.com/a/398120/376773
		(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
		// Is firefox >= v31?
		// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
		(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
		// Double check webkit in userAgent just in case we are in a worker
		(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
}

/**
 * Colorize log arguments if enabled.
 *
 * @api public
 */

function formatArgs(args) {
	args[0] = (this.useColors ? '%c' : '') +
		this.namespace +
		(this.useColors ? ' %c' : ' ') +
		args[0] +
		(this.useColors ? '%c ' : ' ') +
		'+' + module.exports.humanize(this.diff);

	if (!this.useColors) {
		return;
	}

	const c = 'color: ' + this.color;
	args.splice(1, 0, c, 'color: inherit');

	// The final "%c" is somewhat tricky, because there could be other
	// arguments passed either before or after the %c, so we need to
	// figure out the correct index to insert the CSS into
	let index = 0;
	let lastC = 0;
	args[0].replace(/%[a-zA-Z%]/g, match => {
		if (match === '%%') {
			return;
		}
		index++;
		if (match === '%c') {
			// We only are interested in the *last* %c
			// (the user may have provided their own)
			lastC = index;
		}
	});

	args.splice(lastC, 0, c);
}

/**
 * Invokes `console.debug()` when available.
 * No-op when `console.debug` is not a "function".
 * If `console.debug` is not available, falls back
 * to `console.log`.
 *
 * @api public
 */
exports.log = console.debug || console.log || (() => {});

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */
function save(namespaces) {
	try {
		if (namespaces) {
			exports.storage.setItem('debug', namespaces);
		} else {
			exports.storage.removeItem('debug');
		}
	} catch (error) {
		// Swallow
		// XXX (@Qix-) should we be logging these?
	}
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */
function load() {
	let r;
	try {
		r = exports.storage.getItem('debug');
	} catch (error) {
		// Swallow
		// XXX (@Qix-) should we be logging these?
	}

	// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
	if (!r && typeof process !== 'undefined' && 'env' in process) {
		r = process.env.DEBUG;
	}

	return r;
}

/**
 * Localstorage attempts to return the localstorage.
 *
 * This is necessary because safari throws
 * when a user disables cookies/localstorage
 * and you attempt to access it.
 *
 * @return {LocalStorage}
 * @api private
 */

function localstorage() {
	try {
		// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
		// The Browser also has localStorage in the global context.
		return localStorage;
	} catch (error) {
		// Swallow
		// XXX (@Qix-) should we be logging these?
	}
}

module.exports = require('./common')(exports);

const {formatters} = module.exports;

/**
 * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
 */

formatters.j = function (v) {
	try {
		return JSON.stringify(v);
	} catch (error) {
		return '[UnexpectedJSONParseError]: ' + error.message;
	}
};

/**
 * This is the common logic for both the Node.js and web browser
 * implementations of `debug()`.
 */

function setup(env) {
	createDebug.debug = createDebug;
	createDebug.default = createDebug;
	createDebug.coerce = coerce;
	createDebug.disable = disable;
	createDebug.enable = enable;
	createDebug.enabled = enabled;
	createDebug.humanize = require('ms');
	createDebug.destroy = destroy;

	Object.keys(env).forEach(key => {
		createDebug[key] = env[key];
	});

	/**
	* The currently active debug mode names, and names to skip.
	*/

	createDebug.names = [];
	createDebug.skips = [];

	/**
	* Map of special "%n" handling functions, for the debug "format" argument.
	*
	* Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
	*/
	createDebug.formatters = {};

	/**
	* Selects a color for a debug namespace
	* @param {String} namespace The namespace string for the debug instance to be colored
	* @return {Number|String} An ANSI color code for the given namespace
	* @api private
	*/
	function selectColor(namespace) {
		let hash = 0;

		for (let i = 0; i < namespace.length; i++) {
			hash = ((hash << 5) - hash) + namespace.charCodeAt(i);
			hash |= 0; // Convert to 32bit integer
		}

		return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
	}
	createDebug.selectColor = selectColor;

	/**
	* Create a debugger with the given `namespace`.
	*
	* @param {String} namespace
	* @return {Function}
	* @api public
	*/
	function createDebug(namespace) {
		let prevTime;
		let enableOverride = null;
		let namespacesCache;
		let enabledCache;

		function debug(...args) {
			// Disabled?
			if (!debug.enabled) {
				return;
			}

			const self = debug;

			// Set `diff` timestamp
			const curr = Number(new Date());
			const ms = curr - (prevTime || curr);
			self.diff = ms;
			self.prev = prevTime;
			self.curr = curr;
			prevTime = curr;

			args[0] = createDebug.coerce(args[0]);

			if (typeof args[0] !== 'string') {
				// Anything else let's inspect with %O
				args.unshift('%O');
			}

			// Apply any `formatters` transformations
			let index = 0;
			args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {
				// If we encounter an escaped % then don't increase the array index
				if (match === '%%') {
					return '%';
				}
				index++;
				const formatter = createDebug.formatters[format];
				if (typeof formatter === 'function') {
					const val = args[index];
					match = formatter.call(self, val);

					// Now we need to remove `args[index]` since it's inlined in the `format`
					args.splice(index, 1);
					index--;
				}
				return match;
			});

			// Apply env-specific formatting (colors, etc.)
			createDebug.formatArgs.call(self, args);

			const logFn = self.log || createDebug.log;
			logFn.apply(self, args);
		}

		debug.namespace = namespace;
		debug.useColors = createDebug.useColors();
		debug.color = createDebug.selectColor(namespace);
		debug.extend = extend;
		debug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.

		Object.defineProperty(debug, 'enabled', {
			enumerable: true,
			configurable: false,
			get: () => {
				if (enableOverride !== null) {
					return enableOverride;
				}
				if (namespacesCache !== createDebug.namespaces) {
					namespacesCache = createDebug.namespaces;
					enabledCache = createDebug.enabled(namespace);
				}

				return enabledCache;
			},
			set: v => {
				enableOverride = v;
			}
		});

		// Env-specific initialization logic for debug instances
		if (typeof createDebug.init === 'function') {
			createDebug.init(debug);
		}

		return debug;
	}

	function extend(namespace, delimiter) {
		const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
		newDebug.log = this.log;
		return newDebug;
	}

	/**
	* Enables a debug mode by namespaces. This can include modes
	* separated by a colon and wildcards.
	*
	* @param {String} namespaces
	* @api public
	*/
	function enable(namespaces) {
		createDebug.save(namespaces);
		createDebug.namespaces = namespaces;

		createDebug.names = [];
		createDebug.skips = [];

		let i;
		const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
		const len = split.length;

		for (i = 0; i < len; i++) {
			if (!split[i]) {
				// ignore empty strings
				continue;
			}

			namespaces = split[i].replace(/\*/g, '.*?');

			if (namespaces[0] === '-') {
				createDebug.skips.push(new RegExp('^' + namespaces.slice(1) + '$'));
			} else {
				createDebug.names.push(new RegExp('^' + namespaces + '$'));
			}
		}
	}

	/**
	* Disable debug output.
	*
	* @return {String} namespaces
	* @api public
	*/
	function disable() {
		const namespaces = [
			...createDebug.names.map(toNamespace),
			...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace)
		].join(',');
		createDebug.enable('');
		return namespaces;
	}

	/**
	* Returns true if the given mode name is enabled, false otherwise.
	*
	* @param {String} name
	* @return {Boolean}
	* @api public
	*/
	function enabled(name) {
		if (name[name.length - 1] === '*') {
			return true;
		}

		let i;
		let len;

		for (i = 0, len = createDebug.skips.length; i < len; i++) {
			if (createDebug.skips[i].test(name)) {
				return false;
			}
		}

		for (i = 0, len = createDebug.names.length; i < len; i++) {
			if (createDebug.names[i].test(name)) {
				return true;
			}
		}

		return false;
	}

	/**
	* Convert regexp to namespace
	*
	* @param {RegExp} regxep
	* @return {String} namespace
	* @api private
	*/
	function toNamespace(regexp) {
		return regexp.toString()
			.substring(2, regexp.toString().length - 2)
			.replace(/\.\*\?$/, '*');
	}

	/**
	* Coerce `val`.
	*
	* @param {Mixed} val
	* @return {Mixed}
	* @api private
	*/
	function coerce(val) {
		if (val instanceof Error) {
			return val.stack || val.message;
		}
		return val;
	}

	/**
	* XXX DO NOT USE. This is a temporary stub function.
	* XXX It WILL be removed in the next major release.
	*/
	function destroy() {
		console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
	}

	createDebug.enable(createDebug.load());

	return createDebug;
}

module.exports = setup;
/**
 * Detect Electron renderer / nwjs process, which is node, but we should
 * treat as a browser.
 */

if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {
	module.exports = require('./browser.js');
} else {
	module.exports = require('./node.js');
}
/**
 * Module dependencies.
 */

const tty = require('tty');
const util = require('util');

/**
 * This is the Node.js implementation of `debug()`.
 */

exports.init = init;
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;
exports.destroy = util.deprecate(
	() => {},
	'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'
);

/**
 * Colors.
 */

exports.colors = [6, 2, 3, 4, 5, 1];

try {
	// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)
	// eslint-disable-next-line import/no-extraneous-dependencies
	const supportsColor = require('supports-color');

	if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {
		exports.colors = [
			20,
			21,
			26,
			27,
			32,
			33,
			38,
			39,
			40,
			41,
			42,
			43,
			44,
			45,
			56,
			57,
			62,
			63,
			68,
			69,
			74,
			75,
			76,
			77,
			78,
			79,
			80,
			81,
			92,
			93,
			98,
			99,
			112,
			113,
			128,
			129,
			134,
			135,
			148,
			149,
			160,
			161,
			162,
			163,
			164,
			165,
			166,
			167,
			168,
			169,
			170,
			171,
			172,
			173,
			178,
			179,
			184,
			185,
			196,
			197,
			198,
			199,
			200,
			201,
			202,
			203,
			204,
			205,
			206,
			207,
			208,
			209,
			214,
			215,
			220,
			221
		];
	}
} catch (error) {
	// Swallow - we only care if `supports-color` is available; it doesn't have to be.
}

/**
 * Build up the default `inspectOpts` object from the environment variables.
 *
 *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
 */

exports.inspectOpts = Object.keys(process.env).filter(key => {
	return /^debug_/i.test(key);
}).reduce((obj, key) => {
	// Camel-case
	const prop = key
		.substring(6)
		.toLowerCase()
		.replace(/_([a-z])/g, (_, k) => {
			return k.toUpperCase();
		});

	// Coerce string value into JS value
	let val = process.env[key];
	if (/^(yes|on|true|enabled)$/i.test(val)) {
		val = true;
	} else if (/^(no|off|false|disabled)$/i.test(val)) {
		val = false;
	} else if (val === 'null') {
		val = null;
	} else {
		val = Number(val);
	}

	obj[prop] = val;
	return obj;
}, {});

/**
 * Is stdout a TTY? Colored output is enabled when `true`.
 */

function useColors() {
	return 'colors' in exports.inspectOpts ?
		Boolean(exports.inspectOpts.colors) :
		tty.isatty(process.stderr.fd);
}

/**
 * Adds ANSI color escape codes if enabled.
 *
 * @api public
 */

function formatArgs(args) {
	const {namespace: name, useColors} = this;

	if (useColors) {
		const c = this.color;
		const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c);
		const prefix = `  ${colorCode};1m${name} \u001B[0m`;

		args[0] = prefix + args[0].split('\n').join('\n' + prefix);
		args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m');
	} else {
		args[0] = getDate() + name + ' ' + args[0];
	}
}

function getDate() {
	if (exports.inspectOpts.hideDate) {
		return '';
	}
	return new Date().toISOString() + ' ';
}

/**
 * Invokes `util.format()` with the specified arguments and writes to stderr.
 */

function log(...args) {
	return process.stderr.write(util.format(...args) + '\n');
}

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */
function save(namespaces) {
	if (namespaces) {
		process.env.DEBUG = namespaces;
	} else {
		// If you set a process.env field to null or undefined, it gets cast to the
		// string 'null' or 'undefined'. Just delete instead.
		delete process.env.DEBUG;
	}
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */

function load() {
	return process.env.DEBUG;
}

/**
 * Init logic for `debug` instances.
 *
 * Create a new `inspectOpts` object in case `useColors` is set
 * differently for a particular `debug` instance.
 */

function init(debug) {
	debug.inspectOpts = {};

	const keys = Object.keys(exports.inspectOpts);
	for (let i = 0; i < keys.length; i++) {
		debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
	}
}

module.exports = require('./common')(exports);

const {formatters} = module.exports;

/**
 * Map %o to `util.inspect()`, all on a single line.
 */

formatters.o = function (v) {
	this.inspectOpts.colors = this.useColors;
	return util.inspect(v, this.inspectOpts)
		.split('\n')
		.map(str => str.trim())
		.join(' ');
};

/**
 * Map %O to `util.inspect()`, allowing multiple lines if needed.
 */

formatters.O = function (v) {
	this.inspectOpts.colors = this.useColors;
	return util.inspect(v, this.inspectOpts);
};
The MIT License (MIT)

Copyright (c) 2013-2018, Viacheslav Lotsmanov

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.
module.exports = require('./lib/deep-extend');
{
  "name": "deep-extend",
  "description": "Recursive object extending",
  "license": "MIT",
  "version": "0.6.0",
  "homepage": "https://github.com/unclechu/node-deep-extend",
  "licenses": [
    {
      "type": "MIT",
      "url": "https://raw.githubusercontent.com/unclechu/node-deep-extend/master/LICENSE"
    }
  ],
  "repository": {
    "type": "git",
    "url": "git://github.com/unclechu/node-deep-extend.git"
  },
  "author": "Viacheslav Lotsmanov <lotsmanov89@gmail.com>",
  "main": "lib/deep-extend.js",
  "engines": {
    "node": ">=4.0.0"
  },
  "devDependencies": {
    "mocha": "5.2.0",
    "should": "13.2.1"
  },
  "files": [
    "index.js",
    "lib/"
  ]
}/*!
 * @description Recursive object extending
 * @author Viacheslav Lotsmanov <lotsmanov89@gmail.com>
 * @license MIT
 *
 * The MIT License (MIT)
 *
 * Copyright (c) 2013-2018 Viacheslav Lotsmanov
 *
 * 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';

function isSpecificValue(val) {
	return (
		val instanceof Buffer
		|| val instanceof Date
		|| val instanceof RegExp
	) ? true : false;
}

function cloneSpecificValue(val) {
	if (val instanceof Buffer) {
		var x = Buffer.alloc
			? Buffer.alloc(val.length)
			: new Buffer(val.length);
		val.copy(x);
		return x;
	} else if (val instanceof Date) {
		return new Date(val.getTime());
	} else if (val instanceof RegExp) {
		return new RegExp(val);
	} else {
		throw new Error('Unexpected situation');
	}
}

/**
 * Recursive cloning array.
 */
function deepCloneArray(arr) {
	var clone = [];
	arr.forEach(function (item, index) {
		if (typeof item === 'object' && item !== null) {
			if (Array.isArray(item)) {
				clone[index] = deepCloneArray(item);
			} else if (isSpecificValue(item)) {
				clone[index] = cloneSpecificValue(item);
			} else {
				clone[index] = deepExtend({}, item);
			}
		} else {
			clone[index] = item;
		}
	});
	return clone;
}

function safeGetProperty(object, property) {
	return property === '__proto__' ? undefined : object[property];
}

/**
 * Extening object that entered in first argument.
 *
 * Returns extended object or false if have no target object or incorrect type.
 *
 * If you wish to clone source object (without modify it), just use empty new
 * object as first argument, like this:
 *   deepExtend({}, yourObj_1, [yourObj_N]);
 */
var deepExtend = module.exports = function (/*obj_1, [obj_2], [obj_N]*/) {
	if (arguments.length < 1 || typeof arguments[0] !== 'object') {
		return false;
	}

	if (arguments.length < 2) {
		return arguments[0];
	}

	var target = arguments[0];

	// convert arguments to array and cut off target object
	var args = Array.prototype.slice.call(arguments, 1);

	var val, src, clone;

	args.forEach(function (obj) {
		// skip argument if isn't an object, is null, or is an array
		if (typeof obj !== 'object' || obj === null || Array.isArray(obj)) {
			return;
		}

		Object.keys(obj).forEach(function (key) {
			src = safeGetProperty(target, key); // source value
			val = safeGetProperty(obj, key); // new value

			// recursion prevention
			if (val === target) {
				return;

			/**
			 * if new value isn't object then just overwrite by new value
			 * instead of extending.
			 */
			} else if (typeof val !== 'object' || val === null) {
				target[key] = val;
				return;

			// just clone arrays (and recursive clone objects inside)
			} else if (Array.isArray(val)) {
				target[key] = deepCloneArray(val);
				return;

			// custom cloning and overwrite for specific objects
			} else if (isSpecificValue(val)) {
				target[key] = cloneSpecificValue(val);
				return;

			// overwrite by new value if source isn't object or array
			} else if (typeof src !== 'object' || src === null || Array.isArray(src)) {
				target[key] = deepExtend({}, val);
				return;

			// source value and new value is objects both, extending...
			} else {
				target[key] = deepExtend(src, val);
				return;
			}
		});
	});

	return target;
};
'use strict';
module.exports = (object, propertyName, fn) => {
	const define = value => Object.defineProperty(object, propertyName, {value, enumerable: true, writable: true});

	Object.defineProperty(object, propertyName, {
		configurable: true,
		enumerable: true,
		get() {
			const result = fn();
			define(result);
			return result;
		},
		set(value) {
			define(value);
		}
	});

	return object;
};
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": "define-lazy-prop",
  "version": "2.0.0",
  "description": "Define a lazily evaluated property on an object",
  "license": "MIT",
  "repository": "sindresorhus/define-lazy-prop",
  "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"
  }
}root = true

[*]
indent_style = tab;
insert_final_newline = true;
quote_type = auto;
space_after_anonymous_functions = true;
space_after_control_statements = true;
spaces_around_operators = true;
trim_trailing_whitespace = true;
spaces_in_brackets = false;
end_of_line = lf;

{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"exclude": [
		"coverage",
		"test"
	]
}
The MIT License (MIT)

Copyright (C) 2015 Jordan Harband

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 keys = require('object-keys');
var hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';

var toStr = Object.prototype.toString;
var concat = Array.prototype.concat;
var origDefineProperty = Object.defineProperty;

var isFunction = function (fn) {
	return typeof fn === 'function' && toStr.call(fn) === '[object Function]';
};

var hasPropertyDescriptors = require('has-property-descriptors')();

var supportsDescriptors = origDefineProperty && hasPropertyDescriptors;

var defineProperty = function (object, name, value, predicate) {
	if (name in object && (!isFunction(predicate) || !predicate())) {
		return;
	}
	if (supportsDescriptors) {
		origDefineProperty(object, name, {
			configurable: true,
			enumerable: false,
			value: value,
			writable: true
		});
	} else {
		object[name] = value; // eslint-disable-line no-param-reassign
	}
};

var defineProperties = function (object, map) {
	var predicates = arguments.length > 2 ? arguments[2] : {};
	var props = keys(map);
	if (hasSymbols) {
		props = concat.call(props, Object.getOwnPropertySymbols(map));
	}
	for (var i = 0; i < props.length; i += 1) {
		defineProperty(object, props[i], map[props[i]], predicates[props[i]]);
	}
};

defineProperties.supportsDescriptors = !!supportsDescriptors;

module.exports = defineProperties;
{
  "name": "define-properties",
  "version": "1.1.4",
  "author": "Jordan Harband <ljharb@gmail.com>",
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "description": "Define multiple non-enumerable properties at once. Uses `Object.defineProperty` when available; falls back to standard assignment in older engines.",
  "license": "MIT",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/ljharb/define-properties.git"
  },
  "dependencies": {
    "has-property-descriptors": "^1.0.0",
    "object-keys": "^1.1.1"
  },
  "devDependencies": {
    "@ljharb/eslint-config": "^21.0.0",
    "aud": "^2.0.0",
    "eslint": "=8.8.0",
    "nyc": "^10.3.2",
    "safe-publish-latest": "^2.0.0",
    "tape": "^5.5.3"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "engines": {
    "node": ">= 0.4"
  }
}# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/define-properties
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
Copyright (c) 2011 Debuggable Limited <felix@debuggable.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.
SHELL := /bin/bash

test:
	@./test/run.js

.PHONY: test

{
  "author": "Felix Geisendörfer <felix@debuggable.com> (http://debuggable.com/)",
  "name": "delayed-stream",
  "description": "Buffers events from a stream until you are ready to handle them.",
  "license": "MIT",
  "version": "1.0.0",
  "homepage": "https://github.com/felixge/node-delayed-stream",
  "repository": {
    "type": "git",
    "url": "git://github.com/felixge/node-delayed-stream.git"
  },
  "main": "./lib/delayed_stream",
  "engines": {
    "node": ">=0.4.0"
  },
  "dependencies": {},
  "devDependencies": {
    "fake": "0.2.0",
    "far": "0.0.1"
  }
}var Stream = require('stream').Stream;
var util = require('util');

module.exports = DelayedStream;
function DelayedStream() {
  this.source = null;
  this.dataSize = 0;
  this.maxDataSize = 1024 * 1024;
  this.pauseStream = true;

  this._maxDataSizeExceeded = false;
  this._released = false;
  this._bufferedEvents = [];
}
util.inherits(DelayedStream, Stream);

DelayedStream.create = function(source, options) {
  var delayedStream = new this();

  options = options || {};
  for (var option in options) {
    delayedStream[option] = options[option];
  }

  delayedStream.source = source;

  var realEmit = source.emit;
  source.emit = function() {
    delayedStream._handleEmit(arguments);
    return realEmit.apply(source, arguments);
  };

  source.on('error', function() {});
  if (delayedStream.pauseStream) {
    source.pause();
  }

  return delayedStream;
};

Object.defineProperty(DelayedStream.prototype, 'readable', {
  configurable: true,
  enumerable: true,
  get: function() {
    return this.source.readable;
  }
});

DelayedStream.prototype.setEncoding = function() {
  return this.source.setEncoding.apply(this.source, arguments);
};

DelayedStream.prototype.resume = function() {
  if (!this._released) {
    this.release();
  }

  this.source.resume();
};

DelayedStream.prototype.pause = function() {
  this.source.pause();
};

DelayedStream.prototype.release = function() {
  this._released = true;

  this._bufferedEvents.forEach(function(args) {
    this.emit.apply(this, args);
  }.bind(this));
  this._bufferedEvents = [];
};

DelayedStream.prototype.pipe = function() {
  var r = Stream.prototype.pipe.apply(this, arguments);
  this.resume();
  return r;
};

DelayedStream.prototype._handleEmit = function(args) {
  if (this._released) {
    this.emit.apply(this, args);
    return;
  }

  if (args[0] === 'data') {
    this.dataSize += args[1].length;
    this._checkIfMaxDataSizeExceeded();
  }

  this._bufferedEvents.push(args);
};

DelayedStream.prototype._checkIfMaxDataSizeExceeded = function() {
  if (this._maxDataSizeExceeded) {
    return;
  }

  if (this.dataSize <= this.maxDataSize) {
    return;
  }

  this._maxDataSizeExceeded = true;
  var message =
    'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.'
  this.emit('error', new Error(message));
};

1.0.0 / 2015-12-14
==================

  * Merge pull request #12 from kasicka/master
  * Add license text

0.1.0 / 2014-10-17
==================

 * adds `.fluent()` to api

0.0.3 / 2014-01-13
==================

 * fix receiver for .method()

0.0.2 / 2014-01-13
==================

 * Object.defineProperty() sucks
 * Initial commit
Copyright (c) 2015 TJ Holowaychuk <tj@vision-media.ca>

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.

test:
	@./node_modules/.bin/mocha \
		--require should \
		--reporter spec \
		--bail

.PHONY: test
/**
 * Expose `Delegator`.
 */

module.exports = Delegator;

/**
 * Initialize a delegator.
 *
 * @param {Object} proto
 * @param {String} target
 * @api public
 */

function Delegator(proto, target) {
  if (!(this instanceof Delegator)) return new Delegator(proto, target);
  this.proto = proto;
  this.target = target;
  this.methods = [];
  this.getters = [];
  this.setters = [];
  this.fluents = [];
}

/**
 * Delegate method `name`.
 *
 * @param {String} name
 * @return {Delegator} self
 * @api public
 */

Delegator.prototype.method = function(name){
  var proto = this.proto;
  var target = this.target;
  this.methods.push(name);

  proto[name] = function(){
    return this[target][name].apply(this[target], arguments);
  };

  return this;
};

/**
 * Delegator accessor `name`.
 *
 * @param {String} name
 * @return {Delegator} self
 * @api public
 */

Delegator.prototype.access = function(name){
  return this.getter(name).setter(name);
};

/**
 * Delegator getter `name`.
 *
 * @param {String} name
 * @return {Delegator} self
 * @api public
 */

Delegator.prototype.getter = function(name){
  var proto = this.proto;
  var target = this.target;
  this.getters.push(name);

  proto.__defineGetter__(name, function(){
    return this[target][name];
  });

  return this;
};

/**
 * Delegator setter `name`.
 *
 * @param {String} name
 * @return {Delegator} self
 * @api public
 */

Delegator.prototype.setter = function(name){
  var proto = this.proto;
  var target = this.target;
  this.setters.push(name);

  proto.__defineSetter__(name, function(val){
    return this[target][name] = val;
  });

  return this;
};

/**
 * Delegator fluent accessor
 *
 * @param {String} name
 * @return {Delegator} self
 * @api public
 */

Delegator.prototype.fluent = function (name) {
  var proto = this.proto;
  var target = this.target;
  this.fluents.push(name);

  proto[name] = function(val){
    if ('undefined' != typeof val) {
      this[target][name] = val;
      return this;
    } else {
      return this[target][name];
    }
  };

  return this;
};
{
  "name": "delegates",
  "version": "1.0.0",
  "repository": "visionmedia/node-delegates",
  "description": "delegate methods and accessors to another property",
  "dependencies": {},
  "devDependencies": {
    "mocha": "*",
    "should": "*"
  },
  "license": "MIT"
}2.0.0 / 2018-10-26
==================

  * Drop support for Node.js 0.6
  * Replace internal `eval` usage with `Function` constructor
  * Use instance methods on `process` to check for listeners

1.1.2 / 2018-01-11
==================

  * perf: remove argument reassignment
  * Support Node.js 0.6 to 9.x

1.1.1 / 2017-07-27
==================

  * Remove unnecessary `Buffer` loading
  * Support Node.js 0.6 to 8.x

1.1.0 / 2015-09-14
==================

  * Enable strict mode in more places
  * Support io.js 3.x
  * Support io.js 2.x
  * Support web browser loading
    - Requires bundler like Browserify or webpack

1.0.1 / 2015-04-07
==================

  * Fix `TypeError`s when under `'use strict'` code
  * Fix useless type name on auto-generated messages
  * Support io.js 1.x
  * Support Node.js 0.12

1.0.0 / 2014-09-17
==================

  * No changes

0.4.5 / 2014-09-09
==================

  * Improve call speed to functions using the function wrapper
  * Support Node.js 0.6

0.4.4 / 2014-07-27
==================

  * Work-around v8 generating empty stack traces

0.4.3 / 2014-07-26
==================

  * Fix exception when global `Error.stackTraceLimit` is too low

0.4.2 / 2014-07-19
==================

  * Correct call site for wrapped functions and properties

0.4.1 / 2014-07-19
==================

  * Improve automatic message generation for function properties

0.4.0 / 2014-07-19
==================

  * Add `TRACE_DEPRECATION` environment variable
  * Remove non-standard grey color from color output
  * Support `--no-deprecation` argument
  * Support `--trace-deprecation` argument
  * Support `deprecate.property(fn, prop, message)`

0.3.0 / 2014-06-16
==================

  * Add `NO_DEPRECATION` environment variable

0.2.0 / 2014-06-15
==================

  * Add `deprecate.property(obj, prop, message)`
  * Remove `supports-color` dependency for node.js 0.8

0.1.0 / 2014-06-15
==================

  * Add `deprecate.function(fn, message)`
  * Add `process.on('deprecation', fn)` emitter
  * Automatically generate message when omitted from `deprecate()`

0.0.1 / 2014-06-15
==================

  * Fix warning for dynamic calls at singe call site

0.0.0 / 2014-06-15
==================

  * Initial implementation
(The MIT License)

Copyright (c) 2014-2018 Douglas Christopher Wilson

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.
/*!
 * depd
 * Copyright(c) 2014-2018 Douglas Christopher Wilson
 * MIT Licensed
 */

/**
 * Module dependencies.
 */

var relative = require('path').relative

/**
 * Module exports.
 */

module.exports = depd

/**
 * Get the path to base files on.
 */

var basePath = process.cwd()

/**
 * Determine if namespace is contained in the string.
 */

function containsNamespace (str, namespace) {
  var vals = str.split(/[ ,]+/)
  var ns = String(namespace).toLowerCase()

  for (var i = 0; i < vals.length; i++) {
    var val = vals[i]

    // namespace contained
    if (val && (val === '*' || val.toLowerCase() === ns)) {
      return true
    }
  }

  return false
}

/**
 * Convert a data descriptor to accessor descriptor.
 */

function convertDataDescriptorToAccessor (obj, prop, message) {
  var descriptor = Object.getOwnPropertyDescriptor(obj, prop)
  var value = descriptor.value

  descriptor.get = function getter () { return value }

  if (descriptor.writable) {
    descriptor.set = function setter (val) { return (value = val) }
  }

  delete descriptor.value
  delete descriptor.writable

  Object.defineProperty(obj, prop, descriptor)

  return descriptor
}

/**
 * Create arguments string to keep arity.
 */

function createArgumentsString (arity) {
  var str = ''

  for (var i = 0; i < arity; i++) {
    str += ', arg' + i
  }

  return str.substr(2)
}

/**
 * Create stack string from stack.
 */

function createStackString (stack) {
  var str = this.name + ': ' + this.namespace

  if (this.message) {
    str += ' deprecated ' + this.message
  }

  for (var i = 0; i < stack.length; i++) {
    str += '\n    at ' + stack[i].toString()
  }

  return str
}

/**
 * Create deprecate for namespace in caller.
 */

function depd (namespace) {
  if (!namespace) {
    throw new TypeError('argument namespace is required')
  }

  var stack = getStack()
  var site = callSiteLocation(stack[1])
  var file = site[0]

  function deprecate (message) {
    // call to self as log
    log.call(deprecate, message)
  }

  deprecate._file = file
  deprecate._ignored = isignored(namespace)
  deprecate._namespace = namespace
  deprecate._traced = istraced(namespace)
  deprecate._warned = Object.create(null)

  deprecate.function = wrapfunction
  deprecate.property = wrapproperty

  return deprecate
}

/**
 * Determine if event emitter has listeners of a given type.
 *
 * The way to do this check is done three different ways in Node.js >= 0.8
 * so this consolidates them into a minimal set using instance methods.
 *
 * @param {EventEmitter} emitter
 * @param {string} type
 * @returns {boolean}
 * @private
 */

function eehaslisteners (emitter, type) {
  var count = typeof emitter.listenerCount !== 'function'
    ? emitter.listeners(type).length
    : emitter.listenerCount(type)

  return count > 0
}

/**
 * Determine if namespace is ignored.
 */

function isignored (namespace) {
  if (process.noDeprecation) {
    // --no-deprecation support
    return true
  }

  var str = process.env.NO_DEPRECATION || ''

  // namespace ignored
  return containsNamespace(str, namespace)
}

/**
 * Determine if namespace is traced.
 */

function istraced (namespace) {
  if (process.traceDeprecation) {
    // --trace-deprecation support
    return true
  }

  var str = process.env.TRACE_DEPRECATION || ''

  // namespace traced
  return containsNamespace(str, namespace)
}

/**
 * Display deprecation message.
 */

function log (message, site) {
  var haslisteners = eehaslisteners(process, 'deprecation')

  // abort early if no destination
  if (!haslisteners && this._ignored) {
    return
  }

  var caller
  var callFile
  var callSite
  var depSite
  var i = 0
  var seen = false
  var stack = getStack()
  var file = this._file

  if (site) {
    // provided site
    depSite = site
    callSite = callSiteLocation(stack[1])
    callSite.name = depSite.name
    file = callSite[0]
  } else {
    // get call site
    i = 2
    depSite = callSiteLocation(stack[i])
    callSite = depSite
  }

  // get caller of deprecated thing in relation to file
  for (; i < stack.length; i++) {
    caller = callSiteLocation(stack[i])
    callFile = caller[0]

    if (callFile === file) {
      seen = true
    } else if (callFile === this._file) {
      file = this._file
    } else if (seen) {
      break
    }
  }

  var key = caller
    ? depSite.join(':') + '__' + caller.join(':')
    : undefined

  if (key !== undefined && key in this._warned) {
    // already warned
    return
  }

  this._warned[key] = true

  // generate automatic message from call site
  var msg = message
  if (!msg) {
    msg = callSite === depSite || !callSite.name
      ? defaultMessage(depSite)
      : defaultMessage(callSite)
  }

  // emit deprecation if listeners exist
  if (haslisteners) {
    var err = DeprecationError(this._namespace, msg, stack.slice(i))
    process.emit('deprecation', err)
    return
  }

  // format and write message
  var format = process.stderr.isTTY
    ? formatColor
    : formatPlain
  var output = format.call(this, msg, caller, stack.slice(i))
  process.stderr.write(output + '\n', 'utf8')
}

/**
 * Get call site location as array.
 */

function callSiteLocation (callSite) {
  var file = callSite.getFileName() || '<anonymous>'
  var line = callSite.getLineNumber()
  var colm = callSite.getColumnNumber()

  if (callSite.isEval()) {
    file = callSite.getEvalOrigin() + ', ' + file
  }

  var site = [file, line, colm]

  site.callSite = callSite
  site.name = callSite.getFunctionName()

  return site
}

/**
 * Generate a default message from the site.
 */

function defaultMessage (site) {
  var callSite = site.callSite
  var funcName = site.name

  // make useful anonymous name
  if (!funcName) {
    funcName = '<anonymous@' + formatLocation(site) + '>'
  }

  var context = callSite.getThis()
  var typeName = context && callSite.getTypeName()

  // ignore useless type name
  if (typeName === 'Object') {
    typeName = undefined
  }

  // make useful type name
  if (typeName === 'Function') {
    typeName = context.name || typeName
  }

  return typeName && callSite.getMethodName()
    ? typeName + '.' + funcName
    : funcName
}

/**
 * Format deprecation message without color.
 */

function formatPlain (msg, caller, stack) {
  var timestamp = new Date().toUTCString()

  var formatted = timestamp +
    ' ' + this._namespace +
    ' deprecated ' + msg

  // add stack trace
  if (this._traced) {
    for (var i = 0; i < stack.length; i++) {
      formatted += '\n    at ' + stack[i].toString()
    }

    return formatted
  }

  if (caller) {
    formatted += ' at ' + formatLocation(caller)
  }

  return formatted
}

/**
 * Format deprecation message with color.
 */

function formatColor (msg, caller, stack) {
  var formatted = '\x1b[36;1m' + this._namespace + '\x1b[22;39m' + // bold cyan
    ' \x1b[33;1mdeprecated\x1b[22;39m' + // bold yellow
    ' \x1b[0m' + msg + '\x1b[39m' // reset

  // add stack trace
  if (this._traced) {
    for (var i = 0; i < stack.length; i++) {
      formatted += '\n    \x1b[36mat ' + stack[i].toString() + '\x1b[39m' // cyan
    }

    return formatted
  }

  if (caller) {
    formatted += ' \x1b[36m' + formatLocation(caller) + '\x1b[39m' // cyan
  }

  return formatted
}

/**
 * Format call site location.
 */

function formatLocation (callSite) {
  return relative(basePath, callSite[0]) +
    ':' + callSite[1] +
    ':' + callSite[2]
}

/**
 * Get the stack as array of call sites.
 */

function getStack () {
  var limit = Error.stackTraceLimit
  var obj = {}
  var prep = Error.prepareStackTrace

  Error.prepareStackTrace = prepareObjectStackTrace
  Error.stackTraceLimit = Math.max(10, limit)

  // capture the stack
  Error.captureStackTrace(obj)

  // slice this function off the top
  var stack = obj.stack.slice(1)

  Error.prepareStackTrace = prep
  Error.stackTraceLimit = limit

  return stack
}

/**
 * Capture call site stack from v8.
 */

function prepareObjectStackTrace (obj, stack) {
  return stack
}

/**
 * Return a wrapped function in a deprecation message.
 */

function wrapfunction (fn, message) {
  if (typeof fn !== 'function') {
    throw new TypeError('argument fn must be a function')
  }

  var args = createArgumentsString(fn.length)
  var stack = getStack()
  var site = callSiteLocation(stack[1])

  site.name = fn.name

  // eslint-disable-next-line no-new-func
  var deprecatedfn = new Function('fn', 'log', 'deprecate', 'message', 'site',
    '"use strict"\n' +
    'return function (' + args + ') {' +
    'log.call(deprecate, message, site)\n' +
    'return fn.apply(this, arguments)\n' +
    '}')(fn, log, this, message, site)

  return deprecatedfn
}

/**
 * Wrap property in a deprecation message.
 */

function wrapproperty (obj, prop, message) {
  if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) {
    throw new TypeError('argument obj must be object')
  }

  var descriptor = Object.getOwnPropertyDescriptor(obj, prop)

  if (!descriptor) {
    throw new TypeError('must call property on owner object')
  }

  if (!descriptor.configurable) {
    throw new TypeError('property must be configurable')
  }

  var deprecate = this
  var stack = getStack()
  var site = callSiteLocation(stack[1])

  // set site name
  site.name = prop

  // convert data descriptor
  if ('value' in descriptor) {
    descriptor = convertDataDescriptorToAccessor(obj, prop, message)
  }

  var get = descriptor.get
  var set = descriptor.set

  // wrap getter
  if (typeof get === 'function') {
    descriptor.get = function getter () {
      log.call(deprecate, message, site)
      return get.apply(this, arguments)
    }
  }

  // wrap setter
  if (typeof set === 'function') {
    descriptor.set = function setter () {
      log.call(deprecate, message, site)
      return set.apply(this, arguments)
    }
  }

  Object.defineProperty(obj, prop, descriptor)
}

/**
 * Create DeprecationError for deprecation
 */

function DeprecationError (namespace, message, stack) {
  var error = new Error()
  var stackString

  Object.defineProperty(error, 'constructor', {
    value: DeprecationError
  })

  Object.defineProperty(error, 'message', {
    configurable: true,
    enumerable: false,
    value: message,
    writable: true
  })

  Object.defineProperty(error, 'name', {
    enumerable: false,
    configurable: true,
    value: 'DeprecationError',
    writable: true
  })

  Object.defineProperty(error, 'namespace', {
    configurable: true,
    enumerable: false,
    value: namespace,
    writable: true
  })

  Object.defineProperty(error, 'stack', {
    configurable: true,
    enumerable: false,
    get: function () {
      if (stackString !== undefined) {
        return stackString
      }

      // prepare stack trace
      return (stackString = createStackString.call(this, stack))
    },
    set: function setter (val) {
      stackString = val
    }
  })

  return error
}
{
  "name": "depd",
  "description": "Deprecate all the things",
  "version": "2.0.0",
  "author": "Douglas Christopher Wilson <doug@somethingdoug.com>",
  "license": "MIT",
  "repository": "dougwilson/nodejs-depd",
  "browser": "lib/browser/index.js",
  "devDependencies": {
    "benchmark": "2.1.4",
    "beautify-benchmark": "0.2.4",
    "eslint": "5.7.0",
    "eslint-config-standard": "12.0.0",
    "eslint-plugin-import": "2.14.0",
    "eslint-plugin-markdown": "1.0.0-beta.7",
    "eslint-plugin-node": "7.0.1",
    "eslint-plugin-promise": "4.0.1",
    "eslint-plugin-standard": "4.0.0",
    "istanbul": "0.4.5",
    "mocha": "5.2.0",
    "safe-buffer": "5.1.2",
    "uid-safe": "2.1.5"
  },
  "files": [
    "lib/",
    "History.md",
    "LICENSE",
    "index.js",
    "Readme.md"
  ],
  "engines": {
    "node": ">= 0.8"
  }
}/*!
 * depd
 * Copyright(c) 2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module exports.
 * @public
 */

module.exports = depd

/**
 * Create deprecate for namespace in caller.
 */

function depd (namespace) {
  if (!namespace) {
    throw new TypeError('argument namespace is required')
  }

  function deprecate (message) {
    // no-op in browser
  }

  deprecate._file = undefined
  deprecate._ignored = true
  deprecate._namespace = namespace
  deprecate._traced = false
  deprecate._warned = Object.create(null)

  deprecate.function = wrapfunction
  deprecate.property = wrapproperty

  return deprecate
}

/**
 * Return a wrapped function in a deprecation message.
 *
 * This is a no-op version of the wrapper, which does nothing but call
 * validation.
 */

function wrapfunction (fn, message) {
  if (typeof fn !== 'function') {
    throw new TypeError('argument fn must be a function')
  }

  return fn
}

/**
 * Wrap property in a deprecation message.
 *
 * This is a no-op version of the wrapper, which does nothing but call
 * validation.
 */

function wrapproperty (obj, prop, message) {
  if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) {
    throw new TypeError('argument obj must be object')
  }

  var descriptor = Object.getOwnPropertyDescriptor(obj, prop)

  if (!descriptor) {
    throw new TypeError('must call property on owner object')
  }

  if (!descriptor.configurable) {
    throw new TypeError('property must be configurable')
  }
}

The MIT License (MIT)

Copyright (c) 2014 Jonathan Ong me@jongleberry.com
Copyright (c) 2015-2022 Douglas Christopher Wilson doug@somethingdoug.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.
/*!
 * destroy
 * Copyright(c) 2014 Jonathan Ong
 * Copyright(c) 2015-2022 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module dependencies.
 * @private
 */

var EventEmitter = require('events').EventEmitter
var ReadStream = require('fs').ReadStream
var Stream = require('stream')
var Zlib = require('zlib')

/**
 * Module exports.
 * @public
 */

module.exports = destroy

/**
 * Destroy the given stream, and optionally suppress any future `error` events.
 *
 * @param {object} stream
 * @param {boolean} suppress
 * @public
 */

function destroy (stream, suppress) {
  if (isFsReadStream(stream)) {
    destroyReadStream(stream)
  } else if (isZlibStream(stream)) {
    destroyZlibStream(stream)
  } else if (hasDestroy(stream)) {
    stream.destroy()
  }

  if (isEventEmitter(stream) && suppress) {
    stream.removeAllListeners('error')
    stream.addListener('error', noop)
  }

  return stream
}

/**
 * Destroy a ReadStream.
 *
 * @param {object} stream
 * @private
 */

function destroyReadStream (stream) {
  stream.destroy()

  if (typeof stream.close === 'function') {
    // node.js core bug work-around
    stream.on('open', onOpenClose)
  }
}

/**
 * Close a Zlib stream.
 *
 * Zlib streams below Node.js 4.5.5 have a buggy implementation
 * of .close() when zlib encountered an error.
 *
 * @param {object} stream
 * @private
 */

function closeZlibStream (stream) {
  if (stream._hadError === true) {
    var prop = stream._binding === null
      ? '_binding'
      : '_handle'

    stream[prop] = {
      close: function () { this[prop] = null }
    }
  }

  stream.close()
}

/**
 * Destroy a Zlib stream.
 *
 * Zlib streams don't have a destroy function in Node.js 6. On top of that
 * simply calling destroy on a zlib stream in Node.js 8+ will result in a
 * memory leak. So until that is fixed, we need to call both close AND destroy.
 *
 * PR to fix memory leak: https://github.com/nodejs/node/pull/23734
 *
 * In Node.js 6+8, it's important that destroy is called before close as the
 * stream would otherwise emit the error 'zlib binding closed'.
 *
 * @param {object} stream
 * @private
 */

function destroyZlibStream (stream) {
  if (typeof stream.destroy === 'function') {
    // node.js core bug work-around
    // istanbul ignore if: node.js 0.8
    if (stream._binding) {
      // node.js < 0.10.0
      stream.destroy()
      if (stream._processing) {
        stream._needDrain = true
        stream.once('drain', onDrainClearBinding)
      } else {
        stream._binding.clear()
      }
    } else if (stream._destroy && stream._destroy !== Stream.Transform.prototype._destroy) {
      // node.js >= 12, ^11.1.0, ^10.15.1
      stream.destroy()
    } else if (stream._destroy && typeof stream.close === 'function') {
      // node.js 7, 8
      stream.destroyed = true
      stream.close()
    } else {
      // fallback
      // istanbul ignore next
      stream.destroy()
    }
  } else if (typeof stream.close === 'function') {
    // node.js < 8 fallback
    closeZlibStream(stream)
  }
}

/**
 * Determine if stream has destroy.
 * @private
 */

function hasDestroy (stream) {
  return stream instanceof Stream &&
    typeof stream.destroy === 'function'
}

/**
 * Determine if val is EventEmitter.
 * @private
 */

function isEventEmitter (val) {
  return val instanceof EventEmitter
}

/**
 * Determine if stream is fs.ReadStream stream.
 * @private
 */

function isFsReadStream (stream) {
  return stream instanceof ReadStream
}

/**
 * Determine if stream is Zlib stream.
 * @private
 */

function isZlibStream (stream) {
  return stream instanceof Zlib.Gzip ||
    stream instanceof Zlib.Gunzip ||
    stream instanceof Zlib.Deflate ||
    stream instanceof Zlib.DeflateRaw ||
    stream instanceof Zlib.Inflate ||
    stream instanceof Zlib.InflateRaw ||
    stream instanceof Zlib.Unzip
}

/**
 * No-op function.
 * @private
 */

function noop () {}

/**
 * On drain handler to clear binding.
 * @private
 */

// istanbul ignore next: node.js 0.8
function onDrainClearBinding () {
  this._binding.clear()
}

/**
 * On open handler to close stream.
 * @private
 */

function onOpenClose () {
  if (typeof this.fd === 'number') {
    // actually close down the fd
    this.close()
  }
}
{
  "name": "destroy",
  "description": "destroy a stream if possible",
  "version": "1.2.0",
  "author": {
    "name": "Jonathan Ong",
    "email": "me@jongleberry.com",
    "url": "http://jongleberry.com",
    "twitter": "https://twitter.com/jongleberry"
  },
  "license": "MIT",
  "repository": "stream-utils/destroy",
  "devDependencies": {
    "eslint": "7.32.0",
    "eslint-config-standard": "14.1.1",
    "eslint-plugin-import": "2.25.4",
    "eslint-plugin-node": "11.1.0",
    "eslint-plugin-promise": "5.2.0",
    "eslint-plugin-standard": "4.1.0",
    "mocha": "9.2.2",
    "nyc": "15.1.0"
  },
  "engines": {
    "node": ">= 0.8",
    "npm": "1.2.8000 || >= 1.4.16"
  },
  "files": [
    "index.js",
    "LICENSE"
  ]
}                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "{}"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright {yyyy} {name of copyright owner}

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
{
  "name": "detect-libc",
  "version": "2.0.1",
  "description": "Node.js module to detect the C standard library (libc) implementation family and version",
  "main": "lib/detect-libc.js",
  "files": [
    "lib/",
    "index.d.ts"
  ],
  "repository": {
    "type": "git",
    "url": "git://github.com/lovell/detect-libc"
  },
  "author": "Lovell Fuller <npm@lovell.info>",
  "license": "Apache-2.0",
  "devDependencies": {
    "ava": "^2.4.0",
    "nyc": "^15.1.0",
    "proxyquire": "^2.1.3",
    "semistandard": "^14.2.3"
  },
  "engines": {
    "node": ">=8"
  }
}'use strict';

const childProcess = require('child_process');
const { isLinux, getReport } = require('./process');

const command = 'getconf GNU_LIBC_VERSION 2>&1 || true; ldd --version 2>&1 || true';
let commandOut = '';

const safeCommand = () => {
  if (!commandOut) {
    return new Promise((resolve) => {
      childProcess.exec(command, (err, out) => {
        commandOut = err ? ' ' : out;
        resolve(commandOut);
      });
    });
  }
  return commandOut;
};

const safeCommandSync = () => {
  if (!commandOut) {
    try {
      commandOut = childProcess.execSync(command, { encoding: 'utf8' });
    } catch (_err) {
      commandOut = ' ';
    }
  }
  return commandOut;
};

/**
 * A String constant containing the value `glibc`.
 * @type {string}
 * @public
 */
const GLIBC = 'glibc';

/**
 * A String constant containing the value `musl`.
 * @type {string}
 * @public
 */
const MUSL = 'musl';

const isFileMusl = (f) => f.includes('libc.musl-') || f.includes('ld-musl-');

const familyFromReport = () => {
  const report = getReport();
  if (report.header && report.header.glibcVersionRuntime) {
    return GLIBC;
  }
  if (Array.isArray(report.sharedObjects)) {
    if (report.sharedObjects.some(isFileMusl)) {
      return MUSL;
    }
  }
  return null;
};

const familyFromCommand = (out) => {
  const [getconf, ldd1] = out.split(/[\r\n]+/);
  if (getconf && getconf.includes(GLIBC)) {
    return GLIBC;
  }
  if (ldd1 && ldd1.includes(MUSL)) {
    return MUSL;
  }
  return null;
};

/**
 * Resolves with the libc family when it can be determined, `null` otherwise.
 * @returns {Promise<?string>}
 */
const family = async () => {
  let family = null;
  if (isLinux()) {
    family = familyFromReport();
    if (!family) {
      const out = await safeCommand();
      family = familyFromCommand(out);
    }
  }
  return family;
};

/**
 * Returns the libc family when it can be determined, `null` otherwise.
 * @returns {?string}
 */
const familySync = () => {
  let family = null;
  if (isLinux()) {
    family = familyFromReport();
    if (!family) {
      const out = safeCommandSync();
      family = familyFromCommand(out);
    }
  }
  return family;
};

/**
 * Resolves `true` only when the platform is Linux and the libc family is not `glibc`.
 * @returns {Promise<boolean>}
 */
const isNonGlibcLinux = async () => isLinux() && await family() !== GLIBC;

/**
 * Returns `true` only when the platform is Linux and the libc family is not `glibc`.
 * @returns {boolean}
 */
const isNonGlibcLinuxSync = () => isLinux() && familySync() !== GLIBC;

const versionFromReport = () => {
  const report = getReport();
  if (report.header && report.header.glibcVersionRuntime) {
    return report.header.glibcVersionRuntime;
  }
  return null;
};

const versionSuffix = (s) => s.trim().split(/\s+/)[1];

const versionFromCommand = (out) => {
  const [getconf, ldd1, ldd2] = out.split(/[\r\n]+/);
  if (getconf && getconf.includes(GLIBC)) {
    return versionSuffix(getconf);
  }
  if (ldd1 && ldd2 && ldd1.includes(MUSL)) {
    return versionSuffix(ldd2);
  }
  return null;
};

/**
 * Resolves with the libc version when it can be determined, `null` otherwise.
 * @returns {Promise<?string>}
 */
const version = async () => {
  let version = null;
  if (isLinux()) {
    version = versionFromReport();
    if (!version) {
      const out = await safeCommand();
      version = versionFromCommand(out);
    }
  }
  return version;
};

/**
 * Returns the libc version when it can be determined, `null` otherwise.
 * @returns {?string}
 */
const versionSync = () => {
  let version = null;
  if (isLinux()) {
    version = versionFromReport();
    if (!version) {
      const out = safeCommandSync();
      version = versionFromCommand(out);
    }
  }
  return version;
};

module.exports = {
  GLIBC,
  MUSL,
  family,
  familySync,
  isNonGlibcLinux,
  isNonGlibcLinuxSync,
  version,
  versionSync
};
'use strict';

const isLinux = () => process.platform === 'linux';

let report = null;
const getReport = () => {
  if (!report) {
    /* istanbul ignore next */
    report = isLinux() && process.report
      ? process.report.getReport()
      : {};
  }
  return report;
};

module.exports = { isLinux, getReport };
Copyright (c) 2015, Scott Motte
All rights reserved.

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.

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.
(function () {
  require('./lib/main').config(
    Object.assign(
      {},
      require('./lib/env-options'),
      require('./lib/cli-options')(process.argv)
    )
  )
})()
{
  "name": "dotenv",
  "version": "16.0.3",
  "description": "Loads environment variables from .env file",
  "main": "lib/main.js",
  "types": "lib/main.d.ts",
  "exports": {
    ".": {
      "require": "./lib/main.js",
      "types": "./lib/main.d.ts",
      "default": "./lib/main.js"
    },
    "./config": "./config.js",
    "./config.js": "./config.js",
    "./lib/env-options": "./lib/env-options.js",
    "./lib/env-options.js": "./lib/env-options.js",
    "./lib/cli-options": "./lib/cli-options.js",
    "./lib/cli-options.js": "./lib/cli-options.js",
    "./package.json": "./package.json"
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/motdotla/dotenv.git"
  },
  "readmeFilename": "README.md",
  "license": "BSD-2-Clause",
  "devDependencies": {
    "@types/node": "^17.0.9",
    "decache": "^4.6.1",
    "dtslint": "^3.7.0",
    "sinon": "^12.0.1",
    "standard": "^16.0.4",
    "standard-markdown": "^7.1.0",
    "standard-version": "^9.3.2",
    "tap": "^15.1.6",
    "tar": "^6.1.11",
    "typescript": "^4.5.4"
  },
  "engines": {
    "node": ">=12"
  }
}const re = /^dotenv_config_(encoding|path|debug|override)=(.+)$/

module.exports = function optionMatcher (args) {
  return args.reduce(function (acc, cur) {
    const matches = cur.match(re)
    if (matches) {
      acc[matches[1]] = matches[2]
    }
    return acc
  }, {})
}
// ../config.js accepts options via environment variables
const options = {}

if (process.env.DOTENV_CONFIG_ENCODING != null) {
  options.encoding = process.env.DOTENV_CONFIG_ENCODING
}

if (process.env.DOTENV_CONFIG_PATH != null) {
  options.path = process.env.DOTENV_CONFIG_PATH
}

if (process.env.DOTENV_CONFIG_DEBUG != null) {
  options.debug = process.env.DOTENV_CONFIG_DEBUG
}

if (process.env.DOTENV_CONFIG_OVERRIDE != null) {
  options.override = process.env.DOTENV_CONFIG_OVERRIDE
}

module.exports = options
const fs = require('fs')
const path = require('path')
const os = require('os')
const packageJson = require('../package.json')

const version = packageJson.version

const LINE = /(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg

// Parser src into an Object
function parse (src) {
  const obj = {}

  // Convert buffer to string
  let lines = src.toString()

  // Convert line breaks to same format
  lines = lines.replace(/\r\n?/mg, '\n')

  let match
  while ((match = LINE.exec(lines)) != null) {
    const key = match[1]

    // Default undefined or null to empty string
    let value = (match[2] || '')

    // Remove whitespace
    value = value.trim()

    // Check if double quoted
    const maybeQuote = value[0]

    // Remove surrounding quotes
    value = value.replace(/^(['"`])([\s\S]*)\1$/mg, '$2')

    // Expand newlines if double quoted
    if (maybeQuote === '"') {
      value = value.replace(/\\n/g, '\n')
      value = value.replace(/\\r/g, '\r')
    }

    // Add to object
    obj[key] = value
  }

  return obj
}

function _log (message) {
  console.log(`[dotenv@${version}][DEBUG] ${message}`)
}

function _resolveHome (envPath) {
  return envPath[0] === '~' ? path.join(os.homedir(), envPath.slice(1)) : envPath
}

// Populates process.env from .env file
function config (options) {
  let dotenvPath = path.resolve(process.cwd(), '.env')
  let encoding = 'utf8'
  const debug = Boolean(options && options.debug)
  const override = Boolean(options && options.override)

  if (options) {
    if (options.path != null) {
      dotenvPath = _resolveHome(options.path)
    }
    if (options.encoding != null) {
      encoding = options.encoding
    }
  }

  try {
    // Specifying an encoding returns a string instead of a buffer
    const parsed = DotenvModule.parse(fs.readFileSync(dotenvPath, { encoding }))

    Object.keys(parsed).forEach(function (key) {
      if (!Object.prototype.hasOwnProperty.call(process.env, key)) {
        process.env[key] = parsed[key]
      } else {
        if (override === true) {
          process.env[key] = parsed[key]
        }

        if (debug) {
          if (override === true) {
            _log(`"${key}" is already defined in \`process.env\` and WAS overwritten`)
          } else {
            _log(`"${key}" is already defined in \`process.env\` and was NOT overwritten`)
          }
        }
      }
    })

    return { parsed }
  } catch (e) {
    if (debug) {
      _log(`Failed to load ${dotenvPath} ${e.message}`)
    }

    return { error: e }
  }
}

const DotenvModule = {
  config,
  parse
}

module.exports.config = DotenvModule.config
module.exports.parse = DotenvModule.parse
module.exports = DotenvModule
The MIT License

Copyright (c) 2013-2014 Mick Hansen. http://mhansen.io

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.


(function(undefined) {
  var root = this;

  // Weird IE shit, objects do not have hasOwn, but the prototype does...
  var hasOwnProp = Object.prototype.hasOwnProperty;

  var reverseDupArray = function (array) {
    var result = new Array(array.length);
    var index  = array.length;
    var arrayMaxIndex = index - 1;

    while (index--) {
      result[arrayMaxIndex - index] = array[index];
    }

    return result;
  };

  var Dottie = function() {
    var args = Array.prototype.slice.call(arguments);

    if (args.length == 2) {
      return Dottie.find.apply(this, args);
    }
    return Dottie.transform.apply(this, args);
  };

  // Legacy syntax, changed syntax to have get/set be similar in arg order
  Dottie.find = function(path, object) {
    return Dottie.get(object, path);
  };

  // Dottie memoization flag
  Dottie.memoizePath = true;
  var memoized = {};

  // Traverse object according to path, return value if found - Return undefined if destination is unreachable
  Dottie.get = function(object, path, defaultVal) {
    if ((object === undefined) || (object === null) || (path === undefined) || (path === null)) {
        return defaultVal;
    }

    var names;

    if (typeof path === "string") {
      if (Dottie.memoizePath) {
        if (memoized[path]) {
          names = memoized[path].slice(0);
        } else {
          names = path.split('.').reverse();
          memoized[path] = names.slice(0);
        }
      } else {
        names = path.split('.').reverse();
      }
    } else if (Array.isArray(path)) {
      names = reverseDupArray(path);
    }

    while (names.length && (object = object[names.pop()]) !== undefined && object !== null);

    // Handle cases where accessing a childprop of a null value
    if (object === null && names.length) object = undefined;

    return (object === undefined ? defaultVal : object);
  };

  Dottie.exists = function(object, path) {
    return Dottie.get(object, path) !== undefined;
  };

  // Set nested value
  Dottie.set = function(object, path, value, options) {
    var pieces = Array.isArray(path) ? path : path.split('.'), current = object, piece, length = pieces.length;

    if (typeof current !== 'object') {
        throw new Error('Parent is not an object.');
    }

    for (var index = 0; index < length; index++) {
      piece = pieces[index];

      // Create namespace (object) where none exists.
      // If `force === true`, bruteforce the path without throwing errors.
      if (!hasOwnProp.call(current, piece) || current[piece] === undefined || (typeof current[piece] !== 'object' && options && options.force === true)) {
        current[piece] = {};
      }

      if (index == (length - 1)) {
        // Set final value
        current[piece] = value;
      } else {
        // We do not overwrite existing path pieces by default
        if (typeof current[piece] !== 'object') {
          throw new Error('Target key "' + piece + '" is not suitable for a nested value. (It is in use as non-object. Set `force` to `true` to override.)');
        }

        // Traverse next in path
        current = current[piece];
      }
    }

    // Is there any case when this is relevant? It's also the last line in the above for-loop
    current[piece] = value;
  };

  // Set default nested value
  Dottie['default'] = function(object, path, value) {
    if (Dottie.get(object, path) === undefined) {
      Dottie.set(object, path, value);
    }
  };

  // Transform unnested object with .-seperated keys into a nested object.
  Dottie.transform = function Dottie$transformfunction(object, options) {
    if (Array.isArray(object)) {
      return object.map(function(o) {
        return Dottie.transform(o, options);
      });
    }

    options = options || {};
    options.delimiter = options.delimiter || '.';

    var pieces
      , piecesLength
      , piece
      , current
      , transformed = {}
      , key
      , keys = Object.keys(object)
      , length = keys.length
      , i;

    for (i = 0; i < length; i++) {
      key = keys[i];

      if (key.indexOf(options.delimiter) !== -1) {
        pieces = key.split(options.delimiter);
        piecesLength = pieces.length;
        current = transformed;

        for (var index = 0; index < piecesLength; index++) {
          piece = pieces[index];
          if (index != (piecesLength - 1) && !current.hasOwnProperty(piece)) {
            current[piece] = {};
          }

          if (index == (piecesLength - 1)) {
            current[piece] = object[key];
          }

          current = current[piece];
          if (current === null) {
            break;
          }
        }
      } else {
        transformed[key] = object[key];
      }
    }

    return transformed;
  };

  Dottie.flatten = function(object, seperator) {
    if (typeof seperator === "undefined") seperator = '.';
    var flattened = {}
      , current
      , nested;

    for (var key in object) {
      if (hasOwnProp.call(object, key)) {
        current = object[key];
        if (Object.prototype.toString.call(current) === "[object Object]") {
          nested = Dottie.flatten(current, seperator);

          for (var _key in nested) {
            flattened[key+seperator+_key] = nested[_key];
          }
        } else {
          flattened[key] = current;
        }
      }
    }

    return flattened;
  };

  Dottie.paths = function(object, prefixes) {
    var paths = [];
    var value;
    var key;

    prefixes = prefixes || [];

    if (typeof object === 'object') {
      for (key in object) {
        value = object[key];

        if (typeof value === 'object' && value !== null) {
          paths = paths.concat(Dottie.paths(value, prefixes.concat([key])));
        } else {
          paths.push(prefixes.concat(key).join('.'));
        }
      }
    } else {
      throw new Error('Paths was called with non-object argument.');
    }

    return paths;
  };

  if (typeof module !== 'undefined' && module.exports) {
    exports = module.exports = Dottie;
  } else {
    root['Dottie'] = Dottie;
    root['Dot'] = Dottie; //BC

    if (typeof define === "function") {
      define([], function () { return Dottie; });
    }
  }
})();
{
  "name": "dottie",
  "version": "2.0.2",
  "devDependencies": {
    "chai": "^4.2.0",
    "mocha": "^5.2.0"
  },
  "license": "MIT",
  "files": [
    "dottie.js"
  ],
  "description": "Fast and safe nested object access and manipulation in JavaScript",
  "author": "Mick Hansen <maker@mhansen.io>",
  "repository": {
    "type": "git",
    "url": "git://github.com/mickhansen/dottie.js.git"
  },
  "main": "dottie.js"
}* @omsmith
Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "{}"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright 2015 D2L Corporation

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
{
  "name": "ecdsa-sig-formatter",
  "version": "1.0.11",
  "description": "Translate ECDSA signatures between ASN.1/DER and JOSE-style concatenation",
  "main": "src/ecdsa-sig-formatter.js",
  "typings": "./src/ecdsa-sig-formatter.d.ts",
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/Brightspace/node-ecdsa-sig-formatter.git"
  },
  "author": "D2L Corporation",
  "license": "Apache-2.0",
  "homepage": "https://github.com/Brightspace/node-ecdsa-sig-formatter#readme",
  "dependencies": {
    "safe-buffer": "^5.0.1"
  },
  "devDependencies": {
    "bench": "^0.3.6",
    "chai": "^3.5.0",
    "coveralls": "^2.11.9",
    "eslint": "^2.12.0",
    "eslint-config-brightspace": "^0.2.1",
    "istanbul": "^0.4.3",
    "jwk-to-pem": "^1.2.5",
    "mocha": "^2.5.3",
    "native-crypto": "^1.7.0"
  }
}'use strict';

var Buffer = require('safe-buffer').Buffer;

var getParamBytesForAlg = require('./param-bytes-for-alg');

var MAX_OCTET = 0x80,
	CLASS_UNIVERSAL = 0,
	PRIMITIVE_BIT = 0x20,
	TAG_SEQ = 0x10,
	TAG_INT = 0x02,
	ENCODED_TAG_SEQ = (TAG_SEQ | PRIMITIVE_BIT) | (CLASS_UNIVERSAL << 6),
	ENCODED_TAG_INT = TAG_INT | (CLASS_UNIVERSAL << 6);

function base64Url(base64) {
	return base64
		.replace(/=/g, '')
		.replace(/\+/g, '-')
		.replace(/\//g, '_');
}

function signatureAsBuffer(signature) {
	if (Buffer.isBuffer(signature)) {
		return signature;
	} else if ('string' === typeof signature) {
		return Buffer.from(signature, 'base64');
	}

	throw new TypeError('ECDSA signature must be a Base64 string or a Buffer');
}

function derToJose(signature, alg) {
	signature = signatureAsBuffer(signature);
	var paramBytes = getParamBytesForAlg(alg);

	// the DER encoded param should at most be the param size, plus a padding
	// zero, since due to being a signed integer
	var maxEncodedParamLength = paramBytes + 1;

	var inputLength = signature.length;

	var offset = 0;
	if (signature[offset++] !== ENCODED_TAG_SEQ) {
		throw new Error('Could not find expected "seq"');
	}

	var seqLength = signature[offset++];
	if (seqLength === (MAX_OCTET | 1)) {
		seqLength = signature[offset++];
	}

	if (inputLength - offset < seqLength) {
		throw new Error('"seq" specified length of "' + seqLength + '", only "' + (inputLength - offset) + '" remaining');
	}

	if (signature[offset++] !== ENCODED_TAG_INT) {
		throw new Error('Could not find expected "int" for "r"');
	}

	var rLength = signature[offset++];

	if (inputLength - offset - 2 < rLength) {
		throw new Error('"r" specified length of "' + rLength + '", only "' + (inputLength - offset - 2) + '" available');
	}

	if (maxEncodedParamLength < rLength) {
		throw new Error('"r" specified length of "' + rLength + '", max of "' + maxEncodedParamLength + '" is acceptable');
	}

	var rOffset = offset;
	offset += rLength;

	if (signature[offset++] !== ENCODED_TAG_INT) {
		throw new Error('Could not find expected "int" for "s"');
	}

	var sLength = signature[offset++];

	if (inputLength - offset !== sLength) {
		throw new Error('"s" specified length of "' + sLength + '", expected "' + (inputLength - offset) + '"');
	}

	if (maxEncodedParamLength < sLength) {
		throw new Error('"s" specified length of "' + sLength + '", max of "' + maxEncodedParamLength + '" is acceptable');
	}

	var sOffset = offset;
	offset += sLength;

	if (offset !== inputLength) {
		throw new Error('Expected to consume entire buffer, but "' + (inputLength - offset) + '" bytes remain');
	}

	var rPadding = paramBytes - rLength,
		sPadding = paramBytes - sLength;

	var dst = Buffer.allocUnsafe(rPadding + rLength + sPadding + sLength);

	for (offset = 0; offset < rPadding; ++offset) {
		dst[offset] = 0;
	}
	signature.copy(dst, offset, rOffset + Math.max(-rPadding, 0), rOffset + rLength);

	offset = paramBytes;

	for (var o = offset; offset < o + sPadding; ++offset) {
		dst[offset] = 0;
	}
	signature.copy(dst, offset, sOffset + Math.max(-sPadding, 0), sOffset + sLength);

	dst = dst.toString('base64');
	dst = base64Url(dst);

	return dst;
}

function countPadding(buf, start, stop) {
	var padding = 0;
	while (start + padding < stop && buf[start + padding] === 0) {
		++padding;
	}

	var needsSign = buf[start + padding] >= MAX_OCTET;
	if (needsSign) {
		--padding;
	}

	return padding;
}

function joseToDer(signature, alg) {
	signature = signatureAsBuffer(signature);
	var paramBytes = getParamBytesForAlg(alg);

	var signatureBytes = signature.length;
	if (signatureBytes !== paramBytes * 2) {
		throw new TypeError('"' + alg + '" signatures must be "' + paramBytes * 2 + '" bytes, saw "' + signatureBytes + '"');
	}

	var rPadding = countPadding(signature, 0, paramBytes);
	var sPadding = countPadding(signature, paramBytes, signature.length);
	var rLength = paramBytes - rPadding;
	var sLength = paramBytes - sPadding;

	var rsBytes = 1 + 1 + rLength + 1 + 1 + sLength;

	var shortLength = rsBytes < MAX_OCTET;

	var dst = Buffer.allocUnsafe((shortLength ? 2 : 3) + rsBytes);

	var offset = 0;
	dst[offset++] = ENCODED_TAG_SEQ;
	if (shortLength) {
		// Bit 8 has value "0"
		// bits 7-1 give the length.
		dst[offset++] = rsBytes;
	} else {
		// Bit 8 of first octet has value "1"
		// bits 7-1 give the number of additional length octets.
		dst[offset++] = MAX_OCTET	| 1;
		// length, base 256
		dst[offset++] = rsBytes & 0xff;
	}
	dst[offset++] = ENCODED_TAG_INT;
	dst[offset++] = rLength;
	if (rPadding < 0) {
		dst[offset++] = 0;
		offset += signature.copy(dst, offset, 0, paramBytes);
	} else {
		offset += signature.copy(dst, offset, rPadding, paramBytes);
	}
	dst[offset++] = ENCODED_TAG_INT;
	dst[offset++] = sLength;
	if (sPadding < 0) {
		dst[offset++] = 0;
		signature.copy(dst, offset, paramBytes);
	} else {
		signature.copy(dst, offset, paramBytes + sPadding);
	}

	return dst;
}

module.exports = {
	derToJose: derToJose,
	joseToDer: joseToDer
};
'use strict';

function getParamSize(keySize) {
	var result = ((keySize / 8) | 0) + (keySize % 8 === 0 ? 0 : 1);
	return result;
}

var paramBytesForAlg = {
	ES256: getParamSize(256),
	ES384: getParamSize(384),
	ES512: getParamSize(521)
};

function getParamBytesForAlg(alg) {
	var paramBytes = paramBytesForAlg[alg];
	if (paramBytes) {
		return paramBytes;
	}

	throw new Error('Unknown algorithm "' + alg + '"');
}

module.exports = getParamBytesForAlg;

The MIT License (MIT)

Copyright (c) 2014 Jonathan Ong me@jongleberry.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.
/*!
 * ee-first
 * Copyright(c) 2014 Jonathan Ong
 * MIT Licensed
 */

'use strict'

/**
 * Module exports.
 * @public
 */

module.exports = first

/**
 * Get the first event in a set of event emitters and event pairs.
 *
 * @param {array} stuff
 * @param {function} done
 * @public
 */

function first(stuff, done) {
  if (!Array.isArray(stuff))
    throw new TypeError('arg must be an array of [ee, events...] arrays')

  var cleanups = []

  for (var i = 0; i < stuff.length; i++) {
    var arr = stuff[i]

    if (!Array.isArray(arr) || arr.length < 2)
      throw new TypeError('each array member must be [ee, events...]')

    var ee = arr[0]

    for (var j = 1; j < arr.length; j++) {
      var event = arr[j]
      var fn = listener(event, callback)

      // listen to the event
      ee.on(event, fn)
      // push this listener to the list of cleanups
      cleanups.push({
        ee: ee,
        event: event,
        fn: fn,
      })
    }
  }

  function callback() {
    cleanup()
    done.apply(null, arguments)
  }

  function cleanup() {
    var x
    for (var i = 0; i < cleanups.length; i++) {
      x = cleanups[i]
      x.ee.removeListener(x.event, x.fn)
    }
  }

  function thunk(fn) {
    done = fn
  }

  thunk.cancel = cleanup

  return thunk
}

/**
 * Create the event listener.
 * @private
 */

function listener(event, done) {
  return function onevent(arg1) {
    var args = new Array(arguments.length)
    var ee = this
    var err = event === 'error'
      ? arg1
      : null

    // copy args to prevent arguments escaping scope
    for (var i = 0; i < args.length; i++) {
      args[i] = arguments[i]
    }

    done(err, ee, event, args)
  }
}
{
  "name": "ee-first",
  "description": "return the first event in a set of ee/event pairs",
  "version": "1.1.1",
  "author": {
    "name": "Jonathan Ong",
    "email": "me@jongleberry.com",
    "url": "http://jongleberry.com",
    "twitter": "https://twitter.com/jongleberry"
  },
  "license": "MIT",
  "repository": "jonathanong/ee-first",
  "devDependencies": {
    "istanbul": "0.3.9",
    "mocha": "2.2.5"
  },
  "files": [
    "index.js",
    "LICENSE"
  ]
}The MIT License (MIT)

Copyright (c) 2016 Alexey Prokhorov

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-log",
  "version": "4.4.8",
  "description": "Just a very simple logging module for your Electron application",
  "main": "src/index.js",
  "typings": "src/index.d.ts",
  "repository": "megahertz/electron-log",
  "files": [
    "!**/__specs__",
    "src/*"
  ],
  "author": "Alexey Prokhorov",
  "license": "MIT",
  "homepage": "https://github.com/megahertz/electron-log#readme",
  "devDependencies": {
    "@types/node": "^14.14.6",
    "electron": "*",
    "eslint": "^7.12.1",
    "eslint-config-airbnb-base": "^14.2.0",
    "eslint-plugin-import": "^2.22.1",
    "humile": "^0.3.2",
    "nw": "0.42.3",
    "typescript": "^4.0.5",
    "webpack": "^5.3.2",
    "webpack-cli": "^4.1.0"
  }
}'use strict';

/**
 * Some ideas from sindresorhus/electron-unhandled
 */

var electronApi = require('./electronApi');
var queryString = require('querystring');

var isAttached = false;

module.exports = function catchErrors(options) {
  if (isAttached) return { stop: stop };
  isAttached = true;

  if (process.type === 'renderer') {
    window.addEventListener('error', onRendererError);
    window.addEventListener('unhandledrejection', onRendererRejection);
  } else {
    process.on('uncaughtException', onError);
    process.on('unhandledRejection', onRejection);
  }

  return { stop: stop };

  function onError(e) {
    try {
      if (typeof options.onError === 'function') {
        var versions = electronApi.getVersions();
        if (options.onError(e, versions, createIssue) === false) {
          return;
        }
      }

      options.log('Unhandled Exception', e);

      if (options.showDialog && e.name.indexOf('UnhandledRejection') < 0) {
        var type = process.type || 'main';
        electronApi.showErrorBox(
          'A JavaScript error occurred in the ' + type + ' process',
          e.stack
        );
      }
    } catch (logError) {
      // eslint-disable-next-line no-console
      console.error(e);
    }
  }

  function onRejection(reason) {
    if (reason instanceof Error) {
      try {
        Object.defineProperty(reason, 'name', {
          value: 'UnhandledRejection ' + reason.name,
        });
      } catch (e) {
        // Can't redefine error name, but who cares?
      }

      onError(reason);
      return;
    }

    var error = new Error(JSON.stringify(reason));
    error.name = 'UnhandledRejection';
    onError(error);
  }

  function onRendererError(event) {
    event.preventDefault();
    onError(event.error);
  }

  function onRendererRejection(event) {
    event.preventDefault();
    onRejection(event.reason);
  }

  function stop() {
    isAttached = false;

    if (process.type === 'renderer') {
      window.removeEventListener('error', onRendererError);
      window.removeEventListener('unhandledrejection', onRendererRejection);
    } else {
      process.removeListener('uncaughtException', onError);
      process.removeListener('unhandledRejection', onRejection);
    }
  }

  function createIssue(pageUrl, queryParams) {
    var issueUrl = pageUrl + '?' + queryString.stringify(queryParams);
    electronApi.openUrl(issueUrl, options.log);
  }
};
'use strict';

/**
 * Split Electron API from the main code
 */

var path = require('path');
var electron;
try {
  // eslint-disable-next-line global-require
  electron = require('electron');
} catch (e) {
  electron = null;
}

var os = require('os');

module.exports = {
  getName: getName,
  getPath: getPath,
  getVersion: getVersion,
  getVersions: getVersions,
  isDev: isDev,
  isElectron: isElectron,
  isIpcChannelListened: isIpcChannelListened,
  loadRemoteModule: loadRemoteModule,
  onIpc: onIpc,
  openUrl: openUrl,
  sendIpc: sendIpc,
  showErrorBox: showErrorBox,
};

function getApp() {
  return getElectronModule('app');
}

function getName() {
  var app = getApp();
  if (!app) return null;

  return 'name' in app ? app.name : app.getName();
}

function getElectronModule(name) {
  if (!electron) {
    return null;
  }

  if (electron[name]) {
    return electron[name];
  }

  if (electron.remote) {
    return electron.remote[name];
  }

  return null;
}

function getIpc() {
  if (process.type === 'browser' && electron && electron.ipcMain) {
    return electron.ipcMain;
  }

  if (process.type === 'renderer' && electron && electron.ipcRenderer) {
    return electron.ipcRenderer;
  }

  return null;
}

function getPath(name) {
  var app = getApp();
  if (!app) return null;

  try {
    return app.getPath(name);
  } catch (e) {
    return null;
  }
}

function getVersion() {
  var app = getApp();
  if (!app) return null;

  return 'version' in app ? app.version : app.getVersion();
}

function getVersions() {
  return {
    app: getName() + ' ' + getVersion(),
    electron: 'Electron ' + process.versions.electron,
    os: getOsVersion(),
  };
}

function getOsVersion() {
  var osName = os.type().replace('_', ' ');
  var osVersion = os.release();

  if (osName === 'Darwin') {
    osName = 'macOS';
    osVersion = getMacOsVersion();
  }

  return osName + ' ' + osVersion;
}

function getMacOsVersion() {
  var release = Number(os.release().split('.')[0]);
  return '10.' + (release - 4);
}

function isDev() {
  var app = getApp();

  if (app && app.isPackaged !== undefined) {
    return !app.isPackaged;
  }

  if (typeof process.execPath === 'string') {
    var execFileName = path.basename(process.execPath).toLowerCase();
    return execFileName.startsWith('electron');
  }

  return process.env.NODE_ENV === 'development'
    || process.env.ELECTRON_IS_DEV === '1';
}

function isElectron() {
  return process.type === 'browser' || process.type === 'renderer';
}

/**
 * Return true if the process listens for the IPC channel
 * @param {string} channel
 */
function isIpcChannelListened(channel) {
  var ipc = getIpc();
  return ipc ? ipc.listenerCount(channel) > 0 : false;
}

/**
 * Try to load the module in the opposite process
 * @param {string} moduleName
 */
function loadRemoteModule(moduleName) {
  if (process.type === 'browser') {
    getApp().on('web-contents-created', function (e, contents) {
      var promise = contents.executeJavaScript(
        'try {require("' + moduleName + '")} catch(e){}; void 0;'
      );

      // Do nothing on error, just prevent Unhandled rejection
      if (promise && typeof promise.catch === 'function') {
        promise.catch(function () {});
      }
    });
  } else if (process.type === 'renderer') {
    // Previously, it was electron.remote.require(moduleName)
    // but now the remote module is deprecated
  }
}

/**
 * Listen to async messages sent from opposite process
 * @param {string} channel
 * @param {function} listener
 */
function onIpc(channel, listener) {
  var ipc = getIpc();
  if (ipc) {
    ipc.on(channel, listener);
  }
}

/**
 * Sent a message to opposite process
 * @param {string} channel
 * @param {any} message
 */
function sendIpc(channel, message) {
  if (process.type === 'browser') {
    sendIpcToRenderer(channel, message);
  } else if (process.type === 'renderer') {
    sendIpcToMain(channel, message);
  }
}

function sendIpcToMain(channel, message) {
  var ipc = getIpc();
  if (ipc) {
    ipc.send(channel, message);
  }
}

function sendIpcToRenderer(channel, message) {
  if (!electron || !electron.BrowserWindow) {
    return;
  }

  electron.BrowserWindow.getAllWindows().forEach(function (wnd) {
    if (wnd.webContents && !wnd.webContents.isDestroyed()) {
      wnd.webContents.send(channel, message);
    }
  });
}

function showErrorBox(title, message) {
  var dialog = getElectronModule('dialog');
  if (!dialog) return;

  dialog.showErrorBox(title, message);
}

/**
 * @param {string} url
 * @param {Function} [logFunction]
 */
function openUrl(url, logFunction) {
  // eslint-disable-next-line no-console
  logFunction = logFunction || console.error;

  var shell = getElectronModule('shell');
  if (!shell) return;

  shell.openExternal(url).catch(logFunction);
}
'use strict';

var catchErrors = require('./catchErrors');
var electronApi = require('./electronApi');
var log = require('./log');
var scopeFactory = require('./scope');
var transportConsole = require('./transports/console');
var transportFile = require('./transports/file');
var transportIpc = require('./transports/ipc');
var transportRemote = require('./transports/remote');

module.exports = create('default');
module.exports.default = module.exports;

/**
 * @param {string} logId
 * @return {ElectronLog.ElectronLog}
 */
function create(logId) {
  /**
   * @type {ElectronLog.ElectronLog}
   */
  var instance = {
    catchErrors: function callCatchErrors(options) {
      var opts = Object.assign({}, {
        log: instance.error,
        showDialog: process.type === 'browser',
      }, options || {});

      catchErrors(opts);
    },
    create: create,
    functions: {},
    hooks: [],
    isDev: electronApi.isDev(),
    levels: [],
    logId: logId,
    variables: {
      processType: process.type,
    },
  };

  instance.scope = scopeFactory(instance);

  instance.transports = {
    console: transportConsole(instance),
    file: transportFile(instance),
    remote: transportRemote(instance),
    ipc: transportIpc(instance),
  };

  Object.defineProperty(instance.levels, 'add', {
    enumerable: false,
    value: function add(name, index) {
      index = index === undefined ? instance.levels.length : index;
      instance.levels.splice(index, 0, name);
      instance[name] = log.log.bind(null, instance, { level: name });
      instance.functions[name] = instance[name];
    },
  });

  ['error', 'warn', 'info', 'verbose', 'debug', 'silly'].forEach(
    function (level) { instance.levels.add(level) }
  );

  instance.log = log.log.bind(null, instance, { level: 'info' });
  instance.functions.log = instance.log;

  instance.logMessageWithTransports = function logMessageWithTransports(
    message,
    transports
  ) {
    if (message.date === undefined) {
      message.date = new Date();
    }

    if (message.variables === undefined) {
      message.variables = instance.variables;
    }

    return log.runTransports(transports, message, instance);
  };

  return instance;
}
'use strict';

module.exports = {
  compareLevels: compareLevels,
  log: log,
  runTransport: runTransport,
  runTransports: runTransports,
};

function log(electronLog, options) {
  var transports = electronLog.transports;

  var message = {
    data: Array.prototype.slice.call(arguments, 2),
    date: new Date(),
    level: options.level,
    scope: options.scope ? options.scope.toJSON() : null,
    variables: electronLog.variables,
  };

  runTransports(transports, message, electronLog);
}

function runTransports(transports, message, electronLog) {
  for (var i in transports) {
    if (Object.prototype.hasOwnProperty.call(transports, i)) {
      runTransport(transports[i], message, electronLog);
    }
  }
}

function runTransport(transport, message, electronLog) {
  if (typeof transport !== 'function' || transport.level === false) {
    return;
  }

  if (!compareLevels(electronLog.levels, transport.level, message.level)) {
    return;
  }

  message = runHooks(electronLog.hooks, transport, message);

  if (message) {
    transport(message);
  }
}

function compareLevels(levels, passLevel, checkLevel) {
  var pass = levels.indexOf(passLevel);
  var check = levels.indexOf(checkLevel);
  if (check === -1 || pass === -1) {
    return true;
  }

  return check <= pass;
}

function runHooks(hooks, transport, message) {
  if (!hooks || !hooks.length) {
    return message;
  }

  // eslint-disable-next-line no-plusplus
  for (var i = 0; i < hooks.length; i++) {
    message = hooks[i](message, transport);
    if (!message) break;
  }

  return message;
}
'use strict';

var log = require('./log').log;

module.exports = scopeFactory;

/**
 * @param {ElectronLog.ElectronLog} electronLog
 * @return {ElectronLog.Scope}
 */
function scopeFactory(electronLog) {
  scope.labelPadding = true;
  scope.defaultLabel = '';

  /** @private */
  scope.maxLabelLength = 0;

  /**
   * @type {typeof getOptions}
   * @package
   */
  scope.getOptions = getOptions;

  return scope;

  function scope(label) {
    var instance = {
      label: label,
      toJSON: function () {
        return {
          label: this.label,
        };
      },
    };

    electronLog.levels.forEach(function (level) {
      instance[level] = log.bind(null, electronLog, {
        level: level,
        scope: instance,
      });
    });

    instance.log = instance.info;

    scope.maxLabelLength = Math.max(scope.maxLabelLength, label.length);

    return instance;
  }

  function getOptions() {
    return {
      defaultLabel: scope.defaultLabel,
      labelLength: getLabelLength(),
    };
  }

  function getLabelLength() {
    if (scope.labelPadding === true) {
      return scope.maxLabelLength;
    }

    if (scope.labelPadding === false) {
      return 0;
    }

    if (typeof scope.labelPadding === 'number') {
      return scope.labelPadding;
    }

    return 0;
  }
}
'use strict';

/* eslint-disable no-multi-spaces, no-console */

var transform = require('../transform');

var consoleMethods = {
  context: console,
  error:   console.error,
  warn:    console.warn,
  info:    console.info,
  verbose: console.verbose,
  debug:   console.debug,
  silly:   console.silly,
  log:     console.log,
};

module.exports = consoleTransportFactory;
module.exports.transformRenderer = transformRenderer;
module.exports.transformMain = transformMain;

var separator = process.platform === 'win32' ? '>' : '›';
var DEFAULT_FORMAT = {
  browser: '%c{h}:{i}:{s}.{ms}{scope}%c ' + separator + ' {text}',
  renderer: '{h}:{i}:{s}.{ms}{scope} › {text}',
  worker: '{h}:{i}:{s}.{ms}{scope} › {text}',
};

function consoleTransportFactory(electronLog) {
  transport.level  = 'silly';
  transport.useStyles = process.env.FORCE_STYLES;
  transport.format = DEFAULT_FORMAT[process.type] || DEFAULT_FORMAT.browser;

  return transport;

  function transport(message) {
    var scopeOptions = electronLog.scope.getOptions();

    var data;
    if (process.type === 'renderer' || process.type === 'worker') {
      data = transformRenderer(message, transport, scopeOptions);
    } else {
      data = transformMain(message, transport, scopeOptions);
    }

    consoleLog(message.level, data);
  }
}

function transformRenderer(message, transport, scopeOptions) {
  return transform.transform(message, [
    transform.customFormatterFactory(transport.format, true, scopeOptions),
  ]);
}

function transformMain(message, transport, scopeOptions) {
  var useStyles = canUseStyles(transport.useStyles, message.level);

  return transform.transform(message, [
    addTemplateColorFactory(transport.format),
    transform.customFormatterFactory(transport.format, false, scopeOptions),
    useStyles ? transform.applyAnsiStyles : transform.removeStyles,
    transform.concatFirstStringElements,
    transform.maxDepthFactory(4),
    transform.toJSON,
  ]);
}

function addTemplateColorFactory(format) {
  return function addTemplateColors(data, message) {
    if (format !== DEFAULT_FORMAT.browser) {
      return data;
    }

    return ['color:' + levelToStyle(message.level), 'color:unset'].concat(data);
  };
}

function canUseStyles(useStyleValue, level) {
  if (useStyleValue === true || useStyleValue === false) {
    return useStyleValue;
  }

  var useStderr = level === 'error' || level === 'warn';
  var stream = useStderr ? process.stderr : process.stdout;
  return stream && stream.isTTY;
}

function consoleLog(level, args) {
  var consoleMethod = consoleMethods[level] || consoleMethods.info;

  if (process.type === 'renderer') {
    setTimeout(consoleMethod.bind.apply(
      consoleMethod,
      [consoleMethod.context].concat(args)
    ));
    return;
  }

  consoleMethod.apply(consoleMethods.context, args);
}

function levelToStyle(level) {
  switch (level) {
    case 'error': return 'red';
    case 'warn':  return 'yellow';
    case 'info':  return 'cyan';
    default:      return 'unset';
  }
}
'use strict';

var transform = require('../transform');
var electronApi = require('../electronApi');
var log = require('../log.js');

module.exports = ipcTransportFactory;

function ipcTransportFactory(electronLog) {
  transport.eventId = '__ELECTRON_LOG_IPC_' + electronLog.logId + '__';
  transport.level = electronLog.isDev ? 'silly' : false;

  // Prevent problems when there are multiple instances after webpack
  if (electronApi.isIpcChannelListened(transport.eventId)) {
    return function () {};
  }

  electronApi.onIpc(transport.eventId, function (_, message) {
    message.date = new Date(message.date);

    log.runTransport(
      electronLog.transports.console,
      message,
      electronLog
    );
  });

  electronApi.loadRemoteModule('electron-log');

  return electronApi.isElectron() ? transport : null;

  function transport(message) {
    var ipcMessage = Object.assign({}, message, {
      data: transform.transform(message, [
        transform.toJSON,
        transform.maxDepthFactory(3),
      ]),
    });

    electronApi.sendIpc(transport.eventId, ipcMessage);
  }
}
'use strict';

var http = require('http');
var https = require('https');
var url = require('url');
var transform = require('../transform');

module.exports = remoteTransportFactory;

function remoteTransportFactory(electronLog) {
  transport.client = { name: 'electron-application' };
  transport.depth = 6;
  transport.level = false;
  transport.requestOptions = {};
  transport.url = null;
  transport.onError = null;
  transport.transformBody = function (body) { return JSON.stringify(body) };

  return transport;

  function transport(message) {
    if (!transport.url) return;

    var body = transport.transformBody({
      client: transport.client,
      data: transform.transform(message, [
        transform.removeStyles,
        transform.toJSON,
        transform.maxDepthFactory(transport.depth + 1),
      ]),
      date: message.date.getTime(),
      level: message.level,
      variables: message.variables,
    });

    var request = post(
      transport.url,
      transport.requestOptions,
      Buffer.from(body, 'utf8')
    );

    request.on('error', transport.onError || onError);

    function onError(error) {
      electronLog.logMessageWithTransports(
        {
          data: [
            'electron-log.transports.remote:'
            + ' cannot send HTTP request to ' + transport.url,
            error,
          ],
          level: 'warn',
        },
        [
          electronLog.transports.console,
          electronLog.transports.ipc,
          electronLog.transports.file,
        ]
      );
    }
  }
}

function post(serverUrl, requestOptions, body) {
  var urlObject = url.parse(serverUrl);
  var httpTransport = urlObject.protocol === 'https:' ? https : http;

  var options = {
    hostname: urlObject.hostname,
    port:     urlObject.port,
    path:     urlObject.path,
    method:   'POST',
    headers:  {},
  };

  Object.assign(options, requestOptions);

  options.headers['Content-Length'] = body.length;
  if (!options.headers['Content-Type']) {
    options.headers['Content-Type'] = 'application/json';
  }

  var request = httpTransport.request(options);
  request.write(body);
  request.end();

  return request;
}
'use strict';

var EventEmitter = require('events');
var fs = require('fs');
var os = require('os');
var path = require('path');
var url = require('url');
var util = require('util');

module.exports = {
  File: File,
  FileRegistry: FileRegistry,
  NullFile: NullFile,
};

/**
 * File manipulations on filesystem
 * @class
 * @extends EventEmitter
 * @property {number} size
 *
 * @constructor
 * @param {string} filePath
 * @param {WriteOptions} [writeOptions]
 * @param {boolean} [writeAsync]
 */
function File(filePath, writeOptions, writeAsync) {
  EventEmitter.call(this);

  /**
   * @type {string}
   * @readonly
   */
  this.path = filePath;

  /**
   * @type {number}
   * @private
   */
  this.initialSize = undefined;

  /**
   * @type {number}
   * @readonly
   */
  this.bytesWritten = 0;

  /**
   * @type {boolean}
   * @private
   */
  this.writeAsync = Boolean(writeAsync);

  /**
   * @type {string[]}
   * @private
   */
  this.asyncWriteQueue = [];

  /**
   * @type {boolean}
   * @private
   */
  this.hasActiveAsyncWritting = false;

  /**
   * @type {WriteOptions}
   * @private
   */
  this.writeOptions = writeOptions || {
    flag: 'a',
    mode: 438, // 0666
    encoding: 'utf8',
  };

  Object.defineProperty(this, 'size', {
    get: this.getSize.bind(this),
  });
}

util.inherits(File, EventEmitter);

File.prototype.clear = function () {
  try {
    fs.writeFileSync(this.path, '', {
      mode: this.writeOptions.mode,
      flag: 'w',
    });
    this.reset();
    return true;
  } catch (e) {
    if (e.code === 'ENOENT') {
      return true;
    }

    this.emit('error', e, this);
    return false;
  }
};

File.prototype.crop = function (bytesAfter) {
  try {
    var content = readFileSyncFromEnd(this.path, bytesAfter || 4096);
    this.clear();
    this.writeLine('[log cropped]' + os.EOL + content);
  } catch (e) {
    this.emit(
      'error',
      new Error('Couldn\'t crop file ' + this.path + '. ' + e.message),
      this
    );
  }
};

File.prototype.toString = function () {
  return this.path;
};

/**
 * @package
 */
File.prototype.reset = function () {
  this.initialSize = undefined;
  this.bytesWritten = 0;
};

/**
 * @package
 */
File.prototype.writeLine = function (text) {
  text += os.EOL;

  if (this.writeAsync) {
    this.asyncWriteQueue.push(text);
    this.nextAsyncWrite();
    return;
  }

  try {
    fs.writeFileSync(this.path, text, this.writeOptions);
    this.increaseBytesWrittenCounter(text);
  } catch (e) {
    this.emit(
      'error',
      new Error('Couldn\'t write to ' + this.path + '. ' + e.message),
      this
    );
  }
};

/**
 * @return {number}
 * @protected
 */
File.prototype.getSize = function () {
  if (this.initialSize === undefined) {
    try {
      var stats = fs.statSync(this.path);
      this.initialSize = stats.size;
    } catch (e) {
      this.initialSize = 0;
    }
  }

  return this.initialSize + this.bytesWritten;
};

/**
 * @return {boolean}
 * @package
 */
File.prototype.isNull = function () {
  return false;
};

/**
 * @private
 */
File.prototype.increaseBytesWrittenCounter = function (text) {
  this.bytesWritten += Buffer.byteLength(text, this.writeOptions.encoding);
};

/**
 * @private
 */
File.prototype.nextAsyncWrite = function () {
  var file = this;

  if (this.hasActiveAsyncWritting || this.asyncWriteQueue.length < 1) {
    return;
  }

  var text = this.asyncWriteQueue.shift();
  this.hasActiveAsyncWritting = true;

  fs.writeFile(this.path, text, this.writeOptions, function (e) {
    file.hasActiveAsyncWritting = false;

    if (e) {
      file.emit(
        'error',
        new Error('Couldn\'t write to ' + file.path + '. ' + e.message),
        this
      );
    } else {
      file.increaseBytesWrittenCounter(text);
    }

    file.nextAsyncWrite();
  });
};

/**
 * File manipulations on filesystem
 * @class
 * @property {number} size
 *
 * @constructor
 * @param {string} filePath
 */
function NullFile(filePath) {
  File.call(this, filePath);
}

util.inherits(NullFile, File);

NullFile.prototype.clear = function () {};
NullFile.prototype.crop = function () {};
NullFile.prototype.writeLine = function () {};
NullFile.prototype.getSize = function () { return 0 };
NullFile.prototype.isNull = function () { return true };

/**
 * Collection, key is a file path, value is a File instance
 * @class
 *
 * @constructor
 */
function FileRegistry() {
  EventEmitter.call(this);
  this.store = {};

  this.emitError = this.emitError.bind(this);
}

util.inherits(FileRegistry, EventEmitter);

/**
 * Provide a File object corresponding to the filePath
 * @param {string} filePath
 * @param {WriteOptions} [writeOptions]
 * @param {boolean} [async]
 * @return {File}
 */
FileRegistry.prototype.provide = function (filePath, writeOptions, async) {
  var file;
  try {
    filePath = path.resolve(filePath);

    if (this.store[filePath]) {
      return this.store[filePath];
    }

    file = this.createFile(filePath, writeOptions, Boolean(async));
  } catch (e) {
    file = new NullFile(filePath);
    this.emitError(e, file);
  }

  file.on('error', this.emitError);
  this.store[filePath] = file;
  return file;
};

/**
 * @param {string} filePath
 * @param {WriteOptions} writeOptions
 * @param {boolean} async
 * @return {File}
 * @private
 */
FileRegistry.prototype.createFile = function (filePath, writeOptions, async) {
  this.testFileWriting(filePath);
  return new File(filePath, writeOptions, async);
};

/**
 * @param {Error} error
 * @param {File} file
 * @private
 */
FileRegistry.prototype.emitError = function (error, file) {
  this.emit('error', error, file);
};

/**
 * @param {string} filePath
 * @private
 */
FileRegistry.prototype.testFileWriting = function (filePath) {
  mkDir(path.dirname(filePath));
  fs.writeFileSync(filePath, '', { flag: 'a' });
};

function mkDir(dirPath) {
  var isNode1012 = Boolean(url.fileURLToPath);
  if (isNode1012) {
    fs.mkdirSync(dirPath, { recursive: true });
    return true;
  }

  try {
    fs.mkdirSync(dirPath);
    return true;
  } catch (error) {
    if (error.code === 'ENOENT') {
      return mkDir(path.dirname(dirPath)) && mkDir(dirPath);
    }

    // eslint-disable-next-line no-useless-catch
    try {
      if (fs.statSync(dirPath).isDirectory()) {
        return true;
      }

      // noinspection ExceptionCaughtLocallyJS
      throw error;
    } catch (e) {
      throw e;
    }
  }
}

function readFileSyncFromEnd(filePath, bytesCount) {
  var buffer = Buffer.alloc(bytesCount);
  var stats = fs.statSync(filePath);

  var readLength = Math.min(stats.size, bytesCount);
  var offset = Math.max(0, stats.size - bytesCount);

  var fd = fs.openSync(filePath, 'r');
  var totalBytes = fs.readSync(fd, buffer, 0, readLength, offset);
  fs.closeSync(fd);

  return buffer.toString('utf8', 0, totalBytes);
}
'use strict';

var fs = require('fs');
var path = require('path');
var os = require('os');
var util = require('util');
var transform = require('../../transform');
var FileRegistry = require('./file').FileRegistry;
var variables = require('./variables');

module.exports = fileTransportFactory;

// Shared between multiple file transport instances
var globalRegistry = new FileRegistry();

function fileTransportFactory(electronLog, customRegistry) {
  var pathVariables = variables.getPathVariables(process.platform);

  var registry = customRegistry || globalRegistry;
  if (registry.listenerCount('error') < 1) {
    registry.on('error', function (e, file) {
      logConsole('Can\'t write to ' + file, e);
    });
  }

  /* eslint-disable no-multi-spaces */
  transport.archiveLog   = archiveLog;
  transport.depth        = 5;
  transport.fileName     = getDefaultFileName();
  transport
    .format = '[{y}-{m}-{d} {h}:{i}:{s}.{ms}] [{level}]{scope} {text}';
  transport.getFile      = getFile;
  transport.level        = 'silly';
  transport.maxSize      = 1024 * 1024;
  transport.readAllLogs  = readAllLogs;
  transport.resolvePath  = resolvePath;
  transport.sync         = true;
  transport.writeOptions = {
    flag: 'a',
    mode: 438, // 0666
    encoding: 'utf8',
  };
  transport.inspectOptions = {};

  initDeprecated();

  return transport;

  function transport(message) {
    var file = getFile(message);

    var needLogRotation = transport.maxSize > 0
      && file.size > transport.maxSize;

    if (needLogRotation) {
      transport.archiveLog(file);
      file.reset();
    }

    var scopeOptions = electronLog.scope.getOptions();
    var inspectOptions = Object.assign(
      { depth: transport.depth },
      transport.inspectOptions
    );
    var content = transform.transform(message, [
      transform.removeStyles,
      transform.customFormatterFactory(transport.format, false, scopeOptions),
      transform.concatFirstStringElements,
      transform.toStringFactory(inspectOptions),
    ]);

    file.writeLine(content);
  }

  function archiveLog(file) {
    var oldPath = file.toString();
    var inf = path.parse(oldPath);
    try {
      fs.renameSync(oldPath, path.join(inf.dir, inf.name + '.old' + inf.ext));
    } catch (e) {
      logConsole('Could not rotate log', e);
      var quarterOfMaxSize = Math.round(transport.maxSize / 4);
      file.crop(Math.min(quarterOfMaxSize, 256 * 1024));
    }
  }

  function logConsole(message, error) {
    var data = ['electron-log.transports.file: ' + message];

    if (error) {
      data.push(error);
    }

    electronLog.transports.console({
      data: data,
      date: new Date(),
      level: 'warn',
    });
  }

  function getFile(msg) {
    var vars = Object.assign({}, pathVariables, {
      fileName: transport.fileName,
    });

    var filePath = transport.resolvePath(vars, msg);
    return registry.provide(filePath, transport.writeOptions, !transport.sync);
  }

  /**
   * @param {PathVariables} vars
   */
  function resolvePath(vars) {
    return path.join(vars.libraryDefaultDir, vars.fileName);
  }

  function readAllLogs(options) {
    var fileFilter = options && typeof options.fileFilter === 'function'
      ? options.fileFilter
      : function (fileName) { return fileName.endsWith('.log') };

    var vars = Object.assign({}, pathVariables, {
      fileName: transport.fileName,
    });
    var logsPath = path.dirname(transport.resolvePath(vars));

    return fs.readdirSync(logsPath)
      .map(function (fileName) { return path.join(logsPath, fileName) })
      .filter(fileFilter)
      .map(function (logPath) {
        try {
          return {
            path: logPath,
            lines: fs.readFileSync(logPath, 'utf8').split(os.EOL),
          };
        } catch (e) {
          return null;
        }
      })
      .filter(Boolean);
  }

  function initDeprecated() {
    var isDeprecatedText = ' is deprecated and will be removed in v5.';
    var isDeprecatedProp = ' property' + isDeprecatedText;

    Object.defineProperties(transport, {
      bytesWritten: {
        get: util.deprecate(getBytesWritten, 'bytesWritten' + isDeprecatedProp),
      },

      file: {
        get: util.deprecate(getLogFile, 'file' + isDeprecatedProp),
        set: util.deprecate(setLogFile, 'file' + isDeprecatedProp),
      },

      fileSize: {
        get: util.deprecate(getFileSize, 'file' + isDeprecatedProp),
      },
    });

    transport.clear = util.deprecate(clear, 'clear()' + isDeprecatedText);
    transport.findLogPath = util.deprecate(
      getLogFile,
      'findLogPath()' + isDeprecatedText
    );
    transport.init = util.deprecate(init, 'init()' + isDeprecatedText);

    function getBytesWritten() {
      return getFile().bytesWritten;
    }

    function getLogFile() {
      return getFile().path;
    }

    function setLogFile(filePath) {
      transport.resolvePath = function () {
        return filePath;
      };
    }

    function getFileSize() {
      return getFile().size;
    }

    function clear() {
      getFile().clear();
    }

    function init() {}
  }
}

function getDefaultFileName() {
  switch (process.type) {
    case 'renderer': return 'renderer.log';
    case 'worker': return 'worker.log';
    default: return 'main.log';
  }
}
'use strict';

/* eslint-disable consistent-return */

var fs = require('fs');
var path = require('path');

module.exports = {
  readPackageJson: readPackageJson,
  tryReadJsonAt: tryReadJsonAt,
};

/**
 * @return {{ name?: string, version?: string}}
 */
function readPackageJson() {
  return tryReadJsonAt(require.main && require.main.filename)
    || tryReadJsonAt(extractPathFromArgs())
    || tryReadJsonAt(process.resourcesPath, 'app.asar')
    || tryReadJsonAt(process.resourcesPath, 'app')
    || tryReadJsonAt(process.cwd())
    || { name: null, version: null };
}

/**
 * @param {...string} searchPath
 * @return {{ name?: string, version?: string } | null}
 */
function tryReadJsonAt(searchPath) {
  if (!searchPath) {
    return null;
  }

  try {
    searchPath = path.join.apply(path, arguments);
    var fileName = findUp('package.json', searchPath);
    if (!fileName) {
      return null;
    }

    var json = JSON.parse(fs.readFileSync(fileName, 'utf8'));
    var name = json.productName || json.name;
    if (!name || name.toLowerCase() === 'electron') {
      return null;
    }

    if (json.productName || json.name) {
      return {
        name: name,
        version: json.version,
      };
    }
  } catch (e) {
    return null;
  }
}

/**
 * @param {string} fileName
 * @param {string} [cwd]
 * @return {string | null}
 */
function findUp(fileName, cwd) {
  var currentPath = cwd;
  // eslint-disable-next-line no-constant-condition
  while (true) {
    var parsedPath = path.parse(currentPath);
    var root = parsedPath.root;
    var dir = parsedPath.dir;

    if (fs.existsSync(path.join(currentPath, fileName))) {
      return path.resolve(path.join(currentPath, fileName));
    }

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

    currentPath = dir;
  }
}

/**
 * Get app path from --user-data-dir cmd arg, passed to a renderer process
 * @return {string|null}
 */
function extractPathFromArgs() {
  var matchedArgs = process.argv.filter(function (arg) {
    return arg.indexOf('--user-data-dir=') === 0;
  });

  if (matchedArgs.length === 0 || typeof matchedArgs[0] !== 'string') {
    return null;
  }

  var userDataDir = matchedArgs[0];
  return userDataDir.replace('--user-data-dir=', '');
}
'use strict';

var os = require('os');
var path = require('path');
var electronApi = require('../../electronApi');
var packageJson = require('./packageJson');

module.exports = {
  getAppData: getAppData,
  getLibraryDefaultDir: getLibraryDefaultDir,
  getLibraryTemplate: getLibraryTemplate,
  getNameAndVersion: getNameAndVersion,
  getPathVariables: getPathVariables,
  getUserData: getUserData,
};

function getAppData(platform) {
  var appData = electronApi.getPath('appData');
  if (appData) {
    return appData;
  }

  var home = getHome();

  switch (platform) {
    case 'darwin': {
      return path.join(home, 'Library/Application Support');
    }

    case 'win32': {
      return process.env.APPDATA || path.join(home, 'AppData/Roaming');
    }

    default: {
      return process.env.XDG_CONFIG_HOME || path.join(home, '.config');
    }
  }
}

function getHome() {
  return os.homedir ? os.homedir() : process.env.HOME;
}

function getLibraryDefaultDir(platform, appName) {
  if (platform === 'darwin') {
    return path.join(getHome(), 'Library/Logs', appName);
  }

  return path.join(getUserData(platform, appName), 'logs');
}

function getLibraryTemplate(platform) {
  if (platform === 'darwin') {
    return path.join(getHome(), 'Library/Logs', '{appName}');
  }

  return path.join(getAppData(platform), '{appName}', 'logs');
}

function getNameAndVersion() {
  var name = electronApi.getName() || '';
  var version = electronApi.getVersion();

  if (name.toLowerCase() === 'electron') {
    name = '';
    version = '';
  }

  if (name && version) {
    return { name: name, version: version };
  }

  var packageValues = packageJson.readPackageJson();
  if (!name) {
    name = packageValues.name;
  }

  if (!version) {
    version = packageValues.version;
  }

  if (!name) {
    // Fallback, otherwise file transport can't be initialized
    name = 'Electron';
  }

  return { name: name, version: version };
}

/**
 * @param {string} platform
 * @return {PathVariables}
 */
function getPathVariables(platform) {
  var nameAndVersion = getNameAndVersion();
  var appName = nameAndVersion.name;
  var appVersion = nameAndVersion.version;

  return {
    appData: getAppData(platform),
    appName: appName,
    appVersion: appVersion,
    electronDefaultDir: electronApi.getPath('logs'),
    home: getHome(),
    libraryDefaultDir: getLibraryDefaultDir(platform, appName),
    libraryTemplate: getLibraryTemplate(platform),
    temp: electronApi.getPath('temp') || os.tmpdir(),
    userData: getUserData(platform, appName),
  };
}

function getUserData(platform, appName) {
  if (electronApi.getName() !== appName) {
    return path.join(getAppData(platform), appName);
  }

  return electronApi.getPath('userData')
    || path.join(getAppData(platform), appName);
}
'use strict';

var fs = require('fs');
var os = require('os');
var path = require('path');
var file = require('../file');
var makeTmpDir = require('./makeTmpDir');

describe('transports/file/file', function () {
  describe('File', function () {
    var LICENSE_PATH = path.join(__dirname, '../../../../LICENSE');
    var LICENSE_FILE_SIZE = 1082;

    afterEach(function () {
      makeTmpDir(false).remove();
    });

    describe('getSize', function () {
      it('should return size of an existed file', function () {
        var testFile = new file.File(LICENSE_PATH);

        expect(testFile.size).toBe(LICENSE_FILE_SIZE);
      });

      it('should return size of an existed file + written bytes', function () {
        var testFile = new file.File(LICENSE_PATH);
        testFile.bytesWritten = 1;

        expect(testFile.size).toBe(LICENSE_FILE_SIZE + 1);
      });
    });

    it('reset', function () {
      var testFile = new file.File(LICENSE_PATH);

      testFile.initialSize = 0;
      testFile.bytesWritten = 1;
      testFile.reset();

      expect(testFile.size).toBe(LICENSE_FILE_SIZE);
    });

    describe('clear', function () {
      it('should remove file when exists', function () {
        var tmpDir = makeTmpDir();
        var testFile = new file.File(path.join(tmpDir.path, 'test.txt'));

        testFile.writeLine('test');

        expect(testFile.clear()).toBe(true);

        expect(fs.statSync(testFile.path).size).toBe(0);
      });

      it('should create an empty file when no file exists', function () {
        var tmpDir = makeTmpDir();
        var testFile = new file.File(path.join(tmpDir.path, 'test.txt'));

        expect(testFile.clear()).toBe(true);

        expect(fs.statSync(testFile.path).size).toBe(0);
      });
    });

    describe('crop', function () {
      it('should crop when file contains more than bytesAfter', function () {
        var tmpDir = makeTmpDir();
        var testFile = new file.File(path.join(tmpDir.path, 'test.txt'));

        testFile.writeLine('1'.repeat(4096));
        testFile.crop(7 + os.EOL.length);

        expect(fs.readFileSync(testFile.path, 'utf8'))
          .toEqual('[log cropped]' + os.EOL + '1111111' + os.EOL + os.EOL);
      });

      it('should crop when file contains less than bytesAfter', function () {
        var tmpDir = makeTmpDir();
        var testFile = new file.File(path.join(tmpDir.path, 'test.txt'));

        testFile.writeLine('1'.repeat(4));
        testFile.crop(8);

        expect(fs.readFileSync(testFile.path, 'utf8'))
          .toEqual('[log cropped]' + os.EOL + '1111' + os.EOL + os.EOL);
      });
    });

    describe('writeLine', function () {
      it('should write text to the file', function () {
        var tmpDir = makeTmpDir();
        var testFile = new file.File(path.join(tmpDir.path, 'test.txt'));

        testFile.writeLine('test');

        expect(fs.readFileSync(testFile.path, 'utf8')).toBe('test' + os.EOL);
      });

      it('should increase bytesWritten', function () {
        var tmpDir = makeTmpDir();
        var testFile = new file.File(path.join(tmpDir.path, 'test.txt'));

        testFile.writeLine('test');

        expect(testFile.bytesWritten).toBe(4 + os.EOL.length);
      });

      it('should emit error if dir not exists', function (done) {
        var tmpDir = makeTmpDir(false);
        var testFile = new file.File(path.join(tmpDir.path, 'test.txt'));

        testFile.on('error', function (error) {
          expect(error.message).toMatch('Couldn\'t write to ');
          done();
        });

        testFile.writeLine('test');
      });
    });
  });

  describe('NullFile', function () {
    it('should not perform file operations', function () {
      var nullFile = new file.NullFile('/not-exists/1.txt');

      nullFile.writeLine('test');
      expect(nullFile.size).toBe(0);
    });
  });

  describe('FileRegistry', function () {
    afterEach(function () {
      makeTmpDir(false).remove();
    });

    describe('provide', function () {
      it('should create a new file if the path is correct', function () {
        var tmpDir = makeTmpDir();
        var registry = new file.FileRegistry();
        var testFile = registry.provide(path.join(tmpDir.path, 'log.txt'));

        expect(testFile.isNull()).toBe(false);
        expect(fs.existsSync(testFile.path)).toBe(true);
      });

      it('should return the same instance on second call', function () {
        var tmpDir = makeTmpDir();
        var registry = new file.FileRegistry();
        var filePath = path.join(tmpDir.path, 'log.txt');
        var testFile = registry.provide(filePath);

        expect(testFile.isNull()).toBe(false);
        expect(testFile).toBe(registry.provide(filePath));
      });

      it('should return null file when cannot resolve path', function (done) {
        var registry = new file.FileRegistry();

        registry.on('error', function (e) {
          expect(e.message).toMatch('string');
          done();
        });

        var testFile = registry.provide(null);

        expect(testFile.isNull()).toBe(true);
      });
    });
  });
});
'use strict';

var os = require('os');
var path = require('path');
var TestLogReader = require('../../../__specs__/utils/TestLogReader');
var FileRegistry = require('../file').FileRegistry;
var fileTransportFactory = require('../index');
var makeTmpDir = require('./makeTmpDir');

describe('File transport', function () {
  var TEST_MESSAGE = createMessage('test');
  var TEST_MESSAGE_SIZE = 38 + os.EOL.length;

  afterEach(function () {
    TestLogReader.removeDefaultLogDir('humile');
  });

  it('should create a file on first write', function () {
    var transport = createTransport();

    transport(TEST_MESSAGE);

    expect(TestLogReader.fromApp('humile').format()).toEqual([
      'main.log: test',
    ]);
  });

  it('should archive an old log', function () {
    var transport = createTransport();
    transport.maxSize = 20;

    transport(TEST_MESSAGE);
    expect(TestLogReader.fromApp('humile').format()).toEqual([
      'main.log: test',
    ]);

    transport(createMessage('test2'));
    expect(TestLogReader.fromApp('humile').format().sort()).toEqual([
      'main.log: test2',
      'main.old.log: test',
    ]);
  });

  it('should allow to change file location', function () {
    var tmpDir = makeTmpDir(false);

    try {
      var logFilePath = path.join(tmpDir.path, 'mylog.txt');
      var transport = createTransport({
        resolvePath: function () { return logFilePath },
      });

      transport(TEST_MESSAGE);

      expect(TestLogReader.fromFile(logFilePath).format()).toEqual([
        'mylog.txt: test',
      ]);
    } finally {
      tmpDir.remove();
    }
  });

  it('should provide access to the current file', function () {
    var transport = createTransport();

    transport(TEST_MESSAGE);
    var file = transport.getFile();

    expect(file.bytesWritten).toEqual(TEST_MESSAGE_SIZE);
    expect(file.size).toEqual(TEST_MESSAGE_SIZE);
    expect(file.path).toMatch('main.log');
  });

  it('should create a file if the path is UNC', function () {
    if (process.platform !== 'win32') {
      return;
    }

    var transport = createTransport({
      resolvePath: function (vars) {
        return '\\\\?\\' + path.join(vars.libraryDefaultDir, vars.fileName);
      },
    });

    transport(TEST_MESSAGE);

    expect(TestLogReader.fromApp('humile').format()).toEqual([
      'main.log: test',
    ]);
  });

  describe('should provide deprecated members until v5: ', function () {
    beforeAll(function () {
      this.noDeprecationBackup = process.noDeprecation;
      process.noDeprecation = true;
    });

    afterAll(function () {
      process.noDeprecation = this.noDeprecationBackup;
    });

    it('file', function () {
      var transport = createTransport();
      var defaultPath = TestLogReader.getDefaultLogDir('humile');

      expect(transport.file).toEqual(
        path.join(defaultPath, 'main.log')
      );

      transport.file = path.join(defaultPath, 'changed.log');

      transport(TEST_MESSAGE);

      expect(TestLogReader.fromApp('humile').format()).toEqual([
        'changed.log: test',
      ]);
    });

    it('fileSize', function () {
      var transport = createTransport();

      transport(TEST_MESSAGE);

      expect(transport.fileSize).toBe(TEST_MESSAGE_SIZE);
    });

    it('bytesWritten', function () {
      var transport = createTransport();

      transport(TEST_MESSAGE);

      expect(transport.bytesWritten).toBe(TEST_MESSAGE_SIZE);
    });

    it('clear()', function () {
      var transport = createTransport();

      transport(TEST_MESSAGE);

      transport.clear();

      expect(transport.bytesWritten).toBe(0);
      expect(TestLogReader.fromApp('humile').format()).toEqual([]);
    });

    it('findLogPath()', function () {
      var transport = createTransport();
      var defaultPath = TestLogReader.getDefaultLogDir('humile');

      expect(transport.findLogPath()).toEqual(
        path.join(defaultPath, 'main.log')
      );
    });

    it('init()', function () {
      var transport = createTransport();

      // just do nothing
      expect(transport.init()).toBe(undefined);
    });
  });
});

function createTransport(options) {
  var electronLog = {
    scope: {
      getOptions: function () { return {} },
    },
    transports: {
      // eslint-disable-next-line no-console
      console: console.log,
    },
  };
  var transport = fileTransportFactory(electronLog, new FileRegistry());

  Object.assign(transport, options || {});

  return transport;
}

function createMessage(data, level) {
  return {
    data: Array.isArray(data) ? data : [data],
    date: new Date(),
    level: level || 'info',
    variables: {},
  };
}
'use strict';

var fs = require('fs');
var os = require('os');
var path = require('path');
var rmDir = require('../../../__specs__/utils/fsHelpers').rmDir;

module.exports = makeTmpDir;

function makeTmpDir(createFolderOnInit) {
  createFolderOnInit = createFolderOnInit === undefined || createFolderOnInit;
  var dirPath = path.join(os.tmpdir(), 'electron-log-tests');

  if (createFolderOnInit) {
    fs.mkdirSync(dirPath, { recursive: true });
  }

  return {
    path: dirPath,
    remove: function () {
      rmDir(this.path);
    },
  };
}
'use strict';

var path = require('path');
var packageJsonSpec = require('../packageJson');

describe('transports/file/packageJson', function () {
  describe('tryReadJsonAt', function () {
    it('should resolve data when child path specified', function () {
      var json = packageJsonSpec.tryReadJsonAt(__filename);

      expect(json.name).toBe('electron-log');
      expect(json.version).toMatch(/\d+\.\d+\.\d+/);
    });

    it('should resolve data when root specified', function () {
      var rootPath = path.join(__dirname, '../../../..');
      var json = packageJsonSpec.tryReadJsonAt(rootPath);

      expect(json.name).toBe('electron-log');
      expect(json.version).toMatch(/\d+\.\d+\.\d+/);
    });

    it('should return null on fail', function () {
      var json = packageJsonSpec.tryReadJsonAt('/');

      expect(json).toBe(null);
    });
  });
});
'use strict';

var humilePkg = require('humile/package.json');
var os = require('os');
var path = require('path');
var variables = require('../variables');

describe('transports/file/variables', function () {
  describe('getAppData', function () {
    it('on Linux', function () {
      expect(variables.getAppData('linux')).toBe(
        path.join(os.homedir(), '.config')
      );
    });

    it('on macOS', function () {
      expect(variables.getAppData('darwin')).toBe(
        path.join(os.homedir(), 'Library/Application Support')
      );
    });

    it('on Windows', function () {
      expect(variables.getAppData('win32')).toBe(
        path.join(os.homedir(), 'AppData', 'Roaming')
      );
    });
  });

  describe('getLibraryDefaultDir', function () {
    it('on Linux', function () {
      expect(variables.getLibraryDefaultDir('linux', 'electron-log')).toBe(
        path.join(os.homedir(), '.config/electron-log/logs')
      );
    });

    it('on macOS', function () {
      expect(variables.getLibraryDefaultDir('darwin', 'electron-log')).toBe(
        path.join(os.homedir(), 'Library/Logs/electron-log')
      );
    });

    it('on Windows', function () {
      expect(variables.getLibraryDefaultDir('win32', 'electron-log')).toBe(
        path.join(os.homedir(), 'AppData', 'Roaming', 'electron-log', 'logs')
      );
    });
  });

  describe('getLibraryTemplate', function () {
    it('on Linux', function () {
      expect(variables.getLibraryTemplate('linux')).toBe(
        path.join(os.homedir(), '.config/{appName}/logs')
      );
    });

    it('on macOS', function () {
      expect(variables.getLibraryTemplate('darwin')).toBe(
        path.join(os.homedir(), 'Library/Logs/{appName}')
      );
    });

    it('on Windows', function () {
      expect(variables.getLibraryTemplate('win32')).toBe(
        path.join(os.homedir(), 'AppData', 'Roaming', '{appName}', 'logs')
      );
    });
  });

  it('getNameAndVersion', function () {
    var nameAndVersion = variables.getNameAndVersion();

    expect(nameAndVersion.name).toBe('humile');
    expect(nameAndVersion.version).toMatch(/\d+\.\d+\.\d+/);
  });

  describe('getPathVariables', function () {
    it('on Linux', function () {
      var appData = path.join(os.homedir(), '.config');

      expect(variables.getPathVariables('linux')).toEqual({
        appData: appData,
        appName: 'humile',
        appVersion: humilePkg.version,
        electronDefaultDir: null, // test runned not in electron
        home: os.homedir(),
        libraryDefaultDir: path.join(appData, 'humile/logs'),
        libraryTemplate: path.join(appData, '{appName}/logs'),
        temp: os.tmpdir(),
        userData: path.join(appData, 'humile'),
      });
    });

    it('on macOS', function () {
      var appData = path.join(os.homedir(), 'Library/Application Support');

      expect(variables.getPathVariables('darwin')).toEqual({
        appData: appData,
        appName: 'humile',
        appVersion: humilePkg.version,
        electronDefaultDir: null, // test runned not in electron
        home: os.homedir(),
        libraryDefaultDir: path.join(os.homedir(), 'Library/Logs/humile'),
        libraryTemplate: path.join(os.homedir(), 'Library/Logs/{appName}'),
        temp: os.tmpdir(),
        userData: path.join(appData, 'humile'),
      });
    });

    it('on Windows', function () {
      var appData = path.join(os.homedir(), 'AppData', 'Roaming');

      expect(variables.getPathVariables('win32')).toEqual({
        appData: appData,
        appName: 'humile',
        appVersion: humilePkg.version,
        electronDefaultDir: null, // test runned not in electron
        home: os.homedir(),
        libraryDefaultDir: path.join(appData, 'humile', 'logs'),
        libraryTemplate: path.join(appData, '{appName}/logs'),
        temp: os.tmpdir(),
        userData: path.join(appData, 'humile'),
      });
    });
  });

  describe('getUserData', function () {
    it('on Linux', function () {
      expect(variables.getUserData('linux', 'electron-log')).toBe(
        path.join(os.homedir(), '.config/electron-log')
      );
    });

    it('on macOS', function () {
      expect(variables.getUserData('darwin', 'electron-log')).toBe(
        path.join(os.homedir(), 'Library/Application Support/electron-log')
      );
    });

    it('on Windows', function () {
      expect(variables.getUserData('win32', 'electron-log')).toBe(
        path.join(os.homedir(), 'AppData', 'Roaming', 'electron-log')
      );
    });
  });
});
'use strict';

var transport = require('../console');

describe('Console transport', function () {
  describe('transformRenderer', function () {
    describe('when text in the end of format', function () {
      var transportCfg = {
        format: '{text}',
      };

      it('should transform string with color', function () {
        var msg = createMessage(['%c red text', 'color: red']);

        var transformed = transport.transformRenderer(msg, transportCfg);

        expect(transformed).toEqual(['%c red text', 'color: red']);
      });

      it('should transform string with placeholder', function () {
        var msg = createMessage(['a is %d', 1]);

        var transformed = transport.transformRenderer(msg, transportCfg);

        expect(transformed).toEqual(['a is %d', 1]);
      });

      it('should transform string with color and placeholder', function () {
        var msg = createMessage(['a is %d, %c b is red', 1, 'color: red']);

        var transformed = transport.transformRenderer(msg, transportCfg);

        expect(transformed).toEqual(['a is %d, %c b is red', 1, 'color: red']);
      });
    });

    describe('when text in the beginning of format', function () {
      var transportCfg = {
        format: '{text}.',
      };

      it('should transform string with color', function () {
        var msg = createMessage(['%c red text', 'color: red']);

        var transformed = transport.transformRenderer(msg, transportCfg);

        expect(transformed).toEqual(['%c red text', 'color: red', '.']);
      });

      it('should transform string with placeholder', function () {
        var msg = createMessage(['a is %d', 1]);

        var transformed = transport.transformRenderer(msg, transportCfg);

        expect(transformed).toEqual(['a is %d', 1, '.']);
      });

      it('should transform string with color and placeholder', function () {
        var msg = createMessage(['a is %d, %c b is red', 1, 'color: red']);

        var transformed = transport.transformRenderer(msg, transportCfg);

        expect(transformed).toEqual([
          'a is %d, %c b is red',
          1,
          'color: red',
          '.',
        ]);
      });
    });
  });

  describe('transformMain', function () {
    describe('when text in the end of format', function () {
      var transportCfg = {
        format: '{text}',
        useStyles: false,
      };

      it('should transform string with color', function () {
        var msg = createMessage(['%c red text', 'color: red']);

        var transformed = transport.transformMain(msg, transportCfg);

        expect(transformed).toEqual([' red text']);
      });

      it('should transform string with placeholder', function () {
        var msg = createMessage(['a is %d', 1]);

        var transformed = transport.transformMain(msg, transportCfg);

        expect(transformed).toEqual(['a is %d', 1]);
      });

      it('should transform string with color and placeholder', function () {
        var msg = createMessage(['a is %d, %c b is red', 1, 'color: red']);

        var transformed = transport.transformMain(msg, transportCfg);

        expect(transformed).toEqual(['a is %d,  b is red', 1]);
      });
    });

    describe('when text in the end of format, colored', function () {
      var transportCfg = {
        format: '{text}',
        useStyles: true,
      };

      it('should transform string with color', function () {
        var msg = createMessage(['%c red text', 'color: red']);

        var transformed = transport.transformMain(msg, transportCfg);

        expect(transformed).toEqual(['\x1b[31m red text\x1b[0m']);
      });

      it('should transform string with placeholder', function () {
        var msg = createMessage(['a is %d', 1]);

        var transformed = transport.transformMain(msg, transportCfg);

        expect(transformed).toEqual(['a is %d', 1]);
      });

      it('should transform string with color and placeholder', function () {
        var msg = createMessage(['a is %d, %c b is red', 1, 'color: red']);

        var transformed = transport.transformMain(msg, transportCfg);

        expect(transformed).toEqual(['a is %d, \x1b[31m b is red\x1b[0m', 1]);
      });
    });

    describe('when text in the beginning of format', function () {
      var transportCfg = {
        format: '{text}.',
        useStyles: false,
      };

      it('should transform string with color', function () {
        var msg = createMessage(['%c red text', 'color: red']);

        var transformed = transport.transformMain(msg, transportCfg);

        expect(transformed).toEqual([' red text .']);
      });

      it('should transform string with placeholder', function () {
        var msg = createMessage(['a is %d', 1]);

        var transformed = transport.transformMain(msg, transportCfg);

        expect(transformed).toEqual(['a is %d', 1, '.']);
      });

      it('should transform string with color and placeholder', function () {
        var msg = createMessage(['a is %d, %c b is red', 1, 'color: red']);

        var transformed = transport.transformMain(msg, transportCfg);

        expect(transformed).toEqual([
          'a is %d,  b is red',
          1,
          '.',
        ]);
      });
    });
  });
});

function createMessage(data) {
  return {
    data: data,
    date: new Date(),
  };
}
'use strict';

var object = require('./object');
var style = require('./style');
var template = require('./template');

module.exports = {
  applyAnsiStyles: style.applyAnsiStyles,
  concatFirstStringElements: template.concatFirstStringElements,
  customFormatterFactory: customFormatterFactory,
  maxDepthFactory: object.maxDepthFactory,
  removeStyles: style.removeStyles,
  toJSON: object.toJSON,
  toStringFactory: object.toStringFactory,
  transform: transform,
};

function customFormatterFactory(customFormat, concatFirst, scopeOptions) {
  if (typeof customFormat === 'string') {
    return function customStringFormatter(data, message) {
      return transform(message, [
        template.templateVariables,
        template.templateScopeFactory(scopeOptions),
        template.templateDate,
        template.templateText,
        concatFirst && template.concatFirstStringElements,
      ], [customFormat].concat(data));
    };
  }

  if (typeof customFormat === 'function') {
    return function customFunctionFormatter(data, message) {
      var modifiedMessage = Object.assign({}, message, { data: data });
      var texts = customFormat(modifiedMessage, data);
      return [].concat(texts);
    };
  }

  return function (data) {
    return [].concat(data);
  };
}

function transform(message, transformers, initialData) {
  return transformers.reduce(function (data, transformer) {
    if (typeof transformer === 'function') {
      return transformer(data, message);
    }

    return data;
  }, initialData || message.data);
}
'use strict';

var util = require('util');

module.exports = {
  maxDepthFactory: maxDepthFactory,
  serialize: serialize,
  toJSON: toJSON,
  toStringFactory: toStringFactory,
};

/**
 * @param {object} options?
 * @param {boolean} options.serializeMapAndSet?
 * @return {function}
 */
function createSerializer(options) {
  var seen = createWeakSet();

  return function (key, value) {
    if (typeof value === 'object' && value !== null) {
      if (seen.has(value)) {
        return undefined;
      }

      seen.add(value);
    }

    return serialize(key, value, options);
  };
}

/**
 * @return {WeakSet<object>}
 */
function createWeakSet() {
  if (typeof WeakSet !== 'undefined') {
    return new WeakSet();
  }

  var cache = [];
  return {
    add: function (value) { cache.push(value) },
    has: function (value) { return cache.indexOf(value) !== -1 },
  };
}

function maxDepth(data, depth) {
  if (!data) {
    return data;
  }

  if (depth < 1) {
    if (isArray(data)) return '[array]';
    if (typeof data === 'object' && data) return '[object]';

    return data;
  }

  if (isArray(data)) {
    return data.map(function (child) {
      return maxDepth(child, depth - 1);
    });
  }

  if (typeof data !== 'object') {
    return data;
  }

  if (data && typeof data.toISOString === 'function') {
    return data;
  }

  // noinspection PointlessBooleanExpressionJS
  if (data === null) {
    return null;
  }

  if (data instanceof Error) {
    return data;
  }

  var newJson = {};
  for (var i in data) {
    if (!Object.prototype.hasOwnProperty.call(data, i)) continue;
    newJson[i] = maxDepth(data[i], depth - 1);
  }

  return newJson;
}

function maxDepthFactory(depth) {
  depth = depth || 6;

  return function maxDepthFunction(data) {
    return maxDepth(data, depth);
  };
}

/**
 * @param {string} key
 * @param {any} value
 * @param {object} options?
 * @return {any}
 */
function serialize(key, value, options) {
  var serializeMapAndSet = !options || options.serializeMapAndSet !== false;

  if (value instanceof Error) {
    return value.stack;
  }

  if (!value) {
    return value;
  }

  if (typeof value.toJSON === 'function') {
    return value.toJSON();
  }

  if (typeof value === 'function') {
    return '[function] ' + value.toString();
  }

  if (serializeMapAndSet && value instanceof Map && Object.fromEntries) {
    return Object.fromEntries(value);
  }

  if (serializeMapAndSet && value instanceof Set && Array.from) {
    return Array.from(value);
  }

  return value;
}

function toJSON(data) {
  return JSON.parse(JSON.stringify(data, createSerializer()));
}

function toStringFactory(inspectOptions) {
  return function toStringFunction(data) {
    var simplifiedData = data.map(function (item) {
      if (item === undefined) {
        return undefined;
      }

      try {
        var str = JSON.stringify(item, createSerializer(), '  ');
        return str === undefined ? undefined : JSON.parse(str);
      } catch (e) {
        // There are some rare cases when an item can't be simplified.
        // In that case, it's fine to pass it to util.format directly.
        return item;
      }
    });

    if (util.formatWithOptions) {
      simplifiedData.unshift(inspectOptions || {});
      return util.formatWithOptions.apply(util, simplifiedData);
    }

    return util.format.apply(util, simplifiedData);
  };
}

function isArray(value) {
  return Object.prototype.toString.call(value) === '[object Array]';
}
'use strict';

module.exports = {
  applyAnsiStyles: applyAnsiStyles,
  removeStyles: removeStyles,
  transformStyles: transformStyles,
};

var ANSI_COLORS = {
  unset: '\x1b[0m',
  black: '\x1b[30m',
  red: '\x1b[31m',
  green: '\x1b[32m',
  yellow: '\x1b[33m',
  blue: '\x1b[34m',
  magenta: '\x1b[35m',
  cyan: '\x1b[36m',
  white: '\x1b[37m',
};

function applyAnsiStyles(data) {
  return transformStyles(data, styleToAnsi, resetAnsiStyle);
}

function styleToAnsi(style) {
  var color = style.replace(/color:\s*(\w+).*/, '$1').toLowerCase();
  return ANSI_COLORS[color] || '';
}

function resetAnsiStyle(string) {
  return string + ANSI_COLORS.unset;
}

function removeStyles(data) {
  return transformStyles(data, function () { return '' });
}

function transformStyles(data, onStyleFound, onStyleApplied) {
  var foundStyles = {};

  return data.reduce(function (result, item, index, array) {
    if (foundStyles[index]) {
      return result;
    }

    if (typeof item === 'string') {
      var valueIndex = index;
      var styleApplied = false;

      item = item.replace(/%[1cdfiOos]/g, function (match) {
        valueIndex += 1;

        if (match !== '%c') {
          return match;
        }

        var style = array[valueIndex];
        if (typeof style === 'string') {
          foundStyles[valueIndex] = true;
          styleApplied = true;
          return onStyleFound(style, item);
        }

        return match;
      });

      if (styleApplied && onStyleApplied) {
        item = onStyleApplied(item);
      }
    }

    result.push(item);
    return result;
  }, []);
}
'use strict';

module.exports = {
  concatFirstStringElements: concatFirstStringElements,
  formatDate: formatDate,
  formatTimeZone: formatTimeZone,
  pad: pad,
  padString: padString,
  templateDate: templateDate,
  templateVariables: templateVariables,
  templateScopeFactory: templateScopeFactory,
  templateText: templateText,
};

/**
 * The first argument of console.log may contain templates. In the library
 * the first element is a string related to transports.console.format. So
 * this function concatenates first two elements to make templates like %d
 * work
 * @param {*[]} data
 * @return {*[]}
 */
function concatFirstStringElements(data) {
  if (typeof data[0] !== 'string' || typeof data[1] !== 'string') {
    return data;
  }

  if (data[0].match(/%[1cdfiOos]/)) {
    return data;
  }

  data[1] = data[0] + ' ' + data[1];
  data.shift();

  return data;
}

function formatDate(template, date) {
  return template
    .replace('{y}', String(date.getFullYear()))
    .replace('{m}', pad(date.getMonth() + 1))
    .replace('{d}', pad(date.getDate()))
    .replace('{h}', pad(date.getHours()))
    .replace('{i}', pad(date.getMinutes()))
    .replace('{s}', pad(date.getSeconds()))
    .replace('{ms}', pad(date.getMilliseconds(), 3))
    .replace('{z}', formatTimeZone(date.getTimezoneOffset()))
    .replace('{iso}', date.toISOString());
}

function formatTimeZone(minutesOffset) {
  var m = Math.abs(minutesOffset);
  return (minutesOffset >= 0 ? '-' : '+')
    + pad(Math.floor(m / 60)) + ':'
    + pad(m % 60);
}

function pad(number, zeros) {
  zeros = zeros || 2;
  return (new Array(zeros + 1).join('0') + number).substr(-zeros, zeros);
}

function padString(value, length) {
  length = Math.max(length, value.length);
  var padValue = Array(length + 1).join(' ');
  return (value + padValue).substring(0, length);
}

function templateDate(data, message) {
  var template = data[0];
  if (typeof template !== 'string') {
    return data;
  }

  data[0] = formatDate(template, message.date);
  return data;
}

/**
 * @param {{ labelLength: number, defaultLabel: string }} options
 */
function templateScopeFactory(options) {
  options = options || {};
  var labelLength = options.labelLength || 0;

  return function templateScope(data, message) {
    var template = data[0];
    var label = message.scope && message.scope.label;

    if (!label) {
      label = options.defaultLabel;
    }

    var scopeText;
    if (label === '') {
      scopeText = labelLength > 0 ? padString('', labelLength + 3) : '';
    } else if (typeof label === 'string') {
      scopeText = padString(' (' + label + ')', labelLength + 3);
    } else {
      scopeText = '';
    }

    data[0] = template.replace('{scope}', scopeText);
    return data;
  };
}

function templateVariables(data, message) {
  var template = data[0];
  var variables = message.variables;

  if (typeof template !== 'string' || !message.variables) {
    return data;
  }

  for (var i in variables) {
    if (!Object.prototype.hasOwnProperty.call(variables, i)) continue;
    template = template.replace('{' + i + '}', variables[i]);
  }

  // Add additional space to the end of {level}] template to align messages
  template = template.replace('{level}]', padString(message.level + ']', 6));
  template = template.replace('{level}', message.level);

  data[0] = template;
  return data;
}

function templateText(data) {
  var template = data[0];
  if (typeof template !== 'string') {
    return data;
  }

  var textTplPosition = template.lastIndexOf('{text}');
  if (textTplPosition === template.length - 6) {
    data[0] = template.replace(/\s?{text}/, '');
    if (data[0] === '') {
      data.shift();
    }

    return data;
  }

  var templatePieces = template.split('{text}');
  var result = [];

  if (templatePieces[0] !== '') {
    result.push(templatePieces[0]);
  }

  result = result.concat(data.slice(1));

  if (templatePieces[1] !== '') {
    result.push(templatePieces[1]);
  }

  return result;
}
'use strict';

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

describe('transform', function () {
  var message = {
    level: 'info',
    data: ['test'],
    date: new Date(2000, 0, 1, 1, 1, 1),
    variables: { myVar: 'myVarValue' },
  };

  describe('customFormatterFactory', function () {
    it('should transform with string template', function () {
      var formatter = index.customFormatterFactory('{h}:{i}:{s} › {text}');

      expect(formatter(['test'], message))
        .toEqual(['01:01:01 ›', 'test']);
    });

    it('should transform with callback', function () {
      var formatter = index.customFormatterFactory(function (msg) {
        return msg.data;
      });

      expect(formatter(['test'], message))
        .toEqual(['test']);
    });
  });

  it('transform', function () {
    var transformed = index.transform(message, [
      function (d) { return d.concat(1) },
    ]);

    expect(transformed).toEqual(['test', 1]);
  });
});
'use strict';

var object = require('../object');

describe('transform/object', function () {
  describe('maxDepthFactory', function () {
    it('should remove objects nested deeper than depth', function () {
      var obj = [{ a: { b: {} } }];
      expect(object.maxDepthFactory(3)(obj))
        .toEqual([{ a: { b: '[object]' } }]);
    });

    it('should correctly process null values', function () {
      var obj = [{ a: null, b: undefined, c: { c1: null } }, null];
      expect(object.maxDepthFactory()(obj))
        .toEqual([{ a: null, b: undefined, c: { c1: null } }, null]);
    });
  });

  describe('serialize', function () {
    it('should serialize object', function () {
      expect(object.serialize(null, { a: 1 })).toEqual({ a: 1 });
    });

    it('should serialize errors', function () {
      expect(object.serialize(null, new Error('test')))
        .toMatch('Error: test\n');
    });

    it('should serialize functions', function () {
      expect(object.serialize(null, function () { return 1 }))
        .toEqual('[function] function () { return 1 }');
    });

    it('should serialize set', function () {
      expect(object.serialize(null, new Set([1]))).toEqual([1]);
    });

    it('should serialize map', function () {
      if (Object.fromEntries) {
        expect(object.serialize(null, new Map([['a', 1]]))).toEqual({ a: 1 });
      }
    });
  });

  describe('toJson', function () {
    it('should prevent circular reference exception', function () {
      var obj = { a: 1 };
      obj.b = obj;
      var safeObj = object.maxDepthFactory()(obj);

      expect(function () { object.toJSON(safeObj) }).not.toThrow();
    });
  });

  describe('toString', function () {
    it('should not throw when stringify undefined value', function () {
      var error = new Error();
      delete error.stack;

      expect(function () { object.toStringFactory()([error]) }).not.toThrow();
    });

    it('should convert a set to a string representation', function () {
      var set = new Set([1]);
      expect(object.toStringFactory()([set])).toEqual('[ 1 ]');
    });
  });
});
'use strict';

var style = require('../style');

describe('transform/style', function () {
  it('applyAnsiStyles', function () {
    expect(style.applyAnsiStyles(['%c 1 %c 2', 'color:red', 'color:green']))
      .toEqual(['\x1b[31m 1 \x1b[32m 2\x1b[0m']);
  });

  it('removeStyles', function () {
    expect(style.removeStyles(['%c 1 %c 2', 'color:red', 'color:green']))
      .toEqual([' 1  2']);
  });

  describe('transformStyles', function () {
    function onStyleFound(s) {
      return s + ': ';
    }

    it('simple data', function () {
      expect(style.transformStyles(['%c1 %c2', 'a', 'b'], onStyleFound))
        .toEqual(['a: 1 b: 2']);
    });

    it('missed styles', function () {
      expect(style.transformStyles(['%c1 %c2'], onStyleFound))
        .toEqual(['%c1 %c2']);
    });

    it('complex data', function () {
      function onStyleApplied(str) {
        return str + ' end';
      }

      var data = ['%c1 %c2', 'a', '%c3', '%c4', 'b'];

      expect(style.transformStyles(data, onStyleFound, onStyleApplied))
        .toEqual(['a: 1 %c3: 2 end', 'b: 4 end']);
    });
  });
});
'use strict';

var template = require('../template');

describe('transform/template', function () {
  var message = {
    level: 'info',
    data: ['test'],
    date: new Date(2000, 0, 1, 1, 1, 1),
    scope: { label: 'test' },
    variables: { myVar: 'myVarValue' },
  };

  describe('formatDate', function () {
    var date = new Date(2000, 0, 1, 1, 1, 1);

    it('should transform regular template', function () {
      expect(template.formatDate('{y}-{m}-{d} {h}:{i}:{s}.{ms}', date))
        .toBe('2000-01-01 01:01:01.000');
    });

    it('should transform utc date', function () {
      expect(template.formatDate('{iso}', date))
        .toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.000Z$/);
    });
  });

  it('formatTimeZone', function () {
    expect(template.formatTimeZone(-60)).toBe('+01:00');
    expect(template.formatTimeZone(60)).toBe('-01:00');
    expect(template.formatTimeZone(-570)).toBe('+09:30');
  });

  it('pad', function () {
    expect(template.pad(1, 1)).toBe('1');
    expect(template.pad(1)).toBe('01');
    expect(template.pad(10, 3)).toBe('010');
  });

  it('padString', function () {
    expect(template.padString('test', 2)).toBe('test');
    expect(template.padString('test', 5)).toBe('test ');
    expect(template.padString('', 5)).toBe('     ');
  });

  it('templateDate', function () {
    expect(template.templateDate(['{h}:{i}:{s}', 1], message))
      .toEqual(['01:01:01', 1]);
  });

  it('templateVariables', function () {
    expect(template.templateVariables(['{myVar}s', 1], message))
      .toEqual(['myVarValues', 1]);
  });

  describe('templateScopeFactory', function () {
    it('should set scope with padding', function () {
      var templateScope = template.templateScopeFactory({ labelLength: 6 });

      expect(templateScope(['{scope}', 1], message))
        .toEqual([' (test)  ', 1]);
    });

    it('should set empty scope if defaultLabel is false', function () {
      var msg = Object.assign({}, message, { scope: undefined });

      var templateScope = template.templateScopeFactory({
        labelLength: 6,
        defaultLabel: false,
      });

      expect(templateScope(['{scope}', 1], msg))
        .toEqual(['', 1]);
    });

    it('should add blank padding if defaultLabel is empty string', function () {
      message = Object.assign({}, message, { scope: undefined });

      var templateScope = template.templateScopeFactory({
        labelLength: 6,
        defaultLabel: '',
      });

      expect(templateScope(['{scope}', 1], message))
        .toEqual(['         ', 1]);
    });
  });

  describe('templateText', function () {
    it('should remove template if it`s the latest variable', function () {
      expect(template.templateText(['log: {text}', 1], message))
        .toEqual(['log:', 1]);
    });

    it('should stringify all if it`s not the latest variable', function () {
      expect(template.templateText(['{text} log', 1], message))
        .toEqual([1, ' log']);
    });
  });
});
'use strict';

var catchErrors = require('../catchErrors');

describe('catchErrors', function () {
  beforeAll(function () {
    this.originalListeners = process.listeners('unhandledRejection');
    process.removeAllListeners('unhandledRejection');
  });

  afterAll(function () {
    this.originalListeners.forEach(function (listener) {
      process.addListener('unhandledRejection', listener);
    });
  });

  afterEach(function () {
    this.catcher && this.catcher.stop();
  });

  it('should pass an error to options.log callback', function (done) {
    this.catcher = catchErrors({ log: log });

    Promise.reject(new Error('test-error'));

    function log(_, e) {
      expect(e.message).toBe('test-error');
      done();
    }
  }, 50);

  it('should pass an error to options.onError callback', function (done) {
    this.catcher = catchErrors({ onError: onError });

    Promise.reject(new Error('test-error'));

    function onError(e) {
      expect(e.message).toBe('test-error');
      done();
      return false;
    }
  }, 50);
});
import defaultLog from '../index';
import { create, FileTransport, warn } from '../index';

// Default module export
defaultLog.warn('test');

// CommonJS export
warn('test');

// Type export
let transport: FileTransport;

const newInstance = create('test');
newInstance.info('test');
'use strict';

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

describe('index', function () {
  it('should contain all methods of Console API', function () {
    var levels = ['error', 'warn', 'info', 'verbose', 'debug', 'silly', 'log'];
    levels.forEach(function (level) {
      expect(typeof index[level]).toBe('function');
    });
  });

  it('should allow to add a new log level', function () {
    index.levels.add('notice', 2);
    expect(index.levels).toEqual(
      ['error', 'warn', 'notice', 'info', 'verbose', 'debug', 'silly']
    );

    expect(typeof index.notice).toBe('function');
    expect(typeof index.functions.notice).toBe('function');
    expect(typeof index.scope('test').notice).toBe('function');
  });

  it('should create independent logger instance', function () {
    var defaultLogger = index;
    var customLogger = index.create('custom');

    customLogger.transports.file.fileName = 'custom.log';

    expect(defaultLogger.transports.file.fileName).toBe('main.log');
    expect(customLogger.transports.file.fileName).toBe('custom.log');
  });
});
'use strict';

var log = require('../log');

describe('log', function () {
  it('compareLevels', function () {
    var levels = mockElectronLog().levels;

    expect(log.compareLevels(levels, 'error', 'info')).toBe(false);
    expect(log.compareLevels(levels, 'info', 'error')).toBe(true);
    expect(log.compareLevels(levels, 'error', 'error')).toBe(true);
    expect(log.compareLevels(levels, 'error', 'not_exists')).toBe(true);
  });

  describe('log', function () {
    it('should call a transport function', function () {
      var electronLog = mockElectronLog();

      log.log(electronLog, { level: 'info' }, 'test');

      expect(electronLog.journal[0].data).toEqual(['test']);
      expect(electronLog.journal[0].level).toBe('info');
    });

    it('should process undefined value', function () {
      var electronLog = mockElectronLog();
      log.log(electronLog, { level: 'info' }, undefined);

      expect(electronLog.journal[0].data).toEqual([undefined]);
      expect(electronLog.journal[0].level).toBe('info');
    });

    it('should call hooks', function () {
      var electronLog = mockElectronLog();

      electronLog.hooks.push(function (msg) {
        msg.data[0] += ' hooked';
        return msg;
      });

      log.log(electronLog, { level: 'info' }, 'test');

      expect(electronLog.journal[0].data).toEqual(['test hooked']);

      // Should prevent logging
      electronLog.hooks.push(function () {
        return null;
      });

      log.log(electronLog, { level: 'info' }, 'test');

      expect(electronLog.journal.length).toBe(1);
    });

    it('should allow to add new levels', function () {
      var electronLog = mockElectronLog();
      electronLog.levels.push('custom');

      log.log(electronLog, { level: 'custom' }, 'test');
      expect(electronLog.journal.length).toBe(0);

      electronLog.transports.variable.level = 'custom';
      log.log(electronLog, { level: 'custom' }, 'test');
      expect(electronLog.journal.length).toBe(1);
    });
  });

  describe('runTransport', function () {
    it('should run transport when the level is correct', function () {
      var electronLog = mockElectronLog();
      var message = { data: ['test'], level: 'warn' };

      log.runTransport(electronLog.transports.variable, message, electronLog);

      expect(electronLog.journal.length).toBe(1);
    });

    it('should skip running when the transport is broken', function () {
      var electronLog = mockElectronLog();
      var message = { data: ['test'], level: 'warn' };

      log.runTransport({}, message, electronLog);

      expect(electronLog.journal.length).toBe(0);
    });

    it('should skip running when the level is not correct', function () {
      var electronLog = mockElectronLog();
      var message = { data: ['test'], level: 'custom' };

      log.runTransport({}, message, electronLog);

      expect(electronLog.journal.length).toBe(0);
    });
  });
});

function mockElectronLog() {
  var electronLog = {
    hooks: [],
    journal: [],
    levels: ['error', 'warn', 'info', 'verbose', 'debug', 'silly', 'custom'],
    transports: {
      variable: function (msg) { electronLog.journal.push(msg) },
    },
  };

  electronLog.transports.variable.level = 'silly';

  return electronLog;
}
'use strict';

var scopeFactory = require('../scope');

describe('scope', function () {
  it('should store maximum label length', function () {
    var electronLog = mockElectronLog();
    var scope = scopeFactory(electronLog);

    scope('test');
    expect(scope.maxLabelLength).toBe(4);

    scope('test2');
    expect(scope.maxLabelLength).toBe(5);
  });

  describe('labelLength', function () {
    it('when labelPadding is true', function () {
      var electronLog = mockElectronLog();
      var scope = scopeFactory(electronLog);
      scope.labelPadding = true;

      expect(scope.getOptions().labelLength).toBe(0);

      scope('test');
      expect(scope.getOptions().labelLength).toBe(4);
    });

    it('when labelPadding is false', function () {
      var electronLog = mockElectronLog();
      var scope = scopeFactory(electronLog);
      scope.labelPadding = false;

      expect(scope.getOptions().labelLength).toBe(0);

      scope('test');
      expect(scope.getOptions().labelLength).toBe(0);
    });

    it('when labelPadding is number', function () {
      var electronLog = mockElectronLog();
      var scope = scopeFactory(electronLog);
      scope.labelPadding = 10;

      expect(scope.getOptions().labelLength).toBe(10);

      scope('test');
      expect(scope.getOptions().labelLength).toBe(10);
    });
  });
});

function mockElectronLog() {
  return {
    levels: ['error', 'warn', 'info', 'verbose', 'debug', 'silly'],
  };
}
'use strict';

var fs = require('fs');
var os = require('os');
var path = require('path');
var rmDir = require('./fsHelpers').rmDir;

module.exports = TestLogReader;

function TestLogReader() {
  this.items = [];
  this.appName = null;
}

TestLogReader.getDefaultLogDir = function (appName) {
  switch (process.platform) {
    case 'darwin': {
      return path.resolve(os.homedir(), 'Library/Logs', appName);
    }
    case 'win32': {
      return path.resolve(os.homedir(), 'AppData/Roaming', appName, 'logs');
    }
    default: {
      return path.resolve(os.homedir(), '.config', appName, 'logs');
    }
  }
};

TestLogReader.removeDefaultLogDir = function (appName) {
  var dir = this.getDefaultLogDir(appName);

  if (process.platform !== 'darwin') {
    dir = path.dirname(dir);
  }

  rmDir(dir);
};

TestLogReader.fromApp = function (appName) {
  var reader = new this();
  reader.loadFilesFromDefaultDir(appName);
  reader.appName = appName;
  return reader;
};

TestLogReader.fromFile = function (logFilePath) {
  var reader = new this();
  reader.loadFile(logFilePath);
  return reader;
};

TestLogReader.prototype.format = function (template) {
  template = template || '{fileName}: {text}';

  return this.items.map(function (item) {
    return template
      .replace('{date}', item.date)
      .replace('{fileName}', item.fileName)
      .replace('{level}', item.level)
      .replace('{text}', item.text);
  });
};

TestLogReader.prototype.loadFile = function (filePath) {
  var fileName = path.basename(filePath);
  var content = fs.readFileSync(filePath, 'utf8');

  var items = content.split(os.EOL)
    .filter(Boolean)
    .reduce(function (result, line) {
      var matches = line.match(/\[([\w.: -]+)] \[(\w+)]  ?([\s\S]*)/);
      if (matches) {
        return result.concat({
          date: matches[1],
          fileName: fileName,
          level: matches[2],
          text: matches[3],
        });
      }

      var lastItem = result[result.length - 1];
      if (lastItem) {
        lastItem.text += '\n' + line;
      }

      return result;
    }, [])
    .filter(Boolean);

  this.items = this.items.concat(items);
};

TestLogReader.prototype.loadFilesFromDefaultDir = function (appName) {
  var defaultLogDir = this.constructor.getDefaultLogDir(appName);
  var logs = fs.readdirSync(defaultLogDir);
  logs.forEach(function (logFileName) {
    this.loadFile(path.join(defaultLogDir, logFileName));
  }, this);
};

TestLogReader.prototype.removeLogDir = function () {
  if (this.appName) {
    this.constructor.removeDefaultLogDir(this.appName);
  }
};
'use strict';

var fs = require('fs');
var path = require('path');

module.exports = {
  /**
   * For running tests using node older than 12.10
   * @param {string} dirPath
   */
  rmDir: function (dirPath) {
    if (!fs.existsSync(dirPath)) {
      return;
    }

    fs.readdirSync(dirPath).forEach(function (file) {
      var curPath = path.join(dirPath, file);
      if (fs.lstatSync(curPath).isDirectory()) {
        module.exports.rmDir(curPath);
      } else {
        fs.unlinkSync(curPath);
      }
    });

    fs.rmdirSync(dirPath);
  },
};
The MIT License (MIT)

Copyright (c) 2015 Loopline Systems

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-updater",
  "version": "5.2.1",
  "description": "Cross platform updater for electron applications",
  "main": "out/main.js",
  "author": "Vladimir Krivosheev",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/electron-userland/electron-builder.git",
    "directory": "packages/electron-updater"
  },
  "homepage": "https://github.com/electron-userland/electron-builder",
  "files": [
    "out"
  ],
  "dependencies": {
    "@types/semver": "^7.3.6",
    "builder-util-runtime": "9.0.3",
    "fs-extra": "^10.0.0",
    "js-yaml": "^4.1.0",
    "lazy-val": "^1.0.5",
    "lodash.escaperegexp": "^4.1.2",
    "lodash.isequal": "^4.5.0",
    "semver": "^7.3.5",
    "typed-emitter": "^2.1.0"
  },
  "devDependencies": {
    "@types/fs-extra": "9.0.13",
    "@types/js-yaml": "4.0.3",
    "@types/lodash.escaperegexp": "4.1.6",
    "@types/lodash.isequal": "4.5.5"
  },
  "typings": "./out/main.d.ts",
  "publishConfig": {
    "tag": "next"
  }
}"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getAppCacheDir = void 0;
const path = require("path");
const os_1 = require("os");
function getAppCacheDir() {
    const homedir = os_1.homedir();
    // https://github.com/electron/electron/issues/1404#issuecomment-194391247
    let result;
    if (process.platform === "win32") {
        result = process.env["LOCALAPPDATA"] || path.join(homedir, "AppData", "Local");
    }
    else if (process.platform === "darwin") {
        result = path.join(homedir, "Library", "Application Support", "Caches");
    }
    else {
        result = process.env["XDG_CACHE_HOME"] || path.join(homedir, ".cache");
    }
    return result;
}
exports.getAppCacheDir = getAppCacheDir;
//# sourceMappingURL=AppAdapter.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AppImageUpdater = void 0;
const builder_util_runtime_1 = require("builder-util-runtime");
const child_process_1 = require("child_process");
const fs_extra_1 = require("fs-extra");
const fs_1 = require("fs");
const path = require("path");
const BaseUpdater_1 = require("./BaseUpdater");
const FileWithEmbeddedBlockMapDifferentialDownloader_1 = require("./differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader");
const main_1 = require("./main");
const Provider_1 = require("./providers/Provider");
class AppImageUpdater extends BaseUpdater_1.BaseUpdater {
    constructor(options, app) {
        super(options, app);
    }
    isUpdaterActive() {
        if (process.env["APPIMAGE"] == null) {
            if (process.env["SNAP"] == null) {
                this._logger.warn("APPIMAGE env is not defined, current application is not an AppImage");
            }
            else {
                this._logger.info("SNAP env is defined, updater is disabled");
            }
            return false;
        }
        return super.isUpdaterActive();
    }
    /*** @private */
    doDownloadUpdate(downloadUpdateOptions) {
        const provider = downloadUpdateOptions.updateInfoAndProvider.provider;
        const fileInfo = Provider_1.findFile(provider.resolveFiles(downloadUpdateOptions.updateInfoAndProvider.info), "AppImage");
        return this.executeDownload({
            fileExtension: "AppImage",
            fileInfo,
            downloadUpdateOptions,
            task: async (updateFile, downloadOptions) => {
                const oldFile = process.env["APPIMAGE"];
                if (oldFile == null) {
                    throw builder_util_runtime_1.newError("APPIMAGE env is not defined", "ERR_UPDATER_OLD_FILE_NOT_FOUND");
                }
                let isDownloadFull = false;
                try {
                    const downloadOptions = {
                        newUrl: fileInfo.url,
                        oldFile,
                        logger: this._logger,
                        newFile: updateFile,
                        isUseMultipleRangeRequest: provider.isUseMultipleRangeRequest,
                        requestHeaders: downloadUpdateOptions.requestHeaders,
                        cancellationToken: downloadUpdateOptions.cancellationToken,
                    };
                    if (this.listenerCount(main_1.DOWNLOAD_PROGRESS) > 0) {
                        downloadOptions.onProgress = it => this.emit(main_1.DOWNLOAD_PROGRESS, it);
                    }
                    await new FileWithEmbeddedBlockMapDifferentialDownloader_1.FileWithEmbeddedBlockMapDifferentialDownloader(fileInfo.info, this.httpExecutor, downloadOptions).download();
                }
                catch (e) {
                    this._logger.error(`Cannot download differentially, fallback to full download: ${e.stack || e}`);
                    // during test (developer machine mac) we must throw error
                    isDownloadFull = process.platform === "linux";
                }
                if (isDownloadFull) {
                    await this.httpExecutor.download(fileInfo.url, updateFile, downloadOptions);
                }
                await fs_extra_1.chmod(updateFile, 0o755);
            },
        });
    }
    doInstall(options) {
        const appImageFile = process.env["APPIMAGE"];
        if (appImageFile == null) {
            throw builder_util_runtime_1.newError("APPIMAGE env is not defined", "ERR_UPDATER_OLD_FILE_NOT_FOUND");
        }
        // https://stackoverflow.com/a/1712051/1910191
        fs_1.unlinkSync(appImageFile);
        let destination;
        const existingBaseName = path.basename(appImageFile);
        // https://github.com/electron-userland/electron-builder/issues/2964
        // if no version in existing file name, it means that user wants to preserve current custom name
        if (path.basename(options.installerPath) === existingBaseName || !/\d+\.\d+\.\d+/.test(existingBaseName)) {
            // no version in the file name, overwrite existing
            destination = appImageFile;
        }
        else {
            destination = path.join(path.dirname(appImageFile), path.basename(options.installerPath));
        }
        child_process_1.execFileSync("mv", ["-f", options.installerPath, destination]);
        if (destination !== appImageFile) {
            this.emit("appimage-filename-updated", destination);
        }
        const env = {
            ...process.env,
            APPIMAGE_SILENT_INSTALL: "true",
        };
        if (options.isForceRunAfter) {
            child_process_1.spawn(destination, [], {
                detached: true,
                stdio: "ignore",
                env,
            }).unref();
        }
        else {
            env.APPIMAGE_EXIT_AFTER_INSTALL = "true";
            child_process_1.execFileSync(destination, [], { env });
        }
        return true;
    }
}
exports.AppImageUpdater = AppImageUpdater;
//# sourceMappingURL=AppImageUpdater.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.NoOpLogger = exports.AppUpdater = void 0;
const builder_util_runtime_1 = require("builder-util-runtime");
const crypto_1 = require("crypto");
const events_1 = require("events");
const fs_extra_1 = require("fs-extra");
const js_yaml_1 = require("js-yaml");
const lazy_val_1 = require("lazy-val");
const path = require("path");
const semver_1 = require("semver");
const DownloadedUpdateHelper_1 = require("./DownloadedUpdateHelper");
const ElectronAppAdapter_1 = require("./ElectronAppAdapter");
const electronHttpExecutor_1 = require("./electronHttpExecutor");
const GenericProvider_1 = require("./providers/GenericProvider");
const main_1 = require("./main");
const providerFactory_1 = require("./providerFactory");
class AppUpdater extends events_1.EventEmitter {
    constructor(options, app) {
        super();
        /**
         * Whether to automatically download an update when it is found.
         */
        this.autoDownload = true;
        /**
         * Whether to automatically install a downloaded update on app quit (if `quitAndInstall` was not called before).
         */
        this.autoInstallOnAppQuit = true;
        /**
         * *GitHub provider only.* Whether to allow update to pre-release versions. Defaults to `true` if application version contains prerelease components (e.g. `0.12.1-alpha.1`, here `alpha` is a prerelease component), otherwise `false`.
         *
         * If `true`, downgrade will be allowed (`allowDowngrade` will be set to `true`).
         */
        this.allowPrerelease = false;
        /**
         * *GitHub provider only.* Get all release notes (from current version to latest), not just the latest.
         * @default false
         */
        this.fullChangelog = false;
        /**
         * Whether to allow version downgrade (when a user from the beta channel wants to go back to the stable channel).
         *
         * Taken in account only if channel differs (pre-release version component in terms of semantic versioning).
         *
         * @default false
         */
        this.allowDowngrade = false;
        /**
         * Web installer files might not have signature verification, this switch prevents to load them unless it is needed.
         *
         * Currently false to prevent breaking the current API, but it should be changed to default true at some point that
         * breaking changes are allowed.
         *
         * @default false
         */
        this.disableWebInstaller = false;
        this._channel = null;
        this.downloadedUpdateHelper = null;
        /**
         *  The request headers.
         */
        this.requestHeaders = null;
        this._logger = console;
        // noinspection JSUnusedGlobalSymbols
        /**
         * For type safety you can use signals, e.g. `autoUpdater.signals.updateDownloaded(() => {})` instead of `autoUpdater.on('update-available', () => {})`
         */
        this.signals = new main_1.UpdaterSignal(this);
        this._appUpdateConfigPath = null;
        this.clientPromise = null;
        this.stagingUserIdPromise = new lazy_val_1.Lazy(() => this.getOrCreateStagingUserId());
        // public, allow to read old config for anyone
        /** @internal */
        this.configOnDisk = new lazy_val_1.Lazy(() => this.loadUpdateConfig());
        this.checkForUpdatesPromise = null;
        this.updateInfoAndProvider = null;
        /**
         * @private
         * @internal
         */
        this._testOnlyOptions = null;
        this.on("error", (error) => {
            this._logger.error(`Error: ${error.stack || error.message}`);
        });
        if (app == null) {
            this.app = new ElectronAppAdapter_1.ElectronAppAdapter();
            this.httpExecutor = new electronHttpExecutor_1.ElectronHttpExecutor((authInfo, callback) => this.emit("login", authInfo, callback));
        }
        else {
            this.app = app;
            this.httpExecutor = null;
        }
        const currentVersionString = this.app.version;
        const currentVersion = semver_1.parse(currentVersionString);
        if (currentVersion == null) {
            throw builder_util_runtime_1.newError(`App version is not a valid semver version: "${currentVersionString}"`, "ERR_UPDATER_INVALID_VERSION");
        }
        this.currentVersion = currentVersion;
        this.allowPrerelease = hasPrereleaseComponents(currentVersion);
        if (options != null) {
            this.setFeedURL(options);
            if (typeof options !== "string" && options.requestHeaders) {
                this.requestHeaders = options.requestHeaders;
            }
        }
    }
    /**
     * Get the update channel. Not applicable for GitHub. Doesn't return `channel` from the update configuration, only if was previously set.
     */
    get channel() {
        return this._channel;
    }
    /**
     * Set the update channel. Not applicable for GitHub. Overrides `channel` in the update configuration.
     *
     * `allowDowngrade` will be automatically set to `true`. If this behavior is not suitable for you, simple set `allowDowngrade` explicitly after.
     */
    set channel(value) {
        if (this._channel != null) {
            // noinspection SuspiciousTypeOfGuard
            if (typeof value !== "string") {
                throw builder_util_runtime_1.newError(`Channel must be a string, but got: ${value}`, "ERR_UPDATER_INVALID_CHANNEL");
            }
            else if (value.length === 0) {
                throw builder_util_runtime_1.newError(`Channel must be not an empty string`, "ERR_UPDATER_INVALID_CHANNEL");
            }
        }
        this._channel = value;
        this.allowDowngrade = true;
    }
    /**
     *  Shortcut for explicitly adding auth tokens to request headers
     */
    addAuthHeader(token) {
        this.requestHeaders = Object.assign({}, this.requestHeaders, {
            authorization: token,
        });
    }
    // noinspection JSMethodCanBeStatic,JSUnusedGlobalSymbols
    get netSession() {
        return electronHttpExecutor_1.getNetSession();
    }
    /**
     * The logger. You can pass [electron-log](https://github.com/megahertz/electron-log), [winston](https://github.com/winstonjs/winston) or another logger with the following interface: `{ info(), warn(), error() }`.
     * Set it to `null` if you would like to disable a logging feature.
     */
    get logger() {
        return this._logger;
    }
    set logger(value) {
        this._logger = value == null ? new NoOpLogger() : value;
    }
    // noinspection JSUnusedGlobalSymbols
    /**
     * test only
     * @private
     */
    set updateConfigPath(value) {
        this.clientPromise = null;
        this._appUpdateConfigPath = value;
        this.configOnDisk = new lazy_val_1.Lazy(() => this.loadUpdateConfig());
    }
    //noinspection JSMethodCanBeStatic,JSUnusedGlobalSymbols
    getFeedURL() {
        return "Deprecated. Do not use it.";
    }
    /**
     * Configure update provider. If value is `string`, [GenericServerOptions](/configuration/publish#genericserveroptions) will be set with value as `url`.
     * @param options If you want to override configuration in the `app-update.yml`.
     */
    setFeedURL(options) {
        const runtimeOptions = this.createProviderRuntimeOptions();
        // https://github.com/electron-userland/electron-builder/issues/1105
        let provider;
        if (typeof options === "string") {
            provider = new GenericProvider_1.GenericProvider({ provider: "generic", url: options }, this, {
                ...runtimeOptions,
                isUseMultipleRangeRequest: providerFactory_1.isUrlProbablySupportMultiRangeRequests(options),
            });
        }
        else {
            provider = providerFactory_1.createClient(options, this, runtimeOptions);
        }
        this.clientPromise = Promise.resolve(provider);
    }
    /**
     * Asks the server whether there is an update.
     */
    checkForUpdates() {
        if (!this.isUpdaterActive()) {
            return Promise.resolve(null);
        }
        let checkForUpdatesPromise = this.checkForUpdatesPromise;
        if (checkForUpdatesPromise != null) {
            this._logger.info("Checking for update (already in progress)");
            return checkForUpdatesPromise;
        }
        const nullizePromise = () => (this.checkForUpdatesPromise = null);
        this._logger.info("Checking for update");
        checkForUpdatesPromise = this.doCheckForUpdates()
            .then(it => {
            nullizePromise();
            return it;
        })
            .catch(e => {
            nullizePromise();
            this.emit("error", e, `Cannot check for updates: ${(e.stack || e).toString()}`);
            throw e;
        });
        this.checkForUpdatesPromise = checkForUpdatesPromise;
        return checkForUpdatesPromise;
    }
    isUpdaterActive() {
        if (!this.app.isPackaged) {
            this._logger.info("Skip checkForUpdatesAndNotify because application is not packed");
            return false;
        }
        return true;
    }
    // noinspection JSUnusedGlobalSymbols
    checkForUpdatesAndNotify(downloadNotification) {
        return this.checkForUpdates().then(it => {
            if (!(it === null || it === void 0 ? void 0 : it.downloadPromise)) {
                if (this._logger.debug != null) {
                    this._logger.debug("checkForUpdatesAndNotify called, downloadPromise is null");
                }
                return it;
            }
            void it.downloadPromise.then(() => {
                const notificationContent = AppUpdater.formatDownloadNotification(it.updateInfo.version, this.app.name, downloadNotification);
                new (require("electron").Notification)(notificationContent).show();
            });
            return it;
        });
    }
    static formatDownloadNotification(version, appName, downloadNotification) {
        if (downloadNotification == null) {
            downloadNotification = {
                title: "A new update is ready to install",
                body: `{appName} version {version} has been downloaded and will be automatically installed on exit`,
            };
        }
        downloadNotification = {
            title: downloadNotification.title.replace("{appName}", appName).replace("{version}", version),
            body: downloadNotification.body.replace("{appName}", appName).replace("{version}", version),
        };
        return downloadNotification;
    }
    async isStagingMatch(updateInfo) {
        const rawStagingPercentage = updateInfo.stagingPercentage;
        let stagingPercentage = rawStagingPercentage;
        if (stagingPercentage == null) {
            return true;
        }
        stagingPercentage = parseInt(stagingPercentage, 10);
        if (isNaN(stagingPercentage)) {
            this._logger.warn(`Staging percentage is NaN: ${rawStagingPercentage}`);
            return true;
        }
        // convert from user 0-100 to internal 0-1
        stagingPercentage = stagingPercentage / 100;
        const stagingUserId = await this.stagingUserIdPromise.value;
        const val = builder_util_runtime_1.UUID.parse(stagingUserId).readUInt32BE(12);
        const percentage = val / 0xffffffff;
        this._logger.info(`Staging percentage: ${stagingPercentage}, percentage: ${percentage}, user id: ${stagingUserId}`);
        return percentage < stagingPercentage;
    }
    computeFinalHeaders(headers) {
        if (this.requestHeaders != null) {
            Object.assign(headers, this.requestHeaders);
        }
        return headers;
    }
    async isUpdateAvailable(updateInfo) {
        const latestVersion = semver_1.parse(updateInfo.version);
        if (latestVersion == null) {
            throw builder_util_runtime_1.newError(`This file could not be downloaded, or the latest version (from update server) does not have a valid semver version: "${updateInfo.version}"`, "ERR_UPDATER_INVALID_VERSION");
        }
        const currentVersion = this.currentVersion;
        if (semver_1.eq(latestVersion, currentVersion)) {
            return false;
        }
        const isStagingMatch = await this.isStagingMatch(updateInfo);
        if (!isStagingMatch) {
            return false;
        }
        // https://github.com/electron-userland/electron-builder/pull/3111#issuecomment-405033227
        // https://github.com/electron-userland/electron-builder/pull/3111#issuecomment-405030797
        const isLatestVersionNewer = semver_1.gt(latestVersion, currentVersion);
        const isLatestVersionOlder = semver_1.lt(latestVersion, currentVersion);
        if (isLatestVersionNewer) {
            return true;
        }
        return this.allowDowngrade && isLatestVersionOlder;
    }
    async getUpdateInfoAndProvider() {
        await this.app.whenReady();
        if (this.clientPromise == null) {
            this.clientPromise = this.configOnDisk.value.then(it => providerFactory_1.createClient(it, this, this.createProviderRuntimeOptions()));
        }
        const client = await this.clientPromise;
        const stagingUserId = await this.stagingUserIdPromise.value;
        client.setRequestHeaders(this.computeFinalHeaders({ "x-user-staging-id": stagingUserId }));
        return {
            info: await client.getLatestVersion(),
            provider: client,
        };
    }
    // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
    createProviderRuntimeOptions() {
        return {
            isUseMultipleRangeRequest: true,
            platform: this._testOnlyOptions == null ? process.platform : this._testOnlyOptions.platform,
            executor: this.httpExecutor,
        };
    }
    async doCheckForUpdates() {
        this.emit("checking-for-update");
        const result = await this.getUpdateInfoAndProvider();
        const updateInfo = result.info;
        if (!(await this.isUpdateAvailable(updateInfo))) {
            this._logger.info(`Update for version ${this.currentVersion} is not available (latest version: ${updateInfo.version}, downgrade is ${this.allowDowngrade ? "allowed" : "disallowed"}).`);
            this.emit("update-not-available", updateInfo);
            return {
                versionInfo: updateInfo,
                updateInfo,
            };
        }
        this.updateInfoAndProvider = result;
        this.onUpdateAvailable(updateInfo);
        const cancellationToken = new builder_util_runtime_1.CancellationToken();
        //noinspection ES6MissingAwait
        return {
            versionInfo: updateInfo,
            updateInfo,
            cancellationToken,
            downloadPromise: this.autoDownload ? this.downloadUpdate(cancellationToken) : null,
        };
    }
    onUpdateAvailable(updateInfo) {
        this._logger.info(`Found version ${updateInfo.version} (url: ${builder_util_runtime_1.asArray(updateInfo.files)
            .map(it => it.url)
            .join(", ")})`);
        this.emit("update-available", updateInfo);
    }
    /**
     * Start downloading update manually. You can use this method if `autoDownload` option is set to `false`.
     * @returns {Promise<string>} Path to downloaded file.
     */
    downloadUpdate(cancellationToken = new builder_util_runtime_1.CancellationToken()) {
        const updateInfoAndProvider = this.updateInfoAndProvider;
        if (updateInfoAndProvider == null) {
            const error = new Error("Please check update first");
            this.dispatchError(error);
            return Promise.reject(error);
        }
        this._logger.info(`Downloading update from ${builder_util_runtime_1.asArray(updateInfoAndProvider.info.files)
            .map(it => it.url)
            .join(", ")}`);
        const errorHandler = (e) => {
            // https://github.com/electron-userland/electron-builder/issues/1150#issuecomment-436891159
            if (!(e instanceof builder_util_runtime_1.CancellationError)) {
                try {
                    this.dispatchError(e);
                }
                catch (nestedError) {
                    this._logger.warn(`Cannot dispatch error event: ${nestedError.stack || nestedError}`);
                }
            }
            return e;
        };
        try {
            return this.doDownloadUpdate({
                updateInfoAndProvider,
                requestHeaders: this.computeRequestHeaders(updateInfoAndProvider.provider),
                cancellationToken,
                disableWebInstaller: this.disableWebInstaller,
            }).catch(e => {
                throw errorHandler(e);
            });
        }
        catch (e) {
            return Promise.reject(errorHandler(e));
        }
    }
    dispatchError(e) {
        this.emit("error", e, (e.stack || e).toString());
    }
    dispatchUpdateDownloaded(event) {
        this.emit(main_1.UPDATE_DOWNLOADED, event);
    }
    async loadUpdateConfig() {
        if (this._appUpdateConfigPath == null) {
            this._appUpdateConfigPath = this.app.appUpdateConfigPath;
        }
        return js_yaml_1.load(await fs_extra_1.readFile(this._appUpdateConfigPath, "utf-8"));
    }
    computeRequestHeaders(provider) {
        const fileExtraDownloadHeaders = provider.fileExtraDownloadHeaders;
        if (fileExtraDownloadHeaders != null) {
            const requestHeaders = this.requestHeaders;
            return requestHeaders == null
                ? fileExtraDownloadHeaders
                : {
                    ...fileExtraDownloadHeaders,
                    ...requestHeaders,
                };
        }
        return this.computeFinalHeaders({ accept: "*/*" });
    }
    async getOrCreateStagingUserId() {
        const file = path.join(this.app.userDataPath, ".updaterId");
        try {
            const id = await fs_extra_1.readFile(file, "utf-8");
            if (builder_util_runtime_1.UUID.check(id)) {
                return id;
            }
            else {
                this._logger.warn(`Staging user id file exists, but content was invalid: ${id}`);
            }
        }
        catch (e) {
            if (e.code !== "ENOENT") {
                this._logger.warn(`Couldn't read staging user ID, creating a blank one: ${e}`);
            }
        }
        const id = builder_util_runtime_1.UUID.v5(crypto_1.randomBytes(4096), builder_util_runtime_1.UUID.OID);
        this._logger.info(`Generated new staging user ID: ${id}`);
        try {
            await fs_extra_1.outputFile(file, id);
        }
        catch (e) {
            this._logger.warn(`Couldn't write out staging user ID: ${e}`);
        }
        return id;
    }
    /** @internal */
    get isAddNoCacheQuery() {
        const headers = this.requestHeaders;
        // https://github.com/electron-userland/electron-builder/issues/3021
        if (headers == null) {
            return true;
        }
        for (const headerName of Object.keys(headers)) {
            const s = headerName.toLowerCase();
            if (s === "authorization" || s === "private-token") {
                return false;
            }
        }
        return true;
    }
    async getOrCreateDownloadHelper() {
        let result = this.downloadedUpdateHelper;
        if (result == null) {
            const dirName = (await this.configOnDisk.value).updaterCacheDirName;
            const logger = this._logger;
            if (dirName == null) {
                logger.error("updaterCacheDirName is not specified in app-update.yml Was app build using at least electron-builder 20.34.0?");
            }
            const cacheDir = path.join(this.app.baseCachePath, dirName || this.app.name);
            if (logger.debug != null) {
                logger.debug(`updater cache dir: ${cacheDir}`);
            }
            result = new DownloadedUpdateHelper_1.DownloadedUpdateHelper(cacheDir);
            this.downloadedUpdateHelper = result;
        }
        return result;
    }
    async executeDownload(taskOptions) {
        const fileInfo = taskOptions.fileInfo;
        const downloadOptions = {
            headers: taskOptions.downloadUpdateOptions.requestHeaders,
            cancellationToken: taskOptions.downloadUpdateOptions.cancellationToken,
            sha2: fileInfo.info.sha2,
            sha512: fileInfo.info.sha512,
        };
        if (this.listenerCount(main_1.DOWNLOAD_PROGRESS) > 0) {
            downloadOptions.onProgress = it => this.emit(main_1.DOWNLOAD_PROGRESS, it);
        }
        const updateInfo = taskOptions.downloadUpdateOptions.updateInfoAndProvider.info;
        const version = updateInfo.version;
        const packageInfo = fileInfo.packageInfo;
        function getCacheUpdateFileName() {
            // NodeJS URL doesn't decode automatically
            const urlPath = decodeURIComponent(taskOptions.fileInfo.url.pathname);
            if (urlPath.endsWith(`.${taskOptions.fileExtension}`)) {
                return path.basename(urlPath);
            }
            else {
                // url like /latest, generate name
                return `update.${taskOptions.fileExtension}`;
            }
        }
        const downloadedUpdateHelper = await this.getOrCreateDownloadHelper();
        const cacheDir = downloadedUpdateHelper.cacheDirForPendingUpdate;
        await fs_extra_1.mkdir(cacheDir, { recursive: true });
        const updateFileName = getCacheUpdateFileName();
        let updateFile = path.join(cacheDir, updateFileName);
        const packageFile = packageInfo == null ? null : path.join(cacheDir, `package-${version}${path.extname(packageInfo.path) || ".7z"}`);
        const done = async (isSaveCache) => {
            await downloadedUpdateHelper.setDownloadedFile(updateFile, packageFile, updateInfo, fileInfo, updateFileName, isSaveCache);
            await taskOptions.done({
                ...updateInfo,
                downloadedFile: updateFile,
            });
            return packageFile == null ? [updateFile] : [updateFile, packageFile];
        };
        const log = this._logger;
        const cachedUpdateFile = await downloadedUpdateHelper.validateDownloadedPath(updateFile, updateInfo, fileInfo, log);
        if (cachedUpdateFile != null) {
            updateFile = cachedUpdateFile;
            return await done(false);
        }
        const removeFileIfAny = async () => {
            await downloadedUpdateHelper.clear().catch(() => {
                // ignore
            });
            return await fs_extra_1.unlink(updateFile).catch(() => {
                // ignore
            });
        };
        const tempUpdateFile = await DownloadedUpdateHelper_1.createTempUpdateFile(`temp-${updateFileName}`, cacheDir, log);
        try {
            await taskOptions.task(tempUpdateFile, downloadOptions, packageFile, removeFileIfAny);
            await fs_extra_1.rename(tempUpdateFile, updateFile);
        }
        catch (e) {
            await removeFileIfAny();
            if (e instanceof builder_util_runtime_1.CancellationError) {
                log.info("cancelled");
                this.emit("update-cancelled", updateInfo);
            }
            throw e;
        }
        log.info(`New version ${version} has been downloaded to ${updateFile}`);
        return await done(true);
    }
}
exports.AppUpdater = AppUpdater;
function hasPrereleaseComponents(version) {
    const versionPrereleaseComponent = semver_1.prerelease(version);
    return versionPrereleaseComponent != null && versionPrereleaseComponent.length > 0;
}
/** @private */
class NoOpLogger {
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    info(message) {
        // ignore
    }
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    warn(message) {
        // ignore
    }
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    error(message) {
        // ignore
    }
}
exports.NoOpLogger = NoOpLogger;
//# sourceMappingURL=AppUpdater.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BaseUpdater = void 0;
const AppUpdater_1 = require("./AppUpdater");
class BaseUpdater extends AppUpdater_1.AppUpdater {
    constructor(options, app) {
        super(options, app);
        this.quitAndInstallCalled = false;
        this.quitHandlerAdded = false;
    }
    quitAndInstall(isSilent = false, isForceRunAfter = false) {
        this._logger.info(`Install on explicit quitAndInstall`);
        const isInstalled = this.install(isSilent, isSilent ? isForceRunAfter : true);
        if (isInstalled) {
            setImmediate(() => {
                // this event is normally emitted when calling quitAndInstall, this emulates that
                require("electron").autoUpdater.emit("before-quit-for-update");
                this.app.quit();
            });
        }
        else {
            this.quitAndInstallCalled = false;
        }
    }
    executeDownload(taskOptions) {
        return super.executeDownload({
            ...taskOptions,
            done: event => {
                this.dispatchUpdateDownloaded(event);
                this.addQuitHandler();
                return Promise.resolve();
            },
        });
    }
    // must be sync (because quit even handler is not async)
    install(isSilent, isForceRunAfter) {
        if (this.quitAndInstallCalled) {
            this._logger.warn("install call ignored: quitAndInstallCalled is set to true");
            return false;
        }
        const downloadedUpdateHelper = this.downloadedUpdateHelper;
        const installerPath = downloadedUpdateHelper == null ? null : downloadedUpdateHelper.file;
        const downloadedFileInfo = downloadedUpdateHelper == null ? null : downloadedUpdateHelper.downloadedFileInfo;
        if (installerPath == null || downloadedFileInfo == null) {
            this.dispatchError(new Error("No valid update available, can't quit and install"));
            return false;
        }
        // prevent calling several times
        this.quitAndInstallCalled = true;
        try {
            this._logger.info(`Install: isSilent: ${isSilent}, isForceRunAfter: ${isForceRunAfter}`);
            return this.doInstall({
                installerPath,
                isSilent,
                isForceRunAfter,
                isAdminRightsRequired: downloadedFileInfo.isAdminRightsRequired,
            });
        }
        catch (e) {
            this.dispatchError(e);
            return false;
        }
    }
    addQuitHandler() {
        if (this.quitHandlerAdded || !this.autoInstallOnAppQuit) {
            return;
        }
        this.quitHandlerAdded = true;
        this.app.onQuit(exitCode => {
            if (this.quitAndInstallCalled) {
                this._logger.info("Update installer has already been triggered. Quitting application.");
                return;
            }
            if (!this.autoInstallOnAppQuit) {
                this._logger.info("Update will not be installed on quit because autoInstallOnAppQuit is set to false.");
                return;
            }
            if (exitCode !== 0) {
                this._logger.info(`Update will be not installed on quit because application is quitting with exit code ${exitCode}`);
                return;
            }
            this._logger.info("Auto install update on quit");
            this.install(true, false);
        });
    }
}
exports.BaseUpdater = BaseUpdater;
//# sourceMappingURL=BaseUpdater.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createTempUpdateFile = exports.DownloadedUpdateHelper = void 0;
const crypto_1 = require("crypto");
const fs_1 = require("fs");
// @ts-ignore
const isEqual = require("lodash.isequal");
const fs_extra_1 = require("fs-extra");
const path = require("path");
/** @private **/
class DownloadedUpdateHelper {
    constructor(cacheDir) {
        this.cacheDir = cacheDir;
        this._file = null;
        this._packageFile = null;
        this.versionInfo = null;
        this.fileInfo = null;
        this._downloadedFileInfo = null;
    }
    get downloadedFileInfo() {
        return this._downloadedFileInfo;
    }
    get file() {
        return this._file;
    }
    get packageFile() {
        return this._packageFile;
    }
    get cacheDirForPendingUpdate() {
        return path.join(this.cacheDir, "pending");
    }
    async validateDownloadedPath(updateFile, updateInfo, fileInfo, logger) {
        if (this.versionInfo != null && this.file === updateFile && this.fileInfo != null) {
            // update has already been downloaded from this running instance
            // check here only existence, not checksum
            if (isEqual(this.versionInfo, updateInfo) && isEqual(this.fileInfo.info, fileInfo.info) && (await fs_extra_1.pathExists(updateFile))) {
                return updateFile;
            }
            else {
                return null;
            }
        }
        // update has already been downloaded from some previous app launch
        const cachedUpdateFile = await this.getValidCachedUpdateFile(fileInfo, logger);
        if (cachedUpdateFile === null) {
            return null;
        }
        logger.info(`Update has already been downloaded to ${updateFile}).`);
        this._file = cachedUpdateFile;
        return cachedUpdateFile;
    }
    async setDownloadedFile(downloadedFile, packageFile, versionInfo, fileInfo, updateFileName, isSaveCache) {
        this._file = downloadedFile;
        this._packageFile = packageFile;
        this.versionInfo = versionInfo;
        this.fileInfo = fileInfo;
        this._downloadedFileInfo = {
            fileName: updateFileName,
            sha512: fileInfo.info.sha512,
            isAdminRightsRequired: fileInfo.info.isAdminRightsRequired === true,
        };
        if (isSaveCache) {
            await fs_extra_1.outputJson(this.getUpdateInfoFile(), this._downloadedFileInfo);
        }
    }
    async clear() {
        this._file = null;
        this._packageFile = null;
        this.versionInfo = null;
        this.fileInfo = null;
        await this.cleanCacheDirForPendingUpdate();
    }
    async cleanCacheDirForPendingUpdate() {
        try {
            // remove stale data
            await fs_extra_1.emptyDir(this.cacheDirForPendingUpdate);
        }
        catch (ignore) {
            // ignore
        }
    }
    /**
     * Returns "update-info.json" which is created in the update cache directory's "pending" subfolder after the first update is downloaded.  If the update file does not exist then the cache is cleared and recreated.  If the update file exists then its properties are validated.
     * @param fileInfo
     * @param logger
     */
    async getValidCachedUpdateFile(fileInfo, logger) {
        var _a;
        const updateInfoFilePath = this.getUpdateInfoFile();
        const doesUpdateInfoFileExist = await fs_extra_1.pathExists(updateInfoFilePath);
        if (!doesUpdateInfoFileExist) {
            return null;
        }
        let cachedInfo;
        try {
            cachedInfo = await fs_extra_1.readJson(updateInfoFilePath);
        }
        catch (error) {
            let message = `No cached update info available`;
            if (error.code !== "ENOENT") {
                await this.cleanCacheDirForPendingUpdate();
                message += ` (error on read: ${error.message})`;
            }
            logger.info(message);
            return null;
        }
        const isCachedInfoFileNameValid = (_a = (cachedInfo === null || cachedInfo === void 0 ? void 0 : cachedInfo.fileName) !== null) !== null && _a !== void 0 ? _a : false;
        if (!isCachedInfoFileNameValid) {
            logger.warn(`Cached update info is corrupted: no fileName, directory for cached update will be cleaned`);
            await this.cleanCacheDirForPendingUpdate();
            return null;
        }
        if (fileInfo.info.sha512 !== cachedInfo.sha512) {
            logger.info(`Cached update sha512 checksum doesn't match the latest available update. New update must be downloaded. Cached: ${cachedInfo.sha512}, expected: ${fileInfo.info.sha512}. Directory for cached update will be cleaned`);
            await this.cleanCacheDirForPendingUpdate();
            return null;
        }
        const updateFile = path.join(this.cacheDirForPendingUpdate, cachedInfo.fileName);
        if (!(await fs_extra_1.pathExists(updateFile))) {
            logger.info("Cached update file doesn't exist");
            return null;
        }
        const sha512 = await hashFile(updateFile);
        if (fileInfo.info.sha512 !== sha512) {
            logger.warn(`Sha512 checksum doesn't match the latest available update. New update must be downloaded. Cached: ${sha512}, expected: ${fileInfo.info.sha512}`);
            await this.cleanCacheDirForPendingUpdate();
            return null;
        }
        this._downloadedFileInfo = cachedInfo;
        return updateFile;
    }
    getUpdateInfoFile() {
        return path.join(this.cacheDirForPendingUpdate, "update-info.json");
    }
}
exports.DownloadedUpdateHelper = DownloadedUpdateHelper;
function hashFile(file, algorithm = "sha512", encoding = "base64", options) {
    return new Promise((resolve, reject) => {
        const hash = crypto_1.createHash(algorithm);
        hash.on("error", reject).setEncoding(encoding);
        fs_1.createReadStream(file, { ...options, highWaterMark: 1024 * 1024 /* better to use more memory but hash faster */ })
            .on("error", reject)
            .on("end", () => {
            hash.end();
            resolve(hash.read());
        })
            .pipe(hash, { end: false });
    });
}
async function createTempUpdateFile(name, cacheDir, log) {
    // https://github.com/electron-userland/electron-builder/pull/2474#issuecomment-366481912
    let nameCounter = 0;
    let result = path.join(cacheDir, name);
    for (let i = 0; i < 3; i++) {
        try {
            await fs_extra_1.unlink(result);
            return result;
        }
        catch (e) {
            if (e.code === "ENOENT") {
                return result;
            }
            log.warn(`Error on remove temp update file: ${e}`);
            result = path.join(cacheDir, `${nameCounter++}-${name}`);
        }
    }
    return result;
}
exports.createTempUpdateFile = createTempUpdateFile;
//# sourceMappingURL=DownloadedUpdateHelper.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ElectronAppAdapter = void 0;
const path = require("path");
const AppAdapter_1 = require("./AppAdapter");
class ElectronAppAdapter {
    constructor(app = require("electron").app) {
        this.app = app;
    }
    whenReady() {
        return this.app.whenReady();
    }
    get version() {
        return this.app.getVersion();
    }
    get name() {
        return this.app.getName();
    }
    get isPackaged() {
        return this.app.isPackaged === true;
    }
    get appUpdateConfigPath() {
        return this.isPackaged ? path.join(process.resourcesPath, "app-update.yml") : path.join(this.app.getAppPath(), "dev-app-update.yml");
    }
    get userDataPath() {
        return this.app.getPath("userData");
    }
    get baseCachePath() {
        return AppAdapter_1.getAppCacheDir();
    }
    quit() {
        this.app.quit();
    }
    onQuit(handler) {
        this.app.once("quit", (_, exitCode) => handler(exitCode));
    }
}
exports.ElectronAppAdapter = ElectronAppAdapter;
//# sourceMappingURL=ElectronAppAdapter.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MacUpdater = void 0;
const builder_util_runtime_1 = require("builder-util-runtime");
const fs_extra_1 = require("fs-extra");
const fs_1 = require("fs");
const http_1 = require("http");
const AppUpdater_1 = require("./AppUpdater");
const Provider_1 = require("./providers/Provider");
const child_process_1 = require("child_process");
const crypto_1 = require("crypto");
class MacUpdater extends AppUpdater_1.AppUpdater {
    constructor(options, app) {
        super(options, app);
        this.nativeUpdater = require("electron").autoUpdater;
        this.squirrelDownloadedUpdate = false;
        this.nativeUpdater.on("error", it => {
            this._logger.warn(it);
            this.emit("error", it);
        });
        this.nativeUpdater.on("update-downloaded", () => {
            this.squirrelDownloadedUpdate = true;
        });
    }
    debug(message) {
        if (this._logger.debug != null) {
            this._logger.debug(message);
        }
    }
    async doDownloadUpdate(downloadUpdateOptions) {
        let files = downloadUpdateOptions.updateInfoAndProvider.provider.resolveFiles(downloadUpdateOptions.updateInfoAndProvider.info);
        const log = this._logger;
        // detect if we are running inside Rosetta emulation
        const sysctlRosettaInfoKey = "sysctl.proc_translated";
        let isRosetta = false;
        try {
            this.debug("Checking for macOS Rosetta environment");
            const result = child_process_1.execFileSync("sysctl", [sysctlRosettaInfoKey], { encoding: "utf8" });
            isRosetta = result.includes(`${sysctlRosettaInfoKey}: 1`);
            log.info(`Checked for macOS Rosetta environment (isRosetta=${isRosetta})`);
        }
        catch (e) {
            log.warn(`sysctl shell command to check for macOS Rosetta environment failed: ${e}`);
        }
        let isArm64Mac = false;
        try {
            this.debug("Checking for arm64 in uname");
            const result = child_process_1.execFileSync("uname", ["-a"], { encoding: "utf8" });
            const isArm = result.includes("ARM");
            log.info(`Checked 'uname -a': arm64=${isArm}`);
            isArm64Mac = isArm64Mac || isArm;
        }
        catch (e) {
            log.warn(`uname shell command to check for arm64 failed: ${e}`);
        }
        isArm64Mac = isArm64Mac || process.arch === "arm64" || isRosetta;
        // allow arm64 macs to install universal or rosetta2(x64) - https://github.com/electron-userland/electron-builder/pull/5524
        const isArm64 = (file) => { var _a; return file.url.pathname.includes("arm64") || ((_a = file.info.url) === null || _a === void 0 ? void 0 : _a.includes("arm64")); };
        if (isArm64Mac && files.some(isArm64)) {
            files = files.filter(file => isArm64Mac === isArm64(file));
        }
        else {
            files = files.filter(file => !isArm64(file));
        }
        const zipFileInfo = Provider_1.findFile(files, "zip", ["pkg", "dmg"]);
        if (zipFileInfo == null) {
            throw builder_util_runtime_1.newError(`ZIP file not provided: ${builder_util_runtime_1.safeStringifyJson(files)}`, "ERR_UPDATER_ZIP_FILE_NOT_FOUND");
        }
        return this.executeDownload({
            fileExtension: "zip",
            fileInfo: zipFileInfo,
            downloadUpdateOptions,
            task: (destinationFile, downloadOptions) => {
                return this.httpExecutor.download(zipFileInfo.url, destinationFile, downloadOptions);
            },
            done: event => this.updateDownloaded(zipFileInfo, event),
        });
    }
    async updateDownloaded(zipFileInfo, event) {
        var _a, _b;
        const downloadedFile = event.downloadedFile;
        const updateFileSize = (_a = zipFileInfo.info.size) !== null && _a !== void 0 ? _a : (await fs_extra_1.stat(downloadedFile)).size;
        const log = this._logger;
        const logContext = `fileToProxy=${zipFileInfo.url.href}`;
        this.debug(`Creating proxy server for native Squirrel.Mac (${logContext})`);
        (_b = this.server) === null || _b === void 0 ? void 0 : _b.close();
        this.server = http_1.createServer();
        this.debug(`Proxy server for native Squirrel.Mac is created (${logContext})`);
        this.server.on("close", () => {
            log.info(`Proxy server for native Squirrel.Mac is closed (${logContext})`);
        });
        // must be called after server is listening, otherwise address is null
        const getServerUrl = (s) => {
            const address = s.address();
            if (typeof address === "string") {
                return address;
            }
            return `http://127.0.0.1:${address === null || address === void 0 ? void 0 : address.port}`;
        };
        return await new Promise((resolve, reject) => {
            const pass = crypto_1.randomBytes(64).toString("base64").replace(/\//g, "_").replace(/\+/g, "-");
            const authInfo = Buffer.from(`autoupdater:${pass}`, "ascii");
            // insecure random is ok
            const fileUrl = `/${crypto_1.randomBytes(64).toString("hex")}.zip`;
            this.server.on("request", (request, response) => {
                const requestUrl = request.url;
                log.info(`${requestUrl} requested`);
                if (requestUrl === "/") {
                    // check for basic auth header
                    if (!request.headers.authorization || request.headers.authorization.indexOf("Basic ") === -1) {
                        response.statusCode = 401;
                        response.statusMessage = "Invalid Authentication Credentials";
                        response.end();
                        log.warn("No authenthication info");
                        return;
                    }
                    // verify auth credentials
                    const base64Credentials = request.headers.authorization.split(" ")[1];
                    const credentials = Buffer.from(base64Credentials, "base64").toString("ascii");
                    const [username, password] = credentials.split(":");
                    if (username !== "autoupdater" || password !== pass) {
                        response.statusCode = 401;
                        response.statusMessage = "Invalid Authentication Credentials";
                        response.end();
                        log.warn("Invalid authenthication credentials");
                        return;
                    }
                    const data = Buffer.from(`{ "url": "${getServerUrl(this.server)}${fileUrl}" }`);
                    response.writeHead(200, { "Content-Type": "application/json", "Content-Length": data.length });
                    response.end(data);
                    return;
                }
                if (!requestUrl.startsWith(fileUrl)) {
                    log.warn(`${requestUrl} requested, but not supported`);
                    response.writeHead(404);
                    response.end();
                    return;
                }
                log.info(`${fileUrl} requested by Squirrel.Mac, pipe ${downloadedFile}`);
                let errorOccurred = false;
                response.on("finish", () => {
                    if (!errorOccurred) {
                        this.nativeUpdater.removeListener("error", reject);
                        resolve([]);
                    }
                });
                const readStream = fs_1.createReadStream(downloadedFile);
                readStream.on("error", error => {
                    try {
                        response.end();
                    }
                    catch (e) {
                        log.warn(`cannot end response: ${e}`);
                    }
                    errorOccurred = true;
                    this.nativeUpdater.removeListener("error", reject);
                    reject(new Error(`Cannot pipe "${downloadedFile}": ${error}`));
                });
                response.writeHead(200, {
                    "Content-Type": "application/zip",
                    "Content-Length": updateFileSize,
                });
                readStream.pipe(response);
            });
            this.debug(`Proxy server for native Squirrel.Mac is starting to listen (${logContext})`);
            this.server.listen(0, "127.0.0.1", () => {
                this.debug(`Proxy server for native Squirrel.Mac is listening (address=${getServerUrl(this.server)}, ${logContext})`);
                this.nativeUpdater.setFeedURL({
                    url: getServerUrl(this.server),
                    headers: {
                        "Cache-Control": "no-cache",
                        Authorization: `Basic ${authInfo.toString("base64")}`,
                    },
                });
                // The update has been downloaded and is ready to be served to Squirrel
                this.dispatchUpdateDownloaded(event);
                if (this.autoInstallOnAppQuit) {
                    this.nativeUpdater.once("error", reject);
                    // This will trigger fetching and installing the file on Squirrel side
                    this.nativeUpdater.checkForUpdates();
                }
                else {
                    resolve([]);
                }
            });
        });
    }
    quitAndInstall() {
        var _a;
        if (this.squirrelDownloadedUpdate) {
            // update already fetched by Squirrel, it's ready to install
            this.nativeUpdater.quitAndInstall();
            (_a = this.server) === null || _a === void 0 ? void 0 : _a.close();
        }
        else {
            // Quit and install as soon as Squirrel get the update
            this.nativeUpdater.on("update-downloaded", () => {
                var _a;
                this.nativeUpdater.quitAndInstall();
                (_a = this.server) === null || _a === void 0 ? void 0 : _a.close();
            });
            if (!this.autoInstallOnAppQuit) {
                /**
                 * If this was not `true` previously then MacUpdater.doDownloadUpdate()
                 * would not actually initiate the downloading by electron's autoUpdater
                 */
                this.nativeUpdater.checkForUpdates();
            }
        }
    }
}
exports.MacUpdater = MacUpdater;
//# sourceMappingURL=MacUpdater.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.NsisUpdater = void 0;
const builder_util_runtime_1 = require("builder-util-runtime");
const child_process_1 = require("child_process");
const path = require("path");
const BaseUpdater_1 = require("./BaseUpdater");
const FileWithEmbeddedBlockMapDifferentialDownloader_1 = require("./differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader");
const GenericDifferentialDownloader_1 = require("./differentialDownloader/GenericDifferentialDownloader");
const main_1 = require("./main");
const util_1 = require("./util");
const Provider_1 = require("./providers/Provider");
const fs_extra_1 = require("fs-extra");
const windowsExecutableCodeSignatureVerifier_1 = require("./windowsExecutableCodeSignatureVerifier");
const url_1 = require("url");
const zlib_1 = require("zlib");
class NsisUpdater extends BaseUpdater_1.BaseUpdater {
    constructor(options, app) {
        super(options, app);
    }
    /*** @private */
    doDownloadUpdate(downloadUpdateOptions) {
        const provider = downloadUpdateOptions.updateInfoAndProvider.provider;
        const fileInfo = Provider_1.findFile(provider.resolveFiles(downloadUpdateOptions.updateInfoAndProvider.info), "exe");
        return this.executeDownload({
            fileExtension: "exe",
            downloadUpdateOptions,
            fileInfo,
            task: async (destinationFile, downloadOptions, packageFile, removeTempDirIfAny) => {
                const packageInfo = fileInfo.packageInfo;
                const isWebInstaller = packageInfo != null && packageFile != null;
                if (isWebInstaller && downloadUpdateOptions.disableWebInstaller) {
                    throw builder_util_runtime_1.newError(`Unable to download new version ${downloadUpdateOptions.updateInfoAndProvider.info.version}. Web Installers are disabled`, "ERR_UPDATER_WEB_INSTALLER_DISABLED");
                }
                if (!isWebInstaller && !downloadUpdateOptions.disableWebInstaller) {
                    this._logger.warn("disableWebInstaller is set to false, you should set it to true if you do not plan on using a web installer. This will default to true in a future version.");
                }
                if (isWebInstaller || (await this.differentialDownloadInstaller(fileInfo, downloadUpdateOptions, destinationFile, provider))) {
                    await this.httpExecutor.download(fileInfo.url, destinationFile, downloadOptions);
                }
                const signatureVerificationStatus = await this.verifySignature(destinationFile);
                if (signatureVerificationStatus != null) {
                    await removeTempDirIfAny();
                    // noinspection ThrowInsideFinallyBlockJS
                    throw builder_util_runtime_1.newError(`New version ${downloadUpdateOptions.updateInfoAndProvider.info.version} is not signed by the application owner: ${signatureVerificationStatus}`, "ERR_UPDATER_INVALID_SIGNATURE");
                }
                if (isWebInstaller) {
                    if (await this.differentialDownloadWebPackage(downloadUpdateOptions, packageInfo, packageFile, provider)) {
                        try {
                            await this.httpExecutor.download(new url_1.URL(packageInfo.path), packageFile, {
                                headers: downloadUpdateOptions.requestHeaders,
                                cancellationToken: downloadUpdateOptions.cancellationToken,
                                sha512: packageInfo.sha512,
                            });
                        }
                        catch (e) {
                            try {
                                await fs_extra_1.unlink(packageFile);
                            }
                            catch (ignored) {
                                // ignore
                            }
                            throw e;
                        }
                    }
                }
            },
        });
    }
    // $certificateInfo = (Get-AuthenticodeSignature 'xxx\yyy.exe'
    // | where {$_.Status.Equals([System.Management.Automation.SignatureStatus]::Valid) -and $_.SignerCertificate.Subject.Contains("CN=siemens.com")})
    // | Out-String ; if ($certificateInfo) { exit 0 } else { exit 1 }
    async verifySignature(tempUpdateFile) {
        let publisherName;
        try {
            publisherName = (await this.configOnDisk.value).publisherName;
            if (publisherName == null) {
                return null;
            }
        }
        catch (e) {
            if (e.code === "ENOENT") {
                // no app-update.yml
                return null;
            }
            throw e;
        }
        return await windowsExecutableCodeSignatureVerifier_1.verifySignature(Array.isArray(publisherName) ? publisherName : [publisherName], tempUpdateFile, this._logger);
    }
    doInstall(options) {
        const args = ["--updated"];
        if (options.isSilent) {
            args.push("/S");
        }
        if (options.isForceRunAfter) {
            args.push("--force-run");
        }
        if (this.installDirectory) {
            // maybe check if folder exists
            args.push(`/D=${this.installDirectory}`);
        }
        const packagePath = this.downloadedUpdateHelper == null ? null : this.downloadedUpdateHelper.packageFile;
        if (packagePath != null) {
            // only = form is supported
            args.push(`--package-file=${packagePath}`);
        }
        const callUsingElevation = () => {
            _spawn(path.join(process.resourcesPath, "elevate.exe"), [options.installerPath].concat(args)).catch(e => this.dispatchError(e));
        };
        if (options.isAdminRightsRequired) {
            this._logger.info("isAdminRightsRequired is set to true, run installer using elevate.exe");
            callUsingElevation();
            return true;
        }
        _spawn(options.installerPath, args).catch((e) => {
            // https://github.com/electron-userland/electron-builder/issues/1129
            // Node 8 sends errors: https://nodejs.org/dist/latest-v8.x/docs/api/errors.html#errors_common_system_errors
            const errorCode = e.code;
            this._logger.info(`Cannot run installer: error code: ${errorCode}, error message: "${e.message}", will be executed again using elevate if EACCES"`);
            if (errorCode === "UNKNOWN" || errorCode === "EACCES") {
                callUsingElevation();
            }
            else {
                this.dispatchError(e);
            }
        });
        return true;
    }
    async differentialDownloadInstaller(fileInfo, downloadUpdateOptions, installerPath, provider) {
        try {
            if (this._testOnlyOptions != null && !this._testOnlyOptions.isUseDifferentialDownload) {
                return true;
            }
            const blockmapFileUrls = util_1.blockmapFiles(fileInfo.url, this.app.version, downloadUpdateOptions.updateInfoAndProvider.info.version);
            this._logger.info(`Download block maps (old: "${blockmapFileUrls[0]}", new: ${blockmapFileUrls[1]})`);
            const downloadBlockMap = async (url) => {
                const data = await this.httpExecutor.downloadToBuffer(url, {
                    headers: downloadUpdateOptions.requestHeaders,
                    cancellationToken: downloadUpdateOptions.cancellationToken,
                });
                if (data == null || data.length === 0) {
                    throw new Error(`Blockmap "${url.href}" is empty`);
                }
                try {
                    return JSON.parse(zlib_1.gunzipSync(data).toString());
                }
                catch (e) {
                    throw new Error(`Cannot parse blockmap "${url.href}", error: ${e}`);
                }
            };
            const downloadOptions = {
                newUrl: fileInfo.url,
                oldFile: path.join(this.downloadedUpdateHelper.cacheDir, builder_util_runtime_1.CURRENT_APP_INSTALLER_FILE_NAME),
                logger: this._logger,
                newFile: installerPath,
                isUseMultipleRangeRequest: provider.isUseMultipleRangeRequest,
                requestHeaders: downloadUpdateOptions.requestHeaders,
                cancellationToken: downloadUpdateOptions.cancellationToken,
            };
            if (this.listenerCount(main_1.DOWNLOAD_PROGRESS) > 0) {
                downloadOptions.onProgress = it => this.emit(main_1.DOWNLOAD_PROGRESS, it);
            }
            const blockMapDataList = await Promise.all(blockmapFileUrls.map(u => downloadBlockMap(u)));
            await new GenericDifferentialDownloader_1.GenericDifferentialDownloader(fileInfo.info, this.httpExecutor, downloadOptions).download(blockMapDataList[0], blockMapDataList[1]);
            return false;
        }
        catch (e) {
            this._logger.error(`Cannot download differentially, fallback to full download: ${e.stack || e}`);
            if (this._testOnlyOptions != null) {
                // test mode
                throw e;
            }
            return true;
        }
    }
    async differentialDownloadWebPackage(downloadUpdateOptions, packageInfo, packagePath, provider) {
        if (packageInfo.blockMapSize == null) {
            return true;
        }
        try {
            const downloadOptions = {
                newUrl: new url_1.URL(packageInfo.path),
                oldFile: path.join(this.downloadedUpdateHelper.cacheDir, builder_util_runtime_1.CURRENT_APP_PACKAGE_FILE_NAME),
                logger: this._logger,
                newFile: packagePath,
                requestHeaders: this.requestHeaders,
                isUseMultipleRangeRequest: provider.isUseMultipleRangeRequest,
                cancellationToken: downloadUpdateOptions.cancellationToken,
            };
            if (this.listenerCount(main_1.DOWNLOAD_PROGRESS) > 0) {
                downloadOptions.onProgress = it => this.emit(main_1.DOWNLOAD_PROGRESS, it);
            }
            await new FileWithEmbeddedBlockMapDifferentialDownloader_1.FileWithEmbeddedBlockMapDifferentialDownloader(packageInfo, this.httpExecutor, downloadOptions).download();
        }
        catch (e) {
            this._logger.error(`Cannot download differentially, fallback to full download: ${e.stack || e}`);
            // during test (developer machine mac or linux) we must throw error
            return process.platform === "win32";
        }
        return false;
    }
}
exports.NsisUpdater = NsisUpdater;
/**
 * This handles both node 8 and node 10 way of emitting error when spawning a process
 *   - node 8: Throws the error
 *   - node 10: Emit the error(Need to listen with on)
 */
async function _spawn(exe, args) {
    return new Promise((resolve, reject) => {
        try {
            const process = child_process_1.spawn(exe, args, {
                detached: true,
                stdio: "ignore",
            });
            process.on("error", error => {
                reject(error);
            });
            process.unref();
            if (process.pid !== undefined) {
                resolve(true);
            }
        }
        catch (error) {
            reject(error);
        }
    });
}
//# sourceMappingURL=NsisUpdater.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ElectronHttpExecutor = exports.getNetSession = exports.NET_SESSION_NAME = void 0;
const builder_util_runtime_1 = require("builder-util-runtime");
exports.NET_SESSION_NAME = "electron-updater";
function getNetSession() {
    return require("electron").session.fromPartition(exports.NET_SESSION_NAME, {
        cache: false,
    });
}
exports.getNetSession = getNetSession;
class ElectronHttpExecutor extends builder_util_runtime_1.HttpExecutor {
    constructor(proxyLoginCallback) {
        super();
        this.proxyLoginCallback = proxyLoginCallback;
        this.cachedSession = null;
    }
    async download(url, destination, options) {
        return await options.cancellationToken.createPromise((resolve, reject, onCancel) => {
            const requestOptions = {
                headers: options.headers || undefined,
                redirect: "manual",
            };
            builder_util_runtime_1.configureRequestUrl(url, requestOptions);
            builder_util_runtime_1.configureRequestOptions(requestOptions);
            this.doDownload(requestOptions, {
                destination,
                options,
                onCancel,
                callback: error => {
                    if (error == null) {
                        resolve(destination);
                    }
                    else {
                        reject(error);
                    }
                },
                responseHandler: null,
            }, 0);
        });
    }
    createRequest(options, callback) {
        // fix (node 7+) for making electron updater work when using AWS private buckets, check if headers contain Host property
        if (options.headers && options.headers.Host) {
            // set host value from headers.Host
            options.host = options.headers.Host;
            // remove header property 'Host', if not removed causes net::ERR_INVALID_ARGUMENT exception
            delete options.headers.Host;
        }
        // differential downloader can call this method very often, so, better to cache session
        if (this.cachedSession == null) {
            this.cachedSession = getNetSession();
        }
        const request = require("electron").net.request({
            ...options,
            session: this.cachedSession,
        });
        request.on("response", callback);
        if (this.proxyLoginCallback != null) {
            request.on("login", this.proxyLoginCallback);
        }
        return request;
    }
    addRedirectHandlers(request, options, reject, redirectCount, handler) {
        request.on("redirect", (statusCode, method, redirectUrl) => {
            // no way to modify request options, abort old and make a new one
            // https://github.com/electron/electron/issues/11505
            request.abort();
            if (redirectCount > this.maxRedirects) {
                reject(this.createMaxRedirectError());
            }
            else {
                handler(builder_util_runtime_1.HttpExecutor.prepareRedirectUrlOptions(redirectUrl, options));
            }
        });
    }
}
exports.ElectronHttpExecutor = ElectronHttpExecutor;
//# sourceMappingURL=electronHttpExecutor.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.UpdaterSignal = exports.UPDATE_DOWNLOADED = exports.DOWNLOAD_PROGRESS = exports.NsisUpdater = exports.MacUpdater = exports.AppImageUpdater = exports.Provider = exports.CancellationToken = exports.NoOpLogger = exports.AppUpdater = void 0;
const builder_util_runtime_1 = require("builder-util-runtime");
Object.defineProperty(exports, "CancellationToken", { enumerable: true, get: function () { return builder_util_runtime_1.CancellationToken; } });
var AppUpdater_1 = require("./AppUpdater");
Object.defineProperty(exports, "AppUpdater", { enumerable: true, get: function () { return AppUpdater_1.AppUpdater; } });
Object.defineProperty(exports, "NoOpLogger", { enumerable: true, get: function () { return AppUpdater_1.NoOpLogger; } });
var Provider_1 = require("./providers/Provider");
Object.defineProperty(exports, "Provider", { enumerable: true, get: function () { return Provider_1.Provider; } });
var AppImageUpdater_1 = require("./AppImageUpdater");
Object.defineProperty(exports, "AppImageUpdater", { enumerable: true, get: function () { return AppImageUpdater_1.AppImageUpdater; } });
var MacUpdater_1 = require("./MacUpdater");
Object.defineProperty(exports, "MacUpdater", { enumerable: true, get: function () { return MacUpdater_1.MacUpdater; } });
var NsisUpdater_1 = require("./NsisUpdater");
Object.defineProperty(exports, "NsisUpdater", { enumerable: true, get: function () { return NsisUpdater_1.NsisUpdater; } });
// autoUpdater to mimic electron bundled autoUpdater
let _autoUpdater;
function doLoadAutoUpdater() {
    // tslint:disable:prefer-conditional-expression
    if (process.platform === "win32") {
        _autoUpdater = new (require("./NsisUpdater").NsisUpdater)();
    }
    else if (process.platform === "darwin") {
        _autoUpdater = new (require("./MacUpdater").MacUpdater)();
    }
    else {
        _autoUpdater = new (require("./AppImageUpdater").AppImageUpdater)();
    }
    return _autoUpdater;
}
Object.defineProperty(exports, "autoUpdater", {
    enumerable: true,
    get: () => {
        return _autoUpdater || doLoadAutoUpdater();
    },
});
exports.DOWNLOAD_PROGRESS = "download-progress";
exports.UPDATE_DOWNLOADED = "update-downloaded";
class UpdaterSignal {
    constructor(emitter) {
        this.emitter = emitter;
    }
    /**
     * Emitted when an authenticating proxy is [asking for user credentials](https://github.com/electron/electron/blob/master/docs/api/client-request.md#event-login).
     */
    login(handler) {
        addHandler(this.emitter, "login", handler);
    }
    progress(handler) {
        addHandler(this.emitter, exports.DOWNLOAD_PROGRESS, handler);
    }
    updateDownloaded(handler) {
        addHandler(this.emitter, exports.UPDATE_DOWNLOADED, handler);
    }
    updateCancelled(handler) {
        addHandler(this.emitter, "update-cancelled", handler);
    }
}
exports.UpdaterSignal = UpdaterSignal;
const isLogEvent = false;
function addHandler(emitter, event, handler) {
    if (isLogEvent) {
        emitter.on(event, (...args) => {
            console.log("%s %s", event, args);
            handler(...args);
        });
    }
    else {
        emitter.on(event, handler);
    }
}
//# sourceMappingURL=main.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createClient = exports.isUrlProbablySupportMultiRangeRequests = void 0;
const builder_util_runtime_1 = require("builder-util-runtime");
const BitbucketProvider_1 = require("./providers/BitbucketProvider");
const GenericProvider_1 = require("./providers/GenericProvider");
const GitHubProvider_1 = require("./providers/GitHubProvider");
const KeygenProvider_1 = require("./providers/KeygenProvider");
const PrivateGitHubProvider_1 = require("./providers/PrivateGitHubProvider");
function isUrlProbablySupportMultiRangeRequests(url) {
    return !url.includes("s3.amazonaws.com");
}
exports.isUrlProbablySupportMultiRangeRequests = isUrlProbablySupportMultiRangeRequests;
function createClient(data, updater, runtimeOptions) {
    // noinspection SuspiciousTypeOfGuard
    if (typeof data === "string") {
        throw builder_util_runtime_1.newError("Please pass PublishConfiguration object", "ERR_UPDATER_INVALID_PROVIDER_CONFIGURATION");
    }
    const provider = data.provider;
    switch (provider) {
        case "github": {
            const githubOptions = data;
            const token = (githubOptions.private ? process.env["GH_TOKEN"] || process.env["GITHUB_TOKEN"] : null) || githubOptions.token;
            if (token == null) {
                return new GitHubProvider_1.GitHubProvider(githubOptions, updater, runtimeOptions);
            }
            else {
                return new PrivateGitHubProvider_1.PrivateGitHubProvider(githubOptions, updater, token, runtimeOptions);
            }
        }
        case "bitbucket":
            return new BitbucketProvider_1.BitbucketProvider(data, updater, runtimeOptions);
        case "keygen":
            return new KeygenProvider_1.KeygenProvider(data, updater, runtimeOptions);
        case "s3":
        case "spaces":
            return new GenericProvider_1.GenericProvider({
                provider: "generic",
                url: builder_util_runtime_1.getS3LikeProviderBaseUrl(data),
                channel: data.channel || null,
            }, updater, {
                ...runtimeOptions,
                // https://github.com/minio/minio/issues/5285#issuecomment-350428955
                isUseMultipleRangeRequest: false,
            });
        case "generic": {
            const options = data;
            return new GenericProvider_1.GenericProvider(options, updater, {
                ...runtimeOptions,
                isUseMultipleRangeRequest: options.useMultipleRangeRequest !== false && isUrlProbablySupportMultiRangeRequests(options.url),
            });
        }
        case "custom": {
            const options = data;
            const constructor = options.updateProvider;
            if (!constructor) {
                throw builder_util_runtime_1.newError("Custom provider not specified", "ERR_UPDATER_INVALID_PROVIDER_CONFIGURATION");
            }
            return new constructor(options, updater, runtimeOptions);
        }
        default:
            throw builder_util_runtime_1.newError(`Unsupported provider: ${provider}`, "ERR_UPDATER_UNSUPPORTED_PROVIDER");
    }
}
exports.createClient = createClient;
//# sourceMappingURL=providerFactory.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.blockmapFiles = exports.getChannelFilename = exports.newUrlFromBase = exports.newBaseUrl = void 0;
// if baseUrl path doesn't ends with /, this path will be not prepended to passed pathname for new URL(input, base)
const url_1 = require("url");
// @ts-ignore
const escapeRegExp = require("lodash.escaperegexp");
/** @internal */
function newBaseUrl(url) {
    const result = new url_1.URL(url);
    if (!result.pathname.endsWith("/")) {
        result.pathname += "/";
    }
    return result;
}
exports.newBaseUrl = newBaseUrl;
// addRandomQueryToAvoidCaching is false by default because in most cases URL already contains version number,
// so, it makes sense only for Generic Provider for channel files
function newUrlFromBase(pathname, baseUrl, addRandomQueryToAvoidCaching = false) {
    const result = new url_1.URL(pathname, baseUrl);
    // search is not propagated (search is an empty string if not specified)
    const search = baseUrl.search;
    if (search != null && search.length !== 0) {
        result.search = search;
    }
    else if (addRandomQueryToAvoidCaching) {
        result.search = `noCache=${Date.now().toString(32)}`;
    }
    return result;
}
exports.newUrlFromBase = newUrlFromBase;
function getChannelFilename(channel) {
    return `${channel}.yml`;
}
exports.getChannelFilename = getChannelFilename;
function blockmapFiles(baseUrl, oldVersion, newVersion) {
    const newBlockMapUrl = newUrlFromBase(`${baseUrl.pathname}.blockmap`, baseUrl);
    const oldBlockMapUrl = newUrlFromBase(`${baseUrl.pathname.replace(new RegExp(escapeRegExp(newVersion), "g"), oldVersion)}.blockmap`, baseUrl);
    return [oldBlockMapUrl, newBlockMapUrl];
}
exports.blockmapFiles = blockmapFiles;
//# sourceMappingURL=util.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.verifySignature = void 0;
const builder_util_runtime_1 = require("builder-util-runtime");
const child_process_1 = require("child_process");
const os = require("os");
// $certificateInfo = (Get-AuthenticodeSignature 'xxx\yyy.exe'
// | where {$_.Status.Equals([System.Management.Automation.SignatureStatus]::Valid) -and $_.SignerCertificate.Subject.Contains("CN=siemens.com")})
// | Out-String ; if ($certificateInfo) { exit 0 } else { exit 1 }
function verifySignature(publisherNames, unescapedTempUpdateFile, logger) {
    return new Promise(resolve => {
        // Escape quotes and backticks in filenames to prevent user from breaking the
        // arguments and perform a remote command injection.
        //
        // Consider example powershell command:
        // ```powershell
        // Get-AuthenticodeSignature 'C:\\path\\my-bad-';calc;'filename.exe'
        // ```
        // The above would work expected and find the file name, however, it will also execute `;calc;`
        // command and start the calculator app.
        //
        // From Powershell quoting rules:
        // https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_quoting_rules?view=powershell-7
        // * Double quotes `"` are treated literally within single-quoted strings;
        // * Single quotes can be escaped by doubling them: 'don''t' -> don't;
        //
        // Also note that at this point the file has already been written to the disk, thus we are
        // guaranteed that the path will not contain any illegal characters like <>:"/\|?*
        // https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file
        const tempUpdateFile = unescapedTempUpdateFile.replace(/'/g, "''");
        // https://github.com/electron-userland/electron-builder/issues/2421
        // https://github.com/electron-userland/electron-builder/issues/2535
        child_process_1.execFile("powershell.exe", [
            "-NoProfile",
            "-NonInteractive",
            "-InputFormat",
            "None",
            "-Command",
            `Get-AuthenticodeSignature -LiteralPath '${tempUpdateFile}' | ConvertTo-Json -Compress | ForEach-Object { [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($_)) }`,
        ], {
            timeout: 20 * 1000,
        }, (error, stdout, stderr) => {
            try {
                if (error != null || stderr) {
                    handleError(logger, error, stderr);
                    resolve(null);
                    return;
                }
                const data = parseOut(Buffer.from(stdout, "base64").toString("utf-8"));
                if (data.Status === 0) {
                    const subject = builder_util_runtime_1.parseDn(data.SignerCertificate.Subject);
                    let match = false;
                    for (const name of publisherNames) {
                        const dn = builder_util_runtime_1.parseDn(name);
                        if (dn.size) {
                            // if we have a full DN, compare all values
                            const allKeys = Array.from(dn.keys());
                            match = allKeys.every(key => {
                                return dn.get(key) === subject.get(key);
                            });
                        }
                        else if (name === subject.get("CN")) {
                            logger.warn(`Signature validated using only CN ${name}. Please add your full Distinguished Name (DN) to publisherNames configuration`);
                            match = true;
                        }
                        if (match) {
                            resolve(null);
                            return;
                        }
                    }
                }
                const result = `publisherNames: ${publisherNames.join(" | ")}, raw info: ` + JSON.stringify(data, (name, value) => (name === "RawData" ? undefined : value), 2);
                logger.warn(`Sign verification failed, installer signed with incorrect certificate: ${result}`);
                resolve(result);
            }
            catch (e) {
                handleError(logger, e, null);
                resolve(null);
                return;
            }
        });
    });
}
exports.verifySignature = verifySignature;
function parseOut(out) {
    const data = JSON.parse(out);
    delete data.PrivateKey;
    delete data.IsOSBinary;
    delete data.SignatureType;
    const signerCertificate = data.SignerCertificate;
    if (signerCertificate != null) {
        delete signerCertificate.Archived;
        delete signerCertificate.Extensions;
        delete signerCertificate.Handle;
        delete signerCertificate.HasPrivateKey;
        // duplicates data.SignerCertificate (contains RawData)
        delete signerCertificate.SubjectName;
    }
    delete data.Path;
    return data;
}
function handleError(logger, error, stderr) {
    if (isOldWin6()) {
        logger.warn(`Cannot execute Get-AuthenticodeSignature: ${error || stderr}. Ignoring signature validation due to unsupported powershell version. Please upgrade to powershell 3 or higher.`);
        return;
    }
    try {
        child_process_1.execFileSync("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", "ConvertTo-Json test"], { timeout: 10 * 1000 });
    }
    catch (testError) {
        logger.warn(`Cannot execute ConvertTo-Json: ${testError.message}. Ignoring signature validation due to unsupported powershell version. Please upgrade to powershell 3 or higher.`);
        return;
    }
    if (error != null) {
        throw error;
    }
    if (stderr) {
        throw new Error(`Cannot execute Get-AuthenticodeSignature, stderr: ${stderr}. Failing signature validation due to unknown stderr.`);
    }
}
function isOldWin6() {
    const winVersion = os.release();
    return winVersion.startsWith("6.") && !winVersion.startsWith("6.3");
}
//# sourceMappingURL=windowsExecutableCodeSignatureVerifier.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BitbucketProvider = void 0;
const builder_util_runtime_1 = require("builder-util-runtime");
const util_1 = require("../util");
const Provider_1 = require("./Provider");
class BitbucketProvider extends Provider_1.Provider {
    constructor(configuration, updater, runtimeOptions) {
        super({
            ...runtimeOptions,
            isUseMultipleRangeRequest: false,
        });
        this.configuration = configuration;
        this.updater = updater;
        const { owner, slug } = configuration;
        this.baseUrl = util_1.newBaseUrl(`https://api.bitbucket.org/2.0/repositories/${owner}/${slug}/downloads`);
    }
    get channel() {
        return this.updater.channel || this.configuration.channel || "latest";
    }
    async getLatestVersion() {
        const cancellationToken = new builder_util_runtime_1.CancellationToken();
        const channelFile = util_1.getChannelFilename(this.getCustomChannelName(this.channel));
        const channelUrl = util_1.newUrlFromBase(channelFile, this.baseUrl, this.updater.isAddNoCacheQuery);
        try {
            const updateInfo = await this.httpRequest(channelUrl, undefined, cancellationToken);
            return Provider_1.parseUpdateInfo(updateInfo, channelFile, channelUrl);
        }
        catch (e) {
            throw builder_util_runtime_1.newError(`Unable to find latest version on ${this.toString()}, please ensure release exists: ${e.stack || e.message}`, "ERR_UPDATER_LATEST_VERSION_NOT_FOUND");
        }
    }
    resolveFiles(updateInfo) {
        return Provider_1.resolveFiles(updateInfo, this.baseUrl);
    }
    toString() {
        const { owner, slug } = this.configuration;
        return `Bitbucket (owner: ${owner}, slug: ${slug}, channel: ${this.channel})`;
    }
}
exports.BitbucketProvider = BitbucketProvider;
//# sourceMappingURL=BitbucketProvider.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.GenericProvider = void 0;
const builder_util_runtime_1 = require("builder-util-runtime");
const util_1 = require("../util");
const Provider_1 = require("./Provider");
class GenericProvider extends Provider_1.Provider {
    constructor(configuration, updater, runtimeOptions) {
        super(runtimeOptions);
        this.configuration = configuration;
        this.updater = updater;
        this.baseUrl = util_1.newBaseUrl(this.configuration.url);
    }
    get channel() {
        const result = this.updater.channel || this.configuration.channel;
        return result == null ? this.getDefaultChannelName() : this.getCustomChannelName(result);
    }
    async getLatestVersion() {
        const channelFile = util_1.getChannelFilename(this.channel);
        const channelUrl = util_1.newUrlFromBase(channelFile, this.baseUrl, this.updater.isAddNoCacheQuery);
        for (let attemptNumber = 0;; attemptNumber++) {
            try {
                return Provider_1.parseUpdateInfo(await this.httpRequest(channelUrl), channelFile, channelUrl);
            }
            catch (e) {
                if (e instanceof builder_util_runtime_1.HttpError && e.statusCode === 404) {
                    throw builder_util_runtime_1.newError(`Cannot find channel "${channelFile}" update info: ${e.stack || e.message}`, "ERR_UPDATER_CHANNEL_FILE_NOT_FOUND");
                }
                else if (e.code === "ECONNREFUSED") {
                    if (attemptNumber < 3) {
                        await new Promise((resolve, reject) => {
                            try {
                                setTimeout(resolve, 1000 * attemptNumber);
                            }
                            catch (e) {
                                reject(e);
                            }
                        });
                        continue;
                    }
                }
                throw e;
            }
        }
    }
    resolveFiles(updateInfo) {
        return Provider_1.resolveFiles(updateInfo, this.baseUrl);
    }
}
exports.GenericProvider = GenericProvider;
//# sourceMappingURL=GenericProvider.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.computeReleaseNotes = exports.GitHubProvider = exports.BaseGitHubProvider = void 0;
const builder_util_runtime_1 = require("builder-util-runtime");
const semver = require("semver");
const url_1 = require("url");
const util_1 = require("../util");
const Provider_1 = require("./Provider");
const hrefRegExp = /\/tag\/([^/]+)$/;
class BaseGitHubProvider extends Provider_1.Provider {
    constructor(options, defaultHost, runtimeOptions) {
        super({
            ...runtimeOptions,
            /* because GitHib uses S3 */
            isUseMultipleRangeRequest: false,
        });
        this.options = options;
        this.baseUrl = util_1.newBaseUrl(builder_util_runtime_1.githubUrl(options, defaultHost));
        const apiHost = defaultHost === "github.com" ? "api.github.com" : defaultHost;
        this.baseApiUrl = util_1.newBaseUrl(builder_util_runtime_1.githubUrl(options, apiHost));
    }
    computeGithubBasePath(result) {
        // https://github.com/electron-userland/electron-builder/issues/1903#issuecomment-320881211
        const host = this.options.host;
        return host && !["github.com", "api.github.com"].includes(host) ? `/api/v3${result}` : result;
    }
}
exports.BaseGitHubProvider = BaseGitHubProvider;
class GitHubProvider extends BaseGitHubProvider {
    constructor(options, updater, runtimeOptions) {
        super(options, "github.com", runtimeOptions);
        this.options = options;
        this.updater = updater;
    }
    async getLatestVersion() {
        var _a, _b, _c, _d;
        const cancellationToken = new builder_util_runtime_1.CancellationToken();
        const feedXml = (await this.httpRequest(util_1.newUrlFromBase(`${this.basePath}.atom`, this.baseUrl), {
            accept: "application/xml, application/atom+xml, text/xml, */*",
        }, cancellationToken));
        const feed = builder_util_runtime_1.parseXml(feedXml);
        // noinspection TypeScriptValidateJSTypes
        let latestRelease = feed.element("entry", false, `No published versions on GitHub`);
        let tag = null;
        try {
            if (this.updater.allowPrerelease) {
                const currentChannel = ((_a = this.updater) === null || _a === void 0 ? void 0 : _a.channel) || ((_b = semver.prerelease(this.updater.currentVersion)) === null || _b === void 0 ? void 0 : _b[0]) || null;
                if (currentChannel === null) {
                    // noinspection TypeScriptValidateJSTypes
                    tag = hrefRegExp.exec(latestRelease.element("link").attribute("href"))[1];
                }
                else {
                    for (const element of feed.getElements("entry")) {
                        // noinspection TypeScriptValidateJSTypes
                        const hrefElement = hrefRegExp.exec(element.element("link").attribute("href"));
                        // If this is null then something is wrong and skip this release
                        if (hrefElement === null)
                            continue;
                        // This Release's Tag
                        const hrefTag = hrefElement[1];
                        //Get Channel from this release's tag
                        const hrefChannel = ((_c = semver.prerelease(hrefTag)) === null || _c === void 0 ? void 0 : _c[0]) || null;
                        const shouldFetchVersion = !currentChannel || ["alpha", "beta"].includes(currentChannel);
                        const isCustomChannel = !["alpha", "beta"].includes(String(hrefChannel));
                        // Allow moving from alpha to beta but not down
                        const channelMismatch = currentChannel === "beta" && hrefChannel === "alpha";
                        if (shouldFetchVersion && !isCustomChannel && !channelMismatch) {
                            tag = hrefTag;
                            break;
                        }
                        const isNextPreRelease = hrefChannel && hrefChannel === currentChannel;
                        if (isNextPreRelease) {
                            tag = hrefTag;
                            break;
                        }
                    }
                }
            }
            else {
                tag = await this.getLatestTagName(cancellationToken);
                for (const element of feed.getElements("entry")) {
                    // noinspection TypeScriptValidateJSTypes
                    if (hrefRegExp.exec(element.element("link").attribute("href"))[1] === tag) {
                        latestRelease = element;
                        break;
                    }
                }
            }
        }
        catch (e) {
            throw builder_util_runtime_1.newError(`Cannot parse releases feed: ${e.stack || e.message},\nXML:\n${feedXml}`, "ERR_UPDATER_INVALID_RELEASE_FEED");
        }
        if (tag == null) {
            throw builder_util_runtime_1.newError(`No published versions on GitHub`, "ERR_UPDATER_NO_PUBLISHED_VERSIONS");
        }
        let rawData;
        let channelFile = "";
        let channelFileUrl = "";
        const fetchData = async (channelName) => {
            channelFile = util_1.getChannelFilename(channelName);
            channelFileUrl = util_1.newUrlFromBase(this.getBaseDownloadPath(String(tag), channelFile), this.baseUrl);
            const requestOptions = this.createRequestOptions(channelFileUrl);
            try {
                return (await this.executor.request(requestOptions, cancellationToken));
            }
            catch (e) {
                if (e instanceof builder_util_runtime_1.HttpError && e.statusCode === 404) {
                    throw builder_util_runtime_1.newError(`Cannot find ${channelFile} in the latest release artifacts (${channelFileUrl}): ${e.stack || e.message}`, "ERR_UPDATER_CHANNEL_FILE_NOT_FOUND");
                }
                throw e;
            }
        };
        try {
            const channel = this.updater.allowPrerelease ? this.getCustomChannelName(String(((_d = semver.prerelease(tag)) === null || _d === void 0 ? void 0 : _d[0]) || "latest")) : this.getDefaultChannelName();
            rawData = await fetchData(channel);
        }
        catch (e) {
            if (this.updater.allowPrerelease) {
                // Allow fallback to `latest.yml`
                rawData = await fetchData(this.getDefaultChannelName());
            }
            else {
                throw e;
            }
        }
        const result = Provider_1.parseUpdateInfo(rawData, channelFile, channelFileUrl);
        if (result.releaseName == null) {
            result.releaseName = latestRelease.elementValueOrEmpty("title");
        }
        if (result.releaseNotes == null) {
            result.releaseNotes = computeReleaseNotes(this.updater.currentVersion, this.updater.fullChangelog, feed, latestRelease);
        }
        return {
            tag: tag,
            ...result,
        };
    }
    async getLatestTagName(cancellationToken) {
        const options = this.options;
        // do not use API for GitHub to avoid limit, only for custom host or GitHub Enterprise
        const url = options.host == null || options.host === "github.com"
            ? util_1.newUrlFromBase(`${this.basePath}/latest`, this.baseUrl)
            : new url_1.URL(`${this.computeGithubBasePath(`/repos/${options.owner}/${options.repo}/releases`)}/latest`, this.baseApiUrl);
        try {
            const rawData = await this.httpRequest(url, { Accept: "application/json" }, cancellationToken);
            if (rawData == null) {
                return null;
            }
            const releaseInfo = JSON.parse(rawData);
            return releaseInfo.tag_name;
        }
        catch (e) {
            throw builder_util_runtime_1.newError(`Unable to find latest version on GitHub (${url}), please ensure a production release exists: ${e.stack || e.message}`, "ERR_UPDATER_LATEST_VERSION_NOT_FOUND");
        }
    }
    get basePath() {
        return `/${this.options.owner}/${this.options.repo}/releases`;
    }
    resolveFiles(updateInfo) {
        // still replace space to - due to backward compatibility
        return Provider_1.resolveFiles(updateInfo, this.baseUrl, p => this.getBaseDownloadPath(updateInfo.tag, p.replace(/ /g, "-")));
    }
    getBaseDownloadPath(tag, fileName) {
        return `${this.basePath}/download/${tag}/${fileName}`;
    }
}
exports.GitHubProvider = GitHubProvider;
function getNoteValue(parent) {
    const result = parent.elementValueOrEmpty("content");
    // GitHub reports empty notes as <content>No content.</content>
    return result === "No content." ? "" : result;
}
function computeReleaseNotes(currentVersion, isFullChangelog, feed, latestRelease) {
    if (!isFullChangelog) {
        return getNoteValue(latestRelease);
    }
    const releaseNotes = [];
    for (const release of feed.getElements("entry")) {
        // noinspection TypeScriptValidateJSTypes
        const versionRelease = /\/tag\/v?([^/]+)$/.exec(release.element("link").attribute("href"))[1];
        if (semver.lt(currentVersion, versionRelease)) {
            releaseNotes.push({
                version: versionRelease,
                note: getNoteValue(release),
            });
        }
    }
    return releaseNotes.sort((a, b) => semver.rcompare(a.version, b.version));
}
exports.computeReleaseNotes = computeReleaseNotes;
//# sourceMappingURL=GitHubProvider.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.KeygenProvider = void 0;
const builder_util_runtime_1 = require("builder-util-runtime");
const util_1 = require("../util");
const Provider_1 = require("./Provider");
class KeygenProvider extends Provider_1.Provider {
    constructor(configuration, updater, runtimeOptions) {
        super({
            ...runtimeOptions,
            isUseMultipleRangeRequest: false,
        });
        this.configuration = configuration;
        this.updater = updater;
        this.baseUrl = util_1.newBaseUrl(`https://api.keygen.sh/v1/accounts/${this.configuration.account}/artifacts?product=${this.configuration.product}`);
    }
    get channel() {
        return this.updater.channel || this.configuration.channel || "stable";
    }
    async getLatestVersion() {
        const cancellationToken = new builder_util_runtime_1.CancellationToken();
        const channelFile = util_1.getChannelFilename(this.getCustomChannelName(this.channel));
        const channelUrl = util_1.newUrlFromBase(channelFile, this.baseUrl, this.updater.isAddNoCacheQuery);
        try {
            const updateInfo = await this.httpRequest(channelUrl, {
                Accept: "application/vnd.api+json",
                "Keygen-Version": "1.1",
            }, cancellationToken);
            return Provider_1.parseUpdateInfo(updateInfo, channelFile, channelUrl);
        }
        catch (e) {
            throw builder_util_runtime_1.newError(`Unable to find latest version on ${this.toString()}, please ensure release exists: ${e.stack || e.message}`, "ERR_UPDATER_LATEST_VERSION_NOT_FOUND");
        }
    }
    resolveFiles(updateInfo) {
        return Provider_1.resolveFiles(updateInfo, this.baseUrl);
    }
    toString() {
        const { account, product, platform } = this.configuration;
        return `Keygen (account: ${account}, product: ${product}, platform: ${platform}, channel: ${this.channel})`;
    }
}
exports.KeygenProvider = KeygenProvider;
//# sourceMappingURL=KeygenProvider.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.PrivateGitHubProvider = void 0;
const builder_util_runtime_1 = require("builder-util-runtime");
const js_yaml_1 = require("js-yaml");
const path = require("path");
const url_1 = require("url");
const util_1 = require("../util");
const GitHubProvider_1 = require("./GitHubProvider");
const Provider_1 = require("./Provider");
class PrivateGitHubProvider extends GitHubProvider_1.BaseGitHubProvider {
    constructor(options, updater, token, runtimeOptions) {
        super(options, "api.github.com", runtimeOptions);
        this.updater = updater;
        this.token = token;
    }
    createRequestOptions(url, headers) {
        const result = super.createRequestOptions(url, headers);
        result.redirect = "manual";
        return result;
    }
    async getLatestVersion() {
        const cancellationToken = new builder_util_runtime_1.CancellationToken();
        const channelFile = util_1.getChannelFilename(this.getDefaultChannelName());
        const releaseInfo = await this.getLatestVersionInfo(cancellationToken);
        const asset = releaseInfo.assets.find(it => it.name === channelFile);
        if (asset == null) {
            // html_url must be always, but just to be sure
            throw builder_util_runtime_1.newError(`Cannot find ${channelFile} in the release ${releaseInfo.html_url || releaseInfo.name}`, "ERR_UPDATER_CHANNEL_FILE_NOT_FOUND");
        }
        const url = new url_1.URL(asset.url);
        let result;
        try {
            result = js_yaml_1.load((await this.httpRequest(url, this.configureHeaders("application/octet-stream"), cancellationToken)));
        }
        catch (e) {
            if (e instanceof builder_util_runtime_1.HttpError && e.statusCode === 404) {
                throw builder_util_runtime_1.newError(`Cannot find ${channelFile} in the latest release artifacts (${url}): ${e.stack || e.message}`, "ERR_UPDATER_CHANNEL_FILE_NOT_FOUND");
            }
            throw e;
        }
        ;
        result.assets = releaseInfo.assets;
        return result;
    }
    get fileExtraDownloadHeaders() {
        return this.configureHeaders("application/octet-stream");
    }
    // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
    configureHeaders(accept) {
        return {
            accept,
            authorization: `token ${this.token}`,
        };
    }
    async getLatestVersionInfo(cancellationToken) {
        const allowPrerelease = this.updater.allowPrerelease;
        let basePath = this.basePath;
        if (!allowPrerelease) {
            basePath = `${basePath}/latest`;
        }
        const url = util_1.newUrlFromBase(basePath, this.baseUrl);
        try {
            const version = JSON.parse((await this.httpRequest(url, this.configureHeaders("application/vnd.github.v3+json"), cancellationToken)));
            if (allowPrerelease) {
                return version.find(it => it.prerelease) || version[0];
            }
            else {
                return version;
            }
        }
        catch (e) {
            throw builder_util_runtime_1.newError(`Unable to find latest version on GitHub (${url}), please ensure a production release exists: ${e.stack || e.message}`, "ERR_UPDATER_LATEST_VERSION_NOT_FOUND");
        }
    }
    get basePath() {
        return this.computeGithubBasePath(`/repos/${this.options.owner}/${this.options.repo}/releases`);
    }
    resolveFiles(updateInfo) {
        return Provider_1.getFileList(updateInfo).map(it => {
            const name = path.posix.basename(it.url).replace(/ /g, "-");
            const asset = updateInfo.assets.find(it => it != null && it.name === name);
            if (asset == null) {
                throw builder_util_runtime_1.newError(`Cannot find asset "${name}" in: ${JSON.stringify(updateInfo.assets, null, 2)}`, "ERR_UPDATER_ASSET_NOT_FOUND");
            }
            return {
                url: new url_1.URL(asset.url),
                info: it,
            };
        });
    }
}
exports.PrivateGitHubProvider = PrivateGitHubProvider;
//# sourceMappingURL=PrivateGitHubProvider.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.resolveFiles = exports.getFileList = exports.parseUpdateInfo = exports.findFile = exports.Provider = void 0;
const builder_util_runtime_1 = require("builder-util-runtime");
const js_yaml_1 = require("js-yaml");
const util_1 = require("../util");
class Provider {
    constructor(runtimeOptions) {
        this.runtimeOptions = runtimeOptions;
        this.requestHeaders = null;
        this.executor = runtimeOptions.executor;
    }
    get isUseMultipleRangeRequest() {
        return this.runtimeOptions.isUseMultipleRangeRequest !== false;
    }
    getChannelFilePrefix() {
        if (this.runtimeOptions.platform === "linux") {
            const arch = process.env["TEST_UPDATER_ARCH"] || process.arch;
            const archSuffix = arch === "x64" ? "" : `-${arch}`;
            return "-linux" + archSuffix;
        }
        else {
            return this.runtimeOptions.platform === "darwin" ? "-mac" : "";
        }
    }
    // due to historical reasons for windows we use channel name without platform specifier
    getDefaultChannelName() {
        return this.getCustomChannelName("latest");
    }
    getCustomChannelName(channel) {
        return `${channel}${this.getChannelFilePrefix()}`;
    }
    get fileExtraDownloadHeaders() {
        return null;
    }
    setRequestHeaders(value) {
        this.requestHeaders = value;
    }
    /**
     * Method to perform API request only to resolve update info, but not to download update.
     */
    httpRequest(url, headers, cancellationToken) {
        return this.executor.request(this.createRequestOptions(url, headers), cancellationToken);
    }
    createRequestOptions(url, headers) {
        const result = {};
        if (this.requestHeaders == null) {
            if (headers != null) {
                result.headers = headers;
            }
        }
        else {
            result.headers = headers == null ? this.requestHeaders : { ...this.requestHeaders, ...headers };
        }
        builder_util_runtime_1.configureRequestUrl(url, result);
        return result;
    }
}
exports.Provider = Provider;
function findFile(files, extension, not) {
    if (files.length === 0) {
        throw builder_util_runtime_1.newError("No files provided", "ERR_UPDATER_NO_FILES_PROVIDED");
    }
    const result = files.find(it => it.url.pathname.toLowerCase().endsWith(`.${extension}`));
    if (result != null) {
        return result;
    }
    else if (not == null) {
        return files[0];
    }
    else {
        return files.find(fileInfo => !not.some(ext => fileInfo.url.pathname.toLowerCase().endsWith(`.${ext}`)));
    }
}
exports.findFile = findFile;
function parseUpdateInfo(rawData, channelFile, channelFileUrl) {
    if (rawData == null) {
        throw builder_util_runtime_1.newError(`Cannot parse update info from ${channelFile} in the latest release artifacts (${channelFileUrl}): rawData: null`, "ERR_UPDATER_INVALID_UPDATE_INFO");
    }
    let result;
    try {
        result = js_yaml_1.load(rawData);
    }
    catch (e) {
        throw builder_util_runtime_1.newError(`Cannot parse update info from ${channelFile} in the latest release artifacts (${channelFileUrl}): ${e.stack || e.message}, rawData: ${rawData}`, "ERR_UPDATER_INVALID_UPDATE_INFO");
    }
    return result;
}
exports.parseUpdateInfo = parseUpdateInfo;
function getFileList(updateInfo) {
    const files = updateInfo.files;
    if (files != null && files.length > 0) {
        return files;
    }
    // noinspection JSDeprecatedSymbols
    if (updateInfo.path != null) {
        // noinspection JSDeprecatedSymbols
        return [
            {
                url: updateInfo.path,
                sha2: updateInfo.sha2,
                sha512: updateInfo.sha512,
            },
        ];
    }
    else {
        throw builder_util_runtime_1.newError(`No files provided: ${builder_util_runtime_1.safeStringifyJson(updateInfo)}`, "ERR_UPDATER_NO_FILES_PROVIDED");
    }
}
exports.getFileList = getFileList;
function resolveFiles(updateInfo, baseUrl, pathTransformer = (p) => p) {
    const files = getFileList(updateInfo);
    const result = files.map(fileInfo => {
        if (fileInfo.sha2 == null && fileInfo.sha512 == null) {
            throw builder_util_runtime_1.newError(`Update info doesn't contain nor sha256 neither sha512 checksum: ${builder_util_runtime_1.safeStringifyJson(fileInfo)}`, "ERR_UPDATER_NO_CHECKSUM");
        }
        return {
            url: util_1.newUrlFromBase(pathTransformer(fileInfo.url), baseUrl),
            info: fileInfo,
        };
    });
    const packages = updateInfo.packages;
    const packageInfo = packages == null ? null : packages[process.arch] || packages.ia32;
    if (packageInfo != null) {
        ;
        result[0].packageInfo = {
            ...packageInfo,
            path: util_1.newUrlFromBase(pathTransformer(packageInfo.path), baseUrl).href,
        };
    }
    return result;
}
exports.resolveFiles = resolveFiles;
//# sourceMappingURL=Provider.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.DataSplitter = exports.copyData = void 0;
const builder_util_runtime_1 = require("builder-util-runtime");
const fs_1 = require("fs");
const stream_1 = require("stream");
const downloadPlanBuilder_1 = require("./downloadPlanBuilder");
const DOUBLE_CRLF = Buffer.from("\r\n\r\n");
var ReadState;
(function (ReadState) {
    ReadState[ReadState["INIT"] = 0] = "INIT";
    ReadState[ReadState["HEADER"] = 1] = "HEADER";
    ReadState[ReadState["BODY"] = 2] = "BODY";
})(ReadState || (ReadState = {}));
function copyData(task, out, oldFileFd, reject, resolve) {
    const readStream = fs_1.createReadStream("", {
        fd: oldFileFd,
        autoClose: false,
        start: task.start,
        // end is inclusive
        end: task.end - 1,
    });
    readStream.on("error", reject);
    readStream.once("end", resolve);
    readStream.pipe(out, {
        end: false,
    });
}
exports.copyData = copyData;
class DataSplitter extends stream_1.Writable {
    constructor(out, options, partIndexToTaskIndex, boundary, partIndexToLength, finishHandler) {
        super();
        this.out = out;
        this.options = options;
        this.partIndexToTaskIndex = partIndexToTaskIndex;
        this.partIndexToLength = partIndexToLength;
        this.finishHandler = finishHandler;
        this.partIndex = -1;
        this.headerListBuffer = null;
        this.readState = ReadState.INIT;
        this.ignoreByteCount = 0;
        this.remainingPartDataCount = 0;
        this.actualPartLength = 0;
        this.boundaryLength = boundary.length + 4; /* size of \r\n-- */
        // first chunk doesn't start with \r\n
        this.ignoreByteCount = this.boundaryLength - 2;
    }
    get isFinished() {
        return this.partIndex === this.partIndexToLength.length;
    }
    // noinspection JSUnusedGlobalSymbols
    _write(data, encoding, callback) {
        if (this.isFinished) {
            console.error(`Trailing ignored data: ${data.length} bytes`);
            return;
        }
        this.handleData(data).then(callback).catch(callback);
    }
    async handleData(chunk) {
        let start = 0;
        if (this.ignoreByteCount !== 0 && this.remainingPartDataCount !== 0) {
            throw builder_util_runtime_1.newError("Internal error", "ERR_DATA_SPLITTER_BYTE_COUNT_MISMATCH");
        }
        if (this.ignoreByteCount > 0) {
            const toIgnore = Math.min(this.ignoreByteCount, chunk.length);
            this.ignoreByteCount -= toIgnore;
            start = toIgnore;
        }
        else if (this.remainingPartDataCount > 0) {
            const toRead = Math.min(this.remainingPartDataCount, chunk.length);
            this.remainingPartDataCount -= toRead;
            await this.processPartData(chunk, 0, toRead);
            start = toRead;
        }
        if (start === chunk.length) {
            return;
        }
        if (this.readState === ReadState.HEADER) {
            const headerListEnd = this.searchHeaderListEnd(chunk, start);
            if (headerListEnd === -1) {
                return;
            }
            start = headerListEnd;
            this.readState = ReadState.BODY;
            // header list is ignored, we don't need it
            this.headerListBuffer = null;
        }
        while (true) {
            if (this.readState === ReadState.BODY) {
                this.readState = ReadState.INIT;
            }
            else {
                this.partIndex++;
                let taskIndex = this.partIndexToTaskIndex.get(this.partIndex);
                if (taskIndex == null) {
                    if (this.isFinished) {
                        taskIndex = this.options.end;
                    }
                    else {
                        throw builder_util_runtime_1.newError("taskIndex is null", "ERR_DATA_SPLITTER_TASK_INDEX_IS_NULL");
                    }
                }
                const prevTaskIndex = this.partIndex === 0 ? this.options.start : this.partIndexToTaskIndex.get(this.partIndex - 1) + 1; /* prev part is download, next maybe copy */
                if (prevTaskIndex < taskIndex) {
                    await this.copyExistingData(prevTaskIndex, taskIndex);
                }
                else if (prevTaskIndex > taskIndex) {
                    throw builder_util_runtime_1.newError("prevTaskIndex must be < taskIndex", "ERR_DATA_SPLITTER_TASK_INDEX_ASSERT_FAILED");
                }
                if (this.isFinished) {
                    this.onPartEnd();
                    this.finishHandler();
                    return;
                }
                start = this.searchHeaderListEnd(chunk, start);
                if (start === -1) {
                    this.readState = ReadState.HEADER;
                    return;
                }
            }
            const partLength = this.partIndexToLength[this.partIndex];
            const end = start + partLength;
            const effectiveEnd = Math.min(end, chunk.length);
            await this.processPartStarted(chunk, start, effectiveEnd);
            this.remainingPartDataCount = partLength - (effectiveEnd - start);
            if (this.remainingPartDataCount > 0) {
                return;
            }
            start = end + this.boundaryLength;
            if (start >= chunk.length) {
                this.ignoreByteCount = this.boundaryLength - (chunk.length - end);
                return;
            }
        }
    }
    copyExistingData(index, end) {
        return new Promise((resolve, reject) => {
            const w = () => {
                if (index === end) {
                    resolve();
                    return;
                }
                const task = this.options.tasks[index];
                if (task.kind !== downloadPlanBuilder_1.OperationKind.COPY) {
                    reject(new Error("Task kind must be COPY"));
                    return;
                }
                copyData(task, this.out, this.options.oldFileFd, reject, () => {
                    index++;
                    w();
                });
            };
            w();
        });
    }
    searchHeaderListEnd(chunk, readOffset) {
        const headerListEnd = chunk.indexOf(DOUBLE_CRLF, readOffset);
        if (headerListEnd !== -1) {
            return headerListEnd + DOUBLE_CRLF.length;
        }
        // not all headers data were received, save to buffer
        const partialChunk = readOffset === 0 ? chunk : chunk.slice(readOffset);
        if (this.headerListBuffer == null) {
            this.headerListBuffer = partialChunk;
        }
        else {
            this.headerListBuffer = Buffer.concat([this.headerListBuffer, partialChunk]);
        }
        return -1;
    }
    onPartEnd() {
        const expectedLength = this.partIndexToLength[this.partIndex - 1];
        if (this.actualPartLength !== expectedLength) {
            throw builder_util_runtime_1.newError(`Expected length: ${expectedLength} differs from actual: ${this.actualPartLength}`, "ERR_DATA_SPLITTER_LENGTH_MISMATCH");
        }
        this.actualPartLength = 0;
    }
    processPartStarted(data, start, end) {
        if (this.partIndex !== 0) {
            this.onPartEnd();
        }
        return this.processPartData(data, start, end);
    }
    processPartData(data, start, end) {
        this.actualPartLength += end - start;
        const out = this.out;
        if (out.write(start === 0 && data.length === end ? data : data.slice(start, end))) {
            return Promise.resolve();
        }
        else {
            return new Promise((resolve, reject) => {
                out.on("error", reject);
                out.once("drain", () => {
                    out.removeListener("error", reject);
                    resolve();
                });
            });
        }
    }
}
exports.DataSplitter = DataSplitter;
//# sourceMappingURL=DataSplitter.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.DifferentialDownloader = void 0;
const builder_util_runtime_1 = require("builder-util-runtime");
const fs_extra_1 = require("fs-extra");
const fs_1 = require("fs");
const DataSplitter_1 = require("./DataSplitter");
const url_1 = require("url");
const downloadPlanBuilder_1 = require("./downloadPlanBuilder");
const multipleRangeDownloader_1 = require("./multipleRangeDownloader");
const ProgressDifferentialDownloadCallbackTransform_1 = require("./ProgressDifferentialDownloadCallbackTransform");
class DifferentialDownloader {
    // noinspection TypeScriptAbstractClassConstructorCanBeMadeProtected
    constructor(blockAwareFileInfo, httpExecutor, options) {
        this.blockAwareFileInfo = blockAwareFileInfo;
        this.httpExecutor = httpExecutor;
        this.options = options;
        this.fileMetadataBuffer = null;
        this.logger = options.logger;
    }
    createRequestOptions() {
        const result = {
            headers: {
                ...this.options.requestHeaders,
                accept: "*/*",
            },
        };
        builder_util_runtime_1.configureRequestUrl(this.options.newUrl, result);
        // user-agent, cache-control and other common options
        builder_util_runtime_1.configureRequestOptions(result);
        return result;
    }
    doDownload(oldBlockMap, newBlockMap) {
        // we don't check other metadata like compressionMethod - generic check that it is make sense to differentially update is suitable for it
        if (oldBlockMap.version !== newBlockMap.version) {
            throw new Error(`version is different (${oldBlockMap.version} - ${newBlockMap.version}), full download is required`);
        }
        const logger = this.logger;
        const operations = downloadPlanBuilder_1.computeOperations(oldBlockMap, newBlockMap, logger);
        if (logger.debug != null) {
            logger.debug(JSON.stringify(operations, null, 2));
        }
        let downloadSize = 0;
        let copySize = 0;
        for (const operation of operations) {
            const length = operation.end - operation.start;
            if (operation.kind === downloadPlanBuilder_1.OperationKind.DOWNLOAD) {
                downloadSize += length;
            }
            else {
                copySize += length;
            }
        }
        const newSize = this.blockAwareFileInfo.size;
        if (downloadSize + copySize + (this.fileMetadataBuffer == null ? 0 : this.fileMetadataBuffer.length) !== newSize) {
            throw new Error(`Internal error, size mismatch: downloadSize: ${downloadSize}, copySize: ${copySize}, newSize: ${newSize}`);
        }
        logger.info(`Full: ${formatBytes(newSize)}, To download: ${formatBytes(downloadSize)} (${Math.round(downloadSize / (newSize / 100))}%)`);
        return this.downloadFile(operations);
    }
    downloadFile(tasks) {
        const fdList = [];
        const closeFiles = () => {
            return Promise.all(fdList.map(openedFile => {
                return fs_extra_1.close(openedFile.descriptor).catch(e => {
                    this.logger.error(`cannot close file "${openedFile.path}": ${e}`);
                });
            }));
        };
        return this.doDownloadFile(tasks, fdList)
            .then(closeFiles)
            .catch(e => {
            // then must be after catch here (since then always throws error)
            return closeFiles()
                .catch(closeFilesError => {
                // closeFiles never throw error, but just to be sure
                try {
                    this.logger.error(`cannot close files: ${closeFilesError}`);
                }
                catch (errorOnLog) {
                    try {
                        console.error(errorOnLog);
                    }
                    catch (ignored) {
                        // ok, give up and ignore error
                    }
                }
                throw e;
            })
                .then(() => {
                throw e;
            });
        });
    }
    async doDownloadFile(tasks, fdList) {
        const oldFileFd = await fs_extra_1.open(this.options.oldFile, "r");
        fdList.push({ descriptor: oldFileFd, path: this.options.oldFile });
        const newFileFd = await fs_extra_1.open(this.options.newFile, "w");
        fdList.push({ descriptor: newFileFd, path: this.options.newFile });
        const fileOut = fs_1.createWriteStream(this.options.newFile, { fd: newFileFd });
        await new Promise((resolve, reject) => {
            const streams = [];
            // Create our download info transformer if we have one
            let downloadInfoTransform = undefined;
            if (!this.options.isUseMultipleRangeRequest && this.options.onProgress) {
                // TODO: Does not support multiple ranges (someone feel free to PR this!)
                const expectedByteCounts = [];
                let grandTotalBytes = 0;
                for (const task of tasks) {
                    if (task.kind === downloadPlanBuilder_1.OperationKind.DOWNLOAD) {
                        expectedByteCounts.push(task.end - task.start);
                        grandTotalBytes += task.end - task.start;
                    }
                }
                const progressDifferentialDownloadInfo = {
                    expectedByteCounts: expectedByteCounts,
                    grandTotal: grandTotalBytes,
                };
                downloadInfoTransform = new ProgressDifferentialDownloadCallbackTransform_1.ProgressDifferentialDownloadCallbackTransform(progressDifferentialDownloadInfo, this.options.cancellationToken, this.options.onProgress);
                streams.push(downloadInfoTransform);
            }
            const digestTransform = new builder_util_runtime_1.DigestTransform(this.blockAwareFileInfo.sha512);
            // to simply debug, do manual validation to allow file to be fully written
            digestTransform.isValidateOnEnd = false;
            streams.push(digestTransform);
            // noinspection JSArrowFunctionCanBeReplacedWithShorthand
            fileOut.on("finish", () => {
                ;
                fileOut.close(() => {
                    // remove from fd list because closed successfully
                    fdList.splice(1, 1);
                    try {
                        digestTransform.validate();
                    }
                    catch (e) {
                        reject(e);
                        return;
                    }
                    resolve(undefined);
                });
            });
            streams.push(fileOut);
            let lastStream = null;
            for (const stream of streams) {
                stream.on("error", reject);
                if (lastStream == null) {
                    lastStream = stream;
                }
                else {
                    lastStream = lastStream.pipe(stream);
                }
            }
            const firstStream = streams[0];
            let w;
            if (this.options.isUseMultipleRangeRequest) {
                w = multipleRangeDownloader_1.executeTasksUsingMultipleRangeRequests(this, tasks, firstStream, oldFileFd, reject);
                w(0);
                return;
            }
            let downloadOperationCount = 0;
            let actualUrl = null;
            this.logger.info(`Differential download: ${this.options.newUrl}`);
            const requestOptions = this.createRequestOptions();
            requestOptions.redirect = "manual";
            w = (index) => {
                var _a, _b;
                if (index >= tasks.length) {
                    if (this.fileMetadataBuffer != null) {
                        firstStream.write(this.fileMetadataBuffer);
                    }
                    firstStream.end();
                    return;
                }
                const operation = tasks[index++];
                if (operation.kind === downloadPlanBuilder_1.OperationKind.COPY) {
                    // We are copying, let's not send status updates to the UI
                    if (downloadInfoTransform) {
                        downloadInfoTransform.beginFileCopy();
                    }
                    DataSplitter_1.copyData(operation, firstStream, oldFileFd, reject, () => w(index));
                    return;
                }
                const range = `bytes=${operation.start}-${operation.end - 1}`;
                requestOptions.headers.range = range;
                (_b = (_a = this.logger) === null || _a === void 0 ? void 0 : _a.debug) === null || _b === void 0 ? void 0 : _b.call(_a, `download range: ${range}`);
                // We are starting to download
                if (downloadInfoTransform) {
                    downloadInfoTransform.beginRangeDownload();
                }
                const request = this.httpExecutor.createRequest(requestOptions, response => {
                    // Electron net handles redirects automatically, our NodeJS test server doesn't use redirects - so, we don't check 3xx codes.
                    if (response.statusCode >= 400) {
                        reject(builder_util_runtime_1.createHttpError(response));
                    }
                    response.pipe(firstStream, {
                        end: false,
                    });
                    response.once("end", () => {
                        // Pass on that we are downloading a segment
                        if (downloadInfoTransform) {
                            downloadInfoTransform.endRangeDownload();
                        }
                        if (++downloadOperationCount === 100) {
                            downloadOperationCount = 0;
                            setTimeout(() => w(index), 1000);
                        }
                        else {
                            w(index);
                        }
                    });
                });
                request.on("redirect", (statusCode, method, redirectUrl) => {
                    this.logger.info(`Redirect to ${removeQuery(redirectUrl)}`);
                    actualUrl = redirectUrl;
                    builder_util_runtime_1.configureRequestUrl(new url_1.URL(actualUrl), requestOptions);
                    request.followRedirect();
                });
                this.httpExecutor.addErrorAndTimeoutHandlers(request, reject);
                request.end();
            };
            w(0);
        });
    }
    async readRemoteBytes(start, endInclusive) {
        const buffer = Buffer.allocUnsafe(endInclusive + 1 - start);
        const requestOptions = this.createRequestOptions();
        requestOptions.headers.range = `bytes=${start}-${endInclusive}`;
        let position = 0;
        await this.request(requestOptions, chunk => {
            chunk.copy(buffer, position);
            position += chunk.length;
        });
        if (position !== buffer.length) {
            throw new Error(`Received data length ${position} is not equal to expected ${buffer.length}`);
        }
        return buffer;
    }
    request(requestOptions, dataHandler) {
        return new Promise((resolve, reject) => {
            const request = this.httpExecutor.createRequest(requestOptions, response => {
                if (!multipleRangeDownloader_1.checkIsRangesSupported(response, reject)) {
                    return;
                }
                response.on("data", dataHandler);
                response.on("end", () => resolve());
            });
            this.httpExecutor.addErrorAndTimeoutHandlers(request, reject);
            request.end();
        });
    }
}
exports.DifferentialDownloader = DifferentialDownloader;
function formatBytes(value, symbol = " KB") {
    return new Intl.NumberFormat("en").format((value / 1024).toFixed(2)) + symbol;
}
// safety
function removeQuery(url) {
    const index = url.indexOf("?");
    return index < 0 ? url : url.substring(0, index);
}
//# sourceMappingURL=DifferentialDownloader.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.FileWithEmbeddedBlockMapDifferentialDownloader = void 0;
const fs_extra_1 = require("fs-extra");
const DifferentialDownloader_1 = require("./DifferentialDownloader");
const zlib_1 = require("zlib");
class FileWithEmbeddedBlockMapDifferentialDownloader extends DifferentialDownloader_1.DifferentialDownloader {
    async download() {
        const packageInfo = this.blockAwareFileInfo;
        const fileSize = packageInfo.size;
        const offset = fileSize - (packageInfo.blockMapSize + 4);
        this.fileMetadataBuffer = await this.readRemoteBytes(offset, fileSize - 1);
        const newBlockMap = readBlockMap(this.fileMetadataBuffer.slice(0, this.fileMetadataBuffer.length - 4));
        await this.doDownload(await readEmbeddedBlockMapData(this.options.oldFile), newBlockMap);
    }
}
exports.FileWithEmbeddedBlockMapDifferentialDownloader = FileWithEmbeddedBlockMapDifferentialDownloader;
function readBlockMap(data) {
    return JSON.parse(zlib_1.inflateRawSync(data).toString());
}
async function readEmbeddedBlockMapData(file) {
    const fd = await fs_extra_1.open(file, "r");
    try {
        const fileSize = (await fs_extra_1.fstat(fd)).size;
        const sizeBuffer = Buffer.allocUnsafe(4);
        await fs_extra_1.read(fd, sizeBuffer, 0, sizeBuffer.length, fileSize - sizeBuffer.length);
        const dataBuffer = Buffer.allocUnsafe(sizeBuffer.readUInt32BE(0));
        await fs_extra_1.read(fd, dataBuffer, 0, dataBuffer.length, fileSize - sizeBuffer.length - dataBuffer.length);
        await fs_extra_1.close(fd);
        return readBlockMap(dataBuffer);
    }
    catch (e) {
        await fs_extra_1.close(fd);
        throw e;
    }
}
//# sourceMappingURL=FileWithEmbeddedBlockMapDifferentialDownloader.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.GenericDifferentialDownloader = void 0;
const DifferentialDownloader_1 = require("./DifferentialDownloader");
class GenericDifferentialDownloader extends DifferentialDownloader_1.DifferentialDownloader {
    download(oldBlockMap, newBlockMap) {
        return this.doDownload(oldBlockMap, newBlockMap);
    }
}
exports.GenericDifferentialDownloader = GenericDifferentialDownloader;
//# sourceMappingURL=GenericDifferentialDownloader.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ProgressDifferentialDownloadCallbackTransform = void 0;
const stream_1 = require("stream");
var OperationKind;
(function (OperationKind) {
    OperationKind[OperationKind["COPY"] = 0] = "COPY";
    OperationKind[OperationKind["DOWNLOAD"] = 1] = "DOWNLOAD";
})(OperationKind || (OperationKind = {}));
class ProgressDifferentialDownloadCallbackTransform extends stream_1.Transform {
    constructor(progressDifferentialDownloadInfo, cancellationToken, onProgress) {
        super();
        this.progressDifferentialDownloadInfo = progressDifferentialDownloadInfo;
        this.cancellationToken = cancellationToken;
        this.onProgress = onProgress;
        this.start = Date.now();
        this.transferred = 0;
        this.delta = 0;
        this.expectedBytes = 0;
        this.index = 0;
        this.operationType = OperationKind.COPY;
        this.nextUpdate = this.start + 1000;
    }
    _transform(chunk, encoding, callback) {
        if (this.cancellationToken.cancelled) {
            callback(new Error("cancelled"), null);
            return;
        }
        // Don't send progress update when copying from disk
        if (this.operationType == OperationKind.COPY) {
            callback(null, chunk);
            return;
        }
        this.transferred += chunk.length;
        this.delta += chunk.length;
        const now = Date.now();
        if (now >= this.nextUpdate &&
            this.transferred !== this.expectedBytes /* will be emitted by endRangeDownload() */ &&
            this.transferred !== this.progressDifferentialDownloadInfo.grandTotal /* will be emitted on _flush */) {
            this.nextUpdate = now + 1000;
            this.onProgress({
                total: this.progressDifferentialDownloadInfo.grandTotal,
                delta: this.delta,
                transferred: this.transferred,
                percent: (this.transferred / this.progressDifferentialDownloadInfo.grandTotal) * 100,
                bytesPerSecond: Math.round(this.transferred / ((now - this.start) / 1000)),
            });
            this.delta = 0;
        }
        callback(null, chunk);
    }
    beginFileCopy() {
        this.operationType = OperationKind.COPY;
    }
    beginRangeDownload() {
        this.operationType = OperationKind.DOWNLOAD;
        this.expectedBytes += this.progressDifferentialDownloadInfo.expectedByteCounts[this.index++];
    }
    endRangeDownload() {
        // _flush() will doour final 100%
        if (this.transferred !== this.progressDifferentialDownloadInfo.grandTotal) {
            this.onProgress({
                total: this.progressDifferentialDownloadInfo.grandTotal,
                delta: this.delta,
                transferred: this.transferred,
                percent: (this.transferred / this.progressDifferentialDownloadInfo.grandTotal) * 100,
                bytesPerSecond: Math.round(this.transferred / ((Date.now() - this.start) / 1000)),
            });
        }
    }
    // Called when we are 100% done with the connection/download
    _flush(callback) {
        if (this.cancellationToken.cancelled) {
            callback(new Error("cancelled"));
            return;
        }
        this.onProgress({
            total: this.progressDifferentialDownloadInfo.grandTotal,
            delta: this.delta,
            transferred: this.transferred,
            percent: 100,
            bytesPerSecond: Math.round(this.transferred / ((Date.now() - this.start) / 1000)),
        });
        this.delta = 0;
        this.transferred = 0;
        callback(null);
    }
}
exports.ProgressDifferentialDownloadCallbackTransform = ProgressDifferentialDownloadCallbackTransform;
//# sourceMappingURL=ProgressDifferentialDownloadCallbackTransform.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.computeOperations = exports.OperationKind = void 0;
var OperationKind;
(function (OperationKind) {
    OperationKind[OperationKind["COPY"] = 0] = "COPY";
    OperationKind[OperationKind["DOWNLOAD"] = 1] = "DOWNLOAD";
})(OperationKind = exports.OperationKind || (exports.OperationKind = {}));
function computeOperations(oldBlockMap, newBlockMap, logger) {
    const nameToOldBlocks = buildBlockFileMap(oldBlockMap.files);
    const nameToNewBlocks = buildBlockFileMap(newBlockMap.files);
    let lastOperation = null;
    // for now only one file is supported in block map
    const blockMapFile = newBlockMap.files[0];
    const operations = [];
    const name = blockMapFile.name;
    const oldEntry = nameToOldBlocks.get(name);
    if (oldEntry == null) {
        // new file (unrealistic case for now, because in any case both blockmap contain the only file named as "file")
        throw new Error(`no file ${name} in old blockmap`);
    }
    const newFile = nameToNewBlocks.get(name);
    let changedBlockCount = 0;
    const { checksumToOffset: checksumToOldOffset, checksumToOldSize } = buildChecksumMap(nameToOldBlocks.get(name), oldEntry.offset, logger);
    let newOffset = blockMapFile.offset;
    for (let i = 0; i < newFile.checksums.length; newOffset += newFile.sizes[i], i++) {
        const blockSize = newFile.sizes[i];
        const checksum = newFile.checksums[i];
        let oldOffset = checksumToOldOffset.get(checksum);
        if (oldOffset != null && checksumToOldSize.get(checksum) !== blockSize) {
            logger.warn(`Checksum ("${checksum}") matches, but size differs (old: ${checksumToOldSize.get(checksum)}, new: ${blockSize})`);
            oldOffset = undefined;
        }
        if (oldOffset === undefined) {
            // download data from new file
            changedBlockCount++;
            if (lastOperation != null && lastOperation.kind === OperationKind.DOWNLOAD && lastOperation.end === newOffset) {
                lastOperation.end += blockSize;
            }
            else {
                lastOperation = {
                    kind: OperationKind.DOWNLOAD,
                    start: newOffset,
                    end: newOffset + blockSize,
                    // oldBlocks: null,
                };
                validateAndAdd(lastOperation, operations, checksum, i);
            }
        }
        else {
            // reuse data from old file
            if (lastOperation != null && lastOperation.kind === OperationKind.COPY && lastOperation.end === oldOffset) {
                lastOperation.end += blockSize;
                // lastOperation.oldBlocks!!.push(checksum)
            }
            else {
                lastOperation = {
                    kind: OperationKind.COPY,
                    start: oldOffset,
                    end: oldOffset + blockSize,
                    // oldBlocks: [checksum]
                };
                validateAndAdd(lastOperation, operations, checksum, i);
            }
        }
    }
    if (changedBlockCount > 0) {
        logger.info(`File${blockMapFile.name === "file" ? "" : " " + blockMapFile.name} has ${changedBlockCount} changed blocks`);
    }
    return operations;
}
exports.computeOperations = computeOperations;
const isValidateOperationRange = process.env["DIFFERENTIAL_DOWNLOAD_PLAN_BUILDER_VALIDATE_RANGES"] === "true";
function validateAndAdd(operation, operations, checksum, index) {
    if (isValidateOperationRange && operations.length !== 0) {
        const lastOperation = operations[operations.length - 1];
        if (lastOperation.kind === operation.kind && operation.start < lastOperation.end && operation.start > lastOperation.start) {
            const min = [lastOperation.start, lastOperation.end, operation.start, operation.end].reduce((p, v) => (p < v ? p : v));
            throw new Error(`operation (block index: ${index}, checksum: ${checksum}, kind: ${OperationKind[operation.kind]}) overlaps previous operation (checksum: ${checksum}):\n` +
                `abs: ${lastOperation.start} until ${lastOperation.end} and ${operation.start} until ${operation.end}\n` +
                `rel: ${lastOperation.start - min} until ${lastOperation.end - min} and ${operation.start - min} until ${operation.end - min}`);
        }
    }
    operations.push(operation);
}
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
function buildChecksumMap(file, fileOffset, logger) {
    const checksumToOffset = new Map();
    const checksumToSize = new Map();
    let offset = fileOffset;
    for (let i = 0; i < file.checksums.length; i++) {
        const checksum = file.checksums[i];
        const size = file.sizes[i];
        const existing = checksumToSize.get(checksum);
        if (existing === undefined) {
            checksumToOffset.set(checksum, offset);
            checksumToSize.set(checksum, size);
        }
        else if (logger.debug != null) {
            const sizeExplanation = existing === size ? "(same size)" : `(size: ${existing}, this size: ${size})`;
            logger.debug(`${checksum} duplicated in blockmap ${sizeExplanation}, it doesn't lead to broken differential downloader, just corresponding block will be skipped)`);
        }
        offset += size;
    }
    return { checksumToOffset, checksumToOldSize: checksumToSize };
}
function buildBlockFileMap(list) {
    const result = new Map();
    for (const item of list) {
        result.set(item.name, item);
    }
    return result;
}
//# sourceMappingURL=downloadPlanBuilder.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.checkIsRangesSupported = exports.executeTasksUsingMultipleRangeRequests = void 0;
const builder_util_runtime_1 = require("builder-util-runtime");
const DataSplitter_1 = require("./DataSplitter");
const downloadPlanBuilder_1 = require("./downloadPlanBuilder");
function executeTasksUsingMultipleRangeRequests(differentialDownloader, tasks, out, oldFileFd, reject) {
    const w = (taskOffset) => {
        if (taskOffset >= tasks.length) {
            if (differentialDownloader.fileMetadataBuffer != null) {
                out.write(differentialDownloader.fileMetadataBuffer);
            }
            out.end();
            return;
        }
        const nextOffset = taskOffset + 1000;
        doExecuteTasks(differentialDownloader, {
            tasks,
            start: taskOffset,
            end: Math.min(tasks.length, nextOffset),
            oldFileFd,
        }, out, () => w(nextOffset), reject);
    };
    return w;
}
exports.executeTasksUsingMultipleRangeRequests = executeTasksUsingMultipleRangeRequests;
function doExecuteTasks(differentialDownloader, options, out, resolve, reject) {
    let ranges = "bytes=";
    let partCount = 0;
    const partIndexToTaskIndex = new Map();
    const partIndexToLength = [];
    for (let i = options.start; i < options.end; i++) {
        const task = options.tasks[i];
        if (task.kind === downloadPlanBuilder_1.OperationKind.DOWNLOAD) {
            ranges += `${task.start}-${task.end - 1}, `;
            partIndexToTaskIndex.set(partCount, i);
            partCount++;
            partIndexToLength.push(task.end - task.start);
        }
    }
    if (partCount <= 1) {
        // the only remote range - copy
        const w = (index) => {
            if (index >= options.end) {
                resolve();
                return;
            }
            const task = options.tasks[index++];
            if (task.kind === downloadPlanBuilder_1.OperationKind.COPY) {
                DataSplitter_1.copyData(task, out, options.oldFileFd, reject, () => w(index));
            }
            else {
                const requestOptions = differentialDownloader.createRequestOptions();
                requestOptions.headers.Range = `bytes=${task.start}-${task.end - 1}`;
                const request = differentialDownloader.httpExecutor.createRequest(requestOptions, response => {
                    if (!checkIsRangesSupported(response, reject)) {
                        return;
                    }
                    response.pipe(out, {
                        end: false,
                    });
                    response.once("end", () => w(index));
                });
                differentialDownloader.httpExecutor.addErrorAndTimeoutHandlers(request, reject);
                request.end();
            }
        };
        w(options.start);
        return;
    }
    const requestOptions = differentialDownloader.createRequestOptions();
    requestOptions.headers.Range = ranges.substring(0, ranges.length - 2);
    const request = differentialDownloader.httpExecutor.createRequest(requestOptions, response => {
        if (!checkIsRangesSupported(response, reject)) {
            return;
        }
        const contentType = builder_util_runtime_1.safeGetHeader(response, "content-type");
        const m = /^multipart\/.+?(?:; boundary=(?:(?:"(.+)")|(?:([^\s]+))))$/i.exec(contentType);
        if (m == null) {
            reject(new Error(`Content-Type "multipart/byteranges" is expected, but got "${contentType}"`));
            return;
        }
        const dicer = new DataSplitter_1.DataSplitter(out, options, partIndexToTaskIndex, m[1] || m[2], partIndexToLength, resolve);
        dicer.on("error", reject);
        response.pipe(dicer);
        response.on("end", () => {
            setTimeout(() => {
                request.abort();
                reject(new Error("Response ends without calling any handlers"));
            }, 10000);
        });
    });
    differentialDownloader.httpExecutor.addErrorAndTimeoutHandlers(request, reject);
    request.end();
}
function checkIsRangesSupported(response, reject) {
    // Electron net handles redirects automatically, our NodeJS test server doesn't use redirects - so, we don't check 3xx codes.
    if (response.statusCode >= 400) {
        reject(builder_util_runtime_1.createHttpError(response));
        return false;
    }
    if (response.statusCode !== 206) {
        const acceptRanges = builder_util_runtime_1.safeGetHeader(response, "accept-ranges");
        if (acceptRanges == null || acceptRanges === "none") {
            reject(new Error(`Server doesn't support Accept-Ranges (response code ${response.statusCode})`));
            return false;
        }
    }
    return true;
}
exports.checkIsRangesSupported = checkIsRangesSupported;
//# sourceMappingURL=multipleRangeDownloader.js.map1.0.2 / 2018-01-21
==================

  * Fix encoding `%` as last character

1.0.1 / 2016-06-09
==================

  * Fix encoding unpaired surrogates at start/end of string

1.0.0 / 2016-06-08
==================

  * Initial release
(The MIT License)

Copyright (c) 2016 Douglas Christopher Wilson

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.
/*!
 * encodeurl
 * Copyright(c) 2016 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module exports.
 * @public
 */

module.exports = encodeUrl

/**
 * RegExp to match non-URL code points, *after* encoding (i.e. not including "%")
 * and including invalid escape sequences.
 * @private
 */

var ENCODE_CHARS_REGEXP = /(?:[^\x21\x25\x26-\x3B\x3D\x3F-\x5B\x5D\x5F\x61-\x7A\x7E]|%(?:[^0-9A-Fa-f]|[0-9A-Fa-f][^0-9A-Fa-f]|$))+/g

/**
 * RegExp to match unmatched surrogate pair.
 * @private
 */

var UNMATCHED_SURROGATE_PAIR_REGEXP = /(^|[^\uD800-\uDBFF])[\uDC00-\uDFFF]|[\uD800-\uDBFF]([^\uDC00-\uDFFF]|$)/g

/**
 * String to replace unmatched surrogate pair with.
 * @private
 */

var UNMATCHED_SURROGATE_PAIR_REPLACE = '$1\uFFFD$2'

/**
 * Encode a URL to a percent-encoded form, excluding already-encoded sequences.
 *
 * This function will take an already-encoded URL and encode all the non-URL
 * code points. This function will not encode the "%" character unless it is
 * not part of a valid sequence (`%20` will be left as-is, but `%foo` will
 * be encoded as `%25foo`).
 *
 * This encode is meant to be "safe" and does not throw errors. It will try as
 * hard as it can to properly encode the given URL, including replacing any raw,
 * unpaired surrogate pairs with the Unicode replacement character prior to
 * encoding.
 *
 * @param {string} url
 * @return {string}
 * @public
 */

function encodeUrl (url) {
  return String(url)
    .replace(UNMATCHED_SURROGATE_PAIR_REGEXP, UNMATCHED_SURROGATE_PAIR_REPLACE)
    .replace(ENCODE_CHARS_REGEXP, encodeURI)
}
{
  "name": "encodeurl",
  "description": "Encode a URL to a percent-encoded form, excluding already-encoded sequences",
  "version": "1.0.2",
  "license": "MIT",
  "repository": "pillarjs/encodeurl",
  "devDependencies": {
    "eslint": "3.19.0",
    "eslint-config-standard": "10.2.1",
    "eslint-plugin-import": "2.8.0",
    "eslint-plugin-node": "5.2.1",
    "eslint-plugin-promise": "3.6.0",
    "eslint-plugin-standard": "3.0.1",
    "istanbul": "0.4.5",
    "mocha": "2.5.3"
  },
  "files": [
    "LICENSE",
    "HISTORY.md",
    "README.md",
    "index.js"
  ],
  "engines": {
    "node": ">= 0.8"
  }
}module.exports = {
    printWidth: 160,
    tabWidth: 4,
    singleQuote: true,
    endOfLine: 'lf',
    trailingComma: 'none',
    arrowParens: 'avoid'
};
Copyright (c) 2012-2014 Andris Reinman

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 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": "encoding",
  "version": "0.1.13",
  "description": "Convert encodings, uses iconv-lite",
  "main": "lib/encoding.js",
  "repository": "https://github.com/andris9/encoding.git",
  "author": "Andris Reinman",
  "license": "MIT",
  "dependencies": {
    "iconv-lite": "^0.6.2"
  },
  "devDependencies": {
    "nodeunit": "0.11.3"
  }
}'use strict';

var iconvLite = require('iconv-lite');

// Expose to the world
module.exports.convert = convert;

/**
 * Convert encoding of an UTF-8 string or a buffer
 *
 * @param {String|Buffer} str String to be converted
 * @param {String} to Encoding to be converted to
 * @param {String} [from='UTF-8'] Encoding to be converted from
 * @return {Buffer} Encoded string
 */
function convert(str, to, from) {
    from = checkEncoding(from || 'UTF-8');
    to = checkEncoding(to || 'UTF-8');
    str = str || '';

    var result;

    if (from !== 'UTF-8' && typeof str === 'string') {
        str = Buffer.from(str, 'binary');
    }

    if (from === to) {
        if (typeof str === 'string') {
            result = Buffer.from(str);
        } else {
            result = str;
        }
    } else {
        try {
            result = convertIconvLite(str, to, from);
        } catch (E) {
            console.error(E);
            result = str;
        }
    }

    if (typeof result === 'string') {
        result = Buffer.from(result, 'utf-8');
    }

    return result;
}

/**
 * Convert encoding of astring with iconv-lite
 *
 * @param {String|Buffer} str String to be converted
 * @param {String} to Encoding to be converted to
 * @param {String} [from='UTF-8'] Encoding to be converted from
 * @return {Buffer} Encoded string
 */
function convertIconvLite(str, to, from) {
    if (to === 'UTF-8') {
        return iconvLite.decode(str, from);
    } else if (from === 'UTF-8') {
        return iconvLite.encode(str, to);
    } else {
        return iconvLite.encode(iconvLite.decode(str, from), to);
    }
}

/**
 * Converts charset name if needed
 *
 * @param {String} name Character set
 * @return {String} Character set name
 */
function checkEncoding(name) {
    return (name || '')
        .toString()
        .trim()
        .replace(/^latin[\-_]?(\d+)$/i, 'ISO-8859-$1')
        .replace(/^win(?:dows)?[\-_]?(\d+)$/i, 'WINDOWS-$1')
        .replace(/^utf[\-_]?(\d+)$/i, 'UTF-$1')
        .replace(/^ks_c_5601\-1987$/i, 'CP949')
        .replace(/^us[\-_]?ascii$/i, 'ASCII')
        .toUpperCase();
}
The MIT License (MIT)

Copyright (c) 2014 Mathias Buus

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

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

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

var noop = function() {};

var isRequest = function(stream) {
	return stream.setHeader && typeof stream.abort === 'function';
};

var isChildProcess = function(stream) {
	return stream.stdio && Array.isArray(stream.stdio) && stream.stdio.length === 3
};

var eos = function(stream, opts, callback) {
	if (typeof opts === 'function') return eos(stream, null, opts);
	if (!opts) opts = {};

	callback = once(callback || noop);

	var ws = stream._writableState;
	var rs = stream._readableState;
	var readable = opts.readable || (opts.readable !== false && stream.readable);
	var writable = opts.writable || (opts.writable !== false && stream.writable);
	var cancelled = false;

	var onlegacyfinish = function() {
		if (!stream.writable) onfinish();
	};

	var onfinish = function() {
		writable = false;
		if (!readable) callback.call(stream);
	};

	var onend = function() {
		readable = false;
		if (!writable) callback.call(stream);
	};

	var onexit = function(exitCode) {
		callback.call(stream, exitCode ? new Error('exited with error code: ' + exitCode) : null);
	};

	var onerror = function(err) {
		callback.call(stream, err);
	};

	var onclose = function() {
		process.nextTick(onclosenexttick);
	};

	var onclosenexttick = function() {
		if (cancelled) return;
		if (readable && !(rs && (rs.ended && !rs.destroyed))) return callback.call(stream, new Error('premature close'));
		if (writable && !(ws && (ws.ended && !ws.destroyed))) return callback.call(stream, new Error('premature close'));
	};

	var onrequest = function() {
		stream.req.on('finish', onfinish);
	};

	if (isRequest(stream)) {
		stream.on('complete', onfinish);
		stream.on('abort', onclose);
		if (stream.req) onrequest();
		else stream.on('request', onrequest);
	} else if (writable && !ws) { // legacy streams
		stream.on('end', onlegacyfinish);
		stream.on('close', onlegacyfinish);
	}

	if (isChildProcess(stream)) stream.on('exit', onexit);

	stream.on('end', onend);
	stream.on('finish', onfinish);
	if (opts.error !== false) stream.on('error', onerror);
	stream.on('close', onclose);

	return function() {
		cancelled = true;
		stream.removeListener('complete', onfinish);
		stream.removeListener('abort', onclose);
		stream.removeListener('request', onrequest);
		if (stream.req) stream.req.removeListener('finish', onfinish);
		stream.removeListener('end', onlegacyfinish);
		stream.removeListener('close', onlegacyfinish);
		stream.removeListener('finish', onfinish);
		stream.removeListener('exit', onexit);
		stream.removeListener('end', onend);
		stream.removeListener('error', onerror);
		stream.removeListener('close', onclose);
	};
};

module.exports = eos;
{
  "name": "end-of-stream",
  "version": "1.4.4",
  "description": "Call a callback when a readable/writable/duplex stream has completed or failed.",
  "repository": {
    "type": "git",
    "url": "git://github.com/mafintosh/end-of-stream.git"
  },
  "dependencies": {
    "once": "^1.4.0"
  },
  "files": [
    "index.js"
  ],
  "homepage": "https://github.com/mafintosh/end-of-stream",
  "main": "index.js",
  "author": "Mathias Buus <mathiasbuus@gmail.com>",
  "license": "MIT",
  "devDependencies": {
    "tape": "^4.11.0"
  }
}'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"
  }
}root = true

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

[package.json]
indent_size = 2
{
    "root": true,
    "extends": [
        "@satazor/eslint-config/es6",
        "@satazor/eslint-config/addons/node"
    ]
}{
  "name": "err-code",
  "version": "1.1.1",
  "description": "Create new error instances with a code and additional properties",
  "main": "index.umd.js",
  "homepage": "https://github.com/IndigoUnited/js-err-code",
  "authors": [
    "IndigoUnited <hello@indigounited.com> (http://indigounited.com)"
  ],
  "moduleType": [
    "amd",
    "globals",
    "node"
  ],
  "keywords": [
      "error",
      "err",
      "code",
      "properties",
      "property"
  ],
  "license": "MIT",
  "ignore": [
    "**/.*",
    "node_modules",
    "bower_components",
    "test",
    "tests"
  ]
}
'use strict';

function assign(obj, props) {
    for (const key in props) {
        Object.defineProperty(obj, key, {
            value: props[key],
            enumerable: true,
            configurable: true,
        });
    }

    return obj;
}

function createError(err, code, props) {
    if (!err || typeof err === 'string') {
        throw new TypeError('Please pass an Error to err-code');
    }

    if (!props) {
        props = {};
    }

    if (typeof code === 'object') {
        props = code;
        code = undefined;
    }

    if (code != null) {
        props.code = code;
    }

    try {
        return assign(err, props);
    } catch (_) {
        props.message = err.message;
        props.stack = err.stack;

        const ErrClass = function () {};

        ErrClass.prototype = Object.create(Object.getPrototypeOf(err));

        return assign(new ErrClass(), props);
    }
}

module.exports = createError;
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.errCode = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
'use strict';

function assign(obj, props) {
    for (const key in props) {
        Object.defineProperty(obj, key, {
            value: props[key],
            enumerable: true,
            configurable: true,
        });
    }

    return obj;
}

function createError(err, code, props) {
    if (!err || typeof err === 'string') {
        throw new TypeError('Please pass an Error to err-code');
    }

    if (!props) {
        props = {};
    }

    if (typeof code === 'object') {
        props = code;
        code = undefined;
    }

    if (code != null) {
        props.code = code;
    }

    try {
        return assign(err, props);
    } catch (_) {
        props.message = err.message;
        props.stack = err.stack;

        const ErrClass = function () {};

        ErrClass.prototype = Object.create(Object.getPrototypeOf(err));

        return assign(new ErrClass(), props);
    }
}

module.exports = createError;

},{}]},{},[1])(1)
});
{
  "name": "err-code",
  "version": "2.0.3",
  "description": "Create an error with a code",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/IndigoUnited/js-err-code.git"
  },
  "author": "IndigoUnited <hello@indigounited.com> (http://indigounited.com)",
  "license": "MIT",
  "devDependencies": {
    "@satazor/eslint-config": "^3.0.0",
    "browserify": "^16.5.1",
    "eslint": "^7.2.0",
    "expect.js": "^0.3.1",
    "mocha": "^8.0.1"
  }
}root = true

[*]
indent_style = tab;
insert_final_newline = true;
quote_type = auto;
space_after_anonymous_functions = true;
space_after_control_statements = true;
spaces_around_operators = true;
trim_trailing_whitespace = true;
spaces_in_brackets = false;
end_of_line = lf;

[CHANGELOG.md]
indent_style = space
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"exclude": [
		"coverage",
		"operations",
		"test"
	]
}
'use strict';

// TODO: remove, semver-major

module.exports = require('get-intrinsic');
The MIT License (MIT)

Copyright (C) 2015 Jordan Harband

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';

/* eslint global-require: 0 */
// https://ecma-international.org/ecma-262/6.0/#sec-abstract-operations
var ES6 = {
	'Abstract Equality Comparison': require('./2015/AbstractEqualityComparison'),
	'Abstract Relational Comparison': require('./2015/AbstractRelationalComparison'),
	'Strict Equality Comparison': require('./2015/StrictEqualityComparison'),
	abs: require('./2015/abs'),
	AdvanceStringIndex: require('./2015/AdvanceStringIndex'),
	ArrayCreate: require('./2015/ArrayCreate'),
	ArraySetLength: require('./2015/ArraySetLength'),
	ArraySpeciesCreate: require('./2015/ArraySpeciesCreate'),
	Call: require('./2015/Call'),
	CanonicalNumericIndexString: require('./2015/CanonicalNumericIndexString'),
	CharacterRange: require('./2015/CharacterRange'),
	CompletePropertyDescriptor: require('./2015/CompletePropertyDescriptor'),
	CreateDataProperty: require('./2015/CreateDataProperty'),
	CreateDataPropertyOrThrow: require('./2015/CreateDataPropertyOrThrow'),
	CreateHTML: require('./2015/CreateHTML'),
	CreateIterResultObject: require('./2015/CreateIterResultObject'),
	CreateListFromArrayLike: require('./2015/CreateListFromArrayLike'),
	CreateMethodProperty: require('./2015/CreateMethodProperty'),
	DateFromTime: require('./2015/DateFromTime'),
	Day: require('./2015/Day'),
	DayFromYear: require('./2015/DayFromYear'),
	DaysInYear: require('./2015/DaysInYear'),
	DayWithinYear: require('./2015/DayWithinYear'),
	DefinePropertyOrThrow: require('./2015/DefinePropertyOrThrow'),
	DeletePropertyOrThrow: require('./2015/DeletePropertyOrThrow'),
	EnumerableOwnNames: require('./2015/EnumerableOwnNames'),
	floor: require('./2015/floor'),
	FromPropertyDescriptor: require('./2015/FromPropertyDescriptor'),
	Get: require('./2015/Get'),
	GetIterator: require('./2015/GetIterator'),
	GetMethod: require('./2015/GetMethod'),
	GetOwnPropertyKeys: require('./2015/GetOwnPropertyKeys'),
	GetPrototypeFromConstructor: require('./2015/GetPrototypeFromConstructor'),
	GetSubstitution: require('./2015/GetSubstitution'),
	GetV: require('./2015/GetV'),
	HasOwnProperty: require('./2015/HasOwnProperty'),
	HasProperty: require('./2015/HasProperty'),
	HourFromTime: require('./2015/HourFromTime'),
	InLeapYear: require('./2015/InLeapYear'),
	InstanceofOperator: require('./2015/InstanceofOperator'),
	Invoke: require('./2015/Invoke'),
	IsAccessorDescriptor: require('./2015/IsAccessorDescriptor'),
	IsArray: require('./2015/IsArray'),
	IsCallable: require('./2015/IsCallable'),
	IsCompatiblePropertyDescriptor: require('./2015/IsCompatiblePropertyDescriptor'),
	IsConcatSpreadable: require('./2015/IsConcatSpreadable'),
	IsConstructor: require('./2015/IsConstructor'),
	IsDataDescriptor: require('./2015/IsDataDescriptor'),
	IsExtensible: require('./2015/IsExtensible'),
	IsGenericDescriptor: require('./2015/IsGenericDescriptor'),
	IsInteger: require('./2015/IsInteger'),
	IsPromise: require('./2015/IsPromise'),
	IsPropertyDescriptor: require('./2015/IsPropertyDescriptor'),
	IsPropertyKey: require('./2015/IsPropertyKey'),
	IsRegExp: require('./2015/IsRegExp'),
	IteratorClose: require('./2015/IteratorClose'),
	IteratorComplete: require('./2015/IteratorComplete'),
	IteratorNext: require('./2015/IteratorNext'),
	IteratorStep: require('./2015/IteratorStep'),
	IteratorValue: require('./2015/IteratorValue'),
	MakeDate: require('./2015/MakeDate'),
	MakeDay: require('./2015/MakeDay'),
	MakeTime: require('./2015/MakeTime'),
	MinFromTime: require('./2015/MinFromTime'),
	modulo: require('./2015/modulo'),
	MonthFromTime: require('./2015/MonthFromTime'),
	msFromTime: require('./2015/msFromTime'),
	ObjectCreate: require('./2015/ObjectCreate'),
	ObjectDefineProperties: require('./2015/ObjectDefineProperties'),
	OrdinaryCreateFromConstructor: require('./2015/OrdinaryCreateFromConstructor'),
	OrdinaryDefineOwnProperty: require('./2015/OrdinaryDefineOwnProperty'),
	OrdinaryGetOwnProperty: require('./2015/OrdinaryGetOwnProperty'),
	OrdinaryHasInstance: require('./2015/OrdinaryHasInstance'),
	OrdinaryHasProperty: require('./2015/OrdinaryHasProperty'),
	QuoteJSONString: require('./2015/QuoteJSONString'),
	RegExpCreate: require('./2015/RegExpCreate'),
	RegExpExec: require('./2015/RegExpExec'),
	RequireObjectCoercible: require('./2015/RequireObjectCoercible'),
	SameValue: require('./2015/SameValue'),
	SameValueZero: require('./2015/SameValueZero'),
	SecFromTime: require('./2015/SecFromTime'),
	Set: require('./2015/Set'),
	SetFunctionName: require('./2015/SetFunctionName'),
	SetIntegrityLevel: require('./2015/SetIntegrityLevel'),
	SpeciesConstructor: require('./2015/SpeciesConstructor'),
	SplitMatch: require('./2015/SplitMatch'),
	StringCreate: require('./2015/StringCreate'),
	StringGetIndexProperty: require('./2015/StringGetIndexProperty'),
	SymbolDescriptiveString: require('./2015/SymbolDescriptiveString'),
	TestIntegrityLevel: require('./2015/TestIntegrityLevel'),
	thisBooleanValue: require('./2015/thisBooleanValue'),
	thisNumberValue: require('./2015/thisNumberValue'),
	thisStringValue: require('./2015/thisStringValue'),
	thisTimeValue: require('./2015/thisTimeValue'),
	TimeClip: require('./2015/TimeClip'),
	TimeFromYear: require('./2015/TimeFromYear'),
	TimeWithinDay: require('./2015/TimeWithinDay'),
	ToBoolean: require('./2015/ToBoolean'),
	ToDateString: require('./2015/ToDateString'),
	ToInt16: require('./2015/ToInt16'),
	ToInt32: require('./2015/ToInt32'),
	ToInt8: require('./2015/ToInt8'),
	ToInteger: require('./2015/ToInteger'),
	ToLength: require('./2015/ToLength'),
	ToNumber: require('./2015/ToNumber'),
	ToObject: require('./2015/ToObject'),
	ToPrimitive: require('./2015/ToPrimitive'),
	ToPropertyDescriptor: require('./2015/ToPropertyDescriptor'),
	ToPropertyKey: require('./2015/ToPropertyKey'),
	ToString: require('./2015/ToString'),
	ToUint16: require('./2015/ToUint16'),
	ToUint32: require('./2015/ToUint32'),
	ToUint8: require('./2015/ToUint8'),
	ToUint8Clamp: require('./2015/ToUint8Clamp'),
	Type: require('./2015/Type'),
	ValidateAndApplyPropertyDescriptor: require('./2015/ValidateAndApplyPropertyDescriptor'),
	WeekDay: require('./2015/WeekDay'),
	YearFromTime: require('./2015/YearFromTime')
};

module.exports = ES6;
'use strict';

/* eslint global-require: 0 */
// https://262.ecma-international.org/7.0/#sec-abstract-operations
var ES2016 = {
	'Abstract Equality Comparison': require('./2016/AbstractEqualityComparison'),
	'Abstract Relational Comparison': require('./2016/AbstractRelationalComparison'),
	'Strict Equality Comparison': require('./2016/StrictEqualityComparison'),
	abs: require('./2016/abs'),
	AdvanceStringIndex: require('./2016/AdvanceStringIndex'),
	ArrayCreate: require('./2016/ArrayCreate'),
	ArraySetLength: require('./2016/ArraySetLength'),
	ArraySpeciesCreate: require('./2016/ArraySpeciesCreate'),
	Call: require('./2016/Call'),
	CanonicalNumericIndexString: require('./2016/CanonicalNumericIndexString'),
	CharacterRange: require('./2016/CharacterRange'),
	CompletePropertyDescriptor: require('./2016/CompletePropertyDescriptor'),
	CreateDataProperty: require('./2016/CreateDataProperty'),
	CreateDataPropertyOrThrow: require('./2016/CreateDataPropertyOrThrow'),
	CreateHTML: require('./2016/CreateHTML'),
	CreateIterResultObject: require('./2016/CreateIterResultObject'),
	CreateListFromArrayLike: require('./2016/CreateListFromArrayLike'),
	CreateMethodProperty: require('./2016/CreateMethodProperty'),
	DateFromTime: require('./2016/DateFromTime'),
	Day: require('./2016/Day'),
	DayFromYear: require('./2016/DayFromYear'),
	DaysInYear: require('./2016/DaysInYear'),
	DayWithinYear: require('./2016/DayWithinYear'),
	DefinePropertyOrThrow: require('./2016/DefinePropertyOrThrow'),
	DeletePropertyOrThrow: require('./2016/DeletePropertyOrThrow'),
	EnumerableOwnNames: require('./2016/EnumerableOwnNames'),
	floor: require('./2016/floor'),
	FromPropertyDescriptor: require('./2016/FromPropertyDescriptor'),
	Get: require('./2016/Get'),
	GetIterator: require('./2016/GetIterator'),
	GetMethod: require('./2016/GetMethod'),
	GetOwnPropertyKeys: require('./2016/GetOwnPropertyKeys'),
	GetPrototypeFromConstructor: require('./2016/GetPrototypeFromConstructor'),
	GetSubstitution: require('./2016/GetSubstitution'),
	GetV: require('./2016/GetV'),
	HasOwnProperty: require('./2016/HasOwnProperty'),
	HasProperty: require('./2016/HasProperty'),
	HourFromTime: require('./2016/HourFromTime'),
	InLeapYear: require('./2016/InLeapYear'),
	InstanceofOperator: require('./2016/InstanceofOperator'),
	Invoke: require('./2016/Invoke'),
	IsAccessorDescriptor: require('./2016/IsAccessorDescriptor'),
	IsArray: require('./2016/IsArray'),
	IsCallable: require('./2016/IsCallable'),
	IsCompatiblePropertyDescriptor: require('./2016/IsCompatiblePropertyDescriptor'),
	IsConcatSpreadable: require('./2016/IsConcatSpreadable'),
	IsConstructor: require('./2016/IsConstructor'),
	IsDataDescriptor: require('./2016/IsDataDescriptor'),
	IsExtensible: require('./2016/IsExtensible'),
	IsGenericDescriptor: require('./2016/IsGenericDescriptor'),
	IsInteger: require('./2016/IsInteger'),
	IsPromise: require('./2016/IsPromise'),
	IsPropertyDescriptor: require('./2016/IsPropertyDescriptor'),
	IsPropertyKey: require('./2016/IsPropertyKey'),
	IsRegExp: require('./2016/IsRegExp'),
	IterableToArrayLike: require('./2016/IterableToArrayLike'),
	IteratorClose: require('./2016/IteratorClose'),
	IteratorComplete: require('./2016/IteratorComplete'),
	IteratorNext: require('./2016/IteratorNext'),
	IteratorStep: require('./2016/IteratorStep'),
	IteratorValue: require('./2016/IteratorValue'),
	MakeDate: require('./2016/MakeDate'),
	MakeDay: require('./2016/MakeDay'),
	MakeTime: require('./2016/MakeTime'),
	MinFromTime: require('./2016/MinFromTime'),
	modulo: require('./2016/modulo'),
	MonthFromTime: require('./2016/MonthFromTime'),
	msFromTime: require('./2016/msFromTime'),
	ObjectCreate: require('./2016/ObjectCreate'),
	ObjectDefineProperties: require('./2016/ObjectDefineProperties'),
	OrdinaryCreateFromConstructor: require('./2016/OrdinaryCreateFromConstructor'),
	OrdinaryDefineOwnProperty: require('./2016/OrdinaryDefineOwnProperty'),
	OrdinaryGetOwnProperty: require('./2016/OrdinaryGetOwnProperty'),
	OrdinaryGetPrototypeOf: require('./2016/OrdinaryGetPrototypeOf'),
	OrdinaryHasInstance: require('./2016/OrdinaryHasInstance'),
	OrdinaryHasProperty: require('./2016/OrdinaryHasProperty'),
	OrdinarySetPrototypeOf: require('./2016/OrdinarySetPrototypeOf'),
	QuoteJSONString: require('./2016/QuoteJSONString'),
	RegExpCreate: require('./2016/RegExpCreate'),
	RegExpExec: require('./2016/RegExpExec'),
	RequireObjectCoercible: require('./2016/RequireObjectCoercible'),
	SameValue: require('./2016/SameValue'),
	SameValueNonNumber: require('./2016/SameValueNonNumber'),
	SameValueZero: require('./2016/SameValueZero'),
	SecFromTime: require('./2016/SecFromTime'),
	Set: require('./2016/Set'),
	SetFunctionName: require('./2016/SetFunctionName'),
	SetIntegrityLevel: require('./2016/SetIntegrityLevel'),
	SpeciesConstructor: require('./2016/SpeciesConstructor'),
	SplitMatch: require('./2016/SplitMatch'),
	StringCreate: require('./2016/StringCreate'),
	SymbolDescriptiveString: require('./2016/SymbolDescriptiveString'),
	TestIntegrityLevel: require('./2016/TestIntegrityLevel'),
	thisBooleanValue: require('./2016/thisBooleanValue'),
	thisNumberValue: require('./2016/thisNumberValue'),
	thisStringValue: require('./2016/thisStringValue'),
	thisTimeValue: require('./2016/thisTimeValue'),
	TimeClip: require('./2016/TimeClip'),
	TimeFromYear: require('./2016/TimeFromYear'),
	TimeWithinDay: require('./2016/TimeWithinDay'),
	ToBoolean: require('./2016/ToBoolean'),
	ToDateString: require('./2016/ToDateString'),
	ToInt16: require('./2016/ToInt16'),
	ToInt32: require('./2016/ToInt32'),
	ToInt8: require('./2016/ToInt8'),
	ToInteger: require('./2016/ToInteger'),
	ToLength: require('./2016/ToLength'),
	ToNumber: require('./2016/ToNumber'),
	ToObject: require('./2016/ToObject'),
	ToPrimitive: require('./2016/ToPrimitive'),
	ToPropertyDescriptor: require('./2016/ToPropertyDescriptor'),
	ToPropertyKey: require('./2016/ToPropertyKey'),
	ToString: require('./2016/ToString'),
	ToUint16: require('./2016/ToUint16'),
	ToUint32: require('./2016/ToUint32'),
	ToUint8: require('./2016/ToUint8'),
	ToUint8Clamp: require('./2016/ToUint8Clamp'),
	Type: require('./2016/Type'),
	UTF16Decode: require('./2016/UTF16Decode'),
	UTF16Encoding: require('./2016/UTF16Encoding'),
	ValidateAndApplyPropertyDescriptor: require('./2016/ValidateAndApplyPropertyDescriptor'),
	WeekDay: require('./2016/WeekDay'),
	YearFromTime: require('./2016/YearFromTime')
};

module.exports = ES2016;
'use strict';

/* eslint global-require: 0 */
// https://262.ecma-international.org/8.0/#sec-abstract-operations
var ES2017 = {
	'Abstract Equality Comparison': require('./2017/AbstractEqualityComparison'),
	'Abstract Relational Comparison': require('./2017/AbstractRelationalComparison'),
	'Strict Equality Comparison': require('./2017/StrictEqualityComparison'),
	abs: require('./2017/abs'),
	AdvanceStringIndex: require('./2017/AdvanceStringIndex'),
	ArrayCreate: require('./2017/ArrayCreate'),
	ArraySetLength: require('./2017/ArraySetLength'),
	ArraySpeciesCreate: require('./2017/ArraySpeciesCreate'),
	Call: require('./2017/Call'),
	CanonicalNumericIndexString: require('./2017/CanonicalNumericIndexString'),
	CharacterRange: require('./2017/CharacterRange'),
	CompletePropertyDescriptor: require('./2017/CompletePropertyDescriptor'),
	CreateDataProperty: require('./2017/CreateDataProperty'),
	CreateDataPropertyOrThrow: require('./2017/CreateDataPropertyOrThrow'),
	CreateHTML: require('./2017/CreateHTML'),
	CreateIterResultObject: require('./2017/CreateIterResultObject'),
	CreateListFromArrayLike: require('./2017/CreateListFromArrayLike'),
	CreateMethodProperty: require('./2017/CreateMethodProperty'),
	DateFromTime: require('./2017/DateFromTime'),
	Day: require('./2017/Day'),
	DayFromYear: require('./2017/DayFromYear'),
	DaysInYear: require('./2017/DaysInYear'),
	DayWithinYear: require('./2017/DayWithinYear'),
	DefinePropertyOrThrow: require('./2017/DefinePropertyOrThrow'),
	DeletePropertyOrThrow: require('./2017/DeletePropertyOrThrow'),
	EnumerableOwnProperties: require('./2017/EnumerableOwnProperties'),
	floor: require('./2017/floor'),
	FromPropertyDescriptor: require('./2017/FromPropertyDescriptor'),
	Get: require('./2017/Get'),
	GetIterator: require('./2017/GetIterator'),
	GetMethod: require('./2017/GetMethod'),
	GetOwnPropertyKeys: require('./2017/GetOwnPropertyKeys'),
	GetPrototypeFromConstructor: require('./2017/GetPrototypeFromConstructor'),
	GetSubstitution: require('./2017/GetSubstitution'),
	GetV: require('./2017/GetV'),
	HasOwnProperty: require('./2017/HasOwnProperty'),
	HasProperty: require('./2017/HasProperty'),
	HourFromTime: require('./2017/HourFromTime'),
	InLeapYear: require('./2017/InLeapYear'),
	InstanceofOperator: require('./2017/InstanceofOperator'),
	Invoke: require('./2017/Invoke'),
	IsAccessorDescriptor: require('./2017/IsAccessorDescriptor'),
	IsArray: require('./2017/IsArray'),
	IsCallable: require('./2017/IsCallable'),
	IsCompatiblePropertyDescriptor: require('./2017/IsCompatiblePropertyDescriptor'),
	IsConcatSpreadable: require('./2017/IsConcatSpreadable'),
	IsConstructor: require('./2017/IsConstructor'),
	IsDataDescriptor: require('./2017/IsDataDescriptor'),
	IsExtensible: require('./2017/IsExtensible'),
	IsGenericDescriptor: require('./2017/IsGenericDescriptor'),
	IsInteger: require('./2017/IsInteger'),
	IsPromise: require('./2017/IsPromise'),
	IsPropertyDescriptor: require('./2017/IsPropertyDescriptor'),
	IsPropertyKey: require('./2017/IsPropertyKey'),
	IsRegExp: require('./2017/IsRegExp'),
	IsSharedArrayBuffer: require('./2017/IsSharedArrayBuffer'),
	IterableToList: require('./2017/IterableToList'),
	IteratorClose: require('./2017/IteratorClose'),
	IteratorComplete: require('./2017/IteratorComplete'),
	IteratorNext: require('./2017/IteratorNext'),
	IteratorStep: require('./2017/IteratorStep'),
	IteratorValue: require('./2017/IteratorValue'),
	MakeDate: require('./2017/MakeDate'),
	MakeDay: require('./2017/MakeDay'),
	MakeTime: require('./2017/MakeTime'),
	MinFromTime: require('./2017/MinFromTime'),
	modulo: require('./2017/modulo'),
	MonthFromTime: require('./2017/MonthFromTime'),
	msFromTime: require('./2017/msFromTime'),
	ObjectCreate: require('./2017/ObjectCreate'),
	ObjectDefineProperties: require('./2017/ObjectDefineProperties'),
	OrdinaryCreateFromConstructor: require('./2017/OrdinaryCreateFromConstructor'),
	OrdinaryDefineOwnProperty: require('./2017/OrdinaryDefineOwnProperty'),
	OrdinaryGetOwnProperty: require('./2017/OrdinaryGetOwnProperty'),
	OrdinaryGetPrototypeOf: require('./2017/OrdinaryGetPrototypeOf'),
	OrdinaryHasInstance: require('./2017/OrdinaryHasInstance'),
	OrdinaryHasProperty: require('./2017/OrdinaryHasProperty'),
	OrdinarySetPrototypeOf: require('./2017/OrdinarySetPrototypeOf'),
	OrdinaryToPrimitive: require('./2017/OrdinaryToPrimitive'),
	QuoteJSONString: require('./2017/QuoteJSONString'),
	RegExpCreate: require('./2017/RegExpCreate'),
	RegExpExec: require('./2017/RegExpExec'),
	RequireObjectCoercible: require('./2017/RequireObjectCoercible'),
	SameValue: require('./2017/SameValue'),
	SameValueNonNumber: require('./2017/SameValueNonNumber'),
	SameValueZero: require('./2017/SameValueZero'),
	SecFromTime: require('./2017/SecFromTime'),
	Set: require('./2017/Set'),
	SetFunctionName: require('./2017/SetFunctionName'),
	SetIntegrityLevel: require('./2017/SetIntegrityLevel'),
	SpeciesConstructor: require('./2017/SpeciesConstructor'),
	SplitMatch: require('./2017/SplitMatch'),
	StringCreate: require('./2017/StringCreate'),
	StringGetOwnProperty: require('./2017/StringGetOwnProperty'),
	SymbolDescriptiveString: require('./2017/SymbolDescriptiveString'),
	TestIntegrityLevel: require('./2017/TestIntegrityLevel'),
	thisBooleanValue: require('./2017/thisBooleanValue'),
	thisNumberValue: require('./2017/thisNumberValue'),
	thisStringValue: require('./2017/thisStringValue'),
	thisTimeValue: require('./2017/thisTimeValue'),
	TimeClip: require('./2017/TimeClip'),
	TimeFromYear: require('./2017/TimeFromYear'),
	TimeWithinDay: require('./2017/TimeWithinDay'),
	ToBoolean: require('./2017/ToBoolean'),
	ToDateString: require('./2017/ToDateString'),
	ToIndex: require('./2017/ToIndex'),
	ToInt16: require('./2017/ToInt16'),
	ToInt32: require('./2017/ToInt32'),
	ToInt8: require('./2017/ToInt8'),
	ToInteger: require('./2017/ToInteger'),
	ToLength: require('./2017/ToLength'),
	ToNumber: require('./2017/ToNumber'),
	ToObject: require('./2017/ToObject'),
	ToPrimitive: require('./2017/ToPrimitive'),
	ToPropertyDescriptor: require('./2017/ToPropertyDescriptor'),
	ToPropertyKey: require('./2017/ToPropertyKey'),
	ToString: require('./2017/ToString'),
	ToUint16: require('./2017/ToUint16'),
	ToUint32: require('./2017/ToUint32'),
	ToUint8: require('./2017/ToUint8'),
	ToUint8Clamp: require('./2017/ToUint8Clamp'),
	Type: require('./2017/Type'),
	UTF16Decode: require('./2017/UTF16Decode'),
	UTF16Encoding: require('./2017/UTF16Encoding'),
	ValidateAndApplyPropertyDescriptor: require('./2017/ValidateAndApplyPropertyDescriptor'),
	WeekDay: require('./2017/WeekDay'),
	YearFromTime: require('./2017/YearFromTime')
};

module.exports = ES2017;
'use strict';

/* eslint global-require: 0 */
// https://262.ecma-international.org/9.0/#sec-abstract-operations
var ES2018 = {
	'Abstract Equality Comparison': require('./2018/AbstractEqualityComparison'),
	'Abstract Relational Comparison': require('./2018/AbstractRelationalComparison'),
	'Strict Equality Comparison': require('./2018/StrictEqualityComparison'),
	abs: require('./2018/abs'),
	AdvanceStringIndex: require('./2018/AdvanceStringIndex'),
	ArrayCreate: require('./2018/ArrayCreate'),
	ArraySetLength: require('./2018/ArraySetLength'),
	ArraySpeciesCreate: require('./2018/ArraySpeciesCreate'),
	Call: require('./2018/Call'),
	CanonicalNumericIndexString: require('./2018/CanonicalNumericIndexString'),
	CharacterRange: require('./2018/CharacterRange'),
	CompletePropertyDescriptor: require('./2018/CompletePropertyDescriptor'),
	CopyDataProperties: require('./2018/CopyDataProperties'),
	CreateDataProperty: require('./2018/CreateDataProperty'),
	CreateDataPropertyOrThrow: require('./2018/CreateDataPropertyOrThrow'),
	CreateHTML: require('./2018/CreateHTML'),
	CreateIterResultObject: require('./2018/CreateIterResultObject'),
	CreateListFromArrayLike: require('./2018/CreateListFromArrayLike'),
	CreateMethodProperty: require('./2018/CreateMethodProperty'),
	DateFromTime: require('./2018/DateFromTime'),
	DateString: require('./2018/DateString'),
	Day: require('./2018/Day'),
	DayFromYear: require('./2018/DayFromYear'),
	DaysInYear: require('./2018/DaysInYear'),
	DayWithinYear: require('./2018/DayWithinYear'),
	DefinePropertyOrThrow: require('./2018/DefinePropertyOrThrow'),
	DeletePropertyOrThrow: require('./2018/DeletePropertyOrThrow'),
	EnumerableOwnPropertyNames: require('./2018/EnumerableOwnPropertyNames'),
	floor: require('./2018/floor'),
	FromPropertyDescriptor: require('./2018/FromPropertyDescriptor'),
	Get: require('./2018/Get'),
	GetIterator: require('./2018/GetIterator'),
	GetMethod: require('./2018/GetMethod'),
	GetOwnPropertyKeys: require('./2018/GetOwnPropertyKeys'),
	GetPrototypeFromConstructor: require('./2018/GetPrototypeFromConstructor'),
	GetSubstitution: require('./2018/GetSubstitution'),
	GetV: require('./2018/GetV'),
	HasOwnProperty: require('./2018/HasOwnProperty'),
	HasProperty: require('./2018/HasProperty'),
	HourFromTime: require('./2018/HourFromTime'),
	InLeapYear: require('./2018/InLeapYear'),
	InstanceofOperator: require('./2018/InstanceofOperator'),
	Invoke: require('./2018/Invoke'),
	IsAccessorDescriptor: require('./2018/IsAccessorDescriptor'),
	IsArray: require('./2018/IsArray'),
	IsCallable: require('./2018/IsCallable'),
	IsCompatiblePropertyDescriptor: require('./2018/IsCompatiblePropertyDescriptor'),
	IsConcatSpreadable: require('./2018/IsConcatSpreadable'),
	IsConstructor: require('./2018/IsConstructor'),
	IsDataDescriptor: require('./2018/IsDataDescriptor'),
	IsExtensible: require('./2018/IsExtensible'),
	IsGenericDescriptor: require('./2018/IsGenericDescriptor'),
	IsInteger: require('./2018/IsInteger'),
	IsPromise: require('./2018/IsPromise'),
	IsPropertyKey: require('./2018/IsPropertyKey'),
	IsRegExp: require('./2018/IsRegExp'),
	IsSharedArrayBuffer: require('./2018/IsSharedArrayBuffer'),
	IsStringPrefix: require('./2018/IsStringPrefix'),
	IterableToList: require('./2018/IterableToList'),
	IteratorClose: require('./2018/IteratorClose'),
	IteratorComplete: require('./2018/IteratorComplete'),
	IteratorNext: require('./2018/IteratorNext'),
	IteratorStep: require('./2018/IteratorStep'),
	IteratorValue: require('./2018/IteratorValue'),
	MakeDate: require('./2018/MakeDate'),
	MakeDay: require('./2018/MakeDay'),
	MakeTime: require('./2018/MakeTime'),
	MinFromTime: require('./2018/MinFromTime'),
	modulo: require('./2018/modulo'),
	MonthFromTime: require('./2018/MonthFromTime'),
	msFromTime: require('./2018/msFromTime'),
	NumberToString: require('./2018/NumberToString'),
	ObjectCreate: require('./2018/ObjectCreate'),
	ObjectDefineProperties: require('./2018/ObjectDefineProperties'),
	OrdinaryCreateFromConstructor: require('./2018/OrdinaryCreateFromConstructor'),
	OrdinaryDefineOwnProperty: require('./2018/OrdinaryDefineOwnProperty'),
	OrdinaryGetOwnProperty: require('./2018/OrdinaryGetOwnProperty'),
	OrdinaryGetPrototypeOf: require('./2018/OrdinaryGetPrototypeOf'),
	OrdinaryHasInstance: require('./2018/OrdinaryHasInstance'),
	OrdinaryHasProperty: require('./2018/OrdinaryHasProperty'),
	OrdinarySetPrototypeOf: require('./2018/OrdinarySetPrototypeOf'),
	OrdinaryToPrimitive: require('./2018/OrdinaryToPrimitive'),
	PromiseResolve: require('./2018/PromiseResolve'),
	QuoteJSONString: require('./2018/QuoteJSONString'),
	RegExpCreate: require('./2018/RegExpCreate'),
	RegExpExec: require('./2018/RegExpExec'),
	RequireObjectCoercible: require('./2018/RequireObjectCoercible'),
	SameValue: require('./2018/SameValue'),
	SameValueNonNumber: require('./2018/SameValueNonNumber'),
	SameValueZero: require('./2018/SameValueZero'),
	SecFromTime: require('./2018/SecFromTime'),
	Set: require('./2018/Set'),
	SetFunctionLength: require('./2018/SetFunctionLength'),
	SetFunctionName: require('./2018/SetFunctionName'),
	SetIntegrityLevel: require('./2018/SetIntegrityLevel'),
	SpeciesConstructor: require('./2018/SpeciesConstructor'),
	SplitMatch: require('./2018/SplitMatch'),
	StringCreate: require('./2018/StringCreate'),
	StringGetOwnProperty: require('./2018/StringGetOwnProperty'),
	SymbolDescriptiveString: require('./2018/SymbolDescriptiveString'),
	TestIntegrityLevel: require('./2018/TestIntegrityLevel'),
	thisBooleanValue: require('./2018/thisBooleanValue'),
	thisNumberValue: require('./2018/thisNumberValue'),
	thisStringValue: require('./2018/thisStringValue'),
	thisSymbolValue: require('./2018/thisSymbolValue'),
	thisTimeValue: require('./2018/thisTimeValue'),
	TimeClip: require('./2018/TimeClip'),
	TimeFromYear: require('./2018/TimeFromYear'),
	TimeString: require('./2018/TimeString'),
	TimeWithinDay: require('./2018/TimeWithinDay'),
	ToBoolean: require('./2018/ToBoolean'),
	ToDateString: require('./2018/ToDateString'),
	ToIndex: require('./2018/ToIndex'),
	ToInt16: require('./2018/ToInt16'),
	ToInt32: require('./2018/ToInt32'),
	ToInt8: require('./2018/ToInt8'),
	ToInteger: require('./2018/ToInteger'),
	ToLength: require('./2018/ToLength'),
	ToNumber: require('./2018/ToNumber'),
	ToObject: require('./2018/ToObject'),
	ToPrimitive: require('./2018/ToPrimitive'),
	ToPropertyDescriptor: require('./2018/ToPropertyDescriptor'),
	ToPropertyKey: require('./2018/ToPropertyKey'),
	ToString: require('./2018/ToString'),
	ToUint16: require('./2018/ToUint16'),
	ToUint32: require('./2018/ToUint32'),
	ToUint8: require('./2018/ToUint8'),
	ToUint8Clamp: require('./2018/ToUint8Clamp'),
	Type: require('./2018/Type'),
	UnicodeEscape: require('./2018/UnicodeEscape'),
	UTF16Decode: require('./2018/UTF16Decode'),
	UTF16Encoding: require('./2018/UTF16Encoding'),
	ValidateAndApplyPropertyDescriptor: require('./2018/ValidateAndApplyPropertyDescriptor'),
	WeekDay: require('./2018/WeekDay'),
	YearFromTime: require('./2018/YearFromTime')
};

module.exports = ES2018;
'use strict';

/* eslint global-require: 0 */
// https://262.ecma-international.org/10.0/#sec-abstract-operations
var ES2019 = {
	'Abstract Equality Comparison': require('./2019/AbstractEqualityComparison'),
	'Abstract Relational Comparison': require('./2019/AbstractRelationalComparison'),
	'Strict Equality Comparison': require('./2019/StrictEqualityComparison'),
	abs: require('./2019/abs'),
	AddEntriesFromIterable: require('./2019/AddEntriesFromIterable'),
	AdvanceStringIndex: require('./2019/AdvanceStringIndex'),
	ArrayCreate: require('./2019/ArrayCreate'),
	ArraySetLength: require('./2019/ArraySetLength'),
	ArraySpeciesCreate: require('./2019/ArraySpeciesCreate'),
	Call: require('./2019/Call'),
	CanonicalNumericIndexString: require('./2019/CanonicalNumericIndexString'),
	CharacterRange: require('./2019/CharacterRange'),
	CompletePropertyDescriptor: require('./2019/CompletePropertyDescriptor'),
	CopyDataProperties: require('./2019/CopyDataProperties'),
	CreateDataProperty: require('./2019/CreateDataProperty'),
	CreateDataPropertyOrThrow: require('./2019/CreateDataPropertyOrThrow'),
	CreateHTML: require('./2019/CreateHTML'),
	CreateIterResultObject: require('./2019/CreateIterResultObject'),
	CreateListFromArrayLike: require('./2019/CreateListFromArrayLike'),
	CreateMethodProperty: require('./2019/CreateMethodProperty'),
	DateFromTime: require('./2019/DateFromTime'),
	DateString: require('./2019/DateString'),
	Day: require('./2019/Day'),
	DayFromYear: require('./2019/DayFromYear'),
	DaysInYear: require('./2019/DaysInYear'),
	DayWithinYear: require('./2019/DayWithinYear'),
	DefinePropertyOrThrow: require('./2019/DefinePropertyOrThrow'),
	DeletePropertyOrThrow: require('./2019/DeletePropertyOrThrow'),
	EnumerableOwnPropertyNames: require('./2019/EnumerableOwnPropertyNames'),
	FlattenIntoArray: require('./2019/FlattenIntoArray'),
	floor: require('./2019/floor'),
	FromPropertyDescriptor: require('./2019/FromPropertyDescriptor'),
	Get: require('./2019/Get'),
	GetIterator: require('./2019/GetIterator'),
	GetMethod: require('./2019/GetMethod'),
	GetOwnPropertyKeys: require('./2019/GetOwnPropertyKeys'),
	GetPrototypeFromConstructor: require('./2019/GetPrototypeFromConstructor'),
	GetSubstitution: require('./2019/GetSubstitution'),
	GetV: require('./2019/GetV'),
	HasOwnProperty: require('./2019/HasOwnProperty'),
	HasProperty: require('./2019/HasProperty'),
	HourFromTime: require('./2019/HourFromTime'),
	InLeapYear: require('./2019/InLeapYear'),
	InstanceofOperator: require('./2019/InstanceofOperator'),
	Invoke: require('./2019/Invoke'),
	IsAccessorDescriptor: require('./2019/IsAccessorDescriptor'),
	IsArray: require('./2019/IsArray'),
	IsCallable: require('./2019/IsCallable'),
	IsCompatiblePropertyDescriptor: require('./2019/IsCompatiblePropertyDescriptor'),
	IsConcatSpreadable: require('./2019/IsConcatSpreadable'),
	IsConstructor: require('./2019/IsConstructor'),
	IsDataDescriptor: require('./2019/IsDataDescriptor'),
	IsExtensible: require('./2019/IsExtensible'),
	IsGenericDescriptor: require('./2019/IsGenericDescriptor'),
	IsInteger: require('./2019/IsInteger'),
	IsPromise: require('./2019/IsPromise'),
	IsPropertyKey: require('./2019/IsPropertyKey'),
	IsRegExp: require('./2019/IsRegExp'),
	IsSharedArrayBuffer: require('./2019/IsSharedArrayBuffer'),
	IsStringPrefix: require('./2019/IsStringPrefix'),
	IterableToList: require('./2019/IterableToList'),
	IteratorClose: require('./2019/IteratorClose'),
	IteratorComplete: require('./2019/IteratorComplete'),
	IteratorNext: require('./2019/IteratorNext'),
	IteratorStep: require('./2019/IteratorStep'),
	IteratorValue: require('./2019/IteratorValue'),
	MakeDate: require('./2019/MakeDate'),
	MakeDay: require('./2019/MakeDay'),
	MakeTime: require('./2019/MakeTime'),
	MinFromTime: require('./2019/MinFromTime'),
	modulo: require('./2019/modulo'),
	MonthFromTime: require('./2019/MonthFromTime'),
	msFromTime: require('./2019/msFromTime'),
	NumberToString: require('./2019/NumberToString'),
	ObjectCreate: require('./2019/ObjectCreate'),
	ObjectDefineProperties: require('./2019/ObjectDefineProperties'),
	OrdinaryCreateFromConstructor: require('./2019/OrdinaryCreateFromConstructor'),
	OrdinaryDefineOwnProperty: require('./2019/OrdinaryDefineOwnProperty'),
	OrdinaryGetOwnProperty: require('./2019/OrdinaryGetOwnProperty'),
	OrdinaryGetPrototypeOf: require('./2019/OrdinaryGetPrototypeOf'),
	OrdinaryHasInstance: require('./2019/OrdinaryHasInstance'),
	OrdinaryHasProperty: require('./2019/OrdinaryHasProperty'),
	OrdinarySetPrototypeOf: require('./2019/OrdinarySetPrototypeOf'),
	OrdinaryToPrimitive: require('./2019/OrdinaryToPrimitive'),
	PromiseResolve: require('./2019/PromiseResolve'),
	QuoteJSONString: require('./2019/QuoteJSONString'),
	RegExpCreate: require('./2019/RegExpCreate'),
	RegExpExec: require('./2019/RegExpExec'),
	RequireObjectCoercible: require('./2019/RequireObjectCoercible'),
	SameValue: require('./2019/SameValue'),
	SameValueNonNumber: require('./2019/SameValueNonNumber'),
	SameValueZero: require('./2019/SameValueZero'),
	SecFromTime: require('./2019/SecFromTime'),
	Set: require('./2019/Set'),
	SetFunctionLength: require('./2019/SetFunctionLength'),
	SetFunctionName: require('./2019/SetFunctionName'),
	SetIntegrityLevel: require('./2019/SetIntegrityLevel'),
	SpeciesConstructor: require('./2019/SpeciesConstructor'),
	SplitMatch: require('./2019/SplitMatch'),
	StringCreate: require('./2019/StringCreate'),
	StringGetOwnProperty: require('./2019/StringGetOwnProperty'),
	SymbolDescriptiveString: require('./2019/SymbolDescriptiveString'),
	TestIntegrityLevel: require('./2019/TestIntegrityLevel'),
	thisBooleanValue: require('./2019/thisBooleanValue'),
	thisNumberValue: require('./2019/thisNumberValue'),
	thisStringValue: require('./2019/thisStringValue'),
	thisSymbolValue: require('./2019/thisSymbolValue'),
	thisTimeValue: require('./2019/thisTimeValue'),
	TimeClip: require('./2019/TimeClip'),
	TimeFromYear: require('./2019/TimeFromYear'),
	TimeString: require('./2019/TimeString'),
	TimeWithinDay: require('./2019/TimeWithinDay'),
	ToBoolean: require('./2019/ToBoolean'),
	ToDateString: require('./2019/ToDateString'),
	ToIndex: require('./2019/ToIndex'),
	ToInt16: require('./2019/ToInt16'),
	ToInt32: require('./2019/ToInt32'),
	ToInt8: require('./2019/ToInt8'),
	ToInteger: require('./2019/ToInteger'),
	ToLength: require('./2019/ToLength'),
	ToNumber: require('./2019/ToNumber'),
	ToObject: require('./2019/ToObject'),
	ToPrimitive: require('./2019/ToPrimitive'),
	ToPropertyDescriptor: require('./2019/ToPropertyDescriptor'),
	ToPropertyKey: require('./2019/ToPropertyKey'),
	ToString: require('./2019/ToString'),
	ToUint16: require('./2019/ToUint16'),
	ToUint32: require('./2019/ToUint32'),
	ToUint8: require('./2019/ToUint8'),
	ToUint8Clamp: require('./2019/ToUint8Clamp'),
	TrimString: require('./2019/TrimString'),
	Type: require('./2019/Type'),
	UnicodeEscape: require('./2019/UnicodeEscape'),
	UTF16Decode: require('./2019/UTF16Decode'),
	UTF16Encoding: require('./2019/UTF16Encoding'),
	ValidateAndApplyPropertyDescriptor: require('./2019/ValidateAndApplyPropertyDescriptor'),
	WeekDay: require('./2019/WeekDay'),
	YearFromTime: require('./2019/YearFromTime')
};

module.exports = ES2019;
'use strict';

/* eslint global-require: 0 */
// https://ecma-international.org/ecma-262/11.0/#sec-abstract-operations
var ES2020 = {
	'Abstract Equality Comparison': require('./2020/AbstractEqualityComparison'),
	'Abstract Relational Comparison': require('./2020/AbstractRelationalComparison'),
	'Strict Equality Comparison': require('./2020/StrictEqualityComparison'),
	abs: require('./2020/abs'),
	AddEntriesFromIterable: require('./2020/AddEntriesFromIterable'),
	AdvanceStringIndex: require('./2020/AdvanceStringIndex'),
	ArrayCreate: require('./2020/ArrayCreate'),
	ArraySetLength: require('./2020/ArraySetLength'),
	ArraySpeciesCreate: require('./2020/ArraySpeciesCreate'),
	BigInt: require('./2020/BigInt'),
	BigIntBitwiseOp: require('./2020/BigIntBitwiseOp'),
	BinaryAnd: require('./2020/BinaryAnd'),
	BinaryOr: require('./2020/BinaryOr'),
	BinaryXor: require('./2020/BinaryXor'),
	Call: require('./2020/Call'),
	CanonicalNumericIndexString: require('./2020/CanonicalNumericIndexString'),
	CharacterRange: require('./2020/CharacterRange'),
	CodePointAt: require('./2020/CodePointAt'),
	CompletePropertyDescriptor: require('./2020/CompletePropertyDescriptor'),
	CopyDataProperties: require('./2020/CopyDataProperties'),
	CreateDataProperty: require('./2020/CreateDataProperty'),
	CreateDataPropertyOrThrow: require('./2020/CreateDataPropertyOrThrow'),
	CreateHTML: require('./2020/CreateHTML'),
	CreateIterResultObject: require('./2020/CreateIterResultObject'),
	CreateListFromArrayLike: require('./2020/CreateListFromArrayLike'),
	CreateMethodProperty: require('./2020/CreateMethodProperty'),
	CreateRegExpStringIterator: require('./2020/CreateRegExpStringIterator'),
	DateFromTime: require('./2020/DateFromTime'),
	DateString: require('./2020/DateString'),
	Day: require('./2020/Day'),
	DayFromYear: require('./2020/DayFromYear'),
	DaysInYear: require('./2020/DaysInYear'),
	DayWithinYear: require('./2020/DayWithinYear'),
	DefinePropertyOrThrow: require('./2020/DefinePropertyOrThrow'),
	DeletePropertyOrThrow: require('./2020/DeletePropertyOrThrow'),
	EnumerableOwnPropertyNames: require('./2020/EnumerableOwnPropertyNames'),
	FlattenIntoArray: require('./2020/FlattenIntoArray'),
	floor: require('./2020/floor'),
	FromPropertyDescriptor: require('./2020/FromPropertyDescriptor'),
	Get: require('./2020/Get'),
	GetIterator: require('./2020/GetIterator'),
	GetMethod: require('./2020/GetMethod'),
	GetOwnPropertyKeys: require('./2020/GetOwnPropertyKeys'),
	GetPrototypeFromConstructor: require('./2020/GetPrototypeFromConstructor'),
	GetSubstitution: require('./2020/GetSubstitution'),
	GetV: require('./2020/GetV'),
	HasOwnProperty: require('./2020/HasOwnProperty'),
	HasProperty: require('./2020/HasProperty'),
	HourFromTime: require('./2020/HourFromTime'),
	InLeapYear: require('./2020/InLeapYear'),
	InstanceofOperator: require('./2020/InstanceofOperator'),
	Invoke: require('./2020/Invoke'),
	IsAccessorDescriptor: require('./2020/IsAccessorDescriptor'),
	IsArray: require('./2020/IsArray'),
	IsBigIntElementType: require('./2020/IsBigIntElementType'),
	IsCallable: require('./2020/IsCallable'),
	IsCompatiblePropertyDescriptor: require('./2020/IsCompatiblePropertyDescriptor'),
	IsConcatSpreadable: require('./2020/IsConcatSpreadable'),
	IsConstructor: require('./2020/IsConstructor'),
	IsDataDescriptor: require('./2020/IsDataDescriptor'),
	IsExtensible: require('./2020/IsExtensible'),
	IsGenericDescriptor: require('./2020/IsGenericDescriptor'),
	IsInteger: require('./2020/IsInteger'),
	IsNonNegativeInteger: require('./2020/IsNonNegativeInteger'),
	IsNoTearConfiguration: require('./2020/IsNoTearConfiguration'),
	IsPromise: require('./2020/IsPromise'),
	IsPropertyKey: require('./2020/IsPropertyKey'),
	IsRegExp: require('./2020/IsRegExp'),
	IsSharedArrayBuffer: require('./2020/IsSharedArrayBuffer'),
	IsStringPrefix: require('./2020/IsStringPrefix'),
	IsUnclampedIntegerElementType: require('./2020/IsUnclampedIntegerElementType'),
	IsUnsignedElementType: require('./2020/IsUnsignedElementType'),
	IterableToList: require('./2020/IterableToList'),
	IteratorClose: require('./2020/IteratorClose'),
	IteratorComplete: require('./2020/IteratorComplete'),
	IteratorNext: require('./2020/IteratorNext'),
	IteratorStep: require('./2020/IteratorStep'),
	IteratorValue: require('./2020/IteratorValue'),
	LengthOfArrayLike: require('./2020/LengthOfArrayLike'),
	MakeDate: require('./2020/MakeDate'),
	MakeDay: require('./2020/MakeDay'),
	MakeTime: require('./2020/MakeTime'),
	MinFromTime: require('./2020/MinFromTime'),
	modulo: require('./2020/modulo'),
	MonthFromTime: require('./2020/MonthFromTime'),
	msFromTime: require('./2020/msFromTime'),
	Number: require('./2020/Number'),
	NumberBitwiseOp: require('./2020/NumberBitwiseOp'),
	NumberToBigInt: require('./2020/NumberToBigInt'),
	ObjectDefineProperties: require('./2020/ObjectDefineProperties'),
	OrdinaryCreateFromConstructor: require('./2020/OrdinaryCreateFromConstructor'),
	OrdinaryDefineOwnProperty: require('./2020/OrdinaryDefineOwnProperty'),
	OrdinaryGetOwnProperty: require('./2020/OrdinaryGetOwnProperty'),
	OrdinaryGetPrototypeOf: require('./2020/OrdinaryGetPrototypeOf'),
	OrdinaryHasInstance: require('./2020/OrdinaryHasInstance'),
	OrdinaryHasProperty: require('./2020/OrdinaryHasProperty'),
	OrdinaryObjectCreate: require('./2020/OrdinaryObjectCreate'),
	OrdinarySetPrototypeOf: require('./2020/OrdinarySetPrototypeOf'),
	OrdinaryToPrimitive: require('./2020/OrdinaryToPrimitive'),
	PromiseResolve: require('./2020/PromiseResolve'),
	QuoteJSONString: require('./2020/QuoteJSONString'),
	RegExpCreate: require('./2020/RegExpCreate'),
	RegExpExec: require('./2020/RegExpExec'),
	RequireObjectCoercible: require('./2020/RequireObjectCoercible'),
	SameValue: require('./2020/SameValue'),
	SameValueNonNumeric: require('./2020/SameValueNonNumeric'),
	SameValueZero: require('./2020/SameValueZero'),
	SecFromTime: require('./2020/SecFromTime'),
	Set: require('./2020/Set'),
	SetFunctionLength: require('./2020/SetFunctionLength'),
	SetFunctionName: require('./2020/SetFunctionName'),
	SetIntegrityLevel: require('./2020/SetIntegrityLevel'),
	SpeciesConstructor: require('./2020/SpeciesConstructor'),
	SplitMatch: require('./2020/SplitMatch'),
	StringCreate: require('./2020/StringCreate'),
	StringGetOwnProperty: require('./2020/StringGetOwnProperty'),
	StringPad: require('./2020/StringPad'),
	StringToBigInt: require('./2020/StringToBigInt'),
	SymbolDescriptiveString: require('./2020/SymbolDescriptiveString'),
	TestIntegrityLevel: require('./2020/TestIntegrityLevel'),
	thisBigIntValue: require('./2020/thisBigIntValue'),
	thisBooleanValue: require('./2020/thisBooleanValue'),
	thisNumberValue: require('./2020/thisNumberValue'),
	thisStringValue: require('./2020/thisStringValue'),
	thisSymbolValue: require('./2020/thisSymbolValue'),
	thisTimeValue: require('./2020/thisTimeValue'),
	TimeClip: require('./2020/TimeClip'),
	TimeFromYear: require('./2020/TimeFromYear'),
	TimeString: require('./2020/TimeString'),
	TimeWithinDay: require('./2020/TimeWithinDay'),
	ToBigInt: require('./2020/ToBigInt'),
	ToBigInt64: require('./2020/ToBigInt64'),
	ToBigUint64: require('./2020/ToBigUint64'),
	ToBoolean: require('./2020/ToBoolean'),
	ToDateString: require('./2020/ToDateString'),
	ToIndex: require('./2020/ToIndex'),
	ToInt16: require('./2020/ToInt16'),
	ToInt32: require('./2020/ToInt32'),
	ToInt8: require('./2020/ToInt8'),
	ToInteger: require('./2020/ToInteger'),
	ToLength: require('./2020/ToLength'),
	ToNumber: require('./2020/ToNumber'),
	ToNumeric: require('./2020/ToNumeric'),
	ToObject: require('./2020/ToObject'),
	ToPrimitive: require('./2020/ToPrimitive'),
	ToPropertyDescriptor: require('./2020/ToPropertyDescriptor'),
	ToPropertyKey: require('./2020/ToPropertyKey'),
	ToString: require('./2020/ToString'),
	ToUint16: require('./2020/ToUint16'),
	ToUint32: require('./2020/ToUint32'),
	ToUint8: require('./2020/ToUint8'),
	ToUint8Clamp: require('./2020/ToUint8Clamp'),
	TrimString: require('./2020/TrimString'),
	Type: require('./2020/Type'),
	UnicodeEscape: require('./2020/UnicodeEscape'),
	UTF16DecodeString: require('./2020/UTF16DecodeString'),
	UTF16DecodeSurrogatePair: require('./2020/UTF16DecodeSurrogatePair'),
	UTF16Encoding: require('./2020/UTF16Encoding'),
	ValidateAndApplyPropertyDescriptor: require('./2020/ValidateAndApplyPropertyDescriptor'),
	WeekDay: require('./2020/WeekDay'),
	YearFromTime: require('./2020/YearFromTime')
};

module.exports = ES2020;
'use strict';

/* eslint global-require: 0 */
// https://www.ecma-international.org/ecma-262/12.0/#sec-abstract-operations
var ES2021 = {
	'Abstract Equality Comparison': require('./2021/AbstractEqualityComparison'),
	'Abstract Relational Comparison': require('./2021/AbstractRelationalComparison'),
	'Strict Equality Comparison': require('./2021/StrictEqualityComparison'),
	abs: require('./2021/abs'),
	AddEntriesFromIterable: require('./2021/AddEntriesFromIterable'),
	AddToKeptObjects: require('./2021/AddToKeptObjects'),
	AdvanceStringIndex: require('./2021/AdvanceStringIndex'),
	ApplyStringOrNumericBinaryOperator: require('./2021/ApplyStringOrNumericBinaryOperator'),
	ArrayCreate: require('./2021/ArrayCreate'),
	ArraySetLength: require('./2021/ArraySetLength'),
	ArraySpeciesCreate: require('./2021/ArraySpeciesCreate'),
	BigInt: require('./2021/BigInt'),
	BigIntBitwiseOp: require('./2021/BigIntBitwiseOp'),
	BinaryAnd: require('./2021/BinaryAnd'),
	BinaryOr: require('./2021/BinaryOr'),
	BinaryXor: require('./2021/BinaryXor'),
	ByteListBitwiseOp: require('./2021/ByteListBitwiseOp'),
	ByteListEqual: require('./2021/ByteListEqual'),
	Call: require('./2021/Call'),
	CanonicalNumericIndexString: require('./2021/CanonicalNumericIndexString'),
	CharacterRange: require('./2021/CharacterRange'),
	clamp: require('./2021/clamp'),
	substring: require('./2021/substring'),
	ClearKeptObjects: require('./2021/ClearKeptObjects'),
	CodePointAt: require('./2021/CodePointAt'),
	CodePointsToString: require('./2021/CodePointsToString'),
	CompletePropertyDescriptor: require('./2021/CompletePropertyDescriptor'),
	CopyDataProperties: require('./2021/CopyDataProperties'),
	CreateDataProperty: require('./2021/CreateDataProperty'),
	CreateDataPropertyOrThrow: require('./2021/CreateDataPropertyOrThrow'),
	CreateHTML: require('./2021/CreateHTML'),
	CreateIterResultObject: require('./2021/CreateIterResultObject'),
	CreateListFromArrayLike: require('./2021/CreateListFromArrayLike'),
	CreateMethodProperty: require('./2021/CreateMethodProperty'),
	CreateRegExpStringIterator: require('./2021/CreateRegExpStringIterator'),
	DateFromTime: require('./2021/DateFromTime'),
	DateString: require('./2021/DateString'),
	Day: require('./2021/Day'),
	DayFromYear: require('./2021/DayFromYear'),
	DaysInYear: require('./2021/DaysInYear'),
	DayWithinYear: require('./2021/DayWithinYear'),
	DefinePropertyOrThrow: require('./2021/DefinePropertyOrThrow'),
	DeletePropertyOrThrow: require('./2021/DeletePropertyOrThrow'),
	EnumerableOwnPropertyNames: require('./2021/EnumerableOwnPropertyNames'),
	FlattenIntoArray: require('./2021/FlattenIntoArray'),
	floor: require('./2021/floor'),
	FromPropertyDescriptor: require('./2021/FromPropertyDescriptor'),
	Get: require('./2021/Get'),
	GetIterator: require('./2021/GetIterator'),
	GetMethod: require('./2021/GetMethod'),
	GetOwnPropertyKeys: require('./2021/GetOwnPropertyKeys'),
	GetPromiseResolve: require('./2021/GetPromiseResolve'),
	GetPrototypeFromConstructor: require('./2021/GetPrototypeFromConstructor'),
	GetSubstitution: require('./2021/GetSubstitution'),
	GetV: require('./2021/GetV'),
	HasOwnProperty: require('./2021/HasOwnProperty'),
	HasProperty: require('./2021/HasProperty'),
	HourFromTime: require('./2021/HourFromTime'),
	InLeapYear: require('./2021/InLeapYear'),
	InstanceofOperator: require('./2021/InstanceofOperator'),
	Invoke: require('./2021/Invoke'),
	IsAccessorDescriptor: require('./2021/IsAccessorDescriptor'),
	IsArray: require('./2021/IsArray'),
	IsBigIntElementType: require('./2021/IsBigIntElementType'),
	IsCallable: require('./2021/IsCallable'),
	IsCompatiblePropertyDescriptor: require('./2021/IsCompatiblePropertyDescriptor'),
	IsConcatSpreadable: require('./2021/IsConcatSpreadable'),
	IsConstructor: require('./2021/IsConstructor'),
	IsDataDescriptor: require('./2021/IsDataDescriptor'),
	IsExtensible: require('./2021/IsExtensible'),
	IsGenericDescriptor: require('./2021/IsGenericDescriptor'),
	IsIntegralNumber: require('./2021/IsIntegralNumber'),
	IsNoTearConfiguration: require('./2021/IsNoTearConfiguration'),
	IsPromise: require('./2021/IsPromise'),
	IsPropertyKey: require('./2021/IsPropertyKey'),
	IsRegExp: require('./2021/IsRegExp'),
	IsSharedArrayBuffer: require('./2021/IsSharedArrayBuffer'),
	IsStringPrefix: require('./2021/IsStringPrefix'),
	IsUnclampedIntegerElementType: require('./2021/IsUnclampedIntegerElementType'),
	IsUnsignedElementType: require('./2021/IsUnsignedElementType'),
	IterableToList: require('./2021/IterableToList'),
	IteratorClose: require('./2021/IteratorClose'),
	IteratorComplete: require('./2021/IteratorComplete'),
	IteratorNext: require('./2021/IteratorNext'),
	IteratorStep: require('./2021/IteratorStep'),
	IteratorValue: require('./2021/IteratorValue'),
	LengthOfArrayLike: require('./2021/LengthOfArrayLike'),
	MakeDate: require('./2021/MakeDate'),
	MakeDay: require('./2021/MakeDay'),
	MakeTime: require('./2021/MakeTime'),
	MinFromTime: require('./2021/MinFromTime'),
	modulo: require('./2021/modulo'),
	MonthFromTime: require('./2021/MonthFromTime'),
	msFromTime: require('./2021/msFromTime'),
	Number: require('./2021/Number'),
	NumberBitwiseOp: require('./2021/NumberBitwiseOp'),
	NumberToBigInt: require('./2021/NumberToBigInt'),
	ObjectDefineProperties: require('./2021/ObjectDefineProperties'),
	OrdinaryCreateFromConstructor: require('./2021/OrdinaryCreateFromConstructor'),
	OrdinaryDefineOwnProperty: require('./2021/OrdinaryDefineOwnProperty'),
	OrdinaryGetOwnProperty: require('./2021/OrdinaryGetOwnProperty'),
	OrdinaryGetPrototypeOf: require('./2021/OrdinaryGetPrototypeOf'),
	OrdinaryHasInstance: require('./2021/OrdinaryHasInstance'),
	OrdinaryHasProperty: require('./2021/OrdinaryHasProperty'),
	OrdinaryObjectCreate: require('./2021/OrdinaryObjectCreate'),
	OrdinarySetPrototypeOf: require('./2021/OrdinarySetPrototypeOf'),
	OrdinaryToPrimitive: require('./2021/OrdinaryToPrimitive'),
	PromiseResolve: require('./2021/PromiseResolve'),
	QuoteJSONString: require('./2021/QuoteJSONString'),
	RegExpCreate: require('./2021/RegExpCreate'),
	RegExpExec: require('./2021/RegExpExec'),
	RequireObjectCoercible: require('./2021/RequireObjectCoercible'),
	SameValue: require('./2021/SameValue'),
	SameValueNonNumeric: require('./2021/SameValueNonNumeric'),
	SameValueZero: require('./2021/SameValueZero'),
	SecFromTime: require('./2021/SecFromTime'),
	Set: require('./2021/Set'),
	SetFunctionLength: require('./2021/SetFunctionLength'),
	SetFunctionName: require('./2021/SetFunctionName'),
	SetIntegrityLevel: require('./2021/SetIntegrityLevel'),
	SpeciesConstructor: require('./2021/SpeciesConstructor'),
	SplitMatch: require('./2021/SplitMatch'),
	StringCreate: require('./2021/StringCreate'),
	StringGetOwnProperty: require('./2021/StringGetOwnProperty'),
	StringIndexOf: require('./2021/StringIndexOf'),
	StringPad: require('./2021/StringPad'),
	StringToBigInt: require('./2021/StringToBigInt'),
	StringToCodePoints: require('./2021/StringToCodePoints'),
	SymbolDescriptiveString: require('./2021/SymbolDescriptiveString'),
	TestIntegrityLevel: require('./2021/TestIntegrityLevel'),
	thisBigIntValue: require('./2021/thisBigIntValue'),
	thisBooleanValue: require('./2021/thisBooleanValue'),
	thisNumberValue: require('./2021/thisNumberValue'),
	thisStringValue: require('./2021/thisStringValue'),
	thisSymbolValue: require('./2021/thisSymbolValue'),
	thisTimeValue: require('./2021/thisTimeValue'),
	TimeClip: require('./2021/TimeClip'),
	TimeFromYear: require('./2021/TimeFromYear'),
	TimeString: require('./2021/TimeString'),
	TimeWithinDay: require('./2021/TimeWithinDay'),
	ToBigInt: require('./2021/ToBigInt'),
	ToBigInt64: require('./2021/ToBigInt64'),
	ToBigUint64: require('./2021/ToBigUint64'),
	ToBoolean: require('./2021/ToBoolean'),
	ToDateString: require('./2021/ToDateString'),
	ToIndex: require('./2021/ToIndex'),
	ToInt16: require('./2021/ToInt16'),
	ToInt32: require('./2021/ToInt32'),
	ToInt8: require('./2021/ToInt8'),
	ToIntegerOrInfinity: require('./2021/ToIntegerOrInfinity'),
	ToLength: require('./2021/ToLength'),
	ToNumber: require('./2021/ToNumber'),
	ToNumeric: require('./2021/ToNumeric'),
	ToObject: require('./2021/ToObject'),
	ToPrimitive: require('./2021/ToPrimitive'),
	ToPropertyDescriptor: require('./2021/ToPropertyDescriptor'),
	ToPropertyKey: require('./2021/ToPropertyKey'),
	ToString: require('./2021/ToString'),
	ToUint16: require('./2021/ToUint16'),
	ToUint32: require('./2021/ToUint32'),
	ToUint8: require('./2021/ToUint8'),
	ToUint8Clamp: require('./2021/ToUint8Clamp'),
	TrimString: require('./2021/TrimString'),
	Type: require('./2021/Type'),
	UnicodeEscape: require('./2021/UnicodeEscape'),
	UTF16EncodeCodePoint: require('./2021/UTF16EncodeCodePoint'),
	UTF16SurrogatePairToCodePoint: require('./2021/UTF16SurrogatePairToCodePoint'),
	ValidateAndApplyPropertyDescriptor: require('./2021/ValidateAndApplyPropertyDescriptor'),
	WeakRefDeref: require('./2021/WeakRefDeref'),
	WeekDay: require('./2021/WeekDay'),
	YearFromTime: require('./2021/YearFromTime')
};

module.exports = ES2021;
'use strict';

/* eslint global-require: 0 */
// https://www.ecma-international.org/ecma-262/13.0/#sec-abstract-operations
var ES2022 = {
	abs: require('./2022/abs'),
	AddEntriesFromIterable: require('./2022/AddEntriesFromIterable'),
	AddToKeptObjects: require('./2022/AddToKeptObjects'),
	AdvanceStringIndex: require('./2022/AdvanceStringIndex'),
	ApplyStringOrNumericBinaryOperator: require('./2022/ApplyStringOrNumericBinaryOperator'),
	ArrayCreate: require('./2022/ArrayCreate'),
	ArraySetLength: require('./2022/ArraySetLength'),
	ArraySpeciesCreate: require('./2022/ArraySpeciesCreate'),
	BigInt: require('./2022/BigInt'),
	BigIntBitwiseOp: require('./2022/BigIntBitwiseOp'),
	BinaryAnd: require('./2022/BinaryAnd'),
	BinaryOr: require('./2022/BinaryOr'),
	BinaryXor: require('./2022/BinaryXor'),
	ByteListBitwiseOp: require('./2022/ByteListBitwiseOp'),
	ByteListEqual: require('./2022/ByteListEqual'),
	Call: require('./2022/Call'),
	CanonicalNumericIndexString: require('./2022/CanonicalNumericIndexString'),
	CharacterRange: require('./2022/CharacterRange'),
	clamp: require('./2022/clamp'),
	ClearKeptObjects: require('./2022/ClearKeptObjects'),
	CodePointAt: require('./2022/CodePointAt'),
	CodePointsToString: require('./2022/CodePointsToString'),
	CompletePropertyDescriptor: require('./2022/CompletePropertyDescriptor'),
	CopyDataProperties: require('./2022/CopyDataProperties'),
	CreateDataProperty: require('./2022/CreateDataProperty'),
	CreateDataPropertyOrThrow: require('./2022/CreateDataPropertyOrThrow'),
	CreateHTML: require('./2022/CreateHTML'),
	CreateIterResultObject: require('./2022/CreateIterResultObject'),
	CreateListFromArrayLike: require('./2022/CreateListFromArrayLike'),
	CreateMethodProperty: require('./2022/CreateMethodProperty'),
	CreateNonEnumerableDataPropertyOrThrow: require('./2022/CreateNonEnumerableDataPropertyOrThrow'),
	CreateRegExpStringIterator: require('./2022/CreateRegExpStringIterator'),
	DateFromTime: require('./2022/DateFromTime'),
	DateString: require('./2022/DateString'),
	Day: require('./2022/Day'),
	DayFromYear: require('./2022/DayFromYear'),
	DaysInYear: require('./2022/DaysInYear'),
	DayWithinYear: require('./2022/DayWithinYear'),
	DefinePropertyOrThrow: require('./2022/DefinePropertyOrThrow'),
	DeletePropertyOrThrow: require('./2022/DeletePropertyOrThrow'),
	EnumerableOwnPropertyNames: require('./2022/EnumerableOwnPropertyNames'),
	FlattenIntoArray: require('./2022/FlattenIntoArray'),
	floor: require('./2022/floor'),
	FromPropertyDescriptor: require('./2022/FromPropertyDescriptor'),
	Get: require('./2022/Get'),
	GetIterator: require('./2022/GetIterator'),
	GetMatchIndexPair: require('./2022/GetMatchIndexPair'),
	GetMatchString: require('./2022/GetMatchString'),
	GetMethod: require('./2022/GetMethod'),
	GetOwnPropertyKeys: require('./2022/GetOwnPropertyKeys'),
	GetPromiseResolve: require('./2022/GetPromiseResolve'),
	GetPrototypeFromConstructor: require('./2022/GetPrototypeFromConstructor'),
	GetStringIndex: require('./2022/GetStringIndex'),
	GetSubstitution: require('./2022/GetSubstitution'),
	GetV: require('./2022/GetV'),
	HasOwnProperty: require('./2022/HasOwnProperty'),
	HasProperty: require('./2022/HasProperty'),
	HourFromTime: require('./2022/HourFromTime'),
	InLeapYear: require('./2022/InLeapYear'),
	InstallErrorCause: require('./2022/InstallErrorCause'),
	InstanceofOperator: require('./2022/InstanceofOperator'),
	Invoke: require('./2022/Invoke'),
	IsAccessorDescriptor: require('./2022/IsAccessorDescriptor'),
	IsArray: require('./2022/IsArray'),
	IsBigIntElementType: require('./2022/IsBigIntElementType'),
	IsCallable: require('./2022/IsCallable'),
	IsCompatiblePropertyDescriptor: require('./2022/IsCompatiblePropertyDescriptor'),
	IsConcatSpreadable: require('./2022/IsConcatSpreadable'),
	IsConstructor: require('./2022/IsConstructor'),
	IsDataDescriptor: require('./2022/IsDataDescriptor'),
	IsExtensible: require('./2022/IsExtensible'),
	IsGenericDescriptor: require('./2022/IsGenericDescriptor'),
	IsIntegralNumber: require('./2022/IsIntegralNumber'),
	IsLessThan: require('./2022/IsLessThan'),
	IsLooselyEqual: require('./2022/IsLooselyEqual'),
	IsNoTearConfiguration: require('./2022/IsNoTearConfiguration'),
	IsPromise: require('./2022/IsPromise'),
	IsPropertyKey: require('./2022/IsPropertyKey'),
	IsRegExp: require('./2022/IsRegExp'),
	IsSharedArrayBuffer: require('./2022/IsSharedArrayBuffer'),
	IsStrictlyEqual: require('./2022/IsStrictlyEqual'),
	IsStringPrefix: require('./2022/IsStringPrefix'),
	IsStringWellFormedUnicode: require('./2022/IsStringWellFormedUnicode'),
	IsUnclampedIntegerElementType: require('./2022/IsUnclampedIntegerElementType'),
	IsUnsignedElementType: require('./2022/IsUnsignedElementType'),
	IterableToList: require('./2022/IterableToList'),
	IteratorClose: require('./2022/IteratorClose'),
	IteratorComplete: require('./2022/IteratorComplete'),
	IteratorNext: require('./2022/IteratorNext'),
	IteratorStep: require('./2022/IteratorStep'),
	IteratorValue: require('./2022/IteratorValue'),
	LengthOfArrayLike: require('./2022/LengthOfArrayLike'),
	MakeDate: require('./2022/MakeDate'),
	MakeDay: require('./2022/MakeDay'),
	MakeMatchIndicesIndexPairArray: require('./2022/MakeMatchIndicesIndexPairArray'),
	MakeTime: require('./2022/MakeTime'),
	MinFromTime: require('./2022/MinFromTime'),
	modulo: require('./2022/modulo'),
	MonthFromTime: require('./2022/MonthFromTime'),
	msFromTime: require('./2022/msFromTime'),
	Number: require('./2022/Number'),
	NumberBitwiseOp: require('./2022/NumberBitwiseOp'),
	NumberToBigInt: require('./2022/NumberToBigInt'),
	ObjectDefineProperties: require('./2022/ObjectDefineProperties'),
	OrdinaryCreateFromConstructor: require('./2022/OrdinaryCreateFromConstructor'),
	OrdinaryDefineOwnProperty: require('./2022/OrdinaryDefineOwnProperty'),
	OrdinaryGetOwnProperty: require('./2022/OrdinaryGetOwnProperty'),
	OrdinaryGetPrototypeOf: require('./2022/OrdinaryGetPrototypeOf'),
	OrdinaryHasInstance: require('./2022/OrdinaryHasInstance'),
	OrdinaryHasProperty: require('./2022/OrdinaryHasProperty'),
	OrdinaryObjectCreate: require('./2022/OrdinaryObjectCreate'),
	OrdinarySetPrototypeOf: require('./2022/OrdinarySetPrototypeOf'),
	OrdinaryToPrimitive: require('./2022/OrdinaryToPrimitive'),
	PromiseResolve: require('./2022/PromiseResolve'),
	QuoteJSONString: require('./2022/QuoteJSONString'),
	RegExpCreate: require('./2022/RegExpCreate'),
	RegExpExec: require('./2022/RegExpExec'),
	RegExpHasFlag: require('./2022/RegExpHasFlag'),
	RequireObjectCoercible: require('./2022/RequireObjectCoercible'),
	SameValue: require('./2022/SameValue'),
	SameValueNonNumeric: require('./2022/SameValueNonNumeric'),
	SameValueZero: require('./2022/SameValueZero'),
	SecFromTime: require('./2022/SecFromTime'),
	Set: require('./2022/Set'),
	SetFunctionLength: require('./2022/SetFunctionLength'),
	SetFunctionName: require('./2022/SetFunctionName'),
	SetIntegrityLevel: require('./2022/SetIntegrityLevel'),
	SortIndexedProperties: require('./2022/SortIndexedProperties'),
	SpeciesConstructor: require('./2022/SpeciesConstructor'),
	StringCreate: require('./2022/StringCreate'),
	StringGetOwnProperty: require('./2022/StringGetOwnProperty'),
	StringIndexOf: require('./2022/StringIndexOf'),
	StringPad: require('./2022/StringPad'),
	StringToBigInt: require('./2022/StringToBigInt'),
	StringToCodePoints: require('./2022/StringToCodePoints'),
	StringToNumber: require('./2022/StringToNumber'),
	substring: require('./2022/substring'),
	SymbolDescriptiveString: require('./2022/SymbolDescriptiveString'),
	TestIntegrityLevel: require('./2022/TestIntegrityLevel'),
	thisBigIntValue: require('./2022/thisBigIntValue'),
	thisBooleanValue: require('./2022/thisBooleanValue'),
	thisNumberValue: require('./2022/thisNumberValue'),
	thisStringValue: require('./2022/thisStringValue'),
	thisSymbolValue: require('./2022/thisSymbolValue'),
	thisTimeValue: require('./2022/thisTimeValue'),
	TimeClip: require('./2022/TimeClip'),
	TimeFromYear: require('./2022/TimeFromYear'),
	TimeString: require('./2022/TimeString'),
	TimeWithinDay: require('./2022/TimeWithinDay'),
	ToBigInt: require('./2022/ToBigInt'),
	ToBigInt64: require('./2022/ToBigInt64'),
	ToBigUint64: require('./2022/ToBigUint64'),
	ToBoolean: require('./2022/ToBoolean'),
	ToDateString: require('./2022/ToDateString'),
	ToIndex: require('./2022/ToIndex'),
	ToInt16: require('./2022/ToInt16'),
	ToInt32: require('./2022/ToInt32'),
	ToInt8: require('./2022/ToInt8'),
	ToIntegerOrInfinity: require('./2022/ToIntegerOrInfinity'),
	ToLength: require('./2022/ToLength'),
	ToNumber: require('./2022/ToNumber'),
	ToNumeric: require('./2022/ToNumeric'),
	ToObject: require('./2022/ToObject'),
	ToPrimitive: require('./2022/ToPrimitive'),
	ToPropertyDescriptor: require('./2022/ToPropertyDescriptor'),
	ToPropertyKey: require('./2022/ToPropertyKey'),
	ToString: require('./2022/ToString'),
	ToUint16: require('./2022/ToUint16'),
	ToUint32: require('./2022/ToUint32'),
	ToUint8: require('./2022/ToUint8'),
	ToUint8Clamp: require('./2022/ToUint8Clamp'),
	ToZeroPaddedDecimalString: require('./2022/ToZeroPaddedDecimalString'),
	TrimString: require('./2022/TrimString'),
	Type: require('./2022/Type'),
	UnicodeEscape: require('./2022/UnicodeEscape'),
	UTF16EncodeCodePoint: require('./2022/UTF16EncodeCodePoint'),
	UTF16SurrogatePairToCodePoint: require('./2022/UTF16SurrogatePairToCodePoint'),
	ValidateAndApplyPropertyDescriptor: require('./2022/ValidateAndApplyPropertyDescriptor'),
	WeakRefDeref: require('./2022/WeakRefDeref'),
	WeekDay: require('./2022/WeekDay'),
	YearFromTime: require('./2022/YearFromTime')
};

module.exports = ES2022;
'use strict';

/* eslint global-require: 0 */

// https://es5.github.io/#x9
module.exports = {
	'Abstract Equality Comparison': require('./5/AbstractEqualityComparison'),
	'Abstract Relational Comparison': require('./5/AbstractRelationalComparison'),
	'Strict Equality Comparison': require('./5/StrictEqualityComparison'),
	abs: require('./5/abs'),
	CheckObjectCoercible: require('./5/CheckObjectCoercible'),
	DateFromTime: require('./5/DateFromTime'),
	Day: require('./5/Day'),
	DayFromYear: require('./5/DayFromYear'),
	DaysInYear: require('./5/DaysInYear'),
	DayWithinYear: require('./5/DayWithinYear'),
	floor: require('./5/floor'),
	FromPropertyDescriptor: require('./5/FromPropertyDescriptor'),
	HourFromTime: require('./5/HourFromTime'),
	InLeapYear: require('./5/InLeapYear'),
	IsAccessorDescriptor: require('./5/IsAccessorDescriptor'),
	IsCallable: require('./5/IsCallable'),
	IsDataDescriptor: require('./5/IsDataDescriptor'),
	IsGenericDescriptor: require('./5/IsGenericDescriptor'),
	IsPropertyDescriptor: require('./5/IsPropertyDescriptor'),
	MakeDate: require('./5/MakeDate'),
	MakeDay: require('./5/MakeDay'),
	MakeTime: require('./5/MakeTime'),
	MinFromTime: require('./5/MinFromTime'),
	modulo: require('./5/modulo'),
	MonthFromTime: require('./5/MonthFromTime'),
	msFromTime: require('./5/msFromTime'),
	SameValue: require('./5/SameValue'),
	SecFromTime: require('./5/SecFromTime'),
	TimeClip: require('./5/TimeClip'),
	TimeFromYear: require('./5/TimeFromYear'),
	TimeWithinDay: require('./5/TimeWithinDay'),
	ToBoolean: require('./5/ToBoolean'),
	ToInt32: require('./5/ToInt32'),
	ToInteger: require('./5/ToInteger'),
	ToNumber: require('./5/ToNumber'),
	ToObject: require('./5/ToObject'),
	ToPrimitive: require('./5/ToPrimitive'),
	ToPropertyDescriptor: require('./5/ToPropertyDescriptor'),
	ToString: require('./5/ToString'),
	ToUint16: require('./5/ToUint16'),
	ToUint32: require('./5/ToUint32'),
	Type: require('./5/Type'),
	WeekDay: require('./5/WeekDay'),
	YearFromTime: require('./5/YearFromTime')
};
'use strict';

module.exports = require('./es2015');
'use strict';

module.exports = require('./es2016');
'use strict';

var assign = require('./helpers/assign');

var ES5 = require('./es5');
var ES2015 = require('./es2015');
var ES2016 = require('./es2016');
var ES2017 = require('./es2017');
var ES2018 = require('./es2018');
var ES2019 = require('./es2019');
var ES2020 = require('./es2020');
var ES2021 = require('./es2021');
var ES2022 = require('./es2022');

var ES = {
	ES5: ES5,
	ES6: ES2015,
	ES2015: ES2015,
	ES7: ES2016,
	ES2016: ES2016,
	ES2017: ES2017,
	ES2018: ES2018,
	ES2019: ES2019,
	ES2020: ES2020,
	ES2021: ES2021,
	ES2022: ES2022
};
assign(ES, ES5);
delete ES.CheckObjectCoercible; // renamed in ES6 to RequireObjectCoercible
assign(ES, ES2015);

module.exports = ES;
{
  "name": "es-abstract",
  "version": "1.20.1",
  "author": {
    "name": "Jordan Harband",
    "email": "ljharb@gmail.com",
    "url": "http://ljharb.codes"
  },
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "description": "ECMAScript spec abstract operations.",
  "license": "MIT",
  "main": "index.js",
  "type": "commonjs",
  "sideEffects": false,
  "repository": {
    "type": "git",
    "url": "git://github.com/ljharb/es-abstract.git"
  },
  "dependencies": {
    "call-bind": "^1.0.2",
    "es-to-primitive": "^1.2.1",
    "function-bind": "^1.1.1",
    "function.prototype.name": "^1.1.5",
    "get-intrinsic": "^1.1.1",
    "get-symbol-description": "^1.0.0",
    "has": "^1.0.3",
    "has-property-descriptors": "^1.0.0",
    "has-symbols": "^1.0.3",
    "internal-slot": "^1.0.3",
    "is-callable": "^1.2.4",
    "is-negative-zero": "^2.0.2",
    "is-regex": "^1.1.4",
    "is-shared-array-buffer": "^1.0.2",
    "is-string": "^1.0.7",
    "is-weakref": "^1.0.2",
    "object-inspect": "^1.12.0",
    "object-keys": "^1.1.1",
    "object.assign": "^4.1.2",
    "regexp.prototype.flags": "^1.4.3",
    "string.prototype.trimend": "^1.0.5",
    "string.prototype.trimstart": "^1.0.5",
    "unbox-primitive": "^1.0.2"
  },
  "devDependencies": {
    "@ljharb/eslint-config": "^21.0.0",
    "array.prototype.filter": "^1.0.1",
    "array.prototype.indexof": "^1.0.3",
    "aud": "^2.0.0",
    "available-regexp-flags": "^1.0.0",
    "cheerio": "=1.0.0-rc.3",
    "diff": "^5.0.0",
    "eclint": "^2.8.1",
    "es-value-fixtures": "^1.4.1",
    "eslint": "=8.8.0",
    "for-each": "^0.3.3",
    "functions-have-names": "^1.2.3",
    "has-bigints": "^1.0.2",
    "has-strict-mode": "^1.0.1",
    "in-publish": "^2.0.1",
    "make-arrow-function": "^1.2.0",
    "make-async-function": "^1.0.0",
    "make-async-generator-function": "^1.0.0",
    "make-generator-function": "^2.0.0",
    "mock-property": "^1.0.0",
    "npmignore": "^0.3.0",
    "nyc": "^10.3.2",
    "object.fromentries": "^2.0.5",
    "safe-publish-latest": "^2.0.0",
    "ses": "^0.10.4",
    "tape": "^5.5.3"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "engines": {
    "node": ">= 0.4"
  },
  "publishConfig": {
    "ignore": [
      ".github",
      "",
      "# dev scripts",
      "operations/*.js",
      "!operations/20*.js",
      "",
      "test/",
      "",
      ".gitattributes"
    ]
  }
}'use strict';

module.exports = {
	IsPropertyDescriptor: 'https://262.ecma-international.org/6.0/#sec-property-descriptor-specification-type', // not actually an abstract op

	abs: {
		url: 'https://262.ecma-international.org/6.0/#sec-algorithm-conventions'
	},
	'Abstract Equality Comparison': {
		url: 'https://262.ecma-international.org/6.0/#sec-abstract-equality-comparison'
	},
	'Abstract Relational Comparison': {
		url: 'https://262.ecma-international.org/6.0/#sec-abstract-relational-comparison'
	},
	AddRestrictedFunctionProperties: {
		url: 'https://262.ecma-international.org/6.0/#sec-addrestrictedfunctionproperties'
	},
	AdvanceStringIndex: {
		url: 'https://262.ecma-international.org/6.0/#sec-advancestringindex'
	},
	AllocateArrayBuffer: {
		url: 'https://262.ecma-international.org/6.0/#sec-allocatearraybuffer'
	},
	AllocateTypedArray: {
		url: 'https://262.ecma-international.org/6.0/#sec-allocatetypedarray'
	},
	ArrayCreate: {
		url: 'https://262.ecma-international.org/6.0/#sec-arraycreate'
	},
	ArraySetLength: {
		url: 'https://262.ecma-international.org/6.0/#sec-arraysetlength'
	},
	ArraySpeciesCreate: {
		url: 'https://262.ecma-international.org/6.0/#sec-arrayspeciescreate'
	},
	BoundFunctionCreate: {
		url: 'https://262.ecma-international.org/6.0/#sec-boundfunctioncreate'
	},
	Call: {
		url: 'https://262.ecma-international.org/6.0/#sec-call'
	},
	Canonicalize: {
		url: 'https://262.ecma-international.org/6.0/#sec-runtime-semantics-canonicalize-ch'
	},
	CanonicalNumericIndexString: {
		url: 'https://262.ecma-international.org/6.0/#sec-canonicalnumericindexstring'
	},
	CharacterRange: {
		url: 'https://262.ecma-international.org/6.0/#sec-runtime-semantics-characterrange-abstract-operation'
	},
	CharacterSetMatcher: {
		url: 'https://262.ecma-international.org/6.0/#sec-runtime-semantics-charactersetmatcher-abstract-operation'
	},
	CloneArrayBuffer: {
		url: 'https://262.ecma-international.org/6.0/#sec-clonearraybuffer'
	},
	CompletePropertyDescriptor: {
		url: 'https://262.ecma-international.org/6.0/#sec-completepropertydescriptor'
	},
	Completion: {
		url: 'https://262.ecma-international.org/6.0/#sec-implicit-completion-values'
	},
	Construct: {
		url: 'https://262.ecma-international.org/6.0/#sec-construct'
	},
	CopyDataBlockBytes: {
		url: 'https://262.ecma-international.org/6.0/#sec-copydatablockbytes'
	},
	CreateArrayFromList: {
		url: 'https://262.ecma-international.org/6.0/#sec-createarrayfromlist'
	},
	CreateArrayIterator: {
		url: 'https://262.ecma-international.org/6.0/#sec-createarrayiterator'
	},
	CreateBuiltinFunction: {
		url: 'https://262.ecma-international.org/6.0/#sec-createbuiltinfunction'
	},
	CreateByteDataBlock: {
		url: 'https://262.ecma-international.org/6.0/#sec-createbytedatablock'
	},
	CreateDataProperty: {
		url: 'https://262.ecma-international.org/6.0/#sec-createdataproperty'
	},
	CreateDataPropertyOrThrow: {
		url: 'https://262.ecma-international.org/6.0/#sec-createdatapropertyorthrow'
	},
	CreateDynamicFunction: {
		url: 'https://262.ecma-international.org/6.0/#sec-createdynamicfunction'
	},
	CreateHTML: {
		url: 'https://262.ecma-international.org/6.0/#sec-createhtml'
	},
	CreateIntrinsics: {
		url: 'https://262.ecma-international.org/6.0/#sec-createintrinsics'
	},
	CreateIterResultObject: {
		url: 'https://262.ecma-international.org/6.0/#sec-createiterresultobject'
	},
	CreateListFromArrayLike: {
		url: 'https://262.ecma-international.org/6.0/#sec-createlistfromarraylike'
	},
	CreateListIterator: {
		url: 'https://262.ecma-international.org/6.0/#sec-createlistiterator'
	},
	CreateMapIterator: {
		url: 'https://262.ecma-international.org/6.0/#sec-createmapiterator'
	},
	CreateMappedArgumentsObject: {
		url: 'https://262.ecma-international.org/6.0/#sec-createmappedargumentsobject'
	},
	CreateMethodProperty: {
		url: 'https://262.ecma-international.org/6.0/#sec-createmethodproperty'
	},
	CreatePerIterationEnvironment: {
		url: 'https://262.ecma-international.org/6.0/#sec-createperiterationenvironment'
	},
	CreateRealm: {
		url: 'https://262.ecma-international.org/6.0/#sec-createrealm'
	},
	CreateSetIterator: {
		url: 'https://262.ecma-international.org/6.0/#sec-createsetiterator'
	},
	CreateUnmappedArgumentsObject: {
		url: 'https://262.ecma-international.org/6.0/#sec-createunmappedargumentsobject'
	},
	DateFromTime: {
		url: 'https://262.ecma-international.org/6.0/#sec-date-number'
	},
	Day: {
		url: 'https://262.ecma-international.org/6.0/#sec-day-number-and-time-within-day'
	},
	DayFromYear: {
		url: 'https://262.ecma-international.org/6.0/#sec-year-number'
	},
	DaylightSavingTA: {
		url: 'https://262.ecma-international.org/6.0/#sec-daylight-saving-time-adjustment'
	},
	DaysInYear: {
		url: 'https://262.ecma-international.org/6.0/#sec-year-number'
	},
	DayWithinYear: {
		url: 'https://262.ecma-international.org/6.0/#sec-month-number'
	},
	Decode: {
		url: 'https://262.ecma-international.org/6.0/#sec-decode'
	},
	DefinePropertyOrThrow: {
		url: 'https://262.ecma-international.org/6.0/#sec-definepropertyorthrow'
	},
	DeletePropertyOrThrow: {
		url: 'https://262.ecma-international.org/6.0/#sec-deletepropertyorthrow'
	},
	DetachArrayBuffer: {
		url: 'https://262.ecma-international.org/6.0/#sec-detacharraybuffer'
	},
	Encode: {
		url: 'https://262.ecma-international.org/6.0/#sec-encode'
	},
	EnqueueJob: {
		url: 'https://262.ecma-international.org/6.0/#sec-enqueuejob'
	},
	EnumerableOwnNames: {
		url: 'https://262.ecma-international.org/6.0/#sec-enumerableownnames'
	},
	EscapeRegExpPattern: {
		url: 'https://262.ecma-international.org/6.0/#sec-escaperegexppattern'
	},
	EvalDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/6.0/#sec-evaldeclarationinstantiation'
	},
	EvaluateCall: {
		url: 'https://262.ecma-international.org/6.0/#sec-evaluatecall'
	},
	EvaluateDirectCall: {
		url: 'https://262.ecma-international.org/6.0/#sec-evaluatedirectcall'
	},
	EvaluateNew: {
		url: 'https://262.ecma-international.org/6.0/#sec-evaluatenew'
	},
	floor: {
		url: 'https://262.ecma-international.org/6.0/#sec-algorithm-conventions'
	},
	ForBodyEvaluation: {
		url: 'https://262.ecma-international.org/6.0/#sec-forbodyevaluation'
	},
	'ForIn/OfBodyEvaluation': {
		url: 'https://262.ecma-international.org/6.0/#sec-runtime-semantics-forin-div-ofbodyevaluation-lhs-stmt-iterator-lhskind-labelset'
	},
	'ForIn/OfHeadEvaluation': {
		url: 'https://262.ecma-international.org/6.0/#sec-runtime-semantics-forin-div-ofheadevaluation-tdznames-expr-iterationkind'
	},
	FromPropertyDescriptor: {
		url: 'https://262.ecma-international.org/6.0/#sec-frompropertydescriptor'
	},
	FulfillPromise: {
		url: 'https://262.ecma-international.org/6.0/#sec-fulfillpromise'
	},
	FunctionAllocate: {
		url: 'https://262.ecma-international.org/6.0/#sec-functionallocate'
	},
	FunctionCreate: {
		url: 'https://262.ecma-international.org/6.0/#sec-functioncreate'
	},
	FunctionInitialize: {
		url: 'https://262.ecma-international.org/6.0/#sec-functioninitialize'
	},
	GeneratorFunctionCreate: {
		url: 'https://262.ecma-international.org/6.0/#sec-generatorfunctioncreate'
	},
	GeneratorResume: {
		url: 'https://262.ecma-international.org/6.0/#sec-generatorresume'
	},
	GeneratorResumeAbrupt: {
		url: 'https://262.ecma-international.org/6.0/#sec-generatorresumeabrupt'
	},
	GeneratorStart: {
		url: 'https://262.ecma-international.org/6.0/#sec-generatorstart'
	},
	GeneratorValidate: {
		url: 'https://262.ecma-international.org/6.0/#sec-generatorvalidate'
	},
	GeneratorYield: {
		url: 'https://262.ecma-international.org/6.0/#sec-generatoryield'
	},
	Get: {
		url: 'https://262.ecma-international.org/6.0/#sec-get-o-p'
	},
	GetBase: {
		url: 'https://262.ecma-international.org/6.0/#sec-jobs-and-job-queues'
	},
	GetFunctionRealm: {
		url: 'https://262.ecma-international.org/6.0/#sec-getfunctionrealm'
	},
	GetGlobalObject: {
		url: 'https://262.ecma-international.org/6.0/#sec-getglobalobject'
	},
	GetIdentifierReference: {
		url: 'https://262.ecma-international.org/6.0/#sec-getidentifierreference'
	},
	GetIterator: {
		url: 'https://262.ecma-international.org/6.0/#sec-getiterator'
	},
	GetMethod: {
		url: 'https://262.ecma-international.org/6.0/#sec-getmethod'
	},
	GetModuleNamespace: {
		url: 'https://262.ecma-international.org/6.0/#sec-getmodulenamespace'
	},
	GetNewTarget: {
		url: 'https://262.ecma-international.org/6.0/#sec-getnewtarget'
	},
	GetOwnPropertyKeys: {
		url: 'https://262.ecma-international.org/6.0/#sec-getownpropertykeys'
	},
	GetPrototypeFromConstructor: {
		url: 'https://262.ecma-international.org/6.0/#sec-getprototypefromconstructor'
	},
	GetReferencedName: {
		url: 'https://262.ecma-international.org/6.0/#sec-jobs-and-job-queues'
	},
	GetSubstitution: {
		url: 'https://262.ecma-international.org/6.0/#sec-getsubstitution'
	},
	GetSuperConstructor: {
		url: 'https://262.ecma-international.org/6.0/#sec-getsuperconstructor'
	},
	GetTemplateObject: {
		url: 'https://262.ecma-international.org/6.0/#sec-gettemplateobject'
	},
	GetThisEnvironment: {
		url: 'https://262.ecma-international.org/6.0/#sec-getthisenvironment'
	},
	GetThisValue: {
		url: 'https://262.ecma-international.org/6.0/#sec-getthisvalue'
	},
	GetV: {
		url: 'https://262.ecma-international.org/6.0/#sec-getv'
	},
	GetValue: {
		url: 'https://262.ecma-international.org/6.0/#sec-getvalue'
	},
	GetValueFromBuffer: {
		url: 'https://262.ecma-international.org/6.0/#sec-getvaluefrombuffer'
	},
	GetViewValue: {
		url: 'https://262.ecma-international.org/6.0/#sec-getviewvalue'
	},
	HasOwnProperty: {
		url: 'https://262.ecma-international.org/6.0/#sec-hasownproperty'
	},
	HasPrimitiveBase: {
		url: 'https://262.ecma-international.org/6.0/#sec-jobs-and-job-queues'
	},
	HasProperty: {
		url: 'https://262.ecma-international.org/6.0/#sec-hasproperty'
	},
	HostResolveImportedModule: {
		url: 'sec-hostresolveimportedmodule'
	},
	HourFromTime: {
		url: 'https://262.ecma-international.org/6.0/#sec-hours-minutes-second-and-milliseconds'
	},
	ImportedLocalNames: {
		url: 'https://262.ecma-international.org/6.0/#sec-importedlocalnames'
	},
	InitializeHostDefinedRealm: {
		url: 'https://262.ecma-international.org/6.0/#sec-initializehostdefinedrealm'
	},
	InitializeReferencedBinding: {
		url: 'https://262.ecma-international.org/6.0/#sec-initializereferencedbinding'
	},
	InLeapYear: {
		url: 'https://262.ecma-international.org/6.0/#sec-year-number'
	},
	InstanceofOperator: {
		url: 'https://262.ecma-international.org/6.0/#sec-instanceofoperator'
	},
	IntegerIndexedElementGet: {
		url: 'https://262.ecma-international.org/6.0/#sec-integerindexedelementget'
	},
	IntegerIndexedElementSet: {
		url: 'https://262.ecma-international.org/6.0/#sec-integerindexedelementset'
	},
	IntegerIndexedObjectCreate: {
		url: 'https://262.ecma-international.org/6.0/#sec-integerindexedobjectcreate'
	},
	InternalizeJSONProperty: {
		url: 'https://262.ecma-international.org/6.0/#sec-internalizejsonproperty'
	},
	Invoke: {
		url: 'https://262.ecma-international.org/6.0/#sec-invoke'
	},
	IsAccessorDescriptor: {
		url: 'https://262.ecma-international.org/6.0/#sec-isaccessordescriptor'
	},
	IsAnonymousFunctionDefinition: {
		url: 'https://262.ecma-international.org/6.0/#sec-isanonymousfunctiondefinition'
	},
	IsArray: {
		url: 'https://262.ecma-international.org/6.0/#sec-isarray'
	},
	IsCallable: {
		url: 'https://262.ecma-international.org/6.0/#sec-iscallable'
	},
	IsCompatiblePropertyDescriptor: {
		url: 'https://262.ecma-international.org/6.0/#sec-iscompatiblepropertydescriptor'
	},
	IsConcatSpreadable: {
		url: 'https://262.ecma-international.org/6.0/#sec-isconcatspreadable'
	},
	IsConstructor: {
		url: 'https://262.ecma-international.org/6.0/#sec-isconstructor'
	},
	IsDataDescriptor: {
		url: 'https://262.ecma-international.org/6.0/#sec-isdatadescriptor'
	},
	IsDetachedBuffer: {
		url: 'https://262.ecma-international.org/6.0/#sec-isdetachedbuffer'
	},
	IsExtensible: {
		url: 'https://262.ecma-international.org/6.0/#sec-isextensible-o'
	},
	IsGenericDescriptor: {
		url: 'https://262.ecma-international.org/6.0/#sec-isgenericdescriptor'
	},
	IsInTailPosition: {
		url: 'https://262.ecma-international.org/6.0/#sec-isintailposition'
	},
	IsInteger: {
		url: 'https://262.ecma-international.org/6.0/#sec-isinteger'
	},
	IsLabelledFunction: {
		url: 'https://262.ecma-international.org/6.0/#sec-islabelledfunction'
	},
	IsPromise: {
		url: 'https://262.ecma-international.org/6.0/#sec-ispromise'
	},
	IsPropertyKey: {
		url: 'https://262.ecma-international.org/6.0/#sec-ispropertykey'
	},
	IsPropertyReference: {
		url: 'https://262.ecma-international.org/6.0/#sec-jobs-and-job-queues'
	},
	IsRegExp: {
		url: 'https://262.ecma-international.org/6.0/#sec-isregexp'
	},
	IsStrictReference: {
		url: 'https://262.ecma-international.org/6.0/#sec-jobs-and-job-queues'
	},
	IsSuperReference: {
		url: 'https://262.ecma-international.org/6.0/#sec-jobs-and-job-queues'
	},
	IsUnresolvableReference: {
		url: 'https://262.ecma-international.org/6.0/#sec-jobs-and-job-queues'
	},
	IsWordChar: {
		url: 'https://262.ecma-international.org/6.0/#sec-runtime-semantics-iswordchar-abstract-operation'
	},
	IteratorClose: {
		url: 'https://262.ecma-international.org/6.0/#sec-iteratorclose'
	},
	IteratorComplete: {
		url: 'https://262.ecma-international.org/6.0/#sec-iteratorcomplete'
	},
	IteratorNext: {
		url: 'https://262.ecma-international.org/6.0/#sec-iteratornext'
	},
	IteratorStep: {
		url: 'https://262.ecma-international.org/6.0/#sec-iteratorstep'
	},
	IteratorValue: {
		url: 'https://262.ecma-international.org/6.0/#sec-iteratorvalue'
	},
	LocalTime: {
		url: 'https://262.ecma-international.org/6.0/#sec-localtime'
	},
	LoopContinues: {
		url: 'https://262.ecma-international.org/6.0/#sec-loopcontinues'
	},
	MakeArgGetter: {
		url: 'https://262.ecma-international.org/6.0/#sec-makearggetter'
	},
	MakeArgSetter: {
		url: 'https://262.ecma-international.org/6.0/#sec-makeargsetter'
	},
	MakeClassConstructor: {
		url: 'https://262.ecma-international.org/6.0/#sec-makeclassconstructor'
	},
	MakeConstructor: {
		url: 'https://262.ecma-international.org/6.0/#sec-makeconstructor'
	},
	MakeDate: {
		url: 'https://262.ecma-international.org/6.0/#sec-makedate'
	},
	MakeDay: {
		url: 'https://262.ecma-international.org/6.0/#sec-makeday'
	},
	MakeMethod: {
		url: 'https://262.ecma-international.org/6.0/#sec-makemethod'
	},
	MakeSuperPropertyReference: {
		url: 'https://262.ecma-international.org/6.0/#sec-makesuperpropertyreference'
	},
	MakeTime: {
		url: 'https://262.ecma-international.org/6.0/#sec-maketime'
	},
	max: {
		url: 'https://262.ecma-international.org/6.0/#sec-algorithm-conventions'
	},
	min: {
		url: 'https://262.ecma-international.org/6.0/#sec-algorithm-conventions'
	},
	MinFromTime: {
		url: 'https://262.ecma-international.org/6.0/#sec-hours-minutes-second-and-milliseconds'
	},
	ModuleNamespaceCreate: {
		url: 'https://262.ecma-international.org/6.0/#sec-modulenamespacecreate'
	},
	modulo: {
		url: 'https://262.ecma-international.org/6.0/#sec-algorithm-conventions'
	},
	MonthFromTime: {
		url: 'https://262.ecma-international.org/6.0/#sec-month-number'
	},
	msFromTime: {
		url: 'https://262.ecma-international.org/6.0/#sec-hours-minutes-second-and-milliseconds'
	},
	msPerDay: {
		url: 'https://262.ecma-international.org/6.0/#sec-day-number-and-time-within-day'
	},
	NewDeclarativeEnvironment: {
		url: 'https://262.ecma-international.org/6.0/#sec-newdeclarativeenvironment'
	},
	NewFunctionEnvironment: {
		url: 'https://262.ecma-international.org/6.0/#sec-newfunctionenvironment'
	},
	NewGlobalEnvironment: {
		url: 'https://262.ecma-international.org/6.0/#sec-newglobalenvironment'
	},
	NewModuleEnvironment: {
		url: 'https://262.ecma-international.org/6.0/#sec-newmoduleenvironment'
	},
	NewObjectEnvironment: {
		url: 'https://262.ecma-international.org/6.0/#sec-newobjectenvironment'
	},
	NewPromiseCapability: {
		url: 'https://262.ecma-international.org/6.0/#sec-newpromisecapability'
	},
	NormalCompletion: {
		url: 'https://262.ecma-international.org/6.0/#sec-normalcompletion'
	},
	ObjectCreate: {
		url: 'https://262.ecma-international.org/6.0/#sec-objectcreate'
	},
	ObjectDefineProperties: {
		url: 'https://262.ecma-international.org/6.0/#sec-objectdefineproperties'
	},
	OrdinaryCallBindThis: {
		url: 'https://262.ecma-international.org/6.0/#sec-ordinarycallbindthis'
	},
	OrdinaryCallEvaluateBody: {
		url: 'https://262.ecma-international.org/6.0/#sec-ordinarycallevaluatebody'
	},
	OrdinaryCreateFromConstructor: {
		url: 'https://262.ecma-international.org/6.0/#sec-ordinarycreatefromconstructor'
	},
	OrdinaryDefineOwnProperty: {
		url: 'https://262.ecma-international.org/6.0/#sec-ordinarydefineownproperty'
	},
	OrdinaryGetOwnProperty: {
		url: 'https://262.ecma-international.org/6.0/#sec-ordinarygetownproperty'
	},
	OrdinaryHasInstance: {
		url: 'https://262.ecma-international.org/6.0/#sec-ordinaryhasinstance'
	},
	OrdinaryHasProperty: {
		url: 'https://262.ecma-international.org/6.0/#sec-ordinaryhasproperty'
	},
	ParseModule: {
		url: 'https://262.ecma-international.org/6.0/#sec-parsemodule'
	},
	PerformEval: {
		url: 'https://262.ecma-international.org/6.0/#sec-performeval'
	},
	PerformPromiseAll: {
		url: 'https://262.ecma-international.org/6.0/#sec-performpromiseall'
	},
	PerformPromiseRace: {
		url: 'https://262.ecma-international.org/6.0/#sec-performpromiserace'
	},
	PerformPromiseThen: {
		url: 'https://262.ecma-international.org/6.0/#sec-performpromisethen'
	},
	PrepareForOrdinaryCall: {
		url: 'https://262.ecma-international.org/6.0/#sec-prepareforordinarycall'
	},
	PrepareForTailCall: {
		url: 'https://262.ecma-international.org/6.0/#sec-preparefortailcall'
	},
	ProxyCreate: {
		url: 'https://262.ecma-international.org/6.0/#sec-proxycreate'
	},
	PutValue: {
		url: 'https://262.ecma-international.org/6.0/#sec-putvalue'
	},
	QuoteJSONString: {
		url: 'https://262.ecma-international.org/6.0/#sec-quotejsonstring'
	},
	RegExpAlloc: {
		url: 'https://262.ecma-international.org/6.0/#sec-regexpalloc'
	},
	RegExpBuiltinExec: {
		url: 'https://262.ecma-international.org/6.0/#sec-regexpbuiltinexec'
	},
	RegExpCreate: {
		url: 'https://262.ecma-international.org/6.0/#sec-regexpcreate'
	},
	RegExpExec: {
		url: 'https://262.ecma-international.org/6.0/#sec-regexpexec'
	},
	RegExpInitialize: {
		url: 'https://262.ecma-international.org/6.0/#sec-regexpinitialize'
	},
	RejectPromise: {
		url: 'https://262.ecma-international.org/6.0/#sec-rejectpromise'
	},
	RepeatMatcher: {
		url: 'https://262.ecma-international.org/6.0/#sec-runtime-semantics-repeatmatcher-abstract-operation'
	},
	RequireObjectCoercible: {
		url: 'https://262.ecma-international.org/6.0/#sec-requireobjectcoercible'
	},
	ResolveBinding: {
		url: 'https://262.ecma-international.org/6.0/#sec-resolvebinding'
	},
	ResolveThisBinding: {
		url: 'https://262.ecma-international.org/6.0/#sec-resolvethisbinding'
	},
	SameValue: {
		url: 'https://262.ecma-international.org/6.0/#sec-samevalue'
	},
	SameValueZero: {
		url: 'https://262.ecma-international.org/6.0/#sec-samevaluezero'
	},
	SecFromTime: {
		url: 'https://262.ecma-international.org/6.0/#sec-hours-minutes-second-and-milliseconds'
	},
	SerializeJSONArray: {
		url: 'https://262.ecma-international.org/6.0/#sec-serializejsonarray'
	},
	SerializeJSONObject: {
		url: 'https://262.ecma-international.org/6.0/#sec-serializejsonobject'
	},
	SerializeJSONProperty: {
		url: 'https://262.ecma-international.org/6.0/#sec-serializejsonproperty'
	},
	Set: {
		url: 'https://262.ecma-international.org/6.0/#sec-set-o-p-v-throw'
	},
	SetDefaultGlobalBindings: {
		url: 'https://262.ecma-international.org/6.0/#sec-setdefaultglobalbindings'
	},
	SetFunctionName: {
		url: 'https://262.ecma-international.org/6.0/#sec-setfunctionname'
	},
	SetIntegrityLevel: {
		url: 'https://262.ecma-international.org/6.0/#sec-setintegritylevel'
	},
	SetRealmGlobalObject: {
		url: 'https://262.ecma-international.org/6.0/#sec-setrealmglobalobject'
	},
	SetValueInBuffer: {
		url: 'https://262.ecma-international.org/6.0/#sec-setvalueinbuffer'
	},
	SetViewValue: {
		url: 'https://262.ecma-international.org/6.0/#sec-setviewvalue'
	},
	sign: {
		url: 'https://262.ecma-international.org/6.0/#sec-algorithm-conventions'
	},
	SortCompare: {
		url: 'https://262.ecma-international.org/6.0/#sec-sortcompare'
	},
	SpeciesConstructor: {
		url: 'https://262.ecma-international.org/6.0/#sec-speciesconstructor'
	},
	SplitMatch: {
		url: 'https://262.ecma-international.org/6.0/#sec-splitmatch'
	},
	'Strict Equality Comparison': {
		url: 'https://262.ecma-international.org/6.0/#sec-strict-equality-comparison'
	},
	StringCreate: {
		url: 'https://262.ecma-international.org/6.0/#sec-stringcreate'
	},
	StringGetIndexProperty: {
		url: 'https://262.ecma-international.org/6.0/#sec-stringgetindexproperty'
	},
	SymbolDescriptiveString: {
		url: 'https://262.ecma-international.org/6.0/#sec-symboldescriptivestring'
	},
	TestIntegrityLevel: {
		url: 'https://262.ecma-international.org/6.0/#sec-testintegritylevel'
	},
	thisBooleanValue: {
		url: 'https://262.ecma-international.org/6.0/#sec-properties-of-the-boolean-prototype-object'
	},
	thisNumberValue: {
		url: 'https://262.ecma-international.org/6.0/#sec-properties-of-the-number-prototype-object'
	},
	thisStringValue: {
		url: 'https://262.ecma-international.org/6.0/#sec-properties-of-the-string-prototype-object'
	},
	thisTimeValue: {
		url: 'https://262.ecma-international.org/6.0/#sec-properties-of-the-date-prototype-object'
	},
	TimeClip: {
		url: 'https://262.ecma-international.org/6.0/#sec-timeclip'
	},
	TimeFromYear: {
		url: 'https://262.ecma-international.org/6.0/#sec-year-number'
	},
	TimeWithinDay: {
		url: 'https://262.ecma-international.org/6.0/#sec-day-number-and-time-within-day'
	},
	ToBoolean: {
		url: 'https://262.ecma-international.org/6.0/#sec-toboolean'
	},
	ToDateString: {
		url: 'https://262.ecma-international.org/6.0/#sec-todatestring'
	},
	ToInt16: {
		url: 'https://262.ecma-international.org/6.0/#sec-toint16'
	},
	ToInt32: {
		url: 'https://262.ecma-international.org/6.0/#sec-toint32'
	},
	ToInt8: {
		url: 'https://262.ecma-international.org/6.0/#sec-toint8'
	},
	ToInteger: {
		url: 'https://262.ecma-international.org/6.0/#sec-tointeger'
	},
	ToLength: {
		url: 'https://262.ecma-international.org/6.0/#sec-tolength'
	},
	ToNumber: {
		url: 'https://262.ecma-international.org/6.0/#sec-tonumber'
	},
	ToObject: {
		url: 'https://262.ecma-international.org/6.0/#sec-toobject'
	},
	ToPrimitive: {
		url: 'https://262.ecma-international.org/6.0/#sec-toprimitive'
	},
	ToPropertyDescriptor: {
		url: 'https://262.ecma-international.org/6.0/#sec-topropertydescriptor'
	},
	ToPropertyKey: {
		url: 'https://262.ecma-international.org/6.0/#sec-topropertykey'
	},
	ToString: {
		url: 'https://262.ecma-international.org/6.0/#sec-tostring'
	},
	ToUint16: {
		url: 'https://262.ecma-international.org/6.0/#sec-touint16'
	},
	ToUint32: {
		url: 'https://262.ecma-international.org/6.0/#sec-touint32'
	},
	ToUint8: {
		url: 'https://262.ecma-international.org/6.0/#sec-touint8'
	},
	ToUint8Clamp: {
		url: 'https://262.ecma-international.org/6.0/#sec-touint8clamp'
	},
	TriggerPromiseReactions: {
		url: 'https://262.ecma-international.org/6.0/#sec-triggerpromisereactions'
	},
	Type: {
		url: 'https://262.ecma-international.org/6.0/#sec-ecmascript-data-types-and-values'
	},
	TypedArrayFrom: {
		url: 'https://262.ecma-international.org/6.0/#sec-typedarrayfrom'
	},
	UpdateEmpty: {
		url: 'https://262.ecma-international.org/6.0/#sec-updateempty'
	},
	UTC: {
		url: 'https://262.ecma-international.org/6.0/#sec-utc-t'
	},
	ValidateAndApplyPropertyDescriptor: {
		url: 'https://262.ecma-international.org/6.0/#sec-validateandapplypropertydescriptor'
	},
	WeekDay: {
		url: 'https://262.ecma-international.org/6.0/#sec-week-day'
	},
	YearFromTime: {
		url: 'https://262.ecma-international.org/6.0/#sec-year-number'
	}
};
'use strict';

module.exports = {
	IsPropertyDescriptor: 'https://262.ecma-international.org/6.0/#sec-property-descriptor-specification-type', // not actually an abstract op

	abs: {
		url: 'https://262.ecma-international.org/7.0/#sec-algorithm-conventions'
	},
	'Abstract Equality Comparison': {
		url: 'https://262.ecma-international.org/7.0/#sec-abstract-equality-comparison'
	},
	'Abstract Relational Comparison': {
		url: 'https://262.ecma-international.org/7.0/#sec-abstract-relational-comparison'
	},
	AddRestrictedFunctionProperties: {
		url: 'https://262.ecma-international.org/7.0/#sec-addrestrictedfunctionproperties'
	},
	AdvanceStringIndex: {
		url: 'https://262.ecma-international.org/7.0/#sec-advancestringindex'
	},
	AllocateArrayBuffer: {
		url: 'https://262.ecma-international.org/7.0/#sec-allocatearraybuffer'
	},
	AllocateTypedArray: {
		url: 'https://262.ecma-international.org/7.0/#sec-allocatetypedarray'
	},
	AllocateTypedArrayBuffer: {
		url: 'https://262.ecma-international.org/7.0/#sec-allocatetypedarraybuffer'
	},
	ArrayCreate: {
		url: 'https://262.ecma-international.org/7.0/#sec-arraycreate'
	},
	ArraySetLength: {
		url: 'https://262.ecma-international.org/7.0/#sec-arraysetlength'
	},
	ArraySpeciesCreate: {
		url: 'https://262.ecma-international.org/7.0/#sec-arrayspeciescreate'
	},
	BlockDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/7.0/#sec-blockdeclarationinstantiation'
	},
	BoundFunctionCreate: {
		url: 'https://262.ecma-international.org/7.0/#sec-boundfunctioncreate'
	},
	Call: {
		url: 'https://262.ecma-international.org/7.0/#sec-call'
	},
	Canonicalize: {
		url: 'https://262.ecma-international.org/7.0/#sec-runtime-semantics-canonicalize-ch'
	},
	CanonicalNumericIndexString: {
		url: 'https://262.ecma-international.org/7.0/#sec-canonicalnumericindexstring'
	},
	CharacterRange: {
		url: 'https://262.ecma-international.org/7.0/#sec-runtime-semantics-characterrange-abstract-operation'
	},
	CharacterRangeOrUnion: {
		url: 'https://262.ecma-international.org/7.0/#sec-runtime-semantics-characterrangeorunion-abstract-operation'
	},
	CharacterSetMatcher: {
		url: 'https://262.ecma-international.org/7.0/#sec-runtime-semantics-charactersetmatcher-abstract-operation'
	},
	CloneArrayBuffer: {
		url: 'https://262.ecma-international.org/7.0/#sec-clonearraybuffer'
	},
	CompletePropertyDescriptor: {
		url: 'https://262.ecma-international.org/7.0/#sec-completepropertydescriptor'
	},
	Completion: {
		url: 'https://262.ecma-international.org/7.0/#sec-completion-record-specification-type'
	},
	Construct: {
		url: 'https://262.ecma-international.org/7.0/#sec-construct'
	},
	CopyDataBlockBytes: {
		url: 'https://262.ecma-international.org/7.0/#sec-copydatablockbytes'
	},
	CreateArrayFromList: {
		url: 'https://262.ecma-international.org/7.0/#sec-createarrayfromlist'
	},
	CreateArrayIterator: {
		url: 'https://262.ecma-international.org/7.0/#sec-createarrayiterator'
	},
	CreateBuiltinFunction: {
		url: 'https://262.ecma-international.org/7.0/#sec-createbuiltinfunction'
	},
	CreateByteDataBlock: {
		url: 'https://262.ecma-international.org/7.0/#sec-createbytedatablock'
	},
	CreateDataProperty: {
		url: 'https://262.ecma-international.org/7.0/#sec-createdataproperty'
	},
	CreateDataPropertyOrThrow: {
		url: 'https://262.ecma-international.org/7.0/#sec-createdatapropertyorthrow'
	},
	CreateDynamicFunction: {
		url: 'https://262.ecma-international.org/7.0/#sec-createdynamicfunction'
	},
	CreateHTML: {
		url: 'https://262.ecma-international.org/7.0/#sec-createhtml'
	},
	CreateIntrinsics: {
		url: 'https://262.ecma-international.org/7.0/#sec-createintrinsics'
	},
	CreateIterResultObject: {
		url: 'https://262.ecma-international.org/7.0/#sec-createiterresultobject'
	},
	CreateListFromArrayLike: {
		url: 'https://262.ecma-international.org/7.0/#sec-createlistfromarraylike'
	},
	CreateListIterator: {
		url: 'https://262.ecma-international.org/7.0/#sec-createlistiterator'
	},
	CreateMapIterator: {
		url: 'https://262.ecma-international.org/7.0/#sec-createmapiterator'
	},
	CreateMappedArgumentsObject: {
		url: 'https://262.ecma-international.org/7.0/#sec-createmappedargumentsobject'
	},
	CreateMethodProperty: {
		url: 'https://262.ecma-international.org/7.0/#sec-createmethodproperty'
	},
	CreatePerIterationEnvironment: {
		url: 'https://262.ecma-international.org/7.0/#sec-createperiterationenvironment'
	},
	CreateRealm: {
		url: 'https://262.ecma-international.org/7.0/#sec-createrealm'
	},
	CreateResolvingFunctions: {
		url: 'https://262.ecma-international.org/7.0/#sec-createresolvingfunctions'
	},
	CreateSetIterator: {
		url: 'https://262.ecma-international.org/7.0/#sec-createsetiterator'
	},
	CreateStringIterator: {
		url: 'https://262.ecma-international.org/7.0/#sec-createstringiterator'
	},
	CreateUnmappedArgumentsObject: {
		url: 'https://262.ecma-international.org/7.0/#sec-createunmappedargumentsobject'
	},
	DateFromTime: {
		url: 'https://262.ecma-international.org/7.0/#sec-date-number'
	},
	Day: {
		url: 'https://262.ecma-international.org/7.0/#sec-day-number-and-time-within-day'
	},
	DayFromYear: {
		url: 'https://262.ecma-international.org/7.0/#sec-year-number'
	},
	DaylightSavingTA: {
		url: 'https://262.ecma-international.org/7.0/#sec-daylight-saving-time-adjustment'
	},
	DaysInYear: {
		url: 'https://262.ecma-international.org/7.0/#sec-year-number'
	},
	DayWithinYear: {
		url: 'https://262.ecma-international.org/7.0/#sec-month-number'
	},
	Decode: {
		url: 'https://262.ecma-international.org/7.0/#sec-decode'
	},
	DefinePropertyOrThrow: {
		url: 'https://262.ecma-international.org/7.0/#sec-definepropertyorthrow'
	},
	DeletePropertyOrThrow: {
		url: 'https://262.ecma-international.org/7.0/#sec-deletepropertyorthrow'
	},
	DetachArrayBuffer: {
		url: 'https://262.ecma-international.org/7.0/#sec-detacharraybuffer'
	},
	Encode: {
		url: 'https://262.ecma-international.org/7.0/#sec-encode'
	},
	EnqueueJob: {
		url: 'https://262.ecma-international.org/7.0/#sec-enqueuejob'
	},
	EnumerableOwnNames: {
		url: 'https://262.ecma-international.org/7.0/#sec-enumerableownnames'
	},
	EnumerateObjectProperties: {
		url: 'https://262.ecma-international.org/7.0/#sec-enumerate-object-properties'
	},
	EscapeRegExpPattern: {
		url: 'https://262.ecma-international.org/7.0/#sec-escaperegexppattern'
	},
	EvalDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/7.0/#sec-evaldeclarationinstantiation'
	},
	EvaluateCall: {
		url: 'https://262.ecma-international.org/7.0/#sec-evaluatecall'
	},
	EvaluateDirectCall: {
		url: 'https://262.ecma-international.org/7.0/#sec-evaluatedirectcall'
	},
	EvaluateNew: {
		url: 'https://262.ecma-international.org/7.0/#sec-evaluatenew'
	},
	floor: {
		url: 'https://262.ecma-international.org/7.0/#sec-algorithm-conventions'
	},
	ForBodyEvaluation: {
		url: 'https://262.ecma-international.org/7.0/#sec-forbodyevaluation'
	},
	'ForIn/OfBodyEvaluation': {
		url: 'https://262.ecma-international.org/7.0/#sec-runtime-semantics-forin-div-ofbodyevaluation-lhs-stmt-iterator-lhskind-labelset'
	},
	'ForIn/OfHeadEvaluation': {
		url: 'https://262.ecma-international.org/7.0/#sec-runtime-semantics-forin-div-ofheadevaluation-tdznames-expr-iterationkind'
	},
	FromPropertyDescriptor: {
		url: 'https://262.ecma-international.org/7.0/#sec-frompropertydescriptor'
	},
	FulfillPromise: {
		url: 'https://262.ecma-international.org/7.0/#sec-fulfillpromise'
	},
	FunctionAllocate: {
		url: 'https://262.ecma-international.org/7.0/#sec-functionallocate'
	},
	FunctionCreate: {
		url: 'https://262.ecma-international.org/7.0/#sec-functioncreate'
	},
	FunctionDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/7.0/#sec-functiondeclarationinstantiation'
	},
	FunctionInitialize: {
		url: 'https://262.ecma-international.org/7.0/#sec-functioninitialize'
	},
	GeneratorFunctionCreate: {
		url: 'https://262.ecma-international.org/7.0/#sec-generatorfunctioncreate'
	},
	GeneratorResume: {
		url: 'https://262.ecma-international.org/7.0/#sec-generatorresume'
	},
	GeneratorResumeAbrupt: {
		url: 'https://262.ecma-international.org/7.0/#sec-generatorresumeabrupt'
	},
	GeneratorStart: {
		url: 'https://262.ecma-international.org/7.0/#sec-generatorstart'
	},
	GeneratorValidate: {
		url: 'https://262.ecma-international.org/7.0/#sec-generatorvalidate'
	},
	GeneratorYield: {
		url: 'https://262.ecma-international.org/7.0/#sec-generatoryield'
	},
	Get: {
		url: 'https://262.ecma-international.org/7.0/#sec-get-o-p'
	},
	GetActiveScriptOrModule: {
		url: 'https://262.ecma-international.org/7.0/#sec-getactivescriptormodule'
	},
	GetFunctionRealm: {
		url: 'https://262.ecma-international.org/7.0/#sec-getfunctionrealm'
	},
	GetGlobalObject: {
		url: 'https://262.ecma-international.org/7.0/#sec-getglobalobject'
	},
	GetIdentifierReference: {
		url: 'https://262.ecma-international.org/7.0/#sec-getidentifierreference'
	},
	GetIterator: {
		url: 'https://262.ecma-international.org/7.0/#sec-getiterator'
	},
	GetMethod: {
		url: 'https://262.ecma-international.org/7.0/#sec-getmethod'
	},
	GetModuleNamespace: {
		url: 'https://262.ecma-international.org/7.0/#sec-getmodulenamespace'
	},
	GetNewTarget: {
		url: 'https://262.ecma-international.org/7.0/#sec-getnewtarget'
	},
	GetOwnPropertyKeys: {
		url: 'https://262.ecma-international.org/7.0/#sec-getownpropertykeys'
	},
	GetPrototypeFromConstructor: {
		url: 'https://262.ecma-international.org/7.0/#sec-getprototypefromconstructor'
	},
	GetSubstitution: {
		url: 'https://262.ecma-international.org/7.0/#sec-getsubstitution'
	},
	GetSuperConstructor: {
		url: 'https://262.ecma-international.org/7.0/#sec-getsuperconstructor'
	},
	GetTemplateObject: {
		url: 'https://262.ecma-international.org/7.0/#sec-gettemplateobject'
	},
	GetThisEnvironment: {
		url: 'https://262.ecma-international.org/7.0/#sec-getthisenvironment'
	},
	GetThisValue: {
		url: 'https://262.ecma-international.org/7.0/#sec-getthisvalue'
	},
	GetV: {
		url: 'https://262.ecma-international.org/7.0/#sec-getv'
	},
	GetValue: {
		url: 'https://262.ecma-international.org/7.0/#sec-getvalue'
	},
	GetValueFromBuffer: {
		url: 'https://262.ecma-international.org/7.0/#sec-getvaluefrombuffer'
	},
	GetViewValue: {
		url: 'https://262.ecma-international.org/7.0/#sec-getviewvalue'
	},
	GlobalDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/7.0/#sec-globaldeclarationinstantiation'
	},
	HasOwnProperty: {
		url: 'https://262.ecma-international.org/7.0/#sec-hasownproperty'
	},
	HasProperty: {
		url: 'https://262.ecma-international.org/7.0/#sec-hasproperty'
	},
	HostPromiseRejectionTracker: {
		url: 'https://262.ecma-international.org/7.0/#sec-host-promise-rejection-tracker'
	},
	HostReportErrors: {
		url: 'https://262.ecma-international.org/7.0/#sec-host-report-errors'
	},
	HostResolveImportedModule: {
		url: 'https://262.ecma-international.org/7.0/#sec-hostresolveimportedmodule'
	},
	HourFromTime: {
		url: 'https://262.ecma-international.org/7.0/#sec-hours-minutes-second-and-milliseconds'
	},
	IfAbruptRejectPromise: {
		url: 'https://262.ecma-international.org/7.0/#sec-ifabruptrejectpromise'
	},
	ImportedLocalNames: {
		url: 'https://262.ecma-international.org/7.0/#sec-importedlocalnames'
	},
	InitializeBoundName: {
		url: 'https://262.ecma-international.org/7.0/#sec-initializeboundname'
	},
	InitializeHostDefinedRealm: {
		url: 'https://262.ecma-international.org/7.0/#sec-initializehostdefinedrealm'
	},
	InitializeReferencedBinding: {
		url: 'https://262.ecma-international.org/7.0/#sec-initializereferencedbinding'
	},
	InLeapYear: {
		url: 'https://262.ecma-international.org/7.0/#sec-year-number'
	},
	InstanceofOperator: {
		url: 'https://262.ecma-international.org/7.0/#sec-instanceofoperator'
	},
	IntegerIndexedElementGet: {
		url: 'https://262.ecma-international.org/7.0/#sec-integerindexedelementget'
	},
	IntegerIndexedElementSet: {
		url: 'https://262.ecma-international.org/7.0/#sec-integerindexedelementset'
	},
	IntegerIndexedObjectCreate: {
		url: 'https://262.ecma-international.org/7.0/#sec-integerindexedobjectcreate'
	},
	InternalizeJSONProperty: {
		url: 'https://262.ecma-international.org/7.0/#sec-internalizejsonproperty'
	},
	Invoke: {
		url: 'https://262.ecma-international.org/7.0/#sec-invoke'
	},
	IsAccessorDescriptor: {
		url: 'https://262.ecma-international.org/7.0/#sec-isaccessordescriptor'
	},
	IsAnonymousFunctionDefinition: {
		url: 'https://262.ecma-international.org/7.0/#sec-isanonymousfunctiondefinition'
	},
	IsArray: {
		url: 'https://262.ecma-international.org/7.0/#sec-isarray'
	},
	IsCallable: {
		url: 'https://262.ecma-international.org/7.0/#sec-iscallable'
	},
	IsCompatiblePropertyDescriptor: {
		url: 'https://262.ecma-international.org/7.0/#sec-iscompatiblepropertydescriptor'
	},
	IsConcatSpreadable: {
		url: 'https://262.ecma-international.org/7.0/#sec-isconcatspreadable'
	},
	IsConstructor: {
		url: 'https://262.ecma-international.org/7.0/#sec-isconstructor'
	},
	IsDataDescriptor: {
		url: 'https://262.ecma-international.org/7.0/#sec-isdatadescriptor'
	},
	IsDetachedBuffer: {
		url: 'https://262.ecma-international.org/7.0/#sec-isdetachedbuffer'
	},
	IsExtensible: {
		url: 'https://262.ecma-international.org/7.0/#sec-isextensible-o'
	},
	IsGenericDescriptor: {
		url: 'https://262.ecma-international.org/7.0/#sec-isgenericdescriptor'
	},
	IsInTailPosition: {
		url: 'https://262.ecma-international.org/7.0/#sec-isintailposition'
	},
	IsInteger: {
		url: 'https://262.ecma-international.org/7.0/#sec-isinteger'
	},
	IsLabelledFunction: {
		url: 'https://262.ecma-international.org/7.0/#sec-islabelledfunction'
	},
	IsPromise: {
		url: 'https://262.ecma-international.org/7.0/#sec-ispromise'
	},
	IsPropertyKey: {
		url: 'https://262.ecma-international.org/7.0/#sec-ispropertykey'
	},
	IsRegExp: {
		url: 'https://262.ecma-international.org/7.0/#sec-isregexp'
	},
	IsWordChar: {
		url: 'https://262.ecma-international.org/7.0/#sec-runtime-semantics-iswordchar-abstract-operation'
	},
	IterableToArrayLike: {
		url: 'https://262.ecma-international.org/7.0/#sec-iterabletoarraylike'
	},
	IteratorClose: {
		url: 'https://262.ecma-international.org/7.0/#sec-iteratorclose'
	},
	IteratorComplete: {
		url: 'https://262.ecma-international.org/7.0/#sec-iteratorcomplete'
	},
	IteratorNext: {
		url: 'https://262.ecma-international.org/7.0/#sec-iteratornext'
	},
	IteratorStep: {
		url: 'https://262.ecma-international.org/7.0/#sec-iteratorstep'
	},
	IteratorValue: {
		url: 'https://262.ecma-international.org/7.0/#sec-iteratorvalue'
	},
	LocalTime: {
		url: 'https://262.ecma-international.org/7.0/#sec-localtime'
	},
	LoopContinues: {
		url: 'https://262.ecma-international.org/7.0/#sec-loopcontinues'
	},
	MakeArgGetter: {
		url: 'https://262.ecma-international.org/7.0/#sec-makearggetter'
	},
	MakeArgSetter: {
		url: 'https://262.ecma-international.org/7.0/#sec-makeargsetter'
	},
	MakeClassConstructor: {
		url: 'https://262.ecma-international.org/7.0/#sec-makeclassconstructor'
	},
	MakeConstructor: {
		url: 'https://262.ecma-international.org/7.0/#sec-makeconstructor'
	},
	MakeDate: {
		url: 'https://262.ecma-international.org/7.0/#sec-makedate'
	},
	MakeDay: {
		url: 'https://262.ecma-international.org/7.0/#sec-makeday'
	},
	MakeMethod: {
		url: 'https://262.ecma-international.org/7.0/#sec-makemethod'
	},
	MakeSuperPropertyReference: {
		url: 'https://262.ecma-international.org/7.0/#sec-makesuperpropertyreference'
	},
	MakeTime: {
		url: 'https://262.ecma-international.org/7.0/#sec-maketime'
	},
	max: {
		url: 'https://262.ecma-international.org/7.0/#sec-algorithm-conventions'
	},
	min: {
		url: 'https://262.ecma-international.org/7.0/#sec-algorithm-conventions'
	},
	MinFromTime: {
		url: 'https://262.ecma-international.org/7.0/#sec-hours-minutes-second-and-milliseconds'
	},
	ModuleNamespaceCreate: {
		url: 'https://262.ecma-international.org/7.0/#sec-modulenamespacecreate'
	},
	modulo: {
		url: 'https://262.ecma-international.org/7.0/#sec-algorithm-conventions'
	},
	MonthFromTime: {
		url: 'https://262.ecma-international.org/7.0/#sec-month-number'
	},
	msFromTime: {
		url: 'https://262.ecma-international.org/7.0/#sec-hours-minutes-second-and-milliseconds'
	},
	NewDeclarativeEnvironment: {
		url: 'https://262.ecma-international.org/7.0/#sec-newdeclarativeenvironment'
	},
	NewFunctionEnvironment: {
		url: 'https://262.ecma-international.org/7.0/#sec-newfunctionenvironment'
	},
	NewGlobalEnvironment: {
		url: 'https://262.ecma-international.org/7.0/#sec-newglobalenvironment'
	},
	NewModuleEnvironment: {
		url: 'https://262.ecma-international.org/7.0/#sec-newmoduleenvironment'
	},
	NewObjectEnvironment: {
		url: 'https://262.ecma-international.org/7.0/#sec-newobjectenvironment'
	},
	NewPromiseCapability: {
		url: 'https://262.ecma-international.org/7.0/#sec-newpromisecapability'
	},
	NextJob: {
		url: 'https://262.ecma-international.org/7.0/#sec-nextjob-result'
	},
	NormalCompletion: {
		url: 'https://262.ecma-international.org/7.0/#sec-normalcompletion'
	},
	ObjectCreate: {
		url: 'https://262.ecma-international.org/7.0/#sec-objectcreate'
	},
	ObjectDefineProperties: {
		url: 'https://262.ecma-international.org/7.0/#sec-objectdefineproperties'
	},
	OrdinaryCallBindThis: {
		url: 'https://262.ecma-international.org/7.0/#sec-ordinarycallbindthis'
	},
	OrdinaryCallEvaluateBody: {
		url: 'https://262.ecma-international.org/7.0/#sec-ordinarycallevaluatebody'
	},
	OrdinaryCreateFromConstructor: {
		url: 'https://262.ecma-international.org/7.0/#sec-ordinarycreatefromconstructor'
	},
	OrdinaryDefineOwnProperty: {
		url: 'https://262.ecma-international.org/7.0/#sec-ordinarydefineownproperty'
	},
	OrdinaryDelete: {
		url: 'https://262.ecma-international.org/7.0/#sec-ordinarydelete'
	},
	OrdinaryGet: {
		url: 'https://262.ecma-international.org/7.0/#sec-ordinaryget'
	},
	OrdinaryGetOwnProperty: {
		url: 'https://262.ecma-international.org/7.0/#sec-ordinarygetownproperty'
	},
	OrdinaryGetPrototypeOf: {
		url: 'https://262.ecma-international.org/7.0/#sec-ordinarygetprototypeof'
	},
	OrdinaryHasInstance: {
		url: 'https://262.ecma-international.org/7.0/#sec-ordinaryhasinstance'
	},
	OrdinaryHasProperty: {
		url: 'https://262.ecma-international.org/7.0/#sec-ordinaryhasproperty'
	},
	OrdinaryIsExtensible: {
		url: 'https://262.ecma-international.org/7.0/#sec-ordinaryisextensible'
	},
	OrdinaryOwnPropertyKeys: {
		url: 'https://262.ecma-international.org/7.0/#sec-ordinaryownpropertykeys'
	},
	OrdinaryPreventExtensions: {
		url: 'https://262.ecma-international.org/7.0/#sec-ordinarypreventextensions'
	},
	OrdinarySet: {
		url: 'https://262.ecma-international.org/7.0/#sec-ordinaryset'
	},
	OrdinarySetPrototypeOf: {
		url: 'https://262.ecma-international.org/7.0/#sec-ordinarysetprototypeof'
	},
	ParseModule: {
		url: 'https://262.ecma-international.org/7.0/#sec-parsemodule'
	},
	ParseScript: {
		url: 'https://262.ecma-international.org/7.0/#sec-parse-script'
	},
	PerformEval: {
		url: 'https://262.ecma-international.org/7.0/#sec-performeval'
	},
	PerformPromiseAll: {
		url: 'https://262.ecma-international.org/7.0/#sec-performpromiseall'
	},
	PerformPromiseRace: {
		url: 'https://262.ecma-international.org/7.0/#sec-performpromiserace'
	},
	PerformPromiseThen: {
		url: 'https://262.ecma-international.org/7.0/#sec-performpromisethen'
	},
	PrepareForOrdinaryCall: {
		url: 'https://262.ecma-international.org/7.0/#sec-prepareforordinarycall'
	},
	PrepareForTailCall: {
		url: 'https://262.ecma-international.org/7.0/#sec-preparefortailcall'
	},
	PromiseReactionJob: {
		url: 'https://262.ecma-international.org/7.0/#sec-promisereactionjob'
	},
	PromiseResolveThenableJob: {
		url: 'https://262.ecma-international.org/7.0/#sec-promiseresolvethenablejob'
	},
	ProxyCreate: {
		url: 'https://262.ecma-international.org/7.0/#sec-proxycreate'
	},
	PutValue: {
		url: 'https://262.ecma-international.org/7.0/#sec-putvalue'
	},
	QuoteJSONString: {
		url: 'https://262.ecma-international.org/7.0/#sec-quotejsonstring'
	},
	RegExpAlloc: {
		url: 'https://262.ecma-international.org/7.0/#sec-regexpalloc'
	},
	RegExpBuiltinExec: {
		url: 'https://262.ecma-international.org/7.0/#sec-regexpbuiltinexec'
	},
	RegExpCreate: {
		url: 'https://262.ecma-international.org/7.0/#sec-regexpcreate'
	},
	RegExpExec: {
		url: 'https://262.ecma-international.org/7.0/#sec-regexpexec'
	},
	RegExpInitialize: {
		url: 'https://262.ecma-international.org/7.0/#sec-regexpinitialize'
	},
	RejectPromise: {
		url: 'https://262.ecma-international.org/7.0/#sec-rejectpromise'
	},
	RepeatMatcher: {
		url: 'https://262.ecma-international.org/7.0/#sec-runtime-semantics-repeatmatcher-abstract-operation'
	},
	RequireObjectCoercible: {
		url: 'https://262.ecma-international.org/7.0/#sec-requireobjectcoercible'
	},
	ResolveBinding: {
		url: 'https://262.ecma-international.org/7.0/#sec-resolvebinding'
	},
	ResolveThisBinding: {
		url: 'https://262.ecma-international.org/7.0/#sec-resolvethisbinding'
	},
	ReturnIfAbrupt: {
		url: 'https://262.ecma-international.org/7.0/#sec-returnifabrupt'
	},
	SameValue: {
		url: 'https://262.ecma-international.org/7.0/#sec-samevalue'
	},
	SameValueNonNumber: {
		url: 'https://262.ecma-international.org/7.0/#sec-samevaluenonnumber'
	},
	SameValueZero: {
		url: 'https://262.ecma-international.org/7.0/#sec-samevaluezero'
	},
	ScriptEvaluation: {
		url: 'https://262.ecma-international.org/7.0/#sec-runtime-semantics-scriptevaluation'
	},
	ScriptEvaluationJob: {
		url: 'https://262.ecma-international.org/7.0/#sec-scriptevaluationjob'
	},
	SecFromTime: {
		url: 'https://262.ecma-international.org/7.0/#sec-hours-minutes-second-and-milliseconds'
	},
	SerializeJSONArray: {
		url: 'https://262.ecma-international.org/7.0/#sec-serializejsonarray'
	},
	SerializeJSONObject: {
		url: 'https://262.ecma-international.org/7.0/#sec-serializejsonobject'
	},
	SerializeJSONProperty: {
		url: 'https://262.ecma-international.org/7.0/#sec-serializejsonproperty'
	},
	Set: {
		url: 'https://262.ecma-international.org/7.0/#sec-set-o-p-v-throw'
	},
	SetDefaultGlobalBindings: {
		url: 'https://262.ecma-international.org/7.0/#sec-setdefaultglobalbindings'
	},
	SetFunctionName: {
		url: 'https://262.ecma-international.org/7.0/#sec-setfunctionname'
	},
	SetIntegrityLevel: {
		url: 'https://262.ecma-international.org/7.0/#sec-setintegritylevel'
	},
	SetRealmGlobalObject: {
		url: 'https://262.ecma-international.org/7.0/#sec-setrealmglobalobject'
	},
	SetValueInBuffer: {
		url: 'https://262.ecma-international.org/7.0/#sec-setvalueinbuffer'
	},
	SetViewValue: {
		url: 'https://262.ecma-international.org/7.0/#sec-setviewvalue'
	},
	SortCompare: {
		url: 'https://262.ecma-international.org/7.0/#sec-sortcompare'
	},
	SpeciesConstructor: {
		url: 'https://262.ecma-international.org/7.0/#sec-speciesconstructor'
	},
	SplitMatch: {
		url: 'https://262.ecma-international.org/7.0/#sec-splitmatch'
	},
	'Strict Equality Comparison': {
		url: 'https://262.ecma-international.org/7.0/#sec-strict-equality-comparison'
	},
	StringCreate: {
		url: 'https://262.ecma-international.org/7.0/#sec-stringcreate'
	},
	SymbolDescriptiveString: {
		url: 'https://262.ecma-international.org/7.0/#sec-symboldescriptivestring'
	},
	TestIntegrityLevel: {
		url: 'https://262.ecma-international.org/7.0/#sec-testintegritylevel'
	},
	thisBooleanValue: {
		url: 'https://262.ecma-international.org/7.0/#sec-thisbooleanvalue'
	},
	thisNumberValue: {
		url: 'https://262.ecma-international.org/7.0/#sec-properties-of-the-number-prototype-object'
	},
	thisStringValue: {
		url: 'https://262.ecma-international.org/7.0/#sec-properties-of-the-string-prototype-object'
	},
	thisTimeValue: {
		url: 'https://262.ecma-international.org/7.0/#sec-properties-of-the-date-prototype-object'
	},
	TimeClip: {
		url: 'https://262.ecma-international.org/7.0/#sec-timeclip'
	},
	TimeFromYear: {
		url: 'https://262.ecma-international.org/7.0/#sec-year-number'
	},
	TimeWithinDay: {
		url: 'https://262.ecma-international.org/7.0/#sec-day-number-and-time-within-day'
	},
	ToBoolean: {
		url: 'https://262.ecma-international.org/7.0/#sec-toboolean'
	},
	ToDateString: {
		url: 'https://262.ecma-international.org/7.0/#sec-todatestring'
	},
	ToInt16: {
		url: 'https://262.ecma-international.org/7.0/#sec-toint16'
	},
	ToInt32: {
		url: 'https://262.ecma-international.org/7.0/#sec-toint32'
	},
	ToInt8: {
		url: 'https://262.ecma-international.org/7.0/#sec-toint8'
	},
	ToInteger: {
		url: 'https://262.ecma-international.org/7.0/#sec-tointeger'
	},
	ToLength: {
		url: 'https://262.ecma-international.org/7.0/#sec-tolength'
	},
	ToNumber: {
		url: 'https://262.ecma-international.org/7.0/#sec-tonumber'
	},
	ToObject: {
		url: 'https://262.ecma-international.org/7.0/#sec-toobject'
	},
	TopLevelModuleEvaluationJob: {
		url: 'https://262.ecma-international.org/7.0/#sec-toplevelmoduleevaluationjob'
	},
	ToPrimitive: {
		url: 'https://262.ecma-international.org/7.0/#sec-toprimitive'
	},
	ToPropertyDescriptor: {
		url: 'https://262.ecma-international.org/7.0/#sec-topropertydescriptor'
	},
	ToPropertyKey: {
		url: 'https://262.ecma-international.org/7.0/#sec-topropertykey'
	},
	ToString: {
		url: 'https://262.ecma-international.org/7.0/#sec-tostring'
	},
	'ToString Applied to the Number Type': {
		url: 'https://262.ecma-international.org/7.0/#sec-tostring-applied-to-the-number-type'
	},
	ToUint16: {
		url: 'https://262.ecma-international.org/7.0/#sec-touint16'
	},
	ToUint32: {
		url: 'https://262.ecma-international.org/7.0/#sec-touint32'
	},
	ToUint8: {
		url: 'https://262.ecma-international.org/7.0/#sec-touint8'
	},
	ToUint8Clamp: {
		url: 'https://262.ecma-international.org/7.0/#sec-touint8clamp'
	},
	TriggerPromiseReactions: {
		url: 'https://262.ecma-international.org/7.0/#sec-triggerpromisereactions'
	},
	Type: {
		url: 'https://262.ecma-international.org/7.0/#sec-ecmascript-data-types-and-values'
	},
	TypedArrayCreate: {
		url: 'https://262.ecma-international.org/7.0/#typedarray-create'
	},
	TypedArraySpeciesCreate: {
		url: 'https://262.ecma-international.org/7.0/#typedarray-species-create'
	},
	UpdateEmpty: {
		url: 'https://262.ecma-international.org/7.0/#sec-updateempty'
	},
	UTC: {
		url: 'https://262.ecma-international.org/7.0/#sec-utc-t'
	},
	UTF16Decode: {
		url: 'https://262.ecma-international.org/7.0/#sec-utf16decode'
	},
	UTF16Encoding: {
		url: 'https://262.ecma-international.org/7.0/#sec-utf16encoding'
	},
	ValidateAndApplyPropertyDescriptor: {
		url: 'https://262.ecma-international.org/7.0/#sec-validateandapplypropertydescriptor'
	},
	ValidateTypedArray: {
		url: 'https://262.ecma-international.org/7.0/#sec-validatetypedarray'
	},
	WeekDay: {
		url: 'https://262.ecma-international.org/7.0/#sec-week-day'
	},
	YearFromTime: {
		url: 'https://262.ecma-international.org/7.0/#sec-year-number'
	}
};
'use strict';

module.exports = {
	IsPropertyDescriptor: 'https://262.ecma-international.org/6.0/#sec-property-descriptor-specification-type', // not actually an abstract op

	abs: {
		url: 'https://262.ecma-international.org/8.0/#eqn-abs'
	},
	'Abstract Equality Comparison': {
		url: 'https://262.ecma-international.org/8.0/#sec-abstract-equality-comparison'
	},
	'Abstract Relational Comparison': {
		url: 'https://262.ecma-international.org/8.0/#sec-abstract-relational-comparison'
	},
	AddRestrictedFunctionProperties: {
		url: 'https://262.ecma-international.org/8.0/#sec-addrestrictedfunctionproperties'
	},
	AddWaiter: {
		url: 'https://262.ecma-international.org/8.0/#sec-addwaiter'
	},
	AdvanceStringIndex: {
		url: 'https://262.ecma-international.org/8.0/#sec-advancestringindex'
	},
	'agent-order': {
		url: 'https://262.ecma-international.org/8.0/#sec-agent-order'
	},
	AgentCanSuspend: {
		url: 'https://262.ecma-international.org/8.0/#sec-agentcansuspend'
	},
	AgentSignifier: {
		url: 'https://262.ecma-international.org/8.0/#sec-agentsignifier'
	},
	AllocateArrayBuffer: {
		url: 'https://262.ecma-international.org/8.0/#sec-allocatearraybuffer'
	},
	AllocateSharedArrayBuffer: {
		url: 'https://262.ecma-international.org/8.0/#sec-allocatesharedarraybuffer'
	},
	AllocateTypedArray: {
		url: 'https://262.ecma-international.org/8.0/#sec-allocatetypedarray'
	},
	AllocateTypedArrayBuffer: {
		url: 'https://262.ecma-international.org/8.0/#sec-allocatetypedarraybuffer'
	},
	ArrayCreate: {
		url: 'https://262.ecma-international.org/8.0/#sec-arraycreate'
	},
	ArraySetLength: {
		url: 'https://262.ecma-international.org/8.0/#sec-arraysetlength'
	},
	ArraySpeciesCreate: {
		url: 'https://262.ecma-international.org/8.0/#sec-arrayspeciescreate'
	},
	AsyncFunctionAwait: {
		url: 'https://262.ecma-international.org/8.0/#sec-async-functions-abstract-operations-async-function-await'
	},
	AsyncFunctionCreate: {
		url: 'https://262.ecma-international.org/8.0/#sec-async-functions-abstract-operations-async-function-create'
	},
	AsyncFunctionStart: {
		url: 'https://262.ecma-international.org/8.0/#sec-async-functions-abstract-operations-async-function-start'
	},
	AtomicLoad: {
		url: 'https://262.ecma-international.org/8.0/#sec-atomicload'
	},
	AtomicReadModifyWrite: {
		url: 'https://262.ecma-international.org/8.0/#sec-atomicreadmodifywrite'
	},
	BlockDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/8.0/#sec-blockdeclarationinstantiation'
	},
	BoundFunctionCreate: {
		url: 'https://262.ecma-international.org/8.0/#sec-boundfunctioncreate'
	},
	Call: {
		url: 'https://262.ecma-international.org/8.0/#sec-call'
	},
	Canonicalize: {
		url: 'https://262.ecma-international.org/8.0/#sec-runtime-semantics-canonicalize-ch'
	},
	CanonicalNumericIndexString: {
		url: 'https://262.ecma-international.org/8.0/#sec-canonicalnumericindexstring'
	},
	CharacterRange: {
		url: 'https://262.ecma-international.org/8.0/#sec-runtime-semantics-characterrange-abstract-operation'
	},
	CharacterRangeOrUnion: {
		url: 'https://262.ecma-international.org/8.0/#sec-runtime-semantics-characterrangeorunion-abstract-operation'
	},
	CharacterSetMatcher: {
		url: 'https://262.ecma-international.org/8.0/#sec-runtime-semantics-charactersetmatcher-abstract-operation'
	},
	CloneArrayBuffer: {
		url: 'https://262.ecma-international.org/8.0/#sec-clonearraybuffer'
	},
	CompletePropertyDescriptor: {
		url: 'https://262.ecma-international.org/8.0/#sec-completepropertydescriptor'
	},
	Completion: {
		url: 'https://262.ecma-international.org/8.0/#sec-completion-record-specification-type'
	},
	ComposeWriteEventBytes: {
		url: 'https://262.ecma-international.org/8.0/#sec-composewriteeventbytes'
	},
	Construct: {
		url: 'https://262.ecma-international.org/8.0/#sec-construct'
	},
	CopyDataBlockBytes: {
		url: 'https://262.ecma-international.org/8.0/#sec-copydatablockbytes'
	},
	CreateArrayFromList: {
		url: 'https://262.ecma-international.org/8.0/#sec-createarrayfromlist'
	},
	CreateArrayIterator: {
		url: 'https://262.ecma-international.org/8.0/#sec-createarrayiterator'
	},
	CreateBuiltinFunction: {
		url: 'https://262.ecma-international.org/8.0/#sec-createbuiltinfunction'
	},
	CreateByteDataBlock: {
		url: 'https://262.ecma-international.org/8.0/#sec-createbytedatablock'
	},
	CreateDataProperty: {
		url: 'https://262.ecma-international.org/8.0/#sec-createdataproperty'
	},
	CreateDataPropertyOrThrow: {
		url: 'https://262.ecma-international.org/8.0/#sec-createdatapropertyorthrow'
	},
	CreateDynamicFunction: {
		url: 'https://262.ecma-international.org/8.0/#sec-createdynamicfunction'
	},
	CreateHTML: {
		url: 'https://262.ecma-international.org/8.0/#sec-createhtml'
	},
	CreateIntrinsics: {
		url: 'https://262.ecma-international.org/8.0/#sec-createintrinsics'
	},
	CreateIterResultObject: {
		url: 'https://262.ecma-international.org/8.0/#sec-createiterresultobject'
	},
	CreateListFromArrayLike: {
		url: 'https://262.ecma-international.org/8.0/#sec-createlistfromarraylike'
	},
	CreateListIterator: {
		url: 'https://262.ecma-international.org/8.0/#sec-createlistiterator'
	},
	CreateMapIterator: {
		url: 'https://262.ecma-international.org/8.0/#sec-createmapiterator'
	},
	CreateMappedArgumentsObject: {
		url: 'https://262.ecma-international.org/8.0/#sec-createmappedargumentsobject'
	},
	CreateMethodProperty: {
		url: 'https://262.ecma-international.org/8.0/#sec-createmethodproperty'
	},
	CreatePerIterationEnvironment: {
		url: 'https://262.ecma-international.org/8.0/#sec-createperiterationenvironment'
	},
	CreateRealm: {
		url: 'https://262.ecma-international.org/8.0/#sec-createrealm'
	},
	CreateResolvingFunctions: {
		url: 'https://262.ecma-international.org/8.0/#sec-createresolvingfunctions'
	},
	CreateSetIterator: {
		url: 'https://262.ecma-international.org/8.0/#sec-createsetiterator'
	},
	CreateSharedByteDataBlock: {
		url: 'https://262.ecma-international.org/8.0/#sec-createsharedbytedatablock'
	},
	CreateStringIterator: {
		url: 'https://262.ecma-international.org/8.0/#sec-createstringiterator'
	},
	CreateUnmappedArgumentsObject: {
		url: 'https://262.ecma-international.org/8.0/#sec-createunmappedargumentsobject'
	},
	DateFromTime: {
		url: 'https://262.ecma-international.org/8.0/#sec-date-number'
	},
	Day: {
		url: 'https://262.ecma-international.org/8.0/#eqn-Day'
	},
	DayFromYear: {
		url: 'https://262.ecma-international.org/8.0/#eqn-DaysFromYear'
	},
	DaylightSavingTA: {
		url: 'https://262.ecma-international.org/8.0/#sec-daylight-saving-time-adjustment'
	},
	DaysInYear: {
		url: 'https://262.ecma-international.org/8.0/#eqn-DaysInYear'
	},
	DayWithinYear: {
		url: 'https://262.ecma-international.org/8.0/#eqn-DayWithinYear'
	},
	Decode: {
		url: 'https://262.ecma-international.org/8.0/#sec-decode'
	},
	DefinePropertyOrThrow: {
		url: 'https://262.ecma-international.org/8.0/#sec-definepropertyorthrow'
	},
	DeletePropertyOrThrow: {
		url: 'https://262.ecma-international.org/8.0/#sec-deletepropertyorthrow'
	},
	DetachArrayBuffer: {
		url: 'https://262.ecma-international.org/8.0/#sec-detacharraybuffer'
	},
	Encode: {
		url: 'https://262.ecma-international.org/8.0/#sec-encode'
	},
	EnqueueJob: {
		url: 'https://262.ecma-international.org/8.0/#sec-enqueuejob'
	},
	EnterCriticalSection: {
		url: 'https://262.ecma-international.org/8.0/#sec-entercriticalsection'
	},
	EnumerableOwnProperties: {
		url: 'https://262.ecma-international.org/8.0/#sec-enumerableownproperties'
	},
	EnumerateObjectProperties: {
		url: 'https://262.ecma-international.org/8.0/#sec-enumerate-object-properties'
	},
	EscapeRegExpPattern: {
		url: 'https://262.ecma-international.org/8.0/#sec-escaperegexppattern'
	},
	EvalDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/8.0/#sec-evaldeclarationinstantiation'
	},
	EvaluateCall: {
		url: 'https://262.ecma-international.org/8.0/#sec-evaluatecall'
	},
	EvaluateDirectCall: {
		url: 'https://262.ecma-international.org/8.0/#sec-evaluatedirectcall'
	},
	EvaluateNew: {
		url: 'https://262.ecma-international.org/8.0/#sec-evaluatenew'
	},
	EventSet: {
		url: 'https://262.ecma-international.org/8.0/#sec-event-set'
	},
	floor: {
		url: 'https://262.ecma-international.org/8.0/#eqn-floor'
	},
	ForBodyEvaluation: {
		url: 'https://262.ecma-international.org/8.0/#sec-forbodyevaluation'
	},
	'ForIn/OfBodyEvaluation': {
		url: 'https://262.ecma-international.org/8.0/#sec-runtime-semantics-forin-div-ofbodyevaluation-lhs-stmt-iterator-lhskind-labelset'
	},
	'ForIn/OfHeadEvaluation': {
		url: 'https://262.ecma-international.org/8.0/#sec-runtime-semantics-forin-div-ofheadevaluation-tdznames-expr-iterationkind'
	},
	FromPropertyDescriptor: {
		url: 'https://262.ecma-international.org/8.0/#sec-frompropertydescriptor'
	},
	FulfillPromise: {
		url: 'https://262.ecma-international.org/8.0/#sec-fulfillpromise'
	},
	FunctionAllocate: {
		url: 'https://262.ecma-international.org/8.0/#sec-functionallocate'
	},
	FunctionCreate: {
		url: 'https://262.ecma-international.org/8.0/#sec-functioncreate'
	},
	FunctionDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/8.0/#sec-functiondeclarationinstantiation'
	},
	FunctionInitialize: {
		url: 'https://262.ecma-international.org/8.0/#sec-functioninitialize'
	},
	GeneratorFunctionCreate: {
		url: 'https://262.ecma-international.org/8.0/#sec-generatorfunctioncreate'
	},
	GeneratorResume: {
		url: 'https://262.ecma-international.org/8.0/#sec-generatorresume'
	},
	GeneratorResumeAbrupt: {
		url: 'https://262.ecma-international.org/8.0/#sec-generatorresumeabrupt'
	},
	GeneratorStart: {
		url: 'https://262.ecma-international.org/8.0/#sec-generatorstart'
	},
	GeneratorValidate: {
		url: 'https://262.ecma-international.org/8.0/#sec-generatorvalidate'
	},
	GeneratorYield: {
		url: 'https://262.ecma-international.org/8.0/#sec-generatoryield'
	},
	Get: {
		url: 'https://262.ecma-international.org/8.0/#sec-get-o-p'
	},
	GetActiveScriptOrModule: {
		url: 'https://262.ecma-international.org/8.0/#sec-getactivescriptormodule'
	},
	GetBase: {
		url: 'https://262.ecma-international.org/8.0/#ao-getbase'
	},
	GetFunctionRealm: {
		url: 'https://262.ecma-international.org/8.0/#sec-getfunctionrealm'
	},
	GetGlobalObject: {
		url: 'https://262.ecma-international.org/8.0/#sec-getglobalobject'
	},
	GetIdentifierReference: {
		url: 'https://262.ecma-international.org/8.0/#sec-getidentifierreference'
	},
	GetIterator: {
		url: 'https://262.ecma-international.org/8.0/#sec-getiterator'
	},
	GetMethod: {
		url: 'https://262.ecma-international.org/8.0/#sec-getmethod'
	},
	GetModifySetValueInBuffer: {
		url: 'https://262.ecma-international.org/8.0/#sec-getmodifysetvalueinbuffer'
	},
	GetModuleNamespace: {
		url: 'https://262.ecma-international.org/8.0/#sec-getmodulenamespace'
	},
	GetNewTarget: {
		url: 'https://262.ecma-international.org/8.0/#sec-getnewtarget'
	},
	GetOwnPropertyKeys: {
		url: 'https://262.ecma-international.org/8.0/#sec-getownpropertykeys'
	},
	GetPrototypeFromConstructor: {
		url: 'https://262.ecma-international.org/8.0/#sec-getprototypefromconstructor'
	},
	GetReferencedName: {
		url: 'https://262.ecma-international.org/8.0/#ao-getreferencedname'
	},
	GetSubstitution: {
		url: 'https://262.ecma-international.org/8.0/#sec-getsubstitution'
	},
	GetSuperConstructor: {
		url: 'https://262.ecma-international.org/8.0/#sec-getsuperconstructor'
	},
	GetTemplateObject: {
		url: 'https://262.ecma-international.org/8.0/#sec-gettemplateobject'
	},
	GetThisEnvironment: {
		url: 'https://262.ecma-international.org/8.0/#sec-getthisenvironment'
	},
	GetThisValue: {
		url: 'https://262.ecma-international.org/8.0/#sec-getthisvalue'
	},
	GetV: {
		url: 'https://262.ecma-international.org/8.0/#sec-getv'
	},
	GetValue: {
		url: 'https://262.ecma-international.org/8.0/#sec-getvalue'
	},
	GetValueFromBuffer: {
		url: 'https://262.ecma-international.org/8.0/#sec-getvaluefrombuffer'
	},
	GetViewValue: {
		url: 'https://262.ecma-international.org/8.0/#sec-getviewvalue'
	},
	GetWaiterList: {
		url: 'https://262.ecma-international.org/8.0/#sec-getwaiterlist'
	},
	GlobalDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/8.0/#sec-globaldeclarationinstantiation'
	},
	'happens-before': {
		url: 'https://262.ecma-international.org/8.0/#sec-happens-before'
	},
	HasOwnProperty: {
		url: 'https://262.ecma-international.org/8.0/#sec-hasownproperty'
	},
	HasPrimitiveBase: {
		url: 'https://262.ecma-international.org/8.0/#ao-hasprimitivebase'
	},
	HasProperty: {
		url: 'https://262.ecma-international.org/8.0/#sec-hasproperty'
	},
	'host-synchronizes-with': {
		url: 'https://262.ecma-international.org/8.0/#sec-host-synchronizes-with'
	},
	HostEnsureCanCompileStrings: {
		url: 'https://262.ecma-international.org/8.0/#sec-hostensurecancompilestrings'
	},
	HostEventSet: {
		url: 'https://262.ecma-international.org/8.0/#sec-hosteventset'
	},
	HostPromiseRejectionTracker: {
		url: 'https://262.ecma-international.org/8.0/#sec-host-promise-rejection-tracker'
	},
	HostReportErrors: {
		url: 'https://262.ecma-international.org/8.0/#sec-host-report-errors'
	},
	HostResolveImportedModule: {
		url: 'https://262.ecma-international.org/8.0/#sec-hostresolveimportedmodule'
	},
	HourFromTime: {
		url: 'https://262.ecma-international.org/8.0/#eqn-HourFromTime'
	},
	IfAbruptRejectPromise: {
		url: 'https://262.ecma-international.org/8.0/#sec-ifabruptrejectpromise'
	},
	ImportedLocalNames: {
		url: 'https://262.ecma-international.org/8.0/#sec-importedlocalnames'
	},
	InitializeBoundName: {
		url: 'https://262.ecma-international.org/8.0/#sec-initializeboundname'
	},
	InitializeHostDefinedRealm: {
		url: 'https://262.ecma-international.org/8.0/#sec-initializehostdefinedrealm'
	},
	InitializeReferencedBinding: {
		url: 'https://262.ecma-international.org/8.0/#sec-initializereferencedbinding'
	},
	InLeapYear: {
		url: 'https://262.ecma-international.org/8.0/#eqn-InLeapYear'
	},
	InstanceofOperator: {
		url: 'https://262.ecma-international.org/8.0/#sec-instanceofoperator'
	},
	IntegerIndexedElementGet: {
		url: 'https://262.ecma-international.org/8.0/#sec-integerindexedelementget'
	},
	IntegerIndexedElementSet: {
		url: 'https://262.ecma-international.org/8.0/#sec-integerindexedelementset'
	},
	IntegerIndexedObjectCreate: {
		url: 'https://262.ecma-international.org/8.0/#sec-integerindexedobjectcreate'
	},
	InternalizeJSONProperty: {
		url: 'https://262.ecma-international.org/8.0/#sec-internalizejsonproperty'
	},
	Invoke: {
		url: 'https://262.ecma-international.org/8.0/#sec-invoke'
	},
	IsAccessorDescriptor: {
		url: 'https://262.ecma-international.org/8.0/#sec-isaccessordescriptor'
	},
	IsAnonymousFunctionDefinition: {
		url: 'https://262.ecma-international.org/8.0/#sec-isanonymousfunctiondefinition'
	},
	IsArray: {
		url: 'https://262.ecma-international.org/8.0/#sec-isarray'
	},
	IsCallable: {
		url: 'https://262.ecma-international.org/8.0/#sec-iscallable'
	},
	IsCompatiblePropertyDescriptor: {
		url: 'https://262.ecma-international.org/8.0/#sec-iscompatiblepropertydescriptor'
	},
	IsConcatSpreadable: {
		url: 'https://262.ecma-international.org/8.0/#sec-isconcatspreadable'
	},
	IsConstructor: {
		url: 'https://262.ecma-international.org/8.0/#sec-isconstructor'
	},
	IsDataDescriptor: {
		url: 'https://262.ecma-international.org/8.0/#sec-isdatadescriptor'
	},
	IsDetachedBuffer: {
		url: 'https://262.ecma-international.org/8.0/#sec-isdetachedbuffer'
	},
	IsExtensible: {
		url: 'https://262.ecma-international.org/8.0/#sec-isextensible-o'
	},
	IsGenericDescriptor: {
		url: 'https://262.ecma-international.org/8.0/#sec-isgenericdescriptor'
	},
	IsInTailPosition: {
		url: 'https://262.ecma-international.org/8.0/#sec-isintailposition'
	},
	IsInteger: {
		url: 'https://262.ecma-international.org/8.0/#sec-isinteger'
	},
	IsLabelledFunction: {
		url: 'https://262.ecma-international.org/8.0/#sec-islabelledfunction'
	},
	IsPromise: {
		url: 'https://262.ecma-international.org/8.0/#sec-ispromise'
	},
	IsPropertyKey: {
		url: 'https://262.ecma-international.org/8.0/#sec-ispropertykey'
	},
	IsPropertyReference: {
		url: 'https://262.ecma-international.org/8.0/#ao-ispropertyreference'
	},
	IsRegExp: {
		url: 'https://262.ecma-international.org/8.0/#sec-isregexp'
	},
	IsSharedArrayBuffer: {
		url: 'https://262.ecma-international.org/8.0/#sec-issharedarraybuffer'
	},
	IsStrictReference: {
		url: 'https://262.ecma-international.org/8.0/#ao-isstrictreference'
	},
	IsSuperReference: {
		url: 'https://262.ecma-international.org/8.0/#ao-issuperreference'
	},
	IsUnresolvableReference: {
		url: 'https://262.ecma-international.org/8.0/#ao-isunresolvablereference'
	},
	IsWordChar: {
		url: 'https://262.ecma-international.org/8.0/#sec-runtime-semantics-iswordchar-abstract-operation'
	},
	IterableToList: {
		url: 'https://262.ecma-international.org/8.0/#sec-iterabletolist'
	},
	IteratorClose: {
		url: 'https://262.ecma-international.org/8.0/#sec-iteratorclose'
	},
	IteratorComplete: {
		url: 'https://262.ecma-international.org/8.0/#sec-iteratorcomplete'
	},
	IteratorNext: {
		url: 'https://262.ecma-international.org/8.0/#sec-iteratornext'
	},
	IteratorStep: {
		url: 'https://262.ecma-international.org/8.0/#sec-iteratorstep'
	},
	IteratorValue: {
		url: 'https://262.ecma-international.org/8.0/#sec-iteratorvalue'
	},
	LeaveCriticalSection: {
		url: 'https://262.ecma-international.org/8.0/#sec-leavecriticalsection'
	},
	LocalTime: {
		url: 'https://262.ecma-international.org/8.0/#sec-localtime'
	},
	LoopContinues: {
		url: 'https://262.ecma-international.org/8.0/#sec-loopcontinues'
	},
	MakeArgGetter: {
		url: 'https://262.ecma-international.org/8.0/#sec-makearggetter'
	},
	MakeArgSetter: {
		url: 'https://262.ecma-international.org/8.0/#sec-makeargsetter'
	},
	MakeClassConstructor: {
		url: 'https://262.ecma-international.org/8.0/#sec-makeclassconstructor'
	},
	MakeConstructor: {
		url: 'https://262.ecma-international.org/8.0/#sec-makeconstructor'
	},
	MakeDate: {
		url: 'https://262.ecma-international.org/8.0/#sec-makedate'
	},
	MakeDay: {
		url: 'https://262.ecma-international.org/8.0/#sec-makeday'
	},
	MakeMethod: {
		url: 'https://262.ecma-international.org/8.0/#sec-makemethod'
	},
	MakeSuperPropertyReference: {
		url: 'https://262.ecma-international.org/8.0/#sec-makesuperpropertyreference'
	},
	MakeTime: {
		url: 'https://262.ecma-international.org/8.0/#sec-maketime'
	},
	max: {
		url: 'https://262.ecma-international.org/8.0/#eqn-max'
	},
	'memory-order': {
		url: 'https://262.ecma-international.org/8.0/#sec-memory-order'
	},
	min: {
		url: 'https://262.ecma-international.org/8.0/#eqn-min'
	},
	MinFromTime: {
		url: 'https://262.ecma-international.org/8.0/#eqn-MinFromTime'
	},
	ModuleNamespaceCreate: {
		url: 'https://262.ecma-international.org/8.0/#sec-modulenamespacecreate'
	},
	modulo: {
		url: 'https://262.ecma-international.org/8.0/#eqn-modulo'
	},
	MonthFromTime: {
		url: 'https://262.ecma-international.org/8.0/#eqn-MonthFromTime'
	},
	msFromTime: {
		url: 'https://262.ecma-international.org/8.0/#eqn-msFromTime'
	},
	NewDeclarativeEnvironment: {
		url: 'https://262.ecma-international.org/8.0/#sec-newdeclarativeenvironment'
	},
	NewFunctionEnvironment: {
		url: 'https://262.ecma-international.org/8.0/#sec-newfunctionenvironment'
	},
	NewGlobalEnvironment: {
		url: 'https://262.ecma-international.org/8.0/#sec-newglobalenvironment'
	},
	NewModuleEnvironment: {
		url: 'https://262.ecma-international.org/8.0/#sec-newmoduleenvironment'
	},
	NewObjectEnvironment: {
		url: 'https://262.ecma-international.org/8.0/#sec-newobjectenvironment'
	},
	NewPromiseCapability: {
		url: 'https://262.ecma-international.org/8.0/#sec-newpromisecapability'
	},
	NormalCompletion: {
		url: 'https://262.ecma-international.org/8.0/#sec-normalcompletion'
	},
	NumberToRawBytes: {
		url: 'https://262.ecma-international.org/8.0/#sec-numbertorawbytes'
	},
	ObjectCreate: {
		url: 'https://262.ecma-international.org/8.0/#sec-objectcreate'
	},
	ObjectDefineProperties: {
		url: 'https://262.ecma-international.org/8.0/#sec-objectdefineproperties'
	},
	OrdinaryCallBindThis: {
		url: 'https://262.ecma-international.org/8.0/#sec-ordinarycallbindthis'
	},
	OrdinaryCallEvaluateBody: {
		url: 'https://262.ecma-international.org/8.0/#sec-ordinarycallevaluatebody'
	},
	OrdinaryCreateFromConstructor: {
		url: 'https://262.ecma-international.org/8.0/#sec-ordinarycreatefromconstructor'
	},
	OrdinaryDefineOwnProperty: {
		url: 'https://262.ecma-international.org/8.0/#sec-ordinarydefineownproperty'
	},
	OrdinaryDelete: {
		url: 'https://262.ecma-international.org/8.0/#sec-ordinarydelete'
	},
	OrdinaryGet: {
		url: 'https://262.ecma-international.org/8.0/#sec-ordinaryget'
	},
	OrdinaryGetOwnProperty: {
		url: 'https://262.ecma-international.org/8.0/#sec-ordinarygetownproperty'
	},
	OrdinaryGetPrototypeOf: {
		url: 'https://262.ecma-international.org/8.0/#sec-ordinarygetprototypeof'
	},
	OrdinaryHasInstance: {
		url: 'https://262.ecma-international.org/8.0/#sec-ordinaryhasinstance'
	},
	OrdinaryHasProperty: {
		url: 'https://262.ecma-international.org/8.0/#sec-ordinaryhasproperty'
	},
	OrdinaryIsExtensible: {
		url: 'https://262.ecma-international.org/8.0/#sec-ordinaryisextensible'
	},
	OrdinaryOwnPropertyKeys: {
		url: 'https://262.ecma-international.org/8.0/#sec-ordinaryownpropertykeys'
	},
	OrdinaryPreventExtensions: {
		url: 'https://262.ecma-international.org/8.0/#sec-ordinarypreventextensions'
	},
	OrdinarySet: {
		url: 'https://262.ecma-international.org/8.0/#sec-ordinaryset'
	},
	OrdinarySetPrototypeOf: {
		url: 'https://262.ecma-international.org/8.0/#sec-ordinarysetprototypeof'
	},
	OrdinaryToPrimitive: {
		url: 'https://262.ecma-international.org/8.0/#sec-ordinarytoprimitive'
	},
	ParseModule: {
		url: 'https://262.ecma-international.org/8.0/#sec-parsemodule'
	},
	ParseScript: {
		url: 'https://262.ecma-international.org/8.0/#sec-parse-script'
	},
	PerformEval: {
		url: 'https://262.ecma-international.org/8.0/#sec-performeval'
	},
	PerformPromiseAll: {
		url: 'https://262.ecma-international.org/8.0/#sec-performpromiseall'
	},
	PerformPromiseRace: {
		url: 'https://262.ecma-international.org/8.0/#sec-performpromiserace'
	},
	PerformPromiseThen: {
		url: 'https://262.ecma-international.org/8.0/#sec-performpromisethen'
	},
	PrepareForOrdinaryCall: {
		url: 'https://262.ecma-international.org/8.0/#sec-prepareforordinarycall'
	},
	PrepareForTailCall: {
		url: 'https://262.ecma-international.org/8.0/#sec-preparefortailcall'
	},
	PromiseReactionJob: {
		url: 'https://262.ecma-international.org/8.0/#sec-promisereactionjob'
	},
	PromiseResolveThenableJob: {
		url: 'https://262.ecma-international.org/8.0/#sec-promiseresolvethenablejob'
	},
	ProxyCreate: {
		url: 'https://262.ecma-international.org/8.0/#sec-proxycreate'
	},
	PutValue: {
		url: 'https://262.ecma-international.org/8.0/#sec-putvalue'
	},
	QuoteJSONString: {
		url: 'https://262.ecma-international.org/8.0/#sec-quotejsonstring'
	},
	RawBytesToNumber: {
		url: 'https://262.ecma-international.org/8.0/#sec-rawbytestonumber'
	},
	'reads-bytes-from': {
		url: 'https://262.ecma-international.org/8.0/#sec-reads-bytes-from'
	},
	'reads-from': {
		url: 'https://262.ecma-international.org/8.0/#sec-reads-from'
	},
	RegExpAlloc: {
		url: 'https://262.ecma-international.org/8.0/#sec-regexpalloc'
	},
	RegExpBuiltinExec: {
		url: 'https://262.ecma-international.org/8.0/#sec-regexpbuiltinexec'
	},
	RegExpCreate: {
		url: 'https://262.ecma-international.org/8.0/#sec-regexpcreate'
	},
	RegExpExec: {
		url: 'https://262.ecma-international.org/8.0/#sec-regexpexec'
	},
	RegExpInitialize: {
		url: 'https://262.ecma-international.org/8.0/#sec-regexpinitialize'
	},
	RejectPromise: {
		url: 'https://262.ecma-international.org/8.0/#sec-rejectpromise'
	},
	RemoveWaiter: {
		url: 'https://262.ecma-international.org/8.0/#sec-removewaiter'
	},
	RemoveWaiters: {
		url: 'https://262.ecma-international.org/8.0/#sec-removewaiters'
	},
	RepeatMatcher: {
		url: 'https://262.ecma-international.org/8.0/#sec-runtime-semantics-repeatmatcher-abstract-operation'
	},
	RequireObjectCoercible: {
		url: 'https://262.ecma-international.org/8.0/#sec-requireobjectcoercible'
	},
	ResolveBinding: {
		url: 'https://262.ecma-international.org/8.0/#sec-resolvebinding'
	},
	ResolveThisBinding: {
		url: 'https://262.ecma-international.org/8.0/#sec-resolvethisbinding'
	},
	ReturnIfAbrupt: {
		url: 'https://262.ecma-international.org/8.0/#sec-returnifabrupt'
	},
	RunJobs: {
		url: 'https://262.ecma-international.org/8.0/#sec-runjobs'
	},
	SameValue: {
		url: 'https://262.ecma-international.org/8.0/#sec-samevalue'
	},
	SameValueNonNumber: {
		url: 'https://262.ecma-international.org/8.0/#sec-samevaluenonnumber'
	},
	SameValueZero: {
		url: 'https://262.ecma-international.org/8.0/#sec-samevaluezero'
	},
	ScriptEvaluation: {
		url: 'https://262.ecma-international.org/8.0/#sec-runtime-semantics-scriptevaluation'
	},
	ScriptEvaluationJob: {
		url: 'https://262.ecma-international.org/8.0/#sec-scriptevaluationjob'
	},
	SecFromTime: {
		url: 'https://262.ecma-international.org/8.0/#eqn-SecFromTime'
	},
	SerializeJSONArray: {
		url: 'https://262.ecma-international.org/8.0/#sec-serializejsonarray'
	},
	SerializeJSONObject: {
		url: 'https://262.ecma-international.org/8.0/#sec-serializejsonobject'
	},
	SerializeJSONProperty: {
		url: 'https://262.ecma-international.org/8.0/#sec-serializejsonproperty'
	},
	Set: {
		url: 'https://262.ecma-international.org/8.0/#sec-set-o-p-v-throw'
	},
	SetDefaultGlobalBindings: {
		url: 'https://262.ecma-international.org/8.0/#sec-setdefaultglobalbindings'
	},
	SetFunctionName: {
		url: 'https://262.ecma-international.org/8.0/#sec-setfunctionname'
	},
	SetImmutablePrototype: {
		url: 'https://262.ecma-international.org/8.0/#sec-set-immutable-prototype'
	},
	SetIntegrityLevel: {
		url: 'https://262.ecma-international.org/8.0/#sec-setintegritylevel'
	},
	SetRealmGlobalObject: {
		url: 'https://262.ecma-international.org/8.0/#sec-setrealmglobalobject'
	},
	SetValueInBuffer: {
		url: 'https://262.ecma-international.org/8.0/#sec-setvalueinbuffer'
	},
	SetViewValue: {
		url: 'https://262.ecma-international.org/8.0/#sec-setviewvalue'
	},
	SharedDataBlockEventSet: {
		url: 'https://262.ecma-international.org/8.0/#sec-sharedatablockeventset'
	},
	SortCompare: {
		url: 'https://262.ecma-international.org/8.0/#sec-sortcompare'
	},
	SpeciesConstructor: {
		url: 'https://262.ecma-international.org/8.0/#sec-speciesconstructor'
	},
	SplitMatch: {
		url: 'https://262.ecma-international.org/8.0/#sec-splitmatch'
	},
	'Strict Equality Comparison': {
		url: 'https://262.ecma-international.org/8.0/#sec-strict-equality-comparison'
	},
	StringCreate: {
		url: 'https://262.ecma-international.org/8.0/#sec-stringcreate'
	},
	StringGetOwnProperty: {
		url: 'https://262.ecma-international.org/8.0/#sec-stringgetownproperty'
	},
	Suspend: {
		url: 'https://262.ecma-international.org/8.0/#sec-suspend'
	},
	SymbolDescriptiveString: {
		url: 'https://262.ecma-international.org/8.0/#sec-symboldescriptivestring'
	},
	'synchronizes-with': {
		url: 'https://262.ecma-international.org/8.0/#sec-synchronizes-with'
	},
	TestIntegrityLevel: {
		url: 'https://262.ecma-international.org/8.0/#sec-testintegritylevel'
	},
	thisBooleanValue: {
		url: 'https://262.ecma-international.org/8.0/#sec-thisbooleanvalue'
	},
	thisNumberValue: {
		url: 'https://262.ecma-international.org/8.0/#sec-thisnumbervalue'
	},
	thisStringValue: {
		url: 'https://262.ecma-international.org/8.0/#sec-thisstringvalue'
	},
	thisTimeValue: {
		url: 'https://262.ecma-international.org/8.0/#sec-thistimevalue'
	},
	TimeClip: {
		url: 'https://262.ecma-international.org/8.0/#sec-timeclip'
	},
	TimeFromYear: {
		url: 'https://262.ecma-international.org/8.0/#eqn-TimeFromYear'
	},
	TimeWithinDay: {
		url: 'https://262.ecma-international.org/8.0/#eqn-TimeWithinDay'
	},
	ToBoolean: {
		url: 'https://262.ecma-international.org/8.0/#sec-toboolean'
	},
	ToDateString: {
		url: 'https://262.ecma-international.org/8.0/#sec-todatestring'
	},
	ToIndex: {
		url: 'https://262.ecma-international.org/8.0/#sec-toindex'
	},
	ToInt16: {
		url: 'https://262.ecma-international.org/8.0/#sec-toint16'
	},
	ToInt32: {
		url: 'https://262.ecma-international.org/8.0/#sec-toint32'
	},
	ToInt8: {
		url: 'https://262.ecma-international.org/8.0/#sec-toint8'
	},
	ToInteger: {
		url: 'https://262.ecma-international.org/8.0/#sec-tointeger'
	},
	ToLength: {
		url: 'https://262.ecma-international.org/8.0/#sec-tolength'
	},
	ToNumber: {
		url: 'https://262.ecma-international.org/8.0/#sec-tonumber'
	},
	ToObject: {
		url: 'https://262.ecma-international.org/8.0/#sec-toobject'
	},
	TopLevelModuleEvaluationJob: {
		url: 'https://262.ecma-international.org/8.0/#sec-toplevelmoduleevaluationjob'
	},
	ToPrimitive: {
		url: 'https://262.ecma-international.org/8.0/#sec-toprimitive'
	},
	ToPropertyDescriptor: {
		url: 'https://262.ecma-international.org/8.0/#sec-topropertydescriptor'
	},
	ToPropertyKey: {
		url: 'https://262.ecma-international.org/8.0/#sec-topropertykey'
	},
	ToString: {
		url: 'https://262.ecma-international.org/8.0/#sec-tostring'
	},
	'ToString Applied to the Number Type': {
		url: 'https://262.ecma-international.org/8.0/#sec-tostring-applied-to-the-number-type'
	},
	ToUint16: {
		url: 'https://262.ecma-international.org/8.0/#sec-touint16'
	},
	ToUint32: {
		url: 'https://262.ecma-international.org/8.0/#sec-touint32'
	},
	ToUint8: {
		url: 'https://262.ecma-international.org/8.0/#sec-touint8'
	},
	ToUint8Clamp: {
		url: 'https://262.ecma-international.org/8.0/#sec-touint8clamp'
	},
	TriggerPromiseReactions: {
		url: 'https://262.ecma-international.org/8.0/#sec-triggerpromisereactions'
	},
	Type: {
		url: 'https://262.ecma-international.org/8.0/#sec-ecmascript-data-types-and-values'
	},
	TypedArrayCreate: {
		url: 'https://262.ecma-international.org/8.0/#typedarray-create'
	},
	TypedArraySpeciesCreate: {
		url: 'https://262.ecma-international.org/8.0/#typedarray-species-create'
	},
	UpdateEmpty: {
		url: 'https://262.ecma-international.org/8.0/#sec-updateempty'
	},
	UTC: {
		url: 'https://262.ecma-international.org/8.0/#sec-utc-t'
	},
	UTF16Decode: {
		url: 'https://262.ecma-international.org/8.0/#sec-utf16decode'
	},
	UTF16Encoding: {
		url: 'https://262.ecma-international.org/8.0/#sec-utf16encoding'
	},
	ValidateAndApplyPropertyDescriptor: {
		url: 'https://262.ecma-international.org/8.0/#sec-validateandapplypropertydescriptor'
	},
	ValidateAtomicAccess: {
		url: 'https://262.ecma-international.org/8.0/#sec-validateatomicaccess'
	},
	ValidateSharedIntegerTypedArray: {
		url: 'https://262.ecma-international.org/8.0/#sec-validatesharedintegertypedarray'
	},
	ValidateTypedArray: {
		url: 'https://262.ecma-international.org/8.0/#sec-validatetypedarray'
	},
	ValueOfReadEvent: {
		url: 'https://262.ecma-international.org/8.0/#sec-valueofreadevent'
	},
	WakeWaiter: {
		url: 'https://262.ecma-international.org/8.0/#sec-wakewaiter'
	},
	WeekDay: {
		url: 'https://262.ecma-international.org/8.0/#sec-week-day'
	},
	WordCharacters: {
		url: 'https://262.ecma-international.org/8.0/#sec-runtime-semantics-wordcharacters-abstract-operation'
	},
	YearFromTime: {
		url: 'https://262.ecma-international.org/8.0/#eqn-YearFromTime'
	}
};
'use strict';

module.exports = {
	abs: {
		url: 'https://262.ecma-international.org/9.0/#eqn-abs'
	},
	'Abstract Equality Comparison': {
		url: 'https://262.ecma-international.org/9.0/#sec-abstract-equality-comparison'
	},
	'Abstract Relational Comparison': {
		url: 'https://262.ecma-international.org/9.0/#sec-abstract-relational-comparison'
	},
	AddRestrictedFunctionProperties: {
		url: 'https://262.ecma-international.org/9.0/#sec-addrestrictedfunctionproperties'
	},
	AddWaiter: {
		url: 'https://262.ecma-international.org/9.0/#sec-addwaiter'
	},
	AdvanceStringIndex: {
		url: 'https://262.ecma-international.org/9.0/#sec-advancestringindex'
	},
	'agent-order': {
		url: 'https://262.ecma-international.org/9.0/#sec-agent-order'
	},
	AgentCanSuspend: {
		url: 'https://262.ecma-international.org/9.0/#sec-agentcansuspend'
	},
	AgentSignifier: {
		url: 'https://262.ecma-international.org/9.0/#sec-agentsignifier'
	},
	AllocateArrayBuffer: {
		url: 'https://262.ecma-international.org/9.0/#sec-allocatearraybuffer'
	},
	AllocateSharedArrayBuffer: {
		url: 'https://262.ecma-international.org/9.0/#sec-allocatesharedarraybuffer'
	},
	AllocateTypedArray: {
		url: 'https://262.ecma-international.org/9.0/#sec-allocatetypedarray'
	},
	AllocateTypedArrayBuffer: {
		url: 'https://262.ecma-international.org/9.0/#sec-allocatetypedarraybuffer'
	},
	ArrayCreate: {
		url: 'https://262.ecma-international.org/9.0/#sec-arraycreate'
	},
	ArraySetLength: {
		url: 'https://262.ecma-international.org/9.0/#sec-arraysetlength'
	},
	ArraySpeciesCreate: {
		url: 'https://262.ecma-international.org/9.0/#sec-arrayspeciescreate'
	},
	AsyncFunctionCreate: {
		url: 'https://262.ecma-international.org/9.0/#sec-async-functions-abstract-operations-async-function-create'
	},
	AsyncFunctionStart: {
		url: 'https://262.ecma-international.org/9.0/#sec-async-functions-abstract-operations-async-function-start'
	},
	AsyncGeneratorEnqueue: {
		url: 'https://262.ecma-international.org/9.0/#sec-asyncgeneratorenqueue'
	},
	AsyncGeneratorFunctionCreate: {
		url: 'https://262.ecma-international.org/9.0/#sec-asyncgeneratorfunctioncreate'
	},
	AsyncGeneratorReject: {
		url: 'https://262.ecma-international.org/9.0/#sec-asyncgeneratorreject'
	},
	AsyncGeneratorResolve: {
		url: 'https://262.ecma-international.org/9.0/#sec-asyncgeneratorresolve'
	},
	AsyncGeneratorResumeNext: {
		url: 'https://262.ecma-international.org/9.0/#sec-asyncgeneratorresumenext'
	},
	AsyncGeneratorStart: {
		url: 'https://262.ecma-international.org/9.0/#sec-asyncgeneratorstart'
	},
	AsyncGeneratorYield: {
		url: 'https://262.ecma-international.org/9.0/#sec-asyncgeneratoryield'
	},
	AsyncIteratorClose: {
		url: 'https://262.ecma-international.org/9.0/#sec-asynciteratorclose'
	},
	AtomicLoad: {
		url: 'https://262.ecma-international.org/9.0/#sec-atomicload'
	},
	AtomicReadModifyWrite: {
		url: 'https://262.ecma-international.org/9.0/#sec-atomicreadmodifywrite'
	},
	Await: {
		url: 'https://262.ecma-international.org/9.0/#await'
	},
	BackreferenceMatcher: {
		url: 'https://262.ecma-international.org/9.0/#sec-backreference-matcher'
	},
	BlockDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/9.0/#sec-blockdeclarationinstantiation'
	},
	BoundFunctionCreate: {
		url: 'https://262.ecma-international.org/9.0/#sec-boundfunctioncreate'
	},
	Call: {
		url: 'https://262.ecma-international.org/9.0/#sec-call'
	},
	Canonicalize: {
		url: 'https://262.ecma-international.org/9.0/#sec-runtime-semantics-canonicalize-ch'
	},
	CanonicalNumericIndexString: {
		url: 'https://262.ecma-international.org/9.0/#sec-canonicalnumericindexstring'
	},
	CaseClauseIsSelected: {
		url: 'https://262.ecma-international.org/9.0/#sec-runtime-semantics-caseclauseisselected'
	},
	CharacterRange: {
		url: 'https://262.ecma-international.org/9.0/#sec-runtime-semantics-characterrange-abstract-operation'
	},
	CharacterRangeOrUnion: {
		url: 'https://262.ecma-international.org/9.0/#sec-runtime-semantics-characterrangeorunion-abstract-operation'
	},
	CharacterSetMatcher: {
		url: 'https://262.ecma-international.org/9.0/#sec-runtime-semantics-charactersetmatcher-abstract-operation'
	},
	CloneArrayBuffer: {
		url: 'https://262.ecma-international.org/9.0/#sec-clonearraybuffer'
	},
	CompletePropertyDescriptor: {
		url: 'https://262.ecma-international.org/9.0/#sec-completepropertydescriptor'
	},
	Completion: {
		url: 'https://262.ecma-international.org/9.0/#sec-completion-record-specification-type'
	},
	ComposeWriteEventBytes: {
		url: 'https://262.ecma-international.org/9.0/#sec-composewriteeventbytes'
	},
	Construct: {
		url: 'https://262.ecma-international.org/9.0/#sec-construct'
	},
	CopyDataBlockBytes: {
		url: 'https://262.ecma-international.org/9.0/#sec-copydatablockbytes'
	},
	CopyDataProperties: {
		url: 'https://262.ecma-international.org/9.0/#sec-copydataproperties'
	},
	CreateArrayFromList: {
		url: 'https://262.ecma-international.org/9.0/#sec-createarrayfromlist'
	},
	CreateArrayIterator: {
		url: 'https://262.ecma-international.org/9.0/#sec-createarrayiterator'
	},
	CreateAsyncFromSyncIterator: {
		url: 'https://262.ecma-international.org/9.0/#sec-createasyncfromsynciterator'
	},
	CreateBuiltinFunction: {
		url: 'https://262.ecma-international.org/9.0/#sec-createbuiltinfunction'
	},
	CreateByteDataBlock: {
		url: 'https://262.ecma-international.org/9.0/#sec-createbytedatablock'
	},
	CreateDataProperty: {
		url: 'https://262.ecma-international.org/9.0/#sec-createdataproperty'
	},
	CreateDataPropertyOrThrow: {
		url: 'https://262.ecma-international.org/9.0/#sec-createdatapropertyorthrow'
	},
	CreateDynamicFunction: {
		url: 'https://262.ecma-international.org/9.0/#sec-createdynamicfunction'
	},
	CreateHTML: {
		url: 'https://262.ecma-international.org/9.0/#sec-createhtml'
	},
	CreateIntrinsics: {
		url: 'https://262.ecma-international.org/9.0/#sec-createintrinsics'
	},
	CreateIterResultObject: {
		url: 'https://262.ecma-international.org/9.0/#sec-createiterresultobject'
	},
	CreateListFromArrayLike: {
		url: 'https://262.ecma-international.org/9.0/#sec-createlistfromarraylike'
	},
	CreateListIteratorRecord: {
		url: 'https://262.ecma-international.org/9.0/#sec-createlistiteratorRecord'
	},
	CreateMapIterator: {
		url: 'https://262.ecma-international.org/9.0/#sec-createmapiterator'
	},
	CreateMappedArgumentsObject: {
		url: 'https://262.ecma-international.org/9.0/#sec-createmappedargumentsobject'
	},
	CreateMethodProperty: {
		url: 'https://262.ecma-international.org/9.0/#sec-createmethodproperty'
	},
	CreatePerIterationEnvironment: {
		url: 'https://262.ecma-international.org/9.0/#sec-createperiterationenvironment'
	},
	CreateRealm: {
		url: 'https://262.ecma-international.org/9.0/#sec-createrealm'
	},
	CreateResolvingFunctions: {
		url: 'https://262.ecma-international.org/9.0/#sec-createresolvingfunctions'
	},
	CreateSetIterator: {
		url: 'https://262.ecma-international.org/9.0/#sec-createsetiterator'
	},
	CreateSharedByteDataBlock: {
		url: 'https://262.ecma-international.org/9.0/#sec-createsharedbytedatablock'
	},
	CreateStringIterator: {
		url: 'https://262.ecma-international.org/9.0/#sec-createstringiterator'
	},
	CreateUnmappedArgumentsObject: {
		url: 'https://262.ecma-international.org/9.0/#sec-createunmappedargumentsobject'
	},
	DateFromTime: {
		url: 'https://262.ecma-international.org/9.0/#sec-date-number'
	},
	DateString: {
		url: 'https://262.ecma-international.org/9.0/#sec-datestring'
	},
	Day: {
		url: 'https://262.ecma-international.org/9.0/#eqn-Day'
	},
	DayFromYear: {
		url: 'https://262.ecma-international.org/9.0/#eqn-DaysFromYear'
	},
	DaysInYear: {
		url: 'https://262.ecma-international.org/9.0/#eqn-DaysInYear'
	},
	DayWithinYear: {
		url: 'https://262.ecma-international.org/9.0/#eqn-DayWithinYear'
	},
	Decode: {
		url: 'https://262.ecma-international.org/9.0/#sec-decode'
	},
	DefinePropertyOrThrow: {
		url: 'https://262.ecma-international.org/9.0/#sec-definepropertyorthrow'
	},
	DeletePropertyOrThrow: {
		url: 'https://262.ecma-international.org/9.0/#sec-deletepropertyorthrow'
	},
	DetachArrayBuffer: {
		url: 'https://262.ecma-international.org/9.0/#sec-detacharraybuffer'
	},
	Encode: {
		url: 'https://262.ecma-international.org/9.0/#sec-encode'
	},
	EnqueueJob: {
		url: 'https://262.ecma-international.org/9.0/#sec-enqueuejob'
	},
	EnterCriticalSection: {
		url: 'https://262.ecma-international.org/9.0/#sec-entercriticalsection'
	},
	EnumerableOwnPropertyNames: {
		url: 'https://262.ecma-international.org/9.0/#sec-enumerableownpropertynames'
	},
	EnumerateObjectProperties: {
		url: 'https://262.ecma-international.org/9.0/#sec-enumerate-object-properties'
	},
	EscapeRegExpPattern: {
		url: 'https://262.ecma-international.org/9.0/#sec-escaperegexppattern'
	},
	EvalDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/9.0/#sec-evaldeclarationinstantiation'
	},
	EvaluateCall: {
		url: 'https://262.ecma-international.org/9.0/#sec-evaluatecall'
	},
	EvaluateNew: {
		url: 'https://262.ecma-international.org/9.0/#sec-evaluatenew'
	},
	EventSet: {
		url: 'https://262.ecma-international.org/9.0/#sec-event-set'
	},
	floor: {
		url: 'https://262.ecma-international.org/9.0/#eqn-floor'
	},
	ForBodyEvaluation: {
		url: 'https://262.ecma-international.org/9.0/#sec-forbodyevaluation'
	},
	'ForIn/OfBodyEvaluation': {
		url: 'https://262.ecma-international.org/9.0/#sec-runtime-semantics-forin-div-ofbodyevaluation-lhs-stmt-iterator-lhskind-labelset'
	},
	'ForIn/OfHeadEvaluation': {
		url: 'https://262.ecma-international.org/9.0/#sec-runtime-semantics-forin-div-ofheadevaluation-tdznames-expr-iterationkind'
	},
	FromPropertyDescriptor: {
		url: 'https://262.ecma-international.org/9.0/#sec-frompropertydescriptor'
	},
	FulfillPromise: {
		url: 'https://262.ecma-international.org/9.0/#sec-fulfillpromise'
	},
	FunctionAllocate: {
		url: 'https://262.ecma-international.org/9.0/#sec-functionallocate'
	},
	FunctionCreate: {
		url: 'https://262.ecma-international.org/9.0/#sec-functioncreate'
	},
	FunctionDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/9.0/#sec-functiondeclarationinstantiation'
	},
	FunctionInitialize: {
		url: 'https://262.ecma-international.org/9.0/#sec-functioninitialize'
	},
	GeneratorFunctionCreate: {
		url: 'https://262.ecma-international.org/9.0/#sec-generatorfunctioncreate'
	},
	GeneratorResume: {
		url: 'https://262.ecma-international.org/9.0/#sec-generatorresume'
	},
	GeneratorResumeAbrupt: {
		url: 'https://262.ecma-international.org/9.0/#sec-generatorresumeabrupt'
	},
	GeneratorStart: {
		url: 'https://262.ecma-international.org/9.0/#sec-generatorstart'
	},
	GeneratorValidate: {
		url: 'https://262.ecma-international.org/9.0/#sec-generatorvalidate'
	},
	GeneratorYield: {
		url: 'https://262.ecma-international.org/9.0/#sec-generatoryield'
	},
	Get: {
		url: 'https://262.ecma-international.org/9.0/#sec-get-o-p'
	},
	GetActiveScriptOrModule: {
		url: 'https://262.ecma-international.org/9.0/#sec-getactivescriptormodule'
	},
	GetBase: {
		url: 'https://262.ecma-international.org/9.0/#sec-getbase'
	},
	GetFunctionRealm: {
		url: 'https://262.ecma-international.org/9.0/#sec-getfunctionrealm'
	},
	GetGeneratorKind: {
		url: 'https://262.ecma-international.org/9.0/#sec-getgeneratorkind'
	},
	GetGlobalObject: {
		url: 'https://262.ecma-international.org/9.0/#sec-getglobalobject'
	},
	GetIdentifierReference: {
		url: 'https://262.ecma-international.org/9.0/#sec-getidentifierreference'
	},
	GetIterator: {
		url: 'https://262.ecma-international.org/9.0/#sec-getiterator'
	},
	GetMethod: {
		url: 'https://262.ecma-international.org/9.0/#sec-getmethod'
	},
	GetModifySetValueInBuffer: {
		url: 'https://262.ecma-international.org/9.0/#sec-getmodifysetvalueinbuffer'
	},
	GetModuleNamespace: {
		url: 'https://262.ecma-international.org/9.0/#sec-getmodulenamespace'
	},
	GetNewTarget: {
		url: 'https://262.ecma-international.org/9.0/#sec-getnewtarget'
	},
	GetOwnPropertyKeys: {
		url: 'https://262.ecma-international.org/9.0/#sec-getownpropertykeys'
	},
	GetPrototypeFromConstructor: {
		url: 'https://262.ecma-international.org/9.0/#sec-getprototypefromconstructor'
	},
	GetReferencedName: {
		url: 'https://262.ecma-international.org/9.0/#sec-getreferencedname'
	},
	GetSubstitution: {
		url: 'https://262.ecma-international.org/9.0/#sec-getsubstitution'
	},
	GetSuperConstructor: {
		url: 'https://262.ecma-international.org/9.0/#sec-getsuperconstructor'
	},
	GetTemplateObject: {
		url: 'https://262.ecma-international.org/9.0/#sec-gettemplateobject'
	},
	GetThisEnvironment: {
		url: 'https://262.ecma-international.org/9.0/#sec-getthisenvironment'
	},
	GetThisValue: {
		url: 'https://262.ecma-international.org/9.0/#sec-getthisvalue'
	},
	GetV: {
		url: 'https://262.ecma-international.org/9.0/#sec-getv'
	},
	GetValue: {
		url: 'https://262.ecma-international.org/9.0/#sec-getvalue'
	},
	GetValueFromBuffer: {
		url: 'https://262.ecma-international.org/9.0/#sec-getvaluefrombuffer'
	},
	GetViewValue: {
		url: 'https://262.ecma-international.org/9.0/#sec-getviewvalue'
	},
	GetWaiterList: {
		url: 'https://262.ecma-international.org/9.0/#sec-getwaiterlist'
	},
	GlobalDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/9.0/#sec-globaldeclarationinstantiation'
	},
	'happens-before': {
		url: 'https://262.ecma-international.org/9.0/#sec-happens-before'
	},
	HasOwnProperty: {
		url: 'https://262.ecma-international.org/9.0/#sec-hasownproperty'
	},
	HasPrimitiveBase: {
		url: 'https://262.ecma-international.org/9.0/#sec-hasprimitivebase'
	},
	HasProperty: {
		url: 'https://262.ecma-international.org/9.0/#sec-hasproperty'
	},
	'host-synchronizes-with': {
		url: 'https://262.ecma-international.org/9.0/#sec-host-synchronizes-with'
	},
	HostEnsureCanCompileStrings: {
		url: 'https://262.ecma-international.org/9.0/#sec-hostensurecancompilestrings'
	},
	HostEventSet: {
		url: 'https://262.ecma-international.org/9.0/#sec-hosteventset'
	},
	HostPromiseRejectionTracker: {
		url: 'https://262.ecma-international.org/9.0/#sec-host-promise-rejection-tracker'
	},
	HostReportErrors: {
		url: 'https://262.ecma-international.org/9.0/#sec-host-report-errors'
	},
	HostResolveImportedModule: {
		url: 'https://262.ecma-international.org/9.0/#sec-hostresolveimportedmodule'
	},
	HourFromTime: {
		url: 'https://262.ecma-international.org/9.0/#eqn-HourFromTime'
	},
	IfAbruptRejectPromise: {
		url: 'https://262.ecma-international.org/9.0/#sec-ifabruptrejectpromise'
	},
	ImportedLocalNames: {
		url: 'https://262.ecma-international.org/9.0/#sec-importedlocalnames'
	},
	InitializeBoundName: {
		url: 'https://262.ecma-international.org/9.0/#sec-initializeboundname'
	},
	InitializeHostDefinedRealm: {
		url: 'https://262.ecma-international.org/9.0/#sec-initializehostdefinedrealm'
	},
	InitializeReferencedBinding: {
		url: 'https://262.ecma-international.org/9.0/#sec-initializereferencedbinding'
	},
	InLeapYear: {
		url: 'https://262.ecma-international.org/9.0/#eqn-InLeapYear'
	},
	InnerModuleEvaluation: {
		url: 'https://262.ecma-international.org/9.0/#sec-innermoduleevaluation'
	},
	InnerModuleInstantiation: {
		url: 'https://262.ecma-international.org/9.0/#sec-innermoduleinstantiation'
	},
	InstanceofOperator: {
		url: 'https://262.ecma-international.org/9.0/#sec-instanceofoperator'
	},
	IntegerIndexedElementGet: {
		url: 'https://262.ecma-international.org/9.0/#sec-integerindexedelementget'
	},
	IntegerIndexedElementSet: {
		url: 'https://262.ecma-international.org/9.0/#sec-integerindexedelementset'
	},
	IntegerIndexedObjectCreate: {
		url: 'https://262.ecma-international.org/9.0/#sec-integerindexedobjectcreate'
	},
	InternalizeJSONProperty: {
		url: 'https://262.ecma-international.org/9.0/#sec-internalizejsonproperty'
	},
	Invoke: {
		url: 'https://262.ecma-international.org/9.0/#sec-invoke'
	},
	IsAccessorDescriptor: {
		url: 'https://262.ecma-international.org/9.0/#sec-isaccessordescriptor'
	},
	IsAnonymousFunctionDefinition: {
		url: 'https://262.ecma-international.org/9.0/#sec-isanonymousfunctiondefinition'
	},
	IsArray: {
		url: 'https://262.ecma-international.org/9.0/#sec-isarray'
	},
	IsCallable: {
		url: 'https://262.ecma-international.org/9.0/#sec-iscallable'
	},
	IsCompatiblePropertyDescriptor: {
		url: 'https://262.ecma-international.org/9.0/#sec-iscompatiblepropertydescriptor'
	},
	IsConcatSpreadable: {
		url: 'https://262.ecma-international.org/9.0/#sec-isconcatspreadable'
	},
	IsConstructor: {
		url: 'https://262.ecma-international.org/9.0/#sec-isconstructor'
	},
	IsDataDescriptor: {
		url: 'https://262.ecma-international.org/9.0/#sec-isdatadescriptor'
	},
	IsDetachedBuffer: {
		url: 'https://262.ecma-international.org/9.0/#sec-isdetachedbuffer'
	},
	IsExtensible: {
		url: 'https://262.ecma-international.org/9.0/#sec-isextensible-o'
	},
	IsGenericDescriptor: {
		url: 'https://262.ecma-international.org/9.0/#sec-isgenericdescriptor'
	},
	IsInTailPosition: {
		url: 'https://262.ecma-international.org/9.0/#sec-isintailposition'
	},
	IsInteger: {
		url: 'https://262.ecma-international.org/9.0/#sec-isinteger'
	},
	IsLabelledFunction: {
		url: 'https://262.ecma-international.org/9.0/#sec-islabelledfunction'
	},
	IsPromise: {
		url: 'https://262.ecma-international.org/9.0/#sec-ispromise'
	},
	IsPropertyKey: {
		url: 'https://262.ecma-international.org/9.0/#sec-ispropertykey'
	},
	IsPropertyReference: {
		url: 'https://262.ecma-international.org/9.0/#sec-ispropertyreference'
	},
	IsRegExp: {
		url: 'https://262.ecma-international.org/9.0/#sec-isregexp'
	},
	IsSharedArrayBuffer: {
		url: 'https://262.ecma-international.org/9.0/#sec-issharedarraybuffer'
	},
	IsStrictReference: {
		url: 'https://262.ecma-international.org/9.0/#sec-isstrictreference'
	},
	IsStringPrefix: {
		url: 'https://262.ecma-international.org/9.0/#sec-isstringprefix'
	},
	IsSuperReference: {
		url: 'https://262.ecma-international.org/9.0/#sec-issuperreference'
	},
	IsUnresolvableReference: {
		url: 'https://262.ecma-international.org/9.0/#sec-isunresolvablereference'
	},
	IsWordChar: {
		url: 'https://262.ecma-international.org/9.0/#sec-runtime-semantics-iswordchar-abstract-operation'
	},
	IterableToList: {
		url: 'https://262.ecma-international.org/9.0/#sec-iterabletolist'
	},
	IteratorClose: {
		url: 'https://262.ecma-international.org/9.0/#sec-iteratorclose'
	},
	IteratorComplete: {
		url: 'https://262.ecma-international.org/9.0/#sec-iteratorcomplete'
	},
	IteratorNext: {
		url: 'https://262.ecma-international.org/9.0/#sec-iteratornext'
	},
	IteratorStep: {
		url: 'https://262.ecma-international.org/9.0/#sec-iteratorstep'
	},
	IteratorValue: {
		url: 'https://262.ecma-international.org/9.0/#sec-iteratorvalue'
	},
	LeaveCriticalSection: {
		url: 'https://262.ecma-international.org/9.0/#sec-leavecriticalsection'
	},
	LocalTime: {
		url: 'https://262.ecma-international.org/9.0/#sec-localtime'
	},
	LoopContinues: {
		url: 'https://262.ecma-international.org/9.0/#sec-loopcontinues'
	},
	MakeArgGetter: {
		url: 'https://262.ecma-international.org/9.0/#sec-makearggetter'
	},
	MakeArgSetter: {
		url: 'https://262.ecma-international.org/9.0/#sec-makeargsetter'
	},
	MakeClassConstructor: {
		url: 'https://262.ecma-international.org/9.0/#sec-makeclassconstructor'
	},
	MakeConstructor: {
		url: 'https://262.ecma-international.org/9.0/#sec-makeconstructor'
	},
	MakeDate: {
		url: 'https://262.ecma-international.org/9.0/#sec-makedate'
	},
	MakeDay: {
		url: 'https://262.ecma-international.org/9.0/#sec-makeday'
	},
	MakeMethod: {
		url: 'https://262.ecma-international.org/9.0/#sec-makemethod'
	},
	MakeSuperPropertyReference: {
		url: 'https://262.ecma-international.org/9.0/#sec-makesuperpropertyreference'
	},
	MakeTime: {
		url: 'https://262.ecma-international.org/9.0/#sec-maketime'
	},
	max: {
		url: 'https://262.ecma-international.org/9.0/#eqn-max'
	},
	'memory-order': {
		url: 'https://262.ecma-international.org/9.0/#sec-memory-order'
	},
	min: {
		url: 'https://262.ecma-international.org/9.0/#eqn-min'
	},
	MinFromTime: {
		url: 'https://262.ecma-international.org/9.0/#eqn-MinFromTime'
	},
	ModuleDeclarationEnvironmentSetup: {
		url: 'https://262.ecma-international.org/9.0/#sec-moduledeclarationenvironmentsetup'
	},
	ModuleExecution: {
		url: 'https://262.ecma-international.org/9.0/#sec-moduleexecution'
	},
	ModuleNamespaceCreate: {
		url: 'https://262.ecma-international.org/9.0/#sec-modulenamespacecreate'
	},
	modulo: {
		url: 'https://262.ecma-international.org/9.0/#eqn-modulo'
	},
	MonthFromTime: {
		url: 'https://262.ecma-international.org/9.0/#eqn-MonthFromTime'
	},
	msFromTime: {
		url: 'https://262.ecma-international.org/9.0/#eqn-msFromTime'
	},
	NewDeclarativeEnvironment: {
		url: 'https://262.ecma-international.org/9.0/#sec-newdeclarativeenvironment'
	},
	NewFunctionEnvironment: {
		url: 'https://262.ecma-international.org/9.0/#sec-newfunctionenvironment'
	},
	NewGlobalEnvironment: {
		url: 'https://262.ecma-international.org/9.0/#sec-newglobalenvironment'
	},
	NewModuleEnvironment: {
		url: 'https://262.ecma-international.org/9.0/#sec-newmoduleenvironment'
	},
	NewObjectEnvironment: {
		url: 'https://262.ecma-international.org/9.0/#sec-newobjectenvironment'
	},
	NewPromiseCapability: {
		url: 'https://262.ecma-international.org/9.0/#sec-newpromisecapability'
	},
	NormalCompletion: {
		url: 'https://262.ecma-international.org/9.0/#sec-normalcompletion'
	},
	NumberToRawBytes: {
		url: 'https://262.ecma-international.org/9.0/#sec-numbertorawbytes'
	},
	NumberToString: {
		url: 'https://262.ecma-international.org/9.0/#sec-tostring-applied-to-the-number-type'
	},
	ObjectCreate: {
		url: 'https://262.ecma-international.org/9.0/#sec-objectcreate'
	},
	ObjectDefineProperties: {
		url: 'https://262.ecma-international.org/9.0/#sec-objectdefineproperties'
	},
	OrdinaryCallBindThis: {
		url: 'https://262.ecma-international.org/9.0/#sec-ordinarycallbindthis'
	},
	OrdinaryCallEvaluateBody: {
		url: 'https://262.ecma-international.org/9.0/#sec-ordinarycallevaluatebody'
	},
	OrdinaryCreateFromConstructor: {
		url: 'https://262.ecma-international.org/9.0/#sec-ordinarycreatefromconstructor'
	},
	OrdinaryDefineOwnProperty: {
		url: 'https://262.ecma-international.org/9.0/#sec-ordinarydefineownproperty'
	},
	OrdinaryDelete: {
		url: 'https://262.ecma-international.org/9.0/#sec-ordinarydelete'
	},
	OrdinaryGet: {
		url: 'https://262.ecma-international.org/9.0/#sec-ordinaryget'
	},
	OrdinaryGetOwnProperty: {
		url: 'https://262.ecma-international.org/9.0/#sec-ordinarygetownproperty'
	},
	OrdinaryGetPrototypeOf: {
		url: 'https://262.ecma-international.org/9.0/#sec-ordinarygetprototypeof'
	},
	OrdinaryHasInstance: {
		url: 'https://262.ecma-international.org/9.0/#sec-ordinaryhasinstance'
	},
	OrdinaryHasProperty: {
		url: 'https://262.ecma-international.org/9.0/#sec-ordinaryhasproperty'
	},
	OrdinaryIsExtensible: {
		url: 'https://262.ecma-international.org/9.0/#sec-ordinaryisextensible'
	},
	OrdinaryOwnPropertyKeys: {
		url: 'https://262.ecma-international.org/9.0/#sec-ordinaryownpropertykeys'
	},
	OrdinaryPreventExtensions: {
		url: 'https://262.ecma-international.org/9.0/#sec-ordinarypreventextensions'
	},
	OrdinarySet: {
		url: 'https://262.ecma-international.org/9.0/#sec-ordinaryset'
	},
	OrdinarySetPrototypeOf: {
		url: 'https://262.ecma-international.org/9.0/#sec-ordinarysetprototypeof'
	},
	OrdinarySetWithOwnDescriptor: {
		url: 'https://262.ecma-international.org/9.0/#sec-ordinarysetwithowndescriptor'
	},
	OrdinaryToPrimitive: {
		url: 'https://262.ecma-international.org/9.0/#sec-ordinarytoprimitive'
	},
	ParseModule: {
		url: 'https://262.ecma-international.org/9.0/#sec-parsemodule'
	},
	ParseScript: {
		url: 'https://262.ecma-international.org/9.0/#sec-parse-script'
	},
	PerformEval: {
		url: 'https://262.ecma-international.org/9.0/#sec-performeval'
	},
	PerformPromiseAll: {
		url: 'https://262.ecma-international.org/9.0/#sec-performpromiseall'
	},
	PerformPromiseRace: {
		url: 'https://262.ecma-international.org/9.0/#sec-performpromiserace'
	},
	PerformPromiseThen: {
		url: 'https://262.ecma-international.org/9.0/#sec-performpromisethen'
	},
	PrepareForOrdinaryCall: {
		url: 'https://262.ecma-international.org/9.0/#sec-prepareforordinarycall'
	},
	PrepareForTailCall: {
		url: 'https://262.ecma-international.org/9.0/#sec-preparefortailcall'
	},
	PromiseReactionJob: {
		url: 'https://262.ecma-international.org/9.0/#sec-promisereactionjob'
	},
	PromiseResolve: {
		url: 'https://262.ecma-international.org/9.0/#sec-promise-resolve'
	},
	PromiseResolveThenableJob: {
		url: 'https://262.ecma-international.org/9.0/#sec-promiseresolvethenablejob'
	},
	ProxyCreate: {
		url: 'https://262.ecma-international.org/9.0/#sec-proxycreate'
	},
	PutValue: {
		url: 'https://262.ecma-international.org/9.0/#sec-putvalue'
	},
	QuoteJSONString: {
		url: 'https://262.ecma-international.org/9.0/#sec-quotejsonstring'
	},
	RawBytesToNumber: {
		url: 'https://262.ecma-international.org/9.0/#sec-rawbytestonumber'
	},
	'reads-bytes-from': {
		url: 'https://262.ecma-international.org/9.0/#sec-reads-bytes-from'
	},
	'reads-from': {
		url: 'https://262.ecma-international.org/9.0/#sec-reads-from'
	},
	RegExpAlloc: {
		url: 'https://262.ecma-international.org/9.0/#sec-regexpalloc'
	},
	RegExpBuiltinExec: {
		url: 'https://262.ecma-international.org/9.0/#sec-regexpbuiltinexec'
	},
	RegExpCreate: {
		url: 'https://262.ecma-international.org/9.0/#sec-regexpcreate'
	},
	RegExpExec: {
		url: 'https://262.ecma-international.org/9.0/#sec-regexpexec'
	},
	RegExpInitialize: {
		url: 'https://262.ecma-international.org/9.0/#sec-regexpinitialize'
	},
	RejectPromise: {
		url: 'https://262.ecma-international.org/9.0/#sec-rejectpromise'
	},
	RemoveWaiter: {
		url: 'https://262.ecma-international.org/9.0/#sec-removewaiter'
	},
	RemoveWaiters: {
		url: 'https://262.ecma-international.org/9.0/#sec-removewaiters'
	},
	RepeatMatcher: {
		url: 'https://262.ecma-international.org/9.0/#sec-runtime-semantics-repeatmatcher-abstract-operation'
	},
	RequireObjectCoercible: {
		url: 'https://262.ecma-international.org/9.0/#sec-requireobjectcoercible'
	},
	ResolveBinding: {
		url: 'https://262.ecma-international.org/9.0/#sec-resolvebinding'
	},
	ResolveThisBinding: {
		url: 'https://262.ecma-international.org/9.0/#sec-resolvethisbinding'
	},
	ReturnIfAbrupt: {
		url: 'https://262.ecma-international.org/9.0/#sec-returnifabrupt'
	},
	RunJobs: {
		url: 'https://262.ecma-international.org/9.0/#sec-runjobs'
	},
	SameValue: {
		url: 'https://262.ecma-international.org/9.0/#sec-samevalue'
	},
	SameValueNonNumber: {
		url: 'https://262.ecma-international.org/9.0/#sec-samevaluenonnumber'
	},
	SameValueZero: {
		url: 'https://262.ecma-international.org/9.0/#sec-samevaluezero'
	},
	ScriptEvaluation: {
		url: 'https://262.ecma-international.org/9.0/#sec-runtime-semantics-scriptevaluation'
	},
	ScriptEvaluationJob: {
		url: 'https://262.ecma-international.org/9.0/#sec-scriptevaluationjob'
	},
	SecFromTime: {
		url: 'https://262.ecma-international.org/9.0/#eqn-SecFromTime'
	},
	SerializeJSONArray: {
		url: 'https://262.ecma-international.org/9.0/#sec-serializejsonarray'
	},
	SerializeJSONObject: {
		url: 'https://262.ecma-international.org/9.0/#sec-serializejsonobject'
	},
	SerializeJSONProperty: {
		url: 'https://262.ecma-international.org/9.0/#sec-serializejsonproperty'
	},
	Set: {
		url: 'https://262.ecma-international.org/9.0/#sec-set-o-p-v-throw'
	},
	SetDefaultGlobalBindings: {
		url: 'https://262.ecma-international.org/9.0/#sec-setdefaultglobalbindings'
	},
	SetFunctionLength: {
		url: 'https://262.ecma-international.org/9.0/#sec-setfunctionlength'
	},
	SetFunctionName: {
		url: 'https://262.ecma-international.org/9.0/#sec-setfunctionname'
	},
	SetImmutablePrototype: {
		url: 'https://262.ecma-international.org/9.0/#sec-set-immutable-prototype'
	},
	SetIntegrityLevel: {
		url: 'https://262.ecma-international.org/9.0/#sec-setintegritylevel'
	},
	SetRealmGlobalObject: {
		url: 'https://262.ecma-international.org/9.0/#sec-setrealmglobalobject'
	},
	SetValueInBuffer: {
		url: 'https://262.ecma-international.org/9.0/#sec-setvalueinbuffer'
	},
	SetViewValue: {
		url: 'https://262.ecma-international.org/9.0/#sec-setviewvalue'
	},
	SharedDataBlockEventSet: {
		url: 'https://262.ecma-international.org/9.0/#sec-sharedatablockeventset'
	},
	SortCompare: {
		url: 'https://262.ecma-international.org/9.0/#sec-sortcompare'
	},
	SpeciesConstructor: {
		url: 'https://262.ecma-international.org/9.0/#sec-speciesconstructor'
	},
	SplitMatch: {
		url: 'https://262.ecma-international.org/9.0/#sec-splitmatch'
	},
	'Strict Equality Comparison': {
		url: 'https://262.ecma-international.org/9.0/#sec-strict-equality-comparison'
	},
	StringCreate: {
		url: 'https://262.ecma-international.org/9.0/#sec-stringcreate'
	},
	StringGetOwnProperty: {
		url: 'https://262.ecma-international.org/9.0/#sec-stringgetownproperty'
	},
	Suspend: {
		url: 'https://262.ecma-international.org/9.0/#sec-suspend'
	},
	SymbolDescriptiveString: {
		url: 'https://262.ecma-international.org/9.0/#sec-symboldescriptivestring'
	},
	'synchronizes-with': {
		url: 'https://262.ecma-international.org/9.0/#sec-synchronizes-with'
	},
	TestIntegrityLevel: {
		url: 'https://262.ecma-international.org/9.0/#sec-testintegritylevel'
	},
	thisBooleanValue: {
		url: 'https://262.ecma-international.org/9.0/#sec-thisbooleanvalue'
	},
	thisNumberValue: {
		url: 'https://262.ecma-international.org/9.0/#sec-thisnumbervalue'
	},
	thisStringValue: {
		url: 'https://262.ecma-international.org/9.0/#sec-thisstringvalue'
	},
	thisSymbolValue: {
		url: 'https://262.ecma-international.org/9.0/#sec-thissymbolvalue'
	},
	thisTimeValue: {
		url: 'https://262.ecma-international.org/9.0/#sec-thistimevalue'
	},
	ThrowCompletion: {
		url: 'https://262.ecma-international.org/9.0/#sec-throwcompletion'
	},
	TimeClip: {
		url: 'https://262.ecma-international.org/9.0/#sec-timeclip'
	},
	TimeFromYear: {
		url: 'https://262.ecma-international.org/9.0/#eqn-TimeFromYear'
	},
	TimeString: {
		url: 'https://262.ecma-international.org/9.0/#sec-timestring'
	},
	TimeWithinDay: {
		url: 'https://262.ecma-international.org/9.0/#eqn-TimeWithinDay'
	},
	TimeZoneString: {
		url: 'https://262.ecma-international.org/9.0/#sec-timezoneestring'
	},
	ToBoolean: {
		url: 'https://262.ecma-international.org/9.0/#sec-toboolean'
	},
	ToDateString: {
		url: 'https://262.ecma-international.org/9.0/#sec-todatestring'
	},
	ToIndex: {
		url: 'https://262.ecma-international.org/9.0/#sec-toindex'
	},
	ToInt16: {
		url: 'https://262.ecma-international.org/9.0/#sec-toint16'
	},
	ToInt32: {
		url: 'https://262.ecma-international.org/9.0/#sec-toint32'
	},
	ToInt8: {
		url: 'https://262.ecma-international.org/9.0/#sec-toint8'
	},
	ToInteger: {
		url: 'https://262.ecma-international.org/9.0/#sec-tointeger'
	},
	ToLength: {
		url: 'https://262.ecma-international.org/9.0/#sec-tolength'
	},
	ToNumber: {
		url: 'https://262.ecma-international.org/9.0/#sec-tonumber'
	},
	ToObject: {
		url: 'https://262.ecma-international.org/9.0/#sec-toobject'
	},
	TopLevelModuleEvaluationJob: {
		url: 'https://262.ecma-international.org/9.0/#sec-toplevelmoduleevaluationjob'
	},
	ToPrimitive: {
		url: 'https://262.ecma-international.org/9.0/#sec-toprimitive'
	},
	ToPropertyDescriptor: {
		url: 'https://262.ecma-international.org/9.0/#sec-topropertydescriptor'
	},
	ToPropertyKey: {
		url: 'https://262.ecma-international.org/9.0/#sec-topropertykey'
	},
	ToString: {
		url: 'https://262.ecma-international.org/9.0/#sec-tostring'
	},
	ToUint16: {
		url: 'https://262.ecma-international.org/9.0/#sec-touint16'
	},
	ToUint32: {
		url: 'https://262.ecma-international.org/9.0/#sec-touint32'
	},
	ToUint8: {
		url: 'https://262.ecma-international.org/9.0/#sec-touint8'
	},
	ToUint8Clamp: {
		url: 'https://262.ecma-international.org/9.0/#sec-touint8clamp'
	},
	TriggerPromiseReactions: {
		url: 'https://262.ecma-international.org/9.0/#sec-triggerpromisereactions'
	},
	Type: {
		url: 'https://262.ecma-international.org/9.0/#sec-ecmascript-data-types-and-values'
	},
	TypedArrayCreate: {
		url: 'https://262.ecma-international.org/9.0/#typedarray-create'
	},
	TypedArraySpeciesCreate: {
		url: 'https://262.ecma-international.org/9.0/#typedarray-species-create'
	},
	UnicodeEscape: {
		url: 'https://262.ecma-international.org/9.0/#sec-unicodeescape'
	},
	UnicodeMatchProperty: {
		url: 'https://262.ecma-international.org/9.0/#sec-runtime-semantics-unicodematchproperty-p'
	},
	UnicodeMatchPropertyValue: {
		url: 'https://262.ecma-international.org/9.0/#sec-runtime-semantics-unicodematchpropertyvalue-p-v'
	},
	UpdateEmpty: {
		url: 'https://262.ecma-international.org/9.0/#sec-updateempty'
	},
	UTC: {
		url: 'https://262.ecma-international.org/9.0/#sec-utc-t'
	},
	UTF16Decode: {
		url: 'https://262.ecma-international.org/9.0/#sec-utf16decode'
	},
	UTF16Encoding: {
		url: 'https://262.ecma-international.org/9.0/#sec-utf16encoding'
	},
	ValidateAndApplyPropertyDescriptor: {
		url: 'https://262.ecma-international.org/9.0/#sec-validateandapplypropertydescriptor'
	},
	ValidateAtomicAccess: {
		url: 'https://262.ecma-international.org/9.0/#sec-validateatomicaccess'
	},
	ValidateSharedIntegerTypedArray: {
		url: 'https://262.ecma-international.org/9.0/#sec-validatesharedintegertypedarray'
	},
	ValidateTypedArray: {
		url: 'https://262.ecma-international.org/9.0/#sec-validatetypedarray'
	},
	ValueOfReadEvent: {
		url: 'https://262.ecma-international.org/9.0/#sec-valueofreadevent'
	},
	WakeWaiter: {
		url: 'https://262.ecma-international.org/9.0/#sec-wakewaiter'
	},
	WeekDay: {
		url: 'https://262.ecma-international.org/9.0/#sec-week-day'
	},
	WordCharacters: {
		url: 'https://262.ecma-international.org/9.0/#sec-runtime-semantics-wordcharacters-abstract-operation'
	},
	YearFromTime: {
		url: 'https://262.ecma-international.org/9.0/#eqn-YearFromTime'
	}
};
'use strict';

module.exports = {
	abs: {
		url: 'https://262.ecma-international.org/10.0/#eqn-abs'
	},
	'Abstract Equality Comparison': {
		url: 'https://262.ecma-international.org/10.0/#sec-abstract-equality-comparison'
	},
	'Abstract Relational Comparison': {
		url: 'https://262.ecma-international.org/10.0/#sec-abstract-relational-comparison'
	},
	AddEntriesFromIterable: {
		url: 'https://262.ecma-international.org/10.0/#sec-add-entries-from-iterable'
	},
	AddRestrictedFunctionProperties: {
		url: 'https://262.ecma-international.org/10.0/#sec-addrestrictedfunctionproperties'
	},
	AddWaiter: {
		url: 'https://262.ecma-international.org/10.0/#sec-addwaiter'
	},
	AdvanceStringIndex: {
		url: 'https://262.ecma-international.org/10.0/#sec-advancestringindex'
	},
	'agent-order': {
		url: 'https://262.ecma-international.org/10.0/#sec-agent-order'
	},
	AgentCanSuspend: {
		url: 'https://262.ecma-international.org/10.0/#sec-agentcansuspend'
	},
	AgentSignifier: {
		url: 'https://262.ecma-international.org/10.0/#sec-agentsignifier'
	},
	AllocateArrayBuffer: {
		url: 'https://262.ecma-international.org/10.0/#sec-allocatearraybuffer'
	},
	AllocateSharedArrayBuffer: {
		url: 'https://262.ecma-international.org/10.0/#sec-allocatesharedarraybuffer'
	},
	AllocateTypedArray: {
		url: 'https://262.ecma-international.org/10.0/#sec-allocatetypedarray'
	},
	AllocateTypedArrayBuffer: {
		url: 'https://262.ecma-international.org/10.0/#sec-allocatetypedarraybuffer'
	},
	ArrayCreate: {
		url: 'https://262.ecma-international.org/10.0/#sec-arraycreate'
	},
	ArraySetLength: {
		url: 'https://262.ecma-international.org/10.0/#sec-arraysetlength'
	},
	ArraySpeciesCreate: {
		url: 'https://262.ecma-international.org/10.0/#sec-arrayspeciescreate'
	},
	AsyncFromSyncIteratorContinuation: {
		url: 'https://262.ecma-international.org/10.0/#sec-asyncfromsynciteratorcontinuation'
	},
	AsyncFunctionCreate: {
		url: 'https://262.ecma-international.org/10.0/#sec-async-functions-abstract-operations-async-function-create'
	},
	AsyncFunctionStart: {
		url: 'https://262.ecma-international.org/10.0/#sec-async-functions-abstract-operations-async-function-start'
	},
	AsyncGeneratorEnqueue: {
		url: 'https://262.ecma-international.org/10.0/#sec-asyncgeneratorenqueue'
	},
	AsyncGeneratorFunctionCreate: {
		url: 'https://262.ecma-international.org/10.0/#sec-asyncgeneratorfunctioncreate'
	},
	AsyncGeneratorReject: {
		url: 'https://262.ecma-international.org/10.0/#sec-asyncgeneratorreject'
	},
	AsyncGeneratorResolve: {
		url: 'https://262.ecma-international.org/10.0/#sec-asyncgeneratorresolve'
	},
	AsyncGeneratorResumeNext: {
		url: 'https://262.ecma-international.org/10.0/#sec-asyncgeneratorresumenext'
	},
	AsyncGeneratorStart: {
		url: 'https://262.ecma-international.org/10.0/#sec-asyncgeneratorstart'
	},
	AsyncGeneratorYield: {
		url: 'https://262.ecma-international.org/10.0/#sec-asyncgeneratoryield'
	},
	AsyncIteratorClose: {
		url: 'https://262.ecma-international.org/10.0/#sec-asynciteratorclose'
	},
	AtomicLoad: {
		url: 'https://262.ecma-international.org/10.0/#sec-atomicload'
	},
	AtomicReadModifyWrite: {
		url: 'https://262.ecma-international.org/10.0/#sec-atomicreadmodifywrite'
	},
	Await: {
		url: 'https://262.ecma-international.org/10.0/#await'
	},
	BackreferenceMatcher: {
		url: 'https://262.ecma-international.org/10.0/#sec-backreference-matcher'
	},
	BlockDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/10.0/#sec-blockdeclarationinstantiation'
	},
	BoundFunctionCreate: {
		url: 'https://262.ecma-international.org/10.0/#sec-boundfunctioncreate'
	},
	Call: {
		url: 'https://262.ecma-international.org/10.0/#sec-call'
	},
	Canonicalize: {
		url: 'https://262.ecma-international.org/10.0/#sec-runtime-semantics-canonicalize-ch'
	},
	CanonicalNumericIndexString: {
		url: 'https://262.ecma-international.org/10.0/#sec-canonicalnumericindexstring'
	},
	CaseClauseIsSelected: {
		url: 'https://262.ecma-international.org/10.0/#sec-runtime-semantics-caseclauseisselected'
	},
	CharacterRange: {
		url: 'https://262.ecma-international.org/10.0/#sec-runtime-semantics-characterrange-abstract-operation'
	},
	CharacterRangeOrUnion: {
		url: 'https://262.ecma-international.org/10.0/#sec-runtime-semantics-characterrangeorunion-abstract-operation'
	},
	CharacterSetMatcher: {
		url: 'https://262.ecma-international.org/10.0/#sec-runtime-semantics-charactersetmatcher-abstract-operation'
	},
	CloneArrayBuffer: {
		url: 'https://262.ecma-international.org/10.0/#sec-clonearraybuffer'
	},
	CompletePropertyDescriptor: {
		url: 'https://262.ecma-international.org/10.0/#sec-completepropertydescriptor'
	},
	Completion: {
		url: 'https://262.ecma-international.org/10.0/#sec-completion-record-specification-type'
	},
	ComposeWriteEventBytes: {
		url: 'https://262.ecma-international.org/10.0/#sec-composewriteeventbytes'
	},
	Construct: {
		url: 'https://262.ecma-international.org/10.0/#sec-construct'
	},
	CopyDataBlockBytes: {
		url: 'https://262.ecma-international.org/10.0/#sec-copydatablockbytes'
	},
	CopyDataProperties: {
		url: 'https://262.ecma-international.org/10.0/#sec-copydataproperties'
	},
	CreateArrayFromList: {
		url: 'https://262.ecma-international.org/10.0/#sec-createarrayfromlist'
	},
	CreateArrayIterator: {
		url: 'https://262.ecma-international.org/10.0/#sec-createarrayiterator'
	},
	CreateAsyncFromSyncIterator: {
		url: 'https://262.ecma-international.org/10.0/#sec-createasyncfromsynciterator'
	},
	CreateBuiltinFunction: {
		url: 'https://262.ecma-international.org/10.0/#sec-createbuiltinfunction'
	},
	CreateByteDataBlock: {
		url: 'https://262.ecma-international.org/10.0/#sec-createbytedatablock'
	},
	CreateDataProperty: {
		url: 'https://262.ecma-international.org/10.0/#sec-createdataproperty'
	},
	CreateDataPropertyOrThrow: {
		url: 'https://262.ecma-international.org/10.0/#sec-createdatapropertyorthrow'
	},
	CreateDynamicFunction: {
		url: 'https://262.ecma-international.org/10.0/#sec-createdynamicfunction'
	},
	CreateHTML: {
		url: 'https://262.ecma-international.org/10.0/#sec-createhtml'
	},
	CreateIntrinsics: {
		url: 'https://262.ecma-international.org/10.0/#sec-createintrinsics'
	},
	CreateIterResultObject: {
		url: 'https://262.ecma-international.org/10.0/#sec-createiterresultobject'
	},
	CreateListFromArrayLike: {
		url: 'https://262.ecma-international.org/10.0/#sec-createlistfromarraylike'
	},
	CreateListIteratorRecord: {
		url: 'https://262.ecma-international.org/10.0/#sec-createlistiteratorRecord'
	},
	CreateMapIterator: {
		url: 'https://262.ecma-international.org/10.0/#sec-createmapiterator'
	},
	CreateMappedArgumentsObject: {
		url: 'https://262.ecma-international.org/10.0/#sec-createmappedargumentsobject'
	},
	CreateMethodProperty: {
		url: 'https://262.ecma-international.org/10.0/#sec-createmethodproperty'
	},
	CreatePerIterationEnvironment: {
		url: 'https://262.ecma-international.org/10.0/#sec-createperiterationenvironment'
	},
	CreateRealm: {
		url: 'https://262.ecma-international.org/10.0/#sec-createrealm'
	},
	CreateResolvingFunctions: {
		url: 'https://262.ecma-international.org/10.0/#sec-createresolvingfunctions'
	},
	CreateSetIterator: {
		url: 'https://262.ecma-international.org/10.0/#sec-createsetiterator'
	},
	CreateSharedByteDataBlock: {
		url: 'https://262.ecma-international.org/10.0/#sec-createsharedbytedatablock'
	},
	CreateStringIterator: {
		url: 'https://262.ecma-international.org/10.0/#sec-createstringiterator'
	},
	CreateUnmappedArgumentsObject: {
		url: 'https://262.ecma-international.org/10.0/#sec-createunmappedargumentsobject'
	},
	DateFromTime: {
		url: 'https://262.ecma-international.org/10.0/#sec-date-number'
	},
	DateString: {
		url: 'https://262.ecma-international.org/10.0/#sec-datestring'
	},
	Day: {
		url: 'https://262.ecma-international.org/10.0/#eqn-Day'
	},
	DayFromYear: {
		url: 'https://262.ecma-international.org/10.0/#eqn-DaysFromYear'
	},
	DaysInYear: {
		url: 'https://262.ecma-international.org/10.0/#eqn-DaysInYear'
	},
	DayWithinYear: {
		url: 'https://262.ecma-international.org/10.0/#eqn-DayWithinYear'
	},
	Decode: {
		url: 'https://262.ecma-international.org/10.0/#sec-decode'
	},
	DefinePropertyOrThrow: {
		url: 'https://262.ecma-international.org/10.0/#sec-definepropertyorthrow'
	},
	DeletePropertyOrThrow: {
		url: 'https://262.ecma-international.org/10.0/#sec-deletepropertyorthrow'
	},
	DetachArrayBuffer: {
		url: 'https://262.ecma-international.org/10.0/#sec-detacharraybuffer'
	},
	Encode: {
		url: 'https://262.ecma-international.org/10.0/#sec-encode'
	},
	EnqueueJob: {
		url: 'https://262.ecma-international.org/10.0/#sec-enqueuejob'
	},
	EnterCriticalSection: {
		url: 'https://262.ecma-international.org/10.0/#sec-entercriticalsection'
	},
	EnumerableOwnPropertyNames: {
		url: 'https://262.ecma-international.org/10.0/#sec-enumerableownpropertynames'
	},
	EnumerateObjectProperties: {
		url: 'https://262.ecma-international.org/10.0/#sec-enumerate-object-properties'
	},
	EscapeRegExpPattern: {
		url: 'https://262.ecma-international.org/10.0/#sec-escaperegexppattern'
	},
	EvalDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/10.0/#sec-evaldeclarationinstantiation'
	},
	EvaluateCall: {
		url: 'https://262.ecma-international.org/10.0/#sec-evaluatecall'
	},
	EvaluateNew: {
		url: 'https://262.ecma-international.org/10.0/#sec-evaluatenew'
	},
	EventSet: {
		url: 'https://262.ecma-international.org/10.0/#sec-event-set'
	},
	ExecuteModule: {
		url: 'https://262.ecma-international.org/10.0/#sec-source-text-module-record-execute-module'
	},
	FlattenIntoArray: {
		url: 'https://262.ecma-international.org/10.0/#sec-flattenintoarray'
	},
	floor: {
		url: 'https://262.ecma-international.org/10.0/#eqn-floor'
	},
	ForBodyEvaluation: {
		url: 'https://262.ecma-international.org/10.0/#sec-forbodyevaluation'
	},
	'ForIn/OfBodyEvaluation': {
		url: 'https://262.ecma-international.org/10.0/#sec-runtime-semantics-forin-div-ofbodyevaluation-lhs-stmt-iterator-lhskind-labelset'
	},
	'ForIn/OfHeadEvaluation': {
		url: 'https://262.ecma-international.org/10.0/#sec-runtime-semantics-forin-div-ofheadevaluation-tdznames-expr-iterationkind'
	},
	FromPropertyDescriptor: {
		url: 'https://262.ecma-international.org/10.0/#sec-frompropertydescriptor'
	},
	FulfillPromise: {
		url: 'https://262.ecma-international.org/10.0/#sec-fulfillpromise'
	},
	FunctionAllocate: {
		url: 'https://262.ecma-international.org/10.0/#sec-functionallocate'
	},
	FunctionCreate: {
		url: 'https://262.ecma-international.org/10.0/#sec-functioncreate'
	},
	FunctionDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/10.0/#sec-functiondeclarationinstantiation'
	},
	FunctionInitialize: {
		url: 'https://262.ecma-international.org/10.0/#sec-functioninitialize'
	},
	GeneratorFunctionCreate: {
		url: 'https://262.ecma-international.org/10.0/#sec-generatorfunctioncreate'
	},
	GeneratorResume: {
		url: 'https://262.ecma-international.org/10.0/#sec-generatorresume'
	},
	GeneratorResumeAbrupt: {
		url: 'https://262.ecma-international.org/10.0/#sec-generatorresumeabrupt'
	},
	GeneratorStart: {
		url: 'https://262.ecma-international.org/10.0/#sec-generatorstart'
	},
	GeneratorValidate: {
		url: 'https://262.ecma-international.org/10.0/#sec-generatorvalidate'
	},
	GeneratorYield: {
		url: 'https://262.ecma-international.org/10.0/#sec-generatoryield'
	},
	Get: {
		url: 'https://262.ecma-international.org/10.0/#sec-get-o-p'
	},
	GetActiveScriptOrModule: {
		url: 'https://262.ecma-international.org/10.0/#sec-getactivescriptormodule'
	},
	GetBase: {
		url: 'https://262.ecma-international.org/10.0/#sec-getbase'
	},
	GetFunctionRealm: {
		url: 'https://262.ecma-international.org/10.0/#sec-getfunctionrealm'
	},
	GetGeneratorKind: {
		url: 'https://262.ecma-international.org/10.0/#sec-getgeneratorkind'
	},
	GetGlobalObject: {
		url: 'https://262.ecma-international.org/10.0/#sec-getglobalobject'
	},
	GetIdentifierReference: {
		url: 'https://262.ecma-international.org/10.0/#sec-getidentifierreference'
	},
	GetIterator: {
		url: 'https://262.ecma-international.org/10.0/#sec-getiterator'
	},
	GetMethod: {
		url: 'https://262.ecma-international.org/10.0/#sec-getmethod'
	},
	GetModifySetValueInBuffer: {
		url: 'https://262.ecma-international.org/10.0/#sec-getmodifysetvalueinbuffer'
	},
	GetModuleNamespace: {
		url: 'https://262.ecma-international.org/10.0/#sec-getmodulenamespace'
	},
	GetNewTarget: {
		url: 'https://262.ecma-international.org/10.0/#sec-getnewtarget'
	},
	GetOwnPropertyKeys: {
		url: 'https://262.ecma-international.org/10.0/#sec-getownpropertykeys'
	},
	GetPrototypeFromConstructor: {
		url: 'https://262.ecma-international.org/10.0/#sec-getprototypefromconstructor'
	},
	GetReferencedName: {
		url: 'https://262.ecma-international.org/10.0/#sec-getreferencedname'
	},
	GetSubstitution: {
		url: 'https://262.ecma-international.org/10.0/#sec-getsubstitution'
	},
	GetSuperConstructor: {
		url: 'https://262.ecma-international.org/10.0/#sec-getsuperconstructor'
	},
	GetTemplateObject: {
		url: 'https://262.ecma-international.org/10.0/#sec-gettemplateobject'
	},
	GetThisEnvironment: {
		url: 'https://262.ecma-international.org/10.0/#sec-getthisenvironment'
	},
	GetThisValue: {
		url: 'https://262.ecma-international.org/10.0/#sec-getthisvalue'
	},
	GetV: {
		url: 'https://262.ecma-international.org/10.0/#sec-getv'
	},
	GetValue: {
		url: 'https://262.ecma-international.org/10.0/#sec-getvalue'
	},
	GetValueFromBuffer: {
		url: 'https://262.ecma-international.org/10.0/#sec-getvaluefrombuffer'
	},
	GetViewValue: {
		url: 'https://262.ecma-international.org/10.0/#sec-getviewvalue'
	},
	GetWaiterList: {
		url: 'https://262.ecma-international.org/10.0/#sec-getwaiterlist'
	},
	GlobalDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/10.0/#sec-globaldeclarationinstantiation'
	},
	'happens-before': {
		url: 'https://262.ecma-international.org/10.0/#sec-happens-before'
	},
	HasOwnProperty: {
		url: 'https://262.ecma-international.org/10.0/#sec-hasownproperty'
	},
	HasPrimitiveBase: {
		url: 'https://262.ecma-international.org/10.0/#sec-hasprimitivebase'
	},
	HasProperty: {
		url: 'https://262.ecma-international.org/10.0/#sec-hasproperty'
	},
	'host-synchronizes-with': {
		url: 'https://262.ecma-international.org/10.0/#sec-host-synchronizes-with'
	},
	HostEnsureCanCompileStrings: {
		url: 'https://262.ecma-international.org/10.0/#sec-hostensurecancompilestrings'
	},
	HostEventSet: {
		url: 'https://262.ecma-international.org/10.0/#sec-hosteventset'
	},
	HostPromiseRejectionTracker: {
		url: 'https://262.ecma-international.org/10.0/#sec-host-promise-rejection-tracker'
	},
	HostReportErrors: {
		url: 'https://262.ecma-international.org/10.0/#sec-host-report-errors'
	},
	HostResolveImportedModule: {
		url: 'https://262.ecma-international.org/10.0/#sec-hostresolveimportedmodule'
	},
	HourFromTime: {
		url: 'https://262.ecma-international.org/10.0/#eqn-HourFromTime'
	},
	IfAbruptRejectPromise: {
		url: 'https://262.ecma-international.org/10.0/#sec-ifabruptrejectpromise'
	},
	ImportedLocalNames: {
		url: 'https://262.ecma-international.org/10.0/#sec-importedlocalnames'
	},
	InitializeBoundName: {
		url: 'https://262.ecma-international.org/10.0/#sec-initializeboundname'
	},
	InitializeEnvironment: {
		url: 'https://262.ecma-international.org/10.0/#sec-source-text-module-record-initialize-environment'
	},
	InitializeHostDefinedRealm: {
		url: 'https://262.ecma-international.org/10.0/#sec-initializehostdefinedrealm'
	},
	InitializeReferencedBinding: {
		url: 'https://262.ecma-international.org/10.0/#sec-initializereferencedbinding'
	},
	InLeapYear: {
		url: 'https://262.ecma-international.org/10.0/#eqn-InLeapYear'
	},
	InnerModuleEvaluation: {
		url: 'https://262.ecma-international.org/10.0/#sec-innermoduleevaluation'
	},
	InnerModuleInstantiation: {
		url: 'https://262.ecma-international.org/10.0/#sec-innermoduleinstantiation'
	},
	InstanceofOperator: {
		url: 'https://262.ecma-international.org/10.0/#sec-instanceofoperator'
	},
	IntegerIndexedElementGet: {
		url: 'https://262.ecma-international.org/10.0/#sec-integerindexedelementget'
	},
	IntegerIndexedElementSet: {
		url: 'https://262.ecma-international.org/10.0/#sec-integerindexedelementset'
	},
	IntegerIndexedObjectCreate: {
		url: 'https://262.ecma-international.org/10.0/#sec-integerindexedobjectcreate'
	},
	InternalizeJSONProperty: {
		url: 'https://262.ecma-international.org/10.0/#sec-internalizejsonproperty'
	},
	Invoke: {
		url: 'https://262.ecma-international.org/10.0/#sec-invoke'
	},
	IsAccessorDescriptor: {
		url: 'https://262.ecma-international.org/10.0/#sec-isaccessordescriptor'
	},
	IsAnonymousFunctionDefinition: {
		url: 'https://262.ecma-international.org/10.0/#sec-isanonymousfunctiondefinition'
	},
	IsArray: {
		url: 'https://262.ecma-international.org/10.0/#sec-isarray'
	},
	IsCallable: {
		url: 'https://262.ecma-international.org/10.0/#sec-iscallable'
	},
	IsCompatiblePropertyDescriptor: {
		url: 'https://262.ecma-international.org/10.0/#sec-iscompatiblepropertydescriptor'
	},
	IsConcatSpreadable: {
		url: 'https://262.ecma-international.org/10.0/#sec-isconcatspreadable'
	},
	IsConstructor: {
		url: 'https://262.ecma-international.org/10.0/#sec-isconstructor'
	},
	IsDataDescriptor: {
		url: 'https://262.ecma-international.org/10.0/#sec-isdatadescriptor'
	},
	IsDetachedBuffer: {
		url: 'https://262.ecma-international.org/10.0/#sec-isdetachedbuffer'
	},
	IsExtensible: {
		url: 'https://262.ecma-international.org/10.0/#sec-isextensible-o'
	},
	IsGenericDescriptor: {
		url: 'https://262.ecma-international.org/10.0/#sec-isgenericdescriptor'
	},
	IsInTailPosition: {
		url: 'https://262.ecma-international.org/10.0/#sec-isintailposition'
	},
	IsInteger: {
		url: 'https://262.ecma-international.org/10.0/#sec-isinteger'
	},
	IsLabelledFunction: {
		url: 'https://262.ecma-international.org/10.0/#sec-islabelledfunction'
	},
	IsPromise: {
		url: 'https://262.ecma-international.org/10.0/#sec-ispromise'
	},
	IsPropertyKey: {
		url: 'https://262.ecma-international.org/10.0/#sec-ispropertykey'
	},
	IsPropertyReference: {
		url: 'https://262.ecma-international.org/10.0/#sec-ispropertyreference'
	},
	IsRegExp: {
		url: 'https://262.ecma-international.org/10.0/#sec-isregexp'
	},
	IsSharedArrayBuffer: {
		url: 'https://262.ecma-international.org/10.0/#sec-issharedarraybuffer'
	},
	IsStrictReference: {
		url: 'https://262.ecma-international.org/10.0/#sec-isstrictreference'
	},
	IsStringPrefix: {
		url: 'https://262.ecma-international.org/10.0/#sec-isstringprefix'
	},
	IsSuperReference: {
		url: 'https://262.ecma-international.org/10.0/#sec-issuperreference'
	},
	IsUnresolvableReference: {
		url: 'https://262.ecma-international.org/10.0/#sec-isunresolvablereference'
	},
	IsWordChar: {
		url: 'https://262.ecma-international.org/10.0/#sec-runtime-semantics-iswordchar-abstract-operation'
	},
	IterableToList: {
		url: 'https://262.ecma-international.org/10.0/#sec-iterabletolist'
	},
	IteratorClose: {
		url: 'https://262.ecma-international.org/10.0/#sec-iteratorclose'
	},
	IteratorComplete: {
		url: 'https://262.ecma-international.org/10.0/#sec-iteratorcomplete'
	},
	IteratorNext: {
		url: 'https://262.ecma-international.org/10.0/#sec-iteratornext'
	},
	IteratorStep: {
		url: 'https://262.ecma-international.org/10.0/#sec-iteratorstep'
	},
	IteratorValue: {
		url: 'https://262.ecma-international.org/10.0/#sec-iteratorvalue'
	},
	LeaveCriticalSection: {
		url: 'https://262.ecma-international.org/10.0/#sec-leavecriticalsection'
	},
	LocalTime: {
		url: 'https://262.ecma-international.org/10.0/#sec-localtime'
	},
	LoopContinues: {
		url: 'https://262.ecma-international.org/10.0/#sec-loopcontinues'
	},
	MakeArgGetter: {
		url: 'https://262.ecma-international.org/10.0/#sec-makearggetter'
	},
	MakeArgSetter: {
		url: 'https://262.ecma-international.org/10.0/#sec-makeargsetter'
	},
	MakeClassConstructor: {
		url: 'https://262.ecma-international.org/10.0/#sec-makeclassconstructor'
	},
	MakeConstructor: {
		url: 'https://262.ecma-international.org/10.0/#sec-makeconstructor'
	},
	MakeDate: {
		url: 'https://262.ecma-international.org/10.0/#sec-makedate'
	},
	MakeDay: {
		url: 'https://262.ecma-international.org/10.0/#sec-makeday'
	},
	MakeMethod: {
		url: 'https://262.ecma-international.org/10.0/#sec-makemethod'
	},
	MakeSuperPropertyReference: {
		url: 'https://262.ecma-international.org/10.0/#sec-makesuperpropertyreference'
	},
	MakeTime: {
		url: 'https://262.ecma-international.org/10.0/#sec-maketime'
	},
	max: {
		url: 'https://262.ecma-international.org/10.0/#eqn-max'
	},
	'memory-order': {
		url: 'https://262.ecma-international.org/10.0/#sec-memory-order'
	},
	min: {
		url: 'https://262.ecma-international.org/10.0/#eqn-min'
	},
	MinFromTime: {
		url: 'https://262.ecma-international.org/10.0/#eqn-MinFromTime'
	},
	ModuleNamespaceCreate: {
		url: 'https://262.ecma-international.org/10.0/#sec-modulenamespacecreate'
	},
	modulo: {
		url: 'https://262.ecma-international.org/10.0/#eqn-modulo'
	},
	MonthFromTime: {
		url: 'https://262.ecma-international.org/10.0/#eqn-MonthFromTime'
	},
	msFromTime: {
		url: 'https://262.ecma-international.org/10.0/#eqn-msFromTime'
	},
	NewDeclarativeEnvironment: {
		url: 'https://262.ecma-international.org/10.0/#sec-newdeclarativeenvironment'
	},
	NewFunctionEnvironment: {
		url: 'https://262.ecma-international.org/10.0/#sec-newfunctionenvironment'
	},
	NewGlobalEnvironment: {
		url: 'https://262.ecma-international.org/10.0/#sec-newglobalenvironment'
	},
	NewModuleEnvironment: {
		url: 'https://262.ecma-international.org/10.0/#sec-newmoduleenvironment'
	},
	NewObjectEnvironment: {
		url: 'https://262.ecma-international.org/10.0/#sec-newobjectenvironment'
	},
	NewPromiseCapability: {
		url: 'https://262.ecma-international.org/10.0/#sec-newpromisecapability'
	},
	NormalCompletion: {
		url: 'https://262.ecma-international.org/10.0/#sec-normalcompletion'
	},
	NotifyWaiter: {
		url: 'https://262.ecma-international.org/10.0/#sec-notifywaiter'
	},
	NumberToRawBytes: {
		url: 'https://262.ecma-international.org/10.0/#sec-numbertorawbytes'
	},
	NumberToString: {
		url: 'https://262.ecma-international.org/10.0/#sec-tostring-applied-to-the-number-type'
	},
	ObjectCreate: {
		url: 'https://262.ecma-international.org/10.0/#sec-objectcreate'
	},
	ObjectDefineProperties: {
		url: 'https://262.ecma-international.org/10.0/#sec-objectdefineproperties'
	},
	OrdinaryCallBindThis: {
		url: 'https://262.ecma-international.org/10.0/#sec-ordinarycallbindthis'
	},
	OrdinaryCallEvaluateBody: {
		url: 'https://262.ecma-international.org/10.0/#sec-ordinarycallevaluatebody'
	},
	OrdinaryCreateFromConstructor: {
		url: 'https://262.ecma-international.org/10.0/#sec-ordinarycreatefromconstructor'
	},
	OrdinaryDefineOwnProperty: {
		url: 'https://262.ecma-international.org/10.0/#sec-ordinarydefineownproperty'
	},
	OrdinaryDelete: {
		url: 'https://262.ecma-international.org/10.0/#sec-ordinarydelete'
	},
	OrdinaryGet: {
		url: 'https://262.ecma-international.org/10.0/#sec-ordinaryget'
	},
	OrdinaryGetOwnProperty: {
		url: 'https://262.ecma-international.org/10.0/#sec-ordinarygetownproperty'
	},
	OrdinaryGetPrototypeOf: {
		url: 'https://262.ecma-international.org/10.0/#sec-ordinarygetprototypeof'
	},
	OrdinaryHasInstance: {
		url: 'https://262.ecma-international.org/10.0/#sec-ordinaryhasinstance'
	},
	OrdinaryHasProperty: {
		url: 'https://262.ecma-international.org/10.0/#sec-ordinaryhasproperty'
	},
	OrdinaryIsExtensible: {
		url: 'https://262.ecma-international.org/10.0/#sec-ordinaryisextensible'
	},
	OrdinaryOwnPropertyKeys: {
		url: 'https://262.ecma-international.org/10.0/#sec-ordinaryownpropertykeys'
	},
	OrdinaryPreventExtensions: {
		url: 'https://262.ecma-international.org/10.0/#sec-ordinarypreventextensions'
	},
	OrdinarySet: {
		url: 'https://262.ecma-international.org/10.0/#sec-ordinaryset'
	},
	OrdinarySetPrototypeOf: {
		url: 'https://262.ecma-international.org/10.0/#sec-ordinarysetprototypeof'
	},
	OrdinarySetWithOwnDescriptor: {
		url: 'https://262.ecma-international.org/10.0/#sec-ordinarysetwithowndescriptor'
	},
	OrdinaryToPrimitive: {
		url: 'https://262.ecma-international.org/10.0/#sec-ordinarytoprimitive'
	},
	ParseModule: {
		url: 'https://262.ecma-international.org/10.0/#sec-parsemodule'
	},
	ParseScript: {
		url: 'https://262.ecma-international.org/10.0/#sec-parse-script'
	},
	PerformEval: {
		url: 'https://262.ecma-international.org/10.0/#sec-performeval'
	},
	PerformPromiseAll: {
		url: 'https://262.ecma-international.org/10.0/#sec-performpromiseall'
	},
	PerformPromiseRace: {
		url: 'https://262.ecma-international.org/10.0/#sec-performpromiserace'
	},
	PerformPromiseThen: {
		url: 'https://262.ecma-international.org/10.0/#sec-performpromisethen'
	},
	PrepareForOrdinaryCall: {
		url: 'https://262.ecma-international.org/10.0/#sec-prepareforordinarycall'
	},
	PrepareForTailCall: {
		url: 'https://262.ecma-international.org/10.0/#sec-preparefortailcall'
	},
	PromiseReactionJob: {
		url: 'https://262.ecma-international.org/10.0/#sec-promisereactionjob'
	},
	PromiseResolve: {
		url: 'https://262.ecma-international.org/10.0/#sec-promise-resolve'
	},
	PromiseResolveThenableJob: {
		url: 'https://262.ecma-international.org/10.0/#sec-promiseresolvethenablejob'
	},
	ProxyCreate: {
		url: 'https://262.ecma-international.org/10.0/#sec-proxycreate'
	},
	PutValue: {
		url: 'https://262.ecma-international.org/10.0/#sec-putvalue'
	},
	QuoteJSONString: {
		url: 'https://262.ecma-international.org/10.0/#sec-quotejsonstring'
	},
	RawBytesToNumber: {
		url: 'https://262.ecma-international.org/10.0/#sec-rawbytestonumber'
	},
	'reads-bytes-from': {
		url: 'https://262.ecma-international.org/10.0/#sec-reads-bytes-from'
	},
	'reads-from': {
		url: 'https://262.ecma-international.org/10.0/#sec-reads-from'
	},
	RegExpAlloc: {
		url: 'https://262.ecma-international.org/10.0/#sec-regexpalloc'
	},
	RegExpBuiltinExec: {
		url: 'https://262.ecma-international.org/10.0/#sec-regexpbuiltinexec'
	},
	RegExpCreate: {
		url: 'https://262.ecma-international.org/10.0/#sec-regexpcreate'
	},
	RegExpExec: {
		url: 'https://262.ecma-international.org/10.0/#sec-regexpexec'
	},
	RegExpInitialize: {
		url: 'https://262.ecma-international.org/10.0/#sec-regexpinitialize'
	},
	RejectPromise: {
		url: 'https://262.ecma-international.org/10.0/#sec-rejectpromise'
	},
	RemoveWaiter: {
		url: 'https://262.ecma-international.org/10.0/#sec-removewaiter'
	},
	RemoveWaiters: {
		url: 'https://262.ecma-international.org/10.0/#sec-removewaiters'
	},
	RepeatMatcher: {
		url: 'https://262.ecma-international.org/10.0/#sec-runtime-semantics-repeatmatcher-abstract-operation'
	},
	RequireObjectCoercible: {
		url: 'https://262.ecma-international.org/10.0/#sec-requireobjectcoercible'
	},
	ResolveBinding: {
		url: 'https://262.ecma-international.org/10.0/#sec-resolvebinding'
	},
	ResolveThisBinding: {
		url: 'https://262.ecma-international.org/10.0/#sec-resolvethisbinding'
	},
	ReturnIfAbrupt: {
		url: 'https://262.ecma-international.org/10.0/#sec-returnifabrupt'
	},
	RunJobs: {
		url: 'https://262.ecma-international.org/10.0/#sec-runjobs'
	},
	SameValue: {
		url: 'https://262.ecma-international.org/10.0/#sec-samevalue'
	},
	SameValueNonNumber: {
		url: 'https://262.ecma-international.org/10.0/#sec-samevaluenonnumber'
	},
	SameValueZero: {
		url: 'https://262.ecma-international.org/10.0/#sec-samevaluezero'
	},
	ScriptEvaluation: {
		url: 'https://262.ecma-international.org/10.0/#sec-runtime-semantics-scriptevaluation'
	},
	ScriptEvaluationJob: {
		url: 'https://262.ecma-international.org/10.0/#sec-scriptevaluationjob'
	},
	SecFromTime: {
		url: 'https://262.ecma-international.org/10.0/#eqn-SecFromTime'
	},
	SerializeJSONArray: {
		url: 'https://262.ecma-international.org/10.0/#sec-serializejsonarray'
	},
	SerializeJSONObject: {
		url: 'https://262.ecma-international.org/10.0/#sec-serializejsonobject'
	},
	SerializeJSONProperty: {
		url: 'https://262.ecma-international.org/10.0/#sec-serializejsonproperty'
	},
	Set: {
		url: 'https://262.ecma-international.org/10.0/#sec-set-o-p-v-throw'
	},
	SetDefaultGlobalBindings: {
		url: 'https://262.ecma-international.org/10.0/#sec-setdefaultglobalbindings'
	},
	SetFunctionLength: {
		url: 'https://262.ecma-international.org/10.0/#sec-setfunctionlength'
	},
	SetFunctionName: {
		url: 'https://262.ecma-international.org/10.0/#sec-setfunctionname'
	},
	SetImmutablePrototype: {
		url: 'https://262.ecma-international.org/10.0/#sec-set-immutable-prototype'
	},
	SetIntegrityLevel: {
		url: 'https://262.ecma-international.org/10.0/#sec-setintegritylevel'
	},
	SetRealmGlobalObject: {
		url: 'https://262.ecma-international.org/10.0/#sec-setrealmglobalobject'
	},
	SetValueInBuffer: {
		url: 'https://262.ecma-international.org/10.0/#sec-setvalueinbuffer'
	},
	SetViewValue: {
		url: 'https://262.ecma-international.org/10.0/#sec-setviewvalue'
	},
	SharedDataBlockEventSet: {
		url: 'https://262.ecma-international.org/10.0/#sec-sharedatablockeventset'
	},
	SortCompare: {
		url: 'https://262.ecma-international.org/10.0/#sec-sortcompare'
	},
	SpeciesConstructor: {
		url: 'https://262.ecma-international.org/10.0/#sec-speciesconstructor'
	},
	SplitMatch: {
		url: 'https://262.ecma-international.org/10.0/#sec-splitmatch'
	},
	'Strict Equality Comparison': {
		url: 'https://262.ecma-international.org/10.0/#sec-strict-equality-comparison'
	},
	StringCreate: {
		url: 'https://262.ecma-international.org/10.0/#sec-stringcreate'
	},
	StringGetOwnProperty: {
		url: 'https://262.ecma-international.org/10.0/#sec-stringgetownproperty'
	},
	Suspend: {
		url: 'https://262.ecma-international.org/10.0/#sec-suspend'
	},
	SymbolDescriptiveString: {
		url: 'https://262.ecma-international.org/10.0/#sec-symboldescriptivestring'
	},
	SynchronizeEventSet: {
		url: 'https://262.ecma-international.org/10.0/#sec-synchronizeeventset'
	},
	'synchronizes-with': {
		url: 'https://262.ecma-international.org/10.0/#sec-synchronizes-with'
	},
	TestIntegrityLevel: {
		url: 'https://262.ecma-international.org/10.0/#sec-testintegritylevel'
	},
	thisBooleanValue: {
		url: 'https://262.ecma-international.org/10.0/#sec-thisbooleanvalue'
	},
	thisNumberValue: {
		url: 'https://262.ecma-international.org/10.0/#sec-thisnumbervalue'
	},
	thisStringValue: {
		url: 'https://262.ecma-international.org/10.0/#sec-thisstringvalue'
	},
	thisSymbolValue: {
		url: 'https://262.ecma-international.org/10.0/#sec-thissymbolvalue'
	},
	thisTimeValue: {
		url: 'https://262.ecma-international.org/10.0/#sec-thistimevalue'
	},
	ThrowCompletion: {
		url: 'https://262.ecma-international.org/10.0/#sec-throwcompletion'
	},
	TimeClip: {
		url: 'https://262.ecma-international.org/10.0/#sec-timeclip'
	},
	TimeFromYear: {
		url: 'https://262.ecma-international.org/10.0/#eqn-TimeFromYear'
	},
	TimeString: {
		url: 'https://262.ecma-international.org/10.0/#sec-timestring'
	},
	TimeWithinDay: {
		url: 'https://262.ecma-international.org/10.0/#eqn-TimeWithinDay'
	},
	TimeZoneString: {
		url: 'https://262.ecma-international.org/10.0/#sec-timezoneestring'
	},
	ToBoolean: {
		url: 'https://262.ecma-international.org/10.0/#sec-toboolean'
	},
	ToDateString: {
		url: 'https://262.ecma-international.org/10.0/#sec-todatestring'
	},
	ToIndex: {
		url: 'https://262.ecma-international.org/10.0/#sec-toindex'
	},
	ToInt16: {
		url: 'https://262.ecma-international.org/10.0/#sec-toint16'
	},
	ToInt32: {
		url: 'https://262.ecma-international.org/10.0/#sec-toint32'
	},
	ToInt8: {
		url: 'https://262.ecma-international.org/10.0/#sec-toint8'
	},
	ToInteger: {
		url: 'https://262.ecma-international.org/10.0/#sec-tointeger'
	},
	ToLength: {
		url: 'https://262.ecma-international.org/10.0/#sec-tolength'
	},
	ToNumber: {
		url: 'https://262.ecma-international.org/10.0/#sec-tonumber'
	},
	ToObject: {
		url: 'https://262.ecma-international.org/10.0/#sec-toobject'
	},
	TopLevelModuleEvaluationJob: {
		url: 'https://262.ecma-international.org/10.0/#sec-toplevelmoduleevaluationjob'
	},
	ToPrimitive: {
		url: 'https://262.ecma-international.org/10.0/#sec-toprimitive'
	},
	ToPropertyDescriptor: {
		url: 'https://262.ecma-international.org/10.0/#sec-topropertydescriptor'
	},
	ToPropertyKey: {
		url: 'https://262.ecma-international.org/10.0/#sec-topropertykey'
	},
	ToString: {
		url: 'https://262.ecma-international.org/10.0/#sec-tostring'
	},
	ToUint16: {
		url: 'https://262.ecma-international.org/10.0/#sec-touint16'
	},
	ToUint32: {
		url: 'https://262.ecma-international.org/10.0/#sec-touint32'
	},
	ToUint8: {
		url: 'https://262.ecma-international.org/10.0/#sec-touint8'
	},
	ToUint8Clamp: {
		url: 'https://262.ecma-international.org/10.0/#sec-touint8clamp'
	},
	TriggerPromiseReactions: {
		url: 'https://262.ecma-international.org/10.0/#sec-triggerpromisereactions'
	},
	TrimString: {
		url: 'https://262.ecma-international.org/10.0/#sec-trimstring'
	},
	Type: {
		url: 'https://262.ecma-international.org/10.0/#sec-ecmascript-data-types-and-values'
	},
	TypedArrayCreate: {
		url: 'https://262.ecma-international.org/10.0/#typedarray-create'
	},
	TypedArraySpeciesCreate: {
		url: 'https://262.ecma-international.org/10.0/#typedarray-species-create'
	},
	UnicodeEscape: {
		url: 'https://262.ecma-international.org/10.0/#sec-unicodeescape'
	},
	UnicodeMatchProperty: {
		url: 'https://262.ecma-international.org/10.0/#sec-runtime-semantics-unicodematchproperty-p'
	},
	UnicodeMatchPropertyValue: {
		url: 'https://262.ecma-international.org/10.0/#sec-runtime-semantics-unicodematchpropertyvalue-p-v'
	},
	UpdateEmpty: {
		url: 'https://262.ecma-international.org/10.0/#sec-updateempty'
	},
	UTC: {
		url: 'https://262.ecma-international.org/10.0/#sec-utc-t'
	},
	UTF16Decode: {
		url: 'https://262.ecma-international.org/10.0/#sec-utf16decode'
	},
	UTF16Encoding: {
		url: 'https://262.ecma-international.org/10.0/#sec-utf16encoding'
	},
	ValidateAndApplyPropertyDescriptor: {
		url: 'https://262.ecma-international.org/10.0/#sec-validateandapplypropertydescriptor'
	},
	ValidateAtomicAccess: {
		url: 'https://262.ecma-international.org/10.0/#sec-validateatomicaccess'
	},
	ValidateSharedIntegerTypedArray: {
		url: 'https://262.ecma-international.org/10.0/#sec-validatesharedintegertypedarray'
	},
	ValidateTypedArray: {
		url: 'https://262.ecma-international.org/10.0/#sec-validatetypedarray'
	},
	ValueOfReadEvent: {
		url: 'https://262.ecma-international.org/10.0/#sec-valueofreadevent'
	},
	WeekDay: {
		url: 'https://262.ecma-international.org/10.0/#sec-week-day'
	},
	WordCharacters: {
		url: 'https://262.ecma-international.org/10.0/#sec-runtime-semantics-wordcharacters-abstract-operation'
	},
	YearFromTime: {
		url: 'https://262.ecma-international.org/10.0/#eqn-YearFromTime'
	}
};
'use strict';

module.exports = {
	abs: {
		url: 'https://262.ecma-international.org/11.0/#eqn-abs'
	},
	'Abstract Equality Comparison': {
		url: 'https://262.ecma-international.org/11.0/#sec-abstract-equality-comparison'
	},
	'Abstract Relational Comparison': {
		url: 'https://262.ecma-international.org/11.0/#sec-abstract-relational-comparison'
	},
	AddEntriesFromIterable: {
		url: 'https://262.ecma-international.org/11.0/#sec-add-entries-from-iterable'
	},
	AddRestrictedFunctionProperties: {
		url: 'https://262.ecma-international.org/11.0/#sec-addrestrictedfunctionproperties'
	},
	AddWaiter: {
		url: 'https://262.ecma-international.org/11.0/#sec-addwaiter'
	},
	AdvanceStringIndex: {
		url: 'https://262.ecma-international.org/11.0/#sec-advancestringindex'
	},
	'agent-order': {
		url: 'https://262.ecma-international.org/11.0/#sec-agent-order'
	},
	AgentCanSuspend: {
		url: 'https://262.ecma-international.org/11.0/#sec-agentcansuspend'
	},
	AgentSignifier: {
		url: 'https://262.ecma-international.org/11.0/#sec-agentsignifier'
	},
	AllocateArrayBuffer: {
		url: 'https://262.ecma-international.org/11.0/#sec-allocatearraybuffer'
	},
	AllocateSharedArrayBuffer: {
		url: 'https://262.ecma-international.org/11.0/#sec-allocatesharedarraybuffer'
	},
	AllocateTypedArray: {
		url: 'https://262.ecma-international.org/11.0/#sec-allocatetypedarray'
	},
	AllocateTypedArrayBuffer: {
		url: 'https://262.ecma-international.org/11.0/#sec-allocatetypedarraybuffer'
	},
	ArrayCreate: {
		url: 'https://262.ecma-international.org/11.0/#sec-arraycreate'
	},
	ArraySetLength: {
		url: 'https://262.ecma-international.org/11.0/#sec-arraysetlength'
	},
	ArraySpeciesCreate: {
		url: 'https://262.ecma-international.org/11.0/#sec-arrayspeciescreate'
	},
	AsyncFromSyncIteratorContinuation: {
		url: 'https://262.ecma-international.org/11.0/#sec-asyncfromsynciteratorcontinuation'
	},
	AsyncFunctionStart: {
		url: 'https://262.ecma-international.org/11.0/#sec-async-functions-abstract-operations-async-function-start'
	},
	AsyncGeneratorEnqueue: {
		url: 'https://262.ecma-international.org/11.0/#sec-asyncgeneratorenqueue'
	},
	AsyncGeneratorReject: {
		url: 'https://262.ecma-international.org/11.0/#sec-asyncgeneratorreject'
	},
	AsyncGeneratorResolve: {
		url: 'https://262.ecma-international.org/11.0/#sec-asyncgeneratorresolve'
	},
	AsyncGeneratorResumeNext: {
		url: 'https://262.ecma-international.org/11.0/#sec-asyncgeneratorresumenext'
	},
	AsyncGeneratorStart: {
		url: 'https://262.ecma-international.org/11.0/#sec-asyncgeneratorstart'
	},
	AsyncGeneratorYield: {
		url: 'https://262.ecma-international.org/11.0/#sec-asyncgeneratoryield'
	},
	AsyncIteratorClose: {
		url: 'https://262.ecma-international.org/11.0/#sec-asynciteratorclose'
	},
	AtomicLoad: {
		url: 'https://262.ecma-international.org/11.0/#sec-atomicload'
	},
	AtomicReadModifyWrite: {
		url: 'https://262.ecma-international.org/11.0/#sec-atomicreadmodifywrite'
	},
	Await: {
		url: 'https://262.ecma-international.org/11.0/#await'
	},
	BackreferenceMatcher: {
		url: 'https://262.ecma-international.org/11.0/#sec-backreference-matcher'
	},
	'BigInt::add': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-add'
	},
	'BigInt::bitwiseAND': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-bitwiseAND'
	},
	'BigInt::bitwiseNOT': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-bitwiseNOT'
	},
	'BigInt::bitwiseOR': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-bitwiseOR'
	},
	'BigInt::bitwiseXOR': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-bitwiseXOR'
	},
	'BigInt::divide': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-divide'
	},
	'BigInt::equal': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-equal'
	},
	'BigInt::exponentiate': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-exponentiate'
	},
	'BigInt::leftShift': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-leftShift'
	},
	'BigInt::lessThan': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-lessThan'
	},
	'BigInt::multiply': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-multiply'
	},
	'BigInt::remainder': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-remainder'
	},
	'BigInt::sameValue': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-sameValue'
	},
	'BigInt::sameValueZero': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-sameValueZero'
	},
	'BigInt::signedRightShift': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-signedRightShift'
	},
	'BigInt::subtract': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-subtract'
	},
	'BigInt::toString': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-tostring'
	},
	'BigInt::unaryMinus': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-unaryMinus'
	},
	'BigInt::unsignedRightShift': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-unsignedRightShift'
	},
	BigIntBitwiseOp: {
		url: 'https://262.ecma-international.org/11.0/#sec-bigintbitwiseop'
	},
	BinaryAnd: {
		url: 'https://262.ecma-international.org/11.0/#sec-binaryand'
	},
	BinaryOr: {
		url: 'https://262.ecma-international.org/11.0/#sec-binaryor'
	},
	BinaryXor: {
		url: 'https://262.ecma-international.org/11.0/#sec-binaryxor'
	},
	BlockDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/11.0/#sec-blockdeclarationinstantiation'
	},
	BoundFunctionCreate: {
		url: 'https://262.ecma-international.org/11.0/#sec-boundfunctioncreate'
	},
	Call: {
		url: 'https://262.ecma-international.org/11.0/#sec-call'
	},
	Canonicalize: {
		url: 'https://262.ecma-international.org/11.0/#sec-runtime-semantics-canonicalize-ch'
	},
	CanonicalNumericIndexString: {
		url: 'https://262.ecma-international.org/11.0/#sec-canonicalnumericindexstring'
	},
	CaseClauseIsSelected: {
		url: 'https://262.ecma-international.org/11.0/#sec-runtime-semantics-caseclauseisselected'
	},
	CharacterRange: {
		url: 'https://262.ecma-international.org/11.0/#sec-runtime-semantics-characterrange-abstract-operation'
	},
	CharacterRangeOrUnion: {
		url: 'https://262.ecma-international.org/11.0/#sec-runtime-semantics-characterrangeorunion-abstract-operation'
	},
	CharacterSetMatcher: {
		url: 'https://262.ecma-international.org/11.0/#sec-runtime-semantics-charactersetmatcher-abstract-operation'
	},
	CloneArrayBuffer: {
		url: 'https://262.ecma-international.org/11.0/#sec-clonearraybuffer'
	},
	CodePointAt: {
		url: 'https://262.ecma-international.org/11.0/#sec-codepointat'
	},
	CompletePropertyDescriptor: {
		url: 'https://262.ecma-international.org/11.0/#sec-completepropertydescriptor'
	},
	Completion: {
		url: 'https://262.ecma-international.org/11.0/#sec-completion-record-specification-type'
	},
	ComposeWriteEventBytes: {
		url: 'https://262.ecma-international.org/11.0/#sec-composewriteeventbytes'
	},
	Construct: {
		url: 'https://262.ecma-international.org/11.0/#sec-construct'
	},
	CopyDataBlockBytes: {
		url: 'https://262.ecma-international.org/11.0/#sec-copydatablockbytes'
	},
	CopyDataProperties: {
		url: 'https://262.ecma-international.org/11.0/#sec-copydataproperties'
	},
	CreateArrayFromList: {
		url: 'https://262.ecma-international.org/11.0/#sec-createarrayfromlist'
	},
	CreateArrayIterator: {
		url: 'https://262.ecma-international.org/11.0/#sec-createarrayiterator'
	},
	CreateAsyncFromSyncIterator: {
		url: 'https://262.ecma-international.org/11.0/#sec-createasyncfromsynciterator'
	},
	CreateBuiltinFunction: {
		url: 'https://262.ecma-international.org/11.0/#sec-createbuiltinfunction'
	},
	CreateByteDataBlock: {
		url: 'https://262.ecma-international.org/11.0/#sec-createbytedatablock'
	},
	CreateDataProperty: {
		url: 'https://262.ecma-international.org/11.0/#sec-createdataproperty'
	},
	CreateDataPropertyOrThrow: {
		url: 'https://262.ecma-international.org/11.0/#sec-createdatapropertyorthrow'
	},
	CreateDynamicFunction: {
		url: 'https://262.ecma-international.org/11.0/#sec-createdynamicfunction'
	},
	CreateForInIterator: {
		url: 'https://262.ecma-international.org/11.0/#sec-createforiniterator'
	},
	CreateHTML: {
		url: 'https://262.ecma-international.org/11.0/#sec-createhtml'
	},
	CreateIntrinsics: {
		url: 'https://262.ecma-international.org/11.0/#sec-createintrinsics'
	},
	CreateIterResultObject: {
		url: 'https://262.ecma-international.org/11.0/#sec-createiterresultobject'
	},
	CreateListFromArrayLike: {
		url: 'https://262.ecma-international.org/11.0/#sec-createlistfromarraylike'
	},
	CreateListIteratorRecord: {
		url: 'https://262.ecma-international.org/11.0/#sec-createlistiteratorRecord'
	},
	CreateMapIterator: {
		url: 'https://262.ecma-international.org/11.0/#sec-createmapiterator'
	},
	CreateMappedArgumentsObject: {
		url: 'https://262.ecma-international.org/11.0/#sec-createmappedargumentsobject'
	},
	CreateMethodProperty: {
		url: 'https://262.ecma-international.org/11.0/#sec-createmethodproperty'
	},
	CreatePerIterationEnvironment: {
		url: 'https://262.ecma-international.org/11.0/#sec-createperiterationenvironment'
	},
	CreateRealm: {
		url: 'https://262.ecma-international.org/11.0/#sec-createrealm'
	},
	CreateRegExpStringIterator: {
		url: 'https://262.ecma-international.org/11.0/#sec-createregexpstringiterator'
	},
	CreateResolvingFunctions: {
		url: 'https://262.ecma-international.org/11.0/#sec-createresolvingfunctions'
	},
	CreateSetIterator: {
		url: 'https://262.ecma-international.org/11.0/#sec-createsetiterator'
	},
	CreateSharedByteDataBlock: {
		url: 'https://262.ecma-international.org/11.0/#sec-createsharedbytedatablock'
	},
	CreateStringIterator: {
		url: 'https://262.ecma-international.org/11.0/#sec-createstringiterator'
	},
	CreateUnmappedArgumentsObject: {
		url: 'https://262.ecma-international.org/11.0/#sec-createunmappedargumentsobject'
	},
	DateFromTime: {
		url: 'https://262.ecma-international.org/11.0/#sec-date-number'
	},
	DateString: {
		url: 'https://262.ecma-international.org/11.0/#sec-datestring'
	},
	Day: {
		url: 'https://262.ecma-international.org/11.0/#eqn-Day'
	},
	DayFromYear: {
		url: 'https://262.ecma-international.org/11.0/#eqn-DaysFromYear'
	},
	DaysInYear: {
		url: 'https://262.ecma-international.org/11.0/#eqn-DaysInYear'
	},
	DayWithinYear: {
		url: 'https://262.ecma-international.org/11.0/#eqn-DayWithinYear'
	},
	Decode: {
		url: 'https://262.ecma-international.org/11.0/#sec-decode'
	},
	DefinePropertyOrThrow: {
		url: 'https://262.ecma-international.org/11.0/#sec-definepropertyorthrow'
	},
	DeletePropertyOrThrow: {
		url: 'https://262.ecma-international.org/11.0/#sec-deletepropertyorthrow'
	},
	DetachArrayBuffer: {
		url: 'https://262.ecma-international.org/11.0/#sec-detacharraybuffer'
	},
	Encode: {
		url: 'https://262.ecma-international.org/11.0/#sec-encode'
	},
	EnterCriticalSection: {
		url: 'https://262.ecma-international.org/11.0/#sec-entercriticalsection'
	},
	EnumerableOwnPropertyNames: {
		url: 'https://262.ecma-international.org/11.0/#sec-enumerableownpropertynames'
	},
	EnumerateObjectProperties: {
		url: 'https://262.ecma-international.org/11.0/#sec-enumerate-object-properties'
	},
	EscapeRegExpPattern: {
		url: 'https://262.ecma-international.org/11.0/#sec-escaperegexppattern'
	},
	EvalDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/11.0/#sec-evaldeclarationinstantiation'
	},
	EvaluateCall: {
		url: 'https://262.ecma-international.org/11.0/#sec-evaluatecall'
	},
	EvaluateNew: {
		url: 'https://262.ecma-international.org/11.0/#sec-evaluatenew'
	},
	EvaluatePropertyAccessWithExpressionKey: {
		url: 'https://262.ecma-international.org/11.0/#sec-evaluate-property-access-with-expression-key'
	},
	EvaluatePropertyAccessWithIdentifierKey: {
		url: 'https://262.ecma-international.org/11.0/#sec-evaluate-property-access-with-identifier-key'
	},
	EventSet: {
		url: 'https://262.ecma-international.org/11.0/#sec-event-set'
	},
	ExecuteModule: {
		url: 'https://262.ecma-international.org/11.0/#sec-source-text-module-record-execute-module'
	},
	FinishDynamicImport: {
		url: 'https://262.ecma-international.org/11.0/#sec-finishdynamicimport'
	},
	FlattenIntoArray: {
		url: 'https://262.ecma-international.org/11.0/#sec-flattenintoarray'
	},
	floor: {
		url: 'https://262.ecma-international.org/11.0/#eqn-floor'
	},
	ForBodyEvaluation: {
		url: 'https://262.ecma-international.org/11.0/#sec-forbodyevaluation'
	},
	'ForIn/OfBodyEvaluation': {
		url: 'https://262.ecma-international.org/11.0/#sec-runtime-semantics-forin-div-ofbodyevaluation-lhs-stmt-iterator-lhskind-labelset'
	},
	'ForIn/OfHeadEvaluation': {
		url: 'https://262.ecma-international.org/11.0/#sec-runtime-semantics-forinofheadevaluation'
	},
	FromPropertyDescriptor: {
		url: 'https://262.ecma-international.org/11.0/#sec-frompropertydescriptor'
	},
	FulfillPromise: {
		url: 'https://262.ecma-international.org/11.0/#sec-fulfillpromise'
	},
	FunctionDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/11.0/#sec-functiondeclarationinstantiation'
	},
	GeneratorResume: {
		url: 'https://262.ecma-international.org/11.0/#sec-generatorresume'
	},
	GeneratorResumeAbrupt: {
		url: 'https://262.ecma-international.org/11.0/#sec-generatorresumeabrupt'
	},
	GeneratorStart: {
		url: 'https://262.ecma-international.org/11.0/#sec-generatorstart'
	},
	GeneratorValidate: {
		url: 'https://262.ecma-international.org/11.0/#sec-generatorvalidate'
	},
	GeneratorYield: {
		url: 'https://262.ecma-international.org/11.0/#sec-generatoryield'
	},
	Get: {
		url: 'https://262.ecma-international.org/11.0/#sec-get-o-p'
	},
	GetActiveScriptOrModule: {
		url: 'https://262.ecma-international.org/11.0/#sec-getactivescriptormodule'
	},
	GetBase: {
		url: 'https://262.ecma-international.org/11.0/#sec-getbase'
	},
	GetFunctionRealm: {
		url: 'https://262.ecma-international.org/11.0/#sec-getfunctionrealm'
	},
	GetGeneratorKind: {
		url: 'https://262.ecma-international.org/11.0/#sec-getgeneratorkind'
	},
	GetGlobalObject: {
		url: 'https://262.ecma-international.org/11.0/#sec-getglobalobject'
	},
	GetIdentifierReference: {
		url: 'https://262.ecma-international.org/11.0/#sec-getidentifierreference'
	},
	GetIterator: {
		url: 'https://262.ecma-international.org/11.0/#sec-getiterator'
	},
	GetMethod: {
		url: 'https://262.ecma-international.org/11.0/#sec-getmethod'
	},
	GetModifySetValueInBuffer: {
		url: 'https://262.ecma-international.org/11.0/#sec-getmodifysetvalueinbuffer'
	},
	GetModuleNamespace: {
		url: 'https://262.ecma-international.org/11.0/#sec-getmodulenamespace'
	},
	GetNewTarget: {
		url: 'https://262.ecma-international.org/11.0/#sec-getnewtarget'
	},
	GetOwnPropertyKeys: {
		url: 'https://262.ecma-international.org/11.0/#sec-getownpropertykeys'
	},
	GetPrototypeFromConstructor: {
		url: 'https://262.ecma-international.org/11.0/#sec-getprototypefromconstructor'
	},
	GetReferencedName: {
		url: 'https://262.ecma-international.org/11.0/#sec-getreferencedname'
	},
	GetSubstitution: {
		url: 'https://262.ecma-international.org/11.0/#sec-getsubstitution'
	},
	GetSuperConstructor: {
		url: 'https://262.ecma-international.org/11.0/#sec-getsuperconstructor'
	},
	GetTemplateObject: {
		url: 'https://262.ecma-international.org/11.0/#sec-gettemplateobject'
	},
	GetThisEnvironment: {
		url: 'https://262.ecma-international.org/11.0/#sec-getthisenvironment'
	},
	GetThisValue: {
		url: 'https://262.ecma-international.org/11.0/#sec-getthisvalue'
	},
	GetV: {
		url: 'https://262.ecma-international.org/11.0/#sec-getv'
	},
	GetValue: {
		url: 'https://262.ecma-international.org/11.0/#sec-getvalue'
	},
	GetValueFromBuffer: {
		url: 'https://262.ecma-international.org/11.0/#sec-getvaluefrombuffer'
	},
	GetViewValue: {
		url: 'https://262.ecma-international.org/11.0/#sec-getviewvalue'
	},
	GetWaiterList: {
		url: 'https://262.ecma-international.org/11.0/#sec-getwaiterlist'
	},
	GlobalDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/11.0/#sec-globaldeclarationinstantiation'
	},
	'happens-before': {
		url: 'https://262.ecma-international.org/11.0/#sec-happens-before'
	},
	HasOwnProperty: {
		url: 'https://262.ecma-international.org/11.0/#sec-hasownproperty'
	},
	HasPrimitiveBase: {
		url: 'https://262.ecma-international.org/11.0/#sec-hasprimitivebase'
	},
	HasProperty: {
		url: 'https://262.ecma-international.org/11.0/#sec-hasproperty'
	},
	'host-synchronizes-with': {
		url: 'https://262.ecma-international.org/11.0/#sec-host-synchronizes-with'
	},
	HostEnqueuePromiseJob: {
		url: 'https://262.ecma-international.org/11.0/#sec-hostenqueuepromisejob'
	},
	HostEnsureCanCompileStrings: {
		url: 'https://262.ecma-international.org/11.0/#sec-hostensurecancompilestrings'
	},
	HostEventSet: {
		url: 'https://262.ecma-international.org/11.0/#sec-hosteventset'
	},
	HostFinalizeImportMeta: {
		url: 'https://262.ecma-international.org/11.0/#sec-hostfinalizeimportmeta'
	},
	HostGetImportMetaProperties: {
		url: 'https://262.ecma-international.org/11.0/#sec-hostgetimportmetaproperties'
	},
	HostImportModuleDynamically: {
		url: 'https://262.ecma-international.org/11.0/#sec-hostimportmoduledynamically'
	},
	HostPromiseRejectionTracker: {
		url: 'https://262.ecma-international.org/11.0/#sec-host-promise-rejection-tracker'
	},
	HostResolveImportedModule: {
		url: 'https://262.ecma-international.org/11.0/#sec-hostresolveimportedmodule'
	},
	HourFromTime: {
		url: 'https://262.ecma-international.org/11.0/#eqn-HourFromTime'
	},
	IfAbruptRejectPromise: {
		url: 'https://262.ecma-international.org/11.0/#sec-ifabruptrejectpromise'
	},
	ImportedLocalNames: {
		url: 'https://262.ecma-international.org/11.0/#sec-importedlocalnames'
	},
	InitializeBoundName: {
		url: 'https://262.ecma-international.org/11.0/#sec-initializeboundname'
	},
	InitializeEnvironment: {
		url: 'https://262.ecma-international.org/11.0/#sec-source-text-module-record-initialize-environment'
	},
	InitializeHostDefinedRealm: {
		url: 'https://262.ecma-international.org/11.0/#sec-initializehostdefinedrealm'
	},
	InitializeReferencedBinding: {
		url: 'https://262.ecma-international.org/11.0/#sec-initializereferencedbinding'
	},
	InLeapYear: {
		url: 'https://262.ecma-international.org/11.0/#eqn-InLeapYear'
	},
	InnerModuleEvaluation: {
		url: 'https://262.ecma-international.org/11.0/#sec-innermoduleevaluation'
	},
	InnerModuleLinking: {
		url: 'https://262.ecma-international.org/11.0/#sec-InnerModuleLinking'
	},
	InstanceofOperator: {
		url: 'https://262.ecma-international.org/11.0/#sec-instanceofoperator'
	},
	IntegerIndexedElementGet: {
		url: 'https://262.ecma-international.org/11.0/#sec-integerindexedelementget'
	},
	IntegerIndexedElementSet: {
		url: 'https://262.ecma-international.org/11.0/#sec-integerindexedelementset'
	},
	IntegerIndexedObjectCreate: {
		url: 'https://262.ecma-international.org/11.0/#sec-integerindexedobjectcreate'
	},
	InternalizeJSONProperty: {
		url: 'https://262.ecma-international.org/11.0/#sec-internalizejsonproperty'
	},
	Invoke: {
		url: 'https://262.ecma-international.org/11.0/#sec-invoke'
	},
	IsAccessorDescriptor: {
		url: 'https://262.ecma-international.org/11.0/#sec-isaccessordescriptor'
	},
	IsAnonymousFunctionDefinition: {
		url: 'https://262.ecma-international.org/11.0/#sec-isanonymousfunctiondefinition'
	},
	IsArray: {
		url: 'https://262.ecma-international.org/11.0/#sec-isarray'
	},
	IsBigIntElementType: {
		url: 'https://262.ecma-international.org/11.0/#sec-isbigintelementtype'
	},
	IsCallable: {
		url: 'https://262.ecma-international.org/11.0/#sec-iscallable'
	},
	IsCompatiblePropertyDescriptor: {
		url: 'https://262.ecma-international.org/11.0/#sec-iscompatiblepropertydescriptor'
	},
	IsConcatSpreadable: {
		url: 'https://262.ecma-international.org/11.0/#sec-isconcatspreadable'
	},
	IsConstructor: {
		url: 'https://262.ecma-international.org/11.0/#sec-isconstructor'
	},
	IsDataDescriptor: {
		url: 'https://262.ecma-international.org/11.0/#sec-isdatadescriptor'
	},
	IsDetachedBuffer: {
		url: 'https://262.ecma-international.org/11.0/#sec-isdetachedbuffer'
	},
	IsExtensible: {
		url: 'https://262.ecma-international.org/11.0/#sec-isextensible-o'
	},
	IsGenericDescriptor: {
		url: 'https://262.ecma-international.org/11.0/#sec-isgenericdescriptor'
	},
	IsInTailPosition: {
		url: 'https://262.ecma-international.org/11.0/#sec-isintailposition'
	},
	IsInteger: {
		url: 'https://262.ecma-international.org/11.0/#sec-isinteger'
	},
	IsLabelledFunction: {
		url: 'https://262.ecma-international.org/11.0/#sec-islabelledfunction'
	},
	IsNonNegativeInteger: {
		url: 'https://262.ecma-international.org/11.0/#sec-isnonnegativeinteger'
	},
	IsNoTearConfiguration: {
		url: 'https://262.ecma-international.org/11.0/#sec-isnotearconfiguration'
	},
	IsPromise: {
		url: 'https://262.ecma-international.org/11.0/#sec-ispromise'
	},
	IsPropertyKey: {
		url: 'https://262.ecma-international.org/11.0/#sec-ispropertykey'
	},
	IsPropertyReference: {
		url: 'https://262.ecma-international.org/11.0/#sec-ispropertyreference'
	},
	IsRegExp: {
		url: 'https://262.ecma-international.org/11.0/#sec-isregexp'
	},
	IsSharedArrayBuffer: {
		url: 'https://262.ecma-international.org/11.0/#sec-issharedarraybuffer'
	},
	IsStrictReference: {
		url: 'https://262.ecma-international.org/11.0/#sec-isstrictreference'
	},
	IsStringPrefix: {
		url: 'https://262.ecma-international.org/11.0/#sec-isstringprefix'
	},
	IsSuperReference: {
		url: 'https://262.ecma-international.org/11.0/#sec-issuperreference'
	},
	IsUnclampedIntegerElementType: {
		url: 'https://262.ecma-international.org/11.0/#sec-isunclampedintegerelementtype'
	},
	IsUnresolvableReference: {
		url: 'https://262.ecma-international.org/11.0/#sec-isunresolvablereference'
	},
	IsUnsignedElementType: {
		url: 'https://262.ecma-international.org/11.0/#sec-isunsignedelementtype'
	},
	IsValidIntegerIndex: {
		url: 'https://262.ecma-international.org/11.0/#sec-isvalidintegerindex'
	},
	IsValidRegularExpressionLiteral: {
		url: 'https://262.ecma-international.org/11.0/#sec-isvalidregularexpressionliteral'
	},
	IsWordChar: {
		url: 'https://262.ecma-international.org/11.0/#sec-runtime-semantics-iswordchar-abstract-operation'
	},
	IterableToList: {
		url: 'https://262.ecma-international.org/11.0/#sec-iterabletolist'
	},
	IteratorClose: {
		url: 'https://262.ecma-international.org/11.0/#sec-iteratorclose'
	},
	IteratorComplete: {
		url: 'https://262.ecma-international.org/11.0/#sec-iteratorcomplete'
	},
	IteratorNext: {
		url: 'https://262.ecma-international.org/11.0/#sec-iteratornext'
	},
	IteratorStep: {
		url: 'https://262.ecma-international.org/11.0/#sec-iteratorstep'
	},
	IteratorValue: {
		url: 'https://262.ecma-international.org/11.0/#sec-iteratorvalue'
	},
	LeaveCriticalSection: {
		url: 'https://262.ecma-international.org/11.0/#sec-leavecriticalsection'
	},
	LengthOfArrayLike: {
		url: 'https://262.ecma-international.org/11.0/#sec-lengthofarraylike'
	},
	LocalTime: {
		url: 'https://262.ecma-international.org/11.0/#sec-localtime'
	},
	LocalTZA: {
		url: 'https://262.ecma-international.org/11.0/#sec-local-time-zone-adjustment'
	},
	LoopContinues: {
		url: 'https://262.ecma-international.org/11.0/#sec-loopcontinues'
	},
	MakeArgGetter: {
		url: 'https://262.ecma-international.org/11.0/#sec-makearggetter'
	},
	MakeArgSetter: {
		url: 'https://262.ecma-international.org/11.0/#sec-makeargsetter'
	},
	MakeBasicObject: {
		url: 'https://262.ecma-international.org/11.0/#sec-makebasicobject'
	},
	MakeClassConstructor: {
		url: 'https://262.ecma-international.org/11.0/#sec-makeclassconstructor'
	},
	MakeConstructor: {
		url: 'https://262.ecma-international.org/11.0/#sec-makeconstructor'
	},
	MakeDate: {
		url: 'https://262.ecma-international.org/11.0/#sec-makedate'
	},
	MakeDay: {
		url: 'https://262.ecma-international.org/11.0/#sec-makeday'
	},
	MakeMethod: {
		url: 'https://262.ecma-international.org/11.0/#sec-makemethod'
	},
	MakeSuperPropertyReference: {
		url: 'https://262.ecma-international.org/11.0/#sec-makesuperpropertyreference'
	},
	MakeTime: {
		url: 'https://262.ecma-international.org/11.0/#sec-maketime'
	},
	max: {
		url: 'https://262.ecma-international.org/11.0/#eqn-max'
	},
	'memory-order': {
		url: 'https://262.ecma-international.org/11.0/#sec-memory-order'
	},
	min: {
		url: 'https://262.ecma-international.org/11.0/#eqn-min'
	},
	MinFromTime: {
		url: 'https://262.ecma-international.org/11.0/#eqn-MinFromTime'
	},
	ModuleNamespaceCreate: {
		url: 'https://262.ecma-international.org/11.0/#sec-modulenamespacecreate'
	},
	modulo: {
		url: 'https://262.ecma-international.org/11.0/#eqn-modulo'
	},
	MonthFromTime: {
		url: 'https://262.ecma-international.org/11.0/#eqn-MonthFromTime'
	},
	msFromTime: {
		url: 'https://262.ecma-international.org/11.0/#eqn-msFromTime'
	},
	NewDeclarativeEnvironment: {
		url: 'https://262.ecma-international.org/11.0/#sec-newdeclarativeenvironment'
	},
	NewFunctionEnvironment: {
		url: 'https://262.ecma-international.org/11.0/#sec-newfunctionenvironment'
	},
	NewGlobalEnvironment: {
		url: 'https://262.ecma-international.org/11.0/#sec-newglobalenvironment'
	},
	NewModuleEnvironment: {
		url: 'https://262.ecma-international.org/11.0/#sec-newmoduleenvironment'
	},
	NewObjectEnvironment: {
		url: 'https://262.ecma-international.org/11.0/#sec-newobjectenvironment'
	},
	NewPromiseCapability: {
		url: 'https://262.ecma-international.org/11.0/#sec-newpromisecapability'
	},
	NewPromiseReactionJob: {
		url: 'https://262.ecma-international.org/11.0/#sec-newpromisereactionjob'
	},
	NewPromiseResolveThenableJob: {
		url: 'https://262.ecma-international.org/11.0/#sec-newpromiseresolvethenablejob'
	},
	NormalCompletion: {
		url: 'https://262.ecma-international.org/11.0/#sec-normalcompletion'
	},
	NotifyWaiter: {
		url: 'https://262.ecma-international.org/11.0/#sec-notifywaiter'
	},
	'Number::add': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-add'
	},
	'Number::bitwiseAND': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-bitwiseAND'
	},
	'Number::bitwiseNOT': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-bitwiseNOT'
	},
	'Number::bitwiseOR': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-bitwiseOR'
	},
	'Number::bitwiseXOR': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-bitwiseXOR'
	},
	'Number::divide': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-divide'
	},
	'Number::equal': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-equal'
	},
	'Number::exponentiate': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-exponentiate'
	},
	'Number::leftShift': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-leftShift'
	},
	'Number::lessThan': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-lessThan'
	},
	'Number::multiply': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-multiply'
	},
	'Number::remainder': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-remainder'
	},
	'Number::sameValue': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-sameValue'
	},
	'Number::sameValueZero': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-sameValueZero'
	},
	'Number::signedRightShift': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-signedRightShift'
	},
	'Number::subtract': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-subtract'
	},
	'Number::toString': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-tostring'
	},
	'Number::unaryMinus': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-unaryMinus'
	},
	'Number::unsignedRightShift': {
		url: 'https://262.ecma-international.org/11.0/#sec-numeric-types-number-unsignedRightShift'
	},
	NumberBitwiseOp: {
		url: 'https://262.ecma-international.org/11.0/#sec-numberbitwiseop'
	},
	NumberToBigInt: {
		url: 'https://262.ecma-international.org/11.0/#sec-numbertobigint'
	},
	NumericToRawBytes: {
		url: 'https://262.ecma-international.org/11.0/#sec-numerictorawbytes'
	},
	ObjectDefineProperties: {
		url: 'https://262.ecma-international.org/11.0/#sec-objectdefineproperties'
	},
	OrdinaryCallBindThis: {
		url: 'https://262.ecma-international.org/11.0/#sec-ordinarycallbindthis'
	},
	OrdinaryCallEvaluateBody: {
		url: 'https://262.ecma-international.org/11.0/#sec-ordinarycallevaluatebody'
	},
	OrdinaryCreateFromConstructor: {
		url: 'https://262.ecma-international.org/11.0/#sec-ordinarycreatefromconstructor'
	},
	OrdinaryDefineOwnProperty: {
		url: 'https://262.ecma-international.org/11.0/#sec-ordinarydefineownproperty'
	},
	OrdinaryDelete: {
		url: 'https://262.ecma-international.org/11.0/#sec-ordinarydelete'
	},
	OrdinaryFunctionCreate: {
		url: 'https://262.ecma-international.org/11.0/#sec-ordinaryfunctioncreate'
	},
	OrdinaryGet: {
		url: 'https://262.ecma-international.org/11.0/#sec-ordinaryget'
	},
	OrdinaryGetOwnProperty: {
		url: 'https://262.ecma-international.org/11.0/#sec-ordinarygetownproperty'
	},
	OrdinaryGetPrototypeOf: {
		url: 'https://262.ecma-international.org/11.0/#sec-ordinarygetprototypeof'
	},
	OrdinaryHasInstance: {
		url: 'https://262.ecma-international.org/11.0/#sec-ordinaryhasinstance'
	},
	OrdinaryHasProperty: {
		url: 'https://262.ecma-international.org/11.0/#sec-ordinaryhasproperty'
	},
	OrdinaryIsExtensible: {
		url: 'https://262.ecma-international.org/11.0/#sec-ordinaryisextensible'
	},
	OrdinaryObjectCreate: {
		url: 'https://262.ecma-international.org/11.0/#sec-ordinaryobjectcreate'
	},
	OrdinaryOwnPropertyKeys: {
		url: 'https://262.ecma-international.org/11.0/#sec-ordinaryownpropertykeys'
	},
	OrdinaryPreventExtensions: {
		url: 'https://262.ecma-international.org/11.0/#sec-ordinarypreventextensions'
	},
	OrdinarySet: {
		url: 'https://262.ecma-international.org/11.0/#sec-ordinaryset'
	},
	OrdinarySetPrototypeOf: {
		url: 'https://262.ecma-international.org/11.0/#sec-ordinarysetprototypeof'
	},
	OrdinarySetWithOwnDescriptor: {
		url: 'https://262.ecma-international.org/11.0/#sec-ordinarysetwithowndescriptor'
	},
	OrdinaryToPrimitive: {
		url: 'https://262.ecma-international.org/11.0/#sec-ordinarytoprimitive'
	},
	ParseModule: {
		url: 'https://262.ecma-international.org/11.0/#sec-parsemodule'
	},
	ParseScript: {
		url: 'https://262.ecma-international.org/11.0/#sec-parse-script'
	},
	PerformEval: {
		url: 'https://262.ecma-international.org/11.0/#sec-performeval'
	},
	PerformPromiseAll: {
		url: 'https://262.ecma-international.org/11.0/#sec-performpromiseall'
	},
	PerformPromiseAllSettled: {
		url: 'https://262.ecma-international.org/11.0/#sec-performpromiseallsettled'
	},
	PerformPromiseRace: {
		url: 'https://262.ecma-international.org/11.0/#sec-performpromiserace'
	},
	PerformPromiseThen: {
		url: 'https://262.ecma-international.org/11.0/#sec-performpromisethen'
	},
	PrepareForOrdinaryCall: {
		url: 'https://262.ecma-international.org/11.0/#sec-prepareforordinarycall'
	},
	PrepareForTailCall: {
		url: 'https://262.ecma-international.org/11.0/#sec-preparefortailcall'
	},
	PromiseResolve: {
		url: 'https://262.ecma-international.org/11.0/#sec-promise-resolve'
	},
	ProxyCreate: {
		url: 'https://262.ecma-international.org/11.0/#sec-proxycreate'
	},
	PutValue: {
		url: 'https://262.ecma-international.org/11.0/#sec-putvalue'
	},
	QuoteJSONString: {
		url: 'https://262.ecma-international.org/11.0/#sec-quotejsonstring'
	},
	RawBytesToNumeric: {
		url: 'https://262.ecma-international.org/11.0/#sec-rawbytestonumeric'
	},
	'reads-bytes-from': {
		url: 'https://262.ecma-international.org/11.0/#sec-reads-bytes-from'
	},
	'reads-from': {
		url: 'https://262.ecma-international.org/11.0/#sec-reads-from'
	},
	RegExpAlloc: {
		url: 'https://262.ecma-international.org/11.0/#sec-regexpalloc'
	},
	RegExpBuiltinExec: {
		url: 'https://262.ecma-international.org/11.0/#sec-regexpbuiltinexec'
	},
	RegExpCreate: {
		url: 'https://262.ecma-international.org/11.0/#sec-regexpcreate'
	},
	RegExpExec: {
		url: 'https://262.ecma-international.org/11.0/#sec-regexpexec'
	},
	RegExpInitialize: {
		url: 'https://262.ecma-international.org/11.0/#sec-regexpinitialize'
	},
	RejectPromise: {
		url: 'https://262.ecma-international.org/11.0/#sec-rejectpromise'
	},
	RemoveWaiter: {
		url: 'https://262.ecma-international.org/11.0/#sec-removewaiter'
	},
	RemoveWaiters: {
		url: 'https://262.ecma-international.org/11.0/#sec-removewaiters'
	},
	RepeatMatcher: {
		url: 'https://262.ecma-international.org/11.0/#sec-runtime-semantics-repeatmatcher-abstract-operation'
	},
	RequireInternalSlot: {
		url: 'https://262.ecma-international.org/11.0/#sec-requireinternalslot'
	},
	RequireObjectCoercible: {
		url: 'https://262.ecma-international.org/11.0/#sec-requireobjectcoercible'
	},
	ResolveBinding: {
		url: 'https://262.ecma-international.org/11.0/#sec-resolvebinding'
	},
	ResolveThisBinding: {
		url: 'https://262.ecma-international.org/11.0/#sec-resolvethisbinding'
	},
	ReturnIfAbrupt: {
		url: 'https://262.ecma-international.org/11.0/#sec-returnifabrupt'
	},
	SameValue: {
		url: 'https://262.ecma-international.org/11.0/#sec-samevalue'
	},
	SameValueNonNumeric: {
		url: 'https://262.ecma-international.org/11.0/#sec-samevaluenonnumeric'
	},
	SameValueZero: {
		url: 'https://262.ecma-international.org/11.0/#sec-samevaluezero'
	},
	ScriptEvaluation: {
		url: 'https://262.ecma-international.org/11.0/#sec-runtime-semantics-scriptevaluation'
	},
	SecFromTime: {
		url: 'https://262.ecma-international.org/11.0/#eqn-SecFromTime'
	},
	SerializeJSONArray: {
		url: 'https://262.ecma-international.org/11.0/#sec-serializejsonarray'
	},
	SerializeJSONObject: {
		url: 'https://262.ecma-international.org/11.0/#sec-serializejsonobject'
	},
	SerializeJSONProperty: {
		url: 'https://262.ecma-international.org/11.0/#sec-serializejsonproperty'
	},
	Set: {
		url: 'https://262.ecma-international.org/11.0/#sec-set-o-p-v-throw'
	},
	SetDefaultGlobalBindings: {
		url: 'https://262.ecma-international.org/11.0/#sec-setdefaultglobalbindings'
	},
	SetFunctionLength: {
		url: 'https://262.ecma-international.org/11.0/#sec-setfunctionlength'
	},
	SetFunctionName: {
		url: 'https://262.ecma-international.org/11.0/#sec-setfunctionname'
	},
	SetImmutablePrototype: {
		url: 'https://262.ecma-international.org/11.0/#sec-set-immutable-prototype'
	},
	SetIntegrityLevel: {
		url: 'https://262.ecma-international.org/11.0/#sec-setintegritylevel'
	},
	SetRealmGlobalObject: {
		url: 'https://262.ecma-international.org/11.0/#sec-setrealmglobalobject'
	},
	SetValueInBuffer: {
		url: 'https://262.ecma-international.org/11.0/#sec-setvalueinbuffer'
	},
	SetViewValue: {
		url: 'https://262.ecma-international.org/11.0/#sec-setviewvalue'
	},
	SharedDataBlockEventSet: {
		url: 'https://262.ecma-international.org/11.0/#sec-sharedatablockeventset'
	},
	SortCompare: {
		url: 'https://262.ecma-international.org/11.0/#sec-sortcompare'
	},
	SpeciesConstructor: {
		url: 'https://262.ecma-international.org/11.0/#sec-speciesconstructor'
	},
	SplitMatch: {
		url: 'https://262.ecma-international.org/11.0/#sec-splitmatch'
	},
	'Strict Equality Comparison': {
		url: 'https://262.ecma-international.org/11.0/#sec-strict-equality-comparison'
	},
	StringCreate: {
		url: 'https://262.ecma-international.org/11.0/#sec-stringcreate'
	},
	StringGetOwnProperty: {
		url: 'https://262.ecma-international.org/11.0/#sec-stringgetownproperty'
	},
	StringPad: {
		url: 'https://262.ecma-international.org/11.0/#sec-stringpad'
	},
	StringToBigInt: {
		url: 'https://262.ecma-international.org/11.0/#sec-stringtobigint'
	},
	Suspend: {
		url: 'https://262.ecma-international.org/11.0/#sec-suspend'
	},
	SymbolDescriptiveString: {
		url: 'https://262.ecma-international.org/11.0/#sec-symboldescriptivestring'
	},
	'synchronizes-with': {
		url: 'https://262.ecma-international.org/11.0/#sec-synchronizes-with'
	},
	TestIntegrityLevel: {
		url: 'https://262.ecma-international.org/11.0/#sec-testintegritylevel'
	},
	thisBigIntValue: {
		url: 'https://262.ecma-international.org/11.0/#sec-thisbigintvalue'
	},
	thisBooleanValue: {
		url: 'https://262.ecma-international.org/11.0/#sec-thisbooleanvalue'
	},
	thisNumberValue: {
		url: 'https://262.ecma-international.org/11.0/#sec-thisnumbervalue'
	},
	thisStringValue: {
		url: 'https://262.ecma-international.org/11.0/#sec-thisstringvalue'
	},
	thisSymbolValue: {
		url: 'https://262.ecma-international.org/11.0/#sec-thissymbolvalue'
	},
	thisTimeValue: {
		url: 'https://262.ecma-international.org/11.0/#sec-thistimevalue'
	},
	ThrowCompletion: {
		url: 'https://262.ecma-international.org/11.0/#sec-throwcompletion'
	},
	TimeClip: {
		url: 'https://262.ecma-international.org/11.0/#sec-timeclip'
	},
	TimeFromYear: {
		url: 'https://262.ecma-international.org/11.0/#eqn-TimeFromYear'
	},
	TimeString: {
		url: 'https://262.ecma-international.org/11.0/#sec-timestring'
	},
	TimeWithinDay: {
		url: 'https://262.ecma-international.org/11.0/#eqn-TimeWithinDay'
	},
	TimeZoneString: {
		url: 'https://262.ecma-international.org/11.0/#sec-timezoneestring'
	},
	ToBigInt: {
		url: 'https://262.ecma-international.org/11.0/#sec-tobigint'
	},
	ToBigInt64: {
		url: 'https://262.ecma-international.org/11.0/#sec-tobigint64'
	},
	ToBigUint64: {
		url: 'https://262.ecma-international.org/11.0/#sec-tobiguint64'
	},
	ToBoolean: {
		url: 'https://262.ecma-international.org/11.0/#sec-toboolean'
	},
	ToDateString: {
		url: 'https://262.ecma-international.org/11.0/#sec-todatestring'
	},
	ToIndex: {
		url: 'https://262.ecma-international.org/11.0/#sec-toindex'
	},
	ToInt16: {
		url: 'https://262.ecma-international.org/11.0/#sec-toint16'
	},
	ToInt32: {
		url: 'https://262.ecma-international.org/11.0/#sec-toint32'
	},
	ToInt8: {
		url: 'https://262.ecma-international.org/11.0/#sec-toint8'
	},
	ToInteger: {
		url: 'https://262.ecma-international.org/11.0/#sec-tointeger'
	},
	ToLength: {
		url: 'https://262.ecma-international.org/11.0/#sec-tolength'
	},
	ToNumber: {
		url: 'https://262.ecma-international.org/11.0/#sec-tonumber'
	},
	ToNumeric: {
		url: 'https://262.ecma-international.org/11.0/#sec-tonumeric'
	},
	ToObject: {
		url: 'https://262.ecma-international.org/11.0/#sec-toobject'
	},
	ToPrimitive: {
		url: 'https://262.ecma-international.org/11.0/#sec-toprimitive'
	},
	ToPropertyDescriptor: {
		url: 'https://262.ecma-international.org/11.0/#sec-topropertydescriptor'
	},
	ToPropertyKey: {
		url: 'https://262.ecma-international.org/11.0/#sec-topropertykey'
	},
	ToString: {
		url: 'https://262.ecma-international.org/11.0/#sec-tostring'
	},
	ToUint16: {
		url: 'https://262.ecma-international.org/11.0/#sec-touint16'
	},
	ToUint32: {
		url: 'https://262.ecma-international.org/11.0/#sec-touint32'
	},
	ToUint8: {
		url: 'https://262.ecma-international.org/11.0/#sec-touint8'
	},
	ToUint8Clamp: {
		url: 'https://262.ecma-international.org/11.0/#sec-touint8clamp'
	},
	TriggerPromiseReactions: {
		url: 'https://262.ecma-international.org/11.0/#sec-triggerpromisereactions'
	},
	TrimString: {
		url: 'https://262.ecma-international.org/11.0/#sec-trimstring'
	},
	Type: {
		url: 'https://262.ecma-international.org/11.0/#sec-ecmascript-data-types-and-values'
	},
	TypedArrayCreate: {
		url: 'https://262.ecma-international.org/11.0/#typedarray-create'
	},
	TypedArraySpeciesCreate: {
		url: 'https://262.ecma-international.org/11.0/#typedarray-species-create'
	},
	UnicodeEscape: {
		url: 'https://262.ecma-international.org/11.0/#sec-unicodeescape'
	},
	UnicodeMatchProperty: {
		url: 'https://262.ecma-international.org/11.0/#sec-runtime-semantics-unicodematchproperty-p'
	},
	UnicodeMatchPropertyValue: {
		url: 'https://262.ecma-international.org/11.0/#sec-runtime-semantics-unicodematchpropertyvalue-p-v'
	},
	UpdateEmpty: {
		url: 'https://262.ecma-international.org/11.0/#sec-updateempty'
	},
	UTC: {
		url: 'https://262.ecma-international.org/11.0/#sec-utc-t'
	},
	UTF16DecodeString: {
		url: 'https://262.ecma-international.org/11.0/#sec-utf16decodestring'
	},
	UTF16DecodeSurrogatePair: {
		url: 'https://262.ecma-international.org/11.0/#sec-utf16decodesurrogatepair'
	},
	UTF16Encode: {
		url: 'https://262.ecma-international.org/11.0/#sec-utf16encode'
	},
	UTF16Encoding: {
		url: 'https://262.ecma-international.org/11.0/#sec-utf16encoding'
	},
	ValidateAndApplyPropertyDescriptor: {
		url: 'https://262.ecma-international.org/11.0/#sec-validateandapplypropertydescriptor'
	},
	ValidateAtomicAccess: {
		url: 'https://262.ecma-international.org/11.0/#sec-validateatomicaccess'
	},
	ValidateSharedIntegerTypedArray: {
		url: 'https://262.ecma-international.org/11.0/#sec-validatesharedintegertypedarray'
	},
	ValidateTypedArray: {
		url: 'https://262.ecma-international.org/11.0/#sec-validatetypedarray'
	},
	ValueOfReadEvent: {
		url: 'https://262.ecma-international.org/11.0/#sec-valueofreadevent'
	},
	WeekDay: {
		url: 'https://262.ecma-international.org/11.0/#sec-week-day'
	},
	WordCharacters: {
		url: 'https://262.ecma-international.org/11.0/#sec-runtime-semantics-wordcharacters-abstract-operation'
	},
	YearFromTime: {
		url: 'https://262.ecma-international.org/11.0/#eqn-YearFromTime'
	}
};
'use strict';

module.exports = {
	abs: {
		url: 'https://262.ecma-international.org/12.0/#eqn-abs'
	},
	'Abstract Equality Comparison': {
		url: 'https://262.ecma-international.org/12.0/#sec-abstract-equality-comparison'
	},
	'Abstract Relational Comparison': {
		url: 'https://262.ecma-international.org/12.0/#sec-abstract-relational-comparison'
	},
	AddEntriesFromIterable: {
		url: 'https://262.ecma-international.org/12.0/#sec-add-entries-from-iterable'
	},
	AddRestrictedFunctionProperties: {
		url: 'https://262.ecma-international.org/12.0/#sec-addrestrictedfunctionproperties'
	},
	AddToKeptObjects: {
		url: 'https://262.ecma-international.org/12.0/#sec-addtokeptobjects'
	},
	AddWaiter: {
		url: 'https://262.ecma-international.org/12.0/#sec-addwaiter'
	},
	AdvanceStringIndex: {
		url: 'https://262.ecma-international.org/12.0/#sec-advancestringindex'
	},
	'agent-order': {
		url: 'https://262.ecma-international.org/12.0/#sec-agent-order'
	},
	AgentCanSuspend: {
		url: 'https://262.ecma-international.org/12.0/#sec-agentcansuspend'
	},
	AgentSignifier: {
		url: 'https://262.ecma-international.org/12.0/#sec-agentsignifier'
	},
	AllocateArrayBuffer: {
		url: 'https://262.ecma-international.org/12.0/#sec-allocatearraybuffer'
	},
	AllocateSharedArrayBuffer: {
		url: 'https://262.ecma-international.org/12.0/#sec-allocatesharedarraybuffer'
	},
	AllocateTypedArray: {
		url: 'https://262.ecma-international.org/12.0/#sec-allocatetypedarray'
	},
	AllocateTypedArrayBuffer: {
		url: 'https://262.ecma-international.org/12.0/#sec-allocatetypedarraybuffer'
	},
	ApplyStringOrNumericBinaryOperator: {
		url: 'https://262.ecma-international.org/12.0/#sec-applystringornumericbinaryoperator'
	},
	ArrayCreate: {
		url: 'https://262.ecma-international.org/12.0/#sec-arraycreate'
	},
	ArraySetLength: {
		url: 'https://262.ecma-international.org/12.0/#sec-arraysetlength'
	},
	ArraySpeciesCreate: {
		url: 'https://262.ecma-international.org/12.0/#sec-arrayspeciescreate'
	},
	AsyncFromSyncIteratorContinuation: {
		url: 'https://262.ecma-international.org/12.0/#sec-asyncfromsynciteratorcontinuation'
	},
	AsyncFunctionStart: {
		url: 'https://262.ecma-international.org/12.0/#sec-async-functions-abstract-operations-async-function-start'
	},
	AsyncGeneratorEnqueue: {
		url: 'https://262.ecma-international.org/12.0/#sec-asyncgeneratorenqueue'
	},
	AsyncGeneratorReject: {
		url: 'https://262.ecma-international.org/12.0/#sec-asyncgeneratorreject'
	},
	AsyncGeneratorResolve: {
		url: 'https://262.ecma-international.org/12.0/#sec-asyncgeneratorresolve'
	},
	AsyncGeneratorResumeNext: {
		url: 'https://262.ecma-international.org/12.0/#sec-asyncgeneratorresumenext'
	},
	AsyncGeneratorStart: {
		url: 'https://262.ecma-international.org/12.0/#sec-asyncgeneratorstart'
	},
	AsyncGeneratorValidate: {
		url: 'https://262.ecma-international.org/12.0/#sec-asyncgeneratorvalidate'
	},
	AsyncGeneratorYield: {
		url: 'https://262.ecma-international.org/12.0/#sec-asyncgeneratoryield'
	},
	AsyncIteratorClose: {
		url: 'https://262.ecma-international.org/12.0/#sec-asynciteratorclose'
	},
	AtomicReadModifyWrite: {
		url: 'https://262.ecma-international.org/12.0/#sec-atomicreadmodifywrite'
	},
	Await: {
		url: 'https://262.ecma-international.org/12.0/#await'
	},
	BackreferenceMatcher: {
		url: 'https://262.ecma-international.org/12.0/#sec-backreference-matcher'
	},
	'BigInt::add': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-bigint-add'
	},
	'BigInt::bitwiseAND': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-bigint-bitwiseAND'
	},
	'BigInt::bitwiseNOT': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-bigint-bitwiseNOT'
	},
	'BigInt::bitwiseOR': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-bigint-bitwiseOR'
	},
	'BigInt::bitwiseXOR': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-bigint-bitwiseXOR'
	},
	'BigInt::divide': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-bigint-divide'
	},
	'BigInt::equal': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-bigint-equal'
	},
	'BigInt::exponentiate': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-bigint-exponentiate'
	},
	'BigInt::leftShift': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-bigint-leftShift'
	},
	'BigInt::lessThan': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-bigint-lessThan'
	},
	'BigInt::multiply': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-bigint-multiply'
	},
	'BigInt::remainder': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-bigint-remainder'
	},
	'BigInt::sameValue': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-bigint-sameValue'
	},
	'BigInt::sameValueZero': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-bigint-sameValueZero'
	},
	'BigInt::signedRightShift': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-bigint-signedRightShift'
	},
	'BigInt::subtract': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-bigint-subtract'
	},
	'BigInt::toString': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-bigint-tostring'
	},
	'BigInt::unaryMinus': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-bigint-unaryMinus'
	},
	'BigInt::unsignedRightShift': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-bigint-unsignedRightShift'
	},
	BigIntBitwiseOp: {
		url: 'https://262.ecma-international.org/12.0/#sec-bigintbitwiseop'
	},
	BinaryAnd: {
		url: 'https://262.ecma-international.org/12.0/#sec-binaryand'
	},
	BinaryOr: {
		url: 'https://262.ecma-international.org/12.0/#sec-binaryor'
	},
	BinaryXor: {
		url: 'https://262.ecma-international.org/12.0/#sec-binaryxor'
	},
	BlockDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/12.0/#sec-blockdeclarationinstantiation'
	},
	BoundFunctionCreate: {
		url: 'https://262.ecma-international.org/12.0/#sec-boundfunctioncreate'
	},
	ByteListBitwiseOp: {
		url: 'https://262.ecma-international.org/12.0/#sec-bytelistbitwiseop'
	},
	ByteListEqual: {
		url: 'https://262.ecma-international.org/12.0/#sec-bytelistequal'
	},
	Call: {
		url: 'https://262.ecma-international.org/12.0/#sec-call'
	},
	Canonicalize: {
		url: 'https://262.ecma-international.org/12.0/#sec-runtime-semantics-canonicalize-ch'
	},
	CanonicalNumericIndexString: {
		url: 'https://262.ecma-international.org/12.0/#sec-canonicalnumericindexstring'
	},
	CaseClauseIsSelected: {
		url: 'https://262.ecma-international.org/12.0/#sec-runtime-semantics-caseclauseisselected'
	},
	CharacterRange: {
		url: 'https://262.ecma-international.org/12.0/#sec-runtime-semantics-characterrange-abstract-operation'
	},
	CharacterRangeOrUnion: {
		url: 'https://262.ecma-international.org/12.0/#sec-runtime-semantics-characterrangeorunion-abstract-operation'
	},
	CharacterSetMatcher: {
		url: 'https://262.ecma-international.org/12.0/#sec-runtime-semantics-charactersetmatcher-abstract-operation'
	},
	clamp: {
		url: 'https://262.ecma-international.org/12.0/#clamping'
	},
	CleanupFinalizationRegistry: {
		url: 'https://262.ecma-international.org/12.0/#sec-cleanup-finalization-registry'
	},
	ClearKeptObjects: {
		url: 'https://262.ecma-international.org/12.0/#sec-clear-kept-objects'
	},
	CloneArrayBuffer: {
		url: 'https://262.ecma-international.org/12.0/#sec-clonearraybuffer'
	},
	CodePointAt: {
		url: 'https://262.ecma-international.org/12.0/#sec-codepointat'
	},
	CodePointsToString: {
		url: 'https://262.ecma-international.org/12.0/#sec-codepointstostring'
	},
	CompletePropertyDescriptor: {
		url: 'https://262.ecma-international.org/12.0/#sec-completepropertydescriptor'
	},
	Completion: {
		url: 'https://262.ecma-international.org/12.0/#sec-completion-record-specification-type'
	},
	ComposeWriteEventBytes: {
		url: 'https://262.ecma-international.org/12.0/#sec-composewriteeventbytes'
	},
	Construct: {
		url: 'https://262.ecma-international.org/12.0/#sec-construct'
	},
	CopyDataBlockBytes: {
		url: 'https://262.ecma-international.org/12.0/#sec-copydatablockbytes'
	},
	CopyDataProperties: {
		url: 'https://262.ecma-international.org/12.0/#sec-copydataproperties'
	},
	CreateArrayFromList: {
		url: 'https://262.ecma-international.org/12.0/#sec-createarrayfromlist'
	},
	CreateArrayIterator: {
		url: 'https://262.ecma-international.org/12.0/#sec-createarrayiterator'
	},
	CreateAsyncFromSyncIterator: {
		url: 'https://262.ecma-international.org/12.0/#sec-createasyncfromsynciterator'
	},
	CreateAsyncIteratorFromClosure: {
		url: 'https://262.ecma-international.org/12.0/#sec-createasynciteratorfromclosure'
	},
	CreateBuiltinFunction: {
		url: 'https://262.ecma-international.org/12.0/#sec-createbuiltinfunction'
	},
	CreateByteDataBlock: {
		url: 'https://262.ecma-international.org/12.0/#sec-createbytedatablock'
	},
	CreateDataProperty: {
		url: 'https://262.ecma-international.org/12.0/#sec-createdataproperty'
	},
	CreateDataPropertyOrThrow: {
		url: 'https://262.ecma-international.org/12.0/#sec-createdatapropertyorthrow'
	},
	CreateDynamicFunction: {
		url: 'https://262.ecma-international.org/12.0/#sec-createdynamicfunction'
	},
	CreateForInIterator: {
		url: 'https://262.ecma-international.org/12.0/#sec-createforiniterator'
	},
	CreateHTML: {
		url: 'https://262.ecma-international.org/12.0/#sec-createhtml'
	},
	CreateIntrinsics: {
		url: 'https://262.ecma-international.org/12.0/#sec-createintrinsics'
	},
	CreateIteratorFromClosure: {
		url: 'https://262.ecma-international.org/12.0/#sec-createiteratorfromclosure'
	},
	CreateIterResultObject: {
		url: 'https://262.ecma-international.org/12.0/#sec-createiterresultobject'
	},
	CreateListFromArrayLike: {
		url: 'https://262.ecma-international.org/12.0/#sec-createlistfromarraylike'
	},
	CreateListIteratorRecord: {
		url: 'https://262.ecma-international.org/12.0/#sec-createlistiteratorRecord'
	},
	CreateMapIterator: {
		url: 'https://262.ecma-international.org/12.0/#sec-createmapiterator'
	},
	CreateMappedArgumentsObject: {
		url: 'https://262.ecma-international.org/12.0/#sec-createmappedargumentsobject'
	},
	CreateMethodProperty: {
		url: 'https://262.ecma-international.org/12.0/#sec-createmethodproperty'
	},
	CreatePerIterationEnvironment: {
		url: 'https://262.ecma-international.org/12.0/#sec-createperiterationenvironment'
	},
	CreateRealm: {
		url: 'https://262.ecma-international.org/12.0/#sec-createrealm'
	},
	CreateRegExpStringIterator: {
		url: 'https://262.ecma-international.org/12.0/#sec-createregexpstringiterator'
	},
	CreateResolvingFunctions: {
		url: 'https://262.ecma-international.org/12.0/#sec-createresolvingfunctions'
	},
	CreateSetIterator: {
		url: 'https://262.ecma-international.org/12.0/#sec-createsetiterator'
	},
	CreateSharedByteDataBlock: {
		url: 'https://262.ecma-international.org/12.0/#sec-createsharedbytedatablock'
	},
	CreateUnmappedArgumentsObject: {
		url: 'https://262.ecma-international.org/12.0/#sec-createunmappedargumentsobject'
	},
	DateFromTime: {
		url: 'https://262.ecma-international.org/12.0/#sec-date-number'
	},
	DateString: {
		url: 'https://262.ecma-international.org/12.0/#sec-datestring'
	},
	Day: {
		url: 'https://262.ecma-international.org/12.0/#eqn-Day'
	},
	DayFromYear: {
		url: 'https://262.ecma-international.org/12.0/#eqn-DaysFromYear'
	},
	DaysInYear: {
		url: 'https://262.ecma-international.org/12.0/#eqn-DaysInYear'
	},
	DayWithinYear: {
		url: 'https://262.ecma-international.org/12.0/#eqn-DayWithinYear'
	},
	Decode: {
		url: 'https://262.ecma-international.org/12.0/#sec-decode'
	},
	DefinePropertyOrThrow: {
		url: 'https://262.ecma-international.org/12.0/#sec-definepropertyorthrow'
	},
	DeletePropertyOrThrow: {
		url: 'https://262.ecma-international.org/12.0/#sec-deletepropertyorthrow'
	},
	DetachArrayBuffer: {
		url: 'https://262.ecma-international.org/12.0/#sec-detacharraybuffer'
	},
	Encode: {
		url: 'https://262.ecma-international.org/12.0/#sec-encode'
	},
	EnterCriticalSection: {
		url: 'https://262.ecma-international.org/12.0/#sec-entercriticalsection'
	},
	EnumerableOwnPropertyNames: {
		url: 'https://262.ecma-international.org/12.0/#sec-enumerableownpropertynames'
	},
	EnumerateObjectProperties: {
		url: 'https://262.ecma-international.org/12.0/#sec-enumerate-object-properties'
	},
	EscapeRegExpPattern: {
		url: 'https://262.ecma-international.org/12.0/#sec-escaperegexppattern'
	},
	EvalDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/12.0/#sec-evaldeclarationinstantiation'
	},
	EvaluateCall: {
		url: 'https://262.ecma-international.org/12.0/#sec-evaluatecall'
	},
	EvaluateNew: {
		url: 'https://262.ecma-international.org/12.0/#sec-evaluatenew'
	},
	EvaluatePropertyAccessWithExpressionKey: {
		url: 'https://262.ecma-international.org/12.0/#sec-evaluate-property-access-with-expression-key'
	},
	EvaluatePropertyAccessWithIdentifierKey: {
		url: 'https://262.ecma-international.org/12.0/#sec-evaluate-property-access-with-identifier-key'
	},
	EvaluateStringOrNumericBinaryExpression: {
		url: 'https://262.ecma-international.org/12.0/#sec-evaluatestringornumericbinaryexpression'
	},
	EventSet: {
		url: 'https://262.ecma-international.org/12.0/#sec-event-set'
	},
	ExecuteModule: {
		url: 'https://262.ecma-international.org/12.0/#sec-source-text-module-record-execute-module'
	},
	FinishDynamicImport: {
		url: 'https://262.ecma-international.org/12.0/#sec-finishdynamicimport'
	},
	FlattenIntoArray: {
		url: 'https://262.ecma-international.org/12.0/#sec-flattenintoarray'
	},
	floor: {
		url: 'https://262.ecma-international.org/12.0/#eqn-floor'
	},
	ForBodyEvaluation: {
		url: 'https://262.ecma-international.org/12.0/#sec-forbodyevaluation'
	},
	'ForIn/OfBodyEvaluation': {
		url: 'https://262.ecma-international.org/12.0/#sec-runtime-semantics-forin-div-ofbodyevaluation-lhs-stmt-iterator-lhskind-labelset'
	},
	'ForIn/OfHeadEvaluation': {
		url: 'https://262.ecma-international.org/12.0/#sec-runtime-semantics-forinofheadevaluation'
	},
	FromPropertyDescriptor: {
		url: 'https://262.ecma-international.org/12.0/#sec-frompropertydescriptor'
	},
	FulfillPromise: {
		url: 'https://262.ecma-international.org/12.0/#sec-fulfillpromise'
	},
	FunctionDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/12.0/#sec-functiondeclarationinstantiation'
	},
	GeneratorResume: {
		url: 'https://262.ecma-international.org/12.0/#sec-generatorresume'
	},
	GeneratorResumeAbrupt: {
		url: 'https://262.ecma-international.org/12.0/#sec-generatorresumeabrupt'
	},
	GeneratorStart: {
		url: 'https://262.ecma-international.org/12.0/#sec-generatorstart'
	},
	GeneratorValidate: {
		url: 'https://262.ecma-international.org/12.0/#sec-generatorvalidate'
	},
	GeneratorYield: {
		url: 'https://262.ecma-international.org/12.0/#sec-generatoryield'
	},
	Get: {
		url: 'https://262.ecma-international.org/12.0/#sec-get-o-p'
	},
	GetActiveScriptOrModule: {
		url: 'https://262.ecma-international.org/12.0/#sec-getactivescriptormodule'
	},
	GetFunctionRealm: {
		url: 'https://262.ecma-international.org/12.0/#sec-getfunctionrealm'
	},
	GetGeneratorKind: {
		url: 'https://262.ecma-international.org/12.0/#sec-getgeneratorkind'
	},
	GetGlobalObject: {
		url: 'https://262.ecma-international.org/12.0/#sec-getglobalobject'
	},
	GetIdentifierReference: {
		url: 'https://262.ecma-international.org/12.0/#sec-getidentifierreference'
	},
	GetIterator: {
		url: 'https://262.ecma-international.org/12.0/#sec-getiterator'
	},
	GetMethod: {
		url: 'https://262.ecma-international.org/12.0/#sec-getmethod'
	},
	GetModifySetValueInBuffer: {
		url: 'https://262.ecma-international.org/12.0/#sec-getmodifysetvalueinbuffer'
	},
	GetModuleNamespace: {
		url: 'https://262.ecma-international.org/12.0/#sec-getmodulenamespace'
	},
	GetNewTarget: {
		url: 'https://262.ecma-international.org/12.0/#sec-getnewtarget'
	},
	GetOwnPropertyKeys: {
		url: 'https://262.ecma-international.org/12.0/#sec-getownpropertykeys'
	},
	GetPromiseResolve: {
		url: 'https://262.ecma-international.org/12.0/#sec-getpromiseresolve'
	},
	GetPrototypeFromConstructor: {
		url: 'https://262.ecma-international.org/12.0/#sec-getprototypefromconstructor'
	},
	GetSubstitution: {
		url: 'https://262.ecma-international.org/12.0/#sec-getsubstitution'
	},
	GetSuperConstructor: {
		url: 'https://262.ecma-international.org/12.0/#sec-getsuperconstructor'
	},
	GetTemplateObject: {
		url: 'https://262.ecma-international.org/12.0/#sec-gettemplateobject'
	},
	GetThisEnvironment: {
		url: 'https://262.ecma-international.org/12.0/#sec-getthisenvironment'
	},
	GetThisValue: {
		url: 'https://262.ecma-international.org/12.0/#sec-getthisvalue'
	},
	GetV: {
		url: 'https://262.ecma-international.org/12.0/#sec-getv'
	},
	GetValue: {
		url: 'https://262.ecma-international.org/12.0/#sec-getvalue'
	},
	GetValueFromBuffer: {
		url: 'https://262.ecma-international.org/12.0/#sec-getvaluefrombuffer'
	},
	GetViewValue: {
		url: 'https://262.ecma-international.org/12.0/#sec-getviewvalue'
	},
	GetWaiterList: {
		url: 'https://262.ecma-international.org/12.0/#sec-getwaiterlist'
	},
	GlobalDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/12.0/#sec-globaldeclarationinstantiation'
	},
	'happens-before': {
		url: 'https://262.ecma-international.org/12.0/#sec-happens-before'
	},
	HasOwnProperty: {
		url: 'https://262.ecma-international.org/12.0/#sec-hasownproperty'
	},
	HasProperty: {
		url: 'https://262.ecma-international.org/12.0/#sec-hasproperty'
	},
	'host-synchronizes-with': {
		url: 'https://262.ecma-international.org/12.0/#sec-host-synchronizes-with'
	},
	HostCallJobCallback: {
		url: 'https://262.ecma-international.org/12.0/#sec-hostcalljobcallback'
	},
	HostEnqueueFinalizationRegistryCleanupJob: {
		url: 'https://262.ecma-international.org/12.0/#sec-host-cleanup-finalization-registry'
	},
	HostEnqueuePromiseJob: {
		url: 'https://262.ecma-international.org/12.0/#sec-hostenqueuepromisejob'
	},
	HostEnsureCanCompileStrings: {
		url: 'https://262.ecma-international.org/12.0/#sec-hostensurecancompilestrings'
	},
	HostEventSet: {
		url: 'https://262.ecma-international.org/12.0/#sec-hosteventset'
	},
	HostFinalizeImportMeta: {
		url: 'https://262.ecma-international.org/12.0/#sec-hostfinalizeimportmeta'
	},
	HostGetImportMetaProperties: {
		url: 'https://262.ecma-international.org/12.0/#sec-hostgetimportmetaproperties'
	},
	HostHasSourceTextAvailable: {
		url: 'https://262.ecma-international.org/12.0/#sec-hosthassourcetextavailable'
	},
	HostImportModuleDynamically: {
		url: 'https://262.ecma-international.org/12.0/#sec-hostimportmoduledynamically'
	},
	HostMakeJobCallback: {
		url: 'https://262.ecma-international.org/12.0/#sec-hostmakejobcallback'
	},
	HostPromiseRejectionTracker: {
		url: 'https://262.ecma-international.org/12.0/#sec-host-promise-rejection-tracker'
	},
	HostResolveImportedModule: {
		url: 'https://262.ecma-international.org/12.0/#sec-hostresolveimportedmodule'
	},
	HourFromTime: {
		url: 'https://262.ecma-international.org/12.0/#eqn-HourFromTime'
	},
	IfAbruptRejectPromise: {
		url: 'https://262.ecma-international.org/12.0/#sec-ifabruptrejectpromise'
	},
	ImportedLocalNames: {
		url: 'https://262.ecma-international.org/12.0/#sec-importedlocalnames'
	},
	InitializeBoundName: {
		url: 'https://262.ecma-international.org/12.0/#sec-initializeboundname'
	},
	InitializeEnvironment: {
		url: 'https://262.ecma-international.org/12.0/#sec-source-text-module-record-initialize-environment'
	},
	InitializeHostDefinedRealm: {
		url: 'https://262.ecma-international.org/12.0/#sec-initializehostdefinedrealm'
	},
	InitializeReferencedBinding: {
		url: 'https://262.ecma-international.org/12.0/#sec-initializereferencedbinding'
	},
	InitializeTypedArrayFromArrayBuffer: {
		url: 'https://262.ecma-international.org/12.0/#sec-initializetypedarrayfromarraybuffer'
	},
	InitializeTypedArrayFromArrayLike: {
		url: 'https://262.ecma-international.org/12.0/#sec-initializetypedarrayfromarraylike'
	},
	InitializeTypedArrayFromList: {
		url: 'https://262.ecma-international.org/12.0/#sec-initializetypedarrayfromlist'
	},
	InitializeTypedArrayFromTypedArray: {
		url: 'https://262.ecma-international.org/12.0/#sec-initializetypedarrayfromtypedarray'
	},
	InLeapYear: {
		url: 'https://262.ecma-international.org/12.0/#eqn-InLeapYear'
	},
	InnerModuleEvaluation: {
		url: 'https://262.ecma-international.org/12.0/#sec-innermoduleevaluation'
	},
	InnerModuleLinking: {
		url: 'https://262.ecma-international.org/12.0/#sec-InnerModuleLinking'
	},
	InstanceofOperator: {
		url: 'https://262.ecma-international.org/12.0/#sec-instanceofoperator'
	},
	IntegerIndexedElementGet: {
		url: 'https://262.ecma-international.org/12.0/#sec-integerindexedelementget'
	},
	IntegerIndexedElementSet: {
		url: 'https://262.ecma-international.org/12.0/#sec-integerindexedelementset'
	},
	IntegerIndexedObjectCreate: {
		url: 'https://262.ecma-international.org/12.0/#sec-integerindexedobjectcreate'
	},
	InternalizeJSONProperty: {
		url: 'https://262.ecma-international.org/12.0/#sec-internalizejsonproperty'
	},
	Invoke: {
		url: 'https://262.ecma-international.org/12.0/#sec-invoke'
	},
	IsAccessorDescriptor: {
		url: 'https://262.ecma-international.org/12.0/#sec-isaccessordescriptor'
	},
	IsAnonymousFunctionDefinition: {
		url: 'https://262.ecma-international.org/12.0/#sec-isanonymousfunctiondefinition'
	},
	IsArray: {
		url: 'https://262.ecma-international.org/12.0/#sec-isarray'
	},
	IsBigIntElementType: {
		url: 'https://262.ecma-international.org/12.0/#sec-isbigintelementtype'
	},
	IsCallable: {
		url: 'https://262.ecma-international.org/12.0/#sec-iscallable'
	},
	IsCompatiblePropertyDescriptor: {
		url: 'https://262.ecma-international.org/12.0/#sec-iscompatiblepropertydescriptor'
	},
	IsConcatSpreadable: {
		url: 'https://262.ecma-international.org/12.0/#sec-isconcatspreadable'
	},
	IsConstructor: {
		url: 'https://262.ecma-international.org/12.0/#sec-isconstructor'
	},
	IsDataDescriptor: {
		url: 'https://262.ecma-international.org/12.0/#sec-isdatadescriptor'
	},
	IsDetachedBuffer: {
		url: 'https://262.ecma-international.org/12.0/#sec-isdetachedbuffer'
	},
	IsExtensible: {
		url: 'https://262.ecma-international.org/12.0/#sec-isextensible-o'
	},
	IsGenericDescriptor: {
		url: 'https://262.ecma-international.org/12.0/#sec-isgenericdescriptor'
	},
	IsInTailPosition: {
		url: 'https://262.ecma-international.org/12.0/#sec-isintailposition'
	},
	IsIntegralNumber: {
		url: 'https://262.ecma-international.org/12.0/#sec-isintegralnumber'
	},
	IsLabelledFunction: {
		url: 'https://262.ecma-international.org/12.0/#sec-islabelledfunction'
	},
	IsNoTearConfiguration: {
		url: 'https://262.ecma-international.org/12.0/#sec-isnotearconfiguration'
	},
	IsPromise: {
		url: 'https://262.ecma-international.org/12.0/#sec-ispromise'
	},
	IsPropertyKey: {
		url: 'https://262.ecma-international.org/12.0/#sec-ispropertykey'
	},
	IsPropertyReference: {
		url: 'https://262.ecma-international.org/12.0/#sec-ispropertyreference'
	},
	IsRegExp: {
		url: 'https://262.ecma-international.org/12.0/#sec-isregexp'
	},
	IsSharedArrayBuffer: {
		url: 'https://262.ecma-international.org/12.0/#sec-issharedarraybuffer'
	},
	IsStringPrefix: {
		url: 'https://262.ecma-international.org/12.0/#sec-isstringprefix'
	},
	IsSuperReference: {
		url: 'https://262.ecma-international.org/12.0/#sec-issuperreference'
	},
	IsUnclampedIntegerElementType: {
		url: 'https://262.ecma-international.org/12.0/#sec-isunclampedintegerelementtype'
	},
	IsUnresolvableReference: {
		url: 'https://262.ecma-international.org/12.0/#sec-isunresolvablereference'
	},
	IsUnsignedElementType: {
		url: 'https://262.ecma-international.org/12.0/#sec-isunsignedelementtype'
	},
	IsValidIntegerIndex: {
		url: 'https://262.ecma-international.org/12.0/#sec-isvalidintegerindex'
	},
	IsValidRegularExpressionLiteral: {
		url: 'https://262.ecma-international.org/12.0/#sec-isvalidregularexpressionliteral'
	},
	IsWordChar: {
		url: 'https://262.ecma-international.org/12.0/#sec-runtime-semantics-iswordchar-abstract-operation'
	},
	IterableToList: {
		url: 'https://262.ecma-international.org/12.0/#sec-iterabletolist'
	},
	IteratorClose: {
		url: 'https://262.ecma-international.org/12.0/#sec-iteratorclose'
	},
	IteratorComplete: {
		url: 'https://262.ecma-international.org/12.0/#sec-iteratorcomplete'
	},
	IteratorNext: {
		url: 'https://262.ecma-international.org/12.0/#sec-iteratornext'
	},
	IteratorStep: {
		url: 'https://262.ecma-international.org/12.0/#sec-iteratorstep'
	},
	IteratorValue: {
		url: 'https://262.ecma-international.org/12.0/#sec-iteratorvalue'
	},
	LeaveCriticalSection: {
		url: 'https://262.ecma-international.org/12.0/#sec-leavecriticalsection'
	},
	LengthOfArrayLike: {
		url: 'https://262.ecma-international.org/12.0/#sec-lengthofarraylike'
	},
	LocalTime: {
		url: 'https://262.ecma-international.org/12.0/#sec-localtime'
	},
	LocalTZA: {
		url: 'https://262.ecma-international.org/12.0/#sec-local-time-zone-adjustment'
	},
	LoopContinues: {
		url: 'https://262.ecma-international.org/12.0/#sec-loopcontinues'
	},
	MakeArgGetter: {
		url: 'https://262.ecma-international.org/12.0/#sec-makearggetter'
	},
	MakeArgSetter: {
		url: 'https://262.ecma-international.org/12.0/#sec-makeargsetter'
	},
	MakeBasicObject: {
		url: 'https://262.ecma-international.org/12.0/#sec-makebasicobject'
	},
	MakeClassConstructor: {
		url: 'https://262.ecma-international.org/12.0/#sec-makeclassconstructor'
	},
	MakeConstructor: {
		url: 'https://262.ecma-international.org/12.0/#sec-makeconstructor'
	},
	MakeDate: {
		url: 'https://262.ecma-international.org/12.0/#sec-makedate'
	},
	MakeDay: {
		url: 'https://262.ecma-international.org/12.0/#sec-makeday'
	},
	MakeMethod: {
		url: 'https://262.ecma-international.org/12.0/#sec-makemethod'
	},
	MakeSuperPropertyReference: {
		url: 'https://262.ecma-international.org/12.0/#sec-makesuperpropertyreference'
	},
	MakeTime: {
		url: 'https://262.ecma-international.org/12.0/#sec-maketime'
	},
	max: {
		url: 'https://262.ecma-international.org/12.0/#eqn-max'
	},
	'memory-order': {
		url: 'https://262.ecma-international.org/12.0/#sec-memory-order'
	},
	min: {
		url: 'https://262.ecma-international.org/12.0/#eqn-min'
	},
	MinFromTime: {
		url: 'https://262.ecma-international.org/12.0/#eqn-MinFromTime'
	},
	ModuleNamespaceCreate: {
		url: 'https://262.ecma-international.org/12.0/#sec-modulenamespacecreate'
	},
	modulo: {
		url: 'https://262.ecma-international.org/12.0/#eqn-modulo'
	},
	MonthFromTime: {
		url: 'https://262.ecma-international.org/12.0/#eqn-MonthFromTime'
	},
	msFromTime: {
		url: 'https://262.ecma-international.org/12.0/#eqn-msFromTime'
	},
	NewDeclarativeEnvironment: {
		url: 'https://262.ecma-international.org/12.0/#sec-newdeclarativeenvironment'
	},
	NewFunctionEnvironment: {
		url: 'https://262.ecma-international.org/12.0/#sec-newfunctionenvironment'
	},
	NewGlobalEnvironment: {
		url: 'https://262.ecma-international.org/12.0/#sec-newglobalenvironment'
	},
	NewModuleEnvironment: {
		url: 'https://262.ecma-international.org/12.0/#sec-newmoduleenvironment'
	},
	NewObjectEnvironment: {
		url: 'https://262.ecma-international.org/12.0/#sec-newobjectenvironment'
	},
	NewPromiseCapability: {
		url: 'https://262.ecma-international.org/12.0/#sec-newpromisecapability'
	},
	NewPromiseReactionJob: {
		url: 'https://262.ecma-international.org/12.0/#sec-newpromisereactionjob'
	},
	NewPromiseResolveThenableJob: {
		url: 'https://262.ecma-international.org/12.0/#sec-newpromiseresolvethenablejob'
	},
	NormalCompletion: {
		url: 'https://262.ecma-international.org/12.0/#sec-normalcompletion'
	},
	NotifyWaiter: {
		url: 'https://262.ecma-international.org/12.0/#sec-notifywaiter'
	},
	'Number::add': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-number-add'
	},
	'Number::bitwiseAND': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-number-bitwiseAND'
	},
	'Number::bitwiseNOT': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-number-bitwiseNOT'
	},
	'Number::bitwiseOR': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-number-bitwiseOR'
	},
	'Number::bitwiseXOR': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-number-bitwiseXOR'
	},
	'Number::divide': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-number-divide'
	},
	'Number::equal': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-number-equal'
	},
	'Number::exponentiate': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-number-exponentiate'
	},
	'Number::leftShift': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-number-leftShift'
	},
	'Number::lessThan': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-number-lessThan'
	},
	'Number::multiply': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-number-multiply'
	},
	'Number::remainder': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-number-remainder'
	},
	'Number::sameValue': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-number-sameValue'
	},
	'Number::sameValueZero': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-number-sameValueZero'
	},
	'Number::signedRightShift': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-number-signedRightShift'
	},
	'Number::subtract': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-number-subtract'
	},
	'Number::toString': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-number-tostring'
	},
	'Number::unaryMinus': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-number-unaryMinus'
	},
	'Number::unsignedRightShift': {
		url: 'https://262.ecma-international.org/12.0/#sec-numeric-types-number-unsignedRightShift'
	},
	NumberBitwiseOp: {
		url: 'https://262.ecma-international.org/12.0/#sec-numberbitwiseop'
	},
	NumberToBigInt: {
		url: 'https://262.ecma-international.org/12.0/#sec-numbertobigint'
	},
	NumericToRawBytes: {
		url: 'https://262.ecma-international.org/12.0/#sec-numerictorawbytes'
	},
	ObjectDefineProperties: {
		url: 'https://262.ecma-international.org/12.0/#sec-objectdefineproperties'
	},
	OrdinaryCallBindThis: {
		url: 'https://262.ecma-international.org/12.0/#sec-ordinarycallbindthis'
	},
	OrdinaryCallEvaluateBody: {
		url: 'https://262.ecma-international.org/12.0/#sec-ordinarycallevaluatebody'
	},
	OrdinaryCreateFromConstructor: {
		url: 'https://262.ecma-international.org/12.0/#sec-ordinarycreatefromconstructor'
	},
	OrdinaryDefineOwnProperty: {
		url: 'https://262.ecma-international.org/12.0/#sec-ordinarydefineownproperty'
	},
	OrdinaryDelete: {
		url: 'https://262.ecma-international.org/12.0/#sec-ordinarydelete'
	},
	OrdinaryFunctionCreate: {
		url: 'https://262.ecma-international.org/12.0/#sec-ordinaryfunctioncreate'
	},
	OrdinaryGet: {
		url: 'https://262.ecma-international.org/12.0/#sec-ordinaryget'
	},
	OrdinaryGetOwnProperty: {
		url: 'https://262.ecma-international.org/12.0/#sec-ordinarygetownproperty'
	},
	OrdinaryGetPrototypeOf: {
		url: 'https://262.ecma-international.org/12.0/#sec-ordinarygetprototypeof'
	},
	OrdinaryHasInstance: {
		url: 'https://262.ecma-international.org/12.0/#sec-ordinaryhasinstance'
	},
	OrdinaryHasProperty: {
		url: 'https://262.ecma-international.org/12.0/#sec-ordinaryhasproperty'
	},
	OrdinaryIsExtensible: {
		url: 'https://262.ecma-international.org/12.0/#sec-ordinaryisextensible'
	},
	OrdinaryObjectCreate: {
		url: 'https://262.ecma-international.org/12.0/#sec-ordinaryobjectcreate'
	},
	OrdinaryOwnPropertyKeys: {
		url: 'https://262.ecma-international.org/12.0/#sec-ordinaryownpropertykeys'
	},
	OrdinaryPreventExtensions: {
		url: 'https://262.ecma-international.org/12.0/#sec-ordinarypreventextensions'
	},
	OrdinarySet: {
		url: 'https://262.ecma-international.org/12.0/#sec-ordinaryset'
	},
	OrdinarySetPrototypeOf: {
		url: 'https://262.ecma-international.org/12.0/#sec-ordinarysetprototypeof'
	},
	OrdinarySetWithOwnDescriptor: {
		url: 'https://262.ecma-international.org/12.0/#sec-ordinarysetwithowndescriptor'
	},
	OrdinaryToPrimitive: {
		url: 'https://262.ecma-international.org/12.0/#sec-ordinarytoprimitive'
	},
	ParseModule: {
		url: 'https://262.ecma-international.org/12.0/#sec-parsemodule'
	},
	ParsePattern: {
		url: 'https://262.ecma-international.org/12.0/#sec-parsepattern'
	},
	ParseScript: {
		url: 'https://262.ecma-international.org/12.0/#sec-parse-script'
	},
	ParseText: {
		url: 'https://262.ecma-international.org/12.0/#sec-parsetext'
	},
	PerformEval: {
		url: 'https://262.ecma-international.org/12.0/#sec-performeval'
	},
	PerformPromiseAll: {
		url: 'https://262.ecma-international.org/12.0/#sec-performpromiseall'
	},
	PerformPromiseAllSettled: {
		url: 'https://262.ecma-international.org/12.0/#sec-performpromiseallsettled'
	},
	PerformPromiseAny: {
		url: 'https://262.ecma-international.org/12.0/#sec-performpromiseany'
	},
	PerformPromiseRace: {
		url: 'https://262.ecma-international.org/12.0/#sec-performpromiserace'
	},
	PerformPromiseThen: {
		url: 'https://262.ecma-international.org/12.0/#sec-performpromisethen'
	},
	PrepareForOrdinaryCall: {
		url: 'https://262.ecma-international.org/12.0/#sec-prepareforordinarycall'
	},
	PrepareForTailCall: {
		url: 'https://262.ecma-international.org/12.0/#sec-preparefortailcall'
	},
	PromiseResolve: {
		url: 'https://262.ecma-international.org/12.0/#sec-promise-resolve'
	},
	ProxyCreate: {
		url: 'https://262.ecma-international.org/12.0/#sec-proxycreate'
	},
	PutValue: {
		url: 'https://262.ecma-international.org/12.0/#sec-putvalue'
	},
	QuoteJSONString: {
		url: 'https://262.ecma-international.org/12.0/#sec-quotejsonstring'
	},
	RawBytesToNumeric: {
		url: 'https://262.ecma-international.org/12.0/#sec-rawbytestonumeric'
	},
	'reads-bytes-from': {
		url: 'https://262.ecma-international.org/12.0/#sec-reads-bytes-from'
	},
	'reads-from': {
		url: 'https://262.ecma-international.org/12.0/#sec-reads-from'
	},
	RegExpAlloc: {
		url: 'https://262.ecma-international.org/12.0/#sec-regexpalloc'
	},
	RegExpBuiltinExec: {
		url: 'https://262.ecma-international.org/12.0/#sec-regexpbuiltinexec'
	},
	RegExpCreate: {
		url: 'https://262.ecma-international.org/12.0/#sec-regexpcreate'
	},
	RegExpExec: {
		url: 'https://262.ecma-international.org/12.0/#sec-regexpexec'
	},
	RegExpInitialize: {
		url: 'https://262.ecma-international.org/12.0/#sec-regexpinitialize'
	},
	RejectPromise: {
		url: 'https://262.ecma-international.org/12.0/#sec-rejectpromise'
	},
	RemoveWaiter: {
		url: 'https://262.ecma-international.org/12.0/#sec-removewaiter'
	},
	RemoveWaiters: {
		url: 'https://262.ecma-international.org/12.0/#sec-removewaiters'
	},
	RepeatMatcher: {
		url: 'https://262.ecma-international.org/12.0/#sec-runtime-semantics-repeatmatcher-abstract-operation'
	},
	RequireInternalSlot: {
		url: 'https://262.ecma-international.org/12.0/#sec-requireinternalslot'
	},
	RequireObjectCoercible: {
		url: 'https://262.ecma-international.org/12.0/#sec-requireobjectcoercible'
	},
	ResolveBinding: {
		url: 'https://262.ecma-international.org/12.0/#sec-resolvebinding'
	},
	ResolveThisBinding: {
		url: 'https://262.ecma-international.org/12.0/#sec-resolvethisbinding'
	},
	ReturnIfAbrupt: {
		url: 'https://262.ecma-international.org/12.0/#sec-returnifabrupt'
	},
	SameValue: {
		url: 'https://262.ecma-international.org/12.0/#sec-samevalue'
	},
	SameValueNonNumeric: {
		url: 'https://262.ecma-international.org/12.0/#sec-samevaluenonnumeric'
	},
	SameValueZero: {
		url: 'https://262.ecma-international.org/12.0/#sec-samevaluezero'
	},
	ScriptEvaluation: {
		url: 'https://262.ecma-international.org/12.0/#sec-runtime-semantics-scriptevaluation'
	},
	SecFromTime: {
		url: 'https://262.ecma-international.org/12.0/#eqn-SecFromTime'
	},
	SerializeJSONArray: {
		url: 'https://262.ecma-international.org/12.0/#sec-serializejsonarray'
	},
	SerializeJSONObject: {
		url: 'https://262.ecma-international.org/12.0/#sec-serializejsonobject'
	},
	SerializeJSONProperty: {
		url: 'https://262.ecma-international.org/12.0/#sec-serializejsonproperty'
	},
	Set: {
		url: 'https://262.ecma-international.org/12.0/#sec-set-o-p-v-throw'
	},
	SetDefaultGlobalBindings: {
		url: 'https://262.ecma-international.org/12.0/#sec-setdefaultglobalbindings'
	},
	SetFunctionLength: {
		url: 'https://262.ecma-international.org/12.0/#sec-setfunctionlength'
	},
	SetFunctionName: {
		url: 'https://262.ecma-international.org/12.0/#sec-setfunctionname'
	},
	SetImmutablePrototype: {
		url: 'https://262.ecma-international.org/12.0/#sec-set-immutable-prototype'
	},
	SetIntegrityLevel: {
		url: 'https://262.ecma-international.org/12.0/#sec-setintegritylevel'
	},
	SetRealmGlobalObject: {
		url: 'https://262.ecma-international.org/12.0/#sec-setrealmglobalobject'
	},
	SetTypedArrayFromArrayLike: {
		url: 'https://262.ecma-international.org/12.0/#sec-settypedarrayfromarraylike'
	},
	SetTypedArrayFromTypedArray: {
		url: 'https://262.ecma-international.org/12.0/#sec-settypedarrayfromtypedarray'
	},
	SetValueInBuffer: {
		url: 'https://262.ecma-international.org/12.0/#sec-setvalueinbuffer'
	},
	SetViewValue: {
		url: 'https://262.ecma-international.org/12.0/#sec-setviewvalue'
	},
	SharedDataBlockEventSet: {
		url: 'https://262.ecma-international.org/12.0/#sec-sharedatablockeventset'
	},
	SortCompare: {
		url: 'https://262.ecma-international.org/12.0/#sec-sortcompare'
	},
	SpeciesConstructor: {
		url: 'https://262.ecma-international.org/12.0/#sec-speciesconstructor'
	},
	SplitMatch: {
		url: 'https://262.ecma-international.org/12.0/#sec-splitmatch'
	},
	'Strict Equality Comparison': {
		url: 'https://262.ecma-international.org/12.0/#sec-strict-equality-comparison'
	},
	StringCreate: {
		url: 'https://262.ecma-international.org/12.0/#sec-stringcreate'
	},
	StringGetOwnProperty: {
		url: 'https://262.ecma-international.org/12.0/#sec-stringgetownproperty'
	},
	StringIndexOf: {
		url: 'https://262.ecma-international.org/12.0/#sec-stringindexof'
	},
	StringPad: {
		url: 'https://262.ecma-international.org/12.0/#sec-stringpad'
	},
	StringToBigInt: {
		url: 'https://262.ecma-international.org/12.0/#sec-stringtobigint'
	},
	StringToCodePoints: {
		url: 'https://262.ecma-international.org/12.0/#sec-stringtocodepoints'
	},
	substring: {
		url: 'https://262.ecma-international.org/12.0/#substring'
	},
	SuspendAgent: {
		url: 'https://262.ecma-international.org/12.0/#sec-suspendagent'
	},
	SymbolDescriptiveString: {
		url: 'https://262.ecma-international.org/12.0/#sec-symboldescriptivestring'
	},
	'synchronizes-with': {
		url: 'https://262.ecma-international.org/12.0/#sec-synchronizes-with'
	},
	TestIntegrityLevel: {
		url: 'https://262.ecma-international.org/12.0/#sec-testintegritylevel'
	},
	thisBigIntValue: {
		url: 'https://262.ecma-international.org/12.0/#thisbigintvalue'
	},
	thisBooleanValue: {
		url: 'https://262.ecma-international.org/12.0/#thisbooleanvalue'
	},
	thisNumberValue: {
		url: 'https://262.ecma-international.org/12.0/#thisnumbervalue'
	},
	thisStringValue: {
		url: 'https://262.ecma-international.org/12.0/#thisstringvalue'
	},
	thisSymbolValue: {
		url: 'https://262.ecma-international.org/12.0/#thissymbolvalue'
	},
	thisTimeValue: {
		url: 'https://262.ecma-international.org/12.0/#thistimevalue'
	},
	ThrowCompletion: {
		url: 'https://262.ecma-international.org/12.0/#sec-throwcompletion'
	},
	TimeClip: {
		url: 'https://262.ecma-international.org/12.0/#sec-timeclip'
	},
	TimeFromYear: {
		url: 'https://262.ecma-international.org/12.0/#eqn-TimeFromYear'
	},
	TimeString: {
		url: 'https://262.ecma-international.org/12.0/#sec-timestring'
	},
	TimeWithinDay: {
		url: 'https://262.ecma-international.org/12.0/#eqn-TimeWithinDay'
	},
	TimeZoneString: {
		url: 'https://262.ecma-international.org/12.0/#sec-timezoneestring'
	},
	ToBigInt: {
		url: 'https://262.ecma-international.org/12.0/#sec-tobigint'
	},
	ToBigInt64: {
		url: 'https://262.ecma-international.org/12.0/#sec-tobigint64'
	},
	ToBigUint64: {
		url: 'https://262.ecma-international.org/12.0/#sec-tobiguint64'
	},
	ToBoolean: {
		url: 'https://262.ecma-international.org/12.0/#sec-toboolean'
	},
	ToDateString: {
		url: 'https://262.ecma-international.org/12.0/#sec-todatestring'
	},
	ToIndex: {
		url: 'https://262.ecma-international.org/12.0/#sec-toindex'
	},
	ToInt16: {
		url: 'https://262.ecma-international.org/12.0/#sec-toint16'
	},
	ToInt32: {
		url: 'https://262.ecma-international.org/12.0/#sec-toint32'
	},
	ToInt8: {
		url: 'https://262.ecma-international.org/12.0/#sec-toint8'
	},
	ToIntegerOrInfinity: {
		url: 'https://262.ecma-international.org/12.0/#sec-tointegerorinfinity'
	},
	ToLength: {
		url: 'https://262.ecma-international.org/12.0/#sec-tolength'
	},
	ToNumber: {
		url: 'https://262.ecma-international.org/12.0/#sec-tonumber'
	},
	ToNumeric: {
		url: 'https://262.ecma-international.org/12.0/#sec-tonumeric'
	},
	ToObject: {
		url: 'https://262.ecma-international.org/12.0/#sec-toobject'
	},
	ToPrimitive: {
		url: 'https://262.ecma-international.org/12.0/#sec-toprimitive'
	},
	ToPropertyDescriptor: {
		url: 'https://262.ecma-international.org/12.0/#sec-topropertydescriptor'
	},
	ToPropertyKey: {
		url: 'https://262.ecma-international.org/12.0/#sec-topropertykey'
	},
	ToString: {
		url: 'https://262.ecma-international.org/12.0/#sec-tostring'
	},
	ToUint16: {
		url: 'https://262.ecma-international.org/12.0/#sec-touint16'
	},
	ToUint32: {
		url: 'https://262.ecma-international.org/12.0/#sec-touint32'
	},
	ToUint8: {
		url: 'https://262.ecma-international.org/12.0/#sec-touint8'
	},
	ToUint8Clamp: {
		url: 'https://262.ecma-international.org/12.0/#sec-touint8clamp'
	},
	TriggerPromiseReactions: {
		url: 'https://262.ecma-international.org/12.0/#sec-triggerpromisereactions'
	},
	TrimString: {
		url: 'https://262.ecma-international.org/12.0/#sec-trimstring'
	},
	Type: {
		url: 'https://262.ecma-international.org/12.0/#sec-ecmascript-data-types-and-values'
	},
	TypedArrayCreate: {
		url: 'https://262.ecma-international.org/12.0/#typedarray-create'
	},
	TypedArraySpeciesCreate: {
		url: 'https://262.ecma-international.org/12.0/#typedarray-species-create'
	},
	UnicodeEscape: {
		url: 'https://262.ecma-international.org/12.0/#sec-unicodeescape'
	},
	UnicodeMatchProperty: {
		url: 'https://262.ecma-international.org/12.0/#sec-runtime-semantics-unicodematchproperty-p'
	},
	UnicodeMatchPropertyValue: {
		url: 'https://262.ecma-international.org/12.0/#sec-runtime-semantics-unicodematchpropertyvalue-p-v'
	},
	UpdateEmpty: {
		url: 'https://262.ecma-international.org/12.0/#sec-updateempty'
	},
	UTC: {
		url: 'https://262.ecma-international.org/12.0/#sec-utc-t'
	},
	UTF16EncodeCodePoint: {
		url: 'https://262.ecma-international.org/12.0/#sec-utf16encodecodepoint'
	},
	UTF16SurrogatePairToCodePoint: {
		url: 'https://262.ecma-international.org/12.0/#sec-utf16decodesurrogatepair'
	},
	ValidateAndApplyPropertyDescriptor: {
		url: 'https://262.ecma-international.org/12.0/#sec-validateandapplypropertydescriptor'
	},
	ValidateAtomicAccess: {
		url: 'https://262.ecma-international.org/12.0/#sec-validateatomicaccess'
	},
	ValidateIntegerTypedArray: {
		url: 'https://262.ecma-international.org/12.0/#sec-validateintegertypedarray'
	},
	ValidateTypedArray: {
		url: 'https://262.ecma-international.org/12.0/#sec-validatetypedarray'
	},
	ValueOfReadEvent: {
		url: 'https://262.ecma-international.org/12.0/#sec-valueofreadevent'
	},
	WeakRefDeref: {
		url: 'https://262.ecma-international.org/12.0/#sec-weakrefderef'
	},
	WeekDay: {
		url: 'https://262.ecma-international.org/12.0/#sec-week-day'
	},
	YearFromTime: {
		url: 'https://262.ecma-international.org/12.0/#eqn-YearFromTime'
	},
	Yield: {
		url: 'https://262.ecma-international.org/12.0/#sec-yield'
	}
};
'use strict';

module.exports = {
	abs: {
		url: 'https://262.ecma-international.org/13.0/#eqn-abs'
	},
	AddEntriesFromIterable: {
		url: 'https://262.ecma-international.org/13.0/#sec-add-entries-from-iterable'
	},
	AddRestrictedFunctionProperties: {
		url: 'https://262.ecma-international.org/13.0/#sec-addrestrictedfunctionproperties'
	},
	AddToKeptObjects: {
		url: 'https://262.ecma-international.org/13.0/#sec-addtokeptobjects'
	},
	AddWaiter: {
		url: 'https://262.ecma-international.org/13.0/#sec-addwaiter'
	},
	AdvanceStringIndex: {
		url: 'https://262.ecma-international.org/13.0/#sec-advancestringindex'
	},
	'agent-order': {
		url: 'https://262.ecma-international.org/13.0/#sec-agent-order'
	},
	AgentCanSuspend: {
		url: 'https://262.ecma-international.org/13.0/#sec-agentcansuspend'
	},
	AgentSignifier: {
		url: 'https://262.ecma-international.org/13.0/#sec-agentsignifier'
	},
	AllocateArrayBuffer: {
		url: 'https://262.ecma-international.org/13.0/#sec-allocatearraybuffer'
	},
	AllocateSharedArrayBuffer: {
		url: 'https://262.ecma-international.org/13.0/#sec-allocatesharedarraybuffer'
	},
	AllocateTypedArray: {
		url: 'https://262.ecma-international.org/13.0/#sec-allocatetypedarray'
	},
	AllocateTypedArrayBuffer: {
		url: 'https://262.ecma-international.org/13.0/#sec-allocatetypedarraybuffer'
	},
	ApplyStringOrNumericBinaryOperator: {
		url: 'https://262.ecma-international.org/13.0/#sec-applystringornumericbinaryoperator'
	},
	ArrayCreate: {
		url: 'https://262.ecma-international.org/13.0/#sec-arraycreate'
	},
	ArraySetLength: {
		url: 'https://262.ecma-international.org/13.0/#sec-arraysetlength'
	},
	ArraySpeciesCreate: {
		url: 'https://262.ecma-international.org/13.0/#sec-arrayspeciescreate'
	},
	AsyncBlockStart: {
		url: 'https://262.ecma-international.org/13.0/#sec-asyncblockstart'
	},
	AsyncFromSyncIteratorContinuation: {
		url: 'https://262.ecma-international.org/13.0/#sec-asyncfromsynciteratorcontinuation'
	},
	AsyncFunctionStart: {
		url: 'https://262.ecma-international.org/13.0/#sec-async-functions-abstract-operations-async-function-start'
	},
	AsyncGeneratorAwaitReturn: {
		url: 'https://262.ecma-international.org/13.0/#sec-asyncgeneratorawaitreturn'
	},
	AsyncGeneratorCompleteStep: {
		url: 'https://262.ecma-international.org/13.0/#sec-asyncgeneratorcompletestep'
	},
	AsyncGeneratorDrainQueue: {
		url: 'https://262.ecma-international.org/13.0/#sec-asyncgeneratordrainqueue'
	},
	AsyncGeneratorEnqueue: {
		url: 'https://262.ecma-international.org/13.0/#sec-asyncgeneratorenqueue'
	},
	AsyncGeneratorResume: {
		url: 'https://262.ecma-international.org/13.0/#sec-asyncgeneratorresume'
	},
	AsyncGeneratorStart: {
		url: 'https://262.ecma-international.org/13.0/#sec-asyncgeneratorstart'
	},
	AsyncGeneratorUnwrapYieldResumption: {
		url: 'https://262.ecma-international.org/13.0/#sec-asyncgeneratorunwrapyieldresumption'
	},
	AsyncGeneratorValidate: {
		url: 'https://262.ecma-international.org/13.0/#sec-asyncgeneratorvalidate'
	},
	AsyncGeneratorYield: {
		url: 'https://262.ecma-international.org/13.0/#sec-asyncgeneratoryield'
	},
	AsyncIteratorClose: {
		url: 'https://262.ecma-international.org/13.0/#sec-asynciteratorclose'
	},
	AsyncModuleExecutionFulfilled: {
		url: 'https://262.ecma-international.org/13.0/#sec-async-module-execution-fulfilled'
	},
	AsyncModuleExecutionRejected: {
		url: 'https://262.ecma-international.org/13.0/#sec-async-module-execution-rejected'
	},
	AtomicReadModifyWrite: {
		url: 'https://262.ecma-international.org/13.0/#sec-atomicreadmodifywrite'
	},
	Await: {
		url: 'https://262.ecma-international.org/13.0/#await'
	},
	BackreferenceMatcher: {
		url: 'https://262.ecma-international.org/13.0/#sec-backreference-matcher'
	},
	'BigInt::add': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-bigint-add'
	},
	'BigInt::bitwiseAND': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-bigint-bitwiseAND'
	},
	'BigInt::bitwiseNOT': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-bigint-bitwiseNOT'
	},
	'BigInt::bitwiseOR': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-bigint-bitwiseOR'
	},
	'BigInt::bitwiseXOR': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-bigint-bitwiseXOR'
	},
	'BigInt::divide': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-bigint-divide'
	},
	'BigInt::equal': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-bigint-equal'
	},
	'BigInt::exponentiate': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-bigint-exponentiate'
	},
	'BigInt::leftShift': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-bigint-leftShift'
	},
	'BigInt::lessThan': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-bigint-lessThan'
	},
	'BigInt::multiply': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-bigint-multiply'
	},
	'BigInt::remainder': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-bigint-remainder'
	},
	'BigInt::sameValue': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-bigint-sameValue'
	},
	'BigInt::sameValueZero': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-bigint-sameValueZero'
	},
	'BigInt::signedRightShift': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-bigint-signedRightShift'
	},
	'BigInt::subtract': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-bigint-subtract'
	},
	'BigInt::toString': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-bigint-tostring'
	},
	'BigInt::unaryMinus': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-bigint-unaryMinus'
	},
	'BigInt::unsignedRightShift': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-bigint-unsignedRightShift'
	},
	BigIntBitwiseOp: {
		url: 'https://262.ecma-international.org/13.0/#sec-bigintbitwiseop'
	},
	BinaryAnd: {
		url: 'https://262.ecma-international.org/13.0/#sec-binaryand'
	},
	BinaryOr: {
		url: 'https://262.ecma-international.org/13.0/#sec-binaryor'
	},
	BinaryXor: {
		url: 'https://262.ecma-international.org/13.0/#sec-binaryxor'
	},
	BlockDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/13.0/#sec-blockdeclarationinstantiation'
	},
	BoundFunctionCreate: {
		url: 'https://262.ecma-international.org/13.0/#sec-boundfunctioncreate'
	},
	ByteListBitwiseOp: {
		url: 'https://262.ecma-international.org/13.0/#sec-bytelistbitwiseop'
	},
	ByteListEqual: {
		url: 'https://262.ecma-international.org/13.0/#sec-bytelistequal'
	},
	Call: {
		url: 'https://262.ecma-international.org/13.0/#sec-call'
	},
	Canonicalize: {
		url: 'https://262.ecma-international.org/13.0/#sec-runtime-semantics-canonicalize-ch'
	},
	CanonicalNumericIndexString: {
		url: 'https://262.ecma-international.org/13.0/#sec-canonicalnumericindexstring'
	},
	CaseClauseIsSelected: {
		url: 'https://262.ecma-international.org/13.0/#sec-runtime-semantics-caseclauseisselected'
	},
	CharacterRange: {
		url: 'https://262.ecma-international.org/13.0/#sec-runtime-semantics-characterrange-abstract-operation'
	},
	CharacterRangeOrUnion: {
		url: 'https://262.ecma-international.org/13.0/#sec-runtime-semantics-characterrangeorunion-abstract-operation'
	},
	CharacterSetMatcher: {
		url: 'https://262.ecma-international.org/13.0/#sec-runtime-semantics-charactersetmatcher-abstract-operation'
	},
	clamp: {
		url: 'https://262.ecma-international.org/13.0/#clamping'
	},
	CleanupFinalizationRegistry: {
		url: 'https://262.ecma-international.org/13.0/#sec-cleanup-finalization-registry'
	},
	ClearKeptObjects: {
		url: 'https://262.ecma-international.org/13.0/#sec-clear-kept-objects'
	},
	CloneArrayBuffer: {
		url: 'https://262.ecma-international.org/13.0/#sec-clonearraybuffer'
	},
	CodePointAt: {
		url: 'https://262.ecma-international.org/13.0/#sec-codepointat'
	},
	CodePointsToString: {
		url: 'https://262.ecma-international.org/13.0/#sec-codepointstostring'
	},
	CompletePropertyDescriptor: {
		url: 'https://262.ecma-international.org/13.0/#sec-completepropertydescriptor'
	},
	Completion: {
		url: 'https://262.ecma-international.org/13.0/#sec-completion-ao'
	},
	ComposeWriteEventBytes: {
		url: 'https://262.ecma-international.org/13.0/#sec-composewriteeventbytes'
	},
	Construct: {
		url: 'https://262.ecma-international.org/13.0/#sec-construct'
	},
	CopyDataBlockBytes: {
		url: 'https://262.ecma-international.org/13.0/#sec-copydatablockbytes'
	},
	CopyDataProperties: {
		url: 'https://262.ecma-international.org/13.0/#sec-copydataproperties'
	},
	CreateArrayFromList: {
		url: 'https://262.ecma-international.org/13.0/#sec-createarrayfromlist'
	},
	CreateArrayIterator: {
		url: 'https://262.ecma-international.org/13.0/#sec-createarrayiterator'
	},
	CreateAsyncFromSyncIterator: {
		url: 'https://262.ecma-international.org/13.0/#sec-createasyncfromsynciterator'
	},
	CreateAsyncIteratorFromClosure: {
		url: 'https://262.ecma-international.org/13.0/#sec-createasynciteratorfromclosure'
	},
	CreateBuiltinFunction: {
		url: 'https://262.ecma-international.org/13.0/#sec-createbuiltinfunction'
	},
	CreateByteDataBlock: {
		url: 'https://262.ecma-international.org/13.0/#sec-createbytedatablock'
	},
	CreateDataProperty: {
		url: 'https://262.ecma-international.org/13.0/#sec-createdataproperty'
	},
	CreateDataPropertyOrThrow: {
		url: 'https://262.ecma-international.org/13.0/#sec-createdatapropertyorthrow'
	},
	CreateDynamicFunction: {
		url: 'https://262.ecma-international.org/13.0/#sec-createdynamicfunction'
	},
	CreateForInIterator: {
		url: 'https://262.ecma-international.org/13.0/#sec-createforiniterator'
	},
	CreateHTML: {
		url: 'https://262.ecma-international.org/13.0/#sec-createhtml'
	},
	CreateIntrinsics: {
		url: 'https://262.ecma-international.org/13.0/#sec-createintrinsics'
	},
	CreateIteratorFromClosure: {
		url: 'https://262.ecma-international.org/13.0/#sec-createiteratorfromclosure'
	},
	CreateIterResultObject: {
		url: 'https://262.ecma-international.org/13.0/#sec-createiterresultobject'
	},
	CreateListFromArrayLike: {
		url: 'https://262.ecma-international.org/13.0/#sec-createlistfromarraylike'
	},
	CreateListIteratorRecord: {
		url: 'https://262.ecma-international.org/13.0/#sec-createlistiteratorRecord'
	},
	CreateMapIterator: {
		url: 'https://262.ecma-international.org/13.0/#sec-createmapiterator'
	},
	CreateMappedArgumentsObject: {
		url: 'https://262.ecma-international.org/13.0/#sec-createmappedargumentsobject'
	},
	CreateMethodProperty: {
		url: 'https://262.ecma-international.org/13.0/#sec-createmethodproperty'
	},
	CreateNonEnumerableDataPropertyOrThrow: {
		url: 'https://262.ecma-international.org/13.0/#sec-createnonenumerabledatapropertyorthrow'
	},
	CreatePerIterationEnvironment: {
		url: 'https://262.ecma-international.org/13.0/#sec-createperiterationenvironment'
	},
	CreateRealm: {
		url: 'https://262.ecma-international.org/13.0/#sec-createrealm'
	},
	CreateRegExpStringIterator: {
		url: 'https://262.ecma-international.org/13.0/#sec-createregexpstringiterator'
	},
	CreateResolvingFunctions: {
		url: 'https://262.ecma-international.org/13.0/#sec-createresolvingfunctions'
	},
	CreateSetIterator: {
		url: 'https://262.ecma-international.org/13.0/#sec-createsetiterator'
	},
	CreateSharedByteDataBlock: {
		url: 'https://262.ecma-international.org/13.0/#sec-createsharedbytedatablock'
	},
	CreateUnmappedArgumentsObject: {
		url: 'https://262.ecma-international.org/13.0/#sec-createunmappedargumentsobject'
	},
	DateFromTime: {
		url: 'https://262.ecma-international.org/13.0/#sec-date-number'
	},
	DateString: {
		url: 'https://262.ecma-international.org/13.0/#sec-datestring'
	},
	Day: {
		url: 'https://262.ecma-international.org/13.0/#eqn-Day'
	},
	DayFromYear: {
		url: 'https://262.ecma-international.org/13.0/#eqn-DaysFromYear'
	},
	DaysInYear: {
		url: 'https://262.ecma-international.org/13.0/#eqn-DaysInYear'
	},
	DayWithinYear: {
		url: 'https://262.ecma-international.org/13.0/#eqn-DayWithinYear'
	},
	Decode: {
		url: 'https://262.ecma-international.org/13.0/#sec-decode'
	},
	DefineField: {
		url: 'https://262.ecma-international.org/13.0/#sec-definefield'
	},
	DefineMethodProperty: {
		url: 'https://262.ecma-international.org/13.0/#sec-definemethodproperty'
	},
	DefinePropertyOrThrow: {
		url: 'https://262.ecma-international.org/13.0/#sec-definepropertyorthrow'
	},
	DeletePropertyOrThrow: {
		url: 'https://262.ecma-international.org/13.0/#sec-deletepropertyorthrow'
	},
	DetachArrayBuffer: {
		url: 'https://262.ecma-international.org/13.0/#sec-detacharraybuffer'
	},
	Encode: {
		url: 'https://262.ecma-international.org/13.0/#sec-encode'
	},
	EnterCriticalSection: {
		url: 'https://262.ecma-international.org/13.0/#sec-entercriticalsection'
	},
	EnumerableOwnPropertyNames: {
		url: 'https://262.ecma-international.org/13.0/#sec-enumerableownpropertynames'
	},
	EnumerateObjectProperties: {
		url: 'https://262.ecma-international.org/13.0/#sec-enumerate-object-properties'
	},
	EscapeRegExpPattern: {
		url: 'https://262.ecma-international.org/13.0/#sec-escaperegexppattern'
	},
	EvalDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/13.0/#sec-evaldeclarationinstantiation'
	},
	EvaluateCall: {
		url: 'https://262.ecma-international.org/13.0/#sec-evaluatecall'
	},
	EvaluateNew: {
		url: 'https://262.ecma-international.org/13.0/#sec-evaluatenew'
	},
	EvaluatePropertyAccessWithExpressionKey: {
		url: 'https://262.ecma-international.org/13.0/#sec-evaluate-property-access-with-expression-key'
	},
	EvaluatePropertyAccessWithIdentifierKey: {
		url: 'https://262.ecma-international.org/13.0/#sec-evaluate-property-access-with-identifier-key'
	},
	EvaluateStringOrNumericBinaryExpression: {
		url: 'https://262.ecma-international.org/13.0/#sec-evaluatestringornumericbinaryexpression'
	},
	EventSet: {
		url: 'https://262.ecma-international.org/13.0/#sec-event-set'
	},
	ExecuteAsyncModule: {
		url: 'https://262.ecma-international.org/13.0/#sec-execute-async-module'
	},
	FinishDynamicImport: {
		url: 'https://262.ecma-international.org/13.0/#sec-finishdynamicimport'
	},
	FlattenIntoArray: {
		url: 'https://262.ecma-international.org/13.0/#sec-flattenintoarray'
	},
	floor: {
		url: 'https://262.ecma-international.org/13.0/#eqn-floor'
	},
	ForBodyEvaluation: {
		url: 'https://262.ecma-international.org/13.0/#sec-forbodyevaluation'
	},
	'ForIn/OfBodyEvaluation': {
		url: 'https://262.ecma-international.org/13.0/#sec-runtime-semantics-forin-div-ofbodyevaluation-lhs-stmt-iterator-lhskind-labelset'
	},
	'ForIn/OfHeadEvaluation': {
		url: 'https://262.ecma-international.org/13.0/#sec-runtime-semantics-forinofheadevaluation'
	},
	FromPropertyDescriptor: {
		url: 'https://262.ecma-international.org/13.0/#sec-frompropertydescriptor'
	},
	FulfillPromise: {
		url: 'https://262.ecma-international.org/13.0/#sec-fulfillpromise'
	},
	FunctionDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/13.0/#sec-functiondeclarationinstantiation'
	},
	GatherAvailableAncestors: {
		url: 'https://262.ecma-international.org/13.0/#sec-gather-available-ancestors'
	},
	GeneratorResume: {
		url: 'https://262.ecma-international.org/13.0/#sec-generatorresume'
	},
	GeneratorResumeAbrupt: {
		url: 'https://262.ecma-international.org/13.0/#sec-generatorresumeabrupt'
	},
	GeneratorStart: {
		url: 'https://262.ecma-international.org/13.0/#sec-generatorstart'
	},
	GeneratorValidate: {
		url: 'https://262.ecma-international.org/13.0/#sec-generatorvalidate'
	},
	GeneratorYield: {
		url: 'https://262.ecma-international.org/13.0/#sec-generatoryield'
	},
	Get: {
		url: 'https://262.ecma-international.org/13.0/#sec-get-o-p'
	},
	GetActiveScriptOrModule: {
		url: 'https://262.ecma-international.org/13.0/#sec-getactivescriptormodule'
	},
	GetFunctionRealm: {
		url: 'https://262.ecma-international.org/13.0/#sec-getfunctionrealm'
	},
	GetGeneratorKind: {
		url: 'https://262.ecma-international.org/13.0/#sec-getgeneratorkind'
	},
	GetGlobalObject: {
		url: 'https://262.ecma-international.org/13.0/#sec-getglobalobject'
	},
	GetIdentifierReference: {
		url: 'https://262.ecma-international.org/13.0/#sec-getidentifierreference'
	},
	GetIterator: {
		url: 'https://262.ecma-international.org/13.0/#sec-getiterator'
	},
	GetMatchIndexPair: {
		url: 'https://262.ecma-international.org/13.0/#sec-getmatchindexpair'
	},
	GetMatchString: {
		url: 'https://262.ecma-international.org/13.0/#sec-getmatchstring'
	},
	GetMethod: {
		url: 'https://262.ecma-international.org/13.0/#sec-getmethod'
	},
	GetModifySetValueInBuffer: {
		url: 'https://262.ecma-international.org/13.0/#sec-getmodifysetvalueinbuffer'
	},
	GetModuleNamespace: {
		url: 'https://262.ecma-international.org/13.0/#sec-getmodulenamespace'
	},
	GetNewTarget: {
		url: 'https://262.ecma-international.org/13.0/#sec-getnewtarget'
	},
	GetOwnPropertyKeys: {
		url: 'https://262.ecma-international.org/13.0/#sec-getownpropertykeys'
	},
	GetPromiseResolve: {
		url: 'https://262.ecma-international.org/13.0/#sec-getpromiseresolve'
	},
	GetPrototypeFromConstructor: {
		url: 'https://262.ecma-international.org/13.0/#sec-getprototypefromconstructor'
	},
	GetStringIndex: {
		url: 'https://262.ecma-international.org/13.0/#sec-getstringindex'
	},
	GetSubstitution: {
		url: 'https://262.ecma-international.org/13.0/#sec-getsubstitution'
	},
	GetSuperConstructor: {
		url: 'https://262.ecma-international.org/13.0/#sec-getsuperconstructor'
	},
	GetTemplateObject: {
		url: 'https://262.ecma-international.org/13.0/#sec-gettemplateobject'
	},
	GetThisEnvironment: {
		url: 'https://262.ecma-international.org/13.0/#sec-getthisenvironment'
	},
	GetThisValue: {
		url: 'https://262.ecma-international.org/13.0/#sec-getthisvalue'
	},
	GetV: {
		url: 'https://262.ecma-international.org/13.0/#sec-getv'
	},
	GetValue: {
		url: 'https://262.ecma-international.org/13.0/#sec-getvalue'
	},
	GetValueFromBuffer: {
		url: 'https://262.ecma-international.org/13.0/#sec-getvaluefrombuffer'
	},
	GetViewValue: {
		url: 'https://262.ecma-international.org/13.0/#sec-getviewvalue'
	},
	GetWaiterList: {
		url: 'https://262.ecma-international.org/13.0/#sec-getwaiterlist'
	},
	GlobalDeclarationInstantiation: {
		url: 'https://262.ecma-international.org/13.0/#sec-globaldeclarationinstantiation'
	},
	'happens-before': {
		url: 'https://262.ecma-international.org/13.0/#sec-happens-before'
	},
	HasOwnProperty: {
		url: 'https://262.ecma-international.org/13.0/#sec-hasownproperty'
	},
	HasProperty: {
		url: 'https://262.ecma-international.org/13.0/#sec-hasproperty'
	},
	'host-synchronizes-with': {
		url: 'https://262.ecma-international.org/13.0/#sec-host-synchronizes-with'
	},
	HostCallJobCallback: {
		url: 'https://262.ecma-international.org/13.0/#sec-hostcalljobcallback'
	},
	HostEnqueueFinalizationRegistryCleanupJob: {
		url: 'https://262.ecma-international.org/13.0/#sec-host-cleanup-finalization-registry'
	},
	HostEnqueuePromiseJob: {
		url: 'https://262.ecma-international.org/13.0/#sec-hostenqueuepromisejob'
	},
	HostEnsureCanCompileStrings: {
		url: 'https://262.ecma-international.org/13.0/#sec-hostensurecancompilestrings'
	},
	HostEventSet: {
		url: 'https://262.ecma-international.org/13.0/#sec-hosteventset'
	},
	HostFinalizeImportMeta: {
		url: 'https://262.ecma-international.org/13.0/#sec-hostfinalizeimportmeta'
	},
	HostGetImportMetaProperties: {
		url: 'https://262.ecma-international.org/13.0/#sec-hostgetimportmetaproperties'
	},
	HostHasSourceTextAvailable: {
		url: 'https://262.ecma-international.org/13.0/#sec-hosthassourcetextavailable'
	},
	HostImportModuleDynamically: {
		url: 'https://262.ecma-international.org/13.0/#sec-hostimportmoduledynamically'
	},
	HostMakeJobCallback: {
		url: 'https://262.ecma-international.org/13.0/#sec-hostmakejobcallback'
	},
	HostPromiseRejectionTracker: {
		url: 'https://262.ecma-international.org/13.0/#sec-host-promise-rejection-tracker'
	},
	HostResolveImportedModule: {
		url: 'https://262.ecma-international.org/13.0/#sec-hostresolveimportedmodule'
	},
	HourFromTime: {
		url: 'https://262.ecma-international.org/13.0/#eqn-HourFromTime'
	},
	IfAbruptCloseIterator: {
		url: 'https://262.ecma-international.org/13.0/#sec-ifabruptcloseiterator'
	},
	IfAbruptRejectPromise: {
		url: 'https://262.ecma-international.org/13.0/#sec-ifabruptrejectpromise'
	},
	ImportedLocalNames: {
		url: 'https://262.ecma-international.org/13.0/#sec-importedlocalnames'
	},
	InitializeBoundName: {
		url: 'https://262.ecma-international.org/13.0/#sec-initializeboundname'
	},
	InitializeHostDefinedRealm: {
		url: 'https://262.ecma-international.org/13.0/#sec-initializehostdefinedrealm'
	},
	InitializeInstanceElements: {
		url: 'https://262.ecma-international.org/13.0/#sec-initializeinstanceelements'
	},
	InitializeReferencedBinding: {
		url: 'https://262.ecma-international.org/13.0/#sec-initializereferencedbinding'
	},
	InitializeTypedArrayFromArrayBuffer: {
		url: 'https://262.ecma-international.org/13.0/#sec-initializetypedarrayfromarraybuffer'
	},
	InitializeTypedArrayFromArrayLike: {
		url: 'https://262.ecma-international.org/13.0/#sec-initializetypedarrayfromarraylike'
	},
	InitializeTypedArrayFromList: {
		url: 'https://262.ecma-international.org/13.0/#sec-initializetypedarrayfromlist'
	},
	InitializeTypedArrayFromTypedArray: {
		url: 'https://262.ecma-international.org/13.0/#sec-initializetypedarrayfromtypedarray'
	},
	InLeapYear: {
		url: 'https://262.ecma-international.org/13.0/#eqn-InLeapYear'
	},
	InnerModuleEvaluation: {
		url: 'https://262.ecma-international.org/13.0/#sec-innermoduleevaluation'
	},
	InnerModuleLinking: {
		url: 'https://262.ecma-international.org/13.0/#sec-InnerModuleLinking'
	},
	InstallErrorCause: {
		url: 'https://262.ecma-international.org/13.0/#sec-installerrorcause'
	},
	InstanceofOperator: {
		url: 'https://262.ecma-international.org/13.0/#sec-instanceofoperator'
	},
	IntegerIndexedElementGet: {
		url: 'https://262.ecma-international.org/13.0/#sec-integerindexedelementget'
	},
	IntegerIndexedElementSet: {
		url: 'https://262.ecma-international.org/13.0/#sec-integerindexedelementset'
	},
	IntegerIndexedObjectCreate: {
		url: 'https://262.ecma-international.org/13.0/#sec-integerindexedobjectcreate'
	},
	InternalizeJSONProperty: {
		url: 'https://262.ecma-international.org/13.0/#sec-internalizejsonproperty'
	},
	Invoke: {
		url: 'https://262.ecma-international.org/13.0/#sec-invoke'
	},
	IsAccessorDescriptor: {
		url: 'https://262.ecma-international.org/13.0/#sec-isaccessordescriptor'
	},
	IsAnonymousFunctionDefinition: {
		url: 'https://262.ecma-international.org/13.0/#sec-isanonymousfunctiondefinition'
	},
	IsArray: {
		url: 'https://262.ecma-international.org/13.0/#sec-isarray'
	},
	IsBigIntElementType: {
		url: 'https://262.ecma-international.org/13.0/#sec-isbigintelementtype'
	},
	IsCallable: {
		url: 'https://262.ecma-international.org/13.0/#sec-iscallable'
	},
	IsCompatiblePropertyDescriptor: {
		url: 'https://262.ecma-international.org/13.0/#sec-iscompatiblepropertydescriptor'
	},
	IsConcatSpreadable: {
		url: 'https://262.ecma-international.org/13.0/#sec-isconcatspreadable'
	},
	IsConstructor: {
		url: 'https://262.ecma-international.org/13.0/#sec-isconstructor'
	},
	IsDataDescriptor: {
		url: 'https://262.ecma-international.org/13.0/#sec-isdatadescriptor'
	},
	IsDetachedBuffer: {
		url: 'https://262.ecma-international.org/13.0/#sec-isdetachedbuffer'
	},
	IsExtensible: {
		url: 'https://262.ecma-international.org/13.0/#sec-isextensible-o'
	},
	IsGenericDescriptor: {
		url: 'https://262.ecma-international.org/13.0/#sec-isgenericdescriptor'
	},
	IsInTailPosition: {
		url: 'https://262.ecma-international.org/13.0/#sec-isintailposition'
	},
	IsIntegralNumber: {
		url: 'https://262.ecma-international.org/13.0/#sec-isintegralnumber'
	},
	IsLabelledFunction: {
		url: 'https://262.ecma-international.org/13.0/#sec-islabelledfunction'
	},
	IsLessThan: {
		url: 'https://262.ecma-international.org/13.0/#sec-islessthan'
	},
	IsLooselyEqual: {
		url: 'https://262.ecma-international.org/13.0/#sec-islooselyequal'
	},
	IsNoTearConfiguration: {
		url: 'https://262.ecma-international.org/13.0/#sec-isnotearconfiguration'
	},
	IsPrivateReference: {
		url: 'https://262.ecma-international.org/13.0/#sec-isprivatereference'
	},
	IsPromise: {
		url: 'https://262.ecma-international.org/13.0/#sec-ispromise'
	},
	IsPropertyKey: {
		url: 'https://262.ecma-international.org/13.0/#sec-ispropertykey'
	},
	IsPropertyReference: {
		url: 'https://262.ecma-international.org/13.0/#sec-ispropertyreference'
	},
	IsRegExp: {
		url: 'https://262.ecma-international.org/13.0/#sec-isregexp'
	},
	IsSharedArrayBuffer: {
		url: 'https://262.ecma-international.org/13.0/#sec-issharedarraybuffer'
	},
	IsStrictlyEqual: {
		url: 'https://262.ecma-international.org/13.0/#sec-isstrictlyequal'
	},
	IsStringPrefix: {
		url: 'https://262.ecma-international.org/13.0/#sec-isstringprefix'
	},
	IsStringWellFormedUnicode: {
		url: 'https://262.ecma-international.org/13.0/#sec-isstringwellformedunicode'
	},
	IsSuperReference: {
		url: 'https://262.ecma-international.org/13.0/#sec-issuperreference'
	},
	IsUnclampedIntegerElementType: {
		url: 'https://262.ecma-international.org/13.0/#sec-isunclampedintegerelementtype'
	},
	IsUnresolvableReference: {
		url: 'https://262.ecma-international.org/13.0/#sec-isunresolvablereference'
	},
	IsUnsignedElementType: {
		url: 'https://262.ecma-international.org/13.0/#sec-isunsignedelementtype'
	},
	IsValidIntegerIndex: {
		url: 'https://262.ecma-international.org/13.0/#sec-isvalidintegerindex'
	},
	IsValidRegularExpressionLiteral: {
		url: 'https://262.ecma-international.org/13.0/#sec-isvalidregularexpressionliteral'
	},
	IsWordChar: {
		url: 'https://262.ecma-international.org/13.0/#sec-runtime-semantics-iswordchar-abstract-operation'
	},
	IterableToList: {
		url: 'https://262.ecma-international.org/13.0/#sec-iterabletolist'
	},
	IteratorClose: {
		url: 'https://262.ecma-international.org/13.0/#sec-iteratorclose'
	},
	IteratorComplete: {
		url: 'https://262.ecma-international.org/13.0/#sec-iteratorcomplete'
	},
	IteratorNext: {
		url: 'https://262.ecma-international.org/13.0/#sec-iteratornext'
	},
	IteratorStep: {
		url: 'https://262.ecma-international.org/13.0/#sec-iteratorstep'
	},
	IteratorValue: {
		url: 'https://262.ecma-international.org/13.0/#sec-iteratorvalue'
	},
	LeaveCriticalSection: {
		url: 'https://262.ecma-international.org/13.0/#sec-leavecriticalsection'
	},
	LengthOfArrayLike: {
		url: 'https://262.ecma-international.org/13.0/#sec-lengthofarraylike'
	},
	LocalTime: {
		url: 'https://262.ecma-international.org/13.0/#sec-localtime'
	},
	LocalTZA: {
		url: 'https://262.ecma-international.org/13.0/#sec-local-time-zone-adjustment'
	},
	LoopContinues: {
		url: 'https://262.ecma-international.org/13.0/#sec-loopcontinues'
	},
	MakeArgGetter: {
		url: 'https://262.ecma-international.org/13.0/#sec-makearggetter'
	},
	MakeArgSetter: {
		url: 'https://262.ecma-international.org/13.0/#sec-makeargsetter'
	},
	MakeBasicObject: {
		url: 'https://262.ecma-international.org/13.0/#sec-makebasicobject'
	},
	MakeClassConstructor: {
		url: 'https://262.ecma-international.org/13.0/#sec-makeclassconstructor'
	},
	MakeConstructor: {
		url: 'https://262.ecma-international.org/13.0/#sec-makeconstructor'
	},
	MakeDate: {
		url: 'https://262.ecma-international.org/13.0/#sec-makedate'
	},
	MakeDay: {
		url: 'https://262.ecma-international.org/13.0/#sec-makeday'
	},
	MakeMatchIndicesIndexPairArray: {
		url: 'https://262.ecma-international.org/13.0/#sec-makematchindicesindexpairarray'
	},
	MakeMethod: {
		url: 'https://262.ecma-international.org/13.0/#sec-makemethod'
	},
	MakePrivateReference: {
		url: 'https://262.ecma-international.org/13.0/#sec-makeprivatereference'
	},
	MakeSuperPropertyReference: {
		url: 'https://262.ecma-international.org/13.0/#sec-makesuperpropertyreference'
	},
	MakeTime: {
		url: 'https://262.ecma-international.org/13.0/#sec-maketime'
	},
	max: {
		url: 'https://262.ecma-international.org/13.0/#eqn-max'
	},
	'memory-order': {
		url: 'https://262.ecma-international.org/13.0/#sec-memory-order'
	},
	min: {
		url: 'https://262.ecma-international.org/13.0/#eqn-min'
	},
	MinFromTime: {
		url: 'https://262.ecma-international.org/13.0/#eqn-MinFromTime'
	},
	ModuleNamespaceCreate: {
		url: 'https://262.ecma-international.org/13.0/#sec-modulenamespacecreate'
	},
	modulo: {
		url: 'https://262.ecma-international.org/13.0/#eqn-modulo'
	},
	MonthFromTime: {
		url: 'https://262.ecma-international.org/13.0/#eqn-MonthFromTime'
	},
	msFromTime: {
		url: 'https://262.ecma-international.org/13.0/#eqn-msFromTime'
	},
	NewDeclarativeEnvironment: {
		url: 'https://262.ecma-international.org/13.0/#sec-newdeclarativeenvironment'
	},
	NewFunctionEnvironment: {
		url: 'https://262.ecma-international.org/13.0/#sec-newfunctionenvironment'
	},
	NewGlobalEnvironment: {
		url: 'https://262.ecma-international.org/13.0/#sec-newglobalenvironment'
	},
	NewModuleEnvironment: {
		url: 'https://262.ecma-international.org/13.0/#sec-newmoduleenvironment'
	},
	NewObjectEnvironment: {
		url: 'https://262.ecma-international.org/13.0/#sec-newobjectenvironment'
	},
	NewPrivateEnvironment: {
		url: 'https://262.ecma-international.org/13.0/#sec-newprivateenvironment'
	},
	NewPromiseCapability: {
		url: 'https://262.ecma-international.org/13.0/#sec-newpromisecapability'
	},
	NewPromiseReactionJob: {
		url: 'https://262.ecma-international.org/13.0/#sec-newpromisereactionjob'
	},
	NewPromiseResolveThenableJob: {
		url: 'https://262.ecma-international.org/13.0/#sec-newpromiseresolvethenablejob'
	},
	NormalCompletion: {
		url: 'https://262.ecma-international.org/13.0/#sec-normalcompletion'
	},
	NotifyWaiter: {
		url: 'https://262.ecma-international.org/13.0/#sec-notifywaiter'
	},
	'Number::add': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-number-add'
	},
	'Number::bitwiseAND': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-number-bitwiseAND'
	},
	'Number::bitwiseNOT': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-number-bitwiseNOT'
	},
	'Number::bitwiseOR': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-number-bitwiseOR'
	},
	'Number::bitwiseXOR': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-number-bitwiseXOR'
	},
	'Number::divide': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-number-divide'
	},
	'Number::equal': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-number-equal'
	},
	'Number::exponentiate': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-number-exponentiate'
	},
	'Number::leftShift': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-number-leftShift'
	},
	'Number::lessThan': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-number-lessThan'
	},
	'Number::multiply': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-number-multiply'
	},
	'Number::remainder': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-number-remainder'
	},
	'Number::sameValue': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-number-sameValue'
	},
	'Number::sameValueZero': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-number-sameValueZero'
	},
	'Number::signedRightShift': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-number-signedRightShift'
	},
	'Number::subtract': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-number-subtract'
	},
	'Number::toString': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-number-tostring'
	},
	'Number::unaryMinus': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-number-unaryMinus'
	},
	'Number::unsignedRightShift': {
		url: 'https://262.ecma-international.org/13.0/#sec-numeric-types-number-unsignedRightShift'
	},
	NumberBitwiseOp: {
		url: 'https://262.ecma-international.org/13.0/#sec-numberbitwiseop'
	},
	NumberToBigInt: {
		url: 'https://262.ecma-international.org/13.0/#sec-numbertobigint'
	},
	NumericToRawBytes: {
		url: 'https://262.ecma-international.org/13.0/#sec-numerictorawbytes'
	},
	ObjectDefineProperties: {
		url: 'https://262.ecma-international.org/13.0/#sec-objectdefineproperties'
	},
	OrdinaryCallBindThis: {
		url: 'https://262.ecma-international.org/13.0/#sec-ordinarycallbindthis'
	},
	OrdinaryCallEvaluateBody: {
		url: 'https://262.ecma-international.org/13.0/#sec-ordinarycallevaluatebody'
	},
	OrdinaryCreateFromConstructor: {
		url: 'https://262.ecma-international.org/13.0/#sec-ordinarycreatefromconstructor'
	},
	OrdinaryDefineOwnProperty: {
		url: 'https://262.ecma-international.org/13.0/#sec-ordinarydefineownproperty'
	},
	OrdinaryDelete: {
		url: 'https://262.ecma-international.org/13.0/#sec-ordinarydelete'
	},
	OrdinaryFunctionCreate: {
		url: 'https://262.ecma-international.org/13.0/#sec-ordinaryfunctioncreate'
	},
	OrdinaryGet: {
		url: 'https://262.ecma-international.org/13.0/#sec-ordinaryget'
	},
	OrdinaryGetOwnProperty: {
		url: 'https://262.ecma-international.org/13.0/#sec-ordinarygetownproperty'
	},
	OrdinaryGetPrototypeOf: {
		url: 'https://262.ecma-international.org/13.0/#sec-ordinarygetprototypeof'
	},
	OrdinaryHasInstance: {
		url: 'https://262.ecma-international.org/13.0/#sec-ordinaryhasinstance'
	},
	OrdinaryHasProperty: {
		url: 'https://262.ecma-international.org/13.0/#sec-ordinaryhasproperty'
	},
	OrdinaryIsExtensible: {
		url: 'https://262.ecma-international.org/13.0/#sec-ordinaryisextensible'
	},
	OrdinaryObjectCreate: {
		url: 'https://262.ecma-international.org/13.0/#sec-ordinaryobjectcreate'
	},
	OrdinaryOwnPropertyKeys: {
		url: 'https://262.ecma-international.org/13.0/#sec-ordinaryownpropertykeys'
	},
	OrdinaryPreventExtensions: {
		url: 'https://262.ecma-international.org/13.0/#sec-ordinarypreventextensions'
	},
	OrdinarySet: {
		url: 'https://262.ecma-international.org/13.0/#sec-ordinaryset'
	},
	OrdinarySetPrototypeOf: {
		url: 'https://262.ecma-international.org/13.0/#sec-ordinarysetprototypeof'
	},
	OrdinarySetWithOwnDescriptor: {
		url: 'https://262.ecma-international.org/13.0/#sec-ordinarysetwithowndescriptor'
	},
	OrdinaryToPrimitive: {
		url: 'https://262.ecma-international.org/13.0/#sec-ordinarytoprimitive'
	},
	ParseModule: {
		url: 'https://262.ecma-international.org/13.0/#sec-parsemodule'
	},
	ParsePattern: {
		url: 'https://262.ecma-international.org/13.0/#sec-parsepattern'
	},
	ParseScript: {
		url: 'https://262.ecma-international.org/13.0/#sec-parse-script'
	},
	ParseText: {
		url: 'https://262.ecma-international.org/13.0/#sec-parsetext'
	},
	PerformEval: {
		url: 'https://262.ecma-international.org/13.0/#sec-performeval'
	},
	PerformPromiseAll: {
		url: 'https://262.ecma-international.org/13.0/#sec-performpromiseall'
	},
	PerformPromiseAllSettled: {
		url: 'https://262.ecma-international.org/13.0/#sec-performpromiseallsettled'
	},
	PerformPromiseAny: {
		url: 'https://262.ecma-international.org/13.0/#sec-performpromiseany'
	},
	PerformPromiseRace: {
		url: 'https://262.ecma-international.org/13.0/#sec-performpromiserace'
	},
	PerformPromiseThen: {
		url: 'https://262.ecma-international.org/13.0/#sec-performpromisethen'
	},
	PrepareForOrdinaryCall: {
		url: 'https://262.ecma-international.org/13.0/#sec-prepareforordinarycall'
	},
	PrepareForTailCall: {
		url: 'https://262.ecma-international.org/13.0/#sec-preparefortailcall'
	},
	PrivateElementFind: {
		url: 'https://262.ecma-international.org/13.0/#sec-privateelementfind'
	},
	PrivateFieldAdd: {
		url: 'https://262.ecma-international.org/13.0/#sec-privatefieldadd'
	},
	PrivateGet: {
		url: 'https://262.ecma-international.org/13.0/#sec-privateget'
	},
	PrivateMethodOrAccessorAdd: {
		url: 'https://262.ecma-international.org/13.0/#sec-privatemethodoraccessoradd'
	},
	PrivateSet: {
		url: 'https://262.ecma-international.org/13.0/#sec-privateset'
	},
	PromiseResolve: {
		url: 'https://262.ecma-international.org/13.0/#sec-promise-resolve'
	},
	ProxyCreate: {
		url: 'https://262.ecma-international.org/13.0/#sec-proxycreate'
	},
	PutValue: {
		url: 'https://262.ecma-international.org/13.0/#sec-putvalue'
	},
	QuoteJSONString: {
		url: 'https://262.ecma-international.org/13.0/#sec-quotejsonstring'
	},
	RawBytesToNumeric: {
		url: 'https://262.ecma-international.org/13.0/#sec-rawbytestonumeric'
	},
	'reads-bytes-from': {
		url: 'https://262.ecma-international.org/13.0/#sec-reads-bytes-from'
	},
	'reads-from': {
		url: 'https://262.ecma-international.org/13.0/#sec-reads-from'
	},
	RegExpAlloc: {
		url: 'https://262.ecma-international.org/13.0/#sec-regexpalloc'
	},
	RegExpBuiltinExec: {
		url: 'https://262.ecma-international.org/13.0/#sec-regexpbuiltinexec'
	},
	RegExpCreate: {
		url: 'https://262.ecma-international.org/13.0/#sec-regexpcreate'
	},
	RegExpExec: {
		url: 'https://262.ecma-international.org/13.0/#sec-regexpexec'
	},
	RegExpHasFlag: {
		url: 'https://262.ecma-international.org/13.0/#sec-regexphasflag'
	},
	RegExpInitialize: {
		url: 'https://262.ecma-international.org/13.0/#sec-regexpinitialize'
	},
	RejectPromise: {
		url: 'https://262.ecma-international.org/13.0/#sec-rejectpromise'
	},
	RemoveWaiter: {
		url: 'https://262.ecma-international.org/13.0/#sec-removewaiter'
	},
	RemoveWaiters: {
		url: 'https://262.ecma-international.org/13.0/#sec-removewaiters'
	},
	RepeatMatcher: {
		url: 'https://262.ecma-international.org/13.0/#sec-runtime-semantics-repeatmatcher-abstract-operation'
	},
	RequireInternalSlot: {
		url: 'https://262.ecma-international.org/13.0/#sec-requireinternalslot'
	},
	RequireObjectCoercible: {
		url: 'https://262.ecma-international.org/13.0/#sec-requireobjectcoercible'
	},
	ResolveBinding: {
		url: 'https://262.ecma-international.org/13.0/#sec-resolvebinding'
	},
	ResolvePrivateIdentifier: {
		url: 'https://262.ecma-international.org/13.0/#sec-resolve-private-identifier'
	},
	ResolveThisBinding: {
		url: 'https://262.ecma-international.org/13.0/#sec-resolvethisbinding'
	},
	ReturnIfAbrupt: {
		url: 'https://262.ecma-international.org/13.0/#sec-returnifabrupt'
	},
	RoundMVResult: {
		url: 'https://262.ecma-international.org/13.0/#sec-roundmvresult'
	},
	SameValue: {
		url: 'https://262.ecma-international.org/13.0/#sec-samevalue'
	},
	SameValueNonNumeric: {
		url: 'https://262.ecma-international.org/13.0/#sec-samevaluenonnumeric'
	},
	SameValueZero: {
		url: 'https://262.ecma-international.org/13.0/#sec-samevaluezero'
	},
	ScriptEvaluation: {
		url: 'https://262.ecma-international.org/13.0/#sec-runtime-semantics-scriptevaluation'
	},
	SecFromTime: {
		url: 'https://262.ecma-international.org/13.0/#eqn-SecFromTime'
	},
	SerializeJSONArray: {
		url: 'https://262.ecma-international.org/13.0/#sec-serializejsonarray'
	},
	SerializeJSONObject: {
		url: 'https://262.ecma-international.org/13.0/#sec-serializejsonobject'
	},
	SerializeJSONProperty: {
		url: 'https://262.ecma-international.org/13.0/#sec-serializejsonproperty'
	},
	Set: {
		url: 'https://262.ecma-international.org/13.0/#sec-set-o-p-v-throw'
	},
	SetDefaultGlobalBindings: {
		url: 'https://262.ecma-international.org/13.0/#sec-setdefaultglobalbindings'
	},
	SetFunctionLength: {
		url: 'https://262.ecma-international.org/13.0/#sec-setfunctionlength'
	},
	SetFunctionName: {
		url: 'https://262.ecma-international.org/13.0/#sec-setfunctionname'
	},
	SetImmutablePrototype: {
		url: 'https://262.ecma-international.org/13.0/#sec-set-immutable-prototype'
	},
	SetIntegrityLevel: {
		url: 'https://262.ecma-international.org/13.0/#sec-setintegritylevel'
	},
	SetRealmGlobalObject: {
		url: 'https://262.ecma-international.org/13.0/#sec-setrealmglobalobject'
	},
	SetTypedArrayFromArrayLike: {
		url: 'https://262.ecma-international.org/13.0/#sec-settypedarrayfromarraylike'
	},
	SetTypedArrayFromTypedArray: {
		url: 'https://262.ecma-international.org/13.0/#sec-settypedarrayfromtypedarray'
	},
	SetValueInBuffer: {
		url: 'https://262.ecma-international.org/13.0/#sec-setvalueinbuffer'
	},
	SetViewValue: {
		url: 'https://262.ecma-international.org/13.0/#sec-setviewvalue'
	},
	SharedDataBlockEventSet: {
		url: 'https://262.ecma-international.org/13.0/#sec-sharedatablockeventset'
	},
	SortIndexedProperties: {
		url: 'https://262.ecma-international.org/13.0/#sec-sortindexedproperties'
	},
	SpeciesConstructor: {
		url: 'https://262.ecma-international.org/13.0/#sec-speciesconstructor'
	},
	StringCreate: {
		url: 'https://262.ecma-international.org/13.0/#sec-stringcreate'
	},
	StringGetOwnProperty: {
		url: 'https://262.ecma-international.org/13.0/#sec-stringgetownproperty'
	},
	StringIndexOf: {
		url: 'https://262.ecma-international.org/13.0/#sec-stringindexof'
	},
	StringPad: {
		url: 'https://262.ecma-international.org/13.0/#sec-stringpad'
	},
	StringToBigInt: {
		url: 'https://262.ecma-international.org/13.0/#sec-stringtobigint'
	},
	StringToCodePoints: {
		url: 'https://262.ecma-international.org/13.0/#sec-stringtocodepoints'
	},
	StringToNumber: {
		url: 'https://262.ecma-international.org/13.0/#sec-stringtonumber'
	},
	substring: {
		url: 'https://262.ecma-international.org/13.0/#substring'
	},
	SuspendAgent: {
		url: 'https://262.ecma-international.org/13.0/#sec-suspendagent'
	},
	SymbolDescriptiveString: {
		url: 'https://262.ecma-international.org/13.0/#sec-symboldescriptivestring'
	},
	'synchronizes-with': {
		url: 'https://262.ecma-international.org/13.0/#sec-synchronizes-with'
	},
	TestIntegrityLevel: {
		url: 'https://262.ecma-international.org/13.0/#sec-testintegritylevel'
	},
	thisBigIntValue: {
		url: 'https://262.ecma-international.org/13.0/#thisbigintvalue'
	},
	thisBooleanValue: {
		url: 'https://262.ecma-international.org/13.0/#thisbooleanvalue'
	},
	thisNumberValue: {
		url: 'https://262.ecma-international.org/13.0/#thisnumbervalue'
	},
	thisStringValue: {
		url: 'https://262.ecma-international.org/13.0/#thisstringvalue'
	},
	thisSymbolValue: {
		url: 'https://262.ecma-international.org/13.0/#thissymbolvalue'
	},
	thisTimeValue: {
		url: 'https://262.ecma-international.org/13.0/#thistimevalue'
	},
	ThrowCompletion: {
		url: 'https://262.ecma-international.org/13.0/#sec-throwcompletion'
	},
	TimeClip: {
		url: 'https://262.ecma-international.org/13.0/#sec-timeclip'
	},
	TimeFromYear: {
		url: 'https://262.ecma-international.org/13.0/#eqn-TimeFromYear'
	},
	TimeString: {
		url: 'https://262.ecma-international.org/13.0/#sec-timestring'
	},
	TimeWithinDay: {
		url: 'https://262.ecma-international.org/13.0/#eqn-TimeWithinDay'
	},
	TimeZoneString: {
		url: 'https://262.ecma-international.org/13.0/#sec-timezoneestring'
	},
	ToBigInt: {
		url: 'https://262.ecma-international.org/13.0/#sec-tobigint'
	},
	ToBigInt64: {
		url: 'https://262.ecma-international.org/13.0/#sec-tobigint64'
	},
	ToBigUint64: {
		url: 'https://262.ecma-international.org/13.0/#sec-tobiguint64'
	},
	ToBoolean: {
		url: 'https://262.ecma-international.org/13.0/#sec-toboolean'
	},
	ToDateString: {
		url: 'https://262.ecma-international.org/13.0/#sec-todatestring'
	},
	ToIndex: {
		url: 'https://262.ecma-international.org/13.0/#sec-toindex'
	},
	ToInt16: {
		url: 'https://262.ecma-international.org/13.0/#sec-toint16'
	},
	ToInt32: {
		url: 'https://262.ecma-international.org/13.0/#sec-toint32'
	},
	ToInt8: {
		url: 'https://262.ecma-international.org/13.0/#sec-toint8'
	},
	ToIntegerOrInfinity: {
		url: 'https://262.ecma-international.org/13.0/#sec-tointegerorinfinity'
	},
	ToLength: {
		url: 'https://262.ecma-international.org/13.0/#sec-tolength'
	},
	ToNumber: {
		url: 'https://262.ecma-international.org/13.0/#sec-tonumber'
	},
	ToNumeric: {
		url: 'https://262.ecma-international.org/13.0/#sec-tonumeric'
	},
	ToObject: {
		url: 'https://262.ecma-international.org/13.0/#sec-toobject'
	},
	ToPrimitive: {
		url: 'https://262.ecma-international.org/13.0/#sec-toprimitive'
	},
	ToPropertyDescriptor: {
		url: 'https://262.ecma-international.org/13.0/#sec-topropertydescriptor'
	},
	ToPropertyKey: {
		url: 'https://262.ecma-international.org/13.0/#sec-topropertykey'
	},
	ToString: {
		url: 'https://262.ecma-international.org/13.0/#sec-tostring'
	},
	ToUint16: {
		url: 'https://262.ecma-international.org/13.0/#sec-touint16'
	},
	ToUint32: {
		url: 'https://262.ecma-international.org/13.0/#sec-touint32'
	},
	ToUint8: {
		url: 'https://262.ecma-international.org/13.0/#sec-touint8'
	},
	ToUint8Clamp: {
		url: 'https://262.ecma-international.org/13.0/#sec-touint8clamp'
	},
	ToZeroPaddedDecimalString: {
		url: 'https://262.ecma-international.org/13.0/#sec-tozeropaddeddecimalstring'
	},
	TriggerPromiseReactions: {
		url: 'https://262.ecma-international.org/13.0/#sec-triggerpromisereactions'
	},
	TrimString: {
		url: 'https://262.ecma-international.org/13.0/#sec-trimstring'
	},
	Type: {
		url: 'https://262.ecma-international.org/13.0/#sec-ecmascript-data-types-and-values'
	},
	TypedArrayCreate: {
		url: 'https://262.ecma-international.org/13.0/#typedarray-create'
	},
	TypedArrayElementSize: {
		url: 'https://262.ecma-international.org/13.0/#sec-typedarrayelementsize'
	},
	TypedArrayElementType: {
		url: 'https://262.ecma-international.org/13.0/#sec-typedarrayelementtype'
	},
	TypedArraySpeciesCreate: {
		url: 'https://262.ecma-international.org/13.0/#typedarray-species-create'
	},
	UnicodeEscape: {
		url: 'https://262.ecma-international.org/13.0/#sec-unicodeescape'
	},
	UnicodeMatchProperty: {
		url: 'https://262.ecma-international.org/13.0/#sec-runtime-semantics-unicodematchproperty-p'
	},
	UnicodeMatchPropertyValue: {
		url: 'https://262.ecma-international.org/13.0/#sec-runtime-semantics-unicodematchpropertyvalue-p-v'
	},
	UpdateEmpty: {
		url: 'https://262.ecma-international.org/13.0/#sec-updateempty'
	},
	UTC: {
		url: 'https://262.ecma-international.org/13.0/#sec-utc-t'
	},
	UTF16EncodeCodePoint: {
		url: 'https://262.ecma-international.org/13.0/#sec-utf16encodecodepoint'
	},
	UTF16SurrogatePairToCodePoint: {
		url: 'https://262.ecma-international.org/13.0/#sec-utf16decodesurrogatepair'
	},
	ValidateAndApplyPropertyDescriptor: {
		url: 'https://262.ecma-international.org/13.0/#sec-validateandapplypropertydescriptor'
	},
	ValidateAtomicAccess: {
		url: 'https://262.ecma-international.org/13.0/#sec-validateatomicaccess'
	},
	ValidateIntegerTypedArray: {
		url: 'https://262.ecma-international.org/13.0/#sec-validateintegertypedarray'
	},
	ValidateTypedArray: {
		url: 'https://262.ecma-international.org/13.0/#sec-validatetypedarray'
	},
	ValueOfReadEvent: {
		url: 'https://262.ecma-international.org/13.0/#sec-valueofreadevent'
	},
	WeakRefDeref: {
		url: 'https://262.ecma-international.org/13.0/#sec-weakrefderef'
	},
	WeekDay: {
		url: 'https://262.ecma-international.org/13.0/#sec-week-day'
	},
	YearFromTime: {
		url: 'https://262.ecma-international.org/13.0/#eqn-YearFromTime'
	},
	Yield: {
		url: 'https://262.ecma-international.org/13.0/#sec-yield'
	}
};
'use strict';

var hasPropertyDescriptors = require('has-property-descriptors');

var GetIntrinsic = require('get-intrinsic');

var $defineProperty = hasPropertyDescriptors() && GetIntrinsic('%Object.defineProperty%', true);

var hasArrayLengthDefineBug = hasPropertyDescriptors.hasArrayLengthDefineBug();

// eslint-disable-next-line global-require
var isArray = hasArrayLengthDefineBug && require('../helpers/IsArray');

var callBound = require('call-bind/callBound');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');

// eslint-disable-next-line max-params
module.exports = function DefineOwnProperty(IsDataDescriptor, SameValue, FromPropertyDescriptor, O, P, desc) {
	if (!$defineProperty) {
		if (!IsDataDescriptor(desc)) {
			// ES3 does not support getters/setters
			return false;
		}
		if (!desc['[[Configurable]]'] || !desc['[[Writable]]']) {
			return false;
		}

		// fallback for ES3
		if (P in O && $isEnumerable(O, P) !== !!desc['[[Enumerable]]']) {
			// a non-enumerable existing property
			return false;
		}

		// property does not exist at all, or exists but is enumerable
		var V = desc['[[Value]]'];
		// eslint-disable-next-line no-param-reassign
		O[P] = V; // will use [[Define]]
		return SameValue(O[P], V);
	}
	if (
		hasArrayLengthDefineBug
		&& P === 'length'
		&& '[[Value]]' in desc
		&& isArray(O)
		&& O.length !== desc['[[Value]]']
	) {
		// eslint-disable-next-line no-param-reassign
		O.length = desc['[[Value]]'];
		return O.length === desc['[[Value]]'];
	}

	$defineProperty(O, P, FromPropertyDescriptor(desc));
	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Array = GetIntrinsic('%Array%');

// eslint-disable-next-line global-require
var toStr = !$Array.isArray && require('call-bind/callBound')('Object.prototype.toString');

module.exports = $Array.isArray || function IsArray(argument) {
	return toStr(argument) === '[object Array]';
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var callBind = require('call-bind');
var callBound = require('call-bind/callBound');

var $ownKeys = GetIntrinsic('%Reflect.ownKeys%', true);
var $pushApply = callBind.apply(GetIntrinsic('%Array.prototype.push%'));
var $SymbolValueOf = callBound('Symbol.prototype.valueOf', true);
var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%', true);
var $gOPS = $SymbolValueOf ? GetIntrinsic('%Object.getOwnPropertySymbols%') : null;

var keys = require('object-keys');

module.exports = $ownKeys || function OwnPropertyKeys(source) {
	var ownKeys = ($gOPN || keys)(source);
	if ($gOPS) {
		$pushApply(ownKeys, $gOPS(source));
	}
	return ownKeys;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');

var has = require('has');

var isMatchRecord = require('./isMatchRecord');

var predicates = {
	// https://262.ecma-international.org/6.0/#sec-property-descriptor-specification-type
	'Property Descriptor': function isPropertyDescriptor(Desc) {
		var allowed = {
			'[[Configurable]]': true,
			'[[Enumerable]]': true,
			'[[Get]]': true,
			'[[Set]]': true,
			'[[Value]]': true,
			'[[Writable]]': true
		};

		for (var key in Desc) { // eslint-disable-line
			if (has(Desc, key) && !allowed[key]) {
				return false;
			}
		}

		var isData = has(Desc, '[[Value]]');
		var IsAccessor = has(Desc, '[[Get]]') || has(Desc, '[[Set]]');
		if (isData && IsAccessor) {
			throw new $TypeError('Property Descriptors may not be both accessor and data descriptors');
		}
		return true;
	},
	// https://262.ecma-international.org/13.0/#sec-match-records
	'Match Record': isMatchRecord
};

module.exports = function assertRecord(Type, recordType, argumentName, value) {
	var predicate = predicates[recordType];
	if (typeof predicate !== 'function') {
		throw new $SyntaxError('unknown record type: ' + recordType);
	}
	if (Type(value) !== 'Object' || !predicate(value)) {
		throw new $TypeError(argumentName + ' must be a ' + recordType);
	}
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var has = require('has');

var $assign = GetIntrinsic('%Object%').assign;

module.exports = function assign(target, source) {
	if ($assign) {
		return $assign(target, source);
	}

	// eslint-disable-next-line no-restricted-syntax
	for (var key in source) {
		if (has(source, key)) {
			// eslint-disable-next-line no-param-reassign
			target[key] = source[key];
		}
	}
	return target;
};
'use strict';

// TODO; semver-major: remove

module.exports = require('call-bind');
'use strict';

// TODO; semver-major: remove

module.exports = require('call-bind/callBound');
'use strict';

module.exports = function every(array, predicate) {
	for (var i = 0; i < array.length; i += 1) {
		if (!predicate(array[i], i, array)) {
			return false;
		}
	}
	return true;
};
'use strict';

module.exports = function forEach(array, callback) {
	for (var i = 0; i < array.length; i += 1) {
		callback(array[i], i, array); // eslint-disable-line callback-return
	}
};
'use strict';

module.exports = function fromPropertyDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return Desc;
	}
	var obj = {};
	if ('[[Value]]' in Desc) {
		obj.value = Desc['[[Value]]'];
	}
	if ('[[Writable]]' in Desc) {
		obj.writable = !!Desc['[[Writable]]'];
	}
	if ('[[Get]]' in Desc) {
		obj.get = Desc['[[Get]]'];
	}
	if ('[[Set]]' in Desc) {
		obj.set = Desc['[[Set]]'];
	}
	if ('[[Enumerable]]' in Desc) {
		obj.enumerable = !!Desc['[[Enumerable]]'];
	}
	if ('[[Configurable]]' in Desc) {
		obj.configurable = !!Desc['[[Configurable]]'];
	}
	return obj;
};
'use strict';

// TODO: remove, semver-major
module.exports = require('get-symbol-description/getInferredName');
'use strict';

var hasSymbols = require('has-symbols')();
var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');
var isString = require('is-string');

var $iterator = GetIntrinsic('%Symbol.iterator%', true);
var $stringSlice = callBound('String.prototype.slice');
var $String = GetIntrinsic('%String%', true);

module.exports = function getIteratorMethod(ES, iterable) {
	var usingIterator;
	if (hasSymbols) {
		usingIterator = ES.GetMethod(iterable, $iterator);
	} else if (ES.IsArray(iterable)) {
		usingIterator = function () {
			var i = -1;
			var arr = this; // eslint-disable-line no-invalid-this
			return {
				next: function () {
					i += 1;
					return {
						done: i >= arr.length,
						value: arr[i]
					};
				}
			};
		};
	} else if (isString(iterable)) {
		usingIterator = function () {
			var i = 0;
			return {
				next: function () {
					var nextIndex = ES.AdvanceStringIndex($String(iterable), i, true);
					var value = $stringSlice(iterable, i, nextIndex);
					i = nextIndex;
					return {
						done: nextIndex > iterable.length,
						value: value
					};
				}
			};
		};
	}
	return usingIterator;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%', true);
if ($gOPD) {
	try {
		$gOPD([], 'length');
	} catch (e) {
		// IE 8 has a broken gOPD
		$gOPD = null;
	}
}

module.exports = $gOPD;
'use strict';

var GetIntrinsic = require('get-intrinsic');

var originalGetProto = GetIntrinsic('%Object.getPrototypeOf%', true);
var $ArrayProto = GetIntrinsic('%Array.prototype%');

module.exports = originalGetProto || (
	// eslint-disable-next-line no-proto
	[].__proto__ === $ArrayProto
		? function (O) {
			return O.__proto__; // eslint-disable-line no-proto
		}
		: null
);
'use strict';

// TODO: remove, semver-major
module.exports = require('get-symbol-description');
'use strict';

var functionName = require('function.prototype.name');

var anon = functionName(function () {});

module.exports = function isAbstractClosure(x) {
	return typeof x === 'function' && (!x.prototype || functionName(x) === anon);
};
'use strict';

module.exports = function isByteValue(value) {
	return typeof value === 'number' && value >= 0 && value <= 255 && (value | 0) === value;
};
'use strict';

module.exports = function isCodePoint(cp) {
	return typeof cp === 'number' && cp >= 0 && cp <= 0x10FFFF && (cp | 0) === cp;
};
'use strict';

var $isNaN = Number.isNaN || function (a) { return a !== a; };

module.exports = Number.isFinite || function (x) { return typeof x === 'number' && !$isNaN(x) && x !== Infinity && x !== -Infinity; };
'use strict';

module.exports = function isFullyPopulatedPropertyDescriptor(ES, Desc) {
	return '[[Enumerable]]' in Desc
		&& '[[Configurable]]' in Desc
		&& (ES.IsAccessorDescriptor(Desc) || ES.IsDataDescriptor(Desc));
};
'use strict';

module.exports = function isLeadingSurrogate(charCode) {
	return typeof charCode === 'number' && charCode >= 0xD800 && charCode <= 0xDBFF;
};
'use strict';

var has = require('has');

// https://262.ecma-international.org/13.0/#sec-match-records

module.exports = function isMatchRecord(record) {
	return (
		has(record, '[[StartIndex]]')
        && has(record, '[[EndIndex]]')
        && record['[[StartIndex]]'] >= 0
        && record['[[EndIndex]]'] >= record['[[StartIndex]]']
        && String(parseInt(record['[[StartIndex]]'], 10)) === String(record['[[StartIndex]]'])
        && String(parseInt(record['[[EndIndex]]'], 10)) === String(record['[[EndIndex]]'])
	);
};
'use strict';

module.exports = Number.isNaN || function isNaN(a) {
	return a !== a;
};
'use strict';

var $strSlice = require('call-bind/callBound')('String.prototype.slice');

module.exports = function isPrefixOf(prefix, string) {
	if (prefix === string) {
		return true;
	}
	if (prefix.length > string.length) {
		return false;
	}
	return $strSlice(string, 0, prefix.length) === prefix;
};
'use strict';

module.exports = function isPrimitive(value) {
	return value === null || (typeof value !== 'function' && typeof value !== 'object');
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var has = require('has');
var $TypeError = GetIntrinsic('%TypeError%');

module.exports = function IsPropertyDescriptor(ES, Desc) {
	if (ES.Type(Desc) !== 'Object') {
		return false;
	}
	var allowed = {
		'[[Configurable]]': true,
		'[[Enumerable]]': true,
		'[[Get]]': true,
		'[[Set]]': true,
		'[[Value]]': true,
		'[[Writable]]': true
	};

	for (var key in Desc) { // eslint-disable-line no-restricted-syntax
		if (has(Desc, key) && !allowed[key]) {
			return false;
		}
	}

	if (ES.IsDataDescriptor(Desc) && ES.IsAccessorDescriptor(Desc)) {
		throw new $TypeError('Property Descriptors may not be both accessor and data descriptors');
	}
	return true;
};
'use strict';

var every = require('./every');

module.exports = function isSamePropertyDescriptor(ES, D1, D2) {
	var fields = [
		'[[Configurable]]',
		'[[Enumerable]]',
		'[[Get]]',
		'[[Set]]',
		'[[Value]]',
		'[[Writable]]'
	];
	return every(fields, function (field) {
		if ((field in D1) !== (field in D2)) {
			return false;
		}
		return ES.SameValue(D1[field], D2[field]);
	});
};
'use strict';

module.exports = function isTrailingSurrogate(charCode) {
	return typeof charCode === 'number' && charCode >= 0xDC00 && charCode <= 0xDFFF;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Math = GetIntrinsic('%Math%');
var $Number = GetIntrinsic('%Number%');

module.exports = $Number.MAX_SAFE_INTEGER || $Math.pow(2, 53) - 1;
'use strict';

var $floor = Math.floor;

module.exports = function mod(number, modulo) {
	var remain = number % modulo;
	return $floor(remain >= 0 ? remain : remain + modulo);
};
'use strict';

module.exports = function bigIntMod(BigIntRemainder, bigint, modulo) {
	var remain = BigIntRemainder(bigint, modulo);
	return remain >= 0 ? remain : remain + modulo;
};
'use strict';

var callBound = require('call-bind/callBound');

var $strSlice = callBound('String.prototype.slice');

module.exports = function padTimeComponent(c, count) {
	return $strSlice('00' + c, -(count || 2));
};
'use strict';

var callBound = require('call-bind/callBound');

var $exec = callBound('RegExp.prototype.exec');

module.exports = function regexTester(regex) {
	return function test(s) { return $exec(regex, s) !== null; };
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var originalSetProto = GetIntrinsic('%Object.setPrototypeOf%', true);
var $ArrayProto = GetIntrinsic('%Array.prototype%');

module.exports = originalSetProto || (
	// eslint-disable-next-line no-proto, no-negated-condition
	[].__proto__ !== $ArrayProto
		? null
		: function (O, proto) {
			O.__proto__ = proto; // eslint-disable-line no-proto, no-param-reassign
			return O;
		}
);
'use strict';

module.exports = function sign(number) {
	return number >= 0 ? 1 : -1;
};
'use strict';

module.exports = function some(array, predicate) {
	for (var i = 0; i < array.length; i += 1) {
		if (predicate(array[i], i, array)) {
			return true;
		}
	}
	return false;
};
'use strict';

var HoursPerDay = 24;
var MinutesPerHour = 60;
var SecondsPerMinute = 60;
var msPerSecond = 1e3;
var msPerMinute = msPerSecond * SecondsPerMinute;
var msPerHour = msPerMinute * MinutesPerHour;
var msPerDay = 86400000;

module.exports = {
	HoursPerDay: HoursPerDay,
	MinutesPerHour: MinutesPerHour,
	SecondsPerMinute: SecondsPerMinute,
	msPerSecond: msPerSecond,
	msPerMinute: msPerMinute,
	msPerHour: msPerHour,
	msPerDay: msPerDay
};
'use strict';

var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

// https://262.ecma-international.org/5.1/#sec-11.9.3

module.exports = function AbstractEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType === yType) {
		return x === y; // ES6+ specified this shortcut anyways.
	}
	if (x == null && y == null) {
		return true;
	}
	if (xType === 'Number' && yType === 'String') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if (xType === 'String' && yType === 'Number') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (xType === 'Boolean') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (yType === 'Boolean') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if ((xType === 'String' || xType === 'Number') && yType === 'Object') {
		return AbstractEqualityComparison(x, ToPrimitive(y));
	}
	if (xType === 'Object' && (yType === 'String' || yType === 'Number')) {
		return AbstractEqualityComparison(ToPrimitive(x), y);
	}
	return false;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Number = GetIntrinsic('%Number%');
var $TypeError = GetIntrinsic('%TypeError%');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var isPrefixOf = require('../helpers/isPrefixOf');

var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

// https://262.ecma-international.org/5.1/#sec-11.8.5

// eslint-disable-next-line max-statements
module.exports = function AbstractRelationalComparison(x, y, LeftFirst) {
	if (Type(LeftFirst) !== 'Boolean') {
		throw new $TypeError('Assertion failed: LeftFirst argument must be a Boolean');
	}
	var px;
	var py;
	if (LeftFirst) {
		px = ToPrimitive(x, $Number);
		py = ToPrimitive(y, $Number);
	} else {
		py = ToPrimitive(y, $Number);
		px = ToPrimitive(x, $Number);
	}
	var bothStrings = Type(px) === 'String' && Type(py) === 'String';
	if (!bothStrings) {
		var nx = ToNumber(px);
		var ny = ToNumber(py);
		if ($isNaN(nx) || $isNaN(ny)) {
			return undefined;
		}
		if ($isFinite(nx) && $isFinite(ny) && nx === ny) {
			return false;
		}
		if (nx === Infinity) {
			return false;
		}
		if (ny === Infinity) {
			return true;
		}
		if (ny === -Infinity) {
			return false;
		}
		if (nx === -Infinity) {
			return true;
		}
		return nx < ny; // by now, these are both nonzero, finite, and not equal
	}
	if (isPrefixOf(py, px)) {
		return false;
	}
	if (isPrefixOf(px, py)) {
		return true;
	}
	return px < py; // both strings, neither a prefix of the other. shortcut for steps c-f
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

// http://262.ecma-international.org/5.1/#sec-9.10

module.exports = function CheckObjectCoercible(value, optMessage) {
	if (value == null) {
		throw new $TypeError(optMessage || ('Cannot call method on ' + value));
	}
	return value;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');
var MonthFromTime = require('./MonthFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.5

module.exports = function DateFromTime(t) {
	var m = MonthFromTime(t);
	var d = DayWithinYear(t);
	if (m === 0) {
		return d + 1;
	}
	if (m === 1) {
		return d - 30;
	}
	var leap = InLeapYear(t);
	if (m === 2) {
		return d - 58 - leap;
	}
	if (m === 3) {
		return d - 89 - leap;
	}
	if (m === 4) {
		return d - 119 - leap;
	}
	if (m === 5) {
		return d - 150 - leap;
	}
	if (m === 6) {
		return d - 180 - leap;
	}
	if (m === 7) {
		return d - 211 - leap;
	}
	if (m === 8) {
		return d - 242 - leap;
	}
	if (m === 9) {
		return d - 272 - leap;
	}
	if (m === 10) {
		return d - 303 - leap;
	}
	if (m === 11) {
		return d - 333 - leap;
	}
	throw new $EvalError('Assertion failed: MonthFromTime returned an impossible value: ' + m);
};
'use strict';

var floor = require('./floor');

var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.2

module.exports = function Day(t) {
	return floor(t / msPerDay);
};
'use strict';

var floor = require('./floor');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function DayFromYear(y) {
	return (365 * (y - 1970)) + floor((y - 1969) / 4) - floor((y - 1901) / 100) + floor((y - 1601) / 400);
};

'use strict';

var Day = require('./Day');
var DayFromYear = require('./DayFromYear');
var YearFromTime = require('./YearFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.4

module.exports = function DayWithinYear(t) {
	return Day(t) - DayFromYear(YearFromTime(t));
};
'use strict';

var modulo = require('./modulo');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function DaysInYear(y) {
	if (modulo(y, 4) !== 0) {
		return 365;
	}
	if (modulo(y, 100) !== 0) {
		return 366;
	}
	if (modulo(y, 400) !== 0) {
		return 365;
	}
	return 366;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');

var assertRecord = require('../helpers/assertRecord');

// https://262.ecma-international.org/5.1/#sec-8.10.4

module.exports = function FromPropertyDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return Desc;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (IsDataDescriptor(Desc)) {
		return {
			value: Desc['[[Value]]'],
			writable: !!Desc['[[Writable]]'],
			enumerable: !!Desc['[[Enumerable]]'],
			configurable: !!Desc['[[Configurable]]']
		};
	} else if (IsAccessorDescriptor(Desc)) {
		return {
			get: Desc['[[Get]]'],
			set: Desc['[[Set]]'],
			enumerable: !!Desc['[[Enumerable]]'],
			configurable: !!Desc['[[Configurable]]']
		};
	}
	throw new $TypeError('FromPropertyDescriptor must be called with a fully populated Property Descriptor');

};
'use strict';

var floor = require('./floor');
var modulo = require('./modulo');

var timeConstants = require('../helpers/timeConstants');
var msPerHour = timeConstants.msPerHour;
var HoursPerDay = timeConstants.HoursPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function HourFromTime(t) {
	return modulo(floor(t / msPerHour), HoursPerDay);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DaysInYear = require('./DaysInYear');
var YearFromTime = require('./YearFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function InLeapYear(t) {
	var days = DaysInYear(YearFromTime(t));
	if (days === 365) {
		return 0;
	}
	if (days === 366) {
		return 1;
	}
	throw new $EvalError('Assertion failed: there are not 365 or 366 days in a year, got: ' + days);
};
'use strict';

var has = require('has');

var Type = require('./Type');

var assertRecord = require('../helpers/assertRecord');

// https://262.ecma-international.org/5.1/#sec-8.10.1

module.exports = function IsAccessorDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Get]]') && !has(Desc, '[[Set]]')) {
		return false;
	}

	return true;
};
'use strict';

// http://262.ecma-international.org/5.1/#sec-9.11

module.exports = require('is-callable');
'use strict';

var has = require('has');

var Type = require('./Type');

var assertRecord = require('../helpers/assertRecord');

// https://262.ecma-international.org/5.1/#sec-8.10.2

module.exports = function IsDataDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Value]]') && !has(Desc, '[[Writable]]')) {
		return false;
	}

	return true;
};
'use strict';

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var Type = require('./Type');

var assertRecord = require('../helpers/assertRecord');

// https://262.ecma-international.org/5.1/#sec-8.10.3

module.exports = function IsGenericDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!IsAccessorDescriptor(Desc) && !IsDataDescriptor(Desc)) {
		return true;
	}

	return false;
};
'use strict';

// TODO, semver-major: delete this

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var Type = require('./Type');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');

// https://262.ecma-international.org/6.0/#sec-property-descriptor-specification-type

module.exports = function IsPropertyDescriptor(Desc) {
	return isPropertyDescriptor({
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor,
		Type: Type
	}, Desc);
};
'use strict';

var $isFinite = require('../helpers/isFinite');
var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.13

module.exports = function MakeDate(day, time) {
	if (!$isFinite(day) || !$isFinite(time)) {
		return NaN;
	}
	return (day * msPerDay) + time;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $DateUTC = GetIntrinsic('%Date.UTC%');

var $isFinite = require('../helpers/isFinite');

var DateFromTime = require('./DateFromTime');
var Day = require('./Day');
var floor = require('./floor');
var modulo = require('./modulo');
var MonthFromTime = require('./MonthFromTime');
var ToInteger = require('./ToInteger');
var YearFromTime = require('./YearFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.12

module.exports = function MakeDay(year, month, date) {
	if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) {
		return NaN;
	}
	var y = ToInteger(year);
	var m = ToInteger(month);
	var dt = ToInteger(date);
	var ym = y + floor(m / 12);
	var mn = modulo(m, 12);
	var t = $DateUTC(ym, mn, 1);
	if (YearFromTime(t) !== ym || MonthFromTime(t) !== mn || DateFromTime(t) !== 1) {
		return NaN;
	}
	return Day(t) + dt - 1;
};
'use strict';

var $isFinite = require('../helpers/isFinite');
var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var msPerMinute = timeConstants.msPerMinute;
var msPerHour = timeConstants.msPerHour;

var ToInteger = require('./ToInteger');

// https://262.ecma-international.org/5.1/#sec-15.9.1.11

module.exports = function MakeTime(hour, min, sec, ms) {
	if (!$isFinite(hour) || !$isFinite(min) || !$isFinite(sec) || !$isFinite(ms)) {
		return NaN;
	}
	var h = ToInteger(hour);
	var m = ToInteger(min);
	var s = ToInteger(sec);
	var milli = ToInteger(ms);
	var t = (h * msPerHour) + (m * msPerMinute) + (s * msPerSecond) + milli;
	return t;
};
'use strict';

var floor = require('./floor');
var modulo = require('./modulo');

var timeConstants = require('../helpers/timeConstants');
var msPerMinute = timeConstants.msPerMinute;
var MinutesPerHour = timeConstants.MinutesPerHour;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function MinFromTime(t) {
	return modulo(floor(t / msPerMinute), MinutesPerHour);
};
'use strict';

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');

// https://262.ecma-international.org/5.1/#sec-15.9.1.4

module.exports = function MonthFromTime(t) {
	var day = DayWithinYear(t);
	if (0 <= day && day < 31) {
		return 0;
	}
	var leap = InLeapYear(t);
	if (31 <= day && day < (59 + leap)) {
		return 1;
	}
	if ((59 + leap) <= day && day < (90 + leap)) {
		return 2;
	}
	if ((90 + leap) <= day && day < (120 + leap)) {
		return 3;
	}
	if ((120 + leap) <= day && day < (151 + leap)) {
		return 4;
	}
	if ((151 + leap) <= day && day < (181 + leap)) {
		return 5;
	}
	if ((181 + leap) <= day && day < (212 + leap)) {
		return 6;
	}
	if ((212 + leap) <= day && day < (243 + leap)) {
		return 7;
	}
	if ((243 + leap) <= day && day < (273 + leap)) {
		return 8;
	}
	if ((273 + leap) <= day && day < (304 + leap)) {
		return 9;
	}
	if ((304 + leap) <= day && day < (334 + leap)) {
		return 10;
	}
	if ((334 + leap) <= day && day < (365 + leap)) {
		return 11;
	}
};
'use strict';

var $isNaN = require('../helpers/isNaN');

// http://262.ecma-international.org/5.1/#sec-9.12

module.exports = function SameValue(x, y) {
	if (x === y) { // 0 === -0, but they are not identical.
		if (x === 0) { return 1 / x === 1 / y; }
		return true;
	}
	return $isNaN(x) && $isNaN(y);
};
'use strict';

var floor = require('./floor');
var modulo = require('./modulo');

var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var SecondsPerMinute = timeConstants.SecondsPerMinute;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function SecFromTime(t) {
	return modulo(floor(t / msPerSecond), SecondsPerMinute);
};
'use strict';

var Type = require('./Type');

// https://262.ecma-international.org/5.1/#sec-11.9.6

module.exports = function StrictEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType !== yType) {
		return false;
	}
	if (xType === 'Undefined' || xType === 'Null') {
		return true;
	}
	return x === y; // shortcut for steps 4-7
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Date = GetIntrinsic('%Date%');
var $Number = GetIntrinsic('%Number%');

var $isFinite = require('../helpers/isFinite');

var abs = require('./abs');
var ToNumber = require('./ToNumber');

// https://262.ecma-international.org/5.1/#sec-15.9.1.14

module.exports = function TimeClip(time) {
	if (!$isFinite(time) || abs(time) > 8.64e15) {
		return NaN;
	}
	return $Number(new $Date(ToNumber(time)));
};

'use strict';

var msPerDay = require('../helpers/timeConstants').msPerDay;

var DayFromYear = require('./DayFromYear');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function TimeFromYear(y) {
	return msPerDay * DayFromYear(y);
};
'use strict';

var modulo = require('./modulo');

var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.2

module.exports = function TimeWithinDay(t) {
	return modulo(t, msPerDay);
};

'use strict';

// http://262.ecma-international.org/5.1/#sec-9.2

module.exports = function ToBoolean(value) { return !!value; };
'use strict';

var ToNumber = require('./ToNumber');

// http://262.ecma-international.org/5.1/#sec-9.5

module.exports = function ToInt32(x) {
	return ToNumber(x) >> 0;
};
'use strict';

var abs = require('./abs');
var floor = require('./floor');
var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');

// http://262.ecma-international.org/5.1/#sec-9.4

module.exports = function ToInteger(value) {
	var number = ToNumber(value);
	if ($isNaN(number)) { return 0; }
	if (number === 0 || !$isFinite(number)) { return number; }
	return $sign(number) * floor(abs(number));
};
'use strict';

var ToPrimitive = require('./ToPrimitive');

// http://262.ecma-international.org/5.1/#sec-9.3

module.exports = function ToNumber(value) {
	var prim = ToPrimitive(value, Number);
	if (typeof prim !== 'string') {
		return +prim; // eslint-disable-line no-implicit-coercion
	}

	// eslint-disable-next-line no-control-regex
	var trimmed = prim.replace(/^[ \t\x0b\f\xa0\ufeff\n\r\u2028\u2029\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u0085]+|[ \t\x0b\f\xa0\ufeff\n\r\u2028\u2029\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u0085]+$/g, '');
	if ((/^0[ob]|^[+-]0x/).test(trimmed)) {
		return NaN;
	}

	return +trimmed; // eslint-disable-line no-implicit-coercion
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Object = GetIntrinsic('%Object%');

var CheckObjectCoercible = require('./CheckObjectCoercible');

// http://262.ecma-international.org/5.1/#sec-9.9

module.exports = function ToObject(value) {
	CheckObjectCoercible(value);
	return $Object(value);
};
'use strict';

// http://262.ecma-international.org/5.1/#sec-9.1

module.exports = require('es-to-primitive/es5');
'use strict';

var has = require('has');

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');
var ToBoolean = require('./ToBoolean');
var IsCallable = require('./IsCallable');

// https://262.ecma-international.org/5.1/#sec-8.10.5

module.exports = function ToPropertyDescriptor(Obj) {
	if (Type(Obj) !== 'Object') {
		throw new $TypeError('ToPropertyDescriptor requires an object');
	}

	var desc = {};
	if (has(Obj, 'enumerable')) {
		desc['[[Enumerable]]'] = ToBoolean(Obj.enumerable);
	}
	if (has(Obj, 'configurable')) {
		desc['[[Configurable]]'] = ToBoolean(Obj.configurable);
	}
	if (has(Obj, 'value')) {
		desc['[[Value]]'] = Obj.value;
	}
	if (has(Obj, 'writable')) {
		desc['[[Writable]]'] = ToBoolean(Obj.writable);
	}
	if (has(Obj, 'get')) {
		var getter = Obj.get;
		if (typeof getter !== 'undefined' && !IsCallable(getter)) {
			throw new $TypeError('getter must be a function');
		}
		desc['[[Get]]'] = getter;
	}
	if (has(Obj, 'set')) {
		var setter = Obj.set;
		if (typeof setter !== 'undefined' && !IsCallable(setter)) {
			throw new $TypeError('setter must be a function');
		}
		desc['[[Set]]'] = setter;
	}

	if ((has(desc, '[[Get]]') || has(desc, '[[Set]]')) && (has(desc, '[[Value]]') || has(desc, '[[Writable]]'))) {
		throw new $TypeError('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
	}
	return desc;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $String = GetIntrinsic('%String%');

// http://262.ecma-international.org/5.1/#sec-9.8

module.exports = function ToString(value) {
	return $String(value);
};

'use strict';

var abs = require('./abs');
var floor = require('./floor');
var modulo = require('./modulo');
var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');

// http://262.ecma-international.org/5.1/#sec-9.7

module.exports = function ToUint16(value) {
	var number = ToNumber(value);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * floor(abs(number));
	return modulo(posInt, 0x10000);
};
'use strict';

var ToNumber = require('./ToNumber');

// http://262.ecma-international.org/5.1/#sec-9.6

module.exports = function ToUint32(x) {
	return ToNumber(x) >>> 0;
};
'use strict';

// https://262.ecma-international.org/5.1/#sec-8

module.exports = function Type(x) {
	if (x === null) {
		return 'Null';
	}
	if (typeof x === 'undefined') {
		return 'Undefined';
	}
	if (typeof x === 'function' || typeof x === 'object') {
		return 'Object';
	}
	if (typeof x === 'number') {
		return 'Number';
	}
	if (typeof x === 'boolean') {
		return 'Boolean';
	}
	if (typeof x === 'string') {
		return 'String';
	}
};
'use strict';

var Day = require('./Day');
var modulo = require('./modulo');

// https://262.ecma-international.org/5.1/#sec-15.9.1.6

module.exports = function WeekDay(t) {
	return modulo(Day(t) + 4, 7);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Date = GetIntrinsic('%Date%');

var callBound = require('call-bind/callBound');

var $getUTCFullYear = callBound('Date.prototype.getUTCFullYear');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function YearFromTime(t) {
	// largest y such that this.TimeFromYear(y) <= t
	return $getUTCFullYear(new $Date(t));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $abs = GetIntrinsic('%Math.abs%');

// http://262.ecma-international.org/5.1/#sec-5.2

module.exports = function abs(x) {
	return $abs(x);
};
'use strict';

// var modulo = require('./modulo');
var $floor = Math.floor;

// http://262.ecma-international.org/5.1/#sec-5.2

module.exports = function floor(x) {
	// return x - modulo(x, 1);
	return $floor(x);
};
'use strict';

var mod = require('../helpers/mod');

// https://262.ecma-international.org/5.1/#sec-5.2

module.exports = function modulo(x, y) {
	return mod(x, y);
};
'use strict';

var modulo = require('./modulo');

var msPerSecond = require('../helpers/timeConstants').msPerSecond;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function msFromTime(t) {
	return modulo(t, msPerSecond);
};
'use strict';

var inspect = require('object-inspect');

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var Get = require('./Get');
var GetIterator = require('./GetIterator');
var IsCallable = require('./IsCallable');
var IteratorClose = require('./IteratorClose');
var IteratorStep = require('./IteratorStep');
var IteratorValue = require('./IteratorValue');
var Type = require('./Type');

// https://262.ecma-international.org/10.0//#sec-add-entries-from-iterable

module.exports = function AddEntriesFromIterable(target, iterable, adder) {
	if (!IsCallable(adder)) {
		throw new $TypeError('Assertion failed: `adder` is not callable');
	}
	if (iterable == null) {
		throw new $TypeError('Assertion failed: `iterable` is present, and not nullish');
	}
	var iteratorRecord = GetIterator(iterable);
	while (true) { // eslint-disable-line no-constant-condition
		var next = IteratorStep(iteratorRecord);
		if (!next) {
			return target;
		}
		var nextItem = IteratorValue(next);
		if (Type(nextItem) !== 'Object') {
			var error = new $TypeError('iterator next must return an Object, got ' + inspect(nextItem));
			return IteratorClose(
				iteratorRecord,
				function () { throw error; } // eslint-disable-line no-loop-func
			);
		}
		try {
			var k = Get(nextItem, '0');
			var v = Get(nextItem, '1');
			Call(adder, target, [k, v]);
		} catch (e) {
			return IteratorClose(
				iteratorRecord,
				function () { throw e; }
			);
		}
	}
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');
var SLOT = require('internal-slot');

var $TypeError = GetIntrinsic('%TypeError%');

var ClearKeptObjects = require('./ClearKeptObjects');
var Type = require('./Type');

var $push = callBound('Array.prototype.push');

// https://ecma-international.org/ecma-262/12.0/#sec-addtokeptobjects

module.exports = function AddToKeptObjects(object) {
	if (Type(object) !== 'Object') {
		throw new $TypeError('Assertion failed: `object` must be an Object');
	}
	$push(SLOT.get(ClearKeptObjects, '[[es-abstract internal: KeptAlive]]'), object);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var CodePointAt = require('./CodePointAt');
var IsIntegralNumber = require('./IsIntegralNumber');
var Type = require('./Type');

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');

var $TypeError = GetIntrinsic('%TypeError%');

// https://ecma-international.org/ecma-262/12.0/#sec-advancestringindex

module.exports = function AdvanceStringIndex(S, index, unicode) {
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	if (!IsIntegralNumber(index) || index < 0 || index > MAX_SAFE_INTEGER) {
		throw new $TypeError('Assertion failed: `length` must be an integer >= 0 and <= 2**53');
	}
	if (Type(unicode) !== 'Boolean') {
		throw new $TypeError('Assertion failed: `unicode` must be a Boolean');
	}
	if (!unicode) {
		return index + 1;
	}
	var length = S.length;
	if ((index + 1) >= length) {
		return index + 1;
	}
	var cp = CodePointAt(S, index);
	return index + cp['[[CodeUnitCount]]'];
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var HasOwnProperty = require('./HasOwnProperty');
var ToNumeric = require('./ToNumeric');
var ToPrimitive = require('./ToPrimitive');
var ToString = require('./ToString');
var Type = require('./Type');

var NumberAdd = require('./Number/add');
var NumberBitwiseAND = require('./Number/bitwiseAND');
var NumberBitwiseOR = require('./Number/bitwiseOR');
var NumberBitwiseXOR = require('./Number/bitwiseXOR');
var NumberDivide = require('./Number/divide');
var NumberExponentiate = require('./Number/exponentiate');
var NumberLeftShift = require('./Number/leftShift');
var NumberMultiply = require('./Number/multiply');
var NumberRemainder = require('./Number/remainder');
var NumberSignedRightShift = require('./Number/signedRightShift');
var NumberSubtract = require('./Number/subtract');
var NumberUnsignedRightShift = require('./Number/unsignedRightShift');
var BigIntAdd = require('./BigInt/add');
var BigIntBitwiseAND = require('./BigInt/bitwiseAND');
var BigIntBitwiseOR = require('./BigInt/bitwiseOR');
var BigIntBitwiseXOR = require('./BigInt/bitwiseXOR');
var BigIntDivide = require('./BigInt/divide');
var BigIntExponentiate = require('./BigInt/exponentiate');
var BigIntLeftShift = require('./BigInt/leftShift');
var BigIntMultiply = require('./BigInt/multiply');
var BigIntRemainder = require('./BigInt/remainder');
var BigIntSignedRightShift = require('./BigInt/signedRightShift');
var BigIntSubtract = require('./BigInt/subtract');
var BigIntUnsignedRightShift = require('./BigInt/unsignedRightShift');

// https://ecma-international.org/ecma-262/12.0/#sec-applystringornumericbinaryoperator

// https://ecma-international.org/ecma-262/12.0/#step-applystringornumericbinaryoperator-operations-table
var table = {
	'**': [NumberExponentiate, BigIntExponentiate],
	'*': [NumberMultiply, BigIntMultiply],
	'/': [NumberDivide, BigIntDivide],
	'%': [NumberRemainder, BigIntRemainder],
	'+': [NumberAdd, BigIntAdd],
	'-': [NumberSubtract, BigIntSubtract],
	'<<': [NumberLeftShift, BigIntLeftShift],
	'>>': [NumberSignedRightShift, BigIntSignedRightShift],
	'>>>': [NumberUnsignedRightShift, BigIntUnsignedRightShift],
	'&': [NumberBitwiseAND, BigIntBitwiseAND],
	'^': [NumberBitwiseXOR, BigIntBitwiseXOR],
	'|': [NumberBitwiseOR, BigIntBitwiseOR]
};

module.exports = function ApplyStringOrNumericBinaryOperator(lval, opText, rval) {
	if (Type(opText) !== 'String' || !HasOwnProperty(table, opText)) {
		throw new $TypeError('Assertion failed: `opText` must be a valid operation string');
	}
	if (opText === '+') {
		var lprim = ToPrimitive(lval);
		var rprim = ToPrimitive(rval);
		if (Type(lprim) === 'String' || Type(rprim) === 'String') {
			var lstr = ToString(lprim);
			var rstr = ToString(rprim);
			return lstr + rstr;
		}
		/* eslint no-param-reassign: 1 */
		lval = lprim;
		rval = rprim;
	}
	var lnum = ToNumeric(lval);
	var rnum = ToNumeric(rval);
	var T = Type(lnum);
	if (T !== Type(rnum)) {
		throw new $TypeError('types of ' + lnum + ' and ' + rnum + ' differ');
	}
	var Operation = table[opText][T === 'BigInt' ? 1 : 0];
	return Operation(lnum, rnum);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $ArrayPrototype = GetIntrinsic('%Array.prototype%');
var $RangeError = GetIntrinsic('%RangeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var IsIntegralNumber = require('./IsIntegralNumber');

var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1;

var $setProto = GetIntrinsic('%Object.setPrototypeOf%', true) || (
	// eslint-disable-next-line no-proto, no-negated-condition
	[].__proto__ !== $ArrayPrototype
		? null
		: function (O, proto) {
			O.__proto__ = proto; // eslint-disable-line no-proto, no-param-reassign
			return O;
		}
);

// https://www.ecma-international.org/ecma-262/12.0/#sec-arraycreate

module.exports = function ArrayCreate(length) {
	if (!IsIntegralNumber(length) || length < 0) {
		throw new $TypeError('Assertion failed: `length` must be an integer Number >= 0');
	}
	if (length > MAX_ARRAY_LENGTH) {
		throw new $RangeError('length is greater than (2**32 - 1)');
	}
	var proto = arguments.length > 1 ? arguments[1] : $ArrayPrototype;
	var A = []; // steps 3, 5
	if (proto !== $ArrayPrototype) { // step 4
		if (!$setProto) {
			throw new $SyntaxError('ArrayCreate: a `proto` argument that is not `Array.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
		}
		$setProto(A, proto);
	}
	if (length !== 0) { // bypasses the need for step 6
		A.length = length;
	}
	/* step 6, the above as a shortcut for the below
	OrdinaryDefineOwnProperty(A, 'length', {
		'[[Configurable]]': false,
		'[[Enumerable]]': false,
		'[[Value]]': length,
		'[[Writable]]': true
	});
	*/
	return A;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $RangeError = GetIntrinsic('%RangeError%');
var $TypeError = GetIntrinsic('%TypeError%');

var assign = require('object.assign');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var IsArray = require('./IsArray');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var OrdinaryDefineOwnProperty = require('./OrdinaryDefineOwnProperty');
var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
var ToNumber = require('./ToNumber');
var ToString = require('./ToString');
var ToUint32 = require('./ToUint32');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-arraysetlength

// eslint-disable-next-line max-statements, max-lines-per-function
module.exports = function ArraySetLength(A, Desc) {
	if (!IsArray(A)) {
		throw new $TypeError('Assertion failed: A must be an Array');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (!('[[Value]]' in Desc)) {
		return OrdinaryDefineOwnProperty(A, 'length', Desc);
	}
	var newLenDesc = assign({}, Desc);
	var newLen = ToUint32(Desc['[[Value]]']);
	var numberLen = ToNumber(Desc['[[Value]]']);
	if (newLen !== numberLen) {
		throw new $RangeError('Invalid array length');
	}
	newLenDesc['[[Value]]'] = newLen;
	var oldLenDesc = OrdinaryGetOwnProperty(A, 'length');
	if (!IsDataDescriptor(oldLenDesc)) {
		throw new $TypeError('Assertion failed: an array had a non-data descriptor on `length`');
	}
	var oldLen = oldLenDesc['[[Value]]'];
	if (newLen >= oldLen) {
		return OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
	}
	if (!oldLenDesc['[[Writable]]']) {
		return false;
	}
	var newWritable;
	if (!('[[Writable]]' in newLenDesc) || newLenDesc['[[Writable]]']) {
		newWritable = true;
	} else {
		newWritable = false;
		newLenDesc['[[Writable]]'] = true;
	}
	var succeeded = OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
	if (!succeeded) {
		return false;
	}
	while (newLen < oldLen) {
		oldLen -= 1;
		// eslint-disable-next-line no-param-reassign
		var deleteSucceeded = delete A[ToString(oldLen)];
		if (!deleteSucceeded) {
			newLenDesc['[[Value]]'] = oldLen + 1;
			if (!newWritable) {
				newLenDesc['[[Writable]]'] = false;
				OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
				return false;
			}
		}
	}
	if (!newWritable) {
		return OrdinaryDefineOwnProperty(A, 'length', { '[[Writable]]': false });
	}
	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $species = GetIntrinsic('%Symbol.species%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var ArrayCreate = require('./ArrayCreate');
var Get = require('./Get');
var IsArray = require('./IsArray');
var IsConstructor = require('./IsConstructor');
var IsIntegralNumber = require('./IsIntegralNumber');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/12.0/#sec-arrayspeciescreate

module.exports = function ArraySpeciesCreate(originalArray, length) {
	if (!IsIntegralNumber(length) || length < 0) {
		throw new $TypeError('Assertion failed: length must be an integer >= 0');
	}

	var isArray = IsArray(originalArray);
	if (!isArray) {
		return ArrayCreate(length);
	}

	var C = Get(originalArray, 'constructor');
	// TODO: figure out how to make a cross-realm normal Array, a same-realm Array
	// if (IsConstructor(C)) {
	// 	if C is another realm's Array, C = undefined
	// 	Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?
	// }
	if ($species && Type(C) === 'Object') {
		C = Get(C, $species);
		if (C === null) {
			C = void 0;
		}
	}

	if (typeof C === 'undefined') {
		return ArrayCreate(length);
	}
	if (!IsConstructor(C)) {
		throw new $TypeError('C must be a constructor');
	}
	return new C(length); // Construct(C, length);
};

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
// var $BigInt = GetIntrinsic('%BigInt%', true);
// var $pow = GetIntrinsic('%Math.pow%');

// var BinaryAnd = require('./BinaryAnd');
// var BinaryOr = require('./BinaryOr');
// var BinaryXor = require('./BinaryXor');
var Type = require('./Type');
// var modulo = require('./modulo');

// var zero = $BigInt && $BigInt(0);
// var negOne = $BigInt && $BigInt(-1);
// var two = $BigInt && $BigInt(2);

// https://262.ecma-international.org/11.0/#sec-bigintbitwiseop

module.exports = function BigIntBitwiseOp(op, x, y) {
	if (op !== '&' && op !== '|' && op !== '^') {
		throw new $TypeError('Assertion failed: `op` must be `&`, `|`, or `^`');
	}
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('`x` and `y` must be BigInts');
	}

	if (op === '&') {
		return x & y;
	}
	if (op === '|') {
		return x | y;
	}
	return x ^ y;
	/*
	var result = zero;
	var shift = 0;
	while (x !== zero && x !== negOne && y !== zero && y !== negOne) {
		var xDigit = modulo(x, two);
		var yDigit = modulo(y, two);
		if (op === '&') {
			result += $pow(2, shift) * BinaryAnd(xDigit, yDigit);
		} else if (op === '|') {
			result += $pow(2, shift) * BinaryOr(xDigit, yDigit);
		} else if (op === '^') {
			result += $pow(2, shift) * BinaryXor(xDigit, yDigit);
		}
		shift += 1;
		x = (x - xDigit) / two;
		y = (y - yDigit) / two;
	}
	var tmp;
	if (op === '&') {
		tmp = BinaryAnd(modulo(x, two), modulo(y, two));
	} else if (op === '|') {
		tmp = BinaryAnd(modulo(x, two), modulo(y, two));
	} else {
		tmp = BinaryXor(modulo(x, two), modulo(y, two));
	}
	if (tmp !== 0) {
		result -= $pow(2, shift);
	}
	return result;
	*/
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

// https://262.ecma-international.org/11.0/#sec-binaryand

module.exports = function BinaryAnd(x, y) {
	if ((x !== 0 && x !== 1) || (y !== 0 && y !== 1)) {
		throw new $TypeError('Assertion failed: `x` and `y` must be either 0 or 1');
	}
	return x & y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

// https://262.ecma-international.org/11.0/#sec-binaryor

module.exports = function BinaryOr(x, y) {
	if ((x !== 0 && x !== 1) || (y !== 0 && y !== 1)) {
		throw new $TypeError('Assertion failed: `x` and `y` must be either 0 or 1');
	}
	return x | y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

// https://262.ecma-international.org/11.0/#sec-binaryxor

module.exports = function BinaryXor(x, y) {
	if ((x !== 0 && x !== 1) || (y !== 0 && y !== 1)) {
		throw new $TypeError('Assertion failed: `x` and `y` must be either 0 or 1');
	}
	return x ^ y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');

var $push = callBound('Array.prototype.push');

var IsArray = require('./IsArray');

var isByteValue = require('../helpers/isByteValue');

// https://ecma-international.org/ecma-262/12.0/#sec-bytelistbitwiseop

module.exports = function ByteListBitwiseOp(op, xBytes, yBytes) {
	if (op !== '&' && op !== '^' && op !== '|') {
		throw new $TypeError('Assertion failed: `op` must be `&`, `^`, or `|`');
	}
	if (!IsArray(xBytes) || !IsArray(yBytes) || xBytes.length !== yBytes.length) {
		throw new $TypeError('Assertion failed: `xBytes` and `yBytes` must be same-length sequences of byte values (an integer 0-255, inclusive)');
	}

	var result = [];

	for (var i = 0; i < xBytes.length; i += 1) {
		var xByte = xBytes[i];
		var yByte = yBytes[i];
		if (!isByteValue(xByte) || !isByteValue(yByte)) {
			throw new $TypeError('Assertion failed: `xBytes` and `yBytes` must be same-length sequences of byte values (an integer 0-255, inclusive)');
		}
		var resultByte;
		if (op === '&') {
			resultByte = xByte & yByte;
		} else if (op === '^') {
			resultByte = xByte ^ yByte;
		} else {
			resultByte = xByte | yByte;
		}
		$push(result, resultByte);
	}

	return result;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsArray = require('./IsArray');

var isByteValue = require('../helpers/isByteValue');

// https://ecma-international.org/ecma-262/12.0/#sec-bytelistequal

module.exports = function ByteListEqual(xBytes, yBytes) {
	if (!IsArray(xBytes) || !IsArray(yBytes)) {
		throw new $TypeError('Assertion failed: `xBytes` and `yBytes` must be sequences of byte values (an integer 0-255, inclusive)');
	}

	if (xBytes.length !== yBytes.length) {
		return false;
	}

	for (var i = 0; i < xBytes.length; i += 1) {
		var xByte = xBytes[i];
		var yByte = yBytes[i];
		if (!isByteValue(xByte) || !isByteValue(yByte)) {
			throw new $TypeError('Assertion failed: `xBytes` and `yBytes` must be sequences of byte values (an integer 0-255, inclusive)');
		}
		if (xByte !== yByte) {
			return false;
		}
	}
	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');

var IsArray = require('./IsArray');

var $apply = GetIntrinsic('%Reflect.apply%', true) || callBound('%Function.prototype.apply%');

// https://ecma-international.org/ecma-262/6.0/#sec-call

module.exports = function Call(F, V) {
	var argumentsList = arguments.length > 2 ? arguments[2] : [];
	if (!IsArray(argumentsList)) {
		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
	}
	return $apply(F, V, argumentsList);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var SameValue = require('./SameValue');
var ToNumber = require('./ToNumber');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring

module.exports = function CanonicalNumericIndexString(argument) {
	if (Type(argument) !== 'String') {
		throw new $TypeError('Assertion failed: `argument` must be a String');
	}
	if (argument === '-0') { return -0; }
	var n = ToNumber(argument);
	if (SameValue(ToString(n), argument)) { return n; }
	return void 0;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $fromCharCode = GetIntrinsic('%String.fromCharCode%');
var $TypeError = GetIntrinsic('%TypeError%');
var $charCodeAt = callBound('%String.prototype.charCodeAt%');
var $push = callBound('%Array.prototype.push%');

module.exports = function CharacterRange(A, B) {
	if (A.length !== 1 || B.length !== 1) {
		throw new $TypeError('Assertion failed: CharSets A and B contain exactly one character');
	}

	var a = A[0];
	var b = B[0];

	var i = $charCodeAt(a, 0);
	var j = $charCodeAt(b, 0);

	if (!(i <= j)) {
		throw new $TypeError('Assertion failed: i is not <= j');
	}

	var arr = [];
	for (var k = i; k <= j; k += 1) {
		$push(arr, $fromCharCode(k));
	}
	return arr;
};
'use strict';

var SLOT = require('internal-slot');
var keptObjects = [];

// https://ecma-international.org/ecma-262/12.0/#sec-clear-kept-objects

module.exports = function ClearKeptObjects() {
	keptObjects.length = 0;
};

SLOT.set(module.exports, '[[es-abstract internal: KeptAlive]]', keptObjects);
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var callBound = require('call-bind/callBound');
var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');

var Type = require('./Type');
var UTF16SurrogatePairToCodePoint = require('./UTF16SurrogatePairToCodePoint');

var $charAt = callBound('String.prototype.charAt');
var $charCodeAt = callBound('String.prototype.charCodeAt');

// https://ecma-international.org/ecma-262/12.0/#sec-codepointat

module.exports = function CodePointAt(string, position) {
	if (Type(string) !== 'String') {
		throw new $TypeError('Assertion failed: `string` must be a String');
	}
	var size = string.length;
	if (position < 0 || position >= size) {
		throw new $TypeError('Assertion failed: `position` must be >= 0, and < the length of `string`');
	}
	var first = $charCodeAt(string, position);
	var cp = $charAt(string, position);
	var firstIsLeading = isLeadingSurrogate(first);
	var firstIsTrailing = isTrailingSurrogate(first);
	if (!firstIsLeading && !firstIsTrailing) {
		return {
			'[[CodePoint]]': cp,
			'[[CodeUnitCount]]': 1,
			'[[IsUnpairedSurrogate]]': false
		};
	}
	if (firstIsTrailing || (position + 1 === size)) {
		return {
			'[[CodePoint]]': cp,
			'[[CodeUnitCount]]': 1,
			'[[IsUnpairedSurrogate]]': true
		};
	}
	var second = $charCodeAt(string, position + 1);
	if (!isTrailingSurrogate(second)) {
		return {
			'[[CodePoint]]': cp,
			'[[CodeUnitCount]]': 1,
			'[[IsUnpairedSurrogate]]': true
		};
	}

	return {
		'[[CodePoint]]': UTF16SurrogatePairToCodePoint(first, second),
		'[[CodeUnitCount]]': 2,
		'[[IsUnpairedSurrogate]]': false
	};
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var UTF16EncodeCodePoint = require('./UTF16EncodeCodePoint');
var IsArray = require('./IsArray');

var forEach = require('../helpers/forEach');
var isCodePoint = require('../helpers/isCodePoint');

// https://ecma-international.org/ecma-262/12.0/#sec-codepointstostring

module.exports = function CodePointsToString(text) {
	if (!IsArray(text)) {
		throw new $TypeError('Assertion failed: `text` must be a sequence of Unicode Code Points');
	}
	var result = '';
	forEach(text, function (cp) {
		if (!isCodePoint(cp)) {
			throw new $TypeError('Assertion failed: `text` must be a sequence of Unicode Code Points');
		}
		result += UTF16EncodeCodePoint(cp);
	});
	return result;
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var IsDataDescriptor = require('./IsDataDescriptor');
var IsGenericDescriptor = require('./IsGenericDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor

module.exports = function CompletePropertyDescriptor(Desc) {
	/* eslint no-param-reassign: 0 */
	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
		if (!has(Desc, '[[Value]]')) {
			Desc['[[Value]]'] = void 0;
		}
		if (!has(Desc, '[[Writable]]')) {
			Desc['[[Writable]]'] = false;
		}
	} else {
		if (!has(Desc, '[[Get]]')) {
			Desc['[[Get]]'] = void 0;
		}
		if (!has(Desc, '[[Set]]')) {
			Desc['[[Set]]'] = void 0;
		}
	}
	if (!has(Desc, '[[Enumerable]]')) {
		Desc['[[Enumerable]]'] = false;
	}
	if (!has(Desc, '[[Configurable]]')) {
		Desc['[[Configurable]]'] = false;
	}
	return Desc;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');
var forEach = require('../helpers/forEach');
var every = require('../helpers/every');
var some = require('../helpers/some');
var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');

var CreateDataPropertyOrThrow = require('./CreateDataPropertyOrThrow');
var Get = require('./Get');
var IsArray = require('./IsArray');
var IsIntegralNumber = require('./IsIntegralNumber');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var ToNumber = require('./ToNumber');
var ToObject = require('./ToObject');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/12.0/#sec-copydataproperties

module.exports = function CopyDataProperties(target, source, excludedItems) {
	if (Type(target) !== 'Object') {
		throw new $TypeError('Assertion failed: "target" must be an Object');
	}

	if (!IsArray(excludedItems) || !every(excludedItems, IsPropertyKey)) {
		throw new $TypeError('Assertion failed: "excludedItems" must be a List of Property Keys');
	}

	if (typeof source === 'undefined' || source === null) {
		return target;
	}

	var from = ToObject(source);

	var keys = OwnPropertyKeys(from);
	forEach(keys, function (nextKey) {
		var excluded = some(excludedItems, function (e) {
			return SameValue(e, nextKey) === true;
		});
		/*
		var excluded = false;

		forEach(excludedItems, function (e) {
			if (SameValue(e, nextKey) === true) {
				excluded = true;
			}
		});
		*/

		var enumerable = $isEnumerable(from, nextKey) || (
		// this is to handle string keys being non-enumerable in older engines
			typeof source === 'string'
			&& nextKey >= 0
			&& IsIntegralNumber(ToNumber(nextKey))
		);
		if (excluded === false && enumerable) {
			var propValue = Get(from, nextKey);
			CreateDataPropertyOrThrow(target, nextKey, propValue);
		}
	});

	return target;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createdataproperty

module.exports = function CreateDataProperty(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	var oldDesc = OrdinaryGetOwnProperty(O, P);
	var extensible = !oldDesc || IsExtensible(O);
	var nonConfigurable = oldDesc && !oldDesc['[[Configurable]]'];
	if (nonConfigurable || !extensible) {
		return false;
	}
	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		{
			'[[Configurable]]': true,
			'[[Enumerable]]': true,
			'[[Value]]': V,
			'[[Writable]]': true
		}
	);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var CreateDataProperty = require('./CreateDataProperty');
var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// // https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow

module.exports = function CreateDataPropertyOrThrow(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	var success = CreateDataProperty(O, P, V);
	if (!success) {
		throw new $TypeError('unable to create data property');
	}
	return success;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $replace = callBound('String.prototype.replace');

var RequireObjectCoercible = require('./RequireObjectCoercible');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createhtml

module.exports = function CreateHTML(string, tag, attribute, value) {
	if (Type(tag) !== 'String' || Type(attribute) !== 'String') {
		throw new $TypeError('Assertion failed: `tag` and `attribute` must be strings');
	}
	var str = RequireObjectCoercible(string);
	var S = ToString(str);
	var p1 = '<' + tag;
	if (attribute !== '') {
		var V = ToString(value);
		var escapedV = $replace(V, /\x22/g, '&quot;');
		p1 += '\x20' + attribute + '\x3D\x22' + escapedV + '\x22';
	}
	return p1 + '>' + S + '</' + tag + '>';
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject

module.exports = function CreateIterResultObject(value, done) {
	if (Type(done) !== 'Boolean') {
		throw new $TypeError('Assertion failed: Type(done) is not Boolean');
	}
	return {
		value: value,
		done: done
	};
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');
var $indexOf = callBound('Array.prototype.indexOf', true) || callBound('String.prototype.indexOf');
var $push = callBound('Array.prototype.push');

var Get = require('./Get');
var IsArray = require('./IsArray');
var LengthOfArrayLike = require('./LengthOfArrayLike');
var ToString = require('./ToString');
var Type = require('./Type');

// https://262.ecma-international.org/11.0/#sec-createlistfromarraylike

module.exports = function CreateListFromArrayLike(obj) {
	var elementTypes = arguments.length > 1
		? arguments[1]
		: ['Undefined', 'Null', 'Boolean', 'String', 'Symbol', 'Number', 'Object'];

	if (Type(obj) !== 'Object') {
		throw new $TypeError('Assertion failed: `obj` must be an Object');
	}
	if (!IsArray(elementTypes)) {
		throw new $TypeError('Assertion failed: `elementTypes`, if provided, must be an array');
	}
	var len = LengthOfArrayLike(obj);
	var list = [];
	var index = 0;
	while (index < len) {
		var indexName = ToString(index);
		var next = Get(obj, indexName);
		var nextType = Type(next);
		if ($indexOf(elementTypes, nextType) < 0) {
			throw new $TypeError('item type ' + nextType + ' is not a valid elementType');
		}
		$push(list, next);
		index += 1;
	}
	return list;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createmethodproperty

module.exports = function CreateMethodProperty(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	var newDesc = {
		'[[Configurable]]': true,
		'[[Enumerable]]': false,
		'[[Value]]': V,
		'[[Writable]]': true
	};
	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		newDesc
	);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://262.ecma-international.org/13.0/#sec-createnonenumerabledatapropertyorthrow

module.exports = function CreateNonEnumerableDataPropertyOrThrow(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	var newDesc = {
		'[[Configurable]]': true,
		'[[Enumerable]]': false,
		'[[Value]]': V,
		'[[Writable]]': true
	};
	return DefinePropertyOrThrow(O, P, newDesc);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var hasSymbols = require('has-symbols')();

var $TypeError = GetIntrinsic('%TypeError%');
var IteratorPrototype = GetIntrinsic('%IteratorPrototype%', true);
var $defineProperty = GetIntrinsic('%Object.defineProperty%', true);

var AdvanceStringIndex = require('./AdvanceStringIndex');
var CreateIterResultObject = require('./CreateIterResultObject');
var CreateMethodProperty = require('./CreateMethodProperty');
var Get = require('./Get');
var OrdinaryObjectCreate = require('./OrdinaryObjectCreate');
var RegExpExec = require('./RegExpExec');
var Set = require('./Set');
var ToLength = require('./ToLength');
var ToString = require('./ToString');
var Type = require('./Type');

var SLOT = require('internal-slot');

var RegExpStringIterator = function RegExpStringIterator(R, S, global, fullUnicode) {
	if (Type(S) !== 'String') {
		throw new $TypeError('`S` must be a string');
	}
	if (Type(global) !== 'Boolean') {
		throw new $TypeError('`global` must be a boolean');
	}
	if (Type(fullUnicode) !== 'Boolean') {
		throw new $TypeError('`fullUnicode` must be a boolean');
	}
	SLOT.set(this, '[[IteratingRegExp]]', R);
	SLOT.set(this, '[[IteratedString]]', S);
	SLOT.set(this, '[[Global]]', global);
	SLOT.set(this, '[[Unicode]]', fullUnicode);
	SLOT.set(this, '[[Done]]', false);
};

if (IteratorPrototype) {
	RegExpStringIterator.prototype = OrdinaryObjectCreate(IteratorPrototype);
}

var RegExpStringIteratorNext = function next() {
	var O = this; // eslint-disable-line no-invalid-this
	if (Type(O) !== 'Object') {
		throw new $TypeError('receiver must be an object');
	}
	if (
		!(O instanceof RegExpStringIterator)
		|| !SLOT.has(O, '[[IteratingRegExp]]')
		|| !SLOT.has(O, '[[IteratedString]]')
		|| !SLOT.has(O, '[[Global]]')
		|| !SLOT.has(O, '[[Unicode]]')
		|| !SLOT.has(O, '[[Done]]')
	) {
		throw new $TypeError('"this" value must be a RegExpStringIterator instance');
	}
	if (SLOT.get(O, '[[Done]]')) {
		return CreateIterResultObject(undefined, true);
	}
	var R = SLOT.get(O, '[[IteratingRegExp]]');
	var S = SLOT.get(O, '[[IteratedString]]');
	var global = SLOT.get(O, '[[Global]]');
	var fullUnicode = SLOT.get(O, '[[Unicode]]');
	var match = RegExpExec(R, S);
	if (match === null) {
		SLOT.set(O, '[[Done]]', true);
		return CreateIterResultObject(undefined, true);
	}
	if (global) {
		var matchStr = ToString(Get(match, '0'));
		if (matchStr === '') {
			var thisIndex = ToLength(Get(R, 'lastIndex'));
			var nextIndex = AdvanceStringIndex(S, thisIndex, fullUnicode);
			Set(R, 'lastIndex', nextIndex, true);
		}
		return CreateIterResultObject(match, false);
	}
	SLOT.set(O, '[[Done]]', true);
	return CreateIterResultObject(match, false);
};
CreateMethodProperty(RegExpStringIterator.prototype, 'next', RegExpStringIteratorNext);

if (hasSymbols) {
	if (Symbol.toStringTag) {
		if ($defineProperty) {
			$defineProperty(RegExpStringIterator.prototype, Symbol.toStringTag, {
				configurable: true,
				enumerable: false,
				value: 'RegExp String Iterator',
				writable: false
			});
		} else {
			RegExpStringIterator.prototype[Symbol.toStringTag] = 'RegExp String Iterator';
		}
	}

	if (Symbol.iterator && typeof RegExpStringIterator.prototype[Symbol.iterator] !== 'function') {
		var iteratorFn = function SymbolIterator() {
			return this;
		};
		CreateMethodProperty(RegExpStringIterator.prototype, Symbol.iterator, iteratorFn);
	}
}

// https://262.ecma-international.org/11.0/#sec-createregexpstringiterator
module.exports = function CreateRegExpStringIterator(R, S, global, fullUnicode) {
	// assert R.global === global && R.unicode === fullUnicode?
	return new RegExpStringIterator(R, S, global, fullUnicode);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');
var MonthFromTime = require('./MonthFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.5

module.exports = function DateFromTime(t) {
	var m = MonthFromTime(t);
	var d = DayWithinYear(t);
	if (m === 0) {
		return d + 1;
	}
	if (m === 1) {
		return d - 30;
	}
	var leap = InLeapYear(t);
	if (m === 2) {
		return d - 58 - leap;
	}
	if (m === 3) {
		return d - 89 - leap;
	}
	if (m === 4) {
		return d - 119 - leap;
	}
	if (m === 5) {
		return d - 150 - leap;
	}
	if (m === 6) {
		return d - 180 - leap;
	}
	if (m === 7) {
		return d - 211 - leap;
	}
	if (m === 8) {
		return d - 242 - leap;
	}
	if (m === 9) {
		return d - 272 - leap;
	}
	if (m === 10) {
		return d - 303 - leap;
	}
	if (m === 11) {
		return d - 333 - leap;
	}
	throw new $EvalError('Assertion failed: MonthFromTime returned an impossible value: ' + m);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var weekdays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];

var $isNaN = require('../helpers/isNaN');
var padTimeComponent = require('../helpers/padTimeComponent');

var Type = require('./Type');
var WeekDay = require('./WeekDay');
var MonthFromTime = require('./MonthFromTime');
var YearFromTime = require('./YearFromTime');
var DateFromTime = require('./DateFromTime');

// https://262.ecma-international.org/9.0/#sec-datestring

module.exports = function DateString(tv) {
	if (Type(tv) !== 'Number' || $isNaN(tv)) {
		throw new $TypeError('Assertion failed: `tv` must be a non-NaN Number');
	}
	var weekday = weekdays[WeekDay(tv)];
	var month = months[MonthFromTime(tv)];
	var day = padTimeComponent(DateFromTime(tv));
	var year = padTimeComponent(YearFromTime(tv), 4);
	return weekday + '\x20' + month + '\x20' + day + '\x20' + year;
};
'use strict';

var floor = require('./floor');

var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.2

module.exports = function Day(t) {
	return floor(t / msPerDay);
};
'use strict';

var floor = require('./floor');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function DayFromYear(y) {
	return (365 * (y - 1970)) + floor((y - 1969) / 4) - floor((y - 1901) / 100) + floor((y - 1601) / 400);
};

'use strict';

var Day = require('./Day');
var DayFromYear = require('./DayFromYear');
var YearFromTime = require('./YearFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.4

module.exports = function DayWithinYear(t) {
	return Day(t) - DayFromYear(YearFromTime(t));
};
'use strict';

var modulo = require('./modulo');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function DaysInYear(y) {
	if (modulo(y, 4) !== 0) {
		return 365;
	}
	if (modulo(y, 100) !== 0) {
		return 366;
	}
	if (modulo(y, 400) !== 0) {
		return 365;
	}
	return 366;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow

module.exports = function DefinePropertyOrThrow(O, P, desc) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	var Desc = isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, desc) ? desc : ToPropertyDescriptor(desc);
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc is not a valid Property Descriptor');
	}

	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		Desc
	);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-deletepropertyorthrow

module.exports = function DeletePropertyOrThrow(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// eslint-disable-next-line no-param-reassign
	var success = delete O[P];
	if (!success) {
		throw new $TypeError('Attempt to delete property failed.');
	}
	return success;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var objectKeys = require('object-keys');

var callBound = require('call-bind/callBound');

var callBind = require('call-bind');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
var $pushApply = callBind.apply(GetIntrinsic('%Array.prototype.push%'));

var forEach = require('../helpers/forEach');

var Type = require('./Type');

// https://262.ecma-international.org/8.0/#sec-enumerableownproperties

module.exports = function EnumerableOwnPropertyNames(O, kind) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	var keys = objectKeys(O);
	if (kind === 'key') {
		return keys;
	}
	if (kind === 'value' || kind === 'key+value') {
		var results = [];
		forEach(keys, function (key) {
			if ($isEnumerable(O, key)) {
				$pushApply(results, [
					kind === 'value' ? O[key] : [key, O[key]]
				]);
			}
		});
		return results;
	}
	throw new $TypeError('Assertion failed: "kind" is not "key", "value", or "key+value": ' + kind);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');

var Call = require('./Call');
var CreateDataPropertyOrThrow = require('./CreateDataPropertyOrThrow');
var Get = require('./Get');
var HasProperty = require('./HasProperty');
var IsArray = require('./IsArray');
var LengthOfArrayLike = require('./LengthOfArrayLike');
var ToString = require('./ToString');

// https://262.ecma-international.org/11.0/#sec-flattenintoarray

// eslint-disable-next-line max-params
module.exports = function FlattenIntoArray(target, source, sourceLen, start, depth) {
	var mapperFunction;
	if (arguments.length > 5) {
		mapperFunction = arguments[5];
	}

	var targetIndex = start;
	var sourceIndex = 0;
	while (sourceIndex < sourceLen) {
		var P = ToString(sourceIndex);
		var exists = HasProperty(source, P);
		if (exists === true) {
			var element = Get(source, P);
			if (typeof mapperFunction !== 'undefined') {
				if (arguments.length <= 6) {
					throw new $TypeError('Assertion failed: thisArg is required when mapperFunction is provided');
				}
				element = Call(mapperFunction, arguments[6], [element, sourceIndex, source]);
			}
			var shouldFlatten = false;
			if (depth > 0) {
				shouldFlatten = IsArray(element);
			}
			if (shouldFlatten) {
				var elementLen = LengthOfArrayLike(element);
				targetIndex = FlattenIntoArray(target, element, elementLen, targetIndex, depth - 1);
			} else {
				if (targetIndex >= MAX_SAFE_INTEGER) {
					throw new $TypeError('index too large');
				}
				CreateDataPropertyOrThrow(target, ToString(targetIndex), element);
				targetIndex += 1;
			}
		}
		sourceIndex += 1;
	}

	return targetIndex;
};
'use strict';

var assertRecord = require('../helpers/assertRecord');
var fromPropertyDescriptor = require('../helpers/fromPropertyDescriptor');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-frompropertydescriptor

module.exports = function FromPropertyDescriptor(Desc) {
	if (typeof Desc !== 'undefined') {
		assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
	}

	return fromPropertyDescriptor(Desc);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var inspect = require('object-inspect');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-get-o-p

module.exports = function Get(O, P) {
	// 7.3.1.1
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	// 7.3.1.2
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true, got ' + inspect(P));
	}
	// 7.3.1.3
	return O[P];
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $asyncIterator = GetIntrinsic('%Symbol.asyncIterator%', true);

var inspect = require('object-inspect');
var hasSymbols = require('has-symbols')();

var getIteratorMethod = require('../helpers/getIteratorMethod');
var AdvanceStringIndex = require('./AdvanceStringIndex');
var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsArray = require('./IsArray');
var Type = require('./Type');

// https://262.ecma-international.org/9.0/#sec-getiterator
module.exports = function GetIterator(obj, hint, method) {
	var actualHint = hint;
	if (arguments.length < 2) {
		actualHint = 'sync';
	}
	if (actualHint !== 'sync' && actualHint !== 'async') {
		throw new $TypeError("Assertion failed: `hint` must be one of 'sync' or 'async', got " + inspect(hint));
	}

	var actualMethod = method;
	if (arguments.length < 3) {
		if (actualHint === 'async') {
			if (hasSymbols && $asyncIterator) {
				actualMethod = GetMethod(obj, $asyncIterator);
			}
			if (actualMethod === undefined) {
				throw new $TypeError("async from sync iterators aren't currently supported");
			}
		} else {
			actualMethod = getIteratorMethod(
				{
					AdvanceStringIndex: AdvanceStringIndex,
					GetMethod: GetMethod,
					IsArray: IsArray
				},
				obj
			);
		}
	}
	var iterator = Call(actualMethod, obj);
	if (Type(iterator) !== 'Object') {
		throw new $TypeError('iterator must return an object');
	}

	return iterator;

	// TODO: This should return an IteratorRecord
	/*
	var nextMethod = GetV(iterator, 'next');
	return {
		'[[Iterator]]': iterator,
		'[[NextMethod]]': nextMethod,
		'[[Done]]': false
	};
	*/
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');

var assertRecord = require('../helpers/assertRecord');

// https://ecma-international.org/ecma-262/13.0/#sec-getmatchindexpair

module.exports = function GetMatchIndexPair(S, match) {
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	assertRecord(Type, 'Match Record', 'match', match);

	if (!(match['[[StartIndex]]'] <= S.length)) {
		throw new $TypeError('`match` [[StartIndex]] must be a non-negative integer <= the length of S');
	}
	if (!(match['[[EndIndex]]'] <= S.length)) {
		throw new $TypeError('`match` [[EndIndex]] must be an integer between [[StartIndex]] and the length of S, inclusive');
	}
	return [match['[[StartIndex]]'], match['[[EndIndex]]']];
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var substring = require('./substring');
var Type = require('./Type');

var assertRecord = require('../helpers/assertRecord');

// https://ecma-international.org/ecma-262/13.0/#sec-getmatchstring

module.exports = function GetMatchString(S, match) {
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	assertRecord(Type, 'Match Record', 'match', match);

	if (!(match['[[StartIndex]]'] <= S.length)) {
		throw new $TypeError('`match` [[StartIndex]] must be a non-negative integer <= the length of S');
	}
	if (!(match['[[EndIndex]]'] <= S.length)) {
		throw new $TypeError('`match` [[EndIndex]] must be an integer between [[StartIndex]] and the length of S, inclusive');
	}
	return substring(S, match['[[StartIndex]]'], match['[[EndIndex]]']);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var GetV = require('./GetV');
var IsCallable = require('./IsCallable');
var IsPropertyKey = require('./IsPropertyKey');

// https://ecma-international.org/ecma-262/6.0/#sec-getmethod

module.exports = function GetMethod(O, P) {
	// 7.3.9.1
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// 7.3.9.2
	var func = GetV(O, P);

	// 7.3.9.4
	if (func == null) {
		return void 0;
	}

	// 7.3.9.5
	if (!IsCallable(func)) {
		throw new $TypeError(P + 'is not a function');
	}

	// 7.3.9.6
	return func;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var hasSymbols = require('has-symbols')();

var $TypeError = GetIntrinsic('%TypeError%');

var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%', true);
var $gOPS = hasSymbols && GetIntrinsic('%Object.getOwnPropertySymbols%', true);
var keys = require('object-keys');

var esType = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getownpropertykeys

module.exports = function GetOwnPropertyKeys(O, Type) {
	if (esType(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (Type === 'Symbol') {
		return $gOPS ? $gOPS(O) : [];
	}
	if (Type === 'String') {
		if (!$gOPN) {
			return keys(O);
		}
		return $gOPN(O);
	}
	throw new $TypeError('Assertion failed: `Type` must be `"String"` or `"Symbol"`');
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsCallable = require('./IsCallable');
var IsConstructor = require('./IsConstructor');

// https://ecma-international.org/ecma-262/12.0/#sec-getpromiseresolve

module.exports = function GetPromiseResolve(promiseConstructor) {
	if (!IsConstructor(promiseConstructor)) {
		throw new $TypeError('Assertion failed: `promiseConstructor` must be a constructor');
	}
	var promiseResolve = Get(promiseConstructor, 'resolve');
	if (IsCallable(promiseResolve) === false) {
		throw new $TypeError('`resolve` method is not callable');
	}
	return promiseResolve;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Function = GetIntrinsic('%Function%');
var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsConstructor = require('./IsConstructor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getprototypefromconstructor

module.exports = function GetPrototypeFromConstructor(constructor, intrinsicDefaultProto) {
	var intrinsic = GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
	if (!IsConstructor(constructor)) {
		throw new $TypeError('Assertion failed: `constructor` must be a constructor');
	}
	var proto = Get(constructor, 'prototype');
	if (Type(proto) !== 'Object') {
		if (!(constructor instanceof $Function)) {
			// ignore other realms, for now
			throw new $TypeError('cross-realm constructors not currently supported');
		}
		proto = intrinsic;
	}
	return proto;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');

var IsIntegralNumber = require('./IsIntegralNumber');
var StringToCodePoints = require('./StringToCodePoints');
var Type = require('./Type');

var $indexOf = callBound('String.prototype.indexOf');

// https://ecma-international.org/ecma-262/13.0/#sec-getstringindex

module.exports = function GetStringIndex(S, e) {
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	if (!IsIntegralNumber(e) || e < 0) {
		throw new $TypeError('Assertion failed: `e` must be a non-negative integer');
	}

	if (S === '') {
		return 0;
	}
	var codepoints = StringToCodePoints(S);
	var eUTF = e >= codepoints.length ? S.length : $indexOf(S, codepoints[e]);
	return eUTF;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');
var regexTester = require('../helpers/regexTester');
var every = require('../helpers/every');

var $charAt = callBound('String.prototype.charAt');
var $strSlice = callBound('String.prototype.slice');
var $indexOf = callBound('String.prototype.indexOf');
var $parseInt = parseInt;

var isDigit = regexTester(/^[0-9]$/);

var inspect = require('object-inspect');

var Get = require('./Get');
var IsArray = require('./IsArray');
var IsIntegralNumber = require('./IsIntegralNumber');
var ToObject = require('./ToObject');
var ToString = require('./ToString');
var Type = require('./Type');

var canDistinguishSparseFromUndefined = 0 in [undefined]; // IE 6 - 8 have a bug where this returns false

var isStringOrHole = function (capture, index, arr) {
	return Type(capture) === 'String' || (canDistinguishSparseFromUndefined ? !(index in arr) : Type(capture) === 'Undefined');
};

// http://www.ecma-international.org/ecma-262/12.0/#sec-getsubstitution

// eslint-disable-next-line max-statements, max-params, max-lines-per-function
module.exports = function GetSubstitution(matched, str, position, captures, namedCaptures, replacement) {
	if (Type(matched) !== 'String') {
		throw new $TypeError('Assertion failed: `matched` must be a String');
	}
	var matchLength = matched.length;

	if (Type(str) !== 'String') {
		throw new $TypeError('Assertion failed: `str` must be a String');
	}
	var stringLength = str.length;

	if (!IsIntegralNumber(position) || position < 0 || position > stringLength) {
		throw new $TypeError('Assertion failed: `position` must be a nonnegative integer, and less than or equal to the length of `string`, got ' + inspect(position));
	}

	if (!IsArray(captures) || !every(captures, isStringOrHole)) {
		throw new $TypeError('Assertion failed: `captures` must be a possibly-empty List of Strings, got ' + inspect(captures));
	}

	if (Type(replacement) !== 'String') {
		throw new $TypeError('Assertion failed: `replacement` must be a String');
	}

	var tailPos = position + matchLength;
	var m = captures.length;
	if (Type(namedCaptures) !== 'Undefined') {
		namedCaptures = ToObject(namedCaptures); // eslint-disable-line no-param-reassign
	}

	var result = '';
	for (var i = 0; i < replacement.length; i += 1) {
		// if this is a $, and it's not the end of the replacement
		var current = $charAt(replacement, i);
		var isLast = (i + 1) >= replacement.length;
		var nextIsLast = (i + 2) >= replacement.length;
		if (current === '$' && !isLast) {
			var next = $charAt(replacement, i + 1);
			if (next === '$') {
				result += '$';
				i += 1;
			} else if (next === '&') {
				result += matched;
				i += 1;
			} else if (next === '`') {
				result += position === 0 ? '' : $strSlice(str, 0, position - 1);
				i += 1;
			} else if (next === "'") {
				result += tailPos >= stringLength ? '' : $strSlice(str, tailPos);
				i += 1;
			} else {
				var nextNext = nextIsLast ? null : $charAt(replacement, i + 2);
				if (isDigit(next) && next !== '0' && (nextIsLast || !isDigit(nextNext))) {
					// $1 through $9, and not followed by a digit
					var n = $parseInt(next, 10);
					// if (n > m, impl-defined)
					result += n <= m && Type(captures[n - 1]) === 'Undefined' ? '' : captures[n - 1];
					i += 1;
				} else if (isDigit(next) && (nextIsLast || isDigit(nextNext))) {
					// $00 through $99
					var nn = next + nextNext;
					var nnI = $parseInt(nn, 10) - 1;
					// if nn === '00' or nn > m, impl-defined
					result += nn <= m && Type(captures[nnI]) === 'Undefined' ? '' : captures[nnI];
					i += 2;
				} else if (next === '<') {
					// eslint-disable-next-line max-depth
					if (Type(namedCaptures) === 'Undefined') {
						result += '$<';
						i += 2;
					} else {
						var endIndex = $indexOf(replacement, '>', i);
						// eslint-disable-next-line max-depth
						if (endIndex > -1) {
							var groupName = $strSlice(replacement, i + '$<'.length, endIndex);
							var capture = Get(namedCaptures, groupName);
							// eslint-disable-next-line max-depth
							if (Type(capture) !== 'Undefined') {
								result += ToString(capture);
							}
							i += ('<' + groupName + '>').length;
						}
					}
				} else {
					result += '$';
				}
			}
		} else {
			// the final $, or else not a $
			result += $charAt(replacement, i);
		}
	}
	return result;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var ToObject = require('./ToObject');

// https://ecma-international.org/ecma-262/6.0/#sec-getv

module.exports = function GetV(V, P) {
	// 7.3.2.1
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// 7.3.2.2-3
	var O = ToObject(V);

	// 7.3.2.4
	return O[P];
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var has = require('has');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty

module.exports = function HasOwnProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	return has(O, P);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-hasproperty

module.exports = function HasProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	return P in O;
};
'use strict';

var floor = require('./floor');
var modulo = require('./modulo');

var timeConstants = require('../helpers/timeConstants');
var msPerHour = timeConstants.msPerHour;
var HoursPerDay = timeConstants.HoursPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function HourFromTime(t) {
	return modulo(floor(t / msPerHour), HoursPerDay);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DaysInYear = require('./DaysInYear');
var YearFromTime = require('./YearFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function InLeapYear(t) {
	var days = DaysInYear(YearFromTime(t));
	if (days === 365) {
		return 0;
	}
	if (days === 366) {
		return 1;
	}
	throw new $EvalError('Assertion failed: there are not 365 or 366 days in a year, got: ' + days);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var CreateNonEnumerableDataPropertyOrThrow = require('./CreateNonEnumerableDataPropertyOrThrow');
var Get = require('./Get');
var HasProperty = require('./HasProperty');
var Type = require('./Type');

// https://262.ecma-international.org/13.0/#sec-installerrorcause

module.exports = function InstallErrorCause(O, options) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (Type(options) === 'Object' && HasProperty(options, 'cause')) {
		var cause = Get(options, 'cause');
		CreateNonEnumerableDataPropertyOrThrow(O, 'cause', cause);
	}
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $hasInstance = GetIntrinsic('Symbol.hasInstance', true);

var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsCallable = require('./IsCallable');
var OrdinaryHasInstance = require('./OrdinaryHasInstance');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-instanceofoperator

module.exports = function InstanceofOperator(O, C) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	var instOfHandler = $hasInstance ? GetMethod(C, $hasInstance) : void 0;
	if (typeof instOfHandler !== 'undefined') {
		return ToBoolean(Call(instOfHandler, C, [O]));
	}
	if (!IsCallable(C)) {
		throw new $TypeError('`C` is not Callable');
	}
	return OrdinaryHasInstance(C, O);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var IsArray = require('./IsArray');
var GetV = require('./GetV');
var IsPropertyKey = require('./IsPropertyKey');

// https://ecma-international.org/ecma-262/6.0/#sec-invoke

module.exports = function Invoke(O, P) {
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	var argumentsList = arguments.length > 2 ? arguments[2] : [];
	if (!IsArray(argumentsList)) {
		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
	}
	var func = GetV(O, P);
	return Call(func, O, argumentsList);
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isaccessordescriptor

module.exports = function IsAccessorDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Get]]') && !has(Desc, '[[Set]]')) {
		return false;
	}

	return true;
};
'use strict';

// https://ecma-international.org/ecma-262/6.0/#sec-isarray
module.exports = require('../helpers/IsArray');
'use strict';

// https://262.ecma-international.org/11.0/#sec-isbigintelementtype

module.exports = function IsBigIntElementType(type) {
	return type === 'BigUint64' || type === 'BigInt64';
};
'use strict';

// http://262.ecma-international.org/5.1/#sec-9.11

module.exports = require('is-callable');
'use strict';

var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');

// https://262.ecma-international.org/13.0/#sec-iscompatiblepropertydescriptor

module.exports = function IsCompatiblePropertyDescriptor(Extensible, Desc, Current) {
	return ValidateAndApplyPropertyDescriptor(undefined, '', Extensible, Desc, Current);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $isConcatSpreadable = GetIntrinsic('%Symbol.isConcatSpreadable%', true);

var Get = require('./Get');
var IsArray = require('./IsArray');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable

module.exports = function IsConcatSpreadable(O) {
	if (Type(O) !== 'Object') {
		return false;
	}
	if ($isConcatSpreadable) {
		var spreadable = Get(O, $isConcatSpreadable);
		if (typeof spreadable !== 'undefined') {
			return ToBoolean(spreadable);
		}
	}
	return IsArray(O);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic.js');

var $construct = GetIntrinsic('%Reflect.construct%', true);

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
try {
	DefinePropertyOrThrow({}, '', { '[[Get]]': function () {} });
} catch (e) {
	// Accessor properties aren't supported
	DefinePropertyOrThrow = null;
}

// https://ecma-international.org/ecma-262/6.0/#sec-isconstructor

if (DefinePropertyOrThrow && $construct) {
	var isConstructorMarker = {};
	var badArrayLike = {};
	DefinePropertyOrThrow(badArrayLike, 'length', {
		'[[Get]]': function () {
			throw isConstructorMarker;
		},
		'[[Enumerable]]': true
	});

	module.exports = function IsConstructor(argument) {
		try {
			// `Reflect.construct` invokes `IsConstructor(target)` before `Get(args, 'length')`:
			$construct(argument, badArrayLike);
		} catch (err) {
			return err === isConstructorMarker;
		}
	};
} else {
	module.exports = function IsConstructor(argument) {
		// unfortunately there's no way to truly check this without try/catch `new argument` in old environments
		return typeof argument === 'function' && !!argument.prototype;
	};
}
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isdatadescriptor

module.exports = function IsDataDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Value]]') && !has(Desc, '[[Writable]]')) {
		return false;
	}

	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $preventExtensions = GetIntrinsic('%Object.preventExtensions%', true);
var $isExtensible = GetIntrinsic('%Object.isExtensible%', true);

var isPrimitive = require('../helpers/isPrimitive');

// https://ecma-international.org/ecma-262/6.0/#sec-isextensible-o

module.exports = $preventExtensions
	? function IsExtensible(obj) {
		return !isPrimitive(obj) && $isExtensible(obj);
	}
	: function IsExtensible(obj) {
		return !isPrimitive(obj);
	};
'use strict';

var assertRecord = require('../helpers/assertRecord');

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isgenericdescriptor

module.exports = function IsGenericDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!IsAccessorDescriptor(Desc) && !IsDataDescriptor(Desc)) {
		return true;
	}

	return false;
};
'use strict';

var abs = require('./abs');
var floor = require('./floor');
var Type = require('./Type');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');

// https://tc39.es/ecma262/#sec-isintegralnumber

module.exports = function IsIntegralNumber(argument) {
	if (Type(argument) !== 'Number' || $isNaN(argument) || !$isFinite(argument)) {
		return false;
	}
	var absValue = abs(argument);
	return floor(absValue) === absValue;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Number = GetIntrinsic('%Number%');
var $TypeError = GetIntrinsic('%TypeError%');

var $isNaN = require('../helpers/isNaN');

var IsStringPrefix = require('./IsStringPrefix');
var StringToBigInt = require('./StringToBigInt');
var ToNumeric = require('./ToNumeric');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

var BigIntLessThan = require('./BigInt/lessThan');
var NumberLessThan = require('./Number/lessThan');

// https://262.ecma-international.org/13.0/#sec-islessthan

// eslint-disable-next-line max-statements, max-lines-per-function
module.exports = function IsLessThan(x, y, LeftFirst) {
	if (Type(LeftFirst) !== 'Boolean') {
		throw new $TypeError('Assertion failed: LeftFirst argument must be a Boolean');
	}
	var px;
	var py;
	if (LeftFirst) {
		px = ToPrimitive(x, $Number);
		py = ToPrimitive(y, $Number);
	} else {
		py = ToPrimitive(y, $Number);
		px = ToPrimitive(x, $Number);
	}
	var pxType = Type(px);
	var pyType = Type(py);
	if (pxType === 'String' && pyType === 'String') {
		if (IsStringPrefix(py, px)) {
			return false;
		}
		if (IsStringPrefix(px, py)) {
			return true;
		}
		/*
		c. Let k be the smallest non-negative integer such that the code unit at index k within px is different from the code unit at index k within py. (There must be such a k, for neither String is a prefix of the other.)
		d. Let m be the integer that is the numeric value of the code unit at index k within px.
		e. Let n be the integer that is the numeric value of the code unit at index k within py.
		f. If m < n, return true. Otherwise, return false.
		*/
		return px < py; // both strings, neither a prefix of the other. shortcut for steps 3 c-f
	}

	var nx;
	var ny;
	if (pxType === 'BigInt' && pyType === 'String') {
		ny = StringToBigInt(py);
		if ($isNaN(ny)) {
			return void undefined;
		}
		return BigIntLessThan(px, ny);
	}
	if (pxType === 'String' && pyType === 'BigInt') {
		nx = StringToBigInt(px);
		if ($isNaN(nx)) {
			return void undefined;
		}
		return BigIntLessThan(nx, py);
	}

	nx = ToNumeric(px);
	ny = ToNumeric(py);

	var nxType = Type(nx);
	if (nxType === Type(ny)) {
		return nxType === 'Number' ? NumberLessThan(nx, ny) : BigIntLessThan(nx, ny);
	}

	if ($isNaN(nx) || $isNaN(ny)) {
		return void undefined;
	}

	if (nx === -Infinity || ny === Infinity) {
		return true;
	}
	if (nx === Infinity || ny === -Infinity) {
		return false;
	}

	return nx < ny; // by now, these are both nonzero, finite, and not equal
};
'use strict';

var isFinite = require('../helpers/isFinite');
var isNaN = require('../helpers/isNaN');

var IsStrictlyEqual = require('./IsStrictlyEqual');
var StringToBigInt = require('./StringToBigInt');
var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

// https://262.ecma-international.org/13.0/#sec-islooselyequal

module.exports = function IsLooselyEqual(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType === yType) {
		return IsStrictlyEqual(x, y);
	}
	if (x == null && y == null) {
		return true;
	}
	if (xType === 'Number' && yType === 'String') {
		return IsLooselyEqual(x, ToNumber(y));
	}
	if (xType === 'String' && yType === 'Number') {
		return IsLooselyEqual(ToNumber(x), y);
	}
	if (xType === 'BigInt' && yType === 'String') {
		var n = StringToBigInt(y);
		if (isNaN(n)) {
			return false;
		}
		return IsLooselyEqual(x, n);
	}
	if (xType === 'String' && yType === 'BigInt') {
		return IsLooselyEqual(y, x);
	}
	if (xType === 'Boolean') {
		return IsLooselyEqual(ToNumber(x), y);
	}
	if (yType === 'Boolean') {
		return IsLooselyEqual(x, ToNumber(y));
	}
	if ((xType === 'String' || xType === 'Number' || xType === 'Symbol' || xType === 'BigInt') && yType === 'Object') {
		return IsLooselyEqual(x, ToPrimitive(y));
	}
	if (xType === 'Object' && (yType === 'String' || yType === 'Number' || yType === 'Symbol' || yType === 'BigInt')) {
		return IsLooselyEqual(ToPrimitive(x), y);
	}
	if ((xType === 'BigInt' && yType === 'Number') || (xType === 'Number' && yType === 'BigInt')) {
		if (!isFinite(x) || !isFinite(y)) {
			return false;
		}
		// eslint-disable-next-line eqeqeq
		return x == y; // shortcut for step 13.b.
	}
	return false;
};
'use strict';

var IsUnclampedIntegerElementType = require('./IsUnclampedIntegerElementType');
var IsBigIntElementType = require('./IsBigIntElementType');

// https://262.ecma-international.org/11.0/#sec-isnotearconfiguration

module.exports = function IsNoTearConfiguration(type, order) {
	if (IsUnclampedIntegerElementType(type)) {
		return true;
	}
	if (IsBigIntElementType(type) && order !== 'Init' && order !== 'Unordered') {
		return true;
	}
	return false;
};
'use strict';

var callBound = require('call-bind/callBound');

var $PromiseThen = callBound('Promise.prototype.then', true);

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ispromise

module.exports = function IsPromise(x) {
	if (Type(x) !== 'Object') {
		return false;
	}
	if (!$PromiseThen) { // Promises are not supported
		return false;
	}
	try {
		$PromiseThen(x); // throws if not a promise
	} catch (e) {
		return false;
	}
	return true;
};
'use strict';

// https://ecma-international.org/ecma-262/6.0/#sec-ispropertykey

module.exports = function IsPropertyKey(argument) {
	return typeof argument === 'string' || typeof argument === 'symbol';
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $match = GetIntrinsic('%Symbol.match%', true);

var hasRegExpMatcher = require('is-regex');

var ToBoolean = require('./ToBoolean');

// https://ecma-international.org/ecma-262/6.0/#sec-isregexp

module.exports = function IsRegExp(argument) {
	if (!argument || typeof argument !== 'object') {
		return false;
	}
	if ($match) {
		var isRegExp = argument[$match];
		if (typeof isRegExp !== 'undefined') {
			return ToBoolean(isRegExp);
		}
	}
	return hasRegExpMatcher(argument);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');

var isSharedArrayBuffer = require('is-shared-array-buffer');

// https://262.ecma-international.org/8.0/#sec-issharedarraybuffer

module.exports = function IsSharedArrayBuffer(obj) {
	if (Type(obj) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	return isSharedArrayBuffer(obj);
};
'use strict';

var SameValueNonNumeric = require('./SameValueNonNumeric');
var Type = require('./Type');
var BigIntEqual = require('./BigInt/equal');
var NumberEqual = require('./Number/equal');

// https://262.ecma-international.org/13.0/#sec-isstrictlyequal

module.exports = function IsStrictlyEqual(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType !== yType) {
		return false;
	}
	if (xType === 'Number' || xType === 'BigInt') {
		return xType === 'Number' ? NumberEqual(x, y) : BigIntEqual(x, y);
	}
	return SameValueNonNumeric(x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var StringIndexOf = require('./StringIndexOf');
var Type = require('./Type');

// https://262.ecma-international.org/13.0/#sec-isstringprefix

module.exports = function IsStringPrefix(p, q) {
	if (Type(p) !== 'String') {
		throw new $TypeError('Assertion failed: "p" must be a String');
	}

	if (Type(q) !== 'String') {
		throw new $TypeError('Assertion failed: "q" must be a String');
	}

	return StringIndexOf(q, p, 0) === 0;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var CodePointAt = require('./CodePointAt');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');

// https://262.ecma-international.org/13.0/#sec-isstringwellformedunicode

module.exports = function IsStringWellFormedUnicode(string) {
	if (Type(string) !== 'String') {
		throw new $TypeError('Assertion failed: `string` must be a String');
	}
	var strLen = string.length; // step 1
	var k = 0; // step 2
	while (k !== strLen) { // step 3
		var cp = CodePointAt(string, k); // step 3.a
		if (cp['[[IsUnpairedSurrogate]]']) {
			return false; // step 3.b
		}
		k += cp['[[CodeUnitCount]]']; // step 3.c
	}
	return true; // step 4
};
'use strict';

// https://262.ecma-international.org/11.0/#sec-isunclampedintegerelementtype

module.exports = function IsUnclampedIntegerElementType(type) {
	return type === 'Int8'
		|| type === 'Uint8'
		|| type === 'Int16'
		|| type === 'Uint16'
		|| type === 'Int32'
		|| type === 'Uint32';
};
'use strict';

// https://262.ecma-international.org/11.0/#sec-isunsignedelementtype

module.exports = function IsUnsignedElementType(type) {
	return type === 'Uint8'
		|| type === 'Uint8C'
		|| type === 'Uint16'
		|| type === 'Uint32'
		|| type === 'BigUint64';
};
'use strict';

var callBound = require('call-bind/callBound');
var $arrayPush = callBound('Array.prototype.push');

var GetIterator = require('./GetIterator');
var IteratorStep = require('./IteratorStep');
var IteratorValue = require('./IteratorValue');

// https://262.ecma-international.org/12.0/#sec-iterabletolist

module.exports = function IterableToList(items) {
	var iterator;
	if (arguments.length > 1) {
		iterator = GetIterator(items, 'sync', arguments[1]);
	} else {
		iterator = GetIterator(items, 'sync');
	}
	var values = [];
	var next = true;
	while (next) {
		next = IteratorStep(iterator);
		if (next) {
			var nextValue = IteratorValue(next);
			$arrayPush(values, nextValue);
		}
	}
	return values;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose

module.exports = function IteratorClose(iterator, completion) {
	if (Type(iterator) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterator) is not Object');
	}
	if (!IsCallable(completion)) {
		throw new $TypeError('Assertion failed: completion is not a thunk for a Completion Record');
	}
	var completionThunk = completion;

	var iteratorReturn = GetMethod(iterator, 'return');

	if (typeof iteratorReturn === 'undefined') {
		return completionThunk();
	}

	var completionRecord;
	try {
		var innerResult = Call(iteratorReturn, iterator, []);
	} catch (e) {
		// if we hit here, then "e" is the innerResult completion that needs re-throwing

		// if the completion is of type "throw", this will throw.
		completionThunk();
		completionThunk = null; // ensure it's not called twice.

		// if not, then return the innerResult completion
		throw e;
	}
	completionRecord = completionThunk(); // if innerResult worked, then throw if the completion does
	completionThunk = null; // ensure it's not called twice.

	if (Type(innerResult) !== 'Object') {
		throw new $TypeError('iterator .return must return an object');
	}

	return completionRecord;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete

module.exports = function IteratorComplete(iterResult) {
	if (Type(iterResult) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
	}
	return ToBoolean(Get(iterResult, 'done'));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Invoke = require('./Invoke');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratornext

module.exports = function IteratorNext(iterator, value) {
	var result = Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);
	if (Type(result) !== 'Object') {
		throw new $TypeError('iterator next must return an object');
	}
	return result;
};
'use strict';

var IteratorComplete = require('./IteratorComplete');
var IteratorNext = require('./IteratorNext');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep

module.exports = function IteratorStep(iterator) {
	var result = IteratorNext(iterator);
	var done = IteratorComplete(result);
	return done === true ? false : result;
};

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue

module.exports = function IteratorValue(iterResult) {
	if (Type(iterResult) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
	}
	return Get(iterResult, 'value');
};

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var ToLength = require('./ToLength');
var Type = require('./Type');

// https://262.ecma-international.org/11.0/#sec-lengthofarraylike

module.exports = function LengthOfArrayLike(obj) {
	if (Type(obj) !== 'Object') {
		throw new $TypeError('Assertion failed: `obj` must be an Object');
	}
	return ToLength(Get(obj, 'length'));
};

// TODO: use this all over
'use strict';

var $isFinite = require('../helpers/isFinite');
var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.13

module.exports = function MakeDate(day, time) {
	if (!$isFinite(day) || !$isFinite(time)) {
		return NaN;
	}
	return (day * msPerDay) + time;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $DateUTC = GetIntrinsic('%Date.UTC%');

var $isFinite = require('../helpers/isFinite');

var DateFromTime = require('./DateFromTime');
var Day = require('./Day');
var floor = require('./floor');
var modulo = require('./modulo');
var MonthFromTime = require('./MonthFromTime');
var ToIntegerOrInfinity = require('./ToIntegerOrInfinity');
var YearFromTime = require('./YearFromTime');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.12

module.exports = function MakeDay(year, month, date) {
	if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) {
		return NaN;
	}
	var y = ToIntegerOrInfinity(year);
	var m = ToIntegerOrInfinity(month);
	var dt = ToIntegerOrInfinity(date);
	var ym = y + floor(m / 12);
	if (!$isFinite(ym)) {
		return NaN;
	}
	var mn = modulo(m, 12);
	var t = $DateUTC(ym, mn, 1);
	if (YearFromTime(t) !== ym || MonthFromTime(t) !== mn || DateFromTime(t) !== 1) {
		return NaN;
	}
	return Day(t) + dt - 1;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var ArrayCreate = require('./ArrayCreate');
var CreateDataPropertyOrThrow = require('./CreateDataPropertyOrThrow');
var GetMatchIndexPair = require('./GetMatchIndexPair');
var IsArray = require('./IsArray');
var OrdinaryObjectCreate = require('./OrdinaryObjectCreate');
var ToString = require('./ToString');
var Type = require('./Type');

var every = require('../helpers/every');
var isMatchRecord = require('../helpers/isMatchRecord');

var isStringOrUndefined = function isStringOrUndefined(s) {
	return typeof s === 'undefined' || typeof s === 'string';
};

var isMatchRecordOrUndefined = function isMatchRecordOrUndefined(m) {
	return typeof m === 'undefined' || isMatchRecord(m);
};

var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1;

// https://ecma-international.org/ecma-262/13.0/#sec-getmatchindexpair

module.exports = function MakeMatchIndicesIndexPairArray(S, indices, groupNames, hasGroups) {
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	if (!IsArray(indices) || !every(indices, isMatchRecordOrUndefined)) {
		throw new $TypeError('Assertion failed: `indices` must be a List of either Match Records or `undefined`');
	}
	if (!IsArray(groupNames) || !every(groupNames, isStringOrUndefined)) {
		throw new $TypeError('Assertion failed: `groupNames` must be a List of either Strings or `undefined`');
	}
	if (Type(hasGroups) !== 'Boolean') {
		throw new $TypeError('Assertion failed: `hasGroups` must be a Boolean');
	}

	var n = indices.length; // step 1
	if (!(n < MAX_ARRAY_LENGTH)) {
		throw new $TypeError('Assertion failed: `indices` length must be less than the max array size, 2**32 - 1');
	}
	if (groupNames.length !== n - 1) {
		throw new $TypeError('Assertion failed: `groupNames` must have exactly one fewer item than `indices`');
	}

	var A = ArrayCreate(n); // step 5
	var groups = hasGroups ? OrdinaryObjectCreate(null) : void undefined; // step 6-7
	CreateDataPropertyOrThrow(A, 'groups', groups); // step 8

	for (var i = 0; i < n; i += 1) { // step 9
		var matchIndices = indices[i]; // step 9.a
		// eslint-disable-next-line no-negated-condition
		var matchIndexPair = typeof matchIndices !== 'undefined' ? GetMatchIndexPair(S, matchIndices) : void undefined; // step 9.b-9.c
		CreateDataPropertyOrThrow(A, ToString(i), matchIndexPair); // step 9.d
		if (i > 0 && typeof groupNames[i - 1] !== 'undefined') { // step 9.e
			if (!groups) {
				throw new $TypeError('if `hasGroups` is `false`, `groupNames` can only contain `undefined` values');
			}
			CreateDataPropertyOrThrow(groups, groupNames[i - 1], matchIndexPair); // step 9.e.i
		}
	}
	return A; // step 10
};
'use strict';

var $isFinite = require('../helpers/isFinite');
var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var msPerMinute = timeConstants.msPerMinute;
var msPerHour = timeConstants.msPerHour;

var ToIntegerOrInfinity = require('./ToIntegerOrInfinity');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.11

module.exports = function MakeTime(hour, min, sec, ms) {
	if (!$isFinite(hour) || !$isFinite(min) || !$isFinite(sec) || !$isFinite(ms)) {
		return NaN;
	}
	var h = ToIntegerOrInfinity(hour);
	var m = ToIntegerOrInfinity(min);
	var s = ToIntegerOrInfinity(sec);
	var milli = ToIntegerOrInfinity(ms);
	var t = (h * msPerHour) + (m * msPerMinute) + (s * msPerSecond) + milli;
	return t;
};
'use strict';

var floor = require('./floor');
var modulo = require('./modulo');

var timeConstants = require('../helpers/timeConstants');
var msPerMinute = timeConstants.msPerMinute;
var MinutesPerHour = timeConstants.MinutesPerHour;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function MinFromTime(t) {
	return modulo(floor(t / msPerMinute), MinutesPerHour);
};
'use strict';

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');

// https://262.ecma-international.org/5.1/#sec-15.9.1.4

module.exports = function MonthFromTime(t) {
	var day = DayWithinYear(t);
	if (0 <= day && day < 31) {
		return 0;
	}
	var leap = InLeapYear(t);
	if (31 <= day && day < (59 + leap)) {
		return 1;
	}
	if ((59 + leap) <= day && day < (90 + leap)) {
		return 2;
	}
	if ((90 + leap) <= day && day < (120 + leap)) {
		return 3;
	}
	if ((120 + leap) <= day && day < (151 + leap)) {
		return 4;
	}
	if ((151 + leap) <= day && day < (181 + leap)) {
		return 5;
	}
	if ((181 + leap) <= day && day < (212 + leap)) {
		return 6;
	}
	if ((212 + leap) <= day && day < (243 + leap)) {
		return 7;
	}
	if ((243 + leap) <= day && day < (273 + leap)) {
		return 8;
	}
	if ((273 + leap) <= day && day < (304 + leap)) {
		return 9;
	}
	if ((304 + leap) <= day && day < (334 + leap)) {
		return 10;
	}
	if ((334 + leap) <= day && day < (365 + leap)) {
		return 11;
	}
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var ToInt32 = require('./ToInt32');
var ToUint32 = require('./ToUint32');
var Type = require('./Type');

// https://262.ecma-international.org/11.0/#sec-numberbitwiseop

module.exports = function NumberBitwiseOp(op, x, y) {
	if (op !== '&' && op !== '|' && op !== '^') {
		throw new $TypeError('Assertion failed: `op` must be `&`, `|`, or `^`');
	}
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}
	var lnum = ToInt32(x);
	var rnum = ToUint32(y);
	if (op === '&') {
		return lnum & rnum;
	}
	if (op === '|') {
		return lnum | rnum;
	}
	return lnum ^ rnum;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $RangeError = GetIntrinsic('%RangeError%');
var $TypeError = GetIntrinsic('%TypeError%');

var IsIntegralNumber = require('./IsIntegralNumber');
var Type = require('./Type');

// https://262.ecma-international.org/11.0/#sec-numbertobigint

module.exports = function NumberToBigInt(number) {
	if (Type(number) !== 'Number') {
		throw new $TypeError('Assertion failed: `number` must be a String');
	}
	if (!IsIntegralNumber(number)) {
		throw new $RangeError('The number ' + number + ' cannot be converted to a BigInt because it is not an integer');
	}
	return $BigInt(number);
};
'use strict';

var callBound = require('call-bind/callBound');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var Get = require('./Get');
var ToObject = require('./ToObject');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');

var forEach = require('../helpers/forEach');
var getOwnPropertyDescriptor = require('../helpers/getOwnPropertyDescriptor');
var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');

var $push = callBound('Array.prototype.push');

// https://262.ecma-international.org/6.0/#sec-objectdefineproperties
module.exports = function ObjectDefineProperties(O, Properties) {
	var props = ToObject(Properties); // step 1
	var keys = OwnPropertyKeys(props); // step 2
	var descriptors = []; // step 3

	forEach(keys, function (nextKey) { // step 4
		var propDesc = ToPropertyDescriptor(getOwnPropertyDescriptor(props, nextKey)); // step 4.a
		if (typeof propDesc !== 'undefined' && propDesc['[[Enumerable]]']) { // step 4.b
			var descObj = Get(props, nextKey); // step 4.b.i
			var desc = ToPropertyDescriptor(descObj); // step 4.b.ii
			$push(descriptors, [nextKey, desc]); // step 4.b.iii
		}
	});

	forEach(descriptors, function (pair) { // step 5
		var P = pair[0]; // step 5.a
		var desc = pair[1]; // step 5.b
		desc = FromPropertyDescriptor(desc); // TODO: remove this once DefinePropertyOrThrow is fixed
		DefinePropertyOrThrow(O, P, desc); // step 5.c
	});

	return O; // step 6
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var $TypeError = GetIntrinsic('%TypeError%');

var GetPrototypeFromConstructor = require('./GetPrototypeFromConstructor');
var IsArray = require('./IsArray');
var OrdinaryObjectCreate = require('./OrdinaryObjectCreate');

// https://262.ecma-international.org/6.0/#sec-ordinarycreatefromconstructor

module.exports = function OrdinaryCreateFromConstructor(constructor, intrinsicDefaultProto) {
	GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
	var proto = GetPrototypeFromConstructor(constructor, intrinsicDefaultProto);
	var slots = arguments.length < 3 ? [] : arguments[2];
	if (!IsArray(slots)) {
		throw new $TypeError('Assertion failed: if provided, `internalSlotsList` must be a List');
	}
	return OrdinaryObjectCreate(proto, slots);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var IsPropertyKey = require('./IsPropertyKey');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var SameValue = require('./SameValue');
var Type = require('./Type');
var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinarydefineownproperty

module.exports = function OrdinaryDefineOwnProperty(O, P, Desc) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (!$gOPD) {
		// ES3/IE 8 fallback
		if (IsAccessorDescriptor(Desc)) {
			throw new $SyntaxError('This environment does not support accessor property descriptors.');
		}
		var creatingNormalDataProperty = !(P in O)
			&& Desc['[[Writable]]']
			&& Desc['[[Enumerable]]']
			&& Desc['[[Configurable]]']
			&& '[[Value]]' in Desc;
		var settingExistingDataProperty = (P in O)
			&& (!('[[Configurable]]' in Desc) || Desc['[[Configurable]]'])
			&& (!('[[Enumerable]]' in Desc) || Desc['[[Enumerable]]'])
			&& (!('[[Writable]]' in Desc) || Desc['[[Writable]]'])
			&& '[[Value]]' in Desc;
		if (creatingNormalDataProperty || settingExistingDataProperty) {
			O[P] = Desc['[[Value]]']; // eslint-disable-line no-param-reassign
			return SameValue(O[P], Desc['[[Value]]']);
		}
		throw new $SyntaxError('This environment does not support defining non-writable, non-enumerable, or non-configurable properties');
	}
	var desc = $gOPD(O, P);
	var current = desc && ToPropertyDescriptor(desc);
	var extensible = IsExtensible(O);
	return ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');

var has = require('has');

var IsArray = require('./IsArray');
var IsPropertyKey = require('./IsPropertyKey');
var IsRegExp = require('./IsRegExp');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty

module.exports = function OrdinaryGetOwnProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	if (!has(O, P)) {
		return void 0;
	}
	if (!$gOPD) {
		// ES3 / IE 8 fallback
		var arrayLength = IsArray(O) && P === 'length';
		var regexLastIndex = IsRegExp(O) && P === 'lastIndex';
		return {
			'[[Configurable]]': !(arrayLength || regexLastIndex),
			'[[Enumerable]]': $isEnumerable(O, P),
			'[[Value]]': O[P],
			'[[Writable]]': true
		};
	}
	return ToPropertyDescriptor($gOPD(O, P));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $getProto = require('../helpers/getProto');

var Type = require('./Type');

// https://262.ecma-international.org/7.0/#sec-ordinarygetprototypeof

module.exports = function OrdinaryGetPrototypeOf(O) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!$getProto) {
		throw new $TypeError('This environment does not support fetching prototypes.');
	}
	return $getProto(O);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasinstance

module.exports = function OrdinaryHasInstance(C, O) {
	if (IsCallable(C) === false) {
		return false;
	}
	if (Type(O) !== 'Object') {
		return false;
	}
	var P = Get(C, 'prototype');
	if (Type(P) !== 'Object') {
		throw new $TypeError('OrdinaryHasInstance called on an object with an invalid prototype property.');
	}
	return O instanceof C;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasproperty

module.exports = function OrdinaryHasProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	return P in O;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $ObjectCreate = GetIntrinsic('%Object.create%', true);
var $TypeError = GetIntrinsic('%TypeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');

var IsArray = require('./IsArray');
var Type = require('./Type');

var hasProto = !({ __proto__: null } instanceof Object);

// https://262.ecma-international.org/6.0/#sec-objectcreate

module.exports = function OrdinaryObjectCreate(proto) {
	if (proto !== null && Type(proto) !== 'Object') {
		throw new $TypeError('Assertion failed: `proto` must be null or an object');
	}
	var additionalInternalSlotsList = arguments.length < 2 ? [] : arguments[1];
	if (!IsArray(additionalInternalSlotsList)) {
		throw new $TypeError('Assertion failed: `additionalInternalSlotsList` must be an Array');
	}
	// var internalSlotsList = ['[[Prototype]]', '[[Extensible]]'];
	if (additionalInternalSlotsList.length > 0) {
		throw new $SyntaxError('es-abstract does not yet support internal slots');
		// internalSlotsList.push(...additionalInternalSlotsList);
	}
	// var O = MakeBasicObject(internalSlotsList);
	// setProto(O, proto);
	// return O;

	if ($ObjectCreate) {
		return $ObjectCreate(proto);
	}
	if (hasProto) {
		return { __proto__: proto };
	}

	if (proto === null) {
		throw new $SyntaxError('native Object.create support is required to create null objects');
	}
	var T = function T() {};
	T.prototype = proto;
	return new T();
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $setProto = require('../helpers/setProto');

var OrdinaryGetPrototypeOf = require('./OrdinaryGetPrototypeOf');
var Type = require('./Type');

// https://262.ecma-international.org/7.0/#sec-ordinarysetprototypeof

module.exports = function OrdinarySetPrototypeOf(O, V) {
	if (Type(V) !== 'Object' && Type(V) !== 'Null') {
		throw new $TypeError('Assertion failed: V must be Object or Null');
	}
	/*
	var extensible = IsExtensible(O);
	var current = OrdinaryGetPrototypeOf(O);
	if (SameValue(V, current)) {
		return true;
	}
	if (!extensible) {
		return false;
	}
	*/
	try {
		$setProto(O, V);
	} catch (e) {
		return false;
	}
	return OrdinaryGetPrototypeOf(O) === V;
	/*
	var p = V;
	var done = false;
	while (!done) {
		if (p === null) {
			done = true;
		} else if (SameValue(p, O)) {
			return false;
		} else {
			if (wat) {
				done = true;
			} else {
				p = p.[[Prototype]];
			}
		}
	}
	O.[[Prototype]] = V;
	return true;
	*/
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

var inspect = require('object-inspect');

// https://262.ecma-international.org/8.0/#sec-ordinarytoprimitive

module.exports = function OrdinaryToPrimitive(O, hint) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (/* Type(hint) !== 'String' || */ hint !== 'string' && hint !== 'number') {
		throw new $TypeError('Assertion failed: `hint` must be "string" or "number"');
	}

	var methodNames = hint === 'string' ? ['toString', 'valueOf'] : ['valueOf', 'toString'];

	for (var i = 0; i < methodNames.length; i += 1) {
		var name = methodNames[i];
		var method = Get(O, name);
		if (IsCallable(method)) {
			var result = Call(method, O);
			if (Type(result) !== 'Object') {
				return result;
			}
		}
	}

	throw new $TypeError('No primitive value for ' + inspect(O));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBind = require('call-bind');

var $resolve = GetIntrinsic('%Promise.resolve%', true);
var $PromiseResolve = $resolve && callBind($resolve);

// https://262.ecma-international.org/9.0/#sec-promise-resolve

module.exports = function PromiseResolve(C, x) {
	if (!$PromiseResolve) {
		throw new SyntaxError('This environment does not support Promises.');
	}
	return $PromiseResolve(C, x);
};

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');
var forEach = require('../helpers/forEach');
var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');

var $charCodeAt = callBound('String.prototype.charCodeAt');

var StringToCodePoints = require('./StringToCodePoints');
var Type = require('./Type');
var UnicodeEscape = require('./UnicodeEscape');
var UTF16EncodeCodePoint = require('./UTF16EncodeCodePoint');

var has = require('has');

// https://ecma-international.org/ecma-262/12.0/#sec-quotejsonstring

var escapes = {
	'\u0008': '\\b',
	'\u0009': '\\t',
	'\u000A': '\\n',
	'\u000C': '\\f',
	'\u000D': '\\r',
	'\u0022': '\\"',
	'\u005c': '\\\\'
};

module.exports = function QuoteJSONString(value) {
	if (Type(value) !== 'String') {
		throw new $TypeError('Assertion failed: `value` must be a String');
	}
	var product = '"';
	if (value) {
		forEach(StringToCodePoints(value), function (C) {
			if (has(escapes, C)) {
				product += escapes[C];
			} else {
				var cCharCode = $charCodeAt(C, 0);
				if (cCharCode < 0x20 || isLeadingSurrogate(C) || isTrailingSurrogate(C)) {
					product += UnicodeEscape(C);
				} else {
					product += UTF16EncodeCodePoint(cCharCode);
				}
			}
		});
	}
	product += '"';
	return product;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $RegExp = GetIntrinsic('%RegExp%');

// var RegExpAlloc = require('./RegExpAlloc');
// var RegExpInitialize = require('./RegExpInitialize');
var ToString = require('./ToString');

// https://262.ecma-international.org/6.0/#sec-regexpcreate

module.exports = function RegExpCreate(P, F) {
	// var obj = RegExpAlloc($RegExp);
	// return RegExpInitialize(obj, P, F);

	// covers spec mechanics; bypass regex brand checking
	var pattern = typeof P === 'undefined' ? '' : ToString(P);
	var flags = typeof F === 'undefined' ? '' : ToString(F);
	return new $RegExp(pattern, flags);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var regexExec = require('call-bind/callBound')('RegExp.prototype.exec');

var Call = require('./Call');
var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-regexpexec

module.exports = function RegExpExec(R, S) {
	if (Type(R) !== 'Object') {
		throw new $TypeError('Assertion failed: `R` must be an Object');
	}
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	var exec = Get(R, 'exec');
	if (IsCallable(exec)) {
		var result = Call(exec, R, [S]);
		if (result === null || Type(result) === 'Object') {
			return result;
		}
		throw new $TypeError('"exec" method must return `null` or an Object');
	}
	return regexExec(R, S);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');
var $RegExpPrototype = GetIntrinsic('%RegExp.prototype%');

var SameValue = require('./SameValue');
var Type = require('./Type');

var $indexOf = callBound('String.prototype.indexOf');

var hasRegExpMatcher = require('is-regex');
var getFlags = require('regexp.prototype.flags');

// https://262.ecma-international.org/13.0/#sec-regexphasflag

module.exports = function RegExpHasFlag(R, codeUnit) {
	if (Type(codeUnit) !== 'String' || codeUnit.length !== 1) {
		throw new $TypeError('Assertion failed: `string` must be a code unit - a String of length 1');
	}

	if (Type(R) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(R) is not Object');
	}

	if (!hasRegExpMatcher(R)) { // step 2
		if (SameValue(R, $RegExpPrototype)) {
			return void undefined; // step 2.a
		}
		throw new $TypeError('`R` must be a RegExp object'); // step 2.b
	}

	var flags = getFlags(R); // step 3

	return $indexOf(flags, codeUnit) > -1; // steps 4-5
};
'use strict';

module.exports = require('../5/CheckObjectCoercible');
'use strict';

var $isNaN = require('../helpers/isNaN');

// http://262.ecma-international.org/5.1/#sec-9.12

module.exports = function SameValue(x, y) {
	if (x === y) { // 0 === -0, but they are not identical.
		if (x === 0) { return 1 / x === 1 / y; }
		return true;
	}
	return $isNaN(x) && $isNaN(y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var SameValue = require('./SameValue');
var Type = require('./Type');

// https://262.ecma-international.org/11.0/#sec-samevaluenonnumeric

module.exports = function SameValueNonNumeric(x, y) {
	var xType = Type(x);
	if (xType === 'Number' || xType === 'Bigint') {
		throw new $TypeError('Assertion failed: SameValueNonNumeric does not accept Number or BigInt values');
	}
	if (xType !== Type(y)) {
		throw new $TypeError('SameValueNonNumeric requires two non-numeric values of the same type.');
	}
	return SameValue(x, y);
};
'use strict';

var $isNaN = require('../helpers/isNaN');

// https://ecma-international.org/ecma-262/6.0/#sec-samevaluezero

module.exports = function SameValueZero(x, y) {
	return (x === y) || ($isNaN(x) && $isNaN(y));
};
'use strict';

var floor = require('./floor');
var modulo = require('./modulo');

var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var SecondsPerMinute = timeConstants.SecondsPerMinute;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function SecFromTime(t) {
	return modulo(floor(t / msPerSecond), SecondsPerMinute);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// IE 9 does not throw in strict mode when writability/configurability/extensibility is violated
var noThrowOnStrictViolation = (function () {
	try {
		delete [].length;
		return true;
	} catch (e) {
		return false;
	}
}());

// https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw

module.exports = function Set(O, P, V, Throw) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	if (Type(Throw) !== 'Boolean') {
		throw new $TypeError('Assertion failed: `Throw` must be a Boolean');
	}
	if (Throw) {
		O[P] = V; // eslint-disable-line no-param-reassign
		if (noThrowOnStrictViolation && !SameValue(O[P], V)) {
			throw new $TypeError('Attempted to assign to readonly property.');
		}
		return true;
	}
	try {
		O[P] = V; // eslint-disable-line no-param-reassign
		return noThrowOnStrictViolation ? SameValue(O[P], V) : true;
	} catch (e) {
		return false;
	}

};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var HasOwnProperty = require('./HasOwnProperty');
var IsExtensible = require('./IsExtensible');
var IsIntegralNumber = require('./IsIntegralNumber');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/12.0/#sec-setfunctionlength

module.exports = function SetFunctionLength(F, length) {
	if (typeof F !== 'function' || !IsExtensible(F) || HasOwnProperty(F, 'length')) {
		throw new $TypeError('Assertion failed: `F` must be an extensible function and lack an own `length` property');
	}
	if (Type(length) !== 'Number') {
		throw new $TypeError('Assertion failed: `length` must be a Number');
	}
	if (length !== Infinity && (!IsIntegralNumber(length) || length < 0)) {
		throw new $TypeError('Assertion failed: `length` must be ∞, or an integer >= 0');
	}
	return DefinePropertyOrThrow(F, 'length', {
		'[[Configurable]]': true,
		'[[Enumerable]]': false,
		'[[Value]]': length,
		'[[Writable]]': false
	});
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var has = require('has');

var $TypeError = GetIntrinsic('%TypeError%');

var getSymbolDescription = require('get-symbol-description');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var IsExtensible = require('./IsExtensible');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-setfunctionname

module.exports = function SetFunctionName(F, name) {
	if (typeof F !== 'function') {
		throw new $TypeError('Assertion failed: `F` must be a function');
	}
	if (!IsExtensible(F) || has(F, 'name')) {
		throw new $TypeError('Assertion failed: `F` must be extensible, and must not have a `name` own property');
	}
	var nameType = Type(name);
	if (nameType !== 'Symbol' && nameType !== 'String') {
		throw new $TypeError('Assertion failed: `name` must be a Symbol or a String');
	}
	if (nameType === 'Symbol') {
		var description = getSymbolDescription(name);
		// eslint-disable-next-line no-param-reassign
		name = typeof description === 'undefined' ? '' : '[' + description + ']';
	}
	if (arguments.length > 2) {
		var prefix = arguments[2];
		// eslint-disable-next-line no-param-reassign
		name = prefix + ' ' + name;
	}
	return DefinePropertyOrThrow(F, 'name', {
		'[[Value]]': name,
		'[[Writable]]': false,
		'[[Enumerable]]': false,
		'[[Configurable]]': true
	});
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');
var $preventExtensions = GetIntrinsic('%Object.preventExtensions%', true);
var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%', true);

var forEach = require('../helpers/forEach');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-setintegritylevel

module.exports = function SetIntegrityLevel(O, level) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (level !== 'sealed' && level !== 'frozen') {
		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
	}
	if (!$preventExtensions) {
		throw new $SyntaxError('SetIntegrityLevel requires native `Object.preventExtensions` support');
	}
	var status = $preventExtensions(O);
	if (!status) {
		return false;
	}
	if (!$gOPN) {
		throw new $SyntaxError('SetIntegrityLevel requires native `Object.getOwnPropertyNames` support');
	}
	var theKeys = $gOPN(O);
	if (level === 'sealed') {
		forEach(theKeys, function (k) {
			DefinePropertyOrThrow(O, k, { configurable: false });
		});
	} else if (level === 'frozen') {
		forEach(theKeys, function (k) {
			var currentDesc = $gOPD(O, k);
			if (typeof currentDesc !== 'undefined') {
				var desc;
				if (IsAccessorDescriptor(ToPropertyDescriptor(currentDesc))) {
					desc = { configurable: false };
				} else {
					desc = { configurable: false, writable: false };
				}
				DefinePropertyOrThrow(O, k, desc);
			}
		});
	}
	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');

var DeletePropertyOrThrow = require('./DeletePropertyOrThrow');
var Get = require('./Get');
var HasProperty = require('./HasProperty');
var IsIntegralNumber = require('./IsIntegralNumber');
var Set = require('./Set');
var ToString = require('./ToString');
var Type = require('./Type');

var isAbstractClosure = require('../helpers/isAbstractClosure');

var $push = callBound('Array.prototype.push');
var $sort = callBound('Array.prototype.sort');

// https://ecma-international.org/ecma-262/13.0/#sec-sortindexedproperties

module.exports = function SortIndexedProperties(obj, len, SortCompare) {
	if (Type(obj) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(obj) is not Object');
	}
	if (!IsIntegralNumber(len) || len < 0) {
		throw new $TypeError('Assertion failed: `len` must be an integer >= 0');
	}
	if (!isAbstractClosure(SortCompare) || SortCompare.length !== 2) {
		throw new $TypeError('Assertion failed: `SortCompare` must be an abstract closure taking 2 arguments');
	}

	var items = []; // step 1

	var k = 0; // step 2

	while (k < len) { // step 3
		var Pk = ToString(k);
		var kPresent = HasProperty(obj, Pk);
		if (kPresent) {
			var kValue = Get(obj, Pk);
			$push(items, kValue);
		}
		k += 1;
	}

	var itemCount = items.length; // step 4

	$sort(items, SortCompare); // step 5

	var j = 0; // step 6

	while (j < itemCount) { // step 7
		Set(obj, ToString(j), items[j], true);
		j += 1;
	}

	while (j < len) { // step 8
		DeletePropertyOrThrow(obj, ToString(j));
		j += 1;
	}
	return obj; // step 9
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $species = GetIntrinsic('%Symbol.species%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var IsConstructor = require('./IsConstructor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor

module.exports = function SpeciesConstructor(O, defaultConstructor) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	var C = O.constructor;
	if (typeof C === 'undefined') {
		return defaultConstructor;
	}
	if (Type(C) !== 'Object') {
		throw new $TypeError('O.constructor is not an Object');
	}
	var S = $species ? C[$species] : void 0;
	if (S == null) {
		return defaultConstructor;
	}
	if (IsConstructor(S)) {
		return S;
	}
	throw new $TypeError('no constructor found');
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Object = GetIntrinsic('%Object%');
var $StringPrototype = GetIntrinsic('%String.prototype%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var Type = require('./Type');

var setProto = require('../helpers/setProto');

// https://262.ecma-international.org/6.0/#sec-stringcreate

module.exports = function StringCreate(value, prototype) {
	if (Type(value) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}

	var S = $Object(value);
	if (prototype !== $StringPrototype) {
		if (setProto) {
			setProto(S, prototype);
		} else {
			throw new $SyntaxError('StringCreate: a `proto` argument that is not `String.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
		}
	}

	var length = value.length;
	DefinePropertyOrThrow(S, 'length', {
		'[[Configurable]]': false,
		'[[Enumerable]]': false,
		'[[Value]]': length,
		'[[Writable]]': false
	});

	return S;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');
var $charAt = callBound('String.prototype.charAt');
var $stringToString = callBound('String.prototype.toString');

var CanonicalNumericIndexString = require('./CanonicalNumericIndexString');
var IsIntegralNumber = require('./IsIntegralNumber');
var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

var isNegativeZero = require('is-negative-zero');

// https://ecma-international.org/ecma-262/12.0/#sec-stringgetownproperty

module.exports = function StringGetOwnProperty(S, P) {
	var str;
	if (Type(S) === 'Object') {
		try {
			str = $stringToString(S);
		} catch (e) { /**/ }
	}
	if (Type(str) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a boxed string object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	if (Type(P) !== 'String') {
		return void undefined;
	}
	var index = CanonicalNumericIndexString(P);
	var len = str.length;
	if (typeof index === 'undefined' || !IsIntegralNumber(index) || isNegativeZero(index) || index < 0 || len <= index) {
		return void undefined;
	}
	var resultStr = $charAt(S, index);
	return {
		'[[Configurable]]': false,
		'[[Enumerable]]': true,
		'[[Value]]': resultStr,
		'[[Writable]]': false
	};
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');

var IsIntegralNumber = require('./IsIntegralNumber');
var Type = require('./Type');

var $slice = callBound('String.prototype.slice');

// https://ecma-international.org/ecma-262/12.0/#sec-stringindexof

module.exports = function StringIndexOf(string, searchValue, fromIndex) {
	if (Type(string) !== 'String') {
		throw new $TypeError('Assertion failed: `string` must be a String');
	}
	if (Type(searchValue) !== 'String') {
		throw new $TypeError('Assertion failed: `searchValue` must be a String');
	}
	if (!IsIntegralNumber(fromIndex) || fromIndex < 0) {
		throw new $TypeError('Assertion failed: `fromIndex` must be a non-negative integer');
	}

	var len = string.length;
	if (searchValue === '' && fromIndex <= len) {
		return fromIndex;
	}

	var searchLen = searchValue.length;
	for (var i = fromIndex; i <= (len - searchLen); i += 1) {
		var candidate = $slice(string, i, i + searchLen);
		if (candidate === searchValue) {
			return i;
		}
	}
	return -1;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var ToLength = require('./ToLength');
var ToString = require('./ToString');

var $strSlice = callBound('String.prototype.slice');

// https://262.ecma-international.org/11.0/#sec-stringpad

module.exports = function StringPad(O, maxLength, fillString, placement) {
	if (placement !== 'start' && placement !== 'end') {
		throw new $TypeError('Assertion failed: `placement` must be "start" or "end"');
	}
	var S = ToString(O);
	var intMaxLength = ToLength(maxLength);
	var stringLength = S.length;
	if (intMaxLength <= stringLength) {
		return S;
	}
	var filler = typeof fillString === 'undefined' ? ' ' : ToString(fillString);
	if (filler === '') {
		return S;
	}
	var fillLen = intMaxLength - stringLength;

	// the String value consisting of repeated concatenations of filler truncated to length fillLen.
	var truncatedStringFiller = '';
	while (truncatedStringFiller.length < fillLen) {
		truncatedStringFiller += filler;
	}
	truncatedStringFiller = $strSlice(truncatedStringFiller, 0, fillLen);

	if (placement === 'start') {
		return truncatedStringFiller + S;
	}
	return S + truncatedStringFiller;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $TypeError = GetIntrinsic('%TypeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');

// https://262.ecma-international.org/11.0/#sec-stringtobigint

module.exports = function StringToBigInt(argument) {
	if (typeof argument !== 'string') {
		throw new $TypeError('`argument` must be a string');
	}
	if (!$BigInt) {
		throw new $SyntaxError('BigInts are not supported in this environment');
	}
	try {
		return $BigInt(argument);
	} catch (e) {
		return NaN;
	}
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $push = callBound('Array.prototype.push');

var CodePointAt = require('./CodePointAt');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/12.0/#sec-stringtocodepoints

module.exports = function StringToCodePoints(string) {
	if (Type(string) !== 'String') {
		throw new $TypeError('Assertion failed: `string` must be a String');
	}
	var codePoints = [];
	var size = string.length;
	var position = 0;
	while (position < size) {
		var cp = CodePointAt(string, position);
		$push(codePoints, cp['[[CodePoint]]']);
		position += cp['[[CodeUnitCount]]'];
	}
	return codePoints;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Number = GetIntrinsic('%Number%');
var $RegExp = GetIntrinsic('%RegExp%');
var $TypeError = GetIntrinsic('%TypeError%');
var $parseInteger = GetIntrinsic('%parseInt%');

var callBound = require('call-bind/callBound');
var regexTester = require('../helpers/regexTester');

var $strSlice = callBound('String.prototype.slice');
var isBinary = regexTester(/^0b[01]+$/i);
var isOctal = regexTester(/^0o[0-7]+$/i);
var isInvalidHexLiteral = regexTester(/^[-+]0x[0-9a-f]+$/i);
var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
var hasNonWS = regexTester(nonWSregex);

// whitespace from: https://es5.github.io/#x15.5.4.20
// implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
var ws = [
	'\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
	'\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
	'\u2029\uFEFF'
].join('');
var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
var $replace = callBound('String.prototype.replace');
var $trim = function (value) {
	return $replace(value, trimRegex, '');
};

var Type = require('./Type');

// https://ecma-international.org/ecma-262/13.0/#sec-stringtonumber

module.exports = function StringToNumber(argument) {
	if (Type(argument) !== 'String') {
		throw new $TypeError('Conversion from \'BigInt\' to \'number\' is not allowed.');
	}
	if (isBinary(argument)) {
		return $Number($parseInteger($strSlice(argument, 2), 2));
	}
	if (isOctal(argument)) {
		return $Number($parseInteger($strSlice(argument, 2), 8));
	}
	if (hasNonWS(argument) || isInvalidHexLiteral(argument)) {
		return NaN;
	}
	var trimmed = $trim(argument);
	if (trimmed !== argument) {
		return StringToNumber(trimmed);
	}
	return $Number(argument);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $SymbolToString = callBound('Symbol.prototype.toString', true);

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-symboldescriptivestring

module.exports = function SymbolDescriptiveString(sym) {
	if (Type(sym) !== 'Symbol') {
		throw new $TypeError('Assertion failed: `sym` must be a Symbol');
	}
	return $SymbolToString(sym);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $TypeError = GetIntrinsic('%TypeError%');

var every = require('../helpers/every');
var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');

var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-testintegritylevel

module.exports = function TestIntegrityLevel(O, level) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (level !== 'sealed' && level !== 'frozen') {
		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
	}
	var status = IsExtensible(O);
	if (status) {
		return false;
	}
	var theKeys = OwnPropertyKeys(O);
	return theKeys.length === 0 || every(theKeys, function (k) {
		var currentDesc = $gOPD(O, k);
		if (typeof currentDesc !== 'undefined') {
			if (currentDesc.configurable) {
				return false;
			}
			if (level === 'frozen' && IsDataDescriptor(ToPropertyDescriptor(currentDesc)) && currentDesc.writable) {
				return false;
			}
		}
		return true;
	});
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Date = GetIntrinsic('%Date%');
var $Number = GetIntrinsic('%Number%');

var $isFinite = require('../helpers/isFinite');

var abs = require('./abs');
var ToNumber = require('./ToNumber');

// https://262.ecma-international.org/5.1/#sec-15.9.1.14

module.exports = function TimeClip(time) {
	if (!$isFinite(time) || abs(time) > 8.64e15) {
		return NaN;
	}
	return $Number(new $Date(ToNumber(time)));
};

'use strict';

var msPerDay = require('../helpers/timeConstants').msPerDay;

var DayFromYear = require('./DayFromYear');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function TimeFromYear(y) {
	return msPerDay * DayFromYear(y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $isNaN = require('../helpers/isNaN');
var padTimeComponent = require('../helpers/padTimeComponent');

var HourFromTime = require('./HourFromTime');
var MinFromTime = require('./MinFromTime');
var SecFromTime = require('./SecFromTime');
var Type = require('./Type');

// https://262.ecma-international.org/9.0/#sec-timestring

module.exports = function TimeString(tv) {
	if (Type(tv) !== 'Number' || $isNaN(tv)) {
		throw new $TypeError('Assertion failed: `tv` must be a non-NaN Number');
	}
	var hour = HourFromTime(tv);
	var minute = MinFromTime(tv);
	var second = SecFromTime(tv);
	return padTimeComponent(hour) + ':' + padTimeComponent(minute) + ':' + padTimeComponent(second) + '\x20GMT';
};
'use strict';

var modulo = require('./modulo');

var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.2

module.exports = function TimeWithinDay(t) {
	return modulo(t, msPerDay);
};

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $asIntN = GetIntrinsic('%BigInt.asIntN%', true);
var $Number = GetIntrinsic('%Number%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');

var ToPrimitive = require('./ToPrimitive');

// https://262.ecma-international.org/11.0/#sec-tobigint

module.exports = function ToBigInt(argument) {
	if (!$BigInt) {
		throw new $SyntaxError('BigInts are not supported in this environment');
	}

	var prim = ToPrimitive(argument, $Number);

	if (typeof prim === 'number') {
		return $asIntN(0, prim);
	}
	return $BigInt(prim);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $pow = GetIntrinsic('%Math.pow%');

var ToBigInt = require('./ToBigInt');
var BigIntRemainder = require('./BigInt/remainder');

var modBigInt = require('../helpers/modBigInt');

// BigInt(2**63), but node v10.4-v10.8 have a bug where you can't `BigInt(x)` anything larger than MAX_SAFE_INTEGER
var twoSixtyThree = $BigInt && (BigInt($pow(2, 32)) * BigInt($pow(2, 31)));

// BigInt(2**64), but node v10.4-v10.8 have a bug where you can't `BigInt(x)` anything larger than MAX_SAFE_INTEGER
var twoSixtyFour = $BigInt && (BigInt($pow(2, 32)) * BigInt($pow(2, 32)));

// https://262.ecma-international.org/11.0/#sec-tobigint64

module.exports = function ToBigInt64(argument) {
	var n = ToBigInt(argument);
	var int64bit = modBigInt(BigIntRemainder, n, twoSixtyFour);
	return int64bit >= twoSixtyThree ? int64bit - twoSixtyFour : int64bit;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $pow = GetIntrinsic('%Math.pow%');

var ToBigInt = require('./ToBigInt');
var BigIntRemainder = require('./BigInt/remainder');

var modBigInt = require('../helpers/modBigInt');

// BigInt(2**64), but node v10.4-v10.8 have a bug where you can't `BigInt(x)` anything larger than MAX_SAFE_INTEGER
var twoSixtyFour = $BigInt && (BigInt($pow(2, 32)) * BigInt($pow(2, 32)));

// https://262.ecma-international.org/11.0/#sec-tobiguint64

module.exports = function ToBigUint64(argument) {
	var n = ToBigInt(argument);
	var int64bit = modBigInt(BigIntRemainder, n, twoSixtyFour);
	return int64bit;
};
'use strict';

// http://262.ecma-international.org/5.1/#sec-9.2

module.exports = function ToBoolean(value) { return !!value; };
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $Date = GetIntrinsic('%Date%');

var $isNaN = require('../helpers/isNaN');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-todatestring

module.exports = function ToDateString(tv) {
	if (Type(tv) !== 'Number') {
		throw new $TypeError('Assertion failed: `tv` must be a Number');
	}
	if ($isNaN(tv)) {
		return 'Invalid Date';
	}
	return $Date(tv);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $RangeError = GetIntrinsic('%RangeError%');

var ToIntegerOrInfinity = require('./ToIntegerOrInfinity');
var ToLength = require('./ToLength');
var SameValue = require('./SameValue');

// https://www.ecma-international.org/ecma-262/8.0/#sec-toindex

module.exports = function ToIndex(value) {
	if (typeof value === 'undefined') {
		return 0;
	}
	var integerIndex = ToIntegerOrInfinity(value);
	if (integerIndex < 0) {
		throw new $RangeError('index must be >= 0');
	}
	var index = ToLength(integerIndex);
	if (!SameValue(integerIndex, index)) {
		throw new $RangeError('index must be >= 0 and < 2 ** 53 - 1');
	}
	return index;
};
'use strict';

var ToUint16 = require('./ToUint16');

// https://ecma-international.org/ecma-262/6.0/#sec-toint16

module.exports = function ToInt16(argument) {
	var int16bit = ToUint16(argument);
	return int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;
};
'use strict';

var ToNumber = require('./ToNumber');

// http://262.ecma-international.org/5.1/#sec-9.5

module.exports = function ToInt32(x) {
	return ToNumber(x) >> 0;
};
'use strict';

var ToUint8 = require('./ToUint8');

// https://ecma-international.org/ecma-262/6.0/#sec-toint8

module.exports = function ToInt8(argument) {
	var int8bit = ToUint8(argument);
	return int8bit >= 0x80 ? int8bit - 0x100 : int8bit;
};
'use strict';

var abs = require('./abs');
var floor = require('./floor');
var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');

// https://262.ecma-international.org/12.0/#sec-tointegerorinfinity

module.exports = function ToIntegerOrInfinity(value) {
	var number = ToNumber(value);
	if ($isNaN(number) || number === 0) { return 0; }
	if (!$isFinite(number)) { return number; }
	return $sign(number) * floor(abs(number));
};
'use strict';

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');

var ToIntegerOrInfinity = require('./ToIntegerOrInfinity');

module.exports = function ToLength(argument) {
	var len = ToIntegerOrInfinity(argument);
	if (len <= 0) { return 0; } // includes converting -0 to +0
	if (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }
	return len;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $Number = GetIntrinsic('%Number%');
var isPrimitive = require('../helpers/isPrimitive');

var ToPrimitive = require('./ToPrimitive');
var StringToNumber = require('./StringToNumber');

// https://ecma-international.org/ecma-262/13.0/#sec-tonumber

module.exports = function ToNumber(argument) {
	var value = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number);
	if (typeof value === 'symbol') {
		throw new $TypeError('Cannot convert a Symbol value to a number');
	}
	if (typeof value === 'bigint') {
		throw new $TypeError('Conversion from \'BigInt\' to \'number\' is not allowed.');
	}
	if (typeof value === 'string') {
		return StringToNumber(value);
	}
	return $Number(value);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Number = GetIntrinsic('%Number%');

var isPrimitive = require('../helpers/isPrimitive');

var ToPrimitive = require('./ToPrimitive');
var ToNumber = require('./ToNumber');
var Type = require('./Type');

// https://262.ecma-international.org/6.0/#sec-tonumber

module.exports = function ToNumeric(argument) {
	var primValue = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number);
	if (Type(primValue) === 'BigInt') {
		return primValue;
	}
	return ToNumber(primValue);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Object = GetIntrinsic('%Object%');

var RequireObjectCoercible = require('./RequireObjectCoercible');

// https://ecma-international.org/ecma-262/6.0/#sec-toobject

module.exports = function ToObject(value) {
	RequireObjectCoercible(value);
	return $Object(value);
};
'use strict';

var toPrimitive = require('es-to-primitive/es2015');

// https://ecma-international.org/ecma-262/6.0/#sec-toprimitive

module.exports = function ToPrimitive(input) {
	if (arguments.length > 1) {
		return toPrimitive(input, arguments[1]);
	}
	return toPrimitive(input);
};
'use strict';

var has = require('has');

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');
var ToBoolean = require('./ToBoolean');
var IsCallable = require('./IsCallable');

// https://262.ecma-international.org/5.1/#sec-8.10.5

module.exports = function ToPropertyDescriptor(Obj) {
	if (Type(Obj) !== 'Object') {
		throw new $TypeError('ToPropertyDescriptor requires an object');
	}

	var desc = {};
	if (has(Obj, 'enumerable')) {
		desc['[[Enumerable]]'] = ToBoolean(Obj.enumerable);
	}
	if (has(Obj, 'configurable')) {
		desc['[[Configurable]]'] = ToBoolean(Obj.configurable);
	}
	if (has(Obj, 'value')) {
		desc['[[Value]]'] = Obj.value;
	}
	if (has(Obj, 'writable')) {
		desc['[[Writable]]'] = ToBoolean(Obj.writable);
	}
	if (has(Obj, 'get')) {
		var getter = Obj.get;
		if (typeof getter !== 'undefined' && !IsCallable(getter)) {
			throw new $TypeError('getter must be a function');
		}
		desc['[[Get]]'] = getter;
	}
	if (has(Obj, 'set')) {
		var setter = Obj.set;
		if (typeof setter !== 'undefined' && !IsCallable(setter)) {
			throw new $TypeError('setter must be a function');
		}
		desc['[[Set]]'] = setter;
	}

	if ((has(desc, '[[Get]]') || has(desc, '[[Set]]')) && (has(desc, '[[Value]]') || has(desc, '[[Writable]]'))) {
		throw new $TypeError('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
	}
	return desc;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $String = GetIntrinsic('%String%');

var ToPrimitive = require('./ToPrimitive');
var ToString = require('./ToString');

// https://ecma-international.org/ecma-262/6.0/#sec-topropertykey

module.exports = function ToPropertyKey(argument) {
	var key = ToPrimitive(argument, $String);
	return typeof key === 'symbol' ? key : ToString(key);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $String = GetIntrinsic('%String%');
var $TypeError = GetIntrinsic('%TypeError%');

// https://ecma-international.org/ecma-262/6.0/#sec-tostring

module.exports = function ToString(argument) {
	if (typeof argument === 'symbol') {
		throw new $TypeError('Cannot convert a Symbol value to a string');
	}
	return $String(argument);
};
'use strict';

var abs = require('./abs');
var floor = require('./floor');
var modulo = require('./modulo');
var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');

// http://262.ecma-international.org/5.1/#sec-9.7

module.exports = function ToUint16(value) {
	var number = ToNumber(value);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * floor(abs(number));
	return modulo(posInt, 0x10000);
};
'use strict';

var ToNumber = require('./ToNumber');

// http://262.ecma-international.org/5.1/#sec-9.6

module.exports = function ToUint32(x) {
	return ToNumber(x) >>> 0;
};
'use strict';

var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');

var abs = require('./abs');
var floor = require('./floor');
var modulo = require('./modulo');

// https://ecma-international.org/ecma-262/6.0/#sec-touint8

module.exports = function ToUint8(argument) {
	var number = ToNumber(argument);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * floor(abs(number));
	return modulo(posInt, 0x100);
};
'use strict';

var ToNumber = require('./ToNumber');
var floor = require('./floor');

var $isNaN = require('../helpers/isNaN');

// https://ecma-international.org/ecma-262/6.0/#sec-touint8clamp

module.exports = function ToUint8Clamp(argument) {
	var number = ToNumber(argument);
	if ($isNaN(number) || number <= 0) { return 0; }
	if (number >= 0xFF) { return 0xFF; }
	var f = floor(argument);
	if (f + 0.5 < number) { return f + 1; }
	if (number < f + 0.5) { return f; }
	if (f % 2 !== 0) { return f + 1; }
	return f;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $String = GetIntrinsic('%String%');
var $RangeError = GetIntrinsic('%RangeError%');

var IsIntegralNumber = require('./IsIntegralNumber');
var StringPad = require('./StringPad');

// https://ecma-international.org/ecma-262/13.0/#sec-tozeropaddeddecimalstring

module.exports = function ToZeroPaddedDecimalString(n, minLength) {
	if (!IsIntegralNumber(n) || n < 0) {
		throw new $RangeError('Assertion failed: `q` must be a non-negative integer');
	}
	var S = $String(n);
	return StringPad(S, minLength, '0', 'start');
};
'use strict';

var trimStart = require('string.prototype.trimstart');
var trimEnd = require('string.prototype.trimend');

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var RequireObjectCoercible = require('./RequireObjectCoercible');
var ToString = require('./ToString');

// https://262.ecma-international.org/10.0/#sec-trimstring

module.exports = function TrimString(string, where) {
	var str = RequireObjectCoercible(string);
	var S = ToString(str);
	var T;
	if (where === 'start') {
		T = trimStart(S);
	} else if (where === 'end') {
		T = trimEnd(S);
	} else if (where === 'start+end') {
		T = trimStart(trimEnd(S));
	} else {
		throw new $TypeError('Assertion failed: invalid `where` value; must be "start", "end", or "start+end"');
	}
	return T;
};
'use strict';

var ES5Type = require('../5/Type');

// https://262.ecma-international.org/11.0/#sec-ecmascript-data-types-and-values

module.exports = function Type(x) {
	if (typeof x === 'symbol') {
		return 'Symbol';
	}
	if (typeof x === 'bigint') {
		return 'BigInt';
	}
	return ES5Type(x);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $fromCharCode = GetIntrinsic('%String.fromCharCode%');

var floor = require('./floor');
var modulo = require('./modulo');

var isCodePoint = require('../helpers/isCodePoint');

// https://ecma-international.org/ecma-262/12.0/#sec-utf16encoding

module.exports = function UTF16EncodeCodePoint(cp) {
	if (!isCodePoint(cp)) {
		throw new $TypeError('Assertion failed: `cp` must be >= 0 and <= 0x10FFFF');
	}
	if (cp <= 65535) {
		return $fromCharCode(cp);
	}
	var cu1 = $fromCharCode(floor((cp - 65536) / 1024) + 0xD800);
	var cu2 = $fromCharCode(modulo(cp - 65536, 1024) + 0xDC00);
	return cu1 + cu2;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $fromCharCode = GetIntrinsic('%String.fromCharCode%');

var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');

// https://tc39.es/ecma262/2020/#sec-utf16decodesurrogatepair

module.exports = function UTF16SurrogatePairToCodePoint(lead, trail) {
	if (!isLeadingSurrogate(lead) || !isTrailingSurrogate(trail)) {
		throw new $TypeError('Assertion failed: `lead` must be a leading surrogate char code, and `trail` must be a trailing surrogate char code');
	}
	// var cp = (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000;
	return $fromCharCode(lead) + $fromCharCode(trail);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $charCodeAt = callBound('String.prototype.charCodeAt');
var $numberToString = callBound('Number.prototype.toString');
var $toLowerCase = callBound('String.prototype.toLowerCase');

var StringPad = require('./StringPad');

// https://262.ecma-international.org/11.0/#sec-unicodeescape

module.exports = function UnicodeEscape(C) {
	if (typeof C !== 'string' || C.length !== 1) {
		throw new $TypeError('Assertion failed: `C` must be a single code unit');
	}
	var n = $charCodeAt(C, 0);
	if (n > 0xFFFF) {
		throw new $TypeError('`Assertion failed: numeric value of `C` must be <= 0xFFFF');
	}

	return '\\u' + StringPad($toLowerCase($numberToString(n, 16)), 4, '0', 'start');
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');
var isFullyPopulatedPropertyDescriptor = require('../helpers/isFullyPopulatedPropertyDescriptor');
var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsGenericDescriptor = require('./IsGenericDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://262.ecma-international.org/13.0/#sec-validateandapplypropertydescriptor

// see https://github.com/tc39/ecma262/pull/2468 for ES2022 changes

// eslint-disable-next-line max-lines-per-function, max-statements, max-params
module.exports = function ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current) {
	var oType = Type(O);
	if (oType !== 'Undefined' && oType !== 'Object') {
		throw new $TypeError('Assertion failed: O must be undefined or an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	if (Type(extensible) !== 'Boolean') {
		throw new $TypeError('Assertion failed: extensible must be a Boolean');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (Type(current) !== 'Undefined' && !isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, current)) {
		throw new $TypeError('Assertion failed: current must be a Property Descriptor, or undefined');
	}

	if (Type(current) === 'Undefined') { // step 2
		if (!extensible) {
			return false; // step 2.a
		}
		if (oType === 'Undefined') {
			return true; // step 2.b
		}
		if (IsAccessorDescriptor(Desc)) { // step 2.c
			return DefineOwnProperty(
				IsDataDescriptor,
				SameValue,
				FromPropertyDescriptor,
				O,
				P,
				Desc
			);
		}
		// step 2.d
		return DefineOwnProperty(
			IsDataDescriptor,
			SameValue,
			FromPropertyDescriptor,
			O,
			P,
			{
				'[[Configurable]]': !!Desc['[[Configurable]]'],
				'[[Enumerable]]': !!Desc['[[Enumerable]]'],
				'[[Value]]': Desc['[[Value]]'],
				'[[Writable]]': !!Desc['[[Writable]]']
			}
		);
	}

	// 3. Assert: current is a fully populated Property Descriptor.
	if (!isFullyPopulatedPropertyDescriptor({
		IsAccessorDescriptor: IsAccessorDescriptor,
		IsDataDescriptor: IsDataDescriptor
	}, current)) {
		throw new $TypeError('`current`, when present, must be a fully populated and valid Property Descriptor');
	}

	// 4. If every field in Desc is absent, return true.
	// this can't really match the assertion that it's a Property Descriptor in our JS implementation

	// 5. If current.[[Configurable]] is false, then
	if (!current['[[Configurable]]']) {
		if ('[[Configurable]]' in Desc && Desc['[[Configurable]]']) {
			// step 5.a
			return false;
		}
		if ('[[Enumerable]]' in Desc && !SameValue(Desc['[[Enumerable]]'], current['[[Enumerable]]'])) {
			// step 5.b
			return false;
		}
		if (!IsGenericDescriptor(Desc) && !SameValue(IsAccessorDescriptor(Desc), IsAccessorDescriptor(current))) {
			// step 5.c
			return false;
		}
		if (IsAccessorDescriptor(current)) { // step 5.d
			if ('[[Get]]' in Desc && !SameValue(Desc['[[Get]]'], current['[[Get]]'])) {
				return false;
			}
			if ('[[Set]]' in Desc && !SameValue(Desc['[[Set]]'], current['[[Set]]'])) {
				return false;
			}
		} else if (!current['[[Writable]]']) { // step 5.e
			if ('[[Writable]]' in Desc && Desc['[[Writable]]']) {
				return false;
			}
			if ('[[Value]]' in Desc && !SameValue(Desc['[[Value]]'], current['[[Value]]'])) {
				return false;
			}
		}
	}

	// 6. If O is not undefined, then
	if (oType !== 'Undefined') {
		var configurable;
		var enumerable;
		if (IsDataDescriptor(current) && IsAccessorDescriptor(Desc)) { // step 6.a
			configurable = ('[[Configurable]]' in Desc ? Desc : current)['[[Configurable]]'];
			enumerable = ('[[Enumerable]]' in Desc ? Desc : current)['[[Enumerable]]'];
			// Replace the property named P of object O with an accessor property having [[Configurable]] and [[Enumerable]] attributes as described by current and each other attribute set to its default value.
			return DefineOwnProperty(
				IsDataDescriptor,
				SameValue,
				FromPropertyDescriptor,
				O,
				P,
				{
					'[[Configurable]]': !!configurable,
					'[[Enumerable]]': !!enumerable,
					'[[Get]]': ('[[Get]]' in Desc ? Desc : current)['[[Get]]'],
					'[[Set]]': ('[[Set]]' in Desc ? Desc : current)['[[Set]]']
				}
			);
		} else if (IsAccessorDescriptor(current) && IsDataDescriptor(Desc)) {
			configurable = ('[[Configurable]]' in Desc ? Desc : current)['[[Configurable]]'];
			enumerable = ('[[Enumerable]]' in Desc ? Desc : current)['[[Enumerable]]'];
			// i. Replace the property named P of object O with a data property having [[Configurable]] and [[Enumerable]] attributes as described by current and each other attribute set to its default value.
			return DefineOwnProperty(
				IsDataDescriptor,
				SameValue,
				FromPropertyDescriptor,
				O,
				P,
				{
					'[[Configurable]]': !!configurable,
					'[[Enumerable]]': !!enumerable,
					'[[Value]]': ('[[Value]]' in Desc ? Desc : current)['[[Value]]'],
					'[[Writable]]': !!('[[Writable]]' in Desc ? Desc : current)['[[Writable]]']
				}
			);
		}

		// For each field of Desc that is present, set the corresponding attribute of the property named P of object O to the value of the field.
		return DefineOwnProperty(
			IsDataDescriptor,
			SameValue,
			FromPropertyDescriptor,
			O,
			P,
			Desc
		);
	}

	return true; // step 7
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');
var $deref = callBound('WeakRef.prototype.deref', true);

var isWeakRef = require('is-weakref');

var AddToKeptObjects = require('./AddToKeptObjects');

// https://ecma-international.org/ecma-262/12.0/#sec-weakrefderef

module.exports = function WeakRefDeref(weakRef) {
	if (!isWeakRef(weakRef)) {
		throw new $TypeError('Assertion failed: `weakRef` must be a WeakRef');
	}
	var target = $deref(weakRef);
	if (target) {
		AddToKeptObjects(target);
	}
	return target;
};
'use strict';

var Day = require('./Day');
var modulo = require('./modulo');

// https://262.ecma-international.org/5.1/#sec-15.9.1.6

module.exports = function WeekDay(t) {
	return modulo(Day(t) + 4, 7);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Date = GetIntrinsic('%Date%');

var callBound = require('call-bind/callBound');

var $getUTCFullYear = callBound('Date.prototype.getUTCFullYear');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function YearFromTime(t) {
	// largest y such that this.TimeFromYear(y) <= t
	return $getUTCFullYear(new $Date(t));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $abs = GetIntrinsic('%Math.abs%');

// http://262.ecma-international.org/5.1/#sec-5.2

module.exports = function abs(x) {
	return $abs(x);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var max = GetIntrinsic('%Math.max%');
var min = GetIntrinsic('%Math.min%');

var Type = require('./Type');

// https://262.ecma-international.org/12.0/#clamping

module.exports = function clamp(x, lower, upper) {
	if (Type(x) !== 'Number' || Type(lower) !== 'Number' || Type(upper) !== 'Number' || !(lower <= upper)) {
		throw new $TypeError('Assertion failed: all three arguments must be MVs, and `lower` must be `<= upper`');
	}
	return min(max(lower, x), upper);
};
'use strict';

// var modulo = require('./modulo');
var $floor = Math.floor;

// http://262.ecma-international.org/5.1/#sec-5.2

module.exports = function floor(x) {
	// return x - modulo(x, 1);
	return $floor(x);
};
'use strict';

var mod = require('../helpers/mod');

// https://262.ecma-international.org/5.1/#sec-5.2

module.exports = function modulo(x, y) {
	return mod(x, y);
};
'use strict';

var modulo = require('./modulo');

var msPerSecond = require('../helpers/timeConstants').msPerSecond;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function msFromTime(t) {
	return modulo(t, msPerSecond);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsIntegralNumber = require('./IsIntegralNumber');
var Type = require('./Type');

var callBound = require('call-bind/callBound');

var $slice = callBound('String.prototype.slice');

// https://262.ecma-international.org/12.0/#substring
module.exports = function substring(S, inclusiveStart, exclusiveEnd) {
	if (Type(S) !== 'String' || !IsIntegralNumber(inclusiveStart) || (arguments.length > 2 && !IsIntegralNumber(exclusiveEnd))) {
		throw new $TypeError('`S` must be a String, and `inclusiveStart` and `exclusiveEnd` must be integers');
	}
	return $slice(S, inclusiveStart, arguments.length > 2 ? exclusiveEnd : S.length);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');
var $bigIntValueOf = callBound('BigInt.prototype.valueOf', true);

var Type = require('./Type');

// https://262.ecma-international.org/11.0/#sec-thisbigintvalue

module.exports = function thisBigIntValue(value) {
	var type = Type(value);
	if (type === 'BigInt') {
		return value;
	}
	if (!$bigIntValueOf) {
		throw new $TypeError('BigInt is not supported');
	}
	return $bigIntValueOf(value);
};
'use strict';

var $BooleanValueOf = require('call-bind/callBound')('Boolean.prototype.valueOf');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-boolean-prototype-object

module.exports = function thisBooleanValue(value) {
	if (Type(value) === 'Boolean') {
		return value;
	}

	return $BooleanValueOf(value);
};
'use strict';

var callBound = require('call-bind/callBound');

var Type = require('./Type');

var $NumberValueOf = callBound('Number.prototype.valueOf');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-number-prototype-object

module.exports = function thisNumberValue(value) {
	if (Type(value) === 'Number') {
		return value;
	}

	return $NumberValueOf(value);
};

'use strict';

var $StringValueOf = require('call-bind/callBound')('String.prototype.valueOf');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object

module.exports = function thisStringValue(value) {
	if (Type(value) === 'String') {
		return value;
	}

	return $StringValueOf(value);
};
'use strict';

var callBound = require('call-bind/callBound');

var $SymbolValueOf = callBound('Symbol.prototype.valueOf', true);

var Type = require('./Type');

// https://262.ecma-international.org/9.0/#sec-thissymbolvalue

module.exports = function thisSymbolValue(value) {
	if (!$SymbolValueOf) {
		throw new SyntaxError('Symbols are not supported; thisSymbolValue requires that `value` be a Symbol or a Symbol object');
	}
	if (Type(value) === 'Symbol') {
		return value;
	}
	return $SymbolValueOf(value);
};
'use strict';

module.exports = require('../2018/thisTimeValue');
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isFinite = require('../../helpers/isFinite');
var isNaN = require('../../helpers/isNaN');

var Type = require('../Type');

// https://262.ecma-international.org/12.0/#sec-numeric-types-number-add

module.exports = function NumberAdd(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}

	if (isNaN(x) || isNaN(y) || (x === Infinity && y === -Infinity) || (x === -Infinity && y === Infinity)) {
		return NaN;
	}

	if (!isFinite(x)) {
		return x;
	}
	if (!isFinite(y)) {
		return y;
	}

	if (x === y && x === 0) { // both zeroes
		return Infinity / x === -Infinity && Infinity / y === -Infinity ? -0 : +0;
	}

	// shortcut for the actual spec mechanics
	return x + y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var NumberBitwiseOp = require('../NumberBitwiseOp');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-bitwiseAND

module.exports = function NumberBitwiseAND(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}
	return NumberBitwiseOp('&', x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var ToInt32 = require('../ToInt32');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-bitwiseNOT

module.exports = function NumberBitwiseNOT(x) {
	if (Type(x) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` argument must be a Number');
	}
	var oldValue = ToInt32(x);
	// Return the result of applying the bitwise operator op to lnum and rnum. The result is a signed 32-bit integer.
	return ~oldValue;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var NumberBitwiseOp = require('../NumberBitwiseOp');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-bitwiseOR

module.exports = function NumberBitwiseOR(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}
	return NumberBitwiseOp('|', x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var NumberBitwiseOp = require('../NumberBitwiseOp');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-bitwiseXOR

module.exports = function NumberBitwiseXOR(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}
	return NumberBitwiseOp('^', x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isFinite = require('../../helpers/isFinite');
var isNaN = require('../../helpers/isNaN');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-divide

module.exports = function NumberDivide(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}
	if (isNaN(x) || isNaN(y) || (!isFinite(x) && !isFinite(y))) {
		return NaN;
	}
	// shortcut for the actual spec mechanics
	return x / y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isNaN = require('../../helpers/isNaN');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-equal

module.exports = function NumberEqual(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}
	if (isNaN(x) || isNaN(y)) {
		return false;
	}
	// shortcut for the actual spec mechanics
	return x === y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
// var isNegativeZero = require('is-negative-zero');

var $pow = GetIntrinsic('%Math.pow%');

var $TypeError = GetIntrinsic('%TypeError%');

/*
var abs = require('../../helpers/abs');
var isFinite = require('../../helpers/isFinite');
var isNaN = require('../../helpers/isNaN');

var IsInteger = require('../IsInteger');
*/
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-exponentiate

/* eslint max-lines-per-function: 0, max-statements: 0 */

module.exports = function NumberExponentiate(base, exponent) {
	if (Type(base) !== 'Number' || Type(exponent) !== 'Number') {
		throw new $TypeError('Assertion failed: `base` and `exponent` arguments must be Numbers');
	}
	return $pow(base, exponent);
	/*
	if (isNaN(exponent)) {
		return NaN;
	}
	if (exponent === 0) {
		return 1;
	}
	if (isNaN(base)) {
		return NaN;
	}
	var aB = abs(base);
	if (aB > 1 && exponent === Infinity) {
		return Infinity;
	}
	if (aB > 1 && exponent === -Infinity) {
		return 0;
	}
	if (aB === 1 && (exponent === Infinity || exponent === -Infinity)) {
		return NaN;
	}
	if (aB < 1 && exponent === Infinity) {
		return +0;
	}
	if (aB < 1 && exponent === -Infinity) {
		return Infinity;
	}
	if (base === Infinity) {
		return exponent > 0 ? Infinity : 0;
	}
	if (base === -Infinity) {
		var isOdd = true;
		if (exponent > 0) {
			return isOdd ? -Infinity : Infinity;
		}
		return isOdd ? -0 : 0;
	}
	if (exponent > 0) {
		return isNegativeZero(base) ? Infinity : 0;
	}
	if (isNegativeZero(base)) {
		if (exponent > 0) {
			return isOdd ? -0 : 0;
		}
		return isOdd ? -Infinity : Infinity;
	}
	if (base < 0 && isFinite(base) && isFinite(exponent) && !IsInteger(exponent)) {
		return NaN;
	}
	*/
};
'use strict';

var add = require('./add');
var bitwiseAND = require('./bitwiseAND');
var bitwiseNOT = require('./bitwiseNOT');
var bitwiseOR = require('./bitwiseOR');
var bitwiseXOR = require('./bitwiseXOR');
var divide = require('./divide');
var equal = require('./equal');
var exponentiate = require('./exponentiate');
var leftShift = require('./leftShift');
var lessThan = require('./lessThan');
var multiply = require('./multiply');
var remainder = require('./remainder');
var sameValue = require('./sameValue');
var sameValueZero = require('./sameValueZero');
var signedRightShift = require('./signedRightShift');
var subtract = require('./subtract');
var toString = require('./toString');
var unaryMinus = require('./unaryMinus');
var unsignedRightShift = require('./unsignedRightShift');

module.exports = {
	add: add,
	bitwiseAND: bitwiseAND,
	bitwiseNOT: bitwiseNOT,
	bitwiseOR: bitwiseOR,
	bitwiseXOR: bitwiseXOR,
	divide: divide,
	equal: equal,
	exponentiate: exponentiate,
	leftShift: leftShift,
	lessThan: lessThan,
	multiply: multiply,
	remainder: remainder,
	sameValue: sameValue,
	sameValueZero: sameValueZero,
	signedRightShift: signedRightShift,
	subtract: subtract,
	toString: toString,
	unaryMinus: unaryMinus,
	unsignedRightShift: unsignedRightShift
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var ToInt32 = require('../ToInt32');
var ToUint32 = require('../ToUint32');
var modulo = require('../modulo');
var Type = require('../Type');

// https://262.ecma-international.org/12.0/#sec-numeric-types-number-leftShift

module.exports = function NumberLeftShift(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}

	var lnum = ToInt32(x);
	var rnum = ToUint32(y);

	var shiftCount = modulo(rnum, 32);

	return lnum << shiftCount;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isNaN = require('../../helpers/isNaN');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-lessThan

module.exports = function NumberLessThan(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}

	// If x is NaN, return undefined.
	// If y is NaN, return undefined.
	if (isNaN(x) || isNaN(y)) {
		return void undefined;
	}

	// shortcut for the actual spec mechanics
	return x < y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isNaN = require('../../helpers/isNaN');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-multiply

module.exports = function NumberMultiply(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}

	if (isNaN(x) || isNaN(y) || (x === 0 && !isFinite(y)) || (!isFinite(x) && y === 0)) {
		return NaN;
	}
	if (!isFinite(x) && !isFinite(y)) {
		return x === y ? Infinity : -Infinity;
	}
	if (!isFinite(x) && y !== 0) {
		return x > 0 ? Infinity : -Infinity;
	}
	if (!isFinite(y) && x !== 0) {
		return y > 0 ? Infinity : -Infinity;
	}

	// shortcut for the actual spec mechanics
	return x * y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isNaN = require('../../helpers/isNaN');

var Type = require('../Type');

// https://262.ecma-international.org/12.0/#sec-numeric-types-number-remainder

module.exports = function NumberRemainder(n, d) {
	if (Type(n) !== 'Number' || Type(d) !== 'Number') {
		throw new $TypeError('Assertion failed: `n` and `d` arguments must be Numbers');
	}

	// If either operand is NaN, the result is NaN.
	// If the dividend is an infinity, or the divisor is a zero, or both, the result is NaN.
	if (isNaN(n) || isNaN(d) || !isFinite(n) || d === 0) {
		return NaN;
	}

	// If the dividend is finite and the divisor is an infinity, the result equals the dividend.
	// If the dividend is a zero and the divisor is nonzero and finite, the result is the same as the dividend.
	if (!isFinite(d) || n === 0) {
		return n;
	}

	// In the remaining cases, where neither an infinity, nor a zero, nor NaN is involved…
	return n % d;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var isNegativeZero = require('is-negative-zero');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');
var NumberSameValueZero = require('./sameValueZero');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-sameValue

module.exports = function NumberSameValue(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}
	if (x === 0 && y === 0) {
		return !(isNegativeZero(x) ^ isNegativeZero(y));
	}
	return NumberSameValueZero(x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isNaN = require('../../helpers/isNaN');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-sameValueZero

module.exports = function NumberSameValueZero(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}

	var xNaN = isNaN(x);
	var yNaN = isNaN(y);
	if (xNaN || yNaN) {
		return xNaN === yNaN;
	}
	return x === y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var ToInt32 = require('../ToInt32');
var ToUint32 = require('../ToUint32');
var modulo = require('../modulo');
var Type = require('../Type');

// https://262.ecma-international.org/12.0/#sec-numeric-types-number-signedRightShift

module.exports = function NumberSignedRightShift(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}

	var lnum = ToInt32(x);
	var rnum = ToUint32(y);

	var shiftCount = modulo(rnum, 32);

	return lnum >> shiftCount;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

var NumberAdd = require('./add');
var NumberUnaryMinus = require('./unaryMinus');

// https://262.ecma-international.org/12.0/#sec-numeric-types-number-subtract

module.exports = function NumberSubtract(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}
	return NumberAdd(x, NumberUnaryMinus(y));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $String = GetIntrinsic('%String%');
var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-tostring

module.exports = function NumberToString(x) {
	if (Type(x) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` must be a Number');
	}

	return $String(x);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isNaN = require('../../helpers/isNaN');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-unaryMinus

module.exports = function NumberUnaryMinus(x) {
	if (Type(x) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` argument must be a Number');
	}
	if (isNaN(x)) {
		return NaN;
	}
	return -x;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var ToInt32 = require('../ToInt32');
var ToUint32 = require('../ToUint32');
var modulo = require('../modulo');
var Type = require('../Type');

// https://262.ecma-international.org/12.0/#sec-numeric-types-number-unsignedRightShift

module.exports = function NumberUnsignedRightShift(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}

	var lnum = ToInt32(x);
	var rnum = ToUint32(y);

	var shiftCount = modulo(rnum, 32);

	return lnum >>> shiftCount;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-add

module.exports = function BigIntAdd(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}

	// shortcut for the actual spec mechanics
	return x + y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var BigIntBitwiseOp = require('../BigIntBitwiseOp');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-bitwiseAND

module.exports = function BigIntBitwiseAND(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}
	return BigIntBitwiseOp('&', x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-bitwiseNOT

module.exports = function BigIntBitwiseNOT(x) {
	if (Type(x) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` argument must be a BigInt');
	}
	return -x - $BigInt(1);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var BigIntBitwiseOp = require('../BigIntBitwiseOp');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-bitwiseOR

module.exports = function BigIntBitwiseOR(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}
	return BigIntBitwiseOp('|', x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var BigIntBitwiseOp = require('../BigIntBitwiseOp');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-bitwiseXOR

module.exports = function BigIntBitwiseXOR(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}
	return BigIntBitwiseOp('^', x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $RangeError = GetIntrinsic('%RangeError%');
var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-divide

module.exports = function BigIntDivide(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}
	if (y === $BigInt(0)) {
		throw new $RangeError('Division by zero');
	}
	// shortcut for the actual spec mechanics
	return x / y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-equal

module.exports = function BigIntEqual(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}
	// shortcut for the actual spec mechanics
	return x === y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $RangeError = GetIntrinsic('%RangeError%');
var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-exponentiate

module.exports = function BigIntExponentiate(base, exponent) {
	if (Type(base) !== 'BigInt' || Type(exponent) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `base` and `exponent` arguments must be BigInts');
	}
	if (exponent < $BigInt(0)) {
		throw new $RangeError('Exponent must be positive');
	}
	if (/* base === $BigInt(0) && */ exponent === $BigInt(0)) {
		return $BigInt(1);
	}

	var square = base;
	var remaining = exponent;
	while (remaining > $BigInt(0)) {
		square += exponent;
		--remaining; // eslint-disable-line no-plusplus
	}
	return square;
};
'use strict';

var add = require('./add');
var bitwiseAND = require('./bitwiseAND');
var bitwiseNOT = require('./bitwiseNOT');
var bitwiseOR = require('./bitwiseOR');
var bitwiseXOR = require('./bitwiseXOR');
var divide = require('./divide');
var equal = require('./equal');
var exponentiate = require('./exponentiate');
var leftShift = require('./leftShift');
var lessThan = require('./lessThan');
var multiply = require('./multiply');
var remainder = require('./remainder');
var sameValue = require('./sameValue');
var sameValueZero = require('./sameValueZero');
var signedRightShift = require('./signedRightShift');
var subtract = require('./subtract');
var toString = require('./toString');
var unaryMinus = require('./unaryMinus');
var unsignedRightShift = require('./unsignedRightShift');

module.exports = {
	add: add,
	bitwiseAND: bitwiseAND,
	bitwiseNOT: bitwiseNOT,
	bitwiseOR: bitwiseOR,
	bitwiseXOR: bitwiseXOR,
	divide: divide,
	equal: equal,
	exponentiate: exponentiate,
	leftShift: leftShift,
	lessThan: lessThan,
	multiply: multiply,
	remainder: remainder,
	sameValue: sameValue,
	sameValueZero: sameValueZero,
	signedRightShift: signedRightShift,
	subtract: subtract,
	toString: toString,
	unaryMinus: unaryMinus,
	unsignedRightShift: unsignedRightShift
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-leftShift

module.exports = function BigIntLeftShift(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}

	// shortcut for the actual spec mechanics
	return x << y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-lessThan

module.exports = function BigIntLessThan(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}

	// shortcut for the actual spec mechanics
	return x < y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-multiply

module.exports = function BigIntMultiply(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}

	// shortcut for the actual spec mechanics
	return x * y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $RangeError = GetIntrinsic('%RangeError%');
var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

var zero = $BigInt && $BigInt(0);

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-remainder

module.exports = function BigIntRemainder(n, d) {
	if (Type(n) !== 'BigInt' || Type(d) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `n` and `d` arguments must be BigInts');
	}

	if (d === zero) {
		throw new $RangeError('Division by zero');
	}

	if (n === zero) {
		return zero;
	}

	// shortcut for the actual spec mechanics
	return n % d;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');
var BigIntEqual = require('./equal');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-sameValue

module.exports = function BigIntSameValue(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}

	return BigIntEqual(x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');
var BigIntEqual = require('./equal');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-sameValueZero

module.exports = function BigIntSameValueZero(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}

	return BigIntEqual(x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');
var BigIntLeftShift = require('./leftShift');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-signedRightShift

module.exports = function BigIntSignedRightShift(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}

	return BigIntLeftShift(x, -y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-subtract

module.exports = function BigIntSubtract(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}

	// shortcut for the actual spec mechanics
	return x - y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $String = GetIntrinsic('%String%');
var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-tostring

module.exports = function BigIntToString(x) {
	if (Type(x) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` must be a BigInt');
	}

	return $String(x);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

var zero = $BigInt && $BigInt(0);

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-unaryMinus

module.exports = function BigIntUnaryMinus(x) {
	if (Type(x) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` argument must be a BigInt');
	}

	if (x === zero) {
		return zero;
	}

	return -x;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-unsignedRightShift

module.exports = function BigIntUnsignedRightShift(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}

	throw new $TypeError('BigInts have no unsigned right shift, use >> instead');
};
'use strict';

var StrictEqualityComparison = require('./StrictEqualityComparison');
var StringToBigInt = require('./StringToBigInt');
var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

var isNaN = require('../helpers/isNaN');

// https://ecma-international.org/ecma-262/11.0/#sec-abstract-equality-comparison

module.exports = function AbstractEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType === yType) {
		return StrictEqualityComparison(x, y);
	}
	if (x == null && y == null) {
		return true;
	}
	if (xType === 'Number' && yType === 'String') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if (xType === 'String' && yType === 'Number') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (xType === 'BigInt' && yType === 'String') {
		var n = StringToBigInt(y);
		if (isNaN(n)) {
			return false;
		}
		return AbstractEqualityComparison(x, n);
	}
	if (xType === 'String' && yType === 'BigInt') {
		return AbstractEqualityComparison(y, x);
	}
	if (xType === 'Boolean') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (yType === 'Boolean') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if ((xType === 'String' || xType === 'Number' || xType === 'BigInt' || xType === 'Symbol') && yType === 'Object') {
		return AbstractEqualityComparison(x, ToPrimitive(y));
	}
	if (xType === 'Object' && (yType === 'String' || yType === 'Number' || yType === 'BigInt' || yType === 'Symbol')) {
		return AbstractEqualityComparison(ToPrimitive(x), y);
	}
	if ((xType === 'BigInt' && yType === 'Number') || (xType === 'Number' && yType === 'BigInt')) {
		if (isNaN(x) || isNaN(y) || x === Infinity || y === Infinity || x === -Infinity || y === -Infinity) {
			return false;
		}
		return x == y; // eslint-disable-line eqeqeq
	}
	return false;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Number = GetIntrinsic('%Number%');
var $TypeError = GetIntrinsic('%TypeError%');

var $isNaN = require('../helpers/isNaN');

var IsStringPrefix = require('./IsStringPrefix');
var StringToBigInt = require('./StringToBigInt');
var ToNumeric = require('./ToNumeric');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

var BigIntLessThan = require('./BigInt/lessThan');
var NumberLessThan = require('./Number/lessThan');

// https://262.ecma-international.org/9.0/#sec-abstract-relational-comparison

// eslint-disable-next-line max-statements, max-lines-per-function
module.exports = function AbstractRelationalComparison(x, y, LeftFirst) {
	if (Type(LeftFirst) !== 'Boolean') {
		throw new $TypeError('Assertion failed: LeftFirst argument must be a Boolean');
	}
	var px;
	var py;
	if (LeftFirst) {
		px = ToPrimitive(x, $Number);
		py = ToPrimitive(y, $Number);
	} else {
		py = ToPrimitive(y, $Number);
		px = ToPrimitive(x, $Number);
	}
	if (Type(px) === 'String' && Type(py) === 'String') {
		if (IsStringPrefix(py, px)) {
			return false;
		}
		if (IsStringPrefix(px, py)) {
			return true;
		}
		return px < py; // both strings, neither a prefix of the other. shortcut for steps 3 c-f
	}

	var pxType = Type(px);
	var pyType = Type(py);
	var nx;
	var ny;
	if (pxType === 'BigInt' && pyType === 'String') {
		ny = StringToBigInt(py);
		if ($isNaN(ny)) {
			return void undefined;
		}
		return BigIntLessThan(px, ny);
	}
	if (pxType === 'String' && pyType === 'BigInt') {
		nx = StringToBigInt(px);
		if ($isNaN(nx)) {
			return void undefined;
		}
		return BigIntLessThan(px, ny);
	}

	nx = ToNumeric(px);
	ny = ToNumeric(py);
	var nxType = Type(nx);
	if (nxType === Type(ny)) {
		return nxType === 'Number' ? NumberLessThan(nx, ny) : BigIntLessThan(nx, ny);
	}

	if ($isNaN(nx) || $isNaN(ny)) {
		return void undefined;
	}
	if (nx === -Infinity || ny === Infinity) {
		return true;
	}
	if (nx === Infinity || ny === -Infinity) {
		return false;
	}

	return nx < ny; // by now, these are both nonzero, finite, and not equal
};
'use strict';

var inspect = require('object-inspect');

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var Get = require('./Get');
var GetIterator = require('./GetIterator');
var IsCallable = require('./IsCallable');
var IteratorClose = require('./IteratorClose');
var IteratorStep = require('./IteratorStep');
var IteratorValue = require('./IteratorValue');
var Type = require('./Type');

// https://262.ecma-international.org/10.0//#sec-add-entries-from-iterable

module.exports = function AddEntriesFromIterable(target, iterable, adder) {
	if (!IsCallable(adder)) {
		throw new $TypeError('Assertion failed: `adder` is not callable');
	}
	if (iterable == null) {
		throw new $TypeError('Assertion failed: `iterable` is present, and not nullish');
	}
	var iteratorRecord = GetIterator(iterable);
	while (true) { // eslint-disable-line no-constant-condition
		var next = IteratorStep(iteratorRecord);
		if (!next) {
			return target;
		}
		var nextItem = IteratorValue(next);
		if (Type(nextItem) !== 'Object') {
			var error = new $TypeError('iterator next must return an Object, got ' + inspect(nextItem));
			return IteratorClose(
				iteratorRecord,
				function () { throw error; } // eslint-disable-line no-loop-func
			);
		}
		try {
			var k = Get(nextItem, '0');
			var v = Get(nextItem, '1');
			Call(adder, target, [k, v]);
		} catch (e) {
			return IteratorClose(
				iteratorRecord,
				function () { throw e; }
			);
		}
	}
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');
var SLOT = require('internal-slot');

var $TypeError = GetIntrinsic('%TypeError%');

var ClearKeptObjects = require('./ClearKeptObjects');
var Type = require('./Type');

var $push = callBound('Array.prototype.push');

// https://ecma-international.org/ecma-262/12.0/#sec-addtokeptobjects

module.exports = function AddToKeptObjects(object) {
	if (Type(object) !== 'Object') {
		throw new $TypeError('Assertion failed: `object` must be an Object');
	}
	$push(SLOT.get(ClearKeptObjects, '[[es-abstract internal: KeptAlive]]'), object);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var CodePointAt = require('./CodePointAt');
var IsIntegralNumber = require('./IsIntegralNumber');
var Type = require('./Type');

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');

var $TypeError = GetIntrinsic('%TypeError%');

// https://ecma-international.org/ecma-262/12.0/#sec-advancestringindex

module.exports = function AdvanceStringIndex(S, index, unicode) {
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	if (!IsIntegralNumber(index) || index < 0 || index > MAX_SAFE_INTEGER) {
		throw new $TypeError('Assertion failed: `length` must be an integer >= 0 and <= 2**53');
	}
	if (Type(unicode) !== 'Boolean') {
		throw new $TypeError('Assertion failed: `unicode` must be a Boolean');
	}
	if (!unicode) {
		return index + 1;
	}
	var length = S.length;
	if ((index + 1) >= length) {
		return index + 1;
	}
	var cp = CodePointAt(S, index);
	return index + cp['[[CodeUnitCount]]'];
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var HasOwnProperty = require('./HasOwnProperty');
var ToNumeric = require('./ToNumeric');
var ToPrimitive = require('./ToPrimitive');
var ToString = require('./ToString');
var Type = require('./Type');

var NumberAdd = require('./Number/add');
var NumberBitwiseAND = require('./Number/bitwiseAND');
var NumberBitwiseOR = require('./Number/bitwiseOR');
var NumberBitwiseXOR = require('./Number/bitwiseXOR');
var NumberDivide = require('./Number/divide');
var NumberExponentiate = require('./Number/exponentiate');
var NumberLeftShift = require('./Number/leftShift');
var NumberMultiply = require('./Number/multiply');
var NumberRemainder = require('./Number/remainder');
var NumberSignedRightShift = require('./Number/signedRightShift');
var NumberSubtract = require('./Number/subtract');
var NumberUnsignedRightShift = require('./Number/unsignedRightShift');
var BigIntAdd = require('./BigInt/add');
var BigIntBitwiseAND = require('./BigInt/bitwiseAND');
var BigIntBitwiseOR = require('./BigInt/bitwiseOR');
var BigIntBitwiseXOR = require('./BigInt/bitwiseXOR');
var BigIntDivide = require('./BigInt/divide');
var BigIntExponentiate = require('./BigInt/exponentiate');
var BigIntLeftShift = require('./BigInt/leftShift');
var BigIntMultiply = require('./BigInt/multiply');
var BigIntRemainder = require('./BigInt/remainder');
var BigIntSignedRightShift = require('./BigInt/signedRightShift');
var BigIntSubtract = require('./BigInt/subtract');
var BigIntUnsignedRightShift = require('./BigInt/unsignedRightShift');

// https://ecma-international.org/ecma-262/12.0/#sec-applystringornumericbinaryoperator

// https://ecma-international.org/ecma-262/12.0/#step-applystringornumericbinaryoperator-operations-table
var table = {
	'**': [NumberExponentiate, BigIntExponentiate],
	'*': [NumberMultiply, BigIntMultiply],
	'/': [NumberDivide, BigIntDivide],
	'%': [NumberRemainder, BigIntRemainder],
	'+': [NumberAdd, BigIntAdd],
	'-': [NumberSubtract, BigIntSubtract],
	'<<': [NumberLeftShift, BigIntLeftShift],
	'>>': [NumberSignedRightShift, BigIntSignedRightShift],
	'>>>': [NumberUnsignedRightShift, BigIntUnsignedRightShift],
	'&': [NumberBitwiseAND, BigIntBitwiseAND],
	'^': [NumberBitwiseXOR, BigIntBitwiseXOR],
	'|': [NumberBitwiseOR, BigIntBitwiseOR]
};

module.exports = function ApplyStringOrNumericBinaryOperator(lval, opText, rval) {
	if (Type(opText) !== 'String' || !HasOwnProperty(table, opText)) {
		throw new $TypeError('Assertion failed: `opText` must be a valid operation string');
	}
	if (opText === '+') {
		var lprim = ToPrimitive(lval);
		var rprim = ToPrimitive(rval);
		if (Type(lprim) === 'String' || Type(rprim) === 'String') {
			var lstr = ToString(lprim);
			var rstr = ToString(rprim);
			return lstr + rstr;
		}
		/* eslint no-param-reassign: 1 */
		lval = lprim;
		rval = rprim;
	}
	var lnum = ToNumeric(lval);
	var rnum = ToNumeric(rval);
	var T = Type(lnum);
	if (T !== Type(rnum)) {
		throw new $TypeError('types of ' + lnum + ' and ' + rnum + ' differ');
	}
	var Operation = table[opText][T === 'BigInt' ? 1 : 0];
	return Operation(lnum, rnum);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $ArrayPrototype = GetIntrinsic('%Array.prototype%');
var $RangeError = GetIntrinsic('%RangeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var IsIntegralNumber = require('./IsIntegralNumber');

var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1;

var $setProto = GetIntrinsic('%Object.setPrototypeOf%', true) || (
	// eslint-disable-next-line no-proto, no-negated-condition
	[].__proto__ !== $ArrayPrototype
		? null
		: function (O, proto) {
			O.__proto__ = proto; // eslint-disable-line no-proto, no-param-reassign
			return O;
		}
);

// https://www.ecma-international.org/ecma-262/12.0/#sec-arraycreate

module.exports = function ArrayCreate(length) {
	if (!IsIntegralNumber(length) || length < 0) {
		throw new $TypeError('Assertion failed: `length` must be an integer Number >= 0');
	}
	if (length > MAX_ARRAY_LENGTH) {
		throw new $RangeError('length is greater than (2**32 - 1)');
	}
	var proto = arguments.length > 1 ? arguments[1] : $ArrayPrototype;
	var A = []; // steps 3, 5
	if (proto !== $ArrayPrototype) { // step 4
		if (!$setProto) {
			throw new $SyntaxError('ArrayCreate: a `proto` argument that is not `Array.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
		}
		$setProto(A, proto);
	}
	if (length !== 0) { // bypasses the need for step 6
		A.length = length;
	}
	/* step 6, the above as a shortcut for the below
	OrdinaryDefineOwnProperty(A, 'length', {
		'[[Configurable]]': false,
		'[[Enumerable]]': false,
		'[[Value]]': length,
		'[[Writable]]': true
	});
	*/
	return A;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $RangeError = GetIntrinsic('%RangeError%');
var $TypeError = GetIntrinsic('%TypeError%');

var assign = require('object.assign');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var IsArray = require('./IsArray');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var OrdinaryDefineOwnProperty = require('./OrdinaryDefineOwnProperty');
var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
var ToNumber = require('./ToNumber');
var ToString = require('./ToString');
var ToUint32 = require('./ToUint32');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-arraysetlength

// eslint-disable-next-line max-statements, max-lines-per-function
module.exports = function ArraySetLength(A, Desc) {
	if (!IsArray(A)) {
		throw new $TypeError('Assertion failed: A must be an Array');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (!('[[Value]]' in Desc)) {
		return OrdinaryDefineOwnProperty(A, 'length', Desc);
	}
	var newLenDesc = assign({}, Desc);
	var newLen = ToUint32(Desc['[[Value]]']);
	var numberLen = ToNumber(Desc['[[Value]]']);
	if (newLen !== numberLen) {
		throw new $RangeError('Invalid array length');
	}
	newLenDesc['[[Value]]'] = newLen;
	var oldLenDesc = OrdinaryGetOwnProperty(A, 'length');
	if (!IsDataDescriptor(oldLenDesc)) {
		throw new $TypeError('Assertion failed: an array had a non-data descriptor on `length`');
	}
	var oldLen = oldLenDesc['[[Value]]'];
	if (newLen >= oldLen) {
		return OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
	}
	if (!oldLenDesc['[[Writable]]']) {
		return false;
	}
	var newWritable;
	if (!('[[Writable]]' in newLenDesc) || newLenDesc['[[Writable]]']) {
		newWritable = true;
	} else {
		newWritable = false;
		newLenDesc['[[Writable]]'] = true;
	}
	var succeeded = OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
	if (!succeeded) {
		return false;
	}
	while (newLen < oldLen) {
		oldLen -= 1;
		// eslint-disable-next-line no-param-reassign
		var deleteSucceeded = delete A[ToString(oldLen)];
		if (!deleteSucceeded) {
			newLenDesc['[[Value]]'] = oldLen + 1;
			if (!newWritable) {
				newLenDesc['[[Writable]]'] = false;
				OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
				return false;
			}
		}
	}
	if (!newWritable) {
		return OrdinaryDefineOwnProperty(A, 'length', { '[[Writable]]': false });
	}
	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $species = GetIntrinsic('%Symbol.species%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var ArrayCreate = require('./ArrayCreate');
var Get = require('./Get');
var IsArray = require('./IsArray');
var IsConstructor = require('./IsConstructor');
var IsIntegralNumber = require('./IsIntegralNumber');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/12.0/#sec-arrayspeciescreate

module.exports = function ArraySpeciesCreate(originalArray, length) {
	if (!IsIntegralNumber(length) || length < 0) {
		throw new $TypeError('Assertion failed: length must be an integer >= 0');
	}

	var isArray = IsArray(originalArray);
	if (!isArray) {
		return ArrayCreate(length);
	}

	var C = Get(originalArray, 'constructor');
	// TODO: figure out how to make a cross-realm normal Array, a same-realm Array
	// if (IsConstructor(C)) {
	// 	if C is another realm's Array, C = undefined
	// 	Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?
	// }
	if ($species && Type(C) === 'Object') {
		C = Get(C, $species);
		if (C === null) {
			C = void 0;
		}
	}

	if (typeof C === 'undefined') {
		return ArrayCreate(length);
	}
	if (!IsConstructor(C)) {
		throw new $TypeError('C must be a constructor');
	}
	return new C(length); // Construct(C, length);
};

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
// var $BigInt = GetIntrinsic('%BigInt%', true);
// var $pow = GetIntrinsic('%Math.pow%');

// var BinaryAnd = require('./BinaryAnd');
// var BinaryOr = require('./BinaryOr');
// var BinaryXor = require('./BinaryXor');
var Type = require('./Type');
// var modulo = require('./modulo');

// var zero = $BigInt && $BigInt(0);
// var negOne = $BigInt && $BigInt(-1);
// var two = $BigInt && $BigInt(2);

// https://262.ecma-international.org/11.0/#sec-bigintbitwiseop

module.exports = function BigIntBitwiseOp(op, x, y) {
	if (op !== '&' && op !== '|' && op !== '^') {
		throw new $TypeError('Assertion failed: `op` must be `&`, `|`, or `^`');
	}
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('`x` and `y` must be BigInts');
	}

	if (op === '&') {
		return x & y;
	}
	if (op === '|') {
		return x | y;
	}
	return x ^ y;
	/*
	var result = zero;
	var shift = 0;
	while (x !== zero && x !== negOne && y !== zero && y !== negOne) {
		var xDigit = modulo(x, two);
		var yDigit = modulo(y, two);
		if (op === '&') {
			result += $pow(2, shift) * BinaryAnd(xDigit, yDigit);
		} else if (op === '|') {
			result += $pow(2, shift) * BinaryOr(xDigit, yDigit);
		} else if (op === '^') {
			result += $pow(2, shift) * BinaryXor(xDigit, yDigit);
		}
		shift += 1;
		x = (x - xDigit) / two;
		y = (y - yDigit) / two;
	}
	var tmp;
	if (op === '&') {
		tmp = BinaryAnd(modulo(x, two), modulo(y, two));
	} else if (op === '|') {
		tmp = BinaryAnd(modulo(x, two), modulo(y, two));
	} else {
		tmp = BinaryXor(modulo(x, two), modulo(y, two));
	}
	if (tmp !== 0) {
		result -= $pow(2, shift);
	}
	return result;
	*/
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

// https://262.ecma-international.org/11.0/#sec-binaryand

module.exports = function BinaryAnd(x, y) {
	if ((x !== 0 && x !== 1) || (y !== 0 && y !== 1)) {
		throw new $TypeError('Assertion failed: `x` and `y` must be either 0 or 1');
	}
	return x & y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

// https://262.ecma-international.org/11.0/#sec-binaryor

module.exports = function BinaryOr(x, y) {
	if ((x !== 0 && x !== 1) || (y !== 0 && y !== 1)) {
		throw new $TypeError('Assertion failed: `x` and `y` must be either 0 or 1');
	}
	return x | y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

// https://262.ecma-international.org/11.0/#sec-binaryxor

module.exports = function BinaryXor(x, y) {
	if ((x !== 0 && x !== 1) || (y !== 0 && y !== 1)) {
		throw new $TypeError('Assertion failed: `x` and `y` must be either 0 or 1');
	}
	return x ^ y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');

var $push = callBound('Array.prototype.push');

var IsArray = require('./IsArray');

var isByteValue = require('../helpers/isByteValue');

// https://ecma-international.org/ecma-262/12.0/#sec-bytelistbitwiseop

module.exports = function ByteListBitwiseOp(op, xBytes, yBytes) {
	if (op !== '&' && op !== '^' && op !== '|') {
		throw new $TypeError('Assertion failed: `op` must be `&`, `^`, or `|`');
	}
	if (!IsArray(xBytes) || !IsArray(yBytes) || xBytes.length !== yBytes.length) {
		throw new $TypeError('Assertion failed: `xBytes` and `yBytes` must be same-length sequences of byte values (an integer 0-255, inclusive)');
	}

	var result = [];

	for (var i = 0; i < xBytes.length; i += 1) {
		var xByte = xBytes[i];
		var yByte = yBytes[i];
		if (!isByteValue(xByte) || !isByteValue(yByte)) {
			throw new $TypeError('Assertion failed: `xBytes` and `yBytes` must be same-length sequences of byte values (an integer 0-255, inclusive)');
		}
		var resultByte;
		if (op === '&') {
			resultByte = xByte & yByte;
		} else if (op === '^') {
			resultByte = xByte ^ yByte;
		} else {
			resultByte = xByte | yByte;
		}
		$push(result, resultByte);
	}

	return result;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsArray = require('./IsArray');

var isByteValue = require('../helpers/isByteValue');

// https://ecma-international.org/ecma-262/12.0/#sec-bytelistequal

module.exports = function ByteListEqual(xBytes, yBytes) {
	if (!IsArray(xBytes) || !IsArray(yBytes)) {
		throw new $TypeError('Assertion failed: `xBytes` and `yBytes` must be sequences of byte values (an integer 0-255, inclusive)');
	}

	if (xBytes.length !== yBytes.length) {
		return false;
	}

	for (var i = 0; i < xBytes.length; i += 1) {
		var xByte = xBytes[i];
		var yByte = yBytes[i];
		if (!isByteValue(xByte) || !isByteValue(yByte)) {
			throw new $TypeError('Assertion failed: `xBytes` and `yBytes` must be sequences of byte values (an integer 0-255, inclusive)');
		}
		if (xByte !== yByte) {
			return false;
		}
	}
	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');

var IsArray = require('./IsArray');

var $apply = GetIntrinsic('%Reflect.apply%', true) || callBound('%Function.prototype.apply%');

// https://ecma-international.org/ecma-262/6.0/#sec-call

module.exports = function Call(F, V) {
	var argumentsList = arguments.length > 2 ? arguments[2] : [];
	if (!IsArray(argumentsList)) {
		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
	}
	return $apply(F, V, argumentsList);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var SameValue = require('./SameValue');
var ToNumber = require('./ToNumber');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring

module.exports = function CanonicalNumericIndexString(argument) {
	if (Type(argument) !== 'String') {
		throw new $TypeError('Assertion failed: `argument` must be a String');
	}
	if (argument === '-0') { return -0; }
	var n = ToNumber(argument);
	if (SameValue(ToString(n), argument)) { return n; }
	return void 0;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $fromCharCode = GetIntrinsic('%String.fromCharCode%');
var $TypeError = GetIntrinsic('%TypeError%');
var $charCodeAt = callBound('%String.prototype.charCodeAt%');
var $push = callBound('%Array.prototype.push%');

module.exports = function CharacterRange(A, B) {
	if (A.length !== 1 || B.length !== 1) {
		throw new $TypeError('Assertion failed: CharSets A and B contain exactly one character');
	}

	var a = A[0];
	var b = B[0];

	var i = $charCodeAt(a, 0);
	var j = $charCodeAt(b, 0);

	if (!(i <= j)) {
		throw new $TypeError('Assertion failed: i is not <= j');
	}

	var arr = [];
	for (var k = i; k <= j; k += 1) {
		$push(arr, $fromCharCode(k));
	}
	return arr;
};
'use strict';

var SLOT = require('internal-slot');
var keptObjects = [];

// https://ecma-international.org/ecma-262/12.0/#sec-clear-kept-objects

module.exports = function ClearKeptObjects() {
	keptObjects.length = 0;
};

SLOT.set(module.exports, '[[es-abstract internal: KeptAlive]]', keptObjects);
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var callBound = require('call-bind/callBound');
var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');

var Type = require('./Type');
var UTF16SurrogatePairToCodePoint = require('./UTF16SurrogatePairToCodePoint');

var $charAt = callBound('String.prototype.charAt');
var $charCodeAt = callBound('String.prototype.charCodeAt');

// https://ecma-international.org/ecma-262/12.0/#sec-codepointat

module.exports = function CodePointAt(string, position) {
	if (Type(string) !== 'String') {
		throw new $TypeError('Assertion failed: `string` must be a String');
	}
	var size = string.length;
	if (position < 0 || position >= size) {
		throw new $TypeError('Assertion failed: `position` must be >= 0, and < the length of `string`');
	}
	var first = $charCodeAt(string, position);
	var cp = $charAt(string, position);
	var firstIsLeading = isLeadingSurrogate(first);
	var firstIsTrailing = isTrailingSurrogate(first);
	if (!firstIsLeading && !firstIsTrailing) {
		return {
			'[[CodePoint]]': cp,
			'[[CodeUnitCount]]': 1,
			'[[IsUnpairedSurrogate]]': false
		};
	}
	if (firstIsTrailing || (position + 1 === size)) {
		return {
			'[[CodePoint]]': cp,
			'[[CodeUnitCount]]': 1,
			'[[IsUnpairedSurrogate]]': true
		};
	}
	var second = $charCodeAt(string, position + 1);
	if (!isTrailingSurrogate(second)) {
		return {
			'[[CodePoint]]': cp,
			'[[CodeUnitCount]]': 1,
			'[[IsUnpairedSurrogate]]': true
		};
	}

	return {
		'[[CodePoint]]': UTF16SurrogatePairToCodePoint(first, second),
		'[[CodeUnitCount]]': 2,
		'[[IsUnpairedSurrogate]]': false
	};
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var UTF16EncodeCodePoint = require('./UTF16EncodeCodePoint');
var IsArray = require('./IsArray');

var forEach = require('../helpers/forEach');
var isCodePoint = require('../helpers/isCodePoint');

// https://ecma-international.org/ecma-262/12.0/#sec-codepointstostring

module.exports = function CodePointsToString(text) {
	if (!IsArray(text)) {
		throw new $TypeError('Assertion failed: `text` must be a sequence of Unicode Code Points');
	}
	var result = '';
	forEach(text, function (cp) {
		if (!isCodePoint(cp)) {
			throw new $TypeError('Assertion failed: `text` must be a sequence of Unicode Code Points');
		}
		result += UTF16EncodeCodePoint(cp);
	});
	return result;
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var IsDataDescriptor = require('./IsDataDescriptor');
var IsGenericDescriptor = require('./IsGenericDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor

module.exports = function CompletePropertyDescriptor(Desc) {
	/* eslint no-param-reassign: 0 */
	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
		if (!has(Desc, '[[Value]]')) {
			Desc['[[Value]]'] = void 0;
		}
		if (!has(Desc, '[[Writable]]')) {
			Desc['[[Writable]]'] = false;
		}
	} else {
		if (!has(Desc, '[[Get]]')) {
			Desc['[[Get]]'] = void 0;
		}
		if (!has(Desc, '[[Set]]')) {
			Desc['[[Set]]'] = void 0;
		}
	}
	if (!has(Desc, '[[Enumerable]]')) {
		Desc['[[Enumerable]]'] = false;
	}
	if (!has(Desc, '[[Configurable]]')) {
		Desc['[[Configurable]]'] = false;
	}
	return Desc;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');
var forEach = require('../helpers/forEach');
var every = require('../helpers/every');
var some = require('../helpers/some');
var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');

var CreateDataPropertyOrThrow = require('./CreateDataPropertyOrThrow');
var Get = require('./Get');
var IsArray = require('./IsArray');
var IsIntegralNumber = require('./IsIntegralNumber');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var ToNumber = require('./ToNumber');
var ToObject = require('./ToObject');
var Type = require('./Type');

// https://www.ecma-international.org/ecma-262/12.0/#sec-copydataproperties

module.exports = function CopyDataProperties(target, source, excludedItems) {
	if (Type(target) !== 'Object') {
		throw new $TypeError('Assertion failed: "target" must be an Object');
	}

	if (!IsArray(excludedItems) || !every(excludedItems, IsPropertyKey)) {
		throw new $TypeError('Assertion failed: "excludedItems" must be a List of Property Keys');
	}

	if (typeof source === 'undefined' || source === null) {
		return target;
	}

	var from = ToObject(source);

	var keys = OwnPropertyKeys(from);
	forEach(keys, function (nextKey) {
		var excluded = some(excludedItems, function (e) {
			return SameValue(e, nextKey) === true;
		});
		/*
		var excluded = false;

		forEach(excludedItems, function (e) {
			if (SameValue(e, nextKey) === true) {
				excluded = true;
			}
		});
		*/

		var enumerable = $isEnumerable(from, nextKey) || (
		// this is to handle string keys being non-enumerable in older engines
			typeof source === 'string'
			&& nextKey >= 0
			&& IsIntegralNumber(ToNumber(nextKey))
		);
		if (excluded === false && enumerable) {
			var propValue = Get(from, nextKey);
			CreateDataPropertyOrThrow(target, nextKey, propValue);
		}
	});

	return target;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createdataproperty

module.exports = function CreateDataProperty(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	var oldDesc = OrdinaryGetOwnProperty(O, P);
	var extensible = !oldDesc || IsExtensible(O);
	var nonConfigurable = oldDesc && !oldDesc['[[Configurable]]'];
	if (nonConfigurable || !extensible) {
		return false;
	}
	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		{
			'[[Configurable]]': true,
			'[[Enumerable]]': true,
			'[[Value]]': V,
			'[[Writable]]': true
		}
	);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var CreateDataProperty = require('./CreateDataProperty');
var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// // https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow

module.exports = function CreateDataPropertyOrThrow(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	var success = CreateDataProperty(O, P, V);
	if (!success) {
		throw new $TypeError('unable to create data property');
	}
	return success;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $replace = callBound('String.prototype.replace');

var RequireObjectCoercible = require('./RequireObjectCoercible');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createhtml

module.exports = function CreateHTML(string, tag, attribute, value) {
	if (Type(tag) !== 'String' || Type(attribute) !== 'String') {
		throw new $TypeError('Assertion failed: `tag` and `attribute` must be strings');
	}
	var str = RequireObjectCoercible(string);
	var S = ToString(str);
	var p1 = '<' + tag;
	if (attribute !== '') {
		var V = ToString(value);
		var escapedV = $replace(V, /\x22/g, '&quot;');
		p1 += '\x20' + attribute + '\x3D\x22' + escapedV + '\x22';
	}
	return p1 + '>' + S + '</' + tag + '>';
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject

module.exports = function CreateIterResultObject(value, done) {
	if (Type(done) !== 'Boolean') {
		throw new $TypeError('Assertion failed: Type(done) is not Boolean');
	}
	return {
		value: value,
		done: done
	};
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');
var $indexOf = callBound('Array.prototype.indexOf', true) || callBound('String.prototype.indexOf');
var $push = callBound('Array.prototype.push');

var Get = require('./Get');
var IsArray = require('./IsArray');
var LengthOfArrayLike = require('./LengthOfArrayLike');
var ToString = require('./ToString');
var Type = require('./Type');

// https://262.ecma-international.org/11.0/#sec-createlistfromarraylike

module.exports = function CreateListFromArrayLike(obj) {
	var elementTypes = arguments.length > 1
		? arguments[1]
		: ['Undefined', 'Null', 'Boolean', 'String', 'Symbol', 'Number', 'Object'];

	if (Type(obj) !== 'Object') {
		throw new $TypeError('Assertion failed: `obj` must be an Object');
	}
	if (!IsArray(elementTypes)) {
		throw new $TypeError('Assertion failed: `elementTypes`, if provided, must be an array');
	}
	var len = LengthOfArrayLike(obj);
	var list = [];
	var index = 0;
	while (index < len) {
		var indexName = ToString(index);
		var next = Get(obj, indexName);
		var nextType = Type(next);
		if ($indexOf(elementTypes, nextType) < 0) {
			throw new $TypeError('item type ' + nextType + ' is not a valid elementType');
		}
		$push(list, next);
		index += 1;
	}
	return list;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createmethodproperty

module.exports = function CreateMethodProperty(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	var newDesc = {
		'[[Configurable]]': true,
		'[[Enumerable]]': false,
		'[[Value]]': V,
		'[[Writable]]': true
	};
	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		newDesc
	);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var hasSymbols = require('has-symbols')();

var $TypeError = GetIntrinsic('%TypeError%');
var IteratorPrototype = GetIntrinsic('%IteratorPrototype%', true);
var $defineProperty = GetIntrinsic('%Object.defineProperty%', true);

var AdvanceStringIndex = require('./AdvanceStringIndex');
var CreateIterResultObject = require('./CreateIterResultObject');
var CreateMethodProperty = require('./CreateMethodProperty');
var Get = require('./Get');
var OrdinaryObjectCreate = require('./OrdinaryObjectCreate');
var RegExpExec = require('./RegExpExec');
var Set = require('./Set');
var ToLength = require('./ToLength');
var ToString = require('./ToString');
var Type = require('./Type');

var SLOT = require('internal-slot');

var RegExpStringIterator = function RegExpStringIterator(R, S, global, fullUnicode) {
	if (Type(S) !== 'String') {
		throw new $TypeError('`S` must be a string');
	}
	if (Type(global) !== 'Boolean') {
		throw new $TypeError('`global` must be a boolean');
	}
	if (Type(fullUnicode) !== 'Boolean') {
		throw new $TypeError('`fullUnicode` must be a boolean');
	}
	SLOT.set(this, '[[IteratingRegExp]]', R);
	SLOT.set(this, '[[IteratedString]]', S);
	SLOT.set(this, '[[Global]]', global);
	SLOT.set(this, '[[Unicode]]', fullUnicode);
	SLOT.set(this, '[[Done]]', false);
};

if (IteratorPrototype) {
	RegExpStringIterator.prototype = OrdinaryObjectCreate(IteratorPrototype);
}

var RegExpStringIteratorNext = function next() {
	var O = this; // eslint-disable-line no-invalid-this
	if (Type(O) !== 'Object') {
		throw new $TypeError('receiver must be an object');
	}
	if (
		!(O instanceof RegExpStringIterator)
		|| !SLOT.has(O, '[[IteratingRegExp]]')
		|| !SLOT.has(O, '[[IteratedString]]')
		|| !SLOT.has(O, '[[Global]]')
		|| !SLOT.has(O, '[[Unicode]]')
		|| !SLOT.has(O, '[[Done]]')
	) {
		throw new $TypeError('"this" value must be a RegExpStringIterator instance');
	}
	if (SLOT.get(O, '[[Done]]')) {
		return CreateIterResultObject(undefined, true);
	}
	var R = SLOT.get(O, '[[IteratingRegExp]]');
	var S = SLOT.get(O, '[[IteratedString]]');
	var global = SLOT.get(O, '[[Global]]');
	var fullUnicode = SLOT.get(O, '[[Unicode]]');
	var match = RegExpExec(R, S);
	if (match === null) {
		SLOT.set(O, '[[Done]]', true);
		return CreateIterResultObject(undefined, true);
	}
	if (global) {
		var matchStr = ToString(Get(match, '0'));
		if (matchStr === '') {
			var thisIndex = ToLength(Get(R, 'lastIndex'));
			var nextIndex = AdvanceStringIndex(S, thisIndex, fullUnicode);
			Set(R, 'lastIndex', nextIndex, true);
		}
		return CreateIterResultObject(match, false);
	}
	SLOT.set(O, '[[Done]]', true);
	return CreateIterResultObject(match, false);
};
CreateMethodProperty(RegExpStringIterator.prototype, 'next', RegExpStringIteratorNext);

if (hasSymbols) {
	if (Symbol.toStringTag) {
		if ($defineProperty) {
			$defineProperty(RegExpStringIterator.prototype, Symbol.toStringTag, {
				configurable: true,
				enumerable: false,
				value: 'RegExp String Iterator',
				writable: false
			});
		} else {
			RegExpStringIterator.prototype[Symbol.toStringTag] = 'RegExp String Iterator';
		}
	}

	if (Symbol.iterator && typeof RegExpStringIterator.prototype[Symbol.iterator] !== 'function') {
		var iteratorFn = function SymbolIterator() {
			return this;
		};
		CreateMethodProperty(RegExpStringIterator.prototype, Symbol.iterator, iteratorFn);
	}
}

// https://262.ecma-international.org/11.0/#sec-createregexpstringiterator
module.exports = function CreateRegExpStringIterator(R, S, global, fullUnicode) {
	// assert R.global === global && R.unicode === fullUnicode?
	return new RegExpStringIterator(R, S, global, fullUnicode);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');
var MonthFromTime = require('./MonthFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.5

module.exports = function DateFromTime(t) {
	var m = MonthFromTime(t);
	var d = DayWithinYear(t);
	if (m === 0) {
		return d + 1;
	}
	if (m === 1) {
		return d - 30;
	}
	var leap = InLeapYear(t);
	if (m === 2) {
		return d - 58 - leap;
	}
	if (m === 3) {
		return d - 89 - leap;
	}
	if (m === 4) {
		return d - 119 - leap;
	}
	if (m === 5) {
		return d - 150 - leap;
	}
	if (m === 6) {
		return d - 180 - leap;
	}
	if (m === 7) {
		return d - 211 - leap;
	}
	if (m === 8) {
		return d - 242 - leap;
	}
	if (m === 9) {
		return d - 272 - leap;
	}
	if (m === 10) {
		return d - 303 - leap;
	}
	if (m === 11) {
		return d - 333 - leap;
	}
	throw new $EvalError('Assertion failed: MonthFromTime returned an impossible value: ' + m);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var weekdays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];

var $isNaN = require('../helpers/isNaN');
var padTimeComponent = require('../helpers/padTimeComponent');

var Type = require('./Type');
var WeekDay = require('./WeekDay');
var MonthFromTime = require('./MonthFromTime');
var YearFromTime = require('./YearFromTime');
var DateFromTime = require('./DateFromTime');

// https://262.ecma-international.org/9.0/#sec-datestring

module.exports = function DateString(tv) {
	if (Type(tv) !== 'Number' || $isNaN(tv)) {
		throw new $TypeError('Assertion failed: `tv` must be a non-NaN Number');
	}
	var weekday = weekdays[WeekDay(tv)];
	var month = months[MonthFromTime(tv)];
	var day = padTimeComponent(DateFromTime(tv));
	var year = padTimeComponent(YearFromTime(tv), 4);
	return weekday + '\x20' + month + '\x20' + day + '\x20' + year;
};
'use strict';

var floor = require('./floor');

var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.2

module.exports = function Day(t) {
	return floor(t / msPerDay);
};
'use strict';

var floor = require('./floor');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function DayFromYear(y) {
	return (365 * (y - 1970)) + floor((y - 1969) / 4) - floor((y - 1901) / 100) + floor((y - 1601) / 400);
};

'use strict';

var Day = require('./Day');
var DayFromYear = require('./DayFromYear');
var YearFromTime = require('./YearFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.4

module.exports = function DayWithinYear(t) {
	return Day(t) - DayFromYear(YearFromTime(t));
};
'use strict';

var modulo = require('./modulo');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function DaysInYear(y) {
	if (modulo(y, 4) !== 0) {
		return 365;
	}
	if (modulo(y, 100) !== 0) {
		return 366;
	}
	if (modulo(y, 400) !== 0) {
		return 365;
	}
	return 366;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow

module.exports = function DefinePropertyOrThrow(O, P, desc) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	var Desc = isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, desc) ? desc : ToPropertyDescriptor(desc);
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc is not a valid Property Descriptor');
	}

	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		Desc
	);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-deletepropertyorthrow

module.exports = function DeletePropertyOrThrow(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// eslint-disable-next-line no-param-reassign
	var success = delete O[P];
	if (!success) {
		throw new $TypeError('Attempt to delete property failed.');
	}
	return success;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var objectKeys = require('object-keys');

var callBound = require('call-bind/callBound');

var callBind = require('call-bind');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
var $pushApply = callBind.apply(GetIntrinsic('%Array.prototype.push%'));

var forEach = require('../helpers/forEach');

var Type = require('./Type');

// https://262.ecma-international.org/8.0/#sec-enumerableownproperties

module.exports = function EnumerableOwnPropertyNames(O, kind) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	var keys = objectKeys(O);
	if (kind === 'key') {
		return keys;
	}
	if (kind === 'value' || kind === 'key+value') {
		var results = [];
		forEach(keys, function (key) {
			if ($isEnumerable(O, key)) {
				$pushApply(results, [
					kind === 'value' ? O[key] : [key, O[key]]
				]);
			}
		});
		return results;
	}
	throw new $TypeError('Assertion failed: "kind" is not "key", "value", or "key+value": ' + kind);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');

var Call = require('./Call');
var CreateDataPropertyOrThrow = require('./CreateDataPropertyOrThrow');
var Get = require('./Get');
var HasProperty = require('./HasProperty');
var IsArray = require('./IsArray');
var LengthOfArrayLike = require('./LengthOfArrayLike');
var ToString = require('./ToString');

// https://262.ecma-international.org/11.0/#sec-flattenintoarray

// eslint-disable-next-line max-params
module.exports = function FlattenIntoArray(target, source, sourceLen, start, depth) {
	var mapperFunction;
	if (arguments.length > 5) {
		mapperFunction = arguments[5];
	}

	var targetIndex = start;
	var sourceIndex = 0;
	while (sourceIndex < sourceLen) {
		var P = ToString(sourceIndex);
		var exists = HasProperty(source, P);
		if (exists === true) {
			var element = Get(source, P);
			if (typeof mapperFunction !== 'undefined') {
				if (arguments.length <= 6) {
					throw new $TypeError('Assertion failed: thisArg is required when mapperFunction is provided');
				}
				element = Call(mapperFunction, arguments[6], [element, sourceIndex, source]);
			}
			var shouldFlatten = false;
			if (depth > 0) {
				shouldFlatten = IsArray(element);
			}
			if (shouldFlatten) {
				var elementLen = LengthOfArrayLike(element);
				targetIndex = FlattenIntoArray(target, element, elementLen, targetIndex, depth - 1);
			} else {
				if (targetIndex >= MAX_SAFE_INTEGER) {
					throw new $TypeError('index too large');
				}
				CreateDataPropertyOrThrow(target, ToString(targetIndex), element);
				targetIndex += 1;
			}
		}
		sourceIndex += 1;
	}

	return targetIndex;
};
'use strict';

var assertRecord = require('../helpers/assertRecord');
var fromPropertyDescriptor = require('../helpers/fromPropertyDescriptor');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-frompropertydescriptor

module.exports = function FromPropertyDescriptor(Desc) {
	if (typeof Desc !== 'undefined') {
		assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
	}

	return fromPropertyDescriptor(Desc);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var inspect = require('object-inspect');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-get-o-p

module.exports = function Get(O, P) {
	// 7.3.1.1
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	// 7.3.1.2
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true, got ' + inspect(P));
	}
	// 7.3.1.3
	return O[P];
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $asyncIterator = GetIntrinsic('%Symbol.asyncIterator%', true);

var inspect = require('object-inspect');
var hasSymbols = require('has-symbols')();

var getIteratorMethod = require('../helpers/getIteratorMethod');
var AdvanceStringIndex = require('./AdvanceStringIndex');
var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsArray = require('./IsArray');
var Type = require('./Type');

// https://262.ecma-international.org/9.0/#sec-getiterator
module.exports = function GetIterator(obj, hint, method) {
	var actualHint = hint;
	if (arguments.length < 2) {
		actualHint = 'sync';
	}
	if (actualHint !== 'sync' && actualHint !== 'async') {
		throw new $TypeError("Assertion failed: `hint` must be one of 'sync' or 'async', got " + inspect(hint));
	}

	var actualMethod = method;
	if (arguments.length < 3) {
		if (actualHint === 'async') {
			if (hasSymbols && $asyncIterator) {
				actualMethod = GetMethod(obj, $asyncIterator);
			}
			if (actualMethod === undefined) {
				throw new $TypeError("async from sync iterators aren't currently supported");
			}
		} else {
			actualMethod = getIteratorMethod(
				{
					AdvanceStringIndex: AdvanceStringIndex,
					GetMethod: GetMethod,
					IsArray: IsArray
				},
				obj
			);
		}
	}
	var iterator = Call(actualMethod, obj);
	if (Type(iterator) !== 'Object') {
		throw new $TypeError('iterator must return an object');
	}

	return iterator;

	// TODO: This should return an IteratorRecord
	/*
	var nextMethod = GetV(iterator, 'next');
	return {
		'[[Iterator]]': iterator,
		'[[NextMethod]]': nextMethod,
		'[[Done]]': false
	};
	*/
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var GetV = require('./GetV');
var IsCallable = require('./IsCallable');
var IsPropertyKey = require('./IsPropertyKey');

// https://ecma-international.org/ecma-262/6.0/#sec-getmethod

module.exports = function GetMethod(O, P) {
	// 7.3.9.1
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// 7.3.9.2
	var func = GetV(O, P);

	// 7.3.9.4
	if (func == null) {
		return void 0;
	}

	// 7.3.9.5
	if (!IsCallable(func)) {
		throw new $TypeError(P + 'is not a function');
	}

	// 7.3.9.6
	return func;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var hasSymbols = require('has-symbols')();

var $TypeError = GetIntrinsic('%TypeError%');

var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%', true);
var $gOPS = hasSymbols && GetIntrinsic('%Object.getOwnPropertySymbols%', true);
var keys = require('object-keys');

var esType = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getownpropertykeys

module.exports = function GetOwnPropertyKeys(O, Type) {
	if (esType(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (Type === 'Symbol') {
		return $gOPS ? $gOPS(O) : [];
	}
	if (Type === 'String') {
		if (!$gOPN) {
			return keys(O);
		}
		return $gOPN(O);
	}
	throw new $TypeError('Assertion failed: `Type` must be `"String"` or `"Symbol"`');
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsCallable = require('./IsCallable');
var IsConstructor = require('./IsConstructor');

// https://ecma-international.org/ecma-262/12.0/#sec-getpromiseresolve

module.exports = function GetPromiseResolve(promiseConstructor) {
	if (!IsConstructor(promiseConstructor)) {
		throw new $TypeError('Assertion failed: `promiseConstructor` must be a constructor');
	}
	var promiseResolve = Get(promiseConstructor, 'resolve');
	if (IsCallable(promiseResolve) === false) {
		throw new $TypeError('`resolve` method is not callable');
	}
	return promiseResolve;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Function = GetIntrinsic('%Function%');
var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsConstructor = require('./IsConstructor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getprototypefromconstructor

module.exports = function GetPrototypeFromConstructor(constructor, intrinsicDefaultProto) {
	var intrinsic = GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
	if (!IsConstructor(constructor)) {
		throw new $TypeError('Assertion failed: `constructor` must be a constructor');
	}
	var proto = Get(constructor, 'prototype');
	if (Type(proto) !== 'Object') {
		if (!(constructor instanceof $Function)) {
			// ignore other realms, for now
			throw new $TypeError('cross-realm constructors not currently supported');
		}
		proto = intrinsic;
	}
	return proto;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');
var regexTester = require('../helpers/regexTester');
var every = require('../helpers/every');

var $charAt = callBound('String.prototype.charAt');
var $strSlice = callBound('String.prototype.slice');
var $indexOf = callBound('String.prototype.indexOf');
var $parseInt = parseInt;

var isDigit = regexTester(/^[0-9]$/);

var inspect = require('object-inspect');

var Get = require('./Get');
var IsArray = require('./IsArray');
var IsIntegralNumber = require('./IsIntegralNumber');
var ToObject = require('./ToObject');
var ToString = require('./ToString');
var Type = require('./Type');

var canDistinguishSparseFromUndefined = 0 in [undefined]; // IE 6 - 8 have a bug where this returns false

var isStringOrHole = function (capture, index, arr) {
	return Type(capture) === 'String' || (canDistinguishSparseFromUndefined ? !(index in arr) : Type(capture) === 'Undefined');
};

// http://www.ecma-international.org/ecma-262/12.0/#sec-getsubstitution

// eslint-disable-next-line max-statements, max-params, max-lines-per-function
module.exports = function GetSubstitution(matched, str, position, captures, namedCaptures, replacement) {
	if (Type(matched) !== 'String') {
		throw new $TypeError('Assertion failed: `matched` must be a String');
	}
	var matchLength = matched.length;

	if (Type(str) !== 'String') {
		throw new $TypeError('Assertion failed: `str` must be a String');
	}
	var stringLength = str.length;

	if (!IsIntegralNumber(position) || position < 0 || position > stringLength) {
		throw new $TypeError('Assertion failed: `position` must be a nonnegative integer, and less than or equal to the length of `string`, got ' + inspect(position));
	}

	if (!IsArray(captures) || !every(captures, isStringOrHole)) {
		throw new $TypeError('Assertion failed: `captures` must be a possibly-empty List of Strings, got ' + inspect(captures));
	}

	if (Type(replacement) !== 'String') {
		throw new $TypeError('Assertion failed: `replacement` must be a String');
	}

	var tailPos = position + matchLength;
	var m = captures.length;
	if (Type(namedCaptures) !== 'Undefined') {
		namedCaptures = ToObject(namedCaptures); // eslint-disable-line no-param-reassign
	}

	var result = '';
	for (var i = 0; i < replacement.length; i += 1) {
		// if this is a $, and it's not the end of the replacement
		var current = $charAt(replacement, i);
		var isLast = (i + 1) >= replacement.length;
		var nextIsLast = (i + 2) >= replacement.length;
		if (current === '$' && !isLast) {
			var next = $charAt(replacement, i + 1);
			if (next === '$') {
				result += '$';
				i += 1;
			} else if (next === '&') {
				result += matched;
				i += 1;
			} else if (next === '`') {
				result += position === 0 ? '' : $strSlice(str, 0, position - 1);
				i += 1;
			} else if (next === "'") {
				result += tailPos >= stringLength ? '' : $strSlice(str, tailPos);
				i += 1;
			} else {
				var nextNext = nextIsLast ? null : $charAt(replacement, i + 2);
				if (isDigit(next) && next !== '0' && (nextIsLast || !isDigit(nextNext))) {
					// $1 through $9, and not followed by a digit
					var n = $parseInt(next, 10);
					// if (n > m, impl-defined)
					result += n <= m && Type(captures[n - 1]) === 'Undefined' ? '' : captures[n - 1];
					i += 1;
				} else if (isDigit(next) && (nextIsLast || isDigit(nextNext))) {
					// $00 through $99
					var nn = next + nextNext;
					var nnI = $parseInt(nn, 10) - 1;
					// if nn === '00' or nn > m, impl-defined
					result += nn <= m && Type(captures[nnI]) === 'Undefined' ? '' : captures[nnI];
					i += 2;
				} else if (next === '<') {
					// eslint-disable-next-line max-depth
					if (Type(namedCaptures) === 'Undefined') {
						result += '$<';
						i += 2;
					} else {
						var endIndex = $indexOf(replacement, '>', i);
						// eslint-disable-next-line max-depth
						if (endIndex > -1) {
							var groupName = $strSlice(replacement, i + '$<'.length, endIndex);
							var capture = Get(namedCaptures, groupName);
							// eslint-disable-next-line max-depth
							if (Type(capture) !== 'Undefined') {
								result += ToString(capture);
							}
							i += ('<' + groupName + '>').length;
						}
					}
				} else {
					result += '$';
				}
			}
		} else {
			// the final $, or else not a $
			result += $charAt(replacement, i);
		}
	}
	return result;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var ToObject = require('./ToObject');

// https://ecma-international.org/ecma-262/6.0/#sec-getv

module.exports = function GetV(V, P) {
	// 7.3.2.1
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// 7.3.2.2-3
	var O = ToObject(V);

	// 7.3.2.4
	return O[P];
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var has = require('has');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty

module.exports = function HasOwnProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	return has(O, P);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-hasproperty

module.exports = function HasProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	return P in O;
};
'use strict';

var floor = require('./floor');
var modulo = require('./modulo');

var timeConstants = require('../helpers/timeConstants');
var msPerHour = timeConstants.msPerHour;
var HoursPerDay = timeConstants.HoursPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function HourFromTime(t) {
	return modulo(floor(t / msPerHour), HoursPerDay);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DaysInYear = require('./DaysInYear');
var YearFromTime = require('./YearFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function InLeapYear(t) {
	var days = DaysInYear(YearFromTime(t));
	if (days === 365) {
		return 0;
	}
	if (days === 366) {
		return 1;
	}
	throw new $EvalError('Assertion failed: there are not 365 or 366 days in a year, got: ' + days);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $hasInstance = GetIntrinsic('Symbol.hasInstance', true);

var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsCallable = require('./IsCallable');
var OrdinaryHasInstance = require('./OrdinaryHasInstance');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-instanceofoperator

module.exports = function InstanceofOperator(O, C) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	var instOfHandler = $hasInstance ? GetMethod(C, $hasInstance) : void 0;
	if (typeof instOfHandler !== 'undefined') {
		return ToBoolean(Call(instOfHandler, C, [O]));
	}
	if (!IsCallable(C)) {
		throw new $TypeError('`C` is not Callable');
	}
	return OrdinaryHasInstance(C, O);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var IsArray = require('./IsArray');
var GetV = require('./GetV');
var IsPropertyKey = require('./IsPropertyKey');

// https://ecma-international.org/ecma-262/6.0/#sec-invoke

module.exports = function Invoke(O, P) {
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	var argumentsList = arguments.length > 2 ? arguments[2] : [];
	if (!IsArray(argumentsList)) {
		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
	}
	var func = GetV(O, P);
	return Call(func, O, argumentsList);
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isaccessordescriptor

module.exports = function IsAccessorDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Get]]') && !has(Desc, '[[Set]]')) {
		return false;
	}

	return true;
};
'use strict';

// https://ecma-international.org/ecma-262/6.0/#sec-isarray
module.exports = require('../helpers/IsArray');
'use strict';

// https://262.ecma-international.org/11.0/#sec-isbigintelementtype

module.exports = function IsBigIntElementType(type) {
	return type === 'BigUint64' || type === 'BigInt64';
};
'use strict';

// http://262.ecma-international.org/5.1/#sec-9.11

module.exports = require('is-callable');
'use strict';

var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');

// https://262.ecma-international.org/6.0/#sec-iscompatiblepropertydescriptor

module.exports = function IsCompatiblePropertyDescriptor(Extensible, Desc, Current) {
	return ValidateAndApplyPropertyDescriptor(undefined, undefined, Extensible, Desc, Current);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $isConcatSpreadable = GetIntrinsic('%Symbol.isConcatSpreadable%', true);

var Get = require('./Get');
var IsArray = require('./IsArray');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable

module.exports = function IsConcatSpreadable(O) {
	if (Type(O) !== 'Object') {
		return false;
	}
	if ($isConcatSpreadable) {
		var spreadable = Get(O, $isConcatSpreadable);
		if (typeof spreadable !== 'undefined') {
			return ToBoolean(spreadable);
		}
	}
	return IsArray(O);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic.js');

var $construct = GetIntrinsic('%Reflect.construct%', true);

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
try {
	DefinePropertyOrThrow({}, '', { '[[Get]]': function () {} });
} catch (e) {
	// Accessor properties aren't supported
	DefinePropertyOrThrow = null;
}

// https://ecma-international.org/ecma-262/6.0/#sec-isconstructor

if (DefinePropertyOrThrow && $construct) {
	var isConstructorMarker = {};
	var badArrayLike = {};
	DefinePropertyOrThrow(badArrayLike, 'length', {
		'[[Get]]': function () {
			throw isConstructorMarker;
		},
		'[[Enumerable]]': true
	});

	module.exports = function IsConstructor(argument) {
		try {
			// `Reflect.construct` invokes `IsConstructor(target)` before `Get(args, 'length')`:
			$construct(argument, badArrayLike);
		} catch (err) {
			return err === isConstructorMarker;
		}
	};
} else {
	module.exports = function IsConstructor(argument) {
		// unfortunately there's no way to truly check this without try/catch `new argument` in old environments
		return typeof argument === 'function' && !!argument.prototype;
	};
}
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isdatadescriptor

module.exports = function IsDataDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Value]]') && !has(Desc, '[[Writable]]')) {
		return false;
	}

	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $preventExtensions = GetIntrinsic('%Object.preventExtensions%', true);
var $isExtensible = GetIntrinsic('%Object.isExtensible%', true);

var isPrimitive = require('../helpers/isPrimitive');

// https://ecma-international.org/ecma-262/6.0/#sec-isextensible-o

module.exports = $preventExtensions
	? function IsExtensible(obj) {
		return !isPrimitive(obj) && $isExtensible(obj);
	}
	: function IsExtensible(obj) {
		return !isPrimitive(obj);
	};
'use strict';

var assertRecord = require('../helpers/assertRecord');

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isgenericdescriptor

module.exports = function IsGenericDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!IsAccessorDescriptor(Desc) && !IsDataDescriptor(Desc)) {
		return true;
	}

	return false;
};
'use strict';

var abs = require('./abs');
var floor = require('./floor');
var Type = require('./Type');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');

// https://tc39.es/ecma262/#sec-isintegralnumber

module.exports = function IsIntegralNumber(argument) {
	if (Type(argument) !== 'Number' || $isNaN(argument) || !$isFinite(argument)) {
		return false;
	}
	var absValue = abs(argument);
	return floor(absValue) === absValue;
};
'use strict';

var IsUnclampedIntegerElementType = require('./IsUnclampedIntegerElementType');
var IsBigIntElementType = require('./IsBigIntElementType');

// https://262.ecma-international.org/11.0/#sec-isnotearconfiguration

module.exports = function IsNoTearConfiguration(type, order) {
	if (IsUnclampedIntegerElementType(type)) {
		return true;
	}
	if (IsBigIntElementType(type) && order !== 'Init' && order !== 'Unordered') {
		return true;
	}
	return false;
};
'use strict';

var callBound = require('call-bind/callBound');

var $PromiseThen = callBound('Promise.prototype.then', true);

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ispromise

module.exports = function IsPromise(x) {
	if (Type(x) !== 'Object') {
		return false;
	}
	if (!$PromiseThen) { // Promises are not supported
		return false;
	}
	try {
		$PromiseThen(x); // throws if not a promise
	} catch (e) {
		return false;
	}
	return true;
};
'use strict';

// https://ecma-international.org/ecma-262/6.0/#sec-ispropertykey

module.exports = function IsPropertyKey(argument) {
	return typeof argument === 'string' || typeof argument === 'symbol';
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $match = GetIntrinsic('%Symbol.match%', true);

var hasRegExpMatcher = require('is-regex');

var ToBoolean = require('./ToBoolean');

// https://ecma-international.org/ecma-262/6.0/#sec-isregexp

module.exports = function IsRegExp(argument) {
	if (!argument || typeof argument !== 'object') {
		return false;
	}
	if ($match) {
		var isRegExp = argument[$match];
		if (typeof isRegExp !== 'undefined') {
			return ToBoolean(isRegExp);
		}
	}
	return hasRegExpMatcher(argument);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');

var isSharedArrayBuffer = require('is-shared-array-buffer');

// https://262.ecma-international.org/8.0/#sec-issharedarraybuffer

module.exports = function IsSharedArrayBuffer(obj) {
	if (Type(obj) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	return isSharedArrayBuffer(obj);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isPrefixOf = require('../helpers/isPrefixOf');

// var callBound = require('call-bind/callBound');

// var $charAt = callBound('String.prototype.charAt');

var Type = require('./Type');

// https://262.ecma-international.org/9.0/#sec-isstringprefix

module.exports = function IsStringPrefix(p, q) {
	if (Type(p) !== 'String') {
		throw new $TypeError('Assertion failed: "p" must be a String');
	}

	if (Type(q) !== 'String') {
		throw new $TypeError('Assertion failed: "q" must be a String');
	}

	return isPrefixOf(p, q);
	/*
	if (p === q || p === '') {
		return true;
	}

	var pLength = p.length;
	var qLength = q.length;
	if (pLength >= qLength) {
		return false;
	}

	// assert: pLength < qLength

	for (var i = 0; i < pLength; i += 1) {
		if ($charAt(p, i) !== $charAt(q, i)) {
			return false;
		}
	}
	return true;
	*/
};
'use strict';

// https://262.ecma-international.org/11.0/#sec-isunclampedintegerelementtype

module.exports = function IsUnclampedIntegerElementType(type) {
	return type === 'Int8'
		|| type === 'Uint8'
		|| type === 'Int16'
		|| type === 'Uint16'
		|| type === 'Int32'
		|| type === 'Uint32';
};
'use strict';

// https://262.ecma-international.org/11.0/#sec-isunsignedelementtype

module.exports = function IsUnsignedElementType(type) {
	return type === 'Uint8'
		|| type === 'Uint8C'
		|| type === 'Uint16'
		|| type === 'Uint32'
		|| type === 'BigUint64';
};
'use strict';

var callBound = require('call-bind/callBound');
var $arrayPush = callBound('Array.prototype.push');

var GetIterator = require('./GetIterator');
var IteratorStep = require('./IteratorStep');
var IteratorValue = require('./IteratorValue');

// https://262.ecma-international.org/12.0/#sec-iterabletolist

module.exports = function IterableToList(items) {
	var iterator;
	if (arguments.length > 1) {
		iterator = GetIterator(items, 'sync', arguments[1]);
	} else {
		iterator = GetIterator(items, 'sync');
	}
	var values = [];
	var next = true;
	while (next) {
		next = IteratorStep(iterator);
		if (next) {
			var nextValue = IteratorValue(next);
			$arrayPush(values, nextValue);
		}
	}
	return values;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose

module.exports = function IteratorClose(iterator, completion) {
	if (Type(iterator) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterator) is not Object');
	}
	if (!IsCallable(completion)) {
		throw new $TypeError('Assertion failed: completion is not a thunk for a Completion Record');
	}
	var completionThunk = completion;

	var iteratorReturn = GetMethod(iterator, 'return');

	if (typeof iteratorReturn === 'undefined') {
		return completionThunk();
	}

	var completionRecord;
	try {
		var innerResult = Call(iteratorReturn, iterator, []);
	} catch (e) {
		// if we hit here, then "e" is the innerResult completion that needs re-throwing

		// if the completion is of type "throw", this will throw.
		completionThunk();
		completionThunk = null; // ensure it's not called twice.

		// if not, then return the innerResult completion
		throw e;
	}
	completionRecord = completionThunk(); // if innerResult worked, then throw if the completion does
	completionThunk = null; // ensure it's not called twice.

	if (Type(innerResult) !== 'Object') {
		throw new $TypeError('iterator .return must return an object');
	}

	return completionRecord;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete

module.exports = function IteratorComplete(iterResult) {
	if (Type(iterResult) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
	}
	return ToBoolean(Get(iterResult, 'done'));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Invoke = require('./Invoke');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratornext

module.exports = function IteratorNext(iterator, value) {
	var result = Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);
	if (Type(result) !== 'Object') {
		throw new $TypeError('iterator next must return an object');
	}
	return result;
};
'use strict';

var IteratorComplete = require('./IteratorComplete');
var IteratorNext = require('./IteratorNext');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep

module.exports = function IteratorStep(iterator) {
	var result = IteratorNext(iterator);
	var done = IteratorComplete(result);
	return done === true ? false : result;
};

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue

module.exports = function IteratorValue(iterResult) {
	if (Type(iterResult) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
	}
	return Get(iterResult, 'value');
};

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var ToLength = require('./ToLength');
var Type = require('./Type');

// https://262.ecma-international.org/11.0/#sec-lengthofarraylike

module.exports = function LengthOfArrayLike(obj) {
	if (Type(obj) !== 'Object') {
		throw new $TypeError('Assertion failed: `obj` must be an Object');
	}
	return ToLength(Get(obj, 'length'));
};

// TODO: use this all over
'use strict';

var $isFinite = require('../helpers/isFinite');
var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.13

module.exports = function MakeDate(day, time) {
	if (!$isFinite(day) || !$isFinite(time)) {
		return NaN;
	}
	return (day * msPerDay) + time;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $DateUTC = GetIntrinsic('%Date.UTC%');

var $isFinite = require('../helpers/isFinite');

var DateFromTime = require('./DateFromTime');
var Day = require('./Day');
var floor = require('./floor');
var modulo = require('./modulo');
var MonthFromTime = require('./MonthFromTime');
var ToIntegerOrInfinity = require('./ToIntegerOrInfinity');
var YearFromTime = require('./YearFromTime');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.12

module.exports = function MakeDay(year, month, date) {
	if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) {
		return NaN;
	}
	var y = ToIntegerOrInfinity(year);
	var m = ToIntegerOrInfinity(month);
	var dt = ToIntegerOrInfinity(date);
	var ym = y + floor(m / 12);
	if (!$isFinite(ym)) {
		return NaN;
	}
	var mn = modulo(m, 12);
	var t = $DateUTC(ym, mn, 1);
	if (YearFromTime(t) !== ym || MonthFromTime(t) !== mn || DateFromTime(t) !== 1) {
		return NaN;
	}
	return Day(t) + dt - 1;
};
'use strict';

var $isFinite = require('../helpers/isFinite');
var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var msPerMinute = timeConstants.msPerMinute;
var msPerHour = timeConstants.msPerHour;

var ToIntegerOrInfinity = require('./ToIntegerOrInfinity');

// https://ecma-international.org/ecma-262/5.1/#sec-15.9.1.11

module.exports = function MakeTime(hour, min, sec, ms) {
	if (!$isFinite(hour) || !$isFinite(min) || !$isFinite(sec) || !$isFinite(ms)) {
		return NaN;
	}
	var h = ToIntegerOrInfinity(hour);
	var m = ToIntegerOrInfinity(min);
	var s = ToIntegerOrInfinity(sec);
	var milli = ToIntegerOrInfinity(ms);
	var t = (h * msPerHour) + (m * msPerMinute) + (s * msPerSecond) + milli;
	return t;
};
'use strict';

var floor = require('./floor');
var modulo = require('./modulo');

var timeConstants = require('../helpers/timeConstants');
var msPerMinute = timeConstants.msPerMinute;
var MinutesPerHour = timeConstants.MinutesPerHour;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function MinFromTime(t) {
	return modulo(floor(t / msPerMinute), MinutesPerHour);
};
'use strict';

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');

// https://262.ecma-international.org/5.1/#sec-15.9.1.4

module.exports = function MonthFromTime(t) {
	var day = DayWithinYear(t);
	if (0 <= day && day < 31) {
		return 0;
	}
	var leap = InLeapYear(t);
	if (31 <= day && day < (59 + leap)) {
		return 1;
	}
	if ((59 + leap) <= day && day < (90 + leap)) {
		return 2;
	}
	if ((90 + leap) <= day && day < (120 + leap)) {
		return 3;
	}
	if ((120 + leap) <= day && day < (151 + leap)) {
		return 4;
	}
	if ((151 + leap) <= day && day < (181 + leap)) {
		return 5;
	}
	if ((181 + leap) <= day && day < (212 + leap)) {
		return 6;
	}
	if ((212 + leap) <= day && day < (243 + leap)) {
		return 7;
	}
	if ((243 + leap) <= day && day < (273 + leap)) {
		return 8;
	}
	if ((273 + leap) <= day && day < (304 + leap)) {
		return 9;
	}
	if ((304 + leap) <= day && day < (334 + leap)) {
		return 10;
	}
	if ((334 + leap) <= day && day < (365 + leap)) {
		return 11;
	}
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var ToInt32 = require('./ToInt32');
var ToUint32 = require('./ToUint32');
var Type = require('./Type');

// https://262.ecma-international.org/11.0/#sec-numberbitwiseop

module.exports = function NumberBitwiseOp(op, x, y) {
	if (op !== '&' && op !== '|' && op !== '^') {
		throw new $TypeError('Assertion failed: `op` must be `&`, `|`, or `^`');
	}
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}
	var lnum = ToInt32(x);
	var rnum = ToUint32(y);
	if (op === '&') {
		return lnum & rnum;
	}
	if (op === '|') {
		return lnum | rnum;
	}
	return lnum ^ rnum;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $RangeError = GetIntrinsic('%RangeError%');
var $TypeError = GetIntrinsic('%TypeError%');

var IsIntegralNumber = require('./IsIntegralNumber');
var Type = require('./Type');

// https://262.ecma-international.org/11.0/#sec-numbertobigint

module.exports = function NumberToBigInt(number) {
	if (Type(number) !== 'Number') {
		throw new $TypeError('Assertion failed: `number` must be a String');
	}
	if (!IsIntegralNumber(number)) {
		throw new $RangeError('The number ' + number + ' cannot be converted to a BigInt because it is not an integer');
	}
	return $BigInt(number);
};
'use strict';

var callBound = require('call-bind/callBound');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var Get = require('./Get');
var ToObject = require('./ToObject');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');

var forEach = require('../helpers/forEach');
var getOwnPropertyDescriptor = require('../helpers/getOwnPropertyDescriptor');
var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');

var $push = callBound('Array.prototype.push');

// https://262.ecma-international.org/6.0/#sec-objectdefineproperties
module.exports = function ObjectDefineProperties(O, Properties) {
	var props = ToObject(Properties); // step 1
	var keys = OwnPropertyKeys(props); // step 2
	var descriptors = []; // step 3

	forEach(keys, function (nextKey) { // step 4
		var propDesc = ToPropertyDescriptor(getOwnPropertyDescriptor(props, nextKey)); // step 4.a
		if (typeof propDesc !== 'undefined' && propDesc['[[Enumerable]]']) { // step 4.b
			var descObj = Get(props, nextKey); // step 4.b.i
			var desc = ToPropertyDescriptor(descObj); // step 4.b.ii
			$push(descriptors, [nextKey, desc]); // step 4.b.iii
		}
	});

	forEach(descriptors, function (pair) { // step 5
		var P = pair[0]; // step 5.a
		var desc = pair[1]; // step 5.b
		desc = FromPropertyDescriptor(desc); // TODO: remove this once DefinePropertyOrThrow is fixed
		DefinePropertyOrThrow(O, P, desc); // step 5.c
	});

	return O; // step 6
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var $TypeError = GetIntrinsic('%TypeError%');

var GetPrototypeFromConstructor = require('./GetPrototypeFromConstructor');
var IsArray = require('./IsArray');
var OrdinaryObjectCreate = require('./OrdinaryObjectCreate');

// https://262.ecma-international.org/6.0/#sec-ordinarycreatefromconstructor

module.exports = function OrdinaryCreateFromConstructor(constructor, intrinsicDefaultProto) {
	GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
	var proto = GetPrototypeFromConstructor(constructor, intrinsicDefaultProto);
	var slots = arguments.length < 3 ? [] : arguments[2];
	if (!IsArray(slots)) {
		throw new $TypeError('Assertion failed: if provided, `internalSlotsList` must be a List');
	}
	return OrdinaryObjectCreate(proto, slots);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var IsPropertyKey = require('./IsPropertyKey');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var SameValue = require('./SameValue');
var Type = require('./Type');
var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinarydefineownproperty

module.exports = function OrdinaryDefineOwnProperty(O, P, Desc) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (!$gOPD) {
		// ES3/IE 8 fallback
		if (IsAccessorDescriptor(Desc)) {
			throw new $SyntaxError('This environment does not support accessor property descriptors.');
		}
		var creatingNormalDataProperty = !(P in O)
			&& Desc['[[Writable]]']
			&& Desc['[[Enumerable]]']
			&& Desc['[[Configurable]]']
			&& '[[Value]]' in Desc;
		var settingExistingDataProperty = (P in O)
			&& (!('[[Configurable]]' in Desc) || Desc['[[Configurable]]'])
			&& (!('[[Enumerable]]' in Desc) || Desc['[[Enumerable]]'])
			&& (!('[[Writable]]' in Desc) || Desc['[[Writable]]'])
			&& '[[Value]]' in Desc;
		if (creatingNormalDataProperty || settingExistingDataProperty) {
			O[P] = Desc['[[Value]]']; // eslint-disable-line no-param-reassign
			return SameValue(O[P], Desc['[[Value]]']);
		}
		throw new $SyntaxError('This environment does not support defining non-writable, non-enumerable, or non-configurable properties');
	}
	var desc = $gOPD(O, P);
	var current = desc && ToPropertyDescriptor(desc);
	var extensible = IsExtensible(O);
	return ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');

var has = require('has');

var IsArray = require('./IsArray');
var IsPropertyKey = require('./IsPropertyKey');
var IsRegExp = require('./IsRegExp');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty

module.exports = function OrdinaryGetOwnProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	if (!has(O, P)) {
		return void 0;
	}
	if (!$gOPD) {
		// ES3 / IE 8 fallback
		var arrayLength = IsArray(O) && P === 'length';
		var regexLastIndex = IsRegExp(O) && P === 'lastIndex';
		return {
			'[[Configurable]]': !(arrayLength || regexLastIndex),
			'[[Enumerable]]': $isEnumerable(O, P),
			'[[Value]]': O[P],
			'[[Writable]]': true
		};
	}
	return ToPropertyDescriptor($gOPD(O, P));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $getProto = require('../helpers/getProto');

var Type = require('./Type');

// https://262.ecma-international.org/7.0/#sec-ordinarygetprototypeof

module.exports = function OrdinaryGetPrototypeOf(O) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!$getProto) {
		throw new $TypeError('This environment does not support fetching prototypes.');
	}
	return $getProto(O);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasinstance

module.exports = function OrdinaryHasInstance(C, O) {
	if (IsCallable(C) === false) {
		return false;
	}
	if (Type(O) !== 'Object') {
		return false;
	}
	var P = Get(C, 'prototype');
	if (Type(P) !== 'Object') {
		throw new $TypeError('OrdinaryHasInstance called on an object with an invalid prototype property.');
	}
	return O instanceof C;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasproperty

module.exports = function OrdinaryHasProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	return P in O;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $ObjectCreate = GetIntrinsic('%Object.create%', true);
var $TypeError = GetIntrinsic('%TypeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');

var IsArray = require('./IsArray');
var Type = require('./Type');

var hasProto = !({ __proto__: null } instanceof Object);

// https://262.ecma-international.org/6.0/#sec-objectcreate

module.exports = function OrdinaryObjectCreate(proto) {
	if (proto !== null && Type(proto) !== 'Object') {
		throw new $TypeError('Assertion failed: `proto` must be null or an object');
	}
	var additionalInternalSlotsList = arguments.length < 2 ? [] : arguments[1];
	if (!IsArray(additionalInternalSlotsList)) {
		throw new $TypeError('Assertion failed: `additionalInternalSlotsList` must be an Array');
	}
	// var internalSlotsList = ['[[Prototype]]', '[[Extensible]]'];
	if (additionalInternalSlotsList.length > 0) {
		throw new $SyntaxError('es-abstract does not yet support internal slots');
		// internalSlotsList.push(...additionalInternalSlotsList);
	}
	// var O = MakeBasicObject(internalSlotsList);
	// setProto(O, proto);
	// return O;

	if ($ObjectCreate) {
		return $ObjectCreate(proto);
	}
	if (hasProto) {
		return { __proto__: proto };
	}

	if (proto === null) {
		throw new $SyntaxError('native Object.create support is required to create null objects');
	}
	var T = function T() {};
	T.prototype = proto;
	return new T();
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $setProto = require('../helpers/setProto');

var OrdinaryGetPrototypeOf = require('./OrdinaryGetPrototypeOf');
var Type = require('./Type');

// https://262.ecma-international.org/7.0/#sec-ordinarysetprototypeof

module.exports = function OrdinarySetPrototypeOf(O, V) {
	if (Type(V) !== 'Object' && Type(V) !== 'Null') {
		throw new $TypeError('Assertion failed: V must be Object or Null');
	}
	/*
	var extensible = IsExtensible(O);
	var current = OrdinaryGetPrototypeOf(O);
	if (SameValue(V, current)) {
		return true;
	}
	if (!extensible) {
		return false;
	}
	*/
	try {
		$setProto(O, V);
	} catch (e) {
		return false;
	}
	return OrdinaryGetPrototypeOf(O) === V;
	/*
	var p = V;
	var done = false;
	while (!done) {
		if (p === null) {
			done = true;
		} else if (SameValue(p, O)) {
			return false;
		} else {
			if (wat) {
				done = true;
			} else {
				p = p.[[Prototype]];
			}
		}
	}
	O.[[Prototype]] = V;
	return true;
	*/
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

var inspect = require('object-inspect');

// https://262.ecma-international.org/8.0/#sec-ordinarytoprimitive

module.exports = function OrdinaryToPrimitive(O, hint) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (/* Type(hint) !== 'String' || */ hint !== 'string' && hint !== 'number') {
		throw new $TypeError('Assertion failed: `hint` must be "string" or "number"');
	}

	var methodNames = hint === 'string' ? ['toString', 'valueOf'] : ['valueOf', 'toString'];

	for (var i = 0; i < methodNames.length; i += 1) {
		var name = methodNames[i];
		var method = Get(O, name);
		if (IsCallable(method)) {
			var result = Call(method, O);
			if (Type(result) !== 'Object') {
				return result;
			}
		}
	}

	throw new $TypeError('No primitive value for ' + inspect(O));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBind = require('call-bind');

var $resolve = GetIntrinsic('%Promise.resolve%', true);
var $PromiseResolve = $resolve && callBind($resolve);

// https://262.ecma-international.org/9.0/#sec-promise-resolve

module.exports = function PromiseResolve(C, x) {
	if (!$PromiseResolve) {
		throw new SyntaxError('This environment does not support Promises.');
	}
	return $PromiseResolve(C, x);
};

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');
var forEach = require('../helpers/forEach');
var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');

var $charCodeAt = callBound('String.prototype.charCodeAt');

var StringToCodePoints = require('./StringToCodePoints');
var Type = require('./Type');
var UnicodeEscape = require('./UnicodeEscape');
var UTF16EncodeCodePoint = require('./UTF16EncodeCodePoint');

var has = require('has');

// https://ecma-international.org/ecma-262/12.0/#sec-quotejsonstring

var escapes = {
	'\u0008': '\\b',
	'\u0009': '\\t',
	'\u000A': '\\n',
	'\u000C': '\\f',
	'\u000D': '\\r',
	'\u0022': '\\"',
	'\u005c': '\\\\'
};

module.exports = function QuoteJSONString(value) {
	if (Type(value) !== 'String') {
		throw new $TypeError('Assertion failed: `value` must be a String');
	}
	var product = '"';
	if (value) {
		forEach(StringToCodePoints(value), function (C) {
			if (has(escapes, C)) {
				product += escapes[C];
			} else {
				var cCharCode = $charCodeAt(C, 0);
				if (cCharCode < 0x20 || isLeadingSurrogate(C) || isTrailingSurrogate(C)) {
					product += UnicodeEscape(C);
				} else {
					product += UTF16EncodeCodePoint(cCharCode);
				}
			}
		});
	}
	product += '"';
	return product;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $RegExp = GetIntrinsic('%RegExp%');

// var RegExpAlloc = require('./RegExpAlloc');
// var RegExpInitialize = require('./RegExpInitialize');
var ToString = require('./ToString');

// https://262.ecma-international.org/6.0/#sec-regexpcreate

module.exports = function RegExpCreate(P, F) {
	// var obj = RegExpAlloc($RegExp);
	// return RegExpInitialize(obj, P, F);

	// covers spec mechanics; bypass regex brand checking
	var pattern = typeof P === 'undefined' ? '' : ToString(P);
	var flags = typeof F === 'undefined' ? '' : ToString(F);
	return new $RegExp(pattern, flags);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var regexExec = require('call-bind/callBound')('RegExp.prototype.exec');

var Call = require('./Call');
var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-regexpexec

module.exports = function RegExpExec(R, S) {
	if (Type(R) !== 'Object') {
		throw new $TypeError('Assertion failed: `R` must be an Object');
	}
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	var exec = Get(R, 'exec');
	if (IsCallable(exec)) {
		var result = Call(exec, R, [S]);
		if (result === null || Type(result) === 'Object') {
			return result;
		}
		throw new $TypeError('"exec" method must return `null` or an Object');
	}
	return regexExec(R, S);
};
'use strict';

module.exports = require('../5/CheckObjectCoercible');
'use strict';

var $isNaN = require('../helpers/isNaN');

// http://262.ecma-international.org/5.1/#sec-9.12

module.exports = function SameValue(x, y) {
	if (x === y) { // 0 === -0, but they are not identical.
		if (x === 0) { return 1 / x === 1 / y; }
		return true;
	}
	return $isNaN(x) && $isNaN(y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var SameValue = require('./SameValue');
var Type = require('./Type');

// https://262.ecma-international.org/11.0/#sec-samevaluenonnumeric

module.exports = function SameValueNonNumeric(x, y) {
	var xType = Type(x);
	if (xType === 'Number' || xType === 'Bigint') {
		throw new $TypeError('Assertion failed: SameValueNonNumeric does not accept Number or BigInt values');
	}
	if (xType !== Type(y)) {
		throw new $TypeError('SameValueNonNumeric requires two non-numeric values of the same type.');
	}
	return SameValue(x, y);
};
'use strict';

var $isNaN = require('../helpers/isNaN');

// https://ecma-international.org/ecma-262/6.0/#sec-samevaluezero

module.exports = function SameValueZero(x, y) {
	return (x === y) || ($isNaN(x) && $isNaN(y));
};
'use strict';

var floor = require('./floor');
var modulo = require('./modulo');

var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var SecondsPerMinute = timeConstants.SecondsPerMinute;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function SecFromTime(t) {
	return modulo(floor(t / msPerSecond), SecondsPerMinute);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// IE 9 does not throw in strict mode when writability/configurability/extensibility is violated
var noThrowOnStrictViolation = (function () {
	try {
		delete [].length;
		return true;
	} catch (e) {
		return false;
	}
}());

// https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw

module.exports = function Set(O, P, V, Throw) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	if (Type(Throw) !== 'Boolean') {
		throw new $TypeError('Assertion failed: `Throw` must be a Boolean');
	}
	if (Throw) {
		O[P] = V; // eslint-disable-line no-param-reassign
		if (noThrowOnStrictViolation && !SameValue(O[P], V)) {
			throw new $TypeError('Attempted to assign to readonly property.');
		}
		return true;
	}
	try {
		O[P] = V; // eslint-disable-line no-param-reassign
		return noThrowOnStrictViolation ? SameValue(O[P], V) : true;
	} catch (e) {
		return false;
	}

};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var HasOwnProperty = require('./HasOwnProperty');
var IsExtensible = require('./IsExtensible');
var IsIntegralNumber = require('./IsIntegralNumber');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/12.0/#sec-setfunctionlength

module.exports = function SetFunctionLength(F, length) {
	if (typeof F !== 'function' || !IsExtensible(F) || HasOwnProperty(F, 'length')) {
		throw new $TypeError('Assertion failed: `F` must be an extensible function and lack an own `length` property');
	}
	if (Type(length) !== 'Number') {
		throw new $TypeError('Assertion failed: `length` must be a Number');
	}
	if (length !== Infinity && (!IsIntegralNumber(length) || length < 0)) {
		throw new $TypeError('Assertion failed: `length` must be ∞, or an integer >= 0');
	}
	return DefinePropertyOrThrow(F, 'length', {
		'[[Configurable]]': true,
		'[[Enumerable]]': false,
		'[[Value]]': length,
		'[[Writable]]': false
	});
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var has = require('has');

var $TypeError = GetIntrinsic('%TypeError%');

var getSymbolDescription = require('get-symbol-description');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var IsExtensible = require('./IsExtensible');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-setfunctionname

module.exports = function SetFunctionName(F, name) {
	if (typeof F !== 'function') {
		throw new $TypeError('Assertion failed: `F` must be a function');
	}
	if (!IsExtensible(F) || has(F, 'name')) {
		throw new $TypeError('Assertion failed: `F` must be extensible, and must not have a `name` own property');
	}
	var nameType = Type(name);
	if (nameType !== 'Symbol' && nameType !== 'String') {
		throw new $TypeError('Assertion failed: `name` must be a Symbol or a String');
	}
	if (nameType === 'Symbol') {
		var description = getSymbolDescription(name);
		// eslint-disable-next-line no-param-reassign
		name = typeof description === 'undefined' ? '' : '[' + description + ']';
	}
	if (arguments.length > 2) {
		var prefix = arguments[2];
		// eslint-disable-next-line no-param-reassign
		name = prefix + ' ' + name;
	}
	return DefinePropertyOrThrow(F, 'name', {
		'[[Value]]': name,
		'[[Writable]]': false,
		'[[Enumerable]]': false,
		'[[Configurable]]': true
	});
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');
var $preventExtensions = GetIntrinsic('%Object.preventExtensions%', true);
var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%', true);

var forEach = require('../helpers/forEach');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-setintegritylevel

module.exports = function SetIntegrityLevel(O, level) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (level !== 'sealed' && level !== 'frozen') {
		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
	}
	if (!$preventExtensions) {
		throw new $SyntaxError('SetIntegrityLevel requires native `Object.preventExtensions` support');
	}
	var status = $preventExtensions(O);
	if (!status) {
		return false;
	}
	if (!$gOPN) {
		throw new $SyntaxError('SetIntegrityLevel requires native `Object.getOwnPropertyNames` support');
	}
	var theKeys = $gOPN(O);
	if (level === 'sealed') {
		forEach(theKeys, function (k) {
			DefinePropertyOrThrow(O, k, { configurable: false });
		});
	} else if (level === 'frozen') {
		forEach(theKeys, function (k) {
			var currentDesc = $gOPD(O, k);
			if (typeof currentDesc !== 'undefined') {
				var desc;
				if (IsAccessorDescriptor(ToPropertyDescriptor(currentDesc))) {
					desc = { configurable: false };
				} else {
					desc = { configurable: false, writable: false };
				}
				DefinePropertyOrThrow(O, k, desc);
			}
		});
	}
	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $species = GetIntrinsic('%Symbol.species%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var IsConstructor = require('./IsConstructor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor

module.exports = function SpeciesConstructor(O, defaultConstructor) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	var C = O.constructor;
	if (typeof C === 'undefined') {
		return defaultConstructor;
	}
	if (Type(C) !== 'Object') {
		throw new $TypeError('O.constructor is not an Object');
	}
	var S = $species ? C[$species] : void 0;
	if (S == null) {
		return defaultConstructor;
	}
	if (IsConstructor(S)) {
		return S;
	}
	throw new $TypeError('no constructor found');
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');

var IsIntegralNumber = require('./IsIntegralNumber');
var Type = require('./Type');

var $charAt = callBound('String.prototype.charAt');

// https://262.ecma-international.org/6.0/#sec-splitmatch

module.exports = function SplitMatch(S, q, R) {
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	if (!IsIntegralNumber(q)) {
		throw new $TypeError('Assertion failed: `q` must be an integer');
	}
	if (Type(R) !== 'String') {
		throw new $TypeError('Assertion failed: `R` must be a String');
	}
	var r = R.length;
	var s = S.length;
	if (q + r > s) {
		return false;
	}

	for (var i = 0; i < r; i += 1) {
		if ($charAt(S, q + i) !== $charAt(R, i)) {
			return false;
		}
	}

	return q + r;
};
'use strict';

var Type = require('./Type');

// https://262.ecma-international.org/5.1/#sec-11.9.6

module.exports = function StrictEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType !== yType) {
		return false;
	}
	if (xType === 'Undefined' || xType === 'Null') {
		return true;
	}
	return x === y; // shortcut for steps 4-7
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Object = GetIntrinsic('%Object%');
var $StringPrototype = GetIntrinsic('%String.prototype%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var Type = require('./Type');

var setProto = require('../helpers/setProto');

// https://262.ecma-international.org/6.0/#sec-stringcreate

module.exports = function StringCreate(value, prototype) {
	if (Type(value) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}

	var S = $Object(value);
	if (prototype !== $StringPrototype) {
		if (setProto) {
			setProto(S, prototype);
		} else {
			throw new $SyntaxError('StringCreate: a `proto` argument that is not `String.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
		}
	}

	var length = value.length;
	DefinePropertyOrThrow(S, 'length', {
		'[[Configurable]]': false,
		'[[Enumerable]]': false,
		'[[Value]]': length,
		'[[Writable]]': false
	});

	return S;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');
var $charAt = callBound('String.prototype.charAt');
var $stringToString = callBound('String.prototype.toString');

var CanonicalNumericIndexString = require('./CanonicalNumericIndexString');
var IsIntegralNumber = require('./IsIntegralNumber');
var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

var isNegativeZero = require('is-negative-zero');

// https://ecma-international.org/ecma-262/12.0/#sec-stringgetownproperty

module.exports = function StringGetOwnProperty(S, P) {
	var str;
	if (Type(S) === 'Object') {
		try {
			str = $stringToString(S);
		} catch (e) { /**/ }
	}
	if (Type(str) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a boxed string object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	if (Type(P) !== 'String') {
		return void undefined;
	}
	var index = CanonicalNumericIndexString(P);
	var len = str.length;
	if (typeof index === 'undefined' || !IsIntegralNumber(index) || isNegativeZero(index) || index < 0 || len <= index) {
		return void undefined;
	}
	var resultStr = $charAt(S, index);
	return {
		'[[Configurable]]': false,
		'[[Enumerable]]': true,
		'[[Value]]': resultStr,
		'[[Writable]]': false
	};
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');

var IsIntegralNumber = require('./IsIntegralNumber');
var Type = require('./Type');

var $slice = callBound('String.prototype.slice');

// https://ecma-international.org/ecma-262/12.0/#sec-stringindexof

module.exports = function StringIndexOf(string, searchValue, fromIndex) {
	if (Type(string) !== 'String') {
		throw new $TypeError('Assertion failed: `string` must be a String');
	}
	if (Type(searchValue) !== 'String') {
		throw new $TypeError('Assertion failed: `searchValue` must be a String');
	}
	if (!IsIntegralNumber(fromIndex) || fromIndex < 0) {
		throw new $TypeError('Assertion failed: `fromIndex` must be a non-negative integer');
	}

	var len = string.length;
	if (searchValue === '' && fromIndex <= len) {
		return fromIndex;
	}

	var searchLen = searchValue.length;
	for (var i = fromIndex; i <= (len - searchLen); i += 1) {
		var candidate = $slice(string, i, i + searchLen);
		if (candidate === searchValue) {
			return i;
		}
	}
	return -1;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var ToLength = require('./ToLength');
var ToString = require('./ToString');

var $strSlice = callBound('String.prototype.slice');

// https://262.ecma-international.org/11.0/#sec-stringpad

module.exports = function StringPad(O, maxLength, fillString, placement) {
	if (placement !== 'start' && placement !== 'end') {
		throw new $TypeError('Assertion failed: `placement` must be "start" or "end"');
	}
	var S = ToString(O);
	var intMaxLength = ToLength(maxLength);
	var stringLength = S.length;
	if (intMaxLength <= stringLength) {
		return S;
	}
	var filler = typeof fillString === 'undefined' ? ' ' : ToString(fillString);
	if (filler === '') {
		return S;
	}
	var fillLen = intMaxLength - stringLength;

	// the String value consisting of repeated concatenations of filler truncated to length fillLen.
	var truncatedStringFiller = '';
	while (truncatedStringFiller.length < fillLen) {
		truncatedStringFiller += filler;
	}
	truncatedStringFiller = $strSlice(truncatedStringFiller, 0, fillLen);

	if (placement === 'start') {
		return truncatedStringFiller + S;
	}
	return S + truncatedStringFiller;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $TypeError = GetIntrinsic('%TypeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');

// https://262.ecma-international.org/11.0/#sec-stringtobigint

module.exports = function StringToBigInt(argument) {
	if (typeof argument !== 'string') {
		throw new $TypeError('`argument` must be a string');
	}
	if (!$BigInt) {
		throw new $SyntaxError('BigInts are not supported in this environment');
	}
	try {
		return $BigInt(argument);
	} catch (e) {
		return NaN;
	}
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $push = callBound('Array.prototype.push');

var CodePointAt = require('./CodePointAt');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/12.0/#sec-stringtocodepoints

module.exports = function StringToCodePoints(string) {
	if (Type(string) !== 'String') {
		throw new $TypeError('Assertion failed: `string` must be a String');
	}
	var codePoints = [];
	var size = string.length;
	var position = 0;
	while (position < size) {
		var cp = CodePointAt(string, position);
		$push(codePoints, cp['[[CodePoint]]']);
		position += cp['[[CodeUnitCount]]'];
	}
	return codePoints;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $SymbolToString = callBound('Symbol.prototype.toString', true);

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-symboldescriptivestring

module.exports = function SymbolDescriptiveString(sym) {
	if (Type(sym) !== 'Symbol') {
		throw new $TypeError('Assertion failed: `sym` must be a Symbol');
	}
	return $SymbolToString(sym);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $TypeError = GetIntrinsic('%TypeError%');

var every = require('../helpers/every');
var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');

var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-testintegritylevel

module.exports = function TestIntegrityLevel(O, level) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (level !== 'sealed' && level !== 'frozen') {
		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
	}
	var status = IsExtensible(O);
	if (status) {
		return false;
	}
	var theKeys = OwnPropertyKeys(O);
	return theKeys.length === 0 || every(theKeys, function (k) {
		var currentDesc = $gOPD(O, k);
		if (typeof currentDesc !== 'undefined') {
			if (currentDesc.configurable) {
				return false;
			}
			if (level === 'frozen' && IsDataDescriptor(ToPropertyDescriptor(currentDesc)) && currentDesc.writable) {
				return false;
			}
		}
		return true;
	});
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Date = GetIntrinsic('%Date%');
var $Number = GetIntrinsic('%Number%');

var $isFinite = require('../helpers/isFinite');

var abs = require('./abs');
var ToNumber = require('./ToNumber');

// https://262.ecma-international.org/5.1/#sec-15.9.1.14

module.exports = function TimeClip(time) {
	if (!$isFinite(time) || abs(time) > 8.64e15) {
		return NaN;
	}
	return $Number(new $Date(ToNumber(time)));
};

'use strict';

var msPerDay = require('../helpers/timeConstants').msPerDay;

var DayFromYear = require('./DayFromYear');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function TimeFromYear(y) {
	return msPerDay * DayFromYear(y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $isNaN = require('../helpers/isNaN');
var padTimeComponent = require('../helpers/padTimeComponent');

var HourFromTime = require('./HourFromTime');
var MinFromTime = require('./MinFromTime');
var SecFromTime = require('./SecFromTime');
var Type = require('./Type');

// https://262.ecma-international.org/9.0/#sec-timestring

module.exports = function TimeString(tv) {
	if (Type(tv) !== 'Number' || $isNaN(tv)) {
		throw new $TypeError('Assertion failed: `tv` must be a non-NaN Number');
	}
	var hour = HourFromTime(tv);
	var minute = MinFromTime(tv);
	var second = SecFromTime(tv);
	return padTimeComponent(hour) + ':' + padTimeComponent(minute) + ':' + padTimeComponent(second) + '\x20GMT';
};
'use strict';

var modulo = require('./modulo');

var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.2

module.exports = function TimeWithinDay(t) {
	return modulo(t, msPerDay);
};

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $asIntN = GetIntrinsic('%BigInt.asIntN%', true);
var $Number = GetIntrinsic('%Number%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');

var ToPrimitive = require('./ToPrimitive');

// https://262.ecma-international.org/11.0/#sec-tobigint

module.exports = function ToBigInt(argument) {
	if (!$BigInt) {
		throw new $SyntaxError('BigInts are not supported in this environment');
	}

	var prim = ToPrimitive(argument, $Number);

	if (typeof prim === 'number') {
		return $asIntN(0, prim);
	}
	return $BigInt(prim);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $pow = GetIntrinsic('%Math.pow%');

var ToBigInt = require('./ToBigInt');
var BigIntRemainder = require('./BigInt/remainder');

var modBigInt = require('../helpers/modBigInt');

// BigInt(2**63), but node v10.4-v10.8 have a bug where you can't `BigInt(x)` anything larger than MAX_SAFE_INTEGER
var twoSixtyThree = $BigInt && (BigInt($pow(2, 32)) * BigInt($pow(2, 31)));

// BigInt(2**64), but node v10.4-v10.8 have a bug where you can't `BigInt(x)` anything larger than MAX_SAFE_INTEGER
var twoSixtyFour = $BigInt && (BigInt($pow(2, 32)) * BigInt($pow(2, 32)));

// https://262.ecma-international.org/11.0/#sec-tobigint64

module.exports = function ToBigInt64(argument) {
	var n = ToBigInt(argument);
	var int64bit = modBigInt(BigIntRemainder, n, twoSixtyFour);
	return int64bit >= twoSixtyThree ? int64bit - twoSixtyFour : int64bit;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $pow = GetIntrinsic('%Math.pow%');

var ToBigInt = require('./ToBigInt');
var BigIntRemainder = require('./BigInt/remainder');

var modBigInt = require('../helpers/modBigInt');

// BigInt(2**64), but node v10.4-v10.8 have a bug where you can't `BigInt(x)` anything larger than MAX_SAFE_INTEGER
var twoSixtyFour = $BigInt && (BigInt($pow(2, 32)) * BigInt($pow(2, 32)));

// https://262.ecma-international.org/11.0/#sec-tobiguint64

module.exports = function ToBigUint64(argument) {
	var n = ToBigInt(argument);
	var int64bit = modBigInt(BigIntRemainder, n, twoSixtyFour);
	return int64bit;
};
'use strict';

// http://262.ecma-international.org/5.1/#sec-9.2

module.exports = function ToBoolean(value) { return !!value; };
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $Date = GetIntrinsic('%Date%');

var $isNaN = require('../helpers/isNaN');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-todatestring

module.exports = function ToDateString(tv) {
	if (Type(tv) !== 'Number') {
		throw new $TypeError('Assertion failed: `tv` must be a Number');
	}
	if ($isNaN(tv)) {
		return 'Invalid Date';
	}
	return $Date(tv);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $RangeError = GetIntrinsic('%RangeError%');

var ToIntegerOrInfinity = require('./ToIntegerOrInfinity');
var ToLength = require('./ToLength');
var SameValue = require('./SameValue');

// https://www.ecma-international.org/ecma-262/8.0/#sec-toindex

module.exports = function ToIndex(value) {
	if (typeof value === 'undefined') {
		return 0;
	}
	var integerIndex = ToIntegerOrInfinity(value);
	if (integerIndex < 0) {
		throw new $RangeError('index must be >= 0');
	}
	var index = ToLength(integerIndex);
	if (!SameValue(integerIndex, index)) {
		throw new $RangeError('index must be >= 0 and < 2 ** 53 - 1');
	}
	return index;
};
'use strict';

var ToUint16 = require('./ToUint16');

// https://ecma-international.org/ecma-262/6.0/#sec-toint16

module.exports = function ToInt16(argument) {
	var int16bit = ToUint16(argument);
	return int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;
};
'use strict';

var ToNumber = require('./ToNumber');

// http://262.ecma-international.org/5.1/#sec-9.5

module.exports = function ToInt32(x) {
	return ToNumber(x) >> 0;
};
'use strict';

var ToUint8 = require('./ToUint8');

// https://ecma-international.org/ecma-262/6.0/#sec-toint8

module.exports = function ToInt8(argument) {
	var int8bit = ToUint8(argument);
	return int8bit >= 0x80 ? int8bit - 0x100 : int8bit;
};
'use strict';

var abs = require('./abs');
var floor = require('./floor');
var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');

// https://262.ecma-international.org/12.0/#sec-tointegerorinfinity

module.exports = function ToIntegerOrInfinity(value) {
	var number = ToNumber(value);
	if ($isNaN(number) || number === 0) { return 0; }
	if (!$isFinite(number)) { return number; }
	return $sign(number) * floor(abs(number));
};
'use strict';

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');

var ToIntegerOrInfinity = require('./ToIntegerOrInfinity');

module.exports = function ToLength(argument) {
	var len = ToIntegerOrInfinity(argument);
	if (len <= 0) { return 0; } // includes converting -0 to +0
	if (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }
	return len;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $Number = GetIntrinsic('%Number%');
var $RegExp = GetIntrinsic('%RegExp%');
var $parseInteger = GetIntrinsic('%parseInt%');

var callBound = require('call-bind/callBound');
var regexTester = require('../helpers/regexTester');
var isPrimitive = require('../helpers/isPrimitive');

var $strSlice = callBound('String.prototype.slice');
var isBinary = regexTester(/^0b[01]+$/i);
var isOctal = regexTester(/^0o[0-7]+$/i);
var isInvalidHexLiteral = regexTester(/^[-+]0x[0-9a-f]+$/i);
var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
var hasNonWS = regexTester(nonWSregex);

// whitespace from: https://es5.github.io/#x15.5.4.20
// implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
var ws = [
	'\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
	'\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
	'\u2029\uFEFF'
].join('');
var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
var $replace = callBound('String.prototype.replace');
var $trim = function (value) {
	return $replace(value, trimRegex, '');
};

var ToPrimitive = require('./ToPrimitive');

// https://ecma-international.org/ecma-262/6.0/#sec-tonumber

module.exports = function ToNumber(argument) {
	var value = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number);
	if (typeof value === 'symbol') {
		throw new $TypeError('Cannot convert a Symbol value to a number');
	}
	if (typeof value === 'bigint') {
		throw new $TypeError('Conversion from \'BigInt\' to \'number\' is not allowed.');
	}
	if (typeof value === 'string') {
		if (isBinary(value)) {
			return ToNumber($parseInteger($strSlice(value, 2), 2));
		} else if (isOctal(value)) {
			return ToNumber($parseInteger($strSlice(value, 2), 8));
		} else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
			return NaN;
		}
		var trimmed = $trim(value);
		if (trimmed !== value) {
			return ToNumber(trimmed);
		}

	}
	return $Number(value);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Number = GetIntrinsic('%Number%');

var isPrimitive = require('../helpers/isPrimitive');

var ToPrimitive = require('./ToPrimitive');
var ToNumber = require('./ToNumber');
var Type = require('./Type');

// https://262.ecma-international.org/6.0/#sec-tonumber

module.exports = function ToNumeric(argument) {
	var primValue = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number);
	if (Type(primValue) === 'BigInt') {
		return primValue;
	}
	return ToNumber(primValue);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Object = GetIntrinsic('%Object%');

var RequireObjectCoercible = require('./RequireObjectCoercible');

// https://ecma-international.org/ecma-262/6.0/#sec-toobject

module.exports = function ToObject(value) {
	RequireObjectCoercible(value);
	return $Object(value);
};
'use strict';

var toPrimitive = require('es-to-primitive/es2015');

// https://ecma-international.org/ecma-262/6.0/#sec-toprimitive

module.exports = function ToPrimitive(input) {
	if (arguments.length > 1) {
		return toPrimitive(input, arguments[1]);
	}
	return toPrimitive(input);
};
'use strict';

var has = require('has');

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');
var ToBoolean = require('./ToBoolean');
var IsCallable = require('./IsCallable');

// https://262.ecma-international.org/5.1/#sec-8.10.5

module.exports = function ToPropertyDescriptor(Obj) {
	if (Type(Obj) !== 'Object') {
		throw new $TypeError('ToPropertyDescriptor requires an object');
	}

	var desc = {};
	if (has(Obj, 'enumerable')) {
		desc['[[Enumerable]]'] = ToBoolean(Obj.enumerable);
	}
	if (has(Obj, 'configurable')) {
		desc['[[Configurable]]'] = ToBoolean(Obj.configurable);
	}
	if (has(Obj, 'value')) {
		desc['[[Value]]'] = Obj.value;
	}
	if (has(Obj, 'writable')) {
		desc['[[Writable]]'] = ToBoolean(Obj.writable);
	}
	if (has(Obj, 'get')) {
		var getter = Obj.get;
		if (typeof getter !== 'undefined' && !IsCallable(getter)) {
			throw new $TypeError('getter must be a function');
		}
		desc['[[Get]]'] = getter;
	}
	if (has(Obj, 'set')) {
		var setter = Obj.set;
		if (typeof setter !== 'undefined' && !IsCallable(setter)) {
			throw new $TypeError('setter must be a function');
		}
		desc['[[Set]]'] = setter;
	}

	if ((has(desc, '[[Get]]') || has(desc, '[[Set]]')) && (has(desc, '[[Value]]') || has(desc, '[[Writable]]'))) {
		throw new $TypeError('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
	}
	return desc;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $String = GetIntrinsic('%String%');

var ToPrimitive = require('./ToPrimitive');
var ToString = require('./ToString');

// https://ecma-international.org/ecma-262/6.0/#sec-topropertykey

module.exports = function ToPropertyKey(argument) {
	var key = ToPrimitive(argument, $String);
	return typeof key === 'symbol' ? key : ToString(key);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $String = GetIntrinsic('%String%');
var $TypeError = GetIntrinsic('%TypeError%');

// https://ecma-international.org/ecma-262/6.0/#sec-tostring

module.exports = function ToString(argument) {
	if (typeof argument === 'symbol') {
		throw new $TypeError('Cannot convert a Symbol value to a string');
	}
	return $String(argument);
};
'use strict';

var abs = require('./abs');
var floor = require('./floor');
var modulo = require('./modulo');
var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');

// http://262.ecma-international.org/5.1/#sec-9.7

module.exports = function ToUint16(value) {
	var number = ToNumber(value);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * floor(abs(number));
	return modulo(posInt, 0x10000);
};
'use strict';

var ToNumber = require('./ToNumber');

// http://262.ecma-international.org/5.1/#sec-9.6

module.exports = function ToUint32(x) {
	return ToNumber(x) >>> 0;
};
'use strict';

var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');

var abs = require('./abs');
var floor = require('./floor');
var modulo = require('./modulo');

// https://ecma-international.org/ecma-262/6.0/#sec-touint8

module.exports = function ToUint8(argument) {
	var number = ToNumber(argument);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * floor(abs(number));
	return modulo(posInt, 0x100);
};
'use strict';

var ToNumber = require('./ToNumber');
var floor = require('./floor');

var $isNaN = require('../helpers/isNaN');

// https://ecma-international.org/ecma-262/6.0/#sec-touint8clamp

module.exports = function ToUint8Clamp(argument) {
	var number = ToNumber(argument);
	if ($isNaN(number) || number <= 0) { return 0; }
	if (number >= 0xFF) { return 0xFF; }
	var f = floor(argument);
	if (f + 0.5 < number) { return f + 1; }
	if (number < f + 0.5) { return f; }
	if (f % 2 !== 0) { return f + 1; }
	return f;
};
'use strict';

var trimStart = require('string.prototype.trimstart');
var trimEnd = require('string.prototype.trimend');

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var RequireObjectCoercible = require('./RequireObjectCoercible');
var ToString = require('./ToString');

// https://262.ecma-international.org/10.0/#sec-trimstring

module.exports = function TrimString(string, where) {
	var str = RequireObjectCoercible(string);
	var S = ToString(str);
	var T;
	if (where === 'start') {
		T = trimStart(S);
	} else if (where === 'end') {
		T = trimEnd(S);
	} else if (where === 'start+end') {
		T = trimStart(trimEnd(S));
	} else {
		throw new $TypeError('Assertion failed: invalid `where` value; must be "start", "end", or "start+end"');
	}
	return T;
};
'use strict';

var ES5Type = require('../5/Type');

// https://262.ecma-international.org/11.0/#sec-ecmascript-data-types-and-values

module.exports = function Type(x) {
	if (typeof x === 'symbol') {
		return 'Symbol';
	}
	if (typeof x === 'bigint') {
		return 'BigInt';
	}
	return ES5Type(x);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $fromCharCode = GetIntrinsic('%String.fromCharCode%');

var floor = require('./floor');
var modulo = require('./modulo');

var isCodePoint = require('../helpers/isCodePoint');

// https://ecma-international.org/ecma-262/12.0/#sec-utf16encoding

module.exports = function UTF16EncodeCodePoint(cp) {
	if (!isCodePoint(cp)) {
		throw new $TypeError('Assertion failed: `cp` must be >= 0 and <= 0x10FFFF');
	}
	if (cp <= 65535) {
		return $fromCharCode(cp);
	}
	var cu1 = $fromCharCode(floor((cp - 65536) / 1024) + 0xD800);
	var cu2 = $fromCharCode(modulo(cp - 65536, 1024) + 0xDC00);
	return cu1 + cu2;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $fromCharCode = GetIntrinsic('%String.fromCharCode%');

var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');

// https://tc39.es/ecma262/2020/#sec-utf16decodesurrogatepair

module.exports = function UTF16SurrogatePairToCodePoint(lead, trail) {
	if (!isLeadingSurrogate(lead) || !isTrailingSurrogate(trail)) {
		throw new $TypeError('Assertion failed: `lead` must be a leading surrogate char code, and `trail` must be a trailing surrogate char code');
	}
	// var cp = (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000;
	return $fromCharCode(lead) + $fromCharCode(trail);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $charCodeAt = callBound('String.prototype.charCodeAt');
var $numberToString = callBound('Number.prototype.toString');
var $toLowerCase = callBound('String.prototype.toLowerCase');

var StringPad = require('./StringPad');

// https://262.ecma-international.org/11.0/#sec-unicodeescape

module.exports = function UnicodeEscape(C) {
	if (typeof C !== 'string' || C.length !== 1) {
		throw new $TypeError('Assertion failed: `C` must be a single code unit');
	}
	var n = $charCodeAt(C, 0);
	if (n > 0xFFFF) {
		throw new $TypeError('`Assertion failed: numeric value of `C` must be <= 0xFFFF');
	}

	return '\\u' + StringPad($toLowerCase($numberToString(n, 16)), 4, '0', 'start');
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');
var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
var isSamePropertyDescriptor = require('../helpers/isSamePropertyDescriptor');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsGenericDescriptor = require('./IsGenericDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-validateandapplypropertydescriptor
// https://ecma-international.org/ecma-262/8.0/#sec-validateandapplypropertydescriptor

// eslint-disable-next-line max-lines-per-function, max-statements, max-params
module.exports = function ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current) {
	// this uses the ES2017+ logic, since it fixes a number of bugs in the ES2015 logic.
	var oType = Type(O);
	if (oType !== 'Undefined' && oType !== 'Object') {
		throw new $TypeError('Assertion failed: O must be undefined or an Object');
	}
	if (Type(extensible) !== 'Boolean') {
		throw new $TypeError('Assertion failed: extensible must be a Boolean');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (Type(current) !== 'Undefined' && !isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, current)) {
		throw new $TypeError('Assertion failed: current must be a Property Descriptor, or undefined');
	}
	if (oType !== 'Undefined' && !IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: if O is not undefined, P must be a Property Key');
	}
	if (Type(current) === 'Undefined') {
		if (!extensible) {
			return false;
		}
		if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
			if (oType !== 'Undefined') {
				DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					{
						'[[Configurable]]': Desc['[[Configurable]]'],
						'[[Enumerable]]': Desc['[[Enumerable]]'],
						'[[Value]]': Desc['[[Value]]'],
						'[[Writable]]': Desc['[[Writable]]']
					}
				);
			}
		} else {
			if (!IsAccessorDescriptor(Desc)) {
				throw new $TypeError('Assertion failed: Desc is not an accessor descriptor');
			}
			if (oType !== 'Undefined') {
				return DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					Desc
				);
			}
		}
		return true;
	}
	if (IsGenericDescriptor(Desc) && !('[[Configurable]]' in Desc) && !('[[Enumerable]]' in Desc)) {
		return true;
	}
	if (isSamePropertyDescriptor({ SameValue: SameValue }, Desc, current)) {
		return true; // removed by ES2017, but should still be correct
	}
	// "if every field in Desc is absent, return true" can't really match the assertion that it's a Property Descriptor
	if (!current['[[Configurable]]']) {
		if (Desc['[[Configurable]]']) {
			return false;
		}
		if ('[[Enumerable]]' in Desc && !Desc['[[Enumerable]]'] === !!current['[[Enumerable]]']) {
			return false;
		}
	}
	if (IsGenericDescriptor(Desc)) {
		// no further validation is required.
	} else if (IsDataDescriptor(current) !== IsDataDescriptor(Desc)) {
		if (!current['[[Configurable]]']) {
			return false;
		}
		if (IsDataDescriptor(current)) {
			if (oType !== 'Undefined') {
				DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					{
						'[[Configurable]]': current['[[Configurable]]'],
						'[[Enumerable]]': current['[[Enumerable]]'],
						'[[Get]]': undefined
					}
				);
			}
		} else if (oType !== 'Undefined') {
			DefineOwnProperty(
				IsDataDescriptor,
				SameValue,
				FromPropertyDescriptor,
				O,
				P,
				{
					'[[Configurable]]': current['[[Configurable]]'],
					'[[Enumerable]]': current['[[Enumerable]]'],
					'[[Value]]': undefined
				}
			);
		}
	} else if (IsDataDescriptor(current) && IsDataDescriptor(Desc)) {
		if (!current['[[Configurable]]'] && !current['[[Writable]]']) {
			if ('[[Writable]]' in Desc && Desc['[[Writable]]']) {
				return false;
			}
			if ('[[Value]]' in Desc && !SameValue(Desc['[[Value]]'], current['[[Value]]'])) {
				return false;
			}
			return true;
		}
	} else if (IsAccessorDescriptor(current) && IsAccessorDescriptor(Desc)) {
		if (!current['[[Configurable]]']) {
			if ('[[Set]]' in Desc && !SameValue(Desc['[[Set]]'], current['[[Set]]'])) {
				return false;
			}
			if ('[[Get]]' in Desc && !SameValue(Desc['[[Get]]'], current['[[Get]]'])) {
				return false;
			}
			return true;
		}
	} else {
		throw new $TypeError('Assertion failed: current and Desc are not both data, both accessors, or one accessor and one data.');
	}
	if (oType !== 'Undefined') {
		return DefineOwnProperty(
			IsDataDescriptor,
			SameValue,
			FromPropertyDescriptor,
			O,
			P,
			Desc
		);
	}
	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');
var $deref = callBound('WeakRef.prototype.deref', true);

var isWeakRef = require('is-weakref');

var AddToKeptObjects = require('./AddToKeptObjects');

// https://ecma-international.org/ecma-262/12.0/#sec-weakrefderef

module.exports = function WeakRefDeref(weakRef) {
	if (!isWeakRef(weakRef)) {
		throw new $TypeError('Assertion failed: `weakRef` must be a WeakRef');
	}
	var target = $deref(weakRef);
	if (target) {
		AddToKeptObjects(target);
	}
	return target;
};
'use strict';

var Day = require('./Day');
var modulo = require('./modulo');

// https://262.ecma-international.org/5.1/#sec-15.9.1.6

module.exports = function WeekDay(t) {
	return modulo(Day(t) + 4, 7);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Date = GetIntrinsic('%Date%');

var callBound = require('call-bind/callBound');

var $getUTCFullYear = callBound('Date.prototype.getUTCFullYear');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function YearFromTime(t) {
	// largest y such that this.TimeFromYear(y) <= t
	return $getUTCFullYear(new $Date(t));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $abs = GetIntrinsic('%Math.abs%');

// http://262.ecma-international.org/5.1/#sec-5.2

module.exports = function abs(x) {
	return $abs(x);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var max = GetIntrinsic('%Math.max%');
var min = GetIntrinsic('%Math.min%');

var Type = require('./Type');

// https://262.ecma-international.org/12.0/#clamping

module.exports = function clamp(x, lower, upper) {
	if (Type(x) !== 'Number' || Type(lower) !== 'Number' || Type(upper) !== 'Number' || !(lower <= upper)) {
		throw new $TypeError('Assertion failed: all three arguments must be MVs, and `lower` must be `<= upper`');
	}
	return min(max(lower, x), upper);
};
'use strict';

// var modulo = require('./modulo');
var $floor = Math.floor;

// http://262.ecma-international.org/5.1/#sec-5.2

module.exports = function floor(x) {
	// return x - modulo(x, 1);
	return $floor(x);
};
'use strict';

var mod = require('../helpers/mod');

// https://262.ecma-international.org/5.1/#sec-5.2

module.exports = function modulo(x, y) {
	return mod(x, y);
};
'use strict';

var modulo = require('./modulo');

var msPerSecond = require('../helpers/timeConstants').msPerSecond;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function msFromTime(t) {
	return modulo(t, msPerSecond);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsIntegralNumber = require('./IsIntegralNumber');
var Type = require('./Type');

var callBound = require('call-bind/callBound');

var $slice = callBound('String.prototype.slice');

// https://262.ecma-international.org/12.0/#substring
module.exports = function substring(S, inclusiveStart, exclusiveEnd) {
	if (Type(S) !== 'String' || !IsIntegralNumber(inclusiveStart) || (arguments.length > 2 && !IsIntegralNumber(exclusiveEnd))) {
		throw new $TypeError('`S` must be a String, and `inclusiveStart` and `exclusiveEnd` must be integers');
	}
	return $slice(S, inclusiveStart, arguments.length > 2 ? exclusiveEnd : S.length);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');
var $bigIntValueOf = callBound('BigInt.prototype.valueOf', true);

var Type = require('./Type');

// https://262.ecma-international.org/11.0/#sec-thisbigintvalue

module.exports = function thisBigIntValue(value) {
	var type = Type(value);
	if (type === 'BigInt') {
		return value;
	}
	if (!$bigIntValueOf) {
		throw new $TypeError('BigInt is not supported');
	}
	return $bigIntValueOf(value);
};
'use strict';

var $BooleanValueOf = require('call-bind/callBound')('Boolean.prototype.valueOf');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-boolean-prototype-object

module.exports = function thisBooleanValue(value) {
	if (Type(value) === 'Boolean') {
		return value;
	}

	return $BooleanValueOf(value);
};
'use strict';

var callBound = require('call-bind/callBound');

var Type = require('./Type');

var $NumberValueOf = callBound('Number.prototype.valueOf');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-number-prototype-object

module.exports = function thisNumberValue(value) {
	if (Type(value) === 'Number') {
		return value;
	}

	return $NumberValueOf(value);
};

'use strict';

var $StringValueOf = require('call-bind/callBound')('String.prototype.valueOf');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object

module.exports = function thisStringValue(value) {
	if (Type(value) === 'String') {
		return value;
	}

	return $StringValueOf(value);
};
'use strict';

var callBound = require('call-bind/callBound');

var $SymbolValueOf = callBound('Symbol.prototype.valueOf', true);

var Type = require('./Type');

// https://262.ecma-international.org/9.0/#sec-thissymbolvalue

module.exports = function thisSymbolValue(value) {
	if (!$SymbolValueOf) {
		throw new SyntaxError('Symbols are not supported; thisSymbolValue requires that `value` be a Symbol or a Symbol object');
	}
	if (Type(value) === 'Symbol') {
		return value;
	}
	return $SymbolValueOf(value);
};
'use strict';

module.exports = require('../2018/thisTimeValue');
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isFinite = require('../../helpers/isFinite');
var isNaN = require('../../helpers/isNaN');

var Type = require('../Type');

// https://262.ecma-international.org/12.0/#sec-numeric-types-number-add

module.exports = function NumberAdd(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}

	if (isNaN(x) || isNaN(y) || (x === Infinity && y === -Infinity) || (x === -Infinity && y === Infinity)) {
		return NaN;
	}

	if (!isFinite(x)) {
		return x;
	}
	if (!isFinite(y)) {
		return y;
	}

	if (x === y && x === 0) { // both zeroes
		return Infinity / x === -Infinity && Infinity / y === -Infinity ? -0 : +0;
	}

	// shortcut for the actual spec mechanics
	return x + y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var NumberBitwiseOp = require('../NumberBitwiseOp');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-bitwiseAND

module.exports = function NumberBitwiseAND(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}
	return NumberBitwiseOp('&', x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var ToInt32 = require('../ToInt32');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-bitwiseNOT

module.exports = function NumberBitwiseNOT(x) {
	if (Type(x) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` argument must be a Number');
	}
	var oldValue = ToInt32(x);
	// Return the result of applying the bitwise operator op to lnum and rnum. The result is a signed 32-bit integer.
	return ~oldValue;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var NumberBitwiseOp = require('../NumberBitwiseOp');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-bitwiseOR

module.exports = function NumberBitwiseOR(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}
	return NumberBitwiseOp('|', x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var NumberBitwiseOp = require('../NumberBitwiseOp');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-bitwiseXOR

module.exports = function NumberBitwiseXOR(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}
	return NumberBitwiseOp('^', x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isFinite = require('../../helpers/isFinite');
var isNaN = require('../../helpers/isNaN');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-divide

module.exports = function NumberDivide(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}
	if (isNaN(x) || isNaN(y) || (!isFinite(x) && !isFinite(y))) {
		return NaN;
	}
	// shortcut for the actual spec mechanics
	return x / y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isNaN = require('../../helpers/isNaN');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-equal

module.exports = function NumberEqual(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}
	if (isNaN(x) || isNaN(y)) {
		return false;
	}
	// shortcut for the actual spec mechanics
	return x === y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
// var isNegativeZero = require('is-negative-zero');

var $pow = GetIntrinsic('%Math.pow%');

var $TypeError = GetIntrinsic('%TypeError%');

/*
var abs = require('../../helpers/abs');
var isFinite = require('../../helpers/isFinite');
var isNaN = require('../../helpers/isNaN');

var IsInteger = require('../IsInteger');
*/
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-exponentiate

/* eslint max-lines-per-function: 0, max-statements: 0 */

module.exports = function NumberExponentiate(base, exponent) {
	if (Type(base) !== 'Number' || Type(exponent) !== 'Number') {
		throw new $TypeError('Assertion failed: `base` and `exponent` arguments must be Numbers');
	}
	return $pow(base, exponent);
	/*
	if (isNaN(exponent)) {
		return NaN;
	}
	if (exponent === 0) {
		return 1;
	}
	if (isNaN(base)) {
		return NaN;
	}
	var aB = abs(base);
	if (aB > 1 && exponent === Infinity) {
		return Infinity;
	}
	if (aB > 1 && exponent === -Infinity) {
		return 0;
	}
	if (aB === 1 && (exponent === Infinity || exponent === -Infinity)) {
		return NaN;
	}
	if (aB < 1 && exponent === Infinity) {
		return +0;
	}
	if (aB < 1 && exponent === -Infinity) {
		return Infinity;
	}
	if (base === Infinity) {
		return exponent > 0 ? Infinity : 0;
	}
	if (base === -Infinity) {
		var isOdd = true;
		if (exponent > 0) {
			return isOdd ? -Infinity : Infinity;
		}
		return isOdd ? -0 : 0;
	}
	if (exponent > 0) {
		return isNegativeZero(base) ? Infinity : 0;
	}
	if (isNegativeZero(base)) {
		if (exponent > 0) {
			return isOdd ? -0 : 0;
		}
		return isOdd ? -Infinity : Infinity;
	}
	if (base < 0 && isFinite(base) && isFinite(exponent) && !IsInteger(exponent)) {
		return NaN;
	}
	*/
};
'use strict';

var add = require('./add');
var bitwiseAND = require('./bitwiseAND');
var bitwiseNOT = require('./bitwiseNOT');
var bitwiseOR = require('./bitwiseOR');
var bitwiseXOR = require('./bitwiseXOR');
var divide = require('./divide');
var equal = require('./equal');
var exponentiate = require('./exponentiate');
var leftShift = require('./leftShift');
var lessThan = require('./lessThan');
var multiply = require('./multiply');
var remainder = require('./remainder');
var sameValue = require('./sameValue');
var sameValueZero = require('./sameValueZero');
var signedRightShift = require('./signedRightShift');
var subtract = require('./subtract');
var toString = require('./toString');
var unaryMinus = require('./unaryMinus');
var unsignedRightShift = require('./unsignedRightShift');

module.exports = {
	add: add,
	bitwiseAND: bitwiseAND,
	bitwiseNOT: bitwiseNOT,
	bitwiseOR: bitwiseOR,
	bitwiseXOR: bitwiseXOR,
	divide: divide,
	equal: equal,
	exponentiate: exponentiate,
	leftShift: leftShift,
	lessThan: lessThan,
	multiply: multiply,
	remainder: remainder,
	sameValue: sameValue,
	sameValueZero: sameValueZero,
	signedRightShift: signedRightShift,
	subtract: subtract,
	toString: toString,
	unaryMinus: unaryMinus,
	unsignedRightShift: unsignedRightShift
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var ToInt32 = require('../ToInt32');
var ToUint32 = require('../ToUint32');
var modulo = require('../modulo');
var Type = require('../Type');

// https://262.ecma-international.org/12.0/#sec-numeric-types-number-leftShift

module.exports = function NumberLeftShift(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}

	var lnum = ToInt32(x);
	var rnum = ToUint32(y);

	var shiftCount = modulo(rnum, 32);

	return lnum << shiftCount;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isNaN = require('../../helpers/isNaN');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-lessThan

module.exports = function NumberLessThan(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}

	// If x is NaN, return undefined.
	// If y is NaN, return undefined.
	if (isNaN(x) || isNaN(y)) {
		return void undefined;
	}

	// shortcut for the actual spec mechanics
	return x < y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isNaN = require('../../helpers/isNaN');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-multiply

module.exports = function NumberMultiply(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}

	if (isNaN(x) || isNaN(y) || (x === 0 && !isFinite(y)) || (!isFinite(x) && y === 0)) {
		return NaN;
	}
	if (!isFinite(x) && !isFinite(y)) {
		return x === y ? Infinity : -Infinity;
	}
	if (!isFinite(x) && y !== 0) {
		return x > 0 ? Infinity : -Infinity;
	}
	if (!isFinite(y) && x !== 0) {
		return y > 0 ? Infinity : -Infinity;
	}

	// shortcut for the actual spec mechanics
	return x * y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isNaN = require('../../helpers/isNaN');

var Type = require('../Type');

// https://262.ecma-international.org/12.0/#sec-numeric-types-number-remainder

module.exports = function NumberRemainder(n, d) {
	if (Type(n) !== 'Number' || Type(d) !== 'Number') {
		throw new $TypeError('Assertion failed: `n` and `d` arguments must be Numbers');
	}

	// If either operand is NaN, the result is NaN.
	// If the dividend is an infinity, or the divisor is a zero, or both, the result is NaN.
	if (isNaN(n) || isNaN(d) || !isFinite(n) || d === 0) {
		return NaN;
	}

	// If the dividend is finite and the divisor is an infinity, the result equals the dividend.
	// If the dividend is a zero and the divisor is nonzero and finite, the result is the same as the dividend.
	if (!isFinite(d) || n === 0) {
		return n;
	}

	// In the remaining cases, where neither an infinity, nor a zero, nor NaN is involved…
	return n % d;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var isNegativeZero = require('is-negative-zero');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');
var NumberSameValueZero = require('./sameValueZero');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-sameValue

module.exports = function NumberSameValue(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}
	if (x === 0 && y === 0) {
		return !(isNegativeZero(x) ^ isNegativeZero(y));
	}
	return NumberSameValueZero(x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isNaN = require('../../helpers/isNaN');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-sameValueZero

module.exports = function NumberSameValueZero(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}

	var xNaN = isNaN(x);
	var yNaN = isNaN(y);
	if (xNaN || yNaN) {
		return xNaN === yNaN;
	}
	return x === y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var ToInt32 = require('../ToInt32');
var ToUint32 = require('../ToUint32');
var modulo = require('../modulo');
var Type = require('../Type');

// https://262.ecma-international.org/12.0/#sec-numeric-types-number-signedRightShift

module.exports = function NumberSignedRightShift(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}

	var lnum = ToInt32(x);
	var rnum = ToUint32(y);

	var shiftCount = modulo(rnum, 32);

	return lnum >> shiftCount;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

var NumberAdd = require('./add');
var NumberUnaryMinus = require('./unaryMinus');

// https://262.ecma-international.org/12.0/#sec-numeric-types-number-subtract

module.exports = function NumberSubtract(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}
	return NumberAdd(x, NumberUnaryMinus(y));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $String = GetIntrinsic('%String%');
var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-tostring

module.exports = function NumberToString(x) {
	if (Type(x) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` must be a Number');
	}

	return $String(x);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isNaN = require('../../helpers/isNaN');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-unaryMinus

module.exports = function NumberUnaryMinus(x) {
	if (Type(x) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` argument must be a Number');
	}
	if (isNaN(x)) {
		return NaN;
	}
	return -x;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var ToInt32 = require('../ToInt32');
var ToUint32 = require('../ToUint32');
var modulo = require('../modulo');
var Type = require('../Type');

// https://262.ecma-international.org/12.0/#sec-numeric-types-number-unsignedRightShift

module.exports = function NumberUnsignedRightShift(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}

	var lnum = ToInt32(x);
	var rnum = ToUint32(y);

	var shiftCount = modulo(rnum, 32);

	return lnum >>> shiftCount;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-add

module.exports = function BigIntAdd(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}

	// shortcut for the actual spec mechanics
	return x + y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var BigIntBitwiseOp = require('../BigIntBitwiseOp');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-bitwiseAND

module.exports = function BigIntBitwiseAND(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}
	return BigIntBitwiseOp('&', x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-bitwiseNOT

module.exports = function BigIntBitwiseNOT(x) {
	if (Type(x) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` argument must be a BigInt');
	}
	return -x - $BigInt(1);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var BigIntBitwiseOp = require('../BigIntBitwiseOp');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-bitwiseOR

module.exports = function BigIntBitwiseOR(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}
	return BigIntBitwiseOp('|', x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var BigIntBitwiseOp = require('../BigIntBitwiseOp');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-bitwiseXOR

module.exports = function BigIntBitwiseXOR(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}
	return BigIntBitwiseOp('^', x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $RangeError = GetIntrinsic('%RangeError%');
var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-divide

module.exports = function BigIntDivide(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}
	if (y === $BigInt(0)) {
		throw new $RangeError('Division by zero');
	}
	// shortcut for the actual spec mechanics
	return x / y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-equal

module.exports = function BigIntEqual(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}
	// shortcut for the actual spec mechanics
	return x === y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $RangeError = GetIntrinsic('%RangeError%');
var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-exponentiate

module.exports = function BigIntExponentiate(base, exponent) {
	if (Type(base) !== 'BigInt' || Type(exponent) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `base` and `exponent` arguments must be BigInts');
	}
	if (exponent < $BigInt(0)) {
		throw new $RangeError('Exponent must be positive');
	}
	if (/* base === $BigInt(0) && */ exponent === $BigInt(0)) {
		return $BigInt(1);
	}

	var square = base;
	var remaining = exponent;
	while (remaining > $BigInt(0)) {
		square += exponent;
		--remaining; // eslint-disable-line no-plusplus
	}
	return square;
};
'use strict';

var add = require('./add');
var bitwiseAND = require('./bitwiseAND');
var bitwiseNOT = require('./bitwiseNOT');
var bitwiseOR = require('./bitwiseOR');
var bitwiseXOR = require('./bitwiseXOR');
var divide = require('./divide');
var equal = require('./equal');
var exponentiate = require('./exponentiate');
var leftShift = require('./leftShift');
var lessThan = require('./lessThan');
var multiply = require('./multiply');
var remainder = require('./remainder');
var sameValue = require('./sameValue');
var sameValueZero = require('./sameValueZero');
var signedRightShift = require('./signedRightShift');
var subtract = require('./subtract');
var toString = require('./toString');
var unaryMinus = require('./unaryMinus');
var unsignedRightShift = require('./unsignedRightShift');

module.exports = {
	add: add,
	bitwiseAND: bitwiseAND,
	bitwiseNOT: bitwiseNOT,
	bitwiseOR: bitwiseOR,
	bitwiseXOR: bitwiseXOR,
	divide: divide,
	equal: equal,
	exponentiate: exponentiate,
	leftShift: leftShift,
	lessThan: lessThan,
	multiply: multiply,
	remainder: remainder,
	sameValue: sameValue,
	sameValueZero: sameValueZero,
	signedRightShift: signedRightShift,
	subtract: subtract,
	toString: toString,
	unaryMinus: unaryMinus,
	unsignedRightShift: unsignedRightShift
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-leftShift

module.exports = function BigIntLeftShift(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}

	// shortcut for the actual spec mechanics
	return x << y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-lessThan

module.exports = function BigIntLessThan(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}

	// shortcut for the actual spec mechanics
	return x < y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-multiply

module.exports = function BigIntMultiply(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}

	// shortcut for the actual spec mechanics
	return x * y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $RangeError = GetIntrinsic('%RangeError%');
var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

var zero = $BigInt && $BigInt(0);

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-remainder

module.exports = function BigIntRemainder(n, d) {
	if (Type(n) !== 'BigInt' || Type(d) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `n` and `d` arguments must be BigInts');
	}

	if (d === zero) {
		throw new $RangeError('Division by zero');
	}

	if (n === zero) {
		return zero;
	}

	// shortcut for the actual spec mechanics
	return n % d;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');
var BigIntEqual = require('./equal');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-sameValue

module.exports = function BigIntSameValue(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}

	return BigIntEqual(x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');
var BigIntEqual = require('./equal');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-sameValueZero

module.exports = function BigIntSameValueZero(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}

	return BigIntEqual(x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');
var BigIntLeftShift = require('./leftShift');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-signedRightShift

module.exports = function BigIntSignedRightShift(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}

	return BigIntLeftShift(x, -y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-subtract

module.exports = function BigIntSubtract(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}

	// shortcut for the actual spec mechanics
	return x - y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $String = GetIntrinsic('%String%');
var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-tostring

module.exports = function BigIntToString(x) {
	if (Type(x) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` must be a BigInt');
	}

	return $String(x);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

var zero = $BigInt && $BigInt(0);

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-unaryMinus

module.exports = function BigIntUnaryMinus(x) {
	if (Type(x) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` argument must be a BigInt');
	}

	if (x === zero) {
		return zero;
	}

	return -x;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-unsignedRightShift

module.exports = function BigIntUnsignedRightShift(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}

	throw new $TypeError('BigInts have no unsigned right shift, use >> instead');
};
'use strict';

var StrictEqualityComparison = require('./StrictEqualityComparison');
var StringToBigInt = require('./StringToBigInt');
var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

var isNaN = require('../helpers/isNaN');

// https://ecma-international.org/ecma-262/11.0/#sec-abstract-equality-comparison

module.exports = function AbstractEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType === yType) {
		return StrictEqualityComparison(x, y);
	}
	if (x == null && y == null) {
		return true;
	}
	if (xType === 'Number' && yType === 'String') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if (xType === 'String' && yType === 'Number') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (xType === 'BigInt' && yType === 'String') {
		var n = StringToBigInt(y);
		if (isNaN(n)) {
			return false;
		}
		return AbstractEqualityComparison(x, n);
	}
	if (xType === 'String' && yType === 'BigInt') {
		return AbstractEqualityComparison(y, x);
	}
	if (xType === 'Boolean') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (yType === 'Boolean') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if ((xType === 'String' || xType === 'Number' || xType === 'BigInt' || xType === 'Symbol') && yType === 'Object') {
		return AbstractEqualityComparison(x, ToPrimitive(y));
	}
	if (xType === 'Object' && (yType === 'String' || yType === 'Number' || yType === 'BigInt' || yType === 'Symbol')) {
		return AbstractEqualityComparison(ToPrimitive(x), y);
	}
	if ((xType === 'BigInt' && yType === 'Number') || (xType === 'Number' && yType === 'BigInt')) {
		if (isNaN(x) || isNaN(y) || x === Infinity || y === Infinity || x === -Infinity || y === -Infinity) {
			return false;
		}
		return x == y; // eslint-disable-line eqeqeq
	}
	return false;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Number = GetIntrinsic('%Number%');
var $TypeError = GetIntrinsic('%TypeError%');

var $isNaN = require('../helpers/isNaN');

var IsStringPrefix = require('./IsStringPrefix');
var StringToBigInt = require('./StringToBigInt');
var ToNumeric = require('./ToNumeric');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

var BigIntLessThan = require('./BigInt/lessThan');
var NumberLessThan = require('./Number/lessThan');

// https://262.ecma-international.org/9.0/#sec-abstract-relational-comparison

// eslint-disable-next-line max-statements, max-lines-per-function
module.exports = function AbstractRelationalComparison(x, y, LeftFirst) {
	if (Type(LeftFirst) !== 'Boolean') {
		throw new $TypeError('Assertion failed: LeftFirst argument must be a Boolean');
	}
	var px;
	var py;
	if (LeftFirst) {
		px = ToPrimitive(x, $Number);
		py = ToPrimitive(y, $Number);
	} else {
		py = ToPrimitive(y, $Number);
		px = ToPrimitive(x, $Number);
	}
	if (Type(px) === 'String' && Type(py) === 'String') {
		if (IsStringPrefix(py, px)) {
			return false;
		}
		if (IsStringPrefix(px, py)) {
			return true;
		}
		return px < py; // both strings, neither a prefix of the other. shortcut for steps 3 c-f
	}

	var pxType = Type(px);
	var pyType = Type(py);
	var nx;
	var ny;
	if (pxType === 'BigInt' && pyType === 'String') {
		ny = StringToBigInt(py);
		if ($isNaN(ny)) {
			return void undefined;
		}
		return BigIntLessThan(px, ny);
	}
	if (pxType === 'String' && pyType === 'BigInt') {
		nx = StringToBigInt(px);
		if ($isNaN(nx)) {
			return void undefined;
		}
		return BigIntLessThan(px, ny);
	}

	nx = ToNumeric(px);
	ny = ToNumeric(py);
	var nxType = Type(nx);
	if (nxType === Type(ny)) {
		return nxType === 'Number' ? NumberLessThan(nx, ny) : BigIntLessThan(nx, ny);
	}

	if ($isNaN(nx) || $isNaN(ny)) {
		return void undefined;
	}
	if (nx === -Infinity || ny === Infinity) {
		return true;
	}
	if (nx === Infinity || ny === -Infinity) {
		return false;
	}

	return nx < ny; // by now, these are both nonzero, finite, and not equal
};
'use strict';

var inspect = require('object-inspect');

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var Get = require('./Get');
var GetIterator = require('./GetIterator');
var IsCallable = require('./IsCallable');
var IteratorClose = require('./IteratorClose');
var IteratorStep = require('./IteratorStep');
var IteratorValue = require('./IteratorValue');
var Type = require('./Type');

// https://262.ecma-international.org/10.0//#sec-add-entries-from-iterable

module.exports = function AddEntriesFromIterable(target, iterable, adder) {
	if (!IsCallable(adder)) {
		throw new $TypeError('Assertion failed: `adder` is not callable');
	}
	if (iterable == null) {
		throw new $TypeError('Assertion failed: `iterable` is present, and not nullish');
	}
	var iteratorRecord = GetIterator(iterable);
	while (true) { // eslint-disable-line no-constant-condition
		var next = IteratorStep(iteratorRecord);
		if (!next) {
			return target;
		}
		var nextItem = IteratorValue(next);
		if (Type(nextItem) !== 'Object') {
			var error = new $TypeError('iterator next must return an Object, got ' + inspect(nextItem));
			return IteratorClose(
				iteratorRecord,
				function () { throw error; } // eslint-disable-line no-loop-func
			);
		}
		try {
			var k = Get(nextItem, '0');
			var v = Get(nextItem, '1');
			Call(adder, target, [k, v]);
		} catch (e) {
			return IteratorClose(
				iteratorRecord,
				function () { throw e; }
			);
		}
	}
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var CodePointAt = require('./CodePointAt');
var IsInteger = require('./IsInteger');
var Type = require('./Type');

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');

var $TypeError = GetIntrinsic('%TypeError%');

// https://262.ecma-international.org/6.0/#sec-advancestringindex

module.exports = function AdvanceStringIndex(S, index, unicode) {
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	if (!IsInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) {
		throw new $TypeError('Assertion failed: `length` must be an integer >= 0 and <= 2**53');
	}
	if (Type(unicode) !== 'Boolean') {
		throw new $TypeError('Assertion failed: `unicode` must be a Boolean');
	}
	if (!unicode) {
		return index + 1;
	}
	var length = S.length;
	if ((index + 1) >= length) {
		return index + 1;
	}
	var cp = CodePointAt(S, index);
	return index + cp['[[CodeUnitCount]]'];
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $ArrayPrototype = GetIntrinsic('%Array.prototype%');
var $RangeError = GetIntrinsic('%RangeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var IsInteger = require('./IsInteger');

var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1;

var $setProto = GetIntrinsic('%Object.setPrototypeOf%', true) || (
	// eslint-disable-next-line no-proto, no-negated-condition
	[].__proto__ !== $ArrayPrototype
		? null
		: function (O, proto) {
			O.__proto__ = proto; // eslint-disable-line no-proto, no-param-reassign
			return O;
		}
);

// https://ecma-international.org/ecma-262/6.0/#sec-arraycreate

module.exports = function ArrayCreate(length) {
	if (!IsInteger(length) || length < 0) {
		throw new $TypeError('Assertion failed: `length` must be an integer Number >= 0');
	}
	if (length > MAX_ARRAY_LENGTH) {
		throw new $RangeError('length is greater than (2**32 - 1)');
	}
	var proto = arguments.length > 1 ? arguments[1] : $ArrayPrototype;
	var A = []; // steps 5 - 7, and 9
	if (proto !== $ArrayPrototype) { // step 8
		if (!$setProto) {
			throw new $SyntaxError('ArrayCreate: a `proto` argument that is not `Array.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
		}
		$setProto(A, proto);
	}
	if (length !== 0) { // bypasses the need for step 2
		A.length = length;
	}
	/* step 10, the above as a shortcut for the below
	OrdinaryDefineOwnProperty(A, 'length', {
		'[[Configurable]]': false,
		'[[Enumerable]]': false,
		'[[Value]]': length,
		'[[Writable]]': true
	});
	*/
	return A;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $RangeError = GetIntrinsic('%RangeError%');
var $TypeError = GetIntrinsic('%TypeError%');

var assign = require('object.assign');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var IsArray = require('./IsArray');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var OrdinaryDefineOwnProperty = require('./OrdinaryDefineOwnProperty');
var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
var ToNumber = require('./ToNumber');
var ToString = require('./ToString');
var ToUint32 = require('./ToUint32');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-arraysetlength

// eslint-disable-next-line max-statements, max-lines-per-function
module.exports = function ArraySetLength(A, Desc) {
	if (!IsArray(A)) {
		throw new $TypeError('Assertion failed: A must be an Array');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (!('[[Value]]' in Desc)) {
		return OrdinaryDefineOwnProperty(A, 'length', Desc);
	}
	var newLenDesc = assign({}, Desc);
	var newLen = ToUint32(Desc['[[Value]]']);
	var numberLen = ToNumber(Desc['[[Value]]']);
	if (newLen !== numberLen) {
		throw new $RangeError('Invalid array length');
	}
	newLenDesc['[[Value]]'] = newLen;
	var oldLenDesc = OrdinaryGetOwnProperty(A, 'length');
	if (!IsDataDescriptor(oldLenDesc)) {
		throw new $TypeError('Assertion failed: an array had a non-data descriptor on `length`');
	}
	var oldLen = oldLenDesc['[[Value]]'];
	if (newLen >= oldLen) {
		return OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
	}
	if (!oldLenDesc['[[Writable]]']) {
		return false;
	}
	var newWritable;
	if (!('[[Writable]]' in newLenDesc) || newLenDesc['[[Writable]]']) {
		newWritable = true;
	} else {
		newWritable = false;
		newLenDesc['[[Writable]]'] = true;
	}
	var succeeded = OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
	if (!succeeded) {
		return false;
	}
	while (newLen < oldLen) {
		oldLen -= 1;
		// eslint-disable-next-line no-param-reassign
		var deleteSucceeded = delete A[ToString(oldLen)];
		if (!deleteSucceeded) {
			newLenDesc['[[Value]]'] = oldLen + 1;
			if (!newWritable) {
				newLenDesc['[[Writable]]'] = false;
				OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
				return false;
			}
		}
	}
	if (!newWritable) {
		return OrdinaryDefineOwnProperty(A, 'length', { '[[Writable]]': false });
	}
	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Array = GetIntrinsic('%Array%');
var $species = GetIntrinsic('%Symbol.species%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsArray = require('./IsArray');
var IsConstructor = require('./IsConstructor');
var IsInteger = require('./IsInteger');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate

module.exports = function ArraySpeciesCreate(originalArray, length) {
	if (!IsInteger(length) || length < 0) {
		throw new $TypeError('Assertion failed: length must be an integer >= 0');
	}
	var len = length === 0 ? 0 : length;
	var C;
	var isArray = IsArray(originalArray);
	if (isArray) {
		C = Get(originalArray, 'constructor');
		// TODO: figure out how to make a cross-realm normal Array, a same-realm Array
		// if (IsConstructor(C)) {
		// 	if C is another realm's Array, C = undefined
		// 	Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?
		// }
		if ($species && Type(C) === 'Object') {
			C = Get(C, $species);
			if (C === null) {
				C = void 0;
			}
		}
	}
	if (typeof C === 'undefined') {
		return $Array(len);
	}
	if (!IsConstructor(C)) {
		throw new $TypeError('C must be a constructor');
	}
	return new C(len); // Construct(C, len);
};

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
// var $BigInt = GetIntrinsic('%BigInt%', true);
// var $pow = GetIntrinsic('%Math.pow%');

// var BinaryAnd = require('./BinaryAnd');
// var BinaryOr = require('./BinaryOr');
// var BinaryXor = require('./BinaryXor');
var Type = require('./Type');
// var modulo = require('./modulo');

// var zero = $BigInt && $BigInt(0);
// var negOne = $BigInt && $BigInt(-1);
// var two = $BigInt && $BigInt(2);

// https://262.ecma-international.org/11.0/#sec-bigintbitwiseop

module.exports = function BigIntBitwiseOp(op, x, y) {
	if (op !== '&' && op !== '|' && op !== '^') {
		throw new $TypeError('Assertion failed: `op` must be `&`, `|`, or `^`');
	}
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('`x` and `y` must be BigInts');
	}

	if (op === '&') {
		return x & y;
	}
	if (op === '|') {
		return x | y;
	}
	return x ^ y;
	/*
	var result = zero;
	var shift = 0;
	while (x !== zero && x !== negOne && y !== zero && y !== negOne) {
		var xDigit = modulo(x, two);
		var yDigit = modulo(y, two);
		if (op === '&') {
			result += $pow(2, shift) * BinaryAnd(xDigit, yDigit);
		} else if (op === '|') {
			result += $pow(2, shift) * BinaryOr(xDigit, yDigit);
		} else if (op === '^') {
			result += $pow(2, shift) * BinaryXor(xDigit, yDigit);
		}
		shift += 1;
		x = (x - xDigit) / two;
		y = (y - yDigit) / two;
	}
	var tmp;
	if (op === '&') {
		tmp = BinaryAnd(modulo(x, two), modulo(y, two));
	} else if (op === '|') {
		tmp = BinaryAnd(modulo(x, two), modulo(y, two));
	} else {
		tmp = BinaryXor(modulo(x, two), modulo(y, two));
	}
	if (tmp !== 0) {
		result -= $pow(2, shift);
	}
	return result;
	*/
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

// https://262.ecma-international.org/11.0/#sec-binaryand

module.exports = function BinaryAnd(x, y) {
	if ((x !== 0 && x !== 1) || (y !== 0 && y !== 1)) {
		throw new $TypeError('Assertion failed: `x` and `y` must be either 0 or 1');
	}
	return x & y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

// https://262.ecma-international.org/11.0/#sec-binaryor

module.exports = function BinaryOr(x, y) {
	if ((x !== 0 && x !== 1) || (y !== 0 && y !== 1)) {
		throw new $TypeError('Assertion failed: `x` and `y` must be either 0 or 1');
	}
	return x | y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

// https://262.ecma-international.org/11.0/#sec-binaryxor

module.exports = function BinaryXor(x, y) {
	if ((x !== 0 && x !== 1) || (y !== 0 && y !== 1)) {
		throw new $TypeError('Assertion failed: `x` and `y` must be either 0 or 1');
	}
	return x ^ y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');

var IsArray = require('./IsArray');

var $apply = GetIntrinsic('%Reflect.apply%', true) || callBound('%Function.prototype.apply%');

// https://ecma-international.org/ecma-262/6.0/#sec-call

module.exports = function Call(F, V) {
	var argumentsList = arguments.length > 2 ? arguments[2] : [];
	if (!IsArray(argumentsList)) {
		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
	}
	return $apply(F, V, argumentsList);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var SameValue = require('./SameValue');
var ToNumber = require('./ToNumber');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring

module.exports = function CanonicalNumericIndexString(argument) {
	if (Type(argument) !== 'String') {
		throw new $TypeError('Assertion failed: `argument` must be a String');
	}
	if (argument === '-0') { return -0; }
	var n = ToNumber(argument);
	if (SameValue(ToString(n), argument)) { return n; }
	return void 0;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $fromCharCode = GetIntrinsic('%String.fromCharCode%');
var $TypeError = GetIntrinsic('%TypeError%');
var $charCodeAt = callBound('%String.prototype.charCodeAt%');
var $push = callBound('%Array.prototype.push%');

module.exports = function CharacterRange(A, B) {
	if (A.length !== 1 || B.length !== 1) {
		throw new $TypeError('Assertion failed: CharSets A and B contain exactly one character');
	}

	var a = A[0];
	var b = B[0];

	var i = $charCodeAt(a, 0);
	var j = $charCodeAt(b, 0);

	if (!(i <= j)) {
		throw new $TypeError('Assertion failed: i is not <= j');
	}

	var arr = [];
	for (var k = i; k <= j; k += 1) {
		$push(arr, $fromCharCode(k));
	}
	return arr;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var callBound = require('call-bind/callBound');
var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');

var Type = require('./Type');
var UTF16DecodeSurrogatePair = require('./UTF16DecodeSurrogatePair');

var $charAt = callBound('String.prototype.charAt');
var $charCodeAt = callBound('String.prototype.charCodeAt');

// https://262.ecma-international.org/11.0/#sec-codepointat

module.exports = function CodePointAt(string, position) {
	if (Type(string) !== 'String') {
		throw new $TypeError('Assertion failed: `string` must be a String');
	}
	var size = string.length;
	if (position < 0 || position >= size) {
		throw new $TypeError('Assertion failed: `position` must be >= 0, and < the length of `string`');
	}
	var first = $charCodeAt(string, position);
	var cp = $charAt(string, position);
	var firstIsLeading = isLeadingSurrogate(first);
	var firstIsTrailing = isTrailingSurrogate(first);
	if (!firstIsLeading && !firstIsTrailing) {
		return {
			'[[CodePoint]]': cp,
			'[[CodeUnitCount]]': 1,
			'[[IsUnpairedSurrogate]]': false
		};
	}
	if (firstIsTrailing || (position + 1 === size)) {
		return {
			'[[CodePoint]]': cp,
			'[[CodeUnitCount]]': 1,
			'[[IsUnpairedSurrogate]]': true
		};
	}
	var second = $charCodeAt(string, position + 1);
	if (!isTrailingSurrogate(second)) {
		return {
			'[[CodePoint]]': cp,
			'[[CodeUnitCount]]': 1,
			'[[IsUnpairedSurrogate]]': true
		};
	}

	return {
		'[[CodePoint]]': UTF16DecodeSurrogatePair(first, second),
		'[[CodeUnitCount]]': 2,
		'[[IsUnpairedSurrogate]]': false
	};
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var IsDataDescriptor = require('./IsDataDescriptor');
var IsGenericDescriptor = require('./IsGenericDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor

module.exports = function CompletePropertyDescriptor(Desc) {
	/* eslint no-param-reassign: 0 */
	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
		if (!has(Desc, '[[Value]]')) {
			Desc['[[Value]]'] = void 0;
		}
		if (!has(Desc, '[[Writable]]')) {
			Desc['[[Writable]]'] = false;
		}
	} else {
		if (!has(Desc, '[[Get]]')) {
			Desc['[[Get]]'] = void 0;
		}
		if (!has(Desc, '[[Set]]')) {
			Desc['[[Set]]'] = void 0;
		}
	}
	if (!has(Desc, '[[Enumerable]]')) {
		Desc['[[Enumerable]]'] = false;
	}
	if (!has(Desc, '[[Configurable]]')) {
		Desc['[[Configurable]]'] = false;
	}
	return Desc;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');
var forEach = require('../helpers/forEach');
var every = require('../helpers/every');
var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');

var CreateDataPropertyOrThrow = require('./CreateDataPropertyOrThrow');
var Get = require('./Get');
var IsArray = require('./IsArray');
var IsInteger = require('./IsInteger');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var ToNumber = require('./ToNumber');
var ToObject = require('./ToObject');
var Type = require('./Type');

// https://262.ecma-international.org/11.0/#sec-copydataproperties

module.exports = function CopyDataProperties(target, source, excludedItems) {
	if (Type(target) !== 'Object') {
		throw new $TypeError('Assertion failed: "target" must be an Object');
	}

	if (!IsArray(excludedItems) || !every(excludedItems, IsPropertyKey)) {
		throw new $TypeError('Assertion failed: "excludedItems" must be a List of Property Keys');
	}

	if (typeof source === 'undefined' || source === null) {
		return target;
	}

	var from = ToObject(source);

	var sourceKeys = OwnPropertyKeys(from);
	forEach(sourceKeys, function (nextKey) {
		var excluded = false;

		forEach(excludedItems, function (e) {
			if (SameValue(e, nextKey) === true) {
				excluded = true;
			}
		});

		var enumerable = $isEnumerable(from, nextKey) || (
		// this is to handle string keys being non-enumerable in older engines
			typeof source === 'string'
			&& nextKey >= 0
			&& IsInteger(ToNumber(nextKey))
		);
		if (excluded === false && enumerable) {
			var propValue = Get(from, nextKey);
			CreateDataPropertyOrThrow(target, nextKey, propValue);
		}
	});

	return target;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createdataproperty

module.exports = function CreateDataProperty(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	var oldDesc = OrdinaryGetOwnProperty(O, P);
	var extensible = !oldDesc || IsExtensible(O);
	var nonConfigurable = oldDesc && !oldDesc['[[Configurable]]'];
	if (nonConfigurable || !extensible) {
		return false;
	}
	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		{
			'[[Configurable]]': true,
			'[[Enumerable]]': true,
			'[[Value]]': V,
			'[[Writable]]': true
		}
	);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var CreateDataProperty = require('./CreateDataProperty');
var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// // https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow

module.exports = function CreateDataPropertyOrThrow(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	var success = CreateDataProperty(O, P, V);
	if (!success) {
		throw new $TypeError('unable to create data property');
	}
	return success;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $replace = callBound('String.prototype.replace');

var RequireObjectCoercible = require('./RequireObjectCoercible');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createhtml

module.exports = function CreateHTML(string, tag, attribute, value) {
	if (Type(tag) !== 'String' || Type(attribute) !== 'String') {
		throw new $TypeError('Assertion failed: `tag` and `attribute` must be strings');
	}
	var str = RequireObjectCoercible(string);
	var S = ToString(str);
	var p1 = '<' + tag;
	if (attribute !== '') {
		var V = ToString(value);
		var escapedV = $replace(V, /\x22/g, '&quot;');
		p1 += '\x20' + attribute + '\x3D\x22' + escapedV + '\x22';
	}
	return p1 + '>' + S + '</' + tag + '>';
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject

module.exports = function CreateIterResultObject(value, done) {
	if (Type(done) !== 'Boolean') {
		throw new $TypeError('Assertion failed: Type(done) is not Boolean');
	}
	return {
		value: value,
		done: done
	};
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');
var $indexOf = callBound('Array.prototype.indexOf', true) || callBound('String.prototype.indexOf');
var $push = callBound('Array.prototype.push');

var Get = require('./Get');
var IsArray = require('./IsArray');
var LengthOfArrayLike = require('./LengthOfArrayLike');
var ToString = require('./ToString');
var Type = require('./Type');

// https://262.ecma-international.org/11.0/#sec-createlistfromarraylike

module.exports = function CreateListFromArrayLike(obj) {
	var elementTypes = arguments.length > 1
		? arguments[1]
		: ['Undefined', 'Null', 'Boolean', 'String', 'Symbol', 'Number', 'Object'];

	if (Type(obj) !== 'Object') {
		throw new $TypeError('Assertion failed: `obj` must be an Object');
	}
	if (!IsArray(elementTypes)) {
		throw new $TypeError('Assertion failed: `elementTypes`, if provided, must be an array');
	}
	var len = LengthOfArrayLike(obj);
	var list = [];
	var index = 0;
	while (index < len) {
		var indexName = ToString(index);
		var next = Get(obj, indexName);
		var nextType = Type(next);
		if ($indexOf(elementTypes, nextType) < 0) {
			throw new $TypeError('item type ' + nextType + ' is not a valid elementType');
		}
		$push(list, next);
		index += 1;
	}
	return list;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createmethodproperty

module.exports = function CreateMethodProperty(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	var newDesc = {
		'[[Configurable]]': true,
		'[[Enumerable]]': false,
		'[[Value]]': V,
		'[[Writable]]': true
	};
	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		newDesc
	);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var hasSymbols = require('has-symbols')();

var $TypeError = GetIntrinsic('%TypeError%');
var IteratorPrototype = GetIntrinsic('%IteratorPrototype%', true);
var $defineProperty = GetIntrinsic('%Object.defineProperty%', true);

var AdvanceStringIndex = require('./AdvanceStringIndex');
var CreateIterResultObject = require('./CreateIterResultObject');
var CreateMethodProperty = require('./CreateMethodProperty');
var Get = require('./Get');
var OrdinaryObjectCreate = require('./OrdinaryObjectCreate');
var RegExpExec = require('./RegExpExec');
var Set = require('./Set');
var ToLength = require('./ToLength');
var ToString = require('./ToString');
var Type = require('./Type');

var SLOT = require('internal-slot');

var RegExpStringIterator = function RegExpStringIterator(R, S, global, fullUnicode) {
	if (Type(S) !== 'String') {
		throw new $TypeError('`S` must be a string');
	}
	if (Type(global) !== 'Boolean') {
		throw new $TypeError('`global` must be a boolean');
	}
	if (Type(fullUnicode) !== 'Boolean') {
		throw new $TypeError('`fullUnicode` must be a boolean');
	}
	SLOT.set(this, '[[IteratingRegExp]]', R);
	SLOT.set(this, '[[IteratedString]]', S);
	SLOT.set(this, '[[Global]]', global);
	SLOT.set(this, '[[Unicode]]', fullUnicode);
	SLOT.set(this, '[[Done]]', false);
};

if (IteratorPrototype) {
	RegExpStringIterator.prototype = OrdinaryObjectCreate(IteratorPrototype);
}

var RegExpStringIteratorNext = function next() {
	var O = this; // eslint-disable-line no-invalid-this
	if (Type(O) !== 'Object') {
		throw new $TypeError('receiver must be an object');
	}
	if (
		!(O instanceof RegExpStringIterator)
		|| !SLOT.has(O, '[[IteratingRegExp]]')
		|| !SLOT.has(O, '[[IteratedString]]')
		|| !SLOT.has(O, '[[Global]]')
		|| !SLOT.has(O, '[[Unicode]]')
		|| !SLOT.has(O, '[[Done]]')
	) {
		throw new $TypeError('"this" value must be a RegExpStringIterator instance');
	}
	if (SLOT.get(O, '[[Done]]')) {
		return CreateIterResultObject(undefined, true);
	}
	var R = SLOT.get(O, '[[IteratingRegExp]]');
	var S = SLOT.get(O, '[[IteratedString]]');
	var global = SLOT.get(O, '[[Global]]');
	var fullUnicode = SLOT.get(O, '[[Unicode]]');
	var match = RegExpExec(R, S);
	if (match === null) {
		SLOT.set(O, '[[Done]]', true);
		return CreateIterResultObject(undefined, true);
	}
	if (global) {
		var matchStr = ToString(Get(match, '0'));
		if (matchStr === '') {
			var thisIndex = ToLength(Get(R, 'lastIndex'));
			var nextIndex = AdvanceStringIndex(S, thisIndex, fullUnicode);
			Set(R, 'lastIndex', nextIndex, true);
		}
		return CreateIterResultObject(match, false);
	}
	SLOT.set(O, '[[Done]]', true);
	return CreateIterResultObject(match, false);
};
CreateMethodProperty(RegExpStringIterator.prototype, 'next', RegExpStringIteratorNext);

if (hasSymbols) {
	if (Symbol.toStringTag) {
		if ($defineProperty) {
			$defineProperty(RegExpStringIterator.prototype, Symbol.toStringTag, {
				configurable: true,
				enumerable: false,
				value: 'RegExp String Iterator',
				writable: false
			});
		} else {
			RegExpStringIterator.prototype[Symbol.toStringTag] = 'RegExp String Iterator';
		}
	}

	if (Symbol.iterator && typeof RegExpStringIterator.prototype[Symbol.iterator] !== 'function') {
		var iteratorFn = function SymbolIterator() {
			return this;
		};
		CreateMethodProperty(RegExpStringIterator.prototype, Symbol.iterator, iteratorFn);
	}
}

// https://262.ecma-international.org/11.0/#sec-createregexpstringiterator
module.exports = function CreateRegExpStringIterator(R, S, global, fullUnicode) {
	// assert R.global === global && R.unicode === fullUnicode?
	return new RegExpStringIterator(R, S, global, fullUnicode);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');
var MonthFromTime = require('./MonthFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.5

module.exports = function DateFromTime(t) {
	var m = MonthFromTime(t);
	var d = DayWithinYear(t);
	if (m === 0) {
		return d + 1;
	}
	if (m === 1) {
		return d - 30;
	}
	var leap = InLeapYear(t);
	if (m === 2) {
		return d - 58 - leap;
	}
	if (m === 3) {
		return d - 89 - leap;
	}
	if (m === 4) {
		return d - 119 - leap;
	}
	if (m === 5) {
		return d - 150 - leap;
	}
	if (m === 6) {
		return d - 180 - leap;
	}
	if (m === 7) {
		return d - 211 - leap;
	}
	if (m === 8) {
		return d - 242 - leap;
	}
	if (m === 9) {
		return d - 272 - leap;
	}
	if (m === 10) {
		return d - 303 - leap;
	}
	if (m === 11) {
		return d - 333 - leap;
	}
	throw new $EvalError('Assertion failed: MonthFromTime returned an impossible value: ' + m);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var weekdays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];

var $isNaN = require('../helpers/isNaN');
var padTimeComponent = require('../helpers/padTimeComponent');

var Type = require('./Type');
var WeekDay = require('./WeekDay');
var MonthFromTime = require('./MonthFromTime');
var YearFromTime = require('./YearFromTime');
var DateFromTime = require('./DateFromTime');

// https://262.ecma-international.org/9.0/#sec-datestring

module.exports = function DateString(tv) {
	if (Type(tv) !== 'Number' || $isNaN(tv)) {
		throw new $TypeError('Assertion failed: `tv` must be a non-NaN Number');
	}
	var weekday = weekdays[WeekDay(tv)];
	var month = months[MonthFromTime(tv)];
	var day = padTimeComponent(DateFromTime(tv));
	var year = padTimeComponent(YearFromTime(tv), 4);
	return weekday + '\x20' + month + '\x20' + day + '\x20' + year;
};
'use strict';

var floor = require('./floor');

var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.2

module.exports = function Day(t) {
	return floor(t / msPerDay);
};
'use strict';

var floor = require('./floor');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function DayFromYear(y) {
	return (365 * (y - 1970)) + floor((y - 1969) / 4) - floor((y - 1901) / 100) + floor((y - 1601) / 400);
};

'use strict';

var Day = require('./Day');
var DayFromYear = require('./DayFromYear');
var YearFromTime = require('./YearFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.4

module.exports = function DayWithinYear(t) {
	return Day(t) - DayFromYear(YearFromTime(t));
};
'use strict';

var modulo = require('./modulo');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function DaysInYear(y) {
	if (modulo(y, 4) !== 0) {
		return 365;
	}
	if (modulo(y, 100) !== 0) {
		return 366;
	}
	if (modulo(y, 400) !== 0) {
		return 365;
	}
	return 366;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow

module.exports = function DefinePropertyOrThrow(O, P, desc) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	var Desc = isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, desc) ? desc : ToPropertyDescriptor(desc);
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc is not a valid Property Descriptor');
	}

	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		Desc
	);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-deletepropertyorthrow

module.exports = function DeletePropertyOrThrow(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// eslint-disable-next-line no-param-reassign
	var success = delete O[P];
	if (!success) {
		throw new $TypeError('Attempt to delete property failed.');
	}
	return success;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var objectKeys = require('object-keys');

var callBound = require('call-bind/callBound');

var callBind = require('call-bind');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
var $pushApply = callBind.apply(GetIntrinsic('%Array.prototype.push%'));

var forEach = require('../helpers/forEach');

var Type = require('./Type');

// https://262.ecma-international.org/8.0/#sec-enumerableownproperties

module.exports = function EnumerableOwnPropertyNames(O, kind) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	var keys = objectKeys(O);
	if (kind === 'key') {
		return keys;
	}
	if (kind === 'value' || kind === 'key+value') {
		var results = [];
		forEach(keys, function (key) {
			if ($isEnumerable(O, key)) {
				$pushApply(results, [
					kind === 'value' ? O[key] : [key, O[key]]
				]);
			}
		});
		return results;
	}
	throw new $TypeError('Assertion failed: "kind" is not "key", "value", or "key+value": ' + kind);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');

var Call = require('./Call');
var CreateDataPropertyOrThrow = require('./CreateDataPropertyOrThrow');
var Get = require('./Get');
var HasProperty = require('./HasProperty');
var IsArray = require('./IsArray');
var LengthOfArrayLike = require('./LengthOfArrayLike');
var ToString = require('./ToString');

// https://262.ecma-international.org/11.0/#sec-flattenintoarray

// eslint-disable-next-line max-params
module.exports = function FlattenIntoArray(target, source, sourceLen, start, depth) {
	var mapperFunction;
	if (arguments.length > 5) {
		mapperFunction = arguments[5];
	}

	var targetIndex = start;
	var sourceIndex = 0;
	while (sourceIndex < sourceLen) {
		var P = ToString(sourceIndex);
		var exists = HasProperty(source, P);
		if (exists === true) {
			var element = Get(source, P);
			if (typeof mapperFunction !== 'undefined') {
				if (arguments.length <= 6) {
					throw new $TypeError('Assertion failed: thisArg is required when mapperFunction is provided');
				}
				element = Call(mapperFunction, arguments[6], [element, sourceIndex, source]);
			}
			var shouldFlatten = false;
			if (depth > 0) {
				shouldFlatten = IsArray(element);
			}
			if (shouldFlatten) {
				var elementLen = LengthOfArrayLike(element);
				targetIndex = FlattenIntoArray(target, element, elementLen, targetIndex, depth - 1);
			} else {
				if (targetIndex >= MAX_SAFE_INTEGER) {
					throw new $TypeError('index too large');
				}
				CreateDataPropertyOrThrow(target, ToString(targetIndex), element);
				targetIndex += 1;
			}
		}
		sourceIndex += 1;
	}

	return targetIndex;
};
'use strict';

var assertRecord = require('../helpers/assertRecord');
var fromPropertyDescriptor = require('../helpers/fromPropertyDescriptor');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-frompropertydescriptor

module.exports = function FromPropertyDescriptor(Desc) {
	if (typeof Desc !== 'undefined') {
		assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
	}

	return fromPropertyDescriptor(Desc);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var inspect = require('object-inspect');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-get-o-p

module.exports = function Get(O, P) {
	// 7.3.1.1
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	// 7.3.1.2
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true, got ' + inspect(P));
	}
	// 7.3.1.3
	return O[P];
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $asyncIterator = GetIntrinsic('%Symbol.asyncIterator%', true);

var inspect = require('object-inspect');
var hasSymbols = require('has-symbols')();

var getIteratorMethod = require('../helpers/getIteratorMethod');
var AdvanceStringIndex = require('./AdvanceStringIndex');
var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsArray = require('./IsArray');
var Type = require('./Type');

// https://262.ecma-international.org/9.0/#sec-getiterator
module.exports = function GetIterator(obj, hint, method) {
	var actualHint = hint;
	if (arguments.length < 2) {
		actualHint = 'sync';
	}
	if (actualHint !== 'sync' && actualHint !== 'async') {
		throw new $TypeError("Assertion failed: `hint` must be one of 'sync' or 'async', got " + inspect(hint));
	}

	var actualMethod = method;
	if (arguments.length < 3) {
		if (actualHint === 'async') {
			if (hasSymbols && $asyncIterator) {
				actualMethod = GetMethod(obj, $asyncIterator);
			}
			if (actualMethod === undefined) {
				throw new $TypeError("async from sync iterators aren't currently supported");
			}
		} else {
			actualMethod = getIteratorMethod(
				{
					AdvanceStringIndex: AdvanceStringIndex,
					GetMethod: GetMethod,
					IsArray: IsArray
				},
				obj
			);
		}
	}
	var iterator = Call(actualMethod, obj);
	if (Type(iterator) !== 'Object') {
		throw new $TypeError('iterator must return an object');
	}

	return iterator;

	// TODO: This should return an IteratorRecord
	/*
	var nextMethod = GetV(iterator, 'next');
	return {
		'[[Iterator]]': iterator,
		'[[NextMethod]]': nextMethod,
		'[[Done]]': false
	};
	*/
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var GetV = require('./GetV');
var IsCallable = require('./IsCallable');
var IsPropertyKey = require('./IsPropertyKey');

// https://ecma-international.org/ecma-262/6.0/#sec-getmethod

module.exports = function GetMethod(O, P) {
	// 7.3.9.1
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// 7.3.9.2
	var func = GetV(O, P);

	// 7.3.9.4
	if (func == null) {
		return void 0;
	}

	// 7.3.9.5
	if (!IsCallable(func)) {
		throw new $TypeError(P + 'is not a function');
	}

	// 7.3.9.6
	return func;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var hasSymbols = require('has-symbols')();

var $TypeError = GetIntrinsic('%TypeError%');

var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%', true);
var $gOPS = hasSymbols && GetIntrinsic('%Object.getOwnPropertySymbols%', true);
var keys = require('object-keys');

var esType = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getownpropertykeys

module.exports = function GetOwnPropertyKeys(O, Type) {
	if (esType(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (Type === 'Symbol') {
		return $gOPS ? $gOPS(O) : [];
	}
	if (Type === 'String') {
		if (!$gOPN) {
			return keys(O);
		}
		return $gOPN(O);
	}
	throw new $TypeError('Assertion failed: `Type` must be `"String"` or `"Symbol"`');
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Function = GetIntrinsic('%Function%');
var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsConstructor = require('./IsConstructor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getprototypefromconstructor

module.exports = function GetPrototypeFromConstructor(constructor, intrinsicDefaultProto) {
	var intrinsic = GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
	if (!IsConstructor(constructor)) {
		throw new $TypeError('Assertion failed: `constructor` must be a constructor');
	}
	var proto = Get(constructor, 'prototype');
	if (Type(proto) !== 'Object') {
		if (!(constructor instanceof $Function)) {
			// ignore other realms, for now
			throw new $TypeError('cross-realm constructors not currently supported');
		}
		proto = intrinsic;
	}
	return proto;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');
var regexTester = require('../helpers/regexTester');
var every = require('../helpers/every');

var $charAt = callBound('String.prototype.charAt');
var $strSlice = callBound('String.prototype.slice');
var $indexOf = callBound('String.prototype.indexOf');
var $parseInt = parseInt;

var isDigit = regexTester(/^[0-9]$/);

var inspect = require('object-inspect');

var Get = require('./Get');
var IsArray = require('./IsArray');
var IsInteger = require('./IsInteger');
var ToObject = require('./ToObject');
var ToString = require('./ToString');
var Type = require('./Type');

var canDistinguishSparseFromUndefined = 0 in [undefined]; // IE 6 - 8 have a bug where this returns false

var isStringOrHole = function (capture, index, arr) {
	return Type(capture) === 'String' || (canDistinguishSparseFromUndefined ? !(index in arr) : Type(capture) === 'Undefined');
};

// http://262.ecma-international.org/9.0/#sec-getsubstitution

// eslint-disable-next-line max-statements, max-params, max-lines-per-function
module.exports = function GetSubstitution(matched, str, position, captures, namedCaptures, replacement) {
	if (Type(matched) !== 'String') {
		throw new $TypeError('Assertion failed: `matched` must be a String');
	}
	var matchLength = matched.length;

	if (Type(str) !== 'String') {
		throw new $TypeError('Assertion failed: `str` must be a String');
	}
	var stringLength = str.length;

	if (!IsInteger(position) || position < 0 || position > stringLength) {
		throw new $TypeError('Assertion failed: `position` must be a nonnegative integer, and less than or equal to the length of `string`, got ' + inspect(position));
	}

	if (!IsArray(captures) || !every(captures, isStringOrHole)) {
		throw new $TypeError('Assertion failed: `captures` must be a List of Strings, got ' + inspect(captures));
	}

	if (Type(replacement) !== 'String') {
		throw new $TypeError('Assertion failed: `replacement` must be a String');
	}

	var tailPos = position + matchLength;
	var m = captures.length;
	if (Type(namedCaptures) !== 'Undefined') {
		namedCaptures = ToObject(namedCaptures); // eslint-disable-line no-param-reassign
	}

	var result = '';
	for (var i = 0; i < replacement.length; i += 1) {
		// if this is a $, and it's not the end of the replacement
		var current = $charAt(replacement, i);
		var isLast = (i + 1) >= replacement.length;
		var nextIsLast = (i + 2) >= replacement.length;
		if (current === '$' && !isLast) {
			var next = $charAt(replacement, i + 1);
			if (next === '$') {
				result += '$';
				i += 1;
			} else if (next === '&') {
				result += matched;
				i += 1;
			} else if (next === '`') {
				result += position === 0 ? '' : $strSlice(str, 0, position - 1);
				i += 1;
			} else if (next === "'") {
				result += tailPos >= stringLength ? '' : $strSlice(str, tailPos);
				i += 1;
			} else {
				var nextNext = nextIsLast ? null : $charAt(replacement, i + 2);
				if (isDigit(next) && next !== '0' && (nextIsLast || !isDigit(nextNext))) {
					// $1 through $9, and not followed by a digit
					var n = $parseInt(next, 10);
					// if (n > m, impl-defined)
					result += n <= m && Type(captures[n - 1]) === 'Undefined' ? '' : captures[n - 1];
					i += 1;
				} else if (isDigit(next) && (nextIsLast || isDigit(nextNext))) {
					// $00 through $99
					var nn = next + nextNext;
					var nnI = $parseInt(nn, 10) - 1;
					// if nn === '00' or nn > m, impl-defined
					result += nn <= m && Type(captures[nnI]) === 'Undefined' ? '' : captures[nnI];
					i += 2;
				} else if (next === '<') {
					// eslint-disable-next-line max-depth
					if (Type(namedCaptures) === 'Undefined') {
						result += '$<';
						i += 2;
					} else {
						var endIndex = $indexOf(replacement, '>', i);
						// eslint-disable-next-line max-depth
						if (endIndex > -1) {
							var groupName = $strSlice(replacement, i + '$<'.length, endIndex);
							var capture = Get(namedCaptures, groupName);
							// eslint-disable-next-line max-depth
							if (Type(capture) !== 'Undefined') {
								result += ToString(capture);
							}
							i += ('<' + groupName + '>').length;
						}
					}
				} else {
					result += '$';
				}
			}
		} else {
			// the final $, or else not a $
			result += $charAt(replacement, i);
		}
	}
	return result;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var ToObject = require('./ToObject');

// https://ecma-international.org/ecma-262/6.0/#sec-getv

module.exports = function GetV(V, P) {
	// 7.3.2.1
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// 7.3.2.2-3
	var O = ToObject(V);

	// 7.3.2.4
	return O[P];
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var has = require('has');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty

module.exports = function HasOwnProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	return has(O, P);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-hasproperty

module.exports = function HasProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	return P in O;
};
'use strict';

var floor = require('./floor');
var modulo = require('./modulo');

var timeConstants = require('../helpers/timeConstants');
var msPerHour = timeConstants.msPerHour;
var HoursPerDay = timeConstants.HoursPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function HourFromTime(t) {
	return modulo(floor(t / msPerHour), HoursPerDay);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DaysInYear = require('./DaysInYear');
var YearFromTime = require('./YearFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function InLeapYear(t) {
	var days = DaysInYear(YearFromTime(t));
	if (days === 365) {
		return 0;
	}
	if (days === 366) {
		return 1;
	}
	throw new $EvalError('Assertion failed: there are not 365 or 366 days in a year, got: ' + days);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $hasInstance = GetIntrinsic('Symbol.hasInstance', true);

var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsCallable = require('./IsCallable');
var OrdinaryHasInstance = require('./OrdinaryHasInstance');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-instanceofoperator

module.exports = function InstanceofOperator(O, C) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	var instOfHandler = $hasInstance ? GetMethod(C, $hasInstance) : void 0;
	if (typeof instOfHandler !== 'undefined') {
		return ToBoolean(Call(instOfHandler, C, [O]));
	}
	if (!IsCallable(C)) {
		throw new $TypeError('`C` is not Callable');
	}
	return OrdinaryHasInstance(C, O);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var IsArray = require('./IsArray');
var GetV = require('./GetV');
var IsPropertyKey = require('./IsPropertyKey');

// https://ecma-international.org/ecma-262/6.0/#sec-invoke

module.exports = function Invoke(O, P) {
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	var argumentsList = arguments.length > 2 ? arguments[2] : [];
	if (!IsArray(argumentsList)) {
		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
	}
	var func = GetV(O, P);
	return Call(func, O, argumentsList);
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isaccessordescriptor

module.exports = function IsAccessorDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Get]]') && !has(Desc, '[[Set]]')) {
		return false;
	}

	return true;
};
'use strict';

// https://ecma-international.org/ecma-262/6.0/#sec-isarray
module.exports = require('../helpers/IsArray');
'use strict';

// https://262.ecma-international.org/11.0/#sec-isbigintelementtype

module.exports = function IsBigIntElementType(type) {
	return type === 'BigUint64' || type === 'BigInt64';
};
'use strict';

// http://262.ecma-international.org/5.1/#sec-9.11

module.exports = require('is-callable');
'use strict';

var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');

// https://262.ecma-international.org/6.0/#sec-iscompatiblepropertydescriptor

module.exports = function IsCompatiblePropertyDescriptor(Extensible, Desc, Current) {
	return ValidateAndApplyPropertyDescriptor(undefined, undefined, Extensible, Desc, Current);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $isConcatSpreadable = GetIntrinsic('%Symbol.isConcatSpreadable%', true);

var Get = require('./Get');
var IsArray = require('./IsArray');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable

module.exports = function IsConcatSpreadable(O) {
	if (Type(O) !== 'Object') {
		return false;
	}
	if ($isConcatSpreadable) {
		var spreadable = Get(O, $isConcatSpreadable);
		if (typeof spreadable !== 'undefined') {
			return ToBoolean(spreadable);
		}
	}
	return IsArray(O);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic.js');

var $construct = GetIntrinsic('%Reflect.construct%', true);

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
try {
	DefinePropertyOrThrow({}, '', { '[[Get]]': function () {} });
} catch (e) {
	// Accessor properties aren't supported
	DefinePropertyOrThrow = null;
}

// https://ecma-international.org/ecma-262/6.0/#sec-isconstructor

if (DefinePropertyOrThrow && $construct) {
	var isConstructorMarker = {};
	var badArrayLike = {};
	DefinePropertyOrThrow(badArrayLike, 'length', {
		'[[Get]]': function () {
			throw isConstructorMarker;
		},
		'[[Enumerable]]': true
	});

	module.exports = function IsConstructor(argument) {
		try {
			// `Reflect.construct` invokes `IsConstructor(target)` before `Get(args, 'length')`:
			$construct(argument, badArrayLike);
		} catch (err) {
			return err === isConstructorMarker;
		}
	};
} else {
	module.exports = function IsConstructor(argument) {
		// unfortunately there's no way to truly check this without try/catch `new argument` in old environments
		return typeof argument === 'function' && !!argument.prototype;
	};
}
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isdatadescriptor

module.exports = function IsDataDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Value]]') && !has(Desc, '[[Writable]]')) {
		return false;
	}

	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $preventExtensions = GetIntrinsic('%Object.preventExtensions%', true);
var $isExtensible = GetIntrinsic('%Object.isExtensible%', true);

var isPrimitive = require('../helpers/isPrimitive');

// https://ecma-international.org/ecma-262/6.0/#sec-isextensible-o

module.exports = $preventExtensions
	? function IsExtensible(obj) {
		return !isPrimitive(obj) && $isExtensible(obj);
	}
	: function IsExtensible(obj) {
		return !isPrimitive(obj);
	};
'use strict';

var assertRecord = require('../helpers/assertRecord');

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isgenericdescriptor

module.exports = function IsGenericDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!IsAccessorDescriptor(Desc) && !IsDataDescriptor(Desc)) {
		return true;
	}

	return false;
};
'use strict';

var abs = require('./abs');
var floor = require('./floor');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');

// https://ecma-international.org/ecma-262/6.0/#sec-isinteger

module.exports = function IsInteger(argument) {
	if (typeof argument !== 'number' || $isNaN(argument) || !$isFinite(argument)) {
		return false;
	}
	var absValue = abs(argument);
	return floor(absValue) === absValue;
};
'use strict';

var IsUnclampedIntegerElementType = require('./IsUnclampedIntegerElementType');
var IsBigIntElementType = require('./IsBigIntElementType');

// https://262.ecma-international.org/11.0/#sec-isnotearconfiguration

module.exports = function IsNoTearConfiguration(type, order) {
	if (IsUnclampedIntegerElementType(type)) {
		return true;
	}
	if (IsBigIntElementType(type) && order !== 'Init' && order !== 'Unordered') {
		return true;
	}
	return false;
};
'use strict';

var IsInteger = require('./IsInteger');

// https://262.ecma-international.org/11.0/#sec-isnonnegativeinteger

module.exports = function IsNonNegativeInteger(argument) {
	return !!IsInteger(argument) && argument >= 0;
};
'use strict';

var callBound = require('call-bind/callBound');

var $PromiseThen = callBound('Promise.prototype.then', true);

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ispromise

module.exports = function IsPromise(x) {
	if (Type(x) !== 'Object') {
		return false;
	}
	if (!$PromiseThen) { // Promises are not supported
		return false;
	}
	try {
		$PromiseThen(x); // throws if not a promise
	} catch (e) {
		return false;
	}
	return true;
};
'use strict';

// https://ecma-international.org/ecma-262/6.0/#sec-ispropertykey

module.exports = function IsPropertyKey(argument) {
	return typeof argument === 'string' || typeof argument === 'symbol';
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $match = GetIntrinsic('%Symbol.match%', true);

var hasRegExpMatcher = require('is-regex');

var ToBoolean = require('./ToBoolean');

// https://ecma-international.org/ecma-262/6.0/#sec-isregexp

module.exports = function IsRegExp(argument) {
	if (!argument || typeof argument !== 'object') {
		return false;
	}
	if ($match) {
		var isRegExp = argument[$match];
		if (typeof isRegExp !== 'undefined') {
			return ToBoolean(isRegExp);
		}
	}
	return hasRegExpMatcher(argument);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');

var isSharedArrayBuffer = require('is-shared-array-buffer');

// https://262.ecma-international.org/8.0/#sec-issharedarraybuffer

module.exports = function IsSharedArrayBuffer(obj) {
	if (Type(obj) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	return isSharedArrayBuffer(obj);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isPrefixOf = require('../helpers/isPrefixOf');

// var callBound = require('call-bind/callBound');

// var $charAt = callBound('String.prototype.charAt');

var Type = require('./Type');

// https://262.ecma-international.org/9.0/#sec-isstringprefix

module.exports = function IsStringPrefix(p, q) {
	if (Type(p) !== 'String') {
		throw new $TypeError('Assertion failed: "p" must be a String');
	}

	if (Type(q) !== 'String') {
		throw new $TypeError('Assertion failed: "q" must be a String');
	}

	return isPrefixOf(p, q);
	/*
	if (p === q || p === '') {
		return true;
	}

	var pLength = p.length;
	var qLength = q.length;
	if (pLength >= qLength) {
		return false;
	}

	// assert: pLength < qLength

	for (var i = 0; i < pLength; i += 1) {
		if ($charAt(p, i) !== $charAt(q, i)) {
			return false;
		}
	}
	return true;
	*/
};
'use strict';

// https://262.ecma-international.org/11.0/#sec-isunclampedintegerelementtype

module.exports = function IsUnclampedIntegerElementType(type) {
	return type === 'Int8'
		|| type === 'Uint8'
		|| type === 'Int16'
		|| type === 'Uint16'
		|| type === 'Int32'
		|| type === 'Uint32';
};
'use strict';

// https://262.ecma-international.org/11.0/#sec-isunsignedelementtype

module.exports = function IsUnsignedElementType(type) {
	return type === 'Uint8'
		|| type === 'Uint8C'
		|| type === 'Uint16'
		|| type === 'Uint32'
		|| type === 'BigUint64';
};
'use strict';

var callBound = require('call-bind/callBound');
var $arrayPush = callBound('Array.prototype.push');

var GetIterator = require('./GetIterator');
var IteratorStep = require('./IteratorStep');
var IteratorValue = require('./IteratorValue');

// https://262.ecma-international.org/9.0/#sec-iterabletolist

module.exports = function IterableToList(items, method) {
	var iterator = GetIterator(items, 'sync', method);
	var values = [];
	var next = true;
	while (next) {
		next = IteratorStep(iterator);
		if (next) {
			var nextValue = IteratorValue(next);
			$arrayPush(values, nextValue);
		}
	}
	return values;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose

module.exports = function IteratorClose(iterator, completion) {
	if (Type(iterator) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterator) is not Object');
	}
	if (!IsCallable(completion)) {
		throw new $TypeError('Assertion failed: completion is not a thunk for a Completion Record');
	}
	var completionThunk = completion;

	var iteratorReturn = GetMethod(iterator, 'return');

	if (typeof iteratorReturn === 'undefined') {
		return completionThunk();
	}

	var completionRecord;
	try {
		var innerResult = Call(iteratorReturn, iterator, []);
	} catch (e) {
		// if we hit here, then "e" is the innerResult completion that needs re-throwing

		// if the completion is of type "throw", this will throw.
		completionThunk();
		completionThunk = null; // ensure it's not called twice.

		// if not, then return the innerResult completion
		throw e;
	}
	completionRecord = completionThunk(); // if innerResult worked, then throw if the completion does
	completionThunk = null; // ensure it's not called twice.

	if (Type(innerResult) !== 'Object') {
		throw new $TypeError('iterator .return must return an object');
	}

	return completionRecord;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete

module.exports = function IteratorComplete(iterResult) {
	if (Type(iterResult) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
	}
	return ToBoolean(Get(iterResult, 'done'));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Invoke = require('./Invoke');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratornext

module.exports = function IteratorNext(iterator, value) {
	var result = Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);
	if (Type(result) !== 'Object') {
		throw new $TypeError('iterator next must return an object');
	}
	return result;
};
'use strict';

var IteratorComplete = require('./IteratorComplete');
var IteratorNext = require('./IteratorNext');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep

module.exports = function IteratorStep(iterator) {
	var result = IteratorNext(iterator);
	var done = IteratorComplete(result);
	return done === true ? false : result;
};

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue

module.exports = function IteratorValue(iterResult) {
	if (Type(iterResult) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
	}
	return Get(iterResult, 'value');
};

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var ToLength = require('./ToLength');
var Type = require('./Type');

// https://262.ecma-international.org/11.0/#sec-lengthofarraylike

module.exports = function LengthOfArrayLike(obj) {
	if (Type(obj) !== 'Object') {
		throw new $TypeError('Assertion failed: `obj` must be an Object');
	}
	return ToLength(Get(obj, 'length'));
};

// TODO: use this all over
'use strict';

var $isFinite = require('../helpers/isFinite');
var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.13

module.exports = function MakeDate(day, time) {
	if (!$isFinite(day) || !$isFinite(time)) {
		return NaN;
	}
	return (day * msPerDay) + time;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $DateUTC = GetIntrinsic('%Date.UTC%');

var $isFinite = require('../helpers/isFinite');

var DateFromTime = require('./DateFromTime');
var Day = require('./Day');
var floor = require('./floor');
var modulo = require('./modulo');
var MonthFromTime = require('./MonthFromTime');
var ToInteger = require('./ToInteger');
var YearFromTime = require('./YearFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.12

module.exports = function MakeDay(year, month, date) {
	if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) {
		return NaN;
	}
	var y = ToInteger(year);
	var m = ToInteger(month);
	var dt = ToInteger(date);
	var ym = y + floor(m / 12);
	var mn = modulo(m, 12);
	var t = $DateUTC(ym, mn, 1);
	if (YearFromTime(t) !== ym || MonthFromTime(t) !== mn || DateFromTime(t) !== 1) {
		return NaN;
	}
	return Day(t) + dt - 1;
};
'use strict';

var $isFinite = require('../helpers/isFinite');
var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var msPerMinute = timeConstants.msPerMinute;
var msPerHour = timeConstants.msPerHour;

var ToInteger = require('./ToInteger');

// https://262.ecma-international.org/5.1/#sec-15.9.1.11

module.exports = function MakeTime(hour, min, sec, ms) {
	if (!$isFinite(hour) || !$isFinite(min) || !$isFinite(sec) || !$isFinite(ms)) {
		return NaN;
	}
	var h = ToInteger(hour);
	var m = ToInteger(min);
	var s = ToInteger(sec);
	var milli = ToInteger(ms);
	var t = (h * msPerHour) + (m * msPerMinute) + (s * msPerSecond) + milli;
	return t;
};
'use strict';

var floor = require('./floor');
var modulo = require('./modulo');

var timeConstants = require('../helpers/timeConstants');
var msPerMinute = timeConstants.msPerMinute;
var MinutesPerHour = timeConstants.MinutesPerHour;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function MinFromTime(t) {
	return modulo(floor(t / msPerMinute), MinutesPerHour);
};
'use strict';

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');

// https://262.ecma-international.org/5.1/#sec-15.9.1.4

module.exports = function MonthFromTime(t) {
	var day = DayWithinYear(t);
	if (0 <= day && day < 31) {
		return 0;
	}
	var leap = InLeapYear(t);
	if (31 <= day && day < (59 + leap)) {
		return 1;
	}
	if ((59 + leap) <= day && day < (90 + leap)) {
		return 2;
	}
	if ((90 + leap) <= day && day < (120 + leap)) {
		return 3;
	}
	if ((120 + leap) <= day && day < (151 + leap)) {
		return 4;
	}
	if ((151 + leap) <= day && day < (181 + leap)) {
		return 5;
	}
	if ((181 + leap) <= day && day < (212 + leap)) {
		return 6;
	}
	if ((212 + leap) <= day && day < (243 + leap)) {
		return 7;
	}
	if ((243 + leap) <= day && day < (273 + leap)) {
		return 8;
	}
	if ((273 + leap) <= day && day < (304 + leap)) {
		return 9;
	}
	if ((304 + leap) <= day && day < (334 + leap)) {
		return 10;
	}
	if ((334 + leap) <= day && day < (365 + leap)) {
		return 11;
	}
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var ToInt32 = require('./ToInt32');
var ToUint32 = require('./ToUint32');
var Type = require('./Type');

// https://262.ecma-international.org/11.0/#sec-numberbitwiseop

module.exports = function NumberBitwiseOp(op, x, y) {
	if (op !== '&' && op !== '|' && op !== '^') {
		throw new $TypeError('Assertion failed: `op` must be `&`, `|`, or `^`');
	}
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}
	var lnum = ToInt32(x);
	var rnum = ToUint32(y);
	if (op === '&') {
		return lnum & rnum;
	}
	if (op === '|') {
		return lnum | rnum;
	}
	return lnum ^ rnum;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $RangeError = GetIntrinsic('%RangeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var IsInteger = require('./IsInteger');
var Type = require('./Type');

// https://262.ecma-international.org/11.0/#sec-numbertobigint

module.exports = function NumberToBigInt(number) {
	if (Type(number) !== 'Number') {
		throw new $TypeError('Assertion failed: `number` must be a String');
	}
	if (!IsInteger(number)) {
		throw new $RangeError('The number ' + number + ' cannot be converted to a BigInt because it is not an integer');
	}
	if (!$BigInt) {
		throw new $SyntaxError('BigInts are not supported in this environment');
	}
	return $BigInt(number);
};
'use strict';

var callBound = require('call-bind/callBound');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var Get = require('./Get');
var ToObject = require('./ToObject');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');

var forEach = require('../helpers/forEach');
var getOwnPropertyDescriptor = require('../helpers/getOwnPropertyDescriptor');
var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');

var $push = callBound('Array.prototype.push');

// https://262.ecma-international.org/6.0/#sec-objectdefineproperties
module.exports = function ObjectDefineProperties(O, Properties) {
	var props = ToObject(Properties); // step 1
	var keys = OwnPropertyKeys(props); // step 2
	var descriptors = []; // step 3

	forEach(keys, function (nextKey) { // step 4
		var propDesc = ToPropertyDescriptor(getOwnPropertyDescriptor(props, nextKey)); // step 4.a
		if (typeof propDesc !== 'undefined' && propDesc['[[Enumerable]]']) { // step 4.b
			var descObj = Get(props, nextKey); // step 4.b.i
			var desc = ToPropertyDescriptor(descObj); // step 4.b.ii
			$push(descriptors, [nextKey, desc]); // step 4.b.iii
		}
	});

	forEach(descriptors, function (pair) { // step 5
		var P = pair[0]; // step 5.a
		var desc = pair[1]; // step 5.b
		desc = FromPropertyDescriptor(desc); // TODO: remove this once DefinePropertyOrThrow is fixed
		DefinePropertyOrThrow(O, P, desc); // step 5.c
	});

	return O; // step 6
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var $TypeError = GetIntrinsic('%TypeError%');

var GetPrototypeFromConstructor = require('./GetPrototypeFromConstructor');
var IsArray = require('./IsArray');
var OrdinaryObjectCreate = require('./OrdinaryObjectCreate');

// https://262.ecma-international.org/6.0/#sec-ordinarycreatefromconstructor

module.exports = function OrdinaryCreateFromConstructor(constructor, intrinsicDefaultProto) {
	GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
	var proto = GetPrototypeFromConstructor(constructor, intrinsicDefaultProto);
	var slots = arguments.length < 3 ? [] : arguments[2];
	if (!IsArray(slots)) {
		throw new $TypeError('Assertion failed: if provided, `internalSlotsList` must be a List');
	}
	return OrdinaryObjectCreate(proto, slots);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var IsPropertyKey = require('./IsPropertyKey');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var SameValue = require('./SameValue');
var Type = require('./Type');
var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinarydefineownproperty

module.exports = function OrdinaryDefineOwnProperty(O, P, Desc) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (!$gOPD) {
		// ES3/IE 8 fallback
		if (IsAccessorDescriptor(Desc)) {
			throw new $SyntaxError('This environment does not support accessor property descriptors.');
		}
		var creatingNormalDataProperty = !(P in O)
			&& Desc['[[Writable]]']
			&& Desc['[[Enumerable]]']
			&& Desc['[[Configurable]]']
			&& '[[Value]]' in Desc;
		var settingExistingDataProperty = (P in O)
			&& (!('[[Configurable]]' in Desc) || Desc['[[Configurable]]'])
			&& (!('[[Enumerable]]' in Desc) || Desc['[[Enumerable]]'])
			&& (!('[[Writable]]' in Desc) || Desc['[[Writable]]'])
			&& '[[Value]]' in Desc;
		if (creatingNormalDataProperty || settingExistingDataProperty) {
			O[P] = Desc['[[Value]]']; // eslint-disable-line no-param-reassign
			return SameValue(O[P], Desc['[[Value]]']);
		}
		throw new $SyntaxError('This environment does not support defining non-writable, non-enumerable, or non-configurable properties');
	}
	var desc = $gOPD(O, P);
	var current = desc && ToPropertyDescriptor(desc);
	var extensible = IsExtensible(O);
	return ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');

var has = require('has');

var IsArray = require('./IsArray');
var IsPropertyKey = require('./IsPropertyKey');
var IsRegExp = require('./IsRegExp');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty

module.exports = function OrdinaryGetOwnProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	if (!has(O, P)) {
		return void 0;
	}
	if (!$gOPD) {
		// ES3 / IE 8 fallback
		var arrayLength = IsArray(O) && P === 'length';
		var regexLastIndex = IsRegExp(O) && P === 'lastIndex';
		return {
			'[[Configurable]]': !(arrayLength || regexLastIndex),
			'[[Enumerable]]': $isEnumerable(O, P),
			'[[Value]]': O[P],
			'[[Writable]]': true
		};
	}
	return ToPropertyDescriptor($gOPD(O, P));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $getProto = require('../helpers/getProto');

var Type = require('./Type');

// https://262.ecma-international.org/7.0/#sec-ordinarygetprototypeof

module.exports = function OrdinaryGetPrototypeOf(O) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!$getProto) {
		throw new $TypeError('This environment does not support fetching prototypes.');
	}
	return $getProto(O);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasinstance

module.exports = function OrdinaryHasInstance(C, O) {
	if (IsCallable(C) === false) {
		return false;
	}
	if (Type(O) !== 'Object') {
		return false;
	}
	var P = Get(C, 'prototype');
	if (Type(P) !== 'Object') {
		throw new $TypeError('OrdinaryHasInstance called on an object with an invalid prototype property.');
	}
	return O instanceof C;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasproperty

module.exports = function OrdinaryHasProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	return P in O;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $ObjectCreate = GetIntrinsic('%Object.create%', true);
var $TypeError = GetIntrinsic('%TypeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');

var IsArray = require('./IsArray');
var Type = require('./Type');

var hasProto = !({ __proto__: null } instanceof Object);

// https://262.ecma-international.org/6.0/#sec-objectcreate

module.exports = function OrdinaryObjectCreate(proto) {
	if (proto !== null && Type(proto) !== 'Object') {
		throw new $TypeError('Assertion failed: `proto` must be null or an object');
	}
	var additionalInternalSlotsList = arguments.length < 2 ? [] : arguments[1];
	if (!IsArray(additionalInternalSlotsList)) {
		throw new $TypeError('Assertion failed: `additionalInternalSlotsList` must be an Array');
	}
	// var internalSlotsList = ['[[Prototype]]', '[[Extensible]]'];
	if (additionalInternalSlotsList.length > 0) {
		throw new $SyntaxError('es-abstract does not yet support internal slots');
		// internalSlotsList.push(...additionalInternalSlotsList);
	}
	// var O = MakeBasicObject(internalSlotsList);
	// setProto(O, proto);
	// return O;

	if ($ObjectCreate) {
		return $ObjectCreate(proto);
	}
	if (hasProto) {
		return { __proto__: proto };
	}

	if (proto === null) {
		throw new $SyntaxError('native Object.create support is required to create null objects');
	}
	var T = function T() {};
	T.prototype = proto;
	return new T();
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $setProto = require('../helpers/setProto');

var OrdinaryGetPrototypeOf = require('./OrdinaryGetPrototypeOf');
var Type = require('./Type');

// https://262.ecma-international.org/7.0/#sec-ordinarysetprototypeof

module.exports = function OrdinarySetPrototypeOf(O, V) {
	if (Type(V) !== 'Object' && Type(V) !== 'Null') {
		throw new $TypeError('Assertion failed: V must be Object or Null');
	}
	/*
	var extensible = IsExtensible(O);
	var current = OrdinaryGetPrototypeOf(O);
	if (SameValue(V, current)) {
		return true;
	}
	if (!extensible) {
		return false;
	}
	*/
	try {
		$setProto(O, V);
	} catch (e) {
		return false;
	}
	return OrdinaryGetPrototypeOf(O) === V;
	/*
	var p = V;
	var done = false;
	while (!done) {
		if (p === null) {
			done = true;
		} else if (SameValue(p, O)) {
			return false;
		} else {
			if (wat) {
				done = true;
			} else {
				p = p.[[Prototype]];
			}
		}
	}
	O.[[Prototype]] = V;
	return true;
	*/
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

var inspect = require('object-inspect');

// https://262.ecma-international.org/8.0/#sec-ordinarytoprimitive

module.exports = function OrdinaryToPrimitive(O, hint) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (/* Type(hint) !== 'String' || */ hint !== 'string' && hint !== 'number') {
		throw new $TypeError('Assertion failed: `hint` must be "string" or "number"');
	}

	var methodNames = hint === 'string' ? ['toString', 'valueOf'] : ['valueOf', 'toString'];

	for (var i = 0; i < methodNames.length; i += 1) {
		var name = methodNames[i];
		var method = Get(O, name);
		if (IsCallable(method)) {
			var result = Call(method, O);
			if (Type(result) !== 'Object') {
				return result;
			}
		}
	}

	throw new $TypeError('No primitive value for ' + inspect(O));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBind = require('call-bind');

var $resolve = GetIntrinsic('%Promise.resolve%', true);
var $PromiseResolve = $resolve && callBind($resolve);

// https://262.ecma-international.org/9.0/#sec-promise-resolve

module.exports = function PromiseResolve(C, x) {
	if (!$PromiseResolve) {
		throw new SyntaxError('This environment does not support Promises.');
	}
	return $PromiseResolve(C, x);
};

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');
var forEach = require('../helpers/forEach');
var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');

var $charCodeAt = callBound('String.prototype.charCodeAt');

var Type = require('./Type');
var UnicodeEscape = require('./UnicodeEscape');
var UTF16Encoding = require('./UTF16Encoding');
var UTF16DecodeString = require('./UTF16DecodeString');

var has = require('has');

// https://262.ecma-international.org/11.0/#sec-quotejsonstring

var escapes = {
	'\u0008': '\\b',
	'\u0009': '\\t',
	'\u000A': '\\n',
	'\u000C': '\\f',
	'\u000D': '\\r',
	'\u0022': '\\"',
	'\u005c': '\\\\'
};

module.exports = function QuoteJSONString(value) {
	if (Type(value) !== 'String') {
		throw new $TypeError('Assertion failed: `value` must be a String');
	}
	var product = '"';
	if (value) {
		forEach(UTF16DecodeString(value), function (C) {
			if (has(escapes, C)) {
				product += escapes[C];
			} else {
				var cCharCode = $charCodeAt(C, 0);
				if (cCharCode < 0x20 || isLeadingSurrogate(C) || isTrailingSurrogate(C)) {
					product += UnicodeEscape(C);
				} else {
					product += UTF16Encoding(cCharCode);
				}
			}
		});
	}
	product += '"';
	return product;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $RegExp = GetIntrinsic('%RegExp%');

// var RegExpAlloc = require('./RegExpAlloc');
// var RegExpInitialize = require('./RegExpInitialize');
var ToString = require('./ToString');

// https://262.ecma-international.org/6.0/#sec-regexpcreate

module.exports = function RegExpCreate(P, F) {
	// var obj = RegExpAlloc($RegExp);
	// return RegExpInitialize(obj, P, F);

	// covers spec mechanics; bypass regex brand checking
	var pattern = typeof P === 'undefined' ? '' : ToString(P);
	var flags = typeof F === 'undefined' ? '' : ToString(F);
	return new $RegExp(pattern, flags);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var regexExec = require('call-bind/callBound')('RegExp.prototype.exec');

var Call = require('./Call');
var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-regexpexec

module.exports = function RegExpExec(R, S) {
	if (Type(R) !== 'Object') {
		throw new $TypeError('Assertion failed: `R` must be an Object');
	}
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	var exec = Get(R, 'exec');
	if (IsCallable(exec)) {
		var result = Call(exec, R, [S]);
		if (result === null || Type(result) === 'Object') {
			return result;
		}
		throw new $TypeError('"exec" method must return `null` or an Object');
	}
	return regexExec(R, S);
};
'use strict';

module.exports = require('../5/CheckObjectCoercible');
'use strict';

var $isNaN = require('../helpers/isNaN');

// http://262.ecma-international.org/5.1/#sec-9.12

module.exports = function SameValue(x, y) {
	if (x === y) { // 0 === -0, but they are not identical.
		if (x === 0) { return 1 / x === 1 / y; }
		return true;
	}
	return $isNaN(x) && $isNaN(y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var SameValue = require('./SameValue');
var Type = require('./Type');

// https://262.ecma-international.org/11.0/#sec-samevaluenonnumeric

module.exports = function SameValueNonNumeric(x, y) {
	var xType = Type(x);
	if (xType === 'Number' || xType === 'Bigint') {
		throw new $TypeError('Assertion failed: SameValueNonNumeric does not accept Number or BigInt values');
	}
	if (xType !== Type(y)) {
		throw new $TypeError('SameValueNonNumeric requires two non-numeric values of the same type.');
	}
	return SameValue(x, y);
};
'use strict';

var $isNaN = require('../helpers/isNaN');

// https://ecma-international.org/ecma-262/6.0/#sec-samevaluezero

module.exports = function SameValueZero(x, y) {
	return (x === y) || ($isNaN(x) && $isNaN(y));
};
'use strict';

var floor = require('./floor');
var modulo = require('./modulo');

var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var SecondsPerMinute = timeConstants.SecondsPerMinute;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function SecFromTime(t) {
	return modulo(floor(t / msPerSecond), SecondsPerMinute);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// IE 9 does not throw in strict mode when writability/configurability/extensibility is violated
var noThrowOnStrictViolation = (function () {
	try {
		delete [].length;
		return true;
	} catch (e) {
		return false;
	}
}());

// https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw

module.exports = function Set(O, P, V, Throw) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	if (Type(Throw) !== 'Boolean') {
		throw new $TypeError('Assertion failed: `Throw` must be a Boolean');
	}
	if (Throw) {
		O[P] = V; // eslint-disable-line no-param-reassign
		if (noThrowOnStrictViolation && !SameValue(O[P], V)) {
			throw new $TypeError('Attempted to assign to readonly property.');
		}
		return true;
	}
	try {
		O[P] = V; // eslint-disable-line no-param-reassign
		return noThrowOnStrictViolation ? SameValue(O[P], V) : true;
	} catch (e) {
		return false;
	}

};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var HasOwnProperty = require('./HasOwnProperty');
var IsExtensible = require('./IsExtensible');
var IsNonNegativeInteger = require('./IsNonNegativeInteger');
var Type = require('./Type');

// https://262.ecma-international.org/11.0/#sec-setfunctionlength

module.exports = function SetFunctionLength(F, length) {
	if (typeof F !== 'function' || !IsExtensible(F) || HasOwnProperty(F, 'length')) {
		throw new $TypeError('Assertion failed: `F` must be an extensible function and lack an own `length` property');
	}
	if (Type(length) !== 'Number') {
		throw new $TypeError('Assertion failed: `length` must be a Number');
	}
	if (!IsNonNegativeInteger(length)) {
		throw new $TypeError('Assertion failed: `length` must be an integer >= 0');
	}
	return DefinePropertyOrThrow(F, 'length', {
		'[[Configurable]]': true,
		'[[Enumerable]]': false,
		'[[Value]]': length,
		'[[Writable]]': false
	});
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var has = require('has');

var $TypeError = GetIntrinsic('%TypeError%');

var getSymbolDescription = require('get-symbol-description');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var IsExtensible = require('./IsExtensible');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-setfunctionname

module.exports = function SetFunctionName(F, name) {
	if (typeof F !== 'function') {
		throw new $TypeError('Assertion failed: `F` must be a function');
	}
	if (!IsExtensible(F) || has(F, 'name')) {
		throw new $TypeError('Assertion failed: `F` must be extensible, and must not have a `name` own property');
	}
	var nameType = Type(name);
	if (nameType !== 'Symbol' && nameType !== 'String') {
		throw new $TypeError('Assertion failed: `name` must be a Symbol or a String');
	}
	if (nameType === 'Symbol') {
		var description = getSymbolDescription(name);
		// eslint-disable-next-line no-param-reassign
		name = typeof description === 'undefined' ? '' : '[' + description + ']';
	}
	if (arguments.length > 2) {
		var prefix = arguments[2];
		// eslint-disable-next-line no-param-reassign
		name = prefix + ' ' + name;
	}
	return DefinePropertyOrThrow(F, 'name', {
		'[[Value]]': name,
		'[[Writable]]': false,
		'[[Enumerable]]': false,
		'[[Configurable]]': true
	});
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');
var $preventExtensions = GetIntrinsic('%Object.preventExtensions%', true);
var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%', true);

var forEach = require('../helpers/forEach');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-setintegritylevel

module.exports = function SetIntegrityLevel(O, level) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (level !== 'sealed' && level !== 'frozen') {
		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
	}
	if (!$preventExtensions) {
		throw new $SyntaxError('SetIntegrityLevel requires native `Object.preventExtensions` support');
	}
	var status = $preventExtensions(O);
	if (!status) {
		return false;
	}
	if (!$gOPN) {
		throw new $SyntaxError('SetIntegrityLevel requires native `Object.getOwnPropertyNames` support');
	}
	var theKeys = $gOPN(O);
	if (level === 'sealed') {
		forEach(theKeys, function (k) {
			DefinePropertyOrThrow(O, k, { configurable: false });
		});
	} else if (level === 'frozen') {
		forEach(theKeys, function (k) {
			var currentDesc = $gOPD(O, k);
			if (typeof currentDesc !== 'undefined') {
				var desc;
				if (IsAccessorDescriptor(ToPropertyDescriptor(currentDesc))) {
					desc = { configurable: false };
				} else {
					desc = { configurable: false, writable: false };
				}
				DefinePropertyOrThrow(O, k, desc);
			}
		});
	}
	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $species = GetIntrinsic('%Symbol.species%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var IsConstructor = require('./IsConstructor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor

module.exports = function SpeciesConstructor(O, defaultConstructor) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	var C = O.constructor;
	if (typeof C === 'undefined') {
		return defaultConstructor;
	}
	if (Type(C) !== 'Object') {
		throw new $TypeError('O.constructor is not an Object');
	}
	var S = $species ? C[$species] : void 0;
	if (S == null) {
		return defaultConstructor;
	}
	if (IsConstructor(S)) {
		return S;
	}
	throw new $TypeError('no constructor found');
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');

var IsInteger = require('./IsInteger');
var Type = require('./Type');

var $charAt = callBound('String.prototype.charAt');

// https://262.ecma-international.org/6.0/#sec-splitmatch

module.exports = function SplitMatch(S, q, R) {
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	if (!IsInteger(q)) {
		throw new $TypeError('Assertion failed: `q` must be an integer');
	}
	if (Type(R) !== 'String') {
		throw new $TypeError('Assertion failed: `R` must be a String');
	}
	var r = R.length;
	var s = S.length;
	if (q + r > s) {
		return false;
	}

	for (var i = 0; i < r; i += 1) {
		if ($charAt(S, q + i) !== $charAt(R, i)) {
			return false;
		}
	}

	return q + r;
};
'use strict';

var Type = require('./Type');

// https://262.ecma-international.org/5.1/#sec-11.9.6

module.exports = function StrictEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType !== yType) {
		return false;
	}
	if (xType === 'Undefined' || xType === 'Null') {
		return true;
	}
	return x === y; // shortcut for steps 4-7
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Object = GetIntrinsic('%Object%');
var $StringPrototype = GetIntrinsic('%String.prototype%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var Type = require('./Type');

var setProto = require('../helpers/setProto');

// https://262.ecma-international.org/6.0/#sec-stringcreate

module.exports = function StringCreate(value, prototype) {
	if (Type(value) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}

	var S = $Object(value);
	if (prototype !== $StringPrototype) {
		if (setProto) {
			setProto(S, prototype);
		} else {
			throw new $SyntaxError('StringCreate: a `proto` argument that is not `String.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
		}
	}

	var length = value.length;
	DefinePropertyOrThrow(S, 'length', {
		'[[Configurable]]': false,
		'[[Enumerable]]': false,
		'[[Value]]': length,
		'[[Writable]]': false
	});

	return S;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');
var $charAt = callBound('String.prototype.charAt');
var $stringToString = callBound('String.prototype.toString');

var CanonicalNumericIndexString = require('./CanonicalNumericIndexString');
var IsInteger = require('./IsInteger');
var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

var isNegativeZero = require('is-negative-zero');

// https://262.ecma-international.org/8.0/#sec-stringgetownproperty

module.exports = function StringGetOwnProperty(S, P) {
	var str;
	if (Type(S) === 'Object') {
		try {
			str = $stringToString(S);
		} catch (e) { /**/ }
	}
	if (Type(str) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a boxed string object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	if (Type(P) !== 'String') {
		return void undefined;
	}
	var index = CanonicalNumericIndexString(P);
	var len = str.length;
	if (typeof index === 'undefined' || !IsInteger(index) || isNegativeZero(index) || index < 0 || len <= index) {
		return void undefined;
	}
	var resultStr = $charAt(S, index);
	return {
		'[[Configurable]]': false,
		'[[Enumerable]]': true,
		'[[Value]]': resultStr,
		'[[Writable]]': false
	};
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var ToLength = require('./ToLength');
var ToString = require('./ToString');

var $strSlice = callBound('String.prototype.slice');

// https://262.ecma-international.org/11.0/#sec-stringpad

module.exports = function StringPad(O, maxLength, fillString, placement) {
	if (placement !== 'start' && placement !== 'end') {
		throw new $TypeError('Assertion failed: `placement` must be "start" or "end"');
	}
	var S = ToString(O);
	var intMaxLength = ToLength(maxLength);
	var stringLength = S.length;
	if (intMaxLength <= stringLength) {
		return S;
	}
	var filler = typeof fillString === 'undefined' ? ' ' : ToString(fillString);
	if (filler === '') {
		return S;
	}
	var fillLen = intMaxLength - stringLength;

	// the String value consisting of repeated concatenations of filler truncated to length fillLen.
	var truncatedStringFiller = '';
	while (truncatedStringFiller.length < fillLen) {
		truncatedStringFiller += filler;
	}
	truncatedStringFiller = $strSlice(truncatedStringFiller, 0, fillLen);

	if (placement === 'start') {
		return truncatedStringFiller + S;
	}
	return S + truncatedStringFiller;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $TypeError = GetIntrinsic('%TypeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');

// https://262.ecma-international.org/11.0/#sec-stringtobigint

module.exports = function StringToBigInt(argument) {
	if (typeof argument !== 'string') {
		throw new $TypeError('`argument` must be a string');
	}
	if (!$BigInt) {
		throw new $SyntaxError('BigInts are not supported in this environment');
	}
	try {
		return $BigInt(argument);
	} catch (e) {
		return NaN;
	}
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $SymbolToString = callBound('Symbol.prototype.toString', true);

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-symboldescriptivestring

module.exports = function SymbolDescriptiveString(sym) {
	if (Type(sym) !== 'Symbol') {
		throw new $TypeError('Assertion failed: `sym` must be a Symbol');
	}
	return $SymbolToString(sym);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $TypeError = GetIntrinsic('%TypeError%');

var every = require('../helpers/every');
var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');

var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-testintegritylevel

module.exports = function TestIntegrityLevel(O, level) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (level !== 'sealed' && level !== 'frozen') {
		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
	}
	var status = IsExtensible(O);
	if (status) {
		return false;
	}
	var theKeys = OwnPropertyKeys(O);
	return theKeys.length === 0 || every(theKeys, function (k) {
		var currentDesc = $gOPD(O, k);
		if (typeof currentDesc !== 'undefined') {
			if (currentDesc.configurable) {
				return false;
			}
			if (level === 'frozen' && IsDataDescriptor(ToPropertyDescriptor(currentDesc)) && currentDesc.writable) {
				return false;
			}
		}
		return true;
	});
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Date = GetIntrinsic('%Date%');
var $Number = GetIntrinsic('%Number%');

var $isFinite = require('../helpers/isFinite');

var abs = require('./abs');
var ToNumber = require('./ToNumber');

// https://262.ecma-international.org/5.1/#sec-15.9.1.14

module.exports = function TimeClip(time) {
	if (!$isFinite(time) || abs(time) > 8.64e15) {
		return NaN;
	}
	return $Number(new $Date(ToNumber(time)));
};

'use strict';

var msPerDay = require('../helpers/timeConstants').msPerDay;

var DayFromYear = require('./DayFromYear');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function TimeFromYear(y) {
	return msPerDay * DayFromYear(y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $isNaN = require('../helpers/isNaN');
var padTimeComponent = require('../helpers/padTimeComponent');

var HourFromTime = require('./HourFromTime');
var MinFromTime = require('./MinFromTime');
var SecFromTime = require('./SecFromTime');
var Type = require('./Type');

// https://262.ecma-international.org/9.0/#sec-timestring

module.exports = function TimeString(tv) {
	if (Type(tv) !== 'Number' || $isNaN(tv)) {
		throw new $TypeError('Assertion failed: `tv` must be a non-NaN Number');
	}
	var hour = HourFromTime(tv);
	var minute = MinFromTime(tv);
	var second = SecFromTime(tv);
	return padTimeComponent(hour) + ':' + padTimeComponent(minute) + ':' + padTimeComponent(second) + '\x20GMT';
};
'use strict';

var modulo = require('./modulo');

var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.2

module.exports = function TimeWithinDay(t) {
	return modulo(t, msPerDay);
};

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $asIntN = GetIntrinsic('%BigInt.asIntN%', true);
var $Number = GetIntrinsic('%Number%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');

var ToPrimitive = require('./ToPrimitive');

// https://262.ecma-international.org/11.0/#sec-tobigint

module.exports = function ToBigInt(argument) {
	if (!$BigInt) {
		throw new $SyntaxError('BigInts are not supported in this environment');
	}

	var prim = ToPrimitive(argument, $Number);

	if (typeof prim === 'number') {
		return $asIntN(0, prim);
	}
	return $BigInt(prim);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $pow = GetIntrinsic('%Math.pow%');

var ToBigInt = require('./ToBigInt');
var BigIntRemainder = require('./BigInt/remainder');

var modBigInt = require('../helpers/modBigInt');

// BigInt(2**63), but node v10.4-v10.8 have a bug where you can't `BigInt(x)` anything larger than MAX_SAFE_INTEGER
var twoSixtyThree = $BigInt && (BigInt($pow(2, 32)) * BigInt($pow(2, 31)));

// BigInt(2**64), but node v10.4-v10.8 have a bug where you can't `BigInt(x)` anything larger than MAX_SAFE_INTEGER
var twoSixtyFour = $BigInt && (BigInt($pow(2, 32)) * BigInt($pow(2, 32)));

// https://262.ecma-international.org/11.0/#sec-tobigint64

module.exports = function ToBigInt64(argument) {
	var n = ToBigInt(argument);
	var int64bit = modBigInt(BigIntRemainder, n, twoSixtyFour);
	return int64bit >= twoSixtyThree ? int64bit - twoSixtyFour : int64bit;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $pow = GetIntrinsic('%Math.pow%');

var ToBigInt = require('./ToBigInt');
var BigIntRemainder = require('./BigInt/remainder');

var modBigInt = require('../helpers/modBigInt');

// BigInt(2**64), but node v10.4-v10.8 have a bug where you can't `BigInt(x)` anything larger than MAX_SAFE_INTEGER
var twoSixtyFour = $BigInt && (BigInt($pow(2, 32)) * BigInt($pow(2, 32)));

// https://262.ecma-international.org/11.0/#sec-tobiguint64

module.exports = function ToBigUint64(argument) {
	var n = ToBigInt(argument);
	var int64bit = modBigInt(BigIntRemainder, n, twoSixtyFour);
	return int64bit;
};
'use strict';

// http://262.ecma-international.org/5.1/#sec-9.2

module.exports = function ToBoolean(value) { return !!value; };
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $Date = GetIntrinsic('%Date%');

var $isNaN = require('../helpers/isNaN');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-todatestring

module.exports = function ToDateString(tv) {
	if (Type(tv) !== 'Number') {
		throw new $TypeError('Assertion failed: `tv` must be a Number');
	}
	if ($isNaN(tv)) {
		return 'Invalid Date';
	}
	return $Date(tv);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $RangeError = GetIntrinsic('%RangeError%');

var ToInteger = require('./ToInteger');
var ToLength = require('./ToLength');
var SameValue = require('./SameValue');

// https://262.ecma-international.org/12.0/#sec-toindex

module.exports = function ToIndex(value) {
	if (typeof value === 'undefined') {
		return 0;
	}
	var integerIndex = ToInteger(value);
	if (integerIndex < 0) {
		throw new $RangeError('index must be >= 0');
	}
	var index = ToLength(integerIndex);
	if (!SameValue(integerIndex, index)) {
		throw new $RangeError('index must be >= 0 and < 2 ** 53 - 1');
	}
	return index;
};
'use strict';

var ToUint16 = require('./ToUint16');

// https://ecma-international.org/ecma-262/6.0/#sec-toint16

module.exports = function ToInt16(argument) {
	var int16bit = ToUint16(argument);
	return int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;
};
'use strict';

var ToNumber = require('./ToNumber');

// http://262.ecma-international.org/5.1/#sec-9.5

module.exports = function ToInt32(x) {
	return ToNumber(x) >> 0;
};
'use strict';

var ToUint8 = require('./ToUint8');

// https://ecma-international.org/ecma-262/6.0/#sec-toint8

module.exports = function ToInt8(argument) {
	var int8bit = ToUint8(argument);
	return int8bit >= 0x80 ? int8bit - 0x100 : int8bit;
};
'use strict';

var ES5ToInteger = require('../5/ToInteger');

var ToNumber = require('./ToNumber');

// https://262.ecma-international.org/11.0/#sec-tointeger

module.exports = function ToInteger(value) {
	var number = ToNumber(value);
	if (number !== 0) {
		number = ES5ToInteger(number);
	}
	return number === 0 ? 0 : number;
};
'use strict';

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');

var ToInteger = require('./ToInteger');

module.exports = function ToLength(argument) {
	var len = ToInteger(argument);
	if (len <= 0) { return 0; } // includes converting -0 to +0
	if (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }
	return len;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $Number = GetIntrinsic('%Number%');
var $RegExp = GetIntrinsic('%RegExp%');
var $parseInteger = GetIntrinsic('%parseInt%');

var callBound = require('call-bind/callBound');
var regexTester = require('../helpers/regexTester');
var isPrimitive = require('../helpers/isPrimitive');

var $strSlice = callBound('String.prototype.slice');
var isBinary = regexTester(/^0b[01]+$/i);
var isOctal = regexTester(/^0o[0-7]+$/i);
var isInvalidHexLiteral = regexTester(/^[-+]0x[0-9a-f]+$/i);
var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
var hasNonWS = regexTester(nonWSregex);

// whitespace from: https://es5.github.io/#x15.5.4.20
// implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
var ws = [
	'\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
	'\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
	'\u2029\uFEFF'
].join('');
var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
var $replace = callBound('String.prototype.replace');
var $trim = function (value) {
	return $replace(value, trimRegex, '');
};

var ToPrimitive = require('./ToPrimitive');

// https://ecma-international.org/ecma-262/6.0/#sec-tonumber

module.exports = function ToNumber(argument) {
	var value = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number);
	if (typeof value === 'symbol') {
		throw new $TypeError('Cannot convert a Symbol value to a number');
	}
	if (typeof value === 'bigint') {
		throw new $TypeError('Conversion from \'BigInt\' to \'number\' is not allowed.');
	}
	if (typeof value === 'string') {
		if (isBinary(value)) {
			return ToNumber($parseInteger($strSlice(value, 2), 2));
		} else if (isOctal(value)) {
			return ToNumber($parseInteger($strSlice(value, 2), 8));
		} else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
			return NaN;
		}
		var trimmed = $trim(value);
		if (trimmed !== value) {
			return ToNumber(trimmed);
		}

	}
	return $Number(value);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Number = GetIntrinsic('%Number%');

var isPrimitive = require('../helpers/isPrimitive');

var ToPrimitive = require('./ToPrimitive');
var ToNumber = require('./ToNumber');
var Type = require('./Type');

// https://262.ecma-international.org/6.0/#sec-tonumber

module.exports = function ToNumeric(argument) {
	var primValue = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number);
	if (Type(primValue) === 'BigInt') {
		return primValue;
	}
	return ToNumber(primValue);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Object = GetIntrinsic('%Object%');

var RequireObjectCoercible = require('./RequireObjectCoercible');

// https://ecma-international.org/ecma-262/6.0/#sec-toobject

module.exports = function ToObject(value) {
	RequireObjectCoercible(value);
	return $Object(value);
};
'use strict';

var toPrimitive = require('es-to-primitive/es2015');

// https://ecma-international.org/ecma-262/6.0/#sec-toprimitive

module.exports = function ToPrimitive(input) {
	if (arguments.length > 1) {
		return toPrimitive(input, arguments[1]);
	}
	return toPrimitive(input);
};
'use strict';

var has = require('has');

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');
var ToBoolean = require('./ToBoolean');
var IsCallable = require('./IsCallable');

// https://262.ecma-international.org/5.1/#sec-8.10.5

module.exports = function ToPropertyDescriptor(Obj) {
	if (Type(Obj) !== 'Object') {
		throw new $TypeError('ToPropertyDescriptor requires an object');
	}

	var desc = {};
	if (has(Obj, 'enumerable')) {
		desc['[[Enumerable]]'] = ToBoolean(Obj.enumerable);
	}
	if (has(Obj, 'configurable')) {
		desc['[[Configurable]]'] = ToBoolean(Obj.configurable);
	}
	if (has(Obj, 'value')) {
		desc['[[Value]]'] = Obj.value;
	}
	if (has(Obj, 'writable')) {
		desc['[[Writable]]'] = ToBoolean(Obj.writable);
	}
	if (has(Obj, 'get')) {
		var getter = Obj.get;
		if (typeof getter !== 'undefined' && !IsCallable(getter)) {
			throw new $TypeError('getter must be a function');
		}
		desc['[[Get]]'] = getter;
	}
	if (has(Obj, 'set')) {
		var setter = Obj.set;
		if (typeof setter !== 'undefined' && !IsCallable(setter)) {
			throw new $TypeError('setter must be a function');
		}
		desc['[[Set]]'] = setter;
	}

	if ((has(desc, '[[Get]]') || has(desc, '[[Set]]')) && (has(desc, '[[Value]]') || has(desc, '[[Writable]]'))) {
		throw new $TypeError('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
	}
	return desc;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $String = GetIntrinsic('%String%');

var ToPrimitive = require('./ToPrimitive');
var ToString = require('./ToString');

// https://ecma-international.org/ecma-262/6.0/#sec-topropertykey

module.exports = function ToPropertyKey(argument) {
	var key = ToPrimitive(argument, $String);
	return typeof key === 'symbol' ? key : ToString(key);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $String = GetIntrinsic('%String%');
var $TypeError = GetIntrinsic('%TypeError%');

// https://ecma-international.org/ecma-262/6.0/#sec-tostring

module.exports = function ToString(argument) {
	if (typeof argument === 'symbol') {
		throw new $TypeError('Cannot convert a Symbol value to a string');
	}
	return $String(argument);
};
'use strict';

var abs = require('./abs');
var floor = require('./floor');
var modulo = require('./modulo');
var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');

// http://262.ecma-international.org/5.1/#sec-9.7

module.exports = function ToUint16(value) {
	var number = ToNumber(value);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * floor(abs(number));
	return modulo(posInt, 0x10000);
};
'use strict';

var ToNumber = require('./ToNumber');

// http://262.ecma-international.org/5.1/#sec-9.6

module.exports = function ToUint32(x) {
	return ToNumber(x) >>> 0;
};
'use strict';

var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');

var abs = require('./abs');
var floor = require('./floor');
var modulo = require('./modulo');

// https://ecma-international.org/ecma-262/6.0/#sec-touint8

module.exports = function ToUint8(argument) {
	var number = ToNumber(argument);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * floor(abs(number));
	return modulo(posInt, 0x100);
};
'use strict';

var ToNumber = require('./ToNumber');
var floor = require('./floor');

var $isNaN = require('../helpers/isNaN');

// https://ecma-international.org/ecma-262/6.0/#sec-touint8clamp

module.exports = function ToUint8Clamp(argument) {
	var number = ToNumber(argument);
	if ($isNaN(number) || number <= 0) { return 0; }
	if (number >= 0xFF) { return 0xFF; }
	var f = floor(argument);
	if (f + 0.5 < number) { return f + 1; }
	if (number < f + 0.5) { return f; }
	if (f % 2 !== 0) { return f + 1; }
	return f;
};
'use strict';

var trimStart = require('string.prototype.trimstart');
var trimEnd = require('string.prototype.trimend');

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var RequireObjectCoercible = require('./RequireObjectCoercible');
var ToString = require('./ToString');

// https://262.ecma-international.org/10.0/#sec-trimstring

module.exports = function TrimString(string, where) {
	var str = RequireObjectCoercible(string);
	var S = ToString(str);
	var T;
	if (where === 'start') {
		T = trimStart(S);
	} else if (where === 'end') {
		T = trimEnd(S);
	} else if (where === 'start+end') {
		T = trimStart(trimEnd(S));
	} else {
		throw new $TypeError('Assertion failed: invalid `where` value; must be "start", "end", or "start+end"');
	}
	return T;
};
'use strict';

var ES5Type = require('../5/Type');

// https://262.ecma-international.org/11.0/#sec-ecmascript-data-types-and-values

module.exports = function Type(x) {
	if (typeof x === 'symbol') {
		return 'Symbol';
	}
	if (typeof x === 'bigint') {
		return 'BigInt';
	}
	return ES5Type(x);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $push = callBound('Array.prototype.push');

var CodePointAt = require('./CodePointAt');
var Type = require('./Type');

// https://262.ecma-international.org/11.0/#sec-utf16decodestring

module.exports = function UTF16DecodeString(string) {
	if (Type(string) !== 'String') {
		throw new $TypeError('Assertion failed: `string` must be a String');
	}
	var codePoints = [];
	var size = string.length;
	var position = 0;
	while (position < size) {
		var cp = CodePointAt(string, position);
		$push(codePoints, cp['[[CodePoint]]']);
		position += cp['[[CodeUnitCount]]'];
	}
	return codePoints;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $fromCharCode = GetIntrinsic('%String.fromCharCode%');

var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');

// https://262.ecma-international.org/11.0/#sec-utf16decodesurrogatepair

module.exports = function UTF16DecodeSurrogatePair(lead, trail) {
	if (!isLeadingSurrogate(lead) || !isTrailingSurrogate(trail)) {
		throw new $TypeError('Assertion failed: `lead` must be a leading surrogate char code, and `trail` must be a trailing surrogate char code');
	}
	// var cp = (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000;
	return $fromCharCode(lead) + $fromCharCode(trail);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $fromCharCode = GetIntrinsic('%String.fromCharCode%');

var floor = require('./floor');
var modulo = require('./modulo');

var isCodePoint = require('../helpers/isCodePoint');

// https://262.ecma-international.org/7.0/#sec-utf16encoding

module.exports = function UTF16Encoding(cp) {
	if (!isCodePoint(cp)) {
		throw new $TypeError('Assertion failed: `cp` must be >= 0 and <= 0x10FFFF');
	}
	if (cp <= 65535) {
		return $fromCharCode(cp);
	}
	var cu1 = floor((cp - 65536) / 1024) + 0xD800;
	var cu2 = modulo(cp - 65536, 1024) + 0xDC00;
	return $fromCharCode(cu1) + $fromCharCode(cu2);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $charCodeAt = callBound('String.prototype.charCodeAt');
var $numberToString = callBound('Number.prototype.toString');
var $toLowerCase = callBound('String.prototype.toLowerCase');

var StringPad = require('./StringPad');

// https://262.ecma-international.org/11.0/#sec-unicodeescape

module.exports = function UnicodeEscape(C) {
	if (typeof C !== 'string' || C.length !== 1) {
		throw new $TypeError('Assertion failed: `C` must be a single code unit');
	}
	var n = $charCodeAt(C, 0);
	if (n > 0xFFFF) {
		throw new $TypeError('`Assertion failed: numeric value of `C` must be <= 0xFFFF');
	}

	return '\\u' + StringPad($toLowerCase($numberToString(n, 16)), 4, '0', 'start');
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');
var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
var isSamePropertyDescriptor = require('../helpers/isSamePropertyDescriptor');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsGenericDescriptor = require('./IsGenericDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-validateandapplypropertydescriptor
// https://ecma-international.org/ecma-262/8.0/#sec-validateandapplypropertydescriptor

// eslint-disable-next-line max-lines-per-function, max-statements, max-params
module.exports = function ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current) {
	// this uses the ES2017+ logic, since it fixes a number of bugs in the ES2015 logic.
	var oType = Type(O);
	if (oType !== 'Undefined' && oType !== 'Object') {
		throw new $TypeError('Assertion failed: O must be undefined or an Object');
	}
	if (Type(extensible) !== 'Boolean') {
		throw new $TypeError('Assertion failed: extensible must be a Boolean');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (Type(current) !== 'Undefined' && !isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, current)) {
		throw new $TypeError('Assertion failed: current must be a Property Descriptor, or undefined');
	}
	if (oType !== 'Undefined' && !IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: if O is not undefined, P must be a Property Key');
	}
	if (Type(current) === 'Undefined') {
		if (!extensible) {
			return false;
		}
		if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
			if (oType !== 'Undefined') {
				DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					{
						'[[Configurable]]': Desc['[[Configurable]]'],
						'[[Enumerable]]': Desc['[[Enumerable]]'],
						'[[Value]]': Desc['[[Value]]'],
						'[[Writable]]': Desc['[[Writable]]']
					}
				);
			}
		} else {
			if (!IsAccessorDescriptor(Desc)) {
				throw new $TypeError('Assertion failed: Desc is not an accessor descriptor');
			}
			if (oType !== 'Undefined') {
				return DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					Desc
				);
			}
		}
		return true;
	}
	if (IsGenericDescriptor(Desc) && !('[[Configurable]]' in Desc) && !('[[Enumerable]]' in Desc)) {
		return true;
	}
	if (isSamePropertyDescriptor({ SameValue: SameValue }, Desc, current)) {
		return true; // removed by ES2017, but should still be correct
	}
	// "if every field in Desc is absent, return true" can't really match the assertion that it's a Property Descriptor
	if (!current['[[Configurable]]']) {
		if (Desc['[[Configurable]]']) {
			return false;
		}
		if ('[[Enumerable]]' in Desc && !Desc['[[Enumerable]]'] === !!current['[[Enumerable]]']) {
			return false;
		}
	}
	if (IsGenericDescriptor(Desc)) {
		// no further validation is required.
	} else if (IsDataDescriptor(current) !== IsDataDescriptor(Desc)) {
		if (!current['[[Configurable]]']) {
			return false;
		}
		if (IsDataDescriptor(current)) {
			if (oType !== 'Undefined') {
				DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					{
						'[[Configurable]]': current['[[Configurable]]'],
						'[[Enumerable]]': current['[[Enumerable]]'],
						'[[Get]]': undefined
					}
				);
			}
		} else if (oType !== 'Undefined') {
			DefineOwnProperty(
				IsDataDescriptor,
				SameValue,
				FromPropertyDescriptor,
				O,
				P,
				{
					'[[Configurable]]': current['[[Configurable]]'],
					'[[Enumerable]]': current['[[Enumerable]]'],
					'[[Value]]': undefined
				}
			);
		}
	} else if (IsDataDescriptor(current) && IsDataDescriptor(Desc)) {
		if (!current['[[Configurable]]'] && !current['[[Writable]]']) {
			if ('[[Writable]]' in Desc && Desc['[[Writable]]']) {
				return false;
			}
			if ('[[Value]]' in Desc && !SameValue(Desc['[[Value]]'], current['[[Value]]'])) {
				return false;
			}
			return true;
		}
	} else if (IsAccessorDescriptor(current) && IsAccessorDescriptor(Desc)) {
		if (!current['[[Configurable]]']) {
			if ('[[Set]]' in Desc && !SameValue(Desc['[[Set]]'], current['[[Set]]'])) {
				return false;
			}
			if ('[[Get]]' in Desc && !SameValue(Desc['[[Get]]'], current['[[Get]]'])) {
				return false;
			}
			return true;
		}
	} else {
		throw new $TypeError('Assertion failed: current and Desc are not both data, both accessors, or one accessor and one data.');
	}
	if (oType !== 'Undefined') {
		return DefineOwnProperty(
			IsDataDescriptor,
			SameValue,
			FromPropertyDescriptor,
			O,
			P,
			Desc
		);
	}
	return true;
};
'use strict';

var Day = require('./Day');
var modulo = require('./modulo');

// https://262.ecma-international.org/5.1/#sec-15.9.1.6

module.exports = function WeekDay(t) {
	return modulo(Day(t) + 4, 7);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Date = GetIntrinsic('%Date%');

var callBound = require('call-bind/callBound');

var $getUTCFullYear = callBound('Date.prototype.getUTCFullYear');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function YearFromTime(t) {
	// largest y such that this.TimeFromYear(y) <= t
	return $getUTCFullYear(new $Date(t));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $abs = GetIntrinsic('%Math.abs%');

// http://262.ecma-international.org/5.1/#sec-5.2

module.exports = function abs(x) {
	return $abs(x);
};
'use strict';

// var modulo = require('./modulo');
var $floor = Math.floor;

// http://262.ecma-international.org/5.1/#sec-5.2

module.exports = function floor(x) {
	// return x - modulo(x, 1);
	return $floor(x);
};
'use strict';

var mod = require('../helpers/mod');

// https://262.ecma-international.org/5.1/#sec-5.2

module.exports = function modulo(x, y) {
	return mod(x, y);
};
'use strict';

var modulo = require('./modulo');

var msPerSecond = require('../helpers/timeConstants').msPerSecond;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function msFromTime(t) {
	return modulo(t, msPerSecond);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');
var $bigIntValueOf = callBound('BigInt.prototype.valueOf', true);

var Type = require('./Type');

// https://262.ecma-international.org/11.0/#sec-thisbigintvalue

module.exports = function thisBigIntValue(value) {
	var type = Type(value);
	if (type === 'BigInt') {
		return value;
	}
	if (!$bigIntValueOf) {
		throw new $TypeError('BigInt is not supported');
	}
	return $bigIntValueOf(value);
};
'use strict';

var $BooleanValueOf = require('call-bind/callBound')('Boolean.prototype.valueOf');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-boolean-prototype-object

module.exports = function thisBooleanValue(value) {
	if (Type(value) === 'Boolean') {
		return value;
	}

	return $BooleanValueOf(value);
};
'use strict';

var callBound = require('call-bind/callBound');

var Type = require('./Type');

var $NumberValueOf = callBound('Number.prototype.valueOf');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-number-prototype-object

module.exports = function thisNumberValue(value) {
	if (Type(value) === 'Number') {
		return value;
	}

	return $NumberValueOf(value);
};

'use strict';

var $StringValueOf = require('call-bind/callBound')('String.prototype.valueOf');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object

module.exports = function thisStringValue(value) {
	if (Type(value) === 'String') {
		return value;
	}

	return $StringValueOf(value);
};
'use strict';

var callBound = require('call-bind/callBound');

var $SymbolValueOf = callBound('Symbol.prototype.valueOf', true);

var Type = require('./Type');

// https://262.ecma-international.org/9.0/#sec-thissymbolvalue

module.exports = function thisSymbolValue(value) {
	if (!$SymbolValueOf) {
		throw new SyntaxError('Symbols are not supported; thisSymbolValue requires that `value` be a Symbol or a Symbol object');
	}
	if (Type(value) === 'Symbol') {
		return value;
	}
	return $SymbolValueOf(value);
};
'use strict';

module.exports = require('../2018/thisTimeValue');
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isNaN = require('../../helpers/isNaN');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-add

module.exports = function NumberAdd(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}

	if (isNaN(x) || isNaN(y) || (x === Infinity && y === -Infinity) || (x === -Infinity && y === Infinity)) {
		return NaN;
	}

	if ((x === Infinity && y === Infinity) || (x === -Infinity && y === -Infinity)) {
		return x;
	}

	if (x === Infinity) {
		return x;
	}

	if (y === Infinity) {
		return y;
	}

	if (x === y && x === 0) {
		return Infinity / x === -Infinity && Infinity / y === -Infinity ? -0 : +0;
	}

	if (x === -y || -x === y) {
		return +0;
	}

	// shortcut for the actual spec mechanics
	return x + y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var NumberBitwiseOp = require('../NumberBitwiseOp');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-bitwiseAND

module.exports = function NumberBitwiseAND(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}
	return NumberBitwiseOp('&', x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var ToInt32 = require('../ToInt32');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-bitwiseNOT

module.exports = function NumberBitwiseNOT(x) {
	if (Type(x) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` argument must be a Number');
	}
	var oldValue = ToInt32(x);
	// Return the result of applying the bitwise operator op to lnum and rnum. The result is a signed 32-bit integer.
	return ~oldValue;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var NumberBitwiseOp = require('../NumberBitwiseOp');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-bitwiseOR

module.exports = function NumberBitwiseOR(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}
	return NumberBitwiseOp('|', x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var NumberBitwiseOp = require('../NumberBitwiseOp');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-bitwiseXOR

module.exports = function NumberBitwiseXOR(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}
	return NumberBitwiseOp('^', x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isFinite = require('../../helpers/isFinite');
var isNaN = require('../../helpers/isNaN');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-divide

module.exports = function NumberDivide(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}
	if (isNaN(x) || isNaN(y) || (!isFinite(x) && !isFinite(y))) {
		return NaN;
	}
	// shortcut for the actual spec mechanics
	return x / y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isNaN = require('../../helpers/isNaN');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-equal

module.exports = function NumberEqual(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}
	if (isNaN(x) || isNaN(y)) {
		return false;
	}
	// shortcut for the actual spec mechanics
	return x === y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
// var isNegativeZero = require('is-negative-zero');

var $pow = GetIntrinsic('%Math.pow%');

var $TypeError = GetIntrinsic('%TypeError%');

/*
var abs = require('../../helpers/abs');
var isFinite = require('../../helpers/isFinite');
var isNaN = require('../../helpers/isNaN');

var IsInteger = require('../IsInteger');
*/
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-exponentiate

/* eslint max-lines-per-function: 0, max-statements: 0 */

module.exports = function NumberExponentiate(base, exponent) {
	if (Type(base) !== 'Number' || Type(exponent) !== 'Number') {
		throw new $TypeError('Assertion failed: `base` and `exponent` arguments must be Numbers');
	}
	return $pow(base, exponent);
	/*
	if (isNaN(exponent)) {
		return NaN;
	}
	if (exponent === 0) {
		return 1;
	}
	if (isNaN(base)) {
		return NaN;
	}
	var aB = abs(base);
	if (aB > 1 && exponent === Infinity) {
		return Infinity;
	}
	if (aB > 1 && exponent === -Infinity) {
		return 0;
	}
	if (aB === 1 && (exponent === Infinity || exponent === -Infinity)) {
		return NaN;
	}
	if (aB < 1 && exponent === Infinity) {
		return +0;
	}
	if (aB < 1 && exponent === -Infinity) {
		return Infinity;
	}
	if (base === Infinity) {
		return exponent > 0 ? Infinity : 0;
	}
	if (base === -Infinity) {
		var isOdd = true;
		if (exponent > 0) {
			return isOdd ? -Infinity : Infinity;
		}
		return isOdd ? -0 : 0;
	}
	if (exponent > 0) {
		return isNegativeZero(base) ? Infinity : 0;
	}
	if (isNegativeZero(base)) {
		if (exponent > 0) {
			return isOdd ? -0 : 0;
		}
		return isOdd ? -Infinity : Infinity;
	}
	if (base < 0 && isFinite(base) && isFinite(exponent) && !IsInteger(exponent)) {
		return NaN;
	}
	*/
};
'use strict';

var add = require('./add');
var bitwiseAND = require('./bitwiseAND');
var bitwiseNOT = require('./bitwiseNOT');
var bitwiseOR = require('./bitwiseOR');
var bitwiseXOR = require('./bitwiseXOR');
var divide = require('./divide');
var equal = require('./equal');
var exponentiate = require('./exponentiate');
var leftShift = require('./leftShift');
var lessThan = require('./lessThan');
var multiply = require('./multiply');
var remainder = require('./remainder');
var sameValue = require('./sameValue');
var sameValueZero = require('./sameValueZero');
var signedRightShift = require('./signedRightShift');
var subtract = require('./subtract');
var toString = require('./toString');
var unaryMinus = require('./unaryMinus');
var unsignedRightShift = require('./unsignedRightShift');

module.exports = {
	add: add,
	bitwiseAND: bitwiseAND,
	bitwiseNOT: bitwiseNOT,
	bitwiseOR: bitwiseOR,
	bitwiseXOR: bitwiseXOR,
	divide: divide,
	equal: equal,
	exponentiate: exponentiate,
	leftShift: leftShift,
	lessThan: lessThan,
	multiply: multiply,
	remainder: remainder,
	sameValue: sameValue,
	sameValueZero: sameValueZero,
	signedRightShift: signedRightShift,
	subtract: subtract,
	toString: toString,
	unaryMinus: unaryMinus,
	unsignedRightShift: unsignedRightShift
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var ToInt32 = require('../ToInt32');
var ToUint32 = require('../ToUint32');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-leftShift

module.exports = function NumberLeftShift(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}

	var lnum = ToInt32(x);
	var rnum = ToUint32(y);

	var shiftCount = rnum & 0x1F;

	return lnum << shiftCount;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isNaN = require('../../helpers/isNaN');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-lessThan

module.exports = function NumberLessThan(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}

	// If x is NaN, return undefined.
	// If y is NaN, return undefined.
	if (isNaN(x) || isNaN(y)) {
		return void undefined;
	}

	// shortcut for the actual spec mechanics
	return x < y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isNaN = require('../../helpers/isNaN');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-multiply

module.exports = function NumberMultiply(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}

	if (isNaN(x) || isNaN(y) || (x === 0 && !isFinite(y)) || (!isFinite(x) && y === 0)) {
		return NaN;
	}
	if (!isFinite(x) && !isFinite(y)) {
		return x === y ? Infinity : -Infinity;
	}
	if (!isFinite(x) && y !== 0) {
		return x > 0 ? Infinity : -Infinity;
	}
	if (!isFinite(y) && x !== 0) {
		return y > 0 ? Infinity : -Infinity;
	}

	// shortcut for the actual spec mechanics
	return x * y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isNaN = require('../../helpers/isNaN');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-remainder

module.exports = function NumberRemainder(n, d) {
	if (Type(n) !== 'Number' || Type(d) !== 'Number') {
		throw new $TypeError('Assertion failed: `n` and `d` arguments must be Numbers');
	}

	// If either operand is NaN, the result is NaN.
	// If the dividend is an infinity, or the divisor is a zero, or both, the result is NaN.
	if (isNaN(n) || isNaN(d) || !isFinite(n) || d === 0) {
		return NaN;
	}

	// If the dividend is finite and the divisor is an infinity, the result equals the dividend.
	// If the dividend is a zero and the divisor is nonzero and finite, the result is the same as the dividend.
	if (!isFinite(d) || (n === 0 && d !== 0)) {
		return n;
	}

	// In the remaining cases, where neither an infinity, nor a zero, nor NaN is involved…
	return n % d;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var isNegativeZero = require('is-negative-zero');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');
var NumberSameValueZero = require('./sameValueZero');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-sameValue

module.exports = function NumberSameValue(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}
	if (x === 0 && y === 0) {
		return !(isNegativeZero(x) ^ isNegativeZero(y));
	}
	return NumberSameValueZero(x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isNaN = require('../../helpers/isNaN');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-sameValueZero

module.exports = function NumberSameValueZero(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}

	var xNaN = isNaN(x);
	var yNaN = isNaN(y);
	if (xNaN || yNaN) {
		return xNaN === yNaN;
	}
	return x === y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var ToInt32 = require('../ToInt32');
var ToUint32 = require('../ToUint32');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-signedRightShift

module.exports = function NumberSignedRightShift(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}

	var lnum = ToInt32(x);
	var rnum = ToUint32(y);

	var shiftCount = rnum & 0x1F;

	return lnum >> shiftCount;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-subtract

module.exports = function NumberSubtract(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}
	return x - y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $String = GetIntrinsic('%String%');
var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-tostring

module.exports = function NumberToString(x) {
	if (Type(x) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` must be a Number');
	}

	return $String(x);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isNaN = require('../../helpers/isNaN');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-unaryMinus

module.exports = function NumberUnaryMinus(x) {
	if (Type(x) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` argument must be a Number');
	}
	if (isNaN(x)) {
		return NaN;
	}
	return -x;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var ToInt32 = require('../ToInt32');
var ToUint32 = require('../ToUint32');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-number-unsignedRightShift

module.exports = function NumberUnsignedRightShift(x, y) {
	if (Type(x) !== 'Number' || Type(y) !== 'Number') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be Numbers');
	}

	var lnum = ToInt32(x);
	var rnum = ToUint32(y);

	var shiftCount = rnum & 0x1F;

	return lnum >>> shiftCount;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-add

module.exports = function BigIntAdd(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}

	// shortcut for the actual spec mechanics
	return x + y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var BigIntBitwiseOp = require('../BigIntBitwiseOp');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-bitwiseAND

module.exports = function BigIntBitwiseAND(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}
	return BigIntBitwiseOp('&', x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-bitwiseNOT

module.exports = function BigIntBitwiseNOT(x) {
	if (Type(x) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` argument must be a BigInt');
	}
	return -x - $BigInt(1);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var BigIntBitwiseOp = require('../BigIntBitwiseOp');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-bitwiseOR

module.exports = function BigIntBitwiseOR(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}
	return BigIntBitwiseOp('|', x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var BigIntBitwiseOp = require('../BigIntBitwiseOp');
var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-bitwiseXOR

module.exports = function BigIntBitwiseXOR(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}
	return BigIntBitwiseOp('^', x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $RangeError = GetIntrinsic('%RangeError%');
var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-divide

module.exports = function BigIntDivide(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}
	if (y === $BigInt(0)) {
		throw new $RangeError('Division by zero');
	}
	// shortcut for the actual spec mechanics
	return x / y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-equal

module.exports = function BigIntEqual(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}
	// shortcut for the actual spec mechanics
	return x === y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $RangeError = GetIntrinsic('%RangeError%');
var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-exponentiate

module.exports = function BigIntExponentiate(base, exponent) {
	if (Type(base) !== 'BigInt' || Type(exponent) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `base` and `exponent` arguments must be BigInts');
	}
	if (exponent < $BigInt(0)) {
		throw new $RangeError('Exponent must be positive');
	}
	if (/* base === $BigInt(0) && */ exponent === $BigInt(0)) {
		return $BigInt(1);
	}

	var square = base;
	var remaining = exponent;
	while (remaining > $BigInt(0)) {
		square += exponent;
		--remaining; // eslint-disable-line no-plusplus
	}
	return square;
};
'use strict';

var add = require('./add');
var bitwiseAND = require('./bitwiseAND');
var bitwiseNOT = require('./bitwiseNOT');
var bitwiseOR = require('./bitwiseOR');
var bitwiseXOR = require('./bitwiseXOR');
var divide = require('./divide');
var equal = require('./equal');
var exponentiate = require('./exponentiate');
var leftShift = require('./leftShift');
var lessThan = require('./lessThan');
var multiply = require('./multiply');
var remainder = require('./remainder');
var sameValue = require('./sameValue');
var sameValueZero = require('./sameValueZero');
var signedRightShift = require('./signedRightShift');
var subtract = require('./subtract');
var toString = require('./toString');
var unaryMinus = require('./unaryMinus');
var unsignedRightShift = require('./unsignedRightShift');

module.exports = {
	add: add,
	bitwiseAND: bitwiseAND,
	bitwiseNOT: bitwiseNOT,
	bitwiseOR: bitwiseOR,
	bitwiseXOR: bitwiseXOR,
	divide: divide,
	equal: equal,
	exponentiate: exponentiate,
	leftShift: leftShift,
	lessThan: lessThan,
	multiply: multiply,
	remainder: remainder,
	sameValue: sameValue,
	sameValueZero: sameValueZero,
	signedRightShift: signedRightShift,
	subtract: subtract,
	toString: toString,
	unaryMinus: unaryMinus,
	unsignedRightShift: unsignedRightShift
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-leftShift

module.exports = function BigIntLeftShift(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}

	// shortcut for the actual spec mechanics
	return x << y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-lessThan

module.exports = function BigIntLessThan(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}

	// shortcut for the actual spec mechanics
	return x < y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-multiply

module.exports = function BigIntMultiply(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}

	// shortcut for the actual spec mechanics
	return x * y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $RangeError = GetIntrinsic('%RangeError%');
var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

var zero = $BigInt && $BigInt(0);

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-remainder

module.exports = function BigIntRemainder(n, d) {
	if (Type(n) !== 'BigInt' || Type(d) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `n` and `d` arguments must be BigInts');
	}

	if (d === zero) {
		throw new $RangeError('Division by zero');
	}

	if (n === zero) {
		return zero;
	}

	// shortcut for the actual spec mechanics
	return n % d;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');
var BigIntEqual = require('./equal');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-sameValue

module.exports = function BigIntSameValue(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}

	return BigIntEqual(x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');
var BigIntEqual = require('./equal');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-sameValueZero

module.exports = function BigIntSameValueZero(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}

	return BigIntEqual(x, y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');
var BigIntLeftShift = require('./leftShift');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-signedRightShift

module.exports = function BigIntSignedRightShift(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}

	return BigIntLeftShift(x, -y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-subtract

module.exports = function BigIntSubtract(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}

	// shortcut for the actual spec mechanics
	return x - y;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $String = GetIntrinsic('%String%');
var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-tostring

module.exports = function BigIntToString(x) {
	if (Type(x) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` must be a BigInt');
	}

	return $String(x);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $BigInt = GetIntrinsic('%BigInt%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

var zero = $BigInt && $BigInt(0);

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-unaryMinus

module.exports = function BigIntUnaryMinus(x) {
	if (Type(x) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` argument must be a BigInt');
	}

	if (x === zero) {
		return zero;
	}

	return -x;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('../Type');

// https://262.ecma-international.org/11.0/#sec-numeric-types-bigint-unsignedRightShift

module.exports = function BigIntUnsignedRightShift(x, y) {
	if (Type(x) !== 'BigInt' || Type(y) !== 'BigInt') {
		throw new $TypeError('Assertion failed: `x` and `y` arguments must be BigInts');
	}

	throw new $TypeError('BigInts have no unsigned right shift, use >> instead');
};
'use strict';

var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-abstract-equality-comparison

module.exports = function AbstractEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType === yType) {
		return x === y; // ES6+ specified this shortcut anyways.
	}
	if (x == null && y == null) {
		return true;
	}
	if (xType === 'Number' && yType === 'String') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if (xType === 'String' && yType === 'Number') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (xType === 'Boolean') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (yType === 'Boolean') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if ((xType === 'String' || xType === 'Number' || xType === 'Symbol') && yType === 'Object') {
		return AbstractEqualityComparison(x, ToPrimitive(y));
	}
	if (xType === 'Object' && (yType === 'String' || yType === 'Number' || yType === 'Symbol')) {
		return AbstractEqualityComparison(ToPrimitive(x), y);
	}
	return false;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Number = GetIntrinsic('%Number%');
var $TypeError = GetIntrinsic('%TypeError%');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');

var IsStringPrefix = require('./IsStringPrefix');
var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

// https://262.ecma-international.org/9.0/#sec-abstract-relational-comparison

module.exports = function AbstractRelationalComparison(x, y, LeftFirst) {
	if (Type(LeftFirst) !== 'Boolean') {
		throw new $TypeError('Assertion failed: LeftFirst argument must be a Boolean');
	}
	var px;
	var py;
	if (LeftFirst) {
		px = ToPrimitive(x, $Number);
		py = ToPrimitive(y, $Number);
	} else {
		py = ToPrimitive(y, $Number);
		px = ToPrimitive(x, $Number);
	}
	if (Type(px) === 'String' && Type(py) === 'String') {
		if (IsStringPrefix(py, px)) {
			return false;
		}
		if (IsStringPrefix(px, py)) {
			return true;
		}
		return px < py; // both strings, neither a prefix of the other. shortcut for steps 3 c-f
	}
	var nx = ToNumber(px);
	var ny = ToNumber(py);
	if ($isNaN(nx) || $isNaN(ny)) {
		return undefined;
	}
	if ($isFinite(nx) && $isFinite(ny) && nx === ny) {
		return false;
	}
	if (nx === Infinity) {
		return false;
	}
	if (ny === Infinity) {
		return true;
	}
	if (ny === -Infinity) {
		return false;
	}
	if (nx === -Infinity) {
		return true;
	}
	return nx < ny; // by now, these are both nonzero, finite, and not equal
};
'use strict';

var inspect = require('object-inspect');

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var Get = require('./Get');
var GetIterator = require('./GetIterator');
var IsCallable = require('./IsCallable');
var IteratorClose = require('./IteratorClose');
var IteratorStep = require('./IteratorStep');
var IteratorValue = require('./IteratorValue');
var Type = require('./Type');

// https://262.ecma-international.org/10.0//#sec-add-entries-from-iterable

module.exports = function AddEntriesFromIterable(target, iterable, adder) {
	if (!IsCallable(adder)) {
		throw new $TypeError('Assertion failed: `adder` is not callable');
	}
	if (iterable == null) {
		throw new $TypeError('Assertion failed: `iterable` is present, and not nullish');
	}
	var iteratorRecord = GetIterator(iterable);
	while (true) { // eslint-disable-line no-constant-condition
		var next = IteratorStep(iteratorRecord);
		if (!next) {
			return target;
		}
		var nextItem = IteratorValue(next);
		if (Type(nextItem) !== 'Object') {
			var error = new $TypeError('iterator next must return an Object, got ' + inspect(nextItem));
			return IteratorClose(
				iteratorRecord,
				function () { throw error; } // eslint-disable-line no-loop-func
			);
		}
		try {
			var k = Get(nextItem, '0');
			var v = Get(nextItem, '1');
			Call(adder, target, [k, v]);
		} catch (e) {
			return IteratorClose(
				iteratorRecord,
				function () { throw e; }
			);
		}
	}
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var IsInteger = require('./IsInteger');
var Type = require('./Type');

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');
var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');

var $TypeError = GetIntrinsic('%TypeError%');

var $charCodeAt = require('call-bind/callBound')('String.prototype.charCodeAt');

// https://ecma-international.org/ecma-262/6.0/#sec-advancestringindex

module.exports = function AdvanceStringIndex(S, index, unicode) {
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	if (!IsInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) {
		throw new $TypeError('Assertion failed: `length` must be an integer >= 0 and <= 2**53');
	}
	if (Type(unicode) !== 'Boolean') {
		throw new $TypeError('Assertion failed: `unicode` must be a Boolean');
	}
	if (!unicode) {
		return index + 1;
	}
	var length = S.length;
	if ((index + 1) >= length) {
		return index + 1;
	}

	var first = $charCodeAt(S, index);
	if (!isLeadingSurrogate(first)) {
		return index + 1;
	}

	var second = $charCodeAt(S, index + 1);
	if (!isTrailingSurrogate(second)) {
		return index + 1;
	}

	return index + 2;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $ArrayPrototype = GetIntrinsic('%Array.prototype%');
var $RangeError = GetIntrinsic('%RangeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var IsInteger = require('./IsInteger');

var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1;

var $setProto = GetIntrinsic('%Object.setPrototypeOf%', true) || (
	// eslint-disable-next-line no-proto, no-negated-condition
	[].__proto__ !== $ArrayPrototype
		? null
		: function (O, proto) {
			O.__proto__ = proto; // eslint-disable-line no-proto, no-param-reassign
			return O;
		}
);

// https://ecma-international.org/ecma-262/6.0/#sec-arraycreate

module.exports = function ArrayCreate(length) {
	if (!IsInteger(length) || length < 0) {
		throw new $TypeError('Assertion failed: `length` must be an integer Number >= 0');
	}
	if (length > MAX_ARRAY_LENGTH) {
		throw new $RangeError('length is greater than (2**32 - 1)');
	}
	var proto = arguments.length > 1 ? arguments[1] : $ArrayPrototype;
	var A = []; // steps 5 - 7, and 9
	if (proto !== $ArrayPrototype) { // step 8
		if (!$setProto) {
			throw new $SyntaxError('ArrayCreate: a `proto` argument that is not `Array.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
		}
		$setProto(A, proto);
	}
	if (length !== 0) { // bypasses the need for step 2
		A.length = length;
	}
	/* step 10, the above as a shortcut for the below
	OrdinaryDefineOwnProperty(A, 'length', {
		'[[Configurable]]': false,
		'[[Enumerable]]': false,
		'[[Value]]': length,
		'[[Writable]]': true
	});
	*/
	return A;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $RangeError = GetIntrinsic('%RangeError%');
var $TypeError = GetIntrinsic('%TypeError%');

var assign = require('object.assign');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var IsArray = require('./IsArray');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var OrdinaryDefineOwnProperty = require('./OrdinaryDefineOwnProperty');
var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
var ToNumber = require('./ToNumber');
var ToString = require('./ToString');
var ToUint32 = require('./ToUint32');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-arraysetlength

// eslint-disable-next-line max-statements, max-lines-per-function
module.exports = function ArraySetLength(A, Desc) {
	if (!IsArray(A)) {
		throw new $TypeError('Assertion failed: A must be an Array');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (!('[[Value]]' in Desc)) {
		return OrdinaryDefineOwnProperty(A, 'length', Desc);
	}
	var newLenDesc = assign({}, Desc);
	var newLen = ToUint32(Desc['[[Value]]']);
	var numberLen = ToNumber(Desc['[[Value]]']);
	if (newLen !== numberLen) {
		throw new $RangeError('Invalid array length');
	}
	newLenDesc['[[Value]]'] = newLen;
	var oldLenDesc = OrdinaryGetOwnProperty(A, 'length');
	if (!IsDataDescriptor(oldLenDesc)) {
		throw new $TypeError('Assertion failed: an array had a non-data descriptor on `length`');
	}
	var oldLen = oldLenDesc['[[Value]]'];
	if (newLen >= oldLen) {
		return OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
	}
	if (!oldLenDesc['[[Writable]]']) {
		return false;
	}
	var newWritable;
	if (!('[[Writable]]' in newLenDesc) || newLenDesc['[[Writable]]']) {
		newWritable = true;
	} else {
		newWritable = false;
		newLenDesc['[[Writable]]'] = true;
	}
	var succeeded = OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
	if (!succeeded) {
		return false;
	}
	while (newLen < oldLen) {
		oldLen -= 1;
		// eslint-disable-next-line no-param-reassign
		var deleteSucceeded = delete A[ToString(oldLen)];
		if (!deleteSucceeded) {
			newLenDesc['[[Value]]'] = oldLen + 1;
			if (!newWritable) {
				newLenDesc['[[Writable]]'] = false;
				OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
				return false;
			}
		}
	}
	if (!newWritable) {
		return OrdinaryDefineOwnProperty(A, 'length', { '[[Writable]]': false });
	}
	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Array = GetIntrinsic('%Array%');
var $species = GetIntrinsic('%Symbol.species%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsArray = require('./IsArray');
var IsConstructor = require('./IsConstructor');
var IsInteger = require('./IsInteger');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate

module.exports = function ArraySpeciesCreate(originalArray, length) {
	if (!IsInteger(length) || length < 0) {
		throw new $TypeError('Assertion failed: length must be an integer >= 0');
	}
	var len = length === 0 ? 0 : length;
	var C;
	var isArray = IsArray(originalArray);
	if (isArray) {
		C = Get(originalArray, 'constructor');
		// TODO: figure out how to make a cross-realm normal Array, a same-realm Array
		// if (IsConstructor(C)) {
		// 	if C is another realm's Array, C = undefined
		// 	Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?
		// }
		if ($species && Type(C) === 'Object') {
			C = Get(C, $species);
			if (C === null) {
				C = void 0;
			}
		}
	}
	if (typeof C === 'undefined') {
		return $Array(len);
	}
	if (!IsConstructor(C)) {
		throw new $TypeError('C must be a constructor');
	}
	return new C(len); // Construct(C, len);
};

'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');

var IsArray = require('./IsArray');

var $apply = GetIntrinsic('%Reflect.apply%', true) || callBound('%Function.prototype.apply%');

// https://ecma-international.org/ecma-262/6.0/#sec-call

module.exports = function Call(F, V) {
	var argumentsList = arguments.length > 2 ? arguments[2] : [];
	if (!IsArray(argumentsList)) {
		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
	}
	return $apply(F, V, argumentsList);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var SameValue = require('./SameValue');
var ToNumber = require('./ToNumber');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring

module.exports = function CanonicalNumericIndexString(argument) {
	if (Type(argument) !== 'String') {
		throw new $TypeError('Assertion failed: `argument` must be a String');
	}
	if (argument === '-0') { return -0; }
	var n = ToNumber(argument);
	if (SameValue(ToString(n), argument)) { return n; }
	return void 0;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $fromCharCode = GetIntrinsic('%String.fromCharCode%');
var $TypeError = GetIntrinsic('%TypeError%');
var $charCodeAt = callBound('%String.prototype.charCodeAt%');
var $push = callBound('%Array.prototype.push%');

module.exports = function CharacterRange(A, B) {
	if (A.length !== 1 || B.length !== 1) {
		throw new $TypeError('Assertion failed: CharSets A and B contain exactly one character');
	}

	var a = A[0];
	var b = B[0];

	var i = $charCodeAt(a, 0);
	var j = $charCodeAt(b, 0);

	if (!(i <= j)) {
		throw new $TypeError('Assertion failed: i is not <= j');
	}

	var arr = [];
	for (var k = i; k <= j; k += 1) {
		$push(arr, $fromCharCode(k));
	}
	return arr;
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var IsDataDescriptor = require('./IsDataDescriptor');
var IsGenericDescriptor = require('./IsGenericDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor

module.exports = function CompletePropertyDescriptor(Desc) {
	/* eslint no-param-reassign: 0 */
	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
		if (!has(Desc, '[[Value]]')) {
			Desc['[[Value]]'] = void 0;
		}
		if (!has(Desc, '[[Writable]]')) {
			Desc['[[Writable]]'] = false;
		}
	} else {
		if (!has(Desc, '[[Get]]')) {
			Desc['[[Get]]'] = void 0;
		}
		if (!has(Desc, '[[Set]]')) {
			Desc['[[Set]]'] = void 0;
		}
	}
	if (!has(Desc, '[[Enumerable]]')) {
		Desc['[[Enumerable]]'] = false;
	}
	if (!has(Desc, '[[Configurable]]')) {
		Desc['[[Configurable]]'] = false;
	}
	return Desc;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');
var forEach = require('../helpers/forEach');
var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');

var CreateDataProperty = require('./CreateDataProperty');
var Get = require('./Get');
var IsArray = require('./IsArray');
var IsInteger = require('./IsInteger');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var ToNumber = require('./ToNumber');
var ToObject = require('./ToObject');
var Type = require('./Type');

// https://262.ecma-international.org/9.0/#sec-copydataproperties

module.exports = function CopyDataProperties(target, source, excludedItems) {
	if (Type(target) !== 'Object') {
		throw new $TypeError('Assertion failed: "target" must be an Object');
	}

	if (!IsArray(excludedItems)) {
		throw new $TypeError('Assertion failed: "excludedItems" must be a List of Property Keys');
	}
	for (var i = 0; i < excludedItems.length; i += 1) {
		if (!IsPropertyKey(excludedItems[i])) {
			throw new $TypeError('Assertion failed: "excludedItems" must be a List of Property Keys');
		}
	}

	if (typeof source === 'undefined' || source === null) {
		return target;
	}

	var fromObj = ToObject(source);

	var sourceKeys = OwnPropertyKeys(fromObj);
	forEach(sourceKeys, function (nextKey) {
		var excluded = false;

		forEach(excludedItems, function (e) {
			if (SameValue(e, nextKey) === true) {
				excluded = true;
			}
		});

		var enumerable = $isEnumerable(fromObj, nextKey) || (
		// this is to handle string keys being non-enumerable in older engines
			typeof source === 'string'
			&& nextKey >= 0
			&& IsInteger(ToNumber(nextKey))
		);
		if (excluded === false && enumerable) {
			var propValue = Get(fromObj, nextKey);
			CreateDataProperty(target, nextKey, propValue);
		}
	});

	return target;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createdataproperty

module.exports = function CreateDataProperty(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	var oldDesc = OrdinaryGetOwnProperty(O, P);
	var extensible = !oldDesc || IsExtensible(O);
	var nonConfigurable = oldDesc && !oldDesc['[[Configurable]]'];
	if (nonConfigurable || !extensible) {
		return false;
	}
	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		{
			'[[Configurable]]': true,
			'[[Enumerable]]': true,
			'[[Value]]': V,
			'[[Writable]]': true
		}
	);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var CreateDataProperty = require('./CreateDataProperty');
var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// // https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow

module.exports = function CreateDataPropertyOrThrow(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	var success = CreateDataProperty(O, P, V);
	if (!success) {
		throw new $TypeError('unable to create data property');
	}
	return success;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $replace = callBound('String.prototype.replace');

var RequireObjectCoercible = require('./RequireObjectCoercible');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createhtml

module.exports = function CreateHTML(string, tag, attribute, value) {
	if (Type(tag) !== 'String' || Type(attribute) !== 'String') {
		throw new $TypeError('Assertion failed: `tag` and `attribute` must be strings');
	}
	var str = RequireObjectCoercible(string);
	var S = ToString(str);
	var p1 = '<' + tag;
	if (attribute !== '') {
		var V = ToString(value);
		var escapedV = $replace(V, /\x22/g, '&quot;');
		p1 += '\x20' + attribute + '\x3D\x22' + escapedV + '\x22';
	}
	return p1 + '>' + S + '</' + tag + '>';
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject

module.exports = function CreateIterResultObject(value, done) {
	if (Type(done) !== 'Boolean') {
		throw new $TypeError('Assertion failed: Type(done) is not Boolean');
	}
	return {
		value: value,
		done: done
	};
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');
var $indexOf = callBound('Array.prototype.indexOf', true) || callBound('String.prototype.indexOf');
var $push = callBound('Array.prototype.push');

var Get = require('./Get');
var IsArray = require('./IsArray');
var ToLength = require('./ToLength');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createlistfromarraylike
module.exports = function CreateListFromArrayLike(obj) {
	var elementTypes = arguments.length > 1
		? arguments[1]
		: ['Undefined', 'Null', 'Boolean', 'String', 'Symbol', 'Number', 'Object'];

	if (Type(obj) !== 'Object') {
		throw new $TypeError('Assertion failed: `obj` must be an Object');
	}
	if (!IsArray(elementTypes)) {
		throw new $TypeError('Assertion failed: `elementTypes`, if provided, must be an array');
	}
	var len = ToLength(Get(obj, 'length'));
	var list = [];
	var index = 0;
	while (index < len) {
		var indexName = ToString(index);
		var next = Get(obj, indexName);
		var nextType = Type(next);
		if ($indexOf(elementTypes, nextType) < 0) {
			throw new $TypeError('item type ' + nextType + ' is not a valid elementType');
		}
		$push(list, next);
		index += 1;
	}
	return list;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createmethodproperty

module.exports = function CreateMethodProperty(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	var newDesc = {
		'[[Configurable]]': true,
		'[[Enumerable]]': false,
		'[[Value]]': V,
		'[[Writable]]': true
	};
	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		newDesc
	);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');
var MonthFromTime = require('./MonthFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.5

module.exports = function DateFromTime(t) {
	var m = MonthFromTime(t);
	var d = DayWithinYear(t);
	if (m === 0) {
		return d + 1;
	}
	if (m === 1) {
		return d - 30;
	}
	var leap = InLeapYear(t);
	if (m === 2) {
		return d - 58 - leap;
	}
	if (m === 3) {
		return d - 89 - leap;
	}
	if (m === 4) {
		return d - 119 - leap;
	}
	if (m === 5) {
		return d - 150 - leap;
	}
	if (m === 6) {
		return d - 180 - leap;
	}
	if (m === 7) {
		return d - 211 - leap;
	}
	if (m === 8) {
		return d - 242 - leap;
	}
	if (m === 9) {
		return d - 272 - leap;
	}
	if (m === 10) {
		return d - 303 - leap;
	}
	if (m === 11) {
		return d - 333 - leap;
	}
	throw new $EvalError('Assertion failed: MonthFromTime returned an impossible value: ' + m);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var weekdays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];

var $isNaN = require('../helpers/isNaN');
var padTimeComponent = require('../helpers/padTimeComponent');

var Type = require('./Type');
var WeekDay = require('./WeekDay');
var MonthFromTime = require('./MonthFromTime');
var YearFromTime = require('./YearFromTime');
var DateFromTime = require('./DateFromTime');

// https://262.ecma-international.org/9.0/#sec-datestring

module.exports = function DateString(tv) {
	if (Type(tv) !== 'Number' || $isNaN(tv)) {
		throw new $TypeError('Assertion failed: `tv` must be a non-NaN Number');
	}
	var weekday = weekdays[WeekDay(tv)];
	var month = months[MonthFromTime(tv)];
	var day = padTimeComponent(DateFromTime(tv));
	var year = padTimeComponent(YearFromTime(tv), 4);
	return weekday + '\x20' + month + '\x20' + day + '\x20' + year;
};
'use strict';

var floor = require('./floor');

var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.2

module.exports = function Day(t) {
	return floor(t / msPerDay);
};
'use strict';

var floor = require('./floor');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function DayFromYear(y) {
	return (365 * (y - 1970)) + floor((y - 1969) / 4) - floor((y - 1901) / 100) + floor((y - 1601) / 400);
};

'use strict';

var Day = require('./Day');
var DayFromYear = require('./DayFromYear');
var YearFromTime = require('./YearFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.4

module.exports = function DayWithinYear(t) {
	return Day(t) - DayFromYear(YearFromTime(t));
};
'use strict';

var modulo = require('./modulo');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function DaysInYear(y) {
	if (modulo(y, 4) !== 0) {
		return 365;
	}
	if (modulo(y, 100) !== 0) {
		return 366;
	}
	if (modulo(y, 400) !== 0) {
		return 365;
	}
	return 366;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow

module.exports = function DefinePropertyOrThrow(O, P, desc) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	var Desc = isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, desc) ? desc : ToPropertyDescriptor(desc);
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc is not a valid Property Descriptor');
	}

	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		Desc
	);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-deletepropertyorthrow

module.exports = function DeletePropertyOrThrow(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// eslint-disable-next-line no-param-reassign
	var success = delete O[P];
	if (!success) {
		throw new $TypeError('Attempt to delete property failed.');
	}
	return success;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var objectKeys = require('object-keys');

var callBound = require('call-bind/callBound');

var callBind = require('call-bind');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
var $pushApply = callBind.apply(GetIntrinsic('%Array.prototype.push%'));

var forEach = require('../helpers/forEach');

var Type = require('./Type');

// https://262.ecma-international.org/8.0/#sec-enumerableownproperties

module.exports = function EnumerableOwnPropertyNames(O, kind) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	var keys = objectKeys(O);
	if (kind === 'key') {
		return keys;
	}
	if (kind === 'value' || kind === 'key+value') {
		var results = [];
		forEach(keys, function (key) {
			if ($isEnumerable(O, key)) {
				$pushApply(results, [
					kind === 'value' ? O[key] : [key, O[key]]
				]);
			}
		});
		return results;
	}
	throw new $TypeError('Assertion failed: "kind" is not "key", "value", or "key+value": ' + kind);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');

var Call = require('./Call');
var CreateDataPropertyOrThrow = require('./CreateDataPropertyOrThrow');
var Get = require('./Get');
var HasProperty = require('./HasProperty');
var IsArray = require('./IsArray');
var ToLength = require('./ToLength');
var ToString = require('./ToString');

// https://262.ecma-international.org/10.0/#sec-flattenintoarray

// eslint-disable-next-line max-params
module.exports = function FlattenIntoArray(target, source, sourceLen, start, depth) {
	var mapperFunction;
	if (arguments.length > 5) {
		mapperFunction = arguments[5];
	}

	var targetIndex = start;
	var sourceIndex = 0;
	while (sourceIndex < sourceLen) {
		var P = ToString(sourceIndex);
		var exists = HasProperty(source, P);
		if (exists === true) {
			var element = Get(source, P);
			if (typeof mapperFunction !== 'undefined') {
				if (arguments.length <= 6) {
					throw new $TypeError('Assertion failed: thisArg is required when mapperFunction is provided');
				}
				element = Call(mapperFunction, arguments[6], [element, sourceIndex, source]);
			}
			var shouldFlatten = false;
			if (depth > 0) {
				shouldFlatten = IsArray(element);
			}
			if (shouldFlatten) {
				var elementLen = ToLength(Get(element, 'length'));
				targetIndex = FlattenIntoArray(target, element, elementLen, targetIndex, depth - 1);
			} else {
				if (targetIndex >= MAX_SAFE_INTEGER) {
					throw new $TypeError('index too large');
				}
				CreateDataPropertyOrThrow(target, ToString(targetIndex), element);
				targetIndex += 1;
			}
		}
		sourceIndex += 1;
	}

	return targetIndex;
};
'use strict';

var assertRecord = require('../helpers/assertRecord');
var fromPropertyDescriptor = require('../helpers/fromPropertyDescriptor');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-frompropertydescriptor

module.exports = function FromPropertyDescriptor(Desc) {
	if (typeof Desc !== 'undefined') {
		assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
	}

	return fromPropertyDescriptor(Desc);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var inspect = require('object-inspect');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-get-o-p

module.exports = function Get(O, P) {
	// 7.3.1.1
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	// 7.3.1.2
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true, got ' + inspect(P));
	}
	// 7.3.1.3
	return O[P];
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var getIteratorMethod = require('../helpers/getIteratorMethod');
var AdvanceStringIndex = require('./AdvanceStringIndex');
var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsArray = require('./IsArray');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getiterator

module.exports = function GetIterator(obj, method) {
	var actualMethod = method;
	if (arguments.length < 2) {
		actualMethod = getIteratorMethod(
			{
				AdvanceStringIndex: AdvanceStringIndex,
				GetMethod: GetMethod,
				IsArray: IsArray
			},
			obj
		);
	}
	var iterator = Call(actualMethod, obj);
	if (Type(iterator) !== 'Object') {
		throw new $TypeError('iterator must return an object');
	}

	return iterator;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var GetV = require('./GetV');
var IsCallable = require('./IsCallable');
var IsPropertyKey = require('./IsPropertyKey');

// https://ecma-international.org/ecma-262/6.0/#sec-getmethod

module.exports = function GetMethod(O, P) {
	// 7.3.9.1
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// 7.3.9.2
	var func = GetV(O, P);

	// 7.3.9.4
	if (func == null) {
		return void 0;
	}

	// 7.3.9.5
	if (!IsCallable(func)) {
		throw new $TypeError(P + 'is not a function');
	}

	// 7.3.9.6
	return func;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var hasSymbols = require('has-symbols')();

var $TypeError = GetIntrinsic('%TypeError%');

var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%', true);
var $gOPS = hasSymbols && GetIntrinsic('%Object.getOwnPropertySymbols%', true);
var keys = require('object-keys');

var esType = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getownpropertykeys

module.exports = function GetOwnPropertyKeys(O, Type) {
	if (esType(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (Type === 'Symbol') {
		return $gOPS ? $gOPS(O) : [];
	}
	if (Type === 'String') {
		if (!$gOPN) {
			return keys(O);
		}
		return $gOPN(O);
	}
	throw new $TypeError('Assertion failed: `Type` must be `"String"` or `"Symbol"`');
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Function = GetIntrinsic('%Function%');
var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsConstructor = require('./IsConstructor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getprototypefromconstructor

module.exports = function GetPrototypeFromConstructor(constructor, intrinsicDefaultProto) {
	var intrinsic = GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
	if (!IsConstructor(constructor)) {
		throw new $TypeError('Assertion failed: `constructor` must be a constructor');
	}
	var proto = Get(constructor, 'prototype');
	if (Type(proto) !== 'Object') {
		if (!(constructor instanceof $Function)) {
			// ignore other realms, for now
			throw new $TypeError('cross-realm constructors not currently supported');
		}
		proto = intrinsic;
	}
	return proto;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');
var regexTester = require('../helpers/regexTester');
var every = require('../helpers/every');

var $charAt = callBound('String.prototype.charAt');
var $strSlice = callBound('String.prototype.slice');
var $indexOf = callBound('String.prototype.indexOf');
var $parseInt = parseInt;

var isDigit = regexTester(/^[0-9]$/);

var inspect = require('object-inspect');

var Get = require('./Get');
var IsArray = require('./IsArray');
var IsInteger = require('./IsInteger');
var ToObject = require('./ToObject');
var ToString = require('./ToString');
var Type = require('./Type');

var canDistinguishSparseFromUndefined = 0 in [undefined]; // IE 6 - 8 have a bug where this returns false

var isStringOrHole = function (capture, index, arr) {
	return Type(capture) === 'String' || (canDistinguishSparseFromUndefined ? !(index in arr) : Type(capture) === 'Undefined');
};

// http://262.ecma-international.org/9.0/#sec-getsubstitution

// eslint-disable-next-line max-statements, max-params, max-lines-per-function
module.exports = function GetSubstitution(matched, str, position, captures, namedCaptures, replacement) {
	if (Type(matched) !== 'String') {
		throw new $TypeError('Assertion failed: `matched` must be a String');
	}
	var matchLength = matched.length;

	if (Type(str) !== 'String') {
		throw new $TypeError('Assertion failed: `str` must be a String');
	}
	var stringLength = str.length;

	if (!IsInteger(position) || position < 0 || position > stringLength) {
		throw new $TypeError('Assertion failed: `position` must be a nonnegative integer, and less than or equal to the length of `string`, got ' + inspect(position));
	}

	if (!IsArray(captures) || !every(captures, isStringOrHole)) {
		throw new $TypeError('Assertion failed: `captures` must be a List of Strings, got ' + inspect(captures));
	}

	if (Type(replacement) !== 'String') {
		throw new $TypeError('Assertion failed: `replacement` must be a String');
	}

	var tailPos = position + matchLength;
	var m = captures.length;
	if (Type(namedCaptures) !== 'Undefined') {
		namedCaptures = ToObject(namedCaptures); // eslint-disable-line no-param-reassign
	}

	var result = '';
	for (var i = 0; i < replacement.length; i += 1) {
		// if this is a $, and it's not the end of the replacement
		var current = $charAt(replacement, i);
		var isLast = (i + 1) >= replacement.length;
		var nextIsLast = (i + 2) >= replacement.length;
		if (current === '$' && !isLast) {
			var next = $charAt(replacement, i + 1);
			if (next === '$') {
				result += '$';
				i += 1;
			} else if (next === '&') {
				result += matched;
				i += 1;
			} else if (next === '`') {
				result += position === 0 ? '' : $strSlice(str, 0, position - 1);
				i += 1;
			} else if (next === "'") {
				result += tailPos >= stringLength ? '' : $strSlice(str, tailPos);
				i += 1;
			} else {
				var nextNext = nextIsLast ? null : $charAt(replacement, i + 2);
				if (isDigit(next) && next !== '0' && (nextIsLast || !isDigit(nextNext))) {
					// $1 through $9, and not followed by a digit
					var n = $parseInt(next, 10);
					// if (n > m, impl-defined)
					result += n <= m && Type(captures[n - 1]) === 'Undefined' ? '' : captures[n - 1];
					i += 1;
				} else if (isDigit(next) && (nextIsLast || isDigit(nextNext))) {
					// $00 through $99
					var nn = next + nextNext;
					var nnI = $parseInt(nn, 10) - 1;
					// if nn === '00' or nn > m, impl-defined
					result += nn <= m && Type(captures[nnI]) === 'Undefined' ? '' : captures[nnI];
					i += 2;
				} else if (next === '<') {
					// eslint-disable-next-line max-depth
					if (Type(namedCaptures) === 'Undefined') {
						result += '$<';
						i += 2;
					} else {
						var endIndex = $indexOf(replacement, '>', i);
						// eslint-disable-next-line max-depth
						if (endIndex > -1) {
							var groupName = $strSlice(replacement, i + '$<'.length, endIndex);
							var capture = Get(namedCaptures, groupName);
							// eslint-disable-next-line max-depth
							if (Type(capture) !== 'Undefined') {
								result += ToString(capture);
							}
							i += ('<' + groupName + '>').length;
						}
					}
				} else {
					result += '$';
				}
			}
		} else {
			// the final $, or else not a $
			result += $charAt(replacement, i);
		}
	}
	return result;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var ToObject = require('./ToObject');

// https://ecma-international.org/ecma-262/6.0/#sec-getv

module.exports = function GetV(V, P) {
	// 7.3.2.1
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// 7.3.2.2-3
	var O = ToObject(V);

	// 7.3.2.4
	return O[P];
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var has = require('has');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty

module.exports = function HasOwnProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	return has(O, P);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-hasproperty

module.exports = function HasProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	return P in O;
};
'use strict';

var floor = require('./floor');
var modulo = require('./modulo');

var timeConstants = require('../helpers/timeConstants');
var msPerHour = timeConstants.msPerHour;
var HoursPerDay = timeConstants.HoursPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function HourFromTime(t) {
	return modulo(floor(t / msPerHour), HoursPerDay);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DaysInYear = require('./DaysInYear');
var YearFromTime = require('./YearFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function InLeapYear(t) {
	var days = DaysInYear(YearFromTime(t));
	if (days === 365) {
		return 0;
	}
	if (days === 366) {
		return 1;
	}
	throw new $EvalError('Assertion failed: there are not 365 or 366 days in a year, got: ' + days);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $hasInstance = GetIntrinsic('Symbol.hasInstance', true);

var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsCallable = require('./IsCallable');
var OrdinaryHasInstance = require('./OrdinaryHasInstance');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-instanceofoperator

module.exports = function InstanceofOperator(O, C) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	var instOfHandler = $hasInstance ? GetMethod(C, $hasInstance) : void 0;
	if (typeof instOfHandler !== 'undefined') {
		return ToBoolean(Call(instOfHandler, C, [O]));
	}
	if (!IsCallable(C)) {
		throw new $TypeError('`C` is not Callable');
	}
	return OrdinaryHasInstance(C, O);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var IsArray = require('./IsArray');
var GetV = require('./GetV');
var IsPropertyKey = require('./IsPropertyKey');

// https://ecma-international.org/ecma-262/6.0/#sec-invoke

module.exports = function Invoke(O, P) {
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	var argumentsList = arguments.length > 2 ? arguments[2] : [];
	if (!IsArray(argumentsList)) {
		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
	}
	var func = GetV(O, P);
	return Call(func, O, argumentsList);
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isaccessordescriptor

module.exports = function IsAccessorDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Get]]') && !has(Desc, '[[Set]]')) {
		return false;
	}

	return true;
};
'use strict';

// https://ecma-international.org/ecma-262/6.0/#sec-isarray
module.exports = require('../helpers/IsArray');
'use strict';

// http://262.ecma-international.org/5.1/#sec-9.11

module.exports = require('is-callable');
'use strict';

var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');

// https://262.ecma-international.org/6.0/#sec-iscompatiblepropertydescriptor

module.exports = function IsCompatiblePropertyDescriptor(Extensible, Desc, Current) {
	return ValidateAndApplyPropertyDescriptor(undefined, undefined, Extensible, Desc, Current);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $isConcatSpreadable = GetIntrinsic('%Symbol.isConcatSpreadable%', true);

var Get = require('./Get');
var IsArray = require('./IsArray');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable

module.exports = function IsConcatSpreadable(O) {
	if (Type(O) !== 'Object') {
		return false;
	}
	if ($isConcatSpreadable) {
		var spreadable = Get(O, $isConcatSpreadable);
		if (typeof spreadable !== 'undefined') {
			return ToBoolean(spreadable);
		}
	}
	return IsArray(O);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic.js');

var $construct = GetIntrinsic('%Reflect.construct%', true);

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
try {
	DefinePropertyOrThrow({}, '', { '[[Get]]': function () {} });
} catch (e) {
	// Accessor properties aren't supported
	DefinePropertyOrThrow = null;
}

// https://ecma-international.org/ecma-262/6.0/#sec-isconstructor

if (DefinePropertyOrThrow && $construct) {
	var isConstructorMarker = {};
	var badArrayLike = {};
	DefinePropertyOrThrow(badArrayLike, 'length', {
		'[[Get]]': function () {
			throw isConstructorMarker;
		},
		'[[Enumerable]]': true
	});

	module.exports = function IsConstructor(argument) {
		try {
			// `Reflect.construct` invokes `IsConstructor(target)` before `Get(args, 'length')`:
			$construct(argument, badArrayLike);
		} catch (err) {
			return err === isConstructorMarker;
		}
	};
} else {
	module.exports = function IsConstructor(argument) {
		// unfortunately there's no way to truly check this without try/catch `new argument` in old environments
		return typeof argument === 'function' && !!argument.prototype;
	};
}
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isdatadescriptor

module.exports = function IsDataDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Value]]') && !has(Desc, '[[Writable]]')) {
		return false;
	}

	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $preventExtensions = GetIntrinsic('%Object.preventExtensions%', true);
var $isExtensible = GetIntrinsic('%Object.isExtensible%', true);

var isPrimitive = require('../helpers/isPrimitive');

// https://ecma-international.org/ecma-262/6.0/#sec-isextensible-o

module.exports = $preventExtensions
	? function IsExtensible(obj) {
		return !isPrimitive(obj) && $isExtensible(obj);
	}
	: function IsExtensible(obj) {
		return !isPrimitive(obj);
	};
'use strict';

var assertRecord = require('../helpers/assertRecord');

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isgenericdescriptor

module.exports = function IsGenericDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!IsAccessorDescriptor(Desc) && !IsDataDescriptor(Desc)) {
		return true;
	}

	return false;
};
'use strict';

var abs = require('./abs');
var floor = require('./floor');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');

// https://ecma-international.org/ecma-262/6.0/#sec-isinteger

module.exports = function IsInteger(argument) {
	if (typeof argument !== 'number' || $isNaN(argument) || !$isFinite(argument)) {
		return false;
	}
	var absValue = abs(argument);
	return floor(absValue) === absValue;
};
'use strict';

var callBound = require('call-bind/callBound');

var $PromiseThen = callBound('Promise.prototype.then', true);

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ispromise

module.exports = function IsPromise(x) {
	if (Type(x) !== 'Object') {
		return false;
	}
	if (!$PromiseThen) { // Promises are not supported
		return false;
	}
	try {
		$PromiseThen(x); // throws if not a promise
	} catch (e) {
		return false;
	}
	return true;
};
'use strict';

// https://ecma-international.org/ecma-262/6.0/#sec-ispropertykey

module.exports = function IsPropertyKey(argument) {
	return typeof argument === 'string' || typeof argument === 'symbol';
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $match = GetIntrinsic('%Symbol.match%', true);

var hasRegExpMatcher = require('is-regex');

var ToBoolean = require('./ToBoolean');

// https://ecma-international.org/ecma-262/6.0/#sec-isregexp

module.exports = function IsRegExp(argument) {
	if (!argument || typeof argument !== 'object') {
		return false;
	}
	if ($match) {
		var isRegExp = argument[$match];
		if (typeof isRegExp !== 'undefined') {
			return ToBoolean(isRegExp);
		}
	}
	return hasRegExpMatcher(argument);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');

var isSharedArrayBuffer = require('is-shared-array-buffer');

// https://262.ecma-international.org/8.0/#sec-issharedarraybuffer

module.exports = function IsSharedArrayBuffer(obj) {
	if (Type(obj) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	return isSharedArrayBuffer(obj);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isPrefixOf = require('../helpers/isPrefixOf');

// var callBound = require('call-bind/callBound');

// var $charAt = callBound('String.prototype.charAt');

var Type = require('./Type');

// https://262.ecma-international.org/9.0/#sec-isstringprefix

module.exports = function IsStringPrefix(p, q) {
	if (Type(p) !== 'String') {
		throw new $TypeError('Assertion failed: "p" must be a String');
	}

	if (Type(q) !== 'String') {
		throw new $TypeError('Assertion failed: "q" must be a String');
	}

	return isPrefixOf(p, q);
	/*
	if (p === q || p === '') {
		return true;
	}

	var pLength = p.length;
	var qLength = q.length;
	if (pLength >= qLength) {
		return false;
	}

	// assert: pLength < qLength

	for (var i = 0; i < pLength; i += 1) {
		if ($charAt(p, i) !== $charAt(q, i)) {
			return false;
		}
	}
	return true;
	*/
};
'use strict';

var callBound = require('call-bind/callBound');
var $arrayPush = callBound('Array.prototype.push');

var GetIterator = require('./GetIterator');
var IteratorStep = require('./IteratorStep');
var IteratorValue = require('./IteratorValue');

// https://262.ecma-international.org/8.0/#sec-iterabletolist

module.exports = function IterableToList(items, method) {
	var iterator = GetIterator(items, method);
	var values = [];
	var next = true;
	while (next) {
		next = IteratorStep(iterator);
		if (next) {
			var nextValue = IteratorValue(next);
			$arrayPush(values, nextValue);
		}
	}
	return values;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose

module.exports = function IteratorClose(iterator, completion) {
	if (Type(iterator) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterator) is not Object');
	}
	if (!IsCallable(completion)) {
		throw new $TypeError('Assertion failed: completion is not a thunk for a Completion Record');
	}
	var completionThunk = completion;

	var iteratorReturn = GetMethod(iterator, 'return');

	if (typeof iteratorReturn === 'undefined') {
		return completionThunk();
	}

	var completionRecord;
	try {
		var innerResult = Call(iteratorReturn, iterator, []);
	} catch (e) {
		// if we hit here, then "e" is the innerResult completion that needs re-throwing

		// if the completion is of type "throw", this will throw.
		completionThunk();
		completionThunk = null; // ensure it's not called twice.

		// if not, then return the innerResult completion
		throw e;
	}
	completionRecord = completionThunk(); // if innerResult worked, then throw if the completion does
	completionThunk = null; // ensure it's not called twice.

	if (Type(innerResult) !== 'Object') {
		throw new $TypeError('iterator .return must return an object');
	}

	return completionRecord;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete

module.exports = function IteratorComplete(iterResult) {
	if (Type(iterResult) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
	}
	return ToBoolean(Get(iterResult, 'done'));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Invoke = require('./Invoke');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratornext

module.exports = function IteratorNext(iterator, value) {
	var result = Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);
	if (Type(result) !== 'Object') {
		throw new $TypeError('iterator next must return an object');
	}
	return result;
};
'use strict';

var IteratorComplete = require('./IteratorComplete');
var IteratorNext = require('./IteratorNext');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep

module.exports = function IteratorStep(iterator) {
	var result = IteratorNext(iterator);
	var done = IteratorComplete(result);
	return done === true ? false : result;
};

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue

module.exports = function IteratorValue(iterResult) {
	if (Type(iterResult) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
	}
	return Get(iterResult, 'value');
};

'use strict';

var $isFinite = require('../helpers/isFinite');
var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.13

module.exports = function MakeDate(day, time) {
	if (!$isFinite(day) || !$isFinite(time)) {
		return NaN;
	}
	return (day * msPerDay) + time;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $DateUTC = GetIntrinsic('%Date.UTC%');

var $isFinite = require('../helpers/isFinite');

var DateFromTime = require('./DateFromTime');
var Day = require('./Day');
var floor = require('./floor');
var modulo = require('./modulo');
var MonthFromTime = require('./MonthFromTime');
var ToInteger = require('./ToInteger');
var YearFromTime = require('./YearFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.12

module.exports = function MakeDay(year, month, date) {
	if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) {
		return NaN;
	}
	var y = ToInteger(year);
	var m = ToInteger(month);
	var dt = ToInteger(date);
	var ym = y + floor(m / 12);
	var mn = modulo(m, 12);
	var t = $DateUTC(ym, mn, 1);
	if (YearFromTime(t) !== ym || MonthFromTime(t) !== mn || DateFromTime(t) !== 1) {
		return NaN;
	}
	return Day(t) + dt - 1;
};
'use strict';

var $isFinite = require('../helpers/isFinite');
var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var msPerMinute = timeConstants.msPerMinute;
var msPerHour = timeConstants.msPerHour;

var ToInteger = require('./ToInteger');

// https://262.ecma-international.org/5.1/#sec-15.9.1.11

module.exports = function MakeTime(hour, min, sec, ms) {
	if (!$isFinite(hour) || !$isFinite(min) || !$isFinite(sec) || !$isFinite(ms)) {
		return NaN;
	}
	var h = ToInteger(hour);
	var m = ToInteger(min);
	var s = ToInteger(sec);
	var milli = ToInteger(ms);
	var t = (h * msPerHour) + (m * msPerMinute) + (s * msPerSecond) + milli;
	return t;
};
'use strict';

var floor = require('./floor');
var modulo = require('./modulo');

var timeConstants = require('../helpers/timeConstants');
var msPerMinute = timeConstants.msPerMinute;
var MinutesPerHour = timeConstants.MinutesPerHour;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function MinFromTime(t) {
	return modulo(floor(t / msPerMinute), MinutesPerHour);
};
'use strict';

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');

// https://262.ecma-international.org/5.1/#sec-15.9.1.4

module.exports = function MonthFromTime(t) {
	var day = DayWithinYear(t);
	if (0 <= day && day < 31) {
		return 0;
	}
	var leap = InLeapYear(t);
	if (31 <= day && day < (59 + leap)) {
		return 1;
	}
	if ((59 + leap) <= day && day < (90 + leap)) {
		return 2;
	}
	if ((90 + leap) <= day && day < (120 + leap)) {
		return 3;
	}
	if ((120 + leap) <= day && day < (151 + leap)) {
		return 4;
	}
	if ((151 + leap) <= day && day < (181 + leap)) {
		return 5;
	}
	if ((181 + leap) <= day && day < (212 + leap)) {
		return 6;
	}
	if ((212 + leap) <= day && day < (243 + leap)) {
		return 7;
	}
	if ((243 + leap) <= day && day < (273 + leap)) {
		return 8;
	}
	if ((273 + leap) <= day && day < (304 + leap)) {
		return 9;
	}
	if ((304 + leap) <= day && day < (334 + leap)) {
		return 10;
	}
	if ((334 + leap) <= day && day < (365 + leap)) {
		return 11;
	}
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $String = GetIntrinsic('%String%');
var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');

// https://262.ecma-international.org/9.0/#sec-tostring-applied-to-the-number-type

module.exports = function NumberToString(m) {
	if (Type(m) !== 'Number') {
		throw new $TypeError('Assertion failed: "m" must be a String');
	}

	return $String(m);
};

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $ObjectCreate = GetIntrinsic('%Object.create%', true);
var $TypeError = GetIntrinsic('%TypeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');

var Type = require('./Type');

var hasProto = !({ __proto__: null } instanceof Object);

// https://ecma-international.org/ecma-262/6.0/#sec-objectcreate

module.exports = function ObjectCreate(proto, internalSlotsList) {
	if (proto !== null && Type(proto) !== 'Object') {
		throw new $TypeError('Assertion failed: `proto` must be null or an object');
	}
	var slots = arguments.length < 2 ? [] : internalSlotsList;
	if (slots.length > 0) {
		throw new $SyntaxError('es-abstract does not yet support internal slots');
	}

	if ($ObjectCreate) {
		return $ObjectCreate(proto);
	}
	if (hasProto) {
		return { __proto__: proto };
	}

	if (proto === null) {
		throw new $SyntaxError('native Object.create support is required to create null objects');
	}
	var T = function T() {};
	T.prototype = proto;
	return new T();
};
'use strict';

var callBound = require('call-bind/callBound');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var Get = require('./Get');
var ToObject = require('./ToObject');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');

var forEach = require('../helpers/forEach');
var getOwnPropertyDescriptor = require('../helpers/getOwnPropertyDescriptor');
var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');

var $push = callBound('Array.prototype.push');

// https://262.ecma-international.org/6.0/#sec-objectdefineproperties
module.exports = function ObjectDefineProperties(O, Properties) {
	var props = ToObject(Properties); // step 1
	var keys = OwnPropertyKeys(props); // step 2
	var descriptors = []; // step 3

	forEach(keys, function (nextKey) { // step 4
		var propDesc = ToPropertyDescriptor(getOwnPropertyDescriptor(props, nextKey)); // step 4.a
		if (typeof propDesc !== 'undefined' && propDesc['[[Enumerable]]']) { // step 4.b
			var descObj = Get(props, nextKey); // step 4.b.i
			var desc = ToPropertyDescriptor(descObj); // step 4.b.ii
			$push(descriptors, [nextKey, desc]); // step 4.b.iii
		}
	});

	forEach(descriptors, function (pair) { // step 5
		var P = pair[0]; // step 5.a
		var desc = pair[1]; // step 5.b
		desc = FromPropertyDescriptor(desc); // TODO: remove this once DefinePropertyOrThrow is fixed
		DefinePropertyOrThrow(O, P, desc); // step 5.c
	});

	return O; // step 6
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var $TypeError = GetIntrinsic('%TypeError%');

var GetPrototypeFromConstructor = require('./GetPrototypeFromConstructor');
var IsArray = require('./IsArray');
var ObjectCreate = require('./ObjectCreate');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinarycreatefromconstructor

module.exports = function OrdinaryCreateFromConstructor(constructor, intrinsicDefaultProto) {
	GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
	var proto = GetPrototypeFromConstructor(constructor, intrinsicDefaultProto);
	var slots = arguments.length < 3 ? [] : arguments[2];
	if (!IsArray(slots)) {
		throw new $TypeError('Assertion failed: if provided, `internalSlotsList` must be a List');
	}
	return ObjectCreate(proto, slots);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var IsPropertyKey = require('./IsPropertyKey');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var SameValue = require('./SameValue');
var Type = require('./Type');
var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinarydefineownproperty

module.exports = function OrdinaryDefineOwnProperty(O, P, Desc) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (!$gOPD) {
		// ES3/IE 8 fallback
		if (IsAccessorDescriptor(Desc)) {
			throw new $SyntaxError('This environment does not support accessor property descriptors.');
		}
		var creatingNormalDataProperty = !(P in O)
			&& Desc['[[Writable]]']
			&& Desc['[[Enumerable]]']
			&& Desc['[[Configurable]]']
			&& '[[Value]]' in Desc;
		var settingExistingDataProperty = (P in O)
			&& (!('[[Configurable]]' in Desc) || Desc['[[Configurable]]'])
			&& (!('[[Enumerable]]' in Desc) || Desc['[[Enumerable]]'])
			&& (!('[[Writable]]' in Desc) || Desc['[[Writable]]'])
			&& '[[Value]]' in Desc;
		if (creatingNormalDataProperty || settingExistingDataProperty) {
			O[P] = Desc['[[Value]]']; // eslint-disable-line no-param-reassign
			return SameValue(O[P], Desc['[[Value]]']);
		}
		throw new $SyntaxError('This environment does not support defining non-writable, non-enumerable, or non-configurable properties');
	}
	var desc = $gOPD(O, P);
	var current = desc && ToPropertyDescriptor(desc);
	var extensible = IsExtensible(O);
	return ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');

var has = require('has');

var IsArray = require('./IsArray');
var IsPropertyKey = require('./IsPropertyKey');
var IsRegExp = require('./IsRegExp');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty

module.exports = function OrdinaryGetOwnProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	if (!has(O, P)) {
		return void 0;
	}
	if (!$gOPD) {
		// ES3 / IE 8 fallback
		var arrayLength = IsArray(O) && P === 'length';
		var regexLastIndex = IsRegExp(O) && P === 'lastIndex';
		return {
			'[[Configurable]]': !(arrayLength || regexLastIndex),
			'[[Enumerable]]': $isEnumerable(O, P),
			'[[Value]]': O[P],
			'[[Writable]]': true
		};
	}
	return ToPropertyDescriptor($gOPD(O, P));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $getProto = require('../helpers/getProto');

var Type = require('./Type');

// https://262.ecma-international.org/7.0/#sec-ordinarygetprototypeof

module.exports = function OrdinaryGetPrototypeOf(O) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!$getProto) {
		throw new $TypeError('This environment does not support fetching prototypes.');
	}
	return $getProto(O);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasinstance

module.exports = function OrdinaryHasInstance(C, O) {
	if (IsCallable(C) === false) {
		return false;
	}
	if (Type(O) !== 'Object') {
		return false;
	}
	var P = Get(C, 'prototype');
	if (Type(P) !== 'Object') {
		throw new $TypeError('OrdinaryHasInstance called on an object with an invalid prototype property.');
	}
	return O instanceof C;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasproperty

module.exports = function OrdinaryHasProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	return P in O;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $setProto = require('../helpers/setProto');

var OrdinaryGetPrototypeOf = require('./OrdinaryGetPrototypeOf');
var Type = require('./Type');

// https://262.ecma-international.org/7.0/#sec-ordinarysetprototypeof

module.exports = function OrdinarySetPrototypeOf(O, V) {
	if (Type(V) !== 'Object' && Type(V) !== 'Null') {
		throw new $TypeError('Assertion failed: V must be Object or Null');
	}
	/*
	var extensible = IsExtensible(O);
	var current = OrdinaryGetPrototypeOf(O);
	if (SameValue(V, current)) {
		return true;
	}
	if (!extensible) {
		return false;
	}
	*/
	try {
		$setProto(O, V);
	} catch (e) {
		return false;
	}
	return OrdinaryGetPrototypeOf(O) === V;
	/*
	var p = V;
	var done = false;
	while (!done) {
		if (p === null) {
			done = true;
		} else if (SameValue(p, O)) {
			return false;
		} else {
			if (wat) {
				done = true;
			} else {
				p = p.[[Prototype]];
			}
		}
	}
	O.[[Prototype]] = V;
	return true;
	*/
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

var inspect = require('object-inspect');

// https://262.ecma-international.org/8.0/#sec-ordinarytoprimitive

module.exports = function OrdinaryToPrimitive(O, hint) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (/* Type(hint) !== 'String' || */ hint !== 'string' && hint !== 'number') {
		throw new $TypeError('Assertion failed: `hint` must be "string" or "number"');
	}

	var methodNames = hint === 'string' ? ['toString', 'valueOf'] : ['valueOf', 'toString'];

	for (var i = 0; i < methodNames.length; i += 1) {
		var name = methodNames[i];
		var method = Get(O, name);
		if (IsCallable(method)) {
			var result = Call(method, O);
			if (Type(result) !== 'Object') {
				return result;
			}
		}
	}

	throw new $TypeError('No primitive value for ' + inspect(O));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBind = require('call-bind');

var $resolve = GetIntrinsic('%Promise.resolve%', true);
var $PromiseResolve = $resolve && callBind($resolve);

// https://262.ecma-international.org/9.0/#sec-promise-resolve

module.exports = function PromiseResolve(C, x) {
	if (!$PromiseResolve) {
		throw new SyntaxError('This environment does not support Promises.');
	}
	return $PromiseResolve(C, x);
};

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');
var forEach = require('../helpers/forEach');
var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');

var $charCodeAt = callBound('String.prototype.charCodeAt');
var $strSplit = callBound('String.prototype.split');

var Type = require('./Type');
var UnicodeEscape = require('./UnicodeEscape');
var UTF16Encoding = require('./UTF16Encoding');

var has = require('has');

// https://262.ecma-international.org/10.0/#sec-quotejsonstring

var escapes = {
	'\u0008': '\\b',
	'\u0009': '\\t',
	'\u000A': '\\n',
	'\u000C': '\\f',
	'\u000D': '\\r',
	'\u0022': '\\"',
	'\u005c': '\\\\'
};

module.exports = function QuoteJSONString(value) {
	if (Type(value) !== 'String') {
		throw new $TypeError('Assertion failed: `value` must be a String');
	}
	var product = '"';
	if (value) {
		forEach($strSplit(value), function (C) {
			if (has(escapes, C)) {
				product += escapes[C];
			} else {
				var cCharCode = $charCodeAt(C, 0);
				if (cCharCode < 0x20 || isLeadingSurrogate(C) || isTrailingSurrogate(C)) {
					product += UnicodeEscape(C);
				} else {
					product += UTF16Encoding(cCharCode);
				}
			}
		});
	}
	product += '"';
	return product;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $RegExp = GetIntrinsic('%RegExp%');

// var RegExpAlloc = require('./RegExpAlloc');
// var RegExpInitialize = require('./RegExpInitialize');
var ToString = require('./ToString');

// https://262.ecma-international.org/6.0/#sec-regexpcreate

module.exports = function RegExpCreate(P, F) {
	// var obj = RegExpAlloc($RegExp);
	// return RegExpInitialize(obj, P, F);

	// covers spec mechanics; bypass regex brand checking
	var pattern = typeof P === 'undefined' ? '' : ToString(P);
	var flags = typeof F === 'undefined' ? '' : ToString(F);
	return new $RegExp(pattern, flags);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var regexExec = require('call-bind/callBound')('RegExp.prototype.exec');

var Call = require('./Call');
var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-regexpexec

module.exports = function RegExpExec(R, S) {
	if (Type(R) !== 'Object') {
		throw new $TypeError('Assertion failed: `R` must be an Object');
	}
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	var exec = Get(R, 'exec');
	if (IsCallable(exec)) {
		var result = Call(exec, R, [S]);
		if (result === null || Type(result) === 'Object') {
			return result;
		}
		throw new $TypeError('"exec" method must return `null` or an Object');
	}
	return regexExec(R, S);
};
'use strict';

module.exports = require('../5/CheckObjectCoercible');
'use strict';

var $isNaN = require('../helpers/isNaN');

// http://262.ecma-international.org/5.1/#sec-9.12

module.exports = function SameValue(x, y) {
	if (x === y) { // 0 === -0, but they are not identical.
		if (x === 0) { return 1 / x === 1 / y; }
		return true;
	}
	return $isNaN(x) && $isNaN(y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var SameValue = require('./SameValue');

// https://262.ecma-international.org/7.0/#sec-samevaluenonnumber

module.exports = function SameValueNonNumber(x, y) {
	if (typeof x === 'number' || typeof x !== typeof y) {
		throw new $TypeError('SameValueNonNumber requires two non-number values of the same type.');
	}
	return SameValue(x, y);
};
'use strict';

var $isNaN = require('../helpers/isNaN');

// https://ecma-international.org/ecma-262/6.0/#sec-samevaluezero

module.exports = function SameValueZero(x, y) {
	return (x === y) || ($isNaN(x) && $isNaN(y));
};
'use strict';

var floor = require('./floor');
var modulo = require('./modulo');

var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var SecondsPerMinute = timeConstants.SecondsPerMinute;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function SecFromTime(t) {
	return modulo(floor(t / msPerSecond), SecondsPerMinute);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// IE 9 does not throw in strict mode when writability/configurability/extensibility is violated
var noThrowOnStrictViolation = (function () {
	try {
		delete [].length;
		return true;
	} catch (e) {
		return false;
	}
}());

// https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw

module.exports = function Set(O, P, V, Throw) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	if (Type(Throw) !== 'Boolean') {
		throw new $TypeError('Assertion failed: `Throw` must be a Boolean');
	}
	if (Throw) {
		O[P] = V; // eslint-disable-line no-param-reassign
		if (noThrowOnStrictViolation && !SameValue(O[P], V)) {
			throw new $TypeError('Attempted to assign to readonly property.');
		}
		return true;
	}
	try {
		O[P] = V; // eslint-disable-line no-param-reassign
		return noThrowOnStrictViolation ? SameValue(O[P], V) : true;
	} catch (e) {
		return false;
	}

};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var HasOwnProperty = require('./HasOwnProperty');
var IsExtensible = require('./IsExtensible');
var IsInteger = require('./IsInteger');
var Type = require('./Type');

// https://262.ecma-international.org/9.0/#sec-setfunctionlength

module.exports = function SetFunctionLength(F, length) {
	if (typeof F !== 'function' || !IsExtensible(F) || HasOwnProperty(F, 'length')) {
		throw new $TypeError('Assertion failed: `F` must be an extensible function and lack an own `length` property');
	}
	if (Type(length) !== 'Number') {
		throw new $TypeError('Assertion failed: `length` must be a Number');
	}
	if (length < 0 || !IsInteger(length)) {
		throw new $TypeError('Assertion failed: `length` must be an integer >= 0');
	}
	return DefinePropertyOrThrow(F, 'length', {
		'[[Configurable]]': true,
		'[[Enumerable]]': false,
		'[[Value]]': length,
		'[[Writable]]': false
	});
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var has = require('has');

var $TypeError = GetIntrinsic('%TypeError%');

var getSymbolDescription = require('get-symbol-description');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var IsExtensible = require('./IsExtensible');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-setfunctionname

module.exports = function SetFunctionName(F, name) {
	if (typeof F !== 'function') {
		throw new $TypeError('Assertion failed: `F` must be a function');
	}
	if (!IsExtensible(F) || has(F, 'name')) {
		throw new $TypeError('Assertion failed: `F` must be extensible, and must not have a `name` own property');
	}
	var nameType = Type(name);
	if (nameType !== 'Symbol' && nameType !== 'String') {
		throw new $TypeError('Assertion failed: `name` must be a Symbol or a String');
	}
	if (nameType === 'Symbol') {
		var description = getSymbolDescription(name);
		// eslint-disable-next-line no-param-reassign
		name = typeof description === 'undefined' ? '' : '[' + description + ']';
	}
	if (arguments.length > 2) {
		var prefix = arguments[2];
		// eslint-disable-next-line no-param-reassign
		name = prefix + ' ' + name;
	}
	return DefinePropertyOrThrow(F, 'name', {
		'[[Value]]': name,
		'[[Writable]]': false,
		'[[Enumerable]]': false,
		'[[Configurable]]': true
	});
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');
var $preventExtensions = GetIntrinsic('%Object.preventExtensions%', true);
var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%', true);

var forEach = require('../helpers/forEach');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-setintegritylevel

module.exports = function SetIntegrityLevel(O, level) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (level !== 'sealed' && level !== 'frozen') {
		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
	}
	if (!$preventExtensions) {
		throw new $SyntaxError('SetIntegrityLevel requires native `Object.preventExtensions` support');
	}
	var status = $preventExtensions(O);
	if (!status) {
		return false;
	}
	if (!$gOPN) {
		throw new $SyntaxError('SetIntegrityLevel requires native `Object.getOwnPropertyNames` support');
	}
	var theKeys = $gOPN(O);
	if (level === 'sealed') {
		forEach(theKeys, function (k) {
			DefinePropertyOrThrow(O, k, { configurable: false });
		});
	} else if (level === 'frozen') {
		forEach(theKeys, function (k) {
			var currentDesc = $gOPD(O, k);
			if (typeof currentDesc !== 'undefined') {
				var desc;
				if (IsAccessorDescriptor(ToPropertyDescriptor(currentDesc))) {
					desc = { configurable: false };
				} else {
					desc = { configurable: false, writable: false };
				}
				DefinePropertyOrThrow(O, k, desc);
			}
		});
	}
	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $species = GetIntrinsic('%Symbol.species%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var IsConstructor = require('./IsConstructor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor

module.exports = function SpeciesConstructor(O, defaultConstructor) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	var C = O.constructor;
	if (typeof C === 'undefined') {
		return defaultConstructor;
	}
	if (Type(C) !== 'Object') {
		throw new $TypeError('O.constructor is not an Object');
	}
	var S = $species ? C[$species] : void 0;
	if (S == null) {
		return defaultConstructor;
	}
	if (IsConstructor(S)) {
		return S;
	}
	throw new $TypeError('no constructor found');
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');

var IsInteger = require('./IsInteger');
var Type = require('./Type');

var $charAt = callBound('String.prototype.charAt');

// https://262.ecma-international.org/6.0/#sec-splitmatch

module.exports = function SplitMatch(S, q, R) {
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	if (!IsInteger(q)) {
		throw new $TypeError('Assertion failed: `q` must be an integer');
	}
	if (Type(R) !== 'String') {
		throw new $TypeError('Assertion failed: `R` must be a String');
	}
	var r = R.length;
	var s = S.length;
	if (q + r > s) {
		return false;
	}

	for (var i = 0; i < r; i += 1) {
		if ($charAt(S, q + i) !== $charAt(R, i)) {
			return false;
		}
	}

	return q + r;
};
'use strict';

var Type = require('./Type');

// https://262.ecma-international.org/5.1/#sec-11.9.6

module.exports = function StrictEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType !== yType) {
		return false;
	}
	if (xType === 'Undefined' || xType === 'Null') {
		return true;
	}
	return x === y; // shortcut for steps 4-7
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Object = GetIntrinsic('%Object%');
var $StringPrototype = GetIntrinsic('%String.prototype%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var Type = require('./Type');

var setProto = require('../helpers/setProto');

// https://262.ecma-international.org/6.0/#sec-stringcreate

module.exports = function StringCreate(value, prototype) {
	if (Type(value) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}

	var S = $Object(value);
	if (prototype !== $StringPrototype) {
		if (setProto) {
			setProto(S, prototype);
		} else {
			throw new $SyntaxError('StringCreate: a `proto` argument that is not `String.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
		}
	}

	var length = value.length;
	DefinePropertyOrThrow(S, 'length', {
		'[[Configurable]]': false,
		'[[Enumerable]]': false,
		'[[Value]]': length,
		'[[Writable]]': false
	});

	return S;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');
var $charAt = callBound('String.prototype.charAt');
var $stringToString = callBound('String.prototype.toString');

var CanonicalNumericIndexString = require('./CanonicalNumericIndexString');
var IsInteger = require('./IsInteger');
var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

var isNegativeZero = require('is-negative-zero');

// https://262.ecma-international.org/8.0/#sec-stringgetownproperty

module.exports = function StringGetOwnProperty(S, P) {
	var str;
	if (Type(S) === 'Object') {
		try {
			str = $stringToString(S);
		} catch (e) { /**/ }
	}
	if (Type(str) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a boxed string object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	if (Type(P) !== 'String') {
		return void undefined;
	}
	var index = CanonicalNumericIndexString(P);
	var len = str.length;
	if (typeof index === 'undefined' || !IsInteger(index) || isNegativeZero(index) || index < 0 || len <= index) {
		return void undefined;
	}
	var resultStr = $charAt(S, index);
	return {
		'[[Configurable]]': false,
		'[[Enumerable]]': true,
		'[[Value]]': resultStr,
		'[[Writable]]': false
	};
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $SymbolToString = callBound('Symbol.prototype.toString', true);

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-symboldescriptivestring

module.exports = function SymbolDescriptiveString(sym) {
	if (Type(sym) !== 'Symbol') {
		throw new $TypeError('Assertion failed: `sym` must be a Symbol');
	}
	return $SymbolToString(sym);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $TypeError = GetIntrinsic('%TypeError%');

var every = require('../helpers/every');
var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');

var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-testintegritylevel

module.exports = function TestIntegrityLevel(O, level) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (level !== 'sealed' && level !== 'frozen') {
		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
	}
	var status = IsExtensible(O);
	if (status) {
		return false;
	}
	var theKeys = OwnPropertyKeys(O);
	return theKeys.length === 0 || every(theKeys, function (k) {
		var currentDesc = $gOPD(O, k);
		if (typeof currentDesc !== 'undefined') {
			if (currentDesc.configurable) {
				return false;
			}
			if (level === 'frozen' && IsDataDescriptor(ToPropertyDescriptor(currentDesc)) && currentDesc.writable) {
				return false;
			}
		}
		return true;
	});
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Date = GetIntrinsic('%Date%');
var $Number = GetIntrinsic('%Number%');

var $isFinite = require('../helpers/isFinite');

var abs = require('./abs');
var ToNumber = require('./ToNumber');

// https://262.ecma-international.org/5.1/#sec-15.9.1.14

module.exports = function TimeClip(time) {
	if (!$isFinite(time) || abs(time) > 8.64e15) {
		return NaN;
	}
	return $Number(new $Date(ToNumber(time)));
};

'use strict';

var msPerDay = require('../helpers/timeConstants').msPerDay;

var DayFromYear = require('./DayFromYear');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function TimeFromYear(y) {
	return msPerDay * DayFromYear(y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $isNaN = require('../helpers/isNaN');
var padTimeComponent = require('../helpers/padTimeComponent');

var HourFromTime = require('./HourFromTime');
var MinFromTime = require('./MinFromTime');
var SecFromTime = require('./SecFromTime');
var Type = require('./Type');

// https://262.ecma-international.org/9.0/#sec-timestring

module.exports = function TimeString(tv) {
	if (Type(tv) !== 'Number' || $isNaN(tv)) {
		throw new $TypeError('Assertion failed: `tv` must be a non-NaN Number');
	}
	var hour = HourFromTime(tv);
	var minute = MinFromTime(tv);
	var second = SecFromTime(tv);
	return padTimeComponent(hour) + ':' + padTimeComponent(minute) + ':' + padTimeComponent(second) + '\x20GMT';
};
'use strict';

var modulo = require('./modulo');

var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.2

module.exports = function TimeWithinDay(t) {
	return modulo(t, msPerDay);
};

'use strict';

// http://262.ecma-international.org/5.1/#sec-9.2

module.exports = function ToBoolean(value) { return !!value; };
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $Date = GetIntrinsic('%Date%');

var $isNaN = require('../helpers/isNaN');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-todatestring

module.exports = function ToDateString(tv) {
	if (Type(tv) !== 'Number') {
		throw new $TypeError('Assertion failed: `tv` must be a Number');
	}
	if ($isNaN(tv)) {
		return 'Invalid Date';
	}
	return $Date(tv);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $RangeError = GetIntrinsic('%RangeError%');

var ToInteger = require('./ToInteger');
var ToLength = require('./ToLength');
var SameValueZero = require('./SameValueZero');

// https://262.ecma-international.org/8.0/#sec-toindex

module.exports = function ToIndex(value) {
	if (typeof value === 'undefined') {
		return 0;
	}
	var integerIndex = ToInteger(value);
	if (integerIndex < 0) {
		throw new $RangeError('index must be >= 0');
	}
	var index = ToLength(integerIndex);
	if (!SameValueZero(integerIndex, index)) {
		throw new $RangeError('index must be >= 0 and < 2 ** 53 - 1');
	}
	return index;
};
'use strict';

var ToUint16 = require('./ToUint16');

// https://ecma-international.org/ecma-262/6.0/#sec-toint16

module.exports = function ToInt16(argument) {
	var int16bit = ToUint16(argument);
	return int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;
};
'use strict';

var ToNumber = require('./ToNumber');

// http://262.ecma-international.org/5.1/#sec-9.5

module.exports = function ToInt32(x) {
	return ToNumber(x) >> 0;
};
'use strict';

var ToUint8 = require('./ToUint8');

// https://ecma-international.org/ecma-262/6.0/#sec-toint8

module.exports = function ToInt8(argument) {
	var int8bit = ToUint8(argument);
	return int8bit >= 0x80 ? int8bit - 0x100 : int8bit;
};
'use strict';

var ES5ToInteger = require('../5/ToInteger');

var ToNumber = require('./ToNumber');

// https://ecma-international.org/ecma-262/6.0/#sec-tointeger

module.exports = function ToInteger(value) {
	var number = ToNumber(value);
	return ES5ToInteger(number);
};
'use strict';

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');

var ToInteger = require('./ToInteger');

module.exports = function ToLength(argument) {
	var len = ToInteger(argument);
	if (len <= 0) { return 0; } // includes converting -0 to +0
	if (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }
	return len;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $Number = GetIntrinsic('%Number%');
var $RegExp = GetIntrinsic('%RegExp%');
var $parseInteger = GetIntrinsic('%parseInt%');

var callBound = require('call-bind/callBound');
var regexTester = require('../helpers/regexTester');
var isPrimitive = require('../helpers/isPrimitive');

var $strSlice = callBound('String.prototype.slice');
var isBinary = regexTester(/^0b[01]+$/i);
var isOctal = regexTester(/^0o[0-7]+$/i);
var isInvalidHexLiteral = regexTester(/^[-+]0x[0-9a-f]+$/i);
var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
var hasNonWS = regexTester(nonWSregex);

// whitespace from: https://es5.github.io/#x15.5.4.20
// implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
var ws = [
	'\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
	'\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
	'\u2029\uFEFF'
].join('');
var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
var $replace = callBound('String.prototype.replace');
var $trim = function (value) {
	return $replace(value, trimRegex, '');
};

var ToPrimitive = require('./ToPrimitive');

// https://ecma-international.org/ecma-262/6.0/#sec-tonumber

module.exports = function ToNumber(argument) {
	var value = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number);
	if (typeof value === 'symbol') {
		throw new $TypeError('Cannot convert a Symbol value to a number');
	}
	if (typeof value === 'string') {
		if (isBinary(value)) {
			return ToNumber($parseInteger($strSlice(value, 2), 2));
		} else if (isOctal(value)) {
			return ToNumber($parseInteger($strSlice(value, 2), 8));
		} else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
			return NaN;
		}
		var trimmed = $trim(value);
		if (trimmed !== value) {
			return ToNumber(trimmed);
		}

	}
	return $Number(value);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Object = GetIntrinsic('%Object%');

var RequireObjectCoercible = require('./RequireObjectCoercible');

// https://ecma-international.org/ecma-262/6.0/#sec-toobject

module.exports = function ToObject(value) {
	RequireObjectCoercible(value);
	return $Object(value);
};
'use strict';

var toPrimitive = require('es-to-primitive/es2015');

// https://ecma-international.org/ecma-262/6.0/#sec-toprimitive

module.exports = function ToPrimitive(input) {
	if (arguments.length > 1) {
		return toPrimitive(input, arguments[1]);
	}
	return toPrimitive(input);
};
'use strict';

var has = require('has');

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');
var ToBoolean = require('./ToBoolean');
var IsCallable = require('./IsCallable');

// https://262.ecma-international.org/5.1/#sec-8.10.5

module.exports = function ToPropertyDescriptor(Obj) {
	if (Type(Obj) !== 'Object') {
		throw new $TypeError('ToPropertyDescriptor requires an object');
	}

	var desc = {};
	if (has(Obj, 'enumerable')) {
		desc['[[Enumerable]]'] = ToBoolean(Obj.enumerable);
	}
	if (has(Obj, 'configurable')) {
		desc['[[Configurable]]'] = ToBoolean(Obj.configurable);
	}
	if (has(Obj, 'value')) {
		desc['[[Value]]'] = Obj.value;
	}
	if (has(Obj, 'writable')) {
		desc['[[Writable]]'] = ToBoolean(Obj.writable);
	}
	if (has(Obj, 'get')) {
		var getter = Obj.get;
		if (typeof getter !== 'undefined' && !IsCallable(getter)) {
			throw new $TypeError('getter must be a function');
		}
		desc['[[Get]]'] = getter;
	}
	if (has(Obj, 'set')) {
		var setter = Obj.set;
		if (typeof setter !== 'undefined' && !IsCallable(setter)) {
			throw new $TypeError('setter must be a function');
		}
		desc['[[Set]]'] = setter;
	}

	if ((has(desc, '[[Get]]') || has(desc, '[[Set]]')) && (has(desc, '[[Value]]') || has(desc, '[[Writable]]'))) {
		throw new $TypeError('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
	}
	return desc;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $String = GetIntrinsic('%String%');

var ToPrimitive = require('./ToPrimitive');
var ToString = require('./ToString');

// https://ecma-international.org/ecma-262/6.0/#sec-topropertykey

module.exports = function ToPropertyKey(argument) {
	var key = ToPrimitive(argument, $String);
	return typeof key === 'symbol' ? key : ToString(key);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $String = GetIntrinsic('%String%');
var $TypeError = GetIntrinsic('%TypeError%');

// https://ecma-international.org/ecma-262/6.0/#sec-tostring

module.exports = function ToString(argument) {
	if (typeof argument === 'symbol') {
		throw new $TypeError('Cannot convert a Symbol value to a string');
	}
	return $String(argument);
};
'use strict';

var abs = require('./abs');
var floor = require('./floor');
var modulo = require('./modulo');
var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');

// http://262.ecma-international.org/5.1/#sec-9.7

module.exports = function ToUint16(value) {
	var number = ToNumber(value);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * floor(abs(number));
	return modulo(posInt, 0x10000);
};
'use strict';

var ToNumber = require('./ToNumber');

// http://262.ecma-international.org/5.1/#sec-9.6

module.exports = function ToUint32(x) {
	return ToNumber(x) >>> 0;
};
'use strict';

var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');

var abs = require('./abs');
var floor = require('./floor');
var modulo = require('./modulo');

// https://ecma-international.org/ecma-262/6.0/#sec-touint8

module.exports = function ToUint8(argument) {
	var number = ToNumber(argument);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * floor(abs(number));
	return modulo(posInt, 0x100);
};
'use strict';

var ToNumber = require('./ToNumber');
var floor = require('./floor');

var $isNaN = require('../helpers/isNaN');

// https://ecma-international.org/ecma-262/6.0/#sec-touint8clamp

module.exports = function ToUint8Clamp(argument) {
	var number = ToNumber(argument);
	if ($isNaN(number) || number <= 0) { return 0; }
	if (number >= 0xFF) { return 0xFF; }
	var f = floor(argument);
	if (f + 0.5 < number) { return f + 1; }
	if (number < f + 0.5) { return f; }
	if (f % 2 !== 0) { return f + 1; }
	return f;
};
'use strict';

var trimStart = require('string.prototype.trimstart');
var trimEnd = require('string.prototype.trimend');

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var RequireObjectCoercible = require('./RequireObjectCoercible');
var ToString = require('./ToString');

// https://262.ecma-international.org/10.0/#sec-trimstring

module.exports = function TrimString(string, where) {
	var str = RequireObjectCoercible(string);
	var S = ToString(str);
	var T;
	if (where === 'start') {
		T = trimStart(S);
	} else if (where === 'end') {
		T = trimEnd(S);
	} else if (where === 'start+end') {
		T = trimStart(trimEnd(S));
	} else {
		throw new $TypeError('Assertion failed: invalid `where` value; must be "start", "end", or "start+end"');
	}
	return T;
};
'use strict';

var ES5Type = require('../5/Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ecmascript-data-types-and-values

module.exports = function Type(x) {
	if (typeof x === 'symbol') {
		return 'Symbol';
	}
	return ES5Type(x);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $fromCharCode = GetIntrinsic('%String.fromCharCode%');

// https://262.ecma-international.org/7.0/#sec-utf16decode

var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');

// https://262.ecma-international.org/11.0/#sec-utf16decodesurrogatepair

module.exports = function UTF16Decode(lead, trail) {
	if (!isLeadingSurrogate(lead) || !isTrailingSurrogate(trail)) {
		throw new $TypeError('Assertion failed: `lead` must be a leading surrogate char code, and `trail` must be a trailing surrogate char code');
	}
	// var cp = (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000;
	return $fromCharCode(lead) + $fromCharCode(trail);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $fromCharCode = GetIntrinsic('%String.fromCharCode%');

var floor = require('./floor');
var modulo = require('./modulo');

var isCodePoint = require('../helpers/isCodePoint');

// https://262.ecma-international.org/7.0/#sec-utf16encoding

module.exports = function UTF16Encoding(cp) {
	if (!isCodePoint(cp)) {
		throw new $TypeError('Assertion failed: `cp` must be >= 0 and <= 0x10FFFF');
	}
	if (cp <= 65535) {
		return $fromCharCode(cp);
	}
	var cu1 = floor((cp - 65536) / 1024) + 0xD800;
	var cu2 = modulo(cp - 65536, 1024) + 0xDC00;
	return $fromCharCode(cu1) + $fromCharCode(cu2);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $charCodeAt = callBound('String.prototype.charCodeAt');
var $numberToString = callBound('Number.prototype.toString');
var $toLowerCase = callBound('String.prototype.toLowerCase');
var $strSlice = callBound('String.prototype.slice');

// https://262.ecma-international.org/9.0/#sec-unicodeescape

module.exports = function UnicodeEscape(C) {
	if (typeof C !== 'string' || C.length !== 1) {
		throw new $TypeError('Assertion failed: `C` must be a single code unit');
	}
	var n = $charCodeAt(C, 0);
	if (n > 0xFFFF) {
		throw new $TypeError('`Assertion failed: numeric value of `C` must be <= 0xFFFF');
	}

	return '\\u' + $strSlice('0000' + $toLowerCase($numberToString(n, 16)), -4);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');
var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
var isSamePropertyDescriptor = require('../helpers/isSamePropertyDescriptor');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsGenericDescriptor = require('./IsGenericDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-validateandapplypropertydescriptor
// https://ecma-international.org/ecma-262/8.0/#sec-validateandapplypropertydescriptor

// eslint-disable-next-line max-lines-per-function, max-statements, max-params
module.exports = function ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current) {
	// this uses the ES2017+ logic, since it fixes a number of bugs in the ES2015 logic.
	var oType = Type(O);
	if (oType !== 'Undefined' && oType !== 'Object') {
		throw new $TypeError('Assertion failed: O must be undefined or an Object');
	}
	if (Type(extensible) !== 'Boolean') {
		throw new $TypeError('Assertion failed: extensible must be a Boolean');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (Type(current) !== 'Undefined' && !isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, current)) {
		throw new $TypeError('Assertion failed: current must be a Property Descriptor, or undefined');
	}
	if (oType !== 'Undefined' && !IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: if O is not undefined, P must be a Property Key');
	}
	if (Type(current) === 'Undefined') {
		if (!extensible) {
			return false;
		}
		if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
			if (oType !== 'Undefined') {
				DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					{
						'[[Configurable]]': Desc['[[Configurable]]'],
						'[[Enumerable]]': Desc['[[Enumerable]]'],
						'[[Value]]': Desc['[[Value]]'],
						'[[Writable]]': Desc['[[Writable]]']
					}
				);
			}
		} else {
			if (!IsAccessorDescriptor(Desc)) {
				throw new $TypeError('Assertion failed: Desc is not an accessor descriptor');
			}
			if (oType !== 'Undefined') {
				return DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					Desc
				);
			}
		}
		return true;
	}
	if (IsGenericDescriptor(Desc) && !('[[Configurable]]' in Desc) && !('[[Enumerable]]' in Desc)) {
		return true;
	}
	if (isSamePropertyDescriptor({ SameValue: SameValue }, Desc, current)) {
		return true; // removed by ES2017, but should still be correct
	}
	// "if every field in Desc is absent, return true" can't really match the assertion that it's a Property Descriptor
	if (!current['[[Configurable]]']) {
		if (Desc['[[Configurable]]']) {
			return false;
		}
		if ('[[Enumerable]]' in Desc && !Desc['[[Enumerable]]'] === !!current['[[Enumerable]]']) {
			return false;
		}
	}
	if (IsGenericDescriptor(Desc)) {
		// no further validation is required.
	} else if (IsDataDescriptor(current) !== IsDataDescriptor(Desc)) {
		if (!current['[[Configurable]]']) {
			return false;
		}
		if (IsDataDescriptor(current)) {
			if (oType !== 'Undefined') {
				DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					{
						'[[Configurable]]': current['[[Configurable]]'],
						'[[Enumerable]]': current['[[Enumerable]]'],
						'[[Get]]': undefined
					}
				);
			}
		} else if (oType !== 'Undefined') {
			DefineOwnProperty(
				IsDataDescriptor,
				SameValue,
				FromPropertyDescriptor,
				O,
				P,
				{
					'[[Configurable]]': current['[[Configurable]]'],
					'[[Enumerable]]': current['[[Enumerable]]'],
					'[[Value]]': undefined
				}
			);
		}
	} else if (IsDataDescriptor(current) && IsDataDescriptor(Desc)) {
		if (!current['[[Configurable]]'] && !current['[[Writable]]']) {
			if ('[[Writable]]' in Desc && Desc['[[Writable]]']) {
				return false;
			}
			if ('[[Value]]' in Desc && !SameValue(Desc['[[Value]]'], current['[[Value]]'])) {
				return false;
			}
			return true;
		}
	} else if (IsAccessorDescriptor(current) && IsAccessorDescriptor(Desc)) {
		if (!current['[[Configurable]]']) {
			if ('[[Set]]' in Desc && !SameValue(Desc['[[Set]]'], current['[[Set]]'])) {
				return false;
			}
			if ('[[Get]]' in Desc && !SameValue(Desc['[[Get]]'], current['[[Get]]'])) {
				return false;
			}
			return true;
		}
	} else {
		throw new $TypeError('Assertion failed: current and Desc are not both data, both accessors, or one accessor and one data.');
	}
	if (oType !== 'Undefined') {
		return DefineOwnProperty(
			IsDataDescriptor,
			SameValue,
			FromPropertyDescriptor,
			O,
			P,
			Desc
		);
	}
	return true;
};
'use strict';

var Day = require('./Day');
var modulo = require('./modulo');

// https://262.ecma-international.org/5.1/#sec-15.9.1.6

module.exports = function WeekDay(t) {
	return modulo(Day(t) + 4, 7);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Date = GetIntrinsic('%Date%');

var callBound = require('call-bind/callBound');

var $getUTCFullYear = callBound('Date.prototype.getUTCFullYear');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function YearFromTime(t) {
	// largest y such that this.TimeFromYear(y) <= t
	return $getUTCFullYear(new $Date(t));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $abs = GetIntrinsic('%Math.abs%');

// http://262.ecma-international.org/5.1/#sec-5.2

module.exports = function abs(x) {
	return $abs(x);
};
'use strict';

// var modulo = require('./modulo');
var $floor = Math.floor;

// http://262.ecma-international.org/5.1/#sec-5.2

module.exports = function floor(x) {
	// return x - modulo(x, 1);
	return $floor(x);
};
'use strict';

var mod = require('../helpers/mod');

// https://262.ecma-international.org/5.1/#sec-5.2

module.exports = function modulo(x, y) {
	return mod(x, y);
};
'use strict';

var modulo = require('./modulo');

var msPerSecond = require('../helpers/timeConstants').msPerSecond;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function msFromTime(t) {
	return modulo(t, msPerSecond);
};
'use strict';

var $BooleanValueOf = require('call-bind/callBound')('Boolean.prototype.valueOf');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-boolean-prototype-object

module.exports = function thisBooleanValue(value) {
	if (Type(value) === 'Boolean') {
		return value;
	}

	return $BooleanValueOf(value);
};
'use strict';

var callBound = require('call-bind/callBound');

var Type = require('./Type');

var $NumberValueOf = callBound('Number.prototype.valueOf');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-number-prototype-object

module.exports = function thisNumberValue(value) {
	if (Type(value) === 'Number') {
		return value;
	}

	return $NumberValueOf(value);
};

'use strict';

var $StringValueOf = require('call-bind/callBound')('String.prototype.valueOf');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object

module.exports = function thisStringValue(value) {
	if (Type(value) === 'String') {
		return value;
	}

	return $StringValueOf(value);
};
'use strict';

var callBound = require('call-bind/callBound');

var $SymbolValueOf = callBound('Symbol.prototype.valueOf', true);

var Type = require('./Type');

// https://262.ecma-international.org/9.0/#sec-thissymbolvalue

module.exports = function thisSymbolValue(value) {
	if (!$SymbolValueOf) {
		throw new SyntaxError('Symbols are not supported; thisSymbolValue requires that `value` be a Symbol or a Symbol object');
	}
	if (Type(value) === 'Symbol') {
		return value;
	}
	return $SymbolValueOf(value);
};
'use strict';

module.exports = require('../2018/thisTimeValue');
'use strict';

var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-abstract-equality-comparison

module.exports = function AbstractEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType === yType) {
		return x === y; // ES6+ specified this shortcut anyways.
	}
	if (x == null && y == null) {
		return true;
	}
	if (xType === 'Number' && yType === 'String') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if (xType === 'String' && yType === 'Number') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (xType === 'Boolean') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (yType === 'Boolean') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if ((xType === 'String' || xType === 'Number' || xType === 'Symbol') && yType === 'Object') {
		return AbstractEqualityComparison(x, ToPrimitive(y));
	}
	if (xType === 'Object' && (yType === 'String' || yType === 'Number' || yType === 'Symbol')) {
		return AbstractEqualityComparison(ToPrimitive(x), y);
	}
	return false;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Number = GetIntrinsic('%Number%');
var $TypeError = GetIntrinsic('%TypeError%');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');

var IsStringPrefix = require('./IsStringPrefix');
var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

// https://262.ecma-international.org/9.0/#sec-abstract-relational-comparison

module.exports = function AbstractRelationalComparison(x, y, LeftFirst) {
	if (Type(LeftFirst) !== 'Boolean') {
		throw new $TypeError('Assertion failed: LeftFirst argument must be a Boolean');
	}
	var px;
	var py;
	if (LeftFirst) {
		px = ToPrimitive(x, $Number);
		py = ToPrimitive(y, $Number);
	} else {
		py = ToPrimitive(y, $Number);
		px = ToPrimitive(x, $Number);
	}
	if (Type(px) === 'String' && Type(py) === 'String') {
		if (IsStringPrefix(py, px)) {
			return false;
		}
		if (IsStringPrefix(px, py)) {
			return true;
		}
		return px < py; // both strings, neither a prefix of the other. shortcut for steps 3 c-f
	}
	var nx = ToNumber(px);
	var ny = ToNumber(py);
	if ($isNaN(nx) || $isNaN(ny)) {
		return undefined;
	}
	if ($isFinite(nx) && $isFinite(ny) && nx === ny) {
		return false;
	}
	if (nx === Infinity) {
		return false;
	}
	if (ny === Infinity) {
		return true;
	}
	if (ny === -Infinity) {
		return false;
	}
	if (nx === -Infinity) {
		return true;
	}
	return nx < ny; // by now, these are both nonzero, finite, and not equal
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var IsInteger = require('./IsInteger');
var Type = require('./Type');

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');
var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');

var $TypeError = GetIntrinsic('%TypeError%');

var $charCodeAt = require('call-bind/callBound')('String.prototype.charCodeAt');

// https://ecma-international.org/ecma-262/6.0/#sec-advancestringindex

module.exports = function AdvanceStringIndex(S, index, unicode) {
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	if (!IsInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) {
		throw new $TypeError('Assertion failed: `length` must be an integer >= 0 and <= 2**53');
	}
	if (Type(unicode) !== 'Boolean') {
		throw new $TypeError('Assertion failed: `unicode` must be a Boolean');
	}
	if (!unicode) {
		return index + 1;
	}
	var length = S.length;
	if ((index + 1) >= length) {
		return index + 1;
	}

	var first = $charCodeAt(S, index);
	if (!isLeadingSurrogate(first)) {
		return index + 1;
	}

	var second = $charCodeAt(S, index + 1);
	if (!isTrailingSurrogate(second)) {
		return index + 1;
	}

	return index + 2;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $ArrayPrototype = GetIntrinsic('%Array.prototype%');
var $RangeError = GetIntrinsic('%RangeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var IsInteger = require('./IsInteger');

var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1;

var $setProto = GetIntrinsic('%Object.setPrototypeOf%', true) || (
	// eslint-disable-next-line no-proto, no-negated-condition
	[].__proto__ !== $ArrayPrototype
		? null
		: function (O, proto) {
			O.__proto__ = proto; // eslint-disable-line no-proto, no-param-reassign
			return O;
		}
);

// https://ecma-international.org/ecma-262/6.0/#sec-arraycreate

module.exports = function ArrayCreate(length) {
	if (!IsInteger(length) || length < 0) {
		throw new $TypeError('Assertion failed: `length` must be an integer Number >= 0');
	}
	if (length > MAX_ARRAY_LENGTH) {
		throw new $RangeError('length is greater than (2**32 - 1)');
	}
	var proto = arguments.length > 1 ? arguments[1] : $ArrayPrototype;
	var A = []; // steps 5 - 7, and 9
	if (proto !== $ArrayPrototype) { // step 8
		if (!$setProto) {
			throw new $SyntaxError('ArrayCreate: a `proto` argument that is not `Array.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
		}
		$setProto(A, proto);
	}
	if (length !== 0) { // bypasses the need for step 2
		A.length = length;
	}
	/* step 10, the above as a shortcut for the below
	OrdinaryDefineOwnProperty(A, 'length', {
		'[[Configurable]]': false,
		'[[Enumerable]]': false,
		'[[Value]]': length,
		'[[Writable]]': true
	});
	*/
	return A;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $RangeError = GetIntrinsic('%RangeError%');
var $TypeError = GetIntrinsic('%TypeError%');

var assign = require('object.assign');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var IsArray = require('./IsArray');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var OrdinaryDefineOwnProperty = require('./OrdinaryDefineOwnProperty');
var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
var ToNumber = require('./ToNumber');
var ToString = require('./ToString');
var ToUint32 = require('./ToUint32');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-arraysetlength

// eslint-disable-next-line max-statements, max-lines-per-function
module.exports = function ArraySetLength(A, Desc) {
	if (!IsArray(A)) {
		throw new $TypeError('Assertion failed: A must be an Array');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (!('[[Value]]' in Desc)) {
		return OrdinaryDefineOwnProperty(A, 'length', Desc);
	}
	var newLenDesc = assign({}, Desc);
	var newLen = ToUint32(Desc['[[Value]]']);
	var numberLen = ToNumber(Desc['[[Value]]']);
	if (newLen !== numberLen) {
		throw new $RangeError('Invalid array length');
	}
	newLenDesc['[[Value]]'] = newLen;
	var oldLenDesc = OrdinaryGetOwnProperty(A, 'length');
	if (!IsDataDescriptor(oldLenDesc)) {
		throw new $TypeError('Assertion failed: an array had a non-data descriptor on `length`');
	}
	var oldLen = oldLenDesc['[[Value]]'];
	if (newLen >= oldLen) {
		return OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
	}
	if (!oldLenDesc['[[Writable]]']) {
		return false;
	}
	var newWritable;
	if (!('[[Writable]]' in newLenDesc) || newLenDesc['[[Writable]]']) {
		newWritable = true;
	} else {
		newWritable = false;
		newLenDesc['[[Writable]]'] = true;
	}
	var succeeded = OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
	if (!succeeded) {
		return false;
	}
	while (newLen < oldLen) {
		oldLen -= 1;
		// eslint-disable-next-line no-param-reassign
		var deleteSucceeded = delete A[ToString(oldLen)];
		if (!deleteSucceeded) {
			newLenDesc['[[Value]]'] = oldLen + 1;
			if (!newWritable) {
				newLenDesc['[[Writable]]'] = false;
				OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
				return false;
			}
		}
	}
	if (!newWritable) {
		return OrdinaryDefineOwnProperty(A, 'length', { '[[Writable]]': false });
	}
	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Array = GetIntrinsic('%Array%');
var $species = GetIntrinsic('%Symbol.species%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsArray = require('./IsArray');
var IsConstructor = require('./IsConstructor');
var IsInteger = require('./IsInteger');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate

module.exports = function ArraySpeciesCreate(originalArray, length) {
	if (!IsInteger(length) || length < 0) {
		throw new $TypeError('Assertion failed: length must be an integer >= 0');
	}
	var len = length === 0 ? 0 : length;
	var C;
	var isArray = IsArray(originalArray);
	if (isArray) {
		C = Get(originalArray, 'constructor');
		// TODO: figure out how to make a cross-realm normal Array, a same-realm Array
		// if (IsConstructor(C)) {
		// 	if C is another realm's Array, C = undefined
		// 	Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?
		// }
		if ($species && Type(C) === 'Object') {
			C = Get(C, $species);
			if (C === null) {
				C = void 0;
			}
		}
	}
	if (typeof C === 'undefined') {
		return $Array(len);
	}
	if (!IsConstructor(C)) {
		throw new $TypeError('C must be a constructor');
	}
	return new C(len); // Construct(C, len);
};

'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');

var IsArray = require('./IsArray');

var $apply = GetIntrinsic('%Reflect.apply%', true) || callBound('%Function.prototype.apply%');

// https://ecma-international.org/ecma-262/6.0/#sec-call

module.exports = function Call(F, V) {
	var argumentsList = arguments.length > 2 ? arguments[2] : [];
	if (!IsArray(argumentsList)) {
		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
	}
	return $apply(F, V, argumentsList);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var SameValue = require('./SameValue');
var ToNumber = require('./ToNumber');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring

module.exports = function CanonicalNumericIndexString(argument) {
	if (Type(argument) !== 'String') {
		throw new $TypeError('Assertion failed: `argument` must be a String');
	}
	if (argument === '-0') { return -0; }
	var n = ToNumber(argument);
	if (SameValue(ToString(n), argument)) { return n; }
	return void 0;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $fromCharCode = GetIntrinsic('%String.fromCharCode%');
var $TypeError = GetIntrinsic('%TypeError%');
var $charCodeAt = callBound('%String.prototype.charCodeAt%');
var $push = callBound('%Array.prototype.push%');

module.exports = function CharacterRange(A, B) {
	if (A.length !== 1 || B.length !== 1) {
		throw new $TypeError('Assertion failed: CharSets A and B contain exactly one character');
	}

	var a = A[0];
	var b = B[0];

	var i = $charCodeAt(a, 0);
	var j = $charCodeAt(b, 0);

	if (!(i <= j)) {
		throw new $TypeError('Assertion failed: i is not <= j');
	}

	var arr = [];
	for (var k = i; k <= j; k += 1) {
		$push(arr, $fromCharCode(k));
	}
	return arr;
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var IsDataDescriptor = require('./IsDataDescriptor');
var IsGenericDescriptor = require('./IsGenericDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor

module.exports = function CompletePropertyDescriptor(Desc) {
	/* eslint no-param-reassign: 0 */
	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
		if (!has(Desc, '[[Value]]')) {
			Desc['[[Value]]'] = void 0;
		}
		if (!has(Desc, '[[Writable]]')) {
			Desc['[[Writable]]'] = false;
		}
	} else {
		if (!has(Desc, '[[Get]]')) {
			Desc['[[Get]]'] = void 0;
		}
		if (!has(Desc, '[[Set]]')) {
			Desc['[[Set]]'] = void 0;
		}
	}
	if (!has(Desc, '[[Enumerable]]')) {
		Desc['[[Enumerable]]'] = false;
	}
	if (!has(Desc, '[[Configurable]]')) {
		Desc['[[Configurable]]'] = false;
	}
	return Desc;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');
var forEach = require('../helpers/forEach');
var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');

var CreateDataProperty = require('./CreateDataProperty');
var Get = require('./Get');
var IsArray = require('./IsArray');
var IsInteger = require('./IsInteger');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var ToNumber = require('./ToNumber');
var ToObject = require('./ToObject');
var Type = require('./Type');

// https://262.ecma-international.org/9.0/#sec-copydataproperties

module.exports = function CopyDataProperties(target, source, excludedItems) {
	if (Type(target) !== 'Object') {
		throw new $TypeError('Assertion failed: "target" must be an Object');
	}

	if (!IsArray(excludedItems)) {
		throw new $TypeError('Assertion failed: "excludedItems" must be a List of Property Keys');
	}
	for (var i = 0; i < excludedItems.length; i += 1) {
		if (!IsPropertyKey(excludedItems[i])) {
			throw new $TypeError('Assertion failed: "excludedItems" must be a List of Property Keys');
		}
	}

	if (typeof source === 'undefined' || source === null) {
		return target;
	}

	var fromObj = ToObject(source);

	var sourceKeys = OwnPropertyKeys(fromObj);
	forEach(sourceKeys, function (nextKey) {
		var excluded = false;

		forEach(excludedItems, function (e) {
			if (SameValue(e, nextKey) === true) {
				excluded = true;
			}
		});

		var enumerable = $isEnumerable(fromObj, nextKey) || (
		// this is to handle string keys being non-enumerable in older engines
			typeof source === 'string'
			&& nextKey >= 0
			&& IsInteger(ToNumber(nextKey))
		);
		if (excluded === false && enumerable) {
			var propValue = Get(fromObj, nextKey);
			CreateDataProperty(target, nextKey, propValue);
		}
	});

	return target;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createdataproperty

module.exports = function CreateDataProperty(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	var oldDesc = OrdinaryGetOwnProperty(O, P);
	var extensible = !oldDesc || IsExtensible(O);
	var nonConfigurable = oldDesc && !oldDesc['[[Configurable]]'];
	if (nonConfigurable || !extensible) {
		return false;
	}
	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		{
			'[[Configurable]]': true,
			'[[Enumerable]]': true,
			'[[Value]]': V,
			'[[Writable]]': true
		}
	);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var CreateDataProperty = require('./CreateDataProperty');
var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// // https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow

module.exports = function CreateDataPropertyOrThrow(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	var success = CreateDataProperty(O, P, V);
	if (!success) {
		throw new $TypeError('unable to create data property');
	}
	return success;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $replace = callBound('String.prototype.replace');

var RequireObjectCoercible = require('./RequireObjectCoercible');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createhtml

module.exports = function CreateHTML(string, tag, attribute, value) {
	if (Type(tag) !== 'String' || Type(attribute) !== 'String') {
		throw new $TypeError('Assertion failed: `tag` and `attribute` must be strings');
	}
	var str = RequireObjectCoercible(string);
	var S = ToString(str);
	var p1 = '<' + tag;
	if (attribute !== '') {
		var V = ToString(value);
		var escapedV = $replace(V, /\x22/g, '&quot;');
		p1 += '\x20' + attribute + '\x3D\x22' + escapedV + '\x22';
	}
	return p1 + '>' + S + '</' + tag + '>';
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject

module.exports = function CreateIterResultObject(value, done) {
	if (Type(done) !== 'Boolean') {
		throw new $TypeError('Assertion failed: Type(done) is not Boolean');
	}
	return {
		value: value,
		done: done
	};
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');
var $indexOf = callBound('Array.prototype.indexOf', true) || callBound('String.prototype.indexOf');
var $push = callBound('Array.prototype.push');

var Get = require('./Get');
var IsArray = require('./IsArray');
var ToLength = require('./ToLength');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createlistfromarraylike
module.exports = function CreateListFromArrayLike(obj) {
	var elementTypes = arguments.length > 1
		? arguments[1]
		: ['Undefined', 'Null', 'Boolean', 'String', 'Symbol', 'Number', 'Object'];

	if (Type(obj) !== 'Object') {
		throw new $TypeError('Assertion failed: `obj` must be an Object');
	}
	if (!IsArray(elementTypes)) {
		throw new $TypeError('Assertion failed: `elementTypes`, if provided, must be an array');
	}
	var len = ToLength(Get(obj, 'length'));
	var list = [];
	var index = 0;
	while (index < len) {
		var indexName = ToString(index);
		var next = Get(obj, indexName);
		var nextType = Type(next);
		if ($indexOf(elementTypes, nextType) < 0) {
			throw new $TypeError('item type ' + nextType + ' is not a valid elementType');
		}
		$push(list, next);
		index += 1;
	}
	return list;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createmethodproperty

module.exports = function CreateMethodProperty(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	var newDesc = {
		'[[Configurable]]': true,
		'[[Enumerable]]': false,
		'[[Value]]': V,
		'[[Writable]]': true
	};
	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		newDesc
	);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');
var MonthFromTime = require('./MonthFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.5

module.exports = function DateFromTime(t) {
	var m = MonthFromTime(t);
	var d = DayWithinYear(t);
	if (m === 0) {
		return d + 1;
	}
	if (m === 1) {
		return d - 30;
	}
	var leap = InLeapYear(t);
	if (m === 2) {
		return d - 58 - leap;
	}
	if (m === 3) {
		return d - 89 - leap;
	}
	if (m === 4) {
		return d - 119 - leap;
	}
	if (m === 5) {
		return d - 150 - leap;
	}
	if (m === 6) {
		return d - 180 - leap;
	}
	if (m === 7) {
		return d - 211 - leap;
	}
	if (m === 8) {
		return d - 242 - leap;
	}
	if (m === 9) {
		return d - 272 - leap;
	}
	if (m === 10) {
		return d - 303 - leap;
	}
	if (m === 11) {
		return d - 333 - leap;
	}
	throw new $EvalError('Assertion failed: MonthFromTime returned an impossible value: ' + m);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var weekdays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];

var $isNaN = require('../helpers/isNaN');
var padTimeComponent = require('../helpers/padTimeComponent');

var Type = require('./Type');
var WeekDay = require('./WeekDay');
var MonthFromTime = require('./MonthFromTime');
var YearFromTime = require('./YearFromTime');
var DateFromTime = require('./DateFromTime');

// https://262.ecma-international.org/9.0/#sec-datestring

module.exports = function DateString(tv) {
	if (Type(tv) !== 'Number' || $isNaN(tv)) {
		throw new $TypeError('Assertion failed: `tv` must be a non-NaN Number');
	}
	var weekday = weekdays[WeekDay(tv)];
	var month = months[MonthFromTime(tv)];
	var day = padTimeComponent(DateFromTime(tv));
	var year = padTimeComponent(YearFromTime(tv), 4);
	return weekday + '\x20' + month + '\x20' + day + '\x20' + year;
};
'use strict';

var floor = require('./floor');

var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.2

module.exports = function Day(t) {
	return floor(t / msPerDay);
};
'use strict';

var floor = require('./floor');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function DayFromYear(y) {
	return (365 * (y - 1970)) + floor((y - 1969) / 4) - floor((y - 1901) / 100) + floor((y - 1601) / 400);
};

'use strict';

var Day = require('./Day');
var DayFromYear = require('./DayFromYear');
var YearFromTime = require('./YearFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.4

module.exports = function DayWithinYear(t) {
	return Day(t) - DayFromYear(YearFromTime(t));
};
'use strict';

var modulo = require('./modulo');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function DaysInYear(y) {
	if (modulo(y, 4) !== 0) {
		return 365;
	}
	if (modulo(y, 100) !== 0) {
		return 366;
	}
	if (modulo(y, 400) !== 0) {
		return 365;
	}
	return 366;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow

module.exports = function DefinePropertyOrThrow(O, P, desc) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	var Desc = isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, desc) ? desc : ToPropertyDescriptor(desc);
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc is not a valid Property Descriptor');
	}

	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		Desc
	);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-deletepropertyorthrow

module.exports = function DeletePropertyOrThrow(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// eslint-disable-next-line no-param-reassign
	var success = delete O[P];
	if (!success) {
		throw new $TypeError('Attempt to delete property failed.');
	}
	return success;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var objectKeys = require('object-keys');

var callBound = require('call-bind/callBound');

var callBind = require('call-bind');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
var $pushApply = callBind.apply(GetIntrinsic('%Array.prototype.push%'));

var forEach = require('../helpers/forEach');

var Type = require('./Type');

// https://262.ecma-international.org/8.0/#sec-enumerableownproperties

module.exports = function EnumerableOwnPropertyNames(O, kind) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	var keys = objectKeys(O);
	if (kind === 'key') {
		return keys;
	}
	if (kind === 'value' || kind === 'key+value') {
		var results = [];
		forEach(keys, function (key) {
			if ($isEnumerable(O, key)) {
				$pushApply(results, [
					kind === 'value' ? O[key] : [key, O[key]]
				]);
			}
		});
		return results;
	}
	throw new $TypeError('Assertion failed: "kind" is not "key", "value", or "key+value": ' + kind);
};
'use strict';

var assertRecord = require('../helpers/assertRecord');
var fromPropertyDescriptor = require('../helpers/fromPropertyDescriptor');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-frompropertydescriptor

module.exports = function FromPropertyDescriptor(Desc) {
	if (typeof Desc !== 'undefined') {
		assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
	}

	return fromPropertyDescriptor(Desc);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var inspect = require('object-inspect');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-get-o-p

module.exports = function Get(O, P) {
	// 7.3.1.1
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	// 7.3.1.2
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true, got ' + inspect(P));
	}
	// 7.3.1.3
	return O[P];
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var getIteratorMethod = require('../helpers/getIteratorMethod');
var AdvanceStringIndex = require('./AdvanceStringIndex');
var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsArray = require('./IsArray');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getiterator

module.exports = function GetIterator(obj, method) {
	var actualMethod = method;
	if (arguments.length < 2) {
		actualMethod = getIteratorMethod(
			{
				AdvanceStringIndex: AdvanceStringIndex,
				GetMethod: GetMethod,
				IsArray: IsArray
			},
			obj
		);
	}
	var iterator = Call(actualMethod, obj);
	if (Type(iterator) !== 'Object') {
		throw new $TypeError('iterator must return an object');
	}

	return iterator;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var GetV = require('./GetV');
var IsCallable = require('./IsCallable');
var IsPropertyKey = require('./IsPropertyKey');

// https://ecma-international.org/ecma-262/6.0/#sec-getmethod

module.exports = function GetMethod(O, P) {
	// 7.3.9.1
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// 7.3.9.2
	var func = GetV(O, P);

	// 7.3.9.4
	if (func == null) {
		return void 0;
	}

	// 7.3.9.5
	if (!IsCallable(func)) {
		throw new $TypeError(P + 'is not a function');
	}

	// 7.3.9.6
	return func;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var hasSymbols = require('has-symbols')();

var $TypeError = GetIntrinsic('%TypeError%');

var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%', true);
var $gOPS = hasSymbols && GetIntrinsic('%Object.getOwnPropertySymbols%', true);
var keys = require('object-keys');

var esType = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getownpropertykeys

module.exports = function GetOwnPropertyKeys(O, Type) {
	if (esType(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (Type === 'Symbol') {
		return $gOPS ? $gOPS(O) : [];
	}
	if (Type === 'String') {
		if (!$gOPN) {
			return keys(O);
		}
		return $gOPN(O);
	}
	throw new $TypeError('Assertion failed: `Type` must be `"String"` or `"Symbol"`');
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Function = GetIntrinsic('%Function%');
var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsConstructor = require('./IsConstructor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getprototypefromconstructor

module.exports = function GetPrototypeFromConstructor(constructor, intrinsicDefaultProto) {
	var intrinsic = GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
	if (!IsConstructor(constructor)) {
		throw new $TypeError('Assertion failed: `constructor` must be a constructor');
	}
	var proto = Get(constructor, 'prototype');
	if (Type(proto) !== 'Object') {
		if (!(constructor instanceof $Function)) {
			// ignore other realms, for now
			throw new $TypeError('cross-realm constructors not currently supported');
		}
		proto = intrinsic;
	}
	return proto;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');
var regexTester = require('../helpers/regexTester');
var every = require('../helpers/every');

var $charAt = callBound('String.prototype.charAt');
var $strSlice = callBound('String.prototype.slice');
var $indexOf = callBound('String.prototype.indexOf');
var $parseInt = parseInt;

var isDigit = regexTester(/^[0-9]$/);

var inspect = require('object-inspect');

var Get = require('./Get');
var IsArray = require('./IsArray');
var IsInteger = require('./IsInteger');
var ToObject = require('./ToObject');
var ToString = require('./ToString');
var Type = require('./Type');

var canDistinguishSparseFromUndefined = 0 in [undefined]; // IE 6 - 8 have a bug where this returns false

var isStringOrHole = function (capture, index, arr) {
	return Type(capture) === 'String' || (canDistinguishSparseFromUndefined ? !(index in arr) : Type(capture) === 'Undefined');
};

// http://262.ecma-international.org/9.0/#sec-getsubstitution

// eslint-disable-next-line max-statements, max-params, max-lines-per-function
module.exports = function GetSubstitution(matched, str, position, captures, namedCaptures, replacement) {
	if (Type(matched) !== 'String') {
		throw new $TypeError('Assertion failed: `matched` must be a String');
	}
	var matchLength = matched.length;

	if (Type(str) !== 'String') {
		throw new $TypeError('Assertion failed: `str` must be a String');
	}
	var stringLength = str.length;

	if (!IsInteger(position) || position < 0 || position > stringLength) {
		throw new $TypeError('Assertion failed: `position` must be a nonnegative integer, and less than or equal to the length of `string`, got ' + inspect(position));
	}

	if (!IsArray(captures) || !every(captures, isStringOrHole)) {
		throw new $TypeError('Assertion failed: `captures` must be a List of Strings, got ' + inspect(captures));
	}

	if (Type(replacement) !== 'String') {
		throw new $TypeError('Assertion failed: `replacement` must be a String');
	}

	var tailPos = position + matchLength;
	var m = captures.length;
	if (Type(namedCaptures) !== 'Undefined') {
		namedCaptures = ToObject(namedCaptures); // eslint-disable-line no-param-reassign
	}

	var result = '';
	for (var i = 0; i < replacement.length; i += 1) {
		// if this is a $, and it's not the end of the replacement
		var current = $charAt(replacement, i);
		var isLast = (i + 1) >= replacement.length;
		var nextIsLast = (i + 2) >= replacement.length;
		if (current === '$' && !isLast) {
			var next = $charAt(replacement, i + 1);
			if (next === '$') {
				result += '$';
				i += 1;
			} else if (next === '&') {
				result += matched;
				i += 1;
			} else if (next === '`') {
				result += position === 0 ? '' : $strSlice(str, 0, position - 1);
				i += 1;
			} else if (next === "'") {
				result += tailPos >= stringLength ? '' : $strSlice(str, tailPos);
				i += 1;
			} else {
				var nextNext = nextIsLast ? null : $charAt(replacement, i + 2);
				if (isDigit(next) && next !== '0' && (nextIsLast || !isDigit(nextNext))) {
					// $1 through $9, and not followed by a digit
					var n = $parseInt(next, 10);
					// if (n > m, impl-defined)
					result += n <= m && Type(captures[n - 1]) === 'Undefined' ? '' : captures[n - 1];
					i += 1;
				} else if (isDigit(next) && (nextIsLast || isDigit(nextNext))) {
					// $00 through $99
					var nn = next + nextNext;
					var nnI = $parseInt(nn, 10) - 1;
					// if nn === '00' or nn > m, impl-defined
					result += nn <= m && Type(captures[nnI]) === 'Undefined' ? '' : captures[nnI];
					i += 2;
				} else if (next === '<') {
					// eslint-disable-next-line max-depth
					if (Type(namedCaptures) === 'Undefined') {
						result += '$<';
						i += 2;
					} else {
						var endIndex = $indexOf(replacement, '>', i);
						// eslint-disable-next-line max-depth
						if (endIndex > -1) {
							var groupName = $strSlice(replacement, i + '$<'.length, endIndex);
							var capture = Get(namedCaptures, groupName);
							// eslint-disable-next-line max-depth
							if (Type(capture) !== 'Undefined') {
								result += ToString(capture);
							}
							i += ('<' + groupName + '>').length;
						}
					}
				} else {
					result += '$';
				}
			}
		} else {
			// the final $, or else not a $
			result += $charAt(replacement, i);
		}
	}
	return result;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var ToObject = require('./ToObject');

// https://ecma-international.org/ecma-262/6.0/#sec-getv

module.exports = function GetV(V, P) {
	// 7.3.2.1
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// 7.3.2.2-3
	var O = ToObject(V);

	// 7.3.2.4
	return O[P];
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var has = require('has');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty

module.exports = function HasOwnProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	return has(O, P);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-hasproperty

module.exports = function HasProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	return P in O;
};
'use strict';

var floor = require('./floor');
var modulo = require('./modulo');

var timeConstants = require('../helpers/timeConstants');
var msPerHour = timeConstants.msPerHour;
var HoursPerDay = timeConstants.HoursPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function HourFromTime(t) {
	return modulo(floor(t / msPerHour), HoursPerDay);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DaysInYear = require('./DaysInYear');
var YearFromTime = require('./YearFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function InLeapYear(t) {
	var days = DaysInYear(YearFromTime(t));
	if (days === 365) {
		return 0;
	}
	if (days === 366) {
		return 1;
	}
	throw new $EvalError('Assertion failed: there are not 365 or 366 days in a year, got: ' + days);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $hasInstance = GetIntrinsic('Symbol.hasInstance', true);

var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsCallable = require('./IsCallable');
var OrdinaryHasInstance = require('./OrdinaryHasInstance');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-instanceofoperator

module.exports = function InstanceofOperator(O, C) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	var instOfHandler = $hasInstance ? GetMethod(C, $hasInstance) : void 0;
	if (typeof instOfHandler !== 'undefined') {
		return ToBoolean(Call(instOfHandler, C, [O]));
	}
	if (!IsCallable(C)) {
		throw new $TypeError('`C` is not Callable');
	}
	return OrdinaryHasInstance(C, O);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var IsArray = require('./IsArray');
var GetV = require('./GetV');
var IsPropertyKey = require('./IsPropertyKey');

// https://ecma-international.org/ecma-262/6.0/#sec-invoke

module.exports = function Invoke(O, P) {
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	var argumentsList = arguments.length > 2 ? arguments[2] : [];
	if (!IsArray(argumentsList)) {
		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
	}
	var func = GetV(O, P);
	return Call(func, O, argumentsList);
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isaccessordescriptor

module.exports = function IsAccessorDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Get]]') && !has(Desc, '[[Set]]')) {
		return false;
	}

	return true;
};
'use strict';

// https://ecma-international.org/ecma-262/6.0/#sec-isarray
module.exports = require('../helpers/IsArray');
'use strict';

// http://262.ecma-international.org/5.1/#sec-9.11

module.exports = require('is-callable');
'use strict';

var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');

// https://262.ecma-international.org/6.0/#sec-iscompatiblepropertydescriptor

module.exports = function IsCompatiblePropertyDescriptor(Extensible, Desc, Current) {
	return ValidateAndApplyPropertyDescriptor(undefined, undefined, Extensible, Desc, Current);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $isConcatSpreadable = GetIntrinsic('%Symbol.isConcatSpreadable%', true);

var Get = require('./Get');
var IsArray = require('./IsArray');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable

module.exports = function IsConcatSpreadable(O) {
	if (Type(O) !== 'Object') {
		return false;
	}
	if ($isConcatSpreadable) {
		var spreadable = Get(O, $isConcatSpreadable);
		if (typeof spreadable !== 'undefined') {
			return ToBoolean(spreadable);
		}
	}
	return IsArray(O);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic.js');

var $construct = GetIntrinsic('%Reflect.construct%', true);

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
try {
	DefinePropertyOrThrow({}, '', { '[[Get]]': function () {} });
} catch (e) {
	// Accessor properties aren't supported
	DefinePropertyOrThrow = null;
}

// https://ecma-international.org/ecma-262/6.0/#sec-isconstructor

if (DefinePropertyOrThrow && $construct) {
	var isConstructorMarker = {};
	var badArrayLike = {};
	DefinePropertyOrThrow(badArrayLike, 'length', {
		'[[Get]]': function () {
			throw isConstructorMarker;
		},
		'[[Enumerable]]': true
	});

	module.exports = function IsConstructor(argument) {
		try {
			// `Reflect.construct` invokes `IsConstructor(target)` before `Get(args, 'length')`:
			$construct(argument, badArrayLike);
		} catch (err) {
			return err === isConstructorMarker;
		}
	};
} else {
	module.exports = function IsConstructor(argument) {
		// unfortunately there's no way to truly check this without try/catch `new argument` in old environments
		return typeof argument === 'function' && !!argument.prototype;
	};
}
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isdatadescriptor

module.exports = function IsDataDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Value]]') && !has(Desc, '[[Writable]]')) {
		return false;
	}

	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $preventExtensions = GetIntrinsic('%Object.preventExtensions%', true);
var $isExtensible = GetIntrinsic('%Object.isExtensible%', true);

var isPrimitive = require('../helpers/isPrimitive');

// https://ecma-international.org/ecma-262/6.0/#sec-isextensible-o

module.exports = $preventExtensions
	? function IsExtensible(obj) {
		return !isPrimitive(obj) && $isExtensible(obj);
	}
	: function IsExtensible(obj) {
		return !isPrimitive(obj);
	};
'use strict';

var assertRecord = require('../helpers/assertRecord');

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isgenericdescriptor

module.exports = function IsGenericDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!IsAccessorDescriptor(Desc) && !IsDataDescriptor(Desc)) {
		return true;
	}

	return false;
};
'use strict';

var abs = require('./abs');
var floor = require('./floor');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');

// https://ecma-international.org/ecma-262/6.0/#sec-isinteger

module.exports = function IsInteger(argument) {
	if (typeof argument !== 'number' || $isNaN(argument) || !$isFinite(argument)) {
		return false;
	}
	var absValue = abs(argument);
	return floor(absValue) === absValue;
};
'use strict';

var callBound = require('call-bind/callBound');

var $PromiseThen = callBound('Promise.prototype.then', true);

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ispromise

module.exports = function IsPromise(x) {
	if (Type(x) !== 'Object') {
		return false;
	}
	if (!$PromiseThen) { // Promises are not supported
		return false;
	}
	try {
		$PromiseThen(x); // throws if not a promise
	} catch (e) {
		return false;
	}
	return true;
};
'use strict';

// https://ecma-international.org/ecma-262/6.0/#sec-ispropertykey

module.exports = function IsPropertyKey(argument) {
	return typeof argument === 'string' || typeof argument === 'symbol';
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $match = GetIntrinsic('%Symbol.match%', true);

var hasRegExpMatcher = require('is-regex');

var ToBoolean = require('./ToBoolean');

// https://ecma-international.org/ecma-262/6.0/#sec-isregexp

module.exports = function IsRegExp(argument) {
	if (!argument || typeof argument !== 'object') {
		return false;
	}
	if ($match) {
		var isRegExp = argument[$match];
		if (typeof isRegExp !== 'undefined') {
			return ToBoolean(isRegExp);
		}
	}
	return hasRegExpMatcher(argument);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');

var isSharedArrayBuffer = require('is-shared-array-buffer');

// https://262.ecma-international.org/8.0/#sec-issharedarraybuffer

module.exports = function IsSharedArrayBuffer(obj) {
	if (Type(obj) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	return isSharedArrayBuffer(obj);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isPrefixOf = require('../helpers/isPrefixOf');

// var callBound = require('call-bind/callBound');

// var $charAt = callBound('String.prototype.charAt');

var Type = require('./Type');

// https://262.ecma-international.org/9.0/#sec-isstringprefix

module.exports = function IsStringPrefix(p, q) {
	if (Type(p) !== 'String') {
		throw new $TypeError('Assertion failed: "p" must be a String');
	}

	if (Type(q) !== 'String') {
		throw new $TypeError('Assertion failed: "q" must be a String');
	}

	return isPrefixOf(p, q);
	/*
	if (p === q || p === '') {
		return true;
	}

	var pLength = p.length;
	var qLength = q.length;
	if (pLength >= qLength) {
		return false;
	}

	// assert: pLength < qLength

	for (var i = 0; i < pLength; i += 1) {
		if ($charAt(p, i) !== $charAt(q, i)) {
			return false;
		}
	}
	return true;
	*/
};
'use strict';

var callBound = require('call-bind/callBound');
var $arrayPush = callBound('Array.prototype.push');

var GetIterator = require('./GetIterator');
var IteratorStep = require('./IteratorStep');
var IteratorValue = require('./IteratorValue');

// https://262.ecma-international.org/8.0/#sec-iterabletolist

module.exports = function IterableToList(items, method) {
	var iterator = GetIterator(items, method);
	var values = [];
	var next = true;
	while (next) {
		next = IteratorStep(iterator);
		if (next) {
			var nextValue = IteratorValue(next);
			$arrayPush(values, nextValue);
		}
	}
	return values;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose

module.exports = function IteratorClose(iterator, completion) {
	if (Type(iterator) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterator) is not Object');
	}
	if (!IsCallable(completion)) {
		throw new $TypeError('Assertion failed: completion is not a thunk for a Completion Record');
	}
	var completionThunk = completion;

	var iteratorReturn = GetMethod(iterator, 'return');

	if (typeof iteratorReturn === 'undefined') {
		return completionThunk();
	}

	var completionRecord;
	try {
		var innerResult = Call(iteratorReturn, iterator, []);
	} catch (e) {
		// if we hit here, then "e" is the innerResult completion that needs re-throwing

		// if the completion is of type "throw", this will throw.
		completionThunk();
		completionThunk = null; // ensure it's not called twice.

		// if not, then return the innerResult completion
		throw e;
	}
	completionRecord = completionThunk(); // if innerResult worked, then throw if the completion does
	completionThunk = null; // ensure it's not called twice.

	if (Type(innerResult) !== 'Object') {
		throw new $TypeError('iterator .return must return an object');
	}

	return completionRecord;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete

module.exports = function IteratorComplete(iterResult) {
	if (Type(iterResult) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
	}
	return ToBoolean(Get(iterResult, 'done'));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Invoke = require('./Invoke');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratornext

module.exports = function IteratorNext(iterator, value) {
	var result = Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);
	if (Type(result) !== 'Object') {
		throw new $TypeError('iterator next must return an object');
	}
	return result;
};
'use strict';

var IteratorComplete = require('./IteratorComplete');
var IteratorNext = require('./IteratorNext');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep

module.exports = function IteratorStep(iterator) {
	var result = IteratorNext(iterator);
	var done = IteratorComplete(result);
	return done === true ? false : result;
};

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue

module.exports = function IteratorValue(iterResult) {
	if (Type(iterResult) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
	}
	return Get(iterResult, 'value');
};

'use strict';

var $isFinite = require('../helpers/isFinite');
var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.13

module.exports = function MakeDate(day, time) {
	if (!$isFinite(day) || !$isFinite(time)) {
		return NaN;
	}
	return (day * msPerDay) + time;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $DateUTC = GetIntrinsic('%Date.UTC%');

var $isFinite = require('../helpers/isFinite');

var DateFromTime = require('./DateFromTime');
var Day = require('./Day');
var floor = require('./floor');
var modulo = require('./modulo');
var MonthFromTime = require('./MonthFromTime');
var ToInteger = require('./ToInteger');
var YearFromTime = require('./YearFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.12

module.exports = function MakeDay(year, month, date) {
	if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) {
		return NaN;
	}
	var y = ToInteger(year);
	var m = ToInteger(month);
	var dt = ToInteger(date);
	var ym = y + floor(m / 12);
	var mn = modulo(m, 12);
	var t = $DateUTC(ym, mn, 1);
	if (YearFromTime(t) !== ym || MonthFromTime(t) !== mn || DateFromTime(t) !== 1) {
		return NaN;
	}
	return Day(t) + dt - 1;
};
'use strict';

var $isFinite = require('../helpers/isFinite');
var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var msPerMinute = timeConstants.msPerMinute;
var msPerHour = timeConstants.msPerHour;

var ToInteger = require('./ToInteger');

// https://262.ecma-international.org/5.1/#sec-15.9.1.11

module.exports = function MakeTime(hour, min, sec, ms) {
	if (!$isFinite(hour) || !$isFinite(min) || !$isFinite(sec) || !$isFinite(ms)) {
		return NaN;
	}
	var h = ToInteger(hour);
	var m = ToInteger(min);
	var s = ToInteger(sec);
	var milli = ToInteger(ms);
	var t = (h * msPerHour) + (m * msPerMinute) + (s * msPerSecond) + milli;
	return t;
};
'use strict';

var floor = require('./floor');
var modulo = require('./modulo');

var timeConstants = require('../helpers/timeConstants');
var msPerMinute = timeConstants.msPerMinute;
var MinutesPerHour = timeConstants.MinutesPerHour;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function MinFromTime(t) {
	return modulo(floor(t / msPerMinute), MinutesPerHour);
};
'use strict';

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');

// https://262.ecma-international.org/5.1/#sec-15.9.1.4

module.exports = function MonthFromTime(t) {
	var day = DayWithinYear(t);
	if (0 <= day && day < 31) {
		return 0;
	}
	var leap = InLeapYear(t);
	if (31 <= day && day < (59 + leap)) {
		return 1;
	}
	if ((59 + leap) <= day && day < (90 + leap)) {
		return 2;
	}
	if ((90 + leap) <= day && day < (120 + leap)) {
		return 3;
	}
	if ((120 + leap) <= day && day < (151 + leap)) {
		return 4;
	}
	if ((151 + leap) <= day && day < (181 + leap)) {
		return 5;
	}
	if ((181 + leap) <= day && day < (212 + leap)) {
		return 6;
	}
	if ((212 + leap) <= day && day < (243 + leap)) {
		return 7;
	}
	if ((243 + leap) <= day && day < (273 + leap)) {
		return 8;
	}
	if ((273 + leap) <= day && day < (304 + leap)) {
		return 9;
	}
	if ((304 + leap) <= day && day < (334 + leap)) {
		return 10;
	}
	if ((334 + leap) <= day && day < (365 + leap)) {
		return 11;
	}
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $String = GetIntrinsic('%String%');
var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');

// https://262.ecma-international.org/9.0/#sec-tostring-applied-to-the-number-type

module.exports = function NumberToString(m) {
	if (Type(m) !== 'Number') {
		throw new $TypeError('Assertion failed: "m" must be a String');
	}

	return $String(m);
};

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $ObjectCreate = GetIntrinsic('%Object.create%', true);
var $TypeError = GetIntrinsic('%TypeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');

var Type = require('./Type');

var hasProto = !({ __proto__: null } instanceof Object);

// https://ecma-international.org/ecma-262/6.0/#sec-objectcreate

module.exports = function ObjectCreate(proto, internalSlotsList) {
	if (proto !== null && Type(proto) !== 'Object') {
		throw new $TypeError('Assertion failed: `proto` must be null or an object');
	}
	var slots = arguments.length < 2 ? [] : internalSlotsList;
	if (slots.length > 0) {
		throw new $SyntaxError('es-abstract does not yet support internal slots');
	}

	if ($ObjectCreate) {
		return $ObjectCreate(proto);
	}
	if (hasProto) {
		return { __proto__: proto };
	}

	if (proto === null) {
		throw new $SyntaxError('native Object.create support is required to create null objects');
	}
	var T = function T() {};
	T.prototype = proto;
	return new T();
};
'use strict';

var callBound = require('call-bind/callBound');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var Get = require('./Get');
var ToObject = require('./ToObject');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');

var forEach = require('../helpers/forEach');
var getOwnPropertyDescriptor = require('../helpers/getOwnPropertyDescriptor');
var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');

var $push = callBound('Array.prototype.push');

// https://262.ecma-international.org/6.0/#sec-objectdefineproperties
module.exports = function ObjectDefineProperties(O, Properties) {
	var props = ToObject(Properties); // step 1
	var keys = OwnPropertyKeys(props); // step 2
	var descriptors = []; // step 3

	forEach(keys, function (nextKey) { // step 4
		var propDesc = ToPropertyDescriptor(getOwnPropertyDescriptor(props, nextKey)); // step 4.a
		if (typeof propDesc !== 'undefined' && propDesc['[[Enumerable]]']) { // step 4.b
			var descObj = Get(props, nextKey); // step 4.b.i
			var desc = ToPropertyDescriptor(descObj); // step 4.b.ii
			$push(descriptors, [nextKey, desc]); // step 4.b.iii
		}
	});

	forEach(descriptors, function (pair) { // step 5
		var P = pair[0]; // step 5.a
		var desc = pair[1]; // step 5.b
		desc = FromPropertyDescriptor(desc); // TODO: remove this once DefinePropertyOrThrow is fixed
		DefinePropertyOrThrow(O, P, desc); // step 5.c
	});

	return O; // step 6
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var $TypeError = GetIntrinsic('%TypeError%');

var GetPrototypeFromConstructor = require('./GetPrototypeFromConstructor');
var IsArray = require('./IsArray');
var ObjectCreate = require('./ObjectCreate');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinarycreatefromconstructor

module.exports = function OrdinaryCreateFromConstructor(constructor, intrinsicDefaultProto) {
	GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
	var proto = GetPrototypeFromConstructor(constructor, intrinsicDefaultProto);
	var slots = arguments.length < 3 ? [] : arguments[2];
	if (!IsArray(slots)) {
		throw new $TypeError('Assertion failed: if provided, `internalSlotsList` must be a List');
	}
	return ObjectCreate(proto, slots);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var IsPropertyKey = require('./IsPropertyKey');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var SameValue = require('./SameValue');
var Type = require('./Type');
var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinarydefineownproperty

module.exports = function OrdinaryDefineOwnProperty(O, P, Desc) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (!$gOPD) {
		// ES3/IE 8 fallback
		if (IsAccessorDescriptor(Desc)) {
			throw new $SyntaxError('This environment does not support accessor property descriptors.');
		}
		var creatingNormalDataProperty = !(P in O)
			&& Desc['[[Writable]]']
			&& Desc['[[Enumerable]]']
			&& Desc['[[Configurable]]']
			&& '[[Value]]' in Desc;
		var settingExistingDataProperty = (P in O)
			&& (!('[[Configurable]]' in Desc) || Desc['[[Configurable]]'])
			&& (!('[[Enumerable]]' in Desc) || Desc['[[Enumerable]]'])
			&& (!('[[Writable]]' in Desc) || Desc['[[Writable]]'])
			&& '[[Value]]' in Desc;
		if (creatingNormalDataProperty || settingExistingDataProperty) {
			O[P] = Desc['[[Value]]']; // eslint-disable-line no-param-reassign
			return SameValue(O[P], Desc['[[Value]]']);
		}
		throw new $SyntaxError('This environment does not support defining non-writable, non-enumerable, or non-configurable properties');
	}
	var desc = $gOPD(O, P);
	var current = desc && ToPropertyDescriptor(desc);
	var extensible = IsExtensible(O);
	return ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');

var has = require('has');

var IsArray = require('./IsArray');
var IsPropertyKey = require('./IsPropertyKey');
var IsRegExp = require('./IsRegExp');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty

module.exports = function OrdinaryGetOwnProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	if (!has(O, P)) {
		return void 0;
	}
	if (!$gOPD) {
		// ES3 / IE 8 fallback
		var arrayLength = IsArray(O) && P === 'length';
		var regexLastIndex = IsRegExp(O) && P === 'lastIndex';
		return {
			'[[Configurable]]': !(arrayLength || regexLastIndex),
			'[[Enumerable]]': $isEnumerable(O, P),
			'[[Value]]': O[P],
			'[[Writable]]': true
		};
	}
	return ToPropertyDescriptor($gOPD(O, P));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $getProto = require('../helpers/getProto');

var Type = require('./Type');

// https://262.ecma-international.org/7.0/#sec-ordinarygetprototypeof

module.exports = function OrdinaryGetPrototypeOf(O) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!$getProto) {
		throw new $TypeError('This environment does not support fetching prototypes.');
	}
	return $getProto(O);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasinstance

module.exports = function OrdinaryHasInstance(C, O) {
	if (IsCallable(C) === false) {
		return false;
	}
	if (Type(O) !== 'Object') {
		return false;
	}
	var P = Get(C, 'prototype');
	if (Type(P) !== 'Object') {
		throw new $TypeError('OrdinaryHasInstance called on an object with an invalid prototype property.');
	}
	return O instanceof C;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasproperty

module.exports = function OrdinaryHasProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	return P in O;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $setProto = require('../helpers/setProto');

var OrdinaryGetPrototypeOf = require('./OrdinaryGetPrototypeOf');
var Type = require('./Type');

// https://262.ecma-international.org/7.0/#sec-ordinarysetprototypeof

module.exports = function OrdinarySetPrototypeOf(O, V) {
	if (Type(V) !== 'Object' && Type(V) !== 'Null') {
		throw new $TypeError('Assertion failed: V must be Object or Null');
	}
	/*
	var extensible = IsExtensible(O);
	var current = OrdinaryGetPrototypeOf(O);
	if (SameValue(V, current)) {
		return true;
	}
	if (!extensible) {
		return false;
	}
	*/
	try {
		$setProto(O, V);
	} catch (e) {
		return false;
	}
	return OrdinaryGetPrototypeOf(O) === V;
	/*
	var p = V;
	var done = false;
	while (!done) {
		if (p === null) {
			done = true;
		} else if (SameValue(p, O)) {
			return false;
		} else {
			if (wat) {
				done = true;
			} else {
				p = p.[[Prototype]];
			}
		}
	}
	O.[[Prototype]] = V;
	return true;
	*/
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

var inspect = require('object-inspect');

// https://262.ecma-international.org/8.0/#sec-ordinarytoprimitive

module.exports = function OrdinaryToPrimitive(O, hint) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (/* Type(hint) !== 'String' || */ hint !== 'string' && hint !== 'number') {
		throw new $TypeError('Assertion failed: `hint` must be "string" or "number"');
	}

	var methodNames = hint === 'string' ? ['toString', 'valueOf'] : ['valueOf', 'toString'];

	for (var i = 0; i < methodNames.length; i += 1) {
		var name = methodNames[i];
		var method = Get(O, name);
		if (IsCallable(method)) {
			var result = Call(method, O);
			if (Type(result) !== 'Object') {
				return result;
			}
		}
	}

	throw new $TypeError('No primitive value for ' + inspect(O));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBind = require('call-bind');

var $resolve = GetIntrinsic('%Promise.resolve%', true);
var $PromiseResolve = $resolve && callBind($resolve);

// https://262.ecma-international.org/9.0/#sec-promise-resolve

module.exports = function PromiseResolve(C, x) {
	if (!$PromiseResolve) {
		throw new SyntaxError('This environment does not support Promises.');
	}
	return $PromiseResolve(C, x);
};

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');
var forEach = require('../helpers/forEach');

var $charCodeAt = callBound('String.prototype.charCodeAt');
var $strSplit = callBound('String.prototype.split');

var Type = require('./Type');
var UnicodeEscape = require('./UnicodeEscape');

var has = require('has');

// https://262.ecma-international.org/9.0/#sec-quotejsonstring

var escapes = {
	'\u0008': '\\b',
	'\u0009': '\\t',
	'\u000A': '\\n',
	'\u000C': '\\f',
	'\u000D': '\\r',
	'\u0022': '\\"',
	'\u005c': '\\\\'
};

module.exports = function QuoteJSONString(value) {
	if (Type(value) !== 'String') {
		throw new $TypeError('Assertion failed: `value` must be a String');
	}
	var product = '"';
	if (value) {
		forEach($strSplit(value), function (C) {
			if (has(escapes, C)) {
				product += escapes[C];
			} else if ($charCodeAt(C, 0) < 0x20) {
				product += UnicodeEscape(C);
			} else {
				product += C;
			}
		});
	}
	product += '"';
	return product;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $RegExp = GetIntrinsic('%RegExp%');

// var RegExpAlloc = require('./RegExpAlloc');
// var RegExpInitialize = require('./RegExpInitialize');
var ToString = require('./ToString');

// https://262.ecma-international.org/6.0/#sec-regexpcreate

module.exports = function RegExpCreate(P, F) {
	// var obj = RegExpAlloc($RegExp);
	// return RegExpInitialize(obj, P, F);

	// covers spec mechanics; bypass regex brand checking
	var pattern = typeof P === 'undefined' ? '' : ToString(P);
	var flags = typeof F === 'undefined' ? '' : ToString(F);
	return new $RegExp(pattern, flags);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var regexExec = require('call-bind/callBound')('RegExp.prototype.exec');

var Call = require('./Call');
var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-regexpexec

module.exports = function RegExpExec(R, S) {
	if (Type(R) !== 'Object') {
		throw new $TypeError('Assertion failed: `R` must be an Object');
	}
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	var exec = Get(R, 'exec');
	if (IsCallable(exec)) {
		var result = Call(exec, R, [S]);
		if (result === null || Type(result) === 'Object') {
			return result;
		}
		throw new $TypeError('"exec" method must return `null` or an Object');
	}
	return regexExec(R, S);
};
'use strict';

module.exports = require('../5/CheckObjectCoercible');
'use strict';

var $isNaN = require('../helpers/isNaN');

// http://262.ecma-international.org/5.1/#sec-9.12

module.exports = function SameValue(x, y) {
	if (x === y) { // 0 === -0, but they are not identical.
		if (x === 0) { return 1 / x === 1 / y; }
		return true;
	}
	return $isNaN(x) && $isNaN(y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var SameValue = require('./SameValue');

// https://262.ecma-international.org/7.0/#sec-samevaluenonnumber

module.exports = function SameValueNonNumber(x, y) {
	if (typeof x === 'number' || typeof x !== typeof y) {
		throw new $TypeError('SameValueNonNumber requires two non-number values of the same type.');
	}
	return SameValue(x, y);
};
'use strict';

var $isNaN = require('../helpers/isNaN');

// https://ecma-international.org/ecma-262/6.0/#sec-samevaluezero

module.exports = function SameValueZero(x, y) {
	return (x === y) || ($isNaN(x) && $isNaN(y));
};
'use strict';

var floor = require('./floor');
var modulo = require('./modulo');

var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var SecondsPerMinute = timeConstants.SecondsPerMinute;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function SecFromTime(t) {
	return modulo(floor(t / msPerSecond), SecondsPerMinute);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// IE 9 does not throw in strict mode when writability/configurability/extensibility is violated
var noThrowOnStrictViolation = (function () {
	try {
		delete [].length;
		return true;
	} catch (e) {
		return false;
	}
}());

// https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw

module.exports = function Set(O, P, V, Throw) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	if (Type(Throw) !== 'Boolean') {
		throw new $TypeError('Assertion failed: `Throw` must be a Boolean');
	}
	if (Throw) {
		O[P] = V; // eslint-disable-line no-param-reassign
		if (noThrowOnStrictViolation && !SameValue(O[P], V)) {
			throw new $TypeError('Attempted to assign to readonly property.');
		}
		return true;
	}
	try {
		O[P] = V; // eslint-disable-line no-param-reassign
		return noThrowOnStrictViolation ? SameValue(O[P], V) : true;
	} catch (e) {
		return false;
	}

};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var HasOwnProperty = require('./HasOwnProperty');
var IsExtensible = require('./IsExtensible');
var IsInteger = require('./IsInteger');
var Type = require('./Type');

// https://262.ecma-international.org/9.0/#sec-setfunctionlength

module.exports = function SetFunctionLength(F, length) {
	if (typeof F !== 'function' || !IsExtensible(F) || HasOwnProperty(F, 'length')) {
		throw new $TypeError('Assertion failed: `F` must be an extensible function and lack an own `length` property');
	}
	if (Type(length) !== 'Number') {
		throw new $TypeError('Assertion failed: `length` must be a Number');
	}
	if (length < 0 || !IsInteger(length)) {
		throw new $TypeError('Assertion failed: `length` must be an integer >= 0');
	}
	return DefinePropertyOrThrow(F, 'length', {
		'[[Configurable]]': true,
		'[[Enumerable]]': false,
		'[[Value]]': length,
		'[[Writable]]': false
	});
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var has = require('has');

var $TypeError = GetIntrinsic('%TypeError%');

var getSymbolDescription = require('get-symbol-description');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var IsExtensible = require('./IsExtensible');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-setfunctionname

module.exports = function SetFunctionName(F, name) {
	if (typeof F !== 'function') {
		throw new $TypeError('Assertion failed: `F` must be a function');
	}
	if (!IsExtensible(F) || has(F, 'name')) {
		throw new $TypeError('Assertion failed: `F` must be extensible, and must not have a `name` own property');
	}
	var nameType = Type(name);
	if (nameType !== 'Symbol' && nameType !== 'String') {
		throw new $TypeError('Assertion failed: `name` must be a Symbol or a String');
	}
	if (nameType === 'Symbol') {
		var description = getSymbolDescription(name);
		// eslint-disable-next-line no-param-reassign
		name = typeof description === 'undefined' ? '' : '[' + description + ']';
	}
	if (arguments.length > 2) {
		var prefix = arguments[2];
		// eslint-disable-next-line no-param-reassign
		name = prefix + ' ' + name;
	}
	return DefinePropertyOrThrow(F, 'name', {
		'[[Value]]': name,
		'[[Writable]]': false,
		'[[Enumerable]]': false,
		'[[Configurable]]': true
	});
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');
var $preventExtensions = GetIntrinsic('%Object.preventExtensions%', true);
var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%', true);

var forEach = require('../helpers/forEach');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-setintegritylevel

module.exports = function SetIntegrityLevel(O, level) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (level !== 'sealed' && level !== 'frozen') {
		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
	}
	if (!$preventExtensions) {
		throw new $SyntaxError('SetIntegrityLevel requires native `Object.preventExtensions` support');
	}
	var status = $preventExtensions(O);
	if (!status) {
		return false;
	}
	if (!$gOPN) {
		throw new $SyntaxError('SetIntegrityLevel requires native `Object.getOwnPropertyNames` support');
	}
	var theKeys = $gOPN(O);
	if (level === 'sealed') {
		forEach(theKeys, function (k) {
			DefinePropertyOrThrow(O, k, { configurable: false });
		});
	} else if (level === 'frozen') {
		forEach(theKeys, function (k) {
			var currentDesc = $gOPD(O, k);
			if (typeof currentDesc !== 'undefined') {
				var desc;
				if (IsAccessorDescriptor(ToPropertyDescriptor(currentDesc))) {
					desc = { configurable: false };
				} else {
					desc = { configurable: false, writable: false };
				}
				DefinePropertyOrThrow(O, k, desc);
			}
		});
	}
	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $species = GetIntrinsic('%Symbol.species%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var IsConstructor = require('./IsConstructor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor

module.exports = function SpeciesConstructor(O, defaultConstructor) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	var C = O.constructor;
	if (typeof C === 'undefined') {
		return defaultConstructor;
	}
	if (Type(C) !== 'Object') {
		throw new $TypeError('O.constructor is not an Object');
	}
	var S = $species ? C[$species] : void 0;
	if (S == null) {
		return defaultConstructor;
	}
	if (IsConstructor(S)) {
		return S;
	}
	throw new $TypeError('no constructor found');
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');

var IsInteger = require('./IsInteger');
var Type = require('./Type');

var $charAt = callBound('String.prototype.charAt');

// https://262.ecma-international.org/6.0/#sec-splitmatch

module.exports = function SplitMatch(S, q, R) {
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	if (!IsInteger(q)) {
		throw new $TypeError('Assertion failed: `q` must be an integer');
	}
	if (Type(R) !== 'String') {
		throw new $TypeError('Assertion failed: `R` must be a String');
	}
	var r = R.length;
	var s = S.length;
	if (q + r > s) {
		return false;
	}

	for (var i = 0; i < r; i += 1) {
		if ($charAt(S, q + i) !== $charAt(R, i)) {
			return false;
		}
	}

	return q + r;
};
'use strict';

var Type = require('./Type');

// https://262.ecma-international.org/5.1/#sec-11.9.6

module.exports = function StrictEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType !== yType) {
		return false;
	}
	if (xType === 'Undefined' || xType === 'Null') {
		return true;
	}
	return x === y; // shortcut for steps 4-7
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Object = GetIntrinsic('%Object%');
var $StringPrototype = GetIntrinsic('%String.prototype%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var Type = require('./Type');

var setProto = require('../helpers/setProto');

// https://262.ecma-international.org/6.0/#sec-stringcreate

module.exports = function StringCreate(value, prototype) {
	if (Type(value) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}

	var S = $Object(value);
	if (prototype !== $StringPrototype) {
		if (setProto) {
			setProto(S, prototype);
		} else {
			throw new $SyntaxError('StringCreate: a `proto` argument that is not `String.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
		}
	}

	var length = value.length;
	DefinePropertyOrThrow(S, 'length', {
		'[[Configurable]]': false,
		'[[Enumerable]]': false,
		'[[Value]]': length,
		'[[Writable]]': false
	});

	return S;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');
var $charAt = callBound('String.prototype.charAt');
var $stringToString = callBound('String.prototype.toString');

var CanonicalNumericIndexString = require('./CanonicalNumericIndexString');
var IsInteger = require('./IsInteger');
var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

var isNegativeZero = require('is-negative-zero');

// https://262.ecma-international.org/8.0/#sec-stringgetownproperty

module.exports = function StringGetOwnProperty(S, P) {
	var str;
	if (Type(S) === 'Object') {
		try {
			str = $stringToString(S);
		} catch (e) { /**/ }
	}
	if (Type(str) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a boxed string object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	if (Type(P) !== 'String') {
		return void undefined;
	}
	var index = CanonicalNumericIndexString(P);
	var len = str.length;
	if (typeof index === 'undefined' || !IsInteger(index) || isNegativeZero(index) || index < 0 || len <= index) {
		return void undefined;
	}
	var resultStr = $charAt(S, index);
	return {
		'[[Configurable]]': false,
		'[[Enumerable]]': true,
		'[[Value]]': resultStr,
		'[[Writable]]': false
	};
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $SymbolToString = callBound('Symbol.prototype.toString', true);

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-symboldescriptivestring

module.exports = function SymbolDescriptiveString(sym) {
	if (Type(sym) !== 'Symbol') {
		throw new $TypeError('Assertion failed: `sym` must be a Symbol');
	}
	return $SymbolToString(sym);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $TypeError = GetIntrinsic('%TypeError%');

var every = require('../helpers/every');
var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');

var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-testintegritylevel

module.exports = function TestIntegrityLevel(O, level) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (level !== 'sealed' && level !== 'frozen') {
		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
	}
	var status = IsExtensible(O);
	if (status) {
		return false;
	}
	var theKeys = OwnPropertyKeys(O);
	return theKeys.length === 0 || every(theKeys, function (k) {
		var currentDesc = $gOPD(O, k);
		if (typeof currentDesc !== 'undefined') {
			if (currentDesc.configurable) {
				return false;
			}
			if (level === 'frozen' && IsDataDescriptor(ToPropertyDescriptor(currentDesc)) && currentDesc.writable) {
				return false;
			}
		}
		return true;
	});
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Date = GetIntrinsic('%Date%');
var $Number = GetIntrinsic('%Number%');

var $isFinite = require('../helpers/isFinite');

var abs = require('./abs');
var ToNumber = require('./ToNumber');

// https://262.ecma-international.org/5.1/#sec-15.9.1.14

module.exports = function TimeClip(time) {
	if (!$isFinite(time) || abs(time) > 8.64e15) {
		return NaN;
	}
	return $Number(new $Date(ToNumber(time)));
};

'use strict';

var msPerDay = require('../helpers/timeConstants').msPerDay;

var DayFromYear = require('./DayFromYear');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function TimeFromYear(y) {
	return msPerDay * DayFromYear(y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $isNaN = require('../helpers/isNaN');
var padTimeComponent = require('../helpers/padTimeComponent');

var HourFromTime = require('./HourFromTime');
var MinFromTime = require('./MinFromTime');
var SecFromTime = require('./SecFromTime');
var Type = require('./Type');

// https://262.ecma-international.org/9.0/#sec-timestring

module.exports = function TimeString(tv) {
	if (Type(tv) !== 'Number' || $isNaN(tv)) {
		throw new $TypeError('Assertion failed: `tv` must be a non-NaN Number');
	}
	var hour = HourFromTime(tv);
	var minute = MinFromTime(tv);
	var second = SecFromTime(tv);
	return padTimeComponent(hour) + ':' + padTimeComponent(minute) + ':' + padTimeComponent(second) + '\x20GMT';
};
'use strict';

var modulo = require('./modulo');

var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.2

module.exports = function TimeWithinDay(t) {
	return modulo(t, msPerDay);
};

'use strict';

// http://262.ecma-international.org/5.1/#sec-9.2

module.exports = function ToBoolean(value) { return !!value; };
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $Date = GetIntrinsic('%Date%');

var $isNaN = require('../helpers/isNaN');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-todatestring

module.exports = function ToDateString(tv) {
	if (Type(tv) !== 'Number') {
		throw new $TypeError('Assertion failed: `tv` must be a Number');
	}
	if ($isNaN(tv)) {
		return 'Invalid Date';
	}
	return $Date(tv);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $RangeError = GetIntrinsic('%RangeError%');

var ToInteger = require('./ToInteger');
var ToLength = require('./ToLength');
var SameValueZero = require('./SameValueZero');

// https://262.ecma-international.org/8.0/#sec-toindex

module.exports = function ToIndex(value) {
	if (typeof value === 'undefined') {
		return 0;
	}
	var integerIndex = ToInteger(value);
	if (integerIndex < 0) {
		throw new $RangeError('index must be >= 0');
	}
	var index = ToLength(integerIndex);
	if (!SameValueZero(integerIndex, index)) {
		throw new $RangeError('index must be >= 0 and < 2 ** 53 - 1');
	}
	return index;
};
'use strict';

var ToUint16 = require('./ToUint16');

// https://ecma-international.org/ecma-262/6.0/#sec-toint16

module.exports = function ToInt16(argument) {
	var int16bit = ToUint16(argument);
	return int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;
};
'use strict';

var ToNumber = require('./ToNumber');

// http://262.ecma-international.org/5.1/#sec-9.5

module.exports = function ToInt32(x) {
	return ToNumber(x) >> 0;
};
'use strict';

var ToUint8 = require('./ToUint8');

// https://ecma-international.org/ecma-262/6.0/#sec-toint8

module.exports = function ToInt8(argument) {
	var int8bit = ToUint8(argument);
	return int8bit >= 0x80 ? int8bit - 0x100 : int8bit;
};
'use strict';

var ES5ToInteger = require('../5/ToInteger');

var ToNumber = require('./ToNumber');

// https://ecma-international.org/ecma-262/6.0/#sec-tointeger

module.exports = function ToInteger(value) {
	var number = ToNumber(value);
	return ES5ToInteger(number);
};
'use strict';

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');

var ToInteger = require('./ToInteger');

module.exports = function ToLength(argument) {
	var len = ToInteger(argument);
	if (len <= 0) { return 0; } // includes converting -0 to +0
	if (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }
	return len;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $Number = GetIntrinsic('%Number%');
var $RegExp = GetIntrinsic('%RegExp%');
var $parseInteger = GetIntrinsic('%parseInt%');

var callBound = require('call-bind/callBound');
var regexTester = require('../helpers/regexTester');
var isPrimitive = require('../helpers/isPrimitive');

var $strSlice = callBound('String.prototype.slice');
var isBinary = regexTester(/^0b[01]+$/i);
var isOctal = regexTester(/^0o[0-7]+$/i);
var isInvalidHexLiteral = regexTester(/^[-+]0x[0-9a-f]+$/i);
var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
var hasNonWS = regexTester(nonWSregex);

// whitespace from: https://es5.github.io/#x15.5.4.20
// implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
var ws = [
	'\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
	'\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
	'\u2029\uFEFF'
].join('');
var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
var $replace = callBound('String.prototype.replace');
var $trim = function (value) {
	return $replace(value, trimRegex, '');
};

var ToPrimitive = require('./ToPrimitive');

// https://ecma-international.org/ecma-262/6.0/#sec-tonumber

module.exports = function ToNumber(argument) {
	var value = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number);
	if (typeof value === 'symbol') {
		throw new $TypeError('Cannot convert a Symbol value to a number');
	}
	if (typeof value === 'string') {
		if (isBinary(value)) {
			return ToNumber($parseInteger($strSlice(value, 2), 2));
		} else if (isOctal(value)) {
			return ToNumber($parseInteger($strSlice(value, 2), 8));
		} else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
			return NaN;
		}
		var trimmed = $trim(value);
		if (trimmed !== value) {
			return ToNumber(trimmed);
		}

	}
	return $Number(value);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Object = GetIntrinsic('%Object%');

var RequireObjectCoercible = require('./RequireObjectCoercible');

// https://ecma-international.org/ecma-262/6.0/#sec-toobject

module.exports = function ToObject(value) {
	RequireObjectCoercible(value);
	return $Object(value);
};
'use strict';

var toPrimitive = require('es-to-primitive/es2015');

// https://ecma-international.org/ecma-262/6.0/#sec-toprimitive

module.exports = function ToPrimitive(input) {
	if (arguments.length > 1) {
		return toPrimitive(input, arguments[1]);
	}
	return toPrimitive(input);
};
'use strict';

var has = require('has');

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');
var ToBoolean = require('./ToBoolean');
var IsCallable = require('./IsCallable');

// https://262.ecma-international.org/5.1/#sec-8.10.5

module.exports = function ToPropertyDescriptor(Obj) {
	if (Type(Obj) !== 'Object') {
		throw new $TypeError('ToPropertyDescriptor requires an object');
	}

	var desc = {};
	if (has(Obj, 'enumerable')) {
		desc['[[Enumerable]]'] = ToBoolean(Obj.enumerable);
	}
	if (has(Obj, 'configurable')) {
		desc['[[Configurable]]'] = ToBoolean(Obj.configurable);
	}
	if (has(Obj, 'value')) {
		desc['[[Value]]'] = Obj.value;
	}
	if (has(Obj, 'writable')) {
		desc['[[Writable]]'] = ToBoolean(Obj.writable);
	}
	if (has(Obj, 'get')) {
		var getter = Obj.get;
		if (typeof getter !== 'undefined' && !IsCallable(getter)) {
			throw new $TypeError('getter must be a function');
		}
		desc['[[Get]]'] = getter;
	}
	if (has(Obj, 'set')) {
		var setter = Obj.set;
		if (typeof setter !== 'undefined' && !IsCallable(setter)) {
			throw new $TypeError('setter must be a function');
		}
		desc['[[Set]]'] = setter;
	}

	if ((has(desc, '[[Get]]') || has(desc, '[[Set]]')) && (has(desc, '[[Value]]') || has(desc, '[[Writable]]'))) {
		throw new $TypeError('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
	}
	return desc;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $String = GetIntrinsic('%String%');

var ToPrimitive = require('./ToPrimitive');
var ToString = require('./ToString');

// https://ecma-international.org/ecma-262/6.0/#sec-topropertykey

module.exports = function ToPropertyKey(argument) {
	var key = ToPrimitive(argument, $String);
	return typeof key === 'symbol' ? key : ToString(key);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $String = GetIntrinsic('%String%');
var $TypeError = GetIntrinsic('%TypeError%');

// https://ecma-international.org/ecma-262/6.0/#sec-tostring

module.exports = function ToString(argument) {
	if (typeof argument === 'symbol') {
		throw new $TypeError('Cannot convert a Symbol value to a string');
	}
	return $String(argument);
};
'use strict';

var abs = require('./abs');
var floor = require('./floor');
var modulo = require('./modulo');
var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');

// http://262.ecma-international.org/5.1/#sec-9.7

module.exports = function ToUint16(value) {
	var number = ToNumber(value);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * floor(abs(number));
	return modulo(posInt, 0x10000);
};
'use strict';

var ToNumber = require('./ToNumber');

// http://262.ecma-international.org/5.1/#sec-9.6

module.exports = function ToUint32(x) {
	return ToNumber(x) >>> 0;
};
'use strict';

var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');

var abs = require('./abs');
var floor = require('./floor');
var modulo = require('./modulo');

// https://ecma-international.org/ecma-262/6.0/#sec-touint8

module.exports = function ToUint8(argument) {
	var number = ToNumber(argument);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * floor(abs(number));
	return modulo(posInt, 0x100);
};
'use strict';

var ToNumber = require('./ToNumber');
var floor = require('./floor');

var $isNaN = require('../helpers/isNaN');

// https://ecma-international.org/ecma-262/6.0/#sec-touint8clamp

module.exports = function ToUint8Clamp(argument) {
	var number = ToNumber(argument);
	if ($isNaN(number) || number <= 0) { return 0; }
	if (number >= 0xFF) { return 0xFF; }
	var f = floor(argument);
	if (f + 0.5 < number) { return f + 1; }
	if (number < f + 0.5) { return f; }
	if (f % 2 !== 0) { return f + 1; }
	return f;
};
'use strict';

var ES5Type = require('../5/Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ecmascript-data-types-and-values

module.exports = function Type(x) {
	if (typeof x === 'symbol') {
		return 'Symbol';
	}
	return ES5Type(x);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $fromCharCode = GetIntrinsic('%String.fromCharCode%');

// https://262.ecma-international.org/7.0/#sec-utf16decode

var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');

// https://262.ecma-international.org/11.0/#sec-utf16decodesurrogatepair

module.exports = function UTF16Decode(lead, trail) {
	if (!isLeadingSurrogate(lead) || !isTrailingSurrogate(trail)) {
		throw new $TypeError('Assertion failed: `lead` must be a leading surrogate char code, and `trail` must be a trailing surrogate char code');
	}
	// var cp = (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000;
	return $fromCharCode(lead) + $fromCharCode(trail);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $fromCharCode = GetIntrinsic('%String.fromCharCode%');

var floor = require('./floor');
var modulo = require('./modulo');

var isCodePoint = require('../helpers/isCodePoint');

// https://262.ecma-international.org/7.0/#sec-utf16encoding

module.exports = function UTF16Encoding(cp) {
	if (!isCodePoint(cp)) {
		throw new $TypeError('Assertion failed: `cp` must be >= 0 and <= 0x10FFFF');
	}
	if (cp <= 65535) {
		return $fromCharCode(cp);
	}
	var cu1 = floor((cp - 65536) / 1024) + 0xD800;
	var cu2 = modulo(cp - 65536, 1024) + 0xDC00;
	return $fromCharCode(cu1) + $fromCharCode(cu2);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $charCodeAt = callBound('String.prototype.charCodeAt');
var $numberToString = callBound('Number.prototype.toString');
var $toLowerCase = callBound('String.prototype.toLowerCase');
var $strSlice = callBound('String.prototype.slice');

// https://262.ecma-international.org/9.0/#sec-unicodeescape

module.exports = function UnicodeEscape(C) {
	if (typeof C !== 'string' || C.length !== 1) {
		throw new $TypeError('Assertion failed: `C` must be a single code unit');
	}
	var n = $charCodeAt(C, 0);
	if (n > 0xFFFF) {
		throw new $TypeError('`Assertion failed: numeric value of `C` must be <= 0xFFFF');
	}

	return '\\u' + $strSlice('0000' + $toLowerCase($numberToString(n, 16)), -4);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');
var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
var isSamePropertyDescriptor = require('../helpers/isSamePropertyDescriptor');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsGenericDescriptor = require('./IsGenericDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-validateandapplypropertydescriptor
// https://ecma-international.org/ecma-262/8.0/#sec-validateandapplypropertydescriptor

// eslint-disable-next-line max-lines-per-function, max-statements, max-params
module.exports = function ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current) {
	// this uses the ES2017+ logic, since it fixes a number of bugs in the ES2015 logic.
	var oType = Type(O);
	if (oType !== 'Undefined' && oType !== 'Object') {
		throw new $TypeError('Assertion failed: O must be undefined or an Object');
	}
	if (Type(extensible) !== 'Boolean') {
		throw new $TypeError('Assertion failed: extensible must be a Boolean');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (Type(current) !== 'Undefined' && !isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, current)) {
		throw new $TypeError('Assertion failed: current must be a Property Descriptor, or undefined');
	}
	if (oType !== 'Undefined' && !IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: if O is not undefined, P must be a Property Key');
	}
	if (Type(current) === 'Undefined') {
		if (!extensible) {
			return false;
		}
		if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
			if (oType !== 'Undefined') {
				DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					{
						'[[Configurable]]': Desc['[[Configurable]]'],
						'[[Enumerable]]': Desc['[[Enumerable]]'],
						'[[Value]]': Desc['[[Value]]'],
						'[[Writable]]': Desc['[[Writable]]']
					}
				);
			}
		} else {
			if (!IsAccessorDescriptor(Desc)) {
				throw new $TypeError('Assertion failed: Desc is not an accessor descriptor');
			}
			if (oType !== 'Undefined') {
				return DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					Desc
				);
			}
		}
		return true;
	}
	if (IsGenericDescriptor(Desc) && !('[[Configurable]]' in Desc) && !('[[Enumerable]]' in Desc)) {
		return true;
	}
	if (isSamePropertyDescriptor({ SameValue: SameValue }, Desc, current)) {
		return true; // removed by ES2017, but should still be correct
	}
	// "if every field in Desc is absent, return true" can't really match the assertion that it's a Property Descriptor
	if (!current['[[Configurable]]']) {
		if (Desc['[[Configurable]]']) {
			return false;
		}
		if ('[[Enumerable]]' in Desc && !Desc['[[Enumerable]]'] === !!current['[[Enumerable]]']) {
			return false;
		}
	}
	if (IsGenericDescriptor(Desc)) {
		// no further validation is required.
	} else if (IsDataDescriptor(current) !== IsDataDescriptor(Desc)) {
		if (!current['[[Configurable]]']) {
			return false;
		}
		if (IsDataDescriptor(current)) {
			if (oType !== 'Undefined') {
				DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					{
						'[[Configurable]]': current['[[Configurable]]'],
						'[[Enumerable]]': current['[[Enumerable]]'],
						'[[Get]]': undefined
					}
				);
			}
		} else if (oType !== 'Undefined') {
			DefineOwnProperty(
				IsDataDescriptor,
				SameValue,
				FromPropertyDescriptor,
				O,
				P,
				{
					'[[Configurable]]': current['[[Configurable]]'],
					'[[Enumerable]]': current['[[Enumerable]]'],
					'[[Value]]': undefined
				}
			);
		}
	} else if (IsDataDescriptor(current) && IsDataDescriptor(Desc)) {
		if (!current['[[Configurable]]'] && !current['[[Writable]]']) {
			if ('[[Writable]]' in Desc && Desc['[[Writable]]']) {
				return false;
			}
			if ('[[Value]]' in Desc && !SameValue(Desc['[[Value]]'], current['[[Value]]'])) {
				return false;
			}
			return true;
		}
	} else if (IsAccessorDescriptor(current) && IsAccessorDescriptor(Desc)) {
		if (!current['[[Configurable]]']) {
			if ('[[Set]]' in Desc && !SameValue(Desc['[[Set]]'], current['[[Set]]'])) {
				return false;
			}
			if ('[[Get]]' in Desc && !SameValue(Desc['[[Get]]'], current['[[Get]]'])) {
				return false;
			}
			return true;
		}
	} else {
		throw new $TypeError('Assertion failed: current and Desc are not both data, both accessors, or one accessor and one data.');
	}
	if (oType !== 'Undefined') {
		return DefineOwnProperty(
			IsDataDescriptor,
			SameValue,
			FromPropertyDescriptor,
			O,
			P,
			Desc
		);
	}
	return true;
};
'use strict';

var Day = require('./Day');
var modulo = require('./modulo');

// https://262.ecma-international.org/5.1/#sec-15.9.1.6

module.exports = function WeekDay(t) {
	return modulo(Day(t) + 4, 7);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Date = GetIntrinsic('%Date%');

var callBound = require('call-bind/callBound');

var $getUTCFullYear = callBound('Date.prototype.getUTCFullYear');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function YearFromTime(t) {
	// largest y such that this.TimeFromYear(y) <= t
	return $getUTCFullYear(new $Date(t));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $abs = GetIntrinsic('%Math.abs%');

// http://262.ecma-international.org/5.1/#sec-5.2

module.exports = function abs(x) {
	return $abs(x);
};
'use strict';

// var modulo = require('./modulo');
var $floor = Math.floor;

// http://262.ecma-international.org/5.1/#sec-5.2

module.exports = function floor(x) {
	// return x - modulo(x, 1);
	return $floor(x);
};
'use strict';

var mod = require('../helpers/mod');

// https://262.ecma-international.org/5.1/#sec-5.2

module.exports = function modulo(x, y) {
	return mod(x, y);
};
'use strict';

var modulo = require('./modulo');

var msPerSecond = require('../helpers/timeConstants').msPerSecond;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function msFromTime(t) {
	return modulo(t, msPerSecond);
};
'use strict';

var $BooleanValueOf = require('call-bind/callBound')('Boolean.prototype.valueOf');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-boolean-prototype-object

module.exports = function thisBooleanValue(value) {
	if (Type(value) === 'Boolean') {
		return value;
	}

	return $BooleanValueOf(value);
};
'use strict';

var callBound = require('call-bind/callBound');

var Type = require('./Type');

var $NumberValueOf = callBound('Number.prototype.valueOf');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-number-prototype-object

module.exports = function thisNumberValue(value) {
	if (Type(value) === 'Number') {
		return value;
	}

	return $NumberValueOf(value);
};

'use strict';

var $StringValueOf = require('call-bind/callBound')('String.prototype.valueOf');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object

module.exports = function thisStringValue(value) {
	if (Type(value) === 'String') {
		return value;
	}

	return $StringValueOf(value);
};
'use strict';

var callBound = require('call-bind/callBound');

var $SymbolValueOf = callBound('Symbol.prototype.valueOf', true);

var Type = require('./Type');

// https://262.ecma-international.org/9.0/#sec-thissymbolvalue

module.exports = function thisSymbolValue(value) {
	if (!$SymbolValueOf) {
		throw new SyntaxError('Symbols are not supported; thisSymbolValue requires that `value` be a Symbol or a Symbol object');
	}
	if (Type(value) === 'Symbol') {
		return value;
	}
	return $SymbolValueOf(value);
};
'use strict';

var $DateGetTime = require('call-bind/callBound')('Date.prototype.getTime');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-date-prototype-object

module.exports = function thisTimeValue(value) {
	return $DateGetTime(value);
};
'use strict';

var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-abstract-equality-comparison

module.exports = function AbstractEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType === yType) {
		return x === y; // ES6+ specified this shortcut anyways.
	}
	if (x == null && y == null) {
		return true;
	}
	if (xType === 'Number' && yType === 'String') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if (xType === 'String' && yType === 'Number') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (xType === 'Boolean') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (yType === 'Boolean') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if ((xType === 'String' || xType === 'Number' || xType === 'Symbol') && yType === 'Object') {
		return AbstractEqualityComparison(x, ToPrimitive(y));
	}
	if (xType === 'Object' && (yType === 'String' || yType === 'Number' || yType === 'Symbol')) {
		return AbstractEqualityComparison(ToPrimitive(x), y);
	}
	return false;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Number = GetIntrinsic('%Number%');
var $TypeError = GetIntrinsic('%TypeError%');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var isPrefixOf = require('../helpers/isPrefixOf');

var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

// https://262.ecma-international.org/5.1/#sec-11.8.5

// eslint-disable-next-line max-statements
module.exports = function AbstractRelationalComparison(x, y, LeftFirst) {
	if (Type(LeftFirst) !== 'Boolean') {
		throw new $TypeError('Assertion failed: LeftFirst argument must be a Boolean');
	}
	var px;
	var py;
	if (LeftFirst) {
		px = ToPrimitive(x, $Number);
		py = ToPrimitive(y, $Number);
	} else {
		py = ToPrimitive(y, $Number);
		px = ToPrimitive(x, $Number);
	}
	var bothStrings = Type(px) === 'String' && Type(py) === 'String';
	if (!bothStrings) {
		var nx = ToNumber(px);
		var ny = ToNumber(py);
		if ($isNaN(nx) || $isNaN(ny)) {
			return undefined;
		}
		if ($isFinite(nx) && $isFinite(ny) && nx === ny) {
			return false;
		}
		if (nx === Infinity) {
			return false;
		}
		if (ny === Infinity) {
			return true;
		}
		if (ny === -Infinity) {
			return false;
		}
		if (nx === -Infinity) {
			return true;
		}
		return nx < ny; // by now, these are both nonzero, finite, and not equal
	}
	if (isPrefixOf(py, px)) {
		return false;
	}
	if (isPrefixOf(px, py)) {
		return true;
	}
	return px < py; // both strings, neither a prefix of the other. shortcut for steps c-f
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var IsInteger = require('./IsInteger');
var Type = require('./Type');

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');
var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');

var $TypeError = GetIntrinsic('%TypeError%');

var $charCodeAt = require('call-bind/callBound')('String.prototype.charCodeAt');

// https://ecma-international.org/ecma-262/6.0/#sec-advancestringindex

module.exports = function AdvanceStringIndex(S, index, unicode) {
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	if (!IsInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) {
		throw new $TypeError('Assertion failed: `length` must be an integer >= 0 and <= 2**53');
	}
	if (Type(unicode) !== 'Boolean') {
		throw new $TypeError('Assertion failed: `unicode` must be a Boolean');
	}
	if (!unicode) {
		return index + 1;
	}
	var length = S.length;
	if ((index + 1) >= length) {
		return index + 1;
	}

	var first = $charCodeAt(S, index);
	if (!isLeadingSurrogate(first)) {
		return index + 1;
	}

	var second = $charCodeAt(S, index + 1);
	if (!isTrailingSurrogate(second)) {
		return index + 1;
	}

	return index + 2;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $ArrayPrototype = GetIntrinsic('%Array.prototype%');
var $RangeError = GetIntrinsic('%RangeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var IsInteger = require('./IsInteger');

var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1;

var $setProto = GetIntrinsic('%Object.setPrototypeOf%', true) || (
	// eslint-disable-next-line no-proto, no-negated-condition
	[].__proto__ !== $ArrayPrototype
		? null
		: function (O, proto) {
			O.__proto__ = proto; // eslint-disable-line no-proto, no-param-reassign
			return O;
		}
);

// https://ecma-international.org/ecma-262/6.0/#sec-arraycreate

module.exports = function ArrayCreate(length) {
	if (!IsInteger(length) || length < 0) {
		throw new $TypeError('Assertion failed: `length` must be an integer Number >= 0');
	}
	if (length > MAX_ARRAY_LENGTH) {
		throw new $RangeError('length is greater than (2**32 - 1)');
	}
	var proto = arguments.length > 1 ? arguments[1] : $ArrayPrototype;
	var A = []; // steps 5 - 7, and 9
	if (proto !== $ArrayPrototype) { // step 8
		if (!$setProto) {
			throw new $SyntaxError('ArrayCreate: a `proto` argument that is not `Array.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
		}
		$setProto(A, proto);
	}
	if (length !== 0) { // bypasses the need for step 2
		A.length = length;
	}
	/* step 10, the above as a shortcut for the below
	OrdinaryDefineOwnProperty(A, 'length', {
		'[[Configurable]]': false,
		'[[Enumerable]]': false,
		'[[Value]]': length,
		'[[Writable]]': true
	});
	*/
	return A;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $RangeError = GetIntrinsic('%RangeError%');
var $TypeError = GetIntrinsic('%TypeError%');

var assign = require('object.assign');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var IsArray = require('./IsArray');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var OrdinaryDefineOwnProperty = require('./OrdinaryDefineOwnProperty');
var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
var ToNumber = require('./ToNumber');
var ToString = require('./ToString');
var ToUint32 = require('./ToUint32');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-arraysetlength

// eslint-disable-next-line max-statements, max-lines-per-function
module.exports = function ArraySetLength(A, Desc) {
	if (!IsArray(A)) {
		throw new $TypeError('Assertion failed: A must be an Array');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (!('[[Value]]' in Desc)) {
		return OrdinaryDefineOwnProperty(A, 'length', Desc);
	}
	var newLenDesc = assign({}, Desc);
	var newLen = ToUint32(Desc['[[Value]]']);
	var numberLen = ToNumber(Desc['[[Value]]']);
	if (newLen !== numberLen) {
		throw new $RangeError('Invalid array length');
	}
	newLenDesc['[[Value]]'] = newLen;
	var oldLenDesc = OrdinaryGetOwnProperty(A, 'length');
	if (!IsDataDescriptor(oldLenDesc)) {
		throw new $TypeError('Assertion failed: an array had a non-data descriptor on `length`');
	}
	var oldLen = oldLenDesc['[[Value]]'];
	if (newLen >= oldLen) {
		return OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
	}
	if (!oldLenDesc['[[Writable]]']) {
		return false;
	}
	var newWritable;
	if (!('[[Writable]]' in newLenDesc) || newLenDesc['[[Writable]]']) {
		newWritable = true;
	} else {
		newWritable = false;
		newLenDesc['[[Writable]]'] = true;
	}
	var succeeded = OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
	if (!succeeded) {
		return false;
	}
	while (newLen < oldLen) {
		oldLen -= 1;
		// eslint-disable-next-line no-param-reassign
		var deleteSucceeded = delete A[ToString(oldLen)];
		if (!deleteSucceeded) {
			newLenDesc['[[Value]]'] = oldLen + 1;
			if (!newWritable) {
				newLenDesc['[[Writable]]'] = false;
				OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
				return false;
			}
		}
	}
	if (!newWritable) {
		return OrdinaryDefineOwnProperty(A, 'length', { '[[Writable]]': false });
	}
	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Array = GetIntrinsic('%Array%');
var $species = GetIntrinsic('%Symbol.species%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsArray = require('./IsArray');
var IsConstructor = require('./IsConstructor');
var IsInteger = require('./IsInteger');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate

module.exports = function ArraySpeciesCreate(originalArray, length) {
	if (!IsInteger(length) || length < 0) {
		throw new $TypeError('Assertion failed: length must be an integer >= 0');
	}
	var len = length === 0 ? 0 : length;
	var C;
	var isArray = IsArray(originalArray);
	if (isArray) {
		C = Get(originalArray, 'constructor');
		// TODO: figure out how to make a cross-realm normal Array, a same-realm Array
		// if (IsConstructor(C)) {
		// 	if C is another realm's Array, C = undefined
		// 	Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?
		// }
		if ($species && Type(C) === 'Object') {
			C = Get(C, $species);
			if (C === null) {
				C = void 0;
			}
		}
	}
	if (typeof C === 'undefined') {
		return $Array(len);
	}
	if (!IsConstructor(C)) {
		throw new $TypeError('C must be a constructor');
	}
	return new C(len); // Construct(C, len);
};

'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');

var IsArray = require('./IsArray');

var $apply = GetIntrinsic('%Reflect.apply%', true) || callBound('%Function.prototype.apply%');

// https://ecma-international.org/ecma-262/6.0/#sec-call

module.exports = function Call(F, V) {
	var argumentsList = arguments.length > 2 ? arguments[2] : [];
	if (!IsArray(argumentsList)) {
		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
	}
	return $apply(F, V, argumentsList);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var SameValue = require('./SameValue');
var ToNumber = require('./ToNumber');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring

module.exports = function CanonicalNumericIndexString(argument) {
	if (Type(argument) !== 'String') {
		throw new $TypeError('Assertion failed: `argument` must be a String');
	}
	if (argument === '-0') { return -0; }
	var n = ToNumber(argument);
	if (SameValue(ToString(n), argument)) { return n; }
	return void 0;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $fromCharCode = GetIntrinsic('%String.fromCharCode%');
var $TypeError = GetIntrinsic('%TypeError%');
var $charCodeAt = callBound('%String.prototype.charCodeAt%');
var $push = callBound('%Array.prototype.push%');

module.exports = function CharacterRange(A, B) {
	if (A.length !== 1 || B.length !== 1) {
		throw new $TypeError('Assertion failed: CharSets A and B contain exactly one character');
	}

	var a = A[0];
	var b = B[0];

	var i = $charCodeAt(a, 0);
	var j = $charCodeAt(b, 0);

	if (!(i <= j)) {
		throw new $TypeError('Assertion failed: i is not <= j');
	}

	var arr = [];
	for (var k = i; k <= j; k += 1) {
		$push(arr, $fromCharCode(k));
	}
	return arr;
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var IsDataDescriptor = require('./IsDataDescriptor');
var IsGenericDescriptor = require('./IsGenericDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor

module.exports = function CompletePropertyDescriptor(Desc) {
	/* eslint no-param-reassign: 0 */
	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
		if (!has(Desc, '[[Value]]')) {
			Desc['[[Value]]'] = void 0;
		}
		if (!has(Desc, '[[Writable]]')) {
			Desc['[[Writable]]'] = false;
		}
	} else {
		if (!has(Desc, '[[Get]]')) {
			Desc['[[Get]]'] = void 0;
		}
		if (!has(Desc, '[[Set]]')) {
			Desc['[[Set]]'] = void 0;
		}
	}
	if (!has(Desc, '[[Enumerable]]')) {
		Desc['[[Enumerable]]'] = false;
	}
	if (!has(Desc, '[[Configurable]]')) {
		Desc['[[Configurable]]'] = false;
	}
	return Desc;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createdataproperty

module.exports = function CreateDataProperty(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	var oldDesc = OrdinaryGetOwnProperty(O, P);
	var extensible = !oldDesc || IsExtensible(O);
	var nonConfigurable = oldDesc && !oldDesc['[[Configurable]]'];
	if (nonConfigurable || !extensible) {
		return false;
	}
	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		{
			'[[Configurable]]': true,
			'[[Enumerable]]': true,
			'[[Value]]': V,
			'[[Writable]]': true
		}
	);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var CreateDataProperty = require('./CreateDataProperty');
var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// // https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow

module.exports = function CreateDataPropertyOrThrow(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	var success = CreateDataProperty(O, P, V);
	if (!success) {
		throw new $TypeError('unable to create data property');
	}
	return success;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $replace = callBound('String.prototype.replace');

var RequireObjectCoercible = require('./RequireObjectCoercible');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createhtml

module.exports = function CreateHTML(string, tag, attribute, value) {
	if (Type(tag) !== 'String' || Type(attribute) !== 'String') {
		throw new $TypeError('Assertion failed: `tag` and `attribute` must be strings');
	}
	var str = RequireObjectCoercible(string);
	var S = ToString(str);
	var p1 = '<' + tag;
	if (attribute !== '') {
		var V = ToString(value);
		var escapedV = $replace(V, /\x22/g, '&quot;');
		p1 += '\x20' + attribute + '\x3D\x22' + escapedV + '\x22';
	}
	return p1 + '>' + S + '</' + tag + '>';
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject

module.exports = function CreateIterResultObject(value, done) {
	if (Type(done) !== 'Boolean') {
		throw new $TypeError('Assertion failed: Type(done) is not Boolean');
	}
	return {
		value: value,
		done: done
	};
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');
var $indexOf = callBound('Array.prototype.indexOf', true) || callBound('String.prototype.indexOf');
var $push = callBound('Array.prototype.push');

var Get = require('./Get');
var IsArray = require('./IsArray');
var ToLength = require('./ToLength');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createlistfromarraylike
module.exports = function CreateListFromArrayLike(obj) {
	var elementTypes = arguments.length > 1
		? arguments[1]
		: ['Undefined', 'Null', 'Boolean', 'String', 'Symbol', 'Number', 'Object'];

	if (Type(obj) !== 'Object') {
		throw new $TypeError('Assertion failed: `obj` must be an Object');
	}
	if (!IsArray(elementTypes)) {
		throw new $TypeError('Assertion failed: `elementTypes`, if provided, must be an array');
	}
	var len = ToLength(Get(obj, 'length'));
	var list = [];
	var index = 0;
	while (index < len) {
		var indexName = ToString(index);
		var next = Get(obj, indexName);
		var nextType = Type(next);
		if ($indexOf(elementTypes, nextType) < 0) {
			throw new $TypeError('item type ' + nextType + ' is not a valid elementType');
		}
		$push(list, next);
		index += 1;
	}
	return list;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createmethodproperty

module.exports = function CreateMethodProperty(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	var newDesc = {
		'[[Configurable]]': true,
		'[[Enumerable]]': false,
		'[[Value]]': V,
		'[[Writable]]': true
	};
	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		newDesc
	);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');
var MonthFromTime = require('./MonthFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.5

module.exports = function DateFromTime(t) {
	var m = MonthFromTime(t);
	var d = DayWithinYear(t);
	if (m === 0) {
		return d + 1;
	}
	if (m === 1) {
		return d - 30;
	}
	var leap = InLeapYear(t);
	if (m === 2) {
		return d - 58 - leap;
	}
	if (m === 3) {
		return d - 89 - leap;
	}
	if (m === 4) {
		return d - 119 - leap;
	}
	if (m === 5) {
		return d - 150 - leap;
	}
	if (m === 6) {
		return d - 180 - leap;
	}
	if (m === 7) {
		return d - 211 - leap;
	}
	if (m === 8) {
		return d - 242 - leap;
	}
	if (m === 9) {
		return d - 272 - leap;
	}
	if (m === 10) {
		return d - 303 - leap;
	}
	if (m === 11) {
		return d - 333 - leap;
	}
	throw new $EvalError('Assertion failed: MonthFromTime returned an impossible value: ' + m);
};
'use strict';

var floor = require('./floor');

var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.2

module.exports = function Day(t) {
	return floor(t / msPerDay);
};
'use strict';

var floor = require('./floor');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function DayFromYear(y) {
	return (365 * (y - 1970)) + floor((y - 1969) / 4) - floor((y - 1901) / 100) + floor((y - 1601) / 400);
};

'use strict';

var Day = require('./Day');
var DayFromYear = require('./DayFromYear');
var YearFromTime = require('./YearFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.4

module.exports = function DayWithinYear(t) {
	return Day(t) - DayFromYear(YearFromTime(t));
};
'use strict';

var modulo = require('./modulo');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function DaysInYear(y) {
	if (modulo(y, 4) !== 0) {
		return 365;
	}
	if (modulo(y, 100) !== 0) {
		return 366;
	}
	if (modulo(y, 400) !== 0) {
		return 365;
	}
	return 366;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow

module.exports = function DefinePropertyOrThrow(O, P, desc) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	var Desc = isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, desc) ? desc : ToPropertyDescriptor(desc);
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc is not a valid Property Descriptor');
	}

	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		Desc
	);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-deletepropertyorthrow

module.exports = function DeletePropertyOrThrow(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// eslint-disable-next-line no-param-reassign
	var success = delete O[P];
	if (!success) {
		throw new $TypeError('Attempt to delete property failed.');
	}
	return success;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var objectKeys = require('object-keys');

var callBound = require('call-bind/callBound');

var callBind = require('call-bind');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');
var $pushApply = callBind.apply(GetIntrinsic('%Array.prototype.push%'));

var forEach = require('../helpers/forEach');

var Type = require('./Type');

// https://262.ecma-international.org/8.0/#sec-enumerableownproperties

module.exports = function EnumerableOwnProperties(O, kind) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	var keys = objectKeys(O);
	if (kind === 'key') {
		return keys;
	}
	if (kind === 'value' || kind === 'key+value') {
		var results = [];
		forEach(keys, function (key) {
			if ($isEnumerable(O, key)) {
				$pushApply(results, [
					kind === 'value' ? O[key] : [key, O[key]]
				]);
			}
		});
		return results;
	}
	throw new $TypeError('Assertion failed: "kind" is not "key", "value", or "key+value": ' + kind);
};
'use strict';

var assertRecord = require('../helpers/assertRecord');
var fromPropertyDescriptor = require('../helpers/fromPropertyDescriptor');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-frompropertydescriptor

module.exports = function FromPropertyDescriptor(Desc) {
	if (typeof Desc !== 'undefined') {
		assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
	}

	return fromPropertyDescriptor(Desc);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var inspect = require('object-inspect');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-get-o-p

module.exports = function Get(O, P) {
	// 7.3.1.1
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	// 7.3.1.2
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true, got ' + inspect(P));
	}
	// 7.3.1.3
	return O[P];
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var getIteratorMethod = require('../helpers/getIteratorMethod');
var AdvanceStringIndex = require('./AdvanceStringIndex');
var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsArray = require('./IsArray');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getiterator

module.exports = function GetIterator(obj, method) {
	var actualMethod = method;
	if (arguments.length < 2) {
		actualMethod = getIteratorMethod(
			{
				AdvanceStringIndex: AdvanceStringIndex,
				GetMethod: GetMethod,
				IsArray: IsArray
			},
			obj
		);
	}
	var iterator = Call(actualMethod, obj);
	if (Type(iterator) !== 'Object') {
		throw new $TypeError('iterator must return an object');
	}

	return iterator;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var GetV = require('./GetV');
var IsCallable = require('./IsCallable');
var IsPropertyKey = require('./IsPropertyKey');

// https://ecma-international.org/ecma-262/6.0/#sec-getmethod

module.exports = function GetMethod(O, P) {
	// 7.3.9.1
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// 7.3.9.2
	var func = GetV(O, P);

	// 7.3.9.4
	if (func == null) {
		return void 0;
	}

	// 7.3.9.5
	if (!IsCallable(func)) {
		throw new $TypeError(P + 'is not a function');
	}

	// 7.3.9.6
	return func;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var hasSymbols = require('has-symbols')();

var $TypeError = GetIntrinsic('%TypeError%');

var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%', true);
var $gOPS = hasSymbols && GetIntrinsic('%Object.getOwnPropertySymbols%', true);
var keys = require('object-keys');

var esType = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getownpropertykeys

module.exports = function GetOwnPropertyKeys(O, Type) {
	if (esType(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (Type === 'Symbol') {
		return $gOPS ? $gOPS(O) : [];
	}
	if (Type === 'String') {
		if (!$gOPN) {
			return keys(O);
		}
		return $gOPN(O);
	}
	throw new $TypeError('Assertion failed: `Type` must be `"String"` or `"Symbol"`');
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Function = GetIntrinsic('%Function%');
var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsConstructor = require('./IsConstructor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getprototypefromconstructor

module.exports = function GetPrototypeFromConstructor(constructor, intrinsicDefaultProto) {
	var intrinsic = GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
	if (!IsConstructor(constructor)) {
		throw new $TypeError('Assertion failed: `constructor` must be a constructor');
	}
	var proto = Get(constructor, 'prototype');
	if (Type(proto) !== 'Object') {
		if (!(constructor instanceof $Function)) {
			// ignore other realms, for now
			throw new $TypeError('cross-realm constructors not currently supported');
		}
		proto = intrinsic;
	}
	return proto;
};

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $parseInt = GetIntrinsic('%parseInt%');

var inspect = require('object-inspect');

var regexTester = require('../helpers/regexTester');
var callBound = require('call-bind/callBound');
var every = require('../helpers/every');

var isDigit = regexTester(/^[0-9]$/);

var $charAt = callBound('String.prototype.charAt');
var $strSlice = callBound('String.prototype.slice');

var IsArray = require('./IsArray');
var IsInteger = require('./IsInteger');
var Type = require('./Type');

var canDistinguishSparseFromUndefined = 0 in [undefined]; // IE 6 - 8 have a bug where this returns false

var isStringOrHole = function (capture, index, arr) {
	return Type(capture) === 'String' || (canDistinguishSparseFromUndefined ? !(index in arr) : Type(capture) === 'Undefined');
};

// https://ecma-international.org/ecma-262/6.0/#sec-getsubstitution

// eslint-disable-next-line max-statements, max-params, max-lines-per-function
module.exports = function GetSubstitution(matched, str, position, captures, replacement) {
	if (Type(matched) !== 'String') {
		throw new $TypeError('Assertion failed: `matched` must be a String');
	}
	var matchLength = matched.length;

	if (Type(str) !== 'String') {
		throw new $TypeError('Assertion failed: `str` must be a String');
	}
	var stringLength = str.length;

	if (!IsInteger(position) || position < 0 || position > stringLength) {
		throw new $TypeError('Assertion failed: `position` must be a nonnegative integer, and less than or equal to the length of `string`, got ' + inspect(position));
	}

	if (!IsArray(captures) || !every(captures, isStringOrHole)) {
		throw new $TypeError('Assertion failed: `captures` must be a List of Strings, got ' + inspect(captures));
	}

	if (Type(replacement) !== 'String') {
		throw new $TypeError('Assertion failed: `replacement` must be a String');
	}

	var tailPos = position + matchLength;
	var m = captures.length;

	var result = '';
	for (var i = 0; i < replacement.length; i += 1) {
		// if this is a $, and it's not the end of the replacement
		var current = $charAt(replacement, i);
		var isLast = (i + 1) >= replacement.length;
		var nextIsLast = (i + 2) >= replacement.length;
		if (current === '$' && !isLast) {
			var next = $charAt(replacement, i + 1);
			if (next === '$') {
				result += '$';
				i += 1;
			} else if (next === '&') {
				result += matched;
				i += 1;
			} else if (next === '`') {
				result += position === 0 ? '' : $strSlice(str, 0, position - 1);
				i += 1;
			} else if (next === "'") {
				result += tailPos >= stringLength ? '' : $strSlice(str, tailPos);
				i += 1;
			} else {
				var nextNext = nextIsLast ? null : $charAt(replacement, i + 2);
				if (isDigit(next) && next !== '0' && (nextIsLast || !isDigit(nextNext))) {
					// $1 through $9, and not followed by a digit
					var n = $parseInt(next, 10);
					// if (n > m, impl-defined)
					result += n <= m && Type(captures[n - 1]) === 'Undefined' ? '' : captures[n - 1];
					i += 1;
				} else if (isDigit(next) && (nextIsLast || isDigit(nextNext))) {
					// $00 through $99
					var nn = next + nextNext;
					var nnI = $parseInt(nn, 10) - 1;
					// if nn === '00' or nn > m, impl-defined
					result += nn <= m && Type(captures[nnI]) === 'Undefined' ? '' : captures[nnI];
					i += 2;
				} else {
					result += '$';
				}
			}
		} else {
			// the final $, or else not a $
			result += $charAt(replacement, i);
		}
	}
	return result;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var ToObject = require('./ToObject');

// https://ecma-international.org/ecma-262/6.0/#sec-getv

module.exports = function GetV(V, P) {
	// 7.3.2.1
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// 7.3.2.2-3
	var O = ToObject(V);

	// 7.3.2.4
	return O[P];
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var has = require('has');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty

module.exports = function HasOwnProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	return has(O, P);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-hasproperty

module.exports = function HasProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	return P in O;
};
'use strict';

var floor = require('./floor');
var modulo = require('./modulo');

var timeConstants = require('../helpers/timeConstants');
var msPerHour = timeConstants.msPerHour;
var HoursPerDay = timeConstants.HoursPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function HourFromTime(t) {
	return modulo(floor(t / msPerHour), HoursPerDay);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DaysInYear = require('./DaysInYear');
var YearFromTime = require('./YearFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function InLeapYear(t) {
	var days = DaysInYear(YearFromTime(t));
	if (days === 365) {
		return 0;
	}
	if (days === 366) {
		return 1;
	}
	throw new $EvalError('Assertion failed: there are not 365 or 366 days in a year, got: ' + days);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $hasInstance = GetIntrinsic('Symbol.hasInstance', true);

var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsCallable = require('./IsCallable');
var OrdinaryHasInstance = require('./OrdinaryHasInstance');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-instanceofoperator

module.exports = function InstanceofOperator(O, C) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	var instOfHandler = $hasInstance ? GetMethod(C, $hasInstance) : void 0;
	if (typeof instOfHandler !== 'undefined') {
		return ToBoolean(Call(instOfHandler, C, [O]));
	}
	if (!IsCallable(C)) {
		throw new $TypeError('`C` is not Callable');
	}
	return OrdinaryHasInstance(C, O);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var IsArray = require('./IsArray');
var GetV = require('./GetV');
var IsPropertyKey = require('./IsPropertyKey');

// https://ecma-international.org/ecma-262/6.0/#sec-invoke

module.exports = function Invoke(O, P) {
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	var argumentsList = arguments.length > 2 ? arguments[2] : [];
	if (!IsArray(argumentsList)) {
		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
	}
	var func = GetV(O, P);
	return Call(func, O, argumentsList);
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isaccessordescriptor

module.exports = function IsAccessorDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Get]]') && !has(Desc, '[[Set]]')) {
		return false;
	}

	return true;
};
'use strict';

// https://ecma-international.org/ecma-262/6.0/#sec-isarray
module.exports = require('../helpers/IsArray');
'use strict';

// http://262.ecma-international.org/5.1/#sec-9.11

module.exports = require('is-callable');
'use strict';

var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');

// https://262.ecma-international.org/6.0/#sec-iscompatiblepropertydescriptor

module.exports = function IsCompatiblePropertyDescriptor(Extensible, Desc, Current) {
	return ValidateAndApplyPropertyDescriptor(undefined, undefined, Extensible, Desc, Current);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $isConcatSpreadable = GetIntrinsic('%Symbol.isConcatSpreadable%', true);

var Get = require('./Get');
var IsArray = require('./IsArray');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable

module.exports = function IsConcatSpreadable(O) {
	if (Type(O) !== 'Object') {
		return false;
	}
	if ($isConcatSpreadable) {
		var spreadable = Get(O, $isConcatSpreadable);
		if (typeof spreadable !== 'undefined') {
			return ToBoolean(spreadable);
		}
	}
	return IsArray(O);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic.js');

var $construct = GetIntrinsic('%Reflect.construct%', true);

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
try {
	DefinePropertyOrThrow({}, '', { '[[Get]]': function () {} });
} catch (e) {
	// Accessor properties aren't supported
	DefinePropertyOrThrow = null;
}

// https://ecma-international.org/ecma-262/6.0/#sec-isconstructor

if (DefinePropertyOrThrow && $construct) {
	var isConstructorMarker = {};
	var badArrayLike = {};
	DefinePropertyOrThrow(badArrayLike, 'length', {
		'[[Get]]': function () {
			throw isConstructorMarker;
		},
		'[[Enumerable]]': true
	});

	module.exports = function IsConstructor(argument) {
		try {
			// `Reflect.construct` invokes `IsConstructor(target)` before `Get(args, 'length')`:
			$construct(argument, badArrayLike);
		} catch (err) {
			return err === isConstructorMarker;
		}
	};
} else {
	module.exports = function IsConstructor(argument) {
		// unfortunately there's no way to truly check this without try/catch `new argument` in old environments
		return typeof argument === 'function' && !!argument.prototype;
	};
}
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isdatadescriptor

module.exports = function IsDataDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Value]]') && !has(Desc, '[[Writable]]')) {
		return false;
	}

	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $preventExtensions = GetIntrinsic('%Object.preventExtensions%', true);
var $isExtensible = GetIntrinsic('%Object.isExtensible%', true);

var isPrimitive = require('../helpers/isPrimitive');

// https://ecma-international.org/ecma-262/6.0/#sec-isextensible-o

module.exports = $preventExtensions
	? function IsExtensible(obj) {
		return !isPrimitive(obj) && $isExtensible(obj);
	}
	: function IsExtensible(obj) {
		return !isPrimitive(obj);
	};
'use strict';

var assertRecord = require('../helpers/assertRecord');

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isgenericdescriptor

module.exports = function IsGenericDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!IsAccessorDescriptor(Desc) && !IsDataDescriptor(Desc)) {
		return true;
	}

	return false;
};
'use strict';

var abs = require('./abs');
var floor = require('./floor');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');

// https://ecma-international.org/ecma-262/6.0/#sec-isinteger

module.exports = function IsInteger(argument) {
	if (typeof argument !== 'number' || $isNaN(argument) || !$isFinite(argument)) {
		return false;
	}
	var absValue = abs(argument);
	return floor(absValue) === absValue;
};
'use strict';

var callBound = require('call-bind/callBound');

var $PromiseThen = callBound('Promise.prototype.then', true);

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ispromise

module.exports = function IsPromise(x) {
	if (Type(x) !== 'Object') {
		return false;
	}
	if (!$PromiseThen) { // Promises are not supported
		return false;
	}
	try {
		$PromiseThen(x); // throws if not a promise
	} catch (e) {
		return false;
	}
	return true;
};
'use strict';

// TODO, semver-major: delete this

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var Type = require('./Type');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');

// https://262.ecma-international.org/6.0/#sec-property-descriptor-specification-type

module.exports = function IsPropertyDescriptor(Desc) {
	return isPropertyDescriptor({
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor,
		Type: Type
	}, Desc);
};
'use strict';

// https://ecma-international.org/ecma-262/6.0/#sec-ispropertykey

module.exports = function IsPropertyKey(argument) {
	return typeof argument === 'string' || typeof argument === 'symbol';
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $match = GetIntrinsic('%Symbol.match%', true);

var hasRegExpMatcher = require('is-regex');

var ToBoolean = require('./ToBoolean');

// https://ecma-international.org/ecma-262/6.0/#sec-isregexp

module.exports = function IsRegExp(argument) {
	if (!argument || typeof argument !== 'object') {
		return false;
	}
	if ($match) {
		var isRegExp = argument[$match];
		if (typeof isRegExp !== 'undefined') {
			return ToBoolean(isRegExp);
		}
	}
	return hasRegExpMatcher(argument);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');

var isSharedArrayBuffer = require('is-shared-array-buffer');

// https://262.ecma-international.org/8.0/#sec-issharedarraybuffer

module.exports = function IsSharedArrayBuffer(obj) {
	if (Type(obj) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	return isSharedArrayBuffer(obj);
};
'use strict';

var callBound = require('call-bind/callBound');
var $arrayPush = callBound('Array.prototype.push');

var GetIterator = require('./GetIterator');
var IteratorStep = require('./IteratorStep');
var IteratorValue = require('./IteratorValue');

// https://262.ecma-international.org/8.0/#sec-iterabletolist

module.exports = function IterableToList(items, method) {
	var iterator = GetIterator(items, method);
	var values = [];
	var next = true;
	while (next) {
		next = IteratorStep(iterator);
		if (next) {
			var nextValue = IteratorValue(next);
			$arrayPush(values, nextValue);
		}
	}
	return values;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose

module.exports = function IteratorClose(iterator, completion) {
	if (Type(iterator) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterator) is not Object');
	}
	if (!IsCallable(completion)) {
		throw new $TypeError('Assertion failed: completion is not a thunk for a Completion Record');
	}
	var completionThunk = completion;

	var iteratorReturn = GetMethod(iterator, 'return');

	if (typeof iteratorReturn === 'undefined') {
		return completionThunk();
	}

	var completionRecord;
	try {
		var innerResult = Call(iteratorReturn, iterator, []);
	} catch (e) {
		// if we hit here, then "e" is the innerResult completion that needs re-throwing

		// if the completion is of type "throw", this will throw.
		completionThunk();
		completionThunk = null; // ensure it's not called twice.

		// if not, then return the innerResult completion
		throw e;
	}
	completionRecord = completionThunk(); // if innerResult worked, then throw if the completion does
	completionThunk = null; // ensure it's not called twice.

	if (Type(innerResult) !== 'Object') {
		throw new $TypeError('iterator .return must return an object');
	}

	return completionRecord;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete

module.exports = function IteratorComplete(iterResult) {
	if (Type(iterResult) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
	}
	return ToBoolean(Get(iterResult, 'done'));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Invoke = require('./Invoke');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratornext

module.exports = function IteratorNext(iterator, value) {
	var result = Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);
	if (Type(result) !== 'Object') {
		throw new $TypeError('iterator next must return an object');
	}
	return result;
};
'use strict';

var IteratorComplete = require('./IteratorComplete');
var IteratorNext = require('./IteratorNext');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep

module.exports = function IteratorStep(iterator) {
	var result = IteratorNext(iterator);
	var done = IteratorComplete(result);
	return done === true ? false : result;
};

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue

module.exports = function IteratorValue(iterResult) {
	if (Type(iterResult) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
	}
	return Get(iterResult, 'value');
};

'use strict';

var $isFinite = require('../helpers/isFinite');
var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.13

module.exports = function MakeDate(day, time) {
	if (!$isFinite(day) || !$isFinite(time)) {
		return NaN;
	}
	return (day * msPerDay) + time;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $DateUTC = GetIntrinsic('%Date.UTC%');

var $isFinite = require('../helpers/isFinite');

var DateFromTime = require('./DateFromTime');
var Day = require('./Day');
var floor = require('./floor');
var modulo = require('./modulo');
var MonthFromTime = require('./MonthFromTime');
var ToInteger = require('./ToInteger');
var YearFromTime = require('./YearFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.12

module.exports = function MakeDay(year, month, date) {
	if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) {
		return NaN;
	}
	var y = ToInteger(year);
	var m = ToInteger(month);
	var dt = ToInteger(date);
	var ym = y + floor(m / 12);
	var mn = modulo(m, 12);
	var t = $DateUTC(ym, mn, 1);
	if (YearFromTime(t) !== ym || MonthFromTime(t) !== mn || DateFromTime(t) !== 1) {
		return NaN;
	}
	return Day(t) + dt - 1;
};
'use strict';

var $isFinite = require('../helpers/isFinite');
var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var msPerMinute = timeConstants.msPerMinute;
var msPerHour = timeConstants.msPerHour;

var ToInteger = require('./ToInteger');

// https://262.ecma-international.org/5.1/#sec-15.9.1.11

module.exports = function MakeTime(hour, min, sec, ms) {
	if (!$isFinite(hour) || !$isFinite(min) || !$isFinite(sec) || !$isFinite(ms)) {
		return NaN;
	}
	var h = ToInteger(hour);
	var m = ToInteger(min);
	var s = ToInteger(sec);
	var milli = ToInteger(ms);
	var t = (h * msPerHour) + (m * msPerMinute) + (s * msPerSecond) + milli;
	return t;
};
'use strict';

var floor = require('./floor');
var modulo = require('./modulo');

var timeConstants = require('../helpers/timeConstants');
var msPerMinute = timeConstants.msPerMinute;
var MinutesPerHour = timeConstants.MinutesPerHour;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function MinFromTime(t) {
	return modulo(floor(t / msPerMinute), MinutesPerHour);
};
'use strict';

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');

// https://262.ecma-international.org/5.1/#sec-15.9.1.4

module.exports = function MonthFromTime(t) {
	var day = DayWithinYear(t);
	if (0 <= day && day < 31) {
		return 0;
	}
	var leap = InLeapYear(t);
	if (31 <= day && day < (59 + leap)) {
		return 1;
	}
	if ((59 + leap) <= day && day < (90 + leap)) {
		return 2;
	}
	if ((90 + leap) <= day && day < (120 + leap)) {
		return 3;
	}
	if ((120 + leap) <= day && day < (151 + leap)) {
		return 4;
	}
	if ((151 + leap) <= day && day < (181 + leap)) {
		return 5;
	}
	if ((181 + leap) <= day && day < (212 + leap)) {
		return 6;
	}
	if ((212 + leap) <= day && day < (243 + leap)) {
		return 7;
	}
	if ((243 + leap) <= day && day < (273 + leap)) {
		return 8;
	}
	if ((273 + leap) <= day && day < (304 + leap)) {
		return 9;
	}
	if ((304 + leap) <= day && day < (334 + leap)) {
		return 10;
	}
	if ((334 + leap) <= day && day < (365 + leap)) {
		return 11;
	}
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $ObjectCreate = GetIntrinsic('%Object.create%', true);
var $TypeError = GetIntrinsic('%TypeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');

var Type = require('./Type');

var hasProto = !({ __proto__: null } instanceof Object);

// https://ecma-international.org/ecma-262/6.0/#sec-objectcreate

module.exports = function ObjectCreate(proto, internalSlotsList) {
	if (proto !== null && Type(proto) !== 'Object') {
		throw new $TypeError('Assertion failed: `proto` must be null or an object');
	}
	var slots = arguments.length < 2 ? [] : internalSlotsList;
	if (slots.length > 0) {
		throw new $SyntaxError('es-abstract does not yet support internal slots');
	}

	if ($ObjectCreate) {
		return $ObjectCreate(proto);
	}
	if (hasProto) {
		return { __proto__: proto };
	}

	if (proto === null) {
		throw new $SyntaxError('native Object.create support is required to create null objects');
	}
	var T = function T() {};
	T.prototype = proto;
	return new T();
};
'use strict';

var callBound = require('call-bind/callBound');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var Get = require('./Get');
var ToObject = require('./ToObject');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');

var forEach = require('../helpers/forEach');
var getOwnPropertyDescriptor = require('../helpers/getOwnPropertyDescriptor');
var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');

var $push = callBound('Array.prototype.push');

// https://262.ecma-international.org/6.0/#sec-objectdefineproperties
module.exports = function ObjectDefineProperties(O, Properties) {
	var props = ToObject(Properties); // step 1
	var keys = OwnPropertyKeys(props); // step 2
	var descriptors = []; // step 3

	forEach(keys, function (nextKey) { // step 4
		var propDesc = ToPropertyDescriptor(getOwnPropertyDescriptor(props, nextKey)); // step 4.a
		if (typeof propDesc !== 'undefined' && propDesc['[[Enumerable]]']) { // step 4.b
			var descObj = Get(props, nextKey); // step 4.b.i
			var desc = ToPropertyDescriptor(descObj); // step 4.b.ii
			$push(descriptors, [nextKey, desc]); // step 4.b.iii
		}
	});

	forEach(descriptors, function (pair) { // step 5
		var P = pair[0]; // step 5.a
		var desc = pair[1]; // step 5.b
		desc = FromPropertyDescriptor(desc); // TODO: remove this once DefinePropertyOrThrow is fixed
		DefinePropertyOrThrow(O, P, desc); // step 5.c
	});

	return O; // step 6
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var $TypeError = GetIntrinsic('%TypeError%');

var GetPrototypeFromConstructor = require('./GetPrototypeFromConstructor');
var IsArray = require('./IsArray');
var ObjectCreate = require('./ObjectCreate');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinarycreatefromconstructor

module.exports = function OrdinaryCreateFromConstructor(constructor, intrinsicDefaultProto) {
	GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
	var proto = GetPrototypeFromConstructor(constructor, intrinsicDefaultProto);
	var slots = arguments.length < 3 ? [] : arguments[2];
	if (!IsArray(slots)) {
		throw new $TypeError('Assertion failed: if provided, `internalSlotsList` must be a List');
	}
	return ObjectCreate(proto, slots);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var IsPropertyKey = require('./IsPropertyKey');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var SameValue = require('./SameValue');
var Type = require('./Type');
var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinarydefineownproperty

module.exports = function OrdinaryDefineOwnProperty(O, P, Desc) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (!$gOPD) {
		// ES3/IE 8 fallback
		if (IsAccessorDescriptor(Desc)) {
			throw new $SyntaxError('This environment does not support accessor property descriptors.');
		}
		var creatingNormalDataProperty = !(P in O)
			&& Desc['[[Writable]]']
			&& Desc['[[Enumerable]]']
			&& Desc['[[Configurable]]']
			&& '[[Value]]' in Desc;
		var settingExistingDataProperty = (P in O)
			&& (!('[[Configurable]]' in Desc) || Desc['[[Configurable]]'])
			&& (!('[[Enumerable]]' in Desc) || Desc['[[Enumerable]]'])
			&& (!('[[Writable]]' in Desc) || Desc['[[Writable]]'])
			&& '[[Value]]' in Desc;
		if (creatingNormalDataProperty || settingExistingDataProperty) {
			O[P] = Desc['[[Value]]']; // eslint-disable-line no-param-reassign
			return SameValue(O[P], Desc['[[Value]]']);
		}
		throw new $SyntaxError('This environment does not support defining non-writable, non-enumerable, or non-configurable properties');
	}
	var desc = $gOPD(O, P);
	var current = desc && ToPropertyDescriptor(desc);
	var extensible = IsExtensible(O);
	return ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');

var has = require('has');

var IsArray = require('./IsArray');
var IsPropertyKey = require('./IsPropertyKey');
var IsRegExp = require('./IsRegExp');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty

module.exports = function OrdinaryGetOwnProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	if (!has(O, P)) {
		return void 0;
	}
	if (!$gOPD) {
		// ES3 / IE 8 fallback
		var arrayLength = IsArray(O) && P === 'length';
		var regexLastIndex = IsRegExp(O) && P === 'lastIndex';
		return {
			'[[Configurable]]': !(arrayLength || regexLastIndex),
			'[[Enumerable]]': $isEnumerable(O, P),
			'[[Value]]': O[P],
			'[[Writable]]': true
		};
	}
	return ToPropertyDescriptor($gOPD(O, P));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $getProto = require('../helpers/getProto');

var Type = require('./Type');

// https://262.ecma-international.org/7.0/#sec-ordinarygetprototypeof

module.exports = function OrdinaryGetPrototypeOf(O) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!$getProto) {
		throw new $TypeError('This environment does not support fetching prototypes.');
	}
	return $getProto(O);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasinstance

module.exports = function OrdinaryHasInstance(C, O) {
	if (IsCallable(C) === false) {
		return false;
	}
	if (Type(O) !== 'Object') {
		return false;
	}
	var P = Get(C, 'prototype');
	if (Type(P) !== 'Object') {
		throw new $TypeError('OrdinaryHasInstance called on an object with an invalid prototype property.');
	}
	return O instanceof C;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasproperty

module.exports = function OrdinaryHasProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	return P in O;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $setProto = require('../helpers/setProto');

var OrdinaryGetPrototypeOf = require('./OrdinaryGetPrototypeOf');
var Type = require('./Type');

// https://262.ecma-international.org/7.0/#sec-ordinarysetprototypeof

module.exports = function OrdinarySetPrototypeOf(O, V) {
	if (Type(V) !== 'Object' && Type(V) !== 'Null') {
		throw new $TypeError('Assertion failed: V must be Object or Null');
	}
	/*
	var extensible = IsExtensible(O);
	var current = OrdinaryGetPrototypeOf(O);
	if (SameValue(V, current)) {
		return true;
	}
	if (!extensible) {
		return false;
	}
	*/
	try {
		$setProto(O, V);
	} catch (e) {
		return false;
	}
	return OrdinaryGetPrototypeOf(O) === V;
	/*
	var p = V;
	var done = false;
	while (!done) {
		if (p === null) {
			done = true;
		} else if (SameValue(p, O)) {
			return false;
		} else {
			if (wat) {
				done = true;
			} else {
				p = p.[[Prototype]];
			}
		}
	}
	O.[[Prototype]] = V;
	return true;
	*/
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

var inspect = require('object-inspect');

// https://262.ecma-international.org/8.0/#sec-ordinarytoprimitive

module.exports = function OrdinaryToPrimitive(O, hint) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (/* Type(hint) !== 'String' || */ hint !== 'string' && hint !== 'number') {
		throw new $TypeError('Assertion failed: `hint` must be "string" or "number"');
	}

	var methodNames = hint === 'string' ? ['toString', 'valueOf'] : ['valueOf', 'toString'];

	for (var i = 0; i < methodNames.length; i += 1) {
		var name = methodNames[i];
		var method = Get(O, name);
		if (IsCallable(method)) {
			var result = Call(method, O);
			if (Type(result) !== 'Object') {
				return result;
			}
		}
	}

	throw new $TypeError('No primitive value for ' + inspect(O));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');
var forEach = require('../helpers/forEach');

var $charCodeAt = callBound('String.prototype.charCodeAt');
var $numberToString = callBound('Number.prototype.toString');
var $toLowerCase = callBound('String.prototype.toLowerCase');
var $strSlice = callBound('String.prototype.slice');
var $strSplit = callBound('String.prototype.split');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-quotejsonstring

var escapes = {
	'\u0008': 'b',
	'\u000C': 'f',
	'\u000A': 'n',
	'\u000D': 'r',
	'\u0009': 't'
};

module.exports = function QuoteJSONString(value) {
	if (Type(value) !== 'String') {
		throw new $TypeError('Assertion failed: `value` must be a String');
	}
	var product = '"';
	if (value) {
		forEach($strSplit(value), function (C) {
			if (C === '"' || C === '\\') {
				product += '\u005C' + C;
			} else if (C === '\u0008' || C === '\u000C' || C === '\u000A' || C === '\u000D' || C === '\u0009') {
				var abbrev = escapes[C];
				product += '\u005C' + abbrev;
			} else {
				var cCharCode = $charCodeAt(C, 0);
				if (cCharCode < 0x20) {
					product += '\u005Cu' + $toLowerCase($strSlice('0000' + $numberToString(cCharCode, 16), -4));
				} else {
					product += C;
				}
			}
		});
	}
	product += '"';
	return product;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $RegExp = GetIntrinsic('%RegExp%');

// var RegExpAlloc = require('./RegExpAlloc');
// var RegExpInitialize = require('./RegExpInitialize');
var ToString = require('./ToString');

// https://262.ecma-international.org/6.0/#sec-regexpcreate

module.exports = function RegExpCreate(P, F) {
	// var obj = RegExpAlloc($RegExp);
	// return RegExpInitialize(obj, P, F);

	// covers spec mechanics; bypass regex brand checking
	var pattern = typeof P === 'undefined' ? '' : ToString(P);
	var flags = typeof F === 'undefined' ? '' : ToString(F);
	return new $RegExp(pattern, flags);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var regexExec = require('call-bind/callBound')('RegExp.prototype.exec');

var Call = require('./Call');
var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-regexpexec

module.exports = function RegExpExec(R, S) {
	if (Type(R) !== 'Object') {
		throw new $TypeError('Assertion failed: `R` must be an Object');
	}
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	var exec = Get(R, 'exec');
	if (IsCallable(exec)) {
		var result = Call(exec, R, [S]);
		if (result === null || Type(result) === 'Object') {
			return result;
		}
		throw new $TypeError('"exec" method must return `null` or an Object');
	}
	return regexExec(R, S);
};
'use strict';

module.exports = require('../5/CheckObjectCoercible');
'use strict';

var $isNaN = require('../helpers/isNaN');

// http://262.ecma-international.org/5.1/#sec-9.12

module.exports = function SameValue(x, y) {
	if (x === y) { // 0 === -0, but they are not identical.
		if (x === 0) { return 1 / x === 1 / y; }
		return true;
	}
	return $isNaN(x) && $isNaN(y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var SameValue = require('./SameValue');

// https://262.ecma-international.org/7.0/#sec-samevaluenonnumber

module.exports = function SameValueNonNumber(x, y) {
	if (typeof x === 'number' || typeof x !== typeof y) {
		throw new $TypeError('SameValueNonNumber requires two non-number values of the same type.');
	}
	return SameValue(x, y);
};
'use strict';

var $isNaN = require('../helpers/isNaN');

// https://ecma-international.org/ecma-262/6.0/#sec-samevaluezero

module.exports = function SameValueZero(x, y) {
	return (x === y) || ($isNaN(x) && $isNaN(y));
};
'use strict';

var floor = require('./floor');
var modulo = require('./modulo');

var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var SecondsPerMinute = timeConstants.SecondsPerMinute;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function SecFromTime(t) {
	return modulo(floor(t / msPerSecond), SecondsPerMinute);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// IE 9 does not throw in strict mode when writability/configurability/extensibility is violated
var noThrowOnStrictViolation = (function () {
	try {
		delete [].length;
		return true;
	} catch (e) {
		return false;
	}
}());

// https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw

module.exports = function Set(O, P, V, Throw) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	if (Type(Throw) !== 'Boolean') {
		throw new $TypeError('Assertion failed: `Throw` must be a Boolean');
	}
	if (Throw) {
		O[P] = V; // eslint-disable-line no-param-reassign
		if (noThrowOnStrictViolation && !SameValue(O[P], V)) {
			throw new $TypeError('Attempted to assign to readonly property.');
		}
		return true;
	}
	try {
		O[P] = V; // eslint-disable-line no-param-reassign
		return noThrowOnStrictViolation ? SameValue(O[P], V) : true;
	} catch (e) {
		return false;
	}

};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var has = require('has');

var $TypeError = GetIntrinsic('%TypeError%');

var getSymbolDescription = require('get-symbol-description');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var IsExtensible = require('./IsExtensible');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-setfunctionname

module.exports = function SetFunctionName(F, name) {
	if (typeof F !== 'function') {
		throw new $TypeError('Assertion failed: `F` must be a function');
	}
	if (!IsExtensible(F) || has(F, 'name')) {
		throw new $TypeError('Assertion failed: `F` must be extensible, and must not have a `name` own property');
	}
	var nameType = Type(name);
	if (nameType !== 'Symbol' && nameType !== 'String') {
		throw new $TypeError('Assertion failed: `name` must be a Symbol or a String');
	}
	if (nameType === 'Symbol') {
		var description = getSymbolDescription(name);
		// eslint-disable-next-line no-param-reassign
		name = typeof description === 'undefined' ? '' : '[' + description + ']';
	}
	if (arguments.length > 2) {
		var prefix = arguments[2];
		// eslint-disable-next-line no-param-reassign
		name = prefix + ' ' + name;
	}
	return DefinePropertyOrThrow(F, 'name', {
		'[[Value]]': name,
		'[[Writable]]': false,
		'[[Enumerable]]': false,
		'[[Configurable]]': true
	});
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');
var $preventExtensions = GetIntrinsic('%Object.preventExtensions%', true);
var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%', true);

var forEach = require('../helpers/forEach');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-setintegritylevel

module.exports = function SetIntegrityLevel(O, level) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (level !== 'sealed' && level !== 'frozen') {
		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
	}
	if (!$preventExtensions) {
		throw new $SyntaxError('SetIntegrityLevel requires native `Object.preventExtensions` support');
	}
	var status = $preventExtensions(O);
	if (!status) {
		return false;
	}
	if (!$gOPN) {
		throw new $SyntaxError('SetIntegrityLevel requires native `Object.getOwnPropertyNames` support');
	}
	var theKeys = $gOPN(O);
	if (level === 'sealed') {
		forEach(theKeys, function (k) {
			DefinePropertyOrThrow(O, k, { configurable: false });
		});
	} else if (level === 'frozen') {
		forEach(theKeys, function (k) {
			var currentDesc = $gOPD(O, k);
			if (typeof currentDesc !== 'undefined') {
				var desc;
				if (IsAccessorDescriptor(ToPropertyDescriptor(currentDesc))) {
					desc = { configurable: false };
				} else {
					desc = { configurable: false, writable: false };
				}
				DefinePropertyOrThrow(O, k, desc);
			}
		});
	}
	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $species = GetIntrinsic('%Symbol.species%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var IsConstructor = require('./IsConstructor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor

module.exports = function SpeciesConstructor(O, defaultConstructor) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	var C = O.constructor;
	if (typeof C === 'undefined') {
		return defaultConstructor;
	}
	if (Type(C) !== 'Object') {
		throw new $TypeError('O.constructor is not an Object');
	}
	var S = $species ? C[$species] : void 0;
	if (S == null) {
		return defaultConstructor;
	}
	if (IsConstructor(S)) {
		return S;
	}
	throw new $TypeError('no constructor found');
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');

var IsInteger = require('./IsInteger');
var Type = require('./Type');

var $charAt = callBound('String.prototype.charAt');

// https://262.ecma-international.org/6.0/#sec-splitmatch

module.exports = function SplitMatch(S, q, R) {
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	if (!IsInteger(q)) {
		throw new $TypeError('Assertion failed: `q` must be an integer');
	}
	if (Type(R) !== 'String') {
		throw new $TypeError('Assertion failed: `R` must be a String');
	}
	var r = R.length;
	var s = S.length;
	if (q + r > s) {
		return false;
	}

	for (var i = 0; i < r; i += 1) {
		if ($charAt(S, q + i) !== $charAt(R, i)) {
			return false;
		}
	}

	return q + r;
};
'use strict';

var Type = require('./Type');

// https://262.ecma-international.org/5.1/#sec-11.9.6

module.exports = function StrictEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType !== yType) {
		return false;
	}
	if (xType === 'Undefined' || xType === 'Null') {
		return true;
	}
	return x === y; // shortcut for steps 4-7
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Object = GetIntrinsic('%Object%');
var $StringPrototype = GetIntrinsic('%String.prototype%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var Type = require('./Type');

var setProto = require('../helpers/setProto');

// https://262.ecma-international.org/6.0/#sec-stringcreate

module.exports = function StringCreate(value, prototype) {
	if (Type(value) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}

	var S = $Object(value);
	if (prototype !== $StringPrototype) {
		if (setProto) {
			setProto(S, prototype);
		} else {
			throw new $SyntaxError('StringCreate: a `proto` argument that is not `String.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
		}
	}

	var length = value.length;
	DefinePropertyOrThrow(S, 'length', {
		'[[Configurable]]': false,
		'[[Enumerable]]': false,
		'[[Value]]': length,
		'[[Writable]]': false
	});

	return S;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');
var $charAt = callBound('String.prototype.charAt');
var $stringToString = callBound('String.prototype.toString');

var CanonicalNumericIndexString = require('./CanonicalNumericIndexString');
var IsInteger = require('./IsInteger');
var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

var isNegativeZero = require('is-negative-zero');

// https://262.ecma-international.org/8.0/#sec-stringgetownproperty

module.exports = function StringGetOwnProperty(S, P) {
	var str;
	if (Type(S) === 'Object') {
		try {
			str = $stringToString(S);
		} catch (e) { /**/ }
	}
	if (Type(str) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a boxed string object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	if (Type(P) !== 'String') {
		return void undefined;
	}
	var index = CanonicalNumericIndexString(P);
	var len = str.length;
	if (typeof index === 'undefined' || !IsInteger(index) || isNegativeZero(index) || index < 0 || len <= index) {
		return void undefined;
	}
	var resultStr = $charAt(S, index);
	return {
		'[[Configurable]]': false,
		'[[Enumerable]]': true,
		'[[Value]]': resultStr,
		'[[Writable]]': false
	};
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $SymbolToString = callBound('Symbol.prototype.toString', true);

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-symboldescriptivestring

module.exports = function SymbolDescriptiveString(sym) {
	if (Type(sym) !== 'Symbol') {
		throw new $TypeError('Assertion failed: `sym` must be a Symbol');
	}
	return $SymbolToString(sym);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $TypeError = GetIntrinsic('%TypeError%');

var every = require('../helpers/every');
var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');

var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-testintegritylevel

module.exports = function TestIntegrityLevel(O, level) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (level !== 'sealed' && level !== 'frozen') {
		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
	}
	var status = IsExtensible(O);
	if (status) {
		return false;
	}
	var theKeys = OwnPropertyKeys(O);
	return theKeys.length === 0 || every(theKeys, function (k) {
		var currentDesc = $gOPD(O, k);
		if (typeof currentDesc !== 'undefined') {
			if (currentDesc.configurable) {
				return false;
			}
			if (level === 'frozen' && IsDataDescriptor(ToPropertyDescriptor(currentDesc)) && currentDesc.writable) {
				return false;
			}
		}
		return true;
	});
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Date = GetIntrinsic('%Date%');
var $Number = GetIntrinsic('%Number%');

var $isFinite = require('../helpers/isFinite');

var abs = require('./abs');
var ToNumber = require('./ToNumber');

// https://262.ecma-international.org/5.1/#sec-15.9.1.14

module.exports = function TimeClip(time) {
	if (!$isFinite(time) || abs(time) > 8.64e15) {
		return NaN;
	}
	return $Number(new $Date(ToNumber(time)));
};

'use strict';

var msPerDay = require('../helpers/timeConstants').msPerDay;

var DayFromYear = require('./DayFromYear');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function TimeFromYear(y) {
	return msPerDay * DayFromYear(y);
};
'use strict';

var modulo = require('./modulo');

var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.2

module.exports = function TimeWithinDay(t) {
	return modulo(t, msPerDay);
};

'use strict';

// http://262.ecma-international.org/5.1/#sec-9.2

module.exports = function ToBoolean(value) { return !!value; };
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $Date = GetIntrinsic('%Date%');

var $isNaN = require('../helpers/isNaN');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-todatestring

module.exports = function ToDateString(tv) {
	if (Type(tv) !== 'Number') {
		throw new $TypeError('Assertion failed: `tv` must be a Number');
	}
	if ($isNaN(tv)) {
		return 'Invalid Date';
	}
	return $Date(tv);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $RangeError = GetIntrinsic('%RangeError%');

var ToInteger = require('./ToInteger');
var ToLength = require('./ToLength');
var SameValueZero = require('./SameValueZero');

// https://262.ecma-international.org/8.0/#sec-toindex

module.exports = function ToIndex(value) {
	if (typeof value === 'undefined') {
		return 0;
	}
	var integerIndex = ToInteger(value);
	if (integerIndex < 0) {
		throw new $RangeError('index must be >= 0');
	}
	var index = ToLength(integerIndex);
	if (!SameValueZero(integerIndex, index)) {
		throw new $RangeError('index must be >= 0 and < 2 ** 53 - 1');
	}
	return index;
};
'use strict';

var ToUint16 = require('./ToUint16');

// https://ecma-international.org/ecma-262/6.0/#sec-toint16

module.exports = function ToInt16(argument) {
	var int16bit = ToUint16(argument);
	return int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;
};
'use strict';

var ToNumber = require('./ToNumber');

// http://262.ecma-international.org/5.1/#sec-9.5

module.exports = function ToInt32(x) {
	return ToNumber(x) >> 0;
};
'use strict';

var ToUint8 = require('./ToUint8');

// https://ecma-international.org/ecma-262/6.0/#sec-toint8

module.exports = function ToInt8(argument) {
	var int8bit = ToUint8(argument);
	return int8bit >= 0x80 ? int8bit - 0x100 : int8bit;
};
'use strict';

var ES5ToInteger = require('../5/ToInteger');

var ToNumber = require('./ToNumber');

// https://ecma-international.org/ecma-262/6.0/#sec-tointeger

module.exports = function ToInteger(value) {
	var number = ToNumber(value);
	return ES5ToInteger(number);
};
'use strict';

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');

var ToInteger = require('./ToInteger');

module.exports = function ToLength(argument) {
	var len = ToInteger(argument);
	if (len <= 0) { return 0; } // includes converting -0 to +0
	if (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }
	return len;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $Number = GetIntrinsic('%Number%');
var $RegExp = GetIntrinsic('%RegExp%');
var $parseInteger = GetIntrinsic('%parseInt%');

var callBound = require('call-bind/callBound');
var regexTester = require('../helpers/regexTester');
var isPrimitive = require('../helpers/isPrimitive');

var $strSlice = callBound('String.prototype.slice');
var isBinary = regexTester(/^0b[01]+$/i);
var isOctal = regexTester(/^0o[0-7]+$/i);
var isInvalidHexLiteral = regexTester(/^[-+]0x[0-9a-f]+$/i);
var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
var hasNonWS = regexTester(nonWSregex);

// whitespace from: https://es5.github.io/#x15.5.4.20
// implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
var ws = [
	'\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
	'\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
	'\u2029\uFEFF'
].join('');
var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
var $replace = callBound('String.prototype.replace');
var $trim = function (value) {
	return $replace(value, trimRegex, '');
};

var ToPrimitive = require('./ToPrimitive');

// https://ecma-international.org/ecma-262/6.0/#sec-tonumber

module.exports = function ToNumber(argument) {
	var value = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number);
	if (typeof value === 'symbol') {
		throw new $TypeError('Cannot convert a Symbol value to a number');
	}
	if (typeof value === 'string') {
		if (isBinary(value)) {
			return ToNumber($parseInteger($strSlice(value, 2), 2));
		} else if (isOctal(value)) {
			return ToNumber($parseInteger($strSlice(value, 2), 8));
		} else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
			return NaN;
		}
		var trimmed = $trim(value);
		if (trimmed !== value) {
			return ToNumber(trimmed);
		}

	}
	return $Number(value);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Object = GetIntrinsic('%Object%');

var RequireObjectCoercible = require('./RequireObjectCoercible');

// https://ecma-international.org/ecma-262/6.0/#sec-toobject

module.exports = function ToObject(value) {
	RequireObjectCoercible(value);
	return $Object(value);
};
'use strict';

var toPrimitive = require('es-to-primitive/es2015');

// https://ecma-international.org/ecma-262/6.0/#sec-toprimitive

module.exports = function ToPrimitive(input) {
	if (arguments.length > 1) {
		return toPrimitive(input, arguments[1]);
	}
	return toPrimitive(input);
};
'use strict';

var has = require('has');

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');
var ToBoolean = require('./ToBoolean');
var IsCallable = require('./IsCallable');

// https://262.ecma-international.org/5.1/#sec-8.10.5

module.exports = function ToPropertyDescriptor(Obj) {
	if (Type(Obj) !== 'Object') {
		throw new $TypeError('ToPropertyDescriptor requires an object');
	}

	var desc = {};
	if (has(Obj, 'enumerable')) {
		desc['[[Enumerable]]'] = ToBoolean(Obj.enumerable);
	}
	if (has(Obj, 'configurable')) {
		desc['[[Configurable]]'] = ToBoolean(Obj.configurable);
	}
	if (has(Obj, 'value')) {
		desc['[[Value]]'] = Obj.value;
	}
	if (has(Obj, 'writable')) {
		desc['[[Writable]]'] = ToBoolean(Obj.writable);
	}
	if (has(Obj, 'get')) {
		var getter = Obj.get;
		if (typeof getter !== 'undefined' && !IsCallable(getter)) {
			throw new $TypeError('getter must be a function');
		}
		desc['[[Get]]'] = getter;
	}
	if (has(Obj, 'set')) {
		var setter = Obj.set;
		if (typeof setter !== 'undefined' && !IsCallable(setter)) {
			throw new $TypeError('setter must be a function');
		}
		desc['[[Set]]'] = setter;
	}

	if ((has(desc, '[[Get]]') || has(desc, '[[Set]]')) && (has(desc, '[[Value]]') || has(desc, '[[Writable]]'))) {
		throw new $TypeError('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
	}
	return desc;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $String = GetIntrinsic('%String%');

var ToPrimitive = require('./ToPrimitive');
var ToString = require('./ToString');

// https://ecma-international.org/ecma-262/6.0/#sec-topropertykey

module.exports = function ToPropertyKey(argument) {
	var key = ToPrimitive(argument, $String);
	return typeof key === 'symbol' ? key : ToString(key);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $String = GetIntrinsic('%String%');
var $TypeError = GetIntrinsic('%TypeError%');

// https://ecma-international.org/ecma-262/6.0/#sec-tostring

module.exports = function ToString(argument) {
	if (typeof argument === 'symbol') {
		throw new $TypeError('Cannot convert a Symbol value to a string');
	}
	return $String(argument);
};
'use strict';

var abs = require('./abs');
var floor = require('./floor');
var modulo = require('./modulo');
var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');

// http://262.ecma-international.org/5.1/#sec-9.7

module.exports = function ToUint16(value) {
	var number = ToNumber(value);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * floor(abs(number));
	return modulo(posInt, 0x10000);
};
'use strict';

var ToNumber = require('./ToNumber');

// http://262.ecma-international.org/5.1/#sec-9.6

module.exports = function ToUint32(x) {
	return ToNumber(x) >>> 0;
};
'use strict';

var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');

var abs = require('./abs');
var floor = require('./floor');
var modulo = require('./modulo');

// https://ecma-international.org/ecma-262/6.0/#sec-touint8

module.exports = function ToUint8(argument) {
	var number = ToNumber(argument);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * floor(abs(number));
	return modulo(posInt, 0x100);
};
'use strict';

var ToNumber = require('./ToNumber');
var floor = require('./floor');

var $isNaN = require('../helpers/isNaN');

// https://ecma-international.org/ecma-262/6.0/#sec-touint8clamp

module.exports = function ToUint8Clamp(argument) {
	var number = ToNumber(argument);
	if ($isNaN(number) || number <= 0) { return 0; }
	if (number >= 0xFF) { return 0xFF; }
	var f = floor(argument);
	if (f + 0.5 < number) { return f + 1; }
	if (number < f + 0.5) { return f; }
	if (f % 2 !== 0) { return f + 1; }
	return f;
};
'use strict';

var ES5Type = require('../5/Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ecmascript-data-types-and-values

module.exports = function Type(x) {
	if (typeof x === 'symbol') {
		return 'Symbol';
	}
	return ES5Type(x);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $fromCharCode = GetIntrinsic('%String.fromCharCode%');

// https://262.ecma-international.org/7.0/#sec-utf16decode

var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');

// https://262.ecma-international.org/11.0/#sec-utf16decodesurrogatepair

module.exports = function UTF16Decode(lead, trail) {
	if (!isLeadingSurrogate(lead) || !isTrailingSurrogate(trail)) {
		throw new $TypeError('Assertion failed: `lead` must be a leading surrogate char code, and `trail` must be a trailing surrogate char code');
	}
	// var cp = (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000;
	return $fromCharCode(lead) + $fromCharCode(trail);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $fromCharCode = GetIntrinsic('%String.fromCharCode%');

var floor = require('./floor');
var modulo = require('./modulo');

var isCodePoint = require('../helpers/isCodePoint');

// https://262.ecma-international.org/7.0/#sec-utf16encoding

module.exports = function UTF16Encoding(cp) {
	if (!isCodePoint(cp)) {
		throw new $TypeError('Assertion failed: `cp` must be >= 0 and <= 0x10FFFF');
	}
	if (cp <= 65535) {
		return $fromCharCode(cp);
	}
	var cu1 = floor((cp - 65536) / 1024) + 0xD800;
	var cu2 = modulo(cp - 65536, 1024) + 0xDC00;
	return $fromCharCode(cu1) + $fromCharCode(cu2);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');
var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
var isSamePropertyDescriptor = require('../helpers/isSamePropertyDescriptor');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsGenericDescriptor = require('./IsGenericDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-validateandapplypropertydescriptor
// https://ecma-international.org/ecma-262/8.0/#sec-validateandapplypropertydescriptor

// eslint-disable-next-line max-lines-per-function, max-statements, max-params
module.exports = function ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current) {
	// this uses the ES2017+ logic, since it fixes a number of bugs in the ES2015 logic.
	var oType = Type(O);
	if (oType !== 'Undefined' && oType !== 'Object') {
		throw new $TypeError('Assertion failed: O must be undefined or an Object');
	}
	if (Type(extensible) !== 'Boolean') {
		throw new $TypeError('Assertion failed: extensible must be a Boolean');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (Type(current) !== 'Undefined' && !isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, current)) {
		throw new $TypeError('Assertion failed: current must be a Property Descriptor, or undefined');
	}
	if (oType !== 'Undefined' && !IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: if O is not undefined, P must be a Property Key');
	}
	if (Type(current) === 'Undefined') {
		if (!extensible) {
			return false;
		}
		if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
			if (oType !== 'Undefined') {
				DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					{
						'[[Configurable]]': Desc['[[Configurable]]'],
						'[[Enumerable]]': Desc['[[Enumerable]]'],
						'[[Value]]': Desc['[[Value]]'],
						'[[Writable]]': Desc['[[Writable]]']
					}
				);
			}
		} else {
			if (!IsAccessorDescriptor(Desc)) {
				throw new $TypeError('Assertion failed: Desc is not an accessor descriptor');
			}
			if (oType !== 'Undefined') {
				return DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					Desc
				);
			}
		}
		return true;
	}
	if (IsGenericDescriptor(Desc) && !('[[Configurable]]' in Desc) && !('[[Enumerable]]' in Desc)) {
		return true;
	}
	if (isSamePropertyDescriptor({ SameValue: SameValue }, Desc, current)) {
		return true; // removed by ES2017, but should still be correct
	}
	// "if every field in Desc is absent, return true" can't really match the assertion that it's a Property Descriptor
	if (!current['[[Configurable]]']) {
		if (Desc['[[Configurable]]']) {
			return false;
		}
		if ('[[Enumerable]]' in Desc && !Desc['[[Enumerable]]'] === !!current['[[Enumerable]]']) {
			return false;
		}
	}
	if (IsGenericDescriptor(Desc)) {
		// no further validation is required.
	} else if (IsDataDescriptor(current) !== IsDataDescriptor(Desc)) {
		if (!current['[[Configurable]]']) {
			return false;
		}
		if (IsDataDescriptor(current)) {
			if (oType !== 'Undefined') {
				DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					{
						'[[Configurable]]': current['[[Configurable]]'],
						'[[Enumerable]]': current['[[Enumerable]]'],
						'[[Get]]': undefined
					}
				);
			}
		} else if (oType !== 'Undefined') {
			DefineOwnProperty(
				IsDataDescriptor,
				SameValue,
				FromPropertyDescriptor,
				O,
				P,
				{
					'[[Configurable]]': current['[[Configurable]]'],
					'[[Enumerable]]': current['[[Enumerable]]'],
					'[[Value]]': undefined
				}
			);
		}
	} else if (IsDataDescriptor(current) && IsDataDescriptor(Desc)) {
		if (!current['[[Configurable]]'] && !current['[[Writable]]']) {
			if ('[[Writable]]' in Desc && Desc['[[Writable]]']) {
				return false;
			}
			if ('[[Value]]' in Desc && !SameValue(Desc['[[Value]]'], current['[[Value]]'])) {
				return false;
			}
			return true;
		}
	} else if (IsAccessorDescriptor(current) && IsAccessorDescriptor(Desc)) {
		if (!current['[[Configurable]]']) {
			if ('[[Set]]' in Desc && !SameValue(Desc['[[Set]]'], current['[[Set]]'])) {
				return false;
			}
			if ('[[Get]]' in Desc && !SameValue(Desc['[[Get]]'], current['[[Get]]'])) {
				return false;
			}
			return true;
		}
	} else {
		throw new $TypeError('Assertion failed: current and Desc are not both data, both accessors, or one accessor and one data.');
	}
	if (oType !== 'Undefined') {
		return DefineOwnProperty(
			IsDataDescriptor,
			SameValue,
			FromPropertyDescriptor,
			O,
			P,
			Desc
		);
	}
	return true;
};
'use strict';

var Day = require('./Day');
var modulo = require('./modulo');

// https://262.ecma-international.org/5.1/#sec-15.9.1.6

module.exports = function WeekDay(t) {
	return modulo(Day(t) + 4, 7);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Date = GetIntrinsic('%Date%');

var callBound = require('call-bind/callBound');

var $getUTCFullYear = callBound('Date.prototype.getUTCFullYear');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function YearFromTime(t) {
	// largest y such that this.TimeFromYear(y) <= t
	return $getUTCFullYear(new $Date(t));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $abs = GetIntrinsic('%Math.abs%');

// http://262.ecma-international.org/5.1/#sec-5.2

module.exports = function abs(x) {
	return $abs(x);
};
'use strict';

// var modulo = require('./modulo');
var $floor = Math.floor;

// http://262.ecma-international.org/5.1/#sec-5.2

module.exports = function floor(x) {
	// return x - modulo(x, 1);
	return $floor(x);
};
'use strict';

var mod = require('../helpers/mod');

// https://262.ecma-international.org/5.1/#sec-5.2

module.exports = function modulo(x, y) {
	return mod(x, y);
};
'use strict';

var modulo = require('./modulo');

var msPerSecond = require('../helpers/timeConstants').msPerSecond;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function msFromTime(t) {
	return modulo(t, msPerSecond);
};
'use strict';

var $BooleanValueOf = require('call-bind/callBound')('Boolean.prototype.valueOf');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-boolean-prototype-object

module.exports = function thisBooleanValue(value) {
	if (Type(value) === 'Boolean') {
		return value;
	}

	return $BooleanValueOf(value);
};
'use strict';

var callBound = require('call-bind/callBound');

var Type = require('./Type');

var $NumberValueOf = callBound('Number.prototype.valueOf');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-number-prototype-object

module.exports = function thisNumberValue(value) {
	if (Type(value) === 'Number') {
		return value;
	}

	return $NumberValueOf(value);
};

'use strict';

var $StringValueOf = require('call-bind/callBound')('String.prototype.valueOf');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object

module.exports = function thisStringValue(value) {
	if (Type(value) === 'String') {
		return value;
	}

	return $StringValueOf(value);
};
'use strict';

var $DateGetTime = require('call-bind/callBound')('Date.prototype.getTime');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-date-prototype-object

module.exports = function thisTimeValue(value) {
	return $DateGetTime(value);
};
'use strict';

var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-abstract-equality-comparison

module.exports = function AbstractEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType === yType) {
		return x === y; // ES6+ specified this shortcut anyways.
	}
	if (x == null && y == null) {
		return true;
	}
	if (xType === 'Number' && yType === 'String') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if (xType === 'String' && yType === 'Number') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (xType === 'Boolean') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (yType === 'Boolean') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if ((xType === 'String' || xType === 'Number' || xType === 'Symbol') && yType === 'Object') {
		return AbstractEqualityComparison(x, ToPrimitive(y));
	}
	if (xType === 'Object' && (yType === 'String' || yType === 'Number' || yType === 'Symbol')) {
		return AbstractEqualityComparison(ToPrimitive(x), y);
	}
	return false;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Number = GetIntrinsic('%Number%');
var $TypeError = GetIntrinsic('%TypeError%');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var isPrefixOf = require('../helpers/isPrefixOf');

var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

// https://262.ecma-international.org/5.1/#sec-11.8.5

// eslint-disable-next-line max-statements
module.exports = function AbstractRelationalComparison(x, y, LeftFirst) {
	if (Type(LeftFirst) !== 'Boolean') {
		throw new $TypeError('Assertion failed: LeftFirst argument must be a Boolean');
	}
	var px;
	var py;
	if (LeftFirst) {
		px = ToPrimitive(x, $Number);
		py = ToPrimitive(y, $Number);
	} else {
		py = ToPrimitive(y, $Number);
		px = ToPrimitive(x, $Number);
	}
	var bothStrings = Type(px) === 'String' && Type(py) === 'String';
	if (!bothStrings) {
		var nx = ToNumber(px);
		var ny = ToNumber(py);
		if ($isNaN(nx) || $isNaN(ny)) {
			return undefined;
		}
		if ($isFinite(nx) && $isFinite(ny) && nx === ny) {
			return false;
		}
		if (nx === Infinity) {
			return false;
		}
		if (ny === Infinity) {
			return true;
		}
		if (ny === -Infinity) {
			return false;
		}
		if (nx === -Infinity) {
			return true;
		}
		return nx < ny; // by now, these are both nonzero, finite, and not equal
	}
	if (isPrefixOf(py, px)) {
		return false;
	}
	if (isPrefixOf(px, py)) {
		return true;
	}
	return px < py; // both strings, neither a prefix of the other. shortcut for steps c-f
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var IsInteger = require('./IsInteger');
var Type = require('./Type');

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');
var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');

var $TypeError = GetIntrinsic('%TypeError%');

var $charCodeAt = require('call-bind/callBound')('String.prototype.charCodeAt');

// https://ecma-international.org/ecma-262/6.0/#sec-advancestringindex

module.exports = function AdvanceStringIndex(S, index, unicode) {
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	if (!IsInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) {
		throw new $TypeError('Assertion failed: `length` must be an integer >= 0 and <= 2**53');
	}
	if (Type(unicode) !== 'Boolean') {
		throw new $TypeError('Assertion failed: `unicode` must be a Boolean');
	}
	if (!unicode) {
		return index + 1;
	}
	var length = S.length;
	if ((index + 1) >= length) {
		return index + 1;
	}

	var first = $charCodeAt(S, index);
	if (!isLeadingSurrogate(first)) {
		return index + 1;
	}

	var second = $charCodeAt(S, index + 1);
	if (!isTrailingSurrogate(second)) {
		return index + 1;
	}

	return index + 2;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $ArrayPrototype = GetIntrinsic('%Array.prototype%');
var $RangeError = GetIntrinsic('%RangeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var IsInteger = require('./IsInteger');

var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1;

var $setProto = GetIntrinsic('%Object.setPrototypeOf%', true) || (
	// eslint-disable-next-line no-proto, no-negated-condition
	[].__proto__ !== $ArrayPrototype
		? null
		: function (O, proto) {
			O.__proto__ = proto; // eslint-disable-line no-proto, no-param-reassign
			return O;
		}
);

// https://ecma-international.org/ecma-262/6.0/#sec-arraycreate

module.exports = function ArrayCreate(length) {
	if (!IsInteger(length) || length < 0) {
		throw new $TypeError('Assertion failed: `length` must be an integer Number >= 0');
	}
	if (length > MAX_ARRAY_LENGTH) {
		throw new $RangeError('length is greater than (2**32 - 1)');
	}
	var proto = arguments.length > 1 ? arguments[1] : $ArrayPrototype;
	var A = []; // steps 5 - 7, and 9
	if (proto !== $ArrayPrototype) { // step 8
		if (!$setProto) {
			throw new $SyntaxError('ArrayCreate: a `proto` argument that is not `Array.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
		}
		$setProto(A, proto);
	}
	if (length !== 0) { // bypasses the need for step 2
		A.length = length;
	}
	/* step 10, the above as a shortcut for the below
	OrdinaryDefineOwnProperty(A, 'length', {
		'[[Configurable]]': false,
		'[[Enumerable]]': false,
		'[[Value]]': length,
		'[[Writable]]': true
	});
	*/
	return A;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $RangeError = GetIntrinsic('%RangeError%');
var $TypeError = GetIntrinsic('%TypeError%');

var assign = require('object.assign');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var IsArray = require('./IsArray');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var OrdinaryDefineOwnProperty = require('./OrdinaryDefineOwnProperty');
var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
var ToNumber = require('./ToNumber');
var ToString = require('./ToString');
var ToUint32 = require('./ToUint32');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-arraysetlength

// eslint-disable-next-line max-statements, max-lines-per-function
module.exports = function ArraySetLength(A, Desc) {
	if (!IsArray(A)) {
		throw new $TypeError('Assertion failed: A must be an Array');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (!('[[Value]]' in Desc)) {
		return OrdinaryDefineOwnProperty(A, 'length', Desc);
	}
	var newLenDesc = assign({}, Desc);
	var newLen = ToUint32(Desc['[[Value]]']);
	var numberLen = ToNumber(Desc['[[Value]]']);
	if (newLen !== numberLen) {
		throw new $RangeError('Invalid array length');
	}
	newLenDesc['[[Value]]'] = newLen;
	var oldLenDesc = OrdinaryGetOwnProperty(A, 'length');
	if (!IsDataDescriptor(oldLenDesc)) {
		throw new $TypeError('Assertion failed: an array had a non-data descriptor on `length`');
	}
	var oldLen = oldLenDesc['[[Value]]'];
	if (newLen >= oldLen) {
		return OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
	}
	if (!oldLenDesc['[[Writable]]']) {
		return false;
	}
	var newWritable;
	if (!('[[Writable]]' in newLenDesc) || newLenDesc['[[Writable]]']) {
		newWritable = true;
	} else {
		newWritable = false;
		newLenDesc['[[Writable]]'] = true;
	}
	var succeeded = OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
	if (!succeeded) {
		return false;
	}
	while (newLen < oldLen) {
		oldLen -= 1;
		// eslint-disable-next-line no-param-reassign
		var deleteSucceeded = delete A[ToString(oldLen)];
		if (!deleteSucceeded) {
			newLenDesc['[[Value]]'] = oldLen + 1;
			if (!newWritable) {
				newLenDesc['[[Writable]]'] = false;
				OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
				return false;
			}
		}
	}
	if (!newWritable) {
		return OrdinaryDefineOwnProperty(A, 'length', { '[[Writable]]': false });
	}
	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Array = GetIntrinsic('%Array%');
var $species = GetIntrinsic('%Symbol.species%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsArray = require('./IsArray');
var IsConstructor = require('./IsConstructor');
var IsInteger = require('./IsInteger');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate

module.exports = function ArraySpeciesCreate(originalArray, length) {
	if (!IsInteger(length) || length < 0) {
		throw new $TypeError('Assertion failed: length must be an integer >= 0');
	}
	var len = length === 0 ? 0 : length;
	var C;
	var isArray = IsArray(originalArray);
	if (isArray) {
		C = Get(originalArray, 'constructor');
		// TODO: figure out how to make a cross-realm normal Array, a same-realm Array
		// if (IsConstructor(C)) {
		// 	if C is another realm's Array, C = undefined
		// 	Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?
		// }
		if ($species && Type(C) === 'Object') {
			C = Get(C, $species);
			if (C === null) {
				C = void 0;
			}
		}
	}
	if (typeof C === 'undefined') {
		return $Array(len);
	}
	if (!IsConstructor(C)) {
		throw new $TypeError('C must be a constructor');
	}
	return new C(len); // Construct(C, len);
};

'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');

var IsArray = require('./IsArray');

var $apply = GetIntrinsic('%Reflect.apply%', true) || callBound('%Function.prototype.apply%');

// https://ecma-international.org/ecma-262/6.0/#sec-call

module.exports = function Call(F, V) {
	var argumentsList = arguments.length > 2 ? arguments[2] : [];
	if (!IsArray(argumentsList)) {
		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
	}
	return $apply(F, V, argumentsList);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var SameValue = require('./SameValue');
var ToNumber = require('./ToNumber');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring

module.exports = function CanonicalNumericIndexString(argument) {
	if (Type(argument) !== 'String') {
		throw new $TypeError('Assertion failed: `argument` must be a String');
	}
	if (argument === '-0') { return -0; }
	var n = ToNumber(argument);
	if (SameValue(ToString(n), argument)) { return n; }
	return void 0;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $fromCharCode = GetIntrinsic('%String.fromCharCode%');
var $TypeError = GetIntrinsic('%TypeError%');
var $charCodeAt = callBound('%String.prototype.charCodeAt%');
var $push = callBound('%Array.prototype.push%');

module.exports = function CharacterRange(A, B) {
	if (A.length !== 1 || B.length !== 1) {
		throw new $TypeError('Assertion failed: CharSets A and B contain exactly one character');
	}

	var a = A[0];
	var b = B[0];

	var i = $charCodeAt(a, 0);
	var j = $charCodeAt(b, 0);

	if (!(i <= j)) {
		throw new $TypeError('Assertion failed: i is not <= j');
	}

	var arr = [];
	for (var k = i; k <= j; k += 1) {
		$push(arr, $fromCharCode(k));
	}
	return arr;
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var IsDataDescriptor = require('./IsDataDescriptor');
var IsGenericDescriptor = require('./IsGenericDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor

module.exports = function CompletePropertyDescriptor(Desc) {
	/* eslint no-param-reassign: 0 */
	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
		if (!has(Desc, '[[Value]]')) {
			Desc['[[Value]]'] = void 0;
		}
		if (!has(Desc, '[[Writable]]')) {
			Desc['[[Writable]]'] = false;
		}
	} else {
		if (!has(Desc, '[[Get]]')) {
			Desc['[[Get]]'] = void 0;
		}
		if (!has(Desc, '[[Set]]')) {
			Desc['[[Set]]'] = void 0;
		}
	}
	if (!has(Desc, '[[Enumerable]]')) {
		Desc['[[Enumerable]]'] = false;
	}
	if (!has(Desc, '[[Configurable]]')) {
		Desc['[[Configurable]]'] = false;
	}
	return Desc;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createdataproperty

module.exports = function CreateDataProperty(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	var oldDesc = OrdinaryGetOwnProperty(O, P);
	var extensible = !oldDesc || IsExtensible(O);
	var nonConfigurable = oldDesc && !oldDesc['[[Configurable]]'];
	if (nonConfigurable || !extensible) {
		return false;
	}
	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		{
			'[[Configurable]]': true,
			'[[Enumerable]]': true,
			'[[Value]]': V,
			'[[Writable]]': true
		}
	);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var CreateDataProperty = require('./CreateDataProperty');
var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// // https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow

module.exports = function CreateDataPropertyOrThrow(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	var success = CreateDataProperty(O, P, V);
	if (!success) {
		throw new $TypeError('unable to create data property');
	}
	return success;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $replace = callBound('String.prototype.replace');

var RequireObjectCoercible = require('./RequireObjectCoercible');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createhtml

module.exports = function CreateHTML(string, tag, attribute, value) {
	if (Type(tag) !== 'String' || Type(attribute) !== 'String') {
		throw new $TypeError('Assertion failed: `tag` and `attribute` must be strings');
	}
	var str = RequireObjectCoercible(string);
	var S = ToString(str);
	var p1 = '<' + tag;
	if (attribute !== '') {
		var V = ToString(value);
		var escapedV = $replace(V, /\x22/g, '&quot;');
		p1 += '\x20' + attribute + '\x3D\x22' + escapedV + '\x22';
	}
	return p1 + '>' + S + '</' + tag + '>';
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject

module.exports = function CreateIterResultObject(value, done) {
	if (Type(done) !== 'Boolean') {
		throw new $TypeError('Assertion failed: Type(done) is not Boolean');
	}
	return {
		value: value,
		done: done
	};
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');
var $indexOf = callBound('Array.prototype.indexOf', true) || callBound('String.prototype.indexOf');
var $push = callBound('Array.prototype.push');

var Get = require('./Get');
var IsArray = require('./IsArray');
var ToLength = require('./ToLength');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createlistfromarraylike
module.exports = function CreateListFromArrayLike(obj) {
	var elementTypes = arguments.length > 1
		? arguments[1]
		: ['Undefined', 'Null', 'Boolean', 'String', 'Symbol', 'Number', 'Object'];

	if (Type(obj) !== 'Object') {
		throw new $TypeError('Assertion failed: `obj` must be an Object');
	}
	if (!IsArray(elementTypes)) {
		throw new $TypeError('Assertion failed: `elementTypes`, if provided, must be an array');
	}
	var len = ToLength(Get(obj, 'length'));
	var list = [];
	var index = 0;
	while (index < len) {
		var indexName = ToString(index);
		var next = Get(obj, indexName);
		var nextType = Type(next);
		if ($indexOf(elementTypes, nextType) < 0) {
			throw new $TypeError('item type ' + nextType + ' is not a valid elementType');
		}
		$push(list, next);
		index += 1;
	}
	return list;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createmethodproperty

module.exports = function CreateMethodProperty(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	var newDesc = {
		'[[Configurable]]': true,
		'[[Enumerable]]': false,
		'[[Value]]': V,
		'[[Writable]]': true
	};
	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		newDesc
	);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');
var MonthFromTime = require('./MonthFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.5

module.exports = function DateFromTime(t) {
	var m = MonthFromTime(t);
	var d = DayWithinYear(t);
	if (m === 0) {
		return d + 1;
	}
	if (m === 1) {
		return d - 30;
	}
	var leap = InLeapYear(t);
	if (m === 2) {
		return d - 58 - leap;
	}
	if (m === 3) {
		return d - 89 - leap;
	}
	if (m === 4) {
		return d - 119 - leap;
	}
	if (m === 5) {
		return d - 150 - leap;
	}
	if (m === 6) {
		return d - 180 - leap;
	}
	if (m === 7) {
		return d - 211 - leap;
	}
	if (m === 8) {
		return d - 242 - leap;
	}
	if (m === 9) {
		return d - 272 - leap;
	}
	if (m === 10) {
		return d - 303 - leap;
	}
	if (m === 11) {
		return d - 333 - leap;
	}
	throw new $EvalError('Assertion failed: MonthFromTime returned an impossible value: ' + m);
};
'use strict';

var floor = require('./floor');

var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.2

module.exports = function Day(t) {
	return floor(t / msPerDay);
};
'use strict';

var floor = require('./floor');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function DayFromYear(y) {
	return (365 * (y - 1970)) + floor((y - 1969) / 4) - floor((y - 1901) / 100) + floor((y - 1601) / 400);
};

'use strict';

var Day = require('./Day');
var DayFromYear = require('./DayFromYear');
var YearFromTime = require('./YearFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.4

module.exports = function DayWithinYear(t) {
	return Day(t) - DayFromYear(YearFromTime(t));
};
'use strict';

var modulo = require('./modulo');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function DaysInYear(y) {
	if (modulo(y, 4) !== 0) {
		return 365;
	}
	if (modulo(y, 100) !== 0) {
		return 366;
	}
	if (modulo(y, 400) !== 0) {
		return 365;
	}
	return 366;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow

module.exports = function DefinePropertyOrThrow(O, P, desc) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	var Desc = isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, desc) ? desc : ToPropertyDescriptor(desc);
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc is not a valid Property Descriptor');
	}

	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		Desc
	);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-deletepropertyorthrow

module.exports = function DeletePropertyOrThrow(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// eslint-disable-next-line no-param-reassign
	var success = delete O[P];
	if (!success) {
		throw new $TypeError('Attempt to delete property failed.');
	}
	return success;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var keys = require('object-keys');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-enumerableownnames

module.exports = function EnumerableOwnNames(O) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	return keys(O);
};
'use strict';

var assertRecord = require('../helpers/assertRecord');
var fromPropertyDescriptor = require('../helpers/fromPropertyDescriptor');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-frompropertydescriptor

module.exports = function FromPropertyDescriptor(Desc) {
	if (typeof Desc !== 'undefined') {
		assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
	}

	return fromPropertyDescriptor(Desc);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var inspect = require('object-inspect');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-get-o-p

module.exports = function Get(O, P) {
	// 7.3.1.1
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	// 7.3.1.2
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true, got ' + inspect(P));
	}
	// 7.3.1.3
	return O[P];
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var getIteratorMethod = require('../helpers/getIteratorMethod');
var AdvanceStringIndex = require('./AdvanceStringIndex');
var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsArray = require('./IsArray');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getiterator

module.exports = function GetIterator(obj, method) {
	var actualMethod = method;
	if (arguments.length < 2) {
		actualMethod = getIteratorMethod(
			{
				AdvanceStringIndex: AdvanceStringIndex,
				GetMethod: GetMethod,
				IsArray: IsArray
			},
			obj
		);
	}
	var iterator = Call(actualMethod, obj);
	if (Type(iterator) !== 'Object') {
		throw new $TypeError('iterator must return an object');
	}

	return iterator;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var GetV = require('./GetV');
var IsCallable = require('./IsCallable');
var IsPropertyKey = require('./IsPropertyKey');

// https://ecma-international.org/ecma-262/6.0/#sec-getmethod

module.exports = function GetMethod(O, P) {
	// 7.3.9.1
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// 7.3.9.2
	var func = GetV(O, P);

	// 7.3.9.4
	if (func == null) {
		return void 0;
	}

	// 7.3.9.5
	if (!IsCallable(func)) {
		throw new $TypeError(P + 'is not a function');
	}

	// 7.3.9.6
	return func;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var hasSymbols = require('has-symbols')();

var $TypeError = GetIntrinsic('%TypeError%');

var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%', true);
var $gOPS = hasSymbols && GetIntrinsic('%Object.getOwnPropertySymbols%', true);
var keys = require('object-keys');

var esType = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getownpropertykeys

module.exports = function GetOwnPropertyKeys(O, Type) {
	if (esType(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (Type === 'Symbol') {
		return $gOPS ? $gOPS(O) : [];
	}
	if (Type === 'String') {
		if (!$gOPN) {
			return keys(O);
		}
		return $gOPN(O);
	}
	throw new $TypeError('Assertion failed: `Type` must be `"String"` or `"Symbol"`');
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Function = GetIntrinsic('%Function%');
var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsConstructor = require('./IsConstructor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getprototypefromconstructor

module.exports = function GetPrototypeFromConstructor(constructor, intrinsicDefaultProto) {
	var intrinsic = GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
	if (!IsConstructor(constructor)) {
		throw new $TypeError('Assertion failed: `constructor` must be a constructor');
	}
	var proto = Get(constructor, 'prototype');
	if (Type(proto) !== 'Object') {
		if (!(constructor instanceof $Function)) {
			// ignore other realms, for now
			throw new $TypeError('cross-realm constructors not currently supported');
		}
		proto = intrinsic;
	}
	return proto;
};

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $parseInt = GetIntrinsic('%parseInt%');

var inspect = require('object-inspect');

var regexTester = require('../helpers/regexTester');
var callBound = require('call-bind/callBound');
var every = require('../helpers/every');

var isDigit = regexTester(/^[0-9]$/);

var $charAt = callBound('String.prototype.charAt');
var $strSlice = callBound('String.prototype.slice');

var IsArray = require('./IsArray');
var IsInteger = require('./IsInteger');
var Type = require('./Type');

var canDistinguishSparseFromUndefined = 0 in [undefined]; // IE 6 - 8 have a bug where this returns false

var isStringOrHole = function (capture, index, arr) {
	return Type(capture) === 'String' || (canDistinguishSparseFromUndefined ? !(index in arr) : Type(capture) === 'Undefined');
};

// https://ecma-international.org/ecma-262/6.0/#sec-getsubstitution

// eslint-disable-next-line max-statements, max-params, max-lines-per-function
module.exports = function GetSubstitution(matched, str, position, captures, replacement) {
	if (Type(matched) !== 'String') {
		throw new $TypeError('Assertion failed: `matched` must be a String');
	}
	var matchLength = matched.length;

	if (Type(str) !== 'String') {
		throw new $TypeError('Assertion failed: `str` must be a String');
	}
	var stringLength = str.length;

	if (!IsInteger(position) || position < 0 || position > stringLength) {
		throw new $TypeError('Assertion failed: `position` must be a nonnegative integer, and less than or equal to the length of `string`, got ' + inspect(position));
	}

	if (!IsArray(captures) || !every(captures, isStringOrHole)) {
		throw new $TypeError('Assertion failed: `captures` must be a List of Strings, got ' + inspect(captures));
	}

	if (Type(replacement) !== 'String') {
		throw new $TypeError('Assertion failed: `replacement` must be a String');
	}

	var tailPos = position + matchLength;
	var m = captures.length;

	var result = '';
	for (var i = 0; i < replacement.length; i += 1) {
		// if this is a $, and it's not the end of the replacement
		var current = $charAt(replacement, i);
		var isLast = (i + 1) >= replacement.length;
		var nextIsLast = (i + 2) >= replacement.length;
		if (current === '$' && !isLast) {
			var next = $charAt(replacement, i + 1);
			if (next === '$') {
				result += '$';
				i += 1;
			} else if (next === '&') {
				result += matched;
				i += 1;
			} else if (next === '`') {
				result += position === 0 ? '' : $strSlice(str, 0, position - 1);
				i += 1;
			} else if (next === "'") {
				result += tailPos >= stringLength ? '' : $strSlice(str, tailPos);
				i += 1;
			} else {
				var nextNext = nextIsLast ? null : $charAt(replacement, i + 2);
				if (isDigit(next) && next !== '0' && (nextIsLast || !isDigit(nextNext))) {
					// $1 through $9, and not followed by a digit
					var n = $parseInt(next, 10);
					// if (n > m, impl-defined)
					result += n <= m && Type(captures[n - 1]) === 'Undefined' ? '' : captures[n - 1];
					i += 1;
				} else if (isDigit(next) && (nextIsLast || isDigit(nextNext))) {
					// $00 through $99
					var nn = next + nextNext;
					var nnI = $parseInt(nn, 10) - 1;
					// if nn === '00' or nn > m, impl-defined
					result += nn <= m && Type(captures[nnI]) === 'Undefined' ? '' : captures[nnI];
					i += 2;
				} else {
					result += '$';
				}
			}
		} else {
			// the final $, or else not a $
			result += $charAt(replacement, i);
		}
	}
	return result;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var ToObject = require('./ToObject');

// https://ecma-international.org/ecma-262/6.0/#sec-getv

module.exports = function GetV(V, P) {
	// 7.3.2.1
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// 7.3.2.2-3
	var O = ToObject(V);

	// 7.3.2.4
	return O[P];
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var has = require('has');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty

module.exports = function HasOwnProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	return has(O, P);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-hasproperty

module.exports = function HasProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	return P in O;
};
'use strict';

var floor = require('./floor');
var modulo = require('./modulo');

var timeConstants = require('../helpers/timeConstants');
var msPerHour = timeConstants.msPerHour;
var HoursPerDay = timeConstants.HoursPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function HourFromTime(t) {
	return modulo(floor(t / msPerHour), HoursPerDay);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DaysInYear = require('./DaysInYear');
var YearFromTime = require('./YearFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function InLeapYear(t) {
	var days = DaysInYear(YearFromTime(t));
	if (days === 365) {
		return 0;
	}
	if (days === 366) {
		return 1;
	}
	throw new $EvalError('Assertion failed: there are not 365 or 366 days in a year, got: ' + days);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $hasInstance = GetIntrinsic('Symbol.hasInstance', true);

var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsCallable = require('./IsCallable');
var OrdinaryHasInstance = require('./OrdinaryHasInstance');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-instanceofoperator

module.exports = function InstanceofOperator(O, C) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	var instOfHandler = $hasInstance ? GetMethod(C, $hasInstance) : void 0;
	if (typeof instOfHandler !== 'undefined') {
		return ToBoolean(Call(instOfHandler, C, [O]));
	}
	if (!IsCallable(C)) {
		throw new $TypeError('`C` is not Callable');
	}
	return OrdinaryHasInstance(C, O);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var IsArray = require('./IsArray');
var GetV = require('./GetV');
var IsPropertyKey = require('./IsPropertyKey');

// https://ecma-international.org/ecma-262/6.0/#sec-invoke

module.exports = function Invoke(O, P) {
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	var argumentsList = arguments.length > 2 ? arguments[2] : [];
	if (!IsArray(argumentsList)) {
		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
	}
	var func = GetV(O, P);
	return Call(func, O, argumentsList);
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isaccessordescriptor

module.exports = function IsAccessorDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Get]]') && !has(Desc, '[[Set]]')) {
		return false;
	}

	return true;
};
'use strict';

// https://ecma-international.org/ecma-262/6.0/#sec-isarray
module.exports = require('../helpers/IsArray');
'use strict';

// http://262.ecma-international.org/5.1/#sec-9.11

module.exports = require('is-callable');
'use strict';

var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');

// https://262.ecma-international.org/6.0/#sec-iscompatiblepropertydescriptor

module.exports = function IsCompatiblePropertyDescriptor(Extensible, Desc, Current) {
	return ValidateAndApplyPropertyDescriptor(undefined, undefined, Extensible, Desc, Current);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $isConcatSpreadable = GetIntrinsic('%Symbol.isConcatSpreadable%', true);

var Get = require('./Get');
var IsArray = require('./IsArray');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable

module.exports = function IsConcatSpreadable(O) {
	if (Type(O) !== 'Object') {
		return false;
	}
	if ($isConcatSpreadable) {
		var spreadable = Get(O, $isConcatSpreadable);
		if (typeof spreadable !== 'undefined') {
			return ToBoolean(spreadable);
		}
	}
	return IsArray(O);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic.js');

var $construct = GetIntrinsic('%Reflect.construct%', true);

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
try {
	DefinePropertyOrThrow({}, '', { '[[Get]]': function () {} });
} catch (e) {
	// Accessor properties aren't supported
	DefinePropertyOrThrow = null;
}

// https://ecma-international.org/ecma-262/6.0/#sec-isconstructor

if (DefinePropertyOrThrow && $construct) {
	var isConstructorMarker = {};
	var badArrayLike = {};
	DefinePropertyOrThrow(badArrayLike, 'length', {
		'[[Get]]': function () {
			throw isConstructorMarker;
		},
		'[[Enumerable]]': true
	});

	module.exports = function IsConstructor(argument) {
		try {
			// `Reflect.construct` invokes `IsConstructor(target)` before `Get(args, 'length')`:
			$construct(argument, badArrayLike);
		} catch (err) {
			return err === isConstructorMarker;
		}
	};
} else {
	module.exports = function IsConstructor(argument) {
		// unfortunately there's no way to truly check this without try/catch `new argument` in old environments
		return typeof argument === 'function' && !!argument.prototype;
	};
}
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isdatadescriptor

module.exports = function IsDataDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Value]]') && !has(Desc, '[[Writable]]')) {
		return false;
	}

	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $preventExtensions = GetIntrinsic('%Object.preventExtensions%', true);
var $isExtensible = GetIntrinsic('%Object.isExtensible%', true);

var isPrimitive = require('../helpers/isPrimitive');

// https://ecma-international.org/ecma-262/6.0/#sec-isextensible-o

module.exports = $preventExtensions
	? function IsExtensible(obj) {
		return !isPrimitive(obj) && $isExtensible(obj);
	}
	: function IsExtensible(obj) {
		return !isPrimitive(obj);
	};
'use strict';

var assertRecord = require('../helpers/assertRecord');

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isgenericdescriptor

module.exports = function IsGenericDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!IsAccessorDescriptor(Desc) && !IsDataDescriptor(Desc)) {
		return true;
	}

	return false;
};
'use strict';

var abs = require('./abs');
var floor = require('./floor');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');

// https://ecma-international.org/ecma-262/6.0/#sec-isinteger

module.exports = function IsInteger(argument) {
	if (typeof argument !== 'number' || $isNaN(argument) || !$isFinite(argument)) {
		return false;
	}
	var absValue = abs(argument);
	return floor(absValue) === absValue;
};
'use strict';

var callBound = require('call-bind/callBound');

var $PromiseThen = callBound('Promise.prototype.then', true);

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ispromise

module.exports = function IsPromise(x) {
	if (Type(x) !== 'Object') {
		return false;
	}
	if (!$PromiseThen) { // Promises are not supported
		return false;
	}
	try {
		$PromiseThen(x); // throws if not a promise
	} catch (e) {
		return false;
	}
	return true;
};
'use strict';

// TODO, semver-major: delete this

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var Type = require('./Type');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');

// https://262.ecma-international.org/6.0/#sec-property-descriptor-specification-type

module.exports = function IsPropertyDescriptor(Desc) {
	return isPropertyDescriptor({
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor,
		Type: Type
	}, Desc);
};
'use strict';

// https://ecma-international.org/ecma-262/6.0/#sec-ispropertykey

module.exports = function IsPropertyKey(argument) {
	return typeof argument === 'string' || typeof argument === 'symbol';
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $match = GetIntrinsic('%Symbol.match%', true);

var hasRegExpMatcher = require('is-regex');

var ToBoolean = require('./ToBoolean');

// https://ecma-international.org/ecma-262/6.0/#sec-isregexp

module.exports = function IsRegExp(argument) {
	if (!argument || typeof argument !== 'object') {
		return false;
	}
	if ($match) {
		var isRegExp = argument[$match];
		if (typeof isRegExp !== 'undefined') {
			return ToBoolean(isRegExp);
		}
	}
	return hasRegExpMatcher(argument);
};
'use strict';

var callBound = require('call-bind/callBound');
var $arrayPush = callBound('Array.prototype.push');

var getIteratorMethod = require('../helpers/getIteratorMethod');
var AdvanceStringIndex = require('./AdvanceStringIndex');
var GetIterator = require('./GetIterator');
var GetMethod = require('./GetMethod');
var IsArray = require('./IsArray');
var IteratorStep = require('./IteratorStep');
var IteratorValue = require('./IteratorValue');
var ToObject = require('./ToObject');
var ES = {
	AdvanceStringIndex: AdvanceStringIndex,
	GetMethod: GetMethod,
	IsArray: IsArray
};

// https://262.ecma-international.org/7.0/#sec-iterabletoarraylike

module.exports = function IterableToArrayLike(items) {
	var usingIterator = getIteratorMethod(ES, items);
	if (typeof usingIterator !== 'undefined') {
		var iterator = GetIterator(items, usingIterator);
		var values = [];
		var next = true;
		while (next) {
			next = IteratorStep(iterator);
			if (next) {
				var nextValue = IteratorValue(next);
				$arrayPush(values, nextValue);
			}
		}
		return values;
	}

	return ToObject(items);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose

module.exports = function IteratorClose(iterator, completion) {
	if (Type(iterator) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterator) is not Object');
	}
	if (!IsCallable(completion)) {
		throw new $TypeError('Assertion failed: completion is not a thunk for a Completion Record');
	}
	var completionThunk = completion;

	var iteratorReturn = GetMethod(iterator, 'return');

	if (typeof iteratorReturn === 'undefined') {
		return completionThunk();
	}

	var completionRecord;
	try {
		var innerResult = Call(iteratorReturn, iterator, []);
	} catch (e) {
		// if we hit here, then "e" is the innerResult completion that needs re-throwing

		// if the completion is of type "throw", this will throw.
		completionThunk();
		completionThunk = null; // ensure it's not called twice.

		// if not, then return the innerResult completion
		throw e;
	}
	completionRecord = completionThunk(); // if innerResult worked, then throw if the completion does
	completionThunk = null; // ensure it's not called twice.

	if (Type(innerResult) !== 'Object') {
		throw new $TypeError('iterator .return must return an object');
	}

	return completionRecord;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete

module.exports = function IteratorComplete(iterResult) {
	if (Type(iterResult) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
	}
	return ToBoolean(Get(iterResult, 'done'));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Invoke = require('./Invoke');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratornext

module.exports = function IteratorNext(iterator, value) {
	var result = Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);
	if (Type(result) !== 'Object') {
		throw new $TypeError('iterator next must return an object');
	}
	return result;
};
'use strict';

var IteratorComplete = require('./IteratorComplete');
var IteratorNext = require('./IteratorNext');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep

module.exports = function IteratorStep(iterator) {
	var result = IteratorNext(iterator);
	var done = IteratorComplete(result);
	return done === true ? false : result;
};

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue

module.exports = function IteratorValue(iterResult) {
	if (Type(iterResult) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
	}
	return Get(iterResult, 'value');
};

'use strict';

var $isFinite = require('../helpers/isFinite');
var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.13

module.exports = function MakeDate(day, time) {
	if (!$isFinite(day) || !$isFinite(time)) {
		return NaN;
	}
	return (day * msPerDay) + time;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $DateUTC = GetIntrinsic('%Date.UTC%');

var $isFinite = require('../helpers/isFinite');

var DateFromTime = require('./DateFromTime');
var Day = require('./Day');
var floor = require('./floor');
var modulo = require('./modulo');
var MonthFromTime = require('./MonthFromTime');
var ToInteger = require('./ToInteger');
var YearFromTime = require('./YearFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.12

module.exports = function MakeDay(year, month, date) {
	if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) {
		return NaN;
	}
	var y = ToInteger(year);
	var m = ToInteger(month);
	var dt = ToInteger(date);
	var ym = y + floor(m / 12);
	var mn = modulo(m, 12);
	var t = $DateUTC(ym, mn, 1);
	if (YearFromTime(t) !== ym || MonthFromTime(t) !== mn || DateFromTime(t) !== 1) {
		return NaN;
	}
	return Day(t) + dt - 1;
};
'use strict';

var $isFinite = require('../helpers/isFinite');
var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var msPerMinute = timeConstants.msPerMinute;
var msPerHour = timeConstants.msPerHour;

var ToInteger = require('./ToInteger');

// https://262.ecma-international.org/5.1/#sec-15.9.1.11

module.exports = function MakeTime(hour, min, sec, ms) {
	if (!$isFinite(hour) || !$isFinite(min) || !$isFinite(sec) || !$isFinite(ms)) {
		return NaN;
	}
	var h = ToInteger(hour);
	var m = ToInteger(min);
	var s = ToInteger(sec);
	var milli = ToInteger(ms);
	var t = (h * msPerHour) + (m * msPerMinute) + (s * msPerSecond) + milli;
	return t;
};
'use strict';

var floor = require('./floor');
var modulo = require('./modulo');

var timeConstants = require('../helpers/timeConstants');
var msPerMinute = timeConstants.msPerMinute;
var MinutesPerHour = timeConstants.MinutesPerHour;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function MinFromTime(t) {
	return modulo(floor(t / msPerMinute), MinutesPerHour);
};
'use strict';

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');

// https://262.ecma-international.org/5.1/#sec-15.9.1.4

module.exports = function MonthFromTime(t) {
	var day = DayWithinYear(t);
	if (0 <= day && day < 31) {
		return 0;
	}
	var leap = InLeapYear(t);
	if (31 <= day && day < (59 + leap)) {
		return 1;
	}
	if ((59 + leap) <= day && day < (90 + leap)) {
		return 2;
	}
	if ((90 + leap) <= day && day < (120 + leap)) {
		return 3;
	}
	if ((120 + leap) <= day && day < (151 + leap)) {
		return 4;
	}
	if ((151 + leap) <= day && day < (181 + leap)) {
		return 5;
	}
	if ((181 + leap) <= day && day < (212 + leap)) {
		return 6;
	}
	if ((212 + leap) <= day && day < (243 + leap)) {
		return 7;
	}
	if ((243 + leap) <= day && day < (273 + leap)) {
		return 8;
	}
	if ((273 + leap) <= day && day < (304 + leap)) {
		return 9;
	}
	if ((304 + leap) <= day && day < (334 + leap)) {
		return 10;
	}
	if ((334 + leap) <= day && day < (365 + leap)) {
		return 11;
	}
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $ObjectCreate = GetIntrinsic('%Object.create%', true);
var $TypeError = GetIntrinsic('%TypeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');

var Type = require('./Type');

var hasProto = !({ __proto__: null } instanceof Object);

// https://ecma-international.org/ecma-262/6.0/#sec-objectcreate

module.exports = function ObjectCreate(proto, internalSlotsList) {
	if (proto !== null && Type(proto) !== 'Object') {
		throw new $TypeError('Assertion failed: `proto` must be null or an object');
	}
	var slots = arguments.length < 2 ? [] : internalSlotsList;
	if (slots.length > 0) {
		throw new $SyntaxError('es-abstract does not yet support internal slots');
	}

	if ($ObjectCreate) {
		return $ObjectCreate(proto);
	}
	if (hasProto) {
		return { __proto__: proto };
	}

	if (proto === null) {
		throw new $SyntaxError('native Object.create support is required to create null objects');
	}
	var T = function T() {};
	T.prototype = proto;
	return new T();
};
'use strict';

var callBound = require('call-bind/callBound');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var Get = require('./Get');
var ToObject = require('./ToObject');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');

var forEach = require('../helpers/forEach');
var getOwnPropertyDescriptor = require('../helpers/getOwnPropertyDescriptor');
var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');

var $push = callBound('Array.prototype.push');

// https://262.ecma-international.org/6.0/#sec-objectdefineproperties
module.exports = function ObjectDefineProperties(O, Properties) {
	var props = ToObject(Properties); // step 1
	var keys = OwnPropertyKeys(props); // step 2
	var descriptors = []; // step 3

	forEach(keys, function (nextKey) { // step 4
		var propDesc = ToPropertyDescriptor(getOwnPropertyDescriptor(props, nextKey)); // step 4.a
		if (typeof propDesc !== 'undefined' && propDesc['[[Enumerable]]']) { // step 4.b
			var descObj = Get(props, nextKey); // step 4.b.i
			var desc = ToPropertyDescriptor(descObj); // step 4.b.ii
			$push(descriptors, [nextKey, desc]); // step 4.b.iii
		}
	});

	forEach(descriptors, function (pair) { // step 5
		var P = pair[0]; // step 5.a
		var desc = pair[1]; // step 5.b
		desc = FromPropertyDescriptor(desc); // TODO: remove this once DefinePropertyOrThrow is fixed
		DefinePropertyOrThrow(O, P, desc); // step 5.c
	});

	return O; // step 6
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var $TypeError = GetIntrinsic('%TypeError%');

var GetPrototypeFromConstructor = require('./GetPrototypeFromConstructor');
var IsArray = require('./IsArray');
var ObjectCreate = require('./ObjectCreate');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinarycreatefromconstructor

module.exports = function OrdinaryCreateFromConstructor(constructor, intrinsicDefaultProto) {
	GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
	var proto = GetPrototypeFromConstructor(constructor, intrinsicDefaultProto);
	var slots = arguments.length < 3 ? [] : arguments[2];
	if (!IsArray(slots)) {
		throw new $TypeError('Assertion failed: if provided, `internalSlotsList` must be a List');
	}
	return ObjectCreate(proto, slots);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var IsPropertyKey = require('./IsPropertyKey');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var SameValue = require('./SameValue');
var Type = require('./Type');
var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinarydefineownproperty

module.exports = function OrdinaryDefineOwnProperty(O, P, Desc) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (!$gOPD) {
		// ES3/IE 8 fallback
		if (IsAccessorDescriptor(Desc)) {
			throw new $SyntaxError('This environment does not support accessor property descriptors.');
		}
		var creatingNormalDataProperty = !(P in O)
			&& Desc['[[Writable]]']
			&& Desc['[[Enumerable]]']
			&& Desc['[[Configurable]]']
			&& '[[Value]]' in Desc;
		var settingExistingDataProperty = (P in O)
			&& (!('[[Configurable]]' in Desc) || Desc['[[Configurable]]'])
			&& (!('[[Enumerable]]' in Desc) || Desc['[[Enumerable]]'])
			&& (!('[[Writable]]' in Desc) || Desc['[[Writable]]'])
			&& '[[Value]]' in Desc;
		if (creatingNormalDataProperty || settingExistingDataProperty) {
			O[P] = Desc['[[Value]]']; // eslint-disable-line no-param-reassign
			return SameValue(O[P], Desc['[[Value]]']);
		}
		throw new $SyntaxError('This environment does not support defining non-writable, non-enumerable, or non-configurable properties');
	}
	var desc = $gOPD(O, P);
	var current = desc && ToPropertyDescriptor(desc);
	var extensible = IsExtensible(O);
	return ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');

var has = require('has');

var IsArray = require('./IsArray');
var IsPropertyKey = require('./IsPropertyKey');
var IsRegExp = require('./IsRegExp');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty

module.exports = function OrdinaryGetOwnProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	if (!has(O, P)) {
		return void 0;
	}
	if (!$gOPD) {
		// ES3 / IE 8 fallback
		var arrayLength = IsArray(O) && P === 'length';
		var regexLastIndex = IsRegExp(O) && P === 'lastIndex';
		return {
			'[[Configurable]]': !(arrayLength || regexLastIndex),
			'[[Enumerable]]': $isEnumerable(O, P),
			'[[Value]]': O[P],
			'[[Writable]]': true
		};
	}
	return ToPropertyDescriptor($gOPD(O, P));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $getProto = require('../helpers/getProto');

var Type = require('./Type');

// https://262.ecma-international.org/7.0/#sec-ordinarygetprototypeof

module.exports = function OrdinaryGetPrototypeOf(O) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!$getProto) {
		throw new $TypeError('This environment does not support fetching prototypes.');
	}
	return $getProto(O);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasinstance

module.exports = function OrdinaryHasInstance(C, O) {
	if (IsCallable(C) === false) {
		return false;
	}
	if (Type(O) !== 'Object') {
		return false;
	}
	var P = Get(C, 'prototype');
	if (Type(P) !== 'Object') {
		throw new $TypeError('OrdinaryHasInstance called on an object with an invalid prototype property.');
	}
	return O instanceof C;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasproperty

module.exports = function OrdinaryHasProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	return P in O;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $setProto = require('../helpers/setProto');

var OrdinaryGetPrototypeOf = require('./OrdinaryGetPrototypeOf');
var Type = require('./Type');

// https://262.ecma-international.org/7.0/#sec-ordinarysetprototypeof

module.exports = function OrdinarySetPrototypeOf(O, V) {
	if (Type(V) !== 'Object' && Type(V) !== 'Null') {
		throw new $TypeError('Assertion failed: V must be Object or Null');
	}
	/*
	var extensible = IsExtensible(O);
	var current = OrdinaryGetPrototypeOf(O);
	if (SameValue(V, current)) {
		return true;
	}
	if (!extensible) {
		return false;
	}
	*/
	try {
		$setProto(O, V);
	} catch (e) {
		return false;
	}
	return OrdinaryGetPrototypeOf(O) === V;
	/*
	var p = V;
	var done = false;
	while (!done) {
		if (p === null) {
			done = true;
		} else if (SameValue(p, O)) {
			return false;
		} else {
			if (wat) {
				done = true;
			} else {
				p = p.[[Prototype]];
			}
		}
	}
	O.[[Prototype]] = V;
	return true;
	*/
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');
var forEach = require('../helpers/forEach');

var $charCodeAt = callBound('String.prototype.charCodeAt');
var $numberToString = callBound('Number.prototype.toString');
var $toLowerCase = callBound('String.prototype.toLowerCase');
var $strSlice = callBound('String.prototype.slice');
var $strSplit = callBound('String.prototype.split');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-quotejsonstring

var escapes = {
	'\u0008': 'b',
	'\u000C': 'f',
	'\u000A': 'n',
	'\u000D': 'r',
	'\u0009': 't'
};

module.exports = function QuoteJSONString(value) {
	if (Type(value) !== 'String') {
		throw new $TypeError('Assertion failed: `value` must be a String');
	}
	var product = '"';
	if (value) {
		forEach($strSplit(value), function (C) {
			if (C === '"' || C === '\\') {
				product += '\u005C' + C;
			} else if (C === '\u0008' || C === '\u000C' || C === '\u000A' || C === '\u000D' || C === '\u0009') {
				var abbrev = escapes[C];
				product += '\u005C' + abbrev;
			} else {
				var cCharCode = $charCodeAt(C, 0);
				if (cCharCode < 0x20) {
					product += '\u005Cu' + $toLowerCase($strSlice('0000' + $numberToString(cCharCode, 16), -4));
				} else {
					product += C;
				}
			}
		});
	}
	product += '"';
	return product;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $RegExp = GetIntrinsic('%RegExp%');

// var RegExpAlloc = require('./RegExpAlloc');
// var RegExpInitialize = require('./RegExpInitialize');
var ToString = require('./ToString');

// https://262.ecma-international.org/6.0/#sec-regexpcreate

module.exports = function RegExpCreate(P, F) {
	// var obj = RegExpAlloc($RegExp);
	// return RegExpInitialize(obj, P, F);

	// covers spec mechanics; bypass regex brand checking
	var pattern = typeof P === 'undefined' ? '' : ToString(P);
	var flags = typeof F === 'undefined' ? '' : ToString(F);
	return new $RegExp(pattern, flags);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var regexExec = require('call-bind/callBound')('RegExp.prototype.exec');

var Call = require('./Call');
var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-regexpexec

module.exports = function RegExpExec(R, S) {
	if (Type(R) !== 'Object') {
		throw new $TypeError('Assertion failed: `R` must be an Object');
	}
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	var exec = Get(R, 'exec');
	if (IsCallable(exec)) {
		var result = Call(exec, R, [S]);
		if (result === null || Type(result) === 'Object') {
			return result;
		}
		throw new $TypeError('"exec" method must return `null` or an Object');
	}
	return regexExec(R, S);
};
'use strict';

module.exports = require('../5/CheckObjectCoercible');
'use strict';

var $isNaN = require('../helpers/isNaN');

// http://262.ecma-international.org/5.1/#sec-9.12

module.exports = function SameValue(x, y) {
	if (x === y) { // 0 === -0, but they are not identical.
		if (x === 0) { return 1 / x === 1 / y; }
		return true;
	}
	return $isNaN(x) && $isNaN(y);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var SameValue = require('./SameValue');

// https://262.ecma-international.org/7.0/#sec-samevaluenonnumber

module.exports = function SameValueNonNumber(x, y) {
	if (typeof x === 'number' || typeof x !== typeof y) {
		throw new $TypeError('SameValueNonNumber requires two non-number values of the same type.');
	}
	return SameValue(x, y);
};
'use strict';

var $isNaN = require('../helpers/isNaN');

// https://ecma-international.org/ecma-262/6.0/#sec-samevaluezero

module.exports = function SameValueZero(x, y) {
	return (x === y) || ($isNaN(x) && $isNaN(y));
};
'use strict';

var floor = require('./floor');
var modulo = require('./modulo');

var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var SecondsPerMinute = timeConstants.SecondsPerMinute;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function SecFromTime(t) {
	return modulo(floor(t / msPerSecond), SecondsPerMinute);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// IE 9 does not throw in strict mode when writability/configurability/extensibility is violated
var noThrowOnStrictViolation = (function () {
	try {
		delete [].length;
		return true;
	} catch (e) {
		return false;
	}
}());

// https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw

module.exports = function Set(O, P, V, Throw) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	if (Type(Throw) !== 'Boolean') {
		throw new $TypeError('Assertion failed: `Throw` must be a Boolean');
	}
	if (Throw) {
		O[P] = V; // eslint-disable-line no-param-reassign
		if (noThrowOnStrictViolation && !SameValue(O[P], V)) {
			throw new $TypeError('Attempted to assign to readonly property.');
		}
		return true;
	}
	try {
		O[P] = V; // eslint-disable-line no-param-reassign
		return noThrowOnStrictViolation ? SameValue(O[P], V) : true;
	} catch (e) {
		return false;
	}

};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var has = require('has');

var $TypeError = GetIntrinsic('%TypeError%');

var getSymbolDescription = require('get-symbol-description');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var IsExtensible = require('./IsExtensible');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-setfunctionname

module.exports = function SetFunctionName(F, name) {
	if (typeof F !== 'function') {
		throw new $TypeError('Assertion failed: `F` must be a function');
	}
	if (!IsExtensible(F) || has(F, 'name')) {
		throw new $TypeError('Assertion failed: `F` must be extensible, and must not have a `name` own property');
	}
	var nameType = Type(name);
	if (nameType !== 'Symbol' && nameType !== 'String') {
		throw new $TypeError('Assertion failed: `name` must be a Symbol or a String');
	}
	if (nameType === 'Symbol') {
		var description = getSymbolDescription(name);
		// eslint-disable-next-line no-param-reassign
		name = typeof description === 'undefined' ? '' : '[' + description + ']';
	}
	if (arguments.length > 2) {
		var prefix = arguments[2];
		// eslint-disable-next-line no-param-reassign
		name = prefix + ' ' + name;
	}
	return DefinePropertyOrThrow(F, 'name', {
		'[[Value]]': name,
		'[[Writable]]': false,
		'[[Enumerable]]': false,
		'[[Configurable]]': true
	});
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');
var $preventExtensions = GetIntrinsic('%Object.preventExtensions%', true);
var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%', true);

var forEach = require('../helpers/forEach');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-setintegritylevel

module.exports = function SetIntegrityLevel(O, level) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (level !== 'sealed' && level !== 'frozen') {
		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
	}
	if (!$preventExtensions) {
		throw new $SyntaxError('SetIntegrityLevel requires native `Object.preventExtensions` support');
	}
	var status = $preventExtensions(O);
	if (!status) {
		return false;
	}
	if (!$gOPN) {
		throw new $SyntaxError('SetIntegrityLevel requires native `Object.getOwnPropertyNames` support');
	}
	var theKeys = $gOPN(O);
	if (level === 'sealed') {
		forEach(theKeys, function (k) {
			DefinePropertyOrThrow(O, k, { configurable: false });
		});
	} else if (level === 'frozen') {
		forEach(theKeys, function (k) {
			var currentDesc = $gOPD(O, k);
			if (typeof currentDesc !== 'undefined') {
				var desc;
				if (IsAccessorDescriptor(ToPropertyDescriptor(currentDesc))) {
					desc = { configurable: false };
				} else {
					desc = { configurable: false, writable: false };
				}
				DefinePropertyOrThrow(O, k, desc);
			}
		});
	}
	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $species = GetIntrinsic('%Symbol.species%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var IsConstructor = require('./IsConstructor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor

module.exports = function SpeciesConstructor(O, defaultConstructor) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	var C = O.constructor;
	if (typeof C === 'undefined') {
		return defaultConstructor;
	}
	if (Type(C) !== 'Object') {
		throw new $TypeError('O.constructor is not an Object');
	}
	var S = $species ? C[$species] : void 0;
	if (S == null) {
		return defaultConstructor;
	}
	if (IsConstructor(S)) {
		return S;
	}
	throw new $TypeError('no constructor found');
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');

var IsInteger = require('./IsInteger');
var Type = require('./Type');

var $charAt = callBound('String.prototype.charAt');

// https://262.ecma-international.org/6.0/#sec-splitmatch

module.exports = function SplitMatch(S, q, R) {
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	if (!IsInteger(q)) {
		throw new $TypeError('Assertion failed: `q` must be an integer');
	}
	if (Type(R) !== 'String') {
		throw new $TypeError('Assertion failed: `R` must be a String');
	}
	var r = R.length;
	var s = S.length;
	if (q + r > s) {
		return false;
	}

	for (var i = 0; i < r; i += 1) {
		if ($charAt(S, q + i) !== $charAt(R, i)) {
			return false;
		}
	}

	return q + r;
};
'use strict';

var Type = require('./Type');

// https://262.ecma-international.org/5.1/#sec-11.9.6

module.exports = function StrictEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType !== yType) {
		return false;
	}
	if (xType === 'Undefined' || xType === 'Null') {
		return true;
	}
	return x === y; // shortcut for steps 4-7
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Object = GetIntrinsic('%Object%');
var $StringPrototype = GetIntrinsic('%String.prototype%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var Type = require('./Type');

var setProto = require('../helpers/setProto');

// https://262.ecma-international.org/6.0/#sec-stringcreate

module.exports = function StringCreate(value, prototype) {
	if (Type(value) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}

	var S = $Object(value);
	if (prototype !== $StringPrototype) {
		if (setProto) {
			setProto(S, prototype);
		} else {
			throw new $SyntaxError('StringCreate: a `proto` argument that is not `String.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
		}
	}

	var length = value.length;
	DefinePropertyOrThrow(S, 'length', {
		'[[Configurable]]': false,
		'[[Enumerable]]': false,
		'[[Value]]': length,
		'[[Writable]]': false
	});

	return S;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $SymbolToString = callBound('Symbol.prototype.toString', true);

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-symboldescriptivestring

module.exports = function SymbolDescriptiveString(sym) {
	if (Type(sym) !== 'Symbol') {
		throw new $TypeError('Assertion failed: `sym` must be a Symbol');
	}
	return $SymbolToString(sym);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $TypeError = GetIntrinsic('%TypeError%');

var every = require('../helpers/every');
var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');

var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-testintegritylevel

module.exports = function TestIntegrityLevel(O, level) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (level !== 'sealed' && level !== 'frozen') {
		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
	}
	var status = IsExtensible(O);
	if (status) {
		return false;
	}
	var theKeys = OwnPropertyKeys(O);
	return theKeys.length === 0 || every(theKeys, function (k) {
		var currentDesc = $gOPD(O, k);
		if (typeof currentDesc !== 'undefined') {
			if (currentDesc.configurable) {
				return false;
			}
			if (level === 'frozen' && IsDataDescriptor(ToPropertyDescriptor(currentDesc)) && currentDesc.writable) {
				return false;
			}
		}
		return true;
	});
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Date = GetIntrinsic('%Date%');
var $Number = GetIntrinsic('%Number%');

var $isFinite = require('../helpers/isFinite');

var abs = require('./abs');
var ToNumber = require('./ToNumber');

// https://262.ecma-international.org/5.1/#sec-15.9.1.14

module.exports = function TimeClip(time) {
	if (!$isFinite(time) || abs(time) > 8.64e15) {
		return NaN;
	}
	return $Number(new $Date(ToNumber(time)));
};

'use strict';

var msPerDay = require('../helpers/timeConstants').msPerDay;

var DayFromYear = require('./DayFromYear');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function TimeFromYear(y) {
	return msPerDay * DayFromYear(y);
};
'use strict';

var modulo = require('./modulo');

var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.2

module.exports = function TimeWithinDay(t) {
	return modulo(t, msPerDay);
};

'use strict';

// http://262.ecma-international.org/5.1/#sec-9.2

module.exports = function ToBoolean(value) { return !!value; };
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $Date = GetIntrinsic('%Date%');

var $isNaN = require('../helpers/isNaN');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-todatestring

module.exports = function ToDateString(tv) {
	if (Type(tv) !== 'Number') {
		throw new $TypeError('Assertion failed: `tv` must be a Number');
	}
	if ($isNaN(tv)) {
		return 'Invalid Date';
	}
	return $Date(tv);
};
'use strict';

var ToUint16 = require('./ToUint16');

// https://ecma-international.org/ecma-262/6.0/#sec-toint16

module.exports = function ToInt16(argument) {
	var int16bit = ToUint16(argument);
	return int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;
};
'use strict';

var ToNumber = require('./ToNumber');

// http://262.ecma-international.org/5.1/#sec-9.5

module.exports = function ToInt32(x) {
	return ToNumber(x) >> 0;
};
'use strict';

var ToUint8 = require('./ToUint8');

// https://ecma-international.org/ecma-262/6.0/#sec-toint8

module.exports = function ToInt8(argument) {
	var int8bit = ToUint8(argument);
	return int8bit >= 0x80 ? int8bit - 0x100 : int8bit;
};
'use strict';

var ES5ToInteger = require('../5/ToInteger');

var ToNumber = require('./ToNumber');

// https://ecma-international.org/ecma-262/6.0/#sec-tointeger

module.exports = function ToInteger(value) {
	var number = ToNumber(value);
	return ES5ToInteger(number);
};
'use strict';

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');

var ToInteger = require('./ToInteger');

module.exports = function ToLength(argument) {
	var len = ToInteger(argument);
	if (len <= 0) { return 0; } // includes converting -0 to +0
	if (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }
	return len;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $Number = GetIntrinsic('%Number%');
var $RegExp = GetIntrinsic('%RegExp%');
var $parseInteger = GetIntrinsic('%parseInt%');

var callBound = require('call-bind/callBound');
var regexTester = require('../helpers/regexTester');
var isPrimitive = require('../helpers/isPrimitive');

var $strSlice = callBound('String.prototype.slice');
var isBinary = regexTester(/^0b[01]+$/i);
var isOctal = regexTester(/^0o[0-7]+$/i);
var isInvalidHexLiteral = regexTester(/^[-+]0x[0-9a-f]+$/i);
var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
var hasNonWS = regexTester(nonWSregex);

// whitespace from: https://es5.github.io/#x15.5.4.20
// implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
var ws = [
	'\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
	'\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
	'\u2029\uFEFF'
].join('');
var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
var $replace = callBound('String.prototype.replace');
var $trim = function (value) {
	return $replace(value, trimRegex, '');
};

var ToPrimitive = require('./ToPrimitive');

// https://ecma-international.org/ecma-262/6.0/#sec-tonumber

module.exports = function ToNumber(argument) {
	var value = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number);
	if (typeof value === 'symbol') {
		throw new $TypeError('Cannot convert a Symbol value to a number');
	}
	if (typeof value === 'string') {
		if (isBinary(value)) {
			return ToNumber($parseInteger($strSlice(value, 2), 2));
		} else if (isOctal(value)) {
			return ToNumber($parseInteger($strSlice(value, 2), 8));
		} else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
			return NaN;
		}
		var trimmed = $trim(value);
		if (trimmed !== value) {
			return ToNumber(trimmed);
		}

	}
	return $Number(value);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Object = GetIntrinsic('%Object%');

var RequireObjectCoercible = require('./RequireObjectCoercible');

// https://ecma-international.org/ecma-262/6.0/#sec-toobject

module.exports = function ToObject(value) {
	RequireObjectCoercible(value);
	return $Object(value);
};
'use strict';

var toPrimitive = require('es-to-primitive/es2015');

// https://ecma-international.org/ecma-262/6.0/#sec-toprimitive

module.exports = function ToPrimitive(input) {
	if (arguments.length > 1) {
		return toPrimitive(input, arguments[1]);
	}
	return toPrimitive(input);
};
'use strict';

var has = require('has');

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');
var ToBoolean = require('./ToBoolean');
var IsCallable = require('./IsCallable');

// https://262.ecma-international.org/5.1/#sec-8.10.5

module.exports = function ToPropertyDescriptor(Obj) {
	if (Type(Obj) !== 'Object') {
		throw new $TypeError('ToPropertyDescriptor requires an object');
	}

	var desc = {};
	if (has(Obj, 'enumerable')) {
		desc['[[Enumerable]]'] = ToBoolean(Obj.enumerable);
	}
	if (has(Obj, 'configurable')) {
		desc['[[Configurable]]'] = ToBoolean(Obj.configurable);
	}
	if (has(Obj, 'value')) {
		desc['[[Value]]'] = Obj.value;
	}
	if (has(Obj, 'writable')) {
		desc['[[Writable]]'] = ToBoolean(Obj.writable);
	}
	if (has(Obj, 'get')) {
		var getter = Obj.get;
		if (typeof getter !== 'undefined' && !IsCallable(getter)) {
			throw new $TypeError('getter must be a function');
		}
		desc['[[Get]]'] = getter;
	}
	if (has(Obj, 'set')) {
		var setter = Obj.set;
		if (typeof setter !== 'undefined' && !IsCallable(setter)) {
			throw new $TypeError('setter must be a function');
		}
		desc['[[Set]]'] = setter;
	}

	if ((has(desc, '[[Get]]') || has(desc, '[[Set]]')) && (has(desc, '[[Value]]') || has(desc, '[[Writable]]'))) {
		throw new $TypeError('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
	}
	return desc;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $String = GetIntrinsic('%String%');

var ToPrimitive = require('./ToPrimitive');
var ToString = require('./ToString');

// https://ecma-international.org/ecma-262/6.0/#sec-topropertykey

module.exports = function ToPropertyKey(argument) {
	var key = ToPrimitive(argument, $String);
	return typeof key === 'symbol' ? key : ToString(key);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $String = GetIntrinsic('%String%');
var $TypeError = GetIntrinsic('%TypeError%');

// https://ecma-international.org/ecma-262/6.0/#sec-tostring

module.exports = function ToString(argument) {
	if (typeof argument === 'symbol') {
		throw new $TypeError('Cannot convert a Symbol value to a string');
	}
	return $String(argument);
};
'use strict';

var abs = require('./abs');
var floor = require('./floor');
var modulo = require('./modulo');
var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');

// http://262.ecma-international.org/5.1/#sec-9.7

module.exports = function ToUint16(value) {
	var number = ToNumber(value);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * floor(abs(number));
	return modulo(posInt, 0x10000);
};
'use strict';

var ToNumber = require('./ToNumber');

// http://262.ecma-international.org/5.1/#sec-9.6

module.exports = function ToUint32(x) {
	return ToNumber(x) >>> 0;
};
'use strict';

var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');

var abs = require('./abs');
var floor = require('./floor');
var modulo = require('./modulo');

// https://ecma-international.org/ecma-262/6.0/#sec-touint8

module.exports = function ToUint8(argument) {
	var number = ToNumber(argument);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * floor(abs(number));
	return modulo(posInt, 0x100);
};
'use strict';

var ToNumber = require('./ToNumber');
var floor = require('./floor');

var $isNaN = require('../helpers/isNaN');

// https://ecma-international.org/ecma-262/6.0/#sec-touint8clamp

module.exports = function ToUint8Clamp(argument) {
	var number = ToNumber(argument);
	if ($isNaN(number) || number <= 0) { return 0; }
	if (number >= 0xFF) { return 0xFF; }
	var f = floor(argument);
	if (f + 0.5 < number) { return f + 1; }
	if (number < f + 0.5) { return f; }
	if (f % 2 !== 0) { return f + 1; }
	return f;
};
'use strict';

var ES5Type = require('../5/Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ecmascript-data-types-and-values

module.exports = function Type(x) {
	if (typeof x === 'symbol') {
		return 'Symbol';
	}
	return ES5Type(x);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $fromCharCode = GetIntrinsic('%String.fromCharCode%');

// https://262.ecma-international.org/7.0/#sec-utf16decode

var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');

// https://262.ecma-international.org/11.0/#sec-utf16decodesurrogatepair

module.exports = function UTF16Decode(lead, trail) {
	if (!isLeadingSurrogate(lead) || !isTrailingSurrogate(trail)) {
		throw new $TypeError('Assertion failed: `lead` must be a leading surrogate char code, and `trail` must be a trailing surrogate char code');
	}
	// var cp = (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000;
	return $fromCharCode(lead) + $fromCharCode(trail);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $fromCharCode = GetIntrinsic('%String.fromCharCode%');

var floor = require('./floor');
var modulo = require('./modulo');

var isCodePoint = require('../helpers/isCodePoint');

// https://262.ecma-international.org/7.0/#sec-utf16encoding

module.exports = function UTF16Encoding(cp) {
	if (!isCodePoint(cp)) {
		throw new $TypeError('Assertion failed: `cp` must be >= 0 and <= 0x10FFFF');
	}
	if (cp <= 65535) {
		return $fromCharCode(cp);
	}
	var cu1 = floor((cp - 65536) / 1024) + 0xD800;
	var cu2 = modulo(cp - 65536, 1024) + 0xDC00;
	return $fromCharCode(cu1) + $fromCharCode(cu2);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');
var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
var isSamePropertyDescriptor = require('../helpers/isSamePropertyDescriptor');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsGenericDescriptor = require('./IsGenericDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-validateandapplypropertydescriptor
// https://ecma-international.org/ecma-262/8.0/#sec-validateandapplypropertydescriptor

// eslint-disable-next-line max-lines-per-function, max-statements, max-params
module.exports = function ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current) {
	// this uses the ES2017+ logic, since it fixes a number of bugs in the ES2015 logic.
	var oType = Type(O);
	if (oType !== 'Undefined' && oType !== 'Object') {
		throw new $TypeError('Assertion failed: O must be undefined or an Object');
	}
	if (Type(extensible) !== 'Boolean') {
		throw new $TypeError('Assertion failed: extensible must be a Boolean');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (Type(current) !== 'Undefined' && !isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, current)) {
		throw new $TypeError('Assertion failed: current must be a Property Descriptor, or undefined');
	}
	if (oType !== 'Undefined' && !IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: if O is not undefined, P must be a Property Key');
	}
	if (Type(current) === 'Undefined') {
		if (!extensible) {
			return false;
		}
		if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
			if (oType !== 'Undefined') {
				DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					{
						'[[Configurable]]': Desc['[[Configurable]]'],
						'[[Enumerable]]': Desc['[[Enumerable]]'],
						'[[Value]]': Desc['[[Value]]'],
						'[[Writable]]': Desc['[[Writable]]']
					}
				);
			}
		} else {
			if (!IsAccessorDescriptor(Desc)) {
				throw new $TypeError('Assertion failed: Desc is not an accessor descriptor');
			}
			if (oType !== 'Undefined') {
				return DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					Desc
				);
			}
		}
		return true;
	}
	if (IsGenericDescriptor(Desc) && !('[[Configurable]]' in Desc) && !('[[Enumerable]]' in Desc)) {
		return true;
	}
	if (isSamePropertyDescriptor({ SameValue: SameValue }, Desc, current)) {
		return true; // removed by ES2017, but should still be correct
	}
	// "if every field in Desc is absent, return true" can't really match the assertion that it's a Property Descriptor
	if (!current['[[Configurable]]']) {
		if (Desc['[[Configurable]]']) {
			return false;
		}
		if ('[[Enumerable]]' in Desc && !Desc['[[Enumerable]]'] === !!current['[[Enumerable]]']) {
			return false;
		}
	}
	if (IsGenericDescriptor(Desc)) {
		// no further validation is required.
	} else if (IsDataDescriptor(current) !== IsDataDescriptor(Desc)) {
		if (!current['[[Configurable]]']) {
			return false;
		}
		if (IsDataDescriptor(current)) {
			if (oType !== 'Undefined') {
				DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					{
						'[[Configurable]]': current['[[Configurable]]'],
						'[[Enumerable]]': current['[[Enumerable]]'],
						'[[Get]]': undefined
					}
				);
			}
		} else if (oType !== 'Undefined') {
			DefineOwnProperty(
				IsDataDescriptor,
				SameValue,
				FromPropertyDescriptor,
				O,
				P,
				{
					'[[Configurable]]': current['[[Configurable]]'],
					'[[Enumerable]]': current['[[Enumerable]]'],
					'[[Value]]': undefined
				}
			);
		}
	} else if (IsDataDescriptor(current) && IsDataDescriptor(Desc)) {
		if (!current['[[Configurable]]'] && !current['[[Writable]]']) {
			if ('[[Writable]]' in Desc && Desc['[[Writable]]']) {
				return false;
			}
			if ('[[Value]]' in Desc && !SameValue(Desc['[[Value]]'], current['[[Value]]'])) {
				return false;
			}
			return true;
		}
	} else if (IsAccessorDescriptor(current) && IsAccessorDescriptor(Desc)) {
		if (!current['[[Configurable]]']) {
			if ('[[Set]]' in Desc && !SameValue(Desc['[[Set]]'], current['[[Set]]'])) {
				return false;
			}
			if ('[[Get]]' in Desc && !SameValue(Desc['[[Get]]'], current['[[Get]]'])) {
				return false;
			}
			return true;
		}
	} else {
		throw new $TypeError('Assertion failed: current and Desc are not both data, both accessors, or one accessor and one data.');
	}
	if (oType !== 'Undefined') {
		return DefineOwnProperty(
			IsDataDescriptor,
			SameValue,
			FromPropertyDescriptor,
			O,
			P,
			Desc
		);
	}
	return true;
};
'use strict';

var Day = require('./Day');
var modulo = require('./modulo');

// https://262.ecma-international.org/5.1/#sec-15.9.1.6

module.exports = function WeekDay(t) {
	return modulo(Day(t) + 4, 7);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Date = GetIntrinsic('%Date%');

var callBound = require('call-bind/callBound');

var $getUTCFullYear = callBound('Date.prototype.getUTCFullYear');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function YearFromTime(t) {
	// largest y such that this.TimeFromYear(y) <= t
	return $getUTCFullYear(new $Date(t));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $abs = GetIntrinsic('%Math.abs%');

// http://262.ecma-international.org/5.1/#sec-5.2

module.exports = function abs(x) {
	return $abs(x);
};
'use strict';

// var modulo = require('./modulo');
var $floor = Math.floor;

// http://262.ecma-international.org/5.1/#sec-5.2

module.exports = function floor(x) {
	// return x - modulo(x, 1);
	return $floor(x);
};
'use strict';

var mod = require('../helpers/mod');

// https://262.ecma-international.org/5.1/#sec-5.2

module.exports = function modulo(x, y) {
	return mod(x, y);
};
'use strict';

var modulo = require('./modulo');

var msPerSecond = require('../helpers/timeConstants').msPerSecond;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function msFromTime(t) {
	return modulo(t, msPerSecond);
};
'use strict';

var $BooleanValueOf = require('call-bind/callBound')('Boolean.prototype.valueOf');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-boolean-prototype-object

module.exports = function thisBooleanValue(value) {
	if (Type(value) === 'Boolean') {
		return value;
	}

	return $BooleanValueOf(value);
};
'use strict';

var callBound = require('call-bind/callBound');

var Type = require('./Type');

var $NumberValueOf = callBound('Number.prototype.valueOf');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-number-prototype-object

module.exports = function thisNumberValue(value) {
	if (Type(value) === 'Number') {
		return value;
	}

	return $NumberValueOf(value);
};

'use strict';

var $StringValueOf = require('call-bind/callBound')('String.prototype.valueOf');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object

module.exports = function thisStringValue(value) {
	if (Type(value) === 'String') {
		return value;
	}

	return $StringValueOf(value);
};
'use strict';

var $DateGetTime = require('call-bind/callBound')('Date.prototype.getTime');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-date-prototype-object

module.exports = function thisTimeValue(value) {
	return $DateGetTime(value);
};
'use strict';

var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-abstract-equality-comparison

module.exports = function AbstractEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType === yType) {
		return x === y; // ES6+ specified this shortcut anyways.
	}
	if (x == null && y == null) {
		return true;
	}
	if (xType === 'Number' && yType === 'String') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if (xType === 'String' && yType === 'Number') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (xType === 'Boolean') {
		return AbstractEqualityComparison(ToNumber(x), y);
	}
	if (yType === 'Boolean') {
		return AbstractEqualityComparison(x, ToNumber(y));
	}
	if ((xType === 'String' || xType === 'Number' || xType === 'Symbol') && yType === 'Object') {
		return AbstractEqualityComparison(x, ToPrimitive(y));
	}
	if (xType === 'Object' && (yType === 'String' || yType === 'Number' || yType === 'Symbol')) {
		return AbstractEqualityComparison(ToPrimitive(x), y);
	}
	return false;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Number = GetIntrinsic('%Number%');
var $TypeError = GetIntrinsic('%TypeError%');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var isPrefixOf = require('../helpers/isPrefixOf');

var ToNumber = require('./ToNumber');
var ToPrimitive = require('./ToPrimitive');
var Type = require('./Type');

// https://262.ecma-international.org/5.1/#sec-11.8.5

// eslint-disable-next-line max-statements
module.exports = function AbstractRelationalComparison(x, y, LeftFirst) {
	if (Type(LeftFirst) !== 'Boolean') {
		throw new $TypeError('Assertion failed: LeftFirst argument must be a Boolean');
	}
	var px;
	var py;
	if (LeftFirst) {
		px = ToPrimitive(x, $Number);
		py = ToPrimitive(y, $Number);
	} else {
		py = ToPrimitive(y, $Number);
		px = ToPrimitive(x, $Number);
	}
	var bothStrings = Type(px) === 'String' && Type(py) === 'String';
	if (!bothStrings) {
		var nx = ToNumber(px);
		var ny = ToNumber(py);
		if ($isNaN(nx) || $isNaN(ny)) {
			return undefined;
		}
		if ($isFinite(nx) && $isFinite(ny) && nx === ny) {
			return false;
		}
		if (nx === Infinity) {
			return false;
		}
		if (ny === Infinity) {
			return true;
		}
		if (ny === -Infinity) {
			return false;
		}
		if (nx === -Infinity) {
			return true;
		}
		return nx < ny; // by now, these are both nonzero, finite, and not equal
	}
	if (isPrefixOf(py, px)) {
		return false;
	}
	if (isPrefixOf(px, py)) {
		return true;
	}
	return px < py; // both strings, neither a prefix of the other. shortcut for steps c-f
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var IsInteger = require('./IsInteger');
var Type = require('./Type');

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');
var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');

var $TypeError = GetIntrinsic('%TypeError%');

var $charCodeAt = require('call-bind/callBound')('String.prototype.charCodeAt');

// https://ecma-international.org/ecma-262/6.0/#sec-advancestringindex

module.exports = function AdvanceStringIndex(S, index, unicode) {
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	if (!IsInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) {
		throw new $TypeError('Assertion failed: `length` must be an integer >= 0 and <= 2**53');
	}
	if (Type(unicode) !== 'Boolean') {
		throw new $TypeError('Assertion failed: `unicode` must be a Boolean');
	}
	if (!unicode) {
		return index + 1;
	}
	var length = S.length;
	if ((index + 1) >= length) {
		return index + 1;
	}

	var first = $charCodeAt(S, index);
	if (!isLeadingSurrogate(first)) {
		return index + 1;
	}

	var second = $charCodeAt(S, index + 1);
	if (!isTrailingSurrogate(second)) {
		return index + 1;
	}

	return index + 2;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $ArrayPrototype = GetIntrinsic('%Array.prototype%');
var $RangeError = GetIntrinsic('%RangeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var IsInteger = require('./IsInteger');

var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1;

var $setProto = GetIntrinsic('%Object.setPrototypeOf%', true) || (
	// eslint-disable-next-line no-proto, no-negated-condition
	[].__proto__ !== $ArrayPrototype
		? null
		: function (O, proto) {
			O.__proto__ = proto; // eslint-disable-line no-proto, no-param-reassign
			return O;
		}
);

// https://ecma-international.org/ecma-262/6.0/#sec-arraycreate

module.exports = function ArrayCreate(length) {
	if (!IsInteger(length) || length < 0) {
		throw new $TypeError('Assertion failed: `length` must be an integer Number >= 0');
	}
	if (length > MAX_ARRAY_LENGTH) {
		throw new $RangeError('length is greater than (2**32 - 1)');
	}
	var proto = arguments.length > 1 ? arguments[1] : $ArrayPrototype;
	var A = []; // steps 5 - 7, and 9
	if (proto !== $ArrayPrototype) { // step 8
		if (!$setProto) {
			throw new $SyntaxError('ArrayCreate: a `proto` argument that is not `Array.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
		}
		$setProto(A, proto);
	}
	if (length !== 0) { // bypasses the need for step 2
		A.length = length;
	}
	/* step 10, the above as a shortcut for the below
	OrdinaryDefineOwnProperty(A, 'length', {
		'[[Configurable]]': false,
		'[[Enumerable]]': false,
		'[[Value]]': length,
		'[[Writable]]': true
	});
	*/
	return A;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $RangeError = GetIntrinsic('%RangeError%');
var $TypeError = GetIntrinsic('%TypeError%');

var assign = require('object.assign');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var IsArray = require('./IsArray');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var OrdinaryDefineOwnProperty = require('./OrdinaryDefineOwnProperty');
var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
var ToNumber = require('./ToNumber');
var ToString = require('./ToString');
var ToUint32 = require('./ToUint32');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-arraysetlength

// eslint-disable-next-line max-statements, max-lines-per-function
module.exports = function ArraySetLength(A, Desc) {
	if (!IsArray(A)) {
		throw new $TypeError('Assertion failed: A must be an Array');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (!('[[Value]]' in Desc)) {
		return OrdinaryDefineOwnProperty(A, 'length', Desc);
	}
	var newLenDesc = assign({}, Desc);
	var newLen = ToUint32(Desc['[[Value]]']);
	var numberLen = ToNumber(Desc['[[Value]]']);
	if (newLen !== numberLen) {
		throw new $RangeError('Invalid array length');
	}
	newLenDesc['[[Value]]'] = newLen;
	var oldLenDesc = OrdinaryGetOwnProperty(A, 'length');
	if (!IsDataDescriptor(oldLenDesc)) {
		throw new $TypeError('Assertion failed: an array had a non-data descriptor on `length`');
	}
	var oldLen = oldLenDesc['[[Value]]'];
	if (newLen >= oldLen) {
		return OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
	}
	if (!oldLenDesc['[[Writable]]']) {
		return false;
	}
	var newWritable;
	if (!('[[Writable]]' in newLenDesc) || newLenDesc['[[Writable]]']) {
		newWritable = true;
	} else {
		newWritable = false;
		newLenDesc['[[Writable]]'] = true;
	}
	var succeeded = OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
	if (!succeeded) {
		return false;
	}
	while (newLen < oldLen) {
		oldLen -= 1;
		// eslint-disable-next-line no-param-reassign
		var deleteSucceeded = delete A[ToString(oldLen)];
		if (!deleteSucceeded) {
			newLenDesc['[[Value]]'] = oldLen + 1;
			if (!newWritable) {
				newLenDesc['[[Writable]]'] = false;
				OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
				return false;
			}
		}
	}
	if (!newWritable) {
		return OrdinaryDefineOwnProperty(A, 'length', { '[[Writable]]': false });
	}
	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Array = GetIntrinsic('%Array%');
var $species = GetIntrinsic('%Symbol.species%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsArray = require('./IsArray');
var IsConstructor = require('./IsConstructor');
var IsInteger = require('./IsInteger');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate

module.exports = function ArraySpeciesCreate(originalArray, length) {
	if (!IsInteger(length) || length < 0) {
		throw new $TypeError('Assertion failed: length must be an integer >= 0');
	}
	var len = length === 0 ? 0 : length;
	var C;
	var isArray = IsArray(originalArray);
	if (isArray) {
		C = Get(originalArray, 'constructor');
		// TODO: figure out how to make a cross-realm normal Array, a same-realm Array
		// if (IsConstructor(C)) {
		// 	if C is another realm's Array, C = undefined
		// 	Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?
		// }
		if ($species && Type(C) === 'Object') {
			C = Get(C, $species);
			if (C === null) {
				C = void 0;
			}
		}
	}
	if (typeof C === 'undefined') {
		return $Array(len);
	}
	if (!IsConstructor(C)) {
		throw new $TypeError('C must be a constructor');
	}
	return new C(len); // Construct(C, len);
};

'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');

var IsArray = require('./IsArray');

var $apply = GetIntrinsic('%Reflect.apply%', true) || callBound('%Function.prototype.apply%');

// https://ecma-international.org/ecma-262/6.0/#sec-call

module.exports = function Call(F, V) {
	var argumentsList = arguments.length > 2 ? arguments[2] : [];
	if (!IsArray(argumentsList)) {
		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
	}
	return $apply(F, V, argumentsList);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var SameValue = require('./SameValue');
var ToNumber = require('./ToNumber');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring

module.exports = function CanonicalNumericIndexString(argument) {
	if (Type(argument) !== 'String') {
		throw new $TypeError('Assertion failed: `argument` must be a String');
	}
	if (argument === '-0') { return -0; }
	var n = ToNumber(argument);
	if (SameValue(ToString(n), argument)) { return n; }
	return void 0;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $fromCharCode = GetIntrinsic('%String.fromCharCode%');
var $TypeError = GetIntrinsic('%TypeError%');
var $charCodeAt = callBound('%String.prototype.charCodeAt%');
var $push = callBound('%Array.prototype.push%');

module.exports = function CharacterRange(A, B) {
	if (A.length !== 1 || B.length !== 1) {
		throw new $TypeError('Assertion failed: CharSets A and B contain exactly one character');
	}

	var a = A[0];
	var b = B[0];

	var i = $charCodeAt(a, 0);
	var j = $charCodeAt(b, 0);

	if (!(i <= j)) {
		throw new $TypeError('Assertion failed: i is not <= j');
	}

	var arr = [];
	for (var k = i; k <= j; k += 1) {
		$push(arr, $fromCharCode(k));
	}
	return arr;
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var IsDataDescriptor = require('./IsDataDescriptor');
var IsGenericDescriptor = require('./IsGenericDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor

module.exports = function CompletePropertyDescriptor(Desc) {
	/* eslint no-param-reassign: 0 */
	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
		if (!has(Desc, '[[Value]]')) {
			Desc['[[Value]]'] = void 0;
		}
		if (!has(Desc, '[[Writable]]')) {
			Desc['[[Writable]]'] = false;
		}
	} else {
		if (!has(Desc, '[[Get]]')) {
			Desc['[[Get]]'] = void 0;
		}
		if (!has(Desc, '[[Set]]')) {
			Desc['[[Set]]'] = void 0;
		}
	}
	if (!has(Desc, '[[Enumerable]]')) {
		Desc['[[Enumerable]]'] = false;
	}
	if (!has(Desc, '[[Configurable]]')) {
		Desc['[[Configurable]]'] = false;
	}
	return Desc;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createdataproperty

module.exports = function CreateDataProperty(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	var oldDesc = OrdinaryGetOwnProperty(O, P);
	var extensible = !oldDesc || IsExtensible(O);
	var nonConfigurable = oldDesc && !oldDesc['[[Configurable]]'];
	if (nonConfigurable || !extensible) {
		return false;
	}
	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		{
			'[[Configurable]]': true,
			'[[Enumerable]]': true,
			'[[Value]]': V,
			'[[Writable]]': true
		}
	);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var CreateDataProperty = require('./CreateDataProperty');
var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// // https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow

module.exports = function CreateDataPropertyOrThrow(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}
	var success = CreateDataProperty(O, P, V);
	if (!success) {
		throw new $TypeError('unable to create data property');
	}
	return success;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $replace = callBound('String.prototype.replace');

var RequireObjectCoercible = require('./RequireObjectCoercible');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createhtml

module.exports = function CreateHTML(string, tag, attribute, value) {
	if (Type(tag) !== 'String' || Type(attribute) !== 'String') {
		throw new $TypeError('Assertion failed: `tag` and `attribute` must be strings');
	}
	var str = RequireObjectCoercible(string);
	var S = ToString(str);
	var p1 = '<' + tag;
	if (attribute !== '') {
		var V = ToString(value);
		var escapedV = $replace(V, /\x22/g, '&quot;');
		p1 += '\x20' + attribute + '\x3D\x22' + escapedV + '\x22';
	}
	return p1 + '>' + S + '</' + tag + '>';
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject

module.exports = function CreateIterResultObject(value, done) {
	if (Type(done) !== 'Boolean') {
		throw new $TypeError('Assertion failed: Type(done) is not Boolean');
	}
	return {
		value: value,
		done: done
	};
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');
var $indexOf = callBound('Array.prototype.indexOf', true) || callBound('String.prototype.indexOf');
var $push = callBound('Array.prototype.push');

var Get = require('./Get');
var IsArray = require('./IsArray');
var ToLength = require('./ToLength');
var ToString = require('./ToString');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createlistfromarraylike
module.exports = function CreateListFromArrayLike(obj) {
	var elementTypes = arguments.length > 1
		? arguments[1]
		: ['Undefined', 'Null', 'Boolean', 'String', 'Symbol', 'Number', 'Object'];

	if (Type(obj) !== 'Object') {
		throw new $TypeError('Assertion failed: `obj` must be an Object');
	}
	if (!IsArray(elementTypes)) {
		throw new $TypeError('Assertion failed: `elementTypes`, if provided, must be an array');
	}
	var len = ToLength(Get(obj, 'length'));
	var list = [];
	var index = 0;
	while (index < len) {
		var indexName = ToString(index);
		var next = Get(obj, indexName);
		var nextType = Type(next);
		if ($indexOf(elementTypes, nextType) < 0) {
			throw new $TypeError('item type ' + nextType + ' is not a valid elementType');
		}
		$push(list, next);
		index += 1;
	}
	return list;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-createmethodproperty

module.exports = function CreateMethodProperty(O, P, V) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	var newDesc = {
		'[[Configurable]]': true,
		'[[Enumerable]]': false,
		'[[Value]]': V,
		'[[Writable]]': true
	};
	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		newDesc
	);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');
var MonthFromTime = require('./MonthFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.5

module.exports = function DateFromTime(t) {
	var m = MonthFromTime(t);
	var d = DayWithinYear(t);
	if (m === 0) {
		return d + 1;
	}
	if (m === 1) {
		return d - 30;
	}
	var leap = InLeapYear(t);
	if (m === 2) {
		return d - 58 - leap;
	}
	if (m === 3) {
		return d - 89 - leap;
	}
	if (m === 4) {
		return d - 119 - leap;
	}
	if (m === 5) {
		return d - 150 - leap;
	}
	if (m === 6) {
		return d - 180 - leap;
	}
	if (m === 7) {
		return d - 211 - leap;
	}
	if (m === 8) {
		return d - 242 - leap;
	}
	if (m === 9) {
		return d - 272 - leap;
	}
	if (m === 10) {
		return d - 303 - leap;
	}
	if (m === 11) {
		return d - 333 - leap;
	}
	throw new $EvalError('Assertion failed: MonthFromTime returned an impossible value: ' + m);
};
'use strict';

var floor = require('./floor');

var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.2

module.exports = function Day(t) {
	return floor(t / msPerDay);
};
'use strict';

var floor = require('./floor');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function DayFromYear(y) {
	return (365 * (y - 1970)) + floor((y - 1969) / 4) - floor((y - 1901) / 100) + floor((y - 1601) / 400);
};

'use strict';

var Day = require('./Day');
var DayFromYear = require('./DayFromYear');
var YearFromTime = require('./YearFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.4

module.exports = function DayWithinYear(t) {
	return Day(t) - DayFromYear(YearFromTime(t));
};
'use strict';

var modulo = require('./modulo');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function DaysInYear(y) {
	if (modulo(y, 4) !== 0) {
		return 365;
	}
	if (modulo(y, 100) !== 0) {
		return 366;
	}
	if (modulo(y, 400) !== 0) {
		return 365;
	}
	return 366;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
var DefineOwnProperty = require('../helpers/DefineOwnProperty');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow

module.exports = function DefinePropertyOrThrow(O, P, desc) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	var Desc = isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, desc) ? desc : ToPropertyDescriptor(desc);
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc is not a valid Property Descriptor');
	}

	return DefineOwnProperty(
		IsDataDescriptor,
		SameValue,
		FromPropertyDescriptor,
		O,
		P,
		Desc
	);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-deletepropertyorthrow

module.exports = function DeletePropertyOrThrow(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// eslint-disable-next-line no-param-reassign
	var success = delete O[P];
	if (!success) {
		throw new $TypeError('Attempt to delete property failed.');
	}
	return success;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var keys = require('object-keys');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-enumerableownnames

module.exports = function EnumerableOwnNames(O) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}

	return keys(O);
};
'use strict';

var assertRecord = require('../helpers/assertRecord');
var fromPropertyDescriptor = require('../helpers/fromPropertyDescriptor');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-frompropertydescriptor

module.exports = function FromPropertyDescriptor(Desc) {
	if (typeof Desc !== 'undefined') {
		assertRecord(Type, 'Property Descriptor', 'Desc', Desc);
	}

	return fromPropertyDescriptor(Desc);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var inspect = require('object-inspect');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-get-o-p

module.exports = function Get(O, P) {
	// 7.3.1.1
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	// 7.3.1.2
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true, got ' + inspect(P));
	}
	// 7.3.1.3
	return O[P];
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var getIteratorMethod = require('../helpers/getIteratorMethod');
var AdvanceStringIndex = require('./AdvanceStringIndex');
var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsArray = require('./IsArray');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getiterator

module.exports = function GetIterator(obj, method) {
	var actualMethod = method;
	if (arguments.length < 2) {
		actualMethod = getIteratorMethod(
			{
				AdvanceStringIndex: AdvanceStringIndex,
				GetMethod: GetMethod,
				IsArray: IsArray
			},
			obj
		);
	}
	var iterator = Call(actualMethod, obj);
	if (Type(iterator) !== 'Object') {
		throw new $TypeError('iterator must return an object');
	}

	return iterator;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var GetV = require('./GetV');
var IsCallable = require('./IsCallable');
var IsPropertyKey = require('./IsPropertyKey');

// https://ecma-international.org/ecma-262/6.0/#sec-getmethod

module.exports = function GetMethod(O, P) {
	// 7.3.9.1
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// 7.3.9.2
	var func = GetV(O, P);

	// 7.3.9.4
	if (func == null) {
		return void 0;
	}

	// 7.3.9.5
	if (!IsCallable(func)) {
		throw new $TypeError(P + 'is not a function');
	}

	// 7.3.9.6
	return func;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var hasSymbols = require('has-symbols')();

var $TypeError = GetIntrinsic('%TypeError%');

var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%', true);
var $gOPS = hasSymbols && GetIntrinsic('%Object.getOwnPropertySymbols%', true);
var keys = require('object-keys');

var esType = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getownpropertykeys

module.exports = function GetOwnPropertyKeys(O, Type) {
	if (esType(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (Type === 'Symbol') {
		return $gOPS ? $gOPS(O) : [];
	}
	if (Type === 'String') {
		if (!$gOPN) {
			return keys(O);
		}
		return $gOPN(O);
	}
	throw new $TypeError('Assertion failed: `Type` must be `"String"` or `"Symbol"`');
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Function = GetIntrinsic('%Function%');
var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsConstructor = require('./IsConstructor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-getprototypefromconstructor

module.exports = function GetPrototypeFromConstructor(constructor, intrinsicDefaultProto) {
	var intrinsic = GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
	if (!IsConstructor(constructor)) {
		throw new $TypeError('Assertion failed: `constructor` must be a constructor');
	}
	var proto = Get(constructor, 'prototype');
	if (Type(proto) !== 'Object') {
		if (!(constructor instanceof $Function)) {
			// ignore other realms, for now
			throw new $TypeError('cross-realm constructors not currently supported');
		}
		proto = intrinsic;
	}
	return proto;
};

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $parseInt = GetIntrinsic('%parseInt%');

var inspect = require('object-inspect');

var regexTester = require('../helpers/regexTester');
var callBound = require('call-bind/callBound');
var every = require('../helpers/every');

var isDigit = regexTester(/^[0-9]$/);

var $charAt = callBound('String.prototype.charAt');
var $strSlice = callBound('String.prototype.slice');

var IsArray = require('./IsArray');
var IsInteger = require('./IsInteger');
var Type = require('./Type');

var canDistinguishSparseFromUndefined = 0 in [undefined]; // IE 6 - 8 have a bug where this returns false

var isStringOrHole = function (capture, index, arr) {
	return Type(capture) === 'String' || (canDistinguishSparseFromUndefined ? !(index in arr) : Type(capture) === 'Undefined');
};

// https://ecma-international.org/ecma-262/6.0/#sec-getsubstitution

// eslint-disable-next-line max-statements, max-params, max-lines-per-function
module.exports = function GetSubstitution(matched, str, position, captures, replacement) {
	if (Type(matched) !== 'String') {
		throw new $TypeError('Assertion failed: `matched` must be a String');
	}
	var matchLength = matched.length;

	if (Type(str) !== 'String') {
		throw new $TypeError('Assertion failed: `str` must be a String');
	}
	var stringLength = str.length;

	if (!IsInteger(position) || position < 0 || position > stringLength) {
		throw new $TypeError('Assertion failed: `position` must be a nonnegative integer, and less than or equal to the length of `string`, got ' + inspect(position));
	}

	if (!IsArray(captures) || !every(captures, isStringOrHole)) {
		throw new $TypeError('Assertion failed: `captures` must be a List of Strings, got ' + inspect(captures));
	}

	if (Type(replacement) !== 'String') {
		throw new $TypeError('Assertion failed: `replacement` must be a String');
	}

	var tailPos = position + matchLength;
	var m = captures.length;

	var result = '';
	for (var i = 0; i < replacement.length; i += 1) {
		// if this is a $, and it's not the end of the replacement
		var current = $charAt(replacement, i);
		var isLast = (i + 1) >= replacement.length;
		var nextIsLast = (i + 2) >= replacement.length;
		if (current === '$' && !isLast) {
			var next = $charAt(replacement, i + 1);
			if (next === '$') {
				result += '$';
				i += 1;
			} else if (next === '&') {
				result += matched;
				i += 1;
			} else if (next === '`') {
				result += position === 0 ? '' : $strSlice(str, 0, position - 1);
				i += 1;
			} else if (next === "'") {
				result += tailPos >= stringLength ? '' : $strSlice(str, tailPos);
				i += 1;
			} else {
				var nextNext = nextIsLast ? null : $charAt(replacement, i + 2);
				if (isDigit(next) && next !== '0' && (nextIsLast || !isDigit(nextNext))) {
					// $1 through $9, and not followed by a digit
					var n = $parseInt(next, 10);
					// if (n > m, impl-defined)
					result += n <= m && Type(captures[n - 1]) === 'Undefined' ? '' : captures[n - 1];
					i += 1;
				} else if (isDigit(next) && (nextIsLast || isDigit(nextNext))) {
					// $00 through $99
					var nn = next + nextNext;
					var nnI = $parseInt(nn, 10) - 1;
					// if nn === '00' or nn > m, impl-defined
					result += nn <= m && Type(captures[nnI]) === 'Undefined' ? '' : captures[nnI];
					i += 2;
				} else {
					result += '$';
				}
			}
		} else {
			// the final $, or else not a $
			result += $charAt(replacement, i);
		}
	}
	return result;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var ToObject = require('./ToObject');

// https://ecma-international.org/ecma-262/6.0/#sec-getv

module.exports = function GetV(V, P) {
	// 7.3.2.1
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
	}

	// 7.3.2.2-3
	var O = ToObject(V);

	// 7.3.2.4
	return O[P];
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var has = require('has');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty

module.exports = function HasOwnProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	return has(O, P);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-hasproperty

module.exports = function HasProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	return P in O;
};
'use strict';

var floor = require('./floor');
var modulo = require('./modulo');

var timeConstants = require('../helpers/timeConstants');
var msPerHour = timeConstants.msPerHour;
var HoursPerDay = timeConstants.HoursPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function HourFromTime(t) {
	return modulo(floor(t / msPerHour), HoursPerDay);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $EvalError = GetIntrinsic('%EvalError%');

var DaysInYear = require('./DaysInYear');
var YearFromTime = require('./YearFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function InLeapYear(t) {
	var days = DaysInYear(YearFromTime(t));
	if (days === 365) {
		return 0;
	}
	if (days === 366) {
		return 1;
	}
	throw new $EvalError('Assertion failed: there are not 365 or 366 days in a year, got: ' + days);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var $hasInstance = GetIntrinsic('Symbol.hasInstance', true);

var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsCallable = require('./IsCallable');
var OrdinaryHasInstance = require('./OrdinaryHasInstance');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-instanceofoperator

module.exports = function InstanceofOperator(O, C) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	var instOfHandler = $hasInstance ? GetMethod(C, $hasInstance) : void 0;
	if (typeof instOfHandler !== 'undefined') {
		return ToBoolean(Call(instOfHandler, C, [O]));
	}
	if (!IsCallable(C)) {
		throw new $TypeError('`C` is not Callable');
	}
	return OrdinaryHasInstance(C, O);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var IsArray = require('./IsArray');
var GetV = require('./GetV');
var IsPropertyKey = require('./IsPropertyKey');

// https://ecma-international.org/ecma-262/6.0/#sec-invoke

module.exports = function Invoke(O, P) {
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	var argumentsList = arguments.length > 2 ? arguments[2] : [];
	if (!IsArray(argumentsList)) {
		throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
	}
	var func = GetV(O, P);
	return Call(func, O, argumentsList);
};
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isaccessordescriptor

module.exports = function IsAccessorDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Get]]') && !has(Desc, '[[Set]]')) {
		return false;
	}

	return true;
};
'use strict';

// https://ecma-international.org/ecma-262/6.0/#sec-isarray
module.exports = require('../helpers/IsArray');
'use strict';

// http://262.ecma-international.org/5.1/#sec-9.11

module.exports = require('is-callable');
'use strict';

var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');

// https://262.ecma-international.org/6.0/#sec-iscompatiblepropertydescriptor

module.exports = function IsCompatiblePropertyDescriptor(Extensible, Desc, Current) {
	return ValidateAndApplyPropertyDescriptor(undefined, undefined, Extensible, Desc, Current);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $isConcatSpreadable = GetIntrinsic('%Symbol.isConcatSpreadable%', true);

var Get = require('./Get');
var IsArray = require('./IsArray');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable

module.exports = function IsConcatSpreadable(O) {
	if (Type(O) !== 'Object') {
		return false;
	}
	if ($isConcatSpreadable) {
		var spreadable = Get(O, $isConcatSpreadable);
		if (typeof spreadable !== 'undefined') {
			return ToBoolean(spreadable);
		}
	}
	return IsArray(O);
};
'use strict';

var GetIntrinsic = require('../GetIntrinsic.js');

var $construct = GetIntrinsic('%Reflect.construct%', true);

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
try {
	DefinePropertyOrThrow({}, '', { '[[Get]]': function () {} });
} catch (e) {
	// Accessor properties aren't supported
	DefinePropertyOrThrow = null;
}

// https://ecma-international.org/ecma-262/6.0/#sec-isconstructor

if (DefinePropertyOrThrow && $construct) {
	var isConstructorMarker = {};
	var badArrayLike = {};
	DefinePropertyOrThrow(badArrayLike, 'length', {
		'[[Get]]': function () {
			throw isConstructorMarker;
		},
		'[[Enumerable]]': true
	});

	module.exports = function IsConstructor(argument) {
		try {
			// `Reflect.construct` invokes `IsConstructor(target)` before `Get(args, 'length')`:
			$construct(argument, badArrayLike);
		} catch (err) {
			return err === isConstructorMarker;
		}
	};
} else {
	module.exports = function IsConstructor(argument) {
		// unfortunately there's no way to truly check this without try/catch `new argument` in old environments
		return typeof argument === 'function' && !!argument.prototype;
	};
}
'use strict';

var has = require('has');

var assertRecord = require('../helpers/assertRecord');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isdatadescriptor

module.exports = function IsDataDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!has(Desc, '[[Value]]') && !has(Desc, '[[Writable]]')) {
		return false;
	}

	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $preventExtensions = GetIntrinsic('%Object.preventExtensions%', true);
var $isExtensible = GetIntrinsic('%Object.isExtensible%', true);

var isPrimitive = require('../helpers/isPrimitive');

// https://ecma-international.org/ecma-262/6.0/#sec-isextensible-o

module.exports = $preventExtensions
	? function IsExtensible(obj) {
		return !isPrimitive(obj) && $isExtensible(obj);
	}
	: function IsExtensible(obj) {
		return !isPrimitive(obj);
	};
'use strict';

var assertRecord = require('../helpers/assertRecord');

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-isgenericdescriptor

module.exports = function IsGenericDescriptor(Desc) {
	if (typeof Desc === 'undefined') {
		return false;
	}

	assertRecord(Type, 'Property Descriptor', 'Desc', Desc);

	if (!IsAccessorDescriptor(Desc) && !IsDataDescriptor(Desc)) {
		return true;
	}

	return false;
};
'use strict';

var abs = require('./abs');
var floor = require('./floor');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');

// https://ecma-international.org/ecma-262/6.0/#sec-isinteger

module.exports = function IsInteger(argument) {
	if (typeof argument !== 'number' || $isNaN(argument) || !$isFinite(argument)) {
		return false;
	}
	var absValue = abs(argument);
	return floor(absValue) === absValue;
};
'use strict';

var callBound = require('call-bind/callBound');

var $PromiseThen = callBound('Promise.prototype.then', true);

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ispromise

module.exports = function IsPromise(x) {
	if (Type(x) !== 'Object') {
		return false;
	}
	if (!$PromiseThen) { // Promises are not supported
		return false;
	}
	try {
		$PromiseThen(x); // throws if not a promise
	} catch (e) {
		return false;
	}
	return true;
};
'use strict';

// TODO, semver-major: delete this

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var Type = require('./Type');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');

// https://262.ecma-international.org/6.0/#sec-property-descriptor-specification-type

module.exports = function IsPropertyDescriptor(Desc) {
	return isPropertyDescriptor({
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor,
		Type: Type
	}, Desc);
};
'use strict';

// https://ecma-international.org/ecma-262/6.0/#sec-ispropertykey

module.exports = function IsPropertyKey(argument) {
	return typeof argument === 'string' || typeof argument === 'symbol';
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $match = GetIntrinsic('%Symbol.match%', true);

var hasRegExpMatcher = require('is-regex');

var ToBoolean = require('./ToBoolean');

// https://ecma-international.org/ecma-262/6.0/#sec-isregexp

module.exports = function IsRegExp(argument) {
	if (!argument || typeof argument !== 'object') {
		return false;
	}
	if ($match) {
		var isRegExp = argument[$match];
		if (typeof isRegExp !== 'undefined') {
			return ToBoolean(isRegExp);
		}
	}
	return hasRegExpMatcher(argument);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Call = require('./Call');
var GetMethod = require('./GetMethod');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose

module.exports = function IteratorClose(iterator, completion) {
	if (Type(iterator) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterator) is not Object');
	}
	if (!IsCallable(completion)) {
		throw new $TypeError('Assertion failed: completion is not a thunk for a Completion Record');
	}
	var completionThunk = completion;

	var iteratorReturn = GetMethod(iterator, 'return');

	if (typeof iteratorReturn === 'undefined') {
		return completionThunk();
	}

	var completionRecord;
	try {
		var innerResult = Call(iteratorReturn, iterator, []);
	} catch (e) {
		// if we hit here, then "e" is the innerResult completion that needs re-throwing

		// if the completion is of type "throw", this will throw.
		completionThunk();
		completionThunk = null; // ensure it's not called twice.

		// if not, then return the innerResult completion
		throw e;
	}
	completionRecord = completionThunk(); // if innerResult worked, then throw if the completion does
	completionThunk = null; // ensure it's not called twice.

	if (Type(innerResult) !== 'Object') {
		throw new $TypeError('iterator .return must return an object');
	}

	return completionRecord;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var ToBoolean = require('./ToBoolean');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete

module.exports = function IteratorComplete(iterResult) {
	if (Type(iterResult) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
	}
	return ToBoolean(Get(iterResult, 'done'));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Invoke = require('./Invoke');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratornext

module.exports = function IteratorNext(iterator, value) {
	var result = Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);
	if (Type(result) !== 'Object') {
		throw new $TypeError('iterator next must return an object');
	}
	return result;
};
'use strict';

var IteratorComplete = require('./IteratorComplete');
var IteratorNext = require('./IteratorNext');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep

module.exports = function IteratorStep(iterator) {
	var result = IteratorNext(iterator);
	var done = IteratorComplete(result);
	return done === true ? false : result;
};

'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue

module.exports = function IteratorValue(iterResult) {
	if (Type(iterResult) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
	}
	return Get(iterResult, 'value');
};

'use strict';

var $isFinite = require('../helpers/isFinite');
var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.13

module.exports = function MakeDate(day, time) {
	if (!$isFinite(day) || !$isFinite(time)) {
		return NaN;
	}
	return (day * msPerDay) + time;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $DateUTC = GetIntrinsic('%Date.UTC%');

var $isFinite = require('../helpers/isFinite');

var DateFromTime = require('./DateFromTime');
var Day = require('./Day');
var floor = require('./floor');
var modulo = require('./modulo');
var MonthFromTime = require('./MonthFromTime');
var ToInteger = require('./ToInteger');
var YearFromTime = require('./YearFromTime');

// https://262.ecma-international.org/5.1/#sec-15.9.1.12

module.exports = function MakeDay(year, month, date) {
	if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) {
		return NaN;
	}
	var y = ToInteger(year);
	var m = ToInteger(month);
	var dt = ToInteger(date);
	var ym = y + floor(m / 12);
	var mn = modulo(m, 12);
	var t = $DateUTC(ym, mn, 1);
	if (YearFromTime(t) !== ym || MonthFromTime(t) !== mn || DateFromTime(t) !== 1) {
		return NaN;
	}
	return Day(t) + dt - 1;
};
'use strict';

var $isFinite = require('../helpers/isFinite');
var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var msPerMinute = timeConstants.msPerMinute;
var msPerHour = timeConstants.msPerHour;

var ToInteger = require('./ToInteger');

// https://262.ecma-international.org/5.1/#sec-15.9.1.11

module.exports = function MakeTime(hour, min, sec, ms) {
	if (!$isFinite(hour) || !$isFinite(min) || !$isFinite(sec) || !$isFinite(ms)) {
		return NaN;
	}
	var h = ToInteger(hour);
	var m = ToInteger(min);
	var s = ToInteger(sec);
	var milli = ToInteger(ms);
	var t = (h * msPerHour) + (m * msPerMinute) + (s * msPerSecond) + milli;
	return t;
};
'use strict';

var floor = require('./floor');
var modulo = require('./modulo');

var timeConstants = require('../helpers/timeConstants');
var msPerMinute = timeConstants.msPerMinute;
var MinutesPerHour = timeConstants.MinutesPerHour;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function MinFromTime(t) {
	return modulo(floor(t / msPerMinute), MinutesPerHour);
};
'use strict';

var DayWithinYear = require('./DayWithinYear');
var InLeapYear = require('./InLeapYear');

// https://262.ecma-international.org/5.1/#sec-15.9.1.4

module.exports = function MonthFromTime(t) {
	var day = DayWithinYear(t);
	if (0 <= day && day < 31) {
		return 0;
	}
	var leap = InLeapYear(t);
	if (31 <= day && day < (59 + leap)) {
		return 1;
	}
	if ((59 + leap) <= day && day < (90 + leap)) {
		return 2;
	}
	if ((90 + leap) <= day && day < (120 + leap)) {
		return 3;
	}
	if ((120 + leap) <= day && day < (151 + leap)) {
		return 4;
	}
	if ((151 + leap) <= day && day < (181 + leap)) {
		return 5;
	}
	if ((181 + leap) <= day && day < (212 + leap)) {
		return 6;
	}
	if ((212 + leap) <= day && day < (243 + leap)) {
		return 7;
	}
	if ((243 + leap) <= day && day < (273 + leap)) {
		return 8;
	}
	if ((273 + leap) <= day && day < (304 + leap)) {
		return 9;
	}
	if ((304 + leap) <= day && day < (334 + leap)) {
		return 10;
	}
	if ((334 + leap) <= day && day < (365 + leap)) {
		return 11;
	}
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $ObjectCreate = GetIntrinsic('%Object.create%', true);
var $TypeError = GetIntrinsic('%TypeError%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');

var Type = require('./Type');

var hasProto = !({ __proto__: null } instanceof Object);

// https://ecma-international.org/ecma-262/6.0/#sec-objectcreate

module.exports = function ObjectCreate(proto, internalSlotsList) {
	if (proto !== null && Type(proto) !== 'Object') {
		throw new $TypeError('Assertion failed: `proto` must be null or an object');
	}
	var slots = arguments.length < 2 ? [] : internalSlotsList;
	if (slots.length > 0) {
		throw new $SyntaxError('es-abstract does not yet support internal slots');
	}

	if ($ObjectCreate) {
		return $ObjectCreate(proto);
	}
	if (hasProto) {
		return { __proto__: proto };
	}

	if (proto === null) {
		throw new $SyntaxError('native Object.create support is required to create null objects');
	}
	var T = function T() {};
	T.prototype = proto;
	return new T();
};
'use strict';

var callBound = require('call-bind/callBound');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var Get = require('./Get');
var ToObject = require('./ToObject');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');

var forEach = require('../helpers/forEach');
var getOwnPropertyDescriptor = require('../helpers/getOwnPropertyDescriptor');
var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');

var $push = callBound('Array.prototype.push');

// https://262.ecma-international.org/6.0/#sec-objectdefineproperties
module.exports = function ObjectDefineProperties(O, Properties) {
	var props = ToObject(Properties); // step 1
	var keys = OwnPropertyKeys(props); // step 2
	var descriptors = []; // step 3

	forEach(keys, function (nextKey) { // step 4
		var propDesc = ToPropertyDescriptor(getOwnPropertyDescriptor(props, nextKey)); // step 4.a
		if (typeof propDesc !== 'undefined' && propDesc['[[Enumerable]]']) { // step 4.b
			var descObj = Get(props, nextKey); // step 4.b.i
			var desc = ToPropertyDescriptor(descObj); // step 4.b.ii
			$push(descriptors, [nextKey, desc]); // step 4.b.iii
		}
	});

	forEach(descriptors, function (pair) { // step 5
		var P = pair[0]; // step 5.a
		var desc = pair[1]; // step 5.b
		desc = FromPropertyDescriptor(desc); // TODO: remove this once DefinePropertyOrThrow is fixed
		DefinePropertyOrThrow(O, P, desc); // step 5.c
	});

	return O; // step 6
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var $TypeError = GetIntrinsic('%TypeError%');

var GetPrototypeFromConstructor = require('./GetPrototypeFromConstructor');
var IsArray = require('./IsArray');
var ObjectCreate = require('./ObjectCreate');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinarycreatefromconstructor

module.exports = function OrdinaryCreateFromConstructor(constructor, intrinsicDefaultProto) {
	GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
	var proto = GetPrototypeFromConstructor(constructor, intrinsicDefaultProto);
	var slots = arguments.length < 3 ? [] : arguments[2];
	if (!IsArray(slots)) {
		throw new $TypeError('Assertion failed: if provided, `internalSlotsList` must be a List');
	}
	return ObjectCreate(proto, slots);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');

var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var IsPropertyKey = require('./IsPropertyKey');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var SameValue = require('./SameValue');
var Type = require('./Type');
var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinarydefineownproperty

module.exports = function OrdinaryDefineOwnProperty(O, P, Desc) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (!$gOPD) {
		// ES3/IE 8 fallback
		if (IsAccessorDescriptor(Desc)) {
			throw new $SyntaxError('This environment does not support accessor property descriptors.');
		}
		var creatingNormalDataProperty = !(P in O)
			&& Desc['[[Writable]]']
			&& Desc['[[Enumerable]]']
			&& Desc['[[Configurable]]']
			&& '[[Value]]' in Desc;
		var settingExistingDataProperty = (P in O)
			&& (!('[[Configurable]]' in Desc) || Desc['[[Configurable]]'])
			&& (!('[[Enumerable]]' in Desc) || Desc['[[Enumerable]]'])
			&& (!('[[Writable]]' in Desc) || Desc['[[Writable]]'])
			&& '[[Value]]' in Desc;
		if (creatingNormalDataProperty || settingExistingDataProperty) {
			O[P] = Desc['[[Value]]']; // eslint-disable-line no-param-reassign
			return SameValue(O[P], Desc['[[Value]]']);
		}
		throw new $SyntaxError('This environment does not support defining non-writable, non-enumerable, or non-configurable properties');
	}
	var desc = $gOPD(O, P);
	var current = desc && ToPropertyDescriptor(desc);
	var extensible = IsExtensible(O);
	return ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable');

var has = require('has');

var IsArray = require('./IsArray');
var IsPropertyKey = require('./IsPropertyKey');
var IsRegExp = require('./IsRegExp');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty

module.exports = function OrdinaryGetOwnProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: O must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	if (!has(O, P)) {
		return void 0;
	}
	if (!$gOPD) {
		// ES3 / IE 8 fallback
		var arrayLength = IsArray(O) && P === 'length';
		var regexLastIndex = IsRegExp(O) && P === 'lastIndex';
		return {
			'[[Configurable]]': !(arrayLength || regexLastIndex),
			'[[Enumerable]]': $isEnumerable(O, P),
			'[[Value]]': O[P],
			'[[Writable]]': true
		};
	}
	return ToPropertyDescriptor($gOPD(O, P));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasinstance

module.exports = function OrdinaryHasInstance(C, O) {
	if (IsCallable(C) === false) {
		return false;
	}
	if (Type(O) !== 'Object') {
		return false;
	}
	var P = Get(C, 'prototype');
	if (Type(P) !== 'Object') {
		throw new $TypeError('OrdinaryHasInstance called on an object with an invalid prototype property.');
	}
	return O instanceof C;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasproperty

module.exports = function OrdinaryHasProperty(O, P) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: P must be a Property Key');
	}
	return P in O;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');
var forEach = require('../helpers/forEach');

var $charCodeAt = callBound('String.prototype.charCodeAt');
var $numberToString = callBound('Number.prototype.toString');
var $toLowerCase = callBound('String.prototype.toLowerCase');
var $strSlice = callBound('String.prototype.slice');
var $strSplit = callBound('String.prototype.split');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-quotejsonstring

var escapes = {
	'\u0008': 'b',
	'\u000C': 'f',
	'\u000A': 'n',
	'\u000D': 'r',
	'\u0009': 't'
};

module.exports = function QuoteJSONString(value) {
	if (Type(value) !== 'String') {
		throw new $TypeError('Assertion failed: `value` must be a String');
	}
	var product = '"';
	if (value) {
		forEach($strSplit(value), function (C) {
			if (C === '"' || C === '\\') {
				product += '\u005C' + C;
			} else if (C === '\u0008' || C === '\u000C' || C === '\u000A' || C === '\u000D' || C === '\u0009') {
				var abbrev = escapes[C];
				product += '\u005C' + abbrev;
			} else {
				var cCharCode = $charCodeAt(C, 0);
				if (cCharCode < 0x20) {
					product += '\u005Cu' + $toLowerCase($strSlice('0000' + $numberToString(cCharCode, 16), -4));
				} else {
					product += C;
				}
			}
		});
	}
	product += '"';
	return product;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $RegExp = GetIntrinsic('%RegExp%');

// var RegExpAlloc = require('./RegExpAlloc');
// var RegExpInitialize = require('./RegExpInitialize');
var ToString = require('./ToString');

// https://262.ecma-international.org/6.0/#sec-regexpcreate

module.exports = function RegExpCreate(P, F) {
	// var obj = RegExpAlloc($RegExp);
	// return RegExpInitialize(obj, P, F);

	// covers spec mechanics; bypass regex brand checking
	var pattern = typeof P === 'undefined' ? '' : ToString(P);
	var flags = typeof F === 'undefined' ? '' : ToString(F);
	return new $RegExp(pattern, flags);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var regexExec = require('call-bind/callBound')('RegExp.prototype.exec');

var Call = require('./Call');
var Get = require('./Get');
var IsCallable = require('./IsCallable');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-regexpexec

module.exports = function RegExpExec(R, S) {
	if (Type(R) !== 'Object') {
		throw new $TypeError('Assertion failed: `R` must be an Object');
	}
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	var exec = Get(R, 'exec');
	if (IsCallable(exec)) {
		var result = Call(exec, R, [S]);
		if (result === null || Type(result) === 'Object') {
			return result;
		}
		throw new $TypeError('"exec" method must return `null` or an Object');
	}
	return regexExec(R, S);
};
'use strict';

module.exports = require('../5/CheckObjectCoercible');
'use strict';

var $isNaN = require('../helpers/isNaN');

// http://262.ecma-international.org/5.1/#sec-9.12

module.exports = function SameValue(x, y) {
	if (x === y) { // 0 === -0, but they are not identical.
		if (x === 0) { return 1 / x === 1 / y; }
		return true;
	}
	return $isNaN(x) && $isNaN(y);
};
'use strict';

var $isNaN = require('../helpers/isNaN');

// https://ecma-international.org/ecma-262/6.0/#sec-samevaluezero

module.exports = function SameValueZero(x, y) {
	return (x === y) || ($isNaN(x) && $isNaN(y));
};
'use strict';

var floor = require('./floor');
var modulo = require('./modulo');

var timeConstants = require('../helpers/timeConstants');
var msPerSecond = timeConstants.msPerSecond;
var SecondsPerMinute = timeConstants.SecondsPerMinute;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function SecFromTime(t) {
	return modulo(floor(t / msPerSecond), SecondsPerMinute);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// IE 9 does not throw in strict mode when writability/configurability/extensibility is violated
var noThrowOnStrictViolation = (function () {
	try {
		delete [].length;
		return true;
	} catch (e) {
		return false;
	}
}());

// https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw

module.exports = function Set(O, P, V, Throw) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: `O` must be an Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}
	if (Type(Throw) !== 'Boolean') {
		throw new $TypeError('Assertion failed: `Throw` must be a Boolean');
	}
	if (Throw) {
		O[P] = V; // eslint-disable-line no-param-reassign
		if (noThrowOnStrictViolation && !SameValue(O[P], V)) {
			throw new $TypeError('Attempted to assign to readonly property.');
		}
		return true;
	}
	try {
		O[P] = V; // eslint-disable-line no-param-reassign
		return noThrowOnStrictViolation ? SameValue(O[P], V) : true;
	} catch (e) {
		return false;
	}

};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var has = require('has');

var $TypeError = GetIntrinsic('%TypeError%');

var getSymbolDescription = require('get-symbol-description');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var IsExtensible = require('./IsExtensible');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-setfunctionname

module.exports = function SetFunctionName(F, name) {
	if (typeof F !== 'function') {
		throw new $TypeError('Assertion failed: `F` must be a function');
	}
	if (!IsExtensible(F) || has(F, 'name')) {
		throw new $TypeError('Assertion failed: `F` must be extensible, and must not have a `name` own property');
	}
	var nameType = Type(name);
	if (nameType !== 'Symbol' && nameType !== 'String') {
		throw new $TypeError('Assertion failed: `name` must be a Symbol or a String');
	}
	if (nameType === 'Symbol') {
		var description = getSymbolDescription(name);
		// eslint-disable-next-line no-param-reassign
		name = typeof description === 'undefined' ? '' : '[' + description + ']';
	}
	if (arguments.length > 2) {
		var prefix = arguments[2];
		// eslint-disable-next-line no-param-reassign
		name = prefix + ' ' + name;
	}
	return DefinePropertyOrThrow(F, 'name', {
		'[[Value]]': name,
		'[[Writable]]': false,
		'[[Enumerable]]': false,
		'[[Configurable]]': true
	});
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');
var $preventExtensions = GetIntrinsic('%Object.preventExtensions%', true);
var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%', true);

var forEach = require('../helpers/forEach');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-setintegritylevel

module.exports = function SetIntegrityLevel(O, level) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (level !== 'sealed' && level !== 'frozen') {
		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
	}
	if (!$preventExtensions) {
		throw new $SyntaxError('SetIntegrityLevel requires native `Object.preventExtensions` support');
	}
	var status = $preventExtensions(O);
	if (!status) {
		return false;
	}
	if (!$gOPN) {
		throw new $SyntaxError('SetIntegrityLevel requires native `Object.getOwnPropertyNames` support');
	}
	var theKeys = $gOPN(O);
	if (level === 'sealed') {
		forEach(theKeys, function (k) {
			DefinePropertyOrThrow(O, k, { configurable: false });
		});
	} else if (level === 'frozen') {
		forEach(theKeys, function (k) {
			var currentDesc = $gOPD(O, k);
			if (typeof currentDesc !== 'undefined') {
				var desc;
				if (IsAccessorDescriptor(ToPropertyDescriptor(currentDesc))) {
					desc = { configurable: false };
				} else {
					desc = { configurable: false, writable: false };
				}
				DefinePropertyOrThrow(O, k, desc);
			}
		});
	}
	return true;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $species = GetIntrinsic('%Symbol.species%', true);
var $TypeError = GetIntrinsic('%TypeError%');

var IsConstructor = require('./IsConstructor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor

module.exports = function SpeciesConstructor(O, defaultConstructor) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	var C = O.constructor;
	if (typeof C === 'undefined') {
		return defaultConstructor;
	}
	if (Type(C) !== 'Object') {
		throw new $TypeError('O.constructor is not an Object');
	}
	var S = $species ? C[$species] : void 0;
	if (S == null) {
		return defaultConstructor;
	}
	if (IsConstructor(S)) {
		return S;
	}
	throw new $TypeError('no constructor found');
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');

var IsInteger = require('./IsInteger');
var Type = require('./Type');

var $charAt = callBound('String.prototype.charAt');

// https://262.ecma-international.org/6.0/#sec-splitmatch

module.exports = function SplitMatch(S, q, R) {
	if (Type(S) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}
	if (!IsInteger(q)) {
		throw new $TypeError('Assertion failed: `q` must be an integer');
	}
	if (Type(R) !== 'String') {
		throw new $TypeError('Assertion failed: `R` must be a String');
	}
	var r = R.length;
	var s = S.length;
	if (q + r > s) {
		return false;
	}

	for (var i = 0; i < r; i += 1) {
		if ($charAt(S, q + i) !== $charAt(R, i)) {
			return false;
		}
	}

	return q + r;
};
'use strict';

var Type = require('./Type');

// https://262.ecma-international.org/5.1/#sec-11.9.6

module.exports = function StrictEqualityComparison(x, y) {
	var xType = Type(x);
	var yType = Type(y);
	if (xType !== yType) {
		return false;
	}
	if (xType === 'Undefined' || xType === 'Null') {
		return true;
	}
	return x === y; // shortcut for steps 4-7
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Object = GetIntrinsic('%Object%');
var $StringPrototype = GetIntrinsic('%String.prototype%');
var $SyntaxError = GetIntrinsic('%SyntaxError%');
var $TypeError = GetIntrinsic('%TypeError%');

var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
var Type = require('./Type');

var setProto = require('../helpers/setProto');

// https://262.ecma-international.org/6.0/#sec-stringcreate

module.exports = function StringCreate(value, prototype) {
	if (Type(value) !== 'String') {
		throw new $TypeError('Assertion failed: `S` must be a String');
	}

	var S = $Object(value);
	if (prototype !== $StringPrototype) {
		if (setProto) {
			setProto(S, prototype);
		} else {
			throw new $SyntaxError('StringCreate: a `proto` argument that is not `String.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
		}
	}

	var length = value.length;
	DefinePropertyOrThrow(S, 'length', {
		'[[Configurable]]': false,
		'[[Enumerable]]': false,
		'[[Value]]': length,
		'[[Writable]]': false
	});

	return S;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');

var $TypeError = GetIntrinsic('%TypeError%');

var $charAt = callBound('String.prototype.charAt');

var isString = require('is-string');
var isNegativeZero = require('is-negative-zero');
var unbox = require('unbox-primitive');

var CanonicalNumericIndexString = require('./CanonicalNumericIndexString');
var IsInteger = require('./IsInteger');
var IsPropertyKey = require('./IsPropertyKey');
var Type = require('./Type');

// https://262.ecma-international.org/6.0/#sec-stringgetindexproperty

module.exports = function StringGetIndexProperty(S, P) {
	if (typeof S === 'string' || !isString(S)) {
		throw new $TypeError('Assertion failed: `S` must be a boxed String Object');
	}
	if (!IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: `P` must be a Property Key');
	}

	if (Type(P) !== 'String') {
		return void undefined;
	}

	var index = CanonicalNumericIndexString(P);
	if (typeof index === 'undefined' || !IsInteger(index) || isNegativeZero(index)) {
		return void undefined;
	}

	var str = unbox(S);
	var len = str.length;
	if (index < 0 || len <= index) {
		return void undefined;
	}

	var resultStr = $charAt(str, index);

	return {
		'[[Configurable]]': false,
		'[[Enumerable]]': true,
		'[[Value]]': resultStr,
		'[[Writable]]': false
	};
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var callBound = require('call-bind/callBound');

var $SymbolToString = callBound('Symbol.prototype.toString', true);

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-symboldescriptivestring

module.exports = function SymbolDescriptiveString(sym) {
	if (Type(sym) !== 'Symbol') {
		throw new $TypeError('Assertion failed: `sym` must be a Symbol');
	}
	return $SymbolToString(sym);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $gOPD = require('../helpers/getOwnPropertyDescriptor');
var $TypeError = GetIntrinsic('%TypeError%');

var every = require('../helpers/every');
var OwnPropertyKeys = require('../helpers/OwnPropertyKeys');

var IsDataDescriptor = require('./IsDataDescriptor');
var IsExtensible = require('./IsExtensible');
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-testintegritylevel

module.exports = function TestIntegrityLevel(O, level) {
	if (Type(O) !== 'Object') {
		throw new $TypeError('Assertion failed: Type(O) is not Object');
	}
	if (level !== 'sealed' && level !== 'frozen') {
		throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`');
	}
	var status = IsExtensible(O);
	if (status) {
		return false;
	}
	var theKeys = OwnPropertyKeys(O);
	return theKeys.length === 0 || every(theKeys, function (k) {
		var currentDesc = $gOPD(O, k);
		if (typeof currentDesc !== 'undefined') {
			if (currentDesc.configurable) {
				return false;
			}
			if (level === 'frozen' && IsDataDescriptor(ToPropertyDescriptor(currentDesc)) && currentDesc.writable) {
				return false;
			}
		}
		return true;
	});
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Date = GetIntrinsic('%Date%');
var $Number = GetIntrinsic('%Number%');

var $isFinite = require('../helpers/isFinite');

var abs = require('./abs');
var ToNumber = require('./ToNumber');

// https://262.ecma-international.org/5.1/#sec-15.9.1.14

module.exports = function TimeClip(time) {
	if (!$isFinite(time) || abs(time) > 8.64e15) {
		return NaN;
	}
	return $Number(new $Date(ToNumber(time)));
};

'use strict';

var msPerDay = require('../helpers/timeConstants').msPerDay;

var DayFromYear = require('./DayFromYear');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function TimeFromYear(y) {
	return msPerDay * DayFromYear(y);
};
'use strict';

var modulo = require('./modulo');

var msPerDay = require('../helpers/timeConstants').msPerDay;

// https://262.ecma-international.org/5.1/#sec-15.9.1.2

module.exports = function TimeWithinDay(t) {
	return modulo(t, msPerDay);
};

'use strict';

// http://262.ecma-international.org/5.1/#sec-9.2

module.exports = function ToBoolean(value) { return !!value; };
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $Date = GetIntrinsic('%Date%');

var $isNaN = require('../helpers/isNaN');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-todatestring

module.exports = function ToDateString(tv) {
	if (Type(tv) !== 'Number') {
		throw new $TypeError('Assertion failed: `tv` must be a Number');
	}
	if ($isNaN(tv)) {
		return 'Invalid Date';
	}
	return $Date(tv);
};
'use strict';

var ToUint16 = require('./ToUint16');

// https://ecma-international.org/ecma-262/6.0/#sec-toint16

module.exports = function ToInt16(argument) {
	var int16bit = ToUint16(argument);
	return int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;
};
'use strict';

var ToNumber = require('./ToNumber');

// http://262.ecma-international.org/5.1/#sec-9.5

module.exports = function ToInt32(x) {
	return ToNumber(x) >> 0;
};
'use strict';

var ToUint8 = require('./ToUint8');

// https://ecma-international.org/ecma-262/6.0/#sec-toint8

module.exports = function ToInt8(argument) {
	var int8bit = ToUint8(argument);
	return int8bit >= 0x80 ? int8bit - 0x100 : int8bit;
};
'use strict';

var ES5ToInteger = require('../5/ToInteger');

var ToNumber = require('./ToNumber');

// https://ecma-international.org/ecma-262/6.0/#sec-tointeger

module.exports = function ToInteger(value) {
	var number = ToNumber(value);
	return ES5ToInteger(number);
};
'use strict';

var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger');

var ToInteger = require('./ToInteger');

module.exports = function ToLength(argument) {
	var len = ToInteger(argument);
	if (len <= 0) { return 0; } // includes converting -0 to +0
	if (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }
	return len;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');
var $Number = GetIntrinsic('%Number%');
var $RegExp = GetIntrinsic('%RegExp%');
var $parseInteger = GetIntrinsic('%parseInt%');

var callBound = require('call-bind/callBound');
var regexTester = require('../helpers/regexTester');
var isPrimitive = require('../helpers/isPrimitive');

var $strSlice = callBound('String.prototype.slice');
var isBinary = regexTester(/^0b[01]+$/i);
var isOctal = regexTester(/^0o[0-7]+$/i);
var isInvalidHexLiteral = regexTester(/^[-+]0x[0-9a-f]+$/i);
var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
var hasNonWS = regexTester(nonWSregex);

// whitespace from: https://es5.github.io/#x15.5.4.20
// implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
var ws = [
	'\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
	'\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
	'\u2029\uFEFF'
].join('');
var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
var $replace = callBound('String.prototype.replace');
var $trim = function (value) {
	return $replace(value, trimRegex, '');
};

var ToPrimitive = require('./ToPrimitive');

// https://ecma-international.org/ecma-262/6.0/#sec-tonumber

module.exports = function ToNumber(argument) {
	var value = isPrimitive(argument) ? argument : ToPrimitive(argument, $Number);
	if (typeof value === 'symbol') {
		throw new $TypeError('Cannot convert a Symbol value to a number');
	}
	if (typeof value === 'string') {
		if (isBinary(value)) {
			return ToNumber($parseInteger($strSlice(value, 2), 2));
		} else if (isOctal(value)) {
			return ToNumber($parseInteger($strSlice(value, 2), 8));
		} else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
			return NaN;
		}
		var trimmed = $trim(value);
		if (trimmed !== value) {
			return ToNumber(trimmed);
		}

	}
	return $Number(value);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Object = GetIntrinsic('%Object%');

var RequireObjectCoercible = require('./RequireObjectCoercible');

// https://ecma-international.org/ecma-262/6.0/#sec-toobject

module.exports = function ToObject(value) {
	RequireObjectCoercible(value);
	return $Object(value);
};
'use strict';

var toPrimitive = require('es-to-primitive/es2015');

// https://ecma-international.org/ecma-262/6.0/#sec-toprimitive

module.exports = function ToPrimitive(input) {
	if (arguments.length > 1) {
		return toPrimitive(input, arguments[1]);
	}
	return toPrimitive(input);
};
'use strict';

var has = require('has');

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var Type = require('./Type');
var ToBoolean = require('./ToBoolean');
var IsCallable = require('./IsCallable');

// https://262.ecma-international.org/5.1/#sec-8.10.5

module.exports = function ToPropertyDescriptor(Obj) {
	if (Type(Obj) !== 'Object') {
		throw new $TypeError('ToPropertyDescriptor requires an object');
	}

	var desc = {};
	if (has(Obj, 'enumerable')) {
		desc['[[Enumerable]]'] = ToBoolean(Obj.enumerable);
	}
	if (has(Obj, 'configurable')) {
		desc['[[Configurable]]'] = ToBoolean(Obj.configurable);
	}
	if (has(Obj, 'value')) {
		desc['[[Value]]'] = Obj.value;
	}
	if (has(Obj, 'writable')) {
		desc['[[Writable]]'] = ToBoolean(Obj.writable);
	}
	if (has(Obj, 'get')) {
		var getter = Obj.get;
		if (typeof getter !== 'undefined' && !IsCallable(getter)) {
			throw new $TypeError('getter must be a function');
		}
		desc['[[Get]]'] = getter;
	}
	if (has(Obj, 'set')) {
		var setter = Obj.set;
		if (typeof setter !== 'undefined' && !IsCallable(setter)) {
			throw new $TypeError('setter must be a function');
		}
		desc['[[Set]]'] = setter;
	}

	if ((has(desc, '[[Get]]') || has(desc, '[[Set]]')) && (has(desc, '[[Value]]') || has(desc, '[[Writable]]'))) {
		throw new $TypeError('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
	}
	return desc;
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $String = GetIntrinsic('%String%');

var ToPrimitive = require('./ToPrimitive');
var ToString = require('./ToString');

// https://ecma-international.org/ecma-262/6.0/#sec-topropertykey

module.exports = function ToPropertyKey(argument) {
	var key = ToPrimitive(argument, $String);
	return typeof key === 'symbol' ? key : ToString(key);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $String = GetIntrinsic('%String%');
var $TypeError = GetIntrinsic('%TypeError%');

// https://ecma-international.org/ecma-262/6.0/#sec-tostring

module.exports = function ToString(argument) {
	if (typeof argument === 'symbol') {
		throw new $TypeError('Cannot convert a Symbol value to a string');
	}
	return $String(argument);
};
'use strict';

var abs = require('./abs');
var floor = require('./floor');
var modulo = require('./modulo');
var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');

// http://262.ecma-international.org/5.1/#sec-9.7

module.exports = function ToUint16(value) {
	var number = ToNumber(value);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * floor(abs(number));
	return modulo(posInt, 0x10000);
};
'use strict';

var ToNumber = require('./ToNumber');

// http://262.ecma-international.org/5.1/#sec-9.6

module.exports = function ToUint32(x) {
	return ToNumber(x) >>> 0;
};
'use strict';

var ToNumber = require('./ToNumber');

var $isNaN = require('../helpers/isNaN');
var $isFinite = require('../helpers/isFinite');
var $sign = require('../helpers/sign');

var abs = require('./abs');
var floor = require('./floor');
var modulo = require('./modulo');

// https://ecma-international.org/ecma-262/6.0/#sec-touint8

module.exports = function ToUint8(argument) {
	var number = ToNumber(argument);
	if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
	var posInt = $sign(number) * floor(abs(number));
	return modulo(posInt, 0x100);
};
'use strict';

var ToNumber = require('./ToNumber');
var floor = require('./floor');

var $isNaN = require('../helpers/isNaN');

// https://ecma-international.org/ecma-262/6.0/#sec-touint8clamp

module.exports = function ToUint8Clamp(argument) {
	var number = ToNumber(argument);
	if ($isNaN(number) || number <= 0) { return 0; }
	if (number >= 0xFF) { return 0xFF; }
	var f = floor(argument);
	if (f + 0.5 < number) { return f + 1; }
	if (number < f + 0.5) { return f; }
	if (f % 2 !== 0) { return f + 1; }
	return f;
};
'use strict';

var ES5Type = require('../5/Type');

// https://ecma-international.org/ecma-262/6.0/#sec-ecmascript-data-types-and-values

module.exports = function Type(x) {
	if (typeof x === 'symbol') {
		return 'Symbol';
	}
	return ES5Type(x);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $TypeError = GetIntrinsic('%TypeError%');

var DefineOwnProperty = require('../helpers/DefineOwnProperty');
var isPropertyDescriptor = require('../helpers/isPropertyDescriptor');
var isSamePropertyDescriptor = require('../helpers/isSamePropertyDescriptor');

var FromPropertyDescriptor = require('./FromPropertyDescriptor');
var IsAccessorDescriptor = require('./IsAccessorDescriptor');
var IsDataDescriptor = require('./IsDataDescriptor');
var IsGenericDescriptor = require('./IsGenericDescriptor');
var IsPropertyKey = require('./IsPropertyKey');
var SameValue = require('./SameValue');
var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-validateandapplypropertydescriptor
// https://ecma-international.org/ecma-262/8.0/#sec-validateandapplypropertydescriptor

// eslint-disable-next-line max-lines-per-function, max-statements, max-params
module.exports = function ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current) {
	// this uses the ES2017+ logic, since it fixes a number of bugs in the ES2015 logic.
	var oType = Type(O);
	if (oType !== 'Undefined' && oType !== 'Object') {
		throw new $TypeError('Assertion failed: O must be undefined or an Object');
	}
	if (Type(extensible) !== 'Boolean') {
		throw new $TypeError('Assertion failed: extensible must be a Boolean');
	}
	if (!isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, Desc)) {
		throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
	}
	if (Type(current) !== 'Undefined' && !isPropertyDescriptor({
		Type: Type,
		IsDataDescriptor: IsDataDescriptor,
		IsAccessorDescriptor: IsAccessorDescriptor
	}, current)) {
		throw new $TypeError('Assertion failed: current must be a Property Descriptor, or undefined');
	}
	if (oType !== 'Undefined' && !IsPropertyKey(P)) {
		throw new $TypeError('Assertion failed: if O is not undefined, P must be a Property Key');
	}
	if (Type(current) === 'Undefined') {
		if (!extensible) {
			return false;
		}
		if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
			if (oType !== 'Undefined') {
				DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					{
						'[[Configurable]]': Desc['[[Configurable]]'],
						'[[Enumerable]]': Desc['[[Enumerable]]'],
						'[[Value]]': Desc['[[Value]]'],
						'[[Writable]]': Desc['[[Writable]]']
					}
				);
			}
		} else {
			if (!IsAccessorDescriptor(Desc)) {
				throw new $TypeError('Assertion failed: Desc is not an accessor descriptor');
			}
			if (oType !== 'Undefined') {
				return DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					Desc
				);
			}
		}
		return true;
	}
	if (IsGenericDescriptor(Desc) && !('[[Configurable]]' in Desc) && !('[[Enumerable]]' in Desc)) {
		return true;
	}
	if (isSamePropertyDescriptor({ SameValue: SameValue }, Desc, current)) {
		return true; // removed by ES2017, but should still be correct
	}
	// "if every field in Desc is absent, return true" can't really match the assertion that it's a Property Descriptor
	if (!current['[[Configurable]]']) {
		if (Desc['[[Configurable]]']) {
			return false;
		}
		if ('[[Enumerable]]' in Desc && !Desc['[[Enumerable]]'] === !!current['[[Enumerable]]']) {
			return false;
		}
	}
	if (IsGenericDescriptor(Desc)) {
		// no further validation is required.
	} else if (IsDataDescriptor(current) !== IsDataDescriptor(Desc)) {
		if (!current['[[Configurable]]']) {
			return false;
		}
		if (IsDataDescriptor(current)) {
			if (oType !== 'Undefined') {
				DefineOwnProperty(
					IsDataDescriptor,
					SameValue,
					FromPropertyDescriptor,
					O,
					P,
					{
						'[[Configurable]]': current['[[Configurable]]'],
						'[[Enumerable]]': current['[[Enumerable]]'],
						'[[Get]]': undefined
					}
				);
			}
		} else if (oType !== 'Undefined') {
			DefineOwnProperty(
				IsDataDescriptor,
				SameValue,
				FromPropertyDescriptor,
				O,
				P,
				{
					'[[Configurable]]': current['[[Configurable]]'],
					'[[Enumerable]]': current['[[Enumerable]]'],
					'[[Value]]': undefined
				}
			);
		}
	} else if (IsDataDescriptor(current) && IsDataDescriptor(Desc)) {
		if (!current['[[Configurable]]'] && !current['[[Writable]]']) {
			if ('[[Writable]]' in Desc && Desc['[[Writable]]']) {
				return false;
			}
			if ('[[Value]]' in Desc && !SameValue(Desc['[[Value]]'], current['[[Value]]'])) {
				return false;
			}
			return true;
		}
	} else if (IsAccessorDescriptor(current) && IsAccessorDescriptor(Desc)) {
		if (!current['[[Configurable]]']) {
			if ('[[Set]]' in Desc && !SameValue(Desc['[[Set]]'], current['[[Set]]'])) {
				return false;
			}
			if ('[[Get]]' in Desc && !SameValue(Desc['[[Get]]'], current['[[Get]]'])) {
				return false;
			}
			return true;
		}
	} else {
		throw new $TypeError('Assertion failed: current and Desc are not both data, both accessors, or one accessor and one data.');
	}
	if (oType !== 'Undefined') {
		return DefineOwnProperty(
			IsDataDescriptor,
			SameValue,
			FromPropertyDescriptor,
			O,
			P,
			Desc
		);
	}
	return true;
};
'use strict';

var Day = require('./Day');
var modulo = require('./modulo');

// https://262.ecma-international.org/5.1/#sec-15.9.1.6

module.exports = function WeekDay(t) {
	return modulo(Day(t) + 4, 7);
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $Date = GetIntrinsic('%Date%');

var callBound = require('call-bind/callBound');

var $getUTCFullYear = callBound('Date.prototype.getUTCFullYear');

// https://262.ecma-international.org/5.1/#sec-15.9.1.3

module.exports = function YearFromTime(t) {
	// largest y such that this.TimeFromYear(y) <= t
	return $getUTCFullYear(new $Date(t));
};
'use strict';

var GetIntrinsic = require('get-intrinsic');

var $abs = GetIntrinsic('%Math.abs%');

// http://262.ecma-international.org/5.1/#sec-5.2

module.exports = function abs(x) {
	return $abs(x);
};
'use strict';

// var modulo = require('./modulo');
var $floor = Math.floor;

// http://262.ecma-international.org/5.1/#sec-5.2

module.exports = function floor(x) {
	// return x - modulo(x, 1);
	return $floor(x);
};
'use strict';

var mod = require('../helpers/mod');

// https://262.ecma-international.org/5.1/#sec-5.2

module.exports = function modulo(x, y) {
	return mod(x, y);
};
'use strict';

var modulo = require('./modulo');

var msPerSecond = require('../helpers/timeConstants').msPerSecond;

// https://262.ecma-international.org/5.1/#sec-15.9.1.10

module.exports = function msFromTime(t) {
	return modulo(t, msPerSecond);
};
'use strict';

var $BooleanValueOf = require('call-bind/callBound')('Boolean.prototype.valueOf');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-boolean-prototype-object

module.exports = function thisBooleanValue(value) {
	if (Type(value) === 'Boolean') {
		return value;
	}

	return $BooleanValueOf(value);
};
'use strict';

var callBound = require('call-bind/callBound');

var Type = require('./Type');

var $NumberValueOf = callBound('Number.prototype.valueOf');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-number-prototype-object

module.exports = function thisNumberValue(value) {
	if (Type(value) === 'Number') {
		return value;
	}

	return $NumberValueOf(value);
};

'use strict';

var $StringValueOf = require('call-bind/callBound')('String.prototype.valueOf');

var Type = require('./Type');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object

module.exports = function thisStringValue(value) {
	if (Type(value) === 'String') {
		return value;
	}

	return $StringValueOf(value);
};
'use strict';

var $DateGetTime = require('call-bind/callBound')('Date.prototype.getTime');

// https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-date-prototype-object

module.exports = function thisTimeValue(value) {
	return $DateGetTime(value);
};
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"lines": 86,
	"statements": 85.93,
	"functions": 82.43,
	"branches": 76.06,
	"exclude": [
		"coverage",
		"test"
	]
}
MIT License

Copyright (c) 2019 Jordan Harband

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';

require('./shim')();
'use strict';

var AdvanceStringIndex = require('es-abstract/2021/AdvanceStringIndex');
var CreateDataPropertyOrThrow = require('es-abstract/2021/CreateDataPropertyOrThrow');
var CreateMethodProperty = require('es-abstract/2021/CreateMethodProperty');
var GetMethod = require('es-abstract/2021/GetMethod');
var IsArray = require('es-abstract/2021/IsArray');
var IterableToList = require('es-abstract/2021/IterableToList');
var OrdinarySetPrototypeOf = require('es-abstract/2021/OrdinarySetPrototypeOf');
var Type = require('es-abstract/2021/Type');
var GetIntrinsic = require('get-intrinsic');
var getIteratorMethod = require('es-abstract/helpers/getIteratorMethod');
var hasPropertyDescriptors = require('has-property-descriptors')();

var $Error = GetIntrinsic('%Error%');

// eslint-disable-next-line func-style
function AggregateError(errors, message) {
	var error = new $Error(message);
	OrdinarySetPrototypeOf(error, proto); // eslint-disable-line no-use-before-define
	delete error.constructor;

	var errorsList = IterableToList(errors, getIteratorMethod({
		AdvanceStringIndex: AdvanceStringIndex,
		GetMethod: GetMethod,
		IsArray: IsArray,
		Type: Type
	}, errors));
	CreateDataPropertyOrThrow(error, 'errors', errorsList);

	return error;
}
if (hasPropertyDescriptors) {
	Object.defineProperty(AggregateError, 'prototype', { writable: false });
}
var proto = AggregateError.prototype;

if (
	!CreateMethodProperty(proto, 'constructor', AggregateError)
	|| !CreateMethodProperty(proto, 'message', '')
	|| !CreateMethodProperty(proto, 'name', 'AggregateError')
) {
	throw new $Error('unable to install AggregateError.prototype properties; please report this!');
}

OrdinarySetPrototypeOf(AggregateError.prototype, Error.prototype);

module.exports = AggregateError;
'use strict';

var bind = require('function-bind');
var define = require('define-properties');
var functionsHaveConfigurableNames = require('functions-have-names').functionsHaveConfigurableNames();

var implementation = require('./implementation');
var getPolyfill = require('./polyfill');
var shim = require('./shim');

var polyfill = getPolyfill();
var bound = bind.call(polyfill);
if (Object.defineProperty) {
	if (functionsHaveConfigurableNames) {
		Object.defineProperty(bound, 'name', { value: polyfill.name });
	}
	Object.defineProperty(bound, 'prototype', { value: polyfill.prototype });
}

define(bound, {
	getPolyfill: getPolyfill,
	implementation: implementation,
	shim: shim
});

module.exports = bound;
{
  "name": "es-aggregate-error",
  "version": "1.0.8",
  "description": "ES Proposal spec-compliant shim for AggregateError",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/es-shims/AggregateError.git"
  },
  "author": "Jordan Harband <ljharb@gmail.com>",
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "license": "MIT",
  "homepage": "https://github.com/es-shims/AggregateError#readme",
  "dependencies": {
    "define-properties": "^1.1.4",
    "es-abstract": "^1.19.5",
    "function-bind": "^1.1.1",
    "functions-have-names": "^1.2.3",
    "get-intrinsic": "^1.1.1",
    "globalthis": "^1.0.2",
    "has-property-descriptors": "^1.0.0"
  },
  "devDependencies": {
    "@es-shims/api": "^2.2.3",
    "@ljharb/eslint-config": "^21.0.0",
    "aud": "^2.0.0",
    "auto-changelog": "^2.4.0",
    "es6-shim": "^0.35.6",
    "eslint": "=8.8.0",
    "evalmd": "^0.0.19",
    "for-each": "^0.3.3",
    "has-strict-mode": "^1.0.1",
    "npmignore": "^0.3.0",
    "nyc": "^10.3.2",
    "object-inspect": "^1.12.0",
    "safe-publish-latest": "^2.0.0",
    "tape": "^5.5.3"
  },
  "engines": {
    "node": ">= 0.4"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false,
    "hideCredit": true
  },
  "testling": {
    "files": "./test/index.js"
  },
  "publishConfig": {
    "ignore": [
      ".github/workflows"
    ]
  }
}'use strict';

var implementation = require('./implementation');

module.exports = function getPolyfill() {
	return typeof AggregateError === 'function' ? AggregateError : implementation;
};
'use strict';

var define = require('define-properties');
var globalThis = require('globalthis')();
var getPolyfill = require('./polyfill');

module.exports = function shimAggregateError() {
	var polyfill = getPolyfill();
	define(
		globalThis,
		{ AggregateError: polyfill },
		{
			AggregateError: function testAggregateError() {
				return globalThis.AggregateError !== polyfill;
			}
		}
	);
	return polyfill;
};
The MIT License (MIT)

Copyright (c) 2015 Jordan Harband

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.

# Since we rely on paths relative to the makefile location, abort if make isn't being run from there.
$(if $(findstring /,$(MAKEFILE_LIST)),$(error Please only invoke this makefile from the directory it resides in))

	# The files that need updating when incrementing the version number.
VERSIONED_FILES := *.js *.json README*


# Add the local npm packages' bin folder to the PATH, so that `make` can find them, when invoked directly.
# Note that rather than using `$(npm bin)` the 'node_modules/.bin' path component is hard-coded, so that invocation works even from an environment
# where npm is (temporarily) unavailable due to having deactivated an nvm instance loaded into the calling shell in order to avoid interference with tests.
export PATH := $(shell printf '%s' "$$PWD/node_modules/.bin:$$PATH")
UTILS := semver
# Make sure that all required utilities can be located.
UTIL_CHECK := $(or $(shell PATH="$(PATH)" which $(UTILS) >/dev/null && echo 'ok'),$(error Did you forget to run `npm install` after cloning the repo? At least one of the required supporting utilities not found: $(UTILS)))

# Default target (by virtue of being the first non '.'-prefixed in the file).
.PHONY: _no-target-specified
_no-target-specified:
	$(error Please specify the target to make - `make list` shows targets. Alternatively, use `npm test` to run the default tests; `npm run` shows all tests)

# Lists all targets defined in this makefile.
.PHONY: list
list:
	@$(MAKE) -pRrn : -f $(MAKEFILE_LIST) 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | command grep -v -e '^[^[:alnum:]]' -e '^$@$$command ' | sort

# All-tests target: invokes the specified test suites for ALL shells defined in $(SHELLS).
.PHONY: test
test:
	@npm test

.PHONY: _ensure-tag
_ensure-tag:
ifndef TAG
	$(error Please invoke with `make TAG=<new-version> release`, where <new-version> is either an increment specifier (patch, minor, major, prepatch, preminor, premajor, prerelease), or an explicit major.minor.patch version number)
endif

CHANGELOG_ERROR = $(error No CHANGELOG specified)
.PHONY: _ensure-changelog
_ensure-changelog:
	@ (git status -sb --porcelain | command grep -E '^( M|[MA] ) CHANGELOG.md' > /dev/null) || (echo no CHANGELOG.md specified && exit 2)

# Ensures that the git workspace is clean.
.PHONY: _ensure-clean
_ensure-clean:
	@[ -z "$$((git status --porcelain --untracked-files=no || echo err) | command grep -v 'CHANGELOG.md')" ] || { echo "Workspace is not clean; please commit changes first." >&2; exit 2; }

# Makes a release; invoke with `make TAG=<versionOrIncrementSpec> release`.
.PHONY: release
release: _ensure-tag _ensure-changelog _ensure-clean
	@old_ver=`git describe --abbrev=0 --tags --match 'v[0-9]*.[0-9]*.[0-9]*'` || { echo "Failed to determine current version." >&2; exit 1; }; old_ver=$${old_ver#v}; \
	 new_ver=`echo "$(TAG)" | sed 's/^v//'`; new_ver=$${new_ver:-patch}; \
	 if printf "$$new_ver" | command grep -q '^[0-9]'; then \
	   semver "$$new_ver" >/dev/null || { echo 'Invalid version number specified: $(TAG) - must be major.minor.patch' >&2; exit 2; }; \
	   semver -r "> $$old_ver" "$$new_ver" >/dev/null || { echo 'Invalid version number specified: $(TAG) - must be HIGHER than current one.' >&2; exit 2; } \
	 else \
	   new_ver=`semver -i "$$new_ver" "$$old_ver"` || { echo 'Invalid version-increment specifier: $(TAG)' >&2; exit 2; } \
	 fi; \
	 printf "=== Bumping version **$$old_ver** to **$$new_ver** before committing and tagging:\n=== TYPE 'proceed' TO PROCEED, anything else to abort: " && read response && [ "$$response" = 'proceed' ] || { echo 'Aborted.' >&2; exit 2; };  \
	 replace "$$old_ver" "$$new_ver" -- $(VERSIONED_FILES) && \
	 git commit -m "v$$new_ver" $(VERSIONED_FILES) CHANGELOG.md && \
	 git tag -a -m "v$$new_ver" "v$$new_ver"
'use strict';

var hasSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';

var isPrimitive = require('./helpers/isPrimitive');
var isCallable = require('is-callable');
var isDate = require('is-date-object');
var isSymbol = require('is-symbol');

var ordinaryToPrimitive = function OrdinaryToPrimitive(O, hint) {
	if (typeof O === 'undefined' || O === null) {
		throw new TypeError('Cannot call method on ' + O);
	}
	if (typeof hint !== 'string' || (hint !== 'number' && hint !== 'string')) {
		throw new TypeError('hint must be "string" or "number"');
	}
	var methodNames = hint === 'string' ? ['toString', 'valueOf'] : ['valueOf', 'toString'];
	var method, result, i;
	for (i = 0; i < methodNames.length; ++i) {
		method = O[methodNames[i]];
		if (isCallable(method)) {
			result = method.call(O);
			if (isPrimitive(result)) {
				return result;
			}
		}
	}
	throw new TypeError('No default value');
};

var GetMethod = function GetMethod(O, P) {
	var func = O[P];
	if (func !== null && typeof func !== 'undefined') {
		if (!isCallable(func)) {
			throw new TypeError(func + ' returned for property ' + P + ' of object ' + O + ' is not a function');
		}
		return func;
	}
	return void 0;
};

// http://www.ecma-international.org/ecma-262/6.0/#sec-toprimitive
module.exports = function ToPrimitive(input) {
	if (isPrimitive(input)) {
		return input;
	}
	var hint = 'default';
	if (arguments.length > 1) {
		if (arguments[1] === String) {
			hint = 'string';
		} else if (arguments[1] === Number) {
			hint = 'number';
		}
	}

	var exoticToPrim;
	if (hasSymbols) {
		if (Symbol.toPrimitive) {
			exoticToPrim = GetMethod(input, Symbol.toPrimitive);
		} else if (isSymbol(input)) {
			exoticToPrim = Symbol.prototype.valueOf;
		}
	}
	if (typeof exoticToPrim !== 'undefined') {
		var result = exoticToPrim.call(input, hint);
		if (isPrimitive(result)) {
			return result;
		}
		throw new TypeError('unable to convert exotic object to primitive');
	}
	if (hint === 'default' && (isDate(input) || isSymbol(input))) {
		hint = 'string';
	}
	return ordinaryToPrimitive(input, hint === 'default' ? 'number' : hint);
};
'use strict';

var toStr = Object.prototype.toString;

var isPrimitive = require('./helpers/isPrimitive');

var isCallable = require('is-callable');

// http://ecma-international.org/ecma-262/5.1/#sec-8.12.8
var ES5internalSlots = {
	'[[DefaultValue]]': function (O) {
		var actualHint;
		if (arguments.length > 1) {
			actualHint = arguments[1];
		} else {
			actualHint = toStr.call(O) === '[object Date]' ? String : Number;
		}

		if (actualHint === String || actualHint === Number) {
			var methods = actualHint === String ? ['toString', 'valueOf'] : ['valueOf', 'toString'];
			var value, i;
			for (i = 0; i < methods.length; ++i) {
				if (isCallable(O[methods[i]])) {
					value = O[methods[i]]();
					if (isPrimitive(value)) {
						return value;
					}
				}
			}
			throw new TypeError('No default value');
		}
		throw new TypeError('invalid [[DefaultValue]] hint supplied');
	}
};

// http://ecma-international.org/ecma-262/5.1/#sec-9.1
module.exports = function ToPrimitive(input) {
	if (isPrimitive(input)) {
		return input;
	}
	if (arguments.length > 1) {
		return ES5internalSlots['[[DefaultValue]]'](input, arguments[1]);
	}
	return ES5internalSlots['[[DefaultValue]]'](input);
};
'use strict';

module.exports = require('./es2015');
'use strict';

var ES5 = require('./es5');
var ES6 = require('./es6');
var ES2015 = require('./es2015');

if (Object.defineProperty) {
	Object.defineProperty(ES2015, 'ES5', { enumerable: false, value: ES5 });
	Object.defineProperty(ES2015, 'ES6', { enumerable: false, value: ES6 });
	Object.defineProperty(ES2015, 'ES2015', { enumerable: false, value: ES2015 });
} else {
	ES6.ES5 = ES5;
	ES6.ES6 = ES6;
	ES6.ES2015 = ES2015;
}

module.exports = ES2015;
{
  "name": "es-to-primitive",
  "version": "1.2.1",
  "author": "Jordan Harband <ljharb@gmail.com>",
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "description": "ECMAScript “ToPrimitive” algorithm. Provides ES5 and ES2015 versions.",
  "license": "MIT",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/ljharb/es-to-primitive.git"
  },
  "dependencies": {
    "is-callable": "^1.1.4",
    "is-date-object": "^1.0.1",
    "is-symbol": "^1.0.2"
  },
  "devDependencies": {
    "@ljharb/eslint-config": "^15.0.0",
    "covert": "^1.1.1",
    "eslint": "^6.6.0",
    "foreach": "^2.0.5",
    "function.prototype.name": "^1.1.1",
    "has-symbols": "^1.0.0",
    "object-inspect": "^1.6.0",
    "object-is": "^1.0.1",
    "replace": "^1.1.1",
    "semver": "^6.3.0",
    "tape": "^4.11.0"
  },
  "testling": {
    "files": "test",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "engines": {
    "node": ">= 0.4"
  }
}'use strict';

module.exports = function isPrimitive(value) {
	return value === null || (typeof value !== 'function' && typeof value !== 'object');
};
# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/es-to-primitive
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
(The MIT License)

Copyright (c) 2012-2013 TJ Holowaychuk
Copyright (c) 2015 Andreas Lubbe
Copyright (c) 2015 Tiancheng "Timothy" Gu

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.
/*!
 * escape-html
 * Copyright(c) 2012-2013 TJ Holowaychuk
 * Copyright(c) 2015 Andreas Lubbe
 * Copyright(c) 2015 Tiancheng "Timothy" Gu
 * MIT Licensed
 */

'use strict';

/**
 * Module variables.
 * @private
 */

var matchHtmlRegExp = /["'&<>]/;

/**
 * Module exports.
 * @public
 */

module.exports = escapeHtml;

/**
 * Escape special characters in the given string of html.
 *
 * @param  {string} string The string to escape for inserting into HTML
 * @return {string}
 * @public
 */

function escapeHtml(string) {
  var str = '' + string;
  var match = matchHtmlRegExp.exec(str);

  if (!match) {
    return str;
  }

  var escape;
  var html = '';
  var index = 0;
  var lastIndex = 0;

  for (index = match.index; index < str.length; index++) {
    switch (str.charCodeAt(index)) {
      case 34: // "
        escape = '&quot;';
        break;
      case 38: // &
        escape = '&amp;';
        break;
      case 39: // '
        escape = '&#39;';
        break;
      case 60: // <
        escape = '&lt;';
        break;
      case 62: // >
        escape = '&gt;';
        break;
      default:
        continue;
    }

    if (lastIndex !== index) {
      html += str.substring(lastIndex, index);
    }

    lastIndex = index + 1;
    html += escape;
  }

  return lastIndex !== index
    ? html + str.substring(lastIndex, index)
    : html;
}
{
  "name": "escape-html",
  "description": "Escape string for use in HTML",
  "version": "1.0.3",
  "license": "MIT",
  "repository": "component/escape-html",
  "devDependencies": {
    "benchmark": "1.0.0",
    "beautify-benchmark": "0.2.4"
  },
  "files": [
    "LICENSE",
    "Readme.md",
    "index.js"
  ]
}1.8.1 / 2017-09-12
==================

  * perf: replace regular expression with substring

1.8.0 / 2017-02-18
==================

  * Use SHA1 instead of MD5 for ETag hashing
    - Improves performance for larger entities
    - Works with FIPS 140-2 OpenSSL configuration

1.7.0 / 2015-06-08
==================

  * Always include entity length in ETags for hash length extensions
  * Generate non-Stats ETags using MD5 only (no longer CRC32)
  * Improve stat performance by removing hashing
  * Remove base64 padding in ETags to shorten
  * Use MD5 instead of MD4 in weak ETags over 1KB

1.6.0 / 2015-05-10
==================

  * Improve support for JXcore
  * Remove requirement of `atime` in the stats object
  * Support "fake" stats objects in environments without `fs`

1.5.1 / 2014-11-19
==================

  * deps: crc@3.2.1
    - Minor fixes

1.5.0 / 2014-10-14
==================

  * Improve string performance
  * Slightly improve speed for weak ETags over 1KB

1.4.0 / 2014-09-21
==================

  * Support "fake" stats objects
  * Support Node.js 0.6

1.3.1 / 2014-09-14
==================

  * Use the (new and improved) `crc` for crc32

1.3.0 / 2014-08-29
==================

  * Default strings to strong ETags
  * Improve speed for weak ETags over 1KB

1.2.1 / 2014-08-29
==================

  * Use the (much faster) `buffer-crc32` for crc32

1.2.0 / 2014-08-24
==================

  * Add support for file stat objects

1.1.0 / 2014-08-24
==================

  * Add fast-path for empty entity
  * Add weak ETag generation
  * Shrink size of generated ETags

1.0.1 / 2014-08-24
==================

  * Fix behavior of string containing Unicode

1.0.0 / 2014-05-18
==================

  * Initial release
(The MIT License)

Copyright (c) 2014-2016 Douglas Christopher Wilson

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.
/*!
 * etag
 * Copyright(c) 2014-2016 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module exports.
 * @public
 */

module.exports = etag

/**
 * Module dependencies.
 * @private
 */

var crypto = require('crypto')
var Stats = require('fs').Stats

/**
 * Module variables.
 * @private
 */

var toString = Object.prototype.toString

/**
 * Generate an entity tag.
 *
 * @param {Buffer|string} entity
 * @return {string}
 * @private
 */

function entitytag (entity) {
  if (entity.length === 0) {
    // fast-path empty
    return '"0-2jmj7l5rSw0yVb/vlWAYkK/YBwk"'
  }

  // compute hash of entity
  var hash = crypto
    .createHash('sha1')
    .update(entity, 'utf8')
    .digest('base64')
    .substring(0, 27)

  // compute length of entity
  var len = typeof entity === 'string'
    ? Buffer.byteLength(entity, 'utf8')
    : entity.length

  return '"' + len.toString(16) + '-' + hash + '"'
}

/**
 * Create a simple ETag.
 *
 * @param {string|Buffer|Stats} entity
 * @param {object} [options]
 * @param {boolean} [options.weak]
 * @return {String}
 * @public
 */

function etag (entity, options) {
  if (entity == null) {
    throw new TypeError('argument entity is required')
  }

  // support fs.Stats object
  var isStats = isstats(entity)
  var weak = options && typeof options.weak === 'boolean'
    ? options.weak
    : isStats

  // validate argument
  if (!isStats && typeof entity !== 'string' && !Buffer.isBuffer(entity)) {
    throw new TypeError('argument entity must be string, Buffer, or fs.Stats')
  }

  // generate entity tag
  var tag = isStats
    ? stattag(entity)
    : entitytag(entity)

  return weak
    ? 'W/' + tag
    : tag
}

/**
 * Determine if object is a Stats object.
 *
 * @param {object} obj
 * @return {boolean}
 * @api private
 */

function isstats (obj) {
  // genuine fs.Stats
  if (typeof Stats === 'function' && obj instanceof Stats) {
    return true
  }

  // quack quack
  return obj && typeof obj === 'object' &&
    'ctime' in obj && toString.call(obj.ctime) === '[object Date]' &&
    'mtime' in obj && toString.call(obj.mtime) === '[object Date]' &&
    'ino' in obj && typeof obj.ino === 'number' &&
    'size' in obj && typeof obj.size === 'number'
}

/**
 * Generate a tag for a stat.
 *
 * @param {object} stat
 * @return {string}
 * @private
 */

function stattag (stat) {
  var mtime = stat.mtime.getTime().toString(16)
  var size = stat.size.toString(16)

  return '"' + size + '-' + mtime + '"'
}
{
  "name": "etag",
  "description": "Create simple HTTP ETags",
  "version": "1.8.1",
  "license": "MIT",
  "repository": "jshttp/etag",
  "devDependencies": {
    "beautify-benchmark": "0.2.4",
    "benchmark": "2.1.4",
    "eslint": "3.19.0",
    "eslint-config-standard": "10.2.1",
    "eslint-plugin-import": "2.7.0",
    "eslint-plugin-markdown": "1.0.0-beta.6",
    "eslint-plugin-node": "5.1.1",
    "eslint-plugin-promise": "3.5.0",
    "eslint-plugin-standard": "3.0.1",
    "istanbul": "0.4.5",
    "mocha": "1.21.5",
    "safe-buffer": "5.1.1",
    "seedrandom": "2.4.3"
  },
  "files": [
    "LICENSE",
    "HISTORY.md",
    "README.md",
    "index.js"
  ],
  "engines": {
    "node": ">= 0.6"
  }
}sauce_connect: true
loopback: airtap.local
browsers:
  - name: chrome
    version: latest
  - name: firefox
    version: latest
  - name: safari
    version: 9..latest
  - name: iphone
    version: latest
  - name: ie
    version: 9..latest
  - name: microsoftedge
    version: 13..latest
# 3.3.0

 - Support EventTarget emitters in `events.once` from Node.js 12.11.0.

   Now you can use the `events.once` function with objects that implement the EventTarget interface. This interface is used widely in
   the DOM and other web APIs.

   ```js
   var events = require('events');
   var assert = require('assert');

   async function connect() {
     var ws = new WebSocket('wss://example.com');
     await events.once(ws, 'open');
     assert(ws.readyState === WebSocket.OPEN);
   }

   async function onClick() {
     await events.once(document.body, 'click');
     alert('you clicked the page!');
   }
   ```

# 3.2.0

 - Add `events.once` from Node.js 11.13.0.

   To use this function, Promises must be supported in the environment. Use a polyfill like `es6-promise` if you support older browsers.

# 3.1.0 (2020-01-08)

`events` now matches the Node.js 11.12.0 API.

  - pass through return value in wrapped `emitter.once()` listeners

    Now, this works:
    ```js
    emitter.once('myevent', function () { return 1; });
    var listener = emitter.rawListeners('myevent')[0]
    assert(listener() === 1);
    ```
    Previously, `listener()` would return undefined regardless of the implementation.

    Ported from https://github.com/nodejs/node/commit/acc506c2d2771dab8d7bba6d3452bc5180dff7cf

  - Reduce code duplication in listener type check ([#67](https://github.com/Gozala/events/pull/67) by [@friederbluemle](https://github.com/friederbluemle)).
  - Improve `emitter.once()` performance in some engines

# 3.0.0 (2018-05-25)

**This version drops support for IE8.** `events` no longer includes polyfills
for ES5 features. If you need to support older environments, use an ES5 shim
like [es5-shim](https://npmjs.com/package/es5-shim). Both the shim and sham
versions of es5-shim are necessary.

  - Update to events code from Node.js 10.x
    - (semver major) Adds `off()` method
  - Port more tests from Node.js
  - Switch browser tests to airtap, making things more reliable

# 2.1.0 (2018-05-25)

  - add Emitter#rawListeners from Node.js v9.4

# 2.0.0 (2018-02-02)

  - Update to events code from node.js 8.x
    - Adds `prependListener()` and `prependOnceListener()`
    - Adds `eventNames()` method
    - (semver major) Unwrap `once()` listeners in `listeners()`
  - copy tests from node.js

Note that this version doubles the gzipped size, jumping from 1.1KB to 2.1KB,
due to new methods and runtime performance improvements. Be aware of that when
upgrading.

# 1.1.1 (2016-06-22)

  - add more context to errors if they are not instanceof Error

# 1.1.0 (2015-09-29)

  - add Emitter#listerCount (to match node v4 api)

# 1.0.2 (2014-08-28)

  - remove un-reachable code
  - update devDeps

## 1.0.1 / 2014-05-11

  - check for console.trace before using it

## 1.0.0 / 2013-12-10

  - Update to latest events code from node.js 0.10
  - copy tests from node.js

## 0.4.0 / 2011-07-03 ##

  - Switching to graphquire@0.8.0

## 0.3.0 / 2011-07-03 ##

  - Switching to URL based module require.

## 0.2.0 / 2011-06-10 ##

  - Simplified package structure.
  - Graphquire for dependency management.

## 0.1.1 / 2011-05-16 ##

  - Unhandled errors are logged via console.error

## 0.1.0 / 2011-04-22 ##

  - Initial release
MIT

Copyright Joyent, Inc. and other Node contributors.

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

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

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

'use strict';

var R = typeof Reflect === 'object' ? Reflect : null
var ReflectApply = R && typeof R.apply === 'function'
  ? R.apply
  : function ReflectApply(target, receiver, args) {
    return Function.prototype.apply.call(target, receiver, args);
  }

var ReflectOwnKeys
if (R && typeof R.ownKeys === 'function') {
  ReflectOwnKeys = R.ownKeys
} else if (Object.getOwnPropertySymbols) {
  ReflectOwnKeys = function ReflectOwnKeys(target) {
    return Object.getOwnPropertyNames(target)
      .concat(Object.getOwnPropertySymbols(target));
  };
} else {
  ReflectOwnKeys = function ReflectOwnKeys(target) {
    return Object.getOwnPropertyNames(target);
  };
}

function ProcessEmitWarning(warning) {
  if (console && console.warn) console.warn(warning);
}

var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {
  return value !== value;
}

function EventEmitter() {
  EventEmitter.init.call(this);
}
module.exports = EventEmitter;
module.exports.once = once;

// Backwards-compat with node 0.10.x
EventEmitter.EventEmitter = EventEmitter;

EventEmitter.prototype._events = undefined;
EventEmitter.prototype._eventsCount = 0;
EventEmitter.prototype._maxListeners = undefined;

// By default EventEmitters will print a warning if more than 10 listeners are
// added to it. This is a useful default which helps finding memory leaks.
var defaultMaxListeners = 10;

function checkListener(listener) {
  if (typeof listener !== 'function') {
    throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);
  }
}

Object.defineProperty(EventEmitter, 'defaultMaxListeners', {
  enumerable: true,
  get: function() {
    return defaultMaxListeners;
  },
  set: function(arg) {
    if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {
      throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.');
    }
    defaultMaxListeners = arg;
  }
});

EventEmitter.init = function() {

  if (this._events === undefined ||
      this._events === Object.getPrototypeOf(this)._events) {
    this._events = Object.create(null);
    this._eventsCount = 0;
  }

  this._maxListeners = this._maxListeners || undefined;
};

// Obviously not all Emitters should be limited to 10. This function allows
// that to be increased. Set to zero for unlimited.
EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
  if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {
    throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.');
  }
  this._maxListeners = n;
  return this;
};

function _getMaxListeners(that) {
  if (that._maxListeners === undefined)
    return EventEmitter.defaultMaxListeners;
  return that._maxListeners;
}

EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
  return _getMaxListeners(this);
};

EventEmitter.prototype.emit = function emit(type) {
  var args = [];
  for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);
  var doError = (type === 'error');

  var events = this._events;
  if (events !== undefined)
    doError = (doError && events.error === undefined);
  else if (!doError)
    return false;

  // If there is no 'error' event listener then throw.
  if (doError) {
    var er;
    if (args.length > 0)
      er = args[0];
    if (er instanceof Error) {
      // Note: The comments on the `throw` lines are intentional, they show
      // up in Node's output if this results in an unhandled exception.
      throw er; // Unhandled 'error' event
    }
    // At least give some kind of context to the user
    var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));
    err.context = er;
    throw err; // Unhandled 'error' event
  }

  var handler = events[type];

  if (handler === undefined)
    return false;

  if (typeof handler === 'function') {
    ReflectApply(handler, this, args);
  } else {
    var len = handler.length;
    var listeners = arrayClone(handler, len);
    for (var i = 0; i < len; ++i)
      ReflectApply(listeners[i], this, args);
  }

  return true;
};

function _addListener(target, type, listener, prepend) {
  var m;
  var events;
  var existing;

  checkListener(listener);

  events = target._events;
  if (events === undefined) {
    events = target._events = Object.create(null);
    target._eventsCount = 0;
  } else {
    // To avoid recursion in the case that type === "newListener"! Before
    // adding it to the listeners, first emit "newListener".
    if (events.newListener !== undefined) {
      target.emit('newListener', type,
                  listener.listener ? listener.listener : listener);

      // Re-assign `events` because a newListener handler could have caused the
      // this._events to be assigned to a new object
      events = target._events;
    }
    existing = events[type];
  }

  if (existing === undefined) {
    // Optimize the case of one listener. Don't need the extra array object.
    existing = events[type] = listener;
    ++target._eventsCount;
  } else {
    if (typeof existing === 'function') {
      // Adding the second element, need to change to array.
      existing = events[type] =
        prepend ? [listener, existing] : [existing, listener];
      // If we've already got an array, just append.
    } else if (prepend) {
      existing.unshift(listener);
    } else {
      existing.push(listener);
    }

    // Check for listener leak
    m = _getMaxListeners(target);
    if (m > 0 && existing.length > m && !existing.warned) {
      existing.warned = true;
      // No error code for this since it is a Warning
      // eslint-disable-next-line no-restricted-syntax
      var w = new Error('Possible EventEmitter memory leak detected. ' +
                          existing.length + ' ' + String(type) + ' listeners ' +
                          'added. Use emitter.setMaxListeners() to ' +
                          'increase limit');
      w.name = 'MaxListenersExceededWarning';
      w.emitter = target;
      w.type = type;
      w.count = existing.length;
      ProcessEmitWarning(w);
    }
  }

  return target;
}

EventEmitter.prototype.addListener = function addListener(type, listener) {
  return _addListener(this, type, listener, false);
};

EventEmitter.prototype.on = EventEmitter.prototype.addListener;

EventEmitter.prototype.prependListener =
    function prependListener(type, listener) {
      return _addListener(this, type, listener, true);
    };

function onceWrapper() {
  if (!this.fired) {
    this.target.removeListener(this.type, this.wrapFn);
    this.fired = true;
    if (arguments.length === 0)
      return this.listener.call(this.target);
    return this.listener.apply(this.target, arguments);
  }
}

function _onceWrap(target, type, listener) {
  var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };
  var wrapped = onceWrapper.bind(state);
  wrapped.listener = listener;
  state.wrapFn = wrapped;
  return wrapped;
}

EventEmitter.prototype.once = function once(type, listener) {
  checkListener(listener);
  this.on(type, _onceWrap(this, type, listener));
  return this;
};

EventEmitter.prototype.prependOnceListener =
    function prependOnceListener(type, listener) {
      checkListener(listener);
      this.prependListener(type, _onceWrap(this, type, listener));
      return this;
    };

// Emits a 'removeListener' event if and only if the listener was removed.
EventEmitter.prototype.removeListener =
    function removeListener(type, listener) {
      var list, events, position, i, originalListener;

      checkListener(listener);

      events = this._events;
      if (events === undefined)
        return this;

      list = events[type];
      if (list === undefined)
        return this;

      if (list === listener || list.listener === listener) {
        if (--this._eventsCount === 0)
          this._events = Object.create(null);
        else {
          delete events[type];
          if (events.removeListener)
            this.emit('removeListener', type, list.listener || listener);
        }
      } else if (typeof list !== 'function') {
        position = -1;

        for (i = list.length - 1; i >= 0; i--) {
          if (list[i] === listener || list[i].listener === listener) {
            originalListener = list[i].listener;
            position = i;
            break;
          }
        }

        if (position < 0)
          return this;

        if (position === 0)
          list.shift();
        else {
          spliceOne(list, position);
        }

        if (list.length === 1)
          events[type] = list[0];

        if (events.removeListener !== undefined)
          this.emit('removeListener', type, originalListener || listener);
      }

      return this;
    };

EventEmitter.prototype.off = EventEmitter.prototype.removeListener;

EventEmitter.prototype.removeAllListeners =
    function removeAllListeners(type) {
      var listeners, events, i;

      events = this._events;
      if (events === undefined)
        return this;

      // not listening for removeListener, no need to emit
      if (events.removeListener === undefined) {
        if (arguments.length === 0) {
          this._events = Object.create(null);
          this._eventsCount = 0;
        } else if (events[type] !== undefined) {
          if (--this._eventsCount === 0)
            this._events = Object.create(null);
          else
            delete events[type];
        }
        return this;
      }

      // emit removeListener for all listeners on all events
      if (arguments.length === 0) {
        var keys = Object.keys(events);
        var key;
        for (i = 0; i < keys.length; ++i) {
          key = keys[i];
          if (key === 'removeListener') continue;
          this.removeAllListeners(key);
        }
        this.removeAllListeners('removeListener');
        this._events = Object.create(null);
        this._eventsCount = 0;
        return this;
      }

      listeners = events[type];

      if (typeof listeners === 'function') {
        this.removeListener(type, listeners);
      } else if (listeners !== undefined) {
        // LIFO order
        for (i = listeners.length - 1; i >= 0; i--) {
          this.removeListener(type, listeners[i]);
        }
      }

      return this;
    };

function _listeners(target, type, unwrap) {
  var events = target._events;

  if (events === undefined)
    return [];

  var evlistener = events[type];
  if (evlistener === undefined)
    return [];

  if (typeof evlistener === 'function')
    return unwrap ? [evlistener.listener || evlistener] : [evlistener];

  return unwrap ?
    unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);
}

EventEmitter.prototype.listeners = function listeners(type) {
  return _listeners(this, type, true);
};

EventEmitter.prototype.rawListeners = function rawListeners(type) {
  return _listeners(this, type, false);
};

EventEmitter.listenerCount = function(emitter, type) {
  if (typeof emitter.listenerCount === 'function') {
    return emitter.listenerCount(type);
  } else {
    return listenerCount.call(emitter, type);
  }
};

EventEmitter.prototype.listenerCount = listenerCount;
function listenerCount(type) {
  var events = this._events;

  if (events !== undefined) {
    var evlistener = events[type];

    if (typeof evlistener === 'function') {
      return 1;
    } else if (evlistener !== undefined) {
      return evlistener.length;
    }
  }

  return 0;
}

EventEmitter.prototype.eventNames = function eventNames() {
  return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];
};

function arrayClone(arr, n) {
  var copy = new Array(n);
  for (var i = 0; i < n; ++i)
    copy[i] = arr[i];
  return copy;
}

function spliceOne(list, index) {
  for (; index + 1 < list.length; index++)
    list[index] = list[index + 1];
  list.pop();
}

function unwrapListeners(arr) {
  var ret = new Array(arr.length);
  for (var i = 0; i < ret.length; ++i) {
    ret[i] = arr[i].listener || arr[i];
  }
  return ret;
}

function once(emitter, name) {
  return new Promise(function (resolve, reject) {
    function errorListener(err) {
      emitter.removeListener(name, resolver);
      reject(err);
    }

    function resolver() {
      if (typeof emitter.removeListener === 'function') {
        emitter.removeListener('error', errorListener);
      }
      resolve([].slice.call(arguments));
    };

    eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });
    if (name !== 'error') {
      addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });
    }
  });
}

function addErrorHandlerIfEventEmitter(emitter, handler, flags) {
  if (typeof emitter.on === 'function') {
    eventTargetAgnosticAddListener(emitter, 'error', handler, flags);
  }
}

function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
  if (typeof emitter.on === 'function') {
    if (flags.once) {
      emitter.once(name, listener);
    } else {
      emitter.on(name, listener);
    }
  } else if (typeof emitter.addEventListener === 'function') {
    // EventTarget does not have `error` event semantics like Node
    // EventEmitters, we do not listen for `error` events here.
    emitter.addEventListener(name, function wrapListener(arg) {
      // IE does not have builtin `{ once: true }` support so we
      // have to do it manually.
      if (flags.once) {
        emitter.removeEventListener(name, wrapListener);
      }
      listener(arg);
    });
  } else {
    throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter);
  }
}
{
  "name": "events",
  "version": "3.3.0",
  "description": "Node's event emitter for all engines.",
  "author": "Irakli Gozalishvili <rfobic@gmail.com> (http://jeditoolkit.com)",
  "repository": {
    "type": "git",
    "url": "git://github.com/Gozala/events.git",
    "web": "https://github.com/Gozala/events"
  },
  "main": "./events.js",
  "engines": {
    "node": ">=0.8.x"
  },
  "devDependencies": {
    "airtap": "^1.0.0",
    "functions-have-names": "^1.2.1",
    "has": "^1.0.3",
    "has-symbols": "^1.0.1",
    "isarray": "^2.0.5",
    "tape": "^5.0.0"
  },
  "license": "MIT"
}# Security Policy

## Supported Versions
Only the latest major version is supported at any given time.

## Reporting a Vulnerability

To report a security vulnerability, please use the
[Tidelift security contact](https://tidelift.com/security).
Tidelift will coordinate the fix and disclosure.
# These are supported funding model platforms

github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/events
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
The MIT License (MIT)

Copyright (c) 2018 Lars-Magnus Skog

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.module.exports = function (opts) {
  var sep = opts ? opts.sep : '{}'
  var len = sep.length

  var whitespace = '\\s*'
  var left = escape(sep.substring(0, len / 2)) + whitespace
  var right = whitespace + escape(sep.substring(len / 2, len))

  return function (template, values) {
    Object.keys(values).forEach(function (key) {
      var value = String(values[key]).replace(/\$/g, '$$$$')
      template = template.replace(regExp(key), value)
    })
    return template
  }

  function escape (s) {
    return [].map.call(s, function (char) {
      return '\\' + char
    }).join('')
  }

  function regExp (key) {
    return new RegExp(left + key + right, 'g')
  }
}
{
  "name": "expand-template",
  "version": "2.0.3",
  "description": "Expand placeholders in a template string",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "https://github.com/ralphtheninja/expand-template.git"
  },
  "homepage": "https://github.com/ralphtheninja/expand-template",
  "author": "LM <ralphtheninja@riseup.net>",
  "license": "(MIT OR WTFPL)",
  "dependencies": {},
  "devDependencies": {
    "standard": "^12.0.0",
    "tape": "^4.2.2"
  },
  "engines": {
    "node": ">=6"
  }
}4.18.1 / 2022-04-29
===================

  * Fix hanging on large stack of sync routes

4.18.0 / 2022-04-25
===================

  * Add "root" option to `res.download`
  * Allow `options` without `filename` in `res.download`
  * Deprecate string and non-integer arguments to `res.status`
  * Fix behavior of `null`/`undefined` as `maxAge` in `res.cookie`
  * Fix handling very large stacks of sync middleware
  * Ignore `Object.prototype` values in settings through `app.set`/`app.get`
  * Invoke `default` with same arguments as types in `res.format`
  * Support proper 205 responses using `res.send`
  * Use `http-errors` for `res.format` error
  * deps: body-parser@1.20.0
    - Fix error message for json parse whitespace in `strict`
    - Fix internal error when inflated body exceeds limit
    - Prevent loss of async hooks context
    - Prevent hanging when request already read
    - deps: depd@2.0.0
    - deps: http-errors@2.0.0
    - deps: on-finished@2.4.1
    - deps: qs@6.10.3
    - deps: raw-body@2.5.1
  * deps: cookie@0.5.0
    - Add `priority` option
    - Fix `expires` option to reject invalid dates
  * deps: depd@2.0.0
    - Replace internal `eval` usage with `Function` constructor
    - Use instance methods on `process` to check for listeners
  * deps: finalhandler@1.2.0
    - Remove set content headers that break response
    - deps: on-finished@2.4.1
    - deps: statuses@2.0.1
  * deps: on-finished@2.4.1
    - Prevent loss of async hooks context
  * deps: qs@6.10.3
  * deps: send@0.18.0
    - Fix emitted 416 error missing headers property
    - Limit the headers removed for 304 response
    - deps: depd@2.0.0
    - deps: destroy@1.2.0
    - deps: http-errors@2.0.0
    - deps: on-finished@2.4.1
    - deps: statuses@2.0.1
  * deps: serve-static@1.15.0
    - deps: send@0.18.0
  * deps: statuses@2.0.1
    - Remove code 306
    - Rename `425 Unordered Collection` to standard `425 Too Early`

4.17.3 / 2022-02-16
===================

  * deps: accepts@~1.3.8
    - deps: mime-types@~2.1.34
    - deps: negotiator@0.6.3
  * deps: body-parser@1.19.2
    - deps: bytes@3.1.2
    - deps: qs@6.9.7
    - deps: raw-body@2.4.3
  * deps: cookie@0.4.2
  * deps: qs@6.9.7
    * Fix handling of `__proto__` keys
  * pref: remove unnecessary regexp for trust proxy

4.17.2 / 2021-12-16
===================

  * Fix handling of `undefined` in `res.jsonp`
  * Fix handling of `undefined` when `"json escape"` is enabled
  * Fix incorrect middleware execution with unanchored `RegExp`s
  * Fix `res.jsonp(obj, status)` deprecation message
  * Fix typo in `res.is` JSDoc
  * deps: body-parser@1.19.1
    - deps: bytes@3.1.1
    - deps: http-errors@1.8.1
    - deps: qs@6.9.6
    - deps: raw-body@2.4.2
    - deps: safe-buffer@5.2.1
    - deps: type-is@~1.6.18
  * deps: content-disposition@0.5.4
    - deps: safe-buffer@5.2.1
  * deps: cookie@0.4.1
    - Fix `maxAge` option to reject invalid values
  * deps: proxy-addr@~2.0.7
    - Use `req.socket` over deprecated `req.connection`
    - deps: forwarded@0.2.0
    - deps: ipaddr.js@1.9.1
  * deps: qs@6.9.6
  * deps: safe-buffer@5.2.1
  * deps: send@0.17.2
    - deps: http-errors@1.8.1
    - deps: ms@2.1.3
    - pref: ignore empty http tokens
  * deps: serve-static@1.14.2
    - deps: send@0.17.2
  * deps: setprototypeof@1.2.0

4.17.1 / 2019-05-25
===================

  * Revert "Improve error message for `null`/`undefined` to `res.status`"

4.17.0 / 2019-05-16
===================

  * Add `express.raw` to parse bodies into `Buffer`
  * Add `express.text` to parse bodies into string
  * Improve error message for non-strings to `res.sendFile`
  * Improve error message for `null`/`undefined` to `res.status`
  * Support multiple hosts in `X-Forwarded-Host`
  * deps: accepts@~1.3.7
  * deps: body-parser@1.19.0
    - Add encoding MIK
    - Add petabyte (`pb`) support
    - Fix parsing array brackets after index
    - deps: bytes@3.1.0
    - deps: http-errors@1.7.2
    - deps: iconv-lite@0.4.24
    - deps: qs@6.7.0
    - deps: raw-body@2.4.0
    - deps: type-is@~1.6.17
  * deps: content-disposition@0.5.3
  * deps: cookie@0.4.0
    - Add `SameSite=None` support
  * deps: finalhandler@~1.1.2
    - Set stricter `Content-Security-Policy` header
    - deps: parseurl@~1.3.3
    - deps: statuses@~1.5.0
  * deps: parseurl@~1.3.3
  * deps: proxy-addr@~2.0.5
    - deps: ipaddr.js@1.9.0
  * deps: qs@6.7.0
    - Fix parsing array brackets after index
  * deps: range-parser@~1.2.1
  * deps: send@0.17.1
    - Set stricter CSP header in redirect & error responses
    - deps: http-errors@~1.7.2
    - deps: mime@1.6.0
    - deps: ms@2.1.1
    - deps: range-parser@~1.2.1
    - deps: statuses@~1.5.0
    - perf: remove redundant `path.normalize` call
  * deps: serve-static@1.14.1
    - Set stricter CSP header in redirect response
    - deps: parseurl@~1.3.3
    - deps: send@0.17.1
  * deps: setprototypeof@1.1.1
  * deps: statuses@~1.5.0
    - Add `103 Early Hints`
  * deps: type-is@~1.6.18
    - deps: mime-types@~2.1.24
    - perf: prevent internal `throw` on invalid type

4.16.4 / 2018-10-10
===================

  * Fix issue where `"Request aborted"` may be logged in `res.sendfile`
  * Fix JSDoc for `Router` constructor
  * deps: body-parser@1.18.3
    - Fix deprecation warnings on Node.js 10+
    - Fix stack trace for strict json parse error
    - deps: depd@~1.1.2
    - deps: http-errors@~1.6.3
    - deps: iconv-lite@0.4.23
    - deps: qs@6.5.2
    - deps: raw-body@2.3.3
    - deps: type-is@~1.6.16
  * deps: proxy-addr@~2.0.4
    - deps: ipaddr.js@1.8.0
  * deps: qs@6.5.2
  * deps: safe-buffer@5.1.2

4.16.3 / 2018-03-12
===================

  * deps: accepts@~1.3.5
    - deps: mime-types@~2.1.18
  * deps: depd@~1.1.2
    - perf: remove argument reassignment
  * deps: encodeurl@~1.0.2
    - Fix encoding `%` as last character
  * deps: finalhandler@1.1.1
    - Fix 404 output for bad / missing pathnames
    - deps: encodeurl@~1.0.2
    - deps: statuses@~1.4.0
  * deps: proxy-addr@~2.0.3
    - deps: ipaddr.js@1.6.0
  * deps: send@0.16.2
    - Fix incorrect end tag in default error & redirects
    - deps: depd@~1.1.2
    - deps: encodeurl@~1.0.2
    - deps: statuses@~1.4.0
  * deps: serve-static@1.13.2
    - Fix incorrect end tag in redirects
    - deps: encodeurl@~1.0.2
    - deps: send@0.16.2
  * deps: statuses@~1.4.0
  * deps: type-is@~1.6.16
    - deps: mime-types@~2.1.18

4.16.2 / 2017-10-09
===================

  * Fix `TypeError` in `res.send` when given `Buffer` and `ETag` header set
  * perf: skip parsing of entire `X-Forwarded-Proto` header

4.16.1 / 2017-09-29
===================

  * deps: send@0.16.1
  * deps: serve-static@1.13.1
    - Fix regression when `root` is incorrectly set to a file
    - deps: send@0.16.1

4.16.0 / 2017-09-28
===================

  * Add `"json escape"` setting for `res.json` and `res.jsonp`
  * Add `express.json` and `express.urlencoded` to parse bodies
  * Add `options` argument to `res.download`
  * Improve error message when autoloading invalid view engine
  * Improve error messages when non-function provided as middleware
  * Skip `Buffer` encoding when not generating ETag for small response
  * Use `safe-buffer` for improved Buffer API
  * deps: accepts@~1.3.4
    - deps: mime-types@~2.1.16
  * deps: content-type@~1.0.4
    - perf: remove argument reassignment
    - perf: skip parameter parsing when no parameters
  * deps: etag@~1.8.1
    - perf: replace regular expression with substring
  * deps: finalhandler@1.1.0
    - Use `res.headersSent` when available
  * deps: parseurl@~1.3.2
    - perf: reduce overhead for full URLs
    - perf: unroll the "fast-path" `RegExp`
  * deps: proxy-addr@~2.0.2
    - Fix trimming leading / trailing OWS in `X-Forwarded-For`
    - deps: forwarded@~0.1.2
    - deps: ipaddr.js@1.5.2
    - perf: reduce overhead when no `X-Forwarded-For` header
  * deps: qs@6.5.1
    - Fix parsing & compacting very deep objects
  * deps: send@0.16.0
    - Add 70 new types for file extensions
    - Add `immutable` option
    - Fix missing `</html>` in default error & redirects
    - Set charset as "UTF-8" for .js and .json
    - Use instance methods on steam to check for listeners
    - deps: mime@1.4.1
    - perf: improve path validation speed
  * deps: serve-static@1.13.0
    - Add 70 new types for file extensions
    - Add `immutable` option
    - Set charset as "UTF-8" for .js and .json
    - deps: send@0.16.0
  * deps: setprototypeof@1.1.0
  * deps: utils-merge@1.0.1
  * deps: vary@~1.1.2
    - perf: improve header token parsing speed
  * perf: re-use options object when generating ETags
  * perf: remove dead `.charset` set in `res.jsonp`

4.15.5 / 2017-09-24
===================

  * deps: debug@2.6.9
  * deps: finalhandler@~1.0.6
    - deps: debug@2.6.9
    - deps: parseurl@~1.3.2
  * deps: fresh@0.5.2
    - Fix handling of modified headers with invalid dates
    - perf: improve ETag match loop
    - perf: improve `If-None-Match` token parsing
  * deps: send@0.15.6
    - Fix handling of modified headers with invalid dates
    - deps: debug@2.6.9
    - deps: etag@~1.8.1
    - deps: fresh@0.5.2
    - perf: improve `If-Match` token parsing
  * deps: serve-static@1.12.6
    - deps: parseurl@~1.3.2
    - deps: send@0.15.6
    - perf: improve slash collapsing

4.15.4 / 2017-08-06
===================

  * deps: debug@2.6.8
  * deps: depd@~1.1.1
    - Remove unnecessary `Buffer` loading
  * deps: finalhandler@~1.0.4
    - deps: debug@2.6.8
  * deps: proxy-addr@~1.1.5
    - Fix array argument being altered
    - deps: ipaddr.js@1.4.0
  * deps: qs@6.5.0
  * deps: send@0.15.4
    - deps: debug@2.6.8
    - deps: depd@~1.1.1
    - deps: http-errors@~1.6.2
  * deps: serve-static@1.12.4
    - deps: send@0.15.4

4.15.3 / 2017-05-16
===================

  * Fix error when `res.set` cannot add charset to `Content-Type`
  * deps: debug@2.6.7
    - Fix `DEBUG_MAX_ARRAY_LENGTH`
    - deps: ms@2.0.0
  * deps: finalhandler@~1.0.3
    - Fix missing `</html>` in HTML document
    - deps: debug@2.6.7
  * deps: proxy-addr@~1.1.4
    - deps: ipaddr.js@1.3.0
  * deps: send@0.15.3
    - deps: debug@2.6.7
    - deps: ms@2.0.0
  * deps: serve-static@1.12.3
    - deps: send@0.15.3
  * deps: type-is@~1.6.15
    - deps: mime-types@~2.1.15
  * deps: vary@~1.1.1
    - perf: hoist regular expression

4.15.2 / 2017-03-06
===================

  * deps: qs@6.4.0
    - Fix regression parsing keys starting with `[`

4.15.1 / 2017-03-05
===================

  * deps: send@0.15.1
    - Fix issue when `Date.parse` does not return `NaN` on invalid date
    - Fix strict violation in broken environments
  * deps: serve-static@1.12.1
    - Fix issue when `Date.parse` does not return `NaN` on invalid date
    - deps: send@0.15.1

4.15.0 / 2017-03-01
===================

  * Add debug message when loading view engine
  * Add `next("router")` to exit from router
  * Fix case where `router.use` skipped requests routes did not
  * Remove usage of `res._headers` private field
    - Improves compatibility with Node.js 8 nightly
  * Skip routing when `req.url` is not set
  * Use `%o` in path debug to tell types apart
  * Use `Object.create` to setup request & response prototypes
  * Use `setprototypeof` module to replace `__proto__` setting
  * Use `statuses` instead of `http` module for status messages
  * deps: debug@2.6.1
    - Allow colors in workers
    - Deprecated `DEBUG_FD` environment variable set to `3` or higher
    - Fix error when running under React Native
    - Use same color for same namespace
    - deps: ms@0.7.2
  * deps: etag@~1.8.0
    - Use SHA1 instead of MD5 for ETag hashing
    - Works with FIPS 140-2 OpenSSL configuration
  * deps: finalhandler@~1.0.0
    - Fix exception when `err` cannot be converted to a string
    - Fully URL-encode the pathname in the 404
    - Only include the pathname in the 404 message
    - Send complete HTML document
    - Set `Content-Security-Policy: default-src 'self'` header
    - deps: debug@2.6.1
  * deps: fresh@0.5.0
    - Fix false detection of `no-cache` request directive
    - Fix incorrect result when `If-None-Match` has both `*` and ETags
    - Fix weak `ETag` matching to match spec
    - perf: delay reading header values until needed
    - perf: enable strict mode
    - perf: hoist regular expressions
    - perf: remove duplicate conditional
    - perf: remove unnecessary boolean coercions
    - perf: skip checking modified time if ETag check failed
    - perf: skip parsing `If-None-Match` when no `ETag` header
    - perf: use `Date.parse` instead of `new Date`
  * deps: qs@6.3.1
    - Fix array parsing from skipping empty values
    - Fix compacting nested arrays
  * deps: send@0.15.0
    - Fix false detection of `no-cache` request directive
    - Fix incorrect result when `If-None-Match` has both `*` and ETags
    - Fix weak `ETag` matching to match spec
    - Remove usage of `res._headers` private field
    - Support `If-Match` and `If-Unmodified-Since` headers
    - Use `res.getHeaderNames()` when available
    - Use `res.headersSent` when available
    - deps: debug@2.6.1
    - deps: etag@~1.8.0
    - deps: fresh@0.5.0
    - deps: http-errors@~1.6.1
  * deps: serve-static@1.12.0
    - Fix false detection of `no-cache` request directive
    - Fix incorrect result when `If-None-Match` has both `*` and ETags
    - Fix weak `ETag` matching to match spec
    - Remove usage of `res._headers` private field
    - Send complete HTML document in redirect response
    - Set default CSP header in redirect response
    - Support `If-Match` and `If-Unmodified-Since` headers
    - Use `res.getHeaderNames()` when available
    - Use `res.headersSent` when available
    - deps: send@0.15.0
  * perf: add fast match path for `*` route
  * perf: improve `req.ips` performance

4.14.1 / 2017-01-28
===================

  * deps: content-disposition@0.5.2
  * deps: finalhandler@0.5.1
    - Fix exception when `err.headers` is not an object
    - deps: statuses@~1.3.1
    - perf: hoist regular expressions
    - perf: remove duplicate validation path
  * deps: proxy-addr@~1.1.3
    - deps: ipaddr.js@1.2.0
  * deps: send@0.14.2
    - deps: http-errors@~1.5.1
    - deps: ms@0.7.2
    - deps: statuses@~1.3.1
  * deps: serve-static@~1.11.2
    - deps: send@0.14.2
  * deps: type-is@~1.6.14
    - deps: mime-types@~2.1.13

4.14.0 / 2016-06-16
===================

  * Add `acceptRanges` option to `res.sendFile`/`res.sendfile`
  * Add `cacheControl` option to `res.sendFile`/`res.sendfile`
  * Add `options` argument to `req.range`
    - Includes the `combine` option
  * Encode URL in `res.location`/`res.redirect` if not already encoded
  * Fix some redirect handling in `res.sendFile`/`res.sendfile`
  * Fix Windows absolute path check using forward slashes
  * Improve error with invalid arguments to `req.get()`
  * Improve performance for `res.json`/`res.jsonp` in most cases
  * Improve `Range` header handling in `res.sendFile`/`res.sendfile`
  * deps: accepts@~1.3.3
    - Fix including type extensions in parameters in `Accept` parsing
    - Fix parsing `Accept` parameters with quoted equals
    - Fix parsing `Accept` parameters with quoted semicolons
    - Many performance improvements
    - deps: mime-types@~2.1.11
    - deps: negotiator@0.6.1
  * deps: content-type@~1.0.2
    - perf: enable strict mode
  * deps: cookie@0.3.1
    - Add `sameSite` option
    - Fix cookie `Max-Age` to never be a floating point number
    - Improve error message when `encode` is not a function
    - Improve error message when `expires` is not a `Date`
    - Throw better error for invalid argument to parse
    - Throw on invalid values provided to `serialize`
    - perf: enable strict mode
    - perf: hoist regular expression
    - perf: use for loop in parse
    - perf: use string concatenation for serialization
  * deps: finalhandler@0.5.0
    - Change invalid or non-numeric status code to 500
    - Overwrite status message to match set status code
    - Prefer `err.statusCode` if `err.status` is invalid
    - Set response headers from `err.headers` object
    - Use `statuses` instead of `http` module for status messages
  * deps: proxy-addr@~1.1.2
    - Fix accepting various invalid netmasks
    - Fix IPv6-mapped IPv4 validation edge cases
    - IPv4 netmasks must be contiguous
    - IPv6 addresses cannot be used as a netmask
    - deps: ipaddr.js@1.1.1
  * deps: qs@6.2.0
    - Add `decoder` option in `parse` function
  * deps: range-parser@~1.2.0
    - Add `combine` option to combine overlapping ranges
    - Fix incorrectly returning -1 when there is at least one valid range
    - perf: remove internal function
  * deps: send@0.14.1
    - Add `acceptRanges` option
    - Add `cacheControl` option
    - Attempt to combine multiple ranges into single range
    - Correctly inherit from `Stream` class
    - Fix `Content-Range` header in 416 responses when using `start`/`end` options
    - Fix `Content-Range` header missing from default 416 responses
    - Fix redirect error when `path` contains raw non-URL characters
    - Fix redirect when `path` starts with multiple forward slashes
    - Ignore non-byte `Range` headers
    - deps: http-errors@~1.5.0
    - deps: range-parser@~1.2.0
    - deps: statuses@~1.3.0
    - perf: remove argument reassignment
  * deps: serve-static@~1.11.1
    - Add `acceptRanges` option
    - Add `cacheControl` option
    - Attempt to combine multiple ranges into single range
    - Fix redirect error when `req.url` contains raw non-URL characters
    - Ignore non-byte `Range` headers
    - Use status code 301 for redirects
    - deps: send@0.14.1
  * deps: type-is@~1.6.13
    - Fix type error when given invalid type to match against
    - deps: mime-types@~2.1.11
  * deps: vary@~1.1.0
    - Only accept valid field names in the `field` argument
  * perf: use strict equality when possible

4.13.4 / 2016-01-21
===================

  * deps: content-disposition@0.5.1
    - perf: enable strict mode
  * deps: cookie@0.1.5
    - Throw on invalid values provided to `serialize`
  * deps: depd@~1.1.0
    - Support web browser loading
    - perf: enable strict mode
  * deps: escape-html@~1.0.3
    - perf: enable strict mode
    - perf: optimize string replacement
    - perf: use faster string coercion
  * deps: finalhandler@0.4.1
    - deps: escape-html@~1.0.3
  * deps: merge-descriptors@1.0.1
    - perf: enable strict mode
  * deps: methods@~1.1.2
    - perf: enable strict mode
  * deps: parseurl@~1.3.1
    - perf: enable strict mode
  * deps: proxy-addr@~1.0.10
    - deps: ipaddr.js@1.0.5
    - perf: enable strict mode
  * deps: range-parser@~1.0.3
    - perf: enable strict mode
  * deps: send@0.13.1
    - deps: depd@~1.1.0
    - deps: destroy@~1.0.4
    - deps: escape-html@~1.0.3
    - deps: range-parser@~1.0.3
  * deps: serve-static@~1.10.2
    - deps: escape-html@~1.0.3
    - deps: parseurl@~1.3.0
    - deps: send@0.13.1

4.13.3 / 2015-08-02
===================

  * Fix infinite loop condition using `mergeParams: true`
  * Fix inner numeric indices incorrectly altering parent `req.params`

4.13.2 / 2015-07-31
===================

  * deps: accepts@~1.2.12
    - deps: mime-types@~2.1.4
  * deps: array-flatten@1.1.1
    - perf: enable strict mode
  * deps: path-to-regexp@0.1.7
    - Fix regression with escaped round brackets and matching groups
  * deps: type-is@~1.6.6
    - deps: mime-types@~2.1.4

4.13.1 / 2015-07-05
===================

  * deps: accepts@~1.2.10
    - deps: mime-types@~2.1.2
  * deps: qs@4.0.0
    - Fix dropping parameters like `hasOwnProperty`
    - Fix various parsing edge cases
  * deps: type-is@~1.6.4
    - deps: mime-types@~2.1.2
    - perf: enable strict mode
    - perf: remove argument reassignment

4.13.0 / 2015-06-20
===================

  * Add settings to debug output
  * Fix `res.format` error when only `default` provided
  * Fix issue where `next('route')` in `app.param` would incorrectly skip values
  * Fix hiding platform issues with `decodeURIComponent`
    - Only `URIError`s are a 400
  * Fix using `*` before params in routes
  * Fix using capture groups before params in routes
  * Simplify `res.cookie` to call `res.append`
  * Use `array-flatten` module for flattening arrays
  * deps: accepts@~1.2.9
    - deps: mime-types@~2.1.1
    - perf: avoid argument reassignment & argument slice
    - perf: avoid negotiator recursive construction
    - perf: enable strict mode
    - perf: remove unnecessary bitwise operator
  * deps: cookie@0.1.3
    - perf: deduce the scope of try-catch deopt
    - perf: remove argument reassignments
  * deps: escape-html@1.0.2
  * deps: etag@~1.7.0
    - Always include entity length in ETags for hash length extensions
    - Generate non-Stats ETags using MD5 only (no longer CRC32)
    - Improve stat performance by removing hashing
    - Improve support for JXcore
    - Remove base64 padding in ETags to shorten
    - Support "fake" stats objects in environments without fs
    - Use MD5 instead of MD4 in weak ETags over 1KB
  * deps: finalhandler@0.4.0
    - Fix a false-positive when unpiping in Node.js 0.8
    - Support `statusCode` property on `Error` objects
    - Use `unpipe` module for unpiping requests
    - deps: escape-html@1.0.2
    - deps: on-finished@~2.3.0
    - perf: enable strict mode
    - perf: remove argument reassignment
  * deps: fresh@0.3.0
    - Add weak `ETag` matching support
  * deps: on-finished@~2.3.0
    - Add defined behavior for HTTP `CONNECT` requests
    - Add defined behavior for HTTP `Upgrade` requests
    - deps: ee-first@1.1.1
  * deps: path-to-regexp@0.1.6
  * deps: send@0.13.0
    - Allow Node.js HTTP server to set `Date` response header
    - Fix incorrectly removing `Content-Location` on 304 response
    - Improve the default redirect response headers
    - Send appropriate headers on default error response
    - Use `http-errors` for standard emitted errors
    - Use `statuses` instead of `http` module for status messages
    - deps: escape-html@1.0.2
    - deps: etag@~1.7.0
    - deps: fresh@0.3.0
    - deps: on-finished@~2.3.0
    - perf: enable strict mode
    - perf: remove unnecessary array allocations
  * deps: serve-static@~1.10.0
    - Add `fallthrough` option
    - Fix reading options from options prototype
    - Improve the default redirect response headers
    - Malformed URLs now `next()` instead of 400
    - deps: escape-html@1.0.2
    - deps: send@0.13.0
    - perf: enable strict mode
    - perf: remove argument reassignment
  * deps: type-is@~1.6.3
    - deps: mime-types@~2.1.1
    - perf: reduce try block size
    - perf: remove bitwise operations
  * perf: enable strict mode
  * perf: isolate `app.render` try block
  * perf: remove argument reassignments in application
  * perf: remove argument reassignments in request prototype
  * perf: remove argument reassignments in response prototype
  * perf: remove argument reassignments in routing
  * perf: remove argument reassignments in `View`
  * perf: skip attempting to decode zero length string
  * perf: use saved reference to `http.STATUS_CODES`

4.12.4 / 2015-05-17
===================

  * deps: accepts@~1.2.7
    - deps: mime-types@~2.0.11
    - deps: negotiator@0.5.3
  * deps: debug@~2.2.0
    - deps: ms@0.7.1
  * deps: depd@~1.0.1
  * deps: etag@~1.6.0
    - Improve support for JXcore
    - Support "fake" stats objects in environments without `fs`
  * deps: finalhandler@0.3.6
    - deps: debug@~2.2.0
    - deps: on-finished@~2.2.1
  * deps: on-finished@~2.2.1
    - Fix `isFinished(req)` when data buffered
  * deps: proxy-addr@~1.0.8
    - deps: ipaddr.js@1.0.1
  * deps: qs@2.4.2
   - Fix allowing parameters like `constructor`
  * deps: send@0.12.3
    - deps: debug@~2.2.0
    - deps: depd@~1.0.1
    - deps: etag@~1.6.0
    - deps: ms@0.7.1
    - deps: on-finished@~2.2.1
  * deps: serve-static@~1.9.3
    - deps: send@0.12.3
  * deps: type-is@~1.6.2
    - deps: mime-types@~2.0.11

4.12.3 / 2015-03-17
===================

  * deps: accepts@~1.2.5
    - deps: mime-types@~2.0.10
  * deps: debug@~2.1.3
    - Fix high intensity foreground color for bold
    - deps: ms@0.7.0
  * deps: finalhandler@0.3.4
    - deps: debug@~2.1.3
  * deps: proxy-addr@~1.0.7
    - deps: ipaddr.js@0.1.9
  * deps: qs@2.4.1
    - Fix error when parameter `hasOwnProperty` is present
  * deps: send@0.12.2
    - Throw errors early for invalid `extensions` or `index` options
    - deps: debug@~2.1.3
  * deps: serve-static@~1.9.2
    - deps: send@0.12.2
  * deps: type-is@~1.6.1
    - deps: mime-types@~2.0.10

4.12.2 / 2015-03-02
===================

  * Fix regression where `"Request aborted"` is logged using `res.sendFile`

4.12.1 / 2015-03-01
===================

  * Fix constructing application with non-configurable prototype properties
  * Fix `ECONNRESET` errors from `res.sendFile` usage
  * Fix `req.host` when using "trust proxy" hops count
  * Fix `req.protocol`/`req.secure` when using "trust proxy" hops count
  * Fix wrong `code` on aborted connections from `res.sendFile`
  * deps: merge-descriptors@1.0.0

4.12.0 / 2015-02-23
===================

  * Fix `"trust proxy"` setting to inherit when app is mounted
  * Generate `ETag`s for all request responses
    - No longer restricted to only responses for `GET` and `HEAD` requests
  * Use `content-type` to parse `Content-Type` headers
  * deps: accepts@~1.2.4
    - Fix preference sorting to be stable for long acceptable lists
    - deps: mime-types@~2.0.9
    - deps: negotiator@0.5.1
  * deps: cookie-signature@1.0.6
  * deps: send@0.12.1
    - Always read the stat size from the file
    - Fix mutating passed-in `options`
    - deps: mime@1.3.4
  * deps: serve-static@~1.9.1
    - deps: send@0.12.1
  * deps: type-is@~1.6.0
    - fix argument reassignment
    - fix false-positives in `hasBody` `Transfer-Encoding` check
    - support wildcard for both type and subtype (`*/*`)
    - deps: mime-types@~2.0.9

4.11.2 / 2015-02-01
===================

  * Fix `res.redirect` double-calling `res.end` for `HEAD` requests
  * deps: accepts@~1.2.3
    - deps: mime-types@~2.0.8
  * deps: proxy-addr@~1.0.6
    - deps: ipaddr.js@0.1.8
  * deps: type-is@~1.5.6
    - deps: mime-types@~2.0.8

4.11.1 / 2015-01-20
===================

  * deps: send@0.11.1
    - Fix root path disclosure
  * deps: serve-static@~1.8.1
    - Fix redirect loop in Node.js 0.11.14
    - Fix root path disclosure
    - deps: send@0.11.1

4.11.0 / 2015-01-13
===================

  * Add `res.append(field, val)` to append headers
  * Deprecate leading `:` in `name` for `app.param(name, fn)`
  * Deprecate `req.param()` -- use `req.params`, `req.body`, or `req.query` instead
  * Deprecate `app.param(fn)`
  * Fix `OPTIONS` responses to include the `HEAD` method properly
  * Fix `res.sendFile` not always detecting aborted connection
  * Match routes iteratively to prevent stack overflows
  * deps: accepts@~1.2.2
    - deps: mime-types@~2.0.7
    - deps: negotiator@0.5.0
  * deps: send@0.11.0
    - deps: debug@~2.1.1
    - deps: etag@~1.5.1
    - deps: ms@0.7.0
    - deps: on-finished@~2.2.0
  * deps: serve-static@~1.8.0
    - deps: send@0.11.0

4.10.8 / 2015-01-13
===================

  * Fix crash from error within `OPTIONS` response handler
  * deps: proxy-addr@~1.0.5
    - deps: ipaddr.js@0.1.6

4.10.7 / 2015-01-04
===================

  * Fix `Allow` header for `OPTIONS` to not contain duplicate methods
  * Fix incorrect "Request aborted" for `res.sendFile` when `HEAD` or 304
  * deps: debug@~2.1.1
  * deps: finalhandler@0.3.3
    - deps: debug@~2.1.1
    - deps: on-finished@~2.2.0
  * deps: methods@~1.1.1
  * deps: on-finished@~2.2.0
  * deps: serve-static@~1.7.2
    - Fix potential open redirect when mounted at root
  * deps: type-is@~1.5.5
    - deps: mime-types@~2.0.7

4.10.6 / 2014-12-12
===================

  * Fix exception in `req.fresh`/`req.stale` without response headers

4.10.5 / 2014-12-10
===================

  * Fix `res.send` double-calling `res.end` for `HEAD` requests
  * deps: accepts@~1.1.4
    - deps: mime-types@~2.0.4
  * deps: type-is@~1.5.4
    - deps: mime-types@~2.0.4

4.10.4 / 2014-11-24
===================

  * Fix `res.sendfile` logging standard write errors

4.10.3 / 2014-11-23
===================

  * Fix `res.sendFile` logging standard write errors
  * deps: etag@~1.5.1
  * deps: proxy-addr@~1.0.4
    - deps: ipaddr.js@0.1.5
  * deps: qs@2.3.3
    - Fix `arrayLimit` behavior

4.10.2 / 2014-11-09
===================

  * Correctly invoke async router callback asynchronously
  * deps: accepts@~1.1.3
    - deps: mime-types@~2.0.3
  * deps: type-is@~1.5.3
    - deps: mime-types@~2.0.3

4.10.1 / 2014-10-28
===================

  * Fix handling of URLs containing `://` in the path
  * deps: qs@2.3.2
    - Fix parsing of mixed objects and values

4.10.0 / 2014-10-23
===================

  * Add support for `app.set('views', array)`
    - Views are looked up in sequence in array of directories
  * Fix `res.send(status)` to mention `res.sendStatus(status)`
  * Fix handling of invalid empty URLs
  * Use `content-disposition` module for `res.attachment`/`res.download`
    - Sends standards-compliant `Content-Disposition` header
    - Full Unicode support
  * Use `path.resolve` in view lookup
  * deps: debug@~2.1.0
    - Implement `DEBUG_FD` env variable support
  * deps: depd@~1.0.0
  * deps: etag@~1.5.0
    - Improve string performance
    - Slightly improve speed for weak ETags over 1KB
  * deps: finalhandler@0.3.2
    - Terminate in progress response only on error
    - Use `on-finished` to determine request status
    - deps: debug@~2.1.0
    - deps: on-finished@~2.1.1
  * deps: on-finished@~2.1.1
    - Fix handling of pipelined requests
  * deps: qs@2.3.0
    - Fix parsing of mixed implicit and explicit arrays
  * deps: send@0.10.1
    - deps: debug@~2.1.0
    - deps: depd@~1.0.0
    - deps: etag@~1.5.0
    - deps: on-finished@~2.1.1
  * deps: serve-static@~1.7.1
    - deps: send@0.10.1

4.9.8 / 2014-10-17
==================

  * Fix `res.redirect` body when redirect status specified
  * deps: accepts@~1.1.2
    - Fix error when media type has invalid parameter
    - deps: negotiator@0.4.9

4.9.7 / 2014-10-10
==================

  * Fix using same param name in array of paths

4.9.6 / 2014-10-08
==================

  * deps: accepts@~1.1.1
    - deps: mime-types@~2.0.2
    - deps: negotiator@0.4.8
  * deps: serve-static@~1.6.4
    - Fix redirect loop when index file serving disabled
  * deps: type-is@~1.5.2
    - deps: mime-types@~2.0.2

4.9.5 / 2014-09-24
==================

  * deps: etag@~1.4.0
  * deps: proxy-addr@~1.0.3
    - Use `forwarded` npm module
  * deps: send@0.9.3
    - deps: etag@~1.4.0
  * deps: serve-static@~1.6.3
    - deps: send@0.9.3

4.9.4 / 2014-09-19
==================

  * deps: qs@2.2.4
    - Fix issue with object keys starting with numbers truncated

4.9.3 / 2014-09-18
==================

  * deps: proxy-addr@~1.0.2
    - Fix a global leak when multiple subnets are trusted
    - deps: ipaddr.js@0.1.3

4.9.2 / 2014-09-17
==================

  * Fix regression for empty string `path` in `app.use`
  * Fix `router.use` to accept array of middleware without path
  * Improve error message for bad `app.use` arguments

4.9.1 / 2014-09-16
==================

  * Fix `app.use` to accept array of middleware without path
  * deps: depd@0.4.5
  * deps: etag@~1.3.1
  * deps: send@0.9.2
    - deps: depd@0.4.5
    - deps: etag@~1.3.1
    - deps: range-parser@~1.0.2
  * deps: serve-static@~1.6.2
    - deps: send@0.9.2

4.9.0 / 2014-09-08
==================

  * Add `res.sendStatus`
  * Invoke callback for sendfile when client aborts
    - Applies to `res.sendFile`, `res.sendfile`, and `res.download`
    - `err` will be populated with request aborted error
  * Support IP address host in `req.subdomains`
  * Use `etag` to generate `ETag` headers
  * deps: accepts@~1.1.0
    - update `mime-types`
  * deps: cookie-signature@1.0.5
  * deps: debug@~2.0.0
  * deps: finalhandler@0.2.0
    - Set `X-Content-Type-Options: nosniff` header
    - deps: debug@~2.0.0
  * deps: fresh@0.2.4
  * deps: media-typer@0.3.0
    - Throw error when parameter format invalid on parse
  * deps: qs@2.2.3
    - Fix issue where first empty value in array is discarded
  * deps: range-parser@~1.0.2
  * deps: send@0.9.1
    - Add `lastModified` option
    - Use `etag` to generate `ETag` header
    - deps: debug@~2.0.0
    - deps: fresh@0.2.4
  * deps: serve-static@~1.6.1
    - Add `lastModified` option
    - deps: send@0.9.1
  * deps: type-is@~1.5.1
    - fix `hasbody` to be true for `content-length: 0`
    - deps: media-typer@0.3.0
    - deps: mime-types@~2.0.1
  * deps: vary@~1.0.0
    - Accept valid `Vary` header string as `field`

4.8.8 / 2014-09-04
==================

  * deps: send@0.8.5
    - Fix a path traversal issue when using `root`
    - Fix malicious path detection for empty string path
  * deps: serve-static@~1.5.4
    - deps: send@0.8.5

4.8.7 / 2014-08-29
==================

  * deps: qs@2.2.2
    - Remove unnecessary cloning

4.8.6 / 2014-08-27
==================

  * deps: qs@2.2.0
    - Array parsing fix
    - Performance improvements

4.8.5 / 2014-08-18
==================

  * deps: send@0.8.3
    - deps: destroy@1.0.3
    - deps: on-finished@2.1.0
  * deps: serve-static@~1.5.3
    - deps: send@0.8.3

4.8.4 / 2014-08-14
==================

  * deps: qs@1.2.2
  * deps: send@0.8.2
    - Work around `fd` leak in Node.js 0.10 for `fs.ReadStream`
  * deps: serve-static@~1.5.2
    - deps: send@0.8.2

4.8.3 / 2014-08-10
==================

  * deps: parseurl@~1.3.0
  * deps: qs@1.2.1
  * deps: serve-static@~1.5.1
    - Fix parsing of weird `req.originalUrl` values
    - deps: parseurl@~1.3.0
    - deps: utils-merge@1.0.0

4.8.2 / 2014-08-07
==================

  * deps: qs@1.2.0
    - Fix parsing array of objects

4.8.1 / 2014-08-06
==================

  * fix incorrect deprecation warnings on `res.download`
  * deps: qs@1.1.0
    - Accept urlencoded square brackets
    - Accept empty values in implicit array notation

4.8.0 / 2014-08-05
==================

  * add `res.sendFile`
    - accepts a file system path instead of a URL
    - requires an absolute path or `root` option specified
  * deprecate `res.sendfile` -- use `res.sendFile` instead
  * support mounted app as any argument to `app.use()`
  * deps: qs@1.0.2
    - Complete rewrite
    - Limits array length to 20
    - Limits object depth to 5
    - Limits parameters to 1,000
  * deps: send@0.8.1
    - Add `extensions` option
  * deps: serve-static@~1.5.0
    - Add `extensions` option
    - deps: send@0.8.1

4.7.4 / 2014-08-04
==================

  * fix `res.sendfile` regression for serving directory index files
  * deps: send@0.7.4
    - Fix incorrect 403 on Windows and Node.js 0.11
    - Fix serving index files without root dir
  * deps: serve-static@~1.4.4
    - deps: send@0.7.4

4.7.3 / 2014-08-04
==================

  * deps: send@0.7.3
    - Fix incorrect 403 on Windows and Node.js 0.11
  * deps: serve-static@~1.4.3
    - Fix incorrect 403 on Windows and Node.js 0.11
    - deps: send@0.7.3

4.7.2 / 2014-07-27
==================

  * deps: depd@0.4.4
    - Work-around v8 generating empty stack traces
  * deps: send@0.7.2
    - deps: depd@0.4.4
  * deps: serve-static@~1.4.2

4.7.1 / 2014-07-26
==================

  * deps: depd@0.4.3
    - Fix exception when global `Error.stackTraceLimit` is too low
  * deps: send@0.7.1
    - deps: depd@0.4.3
  * deps: serve-static@~1.4.1

4.7.0 / 2014-07-25
==================

  * fix `req.protocol` for proxy-direct connections
  * configurable query parser with `app.set('query parser', parser)`
    - `app.set('query parser', 'extended')` parse with "qs" module
    - `app.set('query parser', 'simple')` parse with "querystring" core module
    - `app.set('query parser', false)` disable query string parsing
    - `app.set('query parser', true)` enable simple parsing
  * deprecate `res.json(status, obj)` -- use `res.status(status).json(obj)` instead
  * deprecate `res.jsonp(status, obj)` -- use `res.status(status).jsonp(obj)` instead
  * deprecate `res.send(status, body)` -- use `res.status(status).send(body)` instead
  * deps: debug@1.0.4
  * deps: depd@0.4.2
    - Add `TRACE_DEPRECATION` environment variable
    - Remove non-standard grey color from color output
    - Support `--no-deprecation` argument
    - Support `--trace-deprecation` argument
  * deps: finalhandler@0.1.0
    - Respond after request fully read
    - deps: debug@1.0.4
  * deps: parseurl@~1.2.0
    - Cache URLs based on original value
    - Remove no-longer-needed URL mis-parse work-around
    - Simplify the "fast-path" `RegExp`
  * deps: send@0.7.0
    - Add `dotfiles` option
    - Cap `maxAge` value to 1 year
    - deps: debug@1.0.4
    - deps: depd@0.4.2
  * deps: serve-static@~1.4.0
    - deps: parseurl@~1.2.0
    - deps: send@0.7.0
  * perf: prevent multiple `Buffer` creation in `res.send`

4.6.1 / 2014-07-12
==================

  * fix `subapp.mountpath` regression for `app.use(subapp)`

4.6.0 / 2014-07-11
==================

  * accept multiple callbacks to `app.use()`
  * add explicit "Rosetta Flash JSONP abuse" protection
    - previous versions are not vulnerable; this is just explicit protection
  * catch errors in multiple `req.param(name, fn)` handlers
  * deprecate `res.redirect(url, status)` -- use `res.redirect(status, url)` instead
  * fix `res.send(status, num)` to send `num` as json (not error)
  * remove unnecessary escaping when `res.jsonp` returns JSON response
  * support non-string `path` in `app.use(path, fn)`
    - supports array of paths
    - supports `RegExp`
  * router: fix optimization on router exit
  * router: refactor location of `try` blocks
  * router: speed up standard `app.use(fn)`
  * deps: debug@1.0.3
    - Add support for multiple wildcards in namespaces
  * deps: finalhandler@0.0.3
    - deps: debug@1.0.3
  * deps: methods@1.1.0
    - add `CONNECT`
  * deps: parseurl@~1.1.3
    - faster parsing of href-only URLs
  * deps: path-to-regexp@0.1.3
  * deps: send@0.6.0
    - deps: debug@1.0.3
  * deps: serve-static@~1.3.2
    - deps: parseurl@~1.1.3
    - deps: send@0.6.0
  * perf: fix arguments reassign deopt in some `res` methods

4.5.1 / 2014-07-06
==================

 * fix routing regression when altering `req.method`

4.5.0 / 2014-07-04
==================

 * add deprecation message to non-plural `req.accepts*`
 * add deprecation message to `res.send(body, status)`
 * add deprecation message to `res.vary()`
 * add `headers` option to `res.sendfile`
   - use to set headers on successful file transfer
 * add `mergeParams` option to `Router`
   - merges `req.params` from parent routes
 * add `req.hostname` -- correct name for what `req.host` returns
 * deprecate things with `depd` module
 * deprecate `req.host` -- use `req.hostname` instead
 * fix behavior when handling request without routes
 * fix handling when `route.all` is only route
 * invoke `router.param()` only when route matches
 * restore `req.params` after invoking router
 * use `finalhandler` for final response handling
 * use `media-typer` to alter content-type charset
 * deps: accepts@~1.0.7
 * deps: send@0.5.0
   - Accept string for `maxage` (converted by `ms`)
   - Include link in default redirect response
 * deps: serve-static@~1.3.0
   - Accept string for `maxAge` (converted by `ms`)
   - Add `setHeaders` option
   - Include HTML link in redirect response
   - deps: send@0.5.0
 * deps: type-is@~1.3.2

4.4.5 / 2014-06-26
==================

 * deps: cookie-signature@1.0.4
   - fix for timing attacks

4.4.4 / 2014-06-20
==================

 * fix `res.attachment` Unicode filenames in Safari
 * fix "trim prefix" debug message in `express:router`
 * deps: accepts@~1.0.5
 * deps: buffer-crc32@0.2.3

4.4.3 / 2014-06-11
==================

 * fix persistence of modified `req.params[name]` from `app.param()`
 * deps: accepts@1.0.3
   - deps: negotiator@0.4.6
 * deps: debug@1.0.2
 * deps: send@0.4.3
   - Do not throw uncatchable error on file open race condition
   - Use `escape-html` for HTML escaping
   - deps: debug@1.0.2
   - deps: finished@1.2.2
   - deps: fresh@0.2.2
 * deps: serve-static@1.2.3
   - Do not throw uncatchable error on file open race condition
   - deps: send@0.4.3

4.4.2 / 2014-06-09
==================

 * fix catching errors from top-level handlers
 * use `vary` module for `res.vary`
 * deps: debug@1.0.1
 * deps: proxy-addr@1.0.1
 * deps: send@0.4.2
   - fix "event emitter leak" warnings
   - deps: debug@1.0.1
   - deps: finished@1.2.1
 * deps: serve-static@1.2.2
   - fix "event emitter leak" warnings
   - deps: send@0.4.2
 * deps: type-is@1.2.1

4.4.1 / 2014-06-02
==================

 * deps: methods@1.0.1
 * deps: send@0.4.1
   - Send `max-age` in `Cache-Control` in correct format
 * deps: serve-static@1.2.1
   - use `escape-html` for escaping
   - deps: send@0.4.1

4.4.0 / 2014-05-30
==================

 * custom etag control with `app.set('etag', val)`
   - `app.set('etag', function(body, encoding){ return '"etag"' })` custom etag generation
   - `app.set('etag', 'weak')` weak tag
   - `app.set('etag', 'strong')` strong etag
   - `app.set('etag', false)` turn off
   - `app.set('etag', true)` standard etag
 * mark `res.send` ETag as weak and reduce collisions
 * update accepts to 1.0.2
   - Fix interpretation when header not in request
 * update send to 0.4.0
   - Calculate ETag with md5 for reduced collisions
   - Ignore stream errors after request ends
   - deps: debug@0.8.1
 * update serve-static to 1.2.0
   - Calculate ETag with md5 for reduced collisions
   - Ignore stream errors after request ends
   - deps: send@0.4.0

4.3.2 / 2014-05-28
==================

 * fix handling of errors from `router.param()` callbacks

4.3.1 / 2014-05-23
==================

 * revert "fix behavior of multiple `app.VERB` for the same path"
   - this caused a regression in the order of route execution

4.3.0 / 2014-05-21
==================

 * add `req.baseUrl` to access the path stripped from `req.url` in routes
 * fix behavior of multiple `app.VERB` for the same path
 * fix issue routing requests among sub routers
 * invoke `router.param()` only when necessary instead of every match
 * proper proxy trust with `app.set('trust proxy', trust)`
   - `app.set('trust proxy', 1)` trust first hop
   - `app.set('trust proxy', 'loopback')` trust loopback addresses
   - `app.set('trust proxy', '10.0.0.1')` trust single IP
   - `app.set('trust proxy', '10.0.0.1/16')` trust subnet
   - `app.set('trust proxy', '10.0.0.1, 10.0.0.2')` trust list
   - `app.set('trust proxy', false)` turn off
   - `app.set('trust proxy', true)` trust everything
 * set proper `charset` in `Content-Type` for `res.send`
 * update type-is to 1.2.0
   - support suffix matching

4.2.0 / 2014-05-11
==================

 * deprecate `app.del()` -- use `app.delete()` instead
 * deprecate `res.json(obj, status)` -- use `res.json(status, obj)` instead
   - the edge-case `res.json(status, num)` requires `res.status(status).json(num)`
 * deprecate `res.jsonp(obj, status)` -- use `res.jsonp(status, obj)` instead
   - the edge-case `res.jsonp(status, num)` requires `res.status(status).jsonp(num)`
 * fix `req.next` when inside router instance
 * include `ETag` header in `HEAD` requests
 * keep previous `Content-Type` for `res.jsonp`
 * support PURGE method
   - add `app.purge`
   - add `router.purge`
   - include PURGE in `app.all`
 * update debug to 0.8.0
   - add `enable()` method
   - change from stderr to stdout
 * update methods to 1.0.0
   - add PURGE

4.1.2 / 2014-05-08
==================

 * fix `req.host` for IPv6 literals
 * fix `res.jsonp` error if callback param is object

4.1.1 / 2014-04-27
==================

 * fix package.json to reflect supported node version

4.1.0 / 2014-04-24
==================

 * pass options from `res.sendfile` to `send`
 * preserve casing of headers in `res.header` and `res.set`
 * support unicode file names in `res.attachment` and `res.download`
 * update accepts to 1.0.1
   - deps: negotiator@0.4.0
 * update cookie to 0.1.2
   - Fix for maxAge == 0
   - made compat with expires field
 * update send to 0.3.0
   - Accept API options in options object
   - Coerce option types
   - Control whether to generate etags
   - Default directory access to 403 when index disabled
   - Fix sending files with dots without root set
   - Include file path in etag
   - Make "Can't set headers after they are sent." catchable
   - Send full entity-body for multi range requests
   - Set etags to "weak"
   - Support "If-Range" header
   - Support multiple index paths
   - deps: mime@1.2.11
 * update serve-static to 1.1.0
   - Accept options directly to `send` module
   - Resolve relative paths at middleware setup
   - Use parseurl to parse the URL from request
   - deps: send@0.3.0
 * update type-is to 1.1.0
   - add non-array values support
   - add `multipart` as a shorthand

4.0.0 / 2014-04-09
==================

 * remove:
   - node 0.8 support
   - connect and connect's patches except for charset handling
   - express(1) - moved to [express-generator](https://github.com/expressjs/generator)
   - `express.createServer()` - it has been deprecated for a long time. Use `express()`
   - `app.configure` - use logic in your own app code
   - `app.router` - is removed
   - `req.auth` - use `basic-auth` instead
   - `req.accepted*` - use `req.accepts*()` instead
   - `res.location` - relative URL resolution is removed
   - `res.charset` - include the charset in the content type when using `res.set()`
   - all bundled middleware except `static`
 * change:
   - `app.route` -> `app.mountpath` when mounting an express app in another express app
   - `json spaces` no longer enabled by default in development
   - `req.accepts*` -> `req.accepts*s` - i.e. `req.acceptsEncoding` -> `req.acceptsEncodings`
   - `req.params` is now an object instead of an array
   - `res.locals` is no longer a function. It is a plain js object. Treat it as such.
   - `res.headerSent` -> `res.headersSent` to match node.js ServerResponse object
 * refactor:
   - `req.accepts*` with [accepts](https://github.com/expressjs/accepts)
   - `req.is` with [type-is](https://github.com/expressjs/type-is)
   - [path-to-regexp](https://github.com/component/path-to-regexp)
 * add:
   - `app.router()` - returns the app Router instance
   - `app.route()` - Proxy to the app's `Router#route()` method to create a new route
   - Router & Route - public API

3.21.2 / 2015-07-31
===================

  * deps: connect@2.30.2
    - deps: body-parser@~1.13.3
    - deps: compression@~1.5.2
    - deps: errorhandler@~1.4.2
    - deps: method-override@~2.3.5
    - deps: serve-index@~1.7.2
    - deps: type-is@~1.6.6
    - deps: vhost@~3.0.1
  * deps: vary@~1.0.1
    - Fix setting empty header from empty `field`
    - perf: enable strict mode
    - perf: remove argument reassignments

3.21.1 / 2015-07-05
===================

  * deps: basic-auth@~1.0.3
  * deps: connect@2.30.1
    - deps: body-parser@~1.13.2
    - deps: compression@~1.5.1
    - deps: errorhandler@~1.4.1
    - deps: morgan@~1.6.1
    - deps: pause@0.1.0
    - deps: qs@4.0.0
    - deps: serve-index@~1.7.1
    - deps: type-is@~1.6.4

3.21.0 / 2015-06-18
===================

  * deps: basic-auth@1.0.2
    - perf: enable strict mode
    - perf: hoist regular expression
    - perf: parse with regular expressions
    - perf: remove argument reassignment
  * deps: connect@2.30.0
    - deps: body-parser@~1.13.1
    - deps: bytes@2.1.0
    - deps: compression@~1.5.0
    - deps: cookie@0.1.3
    - deps: cookie-parser@~1.3.5
    - deps: csurf@~1.8.3
    - deps: errorhandler@~1.4.0
    - deps: express-session@~1.11.3
    - deps: finalhandler@0.4.0
    - deps: fresh@0.3.0
    - deps: morgan@~1.6.0
    - deps: serve-favicon@~2.3.0
    - deps: serve-index@~1.7.0
    - deps: serve-static@~1.10.0
    - deps: type-is@~1.6.3
  * deps: cookie@0.1.3
    - perf: deduce the scope of try-catch deopt
    - perf: remove argument reassignments
  * deps: escape-html@1.0.2
  * deps: etag@~1.7.0
    - Always include entity length in ETags for hash length extensions
    - Generate non-Stats ETags using MD5 only (no longer CRC32)
    - Improve stat performance by removing hashing
    - Improve support for JXcore
    - Remove base64 padding in ETags to shorten
    - Support "fake" stats objects in environments without fs
    - Use MD5 instead of MD4 in weak ETags over 1KB
  * deps: fresh@0.3.0
    - Add weak `ETag` matching support
  * deps: mkdirp@0.5.1
    - Work in global strict mode
  * deps: send@0.13.0
    - Allow Node.js HTTP server to set `Date` response header
    - Fix incorrectly removing `Content-Location` on 304 response
    - Improve the default redirect response headers
    - Send appropriate headers on default error response
    - Use `http-errors` for standard emitted errors
    - Use `statuses` instead of `http` module for status messages
    - deps: escape-html@1.0.2
    - deps: etag@~1.7.0
    - deps: fresh@0.3.0
    - deps: on-finished@~2.3.0
    - perf: enable strict mode
    - perf: remove unnecessary array allocations

3.20.3 / 2015-05-17
===================

  * deps: connect@2.29.2
    - deps: body-parser@~1.12.4
    - deps: compression@~1.4.4
    - deps: connect-timeout@~1.6.2
    - deps: debug@~2.2.0
    - deps: depd@~1.0.1
    - deps: errorhandler@~1.3.6
    - deps: finalhandler@0.3.6
    - deps: method-override@~2.3.3
    - deps: morgan@~1.5.3
    - deps: qs@2.4.2
    - deps: response-time@~2.3.1
    - deps: serve-favicon@~2.2.1
    - deps: serve-index@~1.6.4
    - deps: serve-static@~1.9.3
    - deps: type-is@~1.6.2
  * deps: debug@~2.2.0
    - deps: ms@0.7.1
  * deps: depd@~1.0.1
  * deps: proxy-addr@~1.0.8
    - deps: ipaddr.js@1.0.1
  * deps: send@0.12.3
    - deps: debug@~2.2.0
    - deps: depd@~1.0.1
    - deps: etag@~1.6.0
    - deps: ms@0.7.1
    - deps: on-finished@~2.2.1

3.20.2 / 2015-03-16
===================

  * deps: connect@2.29.1
    - deps: body-parser@~1.12.2
    - deps: compression@~1.4.3
    - deps: connect-timeout@~1.6.1
    - deps: debug@~2.1.3
    - deps: errorhandler@~1.3.5
    - deps: express-session@~1.10.4
    - deps: finalhandler@0.3.4
    - deps: method-override@~2.3.2
    - deps: morgan@~1.5.2
    - deps: qs@2.4.1
    - deps: serve-index@~1.6.3
    - deps: serve-static@~1.9.2
    - deps: type-is@~1.6.1
  * deps: debug@~2.1.3
    - Fix high intensity foreground color for bold
    - deps: ms@0.7.0
  * deps: merge-descriptors@1.0.0
  * deps: proxy-addr@~1.0.7
    - deps: ipaddr.js@0.1.9
  * deps: send@0.12.2
    - Throw errors early for invalid `extensions` or `index` options
    - deps: debug@~2.1.3

3.20.1 / 2015-02-28
===================

  * Fix `req.host` when using "trust proxy" hops count
  * Fix `req.protocol`/`req.secure` when using "trust proxy" hops count

3.20.0 / 2015-02-18
===================

  * Fix `"trust proxy"` setting to inherit when app is mounted
  * Generate `ETag`s for all request responses
    - No longer restricted to only responses for `GET` and `HEAD` requests
  * Use `content-type` to parse `Content-Type` headers
  * deps: connect@2.29.0
    - Use `content-type` to parse `Content-Type` headers
    - deps: body-parser@~1.12.0
    - deps: compression@~1.4.1
    - deps: connect-timeout@~1.6.0
    - deps: cookie-parser@~1.3.4
    - deps: cookie-signature@1.0.6
    - deps: csurf@~1.7.0
    - deps: errorhandler@~1.3.4
    - deps: express-session@~1.10.3
    - deps: http-errors@~1.3.1
    - deps: response-time@~2.3.0
    - deps: serve-index@~1.6.2
    - deps: serve-static@~1.9.1
    - deps: type-is@~1.6.0
  * deps: cookie-signature@1.0.6
  * deps: send@0.12.1
    - Always read the stat size from the file
    - Fix mutating passed-in `options`
    - deps: mime@1.3.4

3.19.2 / 2015-02-01
===================

  * deps: connect@2.28.3
    - deps: compression@~1.3.1
    - deps: csurf@~1.6.6
    - deps: errorhandler@~1.3.3
    - deps: express-session@~1.10.2
    - deps: serve-index@~1.6.1
    - deps: type-is@~1.5.6
  * deps: proxy-addr@~1.0.6
    - deps: ipaddr.js@0.1.8

3.19.1 / 2015-01-20
===================

  * deps: connect@2.28.2
    - deps: body-parser@~1.10.2
    - deps: serve-static@~1.8.1
  * deps: send@0.11.1
    - Fix root path disclosure

3.19.0 / 2015-01-09
===================

  * Fix `OPTIONS` responses to include the `HEAD` method property
  * Use `readline` for prompt in `express(1)`
  * deps: commander@2.6.0
  * deps: connect@2.28.1
    - deps: body-parser@~1.10.1
    - deps: compression@~1.3.0
    - deps: connect-timeout@~1.5.0
    - deps: csurf@~1.6.4
    - deps: debug@~2.1.1
    - deps: errorhandler@~1.3.2
    - deps: express-session@~1.10.1
    - deps: finalhandler@0.3.3
    - deps: method-override@~2.3.1
    - deps: morgan@~1.5.1
    - deps: serve-favicon@~2.2.0
    - deps: serve-index@~1.6.0
    - deps: serve-static@~1.8.0
    - deps: type-is@~1.5.5
  * deps: debug@~2.1.1
  * deps: methods@~1.1.1
  * deps: proxy-addr@~1.0.5
    - deps: ipaddr.js@0.1.6
  * deps: send@0.11.0
    - deps: debug@~2.1.1
    - deps: etag@~1.5.1
    - deps: ms@0.7.0
    - deps: on-finished@~2.2.0

3.18.6 / 2014-12-12
===================

  * Fix exception in `req.fresh`/`req.stale` without response headers

3.18.5 / 2014-12-11
===================

  * deps: connect@2.27.6
    - deps: compression@~1.2.2
    - deps: express-session@~1.9.3
    - deps: http-errors@~1.2.8
    - deps: serve-index@~1.5.3
    - deps: type-is@~1.5.4

3.18.4 / 2014-11-23
===================

  * deps: connect@2.27.4
    - deps: body-parser@~1.9.3
    - deps: compression@~1.2.1
    - deps: errorhandler@~1.2.3
    - deps: express-session@~1.9.2
    - deps: qs@2.3.3
    - deps: serve-favicon@~2.1.7
    - deps: serve-static@~1.5.1
    - deps: type-is@~1.5.3
  * deps: etag@~1.5.1
  * deps: proxy-addr@~1.0.4
    - deps: ipaddr.js@0.1.5

3.18.3 / 2014-11-09
===================

  * deps: connect@2.27.3
    - Correctly invoke async callback asynchronously
    - deps: csurf@~1.6.3

3.18.2 / 2014-10-28
===================

  * deps: connect@2.27.2
    - Fix handling of URLs containing `://` in the path
    - deps: body-parser@~1.9.2
    - deps: qs@2.3.2

3.18.1 / 2014-10-22
===================

  * Fix internal `utils.merge` deprecation warnings
  * deps: connect@2.27.1
    - deps: body-parser@~1.9.1
    - deps: express-session@~1.9.1
    - deps: finalhandler@0.3.2
    - deps: morgan@~1.4.1
    - deps: qs@2.3.0
    - deps: serve-static@~1.7.1
  * deps: send@0.10.1
    - deps: on-finished@~2.1.1

3.18.0 / 2014-10-17
===================

  * Use `content-disposition` module for `res.attachment`/`res.download`
    - Sends standards-compliant `Content-Disposition` header
    - Full Unicode support
  * Use `etag` module to generate `ETag` headers
  * deps: connect@2.27.0
    - Use `http-errors` module for creating errors
    - Use `utils-merge` module for merging objects
    - deps: body-parser@~1.9.0
    - deps: compression@~1.2.0
    - deps: connect-timeout@~1.4.0
    - deps: debug@~2.1.0
    - deps: depd@~1.0.0
    - deps: express-session@~1.9.0
    - deps: finalhandler@0.3.1
    - deps: method-override@~2.3.0
    - deps: morgan@~1.4.0
    - deps: response-time@~2.2.0
    - deps: serve-favicon@~2.1.6
    - deps: serve-index@~1.5.0
    - deps: serve-static@~1.7.0
  * deps: debug@~2.1.0
    - Implement `DEBUG_FD` env variable support
  * deps: depd@~1.0.0
  * deps: send@0.10.0
    - deps: debug@~2.1.0
    - deps: depd@~1.0.0
    - deps: etag@~1.5.0

3.17.8 / 2014-10-15
===================

  * deps: connect@2.26.6
    - deps: compression@~1.1.2
    - deps: csurf@~1.6.2
    - deps: errorhandler@~1.2.2

3.17.7 / 2014-10-08
===================

  * deps: connect@2.26.5
    - Fix accepting non-object arguments to `logger`
    - deps: serve-static@~1.6.4

3.17.6 / 2014-10-02
===================

  * deps: connect@2.26.4
    - deps: morgan@~1.3.2
    - deps: type-is@~1.5.2

3.17.5 / 2014-09-24
===================

  * deps: connect@2.26.3
    - deps: body-parser@~1.8.4
    - deps: serve-favicon@~2.1.5
    - deps: serve-static@~1.6.3
  * deps: proxy-addr@~1.0.3
    - Use `forwarded` npm module
  * deps: send@0.9.3
    - deps: etag@~1.4.0

3.17.4 / 2014-09-19
===================

  * deps: connect@2.26.2
    - deps: body-parser@~1.8.3
    - deps: qs@2.2.4

3.17.3 / 2014-09-18
===================

  * deps: proxy-addr@~1.0.2
    - Fix a global leak when multiple subnets are trusted
    - deps: ipaddr.js@0.1.3

3.17.2 / 2014-09-15
===================

  * Use `crc` instead of `buffer-crc32` for speed
  * deps: connect@2.26.1
    - deps: body-parser@~1.8.2
    - deps: depd@0.4.5
    - deps: express-session@~1.8.2
    - deps: morgan@~1.3.1
    - deps: serve-favicon@~2.1.3
    - deps: serve-static@~1.6.2
  * deps: depd@0.4.5
  * deps: send@0.9.2
    - deps: depd@0.4.5
    - deps: etag@~1.3.1
    - deps: range-parser@~1.0.2

3.17.1 / 2014-09-08
===================

  * Fix error in `req.subdomains` on empty host

3.17.0 / 2014-09-08
===================

  * Support `X-Forwarded-Host` in `req.subdomains`
  * Support IP address host in `req.subdomains`
  * deps: connect@2.26.0
    - deps: body-parser@~1.8.1
    - deps: compression@~1.1.0
    - deps: connect-timeout@~1.3.0
    - deps: cookie-parser@~1.3.3
    - deps: cookie-signature@1.0.5
    - deps: csurf@~1.6.1
    - deps: debug@~2.0.0
    - deps: errorhandler@~1.2.0
    - deps: express-session@~1.8.1
    - deps: finalhandler@0.2.0
    - deps: fresh@0.2.4
    - deps: media-typer@0.3.0
    - deps: method-override@~2.2.0
    - deps: morgan@~1.3.0
    - deps: qs@2.2.3
    - deps: serve-favicon@~2.1.3
    - deps: serve-index@~1.2.1
    - deps: serve-static@~1.6.1
    - deps: type-is@~1.5.1
    - deps: vhost@~3.0.0
  * deps: cookie-signature@1.0.5
  * deps: debug@~2.0.0
  * deps: fresh@0.2.4
  * deps: media-typer@0.3.0
    - Throw error when parameter format invalid on parse
  * deps: range-parser@~1.0.2
  * deps: send@0.9.1
    - Add `lastModified` option
    - Use `etag` to generate `ETag` header
    - deps: debug@~2.0.0
    - deps: fresh@0.2.4
  * deps: vary@~1.0.0
    - Accept valid `Vary` header string as `field`

3.16.10 / 2014-09-04
====================

  * deps: connect@2.25.10
    - deps: serve-static@~1.5.4
  * deps: send@0.8.5
    - Fix a path traversal issue when using `root`
    - Fix malicious path detection for empty string path

3.16.9 / 2014-08-29
===================

  * deps: connect@2.25.9
    - deps: body-parser@~1.6.7
    - deps: qs@2.2.2

3.16.8 / 2014-08-27
===================

  * deps: connect@2.25.8
    - deps: body-parser@~1.6.6
    - deps: csurf@~1.4.1
    - deps: qs@2.2.0

3.16.7 / 2014-08-18
===================

  * deps: connect@2.25.7
    - deps: body-parser@~1.6.5
    - deps: express-session@~1.7.6
    - deps: morgan@~1.2.3
    - deps: serve-static@~1.5.3
  * deps: send@0.8.3
    - deps: destroy@1.0.3
    - deps: on-finished@2.1.0

3.16.6 / 2014-08-14
===================

  * deps: connect@2.25.6
    - deps: body-parser@~1.6.4
    - deps: qs@1.2.2
    - deps: serve-static@~1.5.2
  * deps: send@0.8.2
    - Work around `fd` leak in Node.js 0.10 for `fs.ReadStream`

3.16.5 / 2014-08-11
===================

  * deps: connect@2.25.5
    - Fix backwards compatibility in `logger`

3.16.4 / 2014-08-10
===================

  * Fix original URL parsing in `res.location`
  * deps: connect@2.25.4
    - Fix `query` middleware breaking with argument
    - deps: body-parser@~1.6.3
    - deps: compression@~1.0.11
    - deps: connect-timeout@~1.2.2
    - deps: express-session@~1.7.5
    - deps: method-override@~2.1.3
    - deps: on-headers@~1.0.0
    - deps: parseurl@~1.3.0
    - deps: qs@1.2.1
    - deps: response-time@~2.0.1
    - deps: serve-index@~1.1.6
    - deps: serve-static@~1.5.1
  * deps: parseurl@~1.3.0

3.16.3 / 2014-08-07
===================

  * deps: connect@2.25.3
    - deps: multiparty@3.3.2

3.16.2 / 2014-08-07
===================

  * deps: connect@2.25.2
    - deps: body-parser@~1.6.2
    - deps: qs@1.2.0

3.16.1 / 2014-08-06
===================

  * deps: connect@2.25.1
    - deps: body-parser@~1.6.1
    - deps: qs@1.1.0

3.16.0 / 2014-08-05
===================

  * deps: connect@2.25.0
    - deps: body-parser@~1.6.0
    - deps: compression@~1.0.10
    - deps: csurf@~1.4.0
    - deps: express-session@~1.7.4
    - deps: qs@1.0.2
    - deps: serve-static@~1.5.0
  * deps: send@0.8.1
    - Add `extensions` option

3.15.3 / 2014-08-04
===================

  * fix `res.sendfile` regression for serving directory index files
  * deps: connect@2.24.3
    - deps: serve-index@~1.1.5
    - deps: serve-static@~1.4.4
  * deps: send@0.7.4
    - Fix incorrect 403 on Windows and Node.js 0.11
    - Fix serving index files without root dir

3.15.2 / 2014-07-27
===================

  * deps: connect@2.24.2
    - deps: body-parser@~1.5.2
    - deps: depd@0.4.4
    - deps: express-session@~1.7.2
    - deps: morgan@~1.2.2
    - deps: serve-static@~1.4.2
  * deps: depd@0.4.4
    - Work-around v8 generating empty stack traces
  * deps: send@0.7.2
    - deps: depd@0.4.4

3.15.1 / 2014-07-26
===================

  * deps: connect@2.24.1
    - deps: body-parser@~1.5.1
    - deps: depd@0.4.3
    - deps: express-session@~1.7.1
    - deps: morgan@~1.2.1
    - deps: serve-index@~1.1.4
    - deps: serve-static@~1.4.1
  * deps: depd@0.4.3
    - Fix exception when global `Error.stackTraceLimit` is too low
  * deps: send@0.7.1
    - deps: depd@0.4.3

3.15.0 / 2014-07-22
===================

  * Fix `req.protocol` for proxy-direct connections
  * Pass options from `res.sendfile` to `send`
  * deps: connect@2.24.0
    - deps: body-parser@~1.5.0
    - deps: compression@~1.0.9
    - deps: connect-timeout@~1.2.1
    - deps: debug@1.0.4
    - deps: depd@0.4.2
    - deps: express-session@~1.7.0
    - deps: finalhandler@0.1.0
    - deps: method-override@~2.1.2
    - deps: morgan@~1.2.0
    - deps: multiparty@3.3.1
    - deps: parseurl@~1.2.0
    - deps: serve-static@~1.4.0
  * deps: debug@1.0.4
  * deps: depd@0.4.2
    - Add `TRACE_DEPRECATION` environment variable
    - Remove non-standard grey color from color output
    - Support `--no-deprecation` argument
    - Support `--trace-deprecation` argument
  * deps: parseurl@~1.2.0
    - Cache URLs based on original value
    - Remove no-longer-needed URL mis-parse work-around
    - Simplify the "fast-path" `RegExp`
  * deps: send@0.7.0
    - Add `dotfiles` option
    - Cap `maxAge` value to 1 year
    - deps: debug@1.0.4
    - deps: depd@0.4.2

3.14.0 / 2014-07-11
===================

 * add explicit "Rosetta Flash JSONP abuse" protection
   - previous versions are not vulnerable; this is just explicit protection
 * deprecate `res.redirect(url, status)` -- use `res.redirect(status, url)` instead
 * fix `res.send(status, num)` to send `num` as json (not error)
 * remove unnecessary escaping when `res.jsonp` returns JSON response
 * deps: basic-auth@1.0.0
   - support empty password
   - support empty username
 * deps: connect@2.23.0
   - deps: debug@1.0.3
   - deps: express-session@~1.6.4
   - deps: method-override@~2.1.0
   - deps: parseurl@~1.1.3
   - deps: serve-static@~1.3.1
  * deps: debug@1.0.3
    - Add support for multiple wildcards in namespaces
  * deps: methods@1.1.0
    - add `CONNECT`
  * deps: parseurl@~1.1.3
    - faster parsing of href-only URLs

3.13.0 / 2014-07-03
===================

 * add deprecation message to `app.configure`
 * add deprecation message to `req.auth`
 * use `basic-auth` to parse `Authorization` header
 * deps: connect@2.22.0
   - deps: csurf@~1.3.0
   - deps: express-session@~1.6.1
   - deps: multiparty@3.3.0
   - deps: serve-static@~1.3.0
 * deps: send@0.5.0
   - Accept string for `maxage` (converted by `ms`)
   - Include link in default redirect response

3.12.1 / 2014-06-26
===================

 * deps: connect@2.21.1
   - deps: cookie-parser@1.3.2
   - deps: cookie-signature@1.0.4
   - deps: express-session@~1.5.2
   - deps: type-is@~1.3.2
 * deps: cookie-signature@1.0.4
   - fix for timing attacks

3.12.0 / 2014-06-21
===================

 * use `media-typer` to alter content-type charset
 * deps: connect@2.21.0
   - deprecate `connect(middleware)` -- use `app.use(middleware)` instead
   - deprecate `connect.createServer()` -- use `connect()` instead
   - fix `res.setHeader()` patch to work with with get -> append -> set pattern
   - deps: compression@~1.0.8
   - deps: errorhandler@~1.1.1
   - deps: express-session@~1.5.0
   - deps: serve-index@~1.1.3

3.11.0 / 2014-06-19
===================

 * deprecate things with `depd` module
 * deps: buffer-crc32@0.2.3
 * deps: connect@2.20.2
   - deprecate `verify` option to `json` -- use `body-parser` npm module instead
   - deprecate `verify` option to `urlencoded` -- use `body-parser` npm module instead
   - deprecate things with `depd` module
   - use `finalhandler` for final response handling
   - use `media-typer` to parse `content-type` for charset
   - deps: body-parser@1.4.3
   - deps: connect-timeout@1.1.1
   - deps: cookie-parser@1.3.1
   - deps: csurf@1.2.2
   - deps: errorhandler@1.1.0
   - deps: express-session@1.4.0
   - deps: multiparty@3.2.9
   - deps: serve-index@1.1.2
   - deps: type-is@1.3.1
   - deps: vhost@2.0.0

3.10.5 / 2014-06-11
===================

 * deps: connect@2.19.6
   - deps: body-parser@1.3.1
   - deps: compression@1.0.7
   - deps: debug@1.0.2
   - deps: serve-index@1.1.1
   - deps: serve-static@1.2.3
 * deps: debug@1.0.2
 * deps: send@0.4.3
   - Do not throw uncatchable error on file open race condition
   - Use `escape-html` for HTML escaping
   - deps: debug@1.0.2
   - deps: finished@1.2.2
   - deps: fresh@0.2.2

3.10.4 / 2014-06-09
===================

 * deps: connect@2.19.5
   - fix "event emitter leak" warnings
   - deps: csurf@1.2.1
   - deps: debug@1.0.1
   - deps: serve-static@1.2.2
   - deps: type-is@1.2.1
 * deps: debug@1.0.1
 * deps: send@0.4.2
   - fix "event emitter leak" warnings
   - deps: finished@1.2.1
   - deps: debug@1.0.1

3.10.3 / 2014-06-05
===================

 * use `vary` module for `res.vary`
 * deps: connect@2.19.4
   - deps: errorhandler@1.0.2
   - deps: method-override@2.0.2
   - deps: serve-favicon@2.0.1
 * deps: debug@1.0.0

3.10.2 / 2014-06-03
===================

 * deps: connect@2.19.3
   - deps: compression@1.0.6

3.10.1 / 2014-06-03
===================

 * deps: connect@2.19.2
   - deps: compression@1.0.4
 * deps: proxy-addr@1.0.1

3.10.0 / 2014-06-02
===================

 * deps: connect@2.19.1
   - deprecate `methodOverride()` -- use `method-override` npm module instead
   - deps: body-parser@1.3.0
   - deps: method-override@2.0.1
   - deps: multiparty@3.2.8
   - deps: response-time@2.0.0
   - deps: serve-static@1.2.1
 * deps: methods@1.0.1
 * deps: send@0.4.1
   - Send `max-age` in `Cache-Control` in correct format

3.9.0 / 2014-05-30
==================

 * custom etag control with `app.set('etag', val)`
   - `app.set('etag', function(body, encoding){ return '"etag"' })` custom etag generation
   - `app.set('etag', 'weak')` weak tag
   - `app.set('etag', 'strong')` strong etag
   - `app.set('etag', false)` turn off
   - `app.set('etag', true)` standard etag
 * Include ETag in HEAD requests
 * mark `res.send` ETag as weak and reduce collisions
 * update connect to 2.18.0
   - deps: compression@1.0.3
   - deps: serve-index@1.1.0
   - deps: serve-static@1.2.0
 * update send to 0.4.0
   - Calculate ETag with md5 for reduced collisions
   - Ignore stream errors after request ends
   - deps: debug@0.8.1

3.8.1 / 2014-05-27
==================

 * update connect to 2.17.3
   - deps: body-parser@1.2.2
   - deps: express-session@1.2.1
   - deps: method-override@1.0.2

3.8.0 / 2014-05-21
==================

 * keep previous `Content-Type` for `res.jsonp`
 * set proper `charset` in `Content-Type` for `res.send`
 * update connect to 2.17.1
   - fix `res.charset` appending charset when `content-type` has one
   - deps: express-session@1.2.0
   - deps: morgan@1.1.1
   - deps: serve-index@1.0.3

3.7.0 / 2014-05-18
==================

 * proper proxy trust with `app.set('trust proxy', trust)`
   - `app.set('trust proxy', 1)` trust first hop
   - `app.set('trust proxy', 'loopback')` trust loopback addresses
   - `app.set('trust proxy', '10.0.0.1')` trust single IP
   - `app.set('trust proxy', '10.0.0.1/16')` trust subnet
   - `app.set('trust proxy', '10.0.0.1, 10.0.0.2')` trust list
   - `app.set('trust proxy', false)` turn off
   - `app.set('trust proxy', true)` trust everything
 * update connect to 2.16.2
   - deprecate `res.headerSent` -- use `res.headersSent`
   - deprecate `res.on("header")` -- use on-headers module instead
   - fix edge-case in `res.appendHeader` that would append in wrong order
   - json: use body-parser
   - urlencoded: use body-parser
   - dep: bytes@1.0.0
   - dep: cookie-parser@1.1.0
   - dep: csurf@1.2.0
   - dep: express-session@1.1.0
   - dep: method-override@1.0.1

3.6.0 / 2014-05-09
==================

 * deprecate `app.del()` -- use `app.delete()` instead
 * deprecate `res.json(obj, status)` -- use `res.json(status, obj)` instead
   - the edge-case `res.json(status, num)` requires `res.status(status).json(num)`
 * deprecate `res.jsonp(obj, status)` -- use `res.jsonp(status, obj)` instead
   - the edge-case `res.jsonp(status, num)` requires `res.status(status).jsonp(num)`
 * support PURGE method
   - add `app.purge`
   - add `router.purge`
   - include PURGE in `app.all`
 * update connect to 2.15.0
   * Add `res.appendHeader`
   * Call error stack even when response has been sent
   * Patch `res.headerSent` to return Boolean
   * Patch `res.headersSent` for node.js 0.8
   * Prevent default 404 handler after response sent
   * dep: compression@1.0.2
   * dep: connect-timeout@1.1.0
   * dep: debug@^0.8.0
   * dep: errorhandler@1.0.1
   * dep: express-session@1.0.4
   * dep: morgan@1.0.1
   * dep: serve-favicon@2.0.0
   * dep: serve-index@1.0.2
 * update debug to 0.8.0
   * add `enable()` method
   * change from stderr to stdout
 * update methods to 1.0.0
   - add PURGE
 * update mkdirp to 0.5.0

3.5.3 / 2014-05-08
==================

 * fix `req.host` for IPv6 literals
 * fix `res.jsonp` error if callback param is object

3.5.2 / 2014-04-24
==================

 * update connect to 2.14.5
 * update cookie to 0.1.2
 * update mkdirp to 0.4.0
 * update send to 0.3.0

3.5.1 / 2014-03-25
==================

 * pin less-middleware in generated app

3.5.0 / 2014-03-06
==================

 * bump deps

3.4.8 / 2014-01-13
==================

 * prevent incorrect automatic OPTIONS responses #1868 @dpatti
 * update binary and examples for jade 1.0 #1876 @yossi, #1877 @reqshark, #1892 @matheusazzi
 * throw 400 in case of malformed paths @rlidwka

3.4.7 / 2013-12-10
==================

 * update connect

3.4.6 / 2013-12-01
==================

 * update connect (raw-body)

3.4.5 / 2013-11-27
==================

 * update connect
 * res.location: remove leading ./ #1802 @kapouer
 * res.redirect: fix `res.redirect('toString') #1829 @michaelficarra
 * res.send: always send ETag when content-length > 0
 * router: add Router.all() method

3.4.4 / 2013-10-29
==================

 * update connect
 * update supertest
 * update methods
 * express(1): replace bodyParser() with urlencoded() and json() #1795 @chirag04

3.4.3 / 2013-10-23
==================

 * update connect

3.4.2 / 2013-10-18
==================

 * update connect
 * downgrade commander

3.4.1 / 2013-10-15
==================

 * update connect
 * update commander
 * jsonp: check if callback is a function
 * router: wrap encodeURIComponent in a try/catch #1735 (@lxe)
 * res.format: now includes charset @1747 (@sorribas)
 * res.links: allow multiple calls @1746 (@sorribas)

3.4.0 / 2013-09-07
==================

 * add res.vary(). Closes #1682
 * update connect

3.3.8 / 2013-09-02
==================

 * update connect

3.3.7 / 2013-08-28
==================

 * update connect

3.3.6 / 2013-08-27
==================

 * Revert "remove charset from json responses. Closes #1631" (causes issues in some clients)
 * add: req.accepts take an argument list

3.3.4 / 2013-07-08
==================

 * update send and connect

3.3.3 / 2013-07-04
==================

 * update connect

3.3.2 / 2013-07-03
==================

 * update connect
 * update send
 * remove .version export

3.3.1 / 2013-06-27
==================

 * update connect

3.3.0 / 2013-06-26
==================

 * update connect
 * add support for multiple X-Forwarded-Proto values. Closes #1646
 * change: remove charset from json responses. Closes #1631
 * change: return actual booleans from req.accept* functions
 * fix jsonp callback array throw

3.2.6 / 2013-06-02
==================

 * update connect

3.2.5 / 2013-05-21
==================

 * update connect
 * update node-cookie
 * add: throw a meaningful error when there is no default engine
 * change generation of ETags with res.send() to GET requests only. Closes #1619

3.2.4 / 2013-05-09
==================

  * fix `req.subdomains` when no Host is present
  * fix `req.host` when no Host is present, return undefined

3.2.3 / 2013-05-07
==================

  * update connect / qs

3.2.2 / 2013-05-03
==================

  * update qs

3.2.1 / 2013-04-29
==================

  * add app.VERB() paths array deprecation warning
  * update connect
  * update qs and remove all ~ semver crap
  * fix: accept number as value of Signed Cookie

3.2.0 / 2013-04-15
==================

  * add "view" constructor setting to override view behaviour
  * add req.acceptsEncoding(name)
  * add req.acceptedEncodings
  * revert cookie signature change causing session race conditions
  * fix sorting of Accept values of the same quality

3.1.2 / 2013-04-12
==================

  * add support for custom Accept parameters
  * update cookie-signature

3.1.1 / 2013-04-01
==================

  * add X-Forwarded-Host support to `req.host`
  * fix relative redirects
  * update mkdirp
  * update buffer-crc32
  * remove legacy app.configure() method from app template.

3.1.0 / 2013-01-25
==================

  * add support for leading "." in "view engine" setting
  * add array support to `res.set()`
  * add node 0.8.x to travis.yml
  * add "subdomain offset" setting for tweaking `req.subdomains`
  * add `res.location(url)` implementing `res.redirect()`-like setting of Location
  * use app.get() for x-powered-by setting for inheritance
  * fix colons in passwords for `req.auth`

3.0.6 / 2013-01-04
==================

  * add http verb methods to Router
  * update connect
  * fix mangling of the `res.cookie()` options object
  * fix jsonp whitespace escape. Closes #1132

3.0.5 / 2012-12-19
==================

  * add throwing when a non-function is passed to a route
  * fix: explicitly remove Transfer-Encoding header from 204 and 304 responses
  * revert "add 'etag' option"

3.0.4 / 2012-12-05
==================

  * add 'etag' option to disable `res.send()` Etags
  * add escaping of urls in text/plain in `res.redirect()`
    for old browsers interpreting as html
  * change crc32 module for a more liberal license
  * update connect

3.0.3 / 2012-11-13
==================

  * update connect
  * update cookie module
  * fix cookie max-age

3.0.2 / 2012-11-08
==================

  * add OPTIONS to cors example. Closes #1398
  * fix route chaining regression. Closes #1397

3.0.1 / 2012-11-01
==================

  * update connect

3.0.0 / 2012-10-23
==================

  * add `make clean`
  * add "Basic" check to req.auth
  * add `req.auth` test coverage
  * add cb && cb(payload) to `res.jsonp()`. Closes #1374
  * add backwards compat for `res.redirect()` status. Closes #1336
  * add support for `res.json()` to retain previously defined Content-Types. Closes #1349
  * update connect
  * change `res.redirect()` to utilize a pathname-relative Location again. Closes #1382
  * remove non-primitive string support for `res.send()`
  * fix view-locals example. Closes #1370
  * fix route-separation example

3.0.0rc5 / 2012-09-18
==================

  * update connect
  * add redis search example
  * add static-files example
  * add "x-powered-by" setting (`app.disable('x-powered-by')`)
  * add "application/octet-stream" redirect Accept test case. Closes #1317

3.0.0rc4 / 2012-08-30
==================

  * add `res.jsonp()`. Closes #1307
  * add "verbose errors" option to error-pages example
  * add another route example to express(1) so people are not so confused
  * add redis online user activity tracking example
  * update connect dep
  * fix etag quoting. Closes #1310
  * fix error-pages 404 status
  * fix jsonp callback char restrictions
  * remove old OPTIONS default response

3.0.0rc3 / 2012-08-13
==================

  * update connect dep
  * fix signed cookies to work with `connect.cookieParser()` ("s:" prefix was missing) [tnydwrds]
  * fix `res.render()` clobbering of "locals"

3.0.0rc2 / 2012-08-03
==================

  * add CORS example
  * update connect dep
  * deprecate `.createServer()` & remove old stale examples
  * fix: escape `res.redirect()` link
  * fix vhost example

3.0.0rc1 / 2012-07-24
==================

  * add more examples to view-locals
  * add scheme-relative redirects (`res.redirect("//foo.com")`) support
  * update cookie dep
  * update connect dep
  * update send dep
  * fix `express(1)` -h flag, use -H for hogan. Closes #1245
  * fix `res.sendfile()` socket error handling regression

3.0.0beta7 / 2012-07-16
==================

  * update connect dep for `send()` root normalization regression

3.0.0beta6 / 2012-07-13
==================

  * add `err.view` property for view errors. Closes #1226
  * add "jsonp callback name" setting
  * add support for "/foo/:bar*" non-greedy matches
  * change `res.sendfile()` to use `send()` module
  * change `res.send` to use "response-send" module
  * remove `app.locals.use` and `res.locals.use`, use regular middleware

3.0.0beta5 / 2012-07-03
==================

  * add "make check" support
  * add route-map example
  * add `res.json(obj, status)` support back for BC
  * add "methods" dep, remove internal methods module
  * update connect dep
  * update auth example to utilize cores pbkdf2
  * updated tests to use "supertest"

3.0.0beta4 / 2012-06-25
==================

  * Added `req.auth`
  * Added `req.range(size)`
  * Added `res.links(obj)`
  * Added `res.send(body, status)` support back for backwards compat
  * Added `.default()` support to `res.format()`
  * Added 2xx / 304 check to `req.fresh`
  * Revert "Added + support to the router"
  * Fixed `res.send()` freshness check, respect res.statusCode

3.0.0beta3 / 2012-06-15
==================

  * Added hogan `--hjs` to express(1) [nullfirm]
  * Added another example to content-negotiation
  * Added `fresh` dep
  * Changed: `res.send()` always checks freshness
  * Fixed: expose connects mime module. Closes #1165

3.0.0beta2 / 2012-06-06
==================

  * Added `+` support to the router
  * Added `req.host`
  * Changed `req.param()` to check route first
  * Update connect dep

3.0.0beta1 / 2012-06-01
==================

  * Added `res.format()` callback to override default 406 behaviour
  * Fixed `res.redirect()` 406. Closes #1154

3.0.0alpha5 / 2012-05-30
==================

  * Added `req.ip`
  * Added `{ signed: true }` option to `res.cookie()`
  * Removed `res.signedCookie()`
  * Changed: dont reverse `req.ips`
  * Fixed "trust proxy" setting check for `req.ips`

3.0.0alpha4 / 2012-05-09
==================

  * Added: allow `[]` in jsonp callback. Closes #1128
  * Added `PORT` env var support in generated template. Closes #1118 [benatkin]
  * Updated: connect 2.2.2

3.0.0alpha3 / 2012-05-04
==================

  * Added public `app.routes`. Closes #887
  * Added _view-locals_ example
  * Added _mvc_ example
  * Added `res.locals.use()`. Closes #1120
  * Added conditional-GET support to `res.send()`
  * Added: coerce `res.set()` values to strings
  * Changed: moved `static()` in generated apps below router
  * Changed: `res.send()` only set ETag when not previously set
  * Changed connect 2.2.1 dep
  * Changed: `make test` now runs unit / acceptance tests
  * Fixed req/res proto inheritance

3.0.0alpha2 / 2012-04-26
==================

  * Added `make benchmark` back
  * Added `res.send()` support for `String` objects
  * Added client-side data exposing example
  * Added `res.header()` and `req.header()` aliases for BC
  * Added `express.createServer()` for BC
  * Perf: memoize parsed urls
  * Perf: connect 2.2.0 dep
  * Changed: make `expressInit()` middleware self-aware
  * Fixed: use app.get() for all core settings
  * Fixed redis session example
  * Fixed session example. Closes #1105
  * Fixed generated express dep. Closes #1078

3.0.0alpha1 / 2012-04-15
==================

  * Added `app.locals.use(callback)`
  * Added `app.locals` object
  * Added `app.locals(obj)`
  * Added `res.locals` object
  * Added `res.locals(obj)`
  * Added `res.format()` for content-negotiation
  * Added `app.engine()`
  * Added `res.cookie()` JSON cookie support
  * Added "trust proxy" setting
  * Added `req.subdomains`
  * Added `req.protocol`
  * Added `req.secure`
  * Added `req.path`
  * Added `req.ips`
  * Added `req.fresh`
  * Added `req.stale`
  * Added comma-delimited / array support for `req.accepts()`
  * Added debug instrumentation
  * Added `res.set(obj)`
  * Added `res.set(field, value)`
  * Added `res.get(field)`
  * Added `app.get(setting)`. Closes #842
  * Added `req.acceptsLanguage()`
  * Added `req.acceptsCharset()`
  * Added `req.accepted`
  * Added `req.acceptedLanguages`
  * Added `req.acceptedCharsets`
  * Added "json replacer" setting
  * Added "json spaces" setting
  * Added X-Forwarded-Proto support to `res.redirect()`. Closes #92
  * Added `--less` support to express(1)
  * Added `express.response` prototype
  * Added `express.request` prototype
  * Added `express.application` prototype
  * Added `app.path()`
  * Added `app.render()`
  * Added `res.type()` to replace `res.contentType()`
  * Changed: `res.redirect()` to add relative support
  * Changed: enable "jsonp callback" by default
  * Changed: renamed "case sensitive routes" to "case sensitive routing"
  * Rewrite of all tests with mocha
  * Removed "root" setting
  * Removed `res.redirect('home')` support
  * Removed `req.notify()`
  * Removed `app.register()`
  * Removed `app.redirect()`
  * Removed `app.is()`
  * Removed `app.helpers()`
  * Removed `app.dynamicHelpers()`
  * Fixed `res.sendfile()` with non-GET. Closes #723
  * Fixed express(1) public dir for windows. Closes #866

2.5.9/ 2012-04-02
==================

  * Added support for PURGE request method [pbuyle]
  * Fixed `express(1)` generated app `app.address()` before `listening` [mmalecki]

2.5.8 / 2012-02-08
==================

  * Update mkdirp dep. Closes #991

2.5.7 / 2012-02-06
==================

  * Fixed `app.all` duplicate DELETE requests [mscdex]

2.5.6 / 2012-01-13
==================

  * Updated hamljs dev dep. Closes #953

2.5.5 / 2012-01-08
==================

  * Fixed: set `filename` on cached templates [matthewleon]

2.5.4 / 2012-01-02
==================

  * Fixed `express(1)` eol on 0.4.x. Closes #947

2.5.3 / 2011-12-30
==================

  * Fixed `req.is()` when a charset is present

2.5.2 / 2011-12-10
==================

  * Fixed: express(1) LF -> CRLF for windows

2.5.1 / 2011-11-17
==================

  * Changed: updated connect to 1.8.x
  * Removed sass.js support from express(1)

2.5.0 / 2011-10-24
==================

  * Added ./routes dir for generated app by default
  * Added npm install reminder to express(1) app gen
  * Added 0.5.x support
  * Removed `make test-cov` since it wont work with node 0.5.x
  * Fixed express(1) public dir for windows. Closes #866

2.4.7 / 2011-10-05
==================

  * Added mkdirp to express(1). Closes #795
  * Added simple _json-config_ example
  * Added  shorthand for the parsed request's pathname via `req.path`
  * Changed connect dep to 1.7.x to fix npm issue...
  * Fixed `res.redirect()` __HEAD__ support. [reported by xerox]
  * Fixed `req.flash()`, only escape args
  * Fixed absolute path checking on windows. Closes #829 [reported by andrewpmckenzie]

2.4.6 / 2011-08-22
==================

  * Fixed multiple param callback regression. Closes #824 [reported by TroyGoode]

2.4.5 / 2011-08-19
==================

  * Added support for routes to handle errors. Closes #809
  * Added `app.routes.all()`. Closes #803
  * Added "basepath" setting to work in conjunction with reverse proxies etc.
  * Refactored `Route` to use a single array of callbacks
  * Added support for multiple callbacks for `app.param()`. Closes #801
Closes #805
  * Changed: removed .call(self) for route callbacks
  * Dependency: `qs >= 0.3.1`
  * Fixed `res.redirect()` on windows due to `join()` usage. Closes #808

2.4.4 / 2011-08-05
==================

  * Fixed `res.header()` intention of a set, even when `undefined`
  * Fixed `*`, value no longer required
  * Fixed `res.send(204)` support. Closes #771

2.4.3 / 2011-07-14
==================

  * Added docs for `status` option special-case. Closes #739
  * Fixed `options.filename`, exposing the view path to template engines

2.4.2. / 2011-07-06
==================

  * Revert "removed jsonp stripping" for XSS

2.4.1 / 2011-07-06
==================

  * Added `res.json()` JSONP support. Closes #737
  * Added _extending-templates_ example. Closes #730
  * Added "strict routing" setting for trailing slashes
  * Added support for multiple envs in `app.configure()` calls. Closes #735
  * Changed: `res.send()` using `res.json()`
  * Changed: when cookie `path === null` don't default it
  * Changed; default cookie path to "home" setting. Closes #731
  * Removed _pids/logs_ creation from express(1)

2.4.0 / 2011-06-28
==================

  * Added chainable `res.status(code)`
  * Added `res.json()`, an explicit version of `res.send(obj)`
  * Added simple web-service example

2.3.12 / 2011-06-22
==================

  * \#express is now on freenode! come join!
  * Added `req.get(field, param)`
  * Added links to Japanese documentation, thanks @hideyukisaito!
  * Added; the `express(1)` generated app outputs the env
  * Added `content-negotiation` example
  * Dependency: connect >= 1.5.1 < 2.0.0
  * Fixed view layout bug. Closes #720
  * Fixed; ignore body on 304. Closes #701

2.3.11 / 2011-06-04
==================

  * Added `npm test`
  * Removed generation of dummy test file from `express(1)`
  * Fixed; `express(1)` adds express as a dep
  * Fixed; prune on `prepublish`

2.3.10 / 2011-05-27
==================

  * Added `req.route`, exposing the current route
  * Added _package.json_ generation support to `express(1)`
  * Fixed call to `app.param()` function for optional params. Closes #682

2.3.9 / 2011-05-25
==================

  * Fixed bug-ish with `../' in `res.partial()` calls

2.3.8 / 2011-05-24
==================

  * Fixed `app.options()`

2.3.7 / 2011-05-23
==================

  * Added route `Collection`, ex: `app.get('/user/:id').remove();`
  * Added support for `app.param(fn)` to define param logic
  * Removed `app.param()` support for callback with return value
  * Removed module.parent check from express(1) generated app. Closes #670
  * Refactored router. Closes #639

2.3.6 / 2011-05-20
==================

  * Changed; using devDependencies instead of git submodules
  * Fixed redis session example
  * Fixed markdown example
  * Fixed view caching, should not be enabled in development

2.3.5 / 2011-05-20
==================

  * Added export `.view` as alias for `.View`

2.3.4 / 2011-05-08
==================

  * Added `./examples/say`
  * Fixed `res.sendfile()` bug preventing the transfer of files with spaces

2.3.3 / 2011-05-03
==================

  * Added "case sensitive routes" option.
  * Changed; split methods supported per rfc [slaskis]
  * Fixed route-specific middleware when using the same callback function several times

2.3.2 / 2011-04-27
==================

  * Fixed view hints

2.3.1 / 2011-04-26
==================

  * Added `app.match()` as `app.match.all()`
  * Added `app.lookup()` as `app.lookup.all()`
  * Added `app.remove()` for `app.remove.all()`
  * Added `app.remove.VERB()`
  * Fixed template caching collision issue. Closes #644
  * Moved router over from connect and started refactor

2.3.0 / 2011-04-25
==================

  * Added options support to `res.clearCookie()`
  * Added `res.helpers()` as alias of `res.locals()`
  * Added; json defaults to UTF-8 with `res.send()`. Closes #632. [Daniel   * Dependency `connect >= 1.4.0`
  * Changed; auto set Content-Type in res.attachement [Aaron Heckmann]
  * Renamed "cache views" to "view cache". Closes #628
  * Fixed caching of views when using several apps. Closes #637
  * Fixed gotcha invoking `app.param()` callbacks once per route middleware.
Closes #638
  * Fixed partial lookup precedence. Closes #631
Shaw]

2.2.2 / 2011-04-12
==================

  * Added second callback support for `res.download()` connection errors
  * Fixed `filename` option passing to template engine

2.2.1 / 2011-04-04
==================

  * Added `layout(path)` helper to change the layout within a view. Closes #610
  * Fixed `partial()` collection object support.
    Previously only anything with `.length` would work.
    When `.length` is present one must still be aware of holes,
    however now `{ collection: {foo: 'bar'}}` is valid, exposes
    `keyInCollection` and `keysInCollection`.

  * Performance improved with better view caching
  * Removed `request` and `response` locals
  * Changed; errorHandler page title is now `Express` instead of `Connect`

2.2.0 / 2011-03-30
==================

  * Added `app.lookup.VERB()`, ex `app.lookup.put('/user/:id')`. Closes #606
  * Added `app.match.VERB()`, ex `app.match.put('/user/12')`. Closes #606
  * Added `app.VERB(path)` as alias of `app.lookup.VERB()`.
  * Dependency `connect >= 1.2.0`

2.1.1 / 2011-03-29
==================

  * Added; expose `err.view` object when failing to locate a view
  * Fixed `res.partial()` call `next(err)` when no callback is given [reported by aheckmann]
  * Fixed; `res.send(undefined)` responds with 204 [aheckmann]

2.1.0 / 2011-03-24
==================

  * Added `<root>/_?<name>` partial lookup support. Closes #447
  * Added `request`, `response`, and `app` local variables
  * Added `settings` local variable, containing the app's settings
  * Added `req.flash()` exception if `req.session` is not available
  * Added `res.send(bool)` support (json response)
  * Fixed stylus example for latest version
  * Fixed; wrap try/catch around `res.render()`

2.0.0 / 2011-03-17
==================

  * Fixed up index view path alternative.
  * Changed; `res.locals()` without object returns the locals

2.0.0rc3 / 2011-03-17
==================

  * Added `res.locals(obj)` to compliment `res.local(key, val)`
  * Added `res.partial()` callback support
  * Fixed recursive error reporting issue in `res.render()`

2.0.0rc2 / 2011-03-17
==================

  * Changed; `partial()` "locals" are now optional
  * Fixed `SlowBuffer` support. Closes #584 [reported by tyrda01]
  * Fixed .filename view engine option [reported by drudge]
  * Fixed blog example
  * Fixed `{req,res}.app` reference when mounting [Ben Weaver]

2.0.0rc / 2011-03-14
==================

  * Fixed; expose `HTTPSServer` constructor
  * Fixed express(1) default test charset. Closes #579 [reported by secoif]
  * Fixed; default charset to utf-8 instead of utf8 for lame IE [reported by NickP]

2.0.0beta3 / 2011-03-09
==================

  * Added support for `res.contentType()` literal
    The original `res.contentType('.json')`,
    `res.contentType('application/json')`, and `res.contentType('json')`
    will work now.
  * Added `res.render()` status option support back
  * Added charset option for `res.render()`
  * Added `.charset` support (via connect 1.0.4)
  * Added view resolution hints when in development and a lookup fails
  * Added layout lookup support relative to the page view.
    For example while rendering `./views/user/index.jade` if you create
    `./views/user/layout.jade` it will be used in favour of the root layout.
  * Fixed `res.redirect()`. RFC states absolute url [reported by unlink]
  * Fixed; default `res.send()` string charset to utf8
  * Removed `Partial` constructor (not currently used)

2.0.0beta2 / 2011-03-07
==================

  * Added res.render() `.locals` support back to aid in migration process
  * Fixed flash example

2.0.0beta / 2011-03-03
==================

  * Added HTTPS support
  * Added `res.cookie()` maxAge support
  * Added `req.header()` _Referrer_ / _Referer_ special-case, either works
  * Added mount support for `res.redirect()`, now respects the mount-point
  * Added `union()` util, taking place of `merge(clone())` combo
  * Added stylus support to express(1) generated app
  * Added secret to session middleware used in examples and generated app
  * Added `res.local(name, val)` for progressive view locals
  * Added default param support to `req.param(name, default)`
  * Added `app.disabled()` and `app.enabled()`
  * Added `app.register()` support for omitting leading ".", either works
  * Added `res.partial()`, using the same interface as `partial()` within a view. Closes #539
  * Added `app.param()` to map route params to async/sync logic
  * Added; aliased `app.helpers()` as `app.locals()`. Closes #481
  * Added extname with no leading "." support to `res.contentType()`
  * Added `cache views` setting, defaulting to enabled in "production" env
  * Added index file partial resolution, eg: partial('user') may try _views/user/index.jade_.
  * Added `req.accepts()` support for extensions
  * Changed; `res.download()` and `res.sendfile()` now utilize Connect's
    static file server `connect.static.send()`.
  * Changed; replaced `connect.utils.mime()` with npm _mime_ module
  * Changed; allow `req.query` to be pre-defined (via middleware or other parent
  * Changed view partial resolution, now relative to parent view
  * Changed view engine signature. no longer `engine.render(str, options, callback)`, now `engine.compile(str, options) -> Function`, the returned function accepts `fn(locals)`.
  * Fixed `req.param()` bug returning Array.prototype methods. Closes #552
  * Fixed; using `Stream#pipe()` instead of `sys.pump()` in `res.sendfile()`
  * Fixed; using _qs_ module instead of _querystring_
  * Fixed; strip unsafe chars from jsonp callbacks
  * Removed "stream threshold" setting

1.0.8 / 2011-03-01
==================

  * Allow `req.query` to be pre-defined (via middleware or other parent app)
  * "connect": ">= 0.5.0 < 1.0.0". Closes #547
  * Removed the long deprecated __EXPRESS_ENV__ support

1.0.7 / 2011-02-07
==================

  * Fixed `render()` setting inheritance.
    Mounted apps would not inherit "view engine"

1.0.6 / 2011-02-07
==================

  * Fixed `view engine` setting bug when period is in dirname

1.0.5 / 2011-02-05
==================

  * Added secret to generated app `session()` call

1.0.4 / 2011-02-05
==================

  * Added `qs` dependency to _package.json_
  * Fixed namespaced `require()`s for latest connect support

1.0.3 / 2011-01-13
==================

  * Remove unsafe characters from JSONP callback names [Ryan Grove]

1.0.2 / 2011-01-10
==================

  * Removed nested require, using `connect.router`

1.0.1 / 2010-12-29
==================

  * Fixed for middleware stacked via `createServer()`
    previously the `foo` middleware passed to `createServer(foo)`
    would not have access to Express methods such as `res.send()`
    or props like `req.query` etc.

1.0.0 / 2010-11-16
==================

  * Added; deduce partial object names from the last segment.
    For example by default `partial('forum/post', postObject)` will
    give you the _post_ object, providing a meaningful default.
  * Added http status code string representation to `res.redirect()` body
  * Added; `res.redirect()` supporting _text/plain_ and _text/html_ via __Accept__.
  * Added `req.is()` to aid in content negotiation
  * Added partial local inheritance [suggested by masylum]. Closes #102
    providing access to parent template locals.
  * Added _-s, --session[s]_ flag to express(1) to add session related middleware
  * Added _--template_ flag to express(1) to specify the
    template engine to use.
  * Added _--css_ flag to express(1) to specify the
    stylesheet engine to use (or just plain css by default).
  * Added `app.all()` support [thanks aheckmann]
  * Added partial direct object support.
    You may now `partial('user', user)` providing the "user" local,
    vs previously `partial('user', { object: user })`.
  * Added _route-separation_ example since many people question ways
    to do this with CommonJS modules. Also view the _blog_ example for
    an alternative.
  * Performance; caching view path derived partial object names
  * Fixed partial local inheritance precedence. [reported by Nick Poulden] Closes #454
  * Fixed jsonp support; _text/javascript_ as per mailinglist discussion

1.0.0rc4 / 2010-10-14
==================

  * Added _NODE_ENV_ support, _EXPRESS_ENV_ is deprecated and will be removed in 1.0.0
  * Added route-middleware support (very helpful, see the [docs](http://expressjs.com/guide.html#Route-Middleware))
  * Added _jsonp callback_ setting to enable/disable jsonp autowrapping [Dav Glass]
  * Added callback query check on response.send to autowrap JSON objects for simple webservice implementations [Dav Glass]
  * Added `partial()` support for array-like collections. Closes #434
  * Added support for swappable querystring parsers
  * Added session usage docs. Closes #443
  * Added dynamic helper caching. Closes #439 [suggested by maritz]
  * Added authentication example
  * Added basic Range support to `res.sendfile()` (and `res.download()` etc)
  * Changed; `express(1)` generated app using 2 spaces instead of 4
  * Default env to "development" again [aheckmann]
  * Removed _context_ option is no more, use "scope"
  * Fixed; exposing _./support_ libs to examples so they can run without installs
  * Fixed mvc example

1.0.0rc3 / 2010-09-20
==================

  * Added confirmation for `express(1)` app generation. Closes #391
  * Added extending of flash formatters via `app.flashFormatters`
  * Added flash formatter support. Closes #411
  * Added streaming support to `res.sendfile()` using `sys.pump()` when >= "stream threshold"
  * Added _stream threshold_ setting for `res.sendfile()`
  * Added `res.send()` __HEAD__ support
  * Added `res.clearCookie()`
  * Added `res.cookie()`
  * Added `res.render()` headers option
  * Added `res.redirect()` response bodies
  * Added `res.render()` status option support. Closes #425 [thanks aheckmann]
  * Fixed `res.sendfile()` responding with 403 on malicious path
  * Fixed `res.download()` bug; when an error occurs remove _Content-Disposition_
  * Fixed; mounted apps settings now inherit from parent app [aheckmann]
  * Fixed; stripping Content-Length / Content-Type when 204
  * Fixed `res.send()` 204. Closes #419
  * Fixed multiple _Set-Cookie_ headers via `res.header()`. Closes #402
  * Fixed bug messing with error handlers when `listenFD()` is called instead of `listen()`. [thanks guillermo]


1.0.0rc2 / 2010-08-17
==================

  * Added `app.register()` for template engine mapping. Closes #390
  * Added `res.render()` callback support as second argument (no options)
  * Added callback support to `res.download()`
  * Added callback support for `res.sendfile()`
  * Added support for middleware access via `express.middlewareName()` vs `connect.middlewareName()`
  * Added "partials" setting to docs
  * Added default expresso tests to `express(1)` generated app. Closes #384
  * Fixed `res.sendfile()` error handling, defer via `next()`
  * Fixed `res.render()` callback when a layout is used [thanks guillermo]
  * Fixed; `make install` creating ~/.node_libraries when not present
  * Fixed issue preventing error handlers from being defined anywhere. Closes #387

1.0.0rc / 2010-07-28
==================

  * Added mounted hook. Closes #369
  * Added connect dependency to _package.json_

  * Removed "reload views" setting and support code
    development env never caches, production always caches.

  * Removed _param_ in route callbacks, signature is now
    simply (req, res, next), previously (req, res, params, next).
    Use _req.params_ for path captures, _req.query_ for GET params.

  * Fixed "home" setting
  * Fixed middleware/router precedence issue. Closes #366
  * Fixed; _configure()_ callbacks called immediately. Closes #368

1.0.0beta2 / 2010-07-23
==================

  * Added more examples
  * Added; exporting `Server` constructor
  * Added `Server#helpers()` for view locals
  * Added `Server#dynamicHelpers()` for dynamic view locals. Closes #349
  * Added support for absolute view paths
  * Added; _home_ setting defaults to `Server#route` for mounted apps. Closes #363
  * Added Guillermo Rauch to the contributor list
  * Added support for "as" for non-collection partials. Closes #341
  * Fixed _install.sh_, ensuring _~/.node_libraries_ exists. Closes #362 [thanks jf]
  * Fixed `res.render()` exceptions, now passed to `next()` when no callback is given [thanks guillermo]
  * Fixed instanceof `Array` checks, now `Array.isArray()`
  * Fixed express(1) expansion of public dirs. Closes #348
  * Fixed middleware precedence. Closes #345
  * Fixed view watcher, now async [thanks aheckmann]

1.0.0beta / 2010-07-15
==================

  * Re-write
    - much faster
    - much lighter
    - Check [ExpressJS.com](http://expressjs.com) for migration guide and updated docs

0.14.0 / 2010-06-15
==================

  * Utilize relative requires
  * Added Static bufferSize option [aheckmann]
  * Fixed caching of view and partial subdirectories [aheckmann]
  * Fixed mime.type() comments now that ".ext" is not supported
  * Updated haml submodule
  * Updated class submodule
  * Removed bin/express

0.13.0 / 2010-06-01
==================

  * Added node v0.1.97 compatibility
  * Added support for deleting cookies via Request#cookie('key', null)
  * Updated haml submodule
  * Fixed not-found page, now using using charset utf-8
  * Fixed show-exceptions page, now using using charset utf-8
  * Fixed view support due to fs.readFile Buffers
  * Changed; mime.type() no longer accepts ".type" due to node extname() changes

0.12.0 / 2010-05-22
==================

  * Added node v0.1.96 compatibility
  * Added view `helpers` export which act as additional local variables
  * Updated haml submodule
  * Changed ETag; removed inode, modified time only
  * Fixed LF to CRLF for setting multiple cookies
  * Fixed cookie compilation; values are now urlencoded
  * Fixed cookies parsing; accepts quoted values and url escaped cookies

0.11.0 / 2010-05-06
==================

  * Added support for layouts using different engines
    - this.render('page.html.haml', { layout: 'super-cool-layout.html.ejs' })
    - this.render('page.html.haml', { layout: 'foo' }) // assumes 'foo.html.haml'
    - this.render('page.html.haml', { layout: false }) // no layout
  * Updated ext submodule
  * Updated haml submodule
  * Fixed EJS partial support by passing along the context. Issue #307

0.10.1 / 2010-05-03
==================

  * Fixed binary uploads.

0.10.0 / 2010-04-30
==================

  * Added charset support via Request#charset (automatically assigned to 'UTF-8' when respond()'s
    encoding is set to 'utf8' or 'utf-8'.
  * Added "encoding" option to Request#render(). Closes #299
  * Added "dump exceptions" setting, which is enabled by default.
  * Added simple ejs template engine support
  * Added error response support for text/plain, application/json. Closes #297
  * Added callback function param to Request#error()
  * Added Request#sendHead()
  * Added Request#stream()
  * Added support for Request#respond(304, null) for empty response bodies
  * Added ETag support to Request#sendfile()
  * Added options to Request#sendfile(), passed to fs.createReadStream()
  * Added filename arg to Request#download()
  * Performance enhanced due to pre-reversing plugins so that plugins.reverse() is not called on each request
  * Performance enhanced by preventing several calls to toLowerCase() in Router#match()
  * Changed; Request#sendfile() now streams
  * Changed; Renamed Request#halt() to Request#respond(). Closes #289
  * Changed; Using sys.inspect() instead of JSON.encode() for error output
  * Changed; run() returns the http.Server instance. Closes #298
  * Changed; Defaulting Server#host to null (INADDR_ANY)
  * Changed; Logger "common" format scale of 0.4f
  * Removed Logger "request" format
  * Fixed; Catching ENOENT in view caching, preventing error when "views/partials" is not found
  * Fixed several issues with http client
  * Fixed Logger Content-Length output
  * Fixed bug preventing Opera from retaining the generated session id. Closes #292

0.9.0 / 2010-04-14
==================

  * Added DSL level error() route support
  * Added DSL level notFound() route support
  * Added Request#error()
  * Added Request#notFound()
  * Added Request#render() callback function. Closes #258
  * Added "max upload size" setting
  * Added "magic" variables to collection partials (\_\_index\_\_, \_\_length\_\_, \_\_isFirst\_\_, \_\_isLast\_\_). Closes #254
  * Added [haml.js](http://github.com/visionmedia/haml.js) submodule; removed haml-js
  * Added callback function support to Request#halt() as 3rd/4th arg
  * Added preprocessing of route param wildcards using param(). Closes #251
  * Added view partial support (with collections etc)
  * Fixed bug preventing falsey params (such as ?page=0). Closes #286
  * Fixed setting of multiple cookies. Closes #199
  * Changed; view naming convention is now NAME.TYPE.ENGINE (for example page.html.haml)
  * Changed; session cookie is now httpOnly
  * Changed; Request is no longer global
  * Changed; Event is no longer global
  * Changed; "sys" module is no longer global
  * Changed; moved Request#download to Static plugin where it belongs
  * Changed; Request instance created before body parsing. Closes #262
  * Changed; Pre-caching views in memory when "cache view contents" is enabled. Closes #253
  * Changed; Pre-caching view partials in memory when "cache view partials" is enabled
  * Updated support to node --version 0.1.90
  * Updated dependencies
  * Removed set("session cookie") in favour of use(Session, { cookie: { ... }})
  * Removed utils.mixin(); use Object#mergeDeep()

0.8.0 / 2010-03-19
==================

  * Added coffeescript example app. Closes #242
  * Changed; cache api now async friendly. Closes #240
  * Removed deprecated 'express/static' support. Use 'express/plugins/static'

0.7.6 / 2010-03-19
==================

  * Added Request#isXHR. Closes #229
  * Added `make install` (for the executable)
  * Added `express` executable for setting up simple app templates
  * Added "GET /public/*" to Static plugin, defaulting to <root>/public
  * Added Static plugin
  * Fixed; Request#render() only calls cache.get() once
  * Fixed; Namespacing View caches with "view:"
  * Fixed; Namespacing Static caches with "static:"
  * Fixed; Both example apps now use the Static plugin
  * Fixed set("views"). Closes #239
  * Fixed missing space for combined log format
  * Deprecated Request#sendfile() and 'express/static'
  * Removed Server#running

0.7.5 / 2010-03-16
==================

  * Added Request#flash() support without args, now returns all flashes
  * Updated ext submodule

0.7.4 / 2010-03-16
==================

  * Fixed session reaper
  * Changed; class.js replacing js-oo Class implementation (quite a bit faster, no browser cruft)

0.7.3 / 2010-03-16
==================

  * Added package.json
  * Fixed requiring of haml / sass due to kiwi removal

0.7.2 / 2010-03-16
==================

  * Fixed GIT submodules (HAH!)

0.7.1 / 2010-03-16
==================

  * Changed; Express now using submodules again until a PM is adopted
  * Changed; chat example using millisecond conversions from ext

0.7.0 / 2010-03-15
==================

  * Added Request#pass() support (finds the next matching route, or the given path)
  * Added Logger plugin (default "common" format replaces CommonLogger)
  * Removed Profiler plugin
  * Removed CommonLogger plugin

0.6.0 / 2010-03-11
==================

  * Added seed.yml for kiwi package management support
  * Added HTTP client query string support when method is GET. Closes #205

  * Added support for arbitrary view engines.
    For example "foo.engine.html" will now require('engine'),
    the exports from this module are cached after the first require().

  * Added async plugin support

  * Removed usage of RESTful route funcs as http client
    get() etc, use http.get() and friends

  * Removed custom exceptions

0.5.0 / 2010-03-10
==================

  * Added ext dependency (library of js extensions)
  * Removed extname() / basename() utils. Use path module
  * Removed toArray() util. Use arguments.values
  * Removed escapeRegexp() util. Use RegExp.escape()
  * Removed process.mixin() dependency. Use utils.mixin()
  * Removed Collection
  * Removed ElementCollection
  * Shameless self promotion of ebook "Advanced JavaScript" (http://dev-mag.com)  ;)

0.4.0 / 2010-02-11
==================

  * Added flash() example to sample upload app
  * Added high level restful http client module (express/http)
  * Changed; RESTful route functions double as HTTP clients. Closes #69
  * Changed; throwing error when routes are added at runtime
  * Changed; defaulting render() context to the current Request. Closes #197
  * Updated haml submodule

0.3.0 / 2010-02-11
==================

  * Updated haml / sass submodules. Closes #200
  * Added flash message support. Closes #64
  * Added accepts() now allows multiple args. fixes #117
  * Added support for plugins to halt. Closes #189
  * Added alternate layout support. Closes #119
  * Removed Route#run(). Closes #188
  * Fixed broken specs due to use(Cookie) missing

0.2.1 / 2010-02-05
==================

  * Added "plot" format option for Profiler (for gnuplot processing)
  * Added request number to Profiler plugin
  * Fixed binary encoding for multipart file uploads, was previously defaulting to UTF8
  * Fixed issue with routes not firing when not files are present. Closes #184
  * Fixed process.Promise -> events.Promise

0.2.0 / 2010-02-03
==================

  * Added parseParam() support for name[] etc. (allows for file inputs with "multiple" attr) Closes #180
  * Added Both Cache and Session option "reapInterval" may be "reapEvery". Closes #174
  * Added expiration support to cache api with reaper. Closes #133
  * Added cache Store.Memory#reap()
  * Added Cache; cache api now uses first class Cache instances
  * Added abstract session Store. Closes #172
  * Changed; cache Memory.Store#get() utilizing Collection
  * Renamed MemoryStore -> Store.Memory
  * Fixed use() of the same plugin several time will always use latest options. Closes #176

0.1.0 / 2010-02-03
==================

  * Changed; Hooks (before / after) pass request as arg as well as evaluated in their context
  * Updated node support to 0.1.27 Closes #169
  * Updated dirname(__filename) -> __dirname
  * Updated libxmljs support to v0.2.0
  * Added session support with memory store / reaping
  * Added quick uid() helper
  * Added multi-part upload support
  * Added Sass.js support / submodule
  * Added production env caching view contents and static files
  * Added static file caching. Closes #136
  * Added cache plugin with memory stores
  * Added support to StaticFile so that it works with non-textual files.
  * Removed dirname() helper
  * Removed several globals (now their modules must be required)

0.0.2 / 2010-01-10
==================

  * Added view benchmarks; currently haml vs ejs
  * Added Request#attachment() specs. Closes #116
  * Added use of node's parseQuery() util. Closes #123
  * Added `make init` for submodules
  * Updated Haml
  * Updated sample chat app to show messages on load
  * Updated libxmljs parseString -> parseHtmlString
  * Fixed `make init` to work with older versions of git
  * Fixed specs can now run independent specs for those who can't build deps. Closes #127
  * Fixed issues introduced by the node url module changes. Closes 126.
  * Fixed two assertions failing due to Collection#keys() returning strings
  * Fixed faulty Collection#toArray() spec due to keys() returning strings
  * Fixed `make test` now builds libxmljs.node before testing

0.0.1 / 2010-01-03
==================

  * Initial release
(The MIT License)

Copyright (c) 2009-2014 TJ Holowaychuk <tj@vision-media.ca>
Copyright (c) 2013-2014 Roman Shtylman <shtylman+expressjs@gmail.com>
Copyright (c) 2014-2015 Douglas Christopher Wilson <doug@somethingdoug.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.
/*!
 * express
 * Copyright(c) 2009-2013 TJ Holowaychuk
 * Copyright(c) 2013 Roman Shtylman
 * Copyright(c) 2014-2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict';

module.exports = require('./lib/express');
{
  "name": "express",
  "description": "Fast, unopinionated, minimalist web framework",
  "version": "4.18.1",
  "author": "TJ Holowaychuk <tj@vision-media.ca>",
  "license": "MIT",
  "repository": "expressjs/express",
  "homepage": "http://expressjs.com/",
  "dependencies": {
    "accepts": "~1.3.8",
    "array-flatten": "1.1.1",
    "body-parser": "1.20.0",
    "content-disposition": "0.5.4",
    "content-type": "~1.0.4",
    "cookie": "0.5.0",
    "cookie-signature": "1.0.6",
    "debug": "2.6.9",
    "depd": "2.0.0",
    "encodeurl": "~1.0.2",
    "escape-html": "~1.0.3",
    "etag": "~1.8.1",
    "finalhandler": "1.2.0",
    "fresh": "0.5.2",
    "http-errors": "2.0.0",
    "merge-descriptors": "1.0.1",
    "methods": "~1.1.2",
    "on-finished": "2.4.1",
    "parseurl": "~1.3.3",
    "path-to-regexp": "0.1.7",
    "proxy-addr": "~2.0.7",
    "qs": "6.10.3",
    "range-parser": "~1.2.1",
    "safe-buffer": "5.2.1",
    "send": "0.18.0",
    "serve-static": "1.15.0",
    "setprototypeof": "1.2.0",
    "statuses": "2.0.1",
    "type-is": "~1.6.18",
    "utils-merge": "1.0.1",
    "vary": "~1.1.2"
  },
  "devDependencies": {
    "after": "0.8.2",
    "connect-redis": "3.4.2",
    "cookie-parser": "1.4.6",
    "cookie-session": "2.0.0",
    "ejs": "3.1.7",
    "eslint": "7.32.0",
    "express-session": "1.17.2",
    "hbs": "4.2.0",
    "marked": "0.7.0",
    "method-override": "3.0.0",
    "mocha": "9.2.2",
    "morgan": "1.10.0",
    "multiparty": "4.2.3",
    "nyc": "15.1.0",
    "pbkdf2-password": "1.2.1",
    "supertest": "6.2.3",
    "vhost": "~3.0.2"
  },
  "engines": {
    "node": ">= 0.10.0"
  },
  "files": [
    "LICENSE",
    "History.md",
    "Readme.md",
    "index.js",
    "lib/"
  ]
}/*!
 * express
 * Copyright(c) 2009-2013 TJ Holowaychuk
 * Copyright(c) 2013 Roman Shtylman
 * Copyright(c) 2014-2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict';

/**
 * Module dependencies.
 * @private
 */

var finalhandler = require('finalhandler');
var Router = require('./router');
var methods = require('methods');
var middleware = require('./middleware/init');
var query = require('./middleware/query');
var debug = require('debug')('express:application');
var View = require('./view');
var http = require('http');
var compileETag = require('./utils').compileETag;
var compileQueryParser = require('./utils').compileQueryParser;
var compileTrust = require('./utils').compileTrust;
var deprecate = require('depd')('express');
var flatten = require('array-flatten');
var merge = require('utils-merge');
var resolve = require('path').resolve;
var setPrototypeOf = require('setprototypeof')

/**
 * Module variables.
 * @private
 */

var hasOwnProperty = Object.prototype.hasOwnProperty
var slice = Array.prototype.slice;

/**
 * Application prototype.
 */

var app = exports = module.exports = {};

/**
 * Variable for trust proxy inheritance back-compat
 * @private
 */

var trustProxyDefaultSymbol = '@@symbol:trust_proxy_default';

/**
 * Initialize the server.
 *
 *   - setup default configuration
 *   - setup default middleware
 *   - setup route reflection methods
 *
 * @private
 */

app.init = function init() {
  this.cache = {};
  this.engines = {};
  this.settings = {};

  this.defaultConfiguration();
};

/**
 * Initialize application configuration.
 * @private
 */

app.defaultConfiguration = function defaultConfiguration() {
  var env = process.env.NODE_ENV || 'development';

  // default settings
  this.enable('x-powered-by');
  this.set('etag', 'weak');
  this.set('env', env);
  this.set('query parser', 'extended');
  this.set('subdomain offset', 2);
  this.set('trust proxy', false);

  // trust proxy inherit back-compat
  Object.defineProperty(this.settings, trustProxyDefaultSymbol, {
    configurable: true,
    value: true
  });

  debug('booting in %s mode', env);

  this.on('mount', function onmount(parent) {
    // inherit trust proxy
    if (this.settings[trustProxyDefaultSymbol] === true
      && typeof parent.settings['trust proxy fn'] === 'function') {
      delete this.settings['trust proxy'];
      delete this.settings['trust proxy fn'];
    }

    // inherit protos
    setPrototypeOf(this.request, parent.request)
    setPrototypeOf(this.response, parent.response)
    setPrototypeOf(this.engines, parent.engines)
    setPrototypeOf(this.settings, parent.settings)
  });

  // setup locals
  this.locals = Object.create(null);

  // top-most app is mounted at /
  this.mountpath = '/';

  // default locals
  this.locals.settings = this.settings;

  // default configuration
  this.set('view', View);
  this.set('views', resolve('views'));
  this.set('jsonp callback name', 'callback');

  if (env === 'production') {
    this.enable('view cache');
  }

  Object.defineProperty(this, 'router', {
    get: function() {
      throw new Error('\'app.router\' is deprecated!\nPlease see the 3.x to 4.x migration guide for details on how to update your app.');
    }
  });
};

/**
 * lazily adds the base router if it has not yet been added.
 *
 * We cannot add the base router in the defaultConfiguration because
 * it reads app settings which might be set after that has run.
 *
 * @private
 */
app.lazyrouter = function lazyrouter() {
  if (!this._router) {
    this._router = new Router({
      caseSensitive: this.enabled('case sensitive routing'),
      strict: this.enabled('strict routing')
    });

    this._router.use(query(this.get('query parser fn')));
    this._router.use(middleware.init(this));
  }
};

/**
 * Dispatch a req, res pair into the application. Starts pipeline processing.
 *
 * If no callback is provided, then default error handlers will respond
 * in the event of an error bubbling through the stack.
 *
 * @private
 */

app.handle = function handle(req, res, callback) {
  var router = this._router;

  // final handler
  var done = callback || finalhandler(req, res, {
    env: this.get('env'),
    onerror: logerror.bind(this)
  });

  // no routes
  if (!router) {
    debug('no routes defined on app');
    done();
    return;
  }

  router.handle(req, res, done);
};

/**
 * Proxy `Router#use()` to add middleware to the app router.
 * See Router#use() documentation for details.
 *
 * If the _fn_ parameter is an express app, then it will be
 * mounted at the _route_ specified.
 *
 * @public
 */

app.use = function use(fn) {
  var offset = 0;
  var path = '/';

  // default path to '/'
  // disambiguate app.use([fn])
  if (typeof fn !== 'function') {
    var arg = fn;

    while (Array.isArray(arg) && arg.length !== 0) {
      arg = arg[0];
    }

    // first arg is the path
    if (typeof arg !== 'function') {
      offset = 1;
      path = fn;
    }
  }

  var fns = flatten(slice.call(arguments, offset));

  if (fns.length === 0) {
    throw new TypeError('app.use() requires a middleware function')
  }

  // setup router
  this.lazyrouter();
  var router = this._router;

  fns.forEach(function (fn) {
    // non-express app
    if (!fn || !fn.handle || !fn.set) {
      return router.use(path, fn);
    }

    debug('.use app under %s', path);
    fn.mountpath = path;
    fn.parent = this;

    // restore .app property on req and res
    router.use(path, function mounted_app(req, res, next) {
      var orig = req.app;
      fn.handle(req, res, function (err) {
        setPrototypeOf(req, orig.request)
        setPrototypeOf(res, orig.response)
        next(err);
      });
    });

    // mounted an app
    fn.emit('mount', this);
  }, this);

  return this;
};

/**
 * Proxy to the app `Router#route()`
 * Returns a new `Route` instance for the _path_.
 *
 * Routes are isolated middleware stacks for specific paths.
 * See the Route api docs for details.
 *
 * @public
 */

app.route = function route(path) {
  this.lazyrouter();
  return this._router.route(path);
};

/**
 * Register the given template engine callback `fn`
 * as `ext`.
 *
 * By default will `require()` the engine based on the
 * file extension. For example if you try to render
 * a "foo.ejs" file Express will invoke the following internally:
 *
 *     app.engine('ejs', require('ejs').__express);
 *
 * For engines that do not provide `.__express` out of the box,
 * or if you wish to "map" a different extension to the template engine
 * you may use this method. For example mapping the EJS template engine to
 * ".html" files:
 *
 *     app.engine('html', require('ejs').renderFile);
 *
 * In this case EJS provides a `.renderFile()` method with
 * the same signature that Express expects: `(path, options, callback)`,
 * though note that it aliases this method as `ejs.__express` internally
 * so if you're using ".ejs" extensions you don't need to do anything.
 *
 * Some template engines do not follow this convention, the
 * [Consolidate.js](https://github.com/tj/consolidate.js)
 * library was created to map all of node's popular template
 * engines to follow this convention, thus allowing them to
 * work seamlessly within Express.
 *
 * @param {String} ext
 * @param {Function} fn
 * @return {app} for chaining
 * @public
 */

app.engine = function engine(ext, fn) {
  if (typeof fn !== 'function') {
    throw new Error('callback function required');
  }

  // get file extension
  var extension = ext[0] !== '.'
    ? '.' + ext
    : ext;

  // store engine
  this.engines[extension] = fn;

  return this;
};

/**
 * Proxy to `Router#param()` with one added api feature. The _name_ parameter
 * can be an array of names.
 *
 * See the Router#param() docs for more details.
 *
 * @param {String|Array} name
 * @param {Function} fn
 * @return {app} for chaining
 * @public
 */

app.param = function param(name, fn) {
  this.lazyrouter();

  if (Array.isArray(name)) {
    for (var i = 0; i < name.length; i++) {
      this.param(name[i], fn);
    }

    return this;
  }

  this._router.param(name, fn);

  return this;
};

/**
 * Assign `setting` to `val`, or return `setting`'s value.
 *
 *    app.set('foo', 'bar');
 *    app.set('foo');
 *    // => "bar"
 *
 * Mounted servers inherit their parent server's settings.
 *
 * @param {String} setting
 * @param {*} [val]
 * @return {Server} for chaining
 * @public
 */

app.set = function set(setting, val) {
  if (arguments.length === 1) {
    // app.get(setting)
    var settings = this.settings

    while (settings && settings !== Object.prototype) {
      if (hasOwnProperty.call(settings, setting)) {
        return settings[setting]
      }

      settings = Object.getPrototypeOf(settings)
    }

    return undefined
  }

  debug('set "%s" to %o', setting, val);

  // set value
  this.settings[setting] = val;

  // trigger matched settings
  switch (setting) {
    case 'etag':
      this.set('etag fn', compileETag(val));
      break;
    case 'query parser':
      this.set('query parser fn', compileQueryParser(val));
      break;
    case 'trust proxy':
      this.set('trust proxy fn', compileTrust(val));

      // trust proxy inherit back-compat
      Object.defineProperty(this.settings, trustProxyDefaultSymbol, {
        configurable: true,
        value: false
      });

      break;
  }

  return this;
};

/**
 * Return the app's absolute pathname
 * based on the parent(s) that have
 * mounted it.
 *
 * For example if the application was
 * mounted as "/admin", which itself
 * was mounted as "/blog" then the
 * return value would be "/blog/admin".
 *
 * @return {String}
 * @private
 */

app.path = function path() {
  return this.parent
    ? this.parent.path() + this.mountpath
    : '';
};

/**
 * Check if `setting` is enabled (truthy).
 *
 *    app.enabled('foo')
 *    // => false
 *
 *    app.enable('foo')
 *    app.enabled('foo')
 *    // => true
 *
 * @param {String} setting
 * @return {Boolean}
 * @public
 */

app.enabled = function enabled(setting) {
  return Boolean(this.set(setting));
};

/**
 * Check if `setting` is disabled.
 *
 *    app.disabled('foo')
 *    // => true
 *
 *    app.enable('foo')
 *    app.disabled('foo')
 *    // => false
 *
 * @param {String} setting
 * @return {Boolean}
 * @public
 */

app.disabled = function disabled(setting) {
  return !this.set(setting);
};

/**
 * Enable `setting`.
 *
 * @param {String} setting
 * @return {app} for chaining
 * @public
 */

app.enable = function enable(setting) {
  return this.set(setting, true);
};

/**
 * Disable `setting`.
 *
 * @param {String} setting
 * @return {app} for chaining
 * @public
 */

app.disable = function disable(setting) {
  return this.set(setting, false);
};

/**
 * Delegate `.VERB(...)` calls to `router.VERB(...)`.
 */

methods.forEach(function(method){
  app[method] = function(path){
    if (method === 'get' && arguments.length === 1) {
      // app.get(setting)
      return this.set(path);
    }

    this.lazyrouter();

    var route = this._router.route(path);
    route[method].apply(route, slice.call(arguments, 1));
    return this;
  };
});

/**
 * Special-cased "all" method, applying the given route `path`,
 * middleware, and callback to _every_ HTTP method.
 *
 * @param {String} path
 * @param {Function} ...
 * @return {app} for chaining
 * @public
 */

app.all = function all(path) {
  this.lazyrouter();

  var route = this._router.route(path);
  var args = slice.call(arguments, 1);

  for (var i = 0; i < methods.length; i++) {
    route[methods[i]].apply(route, args);
  }

  return this;
};

// del -> delete alias

app.del = deprecate.function(app.delete, 'app.del: Use app.delete instead');

/**
 * Render the given view `name` name with `options`
 * and a callback accepting an error and the
 * rendered template string.
 *
 * Example:
 *
 *    app.render('email', { name: 'Tobi' }, function(err, html){
 *      // ...
 *    })
 *
 * @param {String} name
 * @param {Object|Function} options or fn
 * @param {Function} callback
 * @public
 */

app.render = function render(name, options, callback) {
  var cache = this.cache;
  var done = callback;
  var engines = this.engines;
  var opts = options;
  var renderOptions = {};
  var view;

  // support callback function as second arg
  if (typeof options === 'function') {
    done = options;
    opts = {};
  }

  // merge app.locals
  merge(renderOptions, this.locals);

  // merge options._locals
  if (opts._locals) {
    merge(renderOptions, opts._locals);
  }

  // merge options
  merge(renderOptions, opts);

  // set .cache unless explicitly provided
  if (renderOptions.cache == null) {
    renderOptions.cache = this.enabled('view cache');
  }

  // primed cache
  if (renderOptions.cache) {
    view = cache[name];
  }

  // view
  if (!view) {
    var View = this.get('view');

    view = new View(name, {
      defaultEngine: this.get('view engine'),
      root: this.get('views'),
      engines: engines
    });

    if (!view.path) {
      var dirs = Array.isArray(view.root) && view.root.length > 1
        ? 'directories "' + view.root.slice(0, -1).join('", "') + '" or "' + view.root[view.root.length - 1] + '"'
        : 'directory "' + view.root + '"'
      var err = new Error('Failed to lookup view "' + name + '" in views ' + dirs);
      err.view = view;
      return done(err);
    }

    // prime the cache
    if (renderOptions.cache) {
      cache[name] = view;
    }
  }

  // render
  tryRender(view, renderOptions, done);
};

/**
 * Listen for connections.
 *
 * A node `http.Server` is returned, with this
 * application (which is a `Function`) as its
 * callback. If you wish to create both an HTTP
 * and HTTPS server you may do so with the "http"
 * and "https" modules as shown here:
 *
 *    var http = require('http')
 *      , https = require('https')
 *      , express = require('express')
 *      , app = express();
 *
 *    http.createServer(app).listen(80);
 *    https.createServer({ ... }, app).listen(443);
 *
 * @return {http.Server}
 * @public
 */

app.listen = function listen() {
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};

/**
 * Log error using console.error.
 *
 * @param {Error} err
 * @private
 */

function logerror(err) {
  /* istanbul ignore next */
  if (this.get('env') !== 'test') console.error(err.stack || err.toString());
}

/**
 * Try rendering a view.
 * @private
 */

function tryRender(view, options, callback) {
  try {
    view.render(options, callback);
  } catch (err) {
    callback(err);
  }
}
/*!
 * express
 * Copyright(c) 2009-2013 TJ Holowaychuk
 * Copyright(c) 2013 Roman Shtylman
 * Copyright(c) 2014-2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict';

/**
 * Module dependencies.
 */

var bodyParser = require('body-parser')
var EventEmitter = require('events').EventEmitter;
var mixin = require('merge-descriptors');
var proto = require('./application');
var Route = require('./router/route');
var Router = require('./router');
var req = require('./request');
var res = require('./response');

/**
 * Expose `createApplication()`.
 */

exports = module.exports = createApplication;

/**
 * Create an express application.
 *
 * @return {Function}
 * @api public
 */

function createApplication() {
  var app = function(req, res, next) {
    app.handle(req, res, next);
  };

  mixin(app, EventEmitter.prototype, false);
  mixin(app, proto, false);

  // expose the prototype that will get set on requests
  app.request = Object.create(req, {
    app: { configurable: true, enumerable: true, writable: true, value: app }
  })

  // expose the prototype that will get set on responses
  app.response = Object.create(res, {
    app: { configurable: true, enumerable: true, writable: true, value: app }
  })

  app.init();
  return app;
}

/**
 * Expose the prototypes.
 */

exports.application = proto;
exports.request = req;
exports.response = res;

/**
 * Expose constructors.
 */

exports.Route = Route;
exports.Router = Router;

/**
 * Expose middleware
 */

exports.json = bodyParser.json
exports.query = require('./middleware/query');
exports.raw = bodyParser.raw
exports.static = require('serve-static');
exports.text = bodyParser.text
exports.urlencoded = bodyParser.urlencoded

/**
 * Replace removed middleware with an appropriate error message.
 */

var removedMiddlewares = [
  'bodyParser',
  'compress',
  'cookieSession',
  'session',
  'logger',
  'cookieParser',
  'favicon',
  'responseTime',
  'errorHandler',
  'timeout',
  'methodOverride',
  'vhost',
  'csrf',
  'directory',
  'limit',
  'multipart',
  'staticCache'
]

removedMiddlewares.forEach(function (name) {
  Object.defineProperty(exports, name, {
    get: function () {
      throw new Error('Most middleware (like ' + name + ') is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware.');
    },
    configurable: true
  });
});
/*!
 * express
 * Copyright(c) 2009-2013 TJ Holowaychuk
 * Copyright(c) 2013 Roman Shtylman
 * Copyright(c) 2014-2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict';

/**
 * Module dependencies.
 * @private
 */

var accepts = require('accepts');
var deprecate = require('depd')('express');
var isIP = require('net').isIP;
var typeis = require('type-is');
var http = require('http');
var fresh = require('fresh');
var parseRange = require('range-parser');
var parse = require('parseurl');
var proxyaddr = require('proxy-addr');

/**
 * Request prototype.
 * @public
 */

var req = Object.create(http.IncomingMessage.prototype)

/**
 * Module exports.
 * @public
 */

module.exports = req

/**
 * Return request header.
 *
 * The `Referrer` header field is special-cased,
 * both `Referrer` and `Referer` are interchangeable.
 *
 * Examples:
 *
 *     req.get('Content-Type');
 *     // => "text/plain"
 *
 *     req.get('content-type');
 *     // => "text/plain"
 *
 *     req.get('Something');
 *     // => undefined
 *
 * Aliased as `req.header()`.
 *
 * @param {String} name
 * @return {String}
 * @public
 */

req.get =
req.header = function header(name) {
  if (!name) {
    throw new TypeError('name argument is required to req.get');
  }

  if (typeof name !== 'string') {
    throw new TypeError('name must be a string to req.get');
  }

  var lc = name.toLowerCase();

  switch (lc) {
    case 'referer':
    case 'referrer':
      return this.headers.referrer
        || this.headers.referer;
    default:
      return this.headers[lc];
  }
};

/**
 * To do: update docs.
 *
 * Check if the given `type(s)` is acceptable, returning
 * the best match when true, otherwise `undefined`, in which
 * case you should respond with 406 "Not Acceptable".
 *
 * The `type` value may be a single MIME type string
 * such as "application/json", an extension name
 * such as "json", a comma-delimited list such as "json, html, text/plain",
 * an argument list such as `"json", "html", "text/plain"`,
 * or an array `["json", "html", "text/plain"]`. When a list
 * or array is given, the _best_ match, if any is returned.
 *
 * Examples:
 *
 *     // Accept: text/html
 *     req.accepts('html');
 *     // => "html"
 *
 *     // Accept: text/*, application/json
 *     req.accepts('html');
 *     // => "html"
 *     req.accepts('text/html');
 *     // => "text/html"
 *     req.accepts('json, text');
 *     // => "json"
 *     req.accepts('application/json');
 *     // => "application/json"
 *
 *     // Accept: text/*, application/json
 *     req.accepts('image/png');
 *     req.accepts('png');
 *     // => undefined
 *
 *     // Accept: text/*;q=.5, application/json
 *     req.accepts(['html', 'json']);
 *     req.accepts('html', 'json');
 *     req.accepts('html, json');
 *     // => "json"
 *
 * @param {String|Array} type(s)
 * @return {String|Array|Boolean}
 * @public
 */

req.accepts = function(){
  var accept = accepts(this);
  return accept.types.apply(accept, arguments);
};

/**
 * Check if the given `encoding`s are accepted.
 *
 * @param {String} ...encoding
 * @return {String|Array}
 * @public
 */

req.acceptsEncodings = function(){
  var accept = accepts(this);
  return accept.encodings.apply(accept, arguments);
};

req.acceptsEncoding = deprecate.function(req.acceptsEncodings,
  'req.acceptsEncoding: Use acceptsEncodings instead');

/**
 * Check if the given `charset`s are acceptable,
 * otherwise you should respond with 406 "Not Acceptable".
 *
 * @param {String} ...charset
 * @return {String|Array}
 * @public
 */

req.acceptsCharsets = function(){
  var accept = accepts(this);
  return accept.charsets.apply(accept, arguments);
};

req.acceptsCharset = deprecate.function(req.acceptsCharsets,
  'req.acceptsCharset: Use acceptsCharsets instead');

/**
 * Check if the given `lang`s are acceptable,
 * otherwise you should respond with 406 "Not Acceptable".
 *
 * @param {String} ...lang
 * @return {String|Array}
 * @public
 */

req.acceptsLanguages = function(){
  var accept = accepts(this);
  return accept.languages.apply(accept, arguments);
};

req.acceptsLanguage = deprecate.function(req.acceptsLanguages,
  'req.acceptsLanguage: Use acceptsLanguages instead');

/**
 * Parse Range header field, capping to the given `size`.
 *
 * Unspecified ranges such as "0-" require knowledge of your resource length. In
 * the case of a byte range this is of course the total number of bytes. If the
 * Range header field is not given `undefined` is returned, `-1` when unsatisfiable,
 * and `-2` when syntactically invalid.
 *
 * When ranges are returned, the array has a "type" property which is the type of
 * range that is required (most commonly, "bytes"). Each array element is an object
 * with a "start" and "end" property for the portion of the range.
 *
 * The "combine" option can be set to `true` and overlapping & adjacent ranges
 * will be combined into a single range.
 *
 * NOTE: remember that ranges are inclusive, so for example "Range: users=0-3"
 * should respond with 4 users when available, not 3.
 *
 * @param {number} size
 * @param {object} [options]
 * @param {boolean} [options.combine=false]
 * @return {number|array}
 * @public
 */

req.range = function range(size, options) {
  var range = this.get('Range');
  if (!range) return;
  return parseRange(size, range, options);
};

/**
 * Return the value of param `name` when present or `defaultValue`.
 *
 *  - Checks route placeholders, ex: _/user/:id_
 *  - Checks body params, ex: id=12, {"id":12}
 *  - Checks query string params, ex: ?id=12
 *
 * To utilize request bodies, `req.body`
 * should be an object. This can be done by using
 * the `bodyParser()` middleware.
 *
 * @param {String} name
 * @param {Mixed} [defaultValue]
 * @return {String}
 * @public
 */

req.param = function param(name, defaultValue) {
  var params = this.params || {};
  var body = this.body || {};
  var query = this.query || {};

  var args = arguments.length === 1
    ? 'name'
    : 'name, default';
  deprecate('req.param(' + args + '): Use req.params, req.body, or req.query instead');

  if (null != params[name] && params.hasOwnProperty(name)) return params[name];
  if (null != body[name]) return body[name];
  if (null != query[name]) return query[name];

  return defaultValue;
};

/**
 * Check if the incoming request contains the "Content-Type"
 * header field, and it contains the given mime `type`.
 *
 * Examples:
 *
 *      // With Content-Type: text/html; charset=utf-8
 *      req.is('html');
 *      req.is('text/html');
 *      req.is('text/*');
 *      // => true
 *
 *      // When Content-Type is application/json
 *      req.is('json');
 *      req.is('application/json');
 *      req.is('application/*');
 *      // => true
 *
 *      req.is('html');
 *      // => false
 *
 * @param {String|Array} types...
 * @return {String|false|null}
 * @public
 */

req.is = function is(types) {
  var arr = types;

  // support flattened arguments
  if (!Array.isArray(types)) {
    arr = new Array(arguments.length);
    for (var i = 0; i < arr.length; i++) {
      arr[i] = arguments[i];
    }
  }

  return typeis(this, arr);
};

/**
 * Return the protocol string "http" or "https"
 * when requested with TLS. When the "trust proxy"
 * setting trusts the socket address, the
 * "X-Forwarded-Proto" header field will be trusted
 * and used if present.
 *
 * If you're running behind a reverse proxy that
 * supplies https for you this may be enabled.
 *
 * @return {String}
 * @public
 */

defineGetter(req, 'protocol', function protocol(){
  var proto = this.connection.encrypted
    ? 'https'
    : 'http';
  var trust = this.app.get('trust proxy fn');

  if (!trust(this.connection.remoteAddress, 0)) {
    return proto;
  }

  // Note: X-Forwarded-Proto is normally only ever a
  //       single value, but this is to be safe.
  var header = this.get('X-Forwarded-Proto') || proto
  var index = header.indexOf(',')

  return index !== -1
    ? header.substring(0, index).trim()
    : header.trim()
});

/**
 * Short-hand for:
 *
 *    req.protocol === 'https'
 *
 * @return {Boolean}
 * @public
 */

defineGetter(req, 'secure', function secure(){
  return this.protocol === 'https';
});

/**
 * Return the remote address from the trusted proxy.
 *
 * The is the remote address on the socket unless
 * "trust proxy" is set.
 *
 * @return {String}
 * @public
 */

defineGetter(req, 'ip', function ip(){
  var trust = this.app.get('trust proxy fn');
  return proxyaddr(this, trust);
});

/**
 * When "trust proxy" is set, trusted proxy addresses + client.
 *
 * For example if the value were "client, proxy1, proxy2"
 * you would receive the array `["client", "proxy1", "proxy2"]`
 * where "proxy2" is the furthest down-stream and "proxy1" and
 * "proxy2" were trusted.
 *
 * @return {Array}
 * @public
 */

defineGetter(req, 'ips', function ips() {
  var trust = this.app.get('trust proxy fn');
  var addrs = proxyaddr.all(this, trust);

  // reverse the order (to farthest -> closest)
  // and remove socket address
  addrs.reverse().pop()

  return addrs
});

/**
 * Return subdomains as an array.
 *
 * Subdomains are the dot-separated parts of the host before the main domain of
 * the app. By default, the domain of the app is assumed to be the last two
 * parts of the host. This can be changed by setting "subdomain offset".
 *
 * For example, if the domain is "tobi.ferrets.example.com":
 * If "subdomain offset" is not set, req.subdomains is `["ferrets", "tobi"]`.
 * If "subdomain offset" is 3, req.subdomains is `["tobi"]`.
 *
 * @return {Array}
 * @public
 */

defineGetter(req, 'subdomains', function subdomains() {
  var hostname = this.hostname;

  if (!hostname) return [];

  var offset = this.app.get('subdomain offset');
  var subdomains = !isIP(hostname)
    ? hostname.split('.').reverse()
    : [hostname];

  return subdomains.slice(offset);
});

/**
 * Short-hand for `url.parse(req.url).pathname`.
 *
 * @return {String}
 * @public
 */

defineGetter(req, 'path', function path() {
  return parse(this).pathname;
});

/**
 * Parse the "Host" header field to a hostname.
 *
 * When the "trust proxy" setting trusts the socket
 * address, the "X-Forwarded-Host" header field will
 * be trusted.
 *
 * @return {String}
 * @public
 */

defineGetter(req, 'hostname', function hostname(){
  var trust = this.app.get('trust proxy fn');
  var host = this.get('X-Forwarded-Host');

  if (!host || !trust(this.connection.remoteAddress, 0)) {
    host = this.get('Host');
  } else if (host.indexOf(',') !== -1) {
    // Note: X-Forwarded-Host is normally only ever a
    //       single value, but this is to be safe.
    host = host.substring(0, host.indexOf(',')).trimRight()
  }

  if (!host) return;

  // IPv6 literal support
  var offset = host[0] === '['
    ? host.indexOf(']') + 1
    : 0;
  var index = host.indexOf(':', offset);

  return index !== -1
    ? host.substring(0, index)
    : host;
});

// TODO: change req.host to return host in next major

defineGetter(req, 'host', deprecate.function(function host(){
  return this.hostname;
}, 'req.host: Use req.hostname instead'));

/**
 * Check if the request is fresh, aka
 * Last-Modified and/or the ETag
 * still match.
 *
 * @return {Boolean}
 * @public
 */

defineGetter(req, 'fresh', function(){
  var method = this.method;
  var res = this.res
  var status = res.statusCode

  // GET or HEAD for weak freshness validation only
  if ('GET' !== method && 'HEAD' !== method) return false;

  // 2xx or 304 as per rfc2616 14.26
  if ((status >= 200 && status < 300) || 304 === status) {
    return fresh(this.headers, {
      'etag': res.get('ETag'),
      'last-modified': res.get('Last-Modified')
    })
  }

  return false;
});

/**
 * Check if the request is stale, aka
 * "Last-Modified" and / or the "ETag" for the
 * resource has changed.
 *
 * @return {Boolean}
 * @public
 */

defineGetter(req, 'stale', function stale(){
  return !this.fresh;
});

/**
 * Check if the request was an _XMLHttpRequest_.
 *
 * @return {Boolean}
 * @public
 */

defineGetter(req, 'xhr', function xhr(){
  var val = this.get('X-Requested-With') || '';
  return val.toLowerCase() === 'xmlhttprequest';
});

/**
 * Helper function for creating a getter on an object.
 *
 * @param {Object} obj
 * @param {String} name
 * @param {Function} getter
 * @private
 */
function defineGetter(obj, name, getter) {
  Object.defineProperty(obj, name, {
    configurable: true,
    enumerable: true,
    get: getter
  });
}
/*!
 * express
 * Copyright(c) 2009-2013 TJ Holowaychuk
 * Copyright(c) 2014-2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict';

/**
 * Module dependencies.
 * @private
 */

var Buffer = require('safe-buffer').Buffer
var contentDisposition = require('content-disposition');
var createError = require('http-errors')
var deprecate = require('depd')('express');
var encodeUrl = require('encodeurl');
var escapeHtml = require('escape-html');
var http = require('http');
var isAbsolute = require('./utils').isAbsolute;
var onFinished = require('on-finished');
var path = require('path');
var statuses = require('statuses')
var merge = require('utils-merge');
var sign = require('cookie-signature').sign;
var normalizeType = require('./utils').normalizeType;
var normalizeTypes = require('./utils').normalizeTypes;
var setCharset = require('./utils').setCharset;
var cookie = require('cookie');
var send = require('send');
var extname = path.extname;
var mime = send.mime;
var resolve = path.resolve;
var vary = require('vary');

/**
 * Response prototype.
 * @public
 */

var res = Object.create(http.ServerResponse.prototype)

/**
 * Module exports.
 * @public
 */

module.exports = res

/**
 * Module variables.
 * @private
 */

var charsetRegExp = /;\s*charset\s*=/;

/**
 * Set status `code`.
 *
 * @param {Number} code
 * @return {ServerResponse}
 * @public
 */

res.status = function status(code) {
  if ((typeof code === 'string' || Math.floor(code) !== code) && code > 99 && code < 1000) {
    deprecate('res.status(' + JSON.stringify(code) + '): use res.status(' + Math.floor(code) + ') instead')
  }
  this.statusCode = code;
  return this;
};

/**
 * Set Link header field with the given `links`.
 *
 * Examples:
 *
 *    res.links({
 *      next: 'http://api.example.com/users?page=2',
 *      last: 'http://api.example.com/users?page=5'
 *    });
 *
 * @param {Object} links
 * @return {ServerResponse}
 * @public
 */

res.links = function(links){
  var link = this.get('Link') || '';
  if (link) link += ', ';
  return this.set('Link', link + Object.keys(links).map(function(rel){
    return '<' + links[rel] + '>; rel="' + rel + '"';
  }).join(', '));
};

/**
 * Send a response.
 *
 * Examples:
 *
 *     res.send(Buffer.from('wahoo'));
 *     res.send({ some: 'json' });
 *     res.send('<p>some html</p>');
 *
 * @param {string|number|boolean|object|Buffer} body
 * @public
 */

res.send = function send(body) {
  var chunk = body;
  var encoding;
  var req = this.req;
  var type;

  // settings
  var app = this.app;

  // allow status / body
  if (arguments.length === 2) {
    // res.send(body, status) backwards compat
    if (typeof arguments[0] !== 'number' && typeof arguments[1] === 'number') {
      deprecate('res.send(body, status): Use res.status(status).send(body) instead');
      this.statusCode = arguments[1];
    } else {
      deprecate('res.send(status, body): Use res.status(status).send(body) instead');
      this.statusCode = arguments[0];
      chunk = arguments[1];
    }
  }

  // disambiguate res.send(status) and res.send(status, num)
  if (typeof chunk === 'number' && arguments.length === 1) {
    // res.send(status) will set status message as text string
    if (!this.get('Content-Type')) {
      this.type('txt');
    }

    deprecate('res.send(status): Use res.sendStatus(status) instead');
    this.statusCode = chunk;
    chunk = statuses.message[chunk]
  }

  switch (typeof chunk) {
    // string defaulting to html
    case 'string':
      if (!this.get('Content-Type')) {
        this.type('html');
      }
      break;
    case 'boolean':
    case 'number':
    case 'object':
      if (chunk === null) {
        chunk = '';
      } else if (Buffer.isBuffer(chunk)) {
        if (!this.get('Content-Type')) {
          this.type('bin');
        }
      } else {
        return this.json(chunk);
      }
      break;
  }

  // write strings in utf-8
  if (typeof chunk === 'string') {
    encoding = 'utf8';
    type = this.get('Content-Type');

    // reflect this in content-type
    if (typeof type === 'string') {
      this.set('Content-Type', setCharset(type, 'utf-8'));
    }
  }

  // determine if ETag should be generated
  var etagFn = app.get('etag fn')
  var generateETag = !this.get('ETag') && typeof etagFn === 'function'

  // populate Content-Length
  var len
  if (chunk !== undefined) {
    if (Buffer.isBuffer(chunk)) {
      // get length of Buffer
      len = chunk.length
    } else if (!generateETag && chunk.length < 1000) {
      // just calculate length when no ETag + small chunk
      len = Buffer.byteLength(chunk, encoding)
    } else {
      // convert chunk to Buffer and calculate
      chunk = Buffer.from(chunk, encoding)
      encoding = undefined;
      len = chunk.length
    }

    this.set('Content-Length', len);
  }

  // populate ETag
  var etag;
  if (generateETag && len !== undefined) {
    if ((etag = etagFn(chunk, encoding))) {
      this.set('ETag', etag);
    }
  }

  // freshness
  if (req.fresh) this.statusCode = 304;

  // strip irrelevant headers
  if (204 === this.statusCode || 304 === this.statusCode) {
    this.removeHeader('Content-Type');
    this.removeHeader('Content-Length');
    this.removeHeader('Transfer-Encoding');
    chunk = '';
  }

  // alter headers for 205
  if (this.statusCode === 205) {
    this.set('Content-Length', '0')
    this.removeHeader('Transfer-Encoding')
    chunk = ''
  }

  if (req.method === 'HEAD') {
    // skip body for HEAD
    this.end();
  } else {
    // respond
    this.end(chunk, encoding);
  }

  return this;
};

/**
 * Send JSON response.
 *
 * Examples:
 *
 *     res.json(null);
 *     res.json({ user: 'tj' });
 *
 * @param {string|number|boolean|object} obj
 * @public
 */

res.json = function json(obj) {
  var val = obj;

  // allow status / body
  if (arguments.length === 2) {
    // res.json(body, status) backwards compat
    if (typeof arguments[1] === 'number') {
      deprecate('res.json(obj, status): Use res.status(status).json(obj) instead');
      this.statusCode = arguments[1];
    } else {
      deprecate('res.json(status, obj): Use res.status(status).json(obj) instead');
      this.statusCode = arguments[0];
      val = arguments[1];
    }
  }

  // settings
  var app = this.app;
  var escape = app.get('json escape')
  var replacer = app.get('json replacer');
  var spaces = app.get('json spaces');
  var body = stringify(val, replacer, spaces, escape)

  // content-type
  if (!this.get('Content-Type')) {
    this.set('Content-Type', 'application/json');
  }

  return this.send(body);
};

/**
 * Send JSON response with JSONP callback support.
 *
 * Examples:
 *
 *     res.jsonp(null);
 *     res.jsonp({ user: 'tj' });
 *
 * @param {string|number|boolean|object} obj
 * @public
 */

res.jsonp = function jsonp(obj) {
  var val = obj;

  // allow status / body
  if (arguments.length === 2) {
    // res.jsonp(body, status) backwards compat
    if (typeof arguments[1] === 'number') {
      deprecate('res.jsonp(obj, status): Use res.status(status).jsonp(obj) instead');
      this.statusCode = arguments[1];
    } else {
      deprecate('res.jsonp(status, obj): Use res.status(status).jsonp(obj) instead');
      this.statusCode = arguments[0];
      val = arguments[1];
    }
  }

  // settings
  var app = this.app;
  var escape = app.get('json escape')
  var replacer = app.get('json replacer');
  var spaces = app.get('json spaces');
  var body = stringify(val, replacer, spaces, escape)
  var callback = this.req.query[app.get('jsonp callback name')];

  // content-type
  if (!this.get('Content-Type')) {
    this.set('X-Content-Type-Options', 'nosniff');
    this.set('Content-Type', 'application/json');
  }

  // fixup callback
  if (Array.isArray(callback)) {
    callback = callback[0];
  }

  // jsonp
  if (typeof callback === 'string' && callback.length !== 0) {
    this.set('X-Content-Type-Options', 'nosniff');
    this.set('Content-Type', 'text/javascript');

    // restrict callback charset
    callback = callback.replace(/[^\[\]\w$.]/g, '');

    if (body === undefined) {
      // empty argument
      body = ''
    } else if (typeof body === 'string') {
      // replace chars not allowed in JavaScript that are in JSON
      body = body
        .replace(/\u2028/g, '\\u2028')
        .replace(/\u2029/g, '\\u2029')
    }

    // the /**/ is a specific security mitigation for "Rosetta Flash JSONP abuse"
    // the typeof check is just to reduce client error noise
    body = '/**/ typeof ' + callback + ' === \'function\' && ' + callback + '(' + body + ');';
  }

  return this.send(body);
};

/**
 * Send given HTTP status code.
 *
 * Sets the response status to `statusCode` and the body of the
 * response to the standard description from node's http.STATUS_CODES
 * or the statusCode number if no description.
 *
 * Examples:
 *
 *     res.sendStatus(200);
 *
 * @param {number} statusCode
 * @public
 */

res.sendStatus = function sendStatus(statusCode) {
  var body = statuses.message[statusCode] || String(statusCode)

  this.statusCode = statusCode;
  this.type('txt');

  return this.send(body);
};

/**
 * Transfer the file at the given `path`.
 *
 * Automatically sets the _Content-Type_ response header field.
 * The callback `callback(err)` is invoked when the transfer is complete
 * or when an error occurs. Be sure to check `res.headersSent`
 * if you wish to attempt responding, as the header and some data
 * may have already been transferred.
 *
 * Options:
 *
 *   - `maxAge`   defaulting to 0 (can be string converted by `ms`)
 *   - `root`     root directory for relative filenames
 *   - `headers`  object of headers to serve with file
 *   - `dotfiles` serve dotfiles, defaulting to false; can be `"allow"` to send them
 *
 * Other options are passed along to `send`.
 *
 * Examples:
 *
 *  The following example illustrates how `res.sendFile()` may
 *  be used as an alternative for the `static()` middleware for
 *  dynamic situations. The code backing `res.sendFile()` is actually
 *  the same code, so HTTP cache support etc is identical.
 *
 *     app.get('/user/:uid/photos/:file', function(req, res){
 *       var uid = req.params.uid
 *         , file = req.params.file;
 *
 *       req.user.mayViewFilesFrom(uid, function(yes){
 *         if (yes) {
 *           res.sendFile('/uploads/' + uid + '/' + file);
 *         } else {
 *           res.send(403, 'Sorry! you cant see that.');
 *         }
 *       });
 *     });
 *
 * @public
 */

res.sendFile = function sendFile(path, options, callback) {
  var done = callback;
  var req = this.req;
  var res = this;
  var next = req.next;
  var opts = options || {};

  if (!path) {
    throw new TypeError('path argument is required to res.sendFile');
  }

  if (typeof path !== 'string') {
    throw new TypeError('path must be a string to res.sendFile')
  }

  // support function as second arg
  if (typeof options === 'function') {
    done = options;
    opts = {};
  }

  if (!opts.root && !isAbsolute(path)) {
    throw new TypeError('path must be absolute or specify root to res.sendFile');
  }

  // create file stream
  var pathname = encodeURI(path);
  var file = send(req, pathname, opts);

  // transfer
  sendfile(res, file, opts, function (err) {
    if (done) return done(err);
    if (err && err.code === 'EISDIR') return next();

    // next() all but write errors
    if (err && err.code !== 'ECONNABORTED' && err.syscall !== 'write') {
      next(err);
    }
  });
};

/**
 * Transfer the file at the given `path`.
 *
 * Automatically sets the _Content-Type_ response header field.
 * The callback `callback(err)` is invoked when the transfer is complete
 * or when an error occurs. Be sure to check `res.headersSent`
 * if you wish to attempt responding, as the header and some data
 * may have already been transferred.
 *
 * Options:
 *
 *   - `maxAge`   defaulting to 0 (can be string converted by `ms`)
 *   - `root`     root directory for relative filenames
 *   - `headers`  object of headers to serve with file
 *   - `dotfiles` serve dotfiles, defaulting to false; can be `"allow"` to send them
 *
 * Other options are passed along to `send`.
 *
 * Examples:
 *
 *  The following example illustrates how `res.sendfile()` may
 *  be used as an alternative for the `static()` middleware for
 *  dynamic situations. The code backing `res.sendfile()` is actually
 *  the same code, so HTTP cache support etc is identical.
 *
 *     app.get('/user/:uid/photos/:file', function(req, res){
 *       var uid = req.params.uid
 *         , file = req.params.file;
 *
 *       req.user.mayViewFilesFrom(uid, function(yes){
 *         if (yes) {
 *           res.sendfile('/uploads/' + uid + '/' + file);
 *         } else {
 *           res.send(403, 'Sorry! you cant see that.');
 *         }
 *       });
 *     });
 *
 * @public
 */

res.sendfile = function (path, options, callback) {
  var done = callback;
  var req = this.req;
  var res = this;
  var next = req.next;
  var opts = options || {};

  // support function as second arg
  if (typeof options === 'function') {
    done = options;
    opts = {};
  }

  // create file stream
  var file = send(req, path, opts);

  // transfer
  sendfile(res, file, opts, function (err) {
    if (done) return done(err);
    if (err && err.code === 'EISDIR') return next();

    // next() all but write errors
    if (err && err.code !== 'ECONNABORTED' && err.syscall !== 'write') {
      next(err);
    }
  });
};

res.sendfile = deprecate.function(res.sendfile,
  'res.sendfile: Use res.sendFile instead');

/**
 * Transfer the file at the given `path` as an attachment.
 *
 * Optionally providing an alternate attachment `filename`,
 * and optional callback `callback(err)`. The callback is invoked
 * when the data transfer is complete, or when an error has
 * occurred. Be sure to check `res.headersSent` if you plan to respond.
 *
 * Optionally providing an `options` object to use with `res.sendFile()`.
 * This function will set the `Content-Disposition` header, overriding
 * any `Content-Disposition` header passed as header options in order
 * to set the attachment and filename.
 *
 * This method uses `res.sendFile()`.
 *
 * @public
 */

res.download = function download (path, filename, options, callback) {
  var done = callback;
  var name = filename;
  var opts = options || null

  // support function as second or third arg
  if (typeof filename === 'function') {
    done = filename;
    name = null;
    opts = null
  } else if (typeof options === 'function') {
    done = options
    opts = null
  }

  // support optional filename, where options may be in it's place
  if (typeof filename === 'object' &&
    (typeof options === 'function' || options === undefined)) {
    name = null
    opts = filename
  }

  // set Content-Disposition when file is sent
  var headers = {
    'Content-Disposition': contentDisposition(name || path)
  };

  // merge user-provided headers
  if (opts && opts.headers) {
    var keys = Object.keys(opts.headers)
    for (var i = 0; i < keys.length; i++) {
      var key = keys[i]
      if (key.toLowerCase() !== 'content-disposition') {
        headers[key] = opts.headers[key]
      }
    }
  }

  // merge user-provided options
  opts = Object.create(opts)
  opts.headers = headers

  // Resolve the full path for sendFile
  var fullPath = !opts.root
    ? resolve(path)
    : path

  // send file
  return this.sendFile(fullPath, opts, done)
};

/**
 * Set _Content-Type_ response header with `type` through `mime.lookup()`
 * when it does not contain "/", or set the Content-Type to `type` otherwise.
 *
 * Examples:
 *
 *     res.type('.html');
 *     res.type('html');
 *     res.type('json');
 *     res.type('application/json');
 *     res.type('png');
 *
 * @param {String} type
 * @return {ServerResponse} for chaining
 * @public
 */

res.contentType =
res.type = function contentType(type) {
  var ct = type.indexOf('/') === -1
    ? mime.lookup(type)
    : type;

  return this.set('Content-Type', ct);
};

/**
 * Respond to the Acceptable formats using an `obj`
 * of mime-type callbacks.
 *
 * This method uses `req.accepted`, an array of
 * acceptable types ordered by their quality values.
 * When "Accept" is not present the _first_ callback
 * is invoked, otherwise the first match is used. When
 * no match is performed the server responds with
 * 406 "Not Acceptable".
 *
 * Content-Type is set for you, however if you choose
 * you may alter this within the callback using `res.type()`
 * or `res.set('Content-Type', ...)`.
 *
 *    res.format({
 *      'text/plain': function(){
 *        res.send('hey');
 *      },
 *
 *      'text/html': function(){
 *        res.send('<p>hey</p>');
 *      },
 *
 *      'application/json': function () {
 *        res.send({ message: 'hey' });
 *      }
 *    });
 *
 * In addition to canonicalized MIME types you may
 * also use extnames mapped to these types:
 *
 *    res.format({
 *      text: function(){
 *        res.send('hey');
 *      },
 *
 *      html: function(){
 *        res.send('<p>hey</p>');
 *      },
 *
 *      json: function(){
 *        res.send({ message: 'hey' });
 *      }
 *    });
 *
 * By default Express passes an `Error`
 * with a `.status` of 406 to `next(err)`
 * if a match is not made. If you provide
 * a `.default` callback it will be invoked
 * instead.
 *
 * @param {Object} obj
 * @return {ServerResponse} for chaining
 * @public
 */

res.format = function(obj){
  var req = this.req;
  var next = req.next;

  var keys = Object.keys(obj)
    .filter(function (v) { return v !== 'default' })

  var key = keys.length > 0
    ? req.accepts(keys)
    : false;

  this.vary("Accept");

  if (key) {
    this.set('Content-Type', normalizeType(key).value);
    obj[key](req, this, next);
  } else if (obj.default) {
    obj.default(req, this, next)
  } else {
    next(createError(406, {
      types: normalizeTypes(keys).map(function (o) { return o.value })
    }))
  }

  return this;
};

/**
 * Set _Content-Disposition_ header to _attachment_ with optional `filename`.
 *
 * @param {String} filename
 * @return {ServerResponse}
 * @public
 */

res.attachment = function attachment(filename) {
  if (filename) {
    this.type(extname(filename));
  }

  this.set('Content-Disposition', contentDisposition(filename));

  return this;
};

/**
 * Append additional header `field` with value `val`.
 *
 * Example:
 *
 *    res.append('Link', ['<http://localhost/>', '<http://localhost:3000/>']);
 *    res.append('Set-Cookie', 'foo=bar; Path=/; HttpOnly');
 *    res.append('Warning', '199 Miscellaneous warning');
 *
 * @param {String} field
 * @param {String|Array} val
 * @return {ServerResponse} for chaining
 * @public
 */

res.append = function append(field, val) {
  var prev = this.get(field);
  var value = val;

  if (prev) {
    // concat the new and prev vals
    value = Array.isArray(prev) ? prev.concat(val)
      : Array.isArray(val) ? [prev].concat(val)
        : [prev, val]
  }

  return this.set(field, value);
};

/**
 * Set header `field` to `val`, or pass
 * an object of header fields.
 *
 * Examples:
 *
 *    res.set('Foo', ['bar', 'baz']);
 *    res.set('Accept', 'application/json');
 *    res.set({ Accept: 'text/plain', 'X-API-Key': 'tobi' });
 *
 * Aliased as `res.header()`.
 *
 * @param {String|Object} field
 * @param {String|Array} val
 * @return {ServerResponse} for chaining
 * @public
 */

res.set =
res.header = function header(field, val) {
  if (arguments.length === 2) {
    var value = Array.isArray(val)
      ? val.map(String)
      : String(val);

    // add charset to content-type
    if (field.toLowerCase() === 'content-type') {
      if (Array.isArray(value)) {
        throw new TypeError('Content-Type cannot be set to an Array');
      }
      if (!charsetRegExp.test(value)) {
        var charset = mime.charsets.lookup(value.split(';')[0]);
        if (charset) value += '; charset=' + charset.toLowerCase();
      }
    }

    this.setHeader(field, value);
  } else {
    for (var key in field) {
      this.set(key, field[key]);
    }
  }
  return this;
};

/**
 * Get value for header `field`.
 *
 * @param {String} field
 * @return {String}
 * @public
 */

res.get = function(field){
  return this.getHeader(field);
};

/**
 * Clear cookie `name`.
 *
 * @param {String} name
 * @param {Object} [options]
 * @return {ServerResponse} for chaining
 * @public
 */

res.clearCookie = function clearCookie(name, options) {
  var opts = merge({ expires: new Date(1), path: '/' }, options);

  return this.cookie(name, '', opts);
};

/**
 * Set cookie `name` to `value`, with the given `options`.
 *
 * Options:
 *
 *    - `maxAge`   max-age in milliseconds, converted to `expires`
 *    - `signed`   sign the cookie
 *    - `path`     defaults to "/"
 *
 * Examples:
 *
 *    // "Remember Me" for 15 minutes
 *    res.cookie('rememberme', '1', { expires: new Date(Date.now() + 900000), httpOnly: true });
 *
 *    // same as above
 *    res.cookie('rememberme', '1', { maxAge: 900000, httpOnly: true })
 *
 * @param {String} name
 * @param {String|Object} value
 * @param {Object} [options]
 * @return {ServerResponse} for chaining
 * @public
 */

res.cookie = function (name, value, options) {
  var opts = merge({}, options);
  var secret = this.req.secret;
  var signed = opts.signed;

  if (signed && !secret) {
    throw new Error('cookieParser("secret") required for signed cookies');
  }

  var val = typeof value === 'object'
    ? 'j:' + JSON.stringify(value)
    : String(value);

  if (signed) {
    val = 's:' + sign(val, secret);
  }

  if (opts.maxAge != null) {
    var maxAge = opts.maxAge - 0

    if (!isNaN(maxAge)) {
      opts.expires = new Date(Date.now() + maxAge)
      opts.maxAge = Math.floor(maxAge / 1000)
    }
  }

  if (opts.path == null) {
    opts.path = '/';
  }

  this.append('Set-Cookie', cookie.serialize(name, String(val), opts));

  return this;
};

/**
 * Set the location header to `url`.
 *
 * The given `url` can also be "back", which redirects
 * to the _Referrer_ or _Referer_ headers or "/".
 *
 * Examples:
 *
 *    res.location('/foo/bar').;
 *    res.location('http://example.com');
 *    res.location('../login');
 *
 * @param {String} url
 * @return {ServerResponse} for chaining
 * @public
 */

res.location = function location(url) {
  var loc = url;

  // "back" is an alias for the referrer
  if (url === 'back') {
    loc = this.req.get('Referrer') || '/';
  }

  // set location
  return this.set('Location', encodeUrl(loc));
};

/**
 * Redirect to the given `url` with optional response `status`
 * defaulting to 302.
 *
 * The resulting `url` is determined by `res.location()`, so
 * it will play nicely with mounted apps, relative paths,
 * `"back"` etc.
 *
 * Examples:
 *
 *    res.redirect('/foo/bar');
 *    res.redirect('http://example.com');
 *    res.redirect(301, 'http://example.com');
 *    res.redirect('../login'); // /blog/post/1 -> /blog/login
 *
 * @public
 */

res.redirect = function redirect(url) {
  var address = url;
  var body;
  var status = 302;

  // allow status / url
  if (arguments.length === 2) {
    if (typeof arguments[0] === 'number') {
      status = arguments[0];
      address = arguments[1];
    } else {
      deprecate('res.redirect(url, status): Use res.redirect(status, url) instead');
      status = arguments[1];
    }
  }

  // Set location header
  address = this.location(address).get('Location');

  // Support text/{plain,html} by default
  this.format({
    text: function(){
      body = statuses.message[status] + '. Redirecting to ' + address
    },

    html: function(){
      var u = escapeHtml(address);
      body = '<p>' + statuses.message[status] + '. Redirecting to <a href="' + u + '">' + u + '</a></p>'
    },

    default: function(){
      body = '';
    }
  });

  // Respond
  this.statusCode = status;
  this.set('Content-Length', Buffer.byteLength(body));

  if (this.req.method === 'HEAD') {
    this.end();
  } else {
    this.end(body);
  }
};

/**
 * Add `field` to Vary. If already present in the Vary set, then
 * this call is simply ignored.
 *
 * @param {Array|String} field
 * @return {ServerResponse} for chaining
 * @public
 */

res.vary = function(field){
  // checks for back-compat
  if (!field || (Array.isArray(field) && !field.length)) {
    deprecate('res.vary(): Provide a field name');
    return this;
  }

  vary(this, field);

  return this;
};

/**
 * Render `view` with the given `options` and optional callback `fn`.
 * When a callback function is given a response will _not_ be made
 * automatically, otherwise a response of _200_ and _text/html_ is given.
 *
 * Options:
 *
 *  - `cache`     boolean hinting to the engine it should cache
 *  - `filename`  filename of the view being rendered
 *
 * @public
 */

res.render = function render(view, options, callback) {
  var app = this.req.app;
  var done = callback;
  var opts = options || {};
  var req = this.req;
  var self = this;

  // support callback function as second arg
  if (typeof options === 'function') {
    done = options;
    opts = {};
  }

  // merge res.locals
  opts._locals = self.locals;

  // default callback to respond
  done = done || function (err, str) {
    if (err) return req.next(err);
    self.send(str);
  };

  // render
  app.render(view, opts, done);
};

// pipe the send file stream
function sendfile(res, file, options, callback) {
  var done = false;
  var streaming;

  // request aborted
  function onaborted() {
    if (done) return;
    done = true;

    var err = new Error('Request aborted');
    err.code = 'ECONNABORTED';
    callback(err);
  }

  // directory
  function ondirectory() {
    if (done) return;
    done = true;

    var err = new Error('EISDIR, read');
    err.code = 'EISDIR';
    callback(err);
  }

  // errors
  function onerror(err) {
    if (done) return;
    done = true;
    callback(err);
  }

  // ended
  function onend() {
    if (done) return;
    done = true;
    callback();
  }

  // file
  function onfile() {
    streaming = false;
  }

  // finished
  function onfinish(err) {
    if (err && err.code === 'ECONNRESET') return onaborted();
    if (err) return onerror(err);
    if (done) return;

    setImmediate(function () {
      if (streaming !== false && !done) {
        onaborted();
        return;
      }

      if (done) return;
      done = true;
      callback();
    });
  }

  // streaming
  function onstream() {
    streaming = true;
  }

  file.on('directory', ondirectory);
  file.on('end', onend);
  file.on('error', onerror);
  file.on('file', onfile);
  file.on('stream', onstream);
  onFinished(res, onfinish);

  if (options.headers) {
    // set headers on successful transfer
    file.on('headers', function headers(res) {
      var obj = options.headers;
      var keys = Object.keys(obj);

      for (var i = 0; i < keys.length; i++) {
        var k = keys[i];
        res.setHeader(k, obj[k]);
      }
    });
  }

  // pipe
  file.pipe(res);
}

/**
 * Stringify JSON, like JSON.stringify, but v8 optimized, with the
 * ability to escape characters that can trigger HTML sniffing.
 *
 * @param {*} value
 * @param {function} replacer
 * @param {number} spaces
 * @param {boolean} escape
 * @returns {string}
 * @private
 */

function stringify (value, replacer, spaces, escape) {
  // v8 checks arguments.length for optimizing simple call
  // https://bugs.chromium.org/p/v8/issues/detail?id=4730
  var json = replacer || spaces
    ? JSON.stringify(value, replacer, spaces)
    : JSON.stringify(value);

  if (escape && typeof json === 'string') {
    json = json.replace(/[<>&]/g, function (c) {
      switch (c.charCodeAt(0)) {
        case 0x3c:
          return '\\u003c'
        case 0x3e:
          return '\\u003e'
        case 0x26:
          return '\\u0026'
        /* istanbul ignore next: unreachable default */
        default:
          return c
      }
    })
  }

  return json
}
/*!
 * express
 * Copyright(c) 2009-2013 TJ Holowaychuk
 * Copyright(c) 2014-2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict';

/**
 * Module dependencies.
 * @api private
 */

var Buffer = require('safe-buffer').Buffer
var contentDisposition = require('content-disposition');
var contentType = require('content-type');
var deprecate = require('depd')('express');
var flatten = require('array-flatten');
var mime = require('send').mime;
var etag = require('etag');
var proxyaddr = require('proxy-addr');
var qs = require('qs');
var querystring = require('querystring');

/**
 * Return strong ETag for `body`.
 *
 * @param {String|Buffer} body
 * @param {String} [encoding]
 * @return {String}
 * @api private
 */

exports.etag = createETagGenerator({ weak: false })

/**
 * Return weak ETag for `body`.
 *
 * @param {String|Buffer} body
 * @param {String} [encoding]
 * @return {String}
 * @api private
 */

exports.wetag = createETagGenerator({ weak: true })

/**
 * Check if `path` looks absolute.
 *
 * @param {String} path
 * @return {Boolean}
 * @api private
 */

exports.isAbsolute = function(path){
  if ('/' === path[0]) return true;
  if (':' === path[1] && ('\\' === path[2] || '/' === path[2])) return true; // Windows device path
  if ('\\\\' === path.substring(0, 2)) return true; // Microsoft Azure absolute path
};

/**
 * Flatten the given `arr`.
 *
 * @param {Array} arr
 * @return {Array}
 * @api private
 */

exports.flatten = deprecate.function(flatten,
  'utils.flatten: use array-flatten npm module instead');

/**
 * Normalize the given `type`, for example "html" becomes "text/html".
 *
 * @param {String} type
 * @return {Object}
 * @api private
 */

exports.normalizeType = function(type){
  return ~type.indexOf('/')
    ? acceptParams(type)
    : { value: mime.lookup(type), params: {} };
};

/**
 * Normalize `types`, for example "html" becomes "text/html".
 *
 * @param {Array} types
 * @return {Array}
 * @api private
 */

exports.normalizeTypes = function(types){
  var ret = [];

  for (var i = 0; i < types.length; ++i) {
    ret.push(exports.normalizeType(types[i]));
  }

  return ret;
};

/**
 * Generate Content-Disposition header appropriate for the filename.
 * non-ascii filenames are urlencoded and a filename* parameter is added
 *
 * @param {String} filename
 * @return {String}
 * @api private
 */

exports.contentDisposition = deprecate.function(contentDisposition,
  'utils.contentDisposition: use content-disposition npm module instead');

/**
 * Parse accept params `str` returning an
 * object with `.value`, `.quality` and `.params`.
 * also includes `.originalIndex` for stable sorting
 *
 * @param {String} str
 * @param {Number} index
 * @return {Object}
 * @api private
 */

function acceptParams(str, index) {
  var parts = str.split(/ *; */);
  var ret = { value: parts[0], quality: 1, params: {}, originalIndex: index };

  for (var i = 1; i < parts.length; ++i) {
    var pms = parts[i].split(/ *= */);
    if ('q' === pms[0]) {
      ret.quality = parseFloat(pms[1]);
    } else {
      ret.params[pms[0]] = pms[1];
    }
  }

  return ret;
}

/**
 * Compile "etag" value to function.
 *
 * @param  {Boolean|String|Function} val
 * @return {Function}
 * @api private
 */

exports.compileETag = function(val) {
  var fn;

  if (typeof val === 'function') {
    return val;
  }

  switch (val) {
    case true:
    case 'weak':
      fn = exports.wetag;
      break;
    case false:
      break;
    case 'strong':
      fn = exports.etag;
      break;
    default:
      throw new TypeError('unknown value for etag function: ' + val);
  }

  return fn;
}

/**
 * Compile "query parser" value to function.
 *
 * @param  {String|Function} val
 * @return {Function}
 * @api private
 */

exports.compileQueryParser = function compileQueryParser(val) {
  var fn;

  if (typeof val === 'function') {
    return val;
  }

  switch (val) {
    case true:
    case 'simple':
      fn = querystring.parse;
      break;
    case false:
      fn = newObject;
      break;
    case 'extended':
      fn = parseExtendedQueryString;
      break;
    default:
      throw new TypeError('unknown value for query parser function: ' + val);
  }

  return fn;
}

/**
 * Compile "proxy trust" value to function.
 *
 * @param  {Boolean|String|Number|Array|Function} val
 * @return {Function}
 * @api private
 */

exports.compileTrust = function(val) {
  if (typeof val === 'function') return val;

  if (val === true) {
    // Support plain true/false
    return function(){ return true };
  }

  if (typeof val === 'number') {
    // Support trusting hop count
    return function(a, i){ return i < val };
  }

  if (typeof val === 'string') {
    // Support comma-separated values
    val = val.split(',')
      .map(function (v) { return v.trim() })
  }

  return proxyaddr.compile(val || []);
}

/**
 * Set the charset in a given Content-Type string.
 *
 * @param {String} type
 * @param {String} charset
 * @return {String}
 * @api private
 */

exports.setCharset = function setCharset(type, charset) {
  if (!type || !charset) {
    return type;
  }

  // parse type
  var parsed = contentType.parse(type);

  // set charset
  parsed.parameters.charset = charset;

  // format type
  return contentType.format(parsed);
};

/**
 * Create an ETag generator function, generating ETags with
 * the given options.
 *
 * @param {object} options
 * @return {function}
 * @private
 */

function createETagGenerator (options) {
  return function generateETag (body, encoding) {
    var buf = !Buffer.isBuffer(body)
      ? Buffer.from(body, encoding)
      : body

    return etag(buf, options)
  }
}

/**
 * Parse an extended query string with qs.
 *
 * @return {Object}
 * @private
 */

function parseExtendedQueryString(str) {
  return qs.parse(str, {
    allowPrototypes: true
  });
}

/**
 * Return new empty object.
 *
 * @return {Object}
 * @api private
 */

function newObject() {
  return {};
}
/*!
 * express
 * Copyright(c) 2009-2013 TJ Holowaychuk
 * Copyright(c) 2013 Roman Shtylman
 * Copyright(c) 2014-2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict';

/**
 * Module dependencies.
 * @private
 */

var debug = require('debug')('express:view');
var path = require('path');
var fs = require('fs');

/**
 * Module variables.
 * @private
 */

var dirname = path.dirname;
var basename = path.basename;
var extname = path.extname;
var join = path.join;
var resolve = path.resolve;

/**
 * Module exports.
 * @public
 */

module.exports = View;

/**
 * Initialize a new `View` with the given `name`.
 *
 * Options:
 *
 *   - `defaultEngine` the default template engine name
 *   - `engines` template engine require() cache
 *   - `root` root path for view lookup
 *
 * @param {string} name
 * @param {object} options
 * @public
 */

function View(name, options) {
  var opts = options || {};

  this.defaultEngine = opts.defaultEngine;
  this.ext = extname(name);
  this.name = name;
  this.root = opts.root;

  if (!this.ext && !this.defaultEngine) {
    throw new Error('No default engine was specified and no extension was provided.');
  }

  var fileName = name;

  if (!this.ext) {
    // get extension from default engine name
    this.ext = this.defaultEngine[0] !== '.'
      ? '.' + this.defaultEngine
      : this.defaultEngine;

    fileName += this.ext;
  }

  if (!opts.engines[this.ext]) {
    // load engine
    var mod = this.ext.slice(1)
    debug('require "%s"', mod)

    // default engine export
    var fn = require(mod).__express

    if (typeof fn !== 'function') {
      throw new Error('Module "' + mod + '" does not provide a view engine.')
    }

    opts.engines[this.ext] = fn
  }

  // store loaded engine
  this.engine = opts.engines[this.ext];

  // lookup path
  this.path = this.lookup(fileName);
}

/**
 * Lookup view by the given `name`
 *
 * @param {string} name
 * @private
 */

View.prototype.lookup = function lookup(name) {
  var path;
  var roots = [].concat(this.root);

  debug('lookup "%s"', name);

  for (var i = 0; i < roots.length && !path; i++) {
    var root = roots[i];

    // resolve the path
    var loc = resolve(root, name);
    var dir = dirname(loc);
    var file = basename(loc);

    // resolve the file
    path = this.resolve(dir, file);
  }

  return path;
};

/**
 * Render with the given options.
 *
 * @param {object} options
 * @param {function} callback
 * @private
 */

View.prototype.render = function render(options, callback) {
  debug('render "%s"', this.path);
  this.engine(this.path, options, callback);
};

/**
 * Resolve the file within the given directory.
 *
 * @param {string} dir
 * @param {string} file
 * @private
 */

View.prototype.resolve = function resolve(dir, file) {
  var ext = this.ext;

  // <path>.<ext>
  var path = join(dir, file);
  var stat = tryStat(path);

  if (stat && stat.isFile()) {
    return path;
  }

  // <path>/index.<ext>
  path = join(dir, basename(file, ext), 'index' + ext);
  stat = tryStat(path);

  if (stat && stat.isFile()) {
    return path;
  }
};

/**
 * Return a stat, maybe.
 *
 * @param {string} path
 * @return {fs.Stats}
 * @private
 */

function tryStat(path) {
  debug('stat "%s"', path);

  try {
    return fs.statSync(path);
  } catch (e) {
    return undefined;
  }
}
/*!
 * express
 * Copyright(c) 2009-2013 TJ Holowaychuk
 * Copyright(c) 2013 Roman Shtylman
 * Copyright(c) 2014-2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict';

/**
 * Module dependencies.
 * @private
 */

var Route = require('./route');
var Layer = require('./layer');
var methods = require('methods');
var mixin = require('utils-merge');
var debug = require('debug')('express:router');
var deprecate = require('depd')('express');
var flatten = require('array-flatten');
var parseUrl = require('parseurl');
var setPrototypeOf = require('setprototypeof')

/**
 * Module variables.
 * @private
 */

var objectRegExp = /^\[object (\S+)\]$/;
var slice = Array.prototype.slice;
var toString = Object.prototype.toString;

/**
 * Initialize a new `Router` with the given `options`.
 *
 * @param {Object} [options]
 * @return {Router} which is an callable function
 * @public
 */

var proto = module.exports = function(options) {
  var opts = options || {};

  function router(req, res, next) {
    router.handle(req, res, next);
  }

  // mixin Router class functions
  setPrototypeOf(router, proto)

  router.params = {};
  router._params = [];
  router.caseSensitive = opts.caseSensitive;
  router.mergeParams = opts.mergeParams;
  router.strict = opts.strict;
  router.stack = [];

  return router;
};

/**
 * Map the given param placeholder `name`(s) to the given callback.
 *
 * Parameter mapping is used to provide pre-conditions to routes
 * which use normalized placeholders. For example a _:user_id_ parameter
 * could automatically load a user's information from the database without
 * any additional code,
 *
 * The callback uses the same signature as middleware, the only difference
 * being that the value of the placeholder is passed, in this case the _id_
 * of the user. Once the `next()` function is invoked, just like middleware
 * it will continue on to execute the route, or subsequent parameter functions.
 *
 * Just like in middleware, you must either respond to the request or call next
 * to avoid stalling the request.
 *
 *  app.param('user_id', function(req, res, next, id){
 *    User.find(id, function(err, user){
 *      if (err) {
 *        return next(err);
 *      } else if (!user) {
 *        return next(new Error('failed to load user'));
 *      }
 *      req.user = user;
 *      next();
 *    });
 *  });
 *
 * @param {String} name
 * @param {Function} fn
 * @return {app} for chaining
 * @public
 */

proto.param = function param(name, fn) {
  // param logic
  if (typeof name === 'function') {
    deprecate('router.param(fn): Refactor to use path params');
    this._params.push(name);
    return;
  }

  // apply param functions
  var params = this._params;
  var len = params.length;
  var ret;

  if (name[0] === ':') {
    deprecate('router.param(' + JSON.stringify(name) + ', fn): Use router.param(' + JSON.stringify(name.slice(1)) + ', fn) instead')
    name = name.slice(1)
  }

  for (var i = 0; i < len; ++i) {
    if (ret = params[i](name, fn)) {
      fn = ret;
    }
  }

  // ensure we end up with a
  // middleware function
  if ('function' !== typeof fn) {
    throw new Error('invalid param() call for ' + name + ', got ' + fn);
  }

  (this.params[name] = this.params[name] || []).push(fn);
  return this;
};

/**
 * Dispatch a req, res into the router.
 * @private
 */

proto.handle = function handle(req, res, out) {
  var self = this;

  debug('dispatching %s %s', req.method, req.url);

  var idx = 0;
  var protohost = getProtohost(req.url) || ''
  var removed = '';
  var slashAdded = false;
  var sync = 0
  var paramcalled = {};

  // store options for OPTIONS request
  // only used if OPTIONS request
  var options = [];

  // middleware and routes
  var stack = self.stack;

  // manage inter-router variables
  var parentParams = req.params;
  var parentUrl = req.baseUrl || '';
  var done = restore(out, req, 'baseUrl', 'next', 'params');

  // setup next layer
  req.next = next;

  // for options requests, respond with a default if nothing else responds
  if (req.method === 'OPTIONS') {
    done = wrap(done, function(old, err) {
      if (err || options.length === 0) return old(err);
      sendOptionsResponse(res, options, old);
    });
  }

  // setup basic req values
  req.baseUrl = parentUrl;
  req.originalUrl = req.originalUrl || req.url;

  next();

  function next(err) {
    var layerError = err === 'route'
      ? null
      : err;

    // remove added slash
    if (slashAdded) {
      req.url = req.url.slice(1)
      slashAdded = false;
    }

    // restore altered req.url
    if (removed.length !== 0) {
      req.baseUrl = parentUrl;
      req.url = protohost + removed + req.url.slice(protohost.length)
      removed = '';
    }

    // signal to exit router
    if (layerError === 'router') {
      setImmediate(done, null)
      return
    }

    // no more matching layers
    if (idx >= stack.length) {
      setImmediate(done, layerError);
      return;
    }

    // max sync stack
    if (++sync > 100) {
      return setImmediate(next, err)
    }

    // get pathname of request
    var path = getPathname(req);

    if (path == null) {
      return done(layerError);
    }

    // find next matching layer
    var layer;
    var match;
    var route;

    while (match !== true && idx < stack.length) {
      layer = stack[idx++];
      match = matchLayer(layer, path);
      route = layer.route;

      if (typeof match !== 'boolean') {
        // hold on to layerError
        layerError = layerError || match;
      }

      if (match !== true) {
        continue;
      }

      if (!route) {
        // process non-route handlers normally
        continue;
      }

      if (layerError) {
        // routes do not match with a pending error
        match = false;
        continue;
      }

      var method = req.method;
      var has_method = route._handles_method(method);

      // build up automatic options response
      if (!has_method && method === 'OPTIONS') {
        appendMethods(options, route._options());
      }

      // don't even bother matching route
      if (!has_method && method !== 'HEAD') {
        match = false;
      }
    }

    // no match
    if (match !== true) {
      return done(layerError);
    }

    // store route for dispatch on change
    if (route) {
      req.route = route;
    }

    // Capture one-time layer values
    req.params = self.mergeParams
      ? mergeParams(layer.params, parentParams)
      : layer.params;
    var layerPath = layer.path;

    // this should be done for the layer
    self.process_params(layer, paramcalled, req, res, function (err) {
      if (err) {
        next(layerError || err)
      } else if (route) {
        layer.handle_request(req, res, next)
      } else {
        trim_prefix(layer, layerError, layerPath, path)
      }

      sync = 0
    });
  }

  function trim_prefix(layer, layerError, layerPath, path) {
    if (layerPath.length !== 0) {
      // Validate path is a prefix match
      if (layerPath !== path.slice(0, layerPath.length)) {
        next(layerError)
        return
      }

      // Validate path breaks on a path separator
      var c = path[layerPath.length]
      if (c && c !== '/' && c !== '.') return next(layerError)

      // Trim off the part of the url that matches the route
      // middleware (.use stuff) needs to have the path stripped
      debug('trim prefix (%s) from url %s', layerPath, req.url);
      removed = layerPath;
      req.url = protohost + req.url.slice(protohost.length + removed.length)

      // Ensure leading slash
      if (!protohost && req.url[0] !== '/') {
        req.url = '/' + req.url;
        slashAdded = true;
      }

      // Setup base URL (no trailing slash)
      req.baseUrl = parentUrl + (removed[removed.length - 1] === '/'
        ? removed.substring(0, removed.length - 1)
        : removed);
    }

    debug('%s %s : %s', layer.name, layerPath, req.originalUrl);

    if (layerError) {
      layer.handle_error(layerError, req, res, next);
    } else {
      layer.handle_request(req, res, next);
    }
  }
};

/**
 * Process any parameters for the layer.
 * @private
 */

proto.process_params = function process_params(layer, called, req, res, done) {
  var params = this.params;

  // captured parameters from the layer, keys and values
  var keys = layer.keys;

  // fast track
  if (!keys || keys.length === 0) {
    return done();
  }

  var i = 0;
  var name;
  var paramIndex = 0;
  var key;
  var paramVal;
  var paramCallbacks;
  var paramCalled;

  // process params in order
  // param callbacks can be async
  function param(err) {
    if (err) {
      return done(err);
    }

    if (i >= keys.length ) {
      return done();
    }

    paramIndex = 0;
    key = keys[i++];
    name = key.name;
    paramVal = req.params[name];
    paramCallbacks = params[name];
    paramCalled = called[name];

    if (paramVal === undefined || !paramCallbacks) {
      return param();
    }

    // param previously called with same value or error occurred
    if (paramCalled && (paramCalled.match === paramVal
      || (paramCalled.error && paramCalled.error !== 'route'))) {
      // restore value
      req.params[name] = paramCalled.value;

      // next param
      return param(paramCalled.error);
    }

    called[name] = paramCalled = {
      error: null,
      match: paramVal,
      value: paramVal
    };

    paramCallback();
  }

  // single param callbacks
  function paramCallback(err) {
    var fn = paramCallbacks[paramIndex++];

    // store updated value
    paramCalled.value = req.params[key.name];

    if (err) {
      // store error
      paramCalled.error = err;
      param(err);
      return;
    }

    if (!fn) return param();

    try {
      fn(req, res, paramCallback, paramVal, key.name);
    } catch (e) {
      paramCallback(e);
    }
  }

  param();
};

/**
 * Use the given middleware function, with optional path, defaulting to "/".
 *
 * Use (like `.all`) will run for any http METHOD, but it will not add
 * handlers for those methods so OPTIONS requests will not consider `.use`
 * functions even if they could respond.
 *
 * The other difference is that _route_ path is stripped and not visible
 * to the handler function. The main effect of this feature is that mounted
 * handlers can operate without any code changes regardless of the "prefix"
 * pathname.
 *
 * @public
 */

proto.use = function use(fn) {
  var offset = 0;
  var path = '/';

  // default path to '/'
  // disambiguate router.use([fn])
  if (typeof fn !== 'function') {
    var arg = fn;

    while (Array.isArray(arg) && arg.length !== 0) {
      arg = arg[0];
    }

    // first arg is the path
    if (typeof arg !== 'function') {
      offset = 1;
      path = fn;
    }
  }

  var callbacks = flatten(slice.call(arguments, offset));

  if (callbacks.length === 0) {
    throw new TypeError('Router.use() requires a middleware function')
  }

  for (var i = 0; i < callbacks.length; i++) {
    var fn = callbacks[i];

    if (typeof fn !== 'function') {
      throw new TypeError('Router.use() requires a middleware function but got a ' + gettype(fn))
    }

    // add the middleware
    debug('use %o %s', path, fn.name || '<anonymous>')

    var layer = new Layer(path, {
      sensitive: this.caseSensitive,
      strict: false,
      end: false
    }, fn);

    layer.route = undefined;

    this.stack.push(layer);
  }

  return this;
};

/**
 * Create a new Route for the given path.
 *
 * Each route contains a separate middleware stack and VERB handlers.
 *
 * See the Route api documentation for details on adding handlers
 * and middleware to routes.
 *
 * @param {String} path
 * @return {Route}
 * @public
 */

proto.route = function route(path) {
  var route = new Route(path);

  var layer = new Layer(path, {
    sensitive: this.caseSensitive,
    strict: this.strict,
    end: true
  }, route.dispatch.bind(route));

  layer.route = route;

  this.stack.push(layer);
  return route;
};

// create Router#VERB functions
methods.concat('all').forEach(function(method){
  proto[method] = function(path){
    var route = this.route(path)
    route[method].apply(route, slice.call(arguments, 1));
    return this;
  };
});

// append methods to a list of methods
function appendMethods(list, addition) {
  for (var i = 0; i < addition.length; i++) {
    var method = addition[i];
    if (list.indexOf(method) === -1) {
      list.push(method);
    }
  }
}

// get pathname of request
function getPathname(req) {
  try {
    return parseUrl(req).pathname;
  } catch (err) {
    return undefined;
  }
}

// Get get protocol + host for a URL
function getProtohost(url) {
  if (typeof url !== 'string' || url.length === 0 || url[0] === '/') {
    return undefined
  }

  var searchIndex = url.indexOf('?')
  var pathLength = searchIndex !== -1
    ? searchIndex
    : url.length
  var fqdnIndex = url.slice(0, pathLength).indexOf('://')

  return fqdnIndex !== -1
    ? url.substring(0, url.indexOf('/', 3 + fqdnIndex))
    : undefined
}

// get type for error message
function gettype(obj) {
  var type = typeof obj;

  if (type !== 'object') {
    return type;
  }

  // inspect [[Class]] for objects
  return toString.call(obj)
    .replace(objectRegExp, '$1');
}

/**
 * Match path to a layer.
 *
 * @param {Layer} layer
 * @param {string} path
 * @private
 */

function matchLayer(layer, path) {
  try {
    return layer.match(path);
  } catch (err) {
    return err;
  }
}

// merge params with parent params
function mergeParams(params, parent) {
  if (typeof parent !== 'object' || !parent) {
    return params;
  }

  // make copy of parent for base
  var obj = mixin({}, parent);

  // simple non-numeric merging
  if (!(0 in params) || !(0 in parent)) {
    return mixin(obj, params);
  }

  var i = 0;
  var o = 0;

  // determine numeric gaps
  while (i in params) {
    i++;
  }

  while (o in parent) {
    o++;
  }

  // offset numeric indices in params before merge
  for (i--; i >= 0; i--) {
    params[i + o] = params[i];

    // create holes for the merge when necessary
    if (i < o) {
      delete params[i];
    }
  }

  return mixin(obj, params);
}

// restore obj props after function
function restore(fn, obj) {
  var props = new Array(arguments.length - 2);
  var vals = new Array(arguments.length - 2);

  for (var i = 0; i < props.length; i++) {
    props[i] = arguments[i + 2];
    vals[i] = obj[props[i]];
  }

  return function () {
    // restore vals
    for (var i = 0; i < props.length; i++) {
      obj[props[i]] = vals[i];
    }

    return fn.apply(this, arguments);
  };
}

// send an OPTIONS response
function sendOptionsResponse(res, options, next) {
  try {
    var body = options.join(',');
    res.set('Allow', body);
    res.send(body);
  } catch (err) {
    next(err);
  }
}

// wrap a function
function wrap(old, fn) {
  return function proxy() {
    var args = new Array(arguments.length + 1);

    args[0] = old;
    for (var i = 0, len = arguments.length; i < len; i++) {
      args[i + 1] = arguments[i];
    }

    fn.apply(this, args);
  };
}
/*!
 * express
 * Copyright(c) 2009-2013 TJ Holowaychuk
 * Copyright(c) 2013 Roman Shtylman
 * Copyright(c) 2014-2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict';

/**
 * Module dependencies.
 * @private
 */

var pathRegexp = require('path-to-regexp');
var debug = require('debug')('express:router:layer');

/**
 * Module variables.
 * @private
 */

var hasOwnProperty = Object.prototype.hasOwnProperty;

/**
 * Module exports.
 * @public
 */

module.exports = Layer;

function Layer(path, options, fn) {
  if (!(this instanceof Layer)) {
    return new Layer(path, options, fn);
  }

  debug('new %o', path)
  var opts = options || {};

  this.handle = fn;
  this.name = fn.name || '<anonymous>';
  this.params = undefined;
  this.path = undefined;
  this.regexp = pathRegexp(path, this.keys = [], opts);

  // set fast path flags
  this.regexp.fast_star = path === '*'
  this.regexp.fast_slash = path === '/' && opts.end === false
}

/**
 * Handle the error for the layer.
 *
 * @param {Error} error
 * @param {Request} req
 * @param {Response} res
 * @param {function} next
 * @api private
 */

Layer.prototype.handle_error = function handle_error(error, req, res, next) {
  var fn = this.handle;

  if (fn.length !== 4) {
    // not a standard error handler
    return next(error);
  }

  try {
    fn(error, req, res, next);
  } catch (err) {
    next(err);
  }
};

/**
 * Handle the request for the layer.
 *
 * @param {Request} req
 * @param {Response} res
 * @param {function} next
 * @api private
 */

Layer.prototype.handle_request = function handle(req, res, next) {
  var fn = this.handle;

  if (fn.length > 3) {
    // not a standard request handler
    return next();
  }

  try {
    fn(req, res, next);
  } catch (err) {
    next(err);
  }
};

/**
 * Check if this route matches `path`, if so
 * populate `.params`.
 *
 * @param {String} path
 * @return {Boolean}
 * @api private
 */

Layer.prototype.match = function match(path) {
  var match

  if (path != null) {
    // fast path non-ending match for / (any path matches)
    if (this.regexp.fast_slash) {
      this.params = {}
      this.path = ''
      return true
    }

    // fast path for * (everything matched in a param)
    if (this.regexp.fast_star) {
      this.params = {'0': decode_param(path)}
      this.path = path
      return true
    }

    // match the path
    match = this.regexp.exec(path)
  }

  if (!match) {
    this.params = undefined;
    this.path = undefined;
    return false;
  }

  // store values
  this.params = {};
  this.path = match[0]

  var keys = this.keys;
  var params = this.params;

  for (var i = 1; i < match.length; i++) {
    var key = keys[i - 1];
    var prop = key.name;
    var val = decode_param(match[i])

    if (val !== undefined || !(hasOwnProperty.call(params, prop))) {
      params[prop] = val;
    }
  }

  return true;
};

/**
 * Decode param value.
 *
 * @param {string} val
 * @return {string}
 * @private
 */

function decode_param(val) {
  if (typeof val !== 'string' || val.length === 0) {
    return val;
  }

  try {
    return decodeURIComponent(val);
  } catch (err) {
    if (err instanceof URIError) {
      err.message = 'Failed to decode param \'' + val + '\'';
      err.status = err.statusCode = 400;
    }

    throw err;
  }
}
/*!
 * express
 * Copyright(c) 2009-2013 TJ Holowaychuk
 * Copyright(c) 2013 Roman Shtylman
 * Copyright(c) 2014-2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict';

/**
 * Module dependencies.
 * @private
 */

var debug = require('debug')('express:router:route');
var flatten = require('array-flatten');
var Layer = require('./layer');
var methods = require('methods');

/**
 * Module variables.
 * @private
 */

var slice = Array.prototype.slice;
var toString = Object.prototype.toString;

/**
 * Module exports.
 * @public
 */

module.exports = Route;

/**
 * Initialize `Route` with the given `path`,
 *
 * @param {String} path
 * @public
 */

function Route(path) {
  this.path = path;
  this.stack = [];

  debug('new %o', path)

  // route handlers for various http methods
  this.methods = {};
}

/**
 * Determine if the route handles a given method.
 * @private
 */

Route.prototype._handles_method = function _handles_method(method) {
  if (this.methods._all) {
    return true;
  }

  var name = method.toLowerCase();

  if (name === 'head' && !this.methods['head']) {
    name = 'get';
  }

  return Boolean(this.methods[name]);
};

/**
 * @return {Array} supported HTTP methods
 * @private
 */

Route.prototype._options = function _options() {
  var methods = Object.keys(this.methods);

  // append automatic head
  if (this.methods.get && !this.methods.head) {
    methods.push('head');
  }

  for (var i = 0; i < methods.length; i++) {
    // make upper case
    methods[i] = methods[i].toUpperCase();
  }

  return methods;
};

/**
 * dispatch req, res into this route
 * @private
 */

Route.prototype.dispatch = function dispatch(req, res, done) {
  var idx = 0;
  var stack = this.stack;
  var sync = 0

  if (stack.length === 0) {
    return done();
  }

  var method = req.method.toLowerCase();
  if (method === 'head' && !this.methods['head']) {
    method = 'get';
  }

  req.route = this;

  next();

  function next(err) {
    // signal to exit route
    if (err && err === 'route') {
      return done();
    }

    // signal to exit router
    if (err && err === 'router') {
      return done(err)
    }

    var layer = stack[idx++];
    if (!layer) {
      return done(err);
    }

    // max sync stack
    if (++sync > 100) {
      return setImmediate(next, err)
    }

    if (layer.method && layer.method !== method) {
      return next(err);
    }

    if (err) {
      layer.handle_error(err, req, res, next);
    } else {
      layer.handle_request(req, res, next);
    }

    sync = 0
  }
};

/**
 * Add a handler for all HTTP verbs to this route.
 *
 * Behaves just like middleware and can respond or call `next`
 * to continue processing.
 *
 * You can use multiple `.all` call to add multiple handlers.
 *
 *   function check_something(req, res, next){
 *     next();
 *   };
 *
 *   function validate_user(req, res, next){
 *     next();
 *   };
 *
 *   route
 *   .all(validate_user)
 *   .all(check_something)
 *   .get(function(req, res, next){
 *     res.send('hello world');
 *   });
 *
 * @param {function} handler
 * @return {Route} for chaining
 * @api public
 */

Route.prototype.all = function all() {
  var handles = flatten(slice.call(arguments));

  for (var i = 0; i < handles.length; i++) {
    var handle = handles[i];

    if (typeof handle !== 'function') {
      var type = toString.call(handle);
      var msg = 'Route.all() requires a callback function but got a ' + type
      throw new TypeError(msg);
    }

    var layer = Layer('/', {}, handle);
    layer.method = undefined;

    this.methods._all = true;
    this.stack.push(layer);
  }

  return this;
};

methods.forEach(function(method){
  Route.prototype[method] = function(){
    var handles = flatten(slice.call(arguments));

    for (var i = 0; i < handles.length; i++) {
      var handle = handles[i];

      if (typeof handle !== 'function') {
        var type = toString.call(handle);
        var msg = 'Route.' + method + '() requires a callback function but got a ' + type
        throw new Error(msg);
      }

      debug('%s %o', method, this.path)

      var layer = Layer('/', {}, handle);
      layer.method = method;

      this.methods[method] = true;
      this.stack.push(layer);
    }

    return this;
  };
});
/*!
 * express
 * Copyright(c) 2009-2013 TJ Holowaychuk
 * Copyright(c) 2013 Roman Shtylman
 * Copyright(c) 2014-2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict';

/**
 * Module dependencies.
 * @private
 */

var setPrototypeOf = require('setprototypeof')

/**
 * Initialization middleware, exposing the
 * request and response to each other, as well
 * as defaulting the X-Powered-By header field.
 *
 * @param {Function} app
 * @return {Function}
 * @api private
 */

exports.init = function(app){
  return function expressInit(req, res, next){
    if (app.enabled('x-powered-by')) res.setHeader('X-Powered-By', 'Express');
    req.res = res;
    res.req = req;
    req.next = next;

    setPrototypeOf(req, app.request)
    setPrototypeOf(res, app.response)

    res.locals = res.locals || Object.create(null);

    next();
  };
};

/*!
 * express
 * Copyright(c) 2009-2013 TJ Holowaychuk
 * Copyright(c) 2013 Roman Shtylman
 * Copyright(c) 2014-2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict';

/**
 * Module dependencies.
 */

var merge = require('utils-merge')
var parseUrl = require('parseurl');
var qs = require('qs');

/**
 * @param {Object} options
 * @return {Function}
 * @api public
 */

module.exports = function query(options) {
  var opts = merge({}, options)
  var queryparse = qs.parse;

  if (typeof options === 'function') {
    queryparse = options;
    opts = undefined;
  }

  if (opts !== undefined && opts.allowPrototypes === undefined) {
    // back-compat for qs module
    opts.allowPrototypes = true;
  }

  return function query(req, res, next){
    if (!req.query) {
      var val = parseUrl(req).query;
      req.query = queryparse(val, opts);
    }

    next();
  };
};
1.2.0 / 2022-03-22
==================

  * Remove set content headers that break response
  * deps: on-finished@2.4.1
  * deps: statuses@2.0.1
    - Rename `425 Unordered Collection` to standard `425 Too Early`

1.1.2 / 2019-05-09
==================

  * Set stricter `Content-Security-Policy` header
  * deps: parseurl@~1.3.3
  * deps: statuses@~1.5.0

1.1.1 / 2018-03-06
==================

  * Fix 404 output for bad / missing pathnames
  * deps: encodeurl@~1.0.2
    - Fix encoding `%` as last character
  * deps: statuses@~1.4.0

1.1.0 / 2017-09-24
==================

  * Use `res.headersSent` when available

1.0.6 / 2017-09-22
==================

  * deps: debug@2.6.9

1.0.5 / 2017-09-15
==================

  * deps: parseurl@~1.3.2
    - perf: reduce overhead for full URLs
    - perf: unroll the "fast-path" `RegExp`

1.0.4 / 2017-08-03
==================

  * deps: debug@2.6.8

1.0.3 / 2017-05-16
==================

  * deps: debug@2.6.7
    - deps: ms@2.0.0

1.0.2 / 2017-04-22
==================

  * deps: debug@2.6.4
    - deps: ms@0.7.3

1.0.1 / 2017-03-21
==================

  * Fix missing `</html>` in HTML document
  * deps: debug@2.6.3
    - Fix: `DEBUG_MAX_ARRAY_LENGTH`

1.0.0 / 2017-02-15
==================

  * Fix exception when `err` cannot be converted to a string
  * Fully URL-encode the pathname in the 404 message
  * Only include the pathname in the 404 message
  * Send complete HTML document
  * Set `Content-Security-Policy: default-src 'self'` header
  * deps: debug@2.6.1
    - Allow colors in workers
    - Deprecated `DEBUG_FD` environment variable set to `3` or higher
    - Fix error when running under React Native
    - Use same color for same namespace
    - deps: ms@0.7.2

0.5.1 / 2016-11-12
==================

  * Fix exception when `err.headers` is not an object
  * deps: statuses@~1.3.1
  * perf: hoist regular expressions
  * perf: remove duplicate validation path

0.5.0 / 2016-06-15
==================

  * Change invalid or non-numeric status code to 500
  * Overwrite status message to match set status code
  * Prefer `err.statusCode` if `err.status` is invalid
  * Set response headers from `err.headers` object
  * Use `statuses` instead of `http` module for status messages
    - Includes all defined status messages

0.4.1 / 2015-12-02
==================

  * deps: escape-html@~1.0.3
    - perf: enable strict mode
    - perf: optimize string replacement
    - perf: use faster string coercion

0.4.0 / 2015-06-14
==================

  * Fix a false-positive when unpiping in Node.js 0.8
  * Support `statusCode` property on `Error` objects
  * Use `unpipe` module for unpiping requests
  * deps: escape-html@1.0.2
  * deps: on-finished@~2.3.0
    - Add defined behavior for HTTP `CONNECT` requests
    - Add defined behavior for HTTP `Upgrade` requests
    - deps: ee-first@1.1.1
  * perf: enable strict mode
  * perf: remove argument reassignment

0.3.6 / 2015-05-11
==================

  * deps: debug@~2.2.0
    - deps: ms@0.7.1

0.3.5 / 2015-04-22
==================

  * deps: on-finished@~2.2.1
    - Fix `isFinished(req)` when data buffered

0.3.4 / 2015-03-15
==================

  * deps: debug@~2.1.3
    - Fix high intensity foreground color for bold
    - deps: ms@0.7.0

0.3.3 / 2015-01-01
==================

  * deps: debug@~2.1.1
  * deps: on-finished@~2.2.0

0.3.2 / 2014-10-22
==================

  * deps: on-finished@~2.1.1
    - Fix handling of pipelined requests

0.3.1 / 2014-10-16
==================

  * deps: debug@~2.1.0
    - Implement `DEBUG_FD` env variable support

0.3.0 / 2014-09-17
==================

  * Terminate in progress response only on error
  * Use `on-finished` to determine request status

0.2.0 / 2014-09-03
==================

  * Set `X-Content-Type-Options: nosniff` header
  * deps: debug@~2.0.0

0.1.0 / 2014-07-16
==================

  * Respond after request fully read
    - prevents hung responses and socket hang ups
  * deps: debug@1.0.4

0.0.3 / 2014-07-11
==================

  * deps: debug@1.0.3
    - Add support for multiple wildcards in namespaces

0.0.2 / 2014-06-19
==================

  * Handle invalid status codes

0.0.1 / 2014-06-05
==================

  * deps: debug@1.0.2

0.0.0 / 2014-06-05
==================

  * Extracted from connect/express
(The MIT License)

Copyright (c) 2014-2022 Douglas Christopher Wilson <doug@somethingdoug.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.
# Security Policies and Procedures

## Reporting a Bug

The `finalhandler` team and community take all security bugs seriously. Thank
you for improving the security of Express. We appreciate your efforts and
responsible disclosure and will make every effort to acknowledge your
contributions.

Report security bugs by emailing the current owner(s) of `finalhandler`. This
information can be found in the npm registry using the command
`npm owner ls finalhandler`.
If unsure or unable to get the information from the above, open an issue
in the [project issue tracker](https://github.com/pillarjs/finalhandler/issues)
asking for the current contact information.

To ensure the timely response to your report, please ensure that the entirety
of the report is contained within the email body and not solely behind a web
link or an attachment.

At least one owner will acknowledge your email within 48 hours, and will send a
more detailed response within 48 hours indicating the next steps in handling
your report. After the initial reply to your report, the owners will
endeavor to keep you informed of the progress towards a fix and full
announcement, and may ask for additional information or guidance.
/*!
 * finalhandler
 * Copyright(c) 2014-2022 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module dependencies.
 * @private
 */

var debug = require('debug')('finalhandler')
var encodeUrl = require('encodeurl')
var escapeHtml = require('escape-html')
var onFinished = require('on-finished')
var parseUrl = require('parseurl')
var statuses = require('statuses')
var unpipe = require('unpipe')

/**
 * Module variables.
 * @private
 */

var DOUBLE_SPACE_REGEXP = /\x20{2}/g
var NEWLINE_REGEXP = /\n/g

/* istanbul ignore next */
var defer = typeof setImmediate === 'function'
  ? setImmediate
  : function (fn) { process.nextTick(fn.bind.apply(fn, arguments)) }
var isFinished = onFinished.isFinished

/**
 * Create a minimal HTML document.
 *
 * @param {string} message
 * @private
 */

function createHtmlDocument (message) {
  var body = escapeHtml(message)
    .replace(NEWLINE_REGEXP, '<br>')
    .replace(DOUBLE_SPACE_REGEXP, ' &nbsp;')

  return '<!DOCTYPE html>\n' +
    '<html lang="en">\n' +
    '<head>\n' +
    '<meta charset="utf-8">\n' +
    '<title>Error</title>\n' +
    '</head>\n' +
    '<body>\n' +
    '<pre>' + body + '</pre>\n' +
    '</body>\n' +
    '</html>\n'
}

/**
 * Module exports.
 * @public
 */

module.exports = finalhandler

/**
 * Create a function to handle the final response.
 *
 * @param {Request} req
 * @param {Response} res
 * @param {Object} [options]
 * @return {Function}
 * @public
 */

function finalhandler (req, res, options) {
  var opts = options || {}

  // get environment
  var env = opts.env || process.env.NODE_ENV || 'development'

  // get error callback
  var onerror = opts.onerror

  return function (err) {
    var headers
    var msg
    var status

    // ignore 404 on in-flight response
    if (!err && headersSent(res)) {
      debug('cannot 404 after headers sent')
      return
    }

    // unhandled error
    if (err) {
      // respect status code from error
      status = getErrorStatusCode(err)

      if (status === undefined) {
        // fallback to status code on response
        status = getResponseStatusCode(res)
      } else {
        // respect headers from error
        headers = getErrorHeaders(err)
      }

      // get error message
      msg = getErrorMessage(err, status, env)
    } else {
      // not found
      status = 404
      msg = 'Cannot ' + req.method + ' ' + encodeUrl(getResourceName(req))
    }

    debug('default %s', status)

    // schedule onerror callback
    if (err && onerror) {
      defer(onerror, err, req, res)
    }

    // cannot actually respond
    if (headersSent(res)) {
      debug('cannot %d after headers sent', status)
      req.socket.destroy()
      return
    }

    // send response
    send(req, res, status, headers, msg)
  }
}

/**
 * Get headers from Error object.
 *
 * @param {Error} err
 * @return {object}
 * @private
 */

function getErrorHeaders (err) {
  if (!err.headers || typeof err.headers !== 'object') {
    return undefined
  }

  var headers = Object.create(null)
  var keys = Object.keys(err.headers)

  for (var i = 0; i < keys.length; i++) {
    var key = keys[i]
    headers[key] = err.headers[key]
  }

  return headers
}

/**
 * Get message from Error object, fallback to status message.
 *
 * @param {Error} err
 * @param {number} status
 * @param {string} env
 * @return {string}
 * @private
 */

function getErrorMessage (err, status, env) {
  var msg

  if (env !== 'production') {
    // use err.stack, which typically includes err.message
    msg = err.stack

    // fallback to err.toString() when possible
    if (!msg && typeof err.toString === 'function') {
      msg = err.toString()
    }
  }

  return msg || statuses.message[status]
}

/**
 * Get status code from Error object.
 *
 * @param {Error} err
 * @return {number}
 * @private
 */

function getErrorStatusCode (err) {
  // check err.status
  if (typeof err.status === 'number' && err.status >= 400 && err.status < 600) {
    return err.status
  }

  // check err.statusCode
  if (typeof err.statusCode === 'number' && err.statusCode >= 400 && err.statusCode < 600) {
    return err.statusCode
  }

  return undefined
}

/**
 * Get resource name for the request.
 *
 * This is typically just the original pathname of the request
 * but will fallback to "resource" is that cannot be determined.
 *
 * @param {IncomingMessage} req
 * @return {string}
 * @private
 */

function getResourceName (req) {
  try {
    return parseUrl.original(req).pathname
  } catch (e) {
    return 'resource'
  }
}

/**
 * Get status code from response.
 *
 * @param {OutgoingMessage} res
 * @return {number}
 * @private
 */

function getResponseStatusCode (res) {
  var status = res.statusCode

  // default status code to 500 if outside valid range
  if (typeof status !== 'number' || status < 400 || status > 599) {
    status = 500
  }

  return status
}

/**
 * Determine if the response headers have been sent.
 *
 * @param {object} res
 * @returns {boolean}
 * @private
 */

function headersSent (res) {
  return typeof res.headersSent !== 'boolean'
    ? Boolean(res._header)
    : res.headersSent
}

/**
 * Send response.
 *
 * @param {IncomingMessage} req
 * @param {OutgoingMessage} res
 * @param {number} status
 * @param {object} headers
 * @param {string} message
 * @private
 */

function send (req, res, status, headers, message) {
  function write () {
    // response body
    var body = createHtmlDocument(message)

    // response status
    res.statusCode = status
    res.statusMessage = statuses.message[status]

    // remove any content headers
    res.removeHeader('Content-Encoding')
    res.removeHeader('Content-Language')
    res.removeHeader('Content-Range')

    // response headers
    setHeaders(res, headers)

    // security headers
    res.setHeader('Content-Security-Policy', "default-src 'none'")
    res.setHeader('X-Content-Type-Options', 'nosniff')

    // standard headers
    res.setHeader('Content-Type', 'text/html; charset=utf-8')
    res.setHeader('Content-Length', Buffer.byteLength(body, 'utf8'))

    if (req.method === 'HEAD') {
      res.end()
      return
    }

    res.end(body, 'utf8')
  }

  if (isFinished(req)) {
    write()
    return
  }

  // unpipe everything from the request
  unpipe(req)

  // flush the request
  onFinished(req, write)
  req.resume()
}

/**
 * Set response headers from an object.
 *
 * @param {OutgoingMessage} res
 * @param {object} headers
 * @private
 */

function setHeaders (res, headers) {
  if (!headers) {
    return
  }

  var keys = Object.keys(headers)
  for (var i = 0; i < keys.length; i++) {
    var key = keys[i]
    res.setHeader(key, headers[key])
  }
}
{
  "name": "finalhandler",
  "description": "Node.js final http responder",
  "version": "1.2.0",
  "author": "Douglas Christopher Wilson <doug@somethingdoug.com>",
  "license": "MIT",
  "repository": "pillarjs/finalhandler",
  "dependencies": {
    "debug": "2.6.9",
    "encodeurl": "~1.0.2",
    "escape-html": "~1.0.3",
    "on-finished": "2.4.1",
    "parseurl": "~1.3.3",
    "statuses": "2.0.1",
    "unpipe": "~1.0.0"
  },
  "devDependencies": {
    "eslint": "7.32.0",
    "eslint-config-standard": "14.1.1",
    "eslint-plugin-import": "2.25.4",
    "eslint-plugin-markdown": "2.2.1",
    "eslint-plugin-node": "11.1.0",
    "eslint-plugin-promise": "5.2.0",
    "eslint-plugin-standard": "4.1.0",
    "mocha": "9.2.2",
    "nyc": "15.1.0",
    "readable-stream": "2.3.6",
    "safe-buffer": "5.2.1",
    "supertest": "6.2.2"
  },
  "files": [
    "LICENSE",
    "HISTORY.md",
    "SECURITY.md",
    "index.js"
  ],
  "engines": {
    "node": ">= 0.8"
  }
}Copyright 2014–present Olivier Lalonde <olalonde@gmail.com>, James Talmage <james@talmage.io>, Ruben Verborgh

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

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

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

module.exports = function () {
  if (!debug) {
    try {
      /* eslint global-require: off */
      debug = require("debug")("follow-redirects");
    }
    catch (error) { /* */ }
    if (typeof debug !== "function") {
      debug = function () { /* */ };
    }
  }
  debug.apply(null, arguments);
};
module.exports = require("./").http;
module.exports = require("./").https;
var url = require("url");
var URL = url.URL;
var http = require("http");
var https = require("https");
var Writable = require("stream").Writable;
var assert = require("assert");
var debug = require("./debug");

// Create handlers that pass events from native requests
var events = ["abort", "aborted", "connect", "error", "socket", "timeout"];
var eventHandlers = Object.create(null);
events.forEach(function (event) {
  eventHandlers[event] = function (arg1, arg2, arg3) {
    this._redirectable.emit(event, arg1, arg2, arg3);
  };
});

// Error types with codes
var RedirectionError = createErrorType(
  "ERR_FR_REDIRECTION_FAILURE",
  "Redirected request failed"
);
var TooManyRedirectsError = createErrorType(
  "ERR_FR_TOO_MANY_REDIRECTS",
  "Maximum number of redirects exceeded"
);
var MaxBodyLengthExceededError = createErrorType(
  "ERR_FR_MAX_BODY_LENGTH_EXCEEDED",
  "Request body larger than maxBodyLength limit"
);
var WriteAfterEndError = createErrorType(
  "ERR_STREAM_WRITE_AFTER_END",
  "write after end"
);

// An HTTP(S) request that can be redirected
function RedirectableRequest(options, responseCallback) {
  // Initialize the request
  Writable.call(this);
  this._sanitizeOptions(options);
  this._options = options;
  this._ended = false;
  this._ending = false;
  this._redirectCount = 0;
  this._redirects = [];
  this._requestBodyLength = 0;
  this._requestBodyBuffers = [];

  // Attach a callback if passed
  if (responseCallback) {
    this.on("response", responseCallback);
  }

  // React to responses of native requests
  var self = this;
  this._onNativeResponse = function (response) {
    self._processResponse(response);
  };

  // Perform the first request
  this._performRequest();
}
RedirectableRequest.prototype = Object.create(Writable.prototype);

RedirectableRequest.prototype.abort = function () {
  abortRequest(this._currentRequest);
  this.emit("abort");
};

// Writes buffered data to the current native request
RedirectableRequest.prototype.write = function (data, encoding, callback) {
  // Writing is not allowed if end has been called
  if (this._ending) {
    throw new WriteAfterEndError();
  }

  // Validate input and shift parameters if necessary
  if (!(typeof data === "string" || typeof data === "object" && ("length" in data))) {
    throw new TypeError("data should be a string, Buffer or Uint8Array");
  }
  if (typeof encoding === "function") {
    callback = encoding;
    encoding = null;
  }

  // Ignore empty buffers, since writing them doesn't invoke the callback
  // https://github.com/nodejs/node/issues/22066
  if (data.length === 0) {
    if (callback) {
      callback();
    }
    return;
  }
  // Only write when we don't exceed the maximum body length
  if (this._requestBodyLength + data.length <= this._options.maxBodyLength) {
    this._requestBodyLength += data.length;
    this._requestBodyBuffers.push({ data: data, encoding: encoding });
    this._currentRequest.write(data, encoding, callback);
  }
  // Error when we exceed the maximum body length
  else {
    this.emit("error", new MaxBodyLengthExceededError());
    this.abort();
  }
};

// Ends the current native request
RedirectableRequest.prototype.end = function (data, encoding, callback) {
  // Shift parameters if necessary
  if (typeof data === "function") {
    callback = data;
    data = encoding = null;
  }
  else if (typeof encoding === "function") {
    callback = encoding;
    encoding = null;
  }

  // Write data if needed and end
  if (!data) {
    this._ended = this._ending = true;
    this._currentRequest.end(null, null, callback);
  }
  else {
    var self = this;
    var currentRequest = this._currentRequest;
    this.write(data, encoding, function () {
      self._ended = true;
      currentRequest.end(null, null, callback);
    });
    this._ending = true;
  }
};

// Sets a header value on the current native request
RedirectableRequest.prototype.setHeader = function (name, value) {
  this._options.headers[name] = value;
  this._currentRequest.setHeader(name, value);
};

// Clears a header value on the current native request
RedirectableRequest.prototype.removeHeader = function (name) {
  delete this._options.headers[name];
  this._currentRequest.removeHeader(name);
};

// Global timeout for all underlying requests
RedirectableRequest.prototype.setTimeout = function (msecs, callback) {
  var self = this;

  // Destroys the socket on timeout
  function destroyOnTimeout(socket) {
    socket.setTimeout(msecs);
    socket.removeListener("timeout", socket.destroy);
    socket.addListener("timeout", socket.destroy);
  }

  // Sets up a timer to trigger a timeout event
  function startTimer(socket) {
    if (self._timeout) {
      clearTimeout(self._timeout);
    }
    self._timeout = setTimeout(function () {
      self.emit("timeout");
      clearTimer();
    }, msecs);
    destroyOnTimeout(socket);
  }

  // Stops a timeout from triggering
  function clearTimer() {
    // Clear the timeout
    if (self._timeout) {
      clearTimeout(self._timeout);
      self._timeout = null;
    }

    // Clean up all attached listeners
    self.removeListener("abort", clearTimer);
    self.removeListener("error", clearTimer);
    self.removeListener("response", clearTimer);
    if (callback) {
      self.removeListener("timeout", callback);
    }
    if (!self.socket) {
      self._currentRequest.removeListener("socket", startTimer);
    }
  }

  // Attach callback if passed
  if (callback) {
    this.on("timeout", callback);
  }

  // Start the timer if or when the socket is opened
  if (this.socket) {
    startTimer(this.socket);
  }
  else {
    this._currentRequest.once("socket", startTimer);
  }

  // Clean up on events
  this.on("socket", destroyOnTimeout);
  this.on("abort", clearTimer);
  this.on("error", clearTimer);
  this.on("response", clearTimer);

  return this;
};

// Proxy all other public ClientRequest methods
[
  "flushHeaders", "getHeader",
  "setNoDelay", "setSocketKeepAlive",
].forEach(function (method) {
  RedirectableRequest.prototype[method] = function (a, b) {
    return this._currentRequest[method](a, b);
  };
});

// Proxy all public ClientRequest properties
["aborted", "connection", "socket"].forEach(function (property) {
  Object.defineProperty(RedirectableRequest.prototype, property, {
    get: function () { return this._currentRequest[property]; },
  });
});

RedirectableRequest.prototype._sanitizeOptions = function (options) {
  // Ensure headers are always present
  if (!options.headers) {
    options.headers = {};
  }

  // Since http.request treats host as an alias of hostname,
  // but the url module interprets host as hostname plus port,
  // eliminate the host property to avoid confusion.
  if (options.host) {
    // Use hostname if set, because it has precedence
    if (!options.hostname) {
      options.hostname = options.host;
    }
    delete options.host;
  }

  // Complete the URL object when necessary
  if (!options.pathname && options.path) {
    var searchPos = options.path.indexOf("?");
    if (searchPos < 0) {
      options.pathname = options.path;
    }
    else {
      options.pathname = options.path.substring(0, searchPos);
      options.search = options.path.substring(searchPos);
    }
  }
};


// Executes the next native request (initial or redirect)
RedirectableRequest.prototype._performRequest = function () {
  // Load the native protocol
  var protocol = this._options.protocol;
  var nativeProtocol = this._options.nativeProtocols[protocol];
  if (!nativeProtocol) {
    this.emit("error", new TypeError("Unsupported protocol " + protocol));
    return;
  }

  // If specified, use the agent corresponding to the protocol
  // (HTTP and HTTPS use different types of agents)
  if (this._options.agents) {
    var scheme = protocol.slice(0, -1);
    this._options.agent = this._options.agents[scheme];
  }

  // Create the native request and set up its event handlers
  var request = this._currentRequest =
        nativeProtocol.request(this._options, this._onNativeResponse);
  request._redirectable = this;
  for (var event of events) {
    request.on(event, eventHandlers[event]);
  }

  // RFC7230§5.3.1: When making a request directly to an origin server, […]
  // a client MUST send only the absolute path […] as the request-target.
  this._currentUrl = /^\//.test(this._options.path) ?
    url.format(this._options) :
    // When making a request to a proxy, […]
    // a client MUST send the target URI in absolute-form […].
    this._currentUrl = this._options.path;

  // End a redirected request
  // (The first request must be ended explicitly with RedirectableRequest#end)
  if (this._isRedirect) {
    // Write the request entity and end
    var i = 0;
    var self = this;
    var buffers = this._requestBodyBuffers;
    (function writeNext(error) {
      // Only write if this request has not been redirected yet
      /* istanbul ignore else */
      if (request === self._currentRequest) {
        // Report any write errors
        /* istanbul ignore if */
        if (error) {
          self.emit("error", error);
        }
        // Write the next buffer if there are still left
        else if (i < buffers.length) {
          var buffer = buffers[i++];
          /* istanbul ignore else */
          if (!request.finished) {
            request.write(buffer.data, buffer.encoding, writeNext);
          }
        }
        // End the request if `end` has been called on us
        else if (self._ended) {
          request.end();
        }
      }
    }());
  }
};

// Processes a response from the current native request
RedirectableRequest.prototype._processResponse = function (response) {
  // Store the redirected response
  var statusCode = response.statusCode;
  if (this._options.trackRedirects) {
    this._redirects.push({
      url: this._currentUrl,
      headers: response.headers,
      statusCode: statusCode,
    });
  }

  // RFC7231§6.4: The 3xx (Redirection) class of status code indicates
  // that further action needs to be taken by the user agent in order to
  // fulfill the request. If a Location header field is provided,
  // the user agent MAY automatically redirect its request to the URI
  // referenced by the Location field value,
  // even if the specific status code is not understood.

  // If the response is not a redirect; return it as-is
  var location = response.headers.location;
  if (!location || this._options.followRedirects === false ||
      statusCode < 300 || statusCode >= 400) {
    response.responseUrl = this._currentUrl;
    response.redirects = this._redirects;
    this.emit("response", response);

    // Clean up
    this._requestBodyBuffers = [];
    return;
  }

  // The response is a redirect, so abort the current request
  abortRequest(this._currentRequest);
  // Discard the remainder of the response to avoid waiting for data
  response.destroy();

  // RFC7231§6.4: A client SHOULD detect and intervene
  // in cyclical redirections (i.e., "infinite" redirection loops).
  if (++this._redirectCount > this._options.maxRedirects) {
    this.emit("error", new TooManyRedirectsError());
    return;
  }

  // Store the request headers if applicable
  var requestHeaders;
  var beforeRedirect = this._options.beforeRedirect;
  if (beforeRedirect) {
    requestHeaders = Object.assign({
      // The Host header was set by nativeProtocol.request
      Host: response.req.getHeader("host"),
    }, this._options.headers);
  }

  // RFC7231§6.4: Automatic redirection needs to done with
  // care for methods not known to be safe, […]
  // RFC7231§6.4.2–3: For historical reasons, a user agent MAY change
  // the request method from POST to GET for the subsequent request.
  var method = this._options.method;
  if ((statusCode === 301 || statusCode === 302) && this._options.method === "POST" ||
      // RFC7231§6.4.4: The 303 (See Other) status code indicates that
      // the server is redirecting the user agent to a different resource […]
      // A user agent can perform a retrieval request targeting that URI
      // (a GET or HEAD request if using HTTP) […]
      (statusCode === 303) && !/^(?:GET|HEAD)$/.test(this._options.method)) {
    this._options.method = "GET";
    // Drop a possible entity and headers related to it
    this._requestBodyBuffers = [];
    removeMatchingHeaders(/^content-/i, this._options.headers);
  }

  // Drop the Host header, as the redirect might lead to a different host
  var currentHostHeader = removeMatchingHeaders(/^host$/i, this._options.headers);

  // If the redirect is relative, carry over the host of the last request
  var currentUrlParts = url.parse(this._currentUrl);
  var currentHost = currentHostHeader || currentUrlParts.host;
  var currentUrl = /^\w+:/.test(location) ? this._currentUrl :
    url.format(Object.assign(currentUrlParts, { host: currentHost }));

  // Determine the URL of the redirection
  var redirectUrl;
  try {
    redirectUrl = url.resolve(currentUrl, location);
  }
  catch (cause) {
    this.emit("error", new RedirectionError(cause));
    return;
  }

  // Create the redirected request
  debug("redirecting to", redirectUrl);
  this._isRedirect = true;
  var redirectUrlParts = url.parse(redirectUrl);
  Object.assign(this._options, redirectUrlParts);

  // Drop confidential headers when redirecting to a less secure protocol
  // or to a different domain that is not a superdomain
  if (redirectUrlParts.protocol !== currentUrlParts.protocol &&
     redirectUrlParts.protocol !== "https:" ||
     redirectUrlParts.host !== currentHost &&
     !isSubdomain(redirectUrlParts.host, currentHost)) {
    removeMatchingHeaders(/^(?:authorization|cookie)$/i, this._options.headers);
  }

  // Evaluate the beforeRedirect callback
  if (typeof beforeRedirect === "function") {
    var responseDetails = {
      headers: response.headers,
      statusCode: statusCode,
    };
    var requestDetails = {
      url: currentUrl,
      method: method,
      headers: requestHeaders,
    };
    try {
      beforeRedirect(this._options, responseDetails, requestDetails);
    }
    catch (err) {
      this.emit("error", err);
      return;
    }
    this._sanitizeOptions(this._options);
  }

  // Perform the redirected request
  try {
    this._performRequest();
  }
  catch (cause) {
    this.emit("error", new RedirectionError(cause));
  }
};

// Wraps the key/value object of protocols with redirect functionality
function wrap(protocols) {
  // Default settings
  var exports = {
    maxRedirects: 21,
    maxBodyLength: 10 * 1024 * 1024,
  };

  // Wrap each protocol
  var nativeProtocols = {};
  Object.keys(protocols).forEach(function (scheme) {
    var protocol = scheme + ":";
    var nativeProtocol = nativeProtocols[protocol] = protocols[scheme];
    var wrappedProtocol = exports[scheme] = Object.create(nativeProtocol);

    // Executes a request, following redirects
    function request(input, options, callback) {
      // Parse parameters
      if (typeof input === "string") {
        var urlStr = input;
        try {
          input = urlToOptions(new URL(urlStr));
        }
        catch (err) {
          /* istanbul ignore next */
          input = url.parse(urlStr);
        }
      }
      else if (URL && (input instanceof URL)) {
        input = urlToOptions(input);
      }
      else {
        callback = options;
        options = input;
        input = { protocol: protocol };
      }
      if (typeof options === "function") {
        callback = options;
        options = null;
      }

      // Set defaults
      options = Object.assign({
        maxRedirects: exports.maxRedirects,
        maxBodyLength: exports.maxBodyLength,
      }, input, options);
      options.nativeProtocols = nativeProtocols;

      assert.equal(options.protocol, protocol, "protocol mismatch");
      debug("options", options);
      return new RedirectableRequest(options, callback);
    }

    // Executes a GET request, following redirects
    function get(input, options, callback) {
      var wrappedRequest = wrappedProtocol.request(input, options, callback);
      wrappedRequest.end();
      return wrappedRequest;
    }

    // Expose the properties on the wrapped protocol
    Object.defineProperties(wrappedProtocol, {
      request: { value: request, configurable: true, enumerable: true, writable: true },
      get: { value: get, configurable: true, enumerable: true, writable: true },
    });
  });
  return exports;
}

/* istanbul ignore next */
function noop() { /* empty */ }

// from https://github.com/nodejs/node/blob/master/lib/internal/url.js
function urlToOptions(urlObject) {
  var options = {
    protocol: urlObject.protocol,
    hostname: urlObject.hostname.startsWith("[") ?
      /* istanbul ignore next */
      urlObject.hostname.slice(1, -1) :
      urlObject.hostname,
    hash: urlObject.hash,
    search: urlObject.search,
    pathname: urlObject.pathname,
    path: urlObject.pathname + urlObject.search,
    href: urlObject.href,
  };
  if (urlObject.port !== "") {
    options.port = Number(urlObject.port);
  }
  return options;
}

function removeMatchingHeaders(regex, headers) {
  var lastValue;
  for (var header in headers) {
    if (regex.test(header)) {
      lastValue = headers[header];
      delete headers[header];
    }
  }
  return (lastValue === null || typeof lastValue === "undefined") ?
    undefined : String(lastValue).trim();
}

function createErrorType(code, defaultMessage) {
  function CustomError(cause) {
    Error.captureStackTrace(this, this.constructor);
    if (!cause) {
      this.message = defaultMessage;
    }
    else {
      this.message = defaultMessage + ": " + cause.message;
      this.cause = cause;
    }
  }
  CustomError.prototype = new Error();
  CustomError.prototype.constructor = CustomError;
  CustomError.prototype.name = "Error [" + code + "]";
  CustomError.prototype.code = code;
  return CustomError;
}

function abortRequest(request) {
  for (var event of events) {
    request.removeListener(event, eventHandlers[event]);
  }
  request.on("error", noop);
  request.abort();
}

function isSubdomain(subdomain, domain) {
  const dot = subdomain.length - domain.length - 1;
  return dot > 0 && subdomain[dot] === "." && subdomain.endsWith(domain);
}

// Exports
module.exports = wrap({ http: http, https: https });
module.exports.wrap = wrap;
{
  "name": "follow-redirects",
  "version": "1.15.1",
  "description": "HTTP and HTTPS modules that follow redirects.",
  "license": "MIT",
  "main": "index.js",
  "files": [
    "*.js"
  ],
  "engines": {
    "node": ">=4.0"
  },
  "repository": {
    "type": "git",
    "url": "git@github.com:follow-redirects/follow-redirects.git"
  },
  "homepage": "https://github.com/follow-redirects/follow-redirects",
  "author": "Ruben Verborgh <ruben@verborgh.org> (https://ruben.verborgh.org/)",
  "funding": [
    {
      "type": "individual",
      "url": "https://github.com/sponsors/RubenVerborgh"
    }
  ],
  "peerDependenciesMeta": {
    "debug": {
      "optional": true
    }
  },
  "devDependencies": {
    "concat-stream": "^2.0.0",
    "eslint": "^5.16.0",
    "express": "^4.16.4",
    "lolex": "^3.1.0",
    "mocha": "^6.0.2",
    "nyc": "^14.1.1"
  }
}0.2.0 / 2021-05-31
==================

  * Use `req.socket` over deprecated `req.connection`

0.1.2 / 2017-09-14
==================

  * perf: improve header parsing
  * perf: reduce overhead when no `X-Forwarded-For` header

0.1.1 / 2017-09-10
==================

  * Fix trimming leading / trailing OWS
  * perf: hoist regular expression

0.1.0 / 2014-09-21
==================

  * Initial release
(The MIT License)

Copyright (c) 2014-2017 Douglas Christopher Wilson

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.
/*!
 * forwarded
 * Copyright(c) 2014-2017 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module exports.
 * @public
 */

module.exports = forwarded

/**
 * Get all addresses in the request, using the `X-Forwarded-For` header.
 *
 * @param {object} req
 * @return {array}
 * @public
 */

function forwarded (req) {
  if (!req) {
    throw new TypeError('argument req is required')
  }

  // simple header parsing
  var proxyAddrs = parse(req.headers['x-forwarded-for'] || '')
  var socketAddr = getSocketAddr(req)
  var addrs = [socketAddr].concat(proxyAddrs)

  // return all addresses
  return addrs
}

/**
 * Get the socket address for a request.
 *
 * @param {object} req
 * @return {string}
 * @private
 */

function getSocketAddr (req) {
  return req.socket
    ? req.socket.remoteAddress
    : req.connection.remoteAddress
}

/**
 * Parse the X-Forwarded-For header.
 *
 * @param {string} header
 * @private
 */

function parse (header) {
  var end = header.length
  var list = []
  var start = header.length

  // gather addresses, backwards
  for (var i = header.length - 1; i >= 0; i--) {
    switch (header.charCodeAt(i)) {
      case 0x20: /*   */
        if (start === end) {
          start = end = i
        }
        break
      case 0x2c: /* , */
        if (start !== end) {
          list.push(header.substring(start, end))
        }
        start = end = i
        break
      default:
        start = i
        break
    }
  }

  // final address
  if (start !== end) {
    list.push(header.substring(start, end))
  }

  return list
}
{
  "name": "forwarded",
  "description": "Parse HTTP X-Forwarded-For header",
  "version": "0.2.0",
  "license": "MIT",
  "repository": "jshttp/forwarded",
  "devDependencies": {
    "beautify-benchmark": "0.2.4",
    "benchmark": "2.1.4",
    "deep-equal": "1.0.1",
    "eslint": "7.27.0",
    "eslint-config-standard": "14.1.1",
    "eslint-plugin-import": "2.23.4",
    "eslint-plugin-node": "11.1.0",
    "eslint-plugin-promise": "4.3.1",
    "eslint-plugin-standard": "4.1.0",
    "mocha": "8.4.0",
    "nyc": "15.1.0"
  },
  "files": [
    "LICENSE",
    "HISTORY.md",
    "README.md",
    "index.js"
  ],
  "engines": {
    "node": ">= 0.6"
  }
}0.5.2 / 2017-09-13
==================

  * Fix regression matching multiple ETags in `If-None-Match`
  * perf: improve `If-None-Match` token parsing

0.5.1 / 2017-09-11
==================

  * Fix handling of modified headers with invalid dates
  * perf: improve ETag match loop

0.5.0 / 2017-02-21
==================

  * Fix incorrect result when `If-None-Match` has both `*` and ETags
  * Fix weak `ETag` matching to match spec
  * perf: delay reading header values until needed
  * perf: skip checking modified time if ETag check failed
  * perf: skip parsing `If-None-Match` when no `ETag` header
  * perf: use `Date.parse` instead of `new Date`

0.4.0 / 2017-02-05
==================

  * Fix false detection of `no-cache` request directive
  * perf: enable strict mode
  * perf: hoist regular expressions
  * perf: remove duplicate conditional
  * perf: remove unnecessary boolean coercions

0.3.0 / 2015-05-12
==================

  * Add weak `ETag` matching support

0.2.4 / 2014-09-07
==================

  * Support Node.js 0.6

0.2.3 / 2014-09-07
==================

  * Move repository to jshttp

0.2.2 / 2014-02-19
==================

  * Revert "Fix for blank page on Safari reload"

0.2.1 / 2014-01-29
==================

  * Fix for blank page on Safari reload

0.2.0 / 2013-08-11
==================

  * Return stale for `Cache-Control: no-cache`

0.1.0 / 2012-06-15
==================

  * Add `If-None-Match: *` support

0.0.1 / 2012-06-10
==================

  * Initial release
(The MIT License)

Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca>
Copyright (c) 2016-2017 Douglas Christopher Wilson <doug@somethingdoug.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.
/*!
 * fresh
 * Copyright(c) 2012 TJ Holowaychuk
 * Copyright(c) 2016-2017 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * RegExp to check for no-cache token in Cache-Control.
 * @private
 */

var CACHE_CONTROL_NO_CACHE_REGEXP = /(?:^|,)\s*?no-cache\s*?(?:,|$)/

/**
 * Module exports.
 * @public
 */

module.exports = fresh

/**
 * Check freshness of the response using request and response headers.
 *
 * @param {Object} reqHeaders
 * @param {Object} resHeaders
 * @return {Boolean}
 * @public
 */

function fresh (reqHeaders, resHeaders) {
  // fields
  var modifiedSince = reqHeaders['if-modified-since']
  var noneMatch = reqHeaders['if-none-match']

  // unconditional request
  if (!modifiedSince && !noneMatch) {
    return false
  }

  // Always return stale when Cache-Control: no-cache
  // to support end-to-end reload requests
  // https://tools.ietf.org/html/rfc2616#section-14.9.4
  var cacheControl = reqHeaders['cache-control']
  if (cacheControl && CACHE_CONTROL_NO_CACHE_REGEXP.test(cacheControl)) {
    return false
  }

  // if-none-match
  if (noneMatch && noneMatch !== '*') {
    var etag = resHeaders['etag']

    if (!etag) {
      return false
    }

    var etagStale = true
    var matches = parseTokenList(noneMatch)
    for (var i = 0; i < matches.length; i++) {
      var match = matches[i]
      if (match === etag || match === 'W/' + etag || 'W/' + match === etag) {
        etagStale = false
        break
      }
    }

    if (etagStale) {
      return false
    }
  }

  // if-modified-since
  if (modifiedSince) {
    var lastModified = resHeaders['last-modified']
    var modifiedStale = !lastModified || !(parseHttpDate(lastModified) <= parseHttpDate(modifiedSince))

    if (modifiedStale) {
      return false
    }
  }

  return true
}

/**
 * Parse an HTTP Date into a number.
 *
 * @param {string} date
 * @private
 */

function parseHttpDate (date) {
  var timestamp = date && Date.parse(date)

  // istanbul ignore next: guard against date.js Date.parse patching
  return typeof timestamp === 'number'
    ? timestamp
    : NaN
}

/**
 * Parse a HTTP token list.
 *
 * @param {string} str
 * @private
 */

function parseTokenList (str) {
  var end = 0
  var list = []
  var start = 0

  // gather tokens
  for (var i = 0, len = str.length; i < len; i++) {
    switch (str.charCodeAt(i)) {
      case 0x20: /*   */
        if (start === end) {
          start = end = i + 1
        }
        break
      case 0x2c: /* , */
        list.push(str.substring(start, end))
        start = end = i + 1
        break
      default:
        end = i + 1
        break
    }
  }

  // final token
  list.push(str.substring(start, end))

  return list
}
{
  "name": "fresh",
  "description": "HTTP response freshness testing",
  "version": "0.5.2",
  "author": "TJ Holowaychuk <tj@vision-media.ca> (http://tjholowaychuk.com)",
  "license": "MIT",
  "repository": "jshttp/fresh",
  "devDependencies": {
    "beautify-benchmark": "0.2.4",
    "benchmark": "2.1.4",
    "eslint": "3.19.0",
    "eslint-config-standard": "10.2.1",
    "eslint-plugin-import": "2.7.0",
    "eslint-plugin-markdown": "1.0.0-beta.6",
    "eslint-plugin-node": "5.1.1",
    "eslint-plugin-promise": "3.5.0",
    "eslint-plugin-standard": "3.0.1",
    "istanbul": "0.4.5",
    "mocha": "1.21.5"
  },
  "files": [
    "HISTORY.md",
    "LICENSE",
    "index.js"
  ],
  "engines": {
    "node": ">= 0.6"
  }
}The MIT License (MIT)

Copyright (c) 2018 Mathias Buus

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.
module.exports = require('constants')
module.exports = require('fs').constants || require('constants')
{
  "name": "fs-constants",
  "version": "1.0.0",
  "description": "Require constants across node and the browser",
  "main": "index.js",
  "browser": "browser.js",
  "dependencies": {},
  "devDependencies": {},
  "repository": {
    "type": "git",
    "url": "https://github.com/mafintosh/fs-constants.git"
  },
  "author": "Mathias Buus (@mafintosh)",
  "license": "MIT",
  "homepage": "https://github.com/mafintosh/fs-constants"
}(The MIT License)

Copyright (c) 2011-2017 JP Richardson

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": "fs-extra",
  "version": "10.1.0",
  "description": "fs-extra contains methods that aren't included in the vanilla Node.js fs package. Such as recursive mkdir, copy, and remove.",
  "engines": {
    "node": ">=12"
  },
  "homepage": "https://github.com/jprichardson/node-fs-extra",
  "repository": {
    "type": "git",
    "url": "https://github.com/jprichardson/node-fs-extra"
  },
  "author": "JP Richardson <jprichardson@gmail.com>",
  "license": "MIT",
  "dependencies": {
    "graceful-fs": "^4.2.0",
    "jsonfile": "^6.0.1",
    "universalify": "^2.0.0"
  },
  "devDependencies": {
    "at-least-node": "^1.0.0",
    "klaw": "^2.1.1",
    "klaw-sync": "^3.0.2",
    "minimist": "^1.1.1",
    "mocha": "^5.0.5",
    "nyc": "^15.0.0",
    "proxyquire": "^2.0.1",
    "read-dir-files": "^0.1.1",
    "standard": "^16.0.3"
  },
  "main": "./lib/index.js",
  "files": [
    "lib/",
    "!lib/**/__tests__/"
  ],
  "sideEffects": false
}'use strict'

module.exports = {
  // Export promiseified graceful-fs:
  ...require('./fs'),
  // Export extra methods:
  ...require('./copy'),
  ...require('./empty'),
  ...require('./ensure'),
  ...require('./json'),
  ...require('./mkdirs'),
  ...require('./move'),
  ...require('./output-file'),
  ...require('./path-exists'),
  ...require('./remove')
}
'use strict'

const fs = require('../fs')
const path = require('path')
const util = require('util')

function getStats (src, dest, opts) {
  const statFunc = opts.dereference
    ? (file) => fs.stat(file, { bigint: true })
    : (file) => fs.lstat(file, { bigint: true })
  return Promise.all([
    statFunc(src),
    statFunc(dest).catch(err => {
      if (err.code === 'ENOENT') return null
      throw err
    })
  ]).then(([srcStat, destStat]) => ({ srcStat, destStat }))
}

function getStatsSync (src, dest, opts) {
  let destStat
  const statFunc = opts.dereference
    ? (file) => fs.statSync(file, { bigint: true })
    : (file) => fs.lstatSync(file, { bigint: true })
  const srcStat = statFunc(src)
  try {
    destStat = statFunc(dest)
  } catch (err) {
    if (err.code === 'ENOENT') return { srcStat, destStat: null }
    throw err
  }
  return { srcStat, destStat }
}

function checkPaths (src, dest, funcName, opts, cb) {
  util.callbackify(getStats)(src, dest, opts, (err, stats) => {
    if (err) return cb(err)
    const { srcStat, destStat } = stats

    if (destStat) {
      if (areIdentical(srcStat, destStat)) {
        const srcBaseName = path.basename(src)
        const destBaseName = path.basename(dest)
        if (funcName === 'move' &&
          srcBaseName !== destBaseName &&
          srcBaseName.toLowerCase() === destBaseName.toLowerCase()) {
          return cb(null, { srcStat, destStat, isChangingCase: true })
        }
        return cb(new Error('Source and destination must not be the same.'))
      }
      if (srcStat.isDirectory() && !destStat.isDirectory()) {
        return cb(new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`))
      }
      if (!srcStat.isDirectory() && destStat.isDirectory()) {
        return cb(new Error(`Cannot overwrite directory '${dest}' with non-directory '${src}'.`))
      }
    }

    if (srcStat.isDirectory() && isSrcSubdir(src, dest)) {
      return cb(new Error(errMsg(src, dest, funcName)))
    }
    return cb(null, { srcStat, destStat })
  })
}

function checkPathsSync (src, dest, funcName, opts) {
  const { srcStat, destStat } = getStatsSync(src, dest, opts)

  if (destStat) {
    if (areIdentical(srcStat, destStat)) {
      const srcBaseName = path.basename(src)
      const destBaseName = path.basename(dest)
      if (funcName === 'move' &&
        srcBaseName !== destBaseName &&
        srcBaseName.toLowerCase() === destBaseName.toLowerCase()) {
        return { srcStat, destStat, isChangingCase: true }
      }
      throw new Error('Source and destination must not be the same.')
    }
    if (srcStat.isDirectory() && !destStat.isDirectory()) {
      throw new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`)
    }
    if (!srcStat.isDirectory() && destStat.isDirectory()) {
      throw new Error(`Cannot overwrite directory '${dest}' with non-directory '${src}'.`)
    }
  }

  if (srcStat.isDirectory() && isSrcSubdir(src, dest)) {
    throw new Error(errMsg(src, dest, funcName))
  }
  return { srcStat, destStat }
}

// recursively check if dest parent is a subdirectory of src.
// It works for all file types including symlinks since it
// checks the src and dest inodes. It starts from the deepest
// parent and stops once it reaches the src parent or the root path.
function checkParentPaths (src, srcStat, dest, funcName, cb) {
  const srcParent = path.resolve(path.dirname(src))
  const destParent = path.resolve(path.dirname(dest))
  if (destParent === srcParent || destParent === path.parse(destParent).root) return cb()
  fs.stat(destParent, { bigint: true }, (err, destStat) => {
    if (err) {
      if (err.code === 'ENOENT') return cb()
      return cb(err)
    }
    if (areIdentical(srcStat, destStat)) {
      return cb(new Error(errMsg(src, dest, funcName)))
    }
    return checkParentPaths(src, srcStat, destParent, funcName, cb)
  })
}

function checkParentPathsSync (src, srcStat, dest, funcName) {
  const srcParent = path.resolve(path.dirname(src))
  const destParent = path.resolve(path.dirname(dest))
  if (destParent === srcParent || destParent === path.parse(destParent).root) return
  let destStat
  try {
    destStat = fs.statSync(destParent, { bigint: true })
  } catch (err) {
    if (err.code === 'ENOENT') return
    throw err
  }
  if (areIdentical(srcStat, destStat)) {
    throw new Error(errMsg(src, dest, funcName))
  }
  return checkParentPathsSync(src, srcStat, destParent, funcName)
}

function areIdentical (srcStat, destStat) {
  return destStat.ino && destStat.dev && destStat.ino === srcStat.ino && destStat.dev === srcStat.dev
}

// return true if dest is a subdir of src, otherwise false.
// It only checks the path strings.
function isSrcSubdir (src, dest) {
  const srcArr = path.resolve(src).split(path.sep).filter(i => i)
  const destArr = path.resolve(dest).split(path.sep).filter(i => i)
  return srcArr.reduce((acc, cur, i) => acc && destArr[i] === cur, true)
}

function errMsg (src, dest, funcName) {
  return `Cannot ${funcName} '${src}' to a subdirectory of itself, '${dest}'.`
}

module.exports = {
  checkPaths,
  checkPathsSync,
  checkParentPaths,
  checkParentPathsSync,
  isSrcSubdir,
  areIdentical
}
'use strict'

const fs = require('graceful-fs')

function utimesMillis (path, atime, mtime, callback) {
  // if (!HAS_MILLIS_RES) return fs.utimes(path, atime, mtime, callback)
  fs.open(path, 'r+', (err, fd) => {
    if (err) return callback(err)
    fs.futimes(fd, atime, mtime, futimesErr => {
      fs.close(fd, closeErr => {
        if (callback) callback(futimesErr || closeErr)
      })
    })
  })
}

function utimesMillisSync (path, atime, mtime) {
  const fd = fs.openSync(path, 'r+')
  fs.futimesSync(fd, atime, mtime)
  return fs.closeSync(fd)
}

module.exports = {
  utimesMillis,
  utimesMillisSync
}
'use strict'

const fs = require('graceful-fs')
const u = require('universalify').fromCallback
const rimraf = require('./rimraf')

function remove (path, callback) {
  // Node 14.14.0+
  if (fs.rm) return fs.rm(path, { recursive: true, force: true }, callback)
  rimraf(path, callback)
}

function removeSync (path) {
  // Node 14.14.0+
  if (fs.rmSync) return fs.rmSync(path, { recursive: true, force: true })
  rimraf.sync(path)
}

module.exports = {
  remove: u(remove),
  removeSync
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const assert = require('assert')

const isWindows = (process.platform === 'win32')

function defaults (options) {
  const methods = [
    'unlink',
    'chmod',
    'stat',
    'lstat',
    'rmdir',
    'readdir'
  ]
  methods.forEach(m => {
    options[m] = options[m] || fs[m]
    m = m + 'Sync'
    options[m] = options[m] || fs[m]
  })

  options.maxBusyTries = options.maxBusyTries || 3
}

function rimraf (p, options, cb) {
  let busyTries = 0

  if (typeof options === 'function') {
    cb = options
    options = {}
  }

  assert(p, 'rimraf: missing path')
  assert.strictEqual(typeof p, 'string', 'rimraf: path should be a string')
  assert.strictEqual(typeof cb, 'function', 'rimraf: callback function required')
  assert(options, 'rimraf: invalid options argument provided')
  assert.strictEqual(typeof options, 'object', 'rimraf: options should be object')

  defaults(options)

  rimraf_(p, options, function CB (er) {
    if (er) {
      if ((er.code === 'EBUSY' || er.code === 'ENOTEMPTY' || er.code === 'EPERM') &&
          busyTries < options.maxBusyTries) {
        busyTries++
        const time = busyTries * 100
        // try again, with the same exact callback as this one.
        return setTimeout(() => rimraf_(p, options, CB), time)
      }

      // already gone
      if (er.code === 'ENOENT') er = null
    }

    cb(er)
  })
}

// Two possible strategies.
// 1. Assume it's a file.  unlink it, then do the dir stuff on EPERM or EISDIR
// 2. Assume it's a directory.  readdir, then do the file stuff on ENOTDIR
//
// Both result in an extra syscall when you guess wrong.  However, there
// are likely far more normal files in the world than directories.  This
// is based on the assumption that a the average number of files per
// directory is >= 1.
//
// If anyone ever complains about this, then I guess the strategy could
// be made configurable somehow.  But until then, YAGNI.
function rimraf_ (p, options, cb) {
  assert(p)
  assert(options)
  assert(typeof cb === 'function')

  // sunos lets the root user unlink directories, which is... weird.
  // so we have to lstat here and make sure it's not a dir.
  options.lstat(p, (er, st) => {
    if (er && er.code === 'ENOENT') {
      return cb(null)
    }

    // Windows can EPERM on stat.  Life is suffering.
    if (er && er.code === 'EPERM' && isWindows) {
      return fixWinEPERM(p, options, er, cb)
    }

    if (st && st.isDirectory()) {
      return rmdir(p, options, er, cb)
    }

    options.unlink(p, er => {
      if (er) {
        if (er.code === 'ENOENT') {
          return cb(null)
        }
        if (er.code === 'EPERM') {
          return (isWindows)
            ? fixWinEPERM(p, options, er, cb)
            : rmdir(p, options, er, cb)
        }
        if (er.code === 'EISDIR') {
          return rmdir(p, options, er, cb)
        }
      }
      return cb(er)
    })
  })
}

function fixWinEPERM (p, options, er, cb) {
  assert(p)
  assert(options)
  assert(typeof cb === 'function')

  options.chmod(p, 0o666, er2 => {
    if (er2) {
      cb(er2.code === 'ENOENT' ? null : er)
    } else {
      options.stat(p, (er3, stats) => {
        if (er3) {
          cb(er3.code === 'ENOENT' ? null : er)
        } else if (stats.isDirectory()) {
          rmdir(p, options, er, cb)
        } else {
          options.unlink(p, cb)
        }
      })
    }
  })
}

function fixWinEPERMSync (p, options, er) {
  let stats

  assert(p)
  assert(options)

  try {
    options.chmodSync(p, 0o666)
  } catch (er2) {
    if (er2.code === 'ENOENT') {
      return
    } else {
      throw er
    }
  }

  try {
    stats = options.statSync(p)
  } catch (er3) {
    if (er3.code === 'ENOENT') {
      return
    } else {
      throw er
    }
  }

  if (stats.isDirectory()) {
    rmdirSync(p, options, er)
  } else {
    options.unlinkSync(p)
  }
}

function rmdir (p, options, originalEr, cb) {
  assert(p)
  assert(options)
  assert(typeof cb === 'function')

  // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)
  // if we guessed wrong, and it's not a directory, then
  // raise the original error.
  options.rmdir(p, er => {
    if (er && (er.code === 'ENOTEMPTY' || er.code === 'EEXIST' || er.code === 'EPERM')) {
      rmkids(p, options, cb)
    } else if (er && er.code === 'ENOTDIR') {
      cb(originalEr)
    } else {
      cb(er)
    }
  })
}

function rmkids (p, options, cb) {
  assert(p)
  assert(options)
  assert(typeof cb === 'function')

  options.readdir(p, (er, files) => {
    if (er) return cb(er)

    let n = files.length
    let errState

    if (n === 0) return options.rmdir(p, cb)

    files.forEach(f => {
      rimraf(path.join(p, f), options, er => {
        if (errState) {
          return
        }
        if (er) return cb(errState = er)
        if (--n === 0) {
          options.rmdir(p, cb)
        }
      })
    })
  })
}

// this looks simpler, and is strictly *faster*, but will
// tie up the JavaScript thread and fail on excessively
// deep directory trees.
function rimrafSync (p, options) {
  let st

  options = options || {}
  defaults(options)

  assert(p, 'rimraf: missing path')
  assert.strictEqual(typeof p, 'string', 'rimraf: path should be a string')
  assert(options, 'rimraf: missing options')
  assert.strictEqual(typeof options, 'object', 'rimraf: options should be object')

  try {
    st = options.lstatSync(p)
  } catch (er) {
    if (er.code === 'ENOENT') {
      return
    }

    // Windows can EPERM on stat.  Life is suffering.
    if (er.code === 'EPERM' && isWindows) {
      fixWinEPERMSync(p, options, er)
    }
  }

  try {
    // sunos lets the root user unlink directories, which is... weird.
    if (st && st.isDirectory()) {
      rmdirSync(p, options, null)
    } else {
      options.unlinkSync(p)
    }
  } catch (er) {
    if (er.code === 'ENOENT') {
      return
    } else if (er.code === 'EPERM') {
      return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er)
    } else if (er.code !== 'EISDIR') {
      throw er
    }
    rmdirSync(p, options, er)
  }
}

function rmdirSync (p, options, originalEr) {
  assert(p)
  assert(options)

  try {
    options.rmdirSync(p)
  } catch (er) {
    if (er.code === 'ENOTDIR') {
      throw originalEr
    } else if (er.code === 'ENOTEMPTY' || er.code === 'EEXIST' || er.code === 'EPERM') {
      rmkidsSync(p, options)
    } else if (er.code !== 'ENOENT') {
      throw er
    }
  }
}

function rmkidsSync (p, options) {
  assert(p)
  assert(options)
  options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options))

  if (isWindows) {
    // We only end up here once we got ENOTEMPTY at least once, and
    // at this point, we are guaranteed to have removed all the kids.
    // So, we know that it won't be ENOENT or ENOTDIR or anything else.
    // try really hard to delete stuff on windows, because it has a
    // PROFOUNDLY annoying habit of not closing handles promptly when
    // files are deleted, resulting in spurious ENOTEMPTY errors.
    const startTime = Date.now()
    do {
      try {
        const ret = options.rmdirSync(p, options)
        return ret
      } catch {}
    } while (Date.now() - startTime < 500) // give up after 500ms
  } else {
    const ret = options.rmdirSync(p, options)
    return ret
  }
}

module.exports = rimraf
rimraf.sync = rimrafSync
'use strict'
const u = require('universalify').fromPromise
const fs = require('../fs')

function pathExists (path) {
  return fs.access(path).then(() => true).catch(() => false)
}

module.exports = {
  pathExists: u(pathExists),
  pathExistsSync: fs.existsSync
}
'use strict'

const u = require('universalify').fromCallback
const fs = require('graceful-fs')
const path = require('path')
const mkdir = require('../mkdirs')
const pathExists = require('../path-exists').pathExists

function outputFile (file, data, encoding, callback) {
  if (typeof encoding === 'function') {
    callback = encoding
    encoding = 'utf8'
  }

  const dir = path.dirname(file)
  pathExists(dir, (err, itDoes) => {
    if (err) return callback(err)
    if (itDoes) return fs.writeFile(file, data, encoding, callback)

    mkdir.mkdirs(dir, err => {
      if (err) return callback(err)

      fs.writeFile(file, data, encoding, callback)
    })
  })
}

function outputFileSync (file, ...args) {
  const dir = path.dirname(file)
  if (fs.existsSync(dir)) {
    return fs.writeFileSync(file, ...args)
  }
  mkdir.mkdirsSync(dir)
  fs.writeFileSync(file, ...args)
}

module.exports = {
  outputFile: u(outputFile),
  outputFileSync
}
'use strict'

const u = require('universalify').fromCallback
module.exports = {
  move: u(require('./move')),
  moveSync: require('./move-sync')
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const copySync = require('../copy').copySync
const removeSync = require('../remove').removeSync
const mkdirpSync = require('../mkdirs').mkdirpSync
const stat = require('../util/stat')

function moveSync (src, dest, opts) {
  opts = opts || {}
  const overwrite = opts.overwrite || opts.clobber || false

  const { srcStat, isChangingCase = false } = stat.checkPathsSync(src, dest, 'move', opts)
  stat.checkParentPathsSync(src, srcStat, dest, 'move')
  if (!isParentRoot(dest)) mkdirpSync(path.dirname(dest))
  return doRename(src, dest, overwrite, isChangingCase)
}

function isParentRoot (dest) {
  const parent = path.dirname(dest)
  const parsedPath = path.parse(parent)
  return parsedPath.root === parent
}

function doRename (src, dest, overwrite, isChangingCase) {
  if (isChangingCase) return rename(src, dest, overwrite)
  if (overwrite) {
    removeSync(dest)
    return rename(src, dest, overwrite)
  }
  if (fs.existsSync(dest)) throw new Error('dest already exists.')
  return rename(src, dest, overwrite)
}

function rename (src, dest, overwrite) {
  try {
    fs.renameSync(src, dest)
  } catch (err) {
    if (err.code !== 'EXDEV') throw err
    return moveAcrossDevice(src, dest, overwrite)
  }
}

function moveAcrossDevice (src, dest, overwrite) {
  const opts = {
    overwrite,
    errorOnExist: true
  }
  copySync(src, dest, opts)
  return removeSync(src)
}

module.exports = moveSync
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const copy = require('../copy').copy
const remove = require('../remove').remove
const mkdirp = require('../mkdirs').mkdirp
const pathExists = require('../path-exists').pathExists
const stat = require('../util/stat')

function move (src, dest, opts, cb) {
  if (typeof opts === 'function') {
    cb = opts
    opts = {}
  }

  opts = opts || {}

  const overwrite = opts.overwrite || opts.clobber || false

  stat.checkPaths(src, dest, 'move', opts, (err, stats) => {
    if (err) return cb(err)
    const { srcStat, isChangingCase = false } = stats
    stat.checkParentPaths(src, srcStat, dest, 'move', err => {
      if (err) return cb(err)
      if (isParentRoot(dest)) return doRename(src, dest, overwrite, isChangingCase, cb)
      mkdirp(path.dirname(dest), err => {
        if (err) return cb(err)
        return doRename(src, dest, overwrite, isChangingCase, cb)
      })
    })
  })
}

function isParentRoot (dest) {
  const parent = path.dirname(dest)
  const parsedPath = path.parse(parent)
  return parsedPath.root === parent
}

function doRename (src, dest, overwrite, isChangingCase, cb) {
  if (isChangingCase) return rename(src, dest, overwrite, cb)
  if (overwrite) {
    return remove(dest, err => {
      if (err) return cb(err)
      return rename(src, dest, overwrite, cb)
    })
  }
  pathExists(dest, (err, destExists) => {
    if (err) return cb(err)
    if (destExists) return cb(new Error('dest already exists.'))
    return rename(src, dest, overwrite, cb)
  })
}

function rename (src, dest, overwrite, cb) {
  fs.rename(src, dest, err => {
    if (!err) return cb()
    if (err.code !== 'EXDEV') return cb(err)
    return moveAcrossDevice(src, dest, overwrite, cb)
  })
}

function moveAcrossDevice (src, dest, overwrite, cb) {
  const opts = {
    overwrite,
    errorOnExist: true
  }
  copy(src, dest, opts, err => {
    if (err) return cb(err)
    return remove(src, cb)
  })
}

module.exports = move
'use strict'
const u = require('universalify').fromPromise
const { makeDir: _makeDir, makeDirSync } = require('./make-dir')
const makeDir = u(_makeDir)

module.exports = {
  mkdirs: makeDir,
  mkdirsSync: makeDirSync,
  // alias
  mkdirp: makeDir,
  mkdirpSync: makeDirSync,
  ensureDir: makeDir,
  ensureDirSync: makeDirSync
}
'use strict'
const fs = require('../fs')
const { checkPath } = require('./utils')

const getMode = options => {
  const defaults = { mode: 0o777 }
  if (typeof options === 'number') return options
  return ({ ...defaults, ...options }).mode
}

module.exports.makeDir = async (dir, options) => {
  checkPath(dir)

  return fs.mkdir(dir, {
    mode: getMode(options),
    recursive: true
  })
}

module.exports.makeDirSync = (dir, options) => {
  checkPath(dir)

  return fs.mkdirSync(dir, {
    mode: getMode(options),
    recursive: true
  })
}
// Adapted from https://github.com/sindresorhus/make-dir
// 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.
'use strict'
const path = require('path')

// https://github.com/nodejs/node/issues/8987
// https://github.com/libuv/libuv/pull/1088
module.exports.checkPath = function checkPath (pth) {
  if (process.platform === 'win32') {
    const pathHasInvalidWinCharacters = /[<>:"|?*]/.test(pth.replace(path.parse(pth).root, ''))

    if (pathHasInvalidWinCharacters) {
      const error = new Error(`Path contains invalid characters: ${pth}`)
      error.code = 'EINVAL'
      throw error
    }
  }
}
'use strict'

const u = require('universalify').fromPromise
const jsonFile = require('./jsonfile')

jsonFile.outputJson = u(require('./output-json'))
jsonFile.outputJsonSync = require('./output-json-sync')
// aliases
jsonFile.outputJSON = jsonFile.outputJson
jsonFile.outputJSONSync = jsonFile.outputJsonSync
jsonFile.writeJSON = jsonFile.writeJson
jsonFile.writeJSONSync = jsonFile.writeJsonSync
jsonFile.readJSON = jsonFile.readJson
jsonFile.readJSONSync = jsonFile.readJsonSync

module.exports = jsonFile
'use strict'

const jsonFile = require('jsonfile')

module.exports = {
  // jsonfile exports
  readJson: jsonFile.readFile,
  readJsonSync: jsonFile.readFileSync,
  writeJson: jsonFile.writeFile,
  writeJsonSync: jsonFile.writeFileSync
}
'use strict'

const { stringify } = require('jsonfile/utils')
const { outputFileSync } = require('../output-file')

function outputJsonSync (file, data, options) {
  const str = stringify(data, options)

  outputFileSync(file, str, options)
}

module.exports = outputJsonSync
'use strict'

const { stringify } = require('jsonfile/utils')
const { outputFile } = require('../output-file')

async function outputJson (file, data, options = {}) {
  const str = stringify(data, options)

  await outputFile(file, str, options)
}

module.exports = outputJson
'use strict'
// This is adapted from https://github.com/normalize/mz
// Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributors
const u = require('universalify').fromCallback
const fs = require('graceful-fs')

const api = [
  'access',
  'appendFile',
  'chmod',
  'chown',
  'close',
  'copyFile',
  'fchmod',
  'fchown',
  'fdatasync',
  'fstat',
  'fsync',
  'ftruncate',
  'futimes',
  'lchmod',
  'lchown',
  'link',
  'lstat',
  'mkdir',
  'mkdtemp',
  'open',
  'opendir',
  'readdir',
  'readFile',
  'readlink',
  'realpath',
  'rename',
  'rm',
  'rmdir',
  'stat',
  'symlink',
  'truncate',
  'unlink',
  'utimes',
  'writeFile'
].filter(key => {
  // Some commands are not available on some systems. Ex:
  // fs.opendir was added in Node.js v12.12.0
  // fs.rm was added in Node.js v14.14.0
  // fs.lchown is not available on at least some Linux
  return typeof fs[key] === 'function'
})

// Export cloned fs:
Object.assign(exports, fs)

// Universalify async methods:
api.forEach(method => {
  exports[method] = u(fs[method])
})

// We differ from mz/fs in that we still ship the old, broken, fs.exists()
// since we are a drop-in replacement for the native module
exports.exists = function (filename, callback) {
  if (typeof callback === 'function') {
    return fs.exists(filename, callback)
  }
  return new Promise(resolve => {
    return fs.exists(filename, resolve)
  })
}

// fs.read(), fs.write(), & fs.writev() need special treatment due to multiple callback args

exports.read = function (fd, buffer, offset, length, position, callback) {
  if (typeof callback === 'function') {
    return fs.read(fd, buffer, offset, length, position, callback)
  }
  return new Promise((resolve, reject) => {
    fs.read(fd, buffer, offset, length, position, (err, bytesRead, buffer) => {
      if (err) return reject(err)
      resolve({ bytesRead, buffer })
    })
  })
}

// Function signature can be
// fs.write(fd, buffer[, offset[, length[, position]]], callback)
// OR
// fs.write(fd, string[, position[, encoding]], callback)
// We need to handle both cases, so we use ...args
exports.write = function (fd, buffer, ...args) {
  if (typeof args[args.length - 1] === 'function') {
    return fs.write(fd, buffer, ...args)
  }

  return new Promise((resolve, reject) => {
    fs.write(fd, buffer, ...args, (err, bytesWritten, buffer) => {
      if (err) return reject(err)
      resolve({ bytesWritten, buffer })
    })
  })
}

// fs.writev only available in Node v12.9.0+
if (typeof fs.writev === 'function') {
  // Function signature is
  // s.writev(fd, buffers[, position], callback)
  // We need to handle the optional arg, so we use ...args
  exports.writev = function (fd, buffers, ...args) {
    if (typeof args[args.length - 1] === 'function') {
      return fs.writev(fd, buffers, ...args)
    }

    return new Promise((resolve, reject) => {
      fs.writev(fd, buffers, ...args, (err, bytesWritten, buffers) => {
        if (err) return reject(err)
        resolve({ bytesWritten, buffers })
      })
    })
  }
}

// fs.realpath.native sometimes not available if fs is monkey-patched
if (typeof fs.realpath.native === 'function') {
  exports.realpath.native = u(fs.realpath.native)
} else {
  process.emitWarning(
    'fs.realpath.native is not a function. Is fs being monkey-patched?',
    'Warning', 'fs-extra-WARN0003'
  )
}
'use strict'

const u = require('universalify').fromCallback
const path = require('path')
const fs = require('graceful-fs')
const mkdir = require('../mkdirs')

function createFile (file, callback) {
  function makeFile () {
    fs.writeFile(file, '', err => {
      if (err) return callback(err)
      callback()
    })
  }

  fs.stat(file, (err, stats) => { // eslint-disable-line handle-callback-err
    if (!err && stats.isFile()) return callback()
    const dir = path.dirname(file)
    fs.stat(dir, (err, stats) => {
      if (err) {
        // if the directory doesn't exist, make it
        if (err.code === 'ENOENT') {
          return mkdir.mkdirs(dir, err => {
            if (err) return callback(err)
            makeFile()
          })
        }
        return callback(err)
      }

      if (stats.isDirectory()) makeFile()
      else {
        // parent is not a directory
        // This is just to cause an internal ENOTDIR error to be thrown
        fs.readdir(dir, err => {
          if (err) return callback(err)
        })
      }
    })
  })
}

function createFileSync (file) {
  let stats
  try {
    stats = fs.statSync(file)
  } catch {}
  if (stats && stats.isFile()) return

  const dir = path.dirname(file)
  try {
    if (!fs.statSync(dir).isDirectory()) {
      // parent is not a directory
      // This is just to cause an internal ENOTDIR error to be thrown
      fs.readdirSync(dir)
    }
  } catch (err) {
    // If the stat call above failed because the directory doesn't exist, create it
    if (err && err.code === 'ENOENT') mkdir.mkdirsSync(dir)
    else throw err
  }

  fs.writeFileSync(file, '')
}

module.exports = {
  createFile: u(createFile),
  createFileSync
}
'use strict'

const { createFile, createFileSync } = require('./file')
const { createLink, createLinkSync } = require('./link')
const { createSymlink, createSymlinkSync } = require('./symlink')

module.exports = {
  // file
  createFile,
  createFileSync,
  ensureFile: createFile,
  ensureFileSync: createFileSync,
  // link
  createLink,
  createLinkSync,
  ensureLink: createLink,
  ensureLinkSync: createLinkSync,
  // symlink
  createSymlink,
  createSymlinkSync,
  ensureSymlink: createSymlink,
  ensureSymlinkSync: createSymlinkSync
}
'use strict'

const u = require('universalify').fromCallback
const path = require('path')
const fs = require('graceful-fs')
const mkdir = require('../mkdirs')
const pathExists = require('../path-exists').pathExists
const { areIdentical } = require('../util/stat')

function createLink (srcpath, dstpath, callback) {
  function makeLink (srcpath, dstpath) {
    fs.link(srcpath, dstpath, err => {
      if (err) return callback(err)
      callback(null)
    })
  }

  fs.lstat(dstpath, (_, dstStat) => {
    fs.lstat(srcpath, (err, srcStat) => {
      if (err) {
        err.message = err.message.replace('lstat', 'ensureLink')
        return callback(err)
      }
      if (dstStat && areIdentical(srcStat, dstStat)) return callback(null)

      const dir = path.dirname(dstpath)
      pathExists(dir, (err, dirExists) => {
        if (err) return callback(err)
        if (dirExists) return makeLink(srcpath, dstpath)
        mkdir.mkdirs(dir, err => {
          if (err) return callback(err)
          makeLink(srcpath, dstpath)
        })
      })
    })
  })
}

function createLinkSync (srcpath, dstpath) {
  let dstStat
  try {
    dstStat = fs.lstatSync(dstpath)
  } catch {}

  try {
    const srcStat = fs.lstatSync(srcpath)
    if (dstStat && areIdentical(srcStat, dstStat)) return
  } catch (err) {
    err.message = err.message.replace('lstat', 'ensureLink')
    throw err
  }

  const dir = path.dirname(dstpath)
  const dirExists = fs.existsSync(dir)
  if (dirExists) return fs.linkSync(srcpath, dstpath)
  mkdir.mkdirsSync(dir)

  return fs.linkSync(srcpath, dstpath)
}

module.exports = {
  createLink: u(createLink),
  createLinkSync
}
'use strict'

const path = require('path')
const fs = require('graceful-fs')
const pathExists = require('../path-exists').pathExists

/**
 * Function that returns two types of paths, one relative to symlink, and one
 * relative to the current working directory. Checks if path is absolute or
 * relative. If the path is relative, this function checks if the path is
 * relative to symlink or relative to current working directory. This is an
 * initiative to find a smarter `srcpath` to supply when building symlinks.
 * This allows you to determine which path to use out of one of three possible
 * types of source paths. The first is an absolute path. This is detected by
 * `path.isAbsolute()`. When an absolute path is provided, it is checked to
 * see if it exists. If it does it's used, if not an error is returned
 * (callback)/ thrown (sync). The other two options for `srcpath` are a
 * relative url. By default Node's `fs.symlink` works by creating a symlink
 * using `dstpath` and expects the `srcpath` to be relative to the newly
 * created symlink. If you provide a `srcpath` that does not exist on the file
 * system it results in a broken symlink. To minimize this, the function
 * checks to see if the 'relative to symlink' source file exists, and if it
 * does it will use it. If it does not, it checks if there's a file that
 * exists that is relative to the current working directory, if does its used.
 * This preserves the expectations of the original fs.symlink spec and adds
 * the ability to pass in `relative to current working direcotry` paths.
 */

function symlinkPaths (srcpath, dstpath, callback) {
  if (path.isAbsolute(srcpath)) {
    return fs.lstat(srcpath, (err) => {
      if (err) {
        err.message = err.message.replace('lstat', 'ensureSymlink')
        return callback(err)
      }
      return callback(null, {
        toCwd: srcpath,
        toDst: srcpath
      })
    })
  } else {
    const dstdir = path.dirname(dstpath)
    const relativeToDst = path.join(dstdir, srcpath)
    return pathExists(relativeToDst, (err, exists) => {
      if (err) return callback(err)
      if (exists) {
        return callback(null, {
          toCwd: relativeToDst,
          toDst: srcpath
        })
      } else {
        return fs.lstat(srcpath, (err) => {
          if (err) {
            err.message = err.message.replace('lstat', 'ensureSymlink')
            return callback(err)
          }
          return callback(null, {
            toCwd: srcpath,
            toDst: path.relative(dstdir, srcpath)
          })
        })
      }
    })
  }
}

function symlinkPathsSync (srcpath, dstpath) {
  let exists
  if (path.isAbsolute(srcpath)) {
    exists = fs.existsSync(srcpath)
    if (!exists) throw new Error('absolute srcpath does not exist')
    return {
      toCwd: srcpath,
      toDst: srcpath
    }
  } else {
    const dstdir = path.dirname(dstpath)
    const relativeToDst = path.join(dstdir, srcpath)
    exists = fs.existsSync(relativeToDst)
    if (exists) {
      return {
        toCwd: relativeToDst,
        toDst: srcpath
      }
    } else {
      exists = fs.existsSync(srcpath)
      if (!exists) throw new Error('relative srcpath does not exist')
      return {
        toCwd: srcpath,
        toDst: path.relative(dstdir, srcpath)
      }
    }
  }
}

module.exports = {
  symlinkPaths,
  symlinkPathsSync
}
'use strict'

const fs = require('graceful-fs')

function symlinkType (srcpath, type, callback) {
  callback = (typeof type === 'function') ? type : callback
  type = (typeof type === 'function') ? false : type
  if (type) return callback(null, type)
  fs.lstat(srcpath, (err, stats) => {
    if (err) return callback(null, 'file')
    type = (stats && stats.isDirectory()) ? 'dir' : 'file'
    callback(null, type)
  })
}

function symlinkTypeSync (srcpath, type) {
  let stats

  if (type) return type
  try {
    stats = fs.lstatSync(srcpath)
  } catch {
    return 'file'
  }
  return (stats && stats.isDirectory()) ? 'dir' : 'file'
}

module.exports = {
  symlinkType,
  symlinkTypeSync
}
'use strict'

const u = require('universalify').fromCallback
const path = require('path')
const fs = require('../fs')
const _mkdirs = require('../mkdirs')
const mkdirs = _mkdirs.mkdirs
const mkdirsSync = _mkdirs.mkdirsSync

const _symlinkPaths = require('./symlink-paths')
const symlinkPaths = _symlinkPaths.symlinkPaths
const symlinkPathsSync = _symlinkPaths.symlinkPathsSync

const _symlinkType = require('./symlink-type')
const symlinkType = _symlinkType.symlinkType
const symlinkTypeSync = _symlinkType.symlinkTypeSync

const pathExists = require('../path-exists').pathExists

const { areIdentical } = require('../util/stat')

function createSymlink (srcpath, dstpath, type, callback) {
  callback = (typeof type === 'function') ? type : callback
  type = (typeof type === 'function') ? false : type

  fs.lstat(dstpath, (err, stats) => {
    if (!err && stats.isSymbolicLink()) {
      Promise.all([
        fs.stat(srcpath),
        fs.stat(dstpath)
      ]).then(([srcStat, dstStat]) => {
        if (areIdentical(srcStat, dstStat)) return callback(null)
        _createSymlink(srcpath, dstpath, type, callback)
      })
    } else _createSymlink(srcpath, dstpath, type, callback)
  })
}

function _createSymlink (srcpath, dstpath, type, callback) {
  symlinkPaths(srcpath, dstpath, (err, relative) => {
    if (err) return callback(err)
    srcpath = relative.toDst
    symlinkType(relative.toCwd, type, (err, type) => {
      if (err) return callback(err)
      const dir = path.dirname(dstpath)
      pathExists(dir, (err, dirExists) => {
        if (err) return callback(err)
        if (dirExists) return fs.symlink(srcpath, dstpath, type, callback)
        mkdirs(dir, err => {
          if (err) return callback(err)
          fs.symlink(srcpath, dstpath, type, callback)
        })
      })
    })
  })
}

function createSymlinkSync (srcpath, dstpath, type) {
  let stats
  try {
    stats = fs.lstatSync(dstpath)
  } catch {}
  if (stats && stats.isSymbolicLink()) {
    const srcStat = fs.statSync(srcpath)
    const dstStat = fs.statSync(dstpath)
    if (areIdentical(srcStat, dstStat)) return
  }

  const relative = symlinkPathsSync(srcpath, dstpath)
  srcpath = relative.toDst
  type = symlinkTypeSync(relative.toCwd, type)
  const dir = path.dirname(dstpath)
  const exists = fs.existsSync(dir)
  if (exists) return fs.symlinkSync(srcpath, dstpath, type)
  mkdirsSync(dir)
  return fs.symlinkSync(srcpath, dstpath, type)
}

module.exports = {
  createSymlink: u(createSymlink),
  createSymlinkSync
}
'use strict'

const u = require('universalify').fromPromise
const fs = require('../fs')
const path = require('path')
const mkdir = require('../mkdirs')
const remove = require('../remove')

const emptyDir = u(async function emptyDir (dir) {
  let items
  try {
    items = await fs.readdir(dir)
  } catch {
    return mkdir.mkdirs(dir)
  }

  return Promise.all(items.map(item => remove.remove(path.join(dir, item))))
})

function emptyDirSync (dir) {
  let items
  try {
    items = fs.readdirSync(dir)
  } catch {
    return mkdir.mkdirsSync(dir)
  }

  items.forEach(item => {
    item = path.join(dir, item)
    remove.removeSync(item)
  })
}

module.exports = {
  emptyDirSync,
  emptydirSync: emptyDirSync,
  emptyDir,
  emptydir: emptyDir
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const mkdirsSync = require('../mkdirs').mkdirsSync
const utimesMillisSync = require('../util/utimes').utimesMillisSync
const stat = require('../util/stat')

function copySync (src, dest, opts) {
  if (typeof opts === 'function') {
    opts = { filter: opts }
  }

  opts = opts || {}
  opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now
  opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber

  // Warn about using preserveTimestamps on 32-bit node
  if (opts.preserveTimestamps && process.arch === 'ia32') {
    process.emitWarning(
      'Using the preserveTimestamps option in 32-bit node is not recommended;\n\n' +
      '\tsee https://github.com/jprichardson/node-fs-extra/issues/269',
      'Warning', 'fs-extra-WARN0002'
    )
  }

  const { srcStat, destStat } = stat.checkPathsSync(src, dest, 'copy', opts)
  stat.checkParentPathsSync(src, srcStat, dest, 'copy')
  return handleFilterAndCopy(destStat, src, dest, opts)
}

function handleFilterAndCopy (destStat, src, dest, opts) {
  if (opts.filter && !opts.filter(src, dest)) return
  const destParent = path.dirname(dest)
  if (!fs.existsSync(destParent)) mkdirsSync(destParent)
  return getStats(destStat, src, dest, opts)
}

function startCopy (destStat, src, dest, opts) {
  if (opts.filter && !opts.filter(src, dest)) return
  return getStats(destStat, src, dest, opts)
}

function getStats (destStat, src, dest, opts) {
  const statSync = opts.dereference ? fs.statSync : fs.lstatSync
  const srcStat = statSync(src)

  if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts)
  else if (srcStat.isFile() ||
           srcStat.isCharacterDevice() ||
           srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts)
  else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts)
  else if (srcStat.isSocket()) throw new Error(`Cannot copy a socket file: ${src}`)
  else if (srcStat.isFIFO()) throw new Error(`Cannot copy a FIFO pipe: ${src}`)
  throw new Error(`Unknown file: ${src}`)
}

function onFile (srcStat, destStat, src, dest, opts) {
  if (!destStat) return copyFile(srcStat, src, dest, opts)
  return mayCopyFile(srcStat, src, dest, opts)
}

function mayCopyFile (srcStat, src, dest, opts) {
  if (opts.overwrite) {
    fs.unlinkSync(dest)
    return copyFile(srcStat, src, dest, opts)
  } else if (opts.errorOnExist) {
    throw new Error(`'${dest}' already exists`)
  }
}

function copyFile (srcStat, src, dest, opts) {
  fs.copyFileSync(src, dest)
  if (opts.preserveTimestamps) handleTimestamps(srcStat.mode, src, dest)
  return setDestMode(dest, srcStat.mode)
}

function handleTimestamps (srcMode, src, dest) {
  // Make sure the file is writable before setting the timestamp
  // otherwise open fails with EPERM when invoked with 'r+'
  // (through utimes call)
  if (fileIsNotWritable(srcMode)) makeFileWritable(dest, srcMode)
  return setDestTimestamps(src, dest)
}

function fileIsNotWritable (srcMode) {
  return (srcMode & 0o200) === 0
}

function makeFileWritable (dest, srcMode) {
  return setDestMode(dest, srcMode | 0o200)
}

function setDestMode (dest, srcMode) {
  return fs.chmodSync(dest, srcMode)
}

function setDestTimestamps (src, dest) {
  // The initial srcStat.atime cannot be trusted
  // because it is modified by the read(2) system call
  // (See https://nodejs.org/api/fs.html#fs_stat_time_values)
  const updatedSrcStat = fs.statSync(src)
  return utimesMillisSync(dest, updatedSrcStat.atime, updatedSrcStat.mtime)
}

function onDir (srcStat, destStat, src, dest, opts) {
  if (!destStat) return mkDirAndCopy(srcStat.mode, src, dest, opts)
  return copyDir(src, dest, opts)
}

function mkDirAndCopy (srcMode, src, dest, opts) {
  fs.mkdirSync(dest)
  copyDir(src, dest, opts)
  return setDestMode(dest, srcMode)
}

function copyDir (src, dest, opts) {
  fs.readdirSync(src).forEach(item => copyDirItem(item, src, dest, opts))
}

function copyDirItem (item, src, dest, opts) {
  const srcItem = path.join(src, item)
  const destItem = path.join(dest, item)
  const { destStat } = stat.checkPathsSync(srcItem, destItem, 'copy', opts)
  return startCopy(destStat, srcItem, destItem, opts)
}

function onLink (destStat, src, dest, opts) {
  let resolvedSrc = fs.readlinkSync(src)
  if (opts.dereference) {
    resolvedSrc = path.resolve(process.cwd(), resolvedSrc)
  }

  if (!destStat) {
    return fs.symlinkSync(resolvedSrc, dest)
  } else {
    let resolvedDest
    try {
      resolvedDest = fs.readlinkSync(dest)
    } catch (err) {
      // dest exists and is a regular file or directory,
      // Windows may throw UNKNOWN error. If dest already exists,
      // fs throws error anyway, so no need to guard against it here.
      if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlinkSync(resolvedSrc, dest)
      throw err
    }
    if (opts.dereference) {
      resolvedDest = path.resolve(process.cwd(), resolvedDest)
    }
    if (stat.isSrcSubdir(resolvedSrc, resolvedDest)) {
      throw new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`)
    }

    // prevent copy if src is a subdir of dest since unlinking
    // dest in this case would result in removing src contents
    // and therefore a broken symlink would be created.
    if (fs.statSync(dest).isDirectory() && stat.isSrcSubdir(resolvedDest, resolvedSrc)) {
      throw new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`)
    }
    return copyLink(resolvedSrc, dest)
  }
}

function copyLink (resolvedSrc, dest) {
  fs.unlinkSync(dest)
  return fs.symlinkSync(resolvedSrc, dest)
}

module.exports = copySync
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const mkdirs = require('../mkdirs').mkdirs
const pathExists = require('../path-exists').pathExists
const utimesMillis = require('../util/utimes').utimesMillis
const stat = require('../util/stat')

function copy (src, dest, opts, cb) {
  if (typeof opts === 'function' && !cb) {
    cb = opts
    opts = {}
  } else if (typeof opts === 'function') {
    opts = { filter: opts }
  }

  cb = cb || function () {}
  opts = opts || {}

  opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now
  opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber

  // Warn about using preserveTimestamps on 32-bit node
  if (opts.preserveTimestamps && process.arch === 'ia32') {
    process.emitWarning(
      'Using the preserveTimestamps option in 32-bit node is not recommended;\n\n' +
      '\tsee https://github.com/jprichardson/node-fs-extra/issues/269',
      'Warning', 'fs-extra-WARN0001'
    )
  }

  stat.checkPaths(src, dest, 'copy', opts, (err, stats) => {
    if (err) return cb(err)
    const { srcStat, destStat } = stats
    stat.checkParentPaths(src, srcStat, dest, 'copy', err => {
      if (err) return cb(err)
      if (opts.filter) return handleFilter(checkParentDir, destStat, src, dest, opts, cb)
      return checkParentDir(destStat, src, dest, opts, cb)
    })
  })
}

function checkParentDir (destStat, src, dest, opts, cb) {
  const destParent = path.dirname(dest)
  pathExists(destParent, (err, dirExists) => {
    if (err) return cb(err)
    if (dirExists) return getStats(destStat, src, dest, opts, cb)
    mkdirs(destParent, err => {
      if (err) return cb(err)
      return getStats(destStat, src, dest, opts, cb)
    })
  })
}

function handleFilter (onInclude, destStat, src, dest, opts, cb) {
  Promise.resolve(opts.filter(src, dest)).then(include => {
    if (include) return onInclude(destStat, src, dest, opts, cb)
    return cb()
  }, error => cb(error))
}

function startCopy (destStat, src, dest, opts, cb) {
  if (opts.filter) return handleFilter(getStats, destStat, src, dest, opts, cb)
  return getStats(destStat, src, dest, opts, cb)
}

function getStats (destStat, src, dest, opts, cb) {
  const stat = opts.dereference ? fs.stat : fs.lstat
  stat(src, (err, srcStat) => {
    if (err) return cb(err)

    if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts, cb)
    else if (srcStat.isFile() ||
             srcStat.isCharacterDevice() ||
             srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts, cb)
    else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts, cb)
    else if (srcStat.isSocket()) return cb(new Error(`Cannot copy a socket file: ${src}`))
    else if (srcStat.isFIFO()) return cb(new Error(`Cannot copy a FIFO pipe: ${src}`))
    return cb(new Error(`Unknown file: ${src}`))
  })
}

function onFile (srcStat, destStat, src, dest, opts, cb) {
  if (!destStat) return copyFile(srcStat, src, dest, opts, cb)
  return mayCopyFile(srcStat, src, dest, opts, cb)
}

function mayCopyFile (srcStat, src, dest, opts, cb) {
  if (opts.overwrite) {
    fs.unlink(dest, err => {
      if (err) return cb(err)
      return copyFile(srcStat, src, dest, opts, cb)
    })
  } else if (opts.errorOnExist) {
    return cb(new Error(`'${dest}' already exists`))
  } else return cb()
}

function copyFile (srcStat, src, dest, opts, cb) {
  fs.copyFile(src, dest, err => {
    if (err) return cb(err)
    if (opts.preserveTimestamps) return handleTimestampsAndMode(srcStat.mode, src, dest, cb)
    return setDestMode(dest, srcStat.mode, cb)
  })
}

function handleTimestampsAndMode (srcMode, src, dest, cb) {
  // Make sure the file is writable before setting the timestamp
  // otherwise open fails with EPERM when invoked with 'r+'
  // (through utimes call)
  if (fileIsNotWritable(srcMode)) {
    return makeFileWritable(dest, srcMode, err => {
      if (err) return cb(err)
      return setDestTimestampsAndMode(srcMode, src, dest, cb)
    })
  }
  return setDestTimestampsAndMode(srcMode, src, dest, cb)
}

function fileIsNotWritable (srcMode) {
  return (srcMode & 0o200) === 0
}

function makeFileWritable (dest, srcMode, cb) {
  return setDestMode(dest, srcMode | 0o200, cb)
}

function setDestTimestampsAndMode (srcMode, src, dest, cb) {
  setDestTimestamps(src, dest, err => {
    if (err) return cb(err)
    return setDestMode(dest, srcMode, cb)
  })
}

function setDestMode (dest, srcMode, cb) {
  return fs.chmod(dest, srcMode, cb)
}

function setDestTimestamps (src, dest, cb) {
  // The initial srcStat.atime cannot be trusted
  // because it is modified by the read(2) system call
  // (See https://nodejs.org/api/fs.html#fs_stat_time_values)
  fs.stat(src, (err, updatedSrcStat) => {
    if (err) return cb(err)
    return utimesMillis(dest, updatedSrcStat.atime, updatedSrcStat.mtime, cb)
  })
}

function onDir (srcStat, destStat, src, dest, opts, cb) {
  if (!destStat) return mkDirAndCopy(srcStat.mode, src, dest, opts, cb)
  return copyDir(src, dest, opts, cb)
}

function mkDirAndCopy (srcMode, src, dest, opts, cb) {
  fs.mkdir(dest, err => {
    if (err) return cb(err)
    copyDir(src, dest, opts, err => {
      if (err) return cb(err)
      return setDestMode(dest, srcMode, cb)
    })
  })
}

function copyDir (src, dest, opts, cb) {
  fs.readdir(src, (err, items) => {
    if (err) return cb(err)
    return copyDirItems(items, src, dest, opts, cb)
  })
}

function copyDirItems (items, src, dest, opts, cb) {
  const item = items.pop()
  if (!item) return cb()
  return copyDirItem(items, item, src, dest, opts, cb)
}

function copyDirItem (items, item, src, dest, opts, cb) {
  const srcItem = path.join(src, item)
  const destItem = path.join(dest, item)
  stat.checkPaths(srcItem, destItem, 'copy', opts, (err, stats) => {
    if (err) return cb(err)
    const { destStat } = stats
    startCopy(destStat, srcItem, destItem, opts, err => {
      if (err) return cb(err)
      return copyDirItems(items, src, dest, opts, cb)
    })
  })
}

function onLink (destStat, src, dest, opts, cb) {
  fs.readlink(src, (err, resolvedSrc) => {
    if (err) return cb(err)
    if (opts.dereference) {
      resolvedSrc = path.resolve(process.cwd(), resolvedSrc)
    }

    if (!destStat) {
      return fs.symlink(resolvedSrc, dest, cb)
    } else {
      fs.readlink(dest, (err, resolvedDest) => {
        if (err) {
          // dest exists and is a regular file or directory,
          // Windows may throw UNKNOWN error. If dest already exists,
          // fs throws error anyway, so no need to guard against it here.
          if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlink(resolvedSrc, dest, cb)
          return cb(err)
        }
        if (opts.dereference) {
          resolvedDest = path.resolve(process.cwd(), resolvedDest)
        }
        if (stat.isSrcSubdir(resolvedSrc, resolvedDest)) {
          return cb(new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`))
        }

        // do not copy if src is a subdir of dest since unlinking
        // dest in this case would result in removing src contents
        // and therefore a broken symlink would be created.
        if (destStat.isDirectory() && stat.isSrcSubdir(resolvedDest, resolvedSrc)) {
          return cb(new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`))
        }
        return copyLink(resolvedSrc, dest, cb)
      })
    }
  })
}

function copyLink (resolvedSrc, dest, cb) {
  fs.unlink(dest, err => {
    if (err) return cb(err)
    return fs.symlink(resolvedSrc, dest, cb)
  })
}

module.exports = copy
'use strict'

const u = require('universalify').fromCallback
module.exports = {
  copy: u(require('./copy')),
  copySync: require('./copy-sync')
}
The MIT License (MIT)

Copyright (c) 2013-2021 Jakub Szwacz

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";

const jetpack = require("./lib/jetpack");

module.exports = jetpack();
{
  "name": "fs-jetpack",
  "description": "Better file system API",
  "version": "4.3.1",
  "author": "Jakub Szwacz <jakub@szwacz.com>",
  "dependencies": {
    "minimatch": "^3.0.2",
    "rimraf": "^2.6.3"
  },
  "devDependencies": {
    "@types/chai": "^4.1.4",
    "@types/fs-extra": "^5.0.4",
    "@types/mocha": "^5.2.4",
    "@types/node": "^10.5.2",
    "chai": "^4.1.2",
    "codecov": "^3.0.2",
    "fs-extra": "^5.0.0",
    "istanbul": "^0.4.5",
    "lint-staged": "^7.2.0",
    "mocha": "^7.1.2",
    "pre-commit": "^1.1.2",
    "prettier": "1.13.5",
    "pretty-bytes": "^5.1.0",
    "release-assist": "^2.0.0",
    "ts-node": "^7.0.0",
    "typescript": "^2.9.2"
  },
  "main": "main.js",
  "files": [
    "lib",
    "index.d.ts",
    "types.d.ts"
  ],
  "types": "index.d.ts",
  "homepage": "https://github.com/szwacz/fs-jetpack",
  "repository": {
    "type": "git",
    "url": "https://github.com/szwacz/fs-jetpack.git"
  },
  "license": "MIT",
  "lint-staged": {
    "*.{js,ts}": [
      "prettier --write",
      "git add"
    ]
  },
  "pre-commit": [
    "lint-staged",
    "test"
  ]
}"use strict";

const fs = require("./utils/fs");
const write = require("./write");
const validate = require("./utils/validate");

const validateInput = (methodName, path, data, options) => {
  const methodSignature = `${methodName}(path, data, [options])`;
  validate.argument(methodSignature, "path", path, ["string"]);
  validate.argument(methodSignature, "data", data, ["string", "buffer"]);
  validate.options(methodSignature, "options", options, {
    mode: ["string", "number"]
  });
};

// ---------------------------------------------------------
// SYNC
// ---------------------------------------------------------

const appendSync = (path, data, options) => {
  try {
    fs.appendFileSync(path, data, options);
  } catch (err) {
    if (err.code === "ENOENT") {
      // Parent directory doesn't exist, so just pass the task to `write`,
      // which will create the folder and file.
      write.sync(path, data, options);
    } else {
      throw err;
    }
  }
};

// ---------------------------------------------------------
// ASYNC
// ---------------------------------------------------------

const appendAsync = (path, data, options) => {
  return new Promise((resolve, reject) => {
    fs.appendFile(path, data, options)
      .then(resolve)
      .catch(err => {
        if (err.code === "ENOENT") {
          // Parent directory doesn't exist, so just pass the task to `write`,
          // which will create the folder and file.
          write.async(path, data, options).then(resolve, reject);
        } else {
          reject(err);
        }
      });
  });
};

// ---------------------------------------------------------
// API
// ---------------------------------------------------------

exports.validateInput = validateInput;
exports.sync = appendSync;
exports.async = appendAsync;
"use strict";

const pathUtil = require("path");
const fs = require("./utils/fs");
const dir = require("./dir");
const exists = require("./exists");
const inspect = require("./inspect");
const write = require("./write");
const matcher = require("./utils/matcher");
const fileMode = require("./utils/mode");
const treeWalker = require("./utils/tree_walker");
const validate = require("./utils/validate");

const validateInput = (methodName, from, to, options) => {
  const methodSignature = `${methodName}(from, to, [options])`;
  validate.argument(methodSignature, "from", from, ["string"]);
  validate.argument(methodSignature, "to", to, ["string"]);
  validate.options(methodSignature, "options", options, {
    overwrite: ["boolean", "function"],
    matching: ["string", "array of string"],
    ignoreCase: ["boolean"]
  });
};

const parseOptions = (options, from) => {
  const opts = options || {};
  const parsedOptions = {};

  if (opts.ignoreCase === undefined) {
    opts.ignoreCase = false;
  }

  parsedOptions.overwrite = opts.overwrite;

  if (opts.matching) {
    parsedOptions.allowedToCopy = matcher.create(
      from,
      opts.matching,
      opts.ignoreCase
    );
  } else {
    parsedOptions.allowedToCopy = () => {
      // Default behaviour - copy everything.
      return true;
    };
  }

  return parsedOptions;
};

const generateNoSourceError = path => {
  const err = new Error(`Path to copy doesn't exist ${path}`);
  err.code = "ENOENT";
  return err;
};

const generateDestinationExistsError = path => {
  const err = new Error(`Destination path already exists ${path}`);
  err.code = "EEXIST";
  return err;
};

const inspectOptions = {
  mode: true,
  symlinks: "report",
  times: true,
  absolutePath: true
};

const shouldThrowDestinationExistsError = context => {
  return (
    typeof context.opts.overwrite !== "function" &&
    context.opts.overwrite !== true
  );
};

// ---------------------------------------------------------
// Sync
// ---------------------------------------------------------

const checksBeforeCopyingSync = (from, to, opts) => {
  if (!exists.sync(from)) {
    throw generateNoSourceError(from);
  }

  if (exists.sync(to) && !opts.overwrite) {
    throw generateDestinationExistsError(to);
  }
};

const canOverwriteItSync = context => {
  if (typeof context.opts.overwrite === "function") {
    const destInspectData = inspect.sync(context.destPath, inspectOptions);
    return context.opts.overwrite(context.srcInspectData, destInspectData);
  }
  return context.opts.overwrite === true;
};

const copyFileSync = (srcPath, destPath, mode, context) => {
  const data = fs.readFileSync(srcPath);
  try {
    fs.writeFileSync(destPath, data, { mode, flag: "wx" });
  } catch (err) {
    if (err.code === "ENOENT") {
      write.sync(destPath, data, { mode });
    } else if (err.code === "EEXIST") {
      if (canOverwriteItSync(context)) {
        fs.writeFileSync(destPath, data, { mode });
      } else if (shouldThrowDestinationExistsError(context)) {
        throw generateDestinationExistsError(context.destPath);
      }
    } else {
      throw err;
    }
  }
};

const copySymlinkSync = (from, to) => {
  const symlinkPointsAt = fs.readlinkSync(from);
  try {
    fs.symlinkSync(symlinkPointsAt, to);
  } catch (err) {
    // There is already file/symlink with this name on destination location.
    // Must erase it manually, otherwise system won't allow us to place symlink there.
    if (err.code === "EEXIST") {
      fs.unlinkSync(to);
      // Retry...
      fs.symlinkSync(symlinkPointsAt, to);
    } else {
      throw err;
    }
  }
};

const copyItemSync = (srcPath, srcInspectData, destPath, opts) => {
  const context = { srcPath, destPath, srcInspectData, opts };
  const mode = fileMode.normalizeFileMode(srcInspectData.mode);
  if (srcInspectData.type === "dir") {
    dir.createSync(destPath, { mode });
  } else if (srcInspectData.type === "file") {
    copyFileSync(srcPath, destPath, mode, context);
  } else if (srcInspectData.type === "symlink") {
    copySymlinkSync(srcPath, destPath);
  }
};

const copySync = (from, to, options) => {
  const opts = parseOptions(options, from);

  checksBeforeCopyingSync(from, to, opts);

  treeWalker.sync(from, { inspectOptions }, (srcPath, srcInspectData) => {
    const rel = pathUtil.relative(from, srcPath);
    const destPath = pathUtil.resolve(to, rel);
    if (opts.allowedToCopy(srcPath, destPath, srcInspectData)) {
      copyItemSync(srcPath, srcInspectData, destPath, opts);
    }
  });
};

// ---------------------------------------------------------
// Async
// ---------------------------------------------------------

const checksBeforeCopyingAsync = (from, to, opts) => {
  return exists
    .async(from)
    .then(srcPathExists => {
      if (!srcPathExists) {
        throw generateNoSourceError(from);
      } else {
        return exists.async(to);
      }
    })
    .then(destPathExists => {
      if (destPathExists && !opts.overwrite) {
        throw generateDestinationExistsError(to);
      }
    });
};

const canOverwriteItAsync = context => {
  return new Promise((resolve, reject) => {
    if (typeof context.opts.overwrite === "function") {
      inspect
        .async(context.destPath, inspectOptions)
        .then(destInspectData => {
          resolve(
            context.opts.overwrite(context.srcInspectData, destInspectData)
          );
        })
        .catch(reject);
    } else {
      resolve(context.opts.overwrite === true);
    }
  });
};

const copyFileAsync = (srcPath, destPath, mode, context, runOptions) => {
  return new Promise((resolve, reject) => {
    const runOpts = runOptions || {};

    let flags = "wx";
    if (runOpts.overwrite) {
      flags = "w";
    }

    const readStream = fs.createReadStream(srcPath);
    const writeStream = fs.createWriteStream(destPath, { mode, flags });

    readStream.on("error", reject);

    writeStream.on("error", err => {
      // Force read stream to close, since write stream errored
      // read stream serves us no purpose.
      readStream.resume();

      if (err.code === "ENOENT") {
        // Some parent directory doesn't exits. Create it and retry.
        dir
          .createAsync(pathUtil.dirname(destPath))
          .then(() => {
            copyFileAsync(srcPath, destPath, mode, context).then(
              resolve,
              reject
            );
          })
          .catch(reject);
      } else if (err.code === "EEXIST") {
        canOverwriteItAsync(context)
          .then(canOverwite => {
            if (canOverwite) {
              copyFileAsync(srcPath, destPath, mode, context, {
                overwrite: true
              }).then(resolve, reject);
            } else if (shouldThrowDestinationExistsError(context)) {
              reject(generateDestinationExistsError(destPath));
            } else {
              resolve();
            }
          })
          .catch(reject);
      } else {
        reject(err);
      }
    });

    writeStream.on("finish", resolve);

    readStream.pipe(writeStream);
  });
};

const copySymlinkAsync = (from, to) => {
  return fs.readlink(from).then(symlinkPointsAt => {
    return new Promise((resolve, reject) => {
      fs.symlink(symlinkPointsAt, to)
        .then(resolve)
        .catch(err => {
          if (err.code === "EEXIST") {
            // There is already file/symlink with this name on destination location.
            // Must erase it manually, otherwise system won't allow us to place symlink there.
            fs.unlink(to)
              .then(() => {
                // Retry...
                return fs.symlink(symlinkPointsAt, to);
              })
              .then(resolve, reject);
          } else {
            reject(err);
          }
        });
    });
  });
};

const copyItemAsync = (srcPath, srcInspectData, destPath, opts) => {
  const context = { srcPath, destPath, srcInspectData, opts };
  const mode = fileMode.normalizeFileMode(srcInspectData.mode);
  if (srcInspectData.type === "dir") {
    return dir.createAsync(destPath, { mode });
  } else if (srcInspectData.type === "file") {
    return copyFileAsync(srcPath, destPath, mode, context);
  } else if (srcInspectData.type === "symlink") {
    return copySymlinkAsync(srcPath, destPath);
  }
  // Ha! This is none of supported file system entities. What now?
  // Just continuing without actually copying sounds sane.
  return Promise.resolve();
};

const copyAsync = (from, to, options) => {
  return new Promise((resolve, reject) => {
    const opts = parseOptions(options, from);

    checksBeforeCopyingAsync(from, to, opts)
      .then(() => {
        let allFilesDelivered = false;
        let filesInProgress = 0;

        treeWalker.async(
          from,
          { inspectOptions },
          (srcPath, item) => {
            if (item) {
              const rel = pathUtil.relative(from, srcPath);
              const destPath = pathUtil.resolve(to, rel);
              if (opts.allowedToCopy(srcPath, item, destPath)) {
                filesInProgress += 1;
                copyItemAsync(srcPath, item, destPath, opts)
                  .then(() => {
                    filesInProgress -= 1;
                    if (allFilesDelivered && filesInProgress === 0) {
                      resolve();
                    }
                  })
                  .catch(reject);
              }
            }
          },
          err => {
            if (err) {
              reject(err);
            } else {
              allFilesDelivered = true;
              if (allFilesDelivered && filesInProgress === 0) {
                resolve();
              }
            }
          }
        );
      })
      .catch(reject);
  });
};

// ---------------------------------------------------------
// API
// ---------------------------------------------------------

exports.validateInput = validateInput;
exports.sync = copySync;
exports.async = copyAsync;
"use strict";

const pathUtil = require("path");
const fs = require("./utils/fs");
const modeUtil = require("./utils/mode");
const validate = require("./utils/validate");
const remove = require("./remove");

const validateInput = (methodName, path, criteria) => {
  const methodSignature = `${methodName}(path, [criteria])`;
  validate.argument(methodSignature, "path", path, ["string"]);
  validate.options(methodSignature, "criteria", criteria, {
    empty: ["boolean"],
    mode: ["string", "number"]
  });
};

const getCriteriaDefaults = passedCriteria => {
  const criteria = passedCriteria || {};
  if (typeof criteria.empty !== "boolean") {
    criteria.empty = false;
  }
  if (criteria.mode !== undefined) {
    criteria.mode = modeUtil.normalizeFileMode(criteria.mode);
  }
  return criteria;
};

const generatePathOccupiedByNotDirectoryError = path => {
  return new Error(
    `Path ${path} exists but is not a directory. Halting jetpack.dir() call for safety reasons.`
  );
};

// ---------------------------------------------------------
// Sync
// ---------------------------------------------------------

const checkWhatAlreadyOccupiesPathSync = path => {
  let stat;

  try {
    stat = fs.statSync(path);
  } catch (err) {
    // Detection if path already exists
    if (err.code !== "ENOENT") {
      throw err;
    }
  }

  if (stat && !stat.isDirectory()) {
    throw generatePathOccupiedByNotDirectoryError(path);
  }

  return stat;
};

const createBrandNewDirectorySync = (path, opts) => {
  const options = opts || {};

  try {
    fs.mkdirSync(path, options.mode);
  } catch (err) {
    if (err.code === "ENOENT") {
      // Parent directory doesn't exist. Need to create it first.
      createBrandNewDirectorySync(pathUtil.dirname(path), options);
      // Now retry creating this directory.
      fs.mkdirSync(path, options.mode);
    } else if (err.code === "EEXIST") {
      // The path already exists. We're fine.
    } else {
      throw err;
    }
  }
};

const checkExistingDirectoryFulfillsCriteriaSync = (path, stat, criteria) => {
  const checkMode = () => {
    const mode = modeUtil.normalizeFileMode(stat.mode);
    if (criteria.mode !== undefined && criteria.mode !== mode) {
      fs.chmodSync(path, criteria.mode);
    }
  };

  const checkEmptiness = () => {
    if (criteria.empty) {
      // Delete everything inside this directory
      const list = fs.readdirSync(path);
      list.forEach(filename => {
        remove.sync(pathUtil.resolve(path, filename));
      });
    }
  };

  checkMode();
  checkEmptiness();
};

const dirSync = (path, passedCriteria) => {
  const criteria = getCriteriaDefaults(passedCriteria);
  const stat = checkWhatAlreadyOccupiesPathSync(path);
  if (stat) {
    checkExistingDirectoryFulfillsCriteriaSync(path, stat, criteria);
  } else {
    createBrandNewDirectorySync(path, criteria);
  }
};

// ---------------------------------------------------------
// Async
// ---------------------------------------------------------

const checkWhatAlreadyOccupiesPathAsync = path => {
  return new Promise((resolve, reject) => {
    fs.stat(path)
      .then(stat => {
        if (stat.isDirectory()) {
          resolve(stat);
        } else {
          reject(generatePathOccupiedByNotDirectoryError(path));
        }
      })
      .catch(err => {
        if (err.code === "ENOENT") {
          // Path doesn't exist
          resolve(undefined);
        } else {
          // This is other error that nonexistent path, so end here.
          reject(err);
        }
      });
  });
};

// Delete all files and directores inside given directory
const emptyAsync = path => {
  return new Promise((resolve, reject) => {
    fs.readdir(path)
      .then(list => {
        const doOne = index => {
          if (index === list.length) {
            resolve();
          } else {
            const subPath = pathUtil.resolve(path, list[index]);
            remove.async(subPath).then(() => {
              doOne(index + 1);
            });
          }
        };

        doOne(0);
      })
      .catch(reject);
  });
};

const checkExistingDirectoryFulfillsCriteriaAsync = (path, stat, criteria) => {
  return new Promise((resolve, reject) => {
    const checkMode = () => {
      const mode = modeUtil.normalizeFileMode(stat.mode);
      if (criteria.mode !== undefined && criteria.mode !== mode) {
        return fs.chmod(path, criteria.mode);
      }
      return Promise.resolve();
    };

    const checkEmptiness = () => {
      if (criteria.empty) {
        return emptyAsync(path);
      }
      return Promise.resolve();
    };

    checkMode()
      .then(checkEmptiness)
      .then(resolve, reject);
  });
};

const createBrandNewDirectoryAsync = (path, opts) => {
  const options = opts || {};

  return new Promise((resolve, reject) => {
    fs.mkdir(path, options.mode)
      .then(resolve)
      .catch(err => {
        if (err.code === "ENOENT") {
          // Parent directory doesn't exist. Need to create it first.
          createBrandNewDirectoryAsync(pathUtil.dirname(path), options)
            .then(() => {
              // Now retry creating this directory.
              return fs.mkdir(path, options.mode);
            })
            .then(resolve)
            .catch(err2 => {
              if (err2.code === "EEXIST") {
                // Hmm, something other have already created the directory?
                // No problem for us.
                resolve();
              } else {
                reject(err2);
              }
            });
        } else if (err.code === "EEXIST") {
          // The path already exists. We're fine.
          resolve();
        } else {
          reject(err);
        }
      });
  });
};

const dirAsync = (path, passedCriteria) => {
  return new Promise((resolve, reject) => {
    const criteria = getCriteriaDefaults(passedCriteria);

    checkWhatAlreadyOccupiesPathAsync(path)
      .then(stat => {
        if (stat !== undefined) {
          return checkExistingDirectoryFulfillsCriteriaAsync(
            path,
            stat,
            criteria
          );
        }
        return createBrandNewDirectoryAsync(path, criteria);
      })
      .then(resolve, reject);
  });
};

// ---------------------------------------------------------
// API
// ---------------------------------------------------------

exports.validateInput = validateInput;
exports.sync = dirSync;
exports.createSync = createBrandNewDirectorySync;
exports.async = dirAsync;
exports.createAsync = createBrandNewDirectoryAsync;
"use strict";

const fs = require("./utils/fs");
const validate = require("./utils/validate");

const validateInput = (methodName, path) => {
  const methodSignature = `${methodName}(path)`;
  validate.argument(methodSignature, "path", path, ["string"]);
};

// ---------------------------------------------------------
// Sync
// ---------------------------------------------------------

const existsSync = path => {
  try {
    const stat = fs.statSync(path);
    if (stat.isDirectory()) {
      return "dir";
    } else if (stat.isFile()) {
      return "file";
    }
    return "other";
  } catch (err) {
    if (err.code !== "ENOENT") {
      throw err;
    }
  }

  return false;
};

// ---------------------------------------------------------
// Async
// ---------------------------------------------------------

const existsAsync = path => {
  return new Promise((resolve, reject) => {
    fs.stat(path)
      .then(stat => {
        if (stat.isDirectory()) {
          resolve("dir");
        } else if (stat.isFile()) {
          resolve("file");
        } else {
          resolve("other");
        }
      })
      .catch(err => {
        if (err.code === "ENOENT") {
          resolve(false);
        } else {
          reject(err);
        }
      });
  });
};

// ---------------------------------------------------------
// API
// ---------------------------------------------------------

exports.validateInput = validateInput;
exports.sync = existsSync;
exports.async = existsAsync;
"use strict";

const fs = require("./utils/fs");
const modeUtil = require("./utils/mode");
const validate = require("./utils/validate");
const write = require("./write");

const validateInput = (methodName, path, criteria) => {
  const methodSignature = `${methodName}(path, [criteria])`;
  validate.argument(methodSignature, "path", path, ["string"]);
  validate.options(methodSignature, "criteria", criteria, {
    content: ["string", "buffer", "object", "array"],
    jsonIndent: ["number"],
    mode: ["string", "number"]
  });
};

const getCriteriaDefaults = passedCriteria => {
  const criteria = passedCriteria || {};
  if (criteria.mode !== undefined) {
    criteria.mode = modeUtil.normalizeFileMode(criteria.mode);
  }
  return criteria;
};

const generatePathOccupiedByNotFileError = path => {
  return new Error(
    `Path ${path} exists but is not a file. Halting jetpack.file() call for safety reasons.`
  );
};

// ---------------------------------------------------------
// Sync
// ---------------------------------------------------------

const checkWhatAlreadyOccupiesPathSync = path => {
  let stat;

  try {
    stat = fs.statSync(path);
  } catch (err) {
    // Detection if path exists
    if (err.code !== "ENOENT") {
      throw err;
    }
  }

  if (stat && !stat.isFile()) {
    throw generatePathOccupiedByNotFileError(path);
  }

  return stat;
};

const checkExistingFileFulfillsCriteriaSync = (path, stat, criteria) => {
  const mode = modeUtil.normalizeFileMode(stat.mode);

  const checkContent = () => {
    if (criteria.content !== undefined) {
      write.sync(path, criteria.content, {
        mode,
        jsonIndent: criteria.jsonIndent
      });
      return true;
    }
    return false;
  };

  const checkMode = () => {
    if (criteria.mode !== undefined && criteria.mode !== mode) {
      fs.chmodSync(path, criteria.mode);
    }
  };

  const contentReplaced = checkContent();
  if (!contentReplaced) {
    checkMode();
  }
};

const createBrandNewFileSync = (path, criteria) => {
  let content = "";
  if (criteria.content !== undefined) {
    content = criteria.content;
  }
  write.sync(path, content, {
    mode: criteria.mode,
    jsonIndent: criteria.jsonIndent
  });
};

const fileSync = (path, passedCriteria) => {
  const criteria = getCriteriaDefaults(passedCriteria);
  const stat = checkWhatAlreadyOccupiesPathSync(path);
  if (stat !== undefined) {
    checkExistingFileFulfillsCriteriaSync(path, stat, criteria);
  } else {
    createBrandNewFileSync(path, criteria);
  }
};

// ---------------------------------------------------------
// Async
// ---------------------------------------------------------

const checkWhatAlreadyOccupiesPathAsync = path => {
  return new Promise((resolve, reject) => {
    fs.stat(path)
      .then(stat => {
        if (stat.isFile()) {
          resolve(stat);
        } else {
          reject(generatePathOccupiedByNotFileError(path));
        }
      })
      .catch(err => {
        if (err.code === "ENOENT") {
          // Path doesn't exist.
          resolve(undefined);
        } else {
          // This is other error. Must end here.
          reject(err);
        }
      });
  });
};

const checkExistingFileFulfillsCriteriaAsync = (path, stat, criteria) => {
  const mode = modeUtil.normalizeFileMode(stat.mode);

  const checkContent = () => {
    return new Promise((resolve, reject) => {
      if (criteria.content !== undefined) {
        write
          .async(path, criteria.content, {
            mode,
            jsonIndent: criteria.jsonIndent
          })
          .then(() => {
            resolve(true);
          })
          .catch(reject);
      } else {
        resolve(false);
      }
    });
  };

  const checkMode = () => {
    if (criteria.mode !== undefined && criteria.mode !== mode) {
      return fs.chmod(path, criteria.mode);
    }
    return undefined;
  };

  return checkContent().then(contentReplaced => {
    if (!contentReplaced) {
      return checkMode();
    }
    return undefined;
  });
};

const createBrandNewFileAsync = (path, criteria) => {
  let content = "";
  if (criteria.content !== undefined) {
    content = criteria.content;
  }

  return write.async(path, content, {
    mode: criteria.mode,
    jsonIndent: criteria.jsonIndent
  });
};

const fileAsync = (path, passedCriteria) => {
  return new Promise((resolve, reject) => {
    const criteria = getCriteriaDefaults(passedCriteria);

    checkWhatAlreadyOccupiesPathAsync(path)
      .then(stat => {
        if (stat !== undefined) {
          return checkExistingFileFulfillsCriteriaAsync(path, stat, criteria);
        }
        return createBrandNewFileAsync(path, criteria);
      })
      .then(resolve, reject);
  });
};

// ---------------------------------------------------------
// API
// ---------------------------------------------------------

exports.validateInput = validateInput;
exports.sync = fileSync;
exports.async = fileAsync;
"use strict";

const pathUtil = require("path");
const treeWalker = require("./utils/tree_walker");
const inspect = require("./inspect");
const matcher = require("./utils/matcher");
const validate = require("./utils/validate");

const validateInput = (methodName, path, options) => {
  const methodSignature = `${methodName}([path], options)`;
  validate.argument(methodSignature, "path", path, ["string"]);
  validate.options(methodSignature, "options", options, {
    matching: ["string", "array of string"],
    filter: ["function"],
    files: ["boolean"],
    directories: ["boolean"],
    recursive: ["boolean"],
    ignoreCase: ["boolean"]
  });
};

const normalizeOptions = options => {
  const opts = options || {};
  // defaults:
  if (opts.matching === undefined) {
    opts.matching = "*";
  }
  if (opts.files === undefined) {
    opts.files = true;
  }
  if (opts.ignoreCase === undefined) {
    opts.ignoreCase = false;
  }
  if (opts.directories === undefined) {
    opts.directories = false;
  }
  if (opts.recursive === undefined) {
    opts.recursive = true;
  }
  return opts;
};

const processFoundPaths = (foundPaths, cwd) => {
  return foundPaths.map(path => {
    return pathUtil.relative(cwd, path);
  });
};

const generatePathDoesntExistError = path => {
  const err = new Error(`Path you want to find stuff in doesn't exist ${path}`);
  err.code = "ENOENT";
  return err;
};

const generatePathNotDirectoryError = path => {
  const err = new Error(
    `Path you want to find stuff in must be a directory ${path}`
  );
  err.code = "ENOTDIR";
  return err;
};

// ---------------------------------------------------------
// Sync
// ---------------------------------------------------------

const findSync = (path, options) => {
  const foundAbsolutePaths = [];
  const matchesAnyOfGlobs = matcher.create(
    path,
    options.matching,
    options.ignoreCase
  );

  let maxLevelsDeep = Infinity;
  if (options.recursive === false) {
    maxLevelsDeep = 1;
  }

  treeWalker.sync(
    path,
    { maxLevelsDeep, symlinks: "follow", inspectOptions: { times: true } },
    (itemPath, item) => {
      if (item && itemPath !== path && matchesAnyOfGlobs(itemPath)) {
        const weHaveMatch =
          (item.type === "file" && options.files === true) ||
          (item.type === "dir" && options.directories === true);

        if (weHaveMatch) {
          if (options.filter) {
            const passedThroughFilter = options.filter(item);
            if (passedThroughFilter) {
              foundAbsolutePaths.push(itemPath);
            }
          } else {
            foundAbsolutePaths.push(itemPath);
          }
        }
      }
    }
  );

  foundAbsolutePaths.sort();

  return processFoundPaths(foundAbsolutePaths, options.cwd);
};

const findSyncInit = (path, options) => {
  const entryPointInspect = inspect.sync(path, { symlinks: "follow" });
  if (entryPointInspect === undefined) {
    throw generatePathDoesntExistError(path);
  } else if (entryPointInspect.type !== "dir") {
    throw generatePathNotDirectoryError(path);
  }

  return findSync(path, normalizeOptions(options));
};

// ---------------------------------------------------------
// Async
// ---------------------------------------------------------

const findAsync = (path, options) => {
  return new Promise((resolve, reject) => {
    const foundAbsolutePaths = [];
    const matchesAnyOfGlobs = matcher.create(
      path,
      options.matching,
      options.ignoreCase
    );

    let maxLevelsDeep = Infinity;
    if (options.recursive === false) {
      maxLevelsDeep = 1;
    }

    let waitingForFiltersToFinish = 0;
    let treeWalkerDone = false;

    const maybeDone = () => {
      if (treeWalkerDone && waitingForFiltersToFinish === 0) {
        foundAbsolutePaths.sort();
        resolve(processFoundPaths(foundAbsolutePaths, options.cwd));
      }
    };

    treeWalker.async(
      path,
      { maxLevelsDeep, symlinks: "follow", inspectOptions: { times: true } },
      (itemPath, item) => {
        if (item && itemPath !== path && matchesAnyOfGlobs(itemPath)) {
          const weHaveMatch =
            (item.type === "file" && options.files === true) ||
            (item.type === "dir" && options.directories === true);

          if (weHaveMatch) {
            if (options.filter) {
              const passedThroughFilter = options.filter(item);
              const isPromise = typeof passedThroughFilter.then === "function";
              if (isPromise) {
                waitingForFiltersToFinish += 1;
                passedThroughFilter
                  .then(passedThroughFilterResult => {
                    if (passedThroughFilterResult) {
                      foundAbsolutePaths.push(itemPath);
                    }
                    waitingForFiltersToFinish -= 1;
                    maybeDone();
                  })
                  .catch(err => {
                    reject(err);
                  });
              } else if (passedThroughFilter) {
                foundAbsolutePaths.push(itemPath);
              }
            } else {
              foundAbsolutePaths.push(itemPath);
            }
          }
        }
      },
      err => {
        if (err) {
          reject(err);
        } else {
          treeWalkerDone = true;
          maybeDone();
        }
      }
    );
  });
};

const findAsyncInit = (path, options) => {
  return inspect.async(path, { symlinks: "follow" }).then(entryPointInspect => {
    if (entryPointInspect === undefined) {
      throw generatePathDoesntExistError(path);
    } else if (entryPointInspect.type !== "dir") {
      throw generatePathNotDirectoryError(path);
    }
    return findAsync(path, normalizeOptions(options));
  });
};

// ---------------------------------------------------------
// API
// ---------------------------------------------------------

exports.validateInput = validateInput;
exports.sync = findSyncInit;
exports.async = findAsyncInit;
"use strict";

const crypto = require("crypto");
const pathUtil = require("path");
const fs = require("./utils/fs");
const validate = require("./utils/validate");

const supportedChecksumAlgorithms = ["md5", "sha1", "sha256", "sha512"];

const symlinkOptions = ["report", "follow"];

const validateInput = (methodName, path, options) => {
  const methodSignature = `${methodName}(path, [options])`;
  validate.argument(methodSignature, "path", path, ["string"]);
  validate.options(methodSignature, "options", options, {
    checksum: ["string"],
    mode: ["boolean"],
    times: ["boolean"],
    absolutePath: ["boolean"],
    symlinks: ["string"]
  });

  if (
    options &&
    options.checksum !== undefined &&
    supportedChecksumAlgorithms.indexOf(options.checksum) === -1
  ) {
    throw new Error(
      `Argument "options.checksum" passed to ${methodSignature} must have one of values: ${supportedChecksumAlgorithms.join(
        ", "
      )}`
    );
  }

  if (
    options &&
    options.symlinks !== undefined &&
    symlinkOptions.indexOf(options.symlinks) === -1
  ) {
    throw new Error(
      `Argument "options.symlinks" passed to ${methodSignature} must have one of values: ${symlinkOptions.join(
        ", "
      )}`
    );
  }
};

const createInspectObj = (path, options, stat) => {
  const obj = {};

  obj.name = pathUtil.basename(path);

  if (stat.isFile()) {
    obj.type = "file";
    obj.size = stat.size;
  } else if (stat.isDirectory()) {
    obj.type = "dir";
  } else if (stat.isSymbolicLink()) {
    obj.type = "symlink";
  } else {
    obj.type = "other";
  }

  if (options.mode) {
    obj.mode = stat.mode;
  }

  if (options.times) {
    obj.accessTime = stat.atime;
    obj.modifyTime = stat.mtime;
    obj.changeTime = stat.ctime;
  }

  if (options.absolutePath) {
    obj.absolutePath = path;
  }

  return obj;
};

// ---------------------------------------------------------
// Sync
// ---------------------------------------------------------

const fileChecksum = (path, algo) => {
  const hash = crypto.createHash(algo);
  const data = fs.readFileSync(path);
  hash.update(data);
  return hash.digest("hex");
};

const addExtraFieldsSync = (path, inspectObj, options) => {
  if (inspectObj.type === "file" && options.checksum) {
    inspectObj[options.checksum] = fileChecksum(path, options.checksum);
  } else if (inspectObj.type === "symlink") {
    inspectObj.pointsAt = fs.readlinkSync(path);
  }
};

const inspectSync = (path, options) => {
  let statOperation = fs.lstatSync;
  let stat;
  const opts = options || {};

  if (opts.symlinks === "follow") {
    statOperation = fs.statSync;
  }

  try {
    stat = statOperation(path);
  } catch (err) {
    // Detection if path exists
    if (err.code === "ENOENT") {
      // Doesn't exist. Return undefined instead of throwing.
      return undefined;
    }
    throw err;
  }

  const inspectObj = createInspectObj(path, opts, stat);
  addExtraFieldsSync(path, inspectObj, opts);

  return inspectObj;
};

// ---------------------------------------------------------
// Async
// ---------------------------------------------------------

const fileChecksumAsync = (path, algo) => {
  return new Promise((resolve, reject) => {
    const hash = crypto.createHash(algo);
    const s = fs.createReadStream(path);
    s.on("data", data => {
      hash.update(data);
    });
    s.on("end", () => {
      resolve(hash.digest("hex"));
    });
    s.on("error", reject);
  });
};

const addExtraFieldsAsync = (path, inspectObj, options) => {
  if (inspectObj.type === "file" && options.checksum) {
    return fileChecksumAsync(path, options.checksum).then(checksum => {
      inspectObj[options.checksum] = checksum;
      return inspectObj;
    });
  } else if (inspectObj.type === "symlink") {
    return fs.readlink(path).then(linkPath => {
      inspectObj.pointsAt = linkPath;
      return inspectObj;
    });
  }
  return Promise.resolve(inspectObj);
};

const inspectAsync = (path, options) => {
  return new Promise((resolve, reject) => {
    let statOperation = fs.lstat;
    const opts = options || {};

    if (opts.symlinks === "follow") {
      statOperation = fs.stat;
    }

    statOperation(path)
      .then(stat => {
        const inspectObj = createInspectObj(path, opts, stat);
        addExtraFieldsAsync(path, inspectObj, opts).then(resolve, reject);
      })
      .catch(err => {
        // Detection if path exists
        if (err.code === "ENOENT") {
          // Doesn't exist. Return undefined instead of throwing.
          resolve(undefined);
        } else {
          reject(err);
        }
      });
  });
};

// ---------------------------------------------------------
// API
// ---------------------------------------------------------

exports.supportedChecksumAlgorithms = supportedChecksumAlgorithms;
exports.symlinkOptions = symlinkOptions;
exports.validateInput = validateInput;
exports.sync = inspectSync;
exports.async = inspectAsync;
"use strict";

const crypto = require("crypto");
const pathUtil = require("path");
const inspect = require("./inspect");
const list = require("./list");
const validate = require("./utils/validate");
const treeWalker = require("./utils/tree_walker");

const validateInput = (methodName, path, options) => {
  const methodSignature = `${methodName}(path, [options])`;
  validate.argument(methodSignature, "path", path, ["string"]);
  validate.options(methodSignature, "options", options, {
    checksum: ["string"],
    relativePath: ["boolean"],
    times: ["boolean"],
    symlinks: ["string"]
  });

  if (
    options &&
    options.checksum !== undefined &&
    inspect.supportedChecksumAlgorithms.indexOf(options.checksum) === -1
  ) {
    throw new Error(
      `Argument "options.checksum" passed to ${methodSignature} must have one of values: ${inspect.supportedChecksumAlgorithms.join(
        ", "
      )}`
    );
  }

  if (
    options &&
    options.symlinks !== undefined &&
    inspect.symlinkOptions.indexOf(options.symlinks) === -1
  ) {
    throw new Error(
      `Argument "options.symlinks" passed to ${methodSignature} must have one of values: ${inspect.symlinkOptions.join(
        ", "
      )}`
    );
  }
};

const relativePathInTree = (parentInspectObj, inspectObj) => {
  if (parentInspectObj === undefined) {
    return ".";
  }
  return parentInspectObj.relativePath + "/" + inspectObj.name;
};

// Creates checksum of a directory by using
// checksums and names of all its children.
const checksumOfDir = (inspectList, algo) => {
  const hash = crypto.createHash(algo);
  inspectList.forEach(inspectObj => {
    hash.update(inspectObj.name + inspectObj[algo]);
  });
  return hash.digest("hex");
};

const calculateTreeDependentProperties = (
  parentInspectObj,
  inspectObj,
  options
) => {
  if (options.relativePath) {
    inspectObj.relativePath = relativePathInTree(parentInspectObj, inspectObj);
  }

  if (inspectObj.type === "dir") {
    inspectObj.children.forEach(childInspectObj => {
      calculateTreeDependentProperties(inspectObj, childInspectObj, options);
    });

    inspectObj.size = 0;
    inspectObj.children.sort((a, b) => {
      if (a.type === "dir" && b.type === "file") {
        return -1;
      }
      if (a.type === "file" && b.type === "dir") {
        return 1;
      }
      return a.name.localeCompare(b.name);
    });
    inspectObj.children.forEach(child => {
      inspectObj.size += child.size || 0;
    });

    if (options.checksum) {
      inspectObj[options.checksum] = checksumOfDir(
        inspectObj.children,
        options.checksum
      );
    }
  }
};

const findParentInTree = (treeNode, pathChain, item) => {
  const name = pathChain[0];
  if (pathChain.length > 1) {
    const itemInTreeForPathChain = treeNode.children.find(child => {
      return child.name === name;
    });
    return findParentInTree(itemInTreeForPathChain, pathChain.slice(1), item);
  }
  return treeNode;
};

// ---------------------------------------------------------
// Sync
// ---------------------------------------------------------

const inspectTreeSync = (path, opts) => {
  const options = opts || {};
  let tree;

  treeWalker.sync(path, { inspectOptions: options }, (itemPath, item) => {
    if (item) {
      if (item.type === "dir") {
        item.children = [];
      }
      const relativePath = pathUtil.relative(path, itemPath);
      if (relativePath === "") {
        tree = item;
      } else {
        const parentItem = findParentInTree(
          tree,
          relativePath.split(pathUtil.sep),
          item
        );
        parentItem.children.push(item);
      }
    }
  });

  if (tree) {
    calculateTreeDependentProperties(undefined, tree, options);
  }

  return tree;
};

// ---------------------------------------------------------
// Async
// ---------------------------------------------------------

const inspectTreeAsync = (path, opts) => {
  const options = opts || {};
  let tree;

  return new Promise((resolve, reject) => {
    treeWalker.async(
      path,
      { inspectOptions: options },
      (itemPath, item) => {
        if (item) {
          if (item.type === "dir") {
            item.children = [];
          }
          const relativePath = pathUtil.relative(path, itemPath);
          if (relativePath === "") {
            tree = item;
          } else {
            const parentItem = findParentInTree(
              tree,
              relativePath.split(pathUtil.sep),
              item
            );
            parentItem.children.push(item);
          }
        }
      },
      err => {
        if (err) {
          reject(err);
        } else {
          if (tree) {
            calculateTreeDependentProperties(undefined, tree, options);
          }
          resolve(tree);
        }
      }
    );
  });
};

// ---------------------------------------------------------
// API
// ---------------------------------------------------------

exports.validateInput = validateInput;
exports.sync = inspectTreeSync;
exports.async = inspectTreeAsync;
"use strict";

const util = require("util");
const pathUtil = require("path");
const append = require("./append");
const dir = require("./dir");
const file = require("./file");
const find = require("./find");
const inspect = require("./inspect");
const inspectTree = require("./inspect_tree");
const copy = require("./copy");
const exists = require("./exists");
const list = require("./list");
const move = require("./move");
const read = require("./read");
const remove = require("./remove");
const rename = require("./rename");
const symlink = require("./symlink");
const streams = require("./streams");
const tmpDir = require("./tmp_dir");
const write = require("./write");

// The Jetpack Context object.
// It provides the public API, and resolves all paths regarding to
// passed cwdPath, or default process.cwd() if cwdPath was not specified.
const jetpackContext = cwdPath => {
  const getCwdPath = () => {
    return cwdPath || process.cwd();
  };

  const cwd = function() {
    // return current CWD if no arguments specified...
    if (arguments.length === 0) {
      return getCwdPath();
    }

    // ...create new CWD context otherwise
    const args = Array.prototype.slice.call(arguments);
    const pathParts = [getCwdPath()].concat(args);
    return jetpackContext(pathUtil.resolve.apply(null, pathParts));
  };

  // resolves path to inner CWD path of this jetpack instance
  const resolvePath = path => {
    return pathUtil.resolve(getCwdPath(), path);
  };

  const getPath = function() {
    // add CWD base path as first element of arguments array
    Array.prototype.unshift.call(arguments, getCwdPath());
    return pathUtil.resolve.apply(null, arguments);
  };

  const normalizeOptions = options => {
    const opts = options || {};
    opts.cwd = getCwdPath();
    return opts;
  };

  // API

  const api = {
    cwd,
    path: getPath,

    append: (path, data, options) => {
      append.validateInput("append", path, data, options);
      append.sync(resolvePath(path), data, options);
    },
    appendAsync: (path, data, options) => {
      append.validateInput("appendAsync", path, data, options);
      return append.async(resolvePath(path), data, options);
    },

    copy: (from, to, options) => {
      copy.validateInput("copy", from, to, options);
      copy.sync(resolvePath(from), resolvePath(to), options);
    },
    copyAsync: (from, to, options) => {
      copy.validateInput("copyAsync", from, to, options);
      return copy.async(resolvePath(from), resolvePath(to), options);
    },

    createWriteStream: (path, options) => {
      return streams.createWriteStream(resolvePath(path), options);
    },
    createReadStream: (path, options) => {
      return streams.createReadStream(resolvePath(path), options);
    },

    dir: (path, criteria) => {
      dir.validateInput("dir", path, criteria);
      const normalizedPath = resolvePath(path);
      dir.sync(normalizedPath, criteria);
      return cwd(normalizedPath);
    },
    dirAsync: (path, criteria) => {
      dir.validateInput("dirAsync", path, criteria);
      return new Promise((resolve, reject) => {
        const normalizedPath = resolvePath(path);
        dir.async(normalizedPath, criteria).then(() => {
          resolve(cwd(normalizedPath));
        }, reject);
      });
    },

    exists: path => {
      exists.validateInput("exists", path);
      return exists.sync(resolvePath(path));
    },
    existsAsync: path => {
      exists.validateInput("existsAsync", path);
      return exists.async(resolvePath(path));
    },

    file: (path, criteria) => {
      file.validateInput("file", path, criteria);
      file.sync(resolvePath(path), criteria);
      return api;
    },
    fileAsync: (path, criteria) => {
      file.validateInput("fileAsync", path, criteria);
      return new Promise((resolve, reject) => {
        file.async(resolvePath(path), criteria).then(() => {
          resolve(api);
        }, reject);
      });
    },

    find: (startPath, options) => {
      // startPath is optional parameter, if not specified move rest of params
      // to proper places and default startPath to CWD.
      if (typeof options === "undefined" && typeof startPath === "object") {
        options = startPath;
        startPath = ".";
      }
      find.validateInput("find", startPath, options);
      return find.sync(resolvePath(startPath), normalizeOptions(options));
    },
    findAsync: (startPath, options) => {
      // startPath is optional parameter, if not specified move rest of params
      // to proper places and default startPath to CWD.
      if (typeof options === "undefined" && typeof startPath === "object") {
        options = startPath;
        startPath = ".";
      }
      find.validateInput("findAsync", startPath, options);
      return find.async(resolvePath(startPath), normalizeOptions(options));
    },

    inspect: (path, fieldsToInclude) => {
      inspect.validateInput("inspect", path, fieldsToInclude);
      return inspect.sync(resolvePath(path), fieldsToInclude);
    },
    inspectAsync: (path, fieldsToInclude) => {
      inspect.validateInput("inspectAsync", path, fieldsToInclude);
      return inspect.async(resolvePath(path), fieldsToInclude);
    },

    inspectTree: (path, options) => {
      inspectTree.validateInput("inspectTree", path, options);
      return inspectTree.sync(resolvePath(path), options);
    },
    inspectTreeAsync: (path, options) => {
      inspectTree.validateInput("inspectTreeAsync", path, options);
      return inspectTree.async(resolvePath(path), options);
    },

    list: path => {
      list.validateInput("list", path);
      return list.sync(resolvePath(path || "."));
    },
    listAsync: path => {
      list.validateInput("listAsync", path);
      return list.async(resolvePath(path || "."));
    },

    move: (from, to, options) => {
      move.validateInput("move", from, to, options);
      move.sync(resolvePath(from), resolvePath(to), options);
    },
    moveAsync: (from, to, options) => {
      move.validateInput("moveAsync", from, to, options);
      return move.async(resolvePath(from), resolvePath(to), options);
    },

    read: (path, returnAs) => {
      read.validateInput("read", path, returnAs);
      return read.sync(resolvePath(path), returnAs);
    },
    readAsync: (path, returnAs) => {
      read.validateInput("readAsync", path, returnAs);
      return read.async(resolvePath(path), returnAs);
    },

    remove: path => {
      remove.validateInput("remove", path);
      // If path not specified defaults to CWD
      remove.sync(resolvePath(path || "."));
    },
    removeAsync: path => {
      remove.validateInput("removeAsync", path);
      // If path not specified defaults to CWD
      return remove.async(resolvePath(path || "."));
    },

    rename: (path, newName, options) => {
      rename.validateInput("rename", path, newName, options);
      rename.sync(resolvePath(path), newName, options);
    },
    renameAsync: (path, newName, options) => {
      rename.validateInput("renameAsync", path, newName, options);
      return rename.async(resolvePath(path), newName, options);
    },

    symlink: (symlinkValue, path) => {
      symlink.validateInput("symlink", symlinkValue, path);
      symlink.sync(symlinkValue, resolvePath(path));
    },
    symlinkAsync: (symlinkValue, path) => {
      symlink.validateInput("symlinkAsync", symlinkValue, path);
      return symlink.async(symlinkValue, resolvePath(path));
    },

    tmpDir: options => {
      tmpDir.validateInput("tmpDir", options);
      const pathOfCreatedDirectory = tmpDir.sync(getCwdPath(), options);
      return cwd(pathOfCreatedDirectory);
    },
    tmpDirAsync: options => {
      tmpDir.validateInput("tmpDirAsync", options);
      return new Promise((resolve, reject) => {
        tmpDir.async(getCwdPath(), options).then(pathOfCreatedDirectory => {
          resolve(cwd(pathOfCreatedDirectory));
        }, reject);
      });
    },

    write: (path, data, options) => {
      write.validateInput("write", path, data, options);
      write.sync(resolvePath(path), data, options);
    },
    writeAsync: (path, data, options) => {
      write.validateInput("writeAsync", path, data, options);
      return write.async(resolvePath(path), data, options);
    }
  };

  if (util.inspect.custom !== undefined) {
    // Without this console.log(jetpack) throws obscure error. Details:
    // https://github.com/szwacz/fs-jetpack/issues/29
    // https://nodejs.org/api/util.html#util_custom_inspection_functions_on_objects
    api[util.inspect.custom] = () => {
      return `[fs-jetpack CWD: ${getCwdPath()}]`;
    };
  }

  return api;
};

module.exports = jetpackContext;
"use strict";

const fs = require("./utils/fs");
const validate = require("./utils/validate");

const validateInput = (methodName, path) => {
  const methodSignature = `${methodName}(path)`;
  validate.argument(methodSignature, "path", path, ["string", "undefined"]);
};

// ---------------------------------------------------------
// Sync
// ---------------------------------------------------------

const listSync = path => {
  try {
    return fs.readdirSync(path);
  } catch (err) {
    if (err.code === "ENOENT") {
      // Doesn't exist. Return undefined instead of throwing.
      return undefined;
    }
    throw err;
  }
};

// ---------------------------------------------------------
// Async
// ---------------------------------------------------------

const listAsync = path => {
  return new Promise((resolve, reject) => {
    fs.readdir(path)
      .then(list => {
        resolve(list);
      })
      .catch(err => {
        if (err.code === "ENOENT") {
          // Doesn't exist. Return undefined instead of throwing.
          resolve(undefined);
        } else {
          reject(err);
        }
      });
  });
};

// ---------------------------------------------------------
// API
// ---------------------------------------------------------

exports.validateInput = validateInput;
exports.sync = listSync;
exports.async = listAsync;
"use strict";

const pathUtil = require("path");
const fs = require("./utils/fs");
const validate = require("./utils/validate");
const copy = require("./copy");
const dir = require("./dir");
const exists = require("./exists");
const remove = require("./remove");

const validateInput = (methodName, from, to, options) => {
  const methodSignature = `${methodName}(from, to, [options])`;
  validate.argument(methodSignature, "from", from, ["string"]);
  validate.argument(methodSignature, "to", to, ["string"]);
  validate.options(methodSignature, "options", options, {
    overwrite: ["boolean"]
  });
};

const parseOptions = options => {
  const opts = options || {};
  return opts;
};

const generateDestinationExistsError = path => {
  const err = new Error(`Destination path already exists ${path}`);
  err.code = "EEXIST";
  return err;
};

const generateSourceDoesntExistError = path => {
  const err = new Error(`Path to move doesn't exist ${path}`);
  err.code = "ENOENT";
  return err;
};

// ---------------------------------------------------------
// Sync
// ---------------------------------------------------------

const moveSync = (from, to, options) => {
  const opts = parseOptions(options);

  if (exists.sync(to) !== false && opts.overwrite !== true) {
    throw generateDestinationExistsError(to);
  }

  // We now have permission to overwrite, since either `opts.overwrite` is true
  // or the destination does not exist (in which overwriting is irrelevant).

  try {
    // If destination is a file, `fs.renameSync` will overwrite it.
    fs.renameSync(from, to);
  } catch (err) {
    if (err.code === "EISDIR" || err.code === "EPERM") {
      // Looks like the destination path is a directory in the same device,
      // so we can remove it and call `fs.renameSync` again.
      remove.sync(to);
      fs.renameSync(from, to);
    } else if (err.code === "EXDEV") {
      // The destination path is in another device.
      copy.sync(from, to, { overwrite: true });
      remove.sync(from);
    } else if (err.code === "ENOENT") {
      // This can be caused by either the source not existing or one or more folders
      // in the destination path not existing.
      if (!exists.sync(from)) {
        throw generateSourceDoesntExistError(from);
      }

      // One or more directories in the destination path don't exist.
      dir.createSync(pathUtil.dirname(to));
      // Retry the attempt
      fs.renameSync(from, to);
    } else {
      // We can't make sense of this error. Rethrow it.
      throw err;
    }
  }
};

// ---------------------------------------------------------
// Async
// ---------------------------------------------------------

const ensureDestinationPathExistsAsync = to => {
  return new Promise((resolve, reject) => {
    const destDir = pathUtil.dirname(to);
    exists
      .async(destDir)
      .then(dstExists => {
        if (!dstExists) {
          dir.createAsync(destDir).then(resolve, reject);
        } else {
          // Hah, no idea.
          reject();
        }
      })
      .catch(reject);
  });
};

const moveAsync = (from, to, options) => {
  const opts = parseOptions(options);

  return new Promise((resolve, reject) => {
    exists.async(to).then(destinationExists => {
      if (destinationExists !== false && opts.overwrite !== true) {
        reject(generateDestinationExistsError(to));
      } else {
        // We now have permission to overwrite, since either `opts.overwrite` is true
        // or the destination does not exist (in which overwriting is irrelevant).
        // If destination is a file, `fs.rename` will overwrite it.
        fs.rename(from, to)
          .then(resolve)
          .catch(err => {
            if (err.code === "EISDIR" || err.code === "EPERM") {
              // Looks like the destination path is a directory in the same device,
              // so we can remove it and call `fs.rename` again.
              remove
                .async(to)
                .then(() => fs.rename(from, to))
                .then(resolve, reject);
            } else if (err.code === "EXDEV") {
              // The destination path is in another device.
              copy
                .async(from, to, { overwrite: true })
                .then(() => remove.async(from))
                .then(resolve, reject);
            } else if (err.code === "ENOENT") {
              // This can be caused by either the source not existing or one or more folders
              // in the destination path not existing.
              exists
                .async(from)
                .then(srcExists => {
                  if (!srcExists) {
                    reject(generateSourceDoesntExistError(from));
                  } else {
                    // One or more directories in the destination path don't exist.
                    ensureDestinationPathExistsAsync(to)
                      .then(() => {
                        // Retry the attempt
                        return fs.rename(from, to);
                      })
                      .then(resolve, reject);
                  }
                })
                .catch(reject);
            } else {
              // Something unknown. Rethrow original error.
              reject(err);
            }
          });
      }
    });
  });
};

// ---------------------------------------------------------
// API
// ---------------------------------------------------------

exports.validateInput = validateInput;
exports.sync = moveSync;
exports.async = moveAsync;
"use strict";

const fs = require("./utils/fs");
const validate = require("./utils/validate");

const supportedReturnAs = ["utf8", "buffer", "json", "jsonWithDates"];

const validateInput = (methodName, path, returnAs) => {
  const methodSignature = `${methodName}(path, returnAs)`;
  validate.argument(methodSignature, "path", path, ["string"]);
  validate.argument(methodSignature, "returnAs", returnAs, [
    "string",
    "undefined"
  ]);

  if (returnAs && supportedReturnAs.indexOf(returnAs) === -1) {
    throw new Error(
      `Argument "returnAs" passed to ${methodSignature} must have one of values: ${supportedReturnAs.join(
        ", "
      )}`
    );
  }
};

// Matches strings generated by Date.toJSON()
// which is called to serialize date to JSON.
const jsonDateParser = (key, value) => {
  const reISO = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*))(?:Z|(\+|-)([\d|:]*))?$/;
  if (typeof value === "string") {
    if (reISO.exec(value)) {
      return new Date(value);
    }
  }
  return value;
};

const makeNicerJsonParsingError = (path, err) => {
  const nicerError = new Error(
    `JSON parsing failed while reading ${path} [${err}]`
  );
  nicerError.originalError = err;
  return nicerError;
};

// ---------------------------------------------------------
// SYNC
// ---------------------------------------------------------

const readSync = (path, returnAs) => {
  const retAs = returnAs || "utf8";
  let data;

  let encoding = "utf8";
  if (retAs === "buffer") {
    encoding = null;
  }

  try {
    data = fs.readFileSync(path, { encoding });
  } catch (err) {
    if (err.code === "ENOENT") {
      // If file doesn't exist return undefined instead of throwing.
      return undefined;
    }
    // Otherwise rethrow the error
    throw err;
  }

  try {
    if (retAs === "json") {
      data = JSON.parse(data);
    } else if (retAs === "jsonWithDates") {
      data = JSON.parse(data, jsonDateParser);
    }
  } catch (err) {
    throw makeNicerJsonParsingError(path, err);
  }

  return data;
};

// ---------------------------------------------------------
// ASYNC
// ---------------------------------------------------------

const readAsync = (path, returnAs) => {
  return new Promise((resolve, reject) => {
    const retAs = returnAs || "utf8";
    let encoding = "utf8";
    if (retAs === "buffer") {
      encoding = null;
    }

    fs.readFile(path, { encoding })
      .then(data => {
        // Make final parsing of the data before returning.
        try {
          if (retAs === "json") {
            resolve(JSON.parse(data));
          } else if (retAs === "jsonWithDates") {
            resolve(JSON.parse(data, jsonDateParser));
          } else {
            resolve(data);
          }
        } catch (err) {
          reject(makeNicerJsonParsingError(path, err));
        }
      })
      .catch(err => {
        if (err.code === "ENOENT") {
          // If file doesn't exist return undefined instead of throwing.
          resolve(undefined);
        } else {
          // Otherwise throw
          reject(err);
        }
      });
  });
};

// ---------------------------------------------------------
// API
// ---------------------------------------------------------

exports.validateInput = validateInput;
exports.sync = readSync;
exports.async = readAsync;
"use strict";

const rimraf = require("rimraf");
const promisify = require("./utils/promisify");
const promisifiedRimraf = promisify(rimraf);
const validate = require("./utils/validate");

const validateInput = (methodName, path) => {
  const methodSignature = `${methodName}([path])`;
  validate.argument(methodSignature, "path", path, ["string", "undefined"]);
};

// ---------------------------------------------------------
// Sync
// ---------------------------------------------------------

const removeSync = path => {
  rimraf.sync(path, { disableGlob: true });
};

// ---------------------------------------------------------
// Async
// ---------------------------------------------------------

const removeAsync = path => {
  return promisifiedRimraf(path, { disableGlob: true });
};

// ---------------------------------------------------------
// API
// ---------------------------------------------------------

exports.validateInput = validateInput;
exports.sync = removeSync;
exports.async = removeAsync;
"use strict";

const pathUtil = require("path");
const move = require("./move");
const validate = require("./utils/validate");

const validateInput = (methodName, path, newName, options) => {
  const methodSignature = `${methodName}(path, newName, [options])`;
  validate.argument(methodSignature, "path", path, ["string"]);
  validate.argument(methodSignature, "newName", newName, ["string"]);
  validate.options(methodSignature, "options", options, {
    overwrite: ["boolean"]
  });

  if (pathUtil.basename(newName) !== newName) {
    throw new Error(
      `Argument "newName" passed to ${methodSignature} should be a filename, not a path. Received "${newName}"`
    );
  }
};

// ---------------------------------------------------------
// Sync
// ---------------------------------------------------------

const renameSync = (path, newName, options) => {
  const newPath = pathUtil.join(pathUtil.dirname(path), newName);
  move.sync(path, newPath, options);
};

// ---------------------------------------------------------
// Async
// ---------------------------------------------------------

const renameAsync = (path, newName, options) => {
  const newPath = pathUtil.join(pathUtil.dirname(path), newName);
  return move.async(path, newPath, options);
};

// ---------------------------------------------------------
// API
// ---------------------------------------------------------

exports.validateInput = validateInput;
exports.sync = renameSync;
exports.async = renameAsync;
"use strict";

const fs = require("fs");

exports.createWriteStream = fs.createWriteStream;
exports.createReadStream = fs.createReadStream;
"use strict";

const pathUtil = require("path");
const fs = require("./utils/fs");
const validate = require("./utils/validate");
const dir = require("./dir");

const validateInput = (methodName, symlinkValue, path) => {
  const methodSignature = `${methodName}(symlinkValue, path)`;
  validate.argument(methodSignature, "symlinkValue", symlinkValue, ["string"]);
  validate.argument(methodSignature, "path", path, ["string"]);
};

// ---------------------------------------------------------
// Sync
// ---------------------------------------------------------

const symlinkSync = (symlinkValue, path) => {
  try {
    fs.symlinkSync(symlinkValue, path);
  } catch (err) {
    if (err.code === "ENOENT") {
      // Parent directories don't exist. Just create them and retry.
      dir.createSync(pathUtil.dirname(path));
      fs.symlinkSync(symlinkValue, path);
    } else {
      throw err;
    }
  }
};

// ---------------------------------------------------------
// Async
// ---------------------------------------------------------

const symlinkAsync = (symlinkValue, path) => {
  return new Promise((resolve, reject) => {
    fs.symlink(symlinkValue, path)
      .then(resolve)
      .catch(err => {
        if (err.code === "ENOENT") {
          // Parent directories don't exist. Just create them and retry.
          dir
            .createAsync(pathUtil.dirname(path))
            .then(() => {
              return fs.symlink(symlinkValue, path);
            })
            .then(resolve, reject);
        } else {
          reject(err);
        }
      });
  });
};

// ---------------------------------------------------------
// API
// ---------------------------------------------------------

exports.validateInput = validateInput;
exports.sync = symlinkSync;
exports.async = symlinkAsync;
"use strict";

const pathUtil = require("path");
const os = require("os");
const crypto = require("crypto");
const dir = require("./dir");
const fs = require("./utils/fs");
const validate = require("./utils/validate");

const validateInput = (methodName, options) => {
  const methodSignature = `${methodName}([options])`;
  validate.options(methodSignature, "options", options, {
    prefix: ["string"],
    basePath: ["string"]
  });
};

const getOptionsDefaults = (passedOptions, cwdPath) => {
  passedOptions = passedOptions || {};
  const options = {};
  if (typeof passedOptions.prefix !== "string") {
    options.prefix = "";
  } else {
    options.prefix = passedOptions.prefix;
  }
  if (typeof passedOptions.basePath === "string") {
    options.basePath = pathUtil.resolve(cwdPath, passedOptions.basePath);
  } else {
    options.basePath = os.tmpdir();
  }
  return options;
};

const randomStringLength = 32;

// ---------------------------------------------------------
// Sync
// ---------------------------------------------------------

const tmpDirSync = (cwdPath, passedOptions) => {
  const options = getOptionsDefaults(passedOptions, cwdPath);
  const randomString = crypto
    .randomBytes(randomStringLength / 2)
    .toString("hex");
  const dirPath = pathUtil.join(
    options.basePath,
    options.prefix + randomString
  );
  // Let's assume everything will go well, do the directory fastest way possible
  try {
    fs.mkdirSync(dirPath);
  } catch (err) {
    // Something went wrong, try to recover by using more sophisticated approach
    if (err.code === "ENOENT") {
      dir.sync(dirPath);
    } else {
      throw err;
    }
  }
  return dirPath;
};

// ---------------------------------------------------------
// Async
// ---------------------------------------------------------

const tmpDirAsync = (cwdPath, passedOptions) => {
  return new Promise((resolve, reject) => {
    const options = getOptionsDefaults(passedOptions, cwdPath);
    crypto.randomBytes(randomStringLength / 2, (err, bytes) => {
      if (err) {
        reject(err);
      } else {
        const randomString = bytes.toString("hex");
        const dirPath = pathUtil.join(
          options.basePath,
          options.prefix + randomString
        );
        // Let's assume everything will go well, do the directory fastest way possible
        fs.mkdir(dirPath, err => {
          if (err) {
            // Something went wrong, try to recover by using more sophisticated approach
            if (err.code === "ENOENT") {
              dir.async(dirPath).then(() => {
                resolve(dirPath);
              }, reject);
            } else {
              reject(err);
            }
          } else {
            resolve(dirPath);
          }
        });
      }
    });
  });
};

// ---------------------------------------------------------
// API
// ---------------------------------------------------------

exports.validateInput = validateInput;
exports.sync = tmpDirSync;
exports.async = tmpDirAsync;
"use strict";

const pathUtil = require("path");
const fs = require("./utils/fs");
const validate = require("./utils/validate");
const dir = require("./dir");

const validateInput = (methodName, path, data, options) => {
  const methodSignature = `${methodName}(path, data, [options])`;
  validate.argument(methodSignature, "path", path, ["string"]);
  validate.argument(methodSignature, "data", data, [
    "string",
    "buffer",
    "object",
    "array"
  ]);
  validate.options(methodSignature, "options", options, {
    mode: ["string", "number"],
    atomic: ["boolean"],
    jsonIndent: ["number"]
  });
};

// Temporary file extensions used for atomic file overwriting.
const newExt = ".__new__";

const serializeToJsonMaybe = (data, jsonIndent) => {
  let indent = jsonIndent;
  if (typeof indent !== "number") {
    indent = 2;
  }

  if (typeof data === "object" && !Buffer.isBuffer(data) && data !== null) {
    return JSON.stringify(data, null, indent);
  }

  return data;
};

// ---------------------------------------------------------
// SYNC
// ---------------------------------------------------------

const writeFileSync = (path, data, options) => {
  try {
    fs.writeFileSync(path, data, options);
  } catch (err) {
    if (err.code === "ENOENT") {
      // Means parent directory doesn't exist, so create it and try again.
      dir.createSync(pathUtil.dirname(path));
      fs.writeFileSync(path, data, options);
    } else {
      throw err;
    }
  }
};

const writeAtomicSync = (path, data, options) => {
  // we are assuming there is file on given path, and we don't want
  // to touch it until we are sure our data has been saved correctly,
  // so write the data into temporary file...
  writeFileSync(path + newExt, data, options);
  // ...next rename temp file to replace real path.
  fs.renameSync(path + newExt, path);
};

const writeSync = (path, data, options) => {
  const opts = options || {};
  const processedData = serializeToJsonMaybe(data, opts.jsonIndent);

  let writeStrategy = writeFileSync;
  if (opts.atomic) {
    writeStrategy = writeAtomicSync;
  }
  writeStrategy(path, processedData, { mode: opts.mode });
};

// ---------------------------------------------------------
// ASYNC
// ---------------------------------------------------------

const writeFileAsync = (path, data, options) => {
  return new Promise((resolve, reject) => {
    fs.writeFile(path, data, options)
      .then(resolve)
      .catch(err => {
        // First attempt to write a file ended with error.
        // Check if this is not due to nonexistent parent directory.
        if (err.code === "ENOENT") {
          // Parent directory doesn't exist, so create it and try again.
          dir
            .createAsync(pathUtil.dirname(path))
            .then(() => {
              return fs.writeFile(path, data, options);
            })
            .then(resolve, reject);
        } else {
          // Nope, some other error, throw it.
          reject(err);
        }
      });
  });
};

const writeAtomicAsync = (path, data, options) => {
  return new Promise((resolve, reject) => {
    // We are assuming there is file on given path, and we don't want
    // to touch it until we are sure our data has been saved correctly,
    // so write the data into temporary file...
    writeFileAsync(path + newExt, data, options)
      .then(() => {
        // ...next rename temp file to real path.
        return fs.rename(path + newExt, path);
      })
      .then(resolve, reject);
  });
};

const writeAsync = (path, data, options) => {
  const opts = options || {};
  const processedData = serializeToJsonMaybe(data, opts.jsonIndent);

  let writeStrategy = writeFileAsync;
  if (opts.atomic) {
    writeStrategy = writeAtomicAsync;
  }
  return writeStrategy(path, processedData, { mode: opts.mode });
};

// ---------------------------------------------------------
// API
// ---------------------------------------------------------

exports.validateInput = validateInput;
exports.sync = writeSync;
exports.async = writeAsync;
// Adater module exposing all `fs` methods with promises instead of callbacks.

"use strict";

const fs = require("fs");
const promisify = require("./promisify");

const isCallbackMethod = key => {
  return [
    typeof fs[key] === "function",
    !key.match(/Sync$/),
    !key.match(/^[A-Z]/),
    !key.match(/^create/),
    !key.match(/^(un)?watch/)
  ].every(Boolean);
};

const adaptMethod = name => {
  const original = fs[name];
  return promisify(original);
};

const adaptAllMethods = () => {
  const adapted = {};

  Object.keys(fs).forEach(key => {
    if (isCallbackMethod(key)) {
      if (key === "exists") {
        // fs.exists() does not follow standard
        // Node callback conventions, and has
        // no error object in the callback
        adapted.exists = () => {
          throw new Error("fs.exists() is deprecated");
        };
      } else {
        adapted[key] = adaptMethod(key);
      }
    } else {
      adapted[key] = fs[key];
    }
  });

  return adapted;
};

module.exports = adaptAllMethods();
"use strict";

const Minimatch = require("minimatch").Minimatch;

const convertPatternToAbsolutePath = (basePath, pattern) => {
  // All patterns without slash are left as they are, if pattern contain
  // any slash we need to turn it into absolute path.
  const hasSlash = pattern.indexOf("/") !== -1;
  const isAbsolute = /^!?\//.test(pattern);
  const isNegated = /^!/.test(pattern);
  let separator;

  if (!isAbsolute && hasSlash) {
    // Throw out meaningful characters from the beginning ("!", "./").
    const patternWithoutFirstCharacters = pattern
      .replace(/^!/, "")
      .replace(/^\.\//, "");

    if (/\/$/.test(basePath)) {
      separator = "";
    } else {
      separator = "/";
    }

    if (isNegated) {
      return `!${basePath}${separator}${patternWithoutFirstCharacters}`;
    }
    return `${basePath}${separator}${patternWithoutFirstCharacters}`;
  }

  return pattern;
};

exports.create = (basePath, patterns, ignoreCase) => {
  let normalizedPatterns;

  if (typeof patterns === "string") {
    normalizedPatterns = [patterns];
  } else {
    normalizedPatterns = patterns;
  }

  const matchers = normalizedPatterns
    .map(pattern => {
      return convertPatternToAbsolutePath(basePath, pattern);
    })
    .map(pattern => {
      return new Minimatch(pattern, {
        matchBase: true,
        nocomment: true,
        nocase: ignoreCase || false,
        dot: true
      });
    });

  const performMatch = absolutePath => {
    let mode = "matching";
    let weHaveMatch = false;
    let currentMatcher;
    let i;

    for (i = 0; i < matchers.length; i += 1) {
      currentMatcher = matchers[i];

      if (currentMatcher.negate) {
        mode = "negation";
        if (i === 0) {
          // There are only negated patterns in the set,
          // so make everything matching by default and
          // start to reject stuff.
          weHaveMatch = true;
        }
      }

      if (
        mode === "negation" &&
        weHaveMatch &&
        !currentMatcher.match(absolutePath)
      ) {
        // One negation match is enought to know we can reject this one.
        return false;
      }

      if (mode === "matching" && !weHaveMatch) {
        weHaveMatch = currentMatcher.match(absolutePath);
      }
    }

    return weHaveMatch;
  };

  return performMatch;
};
// Logic for unix file mode operations.

"use strict";

// Converts mode to string 3 characters long.
exports.normalizeFileMode = mode => {
  let modeAsString;
  if (typeof mode === "number") {
    modeAsString = mode.toString(8);
  } else {
    modeAsString = mode;
  }
  return modeAsString.substring(modeAsString.length - 3);
};
"use strict";

module.exports = fn => {
  return function() {
    const length = arguments.length;
    const args = new Array(length);

    for (let i = 0; i < length; i += 1) {
      args[i] = arguments[i];
    }

    return new Promise((resolve, reject) => {
      args.push((err, data) => {
        if (err) {
          reject(err);
        } else {
          resolve(data);
        }
      });

      fn.apply(null, args);
    });
  };
};
"use strict";

const fs = require("fs");
const pathUtil = require("path");
const inspect = require("../inspect");
const list = require("../list");

const fileType = dirent => {
  if (dirent.isDirectory()) {
    return "dir";
  }
  if (dirent.isFile()) {
    return "file";
  }
  if (dirent.isSymbolicLink()) {
    return "symlink";
  }
  return "other";
};

// ---------------------------------------------------------
// SYNC
// ---------------------------------------------------------

const initialWalkSync = (path, options, callback) => {
  if (options.maxLevelsDeep === undefined) {
    options.maxLevelsDeep = Infinity;
  }
  const performInspectOnEachNode = options.inspectOptions !== undefined;
  if (options.symlinks) {
    if (options.inspectOptions === undefined) {
      options.inspectOptions = { symlinks: options.symlinks };
    } else {
      options.inspectOptions.symlinks = options.symlinks;
    }
  }

  const walkSync = (path, currentLevel) => {
    fs.readdirSync(path, { withFileTypes: true }).forEach(direntItem => {
      const withFileTypesNotSupported = typeof direntItem === "string";

      let fileItemPath;
      if (withFileTypesNotSupported) {
        fileItemPath = pathUtil.join(path, direntItem);
      } else {
        fileItemPath = pathUtil.join(path, direntItem.name);
      }

      let fileItem;
      if (performInspectOnEachNode) {
        fileItem = inspect.sync(fileItemPath, options.inspectOptions);
      } else if (withFileTypesNotSupported) {
        // New "withFileTypes" API not supported, need to do extra inspect
        // on each node, to know if this is a directory or a file.
        const inspectObject = inspect.sync(
          fileItemPath,
          options.inspectOptions
        );
        fileItem = { name: inspectObject.name, type: inspectObject.type };
      } else {
        const type = fileType(direntItem);
        if (type === "symlink" && options.symlinks === "follow") {
          const symlinkPointsTo = fs.statSync(fileItemPath);
          fileItem = { name: direntItem.name, type: fileType(symlinkPointsTo) };
        } else {
          fileItem = { name: direntItem.name, type };
        }
      }

      if (fileItem !== undefined) {
        callback(fileItemPath, fileItem);
        if (fileItem.type === "dir" && currentLevel < options.maxLevelsDeep) {
          walkSync(fileItemPath, currentLevel + 1);
        }
      }
    });
  };

  const item = inspect.sync(path, options.inspectOptions);
  if (item) {
    if (performInspectOnEachNode) {
      callback(path, item);
    } else {
      // Return simplified object, not full inspect object
      callback(path, { name: item.name, type: item.type });
    }
    if (item.type === "dir") {
      walkSync(path, 1);
    }
  } else {
    callback(path, undefined);
  }
};

// ---------------------------------------------------------
// ASYNC
// ---------------------------------------------------------

const maxConcurrentOperations = 5;

const initialWalkAsync = (path, options, callback, doneCallback) => {
  if (options.maxLevelsDeep === undefined) {
    options.maxLevelsDeep = Infinity;
  }
  const performInspectOnEachNode = options.inspectOptions !== undefined;
  if (options.symlinks) {
    if (options.inspectOptions === undefined) {
      options.inspectOptions = { symlinks: options.symlinks };
    } else {
      options.inspectOptions.symlinks = options.symlinks;
    }
  }

  const concurrentOperationsQueue = [];
  let nowDoingConcurrentOperations = 0;

  const checkConcurrentOperations = () => {
    if (
      concurrentOperationsQueue.length === 0 &&
      nowDoingConcurrentOperations === 0
    ) {
      doneCallback();
    } else if (
      concurrentOperationsQueue.length > 0 &&
      nowDoingConcurrentOperations < maxConcurrentOperations
    ) {
      const operation = concurrentOperationsQueue.pop();
      nowDoingConcurrentOperations += 1;
      operation();
    }
  };

  const whenConcurrencySlotAvailable = operation => {
    concurrentOperationsQueue.push(operation);
    checkConcurrentOperations();
  };

  const concurrentOperationDone = () => {
    nowDoingConcurrentOperations -= 1;
    checkConcurrentOperations();
  };

  const walkAsync = (path, currentLevel) => {
    const goDeeperIfDir = (fileItemPath, fileItem) => {
      if (fileItem.type === "dir" && currentLevel < options.maxLevelsDeep) {
        walkAsync(fileItemPath, currentLevel + 1);
      }
    };

    whenConcurrencySlotAvailable(() => {
      fs.readdir(path, { withFileTypes: true }, (err, files) => {
        if (err) {
          doneCallback(err);
        } else {
          files.forEach(direntItem => {
            const withFileTypesNotSupported = typeof direntItem === "string";

            let fileItemPath;
            if (withFileTypesNotSupported) {
              fileItemPath = pathUtil.join(path, direntItem);
            } else {
              fileItemPath = pathUtil.join(path, direntItem.name);
            }

            if (performInspectOnEachNode || withFileTypesNotSupported) {
              whenConcurrencySlotAvailable(() => {
                inspect
                  .async(fileItemPath, options.inspectOptions)
                  .then(fileItem => {
                    if (fileItem !== undefined) {
                      if (performInspectOnEachNode) {
                        callback(fileItemPath, fileItem);
                      } else {
                        callback(fileItemPath, {
                          name: fileItem.name,
                          type: fileItem.type
                        });
                      }
                      goDeeperIfDir(fileItemPath, fileItem);
                    }
                    concurrentOperationDone();
                  })
                  .catch(err => {
                    doneCallback(err);
                  });
              });
            } else {
              const type = fileType(direntItem);
              if (type === "symlink" && options.symlinks === "follow") {
                whenConcurrencySlotAvailable(() => {
                  fs.stat(fileItemPath, (err, symlinkPointsTo) => {
                    if (err) {
                      doneCallback(err);
                    } else {
                      const fileItem = {
                        name: direntItem.name,
                        type: fileType(symlinkPointsTo)
                      };
                      callback(fileItemPath, fileItem);
                      goDeeperIfDir(fileItemPath, fileItem);
                      concurrentOperationDone();
                    }
                  });
                });
              } else {
                const fileItem = { name: direntItem.name, type };
                callback(fileItemPath, fileItem);
                goDeeperIfDir(fileItemPath, fileItem);
              }
            }
          });
          concurrentOperationDone();
        }
      });
    });
  };

  inspect
    .async(path, options.inspectOptions)
    .then(item => {
      if (item) {
        if (performInspectOnEachNode) {
          callback(path, item);
        } else {
          // Return simplified object, not full inspect object
          callback(path, { name: item.name, type: item.type });
        }
        if (item.type === "dir") {
          walkAsync(path, 1);
        } else {
          doneCallback();
        }
      } else {
        callback(path, undefined);
        doneCallback();
      }
    })
    .catch(err => {
      doneCallback(err);
    });
};

// ---------------------------------------------------------
// API
// ---------------------------------------------------------

exports.sync = initialWalkSync;
exports.async = initialWalkAsync;
"use strict";

const prettyPrintTypes = types => {
  const addArticle = str => {
    const vowels = ["a", "e", "i", "o", "u"];
    if (vowels.indexOf(str[0]) !== -1) {
      return `an ${str}`;
    }
    return `a ${str}`;
  };

  return types.map(addArticle).join(" or ");
};

const isArrayOfNotation = typeDefinition => {
  return /array of /.test(typeDefinition);
};

const extractTypeFromArrayOfNotation = typeDefinition => {
  // The notation is e.g. 'array of string'
  return typeDefinition.split(" of ")[1];
};

const isValidTypeDefinition = typeStr => {
  if (isArrayOfNotation(typeStr)) {
    return isValidTypeDefinition(extractTypeFromArrayOfNotation(typeStr));
  }

  return [
    "string",
    "number",
    "boolean",
    "array",
    "object",
    "buffer",
    "null",
    "undefined",
    "function"
  ].some(validType => {
    return validType === typeStr;
  });
};

const detectType = value => {
  if (value === null) {
    return "null";
  }
  if (Array.isArray(value)) {
    return "array";
  }
  if (Buffer.isBuffer(value)) {
    return "buffer";
  }

  return typeof value;
};

const onlyUniqueValuesInArrayFilter = (value, index, self) => {
  return self.indexOf(value) === index;
};

const detectTypeDeep = value => {
  let type = detectType(value);
  let typesInArray;

  if (type === "array") {
    typesInArray = value
      .map(element => {
        return detectType(element);
      })
      .filter(onlyUniqueValuesInArrayFilter);
    type += ` of ${typesInArray.join(", ")}`;
  }

  return type;
};

const validateArray = (argumentValue, typeToCheck) => {
  const allowedTypeInArray = extractTypeFromArrayOfNotation(typeToCheck);

  if (detectType(argumentValue) !== "array") {
    return false;
  }

  return argumentValue.every(element => {
    return detectType(element) === allowedTypeInArray;
  });
};

const validateArgument = (
  methodName,
  argumentName,
  argumentValue,
  argumentMustBe
) => {
  const isOneOfAllowedTypes = argumentMustBe.some(type => {
    if (!isValidTypeDefinition(type)) {
      throw new Error(`Unknown type "${type}"`);
    }

    if (isArrayOfNotation(type)) {
      return validateArray(argumentValue, type);
    }

    return type === detectType(argumentValue);
  });

  if (!isOneOfAllowedTypes) {
    throw new Error(
      `Argument "${argumentName}" passed to ${methodName} must be ${prettyPrintTypes(
        argumentMustBe
      )}. Received ${detectTypeDeep(argumentValue)}`
    );
  }
};

const validateOptions = (methodName, optionsObjName, obj, allowedOptions) => {
  if (obj !== undefined) {
    validateArgument(methodName, optionsObjName, obj, ["object"]);
    Object.keys(obj).forEach(key => {
      const argName = `${optionsObjName}.${key}`;
      if (allowedOptions[key] !== undefined) {
        validateArgument(methodName, argName, obj[key], allowedOptions[key]);
      } else {
        throw new Error(
          `Unknown argument "${argName}" passed to ${methodName}`
        );
      }
    });
  }
};

module.exports = {
  argument: validateArgument,
  options: validateOptions
};
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.
'use strict'
const MiniPass = require('minipass')
const EE = require('events').EventEmitter
const fs = require('fs')

let writev = fs.writev
/* istanbul ignore next */
if (!writev) {
  // This entire block can be removed if support for earlier than Node.js
  // 12.9.0 is not needed.
  const binding = process.binding('fs')
  const FSReqWrap = binding.FSReqWrap || binding.FSReqCallback

  writev = (fd, iovec, pos, cb) => {
    const done = (er, bw) => cb(er, bw, iovec)
    const req = new FSReqWrap()
    req.oncomplete = done
    binding.writeBuffers(fd, iovec, pos, req)
  }
}

const _autoClose = Symbol('_autoClose')
const _close = Symbol('_close')
const _ended = Symbol('_ended')
const _fd = Symbol('_fd')
const _finished = Symbol('_finished')
const _flags = Symbol('_flags')
const _flush = Symbol('_flush')
const _handleChunk = Symbol('_handleChunk')
const _makeBuf = Symbol('_makeBuf')
const _mode = Symbol('_mode')
const _needDrain = Symbol('_needDrain')
const _onerror = Symbol('_onerror')
const _onopen = Symbol('_onopen')
const _onread = Symbol('_onread')
const _onwrite = Symbol('_onwrite')
const _open = Symbol('_open')
const _path = Symbol('_path')
const _pos = Symbol('_pos')
const _queue = Symbol('_queue')
const _read = Symbol('_read')
const _readSize = Symbol('_readSize')
const _reading = Symbol('_reading')
const _remain = Symbol('_remain')
const _size = Symbol('_size')
const _write = Symbol('_write')
const _writing = Symbol('_writing')
const _defaultFlag = Symbol('_defaultFlag')
const _errored = Symbol('_errored')

class ReadStream extends MiniPass {
  constructor (path, opt) {
    opt = opt || {}
    super(opt)

    this.readable = true
    this.writable = false

    if (typeof path !== 'string')
      throw new TypeError('path must be a string')

    this[_errored] = false
    this[_fd] = typeof opt.fd === 'number' ? opt.fd : null
    this[_path] = path
    this[_readSize] = opt.readSize || 16*1024*1024
    this[_reading] = false
    this[_size] = typeof opt.size === 'number' ? opt.size : Infinity
    this[_remain] = this[_size]
    this[_autoClose] = typeof opt.autoClose === 'boolean' ?
      opt.autoClose : true

    if (typeof this[_fd] === 'number')
      this[_read]()
    else
      this[_open]()
  }

  get fd () { return this[_fd] }
  get path () { return this[_path] }

  write () {
    throw new TypeError('this is a readable stream')
  }

  end () {
    throw new TypeError('this is a readable stream')
  }

  [_open] () {
    fs.open(this[_path], 'r', (er, fd) => this[_onopen](er, fd))
  }

  [_onopen] (er, fd) {
    if (er)
      this[_onerror](er)
    else {
      this[_fd] = fd
      this.emit('open', fd)
      this[_read]()
    }
  }

  [_makeBuf] () {
    return Buffer.allocUnsafe(Math.min(this[_readSize], this[_remain]))
  }

  [_read] () {
    if (!this[_reading]) {
      this[_reading] = true
      const buf = this[_makeBuf]()
      /* istanbul ignore if */
      if (buf.length === 0)
        return process.nextTick(() => this[_onread](null, 0, buf))
      fs.read(this[_fd], buf, 0, buf.length, null, (er, br, buf) =>
        this[_onread](er, br, buf))
    }
  }

  [_onread] (er, br, buf) {
    this[_reading] = false
    if (er)
      this[_onerror](er)
    else if (this[_handleChunk](br, buf))
      this[_read]()
  }

  [_close] () {
    if (this[_autoClose] && typeof this[_fd] === 'number') {
      const fd = this[_fd]
      this[_fd] = null
      fs.close(fd, er => er ? this.emit('error', er) : this.emit('close'))
    }
  }

  [_onerror] (er) {
    this[_reading] = true
    this[_close]()
    this.emit('error', er)
  }

  [_handleChunk] (br, buf) {
    let ret = false
    // no effect if infinite
    this[_remain] -= br
    if (br > 0)
      ret = super.write(br < buf.length ? buf.slice(0, br) : buf)

    if (br === 0 || this[_remain] <= 0) {
      ret = false
      this[_close]()
      super.end()
    }

    return ret
  }

  emit (ev, data) {
    switch (ev) {
      case 'prefinish':
      case 'finish':
        break

      case 'drain':
        if (typeof this[_fd] === 'number')
          this[_read]()
        break

      case 'error':
        if (this[_errored])
          return
        this[_errored] = true
        return super.emit(ev, data)

      default:
        return super.emit(ev, data)
    }
  }
}

class ReadStreamSync extends ReadStream {
  [_open] () {
    let threw = true
    try {
      this[_onopen](null, fs.openSync(this[_path], 'r'))
      threw = false
    } finally {
      if (threw)
        this[_close]()
    }
  }

  [_read] () {
    let threw = true
    try {
      if (!this[_reading]) {
        this[_reading] = true
        do {
          const buf = this[_makeBuf]()
          /* istanbul ignore next */
          const br = buf.length === 0 ? 0
            : fs.readSync(this[_fd], buf, 0, buf.length, null)
          if (!this[_handleChunk](br, buf))
            break
        } while (true)
        this[_reading] = false
      }
      threw = false
    } finally {
      if (threw)
        this[_close]()
    }
  }

  [_close] () {
    if (this[_autoClose] && typeof this[_fd] === 'number') {
      const fd = this[_fd]
      this[_fd] = null
      fs.closeSync(fd)
      this.emit('close')
    }
  }
}

class WriteStream extends EE {
  constructor (path, opt) {
    opt = opt || {}
    super(opt)
    this.readable = false
    this.writable = true
    this[_errored] = false
    this[_writing] = false
    this[_ended] = false
    this[_needDrain] = false
    this[_queue] = []
    this[_path] = path
    this[_fd] = typeof opt.fd === 'number' ? opt.fd : null
    this[_mode] = opt.mode === undefined ? 0o666 : opt.mode
    this[_pos] = typeof opt.start === 'number' ? opt.start : null
    this[_autoClose] = typeof opt.autoClose === 'boolean' ?
      opt.autoClose : true

    // truncating makes no sense when writing into the middle
    const defaultFlag = this[_pos] !== null ? 'r+' : 'w'
    this[_defaultFlag] = opt.flags === undefined
    this[_flags] = this[_defaultFlag] ? defaultFlag : opt.flags

    if (this[_fd] === null)
      this[_open]()
  }

  emit (ev, data) {
    if (ev === 'error') {
      if (this[_errored])
        return
      this[_errored] = true
    }
    return super.emit(ev, data)
  }


  get fd () { return this[_fd] }
  get path () { return this[_path] }

  [_onerror] (er) {
    this[_close]()
    this[_writing] = true
    this.emit('error', er)
  }

  [_open] () {
    fs.open(this[_path], this[_flags], this[_mode],
      (er, fd) => this[_onopen](er, fd))
  }

  [_onopen] (er, fd) {
    if (this[_defaultFlag] &&
        this[_flags] === 'r+' &&
        er && er.code === 'ENOENT') {
      this[_flags] = 'w'
      this[_open]()
    } else if (er)
      this[_onerror](er)
    else {
      this[_fd] = fd
      this.emit('open', fd)
      this[_flush]()
    }
  }

  end (buf, enc) {
    if (buf)
      this.write(buf, enc)

    this[_ended] = true

    // synthetic after-write logic, where drain/finish live
    if (!this[_writing] && !this[_queue].length &&
        typeof this[_fd] === 'number')
      this[_onwrite](null, 0)
    return this
  }

  write (buf, enc) {
    if (typeof buf === 'string')
      buf = Buffer.from(buf, enc)

    if (this[_ended]) {
      this.emit('error', new Error('write() after end()'))
      return false
    }

    if (this[_fd] === null || this[_writing] || this[_queue].length) {
      this[_queue].push(buf)
      this[_needDrain] = true
      return false
    }

    this[_writing] = true
    this[_write](buf)
    return true
  }

  [_write] (buf) {
    fs.write(this[_fd], buf, 0, buf.length, this[_pos], (er, bw) =>
      this[_onwrite](er, bw))
  }

  [_onwrite] (er, bw) {
    if (er)
      this[_onerror](er)
    else {
      if (this[_pos] !== null)
        this[_pos] += bw
      if (this[_queue].length)
        this[_flush]()
      else {
        this[_writing] = false

        if (this[_ended] && !this[_finished]) {
          this[_finished] = true
          this[_close]()
          this.emit('finish')
        } else if (this[_needDrain]) {
          this[_needDrain] = false
          this.emit('drain')
        }
      }
    }
  }

  [_flush] () {
    if (this[_queue].length === 0) {
      if (this[_ended])
        this[_onwrite](null, 0)
    } else if (this[_queue].length === 1)
      this[_write](this[_queue].pop())
    else {
      const iovec = this[_queue]
      this[_queue] = []
      writev(this[_fd], iovec, this[_pos],
        (er, bw) => this[_onwrite](er, bw))
    }
  }

  [_close] () {
    if (this[_autoClose] && typeof this[_fd] === 'number') {
      const fd = this[_fd]
      this[_fd] = null
      fs.close(fd, er => er ? this.emit('error', er) : this.emit('close'))
    }
  }
}

class WriteStreamSync extends WriteStream {
  [_open] () {
    let fd
    // only wrap in a try{} block if we know we'll retry, to avoid
    // the rethrow obscuring the error's source frame in most cases.
    if (this[_defaultFlag] && this[_flags] === 'r+') {
      try {
        fd = fs.openSync(this[_path], this[_flags], this[_mode])
      } catch (er) {
        if (er.code === 'ENOENT') {
          this[_flags] = 'w'
          return this[_open]()
        } else
          throw er
      }
    } else
      fd = fs.openSync(this[_path], this[_flags], this[_mode])

    this[_onopen](null, fd)
  }

  [_close] () {
    if (this[_autoClose] && typeof this[_fd] === 'number') {
      const fd = this[_fd]
      this[_fd] = null
      fs.closeSync(fd)
      this.emit('close')
    }
  }

  [_write] (buf) {
    // throw the original, but try to close if it fails
    let threw = true
    try {
      this[_onwrite](null,
        fs.writeSync(this[_fd], buf, 0, buf.length, this[_pos]))
      threw = false
    } finally {
      if (threw)
        try { this[_close]() } catch (_) {}
    }
  }
}

exports.ReadStream = ReadStream
exports.ReadStreamSync = ReadStreamSync

exports.WriteStream = WriteStream
exports.WriteStreamSync = WriteStreamSync
{
  "name": "fs-minipass",
  "version": "2.1.0",
  "main": "index.js",
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
  "license": "ISC",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/npm/fs-minipass.git"
  },
  "homepage": "https://github.com/npm/fs-minipass#readme",
  "description": "fs read and write streams based on minipass",
  "dependencies": {
    "minipass": "^3.0.0"
  },
  "devDependencies": {
    "mutate-fs": "^2.0.1",
    "tap": "^14.6.4"
  },
  "files": [
    "index.js"
  ],
  "tap": {
    "check-coverage": true
  },
  "engines": {
    "node": ">= 8"
  }
}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.

----

This library bundles a version of the `fs.realpath` and `fs.realpathSync`
methods from Node.js v0.10 under the terms of the Node.js MIT license.

Node's license follows, also included at the header of `old.js` which contains
the licensed code:

  Copyright Joyent, Inc. and other Node contributors.

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

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

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

var fs = require('fs')
var origRealpath = fs.realpath
var origRealpathSync = fs.realpathSync

var version = process.version
var ok = /^v[0-5]\./.test(version)
var old = require('./old.js')

function newError (er) {
  return er && er.syscall === 'realpath' && (
    er.code === 'ELOOP' ||
    er.code === 'ENOMEM' ||
    er.code === 'ENAMETOOLONG'
  )
}

function realpath (p, cache, cb) {
  if (ok) {
    return origRealpath(p, cache, cb)
  }

  if (typeof cache === 'function') {
    cb = cache
    cache = null
  }
  origRealpath(p, cache, function (er, result) {
    if (newError(er)) {
      old.realpath(p, cache, cb)
    } else {
      cb(er, result)
    }
  })
}

function realpathSync (p, cache) {
  if (ok) {
    return origRealpathSync(p, cache)
  }

  try {
    return origRealpathSync(p, cache)
  } catch (er) {
    if (newError(er)) {
      return old.realpathSync(p, cache)
    } else {
      throw er
    }
  }
}

function monkeypatch () {
  fs.realpath = realpath
  fs.realpathSync = realpathSync
}

function unmonkeypatch () {
  fs.realpath = origRealpath
  fs.realpathSync = origRealpathSync
}
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

var pathModule = require('path');
var isWindows = process.platform === 'win32';
var fs = require('fs');

// JavaScript implementation of realpath, ported from node pre-v6

var DEBUG = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG);

function rethrow() {
  // Only enable in debug mode. A backtrace uses ~1000 bytes of heap space and
  // is fairly slow to generate.
  var callback;
  if (DEBUG) {
    var backtrace = new Error;
    callback = debugCallback;
  } else
    callback = missingCallback;

  return callback;

  function debugCallback(err) {
    if (err) {
      backtrace.message = err.message;
      err = backtrace;
      missingCallback(err);
    }
  }

  function missingCallback(err) {
    if (err) {
      if (process.throwDeprecation)
        throw err;  // Forgot a callback but don't know where? Use NODE_DEBUG=fs
      else if (!process.noDeprecation) {
        var msg = 'fs: missing callback ' + (err.stack || err.message);
        if (process.traceDeprecation)
          console.trace(msg);
        else
          console.error(msg);
      }
    }
  }
}

function maybeCallback(cb) {
  return typeof cb === 'function' ? cb : rethrow();
}

var normalize = pathModule.normalize;

// Regexp that finds the next partion of a (partial) path
// result is [base_with_slash, base], e.g. ['somedir/', 'somedir']
if (isWindows) {
  var nextPartRe = /(.*?)(?:[\/\\]+|$)/g;
} else {
  var nextPartRe = /(.*?)(?:[\/]+|$)/g;
}

// Regex to find the device root, including trailing slash. E.g. 'c:\\'.
if (isWindows) {
  var splitRootRe = /^(?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?[\\\/]*/;
} else {
  var splitRootRe = /^[\/]*/;
}

exports.realpathSync = function realpathSync(p, cache) {
  // make p is absolute
  p = pathModule.resolve(p);

  if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {
    return cache[p];
  }

  var original = p,
      seenLinks = {},
      knownHard = {};

  // current character position in p
  var pos;
  // the partial path so far, including a trailing slash if any
  var current;
  // the partial path without a trailing slash (except when pointing at a root)
  var base;
  // the partial path scanned in the previous round, with slash
  var previous;

  start();

  function start() {
    // Skip over roots
    var m = splitRootRe.exec(p);
    pos = m[0].length;
    current = m[0];
    base = m[0];
    previous = '';

    // On windows, check that the root exists. On unix there is no need.
    if (isWindows && !knownHard[base]) {
      fs.lstatSync(base);
      knownHard[base] = true;
    }
  }

  // walk down the path, swapping out linked pathparts for their real
  // values
  // NB: p.length changes.
  while (pos < p.length) {
    // find the next part
    nextPartRe.lastIndex = pos;
    var result = nextPartRe.exec(p);
    previous = current;
    current += result[0];
    base = previous + result[1];
    pos = nextPartRe.lastIndex;

    // continue if not a symlink
    if (knownHard[base] || (cache && cache[base] === base)) {
      continue;
    }

    var resolvedLink;
    if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {
      // some known symbolic link.  no need to stat again.
      resolvedLink = cache[base];
    } else {
      var stat = fs.lstatSync(base);
      if (!stat.isSymbolicLink()) {
        knownHard[base] = true;
        if (cache) cache[base] = base;
        continue;
      }

      // read the link if it wasn't read before
      // dev/ino always return 0 on windows, so skip the check.
      var linkTarget = null;
      if (!isWindows) {
        var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);
        if (seenLinks.hasOwnProperty(id)) {
          linkTarget = seenLinks[id];
        }
      }
      if (linkTarget === null) {
        fs.statSync(base);
        linkTarget = fs.readlinkSync(base);
      }
      resolvedLink = pathModule.resolve(previous, linkTarget);
      // track this, if given a cache.
      if (cache) cache[base] = resolvedLink;
      if (!isWindows) seenLinks[id] = linkTarget;
    }

    // resolve the link, then start over
    p = pathModule.resolve(resolvedLink, p.slice(pos));
    start();
  }

  if (cache) cache[original] = p;

  return p;
};


exports.realpath = function realpath(p, cache, cb) {
  if (typeof cb !== 'function') {
    cb = maybeCallback(cache);
    cache = null;
  }

  // make p is absolute
  p = pathModule.resolve(p);

  if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {
    return process.nextTick(cb.bind(null, null, cache[p]));
  }

  var original = p,
      seenLinks = {},
      knownHard = {};

  // current character position in p
  var pos;
  // the partial path so far, including a trailing slash if any
  var current;
  // the partial path without a trailing slash (except when pointing at a root)
  var base;
  // the partial path scanned in the previous round, with slash
  var previous;

  start();

  function start() {
    // Skip over roots
    var m = splitRootRe.exec(p);
    pos = m[0].length;
    current = m[0];
    base = m[0];
    previous = '';

    // On windows, check that the root exists. On unix there is no need.
    if (isWindows && !knownHard[base]) {
      fs.lstat(base, function(err) {
        if (err) return cb(err);
        knownHard[base] = true;
        LOOP();
      });
    } else {
      process.nextTick(LOOP);
    }
  }

  // walk down the path, swapping out linked pathparts for their real
  // values
  function LOOP() {
    // stop if scanned past end of path
    if (pos >= p.length) {
      if (cache) cache[original] = p;
      return cb(null, p);
    }

    // find the next part
    nextPartRe.lastIndex = pos;
    var result = nextPartRe.exec(p);
    previous = current;
    current += result[0];
    base = previous + result[1];
    pos = nextPartRe.lastIndex;

    // continue if not a symlink
    if (knownHard[base] || (cache && cache[base] === base)) {
      return process.nextTick(LOOP);
    }

    if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {
      // known symbolic link.  no need to stat again.
      return gotResolvedLink(cache[base]);
    }

    return fs.lstat(base, gotStat);
  }

  function gotStat(err, stat) {
    if (err) return cb(err);

    // if not a symlink, skip to the next path part
    if (!stat.isSymbolicLink()) {
      knownHard[base] = true;
      if (cache) cache[base] = base;
      return process.nextTick(LOOP);
    }

    // stat & read the link if not read before
    // call gotTarget as soon as the link target is known
    // dev/ino always return 0 on windows, so skip the check.
    if (!isWindows) {
      var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);
      if (seenLinks.hasOwnProperty(id)) {
        return gotTarget(null, seenLinks[id], base);
      }
    }
    fs.stat(base, function(err) {
      if (err) return cb(err);

      fs.readlink(base, function(err, target) {
        if (!isWindows) seenLinks[id] = target;
        gotTarget(err, target);
      });
    });
  }

  function gotTarget(err, target, base) {
    if (err) return cb(err);

    var resolvedLink = pathModule.resolve(previous, target);
    if (cache) cache[base] = resolvedLink;
    gotResolvedLink(resolvedLink);
  }

  function gotResolvedLink(resolvedLink) {
    // resolve the link, then start over
    p = pathModule.resolve(resolvedLink, p.slice(pos));
    start();
  }
};
{
  "name": "fs.realpath",
  "version": "1.0.0",
  "description": "Use node's fs.realpath, but fall back to the JS implementation if the native one fails",
  "main": "index.js",
  "dependencies": {},
  "devDependencies": {},
  "repository": {
    "type": "git",
    "url": "git+https://github.com/isaacs/fs.realpath.git"
  },
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
  "license": "ISC",
  "files": [
    "old.js",
    "index.js"
  ]
}root = true

[*]
indent_style = tab
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 120

[CHANGELOG.md]
indent_style = space
indent_size = 2

[*.json]
max_line_length = off

[Makefile]
max_line_length = off
{
	"es3": true,

	"additionalRules": [],

	"requireSemicolons": true,

	"disallowMultipleSpaces": true,

	"disallowIdentifierNames": [],

	"requireCurlyBraces": {
		"allExcept": [],
		"keywords": ["if", "else", "for", "while", "do", "try", "catch"]
	},

	"requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch", "function"],

	"disallowSpaceAfterKeywords": [],

	"disallowSpaceBeforeComma": true,
	"disallowSpaceAfterComma": false,
	"disallowSpaceBeforeSemicolon": true,

	"disallowNodeTypes": [
		"DebuggerStatement",
		"ForInStatement",
		"LabeledStatement",
		"SwitchCase",
		"SwitchStatement",
		"WithStatement"
	],

	"requireObjectKeysOnNewLine": { "allExcept": ["sameLine"] },

	"requireSpacesInAnonymousFunctionExpression": { "beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true },
	"requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true },
	"disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true },
	"requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true },
	"disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true },

	"requireSpaceBetweenArguments": true,

	"disallowSpacesInsideParentheses": true,

	"disallowSpacesInsideArrayBrackets": true,

	"disallowQuotedKeysInObjects": { "allExcept": ["reserved"] },

	"disallowSpaceAfterObjectKeys": true,

	"requireCommaBeforeLineBreak": true,

	"disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
	"requireSpaceAfterPrefixUnaryOperators": [],

	"disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
	"requireSpaceBeforePostfixUnaryOperators": [],

	"disallowSpaceBeforeBinaryOperators": [],
	"requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],

	"requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
	"disallowSpaceAfterBinaryOperators": [],

	"disallowImplicitTypeConversion": ["binary", "string"],

	"disallowKeywords": ["with", "eval"],

	"requireKeywordsOnNewLine": [],
	"disallowKeywordsOnNewLine": ["else"],

	"requireLineFeedAtFileEnd": true,

	"disallowTrailingWhitespace": true,

	"disallowTrailingComma": true,

	"excludeFiles": ["node_modules/**", "vendor/**"],

	"disallowMultipleLineStrings": true,

	"requireDotNotation": { "allExcept": ["keywords"] },

	"requireParenthesesAroundIIFE": true,

	"validateLineBreaks": "LF",

	"validateQuoteMarks": {
		"escape": true,
		"mark": "'"
	},

	"disallowOperatorBeforeLineBreak": [],

	"requireSpaceBeforeKeywords": [
		"do",
		"for",
		"if",
		"else",
		"switch",
		"case",
		"try",
		"catch",
		"finally",
		"while",
		"with",
		"return"
	],

	"validateAlignedFunctionParameters": {
		"lineBreakAfterOpeningBraces": true,
		"lineBreakBeforeClosingBraces": true
	},

	"requirePaddingNewLinesBeforeExport": true,

	"validateNewlineAfterArrayElements": {
		"maximum": 8
	},

	"requirePaddingNewLinesAfterUseStrict": true,

	"disallowArrowFunctions": true,

	"disallowMultiLineTernary": true,

	"validateOrderInObjectKeys": "asc-insensitive",

	"disallowIdenticalDestructuringNames": true,

	"disallowNestedTernaries": { "maxLevel": 1 },

	"requireSpaceAfterComma": { "allExcept": ["trailing"] },
	"requireAlignedMultilineParams": false,

	"requireSpacesInGenerator": {
		"afterStar": true
	},

	"disallowSpacesInGenerator": {
		"beforeStar": true
	},

	"disallowVar": false,

	"requireArrayDestructuring": false,

	"requireEnhancedObjectLiterals": false,

	"requireObjectDestructuring": false,

	"requireEarlyReturn": false,

	"requireCapitalizedConstructorsNew": {
		"allExcept": ["Function", "String", "Object", "Symbol", "Number", "Date", "RegExp", "Error", "Boolean", "Array"]
	},

	"requireImportAlphabetized": false,

    "requireSpaceBeforeObjectValues": true,
    "requireSpaceBeforeDestructuredValues": true,

	"disallowSpacesInsideTemplateStringPlaceholders": true,

    "disallowArrayDestructuringReturn": false,

    "requireNewlineBeforeSingleStatementsInIf": false,

	"disallowUnusedVariables": true,

	"requireSpacesInsideImportedObjectBraces": true,

	"requireUseStrict": true
}

Copyright (c) 2013 Raynos.

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';

/* eslint no-invalid-this: 1 */

var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
var slice = Array.prototype.slice;
var toStr = Object.prototype.toString;
var funcType = '[object Function]';

module.exports = function bind(that) {
    var target = this;
    if (typeof target !== 'function' || toStr.call(target) !== funcType) {
        throw new TypeError(ERROR_MESSAGE + target);
    }
    var args = slice.call(arguments, 1);

    var bound;
    var binder = function () {
        if (this instanceof bound) {
            var result = target.apply(
                this,
                args.concat(slice.call(arguments))
            );
            if (Object(result) === result) {
                return result;
            }
            return this;
        } else {
            return target.apply(
                that,
                args.concat(slice.call(arguments))
            );
        }
    };

    var boundLength = Math.max(0, target.length - args.length);
    var boundArgs = [];
    for (var i = 0; i < boundLength; i++) {
        boundArgs.push('$' + i);
    }

    bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);

    if (target.prototype) {
        var Empty = function Empty() {};
        Empty.prototype = target.prototype;
        bound.prototype = new Empty();
        Empty.prototype = null;
    }

    return bound;
};
'use strict';

var implementation = require('./implementation');

module.exports = Function.prototype.bind || implementation;
{
  "name": "function-bind",
  "version": "1.1.1",
  "description": "Implementation of Function.prototype.bind",
  "author": "Raynos <raynos2@gmail.com>",
  "repository": "git://github.com/Raynos/function-bind.git",
  "main": "index",
  "homepage": "https://github.com/Raynos/function-bind",
  "dependencies": {},
  "devDependencies": {
    "@ljharb/eslint-config": "^12.2.1",
    "covert": "^1.1.0",
    "eslint": "^4.5.0",
    "jscs": "^3.0.7",
    "tape": "^4.8.0"
  },
  "license": "MIT",
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "ie/8..latest",
      "firefox/16..latest",
      "firefox/nightly",
      "chrome/22..latest",
      "chrome/canary",
      "opera/12..latest",
      "opera/next",
      "safari/5.1..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2..latest"
    ]
  }
}root = true

[*]
indent_style = tab
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 150

[CHANGELOG.md]
indent_style = space
indent_size = 2

[*.json]
max_line_length = off

[Makefile]
max_line_length = off
coverage/
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"exclude": [
		"coverage",
		"test"
	]
}
The MIT License (MIT)

Copyright (c) 2016 Jordan Harband

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';

require('./shim')();
'use strict';

var IsCallable = require('es-abstract/2021/IsCallable');
var functionsHaveNames = require('functions-have-names')();
var callBound = require('call-bind/callBound');
var $functionToString = callBound('Function.prototype.toString');
var $stringMatch = callBound('String.prototype.match');

var classRegex = /^class /;

var isClass = function isClassConstructor(fn) {
	if (IsCallable(fn)) {
		return false;
	}
	if (typeof fn !== 'function') {
		return false;
	}
	try {
		var match = $stringMatch($functionToString(fn), classRegex);
		return !!match;
	} catch (e) {}
	return false;
};

var regex = /\s*function\s+([^(\s]*)\s*/;

var functionProto = Function.prototype;

module.exports = function getName() {
	if (!isClass(this) && !IsCallable(this)) {
		throw new TypeError('Function.prototype.name sham getter called on non-function');
	}
	if (functionsHaveNames) {
		return this.name;
	}
	if (this === functionProto) {
		return '';
	}
	var str = $functionToString(this);
	var match = $stringMatch(str, regex);
	var name = match && match[1];
	return name;
};
'use strict';

var define = require('define-properties');
var callBind = require('call-bind');

var implementation = require('./implementation');
var getPolyfill = require('./polyfill');
var shim = require('./shim');

var bound = callBind(implementation);

define(bound, {
	getPolyfill: getPolyfill,
	implementation: implementation,
	shim: shim
});

module.exports = bound;
{
  "name": "function.prototype.name",
  "version": "1.1.5",
  "author": "Jordan Harband <ljharb@gmail.com>",
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "description": "An ES2015 spec-compliant `Function.prototype.name` shim",
  "license": "MIT",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/es-shims/Function.prototype.name.git"
  },
  "dependencies": {
    "call-bind": "^1.0.2",
    "define-properties": "^1.1.3",
    "es-abstract": "^1.19.0",
    "functions-have-names": "^1.2.2"
  },
  "devDependencies": {
    "@es-shims/api": "^2.2.1",
    "@ljharb/eslint-config": "^18.0.0",
    "aud": "^1.1.5",
    "eclint": "^2.8.1",
    "eslint": "^7.32.0",
    "for-each": "^0.3.3",
    "has-strict-mode": "^1.0.1",
    "make-arrow-function": "^1.2.0",
    "make-async-function": "^1.0.0",
    "make-generator-function": "^2.0.0",
    "nyc": "^10.3.2",
    "safe-publish-latest": "^1.1.4",
    "tape": "^5.3.1",
    "uglify-register": "^1.0.1"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/9.0..latest",
      "firefox/4.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/11.6..latest",
      "opera/next",
      "safari/5.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "engines": {
    "node": ">= 0.4"
  }
}'use strict';

var implementation = require('./implementation');

module.exports = function getPolyfill() {
	return implementation;
};
'use strict';

var supportsDescriptors = require('define-properties').supportsDescriptors;
var functionsHaveNames = require('functions-have-names')();
var getPolyfill = require('./polyfill');
var defineProperty = Object.defineProperty;
var TypeErr = TypeError;

module.exports = function shimName() {
	var polyfill = getPolyfill();
	if (functionsHaveNames) {
		return polyfill;
	}
	if (!supportsDescriptors) {
		throw new TypeErr('Shimming Function.prototype.name support requires ES5 property descriptor support.');
	}
	var functionProto = Function.prototype;
	defineProperty(functionProto, 'name', {
		configurable: true,
		enumerable: false,
		get: function () {
			var name = polyfill.call(this);
			if (this !== functionProto) {
				defineProperty(this, 'name', {
					configurable: true,
					enumerable: false,
					value: name,
					writable: false
				});
			}
			return name;
		}
	});
	return polyfill;
};
'use strict';

module.exports = require('functions-have-names')();

// TODO: semver-major, remove
# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/function.prototype.name
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
root = true

[*]
indent_style = tab
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 150

[CHANGELOG.md]
indent_style = space
indent_size = 2

[*.json]
max_line_length = off

[Makefile]
max_line_length = off
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"exclude": [
		"coverage",
		"test"
	]
}
MIT License

Copyright (c) 2019 Jordan Harband

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 functionsHaveNames = function functionsHaveNames() {
	return typeof function f() {}.name === 'string';
};

var gOPD = Object.getOwnPropertyDescriptor;
if (gOPD) {
	try {
		gOPD([], 'length');
	} catch (e) {
		// IE 8 has a broken gOPD
		gOPD = null;
	}
}

functionsHaveNames.functionsHaveConfigurableNames = function functionsHaveConfigurableNames() {
	if (!functionsHaveNames() || !gOPD) {
		return false;
	}
	var desc = gOPD(function () {}, 'name');
	return !!desc && !!desc.configurable;
};

var $bind = Function.prototype.bind;

functionsHaveNames.boundFunctionsHaveNames = function boundFunctionsHaveNames() {
	return functionsHaveNames() && typeof $bind === 'function' && function f() {}.bind().name !== '';
};

module.exports = functionsHaveNames;
{
  "name": "functions-have-names",
  "version": "1.2.3",
  "description": "Does this JS environment support the `name` property on functions?",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/inspect-js/functions-have-names.git"
  },
  "author": "Jordan Harband <ljharb@gmail.com>",
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "license": "MIT",
  "homepage": "https://github.com/inspect-js/functions-have-names#readme",
  "devDependencies": {
    "@ljharb/eslint-config": "^21.0.0",
    "aud": "^2.0.0",
    "auto-changelog": "^2.4.0",
    "eslint": "=8.8.0",
    "nyc": "^10.3.2",
    "safe-publish-latest": "^2.0.0",
    "tape": "^5.5.3"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false,
    "hideCredit": true
  }
}# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/functions-have-names
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
<!-- This file is automatically added by @npmcli/template-oss. Do not edit. -->

ISC License

Copyright npm, Inc.

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 NPM DISCLAIMS ALL
WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
EVENT SHALL NPM 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.
{
  "name": "gauge",
  "version": "4.0.4",
  "description": "A terminal based horizontal gauge",
  "main": "lib",
  "repository": {
    "type": "git",
    "url": "https://github.com/npm/gauge.git"
  },
  "author": "GitHub Inc.",
  "license": "ISC",
  "homepage": "https://github.com/npm/gauge",
  "dependencies": {
    "aproba": "^1.0.3 || ^2.0.0",
    "color-support": "^1.1.3",
    "console-control-strings": "^1.1.0",
    "has-unicode": "^2.0.1",
    "signal-exit": "^3.0.7",
    "string-width": "^4.2.3",
    "strip-ansi": "^6.0.1",
    "wide-align": "^1.1.5"
  },
  "devDependencies": {
    "@npmcli/eslint-config": "^3.0.1",
    "@npmcli/template-oss": "3.2.0",
    "readable-stream": "^3.6.0",
    "tap": "^16.0.1"
  },
  "files": [
    "bin/",
    "lib/"
  ],
  "engines": {
    "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
  },
  "tap": {
    "branches": 79,
    "statements": 89,
    "functions": 92,
    "lines": 90
  },
  "templateOSS": {
    "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    "version": "3.2.0"
  }
}'use strict'
var spin = require('./spin.js')
var progressBar = require('./progress-bar.js')

module.exports = {
  activityIndicator: function (values, theme, width) {
    if (values.spun == null) {
      return
    }
    return spin(theme, values.spun)
  },
  progressbar: function (values, theme, width) {
    if (values.completed == null) {
      return
    }
    return progressBar(theme, width, values.completed)
  },
}
'use strict'
var util = require('util')

var User = exports.User = function User (msg) {
  var err = new Error(msg)
  Error.captureStackTrace(err, User)
  err.code = 'EGAUGE'
  return err
}

exports.MissingTemplateValue = function MissingTemplateValue (item, values) {
  var err = new User(util.format('Missing template value "%s"', item.type))
  Error.captureStackTrace(err, MissingTemplateValue)
  err.template = item
  err.values = values
  return err
}

exports.Internal = function Internal (msg) {
  var err = new Error(msg)
  Error.captureStackTrace(err, Internal)
  err.code = 'EGAUGEINTERNAL'
  return err
}
'use strict'
var colorSupport = require('color-support')

module.exports = colorSupport().hasBasic
'use strict'
var Plumbing = require('./plumbing.js')
var hasUnicode = require('has-unicode')
var hasColor = require('./has-color.js')
var onExit = require('signal-exit')
var defaultThemes = require('./themes')
var setInterval = require('./set-interval.js')
var process = require('./process.js')
var setImmediate = require('./set-immediate')

module.exports = Gauge

function callWith (obj, method) {
  return function () {
    return method.call(obj)
  }
}

function Gauge (arg1, arg2) {
  var options, writeTo
  if (arg1 && arg1.write) {
    writeTo = arg1
    options = arg2 || {}
  } else if (arg2 && arg2.write) {
    writeTo = arg2
    options = arg1 || {}
  } else {
    writeTo = process.stderr
    options = arg1 || arg2 || {}
  }

  this._status = {
    spun: 0,
    section: '',
    subsection: '',
  }
  this._paused = false // are we paused for back pressure?
  this._disabled = true // are all progress bar updates disabled?
  this._showing = false // do we WANT the progress bar on screen
  this._onScreen = false // IS the progress bar on screen
  this._needsRedraw = false // should we print something at next tick?
  this._hideCursor = options.hideCursor == null ? true : options.hideCursor
  this._fixedFramerate = options.fixedFramerate == null
    ? !(/^v0\.8\./.test(process.version))
    : options.fixedFramerate
  this._lastUpdateAt = null
  this._updateInterval = options.updateInterval == null ? 50 : options.updateInterval

  this._themes = options.themes || defaultThemes
  this._theme = options.theme
  var theme = this._computeTheme(options.theme)
  var template = options.template || [
    { type: 'progressbar', length: 20 },
    { type: 'activityIndicator', kerning: 1, length: 1 },
    { type: 'section', kerning: 1, default: '' },
    { type: 'subsection', kerning: 1, default: '' },
  ]
  this.setWriteTo(writeTo, options.tty)
  var PlumbingClass = options.Plumbing || Plumbing
  this._gauge = new PlumbingClass(theme, template, this.getWidth())

  this._$$doRedraw = callWith(this, this._doRedraw)
  this._$$handleSizeChange = callWith(this, this._handleSizeChange)

  this._cleanupOnExit = options.cleanupOnExit == null || options.cleanupOnExit
  this._removeOnExit = null

  if (options.enabled || (options.enabled == null && this._tty && this._tty.isTTY)) {
    this.enable()
  } else {
    this.disable()
  }
}
Gauge.prototype = {}

Gauge.prototype.isEnabled = function () {
  return !this._disabled
}

Gauge.prototype.setTemplate = function (template) {
  this._gauge.setTemplate(template)
  if (this._showing) {
    this._requestRedraw()
  }
}

Gauge.prototype._computeTheme = function (theme) {
  if (!theme) {
    theme = {}
  }
  if (typeof theme === 'string') {
    theme = this._themes.getTheme(theme)
  } else if (
    Object.keys(theme).length === 0 || theme.hasUnicode != null || theme.hasColor != null
  ) {
    var useUnicode = theme.hasUnicode == null ? hasUnicode() : theme.hasUnicode
    var useColor = theme.hasColor == null ? hasColor : theme.hasColor
    theme = this._themes.getDefault({
      hasUnicode: useUnicode,
      hasColor: useColor,
      platform: theme.platform,
    })
  }
  return theme
}

Gauge.prototype.setThemeset = function (themes) {
  this._themes = themes
  this.setTheme(this._theme)
}

Gauge.prototype.setTheme = function (theme) {
  this._gauge.setTheme(this._computeTheme(theme))
  if (this._showing) {
    this._requestRedraw()
  }
  this._theme = theme
}

Gauge.prototype._requestRedraw = function () {
  this._needsRedraw = true
  if (!this._fixedFramerate) {
    this._doRedraw()
  }
}

Gauge.prototype.getWidth = function () {
  return ((this._tty && this._tty.columns) || 80) - 1
}

Gauge.prototype.setWriteTo = function (writeTo, tty) {
  var enabled = !this._disabled
  if (enabled) {
    this.disable()
  }
  this._writeTo = writeTo
  this._tty = tty ||
    (writeTo === process.stderr && process.stdout.isTTY && process.stdout) ||
    (writeTo.isTTY && writeTo) ||
    this._tty
  if (this._gauge) {
    this._gauge.setWidth(this.getWidth())
  }
  if (enabled) {
    this.enable()
  }
}

Gauge.prototype.enable = function () {
  if (!this._disabled) {
    return
  }
  this._disabled = false
  if (this._tty) {
    this._enableEvents()
  }
  if (this._showing) {
    this.show()
  }
}

Gauge.prototype.disable = function () {
  if (this._disabled) {
    return
  }
  if (this._showing) {
    this._lastUpdateAt = null
    this._showing = false
    this._doRedraw()
    this._showing = true
  }
  this._disabled = true
  if (this._tty) {
    this._disableEvents()
  }
}

Gauge.prototype._enableEvents = function () {
  if (this._cleanupOnExit) {
    this._removeOnExit = onExit(callWith(this, this.disable))
  }
  this._tty.on('resize', this._$$handleSizeChange)
  if (this._fixedFramerate) {
    this.redrawTracker = setInterval(this._$$doRedraw, this._updateInterval)
    if (this.redrawTracker.unref) {
      this.redrawTracker.unref()
    }
  }
}

Gauge.prototype._disableEvents = function () {
  this._tty.removeListener('resize', this._$$handleSizeChange)
  if (this._fixedFramerate) {
    clearInterval(this.redrawTracker)
  }
  if (this._removeOnExit) {
    this._removeOnExit()
  }
}

Gauge.prototype.hide = function (cb) {
  if (this._disabled) {
    return cb && process.nextTick(cb)
  }
  if (!this._showing) {
    return cb && process.nextTick(cb)
  }
  this._showing = false
  this._doRedraw()
  cb && setImmediate(cb)
}

Gauge.prototype.show = function (section, completed) {
  this._showing = true
  if (typeof section === 'string') {
    this._status.section = section
  } else if (typeof section === 'object') {
    var sectionKeys = Object.keys(section)
    for (var ii = 0; ii < sectionKeys.length; ++ii) {
      var key = sectionKeys[ii]
      this._status[key] = section[key]
    }
  }
  if (completed != null) {
    this._status.completed = completed
  }
  if (this._disabled) {
    return
  }
  this._requestRedraw()
}

Gauge.prototype.pulse = function (subsection) {
  this._status.subsection = subsection || ''
  this._status.spun++
  if (this._disabled) {
    return
  }
  if (!this._showing) {
    return
  }
  this._requestRedraw()
}

Gauge.prototype._handleSizeChange = function () {
  this._gauge.setWidth(this._tty.columns - 1)
  this._requestRedraw()
}

Gauge.prototype._doRedraw = function () {
  if (this._disabled || this._paused) {
    return
  }
  if (!this._fixedFramerate) {
    var now = Date.now()
    if (this._lastUpdateAt && now - this._lastUpdateAt < this._updateInterval) {
      return
    }
    this._lastUpdateAt = now
  }
  if (!this._showing && this._onScreen) {
    this._onScreen = false
    var result = this._gauge.hide()
    if (this._hideCursor) {
      result += this._gauge.showCursor()
    }
    return this._writeTo.write(result)
  }
  if (!this._showing && !this._onScreen) {
    return
  }
  if (this._showing && !this._onScreen) {
    this._onScreen = true
    this._needsRedraw = true
    if (this._hideCursor) {
      this._writeTo.write(this._gauge.hideCursor())
    }
  }
  if (!this._needsRedraw) {
    return
  }
  if (!this._writeTo.write(this._gauge.show(this._status))) {
    this._paused = true
    this._writeTo.on('drain', callWith(this, function () {
      this._paused = false
      this._doRedraw()
    }))
  }
}
'use strict'
var consoleControl = require('console-control-strings')
var renderTemplate = require('./render-template.js')
var validate = require('aproba')

var Plumbing = module.exports = function (theme, template, width) {
  if (!width) {
    width = 80
  }
  validate('OAN', [theme, template, width])
  this.showing = false
  this.theme = theme
  this.width = width
  this.template = template
}
Plumbing.prototype = {}

Plumbing.prototype.setTheme = function (theme) {
  validate('O', [theme])
  this.theme = theme
}

Plumbing.prototype.setTemplate = function (template) {
  validate('A', [template])
  this.template = template
}

Plumbing.prototype.setWidth = function (width) {
  validate('N', [width])
  this.width = width
}

Plumbing.prototype.hide = function () {
  return consoleControl.gotoSOL() + consoleControl.eraseLine()
}

Plumbing.prototype.hideCursor = consoleControl.hideCursor

Plumbing.prototype.showCursor = consoleControl.showCursor

Plumbing.prototype.show = function (status) {
  var values = Object.create(this.theme)
  for (var key in status) {
    values[key] = status[key]
  }

  return renderTemplate(this.width, this.template, values).trim() +
         consoleControl.color('reset') +
         consoleControl.eraseLine() + consoleControl.gotoSOL()
}
'use strict'
// this exists so we can replace it during testing
module.exports = process
'use strict'
var validate = require('aproba')
var renderTemplate = require('./render-template.js')
var wideTruncate = require('./wide-truncate')
var stringWidth = require('string-width')

module.exports = function (theme, width, completed) {
  validate('ONN', [theme, width, completed])
  if (completed < 0) {
    completed = 0
  }
  if (completed > 1) {
    completed = 1
  }
  if (width <= 0) {
    return ''
  }
  var sofar = Math.round(width * completed)
  var rest = width - sofar
  var template = [
    { type: 'complete', value: repeat(theme.complete, sofar), length: sofar },
    { type: 'remaining', value: repeat(theme.remaining, rest), length: rest },
  ]
  return renderTemplate(width, template, theme)
}

// lodash's way of repeating
function repeat (string, width) {
  var result = ''
  var n = width
  do {
    if (n % 2) {
      result += string
    }
    n = Math.floor(n / 2)
    /* eslint no-self-assign: 0 */
    string += string
  } while (n && stringWidth(result) < width)

  return wideTruncate(result, width)
}
'use strict'
var align = require('wide-align')
var validate = require('aproba')
var wideTruncate = require('./wide-truncate')
var error = require('./error')
var TemplateItem = require('./template-item')

function renderValueWithValues (values) {
  return function (item) {
    return renderValue(item, values)
  }
}

var renderTemplate = module.exports = function (width, template, values) {
  var items = prepareItems(width, template, values)
  var rendered = items.map(renderValueWithValues(values)).join('')
  return align.left(wideTruncate(rendered, width), width)
}

function preType (item) {
  var cappedTypeName = item.type[0].toUpperCase() + item.type.slice(1)
  return 'pre' + cappedTypeName
}

function postType (item) {
  var cappedTypeName = item.type[0].toUpperCase() + item.type.slice(1)
  return 'post' + cappedTypeName
}

function hasPreOrPost (item, values) {
  if (!item.type) {
    return
  }
  return values[preType(item)] || values[postType(item)]
}

function generatePreAndPost (baseItem, parentValues) {
  var item = Object.assign({}, baseItem)
  var values = Object.create(parentValues)
  var template = []
  var pre = preType(item)
  var post = postType(item)
  if (values[pre]) {
    template.push({ value: values[pre] })
    values[pre] = null
  }
  item.minLength = null
  item.length = null
  item.maxLength = null
  template.push(item)
  values[item.type] = values[item.type]
  if (values[post]) {
    template.push({ value: values[post] })
    values[post] = null
  }
  return function ($1, $2, length) {
    return renderTemplate(length, template, values)
  }
}

function prepareItems (width, template, values) {
  function cloneAndObjectify (item, index, arr) {
    var cloned = new TemplateItem(item, width)
    var type = cloned.type
    if (cloned.value == null) {
      if (!(type in values)) {
        if (cloned.default == null) {
          throw new error.MissingTemplateValue(cloned, values)
        } else {
          cloned.value = cloned.default
        }
      } else {
        cloned.value = values[type]
      }
    }
    if (cloned.value == null || cloned.value === '') {
      return null
    }
    cloned.index = index
    cloned.first = index === 0
    cloned.last = index === arr.length - 1
    if (hasPreOrPost(cloned, values)) {
      cloned.value = generatePreAndPost(cloned, values)
    }
    return cloned
  }

  var output = template.map(cloneAndObjectify).filter(function (item) {
    return item != null
  })

  var remainingSpace = width
  var variableCount = output.length

  function consumeSpace (length) {
    if (length > remainingSpace) {
      length = remainingSpace
    }
    remainingSpace -= length
  }

  function finishSizing (item, length) {
    if (item.finished) {
      throw new error.Internal('Tried to finish template item that was already finished')
    }
    if (length === Infinity) {
      throw new error.Internal('Length of template item cannot be infinity')
    }
    if (length != null) {
      item.length = length
    }
    item.minLength = null
    item.maxLength = null
    --variableCount
    item.finished = true
    if (item.length == null) {
      item.length = item.getBaseLength()
    }
    if (item.length == null) {
      throw new error.Internal('Finished template items must have a length')
    }
    consumeSpace(item.getLength())
  }

  output.forEach(function (item) {
    if (!item.kerning) {
      return
    }
    var prevPadRight = item.first ? 0 : output[item.index - 1].padRight
    if (!item.first && prevPadRight < item.kerning) {
      item.padLeft = item.kerning - prevPadRight
    }
    if (!item.last) {
      item.padRight = item.kerning
    }
  })

  // Finish any that have a fixed (literal or intuited) length
  output.forEach(function (item) {
    if (item.getBaseLength() == null) {
      return
    }
    finishSizing(item)
  })

  var resized = 0
  var resizing
  var hunkSize
  do {
    resizing = false
    hunkSize = Math.round(remainingSpace / variableCount)
    output.forEach(function (item) {
      if (item.finished) {
        return
      }
      if (!item.maxLength) {
        return
      }
      if (item.getMaxLength() < hunkSize) {
        finishSizing(item, item.maxLength)
        resizing = true
      }
    })
  } while (resizing && resized++ < output.length)
  if (resizing) {
    throw new error.Internal('Resize loop iterated too many times while determining maxLength')
  }

  resized = 0
  do {
    resizing = false
    hunkSize = Math.round(remainingSpace / variableCount)
    output.forEach(function (item) {
      if (item.finished) {
        return
      }
      if (!item.minLength) {
        return
      }
      if (item.getMinLength() >= hunkSize) {
        finishSizing(item, item.minLength)
        resizing = true
      }
    })
  } while (resizing && resized++ < output.length)
  if (resizing) {
    throw new error.Internal('Resize loop iterated too many times while determining minLength')
  }

  hunkSize = Math.round(remainingSpace / variableCount)
  output.forEach(function (item) {
    if (item.finished) {
      return
    }
    finishSizing(item, hunkSize)
  })

  return output
}

function renderFunction (item, values, length) {
  validate('OON', arguments)
  if (item.type) {
    return item.value(values, values[item.type + 'Theme'] || {}, length)
  } else {
    return item.value(values, {}, length)
  }
}

function renderValue (item, values) {
  var length = item.getBaseLength()
  var value = typeof item.value === 'function' ? renderFunction(item, values, length) : item.value
  if (value == null || value === '') {
    return ''
  }
  var alignWith = align[item.align] || align.left
  var leftPadding = item.padLeft ? align.left('', item.padLeft) : ''
  var rightPadding = item.padRight ? align.right('', item.padRight) : ''
  var truncated = wideTruncate(String(value), length)
  var aligned = alignWith(truncated, length)
  return leftPadding + aligned + rightPadding
}
'use strict'
var process = require('./process')
try {
  module.exports = setImmediate
} catch (ex) {
  module.exports = process.nextTick
}
'use strict'
// this exists so we can replace it during testing
module.exports = setInterval
'use strict'

module.exports = function spin (spinstr, spun) {
  return spinstr[spun % spinstr.length]
}
'use strict'
var stringWidth = require('string-width')

module.exports = TemplateItem

function isPercent (num) {
  if (typeof num !== 'string') {
    return false
  }
  return num.slice(-1) === '%'
}

function percent (num) {
  return Number(num.slice(0, -1)) / 100
}

function TemplateItem (values, outputLength) {
  this.overallOutputLength = outputLength
  this.finished = false
  this.type = null
  this.value = null
  this.length = null
  this.maxLength = null
  this.minLength = null
  this.kerning = null
  this.align = 'left'
  this.padLeft = 0
  this.padRight = 0
  this.index = null
  this.first = null
  this.last = null
  if (typeof values === 'string') {
    this.value = values
  } else {
    for (var prop in values) {
      this[prop] = values[prop]
    }
  }
  // Realize percents
  if (isPercent(this.length)) {
    this.length = Math.round(this.overallOutputLength * percent(this.length))
  }
  if (isPercent(this.minLength)) {
    this.minLength = Math.round(this.overallOutputLength * percent(this.minLength))
  }
  if (isPercent(this.maxLength)) {
    this.maxLength = Math.round(this.overallOutputLength * percent(this.maxLength))
  }
  return this
}

TemplateItem.prototype = {}

TemplateItem.prototype.getBaseLength = function () {
  var length = this.length
  if (
    length == null &&
    typeof this.value === 'string' &&
    this.maxLength == null &&
    this.minLength == null
  ) {
    length = stringWidth(this.value)
  }
  return length
}

TemplateItem.prototype.getLength = function () {
  var length = this.getBaseLength()
  if (length == null) {
    return null
  }
  return length + this.padLeft + this.padRight
}

TemplateItem.prototype.getMaxLength = function () {
  if (this.maxLength == null) {
    return null
  }
  return this.maxLength + this.padLeft + this.padRight
}

TemplateItem.prototype.getMinLength = function () {
  if (this.minLength == null) {
    return null
  }
  return this.minLength + this.padLeft + this.padRight
}
'use strict'

module.exports = function () {
  return ThemeSetProto.newThemeSet()
}

var ThemeSetProto = {}

ThemeSetProto.baseTheme = require('./base-theme.js')

ThemeSetProto.newTheme = function (parent, theme) {
  if (!theme) {
    theme = parent
    parent = this.baseTheme
  }
  return Object.assign({}, parent, theme)
}

ThemeSetProto.getThemeNames = function () {
  return Object.keys(this.themes)
}

ThemeSetProto.addTheme = function (name, parent, theme) {
  this.themes[name] = this.newTheme(parent, theme)
}

ThemeSetProto.addToAllThemes = function (theme) {
  var themes = this.themes
  Object.keys(themes).forEach(function (name) {
    Object.assign(themes[name], theme)
  })
  Object.assign(this.baseTheme, theme)
}

ThemeSetProto.getTheme = function (name) {
  if (!this.themes[name]) {
    throw this.newMissingThemeError(name)
  }
  return this.themes[name]
}

ThemeSetProto.setDefault = function (opts, name) {
  if (name == null) {
    name = opts
    opts = {}
  }
  var platform = opts.platform == null ? 'fallback' : opts.platform
  var hasUnicode = !!opts.hasUnicode
  var hasColor = !!opts.hasColor
  if (!this.defaults[platform]) {
    this.defaults[platform] = { true: {}, false: {} }
  }
  this.defaults[platform][hasUnicode][hasColor] = name
}

ThemeSetProto.getDefault = function (opts) {
  if (!opts) {
    opts = {}
  }
  var platformName = opts.platform || process.platform
  var platform = this.defaults[platformName] || this.defaults.fallback
  var hasUnicode = !!opts.hasUnicode
  var hasColor = !!opts.hasColor
  if (!platform) {
    throw this.newMissingDefaultThemeError(platformName, hasUnicode, hasColor)
  }
  if (!platform[hasUnicode][hasColor]) {
    if (hasUnicode && hasColor && platform[!hasUnicode][hasColor]) {
      hasUnicode = false
    } else if (hasUnicode && hasColor && platform[hasUnicode][!hasColor]) {
      hasColor = false
    } else if (hasUnicode && hasColor && platform[!hasUnicode][!hasColor]) {
      hasUnicode = false
      hasColor = false
    } else if (hasUnicode && !hasColor && platform[!hasUnicode][hasColor]) {
      hasUnicode = false
    } else if (!hasUnicode && hasColor && platform[hasUnicode][!hasColor]) {
      hasColor = false
    } else if (platform === this.defaults.fallback) {
      throw this.newMissingDefaultThemeError(platformName, hasUnicode, hasColor)
    }
  }
  if (platform[hasUnicode][hasColor]) {
    return this.getTheme(platform[hasUnicode][hasColor])
  } else {
    return this.getDefault(Object.assign({}, opts, { platform: 'fallback' }))
  }
}

ThemeSetProto.newMissingThemeError = function newMissingThemeError (name) {
  var err = new Error('Could not find a gauge theme named "' + name + '"')
  Error.captureStackTrace.call(err, newMissingThemeError)
  err.theme = name
  err.code = 'EMISSINGTHEME'
  return err
}

ThemeSetProto.newMissingDefaultThemeError =
  function newMissingDefaultThemeError (platformName, hasUnicode, hasColor) {
    var err = new Error(
      'Could not find a gauge theme for your platform/unicode/color use combo:\n' +
    '    platform = ' + platformName + '\n' +
    '    hasUnicode = ' + hasUnicode + '\n' +
    '    hasColor = ' + hasColor)
    Error.captureStackTrace.call(err, newMissingDefaultThemeError)
    err.platform = platformName
    err.hasUnicode = hasUnicode
    err.hasColor = hasColor
    err.code = 'EMISSINGTHEME'
    return err
  }

ThemeSetProto.newThemeSet = function () {
  var themeset = function (opts) {
    return themeset.getDefault(opts)
  }
  return Object.assign(themeset, ThemeSetProto, {
    themes: Object.assign({}, this.themes),
    baseTheme: Object.assign({}, this.baseTheme),
    defaults: JSON.parse(JSON.stringify(this.defaults || {})),
  })
}
'use strict'
var color = require('console-control-strings').color
var ThemeSet = require('./theme-set.js')

var themes = module.exports = new ThemeSet()

themes.addTheme('ASCII', {
  preProgressbar: '[',
  postProgressbar: ']',
  progressbarTheme: {
    complete: '#',
    remaining: '.',
  },
  activityIndicatorTheme: '-\\|/',
  preSubsection: '>',
})

themes.addTheme('colorASCII', themes.getTheme('ASCII'), {
  progressbarTheme: {
    preComplete: color('bgBrightWhite', 'brightWhite'),
    complete: '#',
    postComplete: color('reset'),
    preRemaining: color('bgBrightBlack', 'brightBlack'),
    remaining: '.',
    postRemaining: color('reset'),
  },
})

themes.addTheme('brailleSpinner', {
  preProgressbar: '(',
  postProgressbar: ')',
  progressbarTheme: {
    complete: '#',
    remaining: '⠂',
  },
  activityIndicatorTheme: '⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏',
  preSubsection: '>',
})

themes.addTheme('colorBrailleSpinner', themes.getTheme('brailleSpinner'), {
  progressbarTheme: {
    preComplete: color('bgBrightWhite', 'brightWhite'),
    complete: '#',
    postComplete: color('reset'),
    preRemaining: color('bgBrightBlack', 'brightBlack'),
    remaining: '⠂',
    postRemaining: color('reset'),
  },
})

themes.setDefault({}, 'ASCII')
themes.setDefault({ hasColor: true }, 'colorASCII')
themes.setDefault({ platform: 'darwin', hasUnicode: true }, 'brailleSpinner')
themes.setDefault({ platform: 'darwin', hasUnicode: true, hasColor: true }, 'colorBrailleSpinner')
themes.setDefault({ platform: 'linux', hasUnicode: true }, 'brailleSpinner')
themes.setDefault({ platform: 'linux', hasUnicode: true, hasColor: true }, 'colorBrailleSpinner')
'use strict'
var stringWidth = require('string-width')
var stripAnsi = require('strip-ansi')

module.exports = wideTruncate

function wideTruncate (str, target) {
  if (stringWidth(str) === 0) {
    return str
  }
  if (target <= 0) {
    return ''
  }
  if (stringWidth(str) <= target) {
    return str
  }

  // We compute the number of bytes of ansi sequences here and add
  // that to our initial truncation to ensure that we don't slice one
  // that we want to keep in half.
  var noAnsi = stripAnsi(str)
  var ansiSize = str.length + noAnsi.length
  var truncated = str.slice(0, target + ansiSize)

  // we have to shrink the result to account for our ansi sequence buffer
  // (if an ansi sequence was truncated) and double width characters.
  while (stringWidth(truncated) > target) {
    truncated = truncated.slice(0, -1)
  }
  return truncated
}
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"exclude": [
		"coverage",
		"test"
	]
}
MIT License

Copyright (c) 2020 Jordan Harband

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 undefined;

var $SyntaxError = SyntaxError;
var $Function = Function;
var $TypeError = TypeError;

// eslint-disable-next-line consistent-return
var getEvalledConstructor = function (expressionSyntax) {
	try {
		return $Function('"use strict"; return (' + expressionSyntax + ').constructor;')();
	} catch (e) {}
};

var $gOPD = Object.getOwnPropertyDescriptor;
if ($gOPD) {
	try {
		$gOPD({}, '');
	} catch (e) {
		$gOPD = null; // this is IE 8, which has a broken gOPD
	}
}

var throwTypeError = function () {
	throw new $TypeError();
};
var ThrowTypeError = $gOPD
	? (function () {
		try {
			// eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties
			arguments.callee; // IE 8 does not throw here
			return throwTypeError;
		} catch (calleeThrows) {
			try {
				// IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '')
				return $gOPD(arguments, 'callee').get;
			} catch (gOPDthrows) {
				return throwTypeError;
			}
		}
	}())
	: throwTypeError;

var hasSymbols = require('has-symbols')();

var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto

var needsEval = {};

var TypedArray = typeof Uint8Array === 'undefined' ? undefined : getProto(Uint8Array);

var INTRINSICS = {
	'%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError,
	'%Array%': Array,
	'%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,
	'%ArrayIteratorPrototype%': hasSymbols ? getProto([][Symbol.iterator]()) : undefined,
	'%AsyncFromSyncIteratorPrototype%': undefined,
	'%AsyncFunction%': needsEval,
	'%AsyncGenerator%': needsEval,
	'%AsyncGeneratorFunction%': needsEval,
	'%AsyncIteratorPrototype%': needsEval,
	'%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,
	'%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt,
	'%Boolean%': Boolean,
	'%DataView%': typeof DataView === 'undefined' ? undefined : DataView,
	'%Date%': Date,
	'%decodeURI%': decodeURI,
	'%decodeURIComponent%': decodeURIComponent,
	'%encodeURI%': encodeURI,
	'%encodeURIComponent%': encodeURIComponent,
	'%Error%': Error,
	'%eval%': eval, // eslint-disable-line no-eval
	'%EvalError%': EvalError,
	'%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,
	'%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,
	'%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry,
	'%Function%': $Function,
	'%GeneratorFunction%': needsEval,
	'%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,
	'%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,
	'%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,
	'%isFinite%': isFinite,
	'%isNaN%': isNaN,
	'%IteratorPrototype%': hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined,
	'%JSON%': typeof JSON === 'object' ? JSON : undefined,
	'%Map%': typeof Map === 'undefined' ? undefined : Map,
	'%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols ? undefined : getProto(new Map()[Symbol.iterator]()),
	'%Math%': Math,
	'%Number%': Number,
	'%Object%': Object,
	'%parseFloat%': parseFloat,
	'%parseInt%': parseInt,
	'%Promise%': typeof Promise === 'undefined' ? undefined : Promise,
	'%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,
	'%RangeError%': RangeError,
	'%ReferenceError%': ReferenceError,
	'%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,
	'%RegExp%': RegExp,
	'%Set%': typeof Set === 'undefined' ? undefined : Set,
	'%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols ? undefined : getProto(new Set()[Symbol.iterator]()),
	'%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,
	'%String%': String,
	'%StringIteratorPrototype%': hasSymbols ? getProto(''[Symbol.iterator]()) : undefined,
	'%Symbol%': hasSymbols ? Symbol : undefined,
	'%SyntaxError%': $SyntaxError,
	'%ThrowTypeError%': ThrowTypeError,
	'%TypedArray%': TypedArray,
	'%TypeError%': $TypeError,
	'%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,
	'%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,
	'%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,
	'%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,
	'%URIError%': URIError,
	'%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,
	'%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef,
	'%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet
};

var doEval = function doEval(name) {
	var value;
	if (name === '%AsyncFunction%') {
		value = getEvalledConstructor('async function () {}');
	} else if (name === '%GeneratorFunction%') {
		value = getEvalledConstructor('function* () {}');
	} else if (name === '%AsyncGeneratorFunction%') {
		value = getEvalledConstructor('async function* () {}');
	} else if (name === '%AsyncGenerator%') {
		var fn = doEval('%AsyncGeneratorFunction%');
		if (fn) {
			value = fn.prototype;
		}
	} else if (name === '%AsyncIteratorPrototype%') {
		var gen = doEval('%AsyncGenerator%');
		if (gen) {
			value = getProto(gen.prototype);
		}
	}

	INTRINSICS[name] = value;

	return value;
};

var LEGACY_ALIASES = {
	'%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'],
	'%ArrayPrototype%': ['Array', 'prototype'],
	'%ArrayProto_entries%': ['Array', 'prototype', 'entries'],
	'%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'],
	'%ArrayProto_keys%': ['Array', 'prototype', 'keys'],
	'%ArrayProto_values%': ['Array', 'prototype', 'values'],
	'%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'],
	'%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'],
	'%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'],
	'%BooleanPrototype%': ['Boolean', 'prototype'],
	'%DataViewPrototype%': ['DataView', 'prototype'],
	'%DatePrototype%': ['Date', 'prototype'],
	'%ErrorPrototype%': ['Error', 'prototype'],
	'%EvalErrorPrototype%': ['EvalError', 'prototype'],
	'%Float32ArrayPrototype%': ['Float32Array', 'prototype'],
	'%Float64ArrayPrototype%': ['Float64Array', 'prototype'],
	'%FunctionPrototype%': ['Function', 'prototype'],
	'%Generator%': ['GeneratorFunction', 'prototype'],
	'%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'],
	'%Int8ArrayPrototype%': ['Int8Array', 'prototype'],
	'%Int16ArrayPrototype%': ['Int16Array', 'prototype'],
	'%Int32ArrayPrototype%': ['Int32Array', 'prototype'],
	'%JSONParse%': ['JSON', 'parse'],
	'%JSONStringify%': ['JSON', 'stringify'],
	'%MapPrototype%': ['Map', 'prototype'],
	'%NumberPrototype%': ['Number', 'prototype'],
	'%ObjectPrototype%': ['Object', 'prototype'],
	'%ObjProto_toString%': ['Object', 'prototype', 'toString'],
	'%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'],
	'%PromisePrototype%': ['Promise', 'prototype'],
	'%PromiseProto_then%': ['Promise', 'prototype', 'then'],
	'%Promise_all%': ['Promise', 'all'],
	'%Promise_reject%': ['Promise', 'reject'],
	'%Promise_resolve%': ['Promise', 'resolve'],
	'%RangeErrorPrototype%': ['RangeError', 'prototype'],
	'%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'],
	'%RegExpPrototype%': ['RegExp', 'prototype'],
	'%SetPrototype%': ['Set', 'prototype'],
	'%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'],
	'%StringPrototype%': ['String', 'prototype'],
	'%SymbolPrototype%': ['Symbol', 'prototype'],
	'%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'],
	'%TypedArrayPrototype%': ['TypedArray', 'prototype'],
	'%TypeErrorPrototype%': ['TypeError', 'prototype'],
	'%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'],
	'%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'],
	'%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'],
	'%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'],
	'%URIErrorPrototype%': ['URIError', 'prototype'],
	'%WeakMapPrototype%': ['WeakMap', 'prototype'],
	'%WeakSetPrototype%': ['WeakSet', 'prototype']
};

var bind = require('function-bind');
var hasOwn = require('has');
var $concat = bind.call(Function.call, Array.prototype.concat);
var $spliceApply = bind.call(Function.apply, Array.prototype.splice);
var $replace = bind.call(Function.call, String.prototype.replace);
var $strSlice = bind.call(Function.call, String.prototype.slice);
var $exec = bind.call(Function.call, RegExp.prototype.exec);

/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */
var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g;
var reEscapeChar = /\\(\\)?/g; /** Used to match backslashes in property paths. */
var stringToPath = function stringToPath(string) {
	var first = $strSlice(string, 0, 1);
	var last = $strSlice(string, -1);
	if (first === '%' && last !== '%') {
		throw new $SyntaxError('invalid intrinsic syntax, expected closing `%`');
	} else if (last === '%' && first !== '%') {
		throw new $SyntaxError('invalid intrinsic syntax, expected opening `%`');
	}
	var result = [];
	$replace(string, rePropName, function (match, number, quote, subString) {
		result[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match;
	});
	return result;
};
/* end adaptation */

var getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {
	var intrinsicName = name;
	var alias;
	if (hasOwn(LEGACY_ALIASES, intrinsicName)) {
		alias = LEGACY_ALIASES[intrinsicName];
		intrinsicName = '%' + alias[0] + '%';
	}

	if (hasOwn(INTRINSICS, intrinsicName)) {
		var value = INTRINSICS[intrinsicName];
		if (value === needsEval) {
			value = doEval(intrinsicName);
		}
		if (typeof value === 'undefined' && !allowMissing) {
			throw new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');
		}

		return {
			alias: alias,
			name: intrinsicName,
			value: value
		};
	}

	throw new $SyntaxError('intrinsic ' + name + ' does not exist!');
};

module.exports = function GetIntrinsic(name, allowMissing) {
	if (typeof name !== 'string' || name.length === 0) {
		throw new $TypeError('intrinsic name must be a non-empty string');
	}
	if (arguments.length > 1 && typeof allowMissing !== 'boolean') {
		throw new $TypeError('"allowMissing" argument must be a boolean');
	}

	if ($exec(/^%?[^%]*%?$/g, name) === null) {
		throw new $SyntaxError('`%` may not be present anywhere but at the beginning and end of the intrinsic name');
	}
	var parts = stringToPath(name);
	var intrinsicBaseName = parts.length > 0 ? parts[0] : '';

	var intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing);
	var intrinsicRealName = intrinsic.name;
	var value = intrinsic.value;
	var skipFurtherCaching = false;

	var alias = intrinsic.alias;
	if (alias) {
		intrinsicBaseName = alias[0];
		$spliceApply(parts, $concat([0, 1], alias));
	}

	for (var i = 1, isOwn = true; i < parts.length; i += 1) {
		var part = parts[i];
		var first = $strSlice(part, 0, 1);
		var last = $strSlice(part, -1);
		if (
			(
				(first === '"' || first === "'" || first === '`')
				|| (last === '"' || last === "'" || last === '`')
			)
			&& first !== last
		) {
			throw new $SyntaxError('property names with quotes must have matching quotes');
		}
		if (part === 'constructor' || !isOwn) {
			skipFurtherCaching = true;
		}

		intrinsicBaseName += '.' + part;
		intrinsicRealName = '%' + intrinsicBaseName + '%';

		if (hasOwn(INTRINSICS, intrinsicRealName)) {
			value = INTRINSICS[intrinsicRealName];
		} else if (value != null) {
			if (!(part in value)) {
				if (!allowMissing) {
					throw new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.');
				}
				return void undefined;
			}
			if ($gOPD && (i + 1) >= parts.length) {
				var desc = $gOPD(value, part);
				isOwn = !!desc;

				// By convention, when a data property is converted to an accessor
				// property to emulate a data property that does not suffer from
				// the override mistake, that accessor's getter is marked with
				// an `originalValue` property. Here, when we detect this, we
				// uphold the illusion by pretending to see that original data
				// property, i.e., returning the value rather than the getter
				// itself.
				if (isOwn && 'get' in desc && !('originalValue' in desc.get)) {
					value = desc.get;
				} else {
					value = value[part];
				}
			} else {
				isOwn = hasOwn(value, part);
				value = value[part];
			}

			if (isOwn && !skipFurtherCaching) {
				INTRINSICS[intrinsicRealName] = value;
			}
		}
	}
	return value;
};
{
  "name": "get-intrinsic",
  "version": "1.1.2",
  "description": "Get and robustly cache all JS language-level intrinsics at first require time",
  "main": "index.js",
  "exports": {
    ".": [
      {
        "default": "./index.js"
      },
      "./index.js"
    ],
    "./package.json": "./package.json"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/ljharb/get-intrinsic.git"
  },
  "author": "Jordan Harband <ljharb@gmail.com>",
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "license": "MIT",
  "homepage": "https://github.com/ljharb/get-intrinsic#readme",
  "devDependencies": {
    "@ljharb/eslint-config": "^21.0.0",
    "aud": "^2.0.0",
    "auto-changelog": "^2.4.0",
    "call-bind": "^1.0.2",
    "es-abstract": "^1.20.1",
    "es-value-fixtures": "^1.4.1",
    "eslint": "=8.8.0",
    "evalmd": "^0.0.19",
    "for-each": "^0.3.3",
    "make-async-function": "^1.0.0",
    "make-async-generator-function": "^1.0.0",
    "make-generator-function": "^2.0.0",
    "mock-property": "^1.0.0",
    "npmignore": "^0.3.0",
    "nyc": "^10.3.2",
    "object-inspect": "^1.12.2",
    "safe-publish-latest": "^2.0.0",
    "tape": "^5.5.3"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false,
    "hideCredit": true
  },
  "dependencies": {
    "function-bind": "^1.1.1",
    "has": "^1.0.3",
    "has-symbols": "^1.0.3"
  },
  "publishConfig": {
    "ignore": [
      ".github/workflows"
    ]
  }
}# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/get-intrinsic
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
coverage/
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"exclude": [
		"coverage",
		"test"
	]
}
MIT License

Copyright (c) 2021 Inspect JS

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 getInferredName;
try {
	// eslint-disable-next-line no-new-func
	getInferredName = Function('s', 'return { [s]() {} }[s].name;');
} catch (e) {}

var inferred = function () {};
module.exports = getInferredName && inferred.name === 'inferred' ? getInferredName : null;
'use strict';

var GetIntrinsic = require('get-intrinsic');

var callBound = require('call-bind/callBound');

var $SyntaxError = GetIntrinsic('%SyntaxError%');
var getGlobalSymbolDescription = GetIntrinsic('%Symbol.keyFor%', true);
var thisSymbolValue = callBound('%Symbol.prototype.valueOf%', true);
var symToStr = callBound('Symbol.prototype.toString', true);

var getInferredName = require('./getInferredName');

/* eslint-disable consistent-return */
module.exports = callBound('%Symbol.prototype.description%', true) || function getSymbolDescription(symbol) {
	if (!thisSymbolValue) {
		throw new $SyntaxError('Symbols are not supported in this environment');
	}

	// will throw if not a symbol primitive or wrapper object
	var sym = thisSymbolValue(symbol);

	if (getInferredName) {
		var name = getInferredName(sym);
		if (name === '') {
			return;
		}
		return name.slice(1, -1); // name.slice('['.length, -']'.length);
	}

	var desc;
	if (getGlobalSymbolDescription) {
		desc = getGlobalSymbolDescription(sym);
		if (typeof desc === 'string') {
			return desc;
		}
	}

	desc = symToStr(sym).slice(7, -1); // str.slice('Symbol('.length, -')'.length);
	if (desc) {
		return desc;
	}
};
{
  "name": "get-symbol-description",
  "version": "1.0.0",
  "description": "Gets the description of a Symbol. Handles `Symbol()` vs `Symbol('')` properly when possible.",
  "main": "index.js",
  "exports": {
    ".": "./index.js",
    "./getInferredName": "./getInferredName.js",
    "./package.json": "./package.json"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/inspect-js/get-symbol-description.git"
  },
  "author": "Jordan Harband <ljharb@gmail.com>",
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "license": "MIT",
  "homepage": "https://github.com/inspect-js/get-symbol-description#readme",
  "dependencies": {
    "call-bind": "^1.0.2",
    "get-intrinsic": "^1.1.1"
  },
  "devDependencies": {
    "@ljharb/eslint-config": "^17.6.0",
    "aud": "^1.1.5",
    "auto-changelog": "^2.3.0",
    "es-value-fixtures": "^1.2.1",
    "eslint": "^7.32.0",
    "evalmd": "^0.0.19",
    "foreach": "^2.0.5",
    "has": "^1.0.3",
    "nyc": "^10.3.2",
    "object-inspect": "^1.11.0",
    "safe-publish-latest": "^1.1.4",
    "tape": "^5.3.1"
  },
  "engines": {
    "node": ">= 0.4"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false,
    "hideCredit": true
  }
}# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/symbol-description
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
This software is released under the MIT license:

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.
module.exports = function (pkg) {
    var m;
    if (m = match(JSON.stringify(pkg.repository))) {
        return m;
    }
    else if (m = match(JSON.stringify(pkg))) {
        return m;
    }
    return undefined;
};

function match (str) {
    var m = /\bgithub.com[:\/]([^\/"]+)\/([^\/"]+)/.exec(str);
    if (m) {
        return 'https://github.com/' + m[1] + '/' + m[2].replace(/\.git$/, '');
    }
}
{
  "name": "github-from-package",
  "version": "0.0.0",
  "description": "return the github url from a package.json file",
  "main": "index.js",
  "devDependencies": {
    "tap": "~0.3.0",
    "tape": "~0.1.5"
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/substack/github-from-package.git"
  },
  "homepage": "https://github.com/substack/github-from-package",
  "author": {
    "name": "James Halliday",
    "email": "mail@substack.net",
    "url": "http://substack.net"
  },
  "license": "MIT"
}The ISC License

Copyright (c) 2009-2022 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.
exports.setopts = setopts
exports.ownProp = ownProp
exports.makeAbs = makeAbs
exports.finish = finish
exports.mark = mark
exports.isIgnored = isIgnored
exports.childrenIgnored = childrenIgnored

function ownProp (obj, field) {
  return Object.prototype.hasOwnProperty.call(obj, field)
}

var fs = require("fs")
var path = require("path")
var minimatch = require("minimatch")
var isAbsolute = require("path").isAbsolute
var Minimatch = minimatch.Minimatch

function alphasort (a, b) {
  return a.localeCompare(b, 'en')
}

function setupIgnores (self, options) {
  self.ignore = options.ignore || []

  if (!Array.isArray(self.ignore))
    self.ignore = [self.ignore]

  if (self.ignore.length) {
    self.ignore = self.ignore.map(ignoreMap)
  }
}

// ignore patterns are always in dot:true mode.
function ignoreMap (pattern) {
  var gmatcher = null
  if (pattern.slice(-3) === '/**') {
    var gpattern = pattern.replace(/(\/\*\*)+$/, '')
    gmatcher = new Minimatch(gpattern, { dot: true })
  }

  return {
    matcher: new Minimatch(pattern, { dot: true }),
    gmatcher: gmatcher
  }
}

function setopts (self, pattern, options) {
  if (!options)
    options = {}

  // base-matching: just use globstar for that.
  if (options.matchBase && -1 === pattern.indexOf("/")) {
    if (options.noglobstar) {
      throw new Error("base matching requires globstar")
    }
    pattern = "**/" + pattern
  }

  self.silent = !!options.silent
  self.pattern = pattern
  self.strict = options.strict !== false
  self.realpath = !!options.realpath
  self.realpathCache = options.realpathCache || Object.create(null)
  self.follow = !!options.follow
  self.dot = !!options.dot
  self.mark = !!options.mark
  self.nodir = !!options.nodir
  if (self.nodir)
    self.mark = true
  self.sync = !!options.sync
  self.nounique = !!options.nounique
  self.nonull = !!options.nonull
  self.nosort = !!options.nosort
  self.nocase = !!options.nocase
  self.stat = !!options.stat
  self.noprocess = !!options.noprocess
  self.absolute = !!options.absolute
  self.fs = options.fs || fs

  self.maxLength = options.maxLength || Infinity
  self.cache = options.cache || Object.create(null)
  self.statCache = options.statCache || Object.create(null)
  self.symlinks = options.symlinks || Object.create(null)

  setupIgnores(self, options)

  self.changedCwd = false
  var cwd = process.cwd()
  if (!ownProp(options, "cwd"))
    self.cwd = path.resolve(cwd)
  else {
    self.cwd = path.resolve(options.cwd)
    self.changedCwd = self.cwd !== cwd
  }

  self.root = options.root || path.resolve(self.cwd, "/")
  self.root = path.resolve(self.root)

  // TODO: is an absolute `cwd` supposed to be resolved against `root`?
  // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test')
  self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd)
  self.nomount = !!options.nomount

  if (process.platform === "win32") {
    self.root = self.root.replace(/\\/g, "/")
    self.cwd = self.cwd.replace(/\\/g, "/")
    self.cwdAbs = self.cwdAbs.replace(/\\/g, "/")
  }

  // disable comments and negation in Minimatch.
  // Note that they are not supported in Glob itself anyway.
  options.nonegate = true
  options.nocomment = true
  // always treat \ in patterns as escapes, not path separators
  options.allowWindowsEscape = true

  self.minimatch = new Minimatch(pattern, options)
  self.options = self.minimatch.options
}

function finish (self) {
  var nou = self.nounique
  var all = nou ? [] : Object.create(null)

  for (var i = 0, l = self.matches.length; i < l; i ++) {
    var matches = self.matches[i]
    if (!matches || Object.keys(matches).length === 0) {
      if (self.nonull) {
        // do like the shell, and spit out the literal glob
        var literal = self.minimatch.globSet[i]
        if (nou)
          all.push(literal)
        else
          all[literal] = true
      }
    } else {
      // had matches
      var m = Object.keys(matches)
      if (nou)
        all.push.apply(all, m)
      else
        m.forEach(function (m) {
          all[m] = true
        })
    }
  }

  if (!nou)
    all = Object.keys(all)

  if (!self.nosort)
    all = all.sort(alphasort)

  // at *some* point we statted all of these
  if (self.mark) {
    for (var i = 0; i < all.length; i++) {
      all[i] = self._mark(all[i])
    }
    if (self.nodir) {
      all = all.filter(function (e) {
        var notDir = !(/\/$/.test(e))
        var c = self.cache[e] || self.cache[makeAbs(self, e)]
        if (notDir && c)
          notDir = c !== 'DIR' && !Array.isArray(c)
        return notDir
      })
    }
  }

  if (self.ignore.length)
    all = all.filter(function(m) {
      return !isIgnored(self, m)
    })

  self.found = all
}

function mark (self, p) {
  var abs = makeAbs(self, p)
  var c = self.cache[abs]
  var m = p
  if (c) {
    var isDir = c === 'DIR' || Array.isArray(c)
    var slash = p.slice(-1) === '/'

    if (isDir && !slash)
      m += '/'
    else if (!isDir && slash)
      m = m.slice(0, -1)

    if (m !== p) {
      var mabs = makeAbs(self, m)
      self.statCache[mabs] = self.statCache[abs]
      self.cache[mabs] = self.cache[abs]
    }
  }

  return m
}

// lotta situps...
function makeAbs (self, f) {
  var abs = f
  if (f.charAt(0) === '/') {
    abs = path.join(self.root, f)
  } else if (isAbsolute(f) || f === '') {
    abs = f
  } else if (self.changedCwd) {
    abs = path.resolve(self.cwd, f)
  } else {
    abs = path.resolve(f)
  }

  if (process.platform === 'win32')
    abs = abs.replace(/\\/g, '/')

  return abs
}


// Return true, if pattern ends with globstar '**', for the accompanying parent directory.
// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents
function isIgnored (self, path) {
  if (!self.ignore.length)
    return false

  return self.ignore.some(function(item) {
    return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path))
  })
}

function childrenIgnored (self, path) {
  if (!self.ignore.length)
    return false

  return self.ignore.some(function(item) {
    return !!(item.gmatcher && item.gmatcher.match(path))
  })
}
// Approach:
//
// 1. Get the minimatch set
// 2. For each pattern in the set, PROCESS(pattern, false)
// 3. Store matches per-set, then uniq them
//
// PROCESS(pattern, inGlobStar)
// Get the first [n] items from pattern that are all strings
// Join these together.  This is PREFIX.
//   If there is no more remaining, then stat(PREFIX) and
//   add to matches if it succeeds.  END.
//
// If inGlobStar and PREFIX is symlink and points to dir
//   set ENTRIES = []
// else readdir(PREFIX) as ENTRIES
//   If fail, END
//
// with ENTRIES
//   If pattern[n] is GLOBSTAR
//     // handle the case where the globstar match is empty
//     // by pruning it out, and testing the resulting pattern
//     PROCESS(pattern[0..n] + pattern[n+1 .. $], false)
//     // handle other cases.
//     for ENTRY in ENTRIES (not dotfiles)
//       // attach globstar + tail onto the entry
//       // Mark that this entry is a globstar match
//       PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)
//
//   else // not globstar
//     for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)
//       Test ENTRY against pattern[n]
//       If fails, continue
//       If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])
//
// Caveat:
//   Cache all stats and readdirs results to minimize syscall.  Since all
//   we ever care about is existence and directory-ness, we can just keep
//   `true` for files, and [children,...] for directories, or `false` for
//   things that don't exist.

module.exports = glob

var rp = require('fs.realpath')
var minimatch = require('minimatch')
var Minimatch = minimatch.Minimatch
var inherits = require('inherits')
var EE = require('events').EventEmitter
var path = require('path')
var assert = require('assert')
var isAbsolute = require('path').isAbsolute
var globSync = require('./sync.js')
var common = require('./common.js')
var setopts = common.setopts
var ownProp = common.ownProp
var inflight = require('inflight')
var util = require('util')
var childrenIgnored = common.childrenIgnored
var isIgnored = common.isIgnored

var once = require('once')

function glob (pattern, options, cb) {
  if (typeof options === 'function') cb = options, options = {}
  if (!options) options = {}

  if (options.sync) {
    if (cb)
      throw new TypeError('callback provided to sync glob')
    return globSync(pattern, options)
  }

  return new Glob(pattern, options, cb)
}

glob.sync = globSync
var GlobSync = glob.GlobSync = globSync.GlobSync

// old api surface
glob.glob = glob

function extend (origin, add) {
  if (add === null || typeof add !== 'object') {
    return origin
  }

  var keys = Object.keys(add)
  var i = keys.length
  while (i--) {
    origin[keys[i]] = add[keys[i]]
  }
  return origin
}

glob.hasMagic = function (pattern, options_) {
  var options = extend({}, options_)
  options.noprocess = true

  var g = new Glob(pattern, options)
  var set = g.minimatch.set

  if (!pattern)
    return false

  if (set.length > 1)
    return true

  for (var j = 0; j < set[0].length; j++) {
    if (typeof set[0][j] !== 'string')
      return true
  }

  return false
}

glob.Glob = Glob
inherits(Glob, EE)
function Glob (pattern, options, cb) {
  if (typeof options === 'function') {
    cb = options
    options = null
  }

  if (options && options.sync) {
    if (cb)
      throw new TypeError('callback provided to sync glob')
    return new GlobSync(pattern, options)
  }

  if (!(this instanceof Glob))
    return new Glob(pattern, options, cb)

  setopts(this, pattern, options)
  this._didRealPath = false

  // process each pattern in the minimatch set
  var n = this.minimatch.set.length

  // The matches are stored as {<filename>: true,...} so that
  // duplicates are automagically pruned.
  // Later, we do an Object.keys() on these.
  // Keep them as a list so we can fill in when nonull is set.
  this.matches = new Array(n)

  if (typeof cb === 'function') {
    cb = once(cb)
    this.on('error', cb)
    this.on('end', function (matches) {
      cb(null, matches)
    })
  }

  var self = this
  this._processing = 0

  this._emitQueue = []
  this._processQueue = []
  this.paused = false

  if (this.noprocess)
    return this

  if (n === 0)
    return done()

  var sync = true
  for (var i = 0; i < n; i ++) {
    this._process(this.minimatch.set[i], i, false, done)
  }
  sync = false

  function done () {
    --self._processing
    if (self._processing <= 0) {
      if (sync) {
        process.nextTick(function () {
          self._finish()
        })
      } else {
        self._finish()
      }
    }
  }
}

Glob.prototype._finish = function () {
  assert(this instanceof Glob)
  if (this.aborted)
    return

  if (this.realpath && !this._didRealpath)
    return this._realpath()

  common.finish(this)
  this.emit('end', this.found)
}

Glob.prototype._realpath = function () {
  if (this._didRealpath)
    return

  this._didRealpath = true

  var n = this.matches.length
  if (n === 0)
    return this._finish()

  var self = this
  for (var i = 0; i < this.matches.length; i++)
    this._realpathSet(i, next)

  function next () {
    if (--n === 0)
      self._finish()
  }
}

Glob.prototype._realpathSet = function (index, cb) {
  var matchset = this.matches[index]
  if (!matchset)
    return cb()

  var found = Object.keys(matchset)
  var self = this
  var n = found.length

  if (n === 0)
    return cb()

  var set = this.matches[index] = Object.create(null)
  found.forEach(function (p, i) {
    // If there's a problem with the stat, then it means that
    // one or more of the links in the realpath couldn't be
    // resolved.  just return the abs value in that case.
    p = self._makeAbs(p)
    rp.realpath(p, self.realpathCache, function (er, real) {
      if (!er)
        set[real] = true
      else if (er.syscall === 'stat')
        set[p] = true
      else
        self.emit('error', er) // srsly wtf right here

      if (--n === 0) {
        self.matches[index] = set
        cb()
      }
    })
  })
}

Glob.prototype._mark = function (p) {
  return common.mark(this, p)
}

Glob.prototype._makeAbs = function (f) {
  return common.makeAbs(this, f)
}

Glob.prototype.abort = function () {
  this.aborted = true
  this.emit('abort')
}

Glob.prototype.pause = function () {
  if (!this.paused) {
    this.paused = true
    this.emit('pause')
  }
}

Glob.prototype.resume = function () {
  if (this.paused) {
    this.emit('resume')
    this.paused = false
    if (this._emitQueue.length) {
      var eq = this._emitQueue.slice(0)
      this._emitQueue.length = 0
      for (var i = 0; i < eq.length; i ++) {
        var e = eq[i]
        this._emitMatch(e[0], e[1])
      }
    }
    if (this._processQueue.length) {
      var pq = this._processQueue.slice(0)
      this._processQueue.length = 0
      for (var i = 0; i < pq.length; i ++) {
        var p = pq[i]
        this._processing--
        this._process(p[0], p[1], p[2], p[3])
      }
    }
  }
}

Glob.prototype._process = function (pattern, index, inGlobStar, cb) {
  assert(this instanceof Glob)
  assert(typeof cb === 'function')

  if (this.aborted)
    return

  this._processing++
  if (this.paused) {
    this._processQueue.push([pattern, index, inGlobStar, cb])
    return
  }

  //console.error('PROCESS %d', this._processing, pattern)

  // Get the first [n] parts of pattern that are all strings.
  var n = 0
  while (typeof pattern[n] === 'string') {
    n ++
  }
  // now n is the index of the first one that is *not* a string.

  // see if there's anything else
  var prefix
  switch (n) {
    // if not, then this is rather simple
    case pattern.length:
      this._processSimple(pattern.join('/'), index, cb)
      return

    case 0:
      // pattern *starts* with some non-trivial item.
      // going to readdir(cwd), but not include the prefix in matches.
      prefix = null
      break

    default:
      // pattern has some string bits in the front.
      // whatever it starts with, whether that's 'absolute' like /foo/bar,
      // or 'relative' like '../baz'
      prefix = pattern.slice(0, n).join('/')
      break
  }

  var remain = pattern.slice(n)

  // get the list of entries.
  var read
  if (prefix === null)
    read = '.'
  else if (isAbsolute(prefix) ||
      isAbsolute(pattern.map(function (p) {
        return typeof p === 'string' ? p : '[*]'
      }).join('/'))) {
    if (!prefix || !isAbsolute(prefix))
      prefix = '/' + prefix
    read = prefix
  } else
    read = prefix

  var abs = this._makeAbs(read)

  //if ignored, skip _processing
  if (childrenIgnored(this, read))
    return cb()

  var isGlobStar = remain[0] === minimatch.GLOBSTAR
  if (isGlobStar)
    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb)
  else
    this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb)
}

Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {
  var self = this
  this._readdir(abs, inGlobStar, function (er, entries) {
    return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
  })
}

Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {

  // if the abs isn't a dir, then nothing can match!
  if (!entries)
    return cb()

  // It will only match dot entries if it starts with a dot, or if
  // dot is set.  Stuff like @(.foo|.bar) isn't allowed.
  var pn = remain[0]
  var negate = !!this.minimatch.negate
  var rawGlob = pn._glob
  var dotOk = this.dot || rawGlob.charAt(0) === '.'

  var matchedEntries = []
  for (var i = 0; i < entries.length; i++) {
    var e = entries[i]
    if (e.charAt(0) !== '.' || dotOk) {
      var m
      if (negate && !prefix) {
        m = !e.match(pn)
      } else {
        m = e.match(pn)
      }
      if (m)
        matchedEntries.push(e)
    }
  }

  //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)

  var len = matchedEntries.length
  // If there are no matched entries, then nothing matches.
  if (len === 0)
    return cb()

  // if this is the last remaining pattern bit, then no need for
  // an additional stat *unless* the user has specified mark or
  // stat explicitly.  We know they exist, since readdir returned
  // them.

  if (remain.length === 1 && !this.mark && !this.stat) {
    if (!this.matches[index])
      this.matches[index] = Object.create(null)

    for (var i = 0; i < len; i ++) {
      var e = matchedEntries[i]
      if (prefix) {
        if (prefix !== '/')
          e = prefix + '/' + e
        else
          e = prefix + e
      }

      if (e.charAt(0) === '/' && !this.nomount) {
        e = path.join(this.root, e)
      }
      this._emitMatch(index, e)
    }
    // This was the last one, and no stats were needed
    return cb()
  }

  // now test all matched entries as stand-ins for that part
  // of the pattern.
  remain.shift()
  for (var i = 0; i < len; i ++) {
    var e = matchedEntries[i]
    var newPattern
    if (prefix) {
      if (prefix !== '/')
        e = prefix + '/' + e
      else
        e = prefix + e
    }
    this._process([e].concat(remain), index, inGlobStar, cb)
  }
  cb()
}

Glob.prototype._emitMatch = function (index, e) {
  if (this.aborted)
    return

  if (isIgnored(this, e))
    return

  if (this.paused) {
    this._emitQueue.push([index, e])
    return
  }

  var abs = isAbsolute(e) ? e : this._makeAbs(e)

  if (this.mark)
    e = this._mark(e)

  if (this.absolute)
    e = abs

  if (this.matches[index][e])
    return

  if (this.nodir) {
    var c = this.cache[abs]
    if (c === 'DIR' || Array.isArray(c))
      return
  }

  this.matches[index][e] = true

  var st = this.statCache[abs]
  if (st)
    this.emit('stat', e, st)

  this.emit('match', e)
}

Glob.prototype._readdirInGlobStar = function (abs, cb) {
  if (this.aborted)
    return

  // follow all symlinked directories forever
  // just proceed as if this is a non-globstar situation
  if (this.follow)
    return this._readdir(abs, false, cb)

  var lstatkey = 'lstat\0' + abs
  var self = this
  var lstatcb = inflight(lstatkey, lstatcb_)

  if (lstatcb)
    self.fs.lstat(abs, lstatcb)

  function lstatcb_ (er, lstat) {
    if (er && er.code === 'ENOENT')
      return cb()

    var isSym = lstat && lstat.isSymbolicLink()
    self.symlinks[abs] = isSym

    // If it's not a symlink or a dir, then it's definitely a regular file.
    // don't bother doing a readdir in that case.
    if (!isSym && lstat && !lstat.isDirectory()) {
      self.cache[abs] = 'FILE'
      cb()
    } else
      self._readdir(abs, false, cb)
  }
}

Glob.prototype._readdir = function (abs, inGlobStar, cb) {
  if (this.aborted)
    return

  cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb)
  if (!cb)
    return

  //console.error('RD %j %j', +inGlobStar, abs)
  if (inGlobStar && !ownProp(this.symlinks, abs))
    return this._readdirInGlobStar(abs, cb)

  if (ownProp(this.cache, abs)) {
    var c = this.cache[abs]
    if (!c || c === 'FILE')
      return cb()

    if (Array.isArray(c))
      return cb(null, c)
  }

  var self = this
  self.fs.readdir(abs, readdirCb(this, abs, cb))
}

function readdirCb (self, abs, cb) {
  return function (er, entries) {
    if (er)
      self._readdirError(abs, er, cb)
    else
      self._readdirEntries(abs, entries, cb)
  }
}

Glob.prototype._readdirEntries = function (abs, entries, cb) {
  if (this.aborted)
    return

  // if we haven't asked to stat everything, then just
  // assume that everything in there exists, so we can avoid
  // having to stat it a second time.
  if (!this.mark && !this.stat) {
    for (var i = 0; i < entries.length; i ++) {
      var e = entries[i]
      if (abs === '/')
        e = abs + e
      else
        e = abs + '/' + e
      this.cache[e] = true
    }
  }

  this.cache[abs] = entries
  return cb(null, entries)
}

Glob.prototype._readdirError = function (f, er, cb) {
  if (this.aborted)
    return

  // handle errors, and cache the information
  switch (er.code) {
    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
    case 'ENOTDIR': // totally normal. means it *does* exist.
      var abs = this._makeAbs(f)
      this.cache[abs] = 'FILE'
      if (abs === this.cwdAbs) {
        var error = new Error(er.code + ' invalid cwd ' + this.cwd)
        error.path = this.cwd
        error.code = er.code
        this.emit('error', error)
        this.abort()
      }
      break

    case 'ENOENT': // not terribly unusual
    case 'ELOOP':
    case 'ENAMETOOLONG':
    case 'UNKNOWN':
      this.cache[this._makeAbs(f)] = false
      break

    default: // some unusual error.  Treat as failure.
      this.cache[this._makeAbs(f)] = false
      if (this.strict) {
        this.emit('error', er)
        // If the error is handled, then we abort
        // if not, we threw out of here
        this.abort()
      }
      if (!this.silent)
        console.error('glob error', er)
      break
  }

  return cb()
}

Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {
  var self = this
  this._readdir(abs, inGlobStar, function (er, entries) {
    self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
  })
}


Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
  //console.error('pgs2', prefix, remain[0], entries)

  // no entries means not a dir, so it can never have matches
  // foo.txt/** doesn't match foo.txt
  if (!entries)
    return cb()

  // test without the globstar, and with every child both below
  // and replacing the globstar.
  var remainWithoutGlobStar = remain.slice(1)
  var gspref = prefix ? [ prefix ] : []
  var noGlobStar = gspref.concat(remainWithoutGlobStar)

  // the noGlobStar pattern exits the inGlobStar state
  this._process(noGlobStar, index, false, cb)

  var isSym = this.symlinks[abs]
  var len = entries.length

  // If it's a symlink, and we're in a globstar, then stop
  if (isSym && inGlobStar)
    return cb()

  for (var i = 0; i < len; i++) {
    var e = entries[i]
    if (e.charAt(0) === '.' && !this.dot)
      continue

    // these two cases enter the inGlobStar state
    var instead = gspref.concat(entries[i], remainWithoutGlobStar)
    this._process(instead, index, true, cb)

    var below = gspref.concat(entries[i], remain)
    this._process(below, index, true, cb)
  }

  cb()
}

Glob.prototype._processSimple = function (prefix, index, cb) {
  // XXX review this.  Shouldn't it be doing the mounting etc
  // before doing stat?  kinda weird?
  var self = this
  this._stat(prefix, function (er, exists) {
    self._processSimple2(prefix, index, er, exists, cb)
  })
}
Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {

  //console.error('ps2', prefix, exists)

  if (!this.matches[index])
    this.matches[index] = Object.create(null)

  // If it doesn't exist, then just mark the lack of results
  if (!exists)
    return cb()

  if (prefix && isAbsolute(prefix) && !this.nomount) {
    var trail = /[\/\\]$/.test(prefix)
    if (prefix.charAt(0) === '/') {
      prefix = path.join(this.root, prefix)
    } else {
      prefix = path.resolve(this.root, prefix)
      if (trail)
        prefix += '/'
    }
  }

  if (process.platform === 'win32')
    prefix = prefix.replace(/\\/g, '/')

  // Mark this as a match
  this._emitMatch(index, prefix)
  cb()
}

// Returns either 'DIR', 'FILE', or false
Glob.prototype._stat = function (f, cb) {
  var abs = this._makeAbs(f)
  var needDir = f.slice(-1) === '/'

  if (f.length > this.maxLength)
    return cb()

  if (!this.stat && ownProp(this.cache, abs)) {
    var c = this.cache[abs]

    if (Array.isArray(c))
      c = 'DIR'

    // It exists, but maybe not how we need it
    if (!needDir || c === 'DIR')
      return cb(null, c)

    if (needDir && c === 'FILE')
      return cb()

    // otherwise we have to stat, because maybe c=true
    // if we know it exists, but not what it is.
  }

  var exists
  var stat = this.statCache[abs]
  if (stat !== undefined) {
    if (stat === false)
      return cb(null, stat)
    else {
      var type = stat.isDirectory() ? 'DIR' : 'FILE'
      if (needDir && type === 'FILE')
        return cb()
      else
        return cb(null, type, stat)
    }
  }

  var self = this
  var statcb = inflight('stat\0' + abs, lstatcb_)
  if (statcb)
    self.fs.lstat(abs, statcb)

  function lstatcb_ (er, lstat) {
    if (lstat && lstat.isSymbolicLink()) {
      // If it's a symlink, then treat it as the target, unless
      // the target does not exist, then treat it as a file.
      return self.fs.stat(abs, function (er, stat) {
        if (er)
          self._stat2(f, abs, null, lstat, cb)
        else
          self._stat2(f, abs, er, stat, cb)
      })
    } else {
      self._stat2(f, abs, er, lstat, cb)
    }
  }
}

Glob.prototype._stat2 = function (f, abs, er, stat, cb) {
  if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {
    this.statCache[abs] = false
    return cb()
  }

  var needDir = f.slice(-1) === '/'
  this.statCache[abs] = stat

  if (abs.slice(-1) === '/' && stat && !stat.isDirectory())
    return cb(null, false, stat)

  var c = true
  if (stat)
    c = stat.isDirectory() ? 'DIR' : 'FILE'
  this.cache[abs] = this.cache[abs] || c

  if (needDir && c === 'FILE')
    return cb()

  return cb(null, c, stat)
}
{
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
  "name": "glob",
  "description": "a little globber",
  "version": "8.0.3",
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/node-glob.git"
  },
  "main": "glob.js",
  "files": [
    "glob.js",
    "sync.js",
    "common.js"
  ],
  "engines": {
    "node": ">=12"
  },
  "dependencies": {
    "fs.realpath": "^1.0.0",
    "inflight": "^1.0.4",
    "inherits": "2",
    "minimatch": "^5.0.1",
    "once": "^1.3.0"
  },
  "devDependencies": {
    "memfs": "^3.2.0",
    "mkdirp": "0",
    "rimraf": "^2.2.8",
    "tap": "^16.0.1",
    "tick": "0.0.6"
  },
  "tap": {
    "before": "test/00-setup.js",
    "after": "test/zz-cleanup.js",
    "statements": 90,
    "branches": 90,
    "functions": 90,
    "lines": 90,
    "jobs": 1
  },
  "license": "ISC",
  "funding": {
    "url": "https://github.com/sponsors/isaacs"
  }
}module.exports = globSync
globSync.GlobSync = GlobSync

var rp = require('fs.realpath')
var minimatch = require('minimatch')
var Minimatch = minimatch.Minimatch
var Glob = require('./glob.js').Glob
var util = require('util')
var path = require('path')
var assert = require('assert')
var isAbsolute = require('path').isAbsolute
var common = require('./common.js')
var setopts = common.setopts
var ownProp = common.ownProp
var childrenIgnored = common.childrenIgnored
var isIgnored = common.isIgnored

function globSync (pattern, options) {
  if (typeof options === 'function' || arguments.length === 3)
    throw new TypeError('callback provided to sync glob\n'+
                        'See: https://github.com/isaacs/node-glob/issues/167')

  return new GlobSync(pattern, options).found
}

function GlobSync (pattern, options) {
  if (!pattern)
    throw new Error('must provide pattern')

  if (typeof options === 'function' || arguments.length === 3)
    throw new TypeError('callback provided to sync glob\n'+
                        'See: https://github.com/isaacs/node-glob/issues/167')

  if (!(this instanceof GlobSync))
    return new GlobSync(pattern, options)

  setopts(this, pattern, options)

  if (this.noprocess)
    return this

  var n = this.minimatch.set.length
  this.matches = new Array(n)
  for (var i = 0; i < n; i ++) {
    this._process(this.minimatch.set[i], i, false)
  }
  this._finish()
}

GlobSync.prototype._finish = function () {
  assert.ok(this instanceof GlobSync)
  if (this.realpath) {
    var self = this
    this.matches.forEach(function (matchset, index) {
      var set = self.matches[index] = Object.create(null)
      for (var p in matchset) {
        try {
          p = self._makeAbs(p)
          var real = rp.realpathSync(p, self.realpathCache)
          set[real] = true
        } catch (er) {
          if (er.syscall === 'stat')
            set[self._makeAbs(p)] = true
          else
            throw er
        }
      }
    })
  }
  common.finish(this)
}


GlobSync.prototype._process = function (pattern, index, inGlobStar) {
  assert.ok(this instanceof GlobSync)

  // Get the first [n] parts of pattern that are all strings.
  var n = 0
  while (typeof pattern[n] === 'string') {
    n ++
  }
  // now n is the index of the first one that is *not* a string.

  // See if there's anything else
  var prefix
  switch (n) {
    // if not, then this is rather simple
    case pattern.length:
      this._processSimple(pattern.join('/'), index)
      return

    case 0:
      // pattern *starts* with some non-trivial item.
      // going to readdir(cwd), but not include the prefix in matches.
      prefix = null
      break

    default:
      // pattern has some string bits in the front.
      // whatever it starts with, whether that's 'absolute' like /foo/bar,
      // or 'relative' like '../baz'
      prefix = pattern.slice(0, n).join('/')
      break
  }

  var remain = pattern.slice(n)

  // get the list of entries.
  var read
  if (prefix === null)
    read = '.'
  else if (isAbsolute(prefix) ||
      isAbsolute(pattern.map(function (p) {
        return typeof p === 'string' ? p : '[*]'
      }).join('/'))) {
    if (!prefix || !isAbsolute(prefix))
      prefix = '/' + prefix
    read = prefix
  } else
    read = prefix

  var abs = this._makeAbs(read)

  //if ignored, skip processing
  if (childrenIgnored(this, read))
    return

  var isGlobStar = remain[0] === minimatch.GLOBSTAR
  if (isGlobStar)
    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar)
  else
    this._processReaddir(prefix, read, abs, remain, index, inGlobStar)
}


GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) {
  var entries = this._readdir(abs, inGlobStar)

  // if the abs isn't a dir, then nothing can match!
  if (!entries)
    return

  // It will only match dot entries if it starts with a dot, or if
  // dot is set.  Stuff like @(.foo|.bar) isn't allowed.
  var pn = remain[0]
  var negate = !!this.minimatch.negate
  var rawGlob = pn._glob
  var dotOk = this.dot || rawGlob.charAt(0) === '.'

  var matchedEntries = []
  for (var i = 0; i < entries.length; i++) {
    var e = entries[i]
    if (e.charAt(0) !== '.' || dotOk) {
      var m
      if (negate && !prefix) {
        m = !e.match(pn)
      } else {
        m = e.match(pn)
      }
      if (m)
        matchedEntries.push(e)
    }
  }

  var len = matchedEntries.length
  // If there are no matched entries, then nothing matches.
  if (len === 0)
    return

  // if this is the last remaining pattern bit, then no need for
  // an additional stat *unless* the user has specified mark or
  // stat explicitly.  We know they exist, since readdir returned
  // them.

  if (remain.length === 1 && !this.mark && !this.stat) {
    if (!this.matches[index])
      this.matches[index] = Object.create(null)

    for (var i = 0; i < len; i ++) {
      var e = matchedEntries[i]
      if (prefix) {
        if (prefix.slice(-1) !== '/')
          e = prefix + '/' + e
        else
          e = prefix + e
      }

      if (e.charAt(0) === '/' && !this.nomount) {
        e = path.join(this.root, e)
      }
      this._emitMatch(index, e)
    }
    // This was the last one, and no stats were needed
    return
  }

  // now test all matched entries as stand-ins for that part
  // of the pattern.
  remain.shift()
  for (var i = 0; i < len; i ++) {
    var e = matchedEntries[i]
    var newPattern
    if (prefix)
      newPattern = [prefix, e]
    else
      newPattern = [e]
    this._process(newPattern.concat(remain), index, inGlobStar)
  }
}


GlobSync.prototype._emitMatch = function (index, e) {
  if (isIgnored(this, e))
    return

  var abs = this._makeAbs(e)

  if (this.mark)
    e = this._mark(e)

  if (this.absolute) {
    e = abs
  }

  if (this.matches[index][e])
    return

  if (this.nodir) {
    var c = this.cache[abs]
    if (c === 'DIR' || Array.isArray(c))
      return
  }

  this.matches[index][e] = true

  if (this.stat)
    this._stat(e)
}


GlobSync.prototype._readdirInGlobStar = function (abs) {
  // follow all symlinked directories forever
  // just proceed as if this is a non-globstar situation
  if (this.follow)
    return this._readdir(abs, false)

  var entries
  var lstat
  var stat
  try {
    lstat = this.fs.lstatSync(abs)
  } catch (er) {
    if (er.code === 'ENOENT') {
      // lstat failed, doesn't exist
      return null
    }
  }

  var isSym = lstat && lstat.isSymbolicLink()
  this.symlinks[abs] = isSym

  // If it's not a symlink or a dir, then it's definitely a regular file.
  // don't bother doing a readdir in that case.
  if (!isSym && lstat && !lstat.isDirectory())
    this.cache[abs] = 'FILE'
  else
    entries = this._readdir(abs, false)

  return entries
}

GlobSync.prototype._readdir = function (abs, inGlobStar) {
  var entries

  if (inGlobStar && !ownProp(this.symlinks, abs))
    return this._readdirInGlobStar(abs)

  if (ownProp(this.cache, abs)) {
    var c = this.cache[abs]
    if (!c || c === 'FILE')
      return null

    if (Array.isArray(c))
      return c
  }

  try {
    return this._readdirEntries(abs, this.fs.readdirSync(abs))
  } catch (er) {
    this._readdirError(abs, er)
    return null
  }
}

GlobSync.prototype._readdirEntries = function (abs, entries) {
  // if we haven't asked to stat everything, then just
  // assume that everything in there exists, so we can avoid
  // having to stat it a second time.
  if (!this.mark && !this.stat) {
    for (var i = 0; i < entries.length; i ++) {
      var e = entries[i]
      if (abs === '/')
        e = abs + e
      else
        e = abs + '/' + e
      this.cache[e] = true
    }
  }

  this.cache[abs] = entries

  // mark and cache dir-ness
  return entries
}

GlobSync.prototype._readdirError = function (f, er) {
  // handle errors, and cache the information
  switch (er.code) {
    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
    case 'ENOTDIR': // totally normal. means it *does* exist.
      var abs = this._makeAbs(f)
      this.cache[abs] = 'FILE'
      if (abs === this.cwdAbs) {
        var error = new Error(er.code + ' invalid cwd ' + this.cwd)
        error.path = this.cwd
        error.code = er.code
        throw error
      }
      break

    case 'ENOENT': // not terribly unusual
    case 'ELOOP':
    case 'ENAMETOOLONG':
    case 'UNKNOWN':
      this.cache[this._makeAbs(f)] = false
      break

    default: // some unusual error.  Treat as failure.
      this.cache[this._makeAbs(f)] = false
      if (this.strict)
        throw er
      if (!this.silent)
        console.error('glob error', er)
      break
  }
}

GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) {

  var entries = this._readdir(abs, inGlobStar)

  // no entries means not a dir, so it can never have matches
  // foo.txt/** doesn't match foo.txt
  if (!entries)
    return

  // test without the globstar, and with every child both below
  // and replacing the globstar.
  var remainWithoutGlobStar = remain.slice(1)
  var gspref = prefix ? [ prefix ] : []
  var noGlobStar = gspref.concat(remainWithoutGlobStar)

  // the noGlobStar pattern exits the inGlobStar state
  this._process(noGlobStar, index, false)

  var len = entries.length
  var isSym = this.symlinks[abs]

  // If it's a symlink, and we're in a globstar, then stop
  if (isSym && inGlobStar)
    return

  for (var i = 0; i < len; i++) {
    var e = entries[i]
    if (e.charAt(0) === '.' && !this.dot)
      continue

    // these two cases enter the inGlobStar state
    var instead = gspref.concat(entries[i], remainWithoutGlobStar)
    this._process(instead, index, true)

    var below = gspref.concat(entries[i], remain)
    this._process(below, index, true)
  }
}

GlobSync.prototype._processSimple = function (prefix, index) {
  // XXX review this.  Shouldn't it be doing the mounting etc
  // before doing stat?  kinda weird?
  var exists = this._stat(prefix)

  if (!this.matches[index])
    this.matches[index] = Object.create(null)

  // If it doesn't exist, then just mark the lack of results
  if (!exists)
    return

  if (prefix && isAbsolute(prefix) && !this.nomount) {
    var trail = /[\/\\]$/.test(prefix)
    if (prefix.charAt(0) === '/') {
      prefix = path.join(this.root, prefix)
    } else {
      prefix = path.resolve(this.root, prefix)
      if (trail)
        prefix += '/'
    }
  }

  if (process.platform === 'win32')
    prefix = prefix.replace(/\\/g, '/')

  // Mark this as a match
  this._emitMatch(index, prefix)
}

// Returns either 'DIR', 'FILE', or false
GlobSync.prototype._stat = function (f) {
  var abs = this._makeAbs(f)
  var needDir = f.slice(-1) === '/'

  if (f.length > this.maxLength)
    return false

  if (!this.stat && ownProp(this.cache, abs)) {
    var c = this.cache[abs]

    if (Array.isArray(c))
      c = 'DIR'

    // It exists, but maybe not how we need it
    if (!needDir || c === 'DIR')
      return c

    if (needDir && c === 'FILE')
      return false

    // otherwise we have to stat, because maybe c=true
    // if we know it exists, but not what it is.
  }

  var exists
  var stat = this.statCache[abs]
  if (!stat) {
    var lstat
    try {
      lstat = this.fs.lstatSync(abs)
    } catch (er) {
      if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {
        this.statCache[abs] = false
        return false
      }
    }

    if (lstat && lstat.isSymbolicLink()) {
      try {
        stat = this.fs.statSync(abs)
      } catch (er) {
        stat = lstat
      }
    } else {
      stat = lstat
    }
  }

  this.statCache[abs] = stat

  var c = true
  if (stat)
    c = stat.isDirectory() ? 'DIR' : 'FILE'

  this.cache[abs] = this.cache[abs] || c

  if (needDir && c === 'FILE')
    return false

  return c
}

GlobSync.prototype._mark = function (p) {
  return common.mark(this, p)
}

GlobSync.prototype._makeAbs = function (f) {
  return common.makeAbs(this, f)
}
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"exclude": [
		"coverage",
		"dist",
		"test"
	]
}
The MIT License (MIT)

Copyright (c) 2016 Jordan Harband

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';

require('./shim')();
/* eslint no-negated-condition: 0, no-new-func: 0 */

'use strict';

if (typeof self !== 'undefined') {
	module.exports = self;
} else if (typeof window !== 'undefined') {
	module.exports = window;
} else {
	module.exports = Function('return this')();
}
'use strict';

module.exports = global;
'use strict';

var defineProperties = require('define-properties');

var implementation = require('./implementation');
var getPolyfill = require('./polyfill');
var shim = require('./shim');

var polyfill = getPolyfill();

var getGlobal = function () { return polyfill; };

defineProperties(getGlobal, {
	getPolyfill: getPolyfill,
	implementation: implementation,
	shim: shim
});

module.exports = getGlobal;
{
  "name": "globalthis",
  "version": "1.0.3",
  "author": "Jordan Harband <ljharb@gmail.com>",
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "description": "ECMAScript spec-compliant polyfill/shim for `globalThis`",
  "license": "MIT",
  "main": "index.js",
  "browser": {
    "./implementation": "./implementation.browser.js"
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/ljharb/System.global.git"
  },
  "dependencies": {
    "define-properties": "^1.1.3"
  },
  "devDependencies": {
    "@es-shims/api": "^2.2.3",
    "@ljharb/eslint-config": "^21.0.0",
    "aud": "^2.0.0",
    "auto-changelog": "^2.4.0",
    "browserify": "^16.5.2",
    "eslint": "=8.8.0",
    "for-each": "^0.3.3",
    "in-publish": "^2.0.1",
    "is": "^3.3.0",
    "nyc": "^10.3.2",
    "safe-publish-latest": "^2.0.0",
    "tape": "^5.5.3"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "engines": {
    "node": ">= 0.4"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false,
    "hideCredit": true
  },
  "publishConfig": {
    "ignore": [
      "browserShim.js",
      ".github/workflows"
    ]
  }
}'use strict';

var implementation = require('./implementation');

module.exports = function getPolyfill() {
	if (typeof global !== 'object' || !global || global.Math !== Math || global.Array !== Array) {
		return implementation;
	}
	return global;
};
'use strict';

var define = require('define-properties');
var getPolyfill = require('./polyfill');

module.exports = function shimGlobal() {
	var polyfill = getPolyfill();
	if (define.supportsDescriptors) {
		var descriptor = Object.getOwnPropertyDescriptor(polyfill, 'globalThis');
		if (!descriptor || (descriptor.configurable && (descriptor.enumerable || !descriptor.writable || globalThis !== polyfill))) { // eslint-disable-line max-len
			Object.defineProperty(polyfill, 'globalThis', {
				configurable: true,
				enumerable: false,
				value: polyfill,
				writable: true
			});
		}
	} else if (typeof globalThis !== 'object' || globalThis !== polyfill) {
		polyfill.globalThis = polyfill;
	}
	return polyfill;
};
The ISC License

Copyright (c) 2011-2022 Isaac Z. Schlueter, Ben Noordhuis, 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.
'use strict'

module.exports = clone

var getPrototypeOf = Object.getPrototypeOf || function (obj) {
  return obj.__proto__
}

function clone (obj) {
  if (obj === null || typeof obj !== 'object')
    return obj

  if (obj instanceof Object)
    var copy = { __proto__: getPrototypeOf(obj) }
  else
    var copy = Object.create(null)

  Object.getOwnPropertyNames(obj).forEach(function (key) {
    Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key))
  })

  return copy
}
var fs = require('fs')
var polyfills = require('./polyfills.js')
var legacy = require('./legacy-streams.js')
var clone = require('./clone.js')

var util = require('util')

/* istanbul ignore next - node 0.x polyfill */
var gracefulQueue
var previousSymbol

/* istanbul ignore else - node 0.x polyfill */
if (typeof Symbol === 'function' && typeof Symbol.for === 'function') {
  gracefulQueue = Symbol.for('graceful-fs.queue')
  // This is used in testing by future versions
  previousSymbol = Symbol.for('graceful-fs.previous')
} else {
  gracefulQueue = '___graceful-fs.queue'
  previousSymbol = '___graceful-fs.previous'
}

function noop () {}

function publishQueue(context, queue) {
  Object.defineProperty(context, gracefulQueue, {
    get: function() {
      return queue
    }
  })
}

var debug = noop
if (util.debuglog)
  debug = util.debuglog('gfs4')
else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || ''))
  debug = function() {
    var m = util.format.apply(util, arguments)
    m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ')
    console.error(m)
  }

// Once time initialization
if (!fs[gracefulQueue]) {
  // This queue can be shared by multiple loaded instances
  var queue = global[gracefulQueue] || []
  publishQueue(fs, queue)

  // Patch fs.close/closeSync to shared queue version, because we need
  // to retry() whenever a close happens *anywhere* in the program.
  // This is essential when multiple graceful-fs instances are
  // in play at the same time.
  fs.close = (function (fs$close) {
    function close (fd, cb) {
      return fs$close.call(fs, fd, function (err) {
        // This function uses the graceful-fs shared queue
        if (!err) {
          resetQueue()
        }

        if (typeof cb === 'function')
          cb.apply(this, arguments)
      })
    }

    Object.defineProperty(close, previousSymbol, {
      value: fs$close
    })
    return close
  })(fs.close)

  fs.closeSync = (function (fs$closeSync) {
    function closeSync (fd) {
      // This function uses the graceful-fs shared queue
      fs$closeSync.apply(fs, arguments)
      resetQueue()
    }

    Object.defineProperty(closeSync, previousSymbol, {
      value: fs$closeSync
    })
    return closeSync
  })(fs.closeSync)

  if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) {
    process.on('exit', function() {
      debug(fs[gracefulQueue])
      require('assert').equal(fs[gracefulQueue].length, 0)
    })
  }
}

if (!global[gracefulQueue]) {
  publishQueue(global, fs[gracefulQueue]);
}

module.exports = patch(clone(fs))
if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) {
    module.exports = patch(fs)
    fs.__patched = true;
}

function patch (fs) {
  // Everything that references the open() function needs to be in here
  polyfills(fs)
  fs.gracefulify = patch

  fs.createReadStream = createReadStream
  fs.createWriteStream = createWriteStream
  var fs$readFile = fs.readFile
  fs.readFile = readFile
  function readFile (path, options, cb) {
    if (typeof options === 'function')
      cb = options, options = null

    return go$readFile(path, options, cb)

    function go$readFile (path, options, cb, startTime) {
      return fs$readFile(path, options, function (err) {
        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
          enqueue([go$readFile, [path, options, cb], err, startTime || Date.now(), Date.now()])
        else {
          if (typeof cb === 'function')
            cb.apply(this, arguments)
        }
      })
    }
  }

  var fs$writeFile = fs.writeFile
  fs.writeFile = writeFile
  function writeFile (path, data, options, cb) {
    if (typeof options === 'function')
      cb = options, options = null

    return go$writeFile(path, data, options, cb)

    function go$writeFile (path, data, options, cb, startTime) {
      return fs$writeFile(path, data, options, function (err) {
        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
          enqueue([go$writeFile, [path, data, options, cb], err, startTime || Date.now(), Date.now()])
        else {
          if (typeof cb === 'function')
            cb.apply(this, arguments)
        }
      })
    }
  }

  var fs$appendFile = fs.appendFile
  if (fs$appendFile)
    fs.appendFile = appendFile
  function appendFile (path, data, options, cb) {
    if (typeof options === 'function')
      cb = options, options = null

    return go$appendFile(path, data, options, cb)

    function go$appendFile (path, data, options, cb, startTime) {
      return fs$appendFile(path, data, options, function (err) {
        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
          enqueue([go$appendFile, [path, data, options, cb], err, startTime || Date.now(), Date.now()])
        else {
          if (typeof cb === 'function')
            cb.apply(this, arguments)
        }
      })
    }
  }

  var fs$copyFile = fs.copyFile
  if (fs$copyFile)
    fs.copyFile = copyFile
  function copyFile (src, dest, flags, cb) {
    if (typeof flags === 'function') {
      cb = flags
      flags = 0
    }
    return go$copyFile(src, dest, flags, cb)

    function go$copyFile (src, dest, flags, cb, startTime) {
      return fs$copyFile(src, dest, flags, function (err) {
        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
          enqueue([go$copyFile, [src, dest, flags, cb], err, startTime || Date.now(), Date.now()])
        else {
          if (typeof cb === 'function')
            cb.apply(this, arguments)
        }
      })
    }
  }

  var fs$readdir = fs.readdir
  fs.readdir = readdir
  var noReaddirOptionVersions = /^v[0-5]\./
  function readdir (path, options, cb) {
    if (typeof options === 'function')
      cb = options, options = null

    var go$readdir = noReaddirOptionVersions.test(process.version)
      ? function go$readdir (path, options, cb, startTime) {
        return fs$readdir(path, fs$readdirCallback(
          path, options, cb, startTime
        ))
      }
      : function go$readdir (path, options, cb, startTime) {
        return fs$readdir(path, options, fs$readdirCallback(
          path, options, cb, startTime
        ))
      }

    return go$readdir(path, options, cb)

    function fs$readdirCallback (path, options, cb, startTime) {
      return function (err, files) {
        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
          enqueue([
            go$readdir,
            [path, options, cb],
            err,
            startTime || Date.now(),
            Date.now()
          ])
        else {
          if (files && files.sort)
            files.sort()

          if (typeof cb === 'function')
            cb.call(this, err, files)
        }
      }
    }
  }

  if (process.version.substr(0, 4) === 'v0.8') {
    var legStreams = legacy(fs)
    ReadStream = legStreams.ReadStream
    WriteStream = legStreams.WriteStream
  }

  var fs$ReadStream = fs.ReadStream
  if (fs$ReadStream) {
    ReadStream.prototype = Object.create(fs$ReadStream.prototype)
    ReadStream.prototype.open = ReadStream$open
  }

  var fs$WriteStream = fs.WriteStream
  if (fs$WriteStream) {
    WriteStream.prototype = Object.create(fs$WriteStream.prototype)
    WriteStream.prototype.open = WriteStream$open
  }

  Object.defineProperty(fs, 'ReadStream', {
    get: function () {
      return ReadStream
    },
    set: function (val) {
      ReadStream = val
    },
    enumerable: true,
    configurable: true
  })
  Object.defineProperty(fs, 'WriteStream', {
    get: function () {
      return WriteStream
    },
    set: function (val) {
      WriteStream = val
    },
    enumerable: true,
    configurable: true
  })

  // legacy names
  var FileReadStream = ReadStream
  Object.defineProperty(fs, 'FileReadStream', {
    get: function () {
      return FileReadStream
    },
    set: function (val) {
      FileReadStream = val
    },
    enumerable: true,
    configurable: true
  })
  var FileWriteStream = WriteStream
  Object.defineProperty(fs, 'FileWriteStream', {
    get: function () {
      return FileWriteStream
    },
    set: function (val) {
      FileWriteStream = val
    },
    enumerable: true,
    configurable: true
  })

  function ReadStream (path, options) {
    if (this instanceof ReadStream)
      return fs$ReadStream.apply(this, arguments), this
    else
      return ReadStream.apply(Object.create(ReadStream.prototype), arguments)
  }

  function ReadStream$open () {
    var that = this
    open(that.path, that.flags, that.mode, function (err, fd) {
      if (err) {
        if (that.autoClose)
          that.destroy()

        that.emit('error', err)
      } else {
        that.fd = fd
        that.emit('open', fd)
        that.read()
      }
    })
  }

  function WriteStream (path, options) {
    if (this instanceof WriteStream)
      return fs$WriteStream.apply(this, arguments), this
    else
      return WriteStream.apply(Object.create(WriteStream.prototype), arguments)
  }

  function WriteStream$open () {
    var that = this
    open(that.path, that.flags, that.mode, function (err, fd) {
      if (err) {
        that.destroy()
        that.emit('error', err)
      } else {
        that.fd = fd
        that.emit('open', fd)
      }
    })
  }

  function createReadStream (path, options) {
    return new fs.ReadStream(path, options)
  }

  function createWriteStream (path, options) {
    return new fs.WriteStream(path, options)
  }

  var fs$open = fs.open
  fs.open = open
  function open (path, flags, mode, cb) {
    if (typeof mode === 'function')
      cb = mode, mode = null

    return go$open(path, flags, mode, cb)

    function go$open (path, flags, mode, cb, startTime) {
      return fs$open(path, flags, mode, function (err, fd) {
        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
          enqueue([go$open, [path, flags, mode, cb], err, startTime || Date.now(), Date.now()])
        else {
          if (typeof cb === 'function')
            cb.apply(this, arguments)
        }
      })
    }
  }

  return fs
}

function enqueue (elem) {
  debug('ENQUEUE', elem[0].name, elem[1])
  fs[gracefulQueue].push(elem)
  retry()
}

// keep track of the timeout between retry() calls
var retryTimer

// reset the startTime and lastTime to now
// this resets the start of the 60 second overall timeout as well as the
// delay between attempts so that we'll retry these jobs sooner
function resetQueue () {
  var now = Date.now()
  for (var i = 0; i < fs[gracefulQueue].length; ++i) {
    // entries that are only a length of 2 are from an older version, don't
    // bother modifying those since they'll be retried anyway.
    if (fs[gracefulQueue][i].length > 2) {
      fs[gracefulQueue][i][3] = now // startTime
      fs[gracefulQueue][i][4] = now // lastTime
    }
  }
  // call retry to make sure we're actively processing the queue
  retry()
}

function retry () {
  // clear the timer and remove it to help prevent unintended concurrency
  clearTimeout(retryTimer)
  retryTimer = undefined

  if (fs[gracefulQueue].length === 0)
    return

  var elem = fs[gracefulQueue].shift()
  var fn = elem[0]
  var args = elem[1]
  // these items may be unset if they were added by an older graceful-fs
  var err = elem[2]
  var startTime = elem[3]
  var lastTime = elem[4]

  // if we don't have a startTime we have no way of knowing if we've waited
  // long enough, so go ahead and retry this item now
  if (startTime === undefined) {
    debug('RETRY', fn.name, args)
    fn.apply(null, args)
  } else if (Date.now() - startTime >= 60000) {
    // it's been more than 60 seconds total, bail now
    debug('TIMEOUT', fn.name, args)
    var cb = args.pop()
    if (typeof cb === 'function')
      cb.call(null, err)
  } else {
    // the amount of time between the last attempt and right now
    var sinceAttempt = Date.now() - lastTime
    // the amount of time between when we first tried, and when we last tried
    // rounded up to at least 1
    var sinceStart = Math.max(lastTime - startTime, 1)
    // backoff. wait longer than the total time we've been retrying, but only
    // up to a maximum of 100ms
    var desiredDelay = Math.min(sinceStart * 1.2, 100)
    // it's been long enough since the last retry, do it again
    if (sinceAttempt >= desiredDelay) {
      debug('RETRY', fn.name, args)
      fn.apply(null, args.concat([startTime]))
    } else {
      // if we can't do this job yet, push it to the end of the queue
      // and let the next iteration check again
      fs[gracefulQueue].push(elem)
    }
  }

  // schedule our next run if one isn't already scheduled
  if (retryTimer === undefined) {
    retryTimer = setTimeout(retry, 0)
  }
}
var Stream = require('stream').Stream

module.exports = legacy

function legacy (fs) {
  return {
    ReadStream: ReadStream,
    WriteStream: WriteStream
  }

  function ReadStream (path, options) {
    if (!(this instanceof ReadStream)) return new ReadStream(path, options);

    Stream.call(this);

    var self = this;

    this.path = path;
    this.fd = null;
    this.readable = true;
    this.paused = false;

    this.flags = 'r';
    this.mode = 438; /*=0666*/
    this.bufferSize = 64 * 1024;

    options = options || {};

    // Mixin options into this
    var keys = Object.keys(options);
    for (var index = 0, length = keys.length; index < length; index++) {
      var key = keys[index];
      this[key] = options[key];
    }

    if (this.encoding) this.setEncoding(this.encoding);

    if (this.start !== undefined) {
      if ('number' !== typeof this.start) {
        throw TypeError('start must be a Number');
      }
      if (this.end === undefined) {
        this.end = Infinity;
      } else if ('number' !== typeof this.end) {
        throw TypeError('end must be a Number');
      }

      if (this.start > this.end) {
        throw new Error('start must be <= end');
      }

      this.pos = this.start;
    }

    if (this.fd !== null) {
      process.nextTick(function() {
        self._read();
      });
      return;
    }

    fs.open(this.path, this.flags, this.mode, function (err, fd) {
      if (err) {
        self.emit('error', err);
        self.readable = false;
        return;
      }

      self.fd = fd;
      self.emit('open', fd);
      self._read();
    })
  }

  function WriteStream (path, options) {
    if (!(this instanceof WriteStream)) return new WriteStream(path, options);

    Stream.call(this);

    this.path = path;
    this.fd = null;
    this.writable = true;

    this.flags = 'w';
    this.encoding = 'binary';
    this.mode = 438; /*=0666*/
    this.bytesWritten = 0;

    options = options || {};

    // Mixin options into this
    var keys = Object.keys(options);
    for (var index = 0, length = keys.length; index < length; index++) {
      var key = keys[index];
      this[key] = options[key];
    }

    if (this.start !== undefined) {
      if ('number' !== typeof this.start) {
        throw TypeError('start must be a Number');
      }
      if (this.start < 0) {
        throw new Error('start must be >= zero');
      }

      this.pos = this.start;
    }

    this.busy = false;
    this._queue = [];

    if (this.fd === null) {
      this._open = fs.open;
      this._queue.push([this._open, this.path, this.flags, this.mode, undefined]);
      this.flush();
    }
  }
}
{
  "name": "graceful-fs",
  "description": "A drop-in replacement for fs, making various improvements.",
  "version": "4.2.10",
  "repository": {
    "type": "git",
    "url": "https://github.com/isaacs/node-graceful-fs"
  },
  "main": "graceful-fs.js",
  "directories": {
    "test": "test"
  },
  "license": "ISC",
  "devDependencies": {
    "import-fresh": "^2.0.0",
    "mkdirp": "^0.5.0",
    "rimraf": "^2.2.8",
    "tap": "^12.7.0"
  },
  "files": [
    "fs.js",
    "graceful-fs.js",
    "legacy-streams.js",
    "polyfills.js",
    "clone.js"
  ]
}var constants = require('constants')

var origCwd = process.cwd
var cwd = null

var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform

process.cwd = function() {
  if (!cwd)
    cwd = origCwd.call(process)
  return cwd
}
try {
  process.cwd()
} catch (er) {}

// This check is needed until node.js 12 is required
if (typeof process.chdir === 'function') {
  var chdir = process.chdir
  process.chdir = function (d) {
    cwd = null
    chdir.call(process, d)
  }
  if (Object.setPrototypeOf) Object.setPrototypeOf(process.chdir, chdir)
}

module.exports = patch

function patch (fs) {
  // (re-)implement some things that are known busted or missing.

  // lchmod, broken prior to 0.6.2
  // back-port the fix here.
  if (constants.hasOwnProperty('O_SYMLINK') &&
      process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) {
    patchLchmod(fs)
  }

  // lutimes implementation, or no-op
  if (!fs.lutimes) {
    patchLutimes(fs)
  }

  // https://github.com/isaacs/node-graceful-fs/issues/4
  // Chown should not fail on einval or eperm if non-root.
  // It should not fail on enosys ever, as this just indicates
  // that a fs doesn't support the intended operation.

  fs.chown = chownFix(fs.chown)
  fs.fchown = chownFix(fs.fchown)
  fs.lchown = chownFix(fs.lchown)

  fs.chmod = chmodFix(fs.chmod)
  fs.fchmod = chmodFix(fs.fchmod)
  fs.lchmod = chmodFix(fs.lchmod)

  fs.chownSync = chownFixSync(fs.chownSync)
  fs.fchownSync = chownFixSync(fs.fchownSync)
  fs.lchownSync = chownFixSync(fs.lchownSync)

  fs.chmodSync = chmodFixSync(fs.chmodSync)
  fs.fchmodSync = chmodFixSync(fs.fchmodSync)
  fs.lchmodSync = chmodFixSync(fs.lchmodSync)

  fs.stat = statFix(fs.stat)
  fs.fstat = statFix(fs.fstat)
  fs.lstat = statFix(fs.lstat)

  fs.statSync = statFixSync(fs.statSync)
  fs.fstatSync = statFixSync(fs.fstatSync)
  fs.lstatSync = statFixSync(fs.lstatSync)

  // if lchmod/lchown do not exist, then make them no-ops
  if (fs.chmod && !fs.lchmod) {
    fs.lchmod = function (path, mode, cb) {
      if (cb) process.nextTick(cb)
    }
    fs.lchmodSync = function () {}
  }
  if (fs.chown && !fs.lchown) {
    fs.lchown = function (path, uid, gid, cb) {
      if (cb) process.nextTick(cb)
    }
    fs.lchownSync = function () {}
  }

  // on Windows, A/V software can lock the directory, causing this
  // to fail with an EACCES or EPERM if the directory contains newly
  // created files.  Try again on failure, for up to 60 seconds.

  // Set the timeout this long because some Windows Anti-Virus, such as Parity
  // bit9, may lock files for up to a minute, causing npm package install
  // failures. Also, take care to yield the scheduler. Windows scheduling gives
  // CPU to a busy looping process, which can cause the program causing the lock
  // contention to be starved of CPU by node, so the contention doesn't resolve.
  if (platform === "win32") {
    fs.rename = typeof fs.rename !== 'function' ? fs.rename
    : (function (fs$rename) {
      function rename (from, to, cb) {
        var start = Date.now()
        var backoff = 0;
        fs$rename(from, to, function CB (er) {
          if (er
              && (er.code === "EACCES" || er.code === "EPERM")
              && Date.now() - start < 60000) {
            setTimeout(function() {
              fs.stat(to, function (stater, st) {
                if (stater && stater.code === "ENOENT")
                  fs$rename(from, to, CB);
                else
                  cb(er)
              })
            }, backoff)
            if (backoff < 100)
              backoff += 10;
            return;
          }
          if (cb) cb(er)
        })
      }
      if (Object.setPrototypeOf) Object.setPrototypeOf(rename, fs$rename)
      return rename
    })(fs.rename)
  }

  // if read() returns EAGAIN, then just try it again.
  fs.read = typeof fs.read !== 'function' ? fs.read
  : (function (fs$read) {
    function read (fd, buffer, offset, length, position, callback_) {
      var callback
      if (callback_ && typeof callback_ === 'function') {
        var eagCounter = 0
        callback = function (er, _, __) {
          if (er && er.code === 'EAGAIN' && eagCounter < 10) {
            eagCounter ++
            return fs$read.call(fs, fd, buffer, offset, length, position, callback)
          }
          callback_.apply(this, arguments)
        }
      }
      return fs$read.call(fs, fd, buffer, offset, length, position, callback)
    }

    // This ensures `util.promisify` works as it does for native `fs.read`.
    if (Object.setPrototypeOf) Object.setPrototypeOf(read, fs$read)
    return read
  })(fs.read)

  fs.readSync = typeof fs.readSync !== 'function' ? fs.readSync
  : (function (fs$readSync) { return function (fd, buffer, offset, length, position) {
    var eagCounter = 0
    while (true) {
      try {
        return fs$readSync.call(fs, fd, buffer, offset, length, position)
      } catch (er) {
        if (er.code === 'EAGAIN' && eagCounter < 10) {
          eagCounter ++
          continue
        }
        throw er
      }
    }
  }})(fs.readSync)

  function patchLchmod (fs) {
    fs.lchmod = function (path, mode, callback) {
      fs.open( path
             , constants.O_WRONLY | constants.O_SYMLINK
             , mode
             , function (err, fd) {
        if (err) {
          if (callback) callback(err)
          return
        }
        // prefer to return the chmod error, if one occurs,
        // but still try to close, and report closing errors if they occur.
        fs.fchmod(fd, mode, function (err) {
          fs.close(fd, function(err2) {
            if (callback) callback(err || err2)
          })
        })
      })
    }

    fs.lchmodSync = function (path, mode) {
      var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode)

      // prefer to return the chmod error, if one occurs,
      // but still try to close, and report closing errors if they occur.
      var threw = true
      var ret
      try {
        ret = fs.fchmodSync(fd, mode)
        threw = false
      } finally {
        if (threw) {
          try {
            fs.closeSync(fd)
          } catch (er) {}
        } else {
          fs.closeSync(fd)
        }
      }
      return ret
    }
  }

  function patchLutimes (fs) {
    if (constants.hasOwnProperty("O_SYMLINK") && fs.futimes) {
      fs.lutimes = function (path, at, mt, cb) {
        fs.open(path, constants.O_SYMLINK, function (er, fd) {
          if (er) {
            if (cb) cb(er)
            return
          }
          fs.futimes(fd, at, mt, function (er) {
            fs.close(fd, function (er2) {
              if (cb) cb(er || er2)
            })
          })
        })
      }

      fs.lutimesSync = function (path, at, mt) {
        var fd = fs.openSync(path, constants.O_SYMLINK)
        var ret
        var threw = true
        try {
          ret = fs.futimesSync(fd, at, mt)
          threw = false
        } finally {
          if (threw) {
            try {
              fs.closeSync(fd)
            } catch (er) {}
          } else {
            fs.closeSync(fd)
          }
        }
        return ret
      }

    } else if (fs.futimes) {
      fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) }
      fs.lutimesSync = function () {}
    }
  }

  function chmodFix (orig) {
    if (!orig) return orig
    return function (target, mode, cb) {
      return orig.call(fs, target, mode, function (er) {
        if (chownErOk(er)) er = null
        if (cb) cb.apply(this, arguments)
      })
    }
  }

  function chmodFixSync (orig) {
    if (!orig) return orig
    return function (target, mode) {
      try {
        return orig.call(fs, target, mode)
      } catch (er) {
        if (!chownErOk(er)) throw er
      }
    }
  }


  function chownFix (orig) {
    if (!orig) return orig
    return function (target, uid, gid, cb) {
      return orig.call(fs, target, uid, gid, function (er) {
        if (chownErOk(er)) er = null
        if (cb) cb.apply(this, arguments)
      })
    }
  }

  function chownFixSync (orig) {
    if (!orig) return orig
    return function (target, uid, gid) {
      try {
        return orig.call(fs, target, uid, gid)
      } catch (er) {
        if (!chownErOk(er)) throw er
      }
    }
  }

  function statFix (orig) {
    if (!orig) return orig
    // Older versions of Node erroneously returned signed integers for
    // uid + gid.
    return function (target, options, cb) {
      if (typeof options === 'function') {
        cb = options
        options = null
      }
      function callback (er, stats) {
        if (stats) {
          if (stats.uid < 0) stats.uid += 0x100000000
          if (stats.gid < 0) stats.gid += 0x100000000
        }
        if (cb) cb.apply(this, arguments)
      }
      return options ? orig.call(fs, target, options, callback)
        : orig.call(fs, target, callback)
    }
  }

  function statFixSync (orig) {
    if (!orig) return orig
    // Older versions of Node erroneously returned signed integers for
    // uid + gid.
    return function (target, options) {
      var stats = options ? orig.call(fs, target, options)
        : orig.call(fs, target)
      if (stats) {
        if (stats.uid < 0) stats.uid += 0x100000000
        if (stats.gid < 0) stats.gid += 0x100000000
      }
      return stats;
    }
  }

  // ENOSYS means that the fs doesn't support the op. Just ignore
  // that, because it doesn't matter.
  //
  // if there's no getuid, or if getuid() is something other
  // than 0, and the error is EINVAL or EPERM, then just ignore
  // it.
  //
  // This specific case is a silent failure in cp, install, tar,
  // and most other unix tools that manage permissions.
  //
  // When running as root, or if other types of errors are
  // encountered, then it's strict.
  function chownErOk (er) {
    if (!er)
      return true

    if (er.code === "ENOSYS")
      return true

    var nonroot = !process.getuid || process.getuid() !== 0
    if (nonroot) {
      if (er.code === "EINVAL" || er.code === "EPERM")
        return true
    }

    return false
  }
}
Copyright (c) 2013 Thiago de Arruda

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": "has",
  "description": "Object.prototype.hasOwnProperty.call shortcut",
  "version": "1.0.3",
  "homepage": "https://github.com/tarruda/has",
  "author": {
    "name": "Thiago de Arruda",
    "email": "tpadilha84@gmail.com"
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/tarruda/has.git"
  },
  "license": "MIT",
  "licenses": [
    {
      "type": "MIT",
      "url": "https://github.com/tarruda/has/blob/master/LICENSE-MIT"
    }
  ],
  "main": "./src",
  "dependencies": {
    "function-bind": "^1.1.1"
  },
  "devDependencies": {
    "@ljharb/eslint-config": "^12.2.1",
    "eslint": "^4.19.1",
    "tape": "^4.9.0"
  },
  "engines": {
    "node": ">= 0.4.0"
  }
}'use strict';

var bind = require('function-bind');

module.exports = bind.call(Function.call, Object.prototype.hasOwnProperty);
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"exclude": [
		"coverage",
		"test"
	]
}
MIT License

Copyright (c) 2019 Jordan Harband

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 $BigInt = typeof BigInt !== 'undefined' && BigInt;

module.exports = function hasNativeBigInts() {
	return typeof $BigInt === 'function'
		&& typeof BigInt === 'function'
		&& typeof $BigInt(42) === 'bigint' // eslint-disable-line no-magic-numbers
		&& typeof BigInt(42) === 'bigint'; // eslint-disable-line no-magic-numbers
};
{
  "name": "has-bigints",
  "version": "1.0.2",
  "description": "Determine if the JS environment has BigInt support.",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/ljharb/has-bigints.git"
  },
  "author": "Jordan Harband <ljharb@gmail.com>",
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "license": "MIT",
  "homepage": "https://github.com/ljharb/has-bigints#readme",
  "devDependencies": {
    "@ljharb/eslint-config": "^21.0.0",
    "aud": "^2.0.0",
    "auto-changelog": "^2.4.0",
    "eslint": "=8.8.0",
    "in-publish": "^2.0.1",
    "nyc": "^10.3.2",
    "safe-publish-latest": "^2.0.0",
    "tape": "^5.5.3"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false,
    "hideCredit": true
  }
}# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/has-bigints
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"exclude": [
		"coverage",
		"test"
	]
}
MIT License

Copyright (c) 2022 Inspect JS

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 GetIntrinsic = require('get-intrinsic');

var $defineProperty = GetIntrinsic('%Object.defineProperty%', true);

var hasPropertyDescriptors = function hasPropertyDescriptors() {
	if ($defineProperty) {
		try {
			$defineProperty({}, 'a', { value: 1 });
			return true;
		} catch (e) {
			// IE 8 has a broken defineProperty
			return false;
		}
	}
	return false;
};

hasPropertyDescriptors.hasArrayLengthDefineBug = function hasArrayLengthDefineBug() {
	// node v0.6 has a bug where array lengths can be Set but not Defined
	if (!hasPropertyDescriptors()) {
		return null;
	}
	try {
		return $defineProperty([], 'length', { value: 1 }).length !== 1;
	} catch (e) {
		// In Firefox 4-22, defining length on an array throws an exception.
		return true;
	}
};

module.exports = hasPropertyDescriptors;
{
  "name": "has-property-descriptors",
  "version": "1.0.0",
  "description": "Does the environment have full property descriptor support? Handles IE 8's broken defineProperty/gOPD.",
  "main": "index.js",
  "exports": {
    ".": "./index.js",
    "./package.json": "./package.json"
  },
  "sideEffects": false,
  "repository": {
    "type": "git",
    "url": "git+https://github.com/inspect-js/has-property-descriptors.git"
  },
  "author": "Jordan Harband <ljharb@gmail.com>",
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "license": "MIT",
  "homepage": "https://github.com/inspect-js/has-property-descriptors#readme",
  "devDependencies": {
    "@ljharb/eslint-config": "^21.0.0",
    "aud": "^2.0.0",
    "auto-changelog": "^2.4.0",
    "eslint": "=8.8.0",
    "in-publish": "^2.0.1",
    "evalmd": "^0.0.19",
    "nyc": "^10.3.2",
    "safe-publish-latest": "^2.0.0",
    "tape": "^5.5.3"
  },
  "dependencies": {
    "get-intrinsic": "^1.1.1"
  },
  "testling": {
    "files": "test/index.js"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false,
    "hideCredit": true
  }
}# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/has-property-descriptors
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"exclude": [
		"coverage",
		"test"
	]
}
MIT License

Copyright (c) 2016 Jordan Harband

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 origSymbol = typeof Symbol !== 'undefined' && Symbol;
var hasSymbolSham = require('./shams');

module.exports = function hasNativeSymbols() {
	if (typeof origSymbol !== 'function') { return false; }
	if (typeof Symbol !== 'function') { return false; }
	if (typeof origSymbol('foo') !== 'symbol') { return false; }
	if (typeof Symbol('bar') !== 'symbol') { return false; }

	return hasSymbolSham();
};
{
  "name": "has-symbols",
  "version": "1.0.3",
  "description": "Determine if the JS environment has Symbol support. Supports spec, or shams.",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/inspect-js/has-symbols.git"
  },
  "author": {
    "name": "Jordan Harband",
    "email": "ljharb@gmail.com",
    "url": "http://ljharb.codes"
  },
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "license": "MIT",
  "homepage": "https://github.com/ljharb/has-symbols#readme",
  "devDependencies": {
    "@ljharb/eslint-config": "^20.2.3",
    "aud": "^2.0.0",
    "auto-changelog": "^2.4.0",
    "core-js": "^2.6.12",
    "eslint": "=8.8.0",
    "get-own-property-symbols": "^0.9.5",
    "nyc": "^10.3.2",
    "safe-publish-latest": "^2.0.0",
    "tape": "^5.5.2"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "engines": {
    "node": ">= 0.4"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false,
    "hideCredit": true
  },
  "greenkeeper": {
    "ignore": [
      "core-js"
    ]
  }
}'use strict';

/* eslint complexity: [2, 18], max-statements: [2, 33] */
module.exports = function hasSymbols() {
	if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
	if (typeof Symbol.iterator === 'symbol') { return true; }

	var obj = {};
	var sym = Symbol('test');
	var symObj = Object(sym);
	if (typeof sym === 'string') { return false; }

	if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }
	if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }

	// temp disabled per https://github.com/ljharb/object.assign/issues/17
	// if (sym instanceof Symbol) { return false; }
	// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
	// if (!(symObj instanceof Symbol)) { return false; }

	// if (typeof Symbol.prototype.toString !== 'function') { return false; }
	// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }

	var symVal = 42;
	obj[sym] = symVal;
	for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop
	if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }

	if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }

	var syms = Object.getOwnPropertySymbols(obj);
	if (syms.length !== 1 || syms[0] !== sym) { return false; }

	if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }

	if (typeof Object.getOwnPropertyDescriptor === 'function') {
		var descriptor = Object.getOwnPropertyDescriptor(obj, sym);
		if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
	}

	return true;
};
# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/has-symbols
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
MIT License

Copyright (c) 2021 Inspect JS

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 hasSymbols = require('has-symbols');

module.exports = function hasToStringTag() {
	return hasSymbols() && typeof Symbol.toStringTag === 'symbol';
};
{
  "name": "has-tostringtag",
  "version": "1.0.0",
  "author": {
    "name": "Jordan Harband",
    "email": "ljharb@gmail.com",
    "url": "http://ljharb.codes"
  },
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "description": "Determine if the JS environment has `Symbol.toStringTag` support. Supports spec, or shams.",
  "license": "MIT",
  "main": "index.js",
  "exports": {
    ".": "./index.js",
    "./shams": "./shams.js",
    "./package.json": "./package.json"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/inspect-js/has-tostringtag.git"
  },
  "homepage": "https://github.com/inspect-js/has-tostringtag#readme",
  "dependencies": {
    "has-symbols": "^1.0.2"
  },
  "devDependencies": {
    "@ljharb/eslint-config": "^17.6.0",
    "aud": "^1.1.5",
    "auto-changelog": "^2.3.0",
    "core-js": "^2.6.12",
    "eslint": "^7.32.0",
    "get-own-property-symbols": "^0.9.5",
    "nyc": "^10.3.2",
    "safe-publish-latest": "^1.1.4",
    "tape": "^5.3.0"
  },
  "engines": {
    "node": ">= 0.4"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false,
    "hideCredit": true
  }
}'use strict';

var hasSymbols = require('has-symbols/shams');

module.exports = function hasToStringTagShams() {
	return hasSymbols() && !!Symbol.toStringTag;
};
# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/has-tostringtag
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
Copyright (c) 2014, Rebecca Turner <me@re-becca.org>

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.

"use strict"
var os = require("os")

var hasUnicode = module.exports = function () {
  // Recent Win32 platforms (>XP) CAN support unicode in the console but
  // don't have to, and in non-english locales often use traditional local
  // code pages. There's no way, short of windows system calls or execing
  // the chcp command line program to figure this out. As such, we default
  // this to false and encourage your users to override it via config if
  // appropriate.
  if (os.type() == "Windows_NT") { return false }

  var isUTF8 = /UTF-?8$/i
  var ctype = process.env.LC_ALL || process.env.LC_CTYPE || process.env.LANG
  return isUTF8.test(ctype)
}
{
  "name": "has-unicode",
  "version": "2.0.1",
  "description": "Try to guess if your terminal supports unicode",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "https://github.com/iarna/has-unicode"
  },
  "files": [
    "index.js"
  ],
  "author": "Rebecca Turner <me@re-becca.org>",
  "license": "ISC",
  "homepage": "https://github.com/iarna/has-unicode",
  "devDependencies": {
    "require-inject": "^1.3.0",
    "tap": "^2.3.1"
  }
}MIT License

Copyright (c) 2022 Giorgio Bellisario

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": "hostname-patcher",
  "version": "1.1.0",
  "description": "Patches os.hostname() for Windows 7 devices using a not officially Node.js supported version",
  "main": "./lib/index.js",
  "repository": {
    "type": "git",
    "url": "https://github.com/Bellisario/hostname-patcher.git"
  },
  "homepage": "https://github.com/Bellisario/hostname-patcher",
  "author": "Bellisario",
  "license": "MIT",
  "devDependencies": {
    "@jsdevtools/npm-publish": "^1.4.3",
    "nodemailer": "^6.7.6"
  }
}const npmPublish = require('@jsdevtools/npm-publish');

// get NPM token from environment
const token = process.env.NPM_TOKEN;

// error if no token is provided
if (!token) {
    console.error('NPM_TOKEN environment variable is not set');
    process.exit(1);
}
// publish the package to NPM
npmPublish({
  package: './package.json',
  token
});//@ts-check
const { needsPatch, getHostname } = require('./utils');
const os = require('os');


if (needsPatch()) {
    const patchHostname = getHostname();
    /**
     * thanks to @andris9 for his help with this
     * https://github.com/nodemailer/nodemailer/issues/1410#issuecomment-1144628473
     */
    os.hostname = () => patchHostname;
}//@ts-check
const os = require('os');
const execSync = require('child_process').execSync;

/**
 * Detect if patch is needed or not
 * @returns {boolean}
 */
const needsPatch = () => {
    try {
        os.hostname();
        return false;
    } catch (err) {
        return true;
    }
}

/**
 * Get the current hostname using CMD command (not the OS built-in module)
 * Returns localhost as fallback if the command fails
 * @returns {string}
 */
const getHostname = () => {
    let result;
    try {
        result = execSync('hostname').toString().trim();
    } catch(e) {
        result = 'localhost';
    }
    return result;
}

module.exports = { needsPatch, getHostname };
name: Publish

on:
  release:
    types: [published]

jobs:
  publish:
    runs-on: ubuntu-latest

    steps:
      - name: Git checkout
        uses: actions/checkout@v2

      - name: Use Node 16.x
        uses: actions/setup-node@v1
        with:
          node-version: 16.x

      - name: Install dependencies
        run: npm install

      - name: Publish
        run: npm run npm-publish
        env:
          CI: true
          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
Copyright 2016-2018 Kornel Lesiński

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';
// rfc7231 6.1
const statusCodeCacheableByDefault = new Set([
    200,
    203,
    204,
    206,
    300,
    301,
    404,
    405,
    410,
    414,
    501,
]);

// This implementation does not understand partial responses (206)
const understoodStatuses = new Set([
    200,
    203,
    204,
    300,
    301,
    302,
    303,
    307,
    308,
    404,
    405,
    410,
    414,
    501,
]);

const errorStatusCodes = new Set([
    500,
    502,
    503, 
    504,
]);

const hopByHopHeaders = {
    date: true, // included, because we add Age update Date
    connection: true,
    'keep-alive': true,
    'proxy-authenticate': true,
    'proxy-authorization': true,
    te: true,
    trailer: true,
    'transfer-encoding': true,
    upgrade: true,
};

const excludedFromRevalidationUpdate = {
    // Since the old body is reused, it doesn't make sense to change properties of the body
    'content-length': true,
    'content-encoding': true,
    'transfer-encoding': true,
    'content-range': true,
};

function toNumberOrZero(s) {
    const n = parseInt(s, 10);
    return isFinite(n) ? n : 0;
}

// RFC 5861
function isErrorResponse(response) {
    // consider undefined response as faulty
    if(!response) {
        return true
    }
    return errorStatusCodes.has(response.status);
}

function parseCacheControl(header) {
    const cc = {};
    if (!header) return cc;

    // TODO: When there is more than one value present for a given directive (e.g., two Expires header fields, multiple Cache-Control: max-age directives),
    // the directive's value is considered invalid. Caches are encouraged to consider responses that have invalid freshness information to be stale
    const parts = header.trim().split(/\s*,\s*/); // TODO: lame parsing
    for (const part of parts) {
        const [k, v] = part.split(/\s*=\s*/, 2);
        cc[k] = v === undefined ? true : v.replace(/^"|"$/g, ''); // TODO: lame unquoting
    }

    return cc;
}

function formatCacheControl(cc) {
    let parts = [];
    for (const k in cc) {
        const v = cc[k];
        parts.push(v === true ? k : k + '=' + v);
    }
    if (!parts.length) {
        return undefined;
    }
    return parts.join(', ');
}

module.exports = class CachePolicy {
    constructor(
        req,
        res,
        {
            shared,
            cacheHeuristic,
            immutableMinTimeToLive,
            ignoreCargoCult,
            _fromObject,
        } = {}
    ) {
        if (_fromObject) {
            this._fromObject(_fromObject);
            return;
        }

        if (!res || !res.headers) {
            throw Error('Response headers missing');
        }
        this._assertRequestHasHeaders(req);

        this._responseTime = this.now();
        this._isShared = shared !== false;
        this._cacheHeuristic =
            undefined !== cacheHeuristic ? cacheHeuristic : 0.1; // 10% matches IE
        this._immutableMinTtl =
            undefined !== immutableMinTimeToLive
                ? immutableMinTimeToLive
                : 24 * 3600 * 1000;

        this._status = 'status' in res ? res.status : 200;
        this._resHeaders = res.headers;
        this._rescc = parseCacheControl(res.headers['cache-control']);
        this._method = 'method' in req ? req.method : 'GET';
        this._url = req.url;
        this._host = req.headers.host;
        this._noAuthorization = !req.headers.authorization;
        this._reqHeaders = res.headers.vary ? req.headers : null; // Don't keep all request headers if they won't be used
        this._reqcc = parseCacheControl(req.headers['cache-control']);

        // Assume that if someone uses legacy, non-standard uncecessary options they don't understand caching,
        // so there's no point stricly adhering to the blindly copy&pasted directives.
        if (
            ignoreCargoCult &&
            'pre-check' in this._rescc &&
            'post-check' in this._rescc
        ) {
            delete this._rescc['pre-check'];
            delete this._rescc['post-check'];
            delete this._rescc['no-cache'];
            delete this._rescc['no-store'];
            delete this._rescc['must-revalidate'];
            this._resHeaders = Object.assign({}, this._resHeaders, {
                'cache-control': formatCacheControl(this._rescc),
            });
            delete this._resHeaders.expires;
            delete this._resHeaders.pragma;
        }

        // When the Cache-Control header field is not present in a request, caches MUST consider the no-cache request pragma-directive
        // as having the same effect as if "Cache-Control: no-cache" were present (see Section 5.2.1).
        if (
            res.headers['cache-control'] == null &&
            /no-cache/.test(res.headers.pragma)
        ) {
            this._rescc['no-cache'] = true;
        }
    }

    now() {
        return Date.now();
    }

    storable() {
        // The "no-store" request directive indicates that a cache MUST NOT store any part of either this request or any response to it.
        return !!(
            !this._reqcc['no-store'] &&
            // A cache MUST NOT store a response to any request, unless:
            // The request method is understood by the cache and defined as being cacheable, and
            ('GET' === this._method ||
                'HEAD' === this._method ||
                ('POST' === this._method && this._hasExplicitExpiration())) &&
            // the response status code is understood by the cache, and
            understoodStatuses.has(this._status) &&
            // the "no-store" cache directive does not appear in request or response header fields, and
            !this._rescc['no-store'] &&
            // the "private" response directive does not appear in the response, if the cache is shared, and
            (!this._isShared || !this._rescc.private) &&
            // the Authorization header field does not appear in the request, if the cache is shared,
            (!this._isShared ||
                this._noAuthorization ||
                this._allowsStoringAuthenticated()) &&
            // the response either:
            // contains an Expires header field, or
            (this._resHeaders.expires ||
                // contains a max-age response directive, or
                // contains a s-maxage response directive and the cache is shared, or
                // contains a public response directive.
                this._rescc['max-age'] ||
                (this._isShared && this._rescc['s-maxage']) ||
                this._rescc.public ||
                // has a status code that is defined as cacheable by default
                statusCodeCacheableByDefault.has(this._status))
        );
    }

    _hasExplicitExpiration() {
        // 4.2.1 Calculating Freshness Lifetime
        return (
            (this._isShared && this._rescc['s-maxage']) ||
            this._rescc['max-age'] ||
            this._resHeaders.expires
        );
    }

    _assertRequestHasHeaders(req) {
        if (!req || !req.headers) {
            throw Error('Request headers missing');
        }
    }

    satisfiesWithoutRevalidation(req) {
        this._assertRequestHasHeaders(req);

        // When presented with a request, a cache MUST NOT reuse a stored response, unless:
        // the presented request does not contain the no-cache pragma (Section 5.4), nor the no-cache cache directive,
        // unless the stored response is successfully validated (Section 4.3), and
        const requestCC = parseCacheControl(req.headers['cache-control']);
        if (requestCC['no-cache'] || /no-cache/.test(req.headers.pragma)) {
            return false;
        }

        if (requestCC['max-age'] && this.age() > requestCC['max-age']) {
            return false;
        }

        if (
            requestCC['min-fresh'] &&
            this.timeToLive() < 1000 * requestCC['min-fresh']
        ) {
            return false;
        }

        // the stored response is either:
        // fresh, or allowed to be served stale
        if (this.stale()) {
            const allowsStale =
                requestCC['max-stale'] &&
                !this._rescc['must-revalidate'] &&
                (true === requestCC['max-stale'] ||
                    requestCC['max-stale'] > this.age() - this.maxAge());
            if (!allowsStale) {
                return false;
            }
        }

        return this._requestMatches(req, false);
    }

    _requestMatches(req, allowHeadMethod) {
        // The presented effective request URI and that of the stored response match, and
        return (
            (!this._url || this._url === req.url) &&
            this._host === req.headers.host &&
            // the request method associated with the stored response allows it to be used for the presented request, and
            (!req.method ||
                this._method === req.method ||
                (allowHeadMethod && 'HEAD' === req.method)) &&
            // selecting header fields nominated by the stored response (if any) match those presented, and
            this._varyMatches(req)
        );
    }

    _allowsStoringAuthenticated() {
        //  following Cache-Control response directives (Section 5.2.2) have such an effect: must-revalidate, public, and s-maxage.
        return (
            this._rescc['must-revalidate'] ||
            this._rescc.public ||
            this._rescc['s-maxage']
        );
    }

    _varyMatches(req) {
        if (!this._resHeaders.vary) {
            return true;
        }

        // A Vary header field-value of "*" always fails to match
        if (this._resHeaders.vary === '*') {
            return false;
        }

        const fields = this._resHeaders.vary
            .trim()
            .toLowerCase()
            .split(/\s*,\s*/);
        for (const name of fields) {
            if (req.headers[name] !== this._reqHeaders[name]) return false;
        }
        return true;
    }

    _copyWithoutHopByHopHeaders(inHeaders) {
        const headers = {};
        for (const name in inHeaders) {
            if (hopByHopHeaders[name]) continue;
            headers[name] = inHeaders[name];
        }
        // 9.1.  Connection
        if (inHeaders.connection) {
            const tokens = inHeaders.connection.trim().split(/\s*,\s*/);
            for (const name of tokens) {
                delete headers[name];
            }
        }
        if (headers.warning) {
            const warnings = headers.warning.split(/,/).filter(warning => {
                return !/^\s*1[0-9][0-9]/.test(warning);
            });
            if (!warnings.length) {
                delete headers.warning;
            } else {
                headers.warning = warnings.join(',').trim();
            }
        }
        return headers;
    }

    responseHeaders() {
        const headers = this._copyWithoutHopByHopHeaders(this._resHeaders);
        const age = this.age();

        // A cache SHOULD generate 113 warning if it heuristically chose a freshness
        // lifetime greater than 24 hours and the response's age is greater than 24 hours.
        if (
            age > 3600 * 24 &&
            !this._hasExplicitExpiration() &&
            this.maxAge() > 3600 * 24
        ) {
            headers.warning =
                (headers.warning ? `${headers.warning}, ` : '') +
                '113 - "rfc7234 5.5.4"';
        }
        headers.age = `${Math.round(age)}`;
        headers.date = new Date(this.now()).toUTCString();
        return headers;
    }

    /**
     * Value of the Date response header or current time if Date was invalid
     * @return timestamp
     */
    date() {
        const serverDate = Date.parse(this._resHeaders.date);
        if (isFinite(serverDate)) {
            return serverDate;
        }
        return this._responseTime;
    }

    /**
     * Value of the Age header, in seconds, updated for the current time.
     * May be fractional.
     *
     * @return Number
     */
    age() {
        let age = this._ageValue();

        const residentTime = (this.now() - this._responseTime) / 1000;
        return age + residentTime;
    }

    _ageValue() {
        return toNumberOrZero(this._resHeaders.age);
    }

    /**
     * Value of applicable max-age (or heuristic equivalent) in seconds. This counts since response's `Date`.
     *
     * For an up-to-date value, see `timeToLive()`.
     *
     * @return Number
     */
    maxAge() {
        if (!this.storable() || this._rescc['no-cache']) {
            return 0;
        }

        // Shared responses with cookies are cacheable according to the RFC, but IMHO it'd be unwise to do so by default
        // so this implementation requires explicit opt-in via public header
        if (
            this._isShared &&
            (this._resHeaders['set-cookie'] &&
                !this._rescc.public &&
                !this._rescc.immutable)
        ) {
            return 0;
        }

        if (this._resHeaders.vary === '*') {
            return 0;
        }

        if (this._isShared) {
            if (this._rescc['proxy-revalidate']) {
                return 0;
            }
            // if a response includes the s-maxage directive, a shared cache recipient MUST ignore the Expires field.
            if (this._rescc['s-maxage']) {
                return toNumberOrZero(this._rescc['s-maxage']);
            }
        }

        // If a response includes a Cache-Control field with the max-age directive, a recipient MUST ignore the Expires field.
        if (this._rescc['max-age']) {
            return toNumberOrZero(this._rescc['max-age']);
        }

        const defaultMinTtl = this._rescc.immutable ? this._immutableMinTtl : 0;

        const serverDate = this.date();
        if (this._resHeaders.expires) {
            const expires = Date.parse(this._resHeaders.expires);
            // A cache recipient MUST interpret invalid date formats, especially the value "0", as representing a time in the past (i.e., "already expired").
            if (Number.isNaN(expires) || expires < serverDate) {
                return 0;
            }
            return Math.max(defaultMinTtl, (expires - serverDate) / 1000);
        }

        if (this._resHeaders['last-modified']) {
            const lastModified = Date.parse(this._resHeaders['last-modified']);
            if (isFinite(lastModified) && serverDate > lastModified) {
                return Math.max(
                    defaultMinTtl,
                    ((serverDate - lastModified) / 1000) * this._cacheHeuristic
                );
            }
        }

        return defaultMinTtl;
    }

    timeToLive() {
        const age = this.maxAge() - this.age();
        const staleIfErrorAge = age + toNumberOrZero(this._rescc['stale-if-error']);
        const staleWhileRevalidateAge = age + toNumberOrZero(this._rescc['stale-while-revalidate']);
        return Math.max(0, age, staleIfErrorAge, staleWhileRevalidateAge) * 1000;
    }

    stale() {
        return this.maxAge() <= this.age();
    }

    _useStaleIfError() {
        return this.maxAge() + toNumberOrZero(this._rescc['stale-if-error']) > this.age();
    }

    useStaleWhileRevalidate() {
        return this.maxAge() + toNumberOrZero(this._rescc['stale-while-revalidate']) > this.age();
    }

    static fromObject(obj) {
        return new this(undefined, undefined, { _fromObject: obj });
    }

    _fromObject(obj) {
        if (this._responseTime) throw Error('Reinitialized');
        if (!obj || obj.v !== 1) throw Error('Invalid serialization');

        this._responseTime = obj.t;
        this._isShared = obj.sh;
        this._cacheHeuristic = obj.ch;
        this._immutableMinTtl =
            obj.imm !== undefined ? obj.imm : 24 * 3600 * 1000;
        this._status = obj.st;
        this._resHeaders = obj.resh;
        this._rescc = obj.rescc;
        this._method = obj.m;
        this._url = obj.u;
        this._host = obj.h;
        this._noAuthorization = obj.a;
        this._reqHeaders = obj.reqh;
        this._reqcc = obj.reqcc;
    }

    toObject() {
        return {
            v: 1,
            t: this._responseTime,
            sh: this._isShared,
            ch: this._cacheHeuristic,
            imm: this._immutableMinTtl,
            st: this._status,
            resh: this._resHeaders,
            rescc: this._rescc,
            m: this._method,
            u: this._url,
            h: this._host,
            a: this._noAuthorization,
            reqh: this._reqHeaders,
            reqcc: this._reqcc,
        };
    }

    /**
     * Headers for sending to the origin server to revalidate stale response.
     * Allows server to return 304 to allow reuse of the previous response.
     *
     * Hop by hop headers are always stripped.
     * Revalidation headers may be added or removed, depending on request.
     */
    revalidationHeaders(incomingReq) {
        this._assertRequestHasHeaders(incomingReq);
        const headers = this._copyWithoutHopByHopHeaders(incomingReq.headers);

        // This implementation does not understand range requests
        delete headers['if-range'];

        if (!this._requestMatches(incomingReq, true) || !this.storable()) {
            // revalidation allowed via HEAD
            // not for the same resource, or wasn't allowed to be cached anyway
            delete headers['if-none-match'];
            delete headers['if-modified-since'];
            return headers;
        }

        /* MUST send that entity-tag in any cache validation request (using If-Match or If-None-Match) if an entity-tag has been provided by the origin server. */
        if (this._resHeaders.etag) {
            headers['if-none-match'] = headers['if-none-match']
                ? `${headers['if-none-match']}, ${this._resHeaders.etag}`
                : this._resHeaders.etag;
        }

        // Clients MAY issue simple (non-subrange) GET requests with either weak validators or strong validators. Clients MUST NOT use weak validators in other forms of request.
        const forbidsWeakValidators =
            headers['accept-ranges'] ||
            headers['if-match'] ||
            headers['if-unmodified-since'] ||
            (this._method && this._method != 'GET');

        /* SHOULD send the Last-Modified value in non-subrange cache validation requests (using If-Modified-Since) if only a Last-Modified value has been provided by the origin server.
        Note: This implementation does not understand partial responses (206) */
        if (forbidsWeakValidators) {
            delete headers['if-modified-since'];

            if (headers['if-none-match']) {
                const etags = headers['if-none-match']
                    .split(/,/)
                    .filter(etag => {
                        return !/^\s*W\//.test(etag);
                    });
                if (!etags.length) {
                    delete headers['if-none-match'];
                } else {
                    headers['if-none-match'] = etags.join(',').trim();
                }
            }
        } else if (
            this._resHeaders['last-modified'] &&
            !headers['if-modified-since']
        ) {
            headers['if-modified-since'] = this._resHeaders['last-modified'];
        }

        return headers;
    }

    /**
     * Creates new CachePolicy with information combined from the previews response,
     * and the new revalidation response.
     *
     * Returns {policy, modified} where modified is a boolean indicating
     * whether the response body has been modified, and old cached body can't be used.
     *
     * @return {Object} {policy: CachePolicy, modified: Boolean}
     */
    revalidatedPolicy(request, response) {
        this._assertRequestHasHeaders(request);
        if(this._useStaleIfError() && isErrorResponse(response)) {  // I consider the revalidation request unsuccessful
          return {
            modified: false,
            matches: false,
            policy: this,
          };
        }
        if (!response || !response.headers) {
            throw Error('Response headers missing');
        }

        // These aren't going to be supported exactly, since one CachePolicy object
        // doesn't know about all the other cached objects.
        let matches = false;
        if (response.status !== undefined && response.status != 304) {
            matches = false;
        } else if (
            response.headers.etag &&
            !/^\s*W\//.test(response.headers.etag)
        ) {
            // "All of the stored responses with the same strong validator are selected.
            // If none of the stored responses contain the same strong validator,
            // then the cache MUST NOT use the new response to update any stored responses."
            matches =
                this._resHeaders.etag &&
                this._resHeaders.etag.replace(/^\s*W\//, '') ===
                    response.headers.etag;
        } else if (this._resHeaders.etag && response.headers.etag) {
            // "If the new response contains a weak validator and that validator corresponds
            // to one of the cache's stored responses,
            // then the most recent of those matching stored responses is selected for update."
            matches =
                this._resHeaders.etag.replace(/^\s*W\//, '') ===
                response.headers.etag.replace(/^\s*W\//, '');
        } else if (this._resHeaders['last-modified']) {
            matches =
                this._resHeaders['last-modified'] ===
                response.headers['last-modified'];
        } else {
            // If the new response does not include any form of validator (such as in the case where
            // a client generates an If-Modified-Since request from a source other than the Last-Modified
            // response header field), and there is only one stored response, and that stored response also
            // lacks a validator, then that stored response is selected for update.
            if (
                !this._resHeaders.etag &&
                !this._resHeaders['last-modified'] &&
                !response.headers.etag &&
                !response.headers['last-modified']
            ) {
                matches = true;
            }
        }

        if (!matches) {
            return {
                policy: new this.constructor(request, response),
                // Client receiving 304 without body, even if it's invalid/mismatched has no option
                // but to reuse a cached body. We don't have a good way to tell clients to do
                // error recovery in such case.
                modified: response.status != 304,
                matches: false,
            };
        }

        // use other header fields provided in the 304 (Not Modified) response to replace all instances
        // of the corresponding header fields in the stored response.
        const headers = {};
        for (const k in this._resHeaders) {
            headers[k] =
                k in response.headers && !excludedFromRevalidationUpdate[k]
                    ? response.headers[k]
                    : this._resHeaders[k];
        }

        const newResponse = Object.assign({}, response, {
            status: this._status,
            method: this._method,
            headers,
        });
        return {
            policy: new this.constructor(request, newResponse, {
                shared: this._isShared,
                cacheHeuristic: this._cacheHeuristic,
                immutableMinTimeToLive: this._immutableMinTtl,
            }),
            modified: false,
            matches: true,
        };
    }
};
{
  "name": "http-cache-semantics",
  "version": "4.1.0",
  "description": "Parses Cache-Control and other headers. Helps building correct HTTP caches and proxies",
  "repository": "https://github.com/kornelski/http-cache-semantics.git",
  "main": "index.js",
  "files": [
    "index.js"
  ],
  "author": "Kornel Lesiński <kornel@geekhood.net> (https://kornel.ski/)",
  "license": "BSD-2-Clause",
  "devDependencies": {
    "eslint": "^5.13.0",
    "eslint-plugin-prettier": "^3.0.1",
    "husky": "^0.14.3",
    "lint-staged": "^8.1.3",
    "mocha": "^5.1.0",
    "prettier": "^1.14.3",
    "prettier-eslint-cli": "^4.7.1"
  }
}2.0.0 / 2021-12-17
==================

  * Drop support for Node.js 0.6
  * Remove `I'mateapot` export; use `ImATeapot` instead
  * Remove support for status being non-first argument
  * Rename `UnorderedCollection` constructor to `TooEarly`
  * deps: depd@2.0.0
    - Replace internal `eval` usage with `Function` constructor
    - Use instance methods on `process` to check for listeners
  * deps: statuses@2.0.1
    - Fix messaging casing of `418 I'm a Teapot`
    - Remove code 306
    - Rename `425 Unordered Collection` to standard `425 Too Early`

2021-11-14 / 1.8.1
==================

  * deps: toidentifier@1.0.1

2020-06-29 / 1.8.0
==================

  * Add `isHttpError` export to determine if value is an HTTP error
  * deps: setprototypeof@1.2.0

2019-06-24 / 1.7.3
==================

  * deps: inherits@2.0.4

2019-02-18 / 1.7.2
==================

  * deps: setprototypeof@1.1.1

2018-09-08 / 1.7.1
==================

  * Fix error creating objects in some environments

2018-07-30 / 1.7.0
==================

  * Set constructor name when possible
  * Use `toidentifier` module to make class names
  * deps: statuses@'>= 1.5.0 < 2'

2018-03-29 / 1.6.3
==================

  * deps: depd@~1.1.2
    - perf: remove argument reassignment
  * deps: setprototypeof@1.1.0
  * deps: statuses@'>= 1.4.0 < 2'

2017-08-04 / 1.6.2
==================

  * deps: depd@1.1.1
    - Remove unnecessary `Buffer` loading

2017-02-20 / 1.6.1
==================

  * deps: setprototypeof@1.0.3
    - Fix shim for old browsers

2017-02-14 / 1.6.0
==================

  * Accept custom 4xx and 5xx status codes in factory
  * Add deprecation message to `"I'mateapot"` export
  * Deprecate passing status code as anything except first argument in factory
  * Deprecate using non-error status codes
  * Make `message` property enumerable for `HttpError`s

2016-11-16 / 1.5.1
==================

  * deps: inherits@2.0.3
    - Fix issue loading in browser
  * deps: setprototypeof@1.0.2
  * deps: statuses@'>= 1.3.1 < 2'

2016-05-18 / 1.5.0
==================

  * Support new code `421 Misdirected Request`
  * Use `setprototypeof` module to replace `__proto__` setting
  * deps: statuses@'>= 1.3.0 < 2'
    - Add `421 Misdirected Request`
    - perf: enable strict mode
  * perf: enable strict mode

2016-01-28 / 1.4.0
==================

  * Add `HttpError` export, for `err instanceof createError.HttpError`
  * deps: inherits@2.0.1
  * deps: statuses@'>= 1.2.1 < 2'
    - Fix message for status 451
    - Remove incorrect nginx status code

2015-02-02 / 1.3.1
==================

  * Fix regression where status can be overwritten in `createError` `props`

2015-02-01 / 1.3.0
==================

  * Construct errors using defined constructors from `createError`
  * Fix error names that are not identifiers
    - `createError["I'mateapot"]` is now `createError.ImATeapot`
  * Set a meaningful `name` property on constructed errors

2014-12-09 / 1.2.8
==================

  * Fix stack trace from exported function
  * Remove `arguments.callee` usage

2014-10-14 / 1.2.7
==================

  * Remove duplicate line

2014-10-02 / 1.2.6
==================

  * Fix `expose` to be `true` for `ClientError` constructor

2014-09-28 / 1.2.5
==================

  * deps: statuses@1

2014-09-21 / 1.2.4
==================

  * Fix dependency version to work with old `npm`s

2014-09-21 / 1.2.3
==================

  * deps: statuses@~1.1.0

2014-09-21 / 1.2.2
==================

  * Fix publish error

2014-09-21 / 1.2.1
==================

  * Support Node.js 0.6
  * Use `inherits` instead of `util`

2014-09-09 / 1.2.0
==================

  * Fix the way inheriting functions
  * Support `expose` being provided in properties argument

2014-09-08 / 1.1.0
==================

  * Default status to 500
  * Support provided `error` to extend

2014-09-08 / 1.0.1
==================

  * Fix accepting string message

2014-09-08 / 1.0.0
==================

  * Initial release

The MIT License (MIT)

Copyright (c) 2014 Jonathan Ong me@jongleberry.com
Copyright (c) 2016 Douglas Christopher Wilson doug@somethingdoug.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.
/*!
 * http-errors
 * Copyright(c) 2014 Jonathan Ong
 * Copyright(c) 2016 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module dependencies.
 * @private
 */

var deprecate = require('depd')('http-errors')
var setPrototypeOf = require('setprototypeof')
var statuses = require('statuses')
var inherits = require('inherits')
var toIdentifier = require('toidentifier')

/**
 * Module exports.
 * @public
 */

module.exports = createError
module.exports.HttpError = createHttpErrorConstructor()
module.exports.isHttpError = createIsHttpErrorFunction(module.exports.HttpError)

// Populate exports for all constructors
populateConstructorExports(module.exports, statuses.codes, module.exports.HttpError)

/**
 * Get the code class of a status code.
 * @private
 */

function codeClass (status) {
  return Number(String(status).charAt(0) + '00')
}

/**
 * Create a new HTTP Error.
 *
 * @returns {Error}
 * @public
 */

function createError () {
  // so much arity going on ~_~
  var err
  var msg
  var status = 500
  var props = {}
  for (var i = 0; i < arguments.length; i++) {
    var arg = arguments[i]
    var type = typeof arg
    if (type === 'object' && arg instanceof Error) {
      err = arg
      status = err.status || err.statusCode || status
    } else if (type === 'number' && i === 0) {
      status = arg
    } else if (type === 'string') {
      msg = arg
    } else if (type === 'object') {
      props = arg
    } else {
      throw new TypeError('argument #' + (i + 1) + ' unsupported type ' + type)
    }
  }

  if (typeof status === 'number' && (status < 400 || status >= 600)) {
    deprecate('non-error status code; use only 4xx or 5xx status codes')
  }

  if (typeof status !== 'number' ||
    (!statuses.message[status] && (status < 400 || status >= 600))) {
    status = 500
  }

  // constructor
  var HttpError = createError[status] || createError[codeClass(status)]

  if (!err) {
    // create error
    err = HttpError
      ? new HttpError(msg)
      : new Error(msg || statuses.message[status])
    Error.captureStackTrace(err, createError)
  }

  if (!HttpError || !(err instanceof HttpError) || err.status !== status) {
    // add properties to generic error
    err.expose = status < 500
    err.status = err.statusCode = status
  }

  for (var key in props) {
    if (key !== 'status' && key !== 'statusCode') {
      err[key] = props[key]
    }
  }

  return err
}

/**
 * Create HTTP error abstract base class.
 * @private
 */

function createHttpErrorConstructor () {
  function HttpError () {
    throw new TypeError('cannot construct abstract class')
  }

  inherits(HttpError, Error)

  return HttpError
}

/**
 * Create a constructor for a client error.
 * @private
 */

function createClientErrorConstructor (HttpError, name, code) {
  var className = toClassName(name)

  function ClientError (message) {
    // create the error object
    var msg = message != null ? message : statuses.message[code]
    var err = new Error(msg)

    // capture a stack trace to the construction point
    Error.captureStackTrace(err, ClientError)

    // adjust the [[Prototype]]
    setPrototypeOf(err, ClientError.prototype)

    // redefine the error message
    Object.defineProperty(err, 'message', {
      enumerable: true,
      configurable: true,
      value: msg,
      writable: true
    })

    // redefine the error name
    Object.defineProperty(err, 'name', {
      enumerable: false,
      configurable: true,
      value: className,
      writable: true
    })

    return err
  }

  inherits(ClientError, HttpError)
  nameFunc(ClientError, className)

  ClientError.prototype.status = code
  ClientError.prototype.statusCode = code
  ClientError.prototype.expose = true

  return ClientError
}

/**
 * Create function to test is a value is a HttpError.
 * @private
 */

function createIsHttpErrorFunction (HttpError) {
  return function isHttpError (val) {
    if (!val || typeof val !== 'object') {
      return false
    }

    if (val instanceof HttpError) {
      return true
    }

    return val instanceof Error &&
      typeof val.expose === 'boolean' &&
      typeof val.statusCode === 'number' && val.status === val.statusCode
  }
}

/**
 * Create a constructor for a server error.
 * @private
 */

function createServerErrorConstructor (HttpError, name, code) {
  var className = toClassName(name)

  function ServerError (message) {
    // create the error object
    var msg = message != null ? message : statuses.message[code]
    var err = new Error(msg)

    // capture a stack trace to the construction point
    Error.captureStackTrace(err, ServerError)

    // adjust the [[Prototype]]
    setPrototypeOf(err, ServerError.prototype)

    // redefine the error message
    Object.defineProperty(err, 'message', {
      enumerable: true,
      configurable: true,
      value: msg,
      writable: true
    })

    // redefine the error name
    Object.defineProperty(err, 'name', {
      enumerable: false,
      configurable: true,
      value: className,
      writable: true
    })

    return err
  }

  inherits(ServerError, HttpError)
  nameFunc(ServerError, className)

  ServerError.prototype.status = code
  ServerError.prototype.statusCode = code
  ServerError.prototype.expose = false

  return ServerError
}

/**
 * Set the name of a function, if possible.
 * @private
 */

function nameFunc (func, name) {
  var desc = Object.getOwnPropertyDescriptor(func, 'name')

  if (desc && desc.configurable) {
    desc.value = name
    Object.defineProperty(func, 'name', desc)
  }
}

/**
 * Populate the exports object with constructors for every error class.
 * @private
 */

function populateConstructorExports (exports, codes, HttpError) {
  codes.forEach(function forEachCode (code) {
    var CodeError
    var name = toIdentifier(statuses.message[code])

    switch (codeClass(code)) {
      case 400:
        CodeError = createClientErrorConstructor(HttpError, name, code)
        break
      case 500:
        CodeError = createServerErrorConstructor(HttpError, name, code)
        break
    }

    if (CodeError) {
      // export the constructor
      exports[code] = CodeError
      exports[name] = CodeError
    }
  })
}

/**
 * Get a class name from a name identifier.
 * @private
 */

function toClassName (name) {
  return name.substr(-5) !== 'Error'
    ? name + 'Error'
    : name
}
{
  "name": "http-errors",
  "description": "Create HTTP error objects",
  "version": "2.0.0",
  "author": "Jonathan Ong <me@jongleberry.com> (http://jongleberry.com)",
  "license": "MIT",
  "repository": "jshttp/http-errors",
  "dependencies": {
    "depd": "2.0.0",
    "inherits": "2.0.4",
    "setprototypeof": "1.2.0",
    "statuses": "2.0.1",
    "toidentifier": "1.0.1"
  },
  "devDependencies": {
    "eslint": "7.32.0",
    "eslint-config-standard": "14.1.1",
    "eslint-plugin-import": "2.25.3",
    "eslint-plugin-markdown": "2.2.1",
    "eslint-plugin-node": "11.1.0",
    "eslint-plugin-promise": "5.2.0",
    "eslint-plugin-standard": "4.1.0",
    "mocha": "9.1.3",
    "nyc": "15.1.0"
  },
  "engines": {
    "node": ">= 0.8"
  },
  "files": [
    "index.js",
    "HISTORY.md",
    "LICENSE",
    "README.md"
  ]
}{
  "name": "http-proxy-agent",
  "version": "4.0.1",
  "description": "An HTTP(s) proxy `http.Agent` implementation for HTTP",
  "main": "./dist/index.js",
  "types": "./dist/index.d.ts",
  "files": [
    "dist"
  ],
  "repository": {
    "type": "git",
    "url": "git://github.com/TooTallNate/node-http-proxy-agent.git"
  },
  "author": "Nathan Rajlich <nathan@tootallnate.net> (http://n8.io/)",
  "license": "MIT",
  "dependencies": {
    "@tootallnate/once": "1",
    "agent-base": "6",
    "debug": "4"
  },
  "devDependencies": {
    "@types/debug": "4",
    "@types/node": "^12.12.11",
    "@typescript-eslint/eslint-plugin": "1.6.0",
    "@typescript-eslint/parser": "1.1.0",
    "eslint": "5.16.0",
    "eslint-config-airbnb": "17.1.0",
    "eslint-config-prettier": "4.1.0",
    "eslint-import-resolver-typescript": "1.1.1",
    "eslint-plugin-import": "2.16.0",
    "eslint-plugin-jsx-a11y": "6.2.1",
    "eslint-plugin-react": "7.12.4",
    "mocha": "^6.2.2",
    "proxy": "1",
    "rimraf": "^3.0.0",
    "typescript": "^3.5.3"
  },
  "engines": {
    "node": ">= 6"
  }
}"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const net_1 = __importDefault(require("net"));
const tls_1 = __importDefault(require("tls"));
const url_1 = __importDefault(require("url"));
const debug_1 = __importDefault(require("debug"));
const once_1 = __importDefault(require("@tootallnate/once"));
const agent_base_1 = require("agent-base");
const debug = debug_1.default('http-proxy-agent');
function isHTTPS(protocol) {
    return typeof protocol === 'string' ? /^https:?$/i.test(protocol) : false;
}
/**
 * The `HttpProxyAgent` implements an HTTP Agent subclass that connects
 * to the specified "HTTP proxy server" in order to proxy HTTP requests.
 *
 * @api public
 */
class HttpProxyAgent extends agent_base_1.Agent {
    constructor(_opts) {
        let opts;
        if (typeof _opts === 'string') {
            opts = url_1.default.parse(_opts);
        }
        else {
            opts = _opts;
        }
        if (!opts) {
            throw new Error('an HTTP(S) proxy server `host` and `port` must be specified!');
        }
        debug('Creating new HttpProxyAgent instance: %o', opts);
        super(opts);
        const proxy = Object.assign({}, opts);
        // If `true`, then connect to the proxy server over TLS.
        // Defaults to `false`.
        this.secureProxy = opts.secureProxy || isHTTPS(proxy.protocol);
        // Prefer `hostname` over `host`, and set the `port` if needed.
        proxy.host = proxy.hostname || proxy.host;
        if (typeof proxy.port === 'string') {
            proxy.port = parseInt(proxy.port, 10);
        }
        if (!proxy.port && proxy.host) {
            proxy.port = this.secureProxy ? 443 : 80;
        }
        if (proxy.host && proxy.path) {
            // If both a `host` and `path` are specified then it's most likely
            // the result of a `url.parse()` call... we need to remove the
            // `path` portion so that `net.connect()` doesn't attempt to open
            // that as a Unix socket file.
            delete proxy.path;
            delete proxy.pathname;
        }
        this.proxy = proxy;
    }
    /**
     * Called when the node-core HTTP client library is creating a
     * new HTTP request.
     *
     * @api protected
     */
    callback(req, opts) {
        return __awaiter(this, void 0, void 0, function* () {
            const { proxy, secureProxy } = this;
            const parsed = url_1.default.parse(req.path);
            if (!parsed.protocol) {
                parsed.protocol = 'http:';
            }
            if (!parsed.hostname) {
                parsed.hostname = opts.hostname || opts.host || null;
            }
            if (parsed.port == null && typeof opts.port) {
                parsed.port = String(opts.port);
            }
            if (parsed.port === '80') {
                // if port is 80, then we can remove the port so that the
                // ":80" portion is not on the produced URL
                delete parsed.port;
            }
            // Change the `http.ClientRequest` instance's "path" field
            // to the absolute path of the URL that will be requested.
            req.path = url_1.default.format(parsed);
            // Inject the `Proxy-Authorization` header if necessary.
            if (proxy.auth) {
                req.setHeader('Proxy-Authorization', `Basic ${Buffer.from(proxy.auth).toString('base64')}`);
            }
            // Create a socket connection to the proxy server.
            let socket;
            if (secureProxy) {
                debug('Creating `tls.Socket`: %o', proxy);
                socket = tls_1.default.connect(proxy);
            }
            else {
                debug('Creating `net.Socket`: %o', proxy);
                socket = net_1.default.connect(proxy);
            }
            // At this point, the http ClientRequest's internal `_header` field
            // might have already been set. If this is the case then we'll need
            // to re-generate the string since we just changed the `req.path`.
            if (req._header) {
                let first;
                let endOfHeaders;
                debug('Regenerating stored HTTP header string for request');
                req._header = null;
                req._implicitHeader();
                if (req.output && req.output.length > 0) {
                    // Node < 12
                    debug('Patching connection write() output buffer with updated header');
                    first = req.output[0];
                    endOfHeaders = first.indexOf('\r\n\r\n') + 4;
                    req.output[0] = req._header + first.substring(endOfHeaders);
                    debug('Output buffer: %o', req.output);
                }
                else if (req.outputData && req.outputData.length > 0) {
                    // Node >= 12
                    debug('Patching connection write() output buffer with updated header');
                    first = req.outputData[0].data;
                    endOfHeaders = first.indexOf('\r\n\r\n') + 4;
                    req.outputData[0].data =
                        req._header + first.substring(endOfHeaders);
                    debug('Output buffer: %o', req.outputData[0].data);
                }
            }
            // Wait for the socket's `connect` event, so that this `callback()`
            // function throws instead of the `http` request machinery. This is
            // important for i.e. `PacProxyAgent` which determines a failed proxy
            // connection via the `callback()` function throwing.
            yield once_1.default(socket, 'connect');
            return socket;
        });
    }
}
exports.default = HttpProxyAgent;
//# sourceMappingURL=agent.js.map"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
const agent_1 = __importDefault(require("./agent"));
function createHttpProxyAgent(opts) {
    return new agent_1.default(opts);
}
(function (createHttpProxyAgent) {
    createHttpProxyAgent.HttpProxyAgent = agent_1.default;
    createHttpProxyAgent.prototype = agent_1.default.prototype;
})(createHttpProxyAgent || (createHttpProxyAgent = {}));
module.exports = createHttpProxyAgent;
//# sourceMappingURL=index.js.map{
  "name": "https-proxy-agent",
  "version": "5.0.1",
  "description": "An HTTP(s) proxy `http.Agent` implementation for HTTPS",
  "main": "dist/index",
  "types": "dist/index",
  "files": [
    "dist"
  ],
  "repository": {
    "type": "git",
    "url": "git://github.com/TooTallNate/node-https-proxy-agent.git"
  },
  "author": "Nathan Rajlich <nathan@tootallnate.net> (http://n8.io/)",
  "license": "MIT",
  "dependencies": {
    "agent-base": "6",
    "debug": "4"
  },
  "devDependencies": {
    "@types/debug": "4",
    "@types/node": "^12.12.11",
    "@typescript-eslint/eslint-plugin": "1.6.0",
    "@typescript-eslint/parser": "1.1.0",
    "eslint": "5.16.0",
    "eslint-config-airbnb": "17.1.0",
    "eslint-config-prettier": "4.1.0",
    "eslint-import-resolver-typescript": "1.1.1",
    "eslint-plugin-import": "2.16.0",
    "eslint-plugin-jsx-a11y": "6.2.1",
    "eslint-plugin-react": "7.12.4",
    "mocha": "^6.2.2",
    "proxy": "1",
    "rimraf": "^3.0.0",
    "typescript": "^3.5.3"
  },
  "engines": {
    "node": ">= 6"
  }
}"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const net_1 = __importDefault(require("net"));
const tls_1 = __importDefault(require("tls"));
const url_1 = __importDefault(require("url"));
const assert_1 = __importDefault(require("assert"));
const debug_1 = __importDefault(require("debug"));
const agent_base_1 = require("agent-base");
const parse_proxy_response_1 = __importDefault(require("./parse-proxy-response"));
const debug = debug_1.default('https-proxy-agent:agent');
/**
 * The `HttpsProxyAgent` implements an HTTP Agent subclass that connects to
 * the specified "HTTP(s) proxy server" in order to proxy HTTPS requests.
 *
 * Outgoing HTTP requests are first tunneled through the proxy server using the
 * `CONNECT` HTTP request method to establish a connection to the proxy server,
 * and then the proxy server connects to the destination target and issues the
 * HTTP request from the proxy server.
 *
 * `https:` requests have their socket connection upgraded to TLS once
 * the connection to the proxy server has been established.
 *
 * @api public
 */
class HttpsProxyAgent extends agent_base_1.Agent {
    constructor(_opts) {
        let opts;
        if (typeof _opts === 'string') {
            opts = url_1.default.parse(_opts);
        }
        else {
            opts = _opts;
        }
        if (!opts) {
            throw new Error('an HTTP(S) proxy server `host` and `port` must be specified!');
        }
        debug('creating new HttpsProxyAgent instance: %o', opts);
        super(opts);
        const proxy = Object.assign({}, opts);
        // If `true`, then connect to the proxy server over TLS.
        // Defaults to `false`.
        this.secureProxy = opts.secureProxy || isHTTPS(proxy.protocol);
        // Prefer `hostname` over `host`, and set the `port` if needed.
        proxy.host = proxy.hostname || proxy.host;
        if (typeof proxy.port === 'string') {
            proxy.port = parseInt(proxy.port, 10);
        }
        if (!proxy.port && proxy.host) {
            proxy.port = this.secureProxy ? 443 : 80;
        }
        // ALPN is supported by Node.js >= v5.
        // attempt to negotiate http/1.1 for proxy servers that support http/2
        if (this.secureProxy && !('ALPNProtocols' in proxy)) {
            proxy.ALPNProtocols = ['http 1.1'];
        }
        if (proxy.host && proxy.path) {
            // If both a `host` and `path` are specified then it's most likely
            // the result of a `url.parse()` call... we need to remove the
            // `path` portion so that `net.connect()` doesn't attempt to open
            // that as a Unix socket file.
            delete proxy.path;
            delete proxy.pathname;
        }
        this.proxy = proxy;
    }
    /**
     * Called when the node-core HTTP client library is creating a
     * new HTTP request.
     *
     * @api protected
     */
    callback(req, opts) {
        return __awaiter(this, void 0, void 0, function* () {
            const { proxy, secureProxy } = this;
            // Create a socket connection to the proxy server.
            let socket;
            if (secureProxy) {
                debug('Creating `tls.Socket`: %o', proxy);
                socket = tls_1.default.connect(proxy);
            }
            else {
                debug('Creating `net.Socket`: %o', proxy);
                socket = net_1.default.connect(proxy);
            }
            const headers = Object.assign({}, proxy.headers);
            const hostname = `${opts.host}:${opts.port}`;
            let payload = `CONNECT ${hostname} HTTP/1.1\r\n`;
            // Inject the `Proxy-Authorization` header if necessary.
            if (proxy.auth) {
                headers['Proxy-Authorization'] = `Basic ${Buffer.from(proxy.auth).toString('base64')}`;
            }
            // The `Host` header should only include the port
            // number when it is not the default port.
            let { host, port, secureEndpoint } = opts;
            if (!isDefaultPort(port, secureEndpoint)) {
                host += `:${port}`;
            }
            headers.Host = host;
            headers.Connection = 'close';
            for (const name of Object.keys(headers)) {
                payload += `${name}: ${headers[name]}\r\n`;
            }
            const proxyResponsePromise = parse_proxy_response_1.default(socket);
            socket.write(`${payload}\r\n`);
            const { statusCode, buffered } = yield proxyResponsePromise;
            if (statusCode === 200) {
                req.once('socket', resume);
                if (opts.secureEndpoint) {
                    // The proxy is connecting to a TLS server, so upgrade
                    // this socket connection to a TLS connection.
                    debug('Upgrading socket connection to TLS');
                    const servername = opts.servername || opts.host;
                    return tls_1.default.connect(Object.assign(Object.assign({}, omit(opts, 'host', 'hostname', 'path', 'port')), { socket,
                        servername }));
                }
                return socket;
            }
            // Some other status code that's not 200... need to re-play the HTTP
            // header "data" events onto the socket once the HTTP machinery is
            // attached so that the node core `http` can parse and handle the
            // error status code.
            // Close the original socket, and a new "fake" socket is returned
            // instead, so that the proxy doesn't get the HTTP request
            // written to it (which may contain `Authorization` headers or other
            // sensitive data).
            //
            // See: https://hackerone.com/reports/541502
            socket.destroy();
            const fakeSocket = new net_1.default.Socket({ writable: false });
            fakeSocket.readable = true;
            // Need to wait for the "socket" event to re-play the "data" events.
            req.once('socket', (s) => {
                debug('replaying proxy buffer for failed request');
                assert_1.default(s.listenerCount('data') > 0);
                // Replay the "buffered" Buffer onto the fake `socket`, since at
                // this point the HTTP module machinery has been hooked up for
                // the user.
                s.push(buffered);
                s.push(null);
            });
            return fakeSocket;
        });
    }
}
exports.default = HttpsProxyAgent;
function resume(socket) {
    socket.resume();
}
function isDefaultPort(port, secure) {
    return Boolean((!secure && port === 80) || (secure && port === 443));
}
function isHTTPS(protocol) {
    return typeof protocol === 'string' ? /^https:?$/i.test(protocol) : false;
}
function omit(obj, ...keys) {
    const ret = {};
    let key;
    for (key in obj) {
        if (!keys.includes(key)) {
            ret[key] = obj[key];
        }
    }
    return ret;
}
//# sourceMappingURL=agent.js.map"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
const agent_1 = __importDefault(require("./agent"));
function createHttpsProxyAgent(opts) {
    return new agent_1.default(opts);
}
(function (createHttpsProxyAgent) {
    createHttpsProxyAgent.HttpsProxyAgent = agent_1.default;
    createHttpsProxyAgent.prototype = agent_1.default.prototype;
})(createHttpsProxyAgent || (createHttpsProxyAgent = {}));
module.exports = createHttpsProxyAgent;
//# sourceMappingURL=index.js.map"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const debug_1 = __importDefault(require("debug"));
const debug = debug_1.default('https-proxy-agent:parse-proxy-response');
function parseProxyResponse(socket) {
    return new Promise((resolve, reject) => {
        // we need to buffer any HTTP traffic that happens with the proxy before we get
        // the CONNECT response, so that if the response is anything other than an "200"
        // response code, then we can re-play the "data" events on the socket once the
        // HTTP parser is hooked up...
        let buffersLength = 0;
        const buffers = [];
        function read() {
            const b = socket.read();
            if (b)
                ondata(b);
            else
                socket.once('readable', read);
        }
        function cleanup() {
            socket.removeListener('end', onend);
            socket.removeListener('error', onerror);
            socket.removeListener('close', onclose);
            socket.removeListener('readable', read);
        }
        function onclose(err) {
            debug('onclose had error %o', err);
        }
        function onend() {
            debug('onend');
        }
        function onerror(err) {
            cleanup();
            debug('onerror %o', err);
            reject(err);
        }
        function ondata(b) {
            buffers.push(b);
            buffersLength += b.length;
            const buffered = Buffer.concat(buffers, buffersLength);
            const endOfHeaders = buffered.indexOf('\r\n\r\n');
            if (endOfHeaders === -1) {
                // keep buffering
                debug('have not received end of HTTP headers yet...');
                read();
                return;
            }
            const firstLine = buffered.toString('ascii', 0, buffered.indexOf('\r\n'));
            const statusCode = +firstLine.split(' ')[1];
            debug('got proxy server response: %o', firstLine);
            resolve({
                statusCode,
                buffered
            });
        }
        socket.on('error', onerror);
        socket.on('close', onclose);
        socket.on('end', onend);
        read();
    });
}
exports.default = parseProxyResponse;
//# sourceMappingURL=parse-proxy-response.js.map
1.2.1 / 2017-05-19
==================

  * fix: package.json to reduce vulnerabilities (#3)

1.2.0 / 2016-05-21
==================

  * feat: warn with stack

1.1.0 / 2016-04-04
==================

  * deps: upgrade ms to 0.7.0

1.0.1 / 2014-12-31
==================

  * feat(index.js): warn when result is undefined

1.0.0 / 2014-08-14
==================

  * init
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.
/*!
 * humanize-ms - index.js
 * Copyright(c) 2014 dead_horse <dead_horse@qq.com>
 * MIT Licensed
 */

'use strict';

/**
 * Module dependencies.
 */

var util = require('util');
var ms = require('ms');

module.exports = function (t) {
  if (typeof t === 'number') return t;
  var r = ms(t);
  if (r === undefined) {
    var err = new Error(util.format('humanize-ms(%j) result undefined', t));
    console.warn(err.stack);
  }
  return r;
};
{
  "name": "humanize-ms",
  "version": "1.2.1",
  "description": "transform humanize time to ms",
  "main": "index.js",
  "files": [
    "index.js"
  ],
  "author": {
    "name": "dead-horse",
    "email": "dead_horse@qq.com",
    "url": "http://deadhorse.me"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/node-modules/humanize-ms"
  },
  "license": "MIT",
  "dependencies": {
    "ms": "^2.0.0"
  },
  "devDependencies": {
    "autod": "*",
    "beautify-benchmark": "~0.2.4",
    "benchmark": "~1.0.0",
    "istanbul": "*",
    "mocha": "*",
    "should": "*"
  }
}Copyright (c) 2011 Alexander Shtuchkin

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": "iconv-lite",
  "description": "Convert character encodings in pure javascript.",
  "version": "0.6.3",
  "license": "MIT",
  "author": "Alexander Shtuchkin <ashtuchkin@gmail.com>",
  "main": "./lib/index.js",
  "typings": "./lib/index.d.ts",
  "homepage": "https://github.com/ashtuchkin/iconv-lite",
  "repository": {
    "type": "git",
    "url": "git://github.com/ashtuchkin/iconv-lite.git"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "browser": {
    "stream": false
  },
  "devDependencies": {
    "async": "^3.2.0",
    "c8": "^7.2.0",
    "errto": "^0.2.1",
    "iconv": "^2.3.5",
    "mocha": "^3.5.3",
    "request": "^2.88.2",
    "semver": "^6.3.0",
    "unorm": "^1.6.0"
  },
  "dependencies": {
    "safer-buffer": ">= 2.1.2 < 3.0.0"
  }
}"use strict";

var BOMChar = '\uFEFF';

exports.PrependBOM = PrependBOMWrapper
function PrependBOMWrapper(encoder, options) {
    this.encoder = encoder;
    this.addBOM = true;
}

PrependBOMWrapper.prototype.write = function(str) {
    if (this.addBOM) {
        str = BOMChar + str;
        this.addBOM = false;
    }

    return this.encoder.write(str);
}

PrependBOMWrapper.prototype.end = function() {
    return this.encoder.end();
}


//------------------------------------------------------------------------------

exports.StripBOM = StripBOMWrapper;
function StripBOMWrapper(decoder, options) {
    this.decoder = decoder;
    this.pass = false;
    this.options = options || {};
}

StripBOMWrapper.prototype.write = function(buf) {
    var res = this.decoder.write(buf);
    if (this.pass || !res)
        return res;

    if (res[0] === BOMChar) {
        res = res.slice(1);
        if (typeof this.options.stripBOM === 'function')
            this.options.stripBOM();
    }

    this.pass = true;
    return res;
}

StripBOMWrapper.prototype.end = function() {
    return this.decoder.end();
}

"use strict";

var Buffer = require("safer-buffer").Buffer;

var bomHandling = require("./bom-handling"),
    iconv = module.exports;

// All codecs and aliases are kept here, keyed by encoding name/alias.
// They are lazy loaded in `iconv.getCodec` from `encodings/index.js`.
iconv.encodings = null;

// Characters emitted in case of error.
iconv.defaultCharUnicode = '�';
iconv.defaultCharSingleByte = '?';

// Public API.
iconv.encode = function encode(str, encoding, options) {
    str = "" + (str || ""); // Ensure string.

    var encoder = iconv.getEncoder(encoding, options);

    var res = encoder.write(str);
    var trail = encoder.end();
    
    return (trail && trail.length > 0) ? Buffer.concat([res, trail]) : res;
}

iconv.decode = function decode(buf, encoding, options) {
    if (typeof buf === 'string') {
        if (!iconv.skipDecodeWarning) {
            console.error('Iconv-lite warning: decode()-ing strings is deprecated. Refer to https://github.com/ashtuchkin/iconv-lite/wiki/Use-Buffers-when-decoding');
            iconv.skipDecodeWarning = true;
        }

        buf = Buffer.from("" + (buf || ""), "binary"); // Ensure buffer.
    }

    var decoder = iconv.getDecoder(encoding, options);

    var res = decoder.write(buf);
    var trail = decoder.end();

    return trail ? (res + trail) : res;
}

iconv.encodingExists = function encodingExists(enc) {
    try {
        iconv.getCodec(enc);
        return true;
    } catch (e) {
        return false;
    }
}

// Legacy aliases to convert functions
iconv.toEncoding = iconv.encode;
iconv.fromEncoding = iconv.decode;

// Search for a codec in iconv.encodings. Cache codec data in iconv._codecDataCache.
iconv._codecDataCache = {};
iconv.getCodec = function getCodec(encoding) {
    if (!iconv.encodings)
        iconv.encodings = require("../encodings"); // Lazy load all encoding definitions.
    
    // Canonicalize encoding name: strip all non-alphanumeric chars and appended year.
    var enc = iconv._canonicalizeEncoding(encoding);

    // Traverse iconv.encodings to find actual codec.
    var codecOptions = {};
    while (true) {
        var codec = iconv._codecDataCache[enc];
        if (codec)
            return codec;

        var codecDef = iconv.encodings[enc];

        switch (typeof codecDef) {
            case "string": // Direct alias to other encoding.
                enc = codecDef;
                break;

            case "object": // Alias with options. Can be layered.
                for (var key in codecDef)
                    codecOptions[key] = codecDef[key];

                if (!codecOptions.encodingName)
                    codecOptions.encodingName = enc;
                
                enc = codecDef.type;
                break;

            case "function": // Codec itself.
                if (!codecOptions.encodingName)
                    codecOptions.encodingName = enc;

                // The codec function must load all tables and return object with .encoder and .decoder methods.
                // It'll be called only once (for each different options object).
                codec = new codecDef(codecOptions, iconv);

                iconv._codecDataCache[codecOptions.encodingName] = codec; // Save it to be reused later.
                return codec;

            default:
                throw new Error("Encoding not recognized: '" + encoding + "' (searched as: '"+enc+"')");
        }
    }
}

iconv._canonicalizeEncoding = function(encoding) {
    // Canonicalize encoding name: strip all non-alphanumeric chars and appended year.
    return (''+encoding).toLowerCase().replace(/:\d{4}$|[^0-9a-z]/g, "");
}

iconv.getEncoder = function getEncoder(encoding, options) {
    var codec = iconv.getCodec(encoding),
        encoder = new codec.encoder(options, codec);

    if (codec.bomAware && options && options.addBOM)
        encoder = new bomHandling.PrependBOM(encoder, options);

    return encoder;
}

iconv.getDecoder = function getDecoder(encoding, options) {
    var codec = iconv.getCodec(encoding),
        decoder = new codec.decoder(options, codec);

    if (codec.bomAware && !(options && options.stripBOM === false))
        decoder = new bomHandling.StripBOM(decoder, options);

    return decoder;
}

// Streaming API
// NOTE: Streaming API naturally depends on 'stream' module from Node.js. Unfortunately in browser environments this module can add
// up to 100Kb to the output bundle. To avoid unnecessary code bloat, we don't enable Streaming API in browser by default.
// If you would like to enable it explicitly, please add the following code to your app:
// > iconv.enableStreamingAPI(require('stream'));
iconv.enableStreamingAPI = function enableStreamingAPI(stream_module) {
    if (iconv.supportsStreams)
        return;

    // Dependency-inject stream module to create IconvLite stream classes.
    var streams = require("./streams")(stream_module);

    // Not public API yet, but expose the stream classes.
    iconv.IconvLiteEncoderStream = streams.IconvLiteEncoderStream;
    iconv.IconvLiteDecoderStream = streams.IconvLiteDecoderStream;

    // Streaming API.
    iconv.encodeStream = function encodeStream(encoding, options) {
        return new iconv.IconvLiteEncoderStream(iconv.getEncoder(encoding, options), options);
    }

    iconv.decodeStream = function decodeStream(encoding, options) {
        return new iconv.IconvLiteDecoderStream(iconv.getDecoder(encoding, options), options);
    }

    iconv.supportsStreams = true;
}

// Enable Streaming API automatically if 'stream' module is available and non-empty (the majority of environments).
var stream_module;
try {
    stream_module = require("stream");
} catch (e) {}

if (stream_module && stream_module.Transform) {
    iconv.enableStreamingAPI(stream_module);

} else {
    // In rare cases where 'stream' module is not available by default, throw a helpful exception.
    iconv.encodeStream = iconv.decodeStream = function() {
        throw new Error("iconv-lite Streaming API is not enabled. Use iconv.enableStreamingAPI(require('stream')); to enable it.");
    };
}

if ("Ā" != "\u0100") {
    console.error("iconv-lite warning: js files use non-utf8 encoding. See https://github.com/ashtuchkin/iconv-lite/wiki/Javascript-source-file-encodings for more info.");
}
"use strict";

var Buffer = require("safer-buffer").Buffer;

// NOTE: Due to 'stream' module being pretty large (~100Kb, significant in browser environments), 
// we opt to dependency-inject it instead of creating a hard dependency.
module.exports = function(stream_module) {
    var Transform = stream_module.Transform;

    // == Encoder stream =======================================================

    function IconvLiteEncoderStream(conv, options) {
        this.conv = conv;
        options = options || {};
        options.decodeStrings = false; // We accept only strings, so we don't need to decode them.
        Transform.call(this, options);
    }

    IconvLiteEncoderStream.prototype = Object.create(Transform.prototype, {
        constructor: { value: IconvLiteEncoderStream }
    });

    IconvLiteEncoderStream.prototype._transform = function(chunk, encoding, done) {
        if (typeof chunk != 'string')
            return done(new Error("Iconv encoding stream needs strings as its input."));
        try {
            var res = this.conv.write(chunk);
            if (res && res.length) this.push(res);
            done();
        }
        catch (e) {
            done(e);
        }
    }

    IconvLiteEncoderStream.prototype._flush = function(done) {
        try {
            var res = this.conv.end();
            if (res && res.length) this.push(res);
            done();
        }
        catch (e) {
            done(e);
        }
    }

    IconvLiteEncoderStream.prototype.collect = function(cb) {
        var chunks = [];
        this.on('error', cb);
        this.on('data', function(chunk) { chunks.push(chunk); });
        this.on('end', function() {
            cb(null, Buffer.concat(chunks));
        });
        return this;
    }


    // == Decoder stream =======================================================

    function IconvLiteDecoderStream(conv, options) {
        this.conv = conv;
        options = options || {};
        options.encoding = this.encoding = 'utf8'; // We output strings.
        Transform.call(this, options);
    }

    IconvLiteDecoderStream.prototype = Object.create(Transform.prototype, {
        constructor: { value: IconvLiteDecoderStream }
    });

    IconvLiteDecoderStream.prototype._transform = function(chunk, encoding, done) {
        if (!Buffer.isBuffer(chunk) && !(chunk instanceof Uint8Array))
            return done(new Error("Iconv decoding stream needs buffers as its input."));
        try {
            var res = this.conv.write(chunk);
            if (res && res.length) this.push(res, this.encoding);
            done();
        }
        catch (e) {
            done(e);
        }
    }

    IconvLiteDecoderStream.prototype._flush = function(done) {
        try {
            var res = this.conv.end();
            if (res && res.length) this.push(res, this.encoding);                
            done();
        }
        catch (e) {
            done(e);
        }
    }

    IconvLiteDecoderStream.prototype.collect = function(cb) {
        var res = '';
        this.on('error', cb);
        this.on('data', function(chunk) { res += chunk; });
        this.on('end', function() {
            cb(null, res);
        });
        return this;
    }

    return {
        IconvLiteEncoderStream: IconvLiteEncoderStream,
        IconvLiteDecoderStream: IconvLiteDecoderStream,
    };
};
"use strict";
var Buffer = require("safer-buffer").Buffer;

// Multibyte codec. In this scheme, a character is represented by 1 or more bytes.
// Our codec supports UTF-16 surrogates, extensions for GB18030 and unicode sequences.
// To save memory and loading time, we read table files only when requested.

exports._dbcs = DBCSCodec;

var UNASSIGNED = -1,
    GB18030_CODE = -2,
    SEQ_START  = -10,
    NODE_START = -1000,
    UNASSIGNED_NODE = new Array(0x100),
    DEF_CHAR = -1;

for (var i = 0; i < 0x100; i++)
    UNASSIGNED_NODE[i] = UNASSIGNED;


// Class DBCSCodec reads and initializes mapping tables.
function DBCSCodec(codecOptions, iconv) {
    this.encodingName = codecOptions.encodingName;
    if (!codecOptions)
        throw new Error("DBCS codec is called without the data.")
    if (!codecOptions.table)
        throw new Error("Encoding '" + this.encodingName + "' has no data.");

    // Load tables.
    var mappingTable = codecOptions.table();


    // Decode tables: MBCS -> Unicode.

    // decodeTables is a trie, encoded as an array of arrays of integers. Internal arrays are trie nodes and all have len = 256.
    // Trie root is decodeTables[0].
    // Values: >=  0 -> unicode character code. can be > 0xFFFF
    //         == UNASSIGNED -> unknown/unassigned sequence.
    //         == GB18030_CODE -> this is the end of a GB18030 4-byte sequence.
    //         <= NODE_START -> index of the next node in our trie to process next byte.
    //         <= SEQ_START  -> index of the start of a character code sequence, in decodeTableSeq.
    this.decodeTables = [];
    this.decodeTables[0] = UNASSIGNED_NODE.slice(0); // Create root node.

    // Sometimes a MBCS char corresponds to a sequence of unicode chars. We store them as arrays of integers here. 
    this.decodeTableSeq = [];

    // Actual mapping tables consist of chunks. Use them to fill up decode tables.
    for (var i = 0; i < mappingTable.length; i++)
        this._addDecodeChunk(mappingTable[i]);

    // Load & create GB18030 tables when needed.
    if (typeof codecOptions.gb18030 === 'function') {
        this.gb18030 = codecOptions.gb18030(); // Load GB18030 ranges.

        // Add GB18030 common decode nodes.
        var commonThirdByteNodeIdx = this.decodeTables.length;
        this.decodeTables.push(UNASSIGNED_NODE.slice(0));

        var commonFourthByteNodeIdx = this.decodeTables.length;
        this.decodeTables.push(UNASSIGNED_NODE.slice(0));

        // Fill out the tree
        var firstByteNode = this.decodeTables[0];
        for (var i = 0x81; i <= 0xFE; i++) {
            var secondByteNode = this.decodeTables[NODE_START - firstByteNode[i]];
            for (var j = 0x30; j <= 0x39; j++) {
                if (secondByteNode[j] === UNASSIGNED) {
                    secondByteNode[j] = NODE_START - commonThirdByteNodeIdx;
                } else if (secondByteNode[j] > NODE_START) {
                    throw new Error("gb18030 decode tables conflict at byte 2");
                }

                var thirdByteNode = this.decodeTables[NODE_START - secondByteNode[j]];
                for (var k = 0x81; k <= 0xFE; k++) {
                    if (thirdByteNode[k] === UNASSIGNED) {
                        thirdByteNode[k] = NODE_START - commonFourthByteNodeIdx;
                    } else if (thirdByteNode[k] === NODE_START - commonFourthByteNodeIdx) {
                        continue;
                    } else if (thirdByteNode[k] > NODE_START) {
                        throw new Error("gb18030 decode tables conflict at byte 3");
                    }

                    var fourthByteNode = this.decodeTables[NODE_START - thirdByteNode[k]];
                    for (var l = 0x30; l <= 0x39; l++) {
                        if (fourthByteNode[l] === UNASSIGNED)
                            fourthByteNode[l] = GB18030_CODE;
                    }
                }
            }
        }
    }

    this.defaultCharUnicode = iconv.defaultCharUnicode;

    
    // Encode tables: Unicode -> DBCS.

    // `encodeTable` is array mapping from unicode char to encoded char. All its values are integers for performance.
    // Because it can be sparse, it is represented as array of buckets by 256 chars each. Bucket can be null.
    // Values: >=  0 -> it is a normal char. Write the value (if <=256 then 1 byte, if <=65536 then 2 bytes, etc.).
    //         == UNASSIGNED -> no conversion found. Output a default char.
    //         <= SEQ_START  -> it's an index in encodeTableSeq, see below. The character starts a sequence.
    this.encodeTable = [];
    
    // `encodeTableSeq` is used when a sequence of unicode characters is encoded as a single code. We use a tree of
    // objects where keys correspond to characters in sequence and leafs are the encoded dbcs values. A special DEF_CHAR key
    // means end of sequence (needed when one sequence is a strict subsequence of another).
    // Objects are kept separately from encodeTable to increase performance.
    this.encodeTableSeq = [];

    // Some chars can be decoded, but need not be encoded.
    var skipEncodeChars = {};
    if (codecOptions.encodeSkipVals)
        for (var i = 0; i < codecOptions.encodeSkipVals.length; i++) {
            var val = codecOptions.encodeSkipVals[i];
            if (typeof val === 'number')
                skipEncodeChars[val] = true;
            else
                for (var j = val.from; j <= val.to; j++)
                    skipEncodeChars[j] = true;
        }
        
    // Use decode trie to recursively fill out encode tables.
    this._fillEncodeTable(0, 0, skipEncodeChars);

    // Add more encoding pairs when needed.
    if (codecOptions.encodeAdd) {
        for (var uChar in codecOptions.encodeAdd)
            if (Object.prototype.hasOwnProperty.call(codecOptions.encodeAdd, uChar))
                this._setEncodeChar(uChar.charCodeAt(0), codecOptions.encodeAdd[uChar]);
    }

    this.defCharSB  = this.encodeTable[0][iconv.defaultCharSingleByte.charCodeAt(0)];
    if (this.defCharSB === UNASSIGNED) this.defCharSB = this.encodeTable[0]['?'];
    if (this.defCharSB === UNASSIGNED) this.defCharSB = "?".charCodeAt(0);
}

DBCSCodec.prototype.encoder = DBCSEncoder;
DBCSCodec.prototype.decoder = DBCSDecoder;

// Decoder helpers
DBCSCodec.prototype._getDecodeTrieNode = function(addr) {
    var bytes = [];
    for (; addr > 0; addr >>>= 8)
        bytes.push(addr & 0xFF);
    if (bytes.length == 0)
        bytes.push(0);

    var node = this.decodeTables[0];
    for (var i = bytes.length-1; i > 0; i--) { // Traverse nodes deeper into the trie.
        var val = node[bytes[i]];

        if (val == UNASSIGNED) { // Create new node.
            node[bytes[i]] = NODE_START - this.decodeTables.length;
            this.decodeTables.push(node = UNASSIGNED_NODE.slice(0));
        }
        else if (val <= NODE_START) { // Existing node.
            node = this.decodeTables[NODE_START - val];
        }
        else
            throw new Error("Overwrite byte in " + this.encodingName + ", addr: " + addr.toString(16));
    }
    return node;
}


DBCSCodec.prototype._addDecodeChunk = function(chunk) {
    // First element of chunk is the hex mbcs code where we start.
    var curAddr = parseInt(chunk[0], 16);

    // Choose the decoding node where we'll write our chars.
    var writeTable = this._getDecodeTrieNode(curAddr);
    curAddr = curAddr & 0xFF;

    // Write all other elements of the chunk to the table.
    for (var k = 1; k < chunk.length; k++) {
        var part = chunk[k];
        if (typeof part === "string") { // String, write as-is.
            for (var l = 0; l < part.length;) {
                var code = part.charCodeAt(l++);
                if (0xD800 <= code && code < 0xDC00) { // Decode surrogate
                    var codeTrail = part.charCodeAt(l++);
                    if (0xDC00 <= codeTrail && codeTrail < 0xE000)
                        writeTable[curAddr++] = 0x10000 + (code - 0xD800) * 0x400 + (codeTrail - 0xDC00);
                    else
                        throw new Error("Incorrect surrogate pair in "  + this.encodingName + " at chunk " + chunk[0]);
                }
                else if (0x0FF0 < code && code <= 0x0FFF) { // Character sequence (our own encoding used)
                    var len = 0xFFF - code + 2;
                    var seq = [];
                    for (var m = 0; m < len; m++)
                        seq.push(part.charCodeAt(l++)); // Simple variation: don't support surrogates or subsequences in seq.

                    writeTable[curAddr++] = SEQ_START - this.decodeTableSeq.length;
                    this.decodeTableSeq.push(seq);
                }
                else
                    writeTable[curAddr++] = code; // Basic char
            }
        } 
        else if (typeof part === "number") { // Integer, meaning increasing sequence starting with prev character.
            var charCode = writeTable[curAddr - 1] + 1;
            for (var l = 0; l < part; l++)
                writeTable[curAddr++] = charCode++;
        }
        else
            throw new Error("Incorrect type '" + typeof part + "' given in "  + this.encodingName + " at chunk " + chunk[0]);
    }
    if (curAddr > 0xFF)
        throw new Error("Incorrect chunk in "  + this.encodingName + " at addr " + chunk[0] + ": too long" + curAddr);
}

// Encoder helpers
DBCSCodec.prototype._getEncodeBucket = function(uCode) {
    var high = uCode >> 8; // This could be > 0xFF because of astral characters.
    if (this.encodeTable[high] === undefined)
        this.encodeTable[high] = UNASSIGNED_NODE.slice(0); // Create bucket on demand.
    return this.encodeTable[high];
}

DBCSCodec.prototype._setEncodeChar = function(uCode, dbcsCode) {
    var bucket = this._getEncodeBucket(uCode);
    var low = uCode & 0xFF;
    if (bucket[low] <= SEQ_START)
        this.encodeTableSeq[SEQ_START-bucket[low]][DEF_CHAR] = dbcsCode; // There's already a sequence, set a single-char subsequence of it.
    else if (bucket[low] == UNASSIGNED)
        bucket[low] = dbcsCode;
}

DBCSCodec.prototype._setEncodeSequence = function(seq, dbcsCode) {
    
    // Get the root of character tree according to first character of the sequence.
    var uCode = seq[0];
    var bucket = this._getEncodeBucket(uCode);
    var low = uCode & 0xFF;

    var node;
    if (bucket[low] <= SEQ_START) {
        // There's already a sequence with  - use it.
        node = this.encodeTableSeq[SEQ_START-bucket[low]];
    }
    else {
        // There was no sequence object - allocate a new one.
        node = {};
        if (bucket[low] !== UNASSIGNED) node[DEF_CHAR] = bucket[low]; // If a char was set before - make it a single-char subsequence.
        bucket[low] = SEQ_START - this.encodeTableSeq.length;
        this.encodeTableSeq.push(node);
    }

    // Traverse the character tree, allocating new nodes as needed.
    for (var j = 1; j < seq.length-1; j++) {
        var oldVal = node[uCode];
        if (typeof oldVal === 'object')
            node = oldVal;
        else {
            node = node[uCode] = {}
            if (oldVal !== undefined)
                node[DEF_CHAR] = oldVal
        }
    }

    // Set the leaf to given dbcsCode.
    uCode = seq[seq.length-1];
    node[uCode] = dbcsCode;
}

DBCSCodec.prototype._fillEncodeTable = function(nodeIdx, prefix, skipEncodeChars) {
    var node = this.decodeTables[nodeIdx];
    var hasValues = false;
    var subNodeEmpty = {};
    for (var i = 0; i < 0x100; i++) {
        var uCode = node[i];
        var mbCode = prefix + i;
        if (skipEncodeChars[mbCode])
            continue;

        if (uCode >= 0) {
            this._setEncodeChar(uCode, mbCode);
            hasValues = true;
        } else if (uCode <= NODE_START) {
            var subNodeIdx = NODE_START - uCode;
            if (!subNodeEmpty[subNodeIdx]) {  // Skip empty subtrees (they are too large in gb18030).
                var newPrefix = (mbCode << 8) >>> 0;  // NOTE: '>>> 0' keeps 32-bit num positive.
                if (this._fillEncodeTable(subNodeIdx, newPrefix, skipEncodeChars))
                    hasValues = true;
                else
                    subNodeEmpty[subNodeIdx] = true;
            }
        } else if (uCode <= SEQ_START) {
            this._setEncodeSequence(this.decodeTableSeq[SEQ_START - uCode], mbCode);
            hasValues = true;
        }
    }
    return hasValues;
}



// == Encoder ==================================================================

function DBCSEncoder(options, codec) {
    // Encoder state
    this.leadSurrogate = -1;
    this.seqObj = undefined;
    
    // Static data
    this.encodeTable = codec.encodeTable;
    this.encodeTableSeq = codec.encodeTableSeq;
    this.defaultCharSingleByte = codec.defCharSB;
    this.gb18030 = codec.gb18030;
}

DBCSEncoder.prototype.write = function(str) {
    var newBuf = Buffer.alloc(str.length * (this.gb18030 ? 4 : 3)),
        leadSurrogate = this.leadSurrogate,
        seqObj = this.seqObj, nextChar = -1,
        i = 0, j = 0;

    while (true) {
        // 0. Get next character.
        if (nextChar === -1) {
            if (i == str.length) break;
            var uCode = str.charCodeAt(i++);
        }
        else {
            var uCode = nextChar;
            nextChar = -1;    
        }

        // 1. Handle surrogates.
        if (0xD800 <= uCode && uCode < 0xE000) { // Char is one of surrogates.
            if (uCode < 0xDC00) { // We've got lead surrogate.
                if (leadSurrogate === -1) {
                    leadSurrogate = uCode;
                    continue;
                } else {
                    leadSurrogate = uCode;
                    // Double lead surrogate found.
                    uCode = UNASSIGNED;
                }
            } else { // We've got trail surrogate.
                if (leadSurrogate !== -1) {
                    uCode = 0x10000 + (leadSurrogate - 0xD800) * 0x400 + (uCode - 0xDC00);
                    leadSurrogate = -1;
                } else {
                    // Incomplete surrogate pair - only trail surrogate found.
                    uCode = UNASSIGNED;
                }
                
            }
        }
        else if (leadSurrogate !== -1) {
            // Incomplete surrogate pair - only lead surrogate found.
            nextChar = uCode; uCode = UNASSIGNED; // Write an error, then current char.
            leadSurrogate = -1;
        }

        // 2. Convert uCode character.
        var dbcsCode = UNASSIGNED;
        if (seqObj !== undefined && uCode != UNASSIGNED) { // We are in the middle of the sequence
            var resCode = seqObj[uCode];
            if (typeof resCode === 'object') { // Sequence continues.
                seqObj = resCode;
                continue;

            } else if (typeof resCode == 'number') { // Sequence finished. Write it.
                dbcsCode = resCode;

            } else if (resCode == undefined) { // Current character is not part of the sequence.

                // Try default character for this sequence
                resCode = seqObj[DEF_CHAR];
                if (resCode !== undefined) {
                    dbcsCode = resCode; // Found. Write it.
                    nextChar = uCode; // Current character will be written too in the next iteration.

                } else {
                    // TODO: What if we have no default? (resCode == undefined)
                    // Then, we should write first char of the sequence as-is and try the rest recursively.
                    // Didn't do it for now because no encoding has this situation yet.
                    // Currently, just skip the sequence and write current char.
                }
            }
            seqObj = undefined;
        }
        else if (uCode >= 0) {  // Regular character
            var subtable = this.encodeTable[uCode >> 8];
            if (subtable !== undefined)
                dbcsCode = subtable[uCode & 0xFF];
            
            if (dbcsCode <= SEQ_START) { // Sequence start
                seqObj = this.encodeTableSeq[SEQ_START-dbcsCode];
                continue;
            }

            if (dbcsCode == UNASSIGNED && this.gb18030) {
                // Use GB18030 algorithm to find character(s) to write.
                var idx = findIdx(this.gb18030.uChars, uCode);
                if (idx != -1) {
                    var dbcsCode = this.gb18030.gbChars[idx] + (uCode - this.gb18030.uChars[idx]);
                    newBuf[j++] = 0x81 + Math.floor(dbcsCode / 12600); dbcsCode = dbcsCode % 12600;
                    newBuf[j++] = 0x30 + Math.floor(dbcsCode / 1260); dbcsCode = dbcsCode % 1260;
                    newBuf[j++] = 0x81 + Math.floor(dbcsCode / 10); dbcsCode = dbcsCode % 10;
                    newBuf[j++] = 0x30 + dbcsCode;
                    continue;
                }
            }
        }

        // 3. Write dbcsCode character.
        if (dbcsCode === UNASSIGNED)
            dbcsCode = this.defaultCharSingleByte;
        
        if (dbcsCode < 0x100) {
            newBuf[j++] = dbcsCode;
        }
        else if (dbcsCode < 0x10000) {
            newBuf[j++] = dbcsCode >> 8;   // high byte
            newBuf[j++] = dbcsCode & 0xFF; // low byte
        }
        else if (dbcsCode < 0x1000000) {
            newBuf[j++] = dbcsCode >> 16;
            newBuf[j++] = (dbcsCode >> 8) & 0xFF;
            newBuf[j++] = dbcsCode & 0xFF;
        } else {
            newBuf[j++] = dbcsCode >>> 24;
            newBuf[j++] = (dbcsCode >>> 16) & 0xFF;
            newBuf[j++] = (dbcsCode >>> 8) & 0xFF;
            newBuf[j++] = dbcsCode & 0xFF;
        }
    }

    this.seqObj = seqObj;
    this.leadSurrogate = leadSurrogate;
    return newBuf.slice(0, j);
}

DBCSEncoder.prototype.end = function() {
    if (this.leadSurrogate === -1 && this.seqObj === undefined)
        return; // All clean. Most often case.

    var newBuf = Buffer.alloc(10), j = 0;

    if (this.seqObj) { // We're in the sequence.
        var dbcsCode = this.seqObj[DEF_CHAR];
        if (dbcsCode !== undefined) { // Write beginning of the sequence.
            if (dbcsCode < 0x100) {
                newBuf[j++] = dbcsCode;
            }
            else {
                newBuf[j++] = dbcsCode >> 8;   // high byte
                newBuf[j++] = dbcsCode & 0xFF; // low byte
            }
        } else {
            // See todo above.
        }
        this.seqObj = undefined;
    }

    if (this.leadSurrogate !== -1) {
        // Incomplete surrogate pair - only lead surrogate found.
        newBuf[j++] = this.defaultCharSingleByte;
        this.leadSurrogate = -1;
    }
    
    return newBuf.slice(0, j);
}

// Export for testing
DBCSEncoder.prototype.findIdx = findIdx;


// == Decoder ==================================================================

function DBCSDecoder(options, codec) {
    // Decoder state
    this.nodeIdx = 0;
    this.prevBytes = [];

    // Static data
    this.decodeTables = codec.decodeTables;
    this.decodeTableSeq = codec.decodeTableSeq;
    this.defaultCharUnicode = codec.defaultCharUnicode;
    this.gb18030 = codec.gb18030;
}

DBCSDecoder.prototype.write = function(buf) {
    var newBuf = Buffer.alloc(buf.length*2),
        nodeIdx = this.nodeIdx, 
        prevBytes = this.prevBytes, prevOffset = this.prevBytes.length,
        seqStart = -this.prevBytes.length, // idx of the start of current parsed sequence.
        uCode;

    for (var i = 0, j = 0; i < buf.length; i++) {
        var curByte = (i >= 0) ? buf[i] : prevBytes[i + prevOffset];

        // Lookup in current trie node.
        var uCode = this.decodeTables[nodeIdx][curByte];

        if (uCode >= 0) { 
            // Normal character, just use it.
        }
        else if (uCode === UNASSIGNED) { // Unknown char.
            // TODO: Callback with seq.
            uCode = this.defaultCharUnicode.charCodeAt(0);
            i = seqStart; // Skip one byte ('i' will be incremented by the for loop) and try to parse again.
        }
        else if (uCode === GB18030_CODE) {
            if (i >= 3) {
                var ptr = (buf[i-3]-0x81)*12600 + (buf[i-2]-0x30)*1260 + (buf[i-1]-0x81)*10 + (curByte-0x30);
            } else {
                var ptr = (prevBytes[i-3+prevOffset]-0x81)*12600 + 
                          (((i-2 >= 0) ? buf[i-2] : prevBytes[i-2+prevOffset])-0x30)*1260 + 
                          (((i-1 >= 0) ? buf[i-1] : prevBytes[i-1+prevOffset])-0x81)*10 + 
                          (curByte-0x30);
            }
            var idx = findIdx(this.gb18030.gbChars, ptr);
            uCode = this.gb18030.uChars[idx] + ptr - this.gb18030.gbChars[idx];
        }
        else if (uCode <= NODE_START) { // Go to next trie node.
            nodeIdx = NODE_START - uCode;
            continue;
        }
        else if (uCode <= SEQ_START) { // Output a sequence of chars.
            var seq = this.decodeTableSeq[SEQ_START - uCode];
            for (var k = 0; k < seq.length - 1; k++) {
                uCode = seq[k];
                newBuf[j++] = uCode & 0xFF;
                newBuf[j++] = uCode >> 8;
            }
            uCode = seq[seq.length-1];
        }
        else
            throw new Error("iconv-lite internal error: invalid decoding table value " + uCode + " at " + nodeIdx + "/" + curByte);

        // Write the character to buffer, handling higher planes using surrogate pair.
        if (uCode >= 0x10000) { 
            uCode -= 0x10000;
            var uCodeLead = 0xD800 | (uCode >> 10);
            newBuf[j++] = uCodeLead & 0xFF;
            newBuf[j++] = uCodeLead >> 8;

            uCode = 0xDC00 | (uCode & 0x3FF);
        }
        newBuf[j++] = uCode & 0xFF;
        newBuf[j++] = uCode >> 8;

        // Reset trie node.
        nodeIdx = 0; seqStart = i+1;
    }

    this.nodeIdx = nodeIdx;
    this.prevBytes = (seqStart >= 0)
        ? Array.prototype.slice.call(buf, seqStart)
        : prevBytes.slice(seqStart + prevOffset).concat(Array.prototype.slice.call(buf));

    return newBuf.slice(0, j).toString('ucs2');
}

DBCSDecoder.prototype.end = function() {
    var ret = '';

    // Try to parse all remaining chars.
    while (this.prevBytes.length > 0) {
        // Skip 1 character in the buffer.
        ret += this.defaultCharUnicode;
        var bytesArr = this.prevBytes.slice(1);

        // Parse remaining as usual.
        this.prevBytes = [];
        this.nodeIdx = 0;
        if (bytesArr.length > 0)
            ret += this.write(bytesArr);
    }

    this.prevBytes = [];
    this.nodeIdx = 0;
    return ret;
}

// Binary search for GB18030. Returns largest i such that table[i] <= val.
function findIdx(table, val) {
    if (table[0] > val)
        return -1;

    var l = 0, r = table.length;
    while (l < r-1) { // always table[l] <= val < table[r]
        var mid = l + ((r-l+1) >> 1);
        if (table[mid] <= val)
            l = mid;
        else
            r = mid;
    }
    return l;
}

"use strict";

// Description of supported double byte encodings and aliases.
// Tables are not require()-d until they are needed to speed up library load.
// require()-s are direct to support Browserify.

module.exports = {
    
    // == Japanese/ShiftJIS ====================================================
    // All japanese encodings are based on JIS X set of standards:
    // JIS X 0201 - Single-byte encoding of ASCII + ¥ + Kana chars at 0xA1-0xDF.
    // JIS X 0208 - Main set of 6879 characters, placed in 94x94 plane, to be encoded by 2 bytes. 
    //              Has several variations in 1978, 1983, 1990 and 1997.
    // JIS X 0212 - Supplementary plane of 6067 chars in 94x94 plane. 1990. Effectively dead.
    // JIS X 0213 - Extension and modern replacement of 0208 and 0212. Total chars: 11233.
    //              2 planes, first is superset of 0208, second - revised 0212.
    //              Introduced in 2000, revised 2004. Some characters are in Unicode Plane 2 (0x2xxxx)

    // Byte encodings are:
    //  * Shift_JIS: Compatible with 0201, uses not defined chars in top half as lead bytes for double-byte
    //               encoding of 0208. Lead byte ranges: 0x81-0x9F, 0xE0-0xEF; Trail byte ranges: 0x40-0x7E, 0x80-0x9E, 0x9F-0xFC.
    //               Windows CP932 is a superset of Shift_JIS. Some companies added more chars, notably KDDI.
    //  * EUC-JP:    Up to 3 bytes per character. Used mostly on *nixes.
    //               0x00-0x7F       - lower part of 0201
    //               0x8E, 0xA1-0xDF - upper part of 0201
    //               (0xA1-0xFE)x2   - 0208 plane (94x94).
    //               0x8F, (0xA1-0xFE)x2 - 0212 plane (94x94).
    //  * JIS X 208: 7-bit, direct encoding of 0208. Byte ranges: 0x21-0x7E (94 values). Uncommon.
    //               Used as-is in ISO2022 family.
    //  * ISO2022-JP: Stateful encoding, with escape sequences to switch between ASCII, 
    //                0201-1976 Roman, 0208-1978, 0208-1983.
    //  * ISO2022-JP-1: Adds esc seq for 0212-1990.
    //  * ISO2022-JP-2: Adds esc seq for GB2313-1980, KSX1001-1992, ISO8859-1, ISO8859-7.
    //  * ISO2022-JP-3: Adds esc seq for 0201-1976 Kana set, 0213-2000 Planes 1, 2.
    //  * ISO2022-JP-2004: Adds 0213-2004 Plane 1.
    //
    // After JIS X 0213 appeared, Shift_JIS-2004, EUC-JISX0213 and ISO2022-JP-2004 followed, with just changing the planes.
    //
    // Overall, it seems that it's a mess :( http://www8.plala.or.jp/tkubota1/unicode-symbols-map2.html

    'shiftjis': {
        type: '_dbcs',
        table: function() { return require('./tables/shiftjis.json') },
        encodeAdd: {'\u00a5': 0x5C, '\u203E': 0x7E},
        encodeSkipVals: [{from: 0xED40, to: 0xF940}],
    },
    'csshiftjis': 'shiftjis',
    'mskanji': 'shiftjis',
    'sjis': 'shiftjis',
    'windows31j': 'shiftjis',
    'ms31j': 'shiftjis',
    'xsjis': 'shiftjis',
    'windows932': 'shiftjis',
    'ms932': 'shiftjis',
    '932': 'shiftjis',
    'cp932': 'shiftjis',

    'eucjp': {
        type: '_dbcs',
        table: function() { return require('./tables/eucjp.json') },
        encodeAdd: {'\u00a5': 0x5C, '\u203E': 0x7E},
    },

    // TODO: KDDI extension to Shift_JIS
    // TODO: IBM CCSID 942 = CP932, but F0-F9 custom chars and other char changes.
    // TODO: IBM CCSID 943 = Shift_JIS = CP932 with original Shift_JIS lower 128 chars.


    // == Chinese/GBK ==========================================================
    // http://en.wikipedia.org/wiki/GBK
    // We mostly implement W3C recommendation: https://www.w3.org/TR/encoding/#gbk-encoder

    // Oldest GB2312 (1981, ~7600 chars) is a subset of CP936
    'gb2312': 'cp936',
    'gb231280': 'cp936',
    'gb23121980': 'cp936',
    'csgb2312': 'cp936',
    'csiso58gb231280': 'cp936',
    'euccn': 'cp936',

    // Microsoft's CP936 is a subset and approximation of GBK.
    'windows936': 'cp936',
    'ms936': 'cp936',
    '936': 'cp936',
    'cp936': {
        type: '_dbcs',
        table: function() { return require('./tables/cp936.json') },
    },

    // GBK (~22000 chars) is an extension of CP936 that added user-mapped chars and some other.
    'gbk': {
        type: '_dbcs',
        table: function() { return require('./tables/cp936.json').concat(require('./tables/gbk-added.json')) },
    },
    'xgbk': 'gbk',
    'isoir58': 'gbk',

    // GB18030 is an algorithmic extension of GBK.
    // Main source: https://www.w3.org/TR/encoding/#gbk-encoder
    // http://icu-project.org/docs/papers/gb18030.html
    // http://source.icu-project.org/repos/icu/data/trunk/charset/data/xml/gb-18030-2000.xml
    // http://www.khngai.com/chinese/charmap/tblgbk.php?page=0
    'gb18030': {
        type: '_dbcs',
        table: function() { return require('./tables/cp936.json').concat(require('./tables/gbk-added.json')) },
        gb18030: function() { return require('./tables/gb18030-ranges.json') },
        encodeSkipVals: [0x80],
        encodeAdd: {'€': 0xA2E3},
    },

    'chinese': 'gb18030',


    // == Korean ===============================================================
    // EUC-KR, KS_C_5601 and KS X 1001 are exactly the same.
    'windows949': 'cp949',
    'ms949': 'cp949',
    '949': 'cp949',
    'cp949': {
        type: '_dbcs',
        table: function() { return require('./tables/cp949.json') },
    },

    'cseuckr': 'cp949',
    'csksc56011987': 'cp949',
    'euckr': 'cp949',
    'isoir149': 'cp949',
    'korean': 'cp949',
    'ksc56011987': 'cp949',
    'ksc56011989': 'cp949',
    'ksc5601': 'cp949',


    // == Big5/Taiwan/Hong Kong ================================================
    // There are lots of tables for Big5 and cp950. Please see the following links for history:
    // http://moztw.org/docs/big5/  http://www.haible.de/bruno/charsets/conversion-tables/Big5.html
    // Variations, in roughly number of defined chars:
    //  * Windows CP 950: Microsoft variant of Big5. Canonical: http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP950.TXT
    //  * Windows CP 951: Microsoft variant of Big5-HKSCS-2001. Seems to be never public. http://me.abelcheung.org/articles/research/what-is-cp951/
    //  * Big5-2003 (Taiwan standard) almost superset of cp950.
    //  * Unicode-at-on (UAO) / Mozilla 1.8. Falling out of use on the Web. Not supported by other browsers.
    //  * Big5-HKSCS (-2001, -2004, -2008). Hong Kong standard. 
    //    many unicode code points moved from PUA to Supplementary plane (U+2XXXX) over the years.
    //    Plus, it has 4 combining sequences.
    //    Seems that Mozilla refused to support it for 10 yrs. https://bugzilla.mozilla.org/show_bug.cgi?id=162431 https://bugzilla.mozilla.org/show_bug.cgi?id=310299
    //    because big5-hkscs is the only encoding to include astral characters in non-algorithmic way.
    //    Implementations are not consistent within browsers; sometimes labeled as just big5.
    //    MS Internet Explorer switches from big5 to big5-hkscs when a patch applied.
    //    Great discussion & recap of what's going on https://bugzilla.mozilla.org/show_bug.cgi?id=912470#c31
    //    In the encoder, it might make sense to support encoding old PUA mappings to Big5 bytes seq-s.
    //    Official spec: http://www.ogcio.gov.hk/en/business/tech_promotion/ccli/terms/doc/2003cmp_2008.txt
    //                   http://www.ogcio.gov.hk/tc/business/tech_promotion/ccli/terms/doc/hkscs-2008-big5-iso.txt
    // 
    // Current understanding of how to deal with Big5(-HKSCS) is in the Encoding Standard, http://encoding.spec.whatwg.org/#big5-encoder
    // Unicode mapping (http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/OTHER/BIG5.TXT) is said to be wrong.

    'windows950': 'cp950',
    'ms950': 'cp950',
    '950': 'cp950',
    'cp950': {
        type: '_dbcs',
        table: function() { return require('./tables/cp950.json') },
    },

    // Big5 has many variations and is an extension of cp950. We use Encoding Standard's as a consensus.
    'big5': 'big5hkscs',
    'big5hkscs': {
        type: '_dbcs',
        table: function() { return require('./tables/cp950.json').concat(require('./tables/big5-added.json')) },
        encodeSkipVals: [
            // Although Encoding Standard says we should avoid encoding to HKSCS area (See Step 1 of
            // https://encoding.spec.whatwg.org/#index-big5-pointer), we still do it to increase compatibility with ICU.
            // But if a single unicode point can be encoded both as HKSCS and regular Big5, we prefer the latter.
            0x8e69, 0x8e6f, 0x8e7e, 0x8eab, 0x8eb4, 0x8ecd, 0x8ed0, 0x8f57, 0x8f69, 0x8f6e, 0x8fcb, 0x8ffe,
            0x906d, 0x907a, 0x90c4, 0x90dc, 0x90f1, 0x91bf, 0x92af, 0x92b0, 0x92b1, 0x92b2, 0x92d1, 0x9447, 0x94ca,
            0x95d9, 0x96fc, 0x9975, 0x9b76, 0x9b78, 0x9b7b, 0x9bc6, 0x9bde, 0x9bec, 0x9bf6, 0x9c42, 0x9c53, 0x9c62,
            0x9c68, 0x9c6b, 0x9c77, 0x9cbc, 0x9cbd, 0x9cd0, 0x9d57, 0x9d5a, 0x9dc4, 0x9def, 0x9dfb, 0x9ea9, 0x9eef,
            0x9efd, 0x9f60, 0x9fcb, 0xa077, 0xa0dc, 0xa0df, 0x8fcc, 0x92c8, 0x9644, 0x96ed,

            // Step 2 of https://encoding.spec.whatwg.org/#index-big5-pointer: Use last pointer for U+2550, U+255E, U+2561, U+256A, U+5341, or U+5345
            0xa2a4, 0xa2a5, 0xa2a7, 0xa2a6, 0xa2cc, 0xa2ce,
        ],
    },

    'cnbig5': 'big5hkscs',
    'csbig5': 'big5hkscs',
    'xxbig5': 'big5hkscs',
};
"use strict";

// Update this array if you add/rename/remove files in this directory.
// We support Browserify by skipping automatic module discovery and requiring modules directly.
var modules = [
    require("./internal"),
    require("./utf32"),
    require("./utf16"),
    require("./utf7"),
    require("./sbcs-codec"),
    require("./sbcs-data"),
    require("./sbcs-data-generated"),
    require("./dbcs-codec"),
    require("./dbcs-data"),
];

// Put all encoding/alias/codec definitions to single object and export it.
for (var i = 0; i < modules.length; i++) {
    var module = modules[i];
    for (var enc in module)
        if (Object.prototype.hasOwnProperty.call(module, enc))
            exports[enc] = module[enc];
}
"use strict";
var Buffer = require("safer-buffer").Buffer;

// Export Node.js internal encodings.

module.exports = {
    // Encodings
    utf8:   { type: "_internal", bomAware: true},
    cesu8:  { type: "_internal", bomAware: true},
    unicode11utf8: "utf8",

    ucs2:   { type: "_internal", bomAware: true},
    utf16le: "ucs2",

    binary: { type: "_internal" },
    base64: { type: "_internal" },
    hex:    { type: "_internal" },

    // Codec.
    _internal: InternalCodec,
};

//------------------------------------------------------------------------------

function InternalCodec(codecOptions, iconv) {
    this.enc = codecOptions.encodingName;
    this.bomAware = codecOptions.bomAware;

    if (this.enc === "base64")
        this.encoder = InternalEncoderBase64;
    else if (this.enc === "cesu8") {
        this.enc = "utf8"; // Use utf8 for decoding.
        this.encoder = InternalEncoderCesu8;

        // Add decoder for versions of Node not supporting CESU-8
        if (Buffer.from('eda0bdedb2a9', 'hex').toString() !== '💩') {
            this.decoder = InternalDecoderCesu8;
            this.defaultCharUnicode = iconv.defaultCharUnicode;
        }
    }
}

InternalCodec.prototype.encoder = InternalEncoder;
InternalCodec.prototype.decoder = InternalDecoder;

//------------------------------------------------------------------------------

// We use node.js internal decoder. Its signature is the same as ours.
var StringDecoder = require('string_decoder').StringDecoder;

if (!StringDecoder.prototype.end) // Node v0.8 doesn't have this method.
    StringDecoder.prototype.end = function() {};


function InternalDecoder(options, codec) {
    this.decoder = new StringDecoder(codec.enc);
}

InternalDecoder.prototype.write = function(buf) {
    if (!Buffer.isBuffer(buf)) {
        buf = Buffer.from(buf);
    }

    return this.decoder.write(buf);
}

InternalDecoder.prototype.end = function() {
    return this.decoder.end();
}


//------------------------------------------------------------------------------
// Encoder is mostly trivial

function InternalEncoder(options, codec) {
    this.enc = codec.enc;
}

InternalEncoder.prototype.write = function(str) {
    return Buffer.from(str, this.enc);
}

InternalEncoder.prototype.end = function() {
}


//------------------------------------------------------------------------------
// Except base64 encoder, which must keep its state.

function InternalEncoderBase64(options, codec) {
    this.prevStr = '';
}

InternalEncoderBase64.prototype.write = function(str) {
    str = this.prevStr + str;
    var completeQuads = str.length - (str.length % 4);
    this.prevStr = str.slice(completeQuads);
    str = str.slice(0, completeQuads);

    return Buffer.from(str, "base64");
}

InternalEncoderBase64.prototype.end = function() {
    return Buffer.from(this.prevStr, "base64");
}


//------------------------------------------------------------------------------
// CESU-8 encoder is also special.

function InternalEncoderCesu8(options, codec) {
}

InternalEncoderCesu8.prototype.write = function(str) {
    var buf = Buffer.alloc(str.length * 3), bufIdx = 0;
    for (var i = 0; i < str.length; i++) {
        var charCode = str.charCodeAt(i);
        // Naive implementation, but it works because CESU-8 is especially easy
        // to convert from UTF-16 (which all JS strings are encoded in).
        if (charCode < 0x80)
            buf[bufIdx++] = charCode;
        else if (charCode < 0x800) {
            buf[bufIdx++] = 0xC0 + (charCode >>> 6);
            buf[bufIdx++] = 0x80 + (charCode & 0x3f);
        }
        else { // charCode will always be < 0x10000 in javascript.
            buf[bufIdx++] = 0xE0 + (charCode >>> 12);
            buf[bufIdx++] = 0x80 + ((charCode >>> 6) & 0x3f);
            buf[bufIdx++] = 0x80 + (charCode & 0x3f);
        }
    }
    return buf.slice(0, bufIdx);
}

InternalEncoderCesu8.prototype.end = function() {
}

//------------------------------------------------------------------------------
// CESU-8 decoder is not implemented in Node v4.0+

function InternalDecoderCesu8(options, codec) {
    this.acc = 0;
    this.contBytes = 0;
    this.accBytes = 0;
    this.defaultCharUnicode = codec.defaultCharUnicode;
}

InternalDecoderCesu8.prototype.write = function(buf) {
    var acc = this.acc, contBytes = this.contBytes, accBytes = this.accBytes, 
        res = '';
    for (var i = 0; i < buf.length; i++) {
        var curByte = buf[i];
        if ((curByte & 0xC0) !== 0x80) { // Leading byte
            if (contBytes > 0) { // Previous code is invalid
                res += this.defaultCharUnicode;
                contBytes = 0;
            }

            if (curByte < 0x80) { // Single-byte code
                res += String.fromCharCode(curByte);
            } else if (curByte < 0xE0) { // Two-byte code
                acc = curByte & 0x1F;
                contBytes = 1; accBytes = 1;
            } else if (curByte < 0xF0) { // Three-byte code
                acc = curByte & 0x0F;
                contBytes = 2; accBytes = 1;
            } else { // Four or more are not supported for CESU-8.
                res += this.defaultCharUnicode;
            }
        } else { // Continuation byte
            if (contBytes > 0) { // We're waiting for it.
                acc = (acc << 6) | (curByte & 0x3f);
                contBytes--; accBytes++;
                if (contBytes === 0) {
                    // Check for overlong encoding, but support Modified UTF-8 (encoding NULL as C0 80)
                    if (accBytes === 2 && acc < 0x80 && acc > 0)
                        res += this.defaultCharUnicode;
                    else if (accBytes === 3 && acc < 0x800)
                        res += this.defaultCharUnicode;
                    else
                        // Actually add character.
                        res += String.fromCharCode(acc);
                }
            } else { // Unexpected continuation byte
                res += this.defaultCharUnicode;
            }
        }
    }
    this.acc = acc; this.contBytes = contBytes; this.accBytes = accBytes;
    return res;
}

InternalDecoderCesu8.prototype.end = function() {
    var res = 0;
    if (this.contBytes > 0)
        res += this.defaultCharUnicode;
    return res;
}
"use strict";
var Buffer = require("safer-buffer").Buffer;

// Single-byte codec. Needs a 'chars' string parameter that contains 256 or 128 chars that
// correspond to encoded bytes (if 128 - then lower half is ASCII). 

exports._sbcs = SBCSCodec;
function SBCSCodec(codecOptions, iconv) {
    if (!codecOptions)
        throw new Error("SBCS codec is called without the data.")
    
    // Prepare char buffer for decoding.
    if (!codecOptions.chars || (codecOptions.chars.length !== 128 && codecOptions.chars.length !== 256))
        throw new Error("Encoding '"+codecOptions.type+"' has incorrect 'chars' (must be of len 128 or 256)");
    
    if (codecOptions.chars.length === 128) {
        var asciiString = "";
        for (var i = 0; i < 128; i++)
            asciiString += String.fromCharCode(i);
        codecOptions.chars = asciiString + codecOptions.chars;
    }

    this.decodeBuf = Buffer.from(codecOptions.chars, 'ucs2');
    
    // Encoding buffer.
    var encodeBuf = Buffer.alloc(65536, iconv.defaultCharSingleByte.charCodeAt(0));

    for (var i = 0; i < codecOptions.chars.length; i++)
        encodeBuf[codecOptions.chars.charCodeAt(i)] = i;

    this.encodeBuf = encodeBuf;
}

SBCSCodec.prototype.encoder = SBCSEncoder;
SBCSCodec.prototype.decoder = SBCSDecoder;


function SBCSEncoder(options, codec) {
    this.encodeBuf = codec.encodeBuf;
}

SBCSEncoder.prototype.write = function(str) {
    var buf = Buffer.alloc(str.length);
    for (var i = 0; i < str.length; i++)
        buf[i] = this.encodeBuf[str.charCodeAt(i)];
    
    return buf;
}

SBCSEncoder.prototype.end = function() {
}


function SBCSDecoder(options, codec) {
    this.decodeBuf = codec.decodeBuf;
}

SBCSDecoder.prototype.write = function(buf) {
    // Strings are immutable in JS -> we use ucs2 buffer to speed up computations.
    var decodeBuf = this.decodeBuf;
    var newBuf = Buffer.alloc(buf.length*2);
    var idx1 = 0, idx2 = 0;
    for (var i = 0; i < buf.length; i++) {
        idx1 = buf[i]*2; idx2 = i*2;
        newBuf[idx2] = decodeBuf[idx1];
        newBuf[idx2+1] = decodeBuf[idx1+1];
    }
    return newBuf.toString('ucs2');
}

SBCSDecoder.prototype.end = function() {
}
"use strict";

// Generated data for sbcs codec. Don't edit manually. Regenerate using generation/gen-sbcs.js script.
module.exports = {
  "437": "cp437",
  "737": "cp737",
  "775": "cp775",
  "850": "cp850",
  "852": "cp852",
  "855": "cp855",
  "856": "cp856",
  "857": "cp857",
  "858": "cp858",
  "860": "cp860",
  "861": "cp861",
  "862": "cp862",
  "863": "cp863",
  "864": "cp864",
  "865": "cp865",
  "866": "cp866",
  "869": "cp869",
  "874": "windows874",
  "922": "cp922",
  "1046": "cp1046",
  "1124": "cp1124",
  "1125": "cp1125",
  "1129": "cp1129",
  "1133": "cp1133",
  "1161": "cp1161",
  "1162": "cp1162",
  "1163": "cp1163",
  "1250": "windows1250",
  "1251": "windows1251",
  "1252": "windows1252",
  "1253": "windows1253",
  "1254": "windows1254",
  "1255": "windows1255",
  "1256": "windows1256",
  "1257": "windows1257",
  "1258": "windows1258",
  "28591": "iso88591",
  "28592": "iso88592",
  "28593": "iso88593",
  "28594": "iso88594",
  "28595": "iso88595",
  "28596": "iso88596",
  "28597": "iso88597",
  "28598": "iso88598",
  "28599": "iso88599",
  "28600": "iso885910",
  "28601": "iso885911",
  "28603": "iso885913",
  "28604": "iso885914",
  "28605": "iso885915",
  "28606": "iso885916",
  "windows874": {
    "type": "_sbcs",
    "chars": "€����…�����������‘’“”•–—�������� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����"
  },
  "win874": "windows874",
  "cp874": "windows874",
  "windows1250": {
    "type": "_sbcs",
    "chars": "€�‚�„…†‡�‰Š‹ŚŤŽŹ�‘’“”•–—�™š›śťžź ˇ˘Ł¤Ą¦§¨©Ş«¬­®Ż°±˛ł´µ¶·¸ąş»Ľ˝ľżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙"
  },
  "win1250": "windows1250",
  "cp1250": "windows1250",
  "windows1251": {
    "type": "_sbcs",
    "chars": "ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—�™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬­®Ї°±Ііґµ¶·ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя"
  },
  "win1251": "windows1251",
  "cp1251": "windows1251",
  "windows1252": {
    "type": "_sbcs",
    "chars": "€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
  },
  "win1252": "windows1252",
  "cp1252": "windows1252",
  "windows1253": {
    "type": "_sbcs",
    "chars": "€�‚ƒ„…†‡�‰�‹�����‘’“”•–—�™�›���� ΅Ά£¤¥¦§¨©�«¬­®―°±²³΄µ¶·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�"
  },
  "win1253": "windows1253",
  "cp1253": "windows1253",
  "windows1254": {
    "type": "_sbcs",
    "chars": "€�‚ƒ„…†‡ˆ‰Š‹Œ����‘’“”•–—˜™š›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖ×ØÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ"
  },
  "win1254": "windows1254",
  "cp1254": "windows1254",
  "windows1255": {
    "type": "_sbcs",
    "chars": "€�‚ƒ„…†‡ˆ‰�‹�����‘’“”•–—˜™�›���� ¡¢£₪¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾¿ְֱֲֳִֵֶַָֹֺֻּֽ־ֿ׀ׁׂ׃װױײ׳״�������אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏�"
  },
  "win1255": "windows1255",
  "cp1255": "windows1255",
  "windows1256": {
    "type": "_sbcs",
    "chars": "€پ‚ƒ„…†‡ˆ‰ٹ‹Œچژڈگ‘’“”•–—ک™ڑ›œ‌‍ں ،¢£¤¥¦§¨©ھ«¬­®¯°±²³´µ¶·¸¹؛»¼½¾؟ہءآأؤإئابةتثجحخدذرزسشصض×طظعغـفقكàلâمنهوçèéêëىيîïًٌٍَôُِ÷ّùْûü‎‏ے"
  },
  "win1256": "windows1256",
  "cp1256": "windows1256",
  "windows1257": {
    "type": "_sbcs",
    "chars": "€�‚�„…†‡�‰�‹�¨ˇ¸�‘’“”•–—�™�›�¯˛� �¢£¤�¦§Ø©Ŗ«¬­®Æ°±²³´µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž˙"
  },
  "win1257": "windows1257",
  "cp1257": "windows1257",
  "windows1258": {
    "type": "_sbcs",
    "chars": "€�‚ƒ„…†‡ˆ‰�‹Œ����‘’“”•–—˜™�›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ"
  },
  "win1258": "windows1258",
  "cp1258": "windows1258",
  "iso88591": {
    "type": "_sbcs",
    "chars": " ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
  },
  "cp28591": "iso88591",
  "iso88592": {
    "type": "_sbcs",
    "chars": " Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙"
  },
  "cp28592": "iso88592",
  "iso88593": {
    "type": "_sbcs",
    "chars": " Ħ˘£¤�Ĥ§¨İŞĞĴ­�Ż°ħ²³´µĥ·¸ışğĵ½�żÀÁÂ�ÄĊĈÇÈÉÊËÌÍÎÏ�ÑÒÓÔĠÖ×ĜÙÚÛÜŬŜßàáâ�äċĉçèéêëìíîï�ñòóôġö÷ĝùúûüŭŝ˙"
  },
  "cp28593": "iso88593",
  "iso88594": {
    "type": "_sbcs",
    "chars": " ĄĸŖ¤ĨĻ§¨ŠĒĢŦ­Ž¯°ą˛ŗ´ĩļˇ¸šēģŧŊžŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎĪĐŅŌĶÔÕÖ×ØŲÚÛÜŨŪßāáâãäåæįčéęëėíîīđņōķôõö÷øųúûüũū˙"
  },
  "cp28594": "iso88594",
  "iso88595": {
    "type": "_sbcs",
    "chars": " ЁЂЃЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ"
  },
  "cp28595": "iso88595",
  "iso88596": {
    "type": "_sbcs",
    "chars": " ���¤�������،­�������������؛���؟�ءآأؤإئابةتثجحخدذرزسشصضطظعغ�����ـفقكلمنهوىيًٌٍَُِّْ�������������"
  },
  "cp28596": "iso88596",
  "iso88597": {
    "type": "_sbcs",
    "chars": " ‘’£€₯¦§¨©ͺ«¬­�―°±²³΄΅Ά·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�"
  },
  "cp28597": "iso88597",
  "iso88598": {
    "type": "_sbcs",
    "chars": " �¢£¤¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾��������������������������������‗אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏�"
  },
  "cp28598": "iso88598",
  "iso88599": {
    "type": "_sbcs",
    "chars": " ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖ×ØÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ"
  },
  "cp28599": "iso88599",
  "iso885910": {
    "type": "_sbcs",
    "chars": " ĄĒĢĪĨĶ§ĻĐŠŦŽ­ŪŊ°ąēģīĩķ·ļđšŧž―ūŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎÏÐŅŌÓÔÕÖŨØŲÚÛÜÝÞßāáâãäåæįčéęëėíîïðņōóôõöũøųúûüýþĸ"
  },
  "cp28600": "iso885910",
  "iso885911": {
    "type": "_sbcs",
    "chars": " กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����"
  },
  "cp28601": "iso885911",
  "iso885913": {
    "type": "_sbcs",
    "chars": " ”¢£¤„¦§Ø©Ŗ«¬­®Æ°±²³“µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž’"
  },
  "cp28603": "iso885913",
  "iso885914": {
    "type": "_sbcs",
    "chars": " Ḃḃ£ĊċḊ§Ẁ©ẂḋỲ­®ŸḞḟĠġṀṁ¶ṖẁṗẃṠỳẄẅṡÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏŴÑÒÓÔÕÖṪØÙÚÛÜÝŶßàáâãäåæçèéêëìíîïŵñòóôõöṫøùúûüýŷÿ"
  },
  "cp28604": "iso885914",
  "iso885915": {
    "type": "_sbcs",
    "chars": " ¡¢£€¥Š§š©ª«¬­®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
  },
  "cp28605": "iso885915",
  "iso885916": {
    "type": "_sbcs",
    "chars": " ĄąŁ€„Š§š©Ș«Ź­źŻ°±ČłŽ”¶·žčș»ŒœŸżÀÁÂĂÄĆÆÇÈÉÊËÌÍÎÏĐŃÒÓÔŐÖŚŰÙÚÛÜĘȚßàáâăäćæçèéêëìíîïđńòóôőöśűùúûüęțÿ"
  },
  "cp28606": "iso885916",
  "cp437": {
    "type": "_sbcs",
    "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñÑªº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
  },
  "ibm437": "cp437",
  "csibm437": "cp437",
  "cp737": {
    "type": "_sbcs",
    "chars": "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρσςτυφχψ░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ωάέήϊίόύϋώΆΈΉΊΌΎΏ±≥≤ΪΫ÷≈°∙·√ⁿ²■ "
  },
  "ibm737": "cp737",
  "csibm737": "cp737",
  "cp775": {
    "type": "_sbcs",
    "chars": "ĆüéāäģåćłēŖŗīŹÄÅÉæÆōöĢ¢ŚśÖÜø£Ø×¤ĀĪóŻżź”¦©®¬½¼Ł«»░▒▓│┤ĄČĘĖ╣║╗╝ĮŠ┐└┴┬├─┼ŲŪ╚╔╩╦╠═╬Žąčęėįšųūž┘┌█▄▌▐▀ÓßŌŃõÕµńĶķĻļņĒŅ’­±“¾¶§÷„°∙·¹³²■ "
  },
  "ibm775": "cp775",
  "csibm775": "cp775",
  "cp850": {
    "type": "_sbcs",
    "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñÑªº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýÝ¯´­±‗¾¶§÷¸°¨·¹³²■ "
  },
  "ibm850": "cp850",
  "csibm850": "cp850",
  "cp852": {
    "type": "_sbcs",
    "chars": "ÇüéâäůćçłëŐőîŹÄĆÉĹĺôöĽľŚśÖÜŤťŁ×čáíóúĄąŽžĘę¬źČş«»░▒▓│┤ÁÂĚŞ╣║╗╝Żż┐└┴┬├─┼Ăă╚╔╩╦╠═╬¤đĐĎËďŇÍÎě┘┌█▄ŢŮ▀ÓßÔŃńňŠšŔÚŕŰýÝţ´­˝˛ˇ˘§÷¸°¨˙űŘř■ "
  },
  "ibm852": "cp852",
  "csibm852": "cp852",
  "cp855": {
    "type": "_sbcs",
    "chars": "ђЂѓЃёЁєЄѕЅіІїЇјЈљЉњЊћЋќЌўЎџЏюЮъЪаАбБцЦдДеЕфФгГ«»░▒▓│┤хХиИ╣║╗╝йЙ┐└┴┬├─┼кК╚╔╩╦╠═╬¤лЛмМнНоОп┘┌█▄Пя▀ЯрРсСтТуУжЖвВьЬ№­ыЫзЗшШэЭщЩчЧ§■ "
  },
  "ibm855": "cp855",
  "csibm855": "cp855",
  "cp856": {
    "type": "_sbcs",
    "chars": "אבגדהוזחטיךכלםמןנסעףפץצקרשת�£�×����������®¬½¼�«»░▒▓│┤���©╣║╗╝¢¥┐└┴┬├─┼��╚╔╩╦╠═╬¤���������┘┌█▄¦�▀������µ�������¯´­±‗¾¶§÷¸°¨·¹³²■ "
  },
  "ibm856": "cp856",
  "csibm856": "cp856",
  "cp857": {
    "type": "_sbcs",
    "chars": "ÇüéâäàåçêëèïîıÄÅÉæÆôöòûùİÖÜø£ØŞşáíóúñÑĞğ¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ºªÊËÈ�ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµ�×ÚÛÙìÿ¯´­±�¾¶§÷¸°¨·¹³²■ "
  },
  "ibm857": "cp857",
  "csibm857": "cp857",
  "cp858": {
    "type": "_sbcs",
    "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñÑªº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈ€ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýÝ¯´­±‗¾¶§÷¸°¨·¹³²■ "
  },
  "ibm858": "cp858",
  "csibm858": "cp858",
  "cp860": {
    "type": "_sbcs",
    "chars": "ÇüéâãàÁçêÊèÍÔìÃÂÉÀÈôõòÚùÌÕÜ¢£Ù₧ÓáíóúñÑªº¿Ò¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
  },
  "ibm860": "cp860",
  "csibm860": "cp860",
  "cp861": {
    "type": "_sbcs",
    "chars": "ÇüéâäàåçêëèÐðÞÄÅÉæÆôöþûÝýÖÜø£Ø₧ƒáíóúÁÍÓÚ¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
  },
  "ibm861": "cp861",
  "csibm861": "cp861",
  "cp862": {
    "type": "_sbcs",
    "chars": "אבגדהוזחטיךכלםמןנסעףפץצקרשת¢£¥₧ƒáíóúñÑªº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
  },
  "ibm862": "cp862",
  "csibm862": "cp862",
  "cp863": {
    "type": "_sbcs",
    "chars": "ÇüéâÂà¶çêëèïî‗À§ÉÈÊôËÏûù¤ÔÜ¢£ÙÛƒ¦´óú¨¸³¯Î⌐¬½¼¾«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
  },
  "ibm863": "cp863",
  "csibm863": "cp863",
  "cp864": {
    "type": "_sbcs",
    "chars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$٪&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~°·∙√▒─│┼┤┬├┴┐┌└┘β∞φ±½¼≈«»ﻷﻸ��ﻻﻼ� ­ﺂ£¤ﺄ��ﺎﺏﺕﺙ،ﺝﺡﺥ٠١٢٣٤٥٦٧٨٩ﻑ؛ﺱﺵﺹ؟¢ﺀﺁﺃﺅﻊﺋﺍﺑﺓﺗﺛﺟﺣﺧﺩﺫﺭﺯﺳﺷﺻﺿﻁﻅﻋﻏ¦¬÷×ﻉـﻓﻗﻛﻟﻣﻧﻫﻭﻯﻳﺽﻌﻎﻍﻡﹽّﻥﻩﻬﻰﻲﻐﻕﻵﻶﻝﻙﻱ■�"
  },
  "ibm864": "cp864",
  "csibm864": "cp864",
  "cp865": {
    "type": "_sbcs",
    "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø₧ƒáíóúñÑªº¿⌐¬½¼¡«¤░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
  },
  "ibm865": "cp865",
  "csibm865": "cp865",
  "cp866": {
    "type": "_sbcs",
    "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№¤■ "
  },
  "ibm866": "cp866",
  "csibm866": "cp866",
  "cp869": {
    "type": "_sbcs",
    "chars": "������Ά�·¬¦‘’Έ―ΉΊΪΌ��ΎΫ©Ώ²³ά£έήίϊΐόύΑΒΓΔΕΖΗ½ΘΙ«»░▒▓│┤ΚΛΜΝ╣║╗╝ΞΟ┐└┴┬├─┼ΠΡ╚╔╩╦╠═╬ΣΤΥΦΧΨΩαβγ┘┌█▄δε▀ζηθικλμνξοπρσςτ΄­±υφχ§ψ΅°¨ωϋΰώ■ "
  },
  "ibm869": "cp869",
  "csibm869": "cp869",
  "cp922": {
    "type": "_sbcs",
    "chars": " ¡¢£¤¥¦§¨©ª«¬­®‾°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏŠÑÒÓÔÕÖ×ØÙÚÛÜÝŽßàáâãäåæçèéêëìíîïšñòóôõö÷øùúûüýžÿ"
  },
  "ibm922": "cp922",
  "csibm922": "cp922",
  "cp1046": {
    "type": "_sbcs",
    "chars": "ﺈ×÷ﹱ■│─┐┌└┘ﹹﹻﹽﹿﹷﺊﻰﻳﻲﻎﻏﻐﻶﻸﻺﻼ ¤ﺋﺑﺗﺛﺟﺣ،­ﺧﺳ٠١٢٣٤٥٦٧٨٩ﺷ؛ﺻﺿﻊ؟ﻋءآأؤإئابةتثجحخدذرزسشصضطﻇعغﻌﺂﺄﺎﻓـفقكلمنهوىيًٌٍَُِّْﻗﻛﻟﻵﻷﻹﻻﻣﻧﻬﻩ�"
  },
  "ibm1046": "cp1046",
  "csibm1046": "cp1046",
  "cp1124": {
    "type": "_sbcs",
    "chars": " ЁЂҐЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђґєѕіїјљњћќ§ўџ"
  },
  "ibm1124": "cp1124",
  "csibm1124": "cp1124",
  "cp1125": {
    "type": "_sbcs",
    "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёҐґЄєІіЇї·√№¤■ "
  },
  "ibm1125": "cp1125",
  "csibm1125": "cp1125",
  "cp1129": {
    "type": "_sbcs",
    "chars": " ¡¢£¤¥¦§œ©ª«¬­®¯°±²³Ÿµ¶·Œ¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ"
  },
  "ibm1129": "cp1129",
  "csibm1129": "cp1129",
  "cp1133": {
    "type": "_sbcs",
    "chars": " ກຂຄງຈສຊຍດຕຖທນບປຜຝພຟມຢຣລວຫອຮ���ຯະາຳິີຶືຸູຼັົຽ���ເແໂໃໄ່້໊໋໌ໍໆ�ໜໝ₭����������������໐໑໒໓໔໕໖໗໘໙��¢¬¦�"
  },
  "ibm1133": "cp1133",
  "csibm1133": "cp1133",
  "cp1161": {
    "type": "_sbcs",
    "chars": "��������������������������������่กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู้๊๋€฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛¢¬¦ "
  },
  "ibm1161": "cp1161",
  "csibm1161": "cp1161",
  "cp1162": {
    "type": "_sbcs",
    "chars": "€…‘’“”•–— กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����"
  },
  "ibm1162": "cp1162",
  "csibm1162": "cp1162",
  "cp1163": {
    "type": "_sbcs",
    "chars": " ¡¢£€¥¦§œ©ª«¬­®¯°±²³Ÿµ¶·Œ¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ"
  },
  "ibm1163": "cp1163",
  "csibm1163": "cp1163",
  "maccroatian": {
    "type": "_sbcs",
    "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®Š™´¨≠ŽØ∞±≤≥∆µ∂∑∏š∫ªºΩžø¿¡¬√ƒ≈Ć«Č… ÀÃÕŒœĐ—“”‘’÷◊�©⁄¤‹›Æ»–·‚„‰ÂćÁčÈÍÎÏÌÓÔđÒÚÛÙıˆ˜¯πË˚¸Êæˇ"
  },
  "maccyrillic": {
    "type": "_sbcs",
    "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°¢£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµ∂ЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤"
  },
  "macgreek": {
    "type": "_sbcs",
    "chars": "Ä¹²É³ÖÜ΅àâä΄¨çéèêë£™îï•½‰ôö¦­ùûü†ΓΔΘΛΞΠß®©ΣΪ§≠°·Α±≤≥¥ΒΕΖΗΙΚΜΦΫΨΩάΝ¬ΟΡ≈Τ«»… ΥΧΆΈœ–―“”‘’÷ΉΊΌΎέήίόΏύαβψδεφγηιξκλμνοπώρστθωςχυζϊϋΐΰ�"
  },
  "maciceland": {
    "type": "_sbcs",
    "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûüÝ°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤ÐðÞþý·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ"
  },
  "macroman": {
    "type": "_sbcs",
    "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›ﬁﬂ‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ"
  },
  "macromania": {
    "type": "_sbcs",
    "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ĂŞ∞±≤≥¥µ∂∑∏π∫ªºΩăş¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›Ţţ‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ"
  },
  "macthai": {
    "type": "_sbcs",
    "chars": "«»…“”�•‘’� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู﻿​–—฿เแโใไๅๆ็่้๊๋์ํ™๏๐๑๒๓๔๕๖๗๘๙®©����"
  },
  "macturkish": {
    "type": "_sbcs",
    "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸĞğİıŞş‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙ�ˆ˜¯˘˙˚¸˝˛ˇ"
  },
  "macukraine": {
    "type": "_sbcs",
    "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°Ґ£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµґЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤"
  },
  "koi8r": {
    "type": "_sbcs",
    "chars": "─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ё╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡Ё╢╣╤╥╦╧╨╩╪╫╬©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ"
  },
  "koi8u": {
    "type": "_sbcs",
    "chars": "─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ёє╔ії╗╘╙╚╛ґ╝╞╟╠╡ЁЄ╣ІЇ╦╧╨╩╪Ґ╬©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ"
  },
  "koi8ru": {
    "type": "_sbcs",
    "chars": "─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ёє╔ії╗╘╙╚╛ґў╞╟╠╡ЁЄ╣ІЇ╦╧╨╩╪ҐЎ©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ"
  },
  "koi8t": {
    "type": "_sbcs",
    "chars": "қғ‚Ғ„…†‡�‰ҳ‹ҲҷҶ�Қ‘’“”•–—�™�›�����ӯӮё¤ӣ¦§���«¬­®�°±²Ё�Ӣ¶·�№�»���©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ"
  },
  "armscii8": {
    "type": "_sbcs",
    "chars": " �և։)(»«—.՝,-֊…՜՛՞ԱաԲբԳգԴդԵեԶզԷէԸըԹթԺժԻիԼլԽխԾծԿկՀհՁձՂղՃճՄմՅյՆնՇշՈոՉչՊպՋջՌռՍսՎվՏտՐրՑցՒւՓփՔքՕօՖֆ՚�"
  },
  "rk1048": {
    "type": "_sbcs",
    "chars": "ЂЃ‚ѓ„…†‡€‰Љ‹ЊҚҺЏђ‘’“”•–—�™љ›њқһџ ҰұӘ¤Ө¦§Ё©Ғ«¬­®Ү°±Ііөµ¶·ё№ғ»әҢңүАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя"
  },
  "tcvn": {
    "type": "_sbcs",
    "chars": "\u0000ÚỤ\u0003ỪỬỮ\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010ỨỰỲỶỸÝỴ\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÀẢÃÁẠẶẬÈẺẼÉẸỆÌỈĨÍỊÒỎÕÓỌỘỜỞỠỚỢÙỦŨ ĂÂÊÔƠƯĐăâêôơưđẶ̀̀̉̃́àảãáạẲằẳẵắẴẮẦẨẪẤỀặầẩẫấậèỂẻẽéẹềểễếệìỉỄẾỒĩíịòỔỏõóọồổỗốộờởỡớợùỖủũúụừửữứựỳỷỹýỵỐ"
  },
  "georgianacademy": {
    "type": "_sbcs",
    "chars": "‚ƒ„…†‡ˆ‰Š‹Œ‘’“”•–—˜™š›œŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿აბგდევზთიკლმნოპჟრსტუფქღყშჩცძწჭხჯჰჱჲჳჴჵჶçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
  },
  "georgianps": {
    "type": "_sbcs",
    "chars": "‚ƒ„…†‡ˆ‰Š‹Œ‘’“”•–—˜™š›œŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿აბგდევზჱთიკლმნჲოპჟრსტჳუფქღყშჩცძწჭხჴჯჰჵæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
  },
  "pt154": {
    "type": "_sbcs",
    "chars": "ҖҒӮғ„…ҶҮҲүҠӢҢҚҺҸҗ‘’“”•–—ҳҷҡӣңқһҹ ЎўЈӨҘҰ§Ё©Ә«¬ӯ®Ҝ°ұІіҙө¶·ё№ә»јҪҫҝАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя"
  },
  "viscii": {
    "type": "_sbcs",
    "chars": "\u0000\u0001Ẳ\u0003\u0004ẴẪ\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013Ỷ\u0015\u0016\u0017\u0018Ỹ\u001a\u001b\u001c\u001dỴ\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ẠẮẰẶẤẦẨẬẼẸẾỀỂỄỆỐỒỔỖỘỢỚỜỞỊỎỌỈỦŨỤỲÕắằặấầẩậẽẹếềểễệốồổỗỠƠộờởịỰỨỪỬơớƯÀÁÂÃẢĂẳẵÈÉÊẺÌÍĨỳĐứÒÓÔạỷừửÙÚỹỵÝỡưàáâãảăữẫèéêẻìíĩỉđựòóôõỏọụùúũủýợỮ"
  },
  "iso646cn": {
    "type": "_sbcs",
    "chars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}‾��������������������������������������������������������������������������������������������������������������������������������"
  },
  "iso646jp": {
    "type": "_sbcs",
    "chars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[¥]^_`abcdefghijklmnopqrstuvwxyz{|}‾��������������������������������������������������������������������������������������������������������������������������������"
  },
  "hproman8": {
    "type": "_sbcs",
    "chars": " ÀÂÈÊËÎÏ´ˋˆ¨˜ÙÛ₤¯Ýý°ÇçÑñ¡¿¤£¥§ƒ¢âêôûáéóúàèòùäëöüÅîØÆåíøæÄìÖÜÉïßÔÁÃãÐðÍÌÓÒÕõŠšÚŸÿÞþ·µ¶¾—¼½ªº«■»±�"
  },
  "macintosh": {
    "type": "_sbcs",
    "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›ﬁﬂ‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ"
  },
  "ascii": {
    "type": "_sbcs",
    "chars": "��������������������������������������������������������������������������������������������������������������������������������"
  },
  "tis620": {
    "type": "_sbcs",
    "chars": "���������������������������������กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����"
  }
}"use strict";

// Manually added data to be used by sbcs codec in addition to generated one.

module.exports = {
    // Not supported by iconv, not sure why.
    "10029": "maccenteuro",
    "maccenteuro": {
        "type": "_sbcs",
        "chars": "ÄĀāÉĄÖÜáąČäčĆćéŹźĎíďĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅņŃ¬√ńŇ∆«»… ňŐÕőŌ–—“”‘’÷◊ōŔŕŘ‹›řŖŗŠ‚„šŚśÁŤťÍŽžŪÓÔūŮÚůŰűŲųÝýķŻŁżĢˇ"
    },

    "808": "cp808",
    "ibm808": "cp808",
    "cp808": {
        "type": "_sbcs",
        "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№€■ "
    },

    "mik": {
        "type": "_sbcs",
        "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя└┴┬├─┼╣║╚╔╩╦╠═╬┐░▒▓│┤№§╗╝┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
    },

    "cp720": {
        "type": "_sbcs",
        "chars": "\x80\x81éâ\x84à\x86çêëèïî\x8d\x8e\x8f\x90\u0651\u0652ô¤ـûùءآأؤ£إئابةتثجحخدذرزسشص«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ضطظعغفµقكلمنهوىي≡\u064b\u064c\u064d\u064e\u064f\u0650≈°∙·√ⁿ²■\u00a0"
    },

    // Aliases of generated encodings.
    "ascii8bit": "ascii",
    "usascii": "ascii",
    "ansix34": "ascii",
    "ansix341968": "ascii",
    "ansix341986": "ascii",
    "csascii": "ascii",
    "cp367": "ascii",
    "ibm367": "ascii",
    "isoir6": "ascii",
    "iso646us": "ascii",
    "iso646irv": "ascii",
    "us": "ascii",

    "latin1": "iso88591",
    "latin2": "iso88592",
    "latin3": "iso88593",
    "latin4": "iso88594",
    "latin5": "iso88599",
    "latin6": "iso885910",
    "latin7": "iso885913",
    "latin8": "iso885914",
    "latin9": "iso885915",
    "latin10": "iso885916",

    "csisolatin1": "iso88591",
    "csisolatin2": "iso88592",
    "csisolatin3": "iso88593",
    "csisolatin4": "iso88594",
    "csisolatincyrillic": "iso88595",
    "csisolatinarabic": "iso88596",
    "csisolatingreek" : "iso88597",
    "csisolatinhebrew": "iso88598",
    "csisolatin5": "iso88599",
    "csisolatin6": "iso885910",

    "l1": "iso88591",
    "l2": "iso88592",
    "l3": "iso88593",
    "l4": "iso88594",
    "l5": "iso88599",
    "l6": "iso885910",
    "l7": "iso885913",
    "l8": "iso885914",
    "l9": "iso885915",
    "l10": "iso885916",

    "isoir14": "iso646jp",
    "isoir57": "iso646cn",
    "isoir100": "iso88591",
    "isoir101": "iso88592",
    "isoir109": "iso88593",
    "isoir110": "iso88594",
    "isoir144": "iso88595",
    "isoir127": "iso88596",
    "isoir126": "iso88597",
    "isoir138": "iso88598",
    "isoir148": "iso88599",
    "isoir157": "iso885910",
    "isoir166": "tis620",
    "isoir179": "iso885913",
    "isoir199": "iso885914",
    "isoir203": "iso885915",
    "isoir226": "iso885916",

    "cp819": "iso88591",
    "ibm819": "iso88591",

    "cyrillic": "iso88595",

    "arabic": "iso88596",
    "arabic8": "iso88596",
    "ecma114": "iso88596",
    "asmo708": "iso88596",

    "greek" : "iso88597",
    "greek8" : "iso88597",
    "ecma118" : "iso88597",
    "elot928" : "iso88597",

    "hebrew": "iso88598",
    "hebrew8": "iso88598",

    "turkish": "iso88599",
    "turkish8": "iso88599",

    "thai": "iso885911",
    "thai8": "iso885911",

    "celtic": "iso885914",
    "celtic8": "iso885914",
    "isoceltic": "iso885914",

    "tis6200": "tis620",
    "tis62025291": "tis620",
    "tis62025330": "tis620",

    "10000": "macroman",
    "10006": "macgreek",
    "10007": "maccyrillic",
    "10079": "maciceland",
    "10081": "macturkish",

    "cspc8codepage437": "cp437",
    "cspc775baltic": "cp775",
    "cspc850multilingual": "cp850",
    "cspcp852": "cp852",
    "cspc862latinhebrew": "cp862",
    "cpgr": "cp869",

    "msee": "cp1250",
    "mscyrl": "cp1251",
    "msansi": "cp1252",
    "msgreek": "cp1253",
    "msturk": "cp1254",
    "mshebr": "cp1255",
    "msarab": "cp1256",
    "winbaltrim": "cp1257",

    "cp20866": "koi8r",
    "20866": "koi8r",
    "ibm878": "koi8r",
    "cskoi8r": "koi8r",

    "cp21866": "koi8u",
    "21866": "koi8u",
    "ibm1168": "koi8u",

    "strk10482002": "rk1048",

    "tcvn5712": "tcvn",
    "tcvn57121": "tcvn",

    "gb198880": "iso646cn",
    "cn": "iso646cn",

    "csiso14jisc6220ro": "iso646jp",
    "jisc62201969ro": "iso646jp",
    "jp": "iso646jp",

    "cshproman8": "hproman8",
    "r8": "hproman8",
    "roman8": "hproman8",
    "xroman8": "hproman8",
    "ibm1051": "hproman8",

    "mac": "macintosh",
    "csmacintosh": "macintosh",
};

"use strict";
var Buffer = require("safer-buffer").Buffer;

// Note: UTF16-LE (or UCS2) codec is Node.js native. See encodings/internal.js

// == UTF16-BE codec. ==========================================================

exports.utf16be = Utf16BECodec;
function Utf16BECodec() {
}

Utf16BECodec.prototype.encoder = Utf16BEEncoder;
Utf16BECodec.prototype.decoder = Utf16BEDecoder;
Utf16BECodec.prototype.bomAware = true;


// -- Encoding

function Utf16BEEncoder() {
}

Utf16BEEncoder.prototype.write = function(str) {
    var buf = Buffer.from(str, 'ucs2');
    for (var i = 0; i < buf.length; i += 2) {
        var tmp = buf[i]; buf[i] = buf[i+1]; buf[i+1] = tmp;
    }
    return buf;
}

Utf16BEEncoder.prototype.end = function() {
}


// -- Decoding

function Utf16BEDecoder() {
    this.overflowByte = -1;
}

Utf16BEDecoder.prototype.write = function(buf) {
    if (buf.length == 0)
        return '';

    var buf2 = Buffer.alloc(buf.length + 1),
        i = 0, j = 0;

    if (this.overflowByte !== -1) {
        buf2[0] = buf[0];
        buf2[1] = this.overflowByte;
        i = 1; j = 2;
    }

    for (; i < buf.length-1; i += 2, j+= 2) {
        buf2[j] = buf[i+1];
        buf2[j+1] = buf[i];
    }

    this.overflowByte = (i == buf.length-1) ? buf[buf.length-1] : -1;

    return buf2.slice(0, j).toString('ucs2');
}

Utf16BEDecoder.prototype.end = function() {
    this.overflowByte = -1;
}


// == UTF-16 codec =============================================================
// Decoder chooses automatically from UTF-16LE and UTF-16BE using BOM and space-based heuristic.
// Defaults to UTF-16LE, as it's prevalent and default in Node.
// http://en.wikipedia.org/wiki/UTF-16 and http://encoding.spec.whatwg.org/#utf-16le
// Decoder default can be changed: iconv.decode(buf, 'utf16', {defaultEncoding: 'utf-16be'});

// Encoder uses UTF-16LE and prepends BOM (which can be overridden with addBOM: false).

exports.utf16 = Utf16Codec;
function Utf16Codec(codecOptions, iconv) {
    this.iconv = iconv;
}

Utf16Codec.prototype.encoder = Utf16Encoder;
Utf16Codec.prototype.decoder = Utf16Decoder;


// -- Encoding (pass-through)

function Utf16Encoder(options, codec) {
    options = options || {};
    if (options.addBOM === undefined)
        options.addBOM = true;
    this.encoder = codec.iconv.getEncoder('utf-16le', options);
}

Utf16Encoder.prototype.write = function(str) {
    return this.encoder.write(str);
}

Utf16Encoder.prototype.end = function() {
    return this.encoder.end();
}


// -- Decoding

function Utf16Decoder(options, codec) {
    this.decoder = null;
    this.initialBufs = [];
    this.initialBufsLen = 0;

    this.options = options || {};
    this.iconv = codec.iconv;
}

Utf16Decoder.prototype.write = function(buf) {
    if (!this.decoder) {
        // Codec is not chosen yet. Accumulate initial bytes.
        this.initialBufs.push(buf);
        this.initialBufsLen += buf.length;
        
        if (this.initialBufsLen < 16) // We need more bytes to use space heuristic (see below)
            return '';

        // We have enough bytes -> detect endianness.
        var encoding = detectEncoding(this.initialBufs, this.options.defaultEncoding);
        this.decoder = this.iconv.getDecoder(encoding, this.options);

        var resStr = '';
        for (var i = 0; i < this.initialBufs.length; i++)
            resStr += this.decoder.write(this.initialBufs[i]);

        this.initialBufs.length = this.initialBufsLen = 0;
        return resStr;
    }

    return this.decoder.write(buf);
}

Utf16Decoder.prototype.end = function() {
    if (!this.decoder) {
        var encoding = detectEncoding(this.initialBufs, this.options.defaultEncoding);
        this.decoder = this.iconv.getDecoder(encoding, this.options);

        var resStr = '';
        for (var i = 0; i < this.initialBufs.length; i++)
            resStr += this.decoder.write(this.initialBufs[i]);

        var trail = this.decoder.end();
        if (trail)
            resStr += trail;

        this.initialBufs.length = this.initialBufsLen = 0;
        return resStr;
    }
    return this.decoder.end();
}

function detectEncoding(bufs, defaultEncoding) {
    var b = [];
    var charsProcessed = 0;
    var asciiCharsLE = 0, asciiCharsBE = 0; // Number of ASCII chars when decoded as LE or BE.

    outer_loop:
    for (var i = 0; i < bufs.length; i++) {
        var buf = bufs[i];
        for (var j = 0; j < buf.length; j++) {
            b.push(buf[j]);
            if (b.length === 2) {
                if (charsProcessed === 0) {
                    // Check BOM first.
                    if (b[0] === 0xFF && b[1] === 0xFE) return 'utf-16le';
                    if (b[0] === 0xFE && b[1] === 0xFF) return 'utf-16be';
                }

                if (b[0] === 0 && b[1] !== 0) asciiCharsBE++;
                if (b[0] !== 0 && b[1] === 0) asciiCharsLE++;

                b.length = 0;
                charsProcessed++;

                if (charsProcessed >= 100) {
                    break outer_loop;
                }
            }
        }
    }

    // Make decisions.
    // Most of the time, the content has ASCII chars (U+00**), but the opposite (U+**00) is uncommon.
    // So, we count ASCII as if it was LE or BE, and decide from that.
    if (asciiCharsBE > asciiCharsLE) return 'utf-16be';
    if (asciiCharsBE < asciiCharsLE) return 'utf-16le';

    // Couldn't decide (likely all zeros or not enough data).
    return defaultEncoding || 'utf-16le';
}


'use strict';

var Buffer = require('safer-buffer').Buffer;

// == UTF32-LE/BE codec. ==========================================================

exports._utf32 = Utf32Codec;

function Utf32Codec(codecOptions, iconv) {
    this.iconv = iconv;
    this.bomAware = true;
    this.isLE = codecOptions.isLE;
}

exports.utf32le = { type: '_utf32', isLE: true };
exports.utf32be = { type: '_utf32', isLE: false };

// Aliases
exports.ucs4le = 'utf32le';
exports.ucs4be = 'utf32be';

Utf32Codec.prototype.encoder = Utf32Encoder;
Utf32Codec.prototype.decoder = Utf32Decoder;

// -- Encoding

function Utf32Encoder(options, codec) {
    this.isLE = codec.isLE;
    this.highSurrogate = 0;
}

Utf32Encoder.prototype.write = function(str) {
    var src = Buffer.from(str, 'ucs2');
    var dst = Buffer.alloc(src.length * 2);
    var write32 = this.isLE ? dst.writeUInt32LE : dst.writeUInt32BE;
    var offset = 0;

    for (var i = 0; i < src.length; i += 2) {
        var code = src.readUInt16LE(i);
        var isHighSurrogate = (0xD800 <= code && code < 0xDC00);
        var isLowSurrogate = (0xDC00 <= code && code < 0xE000);

        if (this.highSurrogate) {
            if (isHighSurrogate || !isLowSurrogate) {
                // There shouldn't be two high surrogates in a row, nor a high surrogate which isn't followed by a low
                // surrogate. If this happens, keep the pending high surrogate as a stand-alone semi-invalid character
                // (technically wrong, but expected by some applications, like Windows file names).
                write32.call(dst, this.highSurrogate, offset);
                offset += 4;
            }
            else {
                // Create 32-bit value from high and low surrogates;
                var codepoint = (((this.highSurrogate - 0xD800) << 10) | (code - 0xDC00)) + 0x10000;

                write32.call(dst, codepoint, offset);
                offset += 4;
                this.highSurrogate = 0;

                continue;
            }
        }

        if (isHighSurrogate)
            this.highSurrogate = code;
        else {
            // Even if the current character is a low surrogate, with no previous high surrogate, we'll
            // encode it as a semi-invalid stand-alone character for the same reasons expressed above for
            // unpaired high surrogates.
            write32.call(dst, code, offset);
            offset += 4;
            this.highSurrogate = 0;
        }
    }

    if (offset < dst.length)
        dst = dst.slice(0, offset);

    return dst;
};

Utf32Encoder.prototype.end = function() {
    // Treat any leftover high surrogate as a semi-valid independent character.
    if (!this.highSurrogate)
        return;

    var buf = Buffer.alloc(4);

    if (this.isLE)
        buf.writeUInt32LE(this.highSurrogate, 0);
    else
        buf.writeUInt32BE(this.highSurrogate, 0);

    this.highSurrogate = 0;

    return buf;
};

// -- Decoding

function Utf32Decoder(options, codec) {
    this.isLE = codec.isLE;
    this.badChar = codec.iconv.defaultCharUnicode.charCodeAt(0);
    this.overflow = [];
}

Utf32Decoder.prototype.write = function(src) {
    if (src.length === 0)
        return '';

    var i = 0;
    var codepoint = 0;
    var dst = Buffer.alloc(src.length + 4);
    var offset = 0;
    var isLE = this.isLE;
    var overflow = this.overflow;
    var badChar = this.badChar;

    if (overflow.length > 0) {
        for (; i < src.length && overflow.length < 4; i++)
            overflow.push(src[i]);
        
        if (overflow.length === 4) {
            // NOTE: codepoint is a signed int32 and can be negative.
            // NOTE: We copied this block from below to help V8 optimize it (it works with array, not buffer).
            if (isLE) {
                codepoint = overflow[i] | (overflow[i+1] << 8) | (overflow[i+2] << 16) | (overflow[i+3] << 24);
            } else {
                codepoint = overflow[i+3] | (overflow[i+2] << 8) | (overflow[i+1] << 16) | (overflow[i] << 24);
            }
            overflow.length = 0;

            offset = _writeCodepoint(dst, offset, codepoint, badChar);
        }
    }

    // Main loop. Should be as optimized as possible.
    for (; i < src.length - 3; i += 4) {
        // NOTE: codepoint is a signed int32 and can be negative.
        if (isLE) {
            codepoint = src[i] | (src[i+1] << 8) | (src[i+2] << 16) | (src[i+3] << 24);
        } else {
            codepoint = src[i+3] | (src[i+2] << 8) | (src[i+1] << 16) | (src[i] << 24);
        }
        offset = _writeCodepoint(dst, offset, codepoint, badChar);
    }

    // Keep overflowing bytes.
    for (; i < src.length; i++) {
        overflow.push(src[i]);
    }

    return dst.slice(0, offset).toString('ucs2');
};

function _writeCodepoint(dst, offset, codepoint, badChar) {
    // NOTE: codepoint is signed int32 and can be negative. We keep it that way to help V8 with optimizations.
    if (codepoint < 0 || codepoint > 0x10FFFF) {
        // Not a valid Unicode codepoint
        codepoint = badChar;
    } 

    // Ephemeral Planes: Write high surrogate.
    if (codepoint >= 0x10000) {
        codepoint -= 0x10000;

        var high = 0xD800 | (codepoint >> 10);
        dst[offset++] = high & 0xff;
        dst[offset++] = high >> 8;

        // Low surrogate is written below.
        var codepoint = 0xDC00 | (codepoint & 0x3FF);
    }

    // Write BMP char or low surrogate.
    dst[offset++] = codepoint & 0xff;
    dst[offset++] = codepoint >> 8;

    return offset;
};

Utf32Decoder.prototype.end = function() {
    this.overflow.length = 0;
};

// == UTF-32 Auto codec =============================================================
// Decoder chooses automatically from UTF-32LE and UTF-32BE using BOM and space-based heuristic.
// Defaults to UTF-32LE. http://en.wikipedia.org/wiki/UTF-32
// Encoder/decoder default can be changed: iconv.decode(buf, 'utf32', {defaultEncoding: 'utf-32be'});

// Encoder prepends BOM (which can be overridden with (addBOM: false}).

exports.utf32 = Utf32AutoCodec;
exports.ucs4 = 'utf32';

function Utf32AutoCodec(options, iconv) {
    this.iconv = iconv;
}

Utf32AutoCodec.prototype.encoder = Utf32AutoEncoder;
Utf32AutoCodec.prototype.decoder = Utf32AutoDecoder;

// -- Encoding

function Utf32AutoEncoder(options, codec) {
    options = options || {};

    if (options.addBOM === undefined)
        options.addBOM = true;

    this.encoder = codec.iconv.getEncoder(options.defaultEncoding || 'utf-32le', options);
}

Utf32AutoEncoder.prototype.write = function(str) {
    return this.encoder.write(str);
};

Utf32AutoEncoder.prototype.end = function() {
    return this.encoder.end();
};

// -- Decoding

function Utf32AutoDecoder(options, codec) {
    this.decoder = null;
    this.initialBufs = [];
    this.initialBufsLen = 0;
    this.options = options || {};
    this.iconv = codec.iconv;
}

Utf32AutoDecoder.prototype.write = function(buf) {
    if (!this.decoder) { 
        // Codec is not chosen yet. Accumulate initial bytes.
        this.initialBufs.push(buf);
        this.initialBufsLen += buf.length;

        if (this.initialBufsLen < 32) // We need more bytes to use space heuristic (see below)
            return '';

        // We have enough bytes -> detect endianness.
        var encoding = detectEncoding(this.initialBufs, this.options.defaultEncoding);
        this.decoder = this.iconv.getDecoder(encoding, this.options);

        var resStr = '';
        for (var i = 0; i < this.initialBufs.length; i++)
            resStr += this.decoder.write(this.initialBufs[i]);

        this.initialBufs.length = this.initialBufsLen = 0;
        return resStr;
    }

    return this.decoder.write(buf);
};

Utf32AutoDecoder.prototype.end = function() {
    if (!this.decoder) {
        var encoding = detectEncoding(this.initialBufs, this.options.defaultEncoding);
        this.decoder = this.iconv.getDecoder(encoding, this.options);

        var resStr = '';
        for (var i = 0; i < this.initialBufs.length; i++)
            resStr += this.decoder.write(this.initialBufs[i]);

        var trail = this.decoder.end();
        if (trail)
            resStr += trail;

        this.initialBufs.length = this.initialBufsLen = 0;
        return resStr;
    }

    return this.decoder.end();
};

function detectEncoding(bufs, defaultEncoding) {
    var b = [];
    var charsProcessed = 0;
    var invalidLE = 0, invalidBE = 0;   // Number of invalid chars when decoded as LE or BE.
    var bmpCharsLE = 0, bmpCharsBE = 0; // Number of BMP chars when decoded as LE or BE.

    outer_loop:
    for (var i = 0; i < bufs.length; i++) {
        var buf = bufs[i];
        for (var j = 0; j < buf.length; j++) {
            b.push(buf[j]);
            if (b.length === 4) {
                if (charsProcessed === 0) {
                    // Check BOM first.
                    if (b[0] === 0xFF && b[1] === 0xFE && b[2] === 0 && b[3] === 0) {
                        return 'utf-32le';
                    }
                    if (b[0] === 0 && b[1] === 0 && b[2] === 0xFE && b[3] === 0xFF) {
                        return 'utf-32be';
                    }
                }

                if (b[0] !== 0 || b[1] > 0x10) invalidBE++;
                if (b[3] !== 0 || b[2] > 0x10) invalidLE++;

                if (b[0] === 0 && b[1] === 0 && (b[2] !== 0 || b[3] !== 0)) bmpCharsBE++;
                if ((b[0] !== 0 || b[1] !== 0) && b[2] === 0 && b[3] === 0) bmpCharsLE++;

                b.length = 0;
                charsProcessed++;

                if (charsProcessed >= 100) {
                    break outer_loop;
                }
            }
        }
    }

    // Make decisions.
    if (bmpCharsBE - invalidBE > bmpCharsLE - invalidLE)  return 'utf-32be';
    if (bmpCharsBE - invalidBE < bmpCharsLE - invalidLE)  return 'utf-32le';

    // Couldn't decide (likely all zeros or not enough data).
    return defaultEncoding || 'utf-32le';
}
"use strict";
var Buffer = require("safer-buffer").Buffer;

// UTF-7 codec, according to https://tools.ietf.org/html/rfc2152
// See also below a UTF-7-IMAP codec, according to http://tools.ietf.org/html/rfc3501#section-5.1.3

exports.utf7 = Utf7Codec;
exports.unicode11utf7 = 'utf7'; // Alias UNICODE-1-1-UTF-7
function Utf7Codec(codecOptions, iconv) {
    this.iconv = iconv;
};

Utf7Codec.prototype.encoder = Utf7Encoder;
Utf7Codec.prototype.decoder = Utf7Decoder;
Utf7Codec.prototype.bomAware = true;


// -- Encoding

var nonDirectChars = /[^A-Za-z0-9'\(\),-\.\/:\? \n\r\t]+/g;

function Utf7Encoder(options, codec) {
    this.iconv = codec.iconv;
}

Utf7Encoder.prototype.write = function(str) {
    // Naive implementation.
    // Non-direct chars are encoded as "+<base64>-"; single "+" char is encoded as "+-".
    return Buffer.from(str.replace(nonDirectChars, function(chunk) {
        return "+" + (chunk === '+' ? '' : 
            this.iconv.encode(chunk, 'utf16-be').toString('base64').replace(/=+$/, '')) 
            + "-";
    }.bind(this)));
}

Utf7Encoder.prototype.end = function() {
}


// -- Decoding

function Utf7Decoder(options, codec) {
    this.iconv = codec.iconv;
    this.inBase64 = false;
    this.base64Accum = '';
}

var base64Regex = /[A-Za-z0-9\/+]/;
var base64Chars = [];
for (var i = 0; i < 256; i++)
    base64Chars[i] = base64Regex.test(String.fromCharCode(i));

var plusChar = '+'.charCodeAt(0), 
    minusChar = '-'.charCodeAt(0),
    andChar = '&'.charCodeAt(0);

Utf7Decoder.prototype.write = function(buf) {
    var res = "", lastI = 0,
        inBase64 = this.inBase64,
        base64Accum = this.base64Accum;

    // The decoder is more involved as we must handle chunks in stream.

    for (var i = 0; i < buf.length; i++) {
        if (!inBase64) { // We're in direct mode.
            // Write direct chars until '+'
            if (buf[i] == plusChar) {
                res += this.iconv.decode(buf.slice(lastI, i), "ascii"); // Write direct chars.
                lastI = i+1;
                inBase64 = true;
            }
        } else { // We decode base64.
            if (!base64Chars[buf[i]]) { // Base64 ended.
                if (i == lastI && buf[i] == minusChar) {// "+-" -> "+"
                    res += "+";
                } else {
                    var b64str = base64Accum + this.iconv.decode(buf.slice(lastI, i), "ascii");
                    res += this.iconv.decode(Buffer.from(b64str, 'base64'), "utf16-be");
                }

                if (buf[i] != minusChar) // Minus is absorbed after base64.
                    i--;

                lastI = i+1;
                inBase64 = false;
                base64Accum = '';
            }
        }
    }

    if (!inBase64) {
        res += this.iconv.decode(buf.slice(lastI), "ascii"); // Write direct chars.
    } else {
        var b64str = base64Accum + this.iconv.decode(buf.slice(lastI), "ascii");

        var canBeDecoded = b64str.length - (b64str.length % 8); // Minimal chunk: 2 quads -> 2x3 bytes -> 3 chars.
        base64Accum = b64str.slice(canBeDecoded); // The rest will be decoded in future.
        b64str = b64str.slice(0, canBeDecoded);

        res += this.iconv.decode(Buffer.from(b64str, 'base64'), "utf16-be");
    }

    this.inBase64 = inBase64;
    this.base64Accum = base64Accum;

    return res;
}

Utf7Decoder.prototype.end = function() {
    var res = "";
    if (this.inBase64 && this.base64Accum.length > 0)
        res = this.iconv.decode(Buffer.from(this.base64Accum, 'base64'), "utf16-be");

    this.inBase64 = false;
    this.base64Accum = '';
    return res;
}


// UTF-7-IMAP codec.
// RFC3501 Sec. 5.1.3 Modified UTF-7 (http://tools.ietf.org/html/rfc3501#section-5.1.3)
// Differences:
//  * Base64 part is started by "&" instead of "+"
//  * Direct characters are 0x20-0x7E, except "&" (0x26)
//  * In Base64, "," is used instead of "/"
//  * Base64 must not be used to represent direct characters.
//  * No implicit shift back from Base64 (should always end with '-')
//  * String must end in non-shifted position.
//  * "-&" while in base64 is not allowed.


exports.utf7imap = Utf7IMAPCodec;
function Utf7IMAPCodec(codecOptions, iconv) {
    this.iconv = iconv;
};

Utf7IMAPCodec.prototype.encoder = Utf7IMAPEncoder;
Utf7IMAPCodec.prototype.decoder = Utf7IMAPDecoder;
Utf7IMAPCodec.prototype.bomAware = true;


// -- Encoding

function Utf7IMAPEncoder(options, codec) {
    this.iconv = codec.iconv;
    this.inBase64 = false;
    this.base64Accum = Buffer.alloc(6);
    this.base64AccumIdx = 0;
}

Utf7IMAPEncoder.prototype.write = function(str) {
    var inBase64 = this.inBase64,
        base64Accum = this.base64Accum,
        base64AccumIdx = this.base64AccumIdx,
        buf = Buffer.alloc(str.length*5 + 10), bufIdx = 0;

    for (var i = 0; i < str.length; i++) {
        var uChar = str.charCodeAt(i);
        if (0x20 <= uChar && uChar <= 0x7E) { // Direct character or '&'.
            if (inBase64) {
                if (base64AccumIdx > 0) {
                    bufIdx += buf.write(base64Accum.slice(0, base64AccumIdx).toString('base64').replace(/\//g, ',').replace(/=+$/, ''), bufIdx);
                    base64AccumIdx = 0;
                }

                buf[bufIdx++] = minusChar; // Write '-', then go to direct mode.
                inBase64 = false;
            }

            if (!inBase64) {
                buf[bufIdx++] = uChar; // Write direct character

                if (uChar === andChar)  // Ampersand -> '&-'
                    buf[bufIdx++] = minusChar;
            }

        } else { // Non-direct character
            if (!inBase64) {
                buf[bufIdx++] = andChar; // Write '&', then go to base64 mode.
                inBase64 = true;
            }
            if (inBase64) {
                base64Accum[base64AccumIdx++] = uChar >> 8;
                base64Accum[base64AccumIdx++] = uChar & 0xFF;

                if (base64AccumIdx == base64Accum.length) {
                    bufIdx += buf.write(base64Accum.toString('base64').replace(/\//g, ','), bufIdx);
                    base64AccumIdx = 0;
                }
            }
        }
    }

    this.inBase64 = inBase64;
    this.base64AccumIdx = base64AccumIdx;

    return buf.slice(0, bufIdx);
}

Utf7IMAPEncoder.prototype.end = function() {
    var buf = Buffer.alloc(10), bufIdx = 0;
    if (this.inBase64) {
        if (this.base64AccumIdx > 0) {
            bufIdx += buf.write(this.base64Accum.slice(0, this.base64AccumIdx).toString('base64').replace(/\//g, ',').replace(/=+$/, ''), bufIdx);
            this.base64AccumIdx = 0;
        }

        buf[bufIdx++] = minusChar; // Write '-', then go to direct mode.
        this.inBase64 = false;
    }

    return buf.slice(0, bufIdx);
}


// -- Decoding

function Utf7IMAPDecoder(options, codec) {
    this.iconv = codec.iconv;
    this.inBase64 = false;
    this.base64Accum = '';
}

var base64IMAPChars = base64Chars.slice();
base64IMAPChars[','.charCodeAt(0)] = true;

Utf7IMAPDecoder.prototype.write = function(buf) {
    var res = "", lastI = 0,
        inBase64 = this.inBase64,
        base64Accum = this.base64Accum;

    // The decoder is more involved as we must handle chunks in stream.
    // It is forgiving, closer to standard UTF-7 (for example, '-' is optional at the end).

    for (var i = 0; i < buf.length; i++) {
        if (!inBase64) { // We're in direct mode.
            // Write direct chars until '&'
            if (buf[i] == andChar) {
                res += this.iconv.decode(buf.slice(lastI, i), "ascii"); // Write direct chars.
                lastI = i+1;
                inBase64 = true;
            }
        } else { // We decode base64.
            if (!base64IMAPChars[buf[i]]) { // Base64 ended.
                if (i == lastI && buf[i] == minusChar) { // "&-" -> "&"
                    res += "&";
                } else {
                    var b64str = base64Accum + this.iconv.decode(buf.slice(lastI, i), "ascii").replace(/,/g, '/');
                    res += this.iconv.decode(Buffer.from(b64str, 'base64'), "utf16-be");
                }

                if (buf[i] != minusChar) // Minus may be absorbed after base64.
                    i--;

                lastI = i+1;
                inBase64 = false;
                base64Accum = '';
            }
        }
    }

    if (!inBase64) {
        res += this.iconv.decode(buf.slice(lastI), "ascii"); // Write direct chars.
    } else {
        var b64str = base64Accum + this.iconv.decode(buf.slice(lastI), "ascii").replace(/,/g, '/');

        var canBeDecoded = b64str.length - (b64str.length % 8); // Minimal chunk: 2 quads -> 2x3 bytes -> 3 chars.
        base64Accum = b64str.slice(canBeDecoded); // The rest will be decoded in future.
        b64str = b64str.slice(0, canBeDecoded);

        res += this.iconv.decode(Buffer.from(b64str, 'base64'), "utf16-be");
    }

    this.inBase64 = inBase64;
    this.base64Accum = base64Accum;

    return res;
}

Utf7IMAPDecoder.prototype.end = function() {
    var res = "";
    if (this.inBase64 && this.base64Accum.length > 0)
        res = this.iconv.decode(Buffer.from(this.base64Accum, 'base64'), "utf16-be");

    this.inBase64 = false;
    this.base64Accum = '';
    return res;
}


[
["8740","䏰䰲䘃䖦䕸𧉧䵷䖳𧲱䳢𧳅㮕䜶䝄䱇䱀𤊿𣘗𧍒𦺋𧃒䱗𪍑䝏䗚䲅𧱬䴇䪤䚡𦬣爥𥩔𡩣𣸆𣽡晍囻"],
["8767","綕夝𨮹㷴霴𧯯寛𡵞媤㘥𩺰嫑宷峼杮薓𩥅瑡璝㡵𡵓𣚞𦀡㻬"],
["87a1","𥣞㫵竼龗𤅡𨤍𣇪𠪊𣉞䌊蒄龖鐯䤰蘓墖靊鈘秐稲晠権袝瑌篅枂稬剏遆㓦珄𥶹瓆鿇垳䤯呌䄱𣚎堘穲𧭥讏䚮𦺈䆁𥶙箮𢒼鿈𢓁𢓉𢓌鿉蔄𣖻䂴鿊䓡𪷿拁灮鿋"],
["8840","㇀",4,"𠄌㇅𠃑𠃍㇆㇇𠃋𡿨㇈𠃊㇉㇊㇋㇌𠄎㇍㇎ĀÁǍÀĒÉĚÈŌÓǑÒ࿿Ê̄Ế࿿Ê̌ỀÊāáǎàɑēéěèīíǐìōóǒòūúǔùǖǘǚ"],
["88a1","ǜü࿿ê̄ế࿿ê̌ềêɡ⏚⏛"],
["8940","𪎩𡅅"],
["8943","攊"],
["8946","丽滝鵎釟"],
["894c","𧜵撑会伨侨兖兴农凤务动医华发变团声处备夲头学实実岚庆总斉柾栄桥济炼电纤纬纺织经统缆缷艺苏药视设询车轧轮"],
["89a1","琑糼緍楆竉刧"],
["89ab","醌碸酞肼"],
["89b0","贋胶𠧧"],
["89b5","肟黇䳍鷉鸌䰾𩷶𧀎鸊𪄳㗁"],
["89c1","溚舾甙"],
["89c5","䤑马骏龙禇𨑬𡷊𠗐𢫦两亁亀亇亿仫伷㑌侽㹈倃傈㑽㒓㒥円夅凛凼刅争剹劐匧㗇厩㕑厰㕓参吣㕭㕲㚁咓咣咴咹哐哯唘唣唨㖘唿㖥㖿嗗㗅"],
["8a40","𧶄唥"],
["8a43","𠱂𠴕𥄫喐𢳆㧬𠍁蹆𤶸𩓥䁓𨂾睺𢰸㨴䟕𨅝𦧲𤷪擝𠵼𠾴𠳕𡃴撍蹾𠺖𠰋𠽤𢲩𨉖𤓓"],
["8a64","𠵆𩩍𨃩䟴𤺧𢳂骲㩧𩗴㿭㔆𥋇𩟔𧣈𢵄鵮頕"],
["8a76","䏙𦂥撴哣𢵌𢯊𡁷㧻𡁯"],
["8aa1","𦛚𦜖𧦠擪𥁒𠱃蹨𢆡𨭌𠜱"],
["8aac","䠋𠆩㿺塳𢶍"],
["8ab2","𤗈𠓼𦂗𠽌𠶖啹䂻䎺"],
["8abb","䪴𢩦𡂝膪飵𠶜捹㧾𢝵跀嚡摼㹃"],
["8ac9","𪘁𠸉𢫏𢳉"],
["8ace","𡃈𣧂㦒㨆𨊛㕸𥹉𢃇噒𠼱𢲲𩜠㒼氽𤸻"],
["8adf","𧕴𢺋𢈈𪙛𨳍𠹺𠰴𦠜羓𡃏𢠃𢤹㗻𥇣𠺌𠾍𠺪㾓𠼰𠵇𡅏𠹌"],
["8af6","𠺫𠮩𠵈𡃀𡄽㿹𢚖搲𠾭"],
["8b40","𣏴𧘹𢯎𠵾𠵿𢱑𢱕㨘𠺘𡃇𠼮𪘲𦭐𨳒𨶙𨳊閪哌苄喹"],
["8b55","𩻃鰦骶𧝞𢷮煀腭胬尜𦕲脴㞗卟𨂽醶𠻺𠸏𠹷𠻻㗝𤷫㘉𠳖嚯𢞵𡃉𠸐𠹸𡁸𡅈𨈇𡑕𠹹𤹐𢶤婔𡀝𡀞𡃵𡃶垜𠸑"],
["8ba1","𧚔𨋍𠾵𠹻𥅾㜃𠾶𡆀𥋘𪊽𤧚𡠺𤅷𨉼墙剨㘚𥜽箲孨䠀䬬鼧䧧鰟鮍𥭴𣄽嗻㗲嚉丨夂𡯁屮靑𠂆乛亻㔾尣彑忄㣺扌攵歺氵氺灬爫丬犭𤣩罒礻糹罓𦉪㓁"],
["8bde","𦍋耂肀𦘒𦥑卝衤见𧢲讠贝钅镸长门𨸏韦页风飞饣𩠐鱼鸟黄歯龜丷𠂇阝户钢"],
["8c40","倻淾𩱳龦㷉袏𤅎灷峵䬠𥇍㕙𥴰愢𨨲辧釶熑朙玺𣊁𪄇㲋𡦀䬐磤琂冮𨜏䀉橣𪊺䈣蘏𠩯稪𩥇𨫪靕灍匤𢁾鏴盙𨧣龧矝亣俰傼丯众龨吴綋墒壐𡶶庒庙忂𢜒斋"],
["8ca1","𣏹椙橃𣱣泿"],
["8ca7","爀𤔅玌㻛𤨓嬕璹讃𥲤𥚕窓篬糃繬苸薗龩袐龪躹龫迏蕟駠鈡龬𨶹𡐿䁱䊢娚"],
["8cc9","顨杫䉶圽"],
["8cce","藖𤥻芿𧄍䲁𦵴嵻𦬕𦾾龭龮宖龯曧繛湗秊㶈䓃𣉖𢞖䎚䔶"],
["8ce6","峕𣬚諹屸㴒𣕑嵸龲煗䕘𤃬𡸣䱷㥸㑊𠆤𦱁諌侴𠈹妿腬顖𩣺弻"],
["8d40","𠮟"],
["8d42","𢇁𨥭䄂䚻𩁹㼇龳𪆵䃸㟖䛷𦱆䅼𨚲𧏿䕭㣔𥒚䕡䔛䶉䱻䵶䗪㿈𤬏㙡䓞䒽䇭崾嵈嵖㷼㠏嶤嶹㠠㠸幂庽弥徃㤈㤔㤿㥍惗愽峥㦉憷憹懏㦸戬抐拥挘㧸嚱"],
["8da1","㨃揢揻搇摚㩋擀崕嘡龟㪗斆㪽旿晓㫲暒㬢朖㭂枤栀㭘桊梄㭲㭱㭻椉楃牜楤榟榅㮼槖㯝橥橴橱檂㯬檙㯲檫檵櫔櫶殁毁毪汵沪㳋洂洆洦涁㳯涤涱渕渘温溆𨧀溻滢滚齿滨滩漤漴㵆𣽁澁澾㵪㵵熷岙㶊瀬㶑灐灔灯灿炉𠌥䏁㗱𠻘"],
["8e40","𣻗垾𦻓焾𥟠㙎榢𨯩孴穉𥣡𩓙穥穽𥦬窻窰竂竃燑𦒍䇊竚竝竪䇯咲𥰁笋筕笩𥌎𥳾箢筯莜𥮴𦱿篐萡箒箸𥴠㶭𥱥蒒篺簆簵𥳁籄粃𤢂粦晽𤕸糉糇糦籴糳糵糎"],
["8ea1","繧䔝𦹄絝𦻖璍綉綫焵綳緒𤁗𦀩緤㴓緵𡟹緥𨍭縝𦄡𦅚繮纒䌫鑬縧罀罁罇礶𦋐駡羗𦍑羣𡙡𠁨䕜𣝦䔃𨌺翺𦒉者耈耝耨耯𪂇𦳃耻耼聡𢜔䦉𦘦𣷣𦛨朥肧𨩈脇脚墰𢛶汿𦒘𤾸擧𡒊舘𡡞橓𤩥𤪕䑺舩𠬍𦩒𣵾俹𡓽蓢荢𦬊𤦧𣔰𡝳𣷸芪椛芳䇛"],
["8f40","蕋苐茚𠸖𡞴㛁𣅽𣕚艻苢茘𣺋𦶣𦬅𦮗𣗎㶿茝嗬莅䔋𦶥莬菁菓㑾𦻔橗蕚㒖𦹂𢻯葘𥯤葱㷓䓤檧葊𣲵祘蒨𦮖𦹷𦹃蓞萏莑䒠蒓蓤𥲑䉀𥳀䕃蔴嫲𦺙䔧蕳䔖枿蘖"],
["8fa1","𨘥𨘻藁𧂈蘂𡖂𧃍䕫䕪蘨㙈𡢢号𧎚虾蝱𪃸蟮𢰧螱蟚蠏噡虬桖䘏衅衆𧗠𣶹𧗤衞袜䙛袴袵揁装睷𧜏覇覊覦覩覧覼𨨥觧𧤤𧪽誜瞓釾誐𧩙竩𧬺𣾏䜓𧬸煼謌謟𥐰𥕥謿譌譍誩𤩺讐讛誯𡛟䘕衏貛𧵔𧶏貫㜥𧵓賖𧶘𧶽贒贃𡤐賛灜贑𤳉㻐起"],
["9040","趩𨀂𡀔𤦊㭼𨆼𧄌竧躭躶軃鋔輙輭𨍥𨐒辥錃𪊟𠩐辳䤪𨧞𨔽𣶻廸𣉢迹𪀔𨚼𨔁𢌥㦀𦻗逷𨔼𧪾遡𨕬𨘋邨𨜓郄𨛦邮都酧㫰醩釄粬𨤳𡺉鈎沟鉁鉢𥖹銹𨫆𣲛𨬌𥗛"],
["90a1","𠴱錬鍫𨫡𨯫炏嫃𨫢𨫥䥥鉄𨯬𨰹𨯿鍳鑛躼閅閦鐦閠濶䊹𢙺𨛘𡉼𣸮䧟氜陻隖䅬隣𦻕懚隶磵𨫠隽双䦡𦲸𠉴𦐐𩂯𩃥𤫑𡤕𣌊霱虂霶䨏䔽䖅𤫩灵孁霛靜𩇕靗孊𩇫靟鐥僐𣂷𣂼鞉鞟鞱鞾韀韒韠𥑬韮琜𩐳響韵𩐝𧥺䫑頴頳顋顦㬎𧅵㵑𠘰𤅜"],
["9140","𥜆飊颷飈飇䫿𦴧𡛓喰飡飦飬鍸餹𤨩䭲𩡗𩤅駵騌騻騐驘𥜥㛄𩂱𩯕髠髢𩬅髴䰎鬔鬭𨘀倴鬴𦦨㣃𣁽魐魀𩴾婅𡡣鮎𤉋鰂鯿鰌𩹨鷔𩾷𪆒𪆫𪃡𪄣𪇟鵾鶃𪄴鸎梈"],
["91a1","鷄𢅛𪆓𪈠𡤻𪈳鴹𪂹𪊴麐麕麞麢䴴麪麯𤍤黁㭠㧥㴝伲㞾𨰫鼂鼈䮖鐤𦶢鼗鼖鼹嚟嚊齅馸𩂋韲葿齢齩竜龎爖䮾𤥵𤦻煷𤧸𤍈𤩑玞𨯚𡣺禟𨥾𨸶鍩鏳𨩄鋬鎁鏋𨥬𤒹爗㻫睲穃烐𤑳𤏸煾𡟯炣𡢾𣖙㻇𡢅𥐯𡟸㜢𡛻𡠹㛡𡝴𡣑𥽋㜣𡛀坛𤨥𡏾𡊨"],
["9240","𡏆𡒶蔃𣚦蔃葕𤦔𧅥𣸱𥕜𣻻𧁒䓴𣛮𩦝𦼦柹㜳㰕㷧塬𡤢栐䁗𣜿𤃡𤂋𤄏𦰡哋嚞𦚱嚒𠿟𠮨𠸍鏆𨬓鎜仸儫㠙𤐶亼𠑥𠍿佋侊𥙑婨𠆫𠏋㦙𠌊𠐔㐵伩𠋀𨺳𠉵諚𠈌亘"],
["92a1","働儍侢伃𤨎𣺊佂倮偬傁俌俥偘僼兙兛兝兞湶𣖕𣸹𣺿浲𡢄𣺉冨凃𠗠䓝𠒣𠒒𠒑赺𨪜𠜎剙劤𠡳勡鍮䙺熌𤎌𠰠𤦬𡃤槑𠸝瑹㻞璙琔瑖玘䮎𤪼𤂍叐㖄爏𤃉喴𠍅响𠯆圝鉝雴鍦埝垍坿㘾壋媙𨩆𡛺𡝯𡜐娬妸銏婾嫏娒𥥆𡧳𡡡𤊕㛵洅瑃娡𥺃"],
["9340","媁𨯗𠐓鏠璌𡌃焅䥲鐈𨧻鎽㞠尞岞幞幈𡦖𡥼𣫮廍孏𡤃𡤄㜁𡢠㛝𡛾㛓脪𨩇𡶺𣑲𨦨弌弎𡤧𡞫婫𡜻孄蘔𧗽衠恾𢡠𢘫忛㺸𢖯𢖾𩂈𦽳懀𠀾𠁆𢘛憙憘恵𢲛𢴇𤛔𩅍"],
["93a1","摱𤙥𢭪㨩𢬢𣑐𩣪𢹸挷𪑛撶挱揑𤧣𢵧护𢲡搻敫楲㯴𣂎𣊭𤦉𣊫唍𣋠𡣙𩐿曎𣊉𣆳㫠䆐𥖄𨬢𥖏𡛼𥕛𥐥磮𣄃𡠪𣈴㑤𣈏𣆂𤋉暎𦴤晫䮓昰𧡰𡷫晣𣋒𣋡昞𥡲㣑𣠺𣞼㮙𣞢𣏾瓐㮖枏𤘪梶栞㯄檾㡣𣟕𤒇樳橒櫉欅𡤒攑梘橌㯗橺歗𣿀𣲚鎠鋲𨯪𨫋"],
["9440","銉𨀞𨧜鑧涥漋𤧬浧𣽿㶏渄𤀼娽渊塇洤硂焻𤌚𤉶烱牐犇犔𤞏𤜥兹𤪤𠗫瑺𣻸𣙟𤩊𤤗𥿡㼆㺱𤫟𨰣𣼵悧㻳瓌琼鎇琷䒟𦷪䕑疃㽣𤳙𤴆㽘畕癳𪗆㬙瑨𨫌𤦫𤦎㫻"],
["94a1","㷍𤩎㻿𤧅𤣳釺圲鍂𨫣𡡤僟𥈡𥇧睸𣈲眎眏睻𤚗𣞁㩞𤣰琸璛㺿𤪺𤫇䃈𤪖𦆮錇𥖁砞碍碈磒珐祙𧝁𥛣䄎禛蒖禥樭𣻺稺秴䅮𡛦䄲鈵秱𠵌𤦌𠊙𣶺𡝮㖗啫㕰㚪𠇔𠰍竢婙𢛵𥪯𥪜娍𠉛磰娪𥯆竾䇹籝籭䈑𥮳𥺼𥺦糍𤧹𡞰粎籼粮檲緜縇緓罎𦉡"],
["9540","𦅜𧭈綗𥺂䉪𦭵𠤖柖𠁎𣗏埄𦐒𦏸𤥢翝笧𠠬𥫩𥵃笌𥸎駦虅驣樜𣐿㧢𤧷𦖭騟𦖠蒀𧄧𦳑䓪脷䐂胆脉腂𦞴飃𦩂艢艥𦩑葓𦶧蘐𧈛媆䅿𡡀嬫𡢡嫤𡣘蚠蜨𣶏蠭𧐢娂"],
["95a1","衮佅袇袿裦襥襍𥚃襔𧞅𧞄𨯵𨯙𨮜𨧹㺭蒣䛵䛏㟲訽訜𩑈彍鈫𤊄旔焩烄𡡅鵭貟賩𧷜妚矃姰䍮㛔踪躧𤰉輰轊䋴汘澻𢌡䢛潹溋𡟚鯩㚵𤤯邻邗啱䤆醻鐄𨩋䁢𨫼鐧𨰝𨰻蓥訫閙閧閗閖𨴴瑅㻂𤣿𤩂𤏪㻧𣈥随𨻧𨹦𨹥㻌𤧭𤩸𣿮琒瑫㻼靁𩂰"],
["9640","桇䨝𩂓𥟟靝鍨𨦉𨰦𨬯𦎾銺嬑譩䤼珹𤈛鞛靱餸𠼦巁𨯅𤪲頟𩓚鋶𩗗釥䓀𨭐𤩧𨭤飜𨩅㼀鈪䤥萔餻饍𧬆㷽馛䭯馪驜𨭥𥣈檏騡嫾騯𩣱䮐𩥈馼䮽䮗鍽塲𡌂堢𤦸"],
["96a1","𡓨硄𢜟𣶸棅㵽鑘㤧慐𢞁𢥫愇鱏鱓鱻鰵鰐魿鯏𩸭鮟𪇵𪃾鴡䲮𤄄鸘䲰鴌𪆴𪃭𪃳𩤯鶥蒽𦸒𦿟𦮂藼䔳𦶤𦺄𦷰萠藮𦸀𣟗𦁤秢𣖜𣙀䤭𤧞㵢鏛銾鍈𠊿碹鉷鑍俤㑀遤𥕝砽硔碶硋𡝗𣇉𤥁㚚佲濚濙瀞瀞吔𤆵垻壳垊鴖埗焴㒯𤆬燫𦱀𤾗嬨𡞵𨩉"],
["9740","愌嫎娋䊼𤒈㜬䭻𨧼鎻鎸𡣖𠼝葲𦳀𡐓𤋺𢰦𤏁妔𣶷𦝁綨𦅛𦂤𤦹𤦋𨧺鋥珢㻩璴𨭣𡢟㻡𤪳櫘珳珻㻖𤨾𤪔𡟙𤩦𠎧𡐤𤧥瑈𤤖炥𤥶銄珦鍟𠓾錱𨫎𨨖鎆𨯧𥗕䤵𨪂煫"],
["97a1","𤥃𠳿嚤𠘚𠯫𠲸唂秄𡟺緾𡛂𤩐𡡒䔮鐁㜊𨫀𤦭妰𡢿𡢃𧒄媡㛢𣵛㚰鉟婹𨪁𡡢鍴㳍𠪴䪖㦊僴㵩㵌𡎜煵䋻𨈘渏𩃤䓫浗𧹏灧沯㳖𣿭𣸭渂漌㵯𠏵畑㚼㓈䚀㻚䡱姄鉮䤾轁𨰜𦯀堒埈㛖𡑒烾𤍢𤩱𢿣𡊰𢎽梹楧𡎘𣓥𧯴𣛟𨪃𣟖𣏺𤲟樚𣚭𦲷萾䓟䓎"],
["9840","𦴦𦵑𦲂𦿞漗𧄉茽𡜺菭𦲀𧁓𡟛妉媂𡞳婡婱𡤅𤇼㜭姯𡜼㛇熎鎐暚𤊥婮娫𤊓樫𣻹𧜶𤑛𤋊焝𤉙𨧡侰𦴨峂𤓎𧹍𤎽樌𤉖𡌄炦焳𤏩㶥泟勇𤩏繥姫崯㷳彜𤩝𡟟綤萦"],
["98a1","咅𣫺𣌀𠈔坾𠣕𠘙㿥𡾞𪊶瀃𩅛嵰玏糓𨩙𩐠俈翧狍猐𧫴猸猹𥛶獁獈㺩𧬘遬燵𤣲珡臶㻊県㻑沢国琙琞琟㻢㻰㻴㻺瓓㼎㽓畂畭畲疍㽼痈痜㿀癍㿗癴㿜発𤽜熈嘣覀塩䀝睃䀹条䁅㗛瞘䁪䁯属瞾矋売砘点砜䂨砹硇硑硦葈𥔵礳栃礲䄃"],
["9940","䄉禑禙辻稆込䅧窑䆲窼艹䇄竏竛䇏両筢筬筻簒簛䉠䉺类粜䊌粸䊔糭输烀𠳏総緔緐緽羮羴犟䎗耠耥笹耮耱联㷌垴炠肷胩䏭脌猪脎脒畠脔䐁㬹腖腙腚"],
["99a1","䐓堺腼膄䐥膓䐭膥埯臁臤艔䒏芦艶苊苘苿䒰荗险榊萅烵葤惣蒈䔄蒾蓡蓸蔐蔸蕒䔻蕯蕰藠䕷虲蚒蚲蛯际螋䘆䘗袮裿褤襇覑𧥧訩訸誔誴豑賔賲贜䞘塟跃䟭仮踺嗘坔蹱嗵躰䠷軎転軤軭軲辷迁迊迌逳駄䢭飠鈓䤞鈨鉘鉫銱銮銿"],
["9a40","鋣鋫鋳鋴鋽鍃鎄鎭䥅䥑麿鐗匁鐝鐭鐾䥪鑔鑹锭関䦧间阳䧥枠䨤靀䨵鞲韂噔䫤惨颹䬙飱塄餎餙冴餜餷饂饝饢䭰駅䮝騼鬏窃魩鮁鯝鯱鯴䱭鰠㝯𡯂鵉鰺"],
["9aa1","黾噐鶓鶽鷀鷼银辶鹻麬麱麽黆铜黢黱黸竈齄𠂔𠊷𠎠椚铃妬𠓗塀铁㞹𠗕𠘕𠙶𡚺块煳𠫂𠫍𠮿呪吆𠯋咞𠯻𠰻𠱓𠱥𠱼惧𠲍噺𠲵𠳝𠳭𠵯𠶲𠷈楕鰯螥𠸄𠸎𠻗𠾐𠼭𠹳尠𠾼帋𡁜𡁏𡁶朞𡁻𡂈𡂖㙇𡂿𡃓𡄯𡄻卤蒭𡋣𡍵𡌶讁𡕷𡘙𡟃𡟇乸炻𡠭𡥪"],
["9b40","𡨭𡩅𡰪𡱰𡲬𡻈拃𡻕𡼕熘桕𢁅槩㛈𢉼𢏗𢏺𢜪𢡱𢥏苽𢥧𢦓𢫕覥𢫨辠𢬎鞸𢬿顇骽𢱌"],
["9b62","𢲈𢲷𥯨𢴈𢴒𢶷𢶕𢹂𢽴𢿌𣀳𣁦𣌟𣏞徱晈暿𧩹𣕧𣗳爁𤦺矗𣘚𣜖纇𠍆墵朎"],
["9ba1","椘𣪧𧙗𥿢𣸑𣺹𧗾𢂚䣐䪸𤄙𨪚𤋮𤌍𤀻𤌴𤎖𤩅𠗊凒𠘑妟𡺨㮾𣳿𤐄𤓖垈𤙴㦛𤜯𨗨𩧉㝢𢇃譞𨭎駖𤠒𤣻𤨕爉𤫀𠱸奥𤺥𤾆𠝹軚𥀬劏圿煱𥊙𥐙𣽊𤪧喼𥑆𥑮𦭒釔㑳𥔿𧘲𥕞䜘𥕢𥕦𥟇𤤿𥡝偦㓻𣏌惞𥤃䝼𨥈𥪮𥮉𥰆𡶐垡煑澶𦄂𧰒遖𦆲𤾚譢𦐂𦑊"],
["9c40","嵛𦯷輶𦒄𡤜諪𤧶𦒈𣿯𦔒䯀𦖿𦚵𢜛鑥𥟡憕娧晉侻嚹𤔡𦛼乪𤤴陖涏𦲽㘘襷𦞙𦡮𦐑𦡞營𦣇筂𩃀𠨑𦤦鄄𦤹穅鷰𦧺騦𦨭㙟𦑩𠀡禃𦨴𦭛崬𣔙菏𦮝䛐𦲤画补𦶮墶"],
["9ca1","㜜𢖍𧁋𧇍㱔𧊀𧊅銁𢅺𧊋錰𧋦𤧐氹钟𧑐𠻸蠧裵𢤦𨑳𡞱溸𤨪𡠠㦤㚹尐秣䔿暶𩲭𩢤襃𧟌𧡘囖䃟𡘊㦡𣜯𨃨𡏅熭荦𧧝𩆨婧䲷𧂯𨦫𧧽𧨊𧬋𧵦𤅺筃祾𨀉澵𪋟樃𨌘厢𦸇鎿栶靝𨅯𨀣𦦵𡏭𣈯𨁈嶅𨰰𨂃圕頣𨥉嶫𤦈斾槕叒𤪥𣾁㰑朶𨂐𨃴𨄮𡾡𨅏"],
["9d40","𨆉𨆯𨈚𨌆𨌯𨎊㗊𨑨𨚪䣺揦𨥖砈鉕𨦸䏲𨧧䏟𨧨𨭆𨯔姸𨰉輋𨿅𩃬筑𩄐𩄼㷷𩅞𤫊运犏嚋𩓧𩗩𩖰𩖸𩜲𩣑𩥉𩥪𩧃𩨨𩬎𩵚𩶛纟𩻸𩼣䲤镇𪊓熢𪋿䶑递𪗋䶜𠲜达嗁"],
["9da1","辺𢒰边𤪓䔉繿潖檱仪㓤𨬬𧢝㜺躀𡟵𨀤𨭬𨮙𧨾𦚯㷫𧙕𣲷𥘵𥥖亚𥺁𦉘嚿𠹭踎孭𣺈𤲞揞拐𡟶𡡻攰嘭𥱊吚𥌑㷆𩶘䱽嘢嘞罉𥻘奵𣵀蝰东𠿪𠵉𣚺脗鵞贘瘻鱅癎瞹鍅吲腈苷嘥脲萘肽嗪祢噃吖𠺝㗎嘅嗱曱𨋢㘭甴嗰喺咗啲𠱁𠲖廐𥅈𠹶𢱢"],
["9e40","𠺢麫絚嗞𡁵抝靭咔賍燶酶揼掹揾啩𢭃鱲𢺳冚㓟𠶧冧呍唞唓癦踭𦢊疱肶蠄螆裇膶萜𡃁䓬猄𤜆宐茋𦢓噻𢛴𧴯𤆣𧵳𦻐𧊶酰𡇙鈈𣳼𪚩𠺬𠻹牦𡲢䝎𤿂𧿹𠿫䃺"],
["9ea1","鱝攟𢶠䣳𤟠𩵼𠿬𠸊恢𧖣𠿭"],
["9ead","𦁈𡆇熣纎鵐业丄㕷嬍沲卧㚬㧜卽㚥𤘘墚𤭮舭呋垪𥪕𠥹"],
["9ec5","㩒𢑥獴𩺬䴉鯭𣳾𩼰䱛𤾩𩖞𩿞葜𣶶𧊲𦞳𣜠挮紥𣻷𣸬㨪逈勌㹴㙺䗩𠒎癀嫰𠺶硺𧼮墧䂿噼鮋嵴癔𪐴麅䳡痹㟻愙𣃚𤏲"],
["9ef5","噝𡊩垧𤥣𩸆刴𧂮㖭汊鵼"],
["9f40","籖鬹埞𡝬屓擓𩓐𦌵𧅤蚭𠴨𦴢𤫢𠵱"],
["9f4f","凾𡼏嶎霃𡷑麁遌笟鬂峑箣扨挵髿篏鬪籾鬮籂粆鰕篼鬉鼗鰛𤤾齚啳寃俽麘俲剠㸆勑坧偖妷帒韈鶫轜呩鞴饀鞺匬愰"],
["9fa1","椬叚鰊鴂䰻陁榀傦畆𡝭駚剳"],
["9fae","酙隁酜"],
["9fb2","酑𨺗捿𦴣櫊嘑醎畺抅𠏼獏籰𥰡𣳽"],
["9fc1","𤤙盖鮝个𠳔莾衂"],
["9fc9","届槀僭坺刟巵从氱𠇲伹咜哚劚趂㗾弌㗳"],
["9fdb","歒酼龥鮗頮颴骺麨麄煺笔"],
["9fe7","毺蠘罸"],
["9feb","嘠𪙊蹷齓"],
["9ff0","跔蹏鸜踁抂𨍽踨蹵竓𤩷稾磘泪詧瘇"],
["a040","𨩚鼦泎蟖痃𪊲硓咢贌狢獱謭猂瓱賫𤪻蘯徺袠䒷"],
["a055","𡠻𦸅"],
["a058","詾𢔛"],
["a05b","惽癧髗鵄鍮鮏蟵"],
["a063","蠏賷猬霡鮰㗖犲䰇籑饊𦅙慙䰄麖慽"],
["a073","坟慯抦戹拎㩜懢厪𣏵捤栂㗒"],
["a0a1","嵗𨯂迚𨸹"],
["a0a6","僙𡵆礆匲阸𠼻䁥"],
["a0ae","矾"],
["a0b0","糂𥼚糚稭聦聣絍甅瓲覔舚朌聢𧒆聛瓰脃眤覉𦟌畓𦻑螩蟎臈螌詉貭譃眫瓸蓚㘵榲趦"],
["a0d4","覩瑨涹蟁𤀑瓧㷛煶悤憜㳑煢恷"],
["a0e2","罱𨬭牐惩䭾删㰘𣳇𥻗𧙖𥔱𡥄𡋾𩤃𦷜𧂭峁𦆭𨨏𣙷𠃮𦡆𤼎䕢嬟𦍌齐麦𦉫"],
["a3c0","␀",31,"␡"],
["c6a1","①",9,"⑴",9,"ⅰ",9,"丶丿亅亠冂冖冫勹匸卩厶夊宀巛⼳广廴彐彡攴无疒癶辵隶¨ˆヽヾゝゞ〃仝々〆〇ー［］✽ぁ",23],
["c740","す",58,"ァアィイ"],
["c7a1","ゥ",81,"А",5,"ЁЖ",4],
["c840","Л",26,"ёж",25,"⇧↸↹㇏𠃌乚𠂊刂䒑"],
["c8a1","龰冈龱𧘇"],
["c8cd","￢￤＇＂㈱№℡゛゜⺀⺄⺆⺇⺈⺊⺌⺍⺕⺜⺝⺥⺧⺪⺬⺮⺶⺼⺾⻆⻊⻌⻍⻏⻖⻗⻞⻣"],
["c8f5","ʃɐɛɔɵœøŋʊɪ"],
["f9fe","￭"],
["fa40","𠕇鋛𠗟𣿅蕌䊵珯况㙉𤥂𨧤鍄𡧛苮𣳈砼杄拟𤤳𨦪𠊠𦮳𡌅侫𢓭倈𦴩𧪄𣘀𤪱𢔓倩𠍾徤𠎀𠍇滛𠐟偽儁㑺儎顬㝃萖𤦤𠒇兠𣎴兪𠯿𢃼𠋥𢔰𠖎𣈳𡦃宂蝽𠖳𣲙冲冸"],
["faa1","鴴凉减凑㳜凓𤪦决凢卂凭菍椾𣜭彻刋刦刼劵剗劔効勅簕蕂勠蘍𦬓包𨫞啉滙𣾀𠥔𣿬匳卄𠯢泋𡜦栛珕恊㺪㣌𡛨燝䒢卭却𨚫卾卿𡖖𡘓矦厓𨪛厠厫厮玧𥝲㽙玜叁叅汉义埾叙㪫𠮏叠𣿫𢶣叶𠱷吓灹唫晗浛呭𦭓𠵴啝咏咤䞦𡜍𠻝㶴𠵍"],
["fb40","𨦼𢚘啇䳭启琗喆喩嘅𡣗𤀺䕒𤐵暳𡂴嘷曍𣊊暤暭噍噏磱囱鞇叾圀囯园𨭦㘣𡉏坆𤆥汮炋坂㚱𦱾埦𡐖堃𡑔𤍣堦𤯵塜墪㕡壠壜𡈼壻寿坃𪅐𤉸鏓㖡够梦㛃湙"],
["fba1","𡘾娤啓𡚒蔅姉𠵎𦲁𦴪𡟜姙𡟻𡞲𦶦浱𡠨𡛕姹𦹅媫婣㛦𤦩婷㜈媖瑥嫓𦾡𢕔㶅𡤑㜲𡚸広勐孶斈孼𧨎䀄䡝𠈄寕慠𡨴𥧌𠖥寳宝䴐尅𡭄尓珎尔𡲥𦬨屉䣝岅峩峯嶋𡷹𡸷崐崘嵆𡺤岺巗苼㠭𤤁𢁉𢅳芇㠶㯂帮檊幵幺𤒼𠳓厦亷廐厨𡝱帉廴𨒂"],
["fc40","廹廻㢠廼栾鐛弍𠇁弢㫞䢮𡌺强𦢈𢏐彘𢑱彣鞽𦹮彲鍀𨨶徧嶶㵟𥉐𡽪𧃸𢙨釖𠊞𨨩怱暅𡡷㥣㷇㘹垐𢞴祱㹀悞悤悳𤦂𤦏𧩓璤僡媠慤萤慂慈𦻒憁凴𠙖憇宪𣾷"],
["fca1","𢡟懓𨮝𩥝懐㤲𢦀𢣁怣慜攞掋𠄘担𡝰拕𢸍捬𤧟㨗搸揸𡎎𡟼撐澊𢸶頔𤂌𥜝擡擥鑻㩦携㩗敍漖𤨨𤨣斅敭敟𣁾斵𤥀䬷旑䃘𡠩无旣忟𣐀昘𣇷𣇸晄𣆤𣆥晋𠹵晧𥇦晳晴𡸽𣈱𨗴𣇈𥌓矅𢣷馤朂𤎜𤨡㬫槺𣟂杞杧杢𤇍𩃭柗䓩栢湐鈼栁𣏦𦶠桝"],
["fd40","𣑯槡樋𨫟楳棃𣗍椁椀㴲㨁𣘼㮀枬楡𨩊䋼椶榘㮡𠏉荣傐槹𣙙𢄪橅𣜃檝㯳枱櫈𩆜㰍欝𠤣惞欵歴𢟍溵𣫛𠎵𡥘㝀吡𣭚毡𣻼毜氷𢒋𤣱𦭑汚舦汹𣶼䓅𣶽𤆤𤤌𤤀"],
["fda1","𣳉㛥㳫𠴲鮃𣇹𢒑羏样𦴥𦶡𦷫涖浜湼漄𤥿𤂅𦹲蔳𦽴凇沜渝萮𨬡港𣸯瑓𣾂秌湏媑𣁋濸㜍澝𣸰滺𡒗𤀽䕕鏰潄潜㵎潴𩅰㴻澟𤅄濓𤂑𤅕𤀹𣿰𣾴𤄿凟𤅖𤅗𤅀𦇝灋灾炧炁烌烕烖烟䄄㷨熴熖𤉷焫煅媈煊煮岜𤍥煏鍢𤋁焬𤑚𤨧𤨢熺𨯨炽爎"],
["fe40","鑂爕夑鑃爤鍁𥘅爮牀𤥴梽牕牗㹕𣁄栍漽犂猪猫𤠣𨠫䣭𨠄猨献珏玪𠰺𦨮珉瑉𤇢𡛧𤨤昣㛅𤦷𤦍𤧻珷琕椃𤨦琹𠗃㻗瑜𢢭瑠𨺲瑇珤瑶莹瑬㜰瑴鏱樬璂䥓𤪌"],
["fea1","𤅟𤩹𨮏孆𨰃𡢞瓈𡦈甎瓩甞𨻙𡩋寗𨺬鎅畍畊畧畮𤾂㼄𤴓疎瑝疞疴瘂瘬癑癏癯癶𦏵皐臯㟸𦤑𦤎皡皥皷盌𦾟葢𥂝𥅽𡸜眞眦着撯𥈠睘𣊬瞯𨥤𨥨𡛁矴砉𡍶𤨒棊碯磇磓隥礮𥗠磗礴碱𧘌辸袄𨬫𦂃𢘜禆褀椂禀𥡗禝𧬹礼禩渪𧄦㺨秆𩄍秔"]
]
[
["0","\u0000",127,"€"],
["8140","丂丄丅丆丏丒丗丟丠両丣並丩丮丯丱丳丵丷丼乀乁乂乄乆乊乑乕乗乚乛乢乣乤乥乧乨乪",5,"乲乴",9,"乿",6,"亇亊"],
["8180","亐亖亗亙亜亝亞亣亪亯亰亱亴亶亷亸亹亼亽亾仈仌仏仐仒仚仛仜仠仢仦仧仩仭仮仯仱仴仸仹仺仼仾伀伂",6,"伋伌伒",4,"伜伝伡伣伨伩伬伭伮伱伳伵伷伹伻伾",4,"佄佅佇",5,"佒佔佖佡佢佦佨佪佫佭佮佱佲併佷佸佹佺佽侀侁侂侅來侇侊侌侎侐侒侓侕侖侘侙侚侜侞侟価侢"],
["8240","侤侫侭侰",4,"侶",8,"俀俁係俆俇俈俉俋俌俍俒",4,"俙俛俠俢俤俥俧俫俬俰俲俴俵俶俷俹俻俼俽俿",11],
["8280","個倎倐們倓倕倖倗倛倝倞倠倢倣値倧倫倯",10,"倻倽倿偀偁偂偄偅偆偉偊偋偍偐",4,"偖偗偘偙偛偝",7,"偦",5,"偭",8,"偸偹偺偼偽傁傂傃傄傆傇傉傊傋傌傎",20,"傤傦傪傫傭",4,"傳",6,"傼"],
["8340","傽",17,"僐",5,"僗僘僙僛",10,"僨僩僪僫僯僰僱僲僴僶",4,"僼",9,"儈"],
["8380","儉儊儌",5,"儓",13,"儢",28,"兂兇兊兌兎兏児兒兓兗兘兙兛兝",4,"兣兤兦內兩兪兯兲兺兾兿冃冄円冇冊冋冎冏冐冑冓冔冘冚冝冞冟冡冣冦",4,"冭冮冴冸冹冺冾冿凁凂凃凅凈凊凍凎凐凒",5],
["8440","凘凙凚凜凞凟凢凣凥",5,"凬凮凱凲凴凷凾刄刅刉刋刌刏刐刓刔刕刜刞刟刡刢刣別刦刧刪刬刯刱刲刴刵刼刾剄",5,"剋剎剏剒剓剕剗剘"],
["8480","剙剚剛剝剟剠剢剣剤剦剨剫剬剭剮剰剱剳",9,"剾劀劃",4,"劉",6,"劑劒劔",6,"劜劤劥劦劧劮劯劰労",9,"勀勁勂勄勅勆勈勊勌勍勎勏勑勓勔動勗務",5,"勠勡勢勣勥",10,"勱",7,"勻勼勽匁匂匃匄匇匉匊匋匌匎"],
["8540","匑匒匓匔匘匛匜匞匟匢匤匥匧匨匩匫匬匭匯",9,"匼匽區卂卄卆卋卌卍卐協単卙卛卝卥卨卪卬卭卲卶卹卻卼卽卾厀厁厃厇厈厊厎厏"],
["8580","厐",4,"厖厗厙厛厜厞厠厡厤厧厪厫厬厭厯",6,"厷厸厹厺厼厽厾叀參",4,"収叏叐叒叓叕叚叜叝叞叡叢叧叴叺叾叿吀吂吅吇吋吔吘吙吚吜吢吤吥吪吰吳吶吷吺吽吿呁呂呄呅呇呉呌呍呎呏呑呚呝",4,"呣呥呧呩",7,"呴呹呺呾呿咁咃咅咇咈咉咊咍咑咓咗咘咜咞咟咠咡"],
["8640","咢咥咮咰咲咵咶咷咹咺咼咾哃哅哊哋哖哘哛哠",4,"哫哬哯哰哱哴",5,"哻哾唀唂唃唄唅唈唊",4,"唒唓唕",5,"唜唝唞唟唡唥唦"],
["8680","唨唩唫唭唲唴唵唶唸唹唺唻唽啀啂啅啇啈啋",4,"啑啒啓啔啗",4,"啝啞啟啠啢啣啨啩啫啯",5,"啹啺啽啿喅喆喌喍喎喐喒喓喕喖喗喚喛喞喠",6,"喨",8,"喲喴営喸喺喼喿",4,"嗆嗇嗈嗊嗋嗎嗏嗐嗕嗗",4,"嗞嗠嗢嗧嗩嗭嗮嗰嗱嗴嗶嗸",4,"嗿嘂嘃嘄嘅"],
["8740","嘆嘇嘊嘋嘍嘐",7,"嘙嘚嘜嘝嘠嘡嘢嘥嘦嘨嘩嘪嘫嘮嘯嘰嘳嘵嘷嘸嘺嘼嘽嘾噀",11,"噏",4,"噕噖噚噛噝",4],
["8780","噣噥噦噧噭噮噯噰噲噳噴噵噷噸噹噺噽",7,"嚇",6,"嚐嚑嚒嚔",14,"嚤",10,"嚰",6,"嚸嚹嚺嚻嚽",12,"囋",8,"囕囖囘囙囜団囥",5,"囬囮囯囲図囶囷囸囻囼圀圁圂圅圇國",6],
["8840","園",9,"圝圞圠圡圢圤圥圦圧圫圱圲圴",4,"圼圽圿坁坃坄坅坆坈坉坋坒",4,"坘坙坢坣坥坧坬坮坰坱坲坴坵坸坹坺坽坾坿垀"],
["8880","垁垇垈垉垊垍",4,"垔",6,"垜垝垞垟垥垨垪垬垯垰垱垳垵垶垷垹",8,"埄",6,"埌埍埐埑埓埖埗埛埜埞埡埢埣埥",7,"埮埰埱埲埳埵埶執埻埼埾埿堁堃堄堅堈堉堊堌堎堏堐堒堓堔堖堗堘堚堛堜堝堟堢堣堥",4,"堫",4,"報堲堳場堶",7],
["8940","堾",5,"塅",6,"塎塏塐塒塓塕塖塗塙",4,"塟",5,"塦",4,"塭",16,"塿墂墄墆墇墈墊墋墌"],
["8980","墍",4,"墔",4,"墛墜墝墠",7,"墪",17,"墽墾墿壀壂壃壄壆",10,"壒壓壔壖",13,"壥",5,"壭壯壱売壴壵壷壸壺",7,"夃夅夆夈",4,"夎夐夑夒夓夗夘夛夝夞夠夡夢夣夦夨夬夰夲夳夵夶夻"],
["8a40","夽夾夿奀奃奅奆奊奌奍奐奒奓奙奛",4,"奡奣奤奦",12,"奵奷奺奻奼奾奿妀妅妉妋妌妎妏妐妑妔妕妘妚妛妜妝妟妠妡妢妦"],
["8a80","妧妬妭妰妱妳",5,"妺妼妽妿",6,"姇姈姉姌姍姎姏姕姖姙姛姞",4,"姤姦姧姩姪姫姭",11,"姺姼姽姾娀娂娊娋娍娎娏娐娒娔娕娖娗娙娚娛娝娞娡娢娤娦娧娨娪",6,"娳娵娷",4,"娽娾娿婁",4,"婇婈婋",9,"婖婗婘婙婛",5],
["8b40","婡婣婤婥婦婨婩婫",8,"婸婹婻婼婽婾媀",17,"媓",6,"媜",13,"媫媬"],
["8b80","媭",4,"媴媶媷媹",4,"媿嫀嫃",5,"嫊嫋嫍",4,"嫓嫕嫗嫙嫚嫛嫝嫞嫟嫢嫤嫥嫧嫨嫪嫬",4,"嫲",22,"嬊",11,"嬘",25,"嬳嬵嬶嬸",7,"孁",6],
["8c40","孈",7,"孒孖孞孠孡孧孨孫孭孮孯孲孴孶孷學孹孻孼孾孿宂宆宊宍宎宐宑宒宔宖実宧宨宩宬宭宮宯宱宲宷宺宻宼寀寁寃寈寉寊寋寍寎寏"],
["8c80","寑寔",8,"寠寢寣實寧審",4,"寯寱",6,"寽対尀専尃尅將專尋尌對導尐尒尓尗尙尛尞尟尠尡尣尦尨尩尪尫尭尮尯尰尲尳尵尶尷屃屄屆屇屌屍屒屓屔屖屗屘屚屛屜屝屟屢層屧",6,"屰屲",6,"屻屼屽屾岀岃",4,"岉岊岋岎岏岒岓岕岝",4,"岤",4],
["8d40","岪岮岯岰岲岴岶岹岺岻岼岾峀峂峃峅",5,"峌",5,"峓",5,"峚",6,"峢峣峧峩峫峬峮峯峱",9,"峼",4],
["8d80","崁崄崅崈",5,"崏",4,"崕崗崘崙崚崜崝崟",4,"崥崨崪崫崬崯",4,"崵",7,"崿",7,"嵈嵉嵍",10,"嵙嵚嵜嵞",10,"嵪嵭嵮嵰嵱嵲嵳嵵",12,"嶃",21,"嶚嶛嶜嶞嶟嶠"],
["8e40","嶡",21,"嶸",12,"巆",6,"巎",12,"巜巟巠巣巤巪巬巭"],
["8e80","巰巵巶巸",4,"巿帀帄帇帉帊帋帍帎帒帓帗帞",7,"帨",4,"帯帰帲",4,"帹帺帾帿幀幁幃幆",5,"幍",6,"幖",4,"幜幝幟幠幣",14,"幵幷幹幾庁庂広庅庈庉庌庍庎庒庘庛庝庡庢庣庤庨",4,"庮",4,"庴庺庻庼庽庿",6],
["8f40","廆廇廈廋",5,"廔廕廗廘廙廚廜",11,"廩廫",8,"廵廸廹廻廼廽弅弆弇弉弌弍弎弐弒弔弖弙弚弜弝弞弡弢弣弤"],
["8f80","弨弫弬弮弰弲",6,"弻弽弾弿彁",14,"彑彔彙彚彛彜彞彟彠彣彥彧彨彫彮彯彲彴彵彶彸彺彽彾彿徃徆徍徎徏徑従徔徖徚徛徝從徟徠徢",5,"復徫徬徯",5,"徶徸徹徺徻徾",4,"忇忈忊忋忎忓忔忕忚忛応忞忟忢忣忥忦忨忩忬忯忰忲忳忴忶忷忹忺忼怇"],
["9040","怈怉怋怌怐怑怓怗怘怚怞怟怢怣怤怬怭怮怰",4,"怶",4,"怽怾恀恄",6,"恌恎恏恑恓恔恖恗恘恛恜恞恟恠恡恥恦恮恱恲恴恵恷恾悀"],
["9080","悁悂悅悆悇悈悊悋悎悏悐悑悓悕悗悘悙悜悞悡悢悤悥悧悩悪悮悰悳悵悶悷悹悺悽",7,"惇惈惉惌",4,"惒惓惔惖惗惙惛惞惡",4,"惪惱惲惵惷惸惻",4,"愂愃愄愅愇愊愋愌愐",4,"愖愗愘愙愛愜愝愞愡愢愥愨愩愪愬",18,"慀",6],
["9140","慇慉態慍慏慐慒慓慔慖",6,"慞慟慠慡慣慤慥慦慩",6,"慱慲慳慴慶慸",18,"憌憍憏",4,"憕"],
["9180","憖",6,"憞",8,"憪憫憭",9,"憸",5,"憿懀懁懃",4,"應懌",4,"懓懕",16,"懧",13,"懶",8,"戀",5,"戇戉戓戔戙戜戝戞戠戣戦戧戨戩戫戭戯戰戱戲戵戶戸",4,"扂扄扅扆扊"],
["9240","扏扐払扖扗扙扚扜",6,"扤扥扨扱扲扴扵扷扸扺扻扽抁抂抃抅抆抇抈抋",5,"抔抙抜抝択抣抦抧抩抪抭抮抯抰抲抳抴抶抷抸抺抾拀拁"],
["9280","拃拋拏拑拕拝拞拠拡拤拪拫拰拲拵拸拹拺拻挀挃挄挅挆挊挋挌挍挏挐挒挓挔挕挗挘挙挜挦挧挩挬挭挮挰挱挳",5,"挻挼挾挿捀捁捄捇捈捊捑捒捓捔捖",7,"捠捤捥捦捨捪捫捬捯捰捲捳捴捵捸捹捼捽捾捿掁掃掄掅掆掋掍掑掓掔掕掗掙",6,"採掤掦掫掯掱掲掵掶掹掻掽掿揀"],
["9340","揁揂揃揅揇揈揊揋揌揑揓揔揕揗",6,"揟揢揤",4,"揫揬揮揯揰揱揳揵揷揹揺揻揼揾搃搄搆",4,"損搎搑搒搕",5,"搝搟搢搣搤"],
["9380","搥搧搨搩搫搮",5,"搵",4,"搻搼搾摀摂摃摉摋",6,"摓摕摖摗摙",4,"摟",7,"摨摪摫摬摮",9,"摻",6,"撃撆撈",8,"撓撔撗撘撚撛撜撝撟",4,"撥撦撧撨撪撫撯撱撲撳撴撶撹撻撽撾撿擁擃擄擆",6,"擏擑擓擔擕擖擙據"],
["9440","擛擜擝擟擠擡擣擥擧",24,"攁",7,"攊",7,"攓",4,"攙",8],
["9480","攢攣攤攦",4,"攬攭攰攱攲攳攷攺攼攽敀",4,"敆敇敊敋敍敎敐敒敓敔敗敘敚敜敟敠敡敤敥敧敨敩敪敭敮敯敱敳敵敶數",14,"斈斉斊斍斎斏斒斔斕斖斘斚斝斞斠斢斣斦斨斪斬斮斱",7,"斺斻斾斿旀旂旇旈旉旊旍旐旑旓旔旕旘",7,"旡旣旤旪旫"],
["9540","旲旳旴旵旸旹旻",4,"昁昄昅昇昈昉昋昍昐昑昒昖昗昘昚昛昜昞昡昢昣昤昦昩昪昫昬昮昰昲昳昷",4,"昽昿晀時晄",6,"晍晎晐晑晘"],
["9580","晙晛晜晝晞晠晢晣晥晧晩",4,"晱晲晳晵晸晹晻晼晽晿暀暁暃暅暆暈暉暊暋暍暎暏暐暒暓暔暕暘",4,"暞",8,"暩",4,"暯",4,"暵暶暷暸暺暻暼暽暿",25,"曚曞",7,"曧曨曪",5,"曱曵曶書曺曻曽朁朂會"],
["9640","朄朅朆朇朌朎朏朑朒朓朖朘朙朚朜朞朠",5,"朧朩朮朰朲朳朶朷朸朹朻朼朾朿杁杄杅杇杊杋杍杒杔杕杗",4,"杝杢杣杤杦杧杫杬杮東杴杶"],
["9680","杸杹杺杻杽枀枂枃枅枆枈枊枌枍枎枏枑枒枓枔枖枙枛枟枠枡枤枦枩枬枮枱枲枴枹",7,"柂柅",9,"柕柖柗柛柟柡柣柤柦柧柨柪柫柭柮柲柵",7,"柾栁栂栃栄栆栍栐栒栔栕栘",4,"栞栟栠栢",6,"栫",6,"栴栵栶栺栻栿桇桋桍桏桒桖",5],
["9740","桜桝桞桟桪桬",7,"桵桸",8,"梂梄梇",7,"梐梑梒梔梕梖梘",9,"梣梤梥梩梪梫梬梮梱梲梴梶梷梸"],
["9780","梹",6,"棁棃",5,"棊棌棎棏棐棑棓棔棖棗棙棛",4,"棡棢棤",9,"棯棲棳棴棶棷棸棻棽棾棿椀椂椃椄椆",4,"椌椏椑椓",11,"椡椢椣椥",7,"椮椯椱椲椳椵椶椷椸椺椻椼椾楀楁楃",16,"楕楖楘楙楛楜楟"],
["9840","楡楢楤楥楧楨楩楪楬業楯楰楲",4,"楺楻楽楾楿榁榃榅榊榋榌榎",5,"榖榗榙榚榝",9,"榩榪榬榮榯榰榲榳榵榶榸榹榺榼榽"],
["9880","榾榿槀槂",7,"構槍槏槑槒槓槕",5,"槜槝槞槡",11,"槮槯槰槱槳",9,"槾樀",9,"樋",11,"標",5,"樠樢",5,"権樫樬樭樮樰樲樳樴樶",6,"樿",4,"橅橆橈",7,"橑",6,"橚"],
["9940","橜",4,"橢橣橤橦",10,"橲",6,"橺橻橽橾橿檁檂檃檅",8,"檏檒",4,"檘",7,"檡",5],
["9980","檧檨檪檭",114,"欥欦欨",6],
["9a40","欯欰欱欳欴欵欶欸欻欼欽欿歀歁歂歄歅歈歊歋歍",11,"歚",7,"歨歩歫",13,"歺歽歾歿殀殅殈"],
["9a80","殌殎殏殐殑殔殕殗殘殙殜",4,"殢",7,"殫",7,"殶殸",6,"毀毃毄毆",4,"毌毎毐毑毘毚毜",4,"毢",7,"毬毭毮毰毱毲毴毶毷毸毺毻毼毾",6,"氈",4,"氎氒気氜氝氞氠氣氥氫氬氭氱氳氶氷氹氺氻氼氾氿汃汄汅汈汋",4,"汑汒汓汖汘"],
["9b40","汙汚汢汣汥汦汧汫",4,"汱汳汵汷汸決汻汼汿沀沄沇沊沋沍沎沑沒沕沖沗沘沚沜沝沞沠沢沨沬沯沰沴沵沶沷沺泀況泂泃泆泇泈泋泍泎泏泑泒泘"],
["9b80","泙泚泜泝泟泤泦泧泩泬泭泲泴泹泿洀洂洃洅洆洈洉洊洍洏洐洑洓洔洕洖洘洜洝洟",5,"洦洨洩洬洭洯洰洴洶洷洸洺洿浀浂浄浉浌浐浕浖浗浘浛浝浟浡浢浤浥浧浨浫浬浭浰浱浲浳浵浶浹浺浻浽",4,"涃涄涆涇涊涋涍涏涐涒涖",4,"涜涢涥涬涭涰涱涳涴涶涷涹",5,"淁淂淃淈淉淊"],
["9c40","淍淎淏淐淒淓淔淕淗淚淛淜淟淢淣淥淧淨淩淪淭淯淰淲淴淵淶淸淺淽",7,"渆渇済渉渋渏渒渓渕渘渙減渜渞渟渢渦渧渨渪測渮渰渱渳渵"],
["9c80","渶渷渹渻",7,"湅",7,"湏湐湑湒湕湗湙湚湜湝湞湠",10,"湬湭湯",14,"満溁溂溄溇溈溊",4,"溑",6,"溙溚溛溝溞溠溡溣溤溦溨溩溫溬溭溮溰溳溵溸溹溼溾溿滀滃滄滅滆滈滉滊滌滍滎滐滒滖滘滙滛滜滝滣滧滪",5],
["9d40","滰滱滲滳滵滶滷滸滺",7,"漃漄漅漇漈漊",4,"漐漑漒漖",9,"漡漢漣漥漦漧漨漬漮漰漲漴漵漷",6,"漿潀潁潂"],
["9d80","潃潄潅潈潉潊潌潎",9,"潙潚潛潝潟潠潡潣潤潥潧",5,"潯潰潱潳潵潶潷潹潻潽",6,"澅澆澇澊澋澏",12,"澝澞澟澠澢",4,"澨",10,"澴澵澷澸澺",5,"濁濃",5,"濊",6,"濓",10,"濟濢濣濤濥"],
["9e40","濦",7,"濰",32,"瀒",7,"瀜",6,"瀤",6],
["9e80","瀫",9,"瀶瀷瀸瀺",17,"灍灎灐",13,"灟",11,"灮灱灲灳灴灷灹灺灻災炁炂炃炄炆炇炈炋炌炍炏炐炑炓炗炘炚炛炞",12,"炰炲炴炵炶為炾炿烄烅烆烇烉烋",12,"烚"],
["9f40","烜烝烞烠烡烢烣烥烪烮烰",6,"烸烺烻烼烾",10,"焋",4,"焑焒焔焗焛",10,"焧",7,"焲焳焴"],
["9f80","焵焷",13,"煆煇煈煉煋煍煏",12,"煝煟",4,"煥煩",4,"煯煰煱煴煵煶煷煹煻煼煾",5,"熅",4,"熋熌熍熎熐熑熒熓熕熖熗熚",4,"熡",6,"熩熪熫熭",5,"熴熶熷熸熺",8,"燄",9,"燏",4],
["a040","燖",9,"燡燢燣燤燦燨",5,"燯",9,"燺",11,"爇",19],
["a080","爛爜爞",9,"爩爫爭爮爯爲爳爴爺爼爾牀",6,"牉牊牋牎牏牐牑牓牔牕牗牘牚牜牞牠牣牤牥牨牪牫牬牭牰牱牳牴牶牷牸牻牼牽犂犃犅",4,"犌犎犐犑犓",11,"犠",11,"犮犱犲犳犵犺",6,"狅狆狇狉狊狋狌狏狑狓狔狕狖狘狚狛"],
["a1a1","　、。·ˉˇ¨〃々—～‖…‘’“”〔〕〈",7,"〖〗【】±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴♂♀°′″℃＄¤￠￡‰§№☆★○●◎◇◆□■△▲※→←↑↓〓"],
["a2a1","ⅰ",9],
["a2b1","⒈",19,"⑴",19,"①",9],
["a2e5","㈠",9],
["a2f1","Ⅰ",11],
["a3a1","！＂＃￥％",88,"￣"],
["a4a1","ぁ",82],
["a5a1","ァ",85],
["a6a1","Α",16,"Σ",6],
["a6c1","α",16,"σ",6],
["a6e0","︵︶︹︺︿﹀︽︾﹁﹂﹃﹄"],
["a6ee","︻︼︷︸︱"],
["a6f4","︳︴"],
["a7a1","А",5,"ЁЖ",25],
["a7d1","а",5,"ёж",25],
["a840","ˊˋ˙–―‥‵℅℉↖↗↘↙∕∟∣≒≦≧⊿═",35,"▁",6],
["a880","█",7,"▓▔▕▼▽◢◣◤◥☉⊕〒〝〞"],
["a8a1","āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüêɑ"],
["a8bd","ńň"],
["a8c0","ɡ"],
["a8c5","ㄅ",36],
["a940","〡",8,"㊣㎎㎏㎜㎝㎞㎡㏄㏎㏑㏒㏕︰￢￤"],
["a959","℡㈱"],
["a95c","‐"],
["a960","ー゛゜ヽヾ〆ゝゞ﹉",9,"﹔﹕﹖﹗﹙",8],
["a980","﹢",4,"﹨﹩﹪﹫"],
["a996","〇"],
["a9a4","─",75],
["aa40","狜狝狟狢",5,"狪狫狵狶狹狽狾狿猀猂猄",5,"猋猌猍猏猐猑猒猔猘猙猚猟猠猣猤猦猧猨猭猯猰猲猳猵猶猺猻猼猽獀",8],
["aa80","獉獊獋獌獎獏獑獓獔獕獖獘",7,"獡",10,"獮獰獱"],
["ab40","獲",11,"獿",4,"玅玆玈玊玌玍玏玐玒玓玔玕玗玘玙玚玜玝玞玠玡玣",5,"玪玬玭玱玴玵玶玸玹玼玽玾玿珁珃",4],
["ab80","珋珌珎珒",6,"珚珛珜珝珟珡珢珣珤珦珨珪珫珬珮珯珰珱珳",4],
["ac40","珸",10,"琄琇琈琋琌琍琎琑",8,"琜",5,"琣琤琧琩琫琭琯琱琲琷",4,"琽琾琿瑀瑂",11],
["ac80","瑎",6,"瑖瑘瑝瑠",12,"瑮瑯瑱",4,"瑸瑹瑺"],
["ad40","瑻瑼瑽瑿璂璄璅璆璈璉璊璌璍璏璑",10,"璝璟",7,"璪",15,"璻",12],
["ad80","瓈",9,"瓓",8,"瓝瓟瓡瓥瓧",6,"瓰瓱瓲"],
["ae40","瓳瓵瓸",6,"甀甁甂甃甅",7,"甎甐甒甔甕甖甗甛甝甞甠",4,"甦甧甪甮甴甶甹甼甽甿畁畂畃畄畆畇畉畊畍畐畑畒畓畕畖畗畘"],
["ae80","畝",7,"畧畨畩畫",6,"畳畵當畷畺",4,"疀疁疂疄疅疇"],
["af40","疈疉疊疌疍疎疐疓疕疘疛疜疞疢疦",4,"疭疶疷疺疻疿痀痁痆痋痌痎痏痐痑痓痗痙痚痜痝痟痠痡痥痩痬痭痮痯痲痳痵痶痷痸痺痻痽痾瘂瘄瘆瘇"],
["af80","瘈瘉瘋瘍瘎瘏瘑瘒瘓瘔瘖瘚瘜瘝瘞瘡瘣瘧瘨瘬瘮瘯瘱瘲瘶瘷瘹瘺瘻瘽癁療癄"],
["b040","癅",6,"癎",5,"癕癗",4,"癝癟癠癡癢癤",6,"癬癭癮癰",7,"癹発發癿皀皁皃皅皉皊皌皍皏皐皒皔皕皗皘皚皛"],
["b080","皜",7,"皥",8,"皯皰皳皵",9,"盀盁盃啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥"],
["b140","盄盇盉盋盌盓盕盙盚盜盝盞盠",4,"盦",7,"盰盳盵盶盷盺盻盽盿眀眂眃眅眆眊県眎",10,"眛眜眝眞眡眣眤眥眧眪眫"],
["b180","眬眮眰",4,"眹眻眽眾眿睂睄睅睆睈",7,"睒",7,"睜薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳"],
["b240","睝睞睟睠睤睧睩睪睭",11,"睺睻睼瞁瞂瞃瞆",5,"瞏瞐瞓",11,"瞡瞣瞤瞦瞨瞫瞭瞮瞯瞱瞲瞴瞶",4],
["b280","瞼瞾矀",12,"矎",8,"矘矙矚矝",4,"矤病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖"],
["b340","矦矨矪矯矰矱矲矴矵矷矹矺矻矼砃",5,"砊砋砎砏砐砓砕砙砛砞砠砡砢砤砨砪砫砮砯砱砲砳砵砶砽砿硁硂硃硄硆硈硉硊硋硍硏硑硓硔硘硙硚"],
["b380","硛硜硞",11,"硯",7,"硸硹硺硻硽",6,"场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚"],
["b440","碄碅碆碈碊碋碏碐碒碔碕碖碙碝碞碠碢碤碦碨",7,"碵碶碷碸確碻碼碽碿磀磂磃磄磆磇磈磌磍磎磏磑磒磓磖磗磘磚",9],
["b480","磤磥磦磧磩磪磫磭",4,"磳磵磶磸磹磻",5,"礂礃礄礆",6,"础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮"],
["b540","礍",5,"礔",9,"礟",4,"礥",14,"礵",4,"礽礿祂祃祄祅祇祊",8,"祔祕祘祙祡祣"],
["b580","祤祦祩祪祫祬祮祰",6,"祹祻",4,"禂禃禆禇禈禉禋禌禍禎禐禑禒怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠"],
["b640","禓",6,"禛",11,"禨",10,"禴",4,"禼禿秂秄秅秇秈秊秌秎秏秐秓秔秖秗秙",5,"秠秡秢秥秨秪"],
["b680","秬秮秱",6,"秹秺秼秾秿稁稄稅稇稈稉稊稌稏",4,"稕稖稘稙稛稜丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二"],
["b740","稝稟稡稢稤",14,"稴稵稶稸稺稾穀",5,"穇",9,"穒",4,"穘",16],
["b780","穩",6,"穱穲穳穵穻穼穽穾窂窅窇窉窊窋窌窎窏窐窓窔窙窚窛窞窡窢贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服"],
["b840","窣窤窧窩窪窫窮",4,"窴",10,"竀",10,"竌",9,"竗竘竚竛竜竝竡竢竤竧",5,"竮竰竱竲竳"],
["b880","竴",4,"竻竼竾笀笁笂笅笇笉笌笍笎笐笒笓笖笗笘笚笜笝笟笡笢笣笧笩笭浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹"],
["b940","笯笰笲笴笵笶笷笹笻笽笿",5,"筆筈筊筍筎筓筕筗筙筜筞筟筡筣",10,"筯筰筳筴筶筸筺筼筽筿箁箂箃箄箆",6,"箎箏"],
["b980","箑箒箓箖箘箙箚箛箞箟箠箣箤箥箮箯箰箲箳箵箶箷箹",7,"篂篃範埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈"],
["ba40","篅篈築篊篋篍篎篏篐篒篔",4,"篛篜篞篟篠篢篣篤篧篨篩篫篬篭篯篰篲",4,"篸篹篺篻篽篿",7,"簈簉簊簍簎簐",5,"簗簘簙"],
["ba80","簚",4,"簠",5,"簨簩簫",12,"簹",5,"籂骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖"],
["bb40","籃",9,"籎",36,"籵",5,"籾",9],
["bb80","粈粊",6,"粓粔粖粙粚粛粠粡粣粦粧粨粩粫粬粭粯粰粴",4,"粺粻弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕"],
["bc40","粿糀糂糃糄糆糉糋糎",6,"糘糚糛糝糞糡",6,"糩",5,"糰",7,"糹糺糼",13,"紋",5],
["bc80","紑",14,"紡紣紤紥紦紨紩紪紬紭紮細",6,"肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件"],
["bd40","紷",54,"絯",7],
["bd80","絸",32,"健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸"],
["be40","継",12,"綧",6,"綯",42],
["be80","線",32,"尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻"],
["bf40","緻",62],
["bf80","縺縼",4,"繂",4,"繈",21,"俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀"],
["c040","繞",35,"纃",23,"纜纝纞"],
["c080","纮纴纻纼绖绤绬绹缊缐缞缷缹缻",6,"罃罆",9,"罒罓馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐"],
["c140","罖罙罛罜罝罞罠罣",4,"罫罬罭罯罰罳罵罶罷罸罺罻罼罽罿羀羂",7,"羋羍羏",4,"羕",4,"羛羜羠羢羣羥羦羨",6,"羱"],
["c180","羳",4,"羺羻羾翀翂翃翄翆翇翈翉翋翍翏",4,"翖翗翙",5,"翢翣痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿"],
["c240","翤翧翨翪翫翬翭翯翲翴",6,"翽翾翿耂耇耈耉耊耎耏耑耓耚耛耝耞耟耡耣耤耫",5,"耲耴耹耺耼耾聀聁聄聅聇聈聉聎聏聐聑聓聕聖聗"],
["c280","聙聛",13,"聫",5,"聲",11,"隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫"],
["c340","聾肁肂肅肈肊肍",5,"肔肕肗肙肞肣肦肧肨肬肰肳肵肶肸肹肻胅胇",4,"胏",6,"胘胟胠胢胣胦胮胵胷胹胻胾胿脀脁脃脄脅脇脈脋"],
["c380","脌脕脗脙脛脜脝脟",12,"脭脮脰脳脴脵脷脹",4,"脿谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸"],
["c440","腀",5,"腇腉腍腎腏腒腖腗腘腛",4,"腡腢腣腤腦腨腪腫腬腯腲腳腵腶腷腸膁膃",4,"膉膋膌膍膎膐膒",5,"膙膚膞",4,"膤膥"],
["c480","膧膩膫",7,"膴",5,"膼膽膾膿臄臅臇臈臉臋臍",6,"摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁"],
["c540","臔",14,"臤臥臦臨臩臫臮",4,"臵",5,"臽臿舃與",4,"舎舏舑舓舕",5,"舝舠舤舥舦舧舩舮舲舺舼舽舿"],
["c580","艀艁艂艃艅艆艈艊艌艍艎艐",7,"艙艛艜艝艞艠",7,"艩拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗"],
["c640","艪艫艬艭艱艵艶艷艸艻艼芀芁芃芅芆芇芉芌芐芓芔芕芖芚芛芞芠芢芣芧芲芵芶芺芻芼芿苀苂苃苅苆苉苐苖苙苚苝苢苧苨苩苪苬苭苮苰苲苳苵苶苸"],
["c680","苺苼",4,"茊茋茍茐茒茓茖茘茙茝",9,"茩茪茮茰茲茷茻茽啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐"],
["c740","茾茿荁荂荄荅荈荊",4,"荓荕",4,"荝荢荰",6,"荹荺荾",6,"莇莈莊莋莌莍莏莐莑莔莕莖莗莙莚莝莟莡",6,"莬莭莮"],
["c780","莯莵莻莾莿菂菃菄菆菈菉菋菍菎菐菑菒菓菕菗菙菚菛菞菢菣菤菦菧菨菫菬菭恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠"],
["c840","菮華菳",4,"菺菻菼菾菿萀萂萅萇萈萉萊萐萒",5,"萙萚萛萞",5,"萩",7,"萲",5,"萹萺萻萾",7,"葇葈葉"],
["c880","葊",6,"葒",4,"葘葝葞葟葠葢葤",4,"葪葮葯葰葲葴葷葹葻葼取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁"],
["c940","葽",4,"蒃蒄蒅蒆蒊蒍蒏",7,"蒘蒚蒛蒝蒞蒟蒠蒢",12,"蒰蒱蒳蒵蒶蒷蒻蒼蒾蓀蓂蓃蓅蓆蓇蓈蓋蓌蓎蓏蓒蓔蓕蓗"],
["c980","蓘",4,"蓞蓡蓢蓤蓧",4,"蓭蓮蓯蓱",10,"蓽蓾蔀蔁蔂伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳"],
["ca40","蔃",8,"蔍蔎蔏蔐蔒蔔蔕蔖蔘蔙蔛蔜蔝蔞蔠蔢",8,"蔭",9,"蔾",4,"蕄蕅蕆蕇蕋",10],
["ca80","蕗蕘蕚蕛蕜蕝蕟",4,"蕥蕦蕧蕩",8,"蕳蕵蕶蕷蕸蕼蕽蕿薀薁省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱"],
["cb40","薂薃薆薈",6,"薐",10,"薝",6,"薥薦薧薩薫薬薭薱",5,"薸薺",6,"藂",6,"藊",4,"藑藒"],
["cb80","藔藖",5,"藝",6,"藥藦藧藨藪",14,"恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔"],
["cc40","藹藺藼藽藾蘀",4,"蘆",10,"蘒蘓蘔蘕蘗",15,"蘨蘪",13,"蘹蘺蘻蘽蘾蘿虀"],
["cc80","虁",11,"虒虓處",4,"虛虜虝號虠虡虣",7,"獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃"],
["cd40","虭虯虰虲",6,"蚃",6,"蚎",4,"蚔蚖",5,"蚞",4,"蚥蚦蚫蚭蚮蚲蚳蚷蚸蚹蚻",4,"蛁蛂蛃蛅蛈蛌蛍蛒蛓蛕蛖蛗蛚蛜"],
["cd80","蛝蛠蛡蛢蛣蛥蛦蛧蛨蛪蛫蛬蛯蛵蛶蛷蛺蛻蛼蛽蛿蜁蜄蜅蜆蜋蜌蜎蜏蜐蜑蜔蜖汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威"],
["ce40","蜙蜛蜝蜟蜠蜤蜦蜧蜨蜪蜫蜬蜭蜯蜰蜲蜳蜵蜶蜸蜹蜺蜼蜽蝀",6,"蝊蝋蝍蝏蝐蝑蝒蝔蝕蝖蝘蝚",5,"蝡蝢蝦",7,"蝯蝱蝲蝳蝵"],
["ce80","蝷蝸蝹蝺蝿螀螁螄螆螇螉螊螌螎",4,"螔螕螖螘",6,"螠",4,"巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺"],
["cf40","螥螦螧螩螪螮螰螱螲螴螶螷螸螹螻螼螾螿蟁",4,"蟇蟈蟉蟌",4,"蟔",6,"蟜蟝蟞蟟蟡蟢蟣蟤蟦蟧蟨蟩蟫蟬蟭蟯",9],
["cf80","蟺蟻蟼蟽蟿蠀蠁蠂蠄",5,"蠋",7,"蠔蠗蠘蠙蠚蠜",4,"蠣稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓"],
["d040","蠤",13,"蠳",5,"蠺蠻蠽蠾蠿衁衂衃衆",5,"衎",5,"衕衖衘衚",6,"衦衧衪衭衯衱衳衴衵衶衸衹衺"],
["d080","衻衼袀袃袆袇袉袊袌袎袏袐袑袓袔袕袗",4,"袝",4,"袣袥",5,"小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄"],
["d140","袬袮袯袰袲",4,"袸袹袺袻袽袾袿裀裃裄裇裈裊裋裌裍裏裐裑裓裖裗裚",4,"裠裡裦裧裩",6,"裲裵裶裷裺裻製裿褀褁褃",5],
["d180","褉褋",4,"褑褔",4,"褜",4,"褢褣褤褦褧褨褩褬褭褮褯褱褲褳褵褷选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶"],
["d240","褸",8,"襂襃襅",24,"襠",5,"襧",19,"襼"],
["d280","襽襾覀覂覄覅覇",26,"摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐"],
["d340","覢",30,"觃觍觓觔觕觗觘觙觛觝觟觠觡觢觤觧觨觩觪觬觭觮觰觱觲觴",6],
["d380","觻",4,"訁",5,"計",21,"印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉"],
["d440","訞",31,"訿",8,"詉",21],
["d480","詟",25,"詺",6,"浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧"],
["d540","誁",7,"誋",7,"誔",46],
["d580","諃",32,"铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政"],
["d640","諤",34,"謈",27],
["d680","謤謥謧",30,"帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑"],
["d740","譆",31,"譧",4,"譭",25],
["d780","讇",24,"讬讱讻诇诐诪谉谞住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座"],
["d840","谸",8,"豂豃豄豅豈豊豋豍",7,"豖豗豘豙豛",5,"豣",6,"豬",6,"豴豵豶豷豻",6,"貃貄貆貇"],
["d880","貈貋貍",6,"貕貖貗貙",20,"亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝"],
["d940","貮",62],
["d980","賭",32,"佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼"],
["da40","贎",14,"贠赑赒赗赟赥赨赩赪赬赮赯赱赲赸",8,"趂趃趆趇趈趉趌",4,"趒趓趕",9,"趠趡"],
["da80","趢趤",12,"趲趶趷趹趻趽跀跁跂跅跇跈跉跊跍跐跒跓跔凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺"],
["db40","跕跘跙跜跠跡跢跥跦跧跩跭跮跰跱跲跴跶跼跾",6,"踆踇踈踋踍踎踐踑踒踓踕",7,"踠踡踤",4,"踫踭踰踲踳踴踶踷踸踻踼踾"],
["db80","踿蹃蹅蹆蹌",4,"蹓",5,"蹚",11,"蹧蹨蹪蹫蹮蹱邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝"],
["dc40","蹳蹵蹷",4,"蹽蹾躀躂躃躄躆躈",6,"躑躒躓躕",6,"躝躟",11,"躭躮躰躱躳",6,"躻",7],
["dc80","軃",10,"軏",21,"堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥"],
["dd40","軥",62],
["dd80","輤",32,"荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺"],
["de40","轅",32,"轪辀辌辒辝辠辡辢辤辥辦辧辪辬辭辮辯農辳辴辵辷辸辺辻込辿迀迃迆"],
["de80","迉",4,"迏迒迖迗迚迠迡迣迧迬迯迱迲迴迵迶迺迻迼迾迿逇逈逌逎逓逕逘蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖"],
["df40","這逜連逤逥逧",5,"逰",4,"逷逹逺逽逿遀遃遅遆遈",4,"過達違遖遙遚遜",5,"遤遦遧適遪遫遬遯",4,"遶",6,"遾邁"],
["df80","還邅邆邇邉邊邌",4,"邒邔邖邘邚邜邞邟邠邤邥邧邨邩邫邭邲邷邼邽邿郀摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼"],
["e040","郂郃郆郈郉郋郌郍郒郔郕郖郘郙郚郞郟郠郣郤郥郩郪郬郮郰郱郲郳郵郶郷郹郺郻郼郿鄀鄁鄃鄅",19,"鄚鄛鄜"],
["e080","鄝鄟鄠鄡鄤",10,"鄰鄲",6,"鄺",8,"酄唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼"],
["e140","酅酇酈酑酓酔酕酖酘酙酛酜酟酠酦酧酨酫酭酳酺酻酼醀",4,"醆醈醊醎醏醓",6,"醜",5,"醤",5,"醫醬醰醱醲醳醶醷醸醹醻"],
["e180","醼",10,"釈釋釐釒",9,"針",8,"帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺"],
["e240","釦",62],
["e280","鈥",32,"狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧",5,"饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂"],
["e340","鉆",45,"鉵",16],
["e380","銆",7,"銏",24,"恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾"],
["e440","銨",5,"銯",24,"鋉",31],
["e480","鋩",32,"洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑"],
["e540","錊",51,"錿",10],
["e580","鍊",31,"鍫濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣"],
["e640","鍬",34,"鎐",27],
["e680","鎬",29,"鏋鏌鏍妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩"],
["e740","鏎",7,"鏗",54],
["e780","鐎",32,"纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡",6,"缪缫缬缭缯",4,"缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬"],
["e840","鐯",14,"鐿",43,"鑬鑭鑮鑯"],
["e880","鑰",20,"钑钖钘铇铏铓铔铚铦铻锜锠琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹"],
["e940","锧锳锽镃镈镋镕镚镠镮镴镵長",7,"門",42],
["e980","閫",32,"椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋"],
["ea40","闌",27,"闬闿阇阓阘阛阞阠阣",6,"阫阬阭阯阰阷阸阹阺阾陁陃陊陎陏陑陒陓陖陗"],
["ea80","陘陙陚陜陝陞陠陣陥陦陫陭",4,"陳陸",12,"隇隉隊辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰"],
["eb40","隌階隑隒隓隕隖隚際隝",9,"隨",7,"隱隲隴隵隷隸隺隻隿雂雃雈雊雋雐雑雓雔雖",9,"雡",6,"雫"],
["eb80","雬雭雮雰雱雲雴雵雸雺電雼雽雿霂霃霅霊霋霌霐霑霒霔霕霗",4,"霝霟霠搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻"],
["ec40","霡",8,"霫霬霮霯霱霳",4,"霺霻霼霽霿",18,"靔靕靗靘靚靜靝靟靣靤靦靧靨靪",7],
["ec80","靲靵靷",4,"靽",7,"鞆",4,"鞌鞎鞏鞐鞓鞕鞖鞗鞙",4,"臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐"],
["ed40","鞞鞟鞡鞢鞤",6,"鞬鞮鞰鞱鞳鞵",46],
["ed80","韤韥韨韮",4,"韴韷",23,"怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨"],
["ee40","頏",62],
["ee80","顎",32,"睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶",4,"钼钽钿铄铈",6,"铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪"],
["ef40","顯",5,"颋颎颒颕颙颣風",37,"飏飐飔飖飗飛飜飝飠",4],
["ef80","飥飦飩",30,"铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒",4,"锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤",8,"镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔"],
["f040","餈",4,"餎餏餑",28,"餯",26],
["f080","饊",9,"饖",12,"饤饦饳饸饹饻饾馂馃馉稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨",4,"鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦",6,"鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙"],
["f140","馌馎馚",10,"馦馧馩",47],
["f180","駙",32,"瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃"],
["f240","駺",62],
["f280","騹",32,"颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒"],
["f340","驚",17,"驲骃骉骍骎骔骕骙骦骩",6,"骲骳骴骵骹骻骽骾骿髃髄髆",4,"髍髎髏髐髒體髕髖髗髙髚髛髜"],
["f380","髝髞髠髢髣髤髥髧髨髩髪髬髮髰",8,"髺髼",6,"鬄鬅鬆蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋"],
["f440","鬇鬉",5,"鬐鬑鬒鬔",10,"鬠鬡鬢鬤",10,"鬰鬱鬳",7,"鬽鬾鬿魀魆魊魋魌魎魐魒魓魕",5],
["f480","魛",32,"簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤"],
["f540","魼",62],
["f580","鮻",32,"酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜"],
["f640","鯜",62],
["f680","鰛",32,"觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅",5,"龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞",5,"鲥",4,"鲫鲭鲮鲰",7,"鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋"],
["f740","鰼",62],
["f780","鱻鱽鱾鲀鲃鲄鲉鲊鲌鲏鲓鲖鲗鲘鲙鲝鲪鲬鲯鲹鲾",4,"鳈鳉鳑鳒鳚鳛鳠鳡鳌",4,"鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄"],
["f840","鳣",62],
["f880","鴢",32],
["f940","鵃",62],
["f980","鶂",32],
["fa40","鶣",62],
["fa80","鷢",32],
["fb40","鸃",27,"鸤鸧鸮鸰鸴鸻鸼鹀鹍鹐鹒鹓鹔鹖鹙鹝鹟鹠鹡鹢鹥鹮鹯鹲鹴",9,"麀"],
["fb80","麁麃麄麅麆麉麊麌",5,"麔",8,"麞麠",5,"麧麨麩麪"],
["fc40","麫",8,"麵麶麷麹麺麼麿",4,"黅黆黇黈黊黋黌黐黒黓黕黖黗黙黚點黡黣黤黦黨黫黬黭黮黰",8,"黺黽黿",6],
["fc80","鼆",4,"鼌鼏鼑鼒鼔鼕鼖鼘鼚",5,"鼡鼣",8,"鼭鼮鼰鼱"],
["fd40","鼲",4,"鼸鼺鼼鼿",4,"齅",10,"齒",38],
["fd80","齹",5,"龁龂龍",11,"龜龝龞龡",4,"郎凉秊裏隣"],
["fe40","兀嗀﨎﨏﨑﨓﨔礼﨟蘒﨡﨣﨤﨧﨨﨩"]
]
[
["0","\u0000",127],
["8141","갂갃갅갆갋",4,"갘갞갟갡갢갣갥",6,"갮갲갳갴"],
["8161","갵갶갷갺갻갽갾갿걁",9,"걌걎",5,"걕"],
["8181","걖걗걙걚걛걝",18,"걲걳걵걶걹걻",4,"겂겇겈겍겎겏겑겒겓겕",6,"겞겢",5,"겫겭겮겱",6,"겺겾겿곀곂곃곅곆곇곉곊곋곍",7,"곖곘",7,"곢곣곥곦곩곫곭곮곲곴곷",4,"곾곿괁괂괃괅괇",4,"괎괐괒괓"],
["8241","괔괕괖괗괙괚괛괝괞괟괡",7,"괪괫괮",5],
["8261","괶괷괹괺괻괽",6,"굆굈굊",5,"굑굒굓굕굖굗"],
["8281","굙",7,"굢굤",7,"굮굯굱굲굷굸굹굺굾궀궃",4,"궊궋궍궎궏궑",10,"궞",5,"궥",17,"궸",7,"귂귃귅귆귇귉",6,"귒귔",7,"귝귞귟귡귢귣귥",18],
["8341","귺귻귽귾긂",5,"긊긌긎",5,"긕",7],
["8361","긝",18,"긲긳긵긶긹긻긼"],
["8381","긽긾긿깂깄깇깈깉깋깏깑깒깓깕깗",4,"깞깢깣깤깦깧깪깫깭깮깯깱",6,"깺깾",5,"꺆",5,"꺍",46,"꺿껁껂껃껅",6,"껎껒",5,"껚껛껝",8],
["8441","껦껧껩껪껬껮",5,"껵껶껷껹껺껻껽",8],
["8461","꼆꼉꼊꼋꼌꼎꼏꼑",18],
["8481","꼤",7,"꼮꼯꼱꼳꼵",6,"꼾꽀꽄꽅꽆꽇꽊",5,"꽑",10,"꽞",5,"꽦",18,"꽺",5,"꾁꾂꾃꾅꾆꾇꾉",6,"꾒꾓꾔꾖",5,"꾝",26,"꾺꾻꾽꾾"],
["8541","꾿꿁",5,"꿊꿌꿏",4,"꿕",6,"꿝",4],
["8561","꿢",5,"꿪",5,"꿲꿳꿵꿶꿷꿹",6,"뀂뀃"],
["8581","뀅",6,"뀍뀎뀏뀑뀒뀓뀕",6,"뀞",9,"뀩",26,"끆끇끉끋끍끏끐끑끒끖끘끚끛끜끞",29,"끾끿낁낂낃낅",6,"낎낐낒",5,"낛낝낞낣낤"],
["8641","낥낦낧낪낰낲낶낷낹낺낻낽",6,"냆냊",5,"냒"],
["8661","냓냕냖냗냙",6,"냡냢냣냤냦",10],
["8681","냱",22,"넊넍넎넏넑넔넕넖넗넚넞",4,"넦넧넩넪넫넭",6,"넶넺",5,"녂녃녅녆녇녉",6,"녒녓녖녗녙녚녛녝녞녟녡",22,"녺녻녽녾녿놁놃",4,"놊놌놎놏놐놑놕놖놗놙놚놛놝"],
["8741","놞",9,"놩",15],
["8761","놹",18,"뇍뇎뇏뇑뇒뇓뇕"],
["8781","뇖",5,"뇞뇠",7,"뇪뇫뇭뇮뇯뇱",7,"뇺뇼뇾",5,"눆눇눉눊눍",6,"눖눘눚",5,"눡",18,"눵",6,"눽",26,"뉙뉚뉛뉝뉞뉟뉡",6,"뉪",4],
["8841","뉯",4,"뉶",5,"뉽",6,"늆늇늈늊",4],
["8861","늏늒늓늕늖늗늛",4,"늢늤늧늨늩늫늭늮늯늱늲늳늵늶늷"],
["8881","늸",15,"닊닋닍닎닏닑닓",4,"닚닜닞닟닠닡닣닧닩닪닰닱닲닶닼닽닾댂댃댅댆댇댉",6,"댒댖",5,"댝",54,"덗덙덚덝덠덡덢덣"],
["8941","덦덨덪덬덭덯덲덳덵덶덷덹",6,"뎂뎆",5,"뎍"],
["8961","뎎뎏뎑뎒뎓뎕",10,"뎢",5,"뎩뎪뎫뎭"],
["8981","뎮",21,"돆돇돉돊돍돏돑돒돓돖돘돚돜돞돟돡돢돣돥돦돧돩",18,"돽",18,"됑",6,"됙됚됛됝됞됟됡",6,"됪됬",7,"됵",15],
["8a41","둅",10,"둒둓둕둖둗둙",6,"둢둤둦"],
["8a61","둧",4,"둭",18,"뒁뒂"],
["8a81","뒃",4,"뒉",19,"뒞",5,"뒥뒦뒧뒩뒪뒫뒭",7,"뒶뒸뒺",5,"듁듂듃듅듆듇듉",6,"듑듒듓듔듖",5,"듞듟듡듢듥듧",4,"듮듰듲",5,"듹",26,"딖딗딙딚딝"],
["8b41","딞",5,"딦딫",4,"딲딳딵딶딷딹",6,"땂땆"],
["8b61","땇땈땉땊땎땏땑땒땓땕",6,"땞땢",8],
["8b81","땫",52,"떢떣떥떦떧떩떬떭떮떯떲떶",4,"떾떿뗁뗂뗃뗅",6,"뗎뗒",5,"뗙",18,"뗭",18],
["8c41","똀",15,"똒똓똕똖똗똙",4],
["8c61","똞",6,"똦",5,"똭",6,"똵",5],
["8c81","똻",12,"뙉",26,"뙥뙦뙧뙩",50,"뚞뚟뚡뚢뚣뚥",5,"뚭뚮뚯뚰뚲",16],
["8d41","뛃",16,"뛕",8],
["8d61","뛞",17,"뛱뛲뛳뛵뛶뛷뛹뛺"],
["8d81","뛻",4,"뜂뜃뜄뜆",33,"뜪뜫뜭뜮뜱",6,"뜺뜼",7,"띅띆띇띉띊띋띍",6,"띖",9,"띡띢띣띥띦띧띩",6,"띲띴띶",5,"띾띿랁랂랃랅",6,"랎랓랔랕랚랛랝랞"],
["8e41","랟랡",6,"랪랮",5,"랶랷랹",8],
["8e61","럂",4,"럈럊",19],
["8e81","럞",13,"럮럯럱럲럳럵",6,"럾렂",4,"렊렋렍렎렏렑",6,"렚렜렞",5,"렦렧렩렪렫렭",6,"렶렺",5,"롁롂롃롅",11,"롒롔",7,"롞롟롡롢롣롥",6,"롮롰롲",5,"롹롺롻롽",7],
["8f41","뢅",7,"뢎",17],
["8f61","뢠",7,"뢩",6,"뢱뢲뢳뢵뢶뢷뢹",4],
["8f81","뢾뢿룂룄룆",5,"룍룎룏룑룒룓룕",7,"룞룠룢",5,"룪룫룭룮룯룱",6,"룺룼룾",5,"뤅",18,"뤙",6,"뤡",26,"뤾뤿륁륂륃륅",6,"륍륎륐륒",5],
["9041","륚륛륝륞륟륡",6,"륪륬륮",5,"륶륷륹륺륻륽"],
["9061","륾",5,"릆릈릋릌릏",15],
["9081","릟",12,"릮릯릱릲릳릵",6,"릾맀맂",5,"맊맋맍맓",4,"맚맜맟맠맢맦맧맩맪맫맭",6,"맶맻",4,"먂",5,"먉",11,"먖",33,"먺먻먽먾먿멁멃멄멅멆"],
["9141","멇멊멌멏멐멑멒멖멗멙멚멛멝",6,"멦멪",5],
["9161","멲멳멵멶멷멹",9,"몆몈몉몊몋몍",5],
["9181","몓",20,"몪몭몮몯몱몳",4,"몺몼몾",5,"뫅뫆뫇뫉",14,"뫚",33,"뫽뫾뫿묁묂묃묅",7,"묎묐묒",5,"묙묚묛묝묞묟묡",6],
["9241","묨묪묬",7,"묷묹묺묿",4,"뭆뭈뭊뭋뭌뭎뭑뭒"],
["9261","뭓뭕뭖뭗뭙",7,"뭢뭤",7,"뭭",4],
["9281","뭲",21,"뮉뮊뮋뮍뮎뮏뮑",18,"뮥뮦뮧뮩뮪뮫뮭",6,"뮵뮶뮸",7,"믁믂믃믅믆믇믉",6,"믑믒믔",35,"믺믻믽믾밁"],
["9341","밃",4,"밊밎밐밒밓밙밚밠밡밢밣밦밨밪밫밬밮밯밲밳밵"],
["9361","밶밷밹",6,"뱂뱆뱇뱈뱊뱋뱎뱏뱑",8],
["9381","뱚뱛뱜뱞",37,"벆벇벉벊벍벏",4,"벖벘벛",4,"벢벣벥벦벩",6,"벲벶",5,"벾벿볁볂볃볅",7,"볎볒볓볔볖볗볙볚볛볝",22,"볷볹볺볻볽"],
["9441","볾",5,"봆봈봊",5,"봑봒봓봕",8],
["9461","봞",5,"봥",6,"봭",12],
["9481","봺",5,"뵁",6,"뵊뵋뵍뵎뵏뵑",6,"뵚",9,"뵥뵦뵧뵩",22,"붂붃붅붆붋",4,"붒붔붖붗붘붛붝",6,"붥",10,"붱",6,"붹",24],
["9541","뷒뷓뷖뷗뷙뷚뷛뷝",11,"뷪",5,"뷱"],
["9561","뷲뷳뷵뷶뷷뷹",6,"븁븂븄븆",5,"븎븏븑븒븓"],
["9581","븕",6,"븞븠",35,"빆빇빉빊빋빍빏",4,"빖빘빜빝빞빟빢빣빥빦빧빩빫",4,"빲빶",4,"빾빿뺁뺂뺃뺅",6,"뺎뺒",5,"뺚",13,"뺩",14],
["9641","뺸",23,"뻒뻓"],
["9661","뻕뻖뻙",6,"뻡뻢뻦",5,"뻭",8],
["9681","뻶",10,"뼂",5,"뼊",13,"뼚뼞",33,"뽂뽃뽅뽆뽇뽉",6,"뽒뽓뽔뽖",44],
["9741","뾃",16,"뾕",8],
["9761","뾞",17,"뾱",7],
["9781","뾹",11,"뿆",5,"뿎뿏뿑뿒뿓뿕",6,"뿝뿞뿠뿢",89,"쀽쀾쀿"],
["9841","쁀",16,"쁒",5,"쁙쁚쁛"],
["9861","쁝쁞쁟쁡",6,"쁪",15],
["9881","쁺",21,"삒삓삕삖삗삙",6,"삢삤삦",5,"삮삱삲삷",4,"삾샂샃샄샆샇샊샋샍샎샏샑",6,"샚샞",5,"샦샧샩샪샫샭",6,"샶샸샺",5,"섁섂섃섅섆섇섉",6,"섑섒섓섔섖",5,"섡섢섥섨섩섪섫섮"],
["9941","섲섳섴섵섷섺섻섽섾섿셁",6,"셊셎",5,"셖셗"],
["9961","셙셚셛셝",6,"셦셪",5,"셱셲셳셵셶셷셹셺셻"],
["9981","셼",8,"솆",5,"솏솑솒솓솕솗",4,"솞솠솢솣솤솦솧솪솫솭솮솯솱",11,"솾",5,"쇅쇆쇇쇉쇊쇋쇍",6,"쇕쇖쇙",6,"쇡쇢쇣쇥쇦쇧쇩",6,"쇲쇴",7,"쇾쇿숁숂숃숅",6,"숎숐숒",5,"숚숛숝숞숡숢숣"],
["9a41","숤숥숦숧숪숬숮숰숳숵",16],
["9a61","쉆쉇쉉",6,"쉒쉓쉕쉖쉗쉙",6,"쉡쉢쉣쉤쉦"],
["9a81","쉧",4,"쉮쉯쉱쉲쉳쉵",6,"쉾슀슂",5,"슊",5,"슑",6,"슙슚슜슞",5,"슦슧슩슪슫슮",5,"슶슸슺",33,"싞싟싡싢싥",5,"싮싰싲싳싴싵싷싺싽싾싿쌁",6,"쌊쌋쌎쌏"],
["9b41","쌐쌑쌒쌖쌗쌙쌚쌛쌝",6,"쌦쌧쌪",8],
["9b61","쌳",17,"썆",7],
["9b81","썎",25,"썪썫썭썮썯썱썳",4,"썺썻썾",5,"쎅쎆쎇쎉쎊쎋쎍",50,"쏁",22,"쏚"],
["9c41","쏛쏝쏞쏡쏣",4,"쏪쏫쏬쏮",5,"쏶쏷쏹",5],
["9c61","쏿",8,"쐉",6,"쐑",9],
["9c81","쐛",8,"쐥",6,"쐭쐮쐯쐱쐲쐳쐵",6,"쐾",9,"쑉",26,"쑦쑧쑩쑪쑫쑭",6,"쑶쑷쑸쑺",5,"쒁",18,"쒕",6,"쒝",12],
["9d41","쒪",13,"쒹쒺쒻쒽",8],
["9d61","쓆",25],
["9d81","쓠",8,"쓪",5,"쓲쓳쓵쓶쓷쓹쓻쓼쓽쓾씂",9,"씍씎씏씑씒씓씕",6,"씝",10,"씪씫씭씮씯씱",6,"씺씼씾",5,"앆앇앋앏앐앑앒앖앚앛앜앟앢앣앥앦앧앩",6,"앲앶",5,"앾앿얁얂얃얅얆얈얉얊얋얎얐얒얓얔"],
["9e41","얖얙얚얛얝얞얟얡",7,"얪",9,"얶"],
["9e61","얷얺얿",4,"엋엍엏엒엓엕엖엗엙",6,"엢엤엦엧"],
["9e81","엨엩엪엫엯엱엲엳엵엸엹엺엻옂옃옄옉옊옋옍옎옏옑",6,"옚옝",6,"옦옧옩옪옫옯옱옲옶옸옺옼옽옾옿왂왃왅왆왇왉",6,"왒왖",5,"왞왟왡",10,"왭왮왰왲",5,"왺왻왽왾왿욁",6,"욊욌욎",5,"욖욗욙욚욛욝",6,"욦"],
["9f41","욨욪",5,"욲욳욵욶욷욻",4,"웂웄웆",5,"웎"],
["9f61","웏웑웒웓웕",6,"웞웟웢",5,"웪웫웭웮웯웱웲"],
["9f81","웳",4,"웺웻웼웾",5,"윆윇윉윊윋윍",6,"윖윘윚",5,"윢윣윥윦윧윩",6,"윲윴윶윸윹윺윻윾윿읁읂읃읅",4,"읋읎읐읙읚읛읝읞읟읡",6,"읩읪읬",7,"읶읷읹읺읻읿잀잁잂잆잋잌잍잏잒잓잕잙잛",4,"잢잧",4,"잮잯잱잲잳잵잶잷"],
["a041","잸잹잺잻잾쟂",5,"쟊쟋쟍쟏쟑",6,"쟙쟚쟛쟜"],
["a061","쟞",5,"쟥쟦쟧쟩쟪쟫쟭",13],
["a081","쟻",4,"젂젃젅젆젇젉젋",4,"젒젔젗",4,"젞젟젡젢젣젥",6,"젮젰젲",5,"젹젺젻젽젾젿졁",6,"졊졋졎",5,"졕",26,"졲졳졵졶졷졹졻",4,"좂좄좈좉좊좎",5,"좕",7,"좞좠좢좣좤"],
["a141","좥좦좧좩",18,"좾좿죀죁"],
["a161","죂죃죅죆죇죉죊죋죍",6,"죖죘죚",5,"죢죣죥"],
["a181","죦",14,"죶",5,"죾죿줁줂줃줇",4,"줎　、。·‥…¨〃­―∥＼∼‘’“”〔〕〈",9,"±×÷≠≤≥∞∴°′″℃Å￠￡￥♂♀∠⊥⌒∂∇≡≒§※☆★○●◎◇◆□■△▲▽▼→←↑↓↔〓≪≫√∽∝∵∫∬∈∋⊆⊇⊂⊃∪∩∧∨￢"],
["a241","줐줒",5,"줙",18],
["a261","줭",6,"줵",18],
["a281","쥈",7,"쥒쥓쥕쥖쥗쥙",6,"쥢쥤",7,"쥭쥮쥯⇒⇔∀∃´～ˇ˘˝˚˙¸˛¡¿ː∮∑∏¤℉‰◁◀▷▶♤♠♡♥♧♣⊙◈▣◐◑▒▤▥▨▧▦▩♨☏☎☜☞¶†‡↕↗↙↖↘♭♩♪♬㉿㈜№㏇™㏂㏘℡€®"],
["a341","쥱쥲쥳쥵",6,"쥽",10,"즊즋즍즎즏"],
["a361","즑",6,"즚즜즞",16],
["a381","즯",16,"짂짃짅짆짉짋",4,"짒짔짗짘짛！",58,"￦］",32,"￣"],
["a441","짞짟짡짣짥짦짨짩짪짫짮짲",5,"짺짻짽짾짿쨁쨂쨃쨄"],
["a461","쨅쨆쨇쨊쨎",5,"쨕쨖쨗쨙",12],
["a481","쨦쨧쨨쨪",28,"ㄱ",93],
["a541","쩇",4,"쩎쩏쩑쩒쩓쩕",6,"쩞쩢",5,"쩩쩪"],
["a561","쩫",17,"쩾",5,"쪅쪆"],
["a581","쪇",16,"쪙",14,"ⅰ",9],
["a5b0","Ⅰ",9],
["a5c1","Α",16,"Σ",6],
["a5e1","α",16,"σ",6],
["a641","쪨",19,"쪾쪿쫁쫂쫃쫅"],
["a661","쫆",5,"쫎쫐쫒쫔쫕쫖쫗쫚",5,"쫡",6],
["a681","쫨쫩쫪쫫쫭",6,"쫵",18,"쬉쬊─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂┒┑┚┙┖┕┎┍┞┟┡┢┦┧┩┪┭┮┱┲┵┶┹┺┽┾╀╁╃",7],
["a741","쬋",4,"쬑쬒쬓쬕쬖쬗쬙",6,"쬢",7],
["a761","쬪",22,"쭂쭃쭄"],
["a781","쭅쭆쭇쭊쭋쭍쭎쭏쭑",6,"쭚쭛쭜쭞",5,"쭥",7,"㎕㎖㎗ℓ㎘㏄㎣㎤㎥㎦㎙",9,"㏊㎍㎎㎏㏏㎈㎉㏈㎧㎨㎰",9,"㎀",4,"㎺",5,"㎐",4,"Ω㏀㏁㎊㎋㎌㏖㏅㎭㎮㎯㏛㎩㎪㎫㎬㏝㏐㏓㏃㏉㏜㏆"],
["a841","쭭",10,"쭺",14],
["a861","쮉",18,"쮝",6],
["a881","쮤",19,"쮹",11,"ÆÐªĦ"],
["a8a6","Ĳ"],
["a8a8","ĿŁØŒºÞŦŊ"],
["a8b1","㉠",27,"ⓐ",25,"①",14,"½⅓⅔¼¾⅛⅜⅝⅞"],
["a941","쯅",14,"쯕",10],
["a961","쯠쯡쯢쯣쯥쯦쯨쯪",18],
["a981","쯽",14,"찎찏찑찒찓찕",6,"찞찟찠찣찤æđðħıĳĸŀłøœßþŧŋŉ㈀",27,"⒜",25,"⑴",14,"¹²³⁴ⁿ₁₂₃₄"],
["aa41","찥찦찪찫찭찯찱",6,"찺찿",4,"챆챇챉챊챋챍챎"],
["aa61","챏",4,"챖챚",5,"챡챢챣챥챧챩",6,"챱챲"],
["aa81","챳챴챶",29,"ぁ",82],
["ab41","첔첕첖첗첚첛첝첞첟첡",6,"첪첮",5,"첶첷첹"],
["ab61","첺첻첽",6,"쳆쳈쳊",5,"쳑쳒쳓쳕",5],
["ab81","쳛",8,"쳥",6,"쳭쳮쳯쳱",12,"ァ",85],
["ac41","쳾쳿촀촂",5,"촊촋촍촎촏촑",6,"촚촜촞촟촠"],
["ac61","촡촢촣촥촦촧촩촪촫촭",11,"촺",4],
["ac81","촿",28,"쵝쵞쵟А",5,"ЁЖ",25],
["acd1","а",5,"ёж",25],
["ad41","쵡쵢쵣쵥",6,"쵮쵰쵲",5,"쵹",7],
["ad61","춁",6,"춉",10,"춖춗춙춚춛춝춞춟"],
["ad81","춠춡춢춣춦춨춪",5,"춱",18,"췅"],
["ae41","췆",5,"췍췎췏췑",16],
["ae61","췢",5,"췩췪췫췭췮췯췱",6,"췺췼췾",4],
["ae81","츃츅츆츇츉츊츋츍",6,"츕츖츗츘츚",5,"츢츣츥츦츧츩츪츫"],
["af41","츬츭츮츯츲츴츶",19],
["af61","칊",13,"칚칛칝칞칢",5,"칪칬"],
["af81","칮",5,"칶칷칹칺칻칽",6,"캆캈캊",5,"캒캓캕캖캗캙"],
["b041","캚",5,"캢캦",5,"캮",12],
["b061","캻",5,"컂",19],
["b081","컖",13,"컦컧컩컪컭",6,"컶컺",5,"가각간갇갈갉갊감",7,"같",4,"갠갤갬갭갯갰갱갸갹갼걀걋걍걔걘걜거걱건걷걸걺검겁것겄겅겆겉겊겋게겐겔겜겝겟겠겡겨격겪견겯결겸겹겻겼경곁계곈곌곕곗고곡곤곧골곪곬곯곰곱곳공곶과곽관괄괆"],
["b141","켂켃켅켆켇켉",6,"켒켔켖",5,"켝켞켟켡켢켣"],
["b161","켥",6,"켮켲",5,"켹",11],
["b181","콅",14,"콖콗콙콚콛콝",6,"콦콨콪콫콬괌괍괏광괘괜괠괩괬괭괴괵괸괼굄굅굇굉교굔굘굡굣구국군굳굴굵굶굻굼굽굿궁궂궈궉권궐궜궝궤궷귀귁귄귈귐귑귓규균귤그극근귿글긁금급긋긍긔기긱긴긷길긺김깁깃깅깆깊까깍깎깐깔깖깜깝깟깠깡깥깨깩깬깰깸"],
["b241","콭콮콯콲콳콵콶콷콹",6,"쾁쾂쾃쾄쾆",5,"쾍"],
["b261","쾎",18,"쾢",5,"쾩"],
["b281","쾪",5,"쾱",18,"쿅",6,"깹깻깼깽꺄꺅꺌꺼꺽꺾껀껄껌껍껏껐껑께껙껜껨껫껭껴껸껼꼇꼈꼍꼐꼬꼭꼰꼲꼴꼼꼽꼿꽁꽂꽃꽈꽉꽐꽜꽝꽤꽥꽹꾀꾄꾈꾐꾑꾕꾜꾸꾹꾼꿀꿇꿈꿉꿋꿍꿎꿔꿜꿨꿩꿰꿱꿴꿸뀀뀁뀄뀌뀐뀔뀜뀝뀨끄끅끈끊끌끎끓끔끕끗끙"],
["b341","쿌",19,"쿢쿣쿥쿦쿧쿩"],
["b361","쿪",5,"쿲쿴쿶",5,"쿽쿾쿿퀁퀂퀃퀅",5],
["b381","퀋",5,"퀒",5,"퀙",19,"끝끼끽낀낄낌낍낏낑나낙낚난낟날낡낢남납낫",4,"낱낳내낵낸낼냄냅냇냈냉냐냑냔냘냠냥너넉넋넌널넒넓넘넙넛넜넝넣네넥넨넬넴넵넷넸넹녀녁년녈념녑녔녕녘녜녠노녹논놀놂놈놉놋농높놓놔놘놜놨뇌뇐뇔뇜뇝"],
["b441","퀮",5,"퀶퀷퀹퀺퀻퀽",6,"큆큈큊",5],
["b461","큑큒큓큕큖큗큙",6,"큡",10,"큮큯"],
["b481","큱큲큳큵",6,"큾큿킀킂",18,"뇟뇨뇩뇬뇰뇹뇻뇽누눅눈눋눌눔눕눗눙눠눴눼뉘뉜뉠뉨뉩뉴뉵뉼늄늅늉느늑는늘늙늚늠늡늣능늦늪늬늰늴니닉닌닐닒님닙닛닝닢다닥닦단닫",4,"닳담답닷",4,"닿대댁댄댈댐댑댓댔댕댜더덕덖던덛덜덞덟덤덥"],
["b541","킕",14,"킦킧킩킪킫킭",5],
["b561","킳킶킸킺",5,"탂탃탅탆탇탊",5,"탒탖",4],
["b581","탛탞탟탡탢탣탥",6,"탮탲",5,"탹",11,"덧덩덫덮데덱덴델뎀뎁뎃뎄뎅뎌뎐뎔뎠뎡뎨뎬도독돈돋돌돎돐돔돕돗동돛돝돠돤돨돼됐되된될됨됩됫됴두둑둔둘둠둡둣둥둬뒀뒈뒝뒤뒨뒬뒵뒷뒹듀듄듈듐듕드득든듣들듦듬듭듯등듸디딕딘딛딜딤딥딧딨딩딪따딱딴딸"],
["b641","턅",7,"턎",17],
["b661","턠",15,"턲턳턵턶턷턹턻턼턽턾"],
["b681","턿텂텆",5,"텎텏텑텒텓텕",6,"텞텠텢",5,"텩텪텫텭땀땁땃땄땅땋때땍땐땔땜땝땟땠땡떠떡떤떨떪떫떰떱떳떴떵떻떼떽뗀뗄뗌뗍뗏뗐뗑뗘뗬또똑똔똘똥똬똴뙈뙤뙨뚜뚝뚠뚤뚫뚬뚱뛔뛰뛴뛸뜀뜁뜅뜨뜩뜬뜯뜰뜸뜹뜻띄띈띌띔띕띠띤띨띰띱띳띵라락란랄람랍랏랐랑랒랖랗"],
["b741","텮",13,"텽",6,"톅톆톇톉톊"],
["b761","톋",20,"톢톣톥톦톧"],
["b781","톩",6,"톲톴톶톷톸톹톻톽톾톿퇁",14,"래랙랜랠램랩랫랬랭랴략랸럇량러럭런럴럼럽럿렀렁렇레렉렌렐렘렙렛렝려력련렬렴렵렷렸령례롄롑롓로록론롤롬롭롯롱롸롼뢍뢨뢰뢴뢸룀룁룃룅료룐룔룝룟룡루룩룬룰룸룹룻룽뤄뤘뤠뤼뤽륀륄륌륏륑류륙륜률륨륩"],
["b841","퇐",7,"퇙",17],
["b861","퇫",8,"퇵퇶퇷퇹",13],
["b881","툈툊",5,"툑",24,"륫륭르륵른를름릅릇릉릊릍릎리릭린릴림립릿링마막만많",4,"맘맙맛망맞맡맣매맥맨맬맴맵맷맸맹맺먀먁먈먕머먹먼멀멂멈멉멋멍멎멓메멕멘멜멤멥멧멨멩며멱면멸몃몄명몇몌모목몫몬몰몲몸몹못몽뫄뫈뫘뫙뫼"],
["b941","툪툫툮툯툱툲툳툵",6,"툾퉀퉂",5,"퉉퉊퉋퉌"],
["b961","퉍",14,"퉝",6,"퉥퉦퉧퉨"],
["b981","퉩",22,"튂튃튅튆튇튉튊튋튌묀묄묍묏묑묘묜묠묩묫무묵묶문묻물묽묾뭄뭅뭇뭉뭍뭏뭐뭔뭘뭡뭣뭬뮈뮌뮐뮤뮨뮬뮴뮷므믄믈믐믓미믹민믿밀밂밈밉밋밌밍및밑바",4,"받",4,"밤밥밧방밭배백밴밸뱀뱁뱃뱄뱅뱉뱌뱍뱐뱝버벅번벋벌벎범법벗"],
["ba41","튍튎튏튒튓튔튖",5,"튝튞튟튡튢튣튥",6,"튭"],
["ba61","튮튯튰튲",5,"튺튻튽튾틁틃",4,"틊틌",5],
["ba81","틒틓틕틖틗틙틚틛틝",6,"틦",9,"틲틳틵틶틷틹틺벙벚베벡벤벧벨벰벱벳벴벵벼벽변별볍볏볐병볕볘볜보복볶본볼봄봅봇봉봐봔봤봬뵀뵈뵉뵌뵐뵘뵙뵤뵨부북분붇불붉붊붐붑붓붕붙붚붜붤붰붸뷔뷕뷘뷜뷩뷰뷴뷸븀븃븅브븍븐블븜븝븟비빅빈빌빎빔빕빗빙빚빛빠빡빤"],
["bb41","틻",4,"팂팄팆",5,"팏팑팒팓팕팗",4,"팞팢팣"],
["bb61","팤팦팧팪팫팭팮팯팱",6,"팺팾",5,"퍆퍇퍈퍉"],
["bb81","퍊",31,"빨빪빰빱빳빴빵빻빼빽뺀뺄뺌뺍뺏뺐뺑뺘뺙뺨뻐뻑뻔뻗뻘뻠뻣뻤뻥뻬뼁뼈뼉뼘뼙뼛뼜뼝뽀뽁뽄뽈뽐뽑뽕뾔뾰뿅뿌뿍뿐뿔뿜뿟뿡쀼쁑쁘쁜쁠쁨쁩삐삑삔삘삠삡삣삥사삭삯산삳살삵삶삼삽삿샀상샅새색샌샐샘샙샛샜생샤"],
["bc41","퍪",17,"퍾퍿펁펂펃펅펆펇"],
["bc61","펈펉펊펋펎펒",5,"펚펛펝펞펟펡",6,"펪펬펮"],
["bc81","펯",4,"펵펶펷펹펺펻펽",6,"폆폇폊",5,"폑",5,"샥샨샬샴샵샷샹섀섄섈섐섕서",4,"섣설섦섧섬섭섯섰성섶세섹센셀셈셉셋셌셍셔셕션셜셤셥셧셨셩셰셴셸솅소속솎손솔솖솜솝솟송솥솨솩솬솰솽쇄쇈쇌쇔쇗쇘쇠쇤쇨쇰쇱쇳쇼쇽숀숄숌숍숏숑수숙순숟술숨숩숫숭"],
["bd41","폗폙",7,"폢폤",7,"폮폯폱폲폳폵폶폷"],
["bd61","폸폹폺폻폾퐀퐂",5,"퐉",13],
["bd81","퐗",5,"퐞",25,"숯숱숲숴쉈쉐쉑쉔쉘쉠쉥쉬쉭쉰쉴쉼쉽쉿슁슈슉슐슘슛슝스슥슨슬슭슴습슷승시식신싣실싫심십싯싱싶싸싹싻싼쌀쌈쌉쌌쌍쌓쌔쌕쌘쌜쌤쌥쌨쌩썅써썩썬썰썲썸썹썼썽쎄쎈쎌쏀쏘쏙쏜쏟쏠쏢쏨쏩쏭쏴쏵쏸쐈쐐쐤쐬쐰"],
["be41","퐸",7,"푁푂푃푅",14],
["be61","푔",7,"푝푞푟푡푢푣푥",7,"푮푰푱푲"],
["be81","푳",4,"푺푻푽푾풁풃",4,"풊풌풎",5,"풕",8,"쐴쐼쐽쑈쑤쑥쑨쑬쑴쑵쑹쒀쒔쒜쒸쒼쓩쓰쓱쓴쓸쓺쓿씀씁씌씐씔씜씨씩씬씰씸씹씻씽아악안앉않알앍앎앓암압앗았앙앝앞애액앤앨앰앱앳앴앵야약얀얄얇얌얍얏양얕얗얘얜얠얩어억언얹얻얼얽얾엄",6,"엌엎"],
["bf41","풞",10,"풪",14],
["bf61","풹",18,"퓍퓎퓏퓑퓒퓓퓕"],
["bf81","퓖",5,"퓝퓞퓠",7,"퓩퓪퓫퓭퓮퓯퓱",6,"퓹퓺퓼에엑엔엘엠엡엣엥여역엮연열엶엷염",5,"옅옆옇예옌옐옘옙옛옜오옥온올옭옮옰옳옴옵옷옹옻와왁완왈왐왑왓왔왕왜왝왠왬왯왱외왹왼욀욈욉욋욍요욕욘욜욤욥욧용우욱운울욹욺움웁웃웅워웍원월웜웝웠웡웨"],
["c041","퓾",5,"픅픆픇픉픊픋픍",6,"픖픘",5],
["c061","픞",25],
["c081","픸픹픺픻픾픿핁핂핃핅",6,"핎핐핒",5,"핚핛핝핞핟핡핢핣웩웬웰웸웹웽위윅윈윌윔윕윗윙유육윤율윰윱윳융윷으윽은을읊음읍읏응",7,"읜읠읨읫이익인일읽읾잃임입잇있잉잊잎자작잔잖잗잘잚잠잡잣잤장잦재잭잰잴잼잽잿쟀쟁쟈쟉쟌쟎쟐쟘쟝쟤쟨쟬저적전절젊"],
["c141","핤핦핧핪핬핮",5,"핶핷핹핺핻핽",6,"햆햊햋"],
["c161","햌햍햎햏햑",19,"햦햧"],
["c181","햨",31,"점접젓정젖제젝젠젤젬젭젯젱져젼졀졈졉졌졍졔조족존졸졺좀좁좃종좆좇좋좌좍좔좝좟좡좨좼좽죄죈죌죔죕죗죙죠죡죤죵주죽준줄줅줆줌줍줏중줘줬줴쥐쥑쥔쥘쥠쥡쥣쥬쥰쥴쥼즈즉즌즐즘즙즛증지직진짇질짊짐집짓"],
["c241","헊헋헍헎헏헑헓",4,"헚헜헞",5,"헦헧헩헪헫헭헮"],
["c261","헯",4,"헶헸헺",5,"혂혃혅혆혇혉",6,"혒"],
["c281","혖",5,"혝혞혟혡혢혣혥",7,"혮",9,"혺혻징짖짙짚짜짝짠짢짤짧짬짭짯짰짱째짹짼쨀쨈쨉쨋쨌쨍쨔쨘쨩쩌쩍쩐쩔쩜쩝쩟쩠쩡쩨쩽쪄쪘쪼쪽쫀쫄쫌쫍쫏쫑쫓쫘쫙쫠쫬쫴쬈쬐쬔쬘쬠쬡쭁쭈쭉쭌쭐쭘쭙쭝쭤쭸쭹쮜쮸쯔쯤쯧쯩찌찍찐찔찜찝찡찢찧차착찬찮찰참찹찻"],
["c341","혽혾혿홁홂홃홄홆홇홊홌홎홏홐홒홓홖홗홙홚홛홝",4],
["c361","홢",4,"홨홪",5,"홲홳홵",11],
["c381","횁횂횄횆",5,"횎횏횑횒횓횕",7,"횞횠횢",5,"횩횪찼창찾채책챈챌챔챕챗챘챙챠챤챦챨챰챵처척천철첨첩첫첬청체첵첸첼쳄쳅쳇쳉쳐쳔쳤쳬쳰촁초촉촌촐촘촙촛총촤촨촬촹최쵠쵤쵬쵭쵯쵱쵸춈추축춘출춤춥춧충춰췄췌췐취췬췰췸췹췻췽츄츈츌츔츙츠측츤츨츰츱츳층"],
["c441","횫횭횮횯횱",7,"횺횼",7,"훆훇훉훊훋"],
["c461","훍훎훏훐훒훓훕훖훘훚",5,"훡훢훣훥훦훧훩",4],
["c481","훮훯훱훲훳훴훶",5,"훾훿휁휂휃휅",11,"휒휓휔치칙친칟칠칡침칩칫칭카칵칸칼캄캅캇캉캐캑캔캘캠캡캣캤캥캬캭컁커컥컨컫컬컴컵컷컸컹케켁켄켈켐켑켓켕켜켠켤켬켭켯켰켱켸코콕콘콜콤콥콧콩콰콱콴콸쾀쾅쾌쾡쾨쾰쿄쿠쿡쿤쿨쿰쿱쿳쿵쿼퀀퀄퀑퀘퀭퀴퀵퀸퀼"],
["c541","휕휖휗휚휛휝휞휟휡",6,"휪휬휮",5,"휶휷휹"],
["c561","휺휻휽",6,"흅흆흈흊",5,"흒흓흕흚",4],
["c581","흟흢흤흦흧흨흪흫흭흮흯흱흲흳흵",6,"흾흿힀힂",5,"힊힋큄큅큇큉큐큔큘큠크큭큰클큼큽킁키킥킨킬킴킵킷킹타탁탄탈탉탐탑탓탔탕태택탠탤탬탭탯탰탱탸턍터턱턴털턺텀텁텃텄텅테텍텐텔템텝텟텡텨텬텼톄톈토톡톤톨톰톱톳통톺톼퇀퇘퇴퇸툇툉툐투툭툰툴툼툽툿퉁퉈퉜"],
["c641","힍힎힏힑",6,"힚힜힞",5],
["c6a1","퉤튀튁튄튈튐튑튕튜튠튤튬튱트특튼튿틀틂틈틉틋틔틘틜틤틥티틱틴틸팀팁팃팅파팍팎판팔팖팜팝팟팠팡팥패팩팬팰팸팹팻팼팽퍄퍅퍼퍽펀펄펌펍펏펐펑페펙펜펠펨펩펫펭펴편펼폄폅폈평폐폘폡폣포폭폰폴폼폽폿퐁"],
["c7a1","퐈퐝푀푄표푠푤푭푯푸푹푼푿풀풂품풉풋풍풔풩퓌퓐퓔퓜퓟퓨퓬퓰퓸퓻퓽프픈플픔픕픗피픽핀필핌핍핏핑하학한할핥함합핫항해핵핸핼햄햅햇했행햐향허헉헌헐헒험헙헛헝헤헥헨헬헴헵헷헹혀혁현혈혐협혓혔형혜혠"],
["c8a1","혤혭호혹혼홀홅홈홉홋홍홑화확환활홧황홰홱홴횃횅회획횐횔횝횟횡효횬횰횹횻후훅훈훌훑훔훗훙훠훤훨훰훵훼훽휀휄휑휘휙휜휠휨휩휫휭휴휵휸휼흄흇흉흐흑흔흖흗흘흙흠흡흣흥흩희흰흴흼흽힁히힉힌힐힘힙힛힝"],
["caa1","伽佳假價加可呵哥嘉嫁家暇架枷柯歌珂痂稼苛茄街袈訶賈跏軻迦駕刻却各恪慤殼珏脚覺角閣侃刊墾奸姦干幹懇揀杆柬桿澗癎看磵稈竿簡肝艮艱諫間乫喝曷渴碣竭葛褐蝎鞨勘坎堪嵌感憾戡敢柑橄減甘疳監瞰紺邯鑑鑒龕"],
["cba1","匣岬甲胛鉀閘剛堈姜岡崗康强彊慷江畺疆糠絳綱羌腔舡薑襁講鋼降鱇介价個凱塏愷愾慨改槪漑疥皆盖箇芥蓋豈鎧開喀客坑更粳羹醵倨去居巨拒据據擧渠炬祛距踞車遽鉅鋸乾件健巾建愆楗腱虔蹇鍵騫乞傑杰桀儉劍劒檢"],
["cca1","瞼鈐黔劫怯迲偈憩揭擊格檄激膈覡隔堅牽犬甄絹繭肩見譴遣鵑抉決潔結缺訣兼慊箝謙鉗鎌京俓倞傾儆勁勍卿坰境庚徑慶憬擎敬景暻更梗涇炅烱璟璥瓊痙硬磬竟競絅經耕耿脛莖警輕逕鏡頃頸驚鯨係啓堺契季屆悸戒桂械"],
["cda1","棨溪界癸磎稽系繫繼計誡谿階鷄古叩告呱固姑孤尻庫拷攷故敲暠枯槁沽痼皐睾稿羔考股膏苦苽菰藁蠱袴誥賈辜錮雇顧高鼓哭斛曲梏穀谷鵠困坤崑昆梱棍滾琨袞鯤汨滑骨供公共功孔工恐恭拱控攻珙空蚣貢鞏串寡戈果瓜"],
["cea1","科菓誇課跨過鍋顆廓槨藿郭串冠官寬慣棺款灌琯瓘管罐菅觀貫關館刮恝括适侊光匡壙廣曠洸炚狂珖筐胱鑛卦掛罫乖傀塊壞怪愧拐槐魁宏紘肱轟交僑咬喬嬌嶠巧攪敎校橋狡皎矯絞翹膠蕎蛟較轎郊餃驕鮫丘久九仇俱具勾"],
["cfa1","區口句咎嘔坵垢寇嶇廐懼拘救枸柩構歐毆毬求溝灸狗玖球瞿矩究絿耉臼舅舊苟衢謳購軀逑邱鉤銶駒驅鳩鷗龜國局菊鞠鞫麴君窘群裙軍郡堀屈掘窟宮弓穹窮芎躬倦券勸卷圈拳捲權淃眷厥獗蕨蹶闕机櫃潰詭軌饋句晷歸貴"],
["d0a1","鬼龜叫圭奎揆槻珪硅窺竅糾葵規赳逵閨勻均畇筠菌鈞龜橘克剋劇戟棘極隙僅劤勤懃斤根槿瑾筋芹菫覲謹近饉契今妗擒昑檎琴禁禽芩衾衿襟金錦伋及急扱汲級給亘兢矜肯企伎其冀嗜器圻基埼夔奇妓寄岐崎己幾忌技旗旣"],
["d1a1","朞期杞棋棄機欺氣汽沂淇玘琦琪璂璣畸畿碁磯祁祇祈祺箕紀綺羈耆耭肌記譏豈起錡錤飢饑騎騏驥麒緊佶吉拮桔金喫儺喇奈娜懦懶拏拿癩",5,"那樂",4,"諾酪駱亂卵暖欄煖爛蘭難鸞捏捺南嵐枏楠湳濫男藍襤拉"],
["d2a1","納臘蠟衲囊娘廊",4,"乃來內奈柰耐冷女年撚秊念恬拈捻寧寗努勞奴弩怒擄櫓爐瑙盧",5,"駑魯",10,"濃籠聾膿農惱牢磊腦賂雷尿壘",7,"嫩訥杻紐勒",5,"能菱陵尼泥匿溺多茶"],
["d3a1","丹亶但單團壇彖斷旦檀段湍短端簞緞蛋袒鄲鍛撻澾獺疸達啖坍憺擔曇淡湛潭澹痰聃膽蕁覃談譚錟沓畓答踏遝唐堂塘幢戇撞棠當糖螳黨代垈坮大對岱帶待戴擡玳臺袋貸隊黛宅德悳倒刀到圖堵塗導屠島嶋度徒悼挑掉搗桃"],
["d4a1","棹櫂淘渡滔濤燾盜睹禱稻萄覩賭跳蹈逃途道都鍍陶韜毒瀆牘犢獨督禿篤纛讀墩惇敦旽暾沌焞燉豚頓乭突仝冬凍動同憧東桐棟洞潼疼瞳童胴董銅兜斗杜枓痘竇荳讀豆逗頭屯臀芚遁遯鈍得嶝橙燈登等藤謄鄧騰喇懶拏癩羅"],
["d5a1","蘿螺裸邏樂洛烙珞絡落諾酪駱丹亂卵欄欒瀾爛蘭鸞剌辣嵐擥攬欖濫籃纜藍襤覽拉臘蠟廊朗浪狼琅瑯螂郞來崍徠萊冷掠略亮倆兩凉梁樑粮粱糧良諒輛量侶儷勵呂廬慮戾旅櫚濾礪藜蠣閭驢驪麗黎力曆歷瀝礫轢靂憐戀攣漣"],
["d6a1","煉璉練聯蓮輦連鍊冽列劣洌烈裂廉斂殮濂簾獵令伶囹寧岺嶺怜玲笭羚翎聆逞鈴零靈領齡例澧禮醴隷勞怒撈擄櫓潞瀘爐盧老蘆虜路輅露魯鷺鹵碌祿綠菉錄鹿麓論壟弄朧瀧瓏籠聾儡瀨牢磊賂賚賴雷了僚寮廖料燎療瞭聊蓼"],
["d7a1","遼鬧龍壘婁屢樓淚漏瘻累縷蔞褸鏤陋劉旒柳榴流溜瀏琉瑠留瘤硫謬類六戮陸侖倫崙淪綸輪律慄栗率隆勒肋凜凌楞稜綾菱陵俚利厘吏唎履悧李梨浬犁狸理璃異痢籬罹羸莉裏裡里釐離鯉吝潾燐璘藺躪隣鱗麟林淋琳臨霖砬"],
["d8a1","立笠粒摩瑪痲碼磨馬魔麻寞幕漠膜莫邈万卍娩巒彎慢挽晩曼滿漫灣瞞萬蔓蠻輓饅鰻唜抹末沫茉襪靺亡妄忘忙望網罔芒茫莽輞邙埋妹媒寐昧枚梅每煤罵買賣邁魅脈貊陌驀麥孟氓猛盲盟萌冪覓免冕勉棉沔眄眠綿緬面麵滅"],
["d9a1","蔑冥名命明暝椧溟皿瞑茗蓂螟酩銘鳴袂侮冒募姆帽慕摸摹暮某模母毛牟牡瑁眸矛耗芼茅謀謨貌木沐牧目睦穆鶩歿沒夢朦蒙卯墓妙廟描昴杳渺猫竗苗錨務巫憮懋戊拇撫无楙武毋無珷畝繆舞茂蕪誣貿霧鵡墨默們刎吻問文"],
["daa1","汶紊紋聞蚊門雯勿沕物味媚尾嵋彌微未梶楣渼湄眉米美薇謎迷靡黴岷悶愍憫敏旻旼民泯玟珉緡閔密蜜謐剝博拍搏撲朴樸泊珀璞箔粕縛膊舶薄迫雹駁伴半反叛拌搬攀斑槃泮潘班畔瘢盤盼磐磻礬絆般蟠返頒飯勃拔撥渤潑"],
["dba1","發跋醱鉢髮魃倣傍坊妨尨幇彷房放方旁昉枋榜滂磅紡肪膀舫芳蒡蚌訪謗邦防龐倍俳北培徘拜排杯湃焙盃背胚裴裵褙賠輩配陪伯佰帛柏栢白百魄幡樊煩燔番磻繁蕃藩飜伐筏罰閥凡帆梵氾汎泛犯範范法琺僻劈壁擘檗璧癖"],
["dca1","碧蘗闢霹便卞弁變辨辯邊別瞥鱉鼈丙倂兵屛幷昞昺柄棅炳甁病秉竝輧餠騈保堡報寶普步洑湺潽珤甫菩補褓譜輔伏僕匐卜宓復服福腹茯蔔複覆輹輻馥鰒本乶俸奉封峯峰捧棒烽熢琫縫蓬蜂逢鋒鳳不付俯傅剖副否咐埠夫婦"],
["dda1","孚孵富府復扶敷斧浮溥父符簿缶腐腑膚艀芙莩訃負賦賻赴趺部釜阜附駙鳧北分吩噴墳奔奮忿憤扮昐汾焚盆粉糞紛芬賁雰不佛弗彿拂崩朋棚硼繃鵬丕備匕匪卑妃婢庇悲憊扉批斐枇榧比毖毗毘沸泌琵痺砒碑秕秘粃緋翡肥"],
["dea1","脾臂菲蜚裨誹譬費鄙非飛鼻嚬嬪彬斌檳殯浜濱瀕牝玭貧賓頻憑氷聘騁乍事些仕伺似使俟僿史司唆嗣四士奢娑寫寺射巳師徙思捨斜斯柶査梭死沙泗渣瀉獅砂社祀祠私篩紗絲肆舍莎蓑蛇裟詐詞謝賜赦辭邪飼駟麝削數朔索"],
["dfa1","傘刪山散汕珊産疝算蒜酸霰乷撒殺煞薩三參杉森渗芟蔘衫揷澁鈒颯上傷像償商喪嘗孀尙峠常床庠廂想桑橡湘爽牀狀相祥箱翔裳觴詳象賞霜塞璽賽嗇塞穡索色牲生甥省笙墅壻嶼序庶徐恕抒捿敍暑曙書栖棲犀瑞筮絮緖署"],
["e0a1","胥舒薯西誓逝鋤黍鼠夕奭席惜昔晳析汐淅潟石碩蓆釋錫仙僊先善嬋宣扇敾旋渲煽琁瑄璇璿癬禪線繕羨腺膳船蘚蟬詵跣選銑鐥饍鮮卨屑楔泄洩渫舌薛褻設說雪齧剡暹殲纖蟾贍閃陝攝涉燮葉城姓宬性惺成星晟猩珹盛省筬"],
["e1a1","聖聲腥誠醒世勢歲洗稅笹細說貰召嘯塑宵小少巢所掃搔昭梳沼消溯瀟炤燒甦疏疎瘙笑篠簫素紹蔬蕭蘇訴逍遡邵銷韶騷俗屬束涑粟續謖贖速孫巽損蓀遜飡率宋悚松淞訟誦送頌刷殺灑碎鎖衰釗修受嗽囚垂壽嫂守岫峀帥愁"],
["e2a1","戍手授搜收數樹殊水洙漱燧狩獸琇璲瘦睡秀穗竪粹綏綬繡羞脩茱蒐蓚藪袖誰讐輸遂邃酬銖銹隋隧隨雖需須首髓鬚叔塾夙孰宿淑潚熟琡璹肅菽巡徇循恂旬栒楯橓殉洵淳珣盾瞬筍純脣舜荀蓴蕣詢諄醇錞順馴戌術述鉥崇崧"],
["e3a1","嵩瑟膝蝨濕拾習褶襲丞乘僧勝升承昇繩蠅陞侍匙嘶始媤尸屎屍市弑恃施是時枾柴猜矢示翅蒔蓍視試詩諡豕豺埴寔式息拭植殖湜熄篒蝕識軾食飾伸侁信呻娠宸愼新晨燼申神紳腎臣莘薪藎蜃訊身辛辰迅失室實悉審尋心沁"],
["e4a1","沈深瀋甚芯諶什十拾雙氏亞俄兒啞娥峨我牙芽莪蛾衙訝阿雅餓鴉鵝堊岳嶽幄惡愕握樂渥鄂鍔顎鰐齷安岸按晏案眼雁鞍顔鮟斡謁軋閼唵岩巖庵暗癌菴闇壓押狎鴨仰央怏昻殃秧鴦厓哀埃崖愛曖涯碍艾隘靄厄扼掖液縊腋額"],
["e5a1","櫻罌鶯鸚也倻冶夜惹揶椰爺耶若野弱掠略約若葯蒻藥躍亮佯兩凉壤孃恙揚攘敭暘梁楊樣洋瀁煬痒瘍禳穰糧羊良襄諒讓釀陽量養圄御於漁瘀禦語馭魚齬億憶抑檍臆偃堰彦焉言諺孼蘖俺儼嚴奄掩淹嶪業円予余勵呂女如廬"],
["e6a1","旅歟汝濾璵礖礪與艅茹輿轝閭餘驪麗黎亦力域役易曆歷疫繹譯轢逆驛嚥堧姸娟宴年延憐戀捐挻撚椽沇沿涎涓淵演漣烟然煙煉燃燕璉硏硯秊筵緣練縯聯衍軟輦蓮連鉛鍊鳶列劣咽悅涅烈熱裂說閱厭廉念捻染殮炎焰琰艶苒"],
["e7a1","簾閻髥鹽曄獵燁葉令囹塋寧嶺嶸影怜映暎楹榮永泳渶潁濚瀛瀯煐營獰玲瑛瑩瓔盈穎纓羚聆英詠迎鈴鍈零霙靈領乂倪例刈叡曳汭濊猊睿穢芮藝蘂禮裔詣譽豫醴銳隸霓預五伍俉傲午吾吳嗚塢墺奧娛寤悟惡懊敖旿晤梧汚澳"],
["e8a1","烏熬獒筽蜈誤鰲鼇屋沃獄玉鈺溫瑥瘟穩縕蘊兀壅擁瓮甕癰翁邕雍饔渦瓦窩窪臥蛙蝸訛婉完宛梡椀浣玩琓琬碗緩翫脘腕莞豌阮頑曰往旺枉汪王倭娃歪矮外嵬巍猥畏了僚僥凹堯夭妖姚寥寮尿嶢拗搖撓擾料曜樂橈燎燿瑤療"],
["e9a1","窈窯繇繞耀腰蓼蟯要謠遙遼邀饒慾欲浴縟褥辱俑傭冗勇埇墉容庸慂榕涌湧溶熔瑢用甬聳茸蓉踊鎔鏞龍于佑偶優又友右宇寓尤愚憂旴牛玗瑀盂祐禑禹紆羽芋藕虞迂遇郵釪隅雨雩勖彧旭昱栯煜稶郁頊云暈橒殞澐熉耘芸蕓"],
["eaa1","運隕雲韻蔚鬱亐熊雄元原員圓園垣媛嫄寃怨愿援沅洹湲源爰猿瑗苑袁轅遠阮院願鴛月越鉞位偉僞危圍委威尉慰暐渭爲瑋緯胃萎葦蔿蝟衛褘謂違韋魏乳侑儒兪劉唯喩孺宥幼幽庾悠惟愈愉揄攸有杻柔柚柳楡楢油洧流游溜"],
["eba1","濡猶猷琉瑜由留癒硫紐維臾萸裕誘諛諭踰蹂遊逾遺酉釉鍮類六堉戮毓肉育陸倫允奫尹崙淪潤玧胤贇輪鈗閏律慄栗率聿戎瀜絨融隆垠恩慇殷誾銀隱乙吟淫蔭陰音飮揖泣邑凝應膺鷹依倚儀宜意懿擬椅毅疑矣義艤薏蟻衣誼"],
["eca1","議醫二以伊利吏夷姨履已弛彛怡易李梨泥爾珥理異痍痢移罹而耳肄苡荑裏裡貽貳邇里離飴餌匿溺瀷益翊翌翼謚人仁刃印吝咽因姻寅引忍湮燐璘絪茵藺蚓認隣靭靷鱗麟一佚佾壹日溢逸鎰馹任壬妊姙恁林淋稔臨荏賃入卄"],
["eda1","立笠粒仍剩孕芿仔刺咨姉姿子字孜恣慈滋炙煮玆瓷疵磁紫者自茨蔗藉諮資雌作勺嚼斫昨灼炸爵綽芍酌雀鵲孱棧殘潺盞岑暫潛箴簪蠶雜丈仗匠場墻壯奬將帳庄張掌暲杖樟檣欌漿牆狀獐璋章粧腸臟臧莊葬蔣薔藏裝贓醬長"],
["eea1","障再哉在宰才材栽梓渽滓災縡裁財載齋齎爭箏諍錚佇低儲咀姐底抵杵楮樗沮渚狙猪疽箸紵苧菹著藷詛貯躇這邸雎齟勣吊嫡寂摘敵滴狄炙的積笛籍績翟荻謫賊赤跡蹟迪迹適鏑佃佺傳全典前剪塡塼奠專展廛悛戰栓殿氈澱"],
["efa1","煎琠田甸畑癲筌箋箭篆纏詮輾轉鈿銓錢鐫電顚顫餞切截折浙癤竊節絶占岾店漸点粘霑鮎點接摺蝶丁井亭停偵呈姃定幀庭廷征情挺政整旌晶晸柾楨檉正汀淀淨渟湞瀞炡玎珽町睛碇禎程穽精綎艇訂諪貞鄭酊釘鉦鋌錠霆靖"],
["f0a1","靜頂鼎制劑啼堤帝弟悌提梯濟祭第臍薺製諸蹄醍除際霽題齊俎兆凋助嘲弔彫措操早晁曺曹朝條棗槽漕潮照燥爪璪眺祖祚租稠窕粗糟組繰肇藻蚤詔調趙躁造遭釣阻雕鳥族簇足鏃存尊卒拙猝倧宗從悰慫棕淙琮種終綜縱腫"],
["f1a1","踪踵鍾鐘佐坐左座挫罪主住侏做姝胄呪周嗾奏宙州廚晝朱柱株注洲湊澍炷珠疇籌紂紬綢舟蛛註誅走躊輳週酎酒鑄駐竹粥俊儁准埈寯峻晙樽浚準濬焌畯竣蠢逡遵雋駿茁中仲衆重卽櫛楫汁葺增憎曾拯烝甑症繒蒸證贈之只"],
["f2a1","咫地址志持指摯支旨智枝枳止池沚漬知砥祉祗紙肢脂至芝芷蜘誌識贄趾遲直稙稷織職唇嗔塵振搢晉晋桭榛殄津溱珍瑨璡畛疹盡眞瞋秦縉縝臻蔯袗診賑軫辰進鎭陣陳震侄叱姪嫉帙桎瓆疾秩窒膣蛭質跌迭斟朕什執潗緝輯"],
["f3a1","鏶集徵懲澄且侘借叉嗟嵯差次此磋箚茶蹉車遮捉搾着窄錯鑿齪撰澯燦璨瓚竄簒纂粲纘讚贊鑽餐饌刹察擦札紮僭參塹慘慙懺斬站讒讖倉倡創唱娼廠彰愴敞昌昶暢槍滄漲猖瘡窓脹艙菖蒼債埰寀寨彩採砦綵菜蔡采釵冊柵策"],
["f4a1","責凄妻悽處倜刺剔尺慽戚拓擲斥滌瘠脊蹠陟隻仟千喘天川擅泉淺玔穿舛薦賤踐遷釧闡阡韆凸哲喆徹撤澈綴輟轍鐵僉尖沾添甛瞻簽籤詹諂堞妾帖捷牒疊睫諜貼輒廳晴淸聽菁請靑鯖切剃替涕滯締諦逮遞體初剿哨憔抄招梢"],
["f5a1","椒楚樵炒焦硝礁礎秒稍肖艸苕草蕉貂超酢醋醮促囑燭矗蜀觸寸忖村邨叢塚寵悤憁摠總聰蔥銃撮催崔最墜抽推椎楸樞湫皺秋芻萩諏趨追鄒酋醜錐錘鎚雛騶鰍丑畜祝竺筑築縮蓄蹙蹴軸逐春椿瑃出朮黜充忠沖蟲衝衷悴膵萃"],
["f6a1","贅取吹嘴娶就炊翠聚脆臭趣醉驟鷲側仄厠惻測層侈値嗤峙幟恥梔治淄熾痔痴癡稚穉緇緻置致蚩輜雉馳齒則勅飭親七柒漆侵寢枕沈浸琛砧針鍼蟄秤稱快他咤唾墮妥惰打拖朶楕舵陀馱駝倬卓啄坼度托拓擢晫柝濁濯琢琸託"],
["f7a1","鐸呑嘆坦彈憚歎灘炭綻誕奪脫探眈耽貪塔搭榻宕帑湯糖蕩兌台太怠態殆汰泰笞胎苔跆邰颱宅擇澤撑攄兎吐土討慟桶洞痛筒統通堆槌腿褪退頹偸套妬投透鬪慝特闖坡婆巴把播擺杷波派爬琶破罷芭跛頗判坂板版瓣販辦鈑"],
["f8a1","阪八叭捌佩唄悖敗沛浿牌狽稗覇貝彭澎烹膨愎便偏扁片篇編翩遍鞭騙貶坪平枰萍評吠嬖幣廢弊斃肺蔽閉陛佈包匍匏咆哺圃布怖抛抱捕暴泡浦疱砲胞脯苞葡蒲袍褒逋鋪飽鮑幅暴曝瀑爆輻俵剽彪慓杓標漂瓢票表豹飇飄驃"],
["f9a1","品稟楓諷豊風馮彼披疲皮被避陂匹弼必泌珌畢疋筆苾馝乏逼下何厦夏廈昰河瑕荷蝦賀遐霞鰕壑學虐謔鶴寒恨悍旱汗漢澣瀚罕翰閑閒限韓割轄函含咸啣喊檻涵緘艦銜陷鹹合哈盒蛤閤闔陜亢伉姮嫦巷恒抗杭桁沆港缸肛航"],
["faa1","行降項亥偕咳垓奚孩害懈楷海瀣蟹解該諧邂駭骸劾核倖幸杏荇行享向嚮珦鄕響餉饗香噓墟虛許憲櫶獻軒歇險驗奕爀赫革俔峴弦懸晛泫炫玄玹現眩睍絃絢縣舷衒見賢鉉顯孑穴血頁嫌俠協夾峽挾浹狹脅脇莢鋏頰亨兄刑型"],
["fba1","形泂滎瀅灐炯熒珩瑩荊螢衡逈邢鎣馨兮彗惠慧暳蕙蹊醯鞋乎互呼壕壺好岵弧戶扈昊晧毫浩淏湖滸澔濠濩灝狐琥瑚瓠皓祜糊縞胡芦葫蒿虎號蝴護豪鎬頀顥惑或酷婚昏混渾琿魂忽惚笏哄弘汞泓洪烘紅虹訌鴻化和嬅樺火畵"],
["fca1","禍禾花華話譁貨靴廓擴攫確碻穫丸喚奐宦幻患換歡晥桓渙煥環紈還驩鰥活滑猾豁闊凰幌徨恍惶愰慌晃晄榥況湟滉潢煌璜皇篁簧荒蝗遑隍黃匯回廻徊恢悔懷晦會檜淮澮灰獪繪膾茴蛔誨賄劃獲宖橫鐄哮嚆孝效斅曉梟涍淆"],
["fda1","爻肴酵驍侯候厚后吼喉嗅帿後朽煦珝逅勛勳塤壎焄熏燻薰訓暈薨喧暄煊萱卉喙毁彙徽揮暉煇諱輝麾休携烋畦虧恤譎鷸兇凶匈洶胸黑昕欣炘痕吃屹紇訖欠欽歆吸恰洽翕興僖凞喜噫囍姬嬉希憙憘戱晞曦熙熹熺犧禧稀羲詰"]
]
[
["0","\u0000",127],
["a140","　，、。．‧；：？！︰…‥﹐﹑﹒·﹔﹕﹖﹗｜–︱—︳╴︴﹏（）︵︶｛｝︷︸〔〕︹︺【】︻︼《》︽︾〈〉︿﹀「」﹁﹂『』﹃﹄﹙﹚"],
["a1a1","﹛﹜﹝﹞‘’“”〝〞‵′＃＆＊※§〃○●△▲◎☆★◇◆□■▽▼㊣℅¯￣＿ˍ﹉﹊﹍﹎﹋﹌﹟﹠﹡＋－×÷±√＜＞＝≦≧≠∞≒≡﹢",4,"～∩∪⊥∠∟⊿㏒㏑∫∮∵∴♀♂⊕⊙↑↓←→↖↗↙↘∥∣／"],
["a240","＼∕﹨＄￥〒￠￡％＠℃℉﹩﹪﹫㏕㎜㎝㎞㏎㎡㎎㎏㏄°兙兛兞兝兡兣嗧瓩糎▁",7,"▏▎▍▌▋▊▉┼┴┬┤├▔─│▕┌┐└┘╭"],
["a2a1","╮╰╯═╞╪╡◢◣◥◤╱╲╳０",9,"Ⅰ",9,"〡",8,"十卄卅Ａ",25,"ａ",21],
["a340","ｗｘｙｚΑ",16,"Σ",6,"α",16,"σ",6,"ㄅ",10],
["a3a1","ㄐ",25,"˙ˉˊˇˋ"],
["a3e1","€"],
["a440","一乙丁七乃九了二人儿入八几刀刁力匕十卜又三下丈上丫丸凡久么也乞于亡兀刃勺千叉口土士夕大女子孑孓寸小尢尸山川工己已巳巾干廾弋弓才"],
["a4a1","丑丐不中丰丹之尹予云井互五亢仁什仃仆仇仍今介仄元允內六兮公冗凶分切刈勻勾勿化匹午升卅卞厄友及反壬天夫太夭孔少尤尺屯巴幻廿弔引心戈戶手扎支文斗斤方日曰月木欠止歹毋比毛氏水火爪父爻片牙牛犬王丙"],
["a540","世丕且丘主乍乏乎以付仔仕他仗代令仙仞充兄冉冊冬凹出凸刊加功包匆北匝仟半卉卡占卯卮去可古右召叮叩叨叼司叵叫另只史叱台句叭叻四囚外"],
["a5a1","央失奴奶孕它尼巨巧左市布平幼弁弘弗必戊打扔扒扑斥旦朮本未末札正母民氐永汁汀氾犯玄玉瓜瓦甘生用甩田由甲申疋白皮皿目矛矢石示禾穴立丞丟乒乓乩亙交亦亥仿伉伙伊伕伍伐休伏仲件任仰仳份企伋光兇兆先全"],
["a640","共再冰列刑划刎刖劣匈匡匠印危吉吏同吊吐吁吋各向名合吃后吆吒因回囝圳地在圭圬圯圩夙多夷夸妄奸妃好她如妁字存宇守宅安寺尖屹州帆并年"],
["a6a1","式弛忙忖戎戌戍成扣扛托收早旨旬旭曲曳有朽朴朱朵次此死氖汝汗汙江池汐汕污汛汍汎灰牟牝百竹米糸缶羊羽老考而耒耳聿肉肋肌臣自至臼舌舛舟艮色艾虫血行衣西阡串亨位住佇佗佞伴佛何估佐佑伽伺伸佃佔似但佣"],
["a740","作你伯低伶余佝佈佚兌克免兵冶冷別判利刪刨劫助努劬匣即卵吝吭吞吾否呎吧呆呃吳呈呂君吩告吹吻吸吮吵吶吠吼呀吱含吟听囪困囤囫坊坑址坍"],
["a7a1","均坎圾坐坏圻壯夾妝妒妨妞妣妙妖妍妤妓妊妥孝孜孚孛完宋宏尬局屁尿尾岐岑岔岌巫希序庇床廷弄弟彤形彷役忘忌志忍忱快忸忪戒我抄抗抖技扶抉扭把扼找批扳抒扯折扮投抓抑抆改攻攸旱更束李杏材村杜杖杞杉杆杠"],
["a840","杓杗步每求汞沙沁沈沉沅沛汪決沐汰沌汨沖沒汽沃汲汾汴沆汶沍沔沘沂灶灼災灸牢牡牠狄狂玖甬甫男甸皂盯矣私秀禿究系罕肖肓肝肘肛肚育良芒"],
["a8a1","芋芍見角言谷豆豕貝赤走足身車辛辰迂迆迅迄巡邑邢邪邦那酉釆里防阮阱阪阬並乖乳事些亞享京佯依侍佳使佬供例來侃佰併侈佩佻侖佾侏侑佺兔兒兕兩具其典冽函刻券刷刺到刮制剁劾劻卒協卓卑卦卷卸卹取叔受味呵"],
["a940","咖呸咕咀呻呷咄咒咆呼咐呱呶和咚呢周咋命咎固垃坷坪坩坡坦坤坼夜奉奇奈奄奔妾妻委妹妮姑姆姐姍始姓姊妯妳姒姅孟孤季宗定官宜宙宛尚屈居"],
["a9a1","屆岷岡岸岩岫岱岳帘帚帖帕帛帑幸庚店府底庖延弦弧弩往征彿彼忝忠忽念忿怏怔怯怵怖怪怕怡性怩怫怛或戕房戾所承拉拌拄抿拂抹拒招披拓拔拋拈抨抽押拐拙拇拍抵拚抱拘拖拗拆抬拎放斧於旺昔易昌昆昂明昀昏昕昊"],
["aa40","昇服朋杭枋枕東果杳杷枇枝林杯杰板枉松析杵枚枓杼杪杲欣武歧歿氓氛泣注泳沱泌泥河沽沾沼波沫法泓沸泄油況沮泗泅泱沿治泡泛泊沬泯泜泖泠"],
["aaa1","炕炎炒炊炙爬爭爸版牧物狀狎狙狗狐玩玨玟玫玥甽疝疙疚的盂盲直知矽社祀祁秉秈空穹竺糾罔羌羋者肺肥肢肱股肫肩肴肪肯臥臾舍芳芝芙芭芽芟芹花芬芥芯芸芣芰芾芷虎虱初表軋迎返近邵邸邱邶采金長門阜陀阿阻附"],
["ab40","陂隹雨青非亟亭亮信侵侯便俠俑俏保促侶俘俟俊俗侮俐俄係俚俎俞侷兗冒冑冠剎剃削前剌剋則勇勉勃勁匍南卻厚叛咬哀咨哎哉咸咦咳哇哂咽咪品"],
["aba1","哄哈咯咫咱咻咩咧咿囿垂型垠垣垢城垮垓奕契奏奎奐姜姘姿姣姨娃姥姪姚姦威姻孩宣宦室客宥封屎屏屍屋峙峒巷帝帥帟幽庠度建弈弭彥很待徊律徇後徉怒思怠急怎怨恍恰恨恢恆恃恬恫恪恤扁拜挖按拼拭持拮拽指拱拷"],
["ac40","拯括拾拴挑挂政故斫施既春昭映昧是星昨昱昤曷柿染柱柔某柬架枯柵柩柯柄柑枴柚查枸柏柞柳枰柙柢柝柒歪殃殆段毒毗氟泉洋洲洪流津洌洱洞洗"],
["aca1","活洽派洶洛泵洹洧洸洩洮洵洎洫炫為炳炬炯炭炸炮炤爰牲牯牴狩狠狡玷珊玻玲珍珀玳甚甭畏界畎畋疫疤疥疢疣癸皆皇皈盈盆盃盅省盹相眉看盾盼眇矜砂研砌砍祆祉祈祇禹禺科秒秋穿突竿竽籽紂紅紀紉紇約紆缸美羿耄"],
["ad40","耐耍耑耶胖胥胚胃胄背胡胛胎胞胤胝致舢苧范茅苣苛苦茄若茂茉苒苗英茁苜苔苑苞苓苟苯茆虐虹虻虺衍衫要觔計訂訃貞負赴赳趴軍軌述迦迢迪迥"],
["ada1","迭迫迤迨郊郎郁郃酋酊重閂限陋陌降面革韋韭音頁風飛食首香乘亳倌倍倣俯倦倥俸倩倖倆值借倚倒們俺倀倔倨俱倡個候倘俳修倭倪俾倫倉兼冤冥冢凍凌准凋剖剜剔剛剝匪卿原厝叟哨唐唁唷哼哥哲唆哺唔哩哭員唉哮哪"],
["ae40","哦唧唇哽唏圃圄埂埔埋埃堉夏套奘奚娑娘娜娟娛娓姬娠娣娩娥娌娉孫屘宰害家宴宮宵容宸射屑展屐峭峽峻峪峨峰島崁峴差席師庫庭座弱徒徑徐恙"],
["aea1","恣恥恐恕恭恩息悄悟悚悍悔悌悅悖扇拳挈拿捎挾振捕捂捆捏捉挺捐挽挪挫挨捍捌效敉料旁旅時晉晏晃晒晌晅晁書朔朕朗校核案框桓根桂桔栩梳栗桌桑栽柴桐桀格桃株桅栓栘桁殊殉殷氣氧氨氦氤泰浪涕消涇浦浸海浙涓"],
["af40","浬涉浮浚浴浩涌涊浹涅浥涔烊烘烤烙烈烏爹特狼狹狽狸狷玆班琉珮珠珪珞畔畝畜畚留疾病症疲疳疽疼疹痂疸皋皰益盍盎眩真眠眨矩砰砧砸砝破砷"],
["afa1","砥砭砠砟砲祕祐祠祟祖神祝祗祚秤秣秧租秦秩秘窄窈站笆笑粉紡紗紋紊素索純紐紕級紜納紙紛缺罟羔翅翁耆耘耕耙耗耽耿胱脂胰脅胭胴脆胸胳脈能脊胼胯臭臬舀舐航舫舨般芻茫荒荔荊茸荐草茵茴荏茲茹茶茗荀茱茨荃"],
["b040","虔蚊蚪蚓蚤蚩蚌蚣蚜衰衷袁袂衽衹記訐討訌訕訊託訓訖訏訑豈豺豹財貢起躬軒軔軏辱送逆迷退迺迴逃追逅迸邕郡郝郢酒配酌釘針釗釜釙閃院陣陡"],
["b0a1","陛陝除陘陞隻飢馬骨高鬥鬲鬼乾偺偽停假偃偌做偉健偶偎偕偵側偷偏倏偯偭兜冕凰剪副勒務勘動匐匏匙匿區匾參曼商啪啦啄啞啡啃啊唱啖問啕唯啤唸售啜唬啣唳啁啗圈國圉域堅堊堆埠埤基堂堵執培夠奢娶婁婉婦婪婀"],
["b140","娼婢婚婆婊孰寇寅寄寂宿密尉專將屠屜屝崇崆崎崛崖崢崑崩崔崙崤崧崗巢常帶帳帷康庸庶庵庾張強彗彬彩彫得徙從徘御徠徜恿患悉悠您惋悴惦悽"],
["b1a1","情悻悵惜悼惘惕惆惟悸惚惇戚戛扈掠控捲掖探接捷捧掘措捱掩掉掃掛捫推掄授掙採掬排掏掀捻捩捨捺敝敖救教敗啟敏敘敕敔斜斛斬族旋旌旎晝晚晤晨晦晞曹勗望梁梯梢梓梵桿桶梱梧梗械梃棄梭梆梅梔條梨梟梡梂欲殺"],
["b240","毫毬氫涎涼淳淙液淡淌淤添淺清淇淋涯淑涮淞淹涸混淵淅淒渚涵淚淫淘淪深淮淨淆淄涪淬涿淦烹焉焊烽烯爽牽犁猜猛猖猓猙率琅琊球理現琍瓠瓶"],
["b2a1","瓷甜產略畦畢異疏痔痕疵痊痍皎盔盒盛眷眾眼眶眸眺硫硃硎祥票祭移窒窕笠笨笛第符笙笞笮粒粗粕絆絃統紮紹紼絀細紳組累終紲紱缽羞羚翌翎習耜聊聆脯脖脣脫脩脰脤舂舵舷舶船莎莞莘荸莢莖莽莫莒莊莓莉莠荷荻荼"],
["b340","莆莧處彪蛇蛀蚶蛄蚵蛆蛋蚱蚯蛉術袞袈被袒袖袍袋覓規訪訝訣訥許設訟訛訢豉豚販責貫貨貪貧赧赦趾趺軛軟這逍通逗連速逝逐逕逞造透逢逖逛途"],
["b3a1","部郭都酗野釵釦釣釧釭釩閉陪陵陳陸陰陴陶陷陬雀雪雩章竟頂頃魚鳥鹵鹿麥麻傢傍傅備傑傀傖傘傚最凱割剴創剩勞勝勛博厥啻喀喧啼喊喝喘喂喜喪喔喇喋喃喳單喟唾喲喚喻喬喱啾喉喫喙圍堯堪場堤堰報堡堝堠壹壺奠"],
["b440","婷媚婿媒媛媧孳孱寒富寓寐尊尋就嵌嵐崴嵇巽幅帽幀幃幾廊廁廂廄弼彭復循徨惑惡悲悶惠愜愣惺愕惰惻惴慨惱愎惶愉愀愒戟扉掣掌描揀揩揉揆揍"],
["b4a1","插揣提握揖揭揮捶援揪換摒揚揹敞敦敢散斑斐斯普晰晴晶景暑智晾晷曾替期朝棺棕棠棘棗椅棟棵森棧棹棒棲棣棋棍植椒椎棉棚楮棻款欺欽殘殖殼毯氮氯氬港游湔渡渲湧湊渠渥渣減湛湘渤湖湮渭渦湯渴湍渺測湃渝渾滋"],
["b540","溉渙湎湣湄湲湩湟焙焚焦焰無然煮焜牌犄犀猶猥猴猩琺琪琳琢琥琵琶琴琯琛琦琨甥甦畫番痢痛痣痙痘痞痠登發皖皓皴盜睏短硝硬硯稍稈程稅稀窘"],
["b5a1","窗窖童竣等策筆筐筒答筍筋筏筑粟粥絞結絨絕紫絮絲絡給絢絰絳善翔翕耋聒肅腕腔腋腑腎脹腆脾腌腓腴舒舜菩萃菸萍菠菅萋菁華菱菴著萊菰萌菌菽菲菊萸萎萄菜萇菔菟虛蛟蛙蛭蛔蛛蛤蛐蛞街裁裂袱覃視註詠評詞証詁"],
["b640","詔詛詐詆訴診訶詖象貂貯貼貳貽賁費賀貴買貶貿貸越超趁跎距跋跚跑跌跛跆軻軸軼辜逮逵週逸進逶鄂郵鄉郾酣酥量鈔鈕鈣鈉鈞鈍鈐鈇鈑閔閏開閑"],
["b6a1","間閒閎隊階隋陽隅隆隍陲隄雁雅雄集雇雯雲韌項順須飧飪飯飩飲飭馮馭黃黍黑亂傭債傲傳僅傾催傷傻傯僇剿剷剽募勦勤勢勣匯嗟嗨嗓嗦嗎嗜嗇嗑嗣嗤嗯嗚嗡嗅嗆嗥嗉園圓塞塑塘塗塚塔填塌塭塊塢塒塋奧嫁嫉嫌媾媽媼"],
["b740","媳嫂媲嵩嵯幌幹廉廈弒彙徬微愚意慈感想愛惹愁愈慎慌慄慍愾愴愧愍愆愷戡戢搓搾搞搪搭搽搬搏搜搔損搶搖搗搆敬斟新暗暉暇暈暖暄暘暍會榔業"],
["b7a1","楚楷楠楔極椰概楊楨楫楞楓楹榆楝楣楛歇歲毀殿毓毽溢溯滓溶滂源溝滇滅溥溘溼溺溫滑準溜滄滔溪溧溴煎煙煩煤煉照煜煬煦煌煥煞煆煨煖爺牒猷獅猿猾瑯瑚瑕瑟瑞瑁琿瑙瑛瑜當畸瘀痰瘁痲痱痺痿痴痳盞盟睛睫睦睞督"],
["b840","睹睪睬睜睥睨睢矮碎碰碗碘碌碉硼碑碓硿祺祿禁萬禽稜稚稠稔稟稞窟窠筷節筠筮筧粱粳粵經絹綑綁綏絛置罩罪署義羨群聖聘肆肄腱腰腸腥腮腳腫"],
["b8a1","腹腺腦舅艇蒂葷落萱葵葦葫葉葬葛萼萵葡董葩葭葆虞虜號蛹蜓蜈蜇蜀蛾蛻蜂蜃蜆蜊衙裟裔裙補裘裝裡裊裕裒覜解詫該詳試詩詰誇詼詣誠話誅詭詢詮詬詹詻訾詨豢貊貉賊資賈賄貲賃賂賅跡跟跨路跳跺跪跤跦躲較載軾輊"],
["b940","辟農運遊道遂達逼違遐遇遏過遍遑逾遁鄒鄗酬酪酩釉鈷鉗鈸鈽鉀鈾鉛鉋鉤鉑鈴鉉鉍鉅鈹鈿鉚閘隘隔隕雍雋雉雊雷電雹零靖靴靶預頑頓頊頒頌飼飴"],
["b9a1","飽飾馳馱馴髡鳩麂鼎鼓鼠僧僮僥僖僭僚僕像僑僱僎僩兢凳劃劂匱厭嗾嘀嘛嘗嗽嘔嘆嘉嘍嘎嗷嘖嘟嘈嘐嗶團圖塵塾境墓墊塹墅塽壽夥夢夤奪奩嫡嫦嫩嫗嫖嫘嫣孵寞寧寡寥實寨寢寤察對屢嶄嶇幛幣幕幗幔廓廖弊彆彰徹慇"],
["ba40","愿態慷慢慣慟慚慘慵截撇摘摔撤摸摟摺摑摧搴摭摻敲斡旗旖暢暨暝榜榨榕槁榮槓構榛榷榻榫榴槐槍榭槌榦槃榣歉歌氳漳演滾漓滴漩漾漠漬漏漂漢"],
["baa1","滿滯漆漱漸漲漣漕漫漯澈漪滬漁滲滌滷熔熙煽熊熄熒爾犒犖獄獐瑤瑣瑪瑰瑭甄疑瘧瘍瘋瘉瘓盡監瞄睽睿睡磁碟碧碳碩碣禎福禍種稱窪窩竭端管箕箋筵算箝箔箏箸箇箄粹粽精綻綰綜綽綾綠緊綴網綱綺綢綿綵綸維緒緇綬"],
["bb40","罰翠翡翟聞聚肇腐膀膏膈膊腿膂臧臺與舔舞艋蓉蒿蓆蓄蒙蒞蒲蒜蓋蒸蓀蓓蒐蒼蓑蓊蜿蜜蜻蜢蜥蜴蜘蝕蜷蜩裳褂裴裹裸製裨褚裯誦誌語誣認誡誓誤"],
["bba1","說誥誨誘誑誚誧豪貍貌賓賑賒赫趙趕跼輔輒輕輓辣遠遘遜遣遙遞遢遝遛鄙鄘鄞酵酸酷酴鉸銀銅銘銖鉻銓銜銨鉼銑閡閨閩閣閥閤隙障際雌雒需靼鞅韶頗領颯颱餃餅餌餉駁骯骰髦魁魂鳴鳶鳳麼鼻齊億儀僻僵價儂儈儉儅凜"],
["bc40","劇劈劉劍劊勰厲嘮嘻嘹嘲嘿嘴嘩噓噎噗噴嘶嘯嘰墀墟增墳墜墮墩墦奭嬉嫻嬋嫵嬌嬈寮寬審寫層履嶝嶔幢幟幡廢廚廟廝廣廠彈影德徵慶慧慮慝慕憂"],
["bca1","慼慰慫慾憧憐憫憎憬憚憤憔憮戮摩摯摹撞撲撈撐撰撥撓撕撩撒撮播撫撚撬撙撢撳敵敷數暮暫暴暱樣樟槨樁樞標槽模樓樊槳樂樅槭樑歐歎殤毅毆漿潼澄潑潦潔澆潭潛潸潮澎潺潰潤澗潘滕潯潠潟熟熬熱熨牖犛獎獗瑩璋璃"],
["bd40","瑾璀畿瘠瘩瘟瘤瘦瘡瘢皚皺盤瞎瞇瞌瞑瞋磋磅確磊碾磕碼磐稿稼穀稽稷稻窯窮箭箱範箴篆篇篁箠篌糊締練緯緻緘緬緝編緣線緞緩綞緙緲緹罵罷羯"],
["bda1","翩耦膛膜膝膠膚膘蔗蔽蔚蓮蔬蔭蔓蔑蔣蔡蔔蓬蔥蓿蔆螂蝴蝶蝠蝦蝸蝨蝙蝗蝌蝓衛衝褐複褒褓褕褊誼諒談諄誕請諸課諉諂調誰論諍誶誹諛豌豎豬賠賞賦賤賬賭賢賣賜質賡赭趟趣踫踐踝踢踏踩踟踡踞躺輝輛輟輩輦輪輜輞"],
["be40","輥適遮遨遭遷鄰鄭鄧鄱醇醉醋醃鋅銻銷鋪銬鋤鋁銳銼鋒鋇鋰銲閭閱霄霆震霉靠鞍鞋鞏頡頫頜颳養餓餒餘駝駐駟駛駑駕駒駙骷髮髯鬧魅魄魷魯鴆鴉"],
["bea1","鴃麩麾黎墨齒儒儘儔儐儕冀冪凝劑劓勳噙噫噹噩噤噸噪器噥噱噯噬噢噶壁墾壇壅奮嬝嬴學寰導彊憲憑憩憊懍憶憾懊懈戰擅擁擋撻撼據擄擇擂操撿擒擔撾整曆曉暹曄曇暸樽樸樺橙橫橘樹橄橢橡橋橇樵機橈歙歷氅濂澱澡"],
["bf40","濃澤濁澧澳激澹澶澦澠澴熾燉燐燒燈燕熹燎燙燜燃燄獨璜璣璘璟璞瓢甌甍瘴瘸瘺盧盥瞠瞞瞟瞥磨磚磬磧禦積穎穆穌穋窺篙簑築篤篛篡篩篦糕糖縊"],
["bfa1","縑縈縛縣縞縝縉縐罹羲翰翱翮耨膳膩膨臻興艘艙蕊蕙蕈蕨蕩蕃蕉蕭蕪蕞螃螟螞螢融衡褪褲褥褫褡親覦諦諺諫諱謀諜諧諮諾謁謂諷諭諳諶諼豫豭貓賴蹄踱踴蹂踹踵輻輯輸輳辨辦遵遴選遲遼遺鄴醒錠錶鋸錳錯錢鋼錫錄錚"],
["c040","錐錦錡錕錮錙閻隧隨險雕霎霑霖霍霓霏靛靜靦鞘頰頸頻頷頭頹頤餐館餞餛餡餚駭駢駱骸骼髻髭鬨鮑鴕鴣鴦鴨鴒鴛默黔龍龜優償儡儲勵嚎嚀嚐嚅嚇"],
["c0a1","嚏壕壓壑壎嬰嬪嬤孺尷屨嶼嶺嶽嶸幫彌徽應懂懇懦懋戲戴擎擊擘擠擰擦擬擱擢擭斂斃曙曖檀檔檄檢檜櫛檣橾檗檐檠歜殮毚氈濘濱濟濠濛濤濫濯澀濬濡濩濕濮濰燧營燮燦燥燭燬燴燠爵牆獰獲璩環璦璨癆療癌盪瞳瞪瞰瞬"],
["c140","瞧瞭矯磷磺磴磯礁禧禪穗窿簇簍篾篷簌篠糠糜糞糢糟糙糝縮績繆縷縲繃縫總縱繅繁縴縹繈縵縿縯罄翳翼聱聲聰聯聳臆臃膺臂臀膿膽臉膾臨舉艱薪"],
["c1a1","薄蕾薜薑薔薯薛薇薨薊虧蟀蟑螳蟒蟆螫螻螺蟈蟋褻褶襄褸褽覬謎謗謙講謊謠謝謄謐豁谿豳賺賽購賸賻趨蹉蹋蹈蹊轄輾轂轅輿避遽還邁邂邀鄹醣醞醜鍍鎂錨鍵鍊鍥鍋錘鍾鍬鍛鍰鍚鍔闊闋闌闈闆隱隸雖霜霞鞠韓顆颶餵騁"],
["c240","駿鮮鮫鮪鮭鴻鴿麋黏點黜黝黛鼾齋叢嚕嚮壙壘嬸彝懣戳擴擲擾攆擺擻擷斷曜朦檳檬櫃檻檸櫂檮檯歟歸殯瀉瀋濾瀆濺瀑瀏燻燼燾燸獷獵璧璿甕癖癘"],
["c2a1","癒瞽瞿瞻瞼礎禮穡穢穠竄竅簫簧簪簞簣簡糧織繕繞繚繡繒繙罈翹翻職聶臍臏舊藏薩藍藐藉薰薺薹薦蟯蟬蟲蟠覆覲觴謨謹謬謫豐贅蹙蹣蹦蹤蹟蹕軀轉轍邇邃邈醫醬釐鎔鎊鎖鎢鎳鎮鎬鎰鎘鎚鎗闔闖闐闕離雜雙雛雞霤鞣鞦"],
["c340","鞭韹額顏題顎顓颺餾餿餽餮馥騎髁鬃鬆魏魎魍鯊鯉鯽鯈鯀鵑鵝鵠黠鼕鼬儳嚥壞壟壢寵龐廬懲懷懶懵攀攏曠曝櫥櫝櫚櫓瀛瀟瀨瀚瀝瀕瀘爆爍牘犢獸"],
["c3a1","獺璽瓊瓣疇疆癟癡矇礙禱穫穩簾簿簸簽簷籀繫繭繹繩繪羅繳羶羹羸臘藩藝藪藕藤藥藷蟻蠅蠍蟹蟾襠襟襖襞譁譜識證譚譎譏譆譙贈贊蹼蹲躇蹶蹬蹺蹴轔轎辭邊邋醱醮鏡鏑鏟鏃鏈鏜鏝鏖鏢鏍鏘鏤鏗鏨關隴難霪霧靡韜韻類"],
["c440","願顛颼饅饉騖騙鬍鯨鯧鯖鯛鶉鵡鵲鵪鵬麒麗麓麴勸嚨嚷嚶嚴嚼壤孀孃孽寶巉懸懺攘攔攙曦朧櫬瀾瀰瀲爐獻瓏癢癥礦礪礬礫竇競籌籃籍糯糰辮繽繼"],
["c4a1","纂罌耀臚艦藻藹蘑藺蘆蘋蘇蘊蠔蠕襤覺觸議譬警譯譟譫贏贍躉躁躅躂醴釋鐘鐃鏽闡霰飄饒饑馨騫騰騷騵鰓鰍鹹麵黨鼯齟齣齡儷儸囁囀囂夔屬巍懼懾攝攜斕曩櫻欄櫺殲灌爛犧瓖瓔癩矓籐纏續羼蘗蘭蘚蠣蠢蠡蠟襪襬覽譴"],
["c540","護譽贓躊躍躋轟辯醺鐮鐳鐵鐺鐸鐲鐫闢霸霹露響顧顥饗驅驃驀騾髏魔魑鰭鰥鶯鶴鷂鶸麝黯鼙齜齦齧儼儻囈囊囉孿巔巒彎懿攤權歡灑灘玀瓤疊癮癬"],
["c5a1","禳籠籟聾聽臟襲襯觼讀贖贗躑躓轡酈鑄鑑鑒霽霾韃韁顫饕驕驍髒鬚鱉鰱鰾鰻鷓鷗鼴齬齪龔囌巖戀攣攫攪曬欐瓚竊籤籣籥纓纖纔臢蘸蘿蠱變邐邏鑣鑠鑤靨顯饜驚驛驗髓體髑鱔鱗鱖鷥麟黴囑壩攬灞癱癲矗罐羈蠶蠹衢讓讒"],
["c640","讖艷贛釀鑪靂靈靄韆顰驟鬢魘鱟鷹鷺鹼鹽鼇齷齲廳欖灣籬籮蠻觀躡釁鑲鑰顱饞髖鬣黌灤矚讚鑷韉驢驥纜讜躪釅鑽鑾鑼鱷鱸黷豔鑿鸚爨驪鬱鸛鸞籲"],
["c940","乂乜凵匚厂万丌乇亍囗兀屮彳丏冇与丮亓仂仉仈冘勼卬厹圠夃夬尐巿旡殳毌气爿丱丼仨仜仩仡仝仚刌匜卌圢圣夗夯宁宄尒尻屴屳帄庀庂忉戉扐氕"],
["c9a1","氶汃氿氻犮犰玊禸肊阞伎优伬仵伔仱伀价伈伝伂伅伢伓伄仴伒冱刓刉刐劦匢匟卍厊吇囡囟圮圪圴夼妀奼妅奻奾奷奿孖尕尥屼屺屻屾巟幵庄异弚彴忕忔忏扜扞扤扡扦扢扙扠扚扥旯旮朾朹朸朻机朿朼朳氘汆汒汜汏汊汔汋"],
["ca40","汌灱牞犴犵玎甪癿穵网艸艼芀艽艿虍襾邙邗邘邛邔阢阤阠阣佖伻佢佉体佤伾佧佒佟佁佘伭伳伿佡冏冹刜刞刡劭劮匉卣卲厎厏吰吷吪呔呅吙吜吥吘"],
["caa1","吽呏呁吨吤呇囮囧囥坁坅坌坉坋坒夆奀妦妘妠妗妎妢妐妏妧妡宎宒尨尪岍岏岈岋岉岒岊岆岓岕巠帊帎庋庉庌庈庍弅弝彸彶忒忑忐忭忨忮忳忡忤忣忺忯忷忻怀忴戺抃抌抎抏抔抇扱扻扺扰抁抈扷扽扲扴攷旰旴旳旲旵杅杇"],
["cb40","杙杕杌杈杝杍杚杋毐氙氚汸汧汫沄沋沏汱汯汩沚汭沇沕沜汦汳汥汻沎灴灺牣犿犽狃狆狁犺狅玕玗玓玔玒町甹疔疕皁礽耴肕肙肐肒肜芐芏芅芎芑芓"],
["cba1","芊芃芄豸迉辿邟邡邥邞邧邠阰阨阯阭丳侘佼侅佽侀侇佶佴侉侄佷佌侗佪侚佹侁佸侐侜侔侞侒侂侕佫佮冞冼冾刵刲刳剆刱劼匊匋匼厒厔咇呿咁咑咂咈呫呺呾呥呬呴呦咍呯呡呠咘呣呧呤囷囹坯坲坭坫坱坰坶垀坵坻坳坴坢"],
["cc40","坨坽夌奅妵妺姏姎妲姌姁妶妼姃姖妱妽姀姈妴姇孢孥宓宕屄屇岮岤岠岵岯岨岬岟岣岭岢岪岧岝岥岶岰岦帗帔帙弨弢弣弤彔徂彾彽忞忥怭怦怙怲怋"],
["cca1","怴怊怗怳怚怞怬怢怍怐怮怓怑怌怉怜戔戽抭抴拑抾抪抶拊抮抳抯抻抩抰抸攽斨斻昉旼昄昒昈旻昃昋昍昅旽昑昐曶朊枅杬枎枒杶杻枘枆构杴枍枌杺枟枑枙枃杽极杸杹枔欥殀歾毞氝沓泬泫泮泙沶泔沭泧沷泐泂沺泃泆泭泲"],
["cd40","泒泝沴沊沝沀泞泀洰泍泇沰泹泏泩泑炔炘炅炓炆炄炑炖炂炚炃牪狖狋狘狉狜狒狔狚狌狑玤玡玭玦玢玠玬玝瓝瓨甿畀甾疌疘皯盳盱盰盵矸矼矹矻矺"],
["cda1","矷祂礿秅穸穻竻籵糽耵肏肮肣肸肵肭舠芠苀芫芚芘芛芵芧芮芼芞芺芴芨芡芩苂芤苃芶芢虰虯虭虮豖迒迋迓迍迖迕迗邲邴邯邳邰阹阽阼阺陃俍俅俓侲俉俋俁俔俜俙侻侳俛俇俖侺俀侹俬剄剉勀勂匽卼厗厖厙厘咺咡咭咥哏"],
["ce40","哃茍咷咮哖咶哅哆咠呰咼咢咾呲哞咰垵垞垟垤垌垗垝垛垔垘垏垙垥垚垕壴复奓姡姞姮娀姱姝姺姽姼姶姤姲姷姛姩姳姵姠姾姴姭宨屌峐峘峌峗峋峛"],
["cea1","峞峚峉峇峊峖峓峔峏峈峆峎峟峸巹帡帢帣帠帤庰庤庢庛庣庥弇弮彖徆怷怹恔恲恞恅恓恇恉恛恌恀恂恟怤恄恘恦恮扂扃拏挍挋拵挎挃拫拹挏挌拸拶挀挓挔拺挕拻拰敁敃斪斿昶昡昲昵昜昦昢昳昫昺昝昴昹昮朏朐柁柲柈枺"],
["cf40","柜枻柸柘柀枷柅柫柤柟枵柍枳柷柶柮柣柂枹柎柧柰枲柼柆柭柌枮柦柛柺柉柊柃柪柋欨殂殄殶毖毘毠氠氡洨洴洭洟洼洿洒洊泚洳洄洙洺洚洑洀洝浂"],
["cfa1","洁洘洷洃洏浀洇洠洬洈洢洉洐炷炟炾炱炰炡炴炵炩牁牉牊牬牰牳牮狊狤狨狫狟狪狦狣玅珌珂珈珅玹玶玵玴珫玿珇玾珃珆玸珋瓬瓮甮畇畈疧疪癹盄眈眃眄眅眊盷盻盺矧矨砆砑砒砅砐砏砎砉砃砓祊祌祋祅祄秕种秏秖秎窀"],
["d040","穾竑笀笁籺籸籹籿粀粁紃紈紁罘羑羍羾耇耎耏耔耷胘胇胠胑胈胂胐胅胣胙胜胊胕胉胏胗胦胍臿舡芔苙苾苹茇苨茀苕茺苫苖苴苬苡苲苵茌苻苶苰苪"],
["d0a1","苤苠苺苳苭虷虴虼虳衁衎衧衪衩觓訄訇赲迣迡迮迠郱邽邿郕郅邾郇郋郈釔釓陔陏陑陓陊陎倞倅倇倓倢倰倛俵俴倳倷倬俶俷倗倜倠倧倵倯倱倎党冔冓凊凄凅凈凎剡剚剒剞剟剕剢勍匎厞唦哢唗唒哧哳哤唚哿唄唈哫唑唅哱"],
["d140","唊哻哷哸哠唎唃唋圁圂埌堲埕埒垺埆垽垼垸垶垿埇埐垹埁夎奊娙娖娭娮娕娏娗娊娞娳孬宧宭宬尃屖屔峬峿峮峱峷崀峹帩帨庨庮庪庬弳弰彧恝恚恧"],
["d1a1","恁悢悈悀悒悁悝悃悕悛悗悇悜悎戙扆拲挐捖挬捄捅挶捃揤挹捋捊挼挩捁挴捘捔捙挭捇挳捚捑挸捗捀捈敊敆旆旃旄旂晊晟晇晑朒朓栟栚桉栲栳栻桋桏栖栱栜栵栫栭栯桎桄栴栝栒栔栦栨栮桍栺栥栠欬欯欭欱欴歭肂殈毦毤"],
["d240","毨毣毢毧氥浺浣浤浶洍浡涒浘浢浭浯涑涍淯浿涆浞浧浠涗浰浼浟涂涘洯浨涋浾涀涄洖涃浻浽浵涐烜烓烑烝烋缹烢烗烒烞烠烔烍烅烆烇烚烎烡牂牸"],
["d2a1","牷牶猀狺狴狾狶狳狻猁珓珙珥珖玼珧珣珩珜珒珛珔珝珚珗珘珨瓞瓟瓴瓵甡畛畟疰痁疻痄痀疿疶疺皊盉眝眛眐眓眒眣眑眕眙眚眢眧砣砬砢砵砯砨砮砫砡砩砳砪砱祔祛祏祜祓祒祑秫秬秠秮秭秪秜秞秝窆窉窅窋窌窊窇竘笐"],
["d340","笄笓笅笏笈笊笎笉笒粄粑粊粌粈粍粅紞紝紑紎紘紖紓紟紒紏紌罜罡罞罠罝罛羖羒翃翂翀耖耾耹胺胲胹胵脁胻脀舁舯舥茳茭荄茙荑茥荖茿荁茦茜茢"],
["d3a1","荂荎茛茪茈茼荍茖茤茠茷茯茩荇荅荌荓茞茬荋茧荈虓虒蚢蚨蚖蚍蚑蚞蚇蚗蚆蚋蚚蚅蚥蚙蚡蚧蚕蚘蚎蚝蚐蚔衃衄衭衵衶衲袀衱衿衯袃衾衴衼訒豇豗豻貤貣赶赸趵趷趶軑軓迾迵适迿迻逄迼迶郖郠郙郚郣郟郥郘郛郗郜郤酐"],
["d440","酎酏釕釢釚陜陟隼飣髟鬯乿偰偪偡偞偠偓偋偝偲偈偍偁偛偊偢倕偅偟偩偫偣偤偆偀偮偳偗偑凐剫剭剬剮勖勓匭厜啵啶唼啍啐唴唪啑啢唶唵唰啒啅"],
["d4a1","唌唲啥啎唹啈唭唻啀啋圊圇埻堔埢埶埜埴堀埭埽堈埸堋埳埏堇埮埣埲埥埬埡堎埼堐埧堁堌埱埩埰堍堄奜婠婘婕婧婞娸娵婭婐婟婥婬婓婤婗婃婝婒婄婛婈媎娾婍娹婌婰婩婇婑婖婂婜孲孮寁寀屙崞崋崝崚崠崌崨崍崦崥崏"],
["d540","崰崒崣崟崮帾帴庱庴庹庲庳弶弸徛徖徟悊悐悆悾悰悺惓惔惏惤惙惝惈悱惛悷惊悿惃惍惀挲捥掊掂捽掽掞掭掝掗掫掎捯掇掐据掯捵掜捭掮捼掤挻掟"],
["d5a1","捸掅掁掑掍捰敓旍晥晡晛晙晜晢朘桹梇梐梜桭桮梮梫楖桯梣梬梩桵桴梲梏桷梒桼桫桲梪梀桱桾梛梖梋梠梉梤桸桻梑梌梊桽欶欳欷欸殑殏殍殎殌氪淀涫涴涳湴涬淩淢涷淶淔渀淈淠淟淖涾淥淜淝淛淴淊涽淭淰涺淕淂淏淉"],
["d640","淐淲淓淽淗淍淣涻烺焍烷焗烴焌烰焄烳焐烼烿焆焓焀烸烶焋焂焎牾牻牼牿猝猗猇猑猘猊猈狿猏猞玈珶珸珵琄琁珽琇琀珺珼珿琌琋珴琈畤畣痎痒痏"],
["d6a1","痋痌痑痐皏皉盓眹眯眭眱眲眴眳眽眥眻眵硈硒硉硍硊硌砦硅硐祤祧祩祪祣祫祡离秺秸秶秷窏窔窐笵筇笴笥笰笢笤笳笘笪笝笱笫笭笯笲笸笚笣粔粘粖粣紵紽紸紶紺絅紬紩絁絇紾紿絊紻紨罣羕羜羝羛翊翋翍翐翑翇翏翉耟"],
["d740","耞耛聇聃聈脘脥脙脛脭脟脬脞脡脕脧脝脢舑舸舳舺舴舲艴莐莣莨莍荺荳莤荴莏莁莕莙荵莔莩荽莃莌莝莛莪莋荾莥莯莈莗莰荿莦莇莮荶莚虙虖蚿蚷"],
["d7a1","蛂蛁蛅蚺蚰蛈蚹蚳蚸蛌蚴蚻蚼蛃蚽蚾衒袉袕袨袢袪袚袑袡袟袘袧袙袛袗袤袬袌袓袎覂觖觙觕訰訧訬訞谹谻豜豝豽貥赽赻赹趼跂趹趿跁軘軞軝軜軗軠軡逤逋逑逜逌逡郯郪郰郴郲郳郔郫郬郩酖酘酚酓酕釬釴釱釳釸釤釹釪"],
["d840","釫釷釨釮镺閆閈陼陭陫陱陯隿靪頄飥馗傛傕傔傞傋傣傃傌傎傝偨傜傒傂傇兟凔匒匑厤厧喑喨喥喭啷噅喢喓喈喏喵喁喣喒喤啽喌喦啿喕喡喎圌堩堷"],
["d8a1","堙堞堧堣堨埵塈堥堜堛堳堿堶堮堹堸堭堬堻奡媯媔媟婺媢媞婸媦婼媥媬媕媮娷媄媊媗媃媋媩婻婽媌媜媏媓媝寪寍寋寔寑寊寎尌尰崷嵃嵫嵁嵋崿崵嵑嵎嵕崳崺嵒崽崱嵙嵂崹嵉崸崼崲崶嵀嵅幄幁彘徦徥徫惉悹惌惢惎惄愔"],
["d940","惲愊愖愅惵愓惸惼惾惁愃愘愝愐惿愄愋扊掔掱掰揎揥揨揯揃撝揳揊揠揶揕揲揵摡揟掾揝揜揄揘揓揂揇揌揋揈揰揗揙攲敧敪敤敜敨敥斌斝斞斮旐旒"],
["d9a1","晼晬晻暀晱晹晪晲朁椌棓椄棜椪棬棪棱椏棖棷棫棤棶椓椐棳棡椇棌椈楰梴椑棯棆椔棸棐棽棼棨椋椊椗棎棈棝棞棦棴棑椆棔棩椕椥棇欹欻欿欼殔殗殙殕殽毰毲毳氰淼湆湇渟湉溈渼渽湅湢渫渿湁湝湳渜渳湋湀湑渻渃渮湞"],
["da40","湨湜湡渱渨湠湱湫渹渢渰湓湥渧湸湤湷湕湹湒湦渵渶湚焠焞焯烻焮焱焣焥焢焲焟焨焺焛牋牚犈犉犆犅犋猒猋猰猢猱猳猧猲猭猦猣猵猌琮琬琰琫琖"],
["daa1","琚琡琭琱琤琣琝琩琠琲瓻甯畯畬痧痚痡痦痝痟痤痗皕皒盚睆睇睄睍睅睊睎睋睌矞矬硠硤硥硜硭硱硪确硰硩硨硞硢祴祳祲祰稂稊稃稌稄窙竦竤筊笻筄筈筌筎筀筘筅粢粞粨粡絘絯絣絓絖絧絪絏絭絜絫絒絔絩絑絟絎缾缿罥"],
["db40","罦羢羠羡翗聑聏聐胾胔腃腊腒腏腇脽腍脺臦臮臷臸臹舄舼舽舿艵茻菏菹萣菀菨萒菧菤菼菶萐菆菈菫菣莿萁菝菥菘菿菡菋菎菖菵菉萉萏菞萑萆菂菳"],
["dba1","菕菺菇菑菪萓菃菬菮菄菻菗菢萛菛菾蛘蛢蛦蛓蛣蛚蛪蛝蛫蛜蛬蛩蛗蛨蛑衈衖衕袺裗袹袸裀袾袶袼袷袽袲褁裉覕覘覗觝觚觛詎詍訹詙詀詗詘詄詅詒詈詑詊詌詏豟貁貀貺貾貰貹貵趄趀趉跘跓跍跇跖跜跏跕跙跈跗跅軯軷軺"],
["dc40","軹軦軮軥軵軧軨軶軫軱軬軴軩逭逴逯鄆鄬鄄郿郼鄈郹郻鄁鄀鄇鄅鄃酡酤酟酢酠鈁鈊鈥鈃鈚鈦鈏鈌鈀鈒釿釽鈆鈄鈧鈂鈜鈤鈙鈗鈅鈖镻閍閌閐隇陾隈"],
["dca1","隉隃隀雂雈雃雱雰靬靰靮頇颩飫鳦黹亃亄亶傽傿僆傮僄僊傴僈僂傰僁傺傱僋僉傶傸凗剺剸剻剼嗃嗛嗌嗐嗋嗊嗝嗀嗔嗄嗩喿嗒喍嗏嗕嗢嗖嗈嗲嗍嗙嗂圔塓塨塤塏塍塉塯塕塎塝塙塥塛堽塣塱壼嫇嫄嫋媺媸媱媵媰媿嫈媻嫆"],
["dd40","媷嫀嫊媴媶嫍媹媐寖寘寙尟尳嵱嵣嵊嵥嵲嵬嵞嵨嵧嵢巰幏幎幊幍幋廅廌廆廋廇彀徯徭惷慉慊愫慅愶愲愮慆愯慏愩慀戠酨戣戥戤揅揱揫搐搒搉搠搤"],
["dda1","搳摃搟搕搘搹搷搢搣搌搦搰搨摁搵搯搊搚摀搥搧搋揧搛搮搡搎敯斒旓暆暌暕暐暋暊暙暔晸朠楦楟椸楎楢楱椿楅楪椹楂楗楙楺楈楉椵楬椳椽楥棰楸椴楩楀楯楄楶楘楁楴楌椻楋椷楜楏楑椲楒椯楻椼歆歅歃歂歈歁殛嗀毻毼"],
["de40","毹毷毸溛滖滈溏滀溟溓溔溠溱溹滆滒溽滁溞滉溷溰滍溦滏溲溾滃滜滘溙溒溎溍溤溡溿溳滐滊溗溮溣煇煔煒煣煠煁煝煢煲煸煪煡煂煘煃煋煰煟煐煓"],
["dea1","煄煍煚牏犍犌犑犐犎猼獂猻猺獀獊獉瑄瑊瑋瑒瑑瑗瑀瑏瑐瑎瑂瑆瑍瑔瓡瓿瓾瓽甝畹畷榃痯瘏瘃痷痾痼痹痸瘐痻痶痭痵痽皙皵盝睕睟睠睒睖睚睩睧睔睙睭矠碇碚碔碏碄碕碅碆碡碃硹碙碀碖硻祼禂祽祹稑稘稙稒稗稕稢稓"],
["df40","稛稐窣窢窞竫筦筤筭筴筩筲筥筳筱筰筡筸筶筣粲粴粯綈綆綀綍絿綅絺綎絻綃絼綌綔綄絽綒罭罫罧罨罬羦羥羧翛翜耡腤腠腷腜腩腛腢腲朡腞腶腧腯"],
["dfa1","腄腡舝艉艄艀艂艅蓱萿葖葶葹蒏蒍葥葑葀蒆葧萰葍葽葚葙葴葳葝蔇葞萷萺萴葺葃葸萲葅萩菙葋萯葂萭葟葰萹葎葌葒葯蓅蒎萻葇萶萳葨葾葄萫葠葔葮葐蜋蜄蛷蜌蛺蛖蛵蝍蛸蜎蜉蜁蛶蜍蜅裖裋裍裎裞裛裚裌裐覅覛觟觥觤"],
["e040","觡觠觢觜触詶誆詿詡訿詷誂誄詵誃誁詴詺谼豋豊豥豤豦貆貄貅賌赨赩趑趌趎趏趍趓趔趐趒跰跠跬跱跮跐跩跣跢跧跲跫跴輆軿輁輀輅輇輈輂輋遒逿"],
["e0a1","遄遉逽鄐鄍鄏鄑鄖鄔鄋鄎酮酯鉈鉒鈰鈺鉦鈳鉥鉞銃鈮鉊鉆鉭鉬鉏鉠鉧鉯鈶鉡鉰鈱鉔鉣鉐鉲鉎鉓鉌鉖鈲閟閜閞閛隒隓隑隗雎雺雽雸雵靳靷靸靲頏頍頎颬飶飹馯馲馰馵骭骫魛鳪鳭鳧麀黽僦僔僗僨僳僛僪僝僤僓僬僰僯僣僠"],
["e140","凘劀劁勩勫匰厬嘧嘕嘌嘒嗼嘏嘜嘁嘓嘂嗺嘝嘄嗿嗹墉塼墐墘墆墁塿塴墋塺墇墑墎塶墂墈塻墔墏壾奫嫜嫮嫥嫕嫪嫚嫭嫫嫳嫢嫠嫛嫬嫞嫝嫙嫨嫟孷寠"],
["e1a1","寣屣嶂嶀嵽嶆嵺嶁嵷嶊嶉嶈嵾嵼嶍嵹嵿幘幙幓廘廑廗廎廜廕廙廒廔彄彃彯徶愬愨慁慞慱慳慒慓慲慬憀慴慔慺慛慥愻慪慡慖戩戧戫搫摍摛摝摴摶摲摳摽摵摦撦摎撂摞摜摋摓摠摐摿搿摬摫摙摥摷敳斠暡暠暟朅朄朢榱榶槉"],
["e240","榠槎榖榰榬榼榑榙榎榧榍榩榾榯榿槄榽榤槔榹槊榚槏榳榓榪榡榞槙榗榐槂榵榥槆歊歍歋殞殟殠毃毄毾滎滵滱漃漥滸漷滻漮漉潎漙漚漧漘漻漒滭漊"],
["e2a1","漶潳滹滮漭潀漰漼漵滫漇漎潃漅滽滶漹漜滼漺漟漍漞漈漡熇熐熉熀熅熂熏煻熆熁熗牄牓犗犕犓獃獍獑獌瑢瑳瑱瑵瑲瑧瑮甀甂甃畽疐瘖瘈瘌瘕瘑瘊瘔皸瞁睼瞅瞂睮瞀睯睾瞃碲碪碴碭碨硾碫碞碥碠碬碢碤禘禊禋禖禕禔禓"],
["e340","禗禈禒禐稫穊稰稯稨稦窨窫窬竮箈箜箊箑箐箖箍箌箛箎箅箘劄箙箤箂粻粿粼粺綧綷緂綣綪緁緀緅綝緎緄緆緋緌綯綹綖綼綟綦綮綩綡緉罳翢翣翥翞"],
["e3a1","耤聝聜膉膆膃膇膍膌膋舕蒗蒤蒡蒟蒺蓎蓂蒬蒮蒫蒹蒴蓁蓍蒪蒚蒱蓐蒝蒧蒻蒢蒔蓇蓌蒛蒩蒯蒨蓖蒘蒶蓏蒠蓗蓔蓒蓛蒰蒑虡蜳蜣蜨蝫蝀蜮蜞蜡蜙蜛蝃蜬蝁蜾蝆蜠蜲蜪蜭蜼蜒蜺蜱蜵蝂蜦蜧蜸蜤蜚蜰蜑裷裧裱裲裺裾裮裼裶裻"],
["e440","裰裬裫覝覡覟覞觩觫觨誫誙誋誒誏誖谽豨豩賕賏賗趖踉踂跿踍跽踊踃踇踆踅跾踀踄輐輑輎輍鄣鄜鄠鄢鄟鄝鄚鄤鄡鄛酺酲酹酳銥銤鉶銛鉺銠銔銪銍"],
["e4a1","銦銚銫鉹銗鉿銣鋮銎銂銕銢鉽銈銡銊銆銌銙銧鉾銇銩銝銋鈭隞隡雿靘靽靺靾鞃鞀鞂靻鞄鞁靿韎韍頖颭颮餂餀餇馝馜駃馹馻馺駂馽駇骱髣髧鬾鬿魠魡魟鳱鳲鳵麧僿儃儰僸儆儇僶僾儋儌僽儊劋劌勱勯噈噂噌嘵噁噊噉噆噘"],
["e540","噚噀嘳嘽嘬嘾嘸嘪嘺圚墫墝墱墠墣墯墬墥墡壿嫿嫴嫽嫷嫶嬃嫸嬂嫹嬁嬇嬅嬏屧嶙嶗嶟嶒嶢嶓嶕嶠嶜嶡嶚嶞幩幝幠幜緳廛廞廡彉徲憋憃慹憱憰憢憉"],
["e5a1","憛憓憯憭憟憒憪憡憍慦憳戭摮摰撖撠撅撗撜撏撋撊撌撣撟摨撱撘敶敺敹敻斲斳暵暰暩暲暷暪暯樀樆樗槥槸樕槱槤樠槿槬槢樛樝槾樧槲槮樔槷槧橀樈槦槻樍槼槫樉樄樘樥樏槶樦樇槴樖歑殥殣殢殦氁氀毿氂潁漦潾澇濆澒"],
["e640","澍澉澌潢潏澅潚澖潶潬澂潕潲潒潐潗澔澓潝漀潡潫潽潧澐潓澋潩潿澕潣潷潪潻熲熯熛熰熠熚熩熵熝熥熞熤熡熪熜熧熳犘犚獘獒獞獟獠獝獛獡獚獙"],
["e6a1","獢璇璉璊璆璁瑽璅璈瑼瑹甈甇畾瘥瘞瘙瘝瘜瘣瘚瘨瘛皜皝皞皛瞍瞏瞉瞈磍碻磏磌磑磎磔磈磃磄磉禚禡禠禜禢禛歶稹窲窴窳箷篋箾箬篎箯箹篊箵糅糈糌糋緷緛緪緧緗緡縃緺緦緶緱緰緮緟罶羬羰羭翭翫翪翬翦翨聤聧膣膟"],
["e740","膞膕膢膙膗舖艏艓艒艐艎艑蔤蔻蔏蔀蔩蔎蔉蔍蔟蔊蔧蔜蓻蔫蓺蔈蔌蓴蔪蓲蔕蓷蓫蓳蓼蔒蓪蓩蔖蓾蔨蔝蔮蔂蓽蔞蓶蔱蔦蓧蓨蓰蓯蓹蔘蔠蔰蔋蔙蔯虢"],
["e7a1","蝖蝣蝤蝷蟡蝳蝘蝔蝛蝒蝡蝚蝑蝞蝭蝪蝐蝎蝟蝝蝯蝬蝺蝮蝜蝥蝏蝻蝵蝢蝧蝩衚褅褌褔褋褗褘褙褆褖褑褎褉覢覤覣觭觰觬諏諆誸諓諑諔諕誻諗誾諀諅諘諃誺誽諙谾豍貏賥賟賙賨賚賝賧趠趜趡趛踠踣踥踤踮踕踛踖踑踙踦踧"],
["e840","踔踒踘踓踜踗踚輬輤輘輚輠輣輖輗遳遰遯遧遫鄯鄫鄩鄪鄲鄦鄮醅醆醊醁醂醄醀鋐鋃鋄鋀鋙銶鋏鋱鋟鋘鋩鋗鋝鋌鋯鋂鋨鋊鋈鋎鋦鋍鋕鋉鋠鋞鋧鋑鋓"],
["e8a1","銵鋡鋆銴镼閬閫閮閰隤隢雓霅霈霂靚鞊鞎鞈韐韏頞頝頦頩頨頠頛頧颲餈飺餑餔餖餗餕駜駍駏駓駔駎駉駖駘駋駗駌骳髬髫髳髲髱魆魃魧魴魱魦魶魵魰魨魤魬鳼鳺鳽鳿鳷鴇鴀鳹鳻鴈鴅鴄麃黓鼏鼐儜儓儗儚儑凞匴叡噰噠噮"],
["e940","噳噦噣噭噲噞噷圜圛壈墽壉墿墺壂墼壆嬗嬙嬛嬡嬔嬓嬐嬖嬨嬚嬠嬞寯嶬嶱嶩嶧嶵嶰嶮嶪嶨嶲嶭嶯嶴幧幨幦幯廩廧廦廨廥彋徼憝憨憖懅憴懆懁懌憺"],
["e9a1","憿憸憌擗擖擐擏擉撽撉擃擛擳擙攳敿敼斢曈暾曀曊曋曏暽暻暺曌朣樴橦橉橧樲橨樾橝橭橶橛橑樨橚樻樿橁橪橤橐橏橔橯橩橠樼橞橖橕橍橎橆歕歔歖殧殪殫毈毇氄氃氆澭濋澣濇澼濎濈潞濄澽澞濊澨瀄澥澮澺澬澪濏澿澸"],
["ea40","澢濉澫濍澯澲澰燅燂熿熸燖燀燁燋燔燊燇燏熽燘熼燆燚燛犝犞獩獦獧獬獥獫獪瑿璚璠璔璒璕璡甋疀瘯瘭瘱瘽瘳瘼瘵瘲瘰皻盦瞚瞝瞡瞜瞛瞢瞣瞕瞙"],
["eaa1","瞗磝磩磥磪磞磣磛磡磢磭磟磠禤穄穈穇窶窸窵窱窷篞篣篧篝篕篥篚篨篹篔篪篢篜篫篘篟糒糔糗糐糑縒縡縗縌縟縠縓縎縜縕縚縢縋縏縖縍縔縥縤罃罻罼罺羱翯耪耩聬膱膦膮膹膵膫膰膬膴膲膷膧臲艕艖艗蕖蕅蕫蕍蕓蕡蕘"],
["eb40","蕀蕆蕤蕁蕢蕄蕑蕇蕣蔾蕛蕱蕎蕮蕵蕕蕧蕠薌蕦蕝蕔蕥蕬虣虥虤螛螏螗螓螒螈螁螖螘蝹螇螣螅螐螑螝螄螔螜螚螉褞褦褰褭褮褧褱褢褩褣褯褬褟觱諠"],
["eba1","諢諲諴諵諝謔諤諟諰諈諞諡諨諿諯諻貑貒貐賵賮賱賰賳赬赮趥趧踳踾踸蹀蹅踶踼踽蹁踰踿躽輶輮輵輲輹輷輴遶遹遻邆郺鄳鄵鄶醓醐醑醍醏錧錞錈錟錆錏鍺錸錼錛錣錒錁鍆錭錎錍鋋錝鋺錥錓鋹鋷錴錂錤鋿錩錹錵錪錔錌"],
["ec40","錋鋾錉錀鋻錖閼闍閾閹閺閶閿閵閽隩雔霋霒霐鞙鞗鞔韰韸頵頯頲餤餟餧餩馞駮駬駥駤駰駣駪駩駧骹骿骴骻髶髺髹髷鬳鮀鮅鮇魼魾魻鮂鮓鮒鮐魺鮕"],
["eca1","魽鮈鴥鴗鴠鴞鴔鴩鴝鴘鴢鴐鴙鴟麈麆麇麮麭黕黖黺鼒鼽儦儥儢儤儠儩勴嚓嚌嚍嚆嚄嚃噾嚂噿嚁壖壔壏壒嬭嬥嬲嬣嬬嬧嬦嬯嬮孻寱寲嶷幬幪徾徻懃憵憼懧懠懥懤懨懞擯擩擣擫擤擨斁斀斶旚曒檍檖檁檥檉檟檛檡檞檇檓檎"],
["ed40","檕檃檨檤檑橿檦檚檅檌檒歛殭氉濌澩濴濔濣濜濭濧濦濞濲濝濢濨燡燱燨燲燤燰燢獳獮獯璗璲璫璐璪璭璱璥璯甐甑甒甏疄癃癈癉癇皤盩瞵瞫瞲瞷瞶"],
["eda1","瞴瞱瞨矰磳磽礂磻磼磲礅磹磾礄禫禨穜穛穖穘穔穚窾竀竁簅簏篲簀篿篻簎篴簋篳簂簉簃簁篸篽簆篰篱簐簊糨縭縼繂縳顈縸縪繉繀繇縩繌縰縻縶繄縺罅罿罾罽翴翲耬膻臄臌臊臅臇膼臩艛艚艜薃薀薏薧薕薠薋薣蕻薤薚薞"],
["ee40","蕷蕼薉薡蕺蕸蕗薎薖薆薍薙薝薁薢薂薈薅蕹蕶薘薐薟虨螾螪螭蟅螰螬螹螵螼螮蟉蟃蟂蟌螷螯蟄蟊螴螶螿螸螽蟞螲褵褳褼褾襁襒褷襂覭覯覮觲觳謞"],
["eea1","謘謖謑謅謋謢謏謒謕謇謍謈謆謜謓謚豏豰豲豱豯貕貔賹赯蹎蹍蹓蹐蹌蹇轃轀邅遾鄸醚醢醛醙醟醡醝醠鎡鎃鎯鍤鍖鍇鍼鍘鍜鍶鍉鍐鍑鍠鍭鎏鍌鍪鍹鍗鍕鍒鍏鍱鍷鍻鍡鍞鍣鍧鎀鍎鍙闇闀闉闃闅閷隮隰隬霠霟霘霝霙鞚鞡鞜"],
["ef40","鞞鞝韕韔韱顁顄顊顉顅顃餥餫餬餪餳餲餯餭餱餰馘馣馡騂駺駴駷駹駸駶駻駽駾駼騃骾髾髽鬁髼魈鮚鮨鮞鮛鮦鮡鮥鮤鮆鮢鮠鮯鴳鵁鵧鴶鴮鴯鴱鴸鴰"],
["efa1","鵅鵂鵃鴾鴷鵀鴽翵鴭麊麉麍麰黈黚黻黿鼤鼣鼢齔龠儱儭儮嚘嚜嚗嚚嚝嚙奰嬼屩屪巀幭幮懘懟懭懮懱懪懰懫懖懩擿攄擽擸攁攃擼斔旛曚曛曘櫅檹檽櫡櫆檺檶檷櫇檴檭歞毉氋瀇瀌瀍瀁瀅瀔瀎濿瀀濻瀦濼濷瀊爁燿燹爃燽獶"],
["f040","璸瓀璵瓁璾璶璻瓂甔甓癜癤癙癐癓癗癚皦皽盬矂瞺磿礌礓礔礉礐礒礑禭禬穟簜簩簙簠簟簭簝簦簨簢簥簰繜繐繖繣繘繢繟繑繠繗繓羵羳翷翸聵臑臒"],
["f0a1","臐艟艞薴藆藀藃藂薳薵薽藇藄薿藋藎藈藅薱薶藒蘤薸薷薾虩蟧蟦蟢蟛蟫蟪蟥蟟蟳蟤蟔蟜蟓蟭蟘蟣螤蟗蟙蠁蟴蟨蟝襓襋襏襌襆襐襑襉謪謧謣謳謰謵譇謯謼謾謱謥謷謦謶謮謤謻謽謺豂豵貙貘貗賾贄贂贀蹜蹢蹠蹗蹖蹞蹥蹧"],
["f140","蹛蹚蹡蹝蹩蹔轆轇轈轋鄨鄺鄻鄾醨醥醧醯醪鎵鎌鎒鎷鎛鎝鎉鎧鎎鎪鎞鎦鎕鎈鎙鎟鎍鎱鎑鎲鎤鎨鎴鎣鎥闒闓闑隳雗雚巂雟雘雝霣霢霥鞬鞮鞨鞫鞤鞪"],
["f1a1","鞢鞥韗韙韖韘韺顐顑顒颸饁餼餺騏騋騉騍騄騑騊騅騇騆髀髜鬈鬄鬅鬩鬵魊魌魋鯇鯆鯃鮿鯁鮵鮸鯓鮶鯄鮹鮽鵜鵓鵏鵊鵛鵋鵙鵖鵌鵗鵒鵔鵟鵘鵚麎麌黟鼁鼀鼖鼥鼫鼪鼩鼨齌齕儴儵劖勷厴嚫嚭嚦嚧嚪嚬壚壝壛夒嬽嬾嬿巃幰"],
["f240","徿懻攇攐攍攉攌攎斄旞旝曞櫧櫠櫌櫑櫙櫋櫟櫜櫐櫫櫏櫍櫞歠殰氌瀙瀧瀠瀖瀫瀡瀢瀣瀩瀗瀤瀜瀪爌爊爇爂爅犥犦犤犣犡瓋瓅璷瓃甖癠矉矊矄矱礝礛"],
["f2a1","礡礜礗礞禰穧穨簳簼簹簬簻糬糪繶繵繸繰繷繯繺繲繴繨罋罊羃羆羷翽翾聸臗臕艤艡艣藫藱藭藙藡藨藚藗藬藲藸藘藟藣藜藑藰藦藯藞藢蠀蟺蠃蟶蟷蠉蠌蠋蠆蟼蠈蟿蠊蠂襢襚襛襗襡襜襘襝襙覈覷覶觶譐譈譊譀譓譖譔譋譕"],
["f340","譑譂譒譗豃豷豶貚贆贇贉趬趪趭趫蹭蹸蹳蹪蹯蹻軂轒轑轏轐轓辴酀鄿醰醭鏞鏇鏏鏂鏚鏐鏹鏬鏌鏙鎩鏦鏊鏔鏮鏣鏕鏄鏎鏀鏒鏧镽闚闛雡霩霫霬霨霦"],
["f3a1","鞳鞷鞶韝韞韟顜顙顝顗颿颽颻颾饈饇饃馦馧騚騕騥騝騤騛騢騠騧騣騞騜騔髂鬋鬊鬎鬌鬷鯪鯫鯠鯞鯤鯦鯢鯰鯔鯗鯬鯜鯙鯥鯕鯡鯚鵷鶁鶊鶄鶈鵱鶀鵸鶆鶋鶌鵽鵫鵴鵵鵰鵩鶅鵳鵻鶂鵯鵹鵿鶇鵨麔麑黀黼鼭齀齁齍齖齗齘匷嚲"],
["f440","嚵嚳壣孅巆巇廮廯忀忁懹攗攖攕攓旟曨曣曤櫳櫰櫪櫨櫹櫱櫮櫯瀼瀵瀯瀷瀴瀱灂瀸瀿瀺瀹灀瀻瀳灁爓爔犨獽獼璺皫皪皾盭矌矎矏矍矲礥礣礧礨礤礩"],
["f4a1","禲穮穬穭竷籉籈籊籇籅糮繻繾纁纀羺翿聹臛臙舋艨艩蘢藿蘁藾蘛蘀藶蘄蘉蘅蘌藽蠙蠐蠑蠗蠓蠖襣襦覹觷譠譪譝譨譣譥譧譭趮躆躈躄轙轖轗轕轘轚邍酃酁醷醵醲醳鐋鐓鏻鐠鐏鐔鏾鐕鐐鐨鐙鐍鏵鐀鏷鐇鐎鐖鐒鏺鐉鏸鐊鏿"],
["f540","鏼鐌鏶鐑鐆闞闠闟霮霯鞹鞻韽韾顠顢顣顟飁飂饐饎饙饌饋饓騲騴騱騬騪騶騩騮騸騭髇髊髆鬐鬒鬑鰋鰈鯷鰅鰒鯸鱀鰇鰎鰆鰗鰔鰉鶟鶙鶤鶝鶒鶘鶐鶛"],
["f5a1","鶠鶔鶜鶪鶗鶡鶚鶢鶨鶞鶣鶿鶩鶖鶦鶧麙麛麚黥黤黧黦鼰鼮齛齠齞齝齙龑儺儹劘劗囃嚽嚾孈孇巋巏廱懽攛欂櫼欃櫸欀灃灄灊灈灉灅灆爝爚爙獾甗癪矐礭礱礯籔籓糲纊纇纈纋纆纍罍羻耰臝蘘蘪蘦蘟蘣蘜蘙蘧蘮蘡蘠蘩蘞蘥"],
["f640","蠩蠝蠛蠠蠤蠜蠫衊襭襩襮襫觺譹譸譅譺譻贐贔趯躎躌轞轛轝酆酄酅醹鐿鐻鐶鐩鐽鐼鐰鐹鐪鐷鐬鑀鐱闥闤闣霵霺鞿韡顤飉飆飀饘饖騹騽驆驄驂驁騺"],
["f6a1","騿髍鬕鬗鬘鬖鬺魒鰫鰝鰜鰬鰣鰨鰩鰤鰡鶷鶶鶼鷁鷇鷊鷏鶾鷅鷃鶻鶵鷎鶹鶺鶬鷈鶱鶭鷌鶳鷍鶲鹺麜黫黮黭鼛鼘鼚鼱齎齥齤龒亹囆囅囋奱孋孌巕巑廲攡攠攦攢欋欈欉氍灕灖灗灒爞爟犩獿瓘瓕瓙瓗癭皭礵禴穰穱籗籜籙籛籚"],
["f740","糴糱纑罏羇臞艫蘴蘵蘳蘬蘲蘶蠬蠨蠦蠪蠥襱覿覾觻譾讄讂讆讅譿贕躕躔躚躒躐躖躗轠轢酇鑌鑐鑊鑋鑏鑇鑅鑈鑉鑆霿韣顪顩飋饔饛驎驓驔驌驏驈驊"],
["f7a1","驉驒驐髐鬙鬫鬻魖魕鱆鱈鰿鱄鰹鰳鱁鰼鰷鰴鰲鰽鰶鷛鷒鷞鷚鷋鷐鷜鷑鷟鷩鷙鷘鷖鷵鷕鷝麶黰鼵鼳鼲齂齫龕龢儽劙壨壧奲孍巘蠯彏戁戃戄攩攥斖曫欑欒欏毊灛灚爢玂玁玃癰矔籧籦纕艬蘺虀蘹蘼蘱蘻蘾蠰蠲蠮蠳襶襴襳觾"],
["f840","讌讎讋讈豅贙躘轤轣醼鑢鑕鑝鑗鑞韄韅頀驖驙鬞鬟鬠鱒鱘鱐鱊鱍鱋鱕鱙鱌鱎鷻鷷鷯鷣鷫鷸鷤鷶鷡鷮鷦鷲鷰鷢鷬鷴鷳鷨鷭黂黐黲黳鼆鼜鼸鼷鼶齃齏"],
["f8a1","齱齰齮齯囓囍孎屭攭曭曮欓灟灡灝灠爣瓛瓥矕礸禷禶籪纗羉艭虃蠸蠷蠵衋讔讕躞躟躠躝醾醽釂鑫鑨鑩雥靆靃靇韇韥驞髕魙鱣鱧鱦鱢鱞鱠鸂鷾鸇鸃鸆鸅鸀鸁鸉鷿鷽鸄麠鼞齆齴齵齶囔攮斸欘欙欗欚灢爦犪矘矙礹籩籫糶纚"],
["f940","纘纛纙臠臡虆虇虈襹襺襼襻觿讘讙躥躤躣鑮鑭鑯鑱鑳靉顲饟鱨鱮鱭鸋鸍鸐鸏鸒鸑麡黵鼉齇齸齻齺齹圞灦籯蠼趲躦釃鑴鑸鑶鑵驠鱴鱳鱱鱵鸔鸓黶鼊"],
["f9a1","龤灨灥糷虪蠾蠽蠿讞貜躩軉靋顳顴飌饡馫驤驦驧鬤鸕鸗齈戇欞爧虌躨钂钀钁驩驨鬮鸙爩虋讟钃鱹麷癵驫鱺鸝灩灪麤齾齉龘碁銹裏墻恒粧嫺╔╦╗╠╬╣╚╩╝╒╤╕╞╪╡╘╧╛╓╥╖╟╫╢╙╨╜║═╭╮╰╯▓"]
]
[
["0","\u0000",127],
["8ea1","｡",62],
["a1a1","　、。，．・：；？！゛゜´｀¨＾￣＿ヽヾゝゞ〃仝々〆〇ー―‐／＼～∥｜…‥‘’“”（）〔〕［］｛｝〈",9,"＋－±×÷＝≠＜＞≦≧∞∴♂♀°′″℃￥＄￠￡％＃＆＊＠§☆★○●◎◇"],
["a2a1","◆□■△▲▽▼※〒→←↑↓〓"],
["a2ba","∈∋⊆⊇⊂⊃∪∩"],
["a2ca","∧∨￢⇒⇔∀∃"],
["a2dc","∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬"],
["a2f2","Å‰♯♭♪†‡¶"],
["a2fe","◯"],
["a3b0","０",9],
["a3c1","Ａ",25],
["a3e1","ａ",25],
["a4a1","ぁ",82],
["a5a1","ァ",85],
["a6a1","Α",16,"Σ",6],
["a6c1","α",16,"σ",6],
["a7a1","А",5,"ЁЖ",25],
["a7d1","а",5,"ёж",25],
["a8a1","─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂"],
["ada1","①",19,"Ⅰ",9],
["adc0","㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡"],
["addf","㍻〝〟№㏍℡㊤",4,"㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪"],
["b0a1","亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭"],
["b1a1","院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応"],
["b2a1","押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改"],
["b3a1","魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱"],
["b4a1","粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄"],
["b5a1","機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京"],
["b6a1","供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈"],
["b7a1","掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲"],
["b8a1","検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向"],
["b9a1","后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込"],
["baa1","此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷"],
["bba1","察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時"],
["bca1","次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周"],
["bda1","宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償"],
["bea1","勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾"],
["bfa1","拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾"],
["c0a1","澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線"],
["c1a1","繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎"],
["c2a1","臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只"],
["c3a1","叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵"],
["c4a1","帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓"],
["c5a1","邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到"],
["c6a1","董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入"],
["c7a1","如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦"],
["c8a1","函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美"],
["c9a1","鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服"],
["caa1","福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋"],
["cba1","法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満"],
["cca1","漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒"],
["cda1","諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃"],
["cea1","痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯"],
["cfa1","蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕"],
["d0a1","弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲"],
["d1a1","僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨"],
["d2a1","辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨"],
["d3a1","咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉"],
["d4a1","圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩"],
["d5a1","奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓"],
["d6a1","屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏"],
["d7a1","廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚"],
["d8a1","悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛"],
["d9a1","戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼"],
["daa1","據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼"],
["dba1","曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍"],
["dca1","棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣"],
["dda1","檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾"],
["dea1","沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌"],
["dfa1","漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼"],
["e0a1","燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱"],
["e1a1","瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰"],
["e2a1","癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬"],
["e3a1","磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐"],
["e4a1","筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆"],
["e5a1","紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺"],
["e6a1","罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋"],
["e7a1","隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙"],
["e8a1","茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈"],
["e9a1","蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙"],
["eaa1","蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞"],
["eba1","襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫"],
["eca1","譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊"],
["eda1","蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸"],
["eea1","遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮"],
["efa1","錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞"],
["f0a1","陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰"],
["f1a1","顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷"],
["f2a1","髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈"],
["f3a1","鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠"],
["f4a1","堯槇遙瑤凜熙"],
["f9a1","纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德"],
["faa1","忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱"],
["fba1","犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚"],
["fca1","釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑"],
["fcf1","ⅰ",9,"￢￤＇＂"],
["8fa2af","˘ˇ¸˙˝¯˛˚～΄΅"],
["8fa2c2","¡¦¿"],
["8fa2eb","ºª©®™¤№"],
["8fa6e1","ΆΈΉΊΪ"],
["8fa6e7","Ό"],
["8fa6e9","ΎΫ"],
["8fa6ec","Ώ"],
["8fa6f1","άέήίϊΐόςύϋΰώ"],
["8fa7c2","Ђ",10,"ЎЏ"],
["8fa7f2","ђ",10,"ўџ"],
["8fa9a1","ÆĐ"],
["8fa9a4","Ħ"],
["8fa9a6","Ĳ"],
["8fa9a8","ŁĿ"],
["8fa9ab","ŊØŒ"],
["8fa9af","ŦÞ"],
["8fa9c1","æđðħıĳĸłŀŉŋøœßŧþ"],
["8faaa1","ÁÀÄÂĂǍĀĄÅÃĆĈČÇĊĎÉÈËÊĚĖĒĘ"],
["8faaba","ĜĞĢĠĤÍÌÏÎǏİĪĮĨĴĶĹĽĻŃŇŅÑÓÒÖÔǑŐŌÕŔŘŖŚŜŠŞŤŢÚÙÜÛŬǓŰŪŲŮŨǗǛǙǕŴÝŸŶŹŽŻ"],
["8faba1","áàäâăǎāąåãćĉčçċďéèëêěėēęǵĝğ"],
["8fabbd","ġĥíìïîǐ"],
["8fabc5","īįĩĵķĺľļńňņñóòöôǒőōõŕřŗśŝšşťţúùüûŭǔűūųůũǘǜǚǖŵýÿŷźžż"],
["8fb0a1","丂丄丅丌丒丟丣两丨丫丮丯丰丵乀乁乄乇乑乚乜乣乨乩乴乵乹乿亍亖亗亝亯亹仃仐仚仛仠仡仢仨仯仱仳仵份仾仿伀伂伃伈伋伌伒伕伖众伙伮伱你伳伵伷伹伻伾佀佂佈佉佋佌佒佔佖佘佟佣佪佬佮佱佷佸佹佺佽佾侁侂侄"],
["8fb1a1","侅侉侊侌侎侐侒侓侔侗侙侚侞侟侲侷侹侻侼侽侾俀俁俅俆俈俉俋俌俍俏俒俜俠俢俰俲俼俽俿倀倁倄倇倊倌倎倐倓倗倘倛倜倝倞倢倧倮倰倲倳倵偀偁偂偅偆偊偌偎偑偒偓偗偙偟偠偢偣偦偧偪偭偰偱倻傁傃傄傆傊傎傏傐"],
["8fb2a1","傒傓傔傖傛傜傞",4,"傪傯傰傹傺傽僀僃僄僇僌僎僐僓僔僘僜僝僟僢僤僦僨僩僯僱僶僺僾儃儆儇儈儋儌儍儎僲儐儗儙儛儜儝儞儣儧儨儬儭儯儱儳儴儵儸儹兂兊兏兓兕兗兘兟兤兦兾冃冄冋冎冘冝冡冣冭冸冺冼冾冿凂"],
["8fb3a1","凈减凑凒凓凕凘凞凢凥凮凲凳凴凷刁刂刅划刓刕刖刘刢刨刱刲刵刼剅剉剕剗剘剚剜剟剠剡剦剮剷剸剹劀劂劅劊劌劓劕劖劗劘劚劜劤劥劦劧劯劰劶劷劸劺劻劽勀勄勆勈勌勏勑勔勖勛勜勡勥勨勩勪勬勰勱勴勶勷匀匃匊匋"],
["8fb4a1","匌匑匓匘匛匜匞匟匥匧匨匩匫匬匭匰匲匵匼匽匾卂卌卋卙卛卡卣卥卬卭卲卹卾厃厇厈厎厓厔厙厝厡厤厪厫厯厲厴厵厷厸厺厽叀叅叏叒叓叕叚叝叞叠另叧叵吂吓吚吡吧吨吪启吱吴吵呃呄呇呍呏呞呢呤呦呧呩呫呭呮呴呿"],
["8fb5a1","咁咃咅咈咉咍咑咕咖咜咟咡咦咧咩咪咭咮咱咷咹咺咻咿哆哊响哎哠哪哬哯哶哼哾哿唀唁唅唈唉唌唍唎唕唪唫唲唵唶唻唼唽啁啇啉啊啍啐啑啘啚啛啞啠啡啤啦啿喁喂喆喈喎喏喑喒喓喔喗喣喤喭喲喿嗁嗃嗆嗉嗋嗌嗎嗑嗒"],
["8fb6a1","嗓嗗嗘嗛嗞嗢嗩嗶嗿嘅嘈嘊嘍",5,"嘙嘬嘰嘳嘵嘷嘹嘻嘼嘽嘿噀噁噃噄噆噉噋噍噏噔噞噠噡噢噣噦噩噭噯噱噲噵嚄嚅嚈嚋嚌嚕嚙嚚嚝嚞嚟嚦嚧嚨嚩嚫嚬嚭嚱嚳嚷嚾囅囉囊囋囏囐囌囍囙囜囝囟囡囤",4,"囱囫园"],
["8fb7a1","囶囷圁圂圇圊圌圑圕圚圛圝圠圢圣圤圥圩圪圬圮圯圳圴圽圾圿坅坆坌坍坒坢坥坧坨坫坭",4,"坳坴坵坷坹坺坻坼坾垁垃垌垔垗垙垚垜垝垞垟垡垕垧垨垩垬垸垽埇埈埌埏埕埝埞埤埦埧埩埭埰埵埶埸埽埾埿堃堄堈堉埡"],
["8fb8a1","堌堍堛堞堟堠堦堧堭堲堹堿塉塌塍塏塐塕塟塡塤塧塨塸塼塿墀墁墇墈墉墊墌墍墏墐墔墖墝墠墡墢墦墩墱墲壄墼壂壈壍壎壐壒壔壖壚壝壡壢壩壳夅夆夋夌夒夓夔虁夝夡夣夤夨夯夰夳夵夶夿奃奆奒奓奙奛奝奞奟奡奣奫奭"],
["8fb9a1","奯奲奵奶她奻奼妋妌妎妒妕妗妟妤妧妭妮妯妰妳妷妺妼姁姃姄姈姊姍姒姝姞姟姣姤姧姮姯姱姲姴姷娀娄娌娍娎娒娓娞娣娤娧娨娪娭娰婄婅婇婈婌婐婕婞婣婥婧婭婷婺婻婾媋媐媓媖媙媜媞媟媠媢媧媬媱媲媳媵媸媺媻媿"],
["8fbaa1","嫄嫆嫈嫏嫚嫜嫠嫥嫪嫮嫵嫶嫽嬀嬁嬈嬗嬴嬙嬛嬝嬡嬥嬭嬸孁孋孌孒孖孞孨孮孯孼孽孾孿宁宄宆宊宎宐宑宓宔宖宨宩宬宭宯宱宲宷宺宼寀寁寍寏寖",4,"寠寯寱寴寽尌尗尞尟尣尦尩尫尬尮尰尲尵尶屙屚屜屢屣屧屨屩"],
["8fbba1","屭屰屴屵屺屻屼屽岇岈岊岏岒岝岟岠岢岣岦岪岲岴岵岺峉峋峒峝峗峮峱峲峴崁崆崍崒崫崣崤崦崧崱崴崹崽崿嵂嵃嵆嵈嵕嵑嵙嵊嵟嵠嵡嵢嵤嵪嵭嵰嵹嵺嵾嵿嶁嶃嶈嶊嶒嶓嶔嶕嶙嶛嶟嶠嶧嶫嶰嶴嶸嶹巃巇巋巐巎巘巙巠巤"],
["8fbca1","巩巸巹帀帇帍帒帔帕帘帟帠帮帨帲帵帾幋幐幉幑幖幘幛幜幞幨幪",4,"幰庀庋庎庢庤庥庨庪庬庱庳庽庾庿廆廌廋廎廑廒廔廕廜廞廥廫异弆弇弈弎弙弜弝弡弢弣弤弨弫弬弮弰弴弶弻弽弿彀彄彅彇彍彐彔彘彛彠彣彤彧"],
["8fbda1","彯彲彴彵彸彺彽彾徉徍徏徖徜徝徢徧徫徤徬徯徰徱徸忄忇忈忉忋忐",4,"忞忡忢忨忩忪忬忭忮忯忲忳忶忺忼怇怊怍怓怔怗怘怚怟怤怭怳怵恀恇恈恉恌恑恔恖恗恝恡恧恱恾恿悂悆悈悊悎悑悓悕悘悝悞悢悤悥您悰悱悷"],
["8fbea1","悻悾惂惄惈惉惊惋惎惏惔惕惙惛惝惞惢惥惲惵惸惼惽愂愇愊愌愐",4,"愖愗愙愜愞愢愪愫愰愱愵愶愷愹慁慅慆慉慞慠慬慲慸慻慼慿憀憁憃憄憋憍憒憓憗憘憜憝憟憠憥憨憪憭憸憹憼懀懁懂懎懏懕懜懝懞懟懡懢懧懩懥"],
["8fbfa1","懬懭懯戁戃戄戇戓戕戜戠戢戣戧戩戫戹戽扂扃扄扆扌扐扑扒扔扖扚扜扤扭扯扳扺扽抍抎抏抐抦抨抳抶抷抺抾抿拄拎拕拖拚拪拲拴拼拽挃挄挊挋挍挐挓挖挘挩挪挭挵挶挹挼捁捂捃捄捆捊捋捎捒捓捔捘捛捥捦捬捭捱捴捵"],
["8fc0a1","捸捼捽捿掂掄掇掊掐掔掕掙掚掞掤掦掭掮掯掽揁揅揈揎揑揓揔揕揜揠揥揪揬揲揳揵揸揹搉搊搐搒搔搘搞搠搢搤搥搩搪搯搰搵搽搿摋摏摑摒摓摔摚摛摜摝摟摠摡摣摭摳摴摻摽撅撇撏撐撑撘撙撛撝撟撡撣撦撨撬撳撽撾撿"],
["8fc1a1","擄擉擊擋擌擎擐擑擕擗擤擥擩擪擭擰擵擷擻擿攁攄攈攉攊攏攓攔攖攙攛攞攟攢攦攩攮攱攺攼攽敃敇敉敐敒敔敟敠敧敫敺敽斁斅斊斒斕斘斝斠斣斦斮斲斳斴斿旂旈旉旎旐旔旖旘旟旰旲旴旵旹旾旿昀昄昈昉昍昑昒昕昖昝"],
["8fc2a1","昞昡昢昣昤昦昩昪昫昬昮昰昱昳昹昷晀晅晆晊晌晑晎晗晘晙晛晜晠晡曻晪晫晬晾晳晵晿晷晸晹晻暀晼暋暌暍暐暒暙暚暛暜暟暠暤暭暱暲暵暻暿曀曂曃曈曌曎曏曔曛曟曨曫曬曮曺朅朇朎朓朙朜朠朢朳朾杅杇杈杌杔杕杝"],
["8fc3a1","杦杬杮杴杶杻极构枎枏枑枓枖枘枙枛枰枱枲枵枻枼枽柹柀柂柃柅柈柉柒柗柙柜柡柦柰柲柶柷桒栔栙栝栟栨栧栬栭栯栰栱栳栻栿桄桅桊桌桕桗桘桛桫桮",4,"桵桹桺桻桼梂梄梆梈梖梘梚梜梡梣梥梩梪梮梲梻棅棈棌棏"],
["8fc4a1","棐棑棓棖棙棜棝棥棨棪棫棬棭棰棱棵棶棻棼棽椆椉椊椐椑椓椖椗椱椳椵椸椻楂楅楉楎楗楛楣楤楥楦楨楩楬楰楱楲楺楻楿榀榍榒榖榘榡榥榦榨榫榭榯榷榸榺榼槅槈槑槖槗槢槥槮槯槱槳槵槾樀樁樃樏樑樕樚樝樠樤樨樰樲"],
["8fc5a1","樴樷樻樾樿橅橆橉橊橎橐橑橒橕橖橛橤橧橪橱橳橾檁檃檆檇檉檋檑檛檝檞檟檥檫檯檰檱檴檽檾檿櫆櫉櫈櫌櫐櫔櫕櫖櫜櫝櫤櫧櫬櫰櫱櫲櫼櫽欂欃欆欇欉欏欐欑欗欛欞欤欨欫欬欯欵欶欻欿歆歊歍歒歖歘歝歠歧歫歮歰歵歽"],
["8fc6a1","歾殂殅殗殛殟殠殢殣殨殩殬殭殮殰殸殹殽殾毃毄毉毌毖毚毡毣毦毧毮毱毷毹毿氂氄氅氉氍氎氐氒氙氟氦氧氨氬氮氳氵氶氺氻氿汊汋汍汏汒汔汙汛汜汫汭汯汴汶汸汹汻沅沆沇沉沔沕沗沘沜沟沰沲沴泂泆泍泏泐泑泒泔泖"],
["8fc7a1","泚泜泠泧泩泫泬泮泲泴洄洇洊洎洏洑洓洚洦洧洨汧洮洯洱洹洼洿浗浞浟浡浥浧浯浰浼涂涇涑涒涔涖涗涘涪涬涴涷涹涽涿淄淈淊淎淏淖淛淝淟淠淢淥淩淯淰淴淶淼渀渄渞渢渧渲渶渹渻渼湄湅湈湉湋湏湑湒湓湔湗湜湝湞"],
["8fc8a1","湢湣湨湳湻湽溍溓溙溠溧溭溮溱溳溻溿滀滁滃滇滈滊滍滎滏滫滭滮滹滻滽漄漈漊漌漍漖漘漚漛漦漩漪漯漰漳漶漻漼漭潏潑潒潓潗潙潚潝潞潡潢潨潬潽潾澃澇澈澋澌澍澐澒澓澔澖澚澟澠澥澦澧澨澮澯澰澵澶澼濅濇濈濊"],
["8fc9a1","濚濞濨濩濰濵濹濼濽瀀瀅瀆瀇瀍瀗瀠瀣瀯瀴瀷瀹瀼灃灄灈灉灊灋灔灕灝灞灎灤灥灬灮灵灶灾炁炅炆炔",4,"炛炤炫炰炱炴炷烊烑烓烔烕烖烘烜烤烺焃",4,"焋焌焏焞焠焫焭焯焰焱焸煁煅煆煇煊煋煐煒煗煚煜煞煠"],
["8fcaa1","煨煹熀熅熇熌熒熚熛熠熢熯熰熲熳熺熿燀燁燄燋燌燓燖燙燚燜燸燾爀爇爈爉爓爗爚爝爟爤爫爯爴爸爹牁牂牃牅牎牏牐牓牕牖牚牜牞牠牣牨牫牮牯牱牷牸牻牼牿犄犉犍犎犓犛犨犭犮犱犴犾狁狇狉狌狕狖狘狟狥狳狴狺狻"],
["8fcba1","狾猂猄猅猇猋猍猒猓猘猙猞猢猤猧猨猬猱猲猵猺猻猽獃獍獐獒獖獘獝獞獟獠獦獧獩獫獬獮獯獱獷獹獼玀玁玃玅玆玎玐玓玕玗玘玜玞玟玠玢玥玦玪玫玭玵玷玹玼玽玿珅珆珉珋珌珏珒珓珖珙珝珡珣珦珧珩珴珵珷珹珺珻珽"],
["8fcca1","珿琀琁琄琇琊琑琚琛琤琦琨",9,"琹瑀瑃瑄瑆瑇瑋瑍瑑瑒瑗瑝瑢瑦瑧瑨瑫瑭瑮瑱瑲璀璁璅璆璇璉璏璐璑璒璘璙璚璜璟璠璡璣璦璨璩璪璫璮璯璱璲璵璹璻璿瓈瓉瓌瓐瓓瓘瓚瓛瓞瓟瓤瓨瓪瓫瓯瓴瓺瓻瓼瓿甆"],
["8fcda1","甒甖甗甠甡甤甧甩甪甯甶甹甽甾甿畀畃畇畈畎畐畒畗畞畟畡畯畱畹",5,"疁疅疐疒疓疕疙疜疢疤疴疺疿痀痁痄痆痌痎痏痗痜痟痠痡痤痧痬痮痯痱痹瘀瘂瘃瘄瘇瘈瘊瘌瘏瘒瘓瘕瘖瘙瘛瘜瘝瘞瘣瘥瘦瘩瘭瘲瘳瘵瘸瘹"],
["8fcea1","瘺瘼癊癀癁癃癄癅癉癋癕癙癟癤癥癭癮癯癱癴皁皅皌皍皕皛皜皝皟皠皢",6,"皪皭皽盁盅盉盋盌盎盔盙盠盦盨盬盰盱盶盹盼眀眆眊眎眒眔眕眗眙眚眜眢眨眭眮眯眴眵眶眹眽眾睂睅睆睊睍睎睏睒睖睗睜睞睟睠睢"],
["8fcfa1","睤睧睪睬睰睲睳睴睺睽瞀瞄瞌瞍瞔瞕瞖瞚瞟瞢瞧瞪瞮瞯瞱瞵瞾矃矉矑矒矕矙矞矟矠矤矦矪矬矰矱矴矸矻砅砆砉砍砎砑砝砡砢砣砭砮砰砵砷硃硄硇硈硌硎硒硜硞硠硡硣硤硨硪确硺硾碊碏碔碘碡碝碞碟碤碨碬碭碰碱碲碳"],
["8fd0a1","碻碽碿磇磈磉磌磎磒磓磕磖磤磛磟磠磡磦磪磲磳礀磶磷磺磻磿礆礌礐礚礜礞礟礠礥礧礩礭礱礴礵礻礽礿祄祅祆祊祋祏祑祔祘祛祜祧祩祫祲祹祻祼祾禋禌禑禓禔禕禖禘禛禜禡禨禩禫禯禱禴禸离秂秄秇秈秊秏秔秖秚秝秞"],
["8fd1a1","秠秢秥秪秫秭秱秸秼稂稃稇稉稊稌稑稕稛稞稡稧稫稭稯稰稴稵稸稹稺穄穅穇穈穌穕穖穙穜穝穟穠穥穧穪穭穵穸穾窀窂窅窆窊窋窐窑窔窞窠窣窬窳窵窹窻窼竆竉竌竎竑竛竨竩竫竬竱竴竻竽竾笇笔笟笣笧笩笪笫笭笮笯笰"],
["8fd2a1","笱笴笽笿筀筁筇筎筕筠筤筦筩筪筭筯筲筳筷箄箉箎箐箑箖箛箞箠箥箬箯箰箲箵箶箺箻箼箽篂篅篈篊篔篖篗篙篚篛篨篪篲篴篵篸篹篺篼篾簁簂簃簄簆簉簋簌簎簏簙簛簠簥簦簨簬簱簳簴簶簹簺籆籊籕籑籒籓籙",5],
["8fd3a1","籡籣籧籩籭籮籰籲籹籼籽粆粇粏粔粞粠粦粰粶粷粺粻粼粿糄糇糈糉糍糏糓糔糕糗糙糚糝糦糩糫糵紃紇紈紉紏紑紒紓紖紝紞紣紦紪紭紱紼紽紾絀絁絇絈絍絑絓絗絙絚絜絝絥絧絪絰絸絺絻絿綁綂綃綅綆綈綋綌綍綑綖綗綝"],
["8fd4a1","綞綦綧綪綳綶綷綹緂",4,"緌緍緎緗緙縀緢緥緦緪緫緭緱緵緶緹緺縈縐縑縕縗縜縝縠縧縨縬縭縯縳縶縿繄繅繇繎繐繒繘繟繡繢繥繫繮繯繳繸繾纁纆纇纊纍纑纕纘纚纝纞缼缻缽缾缿罃罄罇罏罒罓罛罜罝罡罣罤罥罦罭"],
["8fd5a1","罱罽罾罿羀羋羍羏羐羑羖羗羜羡羢羦羪羭羴羼羿翀翃翈翎翏翛翟翣翥翨翬翮翯翲翺翽翾翿耇耈耊耍耎耏耑耓耔耖耝耞耟耠耤耦耬耮耰耴耵耷耹耺耼耾聀聄聠聤聦聭聱聵肁肈肎肜肞肦肧肫肸肹胈胍胏胒胔胕胗胘胠胭胮"],
["8fd6a1","胰胲胳胶胹胺胾脃脋脖脗脘脜脞脠脤脧脬脰脵脺脼腅腇腊腌腒腗腠腡腧腨腩腭腯腷膁膐膄膅膆膋膎膖膘膛膞膢膮膲膴膻臋臃臅臊臎臏臕臗臛臝臞臡臤臫臬臰臱臲臵臶臸臹臽臿舀舃舏舓舔舙舚舝舡舢舨舲舴舺艃艄艅艆"],
["8fd7a1","艋艎艏艑艖艜艠艣艧艭艴艻艽艿芀芁芃芄芇芉芊芎芑芔芖芘芚芛芠芡芣芤芧芨芩芪芮芰芲芴芷芺芼芾芿苆苐苕苚苠苢苤苨苪苭苯苶苷苽苾茀茁茇茈茊茋荔茛茝茞茟茡茢茬茭茮茰茳茷茺茼茽荂荃荄荇荍荎荑荕荖荗荰荸"],
["8fd8a1","荽荿莀莂莄莆莍莒莔莕莘莙莛莜莝莦莧莩莬莾莿菀菇菉菏菐菑菔菝荓菨菪菶菸菹菼萁萆萊萏萑萕萙莭萯萹葅葇葈葊葍葏葑葒葖葘葙葚葜葠葤葥葧葪葰葳葴葶葸葼葽蒁蒅蒒蒓蒕蒞蒦蒨蒩蒪蒯蒱蒴蒺蒽蒾蓀蓂蓇蓈蓌蓏蓓"],
["8fd9a1","蓜蓧蓪蓯蓰蓱蓲蓷蔲蓺蓻蓽蔂蔃蔇蔌蔎蔐蔜蔞蔢蔣蔤蔥蔧蔪蔫蔯蔳蔴蔶蔿蕆蕏",4,"蕖蕙蕜",6,"蕤蕫蕯蕹蕺蕻蕽蕿薁薅薆薉薋薌薏薓薘薝薟薠薢薥薧薴薶薷薸薼薽薾薿藂藇藊藋藎薭藘藚藟藠藦藨藭藳藶藼"],
["8fdaa1","藿蘀蘄蘅蘍蘎蘐蘑蘒蘘蘙蘛蘞蘡蘧蘩蘶蘸蘺蘼蘽虀虂虆虒虓虖虗虘虙虝虠",4,"虩虬虯虵虶虷虺蚍蚑蚖蚘蚚蚜蚡蚦蚧蚨蚭蚱蚳蚴蚵蚷蚸蚹蚿蛀蛁蛃蛅蛑蛒蛕蛗蛚蛜蛠蛣蛥蛧蚈蛺蛼蛽蜄蜅蜇蜋蜎蜏蜐蜓蜔蜙蜞蜟蜡蜣"],
["8fdba1","蜨蜮蜯蜱蜲蜹蜺蜼蜽蜾蝀蝃蝅蝍蝘蝝蝡蝤蝥蝯蝱蝲蝻螃",6,"螋螌螐螓螕螗螘螙螞螠螣螧螬螭螮螱螵螾螿蟁蟈蟉蟊蟎蟕蟖蟙蟚蟜蟟蟢蟣蟤蟪蟫蟭蟱蟳蟸蟺蟿蠁蠃蠆蠉蠊蠋蠐蠙蠒蠓蠔蠘蠚蠛蠜蠞蠟蠨蠭蠮蠰蠲蠵"],
["8fdca1","蠺蠼衁衃衅衈衉衊衋衎衑衕衖衘衚衜衟衠衤衩衱衹衻袀袘袚袛袜袟袠袨袪袺袽袾裀裊",4,"裑裒裓裛裞裧裯裰裱裵裷褁褆褍褎褏褕褖褘褙褚褜褠褦褧褨褰褱褲褵褹褺褾襀襂襅襆襉襏襒襗襚襛襜襡襢襣襫襮襰襳襵襺"],
["8fdda1","襻襼襽覉覍覐覔覕覛覜覟覠覥覰覴覵覶覷覼觔",4,"觥觩觫觭觱觳觶觹觽觿訄訅訇訏訑訒訔訕訞訠訢訤訦訫訬訯訵訷訽訾詀詃詅詇詉詍詎詓詖詗詘詜詝詡詥詧詵詶詷詹詺詻詾詿誀誃誆誋誏誐誒誖誗誙誟誧誩誮誯誳"],
["8fdea1","誶誷誻誾諃諆諈諉諊諑諓諔諕諗諝諟諬諰諴諵諶諼諿謅謆謋謑謜謞謟謊謭謰謷謼譂",4,"譈譒譓譔譙譍譞譣譭譶譸譹譼譾讁讄讅讋讍讏讔讕讜讞讟谸谹谽谾豅豇豉豋豏豑豓豔豗豘豛豝豙豣豤豦豨豩豭豳豵豶豻豾貆"],
["8fdfa1","貇貋貐貒貓貙貛貜貤貹貺賅賆賉賋賏賖賕賙賝賡賨賬賯賰賲賵賷賸賾賿贁贃贉贒贗贛赥赩赬赮赿趂趄趈趍趐趑趕趞趟趠趦趫趬趯趲趵趷趹趻跀跅跆跇跈跊跎跑跔跕跗跙跤跥跧跬跰趼跱跲跴跽踁踄踅踆踋踑踔踖踠踡踢"],
["8fe0a1","踣踦踧踱踳踶踷踸踹踽蹀蹁蹋蹍蹎蹏蹔蹛蹜蹝蹞蹡蹢蹩蹬蹭蹯蹰蹱蹹蹺蹻躂躃躉躐躒躕躚躛躝躞躢躧躩躭躮躳躵躺躻軀軁軃軄軇軏軑軔軜軨軮軰軱軷軹軺軭輀輂輇輈輏輐輖輗輘輞輠輡輣輥輧輨輬輭輮輴輵輶輷輺轀轁"],
["8fe1a1","轃轇轏轑",4,"轘轝轞轥辝辠辡辤辥辦辵辶辸达迀迁迆迊迋迍运迒迓迕迠迣迤迨迮迱迵迶迻迾适逄逈逌逘逛逨逩逯逪逬逭逳逴逷逿遃遄遌遛遝遢遦遧遬遰遴遹邅邈邋邌邎邐邕邗邘邙邛邠邡邢邥邰邲邳邴邶邽郌邾郃"],
["8fe2a1","郄郅郇郈郕郗郘郙郜郝郟郥郒郶郫郯郰郴郾郿鄀鄄鄅鄆鄈鄍鄐鄔鄖鄗鄘鄚鄜鄞鄠鄥鄢鄣鄧鄩鄮鄯鄱鄴鄶鄷鄹鄺鄼鄽酃酇酈酏酓酗酙酚酛酡酤酧酭酴酹酺酻醁醃醅醆醊醎醑醓醔醕醘醞醡醦醨醬醭醮醰醱醲醳醶醻醼醽醿"],
["8fe3a1","釂釃釅釓釔釗釙釚釞釤釥釩釪釬",5,"釷釹釻釽鈀鈁鈄鈅鈆鈇鈉鈊鈌鈐鈒鈓鈖鈘鈜鈝鈣鈤鈥鈦鈨鈮鈯鈰鈳鈵鈶鈸鈹鈺鈼鈾鉀鉂鉃鉆鉇鉊鉍鉎鉏鉑鉘鉙鉜鉝鉠鉡鉥鉧鉨鉩鉮鉯鉰鉵",4,"鉻鉼鉽鉿銈銉銊銍銎銒銗"],
["8fe4a1","銙銟銠銤銥銧銨銫銯銲銶銸銺銻銼銽銿",4,"鋅鋆鋇鋈鋋鋌鋍鋎鋐鋓鋕鋗鋘鋙鋜鋝鋟鋠鋡鋣鋥鋧鋨鋬鋮鋰鋹鋻鋿錀錂錈錍錑錔錕錜錝錞錟錡錤錥錧錩錪錳錴錶錷鍇鍈鍉鍐鍑鍒鍕鍗鍘鍚鍞鍤鍥鍧鍩鍪鍭鍯鍰鍱鍳鍴鍶"],
["8fe5a1","鍺鍽鍿鎀鎁鎂鎈鎊鎋鎍鎏鎒鎕鎘鎛鎞鎡鎣鎤鎦鎨鎫鎴鎵鎶鎺鎩鏁鏄鏅鏆鏇鏉",4,"鏓鏙鏜鏞鏟鏢鏦鏧鏹鏷鏸鏺鏻鏽鐁鐂鐄鐈鐉鐍鐎鐏鐕鐖鐗鐟鐮鐯鐱鐲鐳鐴鐻鐿鐽鑃鑅鑈鑊鑌鑕鑙鑜鑟鑡鑣鑨鑫鑭鑮鑯鑱鑲钄钃镸镹"],
["8fe6a1","镾閄閈閌閍閎閝閞閟閡閦閩閫閬閴閶閺閽閿闆闈闉闋闐闑闒闓闙闚闝闞闟闠闤闦阝阞阢阤阥阦阬阱阳阷阸阹阺阼阽陁陒陔陖陗陘陡陮陴陻陼陾陿隁隂隃隄隉隑隖隚隝隟隤隥隦隩隮隯隳隺雊雒嶲雘雚雝雞雟雩雯雱雺霂"],
["8fe7a1","霃霅霉霚霛霝霡霢霣霨霱霳靁靃靊靎靏靕靗靘靚靛靣靧靪靮靳靶靷靸靻靽靿鞀鞉鞕鞖鞗鞙鞚鞞鞟鞢鞬鞮鞱鞲鞵鞶鞸鞹鞺鞼鞾鞿韁韄韅韇韉韊韌韍韎韐韑韔韗韘韙韝韞韠韛韡韤韯韱韴韷韸韺頇頊頙頍頎頔頖頜頞頠頣頦"],
["8fe8a1","頫頮頯頰頲頳頵頥頾顄顇顊顑顒顓顖顗顙顚顢顣顥顦顪顬颫颭颮颰颴颷颸颺颻颿飂飅飈飌飡飣飥飦飧飪飳飶餂餇餈餑餕餖餗餚餛餜餟餢餦餧餫餱",4,"餹餺餻餼饀饁饆饇饈饍饎饔饘饙饛饜饞饟饠馛馝馟馦馰馱馲馵"],
["8fe9a1","馹馺馽馿駃駉駓駔駙駚駜駞駧駪駫駬駰駴駵駹駽駾騂騃騄騋騌騐騑騖騞騠騢騣騤騧騭騮騳騵騶騸驇驁驄驊驋驌驎驑驔驖驝骪骬骮骯骲骴骵骶骹骻骾骿髁髃髆髈髎髐髒髕髖髗髛髜髠髤髥髧髩髬髲髳髵髹髺髽髿",4],
["8feaa1","鬄鬅鬈鬉鬋鬌鬍鬎鬐鬒鬖鬙鬛鬜鬠鬦鬫鬭鬳鬴鬵鬷鬹鬺鬽魈魋魌魕魖魗魛魞魡魣魥魦魨魪",4,"魳魵魷魸魹魿鮀鮄鮅鮆鮇鮉鮊鮋鮍鮏鮐鮔鮚鮝鮞鮦鮧鮩鮬鮰鮱鮲鮷鮸鮻鮼鮾鮿鯁鯇鯈鯎鯐鯗鯘鯝鯟鯥鯧鯪鯫鯯鯳鯷鯸"],
["8feba1","鯹鯺鯽鯿鰀鰂鰋鰏鰑鰖鰘鰙鰚鰜鰞鰢鰣鰦",4,"鰱鰵鰶鰷鰽鱁鱃鱄鱅鱉鱊鱎鱏鱐鱓鱔鱖鱘鱛鱝鱞鱟鱣鱩鱪鱜鱫鱨鱮鱰鱲鱵鱷鱻鳦鳲鳷鳹鴋鴂鴑鴗鴘鴜鴝鴞鴯鴰鴲鴳鴴鴺鴼鵅鴽鵂鵃鵇鵊鵓鵔鵟鵣鵢鵥鵩鵪鵫鵰鵶鵷鵻"],
["8feca1","鵼鵾鶃鶄鶆鶊鶍鶎鶒鶓鶕鶖鶗鶘鶡鶪鶬鶮鶱鶵鶹鶼鶿鷃鷇鷉鷊鷔鷕鷖鷗鷚鷞鷟鷠鷥鷧鷩鷫鷮鷰鷳鷴鷾鸊鸂鸇鸎鸐鸑鸒鸕鸖鸙鸜鸝鹺鹻鹼麀麂麃麄麅麇麎麏麖麘麛麞麤麨麬麮麯麰麳麴麵黆黈黋黕黟黤黧黬黭黮黰黱黲黵"],
["8feda1","黸黿鼂鼃鼉鼏鼐鼑鼒鼔鼖鼗鼙鼚鼛鼟鼢鼦鼪鼫鼯鼱鼲鼴鼷鼹鼺鼼鼽鼿齁齃",4,"齓齕齖齗齘齚齝齞齨齩齭",4,"齳齵齺齽龏龐龑龒龔龖龗龞龡龢龣龥"]
]
{"uChars":[128,165,169,178,184,216,226,235,238,244,248,251,253,258,276,284,300,325,329,334,364,463,465,467,469,471,473,475,477,506,594,610,712,716,730,930,938,962,970,1026,1104,1106,8209,8215,8218,8222,8231,8241,8244,8246,8252,8365,8452,8454,8458,8471,8482,8556,8570,8596,8602,8713,8720,8722,8726,8731,8737,8740,8742,8748,8751,8760,8766,8777,8781,8787,8802,8808,8816,8854,8858,8870,8896,8979,9322,9372,9548,9588,9616,9622,9634,9652,9662,9672,9676,9680,9702,9735,9738,9793,9795,11906,11909,11913,11917,11928,11944,11947,11951,11956,11960,11964,11979,12284,12292,12312,12319,12330,12351,12436,12447,12535,12543,12586,12842,12850,12964,13200,13215,13218,13253,13263,13267,13270,13384,13428,13727,13839,13851,14617,14703,14801,14816,14964,15183,15471,15585,16471,16736,17208,17325,17330,17374,17623,17997,18018,18212,18218,18301,18318,18760,18811,18814,18820,18823,18844,18848,18872,19576,19620,19738,19887,40870,59244,59336,59367,59413,59417,59423,59431,59437,59443,59452,59460,59478,59493,63789,63866,63894,63976,63986,64016,64018,64021,64025,64034,64037,64042,65074,65093,65107,65112,65127,65132,65375,65510,65536],"gbChars":[0,36,38,45,50,81,89,95,96,100,103,104,105,109,126,133,148,172,175,179,208,306,307,308,309,310,311,312,313,341,428,443,544,545,558,741,742,749,750,805,819,820,7922,7924,7925,7927,7934,7943,7944,7945,7950,8062,8148,8149,8152,8164,8174,8236,8240,8262,8264,8374,8380,8381,8384,8388,8390,8392,8393,8394,8396,8401,8406,8416,8419,8424,8437,8439,8445,8482,8485,8496,8521,8603,8936,8946,9046,9050,9063,9066,9076,9092,9100,9108,9111,9113,9131,9162,9164,9218,9219,11329,11331,11334,11336,11346,11361,11363,11366,11370,11372,11375,11389,11682,11686,11687,11692,11694,11714,11716,11723,11725,11730,11736,11982,11989,12102,12336,12348,12350,12384,12393,12395,12397,12510,12553,12851,12962,12973,13738,13823,13919,13933,14080,14298,14585,14698,15583,15847,16318,16434,16438,16481,16729,17102,17122,17315,17320,17402,17418,17859,17909,17911,17915,17916,17936,17939,17961,18664,18703,18814,18962,19043,33469,33470,33471,33484,33485,33490,33497,33501,33505,33513,33520,33536,33550,37845,37921,37948,38029,38038,38064,38065,38066,38069,38075,38076,38078,39108,39109,39113,39114,39115,39116,39265,39394,189000]}[
["a140","",62],
["a180","",32],
["a240","",62],
["a280","",32],
["a2ab","",5],
["a2e3","€"],
["a2ef",""],
["a2fd",""],
["a340","",62],
["a380","",31,"　"],
["a440","",62],
["a480","",32],
["a4f4","",10],
["a540","",62],
["a580","",32],
["a5f7","",7],
["a640","",62],
["a680","",32],
["a6b9","",7],
["a6d9","",6],
["a6ec",""],
["a6f3",""],
["a6f6","",8],
["a740","",62],
["a780","",32],
["a7c2","",14],
["a7f2","",12],
["a896","",10],
["a8bc","ḿ"],
["a8bf","ǹ"],
["a8c1",""],
["a8ea","",20],
["a958",""],
["a95b",""],
["a95d",""],
["a989","〾⿰",11],
["a997","",12],
["a9f0","",14],
["aaa1","",93],
["aba1","",93],
["aca1","",93],
["ada1","",93],
["aea1","",93],
["afa1","",93],
["d7fa","",4],
["f8a1","",93],
["f9a1","",93],
["faa1","",93],
["fba1","",93],
["fca1","",93],
["fda1","",93],
["fe50","⺁⺄㑳㑇⺈⺋㖞㘚㘎⺌⺗㥮㤘㧏㧟㩳㧐㭎㱮㳠⺧⺪䁖䅟⺮䌷⺳⺶⺷䎱䎬⺻䏝䓖䙡䙌"],
["fe80","䜣䜩䝼䞍⻊䥇䥺䥽䦂䦃䦅䦆䦟䦛䦷䦶䲣䲟䲠䲡䱷䲢䴓",6,"䶮",93],
["8135f437",""]
]
[
["0","\u0000",128],
["a1","｡",62],
["8140","　、。，．・：；？！゛゜´｀¨＾￣＿ヽヾゝゞ〃仝々〆〇ー―‐／＼～∥｜…‥‘’“”（）〔〕［］｛｝〈",9,"＋－±×"],
["8180","÷＝≠＜＞≦≧∞∴♂♀°′″℃￥＄￠￡％＃＆＊＠§☆★○●◎◇◆□■△▲▽▼※〒→←↑↓〓"],
["81b8","∈∋⊆⊇⊂⊃∪∩"],
["81c8","∧∨￢⇒⇔∀∃"],
["81da","∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬"],
["81f0","Å‰♯♭♪†‡¶"],
["81fc","◯"],
["824f","０",9],
["8260","Ａ",25],
["8281","ａ",25],
["829f","ぁ",82],
["8340","ァ",62],
["8380","ム",22],
["839f","Α",16,"Σ",6],
["83bf","α",16,"σ",6],
["8440","А",5,"ЁЖ",25],
["8470","а",5,"ёж",7],
["8480","о",17],
["849f","─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂"],
["8740","①",19,"Ⅰ",9],
["875f","㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡"],
["877e","㍻"],
["8780","〝〟№㏍℡㊤",4,"㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪"],
["889f","亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭"],
["8940","院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円"],
["8980","園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改"],
["8a40","魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫"],
["8a80","橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄"],
["8b40","機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救"],
["8b80","朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈"],
["8c40","掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨"],
["8c80","劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向"],
["8d40","后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降"],
["8d80","項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷"],
["8e40","察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止"],
["8e80","死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周"],
["8f40","宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳"],
["8f80","準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾"],
["9040","拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨"],
["9080","逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線"],
["9140","繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻"],
["9180","操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只"],
["9240","叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄"],
["9280","逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓"],
["9340","邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬"],
["9380","凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入"],
["9440","如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅"],
["9480","楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美"],
["9540","鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷"],
["9580","斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋"],
["9640","法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆"],
["9680","摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒"],
["9740","諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲"],
["9780","沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯"],
["9840","蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕"],
["989f","弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲"],
["9940","僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭"],
["9980","凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨"],
["9a40","咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸"],
["9a80","噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩"],
["9b40","奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀"],
["9b80","它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏"],
["9c40","廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠"],
["9c80","怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛"],
["9d40","戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫"],
["9d80","捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼"],
["9e40","曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎"],
["9e80","梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣"],
["9f40","檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯"],
["9f80","麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌"],
["e040","漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝"],
["e080","烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱"],
["e140","瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿"],
["e180","痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬"],
["e240","磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰"],
["e280","窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆"],
["e340","紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷"],
["e380","縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋"],
["e440","隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤"],
["e480","艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈"],
["e540","蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬"],
["e580","蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞"],
["e640","襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧"],
["e680","諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊"],
["e740","蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜"],
["e780","轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮"],
["e840","錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙"],
["e880","閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰"],
["e940","顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃"],
["e980","騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈"],
["ea40","鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯"],
["ea80","黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠堯槇遙瑤凜熙"],
["ed40","纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏"],
["ed80","塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱"],
["ee40","犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙"],
["ee80","蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑"],
["eeef","ⅰ",9,"￢￤＇＂"],
["f040","",62],
["f080","",124],
["f140","",62],
["f180","",124],
["f240","",62],
["f280","",124],
["f340","",62],
["f380","",124],
["f440","",62],
["f480","",124],
["f540","",62],
["f580","",124],
["f640","",62],
["f680","",124],
["f740","",62],
["f780","",124],
["f840","",62],
["f880","",124],
["f940",""],
["fa40","ⅰ",9,"Ⅰ",9,"￢￤＇＂㈱№℡∵纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊"],
["fa80","兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯"],
["fb40","涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神"],
["fb80","祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙"],
["fc40","髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑"]
]
# Please see the documentation for all configuration options:
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates

version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "daily"
    allow:
      - dependency-type: production
Copyright 2008 Fair Oaks Labs, Inc.

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.

3. Neither the name of the copyright holder nor the names of its contributors may 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 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.
/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
exports.read = function (buffer, offset, isLE, mLen, nBytes) {
  var e, m
  var eLen = (nBytes * 8) - mLen - 1
  var eMax = (1 << eLen) - 1
  var eBias = eMax >> 1
  var nBits = -7
  var i = isLE ? (nBytes - 1) : 0
  var d = isLE ? -1 : 1
  var s = buffer[offset + i]

  i += d

  e = s & ((1 << (-nBits)) - 1)
  s >>= (-nBits)
  nBits += eLen
  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}

  m = e & ((1 << (-nBits)) - 1)
  e >>= (-nBits)
  nBits += mLen
  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}

  if (e === 0) {
    e = 1 - eBias
  } else if (e === eMax) {
    return m ? NaN : ((s ? -1 : 1) * Infinity)
  } else {
    m = m + Math.pow(2, mLen)
    e = e - eBias
  }
  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
}

exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
  var e, m, c
  var eLen = (nBytes * 8) - mLen - 1
  var eMax = (1 << eLen) - 1
  var eBias = eMax >> 1
  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
  var i = isLE ? 0 : (nBytes - 1)
  var d = isLE ? 1 : -1
  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0

  value = Math.abs(value)

  if (isNaN(value) || value === Infinity) {
    m = isNaN(value) ? 1 : 0
    e = eMax
  } else {
    e = Math.floor(Math.log(value) / Math.LN2)
    if (value * (c = Math.pow(2, -e)) < 1) {
      e--
      c *= 2
    }
    if (e + eBias >= 1) {
      value += rt / c
    } else {
      value += rt * Math.pow(2, 1 - eBias)
    }
    if (value * c >= 2) {
      e++
      c /= 2
    }

    if (e + eBias >= eMax) {
      m = 0
      e = eMax
    } else if (e + eBias >= 1) {
      m = ((value * c) - 1) * Math.pow(2, mLen)
      e = e + eBias
    } else {
      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
      e = 0
    }
  }

  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}

  e = (e << mLen) | m
  eLen += mLen
  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}

  buffer[offset + i - d] |= s * 128
}
{
  "name": "ieee754",
  "description": "Read/write IEEE754 floating point numbers from/to a Buffer or array-like object",
  "version": "1.2.1",
  "author": {
    "name": "Feross Aboukhadijeh",
    "email": "feross@feross.org",
    "url": "https://feross.org"
  },
  "devDependencies": {
    "airtap": "^3.0.0",
    "standard": "*",
    "tape": "^5.0.1"
  },
  "license": "BSD-3-Clause",
  "main": "index.js",
  "types": "index.d.ts",
  "repository": {
    "type": "git",
    "url": "git://github.com/feross/ieee754.git"
  },
  "funding": [
    {
      "type": "github",
      "url": "https://github.com/sponsors/feross"
    },
    {
      "type": "patreon",
      "url": "https://www.patreon.com/feross"
    },
    {
      "type": "consulting",
      "url": "https://feross.org/support"
    }
  ]
}/**
 * @preserve
 * JS Implementation of incremental MurmurHash3 (r150) (as of May 10, 2013)
 *
 * @author <a href="mailto:jensyt@gmail.com">Jens Taylor</a>
 * @see http://github.com/homebrewing/brauhaus-diff
 * @author <a href="mailto:gary.court@gmail.com">Gary Court</a>
 * @see http://github.com/garycourt/murmurhash-js
 * @author <a href="mailto:aappleby@gmail.com">Austin Appleby</a>
 * @see http://sites.google.com/site/murmurhash/
 */
(function(){
    var cache;

    // Call this function without `new` to use the cached object (good for
    // single-threaded environments), or with `new` to create a new object.
    //
    // @param {string} key A UTF-16 or ASCII string
    // @param {number} seed An optional positive integer
    // @return {object} A MurmurHash3 object for incremental hashing
    function MurmurHash3(key, seed) {
        var m = this instanceof MurmurHash3 ? this : cache;
        m.reset(seed)
        if (typeof key === 'string' && key.length > 0) {
            m.hash(key);
        }

        if (m !== this) {
            return m;
        }
    };

    // Incrementally add a string to this hash
    //
    // @param {string} key A UTF-16 or ASCII string
    // @return {object} this
    MurmurHash3.prototype.hash = function(key) {
        var h1, k1, i, top, len;

        len = key.length;
        this.len += len;

        k1 = this.k1;
        i = 0;
        switch (this.rem) {
            case 0: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) : 0;
            case 1: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) << 8 : 0;
            case 2: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) << 16 : 0;
            case 3:
                k1 ^= len > i ? (key.charCodeAt(i) & 0xff) << 24 : 0;
                k1 ^= len > i ? (key.charCodeAt(i++) & 0xff00) >> 8 : 0;
        }

        this.rem = (len + this.rem) & 3; // & 3 is same as % 4
        len -= this.rem;
        if (len > 0) {
            h1 = this.h1;
            while (1) {
                k1 = (k1 * 0x2d51 + (k1 & 0xffff) * 0xcc9e0000) & 0xffffffff;
                k1 = (k1 << 15) | (k1 >>> 17);
                k1 = (k1 * 0x3593 + (k1 & 0xffff) * 0x1b870000) & 0xffffffff;

                h1 ^= k1;
                h1 = (h1 << 13) | (h1 >>> 19);
                h1 = (h1 * 5 + 0xe6546b64) & 0xffffffff;

                if (i >= len) {
                    break;
                }

                k1 = ((key.charCodeAt(i++) & 0xffff)) ^
                     ((key.charCodeAt(i++) & 0xffff) << 8) ^
                     ((key.charCodeAt(i++) & 0xffff) << 16);
                top = key.charCodeAt(i++);
                k1 ^= ((top & 0xff) << 24) ^
                      ((top & 0xff00) >> 8);
            }

            k1 = 0;
            switch (this.rem) {
                case 3: k1 ^= (key.charCodeAt(i + 2) & 0xffff) << 16;
                case 2: k1 ^= (key.charCodeAt(i + 1) & 0xffff) << 8;
                case 1: k1 ^= (key.charCodeAt(i) & 0xffff);
            }

            this.h1 = h1;
        }

        this.k1 = k1;
        return this;
    };

    // Get the result of this hash
    //
    // @return {number} The 32-bit hash
    MurmurHash3.prototype.result = function() {
        var k1, h1;
        
        k1 = this.k1;
        h1 = this.h1;

        if (k1 > 0) {
            k1 = (k1 * 0x2d51 + (k1 & 0xffff) * 0xcc9e0000) & 0xffffffff;
            k1 = (k1 << 15) | (k1 >>> 17);
            k1 = (k1 * 0x3593 + (k1 & 0xffff) * 0x1b870000) & 0xffffffff;
            h1 ^= k1;
        }

        h1 ^= this.len;

        h1 ^= h1 >>> 16;
        h1 = (h1 * 0xca6b + (h1 & 0xffff) * 0x85eb0000) & 0xffffffff;
        h1 ^= h1 >>> 13;
        h1 = (h1 * 0xae35 + (h1 & 0xffff) * 0xc2b20000) & 0xffffffff;
        h1 ^= h1 >>> 16;

        return h1 >>> 0;
    };

    // Reset the hash object for reuse
    //
    // @param {number} seed An optional positive integer
    MurmurHash3.prototype.reset = function(seed) {
        this.h1 = typeof seed === 'number' ? seed : 0;
        this.rem = this.k1 = this.len = 0;
        return this;
    };

    // A cached object to use. This can be safely used if you're in a single-
    // threaded environment, otherwise you need to create new hashes to use.
    cache = new MurmurHash3();

    if (typeof(module) != 'undefined') {
        module.exports = MurmurHash3;
    } else {
        this.MurmurHash3 = MurmurHash3;
    }
}());
/**
 * @preserve
 * JS Implementation of incremental MurmurHash3 (r150) (as of May 10, 2013)
 *
 * @author <a href="mailto:jensyt@gmail.com">Jens Taylor</a>
 * @see http://github.com/homebrewing/brauhaus-diff
 * @author <a href="mailto:gary.court@gmail.com">Gary Court</a>
 * @see http://github.com/garycourt/murmurhash-js
 * @author <a href="mailto:aappleby@gmail.com">Austin Appleby</a>
 * @see http://sites.google.com/site/murmurhash/
 */
!function(){function t(h,r){var s=this instanceof t?this:e;return s.reset(r),"string"==typeof h&&h.length>0&&s.hash(h),s!==this?s:void 0}var e;t.prototype.hash=function(t){var e,h,r,s,i;switch(i=t.length,this.len+=i,h=this.k1,r=0,this.rem){case 0:h^=i>r?65535&t.charCodeAt(r++):0;case 1:h^=i>r?(65535&t.charCodeAt(r++))<<8:0;case 2:h^=i>r?(65535&t.charCodeAt(r++))<<16:0;case 3:h^=i>r?(255&t.charCodeAt(r))<<24:0,h^=i>r?(65280&t.charCodeAt(r++))>>8:0}if(this.rem=3&i+this.rem,i-=this.rem,i>0){for(e=this.h1;;){if(h=4294967295&11601*h+3432906752*(65535&h),h=h<<15|h>>>17,h=4294967295&13715*h+461832192*(65535&h),e^=h,e=e<<13|e>>>19,e=4294967295&5*e+3864292196,r>=i)break;h=65535&t.charCodeAt(r++)^(65535&t.charCodeAt(r++))<<8^(65535&t.charCodeAt(r++))<<16,s=t.charCodeAt(r++),h^=(255&s)<<24^(65280&s)>>8}switch(h=0,this.rem){case 3:h^=(65535&t.charCodeAt(r+2))<<16;case 2:h^=(65535&t.charCodeAt(r+1))<<8;case 1:h^=65535&t.charCodeAt(r)}this.h1=e}return this.k1=h,this},t.prototype.result=function(){var t,e;return t=this.k1,e=this.h1,t>0&&(t=4294967295&11601*t+3432906752*(65535&t),t=t<<15|t>>>17,t=4294967295&13715*t+461832192*(65535&t),e^=t),e^=this.len,e^=e>>>16,e=4294967295&51819*e+2246770688*(65535&e),e^=e>>>13,e=4294967295&44597*e+3266445312*(65535&e),e^=e>>>16,e>>>0},t.prototype.reset=function(t){return this.h1="number"==typeof t?t:0,this.rem=this.k1=this.len=0,this},e=new t,"undefined"!=typeof module?module.exports=t:this.MurmurHash3=t}();{
  "name": "imurmurhash",
  "version": "0.1.4",
  "description": "An incremental implementation of MurmurHash3",
  "homepage": "https://github.com/jensyt/imurmurhash-js",
  "main": "imurmurhash.js",
  "files": [
    "imurmurhash.js",
    "imurmurhash.min.js",
    "package.json",
    "README.md"
  ],
  "repository": {
    "type": "git",
    "url": "https://github.com/jensyt/imurmurhash-js"
  },
  "author": {
    "name": "Jens Taylor",
    "email": "jensyt@gmail.com",
    "url": "https://github.com/homebrewing"
  },
  "license": "MIT",
  "dependencies": {},
  "devDependencies": {},
  "engines": {
    "node": ">=0.8.19"
  }
}'use strict';

module.exports = (string, count = 1, options) => {
	options = {
		indent: ' ',
		includeEmptyLines: false,
		...options
	};

	if (typeof string !== 'string') {
		throw new TypeError(
			`Expected \`input\` to be a \`string\`, got \`${typeof string}\``
		);
	}

	if (typeof count !== 'number') {
		throw new TypeError(
			`Expected \`count\` to be a \`number\`, got \`${typeof count}\``
		);
	}

	if (typeof options.indent !== 'string') {
		throw new TypeError(
			`Expected \`options.indent\` to be a \`string\`, got \`${typeof options.indent}\``
		);
	}

	if (count === 0) {
		return string;
	}

	const regex = options.includeEmptyLines ? /^/gm : /^(?!\s*$)/gm;

	return string.replace(regex, options.indent.repeat(count));
};
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": "indent-string",
  "version": "4.0.0",
  "description": "Indent each line in a string",
  "license": "MIT",
  "repository": "sindresorhus/indent-string",
  "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"
  }
}The ISC License

Copyright (c) npm, Inc. 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.
const cache = new Map()
const fs = require('fs')
const { dirname, resolve } = require('path')


const lstat = path => new Promise((res, rej) =>
  fs.lstat(path, (er, st) => er ? rej(er) : res(st)))

const inferOwner = path => {
  path = resolve(path)
  if (cache.has(path))
    return Promise.resolve(cache.get(path))

  const statThen = st => {
    const { uid, gid } = st
    cache.set(path, { uid, gid })
    return { uid, gid }
  }
  const parent = dirname(path)
  const parentTrap = parent === path ? null : er => {
    return inferOwner(parent).then((owner) => {
      cache.set(path, owner)
      return owner
    })
  }
  return lstat(path).then(statThen, parentTrap)
}

const inferOwnerSync = path => {
  path = resolve(path)
  if (cache.has(path))
    return cache.get(path)

  const parent = dirname(path)

  // avoid obscuring call site by re-throwing
  // "catch" the error by returning from a finally,
  // only if we're not at the root, and the parent call works.
  let threw = true
  try {
    const st = fs.lstatSync(path)
    threw = false
    const { uid, gid } = st
    cache.set(path, { uid, gid })
    return { uid, gid }
  } finally {
    if (threw && parent !== path) {
      const owner = inferOwnerSync(parent)
      cache.set(path, owner)
      return owner // eslint-disable-line no-unsafe-finally
    }
  }
}

const inflight = new Map()
module.exports = path => {
  path = resolve(path)
  if (inflight.has(path))
    return Promise.resolve(inflight.get(path))
  const p = inferOwner(path).then(owner => {
    inflight.delete(path)
    return owner
  })
  inflight.set(path, p)
  return p
}
module.exports.sync = inferOwnerSync
module.exports.clearCache = () => {
  cache.clear()
  inflight.clear()
}
{
  "name": "infer-owner",
  "version": "1.0.4",
  "description": "Infer the owner of a path based on the owner of its nearest existing parent",
  "author": "Isaac Z. Schlueter <i@izs.me> (https://izs.me)",
  "license": "ISC",
  "devDependencies": {
    "mutate-fs": "^2.1.1",
    "tap": "^12.4.2"
  },
  "main": "index.js",
  "repository": "https://github.com/npm/infer-owner",
  "publishConfig": {
    "access": "public"
  },
  "files": [
    "index.js"
  ]
}MIT License

Copyright (c) 2021 dreamerslab

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": "inflection",
  "version": "1.13.2",
  "description": "A port of inflection-js to node.js module",
  "author": "dreamerslab <ben@dreamerslab.com>",
  "devDependencies": {
    "mocha": "^9.2.0",
    "should": "^13.2.3",
    "terser": "^5.10.0"
  },
  "main": "./lib/inflection.js",
  "repository": {
    "type": "git",
    "url": "https://github.com/dreamerslab/node.inflection.git"
  },
  "engines": [
    "node >= 0.4.0"
  ],
  "license": "MIT"
}/*!
 * inflection
 * Copyright(c) 2011 Ben Lin <ben@dreamerslab.com>
 * MIT Licensed
 *
 * @fileoverview
 * A port of inflection-js to node.js module.
 */

( function ( root, factory ){
  if( typeof define === 'function' && define.amd ){
    define([], factory );
  }else if( typeof exports === 'object' ){
    module.exports = factory();
  }else{
    root.inflection = factory();
  }
}( this, function (){

  /**
   * @description This is a list of nouns that use the same form for both singular and plural.
   *              This list should remain entirely in lower case to correctly match Strings.
   * @private
   */
  var uncountable_words = [
    // 'access',
    'accommodation',
    'adulthood',
    'advertising',
    'advice',
    'aggression',
    'aid',
    'air',
    'aircraft',
    'alcohol',
    'anger',
    'applause',
    'arithmetic',
    // 'art',
    'assistance',
    'athletics',
    // 'attention',

    'bacon',
    'baggage',
    // 'ballet',
    // 'beauty',
    'beef',
    // 'beer',
    // 'behavior',
    'biology',
    // 'billiards',
    'blood',
    'botany',
    // 'bowels',
    'bread',
    // 'business',
    'butter',

    'carbon',
    'cardboard',
    'cash',
    'chalk',
    'chaos',
    'chess',
    'crossroads',
    'countryside',

    // 'damage',
    'dancing',
    // 'danger',
    'deer',
    // 'delight',
    // 'dessert',
    'dignity',
    'dirt',
    // 'distribution',
    'dust',

    'economics',
    'education',
    'electricity',
    // 'employment',
    // 'energy',
    'engineering',
    'enjoyment',
    // 'entertainment',
    'envy',
    'equipment',
    'ethics',
    'evidence',
    'evolution',

    // 'failure',
    // 'faith',
    'fame',
    'fiction',
    // 'fish',
    'flour',
    'flu',
    'food',
    // 'freedom',
    // 'fruit',
    'fuel',
    'fun',
    // 'funeral',
    'furniture',

    'gallows',
    'garbage',
    'garlic',
    // 'gas',
    'genetics',
    // 'glass',
    'gold',
    'golf',
    'gossip',
    // 'grass',
    'gratitude',
    'grief',
    // 'ground',
    'guilt',
    'gymnastics',

    // 'hair',
    'happiness',
    'hardware',
    'harm',
    'hate',
    'hatred',
    'health',
    'heat',
    // 'height',
    'help',
    'homework',
    'honesty',
    'honey',
    'hospitality',
    'housework',
    'humour',
    'hunger',
    'hydrogen',

    'ice',
    'importance',
    'inflation',
    'information',
    // 'injustice',
    'innocence',
    // 'intelligence',
    'iron',
    'irony',

    'jam',
    // 'jealousy',
    // 'jelly',
    'jewelry',
    // 'joy',
    'judo',
    // 'juice',
    // 'justice',

    'karate',
    // 'kindness',
    'knowledge',

    // 'labour',
    'lack',
    // 'land',
    'laughter',
    'lava',
    'leather',
    'leisure',
    'lightning',
    'linguine',
    'linguini',
    'linguistics',
    'literature',
    'litter',
    'livestock',
    'logic',
    'loneliness',
    // 'love',
    'luck',
    'luggage',

    'macaroni',
    'machinery',
    'magic',
    // 'mail',
    'management',
    'mankind',
    'marble',
    'mathematics',
    'mayonnaise',
    'measles',
    // 'meat',
    // 'metal',
    'methane',
    'milk',
    'minus',
    'money',
    // 'moose',
    'mud',
    'music',
    'mumps',

    'nature',
    'news',
    'nitrogen',
    'nonsense',
    'nurture',
    'nutrition',

    'obedience',
    'obesity',
    // 'oil',
    'oxygen',

    // 'paper',
    // 'passion',
    'pasta',
    'patience',
    // 'permission',
    'physics',
    'poetry',
    'pollution',
    'poverty',
    // 'power',
    'pride',
    // 'production',
    // 'progress',
    // 'pronunciation',
    'psychology',
    'publicity',
    'punctuation',

    // 'quality',
    // 'quantity',
    'quartz',

    'racism',
    // 'rain',
    // 'recreation',
    'relaxation',
    'reliability',
    'research',
    'respect',
    'revenge',
    'rice',
    'rubbish',
    'rum',

    'safety',
    // 'salad',
    // 'salt',
    // 'sand',
    // 'satire',
    'scenery',
    'seafood',
    'seaside',
    'series',
    'shame',
    'sheep',
    'shopping',
    // 'silence',
    'sleep',
    // 'slang'
    'smoke',
    'smoking',
    'snow',
    'soap',
    'software',
    'soil',
    // 'sorrow',
    // 'soup',
    'spaghetti',
    // 'speed',
    'species',
    // 'spelling',
    // 'sport',
    'steam',
    // 'strength',
    'stuff',
    'stupidity',
    // 'success',
    // 'sugar',
    'sunshine',
    'symmetry',

    // 'tea',
    'tennis',
    'thirst',
    'thunder',
    'timber',
    // 'time',
    // 'toast',
    // 'tolerance',
    // 'trade',
    'traffic',
    'transportation',
    // 'travel',
    'trust',

    // 'understanding',
    'underwear',
    'unemployment',
    'unity',
    // 'usage',

    'validity',
    'veal',
    'vegetation',
    'vegetarianism',
    'vengeance',
    'violence',
    // 'vision',
    'vitality',

    'warmth',
    // 'water',
    'wealth',
    'weather',
    // 'weight',
    'welfare',
    'wheat',
    // 'whiskey',
    // 'width',
    'wildlife',
    // 'wine',
    'wisdom',
    // 'wood',
    // 'wool',
    // 'work',

    // 'yeast',
    'yoga',

    'zinc',
    'zoology'
  ];

  /**
   * @description These rules translate from the singular form of a noun to its plural form.
   * @private
   */

  var regex = {
    plural : {
      men       : new RegExp( '^(m|wom)en$'                    , 'gi' ),
      people    : new RegExp( '(pe)ople$'                      , 'gi' ),
      children  : new RegExp( '(child)ren$'                    , 'gi' ),
      tia       : new RegExp( '([ti])a$'                       , 'gi' ),
      analyses  : new RegExp( '((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$','gi' ),
      drives    : new RegExp( '(drive)s$'                      , 'gi' ),
      hives     : new RegExp( '(hi|ti)ves$'                    , 'gi' ),
      curves    : new RegExp( '(curve)s$'                      , 'gi' ),
      lrves     : new RegExp( '([lr])ves$'                     , 'gi' ),
      aves      : new RegExp( '([a])ves$'                      , 'gi' ),
      foves     : new RegExp( '([^fo])ves$'                    , 'gi' ),
      movies    : new RegExp( '(m)ovies$'                      , 'gi' ),
      aeiouyies : new RegExp( '([^aeiouy]|qu)ies$'             , 'gi' ),
      series    : new RegExp( '(s)eries$'                      , 'gi' ),
      xes       : new RegExp( '(x|ch|ss|sh)es$'                , 'gi' ),
      mice      : new RegExp( '([m|l])ice$'                    , 'gi' ),
      buses     : new RegExp( '(bus)es$'                       , 'gi' ),
      oes       : new RegExp( '(o)es$'                         , 'gi' ),
      shoes     : new RegExp( '(shoe)s$'                       , 'gi' ),
      crises    : new RegExp( '(cris|ax|test)es$'              , 'gi' ),
      octopuses : new RegExp( '(octop|vir)uses$'               , 'gi' ),
      aliases   : new RegExp( '(alias|canvas|status|campus)es$', 'gi' ),
      summonses : new RegExp( '^(summons|bonus)es$'            , 'gi' ),
      oxen      : new RegExp( '^(ox)en'                        , 'gi' ),
      matrices  : new RegExp( '(matr)ices$'                    , 'gi' ),
      vertices  : new RegExp( '(vert|ind)ices$'                , 'gi' ),
      feet      : new RegExp( '^feet$'                         , 'gi' ),
      teeth     : new RegExp( '^teeth$'                        , 'gi' ),
      geese     : new RegExp( '^geese$'                        , 'gi' ),
      quizzes   : new RegExp( '(quiz)zes$'                     , 'gi' ),
      whereases : new RegExp( '^(whereas)es$'                  , 'gi' ),
      criteria  : new RegExp( '^(criteri)a$'                   , 'gi' ),
      genera    : new RegExp( '^genera$'                       , 'gi' ),
      ss        : new RegExp( 'ss$'                            , 'gi' ),
      s         : new RegExp( 's$'                             , 'gi' )
    },

    singular : {
      man       : new RegExp( '^(m|wom)an$'                  , 'gi' ),
      person    : new RegExp( '(pe)rson$'                    , 'gi' ),
      child     : new RegExp( '(child)$'                     , 'gi' ),
      drive     : new RegExp( '(drive)$'                     , 'gi' ),
      ox        : new RegExp( '^(ox)$'                       , 'gi' ),
      axis      : new RegExp( '(ax|test)is$'                 , 'gi' ),
      octopus   : new RegExp( '(octop|vir)us$'               , 'gi' ),
      alias     : new RegExp( '(alias|status|canvas|campus)$', 'gi' ),
      summons   : new RegExp( '^(summons|bonus)$'            , 'gi' ),
      bus       : new RegExp( '(bu)s$'                       , 'gi' ),
      buffalo   : new RegExp( '(buffal|tomat|potat)o$'       , 'gi' ),
      tium      : new RegExp( '([ti])um$'                    , 'gi' ),
      sis       : new RegExp( 'sis$'                         , 'gi' ),
      ffe       : new RegExp( '(?:([^f])fe|([lr])f)$'        , 'gi' ),
      hive      : new RegExp( '(hi|ti)ve$'                   , 'gi' ),
      aeiouyy   : new RegExp( '([^aeiouy]|qu)y$'             , 'gi' ),
      x         : new RegExp( '(x|ch|ss|sh)$'                , 'gi' ),
      matrix    : new RegExp( '(matr)ix$'                    , 'gi' ),
      vertex    : new RegExp( '(vert|ind)ex$'                , 'gi' ),
      mouse     : new RegExp( '([m|l])ouse$'                 , 'gi' ),
      foot      : new RegExp( '^foot$'                       , 'gi' ),
      tooth     : new RegExp( '^tooth$'                      , 'gi' ),
      goose     : new RegExp( '^goose$'                      , 'gi' ),
      quiz      : new RegExp( '(quiz)$'                      , 'gi' ),
      whereas   : new RegExp( '^(whereas)$'                  , 'gi' ),
      criterion : new RegExp( '^(criteri)on$'                , 'gi' ),
      genus     : new RegExp( '^genus$'                      , 'gi' ),
      s         : new RegExp( 's$'                           , 'gi' ),
      common    : new RegExp( '$'                            , 'gi' )
    }
  };

  var plural_rules = [

    // do not replace if its already a plural word
    [ regex.plural.men       ],
    [ regex.plural.people    ],
    [ regex.plural.children  ],
    [ regex.plural.tia       ],
    [ regex.plural.analyses  ],
    [ regex.plural.drives    ],
    [ regex.plural.hives     ],
    [ regex.plural.curves    ],
    [ regex.plural.lrves     ],
    [ regex.plural.foves     ],
    [ regex.plural.aeiouyies ],
    [ regex.plural.series    ],
    [ regex.plural.movies    ],
    [ regex.plural.xes       ],
    [ regex.plural.mice      ],
    [ regex.plural.buses     ],
    [ regex.plural.oes       ],
    [ regex.plural.shoes     ],
    [ regex.plural.crises    ],
    [ regex.plural.octopuses ],
    [ regex.plural.aliases   ],
    [ regex.plural.summonses ],
    [ regex.plural.oxen      ],
    [ regex.plural.matrices  ],
    [ regex.plural.feet      ],
    [ regex.plural.teeth     ],
    [ regex.plural.geese     ],
    [ regex.plural.quizzes   ],
    [ regex.plural.whereases ],
    [ regex.plural.criteria  ],
    [ regex.plural.genera    ],

    // original rule
    [ regex.singular.man      , '$1en' ],
    [ regex.singular.person   , '$1ople' ],
    [ regex.singular.child    , '$1ren' ],
    [ regex.singular.drive    , '$1s' ],
    [ regex.singular.ox       , '$1en' ],
    [ regex.singular.axis     , '$1es' ],
    [ regex.singular.octopus  , '$1uses' ],
    [ regex.singular.alias    , '$1es' ],
    [ regex.singular.summons  , '$1es' ],
    [ regex.singular.bus      , '$1ses' ],
    [ regex.singular.buffalo  , '$1oes' ],
    [ regex.singular.tium     , '$1a' ],
    [ regex.singular.sis      , 'ses' ],
    [ regex.singular.ffe      , '$1$2ves' ],
    [ regex.singular.hive     , '$1ves' ],
    [ regex.singular.aeiouyy  , '$1ies' ],
    [ regex.singular.matrix   , '$1ices' ],
    [ regex.singular.vertex   , '$1ices' ],
    [ regex.singular.x        , '$1es' ],
    [ regex.singular.mouse    , '$1ice' ],
    [ regex.singular.foot     , 'feet' ],
    [ regex.singular.tooth    , 'teeth' ],
    [ regex.singular.goose    , 'geese' ],
    [ regex.singular.quiz     , '$1zes' ],
    [ regex.singular.whereas  , '$1es' ],
    [ regex.singular.criterion, '$1a' ],
    [ regex.singular.genus    , 'genera' ],

    [ regex.singular.s     , 's' ],
    [ regex.singular.common, 's' ]
  ];

  /**
   * @description These rules translate from the plural form of a noun to its singular form.
   * @private
   */
  var singular_rules = [

    // do not replace if its already a singular word
    [ regex.singular.man     ],
    [ regex.singular.person  ],
    [ regex.singular.child   ],
    [ regex.singular.drive   ],
    [ regex.singular.ox      ],
    [ regex.singular.axis    ],
    [ regex.singular.octopus ],
    [ regex.singular.alias   ],
    [ regex.singular.summons ],
    [ regex.singular.bus     ],
    [ regex.singular.buffalo ],
    [ regex.singular.tium    ],
    [ regex.singular.sis     ],
    [ regex.singular.ffe     ],
    [ regex.singular.hive    ],
    [ regex.singular.aeiouyy ],
    [ regex.singular.x       ],
    [ regex.singular.matrix  ],
    [ regex.singular.mouse   ],
    [ regex.singular.foot    ],
    [ regex.singular.tooth   ],
    [ regex.singular.goose   ],
    [ regex.singular.quiz    ],
    [ regex.singular.whereas ],
    [ regex.singular.criterion ],
    [ regex.singular.genus ],

    // original rule
    [ regex.plural.men      , '$1an' ],
    [ regex.plural.people   , '$1rson' ],
    [ regex.plural.children , '$1' ],
    [ regex.plural.drives   , '$1'],
    [ regex.plural.genera   , 'genus'],
    [ regex.plural.criteria , '$1on'],
    [ regex.plural.tia      , '$1um' ],
    [ regex.plural.analyses , '$1$2sis' ],
    [ regex.plural.hives    , '$1ve' ],
    [ regex.plural.curves   , '$1' ],
    [ regex.plural.lrves    , '$1f' ],
    [ regex.plural.aves     , '$1ve' ],
    [ regex.plural.foves    , '$1fe' ],
    [ regex.plural.movies   , '$1ovie' ],
    [ regex.plural.aeiouyies, '$1y' ],
    [ regex.plural.series   , '$1eries' ],
    [ regex.plural.xes      , '$1' ],
    [ regex.plural.mice     , '$1ouse' ],
    [ regex.plural.buses    , '$1' ],
    [ regex.plural.oes      , '$1' ],
    [ regex.plural.shoes    , '$1' ],
    [ regex.plural.crises   , '$1is' ],
    [ regex.plural.octopuses, '$1us' ],
    [ regex.plural.aliases  , '$1' ],
    [ regex.plural.summonses, '$1' ],
    [ regex.plural.oxen     , '$1' ],
    [ regex.plural.matrices , '$1ix' ],
    [ regex.plural.vertices , '$1ex' ],
    [ regex.plural.feet     , 'foot' ],
    [ regex.plural.teeth    , 'tooth' ],
    [ regex.plural.geese    , 'goose' ],
    [ regex.plural.quizzes  , '$1' ],
    [ regex.plural.whereases, '$1' ],

    [ regex.plural.ss, 'ss' ],
    [ regex.plural.s , '' ]
  ];

  /**
   * @description This is a list of words that should not be capitalized for title case.
   * @private
   */
  var non_titlecased_words = [
    'and', 'or', 'nor', 'a', 'an', 'the', 'so', 'but', 'to', 'of', 'at','by',
    'from', 'into', 'on', 'onto', 'off', 'out', 'in', 'over', 'with', 'for'
  ];

  /**
   * @description These are regular expressions used for converting between String formats.
   * @private
   */
  var id_suffix         = new RegExp( '(_ids|_id)$', 'g' );
  var underbar          = new RegExp( '_', 'g' );
  var space_or_underbar = new RegExp( '[\ _]', 'g' );
  var uppercase         = new RegExp( '([A-Z])', 'g' );
  var underbar_prefix   = new RegExp( '^_' );

  var inflector = {

  /**
   * A helper method that applies rules based replacement to a String.
   * @private
   * @function
   * @param {String} str String to modify and return based on the passed rules.
   * @param {Array: [RegExp, String]} rules Regexp to match paired with String to use for replacement
   * @param {Array: [String]} skip Strings to skip if they match
   * @param {String} override String to return as though this method succeeded (used to conform to APIs)
   * @returns {String} Return passed String modified by passed rules.
   * @example
   *
   *     this._apply_rules( 'cows', singular_rules ); // === 'cow'
   */
    _apply_rules : function ( str, rules, skip, override ){
      if( override ){
        str = override;
      }else{
        var ignore = ( inflector.indexOf( skip, str.toLowerCase()) > -1 );

        if( !ignore ){
          var i = 0;
          var j = rules.length;

          for( ; i < j; i++ ){
            if( str.match( rules[ i ][ 0 ])){
              if( rules[ i ][ 1 ] !== undefined ){
                str = str.replace( rules[ i ][ 0 ], rules[ i ][ 1 ]);
              }
              break;
            }
          }
        }
      }

      return str;
    },



  /**
   * This lets us detect if an Array contains a given element.
   * @public
   * @function
   * @param {Array} arr The subject array.
   * @param {Object} item Object to locate in the Array.
   * @param {Number} from_index Starts checking from this position in the Array.(optional)
   * @param {Function} compare_func Function used to compare Array item vs passed item.(optional)
   * @returns {Number} Return index position in the Array of the passed item.
   * @example
   *
   *     var inflection = require( 'inflection' );
   *
   *     inflection.indexOf([ 'hi','there' ], 'guys' ); // === -1
   *     inflection.indexOf([ 'hi','there' ], 'hi' ); // === 0
   */
    indexOf : function ( arr, item, from_index, compare_func ){
      if( !from_index ){
        from_index = -1;
      }

      var index = -1;
      var i     = from_index;
      var j     = arr.length;

      for( ; i < j; i++ ){
        if( arr[ i ]  === item || compare_func && compare_func( arr[ i ], item )){
          index = i;
          break;
        }
      }

      return index;
    },



  /**
   * This function adds pluralization support to every String object.
   * @public
   * @function
   * @param {String} str The subject string.
   * @param {String} plural Overrides normal output with said String.(optional)
   * @returns {String} Singular English language nouns are returned in plural form.
   * @example
   *
   *     var inflection = require( 'inflection' );
   *
   *     inflection.pluralize( 'person' ); // === 'people'
   *     inflection.pluralize( 'octopus' ); // === 'octopuses'
   *     inflection.pluralize( 'Hat' ); // === 'Hats'
   *     inflection.pluralize( 'person', 'guys' ); // === 'guys'
   */
    pluralize : function ( str, plural ){
      return inflector._apply_rules( str, plural_rules, uncountable_words, plural );
    },



  /**
   * This function adds singularization support to every String object.
   * @public
   * @function
   * @param {String} str The subject string.
   * @param {String} singular Overrides normal output with said String.(optional)
   * @returns {String} Plural English language nouns are returned in singular form.
   * @example
   *
   *     var inflection = require( 'inflection' );
   *
   *     inflection.singularize( 'people' ); // === 'person'
   *     inflection.singularize( 'octopuses' ); // === 'octopus'
   *     inflection.singularize( 'Hats' ); // === 'Hat'
   *     inflection.singularize( 'guys', 'person' ); // === 'person'
   */
    singularize : function ( str, singular ){
      return inflector._apply_rules( str, singular_rules, uncountable_words, singular );
    },


  /**
   * This function will pluralize or singularlize a String appropriately based on a number value
   * @public
   * @function
   * @param {String} str The subject string.
   * @param {Number} count The number to base pluralization off of.
   * @param {String} singular Overrides normal output with said String.(optional)
   * @param {String} plural Overrides normal output with said String.(optional)
   * @returns {String} English language nouns are returned in the plural or singular form based on the count.
   * @example
   *
   *     var inflection = require( 'inflection' );
   *
   *     inflection.inflect( 'people' 1 ); // === 'person'
   *     inflection.inflect( 'octopuses' 1 ); // === 'octopus'
   *     inflection.inflect( 'Hats' 1 ); // === 'Hat'
   *     inflection.inflect( 'guys', 1 , 'person' ); // === 'person'
   *     inflection.inflect( 'inches', 1.5 ); // === 'inches'
   *     inflection.inflect( 'person', 2 ); // === 'people'
   *     inflection.inflect( 'octopus', 2 ); // === 'octopuses'
   *     inflection.inflect( 'Hat', 2 ); // === 'Hats'
   *     inflection.inflect( 'person', 2, null, 'guys' ); // === 'guys'
   */
    inflect : function ( str, count, singular, plural ){
      count = parseFloat( count, 10 );

      if( isNaN( count )) return str;

      if( count === 1 ){
        return inflector._apply_rules( str, singular_rules, uncountable_words, singular );
      }else{
        return inflector._apply_rules( str, plural_rules, uncountable_words, plural );
      }
    },



  /**
   * This function adds camelization support to every String object.
   * @public
   * @function
   * @param {String} str The subject string.
   * @param {Boolean} low_first_letter Default is to capitalize the first letter of the results.(optional)
   *                                 Passing true will lowercase it.
   * @returns {String} Lower case underscored words will be returned in camel case.
   *                  additionally '/' is translated to '::'
   * @example
   *
   *     var inflection = require( 'inflection' );
   *
   *     inflection.camelize( 'message_properties' ); // === 'MessageProperties'
   *     inflection.camelize( 'message_properties', true ); // === 'messageProperties'
   */
    camelize : function ( str, low_first_letter ){
      var str_path = str.split( '/' );
      var i        = 0;
      var j        = str_path.length;
      var str_arr, init_x, k, l, first;

      for( ; i < j; i++ ){
        str_arr = str_path[ i ].split( '_' );
        k       = 0;
        l       = str_arr.length;

        for( ; k < l; k++ ){
          if( k !== 0 ){
            str_arr[ k ] = str_arr[ k ].toLowerCase();
          }

          first = str_arr[ k ].charAt( 0 );
          first = low_first_letter && i === 0 && k === 0
            ? first.toLowerCase() : first.toUpperCase();
          str_arr[ k ] = first + str_arr[ k ].substring( 1 );
        }

        str_path[ i ] = str_arr.join( '' );
      }

      return str_path.join( '::' );
    },



  /**
   * This function adds underscore support to every String object.
   * @public
   * @function
   * @param {String} str The subject string.
   * @param {Boolean} all_upper_case Default is to lowercase and add underscore prefix.(optional)
   *                  Passing true will return as entered.
   * @returns {String} Camel cased words are returned as lower cased and underscored.
   *                  additionally '::' is translated to '/'.
   * @example
   *
   *     var inflection = require( 'inflection' );
   *
   *     inflection.underscore( 'MessageProperties' ); // === 'message_properties'
   *     inflection.underscore( 'messageProperties' ); // === 'message_properties'
   *     inflection.underscore( 'MP', true ); // === 'MP'
   */
    underscore : function ( str, all_upper_case ){
      if( all_upper_case && str === str.toUpperCase()) return str;

      var str_path = str.split( '::' );
      var i        = 0;
      var j        = str_path.length;

      for( ; i < j; i++ ){
        str_path[ i ] = str_path[ i ].replace( uppercase, '_$1' );
        str_path[ i ] = str_path[ i ].replace( underbar_prefix, '' );
      }

      return str_path.join( '/' ).toLowerCase();
    },



  /**
   * This function adds humanize support to every String object.
   * @public
   * @function
   * @param {String} str The subject string.
   * @param {Boolean} low_first_letter Default is to capitalize the first letter of the results.(optional)
   *                                 Passing true will lowercase it.
   * @returns {String} Lower case underscored words will be returned in humanized form.
   * @example
   *
   *     var inflection = require( 'inflection' );
   *
   *     inflection.humanize( 'message_properties' ); // === 'Message properties'
   *     inflection.humanize( 'message_properties', true ); // === 'message properties'
   */
    humanize : function ( str, low_first_letter ){
      str = str.toLowerCase();
      str = str.replace( id_suffix, '' );
      str = str.replace( underbar, ' ' );

      if( !low_first_letter ){
        str = inflector.capitalize( str );
      }

      return str;
    },



  /**
   * This function adds capitalization support to every String object.
   * @public
   * @function
   * @param {String} str The subject string.
   * @returns {String} All characters will be lower case and the first will be upper.
   * @example
   *
   *     var inflection = require( 'inflection' );
   *
   *     inflection.capitalize( 'message_properties' ); // === 'Message_properties'
   *     inflection.capitalize( 'message properties', true ); // === 'Message properties'
   */
    capitalize : function ( str ){
      str = str.toLowerCase();

      return str.substring( 0, 1 ).toUpperCase() + str.substring( 1 );
    },



  /**
   * This function replaces underscores with dashes in the string.
   * @public
   * @function
   * @param {String} str The subject string.
   * @returns {String} Replaces all spaces or underscores with dashes.
   * @example
   *
   *     var inflection = require( 'inflection' );
   *
   *     inflection.dasherize( 'message_properties' ); // === 'message-properties'
   *     inflection.dasherize( 'Message Properties' ); // === 'Message-Properties'
   */
    dasherize : function ( str ){
      return str.replace( space_or_underbar, '-' );
    },



  /**
   * This function adds titleize support to every String object.
   * @public
   * @function
   * @param {String} str The subject string.
   * @returns {String} Capitalizes words as you would for a book title.
   * @example
   *
   *     var inflection = require( 'inflection' );
   *
   *     inflection.titleize( 'message_properties' ); // === 'Message Properties'
   *     inflection.titleize( 'message properties to keep' ); // === 'Message Properties to Keep'
   */
    titleize : function ( str ){
      str         = str.toLowerCase().replace( underbar, ' ' );
      var str_arr = str.split( ' ' );
      var i       = 0;
      var j       = str_arr.length;
      var d, k, l;

      for( ; i < j; i++ ){
        d = str_arr[ i ].split( '-' );
        k = 0;
        l = d.length;

        for( ; k < l; k++){
          if( inflector.indexOf( non_titlecased_words, d[ k ].toLowerCase()) < 0 ){
            d[ k ] = inflector.capitalize( d[ k ]);
          }
        }

        str_arr[ i ] = d.join( '-' );
      }

      str = str_arr.join( ' ' );
      str = str.substring( 0, 1 ).toUpperCase() + str.substring( 1 );

      return str;
    },



  /**
   * This function adds demodulize support to every String object.
   * @public
   * @function
   * @param {String} str The subject string.
   * @returns {String} Removes module names leaving only class names.(Ruby style)
   * @example
   *
   *     var inflection = require( 'inflection' );
   *
   *     inflection.demodulize( 'Message::Bus::Properties' ); // === 'Properties'
   */
    demodulize : function ( str ){
      var str_arr = str.split( '::' );

      return str_arr[ str_arr.length - 1 ];
    },



  /**
   * This function adds tableize support to every String object.
   * @public
   * @function
   * @param {String} str The subject string.
   * @returns {String} Return camel cased words into their underscored plural form.
   * @example
   *
   *     var inflection = require( 'inflection' );
   *
   *     inflection.tableize( 'MessageBusProperty' ); // === 'message_bus_properties'
   */
    tableize : function ( str ){
      str = inflector.underscore( str );
      str = inflector.pluralize( str );

      return str;
    },



  /**
   * This function adds classification support to every String object.
   * @public
   * @function
   * @param {String} str The subject string.
   * @returns {String} Underscored plural nouns become the camel cased singular form.
   * @example
   *
   *     var inflection = require( 'inflection' );
   *
   *     inflection.classify( 'message_bus_properties' ); // === 'MessageBusProperty'
   */
    classify : function ( str ){
      str = inflector.camelize( str );
      str = inflector.singularize( str );

      return str;
    },



  /**
   * This function adds foreign key support to every String object.
   * @public
   * @function
   * @param {String} str The subject string.
   * @param {Boolean} drop_id_ubar Default is to seperate id with an underbar at the end of the class name,
                                 you can pass true to skip it.(optional)
   * @returns {String} Underscored plural nouns become the camel cased singular form.
   * @example
   *
   *     var inflection = require( 'inflection' );
   *
   *     inflection.foreign_key( 'MessageBusProperty' ); // === 'message_bus_property_id'
   *     inflection.foreign_key( 'MessageBusProperty', true ); // === 'message_bus_propertyid'
   */
    foreign_key : function ( str, drop_id_ubar ){
      str = inflector.demodulize( str );
      str = inflector.underscore( str ) + (( drop_id_ubar ) ? ( '' ) : ( '_' )) + 'id';

      return str;
    },



  /**
   * This function adds ordinalize support to every String object.
   * @public
   * @function
   * @param {String} str The subject string.
   * @returns {String} Return all found numbers their sequence like '22nd'.
   * @example
   *
   *     var inflection = require( 'inflection' );
   *
   *     inflection.ordinalize( 'the 1 pitch' ); // === 'the 1st pitch'
   */
    ordinalize : function ( str ){
      var str_arr = str.split( ' ' );
      var i       = 0;
      var j       = str_arr.length;

      for( ; i < j; i++ ){
        var k = parseInt( str_arr[ i ], 10 );

        if( !isNaN( k )){
          var ltd = str_arr[ i ].substring( str_arr[ i ].length - 2 );
          var ld  = str_arr[ i ].substring( str_arr[ i ].length - 1 );
          var suf = 'th';

          if( ltd != '11' && ltd != '12' && ltd != '13' ){
            if( ld === '1' ){
              suf = 'st';
            }else if( ld === '2' ){
              suf = 'nd';
            }else if( ld === '3' ){
              suf = 'rd';
            }
          }

          str_arr[ i ] += suf;
        }
      }

      return str_arr.join( ' ' );
    },

  /**
   * This function performs multiple inflection methods on a string
   * @public
   * @function
   * @param {String} str The subject string.
   * @param {Array} arr An array of inflection methods.
   * @returns {String}
   * @example
   *
   *     var inflection = require( 'inflection' );
   *
   *     inflection.transform( 'all job', [ 'pluralize', 'capitalize', 'dasherize' ]); // === 'All-jobs'
   */
    transform : function ( str, arr ){
      var i = 0;
      var j = arr.length;

      for( ;i < j; i++ ){
        var method = arr[ i ];

        if( inflector.hasOwnProperty( method )){
          str = inflector[ method ]( str );
        }
      }

      return str;
    }
  };

/**
 * @public
 */
  inflector.version = '1.13.1';

  return inflector;
}));
{
    "editor.formatOnSave": false
}The ISC License

Copyright (c) Isaac Z. Schlueter

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.
var wrappy = require('wrappy')
var reqs = Object.create(null)
var once = require('once')

module.exports = wrappy(inflight)

function inflight (key, cb) {
  if (reqs[key]) {
    reqs[key].push(cb)
    return null
  } else {
    reqs[key] = [cb]
    return makeres(key)
  }
}

function makeres (key) {
  return once(function RES () {
    var cbs = reqs[key]
    var len = cbs.length
    var args = slice(arguments)

    // XXX It's somewhat ambiguous whether a new callback added in this
    // pass should be queued for later execution if something in the
    // list of callbacks throws, or if it should just be discarded.
    // However, it's such an edge case that it hardly matters, and either
    // choice is likely as surprising as the other.
    // As it happens, we do go ahead and schedule it for later execution.
    try {
      for (var i = 0; i < len; i++) {
        cbs[i].apply(null, args)
      }
    } finally {
      if (cbs.length > len) {
        // added more in the interim.
        // de-zalgo, just in case, but don't call again.
        cbs.splice(0, len)
        process.nextTick(function () {
          RES.apply(null, args)
        })
      } else {
        delete reqs[key]
      }
    }
  })
}

function slice (args) {
  var length = args.length
  var array = []

  for (var i = 0; i < length; i++) array[i] = args[i]
  return array
}
{
  "name": "inflight",
  "version": "1.0.6",
  "description": "Add callbacks to requests in flight to avoid async duplication",
  "main": "inflight.js",
  "files": [
    "inflight.js"
  ],
  "dependencies": {
    "once": "^1.3.0",
    "wrappy": "1"
  },
  "devDependencies": {
    "tap": "^7.1.2"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/npm/inflight.git"
  },
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
  "homepage": "https://github.com/isaacs/inflight",
  "license": "ISC"
}The ISC License

Copyright (c) Isaac Z. Schlueter

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.

try {
  var util = require('util');
  /* istanbul ignore next */
  if (typeof util.inherits !== 'function') throw '';
  module.exports = util.inherits;
} catch (e) {
  /* istanbul ignore next */
  module.exports = require('./inherits_browser.js');
}
if (typeof Object.create === 'function') {
  // implementation from standard node.js 'util' module
  module.exports = function inherits(ctor, superCtor) {
    if (superCtor) {
      ctor.super_ = superCtor
      ctor.prototype = Object.create(superCtor.prototype, {
        constructor: {
          value: ctor,
          enumerable: false,
          writable: true,
          configurable: true
        }
      })
    }
  };
} else {
  // old school shim for old browsers
  module.exports = function inherits(ctor, superCtor) {
    if (superCtor) {
      ctor.super_ = superCtor
      var TempCtor = function () {}
      TempCtor.prototype = superCtor.prototype
      ctor.prototype = new TempCtor()
      ctor.prototype.constructor = ctor
    }
  }
}
{
  "name": "inherits",
  "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()",
  "version": "2.0.4",
  "main": "./inherits.js",
  "browser": "./inherits_browser.js",
  "repository": "git://github.com/isaacs/inherits",
  "license": "ISC",
  "devDependencies": {
    "tap": "^14.2.4"
  },
  "files": [
    "inherits.js",
    "inherits_browser.js"
  ]
}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.
exports.parse = exports.decode = decode

exports.stringify = exports.encode = encode

exports.safe = safe
exports.unsafe = unsafe

var eol = typeof process !== 'undefined' &&
  process.platform === 'win32' ? '\r\n' : '\n'

function encode (obj, opt) {
  var children = []
  var out = ''

  if (typeof opt === 'string') {
    opt = {
      section: opt,
      whitespace: false,
    }
  } else {
    opt = opt || {}
    opt.whitespace = opt.whitespace === true
  }

  var separator = opt.whitespace ? ' = ' : '='

  Object.keys(obj).forEach(function (k, _, __) {
    var val = obj[k]
    if (val && Array.isArray(val)) {
      val.forEach(function (item) {
        out += safe(k + '[]') + separator + safe(item) + '\n'
      })
    } else if (val && typeof val === 'object')
      children.push(k)
    else
      out += safe(k) + separator + safe(val) + eol
  })

  if (opt.section && out.length)
    out = '[' + safe(opt.section) + ']' + eol + out

  children.forEach(function (k, _, __) {
    var nk = dotSplit(k).join('\\.')
    var section = (opt.section ? opt.section + '.' : '') + nk
    var child = encode(obj[k], {
      section: section,
      whitespace: opt.whitespace,
    })
    if (out.length && child.length)
      out += eol

    out += child
  })

  return out
}

function dotSplit (str) {
  return str.replace(/\1/g, '\u0002LITERAL\\1LITERAL\u0002')
    .replace(/\\\./g, '\u0001')
    .split(/\./).map(function (part) {
      return part.replace(/\1/g, '\\.')
        .replace(/\2LITERAL\\1LITERAL\2/g, '\u0001')
    })
}

function decode (str) {
  var out = {}
  var p = out
  var section = null
  //          section     |key      = value
  var re = /^\[([^\]]*)\]$|^([^=]+)(=(.*))?$/i
  var lines = str.split(/[\r\n]+/g)

  lines.forEach(function (line, _, __) {
    if (!line || line.match(/^\s*[;#]/))
      return
    var match = line.match(re)
    if (!match)
      return
    if (match[1] !== undefined) {
      section = unsafe(match[1])
      if (section === '__proto__') {
        // not allowed
        // keep parsing the section, but don't attach it.
        p = {}
        return
      }
      p = out[section] = out[section] || {}
      return
    }
    var key = unsafe(match[2])
    if (key === '__proto__')
      return
    var value = match[3] ? unsafe(match[4]) : true
    switch (value) {
      case 'true':
      case 'false':
      case 'null': value = JSON.parse(value)
    }

    // Convert keys with '[]' suffix to an array
    if (key.length > 2 && key.slice(-2) === '[]') {
      key = key.substring(0, key.length - 2)
      if (key === '__proto__')
        return
      if (!p[key])
        p[key] = []
      else if (!Array.isArray(p[key]))
        p[key] = [p[key]]
    }

    // safeguard against resetting a previously defined
    // array by accidentally forgetting the brackets
    if (Array.isArray(p[key]))
      p[key].push(value)
    else
      p[key] = value
  })

  // {a:{y:1},"a.b":{x:2}} --> {a:{y:1,b:{x:2}}}
  // use a filter to return the keys that have to be deleted.
  Object.keys(out).filter(function (k, _, __) {
    if (!out[k] ||
      typeof out[k] !== 'object' ||
      Array.isArray(out[k]))
      return false

    // see if the parent section is also an object.
    // if so, add it to that, and mark this one for deletion
    var parts = dotSplit(k)
    var p = out
    var l = parts.pop()
    var nl = l.replace(/\\\./g, '.')
    parts.forEach(function (part, _, __) {
      if (part === '__proto__')
        return
      if (!p[part] || typeof p[part] !== 'object')
        p[part] = {}
      p = p[part]
    })
    if (p === out && nl === l)
      return false

    p[nl] = out[k]
    return true
  }).forEach(function (del, _, __) {
    delete out[del]
  })

  return out
}

function isQuoted (val) {
  return (val.charAt(0) === '"' && val.slice(-1) === '"') ||
    (val.charAt(0) === "'" && val.slice(-1) === "'")
}

function safe (val) {
  return (typeof val !== 'string' ||
    val.match(/[=\r\n]/) ||
    val.match(/^\[/) ||
    (val.length > 1 &&
     isQuoted(val)) ||
    val !== val.trim())
    ? JSON.stringify(val)
    : val.replace(/;/g, '\\;').replace(/#/g, '\\#')
}

function unsafe (val, doUnesc) {
  val = (val || '').trim()
  if (isQuoted(val)) {
    // remove the single quotes before calling JSON.parse
    if (val.charAt(0) === "'")
      val = val.substr(1, val.length - 2)

    try {
      val = JSON.parse(val)
    } catch (_) {}
  } else {
    // walk the val to find the first not-escaped ; character
    var esc = false
    var unesc = ''
    for (var i = 0, l = val.length; i < l; i++) {
      var c = val.charAt(i)
      if (esc) {
        if ('\\;#'.indexOf(c) !== -1)
          unesc += c
        else
          unesc += '\\' + c

        esc = false
      } else if (';#'.indexOf(c) !== -1)
        break
      else if (c === '\\')
        esc = true
      else
        unesc += c
    }
    if (esc)
      unesc += '\\'

    return unesc.trim()
  }
  return val
}
{
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
  "name": "ini",
  "description": "An ini encoder/decoder for node",
  "version": "1.3.8",
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/ini.git"
  },
  "main": "ini.js",
  "devDependencies": {
    "eslint": "^7.9.0",
    "eslint-plugin-import": "^2.22.0",
    "eslint-plugin-node": "^11.1.0",
    "eslint-plugin-promise": "^4.2.1",
    "eslint-plugin-standard": "^4.0.1",
    "tap": "14"
  },
  "license": "ISC",
  "files": [
    "ini.js"
  ]
}root = true

[*]
indent_style = tab
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 150

[CHANGELOG.md]
indent_style = space
indent_size = 2

[*.json]
max_line_length = off

[Makefile]
max_line_length = off
coverage/
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"lines": 86,
	"statements": 85.93,
	"functions": 82.43,
	"branches": 76.06,
	"exclude": [
		"coverage",
		"test"
	]
}
MIT License

Copyright (c) 2019 Jordan Harband

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 GetIntrinsic = require('get-intrinsic');
var has = require('has');
var channel = require('side-channel')();

var $TypeError = GetIntrinsic('%TypeError%');

var SLOT = {
	assert: function (O, slot) {
		if (!O || (typeof O !== 'object' && typeof O !== 'function')) {
			throw new $TypeError('`O` is not an object');
		}
		if (typeof slot !== 'string') {
			throw new $TypeError('`slot` must be a string');
		}
		channel.assert(O);
	},
	get: function (O, slot) {
		if (!O || (typeof O !== 'object' && typeof O !== 'function')) {
			throw new $TypeError('`O` is not an object');
		}
		if (typeof slot !== 'string') {
			throw new $TypeError('`slot` must be a string');
		}
		var slots = channel.get(O);
		return slots && slots['$' + slot];
	},
	has: function (O, slot) {
		if (!O || (typeof O !== 'object' && typeof O !== 'function')) {
			throw new $TypeError('`O` is not an object');
		}
		if (typeof slot !== 'string') {
			throw new $TypeError('`slot` must be a string');
		}
		var slots = channel.get(O);
		return !!slots && has(slots, '$' + slot);
	},
	set: function (O, slot, V) {
		if (!O || (typeof O !== 'object' && typeof O !== 'function')) {
			throw new $TypeError('`O` is not an object');
		}
		if (typeof slot !== 'string') {
			throw new $TypeError('`slot` must be a string');
		}
		var slots = channel.get(O);
		if (!slots) {
			slots = {};
			channel.set(O, slots);
		}
		slots['$' + slot] = V;
	}
};

if (Object.freeze) {
	Object.freeze(SLOT);
}

module.exports = SLOT;
{
  "name": "internal-slot",
  "version": "1.0.3",
  "description": "ES spec-like internal slots",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/ljharb/internal-slot.git"
  },
  "author": "Jordan Harband <ljharb@gmail.com>",
  "license": "MIT",
  "homepage": "https://github.com/ljharb/internal-slot#readme",
  "engines": {
    "node": ">= 0.4"
  },
  "devDependencies": {
    "@ljharb/eslint-config": "^17.5.0",
    "aud": "^1.1.3",
    "auto-changelog": "^2.2.1",
    "eslint": "^7.18.0",
    "foreach": "^2.0.5",
    "nyc": "^10.3.2",
    "object-inspect": "^1.9.0",
    "safe-publish-latest": "^1.1.4",
    "tape": "^5.1.1"
  },
  "dependencies": {
    "get-intrinsic": "^1.1.0",
    "has": "^1.0.3",
    "side-channel": "^1.0.4"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false
  }
}# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/internal-slot
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with a single custom sponsorship URL
{
  "name": "ip",
  "version": "2.0.0",
  "author": "Fedor Indutny <fedor@indutny.com>",
  "homepage": "https://github.com/indutny/node-ip",
  "repository": {
    "type": "git",
    "url": "http://github.com/indutny/node-ip.git"
  },
  "files": [
    "lib",
    "README.md"
  ],
  "main": "lib/ip",
  "devDependencies": {
    "eslint": "^8.15.0",
    "mocha": "^10.0.0"
  },
  "license": "MIT"
}const ip = exports;
const { Buffer } = require('buffer');
const os = require('os');

ip.toBuffer = function (ip, buff, offset) {
  offset = ~~offset;

  let result;

  if (this.isV4Format(ip)) {
    result = buff || Buffer.alloc(offset + 4);
    ip.split(/\./g).map((byte) => {
      result[offset++] = parseInt(byte, 10) & 0xff;
    });
  } else if (this.isV6Format(ip)) {
    const sections = ip.split(':', 8);

    let i;
    for (i = 0; i < sections.length; i++) {
      const isv4 = this.isV4Format(sections[i]);
      let v4Buffer;

      if (isv4) {
        v4Buffer = this.toBuffer(sections[i]);
        sections[i] = v4Buffer.slice(0, 2).toString('hex');
      }

      if (v4Buffer && ++i < 8) {
        sections.splice(i, 0, v4Buffer.slice(2, 4).toString('hex'));
      }
    }

    if (sections[0] === '') {
      while (sections.length < 8) sections.unshift('0');
    } else if (sections[sections.length - 1] === '') {
      while (sections.length < 8) sections.push('0');
    } else if (sections.length < 8) {
      for (i = 0; i < sections.length && sections[i] !== ''; i++);
      const argv = [i, 1];
      for (i = 9 - sections.length; i > 0; i--) {
        argv.push('0');
      }
      sections.splice(...argv);
    }

    result = buff || Buffer.alloc(offset + 16);
    for (i = 0; i < sections.length; i++) {
      const word = parseInt(sections[i], 16);
      result[offset++] = (word >> 8) & 0xff;
      result[offset++] = word & 0xff;
    }
  }

  if (!result) {
    throw Error(`Invalid ip address: ${ip}`);
  }

  return result;
};

ip.toString = function (buff, offset, length) {
  offset = ~~offset;
  length = length || (buff.length - offset);

  let result = [];
  if (length === 4) {
    // IPv4
    for (let i = 0; i < length; i++) {
      result.push(buff[offset + i]);
    }
    result = result.join('.');
  } else if (length === 16) {
    // IPv6
    for (let i = 0; i < length; i += 2) {
      result.push(buff.readUInt16BE(offset + i).toString(16));
    }
    result = result.join(':');
    result = result.replace(/(^|:)0(:0)*:0(:|$)/, '$1::$3');
    result = result.replace(/:{3,4}/, '::');
  }

  return result;
};

const ipv4Regex = /^(\d{1,3}\.){3,3}\d{1,3}$/;
const ipv6Regex = /^(::)?(((\d{1,3}\.){3}(\d{1,3}){1})?([0-9a-f]){0,4}:{0,2}){1,8}(::)?$/i;

ip.isV4Format = function (ip) {
  return ipv4Regex.test(ip);
};

ip.isV6Format = function (ip) {
  return ipv6Regex.test(ip);
};

function _normalizeFamily(family) {
  if (family === 4) {
    return 'ipv4';
  }
  if (family === 6) {
    return 'ipv6';
  }
  return family ? family.toLowerCase() : 'ipv4';
}

ip.fromPrefixLen = function (prefixlen, family) {
  if (prefixlen > 32) {
    family = 'ipv6';
  } else {
    family = _normalizeFamily(family);
  }

  let len = 4;
  if (family === 'ipv6') {
    len = 16;
  }
  const buff = Buffer.alloc(len);

  for (let i = 0, n = buff.length; i < n; ++i) {
    let bits = 8;
    if (prefixlen < 8) {
      bits = prefixlen;
    }
    prefixlen -= bits;

    buff[i] = ~(0xff >> bits) & 0xff;
  }

  return ip.toString(buff);
};

ip.mask = function (addr, mask) {
  addr = ip.toBuffer(addr);
  mask = ip.toBuffer(mask);

  const result = Buffer.alloc(Math.max(addr.length, mask.length));

  // Same protocol - do bitwise and
  let i;
  if (addr.length === mask.length) {
    for (i = 0; i < addr.length; i++) {
      result[i] = addr[i] & mask[i];
    }
  } else if (mask.length === 4) {
    // IPv6 address and IPv4 mask
    // (Mask low bits)
    for (i = 0; i < mask.length; i++) {
      result[i] = addr[addr.length - 4 + i] & mask[i];
    }
  } else {
    // IPv6 mask and IPv4 addr
    for (i = 0; i < result.length - 6; i++) {
      result[i] = 0;
    }

    // ::ffff:ipv4
    result[10] = 0xff;
    result[11] = 0xff;
    for (i = 0; i < addr.length; i++) {
      result[i + 12] = addr[i] & mask[i + 12];
    }
    i += 12;
  }
  for (; i < result.length; i++) {
    result[i] = 0;
  }

  return ip.toString(result);
};

ip.cidr = function (cidrString) {
  const cidrParts = cidrString.split('/');

  const addr = cidrParts[0];
  if (cidrParts.length !== 2) {
    throw new Error(`invalid CIDR subnet: ${addr}`);
  }

  const mask = ip.fromPrefixLen(parseInt(cidrParts[1], 10));

  return ip.mask(addr, mask);
};

ip.subnet = function (addr, mask) {
  const networkAddress = ip.toLong(ip.mask(addr, mask));

  // Calculate the mask's length.
  const maskBuffer = ip.toBuffer(mask);
  let maskLength = 0;

  for (let i = 0; i < maskBuffer.length; i++) {
    if (maskBuffer[i] === 0xff) {
      maskLength += 8;
    } else {
      let octet = maskBuffer[i] & 0xff;
      while (octet) {
        octet = (octet << 1) & 0xff;
        maskLength++;
      }
    }
  }

  const numberOfAddresses = 2 ** (32 - maskLength);

  return {
    networkAddress: ip.fromLong(networkAddress),
    firstAddress: numberOfAddresses <= 2
      ? ip.fromLong(networkAddress)
      : ip.fromLong(networkAddress + 1),
    lastAddress: numberOfAddresses <= 2
      ? ip.fromLong(networkAddress + numberOfAddresses - 1)
      : ip.fromLong(networkAddress + numberOfAddresses - 2),
    broadcastAddress: ip.fromLong(networkAddress + numberOfAddresses - 1),
    subnetMask: mask,
    subnetMaskLength: maskLength,
    numHosts: numberOfAddresses <= 2
      ? numberOfAddresses : numberOfAddresses - 2,
    length: numberOfAddresses,
    contains(other) {
      return networkAddress === ip.toLong(ip.mask(other, mask));
    },
  };
};

ip.cidrSubnet = function (cidrString) {
  const cidrParts = cidrString.split('/');

  const addr = cidrParts[0];
  if (cidrParts.length !== 2) {
    throw new Error(`invalid CIDR subnet: ${addr}`);
  }

  const mask = ip.fromPrefixLen(parseInt(cidrParts[1], 10));

  return ip.subnet(addr, mask);
};

ip.not = function (addr) {
  const buff = ip.toBuffer(addr);
  for (let i = 0; i < buff.length; i++) {
    buff[i] = 0xff ^ buff[i];
  }
  return ip.toString(buff);
};

ip.or = function (a, b) {
  a = ip.toBuffer(a);
  b = ip.toBuffer(b);

  // same protocol
  if (a.length === b.length) {
    for (let i = 0; i < a.length; ++i) {
      a[i] |= b[i];
    }
    return ip.toString(a);

  // mixed protocols
  }
  let buff = a;
  let other = b;
  if (b.length > a.length) {
    buff = b;
    other = a;
  }

  const offset = buff.length - other.length;
  for (let i = offset; i < buff.length; ++i) {
    buff[i] |= other[i - offset];
  }

  return ip.toString(buff);
};

ip.isEqual = function (a, b) {
  a = ip.toBuffer(a);
  b = ip.toBuffer(b);

  // Same protocol
  if (a.length === b.length) {
    for (let i = 0; i < a.length; i++) {
      if (a[i] !== b[i]) return false;
    }
    return true;
  }

  // Swap
  if (b.length === 4) {
    const t = b;
    b = a;
    a = t;
  }

  // a - IPv4, b - IPv6
  for (let i = 0; i < 10; i++) {
    if (b[i] !== 0) return false;
  }

  const word = b.readUInt16BE(10);
  if (word !== 0 && word !== 0xffff) return false;

  for (let i = 0; i < 4; i++) {
    if (a[i] !== b[i + 12]) return false;
  }

  return true;
};

ip.isPrivate = function (addr) {
  return /^(::f{4}:)?10\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/i
    .test(addr)
    || /^(::f{4}:)?192\.168\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr)
    || /^(::f{4}:)?172\.(1[6-9]|2\d|30|31)\.([0-9]{1,3})\.([0-9]{1,3})$/i
      .test(addr)
    || /^(::f{4}:)?127\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr)
    || /^(::f{4}:)?169\.254\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr)
    || /^f[cd][0-9a-f]{2}:/i.test(addr)
    || /^fe80:/i.test(addr)
    || /^::1$/.test(addr)
    || /^::$/.test(addr);
};

ip.isPublic = function (addr) {
  return !ip.isPrivate(addr);
};

ip.isLoopback = function (addr) {
  return /^(::f{4}:)?127\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})/
    .test(addr)
    || /^fe80::1$/.test(addr)
    || /^::1$/.test(addr)
    || /^::$/.test(addr);
};

ip.loopback = function (family) {
  //
  // Default to `ipv4`
  //
  family = _normalizeFamily(family);

  if (family !== 'ipv4' && family !== 'ipv6') {
    throw new Error('family must be ipv4 or ipv6');
  }

  return family === 'ipv4' ? '127.0.0.1' : 'fe80::1';
};

//
// ### function address (name, family)
// #### @name {string|'public'|'private'} **Optional** Name or security
//      of the network interface.
// #### @family {ipv4|ipv6} **Optional** IP family of the address (defaults
//      to ipv4).
//
// Returns the address for the network interface on the current system with
// the specified `name`:
//   * String: First `family` address of the interface.
//             If not found see `undefined`.
//   * 'public': the first public ip address of family.
//   * 'private': the first private ip address of family.
//   * undefined: First address with `ipv4` or loopback address `127.0.0.1`.
//
ip.address = function (name, family) {
  const interfaces = os.networkInterfaces();

  //
  // Default to `ipv4`
  //
  family = _normalizeFamily(family);

  //
  // If a specific network interface has been named,
  // return the address.
  //
  if (name && name !== 'private' && name !== 'public') {
    const res = interfaces[name].filter((details) => {
      const itemFamily = _normalizeFamily(details.family);
      return itemFamily === family;
    });
    if (res.length === 0) {
      return undefined;
    }
    return res[0].address;
  }

  const all = Object.keys(interfaces).map((nic) => {
    //
    // Note: name will only be `public` or `private`
    // when this is called.
    //
    const addresses = interfaces[nic].filter((details) => {
      details.family = _normalizeFamily(details.family);
      if (details.family !== family || ip.isLoopback(details.address)) {
        return false;
      } if (!name) {
        return true;
      }

      return name === 'public' ? ip.isPrivate(details.address)
        : ip.isPublic(details.address);
    });

    return addresses.length ? addresses[0].address : undefined;
  }).filter(Boolean);

  return !all.length ? ip.loopback(family) : all[0];
};

ip.toLong = function (ip) {
  let ipl = 0;
  ip.split('.').forEach((octet) => {
    ipl <<= 8;
    ipl += parseInt(octet);
  });
  return (ipl >>> 0);
};

ip.fromLong = function (ipl) {
  return (`${ipl >>> 24}.${
    ipl >> 16 & 255}.${
    ipl >> 8 & 255}.${
    ipl & 255}`);
};
coverage/
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"exclude": [
		"coverage",
		"test"
	]
}
MIT License

Copyright (c) 2018 Jordan Harband

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 hasBigInts = require('has-bigints')();

if (hasBigInts) {
	var bigIntValueOf = BigInt.prototype.valueOf;
	var tryBigInt = function tryBigIntObject(value) {
		try {
			bigIntValueOf.call(value);
			return true;
		} catch (e) {
		}
		return false;
	};

	module.exports = function isBigInt(value) {
		if (
			value === null
			|| typeof value === 'undefined'
			|| typeof value === 'boolean'
			|| typeof value === 'string'
			|| typeof value === 'number'
			|| typeof value === 'symbol'
			|| typeof value === 'function'
		) {
			return false;
		}
		if (typeof value === 'bigint') {
			return true;
		}

		return tryBigInt(value);
	};
} else {
	module.exports = function isBigInt(value) {
		return false && value;
	};
}
{
  "name": "is-bigint",
  "version": "1.0.4",
  "description": "Is this value an ES BigInt?",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/inspect-js/is-bigint.git"
  },
  "author": "Jordan Harband <ljharb@gmail.com>",
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "license": "MIT",
  "homepage": "https://github.com/inspect-js/is-bigint#readme",
  "dependencies": {
    "has-bigints": "^1.0.1"
  },
  "devDependencies": {
    "@ljharb/eslint-config": "^17.6.0",
    "aud": "^1.1.5",
    "auto-changelog": "^2.3.0",
    "eslint": "^7.32.0",
    "has-symbols": "^1.0.2",
    "nyc": "^10.3.2",
    "object-inspect": "^1.11.0",
    "safe-publish-latest": "^1.1.4",
    "tape": "^5.3.1"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false,
    "hideCredit": true
  }
}# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/is-bigint
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
root = true

[*]
indent_style = tab
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 150

[CHANGELOG.md]
indent_style = space
indent_size = 2

[.github/workflows/*.yml]
indent_style = off
indent_size = off
max_line_length = off

[{CHANGELOG.md,*.json}]
max_line_length = off
coverage/
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"exclude": [
		"coverage",
		"test",
		"test-corejs.js"
	]
}
The MIT License (MIT)

Copyright (c) 2015 Jordan Harband

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 callBound = require('call-bind/callBound');
var $boolToStr = callBound('Boolean.prototype.toString');
var $toString = callBound('Object.prototype.toString');

var tryBooleanObject = function booleanBrandCheck(value) {
	try {
		$boolToStr(value);
		return true;
	} catch (e) {
		return false;
	}
};
var boolClass = '[object Boolean]';
var hasToStringTag = require('has-tostringtag/shams')();

module.exports = function isBoolean(value) {
	if (typeof value === 'boolean') {
		return true;
	}
	if (value === null || typeof value !== 'object') {
		return false;
	}
	return hasToStringTag && Symbol.toStringTag in value ? tryBooleanObject(value) : $toString(value) === boolClass;
};
{
  "name": "is-boolean-object",
  "version": "1.1.2",
  "author": "Jordan Harband <ljharb@gmail.com>",
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "description": "Is this value a JS Boolean? This module works cross-realm/iframe, and despite ES6 @@toStringTag.",
  "license": "MIT",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/inspect-js/is-boolean-object.git"
  },
  "dependencies": {
    "call-bind": "^1.0.2",
    "has-tostringtag": "^1.0.0"
  },
  "devDependencies": {
    "@ljharb/eslint-config": "^17.6.0",
    "aud": "^1.1.5",
    "auto-changelog": "^2.3.0",
    "core-js": "^3.16.0",
    "eclint": "^2.8.1",
    "eslint": "^7.32.0",
    "foreach": "^2.0.5",
    "indexof": "^0.0.1",
    "is": "^3.3.0",
    "nyc": "^10.3.2",
    "safe-publish-latest": "^1.1.4",
    "tape": "^5.3.0"
  },
  "testling": {
    "files": "test.js",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "engines": {
    "node": ">= 0.4"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false,
    "hideCredit": true
  }
}# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/is-boolean-object
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
root = true

[*]
indent_style = tab
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 150

[CHANGELOG.md]
indent_style = space
indent_size = 2
max_line_length = off

[*.json]
max_line_length = off

[Makefile]
max_line_length = off

[coverage*/**/*]
indent_style = off
indent_size = off
max_line_length = off
coverage/
verbose: false
instrumentation:
    root: .
    extensions:
        - .js
        - .jsx
    default-excludes: true
    excludes: []
    variable: __coverage__
    compact: true
    preserve-comments: false
    complete-copy: false
    save-baseline: false
    baseline-file: ./coverage/coverage-baseline.raw.json
    include-all-sources: false
    include-pid: false
    es-modules: false
    auto-wrap: false
reporting:
    print: summary
    reports:
        - html
    dir: ./coverage
    summarizer: pkg
    report-config: {}
    watermarks:
        statements: [50, 80]
        functions: [50, 80]
        branches: [50, 80]
        lines: [50, 80]
hooks:
    hook-run-in-context: false
    post-require-hook: null
    handle-sigint: false
check:
    global:
        statements: 100
        lines: 100
        branches: 100
        functions: 100
        excludes: []
    each:
        statements: 100
        lines: 100
        branches: 100
        functions: 100
        excludes: []
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"exclude": [
		"coverage",
		"test"
	]
}
The MIT License (MIT)

Copyright (c) 2015 Jordan Harband

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 fnToStr = Function.prototype.toString;
var reflectApply = typeof Reflect === 'object' && Reflect !== null && Reflect.apply;
var badArrayLike;
var isCallableMarker;
if (typeof reflectApply === 'function' && typeof Object.defineProperty === 'function') {
	try {
		badArrayLike = Object.defineProperty({}, 'length', {
			get: function () {
				throw isCallableMarker;
			}
		});
		isCallableMarker = {};
		// eslint-disable-next-line no-throw-literal
		reflectApply(function () { throw 42; }, null, badArrayLike);
	} catch (_) {
		if (_ !== isCallableMarker) {
			reflectApply = null;
		}
	}
} else {
	reflectApply = null;
}

var constructorRegex = /^\s*class\b/;
var isES6ClassFn = function isES6ClassFunction(value) {
	try {
		var fnStr = fnToStr.call(value);
		return constructorRegex.test(fnStr);
	} catch (e) {
		return false; // not a function
	}
};

var tryFunctionObject = function tryFunctionToStr(value) {
	try {
		if (isES6ClassFn(value)) { return false; }
		fnToStr.call(value);
		return true;
	} catch (e) {
		return false;
	}
};
var toStr = Object.prototype.toString;
var fnClass = '[object Function]';
var genClass = '[object GeneratorFunction]';
var hasToStringTag = typeof Symbol === 'function' && !!Symbol.toStringTag; // better: use `has-tostringtag`
/* globals document: false */
var documentDotAll = typeof document === 'object' && typeof document.all === 'undefined' && document.all !== undefined ? document.all : {};

module.exports = reflectApply
	? function isCallable(value) {
		if (value === documentDotAll) { return true; }
		if (!value) { return false; }
		if (typeof value !== 'function' && typeof value !== 'object') { return false; }
		if (typeof value === 'function' && !value.prototype) { return true; }
		try {
			reflectApply(value, null, badArrayLike);
		} catch (e) {
			if (e !== isCallableMarker) { return false; }
		}
		return !isES6ClassFn(value);
	}
	: function isCallable(value) {
		if (value === documentDotAll) { return true; }
		if (!value) { return false; }
		if (typeof value !== 'function' && typeof value !== 'object') { return false; }
		if (typeof value === 'function' && !value.prototype) { return true; }
		if (hasToStringTag) { return tryFunctionObject(value); }
		if (isES6ClassFn(value)) { return false; }
		var strClass = toStr.call(value);
		return strClass === fnClass || strClass === genClass;
	};
{
  "name": "is-callable",
  "version": "1.2.4",
  "author": {
    "name": "Jordan Harband",
    "email": "ljharb@gmail.com",
    "url": "http://ljharb.codes"
  },
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "description": "Is this JS value callable? Works with Functions and GeneratorFunctions, despite ES6 @@toStringTag.",
  "license": "MIT",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/inspect-js/is-callable.git"
  },
  "devDependencies": {
    "@ljharb/eslint-config": "^17.6.0",
    "aud": "^1.1.5",
    "available-typed-arrays": "^1.0.4",
    "eclint": "^2.8.1",
    "es-value-fixtures": "^1.2.1",
    "eslint": "^7.32.0",
    "for-each": "^0.3.3",
    "has-tostringtag": "^1.0.0",
    "make-arrow-function": "^1.2.0",
    "make-async-function": "^1.0.0",
    "make-generator-function": "^2.0.0",
    "nyc": "^10.3.2",
    "object-inspect": "^1.11.0",
    "rimraf": "^2.7.1",
    "safe-publish-latest": "^1.1.4",
    "tape": "^5.3.0"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "engines": {
    "node": ">= 0.4"
  },
  "greenkeeper": {
    "ignore": [
      "rimraf"
    ]
  }
}# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/is-callable
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
root = true

[*]
indent_style = tab
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 150

[CHANGELOG.md]
indent_style = space
indent_size = 2

[*.json]
max_line_length = off

[Makefile]
max_line_length = off
coverage/
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"exclude": [
		"coverage",
		"test",
		"test-corejs.js"
	]
}
The MIT License (MIT)

Copyright (c) 2015 Jordan Harband

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 getDay = Date.prototype.getDay;
var tryDateObject = function tryDateGetDayCall(value) {
	try {
		getDay.call(value);
		return true;
	} catch (e) {
		return false;
	}
};

var toStr = Object.prototype.toString;
var dateClass = '[object Date]';
var hasToStringTag = require('has-tostringtag/shams')();

module.exports = function isDateObject(value) {
	if (typeof value !== 'object' || value === null) {
		return false;
	}
	return hasToStringTag ? tryDateObject(value) : toStr.call(value) === dateClass;
};
{
  "name": "is-date-object",
  "version": "1.0.5",
  "author": "Jordan Harband",
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "description": "Is this value a JS Date object? This module works cross-realm/iframe, and despite ES6 @@toStringTag.",
  "license": "MIT",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/inspect-js/is-date-object.git"
  },
  "dependencies": {
    "has-tostringtag": "^1.0.0"
  },
  "devDependencies": {
    "@ljharb/eslint-config": "^17.6.0",
    "aud": "^1.1.5",
    "auto-changelog": "^2.3.0",
    "core-js": "^3.12.0",
    "eslint": "^7.32.0",
    "foreach": "^2.0.5",
    "indexof": "^0.0.1",
    "is": "^3.3.0",
    "nyc": "^10.3.2",
    "safe-publish-latest": "^1.1.4",
    "tape": "^5.3.0"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "engines": {
    "node": ">= 0.4"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false,
    "hideCredit": true
  }
}# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/is-date-object
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
#!/usr/bin/env node
'use strict';
const isDocker = require('.');

process.exitCode = isDocker() ? 0 : 2;
'use strict';
const fs = require('fs');

let isDocker;

function hasDockerEnv() {
	try {
		fs.statSync('/.dockerenv');
		return true;
	} catch (_) {
		return false;
	}
}

function hasDockerCGroup() {
	try {
		return fs.readFileSync('/proc/self/cgroup', 'utf8').includes('docker');
	} catch (_) {
		return false;
	}
}

module.exports = () => {
	if (isDocker === undefined) {
		isDocker = hasDockerEnv() || hasDockerCGroup();
	}

	return isDocker;
};
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": "is-docker",
  "version": "2.2.1",
  "description": "Check if the process is running inside a Docker container",
  "license": "MIT",
  "repository": "sindresorhus/is-docker",
  "funding": "https://github.com/sponsors/sindresorhus",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "https://sindresorhus.com"
  },
  "bin": "cli.js",
  "engines": {
    "node": ">=8"
  },
  "files": [
    "index.js",
    "index.d.ts",
    "cli.js"
  ],
  "devDependencies": {
    "ava": "^1.4.1",
    "sinon": "^7.3.2",
    "tsd": "^0.7.2",
    "xo": "^0.24.0"
  }
}/* eslint-disable yoda */
'use strict';

const isFullwidthCodePoint = codePoint => {
	if (Number.isNaN(codePoint)) {
		return false;
	}

	// Code points are derived from:
	// http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt
	if (
		codePoint >= 0x1100 && (
			codePoint <= 0x115F || // Hangul Jamo
			codePoint === 0x2329 || // LEFT-POINTING ANGLE BRACKET
			codePoint === 0x232A || // RIGHT-POINTING ANGLE BRACKET
			// CJK Radicals Supplement .. Enclosed CJK Letters and Months
			(0x2E80 <= codePoint && codePoint <= 0x3247 && codePoint !== 0x303F) ||
			// Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A
			(0x3250 <= codePoint && codePoint <= 0x4DBF) ||
			// CJK Unified Ideographs .. Yi Radicals
			(0x4E00 <= codePoint && codePoint <= 0xA4C6) ||
			// Hangul Jamo Extended-A
			(0xA960 <= codePoint && codePoint <= 0xA97C) ||
			// Hangul Syllables
			(0xAC00 <= codePoint && codePoint <= 0xD7A3) ||
			// CJK Compatibility Ideographs
			(0xF900 <= codePoint && codePoint <= 0xFAFF) ||
			// Vertical Forms
			(0xFE10 <= codePoint && codePoint <= 0xFE19) ||
			// CJK Compatibility Forms .. Small Form Variants
			(0xFE30 <= codePoint && codePoint <= 0xFE6B) ||
			// Halfwidth and Fullwidth Forms
			(0xFF01 <= codePoint && codePoint <= 0xFF60) ||
			(0xFFE0 <= codePoint && codePoint <= 0xFFE6) ||
			// Kana Supplement
			(0x1B000 <= codePoint && codePoint <= 0x1B001) ||
			// Enclosed Ideographic Supplement
			(0x1F200 <= codePoint && codePoint <= 0x1F251) ||
			// CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane
			(0x20000 <= codePoint && codePoint <= 0x3FFFD)
		)
	) {
		return true;
	}

	return false;
};

module.exports = isFullwidthCodePoint;
module.exports.default = isFullwidthCodePoint;
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-fullwidth-code-point",
  "version": "3.0.0",
  "description": "Check if the character represented by a given Unicode code point is fullwidth",
  "license": "MIT",
  "repository": "sindresorhus/is-fullwidth-code-point",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "engines": {
    "node": ">=8"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "devDependencies": {
    "ava": "^1.3.1",
    "tsd-check": "^0.5.0",
    "xo": "^0.24.0"
  }
}The MIT License (MIT)

Copyright (c) 2016-2017 Thomas Watson Steen

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'

module.exports = !!(
  (process.env.LAMBDA_TASK_ROOT && process.env.AWS_EXECUTION_ENV) ||
  false
)
{
  "name": "is-lambda",
  "version": "1.0.1",
  "description": "Detect if your code is running on an AWS Lambda server",
  "main": "index.js",
  "dependencies": {},
  "devDependencies": {
    "clear-require": "^1.0.1",
    "standard": "^10.0.2"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/watson/is-lambda.git"
  },
  "author": "Thomas Watson Steen <w@tson.dk> (https://twitter.com/wa7son)",
  "license": "MIT",
  "homepage": "https://github.com/watson/is-lambda",
  "coordinates": [
    37.3859955,
    -122.0838831
  ]
}root = true

[*]
indent_style = tab
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
coverage/
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"exclude": [
		"coverage",
		"test"
	]
}
The MIT License (MIT)

Copyright (c) 2014 Jordan Harband

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';

module.exports = function isNegativeZero(number) {
	return number === 0 && (1 / number) === -Infinity;
};

{
  "name": "is-negative-zero",
  "version": "2.0.2",
  "description": "Is this value negative zero? === will lie to you",
  "author": "Jordan Harband <ljharb@gmail.com>",
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "license": "MIT",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/inspect-js/is-negative-zero.git"
  },
  "homepage": "https://github.com/inspect-js/is-negative-zero",
  "devDependencies": {
    "@ljharb/eslint-config": "^20.0.0",
    "aud": "^1.1.5",
    "auto-changelog": "^2.3.0",
    "eslint": "^8.4.1",
    "nyc": "^10.3.2",
    "safe-publish-latest": "^2.0.0",
    "tape": "^5.3.2"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..12.0",
      "opera/15.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "engines": {
    "node": ">= 0.4"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false,
    "hideCredit": true
  }
}# These are supported funding model platforms

github: ljharb
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/is-negative-zero
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
root = true

[*]
indent_style = tab
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 150

[CHANGELOG.md]
indent_style = space
indent_size = 2

[*.json]
max_line_length = off

[Makefile]
max_line_length = off

[CHANGELOG.md]
max_line_length = off
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"exclude": [
		"coverage",
		"test",
		"test-corejs.js"
	]
}
The MIT License (MIT)

Copyright (c) 2015 Jordan Harband

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 numToStr = Number.prototype.toString;
var tryNumberObject = function tryNumberObject(value) {
	try {
		numToStr.call(value);
		return true;
	} catch (e) {
		return false;
	}
};
var toStr = Object.prototype.toString;
var numClass = '[object Number]';
var hasToStringTag = require('has-tostringtag/shams')();

module.exports = function isNumberObject(value) {
	if (typeof value === 'number') {
		return true;
	}
	if (typeof value !== 'object') {
		return false;
	}
	return hasToStringTag ? tryNumberObject(value) : toStr.call(value) === numClass;
};
{
  "name": "is-number-object",
  "version": "1.0.7",
  "author": "Jordan Harband <ljharb@gmail.com>",
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "description": "Is this value a JS Number object? This module works cross-realm/iframe, and despite ES6 @@toStringTag.",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/inspect-js/is-number-object.git"
  },
  "license": "MIT",
  "homepage": "https://github.com/inspect-js/is-number-object#readme",
  "devDependencies": {
    "@ljharb/eslint-config": "^20.2.3",
    "aud": "^2.0.0",
    "auto-changelog": "^2.4.0",
    "core-js": "^3.21.1",
    "eclint": "^2.8.1",
    "eslint": "=8.8.0",
    "foreach": "^2.0.5",
    "indexof": "^0.0.1",
    "is": "^3.3.0",
    "nyc": "^10.3.2",
    "safe-publish-latest": "^2.0.0",
    "tape": "^5.5.2"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "engines": {
    "node": ">= 0.4"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false,
    "hideCredit": true
  },
  "dependencies": {
    "has-tostringtag": "^1.0.0"
  }
}# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/is-number-object
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
root = true

[*]
indent_style = tab
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 150

[CHANGELOG.md]
indent_style = space
indent_size = 2

[*.json]
max_line_length = off

[Makefile]
max_line_length = off
coverage/
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"exclude": [
		"coverage",
		"test",
		"test-corejs.js"
	]
}
The MIT License (MIT)

Copyright (c) 2014 Jordan Harband

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 callBound = require('call-bind/callBound');
var hasToStringTag = require('has-tostringtag/shams')();
var has;
var $exec;
var isRegexMarker;
var badStringifier;

if (hasToStringTag) {
	has = callBound('Object.prototype.hasOwnProperty');
	$exec = callBound('RegExp.prototype.exec');
	isRegexMarker = {};

	var throwRegexMarker = function () {
		throw isRegexMarker;
	};
	badStringifier = {
		toString: throwRegexMarker,
		valueOf: throwRegexMarker
	};

	if (typeof Symbol.toPrimitive === 'symbol') {
		badStringifier[Symbol.toPrimitive] = throwRegexMarker;
	}
}

var $toString = callBound('Object.prototype.toString');
var gOPD = Object.getOwnPropertyDescriptor;
var regexClass = '[object RegExp]';

module.exports = hasToStringTag
	// eslint-disable-next-line consistent-return
	? function isRegex(value) {
		if (!value || typeof value !== 'object') {
			return false;
		}

		var descriptor = gOPD(value, 'lastIndex');
		var hasLastIndexDataProperty = descriptor && has(descriptor, 'value');
		if (!hasLastIndexDataProperty) {
			return false;
		}

		try {
			$exec(value, badStringifier);
		} catch (e) {
			return e === isRegexMarker;
		}
	}
	: function isRegex(value) {
		// In older browsers, typeof regex incorrectly returns 'function'
		if (!value || (typeof value !== 'object' && typeof value !== 'function')) {
			return false;
		}

		return $toString(value) === regexClass;
	};
{
  "name": "is-regex",
  "version": "1.1.4",
  "description": "Is this value a JS regex? Works cross-realm/iframe, and despite ES6 @@toStringTag",
  "author": "Jordan Harband <ljharb@gmail.com>",
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "license": "MIT",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/inspect-js/is-regex.git"
  },
  "homepage": "https://github.com/inspect-js/is-regex",
  "dependencies": {
    "call-bind": "^1.0.2",
    "has-tostringtag": "^1.0.0"
  },
  "devDependencies": {
    "@ljharb/eslint-config": "^17.6.0",
    "aud": "^1.1.5",
    "auto-changelog": "^2.3.0",
    "core-js": "^3.16.0",
    "eclint": "^2.8.1",
    "eslint": "^7.32.0",
    "foreach": "^2.0.5",
    "nyc": "^10.3.2",
    "safe-publish-latest": "^1.1.4",
    "tape": "^5.3.0"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "engines": {
    "node": ">= 0.4"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false,
    "hideCredit": true
  }
}coverage/
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"exclude": [
		"coverage",
		"test"
	]
}
MIT License

Copyright (c) 2021 Inspect JS

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 callBound = require('call-bind/callBound');

var $byteLength = callBound('SharedArrayBuffer.prototype.byteLength', true);

module.exports = $byteLength
	? function isSharedArrayBuffer(obj) {
		if (!obj || typeof obj !== 'object') {
			return false;
		}
		try {
			$byteLength(obj);
			return true;
		} catch (e) {
			return false;
		}
	}
	: function isSharedArrayBuffer(obj) { // eslint-disable-line no-unused-vars
		return false;
	};
{
  "name": "is-shared-array-buffer",
  "version": "1.0.2",
  "author": {
    "name": "Jordan Harband",
    "email": "ljharb@gmail.com",
    "url": "http://ljharb.codes"
  },
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "description": "Is this value a JS SharedArrayBuffer?",
  "license": "MIT",
  "main": "index.js",
  "exports": {
    ".": "./index.js",
    "./package.json": "./package.json"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/inspect-js/is-shared-array-buffer.git"
  },
  "homepage": "https://github.com/inspect-js/is-shared-array-buffer#readme",
  "devDependencies": {
    "@ljharb/eslint-config": "^20.2.3",
    "aud": "^2.0.0",
    "auto-changelog": "^2.4.0",
    "es-value-fixtures": "^1.2.1",
    "eslint": "=8.8.0",
    "for-each": "^0.3.3",
    "nyc": "^10.3.2",
    "object-inspect": "^1.12.0",
    "safe-publish-latest": "^2.0.0",
    "tape": "^5.5.2"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false,
    "hideCredit": true
  },
  "dependencies": {
    "call-bind": "^1.0.2"
  }
}# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/is-shared-array-buffer
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
coverage/
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"exclude": [
		"coverage",
		"test",
		"test-corejs.js"
	]
}
The MIT License (MIT)

Copyright (c) 2015 Jordan Harband

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 strValue = String.prototype.valueOf;
var tryStringObject = function tryStringObject(value) {
	try {
		strValue.call(value);
		return true;
	} catch (e) {
		return false;
	}
};
var toStr = Object.prototype.toString;
var strClass = '[object String]';
var hasToStringTag = require('has-tostringtag/shams')();

module.exports = function isString(value) {
	if (typeof value === 'string') {
		return true;
	}
	if (typeof value !== 'object') {
		return false;
	}
	return hasToStringTag ? tryStringObject(value) : toStr.call(value) === strClass;
};
{
  "name": "is-string",
  "version": "1.0.7",
  "author": "Jordan Harband <ljharb@gmail.com>",
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "description": "Is this value a JS String object or primitive? This module works cross-realm/iframe, and despite ES6 @@toStringTag.",
  "license": "MIT",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/ljharb/is-string.git"
  },
  "dependencies": {
    "has-tostringtag": "^1.0.0"
  },
  "devDependencies": {
    "@ljharb/eslint-config": "^17.6.0",
    "aud": "^1.1.5",
    "auto-changelog": "^2.3.0",
    "core-js": "^3.16.0",
    "eclint": "^2.8.1",
    "eslint": "^7.32.0",
    "foreach": "^2.0.5",
    "indexof": "^0.0.1",
    "is": "^3.3.0",
    "nyc": "^10.3.2",
    "safe-publish-latest": "^1.1.4",
    "tape": "^5.3.0"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "engines": {
    "node": ">= 0.4"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false
  }
}# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/is-string
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
root = true

[*]
indent_style = tab;
insert_final_newline = true;
quote_type = auto;
space_after_anonymous_functions = true;
space_after_control_statements = true;
spaces_around_operators = true;
trim_trailing_whitespace = true;
spaces_in_brackets = false;
end_of_line = lf;

coverage/
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"exclude": [
		"coverage",
		"test"
	]
}
The MIT License (MIT)

Copyright (c) 2015 Jordan Harband

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 toStr = Object.prototype.toString;
var hasSymbols = require('has-symbols')();

if (hasSymbols) {
	var symToStr = Symbol.prototype.toString;
	var symStringRegex = /^Symbol\(.*\)$/;
	var isSymbolObject = function isRealSymbolObject(value) {
		if (typeof value.valueOf() !== 'symbol') {
			return false;
		}
		return symStringRegex.test(symToStr.call(value));
	};

	module.exports = function isSymbol(value) {
		if (typeof value === 'symbol') {
			return true;
		}
		if (toStr.call(value) !== '[object Symbol]') {
			return false;
		}
		try {
			return isSymbolObject(value);
		} catch (e) {
			return false;
		}
	};
} else {

	module.exports = function isSymbol(value) {
		// this environment does not support Symbols.
		return false && value;
	};
}
{
  "name": "is-symbol",
  "version": "1.0.4",
  "description": "Determine if a value is an ES6 Symbol or not.",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/inspect-js/is-symbol.git"
  },
  "author": "Jordan Harband <ljharb@gmail.com>",
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "license": "MIT",
  "dependencies": {
    "has-symbols": "^1.0.2"
  },
  "devDependencies": {
    "@ljharb/eslint-config": "^17.6.0",
    "aud": "^1.1.5",
    "auto-changelog": "^2.2.1",
    "eslint": "^7.26.0",
    "nyc": "^10.3.2",
    "object-inspect": "^1.10.3",
    "safe-publish-latest": "^1.1.4",
    "tape": "^5.2.2"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "engines": {
    "node": ">= 0.4"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false,
    "hideCredit": true
  }
}# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/is-symbol
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
coverage/
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"exclude": [
		"coverage",
		"test"
	]
}
MIT License

Copyright (c) 2020 Inspect JS

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 callBound = require('call-bind/callBound');

var $deref = callBound('WeakRef.prototype.deref', true);

module.exports = typeof WeakRef === 'undefined'
	? function isWeakRef(value) { // eslint-disable-line no-unused-vars
		return false;
	}
	: function isWeakRef(value) {
		if (!value || typeof value !== 'object') {
			return false;
		}
		try {
			$deref(value);
			return true;
		} catch (e) {
			return false;
		}
	};
{
  "name": "is-weakref",
  "version": "1.0.2",
  "description": "Is this value a JS WeakRef? This module works cross-realm/iframe, and despite ES6 @@toStringTag.",
  "main": "index.js",
  "exports": {
    ".": "./index.js",
    "./package.json": "./package.json"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/inspect-js/is-weakref.git"
  },
  "author": "Jordan Harband <ljharb@gmail.com>",
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "license": "MIT",
  "homepage": "https://github.com/inspect-js/is-weakref#readme",
  "devDependencies": {
    "@ljharb/eslint-config": "^20.0.0",
    "aud": "^1.1.5",
    "auto-changelog": "^2.3.0",
    "eslint": "^8.4.1",
    "for-each": "^0.3.3",
    "nyc": "^10.3.2",
    "object-inspect": "^1.11.1",
    "safe-publish-latest": "^2.0.0",
    "tape": "^5.3.2"
  },
  "dependencies": {
    "call-bind": "^1.0.2"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false,
    "hideCredit": true
  }
}# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/is-weakref
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
'use strict';
const os = require('os');
const fs = require('fs');
const isDocker = require('is-docker');

const isWsl = () => {
	if (process.platform !== 'linux') {
		return false;
	}

	if (os.release().toLowerCase().includes('microsoft')) {
		if (isDocker()) {
			return false;
		}

		return true;
	}

	try {
		return fs.readFileSync('/proc/version', 'utf8').toLowerCase().includes('microsoft') ?
			!isDocker() : false;
	} catch (_) {
		return false;
	}
};

if (process.env.__IS_WSL_TEST__) {
	module.exports = isWsl;
} else {
	module.exports = isWsl();
}
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-wsl",
  "version": "2.2.0",
  "description": "Check if the process is running inside Windows Subsystem for Linux (Bash on Windows)",
  "license": "MIT",
  "repository": "sindresorhus/is-wsl",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "engines": {
    "node": ">=8"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "dependencies": {
    "is-docker": "^2.0.0"
  },
  "devDependencies": {
    "ava": "^1.4.1",
    "clear-module": "^3.2.0",
    "proxyquire": "^2.1.0",
    "tsd": "^0.7.2",
    "xo": "^0.24.0"
  }
}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.
var fs = require('fs')
var core
if (process.platform === 'win32' || global.TESTING_WINDOWS) {
  core = require('./windows.js')
} else {
  core = require('./mode.js')
}

module.exports = isexe
isexe.sync = sync

function isexe (path, options, cb) {
  if (typeof options === 'function') {
    cb = options
    options = {}
  }

  if (!cb) {
    if (typeof Promise !== 'function') {
      throw new TypeError('callback not provided')
    }

    return new Promise(function (resolve, reject) {
      isexe(path, options || {}, function (er, is) {
        if (er) {
          reject(er)
        } else {
          resolve(is)
        }
      })
    })
  }

  core(path, options || {}, function (er, is) {
    // ignore EACCES because that just means we aren't allowed to run it
    if (er) {
      if (er.code === 'EACCES' || options && options.ignoreErrors) {
        er = null
        is = false
      }
    }
    cb(er, is)
  })
}

function sync (path, options) {
  // my kingdom for a filtered catch
  try {
    return core.sync(path, options || {})
  } catch (er) {
    if (options && options.ignoreErrors || er.code === 'EACCES') {
      return false
    } else {
      throw er
    }
  }
}
module.exports = isexe
isexe.sync = sync

var fs = require('fs')

function isexe (path, options, cb) {
  fs.stat(path, function (er, stat) {
    cb(er, er ? false : checkStat(stat, options))
  })
}

function sync (path, options) {
  return checkStat(fs.statSync(path), options)
}

function checkStat (stat, options) {
  return stat.isFile() && checkMode(stat, options)
}

function checkMode (stat, options) {
  var mod = stat.mode
  var uid = stat.uid
  var gid = stat.gid

  var myUid = options.uid !== undefined ?
    options.uid : process.getuid && process.getuid()
  var myGid = options.gid !== undefined ?
    options.gid : process.getgid && process.getgid()

  var u = parseInt('100', 8)
  var g = parseInt('010', 8)
  var o = parseInt('001', 8)
  var ug = u | g

  var ret = (mod & o) ||
    (mod & g) && gid === myGid ||
    (mod & u) && uid === myUid ||
    (mod & ug) && myUid === 0

  return ret
}
{
  "name": "isexe",
  "version": "2.0.0",
  "description": "Minimal module to check if a file is executable.",
  "main": "index.js",
  "directories": {
    "test": "test"
  },
  "devDependencies": {
    "mkdirp": "^0.5.1",
    "rimraf": "^2.5.0",
    "tap": "^10.3.0"
  },
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
  "license": "ISC",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/isaacs/isexe.git"
  },
  "homepage": "https://github.com/isaacs/isexe#readme"
}module.exports = isexe
isexe.sync = sync

var fs = require('fs')

function checkPathExt (path, options) {
  var pathext = options.pathExt !== undefined ?
    options.pathExt : process.env.PATHEXT

  if (!pathext) {
    return true
  }

  pathext = pathext.split(';')
  if (pathext.indexOf('') !== -1) {
    return true
  }
  for (var i = 0; i < pathext.length; i++) {
    var p = pathext[i].toLowerCase()
    if (p && path.substr(-p.length).toLowerCase() === p) {
      return true
    }
  }
  return false
}

function checkStat (stat, path, options) {
  if (!stat.isSymbolicLink() && !stat.isFile()) {
    return false
  }
  return checkPathExt(path, options)
}

function isexe (path, options, cb) {
  fs.stat(path, function (er, stat) {
    cb(er, er ? false : checkStat(stat, path, options))
  })
}

function sync (path, options) {
  return checkStat(fs.statSync(path), path, options)
}
/node_modules/
/tests/
Copyright 2015-2017 Yi-Cyuan Chen

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": "js-md4",
  "version": "0.3.2",
  "main": ["src/md4.js"],
  "ignore": [
    "samples",
    "tests"
  ]
}
{
  "name": "js-md4",
  "version": "0.3.2",
  "description": "A simple MD4 hash function for JavaScript supports UTF-8 encoding.",
  "main": "src/md4.js",
  "devDependencies": {
    "expect.js": "~0.3.1",
    "jscoverage": "~0.5.9",
    "jsdoc": "^3.4.0",
    "mocha": "~2.3.4",
    "uglifyjs": "~2.4.10"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/emn178/js-md4.git"
  },
  "license": "MIT",
  "author": "Chen, Yi-Cyuan <emn178@gmail.com>",
  "homepage": "https://github.com/emn178/js-md4"
}/**
 * [js-md4]{@link https://github.com/emn178/js-md4}
 *
 * @namespace md4
 * @version 0.3.2
 * @author Yi-Cyuan Chen [emn178@gmail.com]
 * @copyright Yi-Cyuan Chen 2015-2027
 * @license MIT
 */
/*jslint bitwise: true */
(function () {
  'use strict';

  var root = typeof window === 'object' ? window : {};
  var NODE_JS = !root.JS_MD4_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node;
  if (NODE_JS) {
    root = global;
  }
  var COMMON_JS = !root.JS_MD4_NO_COMMON_JS && typeof module === 'object' && module.exports;
  var AMD = typeof define === 'function' && define.amd;
  var ARRAY_BUFFER = !root.JS_MD4_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined';
  var HEX_CHARS = '0123456789abcdef'.split('');
  var EXTRA = [128, 32768, 8388608, -2147483648];
  var SHIFT = [0, 8, 16, 24];
  var OUTPUT_TYPES = ['hex', 'array', 'digest', 'buffer', 'arrayBuffer'];

  var blocks = [], buffer8;
  if (ARRAY_BUFFER) {
    var buffer = new ArrayBuffer(68);
    buffer8 = new Uint8Array(buffer);
    blocks = new Uint32Array(buffer);
  }

  /**
   * @method hex
   * @memberof md4
   * @description Output hash as hex string
   * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
   * @returns {String} Hex string
   * @example
   * md4.hex('The quick brown fox jumps over the lazy dog');
   * // equal to
   * md4('The quick brown fox jumps over the lazy dog');
   */
  /**
   * @method digest
   * @memberof md4
   * @description Output hash as bytes array
   * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
   * @returns {Array} Bytes array
   * @example
   * md4.digest('The quick brown fox jumps over the lazy dog');
   */
  /**
   * @method array
   * @memberof md4
   * @description Output hash as bytes array
   * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
   * @returns {Array} Bytes array
   * @example
   * md4.array('The quick brown fox jumps over the lazy dog');
   */
  /**
   * @method buffer
   * @memberof md4
   * @description Output hash as ArrayBuffer
   * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
   * @returns {ArrayBuffer} ArrayBuffer
   * @example
   * md4.buffer('The quick brown fox jumps over the lazy dog');
   */
  var createOutputMethod = function (outputType) {
    return function(message) {
      return new Md4(true).update(message)[outputType]();
    }
  };

  /**
   * @method create
   * @memberof md4
   * @description Create Md4 object
   * @returns {Md4} MD4 object.
   * @example
   * var hash = md4.create();
   */
  /**
   * @method update
   * @memberof md4
   * @description Create and update Md4 object
   * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
   * @returns {Md4} MD4 object.
   * @example
   * var hash = md4.update('The quick brown fox jumps over the lazy dog');
   * // equal to
   * var hash = md4.create();
   * hash.update('The quick brown fox jumps over the lazy dog');
   */
  var createMethod = function () {
    var method = createOutputMethod('hex');
    if (NODE_JS) {
      method = nodeWrap(method);
    }
    method.create = function () {
      return new Md4();
    };
    method.update = function (message) {
      return method.create().update(message);
    };
    for (var i = 0; i < OUTPUT_TYPES.length; ++i) {
      var type = OUTPUT_TYPES[i];
      method[type] = createOutputMethod(type);
    }
    return method;
  };

  var nodeWrap = function (method) {
    var crypto = require('crypto');
    var Buffer = require('buffer').Buffer;
    var nodeMethod = function (message) {
      if (typeof message === 'string') {
        return crypto.createHash('md4').update(message, 'utf8').digest('hex');
      } else if (ARRAY_BUFFER && message instanceof ArrayBuffer) {
        message = new Uint8Array(message);
      } else if (message.length === undefined) {
        return method(message);
      }
      return crypto.createHash('md4').update(new Buffer(message)).digest('hex');
    };
    return nodeMethod;
  };

  /**
   * Md4 class
   * @class Md4
   * @description This is internal class.
   * @see {@link md4.create}
   */
  function Md4(sharedMemory) {
    if (sharedMemory) {
      blocks[0] = blocks[16] = blocks[1] = blocks[2] = blocks[3] =
      blocks[4] = blocks[5] = blocks[6] = blocks[7] =
      blocks[8] = blocks[9] = blocks[10] = blocks[11] =
      blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
      this.blocks = blocks;
      this.buffer8 = buffer8;
    } else {
      if (ARRAY_BUFFER) {
        var buffer = new ArrayBuffer(68);
        this.buffer8 = new Uint8Array(buffer);
        this.blocks = new Uint32Array(buffer);
      } else {
        this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
      }
    }
    this.h0 = this.h1 = this.h2 = this.h3 = this.start = this.bytes = 0;
    this.finalized = this.hashed = false;
    this.first = true;
  }

  /**
   * @method update
   * @memberof Md4
   * @instance
   * @description Update hash
   * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
   * @returns {Md4} MD4 object.
   * @see {@link md4.update}
   */
  Md4.prototype.update = function (message) {
    if (this.finalized) {
      return;
    }
    var notString = typeof message !== 'string';
    if (notString && ARRAY_BUFFER && message instanceof ArrayBuffer) {
      message = new Uint8Array(message);
    }
    var code, index = 0, i, length = message.length || 0, blocks = this.blocks;
    var buffer8 = this.buffer8;

    while (index < length) {
      if (this.hashed) {
        this.hashed = false;
        blocks[0] = blocks[16];
        blocks[16] = blocks[1] = blocks[2] = blocks[3] =
        blocks[4] = blocks[5] = blocks[6] = blocks[7] =
        blocks[8] = blocks[9] = blocks[10] = blocks[11] =
        blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
      }

      if (notString) {
        if (ARRAY_BUFFER) {
          for (i = this.start; index < length && i < 64; ++index) {
            buffer8[i++] = message[index];
          }
        } else {
          for (i = this.start; index < length && i < 64; ++index) {
            blocks[i >> 2] |= message[index] << SHIFT[i++ & 3];
          }
        }
      } else {
        if (ARRAY_BUFFER) {
          for (i = this.start; index < length && i < 64; ++index) {
            code = message.charCodeAt(index);
            if (code < 0x80) {
              buffer8[i++] = code;
            } else if (code < 0x800) {
              buffer8[i++] = 0xc0 | (code >> 6);
              buffer8[i++] = 0x80 | (code & 0x3f);
            } else if (code < 0xd800 || code >= 0xe000) {
              buffer8[i++] = 0xe0 | (code >> 12);
              buffer8[i++] = 0x80 | ((code >> 6) & 0x3f);
              buffer8[i++] = 0x80 | (code & 0x3f);
            } else {
              code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
              buffer8[i++] = 0xf0 | (code >> 18);
              buffer8[i++] = 0x80 | ((code >> 12) & 0x3f);
              buffer8[i++] = 0x80 | ((code >> 6) & 0x3f);
              buffer8[i++] = 0x80 | (code & 0x3f);
            }
          }
        } else {
          for (i = this.start; index < length && i < 64; ++index) {
            code = message.charCodeAt(index);
            if (code < 0x80) {
              blocks[i >> 2] |= code << SHIFT[i++ & 3];
            } else if (code < 0x800) {
              blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3];
              blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
            } else if (code < 0xd800 || code >= 0xe000) {
              blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3];
              blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
              blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
            } else {
              code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
              blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3];
              blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3];
              blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
              blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
            }
          }
        }
      }
      this.lastByteIndex = i;
      this.bytes += i - this.start;
      if (i >= 64) {
        this.start = i - 64;
        this.hash();
        this.hashed = true;
      } else {
        this.start = i;
      }
    }
    return this;
  };

  Md4.prototype.finalize = function () {
    if (this.finalized) {
      return;
    }
    this.finalized = true;
    var blocks = this.blocks, i = this.lastByteIndex;
    blocks[i >> 2] |= EXTRA[i & 3];
    if (i >= 56) {
      if (!this.hashed) {
        this.hash();
      }
      blocks[0] = blocks[16];
      blocks[16] = blocks[1] = blocks[2] = blocks[3] =
      blocks[4] = blocks[5] = blocks[6] = blocks[7] =
      blocks[8] = blocks[9] = blocks[10] = blocks[11] =
      blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
    }
    blocks[14] = this.bytes << 3;
    this.hash();
  };

  Md4.prototype.hash = function () {
    var a, b, c, d, ab, bc, cd, da, blocks = this.blocks;

    if (this.first) {
      a = blocks[0] - 1;
      a = (a << 3) | (a >>> 29);
      d = ((a & 0xefcdab89) | (~a & 0x98badcfe)) + blocks[1] + 271733878;
      d = (d << 7) | (d >>> 25);
      c = ((d & a) | (~d & 0xefcdab89)) + blocks[2] - 1732584194;
      c = (c << 11) | (c >>> 21);
      b = ((c & d) | (~c & a)) + blocks[3] - 271733879;
      b = (b << 19) | (b >>> 13);
    } else {
      a = this.h0;
      b = this.h1;
      c = this.h2;
      d = this.h3;
      a += ((b & c) | (~b & d)) + blocks[0];
      a = (a << 3) | (a >>> 29);
      d += ((a & b) | (~a & c)) + blocks[1];
      d = (d << 7) | (d >>> 25);
      c += ((d & a) | (~d & b)) + blocks[2];
      c = (c << 11) | (c >>> 21);
      b += ((c & d) | (~c & a)) + blocks[3];
      b = (b << 19) | (b >>> 13);
    }
    a += ((b & c) | (~b & d)) + blocks[4];
    a = (a << 3) | (a >>> 29);
    d += ((a & b) | (~a & c)) + blocks[5];
    d = (d << 7) | (d >>> 25);
    c += ((d & a) | (~d & b)) + blocks[6];
    c = (c << 11) | (c >>> 21);
    b += ((c & d) | (~c & a)) + blocks[7];
    b = (b << 19) | (b >>> 13);
    a += ((b & c) | (~b & d)) + blocks[8];
    a = (a << 3) | (a >>> 29);
    d += ((a & b) | (~a & c)) + blocks[9];
    d = (d << 7) | (d >>> 25);
    c += ((d & a) | (~d & b)) + blocks[10];
    c = (c << 11) | (c >>> 21);
    b += ((c & d) | (~c & a)) + blocks[11];
    b = (b << 19) | (b >>> 13);
    a += ((b & c) | (~b & d)) + blocks[12];
    a = (a << 3) | (a >>> 29);
    d += ((a & b) | (~a & c)) + blocks[13];
    d = (d << 7) | (d >>> 25);
    c += ((d & a) | (~d & b)) + blocks[14];
    c = (c << 11) | (c >>> 21);
    b += ((c & d) | (~c & a)) + blocks[15];
    b = (b << 19) | (b >>> 13);

    bc = b & c;
    a += (bc | (b & d) | (c & d)) + blocks[0] + 1518500249;
    a = (a << 3) | (a >>> 29);
    ab = a & b;
    d += (ab | (a & c) | bc) + blocks[4] + 1518500249;
    d = (d << 5) | (d >>> 27);
    da = d & a;
    c += (da | (d & b) | ab) + blocks[8] + 1518500249;
    c = (c << 9) | (c >>> 23);
    cd = c & d;
    b += (cd | (c & a) | da) + blocks[12] + 1518500249;
    b = (b << 13) | (b >>> 19);
    bc = b & c;
    a += (bc | (b & d) | cd) + blocks[1] + 1518500249;
    a = (a << 3) | (a >>> 29);
    ab = a & b;
    d += (ab | (a & c) | bc) + blocks[5] + 1518500249;
    d = (d << 5) | (d >>> 27);
    da = d & a;
    c += (da | (d & b) | ab) + blocks[9] + 1518500249;
    c = (c << 9) | (c >>> 23);
    cd = c & d;
    b += (cd | (c & a) | da) + blocks[13] + 1518500249;
    b = (b << 13) | (b >>> 19);
    bc = b & c;
    a += (bc | (b & d) | cd) + blocks[2] + 1518500249;
    a = (a << 3) | (a >>> 29);
    ab = a & b;
    d += (ab | (a & c) | bc) + blocks[6] + 1518500249;
    d = (d << 5) | (d >>> 27);
    da = d & a;
    c += (da | (d & b) | ab) + blocks[10] + 1518500249;
    c = (c << 9) | (c >>> 23);
    cd = c & d;
    b += (cd | (c & a) | da) + blocks[14] + 1518500249;
    b = (b << 13) | (b >>> 19);
    bc = b & c;
    a += (bc | (b & d) | cd) + blocks[3] + 1518500249;
    a = (a << 3) | (a >>> 29);
    ab = a & b;
    d += (ab | (a & c) | bc) + blocks[7] + 1518500249;
    d = (d << 5) | (d >>> 27);
    da = d & a;
    c += (da | (d & b) | ab) + blocks[11] + 1518500249;
    c = (c << 9) | (c >>> 23);
    b += ((c & d) | (c & a) | da) + blocks[15] + 1518500249;
    b = (b << 13) | (b >>> 19);

    bc = b ^ c;
    a += (bc ^ d) + blocks[0] + 1859775393;
    a = (a << 3) | (a >>> 29);
    d += (bc ^ a) + blocks[8] + 1859775393;
    d = (d << 9) | (d >>> 23);
    da = d ^ a;
    c += (da ^ b) + blocks[4] + 1859775393;
    c = (c << 11) | (c >>> 21);
    b += (da ^ c) + blocks[12] + 1859775393;
    b = (b << 15) | (b >>> 17);
    bc = b ^ c;
    a += (bc ^ d) + blocks[2] + 1859775393;
    a = (a << 3) | (a >>> 29);
    d += (bc ^ a) + blocks[10] + 1859775393;
    d = (d << 9) | (d >>> 23);
    da = d ^ a;
    c += (da ^ b) + blocks[6] + 1859775393;
    c = (c << 11) | (c >>> 21);
    b += (da ^ c) + blocks[14] + 1859775393;
    b = (b << 15) | (b >>> 17);
    bc = b ^ c;
    a += (bc ^ d) + blocks[1] + 1859775393;
    a = (a << 3) | (a >>> 29);
    d += (bc ^ a) + blocks[9] + 1859775393;
    d = (d << 9) | (d >>> 23);
    da = d ^ a;
    c += (da ^ b) + blocks[5] + 1859775393;
    c = (c << 11) | (c >>> 21);
    b += (da ^ c) + blocks[13] + 1859775393;
    b = (b << 15) | (b >>> 17);
    bc = b ^ c;
    a += (bc ^ d) + blocks[3] + 1859775393;
    a = (a << 3) | (a >>> 29);
    d += (bc ^ a) + blocks[11] + 1859775393;
    d = (d << 9) | (d >>> 23);
    da = d ^ a;
    c += (da ^ b) + blocks[7] + 1859775393;
    c = (c << 11) | (c >>> 21);
    b += (da ^ c) + blocks[15] + 1859775393;
    b = (b << 15) | (b >>> 17);

    if (this.first) {
      this.h0 = a + 1732584193 << 0;
      this.h1 = b - 271733879 << 0;
      this.h2 = c - 1732584194 << 0;
      this.h3 = d + 271733878 << 0;
      this.first = false;
    } else {
      this.h0 = this.h0 + a << 0;
      this.h1 = this.h1 + b << 0;
      this.h2 = this.h2 + c << 0;
      this.h3 = this.h3 + d << 0;
    }
  };

  /**
   * @method hex
   * @memberof Md4
   * @instance
   * @description Output hash as hex string
   * @returns {String} Hex string
   * @see {@link md4.hex}
   * @example
   * hash.hex();
   */
  Md4.prototype.hex = function () {
    this.finalize();

    var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;

    return HEX_CHARS[(h0 >> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +
      HEX_CHARS[(h0 >> 12) & 0x0F] + HEX_CHARS[(h0 >> 8) & 0x0F] +
      HEX_CHARS[(h0 >> 20) & 0x0F] + HEX_CHARS[(h0 >> 16) & 0x0F] +
      HEX_CHARS[(h0 >> 28) & 0x0F] + HEX_CHARS[(h0 >> 24) & 0x0F] +
      HEX_CHARS[(h1 >> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +
      HEX_CHARS[(h1 >> 12) & 0x0F] + HEX_CHARS[(h1 >> 8) & 0x0F] +
      HEX_CHARS[(h1 >> 20) & 0x0F] + HEX_CHARS[(h1 >> 16) & 0x0F] +
      HEX_CHARS[(h1 >> 28) & 0x0F] + HEX_CHARS[(h1 >> 24) & 0x0F] +
      HEX_CHARS[(h2 >> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +
      HEX_CHARS[(h2 >> 12) & 0x0F] + HEX_CHARS[(h2 >> 8) & 0x0F] +
      HEX_CHARS[(h2 >> 20) & 0x0F] + HEX_CHARS[(h2 >> 16) & 0x0F] +
      HEX_CHARS[(h2 >> 28) & 0x0F] + HEX_CHARS[(h2 >> 24) & 0x0F] +
      HEX_CHARS[(h3 >> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +
      HEX_CHARS[(h3 >> 12) & 0x0F] + HEX_CHARS[(h3 >> 8) & 0x0F] +
      HEX_CHARS[(h3 >> 20) & 0x0F] + HEX_CHARS[(h3 >> 16) & 0x0F] +
      HEX_CHARS[(h3 >> 28) & 0x0F] + HEX_CHARS[(h3 >> 24) & 0x0F];
  };

  /**
   * @method toString
   * @memberof Md4
   * @instance
   * @description Output hash as hex string
   * @returns {String} Hex string
   * @see {@link md4.hex}
   * @example
   * hash.toString();
   */
  Md4.prototype.toString = Md4.prototype.hex;

  /**
   * @method digest
   * @memberof Md4
   * @instance
   * @description Output hash as bytes array
   * @returns {Array} Bytes array
   * @see {@link md4.digest}
   * @example
   * hash.digest();
   */
  Md4.prototype.digest = function() {
    this.finalize();

    var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
    return [
      h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 24) & 0xFF,
      h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 24) & 0xFF,
      h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 24) & 0xFF,
      h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 24) & 0xFF
    ];
  };

  /**
   * @method array
   * @memberof Md4
   * @instance
   * @description Output hash as bytes array
   * @returns {Array} Bytes array
   * @see {@link md4.array}
   * @example
   * hash.array();
   */
  Md4.prototype.array = Md4.prototype.digest;

  /**
   * @method arrayBuffer
   * @memberof Md4
   * @instance
   * @description Output hash as ArrayBuffer
   * @returns {ArrayBuffer} ArrayBuffer
   * @see {@link md4.arrayBuffer}
   * @example
   * hash.arrayBuffer();
   */
  Md4.prototype.arrayBuffer = function() {
    this.finalize();

    var buffer = new ArrayBuffer(16);
    var blocks = new Uint32Array(buffer);
    blocks[0] = this.h0;
    blocks[1] = this.h1;
    blocks[2] = this.h2;
    blocks[3] = this.h3;
    return buffer;
  };

  /**
   * @method buffer
   * @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
   * @memberof Md4
   * @instance
   * @description Output hash as ArrayBuffer
   * @returns {ArrayBuffer} ArrayBuffer
   * @see {@link md4.buffer}
   * @example
   * hash.buffer();
   */
  Md4.prototype.buffer = Md4.prototype.arrayBuffer;

  var exports = createMethod();

  if (COMMON_JS) {
    module.exports = exports;
  } else {
    /**
     * @method md4
     * @description MD4 hash function, export to global in browsers.
     * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
     * @returns {String} md4 hashes
     * @example
     * md4(''); // 31d6cfe0d16ae931b73c59d7e0c089c0
     * md4('The quick brown fox jumps over the lazy dog'); // 1bee69a46ba811185c194762abaeae90
     * md4('The quick brown fox jumps over the lazy dog.'); // 2812c6c7136898c51f6f6739ad08750e
     *
     * // It also supports UTF-8 encoding
     * md4('中文'); // 223088bf7bd45a16436b15360c5fc5a0
     *
     * // It also supports byte `Array`, `Uint8Array`, `ArrayBuffer`
     * md4([]); // 31d6cfe0d16ae931b73c59d7e0c089c0
     * md4(new Uint8Array([])); // 31d6cfe0d16ae931b73c59d7e0c089c0
     */
    root.md4 = exports;
    if (AMD) {
      define(function () {
        return exports;
      });
    }
  }
})();
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>JSDoc: Class: Md4</title>

    <script src="scripts/prettify/prettify.js"> </script>
    <script src="scripts/prettify/lang-css.js"> </script>
    <!--[if lt IE 9]>
      <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
    <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
    <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>

<body>

<div id="main">

    <h1 class="page-title">Class: Md4</h1>

    




<section>

<header>
    
        <h2>Md4</h2>
        
    
</header>

<article>
    <div class="container-overview">
    
        

    

    <h4 class="name" id="Md4"><span class="type-signature"></span>new Md4<span class="signature">()</span><span class="type-signature"></span></h4>

    



<div class="description">
    This is internal class.
</div>













<dl class="details">

    

    

    

    

    

    

    

    

    

    

    

    

    
    <dt class="tag-source">Source:</dt>
    <dd class="tag-source"><ul class="dummy"><li>
        <a href="md4.js.html">md4.js</a>, <a href="md4.js.html#line132">line 132</a>
    </li></ul></dd>
    

    

    
    <dt class="tag-see">See:</dt>
    <dd class="tag-see">
        <ul>
            <li><a href="md4.html#.create">md4.create</a></li>
        </ul>
    </dd>
    

    
</dl>
















    
    </div>

    

    

    

     

    

    

    
        <h3 class="subsection-title">Methods</h3>

        
            

    

    <h4 class="name" id="array"><span class="type-signature"></span>array<span class="signature">()</span><span class="type-signature"> &rarr; {Array}</span></h4>

    



<div class="description">
    Output hash as bytes array
</div>













<dl class="details">

    

    

    

    

    

    

    

    

    

    

    

    

    
    <dt class="tag-source">Source:</dt>
    <dd class="tag-source"><ul class="dummy"><li>
        <a href="md4.js.html">md4.js</a>, <a href="md4.js.html#line498">line 498</a>
    </li></ul></dd>
    

    

    
    <dt class="tag-see">See:</dt>
    <dd class="tag-see">
        <ul>
            <li><a href="md4.html#.array">md4.array</a></li>
        </ul>
    </dd>
    

    
</dl>













<h5>Returns:</h5>

        
<div class="param-desc">
    Bytes array
</div>



<dl>
    <dt>
        Type
    </dt>
    <dd>
        
<span class="param-type">Array</span>


    </dd>
</dl>

    


    <h5>Example</h5>
    
    <pre class="prettyprint"><code>hash.array();</code></pre>



        
            

    

    <h4 class="name" id="arrayBuffer"><span class="type-signature"></span>arrayBuffer<span class="signature">()</span><span class="type-signature"> &rarr; {ArrayBuffer}</span></h4>

    



<div class="description">
    Output hash as ArrayBuffer
</div>













<dl class="details">

    

    

    

    

    

    

    

    

    

    

    

    

    
    <dt class="tag-source">Source:</dt>
    <dd class="tag-source"><ul class="dummy"><li>
        <a href="md4.js.html">md4.js</a>, <a href="md4.js.html#line510">line 510</a>
    </li></ul></dd>
    

    

    
    <dt class="tag-see">See:</dt>
    <dd class="tag-see">
        <ul>
            <li>md4.arrayBuffer</li>
        </ul>
    </dd>
    

    
</dl>













<h5>Returns:</h5>

        
<div class="param-desc">
    ArrayBuffer
</div>



<dl>
    <dt>
        Type
    </dt>
    <dd>
        
<span class="param-type">ArrayBuffer</span>


    </dd>
</dl>

    


    <h5>Example</h5>
    
    <pre class="prettyprint"><code>hash.arrayBuffer();</code></pre>



        
            

    

    <h4 class="name" id="buffer"><span class="type-signature"></span>buffer<span class="signature">()</span><span class="type-signature"> &rarr; {ArrayBuffer}</span></h4>

    



<div class="description">
    Output hash as ArrayBuffer
</div>













<dl class="details">

    

    

    

    

    

    

    

    
        <dt class="important tag-deprecated">Deprecated:</dt><dd><ul class="dummy"><li>This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.</li></ul></dd>
    

    

    

    

    

    
    <dt class="tag-source">Source:</dt>
    <dd class="tag-source"><ul class="dummy"><li>
        <a href="md4.js.html">md4.js</a>, <a href="md4.js.html#line532">line 532</a>
    </li></ul></dd>
    

    

    
    <dt class="tag-see">See:</dt>
    <dd class="tag-see">
        <ul>
            <li><a href="md4.html#.buffer">md4.buffer</a></li>
        </ul>
    </dd>
    

    
</dl>













<h5>Returns:</h5>

        
<div class="param-desc">
    ArrayBuffer
</div>



<dl>
    <dt>
        Type
    </dt>
    <dd>
        
<span class="param-type">ArrayBuffer</span>


    </dd>
</dl>

    


    <h5>Example</h5>
    
    <pre class="prettyprint"><code>hash.buffer();</code></pre>



        
            

    

    <h4 class="name" id="digest"><span class="type-signature"></span>digest<span class="signature">()</span><span class="type-signature"> &rarr; {Array}</span></h4>

    



<div class="description">
    Output hash as bytes array
</div>













<dl class="details">

    

    

    

    

    

    

    

    

    

    

    

    

    
    <dt class="tag-source">Source:</dt>
    <dd class="tag-source"><ul class="dummy"><li>
        <a href="md4.js.html">md4.js</a>, <a href="md4.js.html#line476">line 476</a>
    </li></ul></dd>
    

    

    
    <dt class="tag-see">See:</dt>
    <dd class="tag-see">
        <ul>
            <li><a href="md4.html#.digest">md4.digest</a></li>
        </ul>
    </dd>
    

    
</dl>













<h5>Returns:</h5>

        
<div class="param-desc">
    Bytes array
</div>



<dl>
    <dt>
        Type
    </dt>
    <dd>
        
<span class="param-type">Array</span>


    </dd>
</dl>

    


    <h5>Example</h5>
    
    <pre class="prettyprint"><code>hash.digest();</code></pre>



        
            

    

    <h4 class="name" id="hex"><span class="type-signature"></span>hex<span class="signature">()</span><span class="type-signature"> &rarr; {String}</span></h4>

    



<div class="description">
    Output hash as hex string
</div>













<dl class="details">

    

    

    

    

    

    

    

    

    

    

    

    

    
    <dt class="tag-source">Source:</dt>
    <dd class="tag-source"><ul class="dummy"><li>
        <a href="md4.js.html">md4.js</a>, <a href="md4.js.html#line431">line 431</a>
    </li></ul></dd>
    

    

    
    <dt class="tag-see">See:</dt>
    <dd class="tag-see">
        <ul>
            <li><a href="md4.html#.hex">md4.hex</a></li>
        </ul>
    </dd>
    

    
</dl>













<h5>Returns:</h5>

        
<div class="param-desc">
    Hex string
</div>



<dl>
    <dt>
        Type
    </dt>
    <dd>
        
<span class="param-type">String</span>


    </dd>
</dl>

    


    <h5>Example</h5>
    
    <pre class="prettyprint"><code>hash.hex();</code></pre>



        
            

    

    <h4 class="name" id="toString"><span class="type-signature"></span>toString<span class="signature">()</span><span class="type-signature"> &rarr; {String}</span></h4>

    



<div class="description">
    Output hash as hex string
</div>













<dl class="details">

    

    

    

    

    

    

    

    

    

    

    

    

    
    <dt class="tag-source">Source:</dt>
    <dd class="tag-source"><ul class="dummy"><li>
        <a href="md4.js.html">md4.js</a>, <a href="md4.js.html#line464">line 464</a>
    </li></ul></dd>
    

    

    
    <dt class="tag-see">See:</dt>
    <dd class="tag-see">
        <ul>
            <li><a href="md4.html#.hex">md4.hex</a></li>
        </ul>
    </dd>
    

    
</dl>













<h5>Returns:</h5>

        
<div class="param-desc">
    Hex string
</div>



<dl>
    <dt>
        Type
    </dt>
    <dd>
        
<span class="param-type">String</span>


    </dd>
</dl>

    


    <h5>Example</h5>
    
    <pre class="prettyprint"><code>hash.toString();</code></pre>



        
            

    

    <h4 class="name" id="update"><span class="type-signature"></span>update<span class="signature">(message)</span><span class="type-signature"> &rarr; {<a href="Md4_.html">Md4</a>}</span></h4>

    



<div class="description">
    Update hash
</div>









    <h5>Parameters:</h5>
    

<table class="params">
    <thead>
    <tr>
        
        <th>Name</th>
        

        <th>Type</th>

        

        

        <th class="last">Description</th>
    </tr>
    </thead>

    <tbody>
    

        <tr>
            
                <td class="name"><code>message</code></td>
            

            <td class="type">
            
                
<span class="param-type">String</span>
|

<span class="param-type">Array</span>
|

<span class="param-type">Uint8Array</span>
|

<span class="param-type">ArrayBuffer</span>


            
            </td>

            

            

            <td class="description last">message to hash</td>
        </tr>

    
    </tbody>
</table>






<dl class="details">

    

    

    

    

    

    

    

    

    

    

    

    

    
    <dt class="tag-source">Source:</dt>
    <dd class="tag-source"><ul class="dummy"><li>
        <a href="md4.js.html">md4.js</a>, <a href="md4.js.html#line160">line 160</a>
    </li></ul></dd>
    

    

    
    <dt class="tag-see">See:</dt>
    <dd class="tag-see">
        <ul>
            <li><a href="md4.html#.update">md4.update</a></li>
        </ul>
    </dd>
    

    
</dl>













<h5>Returns:</h5>

        
<div class="param-desc">
    MD4 object.
</div>



<dl>
    <dt>
        Type
    </dt>
    <dd>
        
<span class="param-type"><a href="Md4_.html">Md4</a></span>


    </dd>
</dl>

    



        
    

    

    
</article>

</section>




</div>

<nav>
    <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="Md4_.html">Md4</a></li></ul><h3>Namespaces</h3><ul><li><a href="md4.html">md4</a></li></ul><h3>Global</h3><ul><li><a href="global.html#md4%2508">md4</a></li></ul>
</nav>

<br class="clear">

<footer>
    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Jan 24 2017 15:15:12 GMT+0800 (CST)
</footer>

<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html><!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>JSDoc: Global</title>

    <script src="scripts/prettify/prettify.js"> </script>
    <script src="scripts/prettify/lang-css.js"> </script>
    <!--[if lt IE 9]>
      <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
    <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
    <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>

<body>

<div id="main">

    <h1 class="page-title">Global</h1>

    




<section>

<header>
    
        <h2></h2>
        
    
</header>

<article>
    <div class="container-overview">
    
        

        


<dl class="details">

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    
</dl>


        
    
    </div>

    

    

    

     

    

    

    
        <h3 class="subsection-title">Methods</h3>

        
            

    

    <h4 class="name" id="md4%08"><span class="type-signature"></span>md4<span class="signature">(message)</span><span class="type-signature"> &rarr; {String}</span></h4>

    



<div class="description">
    MD4 hash function, export to global in browsers.
</div>









    <h5>Parameters:</h5>
    

<table class="params">
    <thead>
    <tr>
        
        <th>Name</th>
        

        <th>Type</th>

        

        

        <th class="last">Description</th>
    </tr>
    </thead>

    <tbody>
    

        <tr>
            
                <td class="name"><code>message</code></td>
            

            <td class="type">
            
                
<span class="param-type">String</span>
|

<span class="param-type">Array</span>
|

<span class="param-type">Uint8Array</span>
|

<span class="param-type">ArrayBuffer</span>


            
            </td>

            

            

            <td class="description last">message to hash</td>
        </tr>

    
    </tbody>
</table>






<dl class="details">

    

    

    

    

    

    

    

    

    

    

    

    

    
    <dt class="tag-source">Source:</dt>
    <dd class="tag-source"><ul class="dummy"><li>
        <a href="md4.js.html">md4.js</a>, <a href="md4.js.html#line550">line 550</a>
    </li></ul></dd>
    

    

    

    
</dl>













<h5>Returns:</h5>

        
<div class="param-desc">
    md4 hashes
</div>



<dl>
    <dt>
        Type
    </dt>
    <dd>
        
<span class="param-type">String</span>


    </dd>
</dl>

    


    <h5>Example</h5>
    
    <pre class="prettyprint"><code>md4(''); // 31d6cfe0d16ae931b73c59d7e0c089c0md4('The quick brown fox jumps over the lazy dog'); // 1bee69a46ba811185c194762abaeae90md4('The quick brown fox jumps over the lazy dog.'); // 2812c6c7136898c51f6f6739ad08750e// It also supports UTF-8 encodingmd4('中文'); // 223088bf7bd45a16436b15360c5fc5a0// It also supports byte `Array`, `Uint8Array`, `ArrayBuffer`md4([]); // 31d6cfe0d16ae931b73c59d7e0c089c0md4(new Uint8Array([])); // 31d6cfe0d16ae931b73c59d7e0c089c0</code></pre>



        
    

    

    
</article>

</section>




</div>

<nav>
    <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="Md4_.html">Md4</a></li></ul><h3>Namespaces</h3><ul><li><a href="md4.html">md4</a></li></ul><h3>Global</h3><ul><li><a href="global.html#md4%2508">md4</a></li></ul>
</nav>

<br class="clear">

<footer>
    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Jan 24 2017 15:15:12 GMT+0800 (CST)
</footer>

<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html><!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>JSDoc: Home</title>

    <script src="scripts/prettify/prettify.js"> </script>
    <script src="scripts/prettify/lang-css.js"> </script>
    <!--[if lt IE 9]>
      <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
    <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
    <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>

<body>

<div id="main">

    <h1 class="page-title">Home</h1>

    



    


    <h3> </h3>










    




    <section>
        <article><h1>js-md4</h1><p><a href="https://travis-ci.org/emn178/js-md4"><img src="https://travis-ci.org/emn178/js-md4.svg?branch=master" alt="Build Status"></a>
<a href="https://coveralls.io/r/emn178/js-md4?branch=master"><img src="https://coveralls.io/repos/emn178/js-md4/badge.svg?branch=master" alt="Coverage Status"></a><br><a href="https://nodei.co/npm/js-md4/"><img src="https://nodei.co/npm/js-md4.png?stars&amp;downloads" alt="NPM"></a><br>A simple MD4 hash function for JavaScript supports UTF-8 encoding.</p>
<h2>Demo</h2><p><a href="http://emn178.github.io/online-tools/md4.html">MD4 Online</a>  </p>
<h2>Download</h2><p><a href="https://raw.github.com/emn178/js-md4/master/build/md4.min.js">Compress</a><br><a href="https://raw.github.com/emn178/js-md4/master/src/md4.js">Uncompress</a></p>
<h2>Installation</h2><p>You can also install js-md4 by using Bower.</p>
<pre class="prettyprint source"><code>bower install js-md4</code></pre><p>For node.js, you can use this command to install:</p>
<pre class="prettyprint source"><code>npm install js-md4</code></pre><h2>Notice</h2><p><code>buffer</code> method is deprecated. This maybe confuse with Buffer in node.js. Please use <code>arrayBuffer</code> instead.</p>
<h2>Usage</h2><p>You could use like this:</p>
<pre class="prettyprint source lang-JavaScript"><code>md4('Message to hash');

var hash = md4.create();
hash.update('Message to hash');
hash.hex();

var hash2 = md4.update('Message to hash');
hash2.update('Message2 to hash');
hash2.array();</code></pre><p>If you use node.js, you should require the module first:</p>
<pre class="prettyprint source lang-JavaScript"><code>var md4 = require('js-md4');</code></pre><p>It supports AMD:</p>
<pre class="prettyprint source lang-JavaScript"><code>require(['your/path/md4.js'], function (md4) {
// ...
});</code></pre><p><a href="https://emn178.github.com/js-md4/doc/">See document</a></p>
<h2>Example</h2><pre class="prettyprint source lang-JavaScript"><code>md4(''); // 31d6cfe0d16ae931b73c59d7e0c089c0
md4('The quick brown fox jumps over the lazy dog'); // 1bee69a46ba811185c194762abaeae90
md4('The quick brown fox jumps over the lazy dog.'); // 2812c6c7136898c51f6f6739ad08750e

// It also supports UTF-8 encoding
md4('中文'); // 223088bf7bd45a16436b15360c5fc5a0

// It also supports byte `Array`, `Uint8Array`, `ArrayBuffer`
md4([]); // 31d6cfe0d16ae931b73c59d7e0c089c0
md4(new Uint8Array([])); // 31d6cfe0d16ae931b73c59d7e0c089c0

// Different output
md4(''); // 31d6cfe0d16ae931b73c59d7e0c089c0
md4.hex(''); // 31d6cfe0d16ae931b73c59d7e0c089c0
md4.array(''); // [49, 214, 207, 224, 209, 106, 233, 49, 183, 60, 89, 215, 224, 192, 137, 192]
md4.digest(''); // [49, 214, 207, 224, 209, 106, 233, 49, 183, 60, 89, 215, 224, 192, 137, 192]
md4.arrayBuffer(''); // ArrayBuffer</code></pre><h2>License</h2><p>The project is released under the <a href="http://www.opensource.org/licenses/MIT">MIT license</a>.</p>
<h2>Contact</h2><p>The project's website is located at https://github.com/emn178/js-md4<br>Author: Chen, Yi-Cyuan (emn178@gmail.com)</p></article>
    </section>






</div>

<nav>
    <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="Md4_.html">Md4</a></li></ul><h3>Namespaces</h3><ul><li><a href="md4.html">md4</a></li></ul><h3>Global</h3><ul><li><a href="global.html#md4%2508">md4</a></li></ul>
</nav>

<br class="clear">

<footer>
    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Jan 24 2017 15:15:12 GMT+0800 (CST)
</footer>

<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html><!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>JSDoc: Namespace: md4</title>

    <script src="scripts/prettify/prettify.js"> </script>
    <script src="scripts/prettify/lang-css.js"> </script>
    <!--[if lt IE 9]>
      <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
    <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
    <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>

<body>

<div id="main">

    <h1 class="page-title">Namespace: md4</h1>

    




<section>

<header>
    
        <h2>md4</h2>
        
    
</header>

<article>
    <div class="container-overview">
    
        
            <div class="description"><a href="https://github.com/emn178/js-md4">js-md4</a></div>
        

        


<dl class="details">

    
    <dt class="tag-version">Version:</dt>
    <dd class="tag-version"><ul class="dummy"><li>0.3.2</li></ul></dd>
    

    

    

    

    

    

    

    

    
    <dt class="tag-author">Author:</dt>
    <dd class="tag-author">
        <ul>
            <li>Yi-Cyuan Chen [emn178@gmail.com]</li>
        </ul>
    </dd>
    

    
    <dt class="tag-copyright">Copyright:</dt>
    <dd class="tag-copyright"><ul class="dummy"><li>Yi-Cyuan Chen 2015-2027</li></ul></dd>
    

    
    <dt class="tag-license">License:</dt>
    <dd class="tag-license"><ul class="dummy"><li>MIT</li></ul></dd>
    

    

    
    <dt class="tag-source">Source:</dt>
    <dd class="tag-source"><ul class="dummy"><li>
        <a href="md4.js.html">md4.js</a>, <a href="md4.js.html#line1">line 1</a>
    </li></ul></dd>
    

    

    

    
</dl>


        
    
    </div>

    

    

    

     

    

    

    
        <h3 class="subsection-title">Methods</h3>

        
            

    

    <h4 class="name" id=".array"><span class="type-signature">(static) </span>array<span class="signature">(message)</span><span class="type-signature"> &rarr; {Array}</span></h4>

    



<div class="description">
    Output hash as bytes array
</div>









    <h5>Parameters:</h5>
    

<table class="params">
    <thead>
    <tr>
        
        <th>Name</th>
        

        <th>Type</th>

        

        

        <th class="last">Description</th>
    </tr>
    </thead>

    <tbody>
    

        <tr>
            
                <td class="name"><code>message</code></td>
            

            <td class="type">
            
                
<span class="param-type">String</span>
|

<span class="param-type">Array</span>
|

<span class="param-type">Uint8Array</span>
|

<span class="param-type">ArrayBuffer</span>


            
            </td>

            

            

            <td class="description last">message to hash</td>
        </tr>

    
    </tbody>
</table>






<dl class="details">

    

    

    

    

    

    

    

    

    

    

    

    

    
    <dt class="tag-source">Source:</dt>
    <dd class="tag-source"><ul class="dummy"><li>
        <a href="md4.js.html">md4.js</a>, <a href="md4.js.html#line54">line 54</a>
    </li></ul></dd>
    

    

    

    
</dl>













<h5>Returns:</h5>

        
<div class="param-desc">
    Bytes array
</div>



<dl>
    <dt>
        Type
    </dt>
    <dd>
        
<span class="param-type">Array</span>


    </dd>
</dl>

    


    <h5>Example</h5>
    
    <pre class="prettyprint"><code>md4.array('The quick brown fox jumps over the lazy dog');</code></pre>



        
            

    

    <h4 class="name" id=".buffer"><span class="type-signature">(static) </span>buffer<span class="signature">(message)</span><span class="type-signature"> &rarr; {ArrayBuffer}</span></h4>

    



<div class="description">
    Output hash as ArrayBuffer
</div>









    <h5>Parameters:</h5>
    

<table class="params">
    <thead>
    <tr>
        
        <th>Name</th>
        

        <th>Type</th>

        

        

        <th class="last">Description</th>
    </tr>
    </thead>

    <tbody>
    

        <tr>
            
                <td class="name"><code>message</code></td>
            

            <td class="type">
            
                
<span class="param-type">String</span>
|

<span class="param-type">Array</span>
|

<span class="param-type">Uint8Array</span>
|

<span class="param-type">ArrayBuffer</span>


            
            </td>

            

            

            <td class="description last">message to hash</td>
        </tr>

    
    </tbody>
</table>






<dl class="details">

    

    

    

    

    

    

    

    

    

    

    

    

    
    <dt class="tag-source">Source:</dt>
    <dd class="tag-source"><ul class="dummy"><li>
        <a href="md4.js.html">md4.js</a>, <a href="md4.js.html#line63">line 63</a>
    </li></ul></dd>
    

    

    

    
</dl>













<h5>Returns:</h5>

        
<div class="param-desc">
    ArrayBuffer
</div>



<dl>
    <dt>
        Type
    </dt>
    <dd>
        
<span class="param-type">ArrayBuffer</span>


    </dd>
</dl>

    


    <h5>Example</h5>
    
    <pre class="prettyprint"><code>md4.buffer('The quick brown fox jumps over the lazy dog');</code></pre>



        
            

    

    <h4 class="name" id=".create"><span class="type-signature">(static) </span>create<span class="signature">()</span><span class="type-signature"> &rarr; {<a href="Md4_.html">Md4</a>}</span></h4>

    



<div class="description">
    Create Md4 object
</div>













<dl class="details">

    

    

    

    

    

    

    

    

    

    

    

    

    
    <dt class="tag-source">Source:</dt>
    <dd class="tag-source"><ul class="dummy"><li>
        <a href="md4.js.html">md4.js</a>, <a href="md4.js.html#line78">line 78</a>
    </li></ul></dd>
    

    

    

    
</dl>













<h5>Returns:</h5>

        
<div class="param-desc">
    MD4 object.
</div>



<dl>
    <dt>
        Type
    </dt>
    <dd>
        
<span class="param-type"><a href="Md4_.html">Md4</a></span>


    </dd>
</dl>

    


    <h5>Example</h5>
    
    <pre class="prettyprint"><code>var hash = md4.create();</code></pre>



        
            

    

    <h4 class="name" id=".digest"><span class="type-signature">(static) </span>digest<span class="signature">(message)</span><span class="type-signature"> &rarr; {Array}</span></h4>

    



<div class="description">
    Output hash as bytes array
</div>









    <h5>Parameters:</h5>
    

<table class="params">
    <thead>
    <tr>
        
        <th>Name</th>
        

        <th>Type</th>

        

        

        <th class="last">Description</th>
    </tr>
    </thead>

    <tbody>
    

        <tr>
            
                <td class="name"><code>message</code></td>
            

            <td class="type">
            
                
<span class="param-type">String</span>
|

<span class="param-type">Array</span>
|

<span class="param-type">Uint8Array</span>
|

<span class="param-type">ArrayBuffer</span>


            
            </td>

            

            

            <td class="description last">message to hash</td>
        </tr>

    
    </tbody>
</table>






<dl class="details">

    

    

    

    

    

    

    

    

    

    

    

    

    
    <dt class="tag-source">Source:</dt>
    <dd class="tag-source"><ul class="dummy"><li>
        <a href="md4.js.html">md4.js</a>, <a href="md4.js.html#line45">line 45</a>
    </li></ul></dd>
    

    

    

    
</dl>













<h5>Returns:</h5>

        
<div class="param-desc">
    Bytes array
</div>



<dl>
    <dt>
        Type
    </dt>
    <dd>
        
<span class="param-type">Array</span>


    </dd>
</dl>

    


    <h5>Example</h5>
    
    <pre class="prettyprint"><code>md4.digest('The quick brown fox jumps over the lazy dog');</code></pre>



        
            

    

    <h4 class="name" id=".hex"><span class="type-signature">(static) </span>hex<span class="signature">(message)</span><span class="type-signature"> &rarr; {String}</span></h4>

    



<div class="description">
    Output hash as hex string
</div>









    <h5>Parameters:</h5>
    

<table class="params">
    <thead>
    <tr>
        
        <th>Name</th>
        

        <th>Type</th>

        

        

        <th class="last">Description</th>
    </tr>
    </thead>

    <tbody>
    

        <tr>
            
                <td class="name"><code>message</code></td>
            

            <td class="type">
            
                
<span class="param-type">String</span>
|

<span class="param-type">Array</span>
|

<span class="param-type">Uint8Array</span>
|

<span class="param-type">ArrayBuffer</span>


            
            </td>

            

            

            <td class="description last">message to hash</td>
        </tr>

    
    </tbody>
</table>






<dl class="details">

    

    

    

    

    

    

    

    

    

    

    

    

    
    <dt class="tag-source">Source:</dt>
    <dd class="tag-source"><ul class="dummy"><li>
        <a href="md4.js.html">md4.js</a>, <a href="md4.js.html#line34">line 34</a>
    </li></ul></dd>
    

    

    

    
</dl>













<h5>Returns:</h5>

        
<div class="param-desc">
    Hex string
</div>



<dl>
    <dt>
        Type
    </dt>
    <dd>
        
<span class="param-type">String</span>


    </dd>
</dl>

    


    <h5>Example</h5>
    
    <pre class="prettyprint"><code>md4.hex('The quick brown fox jumps over the lazy dog');// equal tomd4('The quick brown fox jumps over the lazy dog');</code></pre>



        
            

    

    <h4 class="name" id=".update"><span class="type-signature">(static) </span>update<span class="signature">(message)</span><span class="type-signature"> &rarr; {<a href="Md4_.html">Md4</a>}</span></h4>

    



<div class="description">
    Create and update Md4 object
</div>









    <h5>Parameters:</h5>
    

<table class="params">
    <thead>
    <tr>
        
        <th>Name</th>
        

        <th>Type</th>

        

        

        <th class="last">Description</th>
    </tr>
    </thead>

    <tbody>
    

        <tr>
            
                <td class="name"><code>message</code></td>
            

            <td class="type">
            
                
<span class="param-type">String</span>
|

<span class="param-type">Array</span>
|

<span class="param-type">Uint8Array</span>
|

<span class="param-type">ArrayBuffer</span>


            
            </td>

            

            

            <td class="description last">message to hash</td>
        </tr>

    
    </tbody>
</table>






<dl class="details">

    

    

    

    

    

    

    

    

    

    

    

    

    
    <dt class="tag-source">Source:</dt>
    <dd class="tag-source"><ul class="dummy"><li>
        <a href="md4.js.html">md4.js</a>, <a href="md4.js.html#line86">line 86</a>
    </li></ul></dd>
    

    

    

    
</dl>













<h5>Returns:</h5>

        
<div class="param-desc">
    MD4 object.
</div>



<dl>
    <dt>
        Type
    </dt>
    <dd>
        
<span class="param-type"><a href="Md4_.html">Md4</a></span>


    </dd>
</dl>

    


    <h5>Example</h5>
    
    <pre class="prettyprint"><code>var hash = md4.update('The quick brown fox jumps over the lazy dog');// equal tovar hash = md4.create();hash.update('The quick brown fox jumps over the lazy dog');</code></pre>



        
    

    

    
</article>

</section>




</div>

<nav>
    <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="Md4_.html">Md4</a></li></ul><h3>Namespaces</h3><ul><li><a href="md4.html">md4</a></li></ul><h3>Global</h3><ul><li><a href="global.html#md4%2508">md4</a></li></ul>
</nav>

<br class="clear">

<footer>
    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Jan 24 2017 15:15:12 GMT+0800 (CST)
</footer>

<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html><!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>JSDoc: Source: md4.js</title>

    <script src="scripts/prettify/prettify.js"> </script>
    <script src="scripts/prettify/lang-css.js"> </script>
    <!--[if lt IE 9]>
      <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
    <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
    <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>

<body>

<div id="main">

    <h1 class="page-title">Source: md4.js</h1>

    



    
    <section>
        <article>
            <pre class="prettyprint source linenums"><code>/**
 * [js-md4]{@link https://github.com/emn178/js-md4}
 *
 * @namespace md4
 * @version 0.3.2
 * @author Yi-Cyuan Chen [emn178@gmail.com]
 * @copyright Yi-Cyuan Chen 2015-2027
 * @license MIT
 */
/*jslint bitwise: true */
(function () {
  'use strict';

  var root = typeof window === 'object' ? window : {};
  var NODE_JS = !root.JS_MD4_NO_NODE_JS &amp;&amp; typeof process === 'object' &amp;&amp; process.versions &amp;&amp; process.versions.node;
  if (NODE_JS) {
    root = global;
  }
  var COMMON_JS = !root.JS_MD4_NO_COMMON_JS &amp;&amp; typeof module === 'object' &amp;&amp; module.exports;
  var AMD = typeof define === 'function' &amp;&amp; define.amd;
  var ARRAY_BUFFER = !root.JS_MD4_NO_ARRAY_BUFFER &amp;&amp; typeof ArrayBuffer !== 'undefined';
  var HEX_CHARS = '0123456789abcdef'.split('');
  var EXTRA = [128, 32768, 8388608, -2147483648];
  var SHIFT = [0, 8, 16, 24];
  var OUTPUT_TYPES = ['hex', 'array', 'digest', 'buffer', 'arrayBuffer'];

  var blocks = [], buffer8;
  if (ARRAY_BUFFER) {
    var buffer = new ArrayBuffer(68);
    buffer8 = new Uint8Array(buffer);
    blocks = new Uint32Array(buffer);
  }

  /**
   * @method hex
   * @memberof md4
   * @description Output hash as hex string
   * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
   * @returns {String} Hex string
   * @example
   * md4.hex('The quick brown fox jumps over the lazy dog');
   * // equal to
   * md4('The quick brown fox jumps over the lazy dog');
   */
  /**
   * @method digest
   * @memberof md4
   * @description Output hash as bytes array
   * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
   * @returns {Array} Bytes array
   * @example
   * md4.digest('The quick brown fox jumps over the lazy dog');
   */
  /**
   * @method array
   * @memberof md4
   * @description Output hash as bytes array
   * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
   * @returns {Array} Bytes array
   * @example
   * md4.array('The quick brown fox jumps over the lazy dog');
   */
  /**
   * @method buffer
   * @memberof md4
   * @description Output hash as ArrayBuffer
   * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
   * @returns {ArrayBuffer} ArrayBuffer
   * @example
   * md4.buffer('The quick brown fox jumps over the lazy dog');
   */
  var createOutputMethod = function (outputType) {
    return function(message) {
      return new Md4(true).update(message)[outputType]();
    }
  };

  /**
   * @method create
   * @memberof md4
   * @description Create Md4 object
   * @returns {Md4} MD4 object.
   * @example
   * var hash = md4.create();
   */
  /**
   * @method update
   * @memberof md4
   * @description Create and update Md4 object
   * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
   * @returns {Md4} MD4 object.
   * @example
   * var hash = md4.update('The quick brown fox jumps over the lazy dog');
   * // equal to
   * var hash = md4.create();
   * hash.update('The quick brown fox jumps over the lazy dog');
   */
  var createMethod = function () {
    var method = createOutputMethod('hex');
    if (NODE_JS) {
      method = nodeWrap(method);
    }
    method.create = function () {
      return new Md4();
    };
    method.update = function (message) {
      return method.create().update(message);
    };
    for (var i = 0; i &lt; OUTPUT_TYPES.length; ++i) {
      var type = OUTPUT_TYPES[i];
      method[type] = createOutputMethod(type);
    }
    return method;
  };

  var nodeWrap = function (method) {
    var crypto = require('crypto');
    var Buffer = require('buffer').Buffer;
    var nodeMethod = function (message) {
      if (typeof message === 'string') {
        return crypto.createHash('md4').update(message, 'utf8').digest('hex');
      } else if (ARRAY_BUFFER &amp;&amp; message instanceof ArrayBuffer) {
        message = new Uint8Array(message);
      } else if (message.length === undefined) {
        return method(message);
      }
      return crypto.createHash('md4').update(new Buffer(message)).digest('hex');
    };
    return nodeMethod;
  };

  /**
   * Md4 class
   * @class Md4
   * @description This is internal class.
   * @see {@link md4.create}
   */
  function Md4(sharedMemory) {
    if (sharedMemory) {
      blocks[0] = blocks[16] = blocks[1] = blocks[2] = blocks[3] =
      blocks[4] = blocks[5] = blocks[6] = blocks[7] =
      blocks[8] = blocks[9] = blocks[10] = blocks[11] =
      blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
      this.blocks = blocks;
      this.buffer8 = buffer8;
    } else {
      if (ARRAY_BUFFER) {
        var buffer = new ArrayBuffer(68);
        this.buffer8 = new Uint8Array(buffer);
        this.blocks = new Uint32Array(buffer);
      } else {
        this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
      }
    }
    this.h0 = this.h1 = this.h2 = this.h3 = this.start = this.bytes = 0;
    this.finalized = this.hashed = false;
    this.first = true;
  }

  /**
   * @method update
   * @memberof Md4
   * @instance
   * @description Update hash
   * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
   * @returns {Md4} MD4 object.
   * @see {@link md4.update}
   */
  Md4.prototype.update = function (message) {
    if (this.finalized) {
      return;
    }
    var notString = typeof message !== 'string';
    if (notString &amp;&amp; ARRAY_BUFFER &amp;&amp; message instanceof ArrayBuffer) {
      message = new Uint8Array(message);
    }
    var code, index = 0, i, length = message.length || 0, blocks = this.blocks;
    var buffer8 = this.buffer8;

    while (index &lt; length) {
      if (this.hashed) {
        this.hashed = false;
        blocks[0] = blocks[16];
        blocks[16] = blocks[1] = blocks[2] = blocks[3] =
        blocks[4] = blocks[5] = blocks[6] = blocks[7] =
        blocks[8] = blocks[9] = blocks[10] = blocks[11] =
        blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
      }

      if (notString) {
        if (ARRAY_BUFFER) {
          for (i = this.start; index &lt; length &amp;&amp; i &lt; 64; ++index) {
            buffer8[i++] = message[index];
          }
        } else {
          for (i = this.start; index &lt; length &amp;&amp; i &lt; 64; ++index) {
            blocks[i >> 2] |= message[index] &lt;&lt; SHIFT[i++ &amp; 3];
          }
        }
      } else {
        if (ARRAY_BUFFER) {
          for (i = this.start; index &lt; length &amp;&amp; i &lt; 64; ++index) {
            code = message.charCodeAt(index);
            if (code &lt; 0x80) {
              buffer8[i++] = code;
            } else if (code &lt; 0x800) {
              buffer8[i++] = 0xc0 | (code >> 6);
              buffer8[i++] = 0x80 | (code &amp; 0x3f);
            } else if (code &lt; 0xd800 || code >= 0xe000) {
              buffer8[i++] = 0xe0 | (code >> 12);
              buffer8[i++] = 0x80 | ((code >> 6) &amp; 0x3f);
              buffer8[i++] = 0x80 | (code &amp; 0x3f);
            } else {
              code = 0x10000 + (((code &amp; 0x3ff) &lt;&lt; 10) | (message.charCodeAt(++index) &amp; 0x3ff));
              buffer8[i++] = 0xf0 | (code >> 18);
              buffer8[i++] = 0x80 | ((code >> 12) &amp; 0x3f);
              buffer8[i++] = 0x80 | ((code >> 6) &amp; 0x3f);
              buffer8[i++] = 0x80 | (code &amp; 0x3f);
            }
          }
        } else {
          for (i = this.start; index &lt; length &amp;&amp; i &lt; 64; ++index) {
            code = message.charCodeAt(index);
            if (code &lt; 0x80) {
              blocks[i >> 2] |= code &lt;&lt; SHIFT[i++ &amp; 3];
            } else if (code &lt; 0x800) {
              blocks[i >> 2] |= (0xc0 | (code >> 6)) &lt;&lt; SHIFT[i++ &amp; 3];
              blocks[i >> 2] |= (0x80 | (code &amp; 0x3f)) &lt;&lt; SHIFT[i++ &amp; 3];
            } else if (code &lt; 0xd800 || code >= 0xe000) {
              blocks[i >> 2] |= (0xe0 | (code >> 12)) &lt;&lt; SHIFT[i++ &amp; 3];
              blocks[i >> 2] |= (0x80 | ((code >> 6) &amp; 0x3f)) &lt;&lt; SHIFT[i++ &amp; 3];
              blocks[i >> 2] |= (0x80 | (code &amp; 0x3f)) &lt;&lt; SHIFT[i++ &amp; 3];
            } else {
              code = 0x10000 + (((code &amp; 0x3ff) &lt;&lt; 10) | (message.charCodeAt(++index) &amp; 0x3ff));
              blocks[i >> 2] |= (0xf0 | (code >> 18)) &lt;&lt; SHIFT[i++ &amp; 3];
              blocks[i >> 2] |= (0x80 | ((code >> 12) &amp; 0x3f)) &lt;&lt; SHIFT[i++ &amp; 3];
              blocks[i >> 2] |= (0x80 | ((code >> 6) &amp; 0x3f)) &lt;&lt; SHIFT[i++ &amp; 3];
              blocks[i >> 2] |= (0x80 | (code &amp; 0x3f)) &lt;&lt; SHIFT[i++ &amp; 3];
            }
          }
        }
      }
      this.lastByteIndex = i;
      this.bytes += i - this.start;
      if (i >= 64) {
        this.start = i - 64;
        this.hash();
        this.hashed = true;
      } else {
        this.start = i;
      }
    }
    return this;
  };

  Md4.prototype.finalize = function () {
    if (this.finalized) {
      return;
    }
    this.finalized = true;
    var blocks = this.blocks, i = this.lastByteIndex;
    blocks[i >> 2] |= EXTRA[i &amp; 3];
    if (i >= 56) {
      if (!this.hashed) {
        this.hash();
      }
      blocks[0] = blocks[16];
      blocks[16] = blocks[1] = blocks[2] = blocks[3] =
      blocks[4] = blocks[5] = blocks[6] = blocks[7] =
      blocks[8] = blocks[9] = blocks[10] = blocks[11] =
      blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
    }
    blocks[14] = this.bytes &lt;&lt; 3;
    this.hash();
  };

  Md4.prototype.hash = function () {
    var a, b, c, d, ab, bc, cd, da, blocks = this.blocks;

    if (this.first) {
      a = blocks[0] - 1;
      a = (a &lt;&lt; 3) | (a >>> 29);
      d = ((a &amp; 0xefcdab89) | (~a &amp; 0x98badcfe)) + blocks[1] + 271733878;
      d = (d &lt;&lt; 7) | (d >>> 25);
      c = ((d &amp; a) | (~d &amp; 0xefcdab89)) + blocks[2] - 1732584194;
      c = (c &lt;&lt; 11) | (c >>> 21);
      b = ((c &amp; d) | (~c &amp; a)) + blocks[3] - 271733879;
      b = (b &lt;&lt; 19) | (b >>> 13);
    } else {
      a = this.h0;
      b = this.h1;
      c = this.h2;
      d = this.h3;
      a += ((b &amp; c) | (~b &amp; d)) + blocks[0];
      a = (a &lt;&lt; 3) | (a >>> 29);
      d += ((a &amp; b) | (~a &amp; c)) + blocks[1];
      d = (d &lt;&lt; 7) | (d >>> 25);
      c += ((d &amp; a) | (~d &amp; b)) + blocks[2];
      c = (c &lt;&lt; 11) | (c >>> 21);
      b += ((c &amp; d) | (~c &amp; a)) + blocks[3];
      b = (b &lt;&lt; 19) | (b >>> 13);
    }
    a += ((b &amp; c) | (~b &amp; d)) + blocks[4];
    a = (a &lt;&lt; 3) | (a >>> 29);
    d += ((a &amp; b) | (~a &amp; c)) + blocks[5];
    d = (d &lt;&lt; 7) | (d >>> 25);
    c += ((d &amp; a) | (~d &amp; b)) + blocks[6];
    c = (c &lt;&lt; 11) | (c >>> 21);
    b += ((c &amp; d) | (~c &amp; a)) + blocks[7];
    b = (b &lt;&lt; 19) | (b >>> 13);
    a += ((b &amp; c) | (~b &amp; d)) + blocks[8];
    a = (a &lt;&lt; 3) | (a >>> 29);
    d += ((a &amp; b) | (~a &amp; c)) + blocks[9];
    d = (d &lt;&lt; 7) | (d >>> 25);
    c += ((d &amp; a) | (~d &amp; b)) + blocks[10];
    c = (c &lt;&lt; 11) | (c >>> 21);
    b += ((c &amp; d) | (~c &amp; a)) + blocks[11];
    b = (b &lt;&lt; 19) | (b >>> 13);
    a += ((b &amp; c) | (~b &amp; d)) + blocks[12];
    a = (a &lt;&lt; 3) | (a >>> 29);
    d += ((a &amp; b) | (~a &amp; c)) + blocks[13];
    d = (d &lt;&lt; 7) | (d >>> 25);
    c += ((d &amp; a) | (~d &amp; b)) + blocks[14];
    c = (c &lt;&lt; 11) | (c >>> 21);
    b += ((c &amp; d) | (~c &amp; a)) + blocks[15];
    b = (b &lt;&lt; 19) | (b >>> 13);

    bc = b &amp; c;
    a += (bc | (b &amp; d) | (c &amp; d)) + blocks[0] + 1518500249;
    a = (a &lt;&lt; 3) | (a >>> 29);
    ab = a &amp; b;
    d += (ab | (a &amp; c) | bc) + blocks[4] + 1518500249;
    d = (d &lt;&lt; 5) | (d >>> 27);
    da = d &amp; a;
    c += (da | (d &amp; b) | ab) + blocks[8] + 1518500249;
    c = (c &lt;&lt; 9) | (c >>> 23);
    cd = c &amp; d;
    b += (cd | (c &amp; a) | da) + blocks[12] + 1518500249;
    b = (b &lt;&lt; 13) | (b >>> 19);
    bc = b &amp; c;
    a += (bc | (b &amp; d) | cd) + blocks[1] + 1518500249;
    a = (a &lt;&lt; 3) | (a >>> 29);
    ab = a &amp; b;
    d += (ab | (a &amp; c) | bc) + blocks[5] + 1518500249;
    d = (d &lt;&lt; 5) | (d >>> 27);
    da = d &amp; a;
    c += (da | (d &amp; b) | ab) + blocks[9] + 1518500249;
    c = (c &lt;&lt; 9) | (c >>> 23);
    cd = c &amp; d;
    b += (cd | (c &amp; a) | da) + blocks[13] + 1518500249;
    b = (b &lt;&lt; 13) | (b >>> 19);
    bc = b &amp; c;
    a += (bc | (b &amp; d) | cd) + blocks[2] + 1518500249;
    a = (a &lt;&lt; 3) | (a >>> 29);
    ab = a &amp; b;
    d += (ab | (a &amp; c) | bc) + blocks[6] + 1518500249;
    d = (d &lt;&lt; 5) | (d >>> 27);
    da = d &amp; a;
    c += (da | (d &amp; b) | ab) + blocks[10] + 1518500249;
    c = (c &lt;&lt; 9) | (c >>> 23);
    cd = c &amp; d;
    b += (cd | (c &amp; a) | da) + blocks[14] + 1518500249;
    b = (b &lt;&lt; 13) | (b >>> 19);
    bc = b &amp; c;
    a += (bc | (b &amp; d) | cd) + blocks[3] + 1518500249;
    a = (a &lt;&lt; 3) | (a >>> 29);
    ab = a &amp; b;
    d += (ab | (a &amp; c) | bc) + blocks[7] + 1518500249;
    d = (d &lt;&lt; 5) | (d >>> 27);
    da = d &amp; a;
    c += (da | (d &amp; b) | ab) + blocks[11] + 1518500249;
    c = (c &lt;&lt; 9) | (c >>> 23);
    b += ((c &amp; d) | (c &amp; a) | da) + blocks[15] + 1518500249;
    b = (b &lt;&lt; 13) | (b >>> 19);

    bc = b ^ c;
    a += (bc ^ d) + blocks[0] + 1859775393;
    a = (a &lt;&lt; 3) | (a >>> 29);
    d += (bc ^ a) + blocks[8] + 1859775393;
    d = (d &lt;&lt; 9) | (d >>> 23);
    da = d ^ a;
    c += (da ^ b) + blocks[4] + 1859775393;
    c = (c &lt;&lt; 11) | (c >>> 21);
    b += (da ^ c) + blocks[12] + 1859775393;
    b = (b &lt;&lt; 15) | (b >>> 17);
    bc = b ^ c;
    a += (bc ^ d) + blocks[2] + 1859775393;
    a = (a &lt;&lt; 3) | (a >>> 29);
    d += (bc ^ a) + blocks[10] + 1859775393;
    d = (d &lt;&lt; 9) | (d >>> 23);
    da = d ^ a;
    c += (da ^ b) + blocks[6] + 1859775393;
    c = (c &lt;&lt; 11) | (c >>> 21);
    b += (da ^ c) + blocks[14] + 1859775393;
    b = (b &lt;&lt; 15) | (b >>> 17);
    bc = b ^ c;
    a += (bc ^ d) + blocks[1] + 1859775393;
    a = (a &lt;&lt; 3) | (a >>> 29);
    d += (bc ^ a) + blocks[9] + 1859775393;
    d = (d &lt;&lt; 9) | (d >>> 23);
    da = d ^ a;
    c += (da ^ b) + blocks[5] + 1859775393;
    c = (c &lt;&lt; 11) | (c >>> 21);
    b += (da ^ c) + blocks[13] + 1859775393;
    b = (b &lt;&lt; 15) | (b >>> 17);
    bc = b ^ c;
    a += (bc ^ d) + blocks[3] + 1859775393;
    a = (a &lt;&lt; 3) | (a >>> 29);
    d += (bc ^ a) + blocks[11] + 1859775393;
    d = (d &lt;&lt; 9) | (d >>> 23);
    da = d ^ a;
    c += (da ^ b) + blocks[7] + 1859775393;
    c = (c &lt;&lt; 11) | (c >>> 21);
    b += (da ^ c) + blocks[15] + 1859775393;
    b = (b &lt;&lt; 15) | (b >>> 17);

    if (this.first) {
      this.h0 = a + 1732584193 &lt;&lt; 0;
      this.h1 = b - 271733879 &lt;&lt; 0;
      this.h2 = c - 1732584194 &lt;&lt; 0;
      this.h3 = d + 271733878 &lt;&lt; 0;
      this.first = false;
    } else {
      this.h0 = this.h0 + a &lt;&lt; 0;
      this.h1 = this.h1 + b &lt;&lt; 0;
      this.h2 = this.h2 + c &lt;&lt; 0;
      this.h3 = this.h3 + d &lt;&lt; 0;
    }
  };

  /**
   * @method hex
   * @memberof Md4
   * @instance
   * @description Output hash as hex string
   * @returns {String} Hex string
   * @see {@link md4.hex}
   * @example
   * hash.hex();
   */
  Md4.prototype.hex = function () {
    this.finalize();

    var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;

    return HEX_CHARS[(h0 >> 4) &amp; 0x0F] + HEX_CHARS[h0 &amp; 0x0F] +
      HEX_CHARS[(h0 >> 12) &amp; 0x0F] + HEX_CHARS[(h0 >> 8) &amp; 0x0F] +
      HEX_CHARS[(h0 >> 20) &amp; 0x0F] + HEX_CHARS[(h0 >> 16) &amp; 0x0F] +
      HEX_CHARS[(h0 >> 28) &amp; 0x0F] + HEX_CHARS[(h0 >> 24) &amp; 0x0F] +
      HEX_CHARS[(h1 >> 4) &amp; 0x0F] + HEX_CHARS[h1 &amp; 0x0F] +
      HEX_CHARS[(h1 >> 12) &amp; 0x0F] + HEX_CHARS[(h1 >> 8) &amp; 0x0F] +
      HEX_CHARS[(h1 >> 20) &amp; 0x0F] + HEX_CHARS[(h1 >> 16) &amp; 0x0F] +
      HEX_CHARS[(h1 >> 28) &amp; 0x0F] + HEX_CHARS[(h1 >> 24) &amp; 0x0F] +
      HEX_CHARS[(h2 >> 4) &amp; 0x0F] + HEX_CHARS[h2 &amp; 0x0F] +
      HEX_CHARS[(h2 >> 12) &amp; 0x0F] + HEX_CHARS[(h2 >> 8) &amp; 0x0F] +
      HEX_CHARS[(h2 >> 20) &amp; 0x0F] + HEX_CHARS[(h2 >> 16) &amp; 0x0F] +
      HEX_CHARS[(h2 >> 28) &amp; 0x0F] + HEX_CHARS[(h2 >> 24) &amp; 0x0F] +
      HEX_CHARS[(h3 >> 4) &amp; 0x0F] + HEX_CHARS[h3 &amp; 0x0F] +
      HEX_CHARS[(h3 >> 12) &amp; 0x0F] + HEX_CHARS[(h3 >> 8) &amp; 0x0F] +
      HEX_CHARS[(h3 >> 20) &amp; 0x0F] + HEX_CHARS[(h3 >> 16) &amp; 0x0F] +
      HEX_CHARS[(h3 >> 28) &amp; 0x0F] + HEX_CHARS[(h3 >> 24) &amp; 0x0F];
  };

  /**
   * @method toString
   * @memberof Md4
   * @instance
   * @description Output hash as hex string
   * @returns {String} Hex string
   * @see {@link md4.hex}
   * @example
   * hash.toString();
   */
  Md4.prototype.toString = Md4.prototype.hex;

  /**
   * @method digest
   * @memberof Md4
   * @instance
   * @description Output hash as bytes array
   * @returns {Array} Bytes array
   * @see {@link md4.digest}
   * @example
   * hash.digest();
   */
  Md4.prototype.digest = function() {
    this.finalize();

    var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
    return [
      h0 &amp; 0xFF, (h0 >> 8) &amp; 0xFF, (h0 >> 16) &amp; 0xFF, (h0 >> 24) &amp; 0xFF,
      h1 &amp; 0xFF, (h1 >> 8) &amp; 0xFF, (h1 >> 16) &amp; 0xFF, (h1 >> 24) &amp; 0xFF,
      h2 &amp; 0xFF, (h2 >> 8) &amp; 0xFF, (h2 >> 16) &amp; 0xFF, (h2 >> 24) &amp; 0xFF,
      h3 &amp; 0xFF, (h3 >> 8) &amp; 0xFF, (h3 >> 16) &amp; 0xFF, (h3 >> 24) &amp; 0xFF
    ];
  };

  /**
   * @method array
   * @memberof Md4
   * @instance
   * @description Output hash as bytes array
   * @returns {Array} Bytes array
   * @see {@link md4.array}
   * @example
   * hash.array();
   */
  Md4.prototype.array = Md4.prototype.digest;

  /**
   * @method arrayBuffer
   * @memberof Md4
   * @instance
   * @description Output hash as ArrayBuffer
   * @returns {ArrayBuffer} ArrayBuffer
   * @see {@link md4.arrayBuffer}
   * @example
   * hash.arrayBuffer();
   */
  Md4.prototype.arrayBuffer = function() {
    this.finalize();

    var buffer = new ArrayBuffer(16);
    var blocks = new Uint32Array(buffer);
    blocks[0] = this.h0;
    blocks[1] = this.h1;
    blocks[2] = this.h2;
    blocks[3] = this.h3;
    return buffer;
  };

  /**
   * @method buffer
   * @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
   * @memberof Md4
   * @instance
   * @description Output hash as ArrayBuffer
   * @returns {ArrayBuffer} ArrayBuffer
   * @see {@link md4.buffer}
   * @example
   * hash.buffer();
   */
  Md4.prototype.buffer = Md4.prototype.arrayBuffer;

  var exports = createMethod();

  if (COMMON_JS) {
    module.exports = exports;
  } else {
    /**
     * @method md4
     * @description MD4 hash function, export to global in browsers.
     * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
     * @returns {String} md4 hashes
     * @example
     * md4(''); // 31d6cfe0d16ae931b73c59d7e0c089c0
     * md4('The quick brown fox jumps over the lazy dog'); // 1bee69a46ba811185c194762abaeae90
     * md4('The quick brown fox jumps over the lazy dog.'); // 2812c6c7136898c51f6f6739ad08750e
     *
     * // It also supports UTF-8 encoding
     * md4('中文'); // 223088bf7bd45a16436b15360c5fc5a0
     *
     * // It also supports byte `Array`, `Uint8Array`, `ArrayBuffer`
     * md4([]); // 31d6cfe0d16ae931b73c59d7e0c089c0
     * md4(new Uint8Array([])); // 31d6cfe0d16ae931b73c59d7e0c089c0
     */
    root.md4 = exports;
    if (AMD) {
      define(function () {
        return exports;
      });
    }
  }
})();
</code></pre>
        </article>
    </section>




</div>

<nav>
    <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="Md4_.html">Md4</a></li></ul><h3>Namespaces</h3><ul><li><a href="md4.html">md4</a></li></ul><h3>Global</h3><ul><li><a href="global.html#md4%2508">md4</a></li></ul>
</nav>

<br class="clear">

<footer>
    Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Jan 24 2017 15:15:12 GMT+0800 (CST)
</footer>

<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>
@font-face {
    font-family: 'Open Sans';
    font-weight: normal;
    font-style: normal;
    src: url('../fonts/OpenSans-Regular-webfont.eot');
    src:
        local('Open Sans'),
        local('OpenSans'),
        url('../fonts/OpenSans-Regular-webfont.eot?#iefix') format('embedded-opentype'),
        url('../fonts/OpenSans-Regular-webfont.woff') format('woff'),
        url('../fonts/OpenSans-Regular-webfont.svg#open_sansregular') format('svg');
}

@font-face {
    font-family: 'Open Sans Light';
    font-weight: normal;
    font-style: normal;
    src: url('../fonts/OpenSans-Light-webfont.eot');
    src:
        local('Open Sans Light'),
        local('OpenSans Light'),
        url('../fonts/OpenSans-Light-webfont.eot?#iefix') format('embedded-opentype'),
        url('../fonts/OpenSans-Light-webfont.woff') format('woff'),
        url('../fonts/OpenSans-Light-webfont.svg#open_sanslight') format('svg');
}

html
{
    overflow: auto;
    background-color: #fff;
    font-size: 14px;
}

body
{
    font-family: 'Open Sans', sans-serif;
    line-height: 1.5;
    color: #4d4e53;
    background-color: white;
}

a, a:visited, a:active {
    color: #0095dd;
    text-decoration: none;
}

a:hover {
    text-decoration: underline;
}

header
{
    display: block;
    padding: 0px 4px;
}

tt, code, kbd, samp {
    font-family: Consolas, Monaco, 'Andale Mono', monospace;
}

.class-description {
    font-size: 130%;
    line-height: 140%;
    margin-bottom: 1em;
    margin-top: 1em;
}

.class-description:empty {
    margin: 0;
}

#main {
    float: left;
    width: 70%;
}

article dl {
    margin-bottom: 40px;
}

section
{
    display: block;
    background-color: #fff;
    padding: 12px 24px;
    border-bottom: 1px solid #ccc;
    margin-right: 30px;
}

.variation {
    display: none;
}

.signature-attributes {
    font-size: 60%;
    color: #aaa;
    font-style: italic;
    font-weight: lighter;
}

nav
{
    display: block;
    float: right;
    margin-top: 28px;
    width: 30%;
    box-sizing: border-box;
    border-left: 1px solid #ccc;
    padding-left: 16px;
}

nav ul {
    font-family: 'Lucida Grande', 'Lucida Sans Unicode', arial, sans-serif;
    font-size: 100%;
    line-height: 17px;
    padding: 0;
    margin: 0;
    list-style-type: none;
}

nav ul a, nav ul a:visited, nav ul a:active {
    font-family: Consolas, Monaco, 'Andale Mono', monospace;
    line-height: 18px;
    color: #4D4E53;
}

nav h3 {
    margin-top: 12px;
}

nav li {
    margin-top: 6px;
}

footer {
    display: block;
    padding: 6px;
    margin-top: 12px;
    font-style: italic;
    font-size: 90%;
}

h1, h2, h3, h4 {
    font-weight: 200;
    margin: 0;
}

h1
{
    font-family: 'Open Sans Light', sans-serif;
    font-size: 48px;
    letter-spacing: -2px;
    margin: 12px 24px 20px;
}

h2, h3.subsection-title
{
    font-size: 30px;
    font-weight: 700;
    letter-spacing: -1px;
    margin-bottom: 12px;
}

h3
{
    font-size: 24px;
    letter-spacing: -0.5px;
    margin-bottom: 12px;
}

h4
{
    font-size: 18px;
    letter-spacing: -0.33px;
    margin-bottom: 12px;
    color: #4d4e53;
}

h5, .container-overview .subsection-title
{
    font-size: 120%;
    font-weight: bold;
    letter-spacing: -0.01em;
    margin: 8px 0 3px 0;
}

h6
{
    font-size: 100%;
    letter-spacing: -0.01em;
    margin: 6px 0 3px 0;
    font-style: italic;
}

table
{
    border-spacing: 0;
    border: 0;
    border-collapse: collapse;
}

td, th
{
    border: 1px solid #ddd;
    margin: 0px;
    text-align: left;
    vertical-align: top;
    padding: 4px 6px;
    display: table-cell;
}

thead tr
{
    background-color: #ddd;
    font-weight: bold;
}

th { border-right: 1px solid #aaa; }
tr > th:last-child { border-right: 1px solid #ddd; }

.ancestors { color: #999; }
.ancestors a
{
    color: #999 !important;
    text-decoration: none;
}

.clear
{
    clear: both;
}

.important
{
    font-weight: bold;
    color: #950B02;
}

.yes-def {
    text-indent: -1000px;
}

.type-signature {
    color: #aaa;
}

.name, .signature {
    font-family: Consolas, Monaco, 'Andale Mono', monospace;
}

.details { margin-top: 14px; border-left: 2px solid #DDD; }
.details dt { width: 120px; float: left; padding-left: 10px;  padding-top: 6px; }
.details dd { margin-left: 70px; }
.details ul { margin: 0; }
.details ul { list-style-type: none; }
.details li { margin-left: 30px; padding-top: 6px; }
.details pre.prettyprint { margin: 0 }
.details .object-value { padding-top: 0; }

.description {
    margin-bottom: 1em;
    margin-top: 1em;
}

.code-caption
{
    font-style: italic;
    font-size: 107%;
    margin: 0;
}

.prettyprint
{
    border: 1px solid #ddd;
    width: 80%;
    overflow: auto;
}

.prettyprint.source {
    width: inherit;
}

.prettyprint code
{
    font-size: 100%;
    line-height: 18px;
    display: block;
    padding: 4px 12px;
    margin: 0;
    background-color: #fff;
    color: #4D4E53;
}

.prettyprint code span.line
{
  display: inline-block;
}

.prettyprint.linenums
{
  padding-left: 70px;
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
}

.prettyprint.linenums ol
{
  padding-left: 0;
}

.prettyprint.linenums li
{
  border-left: 3px #ddd solid;
}

.prettyprint.linenums li.selected,
.prettyprint.linenums li.selected *
{
  background-color: lightyellow;
}

.prettyprint.linenums li *
{
  -webkit-user-select: text;
  -moz-user-select: text;
  -ms-user-select: text;
  user-select: text;
}

.params .name, .props .name, .name code {
    color: #4D4E53;
    font-family: Consolas, Monaco, 'Andale Mono', monospace;
    font-size: 100%;
}

.params td.description > p:first-child,
.props td.description > p:first-child
{
    margin-top: 0;
    padding-top: 0;
}

.params td.description > p:last-child,
.props td.description > p:last-child
{
    margin-bottom: 0;
    padding-bottom: 0;
}

.disabled {
    color: #454545;
}
/* JSDoc prettify.js theme */

/* plain text */
.pln {
  color: #000000;
  font-weight: normal;
  font-style: normal;
}

/* string content */
.str {
  color: #006400;
  font-weight: normal;
  font-style: normal;
}

/* a keyword */
.kwd {
  color: #000000;
  font-weight: bold;
  font-style: normal;
}

/* a comment */
.com {
  font-weight: normal;
  font-style: italic;
}

/* a type name */
.typ {
  color: #000000;
  font-weight: normal;
  font-style: normal;
}

/* a literal value */
.lit {
  color: #006400;
  font-weight: normal;
  font-style: normal;
}

/* punctuation */
.pun {
  color: #000000;
  font-weight: bold;
  font-style: normal;
}

/* lisp open bracket */
.opn {
  color: #000000;
  font-weight: bold;
  font-style: normal;
}

/* lisp close bracket */
.clo {
  color: #000000;
  font-weight: bold;
  font-style: normal;
}

/* a markup tag name */
.tag {
  color: #006400;
  font-weight: normal;
  font-style: normal;
}

/* a markup attribute name */
.atn {
  color: #006400;
  font-weight: normal;
  font-style: normal;
}

/* a markup attribute value */
.atv {
  color: #006400;
  font-weight: normal;
  font-style: normal;
}

/* a declaration */
.dec {
  color: #000000;
  font-weight: bold;
  font-style: normal;
}

/* a variable name */
.var {
  color: #000000;
  font-weight: normal;
  font-style: normal;
}

/* a function name */
.fun {
  color: #000000;
  font-weight: bold;
  font-style: normal;
}

/* Specify class=linenums on a pre to get line numbering */
ol.linenums {
  margin-top: 0;
  margin-bottom: 0;
}
/* Tomorrow Theme */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Pretty printing styles. Used with prettify.js. */
/* SPAN elements with the classes below are added by prettyprint. */
/* plain text */
.pln {
  color: #4d4d4c; }

@media screen {
  /* string content */
  .str {
    color: #718c00; }

  /* a keyword */
  .kwd {
    color: #8959a8; }

  /* a comment */
  .com {
    color: #8e908c; }

  /* a type name */
  .typ {
    color: #4271ae; }

  /* a literal value */
  .lit {
    color: #f5871f; }

  /* punctuation */
  .pun {
    color: #4d4d4c; }

  /* lisp open bracket */
  .opn {
    color: #4d4d4c; }

  /* lisp close bracket */
  .clo {
    color: #4d4d4c; }

  /* a markup tag name */
  .tag {
    color: #c82829; }

  /* a markup attribute name */
  .atn {
    color: #f5871f; }

  /* a markup attribute value */
  .atv {
    color: #3e999f; }

  /* a declaration */
  .dec {
    color: #f5871f; }

  /* a variable name */
  .var {
    color: #c82829; }

  /* a function name */
  .fun {
    color: #4271ae; } }
/* Use higher contrast and text-weight for printable form. */
@media print, projection {
  .str {
    color: #060; }

  .kwd {
    color: #006;
    font-weight: bold; }

  .com {
    color: #600;
    font-style: italic; }

  .typ {
    color: #404;
    font-weight: bold; }

  .lit {
    color: #044; }

  .pun, .opn, .clo {
    color: #440; }

  .tag {
    color: #006;
    font-weight: bold; }

  .atn {
    color: #404; }

  .atv {
    color: #060; } }
/* Style */
/*
pre.prettyprint {
  background: white;
  font-family: Consolas, Monaco, 'Andale Mono', monospace;
  font-size: 12px;
  line-height: 1.5;
  border: 1px solid #ccc;
  padding: 10px; }
*/

/* Specify class=linenums on a pre to get line numbering */
ol.linenums {
  margin-top: 0;
  margin-bottom: 0; }

/* IE indents via margin-left */
li.L0,
li.L1,
li.L2,
li.L3,
li.L4,
li.L5,
li.L6,
li.L7,
li.L8,
li.L9 {
  /* */ }

/* Alternate shading for lines */
li.L1,
li.L3,
li.L5,
li.L7,
li.L9 {
  /* */ }
/*global document */
(function() {
    var source = document.getElementsByClassName('prettyprint source linenums');
    var i = 0;
    var lineNumber = 0;
    var lineId;
    var lines;
    var totalLines;
    var anchorHash;

    if (source && source[0]) {
        anchorHash = document.location.hash.substring(1);
        lines = source[0].getElementsByTagName('li');
        totalLines = lines.length;

        for (; i < totalLines; i++) {
            lineNumber++;
            lineId = 'line' + lineNumber;
            lines[i].id = lineId;
            if (lineId === anchorHash) {
                lines[i].className += ' selected';
            }
        }
    }
})();

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\f\r ]+/,null," \t\r\n"]],[["str",/^"(?:[^\n\f\r"\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*"/,null],["str",/^'(?:[^\n\f\r'\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*'/,null],["lang-css-str",/^url\(([^"')]*)\)/i],["kwd",/^(?:url|rgb|!important|@import|@page|@media|@charset|inherit)(?=[^\w-]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*)\s*:/i],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],["com",
/^(?:<\!--|--\>)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#[\da-f]{3,6}/i],["pln",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i],["pun",/^[^\s\w"']+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^"')]+/]]),["css-str"]);
var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a=
[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&"-"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=["["];o&&b.push("^");b.push.apply(b,a);for(c=0;c<
f.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j==="("?++i:"\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j==="("?(++i,d[i]===void 0&&(f[c]="(?:")):"\\"===j.charAt(0)&&
(j=+j.substring(1))&&j<=i&&(f[c]="\\"+d[i]);for(i=c=0;c<b;++c)"^"===f[c]&&"^"!==f[c+1]&&(f[c]="");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){s=!0;l=!1;break}}for(var r=
{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(""+g);n.push("(?:"+y(g)+")")}return RegExp(n.join("|"),l?"gi":"g")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if("BR"===g||"LI"===g)h[s]="\n",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\r\n?/g,"\n"):g.replace(/[\t\n\r ]+/g," "),h[s]=g,t[s<<1]=y,y+=g.length,
t[s++<<1|1]=a)}}var e=/(?:^|\s)nocode(?:\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);m(a);return{a:h.join("").replace(/\n$/,""),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b===
"string")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b="pln")}if((c=b.length>=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m),
l=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/,
q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g,
"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a),
a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e}
for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute("value",
m);var r=s.createElement("OL");r.className="linenums";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className="L"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode("\xa0")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-markup":"default-code";return A[a]}function E(a){var m=
a.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\bMSIE\b/.test(navigator.userAgent),m=/\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,"\r"));i.nodeValue=
j;var u=i.ownerDocument,v=u.createElement("SPAN");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"],
H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+
I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),
["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",
/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),
["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes",
hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf("prettyprint")>=0){var k=k.match(g),f,b;if(b=
!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m,
250):a&&a()}for(var e=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\blang(?:uage)?-([\w.]+)(?!\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",
PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})();
XL  K           LP [  @(             	F                   O p e n   S a n s    B o l d    V e r s i o n   1 . 1 0    O p e n   S a n s   B o l d     BSGP                 l 3 B (ZxZWh[qJx"cr,g,E&CĶ@rXY?&+uLFMlSud	Ɏ"be|SR1V0~	35uy"m19;R((ر6@/6+Bl*s5Uaiq[7:Ix:;6~"mjJ] OVy}HzFX`ͮp0ݠgo
4<t wxM~)D;?UV lS=	;)>v,(13	᱒G; :P.31:h%⾘\nb~6f
Ze,qWYÁf`p*Gl\b(<Z@Q"=L `@@	W@>pI-9|.@s0"!Q:Y?9@%-34f n8EF AV~ IµIj	v$'OVa]R CsWpD)h8q]#H=Tx+㿳Fx/6q<ڎ08ßXE=<-o}Y꾭wiuY|ӈE4\Q-<Ug+i_n޻쎼#Da(4NX	]mmMXH1q:j E^
T&^	rvU7xW[ձ~JSSkbAh:\frprjkn#Yђ[KOm'i$sܹ@JPe	>҅/CJ} =!%Č#e"HL%1|O#Z%SZQmW'~r
(C	Zhu yaVXH&		Čixv	Hh$A"b (*CdZ!y,bX2!F	jL$7S&((E] 1d>I+؍x!I&-"$&-b&$m-Cz]|zo5]I#.	ept_8P	p4YzJN=%dgH,v?a4L=tL sA5]^5Sض ˫f{]"z,mtV%MB:<ap5x

!A]FB W^=ֲwF#D0Y@b nB1a		j*Y>BWQqٺCmR		HMEKeD! Qlj0FUaߖ,떇Zc[``~y
Np kHBYhtdP
/R:tZ<LaDǘ[=+!PAwb]8`,!sli0j+@2чjd`դ:-I^}E hȇiF|%4pa+&CoY1mxK xF݈2C6(S		`7V?B4`+FM	i\;cb,E[B#*Q|	S}3%"ϤqjZ/J -p	q$x3<~Jό11Oc*\( Q#ǵkS"07dC(ԘAF	(uCl(,5冩k5c]W'$!PXZ3[|y&(~	2xEc,8pøcU/|f^T1TnFq:1F<iR61P jMo %0DGof;{M^\|9I>af{Rg(M'
;;[ٻ{t닁=#} Ƿ :HZ	Q+u)]Nc=6CYBo7Ԅf>1ݦsH4N"3D	E8==b I~CrbMD`xA&-|i34Zh;a$UDm=3ZD#GSF|ٗ!465iP
EmD-4"	!@%"}\dd8/-~4-K48ȸ#`ddP}"Y)4շ;ăX"de=yRTdaJG~Pc[0HdmOc'B®ԻH#Q	}y X9&nEP8	Nc Iq<4b?JpVL_BZ[U&h	A2)֕.21L
M 1fra6		 X'V_lb2h d +Uki v&hڂt=zyrr T,Ms@4x!V؂t1
`bd/'>L:xV]]uRAUv6hüL
W+\V$ UZ0
+@dVC"R4ڦm3Alą@frD#.	D$:툉F9Y%@&T/ߤbhcQD{W#t9d,nr@wCvFy6\K)) C3
$@ 
)&Xͨ($izfH P('̓P!F"ժ)N6!c.5øܟb1$GTtK'+4Ѩ4eZ%grIHQ)D7osQۭS~poF@K.|Mzkڛ )V=\#P#DIP8raţ%Q)IC/_# Ix6Q3{2^Ia,$V<\ݐ Mm6Oװ-DO0o J{\EJ0LkEr	NW #m	j٭Gx, O35ehԒ9Sqs\c.32R[)q|B)KI0" $x$I53x3*Cn9ImPteFDJ\A)PL/oh6衵kAĨ\] Q>$dsй@s$BP Bة}TIx
CQ
ZR7Ae`/@-vJ	x	@6,x#nKkM5luֹH[܈ft|c	*쀾nDdRxmTv|`W3i)ȉn9<ƆfOey
ӥz=&1	}dTkA=7w܊l1l^P#8{Mw|v,DONfYj?1vi N~c_E\&Ī^EuP,AUTf

9*][-l05+\Z	r	ZFǮ-GdXWµJ)-{brE 
G6&ͣé_,x=Cm1eY'IMeB%Z7.tğLI3>r!.K]0-AtHGƹܵ96ύq<*e,
ċz4C"&$A1	d`:ď{bb3"6~py9ϒ*@YOV?T1/qR(@ꑭII-U6QJӃ\$OY_X?2&][4OyƋbSbٵ)L%i7[X9㧗wFEpIڭyM#Śѥ1N¦k,ҋI׉]^h$7eވ͂xyIaz|ߨ|8~Vrڣ핗/` Xm@k7NuǠr<Kp=CHYa	MErMV(h%(PJV9x<2!q}9	|mN<ڤ>gĳC/`ԒG0mhxbHt
s*iZ[-(z@\VCPݓzNP̈T9 -Zԇ+R $e;2$E+f_ ZAoLho*:ϱr HĨ1 Y^ma,X. ԚV-z,W48#qL
5gi!$A%V
g&qpF39мƈRjZi(Գ|q0U7⋟ݠP(+/<݄&ˊ,J0Uӻpv	+% C3X}OuSČX5lַ|{e&X !L#$釔&aN	1LQ$T>az<G)_(],'Y>F^R=d
}T<].Gj#⭬Ud+sL%]22&K*	V3UX{GMAjPGCBBL$FH>OEXV,b-Od)@0)6'o@e	eGf9Dd|P=0mާmY#
Ahٟ[X
O\%7	.G&|) {TO3C=\PC.ПW8,1؞i`G31ԑJhKr)@ԗ/&Č-H)e
N1R(y`7ye}8_猩#//HI?&juR'F5ce%eCTe5!g ja)W\\.0LB&`[as/+2г5as!${0r()"}<fՀ @}g%B1\L:ǊĊ@uz/
B1M0ќI\o(L_[*r`ϪZf#f5,jZ@X BI({i:c~3=bsh
WU>u [HǃeDZ' n3殄Ds+ϩ;֛mr*G\fK8kU
&qY}8  oiɮ*#%;f",@DE&Ӫ,-ϡ4b,⑹eT78h}dΰE9h-H,̿ɪN V-D@DB-d>ր釬Veq^aR< QӶA}(&BKP%Ť( ,4Gt$I[QUo޷xx#^w8y:Qn GhB-Q|AfCI`<G^6=jFLOZC'͠y"YJa"y+-x,1)D=*{sh1D`@xԛR1mn@(NsDIR.8u,d+Bv<UݙZ<ഡnov77$0B*Hޝ`yvq^GTZr"`RW48uKa2G:B
,B)]jNbD
r.]EFy> 'YMsX`ǢQJM!<ɾ2.Y)Lk2<	q@m
!v=
+hZl
,
NP2{wA"_!%`x	䊈GjFl[1M!Y+i8i$hTvEtxu~eH]`/`%Äcg1$
0P{@_8IZr_MЋ1210%^Q("!pt-Di/:? ~hD]s32:9hXcpTFuӂI'q 0Ƙ7 ݆g3O b xGB  5NHhͬ
U!(n6ŧ?ûЖQ$jղx&TSSo\V,$goc>R9g	M0br7J=" 8oUҹxpEqޢ',k97KK|)Rc?̩O>F  Qh%Q<btnXS]	Z{qy㪻>ŒNJyf	8Sa3]YnEa5S^[
-,IpR w*~ѥ #c6e05ƙ/%,5fᴸ;ŶPsĜZ
Ixd95Rff_мTB=&Y&npw<V"D`֮r	G;I+D2g8O<(j#*#7NL"[;K>mȉsđqLfBS(FH<zCNiͬP5uN:2w!{#S6x1e<߀zPqF~`&oL% O6*a22BI7b3K@Y!{>yT*ŘIǇn"SKtԆI	cNAʕ\ӇfX3*e
0#S&+HQdw)N0qV(H%[2#.Z"m8LvCD!O'V|79R
sr m2G6z m̆93Aa\2)tZ7Es{c-hC NR3Fv)5t0M=W=f<vojRt)ݜbfKde	m
W[dJT t:{۰WBlQu^j#ΐZh(a"+=7/X%ˠ Xy :I7&x͑JLhƢx3dt㬬Dyzc(|N%Ky1w%AY/n{/0;1
R*?+}|x,kve2iG@fޞj	[LUg dEitAx΢pa^&ao'\ 0B".U,
 @(硰&厕"&Xʋ8F"I'j k"99&ԥJ#},r uy%YpJ͆@	bO7܆XǩȨ"vdQf2Ga+i Vn4N`E~7$|4b1IT{.ѓ(>ϭFu7S/ySye%ST?'wvD.`H@7.1L)8BK/P	lĨ5"(&2b'*Q!a{-k.aPV~.B*(Vfe=(KˣtFw2m+?Vit.чEB#, rg*~#SbOt0f6H	M;[>\j:"-*	PbG֠'xwNP4.kqi7M\tj}$}~b%d˘Ӳp(@ۤӁ,+ź8)$7@6NtîJ> HqPʧvH87T}!Gv6~6Q!sjXJ7֢6h,i,#h8.ȃ>Ur]m>V	yGTKwD28Xy`}Q>-f=bxuvx^A⬷LA3yԜU/aq)[W&J8@>oqvW
okdFCZwbaoGnt@I-l\x8ibT^BafQ]qp: _vKlͦ;$M(n^:t_5#M-$|4ḓ{`btWqHao|M]T\lN8sqNzޞgJb7-P_4Dp>Hf"Wb92scksh"+K+4**<Q_z,^6cfzO;o_fYH3Ȁn'my1+PAI;jbm 	) HL  8)W0A#I]ԙL`yf8ѩ	9t71xxSˈk4Qܰ+SZ[etka!k\x.wVuHЁaIQ~In:n\C:R\	^N&i("~v% rMpe@D^.%
ÔրJ!b}!@QģqřF4舔uRnml"ĽD%kQHdǮEϕ{ 	Ag9ACPWS!o!twZu̾OL*-s5k QhV)uɴ?1Gy3vDc~TjHc62-,Z:li/qndm",i*G <>4wRD5	=:jZif.IWK=xzmm	c"(TZ\ؖhJmȐefIa?ZUh-7nXh2ޮh<*ωHŻm&@{XaE:rPf-:Rq#nsقj1U
7d},-$g N#vLM%O.aLZ,$Ի'fd4jff-֡P PRg(=H&dLT!|0Cdˬ(Ȇk%_3wCŞZ~;CW(喋38OeRzLT6L{>8; F#p{a߀\$;~t}`#Oަk=墰J]:ܱP0.H(k"EP2J땑9*5(-´?SJ Q(H<&/@6h.Ď6]"#iFZ!Bb>_ 	̝21lN;m@FݝaH@kA>~lZ
ȋǙ\
Y!9+-Uy',5EZ9L#GWЭ"ޔem\ˬpm 4Ց$ 4S$f<5x |ܥJ`ٚZٚ@K2O\0GGL 5"i{FF"til 8'QN~Rt-P1.dHqa6d8ߦwko VĬCt{
.+TC[H/<ѨKE?PXcK֑f}c7})xM4RW;RxYB2(=KkxJ&/V)V@]#o3~Vm231ca3p%ÏAunV-]tt1R,6;ttufc;9v&}3+&m&^d켨/T0gѕU<	2_2_UYhIHOˣ1H[ΦN_|,t#|LPEʠ
ףhb	5\
-[f>w,* wlX%޺ f !
ர D{lDdGn'UM))fg>kߚ!0(|(=BOg"mUlSxK4M@
Ѣ[0_Wr4q>vhw± %x:4n$f`b6u`WmjJ+tr c1{ݻ7G_'vuf	zu=⎽#2 þ"	4z^׽LkU@gwXG<OCGĠU-# PLi3HZn=<Oms2_HlFP|Q峘,YvF˶LsD^X>t= J@KD	`A؜ۓ6@iq'ӥ?fYCŞn	 -,`/kz0g-Z`#.EΗ!N)Ni4HrƩ2UN1A95Xˇg8uPo%%
,8T5LATV'IQ1
=Q7>=56JWER*h_ӦhAh#'1lGSa̓D峃1nsC%{PolPd@%Di
Ԋ55#e}m"j7,QC!"@u՗7o_e
E5Q4G\ȳ*+<qAt4#턩\@fE`ԣkD]φvf3vfXT_`
CH*מuCMNyWW\]F6DZ3Q~}*]y10O`kJۚ޼xE^8ٓyAK_҅b]~Juݘk5yHW9x &b,*M@$u?+yE$:M^1
FC`P-$SA]_}_
0ذ:%&ӤM+D @%Z3<S.ygc_mյd<s>Ga&%}$6"ƓM1lGCP- ÁgNKaI0S\q<%ER%E0?H-y:
>=:SO -BM-
G4^Jbsd4;1Έ4s"5͐TvYA0	(ObE%ІAr M6iGIWH
vf*+FNdЅS/FV@y8]Iː&_T^6ͯΥމ`:sbp{֪t;@NҦ*6{3>dD _8r7ɠ߈{.-pL\w5zx?kjA)R8s6Uc	`_N'*Q(+Xt09<6TQTS;яHLn_BgE PhAz3$J`t)ji~I}
đ*#@TǹϢB5OfDQWa+= yp7BRG`|l7]R7ڌ֬]ke۶z$F<&S!B8p)\q/m:둅ҞAzZ2u%vf/(ٵX2]ljkcoj0oeo*I5ݳr!M5"&#I	qŏȔwYS!Mnbfe0alҊ7|Oif!l%<)5@g!(?m r|1&PUi޴qքlGR3Iy¡U-,k7>D)fgm̙ ALn5B-hr4P*?qO?@\- &F gM n^Op;c3oo
Z$_Pq|'Xn4\S2		(h;H,(GQd`n(@1]Ġ^l suDUuJik! P.ȳ/HHVn)(>[l	)3︺Ur,[k+4[g[՚S<=^ w[:|c8dȖV{cԛUK `9M%2Q
⮒~5[ n;:Q.@jä98meMxrT[ЅA&О# &q(\F֐HƬtz=#&DܲlMXqM@
[Yl#ci(@&J`p[5#ܼʗ͇pYq*7̾8&s~sr<jv2,`R:D+-4,|ǔ o]p=HU,6-4%ԟ1mIx^w
+4>WXqPD?)P$Wq6<7i&6px;lE4#&gџHp*m2Yb&ETfN獞־	T1b烐?y9qGR<BݯC'#6M 4p=7
]sm.X5Ylt $ \=4E0G̈́l@`h"ʝ^{KjAcSv$wFzzUϷǄ5RuYЬ:4!zh0F4k-y˦i=ݞ<K\N?4Ev[oVw5H^X-Mj3D<ld>z0'M`ߧ 8x)rh7=4xތgA:I5p6V*7c5vȞjB~:|I_B+VLPMNNoqG,wJA0d
$@Pp , 'aM81q={x׺dLx@Wٰ sA$#9 pT,x='\\/R#qjB'Q>C-]~0:
_2\cZ	,=R`Џb
z.wNjdט+/_rxPᰍ"DM혈>jOq2fkC$YJp\;69aI .VN+
sT%oWV+ׂ*!OKR^|NqZHdI>!%R[eBʆRn>_N,]t*ʢ94"JbĸD4/X3^b3-,Zkbyn>Xk]Xs}3f?`<<.>DnJ75ԿDA`~7|1/UexǈPƴ'd	0ŬY=1ޭ$tG9%63L#2@7;.)3F4/@FJMx@"(l'Wi"\'pI-HBC|	hd9@'S;jƳeޔ[ՅeDdDhD|ULGM&gQN-5qAɋL>EEԖ+'{`#7usF|\Rq+#.ޮyAl$J[Y^}$H2-t[wS$[+Mե Bɢ,Kzk(:Fhn~Ȫp䮴&2:0a g\`L+)hjHu.D`@?@Nh98OIW>Fܤ1DA8~Es@$É^QԢ-ZFpV(
mЂpRO#@MO1UktwCϦ9n(Ctwh!h+toz0CԼp1`Tt9xiR2:1i$;91,0&J#}. yfQ|pcX3x](`@1o#ߍ;N"O#jDVWlC$/$ -ĂMbĄ	J$Da!2"F!&K
|l+^??ͱ!*O4x2LPR4=
gS`8o0/L
JgCC.^&RDE!W@ TO:bK6@I?2aD+2]K8.6$΁i6gۀ J
0%Ϝq\aQa&#9Em-fMK04׉dC+L@,T7ND	Hf6!d.ȥN;KÈ-bMptة6rJ?ņ MUiP6ݒBvبYӽhρ\85(Y}D?[ZOC(/XugcN~4PMF)ٿh%exDx;`0x;,*`g;Bqׯx*d{Y8GCqjn1h1I-F(@K)tXm#nܬ2@1..2!,!|E6KCubK.(.7pVL1
cѺpu.햻ͷN$29KvFk]A(',R]_8Z]<E{مtS<АO9`Y~@y"IF "@رKƘ`H7Prͳbs1*3EE
8$]lr3bX6`RZT `~	=$lVeeJ F<pCdAέ`PaRgsSj RZ#K@͐* Ȏ>@UhW3P)eO<8ڴ&niM{mly+Ayo\[W2*1G D[7 +$@oyFFbj-P __$PnP(WpF6ڹk Dۑ95)]3 A.l (fMhFHhHLl8GV@
,ɐ`^]T@\l@`ڰ{NU(mB6ˏnI UE[@4"aA
/*N嘦JAG}d
#,ۄz6/51KGX'D>>ے#ڟ	*/&͚1߈/@e][uIȍi|ni x)i3JDwN4׮vrČ'{JH`M	Pow(J@<
#iUSҡ*z!@FVgSā
<_ssC\`RuD
2qseS:Qݞ3=VWGRJwF2gZQMDEb,P@I0А1S\1z}*Zs8Cii1z<ԛ¥34]Ge V5]	#Od0m*; ,V3D+4NPitzN:VBWϣ+b{BaR:t$Hc6aHO+EbǱt&Y3rT:~`5te==n̀G)Rx,fwIPR'ɬ WuEQļiA)L4}="?OH1r*LȠiN["5\ڗٌrex lp4-p9e5E+$$p84eG6vfbۧoa'K|-E&\7ZD , b	EeDV컈9[7̥Gk}NXV,@%@+g
n@BmI*
l'BI	-RhZca!(W+AUdӹbԾ@V  xنp%Vڛ1TsQ5Ů&F?X}q
=0<8f.G|Ae?	V=}/2&(@Kں*J6@պqM!Fk
'äAR ىLHL֕h!zF:%%l+$<X_g 4Lf!*A#RzmƖcf]Ffaʓh8x7R1=;4glƠqJ~'TxYȺ,daaJv}zqh tCQ7_mlLv)J},]g`d6;
،={/p[%i1sg9UI^6o3t~hr;c2G2qԮa2)%?J	' ،/M¡
ް?'o	kӯy'gN K 7"Y|wF*ChOiԸ*"RJ
i'Ú:}0bمo`C`Gk'%Ô'AmQEf,}峋G~+UV !Ww]s_'~K
m  ȿI)0 3p8̂LhDq #$&Dm#ȈVÕUӒ-X3d c!ۊ!5hdxHXcu*n9	 aW=)4oI~4* FAOE>znj^r0sǙRx:'6qJ!)Rd~~G1lpd?๹?D3n%ɗw A $MQ:1$cxէN =ۺTAeqtm :GúemXsyu&ߖj݄(ʃO%R1`m`戼NvCM ᬄVֹC!: І:>#&(Ck~n	;	%6 qb8SR9o9J_d GeS&,\,tR$O(aZ%)!#L9KB GsDGͦ(Wn<&B\6Hgemud<-,Wrr9)nrn+6Ko:+S
+rL:S(*ȅL"PjjU98[PPMm4ՠYXcU"G(ĉ&ݕmpl  MDh%oLGY)EAgA3@kC<nyP?BF\֌ɯh[ S@o+sBȁĀPRm"t ]6_/>xʖS˛ybbostu, Z=8LwXH cebΊN;\7Bc5ncUv5QAd12`FFt3{5ag!ZfR늠'.xE%)6@[9zilu2AM3Eʮ܊ ,\'l!
@8uëDj?kcaA<R<T/i|j4bg*>]
tovE[-yvqQYè3ы/J*M1-bjvSHC9GN}C<+DRQ|!:P&,ayf-Q8Hp<0nöAn08N:Xw@)58ل`3JCBb:)8qi.Xo$>
?9GwwS	~ߡZ=\U<^MTԒ{n,u=q1y3.a,z~I_@E60r0iEu><rB`9+Yxn#+]&9,
a	AOܚ.,yxY]:7*崅AvH>>lf#HAw%jC/5.T53۳j[4}a,b'2I4+̎heͲ˝QLa6!QkC2hd@)k}72TY*)/`&kx{p|=DhcUQٛbd{<vIҏb@j#-ߟ5;\>5JTmj<@Ȅ@L{j<|F	֓pKGeN+#@:wy?=>oZN2<)D m.{&${ Ra! EeHg%/AC\!lb\2C;ˉ,Z
[$w4Iq94oK&V@طUP
(V )K6P>X̡Oǹfؘ0Hv2Yl]E%	B1 E󏖃w0'@<R+/P1M[Klfv_0Yן CohCIwK6kUK43nY]ۑFƦL#`ڌԋ.=G&7M qO$֑yGI=p|iti9OTI @"He%ӸF&MKISHspZB'0oӏIX/"CJR(UYւ4&JɉE^U2ٝÁn Y	6U{Urp60NekOɷ9<~t@@ֶKߙm#\̎2 4]w9y0N%'&ӖQJ$I8kd  GAg`u~F%O[2U"G0t#Kh[h:dS|f 1
!g9CQzYIc_HH'NFUOX8q?8:mdfx &D.'n)*!5$!l!c˂`՛<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata></metadata>
<defs>
<font id="open_sansbold" horiz-adv-x="1169" >
<font-face units-per-em="2048" ascent="1638" descent="-410" />
<missing-glyph horiz-adv-x="532" />
<glyph unicode="&#xfb01;" horiz-adv-x="1417" d="M41 0zM778 889h-264v-889h-305v889h-168v147l168 82v82q0 191 94 279t301 88q158 0 281 -47l-78 -224q-92 29 -170 29q-65 0 -94 -38.5t-29 -98.5v-70h264v-229zM940 1407q0 149 166 149t166 -149q0 -71 -41.5 -110.5t-124.5 -39.5q-166 0 -166 150zM1258 0h-305v1118 h305v-1118z" />
<glyph unicode="&#xfb02;" horiz-adv-x="1417" d="M41 0zM778 889h-264v-889h-305v889h-168v147l168 82v82q0 191 94 279t301 88q158 0 281 -47l-78 -224q-92 29 -170 29q-65 0 -94 -38.5t-29 -98.5v-70h264v-229zM1258 0h-305v1556h305v-1556z" />
<glyph unicode="&#xfb03;" horiz-adv-x="2208" d="M41 0zM778 889h-264v-889h-305v889h-168v147l168 82v82q0 191 94 279t301 88q158 0 281 -47l-78 -224q-92 29 -170 29q-65 0 -94 -38.5t-29 -98.5v-70h264v-229zM1571 889h-264v-889h-305v889h-168v147l168 82v82q0 191 94 279t301 88q158 0 281 -47l-78 -224 q-92 29 -170 29q-65 0 -94 -38.5t-29 -98.5v-70h264v-229zM1730 1407q0 149 166 149t166 -149q0 -71 -41.5 -110.5t-124.5 -39.5q-166 0 -166 150zM2048 0h-305v1118h305v-1118z" />
<glyph unicode="&#xfb04;" horiz-adv-x="2208" d="M41 0zM778 889h-264v-889h-305v889h-168v147l168 82v82q0 191 94 279t301 88q158 0 281 -47l-78 -224q-92 29 -170 29q-65 0 -94 -38.5t-29 -98.5v-70h264v-229zM1571 889h-264v-889h-305v889h-168v147l168 82v82q0 191 94 279t301 88q158 0 281 -47l-78 -224 q-92 29 -170 29q-65 0 -94 -38.5t-29 -98.5v-70h264v-229zM2048 0h-305v1556h305v-1556z" />
<glyph horiz-adv-x="2048" />
<glyph horiz-adv-x="2048" />
<glyph unicode="&#xd;" horiz-adv-x="1044" />
<glyph unicode=" "  horiz-adv-x="532" />
<glyph unicode="&#x09;" horiz-adv-x="532" />
<glyph unicode="&#xa0;" horiz-adv-x="532" />
<glyph unicode="!" horiz-adv-x="586" d="M416 485h-244l-51 977h346zM117 143q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5z" />
<glyph unicode="&#x22;" horiz-adv-x="967" d="M412 1462l-41 -528h-197l-41 528h279zM834 1462l-41 -528h-197l-41 528h279z" />
<glyph unicode="#" horiz-adv-x="1323" d="M999 844l-47 -232h258v-206h-297l-77 -406h-220l78 406h-194l-76 -406h-215l74 406h-238v206h277l47 232h-252v209h289l77 407h219l-77 -407h198l78 407h215l-78 -407h240v-209h-279zM539 612h196l47 232h-196z" />
<glyph unicode="$" d="M1092 457q0 -159 -115 -255.5t-322 -115.5v-205h-137v201q-244 5 -428 86v264q87 -43 209.5 -76t218.5 -39v310l-67 26q-198 78 -280.5 169.5t-82.5 226.5q0 145 113.5 238.5t316.5 113.5v153h137v-149q229 -10 414 -92l-94 -234q-156 64 -320 78v-295 q195 -75 277.5 -130t121 -121t38.5 -154zM791 442q0 42 -34 71t-102 60v-249q136 23 136 118zM389 1049q0 -44 30.5 -72.5t98.5 -58.5v235q-129 -19 -129 -104z" />
<glyph unicode="%" horiz-adv-x="1845" d="M315 1024q0 -127 22.5 -189.5t72.5 -62.5q96 0 96 252q0 250 -96 250q-50 0 -72.5 -61.5t-22.5 -188.5zM758 1026q0 -230 -89 -345.5t-261 -115.5q-165 0 -255 118.5t-90 342.5q0 457 345 457q169 0 259.5 -118.5t90.5 -338.5zM1446 1462l-811 -1462h-240l811 1462h240z M1339 440q0 -127 22.5 -189.5t72.5 -62.5q96 0 96 252q0 250 -96 250q-50 0 -72.5 -61.5t-22.5 -188.5zM1782 442q0 -229 -89 -344.5t-261 -115.5q-165 0 -255 118.5t-90 341.5q0 457 345 457q169 0 259.5 -118.5t90.5 -338.5z" />
<glyph unicode="&#x26;" horiz-adv-x="1536" d="M1536 0h-377l-115 113q-191 -133 -432 -133q-244 0 -387 112t-143 303q0 137 60.5 233.5t207.5 180.5q-75 86 -109 164.5t-34 171.5q0 152 116.5 245t311.5 93q186 0 297.5 -86.5t111.5 -231.5q0 -119 -69 -217.5t-223 -187.5l284 -277q71 117 123 301h318 q-36 -135 -99 -263.5t-143 -227.5zM403 424q0 -86 64.5 -137t165.5 -51q126 0 227 61l-332 330q-58 -44 -91.5 -92t-33.5 -111zM762 1133q0 53 -36 83.5t-93 30.5q-67 0 -105.5 -32t-38.5 -91q0 -88 95 -194q86 48 132 94.5t46 108.5z" />
<glyph unicode="'" horiz-adv-x="545" d="M412 1462l-41 -528h-197l-41 528h279z" />
<glyph unicode="(" horiz-adv-x="694" d="M82 561q0 265 77.5 496t223.5 405h250q-141 -193 -213 -424t-72 -475q0 -245 73.5 -473.5t209.5 -413.5h-248q-147 170 -224 397t-77 488z" />
<glyph unicode=")" horiz-adv-x="694" d="M612 561q0 -263 -77.5 -490t-223.5 -395h-248q135 184 209 412.5t74 474.5q0 244 -72 475t-213 424h250q147 -175 224 -406.5t77 -494.5z" />
<glyph unicode="*" horiz-adv-x="1116" d="M688 1556l-41 -368l373 104l33 -252l-340 -24l223 -297l-227 -121l-156 313l-137 -311l-236 119l221 297l-338 26l39 250l365 -104l-41 368h262z" />
<glyph unicode="+" d="M475 612h-387v219h387v390h219v-390h387v-219h-387v-385h-219v385z" />
<glyph unicode="," horiz-adv-x="594" d="M459 215q-52 -202 -176 -479h-220q65 266 101 502h280z" />
<glyph unicode="-" horiz-adv-x="659" d="M61 424v250h537v-250h-537z" />
<glyph unicode="." horiz-adv-x="584" d="M117 143q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5z" />
<glyph unicode="/" horiz-adv-x="846" d="M836 1462l-545 -1462h-277l545 1462h277z" />
<glyph unicode="0" d="M1096 731q0 -383 -125.5 -567t-386.5 -184q-253 0 -381.5 190t-128.5 561q0 387 125 570.5t385 183.5q253 0 382.5 -192t129.5 -562zM381 731q0 -269 46.5 -385.5t156.5 -116.5q108 0 156 118t48 384q0 269 -48.5 386.5t-155.5 117.5q-109 0 -156 -117.5t-47 -386.5z" />
<glyph unicode="1" d="M846 0h-309v846l3 139l5 152q-77 -77 -107 -101l-168 -135l-149 186l471 375h254v-1462z" />
<glyph unicode="2" d="M1104 0h-1022v215l367 371q163 167 213 231.5t72 119.5t22 114q0 88 -48.5 131t-129.5 43q-85 0 -165 -39t-167 -111l-168 199q108 92 179 130t155 58.5t188 20.5q137 0 242 -50t163 -140t58 -206q0 -101 -35.5 -189.5t-110 -181.5t-262.5 -265l-188 -177v-14h637v-260z " />
<glyph unicode="3" d="M1047 1135q0 -137 -83 -233t-233 -132v-6q177 -22 268 -107.5t91 -230.5q0 -211 -153 -328.5t-437 -117.5q-238 0 -422 79v263q85 -43 187 -70t202 -27q153 0 226 52t73 167q0 103 -84 146t-268 43h-111v237h113q170 0 248.5 44.5t78.5 152.5q0 166 -208 166 q-72 0 -146.5 -24t-165.5 -83l-143 213q200 144 477 144q227 0 358.5 -92t131.5 -256z" />
<glyph unicode="4" d="M1137 303h-176v-303h-302v303h-624v215l641 944h285v-919h176v-240zM659 543v248q0 62 5 180t8 137h-8q-37 -82 -89 -160l-268 -405h352z" />
<glyph unicode="5" d="M614 934q212 0 337.5 -119t125.5 -326q0 -245 -151 -377t-432 -132q-244 0 -394 79v267q79 -42 184 -68.5t199 -26.5q283 0 283 232q0 221 -293 221q-53 0 -117 -10.5t-104 -22.5l-123 66l55 745h793v-262h-522l-27 -287l35 7q61 14 151 14z" />
<glyph unicode="6" d="M72 621q0 434 183.5 646t549.5 212q125 0 196 -15v-247q-89 20 -176 20q-159 0 -259.5 -48t-150.5 -142t-59 -267h13q99 170 317 170q196 0 307 -123t111 -340q0 -234 -132 -370.5t-366 -136.5q-162 0 -282.5 75t-186 219t-65.5 347zM600 227q99 0 152 66.5t53 189.5 q0 107 -49.5 168.5t-149.5 61.5q-94 0 -160.5 -61t-66.5 -142q0 -119 62.5 -201t158.5 -82z" />
<glyph unicode="7" d="M227 0l549 1200h-721v260h1049v-194l-553 -1266h-324z" />
<glyph unicode="8" d="M586 1481q210 0 338.5 -95.5t128.5 -257.5q0 -112 -62 -199.5t-200 -156.5q164 -88 235.5 -183.5t71.5 -209.5q0 -180 -141 -289.5t-371 -109.5q-240 0 -377 102t-137 289q0 125 66.5 222t213.5 171q-125 79 -180 169t-55 197q0 157 130 254t339 97zM358 389 q0 -86 60 -134t164 -48q115 0 172 49.5t57 130.5q0 67 -56.5 125.5t-183.5 124.5q-213 -98 -213 -248zM584 1255q-79 0 -127.5 -40.5t-48.5 -108.5q0 -60 38.5 -107.5t139.5 -97.5q98 46 137 94t39 111q0 69 -50 109t-128 40z" />
<glyph unicode="9" d="M1098 838q0 -432 -182 -645t-551 -213q-130 0 -197 14v248q84 -21 176 -21q155 0 255 45.5t153 143t61 268.5h-12q-58 -94 -134 -132t-190 -38q-191 0 -301 122.5t-110 340.5q0 235 133.5 371.5t363.5 136.5q162 0 283.5 -76t186.5 -220.5t65 -344.5zM569 1231 q-96 0 -150 -66t-54 -190q0 -106 49 -168t149 -62q94 0 161 61.5t67 141.5q0 119 -62.5 201t-159.5 82z" />
<glyph unicode=":" horiz-adv-x="584" d="M117 143q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5zM117 969q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -81 -46.5 -125.5t-127.5 -44.5q-84 0 -130 44t-46 126z" />
<glyph unicode=";" horiz-adv-x="594" d="M444 238l15 -23q-52 -202 -176 -479h-220q65 266 101 502h280zM117 969q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -81 -46.5 -125.5t-127.5 -44.5q-84 0 -130 44t-46 126z" />
<glyph unicode="&#x3c;" d="M1081 203l-993 438v143l993 496v-240l-684 -317l684 -281v-239z" />
<glyph unicode="=" d="M88 805v219h993v-219h-993zM88 418v219h993v-219h-993z" />
<glyph unicode="&#x3e;" d="M88 442l684 281l-684 317v240l993 -496v-143l-993 -438v239z" />
<glyph unicode="?" horiz-adv-x="977" d="M276 485v74q0 96 41 167t150 151q105 75 138.5 122t33.5 105q0 65 -48 99t-134 34q-150 0 -342 -98l-109 219q223 125 473 125q206 0 327.5 -99t121.5 -264q0 -110 -50 -190t-190 -180q-96 -71 -121.5 -108t-25.5 -97v-60h-265zM244 143q0 84 45 127t131 43 q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5z" />
<glyph unicode="@" horiz-adv-x="1837" d="M1735 752q0 -144 -46 -263.5t-130 -187.5t-195 -68q-74 0 -131 35.5t-82 93.5h-16q-108 -129 -275 -129q-177 0 -279 106.5t-102 291.5q0 211 134 340t350 129q86 0 189.5 -16.5t170.5 -39.5l-23 -489q0 -139 76 -139q64 0 102 93.5t38 244.5q0 161 -67 284.5 t-188.5 188.5t-277.5 65q-202 0 -351 -83t-228.5 -239.5t-79.5 -361.5q0 -276 147.5 -423.5t427.5 -147.5q106 0 233 23.5t250 68.5v-192q-214 -91 -475 -91q-380 0 -592.5 200t-212.5 556q0 247 108.5 448.5t309 316t461.5 114.5q220 0 393 -90t267 -256t94 -383zM711 627 q0 -211 172 -211q90 0 137 63.5t57 206.5l13 221q-51 11 -115 11q-125 0 -194.5 -78t-69.5 -213z" />
<glyph unicode="A" horiz-adv-x="1413" d="M1079 0l-106 348h-533l-106 -348h-334l516 1468h379l518 -1468h-334zM899 608q-147 473 -165.5 535t-26.5 98q-33 -128 -189 -633h381z" />
<glyph unicode="B" horiz-adv-x="1376" d="M184 1462h455q311 0 451.5 -88.5t140.5 -281.5q0 -131 -61.5 -215t-163.5 -101v-10q139 -31 200.5 -116t61.5 -226q0 -200 -144.5 -312t-392.5 -112h-547v1462zM494 883h180q126 0 182.5 39t56.5 129q0 84 -61.5 120.5t-194.5 36.5h-163v-325zM494 637v-381h202 q128 0 189 49t61 150q0 182 -260 182h-192z" />
<glyph unicode="C" horiz-adv-x="1305" d="M805 1225q-175 0 -271 -131.5t-96 -366.5q0 -489 367 -489q154 0 373 77v-260q-180 -75 -402 -75q-319 0 -488 193.5t-169 555.5q0 228 83 399.5t238.5 263t364.5 91.5q213 0 428 -103l-100 -252q-82 39 -165 68t-163 29z" />
<glyph unicode="D" horiz-adv-x="1516" d="M1397 745q0 -361 -205.5 -553t-593.5 -192h-414v1462h459q358 0 556 -189t198 -528zM1075 737q0 471 -416 471h-165v-952h133q448 0 448 481z" />
<glyph unicode="E" horiz-adv-x="1147" d="M1026 0h-842v1462h842v-254h-532v-321h495v-254h-495v-377h532v-256z" />
<glyph unicode="F" horiz-adv-x="1124" d="M489 0h-305v1462h838v-254h-533v-377h496v-253h-496v-578z" />
<glyph unicode="G" horiz-adv-x="1483" d="M739 821h580v-758q-141 -46 -265.5 -64.5t-254.5 -18.5q-331 0 -505.5 194.5t-174.5 558.5q0 354 202.5 552t561.5 198q225 0 434 -90l-103 -248q-160 80 -333 80q-201 0 -322 -135t-121 -363q0 -238 97.5 -363.5t283.5 -125.5q97 0 197 20v305h-277v258z" />
<glyph unicode="H" horiz-adv-x="1567" d="M1382 0h-309v631h-579v-631h-310v1462h310v-573h579v573h309v-1462z" />
<glyph unicode="I" horiz-adv-x="678" d="M184 0v1462h310v-1462h-310z" />
<glyph unicode="J" horiz-adv-x="678" d="M31 -430q-105 0 -183 22v258q80 -20 146 -20q102 0 146 63.5t44 198.5v1370h310v-1368q0 -256 -117 -390t-346 -134z" />
<glyph unicode="K" horiz-adv-x="1360" d="M1360 0h-352l-383 616l-131 -94v-522h-310v1462h310v-669l122 172l396 497h344l-510 -647z" />
<glyph unicode="L" horiz-adv-x="1157" d="M184 0v1462h310v-1206h593v-256h-903z" />
<glyph unicode="M" horiz-adv-x="1931" d="M803 0l-352 1147h-9q19 -350 19 -467v-680h-277v1462h422l346 -1118h6l367 1118h422v-1462h-289v692q0 49 1.5 113t13.5 340h-9l-377 -1145h-284z" />
<glyph unicode="N" horiz-adv-x="1665" d="M1481 0h-394l-636 1106h-9q19 -293 19 -418v-688h-277v1462h391l635 -1095h7q-15 285 -15 403v692h279v-1462z" />
<glyph unicode="O" horiz-adv-x="1630" d="M1511 733q0 -363 -180 -558t-516 -195t-516 195t-180 560t180.5 557.5t517.5 192.5t515.5 -194t178.5 -558zM444 733q0 -245 93 -369t278 -124q371 0 371 493q0 494 -369 494q-185 0 -279 -124.5t-94 -369.5z" />
<glyph unicode="P" horiz-adv-x="1286" d="M494 774h102q143 0 214 56.5t71 164.5q0 109 -59.5 161t-186.5 52h-141v-434zM1194 1006q0 -236 -147.5 -361t-419.5 -125h-133v-520h-310v1462h467q266 0 404.5 -114.5t138.5 -341.5z" />
<glyph unicode="Q" horiz-adv-x="1630" d="M1511 733q0 -258 -91.5 -432.5t-268.5 -255.5l352 -393h-397l-268 328h-23q-336 0 -516 195t-180 560t180.5 557.5t517.5 192.5t515.5 -194t178.5 -558zM444 733q0 -245 93 -369t278 -124q371 0 371 493q0 494 -369 494q-185 0 -279 -124.5t-94 -369.5z" />
<glyph unicode="R" horiz-adv-x="1352" d="M494 813h100q147 0 217 49t70 154q0 104 -71.5 148t-221.5 44h-94v-395zM494 561v-561h-310v1462h426q298 0 441 -108.5t143 -329.5q0 -129 -71 -229.5t-201 -157.5q330 -493 430 -637h-344l-349 561h-165z" />
<glyph unicode="S" horiz-adv-x="1128" d="M1047 406q0 -198 -142.5 -312t-396.5 -114q-234 0 -414 88v288q148 -66 250.5 -93t187.5 -27q102 0 156.5 39t54.5 116q0 43 -24 76.5t-70.5 64.5t-189.5 99q-134 63 -201 121t-107 135t-40 180q0 194 131.5 305t363.5 111q114 0 217.5 -27t216.5 -76l-100 -241 q-117 48 -193.5 67t-150.5 19q-88 0 -135 -41t-47 -107q0 -41 19 -71.5t60.5 -59t196.5 -102.5q205 -98 281 -196.5t76 -241.5z" />
<glyph unicode="T" horiz-adv-x="1186" d="M748 0h-310v1204h-397v258h1104v-258h-397v-1204z" />
<glyph unicode="U" horiz-adv-x="1548" d="M1374 1462v-946q0 -162 -72.5 -284t-209.5 -187t-324 -65q-282 0 -438 144.5t-156 395.5v942h309v-895q0 -169 68 -248t225 -79q152 0 220.5 79.5t68.5 249.5v893h309z" />
<glyph unicode="V" horiz-adv-x="1331" d="M1018 1462h313l-497 -1462h-338l-496 1462h313l275 -870q23 -77 47.5 -179.5t30.5 -142.5q11 92 75 322z" />
<glyph unicode="W" horiz-adv-x="1980" d="M1608 0h-353l-198 768q-11 41 -37.5 169.5t-30.5 172.5q-6 -54 -30 -173.5t-37 -170.5l-197 -766h-352l-373 1462h305l187 -798q49 -221 71 -383q6 57 27.5 176.5t40.5 185.5l213 819h293l213 -819q14 -55 35 -168t32 -194q10 78 32 194.5t40 188.5l186 798h305z" />
<glyph unicode="X" horiz-adv-x="1366" d="M1366 0h-354l-340 553l-340 -553h-332l485 754l-454 708h342l315 -526l309 526h334l-459 -725z" />
<glyph unicode="Y" horiz-adv-x="1278" d="M639 860l305 602h334l-485 -893v-569h-308v559l-485 903h336z" />
<glyph unicode="Z" horiz-adv-x="1186" d="M1137 0h-1088v201l701 1005h-682v256h1050v-200l-700 -1006h719v-256z" />
<glyph unicode="[" horiz-adv-x="678" d="M627 -324h-484v1786h484v-211h-224v-1364h224v-211z" />
<glyph unicode="\" horiz-adv-x="846" d="M289 1462l545 -1462h-277l-545 1462h277z" />
<glyph unicode="]" horiz-adv-x="678" d="M51 -113h223v1364h-223v211h484v-1786h-484v211z" />
<glyph unicode="^" horiz-adv-x="1090" d="M8 520l438 950h144l495 -950h-239l-322 643l-280 -643h-236z" />
<glyph unicode="_" horiz-adv-x="842" d="M846 -324h-850v140h850v-140z" />
<glyph unicode="`" horiz-adv-x="1243" d="M707 1241q-63 44 -185 142.5t-190 164.5v21h342q63 -101 235 -301v-27h-202z" />
<glyph unicode="a" horiz-adv-x="1237" d="M870 0l-59 152h-8q-77 -97 -158.5 -134.5t-212.5 -37.5q-161 0 -253.5 92t-92.5 262q0 178 124.5 262.5t375.5 93.5l194 6v49q0 170 -174 170q-134 0 -315 -81l-101 206q193 101 428 101q225 0 345 -98t120 -298v-745h-213zM780 518l-118 -4q-133 -4 -198 -48t-65 -134 q0 -129 148 -129q106 0 169.5 61t63.5 162v92z" />
<glyph unicode="b" horiz-adv-x="1296" d="M782 1139q198 0 310 -154.5t112 -423.5q0 -277 -115.5 -429t-314.5 -152q-197 0 -309 143h-21l-51 -123h-233v1556h305v-362q0 -69 -12 -221h12q107 166 317 166zM684 895q-113 0 -165 -69.5t-54 -229.5v-33q0 -180 53.5 -258t169.5 -78q94 0 149.5 86.5t55.5 251.5 t-56 247.5t-153 82.5z" />
<glyph unicode="c" horiz-adv-x="1053" d="M614 -20q-522 0 -522 573q0 285 142 435.5t407 150.5q194 0 348 -76l-90 -236q-72 29 -134 47.5t-124 18.5q-238 0 -238 -338q0 -328 238 -328q88 0 163 23.5t150 73.5v-261q-74 -47 -149.5 -65t-190.5 -18z" />
<glyph unicode="d" horiz-adv-x="1296" d="M514 -20q-197 0 -309.5 153t-112.5 424q0 275 114.5 428.5t315.5 153.5q211 0 322 -164h10q-23 125 -23 223v358h306v-1556h-234l-59 145h-13q-104 -165 -317 -165zM621 223q117 0 171.5 68t59.5 231v33q0 180 -55.5 258t-180.5 78q-102 0 -158.5 -86.5t-56.5 -251.5 t57 -247.5t163 -82.5z" />
<glyph unicode="e" horiz-adv-x="1210" d="M623 922q-97 0 -152 -61.5t-63 -174.5h428q-2 113 -59 174.5t-154 61.5zM666 -20q-270 0 -422 149t-152 422q0 281 140.5 434.5t388.5 153.5q237 0 369 -135t132 -373v-148h-721q5 -130 77 -203t202 -73q101 0 191 21t188 67v-236q-80 -40 -171 -59.5t-222 -19.5z" />
<glyph unicode="f" horiz-adv-x="793" d="M778 889h-264v-889h-305v889h-168v147l168 82v82q0 191 94 279t301 88q158 0 281 -47l-78 -224q-92 29 -170 29q-65 0 -94 -38.5t-29 -98.5v-70h264v-229z" />
<glyph unicode="g" horiz-adv-x="1157" d="M1133 1118v-155l-175 -45q48 -75 48 -168q0 -180 -125.5 -280.5t-348.5 -100.5l-55 3l-45 5q-47 -36 -47 -80q0 -66 168 -66h190q184 0 280.5 -79t96.5 -232q0 -196 -163.5 -304t-469.5 -108q-234 0 -357.5 81.5t-123.5 228.5q0 101 63 169t185 97q-47 20 -82 65.5 t-35 96.5q0 64 37 106.5t107 83.5q-88 38 -139.5 122t-51.5 198q0 183 119 283t340 100q47 0 111.5 -8.5t82.5 -12.5h390zM270 -158q0 -63 60.5 -99t169.5 -36q164 0 257 45t93 123q0 63 -55 87t-170 24h-158q-84 0 -140.5 -39.5t-56.5 -104.5zM381 752q0 -91 41.5 -144 t126.5 -53q86 0 126 53t40 144q0 202 -166 202q-168 0 -168 -202z" />
<glyph unicode="h" horiz-adv-x="1346" d="M1192 0h-305v653q0 242 -180 242q-128 0 -185 -87t-57 -282v-526h-305v1556h305v-317q0 -37 -7 -174l-7 -90h16q102 164 324 164q197 0 299 -106t102 -304v-729z" />
<glyph unicode="i" horiz-adv-x="625" d="M147 1407q0 149 166 149t166 -149q0 -71 -41.5 -110.5t-124.5 -39.5q-166 0 -166 150zM465 0h-305v1118h305v-1118z" />
<glyph unicode="j" horiz-adv-x="625" d="M70 -492q-117 0 -201 25v240q70 -19 143 -19q77 0 112.5 43t35.5 127v1194h305v-1239q0 -178 -103 -274.5t-292 -96.5zM147 1407q0 149 166 149t166 -149q0 -71 -41.5 -110.5t-124.5 -39.5q-166 0 -166 150z" />
<glyph unicode="k" horiz-adv-x="1270" d="M453 608l133 170l313 340h344l-444 -485l471 -633h-352l-322 453l-131 -105v-348h-305v1556h305v-694l-16 -254h4z" />
<glyph unicode="l" horiz-adv-x="625" d="M465 0h-305v1556h305v-1556z" />
<glyph unicode="m" horiz-adv-x="2011" d="M1161 0h-305v653q0 121 -40.5 181.5t-127.5 60.5q-117 0 -170 -86t-53 -283v-526h-305v1118h233l41 -143h17q45 77 130 120.5t195 43.5q251 0 340 -164h27q45 78 132.5 121t197.5 43q190 0 287.5 -97.5t97.5 -312.5v-729h-306v653q0 121 -40.5 181.5t-127.5 60.5 q-112 0 -167.5 -80t-55.5 -254v-561z" />
<glyph unicode="n" horiz-adv-x="1346" d="M1192 0h-305v653q0 121 -43 181.5t-137 60.5q-128 0 -185 -85.5t-57 -283.5v-526h-305v1118h233l41 -143h17q51 81 140.5 122.5t203.5 41.5q195 0 296 -105.5t101 -304.5v-729z" />
<glyph unicode="o" horiz-adv-x="1268" d="M403 561q0 -166 54.5 -251t177.5 -85q122 0 175.5 84.5t53.5 251.5q0 166 -54 249t-177 83q-122 0 -176 -82.5t-54 -249.5zM1176 561q0 -273 -144 -427t-401 -154q-161 0 -284 70.5t-189 202.5t-66 308q0 274 143 426t402 152q161 0 284 -70t189 -201t66 -307z" />
<glyph unicode="p" horiz-adv-x="1296" d="M774 -20q-197 0 -309 143h-16q16 -140 16 -162v-453h-305v1610h248l43 -145h14q107 166 317 166q198 0 310 -153t112 -425q0 -179 -52.5 -311t-149.5 -201t-228 -69zM684 895q-113 0 -165 -69.5t-54 -229.5v-33q0 -180 53.5 -258t169.5 -78q205 0 205 338 q0 165 -50.5 247.5t-158.5 82.5z" />
<glyph unicode="q" horiz-adv-x="1296" d="M623 219q116 0 170 66.5t59 232.5v37q0 180 -55.5 258t-178.5 78q-215 0 -215 -338q0 -168 53.5 -251t166.5 -83zM514 -20q-198 0 -310 152.5t-112 424.5q0 274 114.5 428t313.5 154q106 0 185 -40t139 -124h8l27 143h258v-1610h-306v469q0 61 13 168h-13 q-49 -81 -130 -123t-187 -42z" />
<glyph unicode="r" horiz-adv-x="930" d="M784 1139q62 0 103 -9l-23 -286q-37 10 -90 10q-146 0 -227.5 -75t-81.5 -210v-569h-305v1118h231l45 -188h15q52 94 140.5 151.5t192.5 57.5z" />
<glyph unicode="s" horiz-adv-x="1018" d="M940 332q0 -172 -119.5 -262t-357.5 -90q-122 0 -208 16.5t-161 48.5v252q85 -40 191.5 -67t187.5 -27q166 0 166 96q0 36 -22 58.5t-76 51t-144 66.5q-129 54 -189.5 100t-88 105.5t-27.5 146.5q0 149 115.5 230.5t327.5 81.5q202 0 393 -88l-92 -220q-84 36 -157 59 t-149 23q-135 0 -135 -73q0 -41 43.5 -71t190.5 -89q131 -53 192 -99t90 -106t29 -143z" />
<glyph unicode="t" horiz-adv-x="889" d="M631 223q80 0 192 35v-227q-114 -51 -280 -51q-183 0 -266.5 92.5t-83.5 277.5v539h-146v129l168 102l88 236h195v-238h313v-229h-313v-539q0 -65 36.5 -96t96.5 -31z" />
<glyph unicode="u" horiz-adv-x="1346" d="M952 0l-41 143h-16q-49 -78 -139 -120.5t-205 -42.5q-197 0 -297 105.5t-100 303.5v729h305v-653q0 -121 43 -181.5t137 -60.5q128 0 185 85.5t57 283.5v526h305v-1118h-234z" />
<glyph unicode="v" horiz-adv-x="1165" d="M426 0l-426 1118h319l216 -637q36 -121 45 -229h6q5 96 45 229l215 637h319l-426 -1118h-313z" />
<glyph unicode="w" horiz-adv-x="1753" d="M1079 0l-86 391l-116 494h-7l-204 -885h-328l-318 1118h304l129 -495q31 -133 63 -367h6q4 76 35 241l16 85l138 536h336l131 -536q4 -22 12.5 -65t16.5 -91.5t14.5 -95t7.5 -74.5h6q9 72 32 197.5t33 169.5l134 495h299l-322 -1118h-332z" />
<glyph unicode="x" horiz-adv-x="1184" d="M389 571l-360 547h346l217 -356l219 356h346l-364 -547l381 -571h-347l-235 383l-236 -383h-346z" />
<glyph unicode="y" horiz-adv-x="1165" d="M0 1118h334l211 -629q27 -82 37 -194h6q11 103 43 194l207 629h327l-473 -1261q-65 -175 -185.5 -262t-281.5 -87q-79 0 -155 17v242q55 -13 120 -13q81 0 141.5 49.5t94.5 149.5l18 55z" />
<glyph unicode="z" horiz-adv-x="999" d="M938 0h-883v180l518 705h-487v233h834v-198l-504 -687h522v-233z" />
<glyph unicode="{" horiz-adv-x="807" d="M287 270q0 87 -65.5 133t-190.5 46v239q126 0 191 44t65 126v8v318q0 153 97 215.5t341 62.5v-225q-99 -3 -136.5 -38t-37.5 -103v-299q-6 -188 -234 -222v-12q234 -35 234 -212v-9v-299q0 -68 37 -103t137 -38v-226q-244 0 -341 62.5t-97 216.5v315z" />
<glyph unicode="|" horiz-adv-x="1128" d="M455 1550h219v-2015h-219v2015z" />
<glyph unicode="}" horiz-adv-x="807" d="M520 -45q0 -112 -41 -169t-135.5 -83.5t-261.5 -26.5v226q99 2 136.5 36t37.5 105v299v11q0 86 59 139.5t174 70.5v12q-227 34 -233 222v299q0 70 -37 104t-137 37v225q167 0 262 -26.5t135.5 -84t40.5 -167.5v-318v-10q0 -84 61.5 -126t194.5 -42v-239 q-125 0 -190.5 -41t-65.5 -138v-315z" />
<glyph unicode="~" d="M322 672q-55 0 -117.5 -33.5t-116.5 -87.5v231q103 109 256 109q73 0 137.5 -16t139.5 -48q129 -55 227 -55q53 0 116 32t117 89v-231q-101 -109 -256 -109q-66 0 -126 13t-150 50q-131 56 -227 56z" />
<glyph unicode="&#xa1;" horiz-adv-x="586" d="M168 606h244l51 -975h-346zM467 948q0 -84 -45 -127t-131 -43q-83 0 -128.5 44t-45.5 126q0 81 46.5 125.5t127.5 44.5q84 0 130 -44t46 -126z" />
<glyph unicode="&#xa2;" d="M563 176q-420 59 -420 565q0 261 104.5 403t315.5 173v166h178v-158q166 -9 299 -74l-90 -235q-72 29 -134 47t-124 18q-121 0 -179 -83.5t-58 -254.5q0 -327 237 -327q82 0 148 15.5t166 60.5v-254q-127 -61 -265 -70v-188h-178v196z" />
<glyph unicode="&#xa3;" d="M700 1483q195 0 390 -82l-93 -230q-157 64 -272 64q-78 0 -120 -44.5t-42 -127.5v-193h375v-219h-375v-143q0 -170 -151 -248h718v-260h-1048v248q103 44 141.5 101t38.5 157v145h-178v219h178v195q0 201 114.5 309.5t323.5 108.5z" />
<glyph unicode="&#xa4;" d="M188 723q0 102 54 197l-129 127l147 147l127 -127q91 53 197 53q105 0 196 -55l127 129l150 -143l-129 -129q53 -89 53 -199q0 -107 -53 -199l125 -125l-146 -145l-127 125q-95 -51 -196 -51q-115 0 -199 51l-125 -123l-145 145l127 125q-54 93 -54 197zM395 723 q0 -77 54.5 -132.5t134.5 -55.5q81 0 136.5 55t55.5 133q0 80 -56.5 135t-135.5 55q-78 0 -133.5 -56t-55.5 -134z" />
<glyph unicode="&#xa5;" d="M584 860l264 602h313l-383 -747h195v-178h-246v-138h246v-178h-246v-221h-287v221h-247v178h247v138h-247v178h190l-377 747h316z" />
<glyph unicode="&#xa6;" horiz-adv-x="1128" d="M455 1550h219v-815h-219v815zM455 350h219v-815h-219v815z" />
<glyph unicode="&#xa7;" horiz-adv-x="995" d="M121 805q0 79 36 144.5t97 105.5q-133 84 -133 233q0 131 111.5 210t293.5 79q170 0 363 -84l-82 -190q-68 32 -138.5 57.5t-148.5 25.5q-81 0 -118 -23t-37 -71q0 -49 49.5 -86t163.5 -82q163 -64 240 -148.5t77 -193.5q0 -177 -125 -260q62 -40 93.5 -92.5t31.5 -126.5 q0 -148 -119.5 -235.5t-320.5 -87.5q-203 0 -349 79v207q81 -41 180 -69.5t169 -28.5q194 0 194 117q0 39 -18.5 63t-63.5 49.5t-125 59.5q-183 74 -252 152.5t-69 195.5zM344 827q0 -67 65 -119t181 -98q78 57 78 146q0 68 -50.5 115t-183.5 96q-37 -14 -63.5 -53.5 t-26.5 -86.5z" />
<glyph unicode="&#xa8;" horiz-adv-x="1243" d="M279 1405q0 65 37.5 100t101.5 35q66 0 103.5 -37t37.5 -98q0 -60 -38 -96.5t-103 -36.5q-64 0 -101.5 35t-37.5 98zM682 1405q0 70 40.5 102.5t100.5 32.5q65 0 103.5 -36t38.5 -99q0 -61 -39 -97t-103 -36q-60 0 -100.5 32.5t-40.5 100.5z" />
<glyph unicode="&#xa9;" horiz-adv-x="1704" d="M895 1010q-97 0 -150 -74t-53 -205q0 -280 203 -280q57 0 123 15t123 44v-191q-120 -57 -252 -57q-204 0 -316 125t-112 346q0 220 110.5 342.5t309.5 122.5q149 0 305 -78l-74 -168q-113 58 -217 58zM100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275 t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM242 731q0 -164 82 -305.5t224 -223t304 -81.5q164 0 305.5 82t223 224t81.5 304q0 164 -82 305.5t-224 223t-304 81.5q-164 0 -305.5 -82t-223 -224t-81.5 -304z" />
<glyph unicode="&#xaa;" horiz-adv-x="784" d="M561 764l-31 110q-43 -58 -105 -90t-136 -32q-117 0 -179.5 58.5t-62.5 164.5q0 109 82.5 163.5t267.5 63.5l99 4q0 117 -127 117q-81 0 -217 -61l-66 135q66 32 145.5 57t178.5 25q137 0 211.5 -71t74.5 -202v-442h-135zM252 977q0 -38 23 -56t55 -18q77 0 121.5 41.5 t44.5 106.5v36l-99 -6q-145 -10 -145 -104z" />
<glyph unicode="&#xab;" horiz-adv-x="1260" d="M82 573l371 455l219 -119l-279 -348l279 -348l-219 -119l-371 453v26zM588 573l370 455l220 -119l-279 -348l279 -348l-220 -119l-370 453v26z" />
<glyph unicode="&#xac;" d="M1081 248h-219v364h-774v219h993v-583z" />
<glyph unicode="&#xad;" horiz-adv-x="659" d="M61 424zM61 424v250h537v-250h-537z" />
<glyph unicode="&#xae;" horiz-adv-x="1704" d="M1157 905q0 -170 -143 -233l237 -400h-254l-178 338h-47v-338h-229v916h264q181 0 265.5 -70t84.5 -213zM772 778h31q66 0 94.5 28.5t28.5 94.5q0 65 -28 92t-97 27h-29v-242zM100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370 t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM242 731q0 -164 82 -305.5t224 -223t304 -81.5q164 0 305.5 82t223 224t81.5 304q0 164 -82 305.5t-224 223t-304 81.5q-164 0 -305.5 -82t-223 -224t-81.5 -304z" />
<glyph unicode="&#xaf;" horiz-adv-x="1024" d="M1030 1556h-1036v201h1036v-201z" />
<glyph unicode="&#xb0;" horiz-adv-x="877" d="M92 1137q0 92 46 172t126 127t174 47q92 0 172.5 -46t127 -127t46.5 -173q0 -93 -46.5 -173.5t-126.5 -125.5t-173 -45q-145 0 -245.5 99.5t-100.5 244.5zM283 1137q0 -64 44.5 -109t110.5 -45t111 46t45 108q0 63 -45.5 110t-110.5 47q-64 0 -109.5 -46t-45.5 -111z" />
<glyph unicode="&#xb1;" d="M475 674h-387v219h387v389h219v-389h387v-219h-387v-385h-219v385zM88 0v219h993v-219h-993z" />
<glyph unicode="&#xb2;" horiz-adv-x="776" d="M702 586h-647v168l224 219q102 100 130.5 144.5t28.5 94.5q0 38 -24 58t-64 20q-81 0 -180 -88l-123 152q147 129 336 129q137 0 216 -66.5t79 -183.5q0 -85 -47 -160t-176 -192l-105 -95h352v-200z" />
<glyph unicode="&#xb3;" horiz-adv-x="776" d="M666 1249q0 -143 -170 -198v-13q94 -20 146 -75t52 -134q0 -121 -88 -190.5t-274 -69.5q-143 0 -273 70v190q148 -90 271 -90q143 0 143 107q0 53 -44 79.5t-122 26.5h-112v160h92q83 0 123.5 26t40.5 83q0 38 -25 63t-76 25q-47 0 -89 -19t-99 -59l-101 141 q62 47 137.5 78t178.5 31q127 0 208 -64t81 -168z" />
<glyph unicode="&#xb4;" horiz-adv-x="1243" d="M332 1241v27q172 200 235 301h342v-21q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z" />
<glyph unicode="&#xb5;" horiz-adv-x="1352" d="M465 465q0 -121 44 -181.5t138 -60.5q126 0 183 86.5t57 282.5v526h305v-1118h-231l-43 150h-15q-42 -85 -102 -127.5t-148 -42.5q-62 0 -114 23t-84 67l5 -85l5 -157v-320h-305v1610h305v-653z" />
<glyph unicode="&#xb6;" horiz-adv-x="1341" d="M1167 -260h-161v1616h-166v-1616h-162v819q-62 -18 -146 -18q-216 0 -317.5 125t-101.5 376q0 260 109 387t341 127h604v-1816z" />
<glyph unicode="&#xb7;" horiz-adv-x="584" d="M117 723q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -81 -46.5 -125.5t-127.5 -44.5q-84 0 -130 44t-46 126z" />
<glyph unicode="&#xb8;" horiz-adv-x="420" d="M418 -250q0 -128 -75.5 -185t-233.5 -57q-78 0 -146 21v168q27 -7 72.5 -14t70.5 -7q72 0 72 62q0 83 -166 108l78 154h193l-27 -61q74 -24 118 -74.5t44 -114.5z" />
<glyph unicode="&#xb9;" horiz-adv-x="776" d="M584 586h-238v446l3 112l5 95q-27 -36 -75 -78l-78 -61l-109 127l301 235h191v-876z" />
<glyph unicode="&#xba;" horiz-adv-x="795" d="M737 1116q0 -171 -91.5 -267.5t-250.5 -96.5q-153 0 -245.5 98.5t-92.5 265.5q0 169 89.5 266t252.5 97q152 0 245 -98.5t93 -264.5zM260 1116q0 -100 32.5 -150.5t104.5 -50.5t103.5 50.5t31.5 150.5t-31.5 149.5t-103.5 49.5t-104.5 -49.5t-32.5 -149.5z" />
<glyph unicode="&#xbb;" horiz-adv-x="1260" d="M1178 547l-371 -453l-219 119l278 348l-278 348l219 119l371 -455v-26zM672 547l-371 -453l-219 119l278 348l-278 348l219 119l371 -455v-26z" />
<glyph unicode="&#xbc;" horiz-adv-x="1804" d="M46 0zM538 586h-238v446l3 112l5 95q-27 -36 -75 -78l-78 -61l-109 127l301 235h191v-876zM1370 1462l-811 -1462h-239l811 1462h239zM1682 152h-125v-151h-238v151h-383v154l385 577h236v-563h125v-168zM1319 320v164q0 86 6 184q-9 -26 -35.5 -80t-41.5 -77l-127 -191 h198z" />
<glyph unicode="&#xbd;" horiz-adv-x="1804" d="M46 0zM538 586h-238v446l3 112l5 95q-27 -36 -75 -78l-78 -61l-109 127l301 235h191v-876zM1370 1462l-811 -1462h-239l811 1462h239zM1716 1h-647v168l224 219q102 100 130.5 144.5t28.5 94.5q0 38 -24 58t-64 20q-81 0 -180 -88l-123 152q147 129 336 129 q137 0 216 -66.5t79 -183.5q0 -85 -47 -160t-176 -192l-105 -95h352v-200z" />
<glyph unicode="&#xbe;" horiz-adv-x="1804" d="M90 0zM697 1249q0 -143 -170 -198v-13q94 -20 146 -75t52 -134q0 -121 -88 -190.5t-274 -69.5q-143 0 -273 70v190q148 -90 271 -90q143 0 143 107q0 53 -44 79.5t-122 26.5h-112v160h92q83 0 123.5 26t40.5 83q0 38 -25 63t-76 25q-47 0 -89 -19t-99 -59l-101 141 q62 47 137.5 78t178.5 31q127 0 208 -64t81 -168zM1441 1462l-811 -1462h-239l811 1462h239zM1712 152h-125v-151h-238v151h-383v154l385 577h236v-563h125v-168zM1349 320v164q0 86 6 184q-9 -26 -35.5 -80t-41.5 -77l-127 -191h198z" />
<glyph unicode="&#xbf;" horiz-adv-x="977" d="M713 606v-74q0 -98 -44.5 -169t-152.5 -148q-109 -78 -137.5 -122t-28.5 -107q0 -57 43.5 -94t132.5 -37q79 0 169 29t186 71l102 -221q-98 -56 -221.5 -90.5t-229.5 -34.5q-220 0 -345.5 96.5t-125.5 265.5q0 108 48.5 187t191.5 184q95 70 121.5 107t26.5 98v59h264z M745 948q0 -84 -45 -127t-131 -43q-83 0 -128.5 44t-45.5 126q0 81 46.5 125.5t127.5 44.5q84 0 130 -44t46 -126z" />
<glyph unicode="&#xc0;" horiz-adv-x="1413" d="M0 0zM1079 0l-106 348h-533l-106 -348h-334l516 1468h379l518 -1468h-334zM899 608q-147 473 -165.5 535t-26.5 98q-33 -128 -189 -633h381zM713 1579q-63 44 -185 142.5t-190 164.5v21h342q63 -101 235 -301v-27h-202z" />
<glyph unicode="&#xc1;" horiz-adv-x="1413" d="M0 0zM1079 0l-106 348h-533l-106 -348h-334l516 1468h379l518 -1468h-334zM899 608q-147 473 -165.5 535t-26.5 98q-33 -128 -189 -633h381zM541 1579v27q172 200 235 301h342v-21q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z" />
<glyph unicode="&#xc2;" horiz-adv-x="1413" d="M0 0zM1079 0l-106 348h-533l-106 -348h-334l516 1468h379l518 -1468h-334zM899 608q-147 473 -165.5 535t-26.5 98q-33 -128 -189 -633h381zM938 1579q-157 93 -234 176q-78 -81 -229 -176h-203v27q189 189 256 301h357q31 -52 107.5 -141.5t148.5 -159.5v-27h-203z" />
<glyph unicode="&#xc3;" horiz-adv-x="1413" d="M0 0zM1079 0l-106 348h-533l-106 -348h-334l516 1468h379l518 -1468h-334zM899 608q-147 473 -165.5 535t-26.5 98q-33 -128 -189 -633h381zM543 1684q-31 0 -59.5 -26.5t-41.5 -80.5h-149q11 145 82.5 227t189.5 82q41 0 80.5 -16.5t78 -36t75.5 -35.5t73 -16 q31 0 59.5 26t41.5 80h149q-11 -145 -83.5 -227t-188.5 -82q-41 0 -80.5 16.5t-78 36t-75.5 36t-73 16.5z" />
<glyph unicode="&#xc4;" horiz-adv-x="1413" d="M0 0zM1079 0l-106 348h-533l-106 -348h-334l516 1468h379l518 -1468h-334zM899 608q-147 473 -165.5 535t-26.5 98q-33 -128 -189 -633h381zM365 1743q0 65 37.5 100t101.5 35q66 0 103.5 -37t37.5 -98q0 -60 -38 -96.5t-103 -36.5q-64 0 -101.5 35t-37.5 98zM768 1743 q0 70 40.5 102.5t100.5 32.5q65 0 103.5 -36t38.5 -99q0 -61 -39 -97t-103 -36q-60 0 -100.5 32.5t-40.5 100.5z" />
<glyph unicode="&#xc5;" horiz-adv-x="1413" d="M0 0zM1079 0l-106 348h-533l-106 -348h-334l516 1468h379l518 -1468h-334zM899 608q-147 473 -165.5 535t-26.5 98q-33 -128 -189 -633h381zM959 1567q0 -108 -71 -174t-183 -66t-180 64t-68 174q0 108 67.5 172.5t180.5 64.5q110 0 182 -66t72 -169zM801 1565 q0 45 -27 70.5t-69 25.5t-69 -25.5t-27 -70.5t24 -71t72 -26q42 0 69 26t27 71z" />
<glyph unicode="&#xc6;" horiz-adv-x="1950" d="M1829 0h-873v348h-491l-150 -348h-315l655 1462h1174v-254h-563v-321h526v-254h-526v-377h563v-256zM578 608h378v590h-127z" />
<glyph unicode="&#xc7;" horiz-adv-x="1305" d="M119 0zM805 1225q-175 0 -271 -131.5t-96 -366.5q0 -489 367 -489q154 0 373 77v-260q-180 -75 -402 -75q-319 0 -488 193.5t-169 555.5q0 228 83 399.5t238.5 263t364.5 91.5q213 0 428 -103l-100 -252q-82 39 -165 68t-163 29zM959 -250q0 -128 -75.5 -185t-233.5 -57 q-78 0 -146 21v168q27 -7 72.5 -14t70.5 -7q72 0 72 62q0 83 -166 108l78 154h193l-27 -61q74 -24 118 -74.5t44 -114.5z" />
<glyph unicode="&#xc8;" horiz-adv-x="1147" d="M184 0zM1026 0h-842v1462h842v-254h-532v-321h495v-254h-495v-377h532v-256zM634 1579q-63 44 -185 142.5t-190 164.5v21h342q63 -101 235 -301v-27h-202z" />
<glyph unicode="&#xc9;" horiz-adv-x="1147" d="M184 0zM1026 0h-842v1462h842v-254h-532v-321h495v-254h-495v-377h532v-256zM424 1579v27q172 200 235 301h342v-21q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z" />
<glyph unicode="&#xca;" horiz-adv-x="1147" d="M175 0zM1026 0h-842v1462h842v-254h-532v-321h495v-254h-495v-377h532v-256zM841 1579q-157 93 -234 176q-78 -81 -229 -176h-203v27q189 189 256 301h357q31 -52 107.5 -141.5t148.5 -159.5v-27h-203z" />
<glyph unicode="&#xcb;" horiz-adv-x="1147" d="M184 0zM1026 0h-842v1462h842v-254h-532v-321h495v-254h-495v-377h532v-256zM272 1743q0 65 37.5 100t101.5 35q66 0 103.5 -37t37.5 -98q0 -60 -38 -96.5t-103 -36.5q-64 0 -101.5 35t-37.5 98zM675 1743q0 70 40.5 102.5t100.5 32.5q65 0 103.5 -36t38.5 -99 q0 -61 -39 -97t-103 -36q-60 0 -100.5 32.5t-40.5 100.5z" />
<glyph unicode="&#xcc;" horiz-adv-x="678" d="M0 0zM184 0v1462h310v-1462h-310zM317 1579q-63 44 -185 142.5t-190 164.5v21h342q63 -101 235 -301v-27h-202z" />
<glyph unicode="&#xcd;" horiz-adv-x="678" d="M167 0zM184 0v1462h310v-1462h-310zM167 1579v27q172 200 235 301h342v-21q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z" />
<glyph unicode="&#xce;" horiz-adv-x="678" d="M0 0zM184 0v1462h310v-1462h-310zM570 1579q-157 93 -234 176q-78 -81 -229 -176h-203v27q189 189 256 301h357q31 -52 107.5 -141.5t148.5 -159.5v-27h-203z" />
<glyph unicode="&#xcf;" horiz-adv-x="678" d="M0 0zM184 0v1462h310v-1462h-310zM-3 1743q0 65 37.5 100t101.5 35q66 0 103.5 -37t37.5 -98q0 -60 -38 -96.5t-103 -36.5q-64 0 -101.5 35t-37.5 98zM400 1743q0 70 40.5 102.5t100.5 32.5q65 0 103.5 -36t38.5 -99q0 -61 -39 -97t-103 -36q-60 0 -100.5 32.5 t-40.5 100.5z" />
<glyph unicode="&#xd0;" horiz-adv-x="1516" d="M47 850h137v612h459q358 0 556 -189t198 -528q0 -361 -205.5 -553t-593.5 -192h-414v596h-137v254zM1075 737q0 232 -104 351.5t-314 119.5h-163v-358h237v-254h-237v-340h131q450 0 450 481z" />
<glyph unicode="&#xd1;" horiz-adv-x="1665" d="M184 0zM1481 0h-394l-636 1106h-9q19 -293 19 -418v-688h-277v1462h391l635 -1095h7q-15 285 -15 403v692h279v-1462zM668 1684q-31 0 -59.5 -26.5t-41.5 -80.5h-149q11 145 82.5 227t189.5 82q41 0 80.5 -16.5t78 -36t75.5 -35.5t73 -16q31 0 59.5 26t41.5 80h149 q-11 -145 -83.5 -227t-188.5 -82q-41 0 -80.5 16.5t-78 36t-75.5 36t-73 16.5z" />
<glyph unicode="&#xd2;" horiz-adv-x="1630" d="M119 0zM1511 733q0 -363 -180 -558t-516 -195t-516 195t-180 560t180.5 557.5t517.5 192.5t515.5 -194t178.5 -558zM444 733q0 -245 93 -369t278 -124q371 0 371 493q0 494 -369 494q-185 0 -279 -124.5t-94 -369.5zM824 1579q-63 44 -185 142.5t-190 164.5v21h342 q63 -101 235 -301v-27h-202z" />
<glyph unicode="&#xd3;" horiz-adv-x="1630" d="M119 0zM1511 733q0 -363 -180 -558t-516 -195t-516 195t-180 560t180.5 557.5t517.5 192.5t515.5 -194t178.5 -558zM444 733q0 -245 93 -369t278 -124q371 0 371 493q0 494 -369 494q-185 0 -279 -124.5t-94 -369.5zM658 1579v27q172 200 235 301h342v-21 q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z" />
<glyph unicode="&#xd4;" horiz-adv-x="1630" d="M119 0zM1511 733q0 -363 -180 -558t-516 -195t-516 195t-180 560t180.5 557.5t517.5 192.5t515.5 -194t178.5 -558zM444 733q0 -245 93 -369t278 -124q371 0 371 493q0 494 -369 494q-185 0 -279 -124.5t-94 -369.5zM1047 1579q-157 93 -234 176q-78 -81 -229 -176h-203 v27q189 189 256 301h357q31 -52 107.5 -141.5t148.5 -159.5v-27h-203z" />
<glyph unicode="&#xd5;" horiz-adv-x="1630" d="M119 0zM1511 733q0 -363 -180 -558t-516 -195t-516 195t-180 560t180.5 557.5t517.5 192.5t515.5 -194t178.5 -558zM444 733q0 -245 93 -369t278 -124q371 0 371 493q0 494 -369 494q-185 0 -279 -124.5t-94 -369.5zM652 1684q-31 0 -59.5 -26.5t-41.5 -80.5h-149 q11 145 82.5 227t189.5 82q41 0 80.5 -16.5t78 -36t75.5 -35.5t73 -16q31 0 59.5 26t41.5 80h149q-11 -145 -83.5 -227t-188.5 -82q-41 0 -80.5 16.5t-78 36t-75.5 36t-73 16.5z" />
<glyph unicode="&#xd6;" horiz-adv-x="1630" d="M119 0zM1511 733q0 -363 -180 -558t-516 -195t-516 195t-180 560t180.5 557.5t517.5 192.5t515.5 -194t178.5 -558zM444 733q0 -245 93 -369t278 -124q371 0 371 493q0 494 -369 494q-185 0 -279 -124.5t-94 -369.5zM474 1743q0 65 37.5 100t101.5 35q66 0 103.5 -37 t37.5 -98q0 -60 -38 -96.5t-103 -36.5q-64 0 -101.5 35t-37.5 98zM877 1743q0 70 40.5 102.5t100.5 32.5q65 0 103.5 -36t38.5 -99q0 -61 -39 -97t-103 -36q-60 0 -100.5 32.5t-40.5 100.5z" />
<glyph unicode="&#xd7;" d="M428 723l-299 301l152 154l301 -299l305 299l153 -150l-305 -305l301 -303l-149 -152l-305 301l-301 -299l-150 152z" />
<glyph unicode="&#xd8;" horiz-adv-x="1630" d="M1511 733q0 -363 -180 -558t-516 -195q-197 0 -336 65l-90 -135l-162 108l90 136q-198 194 -198 581q0 365 180.5 557.5t517.5 192.5q198 0 344 -70l84 125l160 -104l-88 -131q194 -194 194 -572zM444 733q0 -191 56 -307l506 756q-84 45 -189 45q-185 0 -279 -124.5 t-94 -369.5zM1186 733q0 180 -51 297l-500 -751q76 -39 180 -39q371 0 371 493z" />
<glyph unicode="&#xd9;" horiz-adv-x="1548" d="M174 0zM1374 1462v-946q0 -162 -72.5 -284t-209.5 -187t-324 -65q-282 0 -438 144.5t-156 395.5v942h309v-895q0 -169 68 -248t225 -79q152 0 220.5 79.5t68.5 249.5v893h309zM750 1579q-63 44 -185 142.5t-190 164.5v21h342q63 -101 235 -301v-27h-202z" />
<glyph unicode="&#xda;" horiz-adv-x="1548" d="M174 0zM1374 1462v-946q0 -162 -72.5 -284t-209.5 -187t-324 -65q-282 0 -438 144.5t-156 395.5v942h309v-895q0 -169 68 -248t225 -79q152 0 220.5 79.5t68.5 249.5v893h309zM602 1579v27q172 200 235 301h342v-21q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z" />
<glyph unicode="&#xdb;" horiz-adv-x="1548" d="M174 0zM1374 1462v-946q0 -162 -72.5 -284t-209.5 -187t-324 -65q-282 0 -438 144.5t-156 395.5v942h309v-895q0 -169 68 -248t225 -79q152 0 220.5 79.5t68.5 249.5v893h309zM1006 1579q-157 93 -234 176q-78 -81 -229 -176h-203v27q189 189 256 301h357 q31 -52 107.5 -141.5t148.5 -159.5v-27h-203z" />
<glyph unicode="&#xdc;" horiz-adv-x="1548" d="M174 0zM1374 1462v-946q0 -162 -72.5 -284t-209.5 -187t-324 -65q-282 0 -438 144.5t-156 395.5v942h309v-895q0 -169 68 -248t225 -79q152 0 220.5 79.5t68.5 249.5v893h309zM433 1743q0 65 37.5 100t101.5 35q66 0 103.5 -37t37.5 -98q0 -60 -38 -96.5t-103 -36.5 q-64 0 -101.5 35t-37.5 98zM836 1743q0 70 40.5 102.5t100.5 32.5q65 0 103.5 -36t38.5 -99q0 -61 -39 -97t-103 -36q-60 0 -100.5 32.5t-40.5 100.5z" />
<glyph unicode="&#xdd;" horiz-adv-x="1278" d="M0 0zM639 860l305 602h334l-485 -893v-569h-308v559l-485 903h336zM461 1579v27q172 200 235 301h342v-21q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z" />
<glyph unicode="&#xde;" horiz-adv-x="1286" d="M1194 770q0 -229 -142.5 -353t-404.5 -124h-153v-293h-310v1462h310v-229h178q254 0 388 -119t134 -344zM494 543h100q145 0 216 52.5t71 174.5q0 107 -63.5 159t-199.5 52h-124v-438z" />
<glyph unicode="&#xdf;" horiz-adv-x="1456" d="M1249 1241q0 -64 -21 -112.5t-53 -86.5t-69 -67t-69 -53t-53 -45t-21 -43q0 -27 26.5 -53t92.5 -66q146 -91 198.5 -140t78 -110t25.5 -139q0 -172 -116.5 -259t-343.5 -87q-99 0 -171 14.5t-132 48.5v242q53 -36 135.5 -61t146.5 -25q168 0 168 123q0 41 -16 66.5 t-57 55.5t-115 72q-126 72 -175 131.5t-49 140.5q0 64 35 117t105 102q77 55 108 95t31 86q0 60 -63.5 100.5t-163.5 40.5q-116 0 -181 -52.5t-65 -148.5v-1128h-305v1139q0 201 146.5 314.5t404.5 113.5q244 0 391 -88.5t147 -237.5z" />
<glyph unicode="&#xe0;" horiz-adv-x="1237" d="M86 0zM870 0l-59 152h-8q-77 -97 -158.5 -134.5t-212.5 -37.5q-161 0 -253.5 92t-92.5 262q0 178 124.5 262.5t375.5 93.5l194 6v49q0 170 -174 170q-134 0 -315 -81l-101 206q193 101 428 101q225 0 345 -98t120 -298v-745h-213zM780 518l-118 -4q-133 -4 -198 -48 t-65 -134q0 -129 148 -129q106 0 169.5 61t63.5 162v92zM614 1241q-63 44 -185 142.5t-190 164.5v21h342q63 -101 235 -301v-27h-202z" />
<glyph unicode="&#xe1;" horiz-adv-x="1237" d="M86 0zM870 0l-59 152h-8q-77 -97 -158.5 -134.5t-212.5 -37.5q-161 0 -253.5 92t-92.5 262q0 178 124.5 262.5t375.5 93.5l194 6v49q0 170 -174 170q-134 0 -315 -81l-101 206q193 101 428 101q225 0 345 -98t120 -298v-745h-213zM780 518l-118 -4q-133 -4 -198 -48 t-65 -134q0 -129 148 -129q106 0 169.5 61t63.5 162v92zM441 1241v27q172 200 235 301h342v-21q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z" />
<glyph unicode="&#xe2;" horiz-adv-x="1237" d="M86 0zM870 0l-59 152h-8q-77 -97 -158.5 -134.5t-212.5 -37.5q-161 0 -253.5 92t-92.5 262q0 178 124.5 262.5t375.5 93.5l194 6v49q0 170 -174 170q-134 0 -315 -81l-101 206q193 101 428 101q225 0 345 -98t120 -298v-745h-213zM780 518l-118 -4q-133 -4 -198 -48 t-65 -134q0 -129 148 -129q106 0 169.5 61t63.5 162v92zM843 1240q-157 93 -234 176q-78 -81 -229 -176h-203v27q189 189 256 301h357q31 -52 107.5 -141.5t148.5 -159.5v-27h-203z" />
<glyph unicode="&#xe3;" horiz-adv-x="1237" d="M86 0zM870 0l-59 152h-8q-77 -97 -158.5 -134.5t-212.5 -37.5q-161 0 -253.5 92t-92.5 262q0 178 124.5 262.5t375.5 93.5l194 6v49q0 170 -174 170q-134 0 -315 -81l-101 206q193 101 428 101q225 0 345 -98t120 -298v-745h-213zM780 518l-118 -4q-133 -4 -198 -48 t-65 -134q0 -129 148 -129q106 0 169.5 61t63.5 162v92zM467 1346q-31 0 -59.5 -26.5t-41.5 -80.5h-149q11 145 82.5 227t189.5 82q41 0 80.5 -16.5t78 -36t75.5 -35.5t73 -16q31 0 59.5 26t41.5 80h149q-11 -145 -83.5 -227t-188.5 -82q-41 0 -80.5 16.5t-78 36t-75.5 36 t-73 16.5z" />
<glyph unicode="&#xe4;" horiz-adv-x="1237" d="M86 0zM870 0l-59 152h-8q-77 -97 -158.5 -134.5t-212.5 -37.5q-161 0 -253.5 92t-92.5 262q0 178 124.5 262.5t375.5 93.5l194 6v49q0 170 -174 170q-134 0 -315 -81l-101 206q193 101 428 101q225 0 345 -98t120 -298v-745h-213zM780 518l-118 -4q-133 -4 -198 -48 t-65 -134q0 -129 148 -129q106 0 169.5 61t63.5 162v92zM285 1405q0 65 37.5 100t101.5 35q66 0 103.5 -37t37.5 -98q0 -60 -38 -96.5t-103 -36.5q-64 0 -101.5 35t-37.5 98zM688 1405q0 70 40.5 102.5t100.5 32.5q65 0 103.5 -36t38.5 -99q0 -61 -39 -97t-103 -36 q-60 0 -100.5 32.5t-40.5 100.5z" />
<glyph unicode="&#xe5;" horiz-adv-x="1237" d="M86 0zM870 0l-59 152h-8q-77 -97 -158.5 -134.5t-212.5 -37.5q-161 0 -253.5 92t-92.5 262q0 178 124.5 262.5t375.5 93.5l194 6v49q0 170 -174 170q-134 0 -315 -81l-101 206q193 101 428 101q225 0 345 -98t120 -298v-745h-213zM780 518l-118 -4q-133 -4 -198 -48 t-65 -134q0 -129 148 -129q106 0 169.5 61t63.5 162v92zM883 1479q0 -108 -71 -174t-183 -66t-180 64t-68 174q0 108 67.5 172.5t180.5 64.5q110 0 182 -66t72 -169zM725 1477q0 45 -27 70.5t-69 25.5t-69 -25.5t-27 -70.5t24 -71t72 -26q42 0 69 26t27 71z" />
<glyph unicode="&#xe6;" horiz-adv-x="1878" d="M1329 -20q-137 0 -249.5 50.5t-184.5 155.5q-98 -117 -196.5 -161.5t-256.5 -44.5q-161 0 -258.5 94.5t-97.5 259.5q0 178 121 262.5t362 93.5l191 6v84q0 69 -44.5 102t-121.5 33q-140 0 -305 -77l-99 202q189 101 422 101q227 0 342 -131q66 64 152.5 96.5t206.5 32.5 q221 0 349 -137.5t128 -370.5v-148h-723q5 -130 77 -203t202 -73q196 0 380 88v-236q-79 -39 -171 -59t-226 -20zM760 518l-113 -4q-124 -4 -186 -47.5t-62 -134.5q0 -129 140 -129q101 0 161 61t60 162v92zM1307 922q-217 0 -234 -236h430q-2 112 -55 174t-141 62z" />
<glyph unicode="&#xe7;" horiz-adv-x="1053" d="M92 0zM614 -20q-522 0 -522 573q0 285 142 435.5t407 150.5q194 0 348 -76l-90 -236q-72 29 -134 47.5t-124 18.5q-238 0 -238 -338q0 -328 238 -328q88 0 163 23.5t150 73.5v-261q-74 -47 -149.5 -65t-190.5 -18zM805 -250q0 -128 -75.5 -185t-233.5 -57q-78 0 -146 21 v168q27 -7 72.5 -14t70.5 -7q72 0 72 62q0 83 -166 108l78 154h193l-27 -61q74 -24 118 -74.5t44 -114.5z" />
<glyph unicode="&#xe8;" horiz-adv-x="1210" d="M92 0zM623 922q-97 0 -152 -61.5t-63 -174.5h428q-2 113 -59 174.5t-154 61.5zM666 -20q-270 0 -422 149t-152 422q0 281 140.5 434.5t388.5 153.5q237 0 369 -135t132 -373v-148h-721q5 -130 77 -203t202 -73q101 0 191 21t188 67v-236q-80 -40 -171 -59.5t-222 -19.5z M620 1241q-63 44 -185 142.5t-190 164.5v21h342q63 -101 235 -301v-27h-202z" />
<glyph unicode="&#xe9;" horiz-adv-x="1210" d="M92 0zM623 922q-97 0 -152 -61.5t-63 -174.5h428q-2 113 -59 174.5t-154 61.5zM666 -20q-270 0 -422 149t-152 422q0 281 140.5 434.5t388.5 153.5q237 0 369 -135t132 -373v-148h-721q5 -130 77 -203t202 -73q101 0 191 21t188 67v-236q-80 -40 -171 -59.5t-222 -19.5z M447 1241v27q172 200 235 301h342v-21q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z" />
<glyph unicode="&#xea;" horiz-adv-x="1210" d="M92 0zM623 922q-97 0 -152 -61.5t-63 -174.5h428q-2 113 -59 174.5t-154 61.5zM666 -20q-270 0 -422 149t-152 422q0 281 140.5 434.5t388.5 153.5q237 0 369 -135t132 -373v-148h-721q5 -130 77 -203t202 -73q101 0 191 21t188 67v-236q-80 -40 -171 -59.5t-222 -19.5z M860 1241q-157 93 -234 176q-78 -81 -229 -176h-203v27q189 189 256 301h357q31 -52 107.5 -141.5t148.5 -159.5v-27h-203z" />
<glyph unicode="&#xeb;" horiz-adv-x="1210" d="M92 0zM623 922q-97 0 -152 -61.5t-63 -174.5h428q-2 113 -59 174.5t-154 61.5zM666 -20q-270 0 -422 149t-152 422q0 281 140.5 434.5t388.5 153.5q237 0 369 -135t132 -373v-148h-721q5 -130 77 -203t202 -73q101 0 191 21t188 67v-236q-80 -40 -171 -59.5t-222 -19.5z M297 1405q0 65 37.5 100t101.5 35q66 0 103.5 -37t37.5 -98q0 -60 -38 -96.5t-103 -36.5q-64 0 -101.5 35t-37.5 98zM700 1405q0 70 40.5 102.5t100.5 32.5q65 0 103.5 -36t38.5 -99q0 -61 -39 -97t-103 -36q-60 0 -100.5 32.5t-40.5 100.5z" />
<glyph unicode="&#xec;" horiz-adv-x="625" d="M0 0zM465 0h-305v1118h305v-1118zM274 1241q-63 44 -185 142.5t-190 164.5v21h342q63 -101 235 -301v-27h-202z" />
<glyph unicode="&#xed;" horiz-adv-x="625" d="M145 0zM465 0h-305v1118h305v-1118zM145 1241v27q172 200 235 301h342v-21q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z" />
<glyph unicode="&#xee;" horiz-adv-x="625" d="M0 0zM465 0h-305v1118h305v-1118zM544 1241q-157 93 -234 176q-78 -81 -229 -176h-203v27q189 189 256 301h357q31 -52 107.5 -141.5t148.5 -159.5v-27h-203z" />
<glyph unicode="&#xef;" horiz-adv-x="625" d="M0 0zM465 0h-305v1118h305v-1118zM-29 1405q0 65 37.5 100t101.5 35q66 0 103.5 -37t37.5 -98q0 -60 -38 -96.5t-103 -36.5q-64 0 -101.5 35t-37.5 98zM374 1405q0 70 40.5 102.5t100.5 32.5q65 0 103.5 -36t38.5 -99q0 -61 -39 -97t-103 -36q-60 0 -100.5 32.5 t-40.5 100.5z" />
<glyph unicode="&#xf0;" horiz-adv-x="1268" d="M510 1303q-80 53 -152 92l101 176q144 -65 258 -141l225 139l100 -154l-170 -104q156 -143 230 -324.5t74 -413.5q0 -280 -145 -436.5t-400 -156.5q-245 0 -392 137t-147 372q0 233 130 369.5t351 136.5q205 0 275 -98l8 4q-67 162 -192 281l-230 -142l-100 156zM864 532 q0 108 -61 173t-168 65q-121 0 -176.5 -68.5t-55.5 -214.5q0 -140 60 -211t172 -71q123 0 176 82t53 245z" />
<glyph unicode="&#xf1;" horiz-adv-x="1346" d="M160 0zM1192 0h-305v653q0 121 -43 181.5t-137 60.5q-128 0 -185 -85.5t-57 -283.5v-526h-305v1118h233l41 -143h17q51 81 140.5 122.5t203.5 41.5q195 0 296 -105.5t101 -304.5v-729zM508 1346q-31 0 -59.5 -26.5t-41.5 -80.5h-149q11 145 82.5 227t189.5 82 q41 0 80.5 -16.5t78 -36t75.5 -35.5t73 -16q31 0 59.5 26t41.5 80h149q-11 -145 -83.5 -227t-188.5 -82q-41 0 -80.5 16.5t-78 36t-75.5 36t-73 16.5z" />
<glyph unicode="&#xf2;" horiz-adv-x="1268" d="M92 0zM403 561q0 -166 54.5 -251t177.5 -85q122 0 175.5 84.5t53.5 251.5q0 166 -54 249t-177 83q-122 0 -176 -82.5t-54 -249.5zM1176 561q0 -273 -144 -427t-401 -154q-161 0 -284 70.5t-189 202.5t-66 308q0 274 143 426t402 152q161 0 284 -70t189 -201t66 -307z M612 1241q-63 44 -185 142.5t-190 164.5v21h342q63 -101 235 -301v-27h-202z" />
<glyph unicode="&#xf3;" horiz-adv-x="1268" d="M92 0zM403 561q0 -166 54.5 -251t177.5 -85q122 0 175.5 84.5t53.5 251.5q0 166 -54 249t-177 83q-122 0 -176 -82.5t-54 -249.5zM1176 561q0 -273 -144 -427t-401 -154q-161 0 -284 70.5t-189 202.5t-66 308q0 274 143 426t402 152q161 0 284 -70t189 -201t66 -307z M467 1241v27q172 200 235 301h342v-21q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z" />
<glyph unicode="&#xf4;" horiz-adv-x="1268" d="M92 0zM403 561q0 -166 54.5 -251t177.5 -85q122 0 175.5 84.5t53.5 251.5q0 166 -54 249t-177 83q-122 0 -176 -82.5t-54 -249.5zM1176 561q0 -273 -144 -427t-401 -154q-161 0 -284 70.5t-189 202.5t-66 308q0 274 143 426t402 152q161 0 284 -70t189 -201t66 -307z M864 1241q-157 93 -234 176q-78 -81 -229 -176h-203v27q189 189 256 301h357q31 -52 107.5 -141.5t148.5 -159.5v-27h-203z" />
<glyph unicode="&#xf5;" horiz-adv-x="1268" d="M92 0zM403 561q0 -166 54.5 -251t177.5 -85q122 0 175.5 84.5t53.5 251.5q0 166 -54 249t-177 83q-122 0 -176 -82.5t-54 -249.5zM1176 561q0 -273 -144 -427t-401 -154q-161 0 -284 70.5t-189 202.5t-66 308q0 274 143 426t402 152q161 0 284 -70t189 -201t66 -307z M469 1346q-31 0 -59.5 -26.5t-41.5 -80.5h-149q11 145 82.5 227t189.5 82q41 0 80.5 -16.5t78 -36t75.5 -35.5t73 -16q31 0 59.5 26t41.5 80h149q-11 -145 -83.5 -227t-188.5 -82q-41 0 -80.5 16.5t-78 36t-75.5 36t-73 16.5z" />
<glyph unicode="&#xf6;" horiz-adv-x="1268" d="M92 0zM403 561q0 -166 54.5 -251t177.5 -85q122 0 175.5 84.5t53.5 251.5q0 166 -54 249t-177 83q-122 0 -176 -82.5t-54 -249.5zM1176 561q0 -273 -144 -427t-401 -154q-161 0 -284 70.5t-189 202.5t-66 308q0 274 143 426t402 152q161 0 284 -70t189 -201t66 -307z M291 1405q0 65 37.5 100t101.5 35q66 0 103.5 -37t37.5 -98q0 -60 -38 -96.5t-103 -36.5q-64 0 -101.5 35t-37.5 98zM694 1405q0 70 40.5 102.5t100.5 32.5q65 0 103.5 -36t38.5 -99q0 -61 -39 -97t-103 -36q-60 0 -100.5 32.5t-40.5 100.5z" />
<glyph unicode="&#xf7;" d="M88 612v219h993v-219h-993zM444 373q0 76 37 113.5t103 37.5t102.5 -39t36.5 -112q0 -70 -37 -111t-102 -41t-102.5 39t-37.5 113zM444 1071q0 75 37 113.5t103 38.5q67 0 103 -40.5t36 -111.5q0 -70 -37 -110.5t-102 -40.5t-102.5 39t-37.5 112z" />
<glyph unicode="&#xf8;" horiz-adv-x="1268" d="M1176 561q0 -273 -144 -427t-401 -154q-126 0 -234 45l-67 -101l-154 105l68 100q-152 156 -152 432q0 274 143 426t402 152q132 0 248 -52l55 82l152 -108l-58 -84q142 -155 142 -416zM403 561q0 -94 19 -166l317 475q-43 23 -106 23q-122 0 -176 -82.5t-54 -249.5z M864 561q0 81 -12 141l-309 -462q38 -15 92 -15q122 0 175.5 84.5t53.5 251.5z" />
<glyph unicode="&#xf9;" horiz-adv-x="1346" d="M154 0zM952 0l-41 143h-16q-49 -78 -139 -120.5t-205 -42.5q-197 0 -297 105.5t-100 303.5v729h305v-653q0 -121 43 -181.5t137 -60.5q128 0 185 85.5t57 283.5v526h305v-1118h-234zM620 1241q-63 44 -185 142.5t-190 164.5v21h342q63 -101 235 -301v-27h-202z" />
<glyph unicode="&#xfa;" horiz-adv-x="1346" d="M154 0zM952 0l-41 143h-16q-49 -78 -139 -120.5t-205 -42.5q-197 0 -297 105.5t-100 303.5v729h305v-653q0 -121 43 -181.5t137 -60.5q128 0 185 85.5t57 283.5v526h305v-1118h-234zM498 1241v27q172 200 235 301h342v-21q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z" />
<glyph unicode="&#xfb;" horiz-adv-x="1346" d="M154 0zM952 0l-41 143h-16q-49 -78 -139 -120.5t-205 -42.5q-197 0 -297 105.5t-100 303.5v729h305v-653q0 -121 43 -181.5t137 -60.5q128 0 185 85.5t57 283.5v526h305v-1118h-234zM901 1241q-157 93 -234 176q-78 -81 -229 -176h-203v27q189 189 256 301h357 q31 -52 107.5 -141.5t148.5 -159.5v-27h-203z" />
<glyph unicode="&#xfc;" horiz-adv-x="1346" d="M154 0zM952 0l-41 143h-16q-49 -78 -139 -120.5t-205 -42.5q-197 0 -297 105.5t-100 303.5v729h305v-653q0 -121 43 -181.5t137 -60.5q128 0 185 85.5t57 283.5v526h305v-1118h-234zM326 1405q0 65 37.5 100t101.5 35q66 0 103.5 -37t37.5 -98q0 -60 -38 -96.5 t-103 -36.5q-64 0 -101.5 35t-37.5 98zM729 1405q0 70 40.5 102.5t100.5 32.5q65 0 103.5 -36t38.5 -99q0 -61 -39 -97t-103 -36q-60 0 -100.5 32.5t-40.5 100.5z" />
<glyph unicode="&#xfd;" horiz-adv-x="1165" d="M0 0zM0 1118h334l211 -629q27 -82 37 -194h6q11 103 43 194l207 629h327l-473 -1261q-65 -175 -185.5 -262t-281.5 -87q-79 0 -155 17v242q55 -13 120 -13q81 0 141.5 49.5t94.5 149.5l18 55zM393 1241v27q172 200 235 301h342v-21q-52 -52 -177.5 -154.5t-196.5 -152.5 h-203z" />
<glyph unicode="&#xfe;" horiz-adv-x="1296" d="M465 973q50 81 131 123.5t186 42.5q198 0 310 -154.5t112 -423.5q0 -273 -111.5 -427t-310.5 -154q-213 0 -317 137h-14l7 -62l7 -94v-453h-305v2048h305v-391l-7 -120l-7 -72h14zM684 895q-113 0 -165 -69.5t-54 -229.5v-33q0 -180 53.5 -258t169.5 -78q205 0 205 338 q0 165 -50.5 247.5t-158.5 82.5z" />
<glyph unicode="&#xff;" horiz-adv-x="1165" d="M0 0zM0 1118h334l211 -629q27 -82 37 -194h6q11 103 43 194l207 629h327l-473 -1261q-65 -175 -185.5 -262t-281.5 -87q-79 0 -155 17v242q55 -13 120 -13q81 0 141.5 49.5t94.5 149.5l18 55zM243 1405q0 65 37.5 100t101.5 35q66 0 103.5 -37t37.5 -98q0 -60 -38 -96.5 t-103 -36.5q-64 0 -101.5 35t-37.5 98zM646 1405q0 70 40.5 102.5t100.5 32.5q65 0 103.5 -36t38.5 -99q0 -61 -39 -97t-103 -36q-60 0 -100.5 32.5t-40.5 100.5z" />
<glyph unicode="&#x131;" horiz-adv-x="625" d="M465 0h-305v1118h305v-1118z" />
<glyph unicode="&#x152;" horiz-adv-x="1993" d="M1872 0h-873q-38 -9 -109 -14.5t-116 -5.5q-319 0 -487 197t-168 558q0 363 169.5 556.5t487.5 193.5q61 0 127 -7t101 -16h868v-254h-563v-321h526v-254h-526v-377h563v-256zM776 1227q-166 0 -252 -125.5t-86 -368.5q0 -244 86 -368.5t250 -124.5q65 0 126 10.5 t99 28.5v907q-35 19 -101.5 30t-121.5 11z" />
<glyph unicode="&#x153;" horiz-adv-x="2003" d="M1446 -20q-271 0 -420 155q-141 -155 -391 -155q-162 0 -286 70t-190.5 202t-66.5 309q0 277 141.5 427.5t399.5 150.5q112 0 212 -39.5t171 -116.5q144 156 383 156q244 0 380 -135t136 -373v-148h-746v-8q7 -127 81.5 -197.5t207.5 -70.5q107 0 200 21t193 67v-236 q-81 -39 -175.5 -59t-229.5 -20zM403 561q0 -166 54.5 -251t177.5 -85q122 0 175.5 84.5t53.5 251.5q0 166 -54 249t-177 83q-122 0 -176 -82.5t-54 -249.5zM1405 922q-94 0 -156 -57.5t-71 -178.5h450q-2 111 -60.5 173.5t-162.5 62.5z" />
<glyph unicode="&#x178;" horiz-adv-x="1278" d="M0 0zM639 860l305 602h334l-485 -893v-569h-308v559l-485 903h336zM297 1743q0 65 37.5 100t101.5 35q66 0 103.5 -37t37.5 -98q0 -60 -38 -96.5t-103 -36.5q-64 0 -101.5 35t-37.5 98zM700 1743q0 70 40.5 102.5t100.5 32.5q65 0 103.5 -36t38.5 -99q0 -61 -39 -97 t-103 -36q-60 0 -100.5 32.5t-40.5 100.5z" />
<glyph unicode="&#x2c6;" horiz-adv-x="1243" d="M852 1241q-157 93 -234 176q-78 -81 -229 -176h-203v27q189 189 256 301h357q31 -52 107.5 -141.5t148.5 -159.5v-27h-203z" />
<glyph unicode="&#x2da;" horiz-adv-x="1182" d="M842 1479q0 -108 -71 -174t-183 -66t-180 64t-68 174q0 108 67.5 172.5t180.5 64.5q110 0 182 -66t72 -169zM684 1477q0 45 -27 70.5t-69 25.5t-69 -25.5t-27 -70.5t24 -71t72 -26q42 0 69 26t27 71z" />
<glyph unicode="&#x2dc;" horiz-adv-x="1243" d="M457 1346q-31 0 -59.5 -26.5t-41.5 -80.5h-149q11 145 82.5 227t189.5 82q41 0 80.5 -16.5t78 -36t75.5 -35.5t73 -16q31 0 59.5 26t41.5 80h149q-11 -145 -83.5 -227t-188.5 -82q-41 0 -80.5 16.5t-78 36t-75.5 36t-73 16.5z" />
<glyph unicode="&#x2000;" horiz-adv-x="953" />
<glyph unicode="&#x2001;" horiz-adv-x="1907" />
<glyph unicode="&#x2002;" horiz-adv-x="953" />
<glyph unicode="&#x2003;" horiz-adv-x="1907" />
<glyph unicode="&#x2004;" horiz-adv-x="635" />
<glyph unicode="&#x2005;" horiz-adv-x="476" />
<glyph unicode="&#x2006;" horiz-adv-x="317" />
<glyph unicode="&#x2007;" horiz-adv-x="317" />
<glyph unicode="&#x2008;" horiz-adv-x="238" />
<glyph unicode="&#x2009;" horiz-adv-x="381" />
<glyph unicode="&#x200a;" horiz-adv-x="105" />
<glyph unicode="&#x2010;" horiz-adv-x="659" d="M61 424v250h537v-250h-537z" />
<glyph unicode="&#x2011;" horiz-adv-x="659" d="M61 424v250h537v-250h-537z" />
<glyph unicode="&#x2012;" horiz-adv-x="659" d="M61 424v250h537v-250h-537z" />
<glyph unicode="&#x2013;" horiz-adv-x="1024" d="M82 436v230h860v-230h-860z" />
<glyph unicode="&#x2014;" horiz-adv-x="2048" d="M82 436v230h1884v-230h-1884z" />
<glyph unicode="&#x2018;" horiz-adv-x="444" d="M39 961l-14 22q22 91 72.5 228.5t103.5 250.5h219q-66 -267 -101 -501h-280z" />
<glyph unicode="&#x2019;" horiz-adv-x="444" d="M406 1462l14 -22q-50 -197 -176 -479h-219q69 296 100 501h281z" />
<glyph unicode="&#x201a;" horiz-adv-x="596" d="M459 215q-52 -202 -176 -479h-220q65 266 101 502h280z" />
<glyph unicode="&#x201c;" horiz-adv-x="911" d="M492 983q22 91 72.5 228.5t103.5 250.5h219q-66 -267 -101 -501h-280zM25 983q22 91 72.5 228.5t103.5 250.5h219q-66 -267 -101 -501h-280z" />
<glyph unicode="&#x201d;" horiz-adv-x="911" d="M420 1440q-50 -197 -176 -479h-219q69 296 100 501h281zM887 1440q-50 -197 -176 -479h-219q69 296 100 501h280z" />
<glyph unicode="&#x201e;" horiz-adv-x="1061" d="M459 215q-52 -202 -176 -479h-220q65 266 101 502h280zM926 215q-52 -202 -176 -479h-220q65 266 101 502h280z" />
<glyph unicode="&#x2022;" horiz-adv-x="770" d="M98 748q0 154 74 235.5t213 81.5q137 0 212 -82t75 -235q0 -152 -75.5 -235t-211.5 -83q-138 0 -212.5 83t-74.5 235z" />
<glyph unicode="&#x2026;" horiz-adv-x="1751" d="M117 143q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5zM700 143q0 84 45 127t132 43q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-85 0 -131 44.5t-46 125.5zM1284 143q0 84 45 127t131 43 q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5z" />
<glyph unicode="&#x202f;" horiz-adv-x="381" />
<glyph unicode="&#x2039;" horiz-adv-x="754" d="M82 573l371 455l219 -119l-279 -348l279 -348l-219 -119l-371 453v26z" />
<glyph unicode="&#x203a;" horiz-adv-x="754" d="M672 547l-371 -453l-219 119l278 348l-278 348l219 119l371 -455v-26z" />
<glyph unicode="&#x2044;" horiz-adv-x="266" d="M657 1462l-811 -1462h-239l811 1462h239z" />
<glyph unicode="&#x205f;" horiz-adv-x="476" />
<glyph unicode="&#x2074;" horiz-adv-x="776" d="M758 737h-125v-151h-238v151h-383v154l385 577h236v-563h125v-168zM395 905v164q0 86 6 184q-9 -26 -35.5 -80t-41.5 -77l-127 -191h198z" />
<glyph unicode="&#x20ac;" d="M803 1225q-122 0 -201 -70.5t-102 -204.5h403v-176h-418l-2 -35v-47l2 -33h355v-178h-338q51 -243 321 -243q143 0 275 57v-256q-116 -59 -293 -59q-245 0 -403 133t-199 368h-137v178h118q-4 23 -4 62l2 53h-116v176h133q37 242 199 382.5t405 140.5q188 0 352 -82 l-98 -232q-69 31 -129 48.5t-125 17.5z" />
<glyph unicode="&#x2122;" horiz-adv-x="1534" d="M381 741h-168v572h-197v149h564v-149h-199v-572zM956 741l-165 529h-7l4 -111v-418h-163v721h247l160 -510l170 510h240v-721h-168v408l4 121h-6l-174 -529h-142z" />
<glyph unicode="&#xe000;" horiz-adv-x="1120" d="M0 1120h1120v-1120h-1120v1120z" />
<glyph horiz-adv-x="1296" d="M0 0z" />
<hkern u1="&#x22;" u2="&#x178;" k="-20" />
<hkern u1="&#x22;" u2="&#x153;" k="123" />
<hkern u1="&#x22;" u2="&#xfc;" k="61" />
<hkern u1="&#x22;" u2="&#xfb;" k="61" />
<hkern u1="&#x22;" u2="&#xfa;" k="61" />
<hkern u1="&#x22;" u2="&#xf9;" k="61" />
<hkern u1="&#x22;" u2="&#xf8;" k="123" />
<hkern u1="&#x22;" u2="&#xf6;" k="123" />
<hkern u1="&#x22;" u2="&#xf5;" k="123" />
<hkern u1="&#x22;" u2="&#xf4;" k="123" />
<hkern u1="&#x22;" u2="&#xf3;" k="123" />
<hkern u1="&#x22;" u2="&#xf2;" k="123" />
<hkern u1="&#x22;" u2="&#xeb;" k="123" />
<hkern u1="&#x22;" u2="&#xea;" k="123" />
<hkern u1="&#x22;" u2="&#xe9;" k="123" />
<hkern u1="&#x22;" u2="&#xe8;" k="123" />
<hkern u1="&#x22;" u2="&#xe7;" k="123" />
<hkern u1="&#x22;" u2="&#xe6;" k="82" />
<hkern u1="&#x22;" u2="&#xe5;" k="82" />
<hkern u1="&#x22;" u2="&#xe4;" k="82" />
<hkern u1="&#x22;" u2="&#xe3;" k="82" />
<hkern u1="&#x22;" u2="&#xe2;" k="82" />
<hkern u1="&#x22;" u2="&#xe1;" k="82" />
<hkern u1="&#x22;" u2="&#xe0;" k="123" />
<hkern u1="&#x22;" u2="&#xdd;" k="-20" />
<hkern u1="&#x22;" u2="&#xc5;" k="143" />
<hkern u1="&#x22;" u2="&#xc4;" k="143" />
<hkern u1="&#x22;" u2="&#xc3;" k="143" />
<hkern u1="&#x22;" u2="&#xc2;" k="143" />
<hkern u1="&#x22;" u2="&#xc1;" k="143" />
<hkern u1="&#x22;" u2="&#xc0;" k="143" />
<hkern u1="&#x22;" u2="u" k="61" />
<hkern u1="&#x22;" u2="s" k="61" />
<hkern u1="&#x22;" u2="r" k="61" />
<hkern u1="&#x22;" u2="q" k="123" />
<hkern u1="&#x22;" u2="p" k="61" />
<hkern u1="&#x22;" u2="o" k="123" />
<hkern u1="&#x22;" u2="n" k="61" />
<hkern u1="&#x22;" u2="m" k="61" />
<hkern u1="&#x22;" u2="g" k="61" />
<hkern u1="&#x22;" u2="e" k="123" />
<hkern u1="&#x22;" u2="d" k="123" />
<hkern u1="&#x22;" u2="c" k="123" />
<hkern u1="&#x22;" u2="a" k="82" />
<hkern u1="&#x22;" u2="Y" k="-20" />
<hkern u1="&#x22;" u2="W" k="-41" />
<hkern u1="&#x22;" u2="V" k="-41" />
<hkern u1="&#x22;" u2="T" k="-41" />
<hkern u1="&#x22;" u2="A" k="143" />
<hkern u1="&#x27;" u2="&#x178;" k="-20" />
<hkern u1="&#x27;" u2="&#x153;" k="123" />
<hkern u1="&#x27;" u2="&#xfc;" k="61" />
<hkern u1="&#x27;" u2="&#xfb;" k="61" />
<hkern u1="&#x27;" u2="&#xfa;" k="61" />
<hkern u1="&#x27;" u2="&#xf9;" k="61" />
<hkern u1="&#x27;" u2="&#xf8;" k="123" />
<hkern u1="&#x27;" u2="&#xf6;" k="123" />
<hkern u1="&#x27;" u2="&#xf5;" k="123" />
<hkern u1="&#x27;" u2="&#xf4;" k="123" />
<hkern u1="&#x27;" u2="&#xf3;" k="123" />
<hkern u1="&#x27;" u2="&#xf2;" k="123" />
<hkern u1="&#x27;" u2="&#xeb;" k="123" />
<hkern u1="&#x27;" u2="&#xea;" k="123" />
<hkern u1="&#x27;" u2="&#xe9;" k="123" />
<hkern u1="&#x27;" u2="&#xe8;" k="123" />
<hkern u1="&#x27;" u2="&#xe7;" k="123" />
<hkern u1="&#x27;" u2="&#xe6;" k="82" />
<hkern u1="&#x27;" u2="&#xe5;" k="82" />
<hkern u1="&#x27;" u2="&#xe4;" k="82" />
<hkern u1="&#x27;" u2="&#xe3;" k="82" />
<hkern u1="&#x27;" u2="&#xe2;" k="82" />
<hkern u1="&#x27;" u2="&#xe1;" k="82" />
<hkern u1="&#x27;" u2="&#xe0;" k="123" />
<hkern u1="&#x27;" u2="&#xdd;" k="-20" />
<hkern u1="&#x27;" u2="&#xc5;" k="143" />
<hkern u1="&#x27;" u2="&#xc4;" k="143" />
<hkern u1="&#x27;" u2="&#xc3;" k="143" />
<hkern u1="&#x27;" u2="&#xc2;" k="143" />
<hkern u1="&#x27;" u2="&#xc1;" k="143" />
<hkern u1="&#x27;" u2="&#xc0;" k="143" />
<hkern u1="&#x27;" u2="u" k="61" />
<hkern u1="&#x27;" u2="s" k="61" />
<hkern u1="&#x27;" u2="r" k="61" />
<hkern u1="&#x27;" u2="q" k="123" />
<hkern u1="&#x27;" u2="p" k="61" />
<hkern u1="&#x27;" u2="o" k="123" />
<hkern u1="&#x27;" u2="n" k="61" />
<hkern u1="&#x27;" u2="m" k="61" />
<hkern u1="&#x27;" u2="g" k="61" />
<hkern u1="&#x27;" u2="e" k="123" />
<hkern u1="&#x27;" u2="d" k="123" />
<hkern u1="&#x27;" u2="c" k="123" />
<hkern u1="&#x27;" u2="a" k="82" />
<hkern u1="&#x27;" u2="Y" k="-20" />
<hkern u1="&#x27;" u2="W" k="-41" />
<hkern u1="&#x27;" u2="V" k="-41" />
<hkern u1="&#x27;" u2="T" k="-41" />
<hkern u1="&#x27;" u2="A" k="143" />
<hkern u1="&#x28;" u2="J" k="-184" />
<hkern u1="&#x2c;" u2="&#x178;" k="123" />
<hkern u1="&#x2c;" u2="&#x152;" k="102" />
<hkern u1="&#x2c;" u2="&#xdd;" k="123" />
<hkern u1="&#x2c;" u2="&#xdc;" k="41" />
<hkern u1="&#x2c;" u2="&#xdb;" k="41" />
<hkern u1="&#x2c;" u2="&#xda;" k="41" />
<hkern u1="&#x2c;" u2="&#xd9;" k="41" />
<hkern u1="&#x2c;" u2="&#xd8;" k="102" />
<hkern u1="&#x2c;" u2="&#xd6;" k="102" />
<hkern u1="&#x2c;" u2="&#xd5;" k="102" />
<hkern u1="&#x2c;" u2="&#xd4;" k="102" />
<hkern u1="&#x2c;" u2="&#xd3;" k="102" />
<hkern u1="&#x2c;" u2="&#xd2;" k="102" />
<hkern u1="&#x2c;" u2="&#xc7;" k="102" />
<hkern u1="&#x2c;" u2="Y" k="123" />
<hkern u1="&#x2c;" u2="W" k="123" />
<hkern u1="&#x2c;" u2="V" k="123" />
<hkern u1="&#x2c;" u2="U" k="41" />
<hkern u1="&#x2c;" u2="T" k="143" />
<hkern u1="&#x2c;" u2="Q" k="102" />
<hkern u1="&#x2c;" u2="O" k="102" />
<hkern u1="&#x2c;" u2="G" k="102" />
<hkern u1="&#x2c;" u2="C" k="102" />
<hkern u1="&#x2d;" u2="T" k="82" />
<hkern u1="&#x2e;" u2="&#x178;" k="123" />
<hkern u1="&#x2e;" u2="&#x152;" k="102" />
<hkern u1="&#x2e;" u2="&#xdd;" k="123" />
<hkern u1="&#x2e;" u2="&#xdc;" k="41" />
<hkern u1="&#x2e;" u2="&#xdb;" k="41" />
<hkern u1="&#x2e;" u2="&#xda;" k="41" />
<hkern u1="&#x2e;" u2="&#xd9;" k="41" />
<hkern u1="&#x2e;" u2="&#xd8;" k="102" />
<hkern u1="&#x2e;" u2="&#xd6;" k="102" />
<hkern u1="&#x2e;" u2="&#xd5;" k="102" />
<hkern u1="&#x2e;" u2="&#xd4;" k="102" />
<hkern u1="&#x2e;" u2="&#xd3;" k="102" />
<hkern u1="&#x2e;" u2="&#xd2;" k="102" />
<hkern u1="&#x2e;" u2="&#xc7;" k="102" />
<hkern u1="&#x2e;" u2="Y" k="123" />
<hkern u1="&#x2e;" u2="W" k="123" />
<hkern u1="&#x2e;" u2="V" k="123" />
<hkern u1="&#x2e;" u2="U" k="41" />
<hkern u1="&#x2e;" u2="T" k="143" />
<hkern u1="&#x2e;" u2="Q" k="102" />
<hkern u1="&#x2e;" u2="O" k="102" />
<hkern u1="&#x2e;" u2="G" k="102" />
<hkern u1="&#x2e;" u2="C" k="102" />
<hkern u1="A" u2="&#x201d;" k="143" />
<hkern u1="A" u2="&#x2019;" k="143" />
<hkern u1="A" u2="&#x178;" k="123" />
<hkern u1="A" u2="&#x152;" k="41" />
<hkern u1="A" u2="&#xdd;" k="123" />
<hkern u1="A" u2="&#xd8;" k="41" />
<hkern u1="A" u2="&#xd6;" k="41" />
<hkern u1="A" u2="&#xd5;" k="41" />
<hkern u1="A" u2="&#xd4;" k="41" />
<hkern u1="A" u2="&#xd3;" k="41" />
<hkern u1="A" u2="&#xd2;" k="41" />
<hkern u1="A" u2="&#xc7;" k="41" />
<hkern u1="A" u2="Y" k="123" />
<hkern u1="A" u2="W" k="82" />
<hkern u1="A" u2="V" k="82" />
<hkern u1="A" u2="T" k="143" />
<hkern u1="A" u2="Q" k="41" />
<hkern u1="A" u2="O" k="41" />
<hkern u1="A" u2="J" k="-266" />
<hkern u1="A" u2="G" k="41" />
<hkern u1="A" u2="C" k="41" />
<hkern u1="A" u2="&#x27;" k="143" />
<hkern u1="A" u2="&#x22;" k="143" />
<hkern u1="B" u2="&#x201e;" k="82" />
<hkern u1="B" u2="&#x201a;" k="82" />
<hkern u1="B" u2="&#x178;" k="20" />
<hkern u1="B" u2="&#xdd;" k="20" />
<hkern u1="B" u2="&#xc5;" k="41" />
<hkern u1="B" u2="&#xc4;" k="41" />
<hkern u1="B" u2="&#xc3;" k="41" />
<hkern u1="B" u2="&#xc2;" k="41" />
<hkern u1="B" u2="&#xc1;" k="41" />
<hkern u1="B" u2="&#xc0;" k="41" />
<hkern u1="B" u2="Z" k="20" />
<hkern u1="B" u2="Y" k="20" />
<hkern u1="B" u2="X" k="41" />
<hkern u1="B" u2="W" k="20" />
<hkern u1="B" u2="V" k="20" />
<hkern u1="B" u2="T" k="61" />
<hkern u1="B" u2="A" k="41" />
<hkern u1="B" u2="&#x2e;" k="82" />
<hkern u1="B" u2="&#x2c;" k="82" />
<hkern u1="C" u2="&#x152;" k="41" />
<hkern u1="C" u2="&#xd8;" k="41" />
<hkern u1="C" u2="&#xd6;" k="41" />
<hkern u1="C" u2="&#xd5;" k="41" />
<hkern u1="C" u2="&#xd4;" k="41" />
<hkern u1="C" u2="&#xd3;" k="41" />
<hkern u1="C" u2="&#xd2;" k="41" />
<hkern u1="C" u2="&#xc7;" k="41" />
<hkern u1="C" u2="Q" k="41" />
<hkern u1="C" u2="O" k="41" />
<hkern u1="C" u2="G" k="41" />
<hkern u1="C" u2="C" k="41" />
<hkern u1="D" u2="&#x201e;" k="82" />
<hkern u1="D" u2="&#x201a;" k="82" />
<hkern u1="D" u2="&#x178;" k="20" />
<hkern u1="D" u2="&#xdd;" k="20" />
<hkern u1="D" u2="&#xc5;" k="41" />
<hkern u1="D" u2="&#xc4;" k="41" />
<hkern u1="D" u2="&#xc3;" k="41" />
<hkern u1="D" u2="&#xc2;" k="41" />
<hkern u1="D" u2="&#xc1;" k="41" />
<hkern u1="D" u2="&#xc0;" k="41" />
<hkern u1="D" u2="Z" k="20" />
<hkern u1="D" u2="Y" k="20" />
<hkern u1="D" u2="X" k="41" />
<hkern u1="D" u2="W" k="20" />
<hkern u1="D" u2="V" k="20" />
<hkern u1="D" u2="T" k="61" />
<hkern u1="D" u2="A" k="41" />
<hkern u1="D" u2="&#x2e;" k="82" />
<hkern u1="D" u2="&#x2c;" k="82" />
<hkern u1="E" u2="J" k="-123" />
<hkern u1="F" u2="&#x201e;" k="123" />
<hkern u1="F" u2="&#x201a;" k="123" />
<hkern u1="F" u2="&#xc5;" k="41" />
<hkern u1="F" u2="&#xc4;" k="41" />
<hkern u1="F" u2="&#xc3;" k="41" />
<hkern u1="F" u2="&#xc2;" k="41" />
<hkern u1="F" u2="&#xc1;" k="41" />
<hkern u1="F" u2="&#xc0;" k="41" />
<hkern u1="F" u2="A" k="41" />
<hkern u1="F" u2="&#x3f;" k="-41" />
<hkern u1="F" u2="&#x2e;" k="123" />
<hkern u1="F" u2="&#x2c;" k="123" />
<hkern u1="K" u2="&#x152;" k="41" />
<hkern u1="K" u2="&#xd8;" k="41" />
<hkern u1="K" u2="&#xd6;" k="41" />
<hkern u1="K" u2="&#xd5;" k="41" />
<hkern u1="K" u2="&#xd4;" k="41" />
<hkern u1="K" u2="&#xd3;" k="41" />
<hkern u1="K" u2="&#xd2;" k="41" />
<hkern u1="K" u2="&#xc7;" k="41" />
<hkern u1="K" u2="Q" k="41" />
<hkern u1="K" u2="O" k="41" />
<hkern u1="K" u2="G" k="41" />
<hkern u1="K" u2="C" k="41" />
<hkern u1="L" u2="&#x201d;" k="164" />
<hkern u1="L" u2="&#x2019;" k="164" />
<hkern u1="L" u2="&#x178;" k="61" />
<hkern u1="L" u2="&#x152;" k="41" />
<hkern u1="L" u2="&#xdd;" k="61" />
<hkern u1="L" u2="&#xdc;" k="20" />
<hkern u1="L" u2="&#xdb;" k="20" />
<hkern u1="L" u2="&#xda;" k="20" />
<hkern u1="L" u2="&#xd9;" k="20" />
<hkern u1="L" u2="&#xd8;" k="41" />
<hkern u1="L" u2="&#xd6;" k="41" />
<hkern u1="L" u2="&#xd5;" k="41" />
<hkern u1="L" u2="&#xd4;" k="41" />
<hkern u1="L" u2="&#xd3;" k="41" />
<hkern u1="L" u2="&#xd2;" k="41" />
<hkern u1="L" u2="&#xc7;" k="41" />
<hkern u1="L" u2="Y" k="61" />
<hkern u1="L" u2="W" k="41" />
<hkern u1="L" u2="V" k="41" />
<hkern u1="L" u2="U" k="20" />
<hkern u1="L" u2="T" k="41" />
<hkern u1="L" u2="Q" k="41" />
<hkern u1="L" u2="O" k="41" />
<hkern u1="L" u2="G" k="41" />
<hkern u1="L" u2="C" k="41" />
<hkern u1="L" u2="&#x27;" k="164" />
<hkern u1="L" u2="&#x22;" k="164" />
<hkern u1="O" u2="&#x201e;" k="82" />
<hkern u1="O" u2="&#x201a;" k="82" />
<hkern u1="O" u2="&#x178;" k="20" />
<hkern u1="O" u2="&#xdd;" k="20" />
<hkern u1="O" u2="&#xc5;" k="41" />
<hkern u1="O" u2="&#xc4;" k="41" />
<hkern u1="O" u2="&#xc3;" k="41" />
<hkern u1="O" u2="&#xc2;" k="41" />
<hkern u1="O" u2="&#xc1;" k="41" />
<hkern u1="O" u2="&#xc0;" k="41" />
<hkern u1="O" u2="Z" k="20" />
<hkern u1="O" u2="Y" k="20" />
<hkern u1="O" u2="X" k="41" />
<hkern u1="O" u2="W" k="20" />
<hkern u1="O" u2="V" k="20" />
<hkern u1="O" u2="T" k="61" />
<hkern u1="O" u2="A" k="41" />
<hkern u1="O" u2="&#x2e;" k="82" />
<hkern u1="O" u2="&#x2c;" k="82" />
<hkern u1="P" u2="&#x201e;" k="266" />
<hkern u1="P" u2="&#x201a;" k="266" />
<hkern u1="P" u2="&#xc5;" k="102" />
<hkern u1="P" u2="&#xc4;" k="102" />
<hkern u1="P" u2="&#xc3;" k="102" />
<hkern u1="P" u2="&#xc2;" k="102" />
<hkern u1="P" u2="&#xc1;" k="102" />
<hkern u1="P" u2="&#xc0;" k="102" />
<hkern u1="P" u2="Z" k="20" />
<hkern u1="P" u2="X" k="41" />
<hkern u1="P" u2="A" k="102" />
<hkern u1="P" u2="&#x2e;" k="266" />
<hkern u1="P" u2="&#x2c;" k="266" />
<hkern u1="Q" u2="&#x201e;" k="82" />
<hkern u1="Q" u2="&#x201a;" k="82" />
<hkern u1="Q" u2="&#x178;" k="20" />
<hkern u1="Q" u2="&#xdd;" k="20" />
<hkern u1="Q" u2="&#xc5;" k="41" />
<hkern u1="Q" u2="&#xc4;" k="41" />
<hkern u1="Q" u2="&#xc3;" k="41" />
<hkern u1="Q" u2="&#xc2;" k="41" />
<hkern u1="Q" u2="&#xc1;" k="41" />
<hkern u1="Q" u2="&#xc0;" k="41" />
<hkern u1="Q" u2="Z" k="20" />
<hkern u1="Q" u2="Y" k="20" />
<hkern u1="Q" u2="X" k="41" />
<hkern u1="Q" u2="W" k="20" />
<hkern u1="Q" u2="V" k="20" />
<hkern u1="Q" u2="T" k="61" />
<hkern u1="Q" u2="A" k="41" />
<hkern u1="Q" u2="&#x2e;" k="82" />
<hkern u1="Q" u2="&#x2c;" k="82" />
<hkern u1="T" u2="&#x201e;" k="123" />
<hkern u1="T" u2="&#x201a;" k="123" />
<hkern u1="T" u2="&#x2014;" k="82" />
<hkern u1="T" u2="&#x2013;" k="82" />
<hkern u1="T" u2="&#x153;" k="143" />
<hkern u1="T" u2="&#x152;" k="41" />
<hkern u1="T" u2="&#xfd;" k="41" />
<hkern u1="T" u2="&#xfc;" k="102" />
<hkern u1="T" u2="&#xfb;" k="102" />
<hkern u1="T" u2="&#xfa;" k="102" />
<hkern u1="T" u2="&#xf9;" k="102" />
<hkern u1="T" u2="&#xf8;" k="143" />
<hkern u1="T" u2="&#xf6;" k="143" />
<hkern u1="T" u2="&#xf5;" k="143" />
<hkern u1="T" u2="&#xf4;" k="143" />
<hkern u1="T" u2="&#xf3;" k="143" />
<hkern u1="T" u2="&#xf2;" k="143" />
<hkern u1="T" u2="&#xeb;" k="143" />
<hkern u1="T" u2="&#xea;" k="143" />
<hkern u1="T" u2="&#xe9;" k="143" />
<hkern u1="T" u2="&#xe8;" k="143" />
<hkern u1="T" u2="&#xe7;" k="143" />
<hkern u1="T" u2="&#xe6;" k="164" />
<hkern u1="T" u2="&#xe5;" k="164" />
<hkern u1="T" u2="&#xe4;" k="164" />
<hkern u1="T" u2="&#xe3;" k="164" />
<hkern u1="T" u2="&#xe2;" k="164" />
<hkern u1="T" u2="&#xe1;" k="164" />
<hkern u1="T" u2="&#xe0;" k="143" />
<hkern u1="T" u2="&#xd8;" k="41" />
<hkern u1="T" u2="&#xd6;" k="41" />
<hkern u1="T" u2="&#xd5;" k="41" />
<hkern u1="T" u2="&#xd4;" k="41" />
<hkern u1="T" u2="&#xd3;" k="41" />
<hkern u1="T" u2="&#xd2;" k="41" />
<hkern u1="T" u2="&#xc7;" k="41" />
<hkern u1="T" u2="&#xc5;" k="143" />
<hkern u1="T" u2="&#xc4;" k="143" />
<hkern u1="T" u2="&#xc3;" k="143" />
<hkern u1="T" u2="&#xc2;" k="143" />
<hkern u1="T" u2="&#xc1;" k="143" />
<hkern u1="T" u2="&#xc0;" k="143" />
<hkern u1="T" u2="z" k="82" />
<hkern u1="T" u2="y" k="41" />
<hkern u1="T" u2="x" k="41" />
<hkern u1="T" u2="w" k="41" />
<hkern u1="T" u2="v" k="41" />
<hkern u1="T" u2="u" k="102" />
<hkern u1="T" u2="s" k="123" />
<hkern u1="T" u2="r" k="102" />
<hkern u1="T" u2="q" k="143" />
<hkern u1="T" u2="p" k="102" />
<hkern u1="T" u2="o" k="143" />
<hkern u1="T" u2="n" k="102" />
<hkern u1="T" u2="m" k="102" />
<hkern u1="T" u2="g" k="143" />
<hkern u1="T" u2="e" k="143" />
<hkern u1="T" u2="d" k="143" />
<hkern u1="T" u2="c" k="143" />
<hkern u1="T" u2="a" k="164" />
<hkern u1="T" u2="T" k="-41" />
<hkern u1="T" u2="Q" k="41" />
<hkern u1="T" u2="O" k="41" />
<hkern u1="T" u2="G" k="41" />
<hkern u1="T" u2="C" k="41" />
<hkern u1="T" u2="A" k="143" />
<hkern u1="T" u2="&#x3f;" k="-41" />
<hkern u1="T" u2="&#x2e;" k="123" />
<hkern u1="T" u2="&#x2d;" k="82" />
<hkern u1="T" u2="&#x2c;" k="123" />
<hkern u1="U" u2="&#x201e;" k="41" />
<hkern u1="U" u2="&#x201a;" k="41" />
<hkern u1="U" u2="&#xc5;" k="20" />
<hkern u1="U" u2="&#xc4;" k="20" />
<hkern u1="U" u2="&#xc3;" k="20" />
<hkern u1="U" u2="&#xc2;" k="20" />
<hkern u1="U" u2="&#xc1;" k="20" />
<hkern u1="U" u2="&#xc0;" k="20" />
<hkern u1="U" u2="A" k="20" />
<hkern u1="U" u2="&#x2e;" k="41" />
<hkern u1="U" u2="&#x2c;" k="41" />
<hkern u1="V" u2="&#x201e;" k="102" />
<hkern u1="V" u2="&#x201a;" k="102" />
<hkern u1="V" u2="&#x153;" k="41" />
<hkern u1="V" u2="&#x152;" k="20" />
<hkern u1="V" u2="&#xfc;" k="20" />
<hkern u1="V" u2="&#xfb;" k="20" />
<hkern u1="V" u2="&#xfa;" k="20" />
<hkern u1="V" u2="&#xf9;" k="20" />
<hkern u1="V" u2="&#xf8;" k="41" />
<hkern u1="V" u2="&#xf6;" k="41" />
<hkern u1="V" u2="&#xf5;" k="41" />
<hkern u1="V" u2="&#xf4;" k="41" />
<hkern u1="V" u2="&#xf3;" k="41" />
<hkern u1="V" u2="&#xf2;" k="41" />
<hkern u1="V" u2="&#xeb;" k="41" />
<hkern u1="V" u2="&#xea;" k="41" />
<hkern u1="V" u2="&#xe9;" k="41" />
<hkern u1="V" u2="&#xe8;" k="41" />
<hkern u1="V" u2="&#xe7;" k="41" />
<hkern u1="V" u2="&#xe6;" k="41" />
<hkern u1="V" u2="&#xe5;" k="41" />
<hkern u1="V" u2="&#xe4;" k="41" />
<hkern u1="V" u2="&#xe3;" k="41" />
<hkern u1="V" u2="&#xe2;" k="41" />
<hkern u1="V" u2="&#xe1;" k="41" />
<hkern u1="V" u2="&#xe0;" k="41" />
<hkern u1="V" u2="&#xd8;" k="20" />
<hkern u1="V" u2="&#xd6;" k="20" />
<hkern u1="V" u2="&#xd5;" k="20" />
<hkern u1="V" u2="&#xd4;" k="20" />
<hkern u1="V" u2="&#xd3;" k="20" />
<hkern u1="V" u2="&#xd2;" k="20" />
<hkern u1="V" u2="&#xc7;" k="20" />
<hkern u1="V" u2="&#xc5;" k="82" />
<hkern u1="V" u2="&#xc4;" k="82" />
<hkern u1="V" u2="&#xc3;" k="82" />
<hkern u1="V" u2="&#xc2;" k="82" />
<hkern u1="V" u2="&#xc1;" k="82" />
<hkern u1="V" u2="&#xc0;" k="82" />
<hkern u1="V" u2="u" k="20" />
<hkern u1="V" u2="s" k="20" />
<hkern u1="V" u2="r" k="20" />
<hkern u1="V" u2="q" k="41" />
<hkern u1="V" u2="p" k="20" />
<hkern u1="V" u2="o" k="41" />
<hkern u1="V" u2="n" k="20" />
<hkern u1="V" u2="m" k="20" />
<hkern u1="V" u2="g" k="20" />
<hkern u1="V" u2="e" k="41" />
<hkern u1="V" u2="d" k="41" />
<hkern u1="V" u2="c" k="41" />
<hkern u1="V" u2="a" k="41" />
<hkern u1="V" u2="Q" k="20" />
<hkern u1="V" u2="O" k="20" />
<hkern u1="V" u2="G" k="20" />
<hkern u1="V" u2="C" k="20" />
<hkern u1="V" u2="A" k="82" />
<hkern u1="V" u2="&#x3f;" k="-41" />
<hkern u1="V" u2="&#x2e;" k="102" />
<hkern u1="V" u2="&#x2c;" k="102" />
<hkern u1="W" u2="&#x201e;" k="102" />
<hkern u1="W" u2="&#x201a;" k="102" />
<hkern u1="W" u2="&#x153;" k="41" />
<hkern u1="W" u2="&#x152;" k="20" />
<hkern u1="W" u2="&#xfc;" k="20" />
<hkern u1="W" u2="&#xfb;" k="20" />
<hkern u1="W" u2="&#xfa;" k="20" />
<hkern u1="W" u2="&#xf9;" k="20" />
<hkern u1="W" u2="&#xf8;" k="41" />
<hkern u1="W" u2="&#xf6;" k="41" />
<hkern u1="W" u2="&#xf5;" k="41" />
<hkern u1="W" u2="&#xf4;" k="41" />
<hkern u1="W" u2="&#xf3;" k="41" />
<hkern u1="W" u2="&#xf2;" k="41" />
<hkern u1="W" u2="&#xeb;" k="41" />
<hkern u1="W" u2="&#xea;" k="41" />
<hkern u1="W" u2="&#xe9;" k="41" />
<hkern u1="W" u2="&#xe8;" k="41" />
<hkern u1="W" u2="&#xe7;" k="41" />
<hkern u1="W" u2="&#xe6;" k="41" />
<hkern u1="W" u2="&#xe5;" k="41" />
<hkern u1="W" u2="&#xe4;" k="41" />
<hkern u1="W" u2="&#xe3;" k="41" />
<hkern u1="W" u2="&#xe2;" k="41" />
<hkern u1="W" u2="&#xe1;" k="41" />
<hkern u1="W" u2="&#xe0;" k="41" />
<hkern u1="W" u2="&#xd8;" k="20" />
<hkern u1="W" u2="&#xd6;" k="20" />
<hkern u1="W" u2="&#xd5;" k="20" />
<hkern u1="W" u2="&#xd4;" k="20" />
<hkern u1="W" u2="&#xd3;" k="20" />
<hkern u1="W" u2="&#xd2;" k="20" />
<hkern u1="W" u2="&#xc7;" k="20" />
<hkern u1="W" u2="&#xc5;" k="82" />
<hkern u1="W" u2="&#xc4;" k="82" />
<hkern u1="W" u2="&#xc3;" k="82" />
<hkern u1="W" u2="&#xc2;" k="82" />
<hkern u1="W" u2="&#xc1;" k="82" />
<hkern u1="W" u2="&#xc0;" k="82" />
<hkern u1="W" u2="u" k="20" />
<hkern u1="W" u2="s" k="20" />
<hkern u1="W" u2="r" k="20" />
<hkern u1="W" u2="q" k="41" />
<hkern u1="W" u2="p" k="20" />
<hkern u1="W" u2="o" k="41" />
<hkern u1="W" u2="n" k="20" />
<hkern u1="W" u2="m" k="20" />
<hkern u1="W" u2="g" k="20" />
<hkern u1="W" u2="e" k="41" />
<hkern u1="W" u2="d" k="41" />
<hkern u1="W" u2="c" k="41" />
<hkern u1="W" u2="a" k="41" />
<hkern u1="W" u2="Q" k="20" />
<hkern u1="W" u2="O" k="20" />
<hkern u1="W" u2="G" k="20" />
<hkern u1="W" u2="C" k="20" />
<hkern u1="W" u2="A" k="82" />
<hkern u1="W" u2="&#x3f;" k="-41" />
<hkern u1="W" u2="&#x2e;" k="102" />
<hkern u1="W" u2="&#x2c;" k="102" />
<hkern u1="X" u2="&#x152;" k="41" />
<hkern u1="X" u2="&#xd8;" k="41" />
<hkern u1="X" u2="&#xd6;" k="41" />
<hkern u1="X" u2="&#xd5;" k="41" />
<hkern u1="X" u2="&#xd4;" k="41" />
<hkern u1="X" u2="&#xd3;" k="41" />
<hkern u1="X" u2="&#xd2;" k="41" />
<hkern u1="X" u2="&#xc7;" k="41" />
<hkern u1="X" u2="Q" k="41" />
<hkern u1="X" u2="O" k="41" />
<hkern u1="X" u2="G" k="41" />
<hkern u1="X" u2="C" k="41" />
<hkern u1="Y" u2="&#x201e;" k="123" />
<hkern u1="Y" u2="&#x201a;" k="123" />
<hkern u1="Y" u2="&#x153;" k="102" />
<hkern u1="Y" u2="&#x152;" k="41" />
<hkern u1="Y" u2="&#xfc;" k="61" />
<hkern u1="Y" u2="&#xfb;" k="61" />
<hkern u1="Y" u2="&#xfa;" k="61" />
<hkern u1="Y" u2="&#xf9;" k="61" />
<hkern u1="Y" u2="&#xf8;" k="102" />
<hkern u1="Y" u2="&#xf6;" k="102" />
<hkern u1="Y" u2="&#xf5;" k="102" />
<hkern u1="Y" u2="&#xf4;" k="102" />
<hkern u1="Y" u2="&#xf3;" k="102" />
<hkern u1="Y" u2="&#xf2;" k="102" />
<hkern u1="Y" u2="&#xeb;" k="102" />
<hkern u1="Y" u2="&#xea;" k="102" />
<hkern u1="Y" u2="&#xe9;" k="102" />
<hkern u1="Y" u2="&#xe8;" k="102" />
<hkern u1="Y" u2="&#xe7;" k="102" />
<hkern u1="Y" u2="&#xe6;" k="102" />
<hkern u1="Y" u2="&#xe5;" k="102" />
<hkern u1="Y" u2="&#xe4;" k="102" />
<hkern u1="Y" u2="&#xe3;" k="102" />
<hkern u1="Y" u2="&#xe2;" k="102" />
<hkern u1="Y" u2="&#xe1;" k="102" />
<hkern u1="Y" u2="&#xe0;" k="102" />
<hkern u1="Y" u2="&#xd8;" k="41" />
<hkern u1="Y" u2="&#xd6;" k="41" />
<hkern u1="Y" u2="&#xd5;" k="41" />
<hkern u1="Y" u2="&#xd4;" k="41" />
<hkern u1="Y" u2="&#xd3;" k="41" />
<hkern u1="Y" u2="&#xd2;" k="41" />
<hkern u1="Y" u2="&#xc7;" k="41" />
<hkern u1="Y" u2="&#xc5;" k="123" />
<hkern u1="Y" u2="&#xc4;" k="123" />
<hkern u1="Y" u2="&#xc3;" k="123" />
<hkern u1="Y" u2="&#xc2;" k="123" />
<hkern u1="Y" u2="&#xc1;" k="123" />
<hkern u1="Y" u2="&#xc0;" k="123" />
<hkern u1="Y" u2="z" k="41" />
<hkern u1="Y" u2="u" k="61" />
<hkern u1="Y" u2="s" k="82" />
<hkern u1="Y" u2="r" k="61" />
<hkern u1="Y" u2="q" k="102" />
<hkern u1="Y" u2="p" k="61" />
<hkern u1="Y" u2="o" k="102" />
<hkern u1="Y" u2="n" k="61" />
<hkern u1="Y" u2="m" k="61" />
<hkern u1="Y" u2="g" k="41" />
<hkern u1="Y" u2="e" k="102" />
<hkern u1="Y" u2="d" k="102" />
<hkern u1="Y" u2="c" k="102" />
<hkern u1="Y" u2="a" k="102" />
<hkern u1="Y" u2="Q" k="41" />
<hkern u1="Y" u2="O" k="41" />
<hkern u1="Y" u2="G" k="41" />
<hkern u1="Y" u2="C" k="41" />
<hkern u1="Y" u2="A" k="123" />
<hkern u1="Y" u2="&#x3f;" k="-41" />
<hkern u1="Y" u2="&#x2e;" k="123" />
<hkern u1="Y" u2="&#x2c;" k="123" />
<hkern u1="Z" u2="&#x152;" k="20" />
<hkern u1="Z" u2="&#xd8;" k="20" />
<hkern u1="Z" u2="&#xd6;" k="20" />
<hkern u1="Z" u2="&#xd5;" k="20" />
<hkern u1="Z" u2="&#xd4;" k="20" />
<hkern u1="Z" u2="&#xd3;" k="20" />
<hkern u1="Z" u2="&#xd2;" k="20" />
<hkern u1="Z" u2="&#xc7;" k="20" />
<hkern u1="Z" u2="Q" k="20" />
<hkern u1="Z" u2="O" k="20" />
<hkern u1="Z" u2="G" k="20" />
<hkern u1="Z" u2="C" k="20" />
<hkern u1="[" u2="J" k="-184" />
<hkern u1="a" u2="&#x201d;" k="20" />
<hkern u1="a" u2="&#x2019;" k="20" />
<hkern u1="a" u2="&#x27;" k="20" />
<hkern u1="a" u2="&#x22;" k="20" />
<hkern u1="b" u2="&#x201d;" k="20" />
<hkern u1="b" u2="&#x2019;" k="20" />
<hkern u1="b" u2="&#xfd;" k="41" />
<hkern u1="b" u2="z" k="20" />
<hkern u1="b" u2="y" k="41" />
<hkern u1="b" u2="x" k="41" />
<hkern u1="b" u2="w" k="41" />
<hkern u1="b" u2="v" k="41" />
<hkern u1="b" u2="&#x27;" k="20" />
<hkern u1="b" u2="&#x22;" k="20" />
<hkern u1="c" u2="&#x201d;" k="-41" />
<hkern u1="c" u2="&#x2019;" k="-41" />
<hkern u1="c" u2="&#x27;" k="-41" />
<hkern u1="c" u2="&#x22;" k="-41" />
<hkern u1="e" u2="&#x201d;" k="20" />
<hkern u1="e" u2="&#x2019;" k="20" />
<hkern u1="e" u2="&#xfd;" k="41" />
<hkern u1="e" u2="z" k="20" />
<hkern u1="e" u2="y" k="41" />
<hkern u1="e" u2="x" k="41" />
<hkern u1="e" u2="w" k="41" />
<hkern u1="e" u2="v" k="41" />
<hkern u1="e" u2="&#x27;" k="20" />
<hkern u1="e" u2="&#x22;" k="20" />
<hkern u1="f" u2="&#x201d;" k="-123" />
<hkern u1="f" u2="&#x2019;" k="-123" />
<hkern u1="f" u2="&#x27;" k="-123" />
<hkern u1="f" u2="&#x22;" k="-123" />
<hkern u1="h" u2="&#x201d;" k="20" />
<hkern u1="h" u2="&#x2019;" k="20" />
<hkern u1="h" u2="&#x27;" k="20" />
<hkern u1="h" u2="&#x22;" k="20" />
<hkern u1="k" u2="&#x153;" k="41" />
<hkern u1="k" u2="&#xf8;" k="41" />
<hkern u1="k" u2="&#xf6;" k="41" />
<hkern u1="k" u2="&#xf5;" k="41" />
<hkern u1="k" u2="&#xf4;" k="41" />
<hkern u1="k" u2="&#xf3;" k="41" />
<hkern u1="k" u2="&#xf2;" k="41" />
<hkern u1="k" u2="&#xeb;" k="41" />
<hkern u1="k" u2="&#xea;" k="41" />
<hkern u1="k" u2="&#xe9;" k="41" />
<hkern u1="k" u2="&#xe8;" k="41" />
<hkern u1="k" u2="&#xe7;" k="41" />
<hkern u1="k" u2="&#xe0;" k="41" />
<hkern u1="k" u2="q" k="41" />
<hkern u1="k" u2="o" k="41" />
<hkern u1="k" u2="e" k="41" />
<hkern u1="k" u2="d" k="41" />
<hkern u1="k" u2="c" k="41" />
<hkern u1="m" u2="&#x201d;" k="20" />
<hkern u1="m" u2="&#x2019;" k="20" />
<hkern u1="m" u2="&#x27;" k="20" />
<hkern u1="m" u2="&#x22;" k="20" />
<hkern u1="n" u2="&#x201d;" k="20" />
<hkern u1="n" u2="&#x2019;" k="20" />
<hkern u1="n" u2="&#x27;" k="20" />
<hkern u1="n" u2="&#x22;" k="20" />
<hkern u1="o" u2="&#x201d;" k="20" />
<hkern u1="o" u2="&#x2019;" k="20" />
<hkern u1="o" u2="&#xfd;" k="41" />
<hkern u1="o" u2="z" k="20" />
<hkern u1="o" u2="y" k="41" />
<hkern u1="o" u2="x" k="41" />
<hkern u1="o" u2="w" k="41" />
<hkern u1="o" u2="v" k="41" />
<hkern u1="o" u2="&#x27;" k="20" />
<hkern u1="o" u2="&#x22;" k="20" />
<hkern u1="p" u2="&#x201d;" k="20" />
<hkern u1="p" u2="&#x2019;" k="20" />
<hkern u1="p" u2="&#xfd;" k="41" />
<hkern u1="p" u2="z" k="20" />
<hkern u1="p" u2="y" k="41" />
<hkern u1="p" u2="x" k="41" />
<hkern u1="p" u2="w" k="41" />
<hkern u1="p" u2="v" k="41" />
<hkern u1="p" u2="&#x27;" k="20" />
<hkern u1="p" u2="&#x22;" k="20" />
<hkern u1="r" u2="&#x201d;" k="-82" />
<hkern u1="r" u2="&#x2019;" k="-82" />
<hkern u1="r" u2="&#x153;" k="41" />
<hkern u1="r" u2="&#xf8;" k="41" />
<hkern u1="r" u2="&#xf6;" k="41" />
<hkern u1="r" u2="&#xf5;" k="41" />
<hkern u1="r" u2="&#xf4;" k="41" />
<hkern u1="r" u2="&#xf3;" k="41" />
<hkern u1="r" u2="&#xf2;" k="41" />
<hkern u1="r" u2="&#xeb;" k="41" />
<hkern u1="r" u2="&#xea;" k="41" />
<hkern u1="r" u2="&#xe9;" k="41" />
<hkern u1="r" u2="&#xe8;" k="41" />
<hkern u1="r" u2="&#xe7;" k="41" />
<hkern u1="r" u2="&#xe6;" k="41" />
<hkern u1="r" u2="&#xe5;" k="41" />
<hkern u1="r" u2="&#xe4;" k="41" />
<hkern u1="r" u2="&#xe3;" k="41" />
<hkern u1="r" u2="&#xe2;" k="41" />
<hkern u1="r" u2="&#xe1;" k="41" />
<hkern u1="r" u2="&#xe0;" k="41" />
<hkern u1="r" u2="q" k="41" />
<hkern u1="r" u2="o" k="41" />
<hkern u1="r" u2="g" k="20" />
<hkern u1="r" u2="e" k="41" />
<hkern u1="r" u2="d" k="41" />
<hkern u1="r" u2="c" k="41" />
<hkern u1="r" u2="a" k="41" />
<hkern u1="r" u2="&#x27;" k="-82" />
<hkern u1="r" u2="&#x22;" k="-82" />
<hkern u1="t" u2="&#x201d;" k="-41" />
<hkern u1="t" u2="&#x2019;" k="-41" />
<hkern u1="t" u2="&#x27;" k="-41" />
<hkern u1="t" u2="&#x22;" k="-41" />
<hkern u1="v" u2="&#x201e;" k="82" />
<hkern u1="v" u2="&#x201d;" k="-82" />
<hkern u1="v" u2="&#x201a;" k="82" />
<hkern u1="v" u2="&#x2019;" k="-82" />
<hkern u1="v" u2="&#x3f;" k="-41" />
<hkern u1="v" u2="&#x2e;" k="82" />
<hkern u1="v" u2="&#x2c;" k="82" />
<hkern u1="v" u2="&#x27;" k="-82" />
<hkern u1="v" u2="&#x22;" k="-82" />
<hkern u1="w" u2="&#x201e;" k="82" />
<hkern u1="w" u2="&#x201d;" k="-82" />
<hkern u1="w" u2="&#x201a;" k="82" />
<hkern u1="w" u2="&#x2019;" k="-82" />
<hkern u1="w" u2="&#x3f;" k="-41" />
<hkern u1="w" u2="&#x2e;" k="82" />
<hkern u1="w" u2="&#x2c;" k="82" />
<hkern u1="w" u2="&#x27;" k="-82" />
<hkern u1="w" u2="&#x22;" k="-82" />
<hkern u1="x" u2="&#x153;" k="41" />
<hkern u1="x" u2="&#xf8;" k="41" />
<hkern u1="x" u2="&#xf6;" k="41" />
<hkern u1="x" u2="&#xf5;" k="41" />
<hkern u1="x" u2="&#xf4;" k="41" />
<hkern u1="x" u2="&#xf3;" k="41" />
<hkern u1="x" u2="&#xf2;" k="41" />
<hkern u1="x" u2="&#xeb;" k="41" />
<hkern u1="x" u2="&#xea;" k="41" />
<hkern u1="x" u2="&#xe9;" k="41" />
<hkern u1="x" u2="&#xe8;" k="41" />
<hkern u1="x" u2="&#xe7;" k="41" />
<hkern u1="x" u2="&#xe0;" k="41" />
<hkern u1="x" u2="q" k="41" />
<hkern u1="x" u2="o" k="41" />
<hkern u1="x" u2="e" k="41" />
<hkern u1="x" u2="d" k="41" />
<hkern u1="x" u2="c" k="41" />
<hkern u1="y" u2="&#x201e;" k="82" />
<hkern u1="y" u2="&#x201d;" k="-82" />
<hkern u1="y" u2="&#x201a;" k="82" />
<hkern u1="y" u2="&#x2019;" k="-82" />
<hkern u1="y" u2="&#x3f;" k="-41" />
<hkern u1="y" u2="&#x2e;" k="82" />
<hkern u1="y" u2="&#x2c;" k="82" />
<hkern u1="y" u2="&#x27;" k="-82" />
<hkern u1="y" u2="&#x22;" k="-82" />
<hkern u1="&#x7b;" u2="J" k="-184" />
<hkern u1="&#xc0;" u2="&#x201d;" k="143" />
<hkern u1="&#xc0;" u2="&#x2019;" k="143" />
<hkern u1="&#xc0;" u2="&#x178;" k="123" />
<hkern u1="&#xc0;" u2="&#x152;" k="41" />
<hkern u1="&#xc0;" u2="&#xdd;" k="123" />
<hkern u1="&#xc0;" u2="&#xd8;" k="41" />
<hkern u1="&#xc0;" u2="&#xd6;" k="41" />
<hkern u1="&#xc0;" u2="&#xd5;" k="41" />
<hkern u1="&#xc0;" u2="&#xd4;" k="41" />
<hkern u1="&#xc0;" u2="&#xd3;" k="41" />
<hkern u1="&#xc0;" u2="&#xd2;" k="41" />
<hkern u1="&#xc0;" u2="&#xc7;" k="41" />
<hkern u1="&#xc0;" u2="Y" k="123" />
<hkern u1="&#xc0;" u2="W" k="82" />
<hkern u1="&#xc0;" u2="V" k="82" />
<hkern u1="&#xc0;" u2="T" k="143" />
<hkern u1="&#xc0;" u2="Q" k="41" />
<hkern u1="&#xc0;" u2="O" k="41" />
<hkern u1="&#xc0;" u2="J" k="-266" />
<hkern u1="&#xc0;" u2="G" k="41" />
<hkern u1="&#xc0;" u2="C" k="41" />
<hkern u1="&#xc0;" u2="&#x27;" k="143" />
<hkern u1="&#xc0;" u2="&#x22;" k="143" />
<hkern u1="&#xc1;" u2="&#x201d;" k="143" />
<hkern u1="&#xc1;" u2="&#x2019;" k="143" />
<hkern u1="&#xc1;" u2="&#x178;" k="123" />
<hkern u1="&#xc1;" u2="&#x152;" k="41" />
<hkern u1="&#xc1;" u2="&#xdd;" k="123" />
<hkern u1="&#xc1;" u2="&#xd8;" k="41" />
<hkern u1="&#xc1;" u2="&#xd6;" k="41" />
<hkern u1="&#xc1;" u2="&#xd5;" k="41" />
<hkern u1="&#xc1;" u2="&#xd4;" k="41" />
<hkern u1="&#xc1;" u2="&#xd3;" k="41" />
<hkern u1="&#xc1;" u2="&#xd2;" k="41" />
<hkern u1="&#xc1;" u2="&#xc7;" k="41" />
<hkern u1="&#xc1;" u2="Y" k="123" />
<hkern u1="&#xc1;" u2="W" k="82" />
<hkern u1="&#xc1;" u2="V" k="82" />
<hkern u1="&#xc1;" u2="T" k="143" />
<hkern u1="&#xc1;" u2="Q" k="41" />
<hkern u1="&#xc1;" u2="O" k="41" />
<hkern u1="&#xc1;" u2="J" k="-266" />
<hkern u1="&#xc1;" u2="G" k="41" />
<hkern u1="&#xc1;" u2="C" k="41" />
<hkern u1="&#xc1;" u2="&#x27;" k="143" />
<hkern u1="&#xc1;" u2="&#x22;" k="143" />
<hkern u1="&#xc2;" u2="&#x201d;" k="143" />
<hkern u1="&#xc2;" u2="&#x2019;" k="143" />
<hkern u1="&#xc2;" u2="&#x178;" k="123" />
<hkern u1="&#xc2;" u2="&#x152;" k="41" />
<hkern u1="&#xc2;" u2="&#xdd;" k="123" />
<hkern u1="&#xc2;" u2="&#xd8;" k="41" />
<hkern u1="&#xc2;" u2="&#xd6;" k="41" />
<hkern u1="&#xc2;" u2="&#xd5;" k="41" />
<hkern u1="&#xc2;" u2="&#xd4;" k="41" />
<hkern u1="&#xc2;" u2="&#xd3;" k="41" />
<hkern u1="&#xc2;" u2="&#xd2;" k="41" />
<hkern u1="&#xc2;" u2="&#xc7;" k="41" />
<hkern u1="&#xc2;" u2="Y" k="123" />
<hkern u1="&#xc2;" u2="W" k="82" />
<hkern u1="&#xc2;" u2="V" k="82" />
<hkern u1="&#xc2;" u2="T" k="143" />
<hkern u1="&#xc2;" u2="Q" k="41" />
<hkern u1="&#xc2;" u2="O" k="41" />
<hkern u1="&#xc2;" u2="J" k="-266" />
<hkern u1="&#xc2;" u2="G" k="41" />
<hkern u1="&#xc2;" u2="C" k="41" />
<hkern u1="&#xc2;" u2="&#x27;" k="143" />
<hkern u1="&#xc2;" u2="&#x22;" k="143" />
<hkern u1="&#xc3;" u2="&#x201d;" k="143" />
<hkern u1="&#xc3;" u2="&#x2019;" k="143" />
<hkern u1="&#xc3;" u2="&#x178;" k="123" />
<hkern u1="&#xc3;" u2="&#x152;" k="41" />
<hkern u1="&#xc3;" u2="&#xdd;" k="123" />
<hkern u1="&#xc3;" u2="&#xd8;" k="41" />
<hkern u1="&#xc3;" u2="&#xd6;" k="41" />
<hkern u1="&#xc3;" u2="&#xd5;" k="41" />
<hkern u1="&#xc3;" u2="&#xd4;" k="41" />
<hkern u1="&#xc3;" u2="&#xd3;" k="41" />
<hkern u1="&#xc3;" u2="&#xd2;" k="41" />
<hkern u1="&#xc3;" u2="&#xc7;" k="41" />
<hkern u1="&#xc3;" u2="Y" k="123" />
<hkern u1="&#xc3;" u2="W" k="82" />
<hkern u1="&#xc3;" u2="V" k="82" />
<hkern u1="&#xc3;" u2="T" k="143" />
<hkern u1="&#xc3;" u2="Q" k="41" />
<hkern u1="&#xc3;" u2="O" k="41" />
<hkern u1="&#xc3;" u2="J" k="-266" />
<hkern u1="&#xc3;" u2="G" k="41" />
<hkern u1="&#xc3;" u2="C" k="41" />
<hkern u1="&#xc3;" u2="&#x27;" k="143" />
<hkern u1="&#xc3;" u2="&#x22;" k="143" />
<hkern u1="&#xc4;" u2="&#x201d;" k="143" />
<hkern u1="&#xc4;" u2="&#x2019;" k="143" />
<hkern u1="&#xc4;" u2="&#x178;" k="123" />
<hkern u1="&#xc4;" u2="&#x152;" k="41" />
<hkern u1="&#xc4;" u2="&#xdd;" k="123" />
<hkern u1="&#xc4;" u2="&#xd8;" k="41" />
<hkern u1="&#xc4;" u2="&#xd6;" k="41" />
<hkern u1="&#xc4;" u2="&#xd5;" k="41" />
<hkern u1="&#xc4;" u2="&#xd4;" k="41" />
<hkern u1="&#xc4;" u2="&#xd3;" k="41" />
<hkern u1="&#xc4;" u2="&#xd2;" k="41" />
<hkern u1="&#xc4;" u2="&#xc7;" k="41" />
<hkern u1="&#xc4;" u2="Y" k="123" />
<hkern u1="&#xc4;" u2="W" k="82" />
<hkern u1="&#xc4;" u2="V" k="82" />
<hkern u1="&#xc4;" u2="T" k="143" />
<hkern u1="&#xc4;" u2="Q" k="41" />
<hkern u1="&#xc4;" u2="O" k="41" />
<hkern u1="&#xc4;" u2="J" k="-266" />
<hkern u1="&#xc4;" u2="G" k="41" />
<hkern u1="&#xc4;" u2="C" k="41" />
<hkern u1="&#xc4;" u2="&#x27;" k="143" />
<hkern u1="&#xc4;" u2="&#x22;" k="143" />
<hkern u1="&#xc5;" u2="&#x201d;" k="143" />
<hkern u1="&#xc5;" u2="&#x2019;" k="143" />
<hkern u1="&#xc5;" u2="&#x178;" k="123" />
<hkern u1="&#xc5;" u2="&#x152;" k="41" />
<hkern u1="&#xc5;" u2="&#xdd;" k="123" />
<hkern u1="&#xc5;" u2="&#xd8;" k="41" />
<hkern u1="&#xc5;" u2="&#xd6;" k="41" />
<hkern u1="&#xc5;" u2="&#xd5;" k="41" />
<hkern u1="&#xc5;" u2="&#xd4;" k="41" />
<hkern u1="&#xc5;" u2="&#xd3;" k="41" />
<hkern u1="&#xc5;" u2="&#xd2;" k="41" />
<hkern u1="&#xc5;" u2="&#xc7;" k="41" />
<hkern u1="&#xc5;" u2="Y" k="123" />
<hkern u1="&#xc5;" u2="W" k="82" />
<hkern u1="&#xc5;" u2="V" k="82" />
<hkern u1="&#xc5;" u2="T" k="143" />
<hkern u1="&#xc5;" u2="Q" k="41" />
<hkern u1="&#xc5;" u2="O" k="41" />
<hkern u1="&#xc5;" u2="J" k="-266" />
<hkern u1="&#xc5;" u2="G" k="41" />
<hkern u1="&#xc5;" u2="C" k="41" />
<hkern u1="&#xc5;" u2="&#x27;" k="143" />
<hkern u1="&#xc5;" u2="&#x22;" k="143" />
<hkern u1="&#xc6;" u2="J" k="-123" />
<hkern u1="&#xc7;" u2="&#x152;" k="41" />
<hkern u1="&#xc7;" u2="&#xd8;" k="41" />
<hkern u1="&#xc7;" u2="&#xd6;" k="41" />
<hkern u1="&#xc7;" u2="&#xd5;" k="41" />
<hkern u1="&#xc7;" u2="&#xd4;" k="41" />
<hkern u1="&#xc7;" u2="&#xd3;" k="41" />
<hkern u1="&#xc7;" u2="&#xd2;" k="41" />
<hkern u1="&#xc7;" u2="&#xc7;" k="41" />
<hkern u1="&#xc7;" u2="Q" k="41" />
<hkern u1="&#xc7;" u2="O" k="41" />
<hkern u1="&#xc7;" u2="G" k="41" />
<hkern u1="&#xc7;" u2="C" k="41" />
<hkern u1="&#xc8;" u2="J" k="-123" />
<hkern u1="&#xc9;" u2="J" k="-123" />
<hkern u1="&#xca;" u2="J" k="-123" />
<hkern u1="&#xcb;" u2="J" k="-123" />
<hkern u1="&#xd0;" u2="&#x201e;" k="82" />
<hkern u1="&#xd0;" u2="&#x201a;" k="82" />
<hkern u1="&#xd0;" u2="&#x178;" k="20" />
<hkern u1="&#xd0;" u2="&#xdd;" k="20" />
<hkern u1="&#xd0;" u2="&#xc5;" k="41" />
<hkern u1="&#xd0;" u2="&#xc4;" k="41" />
<hkern u1="&#xd0;" u2="&#xc3;" k="41" />
<hkern u1="&#xd0;" u2="&#xc2;" k="41" />
<hkern u1="&#xd0;" u2="&#xc1;" k="41" />
<hkern u1="&#xd0;" u2="&#xc0;" k="41" />
<hkern u1="&#xd0;" u2="Z" k="20" />
<hkern u1="&#xd0;" u2="Y" k="20" />
<hkern u1="&#xd0;" u2="X" k="41" />
<hkern u1="&#xd0;" u2="W" k="20" />
<hkern u1="&#xd0;" u2="V" k="20" />
<hkern u1="&#xd0;" u2="T" k="61" />
<hkern u1="&#xd0;" u2="A" k="41" />
<hkern u1="&#xd0;" u2="&#x2e;" k="82" />
<hkern u1="&#xd0;" u2="&#x2c;" k="82" />
<hkern u1="&#xd2;" u2="&#x201e;" k="82" />
<hkern u1="&#xd2;" u2="&#x201a;" k="82" />
<hkern u1="&#xd2;" u2="&#x178;" k="20" />
<hkern u1="&#xd2;" u2="&#xdd;" k="20" />
<hkern u1="&#xd2;" u2="&#xc5;" k="41" />
<hkern u1="&#xd2;" u2="&#xc4;" k="41" />
<hkern u1="&#xd2;" u2="&#xc3;" k="41" />
<hkern u1="&#xd2;" u2="&#xc2;" k="41" />
<hkern u1="&#xd2;" u2="&#xc1;" k="41" />
<hkern u1="&#xd2;" u2="&#xc0;" k="41" />
<hkern u1="&#xd2;" u2="Z" k="20" />
<hkern u1="&#xd2;" u2="Y" k="20" />
<hkern u1="&#xd2;" u2="X" k="41" />
<hkern u1="&#xd2;" u2="W" k="20" />
<hkern u1="&#xd2;" u2="V" k="20" />
<hkern u1="&#xd2;" u2="T" k="61" />
<hkern u1="&#xd2;" u2="A" k="41" />
<hkern u1="&#xd2;" u2="&#x2e;" k="82" />
<hkern u1="&#xd2;" u2="&#x2c;" k="82" />
<hkern u1="&#xd3;" u2="&#x201e;" k="82" />
<hkern u1="&#xd3;" u2="&#x201a;" k="82" />
<hkern u1="&#xd3;" u2="&#x178;" k="20" />
<hkern u1="&#xd3;" u2="&#xdd;" k="20" />
<hkern u1="&#xd3;" u2="&#xc5;" k="41" />
<hkern u1="&#xd3;" u2="&#xc4;" k="41" />
<hkern u1="&#xd3;" u2="&#xc3;" k="41" />
<hkern u1="&#xd3;" u2="&#xc2;" k="41" />
<hkern u1="&#xd3;" u2="&#xc1;" k="41" />
<hkern u1="&#xd3;" u2="&#xc0;" k="41" />
<hkern u1="&#xd3;" u2="Z" k="20" />
<hkern u1="&#xd3;" u2="Y" k="20" />
<hkern u1="&#xd3;" u2="X" k="41" />
<hkern u1="&#xd3;" u2="W" k="20" />
<hkern u1="&#xd3;" u2="V" k="20" />
<hkern u1="&#xd3;" u2="T" k="61" />
<hkern u1="&#xd3;" u2="A" k="41" />
<hkern u1="&#xd3;" u2="&#x2e;" k="82" />
<hkern u1="&#xd3;" u2="&#x2c;" k="82" />
<hkern u1="&#xd4;" u2="&#x201e;" k="82" />
<hkern u1="&#xd4;" u2="&#x201a;" k="82" />
<hkern u1="&#xd4;" u2="&#x178;" k="20" />
<hkern u1="&#xd4;" u2="&#xdd;" k="20" />
<hkern u1="&#xd4;" u2="&#xc5;" k="41" />
<hkern u1="&#xd4;" u2="&#xc4;" k="41" />
<hkern u1="&#xd4;" u2="&#xc3;" k="41" />
<hkern u1="&#xd4;" u2="&#xc2;" k="41" />
<hkern u1="&#xd4;" u2="&#xc1;" k="41" />
<hkern u1="&#xd4;" u2="&#xc0;" k="41" />
<hkern u1="&#xd4;" u2="Z" k="20" />
<hkern u1="&#xd4;" u2="Y" k="20" />
<hkern u1="&#xd4;" u2="X" k="41" />
<hkern u1="&#xd4;" u2="W" k="20" />
<hkern u1="&#xd4;" u2="V" k="20" />
<hkern u1="&#xd4;" u2="T" k="61" />
<hkern u1="&#xd4;" u2="A" k="41" />
<hkern u1="&#xd4;" u2="&#x2e;" k="82" />
<hkern u1="&#xd4;" u2="&#x2c;" k="82" />
<hkern u1="&#xd5;" u2="&#x201e;" k="82" />
<hkern u1="&#xd5;" u2="&#x201a;" k="82" />
<hkern u1="&#xd5;" u2="&#x178;" k="20" />
<hkern u1="&#xd5;" u2="&#xdd;" k="20" />
<hkern u1="&#xd5;" u2="&#xc5;" k="41" />
<hkern u1="&#xd5;" u2="&#xc4;" k="41" />
<hkern u1="&#xd5;" u2="&#xc3;" k="41" />
<hkern u1="&#xd5;" u2="&#xc2;" k="41" />
<hkern u1="&#xd5;" u2="&#xc1;" k="41" />
<hkern u1="&#xd5;" u2="&#xc0;" k="41" />
<hkern u1="&#xd5;" u2="Z" k="20" />
<hkern u1="&#xd5;" u2="Y" k="20" />
<hkern u1="&#xd5;" u2="X" k="41" />
<hkern u1="&#xd5;" u2="W" k="20" />
<hkern u1="&#xd5;" u2="V" k="20" />
<hkern u1="&#xd5;" u2="T" k="61" />
<hkern u1="&#xd5;" u2="A" k="41" />
<hkern u1="&#xd5;" u2="&#x2e;" k="82" />
<hkern u1="&#xd5;" u2="&#x2c;" k="82" />
<hkern u1="&#xd6;" u2="&#x201e;" k="82" />
<hkern u1="&#xd6;" u2="&#x201a;" k="82" />
<hkern u1="&#xd6;" u2="&#x178;" k="20" />
<hkern u1="&#xd6;" u2="&#xdd;" k="20" />
<hkern u1="&#xd6;" u2="&#xc5;" k="41" />
<hkern u1="&#xd6;" u2="&#xc4;" k="41" />
<hkern u1="&#xd6;" u2="&#xc3;" k="41" />
<hkern u1="&#xd6;" u2="&#xc2;" k="41" />
<hkern u1="&#xd6;" u2="&#xc1;" k="41" />
<hkern u1="&#xd6;" u2="&#xc0;" k="41" />
<hkern u1="&#xd6;" u2="Z" k="20" />
<hkern u1="&#xd6;" u2="Y" k="20" />
<hkern u1="&#xd6;" u2="X" k="41" />
<hkern u1="&#xd6;" u2="W" k="20" />
<hkern u1="&#xd6;" u2="V" k="20" />
<hkern u1="&#xd6;" u2="T" k="61" />
<hkern u1="&#xd6;" u2="A" k="41" />
<hkern u1="&#xd6;" u2="&#x2e;" k="82" />
<hkern u1="&#xd6;" u2="&#x2c;" k="82" />
<hkern u1="&#xd8;" u2="&#x201e;" k="82" />
<hkern u1="&#xd8;" u2="&#x201a;" k="82" />
<hkern u1="&#xd8;" u2="&#x178;" k="20" />
<hkern u1="&#xd8;" u2="&#xdd;" k="20" />
<hkern u1="&#xd8;" u2="&#xc5;" k="41" />
<hkern u1="&#xd8;" u2="&#xc4;" k="41" />
<hkern u1="&#xd8;" u2="&#xc3;" k="41" />
<hkern u1="&#xd8;" u2="&#xc2;" k="41" />
<hkern u1="&#xd8;" u2="&#xc1;" k="41" />
<hkern u1="&#xd8;" u2="&#xc0;" k="41" />
<hkern u1="&#xd8;" u2="Z" k="20" />
<hkern u1="&#xd8;" u2="Y" k="20" />
<hkern u1="&#xd8;" u2="X" k="41" />
<hkern u1="&#xd8;" u2="W" k="20" />
<hkern u1="&#xd8;" u2="V" k="20" />
<hkern u1="&#xd8;" u2="T" k="61" />
<hkern u1="&#xd8;" u2="A" k="41" />
<hkern u1="&#xd8;" u2="&#x2e;" k="82" />
<hkern u1="&#xd8;" u2="&#x2c;" k="82" />
<hkern u1="&#xd9;" u2="&#x201e;" k="41" />
<hkern u1="&#xd9;" u2="&#x201a;" k="41" />
<hkern u1="&#xd9;" u2="&#xc5;" k="20" />
<hkern u1="&#xd9;" u2="&#xc4;" k="20" />
<hkern u1="&#xd9;" u2="&#xc3;" k="20" />
<hkern u1="&#xd9;" u2="&#xc2;" k="20" />
<hkern u1="&#xd9;" u2="&#xc1;" k="20" />
<hkern u1="&#xd9;" u2="&#xc0;" k="20" />
<hkern u1="&#xd9;" u2="A" k="20" />
<hkern u1="&#xd9;" u2="&#x2e;" k="41" />
<hkern u1="&#xd9;" u2="&#x2c;" k="41" />
<hkern u1="&#xda;" u2="&#x201e;" k="41" />
<hkern u1="&#xda;" u2="&#x201a;" k="41" />
<hkern u1="&#xda;" u2="&#xc5;" k="20" />
<hkern u1="&#xda;" u2="&#xc4;" k="20" />
<hkern u1="&#xda;" u2="&#xc3;" k="20" />
<hkern u1="&#xda;" u2="&#xc2;" k="20" />
<hkern u1="&#xda;" u2="&#xc1;" k="20" />
<hkern u1="&#xda;" u2="&#xc0;" k="20" />
<hkern u1="&#xda;" u2="A" k="20" />
<hkern u1="&#xda;" u2="&#x2e;" k="41" />
<hkern u1="&#xda;" u2="&#x2c;" k="41" />
<hkern u1="&#xdb;" u2="&#x201e;" k="41" />
<hkern u1="&#xdb;" u2="&#x201a;" k="41" />
<hkern u1="&#xdb;" u2="&#xc5;" k="20" />
<hkern u1="&#xdb;" u2="&#xc4;" k="20" />
<hkern u1="&#xdb;" u2="&#xc3;" k="20" />
<hkern u1="&#xdb;" u2="&#xc2;" k="20" />
<hkern u1="&#xdb;" u2="&#xc1;" k="20" />
<hkern u1="&#xdb;" u2="&#xc0;" k="20" />
<hkern u1="&#xdb;" u2="A" k="20" />
<hkern u1="&#xdb;" u2="&#x2e;" k="41" />
<hkern u1="&#xdb;" u2="&#x2c;" k="41" />
<hkern u1="&#xdc;" u2="&#x201e;" k="41" />
<hkern u1="&#xdc;" u2="&#x201a;" k="41" />
<hkern u1="&#xdc;" u2="&#xc5;" k="20" />
<hkern u1="&#xdc;" u2="&#xc4;" k="20" />
<hkern u1="&#xdc;" u2="&#xc3;" k="20" />
<hkern u1="&#xdc;" u2="&#xc2;" k="20" />
<hkern u1="&#xdc;" u2="&#xc1;" k="20" />
<hkern u1="&#xdc;" u2="&#xc0;" k="20" />
<hkern u1="&#xdc;" u2="A" k="20" />
<hkern u1="&#xdc;" u2="&#x2e;" k="41" />
<hkern u1="&#xdc;" u2="&#x2c;" k="41" />
<hkern u1="&#xdd;" u2="&#x201e;" k="123" />
<hkern u1="&#xdd;" u2="&#x201a;" k="123" />
<hkern u1="&#xdd;" u2="&#x153;" k="102" />
<hkern u1="&#xdd;" u2="&#x152;" k="41" />
<hkern u1="&#xdd;" u2="&#xfc;" k="61" />
<hkern u1="&#xdd;" u2="&#xfb;" k="61" />
<hkern u1="&#xdd;" u2="&#xfa;" k="61" />
<hkern u1="&#xdd;" u2="&#xf9;" k="61" />
<hkern u1="&#xdd;" u2="&#xf8;" k="102" />
<hkern u1="&#xdd;" u2="&#xf6;" k="102" />
<hkern u1="&#xdd;" u2="&#xf5;" k="102" />
<hkern u1="&#xdd;" u2="&#xf4;" k="102" />
<hkern u1="&#xdd;" u2="&#xf3;" k="102" />
<hkern u1="&#xdd;" u2="&#xf2;" k="102" />
<hkern u1="&#xdd;" u2="&#xeb;" k="102" />
<hkern u1="&#xdd;" u2="&#xea;" k="102" />
<hkern u1="&#xdd;" u2="&#xe9;" k="102" />
<hkern u1="&#xdd;" u2="&#xe8;" k="102" />
<hkern u1="&#xdd;" u2="&#xe7;" k="102" />
<hkern u1="&#xdd;" u2="&#xe6;" k="102" />
<hkern u1="&#xdd;" u2="&#xe5;" k="102" />
<hkern u1="&#xdd;" u2="&#xe4;" k="102" />
<hkern u1="&#xdd;" u2="&#xe3;" k="102" />
<hkern u1="&#xdd;" u2="&#xe2;" k="102" />
<hkern u1="&#xdd;" u2="&#xe1;" k="102" />
<hkern u1="&#xdd;" u2="&#xe0;" k="102" />
<hkern u1="&#xdd;" u2="&#xd8;" k="41" />
<hkern u1="&#xdd;" u2="&#xd6;" k="41" />
<hkern u1="&#xdd;" u2="&#xd5;" k="41" />
<hkern u1="&#xdd;" u2="&#xd4;" k="41" />
<hkern u1="&#xdd;" u2="&#xd3;" k="41" />
<hkern u1="&#xdd;" u2="&#xd2;" k="41" />
<hkern u1="&#xdd;" u2="&#xc7;" k="41" />
<hkern u1="&#xdd;" u2="&#xc5;" k="123" />
<hkern u1="&#xdd;" u2="&#xc4;" k="123" />
<hkern u1="&#xdd;" u2="&#xc3;" k="123" />
<hkern u1="&#xdd;" u2="&#xc2;" k="123" />
<hkern u1="&#xdd;" u2="&#xc1;" k="123" />
<hkern u1="&#xdd;" u2="&#xc0;" k="123" />
<hkern u1="&#xdd;" u2="z" k="41" />
<hkern u1="&#xdd;" u2="u" k="61" />
<hkern u1="&#xdd;" u2="s" k="82" />
<hkern u1="&#xdd;" u2="r" k="61" />
<hkern u1="&#xdd;" u2="q" k="102" />
<hkern u1="&#xdd;" u2="p" k="61" />
<hkern u1="&#xdd;" u2="o" k="102" />
<hkern u1="&#xdd;" u2="n" k="61" />
<hkern u1="&#xdd;" u2="m" k="61" />
<hkern u1="&#xdd;" u2="g" k="41" />
<hkern u1="&#xdd;" u2="e" k="102" />
<hkern u1="&#xdd;" u2="d" k="102" />
<hkern u1="&#xdd;" u2="c" k="102" />
<hkern u1="&#xdd;" u2="a" k="102" />
<hkern u1="&#xdd;" u2="Q" k="41" />
<hkern u1="&#xdd;" u2="O" k="41" />
<hkern u1="&#xdd;" u2="G" k="41" />
<hkern u1="&#xdd;" u2="C" k="41" />
<hkern u1="&#xdd;" u2="A" k="123" />
<hkern u1="&#xdd;" u2="&#x3f;" k="-41" />
<hkern u1="&#xdd;" u2="&#x2e;" k="123" />
<hkern u1="&#xdd;" u2="&#x2c;" k="123" />
<hkern u1="&#xde;" u2="&#x201e;" k="266" />
<hkern u1="&#xde;" u2="&#x201a;" k="266" />
<hkern u1="&#xde;" u2="&#xc5;" k="102" />
<hkern u1="&#xde;" u2="&#xc4;" k="102" />
<hkern u1="&#xde;" u2="&#xc3;" k="102" />
<hkern u1="&#xde;" u2="&#xc2;" k="102" />
<hkern u1="&#xde;" u2="&#xc1;" k="102" />
<hkern u1="&#xde;" u2="&#xc0;" k="102" />
<hkern u1="&#xde;" u2="Z" k="20" />
<hkern u1="&#xde;" u2="X" k="41" />
<hkern u1="&#xde;" u2="A" k="102" />
<hkern u1="&#xde;" u2="&#x2e;" k="266" />
<hkern u1="&#xde;" u2="&#x2c;" k="266" />
<hkern u1="&#xe0;" u2="&#x201d;" k="20" />
<hkern u1="&#xe0;" u2="&#x2019;" k="20" />
<hkern u1="&#xe0;" u2="&#x27;" k="20" />
<hkern u1="&#xe0;" u2="&#x22;" k="20" />
<hkern u1="&#xe1;" u2="&#x201d;" k="20" />
<hkern u1="&#xe1;" u2="&#x2019;" k="20" />
<hkern u1="&#xe1;" u2="&#x27;" k="20" />
<hkern u1="&#xe1;" u2="&#x22;" k="20" />
<hkern u1="&#xe2;" u2="&#x201d;" k="20" />
<hkern u1="&#xe2;" u2="&#x2019;" k="20" />
<hkern u1="&#xe2;" u2="&#x27;" k="20" />
<hkern u1="&#xe2;" u2="&#x22;" k="20" />
<hkern u1="&#xe3;" u2="&#x201d;" k="20" />
<hkern u1="&#xe3;" u2="&#x2019;" k="20" />
<hkern u1="&#xe3;" u2="&#x27;" k="20" />
<hkern u1="&#xe3;" u2="&#x22;" k="20" />
<hkern u1="&#xe4;" u2="&#x201d;" k="20" />
<hkern u1="&#xe4;" u2="&#x2019;" k="20" />
<hkern u1="&#xe4;" u2="&#x27;" k="20" />
<hkern u1="&#xe4;" u2="&#x22;" k="20" />
<hkern u1="&#xe5;" u2="&#x201d;" k="20" />
<hkern u1="&#xe5;" u2="&#x2019;" k="20" />
<hkern u1="&#xe5;" u2="&#x27;" k="20" />
<hkern u1="&#xe5;" u2="&#x22;" k="20" />
<hkern u1="&#xe8;" u2="&#x201d;" k="20" />
<hkern u1="&#xe8;" u2="&#x2019;" k="20" />
<hkern u1="&#xe8;" u2="&#xfd;" k="41" />
<hkern u1="&#xe8;" u2="z" k="20" />
<hkern u1="&#xe8;" u2="y" k="41" />
<hkern u1="&#xe8;" u2="x" k="41" />
<hkern u1="&#xe8;" u2="w" k="41" />
<hkern u1="&#xe8;" u2="v" k="41" />
<hkern u1="&#xe8;" u2="&#x27;" k="20" />
<hkern u1="&#xe8;" u2="&#x22;" k="20" />
<hkern u1="&#xe9;" u2="&#x201d;" k="20" />
<hkern u1="&#xe9;" u2="&#x2019;" k="20" />
<hkern u1="&#xe9;" u2="&#xfd;" k="41" />
<hkern u1="&#xe9;" u2="z" k="20" />
<hkern u1="&#xe9;" u2="y" k="41" />
<hkern u1="&#xe9;" u2="x" k="41" />
<hkern u1="&#xe9;" u2="w" k="41" />
<hkern u1="&#xe9;" u2="v" k="41" />
<hkern u1="&#xe9;" u2="&#x27;" k="20" />
<hkern u1="&#xe9;" u2="&#x22;" k="20" />
<hkern u1="&#xea;" u2="&#x201d;" k="20" />
<hkern u1="&#xea;" u2="&#x2019;" k="20" />
<hkern u1="&#xea;" u2="&#xfd;" k="41" />
<hkern u1="&#xea;" u2="z" k="20" />
<hkern u1="&#xea;" u2="y" k="41" />
<hkern u1="&#xea;" u2="x" k="41" />
<hkern u1="&#xea;" u2="w" k="41" />
<hkern u1="&#xea;" u2="v" k="41" />
<hkern u1="&#xea;" u2="&#x27;" k="20" />
<hkern u1="&#xea;" u2="&#x22;" k="20" />
<hkern u1="&#xeb;" u2="&#x201d;" k="20" />
<hkern u1="&#xeb;" u2="&#x2019;" k="20" />
<hkern u1="&#xeb;" u2="&#xfd;" k="41" />
<hkern u1="&#xeb;" u2="z" k="20" />
<hkern u1="&#xeb;" u2="y" k="41" />
<hkern u1="&#xeb;" u2="x" k="41" />
<hkern u1="&#xeb;" u2="w" k="41" />
<hkern u1="&#xeb;" u2="v" k="41" />
<hkern u1="&#xeb;" u2="&#x27;" k="20" />
<hkern u1="&#xeb;" u2="&#x22;" k="20" />
<hkern u1="&#xf0;" u2="&#x201d;" k="20" />
<hkern u1="&#xf0;" u2="&#x2019;" k="20" />
<hkern u1="&#xf0;" u2="&#xfd;" k="41" />
<hkern u1="&#xf0;" u2="z" k="20" />
<hkern u1="&#xf0;" u2="y" k="41" />
<hkern u1="&#xf0;" u2="x" k="41" />
<hkern u1="&#xf0;" u2="w" k="41" />
<hkern u1="&#xf0;" u2="v" k="41" />
<hkern u1="&#xf0;" u2="&#x27;" k="20" />
<hkern u1="&#xf0;" u2="&#x22;" k="20" />
<hkern u1="&#xf2;" u2="&#x201d;" k="20" />
<hkern u1="&#xf2;" u2="&#x2019;" k="20" />
<hkern u1="&#xf2;" u2="&#xfd;" k="41" />
<hkern u1="&#xf2;" u2="z" k="20" />
<hkern u1="&#xf2;" u2="y" k="41" />
<hkern u1="&#xf2;" u2="x" k="41" />
<hkern u1="&#xf2;" u2="w" k="41" />
<hkern u1="&#xf2;" u2="v" k="41" />
<hkern u1="&#xf2;" u2="&#x27;" k="20" />
<hkern u1="&#xf2;" u2="&#x22;" k="20" />
<hkern u1="&#xf3;" u2="&#x201d;" k="20" />
<hkern u1="&#xf3;" u2="&#x2019;" k="20" />
<hkern u1="&#xf3;" u2="&#xfd;" k="41" />
<hkern u1="&#xf3;" u2="z" k="20" />
<hkern u1="&#xf3;" u2="y" k="41" />
<hkern u1="&#xf3;" u2="x" k="41" />
<hkern u1="&#xf3;" u2="w" k="41" />
<hkern u1="&#xf3;" u2="v" k="41" />
<hkern u1="&#xf3;" u2="&#x27;" k="20" />
<hkern u1="&#xf3;" u2="&#x22;" k="20" />
<hkern u1="&#xf4;" u2="&#x201d;" k="20" />
<hkern u1="&#xf4;" u2="&#x2019;" k="20" />
<hkern u1="&#xf4;" u2="&#xfd;" k="41" />
<hkern u1="&#xf4;" u2="z" k="20" />
<hkern u1="&#xf4;" u2="y" k="41" />
<hkern u1="&#xf4;" u2="x" k="41" />
<hkern u1="&#xf4;" u2="w" k="41" />
<hkern u1="&#xf4;" u2="v" k="41" />
<hkern u1="&#xf4;" u2="&#x27;" k="20" />
<hkern u1="&#xf4;" u2="&#x22;" k="20" />
<hkern u1="&#xf6;" u2="&#x201d;" k="41" />
<hkern u1="&#xf6;" u2="&#x2019;" k="41" />
<hkern u1="&#xf6;" u2="&#x27;" k="41" />
<hkern u1="&#xf6;" u2="&#x22;" k="41" />
<hkern u1="&#xf8;" u2="&#x201d;" k="20" />
<hkern u1="&#xf8;" u2="&#x2019;" k="20" />
<hkern u1="&#xf8;" u2="&#xfd;" k="41" />
<hkern u1="&#xf8;" u2="z" k="20" />
<hkern u1="&#xf8;" u2="y" k="41" />
<hkern u1="&#xf8;" u2="x" k="41" />
<hkern u1="&#xf8;" u2="w" k="41" />
<hkern u1="&#xf8;" u2="v" k="41" />
<hkern u1="&#xf8;" u2="&#x27;" k="20" />
<hkern u1="&#xf8;" u2="&#x22;" k="20" />
<hkern u1="&#xfd;" u2="&#x201e;" k="82" />
<hkern u1="&#xfd;" u2="&#x201d;" k="-82" />
<hkern u1="&#xfd;" u2="&#x201a;" k="82" />
<hkern u1="&#xfd;" u2="&#x2019;" k="-82" />
<hkern u1="&#xfd;" u2="&#x3f;" k="-41" />
<hkern u1="&#xfd;" u2="&#x2e;" k="82" />
<hkern u1="&#xfd;" u2="&#x2c;" k="82" />
<hkern u1="&#xfd;" u2="&#x27;" k="-82" />
<hkern u1="&#xfd;" u2="&#x22;" k="-82" />
<hkern u1="&#xfe;" u2="&#x201d;" k="20" />
<hkern u1="&#xfe;" u2="&#x2019;" k="20" />
<hkern u1="&#xfe;" u2="&#xfd;" k="41" />
<hkern u1="&#xfe;" u2="z" k="20" />
<hkern u1="&#xfe;" u2="y" k="41" />
<hkern u1="&#xfe;" u2="x" k="41" />
<hkern u1="&#xfe;" u2="w" k="41" />
<hkern u1="&#xfe;" u2="v" k="41" />
<hkern u1="&#xfe;" u2="&#x27;" k="20" />
<hkern u1="&#xfe;" u2="&#x22;" k="20" />
<hkern u1="&#xff;" u2="&#x201e;" k="82" />
<hkern u1="&#xff;" u2="&#x201d;" k="-82" />
<hkern u1="&#xff;" u2="&#x201a;" k="82" />
<hkern u1="&#xff;" u2="&#x2019;" k="-82" />
<hkern u1="&#xff;" u2="&#x3f;" k="-41" />
<hkern u1="&#xff;" u2="&#x2e;" k="82" />
<hkern u1="&#xff;" u2="&#x2c;" k="82" />
<hkern u1="&#xff;" u2="&#x27;" k="-82" />
<hkern u1="&#xff;" u2="&#x22;" k="-82" />
<hkern u1="&#x152;" u2="J" k="-123" />
<hkern u1="&#x178;" u2="&#x201e;" k="123" />
<hkern u1="&#x178;" u2="&#x201a;" k="123" />
<hkern u1="&#x178;" u2="&#x153;" k="102" />
<hkern u1="&#x178;" u2="&#x152;" k="41" />
<hkern u1="&#x178;" u2="&#xfc;" k="61" />
<hkern u1="&#x178;" u2="&#xfb;" k="61" />
<hkern u1="&#x178;" u2="&#xfa;" k="61" />
<hkern u1="&#x178;" u2="&#xf9;" k="61" />
<hkern u1="&#x178;" u2="&#xf8;" k="102" />
<hkern u1="&#x178;" u2="&#xf6;" k="102" />
<hkern u1="&#x178;" u2="&#xf5;" k="102" />
<hkern u1="&#x178;" u2="&#xf4;" k="102" />
<hkern u1="&#x178;" u2="&#xf3;" k="102" />
<hkern u1="&#x178;" u2="&#xf2;" k="102" />
<hkern u1="&#x178;" u2="&#xeb;" k="102" />
<hkern u1="&#x178;" u2="&#xea;" k="102" />
<hkern u1="&#x178;" u2="&#xe9;" k="102" />
<hkern u1="&#x178;" u2="&#xe8;" k="102" />
<hkern u1="&#x178;" u2="&#xe7;" k="102" />
<hkern u1="&#x178;" u2="&#xe6;" k="102" />
<hkern u1="&#x178;" u2="&#xe5;" k="102" />
<hkern u1="&#x178;" u2="&#xe4;" k="102" />
<hkern u1="&#x178;" u2="&#xe3;" k="102" />
<hkern u1="&#x178;" u2="&#xe2;" k="102" />
<hkern u1="&#x178;" u2="&#xe1;" k="102" />
<hkern u1="&#x178;" u2="&#xe0;" k="102" />
<hkern u1="&#x178;" u2="&#xd8;" k="41" />
<hkern u1="&#x178;" u2="&#xd6;" k="41" />
<hkern u1="&#x178;" u2="&#xd5;" k="41" />
<hkern u1="&#x178;" u2="&#xd4;" k="41" />
<hkern u1="&#x178;" u2="&#xd3;" k="41" />
<hkern u1="&#x178;" u2="&#xd2;" k="41" />
<hkern u1="&#x178;" u2="&#xc7;" k="41" />
<hkern u1="&#x178;" u2="&#xc5;" k="123" />
<hkern u1="&#x178;" u2="&#xc4;" k="123" />
<hkern u1="&#x178;" u2="&#xc3;" k="123" />
<hkern u1="&#x178;" u2="&#xc2;" k="123" />
<hkern u1="&#x178;" u2="&#xc1;" k="123" />
<hkern u1="&#x178;" u2="&#xc0;" k="123" />
<hkern u1="&#x178;" u2="z" k="41" />
<hkern u1="&#x178;" u2="u" k="61" />
<hkern u1="&#x178;" u2="s" k="82" />
<hkern u1="&#x178;" u2="r" k="61" />
<hkern u1="&#x178;" u2="q" k="102" />
<hkern u1="&#x178;" u2="p" k="61" />
<hkern u1="&#x178;" u2="o" k="102" />
<hkern u1="&#x178;" u2="n" k="61" />
<hkern u1="&#x178;" u2="m" k="61" />
<hkern u1="&#x178;" u2="g" k="41" />
<hkern u1="&#x178;" u2="e" k="102" />
<hkern u1="&#x178;" u2="d" k="102" />
<hkern u1="&#x178;" u2="c" k="102" />
<hkern u1="&#x178;" u2="a" k="102" />
<hkern u1="&#x178;" u2="Q" k="41" />
<hkern u1="&#x178;" u2="O" k="41" />
<hkern u1="&#x178;" u2="G" k="41" />
<hkern u1="&#x178;" u2="C" k="41" />
<hkern u1="&#x178;" u2="A" k="123" />
<hkern u1="&#x178;" u2="&#x3f;" k="-41" />
<hkern u1="&#x178;" u2="&#x2e;" k="123" />
<hkern u1="&#x178;" u2="&#x2c;" k="123" />
<hkern u1="&#x2013;" u2="T" k="82" />
<hkern u1="&#x2014;" u2="T" k="82" />
<hkern u1="&#x2018;" u2="&#x178;" k="-20" />
<hkern u1="&#x2018;" u2="&#x153;" k="123" />
<hkern u1="&#x2018;" u2="&#xfc;" k="61" />
<hkern u1="&#x2018;" u2="&#xfb;" k="61" />
<hkern u1="&#x2018;" u2="&#xfa;" k="61" />
<hkern u1="&#x2018;" u2="&#xf9;" k="61" />
<hkern u1="&#x2018;" u2="&#xf8;" k="123" />
<hkern u1="&#x2018;" u2="&#xf6;" k="123" />
<hkern u1="&#x2018;" u2="&#xf5;" k="123" />
<hkern u1="&#x2018;" u2="&#xf4;" k="123" />
<hkern u1="&#x2018;" u2="&#xf3;" k="123" />
<hkern u1="&#x2018;" u2="&#xf2;" k="123" />
<hkern u1="&#x2018;" u2="&#xeb;" k="123" />
<hkern u1="&#x2018;" u2="&#xea;" k="123" />
<hkern u1="&#x2018;" u2="&#xe9;" k="123" />
<hkern u1="&#x2018;" u2="&#xe8;" k="123" />
<hkern u1="&#x2018;" u2="&#xe7;" k="123" />
<hkern u1="&#x2018;" u2="&#xe6;" k="82" />
<hkern u1="&#x2018;" u2="&#xe5;" k="82" />
<hkern u1="&#x2018;" u2="&#xe4;" k="82" />
<hkern u1="&#x2018;" u2="&#xe3;" k="82" />
<hkern u1="&#x2018;" u2="&#xe2;" k="82" />
<hkern u1="&#x2018;" u2="&#xe1;" k="82" />
<hkern u1="&#x2018;" u2="&#xe0;" k="123" />
<hkern u1="&#x2018;" u2="&#xdd;" k="-20" />
<hkern u1="&#x2018;" u2="&#xc5;" k="143" />
<hkern u1="&#x2018;" u2="&#xc4;" k="143" />
<hkern u1="&#x2018;" u2="&#xc3;" k="143" />
<hkern u1="&#x2018;" u2="&#xc2;" k="143" />
<hkern u1="&#x2018;" u2="&#xc1;" k="143" />
<hkern u1="&#x2018;" u2="&#xc0;" k="143" />
<hkern u1="&#x2018;" u2="u" k="61" />
<hkern u1="&#x2018;" u2="s" k="61" />
<hkern u1="&#x2018;" u2="r" k="61" />
<hkern u1="&#x2018;" u2="q" k="123" />
<hkern u1="&#x2018;" u2="p" k="61" />
<hkern u1="&#x2018;" u2="o" k="123" />
<hkern u1="&#x2018;" u2="n" k="61" />
<hkern u1="&#x2018;" u2="m" k="61" />
<hkern u1="&#x2018;" u2="g" k="61" />
<hkern u1="&#x2018;" u2="e" k="123" />
<hkern u1="&#x2018;" u2="d" k="123" />
<hkern u1="&#x2018;" u2="c" k="123" />
<hkern u1="&#x2018;" u2="a" k="82" />
<hkern u1="&#x2018;" u2="Y" k="-20" />
<hkern u1="&#x2018;" u2="W" k="-41" />
<hkern u1="&#x2018;" u2="V" k="-41" />
<hkern u1="&#x2018;" u2="T" k="-41" />
<hkern u1="&#x2018;" u2="A" k="143" />
<hkern u1="&#x2019;" u2="&#x178;" k="-20" />
<hkern u1="&#x2019;" u2="&#x153;" k="123" />
<hkern u1="&#x2019;" u2="&#xfc;" k="61" />
<hkern u1="&#x2019;" u2="&#xfb;" k="61" />
<hkern u1="&#x2019;" u2="&#xfa;" k="61" />
<hkern u1="&#x2019;" u2="&#xf9;" k="61" />
<hkern u1="&#x2019;" u2="&#xf8;" k="123" />
<hkern u1="&#x2019;" u2="&#xf6;" k="123" />
<hkern u1="&#x2019;" u2="&#xf5;" k="123" />
<hkern u1="&#x2019;" u2="&#xf4;" k="123" />
<hkern u1="&#x2019;" u2="&#xf3;" k="123" />
<hkern u1="&#x2019;" u2="&#xf2;" k="123" />
<hkern u1="&#x2019;" u2="&#xeb;" k="123" />
<hkern u1="&#x2019;" u2="&#xea;" k="123" />
<hkern u1="&#x2019;" u2="&#xe9;" k="123" />
<hkern u1="&#x2019;" u2="&#xe8;" k="123" />
<hkern u1="&#x2019;" u2="&#xe7;" k="123" />
<hkern u1="&#x2019;" u2="&#xe6;" k="82" />
<hkern u1="&#x2019;" u2="&#xe5;" k="82" />
<hkern u1="&#x2019;" u2="&#xe4;" k="82" />
<hkern u1="&#x2019;" u2="&#xe3;" k="82" />
<hkern u1="&#x2019;" u2="&#xe2;" k="82" />
<hkern u1="&#x2019;" u2="&#xe1;" k="82" />
<hkern u1="&#x2019;" u2="&#xe0;" k="123" />
<hkern u1="&#x2019;" u2="&#xdd;" k="-20" />
<hkern u1="&#x2019;" u2="&#xc5;" k="143" />
<hkern u1="&#x2019;" u2="&#xc4;" k="143" />
<hkern u1="&#x2019;" u2="&#xc3;" k="143" />
<hkern u1="&#x2019;" u2="&#xc2;" k="143" />
<hkern u1="&#x2019;" u2="&#xc1;" k="143" />
<hkern u1="&#x2019;" u2="&#xc0;" k="143" />
<hkern u1="&#x2019;" u2="u" k="61" />
<hkern u1="&#x2019;" u2="s" k="61" />
<hkern u1="&#x2019;" u2="r" k="61" />
<hkern u1="&#x2019;" u2="q" k="123" />
<hkern u1="&#x2019;" u2="p" k="61" />
<hkern u1="&#x2019;" u2="o" k="123" />
<hkern u1="&#x2019;" u2="n" k="61" />
<hkern u1="&#x2019;" u2="m" k="61" />
<hkern u1="&#x2019;" u2="g" k="61" />
<hkern u1="&#x2019;" u2="e" k="123" />
<hkern u1="&#x2019;" u2="d" k="123" />
<hkern u1="&#x2019;" u2="c" k="123" />
<hkern u1="&#x2019;" u2="a" k="82" />
<hkern u1="&#x2019;" u2="Y" k="-20" />
<hkern u1="&#x2019;" u2="W" k="-41" />
<hkern u1="&#x2019;" u2="V" k="-41" />
<hkern u1="&#x2019;" u2="T" k="-41" />
<hkern u1="&#x2019;" u2="A" k="143" />
<hkern u1="&#x201a;" u2="&#x178;" k="123" />
<hkern u1="&#x201a;" u2="&#x152;" k="102" />
<hkern u1="&#x201a;" u2="&#xdd;" k="123" />
<hkern u1="&#x201a;" u2="&#xdc;" k="41" />
<hkern u1="&#x201a;" u2="&#xdb;" k="41" />
<hkern u1="&#x201a;" u2="&#xda;" k="41" />
<hkern u1="&#x201a;" u2="&#xd9;" k="41" />
<hkern u1="&#x201a;" u2="&#xd8;" k="102" />
<hkern u1="&#x201a;" u2="&#xd6;" k="102" />
<hkern u1="&#x201a;" u2="&#xd5;" k="102" />
<hkern u1="&#x201a;" u2="&#xd4;" k="102" />
<hkern u1="&#x201a;" u2="&#xd3;" k="102" />
<hkern u1="&#x201a;" u2="&#xd2;" k="102" />
<hkern u1="&#x201a;" u2="&#xc7;" k="102" />
<hkern u1="&#x201a;" u2="Y" k="123" />
<hkern u1="&#x201a;" u2="W" k="123" />
<hkern u1="&#x201a;" u2="V" k="123" />
<hkern u1="&#x201a;" u2="U" k="41" />
<hkern u1="&#x201a;" u2="T" k="143" />
<hkern u1="&#x201a;" u2="Q" k="102" />
<hkern u1="&#x201a;" u2="O" k="102" />
<hkern u1="&#x201a;" u2="G" k="102" />
<hkern u1="&#x201a;" u2="C" k="102" />
<hkern u1="&#x201c;" u2="&#x178;" k="-20" />
<hkern u1="&#x201c;" u2="&#x153;" k="123" />
<hkern u1="&#x201c;" u2="&#xfc;" k="61" />
<hkern u1="&#x201c;" u2="&#xfb;" k="61" />
<hkern u1="&#x201c;" u2="&#xfa;" k="61" />
<hkern u1="&#x201c;" u2="&#xf9;" k="61" />
<hkern u1="&#x201c;" u2="&#xf8;" k="123" />
<hkern u1="&#x201c;" u2="&#xf6;" k="123" />
<hkern u1="&#x201c;" u2="&#xf5;" k="123" />
<hkern u1="&#x201c;" u2="&#xf4;" k="123" />
<hkern u1="&#x201c;" u2="&#xf3;" k="123" />
<hkern u1="&#x201c;" u2="&#xf2;" k="123" />
<hkern u1="&#x201c;" u2="&#xeb;" k="123" />
<hkern u1="&#x201c;" u2="&#xea;" k="123" />
<hkern u1="&#x201c;" u2="&#xe9;" k="123" />
<hkern u1="&#x201c;" u2="&#xe8;" k="123" />
<hkern u1="&#x201c;" u2="&#xe7;" k="123" />
<hkern u1="&#x201c;" u2="&#xe6;" k="82" />
<hkern u1="&#x201c;" u2="&#xe5;" k="82" />
<hkern u1="&#x201c;" u2="&#xe4;" k="82" />
<hkern u1="&#x201c;" u2="&#xe3;" k="82" />
<hkern u1="&#x201c;" u2="&#xe2;" k="82" />
<hkern u1="&#x201c;" u2="&#xe1;" k="82" />
<hkern u1="&#x201c;" u2="&#xe0;" k="123" />
<hkern u1="&#x201c;" u2="&#xdd;" k="-20" />
<hkern u1="&#x201c;" u2="&#xc5;" k="143" />
<hkern u1="&#x201c;" u2="&#xc4;" k="143" />
<hkern u1="&#x201c;" u2="&#xc3;" k="143" />
<hkern u1="&#x201c;" u2="&#xc2;" k="143" />
<hkern u1="&#x201c;" u2="&#xc1;" k="143" />
<hkern u1="&#x201c;" u2="&#xc0;" k="143" />
<hkern u1="&#x201c;" u2="u" k="61" />
<hkern u1="&#x201c;" u2="s" k="61" />
<hkern u1="&#x201c;" u2="r" k="61" />
<hkern u1="&#x201c;" u2="q" k="123" />
<hkern u1="&#x201c;" u2="p" k="61" />
<hkern u1="&#x201c;" u2="o" k="123" />
<hkern u1="&#x201c;" u2="n" k="61" />
<hkern u1="&#x201c;" u2="m" k="61" />
<hkern u1="&#x201c;" u2="g" k="61" />
<hkern u1="&#x201c;" u2="e" k="123" />
<hkern u1="&#x201c;" u2="d" k="123" />
<hkern u1="&#x201c;" u2="c" k="123" />
<hkern u1="&#x201c;" u2="a" k="82" />
<hkern u1="&#x201c;" u2="Y" k="-20" />
<hkern u1="&#x201c;" u2="W" k="-41" />
<hkern u1="&#x201c;" u2="V" k="-41" />
<hkern u1="&#x201c;" u2="T" k="-41" />
<hkern u1="&#x201c;" u2="A" k="143" />
<hkern u1="&#x201e;" u2="&#x178;" k="123" />
<hkern u1="&#x201e;" u2="&#x152;" k="102" />
<hkern u1="&#x201e;" u2="&#xdd;" k="123" />
<hkern u1="&#x201e;" u2="&#xdc;" k="41" />
<hkern u1="&#x201e;" u2="&#xdb;" k="41" />
<hkern u1="&#x201e;" u2="&#xda;" k="41" />
<hkern u1="&#x201e;" u2="&#xd9;" k="41" />
<hkern u1="&#x201e;" u2="&#xd8;" k="102" />
<hkern u1="&#x201e;" u2="&#xd6;" k="102" />
<hkern u1="&#x201e;" u2="&#xd5;" k="102" />
<hkern u1="&#x201e;" u2="&#xd4;" k="102" />
<hkern u1="&#x201e;" u2="&#xd3;" k="102" />
<hkern u1="&#x201e;" u2="&#xd2;" k="102" />
<hkern u1="&#x201e;" u2="&#xc7;" k="102" />
<hkern u1="&#x201e;" u2="Y" k="123" />
<hkern u1="&#x201e;" u2="W" k="123" />
<hkern u1="&#x201e;" u2="V" k="123" />
<hkern u1="&#x201e;" u2="U" k="41" />
<hkern u1="&#x201e;" u2="T" k="143" />
<hkern u1="&#x201e;" u2="Q" k="102" />
<hkern u1="&#x201e;" u2="O" k="102" />
<hkern u1="&#x201e;" u2="G" k="102" />
<hkern u1="&#x201e;" u2="C" k="102" />
</font>
</defs></svg> wOFF     W     4                       FFTM        cTNGDEF          GPOS      	-rBGSUB        bOS/2     `   `Icmap  l    olcvt   	   2   <+sfpgm  	<    	zAgasp  8         glyf  @  @v  pXxYhead  N   4   6chhea  N      $hmtx  O  8  1Lloca  QD    }Omaxp  S        !<name  S<    0gЌhpost  U     prep  W      D"webf  W      h_Q       =    B    xc`d``b	`b`w@1  !  xڭMLG,miӏhc(4)1 bk?LIcҐx@WCXjEQ`	~A.zSNcv+m/23VIeg55ס?{޵[{>j6)yyٽ{)S4	EsNh/rE,LEْt͖ί-r4\:/xOT"H'ĻK?lV:_r )X	IOttJo2OuzMF=|NZ[! 9 o 3< p.n.%p`:܀pIG^cz^UyPGU~Iho?C 	|O)8O0?!Z,*H,l׀WrYrYrYrYrYrYrb{uYY!ќFƍA88GBDG4-Wúrju_23/Jtezjj`L&'~T@.Tғ*wU@%{YPPFC57͡ABgeͼkVh-D
);;+͸G;/bxgdaE0W`5j7&Zۼ6[2U,xU;vTQ?UovoY0:4tgϢE?~9ϢC?~>k9Ț#k9rhʡC+VZYheʢE+V,ZYheʢE+V,ZYhʡC+N6tl/C4-
m=/}i\/w*Cu3tbеkC׆]6tmеkC׆]6tmݥ,UE^xb[:Tfdh[0~fzӏ*:mή!vة=G?Η8MYxb)s_zN[{+icc-+KïP*YBoMvV&4q۽V.FڢvNR`j1V^}Vc:z 46]6kDzc;~XZV}O\ xc`d``bb``qq	aJ,aPI/JfI,c``aH`c	00(0I(TƜDYz"z`h[fO7`ڇ5
H U22x     {  3  3   f @  [   (    1ASC   ff        ^     xc```f`F1,	%d21g4df`:tBBEYԿ +AA@ABAE#P?G|plzmX?%$F6VF&  4,l\<|B"bR2r
J*jZ:zF&fV6vN.n^>~A!aQ1q	mݓg[hɲW^fu6n޺eێ{vPybaA,Y`0՘b>Hjj~w޼'=~=ޮ	Nc2gCN20j 	xc`@_AuK?޿gag)gpa 5x  xڝUiwF$%u3qȄ-0i*v!]],t;Y)#?6'GΛ\cDOq:Tr R>屒 nV)iDl7;K\vr*3%A£W' H4IO?I8(I)8f eJ^R6â*Ϻ`r#\^mq:Im=Q@*F#)9QRRZL~G22e+*u۶uQ4SuFlGDy6N'ζ/LQvͶ1p)%3}tHXձ
ng$(Uy
Qo fg/.dE@np/X)Q\EHJOĉ>xA\P"̡+ά54^coWJMIFSw"Y8Glk>Zݽؑ9qwY'󴘯.7@<)\ڷLQ}eSTh*)hM1M{5wL1C{H#9!7MrӾܴ 7Bnr^@nZܴ+Fu4Χ*idø5Y5ɻ!u*Չ/ȥ\\wiݶv_Z3ꆭ70Єo7uXsPA`R (kN q9MR}14}/{<8-]ZDuܘ=[Luud[1+Iyv%UVދj|dpCh=v)MyT)JepʃZĸujkz!H)]ߴwkxt#9Oq(x~tm^naJ>S}TV-5ͺFNXZ@MHU11eM.oZlUw}sv_esȺڠ\s$E@얬zg2c9u/LNYhS*˖]nˆ9vGhlixb{]\ 84r&6]zjlΕD]s8K7Ǯ|`=ȹpr>%3rn|N!%rCG#r6$+rbrrn<&	9_CB6&Pj6k>}`هzdK"RܘPR_,"v$sah     x}k`yn{&{JlB,I%I 	)B@@DHD" RJ"E-  (HZ`-*B2|gM6}'.Yv9gΙ36L%eeFG횜uQŷEkjjK?<6)Y2o$/NK3$ RBTM$%8ّ^
.Ȅ0;jd\p1Ukk8FDֈ7NW$YBL	5YS Ը5K//`LȠPDq1FXJ"Qj`4ZJe4"Һ3I	n_BhtxS/GP
K	y{ eǆ}TwaǇ8VMk=ޔ~>kUGI6|R"c./T;I'Y$%MT6YK%D$FZt%JlNSqS\ނ̀mPЫ wk3
.P/=ƕ;KOR}ee-CxR	
*^^ΧV
YهCn֮~t׻w9	|V^y$\mC%4jX֢I&J\m Y˒lK:7τzpȟ1Te(	\n]~OZj+22̜^Ur\ɏWܾey%oŝ?ɂ斋?OXlg>c|F%T<r0QIyS
J(LEո>I"Հ[(~K3iTF渠@fB׌8ՕF5(,Ts
+yrJؒYo<Ǉ}ՏRn}hLd;z­Kbtştѿy[1g;={vy¢ѓAyq~>czy\G3BG$\BPApJIZ*AsUl7{(	t[,Am98{QP.ͤUO?vq٣?x54=,wpꇰ`E4 aAռ^4ӆG]؏]p߳<5SU'PVLAA`%&Jp|S8V$Z!Hf_jl[6-3' LVƖvl.Cs ;b#C>L
*V AP*Bb cq"|6ؼlCH:|X@ۑE~Uڋ<N?胄co`:#`Mt4]kaEV(DtxN%(Fkf_",B#gy[rYDHaQRY4(;nE[~<Xy=$!Ƈ]ep{G=gýShG|]je/
RkͷMw˔i8[a,^חg1O9ũU,L$)6hsm	qH{6JIeJ8ƤVKX**V:&74Mn$ eYgCBh4\N+Ă#h0nTZ{Ӧlj\;nX{7m>_x[1+ݰ㎉/EIf eTtTXP\
ZYVQ9jocesOHdp+<ǩ@x#\ɗeU/d5݆۴kͿקӗɧvA)luknGwq_Ë)A
B**e\(rRY	2n/IV(fp8W/]׋VQRdb;=IZ&_QU2܀|+9$P(I%0"(jYr%Mlm:dHbs[zA/(Iu}~~C2;^po")do?i߱ܵ.K	]d'5+` >RࢩVBJTmąUI,TC-W]rYRbzD_qx3NēvYA껜.Xiat~}3պ.q&4/n`;l9n6W*Hc)UY/x[$mGu[+E\GZd[NOzLKVݞs+Pcd\Z=vUV ڨ3zu|^ )I1gՑ)e}7ʜģQ g}.~6w5κ}>aW4(X7׏yc;jݣM,]2[Y~_AAH|-U8gZJFdT۶vir'-ɟek	q\
pkQ"vDK.gO{&̟}MP@4`\~[?>=tb=q<+Jo.ގYv"=T֌A<&r<*P&ɑ3dTV	ek6rq(q9~0Rt;Vlgݺ٤#t\Aڃ?*h4dHعc:'rPAD%:u(T`$-op8bpD`:? B"-g8)i-|.Kš'BqKPQ#PD蒂O%zUt>@W
QgմɥFӴ/ٱ|##X6xmo_9.P2$ ^U;$@74U.7q#վ*Z䃦j7`2@$Tֿu~ߏJ5cm;-9w/dJȥz҉݇| O=XizqS]uR&6K~vӇ`el)&j~~oW?>ΰ{S;' _xXٍCzr͜z;(8d)!7}!C9=1E%EMv*|3P+/qݾ{W>6/-J:ץ*U(2UjE}'&&'e<9OP	;.8E8CZO@{f_c-,d3m^'Ҭ#ol9#\ǓPЁSC0g%p=F.)Ǚ(4T|	9olۺ|pj|x!46nz֖@o"tJ2s7ac):ףG/xmte6fٸOh؟d*;lkLB~\] SDDq _2m)sFd`pIGm gDT4ڒV}M I*AfuI@?eS]WdD3::>pDÍG*y觴lُsn=yֵ;Woi`VSw?,0{ag/9!OQ$xJE
Y]K)+yLb﴾ކBZ
tNR|~B#L8/sPb5<߷
yH#tFV%!#CJu~츑@@/QgG&W(4
bU@(c/nLy2[HZ(b|	w,4УE{)#Zp't<c#?[F`N
gV{h
QtMEiRe677Gr%L+e1AH:Wa3xkwq ?^lсvz#U>,FDn鎼{yiI;	sY<sUA.).rz@b-WͭK@t>\ĮkƮؕxtYGbnx@fjg^}f'J6ig!' _tY"'i:)F*ؼtʌdC9(pvG,XFw7Q.bpԙS5}be)A'Ng,	]C\>{@ 6ődHQ{5_~ƱY3\%]t	'lJF}`E(	np񇗯GVlmbI'7izXቅQYPɍ0$ԅ*x`;BN1ஊƝ׻n)j4x`h_~xfgV?jXuc bXNiwu
3$_q|(/<\ JP)~]]aoY| >esʓE*N^Oͩʸ\QM_}ނlKź璴ezԬ]aB</5<%CEE(fl+bpTsHO.^Vg:Lm7LsOUx꣄Ceۖ[>)0澔E7`YuCǼx5?v5_<	-?t+<lE;ϕH^Y`K;*:nbnYS7>Tz~KlZ[se&GJ(QEKՙv9Ɂ2.<e0Bc[=Ng/t&Q
R{jnGR["3/:ZNj-I_y..g,!ɡ6FSA?b)O>aՋG/n-DO@;q8$xmxQm@;h ?XLeU1o51.ARJ\N2hмF0G9igK9],[<9;g|m<	3REV~?CeG|y<׍ʥv}Η[/qM|=X2Wy8[j 6H h1Q6;biPm>djF4G$!!]m7×a3:s<H0\6 %7iRð/K>;rhZ!6om|o*c.7ۋHՉZ*ܩG_'kpR#*6 äq%)(㤫Cۑ$'(ɉ4g-.b
SNv\L^[`,tg`H|~pWKȳX̘HQ?}<N?/:٪Wo<Zώg~ag,#i=RzC&T@.papnzlq8"t!{׌|wgǬRTz&Տ:wW|vsg!ĉ#H38~-w,}MrQtCȝǋS%gj:-R5HJ1Ffrx -JnrCW}bfOS7Oy!po~<bÿ|.F:Ƌ<V2%`piYFRqTh֠wmVlH%pTjU̓Q$<(rM6loٟ!`h<zG̟9s~K76o>qc]
iY$YLqnTb']Jlآ8y\A8L;iίܖ%ǫa}]9iȫlRHBd. ~rҍhI\,>;}Z?#Tm`-ZMTU9ŵQX#H\s|Cw}2M藸4"(*}M?m;vCdt͐祏r{lz}
{cP1=cN[m9sz#6nrCVSo'>Fegnl%yz65վ-ZpHPcw(ѷ8[TC%hlXЏM{og!O&mtٷ[~juǈӀKaUS,&cz:zE7VWo`_r"̜f'ׅ
Z9`!d$Ƶ_	U~Do*Ep=rЍng0g7#͗Ѧ{q+'ci(< Jب䁕Xm]EHwH]ѓ/Tqa$Kn]'n85ч.=pPX,͆[$:0ix$Ԁn(uQ hPF |R͏,mPxq!HaI
\w<DJ^W42ۖK5ɹ}ʛfLݲ[~Ww5?[MV'ӚHtREh <@$.$MPSNYxtL!AR}|= _Y} 	ۈL%1?"Zg7|BD~I	ϛ2u>a(Im7nxc.6CχE݁Q8g#hZæ4<#˯y,^HJ3͕fս#Uaz0PmNJ	y*gűrSr{O齉ǳ>j}؅_Jtۋ|MoMҠm_srnM67z}ԪJp$K^;Yc*18"V~J;X$eďNc2})ONlz!cb_ѿus1r;~S*Gi),D+IƟDj7_qB}[,a7RX]9ʍDhb38gnÎg=EyݴjIA~w, -~I&NywQ{Smy`7]y[rcc-~ncCyaqº97|nG7fSPw8"e(bkQ@z>=YjRP,DAl)ad.\Vt5.E.q҅. x9#fܾ4f7~4+4y3gO_9И:]HB!i㉳XF<}}ƫHI0ԿU؏	Hh
ԯËA
E+;.oǬoAכbY\mRumyy+^ykRD
G)=,,rx 60>dl\ߺhqi 8GGة$/ԝ'X)^m!$U>n=:yg͢|WG7 xI1Ee^0-]~	#1jnz rζ<$3⯆nEZ})/us|@LH*A{Z(ŨJDMANvJ50	hfNaie@C-&m<Cq c|#zB@sY#q}mRp$|auj @djN?7fТs3fZKg_r~ۘ	Ei3F)Z9'~6,*KJv=_hJcNt:4Rhq-Mal)x5z/b8eC
\P|!mQ==?aMuTS'AeFA kx AשVm~]f#p7#V9sAA?Z/xj3%ғ!|)ZN"7EyJmK9k37.TP9S+/n^;Ӳ <z͒rI'fF<Wu_XjF7T%V*h%:Is]n৷zfǹ"bѭPΙPR\xS7.p|=.k"iEϧ%Ifpe>4"숥b{GUBڦA#"%O Yz3NyGB6oF&Tx51Wi1.R/diOV32$r*isz}x\Up~sNsyi9}bЙ{U7,m}")i5<{앴\ϸn&QxC'yQ*WR0JER g{1^y*5V95^(t}7jVHÖ>I߿ŭöo?SYz+X˅n78Ї$Lțq-<ka1	]GD|7JLC	v
ȑ}T)B΢@"75ƫZ((]MkZXP؂_L5yłFTN9b:=:_PPpۦ5hhq*F6"_Q+cܴбTɿ	ŠC/9A䵃.<}`}=;?Ζ@_oum'/z{4[>6}#R*uŞ+RmHr-Zj9Yf\r&|0/#,NꕱbK#
C__@GaQf%x(+[Ya~?޹yOUٲ	?sy#^Q1q@_5rgG3<7´&?ᇳgz3Pic⚲<+)~g^rD1V]..r	:04;pXEo<pPy70h9g2w.`HEh}1 }!+x܆4-R"\|rDUu(jD+DI1夼$9r0K}lJZpK;u8-oAan#!ezH~n=ǺsҷO,b_tI}≏ԛ})a60=E=K9lFٴơĢL 7OPQ7jvW@}4
B<i)I\@8'+D:Jr.ݼ	*,)+YYa5VЖzf7Mfg["6L_@jVzy,^!,r6~G:ξqGh?88gH@Jk׏S^TxEzHA* W)  ۥd^&_@hƵss(nІ(mQ$Z<U44n ]T($Is)"23qzl6jI5IjjȋͶ8^`J>uOoPŶJO<̾-.X>m/NYUOĹ^:/[T!!guR+IPGkDk
[E@6uuk~sko^q荚CL麺3غ8>tbu}2DQRKU@b2kUZDuh^}TkNu1-`Yi9}]f2-(fhk.G1,O(zECzO&̪0ז>[p2囎7gfYpQfBbS92?'ULF@'!z.¾x{Ey,rQ)"#]q۫{b13+=FO'8o>ARPWq&xY^yv5ΎETAaCn {]A0^|ƇзN K^sϥDOvTjՓoVI#*DT4^kXiI.G5\<GҢ^&jZȘ{nsb5c8;wolªQw+'\L"/W({~>",{'G
Ы&kMd,zٸȿ_:֢q_r8w?fQb;<\Mx\./bq	D/䉋AϊFz6S"=TJ(
/|,6qƊ=c.{kf__DK=5>='}R |VR{VL7h9>IwS[@EbJ'_Sկ2<x\=a'64Lp-{j0?5lqg_YLmO98-NbwBǔqlwI?(jWF>i}T*EҠ-dTb6R 3+4V*z&9bIHAz7	e`qMwH#
)ɨjqcjr	AAoN 7D!Y,Ԥ6Fqtm!s,9;M86d[w<ңZ4/y`k}](*66ZL`P-B]Z5AaYg1<^|PkihlM(0(WدW0gr]]B#gyrcscxY
Ơm%+$֨D^by1ӗޅEsK{#d~ŝ:;MCGnYjOEdXŘ彻=/L}v2}`tD/\hr$>^@>NUłBQ&UzpAlCXw0ZV6ݔsM<w#:g3 Ѝ.aD6xSJlJBGQu5:Tm}14e81$Zk	u*a|qד%%rc32Z{M;&$4@ǫb@Zk1c{Ry#eQ8Lp1@%U65 ?cO_E֠g)Ի95Tq W~ɉϕEL!-O2*.WGT@tĄ$зk(p<0MH\,I8 JiQ)JGqn;DƟZrRdf$9l<;
n6$qY"/xKh/R30wE@k]%111Kg߿q'qح8~8aqw,40+"Th*?%)&&Ŕ˿N+hi#)
ŃmwH{à}̋\(M_	6!zXxU﬒h$r^( Jc2pZM<"̗磠yVjRT!y+y}Ѷ̨y?ďa*Q0r+QK$vdVZMա$'1F{,]te+Y#RMH_ccڽ6'qmzjO /N4|%_/Rm`^,:rƶ貢B;.+yaKpTn8,(1hdjl7^OzDlY,~bIYk"tN~^֥KRTGTt`v4wZ|ʦsmw nJ p}wț(	[Jo}nCLЁ:~KFm;MʵD35Ѥx%wNv ӗН0w	:ѝp4	(orG}<J3Fd!X8y4.8(rvpjȅ0]Q]>U#-Am3FsUFL2Huv[,.xyOcT "ζCXf׬H~rpE{+ thCc׍=p<6r혽>.nYY6b4$.^Xq57.xz>vn?$r]XstHvK&$Mm"DrR)	 7Z;a'd湜vI6蒬]Im1
+7	%pEW@,ޟ}xcT4wDYZ.aPL&j=e<w)/)rzxVI3D*N
miRy3]|wng`i-kXȂ츲Yw)Ө2YO\ )Rɑ-U8;+e=5!Ks8~z%jxQpԋ'C]J	-ڔ^U~A_p}@Ca薡{vOU;~^Ŗgv<2ԔW4{.gE\OуzzY&|	Pa]\(0 rS883]ٲegHD޺a\;	ѐ&h8eP\ϮؙB~)Q	]Ix6*zwx#4_IF #ϗy1bMډL1dPy`0051`4lL4$ TyHuy=u
t-#mr'ښTB~u%mδ
])d6:t,W1-+iNs?MȆ+^6w#1Zt1P{niO>ҀViP<#|f+C'dN)Q (kcrhdȏjDx48ZL	e
),^뺞}i<b/eAg"g;n~|i2e[j'o}7j=ak_~:ww Қ<zߛj8x~h9q6ח{{@Oؘ3,$7.793n]똓lq9r0H1"=/pQJ_p"rUUi\Tw^k1ǀ#6Pc{Ғk 9ѻv1}zCc}'"'ax'P0N#}M*JzsSj*OgxD^,ƐbLAWN9I엫s'?}@-lojGn6PDhǮi]#vS]Sf^vK4~&;Y2MjmHZ#K:c)HY{9~2=as/QJbpۉ+b\67@/+ yzb8"w`PHB)@(xvBj8)\9
fJQ~4O$twWus󢔒D~%*D(Qњ/ۗˣ@Q8 "wQ&FpA'>zɆ<v; xoj7efoRm>q9[/6^^7gZ޷YkYڬW^ U7f3c5w^&/R3h	%fe.)I\ыV"hu>oQؑvq^{֛doד ׀02S3af,i𤊘'V	֒kJriKlk'o!CDe9Ea$A|8҆C"~Fb-?_rB.5*^LxnQo"&$)iZ@/[SqdR^R:Ǐ:AU<dX*+Ժ;
</W6{)[;huGZ.9_΀yS={'pۺr'NnxWԑOK{}Y~BDGX'~LE߾35Q$,#/lSy"LjT㇡coHvIrǊwINO\n
wF©JvOURb4Uf匔q mNw?hHS׎D{:U탍W-{ӢWE|]M=Y&"ڧ#-?5ROʑ@?)7&~RǋJ4P~AcsFh+gݼ&Rm}OC;A!VCQW]^)(	q{2LqP>
FvK8nO>>AU/{ĝqg}ͽkpE{%i܉GM	aO{?Atrpx]"ћ,:ث=qO6By/C&tIqQz2Q5(>+:N#N}hCI"9ȋpG>xm{=U[܏	.)no8۴2ndgM}_Zdڈ'3e{6JmG6nٲ~Lb~	a
,cwK:.=6_EH'LBcಥR*J_i:|D|RS#F4~jȗ-zqLm75Gk>W=GQdvn@z薟I	.-bBi~/@vpoQ6\vq݅Őt[7<z<ĵk+OyKÿ{lO?Qr{bXkw>1w͑Ef3^A\/.;xd5QSUC9M^(˂q +(cH)xj^^.i䯆U<k017WW"0(YM)УOaGL"7\PGfxp}k=*mS?97K<,-冺xc67(|Q<g՝¡☕wfVW+%+{O;IkVg*v|Y9g??(>.dk&xIuV@(H5~b'3w_up*U"6WD*k=ǯOSvgA{+yHs=*k*$j&ಧ0"cahmk\e KޠR;vCzA2$IMV'>qAÖ1;bޑ76a+]+gO<tՓr%=O޸˧V1K
y
%wW]n!_}ۍ7wο~!H,-ֻմݨsgtՋ6~;/-rYh9^ML0 R߭kVtMe6f
L[)
ESϲL3[bГO>l}oISo }~Eyb f?.qk:r	(k iz+rV(K*Magx=VBA@L2,Gsq$^9̂"|{z'A.cof/Sw,Cٿv]ellWeL۾Ī/Ҽ_GO)N ")Rv[FQDosɠ6\܃**QGy5!`H0 pa1Β Prݼ3Ycy%h޴:Hl~XM}Wl}ڦ#0
z>q_-pMW(Awi-/q_ ׆(|R">̐m]\bA5ѳgW%ONd{T7y_6MD!/##<UFքb6os.澤ܕ+u4<T1:ݎF1UoPS#35%&O}4X;3.@nV1d&>+%,S5v1P1gos~RH+cbSs5S>KkPOXbPbuEݻt-Be\vRIIpANt*W3otzIt,DFZ (]}dMȥwt ͉vǕ+u  xc`d```5mg<Wy8{UWO	$
 `fxc`d` $+W A  xmOhAο%H	RHH	!)J	H(x"z "V,Aԓz*k"DDD/Y߷B~o曝}oGp9LJCǞŌY5m6
̩*jUf<V!d>i2K$W8Dgpv fѶf4m7P=z[#\-sECΥ.;ܧ3DM߻b>f3ԺA]g㻜-!P-lVj~#G24 &736MoZLK".^<qAz/5@Y|}l-{Y(~B[Tf0(3xCQYsk-3q$̾(uj81_'I!h~s"Κgm#?ǎkp%V +)w*>$ޭP]dsc3aEa[fVi+vY9 '<7xc``Ё(&;.Ϙr:1]acba`K_>+XϱM`;]݁=}G	N.N>[\,\r\~\5\sqqpq_׀7w||f||%|/gh,\%xEHL(D(K聰p3*%WĘĂĚ7_ DD5I"ER|RR-,#+!';IAH.DMnyy/)
')Z)(SԦC鍲r,*L**)*T|PSRzLZu344ihihifvҮ^}FN3]!]<n;30p1XdpMF%p"9;3Q0	2i0drTL}L3pY$.;,,t C        A  >   z  n  ;3  xڝSN@%^B1&	H(H0T|@M-5.@N۝;#lX EcciB?nQiLL^LZrǌd wp6x~Ƹ.`5T)	P|} !qV,<S2cC`8bҾq;U~y
q 2uDFwZ
]0ƪ"OM-*fL3"ӊ薭&Z'T~#cߒX#dK.=E݂ޟHe5Ϙtέ%.cRK{t`b]A2s"3JSn*҉[	yjR+㓧w1,O~++5W魷i)bsc7r[sUվ%;\&	]  xmUlqm]۹N놷ݝV	^nI]r#;HD0K$HɤJdIKPHŔPJ+Zӆ=H':Ӆt;4tذSr*AOzћ>N\70AfCpF0Qfcx&0ILf
Stf0*1p*z=İa61Xr_78]nsYfܧ;1x#>'<>~<~>M!\QKg>i$O,f	M,e9˸~VU߸+Nr˼o$N%A%I%ER%M%C2%K9sQ׹"'l)"))5j)TX,]Ҫ++ÍJM+JҮ,S:55W_(XS]菔tODa3Cĭ"ՕVr~a K RXY  c #D#pE  K QKSZX4(Y`f UX%aEc#b#D***Y(	ERD*D$QX@XD&QX XDYYYY D Qh^  N  M          LP [  @(             QSn                   O p e n   S a n s    B o l d   I t a l i c    V e r s i o n   1 . 1 0   * O p e n   S a n s   B o l d   I t a l i c     BSGP                 o 5 C )xZWh[qJx"cr,g,E&CĶ@rXY?&+uLFMlSud	Ɏ"be|SR1V0~	35uy&m18b*SCBl>Ԭ.-֧VF@PPFo]@Y>YR<MpKlAćkSgLS[q&YUYvH0"$Aڷ
ds0bVg0眿~z`9]80ݥ~MͶGZY+ @n.ʹ_yU4iHpfk,VSvZӷ<spe!4VK!YH h?m=rI6D#H0` KazC!.85#5![ >AFtP	7@u Xo<L"lzQV"x*+%IEY!s)K>ԆIӯaW/ڬ2~xE2iӧTa)H>(e៳\e,/.(1<n}CʪeHe_,]q~)e?Z(ᱛEfk21*vr[
y&-Y$E
V;D߱!qYO7FYiqk۵i WH_"7ySW[umomAQ붊i<c'91)2:M7mxUg)oSL9wh}R
:! *IN*IZK%/h#Ei%TgJIJ|Fwx?|BudЀEh@ūW@H?BHȌ h@]8HK4 1!+̆5+vJ>&ܢ'鿁ErW C뎩t/1t1P5~^l,O,k--"-BP-R-rl.SʣԀa9Ȟ{䐍'LKp5/3ᲇ' $$bP>2JxP4X;
y?iNX+'XnA2)5 6Aag,)gad7[>le9픕";e%w>;
Gt1zAD+,$F>Ĉb,İD@X'YQ	!-^չ&qX8C0;(H.!;K!- pGQx$>d$xt,5:i雅aC`*4e-Lw0`Q~!%?%*|e8PPU:h-a#tDx*%Y织
ER&T T(oۓB(dK2Ed3 w«--Q@_lɃX0	aQE,1`nCB	cJB@4xmf! -\1vL  x	gUL \1HV]wk:y26'`f΂0 ULAnG{7 jP/W 94BO!PNӹg)Ш=%jMAN&HSBJ{aj#-RchrչxuAuOa,!!$P./iS@g)dP|;"0-Bc95&8aNհ'YQ ^lpw`,bSm
AL"CJP=HE#T6k2HwР4OgVqbu՟>XCC+~7??7tzT>M*P%=<+ļ	<K)ui0SB8}5JC#s9T$҆=Wh"% W#ݹ 8+Lz):&a!z|P9+rn;;*VИ4dJEP??lI	pC@eGw&2LQ5
#ZCy^A-0I!.֨2UXDrH@؝:˨~يZ2LTTBciN	yhEFf`"Ӟ:غrd&Mt
r,aT%b"39
ܾ?eE-*I@ǐd@HR&/<(
0xYۙP2MVZb)P (X/U态 C:"A
kAlZ
dI~./^TP'2(5|F»+fl_"$Po lY]A,X#~xd C&Lg2A^*VX29csX*qG4ꈢ ތxQ'a~D/ !GYų?4P\;7:#]˻rIF;ŀȧVڛ$`&$.=ȴHvJ<x@9rq{
y.znƕ	7!W7Xƒ&4P}0ɐQeNM8/>vU9=JƘ?mauJ%"Bl iE@nOu(#<iS#N"pƎ3FtIQY)3HD(uA_KR=Gp )fCW*"0Qmodw˻d8s$T8ъ!\uĵ)	Wo$-|Э{$><석 GM(", TаDmR,dó%4fi=&&dwh:-;6AE*1* P2U4ε6BM)	\ȱBLl\wNWxX=O$LCV>-@|Qq'4N%ؖ`:>j]Ċ\ 52]A~fL3 ~j((P""v`Eh
jpDxb%mIZ8 3XL2Xh	 F;4K <tp7D pPJ{4ITE>&x	ҵv 8!?6ˋIr4 s}Jl_jvCJ:2%UN%0A73l2(hFr](yPD]j]ȓ-"-UQiC16FBJT]PW*.l -PHP+e%K)QBਜ$=.q0L \u:¥	Y5,NX!(0@hf$@(O2'%"
gi2rH%	!0Um	+"- 3Y.V4c@?t&?Q <d9gbٵ֎!S]Rg;h2Ԥ ]Q9Ima_[4S,dXiCb:]8@mL]J;*Ann=Eu3~k[;L?^5`̀"W0Y	罛\Kt\5  ID96c%vNrdaJ]>_6𪘽
y'#ho	)|1CdmTǒ^>ʤKSny`UWb,aY$OWpǪ`8#[yX>rr{5C	Y]NSfbE[ʷj	g<7>).w
`: S:gL}!#UT|# MLC 3l	oJ G
H7oqKAup!"t/gڙ- 3#,-q&:аkWҌ4Kb`jAi:`^^hGv21~"<Phe#L!ݙN& Trj1T@=a)gtP7F3`VnNcQ;Soa")&S(L9ħuҪd@{ĝڟ$Q|36 1ޖAY&zݔmDHLМ]զ< \",(ml^0A\Ұ6 k+3#C${؝=\v\xCmOAg1܏!]
Hɮ'y'BHDia	a(q'DHBz 9 n,I1~VⲥY9[N=vSmvwy_B?M`j-:Gd"!Z6?Z$*םTհ^ n}}<eiIG53zoJƐw%)0^M
6WFNrܱ	@@zT_n"q4_L̅9%i^s/v,FkSRh{|sb.<H}P b`p#<8 w~S> %JXZ"XQ "mLfYr,Pho	ɺVG}A n'e m٠P_\@zZ(ی1!Y`:"8!F.{D}q0S^Ne0
QIǂMli{6k~Q%!1B)^$)LZ=Ѩ*yj#hW&{mMI"
3$_F!|0dJ+#
q6x!4\XO|iA@IMU0b$@`0'N DpYʦJqbvۤ2!Ly]pCZfA#X^)ar'l}]S͵-ؑcͣYLD?)9ԛh+fpT	M5,RO! r`n	2-[su!mcw8wUi-sn	2i K plŨ<@҉vwu#Y9C
5³\jqy~q**ɁLaF_܇]0@WXAaЏ,+ިSk+0(;"VQX[`cW
̷SF~(`"oTfSm,C&ja&2C[lĜ)P2*qN#^2Sz$
Ď>*sMT(=
1O(KHerE9̶fRJ}!b* {`o,1m9b#͘[.pPI&̉xL:*"(/_(*mb. lopsp(C1X\,?WL Bv-"N6ėfHBG9^&m
s!n@^Me$ژ6Ep9b'υ_d{ND"aD%I|X' X(n}/B^G\QxYz,O/  m(aFd<~xDp-6St,Vz-h`쑄e-8m$Φh!l.&_Jha죠P4~@Zt+'!O9X2Iu;&C@sPED9dB"ʷr`FOԊM8Sӳ9_{9zFi.w6# E,1dTdBx' Lj}bvhL-IPt;KYH)QS; 4JdmFV	M+maYvJ4'BoM1a"˄bշ*GAe Ʃ[068_klV>o7y[uqAKb;TB#کc\:Vr rǘSav0q(Pm WZ%eev0v#SN@9K~-Z0x
:Nju΀5`LᐲZ$90%P!E7Eqql\$A)@/_HCG`dtb?yDB#A%RS!.x$AJrn)-6B| eV~1;ɞE }[P| +J+=ya&ҴE S8X~s%0܁L}VxF"?vDq2b[4J`YEˠi tv>4a%.͒+"yRp@I :d7X@:bh(zUe1MP9ĢxUL#  Ol *=ptOo1onv`4E|o.+a @7BdɸЫm<ބ0KC	3Xg x66	:ɃPwJy޶xc'TT

[~PY9OlpcL؏+D3eWc*60.q>^'/$*Z!вh~{< 23
Bzj"^?#VYpŚ#{s@0a+HpHRJ~I)PhXJvP^l
ͅINIؑJ5XJ|zi)*ޛд]$L.ym4ۦpbyMBl=}@|&QiW(Ep1\D&``qPC6(>[XѿSL<9q)| k-+dPȲ3MC
og@O?ET%)<]c-pMn	:/݂Ur|+
ps̀[2fE`B.(Fqܨ!4/(VnEoJOFj&)'A${2̅TtrYYkd]r$
B8y]6fz&]XL-.]}^=ETuLzѺbpj ?P_(!àF r+DQGX?H14`jd	⥲4H(Uzu !ɗGxBfnՄBYBM yTkMs! uMlȏF7a0$:uk7_MA6V_z6BRJ6D_Ly6!NMUW16\{jwod!\tn4LE!W0	tk#.Y9C	sGa3]#B/5ḎB݈{oH-nݸypU<o0x7}ld*Gr# ~&!lqyɝ8Ȯx`RgC*	sf~.5qh CD-N"zdH+a0QQmlylvQe/6U
\CA@e}0Lj%WU}%5vb$AB.xǓ([=Z6+ޥq[y
{9OX`"d3A#mJp]IB(SSpˏJghKQ!b|kx?C\Ь+}qt&[ɑ~KU$z7	`jdMfpy0#O}zshIHKA-2ް$bZ򙖭]@Y_!;ٺRX	eRoV{BgNI#c#~6er|I-A54`>d9 41.S||#8M|CZ07'(a}c^G䖩_Ch4r2ZA?u\0P16:mwi
w fۚ:}/Y<<Ryi@v\aN2RRIhZT}ԭ`2U#&,<ߙ.A'(M	oȩ9ƻdk#C<lv *8gwth@X{rv R'yJ*4\q%S]ڪVTY1rz&F|?*K+{^~]A1fmRrSpSem?@$l]෤a=.FˢN^m!`\	?3DE.<Ed4qÈ `Ï}P]aBZKsiq4#z8*H 
 T;lxXGUM2;DJxXF6εJ^,GAAGWqqQ<S-=M)Ӹc~a6T.P<W/lB_?W  x%pW'*ɏ+Y*S@h_i]LJPv`sU\W]Nn	_q%q!Y1PFiSxT\5<\(q{9,=	ďN
A.w_~ڪ2Z:(/TA2caHv۶]*n' alRQ6cS>:Ie=R_!ȳ/Mؐ6hYVB^E]U9 }"-@z.UiSGиpL rpD1p[L=Ot1XaHd'Lgz2UEԢޜiz gH]qrEd"$+֨Xg#u&xbp!P,nvt>1ğn}P7rOǑlaw>0VPFl~9U 2ExKGw!E8A;'oJUBgUH/&jf܌ۈZ 68`dz⃯>Y!O
NAnwKpFk`@(+(1'}4ߗ~LE[^1IU&$\񓧊r1<չ<G-BN5j=/J1IF:F:}g΀*AvI X\!/x
RT ZP̪mW~;9|{.I+tL{uk0N6I'%5O9)ۋD%p	}%;+VIYCK:1OPjs{LJubփ*=?j%8q1}N m$7GHo"ӣ2oBz8)%X4N,0I}sgSM։k9ɪQ[
)jta|Jvbg;?\!Ae-=i2nUWξ)	sSZ\Jӡzz-TI\vgՍ10jVrwnN)ݪ@=L X9Oa"1','U&}sQ; q8Q?`#o6kP,䘔Ȁ%Pvrk.2U 2zHE	=Bjiy*cacC"=zai>p},O'Z+rGÞYb9	#x8mg=7S' %Ѝ[gD\SfsNm&OyJ!-L'DDŲxrAȝ*hHaAȺU&NUN3:$}Yuo|GW_8wFf;Z>%4M07سf5#A	8!"KQ9Rj>B6NUB!`ͦj4$FdpbE>͔&R d!ohT:3`FJl5gj4C~~m+uȖ"@:`~I?9[XQH0ǕY $&)5;+>wքmhZODnm(@
_j_HRp&6'mz U b M1,s0>,MjeOLȗ,X)A *0XU8PK"?|G
:+0?zqtV Zx`b+K\T S@
^	Y%hUjN> X9o.8":a]j=~(
 d9)d:2cqu!OveF/u	r`@aŞ\nڡ8(D*L>Ct-Tm ǚ3),͐pWl*KL6D'HTml>ͯI|Ӱ( /BjSC*OHp)#fHLCyL,'^T^{ұ$bQg٩i`=2Ի@ &oٹw+EJK	;""{	VBћ]YM#CZlYOĖ#Ԁ
 ꯚкg'Ou~jOq/bL	tC_
RMQ%`ASF#(p*)վK31cRhk>/e`EyQ# 46B=!Fݐ:b6TMϸ&XrIIi~j>qZ-}!
:5}f{3?:=# MⶏJ0SL,"Y1g+[([+.X.X<-:Ǖ䥽֯W7Iif&O>3Թ3r ׁٻ-%-^ٓt3;HG$drZyD<|lm1·sZ%FѲ4My:;#{\˚PQ訍im@}>a G]' t<ՓhΘӴ9~q PtU*d?X"Gϔϵ+闒M$7E.~1F畾D/ざ,:rz(
ÒIP^7ph, ai "FNi0/БQuZm9\h |Sΰ=8n/d-sd?=58Ϻѳ0;  Vh	8w=[-godF<>`qaKEz.$1 ō&jBj!ӠkZ{d%V::ƺȻd~ً>[ʅ?gU 	b&hetVw
Ffq:t"{_s!S
Xmz-X*Pr#t@&|T8x'g`]}`EKz
tԊ#:4eWXă$
1^
OEnϸ]jĘ\g@H%
t
U]M!a!'츧~@YPw8HTŉ,ln$ד)R3Xo\ [mt^B845>K4lUh)6*do*7V C!\g4L= 	C1m|g 5Jn݉&Tb;3`30H,ѝ,C:!_mc/D`ѐm2H]Z-jo>-P=&?Hۀʦ13/+}FPJc\ɩ)6-jW"}',v
M,D4O
ֈX)o,W]U)mrLaH64Wx3^0RUAsL27ꕆ2p5,Ccuʑ=(hOh]#Tm&PF|D
=uU@kz0Ģ)볔SXޑ|R@;+-rEX˓4	6OIZvUIh7eJ &rKRr
H&p-#Qw܁֑fߢ'
4<F`&cnVa6FQ0JG'_&Wz#R2lΨR84;ln> ҧ>^YFo1y#w ?UZ-j3HCwN=Ɖ([% rw qiTqq|\z޳~, ofJz'w^_rwuSӦuSAVDZ\[yZK*Hu</<^UtW޶s7o		306cLװUpJS1pui!/៯sF`E>שA:n9ZfLހ;ov33Y^Ό꽗sz(W͡Yw~J"-AcI{qX;ҬwK4r,iOU=	D 
	dY%E9+#Luxn1YZ^D@
Eӣ
{眾Gb?\sU$;lxAbCߍ1gg)ы<1A$ȼok56"ԙEo6Z+<qmyHkIvV_d] mB8./PN-Ϳp{tI±U׍6JKʹ.V3IB<o-ݦqaW?oxGflo f%VMǪoL"D*^3O=m@-* hhs(mRT[7YW>%tjso'D&MrG8`	C$U0	i.{Vxϴkc	#1X 9:˯91G=S 9"}	jl%s<74^E\NPؑ<\49;+C}#8r!"ATzt*p.(Od`Gi l"$ P#@(  ozl	L~Q0ݘ
SCę8//?%).*yb_%WD~v-G1aΤ{j|XBqtg:  pPM-@!!Q	 
 @L&8
 UMw]:7f9P{!FLqH(9l#E&P0<`<Eb
,ip1,`\\>0(ce+L{QeȞ.YSr˄KŴ9׷)Fi9h=
ْ@tgb!8zDD VN+
sT%oWV+ׂ*!OKR^|NqZHdI>!%R[eBʆRn>_N,]t*ʢ94"JbĸD4oЖT\Roak:ջD_"$VkgKUUu:>U]1]63zz{D`tA<݁J	Z2=eƲ N3T(N g0EΉRd~%(q
An 8/F[64 Cl
låZIXA9xf1`	EZ*FI 3qhs"Ah69KIPO2u%V$i'dU7sy_218I0pT8&+*'Ƈ\4u8qFb;J56p^hX뒺$3)K0PR,S,(,Xsxow*mKܫ0Fr1=?3sOI樿SKuokQքv>5ыl_S!"PwBQ.]jRAisa~JR3,$0aQ_w4w.6EFMYUK|3K1<G]tA*+9zFzղf uεHy`NФD~pbH?h3IFJf/!#p OwPnv.t8:MplQl2&0+kaNF&F}V6+4X+ԍD{
C-#߃w 8!GϽ1 uizt&Fcː#\	'鸷&)H z췇@4<~Z~!+6iR@(	K_QRңވ;A=PYqNTǄD8dZ41J?	3%e["Fo"vG[tbXH<Q[;UGnP#H<zDnӊY:ˈKLG5l3Ƣ[j盼hIL[#|(&|~	Ů	bGDBp37Q[SR\X]@z.-)N6M22eyhх^F/9,	`K$[jANepIUXVem&k*4hµ\bO;nE:9ϡa9PDE5 Z\a#W rBy9]XG^ [r^u´-	Fᨹ.TA\,Õ&>jOmt]VR0Zce4ŋgΠ!T2:31x3H?70n]A-`r[wqi*ݠLl頒]6xI<n5mh(L[xL4]0G)=BV-O)I/ j
NrF!4LSD=w%`XDMeW=] @qMM -Y<# ) 3MAj>pq \+*,ċ^FDak5cWDEw3	t*t	Ruё˛iq%йM$;[17#nBi=Hz'Bay:ii1((lVAs
8U 3{ykz:e>Tg[u:#BBP<i@ }_f$];+ d)l%%E:blA?]		`WhHU+8[,;pP a*A{Qva5
J'02ZoFjI,a}x
v1GGM9~lz896%iPSq|9w&en*RҶ;<]fvӷ2YU'o8
UB2n^k<9 brp-mh}o8h$6 F(L9q {CeP&&_ oUwM@+G{\QX!@yΖv|wTsx9đ+K똒d$\hN6:&
wId#^SDJ>Lr!GqteG7̓X 6(nzT_|D
vğ ^: +E@{Y3A}5
Xg7bQ}B'@)Э|ƭ#xU i[-ok,XZ@ԃq/Kd 2
fvʖd⋼+y(o4-o(-jr$E#^&ۍ lTôGsb[YH4U,e@ڸ^Kn;6cER0N]0 0J֪[A	-ww-a &2С9)u
򰳡,lgs`l6>?L\'g(oppQxSes) zQ?K5u5~w送
$#l-RW7t]1cLOMnZkM_WU`W2a{ C"X<8\0G+'bonQmX`8'c}fۙzY=j;`!v ?}<Qaa>"YIߊrDיtP5ᩦbQ98$93ڈ𠌱<RABL04Pjma9vzc"4u#9wX#,yV^}QVMH-7jd3D7SMjbp2Y(y35H誯HƮb֚\Q ;TBF5i61ĔBUXN6 "#S==dnlψ<Q2 " m<i<:>tLo	$/~dEwr&
y˃*:<pKޕ>l4Ie'U(zUDB'/c<v|3.^҃|U􌼚T]`J!*ZlHn.zcqz,Y=Ȭ=(ݭYWдܶ߬
+En]wǣĸ	E2?֮Ѕ=llmgQT\JWS2f`"nG,^ePz#dO̱@эiͬz *|h$vEづ f!&e@KVQfPXg4`ai(yDqt: e+@\߉q4-\jXBC<&&gLI5xE|s`K;o80 N&Mskqj|Hp%#Z:dOx?vfi5ƌ02 3p8̂LhDq #$&CmǸ3$ՕLs=R~lz|K}UQ,&1T/Cl(z)<KDkIe\E6֡Z&D`f>7ӔY9H/XÒÛ eM>}^ӑ	7ŕ}_ډZ܁ r~x3hhu(y{a:c/` [Rϭ8?K	;kɏJZ,N7a:)qRͰ \QCA@_ fϥ=_ir
uuTASp\#dy=?N@${k"G]03MiR"/S#mbu.1XHa޲Lp#xS9@	C'AK(_-JZ;gCDV$E1$U(8CCDZ4;[u<bdVy u#cR/=YseTEoe[:G].k3 i}{[fәH"z..i	u>W/Kt	{;%@k^_DsT_ͣu_~fB@S(@m r/Sb
W~PQn{xهUPDmXǬ(dAf2a]ӽaxZ"b¯?3#|FH#\./`ϹDhɂ9vbz@v0C(%ΫЉؘ6nh&'GM| oCv'd2SyN:fMJ~Qh(lJU_٩0(*G=%	싓4OU?8{`qW!#Jv ~xE\.0%W7~tyŎ_&>!gc$Kbπפ!mSr'cv^PAR : 3AU4Ku TEOPg1_PoI2~3a۰4ҤLw\15"JxzÊ __5FIqd'w~\ z g>ORT1 `_U&[0+ͦ	U?-r Z3Ɋ?!F
jq34qw#0=H/NH{gwʻRZ$̃naV{1Wy.CEY&{2=!JすC0}Ҏ0 DanL4먚(^68\U'tN/q6Q\#sF/ԞJSQ@+,HL }x&rbobT8CYӰ";4fnl!(V'̛[g|6P_WҀ/"Fd
c)k<l|E,rАH8oW"B3 LHx	.y>*Ǌkf $B]+?'oCMIh+NABu>vG	0	IBw+WEVEy!:fDuQpxϖ l)VACV4UAg+"8%??-&&8QaQ"8>`PUg..lΰ9eGsÂ^8DZ}@8ɣahP jjB8_?
F腺V3Èj!M:*mzx6W|h /})ͪI[ #6*srQ?ZٺV0P5mbxI4x&[mdֿ_'5[m7ĚSԲxflы;e}IG97T	!p6Hi[[4UA Wzyf21h2YCdQGnkg|\>rlS`:5ȺU@NGzQ0Fuvn=4mv|sMME$gpF+y>S煗$8\WGӁμ ˦IFXXu[ȶj,Ta遒&*j+j42 Zfkœ2AibqrV|@ք/KAfdMDÛ	/;6~HǢqIWAgFVCTHÆjZ3įN𳋆:@ir	tWy4@O+\^q%8\ h'fxU;g x9»!Hjm.ݽpE]Zql;ܥ>L$ZM*)niHhXbfˠ]3 	6YL誋ˌZmJ70&e"P#L%@h̏ld11YøoD_KsjcO(
vmAJK}ԫd?\o+QB`⸙Ab2f!́HP2 8ܓ
SU.[	 <?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata></metadata>
<defs>
<font id="open_sansbold_italic" horiz-adv-x="1128" >
<font-face units-per-em="2048" ascent="1638" descent="-410" />
<missing-glyph horiz-adv-x="532" />
<glyph unicode="&#xfb01;" horiz-adv-x="1352" d="M0 0zM-45 -492q-104 0 -174 25v242q61 -21 115 -21q61 0 107 40t65 130l204 965h-163l30 145l183 84l18 84q41 190 138.5 277.5t273.5 87.5q131 0 235 -49l-80 -224q-69 31 -133 31q-57 0 -92 -40t-47 -105l-12 -62h219l-49 -229h-220l-215 -1010q-77 -371 -403 -371z M1065 1380q0 87 47.5 131.5t134.5 44.5q73 0 111 -31t38 -89q0 -80 -44 -129.5t-136 -49.5q-151 0 -151 123zM1081 0h-301l237 1118h301z" />
<glyph unicode="&#xfb02;" horiz-adv-x="1352" d="M0 0zM-45 -492q-104 0 -174 25v242q61 -21 115 -21q61 0 107 40t65 130l204 965h-163l30 145l183 84l18 84q41 190 138.5 277.5t273.5 87.5q131 0 235 -49l-80 -224q-69 31 -133 31q-57 0 -92 -40t-47 -105l-12 -62h219l-49 -229h-220l-215 -1010q-77 -371 -403 -371z M1081 0h-301l330 1556h301z" />
<glyph unicode="&#xfb03;" horiz-adv-x="2048" d="M-45 -492q-104 0 -174 25v242q61 -21 115 -21q61 0 107 40t65 130l204 965h-163l30 145l183 84l18 84q41 190 138.5 277.5t273.5 87.5q131 0 235 -49l-80 -224q-69 31 -133 31q-57 0 -92 -40t-47 -105l-12 -62h395l18 84q41 190 138.5 277.5t273.5 87.5q131 0 235 -49 l-79 -224q-69 31 -134 31q-57 0 -91.5 -40t-47.5 -105l-12 -62h219l-49 -229h-219l-215 -1010q-77 -371 -404 -371q-104 0 -174 25v242q61 -21 115 -21q136 0 172 170l205 965h-396l-215 -1010q-77 -371 -403 -371zM1778 0h-301l237 1118h301zM1761 1380q0 87 48 131.5 t135 44.5q73 0 111 -31t38 -89q0 -80 -44 -129.5t-136 -49.5q-152 0 -152 123z" />
<glyph unicode="&#xfb04;" horiz-adv-x="2048" d="M-45 -492q-104 0 -174 25v242q61 -21 115 -21q61 0 107 40t65 130l204 965h-163l30 145l183 84l18 84q41 190 138.5 277.5t273.5 87.5q131 0 235 -49l-80 -224q-69 31 -133 31q-57 0 -92 -40t-47 -105l-12 -62h395l18 84q41 190 138.5 277.5t273.5 87.5q131 0 235 -49 l-79 -224q-69 31 -134 31q-57 0 -91.5 -40t-47.5 -105l-12 -62h219l-49 -229h-219l-215 -1010q-77 -371 -404 -371q-104 0 -174 25v242q61 -21 115 -21q136 0 172 170l205 965h-396l-215 -1010q-77 -371 -403 -371zM1778 0h-301l329 1556h301z" />
<glyph horiz-adv-x="2048" />
<glyph horiz-adv-x="2048" />
<glyph unicode="&#xd;" horiz-adv-x="1044" />
<glyph unicode=" "  horiz-adv-x="532" />
<glyph unicode="&#x09;" horiz-adv-x="532" />
<glyph unicode="&#xa0;" horiz-adv-x="532" />
<glyph unicode="!" horiz-adv-x="586" d="M391 485h-241l157 977h340zM25 115q0 90 53.5 144t150.5 54q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5z" />
<glyph unicode="&#x22;" horiz-adv-x="928" d="M549 1462l-152 -528h-196l71 528h277zM954 1462l-151 -528h-199l74 528h276z" />
<glyph unicode="#" horiz-adv-x="1323" d="M1036 846l-69 -232h258l-19 -206h-297l-116 -408h-220l117 408h-194l-115 -408h-215l113 408h-238l18 206h277l70 232h-252l18 209h289l119 407h217l-117 -407h199l116 407h215l-116 -407h239l-18 -209h-279zM553 614h197l69 232h-196z" />
<glyph unicode="$" d="M1034 496q0 -184 -125.5 -291.5t-367.5 -124.5l-39 -199h-140l44 201q-209 12 -355 86v266q198 -107 404 -117l71 322q-163 61 -241 151t-78 214q0 173 127 279.5t350 121.5l35 151h139l-33 -151q166 -22 295 -90l-106 -232q-132 65 -242 74l-63 -299q131 -51 195 -99.5 t97 -113t33 -149.5zM594 322q63 9 102 45t39 98q0 46 -24.5 75.5t-59.5 43.5zM633 1157q-62 -7 -96.5 -41t-34.5 -94q0 -79 80 -111z" />
<glyph unicode="%" horiz-adv-x="1753" d="M518 1274q-63 0 -110.5 -128.5t-47.5 -277.5q0 -96 56 -96q65 0 112 131t47 275q0 96 -57 96zM821 1165q0 -166 -56 -310t-151 -217t-217 -73q-139 0 -210.5 83.5t-71.5 236.5q0 169 55.5 311.5t148.5 214.5t216 72q137 0 211.5 -80t74.5 -238zM1554 1462l-1083 -1462 h-240l1088 1462h235zM1376 690q-39 0 -75 -56t-59 -154t-23 -195t55 -97q41 0 77 55t59.5 154.5t23.5 196.5q0 96 -58 96zM1679 590q0 -167 -54 -313.5t-148 -220.5t-215 -74q-144 0 -216.5 78.5t-72.5 222.5q0 177 53 322.5t148 219.5t219 74q137 0 211.5 -78.5 t74.5 -230.5z" />
<glyph unicode="&#x26;" horiz-adv-x="1450" d="M1325 0h-350l-72 98q-175 -118 -403 -118q-209 0 -320.5 97.5t-111.5 280.5q0 145 78.5 248.5t273.5 200.5q-76 130 -76 258q0 195 117.5 307.5t316.5 112.5q169 0 266 -82.5t97 -224.5q0 -280 -365 -426l195 -263q44 57 80.5 121.5t78.5 173.5h300q-133 -313 -310 -497z M541 623q-88 -51 -123 -104.5t-35 -131.5q0 -65 45.5 -108t116.5 -43q115 0 221 59zM662 920q113 59 155.5 111t42.5 112q0 57 -30 82.5t-70 25.5q-66 0 -102.5 -46.5t-36.5 -119.5q0 -46 12 -92t29 -73z" />
<glyph unicode="'" horiz-adv-x="522" d="M549 1462l-152 -528h-196l71 528h277z" />
<glyph unicode="(" horiz-adv-x="694" d="M74 281q0 339 122.5 626.5t381.5 554.5h262q-255 -278 -377.5 -573.5t-122.5 -618.5q0 -308 117 -594h-234q-149 266 -149 605z" />
<glyph unicode=")" horiz-adv-x="694" d="M618 858q0 -342 -124 -630.5t-379 -551.5h-262q499 545 499 1192q0 307 -116 594h233q149 -264 149 -604z" />
<glyph unicode="*" horiz-adv-x="1116" d="M885 1522l-113 -353l387 29l-18 -254l-338 43l160 -336l-246 -73l-90 337l-197 -278l-207 164l275 248l-326 92l86 237l338 -174l33 369z" />
<glyph unicode="+" d="M475 612h-366v219h366v369h219v-369h367v-219h-367v-364h-219v364z" />
<glyph unicode="," horiz-adv-x="569" d="M377 238l8 -23q-118 -255 -262 -479h-225q74 167 194 502h285z" />
<glyph unicode="-" horiz-adv-x="659" d="M41 424l53 250h524l-53 -250h-524z" />
<glyph unicode="." horiz-adv-x="584" d="M25 115q0 90 53.5 144t150.5 54q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5z" />
<glyph unicode="/" horiz-adv-x="862" d="M1014 1462l-809 -1462h-295l809 1462h295z" />
<glyph unicode="0" d="M1110 1012q0 -470 -168.5 -751t-472.5 -281q-198 0 -300.5 122t-102.5 365q0 297 84 537t228 360.5t333 120.5q399 0 399 -473zM684 1235q-80 0 -149.5 -104t-117.5 -302t-48 -368q0 -115 27.5 -173.5t97.5 -58.5q81 0 150.5 106t116 301t46.5 386q0 111 -30.5 162 t-92.5 51z" />
<glyph unicode="1" d="M688 0h-305l180 829q35 152 76 287q-9 -8 -61.5 -47t-262.5 -170l-133 215l566 348h249z" />
<glyph unicode="2" d="M913 0h-962l43 213l477 424q180 159 248.5 254.5t68.5 179.5q0 75 -41 114.5t-110 39.5q-66 0 -135.5 -33.5t-171.5 -118.5l-146 203q132 112 252 159.5t250 47.5q190 0 301 -98t111 -259q0 -107 -41 -201t-122.5 -188t-266.5 -245l-269 -222v-10h568z" />
<glyph unicode="3" d="M1104 1149q0 -156 -94.5 -262t-261.5 -135v-4q131 -26 198.5 -106.5t67.5 -201.5q0 -133 -74 -238t-212 -163.5t-327 -58.5q-239 0 -387 79v267q84 -50 182 -75.5t191 -25.5q158 0 243 63.5t85 176.5q0 172 -258 172h-138l46 221h73q167 0 263 62t96 172q0 67 -43 104 t-121 37q-134 0 -287 -100l-127 204q124 81 232.5 113.5t246.5 32.5q190 0 298 -90.5t108 -243.5z" />
<glyph unicode="4" d="M1028 303h-170l-63 -303h-293l63 303h-590l48 234l770 925h311l-195 -919h170zM616 543l58 248q12 58 40 164t42 141h-6q-35 -63 -132 -181l-313 -372h311z" />
<glyph unicode="5" d="M623 922q183 0 289 -103t106 -287q0 -167 -71.5 -292t-208.5 -192.5t-330 -67.5q-117 0 -218.5 23t-162.5 58v269q174 -99 352 -99q154 0 241 71t87 194q0 94 -57.5 141t-166.5 47q-102 0 -213 -33l-104 78l207 733h755l-55 -262h-489l-88 -293q72 15 127 15z" />
<glyph unicode="6" d="M88 469q0 202 61 395.5t167.5 335t256.5 213.5t357 72q125 0 223 -27l-51 -246q-84 25 -191 25q-194 0 -313.5 -108t-185.5 -345h4q115 166 311 166q157 0 242.5 -97t85.5 -273q0 -169 -71 -313.5t-190.5 -215.5t-277.5 -71q-212 0 -320 127t-108 362zM530 227 q99 0 161.5 94t62.5 236q0 71 -33.5 113.5t-102.5 42.5q-60 0 -114.5 -35.5t-87.5 -95.5t-33 -160q0 -91 40 -143t107 -52z" />
<glyph unicode="7" d="M78 0l737 1202h-629l56 260h975l-41 -194l-752 -1268h-346z" />
<glyph unicode="8" d="M721 1485q123 0 215.5 -42t141 -118t48.5 -174q0 -134 -80.5 -233.5t-230.5 -151.5q217 -141 217 -365q0 -122 -63.5 -218.5t-181 -149.5t-273.5 -53q-214 0 -336.5 100t-122.5 270q0 298 348 426q-165 132 -165 299q0 119 58 212.5t168 145.5t257 52zM582 643 q-116 -45 -173 -107t-57 -153q0 -81 50 -128.5t135 -47.5q93 0 147.5 53.5t54.5 138.5q0 73 -36.5 131.5t-120.5 112.5zM694 1260q-76 0 -121 -46.5t-45 -119.5q0 -132 123 -201q185 72 185 221q0 68 -39.5 107t-102.5 39z" />
<glyph unicode="9" d="M1092 1001q0 -280 -99 -533t-264 -370.5t-403 -117.5q-128 0 -240 32v256q111 -41 227 -41q121 0 207.5 49t144 138.5t99.5 257.5h-4q-111 -158 -295 -158q-163 0 -252.5 103.5t-89.5 285.5q0 166 73 305.5t196 208t286 68.5q203 0 308.5 -123t105.5 -361zM645 1237 q-65 0 -115.5 -42t-78 -114t-27.5 -153q0 -87 37.5 -131.5t105.5 -44.5q60 0 111.5 36.5t82 100t30.5 158.5q0 84 -35.5 137t-110.5 53z" />
<glyph unicode=":" horiz-adv-x="584" d="M207 940q0 92 55.5 145.5t149.5 53.5q68 0 108.5 -38.5t40.5 -107.5q0 -86 -54.5 -140t-144.5 -54q-72 0 -113.5 36.5t-41.5 104.5zM25 115q0 90 53.5 144t150.5 54q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5z" />
<glyph unicode=";" horiz-adv-x="584" d="M385 215q-118 -255 -262 -479h-225q74 167 194 502h285zM207 940q0 92 55.5 145.5t149.5 53.5q68 0 108.5 -38.5t40.5 -107.5q0 -86 -54.5 -140t-144.5 -54q-72 0 -113.5 36.5t-41.5 104.5z" />
<glyph unicode="&#x3c;" d="M1061 203l-952 438v143l952 496v-240l-643 -317l643 -281v-239z" />
<glyph unicode="=" d="M109 807v217h952v-217h-952zM109 418v219h952v-219h-952z" />
<glyph unicode="&#x3e;" d="M109 442l643 281l-643 317v240l952 -496v-143l-952 -438v239z" />
<glyph unicode="?" horiz-adv-x="940" d="M260 485l14 78q19 103 73.5 177t172.5 155q124 84 157.5 127t33.5 96q0 119 -133 119q-50 0 -106.5 -16t-201.5 -84l-92 221q230 125 445 125q177 0 280 -87.5t103 -244.5q0 -83 -28.5 -149.5t-82.5 -123t-190 -147.5q-64 -43 -96.5 -73t-52.5 -64.5t-38 -108.5h-258z M166 115q0 91 55 144.5t150 53.5q68 0 108.5 -38t40.5 -107q0 -87 -55 -141t-143 -54q-74 0 -115 38t-41 104z" />
<glyph unicode="@" horiz-adv-x="1753" d="M1733 840q0 -173 -64 -321t-177.5 -231t-254.5 -83q-88 0 -144.5 38.5t-72.5 108.5h-6q-50 -77 -113 -112t-147 -35q-127 0 -198 79.5t-71 229.5q0 147 67.5 276.5t187.5 205t268 75.5q185 0 327 -55l-106 -420q-11 -44 -19 -76.5t-8 -64.5q0 -68 58 -68q66 0 124 64 t92.5 171t34.5 214q0 213 -123.5 325.5t-359.5 112.5q-203 0 -366.5 -94t-255 -266t-91.5 -392q0 -243 134 -380.5t376 -137.5q117 0 219.5 20t221.5 66v-186q-230 -90 -465 -90q-217 0 -378 85.5t-246 241.5t-85 359q0 279 120.5 497t343 341.5t497.5 123.5 q318 0 499 -163.5t181 -458.5zM995 889q-82 0 -145.5 -51.5t-100 -137t-36.5 -174.5q0 -65 24.5 -102t69.5 -37q141 0 213 270l57 222q-36 10 -82 10z" />
<glyph unicode="A" horiz-adv-x="1286" d="M842 348h-473l-172 -348h-320l766 1468h373l147 -1468h-297zM827 608l-26 350q-10 131 -10 253v36q-44 -120 -109 -254l-188 -385h333z" />
<glyph unicode="B" horiz-adv-x="1270" d="M788 1462q229 0 346 -81.5t117 -243.5q0 -150 -83 -247.5t-236 -129.5v-6q100 -26 159.5 -96.5t59.5 -180.5q0 -229 -153 -353t-423 -124h-522l309 1462h426zM545 883h149q121 0 181.5 48.5t60.5 139.5q0 137 -170 137h-152zM412 256h180q117 0 183.5 58t66.5 161 q0 162 -183 162h-165z" />
<glyph unicode="C" horiz-adv-x="1253" d="M905 1227q-132 0 -237.5 -81t-169.5 -238.5t-64 -338.5q0 -167 68.5 -248t218.5 -81q146 0 338 77v-260q-199 -77 -400 -77q-254 0 -395 149.5t-141 423.5q0 262 104 482.5t278 335t400 114.5q125 0 222 -22.5t208 -82.5l-118 -250q-106 59 -175 78t-137 19z" />
<glyph unicode="D" horiz-adv-x="1386" d="M1323 909q0 -280 -98 -486.5t-283.5 -314.5t-437.5 -108h-451l309 1462h396q270 0 417.5 -143t147.5 -410zM518 256q148 0 258 76t172 223.5t62 337.5q0 154 -72.5 234.5t-208.5 80.5h-115l-202 -952h106z" />
<glyph unicode="E" horiz-adv-x="1110" d="M870 0h-817l309 1462h818l-54 -254h-512l-67 -321h477l-55 -254h-477l-80 -377h512z" />
<glyph unicode="F" horiz-adv-x="1087" d="M358 0h-305l309 1462h814l-54 -254h-508l-79 -377h473l-56 -253h-473z" />
<glyph unicode="G" horiz-adv-x="1413" d="M754 821h563l-162 -762q-134 -46 -248.5 -62.5t-242.5 -16.5q-259 0 -400 147t-141 422q0 268 107 484.5t301 334t448 117.5q218 0 410 -99l-115 -251q-74 40 -148 64t-161 24q-153 0 -273.5 -83t-189 -236.5t-68.5 -330.5q0 -172 72.5 -252.5t222.5 -80.5q76 0 170 24 l66 299h-267z" />
<glyph unicode="H" horiz-adv-x="1434" d="M1135 0h-306l134 631h-471l-134 -631h-305l309 1462h306l-121 -573h471l121 573h305z" />
<glyph unicode="I" horiz-adv-x="659" d="M53 0l312 1462h305l-312 -1462h-305z" />
<glyph unicode="J" horiz-adv-x="678" d="M-135 -430q-94 0 -187 27v253q88 -20 164 -20q99 0 160.5 60.5t89.5 191.5l293 1380h305l-303 -1423q-52 -245 -175.5 -357t-346.5 -112z" />
<glyph unicode="K" horiz-adv-x="1255" d="M1141 0h-338l-211 592l-125 -70l-109 -522h-305l309 1462h306l-152 -702l158 205l409 497h361l-594 -700z" />
<glyph unicode="L" horiz-adv-x="1061" d="M53 0l309 1462h306l-256 -1206h512l-54 -256h-817z" />
<glyph unicode="M" horiz-adv-x="1802" d="M838 369l551 1093h423l-309 -1462h-280l145 692q53 247 105 441h-5l-569 -1133h-281l-61 1133h-4q-11 -88 -38 -231t-187 -902h-275l309 1462h404l68 -1093h4z" />
<glyph unicode="N" horiz-adv-x="1546" d="M1247 0h-342l-356 1106h-6l-4 -32q-32 -216 -66 -386l-145 -688h-275l309 1462h357l340 -1077h4q12 76 39 217t180 860h274z" />
<glyph unicode="O" horiz-adv-x="1495" d="M1432 938q0 -283 -99 -506.5t-271 -337.5t-396 -114q-256 0 -399.5 147.5t-143.5 409.5q0 265 99 487.5t273 341.5t402 119q255 0 395 -144t140 -403zM872 1227q-121 0 -222 -91.5t-158.5 -251.5t-57.5 -347q0 -147 66.5 -222t187.5 -75t220.5 87t155.5 246t56 357 q0 142 -65 219.5t-183 77.5z" />
<glyph unicode="P" horiz-adv-x="1188" d="M522 774h56q142 0 223.5 69t81.5 185q0 180 -195 180h-74zM1190 1036q0 -241 -169.5 -378.5t-467.5 -137.5h-86l-109 -520h-305l309 1462h338q242 0 366 -106.5t124 -319.5z" />
<glyph unicode="Q" horiz-adv-x="1495" d="M1432 938q0 -316 -122.5 -555.5t-334.5 -337.5l254 -393h-359l-178 328h-26q-256 0 -399.5 147.5t-143.5 409.5q0 265 99 487.5t273 341.5t402 119q255 0 395 -144t140 -403zM872 1227q-121 0 -222 -91.5t-158.5 -251.5t-57.5 -347q0 -147 66.5 -222t187.5 -75t220.5 87 t155.5 246t56 357q0 142 -65 219.5t-183 77.5z" />
<glyph unicode="R" horiz-adv-x="1247" d="M530 813h78q131 0 204 57t73 174q0 82 -47.5 123t-149.5 41h-74zM477 561l-119 -561h-305l309 1462h359q237 0 356 -102t119 -299q0 -158 -83 -271.5t-239 -168.5l261 -621h-332l-207 561h-119z" />
<glyph unicode="S" horiz-adv-x="1085" d="M946 432q0 -209 -148 -330.5t-401 -121.5q-221 0 -356 90v274q193 -108 358 -108q112 0 175 42.5t63 116.5q0 43 -13.5 75.5t-38.5 60.5t-124 102q-138 99 -194 196t-56 209q0 129 62 230.5t176.5 158t263.5 56.5q217 0 397 -99l-109 -233q-156 74 -288 74 q-83 0 -136 -45t-53 -119q0 -61 33 -106.5t148 -120.5q121 -80 181 -176.5t60 -225.5z" />
<glyph unicode="T" horiz-adv-x="1087" d="M571 0h-305l254 1204h-352l55 258h1010l-55 -258h-353z" />
<glyph unicode="U" horiz-adv-x="1415" d="M1434 1462l-201 -946q-57 -266 -218 -401t-419 -135q-212 0 -333.5 113.5t-121.5 307.5q0 72 15 138l196 923h305l-194 -919q-17 -74 -17 -125q0 -178 189 -178q123 0 195 76.5t104 228.5l194 917h306z" />
<glyph unicode="V" horiz-adv-x="1208" d="M535 299q78 221 110 283l432 880h316l-748 -1462h-334l-127 1462h295l51 -880q4 -45 4 -133q-2 -103 -6 -150h7z" />
<glyph unicode="W" horiz-adv-x="1831" d="M1006 1018q-46 -146 -115 -299l-324 -719h-338l-45 1462h287l6 -798q0 -52 -4 -173t-10 -174h6q22 64 67 180.5t60 145.5l369 819h270l21 -873q0 -146 -9 -272h6q43 129 131 349l330 796h309l-647 -1462h-346l-22 721l-2 139q0 88 4 158h-4z" />
<glyph unicode="X" horiz-adv-x="1241" d="M1124 0h-331l-172 543l-396 -543h-342l576 764l-238 698h320l153 -518l363 518h344l-545 -725z" />
<glyph unicode="Y" horiz-adv-x="1155" d="M627 870l374 592h342l-618 -903l-119 -559h-303l119 559l-236 903h312z" />
<glyph unicode="Z" horiz-adv-x="1098" d="M920 0h-981l38 201l777 1005h-543l53 256h936l-41 -202l-782 -1004h596z" />
<glyph unicode="[" horiz-adv-x="678" d="M436 -324h-473l381 1786h473l-45 -211h-215l-291 -1364h215z" />
<glyph unicode="\" horiz-adv-x="862" d="M481 1462l224 -1462h-267l-217 1462h260z" />
<glyph unicode="]" horiz-adv-x="678" d="M-92 -113h213l291 1364h-215l45 211h473l-381 -1786h-471z" />
<glyph unicode="^" horiz-adv-x="1081" d="M20 520l619 950h147l277 -950h-223l-174 633l-402 -633h-244z" />
<glyph unicode="_" horiz-adv-x="819" d="M635 -324h-821l30 140h822z" />
<glyph unicode="`" horiz-adv-x="1135" d="M934 1241h-184q-71 69 -138.5 153.5t-103.5 153.5v21h311q36 -148 115 -303v-25z" />
<glyph unicode="a" horiz-adv-x="1217" d="M406 -20q-147 0 -231.5 106.5t-84.5 298.5q0 198 72 377.5t189 278t257 98.5q97 0 167.5 -42t109.5 -122h8l57 143h232l-238 -1118h-229l14 145h-4q-134 -165 -319 -165zM524 223q69 0 133 67t103 181.5t39 259.5q0 71 -38.5 117.5t-101.5 46.5q-68 0 -129.5 -72 t-98 -190t-36.5 -234q0 -88 33.5 -132t95.5 -44z" />
<glyph unicode="b" horiz-adv-x="1219" d="M813 1139q146 0 230.5 -108t84.5 -298t-68 -367.5t-187 -281.5t-263 -104q-194 0 -276 163h-8l-58 -143h-231l330 1556h301l-62 -288q-41 -182 -84 -299h8q78 98 142.5 134t140.5 36zM692 895q-68 0 -130 -65t-102 -180.5t-40 -250.5q0 -80 37 -128t102 -48q67 0 128 69 t98.5 189.5t37.5 237.5q0 176 -131 176z" />
<glyph unicode="c" horiz-adv-x="989" d="M506 -20q-201 0 -308.5 107.5t-107.5 303.5q0 212 74.5 385.5t209.5 268t308 94.5q182 0 328 -72l-92 -229q-54 23 -106 40t-118 17q-85 0 -153.5 -64t-107 -175.5t-38.5 -239.5q0 -96 45.5 -144.5t126.5 -48.5q76 0 141 23.5t134 58.5v-246q-152 -79 -336 -79z" />
<glyph unicode="d" horiz-adv-x="1217" d="M406 -20q-147 0 -231.5 107t-84.5 300q0 196 71.5 374.5t188.5 278t258 99.5q82 0 141.5 -37t112.5 -127h8l2 28q6 110 25 195l76 358h301l-330 -1556h-229l14 145h-4q-71 -87 -148.5 -126t-170.5 -39zM532 223q66 0 128.5 68.5t100.5 182.5t38 245q0 80 -37.5 128 t-102.5 48q-68 0 -129.5 -72t-98 -190t-36.5 -234q0 -176 137 -176z" />
<glyph unicode="e" horiz-adv-x="1141" d="M696 922q-88 0 -166 -80t-102 -195h45q155 0 241.5 48.5t86.5 131.5q0 95 -105 95zM532 -20q-210 0 -326 113t-116 319q0 207 82.5 377.5t223.5 260t319 89.5q177 0 276 -81.5t99 -223.5q0 -187 -167 -288.5t-477 -101.5h-51l-2 -21v-20q0 -91 51.5 -143.5t147.5 -52.5 q87 0 158 19t172 67v-227q-172 -86 -390 -86z" />
<glyph unicode="f" horiz-adv-x="764" d="M-45 -492q-104 0 -174 25v242q61 -21 115 -21q61 0 107 40t65 130l204 965h-163l30 145l183 84l18 84q41 190 138.5 277.5t273.5 87.5q131 0 235 -49l-80 -224q-69 31 -133 31q-57 0 -92 -40t-47 -105l-12 -62h219l-49 -229h-220l-215 -1010q-77 -371 -403 -371z" />
<glyph unicode="g" horiz-adv-x="1108" d="M1186 1116l-35 -166l-174 -41q16 -52 16 -118q0 -195 -121 -308.5t-329 -113.5q-59 0 -99 10q-84 -27 -84 -78q0 -34 30 -49t89 -23l137 -18q163 -21 237.5 -84.5t74.5 -183.5q0 -211 -156 -323t-446 -112q-208 0 -324.5 75.5t-116.5 207.5q0 102 68.5 175.5t214.5 121.5 q-74 47 -74 133q0 71 44.5 122.5t146.5 98.5q-65 49 -96 112t-31 153q0 199 125.5 315.5t341.5 116.5q83 0 166 -23h395zM365 -6q-106 -14 -160.5 -57t-54.5 -109q0 -115 194 -115q151 0 228 45t77 127q0 39 -32.5 60t-137.5 35zM614 948q-77 0 -124.5 -76.5t-47.5 -191.5 q0 -119 103 -119q75 0 121.5 76.5t46.5 193.5t-99 117z" />
<glyph unicode="h" horiz-adv-x="1237" d="M977 0h-301l137 653q16 68 16 119q0 123 -108 123q-92 0 -167 -114t-118 -318l-98 -463h-301l330 1556h301q-39 -181 -60 -278t-86 -309h8q62 77 138 123.5t176 46.5q138 0 213.5 -83.5t75.5 -238.5q0 -73 -23 -180z" />
<glyph unicode="i" horiz-adv-x="608" d="M322 1380q0 87 47.5 131.5t134.5 44.5q73 0 111 -31t38 -89q0 -80 -44 -129.5t-136 -49.5q-151 0 -151 123zM338 0h-301l237 1118h301z" />
<glyph unicode="j" horiz-adv-x="608" d="M-90 -492q-104 0 -174 25v242q61 -21 114 -21q137 0 173 170l253 1194h302l-265 -1239q-77 -371 -403 -371zM324 1380q0 87 47.5 131.5t134.5 44.5q73 0 111 -31t38 -89q0 -80 -44 -129.5t-136 -49.5q-151 0 -151 123z" />
<glyph unicode="k" horiz-adv-x="1163" d="M920 1118h344l-498 -504l285 -614h-336l-183 420l-120 -72l-74 -348h-301l330 1556h301l-148 -694q-8 -41 -29 -117l-28 -102h4z" />
<glyph unicode="l" horiz-adv-x="608" d="M338 0h-301l330 1556h301z" />
<glyph unicode="m" horiz-adv-x="1853" d="M844 1139q219 0 262 -228h6q68 110 160.5 169t197.5 59q136 0 207.5 -85t71.5 -237q0 -76 -23 -180l-133 -637h-301l138 653q16 68 16 119q0 123 -98 123q-92 0 -166.5 -112t-118.5 -318l-96 -465h-301l137 653q16 68 16 119q0 123 -98 123q-92 0 -167 -114t-118 -318 l-98 -463h-301l237 1118h230l-21 -207h6q146 228 355 228z" />
<glyph unicode="n" horiz-adv-x="1237" d="M977 0h-301l137 653q16 68 16 119q0 123 -108 123q-92 0 -167 -114t-118 -318l-98 -463h-301l237 1118h230l-21 -207h6q146 228 355 228q138 0 213.5 -83.5t75.5 -238.5q0 -73 -23 -180z" />
<glyph unicode="o" horiz-adv-x="1198" d="M805 696q0 197 -143 197q-75 0 -134.5 -61t-97 -179t-37.5 -243q0 -185 150 -185q75 0 135 61.5t93.5 171t33.5 238.5zM1108 696q0 -211 -70.5 -374t-203.5 -252.5t-316 -89.5q-195 0 -311.5 117.5t-116.5 312.5q0 213 71.5 379.5t206.5 258t316 91.5q196 0 310 -118 t114 -325z" />
<glyph unicode="p" horiz-adv-x="1219" d="M813 1139q146 0 230.5 -107.5t84.5 -300.5q0 -191 -68.5 -367.5t-187.5 -280t-262 -103.5q-83 0 -143 37t-111 126h-8q-12 -159 -43 -295l-72 -340h-301l342 1610h230l-17 -170h9q138 191 317 191zM692 895q-68 0 -131.5 -67.5t-102 -180t-38.5 -248.5q0 -80 37 -128 t102 -48q67 0 128 69t98.5 189.5t37.5 237.5q0 176 -131 176z" />
<glyph unicode="q" horiz-adv-x="1217" d="M391 -20q-88 0 -156 47.5t-106.5 138.5t-38.5 219q0 198 72 377.5t189 278t257 98.5q86 0 152.5 -37.5t124.5 -126.5h8l57 143h232l-342 -1610h-301q47 218 73 337.5t84 304.5h-8q-72 -94 -143 -132t-154 -38zM535 223q64 0 127.5 70t100 181t36.5 245q0 80 -37.5 128 t-102.5 48q-68 0 -129.5 -72t-98 -190t-36.5 -234q0 -88 36.5 -132t103.5 -44z" />
<glyph unicode="r" horiz-adv-x="862" d="M842 1139q59 0 96 -11l-66 -290q-45 16 -100 16q-116 0 -203.5 -91.5t-124.5 -262.5l-106 -500h-301l237 1118h230l-21 -207h6q147 228 353 228z" />
<glyph unicode="s" horiz-adv-x="969" d="M829 369q0 -188 -124.5 -288.5t-346.5 -100.5q-107 0 -186.5 15t-148.5 50v248q157 -90 319 -90q80 0 131 32.5t51 88.5q0 43 -37 77t-131 86q-121 68 -169 135.5t-48 159.5q0 170 110.5 263.5t315.5 93.5q201 0 363 -95l-99 -215q-140 84 -258 84q-57 0 -92 -25.5 t-35 -68.5q0 -39 32 -68.5t120 -74.5q123 -63 178 -137t55 -170z" />
<glyph unicode="t" horiz-adv-x="840" d="M514 223q65 0 162 35v-225q-111 -53 -266 -53q-150 0 -220.5 63t-70.5 195q0 50 12 112l115 539h-152l29 147l196 84l132 236h194l-49 -238h283l-50 -229h-282l-115 -539q-6 -30 -6 -53q0 -74 88 -74z" />
<glyph unicode="u" horiz-adv-x="1237" d="M262 1118h301l-137 -653q-16 -68 -16 -119q0 -123 108 -123q92 0 167 114t118 318l98 463h301l-237 -1118h-230l21 207h-6q-145 -227 -355 -227q-138 0 -211 82.5t-73 238.5q0 93 24 213z" />
<glyph unicode="v" horiz-adv-x="1049" d="M455 301q55 153 92 223l297 594h323l-604 -1118h-323l-138 1118h295l45 -586q7 -133 7 -231h6z" />
<glyph unicode="w" horiz-adv-x="1614" d="M856 860q-62 -178 -123 -319l-233 -541h-324l-51 1118h281l4 -495l-4 -167l-7 -171h4q6 20 14 41.5t51 136.5t46 119l231 536h328v-536q0 -142 -10 -297h6l28 80q73 208 95 258l219 495h307l-530 -1118h-330l-6 520q0 155 10 340h-6z" />
<glyph unicode="x" horiz-adv-x="1087" d="M379 573l-225 545h321l115 -334l244 334h354l-467 -561l244 -557h-326l-125 342l-264 -342h-350z" />
<glyph unicode="y" horiz-adv-x="1063" d="M102 1118h295l56 -518q14 -122 14 -293h6q20 51 44 119.5t65 153.5l260 538h327l-680 -1278q-177 -332 -483 -332q-90 0 -147 19v240q68 -13 116 -13q84 0 147.5 48t117.5 149l26 49z" />
<glyph unicode="z" horiz-adv-x="932" d="M748 0h-795l35 180l575 705h-397l51 233h750l-43 -200l-566 -685h439z" />
<glyph unicode="{" horiz-adv-x="727" d="M201 319q0 140 -209 140l45 229q122 0 192.5 41.5t92.5 138.5l61 285q38 170 131 239.5t270 69.5h84l-49 -225q-90 -2 -130.5 -34.5t-55.5 -106.5l-66 -297q-45 -207 -276 -236v-8q85 -26 126.5 -82.5t41.5 -134.5q0 -44 -15 -113l-36 -178q-7 -28 -7 -51q0 -54 33.5 -74 t91.5 -20v-226h-53q-167 0 -253.5 63.5t-86.5 184.5q0 57 14 125l39 184q15 69 15 86z" />
<glyph unicode="|" d="M455 1550h219v-2015h-219v2015z" />
<glyph unicode="}" horiz-adv-x="727" d="M256 1462q340 0 340 -248q0 -56 -14 -124l-39 -185q-15 -69 -15 -86q0 -139 209 -139l-45 -229q-122 0 -192.5 -42t-91.5 -139l-62 -284q-37 -170 -130.5 -240t-270.5 -70h-45v226q93 3 137 35.5t59 105.5l66 297q25 111 95 166t181 69v9q-168 51 -168 217q0 43 15 112 l37 179q6 30 6 51q0 54 -36.5 74t-109.5 20l41 225h33z" />
<glyph unicode="~" d="M342 672q-54 0 -116.5 -33t-116.5 -88v231q101 109 256 109q64 0 117 -14t139 -50q64 -27 111 -41t95 -14q51 0 112 30.5t122 90.5v-231q-103 -109 -256 -109q-59 0 -109 11.5t-147 51.5q-89 38 -127 47t-80 9z" />
<glyph unicode="&#xa1;" horiz-adv-x="586" d="M182 606h242l-158 -977h-340zM549 977q0 -92 -55.5 -145.5t-149.5 -53.5q-68 0 -108.5 38t-40.5 108q0 85 54 139.5t144 54.5q73 0 114.5 -37t41.5 -104z" />
<glyph unicode="&#xa2;" d="M575 -20h-188l49 210q-134 36 -203 136t-69 258q0 193 62.5 355t178 262.5t267.5 123.5l33 158h188l-35 -158q118 -14 225 -65l-92 -230q-53 23 -105 40t-118 17q-133 0 -216 -143t-83 -336q0 -96 45 -144t127 -48q75 0 140 23.5t134 58.5v-246q-136 -71 -299 -80z" />
<glyph unicode="&#xa3;" d="M872 1485q195 0 369 -86l-113 -232q-141 68 -237 68q-75 0 -123 -39.5t-68 -132.5l-47 -229h299l-45 -220h-299l-18 -84q-42 -195 -209 -270h655l-55 -260h-993l49 246q196 48 244 264l22 104h-192l45 220h192l49 247q41 197 162 300.5t313 103.5z" />
<glyph unicode="&#xa4;" d="M190 723q0 102 54 197l-129 127l147 147l127 -127q91 53 197 53q105 0 196 -55l127 129l150 -143l-129 -129q53 -89 53 -199q0 -107 -53 -199l125 -125l-146 -145l-127 125q-95 -51 -196 -51q-115 0 -199 51l-125 -123l-145 145l127 125q-54 93 -54 197zM397 723 q0 -77 54.5 -132.5t134.5 -55.5q81 0 136.5 55t55.5 133q0 80 -56.5 135t-135.5 55q-78 0 -133.5 -56t-55.5 -134z" />
<glyph unicode="&#xa5;" d="M608 872l371 590h311l-506 -747h203l-39 -178h-252l-28 -138h252l-37 -178h-252l-47 -221h-291l47 221h-252l37 178h252l29 138h-252l39 178h196l-192 747h297z" />
<glyph unicode="&#xa6;" d="M455 1550h219v-815h-219v815zM455 350h219v-815h-219v815z" />
<glyph unicode="&#xa7;" horiz-adv-x="995" d="M150 760q0 89 47.5 163t154.5 142q-42 34 -70 84.5t-28 107.5q0 149 117 234.5t313 85.5q172 0 344 -88l-82 -193q-147 84 -282 84q-144 0 -144 -106q0 -43 40.5 -76t127.5 -72q242 -106 242 -303q0 -188 -193 -303q38 -35 64 -85.5t26 -108.5q0 -161 -126 -253.5 t-345 -92.5q-204 0 -336 75v224q172 -105 345 -105q99 0 144.5 35t45.5 92q0 39 -33 72.5t-127 79.5q-117 57 -181 131t-64 176zM506 967q-51 -25 -82 -70.5t-31 -99.5t43.5 -96.5t143.5 -88.5q49 31 75.5 78.5t26.5 95.5q0 109 -176 181z" />
<glyph unicode="&#xa8;" horiz-adv-x="1135" d="M397 1382q0 78 42.5 118t119.5 40q133 0 133 -108q0 -73 -39 -116.5t-121 -43.5q-135 0 -135 110zM799 1382q0 78 42 118t120 40q65 0 99 -28t34 -80q0 -73 -39.5 -116.5t-120.5 -43.5q-135 0 -135 110z" />
<glyph unicode="&#xa9;" horiz-adv-x="1704" d="M932 1010q-111 0 -163 -73t-52 -214q0 -134 55.5 -203t159.5 -69q43 0 108.5 15.5t124.5 43.5v-191q-131 -57 -262 -57q-196 0 -307 122.5t-111 336.5q0 225 117.5 351t325.5 126q142 0 284 -72l-75 -174q-114 58 -205 58zM125 731q0 200 100 375t275 276t377 101 q199 0 373.5 -99t276 -275.5t101.5 -377.5q0 -199 -98.5 -373t-272.5 -276t-380 -102q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM266 731q0 -164 81.5 -305t224 -223t305.5 -82q167 0 308 83t221.5 223.5t80.5 303.5t-80.5 303.5t-222 223.5t-307.5 83 q-164 0 -306.5 -82.5t-223.5 -223.5t-81 -304z" />
<glyph unicode="&#xaa;" horiz-adv-x="772" d="M369 752q-103 0 -160 70t-57 198q0 117 46 228t123 171t177 60q120 0 180 -103h6l39 90h154l-158 -702h-154l8 92h-2q-80 -104 -202 -104zM442 903q45 0 84 41.5t65.5 120t26.5 154.5q0 106 -88 106q-73 0 -123.5 -96t-50.5 -215q0 -111 86 -111z" />
<glyph unicode="&#xab;" horiz-adv-x="1151" d="M72 569l401 463l191 -155l-279 -334l135 -350l-246 -103l-202 461v18zM559 569l402 463l190 -155l-279 -334l136 -350l-246 -103l-203 461v18z" />
<glyph unicode="&#xac;" d="M1061 248h-219v364h-733v219h952v-583z" />
<glyph unicode="&#xad;" horiz-adv-x="659" d="M41 424zM41 424l53 250h524l-53 -250h-524z" />
<glyph unicode="&#xae;" horiz-adv-x="1704" d="M1237 899q0 -86 -44 -149.5t-130 -96.5l197 -360h-254l-138 297h-67v-297h-230v874h308q173 0 265.5 -67.5t92.5 -200.5zM801 758h51q72 0 113 31t41 92q0 59 -35.5 88.5t-116.5 29.5h-53v-241zM125 731q0 200 100 375t275 276t377 101q199 0 373.5 -99t276 -275.5 t101.5 -377.5q0 -199 -98.5 -373t-272.5 -276t-380 -102q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM266 731q0 -164 81.5 -305t224 -223t305.5 -82q167 0 308 83t221.5 223.5t80.5 303.5t-80.5 303.5t-222 223.5t-307.5 83q-164 0 -306.5 -82.5t-223.5 -223.5t-81 -304z " />
<glyph unicode="&#xaf;" horiz-adv-x="1024" d="M1030 1556h-1036l45 201h1036z" />
<glyph unicode="&#xb0;" horiz-adv-x="877" d="M164 1137q0 93 46.5 173.5t127.5 126.5t172 46q93 0 173.5 -47t126.5 -127t46 -172q0 -93 -46 -173t-126 -125.5t-174 -45.5q-93 0 -173 45t-126.5 125t-46.5 174zM354 1137q0 -63 45.5 -108.5t110.5 -45.5q66 0 111 46t45 108q0 63 -45.5 110t-110.5 47t-110.5 -47.5 t-45.5 -109.5z" />
<glyph unicode="&#xb1;" d="M475 674h-366v219h366v369h219v-369h367v-219h-367v-365h-219v365zM109 0v219h952v-219h-952z" />
<glyph unicode="&#xb2;" horiz-adv-x="776" d="M707 586h-648l35 166l273 219q111 91 141 122t44.5 59t14.5 56q0 42 -25.5 62t-60.5 20q-86 0 -188 -82l-100 158q74 57 156 87t192 30q123 0 196.5 -63t73.5 -160q0 -70 -22 -123t-70 -103.5t-189 -152.5l-129 -95h347z" />
<glyph unicode="&#xb3;" horiz-adv-x="776" d="M813 1270q0 -87 -51 -145.5t-166 -88.5v-4q154 -33 154 -176q0 -131 -107 -209t-285 -78q-75 0 -145.5 15.5t-120.5 40.5v192q125 -72 254 -72q76 0 125 30.5t49 88.5q0 37 -26 62.5t-88 25.5h-127l34 160h90q84 0 132.5 28t48.5 85q0 40 -26 60t-71 20q-86 0 -188 -66 l-82 150q142 92 313 92q130 0 206.5 -55.5t76.5 -155.5z" />
<glyph unicode="&#xb4;" horiz-adv-x="1135" d="M483 1266q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5h-209v25z" />
<glyph unicode="&#xb5;" horiz-adv-x="1249" d="M424 348q0 -60 31.5 -92.5t79.5 -32.5q90 0 162.5 106.5t117.5 319.5l98 469h301l-237 -1118h-229l18 176h-6q-117 -196 -266 -196q-51 0 -89.5 19.5t-58.5 47.5h-6q-8 -66 -21.5 -139t-82.5 -400h-304l342 1610h301l-135 -645q-16 -70 -16 -125z" />
<glyph unicode="&#xb6;" horiz-adv-x="1341" d="M1202 -260h-162v1616h-166v-1616h-161v819q-62 -18 -146 -18q-216 0 -318 125t-102 376q0 256 107.5 385t343.5 129h604v-1816z" />
<glyph unicode="&#xb7;" horiz-adv-x="584" d="M131 553zM131 695q0 90 53.5 144t150.5 54q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5z" />
<glyph unicode="&#xb8;" horiz-adv-x="420" d="M262 -250q0 -116 -83 -179t-234 -63q-86 0 -152 23v168q63 -23 125 -23q102 0 102 82q0 34 -31 56.5t-110 31.5l96 154h185l-39 -72q141 -49 141 -178z" />
<glyph unicode="&#xb9;" horiz-adv-x="776" d="M528 1462h207l-186 -876h-246l84 397q24 109 55 207q-16 -15 -80 -60l-131 -81l-102 165z" />
<glyph unicode="&#xba;" horiz-adv-x="754" d="M809 1194q0 -128 -48.5 -232.5t-132.5 -157t-196 -52.5q-134 0 -202 75t-68 211q0 197 104 319t277 122q129 0 197.5 -73.5t68.5 -211.5zM522 1315q-64 0 -107.5 -89.5t-43.5 -199.5q0 -111 80 -111q63 0 105 85.5t42 207.5q0 107 -76 107z" />
<glyph unicode="&#xbb;" horiz-adv-x="1151" d="M1079 535l-401 -463l-191 155l279 334l-135 350l246 103l202 -461v-18zM592 535l-402 -463l-190 155l279 334l-136 350l246 103l203 -461v-18z" />
<glyph unicode="&#xbc;" horiz-adv-x="1804" d="M97 0zM1500 1462l-1084 -1462h-239l1087 1462h236zM496 1462h207l-186 -876h-246l84 397q24 109 55 207q-16 -15 -80 -60l-131 -81l-102 165zM1573 152h-119l-32 -151h-238l33 151h-373l31 174l475 557h260l-121 -563h119zM1252 320l58 231l22 74q-13 -20 -43 -58 t-211 -247h174z" />
<glyph unicode="&#xbd;" horiz-adv-x="1804" d="M97 0zM1588 1h-648l35 166l273 219q111 91 141 122t44.5 59t14.5 56q0 42 -25.5 62t-60.5 20q-86 0 -188 -82l-100 158q74 57 156 87t192 30q123 0 196.5 -63t73.5 -160q0 -70 -22 -123t-70 -103.5t-189 -152.5l-129 -95h347zM496 1462h207l-186 -876h-246l84 397 q24 109 55 207q-16 -15 -80 -60l-131 -81l-102 165zM1500 1462l-1084 -1462h-239l1087 1462h236z" />
<glyph unicode="&#xbe;" horiz-adv-x="1804" d="M133 0zM1633 1462l-1084 -1462h-239l1087 1462h236zM1634 152h-119l-32 -151h-238l33 151h-373l31 174l475 557h260l-121 -563h119zM1313 320l58 231l22 74q-13 -20 -43 -58t-211 -247h174zM854 1270q0 -87 -51 -145.5t-166 -88.5v-4q154 -33 154 -176q0 -131 -107 -209 t-285 -78q-75 0 -145.5 15.5t-120.5 40.5v192q125 -72 254 -72q76 0 125 30.5t49 88.5q0 37 -26 62.5t-88 25.5h-127l34 160h90q84 0 132.5 28t48.5 85q0 40 -26 60t-71 20q-86 0 -188 -66l-82 150q142 92 313 92q130 0 206.5 -55.5t76.5 -155.5z" />
<glyph unicode="&#xbf;" horiz-adv-x="940" d="M678 606l-14 -78q-19 -105 -76.5 -180t-169.5 -151q-122 -83 -156.5 -126t-34.5 -98q0 -118 133 -118q50 0 106.5 16t201.5 84l92 -221q-221 -125 -445 -125q-177 0 -280 87.5t-103 244.5q0 82 28.5 148.5t83.5 124t189 146.5q93 62 128 106.5t51 106.5l8 33h258z M772 977q0 -92 -55.5 -145.5t-149.5 -53.5q-68 0 -108.5 38t-40.5 108q0 86 54.5 140t143.5 54q73 0 114.5 -37t41.5 -104z" />
<glyph unicode="&#xc0;" horiz-adv-x="1286" d="M0 0zM842 348h-473l-172 -348h-320l766 1468h373l147 -1468h-297zM827 608l-26 350q-10 131 -10 253v36q-44 -120 -109 -254l-188 -385h333zM965 1579h-184q-71 69 -138.5 153.5t-103.5 153.5v21h311q36 -148 115 -303v-25z" />
<glyph unicode="&#xc1;" horiz-adv-x="1286" d="M0 0zM842 348h-473l-172 -348h-320l766 1468h373l147 -1468h-297zM827 608l-26 350q-10 131 -10 253v36q-44 -120 -109 -254l-188 -385h333zM735 1604q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5h-209v25z" />
<glyph unicode="&#xc2;" horiz-adv-x="1286" d="M0 0zM842 348h-473l-172 -348h-320l766 1468h373l147 -1468h-297zM827 608l-26 350q-10 131 -10 253v36q-44 -120 -109 -254l-188 -385h333zM1235 1579h-198q-63 53 -162 168q-105 -88 -232 -168h-217v25q63 57 153 147t142 156h338q22 -54 74 -142.5t102 -160.5v-25z " />
<glyph unicode="&#xc3;" horiz-adv-x="1286" d="M0 0zM842 348h-473l-172 -348h-320l766 1468h373l147 -1468h-297zM827 608l-26 350q-10 131 -10 253v36q-44 -120 -109 -254l-188 -385h333zM999 1579q-49 0 -86.5 16.5t-69.5 36t-61.5 36t-62.5 16.5q-31 0 -55.5 -28t-38.5 -79h-177q59 309 281 309q49 0 87.5 -16.5 t71.5 -36t62 -35.5t60 -16q34 0 58 25.5t46 80.5h172q-66 -309 -287 -309z" />
<glyph unicode="&#xc4;" horiz-adv-x="1286" d="M0 0zM842 348h-473l-172 -348h-320l766 1468h373l147 -1468h-297zM827 608l-26 350q-10 131 -10 253v36q-44 -120 -109 -254l-188 -385h333zM516 1720q0 78 42.5 118t119.5 40q133 0 133 -108q0 -73 -39 -116.5t-121 -43.5q-135 0 -135 110zM918 1720q0 78 42 118t120 40 q65 0 99 -28t34 -80q0 -73 -39.5 -116.5t-120.5 -43.5q-135 0 -135 110z" />
<glyph unicode="&#xc5;" horiz-adv-x="1286" d="M0 0zM842 348h-473l-172 -348h-320l766 1468h373l147 -1468h-297zM827 608l-26 350q-10 131 -10 253v36q-44 -120 -109 -254l-188 -385h333zM1087 1567q0 -107 -70 -173.5t-184 -66.5q-110 0 -179 63.5t-69 174.5q0 109 68.5 173t179.5 64q110 0 182 -65t72 -170z M930 1565q0 45 -27.5 70.5t-69.5 25.5t-69 -25.5t-27 -70.5t24 -71t72 -26q42 0 69.5 26t27.5 71z" />
<glyph unicode="&#xc6;" horiz-adv-x="1833" d="M1593 0h-817l74 348h-426l-219 -348h-328l922 1462h1104l-54 -254h-512l-67 -321h477l-55 -254h-478l-79 -377h512zM905 608l127 600h-80l-364 -600h317z" />
<glyph unicode="&#xc7;" horiz-adv-x="1253" d="M123 0zM905 1227q-132 0 -237.5 -81t-169.5 -238.5t-64 -338.5q0 -167 68.5 -248t218.5 -81q146 0 338 77v-260q-199 -77 -400 -77q-254 0 -395 149.5t-141 423.5q0 262 104 482.5t278 335t400 114.5q125 0 222 -22.5t208 -82.5l-118 -250q-106 59 -175 78t-137 19z M825 -250q0 -116 -83 -179t-234 -63q-86 0 -152 23v168q63 -23 125 -23q102 0 102 82q0 34 -31 56.5t-110 31.5l96 154h185l-39 -72q141 -49 141 -178z" />
<glyph unicode="&#xc8;" horiz-adv-x="1110" d="M53 0zM870 0h-817l309 1462h818l-54 -254h-512l-67 -321h477l-55 -254h-477l-80 -377h512zM906 1579h-184q-71 69 -138.5 153.5t-103.5 153.5v21h311q36 -148 115 -303v-25z" />
<glyph unicode="&#xc9;" horiz-adv-x="1110" d="M53 0zM870 0h-817l309 1462h818l-54 -254h-512l-67 -321h477l-55 -254h-477l-80 -377h512zM608 1604q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5h-209v25z" />
<glyph unicode="&#xca;" horiz-adv-x="1110" d="M53 0zM870 0h-817l309 1462h818l-54 -254h-512l-67 -321h477l-55 -254h-477l-80 -377h512zM1177 1579h-198q-63 53 -162 168q-105 -88 -232 -168h-217v25q63 57 153 147t142 156h338q22 -54 74 -142.5t102 -160.5v-25z" />
<glyph unicode="&#xcb;" horiz-adv-x="1110" d="M53 0zM870 0h-817l309 1462h818l-54 -254h-512l-67 -321h477l-55 -254h-477l-80 -377h512zM438 1720q0 78 42.5 118t119.5 40q133 0 133 -108q0 -73 -39 -116.5t-121 -43.5q-135 0 -135 110zM840 1720q0 78 42 118t120 40q65 0 99 -28t34 -80q0 -73 -39.5 -116.5 t-120.5 -43.5q-135 0 -135 110z" />
<glyph unicode="&#xcc;" horiz-adv-x="659" d="M53 0zM53 0l312 1462h305l-312 -1462h-305zM667 1579h-184q-71 69 -138.5 153.5t-103.5 153.5v21h311q36 -148 115 -303v-25z" />
<glyph unicode="&#xcd;" horiz-adv-x="659" d="M53 0zM53 0l312 1462h305l-312 -1462h-305zM414 1604q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5h-209v25z" />
<glyph unicode="&#xce;" horiz-adv-x="659" d="M53 0zM53 0l312 1462h305l-312 -1462h-305zM937 1579h-198q-63 53 -162 168q-105 -88 -232 -168h-217v25q63 57 153 147t142 156h338q22 -54 74 -142.5t102 -160.5v-25z" />
<glyph unicode="&#xcf;" horiz-adv-x="659" d="M53 0zM53 0l312 1462h305l-312 -1462h-305zM222 1720q0 78 42.5 118t119.5 40q133 0 133 -108q0 -73 -39 -116.5t-121 -43.5q-135 0 -135 110zM624 1720q0 78 42 118t120 40q65 0 99 -28t34 -80q0 -73 -39.5 -116.5t-120.5 -43.5q-135 0 -135 110z" />
<glyph unicode="&#xd0;" horiz-adv-x="1386" d="M1323 909q0 -280 -98 -486.5t-283.5 -314.5t-437.5 -108h-451l125 596h-141l55 254h139l131 612h396q270 0 417.5 -143t147.5 -410zM518 256q148 0 258 76t172 223.5t62 337.5q0 154 -72.5 234.5t-208.5 80.5h-115l-75 -358h237l-55 -254h-238l-71 -340h106z" />
<glyph unicode="&#xd1;" horiz-adv-x="1546" d="M53 0zM1247 0h-342l-356 1106h-6l-4 -32q-32 -216 -66 -386l-145 -688h-275l309 1462h357l340 -1077h4q12 76 39 217t180 860h274zM1114 1579q-49 0 -86.5 16.5t-69.5 36t-61.5 36t-62.5 16.5q-31 0 -55.5 -28t-38.5 -79h-177q59 309 281 309q49 0 87.5 -16.5t71.5 -36 t62 -35.5t60 -16q34 0 58 25.5t46 80.5h172q-66 -309 -287 -309z" />
<glyph unicode="&#xd2;" horiz-adv-x="1495" d="M123 0zM1432 938q0 -283 -99 -506.5t-271 -337.5t-396 -114q-256 0 -399.5 147.5t-143.5 409.5q0 265 99 487.5t273 341.5t402 119q255 0 395 -144t140 -403zM872 1227q-121 0 -222 -91.5t-158.5 -251.5t-57.5 -347q0 -147 66.5 -222t187.5 -75t220.5 87t155.5 246 t56 357q0 142 -65 219.5t-183 77.5zM1053 1579h-184q-71 69 -138.5 153.5t-103.5 153.5v21h311q36 -148 115 -303v-25z" />
<glyph unicode="&#xd3;" horiz-adv-x="1495" d="M123 0zM1432 938q0 -283 -99 -506.5t-271 -337.5t-396 -114q-256 0 -399.5 147.5t-143.5 409.5q0 265 99 487.5t273 341.5t402 119q255 0 395 -144t140 -403zM872 1227q-121 0 -222 -91.5t-158.5 -251.5t-57.5 -347q0 -147 66.5 -222t187.5 -75t220.5 87t155.5 246 t56 357q0 142 -65 219.5t-183 77.5zM753 1604q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5h-209v25z" />
<glyph unicode="&#xd4;" horiz-adv-x="1495" d="M123 0zM1432 938q0 -283 -99 -506.5t-271 -337.5t-396 -114q-256 0 -399.5 147.5t-143.5 409.5q0 265 99 487.5t273 341.5t402 119q255 0 395 -144t140 -403zM872 1227q-121 0 -222 -91.5t-158.5 -251.5t-57.5 -347q0 -147 66.5 -222t187.5 -75t220.5 87t155.5 246 t56 357q0 142 -65 219.5t-183 77.5zM1308 1579h-198q-63 53 -162 168q-105 -88 -232 -168h-217v25q63 57 153 147t142 156h338q22 -54 74 -142.5t102 -160.5v-25z" />
<glyph unicode="&#xd5;" horiz-adv-x="1495" d="M123 0zM1432 938q0 -283 -99 -506.5t-271 -337.5t-396 -114q-256 0 -399.5 147.5t-143.5 409.5q0 265 99 487.5t273 341.5t402 119q255 0 395 -144t140 -403zM872 1227q-121 0 -222 -91.5t-158.5 -251.5t-57.5 -347q0 -147 66.5 -222t187.5 -75t220.5 87t155.5 246 t56 357q0 142 -65 219.5t-183 77.5zM1071 1579q-49 0 -86.5 16.5t-69.5 36t-61.5 36t-62.5 16.5q-31 0 -55.5 -28t-38.5 -79h-177q59 309 281 309q49 0 87.5 -16.5t71.5 -36t62 -35.5t60 -16q34 0 58 25.5t46 80.5h172q-66 -309 -287 -309z" />
<glyph unicode="&#xd6;" horiz-adv-x="1495" d="M123 0zM1432 938q0 -283 -99 -506.5t-271 -337.5t-396 -114q-256 0 -399.5 147.5t-143.5 409.5q0 265 99 487.5t273 341.5t402 119q255 0 395 -144t140 -403zM872 1227q-121 0 -222 -91.5t-158.5 -251.5t-57.5 -347q0 -147 66.5 -222t187.5 -75t220.5 87t155.5 246 t56 357q0 142 -65 219.5t-183 77.5zM585 1720q0 78 42.5 118t119.5 40q133 0 133 -108q0 -73 -39 -116.5t-121 -43.5q-135 0 -135 110zM987 1720q0 78 42 118t120 40q65 0 99 -28t34 -80q0 -73 -39.5 -116.5t-120.5 -43.5q-135 0 -135 110z" />
<glyph unicode="&#xd7;" d="M428 723l-299 301l152 154l301 -299l305 299l153 -150l-305 -305l301 -303l-149 -152l-305 301l-301 -299l-150 152z" />
<glyph unicode="&#xd8;" horiz-adv-x="1495" d="M1432 938q0 -283 -99 -506.5t-271 -337.5t-396 -114q-180 0 -304 71l-108 -137l-154 115l121 151q-98 138 -98 357q0 265 99 487.5t273 341.5t402 119q182 0 305 -76l105 131l151 -117l-117 -145q91 -134 91 -340zM870 1233q-126 0 -229 -91.5t-160 -252.5t-57 -352 q0 -32 8 -101l596 754q-69 43 -158 43zM1133 930l-5 80l-589 -740q59 -37 153 -37q124 0 226 89t158.5 247.5t56.5 360.5z" />
<glyph unicode="&#xd9;" horiz-adv-x="1415" d="M141 0zM1434 1462l-201 -946q-57 -266 -218 -401t-419 -135q-212 0 -333.5 113.5t-121.5 307.5q0 72 15 138l196 923h305l-194 -919q-17 -74 -17 -125q0 -178 189 -178q123 0 195 76.5t104 228.5l194 917h306zM1002 1579h-184q-71 69 -138.5 153.5t-103.5 153.5v21h311 q36 -148 115 -303v-25z" />
<glyph unicode="&#xda;" horiz-adv-x="1415" d="M141 0zM1434 1462l-201 -946q-57 -266 -218 -401t-419 -135q-212 0 -333.5 113.5t-121.5 307.5q0 72 15 138l196 923h305l-194 -919q-17 -74 -17 -125q0 -178 189 -178q123 0 195 76.5t104 228.5l194 917h306zM757 1604q79 88 222 303h335v-17q-46 -56 -154 -152.5 t-194 -158.5h-209v25z" />
<glyph unicode="&#xdb;" horiz-adv-x="1415" d="M141 0zM1434 1462l-201 -946q-57 -266 -218 -401t-419 -135q-212 0 -333.5 113.5t-121.5 307.5q0 72 15 138l196 923h305l-194 -919q-17 -74 -17 -125q0 -178 189 -178q123 0 195 76.5t104 228.5l194 917h306zM1284 1579h-198q-63 53 -162 168q-105 -88 -232 -168h-217 v25q63 57 153 147t142 156h338q22 -54 74 -142.5t102 -160.5v-25z" />
<glyph unicode="&#xdc;" horiz-adv-x="1415" d="M141 0zM1434 1462l-201 -946q-57 -266 -218 -401t-419 -135q-212 0 -333.5 113.5t-121.5 307.5q0 72 15 138l196 923h305l-194 -919q-17 -74 -17 -125q0 -178 189 -178q123 0 195 76.5t104 228.5l194 917h306zM565 1720q0 78 42.5 118t119.5 40q133 0 133 -108 q0 -73 -39 -116.5t-121 -43.5q-135 0 -135 110zM967 1720q0 78 42 118t120 40q65 0 99 -28t34 -80q0 -73 -39.5 -116.5t-120.5 -43.5q-135 0 -135 110z" />
<glyph unicode="&#xdd;" horiz-adv-x="1155" d="M186 0zM627 870l374 592h342l-618 -903l-119 -559h-303l119 559l-236 903h312zM606 1604q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5h-209v25z" />
<glyph unicode="&#xde;" horiz-adv-x="1188" d="M1143 807q0 -243 -170.5 -378.5t-466.5 -135.5h-86l-62 -293h-305l309 1462h306l-50 -229h35q242 0 366 -106.5t124 -319.5zM475 547h55q139 0 222.5 66.5t83.5 185.5q0 180 -195 180h-74z" />
<glyph unicode="&#xdf;" horiz-adv-x="1350" d="M846 1567q208 0 331 -90t123 -240q0 -114 -49 -192t-178 -152q-73 -42 -96 -68.5t-23 -54.5q0 -23 22 -49.5t79 -69.5q107 -83 144.5 -150.5t37.5 -150.5q0 -170 -123.5 -270t-337.5 -100q-187 0 -297 61v240q128 -78 258 -78q101 0 148 33t47 86q0 40 -26.5 75 t-108.5 97q-94 72 -129 130t-35 126q0 84 45 145t162 127q66 37 104.5 76t38.5 96q0 62 -39.5 98.5t-124.5 36.5q-96 0 -156 -51.5t-85 -171.5l-254 -1219q-43 -198 -147 -288.5t-277 -90.5q-90 0 -160 25v242q61 -21 115 -21q133 0 170 178l254 1207q47 224 182 326 t385 102z" />
<glyph unicode="&#xe0;" horiz-adv-x="1217" d="M90 0zM406 -20q-147 0 -231.5 106.5t-84.5 298.5q0 198 72 377.5t189 278t257 98.5q97 0 167.5 -42t109.5 -122h8l57 143h232l-238 -1118h-229l14 145h-4q-134 -165 -319 -165zM524 223q69 0 133 67t103 181.5t39 259.5q0 71 -38.5 117.5t-101.5 46.5q-68 0 -129.5 -72 t-98 -190t-36.5 -234q0 -88 33.5 -132t95.5 -44zM869 1241h-184q-71 69 -138.5 153.5t-103.5 153.5v21h311q36 -148 115 -303v-25z" />
<glyph unicode="&#xe1;" horiz-adv-x="1217" d="M90 0zM406 -20q-147 0 -231.5 106.5t-84.5 298.5q0 198 72 377.5t189 278t257 98.5q97 0 167.5 -42t109.5 -122h8l57 143h232l-238 -1118h-229l14 145h-4q-134 -165 -319 -165zM524 223q69 0 133 67t103 181.5t39 259.5q0 71 -38.5 117.5t-101.5 46.5q-68 0 -129.5 -72 t-98 -190t-36.5 -234q0 -88 33.5 -132t95.5 -44zM598 1266q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5h-209v25z" />
<glyph unicode="&#xe2;" horiz-adv-x="1217" d="M90 0zM406 -20q-147 0 -231.5 106.5t-84.5 298.5q0 198 72 377.5t189 278t257 98.5q97 0 167.5 -42t109.5 -122h8l57 143h232l-238 -1118h-229l14 145h-4q-134 -165 -319 -165zM524 223q69 0 133 67t103 181.5t39 259.5q0 71 -38.5 117.5t-101.5 46.5q-68 0 -129.5 -72 t-98 -190t-36.5 -234q0 -88 33.5 -132t95.5 -44zM1120 1240h-198q-63 53 -162 168q-105 -88 -232 -168h-217v25q63 57 153 147t142 156h338q22 -54 74 -142.5t102 -160.5v-25z" />
<glyph unicode="&#xe3;" horiz-adv-x="1217" d="M90 0zM406 -20q-147 0 -231.5 106.5t-84.5 298.5q0 198 72 377.5t189 278t257 98.5q97 0 167.5 -42t109.5 -122h8l57 143h232l-238 -1118h-229l14 145h-4q-134 -165 -319 -165zM524 223q69 0 133 67t103 181.5t39 259.5q0 71 -38.5 117.5t-101.5 46.5q-68 0 -129.5 -72 t-98 -190t-36.5 -234q0 -88 33.5 -132t95.5 -44zM884 1241q-49 0 -86.5 16.5t-69.5 36t-61.5 36t-62.5 16.5q-31 0 -55.5 -28t-38.5 -79h-177q59 309 281 309q49 0 87.5 -16.5t71.5 -36t62 -35.5t60 -16q34 0 58 25.5t46 80.5h172q-66 -309 -287 -309z" />
<glyph unicode="&#xe4;" horiz-adv-x="1217" d="M90 0zM406 -20q-147 0 -231.5 106.5t-84.5 298.5q0 198 72 377.5t189 278t257 98.5q97 0 167.5 -42t109.5 -122h8l57 143h232l-238 -1118h-229l14 145h-4q-134 -165 -319 -165zM524 223q69 0 133 67t103 181.5t39 259.5q0 71 -38.5 117.5t-101.5 46.5q-68 0 -129.5 -72 t-98 -190t-36.5 -234q0 -88 33.5 -132t95.5 -44zM397 1382q0 78 42.5 118t119.5 40q133 0 133 -108q0 -73 -39 -116.5t-121 -43.5q-135 0 -135 110zM799 1382q0 78 42 118t120 40q65 0 99 -28t34 -80q0 -73 -39.5 -116.5t-120.5 -43.5q-135 0 -135 110z" />
<glyph unicode="&#xe5;" horiz-adv-x="1217" d="M90 0zM406 -20q-147 0 -231.5 106.5t-84.5 298.5q0 198 72 377.5t189 278t257 98.5q97 0 167.5 -42t109.5 -122h8l57 143h232l-238 -1118h-229l14 145h-4q-134 -165 -319 -165zM524 223q69 0 133 67t103 181.5t39 259.5q0 71 -38.5 117.5t-101.5 46.5q-68 0 -129.5 -72 t-98 -190t-36.5 -234q0 -88 33.5 -132t95.5 -44zM1023 1479q0 -107 -70 -173.5t-184 -66.5q-110 0 -179 63.5t-69 174.5q0 109 68.5 173t179.5 64q110 0 182 -65t72 -170zM866 1477q0 45 -27.5 70.5t-69.5 25.5t-69 -25.5t-27 -70.5t24 -71t72 -26q42 0 69.5 26t27.5 71z " />
<glyph unicode="&#xe6;" horiz-adv-x="1786" d="M1206 -20q-109 0 -179.5 27t-117.5 87l-16 -94h-188l14 145h-6q-71 -88 -146.5 -126.5t-167.5 -38.5q-146 0 -227.5 109t-81.5 296q0 200 68.5 375.5t185 277t258.5 101.5q96 0 160.5 -38.5t114.5 -125.5h6l57 143h188l-18 -90q44 49 120.5 80t168.5 31 q157 0 246.5 -83.5t89.5 -221.5q0 -187 -167 -288.5t-476 -101.5h-52l-2 -19v-19q0 -96 55.5 -147.5t159.5 -51.5q66 0 152 23t162 63v-227q-179 -86 -361 -86zM518 223q72 0 134 68t99 184.5t37 243.5q0 80 -33 128t-102 48q-68 0 -128 -69t-95 -185.5t-35 -241.5 q0 -84 32.5 -130t90.5 -46zM1341 922q-88 0 -166 -80t-102 -195h45q155 0 241.5 48.5t86.5 131.5q0 95 -105 95z" />
<glyph unicode="&#xe7;" horiz-adv-x="989" d="M90 0zM506 -20q-201 0 -308.5 107.5t-107.5 303.5q0 212 74.5 385.5t209.5 268t308 94.5q182 0 328 -72l-92 -229q-54 23 -106 40t-118 17q-85 0 -153.5 -64t-107 -175.5t-38.5 -239.5q0 -96 45.5 -144.5t126.5 -48.5q76 0 141 23.5t134 58.5v-246q-152 -79 -336 -79z M653 -250q0 -116 -83 -179t-234 -63q-86 0 -152 23v168q63 -23 125 -23q102 0 102 82q0 34 -31 56.5t-110 31.5l96 154h185l-39 -72q141 -49 141 -178z" />
<glyph unicode="&#xe8;" horiz-adv-x="1141" d="M90 0zM696 922q-88 0 -166 -80t-102 -195h45q155 0 241.5 48.5t86.5 131.5q0 95 -105 95zM532 -20q-210 0 -326 113t-116 319q0 207 82.5 377.5t223.5 260t319 89.5q177 0 276 -81.5t99 -223.5q0 -187 -167 -288.5t-477 -101.5h-51l-2 -21v-20q0 -91 51.5 -143.5 t147.5 -52.5q87 0 158 19t172 67v-227q-172 -86 -390 -86zM849 1241h-184q-71 69 -138.5 153.5t-103.5 153.5v21h311q36 -148 115 -303v-25z" />
<glyph unicode="&#xe9;" horiz-adv-x="1141" d="M90 0zM696 922q-88 0 -166 -80t-102 -195h45q155 0 241.5 48.5t86.5 131.5q0 95 -105 95zM532 -20q-210 0 -326 113t-116 319q0 207 82.5 377.5t223.5 260t319 89.5q177 0 276 -81.5t99 -223.5q0 -187 -167 -288.5t-477 -101.5h-51l-2 -21v-20q0 -91 51.5 -143.5 t147.5 -52.5q87 0 158 19t172 67v-227q-172 -86 -390 -86zM528 1266q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5h-209v25z" />
<glyph unicode="&#xea;" horiz-adv-x="1141" d="M90 0zM696 922q-88 0 -166 -80t-102 -195h45q155 0 241.5 48.5t86.5 131.5q0 95 -105 95zM532 -20q-210 0 -326 113t-116 319q0 207 82.5 377.5t223.5 260t319 89.5q177 0 276 -81.5t99 -223.5q0 -187 -167 -288.5t-477 -101.5h-51l-2 -21v-20q0 -91 51.5 -143.5 t147.5 -52.5q87 0 158 19t172 67v-227q-172 -86 -390 -86zM1101 1241h-198q-63 53 -162 168q-105 -88 -232 -168h-217v25q63 57 153 147t142 156h338q22 -54 74 -142.5t102 -160.5v-25z" />
<glyph unicode="&#xeb;" horiz-adv-x="1141" d="M90 0zM696 922q-88 0 -166 -80t-102 -195h45q155 0 241.5 48.5t86.5 131.5q0 95 -105 95zM532 -20q-210 0 -326 113t-116 319q0 207 82.5 377.5t223.5 260t319 89.5q177 0 276 -81.5t99 -223.5q0 -187 -167 -288.5t-477 -101.5h-51l-2 -21v-20q0 -91 51.5 -143.5 t147.5 -52.5q87 0 158 19t172 67v-227q-172 -86 -390 -86zM365 1382q0 78 42.5 118t119.5 40q133 0 133 -108q0 -73 -39 -116.5t-121 -43.5q-135 0 -135 110zM767 1382q0 78 42 118t120 40q65 0 99 -28t34 -80q0 -73 -39.5 -116.5t-120.5 -43.5q-135 0 -135 110z" />
<glyph unicode="&#xec;" horiz-adv-x="608" d="M37 0zM338 0h-301l237 1118h301zM579 1241h-184q-71 69 -138.5 153.5t-103.5 153.5v21h311q36 -148 115 -303v-25z" />
<glyph unicode="&#xed;" horiz-adv-x="608" d="M37 0zM338 0h-301l237 1118h301zM291 1266q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5h-209v25z" />
<glyph unicode="&#xee;" horiz-adv-x="608" d="M36 0zM338 0h-301l237 1118h301zM845 1241h-198q-63 53 -162 168q-105 -88 -232 -168h-217v25q63 57 153 147t142 156h338q22 -54 74 -142.5t102 -160.5v-25z" />
<glyph unicode="&#xef;" horiz-adv-x="608" d="M37 0zM338 0h-301l237 1118h301zM126 1382q0 78 42.5 118t119.5 40q133 0 133 -108q0 -73 -39 -116.5t-121 -43.5q-135 0 -135 110zM528 1382q0 78 42 118t120 40q65 0 99 -28t34 -80q0 -73 -39.5 -116.5t-120.5 -43.5q-135 0 -135 110z" />
<glyph unicode="&#xf0;" horiz-adv-x="1182" d="M618 1309q-34 34 -124 80l118 186q134 -61 232 -139l237 131l76 -152l-192 -106q81 -107 113 -235t32 -279q0 -249 -69.5 -432.5t-203.5 -283t-323 -99.5q-216 0 -329 110t-113 316q0 165 64.5 301t180.5 212t265 76q83 0 151.5 -31t114.5 -94h6q-20 213 -117 310 l-231 -131l-88 147zM528 205q66 0 122.5 55.5t89 148.5t32.5 193q0 77 -38.5 122.5t-108.5 45.5q-73 0 -130 -53t-88.5 -143t-31.5 -197q0 -81 39 -126.5t114 -45.5z" />
<glyph unicode="&#xf1;" horiz-adv-x="1237" d="M37 0zM977 0h-301l137 653q16 68 16 119q0 123 -108 123q-92 0 -167 -114t-118 -318l-98 -463h-301l237 1118h230l-21 -207h6q146 228 355 228q138 0 213.5 -83.5t75.5 -238.5q0 -73 -23 -180zM909 1241q-49 0 -86.5 16.5t-69.5 36t-61.5 36t-62.5 16.5q-31 0 -55.5 -28 t-38.5 -79h-177q59 309 281 309q49 0 87.5 -16.5t71.5 -36t62 -35.5t60 -16q34 0 58 25.5t46 80.5h172q-66 -309 -287 -309z" />
<glyph unicode="&#xf2;" horiz-adv-x="1198" d="M90 0zM805 696q0 197 -143 197q-75 0 -134.5 -61t-97 -179t-37.5 -243q0 -185 150 -185q75 0 135 61.5t93.5 171t33.5 238.5zM1108 696q0 -211 -70.5 -374t-203.5 -252.5t-316 -89.5q-195 0 -311.5 117.5t-116.5 312.5q0 213 71.5 379.5t206.5 258t316 91.5 q196 0 310 -118t114 -325zM845 1241h-184q-71 69 -138.5 153.5t-103.5 153.5v21h311q36 -148 115 -303v-25z" />
<glyph unicode="&#xf3;" horiz-adv-x="1198" d="M90 0zM805 696q0 197 -143 197q-75 0 -134.5 -61t-97 -179t-37.5 -243q0 -185 150 -185q75 0 135 61.5t93.5 171t33.5 238.5zM1108 696q0 -211 -70.5 -374t-203.5 -252.5t-316 -89.5q-195 0 -311.5 117.5t-116.5 312.5q0 213 71.5 379.5t206.5 258t316 91.5 q196 0 310 -118t114 -325zM571 1266q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5h-209v25z" />
<glyph unicode="&#xf4;" horiz-adv-x="1198" d="M90 0zM805 696q0 197 -143 197q-75 0 -134.5 -61t-97 -179t-37.5 -243q0 -185 150 -185q75 0 135 61.5t93.5 171t33.5 238.5zM1108 696q0 -211 -70.5 -374t-203.5 -252.5t-316 -89.5q-195 0 -311.5 117.5t-116.5 312.5q0 213 71.5 379.5t206.5 258t316 91.5 q196 0 310 -118t114 -325zM1109 1241h-198q-63 53 -162 168q-105 -88 -232 -168h-217v25q63 57 153 147t142 156h338q22 -54 74 -142.5t102 -160.5v-25z" />
<glyph unicode="&#xf5;" horiz-adv-x="1198" d="M90 0zM805 696q0 197 -143 197q-75 0 -134.5 -61t-97 -179t-37.5 -243q0 -185 150 -185q75 0 135 61.5t93.5 171t33.5 238.5zM1108 696q0 -211 -70.5 -374t-203.5 -252.5t-316 -89.5q-195 0 -311.5 117.5t-116.5 312.5q0 213 71.5 379.5t206.5 258t316 91.5 q196 0 310 -118t114 -325zM865 1241q-49 0 -86.5 16.5t-69.5 36t-61.5 36t-62.5 16.5q-31 0 -55.5 -28t-38.5 -79h-177q59 309 281 309q49 0 87.5 -16.5t71.5 -36t62 -35.5t60 -16q34 0 58 25.5t46 80.5h172q-66 -309 -287 -309z" />
<glyph unicode="&#xf6;" horiz-adv-x="1198" d="M90 0zM805 696q0 197 -143 197q-75 0 -134.5 -61t-97 -179t-37.5 -243q0 -185 150 -185q75 0 135 61.5t93.5 171t33.5 238.5zM1108 696q0 -211 -70.5 -374t-203.5 -252.5t-316 -89.5q-195 0 -311.5 117.5t-116.5 312.5q0 213 71.5 379.5t206.5 258t316 91.5 q196 0 310 -118t114 -325zM386 1382q0 78 42.5 118t119.5 40q133 0 133 -108q0 -73 -39 -116.5t-121 -43.5q-135 0 -135 110zM788 1382q0 78 42 118t120 40q65 0 99 -28t34 -80q0 -73 -39.5 -116.5t-120.5 -43.5q-135 0 -135 110z" />
<glyph unicode="&#xf7;" d="M109 612v219h952v-219h-952zM444 373q0 76 37 113.5t103 37.5t102.5 -39t36.5 -112q0 -70 -37 -111t-102 -41t-102.5 39t-37.5 113zM444 1071q0 75 37 113.5t103 38.5q67 0 103 -40.5t36 -111.5q0 -70 -37 -110.5t-102 -40.5t-102.5 39t-37.5 112z" />
<glyph unicode="&#xf8;" horiz-adv-x="1198" d="M1108 696q0 -211 -70.5 -374t-203.5 -252.5t-316 -89.5q-123 0 -225 53l-109 -135l-141 108l119 148q-72 107 -72 256q0 213 71.5 379.5t206.5 258t316 91.5q131 0 227 -56l70 88l145 -110l-84 -105q66 -107 66 -260zM662 903q-81 0 -144.5 -62.5t-98 -169.5t-34.5 -233 v-12l365 453q-35 24 -88 24zM543 215q114 0 193 133t79 318v16l-358 -444q11 -8 35.5 -15.5t50.5 -7.5z" />
<glyph unicode="&#xf9;" horiz-adv-x="1237" d="M111 0zM262 1118h301l-137 -653q-16 -68 -16 -119q0 -123 108 -123q92 0 167 114t118 318l98 463h301l-237 -1118h-230l21 207h-6q-145 -227 -355 -227q-138 0 -211 82.5t-73 238.5q0 93 24 213zM845 1241h-184q-71 69 -138.5 153.5t-103.5 153.5v21h311 q36 -148 115 -303v-25z" />
<glyph unicode="&#xfa;" horiz-adv-x="1237" d="M111 0zM262 1118h301l-137 -653q-16 -68 -16 -119q0 -123 108 -123q92 0 167 114t118 318l98 463h301l-237 -1118h-230l21 207h-6q-145 -227 -355 -227q-138 0 -211 82.5t-73 238.5q0 93 24 213zM610 1266q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5h-209 v25z" />
<glyph unicode="&#xfb;" horiz-adv-x="1237" d="M111 0zM262 1118h301l-137 -653q-16 -68 -16 -119q0 -123 108 -123q92 0 167 114t118 318l98 463h301l-237 -1118h-230l21 207h-6q-145 -227 -355 -227q-138 0 -211 82.5t-73 238.5q0 93 24 213zM1143 1241h-198q-63 53 -162 168q-105 -88 -232 -168h-217v25 q63 57 153 147t142 156h338q22 -54 74 -142.5t102 -160.5v-25z" />
<glyph unicode="&#xfc;" horiz-adv-x="1237" d="M111 0zM262 1118h301l-137 -653q-16 -68 -16 -119q0 -123 108 -123q92 0 167 114t118 318l98 463h301l-237 -1118h-230l21 207h-6q-145 -227 -355 -227q-138 0 -211 82.5t-73 238.5q0 93 24 213zM411 1382q0 78 42.5 118t119.5 40q133 0 133 -108q0 -73 -39 -116.5 t-121 -43.5q-135 0 -135 110zM813 1382q0 78 42 118t120 40q65 0 99 -28t34 -80q0 -73 -39.5 -116.5t-120.5 -43.5q-135 0 -135 110z" />
<glyph unicode="&#xfd;" horiz-adv-x="1063" d="M0 0zM102 1118h295l56 -518q14 -122 14 -293h6q20 51 44 119.5t65 153.5l260 538h327l-680 -1278q-177 -332 -483 -332q-90 0 -147 19v240q68 -13 116 -13q84 0 147.5 48t117.5 149l26 49zM497 1266q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5h-209v25z" />
<glyph unicode="&#xfe;" horiz-adv-x="1219" d="M813 1139q150 0 232.5 -106.5t82.5 -301.5q0 -199 -69 -381t-182 -276t-250 -94q-178 0 -271 163h-8q-12 -159 -43 -295l-72 -340h-301l435 2048h301l-66 -307q-29 -131 -80 -280h8q131 170 283 170zM682 895q-71 0 -130 -65t-95.5 -184.5t-36.5 -246.5q0 -80 33.5 -128 t105.5 -48q69 0 129 65t97.5 183.5t37.5 247.5q0 88 -37.5 132t-103.5 44z" />
<glyph unicode="&#xff;" horiz-adv-x="1063" d="M0 0zM102 1118h295l56 -518q14 -122 14 -293h6q20 51 44 119.5t65 153.5l260 538h327l-680 -1278q-177 -332 -483 -332q-90 0 -147 19v240q68 -13 116 -13q84 0 147.5 48t117.5 149l26 49zM310 1382q0 78 42.5 118t119.5 40q133 0 133 -108q0 -73 -39 -116.5t-121 -43.5 q-135 0 -135 110zM712 1382q0 78 42 118t120 40q65 0 99 -28t34 -80q0 -73 -39.5 -116.5t-120.5 -43.5q-135 0 -135 110z" />
<glyph unicode="&#x131;" horiz-adv-x="608" d="M338 0h-301l237 1118h301z" />
<glyph unicode="&#x152;" horiz-adv-x="1845" d="M1606 0h-760q-93 -20 -180 -20q-256 0 -399.5 147.5t-143.5 409.5q0 265 99 487.5t273 341.5t402 119q140 0 209 -23h809l-53 -254h-512l-68 -321h477l-55 -254h-477l-80 -377h512zM688 240q88 0 158 32l194 916q-62 39 -168 39q-121 0 -222 -91.5t-158.5 -251.5 t-57.5 -347q0 -147 66.5 -222t187.5 -75z" />
<glyph unicode="&#x153;" horiz-adv-x="1806" d="M1198 -20q-116 0 -208 38.5t-138 106.5q-63 -68 -147 -106.5t-207 -38.5q-187 0 -297.5 117t-110.5 317q0 216 69 380.5t200 254.5t309 90q209 0 313 -160q154 160 399 160q177 0 276 -81.5t99 -223.5q0 -187 -167 -288.5t-476 -101.5h-51l-2 -21v-20q0 -91 51 -143.5 t147 -52.5q87 0 158 19t172 67v-227q-93 -46 -185.5 -66t-203.5 -20zM645 893q-71 0 -127 -60.5t-90.5 -176.5t-34.5 -242q0 -91 36.5 -140t109.5 -49q109 0 179 134.5t70 336.5q0 96 -37 146.5t-106 50.5zM1362 922q-88 0 -165.5 -78.5t-102.5 -196.5h45q155 0 241 48.5 t86 131.5q0 95 -104 95z" />
<glyph unicode="&#x178;" horiz-adv-x="1155" d="M186 0zM627 870l374 592h342l-618 -903l-119 -559h-303l119 559l-236 903h312zM432 1720q0 78 42.5 118t119.5 40q133 0 133 -108q0 -73 -39 -116.5t-121 -43.5q-135 0 -135 110zM834 1720q0 78 42 118t120 40q65 0 99 -28t34 -80q0 -73 -39.5 -116.5t-120.5 -43.5 q-135 0 -135 110z" />
<glyph unicode="&#x2c6;" horiz-adv-x="1135" d="M1120 1241h-198q-63 53 -162 168q-105 -88 -232 -168h-217v25q63 57 153 147t142 156h338q22 -54 74 -142.5t102 -160.5v-25z" />
<glyph unicode="&#x2da;" horiz-adv-x="1182" d="M1034 1479q0 -107 -70 -173.5t-184 -66.5q-110 0 -179 63.5t-69 174.5q0 109 68.5 173t179.5 64q110 0 182 -65t72 -170zM877 1477q0 45 -27.5 70.5t-69.5 25.5t-69 -25.5t-27 -70.5t24 -71t72 -26q42 0 69.5 26t27.5 71z" />
<glyph unicode="&#x2dc;" horiz-adv-x="1135" d="M866 1241q-49 0 -86.5 16.5t-69.5 36t-61.5 36t-62.5 16.5q-31 0 -55.5 -28t-38.5 -79h-177q59 309 281 309q49 0 87.5 -16.5t71.5 -36t62 -35.5t60 -16q34 0 58 25.5t46 80.5h172q-66 -309 -287 -309z" />
<glyph unicode="&#x2000;" horiz-adv-x="953" />
<glyph unicode="&#x2001;" horiz-adv-x="1907" />
<glyph unicode="&#x2002;" horiz-adv-x="953" />
<glyph unicode="&#x2003;" horiz-adv-x="1907" />
<glyph unicode="&#x2004;" horiz-adv-x="635" />
<glyph unicode="&#x2005;" horiz-adv-x="476" />
<glyph unicode="&#x2006;" horiz-adv-x="317" />
<glyph unicode="&#x2007;" horiz-adv-x="317" />
<glyph unicode="&#x2008;" horiz-adv-x="238" />
<glyph unicode="&#x2009;" horiz-adv-x="381" />
<glyph unicode="&#x200a;" horiz-adv-x="105" />
<glyph unicode="&#x2010;" horiz-adv-x="659" d="M41 424l53 250h524l-53 -250h-524z" />
<glyph unicode="&#x2011;" horiz-adv-x="659" d="M41 424l53 250h524l-53 -250h-524z" />
<glyph unicode="&#x2012;" horiz-adv-x="659" d="M41 424l53 250h524l-53 -250h-524z" />
<glyph unicode="&#x2013;" horiz-adv-x="983" d="M41 436l49 230h852l-49 -230h-852z" />
<glyph unicode="&#x2014;" horiz-adv-x="1966" d="M41 436l49 230h1835l-49 -230h-1835z" />
<glyph unicode="&#x2018;" horiz-adv-x="440" d="M123 961l-8 22q103 227 262 479h225q-91 -213 -194 -501h-285z" />
<glyph unicode="&#x2019;" horiz-adv-x="440" d="M586 1462l8 -22q-103 -227 -262 -479h-226q89 206 195 501h285z" />
<glyph unicode="&#x201a;" horiz-adv-x="569" d="M377 238l8 -23q-103 -227 -262 -479h-225q88 207 194 502h285z" />
<glyph unicode="&#x201c;" horiz-adv-x="887" d="M569 961l-8 22q103 227 262 479h226q-97 -227 -195 -501h-285zM123 961l-8 22q103 227 262 479h225q-91 -213 -194 -501h-285z" />
<glyph unicode="&#x201d;" horiz-adv-x="887" d="M586 1462l8 -22q-103 -227 -262 -479h-226q89 206 195 501h285zM1032 1462l8 -22q-103 -227 -262 -479h-225q23 53 46.5 111t148.5 390h284z" />
<glyph unicode="&#x201e;" horiz-adv-x="1018" d="M377 238l8 -23q-103 -227 -262 -479h-225q88 207 194 502h285zM825 238l9 -23q-100 -221 -263 -479h-225q24 57 49 118.5t146 383.5h284z" />
<glyph unicode="&#x2022;" horiz-adv-x="739" d="M104 686q0 106 42.5 194t120 136.5t182.5 48.5q120 0 182.5 -67t62.5 -191q0 -177 -91.5 -277t-248.5 -100q-117 0 -183.5 67t-66.5 189z" />
<glyph unicode="&#x2026;" horiz-adv-x="1706" d="M25 0zM25 115q0 90 53.5 144t150.5 54q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5zM586 115q0 90 53.5 144t150.5 54q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5zM1147 115q0 90 53.5 144t150.5 54 q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5z" />
<glyph unicode="&#x202f;" horiz-adv-x="381" />
<glyph unicode="&#x2039;" horiz-adv-x="664" d="M72 569l401 463l191 -155l-279 -334l135 -350l-246 -103l-202 461v18z" />
<glyph unicode="&#x203a;" horiz-adv-x="664" d="M592 535l-402 -463l-190 155l279 334l-136 350l246 103l203 -461v-18z" />
<glyph unicode="&#x2044;" horiz-adv-x="256" d="M791 1462l-1084 -1462h-239l1087 1462h236z" />
<glyph unicode="&#x205f;" horiz-adv-x="476" />
<glyph unicode="&#x2074;" horiz-adv-x="776" d="M776 737h-119l-32 -151h-238l33 151h-373l31 174l475 557h260l-121 -563h119zM455 905l58 231l22 74q-13 -20 -43 -58t-211 -247h174z" />
<glyph unicode="&#x20ac;" d="M899 1237q-97 0 -176 -74.5t-135 -212.5h348l-39 -176h-360q-11 -34 -25 -115h299l-37 -178h-280q0 -120 44.5 -181.5t147.5 -61.5q133 0 283 63v-258q-126 -63 -330 -63q-446 0 -446 501h-152l37 178h127q9 67 22 115h-125l39 176h135q87 252 250.5 393.5t374.5 141.5 q100 0 179 -23t165 -80l-125 -223q-87 49 -131 63.5t-90 14.5z" />
<glyph unicode="&#x2122;" horiz-adv-x="1534" d="M471 741h-168v572h-197v149h564v-149h-199v-572zM1047 741l-166 529h-7l5 -111v-418h-164v721h248l159 -510l170 510h240v-721h-168v408l4 121h-6l-174 -529h-141z" />
<glyph unicode="&#xe000;" horiz-adv-x="1120" d="M0 1120h1120v-1120h-1120v1120z" />
<glyph horiz-adv-x="1217" d="M0 0z" />
<hkern u1="&#x22;" u2="&#x178;" k="-20" />
<hkern u1="&#x22;" u2="&#x153;" k="123" />
<hkern u1="&#x22;" u2="&#xfc;" k="61" />
<hkern u1="&#x22;" u2="&#xfb;" k="61" />
<hkern u1="&#x22;" u2="&#xfa;" k="61" />
<hkern u1="&#x22;" u2="&#xf9;" k="61" />
<hkern u1="&#x22;" u2="&#xf8;" k="123" />
<hkern u1="&#x22;" u2="&#xf6;" k="123" />
<hkern u1="&#x22;" u2="&#xf5;" k="123" />
<hkern u1="&#x22;" u2="&#xf4;" k="123" />
<hkern u1="&#x22;" u2="&#xf3;" k="123" />
<hkern u1="&#x22;" u2="&#xf2;" k="123" />
<hkern u1="&#x22;" u2="&#xeb;" k="123" />
<hkern u1="&#x22;" u2="&#xea;" k="123" />
<hkern u1="&#x22;" u2="&#xe9;" k="123" />
<hkern u1="&#x22;" u2="&#xe8;" k="123" />
<hkern u1="&#x22;" u2="&#xe7;" k="123" />
<hkern u1="&#x22;" u2="&#xe6;" k="82" />
<hkern u1="&#x22;" u2="&#xe5;" k="82" />
<hkern u1="&#x22;" u2="&#xe4;" k="82" />
<hkern u1="&#x22;" u2="&#xe3;" k="82" />
<hkern u1="&#x22;" u2="&#xe2;" k="82" />
<hkern u1="&#x22;" u2="&#xe1;" k="82" />
<hkern u1="&#x22;" u2="&#xe0;" k="123" />
<hkern u1="&#x22;" u2="&#xdd;" k="-20" />
<hkern u1="&#x22;" u2="&#xc5;" k="143" />
<hkern u1="&#x22;" u2="&#xc4;" k="143" />
<hkern u1="&#x22;" u2="&#xc3;" k="143" />
<hkern u1="&#x22;" u2="&#xc2;" k="143" />
<hkern u1="&#x22;" u2="&#xc1;" k="143" />
<hkern u1="&#x22;" u2="&#xc0;" k="143" />
<hkern u1="&#x22;" u2="u" k="61" />
<hkern u1="&#x22;" u2="s" k="61" />
<hkern u1="&#x22;" u2="r" k="61" />
<hkern u1="&#x22;" u2="q" k="123" />
<hkern u1="&#x22;" u2="p" k="61" />
<hkern u1="&#x22;" u2="o" k="123" />
<hkern u1="&#x22;" u2="n" k="61" />
<hkern u1="&#x22;" u2="m" k="61" />
<hkern u1="&#x22;" u2="g" k="61" />
<hkern u1="&#x22;" u2="e" k="123" />
<hkern u1="&#x22;" u2="d" k="123" />
<hkern u1="&#x22;" u2="c" k="123" />
<hkern u1="&#x22;" u2="a" k="82" />
<hkern u1="&#x22;" u2="Y" k="-20" />
<hkern u1="&#x22;" u2="W" k="-41" />
<hkern u1="&#x22;" u2="V" k="-41" />
<hkern u1="&#x22;" u2="T" k="-41" />
<hkern u1="&#x22;" u2="A" k="143" />
<hkern u1="&#x27;" u2="&#x178;" k="-20" />
<hkern u1="&#x27;" u2="&#x153;" k="123" />
<hkern u1="&#x27;" u2="&#xfc;" k="61" />
<hkern u1="&#x27;" u2="&#xfb;" k="61" />
<hkern u1="&#x27;" u2="&#xfa;" k="61" />
<hkern u1="&#x27;" u2="&#xf9;" k="61" />
<hkern u1="&#x27;" u2="&#xf8;" k="123" />
<hkern u1="&#x27;" u2="&#xf6;" k="123" />
<hkern u1="&#x27;" u2="&#xf5;" k="123" />
<hkern u1="&#x27;" u2="&#xf4;" k="123" />
<hkern u1="&#x27;" u2="&#xf3;" k="123" />
<hkern u1="&#x27;" u2="&#xf2;" k="123" />
<hkern u1="&#x27;" u2="&#xeb;" k="123" />
<hkern u1="&#x27;" u2="&#xea;" k="123" />
<hkern u1="&#x27;" u2="&#xe9;" k="123" />
<hkern u1="&#x27;" u2="&#xe8;" k="123" />
<hkern u1="&#x27;" u2="&#xe7;" k="123" />
<hkern u1="&#x27;" u2="&#xe6;" k="82" />
<hkern u1="&#x27;" u2="&#xe5;" k="82" />
<hkern u1="&#x27;" u2="&#xe4;" k="82" />
<hkern u1="&#x27;" u2="&#xe3;" k="82" />
<hkern u1="&#x27;" u2="&#xe2;" k="82" />
<hkern u1="&#x27;" u2="&#xe1;" k="82" />
<hkern u1="&#x27;" u2="&#xe0;" k="123" />
<hkern u1="&#x27;" u2="&#xdd;" k="-20" />
<hkern u1="&#x27;" u2="&#xc5;" k="143" />
<hkern u1="&#x27;" u2="&#xc4;" k="143" />
<hkern u1="&#x27;" u2="&#xc3;" k="143" />
<hkern u1="&#x27;" u2="&#xc2;" k="143" />
<hkern u1="&#x27;" u2="&#xc1;" k="143" />
<hkern u1="&#x27;" u2="&#xc0;" k="143" />
<hkern u1="&#x27;" u2="u" k="61" />
<hkern u1="&#x27;" u2="s" k="61" />
<hkern u1="&#x27;" u2="r" k="61" />
<hkern u1="&#x27;" u2="q" k="123" />
<hkern u1="&#x27;" u2="p" k="61" />
<hkern u1="&#x27;" u2="o" k="123" />
<hkern u1="&#x27;" u2="n" k="61" />
<hkern u1="&#x27;" u2="m" k="61" />
<hkern u1="&#x27;" u2="g" k="61" />
<hkern u1="&#x27;" u2="e" k="123" />
<hkern u1="&#x27;" u2="d" k="123" />
<hkern u1="&#x27;" u2="c" k="123" />
<hkern u1="&#x27;" u2="a" k="82" />
<hkern u1="&#x27;" u2="Y" k="-20" />
<hkern u1="&#x27;" u2="W" k="-41" />
<hkern u1="&#x27;" u2="V" k="-41" />
<hkern u1="&#x27;" u2="T" k="-41" />
<hkern u1="&#x27;" u2="A" k="143" />
<hkern u1="&#x28;" u2="J" k="-184" />
<hkern u1="&#x2c;" u2="&#x178;" k="123" />
<hkern u1="&#x2c;" u2="&#x152;" k="102" />
<hkern u1="&#x2c;" u2="&#xdd;" k="123" />
<hkern u1="&#x2c;" u2="&#xdc;" k="41" />
<hkern u1="&#x2c;" u2="&#xdb;" k="41" />
<hkern u1="&#x2c;" u2="&#xda;" k="41" />
<hkern u1="&#x2c;" u2="&#xd9;" k="41" />
<hkern u1="&#x2c;" u2="&#xd8;" k="102" />
<hkern u1="&#x2c;" u2="&#xd6;" k="102" />
<hkern u1="&#x2c;" u2="&#xd5;" k="102" />
<hkern u1="&#x2c;" u2="&#xd4;" k="102" />
<hkern u1="&#x2c;" u2="&#xd3;" k="102" />
<hkern u1="&#x2c;" u2="&#xd2;" k="102" />
<hkern u1="&#x2c;" u2="&#xc7;" k="102" />
<hkern u1="&#x2c;" u2="Y" k="123" />
<hkern u1="&#x2c;" u2="W" k="123" />
<hkern u1="&#x2c;" u2="V" k="123" />
<hkern u1="&#x2c;" u2="U" k="41" />
<hkern u1="&#x2c;" u2="T" k="143" />
<hkern u1="&#x2c;" u2="Q" k="102" />
<hkern u1="&#x2c;" u2="O" k="102" />
<hkern u1="&#x2c;" u2="G" k="102" />
<hkern u1="&#x2c;" u2="C" k="102" />
<hkern u1="&#x2d;" u2="T" k="82" />
<hkern u1="&#x2e;" u2="&#x178;" k="123" />
<hkern u1="&#x2e;" u2="&#x152;" k="102" />
<hkern u1="&#x2e;" u2="&#xdd;" k="123" />
<hkern u1="&#x2e;" u2="&#xdc;" k="41" />
<hkern u1="&#x2e;" u2="&#xdb;" k="41" />
<hkern u1="&#x2e;" u2="&#xda;" k="41" />
<hkern u1="&#x2e;" u2="&#xd9;" k="41" />
<hkern u1="&#x2e;" u2="&#xd8;" k="102" />
<hkern u1="&#x2e;" u2="&#xd6;" k="102" />
<hkern u1="&#x2e;" u2="&#xd5;" k="102" />
<hkern u1="&#x2e;" u2="&#xd4;" k="102" />
<hkern u1="&#x2e;" u2="&#xd3;" k="102" />
<hkern u1="&#x2e;" u2="&#xd2;" k="102" />
<hkern u1="&#x2e;" u2="&#xc7;" k="102" />
<hkern u1="&#x2e;" u2="Y" k="123" />
<hkern u1="&#x2e;" u2="W" k="123" />
<hkern u1="&#x2e;" u2="V" k="123" />
<hkern u1="&#x2e;" u2="U" k="41" />
<hkern u1="&#x2e;" u2="T" k="143" />
<hkern u1="&#x2e;" u2="Q" k="102" />
<hkern u1="&#x2e;" u2="O" k="102" />
<hkern u1="&#x2e;" u2="G" k="102" />
<hkern u1="&#x2e;" u2="C" k="102" />
<hkern u1="A" u2="&#x201d;" k="143" />
<hkern u1="A" u2="&#x2019;" k="143" />
<hkern u1="A" u2="&#x178;" k="123" />
<hkern u1="A" u2="&#x152;" k="41" />
<hkern u1="A" u2="&#xdd;" k="123" />
<hkern u1="A" u2="&#xd8;" k="41" />
<hkern u1="A" u2="&#xd6;" k="41" />
<hkern u1="A" u2="&#xd5;" k="41" />
<hkern u1="A" u2="&#xd4;" k="41" />
<hkern u1="A" u2="&#xd3;" k="41" />
<hkern u1="A" u2="&#xd2;" k="41" />
<hkern u1="A" u2="&#xc7;" k="41" />
<hkern u1="A" u2="Y" k="123" />
<hkern u1="A" u2="W" k="82" />
<hkern u1="A" u2="V" k="82" />
<hkern u1="A" u2="T" k="143" />
<hkern u1="A" u2="Q" k="41" />
<hkern u1="A" u2="O" k="41" />
<hkern u1="A" u2="J" k="-266" />
<hkern u1="A" u2="G" k="41" />
<hkern u1="A" u2="C" k="41" />
<hkern u1="A" u2="&#x27;" k="143" />
<hkern u1="A" u2="&#x22;" k="143" />
<hkern u1="B" u2="&#x201e;" k="82" />
<hkern u1="B" u2="&#x201a;" k="82" />
<hkern u1="B" u2="&#x178;" k="20" />
<hkern u1="B" u2="&#xdd;" k="20" />
<hkern u1="B" u2="&#xc5;" k="41" />
<hkern u1="B" u2="&#xc4;" k="41" />
<hkern u1="B" u2="&#xc3;" k="41" />
<hkern u1="B" u2="&#xc2;" k="41" />
<hkern u1="B" u2="&#xc1;" k="41" />
<hkern u1="B" u2="&#xc0;" k="41" />
<hkern u1="B" u2="Z" k="20" />
<hkern u1="B" u2="Y" k="20" />
<hkern u1="B" u2="X" k="41" />
<hkern u1="B" u2="W" k="20" />
<hkern u1="B" u2="V" k="20" />
<hkern u1="B" u2="T" k="61" />
<hkern u1="B" u2="A" k="41" />
<hkern u1="B" u2="&#x2e;" k="82" />
<hkern u1="B" u2="&#x2c;" k="82" />
<hkern u1="C" u2="&#x152;" k="41" />
<hkern u1="C" u2="&#xd8;" k="41" />
<hkern u1="C" u2="&#xd6;" k="41" />
<hkern u1="C" u2="&#xd5;" k="41" />
<hkern u1="C" u2="&#xd4;" k="41" />
<hkern u1="C" u2="&#xd3;" k="41" />
<hkern u1="C" u2="&#xd2;" k="41" />
<hkern u1="C" u2="&#xc7;" k="41" />
<hkern u1="C" u2="Q" k="41" />
<hkern u1="C" u2="O" k="41" />
<hkern u1="C" u2="G" k="41" />
<hkern u1="C" u2="C" k="41" />
<hkern u1="D" u2="&#x201e;" k="82" />
<hkern u1="D" u2="&#x201a;" k="82" />
<hkern u1="D" u2="&#x178;" k="20" />
<hkern u1="D" u2="&#xdd;" k="20" />
<hkern u1="D" u2="&#xc5;" k="41" />
<hkern u1="D" u2="&#xc4;" k="41" />
<hkern u1="D" u2="&#xc3;" k="41" />
<hkern u1="D" u2="&#xc2;" k="41" />
<hkern u1="D" u2="&#xc1;" k="41" />
<hkern u1="D" u2="&#xc0;" k="41" />
<hkern u1="D" u2="Z" k="20" />
<hkern u1="D" u2="Y" k="20" />
<hkern u1="D" u2="X" k="41" />
<hkern u1="D" u2="W" k="20" />
<hkern u1="D" u2="V" k="20" />
<hkern u1="D" u2="T" k="61" />
<hkern u1="D" u2="A" k="41" />
<hkern u1="D" u2="&#x2e;" k="82" />
<hkern u1="D" u2="&#x2c;" k="82" />
<hkern u1="E" u2="J" k="-123" />
<hkern u1="F" u2="&#x201e;" k="123" />
<hkern u1="F" u2="&#x201a;" k="123" />
<hkern u1="F" u2="&#xc5;" k="41" />
<hkern u1="F" u2="&#xc4;" k="41" />
<hkern u1="F" u2="&#xc3;" k="41" />
<hkern u1="F" u2="&#xc2;" k="41" />
<hkern u1="F" u2="&#xc1;" k="41" />
<hkern u1="F" u2="&#xc0;" k="41" />
<hkern u1="F" u2="A" k="41" />
<hkern u1="F" u2="&#x3f;" k="-41" />
<hkern u1="F" u2="&#x2e;" k="123" />
<hkern u1="F" u2="&#x2c;" k="123" />
<hkern u1="K" u2="&#x152;" k="41" />
<hkern u1="K" u2="&#xd8;" k="41" />
<hkern u1="K" u2="&#xd6;" k="41" />
<hkern u1="K" u2="&#xd5;" k="41" />
<hkern u1="K" u2="&#xd4;" k="41" />
<hkern u1="K" u2="&#xd3;" k="41" />
<hkern u1="K" u2="&#xd2;" k="41" />
<hkern u1="K" u2="&#xc7;" k="41" />
<hkern u1="K" u2="Q" k="41" />
<hkern u1="K" u2="O" k="41" />
<hkern u1="K" u2="G" k="41" />
<hkern u1="K" u2="C" k="41" />
<hkern u1="L" u2="&#x201d;" k="164" />
<hkern u1="L" u2="&#x2019;" k="164" />
<hkern u1="L" u2="&#x178;" k="61" />
<hkern u1="L" u2="&#x152;" k="41" />
<hkern u1="L" u2="&#xdd;" k="61" />
<hkern u1="L" u2="&#xdc;" k="20" />
<hkern u1="L" u2="&#xdb;" k="20" />
<hkern u1="L" u2="&#xda;" k="20" />
<hkern u1="L" u2="&#xd9;" k="20" />
<hkern u1="L" u2="&#xd8;" k="41" />
<hkern u1="L" u2="&#xd6;" k="41" />
<hkern u1="L" u2="&#xd5;" k="41" />
<hkern u1="L" u2="&#xd4;" k="41" />
<hkern u1="L" u2="&#xd3;" k="41" />
<hkern u1="L" u2="&#xd2;" k="41" />
<hkern u1="L" u2="&#xc7;" k="41" />
<hkern u1="L" u2="Y" k="61" />
<hkern u1="L" u2="W" k="41" />
<hkern u1="L" u2="V" k="41" />
<hkern u1="L" u2="U" k="20" />
<hkern u1="L" u2="T" k="41" />
<hkern u1="L" u2="Q" k="41" />
<hkern u1="L" u2="O" k="41" />
<hkern u1="L" u2="G" k="41" />
<hkern u1="L" u2="C" k="41" />
<hkern u1="L" u2="&#x27;" k="164" />
<hkern u1="L" u2="&#x22;" k="164" />
<hkern u1="O" u2="&#x201e;" k="82" />
<hkern u1="O" u2="&#x201a;" k="82" />
<hkern u1="O" u2="&#x178;" k="20" />
<hkern u1="O" u2="&#xdd;" k="20" />
<hkern u1="O" u2="&#xc5;" k="41" />
<hkern u1="O" u2="&#xc4;" k="41" />
<hkern u1="O" u2="&#xc3;" k="41" />
<hkern u1="O" u2="&#xc2;" k="41" />
<hkern u1="O" u2="&#xc1;" k="41" />
<hkern u1="O" u2="&#xc0;" k="41" />
<hkern u1="O" u2="Z" k="20" />
<hkern u1="O" u2="Y" k="20" />
<hkern u1="O" u2="X" k="41" />
<hkern u1="O" u2="W" k="20" />
<hkern u1="O" u2="V" k="20" />
<hkern u1="O" u2="T" k="61" />
<hkern u1="O" u2="A" k="41" />
<hkern u1="O" u2="&#x2e;" k="82" />
<hkern u1="O" u2="&#x2c;" k="82" />
<hkern u1="P" u2="&#x201e;" k="266" />
<hkern u1="P" u2="&#x201a;" k="266" />
<hkern u1="P" u2="&#xc5;" k="102" />
<hkern u1="P" u2="&#xc4;" k="102" />
<hkern u1="P" u2="&#xc3;" k="102" />
<hkern u1="P" u2="&#xc2;" k="102" />
<hkern u1="P" u2="&#xc1;" k="102" />
<hkern u1="P" u2="&#xc0;" k="102" />
<hkern u1="P" u2="Z" k="20" />
<hkern u1="P" u2="X" k="41" />
<hkern u1="P" u2="A" k="102" />
<hkern u1="P" u2="&#x2e;" k="266" />
<hkern u1="P" u2="&#x2c;" k="266" />
<hkern u1="Q" u2="&#x201e;" k="82" />
<hkern u1="Q" u2="&#x201a;" k="82" />
<hkern u1="Q" u2="&#x178;" k="20" />
<hkern u1="Q" u2="&#xdd;" k="20" />
<hkern u1="Q" u2="&#xc5;" k="41" />
<hkern u1="Q" u2="&#xc4;" k="41" />
<hkern u1="Q" u2="&#xc3;" k="41" />
<hkern u1="Q" u2="&#xc2;" k="41" />
<hkern u1="Q" u2="&#xc1;" k="41" />
<hkern u1="Q" u2="&#xc0;" k="41" />
<hkern u1="Q" u2="Z" k="20" />
<hkern u1="Q" u2="Y" k="20" />
<hkern u1="Q" u2="X" k="41" />
<hkern u1="Q" u2="W" k="20" />
<hkern u1="Q" u2="V" k="20" />
<hkern u1="Q" u2="T" k="61" />
<hkern u1="Q" u2="A" k="41" />
<hkern u1="Q" u2="&#x2e;" k="82" />
<hkern u1="Q" u2="&#x2c;" k="82" />
<hkern u1="T" u2="&#x201e;" k="123" />
<hkern u1="T" u2="&#x201a;" k="123" />
<hkern u1="T" u2="&#x2014;" k="82" />
<hkern u1="T" u2="&#x2013;" k="82" />
<hkern u1="T" u2="&#x153;" k="143" />
<hkern u1="T" u2="&#x152;" k="41" />
<hkern u1="T" u2="&#xfd;" k="41" />
<hkern u1="T" u2="&#xfc;" k="102" />
<hkern u1="T" u2="&#xfb;" k="102" />
<hkern u1="T" u2="&#xfa;" k="102" />
<hkern u1="T" u2="&#xf9;" k="102" />
<hkern u1="T" u2="&#xf8;" k="143" />
<hkern u1="T" u2="&#xf6;" k="143" />
<hkern u1="T" u2="&#xf5;" k="143" />
<hkern u1="T" u2="&#xf4;" k="143" />
<hkern u1="T" u2="&#xf3;" k="143" />
<hkern u1="T" u2="&#xf2;" k="143" />
<hkern u1="T" u2="&#xeb;" k="143" />
<hkern u1="T" u2="&#xea;" k="143" />
<hkern u1="T" u2="&#xe9;" k="143" />
<hkern u1="T" u2="&#xe8;" k="143" />
<hkern u1="T" u2="&#xe7;" k="143" />
<hkern u1="T" u2="&#xe6;" k="164" />
<hkern u1="T" u2="&#xe5;" k="164" />
<hkern u1="T" u2="&#xe4;" k="164" />
<hkern u1="T" u2="&#xe3;" k="164" />
<hkern u1="T" u2="&#xe2;" k="164" />
<hkern u1="T" u2="&#xe1;" k="164" />
<hkern u1="T" u2="&#xe0;" k="143" />
<hkern u1="T" u2="&#xd8;" k="41" />
<hkern u1="T" u2="&#xd6;" k="41" />
<hkern u1="T" u2="&#xd5;" k="41" />
<hkern u1="T" u2="&#xd4;" k="41" />
<hkern u1="T" u2="&#xd3;" k="41" />
<hkern u1="T" u2="&#xd2;" k="41" />
<hkern u1="T" u2="&#xc7;" k="41" />
<hkern u1="T" u2="&#xc5;" k="143" />
<hkern u1="T" u2="&#xc4;" k="143" />
<hkern u1="T" u2="&#xc3;" k="143" />
<hkern u1="T" u2="&#xc2;" k="143" />
<hkern u1="T" u2="&#xc1;" k="143" />
<hkern u1="T" u2="&#xc0;" k="143" />
<hkern u1="T" u2="z" k="82" />
<hkern u1="T" u2="y" k="41" />
<hkern u1="T" u2="x" k="41" />
<hkern u1="T" u2="w" k="41" />
<hkern u1="T" u2="v" k="41" />
<hkern u1="T" u2="u" k="102" />
<hkern u1="T" u2="s" k="123" />
<hkern u1="T" u2="r" k="102" />
<hkern u1="T" u2="q" k="143" />
<hkern u1="T" u2="p" k="102" />
<hkern u1="T" u2="o" k="143" />
<hkern u1="T" u2="n" k="102" />
<hkern u1="T" u2="m" k="102" />
<hkern u1="T" u2="g" k="143" />
<hkern u1="T" u2="e" k="143" />
<hkern u1="T" u2="d" k="143" />
<hkern u1="T" u2="c" k="143" />
<hkern u1="T" u2="a" k="164" />
<hkern u1="T" u2="T" k="-41" />
<hkern u1="T" u2="Q" k="41" />
<hkern u1="T" u2="O" k="41" />
<hkern u1="T" u2="G" k="41" />
<hkern u1="T" u2="C" k="41" />
<hkern u1="T" u2="A" k="143" />
<hkern u1="T" u2="&#x3f;" k="-41" />
<hkern u1="T" u2="&#x2e;" k="123" />
<hkern u1="T" u2="&#x2d;" k="82" />
<hkern u1="T" u2="&#x2c;" k="123" />
<hkern u1="U" u2="&#x201e;" k="41" />
<hkern u1="U" u2="&#x201a;" k="41" />
<hkern u1="U" u2="&#xc5;" k="20" />
<hkern u1="U" u2="&#xc4;" k="20" />
<hkern u1="U" u2="&#xc3;" k="20" />
<hkern u1="U" u2="&#xc2;" k="20" />
<hkern u1="U" u2="&#xc1;" k="20" />
<hkern u1="U" u2="&#xc0;" k="20" />
<hkern u1="U" u2="A" k="20" />
<hkern u1="U" u2="&#x2e;" k="41" />
<hkern u1="U" u2="&#x2c;" k="41" />
<hkern u1="V" u2="&#x201e;" k="102" />
<hkern u1="V" u2="&#x201a;" k="102" />
<hkern u1="V" u2="&#x153;" k="41" />
<hkern u1="V" u2="&#x152;" k="20" />
<hkern u1="V" u2="&#xfc;" k="20" />
<hkern u1="V" u2="&#xfb;" k="20" />
<hkern u1="V" u2="&#xfa;" k="20" />
<hkern u1="V" u2="&#xf9;" k="20" />
<hkern u1="V" u2="&#xf8;" k="41" />
<hkern u1="V" u2="&#xf6;" k="41" />
<hkern u1="V" u2="&#xf5;" k="41" />
<hkern u1="V" u2="&#xf4;" k="41" />
<hkern u1="V" u2="&#xf3;" k="41" />
<hkern u1="V" u2="&#xf2;" k="41" />
<hkern u1="V" u2="&#xeb;" k="41" />
<hkern u1="V" u2="&#xea;" k="41" />
<hkern u1="V" u2="&#xe9;" k="41" />
<hkern u1="V" u2="&#xe8;" k="41" />
<hkern u1="V" u2="&#xe7;" k="41" />
<hkern u1="V" u2="&#xe6;" k="41" />
<hkern u1="V" u2="&#xe5;" k="41" />
<hkern u1="V" u2="&#xe4;" k="41" />
<hkern u1="V" u2="&#xe3;" k="41" />
<hkern u1="V" u2="&#xe2;" k="41" />
<hkern u1="V" u2="&#xe1;" k="41" />
<hkern u1="V" u2="&#xe0;" k="41" />
<hkern u1="V" u2="&#xd8;" k="20" />
<hkern u1="V" u2="&#xd6;" k="20" />
<hkern u1="V" u2="&#xd5;" k="20" />
<hkern u1="V" u2="&#xd4;" k="20" />
<hkern u1="V" u2="&#xd3;" k="20" />
<hkern u1="V" u2="&#xd2;" k="20" />
<hkern u1="V" u2="&#xc7;" k="20" />
<hkern u1="V" u2="&#xc5;" k="82" />
<hkern u1="V" u2="&#xc4;" k="82" />
<hkern u1="V" u2="&#xc3;" k="82" />
<hkern u1="V" u2="&#xc2;" k="82" />
<hkern u1="V" u2="&#xc1;" k="82" />
<hkern u1="V" u2="&#xc0;" k="82" />
<hkern u1="V" u2="u" k="20" />
<hkern u1="V" u2="s" k="20" />
<hkern u1="V" u2="r" k="20" />
<hkern u1="V" u2="q" k="41" />
<hkern u1="V" u2="p" k="20" />
<hkern u1="V" u2="o" k="41" />
<hkern u1="V" u2="n" k="20" />
<hkern u1="V" u2="m" k="20" />
<hkern u1="V" u2="g" k="20" />
<hkern u1="V" u2="e" k="41" />
<hkern u1="V" u2="d" k="41" />
<hkern u1="V" u2="c" k="41" />
<hkern u1="V" u2="a" k="41" />
<hkern u1="V" u2="Q" k="20" />
<hkern u1="V" u2="O" k="20" />
<hkern u1="V" u2="G" k="20" />
<hkern u1="V" u2="C" k="20" />
<hkern u1="V" u2="A" k="82" />
<hkern u1="V" u2="&#x3f;" k="-41" />
<hkern u1="V" u2="&#x2e;" k="102" />
<hkern u1="V" u2="&#x2c;" k="102" />
<hkern u1="W" u2="&#x201e;" k="102" />
<hkern u1="W" u2="&#x201a;" k="102" />
<hkern u1="W" u2="&#x153;" k="41" />
<hkern u1="W" u2="&#x152;" k="20" />
<hkern u1="W" u2="&#xfc;" k="20" />
<hkern u1="W" u2="&#xfb;" k="20" />
<hkern u1="W" u2="&#xfa;" k="20" />
<hkern u1="W" u2="&#xf9;" k="20" />
<hkern u1="W" u2="&#xf8;" k="41" />
<hkern u1="W" u2="&#xf6;" k="41" />
<hkern u1="W" u2="&#xf5;" k="41" />
<hkern u1="W" u2="&#xf4;" k="41" />
<hkern u1="W" u2="&#xf3;" k="41" />
<hkern u1="W" u2="&#xf2;" k="41" />
<hkern u1="W" u2="&#xeb;" k="41" />
<hkern u1="W" u2="&#xea;" k="41" />
<hkern u1="W" u2="&#xe9;" k="41" />
<hkern u1="W" u2="&#xe8;" k="41" />
<hkern u1="W" u2="&#xe7;" k="41" />
<hkern u1="W" u2="&#xe6;" k="41" />
<hkern u1="W" u2="&#xe5;" k="41" />
<hkern u1="W" u2="&#xe4;" k="41" />
<hkern u1="W" u2="&#xe3;" k="41" />
<hkern u1="W" u2="&#xe2;" k="41" />
<hkern u1="W" u2="&#xe1;" k="41" />
<hkern u1="W" u2="&#xe0;" k="41" />
<hkern u1="W" u2="&#xd8;" k="20" />
<hkern u1="W" u2="&#xd6;" k="20" />
<hkern u1="W" u2="&#xd5;" k="20" />
<hkern u1="W" u2="&#xd4;" k="20" />
<hkern u1="W" u2="&#xd3;" k="20" />
<hkern u1="W" u2="&#xd2;" k="20" />
<hkern u1="W" u2="&#xc7;" k="20" />
<hkern u1="W" u2="&#xc5;" k="82" />
<hkern u1="W" u2="&#xc4;" k="82" />
<hkern u1="W" u2="&#xc3;" k="82" />
<hkern u1="W" u2="&#xc2;" k="82" />
<hkern u1="W" u2="&#xc1;" k="82" />
<hkern u1="W" u2="&#xc0;" k="82" />
<hkern u1="W" u2="u" k="20" />
<hkern u1="W" u2="s" k="20" />
<hkern u1="W" u2="r" k="20" />
<hkern u1="W" u2="q" k="41" />
<hkern u1="W" u2="p" k="20" />
<hkern u1="W" u2="o" k="41" />
<hkern u1="W" u2="n" k="20" />
<hkern u1="W" u2="m" k="20" />
<hkern u1="W" u2="g" k="20" />
<hkern u1="W" u2="e" k="41" />
<hkern u1="W" u2="d" k="41" />
<hkern u1="W" u2="c" k="41" />
<hkern u1="W" u2="a" k="41" />
<hkern u1="W" u2="Q" k="20" />
<hkern u1="W" u2="O" k="20" />
<hkern u1="W" u2="G" k="20" />
<hkern u1="W" u2="C" k="20" />
<hkern u1="W" u2="A" k="82" />
<hkern u1="W" u2="&#x3f;" k="-41" />
<hkern u1="W" u2="&#x2e;" k="102" />
<hkern u1="W" u2="&#x2c;" k="102" />
<hkern u1="X" u2="&#x152;" k="41" />
<hkern u1="X" u2="&#xd8;" k="41" />
<hkern u1="X" u2="&#xd6;" k="41" />
<hkern u1="X" u2="&#xd5;" k="41" />
<hkern u1="X" u2="&#xd4;" k="41" />
<hkern u1="X" u2="&#xd3;" k="41" />
<hkern u1="X" u2="&#xd2;" k="41" />
<hkern u1="X" u2="&#xc7;" k="41" />
<hkern u1="X" u2="Q" k="41" />
<hkern u1="X" u2="O" k="41" />
<hkern u1="X" u2="G" k="41" />
<hkern u1="X" u2="C" k="41" />
<hkern u1="Y" u2="&#x201e;" k="123" />
<hkern u1="Y" u2="&#x201a;" k="123" />
<hkern u1="Y" u2="&#x153;" k="102" />
<hkern u1="Y" u2="&#x152;" k="41" />
<hkern u1="Y" u2="&#xfc;" k="61" />
<hkern u1="Y" u2="&#xfb;" k="61" />
<hkern u1="Y" u2="&#xfa;" k="61" />
<hkern u1="Y" u2="&#xf9;" k="61" />
<hkern u1="Y" u2="&#xf8;" k="102" />
<hkern u1="Y" u2="&#xf6;" k="102" />
<hkern u1="Y" u2="&#xf5;" k="102" />
<hkern u1="Y" u2="&#xf4;" k="102" />
<hkern u1="Y" u2="&#xf3;" k="102" />
<hkern u1="Y" u2="&#xf2;" k="102" />
<hkern u1="Y" u2="&#xeb;" k="102" />
<hkern u1="Y" u2="&#xea;" k="102" />
<hkern u1="Y" u2="&#xe9;" k="102" />
<hkern u1="Y" u2="&#xe8;" k="102" />
<hkern u1="Y" u2="&#xe7;" k="102" />
<hkern u1="Y" u2="&#xe6;" k="102" />
<hkern u1="Y" u2="&#xe5;" k="102" />
<hkern u1="Y" u2="&#xe4;" k="102" />
<hkern u1="Y" u2="&#xe3;" k="102" />
<hkern u1="Y" u2="&#xe2;" k="102" />
<hkern u1="Y" u2="&#xe1;" k="102" />
<hkern u1="Y" u2="&#xe0;" k="102" />
<hkern u1="Y" u2="&#xd8;" k="41" />
<hkern u1="Y" u2="&#xd6;" k="41" />
<hkern u1="Y" u2="&#xd5;" k="41" />
<hkern u1="Y" u2="&#xd4;" k="41" />
<hkern u1="Y" u2="&#xd3;" k="41" />
<hkern u1="Y" u2="&#xd2;" k="41" />
<hkern u1="Y" u2="&#xc7;" k="41" />
<hkern u1="Y" u2="&#xc5;" k="123" />
<hkern u1="Y" u2="&#xc4;" k="123" />
<hkern u1="Y" u2="&#xc3;" k="123" />
<hkern u1="Y" u2="&#xc2;" k="123" />
<hkern u1="Y" u2="&#xc1;" k="123" />
<hkern u1="Y" u2="&#xc0;" k="123" />
<hkern u1="Y" u2="z" k="41" />
<hkern u1="Y" u2="u" k="61" />
<hkern u1="Y" u2="s" k="82" />
<hkern u1="Y" u2="r" k="61" />
<hkern u1="Y" u2="q" k="102" />
<hkern u1="Y" u2="p" k="61" />
<hkern u1="Y" u2="o" k="102" />
<hkern u1="Y" u2="n" k="61" />
<hkern u1="Y" u2="m" k="61" />
<hkern u1="Y" u2="g" k="41" />
<hkern u1="Y" u2="e" k="102" />
<hkern u1="Y" u2="d" k="102" />
<hkern u1="Y" u2="c" k="102" />
<hkern u1="Y" u2="a" k="102" />
<hkern u1="Y" u2="Q" k="41" />
<hkern u1="Y" u2="O" k="41" />
<hkern u1="Y" u2="G" k="41" />
<hkern u1="Y" u2="C" k="41" />
<hkern u1="Y" u2="A" k="123" />
<hkern u1="Y" u2="&#x3f;" k="-41" />
<hkern u1="Y" u2="&#x2e;" k="123" />
<hkern u1="Y" u2="&#x2c;" k="123" />
<hkern u1="Z" u2="&#x152;" k="20" />
<hkern u1="Z" u2="&#xd8;" k="20" />
<hkern u1="Z" u2="&#xd6;" k="20" />
<hkern u1="Z" u2="&#xd5;" k="20" />
<hkern u1="Z" u2="&#xd4;" k="20" />
<hkern u1="Z" u2="&#xd3;" k="20" />
<hkern u1="Z" u2="&#xd2;" k="20" />
<hkern u1="Z" u2="&#xc7;" k="20" />
<hkern u1="Z" u2="Q" k="20" />
<hkern u1="Z" u2="O" k="20" />
<hkern u1="Z" u2="G" k="20" />
<hkern u1="Z" u2="C" k="20" />
<hkern u1="[" u2="J" k="-184" />
<hkern u1="a" u2="&#x201d;" k="20" />
<hkern u1="a" u2="&#x2019;" k="20" />
<hkern u1="a" u2="&#x27;" k="20" />
<hkern u1="a" u2="&#x22;" k="20" />
<hkern u1="b" u2="&#x201d;" k="20" />
<hkern u1="b" u2="&#x2019;" k="20" />
<hkern u1="b" u2="&#xfd;" k="41" />
<hkern u1="b" u2="z" k="20" />
<hkern u1="b" u2="y" k="41" />
<hkern u1="b" u2="x" k="41" />
<hkern u1="b" u2="w" k="41" />
<hkern u1="b" u2="v" k="41" />
<hkern u1="b" u2="&#x27;" k="20" />
<hkern u1="b" u2="&#x22;" k="20" />
<hkern u1="c" u2="&#x201d;" k="-41" />
<hkern u1="c" u2="&#x2019;" k="-41" />
<hkern u1="c" u2="&#x27;" k="-41" />
<hkern u1="c" u2="&#x22;" k="-41" />
<hkern u1="e" u2="&#x201d;" k="20" />
<hkern u1="e" u2="&#x2019;" k="20" />
<hkern u1="e" u2="&#xfd;" k="41" />
<hkern u1="e" u2="z" k="20" />
<hkern u1="e" u2="y" k="41" />
<hkern u1="e" u2="x" k="41" />
<hkern u1="e" u2="w" k="41" />
<hkern u1="e" u2="v" k="41" />
<hkern u1="e" u2="&#x27;" k="20" />
<hkern u1="e" u2="&#x22;" k="20" />
<hkern u1="f" u2="&#x201d;" k="-123" />
<hkern u1="f" u2="&#x2019;" k="-123" />
<hkern u1="f" u2="&#x27;" k="-123" />
<hkern u1="f" u2="&#x22;" k="-123" />
<hkern u1="h" u2="&#x201d;" k="20" />
<hkern u1="h" u2="&#x2019;" k="20" />
<hkern u1="h" u2="&#x27;" k="20" />
<hkern u1="h" u2="&#x22;" k="20" />
<hkern u1="k" u2="&#x153;" k="41" />
<hkern u1="k" u2="&#xf8;" k="41" />
<hkern u1="k" u2="&#xf6;" k="41" />
<hkern u1="k" u2="&#xf5;" k="41" />
<hkern u1="k" u2="&#xf4;" k="41" />
<hkern u1="k" u2="&#xf3;" k="41" />
<hkern u1="k" u2="&#xf2;" k="41" />
<hkern u1="k" u2="&#xeb;" k="41" />
<hkern u1="k" u2="&#xea;" k="41" />
<hkern u1="k" u2="&#xe9;" k="41" />
<hkern u1="k" u2="&#xe8;" k="41" />
<hkern u1="k" u2="&#xe7;" k="41" />
<hkern u1="k" u2="&#xe0;" k="41" />
<hkern u1="k" u2="q" k="41" />
<hkern u1="k" u2="o" k="41" />
<hkern u1="k" u2="e" k="41" />
<hkern u1="k" u2="d" k="41" />
<hkern u1="k" u2="c" k="41" />
<hkern u1="m" u2="&#x201d;" k="20" />
<hkern u1="m" u2="&#x2019;" k="20" />
<hkern u1="m" u2="&#x27;" k="20" />
<hkern u1="m" u2="&#x22;" k="20" />
<hkern u1="n" u2="&#x201d;" k="20" />
<hkern u1="n" u2="&#x2019;" k="20" />
<hkern u1="n" u2="&#x27;" k="20" />
<hkern u1="n" u2="&#x22;" k="20" />
<hkern u1="o" u2="&#x201d;" k="20" />
<hkern u1="o" u2="&#x2019;" k="20" />
<hkern u1="o" u2="&#xfd;" k="41" />
<hkern u1="o" u2="z" k="20" />
<hkern u1="o" u2="y" k="41" />
<hkern u1="o" u2="x" k="41" />
<hkern u1="o" u2="w" k="41" />
<hkern u1="o" u2="v" k="41" />
<hkern u1="o" u2="&#x27;" k="20" />
<hkern u1="o" u2="&#x22;" k="20" />
<hkern u1="p" u2="&#x201d;" k="20" />
<hkern u1="p" u2="&#x2019;" k="20" />
<hkern u1="p" u2="&#xfd;" k="41" />
<hkern u1="p" u2="z" k="20" />
<hkern u1="p" u2="y" k="41" />
<hkern u1="p" u2="x" k="41" />
<hkern u1="p" u2="w" k="41" />
<hkern u1="p" u2="v" k="41" />
<hkern u1="p" u2="&#x27;" k="20" />
<hkern u1="p" u2="&#x22;" k="20" />
<hkern u1="r" u2="&#x201d;" k="-82" />
<hkern u1="r" u2="&#x2019;" k="-82" />
<hkern u1="r" u2="&#x153;" k="41" />
<hkern u1="r" u2="&#xf8;" k="41" />
<hkern u1="r" u2="&#xf6;" k="41" />
<hkern u1="r" u2="&#xf5;" k="41" />
<hkern u1="r" u2="&#xf4;" k="41" />
<hkern u1="r" u2="&#xf3;" k="41" />
<hkern u1="r" u2="&#xf2;" k="41" />
<hkern u1="r" u2="&#xeb;" k="41" />
<hkern u1="r" u2="&#xea;" k="41" />
<hkern u1="r" u2="&#xe9;" k="41" />
<hkern u1="r" u2="&#xe8;" k="41" />
<hkern u1="r" u2="&#xe7;" k="41" />
<hkern u1="r" u2="&#xe6;" k="41" />
<hkern u1="r" u2="&#xe5;" k="41" />
<hkern u1="r" u2="&#xe4;" k="41" />
<hkern u1="r" u2="&#xe3;" k="41" />
<hkern u1="r" u2="&#xe2;" k="41" />
<hkern u1="r" u2="&#xe1;" k="41" />
<hkern u1="r" u2="&#xe0;" k="41" />
<hkern u1="r" u2="q" k="41" />
<hkern u1="r" u2="o" k="41" />
<hkern u1="r" u2="g" k="20" />
<hkern u1="r" u2="e" k="41" />
<hkern u1="r" u2="d" k="41" />
<hkern u1="r" u2="c" k="41" />
<hkern u1="r" u2="a" k="41" />
<hkern u1="r" u2="&#x27;" k="-82" />
<hkern u1="r" u2="&#x22;" k="-82" />
<hkern u1="t" u2="&#x201d;" k="-41" />
<hkern u1="t" u2="&#x2019;" k="-41" />
<hkern u1="t" u2="&#x27;" k="-41" />
<hkern u1="t" u2="&#x22;" k="-41" />
<hkern u1="v" u2="&#x201e;" k="82" />
<hkern u1="v" u2="&#x201d;" k="-82" />
<hkern u1="v" u2="&#x201a;" k="82" />
<hkern u1="v" u2="&#x2019;" k="-82" />
<hkern u1="v" u2="&#x3f;" k="-41" />
<hkern u1="v" u2="&#x2e;" k="82" />
<hkern u1="v" u2="&#x2c;" k="82" />
<hkern u1="v" u2="&#x27;" k="-82" />
<hkern u1="v" u2="&#x22;" k="-82" />
<hkern u1="w" u2="&#x201e;" k="82" />
<hkern u1="w" u2="&#x201d;" k="-82" />
<hkern u1="w" u2="&#x201a;" k="82" />
<hkern u1="w" u2="&#x2019;" k="-82" />
<hkern u1="w" u2="&#x3f;" k="-41" />
<hkern u1="w" u2="&#x2e;" k="82" />
<hkern u1="w" u2="&#x2c;" k="82" />
<hkern u1="w" u2="&#x27;" k="-82" />
<hkern u1="w" u2="&#x22;" k="-82" />
<hkern u1="x" u2="&#x153;" k="41" />
<hkern u1="x" u2="&#xf8;" k="41" />
<hkern u1="x" u2="&#xf6;" k="41" />
<hkern u1="x" u2="&#xf5;" k="41" />
<hkern u1="x" u2="&#xf4;" k="41" />
<hkern u1="x" u2="&#xf3;" k="41" />
<hkern u1="x" u2="&#xf2;" k="41" />
<hkern u1="x" u2="&#xeb;" k="41" />
<hkern u1="x" u2="&#xea;" k="41" />
<hkern u1="x" u2="&#xe9;" k="41" />
<hkern u1="x" u2="&#xe8;" k="41" />
<hkern u1="x" u2="&#xe7;" k="41" />
<hkern u1="x" u2="&#xe0;" k="41" />
<hkern u1="x" u2="q" k="41" />
<hkern u1="x" u2="o" k="41" />
<hkern u1="x" u2="e" k="41" />
<hkern u1="x" u2="d" k="41" />
<hkern u1="x" u2="c" k="41" />
<hkern u1="y" u2="&#x201e;" k="82" />
<hkern u1="y" u2="&#x201d;" k="-82" />
<hkern u1="y" u2="&#x201a;" k="82" />
<hkern u1="y" u2="&#x2019;" k="-82" />
<hkern u1="y" u2="&#x3f;" k="-41" />
<hkern u1="y" u2="&#x2e;" k="82" />
<hkern u1="y" u2="&#x2c;" k="82" />
<hkern u1="y" u2="&#x27;" k="-82" />
<hkern u1="y" u2="&#x22;" k="-82" />
<hkern u1="&#x7b;" u2="J" k="-184" />
<hkern u1="&#xc0;" u2="&#x201d;" k="143" />
<hkern u1="&#xc0;" u2="&#x2019;" k="143" />
<hkern u1="&#xc0;" u2="&#x178;" k="123" />
<hkern u1="&#xc0;" u2="&#x152;" k="41" />
<hkern u1="&#xc0;" u2="&#xdd;" k="123" />
<hkern u1="&#xc0;" u2="&#xd8;" k="41" />
<hkern u1="&#xc0;" u2="&#xd6;" k="41" />
<hkern u1="&#xc0;" u2="&#xd5;" k="41" />
<hkern u1="&#xc0;" u2="&#xd4;" k="41" />
<hkern u1="&#xc0;" u2="&#xd3;" k="41" />
<hkern u1="&#xc0;" u2="&#xd2;" k="41" />
<hkern u1="&#xc0;" u2="&#xc7;" k="41" />
<hkern u1="&#xc0;" u2="Y" k="123" />
<hkern u1="&#xc0;" u2="W" k="82" />
<hkern u1="&#xc0;" u2="V" k="82" />
<hkern u1="&#xc0;" u2="T" k="143" />
<hkern u1="&#xc0;" u2="Q" k="41" />
<hkern u1="&#xc0;" u2="O" k="41" />
<hkern u1="&#xc0;" u2="J" k="-266" />
<hkern u1="&#xc0;" u2="G" k="41" />
<hkern u1="&#xc0;" u2="C" k="41" />
<hkern u1="&#xc0;" u2="&#x27;" k="143" />
<hkern u1="&#xc0;" u2="&#x22;" k="143" />
<hkern u1="&#xc1;" u2="&#x201d;" k="143" />
<hkern u1="&#xc1;" u2="&#x2019;" k="143" />
<hkern u1="&#xc1;" u2="&#x178;" k="123" />
<hkern u1="&#xc1;" u2="&#x152;" k="41" />
<hkern u1="&#xc1;" u2="&#xdd;" k="123" />
<hkern u1="&#xc1;" u2="&#xd8;" k="41" />
<hkern u1="&#xc1;" u2="&#xd6;" k="41" />
<hkern u1="&#xc1;" u2="&#xd5;" k="41" />
<hkern u1="&#xc1;" u2="&#xd4;" k="41" />
<hkern u1="&#xc1;" u2="&#xd3;" k="41" />
<hkern u1="&#xc1;" u2="&#xd2;" k="41" />
<hkern u1="&#xc1;" u2="&#xc7;" k="41" />
<hkern u1="&#xc1;" u2="Y" k="123" />
<hkern u1="&#xc1;" u2="W" k="82" />
<hkern u1="&#xc1;" u2="V" k="82" />
<hkern u1="&#xc1;" u2="T" k="143" />
<hkern u1="&#xc1;" u2="Q" k="41" />
<hkern u1="&#xc1;" u2="O" k="41" />
<hkern u1="&#xc1;" u2="J" k="-266" />
<hkern u1="&#xc1;" u2="G" k="41" />
<hkern u1="&#xc1;" u2="C" k="41" />
<hkern u1="&#xc1;" u2="&#x27;" k="143" />
<hkern u1="&#xc1;" u2="&#x22;" k="143" />
<hkern u1="&#xc2;" u2="&#x201d;" k="143" />
<hkern u1="&#xc2;" u2="&#x2019;" k="143" />
<hkern u1="&#xc2;" u2="&#x178;" k="123" />
<hkern u1="&#xc2;" u2="&#x152;" k="41" />
<hkern u1="&#xc2;" u2="&#xdd;" k="123" />
<hkern u1="&#xc2;" u2="&#xd8;" k="41" />
<hkern u1="&#xc2;" u2="&#xd6;" k="41" />
<hkern u1="&#xc2;" u2="&#xd5;" k="41" />
<hkern u1="&#xc2;" u2="&#xd4;" k="41" />
<hkern u1="&#xc2;" u2="&#xd3;" k="41" />
<hkern u1="&#xc2;" u2="&#xd2;" k="41" />
<hkern u1="&#xc2;" u2="&#xc7;" k="41" />
<hkern u1="&#xc2;" u2="Y" k="123" />
<hkern u1="&#xc2;" u2="W" k="82" />
<hkern u1="&#xc2;" u2="V" k="82" />
<hkern u1="&#xc2;" u2="T" k="143" />
<hkern u1="&#xc2;" u2="Q" k="41" />
<hkern u1="&#xc2;" u2="O" k="41" />
<hkern u1="&#xc2;" u2="J" k="-266" />
<hkern u1="&#xc2;" u2="G" k="41" />
<hkern u1="&#xc2;" u2="C" k="41" />
<hkern u1="&#xc2;" u2="&#x27;" k="143" />
<hkern u1="&#xc2;" u2="&#x22;" k="143" />
<hkern u1="&#xc3;" u2="&#x201d;" k="143" />
<hkern u1="&#xc3;" u2="&#x2019;" k="143" />
<hkern u1="&#xc3;" u2="&#x178;" k="123" />
<hkern u1="&#xc3;" u2="&#x152;" k="41" />
<hkern u1="&#xc3;" u2="&#xdd;" k="123" />
<hkern u1="&#xc3;" u2="&#xd8;" k="41" />
<hkern u1="&#xc3;" u2="&#xd6;" k="41" />
<hkern u1="&#xc3;" u2="&#xd5;" k="41" />
<hkern u1="&#xc3;" u2="&#xd4;" k="41" />
<hkern u1="&#xc3;" u2="&#xd3;" k="41" />
<hkern u1="&#xc3;" u2="&#xd2;" k="41" />
<hkern u1="&#xc3;" u2="&#xc7;" k="41" />
<hkern u1="&#xc3;" u2="Y" k="123" />
<hkern u1="&#xc3;" u2="W" k="82" />
<hkern u1="&#xc3;" u2="V" k="82" />
<hkern u1="&#xc3;" u2="T" k="143" />
<hkern u1="&#xc3;" u2="Q" k="41" />
<hkern u1="&#xc3;" u2="O" k="41" />
<hkern u1="&#xc3;" u2="J" k="-266" />
<hkern u1="&#xc3;" u2="G" k="41" />
<hkern u1="&#xc3;" u2="C" k="41" />
<hkern u1="&#xc3;" u2="&#x27;" k="143" />
<hkern u1="&#xc3;" u2="&#x22;" k="143" />
<hkern u1="&#xc4;" u2="&#x201d;" k="143" />
<hkern u1="&#xc4;" u2="&#x2019;" k="143" />
<hkern u1="&#xc4;" u2="&#x178;" k="123" />
<hkern u1="&#xc4;" u2="&#x152;" k="41" />
<hkern u1="&#xc4;" u2="&#xdd;" k="123" />
<hkern u1="&#xc4;" u2="&#xd8;" k="41" />
<hkern u1="&#xc4;" u2="&#xd6;" k="41" />
<hkern u1="&#xc4;" u2="&#xd5;" k="41" />
<hkern u1="&#xc4;" u2="&#xd4;" k="41" />
<hkern u1="&#xc4;" u2="&#xd3;" k="41" />
<hkern u1="&#xc4;" u2="&#xd2;" k="41" />
<hkern u1="&#xc4;" u2="&#xc7;" k="41" />
<hkern u1="&#xc4;" u2="Y" k="123" />
<hkern u1="&#xc4;" u2="W" k="82" />
<hkern u1="&#xc4;" u2="V" k="82" />
<hkern u1="&#xc4;" u2="T" k="143" />
<hkern u1="&#xc4;" u2="Q" k="41" />
<hkern u1="&#xc4;" u2="O" k="41" />
<hkern u1="&#xc4;" u2="J" k="-266" />
<hkern u1="&#xc4;" u2="G" k="41" />
<hkern u1="&#xc4;" u2="C" k="41" />
<hkern u1="&#xc4;" u2="&#x27;" k="143" />
<hkern u1="&#xc4;" u2="&#x22;" k="143" />
<hkern u1="&#xc5;" u2="&#x201d;" k="143" />
<hkern u1="&#xc5;" u2="&#x2019;" k="143" />
<hkern u1="&#xc5;" u2="&#x178;" k="123" />
<hkern u1="&#xc5;" u2="&#x152;" k="41" />
<hkern u1="&#xc5;" u2="&#xdd;" k="123" />
<hkern u1="&#xc5;" u2="&#xd8;" k="41" />
<hkern u1="&#xc5;" u2="&#xd6;" k="41" />
<hkern u1="&#xc5;" u2="&#xd5;" k="41" />
<hkern u1="&#xc5;" u2="&#xd4;" k="41" />
<hkern u1="&#xc5;" u2="&#xd3;" k="41" />
<hkern u1="&#xc5;" u2="&#xd2;" k="41" />
<hkern u1="&#xc5;" u2="&#xc7;" k="41" />
<hkern u1="&#xc5;" u2="Y" k="123" />
<hkern u1="&#xc5;" u2="W" k="82" />
<hkern u1="&#xc5;" u2="V" k="82" />
<hkern u1="&#xc5;" u2="T" k="143" />
<hkern u1="&#xc5;" u2="Q" k="41" />
<hkern u1="&#xc5;" u2="O" k="41" />
<hkern u1="&#xc5;" u2="J" k="-266" />
<hkern u1="&#xc5;" u2="G" k="41" />
<hkern u1="&#xc5;" u2="C" k="41" />
<hkern u1="&#xc5;" u2="&#x27;" k="143" />
<hkern u1="&#xc5;" u2="&#x22;" k="143" />
<hkern u1="&#xc6;" u2="J" k="-123" />
<hkern u1="&#xc7;" u2="&#x152;" k="41" />
<hkern u1="&#xc7;" u2="&#xd8;" k="41" />
<hkern u1="&#xc7;" u2="&#xd6;" k="41" />
<hkern u1="&#xc7;" u2="&#xd5;" k="41" />
<hkern u1="&#xc7;" u2="&#xd4;" k="41" />
<hkern u1="&#xc7;" u2="&#xd3;" k="41" />
<hkern u1="&#xc7;" u2="&#xd2;" k="41" />
<hkern u1="&#xc7;" u2="&#xc7;" k="41" />
<hkern u1="&#xc7;" u2="Q" k="41" />
<hkern u1="&#xc7;" u2="O" k="41" />
<hkern u1="&#xc7;" u2="G" k="41" />
<hkern u1="&#xc7;" u2="C" k="41" />
<hkern u1="&#xc8;" u2="J" k="-123" />
<hkern u1="&#xc9;" u2="J" k="-123" />
<hkern u1="&#xca;" u2="J" k="-123" />
<hkern u1="&#xcb;" u2="J" k="-123" />
<hkern u1="&#xd0;" u2="&#x201e;" k="82" />
<hkern u1="&#xd0;" u2="&#x201a;" k="82" />
<hkern u1="&#xd0;" u2="&#x178;" k="20" />
<hkern u1="&#xd0;" u2="&#xdd;" k="20" />
<hkern u1="&#xd0;" u2="&#xc5;" k="41" />
<hkern u1="&#xd0;" u2="&#xc4;" k="41" />
<hkern u1="&#xd0;" u2="&#xc3;" k="41" />
<hkern u1="&#xd0;" u2="&#xc2;" k="41" />
<hkern u1="&#xd0;" u2="&#xc1;" k="41" />
<hkern u1="&#xd0;" u2="&#xc0;" k="41" />
<hkern u1="&#xd0;" u2="Z" k="20" />
<hkern u1="&#xd0;" u2="Y" k="20" />
<hkern u1="&#xd0;" u2="X" k="41" />
<hkern u1="&#xd0;" u2="W" k="20" />
<hkern u1="&#xd0;" u2="V" k="20" />
<hkern u1="&#xd0;" u2="T" k="61" />
<hkern u1="&#xd0;" u2="A" k="41" />
<hkern u1="&#xd0;" u2="&#x2e;" k="82" />
<hkern u1="&#xd0;" u2="&#x2c;" k="82" />
<hkern u1="&#xd2;" u2="&#x201e;" k="82" />
<hkern u1="&#xd2;" u2="&#x201a;" k="82" />
<hkern u1="&#xd2;" u2="&#x178;" k="20" />
<hkern u1="&#xd2;" u2="&#xdd;" k="20" />
<hkern u1="&#xd2;" u2="&#xc5;" k="41" />
<hkern u1="&#xd2;" u2="&#xc4;" k="41" />
<hkern u1="&#xd2;" u2="&#xc3;" k="41" />
<hkern u1="&#xd2;" u2="&#xc2;" k="41" />
<hkern u1="&#xd2;" u2="&#xc1;" k="41" />
<hkern u1="&#xd2;" u2="&#xc0;" k="41" />
<hkern u1="&#xd2;" u2="Z" k="20" />
<hkern u1="&#xd2;" u2="Y" k="20" />
<hkern u1="&#xd2;" u2="X" k="41" />
<hkern u1="&#xd2;" u2="W" k="20" />
<hkern u1="&#xd2;" u2="V" k="20" />
<hkern u1="&#xd2;" u2="T" k="61" />
<hkern u1="&#xd2;" u2="A" k="41" />
<hkern u1="&#xd2;" u2="&#x2e;" k="82" />
<hkern u1="&#xd2;" u2="&#x2c;" k="82" />
<hkern u1="&#xd3;" u2="&#x201e;" k="82" />
<hkern u1="&#xd3;" u2="&#x201a;" k="82" />
<hkern u1="&#xd3;" u2="&#x178;" k="20" />
<hkern u1="&#xd3;" u2="&#xdd;" k="20" />
<hkern u1="&#xd3;" u2="&#xc5;" k="41" />
<hkern u1="&#xd3;" u2="&#xc4;" k="41" />
<hkern u1="&#xd3;" u2="&#xc3;" k="41" />
<hkern u1="&#xd3;" u2="&#xc2;" k="41" />
<hkern u1="&#xd3;" u2="&#xc1;" k="41" />
<hkern u1="&#xd3;" u2="&#xc0;" k="41" />
<hkern u1="&#xd3;" u2="Z" k="20" />
<hkern u1="&#xd3;" u2="Y" k="20" />
<hkern u1="&#xd3;" u2="X" k="41" />
<hkern u1="&#xd3;" u2="W" k="20" />
<hkern u1="&#xd3;" u2="V" k="20" />
<hkern u1="&#xd3;" u2="T" k="61" />
<hkern u1="&#xd3;" u2="A" k="41" />
<hkern u1="&#xd3;" u2="&#x2e;" k="82" />
<hkern u1="&#xd3;" u2="&#x2c;" k="82" />
<hkern u1="&#xd4;" u2="&#x201e;" k="82" />
<hkern u1="&#xd4;" u2="&#x201a;" k="82" />
<hkern u1="&#xd4;" u2="&#x178;" k="20" />
<hkern u1="&#xd4;" u2="&#xdd;" k="20" />
<hkern u1="&#xd4;" u2="&#xc5;" k="41" />
<hkern u1="&#xd4;" u2="&#xc4;" k="41" />
<hkern u1="&#xd4;" u2="&#xc3;" k="41" />
<hkern u1="&#xd4;" u2="&#xc2;" k="41" />
<hkern u1="&#xd4;" u2="&#xc1;" k="41" />
<hkern u1="&#xd4;" u2="&#xc0;" k="41" />
<hkern u1="&#xd4;" u2="Z" k="20" />
<hkern u1="&#xd4;" u2="Y" k="20" />
<hkern u1="&#xd4;" u2="X" k="41" />
<hkern u1="&#xd4;" u2="W" k="20" />
<hkern u1="&#xd4;" u2="V" k="20" />
<hkern u1="&#xd4;" u2="T" k="61" />
<hkern u1="&#xd4;" u2="A" k="41" />
<hkern u1="&#xd4;" u2="&#x2e;" k="82" />
<hkern u1="&#xd4;" u2="&#x2c;" k="82" />
<hkern u1="&#xd5;" u2="&#x201e;" k="82" />
<hkern u1="&#xd5;" u2="&#x201a;" k="82" />
<hkern u1="&#xd5;" u2="&#x178;" k="20" />
<hkern u1="&#xd5;" u2="&#xdd;" k="20" />
<hkern u1="&#xd5;" u2="&#xc5;" k="41" />
<hkern u1="&#xd5;" u2="&#xc4;" k="41" />
<hkern u1="&#xd5;" u2="&#xc3;" k="41" />
<hkern u1="&#xd5;" u2="&#xc2;" k="41" />
<hkern u1="&#xd5;" u2="&#xc1;" k="41" />
<hkern u1="&#xd5;" u2="&#xc0;" k="41" />
<hkern u1="&#xd5;" u2="Z" k="20" />
<hkern u1="&#xd5;" u2="Y" k="20" />
<hkern u1="&#xd5;" u2="X" k="41" />
<hkern u1="&#xd5;" u2="W" k="20" />
<hkern u1="&#xd5;" u2="V" k="20" />
<hkern u1="&#xd5;" u2="T" k="61" />
<hkern u1="&#xd5;" u2="A" k="41" />
<hkern u1="&#xd5;" u2="&#x2e;" k="82" />
<hkern u1="&#xd5;" u2="&#x2c;" k="82" />
<hkern u1="&#xd6;" u2="&#x201e;" k="82" />
<hkern u1="&#xd6;" u2="&#x201a;" k="82" />
<hkern u1="&#xd6;" u2="&#x178;" k="20" />
<hkern u1="&#xd6;" u2="&#xdd;" k="20" />
<hkern u1="&#xd6;" u2="&#xc5;" k="41" />
<hkern u1="&#xd6;" u2="&#xc4;" k="41" />
<hkern u1="&#xd6;" u2="&#xc3;" k="41" />
<hkern u1="&#xd6;" u2="&#xc2;" k="41" />
<hkern u1="&#xd6;" u2="&#xc1;" k="41" />
<hkern u1="&#xd6;" u2="&#xc0;" k="41" />
<hkern u1="&#xd6;" u2="Z" k="20" />
<hkern u1="&#xd6;" u2="Y" k="20" />
<hkern u1="&#xd6;" u2="X" k="41" />
<hkern u1="&#xd6;" u2="W" k="20" />
<hkern u1="&#xd6;" u2="V" k="20" />
<hkern u1="&#xd6;" u2="T" k="61" />
<hkern u1="&#xd6;" u2="A" k="41" />
<hkern u1="&#xd6;" u2="&#x2e;" k="82" />
<hkern u1="&#xd6;" u2="&#x2c;" k="82" />
<hkern u1="&#xd8;" u2="&#x201e;" k="82" />
<hkern u1="&#xd8;" u2="&#x201a;" k="82" />
<hkern u1="&#xd8;" u2="&#x178;" k="20" />
<hkern u1="&#xd8;" u2="&#xdd;" k="20" />
<hkern u1="&#xd8;" u2="&#xc5;" k="41" />
<hkern u1="&#xd8;" u2="&#xc4;" k="41" />
<hkern u1="&#xd8;" u2="&#xc3;" k="41" />
<hkern u1="&#xd8;" u2="&#xc2;" k="41" />
<hkern u1="&#xd8;" u2="&#xc1;" k="41" />
<hkern u1="&#xd8;" u2="&#xc0;" k="41" />
<hkern u1="&#xd8;" u2="Z" k="20" />
<hkern u1="&#xd8;" u2="Y" k="20" />
<hkern u1="&#xd8;" u2="X" k="41" />
<hkern u1="&#xd8;" u2="W" k="20" />
<hkern u1="&#xd8;" u2="V" k="20" />
<hkern u1="&#xd8;" u2="T" k="61" />
<hkern u1="&#xd8;" u2="A" k="41" />
<hkern u1="&#xd8;" u2="&#x2e;" k="82" />
<hkern u1="&#xd8;" u2="&#x2c;" k="82" />
<hkern u1="&#xd9;" u2="&#x201e;" k="41" />
<hkern u1="&#xd9;" u2="&#x201a;" k="41" />
<hkern u1="&#xd9;" u2="&#xc5;" k="20" />
<hkern u1="&#xd9;" u2="&#xc4;" k="20" />
<hkern u1="&#xd9;" u2="&#xc3;" k="20" />
<hkern u1="&#xd9;" u2="&#xc2;" k="20" />
<hkern u1="&#xd9;" u2="&#xc1;" k="20" />
<hkern u1="&#xd9;" u2="&#xc0;" k="20" />
<hkern u1="&#xd9;" u2="A" k="20" />
<hkern u1="&#xd9;" u2="&#x2e;" k="41" />
<hkern u1="&#xd9;" u2="&#x2c;" k="41" />
<hkern u1="&#xda;" u2="&#x201e;" k="41" />
<hkern u1="&#xda;" u2="&#x201a;" k="41" />
<hkern u1="&#xda;" u2="&#xc5;" k="20" />
<hkern u1="&#xda;" u2="&#xc4;" k="20" />
<hkern u1="&#xda;" u2="&#xc3;" k="20" />
<hkern u1="&#xda;" u2="&#xc2;" k="20" />
<hkern u1="&#xda;" u2="&#xc1;" k="20" />
<hkern u1="&#xda;" u2="&#xc0;" k="20" />
<hkern u1="&#xda;" u2="A" k="20" />
<hkern u1="&#xda;" u2="&#x2e;" k="41" />
<hkern u1="&#xda;" u2="&#x2c;" k="41" />
<hkern u1="&#xdb;" u2="&#x201e;" k="41" />
<hkern u1="&#xdb;" u2="&#x201a;" k="41" />
<hkern u1="&#xdb;" u2="&#xc5;" k="20" />
<hkern u1="&#xdb;" u2="&#xc4;" k="20" />
<hkern u1="&#xdb;" u2="&#xc3;" k="20" />
<hkern u1="&#xdb;" u2="&#xc2;" k="20" />
<hkern u1="&#xdb;" u2="&#xc1;" k="20" />
<hkern u1="&#xdb;" u2="&#xc0;" k="20" />
<hkern u1="&#xdb;" u2="A" k="20" />
<hkern u1="&#xdb;" u2="&#x2e;" k="41" />
<hkern u1="&#xdb;" u2="&#x2c;" k="41" />
<hkern u1="&#xdc;" u2="&#x201e;" k="41" />
<hkern u1="&#xdc;" u2="&#x201a;" k="41" />
<hkern u1="&#xdc;" u2="&#xc5;" k="20" />
<hkern u1="&#xdc;" u2="&#xc4;" k="20" />
<hkern u1="&#xdc;" u2="&#xc3;" k="20" />
<hkern u1="&#xdc;" u2="&#xc2;" k="20" />
<hkern u1="&#xdc;" u2="&#xc1;" k="20" />
<hkern u1="&#xdc;" u2="&#xc0;" k="20" />
<hkern u1="&#xdc;" u2="A" k="20" />
<hkern u1="&#xdc;" u2="&#x2e;" k="41" />
<hkern u1="&#xdc;" u2="&#x2c;" k="41" />
<hkern u1="&#xdd;" u2="&#x201e;" k="123" />
<hkern u1="&#xdd;" u2="&#x201a;" k="123" />
<hkern u1="&#xdd;" u2="&#x153;" k="102" />
<hkern u1="&#xdd;" u2="&#x152;" k="41" />
<hkern u1="&#xdd;" u2="&#xfc;" k="61" />
<hkern u1="&#xdd;" u2="&#xfb;" k="61" />
<hkern u1="&#xdd;" u2="&#xfa;" k="61" />
<hkern u1="&#xdd;" u2="&#xf9;" k="61" />
<hkern u1="&#xdd;" u2="&#xf8;" k="102" />
<hkern u1="&#xdd;" u2="&#xf6;" k="102" />
<hkern u1="&#xdd;" u2="&#xf5;" k="102" />
<hkern u1="&#xdd;" u2="&#xf4;" k="102" />
<hkern u1="&#xdd;" u2="&#xf3;" k="102" />
<hkern u1="&#xdd;" u2="&#xf2;" k="102" />
<hkern u1="&#xdd;" u2="&#xeb;" k="102" />
<hkern u1="&#xdd;" u2="&#xea;" k="102" />
<hkern u1="&#xdd;" u2="&#xe9;" k="102" />
<hkern u1="&#xdd;" u2="&#xe8;" k="102" />
<hkern u1="&#xdd;" u2="&#xe7;" k="102" />
<hkern u1="&#xdd;" u2="&#xe6;" k="102" />
<hkern u1="&#xdd;" u2="&#xe5;" k="102" />
<hkern u1="&#xdd;" u2="&#xe4;" k="102" />
<hkern u1="&#xdd;" u2="&#xe3;" k="102" />
<hkern u1="&#xdd;" u2="&#xe2;" k="102" />
<hkern u1="&#xdd;" u2="&#xe1;" k="102" />
<hkern u1="&#xdd;" u2="&#xe0;" k="102" />
<hkern u1="&#xdd;" u2="&#xd8;" k="41" />
<hkern u1="&#xdd;" u2="&#xd6;" k="41" />
<hkern u1="&#xdd;" u2="&#xd5;" k="41" />
<hkern u1="&#xdd;" u2="&#xd4;" k="41" />
<hkern u1="&#xdd;" u2="&#xd3;" k="41" />
<hkern u1="&#xdd;" u2="&#xd2;" k="41" />
<hkern u1="&#xdd;" u2="&#xc7;" k="41" />
<hkern u1="&#xdd;" u2="&#xc5;" k="123" />
<hkern u1="&#xdd;" u2="&#xc4;" k="123" />
<hkern u1="&#xdd;" u2="&#xc3;" k="123" />
<hkern u1="&#xdd;" u2="&#xc2;" k="123" />
<hkern u1="&#xdd;" u2="&#xc1;" k="123" />
<hkern u1="&#xdd;" u2="&#xc0;" k="123" />
<hkern u1="&#xdd;" u2="z" k="41" />
<hkern u1="&#xdd;" u2="u" k="61" />
<hkern u1="&#xdd;" u2="s" k="82" />
<hkern u1="&#xdd;" u2="r" k="61" />
<hkern u1="&#xdd;" u2="q" k="102" />
<hkern u1="&#xdd;" u2="p" k="61" />
<hkern u1="&#xdd;" u2="o" k="102" />
<hkern u1="&#xdd;" u2="n" k="61" />
<hkern u1="&#xdd;" u2="m" k="61" />
<hkern u1="&#xdd;" u2="g" k="41" />
<hkern u1="&#xdd;" u2="e" k="102" />
<hkern u1="&#xdd;" u2="d" k="102" />
<hkern u1="&#xdd;" u2="c" k="102" />
<hkern u1="&#xdd;" u2="a" k="102" />
<hkern u1="&#xdd;" u2="Q" k="41" />
<hkern u1="&#xdd;" u2="O" k="41" />
<hkern u1="&#xdd;" u2="G" k="41" />
<hkern u1="&#xdd;" u2="C" k="41" />
<hkern u1="&#xdd;" u2="A" k="123" />
<hkern u1="&#xdd;" u2="&#x3f;" k="-41" />
<hkern u1="&#xdd;" u2="&#x2e;" k="123" />
<hkern u1="&#xdd;" u2="&#x2c;" k="123" />
<hkern u1="&#xde;" u2="&#x201e;" k="266" />
<hkern u1="&#xde;" u2="&#x201a;" k="266" />
<hkern u1="&#xde;" u2="&#xc5;" k="102" />
<hkern u1="&#xde;" u2="&#xc4;" k="102" />
<hkern u1="&#xde;" u2="&#xc3;" k="102" />
<hkern u1="&#xde;" u2="&#xc2;" k="102" />
<hkern u1="&#xde;" u2="&#xc1;" k="102" />
<hkern u1="&#xde;" u2="&#xc0;" k="102" />
<hkern u1="&#xde;" u2="Z" k="20" />
<hkern u1="&#xde;" u2="X" k="41" />
<hkern u1="&#xde;" u2="A" k="102" />
<hkern u1="&#xde;" u2="&#x2e;" k="266" />
<hkern u1="&#xde;" u2="&#x2c;" k="266" />
<hkern u1="&#xe0;" u2="&#x201d;" k="20" />
<hkern u1="&#xe0;" u2="&#x2019;" k="20" />
<hkern u1="&#xe0;" u2="&#x27;" k="20" />
<hkern u1="&#xe0;" u2="&#x22;" k="20" />
<hkern u1="&#xe1;" u2="&#x201d;" k="20" />
<hkern u1="&#xe1;" u2="&#x2019;" k="20" />
<hkern u1="&#xe1;" u2="&#x27;" k="20" />
<hkern u1="&#xe1;" u2="&#x22;" k="20" />
<hkern u1="&#xe2;" u2="&#x201d;" k="20" />
<hkern u1="&#xe2;" u2="&#x2019;" k="20" />
<hkern u1="&#xe2;" u2="&#x27;" k="20" />
<hkern u1="&#xe2;" u2="&#x22;" k="20" />
<hkern u1="&#xe3;" u2="&#x201d;" k="20" />
<hkern u1="&#xe3;" u2="&#x2019;" k="20" />
<hkern u1="&#xe3;" u2="&#x27;" k="20" />
<hkern u1="&#xe3;" u2="&#x22;" k="20" />
<hkern u1="&#xe4;" u2="&#x201d;" k="20" />
<hkern u1="&#xe4;" u2="&#x2019;" k="20" />
<hkern u1="&#xe4;" u2="&#x27;" k="20" />
<hkern u1="&#xe4;" u2="&#x22;" k="20" />
<hkern u1="&#xe5;" u2="&#x201d;" k="20" />
<hkern u1="&#xe5;" u2="&#x2019;" k="20" />
<hkern u1="&#xe5;" u2="&#x27;" k="20" />
<hkern u1="&#xe5;" u2="&#x22;" k="20" />
<hkern u1="&#xe8;" u2="&#x201d;" k="20" />
<hkern u1="&#xe8;" u2="&#x2019;" k="20" />
<hkern u1="&#xe8;" u2="&#xfd;" k="41" />
<hkern u1="&#xe8;" u2="z" k="20" />
<hkern u1="&#xe8;" u2="y" k="41" />
<hkern u1="&#xe8;" u2="x" k="41" />
<hkern u1="&#xe8;" u2="w" k="41" />
<hkern u1="&#xe8;" u2="v" k="41" />
<hkern u1="&#xe8;" u2="&#x27;" k="20" />
<hkern u1="&#xe8;" u2="&#x22;" k="20" />
<hkern u1="&#xe9;" u2="&#x201d;" k="20" />
<hkern u1="&#xe9;" u2="&#x2019;" k="20" />
<hkern u1="&#xe9;" u2="&#xfd;" k="41" />
<hkern u1="&#xe9;" u2="z" k="20" />
<hkern u1="&#xe9;" u2="y" k="41" />
<hkern u1="&#xe9;" u2="x" k="41" />
<hkern u1="&#xe9;" u2="w" k="41" />
<hkern u1="&#xe9;" u2="v" k="41" />
<hkern u1="&#xe9;" u2="&#x27;" k="20" />
<hkern u1="&#xe9;" u2="&#x22;" k="20" />
<hkern u1="&#xea;" u2="&#x201d;" k="20" />
<hkern u1="&#xea;" u2="&#x2019;" k="20" />
<hkern u1="&#xea;" u2="&#xfd;" k="41" />
<hkern u1="&#xea;" u2="z" k="20" />
<hkern u1="&#xea;" u2="y" k="41" />
<hkern u1="&#xea;" u2="x" k="41" />
<hkern u1="&#xea;" u2="w" k="41" />
<hkern u1="&#xea;" u2="v" k="41" />
<hkern u1="&#xea;" u2="&#x27;" k="20" />
<hkern u1="&#xea;" u2="&#x22;" k="20" />
<hkern u1="&#xeb;" u2="&#x201d;" k="20" />
<hkern u1="&#xeb;" u2="&#x2019;" k="20" />
<hkern u1="&#xeb;" u2="&#xfd;" k="41" />
<hkern u1="&#xeb;" u2="z" k="20" />
<hkern u1="&#xeb;" u2="y" k="41" />
<hkern u1="&#xeb;" u2="x" k="41" />
<hkern u1="&#xeb;" u2="w" k="41" />
<hkern u1="&#xeb;" u2="v" k="41" />
<hkern u1="&#xeb;" u2="&#x27;" k="20" />
<hkern u1="&#xeb;" u2="&#x22;" k="20" />
<hkern u1="&#xf0;" u2="&#x201d;" k="20" />
<hkern u1="&#xf0;" u2="&#x2019;" k="20" />
<hkern u1="&#xf0;" u2="&#xfd;" k="41" />
<hkern u1="&#xf0;" u2="z" k="20" />
<hkern u1="&#xf0;" u2="y" k="41" />
<hkern u1="&#xf0;" u2="x" k="41" />
<hkern u1="&#xf0;" u2="w" k="41" />
<hkern u1="&#xf0;" u2="v" k="41" />
<hkern u1="&#xf0;" u2="&#x27;" k="20" />
<hkern u1="&#xf0;" u2="&#x22;" k="20" />
<hkern u1="&#xf2;" u2="&#x201d;" k="20" />
<hkern u1="&#xf2;" u2="&#x2019;" k="20" />
<hkern u1="&#xf2;" u2="&#xfd;" k="41" />
<hkern u1="&#xf2;" u2="z" k="20" />
<hkern u1="&#xf2;" u2="y" k="41" />
<hkern u1="&#xf2;" u2="x" k="41" />
<hkern u1="&#xf2;" u2="w" k="41" />
<hkern u1="&#xf2;" u2="v" k="41" />
<hkern u1="&#xf2;" u2="&#x27;" k="20" />
<hkern u1="&#xf2;" u2="&#x22;" k="20" />
<hkern u1="&#xf3;" u2="&#x201d;" k="20" />
<hkern u1="&#xf3;" u2="&#x2019;" k="20" />
<hkern u1="&#xf3;" u2="&#xfd;" k="41" />
<hkern u1="&#xf3;" u2="z" k="20" />
<hkern u1="&#xf3;" u2="y" k="41" />
<hkern u1="&#xf3;" u2="x" k="41" />
<hkern u1="&#xf3;" u2="w" k="41" />
<hkern u1="&#xf3;" u2="v" k="41" />
<hkern u1="&#xf3;" u2="&#x27;" k="20" />
<hkern u1="&#xf3;" u2="&#x22;" k="20" />
<hkern u1="&#xf4;" u2="&#x201d;" k="20" />
<hkern u1="&#xf4;" u2="&#x2019;" k="20" />
<hkern u1="&#xf4;" u2="&#xfd;" k="41" />
<hkern u1="&#xf4;" u2="z" k="20" />
<hkern u1="&#xf4;" u2="y" k="41" />
<hkern u1="&#xf4;" u2="x" k="41" />
<hkern u1="&#xf4;" u2="w" k="41" />
<hkern u1="&#xf4;" u2="v" k="41" />
<hkern u1="&#xf4;" u2="&#x27;" k="20" />
<hkern u1="&#xf4;" u2="&#x22;" k="20" />
<hkern u1="&#xf6;" u2="&#x201d;" k="41" />
<hkern u1="&#xf6;" u2="&#x2019;" k="41" />
<hkern u1="&#xf6;" u2="&#x27;" k="41" />
<hkern u1="&#xf6;" u2="&#x22;" k="41" />
<hkern u1="&#xf8;" u2="&#x201d;" k="20" />
<hkern u1="&#xf8;" u2="&#x2019;" k="20" />
<hkern u1="&#xf8;" u2="&#xfd;" k="41" />
<hkern u1="&#xf8;" u2="z" k="20" />
<hkern u1="&#xf8;" u2="y" k="41" />
<hkern u1="&#xf8;" u2="x" k="41" />
<hkern u1="&#xf8;" u2="w" k="41" />
<hkern u1="&#xf8;" u2="v" k="41" />
<hkern u1="&#xf8;" u2="&#x27;" k="20" />
<hkern u1="&#xf8;" u2="&#x22;" k="20" />
<hkern u1="&#xfd;" u2="&#x201e;" k="82" />
<hkern u1="&#xfd;" u2="&#x201d;" k="-82" />
<hkern u1="&#xfd;" u2="&#x201a;" k="82" />
<hkern u1="&#xfd;" u2="&#x2019;" k="-82" />
<hkern u1="&#xfd;" u2="&#x3f;" k="-41" />
<hkern u1="&#xfd;" u2="&#x2e;" k="82" />
<hkern u1="&#xfd;" u2="&#x2c;" k="82" />
<hkern u1="&#xfd;" u2="&#x27;" k="-82" />
<hkern u1="&#xfd;" u2="&#x22;" k="-82" />
<hkern u1="&#xfe;" u2="&#x201d;" k="20" />
<hkern u1="&#xfe;" u2="&#x2019;" k="20" />
<hkern u1="&#xfe;" u2="&#xfd;" k="41" />
<hkern u1="&#xfe;" u2="z" k="20" />
<hkern u1="&#xfe;" u2="y" k="41" />
<hkern u1="&#xfe;" u2="x" k="41" />
<hkern u1="&#xfe;" u2="w" k="41" />
<hkern u1="&#xfe;" u2="v" k="41" />
<hkern u1="&#xfe;" u2="&#x27;" k="20" />
<hkern u1="&#xfe;" u2="&#x22;" k="20" />
<hkern u1="&#xff;" u2="&#x201e;" k="82" />
<hkern u1="&#xff;" u2="&#x201d;" k="-82" />
<hkern u1="&#xff;" u2="&#x201a;" k="82" />
<hkern u1="&#xff;" u2="&#x2019;" k="-82" />
<hkern u1="&#xff;" u2="&#x3f;" k="-41" />
<hkern u1="&#xff;" u2="&#x2e;" k="82" />
<hkern u1="&#xff;" u2="&#x2c;" k="82" />
<hkern u1="&#xff;" u2="&#x27;" k="-82" />
<hkern u1="&#xff;" u2="&#x22;" k="-82" />
<hkern u1="&#x152;" u2="J" k="-123" />
<hkern u1="&#x178;" u2="&#x201e;" k="123" />
<hkern u1="&#x178;" u2="&#x201a;" k="123" />
<hkern u1="&#x178;" u2="&#x153;" k="102" />
<hkern u1="&#x178;" u2="&#x152;" k="41" />
<hkern u1="&#x178;" u2="&#xfc;" k="61" />
<hkern u1="&#x178;" u2="&#xfb;" k="61" />
<hkern u1="&#x178;" u2="&#xfa;" k="61" />
<hkern u1="&#x178;" u2="&#xf9;" k="61" />
<hkern u1="&#x178;" u2="&#xf8;" k="102" />
<hkern u1="&#x178;" u2="&#xf6;" k="102" />
<hkern u1="&#x178;" u2="&#xf5;" k="102" />
<hkern u1="&#x178;" u2="&#xf4;" k="102" />
<hkern u1="&#x178;" u2="&#xf3;" k="102" />
<hkern u1="&#x178;" u2="&#xf2;" k="102" />
<hkern u1="&#x178;" u2="&#xeb;" k="102" />
<hkern u1="&#x178;" u2="&#xea;" k="102" />
<hkern u1="&#x178;" u2="&#xe9;" k="102" />
<hkern u1="&#x178;" u2="&#xe8;" k="102" />
<hkern u1="&#x178;" u2="&#xe7;" k="102" />
<hkern u1="&#x178;" u2="&#xe6;" k="102" />
<hkern u1="&#x178;" u2="&#xe5;" k="102" />
<hkern u1="&#x178;" u2="&#xe4;" k="102" />
<hkern u1="&#x178;" u2="&#xe3;" k="102" />
<hkern u1="&#x178;" u2="&#xe2;" k="102" />
<hkern u1="&#x178;" u2="&#xe1;" k="102" />
<hkern u1="&#x178;" u2="&#xe0;" k="102" />
<hkern u1="&#x178;" u2="&#xd8;" k="41" />
<hkern u1="&#x178;" u2="&#xd6;" k="41" />
<hkern u1="&#x178;" u2="&#xd5;" k="41" />
<hkern u1="&#x178;" u2="&#xd4;" k="41" />
<hkern u1="&#x178;" u2="&#xd3;" k="41" />
<hkern u1="&#x178;" u2="&#xd2;" k="41" />
<hkern u1="&#x178;" u2="&#xc7;" k="41" />
<hkern u1="&#x178;" u2="&#xc5;" k="123" />
<hkern u1="&#x178;" u2="&#xc4;" k="123" />
<hkern u1="&#x178;" u2="&#xc3;" k="123" />
<hkern u1="&#x178;" u2="&#xc2;" k="123" />
<hkern u1="&#x178;" u2="&#xc1;" k="123" />
<hkern u1="&#x178;" u2="&#xc0;" k="123" />
<hkern u1="&#x178;" u2="z" k="41" />
<hkern u1="&#x178;" u2="u" k="61" />
<hkern u1="&#x178;" u2="s" k="82" />
<hkern u1="&#x178;" u2="r" k="61" />
<hkern u1="&#x178;" u2="q" k="102" />
<hkern u1="&#x178;" u2="p" k="61" />
<hkern u1="&#x178;" u2="o" k="102" />
<hkern u1="&#x178;" u2="n" k="61" />
<hkern u1="&#x178;" u2="m" k="61" />
<hkern u1="&#x178;" u2="g" k="41" />
<hkern u1="&#x178;" u2="e" k="102" />
<hkern u1="&#x178;" u2="d" k="102" />
<hkern u1="&#x178;" u2="c" k="102" />
<hkern u1="&#x178;" u2="a" k="102" />
<hkern u1="&#x178;" u2="Q" k="41" />
<hkern u1="&#x178;" u2="O" k="41" />
<hkern u1="&#x178;" u2="G" k="41" />
<hkern u1="&#x178;" u2="C" k="41" />
<hkern u1="&#x178;" u2="A" k="123" />
<hkern u1="&#x178;" u2="&#x3f;" k="-41" />
<hkern u1="&#x178;" u2="&#x2e;" k="123" />
<hkern u1="&#x178;" u2="&#x2c;" k="123" />
<hkern u1="&#x2013;" u2="T" k="82" />
<hkern u1="&#x2014;" u2="T" k="82" />
<hkern u1="&#x2018;" u2="&#x178;" k="-20" />
<hkern u1="&#x2018;" u2="&#x153;" k="123" />
<hkern u1="&#x2018;" u2="&#xfc;" k="61" />
<hkern u1="&#x2018;" u2="&#xfb;" k="61" />
<hkern u1="&#x2018;" u2="&#xfa;" k="61" />
<hkern u1="&#x2018;" u2="&#xf9;" k="61" />
<hkern u1="&#x2018;" u2="&#xf8;" k="123" />
<hkern u1="&#x2018;" u2="&#xf6;" k="123" />
<hkern u1="&#x2018;" u2="&#xf5;" k="123" />
<hkern u1="&#x2018;" u2="&#xf4;" k="123" />
<hkern u1="&#x2018;" u2="&#xf3;" k="123" />
<hkern u1="&#x2018;" u2="&#xf2;" k="123" />
<hkern u1="&#x2018;" u2="&#xeb;" k="123" />
<hkern u1="&#x2018;" u2="&#xea;" k="123" />
<hkern u1="&#x2018;" u2="&#xe9;" k="123" />
<hkern u1="&#x2018;" u2="&#xe8;" k="123" />
<hkern u1="&#x2018;" u2="&#xe7;" k="123" />
<hkern u1="&#x2018;" u2="&#xe6;" k="82" />
<hkern u1="&#x2018;" u2="&#xe5;" k="82" />
<hkern u1="&#x2018;" u2="&#xe4;" k="82" />
<hkern u1="&#x2018;" u2="&#xe3;" k="82" />
<hkern u1="&#x2018;" u2="&#xe2;" k="82" />
<hkern u1="&#x2018;" u2="&#xe1;" k="82" />
<hkern u1="&#x2018;" u2="&#xe0;" k="123" />
<hkern u1="&#x2018;" u2="&#xdd;" k="-20" />
<hkern u1="&#x2018;" u2="&#xc5;" k="143" />
<hkern u1="&#x2018;" u2="&#xc4;" k="143" />
<hkern u1="&#x2018;" u2="&#xc3;" k="143" />
<hkern u1="&#x2018;" u2="&#xc2;" k="143" />
<hkern u1="&#x2018;" u2="&#xc1;" k="143" />
<hkern u1="&#x2018;" u2="&#xc0;" k="143" />
<hkern u1="&#x2018;" u2="u" k="61" />
<hkern u1="&#x2018;" u2="s" k="61" />
<hkern u1="&#x2018;" u2="r" k="61" />
<hkern u1="&#x2018;" u2="q" k="123" />
<hkern u1="&#x2018;" u2="p" k="61" />
<hkern u1="&#x2018;" u2="o" k="123" />
<hkern u1="&#x2018;" u2="n" k="61" />
<hkern u1="&#x2018;" u2="m" k="61" />
<hkern u1="&#x2018;" u2="g" k="61" />
<hkern u1="&#x2018;" u2="e" k="123" />
<hkern u1="&#x2018;" u2="d" k="123" />
<hkern u1="&#x2018;" u2="c" k="123" />
<hkern u1="&#x2018;" u2="a" k="82" />
<hkern u1="&#x2018;" u2="Y" k="-20" />
<hkern u1="&#x2018;" u2="W" k="-41" />
<hkern u1="&#x2018;" u2="V" k="-41" />
<hkern u1="&#x2018;" u2="T" k="-41" />
<hkern u1="&#x2018;" u2="A" k="143" />
<hkern u1="&#x2019;" u2="&#x178;" k="-20" />
<hkern u1="&#x2019;" u2="&#x153;" k="123" />
<hkern u1="&#x2019;" u2="&#xfc;" k="61" />
<hkern u1="&#x2019;" u2="&#xfb;" k="61" />
<hkern u1="&#x2019;" u2="&#xfa;" k="61" />
<hkern u1="&#x2019;" u2="&#xf9;" k="61" />
<hkern u1="&#x2019;" u2="&#xf8;" k="123" />
<hkern u1="&#x2019;" u2="&#xf6;" k="123" />
<hkern u1="&#x2019;" u2="&#xf5;" k="123" />
<hkern u1="&#x2019;" u2="&#xf4;" k="123" />
<hkern u1="&#x2019;" u2="&#xf3;" k="123" />
<hkern u1="&#x2019;" u2="&#xf2;" k="123" />
<hkern u1="&#x2019;" u2="&#xeb;" k="123" />
<hkern u1="&#x2019;" u2="&#xea;" k="123" />
<hkern u1="&#x2019;" u2="&#xe9;" k="123" />
<hkern u1="&#x2019;" u2="&#xe8;" k="123" />
<hkern u1="&#x2019;" u2="&#xe7;" k="123" />
<hkern u1="&#x2019;" u2="&#xe6;" k="82" />
<hkern u1="&#x2019;" u2="&#xe5;" k="82" />
<hkern u1="&#x2019;" u2="&#xe4;" k="82" />
<hkern u1="&#x2019;" u2="&#xe3;" k="82" />
<hkern u1="&#x2019;" u2="&#xe2;" k="82" />
<hkern u1="&#x2019;" u2="&#xe1;" k="82" />
<hkern u1="&#x2019;" u2="&#xe0;" k="123" />
<hkern u1="&#x2019;" u2="&#xdd;" k="-20" />
<hkern u1="&#x2019;" u2="&#xc5;" k="143" />
<hkern u1="&#x2019;" u2="&#xc4;" k="143" />
<hkern u1="&#x2019;" u2="&#xc3;" k="143" />
<hkern u1="&#x2019;" u2="&#xc2;" k="143" />
<hkern u1="&#x2019;" u2="&#xc1;" k="143" />
<hkern u1="&#x2019;" u2="&#xc0;" k="143" />
<hkern u1="&#x2019;" u2="u" k="61" />
<hkern u1="&#x2019;" u2="s" k="61" />
<hkern u1="&#x2019;" u2="r" k="61" />
<hkern u1="&#x2019;" u2="q" k="123" />
<hkern u1="&#x2019;" u2="p" k="61" />
<hkern u1="&#x2019;" u2="o" k="123" />
<hkern u1="&#x2019;" u2="n" k="61" />
<hkern u1="&#x2019;" u2="m" k="61" />
<hkern u1="&#x2019;" u2="g" k="61" />
<hkern u1="&#x2019;" u2="e" k="123" />
<hkern u1="&#x2019;" u2="d" k="123" />
<hkern u1="&#x2019;" u2="c" k="123" />
<hkern u1="&#x2019;" u2="a" k="82" />
<hkern u1="&#x2019;" u2="Y" k="-20" />
<hkern u1="&#x2019;" u2="W" k="-41" />
<hkern u1="&#x2019;" u2="V" k="-41" />
<hkern u1="&#x2019;" u2="T" k="-41" />
<hkern u1="&#x2019;" u2="A" k="143" />
<hkern u1="&#x201a;" u2="&#x178;" k="123" />
<hkern u1="&#x201a;" u2="&#x152;" k="102" />
<hkern u1="&#x201a;" u2="&#xdd;" k="123" />
<hkern u1="&#x201a;" u2="&#xdc;" k="41" />
<hkern u1="&#x201a;" u2="&#xdb;" k="41" />
<hkern u1="&#x201a;" u2="&#xda;" k="41" />
<hkern u1="&#x201a;" u2="&#xd9;" k="41" />
<hkern u1="&#x201a;" u2="&#xd8;" k="102" />
<hkern u1="&#x201a;" u2="&#xd6;" k="102" />
<hkern u1="&#x201a;" u2="&#xd5;" k="102" />
<hkern u1="&#x201a;" u2="&#xd4;" k="102" />
<hkern u1="&#x201a;" u2="&#xd3;" k="102" />
<hkern u1="&#x201a;" u2="&#xd2;" k="102" />
<hkern u1="&#x201a;" u2="&#xc7;" k="102" />
<hkern u1="&#x201a;" u2="Y" k="123" />
<hkern u1="&#x201a;" u2="W" k="123" />
<hkern u1="&#x201a;" u2="V" k="123" />
<hkern u1="&#x201a;" u2="U" k="41" />
<hkern u1="&#x201a;" u2="T" k="143" />
<hkern u1="&#x201a;" u2="Q" k="102" />
<hkern u1="&#x201a;" u2="O" k="102" />
<hkern u1="&#x201a;" u2="G" k="102" />
<hkern u1="&#x201a;" u2="C" k="102" />
<hkern u1="&#x201c;" u2="&#x178;" k="-20" />
<hkern u1="&#x201c;" u2="&#x153;" k="123" />
<hkern u1="&#x201c;" u2="&#xfc;" k="61" />
<hkern u1="&#x201c;" u2="&#xfb;" k="61" />
<hkern u1="&#x201c;" u2="&#xfa;" k="61" />
<hkern u1="&#x201c;" u2="&#xf9;" k="61" />
<hkern u1="&#x201c;" u2="&#xf8;" k="123" />
<hkern u1="&#x201c;" u2="&#xf6;" k="123" />
<hkern u1="&#x201c;" u2="&#xf5;" k="123" />
<hkern u1="&#x201c;" u2="&#xf4;" k="123" />
<hkern u1="&#x201c;" u2="&#xf3;" k="123" />
<hkern u1="&#x201c;" u2="&#xf2;" k="123" />
<hkern u1="&#x201c;" u2="&#xeb;" k="123" />
<hkern u1="&#x201c;" u2="&#xea;" k="123" />
<hkern u1="&#x201c;" u2="&#xe9;" k="123" />
<hkern u1="&#x201c;" u2="&#xe8;" k="123" />
<hkern u1="&#x201c;" u2="&#xe7;" k="123" />
<hkern u1="&#x201c;" u2="&#xe6;" k="82" />
<hkern u1="&#x201c;" u2="&#xe5;" k="82" />
<hkern u1="&#x201c;" u2="&#xe4;" k="82" />
<hkern u1="&#x201c;" u2="&#xe3;" k="82" />
<hkern u1="&#x201c;" u2="&#xe2;" k="82" />
<hkern u1="&#x201c;" u2="&#xe1;" k="82" />
<hkern u1="&#x201c;" u2="&#xe0;" k="123" />
<hkern u1="&#x201c;" u2="&#xdd;" k="-20" />
<hkern u1="&#x201c;" u2="&#xc5;" k="143" />
<hkern u1="&#x201c;" u2="&#xc4;" k="143" />
<hkern u1="&#x201c;" u2="&#xc3;" k="143" />
<hkern u1="&#x201c;" u2="&#xc2;" k="143" />
<hkern u1="&#x201c;" u2="&#xc1;" k="143" />
<hkern u1="&#x201c;" u2="&#xc0;" k="143" />
<hkern u1="&#x201c;" u2="u" k="61" />
<hkern u1="&#x201c;" u2="s" k="61" />
<hkern u1="&#x201c;" u2="r" k="61" />
<hkern u1="&#x201c;" u2="q" k="123" />
<hkern u1="&#x201c;" u2="p" k="61" />
<hkern u1="&#x201c;" u2="o" k="123" />
<hkern u1="&#x201c;" u2="n" k="61" />
<hkern u1="&#x201c;" u2="m" k="61" />
<hkern u1="&#x201c;" u2="g" k="61" />
<hkern u1="&#x201c;" u2="e" k="123" />
<hkern u1="&#x201c;" u2="d" k="123" />
<hkern u1="&#x201c;" u2="c" k="123" />
<hkern u1="&#x201c;" u2="a" k="82" />
<hkern u1="&#x201c;" u2="Y" k="-20" />
<hkern u1="&#x201c;" u2="W" k="-41" />
<hkern u1="&#x201c;" u2="V" k="-41" />
<hkern u1="&#x201c;" u2="T" k="-41" />
<hkern u1="&#x201c;" u2="A" k="143" />
<hkern u1="&#x201e;" u2="&#x178;" k="123" />
<hkern u1="&#x201e;" u2="&#x152;" k="102" />
<hkern u1="&#x201e;" u2="&#xdd;" k="123" />
<hkern u1="&#x201e;" u2="&#xdc;" k="41" />
<hkern u1="&#x201e;" u2="&#xdb;" k="41" />
<hkern u1="&#x201e;" u2="&#xda;" k="41" />
<hkern u1="&#x201e;" u2="&#xd9;" k="41" />
<hkern u1="&#x201e;" u2="&#xd8;" k="102" />
<hkern u1="&#x201e;" u2="&#xd6;" k="102" />
<hkern u1="&#x201e;" u2="&#xd5;" k="102" />
<hkern u1="&#x201e;" u2="&#xd4;" k="102" />
<hkern u1="&#x201e;" u2="&#xd3;" k="102" />
<hkern u1="&#x201e;" u2="&#xd2;" k="102" />
<hkern u1="&#x201e;" u2="&#xc7;" k="102" />
<hkern u1="&#x201e;" u2="Y" k="123" />
<hkern u1="&#x201e;" u2="W" k="123" />
<hkern u1="&#x201e;" u2="V" k="123" />
<hkern u1="&#x201e;" u2="U" k="41" />
<hkern u1="&#x201e;" u2="T" k="143" />
<hkern u1="&#x201e;" u2="Q" k="102" />
<hkern u1="&#x201e;" u2="O" k="102" />
<hkern u1="&#x201e;" u2="G" k="102" />
<hkern u1="&#x201e;" u2="C" k="102" />
</font>
</defs></svg> wOFF     Z                            FFTM        cvGDEF          GPOS      	-rBGSUB        bOS/2     ^   `Mcmap  l    olcvt   	   0   <+Xfpgm  	8    	zAgasp  4         glyf  <  B  rdFhead  Q    4   62hhea  Q4   !   $hmtx  QX  G  .loca  S    maxp  Ux        !name  U    fl\post  Wt     zprep  Yp      D"webf  Z       hQ       =    cI    
xc`d``b	`b`w@1  !  xڭMLG,miӏhc(4)1 bk?LIcҐx@WCXjEQ`	~A.zSNcv+m/23VIeg55ס?{޵[{>j6)yyٽ{)S4	EsNh/rE,LEْt͖ί-r4\:/xOT"H'ĻK?lV:_r )X	IOttJo2OuzMF=|NZ[! 9 o 3< p.n.%p`:܀pIG^cz^UyPGU~Iho?C 	|O)8O0?!Z,*H,l׀WrYrYrYrYrYrYrb{uYY!ќFƍA88GBDG4-Wúrju_23/Jtezjj`L&'~T@.Tғ*wU@%{YPPFC57͡ABgeͼkVh-D
);;+͸G;/bxgdaE0W`5j7&Zۼ6[2U,xU;vTQ?UovoY0:4tgϢE?~9ϢC?~>k9Ț#k9rhʡC+VZYheʢE+V,ZYheʢE+V,ZYhʡC+N6tl/C4-
m=/}i\/w*Cu3tbеkC׆]6tmеkC׆]6tmݥ,UE^xb[:Tfdh[0~fzӏ*:mή!vة=G?Η8MYxb)s_zN[{+icc-+KïP*YBoMvV&4q۽V.FڢvNR`j1V^}Vc:z 46]6kDzc;~XZV}O\ xc`d``bb``qq	aJ,aPI/JfI,c``aH`c	00(0I(TƜDYz"z`h[fO7`ڇ5
H U22x    xc`fqb:՘QB3_dHcb````cfeabbyށA!(Y10p25(00ɱınR
   xc```f`F1,	%d21g4df`:tBBEYԿ +AA@ABAE#P?G|plzmX?%$F6VF&  4,l\<|B"bR2r
J*jZ:zF&fV6vN.n^>~A!aQ1q	mݓg[hɲW^fu6n޺eێ{vPybaA,Y`0՘b>Hjj~w޼'=~=ޮ	Nc2gCN20j 	xc`@_AuK?޿g\X2]xڝUiwF$%u3qȄ-0i*v!]],t;Y)#?6'GΛ\cDOq:Tr R>屒 nV)iDl7;K\vr*3%A£W' H4IO?I8(I)8f eJ^R6â*Ϻ`r#\^mq:Im=Q@*F#)9QRRZL~G22e+*u۶uQ4SuFlGDy6N'ζ/LQvͶ1p)%3}tHXձ
ng$(Uy
Qo fg/.dE@np/X)Q\EHJOĉ>xA\P"̡+ά54^coWJMIFSw"Y8Glk>Zݽؑ9qwY'󴘯.7@<)\ڷLQ}eSTh*)hM1M{5wL1C{H#9!7MrӾܴ 7Bnr^@nZܴ+Fu4Χ*idø5Y5ɻ!u*Չ/ȥ\\wiݶv_Z3ꆭ70Єo7uXsPA`R (kN q9MR}14}/{<8-]ZDuܘ=[Luud[1+Iyv%UVދj|dpCh=v)MyT)JepʃZĸujkz!H)]ߴwkxt#9Oq(x~tm^naJ>S}TV-5ͺFNXZ@MHU11eM.oZlUw}sv_esȺڠ\s$E@얬zg2c9u/LNYhS*˖]nˆ9vGhlixb{]\ 84r&6]zjlΕD]s8K7Ǯ|`=ȹpr>%3rn|N!%rCG#r6$+rbrrn<&	9_CB6&Pj6k>}`هzdK"RܘPR_,"v$sah     xڥ}	|S-[lmiЦm(K@);-X,"""""#C!bqy>!C{Q;g93A!D	$,FsODrmG}av;̎2"VYx2} QlRh(cC)"BŕfoNxsl35:~Բ	FLgc^vTkGRp;l	9)Ss <BK pfє9~{dÕB[gb?^BB>GhԠ#HS'!To	8	uzJyLH%'%&;,jĒCS:I|b'l=1Gk`;1'K@| 7fJZ-5w=9X76(MEa^LsZk0й$sx݆qTW CXX!̡$F,♽~XYĨLl#ӗ1Gۭ8?{h.wG9]}?G?sرo)+8-E/0~Pu3udޛ>eKtwCqer@[Q=HHeǦ H@gŵEvGF D+6:D¤AHsUzpI_<ŏܝ #{cA0*PQ?1 4UHҔSbb0t:<h[d#-FDfTeZ6Be!?BÍؚJͥ)0t^εs^Zj9}y"ۗQk/g]˫7_;65aY;?q_p=yDS><i,vn| a>مխ#J	<e+Q v!U @CU(AD@όG#
C^d2GAG$XTԈ8rT+d+80_@}p^0y%#b\p`ߺSo-^oY81Ckz'nf:'ŴL0I̜fQb*\#?R0`X3&y6NRȩn±c+{X:fI1X l&ըFaal{|2M\3_ +'˿ð]_)E+wKnǞ,xE~oV<!J3#x3x,;wn*"X A	F@rbG#avSz<#;Es嵧n6wE" 2MNyrxFD(ﶋiEg?ǲe'I{
FwͳRF>1'/\q`b\Pӕ
YؠjY( |_"& SjsO'J آ5=ԤƆM
BeN#Ȉ"aRQ *$*x'q+x\3&߰wN*	|/8v;9`g	% [|F,y얏ufh
R_n֕1OFJ`+AOǡZ$@8L(J  =!>jSa*!k/ħP^r|뫟NxE28~תG-x+>2s->F8X)L"9 HQr9>񓢒@3cN9>֫.Wnx姍'?SWgx1߻__rGX]:wfVN{o)ov>XQ?_D]oDṢz.4zei`Nau:|1kg|8?(m߁r@ *c?گ}ߝَ5PM8p\HA@:E#,FFD	8AƤhG݇Nw
Ȝ}_+}c!Ls_|O\XWݽxrZ [-qL,JC%b	6NN+
R[GAs$ǥŧKc˴a7<^Eԙ3S{q+3o=Sw?/]|qx9'|?xs_w8i͌c` ]d.dRg6L/Eь߃7/(>t9QfX$DDTq6vȕJN4E;%&m`vU5y+v[G6\n||'yO8yֈQ_+_7Zމr_nno˺a3'O<MecGG8ȉkbBEJRS<t>EdRM}&NIHU1bZ/;$9=ڇ£ϭ?葏C,<cp{;YW
ؓ+{m;}yR}Iu#^QyrVv]b+T5̂paΙR6~V}EU[Ьpg.vD@i`l.YP?98iU;,,#|YI38	f/ɫLM?»~ρOt|ż{!,?vG31@92`<0"{g|GY69yR^|Tз\:Z<,,K.Y6+a;:pgICb@皃ƜY@LNQqtl*U9* #Yn*];w]7';C-ó(?B136_Rvz_Z1!spy|wL4v0 u~kRk3bIU :L?@I&e"jgG >9måB,Z\X6,vS-N8$u"yp:_<"qY}i[|vI̽z+-zy>l87W@҄#rTw6zC7`nOn;4<~O~L~)<_<?㩺| ұNa?pg$('%\fH5M&VpU9Uz6Uʞ]D7'<qCF1a2҄,uRE'Ü_F>HF>L[.Dh`PAfrb\=b#CfS<Lm;N[( 6-Zs{Rĸ5+SVW̛]-{1Z`ggUw-l=X+АUu9}f|@͍K٘[uGڼ7/9gAjv>Zn33Y/J ̈́L|MpvaDbҁp2<lR
2k!*@~j'7]n(>/ۛbϫit{u?n;-VtRCalMnzQȨqm,DA[^|~IAe
7@d2йw`Qk$XK !1GT0agat:9~[?mZqҽ^n)%o\~@v4T~_W]LC~] c)Dt2)+?Gv9v5]O,9da`02DK)8&6qxJ0x Αߦa<qwx'ITPiA7F>2KS|h`S&׎jqvcy'l.0|4%ԋ3٪7İp3-`A|/&7, c}@)>"sɄNQ@BGXRvC+g,"$RKIxhS%r6 	~7xuyB^_#L/Ty~Ve@kyYYHa 973i@ӻLm,{,#;E>%uj\
~B;1]<2
ǑԶR
2/OGmxwHr]"ja!;!51ۺbѢCPhZY}/o.:t}K_jxXF&1eEpeә ^! 7J◟Q΄ssy{w[1 Z8k1%	%]g97E7c$Ka-M_]wijWqť)cCQQ*B*YwVvX\)R:IQb|+W-dęcA{˺~	EB{o=/(.Gh4V($xI"6}ԑǶ`+) %zrٓ0G8pz_ws|U̦{g[UKIcc˵+3{CF{I13q~;Rx氄WG ,?2`Q}LQVA1l<4vW
)%*ȃ8M+IyShk#}fE	w_5=n6^ 4C\3StM MC'fځ(Q"1)x7{b'<<]]rd#}0`4S
"ޒPjVkq
\}e<w6\/?E(FG3kq%,wD@˼s9o7/K xaJ>N"f	z@b&Vj;,ߋgg$9i'/.1	4x	`3HPDԲb1s%AZ\ؼP><NƵ/
#Z f٭3Qg1[:pp[38m|ɌsGmQx\_rPO>${^كY''⅏.Rd4(7.SsjFοPOgNK^c,|R^.g?H^	Gj>?,ScM37Ϟg^ITl먀u6F&W ۏ$qhں?ǱhOXJVMQrwD۹/_>Xd_ʣ6A=V<)hr`X "ym@ϭp3R-&EL6ʃ>Y0Bl@?f(>֚bK1"B"3PBy9)z!%wM]~w1(V{Ϭ>*vM"4@p=fzf'no[SMc	{h`Aѕ?.:
((3VڰMFq48%J1#=oNTLVQFf̲U-q$|Z&6ʊ_ov带/wrZЄvH;f+QgXNِP8LAX/sb6>ݶdGZvq+g쩷|vK~cQ. 3qߡ?b;b;jcl6Ƚӈ}G9o?LX!uΒۀ(Y2jP??8>\Y0{"M˪kܭ_{+c`Kh($`AFRv"
:-e {9R9iFl8GL)P{L}O˿qܞg{wdFӤm{uj(ܣw|$pMZjNr6?܂y<1>'%@cV#R@OT! rR;6G*	'iB(tzE+99<lHF{&dؽy\pp*e[침q[몫_ki7kXncl}Q*B&E!EKHہR@/f4M!L|DT)n
UT_TP/M7M>K$V%cqtYX`W=,^۝Ϙ}8(zUnߖ?U+-qU\2-ۆ^r3FNwdJMMX[n3\{5%<}.w|`9781c҄1;#T\j`^@iaT_1cGL6nμRj*OVo5e_'父O7b&Ǡ:dύKC{Rԥ%WL1qIG%LTW4pUDeu~U4CU^m3A1HbO* az`U Ζ3V]˝΋i?:XvQ5PKI{dF(2 B<NRmŵ'ʻPv&*Ț6XhTfRi)M99 r><>/IC-*NU``)1GDke 
;	1:hR1#O.g#WaFi8MOm^77TX5w?ZmqS&dW*L7QzvnX~!~ghgUѝQB2N.u^-a`<.t]LBvŪٜ̰\&PɏFϲsp7~k|?5yXS>_z_~PΒly?2d&=dh9"A1C찑nQtCڪCr0s7feKGщ7^:ZY.rk!Z2>puƈRs	u	g> sLq٬ϫB!;d7#c45++?7PSqa[߶)~ۙ`&N=W0ׁJjԅDDUVTQrB@-""*>P7a8R#q$;Ksi]9]Ww"$ViSA\>kN9;tvܙwQ;S\j^&7<3俟|WNYtw_uׂaų$9: ,leΗ8Q*h95GbՔrh-:vZ?>Z.q%hcLw.;Hcp!d9m^chݚx7sp|Mo-"8{&p&^=tzs۱HjCꓺ}bІՠp=;B)k"R ΢[oSL'@_k_"?ٙ#}>s\xL~e5dI8ad0_ۊ+K޵Ev٬Q`n3U."&qEC{q,Kh:1aD)D׸gM+'e~Óww7\DsߋJ.~c!ڗ`F5oX̔9G<O<W|!!cG& : O&H"A |ՊvJ	d0q>|1=@}V҂8H.y爦j1Ca]rI%h.~IV/9xK@&!2Z<xaRPU2GrRm6[a	|YN=OTExweݸ&zHKVԏ,vbUK*FO$.LT/JDM1}$ҿ\r9vgn7Ȟ^vՠC&|sJkvçN*okQp%ȄPF0%&s=8NQJTq&·}%
@Vn"fM,kΓnqĈe/<S=Uz]_rCG9Z璢
ҿ`û%ȎaMJ"1(̑rt|F$2$DYg):)XRp}̸wдu%og%v==B6yq%HND`~M29=("she̵#Ȕ~BYQ&Ϊ0:H8bl4G$zh:F=m~F|Q6+-ʞ)ZUO0$Kx|ձ߹`fc~sɊFZ~ǣ~\oo45s^DRG_:QJcfUT<#(O>1란̺<&Ig>Xa3s4lÙYqK'Z_{rѯgqNx滲|R}`~͟筣?nE2wBNA-ڭfM>@Ec,S,&O"2Wz4V^i9dh%G|PjKZiXyY~KzɺGg?g1sGӯXaioeug6.Y]nsf7:P)@Ӱ	Ӎê	tJJѵK>%罒S?[K8i­'G<	~~+suzL j=O?_~azGB5m|З0d*z>edVUI`3Pzb7p"DuMJ%|Cػu;JU/y=VL;u7_1πܵktSݶJ̿OMO~Xzuᦧjߨn,񴼵yG^5
=مq~lCA+bq^9E4R 3jP-ݙ;k&^1fJzвW
ǌv$y#&S%?KA16˨i&P"UE){EFQpBE!2-RAD,-Q,t{s]<⢅\cs4g.|OwwGޒ਼GqOGxLj;wnW''V?hxf=sH~cyl}Qq*[,02VzvnMZB+hR(RIs'tfjFG=yZ7 {RX%^tiv=`1;mn,z=MCdɯq5[zÌ@IcFpEXG<o@ivl8{M~wxw?B
=}K`O\A{@3UbRDp9:gt;͎|>pr/=09Y*"[%!~P9畒Ey9Y5V+V'ۨRA4
6!nYv\;Nheh:D^nZ˕
Mi2GntZd?^[󖼺(oń,k:8C>4Hw\mW<灼x, ޡ#i"x]-,;T*eQ@if6~M0ƇL~xCKm{SnpCS\l3D͟X%jL6D!HCEUxks/j+h2G	C{GJUz evWrs>5(@'6uLV6YHSEOxpS\=
:w#)䲄w9{FVt=)eӽt.WzeD-L1Bm5u?\d٨+󊖦WO˪>n??i~X+t{P^qɯ)x6+V3z6lTsDA_]f\s?W{<"k/aH4Kɔ&<HusQD|p5|'aF/`2>h	`,z}=]MՇlМG5Aˡ=~,8co򎶉rC\VpǏ>I(Y/(VAn3tpq`Qu5RPLu,u{xN@vqws^˅!I>-a^%-idƪw9IB&نEDJ\~)<;"}Q2!ߌf>[cKMIqM/z\wI,j$ UPZÜZCLG_:_l/.okf]5q>lRY'u2cEh+S;[611nçOW\5xfyFzPwZ*(x<5l#-ʳ_vjr}x2CZ:_"?S+6S*:;<kB4s{؇&F1'.@H%Y%-}``uIP61OO=XQ,ŨDk5=]J@R5K#jWSiiiiif3e̵֡Z)^SLJ>,a.zC\,X+ZF+> "-N6CH4'zd0Rڦ髐^Ohj=2CJ1Q""l=&{eJI2EO.a&JXzֲlփR asJ6@ڽc]qYKJ1VFku7ӟ?A'3ipk	1lUU[tLXZWTW4QsmeG!R>@Ȓ\)J ("t	=/"P'8L֤5QID
lF
[cclpH!
cl HT4O_sh`}$:V2hF}os tەk2Y҂ETm/T擰pQ".)3Ϻ.Et8C TH!u4E@]{l9JJXZ%-tYYhzj2&EM1`w:X~R9%m,R[:NȺpԎDjO2Xbs獄߻vc虎83	$!;SQMRX'(jn	^vPNDXlG6dRiVq$N(Oךaװ*+lD,umRԤ*|u	E_[H-n~I؇P³6!v	H@d<t&5`@\:fAJHv:
X3f`ؚ*-Zǚ.x1T}/aqGzZ2
c]_dZB0 ]Ђ{C# ^?_AcxuuBuS'voKx-^ml`  qeJAIlqg~|	Ѡ!TÊDG8|i֪kY>K	m-Ysy֭?W۷HLuvpdyhSt53GտݺM$QƮ(4ӑmX=!3D#WrUI A:NLMJGE&.)!p %&BG"|B˥ ])a/Ch"gJrI	_&lM`rR$ W7zh7C6OMyZAsHs9BѲ-oCz$>!>-k]8+YGG8k|gnOi;="s%)w$&jDVZ0(JN'eڑ|Ui(8vf`֑t&m8m2!\!M齹jU[VbM9_w{>RɹLظ@{"7<C5krzPו{`L+\Q.)1p`ݝ{2pq%v^:R֬[Г ;/z'Yޗe^03:stփG|Kx{w/[m(THqF6I,CI`4k\|w>q"[>%9.{V,܋>MLFpY86@\ _js6v?aTӯOzLՌ⁝O/?6tCcp1rو쾅3G/Ͼ֫O2~~n3?|~ؐn6{7_e{~fʪoyLI~ye7q!={X/zZK_Ch{[4Xgv<j}zO,x㰢sTZߓǤZ:!rX*4l%V5{_VlKKE\׀Ns/x\΁=PXp.E>t@O4 "y=4xaP}zAB"B{͈Suo[z]YZ}U덥:hU`0bRc'.X Z},ޜ쾙}R}N_o?
oWBЍ"AtG˸^0Q (xϦnAoeO{鵺p)4XiC{nLivx5 <|+ !~XY)Lw'H}&G`-%#wOtF2=!z^Ѓk"Fi4^W[xIj)++
`9+QKxd
wS^AKUot *tA 
\+<(;#ѠެA~Rh,f֫X{Kou rw"vm37÷4tw7-[sH\ks*n,)/aPnLd+<e]ym|őѓ=#Vkӌj~V6ڇaJTr.!Fp,9sA\8"\SX0z*\I?sm\XVPS2=DRbu@̅Z9'7qi&.t3)bG.U*BZe\P$>$r4}i3{6GЏ'IDM/Jg4vV9mvVo9Bա;; *MҗӯoOlAJcJ|t71=QVs<jM+Ό,̟Ipq=,~w0!uwHWPV
 JW'C
`^֊wC^Bϰ'S4R`b'T=Ťz_yrrƤ${}SZ4/j1EvQH%~W8;__emZ-ڦ~[;dF\_<FHL~iȘ[[fv-ǱikQ7;4mtCޙԽw)~xo$
v{$I[Eh]p,GczR)YYd>3b?a7A5O ZLVhrlYiT*"IWgxA]-2sb~c03RXBʋ&HL	0VvB~X UQ7EfMM%t$OO''evҖ6G;۟H.`FNnR;LsTSVŨ]ҋ$R;!8sY-%%#*YYRZAiN4j&6~rXf6~:/}T)&sI)K69NvG'3֙W+q"i\eIeZ-oD.rAy>@W^q&r6v53f~+&0^4eH'E9tjC2pm[J;PlG4u_+~-JGv(rɵ,Xm	1@DY0%J;'}9{C+zn_Zr<;DQ3ν-'XNzZި-vos{,$oӣ,ְsQˢІefijaFN{tآi))?R8i%*"QRBTzXhzvsL6?U{&}ᬒDfy#J+o9o=~఼qQo?}jk;iwQ_=iPEuc/ØA5.fJqd^c+5g#HwKZ,tciڒJi+	b1ގT!yI^}>n`v!CD|fr<{jSp:/`".3uMƂ{tB\vvy/_\Y+aI*2eTw=v؛E-&.[-r2nJ6z;BVkF6Ӹ?Dq9%7%ޒo|o-L-`9QT6.^=f	C>	>I/@3tD;/b͡F$ 'vF(qw0P#6b`zE{!/^=ǚ.8%E_4|ĈYwU;jͺomtY1nN-+qĻMW'>@3g-	i}78b0?7dD	Xı{HF=Z=jeؙ%'ms$a;tk,ޛ'D7'[k-)x?'x݅'=!nzšu5MRg^5g=)߿O8<s9nufכz oh-kAzPhb(zҐM!M"tg2g#9OsFLN?8xqÓG} rϐm;roqҊ?=Nk r^`!f7,X=@[37j?.{/[`nߋʷ3Je]?x%Զ~!t|,[C> 囀"@4" P~BWa}%UQ#ob|oa:"B-	R ͟G,#ӟΠSZ!9;4G
N{E*eprejϐ6>.QlVpy}ܰdWgZvOg߾gӸf9D0;o	Y5ǩ!0{![Yߋq%BQjp[2r[c]N//^GP?Re	#>5nv勔D71pj'jzIob@tJ{3cڏYr!ߙOa~B'_l
mm1Wz'Fzl	+3DSM[#VlXLБH[X926	<G;#&\;?۝SNv&˧>8 7zz#tX䒭ڈ%=XdR-|ݩܰXo{Jnم$*>c9#{b~ބiw<dF9zxI$<[<Xr_楞[5M ;cE&z xi'"y$<C;~!gMy<	Ehh{AߤΝw00;ݲM'&+><&Kȷ0+pkx6csų7o){MH _*x0KP+7$ыO:OR;`L?i+r\L9Ye=?"T_N&IA2^2t?`vQ7Lh.qM5},%:Bxa%&~JD?|lGG\UHMk%5-2"UDEʧ:6
EFut-<h`r'#JT:qX.sjn9BwiѲ.<qǖ-,09ub"},\[{%q.-
OzOa6HݷvMm׌=>Pw-K!NipwrGD1u~Sh{L۞)`W):Q#PT^^ xc`d```x=+<*'a^ Qxc`d` $Ú!A    xmAHA+R<	Ez"C)HS",BxēRB!-R($C	҆RB"=R$L3{;C dPy7hHHf0yU7yY!j-$T=ScK|Pϩ@ȢݯfǞGo-_%7G]$)n;Pz ?#n%^w%9
klJ932oNT|2Q=i\G,	ݦXRW&fS P+ޥl~ˑ3Ƕ:
2ʒ22nj>sJݍ7UZ}sNumGYQ5C!ߑMb~;U5o^SчGoO0f0@ *pεF}f$f6׋}K?q9Dܷ*{M?v(AE52D~;W=e}W*7/jk>\[HGH8I".NY cWm#M߅=Y=	 n!¬ xc``Ё(&{1LBLS60]cŬ\üK9V$OؖaaWa``?Q±Ӄs=.%\p[pp~soG|\|F|a|E|Sv]ƟL@G` `!%B	g	"'FMt;1<b#׈P_$=$I ON.5C2wddd{dɱ %o% ?M?UL	O(~SRS*P:EYI9@Fy)O**i*sTN|SUQPmQ]&f6Mu%944hhNݠKN$m:t&nӽǡgץwIBNAA3CC#[:)pu{O?3a2Q0q0I2dr䗩F37Mf'-XTXXz  H       H  <   z  n  ;  xڝSJP=iqep!"6BqWD)T7i:X i(.
n~{օys^`R40ϛ1qo<
ł`,q<Z'l}<LliN!~6xy{Wo;젆*%ܢϻO+ܰuN'J
AIRG`8$[o	GԕSD[%7@@<K<CZA_;Dڢ.HζZ]э'zayjrF2UԵP/;uwQ!ϪDFdDN ߒBw#j7Z~v`=ˋtUWwJn҉󭏈~jRYoq_JUZ}1lc*	EnXפ!s3LoK,౧  xmUlqm]۹N놷ݝV	^nI+t\>_rQ9^/DI4	3O$L
NdMOQL	5mhK;Ӂt3]J7cACǊ;e8(C_E*qa `0ag#h0qgd0iLg3Y:g;[aIyvQLl3{e/GI381rb6;>5yC1|g<)'񃝼9/lb2ZG=i H#!E|b1Khb)YEb5_%^qS\5x#q/	(I,)*i.)Yip,J׸ɕ<gHIHWLb(UҕV]YѢnTjJ]iUڔveҡ,W猨BFID+6;o)j+OX]iUNT   K RXY  c #D#pE  K QKSZX4(Y`f UX%aEc#b#D***Y(	ERD*D$QX@XD&QX XDYYYY D Qh  )O  [N          LP [  @(             Cw                   O p e n   S a n s    I t a l i c    V e r s i o n   1 . 1 0     O p e n   S a n s   I t a l i c     BSGP                 pt 6 FU *:xZWh[qJx"cr,g,E&CĶ@rXY?&+uLFMlSud	Ɏ+"be|R)N٘*7r:A6hqcB;}-jVAַV@PPou@t-6~x5./[<ЈC5;IbbR>.՘n&v =zs#$
â-D[(DH00_XS9wF<ܿ\6]n]2|(˕&l3QYEK-:Jq뱤z)๘=l
X*	϶mDFH]`K7BՅND%#@/7'# */]@F؝?6p(A"&4f8e"	>{pԀ}pրցY)	#pJ@.`7 Q"X19J=8Yeȵ/{e z.WYmb	ޖ [A( KR䞕+"D$޿D'ynvz0fB{ZGRX:S]yHr)>lv{Dyaܳޘ.q;FD)
6k{0M+C]OUb"HAuvWb?%l)W[--&ʏ^S)߅_X 'qӐAƲףi~t:?^+Y\K@ojc~̺AЭ~v'D*kLPbVJTh4%i1	x^(Čb tbV1cTc<ѓPr7 I܇o䬕YU8:7%֖HB2!lnn: A
h$ )Ct$
X`C	hCRTɄ?8!rC~_-65/kׂ	(Idm.O.c.".B.bd.r.eRʣ}~J%M4^>A^=p
@Tll@<+`7@	r,@(`X$4&KT3B*`xN_%T1a_gA D;{l	,q6F@cl/XN(@N	sDr f|!萑
"/VB	\1rP+U {IAtѪ59tj24,SP{]aZtrvAH.:BmAK:B[V̀ ! 5n_Qģ Ԕ`|EGŽŞh+i&:uYF
ѣGTk".6Qxb#!P,SRG㉮KAO`V|= fh@+rTO\,@U6Q'̧5xo
uM@'ЏkU9bբ
7M2xW)
~CV@$vf-"4lQK ?R]wBN 3#nY`4Q2@@IHJX}դ9`ǜY;M쐉!
.RlBmr&	eXߪL1f59w5ތAjơ1i8GiVkiz0@N͕Zpc0<Y Ƃ)mvv@`rO@m	*Рɒ`PC75tOcv@y9*>h@z0`E!޶CM$С|zp$=	A`NUķOAߏT QBxG8	w7m޾=v$X @0IpK2SOkԁJGHkkDQ]*>hu%GNۊ@$T]0 0 %sܼN@è^m9"ԗ	E3;߲#FhZ!_`	{B{x#'	z	vE`PPM	 SC6
M8 LEoƤYƛƹps&C:ΊH}غц-\`"
$e5yR=5h0"=߳ٝXAvŏC[%.ǲm):1b$d T9vFЪd!"pTguQ}*Jc?A#@_-΍6A/ěj*O ݘ3XHAN`,Uzfw&
@  iQ90?]~D2kSYҀoؑSupWVm}&?㤬^xȐ&LrE5),)qdX\"MMʚ폈qሸ+WI~+ ̇lb3ŵ(eD9!!DD#݋+uL "@>78p͆$Y%mF-ՋtHx3VFY},a$3'P6},#gE' ߍ0g-	o(MUJp(>RLԧA(j-۶!xc.:I<K`ANfab`<bgRvQCTәDќrtCvbmYBwdIٕH	[wNR%,G05ij XpCBFuD2&-w:Iυf,D(9D,̴$." !FfԘQ'"q$(:@iBx
gp	BSGK<R7"e"MГD&NLݩӆdϥ(s.pǈ_\;>YJхH#6:n)8I~`+I\1ptxJQ@/$$S<3~V=,+b%APB\5+2$h+NF%'/ -v,QeU$¥hvBH7
 RK*"!U|+pRRI+RiaJ	r )4Ah`$`x- ؂a߄tMn$85m R5+Gl[܀B(ULS-A/kkZ%}mMTV56b@`8TʌdXӧIiINޓ6.3T*!T&2?y^)Ce-?uln.ߋtDKd"~G^h)Yu(K<e116.̀_$BI,6ah_IOPHϱct(!L*L]:SEq/F`pӾ@L'$VjOO Orsg_OppHo	z*@\|uVqS S5˔aR>ČmL c?`WU;YF%:O4a&8WCq	#ۂCDι9P 'ҪA@AڴiAQs,;DX9k&:!W'u|qZD-$U[ësm	1K4wnogjQ ?ky*'dyF_
MU?gJDs0j-A'*?'B t0q0fe\`>fyPL-GWk/qڢr]Pb<bHHi&l&إ7ܧ0cT1!$Cm
R
Mgd?Aw@tŅDGFh}Jt@Tzwh4`lmA2ǑY@arfU5#ɡfH[a=h-]n;t,,,xU0W4V,<'f%jzxU+RGn3qdS(UAWc'(R}%JG'-c]OQl>q9rF@ĩ1(H5)U}f2Z17Fl~Le],o#Zk0xذRfc䉕o3f#ci
&=l7}x(Ư"x|h×*v8ʢذLJYU=R1={G\9jXatsn;R+P7snMJbѮ2&uMH:*,'~aIr `7V̸;mC.5ǹbӶlk0u`1y<Ԁ@nQBJ'hl>C\YQ`d$-#M7ټ}I[Ow"$d/ifjD欓tKPKԕs1'EbM6-i0Zp_cEaY{+r37{܂1f,rD/(@	;`JI4ouNސ+ECU0LRA Ƅa~#!y,2ԅ!T>ĚɊBҕrpv3rbCك>t&@#$_o.-|rb*O4C@e e J3]gK^Q'eBI`|޶JPN$i30gf!X9lCm423j
Z<̽
1pQ[%,0N;Pdr]YE5!1Ѳg)cuBg1x@
{x4!
>4f	F{jZ@db@:YwdA 9v1	)\aL uJכoߚKP)g@@JZ2󹚧2BPEaAG۟MF Lk;ӽZ1(/bcvܽtp[}x1,?8s?#,ݲ¶b9; kDyJ4\ϱ/_JynJCR/aT9D;%srFmDE2g#yQOPjʚ<83ˣ F`k7@jlsO]Kۮk56xOPTwLY
yv%غMU)	fo싈23||md9!ߡsQWߴۛerUyЂfuh	U|'ix	Df5lZ>2 ekrjk(. --_uWi7൬6Ų!E_^H0Y2JBb2SWZ޽h,"$ "ĉ$:@Π{(ݞɚ~]obk㈵Gh &iIaQӇ ,FgKB5p *$GY 4ѢӸ&-8.%6`A ƐEFAdPL&b5Mg\AiGOY~=NgOfФ`uAIaeg$0\Rd1O+)UF:(\mt霄 a 9T0Ŵ\<'ql1)z,kre6OX( =JTyમ1ËX\{/yH8-O]5̘#d{ iI`݋GTl/3
q=jG	:C N> R<'kL<)אb;"/$-tsH՚BF7L$@D0q9Ď9g%êHY1MXNƴֈ8Od 
ˤIhvw`'MP3EdyOjܴnwV5r5[  ņ<t#=Lj

a%qsw!tCA}>5ȕB7p+p,Y(ȊTpӐywZz/nu:22 ~ܞ3X^A _0-_	 XlށvrqtFE0ZRQ(=G!GШd@?l@
>H?"L,#Q;bΖpU6Ebʥ4{kQR%pW-u-YkЙ6lYqyz/h&8BB;U(AW:n+y=T8ԇFW(B`ؔ~`Y"yN"BM
܁IUތuuX؈4okWȦpY)1]YK USFr/(<VN1iۙ˒`t%S,_E[bAy5yvSMYZ^6$;?jBOR`Ú8WlC\,Gk6\zj-|B
3,Yvt_ml67yxmlC[pA	>'eЀ4G㑚30MqJ10A eUOa#2Nft}Q|r1H;matf2n̔';<02h2g)+{IK`bz9/b"")'=S9Au4QܫV2\4)RhڃpnHXw+oCSzS=NߖBeDyihHlh|b^+j)&!^a{9\J<̐]vO&R9csL[O|(!DC	o<zCz)'neG9ƚVFqF%Q3SiPߵNxR84flN¸O,R&#sϾ&X1/^A,s͕ޗDkv1Qqꏒ8S$	cgNA  8ﲔcN(wَ$2k5򽰛B٬WֻLn(kG`I^'MfO:/!kvhOI[[Υ9Nj05P4 	"BxdF#KP}mp,( MMn%qDyrxW)c#h"C
lIQXa;QGz牐n;բUq`EuoHoNj	#dCضAr)}b9\r@SU 4Wݐ1qHEÂB8 x)S-~6ƶ&%dQ$QeZyn.AMNHu,!z9!؃!!NݐOew)*O#\BeXŦyg|)f"fr#ʭqP貝ڨz˾oOPU\_';sk2- ~^Q=y-.9C!َjhV&_<r T
vL.|	3ёP*L*YWQ8cxMMXRds&$K:K[<Ap_&qʪ5=LNx^;P	ej/P3k}֫1=OSڜC}Q<_g"kԷO	¦@sN`sg57GO3<#!}H9c5HdN;%>[1b颖Rb3"5CXKHB۳Йm`Kr}bH5`H.Yۜ[h1	BrzGsX~l{6D\BdޥJEZ:#9D9Dԟ\T,0`띡R0tM@"_.}ɳ	/-FXLȑPH}J=<L+f
b(?~dWTi<Og-.嗾&dCˠ#Fl>M+Bܛx^8[#tLCHvjڠnz:){ż,T(\iz%R"<BJR. ,@#S$ZP.>Ĩ	ZC5Tni	=!An;>(AvǦn	M_D XAxX>2r2rNw_"vj73472_h`xlL3g!=*LhĻrUa"nH.*8t$E)0#?ӎ	R^b?[mC}O8!zEi{iH V)VBF/b̊H̖is7Z}B6V \OIX_Wx徝CFh5-yb&E1-hGws?>IF)]<<p]WBpbJe{Ysި(x4v
b
19"v/OX, +dn$
cцwԕoܐ<aGa~/zbssJډqy
߿8yX<zGT;JQ	a7;g(8
?)iH:Lg &>N	%J8]64ݿo!" m29lΤwz& G5U6"[Ff5]e~HN$r,?EiĦFZh?BTCtGF{E %L*$A"[6bP%ZQ{`\,#?40[ ^N"NKHN6DJ߹?Nu$0qR ~'v5"욐0gH<BDa
$RBPav^81:IwZNwSw`ңxqGSDR힙C6'޺9ס:E$8 w,+3B\!FB]fk#{` k|˧)",:F~-V]MGsJ!3I6	yD4exmFUL\	NS1GLNB(*Ap!f?xP8]:Iioy"D PL9BgD)*px69b|`14D@@;k{CrjZxj^*WW7ZFGE~gIctZv+V(go?vAZH5]pUԚj:1H %jM9++^'	ac8 oP4EЊiEi0TF^}Ĭ%
MdVN+/1'>XLbBd8q"LnA, tf	w= xD-9,A6"BDI%~M8VCPǗn2&^Aǖ(kLt/	+l]C<!L[#4LKZ_I:ϓLO8ϩd(TzP#ӼizsM$EvQwQ]XTH#spo&z<k^QmaIуT)ZIvmRlOj QRtڛhQe6ǾJmњ3C^+'C&xj۱-*uV/7tZG`]3:kXqy{"; YOse]Z^ a(fݲ
jXCU5iȅF}yWu{<	7ƽ_Y^cWa"7k7Mi+&]#ɉ/XBRѽ?i%<$oA4LGL0Aeɗb{~B^ˇЌI~PCB݈>5E}el4$]lXj[/thf_%
8'7̈́uQ>}\ըd{fJIpmC004Q(4ķnӚ/H`⮂3e>Jv<yCS1誉go(0Ӷ~2hQsw&SI"p%BDr}4睻 4
J;!T5\
%[Ť𭌅+JB7cAI~ 2kmDO+֯a#P7EOlgzevi:#T9u8OmzR_Ho<Cgas@D6o|*#ꈠR;qCƠr%駊}&O@ޜi"s"VxVH1i#ߴo>M"xC~ <2q4'{U8q>C')ވ@`B=tw yCA6
Xf3ywzoQZ[܈7@vZjfdA$Јfvl*rHuyV;xBƌr+14$@=^6ʹ{lDZ?Q|f0EpDm3 emXHx@gDƁ(/aS-k* A/|$/j6V]5|tia[szsRE˱ad^\OFɥO7o5!k
ҚXԺ-Ag(F8A)/4cBXAM)-M s5AW 1C=uo5VؠM7ڃEU}FE#j7^I*͔}*-w#/[W	C:vF
^AIz`@ro(ߺF'6eQK+,sbZ.:ZA0vU<S
nެ÷TF6i4Tu1/wc6]+ڭ0XO]#o]S^+;;K?<t/L's> 2=5~og:GxE#HlDx72 zONv_R.Fs`>R0VH%ԣ1&\'0,֬)F	نI_zR 梳%{KJg%TOJ֮z\2Zge@I9Pi/N8PJ_y%M&%[~FHzJg<KU34NнB=THR'm#QЉE0͠)P(0Q5u#
-`>P2+ hn3Zivn4ސS#<À@[I9TpfN!_n@ X7
E0<JaC-IKӜЃ4_B5.>9k{&Eǔg2yI*PF4?..򠎫ߓBr4w($WwK<Kd@mk	$Wkf{&w$M\ّ
(=qhΟubQ/E O&oύw&0`ζL~85KO*%٤yVeK
9]9kP@r*m7NqV@*LʏP{M[ݞG\Qi;lJx$AJod	L7G?fF[*VV
բRdvRm~|W^9':oaX6s1h-.{DL?@(w7 c@PF-+5o. Z!D	Wpbb6;~JD*z$!)_,BfiB;"|	3j1:ˌ(%!<1^PE LM	ؔw:0g?x|_Gz"1ApwmgoكF*b-ưtFU6GʿUP3H
UF!RR~V@]CkjlQxqOL5o8T<`;,,^xB\	?^wti3F"	TjB;OįUƒ3b)P`8FǮ9*EpljM)%D亠`%C 'i8]Y0x%7g%*v89J GH%[&~a-\(~%'(URRCݮTZWxg|Xȝ".PA	)~.-Jcq9Vwi̛stp(MQU11|ː.E
ۭ9Oe~]RR:ˊ;V2`lmdxr\HDqb.B>%*.翳U{?rRra7OK? CY%E:bHko{%ݖ{XFM,.4*s`\v_,l	|[yэ֕gVfm7í%%=0r[V2oW!)ƣ|{	,~b7WG)1Gbf+G,l&YD tgl}FV~=]C`avkhE؟P.ـ0n `|a(ƮM|D~1%Zf}9ʻ}jÃ+CzsJ<QPIk聍f99i "b_h;O\aܳQ͚@p_ M1\nqۖgI*˄K5X`@ XRotl.S2㬊ѯEtQDc"̲2 -M3lUR. :bfs'r^fyJ1,+c1A%fwI]:#44ojʓ)1ihl%7#&'e>LQqh\4%r/>n+7_>SVw!2Tq+WpfK] סpD6"x&HU%joq ]~UY#	騨;GԠ:R92BZ3[[fB$g<SADDgbSftv R>wI`6 t;lLyy n1&R*5&tAGlL-nm].``NV^' -}O ESAtAh jv` S#AL^/Lpb
/	Y8@A77JXna9yĄGsA[U1ZvlJ>%׮y=#
H28]n3uD'נ@ZC_ CFw c*y8P6@~S+O[w
\G'ݎ[Fn}=Lݶvp0b6׫M
J\
]Go1ģyքplv|Ճ<Sy*/HƖI[א-PAK?$Rƹl(L"ѭLXS bXBJ9+ .)椞k2s6\Ŋeb*ng+CE;sWPjwn5AnF}
o>VWGR5K敠HHIk(?uCv)6ˣqJv	&)ϱ\oQʃΆAqQq S+GbےGZ'$9?ʧg̈4E1#⚶U5%-EASj[I}PX En剄47sNDO
2E%XT)؆hAU(l$O&yʐXbxlMmaՐi?/OG350``Ç
{$y!En\(؝N!q~}<JXӀ.϶0@ 8z	%At0em!_  cy*#8T ufEؤgT-Ht0@,X.[e| >#IWdUỤ	k'1nOHbKQ&b _&@f76Gor
Z9GJ)hI?<ʀ*pȓMzͬKqRܘMueq%m(ʪN	C\T|A㱅*1oaMk(9:].rTL	fUe)3we7\.VB	4H,qVWcⵜ,AJ(Mht7 |.8~n\UȂ=-j]x),vjr`+ķ %tDJytGI^dG`1R~<Kh|@O8AMa)}]7^l묿ѸEp?8
t1@ Zj@O]3pm]!x	g|R!Dp@$.Fv JyXј;kb&cQr+?)s0/A1 v@9EIlK_bIDkt։eeid"XhI7KJl?P9ٌ{f)iZߕ,vӎA:C:fGmB#қR&EBzXn6kEm 8huF(aa!:p\ьc%T-V\w?)sBAL=2" .3XL`$1(p\*ZJeIA-WCL"L䏀ǳucͨASixsPFzt:S]Q)+q>תN&%~P@ r'7:3{4Ksm

ǃr`Y!OZ[^K4?	*{,9fa$jF>"}HAeHQo,٧C0tDd$šja{ty8gP q6Xu^q|"Y:%BYhxY,0f-ylReQI^s4()fX'3X|U
@ PLU@Ş^k2I4wb#Q;b%Ѥ!?U.$?Q@
X`o՘D'h|8X57$7fu$|m0:B+FGgt #JHVk!Np:PY>[A^EGpмK\Gٷ4&(
`2c`yWbYz3Dh涏.hLX~vzh}`qQu
U\Dda#CnwP!Сϯɛ6wfVPЉkO'Qէ-HWQ4Es)܁cp#A[<'D5LԔ51^ ,c!Vګ_ZK!qsVrU^wYpI#""YNh.9pX@TܢN	cTFN l{71݊vȵ ShBrc5* JA
B~x9hD!vtJҳ'icCӦ.ҿNuŒceSy:pm/ծ8E}6pFdVO$ì y"͵ #317~M+#se7YۉHM^LKwX6EaV}jpD7~3mjw90veFy"]Y4Z[o +L`PЃ]#&eqGOg!هe|LX ۘv(O^/IF-=&C [7LH/⠔$ی+bO; {~^L%߼=c4O &hN>a-+\(Fb`>?z&ťsBλ^d#\~#,SX{Բ|Z}%)7HI")x9n>X\z:EK5Pg jYHeSA"!9~X3Mɯ䠰8d/C{q$d~I@рz<%o0Ђb*!+fI-^L
I%@X&H|Zb)àW5+ۂ>'=OS/5!{aၲȊۨn Yo64Ձc_\Ec4P	qsHFzEF,uzȕ"`1klc5	܈Ek@4Zet-ARpcp?t>XA_<,آ4$8i!NàTMx~L!=zUrŁE6JzTT6Ya"!?(C0lF*:* IbDQ0~A tm;BSr[}ӌ4rIZlT1aQ3O8l36
`R B\򢻋NQI
VR>
I)kbnw|yomx4"vC؃9Lx}ߤL댗x'6l 4C8&i!@̫B@yԞfѱ<#hM d, ~}E#8L&C0OXfTmH/Jf*U]3R9>Q*UqL&z2"i;j8&SpX͋>9QOFdKJg35l5hHX!)&Jym@ǍXSsULH>]jD.pNYXjdesrkO@ fٰ?5ło'E+M5[FYpgry	kD0%EIEjNt	So\1REЈK!%ژ.1^=\GsK3='3
RB'-#)70kp%,S	!wB18$6/BCm`Kw@V{f68J79ÿ6] ȧSi' 0 DbAmiLO8=G+sgZ+6t+ya/f!\WӦؔRmSH-3H]@ 2&sQ1X"&=E'ei<xߧD
V)*}VYK=1u  &xz1OVMyꘓzY{Mtit,)SYL|d݋!PDߐhyXtV*ZF?6/j</%q՜_&Nkk-4S@,\ʴy#$<A'J^8җDik%x,+(_C$7nx8ޕ.e{Cc?5z%B(SR/K+TPhIz *#5<ZU3Q#T3uXou.( 
-3p8̂LhDq #$&Dm;ɪ=("Ó#߷]p0١Uحҵμ[6xݺIbkk
ØtYΔQHVUMEi$`֠1	AyQg:@/d4srvNG|Gdq[-8ym=[ؒ7w
f~}=C`<>XH!$̃u\0?f _h7 \!}s2FEΈ|0mSBpAR)yf >."@$Ͳőp~~G$վXἐRN )`ĕݦG@ѩQ7| Auc*e`'q0xO:ODo	X:\E0)<"HVvcP>Q~r-2ɈPM.$q.J1 }P;vxɥ#!Rg>t3ZsOu`E8T8-y5lS?53KÑv]	kP ua%ahXD#vG<f^jWI]G@Q~eRsXդJF!@yB
$Yݏo6ud2h"K\zB)ss4?7/_	xLzeCDe\LiUXJP#'4D	5zfG~^ѫmpU&
5q@Er:S[0)UC
Ng: V;$RBtgrE  	4DDPmӊHXDܴw-|N|"k$eùѧ͢cute]\M1i_!]E!Sif@ZHjs%\ 43+Z!Z"ϋ@ZDÓ&[2IjlKDU}KڦZpdI"{Es-.%_;u+Ր( ڂկ\d,'Zc12M.p:))b̰[7j5%{$}3_E9N
85}!VXkƉLVL\]y/۶02MyrA" hn?C(ãJ;x*/":4RP?0-~/&5!gYy		>LM^$~Xܤ{s,!]A6*$L$K [i̸#`@2l>̀*ʰ&[^
<n$B@YIQ у
E*.j5atcG5d`QЃrvnCx*1xFcQb	&!N)Jxѹ΍pbX?ed~~ČKz2^Oݱ=:agȱ¢ n\"#QX$H=9fLGD+\|JګIU;`jg9DiL%Ze^4N= 69(dc!UXk\

6O6৮emacIZޡ!ѶEoa
vs"{88sFo[0Ȫoz|Щl':q*ԂԐU«e<XcݼԾY)>H`㟺2bƗklg\Б҈@HRT$102	BHV+USZ`Is"B@fM>؂O >8zj]'!vqعZfS2X6/+S
ck:W gHar)x\:FnbY2\󄳤<ZdaM&x/9702yJD8"ɢ7ELoox(P}lJŜ82DFI@BiwϱHefn-TEL3m1GNlS+gKXƲm zKsr6H]6ǆFƺ1q <?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata></metadata>
<defs>
<font id="open_sansitalic" horiz-adv-x="1128" >
<font-face units-per-em="2048" ascent="1638" descent="-410" />
<missing-glyph horiz-adv-x="532" />
<glyph unicode="&#xfb01;" horiz-adv-x="1165" d="M0 0zM-104 -492q-69 0 -125 21v141q64 -22 112 -22q76 0 117 62t66 177l227 1082h-193l13 67l206 66l23 100q46 200 127.5 282.5t241.5 82.5q40 0 98 -11.5t90 -25.5l-43 -129q-76 29 -137 29q-87 0 -133.5 -48.5t-75.5 -177.5l-25 -108h238l-25 -127h-237l-232 -1098 q-39 -189 -120 -276t-213 -87zM870 0h-168l234 1096h168zM983 1376q0 56 32 91.5t83 35.5q88 0 88 -90q0 -55 -33.5 -93t-77.5 -38q-40 0 -66 24.5t-26 69.5z" />
<glyph unicode="&#xfb02;" horiz-adv-x="1165" d="M0 0zM-104 -492q-69 0 -125 21v141q64 -22 112 -22q76 0 117 62t66 177l227 1082h-193l13 67l206 66l23 100q46 200 127.5 282.5t241.5 82.5q40 0 98 -11.5t90 -25.5l-43 -129q-76 29 -137 29q-87 0 -133.5 -48.5t-75.5 -177.5l-25 -108h238l-25 -127h-237l-232 -1098 q-39 -189 -120 -276t-213 -87zM868 0h-168l332 1556h168z" />
<glyph unicode="&#xfb03;" horiz-adv-x="1815" d="M545 -492q-71 0 -125 21v141q61 -22 115 -22q68 0 111 57.5t69 181.5l227 1082h-481l-232 -1098q-39 -189 -120 -276t-213 -87q-69 0 -125 21v141q64 -22 112 -22q70 0 114 58t69 181l227 1082h-193l13 67l206 66l23 100q46 200 127.5 282.5t241.5 82.5q40 0 98 -11.5 t90 -25.5l-43 -129q-76 29 -137 29q-87 0 -133.5 -48.5t-75.5 -177.5l-25 -108h482l24 108q45 197 126 280t243 83q41 0 97.5 -11t92.5 -26l-45 -129q-76 29 -137 29q-89 0 -135 -51t-74 -175l-24 -108h239l-26 -127h-238l-231 -1098q-43 -195 -123.5 -279t-210.5 -84z M1522 0h-168l233 1096h168zM1634 1376q0 54 32 90.5t83 36.5q88 0 88 -90q0 -55 -33.5 -93t-77.5 -38q-38 0 -65 24.5t-27 69.5z" />
<glyph unicode="&#xfb04;" horiz-adv-x="1815" d="M1520 0h-168l331 1556h168zM545 -492q-71 0 -125 21v141q61 -22 115 -22q68 0 111 57.5t69 181.5l227 1082h-481l-232 -1098q-39 -189 -120 -276t-213 -87q-69 0 -125 21v141q64 -22 112 -22q70 0 114 58t69 181l227 1082h-193l13 67l206 66l23 100q46 200 127.5 282.5 t241.5 82.5q40 0 98 -11.5t90 -25.5l-43 -129q-76 29 -137 29q-87 0 -133.5 -48.5t-75.5 -177.5l-25 -108h482l24 108q45 197 126 280t243 83q41 0 97.5 -11t92.5 -26l-45 -129q-76 29 -137 29q-89 0 -135 -51t-74 -175l-24 -108h239l-26 -127h-238l-231 -1098 q-43 -195 -123.5 -279t-210.5 -84z" />
<glyph horiz-adv-x="2048" />
<glyph horiz-adv-x="2048" />
<glyph unicode="&#xd;" horiz-adv-x="1044" />
<glyph unicode=" "  horiz-adv-x="532" />
<glyph unicode="&#x09;" horiz-adv-x="532" />
<glyph unicode="&#xa0;" horiz-adv-x="532" />
<glyph unicode="!" horiz-adv-x="530" d="M555 1462l-274 -1059h-109q49 307 176 1059h207zM43 78q0 76 39.5 120t107.5 44q45 0 73 -27.5t28 -81.5q0 -68 -39 -115t-105 -47q-49 0 -76.5 28t-27.5 79z" />
<glyph unicode="&#x22;" horiz-adv-x="791" d="M485 1462l-153 -528h-107l72 528h188zM834 1462l-154 -528h-107l72 528h189z" />
<glyph unicode="#" horiz-adv-x="1323" d="M1036 899l-98 -340h285l-13 -129h-309l-125 -430h-139l129 430h-303l-127 -430h-133l121 430h-261l13 129h284l101 340h-277l13 127h301l123 436h139l-125 -436h305l127 436h133l-125 -436h264l-12 -127h-291zM500 559h303l96 340h-303z" />
<glyph unicode="$" d="M942 492q0 -162 -112.5 -263t-309.5 -123l-49 -225h-133l49 223q-195 14 -315 72v154q82 -41 175.5 -63.5t166.5 -22.5l98 452q-139 49 -201.5 123.5t-62.5 188.5q0 159 108 255t299 113l39 176h133l-39 -178q159 -12 283 -76l-63 -135q-121 63 -248 72l-94 -440 q149 -55 212.5 -125t63.5 -178zM549 250q107 13 170 75t63 154q0 54 -33 96t-114 74zM627 1235q-108 -11 -167 -69t-59 -156q0 -53 34.5 -97.5t107.5 -70.5z" />
<glyph unicode="%" horiz-adv-x="1624" d="M1468 1462l-1085 -1462h-152l1086 1462h151zM1284 772q-67 0 -119.5 -64.5t-84 -188.5t-31.5 -240q0 -173 106 -173q65 0 117 65t86.5 198.5t34.5 236.5q0 166 -109 166zM1532 621q0 -107 -31.5 -236t-82 -217.5t-121 -138t-156.5 -49.5q-110 0 -171 74.5t-61 219.5 q0 166 50.5 318.5t136.5 228.5t200 76q116 0 176 -71.5t60 -204.5zM543 1358q-66 0 -119 -63t-85 -187.5t-32 -243.5q0 -172 107 -172q52 0 94 39.5t73.5 114t50.5 175t19 171.5q0 166 -108 166zM791 1206q0 -108 -32 -237.5t-82.5 -217.5t-120.5 -137t-157 -49 q-109 0 -170 75t-61 220q0 166 50.5 318.5t136.5 228.5t200 76q116 0 176 -72t60 -205z" />
<glyph unicode="&#x26;" horiz-adv-x="1372" d="M737 1348q-105 0 -163 -60t-58 -170q0 -120 82 -235q139 71 191 110t83 85t31 104q0 77 -42.5 121.5t-123.5 44.5zM471 119q87 0 168 33t195 124l-306 433q-128 -67 -184 -116t-85.5 -107.5t-29.5 -131.5q0 -106 66.5 -170.5t175.5 -64.5zM66 342q0 148 90 257.5 t303 211.5q-103 165 -103 309q0 164 106 264.5t281 100.5q149 0 236.5 -79t87.5 -212q0 -78 -32.5 -137t-87.5 -108t-127.5 -90t-153.5 -83l278 -389q127 110 199 295h168q-101 -236 -283 -412l203 -270h-201l-117 166q-120 -100 -230 -143t-247 -43q-168 0 -269 96 t-101 266z" />
<glyph unicode="'" horiz-adv-x="444" d="M485 1462l-153 -528h-107l72 528h188z" />
<glyph unicode="(" horiz-adv-x="584" d="M82 272q0 339 120 627t384 563h157q-246 -270 -371.5 -570t-125.5 -618q0 -339 114 -598h-131q-147 266 -147 596z" />
<glyph unicode=")" horiz-adv-x="584" d="M500 864q0 -341 -121.5 -629.5t-382.5 -558.5h-156q496 551 496 1188q0 341 -113 598h131q146 -269 146 -598z" />
<glyph unicode="*" horiz-adv-x="1130" d="M854 1528l-123 -383l422 18l-8 -157l-393 47l180 -383l-166 -52l-113 406l-258 -344l-116 121l309 284l-373 109l55 154l371 -185l41 400z" />
<glyph unicode="+" d="M516 651h-389v142h389v391h141v-391h390v-142h-390v-387h-141v387z" />
<glyph unicode="," horiz-adv-x="492" d="M291 238l8 -23q-113 -235 -270 -479h-129q126 286 204 502h187z" />
<glyph unicode="-" horiz-adv-x="639" d="M55 469l35 158h479l-34 -158h-480z" />
<glyph unicode="." horiz-adv-x="518" d="M43 74q0 77 40.5 122.5t111.5 45.5q43 0 69.5 -26t26.5 -79q0 -71 -40 -118.5t-108 -47.5q-46 0 -73 26t-27 77z" />
<glyph unicode="/" horiz-adv-x="717" d="M893 1462l-813 -1462h-174l813 1462h174z" />
<glyph unicode="0" d="M1092 1014q0 -295 -78.5 -539t-214 -369.5t-314.5 -125.5q-176 0 -270 127.5t-94 369.5q0 270 82 514.5t216.5 369t307.5 124.5q365 0 365 -471zM717 1341q-113 0 -209 -115.5t-155.5 -323t-59.5 -423.5q0 -172 50 -264t161 -92q115 0 209 114t150.5 328t56.5 453 q0 323 -203 323z" />
<glyph unicode="1" d="M588 0h-172l196 913q59 261 88 359q-50 -53 -139 -111l-178 -110l-80 127l449 284h149z" />
<glyph unicode="2" d="M911 0h-899l31 147l465 420q102 93 176.5 163.5t123 133t72 124t23.5 136.5q0 99 -60 157t-163 58q-77 0 -150.5 -28.5t-162.5 -96.5l-82 115q191 154 413 154q176 0 278.5 -88.5t102.5 -243.5q0 -111 -39.5 -204t-131 -197t-294.5 -281l-352 -307v-8h678z" />
<glyph unicode="3" d="M1073 1159q0 -156 -101 -264.5t-280 -140.5v-9q124 -23 195 -106.5t71 -208.5q0 -133 -62 -234.5t-181 -158.5t-283 -57q-210 0 -385 79v164q94 -49 199 -75.5t190 -26.5q162 0 252 79.5t90 217.5q0 131 -79 198.5t-220 67.5h-131l31 143h139q165 0 274 87t109 227 q0 92 -58 146t-157 54q-80 0 -157 -27t-175 -93l-80 118q195 144 424 144q179 0 277 -87t98 -237z" />
<glyph unicode="4" d="M1067 334h-233l-72 -334h-164l74 334h-656l29 158l834 978h196l-207 -983h232zM705 487q46 220 78 373t116 445h-8q-17 -29 -66.5 -96.5t-72.5 -96.5l-533 -625h486z" />
<glyph unicode="5" d="M598 893q182 0 289.5 -104.5t107.5 -282.5q0 -161 -73 -283t-204 -182.5t-308 -60.5q-193 0 -330 79v164q164 -102 334 -102q191 0 298 96t107 268q0 126 -73.5 199.5t-204.5 73.5q-48 0 -97 -6.5t-139 -30.5l-74 57l197 684h668l-33 -153h-522l-127 -439q87 23 184 23z " />
<glyph unicode="6" d="M133 424q0 209 60.5 415t163.5 351.5t246 219t327 73.5q111 0 184 -23l-35 -145q-68 22 -170 22q-212 0 -356.5 -149t-212.5 -443h8q59 79 146.5 126t193.5 47q154 0 244 -98.5t90 -270.5q0 -161 -66.5 -294.5t-180.5 -204t-261 -70.5q-182 0 -281.5 115t-99.5 329z M532 121q94 0 167.5 54t114 149t40.5 208q0 248 -221 248q-66 0 -128 -28.5t-110 -76t-72 -104.5t-24 -155q0 -137 60.5 -216t172.5 -79z" />
<glyph unicode="7" d="M174 0l768 1313h-719l31 149h891l-27 -139l-764 -1323h-180z" />
<glyph unicode="8" d="M741 1485q174 0 271.5 -86.5t97.5 -235.5q0 -129 -78 -225t-266 -176q127 -78 180 -165t53 -202q0 -122 -60 -217.5t-172.5 -146.5t-264.5 -51q-190 0 -298 98.5t-108 267.5q0 148 95 256t296 184q-95 69 -135.5 144.5t-40.5 171.5q0 111 54.5 198.5t153.5 136t222 48.5z M608 700q-185 -60 -261.5 -143.5t-76.5 -202.5q0 -107 69 -170t181 -63q139 0 222 74t83 196q0 99 -52 174t-165 135zM729 1341q-114 0 -182 -65.5t-68 -175.5q0 -82 39 -144t127 -116q161 60 228 131.5t67 173.5q0 90 -57.5 143t-153.5 53z" />
<glyph unicode="9" d="M1067 1034q0 -194 -56 -406.5t-147.5 -360t-221.5 -217.5t-302 -70q-136 0 -242 34v158q134 -47 246 -47q202 0 327 141t189 441h-10q-51 -75 -132.5 -118.5t-180.5 -43.5q-169 0 -261 98.5t-92 288.5q0 153 64.5 280.5t180 199t259.5 71.5q180 0 279.5 -114.5 t99.5 -334.5zM682 1341q-150 0 -241 -113t-91 -290q0 -124 54.5 -190t162.5 -66q76 0 140 28.5t108.5 81.5t65 114t20.5 151q0 131 -59 207.5t-160 76.5z" />
<glyph unicode=":" horiz-adv-x="518" d="M43 74q0 77 40.5 122.5t111.5 45.5q43 0 69.5 -26t26.5 -79q0 -71 -40 -118.5t-108 -47.5q-46 0 -73 26t-27 77zM203 956q0 77 40 122.5t111 45.5q97 0 97 -104q0 -73 -41.5 -119.5t-106.5 -46.5q-46 0 -73 26.5t-27 75.5z" />
<glyph unicode=";" horiz-adv-x="518" d="M291 238l8 -23q-113 -235 -270 -479h-129q126 286 204 502h187zM203 956q0 77 40 122.5t111 45.5q97 0 97 -104q0 -73 -41.5 -119.5t-106.5 -46.5q-46 0 -73 26.5t-27 75.5z" />
<glyph unicode="&#x3c;" d="M1040 242l-919 422v98l919 479v-149l-747 -371l747 -328v-151z" />
<glyph unicode="=" d="M127 858v139h920v-139h-920zM127 444v142h920v-142h-920z" />
<glyph unicode="&#x3e;" d="M121 393l745 328l-745 371v149l919 -479v-98l-919 -422v151z" />
<glyph unicode="?" horiz-adv-x="874" d="M260 403q22 130 72.5 213.5t165.5 174.5q128 100 168 144t63 94t23 112q0 93 -51.5 143.5t-147.5 50.5q-81 0 -155 -25.5t-140 -56.5l-61 129q92 51 192 76t182 25q167 0 259 -84t92 -238q0 -123 -65.5 -226.5t-225.5 -223.5q-125 -91 -169 -147.5t-67 -160.5h-135z M158 74q0 77 40 122.5t111 45.5q44 0 70.5 -26t26.5 -79q0 -73 -41.5 -119.5t-106.5 -46.5q-46 0 -73 26t-27 77z" />
<glyph unicode="@" horiz-adv-x="1735" d="M1679 852q0 -179 -55 -324t-155 -227t-222 -82q-197 0 -213 184h-8q-111 -184 -291 -184q-115 0 -180.5 75.5t-65.5 209.5q0 157 68 284t188.5 199t260.5 72q65 0 127.5 -12t150.5 -48q-64 -242 -98 -368t-31 -172q0 -117 102 -117q78 0 141.5 67t100.5 183.5t37 243.5 q0 239 -128 367t-370 128q-228 0 -406.5 -107t-277 -295.5t-98.5 -416.5q0 -270 143.5 -418.5t409.5 -148.5q197 0 420 86v-127q-219 -90 -443 -90q-314 0 -494.5 184.5t-180.5 505.5q0 261 126.5 485.5t343.5 347.5t486 123q191 0 329 -75.5t210.5 -213.5t72.5 -319z M985 938q-94 0 -174 -55t-126 -153t-46 -212q0 -93 33 -134.5t98 -41.5q187 0 272 315l70 258q-63 23 -127 23z" />
<glyph unicode="A" horiz-adv-x="1137" d="M813 465h-496l-245 -465h-189l799 1462h174l184 -1462h-170zM795 621l-35 299q-24 179 -29 350q-37 -88 -80.5 -175t-249.5 -474h394z" />
<glyph unicode="B" horiz-adv-x="1225" d="M770 1462q432 0 432 -336q0 -141 -87 -238t-245 -126v-10q115 -32 176.5 -110.5t61.5 -188.5q0 -212 -152 -332.5t-407 -120.5h-463l309 1462h375zM434 836h248q156 0 249 73t93 199q0 104 -66.5 155.5t-209.5 51.5h-211zM287 145h266q181 0 278 80.5t97 227.5 q0 116 -74.5 177.5t-214.5 61.5h-236z" />
<glyph unicode="C" horiz-adv-x="1198" d="M942 1331q-174 0 -311.5 -97t-218 -284.5t-80.5 -408.5q0 -187 97.5 -298.5t268.5 -111.5q139 0 322 57v-149q-86 -31 -164 -45t-188 -14q-242 0 -380 149.5t-138 407.5q0 261 105.5 485.5t283.5 342.5t403 118q197 0 348 -80l-69 -141q-138 69 -279 69z" />
<glyph unicode="D" horiz-adv-x="1364" d="M1300 877q0 -261 -105 -461t-300 -308t-457 -108h-352l309 1462h342q276 0 419.5 -149.5t143.5 -435.5zM449 147q202 0 355 91.5t234.5 258.5t81.5 382t-103 325.5t-302 110.5h-178l-250 -1168h162z" />
<glyph unicode="E" horiz-adv-x="1047" d="M821 0h-735l309 1462h735l-32 -153h-566l-98 -469h527l-29 -152h-529l-114 -536h565z" />
<glyph unicode="F" horiz-adv-x="967" d="M258 0h-172l309 1462h735l-30 -153h-568l-110 -533h528l-32 -153h-529z" />
<glyph unicode="G" horiz-adv-x="1386" d="M821 766h459l-154 -711q-216 -75 -419 -75q-264 0 -410.5 144.5t-146.5 403.5q0 269 101.5 489.5t281.5 343t399 122.5q117 0 219.5 -20t206.5 -64l-66 -152q-77 34 -165.5 59t-194.5 25q-169 0 -307.5 -101.5t-215.5 -283.5t-77 -407q0 -190 102.5 -299t286.5 -109 q154 0 260 39l96 444h-289z" />
<glyph unicode="H" horiz-adv-x="1389" d="M1085 0h-167l143 688h-660l-145 -688h-170l309 1462h170l-131 -622h660l133 622h168z" />
<glyph unicode="I" horiz-adv-x="559" d="M86 0l311 1462h168l-311 -1462h-168z" />
<glyph unicode="J" horiz-adv-x="547" d="M-166 -385q-105 0 -153 25l6 147q69 -20 145 -20q100 0 165.5 62.5t90.5 182.5l307 1450h170l-309 -1468q-79 -379 -422 -379z" />
<glyph unicode="K" horiz-adv-x="1141" d="M1034 0h-186q-72 181 -146.5 359.5t-146.5 361.5l-174 -131l-125 -590h-170l309 1462h170l-151 -710l700 710h209l-639 -637z" />
<glyph unicode="L" horiz-adv-x="971" d="M86 0l309 1462h170l-276 -1308h565l-33 -154h-735z" />
<glyph unicode="M" horiz-adv-x="1714" d="M676 0l-166 1296h-8q-7 -72 -28.5 -197.5t-37.5 -199.5l-190 -899h-162l309 1462h244l149 -1204h9l659 1204h266l-303 -1462h-174q126 590 193 905.5t94 392.5h-6l-717 -1298h-131z" />
<glyph unicode="N" horiz-adv-x="1438" d="M1139 0h-181l-460 1223h-6q-32 -221 -74 -418l-172 -805h-162l309 1462h180l459 -1220h6q30 224 72 405l174 815h164z" />
<glyph unicode="O" horiz-adv-x="1475" d="M1411 907q0 -269 -88 -481.5t-252 -329t-379 -116.5q-256 0 -399 149.5t-143 419.5q0 264 96 482t263.5 336t377.5 118q244 0 384 -154t140 -424zM874 1333q-157 0 -281 -101t-192.5 -281t-68.5 -398q0 -199 98 -310.5t266 -111.5q152 0 272.5 97.5t190.5 279.5t70 403 q0 199 -94 310.5t-261 111.5z" />
<glyph unicode="P" horiz-adv-x="1159" d="M1159 1085q0 -248 -164 -379t-481 -131h-135l-123 -575h-170l309 1462h330q214 0 324 -94.5t110 -282.5zM410 721h133q216 0 328 91t112 267q0 125 -69.5 180.5t-213.5 55.5h-163z" />
<glyph unicode="Q" horiz-adv-x="1475" d="M874 1333q-157 0 -281 -101t-192.5 -281t-68.5 -398q0 -199 98 -310.5t266 -111.5q158 0 279 100t187.5 280.5t66.5 399.5q0 199 -94 310.5t-261 111.5zM725 -18l-17 -2h-16q-256 0 -399 149.5t-143 419.5q0 264 96 482t263.5 336t377.5 118q244 0 384 -154t140 -424 q0 -333 -139 -576t-375 -321l274 -358h-219z" />
<glyph unicode="R" horiz-adv-x="1165" d="M385 608l-129 -608h-170l309 1462h320q446 0 446 -366q0 -348 -368 -449l239 -647h-186l-209 608h-252zM532 1313q-102 -494 -116 -559h168q193 0 297 85t104 244q0 121 -67.5 175.5t-219.5 54.5h-166z" />
<glyph unicode="S" horiz-adv-x="1028" d="M913 424q0 -211 -140.5 -327.5t-395.5 -116.5q-106 0 -186.5 14.5t-151.5 48.5v170q162 -84 340 -84q162 0 257 75.5t95 207.5q0 78 -52.5 137.5t-195.5 140.5q-151 85 -209.5 170t-58.5 201q0 187 132 304.5t347 117.5q99 0 184.5 -19t180.5 -65l-66 -150 q-66 38 -148 60t-151 22q-134 0 -215.5 -69.5t-81.5 -188.5q0 -54 17 -92.5t54 -72.5t142 -95q147 -88 198.5 -138t78 -110.5t26.5 -140.5z" />
<glyph unicode="T" horiz-adv-x="1020" d="M487 0h-172l277 1311h-406l33 151h985l-30 -151h-408z" />
<glyph unicode="U" horiz-adv-x="1384" d="M1407 1462l-205 -966q-55 -263 -197.5 -389.5t-388.5 -126.5q-230 0 -341 104t-111 299q0 81 24 201l189 878h170l-191 -891q-22 -106 -22 -188q0 -117 73 -184.5t218 -67.5q172 0 267.5 87.5t139.5 289.5l205 954h170z" />
<glyph unicode="V" horiz-adv-x="1122" d="M479 197q61 144 162 338l479 927h191l-781 -1462h-180l-162 1462h170l97 -930q20 -196 20 -335h4z" />
<glyph unicode="W" horiz-adv-x="1745" d="M1257 0h-170l-49 965q-8 136 -8 282h-6q-25 -72 -61 -154.5t-504 -1092.5h-174l-62 1462h170l31 -901l2 -88q0 -98 -10 -258h6q89 243 156 383l405 864h178l43 -860q9 -153 9 -304l-1 -83h9q75 224 131 354l387 893h182z" />
<glyph unicode="X" horiz-adv-x="1063" d="M956 0h-180l-213 641l-481 -641h-186l596 776l-263 686h172l203 -563l443 563h186l-555 -694z" />
<glyph unicode="Y" horiz-adv-x="1030" d="M537 715l489 747h193l-627 -921l-113 -541h-172l119 549l-238 913h170z" />
<glyph unicode="Z" horiz-adv-x="1087" d="M885 0h-901l28 137l924 1170h-655l32 155h858l-26 -139l-924 -1169h697z" />
<glyph unicode="[" horiz-adv-x="586" d="M371 -324h-387l381 1786h387l-31 -141h-227l-318 -1503h227z" />
<glyph unicode="\" horiz-adv-x="717" d="M375 1462l217 -1462h-154l-217 1462h154z" />
<glyph unicode="]" horiz-adv-x="586" d="M-119 -182h225l320 1503h-227l30 141h389l-380 -1786h-388z" />
<glyph unicode="^" horiz-adv-x="1059" d="M53 553l598 920h109l266 -920h-145l-201 747l-467 -747h-160z" />
<glyph unicode="_" horiz-adv-x="807" d="M623 -324h-811l30 140h811z" />
<glyph unicode="`" horiz-adv-x="1135" d="M903 1241h-104q-61 61 -128.5 154t-95.5 153v21h181q43 -136 147 -303v-25z" />
<glyph unicode="a" horiz-adv-x="1157" d="M639 1116q92 0 164 -49.5t112 -142.5h11l67 172h127l-233 -1096h-133l26 209h-8q-179 -229 -377 -229q-139 0 -218 99t-79 271q0 208 71 386t196 279t274 101zM449 119q97 0 193 92.5t156 241t60 297.5q0 103 -56 164t-147 61q-104 0 -193.5 -86t-140.5 -233t-51 -310 q0 -114 47 -170.5t132 -56.5z" />
<glyph unicode="b" horiz-adv-x="1182" d="M545 -20q-97 0 -170.5 51t-110.5 139h-10l-70 -170h-125l330 1556h168q-51 -242 -78.5 -370.5t-75.5 -300.5h9q93 118 183.5 173.5t186.5 55.5q141 0 220 -99t79 -272q0 -209 -68.5 -386.5t-191 -277t-276.5 -99.5zM731 975q-96 0 -195.5 -95t-158 -239t-58.5 -295 q0 -110 55.5 -168.5t160.5 -58.5q99 0 184.5 81t137.5 230.5t52 317.5q0 227 -178 227z" />
<glyph unicode="c" horiz-adv-x="922" d="M506 -20q-194 0 -301 107t-107 302q0 200 74 369t204.5 263.5t293.5 94.5q137 0 268 -51l-47 -141q-120 51 -219 51q-112 0 -204.5 -76.5t-145 -213t-52.5 -296.5q0 -128 66.5 -199t183.5 -71q72 0 136 20t126 47v-143q-124 -63 -276 -63z" />
<glyph unicode="d" horiz-adv-x="1182" d="M639 1114q194 0 281 -190h10q17 155 45 274l78 358h166l-330 -1556h-139l22 209h-8q-101 -125 -189 -177t-182 -52q-139 0 -217 98t-78 272q0 214 72 392t194.5 275t274.5 97zM449 119q94 0 194 93.5t158.5 239t58.5 296.5q0 111 -54 169t-157 58q-101 0 -187.5 -82.5 t-139 -232t-52.5 -314.5q0 -227 179 -227z" />
<glyph unicode="e" horiz-adv-x="1010" d="M492 -20q-184 0 -289 109t-105 302q0 188 74.5 360.5t197.5 268.5t271 96q153 0 230 -66.5t77 -185.5q0 -180 -166 -282.5t-475 -102.5h-33l-4 -80q0 -131 61.5 -204.5t190.5 -73.5q63 0 129.5 18t165.5 66v-146q-94 -44 -166 -61.5t-159 -17.5zM631 973 q-103 0 -193.5 -94t-138.5 -261h12q228 0 349.5 59.5t121.5 172.5q0 53 -36.5 88t-114.5 35z" />
<glyph unicode="f" horiz-adv-x="641" d="M-104 -492q-69 0 -125 21v141q64 -22 112 -22q76 0 117 62t66 177l227 1082h-193l13 67l206 66l23 100q46 200 127.5 282.5t241.5 82.5q40 0 98 -11.5t90 -25.5l-43 -129q-76 29 -137 29q-87 0 -133.5 -48.5t-75.5 -177.5l-25 -108h238l-25 -127h-237l-232 -1098 q-39 -189 -120 -276t-213 -87z" />
<glyph unicode="g" horiz-adv-x="1026" d="M1100 1096l-25 -107l-211 -24q41 -62 41 -158q0 -191 -116.5 -304.5t-311.5 -113.5q-55 0 -84 8q-139 -53 -139 -131q0 -41 33 -54.5t96 -21.5l117 -14q181 -22 262.5 -88t81.5 -194q0 -184 -146 -285t-411 -101q-194 0 -304 73.5t-110 207.5q0 105 72 182t233 131 q-78 41 -78 121q0 69 51 118.5t142 92.5q-63 32 -103 94.5t-40 145.5q0 194 119.5 318t305.5 124q78 0 154 -20h371zM35 -195q0 -77 65 -122t193 -45q182 0 284.5 63.5t102.5 179.5q0 62 -54 98t-184 50l-159 16q-120 -25 -184 -88t-64 -152zM313 680q0 -85 45 -129.5 t125 -44.5q79 0 138 42t90.5 115.5t31.5 159.5q0 82 -44 125t-126 43q-78 0 -136.5 -40.5t-91 -113t-32.5 -157.5z" />
<glyph unicode="h" horiz-adv-x="1182" d="M729 0l148 692q18 94 18 135q0 148 -147 148q-89 0 -173.5 -59t-149 -171.5t-97.5 -271.5l-101 -473h-168l330 1556h168q-18 -82 -34.5 -159t-34 -156.5t-38 -166.5t-47.5 -189h11q94 123 185.5 176t191.5 53q131 0 202.5 -72t71.5 -204q0 -62 -23 -166 q-39 -193 -145 -672h-168z" />
<glyph unicode="i" horiz-adv-x="520" d="M227 0h-168l234 1096h168zM340 1376q0 56 32 91.5t83 35.5q88 0 88 -90q0 -55 -33.5 -93t-77.5 -38q-40 0 -66 24.5t-26 69.5z" />
<glyph unicode="j" horiz-adv-x="520" d="M-135 -492q-69 0 -123 21v141q61 -22 119 -22q125 0 168 205l264 1243h166l-266 -1258q-36 -171 -114.5 -250.5t-213.5 -79.5zM340 1376q0 56 32 91.5t83 35.5q86 0 86 -90q0 -55 -33.5 -93t-77.5 -38q-38 0 -64 24.5t-26 69.5z" />
<glyph unicode="k" horiz-adv-x="999" d="M330 559l526 537h201l-469 -467l295 -629h-187l-235 524l-152 -123l-82 -401h-170l330 1556h170l-129 -602t-102 -395h4z" />
<glyph unicode="l" horiz-adv-x="520" d="M225 0h-168l332 1556h168z" />
<glyph unicode="m" horiz-adv-x="1786" d="M696 0l148 692q18 94 18 135q0 70 -31 109t-106 39q-84 0 -163.5 -60t-140 -171.5t-93.5 -268.5l-101 -475h-168l234 1096h139l-22 -203h10q87 119 173.5 171t178.5 52q113 0 174 -65t72 -181h8q86 125 183 185.5t196 60.5q127 0 196.5 -68t69.5 -198q0 -68 -22 -178 l-144 -672h-170l148 692q20 104 20 146q0 62 -34.5 99.5t-108.5 37.5q-81 0 -160 -58t-138.5 -164.5t-90.5 -252.5l-107 -500h-168z" />
<glyph unicode="n" horiz-adv-x="1182" d="M729 0l148 692q20 104 20 144q0 63 -35.5 101t-113.5 38q-89 0 -173.5 -60t-149 -171t-97.5 -269l-101 -475h-168l234 1096h139l-22 -203h10q96 122 185.5 172.5t185.5 50.5q127 0 200.5 -69.5t73.5 -194.5q0 -79 -23 -180l-143 -672h-170z" />
<glyph unicode="o" horiz-adv-x="1149" d="M643 1110q190 0 300 -112.5t110 -309.5q0 -188 -72 -355t-195 -258t-278 -91q-192 0 -301 113t-109 309q0 190 73 357.5t197 257t275 89.5zM879 711q0 115 -62.5 186.5t-169.5 71.5q-109 0 -195.5 -74t-134 -205.5t-47.5 -292.5q0 -131 63.5 -202.5t182.5 -71.5 q104 0 187 73t129.5 207.5t46.5 307.5z" />
<glyph unicode="p" horiz-adv-x="1182" d="M545 -20q-97 0 -170 50t-113 140h-10l-4 -38q-3 -25 -10.5 -70t-114.5 -554h-166l336 1588h139l-26 -209h8q179 227 372 227q137 0 216 -97.5t79 -273.5q0 -212 -69 -389t-191 -275.5t-276 -98.5zM731 975q-96 0 -195.5 -95t-158 -239t-58.5 -295q0 -110 55.5 -168.5 t160.5 -58.5q99 0 184.5 81t137.5 230.5t52 317.5q0 227 -178 227z" />
<glyph unicode="q" horiz-adv-x="1182" d="M641 1116q94 0 165.5 -50.5t108.5 -141.5h13l67 172h125l-336 -1588h-166l101 480q9 45 57 221h-8q-95 -121 -185 -175t-186 -54q-140 0 -219.5 97.5t-79.5 272.5q0 212 72.5 392t196 277t274.5 97zM449 119q92 0 190 92t158.5 237t60.5 300q0 105 -54.5 166t-152.5 61 q-101 0 -189 -84.5t-140 -233t-52 -311.5q0 -227 179 -227z" />
<glyph unicode="r" horiz-adv-x="811" d="M752 1116q69 0 120 -14l-36 -150q-53 13 -105 13q-91 0 -170.5 -60t-139 -166.5t-87.5 -236.5l-107 -502h-168l234 1096h139l-22 -203h10q72 95 119 136.5t98.5 64t114.5 22.5z" />
<glyph unicode="s" horiz-adv-x="877" d="M735 311q0 -156 -110.5 -243.5t-311.5 -87.5q-169 0 -305 69v158q70 -42 151 -65t150 -23q126 0 190 50t64 128q0 57 -35 96t-151 107q-130 73 -184 143t-54 166q0 138 101 222.5t266 84.5q171 0 330 -74l-54 -137l-56 25q-101 43 -220 43q-93 0 -146 -43.5t-53 -112.5 q0 -56 35.5 -96t146.5 -103q107 -60 153.5 -103t69.5 -92.5t23 -111.5z" />
<glyph unicode="t" horiz-adv-x="664" d="M395 117q55 0 144 26v-129q-34 -14 -84 -24t-80 -10q-125 0 -191.5 59.5t-66.5 177.5q0 66 18 150l127 602h-172l14 73l185 78l125 228h98l-55 -252h274l-26 -127h-273l-129 -604q-18 -87 -18 -132q0 -56 29 -86t81 -30z" />
<glyph unicode="u" horiz-adv-x="1182" d="M451 1096l-150 -695q-18 -89 -18 -139q0 -143 147 -143q88 0 173 60t150 172t99 270l100 475h166l-231 -1096h-139l22 203h-12q-98 -125 -187 -174t-184 -49q-128 0 -201 69.5t-73 198.5q0 62 22 172l146 676h170z" />
<glyph unicode="v" horiz-adv-x="946" d="M223 0l-125 1096h168l64 -613q24 -258 24 -362h6q127 275 179 371l325 604h178l-591 -1096h-228z" />
<glyph unicode="w" horiz-adv-x="1468" d="M831 0l-32 602q-4 94 -4 172v156h-9l-50 -118l-83 -189l-291 -623h-202l-43 1096h164l18 -594v-88q0 -147 -8 -269h6q47 124 137 322l295 629h182l37 -594q6 -168 6 -262v-53l-2 -42h6q28 86 83 218.5t323 732.5h178l-506 -1096h-205z" />
<glyph unicode="x" horiz-adv-x="979" d="M467 434l-346 -434h-195l475 565l-239 531h170l174 -412l330 412h194l-455 -539l252 -557h-168z" />
<glyph unicode="y" horiz-adv-x="946" d="M98 1096h168l74 -545q10 -69 19.5 -203.5t9.5 -216.5h6q35 87 87 200t77 156l325 609h178l-696 -1282q-93 -172 -184 -239t-219 -67q-72 0 -140 21v135q63 -18 131 -18q82 0 140.5 50.5t113.5 149.5l76 136z" />
<glyph unicode="z" horiz-adv-x="909" d="M690 0h-719l23 117l694 854h-479l27 125h657l-29 -140l-680 -831h531z" />
<glyph unicode="{" horiz-adv-x="715" d="M442 -324q-141 0 -216.5 52.5t-75.5 171.5q0 52 20 141q33 146 51.5 227.5t14.5 102.5q0 143 -209 143l32 143q118 0 189.5 43.5t93.5 147.5l68 326q34 160 117.5 224t254.5 64h33l-31 -141q-105 0 -151 -36.5t-66 -123.5l-71 -321q-28 -123 -91 -184t-167 -78v-5 q151 -41 151 -213q0 -59 -18 -131l-47 -211q-15 -58 -15 -98q0 -53 36.5 -77.5t119.5 -24.5v-142h-23z" />
<glyph unicode="|" d="M541 1556h139v-2052h-139v2052z" />
<glyph unicode="}" horiz-adv-x="715" d="M285 1462q144 0 220.5 -52.5t76.5 -170.5q0 -48 -21 -141l-49 -219q-16 -68 -16 -111q0 -143 209 -143l-33 -144q-119 0 -190 -43t-93 -147l-67 -326q-36 -164 -119 -226.5t-264 -62.5h-13v142q115 0 167 36t71 123l72 322q25 117 88 179.5t170 80.5v6q-150 42 -150 211 q0 59 18 131l50 213q14 65 14 99q0 53 -40.5 77.5t-139.5 24.5l28 141h11z" />
<glyph unicode="~" d="M348 713q-54 0 -118.5 -34.5t-114.5 -86.5v151q98 109 243 109q69 0 127 -14.5t144 -51.5q64 -27 112.5 -41t98.5 -14q55 0 119.5 33t115.5 88v-150q-100 -110 -244 -110q-72 0 -135 16.5t-135 48.5q-75 32 -120 44t-93 12z" />
<glyph unicode="&#xa1;" horiz-adv-x="530" d="M260 684h109l-176 -1057h-207zM250 950q0 76 40.5 122t110.5 46q44 0 70.5 -26t26.5 -80q0 -71 -40.5 -117.5t-105.5 -46.5q-48 0 -75 25.5t-27 76.5z" />
<glyph unicode="&#xa2;" d="M582 -20h-125l43 215q-132 34 -203.5 137.5t-71.5 257.5q0 185 63.5 344t178.5 258.5t260 120.5l35 170h123l-37 -168q119 -9 217 -49l-47 -142q-109 52 -219 52q-112 0 -204.5 -76.5t-145 -213t-52.5 -296.5q0 -125 66 -198t184 -73q72 0 136 20t126 48v-143 q-123 -62 -286 -66z" />
<glyph unicode="&#xa3;" d="M842 1481q184 0 336 -86l-66 -133q-146 79 -278 79q-213 0 -263 -237l-69 -326h370l-26 -127h-371l-47 -219q-22 -98 -66 -166.5t-124 -111.5h725l-33 -154h-953l27 141q205 46 258 289l47 221h-200l26 127h201l76 350q75 353 430 353z" />
<glyph unicode="&#xa4;" d="M229 723q0 117 68 215l-129 129l92 92l127 -129q103 70 217 70t215 -70l129 129l92 -90l-129 -129q70 -104 70 -217q0 -119 -70 -217l127 -127l-90 -90l-129 127q-98 -68 -215 -68q-119 0 -217 70l-127 -127l-90 90l127 127q-68 96 -68 215zM358 723q0 -103 71.5 -174.5 t174.5 -71.5q104 0 177 71.5t73 174.5q0 104 -73 177t-177 73q-102 0 -174 -72.5t-72 -177.5z" />
<glyph unicode="&#xa5;" d="M582 715l491 747h187l-533 -770h231l-28 -133h-297l-33 -160h297l-29 -133h-295l-57 -266h-154l56 266h-291l29 133h290l33 160h-291l29 133h225l-202 770h163z" />
<glyph unicode="&#xa6;" d="M541 1556h139v-776h-139v776zM541 281h139v-777h-139v777z" />
<glyph unicode="&#xa7;" horiz-adv-x="995" d="M174 770q0 201 238 307q-119 70 -119 203q0 127 103.5 206t279.5 79q189 0 321 -68l-53 -123q-148 60 -266 60q-102 0 -162.5 -40.5t-60.5 -109.5q0 -49 38 -83.5t162 -90.5q100 -44 149 -83.5t75 -89.5t26 -114q0 -97 -61 -180t-172 -139q114 -71 114 -189 q0 -152 -114 -237.5t-318 -85.5q-176 0 -295 61v148q56 -34 136.5 -56t156.5 -22q133 0 204 44.5t71 129.5q0 48 -50.5 89t-152.5 87q-138 61 -194 130.5t-56 166.5zM514 1010q-82 -26 -135 -87.5t-53 -131.5t50.5 -117t198.5 -111q80 44 127.5 107t47.5 131 q0 60 -49.5 105.5t-186.5 103.5z" />
<glyph unicode="&#xa8;" horiz-adv-x="1135" d="M457 1378q0 46 28 79.5t74 33.5q78 0 78 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62zM821 1378q0 46 28 79.5t75 33.5q77 0 77 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62z" />
<glyph unicode="&#xa9;" horiz-adv-x="1704" d="M928 1059q-125 0 -191.5 -87t-66.5 -241q0 -169 65 -249.5t193 -80.5q82 0 211 43v-122q-66 -28 -113 -38t-104 -10q-192 0 -297 119.5t-105 339.5q0 208 110 330.5t300 122.5q130 0 248 -60l-60 -120q-106 53 -190 53zM139 731q0 200 100 375t275 276t377 101 q197 0 370 -97t277 -272t104 -383q0 -204 -100.5 -376.5t-273 -273.5t-377.5 -101q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM244 731q0 -173 87 -323.5t237.5 -237t322.5 -86.5q174 0 323 87t236.5 235.5t87.5 324.5q0 174 -87 323t-235.5 236.5t-324.5 87.5 q-174 0 -323 -87t-236.5 -235.5t-87.5 -324.5z" />
<glyph unicode="&#xaa;" horiz-adv-x="686" d="M498 1479q114 0 153 -103h6l37 90h86l-139 -665h-92l14 117h-4q-40 -56 -90 -93t-123 -37q-77 0 -126.5 60t-49.5 166q0 127 41.5 234.5t116.5 169t170 61.5zM381 891q61 0 112.5 49t86 137.5t34.5 167.5q0 62 -28.5 96.5t-85.5 34.5q-92 0 -154.5 -103t-62.5 -243 q0 -139 98 -139z" />
<glyph unicode="&#xab;" horiz-adv-x="958" d="M88 584l391 374l78 -81l-297 -328l172 -387l-113 -49l-231 442v29zM483 541l367 405l86 -69l-283 -365l158 -350l-113 -49l-215 397v31z" />
<glyph unicode="&#xac;" d="M1047 793v-529h-140v387h-780v142h920z" />
<glyph unicode="&#xad;" horiz-adv-x="639" d="M55 469zM55 469l35 158h479l-34 -158h-480z" />
<glyph unicode="&#xae;" horiz-adv-x="1704" d="M139 731q0 200 100 375t275 276t377 101q197 0 370 -97t277 -272t104 -383q0 -204 -100.5 -376.5t-273 -273.5t-377.5 -101q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM244 731q0 -173 87 -323.5t237.5 -237t322.5 -86.5q174 0 323 87t236.5 235.5t87.5 324.5 q0 174 -87 323t-235.5 236.5t-324.5 87.5q-174 0 -323 -87t-236.5 -235.5t-87.5 -324.5zM1194 915q0 -78 -47.5 -141t-132.5 -98l227 -385h-149l-207 352h-113v-352h-127v880h229q163 0 241.5 -63t78.5 -193zM772 762h92q195 0 195 149q0 76 -47.5 107t-149.5 31h-90v-287z " />
<glyph unicode="&#xaf;" horiz-adv-x="782" d="M1012 1556h-785l33 132h787z" />
<glyph unicode="&#xb0;" horiz-adv-x="877" d="M215 1171q0 128 90.5 220t220.5 92q83 0 155.5 -41.5t114.5 -114t42 -156.5q0 -128 -90.5 -218.5t-221.5 -90.5t-221 90.5t-90 218.5zM328 1171q0 -80 58 -138t140 -58q83 0 140 58.5t57 137.5q0 82 -57.5 140.5t-139.5 58.5q-80 0 -139 -58.5t-59 -140.5z" />
<glyph unicode="&#xb1;" d="M516 643h-389v141h389v392h141v-392h390v-141h-390v-387h-141v387zM127 0v141h920v-141h-920z" />
<glyph unicode="&#xb2;" horiz-adv-x="717" d="M657 586h-561l23 106l264 228q115 100 158.5 149.5t63.5 93t20 90.5q0 53 -31 85t-90 32q-90 0 -195 -80l-59 90q125 101 274 101q109 0 171.5 -56.5t62.5 -150.5q0 -99 -52.5 -179.5t-197.5 -205.5l-221 -187h395z" />
<glyph unicode="&#xb3;" horiz-adv-x="717" d="M549 1036q69 -17 108 -68t39 -120q0 -132 -91 -205.5t-253 -73.5q-125 0 -233 56v127q125 -72 239 -72q205 0 205 170q0 137 -178 137h-90l22 107h95q97 0 155 41t58 112q0 60 -34.5 90.5t-93.5 30.5q-102 0 -196 -68l-55 93q109 88 268 88q114 0 178 -56t64 -151 q0 -180 -207 -234v-4z" />
<glyph unicode="&#xb4;" horiz-adv-x="1135" d="M532 1268q56 60 125.5 151.5t106.5 149.5h190v-21q-38 -49 -140 -151t-177 -156h-105v27z" />
<glyph unicode="&#xb5;" horiz-adv-x="1194" d="M295 266q0 -147 147 -147q89 0 172 59t148.5 171t99.5 269l105 478h163l-233 -1096h-139l24 205h-12q-93 -121 -183 -173t-188 -52q-112 0 -163 96h-9q-11 -78 -22.5 -148t-83.5 -420h-164l336 1588h168l-148 -695q-18 -92 -18 -135z" />
<glyph unicode="&#xb6;" horiz-adv-x="1341" d="M1206 -260h-114v1661h-213v-1661h-115v819q-62 -18 -146 -18q-216 0 -317.5 125t-101.5 376q0 260 109 387t341 127h557v-1816z" />
<glyph unicode="&#xb7;" horiz-adv-x="518" d="M170 587zM170 690q0 77 40.5 122.5t111.5 45.5q43 0 69.5 -26t26.5 -79q0 -71 -40 -118.5t-108 -47.5q-46 0 -73 26t-27 77z" />
<glyph unicode="&#xb8;" horiz-adv-x="420" d="M211 -276q0 -98 -81 -157t-214 -59q-41 0 -86 9v100q38 -6 68 -6q174 0 174 110q0 46 -39 67.5t-99 29.5l101 182h106l-61 -121q131 -38 131 -155z" />
<glyph unicode="&#xb9;" horiz-adv-x="717" d="M537 1462h118l-186 -876h-135l112 526q25 103 58 225q-25 -25 -50 -46.5t-145 -100.5l-51 90z" />
<glyph unicode="&#xba;" horiz-adv-x="688" d="M745 1219q0 -191 -88.5 -311t-240.5 -120q-113 0 -180.5 71t-67.5 196q0 117 42 215.5t117.5 153.5t174.5 55q117 0 180 -67t63 -193zM500 1376q-102 0 -160.5 -87.5t-58.5 -229.5q0 -85 38 -127.5t107 -42.5q94 0 152.5 88.5t58.5 232.5q0 166 -137 166z" />
<glyph unicode="&#xbb;" horiz-adv-x="958" d="M872 485l-393 -370l-78 82l297 323l-172 391l113 50l233 -447v-29zM477 528l-368 -401l-86 70l282 360l-158 354l113 50l217 -402v-31z" />
<glyph unicode="&#xbc;" horiz-adv-x="1518" d="M123 0zM1362 1462l-1086 -1462h-153l1085 1462h154zM483 1462h118l-186 -876h-135l112 526q25 103 58 225q-25 -25 -50 -46.5t-145 -100.5l-51 90zM1327 203h-129l-43 -202h-127l43 202h-365l23 101l481 579h133l-121 -563h127zM1095 320q69 322 90 395 q-20 -36 -110 -149l-205 -246h225z" />
<glyph unicode="&#xbd;" horiz-adv-x="1518" d="M66 0zM427 1462h118l-186 -876h-135l112 526q25 103 58 225q-25 -25 -50 -46.5t-145 -100.5l-51 90zM1305 1462l-1086 -1462h-153l1085 1462h154zM1343 1h-561l23 106l264 228q115 100 158.5 149.5t63.5 93t20 90.5q0 53 -31 85t-90 32q-90 0 -195 -80l-59 90 q125 101 274 101q109 0 171.5 -56.5t62.5 -150.5q0 -99 -52.5 -179.5t-197.5 -205.5l-221 -187h395z" />
<glyph unicode="&#xbe;" horiz-adv-x="1565" d="M87 0zM517 1036q69 -17 108 -68t39 -120q0 -132 -91 -205.5t-253 -73.5q-125 0 -233 56v127q125 -72 239 -72q205 0 205 170q0 137 -178 137h-90l22 107h95q97 0 155 41t58 112q0 60 -34.5 90.5t-93.5 30.5q-102 0 -196 -68l-55 93q109 88 268 88q114 0 178 -56t64 -151 q0 -180 -207 -234v-4zM1512 1462l-1086 -1462h-153l1085 1462h154zM1477 203h-129l-43 -202h-127l43 202h-365l23 101l481 579h133l-121 -563h127zM1245 320q69 322 90 395q-20 -36 -110 -149l-205 -246h225z" />
<glyph unicode="&#xbf;" horiz-adv-x="874" d="M657 680q-22 -130 -72 -212t-165 -175l-95 -75q-159 -127 -159 -275q0 -93 51.5 -144t147.5 -51q80 0 154 25.5t140 56.5l62 -129q-90 -48 -189 -74t-186 -26q-168 0 -259 83.5t-91 237.5q0 124 66 228t225 223q132 98 172.5 152.5t62.5 154.5h135zM760 1010 q0 -77 -40.5 -122.5t-111.5 -45.5q-43 0 -69.5 26t-26.5 78q0 71 40 118.5t107 47.5q47 0 74 -25.5t27 -76.5z" />
<glyph unicode="&#xc0;" horiz-adv-x="1137" d="M0 0zM813 465h-496l-245 -465h-189l799 1462h174l184 -1462h-170zM795 621l-35 299q-24 179 -29 350q-37 -88 -80.5 -175t-249.5 -474h394zM863 1579h-104q-61 61 -128.5 154t-95.5 153v21h181q43 -136 147 -303v-25z" />
<glyph unicode="&#xc1;" horiz-adv-x="1137" d="M0 0zM813 465h-496l-245 -465h-189l799 1462h174l184 -1462h-170zM795 621l-35 299q-24 179 -29 350q-37 -88 -80.5 -175t-249.5 -474h394zM679 1606q56 60 125.5 151.5t106.5 149.5h190v-21q-38 -49 -140 -151t-177 -156h-105v27z" />
<glyph unicode="&#xc2;" horiz-adv-x="1137" d="M0 0zM813 465h-496l-245 -465h-189l799 1462h174l184 -1462h-170zM795 621l-35 299q-24 179 -29 350q-37 -88 -80.5 -175t-249.5 -474h394zM1080 1579h-103q-57 48 -161 189q-134 -119 -242 -189h-109v27q145 133 204.5 197.5t82.5 103.5h158q37 -99 128 -235l42 -66v-27 z" />
<glyph unicode="&#xc3;" horiz-adv-x="1137" d="M0 0zM813 465h-496l-245 -465h-189l799 1462h174l184 -1462h-170zM795 621l-35 299q-24 179 -29 350q-37 -88 -80.5 -175t-249.5 -474h394zM934 1581q-40 0 -77.5 17.5t-73 39t-69 39t-65.5 17.5q-44 0 -69.5 -28.5t-47.5 -86.5h-100q58 258 231 258q44 0 83.5 -18 t75 -39.5t66.5 -39.5t58 -18q44 0 69.5 27t51.5 90h100q-66 -258 -233 -258z" />
<glyph unicode="&#xc4;" horiz-adv-x="1137" d="M0 0zM813 465h-496l-245 -465h-189l799 1462h174l184 -1462h-170zM795 621l-35 299q-24 179 -29 350q-37 -88 -80.5 -175t-249.5 -474h394zM523 1716q0 46 28 79.5t74 33.5q78 0 78 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62zM887 1716q0 46 28 79.5 t75 33.5q77 0 77 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62z" />
<glyph unicode="&#xc5;" horiz-adv-x="1137" d="M0 0zM813 465h-496l-245 -465h-189l799 1462h174l184 -1462h-170zM795 621l-35 299q-24 179 -29 350q-37 -88 -80.5 -175t-249.5 -474h394zM991 1585q0 -99 -60 -157t-159 -58q-101 0 -160 57.5t-59 155.5q0 94 62 152.5t157 58.5q101 0 160 -57t59 -152zM887 1583 q0 53 -32 84t-83 31q-49 0 -82 -31t-33 -84q0 -54 29.5 -84.5t85.5 -30.5q51 0 83 30.5t32 84.5z" />
<glyph unicode="&#xc6;" horiz-adv-x="1673" d="M1448 0h-737l98 465h-438l-293 -465h-197l938 1462h938l-33 -153h-565l-100 -469h528l-28 -150h-529l-115 -538h566zM840 621l147 688h-84l-434 -688h371z" />
<glyph unicode="&#xc7;" horiz-adv-x="1198" d="M150 0zM942 1331q-174 0 -311.5 -97t-218 -284.5t-80.5 -408.5q0 -187 97.5 -298.5t268.5 -111.5q139 0 322 57v-149q-86 -31 -164 -45t-188 -14q-242 0 -380 149.5t-138 407.5q0 261 105.5 485.5t283.5 342.5t403 118q197 0 348 -80l-69 -141q-138 69 -279 69zM758 -276 q0 -98 -81 -157t-214 -59q-41 0 -86 9v100q38 -6 68 -6q174 0 174 110q0 46 -39 67.5t-99 29.5l101 182h106l-61 -121q131 -38 131 -155z" />
<glyph unicode="&#xc8;" horiz-adv-x="1047" d="M86 0zM821 0h-735l309 1462h735l-32 -153h-566l-98 -469h527l-29 -152h-529l-114 -536h565zM898 1579h-104q-61 61 -128.5 154t-95.5 153v21h181q43 -136 147 -303v-25z" />
<glyph unicode="&#xc9;" horiz-adv-x="1047" d="M86 0zM821 0h-735l309 1462h735l-32 -153h-566l-98 -469h527l-29 -152h-529l-114 -536h565zM657 1606q56 60 125.5 151.5t106.5 149.5h190v-21q-38 -49 -140 -151t-177 -156h-105v27z" />
<glyph unicode="&#xca;" horiz-adv-x="1047" d="M86 0zM821 0h-735l309 1462h735l-32 -153h-566l-98 -469h527l-29 -152h-529l-114 -536h565zM1084 1579h-103q-57 48 -161 189q-134 -119 -242 -189h-109v27q145 133 204.5 197.5t82.5 103.5h158q37 -99 128 -235l42 -66v-27z" />
<glyph unicode="&#xcb;" horiz-adv-x="1047" d="M86 0zM821 0h-735l309 1462h735l-32 -153h-566l-98 -469h527l-29 -152h-529l-114 -536h565zM523 1716q0 46 28 79.5t74 33.5q78 0 78 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62zM887 1716q0 46 28 79.5t75 33.5q77 0 77 -80q0 -49 -29.5 -83t-68.5 -34 q-35 0 -58.5 22t-23.5 62z" />
<glyph unicode="&#xcc;" horiz-adv-x="559" d="M86 0zM86 0l311 1462h168l-311 -1462h-168zM593 1579h-104q-61 61 -128.5 154t-95.5 153v21h181q43 -136 147 -303v-25z" />
<glyph unicode="&#xcd;" horiz-adv-x="559" d="M86 0zM86 0l311 1462h168l-311 -1462h-168zM412 1606q56 60 125.5 151.5t106.5 149.5h190v-21q-38 -49 -140 -151t-177 -156h-105v27z" />
<glyph unicode="&#xce;" horiz-adv-x="559" d="M86 0zM86 0l311 1462h168l-311 -1462h-168zM808 1579h-103q-57 48 -161 189q-134 -119 -242 -189h-109v27q145 133 204.5 197.5t82.5 103.5h158q37 -99 128 -235l42 -66v-27z" />
<glyph unicode="&#xcf;" horiz-adv-x="559" d="M86 0zM86 0l311 1462h168l-311 -1462h-168zM265 1716q0 46 28 79.5t74 33.5q78 0 78 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62zM629 1716q0 46 28 79.5t75 33.5q77 0 77 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62z" />
<glyph unicode="&#xd0;" horiz-adv-x="1364" d="M1300 877q0 -261 -105 -461t-300 -308t-457 -108h-352l135 649h-149l32 150h150l141 663h342q276 0 419.5 -149.5t143.5 -435.5zM449 147q202 0 355 91.5t234.5 258.5t81.5 382t-103 325.5t-302 110.5h-178l-111 -516h330l-33 -150h-330l-106 -502h162z" />
<glyph unicode="&#xd1;" horiz-adv-x="1438" d="M84 0zM1139 0h-181l-460 1223h-6q-32 -221 -74 -418l-172 -805h-162l309 1462h180l459 -1220h6q30 224 72 405l174 815h164zM1102 1581q-40 0 -77.5 17.5t-73 39t-69 39t-65.5 17.5q-44 0 -69.5 -28.5t-47.5 -86.5h-100q58 258 231 258q44 0 83.5 -18t75 -39.5 t66.5 -39.5t58 -18q44 0 69.5 27t51.5 90h100q-66 -258 -233 -258z" />
<glyph unicode="&#xd2;" horiz-adv-x="1475" d="M150 0zM1411 907q0 -269 -88 -481.5t-252 -329t-379 -116.5q-256 0 -399 149.5t-143 419.5q0 264 96 482t263.5 336t377.5 118q244 0 384 -154t140 -424zM874 1333q-157 0 -281 -101t-192.5 -281t-68.5 -398q0 -199 98 -310.5t266 -111.5q152 0 272.5 97.5t190.5 279.5 t70 403q0 199 -94 310.5t-261 111.5zM1007 1579h-104q-61 61 -128.5 154t-95.5 153v21h181q43 -136 147 -303v-25z" />
<glyph unicode="&#xd3;" horiz-adv-x="1475" d="M150 0zM1411 907q0 -269 -88 -481.5t-252 -329t-379 -116.5q-256 0 -399 149.5t-143 419.5q0 264 96 482t263.5 336t377.5 118q244 0 384 -154t140 -424zM874 1333q-157 0 -281 -101t-192.5 -281t-68.5 -398q0 -199 98 -310.5t266 -111.5q152 0 272.5 97.5t190.5 279.5 t70 403q0 199 -94 310.5t-261 111.5zM821 1606q56 60 125.5 151.5t106.5 149.5h190v-21q-38 -49 -140 -151t-177 -156h-105v27z" />
<glyph unicode="&#xd4;" horiz-adv-x="1475" d="M150 0zM1411 907q0 -269 -88 -481.5t-252 -329t-379 -116.5q-256 0 -399 149.5t-143 419.5q0 264 96 482t263.5 336t377.5 118q244 0 384 -154t140 -424zM874 1333q-157 0 -281 -101t-192.5 -281t-68.5 -398q0 -199 98 -310.5t266 -111.5q152 0 272.5 97.5t190.5 279.5 t70 403q0 199 -94 310.5t-261 111.5zM1227 1579h-103q-57 48 -161 189q-134 -119 -242 -189h-109v27q145 133 204.5 197.5t82.5 103.5h158q37 -99 128 -235l42 -66v-27z" />
<glyph unicode="&#xd5;" horiz-adv-x="1475" d="M150 0zM1411 907q0 -269 -88 -481.5t-252 -329t-379 -116.5q-256 0 -399 149.5t-143 419.5q0 264 96 482t263.5 336t377.5 118q244 0 384 -154t140 -424zM874 1333q-157 0 -281 -101t-192.5 -281t-68.5 -398q0 -199 98 -310.5t266 -111.5q152 0 272.5 97.5t190.5 279.5 t70 403q0 199 -94 310.5t-261 111.5zM1067 1581q-40 0 -77.5 17.5t-73 39t-69 39t-65.5 17.5q-44 0 -69.5 -28.5t-47.5 -86.5h-100q58 258 231 258q44 0 83.5 -18t75 -39.5t66.5 -39.5t58 -18q44 0 69.5 27t51.5 90h100q-66 -258 -233 -258z" />
<glyph unicode="&#xd6;" horiz-adv-x="1475" d="M150 0zM1411 907q0 -269 -88 -481.5t-252 -329t-379 -116.5q-256 0 -399 149.5t-143 419.5q0 264 96 482t263.5 336t377.5 118q244 0 384 -154t140 -424zM874 1333q-157 0 -281 -101t-192.5 -281t-68.5 -398q0 -199 98 -310.5t266 -111.5q152 0 272.5 97.5t190.5 279.5 t70 403q0 199 -94 310.5t-261 111.5zM664 1716q0 46 28 79.5t74 33.5q78 0 78 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62zM1028 1716q0 46 28 79.5t75 33.5q77 0 77 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62z" />
<glyph unicode="&#xd7;" d="M487 723l-319 321l98 99l320 -320l323 320l99 -96l-324 -324l322 -322l-97 -96l-323 320l-320 -318l-96 96z" />
<glyph unicode="&#xd8;" horiz-adv-x="1475" d="M1411 907q0 -269 -88 -481.5t-252 -329t-379 -116.5q-200 0 -332 96l-129 -160l-112 92l137 170q-106 136 -106 371q0 264 96 482t263.5 336t377.5 118q99 0 178.5 -27t151.5 -84l131 166l114 -92l-149 -184q48 -62 73 -156t25 -201zM874 1333q-157 0 -281 -101 t-192.5 -281t-68.5 -398q0 -135 41 -227l737 919q-90 88 -236 88zM1229 911q0 118 -33 205l-733 -911q91 -74 233 -74q152 0 272.5 97.5t190.5 279.5t70 403z" />
<glyph unicode="&#xd9;" horiz-adv-x="1384" d="M164 0zM1407 1462l-205 -966q-55 -263 -197.5 -389.5t-388.5 -126.5q-230 0 -341 104t-111 299q0 81 24 201l189 878h170l-191 -891q-22 -106 -22 -188q0 -117 73 -184.5t218 -67.5q172 0 267.5 87.5t139.5 289.5l205 954h170zM991 1579h-104q-61 61 -128.5 154 t-95.5 153v21h181q43 -136 147 -303v-25z" />
<glyph unicode="&#xda;" horiz-adv-x="1384" d="M164 0zM1407 1462l-205 -966q-55 -263 -197.5 -389.5t-388.5 -126.5q-230 0 -341 104t-111 299q0 81 24 201l189 878h170l-191 -891q-22 -106 -22 -188q0 -117 73 -184.5t218 -67.5q172 0 267.5 87.5t139.5 289.5l205 954h170zM823 1606q56 60 125.5 151.5t106.5 149.5 h190v-21q-38 -49 -140 -151t-177 -156h-105v27z" />
<glyph unicode="&#xdb;" horiz-adv-x="1384" d="M164 0zM1407 1462l-205 -966q-55 -263 -197.5 -389.5t-388.5 -126.5q-230 0 -341 104t-111 299q0 81 24 201l189 878h170l-191 -891q-22 -106 -22 -188q0 -117 73 -184.5t218 -67.5q172 0 267.5 87.5t139.5 289.5l205 954h170zM1217 1579h-103q-57 48 -161 189 q-134 -119 -242 -189h-109v27q145 133 204.5 197.5t82.5 103.5h158q37 -99 128 -235l42 -66v-27z" />
<glyph unicode="&#xdc;" horiz-adv-x="1384" d="M164 0zM1407 1462l-205 -966q-55 -263 -197.5 -389.5t-388.5 -126.5q-230 0 -341 104t-111 299q0 81 24 201l189 878h170l-191 -891q-22 -106 -22 -188q0 -117 73 -184.5t218 -67.5q172 0 267.5 87.5t139.5 289.5l205 954h170zM643 1716q0 46 28 79.5t74 33.5 q78 0 78 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62zM1007 1716q0 46 28 79.5t75 33.5q77 0 77 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62z" />
<glyph unicode="&#xdd;" horiz-adv-x="1030" d="M188 0zM537 715l489 747h193l-627 -921l-113 -541h-172l119 549l-238 913h170zM616 1606q56 60 125.5 151.5t106.5 149.5h190v-21q-38 -49 -140 -151t-177 -156h-105v27z" />
<glyph unicode="&#xde;" horiz-adv-x="1159" d="M1106 829q0 -248 -164 -379t-483 -131h-133l-70 -319h-170l309 1462h170l-53 -256h160q213 0 323.5 -95t110.5 -282zM354 465h135q215 0 328 91t113 267q0 126 -70 181t-215 55h-166z" />
<glyph unicode="&#xdf;" horiz-adv-x="1182" d="M-133 -492q-69 0 -123 21v143q61 -22 111 -22q65 0 107 47.5t65 157.5l280 1314q43 200 156 299t307 99q162 0 252 -71t90 -196q0 -57 -21 -106.5t-61.5 -95t-178.5 -150.5q-110 -83 -110 -151q0 -56 95 -122q47 -34 101 -87.5t79.5 -110t25.5 -123.5 q0 -175 -108.5 -274.5t-292.5 -99.5q-175 0 -268 71v160q51 -41 118.5 -66.5t129.5 -25.5q113 0 181 58t68 159q0 40 -10.5 71t-33.5 59t-89 83q-88 69 -122.5 124t-34.5 115q0 53 18.5 96t49.5 78.5t124 104.5q80 56 111 87.5t48 65t17 70.5q0 64 -52.5 100.5t-141.5 36.5 q-119 0 -186 -62.5t-95 -190.5l-274 -1303q-40 -189 -121 -276t-211 -87z" />
<glyph unicode="&#xe0;" horiz-adv-x="1157" d="M98 0zM639 1116q92 0 164 -49.5t112 -142.5h11l67 172h127l-233 -1096h-133l26 209h-8q-179 -229 -377 -229q-139 0 -218 99t-79 271q0 208 71 386t196 279t274 101zM449 119q97 0 193 92.5t156 241t60 297.5q0 103 -56 164t-147 61q-104 0 -193.5 -86t-140.5 -233 t-51 -310q0 -114 47 -170.5t132 -56.5zM824 1241h-104q-61 61 -128.5 154t-95.5 153v21h181q43 -136 147 -303v-25z" />
<glyph unicode="&#xe1;" horiz-adv-x="1157" d="M98 0zM639 1116q92 0 164 -49.5t112 -142.5h11l67 172h127l-233 -1096h-133l26 209h-8q-179 -229 -377 -229q-139 0 -218 99t-79 271q0 208 71 386t196 279t274 101zM449 119q97 0 193 92.5t156 241t60 297.5q0 103 -56 164t-147 61q-104 0 -193.5 -86t-140.5 -233 t-51 -310q0 -114 47 -170.5t132 -56.5zM600 1268q56 60 125.5 151.5t106.5 149.5h190v-21q-38 -49 -140 -151t-177 -156h-105v27z" />
<glyph unicode="&#xe2;" horiz-adv-x="1157" d="M98 0zM639 1116q92 0 164 -49.5t112 -142.5h11l67 172h127l-233 -1096h-133l26 209h-8q-179 -229 -377 -229q-139 0 -218 99t-79 271q0 208 71 386t196 279t274 101zM449 119q97 0 193 92.5t156 241t60 297.5q0 103 -56 164t-147 61q-104 0 -193.5 -86t-140.5 -233 t-51 -310q0 -114 47 -170.5t132 -56.5zM1005 1241h-103q-57 48 -161 189q-134 -119 -242 -189h-109v27q145 133 204.5 197.5t82.5 103.5h158q37 -99 128 -235l42 -66v-27z" />
<glyph unicode="&#xe3;" horiz-adv-x="1157" d="M98 0zM639 1116q92 0 164 -49.5t112 -142.5h11l67 172h127l-233 -1096h-133l26 209h-8q-179 -229 -377 -229q-139 0 -218 99t-79 271q0 208 71 386t196 279t274 101zM449 119q97 0 193 92.5t156 241t60 297.5q0 103 -56 164t-147 61q-104 0 -193.5 -86t-140.5 -233 t-51 -310q0 -114 47 -170.5t132 -56.5zM856 1243q-40 0 -77.5 17.5t-73 39t-69 39t-65.5 17.5q-44 0 -69.5 -28.5t-47.5 -86.5h-100q58 258 231 258q44 0 83.5 -18t75 -39.5t66.5 -39.5t58 -18q44 0 69.5 27t51.5 90h100q-66 -258 -233 -258z" />
<glyph unicode="&#xe4;" horiz-adv-x="1157" d="M98 0zM639 1116q92 0 164 -49.5t112 -142.5h11l67 172h127l-233 -1096h-133l26 209h-8q-179 -229 -377 -229q-139 0 -218 99t-79 271q0 208 71 386t196 279t274 101zM449 119q97 0 193 92.5t156 241t60 297.5q0 103 -56 164t-147 61q-104 0 -193.5 -86t-140.5 -233 t-51 -310q0 -114 47 -170.5t132 -56.5zM454 1378q0 46 28 79.5t74 33.5q78 0 78 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62zM818 1378q0 46 28 79.5t75 33.5q77 0 77 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62z" />
<glyph unicode="&#xe5;" horiz-adv-x="1157" d="M98 0zM639 1116q92 0 164 -49.5t112 -142.5h11l67 172h127l-233 -1096h-133l26 209h-8q-179 -229 -377 -229q-139 0 -218 99t-79 271q0 208 71 386t196 279t274 101zM449 119q97 0 193 92.5t156 241t60 297.5q0 103 -56 164t-147 61q-104 0 -193.5 -86t-140.5 -233 t-51 -310q0 -114 47 -170.5t132 -56.5zM951 1456q0 -99 -60 -157t-159 -58q-101 0 -160 57.5t-59 155.5q0 94 62 152.5t157 58.5q101 0 160 -57t59 -152zM847 1454q0 53 -32 84t-83 31q-49 0 -82 -31t-33 -84q0 -54 29.5 -84.5t85.5 -30.5q51 0 83 30.5t32 84.5z" />
<glyph unicode="&#xe6;" horiz-adv-x="1669" d="M1165 -20q-108 0 -189.5 39.5t-121.5 119.5l-31 -139h-114l26 209h-8q-109 -132 -191.5 -180.5t-177.5 -48.5q-122 0 -191 99t-69 269q0 206 70.5 385t191.5 281t263 102q82 0 145 -48.5t102 -143.5h11l67 172h109l-31 -146q123 166 332 166q119 0 192.5 -68t73.5 -184 q0 -182 -166.5 -283.5t-472.5 -101.5h-39l-4 -80q0 -131 62.5 -204.5t193.5 -73.5q55 0 116.5 16.5t178.5 67.5v-150q-164 -75 -328 -75zM412 119q95 0 188.5 91.5t153 240.5t59.5 299q0 103 -45.5 164t-122.5 61q-99 0 -187 -86.5t-138 -231.5t-50 -309q0 -114 37 -171.5 t105 -57.5zM1325 973q-117 0 -211 -94.5t-141 -260.5h14q226 0 348.5 58.5t122.5 169.5q0 61 -35 94t-98 33z" />
<glyph unicode="&#xe7;" horiz-adv-x="922" d="M98 0zM506 -20q-194 0 -301 107t-107 302q0 200 74 369t204.5 263.5t293.5 94.5q137 0 268 -51l-47 -141q-120 51 -219 51q-112 0 -204.5 -76.5t-145 -213t-52.5 -296.5q0 -128 66.5 -199t183.5 -71q72 0 136 20t126 47v-143q-124 -63 -276 -63zM592 -276q0 -98 -81 -157 t-214 -59q-41 0 -86 9v100q38 -6 68 -6q174 0 174 110q0 46 -39 67.5t-99 29.5l101 182h106l-61 -121q131 -38 131 -155z" />
<glyph unicode="&#xe8;" horiz-adv-x="1010" d="M98 0zM492 -20q-184 0 -289 109t-105 302q0 188 74.5 360.5t197.5 268.5t271 96q153 0 230 -66.5t77 -185.5q0 -180 -166 -282.5t-475 -102.5h-33l-4 -80q0 -131 61.5 -204.5t190.5 -73.5q63 0 129.5 18t165.5 66v-146q-94 -44 -166 -61.5t-159 -17.5zM631 973 q-103 0 -193.5 -94t-138.5 -261h12q228 0 349.5 59.5t121.5 172.5q0 53 -36.5 88t-114.5 35zM777 1241h-104q-61 61 -128.5 154t-95.5 153v21h181q43 -136 147 -303v-25z" />
<glyph unicode="&#xe9;" horiz-adv-x="1010" d="M98 0zM492 -20q-184 0 -289 109t-105 302q0 188 74.5 360.5t197.5 268.5t271 96q153 0 230 -66.5t77 -185.5q0 -180 -166 -282.5t-475 -102.5h-33l-4 -80q0 -131 61.5 -204.5t190.5 -73.5q63 0 129.5 18t165.5 66v-146q-94 -44 -166 -61.5t-159 -17.5zM631 973 q-103 0 -193.5 -94t-138.5 -261h12q228 0 349.5 59.5t121.5 172.5q0 53 -36.5 88t-114.5 35zM585 1268q56 60 125.5 151.5t106.5 149.5h190v-21q-38 -49 -140 -151t-177 -156h-105v27z" />
<glyph unicode="&#xea;" horiz-adv-x="1010" d="M98 0zM492 -20q-184 0 -289 109t-105 302q0 188 74.5 360.5t197.5 268.5t271 96q153 0 230 -66.5t77 -185.5q0 -180 -166 -282.5t-475 -102.5h-33l-4 -80q0 -131 61.5 -204.5t190.5 -73.5q63 0 129.5 18t165.5 66v-146q-94 -44 -166 -61.5t-159 -17.5zM631 973 q-103 0 -193.5 -94t-138.5 -261h12q228 0 349.5 59.5t121.5 172.5q0 53 -36.5 88t-114.5 35zM966 1241h-103q-57 48 -161 189q-134 -119 -242 -189h-109v27q145 133 204.5 197.5t82.5 103.5h158q37 -99 128 -235l42 -66v-27z" />
<glyph unicode="&#xeb;" horiz-adv-x="1010" d="M98 0zM492 -20q-184 0 -289 109t-105 302q0 188 74.5 360.5t197.5 268.5t271 96q153 0 230 -66.5t77 -185.5q0 -180 -166 -282.5t-475 -102.5h-33l-4 -80q0 -131 61.5 -204.5t190.5 -73.5q63 0 129.5 18t165.5 66v-146q-94 -44 -166 -61.5t-159 -17.5zM631 973 q-103 0 -193.5 -94t-138.5 -261h12q228 0 349.5 59.5t121.5 172.5q0 53 -36.5 88t-114.5 35zM413 1378q0 46 28 79.5t74 33.5q78 0 78 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62zM777 1378q0 46 28 79.5t75 33.5q77 0 77 -80q0 -49 -29.5 -83t-68.5 -34 q-35 0 -58.5 22t-23.5 62z" />
<glyph unicode="&#xec;" horiz-adv-x="520" d="M59 0zM227 0h-168l234 1096h168zM492 1241h-104q-61 61 -128.5 154t-95.5 153v21h181q43 -136 147 -303v-25z" />
<glyph unicode="&#xed;" horiz-adv-x="520" d="M59 0zM227 0h-168l234 1096h168zM324 1268q56 60 125.5 151.5t106.5 149.5h190v-21q-38 -49 -140 -151t-177 -156h-105v27z" />
<glyph unicode="&#xee;" horiz-adv-x="520" d="M59 0zM227 0h-168l234 1096h168zM708 1241h-103q-57 48 -161 189q-134 -119 -242 -189h-109v27q145 133 204.5 197.5t82.5 103.5h158q37 -99 128 -235l42 -66v-27z" />
<glyph unicode="&#xef;" horiz-adv-x="520" d="M59 0zM227 0h-168l234 1096h168zM161 1378q0 46 28 79.5t74 33.5q78 0 78 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62zM525 1378q0 46 28 79.5t75 33.5q77 0 77 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62z" />
<glyph unicode="&#xf0;" horiz-adv-x="1165" d="M676 1343q-66 58 -146 113l95 117q118 -84 188 -154l260 146l64 -105l-240 -133q87 -115 126.5 -240.5t39.5 -269.5q0 -253 -71.5 -447t-203 -292t-311.5 -98q-182 0 -284.5 104t-102.5 289q0 160 67.5 298t187 217t267.5 79q105 0 181.5 -45.5t111.5 -124.5l6 2v17 q0 136 -36.5 240t-110.5 197l-270 -149l-56 108zM487 121q107 0 190 56t134 168t51 226q0 118 -65.5 187t-178.5 69q-109 0 -189 -57.5t-123.5 -161t-43.5 -231.5q0 -126 57.5 -191t167.5 -65z" />
<glyph unicode="&#xf1;" horiz-adv-x="1182" d="M59 0zM729 0l148 692q20 104 20 144q0 63 -35.5 101t-113.5 38q-89 0 -173.5 -60t-149 -171t-97.5 -269l-101 -475h-168l234 1096h139l-22 -203h10q96 122 185.5 172.5t185.5 50.5q127 0 200.5 -69.5t73.5 -194.5q0 -79 -23 -180l-143 -672h-170zM871 1243 q-40 0 -77.5 17.5t-73 39t-69 39t-65.5 17.5q-44 0 -69.5 -28.5t-47.5 -86.5h-100q58 258 231 258q44 0 83.5 -18t75 -39.5t66.5 -39.5t58 -18q44 0 69.5 27t51.5 90h100q-66 -258 -233 -258z" />
<glyph unicode="&#xf2;" horiz-adv-x="1149" d="M98 0zM643 1110q190 0 300 -112.5t110 -309.5q0 -188 -72 -355t-195 -258t-278 -91q-192 0 -301 113t-109 309q0 190 73 357.5t197 257t275 89.5zM879 711q0 115 -62.5 186.5t-169.5 71.5q-109 0 -195.5 -74t-134 -205.5t-47.5 -292.5q0 -131 63.5 -202.5t182.5 -71.5 q104 0 187 73t129.5 207.5t46.5 307.5zM798 1241h-104q-61 61 -128.5 154t-95.5 153v21h181q43 -136 147 -303v-25z" />
<glyph unicode="&#xf3;" horiz-adv-x="1149" d="M98 0zM643 1110q190 0 300 -112.5t110 -309.5q0 -188 -72 -355t-195 -258t-278 -91q-192 0 -301 113t-109 309q0 190 73 357.5t197 257t275 89.5zM879 711q0 115 -62.5 186.5t-169.5 71.5q-109 0 -195.5 -74t-134 -205.5t-47.5 -292.5q0 -131 63.5 -202.5t182.5 -71.5 q104 0 187 73t129.5 207.5t46.5 307.5zM589 1268q56 60 125.5 151.5t106.5 149.5h190v-21q-38 -49 -140 -151t-177 -156h-105v27z" />
<glyph unicode="&#xf4;" horiz-adv-x="1149" d="M98 0zM643 1110q190 0 300 -112.5t110 -309.5q0 -188 -72 -355t-195 -258t-278 -91q-192 0 -301 113t-109 309q0 190 73 357.5t197 257t275 89.5zM879 711q0 115 -62.5 186.5t-169.5 71.5q-109 0 -195.5 -74t-134 -205.5t-47.5 -292.5q0 -131 63.5 -202.5t182.5 -71.5 q104 0 187 73t129.5 207.5t46.5 307.5zM997 1241h-103q-57 48 -161 189q-134 -119 -242 -189h-109v27q145 133 204.5 197.5t82.5 103.5h158q37 -99 128 -235l42 -66v-27z" />
<glyph unicode="&#xf5;" horiz-adv-x="1149" d="M98 0zM643 1110q190 0 300 -112.5t110 -309.5q0 -188 -72 -355t-195 -258t-278 -91q-192 0 -301 113t-109 309q0 190 73 357.5t197 257t275 89.5zM879 711q0 115 -62.5 186.5t-169.5 71.5q-109 0 -195.5 -74t-134 -205.5t-47.5 -292.5q0 -131 63.5 -202.5t182.5 -71.5 q104 0 187 73t129.5 207.5t46.5 307.5zM844 1243q-40 0 -77.5 17.5t-73 39t-69 39t-65.5 17.5q-44 0 -69.5 -28.5t-47.5 -86.5h-100q58 258 231 258q44 0 83.5 -18t75 -39.5t66.5 -39.5t58 -18q44 0 69.5 27t51.5 90h100q-66 -258 -233 -258z" />
<glyph unicode="&#xf6;" horiz-adv-x="1149" d="M98 0zM643 1110q190 0 300 -112.5t110 -309.5q0 -188 -72 -355t-195 -258t-278 -91q-192 0 -301 113t-109 309q0 190 73 357.5t197 257t275 89.5zM879 711q0 115 -62.5 186.5t-169.5 71.5q-109 0 -195.5 -74t-134 -205.5t-47.5 -292.5q0 -131 63.5 -202.5t182.5 -71.5 q104 0 187 73t129.5 207.5t46.5 307.5zM433 1378q0 46 28 79.5t74 33.5q78 0 78 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62zM797 1378q0 46 28 79.5t75 33.5q77 0 77 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62z" />
<glyph unicode="&#xf7;" d="M127 651v142h920v-142h-920zM475 373q0 121 111 121q53 0 82.5 -30.5t29.5 -90.5q0 -58 -30 -89.5t-82 -31.5t-81.5 31t-29.5 90zM475 1071q0 121 111 121q53 0 82.5 -30.5t29.5 -90.5q0 -58 -30 -89.5t-82 -31.5t-81.5 31t-29.5 90z" />
<glyph unicode="&#xf8;" horiz-adv-x="1149" d="M1047 705q0 -189 -69.5 -360t-191.5 -266t-276 -95q-146 0 -246 65l-98 -125l-105 82l109 135q-68 103 -68 265q0 194 73.5 361t195.5 255t272 88q146 0 252 -68l104 129l105 -79l-119 -129q62 -97 62 -258zM647 971q-108 0 -195.5 -73t-137.5 -202t-50 -280 q0 -92 17 -137l518 645q-54 47 -152 47zM885 688q0 84 -13 119l-514 -641q57 -45 158 -45q103 0 188.5 71.5t133 200.5t47.5 295z" />
<glyph unicode="&#xf9;" horiz-adv-x="1182" d="M113 0zM451 1096l-150 -695q-18 -89 -18 -139q0 -143 147 -143q88 0 173 60t150 172t99 270l100 475h166l-231 -1096h-139l22 203h-12q-98 -125 -187 -174t-184 -49q-128 0 -201 69.5t-73 198.5q0 62 22 172l146 676h170zM800 1241h-104q-61 61 -128.5 154t-95.5 153v21 h181q43 -136 147 -303v-25z" />
<glyph unicode="&#xfa;" horiz-adv-x="1182" d="M113 0zM451 1096l-150 -695q-18 -89 -18 -139q0 -143 147 -143q88 0 173 60t150 172t99 270l100 475h166l-231 -1096h-139l22 203h-12q-98 -125 -187 -174t-184 -49q-128 0 -201 69.5t-73 198.5q0 62 22 172l146 676h170zM636 1268q56 60 125.5 151.5t106.5 149.5h190 v-21q-38 -49 -140 -151t-177 -156h-105v27z" />
<glyph unicode="&#xfb;" horiz-adv-x="1182" d="M113 0zM451 1096l-150 -695q-18 -89 -18 -139q0 -143 147 -143q88 0 173 60t150 172t99 270l100 475h166l-231 -1096h-139l22 203h-12q-98 -125 -187 -174t-184 -49q-128 0 -201 69.5t-73 198.5q0 62 22 172l146 676h170zM1024 1241h-103q-57 48 -161 189 q-134 -119 -242 -189h-109v27q145 133 204.5 197.5t82.5 103.5h158q37 -99 128 -235l42 -66v-27z" />
<glyph unicode="&#xfc;" horiz-adv-x="1182" d="M113 0zM451 1096l-150 -695q-18 -89 -18 -139q0 -143 147 -143q88 0 173 60t150 172t99 270l100 475h166l-231 -1096h-139l22 203h-12q-98 -125 -187 -174t-184 -49q-128 0 -201 69.5t-73 198.5q0 62 22 172l146 676h170zM457 1378q0 46 28 79.5t74 33.5q78 0 78 -80 q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62zM821 1378q0 46 28 79.5t75 33.5q77 0 77 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62z" />
<glyph unicode="&#xfd;" horiz-adv-x="946" d="M0 0zM98 1096h168l74 -545q10 -69 19.5 -203.5t9.5 -216.5h6q35 87 87 200t77 156l325 609h178l-696 -1282q-93 -172 -184 -239t-219 -67q-72 0 -140 21v135q63 -18 131 -18q82 0 140.5 50.5t113.5 149.5l76 136zM500 1268q56 60 125.5 151.5t106.5 149.5h190v-21 q-38 -49 -140 -151t-177 -156h-105v27z" />
<glyph unicode="&#xfe;" horiz-adv-x="1182" d="M545 -20q-98 0 -172 51t-113 139h-10q-8 -104 -25 -176l-102 -486h-166l432 2048h168q-95 -441 -115 -522t-39 -149h9q101 125 189 177t183 52q139 0 218 -97.5t79 -273.5q0 -212 -69 -389t-191 -275.5t-276 -98.5zM731 975q-96 0 -195.5 -95t-158 -239t-58.5 -295 q0 -110 55.5 -168.5t160.5 -58.5q99 0 184.5 81t137.5 230.5t52 317.5q0 227 -178 227z" />
<glyph unicode="&#xff;" horiz-adv-x="946" d="M0 0zM98 1096h168l74 -545q10 -69 19.5 -203.5t9.5 -216.5h6q35 87 87 200t77 156l325 609h178l-696 -1282q-93 -172 -184 -239t-219 -67q-72 0 -140 21v135q63 -18 131 -18q82 0 140.5 50.5t113.5 149.5l76 136zM335 1378q0 46 28 79.5t74 33.5q78 0 78 -80 q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62zM699 1378q0 46 28 79.5t75 33.5q77 0 77 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62z" />
<glyph unicode="&#x131;" horiz-adv-x="520" d="M227 0h-168l234 1096h168z" />
<glyph unicode="&#x152;" horiz-adv-x="1751" d="M1524 0h-674q-78 -20 -158 -20q-256 0 -399 149.5t-143 419.5q0 264 96 482t263.5 336t377.5 118q152 0 237 -23h709l-31 -153h-565l-100 -469h528l-31 -150h-528l-115 -538h565zM696 131q69 0 123 19l246 1161q-76 22 -191 22q-157 0 -281 -101t-192.5 -281t-68.5 -398 q0 -199 98 -310.5t266 -111.5z" />
<glyph unicode="&#x153;" horiz-adv-x="1769" d="M1251 -20q-270 0 -356 225q-69 -107 -171.5 -164t-225.5 -57q-184 0 -292 114t-108 308q0 193 75 360t201 255.5t281 88.5q270 0 359 -225q75 109 177.5 170t221.5 61q139 0 217 -65.5t78 -186.5q0 -183 -164.5 -284t-468.5 -101h-41l-4 -80q0 -131 61.5 -204.5 t190.5 -73.5q75 0 145 24.5t150 59.5v-150q-162 -75 -326 -75zM649 969q-109 0 -196 -73t-135 -202t-48 -284q0 -141 62 -214t172 -73q177 0 278 160.5t101 427.5q0 124 -59.5 191t-174.5 67zM1413 973q-125 0 -220.5 -94.5t-139.5 -260.5h18q231 0 351 61t120 177 q0 48 -32 82.5t-97 34.5z" />
<glyph unicode="&#x178;" horiz-adv-x="1030" d="M188 0zM537 715l489 747h193l-627 -921l-113 -541h-172l119 549l-238 913h170zM452 1716q0 46 28 79.5t74 33.5q78 0 78 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22t-23.5 62zM816 1716q0 46 28 79.5t75 33.5q77 0 77 -80q0 -49 -29.5 -83t-68.5 -34q-35 0 -58.5 22 t-23.5 62z" />
<glyph unicode="&#x2c6;" horiz-adv-x="1135" d="M1014 1241h-103q-57 48 -161 189q-134 -119 -242 -189h-109v27q145 133 204.5 197.5t82.5 103.5h158q37 -99 128 -235l42 -66v-27z" />
<glyph unicode="&#x2da;" horiz-adv-x="1182" d="M989 1456q0 -99 -60 -157t-159 -58q-101 0 -160 57.5t-59 155.5q0 94 62 152.5t157 58.5q101 0 160 -57t59 -152zM885 1454q0 53 -32 84t-83 31q-49 0 -82 -31t-33 -84q0 -54 29.5 -84.5t85.5 -30.5q51 0 83 30.5t32 84.5z" />
<glyph unicode="&#x2dc;" horiz-adv-x="1135" d="M838 1243q-40 0 -77.5 17.5t-73 39t-69 39t-65.5 17.5q-44 0 -69.5 -28.5t-47.5 -86.5h-100q58 258 231 258q44 0 83.5 -18t75 -39.5t66.5 -39.5t58 -18q44 0 69.5 27t51.5 90h100q-66 -258 -233 -258z" />
<glyph unicode="&#x2000;" horiz-adv-x="953" />
<glyph unicode="&#x2001;" horiz-adv-x="1907" />
<glyph unicode="&#x2002;" horiz-adv-x="953" />
<glyph unicode="&#x2003;" horiz-adv-x="1907" />
<glyph unicode="&#x2004;" horiz-adv-x="635" />
<glyph unicode="&#x2005;" horiz-adv-x="476" />
<glyph unicode="&#x2006;" horiz-adv-x="317" />
<glyph unicode="&#x2007;" horiz-adv-x="317" />
<glyph unicode="&#x2008;" horiz-adv-x="238" />
<glyph unicode="&#x2009;" horiz-adv-x="381" />
<glyph unicode="&#x200a;" horiz-adv-x="105" />
<glyph unicode="&#x2010;" horiz-adv-x="639" d="M55 469l35 158h479l-34 -158h-480z" />
<glyph unicode="&#x2011;" horiz-adv-x="639" d="M55 469l35 158h479l-34 -158h-480z" />
<glyph unicode="&#x2012;" horiz-adv-x="639" d="M55 469l35 158h479l-34 -158h-480z" />
<glyph unicode="&#x2013;" horiz-adv-x="983" d="M55 469l35 160h823l-34 -160h-824z" />
<glyph unicode="&#x2014;" horiz-adv-x="1966" d="M55 469l35 160h1806l-34 -160h-1807z" />
<glyph unicode="&#x2018;" horiz-adv-x="348" d="M129 961l-6 22q98 211 270 479h127q-147 -345 -203 -501h-188z" />
<glyph unicode="&#x2019;" horiz-adv-x="348" d="M516 1462l8 -22q-40 -91 -111 -218.5t-159 -260.5h-129q134 298 203 501h188z" />
<glyph unicode="&#x201a;" horiz-adv-x="492" d="M291 238l8 -23q-113 -235 -270 -479h-129q126 286 204 502h187z" />
<glyph unicode="&#x201c;" horiz-adv-x="719" d="M500 961l-8 22q80 181 272 479h127q-162 -379 -203 -501h-188zM129 961l-6 22q98 211 270 479h127q-147 -345 -203 -501h-188z" />
<glyph unicode="&#x201d;" horiz-adv-x="719" d="M516 1462l8 -22q-40 -91 -111 -218.5t-159 -260.5h-129q134 298 203 501h188zM885 1462l10 -22q-94 -206 -274 -479h-127q57 126 115.5 272.5t86.5 228.5h189z" />
<glyph unicode="&#x201e;" horiz-adv-x="858" d="M291 238l8 -23q-113 -235 -270 -479h-129q126 286 204 502h187zM659 238l9 -23q-95 -205 -271 -479h-129q140 316 203 502h188z" />
<glyph unicode="&#x2022;" horiz-adv-x="774" d="M199 684q0 145 73.5 231t198.5 86q92 0 139 -49t47 -141q0 -141 -74 -230t-202 -89q-89 0 -135.5 49.5t-46.5 142.5z" />
<glyph unicode="&#x2026;" horiz-adv-x="1563" d="M43 0zM563 74q0 77 40.5 122.5t111.5 45.5q43 0 69.5 -26t26.5 -79q0 -71 -40 -118.5t-108 -47.5q-46 0 -73 26t-27 77zM1085 74q0 77 40.5 122.5t111.5 45.5q43 0 69.5 -26t26.5 -79q0 -71 -40 -118.5t-108 -47.5q-46 0 -73 26t-27 77zM43 74q0 77 40.5 122.5 t111.5 45.5q43 0 69.5 -26t26.5 -79q0 -71 -40 -118.5t-108 -47.5q-46 0 -73 26t-27 77z" />
<glyph unicode="&#x202f;" horiz-adv-x="381" />
<glyph unicode="&#x2039;" horiz-adv-x="580" d="M88 578l391 380l78 -81l-297 -334l172 -381l-113 -49l-231 436v29z" />
<glyph unicode="&#x203a;" horiz-adv-x="580" d="M492 496l-392 -381l-77 82l296 333l-172 381l113 50l232 -437v-28z" />
<glyph unicode="&#x2044;" horiz-adv-x="268" d="M752 1462l-1086 -1462h-153l1085 1462h154z" />
<glyph unicode="&#x205f;" horiz-adv-x="476" />
<glyph unicode="&#x2074;" horiz-adv-x="717" d="M713 788h-129l-43 -202h-127l43 202h-365l23 101l481 579h133l-121 -563h127zM481 905q69 322 90 395q-20 -36 -110 -149l-205 -246h225z" />
<glyph unicode="&#x20ac;" d="M928 1329q-140 0 -254 -99t-189 -298h426l-26 -133h-441q-21 -65 -32 -164h381l-29 -131h-361q0 -373 297 -373q123 0 256 55v-147q-127 -59 -278 -59q-212 0 -328.5 133.5t-116.5 378.5v12h-170l27 131h154q8 80 30 164h-151l27 133h159q97 267 259.5 408t369.5 141 q89 0 160 -21.5t141 -70.5l-80 -138q-113 78 -231 78z" />
<glyph unicode="&#x2122;" horiz-adv-x="1534" d="M438 741h-121v617h-196v104h516v-104h-199v-617zM1014 741l-189 551h-6q4 -52 4 -121v-430h-118v721h180l182 -557l193 557h170v-721h-121v430q0 73 4 121h-6l-197 -551h-96z" />
<glyph unicode="&#xe000;" horiz-adv-x="1095" d="M0 1095h1095v-1095h-1095v1095z" />
<glyph horiz-adv-x="1182" d="M0 0z" />
<hkern u1="&#x22;" u2="&#x178;" k="-20" />
<hkern u1="&#x22;" u2="&#x153;" k="123" />
<hkern u1="&#x22;" u2="&#xfc;" k="61" />
<hkern u1="&#x22;" u2="&#xfb;" k="61" />
<hkern u1="&#x22;" u2="&#xfa;" k="61" />
<hkern u1="&#x22;" u2="&#xf9;" k="61" />
<hkern u1="&#x22;" u2="&#xf8;" k="123" />
<hkern u1="&#x22;" u2="&#xf6;" k="123" />
<hkern u1="&#x22;" u2="&#xf5;" k="123" />
<hkern u1="&#x22;" u2="&#xf4;" k="123" />
<hkern u1="&#x22;" u2="&#xf3;" k="123" />
<hkern u1="&#x22;" u2="&#xf2;" k="123" />
<hkern u1="&#x22;" u2="&#xeb;" k="123" />
<hkern u1="&#x22;" u2="&#xea;" k="123" />
<hkern u1="&#x22;" u2="&#xe9;" k="123" />
<hkern u1="&#x22;" u2="&#xe8;" k="123" />
<hkern u1="&#x22;" u2="&#xe7;" k="123" />
<hkern u1="&#x22;" u2="&#xe6;" k="82" />
<hkern u1="&#x22;" u2="&#xe5;" k="82" />
<hkern u1="&#x22;" u2="&#xe4;" k="82" />
<hkern u1="&#x22;" u2="&#xe3;" k="82" />
<hkern u1="&#x22;" u2="&#xe2;" k="82" />
<hkern u1="&#x22;" u2="&#xe1;" k="82" />
<hkern u1="&#x22;" u2="&#xe0;" k="123" />
<hkern u1="&#x22;" u2="&#xdd;" k="-20" />
<hkern u1="&#x22;" u2="&#xc5;" k="143" />
<hkern u1="&#x22;" u2="&#xc4;" k="143" />
<hkern u1="&#x22;" u2="&#xc3;" k="143" />
<hkern u1="&#x22;" u2="&#xc2;" k="143" />
<hkern u1="&#x22;" u2="&#xc1;" k="143" />
<hkern u1="&#x22;" u2="&#xc0;" k="143" />
<hkern u1="&#x22;" u2="u" k="61" />
<hkern u1="&#x22;" u2="s" k="61" />
<hkern u1="&#x22;" u2="r" k="61" />
<hkern u1="&#x22;" u2="q" k="123" />
<hkern u1="&#x22;" u2="p" k="61" />
<hkern u1="&#x22;" u2="o" k="123" />
<hkern u1="&#x22;" u2="n" k="61" />
<hkern u1="&#x22;" u2="m" k="61" />
<hkern u1="&#x22;" u2="g" k="61" />
<hkern u1="&#x22;" u2="e" k="123" />
<hkern u1="&#x22;" u2="d" k="123" />
<hkern u1="&#x22;" u2="c" k="123" />
<hkern u1="&#x22;" u2="a" k="82" />
<hkern u1="&#x22;" u2="Y" k="-20" />
<hkern u1="&#x22;" u2="W" k="-41" />
<hkern u1="&#x22;" u2="V" k="-41" />
<hkern u1="&#x22;" u2="T" k="-41" />
<hkern u1="&#x22;" u2="A" k="143" />
<hkern u1="&#x27;" u2="&#x178;" k="-20" />
<hkern u1="&#x27;" u2="&#x153;" k="123" />
<hkern u1="&#x27;" u2="&#xfc;" k="61" />
<hkern u1="&#x27;" u2="&#xfb;" k="61" />
<hkern u1="&#x27;" u2="&#xfa;" k="61" />
<hkern u1="&#x27;" u2="&#xf9;" k="61" />
<hkern u1="&#x27;" u2="&#xf8;" k="123" />
<hkern u1="&#x27;" u2="&#xf6;" k="123" />
<hkern u1="&#x27;" u2="&#xf5;" k="123" />
<hkern u1="&#x27;" u2="&#xf4;" k="123" />
<hkern u1="&#x27;" u2="&#xf3;" k="123" />
<hkern u1="&#x27;" u2="&#xf2;" k="123" />
<hkern u1="&#x27;" u2="&#xeb;" k="123" />
<hkern u1="&#x27;" u2="&#xea;" k="123" />
<hkern u1="&#x27;" u2="&#xe9;" k="123" />
<hkern u1="&#x27;" u2="&#xe8;" k="123" />
<hkern u1="&#x27;" u2="&#xe7;" k="123" />
<hkern u1="&#x27;" u2="&#xe6;" k="82" />
<hkern u1="&#x27;" u2="&#xe5;" k="82" />
<hkern u1="&#x27;" u2="&#xe4;" k="82" />
<hkern u1="&#x27;" u2="&#xe3;" k="82" />
<hkern u1="&#x27;" u2="&#xe2;" k="82" />
<hkern u1="&#x27;" u2="&#xe1;" k="82" />
<hkern u1="&#x27;" u2="&#xe0;" k="123" />
<hkern u1="&#x27;" u2="&#xdd;" k="-20" />
<hkern u1="&#x27;" u2="&#xc5;" k="143" />
<hkern u1="&#x27;" u2="&#xc4;" k="143" />
<hkern u1="&#x27;" u2="&#xc3;" k="143" />
<hkern u1="&#x27;" u2="&#xc2;" k="143" />
<hkern u1="&#x27;" u2="&#xc1;" k="143" />
<hkern u1="&#x27;" u2="&#xc0;" k="143" />
<hkern u1="&#x27;" u2="u" k="61" />
<hkern u1="&#x27;" u2="s" k="61" />
<hkern u1="&#x27;" u2="r" k="61" />
<hkern u1="&#x27;" u2="q" k="123" />
<hkern u1="&#x27;" u2="p" k="61" />
<hkern u1="&#x27;" u2="o" k="123" />
<hkern u1="&#x27;" u2="n" k="61" />
<hkern u1="&#x27;" u2="m" k="61" />
<hkern u1="&#x27;" u2="g" k="61" />
<hkern u1="&#x27;" u2="e" k="123" />
<hkern u1="&#x27;" u2="d" k="123" />
<hkern u1="&#x27;" u2="c" k="123" />
<hkern u1="&#x27;" u2="a" k="82" />
<hkern u1="&#x27;" u2="Y" k="-20" />
<hkern u1="&#x27;" u2="W" k="-41" />
<hkern u1="&#x27;" u2="V" k="-41" />
<hkern u1="&#x27;" u2="T" k="-41" />
<hkern u1="&#x27;" u2="A" k="143" />
<hkern u1="&#x28;" u2="J" k="-184" />
<hkern u1="&#x2c;" u2="&#x178;" k="123" />
<hkern u1="&#x2c;" u2="&#x152;" k="102" />
<hkern u1="&#x2c;" u2="&#xdd;" k="123" />
<hkern u1="&#x2c;" u2="&#xdc;" k="41" />
<hkern u1="&#x2c;" u2="&#xdb;" k="41" />
<hkern u1="&#x2c;" u2="&#xda;" k="41" />
<hkern u1="&#x2c;" u2="&#xd9;" k="41" />
<hkern u1="&#x2c;" u2="&#xd8;" k="102" />
<hkern u1="&#x2c;" u2="&#xd6;" k="102" />
<hkern u1="&#x2c;" u2="&#xd5;" k="102" />
<hkern u1="&#x2c;" u2="&#xd4;" k="102" />
<hkern u1="&#x2c;" u2="&#xd3;" k="102" />
<hkern u1="&#x2c;" u2="&#xd2;" k="102" />
<hkern u1="&#x2c;" u2="&#xc7;" k="102" />
<hkern u1="&#x2c;" u2="Y" k="123" />
<hkern u1="&#x2c;" u2="W" k="123" />
<hkern u1="&#x2c;" u2="V" k="123" />
<hkern u1="&#x2c;" u2="U" k="41" />
<hkern u1="&#x2c;" u2="T" k="143" />
<hkern u1="&#x2c;" u2="Q" k="102" />
<hkern u1="&#x2c;" u2="O" k="102" />
<hkern u1="&#x2c;" u2="G" k="102" />
<hkern u1="&#x2c;" u2="C" k="102" />
<hkern u1="&#x2d;" u2="T" k="82" />
<hkern u1="&#x2e;" u2="&#x178;" k="123" />
<hkern u1="&#x2e;" u2="&#x152;" k="102" />
<hkern u1="&#x2e;" u2="&#xdd;" k="123" />
<hkern u1="&#x2e;" u2="&#xdc;" k="41" />
<hkern u1="&#x2e;" u2="&#xdb;" k="41" />
<hkern u1="&#x2e;" u2="&#xda;" k="41" />
<hkern u1="&#x2e;" u2="&#xd9;" k="41" />
<hkern u1="&#x2e;" u2="&#xd8;" k="102" />
<hkern u1="&#x2e;" u2="&#xd6;" k="102" />
<hkern u1="&#x2e;" u2="&#xd5;" k="102" />
<hkern u1="&#x2e;" u2="&#xd4;" k="102" />
<hkern u1="&#x2e;" u2="&#xd3;" k="102" />
<hkern u1="&#x2e;" u2="&#xd2;" k="102" />
<hkern u1="&#x2e;" u2="&#xc7;" k="102" />
<hkern u1="&#x2e;" u2="Y" k="123" />
<hkern u1="&#x2e;" u2="W" k="123" />
<hkern u1="&#x2e;" u2="V" k="123" />
<hkern u1="&#x2e;" u2="U" k="41" />
<hkern u1="&#x2e;" u2="T" k="143" />
<hkern u1="&#x2e;" u2="Q" k="102" />
<hkern u1="&#x2e;" u2="O" k="102" />
<hkern u1="&#x2e;" u2="G" k="102" />
<hkern u1="&#x2e;" u2="C" k="102" />
<hkern u1="A" u2="&#x201d;" k="143" />
<hkern u1="A" u2="&#x2019;" k="143" />
<hkern u1="A" u2="&#x178;" k="123" />
<hkern u1="A" u2="&#x152;" k="41" />
<hkern u1="A" u2="&#xdd;" k="123" />
<hkern u1="A" u2="&#xd8;" k="41" />
<hkern u1="A" u2="&#xd6;" k="41" />
<hkern u1="A" u2="&#xd5;" k="41" />
<hkern u1="A" u2="&#xd4;" k="41" />
<hkern u1="A" u2="&#xd3;" k="41" />
<hkern u1="A" u2="&#xd2;" k="41" />
<hkern u1="A" u2="&#xc7;" k="41" />
<hkern u1="A" u2="Y" k="123" />
<hkern u1="A" u2="W" k="82" />
<hkern u1="A" u2="V" k="82" />
<hkern u1="A" u2="T" k="143" />
<hkern u1="A" u2="Q" k="41" />
<hkern u1="A" u2="O" k="41" />
<hkern u1="A" u2="J" k="-266" />
<hkern u1="A" u2="G" k="41" />
<hkern u1="A" u2="C" k="41" />
<hkern u1="A" u2="&#x27;" k="143" />
<hkern u1="A" u2="&#x22;" k="143" />
<hkern u1="B" u2="&#x201e;" k="82" />
<hkern u1="B" u2="&#x201a;" k="82" />
<hkern u1="B" u2="&#x178;" k="20" />
<hkern u1="B" u2="&#xdd;" k="20" />
<hkern u1="B" u2="&#xc5;" k="41" />
<hkern u1="B" u2="&#xc4;" k="41" />
<hkern u1="B" u2="&#xc3;" k="41" />
<hkern u1="B" u2="&#xc2;" k="41" />
<hkern u1="B" u2="&#xc1;" k="41" />
<hkern u1="B" u2="&#xc0;" k="41" />
<hkern u1="B" u2="Z" k="20" />
<hkern u1="B" u2="Y" k="20" />
<hkern u1="B" u2="X" k="41" />
<hkern u1="B" u2="W" k="20" />
<hkern u1="B" u2="V" k="20" />
<hkern u1="B" u2="T" k="61" />
<hkern u1="B" u2="A" k="41" />
<hkern u1="B" u2="&#x2e;" k="82" />
<hkern u1="B" u2="&#x2c;" k="82" />
<hkern u1="C" u2="&#x152;" k="41" />
<hkern u1="C" u2="&#xd8;" k="41" />
<hkern u1="C" u2="&#xd6;" k="41" />
<hkern u1="C" u2="&#xd5;" k="41" />
<hkern u1="C" u2="&#xd4;" k="41" />
<hkern u1="C" u2="&#xd3;" k="41" />
<hkern u1="C" u2="&#xd2;" k="41" />
<hkern u1="C" u2="&#xc7;" k="41" />
<hkern u1="C" u2="Q" k="41" />
<hkern u1="C" u2="O" k="41" />
<hkern u1="C" u2="G" k="41" />
<hkern u1="C" u2="C" k="41" />
<hkern u1="D" u2="&#x201e;" k="82" />
<hkern u1="D" u2="&#x201a;" k="82" />
<hkern u1="D" u2="&#x178;" k="20" />
<hkern u1="D" u2="&#xdd;" k="20" />
<hkern u1="D" u2="&#xc5;" k="41" />
<hkern u1="D" u2="&#xc4;" k="41" />
<hkern u1="D" u2="&#xc3;" k="41" />
<hkern u1="D" u2="&#xc2;" k="41" />
<hkern u1="D" u2="&#xc1;" k="41" />
<hkern u1="D" u2="&#xc0;" k="41" />
<hkern u1="D" u2="Z" k="20" />
<hkern u1="D" u2="Y" k="20" />
<hkern u1="D" u2="X" k="41" />
<hkern u1="D" u2="W" k="20" />
<hkern u1="D" u2="V" k="20" />
<hkern u1="D" u2="T" k="61" />
<hkern u1="D" u2="A" k="41" />
<hkern u1="D" u2="&#x2e;" k="82" />
<hkern u1="D" u2="&#x2c;" k="82" />
<hkern u1="E" u2="J" k="-123" />
<hkern u1="F" u2="&#x201e;" k="123" />
<hkern u1="F" u2="&#x201a;" k="123" />
<hkern u1="F" u2="&#xc5;" k="41" />
<hkern u1="F" u2="&#xc4;" k="41" />
<hkern u1="F" u2="&#xc3;" k="41" />
<hkern u1="F" u2="&#xc2;" k="41" />
<hkern u1="F" u2="&#xc1;" k="41" />
<hkern u1="F" u2="&#xc0;" k="41" />
<hkern u1="F" u2="A" k="41" />
<hkern u1="F" u2="&#x3f;" k="-41" />
<hkern u1="F" u2="&#x2e;" k="123" />
<hkern u1="F" u2="&#x2c;" k="123" />
<hkern u1="K" u2="&#x152;" k="41" />
<hkern u1="K" u2="&#xd8;" k="41" />
<hkern u1="K" u2="&#xd6;" k="41" />
<hkern u1="K" u2="&#xd5;" k="41" />
<hkern u1="K" u2="&#xd4;" k="41" />
<hkern u1="K" u2="&#xd3;" k="41" />
<hkern u1="K" u2="&#xd2;" k="41" />
<hkern u1="K" u2="&#xc7;" k="41" />
<hkern u1="K" u2="Q" k="41" />
<hkern u1="K" u2="O" k="41" />
<hkern u1="K" u2="G" k="41" />
<hkern u1="K" u2="C" k="41" />
<hkern u1="L" u2="&#x201d;" k="164" />
<hkern u1="L" u2="&#x2019;" k="164" />
<hkern u1="L" u2="&#x178;" k="61" />
<hkern u1="L" u2="&#x152;" k="41" />
<hkern u1="L" u2="&#xdd;" k="61" />
<hkern u1="L" u2="&#xdc;" k="20" />
<hkern u1="L" u2="&#xdb;" k="20" />
<hkern u1="L" u2="&#xda;" k="20" />
<hkern u1="L" u2="&#xd9;" k="20" />
<hkern u1="L" u2="&#xd8;" k="41" />
<hkern u1="L" u2="&#xd6;" k="41" />
<hkern u1="L" u2="&#xd5;" k="41" />
<hkern u1="L" u2="&#xd4;" k="41" />
<hkern u1="L" u2="&#xd3;" k="41" />
<hkern u1="L" u2="&#xd2;" k="41" />
<hkern u1="L" u2="&#xc7;" k="41" />
<hkern u1="L" u2="Y" k="61" />
<hkern u1="L" u2="W" k="41" />
<hkern u1="L" u2="V" k="41" />
<hkern u1="L" u2="U" k="20" />
<hkern u1="L" u2="T" k="41" />
<hkern u1="L" u2="Q" k="41" />
<hkern u1="L" u2="O" k="41" />
<hkern u1="L" u2="G" k="41" />
<hkern u1="L" u2="C" k="41" />
<hkern u1="L" u2="&#x27;" k="164" />
<hkern u1="L" u2="&#x22;" k="164" />
<hkern u1="O" u2="&#x201e;" k="82" />
<hkern u1="O" u2="&#x201a;" k="82" />
<hkern u1="O" u2="&#x178;" k="20" />
<hkern u1="O" u2="&#xdd;" k="20" />
<hkern u1="O" u2="&#xc5;" k="41" />
<hkern u1="O" u2="&#xc4;" k="41" />
<hkern u1="O" u2="&#xc3;" k="41" />
<hkern u1="O" u2="&#xc2;" k="41" />
<hkern u1="O" u2="&#xc1;" k="41" />
<hkern u1="O" u2="&#xc0;" k="41" />
<hkern u1="O" u2="Z" k="20" />
<hkern u1="O" u2="Y" k="20" />
<hkern u1="O" u2="X" k="41" />
<hkern u1="O" u2="W" k="20" />
<hkern u1="O" u2="V" k="20" />
<hkern u1="O" u2="T" k="61" />
<hkern u1="O" u2="A" k="41" />
<hkern u1="O" u2="&#x2e;" k="82" />
<hkern u1="O" u2="&#x2c;" k="82" />
<hkern u1="P" u2="&#x201e;" k="266" />
<hkern u1="P" u2="&#x201a;" k="266" />
<hkern u1="P" u2="&#xc5;" k="102" />
<hkern u1="P" u2="&#xc4;" k="102" />
<hkern u1="P" u2="&#xc3;" k="102" />
<hkern u1="P" u2="&#xc2;" k="102" />
<hkern u1="P" u2="&#xc1;" k="102" />
<hkern u1="P" u2="&#xc0;" k="102" />
<hkern u1="P" u2="Z" k="20" />
<hkern u1="P" u2="X" k="41" />
<hkern u1="P" u2="A" k="102" />
<hkern u1="P" u2="&#x2e;" k="266" />
<hkern u1="P" u2="&#x2c;" k="266" />
<hkern u1="Q" u2="&#x201e;" k="82" />
<hkern u1="Q" u2="&#x201a;" k="82" />
<hkern u1="Q" u2="&#x178;" k="20" />
<hkern u1="Q" u2="&#xdd;" k="20" />
<hkern u1="Q" u2="&#xc5;" k="41" />
<hkern u1="Q" u2="&#xc4;" k="41" />
<hkern u1="Q" u2="&#xc3;" k="41" />
<hkern u1="Q" u2="&#xc2;" k="41" />
<hkern u1="Q" u2="&#xc1;" k="41" />
<hkern u1="Q" u2="&#xc0;" k="41" />
<hkern u1="Q" u2="Z" k="20" />
<hkern u1="Q" u2="Y" k="20" />
<hkern u1="Q" u2="X" k="41" />
<hkern u1="Q" u2="W" k="20" />
<hkern u1="Q" u2="V" k="20" />
<hkern u1="Q" u2="T" k="61" />
<hkern u1="Q" u2="A" k="41" />
<hkern u1="Q" u2="&#x2e;" k="82" />
<hkern u1="Q" u2="&#x2c;" k="82" />
<hkern u1="T" u2="&#x201e;" k="123" />
<hkern u1="T" u2="&#x201a;" k="123" />
<hkern u1="T" u2="&#x2014;" k="82" />
<hkern u1="T" u2="&#x2013;" k="82" />
<hkern u1="T" u2="&#x153;" k="143" />
<hkern u1="T" u2="&#x152;" k="41" />
<hkern u1="T" u2="&#xfd;" k="41" />
<hkern u1="T" u2="&#xfc;" k="102" />
<hkern u1="T" u2="&#xfb;" k="102" />
<hkern u1="T" u2="&#xfa;" k="102" />
<hkern u1="T" u2="&#xf9;" k="102" />
<hkern u1="T" u2="&#xf8;" k="143" />
<hkern u1="T" u2="&#xf6;" k="143" />
<hkern u1="T" u2="&#xf5;" k="143" />
<hkern u1="T" u2="&#xf4;" k="143" />
<hkern u1="T" u2="&#xf3;" k="143" />
<hkern u1="T" u2="&#xf2;" k="143" />
<hkern u1="T" u2="&#xeb;" k="143" />
<hkern u1="T" u2="&#xea;" k="143" />
<hkern u1="T" u2="&#xe9;" k="143" />
<hkern u1="T" u2="&#xe8;" k="143" />
<hkern u1="T" u2="&#xe7;" k="143" />
<hkern u1="T" u2="&#xe6;" k="164" />
<hkern u1="T" u2="&#xe5;" k="164" />
<hkern u1="T" u2="&#xe4;" k="164" />
<hkern u1="T" u2="&#xe3;" k="164" />
<hkern u1="T" u2="&#xe2;" k="164" />
<hkern u1="T" u2="&#xe1;" k="164" />
<hkern u1="T" u2="&#xe0;" k="143" />
<hkern u1="T" u2="&#xd8;" k="41" />
<hkern u1="T" u2="&#xd6;" k="41" />
<hkern u1="T" u2="&#xd5;" k="41" />
<hkern u1="T" u2="&#xd4;" k="41" />
<hkern u1="T" u2="&#xd3;" k="41" />
<hkern u1="T" u2="&#xd2;" k="41" />
<hkern u1="T" u2="&#xc7;" k="41" />
<hkern u1="T" u2="&#xc5;" k="143" />
<hkern u1="T" u2="&#xc4;" k="143" />
<hkern u1="T" u2="&#xc3;" k="143" />
<hkern u1="T" u2="&#xc2;" k="143" />
<hkern u1="T" u2="&#xc1;" k="143" />
<hkern u1="T" u2="&#xc0;" k="143" />
<hkern u1="T" u2="z" k="82" />
<hkern u1="T" u2="y" k="41" />
<hkern u1="T" u2="x" k="41" />
<hkern u1="T" u2="w" k="41" />
<hkern u1="T" u2="v" k="41" />
<hkern u1="T" u2="u" k="102" />
<hkern u1="T" u2="s" k="123" />
<hkern u1="T" u2="r" k="102" />
<hkern u1="T" u2="q" k="143" />
<hkern u1="T" u2="p" k="102" />
<hkern u1="T" u2="o" k="143" />
<hkern u1="T" u2="n" k="102" />
<hkern u1="T" u2="m" k="102" />
<hkern u1="T" u2="g" k="143" />
<hkern u1="T" u2="e" k="143" />
<hkern u1="T" u2="d" k="143" />
<hkern u1="T" u2="c" k="143" />
<hkern u1="T" u2="a" k="164" />
<hkern u1="T" u2="T" k="-41" />
<hkern u1="T" u2="Q" k="41" />
<hkern u1="T" u2="O" k="41" />
<hkern u1="T" u2="G" k="41" />
<hkern u1="T" u2="C" k="41" />
<hkern u1="T" u2="A" k="143" />
<hkern u1="T" u2="&#x3f;" k="-41" />
<hkern u1="T" u2="&#x2e;" k="123" />
<hkern u1="T" u2="&#x2d;" k="82" />
<hkern u1="T" u2="&#x2c;" k="123" />
<hkern u1="U" u2="&#x201e;" k="41" />
<hkern u1="U" u2="&#x201a;" k="41" />
<hkern u1="U" u2="&#xc5;" k="20" />
<hkern u1="U" u2="&#xc4;" k="20" />
<hkern u1="U" u2="&#xc3;" k="20" />
<hkern u1="U" u2="&#xc2;" k="20" />
<hkern u1="U" u2="&#xc1;" k="20" />
<hkern u1="U" u2="&#xc0;" k="20" />
<hkern u1="U" u2="A" k="20" />
<hkern u1="U" u2="&#x2e;" k="41" />
<hkern u1="U" u2="&#x2c;" k="41" />
<hkern u1="V" u2="&#x201e;" k="102" />
<hkern u1="V" u2="&#x201a;" k="102" />
<hkern u1="V" u2="&#x153;" k="41" />
<hkern u1="V" u2="&#x152;" k="20" />
<hkern u1="V" u2="&#xfc;" k="20" />
<hkern u1="V" u2="&#xfb;" k="20" />
<hkern u1="V" u2="&#xfa;" k="20" />
<hkern u1="V" u2="&#xf9;" k="20" />
<hkern u1="V" u2="&#xf8;" k="41" />
<hkern u1="V" u2="&#xf6;" k="41" />
<hkern u1="V" u2="&#xf5;" k="41" />
<hkern u1="V" u2="&#xf4;" k="41" />
<hkern u1="V" u2="&#xf3;" k="41" />
<hkern u1="V" u2="&#xf2;" k="41" />
<hkern u1="V" u2="&#xeb;" k="41" />
<hkern u1="V" u2="&#xea;" k="41" />
<hkern u1="V" u2="&#xe9;" k="41" />
<hkern u1="V" u2="&#xe8;" k="41" />
<hkern u1="V" u2="&#xe7;" k="41" />
<hkern u1="V" u2="&#xe6;" k="41" />
<hkern u1="V" u2="&#xe5;" k="41" />
<hkern u1="V" u2="&#xe4;" k="41" />
<hkern u1="V" u2="&#xe3;" k="41" />
<hkern u1="V" u2="&#xe2;" k="41" />
<hkern u1="V" u2="&#xe1;" k="41" />
<hkern u1="V" u2="&#xe0;" k="41" />
<hkern u1="V" u2="&#xd8;" k="20" />
<hkern u1="V" u2="&#xd6;" k="20" />
<hkern u1="V" u2="&#xd5;" k="20" />
<hkern u1="V" u2="&#xd4;" k="20" />
<hkern u1="V" u2="&#xd3;" k="20" />
<hkern u1="V" u2="&#xd2;" k="20" />
<hkern u1="V" u2="&#xc7;" k="20" />
<hkern u1="V" u2="&#xc5;" k="82" />
<hkern u1="V" u2="&#xc4;" k="82" />
<hkern u1="V" u2="&#xc3;" k="82" />
<hkern u1="V" u2="&#xc2;" k="82" />
<hkern u1="V" u2="&#xc1;" k="82" />
<hkern u1="V" u2="&#xc0;" k="82" />
<hkern u1="V" u2="u" k="20" />
<hkern u1="V" u2="s" k="20" />
<hkern u1="V" u2="r" k="20" />
<hkern u1="V" u2="q" k="41" />
<hkern u1="V" u2="p" k="20" />
<hkern u1="V" u2="o" k="41" />
<hkern u1="V" u2="n" k="20" />
<hkern u1="V" u2="m" k="20" />
<hkern u1="V" u2="g" k="20" />
<hkern u1="V" u2="e" k="41" />
<hkern u1="V" u2="d" k="41" />
<hkern u1="V" u2="c" k="41" />
<hkern u1="V" u2="a" k="41" />
<hkern u1="V" u2="Q" k="20" />
<hkern u1="V" u2="O" k="20" />
<hkern u1="V" u2="G" k="20" />
<hkern u1="V" u2="C" k="20" />
<hkern u1="V" u2="A" k="82" />
<hkern u1="V" u2="&#x3f;" k="-41" />
<hkern u1="V" u2="&#x2e;" k="102" />
<hkern u1="V" u2="&#x2c;" k="102" />
<hkern u1="W" u2="&#x201e;" k="102" />
<hkern u1="W" u2="&#x201a;" k="102" />
<hkern u1="W" u2="&#x153;" k="41" />
<hkern u1="W" u2="&#x152;" k="20" />
<hkern u1="W" u2="&#xfc;" k="20" />
<hkern u1="W" u2="&#xfb;" k="20" />
<hkern u1="W" u2="&#xfa;" k="20" />
<hkern u1="W" u2="&#xf9;" k="20" />
<hkern u1="W" u2="&#xf8;" k="41" />
<hkern u1="W" u2="&#xf6;" k="41" />
<hkern u1="W" u2="&#xf5;" k="41" />
<hkern u1="W" u2="&#xf4;" k="41" />
<hkern u1="W" u2="&#xf3;" k="41" />
<hkern u1="W" u2="&#xf2;" k="41" />
<hkern u1="W" u2="&#xeb;" k="41" />
<hkern u1="W" u2="&#xea;" k="41" />
<hkern u1="W" u2="&#xe9;" k="41" />
<hkern u1="W" u2="&#xe8;" k="41" />
<hkern u1="W" u2="&#xe7;" k="41" />
<hkern u1="W" u2="&#xe6;" k="41" />
<hkern u1="W" u2="&#xe5;" k="41" />
<hkern u1="W" u2="&#xe4;" k="41" />
<hkern u1="W" u2="&#xe3;" k="41" />
<hkern u1="W" u2="&#xe2;" k="41" />
<hkern u1="W" u2="&#xe1;" k="41" />
<hkern u1="W" u2="&#xe0;" k="41" />
<hkern u1="W" u2="&#xd8;" k="20" />
<hkern u1="W" u2="&#xd6;" k="20" />
<hkern u1="W" u2="&#xd5;" k="20" />
<hkern u1="W" u2="&#xd4;" k="20" />
<hkern u1="W" u2="&#xd3;" k="20" />
<hkern u1="W" u2="&#xd2;" k="20" />
<hkern u1="W" u2="&#xc7;" k="20" />
<hkern u1="W" u2="&#xc5;" k="82" />
<hkern u1="W" u2="&#xc4;" k="82" />
<hkern u1="W" u2="&#xc3;" k="82" />
<hkern u1="W" u2="&#xc2;" k="82" />
<hkern u1="W" u2="&#xc1;" k="82" />
<hkern u1="W" u2="&#xc0;" k="82" />
<hkern u1="W" u2="u" k="20" />
<hkern u1="W" u2="s" k="20" />
<hkern u1="W" u2="r" k="20" />
<hkern u1="W" u2="q" k="41" />
<hkern u1="W" u2="p" k="20" />
<hkern u1="W" u2="o" k="41" />
<hkern u1="W" u2="n" k="20" />
<hkern u1="W" u2="m" k="20" />
<hkern u1="W" u2="g" k="20" />
<hkern u1="W" u2="e" k="41" />
<hkern u1="W" u2="d" k="41" />
<hkern u1="W" u2="c" k="41" />
<hkern u1="W" u2="a" k="41" />
<hkern u1="W" u2="Q" k="20" />
<hkern u1="W" u2="O" k="20" />
<hkern u1="W" u2="G" k="20" />
<hkern u1="W" u2="C" k="20" />
<hkern u1="W" u2="A" k="82" />
<hkern u1="W" u2="&#x3f;" k="-41" />
<hkern u1="W" u2="&#x2e;" k="102" />
<hkern u1="W" u2="&#x2c;" k="102" />
<hkern u1="X" u2="&#x152;" k="41" />
<hkern u1="X" u2="&#xd8;" k="41" />
<hkern u1="X" u2="&#xd6;" k="41" />
<hkern u1="X" u2="&#xd5;" k="41" />
<hkern u1="X" u2="&#xd4;" k="41" />
<hkern u1="X" u2="&#xd3;" k="41" />
<hkern u1="X" u2="&#xd2;" k="41" />
<hkern u1="X" u2="&#xc7;" k="41" />
<hkern u1="X" u2="Q" k="41" />
<hkern u1="X" u2="O" k="41" />
<hkern u1="X" u2="G" k="41" />
<hkern u1="X" u2="C" k="41" />
<hkern u1="Y" u2="&#x201e;" k="123" />
<hkern u1="Y" u2="&#x201a;" k="123" />
<hkern u1="Y" u2="&#x153;" k="102" />
<hkern u1="Y" u2="&#x152;" k="41" />
<hkern u1="Y" u2="&#xfc;" k="61" />
<hkern u1="Y" u2="&#xfb;" k="61" />
<hkern u1="Y" u2="&#xfa;" k="61" />
<hkern u1="Y" u2="&#xf9;" k="61" />
<hkern u1="Y" u2="&#xf8;" k="102" />
<hkern u1="Y" u2="&#xf6;" k="102" />
<hkern u1="Y" u2="&#xf5;" k="102" />
<hkern u1="Y" u2="&#xf4;" k="102" />
<hkern u1="Y" u2="&#xf3;" k="102" />
<hkern u1="Y" u2="&#xf2;" k="102" />
<hkern u1="Y" u2="&#xeb;" k="102" />
<hkern u1="Y" u2="&#xea;" k="102" />
<hkern u1="Y" u2="&#xe9;" k="102" />
<hkern u1="Y" u2="&#xe8;" k="102" />
<hkern u1="Y" u2="&#xe7;" k="102" />
<hkern u1="Y" u2="&#xe6;" k="102" />
<hkern u1="Y" u2="&#xe5;" k="102" />
<hkern u1="Y" u2="&#xe4;" k="102" />
<hkern u1="Y" u2="&#xe3;" k="102" />
<hkern u1="Y" u2="&#xe2;" k="102" />
<hkern u1="Y" u2="&#xe1;" k="102" />
<hkern u1="Y" u2="&#xe0;" k="102" />
<hkern u1="Y" u2="&#xd8;" k="41" />
<hkern u1="Y" u2="&#xd6;" k="41" />
<hkern u1="Y" u2="&#xd5;" k="41" />
<hkern u1="Y" u2="&#xd4;" k="41" />
<hkern u1="Y" u2="&#xd3;" k="41" />
<hkern u1="Y" u2="&#xd2;" k="41" />
<hkern u1="Y" u2="&#xc7;" k="41" />
<hkern u1="Y" u2="&#xc5;" k="123" />
<hkern u1="Y" u2="&#xc4;" k="123" />
<hkern u1="Y" u2="&#xc3;" k="123" />
<hkern u1="Y" u2="&#xc2;" k="123" />
<hkern u1="Y" u2="&#xc1;" k="123" />
<hkern u1="Y" u2="&#xc0;" k="123" />
<hkern u1="Y" u2="z" k="41" />
<hkern u1="Y" u2="u" k="61" />
<hkern u1="Y" u2="s" k="82" />
<hkern u1="Y" u2="r" k="61" />
<hkern u1="Y" u2="q" k="102" />
<hkern u1="Y" u2="p" k="61" />
<hkern u1="Y" u2="o" k="102" />
<hkern u1="Y" u2="n" k="61" />
<hkern u1="Y" u2="m" k="61" />
<hkern u1="Y" u2="g" k="41" />
<hkern u1="Y" u2="e" k="102" />
<hkern u1="Y" u2="d" k="102" />
<hkern u1="Y" u2="c" k="102" />
<hkern u1="Y" u2="a" k="102" />
<hkern u1="Y" u2="Q" k="41" />
<hkern u1="Y" u2="O" k="41" />
<hkern u1="Y" u2="G" k="41" />
<hkern u1="Y" u2="C" k="41" />
<hkern u1="Y" u2="A" k="123" />
<hkern u1="Y" u2="&#x3f;" k="-41" />
<hkern u1="Y" u2="&#x2e;" k="123" />
<hkern u1="Y" u2="&#x2c;" k="123" />
<hkern u1="Z" u2="&#x152;" k="20" />
<hkern u1="Z" u2="&#xd8;" k="20" />
<hkern u1="Z" u2="&#xd6;" k="20" />
<hkern u1="Z" u2="&#xd5;" k="20" />
<hkern u1="Z" u2="&#xd4;" k="20" />
<hkern u1="Z" u2="&#xd3;" k="20" />
<hkern u1="Z" u2="&#xd2;" k="20" />
<hkern u1="Z" u2="&#xc7;" k="20" />
<hkern u1="Z" u2="Q" k="20" />
<hkern u1="Z" u2="O" k="20" />
<hkern u1="Z" u2="G" k="20" />
<hkern u1="Z" u2="C" k="20" />
<hkern u1="[" u2="J" k="-184" />
<hkern u1="a" u2="&#x201d;" k="20" />
<hkern u1="a" u2="&#x2019;" k="20" />
<hkern u1="a" u2="&#x27;" k="20" />
<hkern u1="a" u2="&#x22;" k="20" />
<hkern u1="b" u2="&#x201d;" k="20" />
<hkern u1="b" u2="&#x2019;" k="20" />
<hkern u1="b" u2="&#xfd;" k="41" />
<hkern u1="b" u2="z" k="20" />
<hkern u1="b" u2="y" k="41" />
<hkern u1="b" u2="x" k="41" />
<hkern u1="b" u2="w" k="41" />
<hkern u1="b" u2="v" k="41" />
<hkern u1="b" u2="&#x27;" k="20" />
<hkern u1="b" u2="&#x22;" k="20" />
<hkern u1="c" u2="&#x201d;" k="-41" />
<hkern u1="c" u2="&#x2019;" k="-41" />
<hkern u1="c" u2="&#x27;" k="-41" />
<hkern u1="c" u2="&#x22;" k="-41" />
<hkern u1="e" u2="&#x201d;" k="20" />
<hkern u1="e" u2="&#x2019;" k="20" />
<hkern u1="e" u2="&#xfd;" k="41" />
<hkern u1="e" u2="z" k="20" />
<hkern u1="e" u2="y" k="41" />
<hkern u1="e" u2="x" k="41" />
<hkern u1="e" u2="w" k="41" />
<hkern u1="e" u2="v" k="41" />
<hkern u1="e" u2="&#x27;" k="20" />
<hkern u1="e" u2="&#x22;" k="20" />
<hkern u1="f" u2="&#x201d;" k="-123" />
<hkern u1="f" u2="&#x2019;" k="-123" />
<hkern u1="f" u2="&#x27;" k="-123" />
<hkern u1="f" u2="&#x22;" k="-123" />
<hkern u1="h" u2="&#x201d;" k="20" />
<hkern u1="h" u2="&#x2019;" k="20" />
<hkern u1="h" u2="&#x27;" k="20" />
<hkern u1="h" u2="&#x22;" k="20" />
<hkern u1="k" u2="&#x153;" k="41" />
<hkern u1="k" u2="&#xf8;" k="41" />
<hkern u1="k" u2="&#xf6;" k="41" />
<hkern u1="k" u2="&#xf5;" k="41" />
<hkern u1="k" u2="&#xf4;" k="41" />
<hkern u1="k" u2="&#xf3;" k="41" />
<hkern u1="k" u2="&#xf2;" k="41" />
<hkern u1="k" u2="&#xeb;" k="41" />
<hkern u1="k" u2="&#xea;" k="41" />
<hkern u1="k" u2="&#xe9;" k="41" />
<hkern u1="k" u2="&#xe8;" k="41" />
<hkern u1="k" u2="&#xe7;" k="41" />
<hkern u1="k" u2="&#xe0;" k="41" />
<hkern u1="k" u2="q" k="41" />
<hkern u1="k" u2="o" k="41" />
<hkern u1="k" u2="e" k="41" />
<hkern u1="k" u2="d" k="41" />
<hkern u1="k" u2="c" k="41" />
<hkern u1="m" u2="&#x201d;" k="20" />
<hkern u1="m" u2="&#x2019;" k="20" />
<hkern u1="m" u2="&#x27;" k="20" />
<hkern u1="m" u2="&#x22;" k="20" />
<hkern u1="n" u2="&#x201d;" k="20" />
<hkern u1="n" u2="&#x2019;" k="20" />
<hkern u1="n" u2="&#x27;" k="20" />
<hkern u1="n" u2="&#x22;" k="20" />
<hkern u1="o" u2="&#x201d;" k="20" />
<hkern u1="o" u2="&#x2019;" k="20" />
<hkern u1="o" u2="&#xfd;" k="41" />
<hkern u1="o" u2="z" k="20" />
<hkern u1="o" u2="y" k="41" />
<hkern u1="o" u2="x" k="41" />
<hkern u1="o" u2="w" k="41" />
<hkern u1="o" u2="v" k="41" />
<hkern u1="o" u2="&#x27;" k="20" />
<hkern u1="o" u2="&#x22;" k="20" />
<hkern u1="p" u2="&#x201d;" k="20" />
<hkern u1="p" u2="&#x2019;" k="20" />
<hkern u1="p" u2="&#xfd;" k="41" />
<hkern u1="p" u2="z" k="20" />
<hkern u1="p" u2="y" k="41" />
<hkern u1="p" u2="x" k="41" />
<hkern u1="p" u2="w" k="41" />
<hkern u1="p" u2="v" k="41" />
<hkern u1="p" u2="&#x27;" k="20" />
<hkern u1="p" u2="&#x22;" k="20" />
<hkern u1="r" u2="&#x201d;" k="-82" />
<hkern u1="r" u2="&#x2019;" k="-82" />
<hkern u1="r" u2="&#x153;" k="41" />
<hkern u1="r" u2="&#xf8;" k="41" />
<hkern u1="r" u2="&#xf6;" k="41" />
<hkern u1="r" u2="&#xf5;" k="41" />
<hkern u1="r" u2="&#xf4;" k="41" />
<hkern u1="r" u2="&#xf3;" k="41" />
<hkern u1="r" u2="&#xf2;" k="41" />
<hkern u1="r" u2="&#xeb;" k="41" />
<hkern u1="r" u2="&#xea;" k="41" />
<hkern u1="r" u2="&#xe9;" k="41" />
<hkern u1="r" u2="&#xe8;" k="41" />
<hkern u1="r" u2="&#xe7;" k="41" />
<hkern u1="r" u2="&#xe6;" k="41" />
<hkern u1="r" u2="&#xe5;" k="41" />
<hkern u1="r" u2="&#xe4;" k="41" />
<hkern u1="r" u2="&#xe3;" k="41" />
<hkern u1="r" u2="&#xe2;" k="41" />
<hkern u1="r" u2="&#xe1;" k="41" />
<hkern u1="r" u2="&#xe0;" k="41" />
<hkern u1="r" u2="q" k="41" />
<hkern u1="r" u2="o" k="41" />
<hkern u1="r" u2="g" k="20" />
<hkern u1="r" u2="e" k="41" />
<hkern u1="r" u2="d" k="41" />
<hkern u1="r" u2="c" k="41" />
<hkern u1="r" u2="a" k="41" />
<hkern u1="r" u2="&#x27;" k="-82" />
<hkern u1="r" u2="&#x22;" k="-82" />
<hkern u1="t" u2="&#x201d;" k="-41" />
<hkern u1="t" u2="&#x2019;" k="-41" />
<hkern u1="t" u2="&#x27;" k="-41" />
<hkern u1="t" u2="&#x22;" k="-41" />
<hkern u1="v" u2="&#x201e;" k="82" />
<hkern u1="v" u2="&#x201d;" k="-82" />
<hkern u1="v" u2="&#x201a;" k="82" />
<hkern u1="v" u2="&#x2019;" k="-82" />
<hkern u1="v" u2="&#x3f;" k="-41" />
<hkern u1="v" u2="&#x2e;" k="82" />
<hkern u1="v" u2="&#x2c;" k="82" />
<hkern u1="v" u2="&#x27;" k="-82" />
<hkern u1="v" u2="&#x22;" k="-82" />
<hkern u1="w" u2="&#x201e;" k="82" />
<hkern u1="w" u2="&#x201d;" k="-82" />
<hkern u1="w" u2="&#x201a;" k="82" />
<hkern u1="w" u2="&#x2019;" k="-82" />
<hkern u1="w" u2="&#x3f;" k="-41" />
<hkern u1="w" u2="&#x2e;" k="82" />
<hkern u1="w" u2="&#x2c;" k="82" />
<hkern u1="w" u2="&#x27;" k="-82" />
<hkern u1="w" u2="&#x22;" k="-82" />
<hkern u1="x" u2="&#x153;" k="41" />
<hkern u1="x" u2="&#xf8;" k="41" />
<hkern u1="x" u2="&#xf6;" k="41" />
<hkern u1="x" u2="&#xf5;" k="41" />
<hkern u1="x" u2="&#xf4;" k="41" />
<hkern u1="x" u2="&#xf3;" k="41" />
<hkern u1="x" u2="&#xf2;" k="41" />
<hkern u1="x" u2="&#xeb;" k="41" />
<hkern u1="x" u2="&#xea;" k="41" />
<hkern u1="x" u2="&#xe9;" k="41" />
<hkern u1="x" u2="&#xe8;" k="41" />
<hkern u1="x" u2="&#xe7;" k="41" />
<hkern u1="x" u2="&#xe0;" k="41" />
<hkern u1="x" u2="q" k="41" />
<hkern u1="x" u2="o" k="41" />
<hkern u1="x" u2="e" k="41" />
<hkern u1="x" u2="d" k="41" />
<hkern u1="x" u2="c" k="41" />
<hkern u1="y" u2="&#x201e;" k="82" />
<hkern u1="y" u2="&#x201d;" k="-82" />
<hkern u1="y" u2="&#x201a;" k="82" />
<hkern u1="y" u2="&#x2019;" k="-82" />
<hkern u1="y" u2="&#x3f;" k="-41" />
<hkern u1="y" u2="&#x2e;" k="82" />
<hkern u1="y" u2="&#x2c;" k="82" />
<hkern u1="y" u2="&#x27;" k="-82" />
<hkern u1="y" u2="&#x22;" k="-82" />
<hkern u1="&#x7b;" u2="J" k="-184" />
<hkern u1="&#xc0;" u2="&#x201d;" k="143" />
<hkern u1="&#xc0;" u2="&#x2019;" k="143" />
<hkern u1="&#xc0;" u2="&#x178;" k="123" />
<hkern u1="&#xc0;" u2="&#x152;" k="41" />
<hkern u1="&#xc0;" u2="&#xdd;" k="123" />
<hkern u1="&#xc0;" u2="&#xd8;" k="41" />
<hkern u1="&#xc0;" u2="&#xd6;" k="41" />
<hkern u1="&#xc0;" u2="&#xd5;" k="41" />
<hkern u1="&#xc0;" u2="&#xd4;" k="41" />
<hkern u1="&#xc0;" u2="&#xd3;" k="41" />
<hkern u1="&#xc0;" u2="&#xd2;" k="41" />
<hkern u1="&#xc0;" u2="&#xc7;" k="41" />
<hkern u1="&#xc0;" u2="Y" k="123" />
<hkern u1="&#xc0;" u2="W" k="82" />
<hkern u1="&#xc0;" u2="V" k="82" />
<hkern u1="&#xc0;" u2="T" k="143" />
<hkern u1="&#xc0;" u2="Q" k="41" />
<hkern u1="&#xc0;" u2="O" k="41" />
<hkern u1="&#xc0;" u2="J" k="-266" />
<hkern u1="&#xc0;" u2="G" k="41" />
<hkern u1="&#xc0;" u2="C" k="41" />
<hkern u1="&#xc0;" u2="&#x27;" k="143" />
<hkern u1="&#xc0;" u2="&#x22;" k="143" />
<hkern u1="&#xc1;" u2="&#x201d;" k="143" />
<hkern u1="&#xc1;" u2="&#x2019;" k="143" />
<hkern u1="&#xc1;" u2="&#x178;" k="123" />
<hkern u1="&#xc1;" u2="&#x152;" k="41" />
<hkern u1="&#xc1;" u2="&#xdd;" k="123" />
<hkern u1="&#xc1;" u2="&#xd8;" k="41" />
<hkern u1="&#xc1;" u2="&#xd6;" k="41" />
<hkern u1="&#xc1;" u2="&#xd5;" k="41" />
<hkern u1="&#xc1;" u2="&#xd4;" k="41" />
<hkern u1="&#xc1;" u2="&#xd3;" k="41" />
<hkern u1="&#xc1;" u2="&#xd2;" k="41" />
<hkern u1="&#xc1;" u2="&#xc7;" k="41" />
<hkern u1="&#xc1;" u2="Y" k="123" />
<hkern u1="&#xc1;" u2="W" k="82" />
<hkern u1="&#xc1;" u2="V" k="82" />
<hkern u1="&#xc1;" u2="T" k="143" />
<hkern u1="&#xc1;" u2="Q" k="41" />
<hkern u1="&#xc1;" u2="O" k="41" />
<hkern u1="&#xc1;" u2="J" k="-266" />
<hkern u1="&#xc1;" u2="G" k="41" />
<hkern u1="&#xc1;" u2="C" k="41" />
<hkern u1="&#xc1;" u2="&#x27;" k="143" />
<hkern u1="&#xc1;" u2="&#x22;" k="143" />
<hkern u1="&#xc2;" u2="&#x201d;" k="143" />
<hkern u1="&#xc2;" u2="&#x2019;" k="143" />
<hkern u1="&#xc2;" u2="&#x178;" k="123" />
<hkern u1="&#xc2;" u2="&#x152;" k="41" />
<hkern u1="&#xc2;" u2="&#xdd;" k="123" />
<hkern u1="&#xc2;" u2="&#xd8;" k="41" />
<hkern u1="&#xc2;" u2="&#xd6;" k="41" />
<hkern u1="&#xc2;" u2="&#xd5;" k="41" />
<hkern u1="&#xc2;" u2="&#xd4;" k="41" />
<hkern u1="&#xc2;" u2="&#xd3;" k="41" />
<hkern u1="&#xc2;" u2="&#xd2;" k="41" />
<hkern u1="&#xc2;" u2="&#xc7;" k="41" />
<hkern u1="&#xc2;" u2="Y" k="123" />
<hkern u1="&#xc2;" u2="W" k="82" />
<hkern u1="&#xc2;" u2="V" k="82" />
<hkern u1="&#xc2;" u2="T" k="143" />
<hkern u1="&#xc2;" u2="Q" k="41" />
<hkern u1="&#xc2;" u2="O" k="41" />
<hkern u1="&#xc2;" u2="J" k="-266" />
<hkern u1="&#xc2;" u2="G" k="41" />
<hkern u1="&#xc2;" u2="C" k="41" />
<hkern u1="&#xc2;" u2="&#x27;" k="143" />
<hkern u1="&#xc2;" u2="&#x22;" k="143" />
<hkern u1="&#xc3;" u2="&#x201d;" k="143" />
<hkern u1="&#xc3;" u2="&#x2019;" k="143" />
<hkern u1="&#xc3;" u2="&#x178;" k="123" />
<hkern u1="&#xc3;" u2="&#x152;" k="41" />
<hkern u1="&#xc3;" u2="&#xdd;" k="123" />
<hkern u1="&#xc3;" u2="&#xd8;" k="41" />
<hkern u1="&#xc3;" u2="&#xd6;" k="41" />
<hkern u1="&#xc3;" u2="&#xd5;" k="41" />
<hkern u1="&#xc3;" u2="&#xd4;" k="41" />
<hkern u1="&#xc3;" u2="&#xd3;" k="41" />
<hkern u1="&#xc3;" u2="&#xd2;" k="41" />
<hkern u1="&#xc3;" u2="&#xc7;" k="41" />
<hkern u1="&#xc3;" u2="Y" k="123" />
<hkern u1="&#xc3;" u2="W" k="82" />
<hkern u1="&#xc3;" u2="V" k="82" />
<hkern u1="&#xc3;" u2="T" k="143" />
<hkern u1="&#xc3;" u2="Q" k="41" />
<hkern u1="&#xc3;" u2="O" k="41" />
<hkern u1="&#xc3;" u2="J" k="-266" />
<hkern u1="&#xc3;" u2="G" k="41" />
<hkern u1="&#xc3;" u2="C" k="41" />
<hkern u1="&#xc3;" u2="&#x27;" k="143" />
<hkern u1="&#xc3;" u2="&#x22;" k="143" />
<hkern u1="&#xc4;" u2="&#x201d;" k="143" />
<hkern u1="&#xc4;" u2="&#x2019;" k="143" />
<hkern u1="&#xc4;" u2="&#x178;" k="123" />
<hkern u1="&#xc4;" u2="&#x152;" k="41" />
<hkern u1="&#xc4;" u2="&#xdd;" k="123" />
<hkern u1="&#xc4;" u2="&#xd8;" k="41" />
<hkern u1="&#xc4;" u2="&#xd6;" k="41" />
<hkern u1="&#xc4;" u2="&#xd5;" k="41" />
<hkern u1="&#xc4;" u2="&#xd4;" k="41" />
<hkern u1="&#xc4;" u2="&#xd3;" k="41" />
<hkern u1="&#xc4;" u2="&#xd2;" k="41" />
<hkern u1="&#xc4;" u2="&#xc7;" k="41" />
<hkern u1="&#xc4;" u2="Y" k="123" />
<hkern u1="&#xc4;" u2="W" k="82" />
<hkern u1="&#xc4;" u2="V" k="82" />
<hkern u1="&#xc4;" u2="T" k="143" />
<hkern u1="&#xc4;" u2="Q" k="41" />
<hkern u1="&#xc4;" u2="O" k="41" />
<hkern u1="&#xc4;" u2="J" k="-266" />
<hkern u1="&#xc4;" u2="G" k="41" />
<hkern u1="&#xc4;" u2="C" k="41" />
<hkern u1="&#xc4;" u2="&#x27;" k="143" />
<hkern u1="&#xc4;" u2="&#x22;" k="143" />
<hkern u1="&#xc5;" u2="&#x201d;" k="143" />
<hkern u1="&#xc5;" u2="&#x2019;" k="143" />
<hkern u1="&#xc5;" u2="&#x178;" k="123" />
<hkern u1="&#xc5;" u2="&#x152;" k="41" />
<hkern u1="&#xc5;" u2="&#xdd;" k="123" />
<hkern u1="&#xc5;" u2="&#xd8;" k="41" />
<hkern u1="&#xc5;" u2="&#xd6;" k="41" />
<hkern u1="&#xc5;" u2="&#xd5;" k="41" />
<hkern u1="&#xc5;" u2="&#xd4;" k="41" />
<hkern u1="&#xc5;" u2="&#xd3;" k="41" />
<hkern u1="&#xc5;" u2="&#xd2;" k="41" />
<hkern u1="&#xc5;" u2="&#xc7;" k="41" />
<hkern u1="&#xc5;" u2="Y" k="123" />
<hkern u1="&#xc5;" u2="W" k="82" />
<hkern u1="&#xc5;" u2="V" k="82" />
<hkern u1="&#xc5;" u2="T" k="143" />
<hkern u1="&#xc5;" u2="Q" k="41" />
<hkern u1="&#xc5;" u2="O" k="41" />
<hkern u1="&#xc5;" u2="J" k="-266" />
<hkern u1="&#xc5;" u2="G" k="41" />
<hkern u1="&#xc5;" u2="C" k="41" />
<hkern u1="&#xc5;" u2="&#x27;" k="143" />
<hkern u1="&#xc5;" u2="&#x22;" k="143" />
<hkern u1="&#xc6;" u2="J" k="-123" />
<hkern u1="&#xc7;" u2="&#x152;" k="41" />
<hkern u1="&#xc7;" u2="&#xd8;" k="41" />
<hkern u1="&#xc7;" u2="&#xd6;" k="41" />
<hkern u1="&#xc7;" u2="&#xd5;" k="41" />
<hkern u1="&#xc7;" u2="&#xd4;" k="41" />
<hkern u1="&#xc7;" u2="&#xd3;" k="41" />
<hkern u1="&#xc7;" u2="&#xd2;" k="41" />
<hkern u1="&#xc7;" u2="&#xc7;" k="41" />
<hkern u1="&#xc7;" u2="Q" k="41" />
<hkern u1="&#xc7;" u2="O" k="41" />
<hkern u1="&#xc7;" u2="G" k="41" />
<hkern u1="&#xc7;" u2="C" k="41" />
<hkern u1="&#xc8;" u2="J" k="-123" />
<hkern u1="&#xc9;" u2="J" k="-123" />
<hkern u1="&#xca;" u2="J" k="-123" />
<hkern u1="&#xcb;" u2="J" k="-123" />
<hkern u1="&#xd0;" u2="&#x201e;" k="82" />
<hkern u1="&#xd0;" u2="&#x201a;" k="82" />
<hkern u1="&#xd0;" u2="&#x178;" k="20" />
<hkern u1="&#xd0;" u2="&#xdd;" k="20" />
<hkern u1="&#xd0;" u2="&#xc5;" k="41" />
<hkern u1="&#xd0;" u2="&#xc4;" k="41" />
<hkern u1="&#xd0;" u2="&#xc3;" k="41" />
<hkern u1="&#xd0;" u2="&#xc2;" k="41" />
<hkern u1="&#xd0;" u2="&#xc1;" k="41" />
<hkern u1="&#xd0;" u2="&#xc0;" k="41" />
<hkern u1="&#xd0;" u2="Z" k="20" />
<hkern u1="&#xd0;" u2="Y" k="20" />
<hkern u1="&#xd0;" u2="X" k="41" />
<hkern u1="&#xd0;" u2="W" k="20" />
<hkern u1="&#xd0;" u2="V" k="20" />
<hkern u1="&#xd0;" u2="T" k="61" />
<hkern u1="&#xd0;" u2="A" k="41" />
<hkern u1="&#xd0;" u2="&#x2e;" k="82" />
<hkern u1="&#xd0;" u2="&#x2c;" k="82" />
<hkern u1="&#xd2;" u2="&#x201e;" k="82" />
<hkern u1="&#xd2;" u2="&#x201a;" k="82" />
<hkern u1="&#xd2;" u2="&#x178;" k="20" />
<hkern u1="&#xd2;" u2="&#xdd;" k="20" />
<hkern u1="&#xd2;" u2="&#xc5;" k="41" />
<hkern u1="&#xd2;" u2="&#xc4;" k="41" />
<hkern u1="&#xd2;" u2="&#xc3;" k="41" />
<hkern u1="&#xd2;" u2="&#xc2;" k="41" />
<hkern u1="&#xd2;" u2="&#xc1;" k="41" />
<hkern u1="&#xd2;" u2="&#xc0;" k="41" />
<hkern u1="&#xd2;" u2="Z" k="20" />
<hkern u1="&#xd2;" u2="Y" k="20" />
<hkern u1="&#xd2;" u2="X" k="41" />
<hkern u1="&#xd2;" u2="W" k="20" />
<hkern u1="&#xd2;" u2="V" k="20" />
<hkern u1="&#xd2;" u2="T" k="61" />
<hkern u1="&#xd2;" u2="A" k="41" />
<hkern u1="&#xd2;" u2="&#x2e;" k="82" />
<hkern u1="&#xd2;" u2="&#x2c;" k="82" />
<hkern u1="&#xd3;" u2="&#x201e;" k="82" />
<hkern u1="&#xd3;" u2="&#x201a;" k="82" />
<hkern u1="&#xd3;" u2="&#x178;" k="20" />
<hkern u1="&#xd3;" u2="&#xdd;" k="20" />
<hkern u1="&#xd3;" u2="&#xc5;" k="41" />
<hkern u1="&#xd3;" u2="&#xc4;" k="41" />
<hkern u1="&#xd3;" u2="&#xc3;" k="41" />
<hkern u1="&#xd3;" u2="&#xc2;" k="41" />
<hkern u1="&#xd3;" u2="&#xc1;" k="41" />
<hkern u1="&#xd3;" u2="&#xc0;" k="41" />
<hkern u1="&#xd3;" u2="Z" k="20" />
<hkern u1="&#xd3;" u2="Y" k="20" />
<hkern u1="&#xd3;" u2="X" k="41" />
<hkern u1="&#xd3;" u2="W" k="20" />
<hkern u1="&#xd3;" u2="V" k="20" />
<hkern u1="&#xd3;" u2="T" k="61" />
<hkern u1="&#xd3;" u2="A" k="41" />
<hkern u1="&#xd3;" u2="&#x2e;" k="82" />
<hkern u1="&#xd3;" u2="&#x2c;" k="82" />
<hkern u1="&#xd4;" u2="&#x201e;" k="82" />
<hkern u1="&#xd4;" u2="&#x201a;" k="82" />
<hkern u1="&#xd4;" u2="&#x178;" k="20" />
<hkern u1="&#xd4;" u2="&#xdd;" k="20" />
<hkern u1="&#xd4;" u2="&#xc5;" k="41" />
<hkern u1="&#xd4;" u2="&#xc4;" k="41" />
<hkern u1="&#xd4;" u2="&#xc3;" k="41" />
<hkern u1="&#xd4;" u2="&#xc2;" k="41" />
<hkern u1="&#xd4;" u2="&#xc1;" k="41" />
<hkern u1="&#xd4;" u2="&#xc0;" k="41" />
<hkern u1="&#xd4;" u2="Z" k="20" />
<hkern u1="&#xd4;" u2="Y" k="20" />
<hkern u1="&#xd4;" u2="X" k="41" />
<hkern u1="&#xd4;" u2="W" k="20" />
<hkern u1="&#xd4;" u2="V" k="20" />
<hkern u1="&#xd4;" u2="T" k="61" />
<hkern u1="&#xd4;" u2="A" k="41" />
<hkern u1="&#xd4;" u2="&#x2e;" k="82" />
<hkern u1="&#xd4;" u2="&#x2c;" k="82" />
<hkern u1="&#xd5;" u2="&#x201e;" k="82" />
<hkern u1="&#xd5;" u2="&#x201a;" k="82" />
<hkern u1="&#xd5;" u2="&#x178;" k="20" />
<hkern u1="&#xd5;" u2="&#xdd;" k="20" />
<hkern u1="&#xd5;" u2="&#xc5;" k="41" />
<hkern u1="&#xd5;" u2="&#xc4;" k="41" />
<hkern u1="&#xd5;" u2="&#xc3;" k="41" />
<hkern u1="&#xd5;" u2="&#xc2;" k="41" />
<hkern u1="&#xd5;" u2="&#xc1;" k="41" />
<hkern u1="&#xd5;" u2="&#xc0;" k="41" />
<hkern u1="&#xd5;" u2="Z" k="20" />
<hkern u1="&#xd5;" u2="Y" k="20" />
<hkern u1="&#xd5;" u2="X" k="41" />
<hkern u1="&#xd5;" u2="W" k="20" />
<hkern u1="&#xd5;" u2="V" k="20" />
<hkern u1="&#xd5;" u2="T" k="61" />
<hkern u1="&#xd5;" u2="A" k="41" />
<hkern u1="&#xd5;" u2="&#x2e;" k="82" />
<hkern u1="&#xd5;" u2="&#x2c;" k="82" />
<hkern u1="&#xd6;" u2="&#x201e;" k="82" />
<hkern u1="&#xd6;" u2="&#x201a;" k="82" />
<hkern u1="&#xd6;" u2="&#x178;" k="20" />
<hkern u1="&#xd6;" u2="&#xdd;" k="20" />
<hkern u1="&#xd6;" u2="&#xc5;" k="41" />
<hkern u1="&#xd6;" u2="&#xc4;" k="41" />
<hkern u1="&#xd6;" u2="&#xc3;" k="41" />
<hkern u1="&#xd6;" u2="&#xc2;" k="41" />
<hkern u1="&#xd6;" u2="&#xc1;" k="41" />
<hkern u1="&#xd6;" u2="&#xc0;" k="41" />
<hkern u1="&#xd6;" u2="Z" k="20" />
<hkern u1="&#xd6;" u2="Y" k="20" />
<hkern u1="&#xd6;" u2="X" k="41" />
<hkern u1="&#xd6;" u2="W" k="20" />
<hkern u1="&#xd6;" u2="V" k="20" />
<hkern u1="&#xd6;" u2="T" k="61" />
<hkern u1="&#xd6;" u2="A" k="41" />
<hkern u1="&#xd6;" u2="&#x2e;" k="82" />
<hkern u1="&#xd6;" u2="&#x2c;" k="82" />
<hkern u1="&#xd8;" u2="&#x201e;" k="82" />
<hkern u1="&#xd8;" u2="&#x201a;" k="82" />
<hkern u1="&#xd8;" u2="&#x178;" k="20" />
<hkern u1="&#xd8;" u2="&#xdd;" k="20" />
<hkern u1="&#xd8;" u2="&#xc5;" k="41" />
<hkern u1="&#xd8;" u2="&#xc4;" k="41" />
<hkern u1="&#xd8;" u2="&#xc3;" k="41" />
<hkern u1="&#xd8;" u2="&#xc2;" k="41" />
<hkern u1="&#xd8;" u2="&#xc1;" k="41" />
<hkern u1="&#xd8;" u2="&#xc0;" k="41" />
<hkern u1="&#xd8;" u2="Z" k="20" />
<hkern u1="&#xd8;" u2="Y" k="20" />
<hkern u1="&#xd8;" u2="X" k="41" />
<hkern u1="&#xd8;" u2="W" k="20" />
<hkern u1="&#xd8;" u2="V" k="20" />
<hkern u1="&#xd8;" u2="T" k="61" />
<hkern u1="&#xd8;" u2="A" k="41" />
<hkern u1="&#xd8;" u2="&#x2e;" k="82" />
<hkern u1="&#xd8;" u2="&#x2c;" k="82" />
<hkern u1="&#xd9;" u2="&#x201e;" k="41" />
<hkern u1="&#xd9;" u2="&#x201a;" k="41" />
<hkern u1="&#xd9;" u2="&#xc5;" k="20" />
<hkern u1="&#xd9;" u2="&#xc4;" k="20" />
<hkern u1="&#xd9;" u2="&#xc3;" k="20" />
<hkern u1="&#xd9;" u2="&#xc2;" k="20" />
<hkern u1="&#xd9;" u2="&#xc1;" k="20" />
<hkern u1="&#xd9;" u2="&#xc0;" k="20" />
<hkern u1="&#xd9;" u2="A" k="20" />
<hkern u1="&#xd9;" u2="&#x2e;" k="41" />
<hkern u1="&#xd9;" u2="&#x2c;" k="41" />
<hkern u1="&#xda;" u2="&#x201e;" k="41" />
<hkern u1="&#xda;" u2="&#x201a;" k="41" />
<hkern u1="&#xda;" u2="&#xc5;" k="20" />
<hkern u1="&#xda;" u2="&#xc4;" k="20" />
<hkern u1="&#xda;" u2="&#xc3;" k="20" />
<hkern u1="&#xda;" u2="&#xc2;" k="20" />
<hkern u1="&#xda;" u2="&#xc1;" k="20" />
<hkern u1="&#xda;" u2="&#xc0;" k="20" />
<hkern u1="&#xda;" u2="A" k="20" />
<hkern u1="&#xda;" u2="&#x2e;" k="41" />
<hkern u1="&#xda;" u2="&#x2c;" k="41" />
<hkern u1="&#xdb;" u2="&#x201e;" k="41" />
<hkern u1="&#xdb;" u2="&#x201a;" k="41" />
<hkern u1="&#xdb;" u2="&#xc5;" k="20" />
<hkern u1="&#xdb;" u2="&#xc4;" k="20" />
<hkern u1="&#xdb;" u2="&#xc3;" k="20" />
<hkern u1="&#xdb;" u2="&#xc2;" k="20" />
<hkern u1="&#xdb;" u2="&#xc1;" k="20" />
<hkern u1="&#xdb;" u2="&#xc0;" k="20" />
<hkern u1="&#xdb;" u2="A" k="20" />
<hkern u1="&#xdb;" u2="&#x2e;" k="41" />
<hkern u1="&#xdb;" u2="&#x2c;" k="41" />
<hkern u1="&#xdc;" u2="&#x201e;" k="41" />
<hkern u1="&#xdc;" u2="&#x201a;" k="41" />
<hkern u1="&#xdc;" u2="&#xc5;" k="20" />
<hkern u1="&#xdc;" u2="&#xc4;" k="20" />
<hkern u1="&#xdc;" u2="&#xc3;" k="20" />
<hkern u1="&#xdc;" u2="&#xc2;" k="20" />
<hkern u1="&#xdc;" u2="&#xc1;" k="20" />
<hkern u1="&#xdc;" u2="&#xc0;" k="20" />
<hkern u1="&#xdc;" u2="A" k="20" />
<hkern u1="&#xdc;" u2="&#x2e;" k="41" />
<hkern u1="&#xdc;" u2="&#x2c;" k="41" />
<hkern u1="&#xdd;" u2="&#x201e;" k="123" />
<hkern u1="&#xdd;" u2="&#x201a;" k="123" />
<hkern u1="&#xdd;" u2="&#x153;" k="102" />
<hkern u1="&#xdd;" u2="&#x152;" k="41" />
<hkern u1="&#xdd;" u2="&#xfc;" k="61" />
<hkern u1="&#xdd;" u2="&#xfb;" k="61" />
<hkern u1="&#xdd;" u2="&#xfa;" k="61" />
<hkern u1="&#xdd;" u2="&#xf9;" k="61" />
<hkern u1="&#xdd;" u2="&#xf8;" k="102" />
<hkern u1="&#xdd;" u2="&#xf6;" k="102" />
<hkern u1="&#xdd;" u2="&#xf5;" k="102" />
<hkern u1="&#xdd;" u2="&#xf4;" k="102" />
<hkern u1="&#xdd;" u2="&#xf3;" k="102" />
<hkern u1="&#xdd;" u2="&#xf2;" k="102" />
<hkern u1="&#xdd;" u2="&#xeb;" k="102" />
<hkern u1="&#xdd;" u2="&#xea;" k="102" />
<hkern u1="&#xdd;" u2="&#xe9;" k="102" />
<hkern u1="&#xdd;" u2="&#xe8;" k="102" />
<hkern u1="&#xdd;" u2="&#xe7;" k="102" />
<hkern u1="&#xdd;" u2="&#xe6;" k="102" />
<hkern u1="&#xdd;" u2="&#xe5;" k="102" />
<hkern u1="&#xdd;" u2="&#xe4;" k="102" />
<hkern u1="&#xdd;" u2="&#xe3;" k="102" />
<hkern u1="&#xdd;" u2="&#xe2;" k="102" />
<hkern u1="&#xdd;" u2="&#xe1;" k="102" />
<hkern u1="&#xdd;" u2="&#xe0;" k="102" />
<hkern u1="&#xdd;" u2="&#xd8;" k="41" />
<hkern u1="&#xdd;" u2="&#xd6;" k="41" />
<hkern u1="&#xdd;" u2="&#xd5;" k="41" />
<hkern u1="&#xdd;" u2="&#xd4;" k="41" />
<hkern u1="&#xdd;" u2="&#xd3;" k="41" />
<hkern u1="&#xdd;" u2="&#xd2;" k="41" />
<hkern u1="&#xdd;" u2="&#xc7;" k="41" />
<hkern u1="&#xdd;" u2="&#xc5;" k="123" />
<hkern u1="&#xdd;" u2="&#xc4;" k="123" />
<hkern u1="&#xdd;" u2="&#xc3;" k="123" />
<hkern u1="&#xdd;" u2="&#xc2;" k="123" />
<hkern u1="&#xdd;" u2="&#xc1;" k="123" />
<hkern u1="&#xdd;" u2="&#xc0;" k="123" />
<hkern u1="&#xdd;" u2="z" k="41" />
<hkern u1="&#xdd;" u2="u" k="61" />
<hkern u1="&#xdd;" u2="s" k="82" />
<hkern u1="&#xdd;" u2="r" k="61" />
<hkern u1="&#xdd;" u2="q" k="102" />
<hkern u1="&#xdd;" u2="p" k="61" />
<hkern u1="&#xdd;" u2="o" k="102" />
<hkern u1="&#xdd;" u2="n" k="61" />
<hkern u1="&#xdd;" u2="m" k="61" />
<hkern u1="&#xdd;" u2="g" k="41" />
<hkern u1="&#xdd;" u2="e" k="102" />
<hkern u1="&#xdd;" u2="d" k="102" />
<hkern u1="&#xdd;" u2="c" k="102" />
<hkern u1="&#xdd;" u2="a" k="102" />
<hkern u1="&#xdd;" u2="Q" k="41" />
<hkern u1="&#xdd;" u2="O" k="41" />
<hkern u1="&#xdd;" u2="G" k="41" />
<hkern u1="&#xdd;" u2="C" k="41" />
<hkern u1="&#xdd;" u2="A" k="123" />
<hkern u1="&#xdd;" u2="&#x3f;" k="-41" />
<hkern u1="&#xdd;" u2="&#x2e;" k="123" />
<hkern u1="&#xdd;" u2="&#x2c;" k="123" />
<hkern u1="&#xde;" u2="&#x201e;" k="266" />
<hkern u1="&#xde;" u2="&#x201a;" k="266" />
<hkern u1="&#xde;" u2="&#xc5;" k="102" />
<hkern u1="&#xde;" u2="&#xc4;" k="102" />
<hkern u1="&#xde;" u2="&#xc3;" k="102" />
<hkern u1="&#xde;" u2="&#xc2;" k="102" />
<hkern u1="&#xde;" u2="&#xc1;" k="102" />
<hkern u1="&#xde;" u2="&#xc0;" k="102" />
<hkern u1="&#xde;" u2="Z" k="20" />
<hkern u1="&#xde;" u2="X" k="41" />
<hkern u1="&#xde;" u2="A" k="102" />
<hkern u1="&#xde;" u2="&#x2e;" k="266" />
<hkern u1="&#xde;" u2="&#x2c;" k="266" />
<hkern u1="&#xe0;" u2="&#x201d;" k="20" />
<hkern u1="&#xe0;" u2="&#x2019;" k="20" />
<hkern u1="&#xe0;" u2="&#x27;" k="20" />
<hkern u1="&#xe0;" u2="&#x22;" k="20" />
<hkern u1="&#xe1;" u2="&#x201d;" k="20" />
<hkern u1="&#xe1;" u2="&#x2019;" k="20" />
<hkern u1="&#xe1;" u2="&#x27;" k="20" />
<hkern u1="&#xe1;" u2="&#x22;" k="20" />
<hkern u1="&#xe2;" u2="&#x201d;" k="20" />
<hkern u1="&#xe2;" u2="&#x2019;" k="20" />
<hkern u1="&#xe2;" u2="&#x27;" k="20" />
<hkern u1="&#xe2;" u2="&#x22;" k="20" />
<hkern u1="&#xe3;" u2="&#x201d;" k="20" />
<hkern u1="&#xe3;" u2="&#x2019;" k="20" />
<hkern u1="&#xe3;" u2="&#x27;" k="20" />
<hkern u1="&#xe3;" u2="&#x22;" k="20" />
<hkern u1="&#xe4;" u2="&#x201d;" k="20" />
<hkern u1="&#xe4;" u2="&#x2019;" k="20" />
<hkern u1="&#xe4;" u2="&#x27;" k="20" />
<hkern u1="&#xe4;" u2="&#x22;" k="20" />
<hkern u1="&#xe5;" u2="&#x201d;" k="20" />
<hkern u1="&#xe5;" u2="&#x2019;" k="20" />
<hkern u1="&#xe5;" u2="&#x27;" k="20" />
<hkern u1="&#xe5;" u2="&#x22;" k="20" />
<hkern u1="&#xe8;" u2="&#x201d;" k="20" />
<hkern u1="&#xe8;" u2="&#x2019;" k="20" />
<hkern u1="&#xe8;" u2="&#xfd;" k="41" />
<hkern u1="&#xe8;" u2="z" k="20" />
<hkern u1="&#xe8;" u2="y" k="41" />
<hkern u1="&#xe8;" u2="x" k="41" />
<hkern u1="&#xe8;" u2="w" k="41" />
<hkern u1="&#xe8;" u2="v" k="41" />
<hkern u1="&#xe8;" u2="&#x27;" k="20" />
<hkern u1="&#xe8;" u2="&#x22;" k="20" />
<hkern u1="&#xe9;" u2="&#x201d;" k="20" />
<hkern u1="&#xe9;" u2="&#x2019;" k="20" />
<hkern u1="&#xe9;" u2="&#xfd;" k="41" />
<hkern u1="&#xe9;" u2="z" k="20" />
<hkern u1="&#xe9;" u2="y" k="41" />
<hkern u1="&#xe9;" u2="x" k="41" />
<hkern u1="&#xe9;" u2="w" k="41" />
<hkern u1="&#xe9;" u2="v" k="41" />
<hkern u1="&#xe9;" u2="&#x27;" k="20" />
<hkern u1="&#xe9;" u2="&#x22;" k="20" />
<hkern u1="&#xea;" u2="&#x201d;" k="20" />
<hkern u1="&#xea;" u2="&#x2019;" k="20" />
<hkern u1="&#xea;" u2="&#xfd;" k="41" />
<hkern u1="&#xea;" u2="z" k="20" />
<hkern u1="&#xea;" u2="y" k="41" />
<hkern u1="&#xea;" u2="x" k="41" />
<hkern u1="&#xea;" u2="w" k="41" />
<hkern u1="&#xea;" u2="v" k="41" />
<hkern u1="&#xea;" u2="&#x27;" k="20" />
<hkern u1="&#xea;" u2="&#x22;" k="20" />
<hkern u1="&#xeb;" u2="&#x201d;" k="20" />
<hkern u1="&#xeb;" u2="&#x2019;" k="20" />
<hkern u1="&#xeb;" u2="&#xfd;" k="41" />
<hkern u1="&#xeb;" u2="z" k="20" />
<hkern u1="&#xeb;" u2="y" k="41" />
<hkern u1="&#xeb;" u2="x" k="41" />
<hkern u1="&#xeb;" u2="w" k="41" />
<hkern u1="&#xeb;" u2="v" k="41" />
<hkern u1="&#xeb;" u2="&#x27;" k="20" />
<hkern u1="&#xeb;" u2="&#x22;" k="20" />
<hkern u1="&#xf0;" u2="&#x201d;" k="20" />
<hkern u1="&#xf0;" u2="&#x2019;" k="20" />
<hkern u1="&#xf0;" u2="&#xfd;" k="41" />
<hkern u1="&#xf0;" u2="z" k="20" />
<hkern u1="&#xf0;" u2="y" k="41" />
<hkern u1="&#xf0;" u2="x" k="41" />
<hkern u1="&#xf0;" u2="w" k="41" />
<hkern u1="&#xf0;" u2="v" k="41" />
<hkern u1="&#xf0;" u2="&#x27;" k="20" />
<hkern u1="&#xf0;" u2="&#x22;" k="20" />
<hkern u1="&#xf2;" u2="&#x201d;" k="20" />
<hkern u1="&#xf2;" u2="&#x2019;" k="20" />
<hkern u1="&#xf2;" u2="&#xfd;" k="41" />
<hkern u1="&#xf2;" u2="z" k="20" />
<hkern u1="&#xf2;" u2="y" k="41" />
<hkern u1="&#xf2;" u2="x" k="41" />
<hkern u1="&#xf2;" u2="w" k="41" />
<hkern u1="&#xf2;" u2="v" k="41" />
<hkern u1="&#xf2;" u2="&#x27;" k="20" />
<hkern u1="&#xf2;" u2="&#x22;" k="20" />
<hkern u1="&#xf3;" u2="&#x201d;" k="20" />
<hkern u1="&#xf3;" u2="&#x2019;" k="20" />
<hkern u1="&#xf3;" u2="&#xfd;" k="41" />
<hkern u1="&#xf3;" u2="z" k="20" />
<hkern u1="&#xf3;" u2="y" k="41" />
<hkern u1="&#xf3;" u2="x" k="41" />
<hkern u1="&#xf3;" u2="w" k="41" />
<hkern u1="&#xf3;" u2="v" k="41" />
<hkern u1="&#xf3;" u2="&#x27;" k="20" />
<hkern u1="&#xf3;" u2="&#x22;" k="20" />
<hkern u1="&#xf4;" u2="&#x201d;" k="20" />
<hkern u1="&#xf4;" u2="&#x2019;" k="20" />
<hkern u1="&#xf4;" u2="&#xfd;" k="41" />
<hkern u1="&#xf4;" u2="z" k="20" />
<hkern u1="&#xf4;" u2="y" k="41" />
<hkern u1="&#xf4;" u2="x" k="41" />
<hkern u1="&#xf4;" u2="w" k="41" />
<hkern u1="&#xf4;" u2="v" k="41" />
<hkern u1="&#xf4;" u2="&#x27;" k="20" />
<hkern u1="&#xf4;" u2="&#x22;" k="20" />
<hkern u1="&#xf6;" u2="&#x201d;" k="41" />
<hkern u1="&#xf6;" u2="&#x2019;" k="41" />
<hkern u1="&#xf6;" u2="&#x27;" k="41" />
<hkern u1="&#xf6;" u2="&#x22;" k="41" />
<hkern u1="&#xf8;" u2="&#x201d;" k="20" />
<hkern u1="&#xf8;" u2="&#x2019;" k="20" />
<hkern u1="&#xf8;" u2="&#xfd;" k="41" />
<hkern u1="&#xf8;" u2="z" k="20" />
<hkern u1="&#xf8;" u2="y" k="41" />
<hkern u1="&#xf8;" u2="x" k="41" />
<hkern u1="&#xf8;" u2="w" k="41" />
<hkern u1="&#xf8;" u2="v" k="41" />
<hkern u1="&#xf8;" u2="&#x27;" k="20" />
<hkern u1="&#xf8;" u2="&#x22;" k="20" />
<hkern u1="&#xfd;" u2="&#x201e;" k="82" />
<hkern u1="&#xfd;" u2="&#x201d;" k="-82" />
<hkern u1="&#xfd;" u2="&#x201a;" k="82" />
<hkern u1="&#xfd;" u2="&#x2019;" k="-82" />
<hkern u1="&#xfd;" u2="&#x3f;" k="-41" />
<hkern u1="&#xfd;" u2="&#x2e;" k="82" />
<hkern u1="&#xfd;" u2="&#x2c;" k="82" />
<hkern u1="&#xfd;" u2="&#x27;" k="-82" />
<hkern u1="&#xfd;" u2="&#x22;" k="-82" />
<hkern u1="&#xfe;" u2="&#x201d;" k="20" />
<hkern u1="&#xfe;" u2="&#x2019;" k="20" />
<hkern u1="&#xfe;" u2="&#xfd;" k="41" />
<hkern u1="&#xfe;" u2="z" k="20" />
<hkern u1="&#xfe;" u2="y" k="41" />
<hkern u1="&#xfe;" u2="x" k="41" />
<hkern u1="&#xfe;" u2="w" k="41" />
<hkern u1="&#xfe;" u2="v" k="41" />
<hkern u1="&#xfe;" u2="&#x27;" k="20" />
<hkern u1="&#xfe;" u2="&#x22;" k="20" />
<hkern u1="&#xff;" u2="&#x201e;" k="82" />
<hkern u1="&#xff;" u2="&#x201d;" k="-82" />
<hkern u1="&#xff;" u2="&#x201a;" k="82" />
<hkern u1="&#xff;" u2="&#x2019;" k="-82" />
<hkern u1="&#xff;" u2="&#x3f;" k="-41" />
<hkern u1="&#xff;" u2="&#x2e;" k="82" />
<hkern u1="&#xff;" u2="&#x2c;" k="82" />
<hkern u1="&#xff;" u2="&#x27;" k="-82" />
<hkern u1="&#xff;" u2="&#x22;" k="-82" />
<hkern u1="&#x152;" u2="J" k="-123" />
<hkern u1="&#x178;" u2="&#x201e;" k="123" />
<hkern u1="&#x178;" u2="&#x201a;" k="123" />
<hkern u1="&#x178;" u2="&#x153;" k="102" />
<hkern u1="&#x178;" u2="&#x152;" k="41" />
<hkern u1="&#x178;" u2="&#xfc;" k="61" />
<hkern u1="&#x178;" u2="&#xfb;" k="61" />
<hkern u1="&#x178;" u2="&#xfa;" k="61" />
<hkern u1="&#x178;" u2="&#xf9;" k="61" />
<hkern u1="&#x178;" u2="&#xf8;" k="102" />
<hkern u1="&#x178;" u2="&#xf6;" k="102" />
<hkern u1="&#x178;" u2="&#xf5;" k="102" />
<hkern u1="&#x178;" u2="&#xf4;" k="102" />
<hkern u1="&#x178;" u2="&#xf3;" k="102" />
<hkern u1="&#x178;" u2="&#xf2;" k="102" />
<hkern u1="&#x178;" u2="&#xeb;" k="102" />
<hkern u1="&#x178;" u2="&#xea;" k="102" />
<hkern u1="&#x178;" u2="&#xe9;" k="102" />
<hkern u1="&#x178;" u2="&#xe8;" k="102" />
<hkern u1="&#x178;" u2="&#xe7;" k="102" />
<hkern u1="&#x178;" u2="&#xe6;" k="102" />
<hkern u1="&#x178;" u2="&#xe5;" k="102" />
<hkern u1="&#x178;" u2="&#xe4;" k="102" />
<hkern u1="&#x178;" u2="&#xe3;" k="102" />
<hkern u1="&#x178;" u2="&#xe2;" k="102" />
<hkern u1="&#x178;" u2="&#xe1;" k="102" />
<hkern u1="&#x178;" u2="&#xe0;" k="102" />
<hkern u1="&#x178;" u2="&#xd8;" k="41" />
<hkern u1="&#x178;" u2="&#xd6;" k="41" />
<hkern u1="&#x178;" u2="&#xd5;" k="41" />
<hkern u1="&#x178;" u2="&#xd4;" k="41" />
<hkern u1="&#x178;" u2="&#xd3;" k="41" />
<hkern u1="&#x178;" u2="&#xd2;" k="41" />
<hkern u1="&#x178;" u2="&#xc7;" k="41" />
<hkern u1="&#x178;" u2="&#xc5;" k="123" />
<hkern u1="&#x178;" u2="&#xc4;" k="123" />
<hkern u1="&#x178;" u2="&#xc3;" k="123" />
<hkern u1="&#x178;" u2="&#xc2;" k="123" />
<hkern u1="&#x178;" u2="&#xc1;" k="123" />
<hkern u1="&#x178;" u2="&#xc0;" k="123" />
<hkern u1="&#x178;" u2="z" k="41" />
<hkern u1="&#x178;" u2="u" k="61" />
<hkern u1="&#x178;" u2="s" k="82" />
<hkern u1="&#x178;" u2="r" k="61" />
<hkern u1="&#x178;" u2="q" k="102" />
<hkern u1="&#x178;" u2="p" k="61" />
<hkern u1="&#x178;" u2="o" k="102" />
<hkern u1="&#x178;" u2="n" k="61" />
<hkern u1="&#x178;" u2="m" k="61" />
<hkern u1="&#x178;" u2="g" k="41" />
<hkern u1="&#x178;" u2="e" k="102" />
<hkern u1="&#x178;" u2="d" k="102" />
<hkern u1="&#x178;" u2="c" k="102" />
<hkern u1="&#x178;" u2="a" k="102" />
<hkern u1="&#x178;" u2="Q" k="41" />
<hkern u1="&#x178;" u2="O" k="41" />
<hkern u1="&#x178;" u2="G" k="41" />
<hkern u1="&#x178;" u2="C" k="41" />
<hkern u1="&#x178;" u2="A" k="123" />
<hkern u1="&#x178;" u2="&#x3f;" k="-41" />
<hkern u1="&#x178;" u2="&#x2e;" k="123" />
<hkern u1="&#x178;" u2="&#x2c;" k="123" />
<hkern u1="&#x2013;" u2="T" k="82" />
<hkern u1="&#x2014;" u2="T" k="82" />
<hkern u1="&#x2018;" u2="&#x178;" k="-20" />
<hkern u1="&#x2018;" u2="&#x153;" k="123" />
<hkern u1="&#x2018;" u2="&#xfc;" k="61" />
<hkern u1="&#x2018;" u2="&#xfb;" k="61" />
<hkern u1="&#x2018;" u2="&#xfa;" k="61" />
<hkern u1="&#x2018;" u2="&#xf9;" k="61" />
<hkern u1="&#x2018;" u2="&#xf8;" k="123" />
<hkern u1="&#x2018;" u2="&#xf6;" k="123" />
<hkern u1="&#x2018;" u2="&#xf5;" k="123" />
<hkern u1="&#x2018;" u2="&#xf4;" k="123" />
<hkern u1="&#x2018;" u2="&#xf3;" k="123" />
<hkern u1="&#x2018;" u2="&#xf2;" k="123" />
<hkern u1="&#x2018;" u2="&#xeb;" k="123" />
<hkern u1="&#x2018;" u2="&#xea;" k="123" />
<hkern u1="&#x2018;" u2="&#xe9;" k="123" />
<hkern u1="&#x2018;" u2="&#xe8;" k="123" />
<hkern u1="&#x2018;" u2="&#xe7;" k="123" />
<hkern u1="&#x2018;" u2="&#xe6;" k="82" />
<hkern u1="&#x2018;" u2="&#xe5;" k="82" />
<hkern u1="&#x2018;" u2="&#xe4;" k="82" />
<hkern u1="&#x2018;" u2="&#xe3;" k="82" />
<hkern u1="&#x2018;" u2="&#xe2;" k="82" />
<hkern u1="&#x2018;" u2="&#xe1;" k="82" />
<hkern u1="&#x2018;" u2="&#xe0;" k="123" />
<hkern u1="&#x2018;" u2="&#xdd;" k="-20" />
<hkern u1="&#x2018;" u2="&#xc5;" k="143" />
<hkern u1="&#x2018;" u2="&#xc4;" k="143" />
<hkern u1="&#x2018;" u2="&#xc3;" k="143" />
<hkern u1="&#x2018;" u2="&#xc2;" k="143" />
<hkern u1="&#x2018;" u2="&#xc1;" k="143" />
<hkern u1="&#x2018;" u2="&#xc0;" k="143" />
<hkern u1="&#x2018;" u2="u" k="61" />
<hkern u1="&#x2018;" u2="s" k="61" />
<hkern u1="&#x2018;" u2="r" k="61" />
<hkern u1="&#x2018;" u2="q" k="123" />
<hkern u1="&#x2018;" u2="p" k="61" />
<hkern u1="&#x2018;" u2="o" k="123" />
<hkern u1="&#x2018;" u2="n" k="61" />
<hkern u1="&#x2018;" u2="m" k="61" />
<hkern u1="&#x2018;" u2="g" k="61" />
<hkern u1="&#x2018;" u2="e" k="123" />
<hkern u1="&#x2018;" u2="d" k="123" />
<hkern u1="&#x2018;" u2="c" k="123" />
<hkern u1="&#x2018;" u2="a" k="82" />
<hkern u1="&#x2018;" u2="Y" k="-20" />
<hkern u1="&#x2018;" u2="W" k="-41" />
<hkern u1="&#x2018;" u2="V" k="-41" />
<hkern u1="&#x2018;" u2="T" k="-41" />
<hkern u1="&#x2018;" u2="A" k="143" />
<hkern u1="&#x2019;" u2="&#x178;" k="-20" />
<hkern u1="&#x2019;" u2="&#x153;" k="123" />
<hkern u1="&#x2019;" u2="&#xfc;" k="61" />
<hkern u1="&#x2019;" u2="&#xfb;" k="61" />
<hkern u1="&#x2019;" u2="&#xfa;" k="61" />
<hkern u1="&#x2019;" u2="&#xf9;" k="61" />
<hkern u1="&#x2019;" u2="&#xf8;" k="123" />
<hkern u1="&#x2019;" u2="&#xf6;" k="123" />
<hkern u1="&#x2019;" u2="&#xf5;" k="123" />
<hkern u1="&#x2019;" u2="&#xf4;" k="123" />
<hkern u1="&#x2019;" u2="&#xf3;" k="123" />
<hkern u1="&#x2019;" u2="&#xf2;" k="123" />
<hkern u1="&#x2019;" u2="&#xeb;" k="123" />
<hkern u1="&#x2019;" u2="&#xea;" k="123" />
<hkern u1="&#x2019;" u2="&#xe9;" k="123" />
<hkern u1="&#x2019;" u2="&#xe8;" k="123" />
<hkern u1="&#x2019;" u2="&#xe7;" k="123" />
<hkern u1="&#x2019;" u2="&#xe6;" k="82" />
<hkern u1="&#x2019;" u2="&#xe5;" k="82" />
<hkern u1="&#x2019;" u2="&#xe4;" k="82" />
<hkern u1="&#x2019;" u2="&#xe3;" k="82" />
<hkern u1="&#x2019;" u2="&#xe2;" k="82" />
<hkern u1="&#x2019;" u2="&#xe1;" k="82" />
<hkern u1="&#x2019;" u2="&#xe0;" k="123" />
<hkern u1="&#x2019;" u2="&#xdd;" k="-20" />
<hkern u1="&#x2019;" u2="&#xc5;" k="143" />
<hkern u1="&#x2019;" u2="&#xc4;" k="143" />
<hkern u1="&#x2019;" u2="&#xc3;" k="143" />
<hkern u1="&#x2019;" u2="&#xc2;" k="143" />
<hkern u1="&#x2019;" u2="&#xc1;" k="143" />
<hkern u1="&#x2019;" u2="&#xc0;" k="143" />
<hkern u1="&#x2019;" u2="u" k="61" />
<hkern u1="&#x2019;" u2="s" k="61" />
<hkern u1="&#x2019;" u2="r" k="61" />
<hkern u1="&#x2019;" u2="q" k="123" />
<hkern u1="&#x2019;" u2="p" k="61" />
<hkern u1="&#x2019;" u2="o" k="123" />
<hkern u1="&#x2019;" u2="n" k="61" />
<hkern u1="&#x2019;" u2="m" k="61" />
<hkern u1="&#x2019;" u2="g" k="61" />
<hkern u1="&#x2019;" u2="e" k="123" />
<hkern u1="&#x2019;" u2="d" k="123" />
<hkern u1="&#x2019;" u2="c" k="123" />
<hkern u1="&#x2019;" u2="a" k="82" />
<hkern u1="&#x2019;" u2="Y" k="-20" />
<hkern u1="&#x2019;" u2="W" k="-41" />
<hkern u1="&#x2019;" u2="V" k="-41" />
<hkern u1="&#x2019;" u2="T" k="-41" />
<hkern u1="&#x2019;" u2="A" k="143" />
<hkern u1="&#x201a;" u2="&#x178;" k="123" />
<hkern u1="&#x201a;" u2="&#x152;" k="102" />
<hkern u1="&#x201a;" u2="&#xdd;" k="123" />
<hkern u1="&#x201a;" u2="&#xdc;" k="41" />
<hkern u1="&#x201a;" u2="&#xdb;" k="41" />
<hkern u1="&#x201a;" u2="&#xda;" k="41" />
<hkern u1="&#x201a;" u2="&#xd9;" k="41" />
<hkern u1="&#x201a;" u2="&#xd8;" k="102" />
<hkern u1="&#x201a;" u2="&#xd6;" k="102" />
<hkern u1="&#x201a;" u2="&#xd5;" k="102" />
<hkern u1="&#x201a;" u2="&#xd4;" k="102" />
<hkern u1="&#x201a;" u2="&#xd3;" k="102" />
<hkern u1="&#x201a;" u2="&#xd2;" k="102" />
<hkern u1="&#x201a;" u2="&#xc7;" k="102" />
<hkern u1="&#x201a;" u2="Y" k="123" />
<hkern u1="&#x201a;" u2="W" k="123" />
<hkern u1="&#x201a;" u2="V" k="123" />
<hkern u1="&#x201a;" u2="U" k="41" />
<hkern u1="&#x201a;" u2="T" k="143" />
<hkern u1="&#x201a;" u2="Q" k="102" />
<hkern u1="&#x201a;" u2="O" k="102" />
<hkern u1="&#x201a;" u2="G" k="102" />
<hkern u1="&#x201a;" u2="C" k="102" />
<hkern u1="&#x201c;" u2="&#x178;" k="-20" />
<hkern u1="&#x201c;" u2="&#x153;" k="123" />
<hkern u1="&#x201c;" u2="&#xfc;" k="61" />
<hkern u1="&#x201c;" u2="&#xfb;" k="61" />
<hkern u1="&#x201c;" u2="&#xfa;" k="61" />
<hkern u1="&#x201c;" u2="&#xf9;" k="61" />
<hkern u1="&#x201c;" u2="&#xf8;" k="123" />
<hkern u1="&#x201c;" u2="&#xf6;" k="123" />
<hkern u1="&#x201c;" u2="&#xf5;" k="123" />
<hkern u1="&#x201c;" u2="&#xf4;" k="123" />
<hkern u1="&#x201c;" u2="&#xf3;" k="123" />
<hkern u1="&#x201c;" u2="&#xf2;" k="123" />
<hkern u1="&#x201c;" u2="&#xeb;" k="123" />
<hkern u1="&#x201c;" u2="&#xea;" k="123" />
<hkern u1="&#x201c;" u2="&#xe9;" k="123" />
<hkern u1="&#x201c;" u2="&#xe8;" k="123" />
<hkern u1="&#x201c;" u2="&#xe7;" k="123" />
<hkern u1="&#x201c;" u2="&#xe6;" k="82" />
<hkern u1="&#x201c;" u2="&#xe5;" k="82" />
<hkern u1="&#x201c;" u2="&#xe4;" k="82" />
<hkern u1="&#x201c;" u2="&#xe3;" k="82" />
<hkern u1="&#x201c;" u2="&#xe2;" k="82" />
<hkern u1="&#x201c;" u2="&#xe1;" k="82" />
<hkern u1="&#x201c;" u2="&#xe0;" k="123" />
<hkern u1="&#x201c;" u2="&#xdd;" k="-20" />
<hkern u1="&#x201c;" u2="&#xc5;" k="143" />
<hkern u1="&#x201c;" u2="&#xc4;" k="143" />
<hkern u1="&#x201c;" u2="&#xc3;" k="143" />
<hkern u1="&#x201c;" u2="&#xc2;" k="143" />
<hkern u1="&#x201c;" u2="&#xc1;" k="143" />
<hkern u1="&#x201c;" u2="&#xc0;" k="143" />
<hkern u1="&#x201c;" u2="u" k="61" />
<hkern u1="&#x201c;" u2="s" k="61" />
<hkern u1="&#x201c;" u2="r" k="61" />
<hkern u1="&#x201c;" u2="q" k="123" />
<hkern u1="&#x201c;" u2="p" k="61" />
<hkern u1="&#x201c;" u2="o" k="123" />
<hkern u1="&#x201c;" u2="n" k="61" />
<hkern u1="&#x201c;" u2="m" k="61" />
<hkern u1="&#x201c;" u2="g" k="61" />
<hkern u1="&#x201c;" u2="e" k="123" />
<hkern u1="&#x201c;" u2="d" k="123" />
<hkern u1="&#x201c;" u2="c" k="123" />
<hkern u1="&#x201c;" u2="a" k="82" />
<hkern u1="&#x201c;" u2="Y" k="-20" />
<hkern u1="&#x201c;" u2="W" k="-41" />
<hkern u1="&#x201c;" u2="V" k="-41" />
<hkern u1="&#x201c;" u2="T" k="-41" />
<hkern u1="&#x201c;" u2="A" k="143" />
<hkern u1="&#x201e;" u2="&#x178;" k="123" />
<hkern u1="&#x201e;" u2="&#x152;" k="102" />
<hkern u1="&#x201e;" u2="&#xdd;" k="123" />
<hkern u1="&#x201e;" u2="&#xdc;" k="41" />
<hkern u1="&#x201e;" u2="&#xdb;" k="41" />
<hkern u1="&#x201e;" u2="&#xda;" k="41" />
<hkern u1="&#x201e;" u2="&#xd9;" k="41" />
<hkern u1="&#x201e;" u2="&#xd8;" k="102" />
<hkern u1="&#x201e;" u2="&#xd6;" k="102" />
<hkern u1="&#x201e;" u2="&#xd5;" k="102" />
<hkern u1="&#x201e;" u2="&#xd4;" k="102" />
<hkern u1="&#x201e;" u2="&#xd3;" k="102" />
<hkern u1="&#x201e;" u2="&#xd2;" k="102" />
<hkern u1="&#x201e;" u2="&#xc7;" k="102" />
<hkern u1="&#x201e;" u2="Y" k="123" />
<hkern u1="&#x201e;" u2="W" k="123" />
<hkern u1="&#x201e;" u2="V" k="123" />
<hkern u1="&#x201e;" u2="U" k="41" />
<hkern u1="&#x201e;" u2="T" k="143" />
<hkern u1="&#x201e;" u2="Q" k="102" />
<hkern u1="&#x201e;" u2="O" k="102" />
<hkern u1="&#x201e;" u2="G" k="102" />
<hkern u1="&#x201e;" u2="C" k="102" />
</font>
</defs></svg> wOFF     Z                            FFTM        cvGDEF          GPOS      	-rBGSUB        bOS/2     ^   `cmap  l    olcvt   	   0   <)Gfpgm  	8    	zAgasp  4         glyf  <  CN  p hSD/head  Q   3   6 yhhea  Q   !   $"hmtx  Q  L  @loca  T0    ˱maxp  V        
name  V(    @j!post  X      zprep  Y      D"webf  Z      gQ       =    cH    lxc`d``b	`b`w@1  !  xڭMLG,miӏhc(4)1 bk?LIcҐx@WCXjEQ`	~A.zSNcv+m/23VIeg55ס?{޵[{>j6)yyٽ{)S4	EsNh/rE,LEْt͖ί-r4\:/xOT"H'ĻK?lV:_r )X	IOttJo2OuzMF=|NZ[! 9 o 3< p.n.%p`:܀pIG^cz^UyPGU~Iho?C 	|O)8O0?!Z,*H,l׀WrYrYrYrYrYrYrb{uYY!ќFƍA88GBDG4-Wúrju_23/Jtezjj`L&'~T@.Tғ*wU@%{YPPFC57͡ABgeͼkVh-D
);;+͸G;/bxgdaE0W`5j7&Zۼ6[2U,xU;vTQ?UovoY0:4tgϢE?~9ϢC?~>k9Ț#k9rhʡC+VZYheʢE+V,ZYheʢE+V,ZYhʡC+N6tl/C4-
m=/}i\/w*Cu3tbеkC׆]6tmеkC׆]6tmݥ,UE^xb[:Tfdh[0~fzӏ*:mή!vة=G?Η8MYxb)s_zN[{+icc-+KïP*YBoMvV&4q۽V.FڢvNR`j1V^}Vc:z 46]6kDzc;~XZV}O\ xc`d``bb``qq	aJ,aPI/JfI,c``aH`c	00(0I(TƜDYz"z`h[fO7`ڇ5
H U22x    xc`faf:՘QB3_dHcb```fccfeabbyށA!(Y10p$1*00ɱxnR
 M>  xc```f`F1,	%d21g4df`:tBBEYԿ +AA@ABAE#P?G|plzmX?%$F6VF&  4,l\<|B"bR2r
J*jZ:zF&fV6vN.n^>~A!aQ1q	mݓg[hɲW^fu6n޺eێ{vPybaA,Y`0՘b>Hjj~w޼'=~=ޮ	Nc2gCN20j 	xc`@kz@u?Y3
 7hxڝUiwF$%u3qȄ-0i*v!]],t;Y)#?6'GΛ\cDOq:Tr R>屒 nV)iDl7;K\vr*3%A£W' H4IO?I8(I)8f eJ^R6â*Ϻ`r#\^mq:Im=Q@*F#)9QRRZL~G22e+*u۶uQ4SuFlGDy6N'ζ/LQvͶ1p)%3}tHXձ
ng$(Uy
Qo fg/.dE@np/X)Q\EHJOĉ>xA\P"̡+ά54^coWJMIFSw"Y8Glk>Zݽؑ9qwY'󴘯.7@<)\ڷLQ}eSTh*)hM1M{5wL1C{H#9!7MrӾܴ 7Bnr^@nZܴ+Fu4Χ*idø5Y5ɻ!u*Չ/ȥ\\wiݶv_Z3ꆭ70Єo7uXsPA`R (kN q9MR}14}/{<8-]ZDuܘ=[Luud[1+Iyv%UVދj|dpCh=v)MyT)JepʃZĸujkz!H)]ߴwkxt#9Oq(x~tm^naJ>S}TV-5ͺFNXZ@MHU11eM.oZlUw}sv_esȺڠ\s$E@얬zg2c9u/LNYhS*˖]nˆ9vGhlixb{]\ 84r&6]zjlΕD]s8K7Ǯ|`=ȹpr>%3rn|N!%rCG#r6$+rbrrn<&	9_CB6&Pj6k>}`هzdK"RܘPR_,"v$sah     xڥ}	|E|M&izUB(zpKrZKܷ""b(,*.躬
͗&mJ~i９T*܍8$cG;yQky-зKbL[Ø1ڍ.^@CLHyV#J&"	F#BQLSKon5v8#˓fNG"qIQ#8/-[h)>.;`B9˃(No<Lp̅
x!^%Q8hpciYE$b"1	}^C!
58	rHL.b:$Ǆ c"#m|p.ڳñ	?*57ꛖ7t8zX\*N$_H|4<h ? Zts5*P,r(ݛq+.:9 <D`9R
ۢ
a1;2cgfd)&%&q;J0wSiMi'|uHUsGo$5%=~eKfݗWpl}vom]CC5ݽYP̲Hr&B7N;d+-&@*aUG5ǡQ< CQE]Fh7qQHtMQ:xyq\^	qxwLTECPƀ:sPyҳL6ce}(tH8v>מ?s@֎|ځ9j2FH\㝶f]P↟={?ط},??e}8mzRyK};f˾CU	LkH4<zH1G:E cQH!`K@+kiRxH*yt!etw	Ӆ!-֪B!Z-6JDΕdQtH8+#Jfg|梑չwOݳ@~w=}䏎\>7pRV_2;KPt҅+UvÓWϯRpi'ӟڰ]MŋFvW}!ھcDTr@/	Z;3(9E0Uhƍ`o<ކaV31h`vac?Xи(fE>!?+º9I>XB\``'28	_ƣI37k$1>$5|(ׅhA
T'ϩZD"\fIؕ-1+>Ⱦgxa`z,Une8zΗ{=V6~7:T5Q0P"2inlϴXF'i-~P^4ëe:Fӛ?a7(km@.~D$a'\6QrS5}=)_$B3n"\رlė]0a(k	}v%svgzWEFʚ  :21%umz(LmԲWAHگ`uV.Br
xdL	x!Rb<&CbݳxzK[xl>~ݼ't8(.kSI0C(vٔ$	oI/;\o6b*zMF:|J:#B5! )g\4!JI~-%ls['.q沑o/w}kVwn+?/W)2
4M5$~	N<V.`G
P]Li=NH'$tj%k,q:Lςuq}|]w7{܄?޽ȮqOeєU%'|-~գǫmO5[0boZ7ZpM쬼2?	?\x{S$IR[]hZl1@TJ'sEسLf'Rw.)V|_b0.-8'Ĭg4+bC(
#jfjGU>GWka
~zJfNQ4@3i)eS&WƟ77*z<jX?p;mօ&Q5v6; lRa<DDA$B5H8"KъMrG%G'&g6gDO:8BN<B.S`iٻ8!΂/>WH[6~w^p(vnm,eĄSXٯUw1:nˀ"F18T[J |iq܊(/ط6_8N:LozH	8Xw()Ĵ4{;$؛lbTvLv˃'=V_;Kּ4V-xx.?͒1|4pyMn=nY>eyq{^^C
pqw
cN{* 
;$)hp0t\.%{^<T=g{5'hW뷵Ι=|eYb^sB+Ʊ+GƞztscY^
H$?WtWΖdG		vL_bTv<j`qឺzL:tQ1XÙP̠תmed9?|wۧ>]c
nV5m3>+W/mGoTO
X]4P,$\a0ΜibvUs;fjݺ9XYM+>m&^­J.uy)f遗tAb	r9b`T+E0@̇M[I[W=飍]2{&,|SM?Ioٹ⽥ϼ^՜cu2Q
D(SV`DU Y$QjY5
T!4e!y|0o7gg=t]অ@TbSdhack@- 'Vg[Eg<8{:o~5s^~ʠwdaCY3n^\?&S8kN]3݇cز7tʼ=h 7o{ckm=kR-FW}!_?S_X._8Gᾘؘ4@Jw&i)PlJҫ]|Z?<3\p}_S'G`ό;ȆQo6(2x"T0ώT0<ϘQGh|ldji7|i/>tp74ӣ4:ּxb뚫B|hMcsZmzƍOl^65 +(	È94|<jC#1uTf}p.xWl+մlAg_kOm/|XW[㢱&ZP`u^16j5& {NpzI!`\.=1[p\۳gq9|#ߐrM.Ooܣg5,
{Oc}1	e8\"1oLٽN፣Qg| dLPC[Мp'		$P0vdr\%JYꉝ;i\?9?=_w5yΚI%"zvptp|_1?BFxo`S$$4Tf)4}7ǙɖrW\U`Rʃ=-;T(lLJ&xp8
>eiaCݜ#)>Ncof/p/!Gl-_/{*ܨZ}QEB򱂧h1ݙH$' 5m-:XGN]5CN1 ['#;D	~?<EiL;N?<ɣ0B	)ʨT$PςŨsfP#GHA2ٻO%oUX#_8x߃Q#nmphb(-0(=P\wbgؓE9Cv =ω|zg/rTgP9h_X/ϡ0>*4#~0?rB!77?~}_=Zvg1Y<
-=V#W?<zV3Nٟ/~~)2,a{zX{hɯ'W CWϚ7<I;.P<E_nqC޴Ч`dx~A{ņCANd AIY0w]k:&e4EUlDT(6əK_&AY,lj(ۛqO*x:~]gykŠ!Zݨ2zА&XJ-/~]+fN׷2ɷ&y422M?lfNН[8	L	ͣw(Ύ(Ս9#=MR"b	Qfk)L[37-\q%w_׉=%vo^uWAqSQu,^NXZ?P(zvlkǱr}bl+<GG6T6)Veu
4I Bl[k۴m}},]mkY깳+t>PBc7	k/EnÔ.efŗO×h='[Nm8=Ndmj  n;I T]b1[fAep6䡳L4Q$w??hĲ|[rpc+wMEOa+UnRG~;`o.0<Z@dR6N5Lrǎ\^!ïH|'PeπIBQpQLAș`<$_9[;osmd9 fsPB98lm[=ϕGM%/7<||xFnwaH)l%u7]O\^+8~

ιRl-xǁL)i={w;Z80LkX9^M¥?tL.q~@&_e`̌=3k6# )4B%_z
`=ko:l^;*R:O&M)Uɼ[>?Vvo',OqrI0_g}iEҜ$ X$#153ċӑ$QDE嫱(rqQBB*Lб193FQxKN8H@&lҰD͓є)ĩXR_!Y_)R]뮧L~s=/LWN_>>z-eu_\0p-Z@S9
ݩy\Xw,pp"<2C _DCaàb++pR'ovi-^/NZkΛ9jqE5N?{A~wusk`weEF`,6Se@8sNX6FK*"t|ğ`ՍK̦ڢZ|m<5Z#WKZ? k'tпMkDYaP?qY񛍹 NGOɭai&4?	oΞ1ٙ|[|B][hy;[|~#qS+N k"1%;xSo|呝_0iʄ3^Xr.{iɑ%zm>?-\`w| /c	w#sb"i恅B8^BLp Jև1R(HNNs|\瓻Ż;>&⛈3ilw!'?oO1fh}wp7d?h2Q>Z5,jOS&$XD2JUMӪ~13x-Oy'&LNHP񒨿YŮdk6Ȇf`pC\9Ӝ7';OOP+}C_z~/]KF,0ndq@hVx7.2STV=;RJ
FrqFo3rLF) 1(f)bЌ-_HA1ђ Yvs;PB<=׮}Ŵi-LvgJvKSےjȑ	)[$ZF|5ȭ>.ۙ_q%X>8\Piw:q8HE_nW2g\~.dYl(ǛpXqV)τvUaV>un'X<ɍgւQoGo/=1OX6lA9	=&hFqPGvW1r?hAJ"fB'ZCʼ)Xp-*hCV*9BW'^Db'TC{O)<ǈOGQl6XHwar6\D?=~Ƴ 9Ŕ;lˀlZ՘S6b)ZkI,ʖ^zLvET߿nCM"G[tqS&3@txTPi ]hXۈUWoF_@G.V"3Ima/.ӚFLMw1Ӡ5f2(?#g|i|~ݛn5ىK|~|oG _~7a3o^ݛ/^1:l}ii$Bou:҅P不y p/^5<:k.i]{M-O(91哇$:ԿsٿV|?cwrgcc_tz&wC{&K|kٜii~ǡeO>'\}-(vn>y9 #\5+ji	G^Gq$(?)ape7C5xk(m0k%ؙ4s1:D
=	/ńhRMf|g+'М<p+t:yr:bpqGRKIN;K)oE>3gL[2fY{G+խCLzCWG7f
][ͫ EiC2h՝hy+ -;9WyMY-`hI@8R
u1,ޛG	ܜ][d?*"oL}j#%F!_>	|zU3Ut#ez,Pf8
zz$zT4gm氐Wn
_.ɍꪚr璽	1ZYoX	K?J4f`r{8dwp.gþar56O"7Z"VYJjPJPNO쏝JڞDs8yu(ӳ&ZZ]"òH'?5FXq{L68X[oVp	Ӭ =eJ	FyIɷ'm-\L2Y}n"<OQ,4i3,3	䅍eWh j1J+
H^*;rduUiSRpL`rYweþ4iQdco1rcִg%RVzs&*,u+ r&Bx.ZNmJIj.NpfP)DuIV0NR-v!~fVZGWݔ:d|l撌MOZׯ[^vXˍBʁEILS!Hl ->!J<F'in-k|!#i`G1=E/=Ǐg*fg0zq̆Gi%[Xm.o6StJ:sqoS-n]XW[goŁ̴pMdx9@|@3P6lcҢI.A;jHXhwrzvgꆢw
3ωqEEeok5_'zuz	SSK\jD5TT2{XU:{f^YK{xeFZk:5E8b^>%*p$T<G4P3[ψa#샲VAEOp^)#AucskIUꜹ<E+sW<iΗqu۔>3;w+z &OD:+cUT<4(_F
0Qԙk^ܴdÊ٠Gwmzbz!^)MWB.GL};Äw4J'U;xo-U{Ui!ӢFO4¾&wO}5gd'eۨ;m3nulKGe3,P0hP}yCU풪37m|P[>l(o|OZ2c=}@߫ a4E,7XfKU%h FN)fуf%
_hC;N?3G4;Oiw#\9k$eV~JuH1?m?ɺOܗb94z|=BCDfsEOVc9i>Z,&sJf{^{ sˆ;*c_В'76{5ӶLwj5*Xѯ00r/L-ewٳ3.\1ho
Lw=wE i	i	WP;9=&9SԻg~IZAdRC|X:"%,Tfq`5A
+ˠD$)PّJ]эk0a|1ohw:H{X]nw]+G6MմmO8{
='g=ݞ;(xx½<_L(sBϾO?+Ar?~g Eu%TE
(pD0bE]ŉ	<Xuar`HG%VoXd ڂ$5R'OrהQ(ݻN8376gҚWT=?"5LGCu;R#m6l jaU1HR\_㭅fyO^"eIفUΘvd(@qg5msoq㺛7'6*}%&.zj(8=P&*tbA"%TUW x+OhU)gzvіԄߙ]$9a~WّkxͯʓO~!U9z<Iṡ,ZxW۾sf 	 Ux鱀Ip9)i3m͇/?j_4rԂ#KWVʒE#F*vP#7z2R
KN*				5)Y7y4Ku7ڵP#6ZQ'Ł&\LVN]*@
~F{6Z869o̾u[)n&Ck:elj|	S{U ~:Po\$#o_zRGvEgJfFPG`}q]򰉓>!{VǇ>9hY#_0~=d1̽"!~	ʹ~]L-^U{@%KNbiva3ǚ,h>bHTIhL!TKsHNmQ';˼HtƷFIN%H}O^iZk+ڋKZfqIk=boH%ۯ3r
~E(ב%Q:цCXJ)ʹ,o]pqa埤&yLo`^)@'2xmՃ"Jt	N1قhk:Ԡ^Lj VILW=M)=cVӿQZX=Uӭj]Hc}Jz0@GSI$b+G/m[~rrr#=ךqhlG),&Mos9hћ%|;oɕw_5z~^;pB-՞`s.\5wR$e]Z^RS̿"]?_F|*]ո*]
G#V}
!C"Zq~LF{KCZN1`'WMN5]&*02Hŗ_X7FaO;5hDa<{2wsD^DCQh
%ڕ"Q2&Jp]CBc"P#Fu[w,O:X:ggʜ?!6Jx4(PcN enZ5cQ#v)CsUKcUXʡ:*1DUԟ^" F먖wWUy<O''=Wjn)	I	IaL&n'~]z`cP`(6LrBv	hzJzϫ@<kk^JTWaSN||Ƥ-yǶ>a߰N,r귌k{_R5g*7'znTt2%O7?#Qop`K0khkt:
F5TJ*V. o5QhsQOn1MᇟizscmfNHT#bDEazoI0]ޡ!X0PH-Jf=.6bp]t%-0 W擨	X=2	 iA">گ@_H"g$:OLFHDZjAx^@''F`6M  Q~
6۱fs_\<ToJѾo,_rҬ|%L'm-mDrFВpzj"	$!;da.O*EǔAI_{k!8%i[EpPEzYcj2y7jMDN?MU/^&D +-i4`SbDJTvu|E.X W#X{\ө 8&A[>p{xԄ4l	a
"k5~+Dm ko͇xpS# -:+.NLxiޞмR_
4)_3%
̚^͛SV0Pb U(`W
Lb*4ѳLoDG0kfTMzvV`ة6{4/کωJ~{Ӫ4˭5'zk&k W֧4Ec:;-*ITiT!D4befѕYDa+<z5A&]&Tf섩XjPFm;!鈍YCѮ)}؋]!cK_6اEEz	T/0f=൫v6yAt&PA+5cMճ{JRiIM.sՠM4O_@!-{{\ N[N -_PLl5qK_ǫOkxM$_I KnZEuO
L	VBDGgd[~"\)Wf}-&bņI(@o?p2[{>yYnہ&׬%ʣ >N._<mГx6=^F?ڃv4m`na8eMbw|7v+n|\To{Y.|{КU]]`נW v75oҝB]?P &oGޔP!%yWV^aL&!޳4Zm&J8~tyFGMh_>8%Zo}o.;F'ơh$gZvz^p*iR" dh  bYDs*&vt')@ttCT?}hwĞ#J;1uύʝg޸BW\̲%F$a
O=b樂<Ǭϝ;ųhZrnNv~cwyԭ~嵃7Xh6"F?оnDLR#
UߚW%DÊKq\{>]۩>=
*ёծ	4E`31D$7X,ZT_N~#n_Ng^T YjҀOu5M -"3w؎NhS4ztE}:-mB. Dc *ЎaD0	IoߎNus:(JYݒۡf#[![+u"T*U 3:4,tPpHKv9nY Ԣ?"V /C;^E<2 8u;.*kǂ6#jˋwYH괂vSu5ͲBZ~Ⱎ77@CY6TԭOnrIstϡ]TdЪ)fToR*um]Zp{vq"Us֍/I?'nŅ%w{fM|uI]SM]=,#J/<0w?Lx`Ӿ+illmg]ھy(G_Sp,r,rB&u\"-)˝$_{4(Ahn(	ҷEݻq޻'Q
=``%WZiW[$C[T$R\	q1(ȩh:d˼3ټ)	DIayER|yOwUzIX¢
1NsꎙS{gmܯMe?!4;*0kG0xh95sdyzoU}ۗyKur)<=WIG~8_],KȡmXi]xMN8y"He?
=`VFkF.]A,$+v9؂l .?/>.*[ [a{J'l.ҮlzH'$;ho޼a埏_햙8!Ck9iMo?g؅>ٵmٴ|[￼[vU Ƈul|o0z*aQ@uhJa(jh}C[tT	iT ݻ%hr=Wt/#o>?	őَ o@^2 ͔SW
4n6^#Ž@n~>4=Z@~I^~UʹA:C<Gfp%5T4*2)bc,]?>AI柈fhߕ
UW,YjP=jm|׋h|m訰E(<d`dA__ږ^jxY5/o?y:_3 @oK ı(yF04[`	n؂<03,yX=tuwnZ5sNm$WgsSDZɽxf"9u#Ws*h0y&Y^ك4_v{~>	#huĲC@~r*2VݮYap"ҕ׶-.j	F귮_JǰCaB:< @Ob6SI<[/󳷢S5cJDmb>Cjo	v)4[NOvcQ_پ&-[áИe*Q3x2ѣf$4W<a>YhA6@|=AR@ßr)/^P%I2N߇LL6ܩo"9R{
owAty;:z_T)-])M"=cu<_ڹ졭N+)E8͎~fȋ\;Uc5AO%A,71J"4W/WDjuǽp.#FiFc,jA#dEGmvv6w
~-gaoBqIVwSq;Bٶ0V{l̯Sn̡18>I<FGQW^Ʈ5J$+`wL7خfOꈜm~f23]Aeژ+~wX_6GS֔9';K7k|ւ/N>gy㲗B6n-_ԫ=w;a')D6g7ӂ+NS?d2Qu o?~]D{#ţE>hF$QrfҪǰ88wl\bkAQMISc$	~*6 -h76q#>'$ttv$63);qj'-o+haՄ3ss3gYO>j'~|,	b6(m-Vle-a=	͛;MXBCAwMls{"8}0Ip'dףW>6x'>wVIտy['*vǵr-+IYfĪsaGs:yF+UQRBeŲl«׍kxPhل?~ 8p+:M|RK E$j(]4
Bv^Uf߅v_Ax'WD7^*TeXXm"
L8R߻6aއ]#Qh(l
ZF]qA-VO<԰fj7J6rWަږ~9Y	[V'6\{x
7/nZ%i$@71Lx~ 2&m?Oǂ`=$[*xކ⫬_ޅ'Nnu0ƫr_ݍ;%cHhċ:;smT}(Ogu̫j}% vJl+;;zن?oZV/Z-9ٳH<0GJ~(xoyFZl](x>O%&ε;qDVԢ#>6&:ЫX 'M0A8AοleBeC5_#V-MteNU'*/>4pJܜ/X2	kq;bE֖/m}4#`iCZ`Q	=jT"TEF}Yފ4:!vbf=(Q.'n]k"Hx̬m'IHrK}LiO}PeenoLO?uD4YUy'Zbc,q 47)wA0JtV9B&8GdW٢H??pF5<=P`d
ӱ(eIlZ\Tվ663^kuepoKBsh8Ze'b$#(OC0C(j96BTz-Q`nNJ(HGÆ*ۧwNvF:Dhh>Fs춭D-;,-{m/U"Y
D^zQנq=Ǟ=)z_Vm7_F\_ʔŮDZx/߇^/|SBbK:ق[(7'QCW	>oXqf"Ѩ$Sj<J"#Dx^S+6Jˤ+BS1e^ח`2e
PQ:(4nw-xXAhNI,N*  xc`d```U9+<*I`od/f`b b   X xc`d`HH2'Ȑ ʀ E   xm1HARPCNE$:IT$CȔ$&R$CqB B$Rdi)"űHA޻O] 5LJxcǐ42~^Sv9SDkU*EL^7K$"&M# ߺQ>dܮ9A4/Q2~Ud,~4w-,5	%DXgxpdh/aXMROHߩE3G:RfySC\4x-1mI\Máyo%n*NW1n!ﷱcrqTSPӪyQSp7jZqwbUM4,˚^b)G6y)p~yJEae`Lu;;nG	|^o|܅)^xA7}Ka+|x1x!}{|9W{ej*J]:pxHb.s{c.ĜETeR+P[tl1U),79|({,ϝ|#>PxϏ?Fxc``Ё$.7L|L0=bfcbNcna^|KV"+b}b`w`aoaqS3s\n\\]\^psp{pp3/o6'|\|F|a|E|Sv]ƟB@G`?oBvBB^	3O~&%LTIAX::3ĿHpI$I kFm|vHΐ! $c'K,lOrarr.7!I!Da-E.EEdJ)]PfPQQQ^|FEF%HAe=UU'4KԴ"ԚV=SOS?1AfGrQ3/iӑqI9۠I^}>#|v.<3g`fTd	ɘX8͸x-!7. \dS%	LY1`  r      M  :   z  n  4   xڝS;N@}NOR *䒂烄RB"(@qqB8WSqN(x;^L@Hݷf̬,q9 GpIhG'`E)Mi)gpgbxx[ƻI/q{m`kE-M4{E:=G62i2Xu}uD#[͎5Lr[.ܻr+11#,;uDRfɩI֥X0C^JGX?EmˬKJyK8#5Zǹ%|t-bQ:ķ!dOkxek	<$ԽEߠ:Uɦ)OU8]^fyXhn9wPB|Y^y:;+
J{Eԛ6,˻s\+r
  xmUlqm]۹N놷ݝV	^nI+t\>_rQ9^/DI4	3O$L
NdMOQL	5mhK;Ӂt3]J7cACǊ;e8(C_E*qa `0ag#h0qgd0iLg3Y:g;[aIyvQLl3{e/GI381rb6;>5yC1|g<)'񃝼9/lb2ZG=i H#!E|b1Khb)YEb5_%^qS\5x#q/	(I,)*i.)Yip,J׸ɕ<gHIHWLb(UҕV]YѢnTjJ]iUڔveҡ,W猨BFID+6;o)j+OX]iUNT   K RXY  c #D#pE  K QKSZX4(Y`f UX%aEc#b#D***Y(	ERD*D$QX@XD&QX XDYYYY D Qg  :L  PK        ,   LP [  @(             Iܐ                   O p e n   S a n s   L i g h t    R e g u l a r    V e r s i o n   1 . 1 0   . O p e n   S a n s   L i g h t   R e g u l a r     BSGP                 l 3 C (ZxZWh[qJx"cr,g,E&CĶ@rXY?&+uLFMlSMP+"betTR1U0:~bRˏɴ׋BuM4&>o]nR%F(Eڴ-*&FVݷM=`8puiR(Q,K[)"ֻјh1	Ŝ.b(j/CpәyCk"-9C4B͎+:ʞmOa>E)h^v{
T<KY	s,P=,Ltc8쩬Lv
4J[qb7/s_pd!$ZLDvK$ٍru V(E$>on%nc024V_quK(Iae=n#sFJOLt4HIۉk(_GA4w( /+.<+sĢ	,Y>$
KL(s)4moƅ^P=2	$b9Z?=62(<+;zT¨|V̤.SNWzi:Neui" 	[T+`y_Kǥ-rQ@)K\"	CN:Q29m?ɨ;7OWfWXmk{޽ۂJٖO\2jpT_o-nL&M q2ka/ݶ,\t#潚Υ㕝ťNF+zP(Y0aKXbCRHD&Dd,-T#))F]wXnCWZuSZi>_z mN! u\TZQ`X4~5	UQ*K` @!Kt BR!1	PW$)!P@-&"mQ?ɘVtI\5mIeL$fdIeeQfiggYhiai.=Oz~7X$%w	PJ]ml唀/R|%u^hf؋:W C5Əu[c|`$12e]# {taK ksKȕ,m;bJ!H0bS$B[A-!HUf1fUKWzITݯ~jrT%^X
֪oZ[:dQBvd8"%e	  Td]?eF@FֲrRk"uKe6]b+QV*zD7{R/sX}ARx*c͢4$'3@0o>(5UPJ2!NF҄LԀÚ`'ߊ"5,21.gUE磫}ЉAPinϰF%16x"3Yr7pXD!Pk\9,@:zC4 n2A6!3AADE9+p  L` 㯻84MuW7>F %vC!CrQ<1Ku-x٪RYd71x,\U5pӬJ4 t7TVV
8 xUBK%RtJSLs5WI-Vk&RcPՠA,_R]iH* cP4j  d~B*~MѤϥK5PmN$T}czW~3+X +{H,l{G&R$MǧV+-xo\wjtP|.>e&s84 <ಔ Y,rMq%7'STTjX5_` 0%##
5dAxODnw	`*Cva4h	B
IN>Ih͌2
[QO1jnF"-0؁4NTA2Ԍ'TZ9	ÖHS0R?0Z :LvYx^f\A)b.)ӑVUF |iOH%E'_-$FR!R_4Fcdd3v(`\W	Dks*!4 11wOLY>AOrT"yaAL}eg9"UQF0ʅo|_q^GSι:IUoɆhA*LI[h -$X
gP.{[׋c`'GL\Arpxv2Bf %%ڮ{d\~8T]	補.j @Y$zNA`4d/҃'T׵؅D9!̣nT1;RSC]̅zbʙ+Ǘ$W&BiExi>$nس=Q$㛒Ras!xc%Zd3%OQ 	-8&.#|ʥH&Kي7xB;Q<0bB;nA 8i,"V eq.-&LcP+Bd 5Ҟ9T|lsB`?cnOX#EG*aIBC8lJ:yG-D:E+O^XܳoV)_vfE08# #Hwk f_>ST	"% NggIrJaD@P*9y$$,(b{ދ9!okM_eG&#|.4!tV=Z$x9HqVjSZSȈ?v"m8Bjl։OCSCw8+OݓZ:%čSQ
sГ	\LYLyȃ@Q <-	@}g-G{ZN N|,lFʄA)Ȗ}Av'I=9](eQmd@.R.*yw]4#RvȡPC.%W*%9/B5ob]DQ<	Z①<D !5j*@~VbZPt;C V8?P챃Ŭi˚\~Hg;Gy&	;v8T˒2ҵ5r)Hgt=b`6lrbڽ4W
SK7奄`A"6ӳr4O!I ˄S8`N{'=$J:g%Þ=0ALb򸉤*(`h ?4RU;Z"sq=*BD@U
`haPjڛuEe \P}Ή||V&נq& 7OslVhByUNo}Zc* AO}4&ve
`T,#IGgpϞ	B%$+1w	Ubs0]Z #6U(^%UW>;*M;VTX̿V~kRNzo8V'*T HjC'Msd'ǱR+9V*Wu@eR 4d1i n|4]Ug)JIDWUBLAҬG ㆭF\ G7[&P(2<v&7ʙI@뽅Q)GQkp*<KQpIdh'ƅum[}<W:@d$_י	
DTp`FhDw!
V@p$MDSZj{_V\׫g`[G+<d/UlK?ާ%ڐzjsl1ҫkv9ѿw̠!ϕ'Ea[%n/2%,Qa0VԢ (QhG&i;yaeǕ0m)^a_jű r+p7>?'CVrwQqm
ǑZ4Et@V%]-ο[cf햷N3Fi'>lfEW ь"d4Hi&,Gm勠6s [|aV F8r,Jvף2"fӸc%ֳB(G,hpECj'5ҍ@x'7ҩtDZ66;dC pU>3|}[]3M`Cш;iږP0ʹKvmI`PO7f2p;n?HuNdxuӗ44&,#^IӁT>Ƶ!M $'XN! \DpB&ASJjp
GsauYw!RJ"Qed0`P@#[giҡe]&c*3)k g{&p)#Hԕ2t,!Y&]}}Zib6s/PPz;25zݴZFd!81m\\sNTGAdkg>ԃNmmH.8W9*U.*fBpE1& i(JɛFOSX#jK]`g0EJh9A+b< >hA0)ؼ5Zj"Hg8(PEUDPYadZԹTx{0Jo2$jOBM v7i(&K0p
&B"eLp$
SLZx ͚U`S  LgyM@Azƹ&)I>AĈI"^>#TbzOB9TV̬`0T,??ʙcFLxĬ䊟}*.E*el9#`r>$~i/hOT%HԬ	v m1tfg(LTݮvkr-Q` ^T].ӧSPAMhL I'faLoZRolu ,rWؤ0g/jPRb}'g%GM7x&uhPv{icj,CdTxٔV}Yw/:EQv#A8*
^Q쩸dq5"|`b}L ^̫RQ<p.E#@A_c4[C51*FYdү3"Z2T:,h!FUdXGruxf0iyERB, l>vnTu=XCQzƌl?K;ar<;pxУ8@_x\"paJRVR%\# Md݆FW _bu&h:K?<[`UML+>A&}{SU{~6p=uF'蘚EД-Z~O #bĠ&0.68J(Dxh1i1"KX'P'؁ڐUQ [J5cyIglUܷeEҫO͖'_ۥ¬AP!ra~!|j}O=U%B]Ks̬'i4BQ opܜ5$+=k;x; `1}'$74'wn)%mCFP/3!d:%
/:G(9#mȥ~*.c~8	'`!1Dd'L&j"OHg
Iks>d|Z@Jә?|#* zJ[ȦsXloVUmn'd;I	)ukXLnD"Eы86_%ԭ j])msK*e^@-TL!zv  PyÎ͂iM$#2!C8*BUۜㄭaǼ@Kᐆɔ0`xŌfX%Xs(_OHR	7mRt-~+aᮇ}nm܃P]Qx9oq~gĹ2L;[? &@w}JDaABF	L,kHi0o@&TNefٕR%ԓ1~40}ⱿXs/U1yEeD3gL!N9+~ѝ>Ju! 	¯e/7z7yC6m!J%ghk?|>"cspy j<&AN$R^d qu~$=6G,1&4E6(kffy_ 5joεKQUz'G[Y%É"34VƄ̚*es N!%+?K"A|ks#+*_I:lCOQxt_p^DHNh)imͱY4'53^v@[
.[Cq9ȮavMvNKg"8{"lS׌շE1]ƻBD]xLL#B-Ty#̮P}dx&3{	+&1
G_89;G* Ŧcc[#NyBB+@H/ڕۉE3\ψUP9g'y	D|ӛDC(%La	RR^Rc0U
2Q8yԀ6/*Slߡcfϣfb_Z,dy3(E=T6֩5 j kOp̷%Ll5B&	v&=m^w
ި=Q-S:JS LfETlIZ*	.jGcZPNJ30QL~GDn&6tg%JCx#u3^MA&Ţ>=-O n50]*'s|i/$Ɲ_G;DQM`(
GeAѹ"V5X,gҙ nb呬LXMh'NW fތlS0uQI
 Vi=.<%o3x5.*C۸ʇGH)jmHp0	KZhPE#O'FʹQx-1$MA1ApxPQH!Q}vc;">7</iC!zW}4|mTA]2MW%NSxPhE+|[YMN KOީG?Ibْ-ꎒ',g\45׳H.Q4%R\N]\;ny։)ƕLB%@}j \\4T yHϖYe0I{Fa9~"VHچ\sK
֦-	wOZd&
jFMI-OHJ%tL i{}	i#|r5o.$ʷ(ELo-0 <LW?:#ouKsN0@X(p\YkjaXG5E,皜ZP2><sjf_h8G"Xwkh\iɮa$y(_+4iSYͪ!1rn48Ks:<^-],h>H8xSCh~0}󆒀Eyw%<V#%ΝLpPk^Pj\hQ
97G=VBMlD} E:}gB]_O zf.$z fq	0k\ 1$n:

]B!fק>\d|o(]y2uB
wpI?r`YQG^ȐsSfyO@QԣE	o
 `QfJȍ%mB(0C-lm"-{5aԇBO'?x?XZx+4̙S37/wNڌD$  R&.6r	LSh"){0zF*A%91𣮫ݧ:ls93%ioC֐iF.>2 SJ5ٖEWϯEBb/ B_ѮXp+XuiuҸpK#
xHy,,@ykKBhCpnf.̑ԋLE,w.@yX5ʳRn0Sx]4򻧹xĻchL
Þ?EA;Q1_v<2"KV䢩 Q#QdQ9/?L0tJ)H
n(ժ?1tьzTZʞ3O2۸]Vqb.6<G<0cF1d̋4)p}*}{0^v#]6x%e(߿gbpTqjyTY$VlUV/l,㘇3E,<}+hr1jHqeV-[;<9]?kbq5'N1#u+,ƀL"p +y Ņ\-hiA.}+l% Չ7/'+ܛ)޷nԔ<`H3»ixdhz#X-57]ǋ-Uxw*O6 (brqh]bрjN/SCqsO4G*3`rZ%S oFT]ƢL6R=;gEH
bqpA൛l,snz󳼠mUc*s-/LےHJ~R.~ ?T3'q<VSbgirY#t	o9n~nW^)>>)aH#U| <%3ykbU$}& f^lbވI#IfH
-kqqtCM/;
V8r(iy٦w](Zߝr\`nwW܏r	MZYf<,I}ZnB>MWX 
5WtΐKE7rys[\KhZVn\y̋i36{ZK!>5ActPA<);YZe(B7'>h`bUN*uSWqS=\z.Wz 6ŰXx
Ӏ1}`}gfu.B(XkN1}XZp|.,pATƉ+d,gbU܈UWR(2fmhKfF-kgT 0ra#heiT8[1Oq%
w0= +[bDPG<ii^C2r[Whw=Bu!P9F>9Wsu(?~mmPehZ2-VG2Uae1cV9qm (I2dSԴ.#W<FQZJц"Z2@iYqO87	A>E%dXED<]E/OMq2L(a.fx9 F٧X,eRN@HqQSUVFN脒>tͺÎbB	[Nm`U>q-'Jn^ڥ#bOifA2LghXn@KbL`|
dpK鈅ǆh%]5ϨQ$p1nca#ERjM!HX { -*бێĭ&Dn:&,6#X.'x m]),QИa{{=l5HH=w''*Y	ZVfi3a0^ԤAf[u-+Ⱥsin^gO(	v.;~JDK֋?nAI}nɚe 5j֓&c1cĈ0T{MQ-R9dAV:d% H$MIg>/G<'&H FcPh4
Cn &B)Q[^:1EsWsv:&@ԏAQd?Cus!4agv(ea>&I5>P5K,	E<HŘspx*Qrl# i^֥4,P9}%*0Ϟ9@Ɠ
t^E5L}x_7`$]tZǩJh(c/^IP5x7@DiW}"j<T<7
o.ux@uukС$%24<:`1XncRd,O0id-oDW-l
KDIMn
7e 6{r?eLy*V2xE֣4&aUȅW2EvW5k*YTc+vYBSX2QBT@4c6>+,ƉQSF!)<p7h.I@*yĩXaVf cxzc䵢 AQ3U/b!
'2,~.{~0e8\Sm5
i&)9tbT E?qrq޵-lHć7@JLm$Wb[F1Ym
'ׄDxZrR>Fz\	.tiȌ:ڶdVN?Epc3PPPqR~HDP<Z(Mw9et$ U<*SKYPChYAP@ѷsɎf|F?Dg蜼[qS|HRQӱ+~@&U4ᐭΗ4ն>1
]k,X.\ӥ):)q	f	r뮈nck!W`tYq&Bd.]o"s:4)>Br߫*wFz
'[k_l&,CP6,C6ޗ7U~ijf+T_SAq"< 8y"*%Z \xtmbf48pmX,
eVY/-n4ٸspQZ-[	,h}~cG:ޭ2]=m \P9'Ŗزm?EqvYB	%Y
l).c9:AѲ~࠾rL|_7E`ӳYuH 'w.&,~Lkn#́]ݘoK!#DؐgB@j'g1&ZSxp:uNo1_>4@׎bJ9h=B][kGl# +D}j.77j93'ڽP	Vb!h,/8ܮ?EJ+$1ՍuQw&&-Bw.k&1K<*Tct:c(|
X=u%tW"w
02ٴ1Bghz%0ahBwCJ7J:TkLS@)@0c!rz	c^/XǄ	іp-:rEkM,\S1~0}*BN\uLpf
	&+ڵ8vVtܤ!"#2@z/  YÃ3΍^WsT1xXnPPpˠ(#5&/4&b8+-\螞\;:sO̫PF0=3 ;VѸmSزFr8x]INߴ5Jsi_!;P&#qGn"Ɉl
c62c)ROI2:{\aq4fI C01'$"<d\ !'y(qz^%fVE>7n.dtkfzn[rAG9p|谋F.M%Pte"e'5gar*x*%rǟ'˶#1럇rƺ^^!c;tTޯXMEN[¶=UCr枩m
ELn⚃)zӤ̯	ڕ\cXD6	AȀj65@ٮLb &B(Zo)4W!^D	%fju֭#@&:K*ת+@|=cX8pҴ<7MWR ک!||;"Z䏟 e@H-QSb$,`4f聢LƠ@S'jz!>*s[:+mJ9 AͿ\8i>+5v\f-k}1]Kw	:ogbLF9e:gB:INX0xHM*cB1$@:efr6l00&)An[29lGA0R\١`U
+p_nl|`{^@<Sb []P}!P @En耀!L(ӧQXLMՑj!XPqCK@	BhuVح] robGar Xt\1h{&r]?+#b87	8C  VN+
sT%oUR+ׂ*!OKRY~|MqGUH>!R[e"ʆT>]Nخq,^th	eV9؆F4qD4b.4*%^L+5Y1M_L.!|SQ9m
=9Y}^<s/s'_<9Ej_)JGA6 s{CHN)\6G'B!FIi'`q;uI{Hh TR*ЈHPT.S,iRL0(H	
bi.4M!R(&({VȒ0pGdP9"xϸW%kGC*Lv';c]d=>6MRssEa
5!*or<.TH*Q-*BB}TS
2['ڜt9gD.2uʽޥ`uWbkCf|%:C]yʺf	N~Y[J:wx]s1f*ܛ]?y4D|*ZD0S4NnT
Xo4b) vNOL\*˷0Oc/
DdXLT58рx扖ɼkPkW5om䡠? W)dq:%r֖Zu/f(T>CJ-t_R#\0:NC'1b ِ->'dp*~U\#eB\ån&<>713J
b1@19^r6Ŋ7bAwT5zTG9 &Z4!Xўe5A&xAQ:xP0}tB7p%~_2^uO`J^<g@wDhDT8/T|@Er%KdE	UiTzgdINDQ邈nO2 2Egӱ!%EhHkF7꘨/ŜkRZAbR]m0Q-В[mLJ6яb:hO^v`?&,&Pbl320sUvfLRQ/A@a*¥JV$@ΥOu'
Te25:F;{hZB81ucK+6?AyBƨr"XZ^a_Y ĥ|枋D2sY&lq'P2iLEB:޼Rx,atVbCܳD
n b
V2o',jk5cfY ;ԩ6^<67\Jk ]#)a8%xl!G8I ="=2Wt(]oi^K8AΦd^258iRP*K,0G<Bυ&ی'>v	>pT8IAilt#F؄͏/exoR aJm*db"Q28\#,JF_B<a- tcAa8-TXԜ!* 5GZfV8`^P=͖	h(`@AFn^ !E&ϵ%iV 6D:%aZl#ImoTŕ!T="lIt8W㮬m۠]VBJL2'!γ:`Vr p M9DTWN=IeYP"&Dݐy.I
9;2 & R|A$	 y"!)DQ`<ԑf6_n
K D9+
Xa!orM50W uo6L6rz;Zݸ"۔}|T4-#l?W^2ЬR!Й?)!(-+JIj(!՜%ByQ(PZhz3%Qq;]6>V>،@16$,#@X}ovd TD/ICFtEM5,l]:=0^F'I5(p((pox&P-FX8ufE\/ mϚܼRt#<nd#+	2|-<5>ܒ@lkF!F2=bߒ$=թ5Ѳ2d5G#`DgAG2t{-,JߧDeNJGoxLLN]҄a4\3{8J'	cB͘T%$^F2eդe.,7(N~vD8(^D7pث%%+H&e#-rB`JAȹSI`z-!YRc碃Έ5CKy20L\c2,%#WR|hd-3[D<T{!t_Z`wz$j@` Dڒ.;a8^}\MQ̴dTȝ- &U=X8d-&oƉifvBU/[%)dz3/HQlkI#RuovXx)\[pحBIk~2G2Z<TOHB8
rPFFQ$My4C\x܌6d@kfxT[\3YI!eƏ"3,[&T=|﵏b_.`!,ۧ@:S4p>gAJ
.;%(("ls(B!:l2Ww¬t xFMsشiKJP{|Pw [gHHꃹѠ
iG#nv+:lnTDN|v-( K1JL_(5U
0H+)w:)CY@jc2u>K[Zr%J6>0E7:ܱ,NO lc,GK|` G˨JPs?<p e+@"H;ڜX?E&ȵ${	yW&GM{_T	Yi[qWyӮ*<MZu!Q 35SQilu!]qtnѡJ
ї`TUD rIG26Ƕ_w+`خ0@j"0ICaeRJmk,[}Vn[~e,1ĝM2'M<IY<k$Pf&xY!))Y0p5$a`؂m8+~hT)sCcF;lRZMV=B+C2->?ن'T#TXk@J$q TT7Q&}:,7J7m=ԛ5&]礒IPQU-]J+^y8MBI~dyN$&l'yu^8y8Q{x&\0oب{14!^_u*5w!!mNƙB7DKDKYz#멥d$fE;KbQHa
g"*<jDBfYZhnRB3|%nH9X_Ռ
 FHjNi
?gsk?0Ѓ	pɲPttaN+NVl;%jyhlI#4gYs/,2Afyt6ga(FÀAJIaPB=O{L㎗Q&46vN0VIn!2qENT8lXcp3:@ 	-3p8̂LhDq #$&Cmcl*aW1&72=\ecmL1e|hT!^lNk*J|2`SLF%	gvF\8gCvΖG^,I_6ivw(c[ZQL5xTbC^L6rip\G"P$SX@lH]tsh{hkZc1¸H?/j"5\GFJ;hk	"vktfpB
ܓT,	x+l+Ч%EHG`Aq,Ǒ%GDJG Wʆ+3\7Xe @$Ycǁx+tԶSºdɘ -#"	M"W\wrDPГ8!U,5
22 eZTb	QrCxj5m4oˎP<`<hEjk 8Xd*Ɍ/`,ϐ裍tĜ T<UڧRBQ#:{i	Dy%elR]:%)џ	mw4sF>	8{h嶴I8򽽖&IG^]`%kjpI:hR.ݱݙCQqҞ'I8&HЅXN6,i9-lND@}bgKFºE& DhQi/STP'r45:ɮ"BKcW	hYԵac{s׉#3Hu},=ʐYR?IpSաXiWXR0%E
U-~!pJV1z=;u2VUy2Kyzк1րmԈxO"snNy*w6$e
b  GSG|Sqb	ԷqAU0cVS$< ?}T	 NaNY~p{D]Ēf[7hH*&[[|OFOY|kk	msCρ7, ^>F3+>6WémJOz+f;n^ `u`+y[۩O.Һ]-LR7Llf60PIV*p-mBTo`st\@\MP3\ycze!WRHE2DHODsb]21ͤ2eLicї0i݀		TM-<i:5y].d4Ψb=VSXBpH@Μ-tU(ِkA5DA$U&0XUdum(uv,P+5U8Ȼ#D9,NGJ&|_߲gDT*-/cq#
;kI_@/R^yʢ?a8&\-fF 8p}]-D&	'U )滎,;#׭a
W!ɫ(yMHЁvʁd+# &QWF^?CV|Wf!3A3w+K88ֻxE&V:ƭzK4-iQ	;v?%N8F@3]FzyG޴69 N&|mEDпN*Bʉ؏6z)ov SW3vrfEc?цLep2O7o1b/Nsp$^lh|ea&K/_0 H(,:㵹b:$PVk9U}'>ps*8$Ť_kCB%X|ug+Ҝp0[F+A<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata></metadata>
<defs>
<font id="open_sanslight" horiz-adv-x="1169" >
<font-face units-per-em="2048" ascent="1638" descent="-410" />
<missing-glyph horiz-adv-x="532" />
<glyph unicode="&#xfb01;" horiz-adv-x="1077" d="M29 0zM586 1001h-256v-1001h-99v1001h-202v58l202 37v84q0 200 73.5 293.5t240.5 93.5q90 0 180 -27l-23 -86q-80 25 -159 25q-116 0 -164.5 -68.5t-48.5 -222.5v-101h256v-86zM895 0h-99v1087h99v-1087zM782 1389q0 96 63 96q31 0 48.5 -25t17.5 -71q0 -45 -17.5 -71 t-48.5 -26q-63 0 -63 97z" />
<glyph unicode="&#xfb02;" horiz-adv-x="1077" d="M29 0zM586 1001h-256v-1001h-99v1001h-202v58l202 37v84q0 200 73.5 293.5t240.5 93.5q90 0 180 -27l-23 -86q-80 25 -159 25q-116 0 -164.5 -68.5t-48.5 -222.5v-101h256v-86zM895 0h-99v1556h99v-1556z" />
<glyph unicode="&#xfb03;" horiz-adv-x="1692" d="M29 0zM586 1001h-256v-1001h-99v1001h-202v58l202 37v84q0 200 73.5 293.5t240.5 93.5q90 0 180 -27l-23 -86q-80 25 -159 25q-116 0 -164.5 -68.5t-48.5 -222.5v-101h256v-86zM1200 1001h-256v-1001h-99v1001h-202v58l202 37v84q0 200 73.5 293.5t240.5 93.5 q90 0 180 -27l-23 -86q-80 25 -159 25q-116 0 -164.5 -68.5t-48.5 -222.5v-101h256v-86zM1510 0h-99v1087h99v-1087zM1397 1389q0 96 63 96q31 0 48.5 -25t17.5 -71q0 -45 -17.5 -71t-48.5 -26q-63 0 -63 97z" />
<glyph unicode="&#xfb04;" horiz-adv-x="1692" d="M29 0zM586 1001h-256v-1001h-99v1001h-202v58l202 37v84q0 200 73.5 293.5t240.5 93.5q90 0 180 -27l-23 -86q-80 25 -159 25q-116 0 -164.5 -68.5t-48.5 -222.5v-101h256v-86zM1200 1001h-256v-1001h-99v1001h-202v58l202 37v84q0 200 73.5 293.5t240.5 93.5 q90 0 180 -27l-23 -86q-80 25 -159 25q-116 0 -164.5 -68.5t-48.5 -222.5v-101h256v-86zM1510 0h-99v1556h99v-1556z" />
<glyph horiz-adv-x="2048" />
<glyph horiz-adv-x="2048" />
<glyph unicode="&#xd;" horiz-adv-x="1044" />
<glyph unicode=" "  horiz-adv-x="532" />
<glyph unicode="&#x09;" horiz-adv-x="532" />
<glyph unicode="&#xa0;" horiz-adv-x="532" />
<glyph unicode="!" horiz-adv-x="492" d="M276 377h-61l-29 1085h119zM164 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98z" />
<glyph unicode="&#x22;" horiz-adv-x="723" d="M260 1462l-33 -528h-61l-33 528h127zM590 1462l-33 -528h-61l-33 528h127z" />
<glyph unicode="#" horiz-adv-x="1323" d="M967 928l-76 -398h303v-79h-320l-86 -451h-90l88 451h-360l-86 -451h-88l86 451h-283v79h299l76 398h-297v80h311l86 454h91l-89 -454h365l88 454h86l-88 -454h285v-80h-301zM440 530h363l78 398h-363z" />
<glyph unicode="$" d="M991 440q0 -133 -99 -217t-274 -106v-236h-81v232q-92 2 -200.5 22.5t-172.5 50.5v103q75 -36 179.5 -61t193.5 -25v508q-145 44 -215 88t-102 104t-32 146q0 124 94.5 208.5t254.5 104.5v192h81v-190q197 -9 351 -72l-33 -90q-141 62 -318 72v-486q213 -66 293 -144 t80 -204zM881 444q0 85 -63 140.5t-200 95.5v-471q122 13 192.5 75t70.5 160zM297 1049q0 -86 57 -141t183 -93v453q-119 -16 -179.5 -76t-60.5 -143z" />
<glyph unicode="%" horiz-adv-x="1653" d="M211 1026q0 -186 45 -279.5t141 -93.5q193 0 193 373q0 184 -49.5 276.5t-143.5 92.5q-96 0 -141 -92.5t-45 -276.5zM688 1026q0 -226 -75 -343.5t-216 -117.5q-133 0 -208.5 120.5t-75.5 340.5q0 223 72 340t212 117q139 0 215 -120.5t76 -336.5zM1063 438 q0 -185 45 -277.5t141 -92.5q193 0 193 370q0 369 -193 369q-96 0 -141 -91.5t-45 -277.5zM1540 438q0 -226 -74 -343.5t-215 -117.5q-136 0 -211 121.5t-75 339.5q0 225 73.5 341t212.5 116q137 0 213 -120t76 -337zM1280 1462l-811 -1462h-96l811 1462h96z" />
<glyph unicode="&#x26;" horiz-adv-x="1460" d="M123 371q0 138 73.5 235t274.5 205l-75 82q-66 71 -98 139t-32 142q0 143 95.5 227t256.5 84q155 0 245.5 -81t90.5 -224q0 -105 -70 -192.5t-253 -194.5l452 -457q61 72 104 157t75 201h96q-63 -246 -209 -426l266 -268h-135l-193 197q-92 -90 -164 -131.5t-157.5 -63.5 t-194.5 -22q-209 0 -328.5 103t-119.5 288zM578 70q128 0 234.5 43.5t209.5 146.5l-483 485q-136 -72 -196.5 -122.5t-88 -109.5t-27.5 -138q0 -143 93 -224t258 -81zM373 1176q0 -79 40 -146t152 -174q159 85 221 159t62 169q0 94 -62 152.5t-168 58.5q-114 0 -179.5 -58 t-65.5 -161z" />
<glyph unicode="'" horiz-adv-x="393" d="M260 1462l-33 -528h-61l-33 528h127z" />
<glyph unicode="(" horiz-adv-x="557" d="M82 561q0 265 77.5 496t223.5 405h113q-148 -182 -227 -412.5t-79 -486.5q0 -483 304 -887h-111q-147 170 -224 397t-77 488z" />
<glyph unicode=")" horiz-adv-x="557" d="M475 561q0 -263 -77.5 -490t-223.5 -395h-111q304 404 304 887q0 257 -79 487.5t-227 411.5h113q147 -175 224 -406.5t77 -494.5z" />
<glyph unicode="*" horiz-adv-x="1128" d="M631 1556l-37 -405l405 104l21 -131l-395 -39l247 -340l-124 -71l-191 379l-180 -379l-125 71l242 340l-390 39l19 131l401 -104l-39 405h146z" />
<glyph unicode="+" d="M625 764h434v-82h-434v-432h-82v432h-432v82h432v434h82v-434z" />
<glyph unicode="," horiz-adv-x="440" d="M295 238l12 -21q-75 -265 -174 -481h-65q77 275 110 502h117z" />
<glyph unicode="-" horiz-adv-x="659" d="M92 512v82h475v-82h-475z" />
<glyph unicode="." horiz-adv-x="487" d="M162 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98z" />
<glyph unicode="/" horiz-adv-x="698" d="M674 1462l-545 -1462h-104l544 1462h105z" />
<glyph unicode="0" d="M1055 735q0 -385 -117.5 -570t-355.5 -185q-229 0 -348 190.5t-119 564.5q0 382 115.5 566t351.5 184q231 0 352 -190.5t121 -559.5zM223 735q0 -340 89 -502.5t270 -162.5q189 0 275.5 168t86.5 497q0 324 -86.5 492t-275.5 168t-274 -168t-85 -492z" />
<glyph unicode="1" d="M682 0h-98v1065q0 145 12 301q-15 -15 -31 -29t-309 -243l-57 71l397 297h86v-1462z" />
<glyph unicode="2" d="M1028 0h-915v88l389 406q164 170 230 260t97 172t31 172q0 131 -86 213t-223 82q-183 0 -350 -133l-54 69q183 154 406 154q191 0 300.5 -102t109.5 -281q0 -145 -73.5 -280.5t-268.5 -334.5l-375 -385v-4h782v-96z" />
<glyph unicode="3" d="M979 1118q0 -136 -85.5 -229t-229.5 -119v-6q176 -22 268 -112t92 -242q0 -205 -139.5 -317.5t-401.5 -112.5q-223 0 -389 83v99q84 -44 188.5 -69t196.5 -25q221 0 332 89.5t111 252.5q0 145 -113.5 223t-333.5 78h-158v96h160q182 0 288.5 86.5t106.5 234.5 q0 122 -86.5 195.5t-226.5 73.5q-109 0 -199 -30.5t-202 -104.5l-49 67q85 71 205 112.5t243 41.5q202 0 312 -95.5t110 -269.5z" />
<glyph unicode="4" d="M1141 373h-252v-373h-94v373h-752v67l725 1030h121v-1011h252v-86zM795 459v418q0 302 14 507h-8q-20 -37 -123 -188l-516 -737h633z" />
<glyph unicode="5" d="M537 879q234 0 368.5 -113t134.5 -311q0 -225 -140 -350t-386 -125q-109 0 -207 21.5t-164 61.5v103q108 -55 192 -76.5t179 -21.5q192 0 308 101.5t116 274.5q0 163 -113 256t-307 93q-130 0 -272 -39l-60 39l58 669h704v-96h-610l-45 -516q156 29 244 29z" />
<glyph unicode="6" d="M131 623q0 285 77.5 479.5t220 288.5t343.5 94q94 0 172 -23v-88q-73 27 -176 27q-247 0 -384.5 -178t-154.5 -518h13q76 98 174 148t207 50q205 0 320.5 -117t115.5 -323q0 -224 -121.5 -353.5t-327.5 -129.5q-222 0 -350.5 169.5t-128.5 473.5zM610 68q164 0 255 103 t91 294q0 168 -90 262t-245 94q-102 0 -189.5 -45t-139.5 -119.5t-52 -152.5q0 -111 49.5 -213.5t134 -162.5t186.5 -60z" />
<glyph unicode="7" d="M334 0l602 1366h-827v96h946v-73l-604 -1389h-117z" />
<glyph unicode="8" d="M582 1487q186 0 299.5 -95t113.5 -257q0 -112 -70.5 -198t-228.5 -159q192 -79 270 -173t78 -228q0 -181 -126.5 -289t-339.5 -108q-221 0 -339 101t-118 294q0 131 83 230t257 169q-161 76 -227 160.5t-66 202.5q0 105 53 184.5t148.5 122.5t212.5 43zM223 360 q0 -138 93.5 -214t261.5 -76q164 0 264 80.5t100 218.5q0 124 -78.5 201.5t-302.5 162.5q-184 -71 -261 -157t-77 -216zM580 1397q-141 0 -226.5 -69.5t-85.5 -190.5q0 -70 31.5 -123.5t91 -97t199.5 -101.5q163 63 234 139t71 183q0 120 -84.5 190t-230.5 70z" />
<glyph unicode="9" d="M1036 842q0 -288 -75.5 -482t-220 -287t-349.5 -93q-104 0 -192 26v86q43 -14 103.5 -21.5t92.5 -7.5q247 0 387 178.5t156 520.5h-12q-73 -96 -174 -147.5t-211 -51.5q-203 0 -316.5 112t-113.5 318q0 220 124.5 356t323.5 136q144 0 252 -75.5t166.5 -221.5t58.5 -346z M559 1397q-158 0 -252 -106.5t-94 -291.5q0 -174 87 -264t249 -90q101 0 188.5 45t139 119.5t51.5 151.5q0 117 -46.5 219t-130 159.5t-192.5 57.5z" />
<glyph unicode=":" horiz-adv-x="487" d="M162 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98zM162 971q0 98 80 98q82 0 82 -98q0 -53 -23.5 -76t-58.5 -23q-34 0 -57 23t-23 76z" />
<glyph unicode=";" horiz-adv-x="487" d="M303 238l12 -21q-75 -265 -174 -481h-65q29 97 62 245.5t48 256.5h117zM162 971q0 98 80 98q82 0 82 -98q0 -53 -23.5 -76t-58.5 -23q-34 0 -57 23t-23 76z" />
<glyph unicode="&#x3c;" d="M1059 266l-948 416v61l948 474v-95l-823 -405l823 -355v-96z" />
<glyph unicode="=" d="M111 885v82h948v-82h-948zM111 477v82h948v-82h-948z" />
<glyph unicode="&#x3e;" d="M111 362l823 355l-823 405v95l948 -474v-61l-948 -416v96z" />
<glyph unicode="?" horiz-adv-x="862" d="M293 377v37q0 123 37.5 201t138.5 167l91 79q72 61 103 121t31 138q0 127 -83.5 202t-219.5 75q-79 0 -148 -17.5t-149 -56.5l-37 80q110 48 184.5 64t153.5 16q183 0 288 -98.5t105 -270.5q0 -68 -18 -119t-50.5 -94.5t-78.5 -84t-102 -87.5q-64 -54 -98.5 -98.5 t-50 -93.5t-15.5 -146v-14h-82zM260 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98z" />
<glyph unicode="@" horiz-adv-x="1815" d="M1702 725q0 -228 -90.5 -366t-245.5 -138q-89 0 -144.5 54t-64.5 147h-4q-43 -100 -124 -150.5t-189 -50.5q-148 0 -229 96.5t-81 270.5q0 202 120.5 330.5t314.5 128.5q138 0 286 -41l-22 -464v-30q0 -104 35 -156.5t116 -52.5q103 0 168.5 116.5t65.5 303.5 q0 194 -79 340t-225.5 224.5t-334.5 78.5q-230 0 -405.5 -99.5t-270 -281.5t-94.5 -418q0 -322 167 -497.5t474 -175.5q93 0 188.5 18t231.5 70v-99q-203 -80 -414 -80q-349 0 -544 200.5t-195 557.5q0 256 108.5 460.5t307 317.5t448.5 113q215 0 380.5 -89t255 -254.5 t89.5 -383.5zM633 590q0 -143 55 -215t174 -72q255 0 273 346l16 291q-79 27 -193 27q-149 0 -237 -102.5t-88 -274.5z" />
<glyph unicode="A" horiz-adv-x="1229" d="M911 516h-594l-204 -516h-113l588 1468h65l576 -1468h-115zM354 608h523l-199 527q-25 62 -60 172q-27 -96 -59 -174z" />
<glyph unicode="B" horiz-adv-x="1284" d="M207 1462h401q271 0 398 -92t127 -278q0 -127 -77.5 -211.5t-226.5 -108.5v-6q175 -26 257.5 -110.5t82.5 -235.5q0 -202 -134 -311t-380 -109h-448v1462zM309 811h322q206 0 299.5 68.5t93.5 214.5t-105.5 212t-314.5 66h-295v-561zM309 721v-631h344q406 0 406 330 q0 301 -428 301h-322z" />
<glyph unicode="C" horiz-adv-x="1272" d="M831 1391q-275 0 -433 -176t-158 -482q0 -313 149 -486t426 -173q184 0 338 47v-90q-145 -51 -362 -51q-308 0 -485 199t-177 556q0 223 84.5 393t243 262.5t368.5 92.5q214 0 383 -80l-41 -92q-160 80 -336 80z" />
<glyph unicode="D" horiz-adv-x="1446" d="M1317 745q0 -368 -193 -556.5t-567 -188.5h-350v1462h395q350 0 532.5 -183t182.5 -534zM1206 741q0 314 -159.5 472.5t-468.5 158.5h-269v-1282h242q655 0 655 651z" />
<glyph unicode="E" horiz-adv-x="1130" d="M1006 0h-799v1462h799v-94h-697v-553h658v-94h-658v-627h697v-94z" />
<glyph unicode="F" horiz-adv-x="1028" d="M309 0h-102v1462h801v-94h-699v-620h660v-95h-660v-653z" />
<glyph unicode="G" horiz-adv-x="1481" d="M782 737h539v-667q-212 -90 -477 -90q-346 0 -530.5 195.5t-184.5 553.5q0 223 91.5 395.5t262 266.5t391.5 94q239 0 429 -88l-41 -92q-190 88 -394 88q-289 0 -458.5 -178.5t-169.5 -481.5q0 -330 161 -496.5t473 -166.5q202 0 343 57v514h-435v96z" />
<glyph unicode="H" horiz-adv-x="1473" d="M1266 0h-103v719h-854v-719h-102v1462h102v-649h854v649h103v-1462z" />
<glyph unicode="I" horiz-adv-x="516" d="M207 0v1462h102v-1462h-102z" />
<glyph unicode="J" horiz-adv-x="506" d="M-33 -369q-92 0 -151 27v88q78 -20 149 -20q242 0 242 264v1472h102v-1462q0 -369 -342 -369z" />
<glyph unicode="K" horiz-adv-x="1190" d="M1190 0h-125l-561 772l-195 -172v-600h-102v1462h102v-760l162 162l573 598h130l-599 -618z" />
<glyph unicode="L" horiz-adv-x="1051" d="M207 0v1462h102v-1366h697v-96h-799z" />
<glyph unicode="M" horiz-adv-x="1767" d="M850 0l-545 1350h-8q8 -124 8 -254v-1096h-98v1462h158l518 -1286h6l518 1286h154v-1462h-103v1108q0 116 12 240h-8l-547 -1348h-65z" />
<glyph unicode="N" horiz-adv-x="1477" d="M1270 0h-103l-866 1298h-8q12 -232 12 -350v-948h-98v1462h102l865 -1296h6q-9 180 -9 342v954h99v-1462z" />
<glyph unicode="O" horiz-adv-x="1565" d="M1436 733q0 -348 -174 -550.5t-480 -202.5q-305 0 -479 202.5t-174 552.5q0 349 175.5 549.5t479.5 200.5q306 0 479 -201.5t173 -550.5zM240 733q0 -314 140 -485.5t402 -171.5q264 0 403.5 170t139.5 487q0 316 -139.5 484.5t-401.5 168.5q-261 0 -402.5 -170 t-141.5 -483z" />
<glyph unicode="P" horiz-adv-x="1198" d="M1087 1042q0 -212 -144 -325t-408 -113h-226v-604h-102v1462h358q522 0 522 -420zM309 692h201q247 0 357 81.5t110 264.5q0 169 -104 250.5t-322 81.5h-242v-678z" />
<glyph unicode="Q" horiz-adv-x="1565" d="M1436 733q0 -294 -126 -486.5t-349 -246.5l333 -348h-166l-282 330l-33 -2h-31q-305 0 -479 202.5t-174 552.5q0 349 175.5 549.5t479.5 200.5q306 0 479 -201.5t173 -550.5zM240 733q0 -314 140 -485.5t402 -171.5q264 0 403.5 170t139.5 487q0 316 -139.5 484.5 t-401.5 168.5q-261 0 -402.5 -170t-141.5 -483z" />
<glyph unicode="R" horiz-adv-x="1217" d="M309 637v-637h-102v1462h348q272 0 402 -100.5t130 -302.5q0 -147 -77.5 -248t-235.5 -145l397 -666h-122l-377 637h-363zM309 725h279q185 0 287 82.5t102 243.5q0 167 -100 243t-326 76h-242v-645z" />
<glyph unicode="S" horiz-adv-x="1116" d="M1014 377q0 -183 -134.5 -290t-357.5 -107q-268 0 -411 59v102q158 -67 403 -67q180 0 285.5 82.5t105.5 216.5q0 83 -35 137.5t-114 99.5t-232 97q-224 77 -309.5 166.5t-85.5 238.5q0 164 128.5 267.5t330.5 103.5q206 0 387 -78l-37 -88q-182 76 -348 76 q-162 0 -258 -75t-96 -204q0 -81 29.5 -133t96.5 -93.5t230 -99.5q171 -59 257 -114.5t125.5 -126t39.5 -170.5z" />
<glyph unicode="T" horiz-adv-x="1073" d="M588 0h-103v1366h-475v96h1053v-96h-475v-1366z" />
<glyph unicode="U" horiz-adv-x="1473" d="M1282 1462v-946q0 -252 -146 -394t-407 -142q-254 0 -396.5 142.5t-142.5 397.5v942h103v-946q0 -211 117 -328.5t331 -117.5q209 0 324 115.5t115 320.5v956h102z" />
<glyph unicode="V" horiz-adv-x="1182" d="M1071 1462h111l-547 -1462h-90l-545 1462h109l368 -995q84 -225 113 -338q20 75 79 233z" />
<glyph unicode="W" horiz-adv-x="1827" d="M1372 0h-84l-321 1128q-40 139 -60 228q-16 -87 -45.5 -200t-322.5 -1156h-86l-402 1462h107l256 -942q15 -57 28 -105.5t23.5 -91t19 -82t15.5 -79.5q24 136 102 413l250 887h113l293 -1018q51 -176 73 -284q13 72 33.5 153t308.5 1149h103z" />
<glyph unicode="X" horiz-adv-x="1102" d="M1102 0h-117l-432 682l-440 -682h-113l492 762l-447 700h115l395 -626l401 626h109l-453 -698z" />
<glyph unicode="Y" horiz-adv-x="1081" d="M543 662l428 800h110l-487 -897v-565h-105v557l-489 905h117z" />
<glyph unicode="Z" horiz-adv-x="1180" d="M1098 0h-1016v76l856 1290h-817v96h954v-76l-858 -1290h881v-96z" />
<glyph unicode="[" horiz-adv-x="653" d="M602 -324h-428v1786h428v-94h-330v-1597h330v-95z" />
<glyph unicode="\" horiz-adv-x="698" d="M127 1462l547 -1462h-103l-546 1462h102z" />
<glyph unicode="]" horiz-adv-x="653" d="M51 -229h330v1597h-330v94h428v-1786h-428v95z" />
<glyph unicode="^" d="M88 561l465 912h68l460 -912h-100l-395 791l-398 -791h-100z" />
<glyph unicode="_" horiz-adv-x="842" d="M846 -266h-850v82h850v-82z" />
<glyph unicode="`" horiz-adv-x="1182" d="M776 1241h-69q-96 79 -188.5 171.5t-125.5 139.5v17h142q26 -48 98.5 -142t142.5 -170v-16z" />
<glyph unicode="a" horiz-adv-x="1085" d="M842 0l-25 172h-8q-82 -105 -168.5 -148.5t-204.5 -43.5q-160 0 -249 82t-89 227q0 159 132.5 247t383.5 93l207 6v72q0 155 -63 234t-203 79q-151 0 -313 -84l-37 86q179 84 354 84q179 0 267.5 -93t88.5 -290v-723h-73zM442 70q174 0 274.5 99.5t100.5 276.5v107 l-190 -8q-229 -11 -326.5 -71.5t-97.5 -188.5q0 -102 62.5 -158.5t176.5 -56.5z" />
<glyph unicode="b" horiz-adv-x="1219" d="M641 1108q228 0 343.5 -143.5t115.5 -419.5q0 -271 -121.5 -418t-341.5 -147q-116 0 -209 48t-147 136h-9l-28 -164h-62v1556h99v-391q0 -88 -4 -162l-3 -85h7q62 98 149.5 144t210.5 46zM639 1018q-192 0 -275 -110t-83 -363v-17q0 -246 86.5 -353t269.5 -107 q178 0 268 124.5t90 354.5q0 471 -356 471z" />
<glyph unicode="c" horiz-adv-x="973" d="M616 -20q-233 0 -365 147t-132 410q0 270 137 420.5t375 150.5q141 0 270 -49l-27 -88q-141 47 -245 47q-200 0 -303 -123.5t-103 -355.5q0 -220 103 -344.5t288 -124.5q148 0 275 53v-92q-104 -51 -273 -51z" />
<glyph unicode="d" horiz-adv-x="1219" d="M580 1108q118 0 204 -43t154 -147h6q-6 126 -6 247v391h98v-1556h-65l-25 166h-8q-124 -186 -356 -186q-225 0 -344 140t-119 408q0 282 118 431t343 149zM580 1018q-178 0 -267.5 -125t-89.5 -363q0 -462 359 -462q184 0 270 107t86 353v17q0 252 -84.5 362.5 t-273.5 110.5z" />
<glyph unicode="e" horiz-adv-x="1124" d="M621 -20q-237 0 -369.5 146t-132.5 409q0 260 128 416.5t345 156.5q192 0 303 -134t111 -364v-80h-783q2 -224 104.5 -342t293.5 -118q93 0 163.5 13t178.5 56v-90q-92 -40 -170 -54.5t-172 -14.5zM592 1020q-157 0 -252 -103.5t-111 -298.5h672q0 189 -82 295.5 t-227 106.5z" />
<glyph unicode="f" horiz-adv-x="614" d="M586 1001h-256v-1001h-99v1001h-202v58l202 37v84q0 200 73.5 293.5t240.5 93.5q90 0 180 -27l-23 -86q-80 25 -159 25q-116 0 -164.5 -68.5t-48.5 -222.5v-101h256v-86z" />
<glyph unicode="g" horiz-adv-x="1071" d="M1030 1087v-69l-225 -14q90 -112 90 -246q0 -157 -104.5 -254.5t-280.5 -97.5q-74 0 -104 6q-59 -31 -90 -73t-31 -89q0 -52 39.5 -76t132.5 -24h190q177 0 271 -71.5t94 -211.5q0 -172 -139.5 -265.5t-397.5 -93.5q-205 0 -317.5 79t-112.5 220q0 112 69.5 186 t188.5 101q-49 21 -78.5 59.5t-29.5 88.5q0 109 139 192q-95 39 -148 122.5t-53 191.5q0 163 103.5 261.5t279.5 98.5q107 0 166 -21h348zM150 -184q0 -224 333 -224q428 0 428 273q0 98 -67 142t-217 44h-178q-299 0 -299 -235zM233 748q0 -126 76.5 -195.5t204.5 -69.5 q136 0 208.5 69t72.5 200q0 139 -74.5 208.5t-208.5 69.5q-130 0 -204.5 -74.5t-74.5 -207.5z" />
<glyph unicode="h" horiz-adv-x="1208" d="M940 0v705q0 164 -69 238.5t-214 74.5q-195 0 -285.5 -98.5t-90.5 -319.5v-600h-99v1556h99v-495l-5 -139h7q61 98 154 142t231 44q370 0 370 -397v-711h-98z" />
<glyph unicode="i" horiz-adv-x="463" d="M281 0h-99v1087h99v-1087zM168 1389q0 96 63 96q31 0 48.5 -25t17.5 -71q0 -45 -17.5 -71t-48.5 -26q-63 0 -63 97z" />
<glyph unicode="j" horiz-adv-x="463" d="M37 -492q-80 0 -135 25v86q69 -20 129 -20q151 0 151 176v1312h99v-1298q0 -135 -63.5 -208t-180.5 -73zM168 1389q0 96 63 96q31 0 48.5 -25t17.5 -71q0 -45 -17.5 -71t-48.5 -26q-63 0 -63 97z" />
<glyph unicode="k" horiz-adv-x="991" d="M279 477l555 610h120l-428 -464l465 -623h-119l-413 549l-178 -162v-387h-99v1556h99v-780l-7 -299h5z" />
<glyph unicode="l" horiz-adv-x="463" d="M281 0h-99v1556h99v-1556z" />
<glyph unicode="m" horiz-adv-x="1808" d="M1540 0v713q0 159 -62 232t-190 73q-167 0 -247 -92t-80 -289v-637h-101v743q0 275 -252 275q-171 0 -249 -99.5t-78 -318.5v-600h-99v1087h82l21 -149h6q45 81 128 125.5t183 44.5q257 0 330 -193h4q53 93 142.5 143t203.5 50q178 0 267 -95t89 -302v-711h-98z" />
<glyph unicode="n" horiz-adv-x="1208" d="M940 0v705q0 164 -69 238.5t-214 74.5q-195 0 -285.5 -98.5t-90.5 -319.5v-600h-99v1087h84l19 -149h6q106 170 377 170q370 0 370 -397v-711h-98z" />
<glyph unicode="o" horiz-adv-x="1200" d="M1081 545q0 -266 -129 -415.5t-356 -149.5q-143 0 -252 69t-167 198t-58 298q0 266 129 414.5t354 148.5q224 0 351.5 -150.5t127.5 -412.5zM223 545q0 -224 98.5 -349.5t278.5 -125.5t278.5 125.5t98.5 349.5q0 225 -99.5 349t-279.5 124t-277.5 -123.5t-97.5 -349.5z " />
<glyph unicode="p" horiz-adv-x="1219" d="M647 -20q-251 0 -366 188h-7l3 -84q4 -74 4 -162v-414h-99v1579h84l19 -155h6q112 176 358 176q220 0 335.5 -144.5t115.5 -420.5q0 -268 -121.5 -415.5t-331.5 -147.5zM645 68q167 0 258.5 124t91.5 347q0 479 -346 479q-190 0 -279 -104.5t-89 -340.5v-32 q0 -255 85.5 -364t278.5 -109z" />
<glyph unicode="q" horiz-adv-x="1219" d="M569 -20q-214 0 -332 142t-118 410q0 275 118 425.5t338 150.5q236 0 353 -174h6l18 153h84v-1579h-98v414q0 122 6 248h-6q-118 -190 -369 -190zM571 68q198 0 282.5 109t84.5 366v12q0 245 -85 354t-271 109q-176 0 -267.5 -124t-91.5 -364q0 -229 89.5 -345.5 t258.5 -116.5z" />
<glyph unicode="r" horiz-adv-x="797" d="M610 1108q69 0 148 -14l-19 -95q-68 17 -141 17q-139 0 -228 -118t-89 -298v-600h-99v1087h84l10 -196h7q67 120 143 168.5t184 48.5z" />
<glyph unicode="s" horiz-adv-x="954" d="M856 283q0 -146 -111 -224.5t-315 -78.5q-218 0 -346 67v107q164 -82 346 -82q161 0 244.5 53.5t83.5 142.5q0 82 -66.5 138t-218.5 110q-163 59 -229 101.5t-99.5 96t-33.5 130.5q0 122 102.5 193t286.5 71q176 0 334 -66l-37 -90q-160 66 -297 66q-133 0 -211 -44 t-78 -122q0 -85 60.5 -136t236.5 -114q147 -53 214 -95.5t100.5 -96.5t33.5 -127z" />
<glyph unicode="t" horiz-adv-x="686" d="M469 68q94 0 164 16v-80q-72 -24 -166 -24q-144 0 -212.5 77t-68.5 242v702h-161v58l161 45l50 246h51v-263h319v-86h-319v-688q0 -125 44 -185t138 -60z" />
<glyph unicode="u" horiz-adv-x="1208" d="M268 1087v-704q0 -164 69 -238.5t214 -74.5q194 0 285.5 98t91.5 319v600h98v-1087h-84l-18 150h-6q-106 -170 -377 -170q-371 0 -371 397v710h98z" />
<glyph unicode="v" horiz-adv-x="940" d="M420 0l-420 1087h102l281 -739q56 -142 84 -248h6q41 136 84 250l281 737h102l-420 -1087h-100z" />
<glyph unicode="w" horiz-adv-x="1481" d="M1051 0l-238 727q-23 74 -59 217h-6l-21 -74l-45 -145l-242 -725h-98l-311 1087h106l174 -630q61 -234 80 -344h6q59 234 86 311l224 663h90l213 -661q72 -235 88 -311h6q8 65 80 348l166 624h100l-295 -1087h-104z" />
<glyph unicode="x" horiz-adv-x="1020" d="M449 559l-379 528h114l324 -458l321 458h109l-373 -528l400 -559h-115l-342 485l-344 -485h-109z" />
<glyph unicode="y" horiz-adv-x="940" d="M0 1087h102l230 -610q105 -281 133 -379h6q42 129 137 385l230 604h102l-487 -1263q-59 -154 -99 -208t-93.5 -81t-129.5 -27q-57 0 -127 21v86q58 -16 125 -16q51 0 90 24t70.5 74.5t73 160t53.5 142.5z" />
<glyph unicode="z" horiz-adv-x="944" d="M858 0h-776v63l645 936h-598v88h727v-63l-649 -936h651v-88z" />
<glyph unicode="{" horiz-adv-x="723" d="M389 -27q0 -102 59.5 -152.5t202.5 -53.5v-91q-195 0 -277.5 75t-82.5 231v337q0 205 -230 209v80q122 2 176 51t54 148v350q0 299 360 305v-90q-138 -5 -200 -58t-62 -157v-305q0 -130 -44 -194t-142 -85v-8q97 -20 141.5 -83.5t44.5 -186.5v-322z" />
<glyph unicode="|" horiz-adv-x="1108" d="M508 1561h92v-2067h-92v2067z" />
<glyph unicode="}" horiz-adv-x="723" d="M334 295q0 123 44.5 186.5t141.5 83.5v8q-97 20 -141.5 84t-44.5 195v305q0 103 -61.5 156.5t-200.5 58.5v90q174 0 267 -77.5t93 -227.5v-350q0 -100 54.5 -148.5t175.5 -50.5v-80q-230 -4 -230 -209v-337q0 -155 -82.5 -230.5t-277.5 -75.5v91q141 2 201.5 52.5 t60.5 153.5v322z" />
<glyph unicode="~" d="M334 745q-49 0 -108 -30.5t-115 -89.5v94q108 110 233 110q61 0 115 -13.5t155 -57.5q126 -58 220 -58q56 0 109.5 30.5t115.5 94.5v-96q-48 -49 -104.5 -81t-129.5 -32q-116 0 -270 72q-124 57 -221 57z" />
<glyph unicode="&#xa1;" horiz-adv-x="492" d="M215 711h61l29 -1086h-119zM166 1010q0 98 80 98q82 0 82 -98q0 -53 -23.5 -76t-58.5 -23q-34 0 -57 23t-23 76z" />
<glyph unicode="&#xa2;" d="M602 190q-186 30 -288.5 175t-102.5 380q0 232 102.5 381.5t288.5 182.5v174h82v-166h14q131 0 275 -55l-31 -84q-134 51 -237 51q-187 0 -288.5 -122.5t-101.5 -358.5q0 -225 100.5 -349.5t280.5 -124.5q131 0 267 58v-92q-110 -56 -267 -56h-12v-204h-82v210z" />
<glyph unicode="&#xa3;" d="M412 676v-256q0 -116 -35 -196t-113 -128h809v-96h-995v84q110 21 171.5 110t61.5 224v258h-211v82h211v297q0 204 98 315t281 111q175 0 330 -68l-35 -86q-157 66 -295 66q-141 0 -209.5 -81t-68.5 -253v-301h411v-82h-411z" />
<glyph unicode="&#xa4;" d="M991 723q0 -151 -90 -256l139 -141l-59 -60l-137 142q-110 -93 -260 -93q-153 0 -260 93l-138 -142l-59 60l139 141q-90 106 -90 256q0 147 90 258l-139 141l59 60l138 -142q103 93 260 93q155 0 260 -93l137 142l59 -60l-139 -141q90 -111 90 -258zM584 395 q134 0 228.5 95.5t94.5 232.5q0 136 -95 233t-228 97q-134 0 -229 -97t-95 -233t94.5 -232t229.5 -96z" />
<glyph unicode="&#xa5;" d="M586 666l428 796h110l-432 -788h283v-82h-338v-205h338v-82h-338v-305h-105v305h-337v82h337v205h-337v82h278l-430 788h117z" />
<glyph unicode="&#xa6;" horiz-adv-x="1108" d="M508 1561h92v-764h-92v764zM508 258h92v-764h-92v764z" />
<glyph unicode="&#xa7;" horiz-adv-x="1057" d="M145 813q0 83 50.5 152.5t138.5 107.5q-86 47 -125 102t-39 136q0 117 101.5 183.5t275.5 66.5q175 0 336 -64l-35 -80q-91 34 -158.5 47t-144.5 13q-134 0 -205.5 -44.5t-71.5 -119.5q0 -54 25.5 -88.5t85.5 -65.5t188 -74q192 -64 264 -132.5t72 -170.5 q0 -173 -186 -274q86 -42 129 -96t43 -136q0 -135 -113 -207.5t-311 -72.5q-92 0 -171 15t-165 52v95q182 -78 332 -78q162 0 247 49.5t85 140.5q0 55 -25 87.5t-88.5 65.5t-190.5 79q-200 73 -272 141.5t-72 169.5zM246 825q0 -65 31.5 -104t105.5 -75t250 -99 q82 41 126 98t44 121q0 62 -32 102t-108.5 77t-236.5 87q-81 -23 -130.5 -79t-49.5 -128z" />
<glyph unicode="&#xa8;" horiz-adv-x="1182" d="M336 1389q0 46 15.5 66t47.5 20q64 0 64 -86t-64 -86q-63 0 -63 86zM717 1389q0 46 15.5 66t47.5 20q64 0 64 -86t-64 -86q-63 0 -63 86z" />
<glyph unicode="&#xa9;" horiz-adv-x="1704" d="M897 1092q-142 0 -222.5 -94.5t-80.5 -264.5q0 -186 74.5 -275t220.5 -89q84 0 198 43v-88q-102 -45 -208 -45q-187 0 -288.5 115t-101.5 331q0 208 111 332.5t297 124.5q119 0 227 -52l-37 -83q-98 45 -190 45zM100 731q0 200 100 375t275 276t377 101q200 0 375 -100 t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM193 731q0 -178 88.5 -329.5t240.5 -240.5t330 -89t329.5 88.5t240.5 240.5t89 330q0 174 -85.5 325t-239 243t-334.5 92q-176 0 -328.5 -88.5t-241.5 -242.5t-89 -329z " />
<glyph unicode="&#xaa;" horiz-adv-x="686" d="M512 813l-25 72q-84 -84 -202 -84q-95 0 -151 49t-56 139q0 100 80 151.5t241 59.5l95 4v43q0 77 -38 114.5t-106 37.5q-87 0 -196 -49l-33 73q117 56 231 56q228 0 228 -215v-451h-68zM168 993q0 -54 35 -85t96 -31q90 0 142.5 50t52.5 142v64l-88 -5 q-116 -6 -177 -36.5t-61 -98.5z" />
<glyph unicode="&#xab;" horiz-adv-x="885" d="M82 543l309 393l62 -43l-254 -363l254 -362l-62 -43l-309 391v27zM442 543l310 393l61 -43l-254 -363l254 -362l-61 -43l-310 391v27z" />
<glyph unicode="&#xac;" d="M1038 764v-494h-82v412h-845v82h927z" />
<glyph unicode="&#xad;" horiz-adv-x="659" d="M92 512zM92 512v82h475v-82h-475z" />
<glyph unicode="&#xae;" horiz-adv-x="1704" d="M709 731h112q91 0 143 46.5t52 135.5q0 172 -197 172h-110v-354zM1120 918q0 -79 -38.5 -139.5t-110.5 -94.5l237 -393h-121l-210 360h-168v-360h-101v880h211q143 0 222 -62t79 -191zM100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377 q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM193 731q0 -178 88.5 -329.5t240.5 -240.5t330 -89t329.5 88.5t240.5 240.5t89 330q0 174 -85.5 325t-239 243t-334.5 92q-176 0 -328.5 -88.5t-241.5 -242.5t-89 -329z" />
<glyph unicode="&#xaf;" horiz-adv-x="1024" d="M1030 1556h-1036v82h1036v-82z" />
<glyph unicode="&#xb0;" horiz-adv-x="877" d="M139 1184q0 132 86.5 215.5t212.5 83.5t212.5 -83.5t86.5 -215.5t-86.5 -215.5t-212.5 -83.5q-130 0 -214.5 83t-84.5 216zM229 1184q0 -91 61 -154t148 -63q86 0 147.5 62t61.5 155q0 92 -60 154.5t-149 62.5q-90 0 -149.5 -64t-59.5 -153z" />
<glyph unicode="&#xb1;" d="M111 1zM111 1v82h948v-82h-948zM625 764h434v-82h-434v-432h-82v432h-432v82h432v434h82v-434z" />
<glyph unicode="&#xb2;" horiz-adv-x="688" d="M629 586h-576v78l242 237q125 121 172 193t47 149q0 71 -46.5 112.5t-123.5 41.5q-108 0 -217 -82l-49 65q119 103 270 103q124 0 194 -63.5t70 -174.5q0 -47 -13 -89t-40 -85.5t-68.5 -90t-308.5 -306.5h447v-88z" />
<glyph unicode="&#xb3;" horiz-adv-x="688" d="M616 1260q0 -78 -44 -131.5t-117 -75.5q186 -45 186 -211q0 -130 -88.5 -201.5t-247.5 -71.5q-144 0 -264 60v88q136 -62 266 -62q115 0 174.5 49t59.5 136q0 83 -59.5 122t-178.5 39h-131v84h135q105 0 158 43.5t53 120.5q0 67 -47 107.5t-127 40.5q-128 0 -246 -78 l-47 70q130 94 293 94q127 0 199.5 -60t72.5 -163z" />
<glyph unicode="&#xb4;" horiz-adv-x="1182" d="M393 1257q73 79 144.5 171.5t97.5 140.5h141v-17q-36 -52 -122.5 -138t-190.5 -173h-70v16z" />
<glyph unicode="&#xb5;" horiz-adv-x="1221" d="M281 1087v-704q0 -164 69 -238.5t213 -74.5q194 0 285.5 98t91.5 319v600h98v-1087h-84l-18 150h-6q-50 -77 -150 -123.5t-217 -46.5q-99 0 -167.5 27.5t-119.5 84.5q5 -92 5 -170v-414h-99v1579h99z" />
<glyph unicode="&#xb6;" horiz-adv-x="1341" d="M1106 -260h-100v1722h-228v-1722h-100v819q-64 -18 -146 -18q-216 0 -317.5 125t-101.5 376q0 260 109 387t341 127h543v-1816z" />
<glyph unicode="&#xb7;" horiz-adv-x="487" d="M162 623zM162 721q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98z" />
<glyph unicode="&#xb8;" horiz-adv-x="420" d="M393 -291q0 -100 -67.5 -150.5t-188.5 -50.5q-68 0 -94 11v88q30 -10 92 -10q78 0 119 28t41 80q0 94 -193 121l93 174h96l-66 -117q168 -37 168 -174z" />
<glyph unicode="&#xb9;" horiz-adv-x="688" d="M350 1462h92v-876h-98v547q0 99 12 233q-26 -23 -233 -145l-47 77z" />
<glyph unicode="&#xba;" horiz-adv-x="739" d="M670 1141q0 -161 -80 -250.5t-223 -89.5t-220 86t-77 254q0 162 78 250t223 88q142 0 220.5 -87t78.5 -251zM160 1141q0 -264 209 -264t209 264q0 131 -50 194.5t-159 63.5t-159 -63.5t-50 -194.5z" />
<glyph unicode="&#xbb;" horiz-adv-x="885" d="M803 518l-309 -393l-62 43l254 362l-254 363l62 43l309 -391v-27zM442 518l-309 -393l-61 43l254 362l-254 363l61 43l309 -391v-27z" />
<glyph unicode="&#xbc;" horiz-adv-x="1516" d="M59 0zM333 1462h92v-876h-98v547q0 99 12 233q-26 -23 -233 -145l-47 77zM1148 1462l-811 -1462h-94l811 1462h94zM1392 242h-129v-241h-90v241h-413v60l407 581h96v-563h129v-78zM1173 320v221q0 132 8 232q-6 -12 -21.5 -35.5t-295.5 -417.5h309z" />
<glyph unicode="&#xbd;" horiz-adv-x="1516" d="M11 0zM285 1462h92v-876h-98v547q0 99 12 233q-26 -23 -233 -145l-47 77zM1073 1462l-811 -1462h-94l811 1462h94zM1403 1h-576v78l242 237q125 121 172 193t47 149q0 71 -46.5 112.5t-123.5 41.5q-108 0 -217 -82l-49 65q119 103 270 103q124 0 194 -63.5t70 -174.5 q0 -47 -13 -89t-40 -85.5t-68.5 -90t-308.5 -306.5h447v-88z" />
<glyph unicode="&#xbe;" horiz-adv-x="1516" d="M41 0zM616 1260q0 -78 -44 -131.5t-117 -75.5q186 -45 186 -211q0 -130 -88.5 -201.5t-247.5 -71.5q-144 0 -264 60v88q136 -62 266 -62q115 0 174.5 49t59.5 136q0 83 -59.5 122t-178.5 39h-131v84h135q105 0 158 43.5t53 120.5q0 67 -47 107.5t-127 40.5 q-128 0 -246 -78l-47 70q130 94 293 94q127 0 199.5 -60t72.5 -163zM1300 1462l-811 -1462h-94l811 1462h94zM1495 242h-129v-241h-90v241h-413v60l407 581h96v-563h129v-78zM1276 320v221q0 132 8 232q-6 -12 -21.5 -35.5t-295.5 -417.5h309z" />
<glyph unicode="&#xbf;" horiz-adv-x="862" d="M569 711v-37q0 -125 -39.5 -204.5t-136.5 -164.5l-90 -79q-73 -61 -104 -120.5t-31 -138.5q0 -124 82 -200t221 -76q125 0 233 46l64 27l37 -79q-111 -48 -185.5 -64t-152.5 -16q-184 0 -288.5 99t-104.5 269q0 70 20 124t58.5 102t171.5 159q64 53 98.5 98.5t49.5 94 t15 145.5v15h82zM440 1010q0 98 80 98q82 0 82 -98q0 -53 -23.5 -76t-58.5 -23q-34 0 -57 23t-23 76z" />
<glyph unicode="&#xc0;" horiz-adv-x="1229" d="M0 0zM911 516h-594l-204 -516h-113l588 1468h65l576 -1468h-115zM354 608h523l-199 527q-25 62 -60 172q-27 -96 -59 -174zM720 1579h-69q-96 79 -188.5 171.5t-125.5 139.5v17h142q26 -48 98.5 -142t142.5 -170v-16z" />
<glyph unicode="&#xc1;" horiz-adv-x="1229" d="M0 0zM911 516h-594l-204 -516h-113l588 1468h65l576 -1468h-115zM354 608h523l-199 527q-25 62 -60 172q-27 -96 -59 -174zM504 1595q73 79 144.5 171.5t97.5 140.5h141v-17q-36 -52 -122.5 -138t-190.5 -173h-70v16z" />
<glyph unicode="&#xc2;" horiz-adv-x="1229" d="M0 0zM911 516h-594l-204 -516h-113l588 1468h65l576 -1468h-115zM354 608h523l-199 527q-25 62 -60 172q-27 -96 -59 -174zM328 1595q62 67 131.5 156t110.5 156h98q68 -120 242 -312v-16h-70q-122 101 -221 207q-108 -114 -221 -207h-70v16z" />
<glyph unicode="&#xc3;" horiz-adv-x="1229" d="M0 0zM911 516h-594l-204 -516h-113l588 1468h65l576 -1468h-115zM354 608h523l-199 527q-25 62 -60 172q-27 -96 -59 -174zM784 1581q-36 0 -75 18.5t-101 71.5q-32 26 -62.5 46t-62.5 20q-45 0 -75 -34.5t-48 -121.5h-73q10 111 63 174.5t137 63.5q48 0 88 -25t82 -59 q34 -28 66 -50t61 -22q46 0 77 36.5t48 119.5h76q-16 -116 -69 -177t-132 -61z" />
<glyph unicode="&#xc4;" horiz-adv-x="1229" d="M0 0zM911 516h-594l-204 -516h-113l588 1468h65l576 -1468h-115zM354 608h523l-199 527q-25 62 -60 172q-27 -96 -59 -174zM367 1727q0 46 15.5 66t47.5 20q64 0 64 -86t-64 -86q-63 0 -63 86zM748 1727q0 46 15.5 66t47.5 20q64 0 64 -86t-64 -86q-63 0 -63 86z" />
<glyph unicode="&#xc5;" horiz-adv-x="1229" d="M0 0zM911 516h-594l-204 -516h-113l588 1468h65l576 -1468h-115zM354 608h523l-199 527q-25 62 -60 172q-27 -96 -59 -174zM836 1610q0 -97 -60 -155t-157 -58t-157 58t-60 155q0 94 60 152.5t157 58.5t157 -59t60 -152zM482 1610q0 -66 37.5 -103.5t99.5 -37.5 t99.5 37.5t37.5 103.5q0 64 -39 101.5t-98 37.5q-62 0 -99.5 -38t-37.5 -101z" />
<glyph unicode="&#xc6;" horiz-adv-x="1653" d="M1528 0h-717v516h-475l-227 -516h-111l653 1462h877v-94h-615v-553h576v-94h-576v-627h615v-94zM377 608h434v760h-100z" />
<glyph unicode="&#xc7;" horiz-adv-x="1272" d="M129 0zM831 1391q-275 0 -433 -176t-158 -482q0 -313 149 -486t426 -173q184 0 338 47v-90q-145 -51 -362 -51q-308 0 -485 199t-177 556q0 223 84.5 393t243 262.5t368.5 92.5q214 0 383 -80l-41 -92q-160 80 -336 80zM911 -291q0 -100 -67.5 -150.5t-188.5 -50.5 q-68 0 -94 11v88q30 -10 92 -10q78 0 119 28t41 80q0 94 -193 121l93 174h96l-66 -117q168 -37 168 -174z" />
<glyph unicode="&#xc8;" horiz-adv-x="1130" d="M207 0zM1006 0h-799v1462h799v-94h-697v-553h658v-94h-658v-627h697v-94zM697 1579h-69q-96 79 -188.5 171.5t-125.5 139.5v17h142q26 -48 98.5 -142t142.5 -170v-16z" />
<glyph unicode="&#xc9;" horiz-adv-x="1130" d="M207 0zM1006 0h-799v1462h799v-94h-697v-553h658v-94h-658v-627h697v-94zM463 1595q73 79 144.5 171.5t97.5 140.5h141v-17q-36 -52 -122.5 -138t-190.5 -173h-70v16z" />
<glyph unicode="&#xca;" horiz-adv-x="1130" d="M207 0zM1006 0h-799v1462h799v-94h-697v-553h658v-94h-658v-627h697v-94zM315 1595q62 67 131.5 156t110.5 156h98q68 -120 242 -312v-16h-70q-122 101 -221 207q-108 -114 -221 -207h-70v16z" />
<glyph unicode="&#xcb;" horiz-adv-x="1130" d="M207 0zM1006 0h-799v1462h799v-94h-697v-553h658v-94h-658v-627h697v-94zM354 1727q0 46 15.5 66t47.5 20q64 0 64 -86t-64 -86q-63 0 -63 86zM735 1727q0 46 15.5 66t47.5 20q64 0 64 -86t-64 -86q-63 0 -63 86z" />
<glyph unicode="&#xcc;" horiz-adv-x="516" d="M0 0zM207 0v1462h102v-1462h-102zM320 1579h-69q-96 79 -188.5 171.5t-125.5 139.5v17h142q26 -48 98.5 -142t142.5 -170v-16z" />
<glyph unicode="&#xcd;" horiz-adv-x="516" d="M191 0zM207 0v1462h102v-1462h-102zM191 1595q73 79 144.5 171.5t97.5 140.5h141v-17q-36 -52 -122.5 -138t-190.5 -173h-70v16z" />
<glyph unicode="&#xce;" horiz-adv-x="516" d="M0 0zM207 0v1462h102v-1462h-102zM-32 1595q62 67 131.5 156t110.5 156h98q68 -120 242 -312v-16h-70q-122 101 -221 207q-108 -114 -221 -207h-70v16z" />
<glyph unicode="&#xcf;" horiz-adv-x="516" d="M5 0zM207 0v1462h102v-1462h-102zM5 1727q0 46 15.5 66t47.5 20q64 0 64 -86t-64 -86q-63 0 -63 86zM386 1727q0 46 15.5 66t47.5 20q64 0 64 -86t-64 -86q-63 0 -63 86z" />
<glyph unicode="&#xd0;" horiz-adv-x="1466" d="M1317 745q0 -368 -193 -556.5t-567 -188.5h-350v678h-160v94h160v690h395q350 0 532.5 -183t182.5 -534zM1206 741q0 314 -159.5 472.5t-468.5 158.5h-269v-600h406v-94h-406v-588h242q655 0 655 651z" />
<glyph unicode="&#xd1;" horiz-adv-x="1477" d="M207 0zM1270 0h-103l-866 1298h-8q12 -232 12 -350v-948h-98v1462h102l865 -1296h6q-9 180 -9 342v954h99v-1462zM897 1581q-36 0 -75 18.5t-101 71.5q-32 26 -62.5 46t-62.5 20q-45 0 -75 -34.5t-48 -121.5h-73q10 111 63 174.5t137 63.5q48 0 88 -25t82 -59 q34 -28 66 -50t61 -22q46 0 77 36.5t48 119.5h76q-16 -116 -69 -177t-132 -61z" />
<glyph unicode="&#xd2;" horiz-adv-x="1565" d="M129 0zM1436 733q0 -348 -174 -550.5t-480 -202.5q-305 0 -479 202.5t-174 552.5q0 349 175.5 549.5t479.5 200.5q306 0 479 -201.5t173 -550.5zM240 733q0 -314 140 -485.5t402 -171.5q264 0 403.5 170t139.5 487q0 316 -139.5 484.5t-401.5 168.5q-261 0 -402.5 -170 t-141.5 -483zM885 1579h-69q-96 79 -188.5 171.5t-125.5 139.5v17h142q26 -48 98.5 -142t142.5 -170v-16z" />
<glyph unicode="&#xd3;" horiz-adv-x="1565" d="M129 0zM1436 733q0 -348 -174 -550.5t-480 -202.5q-305 0 -479 202.5t-174 552.5q0 349 175.5 549.5t479.5 200.5q306 0 479 -201.5t173 -550.5zM240 733q0 -314 140 -485.5t402 -171.5q264 0 403.5 170t139.5 487q0 316 -139.5 484.5t-401.5 168.5q-261 0 -402.5 -170 t-141.5 -483zM686 1595q73 79 144.5 171.5t97.5 140.5h141v-17q-36 -52 -122.5 -138t-190.5 -173h-70v16z" />
<glyph unicode="&#xd4;" horiz-adv-x="1565" d="M129 0zM1436 733q0 -348 -174 -550.5t-480 -202.5q-305 0 -479 202.5t-174 552.5q0 349 175.5 549.5t479.5 200.5q306 0 479 -201.5t173 -550.5zM240 733q0 -314 140 -485.5t402 -171.5q264 0 403.5 170t139.5 487q0 316 -139.5 484.5t-401.5 168.5q-261 0 -402.5 -170 t-141.5 -483zM492 1595q62 67 131.5 156t110.5 156h98q68 -120 242 -312v-16h-70q-122 101 -221 207q-108 -114 -221 -207h-70v16z" />
<glyph unicode="&#xd5;" horiz-adv-x="1565" d="M129 0zM1436 733q0 -348 -174 -550.5t-480 -202.5q-305 0 -479 202.5t-174 552.5q0 349 175.5 549.5t479.5 200.5q306 0 479 -201.5t173 -550.5zM240 733q0 -314 140 -485.5t402 -171.5q264 0 403.5 170t139.5 487q0 316 -139.5 484.5t-401.5 168.5q-261 0 -402.5 -170 t-141.5 -483zM940 1581q-36 0 -75 18.5t-101 71.5q-32 26 -62.5 46t-62.5 20q-45 0 -75 -34.5t-48 -121.5h-73q10 111 63 174.5t137 63.5q48 0 88 -25t82 -59q34 -28 66 -50t61 -22q46 0 77 36.5t48 119.5h76q-16 -116 -69 -177t-132 -61z" />
<glyph unicode="&#xd6;" horiz-adv-x="1565" d="M129 0zM1436 733q0 -348 -174 -550.5t-480 -202.5q-305 0 -479 202.5t-174 552.5q0 349 175.5 549.5t479.5 200.5q306 0 479 -201.5t173 -550.5zM240 733q0 -314 140 -485.5t402 -171.5q264 0 403.5 170t139.5 487q0 316 -139.5 484.5t-401.5 168.5q-261 0 -402.5 -170 t-141.5 -483zM529 1727q0 46 15.5 66t47.5 20q64 0 64 -86t-64 -86q-63 0 -63 86zM910 1727q0 46 15.5 66t47.5 20q64 0 64 -86t-64 -86q-63 0 -63 86z" />
<glyph unicode="&#xd7;" d="M584 780l409 408l58 -58l-408 -407l406 -408l-58 -57l-407 408l-406 -408l-57 57l405 408l-407 407l57 58z" />
<glyph unicode="&#xd8;" horiz-adv-x="1565" d="M1436 733q0 -348 -174 -550.5t-480 -202.5q-236 0 -395 120l-86 -120l-74 59l90 127q-188 200 -188 569q0 349 175.5 549.5t479.5 200.5q232 0 392 -121l108 152l72 -60l-111 -153q191 -207 191 -570zM1325 733q0 315 -139 486l-742 -1037q133 -106 338 -106 q264 0 403.5 170t139.5 487zM240 733q0 -312 139 -483l739 1034q-133 102 -334 102q-261 0 -402.5 -170t-141.5 -483z" />
<glyph unicode="&#xd9;" horiz-adv-x="1473" d="M190 0zM1282 1462v-946q0 -252 -146 -394t-407 -142q-254 0 -396.5 142.5t-142.5 397.5v942h103v-946q0 -211 117 -328.5t331 -117.5q209 0 324 115.5t115 320.5v956h102zM833 1579h-69q-96 79 -188.5 171.5t-125.5 139.5v17h142q26 -48 98.5 -142t142.5 -170v-16z" />
<glyph unicode="&#xda;" horiz-adv-x="1473" d="M190 0zM1282 1462v-946q0 -252 -146 -394t-407 -142q-254 0 -396.5 142.5t-142.5 397.5v942h103v-946q0 -211 117 -328.5t331 -117.5q209 0 324 115.5t115 320.5v956h102zM633 1595q73 79 144.5 171.5t97.5 140.5h141v-17q-36 -52 -122.5 -138t-190.5 -173h-70v16z" />
<glyph unicode="&#xdb;" horiz-adv-x="1473" d="M190 0zM1282 1462v-946q0 -252 -146 -394t-407 -142q-254 0 -396.5 142.5t-142.5 397.5v942h103v-946q0 -211 117 -328.5t331 -117.5q209 0 324 115.5t115 320.5v956h102zM444 1595q62 67 131.5 156t110.5 156h98q68 -120 242 -312v-16h-70q-122 101 -221 207 q-108 -114 -221 -207h-70v16z" />
<glyph unicode="&#xdc;" horiz-adv-x="1473" d="M190 0zM1282 1462v-946q0 -252 -146 -394t-407 -142q-254 0 -396.5 142.5t-142.5 397.5v942h103v-946q0 -211 117 -328.5t331 -117.5q209 0 324 115.5t115 320.5v956h102zM481 1727q0 46 15.5 66t47.5 20q64 0 64 -86t-64 -86q-63 0 -63 86zM862 1727q0 46 15.5 66 t47.5 20q64 0 64 -86t-64 -86q-63 0 -63 86z" />
<glyph unicode="&#xdd;" horiz-adv-x="1081" d="M0 0zM543 662l428 800h110l-487 -897v-565h-105v557l-489 905h117zM434 1595q73 79 144.5 171.5t97.5 140.5h141v-17q-36 -52 -122.5 -138t-190.5 -173h-70v16z" />
<glyph unicode="&#xde;" horiz-adv-x="1198" d="M1087 778q0 -212 -144 -325t-408 -113h-226v-340h-102v1462h102v-264h256q522 0 522 -420zM309 428h201q247 0 357 81.5t110 264.5q0 169 -104 250.5t-322 81.5h-242v-678z" />
<glyph unicode="&#xdf;" horiz-adv-x="1194" d="M961 1284q0 -139 -139 -250q-81 -64 -110.5 -100.5t-29.5 -75.5q0 -44 14.5 -68t51.5 -57t102 -78q106 -75 151.5 -124.5t68 -103t22.5 -120.5q0 -156 -88 -241.5t-246 -85.5q-95 0 -174.5 18.5t-126.5 48.5v107q65 -38 148.5 -62t152.5 -24q114 0 174.5 54.5t60.5 160.5 q0 83 -39 144t-149 136q-127 87 -175 147t-48 146q0 60 32.5 110t106.5 108q74 57 106.5 105.5t32.5 106.5q0 93 -70 143t-202 50q-145 0 -226 -69t-81 -196v-1214h-99v1206q0 173 103.5 267t292.5 94q188 0 285.5 -72.5t97.5 -210.5z" />
<glyph unicode="&#xe0;" horiz-adv-x="1085" d="M98 0zM842 0l-25 172h-8q-82 -105 -168.5 -148.5t-204.5 -43.5q-160 0 -249 82t-89 227q0 159 132.5 247t383.5 93l207 6v72q0 155 -63 234t-203 79q-151 0 -313 -84l-37 86q179 84 354 84q179 0 267.5 -93t88.5 -290v-723h-73zM442 70q174 0 274.5 99.5t100.5 276.5v107 l-190 -8q-229 -11 -326.5 -71.5t-97.5 -188.5q0 -102 62.5 -158.5t176.5 -56.5zM638 1241h-69q-96 79 -188.5 171.5t-125.5 139.5v17h142q26 -48 98.5 -142t142.5 -170v-16z" />
<glyph unicode="&#xe1;" horiz-adv-x="1085" d="M98 0zM842 0l-25 172h-8q-82 -105 -168.5 -148.5t-204.5 -43.5q-160 0 -249 82t-89 227q0 159 132.5 247t383.5 93l207 6v72q0 155 -63 234t-203 79q-151 0 -313 -84l-37 86q179 84 354 84q179 0 267.5 -93t88.5 -290v-723h-73zM442 70q174 0 274.5 99.5t100.5 276.5v107 l-190 -8q-229 -11 -326.5 -71.5t-97.5 -188.5q0 -102 62.5 -158.5t176.5 -56.5zM422 1257q73 79 144.5 171.5t97.5 140.5h141v-17q-36 -52 -122.5 -138t-190.5 -173h-70v16z" />
<glyph unicode="&#xe2;" horiz-adv-x="1085" d="M98 0zM842 0l-25 172h-8q-82 -105 -168.5 -148.5t-204.5 -43.5q-160 0 -249 82t-89 227q0 159 132.5 247t383.5 93l207 6v72q0 155 -63 234t-203 79q-151 0 -313 -84l-37 86q179 84 354 84q179 0 267.5 -93t88.5 -290v-723h-73zM442 70q174 0 274.5 99.5t100.5 276.5v107 l-190 -8q-229 -11 -326.5 -71.5t-97.5 -188.5q0 -102 62.5 -158.5t176.5 -56.5zM251 1257q62 67 131.5 156t110.5 156h98q68 -120 242 -312v-16h-70q-122 101 -221 207q-108 -114 -221 -207h-70v16z" />
<glyph unicode="&#xe3;" horiz-adv-x="1085" d="M98 0zM842 0l-25 172h-8q-82 -105 -168.5 -148.5t-204.5 -43.5q-160 0 -249 82t-89 227q0 159 132.5 247t383.5 93l207 6v72q0 155 -63 234t-203 79q-151 0 -313 -84l-37 86q179 84 354 84q179 0 267.5 -93t88.5 -290v-723h-73zM442 70q174 0 274.5 99.5t100.5 276.5v107 l-190 -8q-229 -11 -326.5 -71.5t-97.5 -188.5q0 -102 62.5 -158.5t176.5 -56.5zM697 1243q-36 0 -75 18.5t-101 71.5q-32 26 -62.5 46t-62.5 20q-45 0 -75 -34.5t-48 -121.5h-73q10 111 63 174.5t137 63.5q48 0 88 -25t82 -59q34 -28 66 -50t61 -22q46 0 77 36.5t48 119.5 h76q-16 -116 -69 -177t-132 -61z" />
<glyph unicode="&#xe4;" horiz-adv-x="1085" d="M98 0zM842 0l-25 172h-8q-82 -105 -168.5 -148.5t-204.5 -43.5q-160 0 -249 82t-89 227q0 159 132.5 247t383.5 93l207 6v72q0 155 -63 234t-203 79q-151 0 -313 -84l-37 86q179 84 354 84q179 0 267.5 -93t88.5 -290v-723h-73zM442 70q174 0 274.5 99.5t100.5 276.5v107 l-190 -8q-229 -11 -326.5 -71.5t-97.5 -188.5q0 -102 62.5 -158.5t176.5 -56.5zM282 1389q0 46 15.5 66t47.5 20q64 0 64 -86t-64 -86q-63 0 -63 86zM663 1389q0 46 15.5 66t47.5 20q64 0 64 -86t-64 -86q-63 0 -63 86z" />
<glyph unicode="&#xe5;" horiz-adv-x="1085" d="M98 0zM842 0l-25 172h-8q-82 -105 -168.5 -148.5t-204.5 -43.5q-160 0 -249 82t-89 227q0 159 132.5 247t383.5 93l207 6v72q0 155 -63 234t-203 79q-151 0 -313 -84l-37 86q179 84 354 84q179 0 267.5 -93t88.5 -290v-723h-73zM442 70q174 0 274.5 99.5t100.5 276.5v107 l-190 -8q-229 -11 -326.5 -71.5t-97.5 -188.5q0 -102 62.5 -158.5t176.5 -56.5zM759 1456q0 -97 -60 -155t-157 -58t-157 58t-60 155q0 94 60 152.5t157 58.5t157 -59t60 -152zM405 1456q0 -66 37.5 -103.5t99.5 -37.5t99.5 37.5t37.5 103.5q0 64 -39 101.5t-98 37.5 q-62 0 -99.5 -38t-37.5 -101z" />
<glyph unicode="&#xe6;" horiz-adv-x="1731" d="M1243 -20q-295 0 -397 256q-68 -133 -168 -194.5t-252 -61.5q-156 0 -242 82.5t-86 226.5q0 154 125 243t377 97l201 6v72q0 155 -61.5 234t-198.5 79q-148 0 -305 -84l-37 86q173 84 346 84q261 0 325 -211q111 213 347 213q184 0 289.5 -134.5t105.5 -363.5v-80h-715 q0 -460 348 -460q85 0 150 12t174 57v-90q-92 -41 -165 -55t-161 -14zM434 70q169 0 266 99.5t97 276.5v107l-187 -8q-219 -11 -313 -71.5t-94 -188.5q0 -102 61 -158.5t170 -56.5zM1217 1020q-284 0 -314 -402h604q0 188 -77.5 295t-212.5 107z" />
<glyph unicode="&#xe7;" horiz-adv-x="973" d="M119 0zM616 -20q-233 0 -365 147t-132 410q0 270 137 420.5t375 150.5q141 0 270 -49l-27 -88q-141 47 -245 47q-200 0 -303 -123.5t-103 -355.5q0 -220 103 -344.5t288 -124.5q148 0 275 53v-92q-104 -51 -273 -51zM723 -291q0 -100 -67.5 -150.5t-188.5 -50.5 q-68 0 -94 11v88q30 -10 92 -10q78 0 119 28t41 80q0 94 -193 121l93 174h96l-66 -117q168 -37 168 -174z" />
<glyph unicode="&#xe8;" horiz-adv-x="1124" d="M119 0zM621 -20q-237 0 -369.5 146t-132.5 409q0 260 128 416.5t345 156.5q192 0 303 -134t111 -364v-80h-783q2 -224 104.5 -342t293.5 -118q93 0 163.5 13t178.5 56v-90q-92 -40 -170 -54.5t-172 -14.5zM592 1020q-157 0 -252 -103.5t-111 -298.5h672q0 189 -82 295.5 t-227 106.5zM685 1241h-69q-96 79 -188.5 171.5t-125.5 139.5v17h142q26 -48 98.5 -142t142.5 -170v-16z" />
<glyph unicode="&#xe9;" horiz-adv-x="1124" d="M119 0zM621 -20q-237 0 -369.5 146t-132.5 409q0 260 128 416.5t345 156.5q192 0 303 -134t111 -364v-80h-783q2 -224 104.5 -342t293.5 -118q93 0 163.5 13t178.5 56v-90q-92 -40 -170 -54.5t-172 -14.5zM592 1020q-157 0 -252 -103.5t-111 -298.5h672q0 189 -82 295.5 t-227 106.5zM452 1257q73 79 144.5 171.5t97.5 140.5h141v-17q-36 -52 -122.5 -138t-190.5 -173h-70v16z" />
<glyph unicode="&#xea;" horiz-adv-x="1124" d="M119 0zM621 -20q-237 0 -369.5 146t-132.5 409q0 260 128 416.5t345 156.5q192 0 303 -134t111 -364v-80h-783q2 -224 104.5 -342t293.5 -118q93 0 163.5 13t178.5 56v-90q-92 -40 -170 -54.5t-172 -14.5zM592 1020q-157 0 -252 -103.5t-111 -298.5h672q0 189 -82 295.5 t-227 106.5zM290 1257q62 67 131.5 156t110.5 156h98q68 -120 242 -312v-16h-70q-122 101 -221 207q-108 -114 -221 -207h-70v16z" />
<glyph unicode="&#xeb;" horiz-adv-x="1124" d="M119 0zM621 -20q-237 0 -369.5 146t-132.5 409q0 260 128 416.5t345 156.5q192 0 303 -134t111 -364v-80h-783q2 -224 104.5 -342t293.5 -118q93 0 163.5 13t178.5 56v-90q-92 -40 -170 -54.5t-172 -14.5zM592 1020q-157 0 -252 -103.5t-111 -298.5h672q0 189 -82 295.5 t-227 106.5zM331 1389q0 46 15.5 66t47.5 20q64 0 64 -86t-64 -86q-63 0 -63 86zM712 1389q0 46 15.5 66t47.5 20q64 0 64 -86t-64 -86q-63 0 -63 86z" />
<glyph unicode="&#xec;" horiz-adv-x="463" d="M0 0zM281 0h-99v1087h99v-1087zM349 1241h-69q-96 79 -188.5 171.5t-125.5 139.5v17h142q26 -48 98.5 -142t142.5 -170v-16z" />
<glyph unicode="&#xed;" horiz-adv-x="463" d="M107 0zM281 0h-99v1087h99v-1087zM107 1257q73 79 144.5 171.5t97.5 140.5h141v-17q-36 -52 -122.5 -138t-190.5 -173h-70v16z" />
<glyph unicode="&#xee;" horiz-adv-x="463" d="M0 0zM281 0h-99v1087h99v-1087zM-58 1257q62 67 131.5 156t110.5 156h98q68 -120 242 -312v-16h-70q-122 101 -221 207q-108 -114 -221 -207h-70v16z" />
<glyph unicode="&#xef;" horiz-adv-x="463" d="M0 0zM281 0h-99v1087h99v-1087zM-21 1389q0 46 15.5 66t47.5 20q64 0 64 -86t-64 -86q-63 0 -63 86zM360 1389q0 46 15.5 66t47.5 20q64 0 64 -86t-64 -86q-63 0 -63 86z" />
<glyph unicode="&#xf0;" horiz-adv-x="1174" d="M1055 559q0 -276 -124 -427.5t-349 -151.5q-214 0 -339.5 130t-125.5 361q0 228 126.5 357.5t342.5 129.5q108 0 187.5 -33t148.5 -96l4 2q-64 270 -269 459l-270 -157l-49 77l244 146q-86 62 -199 119l45 81q147 -69 248 -145l225 137l49 -84l-202 -121 q154 -151 230.5 -353t76.5 -431zM950 557q0 146 -97 228.5t-267 82.5q-185 0 -275 -100.5t-90 -304.5q0 -186 94.5 -289.5t268.5 -103.5q179 0 272.5 123t93.5 364z" />
<glyph unicode="&#xf1;" horiz-adv-x="1208" d="M182 0zM940 0v705q0 164 -69 238.5t-214 74.5q-195 0 -285.5 -98.5t-90.5 -319.5v-600h-99v1087h84l19 -149h6q106 170 377 170q370 0 370 -397v-711h-98zM779 1243q-36 0 -75 18.5t-101 71.5q-32 26 -62.5 46t-62.5 20q-45 0 -75 -34.5t-48 -121.5h-73q10 111 63 174.5 t137 63.5q48 0 88 -25t82 -59q34 -28 66 -50t61 -22q46 0 77 36.5t48 119.5h76q-16 -116 -69 -177t-132 -61z" />
<glyph unicode="&#xf2;" horiz-adv-x="1200" d="M119 0zM1081 545q0 -266 -129 -415.5t-356 -149.5q-143 0 -252 69t-167 198t-58 298q0 266 129 414.5t354 148.5q224 0 351.5 -150.5t127.5 -412.5zM223 545q0 -224 98.5 -349.5t278.5 -125.5t278.5 125.5t98.5 349.5q0 225 -99.5 349t-279.5 124t-277.5 -123.5 t-97.5 -349.5zM718 1241h-69q-96 79 -188.5 171.5t-125.5 139.5v17h142q26 -48 98.5 -142t142.5 -170v-16z" />
<glyph unicode="&#xf3;" horiz-adv-x="1200" d="M119 0zM1081 545q0 -266 -129 -415.5t-356 -149.5q-143 0 -252 69t-167 198t-58 298q0 266 129 414.5t354 148.5q224 0 351.5 -150.5t127.5 -412.5zM223 545q0 -224 98.5 -349.5t278.5 -125.5t278.5 125.5t98.5 349.5q0 225 -99.5 349t-279.5 124t-277.5 -123.5 t-97.5 -349.5zM499 1257q73 79 144.5 171.5t97.5 140.5h141v-17q-36 -52 -122.5 -138t-190.5 -173h-70v16z" />
<glyph unicode="&#xf4;" horiz-adv-x="1200" d="M119 0zM1081 545q0 -266 -129 -415.5t-356 -149.5q-143 0 -252 69t-167 198t-58 298q0 266 129 414.5t354 148.5q224 0 351.5 -150.5t127.5 -412.5zM223 545q0 -224 98.5 -349.5t278.5 -125.5t278.5 125.5t98.5 349.5q0 225 -99.5 349t-279.5 124t-277.5 -123.5 t-97.5 -349.5zM309 1257q62 67 131.5 156t110.5 156h98q68 -120 242 -312v-16h-70q-122 101 -221 207q-108 -114 -221 -207h-70v16z" />
<glyph unicode="&#xf5;" horiz-adv-x="1200" d="M119 0zM1081 545q0 -266 -129 -415.5t-356 -149.5q-143 0 -252 69t-167 198t-58 298q0 266 129 414.5t354 148.5q224 0 351.5 -150.5t127.5 -412.5zM223 545q0 -224 98.5 -349.5t278.5 -125.5t278.5 125.5t98.5 349.5q0 225 -99.5 349t-279.5 124t-277.5 -123.5 t-97.5 -349.5zM761 1243q-36 0 -75 18.5t-101 71.5q-32 26 -62.5 46t-62.5 20q-45 0 -75 -34.5t-48 -121.5h-73q10 111 63 174.5t137 63.5q48 0 88 -25t82 -59q34 -28 66 -50t61 -22q46 0 77 36.5t48 119.5h76q-16 -116 -69 -177t-132 -61z" />
<glyph unicode="&#xf6;" horiz-adv-x="1200" d="M119 0zM1081 545q0 -266 -129 -415.5t-356 -149.5q-143 0 -252 69t-167 198t-58 298q0 266 129 414.5t354 148.5q224 0 351.5 -150.5t127.5 -412.5zM223 545q0 -224 98.5 -349.5t278.5 -125.5t278.5 125.5t98.5 349.5q0 225 -99.5 349t-279.5 124t-277.5 -123.5 t-97.5 -349.5zM346 1389q0 46 15.5 66t47.5 20q64 0 64 -86t-64 -86q-63 0 -63 86zM727 1389q0 46 15.5 66t47.5 20q64 0 64 -86t-64 -86q-63 0 -63 86z" />
<glyph unicode="&#xf7;" d="M111 682v82h948v-82h-948zM504 1075q0 99 80 99q82 0 82 -99q0 -52 -23.5 -75t-58.5 -23q-34 0 -57 23t-23 75zM504 371q0 98 80 98q82 0 82 -98q0 -53 -23.5 -76t-58.5 -23q-34 0 -57 23t-23 76z" />
<glyph unicode="&#xf8;" horiz-adv-x="1200" d="M1081 545q0 -266 -129 -415.5t-356 -149.5q-173 0 -291 98l-86 -113l-72 58l93 120q-121 153 -121 402q0 266 129 414.5t354 148.5q179 0 301 -104l96 124l74 -55l-104 -137q112 -147 112 -391zM223 545q0 -200 78 -322l543 705q-98 90 -246 90q-180 0 -277.5 -123.5 t-97.5 -349.5zM977 545q0 190 -72 309l-543 -702q94 -82 238 -82q180 0 278.5 125.5t98.5 349.5z" />
<glyph unicode="&#xf9;" horiz-adv-x="1208" d="M170 0zM268 1087v-704q0 -164 69 -238.5t214 -74.5q194 0 285.5 98t91.5 319v600h98v-1087h-84l-18 150h-6q-106 -170 -377 -170q-371 0 -371 397v710h98zM687 1241h-69q-96 79 -188.5 171.5t-125.5 139.5v17h142q26 -48 98.5 -142t142.5 -170v-16z" />
<glyph unicode="&#xfa;" horiz-adv-x="1208" d="M170 0zM268 1087v-704q0 -164 69 -238.5t214 -74.5q194 0 285.5 98t91.5 319v600h98v-1087h-84l-18 150h-6q-106 -170 -377 -170q-371 0 -371 397v710h98zM495 1257q73 79 144.5 171.5t97.5 140.5h141v-17q-36 -52 -122.5 -138t-190.5 -173h-70v16z" />
<glyph unicode="&#xfb;" horiz-adv-x="1208" d="M170 0zM268 1087v-704q0 -164 69 -238.5t214 -74.5q194 0 285.5 98t91.5 319v600h98v-1087h-84l-18 150h-6q-106 -170 -377 -170q-371 0 -371 397v710h98zM313 1257q62 67 131.5 156t110.5 156h98q68 -120 242 -312v-16h-70q-122 101 -221 207q-108 -114 -221 -207h-70 v16z" />
<glyph unicode="&#xfc;" horiz-adv-x="1208" d="M170 0zM268 1087v-704q0 -164 69 -238.5t214 -74.5q194 0 285.5 98t91.5 319v600h98v-1087h-84l-18 150h-6q-106 -170 -377 -170q-371 0 -371 397v710h98zM350 1389q0 46 15.5 66t47.5 20q64 0 64 -86t-64 -86q-63 0 -63 86zM731 1389q0 46 15.5 66t47.5 20q64 0 64 -86 t-64 -86q-63 0 -63 86z" />
<glyph unicode="&#xfd;" horiz-adv-x="940" d="M0 0zM0 1087h102l230 -610q105 -281 133 -379h6q42 129 137 385l230 604h102l-487 -1263q-59 -154 -99 -208t-93.5 -81t-129.5 -27q-57 0 -127 21v86q58 -16 125 -16q51 0 90 24t70.5 74.5t73 160t53.5 142.5zM361 1257q73 79 144.5 171.5t97.5 140.5h141v-17 q-36 -52 -122.5 -138t-190.5 -173h-70v16z" />
<glyph unicode="&#xfe;" horiz-adv-x="1219" d="M281 918q114 190 368 190q220 0 335.5 -144.5t115.5 -420.5q0 -268 -121.5 -415.5t-331.5 -147.5q-251 0 -366 188h-7l3 -84q4 -74 4 -162v-414h-99v2048h99v-391l-7 -247h7zM645 68q167 0 258.5 124t91.5 347q0 479 -348 479q-193 0 -279.5 -105t-86.5 -354v-18 q0 -255 85.5 -364t278.5 -109z" />
<glyph unicode="&#xff;" horiz-adv-x="940" d="M0 0zM0 1087h102l230 -610q105 -281 133 -379h6q42 129 137 385l230 604h102l-487 -1263q-59 -154 -99 -208t-93.5 -81t-129.5 -27q-57 0 -127 21v86q58 -16 125 -16q51 0 90 24t70.5 74.5t73 160t53.5 142.5zM214 1389q0 46 15.5 66t47.5 20q64 0 64 -86t-64 -86 q-63 0 -63 86zM595 1389q0 46 15.5 66t47.5 20q64 0 64 -86t-64 -86q-63 0 -63 86z" />
<glyph unicode="&#x131;" horiz-adv-x="463" d="M281 0h-99v1087h99v-1087z" />
<glyph unicode="&#x152;" horiz-adv-x="1839" d="M1714 0h-756q-76 -16 -176 -16q-305 0 -479 200t-174 551q0 347 174.5 545.5t480.5 198.5q78 0 183 -17h747v-94h-655v-553h616v-94h-616v-627h655v-94zM782 80q109 0 174 18v1266q-62 16 -172 16q-262 0 -403 -167.5t-141 -479.5q0 -315 140.5 -484t401.5 -169z" />
<glyph unicode="&#x153;" horiz-adv-x="1942" d="M1438 -20q-156 0 -266.5 67.5t-165.5 198.5q-59 -128 -158 -197t-252 -69q-143 0 -252 69t-167 198t-58 298q0 266 129 414.5t354 148.5q151 0 251 -70t157 -209q110 279 399 279q192 0 303 -134t111 -364v-80h-762q2 -230 100.5 -345t276.5 -115q93 0 163.5 13t178.5 56 v-90q-92 -40 -170 -54.5t-172 -14.5zM223 545q0 -224 98.5 -349.5t278.5 -125.5q174 0 265 122.5t91 352.5q0 224 -93 348.5t-265 124.5q-180 0 -277.5 -123.5t-97.5 -349.5zM1409 1020q-155 0 -242 -104t-102 -298h653q0 189 -82 295.5t-227 106.5z" />
<glyph unicode="&#x178;" horiz-adv-x="1081" d="M0 0zM543 662l428 800h110l-487 -897v-565h-105v557l-489 905h117zM288 1727q0 46 15.5 66t47.5 20q64 0 64 -86t-64 -86q-63 0 -63 86zM669 1727q0 46 15.5 66t47.5 20q64 0 64 -86t-64 -86q-63 0 -63 86z" />
<glyph unicode="&#x2c6;" horiz-adv-x="1182" d="M299 1257q62 67 131.5 156t110.5 156h98q68 -120 242 -312v-16h-70q-122 101 -221 207q-108 -114 -221 -207h-70v16z" />
<glyph unicode="&#x2da;" horiz-adv-x="1182" d="M805 1456q0 -97 -60 -155t-157 -58t-157 58t-60 155q0 94 60 152.5t157 58.5t157 -59t60 -152zM451 1456q0 -66 37.5 -103.5t99.5 -37.5t99.5 37.5t37.5 103.5q0 64 -39 101.5t-98 37.5q-62 0 -99.5 -38t-37.5 -101z" />
<glyph unicode="&#x2dc;" horiz-adv-x="1182" d="M780 1243q-36 0 -75 18.5t-101 71.5q-32 26 -62.5 46t-62.5 20q-45 0 -75 -34.5t-48 -121.5h-73q10 111 63 174.5t137 63.5q48 0 88 -25t82 -59q34 -28 66 -50t61 -22q46 0 77 36.5t48 119.5h76q-16 -116 -69 -177t-132 -61z" />
<glyph unicode="&#x2000;" horiz-adv-x="953" />
<glyph unicode="&#x2001;" horiz-adv-x="1907" />
<glyph unicode="&#x2002;" horiz-adv-x="953" />
<glyph unicode="&#x2003;" horiz-adv-x="1907" />
<glyph unicode="&#x2004;" horiz-adv-x="635" />
<glyph unicode="&#x2005;" horiz-adv-x="476" />
<glyph unicode="&#x2006;" horiz-adv-x="317" />
<glyph unicode="&#x2007;" horiz-adv-x="317" />
<glyph unicode="&#x2008;" horiz-adv-x="238" />
<glyph unicode="&#x2009;" horiz-adv-x="381" />
<glyph unicode="&#x200a;" horiz-adv-x="105" />
<glyph unicode="&#x2010;" horiz-adv-x="659" d="M92 512v82h475v-82h-475z" />
<glyph unicode="&#x2011;" horiz-adv-x="659" d="M92 512v82h475v-82h-475z" />
<glyph unicode="&#x2012;" horiz-adv-x="659" d="M92 512v82h475v-82h-475z" />
<glyph unicode="&#x2013;" horiz-adv-x="1024" d="M82 512v82h860v-82h-860z" />
<glyph unicode="&#x2014;" horiz-adv-x="2048" d="M82 512v82h1884v-82h-1884z" />
<glyph unicode="&#x2018;" horiz-adv-x="297" d="M41 961l-12 20q32 112 81.5 251t92.5 230h65q-30 -101 -64.5 -257t-45.5 -244h-117z" />
<glyph unicode="&#x2019;" horiz-adv-x="297" d="M256 1462l12 -20q-75 -265 -174 -481h-65q29 96 61 241.5t49 259.5h117z" />
<glyph unicode="&#x201a;" horiz-adv-x="451" d="M68 0zM295 238l12 -20q-75 -265 -174 -481h-65q29 96 61 241.5t49 259.5h117z" />
<glyph unicode="&#x201c;" horiz-adv-x="614" d="M358 961l-12 20q34 120 83 255t91 226h66q-30 -98 -63 -248.5t-48 -252.5h-117zM41 961l-12 20q32 112 81.5 251t92.5 230h65q-30 -101 -64.5 -257t-45.5 -244h-117z" />
<glyph unicode="&#x201d;" horiz-adv-x="614" d="M256 1462l12 -20q-75 -265 -174 -481h-65q29 96 61 241.5t49 259.5h117zM573 1462l13 -20q-36 -128 -85 -261t-89 -220h-66q30 98 63 248.5t48 252.5h116z" />
<glyph unicode="&#x201e;" horiz-adv-x="768" d="M68 0zM295 238l12 -20q-75 -265 -174 -481h-65q29 96 61 241.5t49 259.5h117zM612 238l13 -20q-36 -128 -85 -261t-89 -220h-66q30 98 63 248.5t48 252.5h116z" />
<glyph unicode="&#x2022;" horiz-adv-x="770" d="M231 748q0 89 40.5 134.5t113.5 45.5t113.5 -47t40.5 -133q0 -85 -41 -133t-113 -48t-113 47t-41 134z" />
<glyph unicode="&#x2026;" horiz-adv-x="1466" d="M162 0zM162 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98zM651 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98zM1141 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98z" />
<glyph unicode="&#x202f;" horiz-adv-x="381" />
<glyph unicode="&#x2039;" horiz-adv-x="524" d="M82 543l309 393l62 -43l-254 -363l254 -362l-62 -43l-309 391v27z" />
<glyph unicode="&#x203a;" horiz-adv-x="524" d="M442 518l-309 -393l-61 43l254 362l-254 363l61 43l309 -391v-27z" />
<glyph unicode="&#x2044;" horiz-adv-x="246" d="M573 1462l-811 -1462h-94l811 1462h94z" />
<glyph unicode="&#x205f;" horiz-adv-x="476" />
<glyph unicode="&#x2074;" horiz-adv-x="688" d="M657 827h-129v-241h-90v241h-413v60l407 581h96v-563h129v-78zM438 905v221q0 132 8 232q-6 -12 -21.5 -35.5t-295.5 -417.5h309z" />
<glyph unicode="&#x20ac;" d="M803 1397q-174 0 -288 -125.5t-155 -364.5h502v-82h-510l-4 -104v-24q0 -65 4 -87h449v-82h-443q30 -217 147.5 -338.5t301.5 -121.5q148 0 287 65v-94q-81 -34 -150.5 -46.5t-140.5 -12.5q-228 0 -367.5 140t-181.5 408h-180v82h172q-4 38 -4 113l4 102h-172v82h184 q39 272 183 425t362 153q88 0 161 -17t148 -57l-39 -86q-132 72 -270 72z" />
<glyph unicode="&#x2122;" horiz-adv-x="1485" d="M313 741h-86v643h-217v78h522v-78h-219v-643zM913 741l-221 609h-6l4 -201v-408h-82v721h125l221 -606l224 606h125v-721h-86v398l4 207h-7l-227 -605h-74z" />
<glyph unicode="&#x2212;" d="M111 682v82h948v-82h-948z" />
<glyph unicode="&#xe000;" horiz-adv-x="1085" d="M0 1085h1085v-1085h-1085v1085z" />
<glyph horiz-adv-x="1219" d="M0 0z" />
<hkern u1="&#x22;" u2="&#x178;" k="-20" />
<hkern u1="&#x22;" u2="&#x153;" k="123" />
<hkern u1="&#x22;" u2="&#xfc;" k="61" />
<hkern u1="&#x22;" u2="&#xfb;" k="61" />
<hkern u1="&#x22;" u2="&#xfa;" k="61" />
<hkern u1="&#x22;" u2="&#xf9;" k="61" />
<hkern u1="&#x22;" u2="&#xf8;" k="123" />
<hkern u1="&#x22;" u2="&#xf6;" k="123" />
<hkern u1="&#x22;" u2="&#xf5;" k="123" />
<hkern u1="&#x22;" u2="&#xf4;" k="123" />
<hkern u1="&#x22;" u2="&#xf3;" k="123" />
<hkern u1="&#x22;" u2="&#xf2;" k="123" />
<hkern u1="&#x22;" u2="&#xeb;" k="123" />
<hkern u1="&#x22;" u2="&#xea;" k="123" />
<hkern u1="&#x22;" u2="&#xe9;" k="123" />
<hkern u1="&#x22;" u2="&#xe8;" k="123" />
<hkern u1="&#x22;" u2="&#xe7;" k="123" />
<hkern u1="&#x22;" u2="&#xe6;" k="82" />
<hkern u1="&#x22;" u2="&#xe5;" k="82" />
<hkern u1="&#x22;" u2="&#xe4;" k="82" />
<hkern u1="&#x22;" u2="&#xe3;" k="82" />
<hkern u1="&#x22;" u2="&#xe2;" k="82" />
<hkern u1="&#x22;" u2="&#xe1;" k="82" />
<hkern u1="&#x22;" u2="&#xe0;" k="123" />
<hkern u1="&#x22;" u2="&#xdd;" k="-20" />
<hkern u1="&#x22;" u2="&#xc5;" k="143" />
<hkern u1="&#x22;" u2="&#xc4;" k="143" />
<hkern u1="&#x22;" u2="&#xc3;" k="143" />
<hkern u1="&#x22;" u2="&#xc2;" k="143" />
<hkern u1="&#x22;" u2="&#xc1;" k="143" />
<hkern u1="&#x22;" u2="&#xc0;" k="143" />
<hkern u1="&#x22;" u2="u" k="61" />
<hkern u1="&#x22;" u2="s" k="61" />
<hkern u1="&#x22;" u2="r" k="61" />
<hkern u1="&#x22;" u2="q" k="123" />
<hkern u1="&#x22;" u2="p" k="61" />
<hkern u1="&#x22;" u2="o" k="123" />
<hkern u1="&#x22;" u2="n" k="61" />
<hkern u1="&#x22;" u2="m" k="61" />
<hkern u1="&#x22;" u2="g" k="61" />
<hkern u1="&#x22;" u2="e" k="123" />
<hkern u1="&#x22;" u2="d" k="123" />
<hkern u1="&#x22;" u2="c" k="123" />
<hkern u1="&#x22;" u2="a" k="82" />
<hkern u1="&#x22;" u2="Y" k="-20" />
<hkern u1="&#x22;" u2="W" k="-41" />
<hkern u1="&#x22;" u2="V" k="-41" />
<hkern u1="&#x22;" u2="T" k="-41" />
<hkern u1="&#x22;" u2="A" k="143" />
<hkern u1="&#x27;" u2="&#x178;" k="-20" />
<hkern u1="&#x27;" u2="&#x153;" k="123" />
<hkern u1="&#x27;" u2="&#xfc;" k="61" />
<hkern u1="&#x27;" u2="&#xfb;" k="61" />
<hkern u1="&#x27;" u2="&#xfa;" k="61" />
<hkern u1="&#x27;" u2="&#xf9;" k="61" />
<hkern u1="&#x27;" u2="&#xf8;" k="123" />
<hkern u1="&#x27;" u2="&#xf6;" k="123" />
<hkern u1="&#x27;" u2="&#xf5;" k="123" />
<hkern u1="&#x27;" u2="&#xf4;" k="123" />
<hkern u1="&#x27;" u2="&#xf3;" k="123" />
<hkern u1="&#x27;" u2="&#xf2;" k="123" />
<hkern u1="&#x27;" u2="&#xeb;" k="123" />
<hkern u1="&#x27;" u2="&#xea;" k="123" />
<hkern u1="&#x27;" u2="&#xe9;" k="123" />
<hkern u1="&#x27;" u2="&#xe8;" k="123" />
<hkern u1="&#x27;" u2="&#xe7;" k="123" />
<hkern u1="&#x27;" u2="&#xe6;" k="82" />
<hkern u1="&#x27;" u2="&#xe5;" k="82" />
<hkern u1="&#x27;" u2="&#xe4;" k="82" />
<hkern u1="&#x27;" u2="&#xe3;" k="82" />
<hkern u1="&#x27;" u2="&#xe2;" k="82" />
<hkern u1="&#x27;" u2="&#xe1;" k="82" />
<hkern u1="&#x27;" u2="&#xe0;" k="123" />
<hkern u1="&#x27;" u2="&#xdd;" k="-20" />
<hkern u1="&#x27;" u2="&#xc5;" k="143" />
<hkern u1="&#x27;" u2="&#xc4;" k="143" />
<hkern u1="&#x27;" u2="&#xc3;" k="143" />
<hkern u1="&#x27;" u2="&#xc2;" k="143" />
<hkern u1="&#x27;" u2="&#xc1;" k="143" />
<hkern u1="&#x27;" u2="&#xc0;" k="143" />
<hkern u1="&#x27;" u2="u" k="61" />
<hkern u1="&#x27;" u2="s" k="61" />
<hkern u1="&#x27;" u2="r" k="61" />
<hkern u1="&#x27;" u2="q" k="123" />
<hkern u1="&#x27;" u2="p" k="61" />
<hkern u1="&#x27;" u2="o" k="123" />
<hkern u1="&#x27;" u2="n" k="61" />
<hkern u1="&#x27;" u2="m" k="61" />
<hkern u1="&#x27;" u2="g" k="61" />
<hkern u1="&#x27;" u2="e" k="123" />
<hkern u1="&#x27;" u2="d" k="123" />
<hkern u1="&#x27;" u2="c" k="123" />
<hkern u1="&#x27;" u2="a" k="82" />
<hkern u1="&#x27;" u2="Y" k="-20" />
<hkern u1="&#x27;" u2="W" k="-41" />
<hkern u1="&#x27;" u2="V" k="-41" />
<hkern u1="&#x27;" u2="T" k="-41" />
<hkern u1="&#x27;" u2="A" k="143" />
<hkern u1="&#x28;" u2="J" k="-184" />
<hkern u1="&#x2c;" u2="&#x178;" k="123" />
<hkern u1="&#x2c;" u2="&#x152;" k="102" />
<hkern u1="&#x2c;" u2="&#xdd;" k="123" />
<hkern u1="&#x2c;" u2="&#xdc;" k="41" />
<hkern u1="&#x2c;" u2="&#xdb;" k="41" />
<hkern u1="&#x2c;" u2="&#xda;" k="41" />
<hkern u1="&#x2c;" u2="&#xd9;" k="41" />
<hkern u1="&#x2c;" u2="&#xd8;" k="102" />
<hkern u1="&#x2c;" u2="&#xd6;" k="102" />
<hkern u1="&#x2c;" u2="&#xd5;" k="102" />
<hkern u1="&#x2c;" u2="&#xd4;" k="102" />
<hkern u1="&#x2c;" u2="&#xd3;" k="102" />
<hkern u1="&#x2c;" u2="&#xd2;" k="102" />
<hkern u1="&#x2c;" u2="&#xc7;" k="102" />
<hkern u1="&#x2c;" u2="Y" k="123" />
<hkern u1="&#x2c;" u2="W" k="123" />
<hkern u1="&#x2c;" u2="V" k="123" />
<hkern u1="&#x2c;" u2="U" k="41" />
<hkern u1="&#x2c;" u2="T" k="143" />
<hkern u1="&#x2c;" u2="Q" k="102" />
<hkern u1="&#x2c;" u2="O" k="102" />
<hkern u1="&#x2c;" u2="G" k="102" />
<hkern u1="&#x2c;" u2="C" k="102" />
<hkern u1="&#x2d;" u2="T" k="82" />
<hkern u1="&#x2e;" u2="&#x178;" k="123" />
<hkern u1="&#x2e;" u2="&#x152;" k="102" />
<hkern u1="&#x2e;" u2="&#xdd;" k="123" />
<hkern u1="&#x2e;" u2="&#xdc;" k="41" />
<hkern u1="&#x2e;" u2="&#xdb;" k="41" />
<hkern u1="&#x2e;" u2="&#xda;" k="41" />
<hkern u1="&#x2e;" u2="&#xd9;" k="41" />
<hkern u1="&#x2e;" u2="&#xd8;" k="102" />
<hkern u1="&#x2e;" u2="&#xd6;" k="102" />
<hkern u1="&#x2e;" u2="&#xd5;" k="102" />
<hkern u1="&#x2e;" u2="&#xd4;" k="102" />
<hkern u1="&#x2e;" u2="&#xd3;" k="102" />
<hkern u1="&#x2e;" u2="&#xd2;" k="102" />
<hkern u1="&#x2e;" u2="&#xc7;" k="102" />
<hkern u1="&#x2e;" u2="Y" k="123" />
<hkern u1="&#x2e;" u2="W" k="123" />
<hkern u1="&#x2e;" u2="V" k="123" />
<hkern u1="&#x2e;" u2="U" k="41" />
<hkern u1="&#x2e;" u2="T" k="143" />
<hkern u1="&#x2e;" u2="Q" k="102" />
<hkern u1="&#x2e;" u2="O" k="102" />
<hkern u1="&#x2e;" u2="G" k="102" />
<hkern u1="&#x2e;" u2="C" k="102" />
<hkern u1="A" u2="&#x201d;" k="143" />
<hkern u1="A" u2="&#x2019;" k="143" />
<hkern u1="A" u2="&#x178;" k="123" />
<hkern u1="A" u2="&#x152;" k="41" />
<hkern u1="A" u2="&#xdd;" k="123" />
<hkern u1="A" u2="&#xd8;" k="41" />
<hkern u1="A" u2="&#xd6;" k="41" />
<hkern u1="A" u2="&#xd5;" k="41" />
<hkern u1="A" u2="&#xd4;" k="41" />
<hkern u1="A" u2="&#xd3;" k="41" />
<hkern u1="A" u2="&#xd2;" k="41" />
<hkern u1="A" u2="&#xc7;" k="41" />
<hkern u1="A" u2="Y" k="123" />
<hkern u1="A" u2="W" k="82" />
<hkern u1="A" u2="V" k="82" />
<hkern u1="A" u2="T" k="143" />
<hkern u1="A" u2="Q" k="41" />
<hkern u1="A" u2="O" k="41" />
<hkern u1="A" u2="J" k="-266" />
<hkern u1="A" u2="G" k="41" />
<hkern u1="A" u2="C" k="41" />
<hkern u1="A" u2="&#x27;" k="143" />
<hkern u1="A" u2="&#x22;" k="143" />
<hkern u1="B" u2="&#x201e;" k="82" />
<hkern u1="B" u2="&#x201a;" k="82" />
<hkern u1="B" u2="&#x178;" k="20" />
<hkern u1="B" u2="&#xdd;" k="20" />
<hkern u1="B" u2="&#xc5;" k="41" />
<hkern u1="B" u2="&#xc4;" k="41" />
<hkern u1="B" u2="&#xc3;" k="41" />
<hkern u1="B" u2="&#xc2;" k="41" />
<hkern u1="B" u2="&#xc1;" k="41" />
<hkern u1="B" u2="&#xc0;" k="41" />
<hkern u1="B" u2="Z" k="20" />
<hkern u1="B" u2="Y" k="20" />
<hkern u1="B" u2="X" k="41" />
<hkern u1="B" u2="W" k="20" />
<hkern u1="B" u2="V" k="20" />
<hkern u1="B" u2="T" k="61" />
<hkern u1="B" u2="A" k="41" />
<hkern u1="B" u2="&#x2e;" k="82" />
<hkern u1="B" u2="&#x2c;" k="82" />
<hkern u1="C" u2="&#x152;" k="41" />
<hkern u1="C" u2="&#xd8;" k="41" />
<hkern u1="C" u2="&#xd6;" k="41" />
<hkern u1="C" u2="&#xd5;" k="41" />
<hkern u1="C" u2="&#xd4;" k="41" />
<hkern u1="C" u2="&#xd3;" k="41" />
<hkern u1="C" u2="&#xd2;" k="41" />
<hkern u1="C" u2="&#xc7;" k="41" />
<hkern u1="C" u2="Q" k="41" />
<hkern u1="C" u2="O" k="41" />
<hkern u1="C" u2="G" k="41" />
<hkern u1="C" u2="C" k="41" />
<hkern u1="D" u2="&#x201e;" k="82" />
<hkern u1="D" u2="&#x201a;" k="82" />
<hkern u1="D" u2="&#x178;" k="20" />
<hkern u1="D" u2="&#xdd;" k="20" />
<hkern u1="D" u2="&#xc5;" k="41" />
<hkern u1="D" u2="&#xc4;" k="41" />
<hkern u1="D" u2="&#xc3;" k="41" />
<hkern u1="D" u2="&#xc2;" k="41" />
<hkern u1="D" u2="&#xc1;" k="41" />
<hkern u1="D" u2="&#xc0;" k="41" />
<hkern u1="D" u2="Z" k="20" />
<hkern u1="D" u2="Y" k="20" />
<hkern u1="D" u2="X" k="41" />
<hkern u1="D" u2="W" k="20" />
<hkern u1="D" u2="V" k="20" />
<hkern u1="D" u2="T" k="61" />
<hkern u1="D" u2="A" k="41" />
<hkern u1="D" u2="&#x2e;" k="82" />
<hkern u1="D" u2="&#x2c;" k="82" />
<hkern u1="E" u2="J" k="-123" />
<hkern u1="F" u2="&#x201e;" k="123" />
<hkern u1="F" u2="&#x201a;" k="123" />
<hkern u1="F" u2="&#xc5;" k="41" />
<hkern u1="F" u2="&#xc4;" k="41" />
<hkern u1="F" u2="&#xc3;" k="41" />
<hkern u1="F" u2="&#xc2;" k="41" />
<hkern u1="F" u2="&#xc1;" k="41" />
<hkern u1="F" u2="&#xc0;" k="41" />
<hkern u1="F" u2="A" k="41" />
<hkern u1="F" u2="&#x3f;" k="-41" />
<hkern u1="F" u2="&#x2e;" k="123" />
<hkern u1="F" u2="&#x2c;" k="123" />
<hkern u1="K" u2="&#x152;" k="41" />
<hkern u1="K" u2="&#xd8;" k="41" />
<hkern u1="K" u2="&#xd6;" k="41" />
<hkern u1="K" u2="&#xd5;" k="41" />
<hkern u1="K" u2="&#xd4;" k="41" />
<hkern u1="K" u2="&#xd3;" k="41" />
<hkern u1="K" u2="&#xd2;" k="41" />
<hkern u1="K" u2="&#xc7;" k="41" />
<hkern u1="K" u2="Q" k="41" />
<hkern u1="K" u2="O" k="41" />
<hkern u1="K" u2="G" k="41" />
<hkern u1="K" u2="C" k="41" />
<hkern u1="L" u2="&#x201d;" k="164" />
<hkern u1="L" u2="&#x2019;" k="164" />
<hkern u1="L" u2="&#x178;" k="61" />
<hkern u1="L" u2="&#x152;" k="41" />
<hkern u1="L" u2="&#xdd;" k="61" />
<hkern u1="L" u2="&#xdc;" k="20" />
<hkern u1="L" u2="&#xdb;" k="20" />
<hkern u1="L" u2="&#xda;" k="20" />
<hkern u1="L" u2="&#xd9;" k="20" />
<hkern u1="L" u2="&#xd8;" k="41" />
<hkern u1="L" u2="&#xd6;" k="41" />
<hkern u1="L" u2="&#xd5;" k="41" />
<hkern u1="L" u2="&#xd4;" k="41" />
<hkern u1="L" u2="&#xd3;" k="41" />
<hkern u1="L" u2="&#xd2;" k="41" />
<hkern u1="L" u2="&#xc7;" k="41" />
<hkern u1="L" u2="Y" k="61" />
<hkern u1="L" u2="W" k="41" />
<hkern u1="L" u2="V" k="41" />
<hkern u1="L" u2="U" k="20" />
<hkern u1="L" u2="T" k="41" />
<hkern u1="L" u2="Q" k="41" />
<hkern u1="L" u2="O" k="41" />
<hkern u1="L" u2="G" k="41" />
<hkern u1="L" u2="C" k="41" />
<hkern u1="L" u2="&#x27;" k="164" />
<hkern u1="L" u2="&#x22;" k="164" />
<hkern u1="O" u2="&#x201e;" k="82" />
<hkern u1="O" u2="&#x201a;" k="82" />
<hkern u1="O" u2="&#x178;" k="20" />
<hkern u1="O" u2="&#xdd;" k="20" />
<hkern u1="O" u2="&#xc5;" k="41" />
<hkern u1="O" u2="&#xc4;" k="41" />
<hkern u1="O" u2="&#xc3;" k="41" />
<hkern u1="O" u2="&#xc2;" k="41" />
<hkern u1="O" u2="&#xc1;" k="41" />
<hkern u1="O" u2="&#xc0;" k="41" />
<hkern u1="O" u2="Z" k="20" />
<hkern u1="O" u2="Y" k="20" />
<hkern u1="O" u2="X" k="41" />
<hkern u1="O" u2="W" k="20" />
<hkern u1="O" u2="V" k="20" />
<hkern u1="O" u2="T" k="61" />
<hkern u1="O" u2="A" k="41" />
<hkern u1="O" u2="&#x2e;" k="82" />
<hkern u1="O" u2="&#x2c;" k="82" />
<hkern u1="P" u2="&#x201e;" k="266" />
<hkern u1="P" u2="&#x201a;" k="266" />
<hkern u1="P" u2="&#xc5;" k="102" />
<hkern u1="P" u2="&#xc4;" k="102" />
<hkern u1="P" u2="&#xc3;" k="102" />
<hkern u1="P" u2="&#xc2;" k="102" />
<hkern u1="P" u2="&#xc1;" k="102" />
<hkern u1="P" u2="&#xc0;" k="102" />
<hkern u1="P" u2="Z" k="20" />
<hkern u1="P" u2="X" k="41" />
<hkern u1="P" u2="A" k="102" />
<hkern u1="P" u2="&#x2e;" k="266" />
<hkern u1="P" u2="&#x2c;" k="266" />
<hkern u1="Q" u2="&#x201e;" k="82" />
<hkern u1="Q" u2="&#x201a;" k="82" />
<hkern u1="Q" u2="&#x178;" k="20" />
<hkern u1="Q" u2="&#xdd;" k="20" />
<hkern u1="Q" u2="&#xc5;" k="41" />
<hkern u1="Q" u2="&#xc4;" k="41" />
<hkern u1="Q" u2="&#xc3;" k="41" />
<hkern u1="Q" u2="&#xc2;" k="41" />
<hkern u1="Q" u2="&#xc1;" k="41" />
<hkern u1="Q" u2="&#xc0;" k="41" />
<hkern u1="Q" u2="Z" k="20" />
<hkern u1="Q" u2="Y" k="20" />
<hkern u1="Q" u2="X" k="41" />
<hkern u1="Q" u2="W" k="20" />
<hkern u1="Q" u2="V" k="20" />
<hkern u1="Q" u2="T" k="61" />
<hkern u1="Q" u2="A" k="41" />
<hkern u1="Q" u2="&#x2e;" k="82" />
<hkern u1="Q" u2="&#x2c;" k="82" />
<hkern u1="T" u2="&#x201e;" k="123" />
<hkern u1="T" u2="&#x201a;" k="123" />
<hkern u1="T" u2="&#x2014;" k="82" />
<hkern u1="T" u2="&#x2013;" k="82" />
<hkern u1="T" u2="&#x153;" k="143" />
<hkern u1="T" u2="&#x152;" k="41" />
<hkern u1="T" u2="&#xfd;" k="41" />
<hkern u1="T" u2="&#xfc;" k="102" />
<hkern u1="T" u2="&#xfb;" k="102" />
<hkern u1="T" u2="&#xfa;" k="102" />
<hkern u1="T" u2="&#xf9;" k="102" />
<hkern u1="T" u2="&#xf8;" k="143" />
<hkern u1="T" u2="&#xf6;" k="143" />
<hkern u1="T" u2="&#xf5;" k="143" />
<hkern u1="T" u2="&#xf4;" k="143" />
<hkern u1="T" u2="&#xf3;" k="143" />
<hkern u1="T" u2="&#xf2;" k="143" />
<hkern u1="T" u2="&#xeb;" k="143" />
<hkern u1="T" u2="&#xea;" k="143" />
<hkern u1="T" u2="&#xe9;" k="143" />
<hkern u1="T" u2="&#xe8;" k="143" />
<hkern u1="T" u2="&#xe7;" k="143" />
<hkern u1="T" u2="&#xe6;" k="164" />
<hkern u1="T" u2="&#xe5;" k="164" />
<hkern u1="T" u2="&#xe4;" k="164" />
<hkern u1="T" u2="&#xe3;" k="164" />
<hkern u1="T" u2="&#xe2;" k="164" />
<hkern u1="T" u2="&#xe1;" k="164" />
<hkern u1="T" u2="&#xe0;" k="143" />
<hkern u1="T" u2="&#xd8;" k="41" />
<hkern u1="T" u2="&#xd6;" k="41" />
<hkern u1="T" u2="&#xd5;" k="41" />
<hkern u1="T" u2="&#xd4;" k="41" />
<hkern u1="T" u2="&#xd3;" k="41" />
<hkern u1="T" u2="&#xd2;" k="41" />
<hkern u1="T" u2="&#xc7;" k="41" />
<hkern u1="T" u2="&#xc5;" k="143" />
<hkern u1="T" u2="&#xc4;" k="143" />
<hkern u1="T" u2="&#xc3;" k="143" />
<hkern u1="T" u2="&#xc2;" k="143" />
<hkern u1="T" u2="&#xc1;" k="143" />
<hkern u1="T" u2="&#xc0;" k="143" />
<hkern u1="T" u2="z" k="82" />
<hkern u1="T" u2="y" k="41" />
<hkern u1="T" u2="x" k="41" />
<hkern u1="T" u2="w" k="41" />
<hkern u1="T" u2="v" k="41" />
<hkern u1="T" u2="u" k="102" />
<hkern u1="T" u2="s" k="123" />
<hkern u1="T" u2="r" k="102" />
<hkern u1="T" u2="q" k="143" />
<hkern u1="T" u2="p" k="102" />
<hkern u1="T" u2="o" k="143" />
<hkern u1="T" u2="n" k="102" />
<hkern u1="T" u2="m" k="102" />
<hkern u1="T" u2="g" k="143" />
<hkern u1="T" u2="e" k="143" />
<hkern u1="T" u2="d" k="143" />
<hkern u1="T" u2="c" k="143" />
<hkern u1="T" u2="a" k="164" />
<hkern u1="T" u2="T" k="-41" />
<hkern u1="T" u2="Q" k="41" />
<hkern u1="T" u2="O" k="41" />
<hkern u1="T" u2="G" k="41" />
<hkern u1="T" u2="C" k="41" />
<hkern u1="T" u2="A" k="143" />
<hkern u1="T" u2="&#x3f;" k="-41" />
<hkern u1="T" u2="&#x2e;" k="123" />
<hkern u1="T" u2="&#x2d;" k="82" />
<hkern u1="T" u2="&#x2c;" k="123" />
<hkern u1="U" u2="&#x201e;" k="41" />
<hkern u1="U" u2="&#x201a;" k="41" />
<hkern u1="U" u2="&#xc5;" k="20" />
<hkern u1="U" u2="&#xc4;" k="20" />
<hkern u1="U" u2="&#xc3;" k="20" />
<hkern u1="U" u2="&#xc2;" k="20" />
<hkern u1="U" u2="&#xc1;" k="20" />
<hkern u1="U" u2="&#xc0;" k="20" />
<hkern u1="U" u2="A" k="20" />
<hkern u1="U" u2="&#x2e;" k="41" />
<hkern u1="U" u2="&#x2c;" k="41" />
<hkern u1="V" u2="&#x201e;" k="102" />
<hkern u1="V" u2="&#x201a;" k="102" />
<hkern u1="V" u2="&#x153;" k="41" />
<hkern u1="V" u2="&#x152;" k="20" />
<hkern u1="V" u2="&#xfc;" k="20" />
<hkern u1="V" u2="&#xfb;" k="20" />
<hkern u1="V" u2="&#xfa;" k="20" />
<hkern u1="V" u2="&#xf9;" k="20" />
<hkern u1="V" u2="&#xf8;" k="41" />
<hkern u1="V" u2="&#xf6;" k="41" />
<hkern u1="V" u2="&#xf5;" k="41" />
<hkern u1="V" u2="&#xf4;" k="41" />
<hkern u1="V" u2="&#xf3;" k="41" />
<hkern u1="V" u2="&#xf2;" k="41" />
<hkern u1="V" u2="&#xeb;" k="41" />
<hkern u1="V" u2="&#xea;" k="41" />
<hkern u1="V" u2="&#xe9;" k="41" />
<hkern u1="V" u2="&#xe8;" k="41" />
<hkern u1="V" u2="&#xe7;" k="41" />
<hkern u1="V" u2="&#xe6;" k="41" />
<hkern u1="V" u2="&#xe5;" k="41" />
<hkern u1="V" u2="&#xe4;" k="41" />
<hkern u1="V" u2="&#xe3;" k="41" />
<hkern u1="V" u2="&#xe2;" k="41" />
<hkern u1="V" u2="&#xe1;" k="41" />
<hkern u1="V" u2="&#xe0;" k="41" />
<hkern u1="V" u2="&#xd8;" k="20" />
<hkern u1="V" u2="&#xd6;" k="20" />
<hkern u1="V" u2="&#xd5;" k="20" />
<hkern u1="V" u2="&#xd4;" k="20" />
<hkern u1="V" u2="&#xd3;" k="20" />
<hkern u1="V" u2="&#xd2;" k="20" />
<hkern u1="V" u2="&#xc7;" k="20" />
<hkern u1="V" u2="&#xc5;" k="82" />
<hkern u1="V" u2="&#xc4;" k="82" />
<hkern u1="V" u2="&#xc3;" k="82" />
<hkern u1="V" u2="&#xc2;" k="82" />
<hkern u1="V" u2="&#xc1;" k="82" />
<hkern u1="V" u2="&#xc0;" k="82" />
<hkern u1="V" u2="u" k="20" />
<hkern u1="V" u2="s" k="20" />
<hkern u1="V" u2="r" k="20" />
<hkern u1="V" u2="q" k="41" />
<hkern u1="V" u2="p" k="20" />
<hkern u1="V" u2="o" k="41" />
<hkern u1="V" u2="n" k="20" />
<hkern u1="V" u2="m" k="20" />
<hkern u1="V" u2="g" k="20" />
<hkern u1="V" u2="e" k="41" />
<hkern u1="V" u2="d" k="41" />
<hkern u1="V" u2="c" k="41" />
<hkern u1="V" u2="a" k="41" />
<hkern u1="V" u2="Q" k="20" />
<hkern u1="V" u2="O" k="20" />
<hkern u1="V" u2="G" k="20" />
<hkern u1="V" u2="C" k="20" />
<hkern u1="V" u2="A" k="82" />
<hkern u1="V" u2="&#x3f;" k="-41" />
<hkern u1="V" u2="&#x2e;" k="102" />
<hkern u1="V" u2="&#x2c;" k="102" />
<hkern u1="W" u2="&#x201e;" k="102" />
<hkern u1="W" u2="&#x201a;" k="102" />
<hkern u1="W" u2="&#x153;" k="41" />
<hkern u1="W" u2="&#x152;" k="20" />
<hkern u1="W" u2="&#xfc;" k="20" />
<hkern u1="W" u2="&#xfb;" k="20" />
<hkern u1="W" u2="&#xfa;" k="20" />
<hkern u1="W" u2="&#xf9;" k="20" />
<hkern u1="W" u2="&#xf8;" k="41" />
<hkern u1="W" u2="&#xf6;" k="41" />
<hkern u1="W" u2="&#xf5;" k="41" />
<hkern u1="W" u2="&#xf4;" k="41" />
<hkern u1="W" u2="&#xf3;" k="41" />
<hkern u1="W" u2="&#xf2;" k="41" />
<hkern u1="W" u2="&#xeb;" k="41" />
<hkern u1="W" u2="&#xea;" k="41" />
<hkern u1="W" u2="&#xe9;" k="41" />
<hkern u1="W" u2="&#xe8;" k="41" />
<hkern u1="W" u2="&#xe7;" k="41" />
<hkern u1="W" u2="&#xe6;" k="41" />
<hkern u1="W" u2="&#xe5;" k="41" />
<hkern u1="W" u2="&#xe4;" k="41" />
<hkern u1="W" u2="&#xe3;" k="41" />
<hkern u1="W" u2="&#xe2;" k="41" />
<hkern u1="W" u2="&#xe1;" k="41" />
<hkern u1="W" u2="&#xe0;" k="41" />
<hkern u1="W" u2="&#xd8;" k="20" />
<hkern u1="W" u2="&#xd6;" k="20" />
<hkern u1="W" u2="&#xd5;" k="20" />
<hkern u1="W" u2="&#xd4;" k="20" />
<hkern u1="W" u2="&#xd3;" k="20" />
<hkern u1="W" u2="&#xd2;" k="20" />
<hkern u1="W" u2="&#xc7;" k="20" />
<hkern u1="W" u2="&#xc5;" k="82" />
<hkern u1="W" u2="&#xc4;" k="82" />
<hkern u1="W" u2="&#xc3;" k="82" />
<hkern u1="W" u2="&#xc2;" k="82" />
<hkern u1="W" u2="&#xc1;" k="82" />
<hkern u1="W" u2="&#xc0;" k="82" />
<hkern u1="W" u2="u" k="20" />
<hkern u1="W" u2="s" k="20" />
<hkern u1="W" u2="r" k="20" />
<hkern u1="W" u2="q" k="41" />
<hkern u1="W" u2="p" k="20" />
<hkern u1="W" u2="o" k="41" />
<hkern u1="W" u2="n" k="20" />
<hkern u1="W" u2="m" k="20" />
<hkern u1="W" u2="g" k="20" />
<hkern u1="W" u2="e" k="41" />
<hkern u1="W" u2="d" k="41" />
<hkern u1="W" u2="c" k="41" />
<hkern u1="W" u2="a" k="41" />
<hkern u1="W" u2="Q" k="20" />
<hkern u1="W" u2="O" k="20" />
<hkern u1="W" u2="G" k="20" />
<hkern u1="W" u2="C" k="20" />
<hkern u1="W" u2="A" k="82" />
<hkern u1="W" u2="&#x3f;" k="-41" />
<hkern u1="W" u2="&#x2e;" k="102" />
<hkern u1="W" u2="&#x2c;" k="102" />
<hkern u1="X" u2="&#x152;" k="41" />
<hkern u1="X" u2="&#xd8;" k="41" />
<hkern u1="X" u2="&#xd6;" k="41" />
<hkern u1="X" u2="&#xd5;" k="41" />
<hkern u1="X" u2="&#xd4;" k="41" />
<hkern u1="X" u2="&#xd3;" k="41" />
<hkern u1="X" u2="&#xd2;" k="41" />
<hkern u1="X" u2="&#xc7;" k="41" />
<hkern u1="X" u2="Q" k="41" />
<hkern u1="X" u2="O" k="41" />
<hkern u1="X" u2="G" k="41" />
<hkern u1="X" u2="C" k="41" />
<hkern u1="Y" u2="&#x201e;" k="123" />
<hkern u1="Y" u2="&#x201a;" k="123" />
<hkern u1="Y" u2="&#x153;" k="102" />
<hkern u1="Y" u2="&#x152;" k="41" />
<hkern u1="Y" u2="&#xfc;" k="61" />
<hkern u1="Y" u2="&#xfb;" k="61" />
<hkern u1="Y" u2="&#xfa;" k="61" />
<hkern u1="Y" u2="&#xf9;" k="61" />
<hkern u1="Y" u2="&#xf8;" k="102" />
<hkern u1="Y" u2="&#xf6;" k="102" />
<hkern u1="Y" u2="&#xf5;" k="102" />
<hkern u1="Y" u2="&#xf4;" k="102" />
<hkern u1="Y" u2="&#xf3;" k="102" />
<hkern u1="Y" u2="&#xf2;" k="102" />
<hkern u1="Y" u2="&#xeb;" k="102" />
<hkern u1="Y" u2="&#xea;" k="102" />
<hkern u1="Y" u2="&#xe9;" k="102" />
<hkern u1="Y" u2="&#xe8;" k="102" />
<hkern u1="Y" u2="&#xe7;" k="102" />
<hkern u1="Y" u2="&#xe6;" k="102" />
<hkern u1="Y" u2="&#xe5;" k="102" />
<hkern u1="Y" u2="&#xe4;" k="102" />
<hkern u1="Y" u2="&#xe3;" k="102" />
<hkern u1="Y" u2="&#xe2;" k="102" />
<hkern u1="Y" u2="&#xe1;" k="102" />
<hkern u1="Y" u2="&#xe0;" k="102" />
<hkern u1="Y" u2="&#xd8;" k="41" />
<hkern u1="Y" u2="&#xd6;" k="41" />
<hkern u1="Y" u2="&#xd5;" k="41" />
<hkern u1="Y" u2="&#xd4;" k="41" />
<hkern u1="Y" u2="&#xd3;" k="41" />
<hkern u1="Y" u2="&#xd2;" k="41" />
<hkern u1="Y" u2="&#xc7;" k="41" />
<hkern u1="Y" u2="&#xc5;" k="123" />
<hkern u1="Y" u2="&#xc4;" k="123" />
<hkern u1="Y" u2="&#xc3;" k="123" />
<hkern u1="Y" u2="&#xc2;" k="123" />
<hkern u1="Y" u2="&#xc1;" k="123" />
<hkern u1="Y" u2="&#xc0;" k="123" />
<hkern u1="Y" u2="z" k="41" />
<hkern u1="Y" u2="u" k="61" />
<hkern u1="Y" u2="s" k="82" />
<hkern u1="Y" u2="r" k="61" />
<hkern u1="Y" u2="q" k="102" />
<hkern u1="Y" u2="p" k="61" />
<hkern u1="Y" u2="o" k="102" />
<hkern u1="Y" u2="n" k="61" />
<hkern u1="Y" u2="m" k="61" />
<hkern u1="Y" u2="g" k="41" />
<hkern u1="Y" u2="e" k="102" />
<hkern u1="Y" u2="d" k="102" />
<hkern u1="Y" u2="c" k="102" />
<hkern u1="Y" u2="a" k="102" />
<hkern u1="Y" u2="Q" k="41" />
<hkern u1="Y" u2="O" k="41" />
<hkern u1="Y" u2="G" k="41" />
<hkern u1="Y" u2="C" k="41" />
<hkern u1="Y" u2="A" k="123" />
<hkern u1="Y" u2="&#x3f;" k="-41" />
<hkern u1="Y" u2="&#x2e;" k="123" />
<hkern u1="Y" u2="&#x2c;" k="123" />
<hkern u1="Z" u2="&#x152;" k="20" />
<hkern u1="Z" u2="&#xd8;" k="20" />
<hkern u1="Z" u2="&#xd6;" k="20" />
<hkern u1="Z" u2="&#xd5;" k="20" />
<hkern u1="Z" u2="&#xd4;" k="20" />
<hkern u1="Z" u2="&#xd3;" k="20" />
<hkern u1="Z" u2="&#xd2;" k="20" />
<hkern u1="Z" u2="&#xc7;" k="20" />
<hkern u1="Z" u2="Q" k="20" />
<hkern u1="Z" u2="O" k="20" />
<hkern u1="Z" u2="G" k="20" />
<hkern u1="Z" u2="C" k="20" />
<hkern u1="[" u2="J" k="-184" />
<hkern u1="a" u2="&#x201d;" k="20" />
<hkern u1="a" u2="&#x2019;" k="20" />
<hkern u1="a" u2="&#x27;" k="20" />
<hkern u1="a" u2="&#x22;" k="20" />
<hkern u1="b" u2="&#x201d;" k="20" />
<hkern u1="b" u2="&#x2019;" k="20" />
<hkern u1="b" u2="&#xfd;" k="41" />
<hkern u1="b" u2="z" k="20" />
<hkern u1="b" u2="y" k="41" />
<hkern u1="b" u2="x" k="41" />
<hkern u1="b" u2="w" k="41" />
<hkern u1="b" u2="v" k="41" />
<hkern u1="b" u2="&#x27;" k="20" />
<hkern u1="b" u2="&#x22;" k="20" />
<hkern u1="c" u2="&#x201d;" k="-41" />
<hkern u1="c" u2="&#x2019;" k="-41" />
<hkern u1="c" u2="&#x27;" k="-41" />
<hkern u1="c" u2="&#x22;" k="-41" />
<hkern u1="e" u2="&#x201d;" k="20" />
<hkern u1="e" u2="&#x2019;" k="20" />
<hkern u1="e" u2="&#xfd;" k="41" />
<hkern u1="e" u2="z" k="20" />
<hkern u1="e" u2="y" k="41" />
<hkern u1="e" u2="x" k="41" />
<hkern u1="e" u2="w" k="41" />
<hkern u1="e" u2="v" k="41" />
<hkern u1="e" u2="&#x27;" k="20" />
<hkern u1="e" u2="&#x22;" k="20" />
<hkern u1="f" u2="&#x201d;" k="-123" />
<hkern u1="f" u2="&#x2019;" k="-123" />
<hkern u1="f" u2="&#x27;" k="-123" />
<hkern u1="f" u2="&#x22;" k="-123" />
<hkern u1="h" u2="&#x201d;" k="20" />
<hkern u1="h" u2="&#x2019;" k="20" />
<hkern u1="h" u2="&#x27;" k="20" />
<hkern u1="h" u2="&#x22;" k="20" />
<hkern u1="k" u2="&#x153;" k="41" />
<hkern u1="k" u2="&#xf8;" k="41" />
<hkern u1="k" u2="&#xf6;" k="41" />
<hkern u1="k" u2="&#xf5;" k="41" />
<hkern u1="k" u2="&#xf4;" k="41" />
<hkern u1="k" u2="&#xf3;" k="41" />
<hkern u1="k" u2="&#xf2;" k="41" />
<hkern u1="k" u2="&#xeb;" k="41" />
<hkern u1="k" u2="&#xea;" k="41" />
<hkern u1="k" u2="&#xe9;" k="41" />
<hkern u1="k" u2="&#xe8;" k="41" />
<hkern u1="k" u2="&#xe7;" k="41" />
<hkern u1="k" u2="&#xe0;" k="41" />
<hkern u1="k" u2="q" k="41" />
<hkern u1="k" u2="o" k="41" />
<hkern u1="k" u2="e" k="41" />
<hkern u1="k" u2="d" k="41" />
<hkern u1="k" u2="c" k="41" />
<hkern u1="m" u2="&#x201d;" k="20" />
<hkern u1="m" u2="&#x2019;" k="20" />
<hkern u1="m" u2="&#x27;" k="20" />
<hkern u1="m" u2="&#x22;" k="20" />
<hkern u1="n" u2="&#x201d;" k="20" />
<hkern u1="n" u2="&#x2019;" k="20" />
<hkern u1="n" u2="&#x27;" k="20" />
<hkern u1="n" u2="&#x22;" k="20" />
<hkern u1="o" u2="&#x201d;" k="20" />
<hkern u1="o" u2="&#x2019;" k="20" />
<hkern u1="o" u2="&#xfd;" k="41" />
<hkern u1="o" u2="z" k="20" />
<hkern u1="o" u2="y" k="41" />
<hkern u1="o" u2="x" k="41" />
<hkern u1="o" u2="w" k="41" />
<hkern u1="o" u2="v" k="41" />
<hkern u1="o" u2="&#x27;" k="20" />
<hkern u1="o" u2="&#x22;" k="20" />
<hkern u1="p" u2="&#x201d;" k="20" />
<hkern u1="p" u2="&#x2019;" k="20" />
<hkern u1="p" u2="&#xfd;" k="41" />
<hkern u1="p" u2="z" k="20" />
<hkern u1="p" u2="y" k="41" />
<hkern u1="p" u2="x" k="41" />
<hkern u1="p" u2="w" k="41" />
<hkern u1="p" u2="v" k="41" />
<hkern u1="p" u2="&#x27;" k="20" />
<hkern u1="p" u2="&#x22;" k="20" />
<hkern u1="r" u2="&#x201d;" k="-82" />
<hkern u1="r" u2="&#x2019;" k="-82" />
<hkern u1="r" u2="&#x153;" k="41" />
<hkern u1="r" u2="&#xf8;" k="41" />
<hkern u1="r" u2="&#xf6;" k="41" />
<hkern u1="r" u2="&#xf5;" k="41" />
<hkern u1="r" u2="&#xf4;" k="41" />
<hkern u1="r" u2="&#xf3;" k="41" />
<hkern u1="r" u2="&#xf2;" k="41" />
<hkern u1="r" u2="&#xeb;" k="41" />
<hkern u1="r" u2="&#xea;" k="41" />
<hkern u1="r" u2="&#xe9;" k="41" />
<hkern u1="r" u2="&#xe8;" k="41" />
<hkern u1="r" u2="&#xe7;" k="41" />
<hkern u1="r" u2="&#xe6;" k="41" />
<hkern u1="r" u2="&#xe5;" k="41" />
<hkern u1="r" u2="&#xe4;" k="41" />
<hkern u1="r" u2="&#xe3;" k="41" />
<hkern u1="r" u2="&#xe2;" k="41" />
<hkern u1="r" u2="&#xe1;" k="41" />
<hkern u1="r" u2="&#xe0;" k="41" />
<hkern u1="r" u2="q" k="41" />
<hkern u1="r" u2="o" k="41" />
<hkern u1="r" u2="g" k="20" />
<hkern u1="r" u2="e" k="41" />
<hkern u1="r" u2="d" k="41" />
<hkern u1="r" u2="c" k="41" />
<hkern u1="r" u2="a" k="41" />
<hkern u1="r" u2="&#x27;" k="-82" />
<hkern u1="r" u2="&#x22;" k="-82" />
<hkern u1="t" u2="&#x201d;" k="-41" />
<hkern u1="t" u2="&#x2019;" k="-41" />
<hkern u1="t" u2="&#x27;" k="-41" />
<hkern u1="t" u2="&#x22;" k="-41" />
<hkern u1="v" u2="&#x201e;" k="82" />
<hkern u1="v" u2="&#x201d;" k="-82" />
<hkern u1="v" u2="&#x201a;" k="82" />
<hkern u1="v" u2="&#x2019;" k="-82" />
<hkern u1="v" u2="&#x3f;" k="-41" />
<hkern u1="v" u2="&#x2e;" k="82" />
<hkern u1="v" u2="&#x2c;" k="82" />
<hkern u1="v" u2="&#x27;" k="-82" />
<hkern u1="v" u2="&#x22;" k="-82" />
<hkern u1="w" u2="&#x201e;" k="82" />
<hkern u1="w" u2="&#x201d;" k="-82" />
<hkern u1="w" u2="&#x201a;" k="82" />
<hkern u1="w" u2="&#x2019;" k="-82" />
<hkern u1="w" u2="&#x3f;" k="-41" />
<hkern u1="w" u2="&#x2e;" k="82" />
<hkern u1="w" u2="&#x2c;" k="82" />
<hkern u1="w" u2="&#x27;" k="-82" />
<hkern u1="w" u2="&#x22;" k="-82" />
<hkern u1="x" u2="&#x153;" k="41" />
<hkern u1="x" u2="&#xf8;" k="41" />
<hkern u1="x" u2="&#xf6;" k="41" />
<hkern u1="x" u2="&#xf5;" k="41" />
<hkern u1="x" u2="&#xf4;" k="41" />
<hkern u1="x" u2="&#xf3;" k="41" />
<hkern u1="x" u2="&#xf2;" k="41" />
<hkern u1="x" u2="&#xeb;" k="41" />
<hkern u1="x" u2="&#xea;" k="41" />
<hkern u1="x" u2="&#xe9;" k="41" />
<hkern u1="x" u2="&#xe8;" k="41" />
<hkern u1="x" u2="&#xe7;" k="41" />
<hkern u1="x" u2="&#xe0;" k="41" />
<hkern u1="x" u2="q" k="41" />
<hkern u1="x" u2="o" k="41" />
<hkern u1="x" u2="e" k="41" />
<hkern u1="x" u2="d" k="41" />
<hkern u1="x" u2="c" k="41" />
<hkern u1="y" u2="&#x201e;" k="82" />
<hkern u1="y" u2="&#x201d;" k="-82" />
<hkern u1="y" u2="&#x201a;" k="82" />
<hkern u1="y" u2="&#x2019;" k="-82" />
<hkern u1="y" u2="&#x3f;" k="-41" />
<hkern u1="y" u2="&#x2e;" k="82" />
<hkern u1="y" u2="&#x2c;" k="82" />
<hkern u1="y" u2="&#x27;" k="-82" />
<hkern u1="y" u2="&#x22;" k="-82" />
<hkern u1="&#x7b;" u2="J" k="-184" />
<hkern u1="&#xc0;" u2="&#x201d;" k="143" />
<hkern u1="&#xc0;" u2="&#x2019;" k="143" />
<hkern u1="&#xc0;" u2="&#x178;" k="123" />
<hkern u1="&#xc0;" u2="&#x152;" k="41" />
<hkern u1="&#xc0;" u2="&#xdd;" k="123" />
<hkern u1="&#xc0;" u2="&#xd8;" k="41" />
<hkern u1="&#xc0;" u2="&#xd6;" k="41" />
<hkern u1="&#xc0;" u2="&#xd5;" k="41" />
<hkern u1="&#xc0;" u2="&#xd4;" k="41" />
<hkern u1="&#xc0;" u2="&#xd3;" k="41" />
<hkern u1="&#xc0;" u2="&#xd2;" k="41" />
<hkern u1="&#xc0;" u2="&#xc7;" k="41" />
<hkern u1="&#xc0;" u2="Y" k="123" />
<hkern u1="&#xc0;" u2="W" k="82" />
<hkern u1="&#xc0;" u2="V" k="82" />
<hkern u1="&#xc0;" u2="T" k="143" />
<hkern u1="&#xc0;" u2="Q" k="41" />
<hkern u1="&#xc0;" u2="O" k="41" />
<hkern u1="&#xc0;" u2="J" k="-266" />
<hkern u1="&#xc0;" u2="G" k="41" />
<hkern u1="&#xc0;" u2="C" k="41" />
<hkern u1="&#xc0;" u2="&#x27;" k="143" />
<hkern u1="&#xc0;" u2="&#x22;" k="143" />
<hkern u1="&#xc1;" u2="&#x201d;" k="143" />
<hkern u1="&#xc1;" u2="&#x2019;" k="143" />
<hkern u1="&#xc1;" u2="&#x178;" k="123" />
<hkern u1="&#xc1;" u2="&#x152;" k="41" />
<hkern u1="&#xc1;" u2="&#xdd;" k="123" />
<hkern u1="&#xc1;" u2="&#xd8;" k="41" />
<hkern u1="&#xc1;" u2="&#xd6;" k="41" />
<hkern u1="&#xc1;" u2="&#xd5;" k="41" />
<hkern u1="&#xc1;" u2="&#xd4;" k="41" />
<hkern u1="&#xc1;" u2="&#xd3;" k="41" />
<hkern u1="&#xc1;" u2="&#xd2;" k="41" />
<hkern u1="&#xc1;" u2="&#xc7;" k="41" />
<hkern u1="&#xc1;" u2="Y" k="123" />
<hkern u1="&#xc1;" u2="W" k="82" />
<hkern u1="&#xc1;" u2="V" k="82" />
<hkern u1="&#xc1;" u2="T" k="143" />
<hkern u1="&#xc1;" u2="Q" k="41" />
<hkern u1="&#xc1;" u2="O" k="41" />
<hkern u1="&#xc1;" u2="J" k="-266" />
<hkern u1="&#xc1;" u2="G" k="41" />
<hkern u1="&#xc1;" u2="C" k="41" />
<hkern u1="&#xc1;" u2="&#x27;" k="143" />
<hkern u1="&#xc1;" u2="&#x22;" k="143" />
<hkern u1="&#xc2;" u2="&#x201d;" k="143" />
<hkern u1="&#xc2;" u2="&#x2019;" k="143" />
<hkern u1="&#xc2;" u2="&#x178;" k="123" />
<hkern u1="&#xc2;" u2="&#x152;" k="41" />
<hkern u1="&#xc2;" u2="&#xdd;" k="123" />
<hkern u1="&#xc2;" u2="&#xd8;" k="41" />
<hkern u1="&#xc2;" u2="&#xd6;" k="41" />
<hkern u1="&#xc2;" u2="&#xd5;" k="41" />
<hkern u1="&#xc2;" u2="&#xd4;" k="41" />
<hkern u1="&#xc2;" u2="&#xd3;" k="41" />
<hkern u1="&#xc2;" u2="&#xd2;" k="41" />
<hkern u1="&#xc2;" u2="&#xc7;" k="41" />
<hkern u1="&#xc2;" u2="Y" k="123" />
<hkern u1="&#xc2;" u2="W" k="82" />
<hkern u1="&#xc2;" u2="V" k="82" />
<hkern u1="&#xc2;" u2="T" k="143" />
<hkern u1="&#xc2;" u2="Q" k="41" />
<hkern u1="&#xc2;" u2="O" k="41" />
<hkern u1="&#xc2;" u2="J" k="-266" />
<hkern u1="&#xc2;" u2="G" k="41" />
<hkern u1="&#xc2;" u2="C" k="41" />
<hkern u1="&#xc2;" u2="&#x27;" k="143" />
<hkern u1="&#xc2;" u2="&#x22;" k="143" />
<hkern u1="&#xc3;" u2="&#x201d;" k="143" />
<hkern u1="&#xc3;" u2="&#x2019;" k="143" />
<hkern u1="&#xc3;" u2="&#x178;" k="123" />
<hkern u1="&#xc3;" u2="&#x152;" k="41" />
<hkern u1="&#xc3;" u2="&#xdd;" k="123" />
<hkern u1="&#xc3;" u2="&#xd8;" k="41" />
<hkern u1="&#xc3;" u2="&#xd6;" k="41" />
<hkern u1="&#xc3;" u2="&#xd5;" k="41" />
<hkern u1="&#xc3;" u2="&#xd4;" k="41" />
<hkern u1="&#xc3;" u2="&#xd3;" k="41" />
<hkern u1="&#xc3;" u2="&#xd2;" k="41" />
<hkern u1="&#xc3;" u2="&#xc7;" k="41" />
<hkern u1="&#xc3;" u2="Y" k="123" />
<hkern u1="&#xc3;" u2="W" k="82" />
<hkern u1="&#xc3;" u2="V" k="82" />
<hkern u1="&#xc3;" u2="T" k="143" />
<hkern u1="&#xc3;" u2="Q" k="41" />
<hkern u1="&#xc3;" u2="O" k="41" />
<hkern u1="&#xc3;" u2="J" k="-266" />
<hkern u1="&#xc3;" u2="G" k="41" />
<hkern u1="&#xc3;" u2="C" k="41" />
<hkern u1="&#xc3;" u2="&#x27;" k="143" />
<hkern u1="&#xc3;" u2="&#x22;" k="143" />
<hkern u1="&#xc4;" u2="&#x201d;" k="143" />
<hkern u1="&#xc4;" u2="&#x2019;" k="143" />
<hkern u1="&#xc4;" u2="&#x178;" k="123" />
<hkern u1="&#xc4;" u2="&#x152;" k="41" />
<hkern u1="&#xc4;" u2="&#xdd;" k="123" />
<hkern u1="&#xc4;" u2="&#xd8;" k="41" />
<hkern u1="&#xc4;" u2="&#xd6;" k="41" />
<hkern u1="&#xc4;" u2="&#xd5;" k="41" />
<hkern u1="&#xc4;" u2="&#xd4;" k="41" />
<hkern u1="&#xc4;" u2="&#xd3;" k="41" />
<hkern u1="&#xc4;" u2="&#xd2;" k="41" />
<hkern u1="&#xc4;" u2="&#xc7;" k="41" />
<hkern u1="&#xc4;" u2="Y" k="123" />
<hkern u1="&#xc4;" u2="W" k="82" />
<hkern u1="&#xc4;" u2="V" k="82" />
<hkern u1="&#xc4;" u2="T" k="143" />
<hkern u1="&#xc4;" u2="Q" k="41" />
<hkern u1="&#xc4;" u2="O" k="41" />
<hkern u1="&#xc4;" u2="J" k="-266" />
<hkern u1="&#xc4;" u2="G" k="41" />
<hkern u1="&#xc4;" u2="C" k="41" />
<hkern u1="&#xc4;" u2="&#x27;" k="143" />
<hkern u1="&#xc4;" u2="&#x22;" k="143" />
<hkern u1="&#xc5;" u2="&#x201d;" k="143" />
<hkern u1="&#xc5;" u2="&#x2019;" k="143" />
<hkern u1="&#xc5;" u2="&#x178;" k="123" />
<hkern u1="&#xc5;" u2="&#x152;" k="41" />
<hkern u1="&#xc5;" u2="&#xdd;" k="123" />
<hkern u1="&#xc5;" u2="&#xd8;" k="41" />
<hkern u1="&#xc5;" u2="&#xd6;" k="41" />
<hkern u1="&#xc5;" u2="&#xd5;" k="41" />
<hkern u1="&#xc5;" u2="&#xd4;" k="41" />
<hkern u1="&#xc5;" u2="&#xd3;" k="41" />
<hkern u1="&#xc5;" u2="&#xd2;" k="41" />
<hkern u1="&#xc5;" u2="&#xc7;" k="41" />
<hkern u1="&#xc5;" u2="Y" k="123" />
<hkern u1="&#xc5;" u2="W" k="82" />
<hkern u1="&#xc5;" u2="V" k="82" />
<hkern u1="&#xc5;" u2="T" k="143" />
<hkern u1="&#xc5;" u2="Q" k="41" />
<hkern u1="&#xc5;" u2="O" k="41" />
<hkern u1="&#xc5;" u2="J" k="-266" />
<hkern u1="&#xc5;" u2="G" k="41" />
<hkern u1="&#xc5;" u2="C" k="41" />
<hkern u1="&#xc5;" u2="&#x27;" k="143" />
<hkern u1="&#xc5;" u2="&#x22;" k="143" />
<hkern u1="&#xc6;" u2="J" k="-123" />
<hkern u1="&#xc7;" u2="&#x152;" k="41" />
<hkern u1="&#xc7;" u2="&#xd8;" k="41" />
<hkern u1="&#xc7;" u2="&#xd6;" k="41" />
<hkern u1="&#xc7;" u2="&#xd5;" k="41" />
<hkern u1="&#xc7;" u2="&#xd4;" k="41" />
<hkern u1="&#xc7;" u2="&#xd3;" k="41" />
<hkern u1="&#xc7;" u2="&#xd2;" k="41" />
<hkern u1="&#xc7;" u2="&#xc7;" k="41" />
<hkern u1="&#xc7;" u2="Q" k="41" />
<hkern u1="&#xc7;" u2="O" k="41" />
<hkern u1="&#xc7;" u2="G" k="41" />
<hkern u1="&#xc7;" u2="C" k="41" />
<hkern u1="&#xc8;" u2="J" k="-123" />
<hkern u1="&#xc9;" u2="J" k="-123" />
<hkern u1="&#xca;" u2="J" k="-123" />
<hkern u1="&#xcb;" u2="J" k="-123" />
<hkern u1="&#xd0;" u2="&#x201e;" k="82" />
<hkern u1="&#xd0;" u2="&#x201a;" k="82" />
<hkern u1="&#xd0;" u2="&#x178;" k="20" />
<hkern u1="&#xd0;" u2="&#xdd;" k="20" />
<hkern u1="&#xd0;" u2="&#xc5;" k="41" />
<hkern u1="&#xd0;" u2="&#xc4;" k="41" />
<hkern u1="&#xd0;" u2="&#xc3;" k="41" />
<hkern u1="&#xd0;" u2="&#xc2;" k="41" />
<hkern u1="&#xd0;" u2="&#xc1;" k="41" />
<hkern u1="&#xd0;" u2="&#xc0;" k="41" />
<hkern u1="&#xd0;" u2="Z" k="20" />
<hkern u1="&#xd0;" u2="Y" k="20" />
<hkern u1="&#xd0;" u2="X" k="41" />
<hkern u1="&#xd0;" u2="W" k="20" />
<hkern u1="&#xd0;" u2="V" k="20" />
<hkern u1="&#xd0;" u2="T" k="61" />
<hkern u1="&#xd0;" u2="A" k="41" />
<hkern u1="&#xd0;" u2="&#x2e;" k="82" />
<hkern u1="&#xd0;" u2="&#x2c;" k="82" />
<hkern u1="&#xd2;" u2="&#x201e;" k="82" />
<hkern u1="&#xd2;" u2="&#x201a;" k="82" />
<hkern u1="&#xd2;" u2="&#x178;" k="20" />
<hkern u1="&#xd2;" u2="&#xdd;" k="20" />
<hkern u1="&#xd2;" u2="&#xc5;" k="41" />
<hkern u1="&#xd2;" u2="&#xc4;" k="41" />
<hkern u1="&#xd2;" u2="&#xc3;" k="41" />
<hkern u1="&#xd2;" u2="&#xc2;" k="41" />
<hkern u1="&#xd2;" u2="&#xc1;" k="41" />
<hkern u1="&#xd2;" u2="&#xc0;" k="41" />
<hkern u1="&#xd2;" u2="Z" k="20" />
<hkern u1="&#xd2;" u2="Y" k="20" />
<hkern u1="&#xd2;" u2="X" k="41" />
<hkern u1="&#xd2;" u2="W" k="20" />
<hkern u1="&#xd2;" u2="V" k="20" />
<hkern u1="&#xd2;" u2="T" k="61" />
<hkern u1="&#xd2;" u2="A" k="41" />
<hkern u1="&#xd2;" u2="&#x2e;" k="82" />
<hkern u1="&#xd2;" u2="&#x2c;" k="82" />
<hkern u1="&#xd3;" u2="&#x201e;" k="82" />
<hkern u1="&#xd3;" u2="&#x201a;" k="82" />
<hkern u1="&#xd3;" u2="&#x178;" k="20" />
<hkern u1="&#xd3;" u2="&#xdd;" k="20" />
<hkern u1="&#xd3;" u2="&#xc5;" k="41" />
<hkern u1="&#xd3;" u2="&#xc4;" k="41" />
<hkern u1="&#xd3;" u2="&#xc3;" k="41" />
<hkern u1="&#xd3;" u2="&#xc2;" k="41" />
<hkern u1="&#xd3;" u2="&#xc1;" k="41" />
<hkern u1="&#xd3;" u2="&#xc0;" k="41" />
<hkern u1="&#xd3;" u2="Z" k="20" />
<hkern u1="&#xd3;" u2="Y" k="20" />
<hkern u1="&#xd3;" u2="X" k="41" />
<hkern u1="&#xd3;" u2="W" k="20" />
<hkern u1="&#xd3;" u2="V" k="20" />
<hkern u1="&#xd3;" u2="T" k="61" />
<hkern u1="&#xd3;" u2="A" k="41" />
<hkern u1="&#xd3;" u2="&#x2e;" k="82" />
<hkern u1="&#xd3;" u2="&#x2c;" k="82" />
<hkern u1="&#xd4;" u2="&#x201e;" k="82" />
<hkern u1="&#xd4;" u2="&#x201a;" k="82" />
<hkern u1="&#xd4;" u2="&#x178;" k="20" />
<hkern u1="&#xd4;" u2="&#xdd;" k="20" />
<hkern u1="&#xd4;" u2="&#xc5;" k="41" />
<hkern u1="&#xd4;" u2="&#xc4;" k="41" />
<hkern u1="&#xd4;" u2="&#xc3;" k="41" />
<hkern u1="&#xd4;" u2="&#xc2;" k="41" />
<hkern u1="&#xd4;" u2="&#xc1;" k="41" />
<hkern u1="&#xd4;" u2="&#xc0;" k="41" />
<hkern u1="&#xd4;" u2="Z" k="20" />
<hkern u1="&#xd4;" u2="Y" k="20" />
<hkern u1="&#xd4;" u2="X" k="41" />
<hkern u1="&#xd4;" u2="W" k="20" />
<hkern u1="&#xd4;" u2="V" k="20" />
<hkern u1="&#xd4;" u2="T" k="61" />
<hkern u1="&#xd4;" u2="A" k="41" />
<hkern u1="&#xd4;" u2="&#x2e;" k="82" />
<hkern u1="&#xd4;" u2="&#x2c;" k="82" />
<hkern u1="&#xd5;" u2="&#x201e;" k="82" />
<hkern u1="&#xd5;" u2="&#x201a;" k="82" />
<hkern u1="&#xd5;" u2="&#x178;" k="20" />
<hkern u1="&#xd5;" u2="&#xdd;" k="20" />
<hkern u1="&#xd5;" u2="&#xc5;" k="41" />
<hkern u1="&#xd5;" u2="&#xc4;" k="41" />
<hkern u1="&#xd5;" u2="&#xc3;" k="41" />
<hkern u1="&#xd5;" u2="&#xc2;" k="41" />
<hkern u1="&#xd5;" u2="&#xc1;" k="41" />
<hkern u1="&#xd5;" u2="&#xc0;" k="41" />
<hkern u1="&#xd5;" u2="Z" k="20" />
<hkern u1="&#xd5;" u2="Y" k="20" />
<hkern u1="&#xd5;" u2="X" k="41" />
<hkern u1="&#xd5;" u2="W" k="20" />
<hkern u1="&#xd5;" u2="V" k="20" />
<hkern u1="&#xd5;" u2="T" k="61" />
<hkern u1="&#xd5;" u2="A" k="41" />
<hkern u1="&#xd5;" u2="&#x2e;" k="82" />
<hkern u1="&#xd5;" u2="&#x2c;" k="82" />
<hkern u1="&#xd6;" u2="&#x201e;" k="82" />
<hkern u1="&#xd6;" u2="&#x201a;" k="82" />
<hkern u1="&#xd6;" u2="&#x178;" k="20" />
<hkern u1="&#xd6;" u2="&#xdd;" k="20" />
<hkern u1="&#xd6;" u2="&#xc5;" k="41" />
<hkern u1="&#xd6;" u2="&#xc4;" k="41" />
<hkern u1="&#xd6;" u2="&#xc3;" k="41" />
<hkern u1="&#xd6;" u2="&#xc2;" k="41" />
<hkern u1="&#xd6;" u2="&#xc1;" k="41" />
<hkern u1="&#xd6;" u2="&#xc0;" k="41" />
<hkern u1="&#xd6;" u2="Z" k="20" />
<hkern u1="&#xd6;" u2="Y" k="20" />
<hkern u1="&#xd6;" u2="X" k="41" />
<hkern u1="&#xd6;" u2="W" k="20" />
<hkern u1="&#xd6;" u2="V" k="20" />
<hkern u1="&#xd6;" u2="T" k="61" />
<hkern u1="&#xd6;" u2="A" k="41" />
<hkern u1="&#xd6;" u2="&#x2e;" k="82" />
<hkern u1="&#xd6;" u2="&#x2c;" k="82" />
<hkern u1="&#xd8;" u2="&#x201e;" k="82" />
<hkern u1="&#xd8;" u2="&#x201a;" k="82" />
<hkern u1="&#xd8;" u2="&#x178;" k="20" />
<hkern u1="&#xd8;" u2="&#xdd;" k="20" />
<hkern u1="&#xd8;" u2="&#xc5;" k="41" />
<hkern u1="&#xd8;" u2="&#xc4;" k="41" />
<hkern u1="&#xd8;" u2="&#xc3;" k="41" />
<hkern u1="&#xd8;" u2="&#xc2;" k="41" />
<hkern u1="&#xd8;" u2="&#xc1;" k="41" />
<hkern u1="&#xd8;" u2="&#xc0;" k="41" />
<hkern u1="&#xd8;" u2="Z" k="20" />
<hkern u1="&#xd8;" u2="Y" k="20" />
<hkern u1="&#xd8;" u2="X" k="41" />
<hkern u1="&#xd8;" u2="W" k="20" />
<hkern u1="&#xd8;" u2="V" k="20" />
<hkern u1="&#xd8;" u2="T" k="61" />
<hkern u1="&#xd8;" u2="A" k="41" />
<hkern u1="&#xd8;" u2="&#x2e;" k="82" />
<hkern u1="&#xd8;" u2="&#x2c;" k="82" />
<hkern u1="&#xd9;" u2="&#x201e;" k="41" />
<hkern u1="&#xd9;" u2="&#x201a;" k="41" />
<hkern u1="&#xd9;" u2="&#xc5;" k="20" />
<hkern u1="&#xd9;" u2="&#xc4;" k="20" />
<hkern u1="&#xd9;" u2="&#xc3;" k="20" />
<hkern u1="&#xd9;" u2="&#xc2;" k="20" />
<hkern u1="&#xd9;" u2="&#xc1;" k="20" />
<hkern u1="&#xd9;" u2="&#xc0;" k="20" />
<hkern u1="&#xd9;" u2="A" k="20" />
<hkern u1="&#xd9;" u2="&#x2e;" k="41" />
<hkern u1="&#xd9;" u2="&#x2c;" k="41" />
<hkern u1="&#xda;" u2="&#x201e;" k="41" />
<hkern u1="&#xda;" u2="&#x201a;" k="41" />
<hkern u1="&#xda;" u2="&#xc5;" k="20" />
<hkern u1="&#xda;" u2="&#xc4;" k="20" />
<hkern u1="&#xda;" u2="&#xc3;" k="20" />
<hkern u1="&#xda;" u2="&#xc2;" k="20" />
<hkern u1="&#xda;" u2="&#xc1;" k="20" />
<hkern u1="&#xda;" u2="&#xc0;" k="20" />
<hkern u1="&#xda;" u2="A" k="20" />
<hkern u1="&#xda;" u2="&#x2e;" k="41" />
<hkern u1="&#xda;" u2="&#x2c;" k="41" />
<hkern u1="&#xdb;" u2="&#x201e;" k="41" />
<hkern u1="&#xdb;" u2="&#x201a;" k="41" />
<hkern u1="&#xdb;" u2="&#xc5;" k="20" />
<hkern u1="&#xdb;" u2="&#xc4;" k="20" />
<hkern u1="&#xdb;" u2="&#xc3;" k="20" />
<hkern u1="&#xdb;" u2="&#xc2;" k="20" />
<hkern u1="&#xdb;" u2="&#xc1;" k="20" />
<hkern u1="&#xdb;" u2="&#xc0;" k="20" />
<hkern u1="&#xdb;" u2="A" k="20" />
<hkern u1="&#xdb;" u2="&#x2e;" k="41" />
<hkern u1="&#xdb;" u2="&#x2c;" k="41" />
<hkern u1="&#xdc;" u2="&#x201e;" k="41" />
<hkern u1="&#xdc;" u2="&#x201a;" k="41" />
<hkern u1="&#xdc;" u2="&#xc5;" k="20" />
<hkern u1="&#xdc;" u2="&#xc4;" k="20" />
<hkern u1="&#xdc;" u2="&#xc3;" k="20" />
<hkern u1="&#xdc;" u2="&#xc2;" k="20" />
<hkern u1="&#xdc;" u2="&#xc1;" k="20" />
<hkern u1="&#xdc;" u2="&#xc0;" k="20" />
<hkern u1="&#xdc;" u2="A" k="20" />
<hkern u1="&#xdc;" u2="&#x2e;" k="41" />
<hkern u1="&#xdc;" u2="&#x2c;" k="41" />
<hkern u1="&#xdd;" u2="&#x201e;" k="123" />
<hkern u1="&#xdd;" u2="&#x201a;" k="123" />
<hkern u1="&#xdd;" u2="&#x153;" k="102" />
<hkern u1="&#xdd;" u2="&#x152;" k="41" />
<hkern u1="&#xdd;" u2="&#xfc;" k="61" />
<hkern u1="&#xdd;" u2="&#xfb;" k="61" />
<hkern u1="&#xdd;" u2="&#xfa;" k="61" />
<hkern u1="&#xdd;" u2="&#xf9;" k="61" />
<hkern u1="&#xdd;" u2="&#xf8;" k="102" />
<hkern u1="&#xdd;" u2="&#xf6;" k="102" />
<hkern u1="&#xdd;" u2="&#xf5;" k="102" />
<hkern u1="&#xdd;" u2="&#xf4;" k="102" />
<hkern u1="&#xdd;" u2="&#xf3;" k="102" />
<hkern u1="&#xdd;" u2="&#xf2;" k="102" />
<hkern u1="&#xdd;" u2="&#xeb;" k="102" />
<hkern u1="&#xdd;" u2="&#xea;" k="102" />
<hkern u1="&#xdd;" u2="&#xe9;" k="102" />
<hkern u1="&#xdd;" u2="&#xe8;" k="102" />
<hkern u1="&#xdd;" u2="&#xe7;" k="102" />
<hkern u1="&#xdd;" u2="&#xe6;" k="102" />
<hkern u1="&#xdd;" u2="&#xe5;" k="102" />
<hkern u1="&#xdd;" u2="&#xe4;" k="102" />
<hkern u1="&#xdd;" u2="&#xe3;" k="102" />
<hkern u1="&#xdd;" u2="&#xe2;" k="102" />
<hkern u1="&#xdd;" u2="&#xe1;" k="102" />
<hkern u1="&#xdd;" u2="&#xe0;" k="102" />
<hkern u1="&#xdd;" u2="&#xd8;" k="41" />
<hkern u1="&#xdd;" u2="&#xd6;" k="41" />
<hkern u1="&#xdd;" u2="&#xd5;" k="41" />
<hkern u1="&#xdd;" u2="&#xd4;" k="41" />
<hkern u1="&#xdd;" u2="&#xd3;" k="41" />
<hkern u1="&#xdd;" u2="&#xd2;" k="41" />
<hkern u1="&#xdd;" u2="&#xc7;" k="41" />
<hkern u1="&#xdd;" u2="&#xc5;" k="123" />
<hkern u1="&#xdd;" u2="&#xc4;" k="123" />
<hkern u1="&#xdd;" u2="&#xc3;" k="123" />
<hkern u1="&#xdd;" u2="&#xc2;" k="123" />
<hkern u1="&#xdd;" u2="&#xc1;" k="123" />
<hkern u1="&#xdd;" u2="&#xc0;" k="123" />
<hkern u1="&#xdd;" u2="z" k="41" />
<hkern u1="&#xdd;" u2="u" k="61" />
<hkern u1="&#xdd;" u2="s" k="82" />
<hkern u1="&#xdd;" u2="r" k="61" />
<hkern u1="&#xdd;" u2="q" k="102" />
<hkern u1="&#xdd;" u2="p" k="61" />
<hkern u1="&#xdd;" u2="o" k="102" />
<hkern u1="&#xdd;" u2="n" k="61" />
<hkern u1="&#xdd;" u2="m" k="61" />
<hkern u1="&#xdd;" u2="g" k="41" />
<hkern u1="&#xdd;" u2="e" k="102" />
<hkern u1="&#xdd;" u2="d" k="102" />
<hkern u1="&#xdd;" u2="c" k="102" />
<hkern u1="&#xdd;" u2="a" k="102" />
<hkern u1="&#xdd;" u2="Q" k="41" />
<hkern u1="&#xdd;" u2="O" k="41" />
<hkern u1="&#xdd;" u2="G" k="41" />
<hkern u1="&#xdd;" u2="C" k="41" />
<hkern u1="&#xdd;" u2="A" k="123" />
<hkern u1="&#xdd;" u2="&#x3f;" k="-41" />
<hkern u1="&#xdd;" u2="&#x2e;" k="123" />
<hkern u1="&#xdd;" u2="&#x2c;" k="123" />
<hkern u1="&#xde;" u2="&#x201e;" k="266" />
<hkern u1="&#xde;" u2="&#x201a;" k="266" />
<hkern u1="&#xde;" u2="&#xc5;" k="102" />
<hkern u1="&#xde;" u2="&#xc4;" k="102" />
<hkern u1="&#xde;" u2="&#xc3;" k="102" />
<hkern u1="&#xde;" u2="&#xc2;" k="102" />
<hkern u1="&#xde;" u2="&#xc1;" k="102" />
<hkern u1="&#xde;" u2="&#xc0;" k="102" />
<hkern u1="&#xde;" u2="Z" k="20" />
<hkern u1="&#xde;" u2="X" k="41" />
<hkern u1="&#xde;" u2="A" k="102" />
<hkern u1="&#xde;" u2="&#x2e;" k="266" />
<hkern u1="&#xde;" u2="&#x2c;" k="266" />
<hkern u1="&#xe0;" u2="&#x201d;" k="20" />
<hkern u1="&#xe0;" u2="&#x2019;" k="20" />
<hkern u1="&#xe0;" u2="&#x27;" k="20" />
<hkern u1="&#xe0;" u2="&#x22;" k="20" />
<hkern u1="&#xe1;" u2="&#x201d;" k="20" />
<hkern u1="&#xe1;" u2="&#x2019;" k="20" />
<hkern u1="&#xe1;" u2="&#x27;" k="20" />
<hkern u1="&#xe1;" u2="&#x22;" k="20" />
<hkern u1="&#xe2;" u2="&#x201d;" k="20" />
<hkern u1="&#xe2;" u2="&#x2019;" k="20" />
<hkern u1="&#xe2;" u2="&#x27;" k="20" />
<hkern u1="&#xe2;" u2="&#x22;" k="20" />
<hkern u1="&#xe3;" u2="&#x201d;" k="20" />
<hkern u1="&#xe3;" u2="&#x2019;" k="20" />
<hkern u1="&#xe3;" u2="&#x27;" k="20" />
<hkern u1="&#xe3;" u2="&#x22;" k="20" />
<hkern u1="&#xe4;" u2="&#x201d;" k="20" />
<hkern u1="&#xe4;" u2="&#x2019;" k="20" />
<hkern u1="&#xe4;" u2="&#x27;" k="20" />
<hkern u1="&#xe4;" u2="&#x22;" k="20" />
<hkern u1="&#xe5;" u2="&#x201d;" k="20" />
<hkern u1="&#xe5;" u2="&#x2019;" k="20" />
<hkern u1="&#xe5;" u2="&#x27;" k="20" />
<hkern u1="&#xe5;" u2="&#x22;" k="20" />
<hkern u1="&#xe8;" u2="&#x201d;" k="20" />
<hkern u1="&#xe8;" u2="&#x2019;" k="20" />
<hkern u1="&#xe8;" u2="&#xfd;" k="41" />
<hkern u1="&#xe8;" u2="z" k="20" />
<hkern u1="&#xe8;" u2="y" k="41" />
<hkern u1="&#xe8;" u2="x" k="41" />
<hkern u1="&#xe8;" u2="w" k="41" />
<hkern u1="&#xe8;" u2="v" k="41" />
<hkern u1="&#xe8;" u2="&#x27;" k="20" />
<hkern u1="&#xe8;" u2="&#x22;" k="20" />
<hkern u1="&#xe9;" u2="&#x201d;" k="20" />
<hkern u1="&#xe9;" u2="&#x2019;" k="20" />
<hkern u1="&#xe9;" u2="&#xfd;" k="41" />
<hkern u1="&#xe9;" u2="z" k="20" />
<hkern u1="&#xe9;" u2="y" k="41" />
<hkern u1="&#xe9;" u2="x" k="41" />
<hkern u1="&#xe9;" u2="w" k="41" />
<hkern u1="&#xe9;" u2="v" k="41" />
<hkern u1="&#xe9;" u2="&#x27;" k="20" />
<hkern u1="&#xe9;" u2="&#x22;" k="20" />
<hkern u1="&#xea;" u2="&#x201d;" k="20" />
<hkern u1="&#xea;" u2="&#x2019;" k="20" />
<hkern u1="&#xea;" u2="&#xfd;" k="41" />
<hkern u1="&#xea;" u2="z" k="20" />
<hkern u1="&#xea;" u2="y" k="41" />
<hkern u1="&#xea;" u2="x" k="41" />
<hkern u1="&#xea;" u2="w" k="41" />
<hkern u1="&#xea;" u2="v" k="41" />
<hkern u1="&#xea;" u2="&#x27;" k="20" />
<hkern u1="&#xea;" u2="&#x22;" k="20" />
<hkern u1="&#xeb;" u2="&#x201d;" k="20" />
<hkern u1="&#xeb;" u2="&#x2019;" k="20" />
<hkern u1="&#xeb;" u2="&#xfd;" k="41" />
<hkern u1="&#xeb;" u2="z" k="20" />
<hkern u1="&#xeb;" u2="y" k="41" />
<hkern u1="&#xeb;" u2="x" k="41" />
<hkern u1="&#xeb;" u2="w" k="41" />
<hkern u1="&#xeb;" u2="v" k="41" />
<hkern u1="&#xeb;" u2="&#x27;" k="20" />
<hkern u1="&#xeb;" u2="&#x22;" k="20" />
<hkern u1="&#xf0;" u2="&#x201d;" k="20" />
<hkern u1="&#xf0;" u2="&#x2019;" k="20" />
<hkern u1="&#xf0;" u2="&#xfd;" k="41" />
<hkern u1="&#xf0;" u2="z" k="20" />
<hkern u1="&#xf0;" u2="y" k="41" />
<hkern u1="&#xf0;" u2="x" k="41" />
<hkern u1="&#xf0;" u2="w" k="41" />
<hkern u1="&#xf0;" u2="v" k="41" />
<hkern u1="&#xf0;" u2="&#x27;" k="20" />
<hkern u1="&#xf0;" u2="&#x22;" k="20" />
<hkern u1="&#xf2;" u2="&#x201d;" k="20" />
<hkern u1="&#xf2;" u2="&#x2019;" k="20" />
<hkern u1="&#xf2;" u2="&#xfd;" k="41" />
<hkern u1="&#xf2;" u2="z" k="20" />
<hkern u1="&#xf2;" u2="y" k="41" />
<hkern u1="&#xf2;" u2="x" k="41" />
<hkern u1="&#xf2;" u2="w" k="41" />
<hkern u1="&#xf2;" u2="v" k="41" />
<hkern u1="&#xf2;" u2="&#x27;" k="20" />
<hkern u1="&#xf2;" u2="&#x22;" k="20" />
<hkern u1="&#xf3;" u2="&#x201d;" k="20" />
<hkern u1="&#xf3;" u2="&#x2019;" k="20" />
<hkern u1="&#xf3;" u2="&#xfd;" k="41" />
<hkern u1="&#xf3;" u2="z" k="20" />
<hkern u1="&#xf3;" u2="y" k="41" />
<hkern u1="&#xf3;" u2="x" k="41" />
<hkern u1="&#xf3;" u2="w" k="41" />
<hkern u1="&#xf3;" u2="v" k="41" />
<hkern u1="&#xf3;" u2="&#x27;" k="20" />
<hkern u1="&#xf3;" u2="&#x22;" k="20" />
<hkern u1="&#xf4;" u2="&#x201d;" k="20" />
<hkern u1="&#xf4;" u2="&#x2019;" k="20" />
<hkern u1="&#xf4;" u2="&#xfd;" k="41" />
<hkern u1="&#xf4;" u2="z" k="20" />
<hkern u1="&#xf4;" u2="y" k="41" />
<hkern u1="&#xf4;" u2="x" k="41" />
<hkern u1="&#xf4;" u2="w" k="41" />
<hkern u1="&#xf4;" u2="v" k="41" />
<hkern u1="&#xf4;" u2="&#x27;" k="20" />
<hkern u1="&#xf4;" u2="&#x22;" k="20" />
<hkern u1="&#xf6;" u2="&#x201d;" k="41" />
<hkern u1="&#xf6;" u2="&#x2019;" k="41" />
<hkern u1="&#xf6;" u2="&#x27;" k="41" />
<hkern u1="&#xf6;" u2="&#x22;" k="41" />
<hkern u1="&#xf8;" u2="&#x201d;" k="20" />
<hkern u1="&#xf8;" u2="&#x2019;" k="20" />
<hkern u1="&#xf8;" u2="&#xfd;" k="41" />
<hkern u1="&#xf8;" u2="z" k="20" />
<hkern u1="&#xf8;" u2="y" k="41" />
<hkern u1="&#xf8;" u2="x" k="41" />
<hkern u1="&#xf8;" u2="w" k="41" />
<hkern u1="&#xf8;" u2="v" k="41" />
<hkern u1="&#xf8;" u2="&#x27;" k="20" />
<hkern u1="&#xf8;" u2="&#x22;" k="20" />
<hkern u1="&#xfd;" u2="&#x201e;" k="82" />
<hkern u1="&#xfd;" u2="&#x201d;" k="-82" />
<hkern u1="&#xfd;" u2="&#x201a;" k="82" />
<hkern u1="&#xfd;" u2="&#x2019;" k="-82" />
<hkern u1="&#xfd;" u2="&#x3f;" k="-41" />
<hkern u1="&#xfd;" u2="&#x2e;" k="82" />
<hkern u1="&#xfd;" u2="&#x2c;" k="82" />
<hkern u1="&#xfd;" u2="&#x27;" k="-82" />
<hkern u1="&#xfd;" u2="&#x22;" k="-82" />
<hkern u1="&#xfe;" u2="&#x201d;" k="20" />
<hkern u1="&#xfe;" u2="&#x2019;" k="20" />
<hkern u1="&#xfe;" u2="&#xfd;" k="41" />
<hkern u1="&#xfe;" u2="z" k="20" />
<hkern u1="&#xfe;" u2="y" k="41" />
<hkern u1="&#xfe;" u2="x" k="41" />
<hkern u1="&#xfe;" u2="w" k="41" />
<hkern u1="&#xfe;" u2="v" k="41" />
<hkern u1="&#xfe;" u2="&#x27;" k="20" />
<hkern u1="&#xfe;" u2="&#x22;" k="20" />
<hkern u1="&#xff;" u2="&#x201e;" k="82" />
<hkern u1="&#xff;" u2="&#x201d;" k="-82" />
<hkern u1="&#xff;" u2="&#x201a;" k="82" />
<hkern u1="&#xff;" u2="&#x2019;" k="-82" />
<hkern u1="&#xff;" u2="&#x3f;" k="-41" />
<hkern u1="&#xff;" u2="&#x2e;" k="82" />
<hkern u1="&#xff;" u2="&#x2c;" k="82" />
<hkern u1="&#xff;" u2="&#x27;" k="-82" />
<hkern u1="&#xff;" u2="&#x22;" k="-82" />
<hkern u1="&#x152;" u2="J" k="-123" />
<hkern u1="&#x178;" u2="&#x201e;" k="123" />
<hkern u1="&#x178;" u2="&#x201a;" k="123" />
<hkern u1="&#x178;" u2="&#x153;" k="102" />
<hkern u1="&#x178;" u2="&#x152;" k="41" />
<hkern u1="&#x178;" u2="&#xfc;" k="61" />
<hkern u1="&#x178;" u2="&#xfb;" k="61" />
<hkern u1="&#x178;" u2="&#xfa;" k="61" />
<hkern u1="&#x178;" u2="&#xf9;" k="61" />
<hkern u1="&#x178;" u2="&#xf8;" k="102" />
<hkern u1="&#x178;" u2="&#xf6;" k="102" />
<hkern u1="&#x178;" u2="&#xf5;" k="102" />
<hkern u1="&#x178;" u2="&#xf4;" k="102" />
<hkern u1="&#x178;" u2="&#xf3;" k="102" />
<hkern u1="&#x178;" u2="&#xf2;" k="102" />
<hkern u1="&#x178;" u2="&#xeb;" k="102" />
<hkern u1="&#x178;" u2="&#xea;" k="102" />
<hkern u1="&#x178;" u2="&#xe9;" k="102" />
<hkern u1="&#x178;" u2="&#xe8;" k="102" />
<hkern u1="&#x178;" u2="&#xe7;" k="102" />
<hkern u1="&#x178;" u2="&#xe6;" k="102" />
<hkern u1="&#x178;" u2="&#xe5;" k="102" />
<hkern u1="&#x178;" u2="&#xe4;" k="102" />
<hkern u1="&#x178;" u2="&#xe3;" k="102" />
<hkern u1="&#x178;" u2="&#xe2;" k="102" />
<hkern u1="&#x178;" u2="&#xe1;" k="102" />
<hkern u1="&#x178;" u2="&#xe0;" k="102" />
<hkern u1="&#x178;" u2="&#xd8;" k="41" />
<hkern u1="&#x178;" u2="&#xd6;" k="41" />
<hkern u1="&#x178;" u2="&#xd5;" k="41" />
<hkern u1="&#x178;" u2="&#xd4;" k="41" />
<hkern u1="&#x178;" u2="&#xd3;" k="41" />
<hkern u1="&#x178;" u2="&#xd2;" k="41" />
<hkern u1="&#x178;" u2="&#xc7;" k="41" />
<hkern u1="&#x178;" u2="&#xc5;" k="123" />
<hkern u1="&#x178;" u2="&#xc4;" k="123" />
<hkern u1="&#x178;" u2="&#xc3;" k="123" />
<hkern u1="&#x178;" u2="&#xc2;" k="123" />
<hkern u1="&#x178;" u2="&#xc1;" k="123" />
<hkern u1="&#x178;" u2="&#xc0;" k="123" />
<hkern u1="&#x178;" u2="z" k="41" />
<hkern u1="&#x178;" u2="u" k="61" />
<hkern u1="&#x178;" u2="s" k="82" />
<hkern u1="&#x178;" u2="r" k="61" />
<hkern u1="&#x178;" u2="q" k="102" />
<hkern u1="&#x178;" u2="p" k="61" />
<hkern u1="&#x178;" u2="o" k="102" />
<hkern u1="&#x178;" u2="n" k="61" />
<hkern u1="&#x178;" u2="m" k="61" />
<hkern u1="&#x178;" u2="g" k="41" />
<hkern u1="&#x178;" u2="e" k="102" />
<hkern u1="&#x178;" u2="d" k="102" />
<hkern u1="&#x178;" u2="c" k="102" />
<hkern u1="&#x178;" u2="a" k="102" />
<hkern u1="&#x178;" u2="Q" k="41" />
<hkern u1="&#x178;" u2="O" k="41" />
<hkern u1="&#x178;" u2="G" k="41" />
<hkern u1="&#x178;" u2="C" k="41" />
<hkern u1="&#x178;" u2="A" k="123" />
<hkern u1="&#x178;" u2="&#x3f;" k="-41" />
<hkern u1="&#x178;" u2="&#x2e;" k="123" />
<hkern u1="&#x178;" u2="&#x2c;" k="123" />
<hkern u1="&#x2013;" u2="T" k="82" />
<hkern u1="&#x2014;" u2="T" k="82" />
<hkern u1="&#x2018;" u2="&#x178;" k="-20" />
<hkern u1="&#x2018;" u2="&#x153;" k="123" />
<hkern u1="&#x2018;" u2="&#xfc;" k="61" />
<hkern u1="&#x2018;" u2="&#xfb;" k="61" />
<hkern u1="&#x2018;" u2="&#xfa;" k="61" />
<hkern u1="&#x2018;" u2="&#xf9;" k="61" />
<hkern u1="&#x2018;" u2="&#xf8;" k="123" />
<hkern u1="&#x2018;" u2="&#xf6;" k="123" />
<hkern u1="&#x2018;" u2="&#xf5;" k="123" />
<hkern u1="&#x2018;" u2="&#xf4;" k="123" />
<hkern u1="&#x2018;" u2="&#xf3;" k="123" />
<hkern u1="&#x2018;" u2="&#xf2;" k="123" />
<hkern u1="&#x2018;" u2="&#xeb;" k="123" />
<hkern u1="&#x2018;" u2="&#xea;" k="123" />
<hkern u1="&#x2018;" u2="&#xe9;" k="123" />
<hkern u1="&#x2018;" u2="&#xe8;" k="123" />
<hkern u1="&#x2018;" u2="&#xe7;" k="123" />
<hkern u1="&#x2018;" u2="&#xe6;" k="82" />
<hkern u1="&#x2018;" u2="&#xe5;" k="82" />
<hkern u1="&#x2018;" u2="&#xe4;" k="82" />
<hkern u1="&#x2018;" u2="&#xe3;" k="82" />
<hkern u1="&#x2018;" u2="&#xe2;" k="82" />
<hkern u1="&#x2018;" u2="&#xe1;" k="82" />
<hkern u1="&#x2018;" u2="&#xe0;" k="123" />
<hkern u1="&#x2018;" u2="&#xdd;" k="-20" />
<hkern u1="&#x2018;" u2="&#xc5;" k="143" />
<hkern u1="&#x2018;" u2="&#xc4;" k="143" />
<hkern u1="&#x2018;" u2="&#xc3;" k="143" />
<hkern u1="&#x2018;" u2="&#xc2;" k="143" />
<hkern u1="&#x2018;" u2="&#xc1;" k="143" />
<hkern u1="&#x2018;" u2="&#xc0;" k="143" />
<hkern u1="&#x2018;" u2="u" k="61" />
<hkern u1="&#x2018;" u2="s" k="61" />
<hkern u1="&#x2018;" u2="r" k="61" />
<hkern u1="&#x2018;" u2="q" k="123" />
<hkern u1="&#x2018;" u2="p" k="61" />
<hkern u1="&#x2018;" u2="o" k="123" />
<hkern u1="&#x2018;" u2="n" k="61" />
<hkern u1="&#x2018;" u2="m" k="61" />
<hkern u1="&#x2018;" u2="g" k="61" />
<hkern u1="&#x2018;" u2="e" k="123" />
<hkern u1="&#x2018;" u2="d" k="123" />
<hkern u1="&#x2018;" u2="c" k="123" />
<hkern u1="&#x2018;" u2="a" k="82" />
<hkern u1="&#x2018;" u2="Y" k="-20" />
<hkern u1="&#x2018;" u2="W" k="-41" />
<hkern u1="&#x2018;" u2="V" k="-41" />
<hkern u1="&#x2018;" u2="T" k="-41" />
<hkern u1="&#x2018;" u2="A" k="143" />
<hkern u1="&#x2019;" u2="&#x178;" k="-20" />
<hkern u1="&#x2019;" u2="&#x153;" k="123" />
<hkern u1="&#x2019;" u2="&#xfc;" k="61" />
<hkern u1="&#x2019;" u2="&#xfb;" k="61" />
<hkern u1="&#x2019;" u2="&#xfa;" k="61" />
<hkern u1="&#x2019;" u2="&#xf9;" k="61" />
<hkern u1="&#x2019;" u2="&#xf8;" k="123" />
<hkern u1="&#x2019;" u2="&#xf6;" k="123" />
<hkern u1="&#x2019;" u2="&#xf5;" k="123" />
<hkern u1="&#x2019;" u2="&#xf4;" k="123" />
<hkern u1="&#x2019;" u2="&#xf3;" k="123" />
<hkern u1="&#x2019;" u2="&#xf2;" k="123" />
<hkern u1="&#x2019;" u2="&#xeb;" k="123" />
<hkern u1="&#x2019;" u2="&#xea;" k="123" />
<hkern u1="&#x2019;" u2="&#xe9;" k="123" />
<hkern u1="&#x2019;" u2="&#xe8;" k="123" />
<hkern u1="&#x2019;" u2="&#xe7;" k="123" />
<hkern u1="&#x2019;" u2="&#xe6;" k="82" />
<hkern u1="&#x2019;" u2="&#xe5;" k="82" />
<hkern u1="&#x2019;" u2="&#xe4;" k="82" />
<hkern u1="&#x2019;" u2="&#xe3;" k="82" />
<hkern u1="&#x2019;" u2="&#xe2;" k="82" />
<hkern u1="&#x2019;" u2="&#xe1;" k="82" />
<hkern u1="&#x2019;" u2="&#xe0;" k="123" />
<hkern u1="&#x2019;" u2="&#xdd;" k="-20" />
<hkern u1="&#x2019;" u2="&#xc5;" k="143" />
<hkern u1="&#x2019;" u2="&#xc4;" k="143" />
<hkern u1="&#x2019;" u2="&#xc3;" k="143" />
<hkern u1="&#x2019;" u2="&#xc2;" k="143" />
<hkern u1="&#x2019;" u2="&#xc1;" k="143" />
<hkern u1="&#x2019;" u2="&#xc0;" k="143" />
<hkern u1="&#x2019;" u2="u" k="61" />
<hkern u1="&#x2019;" u2="s" k="61" />
<hkern u1="&#x2019;" u2="r" k="61" />
<hkern u1="&#x2019;" u2="q" k="123" />
<hkern u1="&#x2019;" u2="p" k="61" />
<hkern u1="&#x2019;" u2="o" k="123" />
<hkern u1="&#x2019;" u2="n" k="61" />
<hkern u1="&#x2019;" u2="m" k="61" />
<hkern u1="&#x2019;" u2="g" k="61" />
<hkern u1="&#x2019;" u2="e" k="123" />
<hkern u1="&#x2019;" u2="d" k="123" />
<hkern u1="&#x2019;" u2="c" k="123" />
<hkern u1="&#x2019;" u2="a" k="82" />
<hkern u1="&#x2019;" u2="Y" k="-20" />
<hkern u1="&#x2019;" u2="W" k="-41" />
<hkern u1="&#x2019;" u2="V" k="-41" />
<hkern u1="&#x2019;" u2="T" k="-41" />
<hkern u1="&#x2019;" u2="A" k="143" />
<hkern u1="&#x201a;" u2="&#x178;" k="123" />
<hkern u1="&#x201a;" u2="&#x152;" k="102" />
<hkern u1="&#x201a;" u2="&#xdd;" k="123" />
<hkern u1="&#x201a;" u2="&#xdc;" k="41" />
<hkern u1="&#x201a;" u2="&#xdb;" k="41" />
<hkern u1="&#x201a;" u2="&#xda;" k="41" />
<hkern u1="&#x201a;" u2="&#xd9;" k="41" />
<hkern u1="&#x201a;" u2="&#xd8;" k="102" />
<hkern u1="&#x201a;" u2="&#xd6;" k="102" />
<hkern u1="&#x201a;" u2="&#xd5;" k="102" />
<hkern u1="&#x201a;" u2="&#xd4;" k="102" />
<hkern u1="&#x201a;" u2="&#xd3;" k="102" />
<hkern u1="&#x201a;" u2="&#xd2;" k="102" />
<hkern u1="&#x201a;" u2="&#xc7;" k="102" />
<hkern u1="&#x201a;" u2="Y" k="123" />
<hkern u1="&#x201a;" u2="W" k="123" />
<hkern u1="&#x201a;" u2="V" k="123" />
<hkern u1="&#x201a;" u2="U" k="41" />
<hkern u1="&#x201a;" u2="T" k="143" />
<hkern u1="&#x201a;" u2="Q" k="102" />
<hkern u1="&#x201a;" u2="O" k="102" />
<hkern u1="&#x201a;" u2="G" k="102" />
<hkern u1="&#x201a;" u2="C" k="102" />
<hkern u1="&#x201c;" u2="&#x178;" k="-20" />
<hkern u1="&#x201c;" u2="&#x153;" k="123" />
<hkern u1="&#x201c;" u2="&#xfc;" k="61" />
<hkern u1="&#x201c;" u2="&#xfb;" k="61" />
<hkern u1="&#x201c;" u2="&#xfa;" k="61" />
<hkern u1="&#x201c;" u2="&#xf9;" k="61" />
<hkern u1="&#x201c;" u2="&#xf8;" k="123" />
<hkern u1="&#x201c;" u2="&#xf6;" k="123" />
<hkern u1="&#x201c;" u2="&#xf5;" k="123" />
<hkern u1="&#x201c;" u2="&#xf4;" k="123" />
<hkern u1="&#x201c;" u2="&#xf3;" k="123" />
<hkern u1="&#x201c;" u2="&#xf2;" k="123" />
<hkern u1="&#x201c;" u2="&#xeb;" k="123" />
<hkern u1="&#x201c;" u2="&#xea;" k="123" />
<hkern u1="&#x201c;" u2="&#xe9;" k="123" />
<hkern u1="&#x201c;" u2="&#xe8;" k="123" />
<hkern u1="&#x201c;" u2="&#xe7;" k="123" />
<hkern u1="&#x201c;" u2="&#xe6;" k="82" />
<hkern u1="&#x201c;" u2="&#xe5;" k="82" />
<hkern u1="&#x201c;" u2="&#xe4;" k="82" />
<hkern u1="&#x201c;" u2="&#xe3;" k="82" />
<hkern u1="&#x201c;" u2="&#xe2;" k="82" />
<hkern u1="&#x201c;" u2="&#xe1;" k="82" />
<hkern u1="&#x201c;" u2="&#xe0;" k="123" />
<hkern u1="&#x201c;" u2="&#xdd;" k="-20" />
<hkern u1="&#x201c;" u2="&#xc5;" k="143" />
<hkern u1="&#x201c;" u2="&#xc4;" k="143" />
<hkern u1="&#x201c;" u2="&#xc3;" k="143" />
<hkern u1="&#x201c;" u2="&#xc2;" k="143" />
<hkern u1="&#x201c;" u2="&#xc1;" k="143" />
<hkern u1="&#x201c;" u2="&#xc0;" k="143" />
<hkern u1="&#x201c;" u2="u" k="61" />
<hkern u1="&#x201c;" u2="s" k="61" />
<hkern u1="&#x201c;" u2="r" k="61" />
<hkern u1="&#x201c;" u2="q" k="123" />
<hkern u1="&#x201c;" u2="p" k="61" />
<hkern u1="&#x201c;" u2="o" k="123" />
<hkern u1="&#x201c;" u2="n" k="61" />
<hkern u1="&#x201c;" u2="m" k="61" />
<hkern u1="&#x201c;" u2="g" k="61" />
<hkern u1="&#x201c;" u2="e" k="123" />
<hkern u1="&#x201c;" u2="d" k="123" />
<hkern u1="&#x201c;" u2="c" k="123" />
<hkern u1="&#x201c;" u2="a" k="82" />
<hkern u1="&#x201c;" u2="Y" k="-20" />
<hkern u1="&#x201c;" u2="W" k="-41" />
<hkern u1="&#x201c;" u2="V" k="-41" />
<hkern u1="&#x201c;" u2="T" k="-41" />
<hkern u1="&#x201c;" u2="A" k="143" />
<hkern u1="&#x201e;" u2="&#x178;" k="123" />
<hkern u1="&#x201e;" u2="&#x152;" k="102" />
<hkern u1="&#x201e;" u2="&#xdd;" k="123" />
<hkern u1="&#x201e;" u2="&#xdc;" k="41" />
<hkern u1="&#x201e;" u2="&#xdb;" k="41" />
<hkern u1="&#x201e;" u2="&#xda;" k="41" />
<hkern u1="&#x201e;" u2="&#xd9;" k="41" />
<hkern u1="&#x201e;" u2="&#xd8;" k="102" />
<hkern u1="&#x201e;" u2="&#xd6;" k="102" />
<hkern u1="&#x201e;" u2="&#xd5;" k="102" />
<hkern u1="&#x201e;" u2="&#xd4;" k="102" />
<hkern u1="&#x201e;" u2="&#xd3;" k="102" />
<hkern u1="&#x201e;" u2="&#xd2;" k="102" />
<hkern u1="&#x201e;" u2="&#xc7;" k="102" />
<hkern u1="&#x201e;" u2="Y" k="123" />
<hkern u1="&#x201e;" u2="W" k="123" />
<hkern u1="&#x201e;" u2="V" k="123" />
<hkern u1="&#x201e;" u2="U" k="41" />
<hkern u1="&#x201e;" u2="T" k="143" />
<hkern u1="&#x201e;" u2="Q" k="102" />
<hkern u1="&#x201e;" u2="O" k="102" />
<hkern u1="&#x201e;" u2="G" k="102" />
<hkern u1="&#x201e;" u2="C" k="102" />
</font>
</defs></svg> wOFF     V                            FFTM        cToGDEF          GPOS      	-rBGSUB        cOS/2     ^   `xcmap  l    
4Qcvt   	   0   <),fpgm  	@    	zAgasp  <         glyf  D  ?  k4pUhead  M   3   6?hhea  N      $[hmtx  N0  ?  ڒ^loca  Pp    ,+maxp  RH        rname  Rh    wc)post  TT    ﰥprep  VP      D"webf  V      gEQ       =    B    xc`d``b	`b`@1  "  xڭMLG,miӏhc(4)1 bk?LIcҐx@WCXjEQ`	~A.zSNcv+m/23VIeg55ס?{޵[{>j6)yyٽ{)S4	EsNh/rE,LEْt͖ί-r4\:/xOT"H'ĻK?lV:_r )X	IOttJo2OuzMF=|NZ[! 9 o 3< p.n.%p`:܀pIG^cz^UyPGU~Iho?C 	|O)8O0?!Z,*H,l׀WrYrYrYrYrYrYrb{uYY!ќFƍA88GBDG4-Wúrju_23/Jtezjj`L&'~T@.Tғ*wU@%{YPPFC57͡ABgeͼkVh-D
);;+͸G;/bxgdaE0W`5j7&Zۼ6[2U,xU;vTQ?UovoY0:4tgϢE?~9ϢC?~>k9Ț#k9rhʡC+VZYheʢE+V,ZYheʢE+V,ZYhʡC+N6tl/C4-
m=/}i\/w*Cu3tbеkC׆]6tmеkC׆]6tmݥ,UE^xb[:Tfdh[0~fzӏ*:mή!vة=G?Η8MYxb)s_zN[{+icc-+KïP*YBoMvV&4q۽V.FڢvNR`j1V^}Vc:z 46]6kDzc;~XZV}O\ xc`d``bb``qq	aJ,aPI/JfI,c``aH`c	00(0I(TƜDYz"z`h;fO`ڇH U22x g   xc`f`a`e`aj(/21`bffcfeabbyށA!AoiIL
Ar,ۀ3 p_  xc```f`F 1,/%d21g4df`:tBBE%%Yԧ /AA@ABAM#P?G|plzmX?v+W`sprq
	KHJI+(*)khji[XZY;8:9{xzyGDFE'$2wvO1o%˖._z՚mظym;ٽwCQJj/ʲ:f130]SðbWcr[ u#oܹ{NG<Zz{'L:aʜ;Qp
 0>  xc`@Q ̺=?Y3
 7zxڝUiwF$%u3qȄ-0i*v!]],t;Y)#?6'GΛ\cDOq:Tr R>屒 nV)iDl7;K\vr*3%A£W' H4IO?I8(I)8f eJ^R6â*Ϻ`r#\^mq:Im=Q@*F#)9QRRZL~G22e+*u۶uQ4SuFlGDy6N'ζ/LQvͶ1p)%3}tHXձ
ng$(Uy
Qo fg/.dE@np/X)Q\EHJOĉ>xA\P"̡+ά54^coWJMIFSw"Y8Glk>Zݽؑ9qwY'󴘯.7@<)\ڷLQ}eSTh*)hM1M{5wL1C{H#9!7MrӾܴ 7Bnr^@nZܴ+Fu4Χ*idø5Y5ɻ!u*Չ/ȥ\\wiݶv_Z3ꆭ70Єo7uXsPA`R (kN q9MR}14}/{<8-]ZDuܘ=[Luud[1+Iyv%UVދj|dpCh=v)MyT)JepʃZĸujkz!H)]ߴwkxt#9Oq(x~tm^naJ>S}TV-5ͺFNXZ@MHU11eM.oZlUw}sv_esȺڠ\s$E@얬zg2c9u/LNYhS*˖]nˆ9vGhlixb{]\ 84r&6]zjlΕD]s8K7Ǯ|`=ȹpr>%3rn|N!%rCG#r6$+rbrrn<&	9_CB6&Pj6k>}`هzdK"RܘPR_,"v$sah     xڥ	`TE \sfr' H9<r B *""x x˺y$ h LޫꪆPRF($QHt[,}g@[>ǻ9n`mc-Қ-OI\:7$  ᥄RK(KMYEG6xݟrzSY8@,PCC	[i9BQ@L	Q%|@l@z-MZW/I2鯖[)!(ĤEʔHJ6R(ȫ|'>.6r:lbpIt|W!U{F{Z
hBAu}-LĖ7`jVؤ5Ǵ^k6a˅3҅LS\ 
q }iI̌d5(HTx (HRA$˞2-ׯv9eW68eIu{]n%=ÖJwEps#F~v+F}ĳSfܼ|97_ =}[49-Z:XkuE-d33Epz#Df_NwD#:nL!EʹF$ǵYJLR"r%e\-#--5--͛pFlӽ䔽H?/ԍ;<a:8nղ{C0?:>y`]_!8![^_zigߖO_z	}>O! K.N m٨}բ> 綉%DH%>d"JeݓRSFw
7#"ER^.g+n%꫏}Fauʸr>;%޵@Y-Z<g)\i5hӛWOynV0`h?&W&zX1쎩#np;="1[
|{sn6A|K뻙
 `*K¡堶lՎ4Rb}f3sDDm68`"OZaa*^b>YLix @OfEvHZ#,fZ(we)+qx^D}3vaQH-90p
Z6EYk2d6iiZI[v-Te,mLrA;TT*AKf64-׆槳aV^]Ev|.~?$AEJ(:d";PF>7r^ 'ޥwp|M	-(D50aJ@6A;=	%O.݆\*]\
ﱙ9rg E9O\JP}bۗni)^}Qrsb20KjN~s24wYqryv'bo}ck_|eǎW^FhK{`1̃aT[m^0`&"Ѱ8mRDqcEz=^[H2O5GhUb֚Q	_]Y:1C:HM2xAt gA>QPP\Ql˶^}z;'і5n۞-uK,Ȼ/D|$~&DhG(m@AJTLnǂyҲ&	\Nѓ]N^D/oD)Eiگ}]8ѧŧ7={fᦷ?u NЉ:Ěv<AVd<+BIU"B"S2	>kreaaa0fǭdB\|#[{l/Wqn؀ZТm49'Z`斊rKl.'|V#(rZqY]fdPElP|DG,5N8D AA+'"д4}{~%Ӟo?{6lf~~x@F}t\%QŖ"^1$2LAP,TjBTt*W".,.6%)6=.=-B.D~.I9d O!'1'h̖{7>4:aAwMA0}{>}nm7r2NF>$MH܎ŧB0cfqZF@9k9*lp-@^8ȋ4KռΩvYH{/qJ)ėFb FfRޘX0/]92"Re-XSmͯ[?G`Ҫg=H'm}ఃw/=3<V}=bnV\^Mn]3pmZqj$KTnB miSS32QiLhQt#o$pNd!}. ?9T |{;_y7ܹys<%>IP=ng}
Oa©v[;ttp!栿6[MMzI]]744wAEֽ\B&|dJR*52̌*=B:ЕĒ}1*C4zZ_}9XЗfLX2m"iyK( l*Ӧj2ӢWxSTfO,I~M~D_[Q5qY@\) "4X{^C<z^:'8'cSDD(nLwDA@H}dp?C05LIHoEO5lpߌ5k~ɤ
o,_Λ1[eFtQ0>R;#DoyTv} , ,PdIb&bP
d#KYfT	eQL:_@- XTVFƗp5L=ne9H]V%{S0<eT|%%/i7O{`__@tn>9+P1`Յa?1\[YR;7mIwuKj˯Cڣojiu0$绵Vu?AHfq%j2ZȌ.w< j`
~<Bz;ߝM{3B@tBGf+Gޞu֠]BklI8[ĘJ<e*%\pؤ4Ovȓpx1mם'<)6$_ܓ5J{  Jڻgbg|c!{}X ϭh[~&=T#1	APD0C53E[НGCI%m;JP[{:k#k>6>3Y&=Mmk:?@KGK!LmK|¨Г\6O
7ɧݬ6Jgjw~wڽڝ^>Q4vZVT}(+QZQLֈC[ &&K嬐A_|86ʀr?3IU\n+HW7!Q#|,zDD`J*`#B_Vt6h᝭j/UϦl'D:ޠАH/Vm>y?v@	\*m(=TwB=X3F[^yN#aشᥬ;F)FDܲQLOr1qOe!6÷D[~qd#K\χ5T0Ch5l'35вA-G;3w?6jk`^0H[ݪVs'	&mbᥠ9Xr*@ n]8yq3-- n<ę6v:'HӊO"FY3ޕc]=/&"G̤HBY@7ŐD6yA16RY#MRE]܏]Ī]8h<a,wyĪW#	ݶ\z>
䖍Fal ٿ2af L7ܖxtM!K-hTNj[:yPw
b@Y]Ծ񙩰XMGrL{m{|ڍ݋DX6ȷW0Jxl+`ӫP,ƀZZο˧GcE{b3Op-f+fV	\:%*rnվ$!'>֖G?!0PAd~RF<l !Nk$~)lya>#4u0 jwjkһ?.,ow45O>CzqySi$GF;#bPbڢ~o+:{h$/IT8tFyƇ?{^ݺw<a`z7>yGC_Xdy͐uh{*|RXbuS
Z.2Y󉉚q9{6fGY9N?RۈJNI%̀Mڧ(W_h_B"$l)_ߜ5X̳҄&N#Bg1=
Į3gìDgoՒxvg?ڣy춊rR)m62:{9	#${% *LI6c*8M)0|,H,6=Ǐy-i6u1ʹ@{f`v.3~33sڀpN{=kk@5@s{$AyV՞sv9 &Z=RZޡ90mq1+e(L[n_<ZLBMI@Va2nȅ:;_ì@F4`.N^/ȟM:PKwr$ i]?; jǏū&3/Ms,C=^
܏Oe=L=ؾ_Njshpo,Rv^(4 qpN&;jT߁B%P޲S:.,?Le,R=YUnSDL$XW}!yym`7%=qk{!h;f/V _H:؁I%XDngB`.5$EA?>4,Z3b-|y=
AahaPbǼM|w?s/<e|WGo2j˚vI4/Cd'ym.+r+0Z(t,ɱ%&䵛ioD)QV-5*e{Zy+j;HRBq#).pYXAK/cΪh"pʉ[Q+o~=	EDA)znk[w۽Gjj";5F64`;߾GY/WG0}rQ,Bd$1n=ait v+ϣ?̣T<)mN߯5~U{%MNHU2'/~[h;gu23Vy|QıɕK.M^m"߻vONW\Ƞg+98B' WG6oW4PZ.)xtZ6o{,75-~&XUts[`qЩZZN$|r*QmMu+,*HV#2$&vqGGE19ij=<]!UV<k xu̪i7!+ݴ	i(Fzj?=squWN1}JDDOɸlP	K0ӍS<1U#y%@F)^5~V_y髮xHtLxsvxdw-n^/W.d^gќ|HT=f
P(҄i	ة=۾l6LqFX#$˜+K[N6#KenziGGnpzRl,LqH({נEz ƿډ+^y]]S{P~Ǻکʇok;n[+uǣG䪮ݻ{Wz 54ozeSӞ8hl5WXrZ&/b$='շPr0A{:h=COԪ윂8S6WA7 ʦSXXs	$
CoY{ti4S5\F$YA@R{!sRQ*}9&.Nzb2.KNwB/mԜ^8ר!<{#r1|EǒCSqɝuI~}$R_VsV;wI)>VG< #x5Lf):T"-'^h{߈
ՔgU9S"lMvd17b|m	8Mn5ԷY[,;[~NA,'0J̎z/،CT?c8/7J%j/AB$	i^F+RYhSIj-T7,&ToAqsqG[6Y\tS&<aBK:`ݻ[ݷh`)o~xZ,^;𘉇Nfz8CkC*؉c\6]rզ˸6]u'1wZϨ6
=1UZ@~F.l=g79B=y
π]_aں!.CA@aʍ!Ѳ@G'fxA6,	Wf}CuT5wig0<Y3ps)>eLIa'Hm8k(2H|#ٙlvHv_$QECM{ܹO͕U<cl;kNH@쀜v
6.Pǘe_=M#VVwot6K=`Ns\{BE)}HvnS7n֭N}}N3QxıB?-{jCO^zbM˗mX;J!GKVLգȩCSRWRS>84]:GHqbO30DYBˏݣJYvjy%ztAg4{?x5e1<I9VX?ކ}BƎB۽*xX!X#9!|Ś5TfWu7NӚmUXkN/l5Xw%,hyQ"`4ɢaa^R`eXآnklmF45xN(d'j9$e2fRZV<w/&Q΃|E'+j߻dWΏ[;rNʦ['j&kH_bz@d5,ch	p"nGZkNV½k۴ӮԪ?އx4RV`{.Uz\Ms8XwY_"Zu_7jOҳRyqe8ҷQVTmL᪶v'X@~"ԵJbB ])عKY;%= P;pKM]l_t/|Շ;k+nl#O~p4XT06qPn8!`,duRsv[\&璛xMEiX@"Fs0-G˱[g ҳIb(;7$nQpqXTZ_1.FϜ;Ofy}P^;~|M+w'Z 7-q,S	Iy6^POG$2

'\RTPOqs|VpGY*R:λfin{Ԣn"]a3;*Tva1^iB<FZgTV=mkh0qSeo^|]b4N  m	ԗ-\F5tG ceuYtt0l$)%LeyӼ7JćQHw;GcuN8P;&[{5CIo!۳skAk5Jo^j$1=ZLkI[/k)K"Iuŉ'Bzп\jIqGWZKMUv	GYuLNK"Zōh43Hꉵ!wkY&*ESP-hފDN;ųGtr8}O.)C'!#1sȩ掕2
܌؏ԭ|ƺ轲_1Sڔ;^9C=cgUg^]~ukbg@ L̅ ?Q@ʴМՌnW VANvNўU̥	-*NTh'!lo-+_D`lzM맵/+~pKlQ@|ҭZ;qnT0'.!BIDe,N>})ik\@f}hNr
gHX3=s7ڽ??6zcu-YrI쪨Q4bS2sSjW.o1Ӵ;$+P_з(Κy%0D:BLFvC*tBY7~ÓST?]2oz=esr#|bLg[?LFkA(-.nvV_4s4:A]oq9YO\-pE^=#zk﫚;800m/'G<vNK;[,{eہ59_/uh>mI;[{7{k't.Veқ<diCuRԪU-K }UlHh)'.ۍ5C4=G:<UZY5=>׉ft)`Hh!e񨕗)wݬM_7lt9_jMa3nd=tpk>
(8ZBg*b!GxL/0^vms("M+ށ&Qi4gkkupg|۷-R-HWP2+Oyz拑-/*.]
[?{LzQEB<3uZc`	SKHx	ϴեs})l<$tDa:lGg7>=[?TLɘO[͇&!a"?RM.NQf	)şY}0E^P&Q&&lhp_PBj+w|7LQ7X[7_tSO~S[߼hŷWiM%	it`M&JՏVBb>BA	*b-I/r18EmfF :wtF[`>b~AQ(g$xc6=wQ^ޡVVdfתQcnIouZٳR2t5Ԣ3n7vw\œ0q03iѣM5<ؽ7u_zo'ϕOz>5E*˫F-Q,j^(8kf#8v^GuhF\*mGSa/uu>>4s5Eϴ}RYLaXLCb\em~JK^=;>wr4]=tLA嬠4Bv(2E*(+a1bn
Q磉$φf,?W7-d{kV+&~9Q;KoEYf:?W9FYkSSi?[sr5v
qL(Me]ʒQǈq⒊+Wvz⤰5!gqly_@ȬWkZg^ +0vtCxɮޖwC?Ю"4F[<UdI< ݸiG6Q'saӛwܢ
K 臼2BHW{9"aφf-oVKo3&trZ/i12V!_3}dZn1+B&$LMSXǙeAWdE#$&ZV
1nk׆72}Z֖I|	C
c(,+BV6i}I	͸"}(b%:
qY)l-VA80T`

9*[$(鷣!+%aaV˺w˟ۭKNNYL_L' mü8d29BxO
HMz\<q),ZF?dh.@UD-=Xeiog]KL}9pEu-ض̯?>
y⍼IaP:cT#PApʒL$*5_5(cĕØuY,p%AT2?t⢭B;
\CmJnqLw#xO:jѸF%jئnHOKMJuY,Lxrv4d\'OdB%1 $v&I&0Df)yV*^B/{M@lZvFߵdD̩R&m[5|_̤遇xNx+{mJHۭ^gVN]:n!ǻXh3m2}ID`	}d*0N	韗eZKe.3=I@nGkU'tOrBMݦ8]{iQKDۨ8YAkvwD%%÷GPEfVwIǈݎu
c	ԪV7;G-C7#TubؤoWl_bE{56t9]sNf
MfԴ`f1n),2xjyz-Q(cbd
_1Ev
Vp"춈pQbݞHm09Njs[#
p`t5=yng5=>P*}'?l4J5Vl am
dӦvs Nkn[qc{=ϣ=nӓ\"Ea`&
b
`c791>.&މ"R={96&O2]Lj"&TmN;!BN=LoߖU`c0zcV2\NnepMZH&IPLb}{U:ܸn]sө)Iyqyl]qGm(RQF
|-{/a(t <Kku)ZsOXM)CM=U4<>p=\<h?m`%'Q&D'XTHQK|kDdؠ>qAuH̕e'P#+jKl6>Bg/&ϊF6=nzĕr[c!>`:=־yn_	nB;=F ܞjXGG]V 9%9>)26~TVtt1VB	p[&qژtv)9m	#NVAMD50bK}	F\uEvi1LN&IjqPk%q^;0IZ+XEZGş%S~ồh| x~L$;Ax,^9w⠾96^X׾O|ƒq}{k6O8#r:0snx֗45ʅGXgb{bqkteWW?FuDMf'8+alILfl.	7#K-1<5W[{LL嗿X&tfd/qJv#_2ȩNfT 	HTLW
	@.9**QѵK+PANǱ]v.\NH/9J8B() %7kxF?#1mHouªA*B&-VjM!Vaa*"9.Q!d3T
{sPtNoҠ^wLeJkMsT"BPav)
٭]a7JH:
IAnKg >ztJ8Edbɦ<v4 
OGJj$EwF(p!o\|:ejJﾢvFb,8Q~Z5ݟ${^ ç\OrR"N[TEI:GEeK)Q

=Ka8BN EtO?>j,;ІZ޺iv Iyn|=kY/rpH2^'}dIWõ19uY	u)^mkN6s?ɿ =KgNdu,d%
=KOY@eY2!ˤJ; g$<KO1W,=Fcpe3-Z$!Q PMQg$`dL%aĆ0ڏ&Ѐx*9REyF'WuY~y9("nZV)0^}\}7Uk7Q\	[KAl;7pK8nrusEqRe۶iL1ۉΣ}](3>'O1O<|ݨSD5:bX7ƨF||@2
JYELbS_gj::F"uB:zy8u.À62zi!e}XRta$1?s_H7Bjk,맕4E*/4sm$Lf[\Nvak
$627z"w͐0(晞]KCL.>~zB19O:#Oy}K{^˴vN{oB+~CW-xP}Ou=sf/|u`jRh","+{ # .L;Xg+`iO!B({I<ԅIH_"K8Fl.+{v+Xkkfk'36~7ӗ+}Yڮ?Z	RℶŽ?\=
˫f^y[98zR!eIR*Qr^en]:g1c5XE&d#hF:]Ы+2>^L^qu ѯp'|O-2AMeF/R˥Zڮۚ)	m|]n޽% =Ş-rh[-G
w<k9E>vt˒MW=`g_X8nPӬ4=Gg޻>0׍&Y,_>?4?PRq˂α}=EȢ1Рc0b`tUUm qhvppuG7c?-1!'q;IȭBr!F(va.00_='%!>AK078>csCb˕`QEl %!(4dlCt"KDy7xk	̂Ű֘3)d1lI
#gi>y<QpLڗ+>mCr<\.Bc]))l^津y,l{u˦@h>槿^}ږ;
tS^&-e'ov6H\o`R*u^T$%?5fbpݘ"\A-'dɍZ*}n?%&xoLZT?51Sۿ#'?@g_y߇fQe0Cy׈vWT~h*Wrt2?zLXY /rtKy6n/yw |D~+BM--]оX+A=vGv\;49%Mf`V,:15aOܥvHs^n$[?;獏uG;l>H	gfIh~>ttӧK7.}a}=gdzt7=;ؾ爸y(jΥv޽l=_~l]j͗qew~*+ĘYo
^#aAgct{l[;-cM t8XcvA/dj(iߕ.59cؑ'O^{N=jRpr#sBBX,n?Fm\T4w`in?v1%pqS[$qKhhFkYNdchv/#b4nc.g$iE))9}-U݆wJUنXO|qF\y`M_gBwW[?^pBIj<w2DLNbF~i2!oR0sDOҎoAXKCT~a[_^UשqtLݩti$5#~u`.qAXb A|2l#H'46t*I*C"n[S!V"8dB6ZMֈp܁;"!-QӨӜ?B$ny%ߠ^5-u3bTscGb/dKXWw%;nl3NuJ/V`(5δBGL"> y\e륶Oy_rjv},DHD}ƈF>g}̃kma6~9;|v3=5iq~boo/pûj\a\# .HXƎdI,0.>b$dETOJrB<kɳ-N)BD}3CO/*wYp^~I+RӞ}|\sۥS7⣟MeTn +fVρ-+L>y3-u0I	n%S)l;kxoFfAn<y.
г#j֜Ŋŧ?[\-*_Яb:-L='OsD/mSvstV(*nHJ6GDZNf7횁|l{ߤ#$DY<$:N;үQu6rv~MsjDZ*enK.mm]](L)<(!'rpEPMZoxsh%&J7	aL|TKiη@F3טT"iQb6^X?c渓J,5T`HDQFKD1ӵj~3ӽ[}k0[:H(L$r
<?5d	0SFY0hG;˰7aD>t&OPJ+PcRvK WKvxc`d```%5g<Wy8{U:b 	$
 o4 xc`d`HH2o':
  1 xm1hA߻?R;8"%8PRdB	:8%HU Щd("!C	1RB!CVQ!QwM$ww}{H\ WMTņŜA/ `]mbCO#CⲊU=Q$[,vt9'I,(yM^51,5OБ?(yG1 )vm
ǵ#j%q}oc9naFҬslW3Sg&6%in(REQ?@Xbꪃ=	CWPRsucobQWٓ;tf9;65>.5i~.I{rϴ) r{;'N^fIrG(e~L"}"Bpjp>%8ߩDlyxU8z&-8/COBw*zἦ:/c(gUVQ'S=OU3_gԇ\'#meTaGwbo;6WONL"ߧvozeSkcYCo/P xc``Ё;qܘ:1bc`acb>Ek6l^뱷qqqliyWW	vExxxx\Ż>9>#QsF	$$"""tMOKx?+6S,FuD?Ɉ%B	$B$fI%&'Aꌴt4Cddjdr*ɆVȮ"'$%7C|
Kf(PXL7%"9Jǔ>)(((_QaPQRiQYD5FZu0,b4i	iyheim]GN]& EWdһ `CP0ʰp;FbFFEFS9,@hgIS] :       A  @   z  n  4g  xڝS.A===ޏ ""i=#G&$6g|GXn0HRէn{{6d3&qQlcp֨NLX)]wczU܇Dӿ{Ńص0b(F]V1;RϾ2J(rFW( '
P.x3δRһN
y,6/uX-
DvhA{Y@\Cz9gpgD{rWC364YOn(jIpJ[jRG.=k(H2Tn2U׽A߫پGFOD<9.d<o4T"j=Uzq\ᬲ:9QS%O:"J-ǧ_k1/kg1.Wr.٠%uqnVyr"}_XQpYye1u7G  xmUlqm]۹N놷ݝV	^nI]r#HD0K$HɤJdIKPHŔPJ+Zӆ=H':Ӆt;4tذSr*AOzћ>N\70AfCpF0Qfcx&0ILf
Stf0*1p*z=İa61Xr_78]nsYfܧ;1x#>'<vg9<jc̧ XB,,gJV|xINq׼I$H$IHIdHdI69y.p8*9\:W$W$|)"))5j)TX,]Ҫ++ÍJM+JҮ,S:55W_(XS]菔tODa3Cĭ"ՕVr[9yR   K RXY  c #D#pE  K QKSZX4(Y`f UX%aEc#b#D***Y(	ERD*D$QX@XD&QX XDYYYY D QgD  7P  QO       ,   LP [  @(             Q                   O p e n   S a n s   L i g h t    I t a l i c    V e r s i o n   1 . 1 0   , O p e n   S a n s   L i g h t   I t a l i c     BSGP                 p 76 H *PxZWh[qJx"cr,g,E&CĶ@tXY'&'}LFMlwScچ"bdxQ)NՔ+Z9*TiZ+mFMVBSkbZAVq<OuaKW_!&,5P[= yՐ6ҠuTϟDzlFI<U{@`&͠69|r
5aN@
@ܞ,6	` EՂ,K7FMs&B[(8&<bss_im֐|C2! U
&L$\o< )(& 9HV98^=P؞rC0M~0p>]:@VӖY8rnhԃԘVzV	hqP砧@s %%<c<P"éAE qUEVG,XW_%y~j R;K@@ew0vX\={gW\dJZVff'o-ue-מ\>uV&lSH8k$út0iftņ>gmC$8%f0V` |lщ1'mWmj:[Dt HE/A`u'w,bXVüۈBkS,ɀo烽/I$5F
.f\|.άgg2
Y_ Zo7E\3l=h״uZ<]!iIZNғ]'F2;Q{2+e41{畼G%iֱAl]$siL8{]M-L0Me`ո-bu,"|3T7# B0^("A]Jd(*AY^HZB@I	9L!̯M]Q$ u|va\-_ [$&jjm-2g-BO-R-r--h-i-QϨ[HPt/Hߗ$ Cz ӡ 4I~b3`Z(]d13hx4.ĀeϯqM6	q@=V'a~n<BE.D#]"\}FF?1{;v]T(`AHUC%QN:'PWzDTJ&D/΢Cv7AR9!:.xz8Cz.={gH"ArX
	ELm*^1oX0>1 S5E`<4ԌIRU2@JJ*Oc:}*@P`@hB;p%<ׯñnH>N؅f$&d2sPueh3@3ٻi-`!x
=L^'D.VVM_\yXLg<,?AD;dpnt5#fȌO^pOx	t`)0 C ;}Nh|EȆbQw_	W8@G[Xsی\=%H|ނjg0,ʟKA<6j&ˬ2ƪm	edO@XT%5p]17AgA N`,gsh^>C3uaAVc(j/;0"w ]??_E;Ȏtw#4wgOb w_Qu|PtXrsBs6/Ot6OZ_
C{?R&A=_yqD(s(z7]:?rY/Oi6e>΍/붾SWj})I ,1v pL*	FA@8P<$L} ` E\Oti!h/RB@-A߮`@ +zɣE#(&jD<mvrǹhɥnSp1O LP\"BcDKbUqԜ	-JxM,1<b*+&1= qEsk~{Gp0"MdYj^I<RhݭhT6]BPT(ƨ"D_C-O"&" y	(˒djd{h ߉ހ_)!=|YY*{琦^kVĹn#Q&G`H@5èD@;o`.!F9	PA/x9U4LS^VgW_PD&_x `guN
Lܨ:ʲ2w9"%	]dA*ᐹgG<p,Q2pDg̡6|gȄvy7Gop R$CB	hуP{_1a.9E8ڎ12@m1ÒlA
t)d(tUo@ѥmC9F` f`ʁP :nr	4T%2".IeZMJ5txO0sn_".c} n/u]$q+qS4$
O[Fa1Ą膸mӤZ^)Hu)[wH")`֌@#ݘP\NkRRV>0<|62Ӝv	%tI?e90Ji)#0ޣv+0/@ÔV° 	]silV0MXi=V/`r
`E%J1첋rxɂ^r 6brQ~@	ʲV^NA94	W1f3,3Eo12Q@]$ĉ4:l=̩.EBB T8{Jr%TITsEZ|D;&pk̞rc8'3PJ}T
B0&n0LHz
٤PS8zH7C'/")\sO1;˓؍
U5ަgD")KGRнPm*Se^uEs
qF5$>Zpi.- /dHՓtlyspw`KV 0v;O?zU)"\3x,m2QnA4 ӱ!xCYԱ%4ZI[HF}bzLB-\N$pa.$)	pDzgX	șu7FD9к[5`I+VA~Q-04@G~(x&ޘ+'6*řh7H>]I%ʣyaPc+uꎽ[Vᨼ6X,A-4NsL>z7Aia$HLU"!BP5Ԛ9y\o8, Zz\HvS7F҅wbסY),9}JyOLdbD0EmpH8D>5m4_U 8\ C5T2 [x칅dKƭF(f(^M:QgE	[-mBVS*@ )r#`mun*@n?*iلC($*p<+&ƥmCU~Okk/\,ˡ|A;3.B$@mR%gKMW@yW9qlm@! j/	o:qzRLr6$:OKv	"/u̷]P&랭AsO7z4o~9HT
R'jvDSgm$VcT$$a:ܛ'SV6B͎(pSF`3PW]k	63Y<D7Uuxt:Qj.Eɭ>5ٹƦuQ2*^uЌAՌO.)F2=VTbALT̀l	Rq@{A[;:vZ0g="`JI0$l%V*Lcg;ll%;$ljmab#{>X|ڕ{HޡSS'v؍wD|>4h GZDtUbU^Jҝy	 %?UcGPЍGN;P6|أ?yΛͷ,yuY/z\J5Yah/x!}ЁH+TBF]В&4zX,M{׮2ۺxʠ/ex~5zd儀è[`[C,|0Z1MK[)<)7C4S*FVyCVq"p?8+;Y81qiFZ\XH<RSH ooDyߢ*c[X]eOLzSkLT	pw#cȗ|8v݃r	D+_a TbA7$iSQTN/"<EnI|4BMĈǔ*{d sԸ;EW1P'AM=䪩2y H|KZbxݘhNQ]9dQ7yHOri(ǪD\`7bRXjN`L^1:y"%gTj,NBdѰԒ$dY^lz*a(rsZ8"	Q
Q̨=x_b
:D o*$<.:S:#%Y!m鹒3H
/ir೅BZ gjBxw	߅:T+N@9EPl;[4	SAYȿK=	<HXB757gޭ1ʿPI	M&{5_3XXuѥ,B0Wg`踼]&beVL'j|'U=aBuWE#^LoX.XOcsa,y31ssUf0ܳ5 x
!wЙd ܀vH=,nhhuȶh%dLجؠlKaZCr'G>rXmNo߸Bcɽ|aDbz8I,M l8L+ c""4@08@Nr:&rx38,ֹfԴJKR{lMcҸ$_i5'쑙'Ug8_eJx	W72WF:,"$[~=<VN-`@0"X
"z0tBSX!&&0.,lhL7:X*&<U'*ӱ&gS7#bTU?Y9)lY"'B!XK|M1!{=Z@3qijdWԴ)7f"G>C걤<%OuvUn;u"zAJMH$9Ӭ2Y	=+[$x(	;&(	.G	eNO
NbQf3d)ԙ ;FX{<i53qgxMklH<xG>.mb&)Hi5Aʮ(ω22Q(,$!Vzڮ`,|!W'Q\^rN+O@m5Lu"ZB?gt]G	kJjZQ =}pk	O}1ppIuPf=jNYN UQF1y`66'g#3:bpJ@v<Ȝ.kfwRk:Nڠw~Zwtf;r'4_w  ņz85Tā
%
+p>OLǇl7>R׌5C.zim*-  !&MDz"Jfr(Ld0NC驡%󱿮%0#Ư3/H",9Qpbjѫ^3ZHiUV2A!vibcC_xlT]"U%k3Bp!)t\f/gim3i]#L]օM)|.v/N6N1vNkTx+V.2B~84٢trٯIt0!.I'Չk/	<ܠ[Bc#V&oӻ(8"5ʠrгZЕ]+mI<&Am ȄBɔIe|.Z]1+w*5wvV88 =H(v*/L\|U̿$>Dom;Pi[gr
oStݵ2B)LEK"]hYS~U,"VyKփR	 8\h~z+WS&~D?["/AMIkO&BMCFp2:Jك3܅565Ócoz2.՟lhoj9쿅5HiVR1P"-6Sˎc.w+Lu4d"q[c9Ĝ19MZ'k#%rd{{w6T+u|qXji0:h)JPG?]ޟY%eCMY45	Y>j޵>x+`嵊%#I8W5)20U\lR2ځ/qJ~rT\VI]Ήz0Ћm#_[ơ- 1nGnWP#{)$	
C&&xiRTDa3͌5Khvb@(썘8YB\S:t@>xTИ	zf=_TҏEsI4;"hڌ1]CLŹ@q=@p]K	o>S:T4Ԉ:M`lZic8tsKe-E6MJgs2"3	IFէ{^f_I+؞#,'R	jxERu9a7ӌ&I8F6)MWC=Z(TKO3@߷`BO֓,vudҎd1
B&:b$"p9VSis4S/ml@z7Mu@;-|ŝwgii({Œ9*8&!VUDE-hiA>fQC)HUDGfǊ؉eCxuZ^*WVQ_Ayv:/a_[ ~)A@",-~Ah&~DP0uU0웛LQ<R!-E$O255kYn	GNhOPfKCv
G\9N&& )wE	9XREE`߹g:sPL{mډsڀ!KV@+?h%h:0fgy)E#LVP~Cv;7ԌRUo#"FM;zUY`tL"rrYuCY]mԑP2n@-o#BT"[F`TfcH mM線Kh!v7T5%.uzd_ p%4	NxP	?ka<iP節HKbCD)N
APeżU1dVkbC @@(#ШER{8bejL.cPo-΅+f_c{)^g$n"w}9yW͟ӆBZw%%Z@jn5reR14yh	0ȁ|jJŰF)3
{ܗz-xN֘g^""
V>':QvA+/kZ~sC؈gأt*^-mjv}o(RP\8w#C>sxLxVlb4",z1#PqlȁhvvP!j1kN޺5Qu S7o .="fi	1ܶ s}wbla47M6Dv/4O%`2+JS%& pZc|f5..7M!1vw؇DҘY&tZ+i؈?'Y##Ru"2Ni~LFMF2˜EBY*)$.X@{;,B1j	Irw =;~v	t+9Q{EC0m;7ddO_Go}ף}X5&z!eV[97"0dml7p,_8MAclZjԇ!__c<T|8ayJOpi\E'A8C4gO5SQ9ٺs=@bAǁp(8bg(.JbBuc#qt9tmajw7>DliO$nSrbC*Iec:?m1(=:8vT?f_Aܙ!ُ+Bx@ZC"e̪BhoKz,0+0JY12?鬥P4 (0T'[JfNxlr^\ʎ U%G;hxLM9X"Ȏy{7GL32߄tv9.[ɾUDˬQo OaIű4rșKo=i;cTڌmAqĩ4'|Bg	UhtiK^n46c"H-M=_k!Ȍy2LcUk0&Sp`'X0K
w d 0\C"֕DCI$'os
GM٣t$J!]D8A;P[TU2.ӌDMU}{{>ћU겁K3f/s!rO 
)!459cNF?F__ޡ~W8MEz	:d!eVxնb\d[Wd^φej bt.99{P#ݵ".uI܏d$5'vf~{D	_~;8ijfRU5KTtsG"&݅EInq4aiG#qR0,IvEsKo'L̀F	DM8A"Px3JYP$×YcX)%.myY
x8Lfpttv&y|HWE	2}ŋ2LϠb_x'	) ,BWE" TemNy+gHlyD6ۺ"9
B0ÒXa"Kw%dD3nHm$MsWJ0(_*|%"+D4`ʥ}8\"eUmZy6Vi\3%՜U8'ͤcS,񨹬*׬r26eKKBk)ᒒ}>Aϲ&VFCٻuzD~+/ !e@Q`J7%"m %8C!kӣj?t<BNm= ɮ"cMNQ\: 1@@::JIzQʦEZ:/k@s zϡ8@:R߉׵ѸF%̴LWqE*{NSBA-+~7j:SU,4
Ac"l?6HjՐ'}r
N0$*܅x]t#m\_RU)wI3v}0D^#e__ue:cRԑG%egUEKQB cm^PRPa(sJޥQ,']44pom1.KR	͘} `v;Q3P2M
!2SclU3bC%	뫠Eh ,bB.HJ?.%pr4Ӟ8HvXSDzbV<-pԨ{$/	޼4H"hr6p}&|PM|)%3*CCEy]&#JTNT6p_k;`F?^	]DbI* M(JdNNVot7y%j^r'CHu}wsAg*Dc~s43AS-fR3D,P{L&
H
|C[-(t .+uG6B*k;HWl9<fW{
0K^tP)wFrxm)(lEsp\MBDpABF-L"/󦁒+,d}n\1R,UP!'N0'B?{KtKCz^lϿY>K4/1EmeA硚eƀlH0RXD	%CaLQd+Xn/Rd2w$@4.+Ċ֐cf\~@~[¶#H֥ h)C;*<V/Dj{zQcW0DɌRݳQ{,#<tE'Ĩ4\Ϫ	}P-2wSKhԜ{6!Z[>ZD&	a|L-d$!9Wbo=)Dp]bO`W	U"̕ޥF&2,2DMیBD,TXD$DD?F
Vp7,"WE_:;~u]0JZoW<X"14i;Dpaٔ0}H,-NnQ7s:MbUe8"rraoޗbKS#~ǖ4tڕwb{Lnm!^S\RR4΢Βm8Ē1FdK$&#j7EE^jwW$`QT2ߺF^A0 :)Yȳ^3s"]^Y
_5W*ؓCѓp
{&)DPw>"/#fdu".%^_`*6tX*}YUue0"GCWdd>F4Cnְ#_hְ up{ePztѨyq~aTSQBS$bHdh%_gkrTHz6x@|. 7sy|w+7Ă)$*ΐZ`b-@q/QedAQCэ<.Y%ϙCnnp3lHz99c6d8=$x[p5)bZQ 
iO$i0U^+NyH A(
:*Q3;俍`sLgg($v}l1NRh	BYf5Ug	?^|<*Aɖ<.䢑&^nW >1}w=pyKDx\;Ǣ148!4>h[JSqs8KdHrS X1A˔3Cp+mōPk  D%;}	IfG[˂?n0,H{o.;+
ɃC?We_r]Ո!k		<hյ}(I]CG.S>g7y=a߭	Hamў^#z"t (]SP_Yj	8\pIkˤ֩K* Dh OTdo3_%xl$7yɔH%
쓂uVmwX
||9wP2V+rv/Ԏ.UTbn7Cs=n KHS(3jB5{Axff":q*.PIEQŖ"/QYl:Otmc_E)m^QE(2`j삋dZр4Z+8JTcACG
lGB{kk_}%M0v pQ`[f 1Ər01^3. BH1=}yhy 35CL*N84"Y"zT΄+pzŉI;p)B M8JS'&l.{	i:kS6ʅ!Ҿ _֚TZH`]\F*afV
zgE-#[bS	
M]!TU~VhbnāC`m >tCg"jL-~.%&8^a3+eܒB Y3UR9,05TSSi,3!3y޽	Z5t	Jt⵪d4Z(trg1JoҒgJHfqXj
l>G1ayo@Yqi$g6nk|cq2I, RђNx CcwbŸb+a?"^;
Rqn[ 4h>e$Eº{֜Pq*:jm͕/Hg	$[;9qCLo
̗;+jLW˙vXۨ%Y i=%
ڐ:$s{&vErhgAB'OFFN*=/1!+yAv!.Sv@z( D'S.[GL(\0W}( U-ަU v[K-
R\,g)`7@-52J'O-R5~4DuX'`cZY3_DZDS*mKi1Dx\rn	 lu('A:v{gp@|rτ@k-%~vʯHiFmNat,Rx5ܹfOhܠrAkOk؁].OUjQ @ at¯*gрQ.N(8]XX씨©"5M:*4ygkʴ:
YDH8 S+GgTw&*?
Б9%ԦZ5KF	XILFMS^_ʚݖc/C##Fk^MGe	R#BQV4.9
lt,OOl4%7	pmM6z7We?^ywUrb&ҥ¯NwK(g#gG6U!Zq&ߍh9F)Հ+xpBLw2ߥ$2͑y蚏Ɲ:Ф4 VϲRkN f>CSM	T$ܜJKP0)O2eWILCPu0LV~yo*6*-\Nd]u=$JVJF)urlck%SiLedOmʪ800@BQ<B;oZ'*G; p68Wjv| ,fXOݗAW0Ff[H$08_X/̧VU>-]Z
o'j77PSe|A^㲤@lܭX$^sۍ4Akjk4J1A,l:gH1"LS*QCg尼FykW{V(.?	shz8"=luM'x7y'2EEH(	Pk*fp'6 D41HEOd۾topDе\B2\Æ5 f290<2lFCBM+PD#[`04T:n3R.<5#/3ZQ<5EA3/Ծ-? (Xtmb"Fc߂&\2f.h\PW3 pь4ma8a^jrntX?GENk>֖8؝
#ȂHo1F(48NΑ%;$)0EV&du1T3]f=Hyh
0/te>bP&Of WzN~is<}`C 8HHpT1)Zbcq'yn[q5p	yTv}mVS[Gg,C! D,A4"J&JXT9tׄJ%-%9:XmRC7i.@lf[IhrІuӄ}>$iH"1[ֈe&Z Ut<*0Tŵн1XFKD﬈\{3Z 4`9"ىvc	F4 dBf$"$qN;:OC28h0tfOpޅG]<PBAӒ8\ AbBa '^w1hX2083/<FfAaRӚhh$xA5A)/Ե6x+ĻDfJdc"32.!8<(Dז`//I`Y|x**B  <R
ƭ%Ǽ,r_HAg?E
mIRؓg1XqPb||hlKHHkJ/90oN(\#$orL7[c(ymc|!`GT6	׈sYdaўVdtX/d$dvfqR^4<EH.I)ެGpRG0j hRJJ(>qP(Xt]?y݆+;^]Y$@jGW-Sw;9KǍ}@.CD1IR9Y
?g:k[#VH2L6KMv`G(mHh)>2ͻZ]+\:@{H´J{B|
ᚸ.uk`%FU	`E^%|<w{K<mL;c&F7	YZYnNFJsBk'l7+s$nw?ZGTfH'xsNNŋ1\j/'i&`:ýHW^:@;8. rE5Tc6M2>V<~7u?h47CȊDѧM?.O*ӞJ6Sa$\gXwJ,\ENZ >ŰIB!v˂PVZASE"lhn p465 FjiNAsRC&ͤbኾt3SDx1$$'+Rev%f|U2O!O~^ydImBR:Ȣ6E|CPs&Yگp_in2@Z Op  U=]
+S<*	dW"&04ǁ~[|ǢeW"+vBŅl$-X;?ù*5'mlAUE4{kӝ6DX5] s/,Glyq]*)K!E1'XK
XsCr$ 	tFJFQEAWmc*sd!3TE1cN/[pRkc!"ఎXEA)m4^sMMӔr>Kf&\kHL?J"|NjLt+趈.+E.P@kIB^Yk )j5w@{¯DCP}r:ju'A#`HLsPȘ(O8e	 e,zOwb"$	`zq0i["D.@@V @ĳNIXgMK,4r\^L`§'}_-Lo1ރ|Dj/{Y{?3CC/zwGUryWdzJ1eP:/DtMQ.(*xŀvdLF&"`G3<mKy
PiOѠ	oHD0HkovDa0Ys<]lJ}pxΐ--W4mHwu8
2RG06,^XSyF8/ K\΢TC?o֭ 76-KnVNCȠE5Vk
i&	qq|;A~)v(tC9ZQHVv0CiT'5OzY'F{%ip-QKLt16sc|mޣ	 D#M+pΘCmRƲmZCs|$	]TAP>""'Gn?%TCF{g\9<-]P.`kn$
t1ro$"`-- ϭC8$
X 6<>VR0ۨ2{Q^>T2q pUs`4=jmq_m]q9p1"ʦ.vтfCZ|2p=.7f "@Fn׸k+G,hAd' d@-.CPsYV	ivƪsp@*1(H_vLXDQG̀cNnpMWFjf⋌{oU <6@j:Gי"	9B`oe@A%Bu,HO7DC@hxI15}(Ķ g6Dsmbz~{^D_ZPiz_x}|2'IookshcWäTz'A7"	Od7 a87vc9zBOVЁO܀+Rn}gs\[FUĊhz1_JqK14> `X Z,kjZcV<kA7`8Z0%u	5#|"µ]:y`9
m;;{dfQ-9/2с2fN1Li82yRF (L7]c316BN @0$*R,Av7V,""vgق1Lt ;Z.ǠO`"_B!ںL9[G
N+ptM 3q58&/vVw&4~$JBX2ނZ j#"g\pK<-ǗtI\gC$9OVIE`4zBN!Ȁܐ~ekAm~dkRe[vrB@3vo0b!TfxP 
ŭ3p8̂LhDq #$&CmjESwoԮ9܇T[yatC[FI<#SQ$[=A$yH7*E+s-֬J53;3JYu!yBu*_gx=D-wc|l'#xG*N'3ne<p]u*%XGFƽ̄I;M
B7T\$Oxq2A=p	(k|%$ByݣV5aI[9j~$v1W8+3>GQOP5z$0X2N3$4)D2K5bH͍j&ȓLC G!c
mԌevFeQjCo-գ +p
 dD B!T^\F J֏9|$Wlr[OP3gKE;1ѩr\!4@DTkv#_*rƆ-,r"#=b.]ؕsI-8TϳHN.NV!D,dp";l6>Zt|YfJ-:0br&u	;
?LDT6CƏc2xLk90%rLre8:`yPN.ܱ'IFɸ^V!ܢ96Fe|Ш{j	վcc;nX>P|@4G5>pr_Oe2S`xT9)_BS@݄&5cMTem$cXni}W\tI=VJ^!H-Gҟ*'0FB5@p'AAK0@ΤG̀SRUMJTʈDnqW/bblE]ȁ2;cY_d(s|yBGb;v.4٭)cgt<0ĭp{έȱ+6q8y},PC#JKB7$x lЕ3FEF(q8b|02W|aE%YٔtF,ޚP	QQKvCr)},N2V!ƣδ@&kR8epLVYTgFNNGkܓ,Zw0LFyR!MOAOAUSky`N)|17<Mڗ(]xm:Վu K8gy#.a7T@ޫ0ƽ,=ڳDBǟ':DNh2aJ4{īHoQ,LB>Fm09';
cィB{#OVMׅ$lO8"yDUNw6z	\eZiS<%S̄3ue.]B,@f?T
3oYdl 
D~/ֱ 8ch<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata></metadata>
<defs>
<font id="open_sanslight_italic" horiz-adv-x="1128" >
<font-face units-per-em="2048" ascent="1638" descent="-410" />
<missing-glyph horiz-adv-x="532" />
<glyph unicode="&#xfb00;" horiz-adv-x="1155" d="M-131 -492q-48 0 -102 19v90q53 -16 100 -16q88 0 134 53t75 186l246 1166h-205l14 67l205 14l35 160q35 168 116.5 244t227.5 76q73 0 166 -31l-25 -80q-87 27 -147 27q-96 0 -153.5 -53.5t-84.5 -178.5l-35 -164h477l35 160q35 168 116.5 244t227.5 76q73 0 166 -31 l-24 -80q-87 27 -148 27q-97 0 -154.5 -54.5t-82.5 -177.5l-35 -164h248l-17 -81h-248l-252 -1190q-34 -165 -105.5 -236.5t-193.5 -71.5q-48 0 -102 19v90q53 -16 100 -16q88 0 134 53t75 186l244 1166h-477l-252 -1190q-33 -161 -104 -234.5t-195 -73.5z" />
<glyph unicode="&#xfb01;" horiz-adv-x="1040" d="M0 0zM739 0h-98l231 1087h96zM915 1366q0 55 22 88t60 33q57 0 57 -72q0 -57 -22 -90t-57 -33q-29 0 -44.5 19.5t-15.5 54.5zM-148 -492q-48 0 -102 19v90q53 -16 100 -16q88 0 134 53t75 186l246 1166h-205l14 67l205 14l35 160q35 168 116.5 244t227.5 76q73 0 166 -31 l-25 -80q-87 27 -147 27q-96 0 -153.5 -53.5t-84.5 -178.5l-35 -164h248l-16 -81h-248l-252 -1190q-33 -161 -104 -234.5t-195 -73.5z" />
<glyph unicode="&#xfb02;" horiz-adv-x="1042" d="M0 0zM737 0h-94l334 1556h94zM-148 -492q-48 0 -102 19v90q53 -16 100 -16q88 0 134 53t75 186l246 1166h-205l14 67l205 14l35 160q35 168 116.5 244t227.5 76q73 0 166 -31l-25 -80q-87 27 -147 27q-96 0 -153.5 -53.5t-84.5 -178.5l-35 -164h248l-16 -81h-248 l-252 -1190q-33 -161 -104 -234.5t-195 -73.5z" />
<glyph unicode="&#xfb03;" horiz-adv-x="1616" d="M0 0zM-148 -492q-48 0 -102 19v90q53 -16 100 -16q88 0 134 53t75 186l246 1166h-205l14 67l205 14l35 160q35 168 116.5 244t227.5 76q73 0 166 -31l-25 -80q-87 27 -147 27q-96 0 -153.5 -53.5t-84.5 -178.5l-35 -164h477l35 160q35 168 116.5 244t227.5 76 q73 0 166 -31l-24 -80q-87 27 -148 27q-97 0 -154.5 -54.5t-82.5 -177.5l-35 -164h248l-17 -81h-248l-252 -1190q-34 -165 -105.5 -236.5t-193.5 -71.5q-48 0 -102 19v90q53 -16 100 -16q88 0 134 53t75 186l244 1166h-477l-252 -1190q-33 -161 -104 -234.5t-195 -73.5z M1315 0h-98l231 1087h96zM1491 1366q0 55 22 88t60 33q57 0 57 -72q0 -57 -22 -90t-57 -33q-29 0 -44.5 19.5t-15.5 54.5z" />
<glyph unicode="&#xfb04;" horiz-adv-x="1626" d="M0 0zM-148 -492q-48 0 -102 19v90q53 -16 100 -16q88 0 134 53t75 186l246 1166h-205l14 67l205 14l35 160q35 168 116.5 244t227.5 76q73 0 166 -31l-25 -80q-87 27 -147 27q-96 0 -153.5 -53.5t-84.5 -178.5l-35 -164h477l35 160q35 168 116.5 244t227.5 76 q73 0 166 -31l-24 -80q-87 27 -148 27q-97 0 -154.5 -54.5t-82.5 -177.5l-35 -164h248l-17 -81h-248l-252 -1190q-34 -165 -105.5 -236.5t-193.5 -71.5q-48 0 -102 19v90q53 -16 100 -16q88 0 134 53t75 186l244 1166h-477l-252 -1190q-33 -161 -104 -234.5t-195 -73.5z M1321 0h-94l334 1556h94z" />
<glyph horiz-adv-x="2048" />
<glyph horiz-adv-x="2048" />
<glyph unicode="&#xd;" horiz-adv-x="1044" />
<glyph unicode=" "  horiz-adv-x="532" />
<glyph unicode="&#x09;" horiz-adv-x="532" />
<glyph unicode="&#xa0;" horiz-adv-x="532" />
<glyph unicode="!" horiz-adv-x="502" d="M248 377h-62l203 1085h119zM80 57q0 56 25 88.5t69 32.5q66 0 66 -72q0 -53 -25 -87.5t-68 -34.5q-67 0 -67 73z" />
<glyph unicode="&#x22;" horiz-adv-x="721" d="M455 1462l-146 -528h-61l80 528h127zM784 1462l-145 -528h-61l79 528h127z" />
<glyph unicode="#" horiz-adv-x="1323" d="M389 530l119 398h-297l8 80h311l134 454h90l-136 -454h365l135 454h86l-135 -454h285l-8 -80h-302l-118 -398h303l-8 -79h-320l-133 -451h-90l135 451h-360l-134 -451h-88l134 451h-283l8 79h299zM475 530h363l120 398h-362z" />
<glyph unicode="$" d="M928 467q0 -151 -110.5 -243t-297.5 -103l-53 -240h-82l51 240q-79 2 -158 18t-137 43v94q65 -34 153.5 -53.5t160.5 -19.5l110 512q-110 53 -153 91t-66.5 87.5t-23.5 116.5q0 155 105.5 250.5t272.5 99.5l41 192h80l-41 -192q149 -5 277 -68l-35 -78q-110 61 -256 70 l-109 -514q124 -60 172.5 -99.5t73.5 -88.5t25 -115zM537 203q142 7 223.5 74.5t81.5 183.5q0 76 -48 129.5t-157 97.5zM686 1284q-134 -9 -205 -80t-71 -186q0 -78 37 -128.5t137 -96.5z" />
<glyph unicode="%" horiz-adv-x="1556" d="M1458 1462l-1139 -1462h-106l1135 1462h110zM1520 612q0 -175 -50 -327t-136 -230t-197 -78q-112 0 -172 75.5t-60 223.5q0 160 52 312t138 229.5t193 77.5q121 0 176.5 -71.5t55.5 -211.5zM1284 821q-80 0 -146.5 -72.5t-106.5 -202.5t-40 -263q0 -116 41 -174t113 -58 q130 0 209.5 166.5t79.5 386.5q0 109 -36 163t-114 54zM760 1198q0 -175 -50 -327t-136 -230t-197 -78q-112 0 -172 75.5t-60 223.5q0 160 52 312t138 229.5t193 77.5q232 0 232 -283zM524 1407q-79 0 -145 -71.5t-107 -203t-41 -264.5q0 -115 41 -173t113 -58 q84 0 148.5 72t102.5 204t38 277q0 109 -36 163t-114 54z" />
<glyph unicode="&#x26;" horiz-adv-x="1331" d="M748 1395q-125 0 -194 -68t-69 -192q0 -132 109 -281q203 89 279.5 163.5t76.5 182.5q0 91 -56.5 143t-145.5 52zM465 63q108 0 211.5 42.5t222.5 146.5l-352 493q-164 -79 -232 -134.5t-103.5 -124t-35.5 -158.5q0 -119 78 -192t211 -73zM78 324q0 162 99 277.5 t325 215.5l-41 67q-78 128 -78 251q0 157 101 253.5t264 96.5q145 0 227 -76.5t82 -206.5q0 -85 -41 -154t-121 -128t-256 -138l330 -463q73 75 135.5 176.5t91.5 186.5h111q-102 -247 -285 -436l184 -246h-123l-131 184q-121 -108 -242 -156t-266 -48q-167 0 -266.5 94 t-99.5 250z" />
<glyph unicode="'" horiz-adv-x="403" d="M461 1462l-146 -528h-61l80 528h127z" />
<glyph unicode="(" horiz-adv-x="526" d="M104 270q0 343 122 633t382 559h105q-259 -276 -384.5 -568t-125.5 -618q0 -317 127 -600h-80q-146 262 -146 594z" />
<glyph unicode=")" horiz-adv-x="526" d="M453 868q0 -345 -123.5 -636t-380.5 -556h-105q257 274 383.5 566.5t126.5 619.5q0 148 -28.5 294t-98.5 306h80q146 -262 146 -594z" />
<glyph unicode="*" horiz-adv-x="1137" d="M834 1540l-109 -405l438 8l-8 -107l-416 29l181 -401l-115 -37l-135 417l-285 -348l-78 78l318 318l-392 125l39 102l394 -168l47 408z" />
<glyph unicode="+" d="M563 672h-401v100h401v404h101v-404h401v-100h-401v-400h-101v400z" />
<glyph unicode="," horiz-adv-x="451" d="M250 238l8 -23q-34 -92 -114 -233.5t-160 -245.5h-74q79 132 141 271t88 231h111z" />
<glyph unicode="-" horiz-adv-x="629" d="M82 502l18 90h457l-16 -90h-459z" />
<glyph unicode="." horiz-adv-x="485" d="M82 55q0 56 25 88.5t69 32.5q66 0 66 -72q0 -53 -25 -87.5t-67 -34.5q-68 0 -68 73z" />
<glyph unicode="/" horiz-adv-x="641" d="M827 1462l-817 -1462h-110l815 1462h112z" />
<glyph unicode="0" d="M1075 1016q0 -201 -41 -405t-116.5 -346t-183.5 -213.5t-242 -71.5q-176 0 -264.5 126.5t-88.5 387.5q0 186 44.5 381.5t124 334t187 207t240.5 68.5q340 0 340 -469zM723 1397q-134 0 -241.5 -113t-173.5 -329t-66 -451q0 -222 62.5 -329t197.5 -107q139 0 244 112 t166 337t61 489q0 199 -59.5 295t-190.5 96z" />
<glyph unicode="1" d="M537 0h-105l225 1055q19 92 74 293q-42 -36 -75.5 -61t-249.5 -161l-52 78l406 258h90z" />
<glyph unicode="2" d="M909 0h-870l22 104l449 402q198 177 284 276.5t126.5 186.5t40.5 180q0 112 -66 178t-197 66q-176 0 -333 -129l-54 73q180 146 394 146q173 0 268.5 -85t95.5 -237q0 -110 -43.5 -208.5t-141.5 -211.5t-311 -303l-383 -338v-4h736z" />
<glyph unicode="3" d="M1049 1174q0 -162 -106 -275t-286 -143v-4q117 -24 185.5 -115.5t68.5 -226.5q0 -134 -64 -233t-179.5 -148t-274.5 -49q-96 0 -184.5 20.5t-153.5 52.5v101q172 -86 344 -86q197 0 303.5 89.5t106.5 252.5q0 145 -89 223t-247 78h-117l21 96h110q209 0 333 95.5 t124 258.5q0 114 -63.5 175t-188.5 61q-167 0 -344 -131l-49 75q84 67 188 104.5t218 37.5q161 0 252.5 -82.5t91.5 -226.5z" />
<glyph unicode="4" d="M1071 371h-264l-80 -371h-96l80 371h-688l20 96l881 1010h118l-215 -1018h265zM729 459q79 369 119 558.5t86 354.5h-4q-66 -91 -129 -166l-651 -747h579z" />
<glyph unicode="5" d="M582 879q188 0 292.5 -102t104.5 -279q0 -237 -148 -377.5t-407 -140.5q-84 0 -177.5 20t-158.5 51v107q170 -90 340 -90q208 0 328.5 114.5t120.5 313.5q0 140 -85 219.5t-225 79.5q-133 0 -243 -41l-66 49l193 659h624l-18 -96h-541l-149 -516q98 29 215 29z" />
<glyph unicode="6" d="M170 428q0 283 105 544.5t269.5 385t383.5 123.5q123 0 182 -21l-18 -90q-86 23 -170 23q-233 0 -393.5 -174t-233.5 -502h8q68 94 164 143t211 49q161 0 250.5 -100.5t89.5 -282.5q0 -156 -60 -281t-171 -195t-257 -70q-171 0 -265.5 119t-94.5 329zM543 68 q112 0 196.5 58.5t130 162t45.5 229.5q0 146 -67 224.5t-195 78.5q-81 0 -154 -31.5t-129 -87t-78 -115t-22 -173.5q0 -164 72.5 -255t200.5 -91z" />
<glyph unicode="7" d="M244 0l796 1366h-766l23 96h858l-20 -110l-779 -1352h-112z" />
<glyph unicode="8" d="M737 1485q163 0 258 -85t95 -229q0 -138 -84 -234.5t-285 -172.5q130 -78 190 -170.5t60 -208.5t-58 -208t-165.5 -144.5t-260.5 -52.5q-178 0 -283.5 92.5t-105.5 253.5q0 159 100.5 268.5t321.5 187.5q-100 72 -144 152t-44 180q0 159 114 265t291 106zM610 733 q-218 -73 -313.5 -167.5t-95.5 -225.5q0 -136 77.5 -206.5t219.5 -70.5q168 0 270 91t102 233q0 104 -62 189t-198 157zM727 1399q-130 0 -214.5 -82t-84.5 -203q0 -91 41.5 -159t157.5 -142q192 62 279 144t87 206q0 109 -70.5 172.5t-195.5 63.5z" />
<glyph unicode="9" d="M1059 1032q0 -288 -101.5 -548t-263.5 -382t-393 -122q-114 0 -186 22v90q87 -29 192 -29q474 0 627 674h-8q-140 -192 -367 -192q-162 0 -255 105t-93 284q0 155 59.5 281t170.5 196t257 70q174 0 267.5 -115.5t93.5 -333.5zM686 1393q-112 0 -197.5 -58.5 t-130.5 -162.5t-45 -230q0 -145 67.5 -225t192.5 -80q83 0 157.5 32.5t129 87.5t76.5 114t22 176q0 166 -71 256t-201 90z" />
<glyph unicode=":" horiz-adv-x="485" d="M260 989q0 57 25.5 89t68.5 32q66 0 66 -72q0 -55 -25 -89t-67 -34q-68 0 -68 74zM102 55q0 56 25.5 88.5t69.5 32.5q65 0 65 -72q0 -55 -25.5 -88.5t-66.5 -33.5q-68 0 -68 73z" />
<glyph unicode=";" horiz-adv-x="485" d="M287 238l8 -23q-35 -96 -118.5 -242t-156.5 -237h-73q79 132 141 271t88 231h111zM266 989q0 57 25.5 89t68.5 32q66 0 66 -72q0 -55 -25 -89t-67 -34q-68 0 -68 74z" />
<glyph unicode="&#x3c;" d="M1051 262l-914 414v74l914 471v-103l-801 -399l801 -350v-107z" />
<glyph unicode="=" d="M168 885v100h903v-100h-903zM168 461v98h903v-98h-903z" />
<glyph unicode="&#x3e;" d="M170 369l801 350l-801 399v103l915 -471v-74l-915 -414v107z" />
<glyph unicode="?" horiz-adv-x="799" d="M242 362l6 29q29 132 82 206.5t157 147.5q118 84 175 145.5t86.5 127.5t29.5 141q0 108 -67.5 170t-182.5 62q-139 0 -307 -101l-39 86q85 49 171.5 78t187.5 29q159 0 250.5 -84.5t91.5 -229.5q0 -127 -66 -234t-231 -226q-85 -61 -132.5 -108.5t-73 -95t-46.5 -143.5 h-92zM170 59q0 56 25 88.5t69 32.5q66 0 66 -71q0 -54 -24.5 -88.5t-67.5 -34.5q-68 0 -68 73z" />
<glyph unicode="@" horiz-adv-x="1724" d="M1688 858q0 -179 -56 -323.5t-154.5 -227t-211.5 -82.5q-98 0 -154.5 55t-56.5 144h-4q-54 -97 -132.5 -148t-168.5 -51q-112 0 -178 73t-66 202q0 156 63 283t178 198.5t261 71.5q122 0 252 -52l-84 -315q-39 -140 -39 -221q0 -71 34.5 -111.5t100.5 -40.5 q86 0 160 73.5t117.5 198t43.5 251.5q0 156 -65 277t-187 188t-292 67q-235 0 -424.5 -108.5t-295.5 -304t-106 -439.5q0 -288 155 -449t435 -161q207 0 420 82v-90q-210 -82 -428 -82q-203 0 -357.5 82.5t-238.5 239t-84 370.5q0 276 121.5 493.5t337 337t473.5 119.5 q189 0 330.5 -72.5t221 -213t79.5 -314.5zM1008 969q-113 0 -204.5 -59t-142.5 -165.5t-51 -238.5q0 -92 40.5 -142.5t113.5 -50.5q101 0 180.5 89t124.5 255l78 289q-66 23 -139 23z" />
<glyph unicode="A" horiz-adv-x="1059" d="M805 520h-512l-287 -520h-117l822 1468h67l201 -1468h-105zM793 612l-39 291q-31 242 -39 402q-30 -63 -64.5 -130t-306.5 -563h449z" />
<glyph unicode="B" horiz-adv-x="1202" d="M412 1462h379q190 0 290.5 -84t100.5 -241q0 -153 -90 -249t-254 -124v-4q125 -31 188.5 -113.5t63.5 -204.5q0 -205 -140.5 -323.5t-390.5 -118.5h-457zM377 811h278q206 0 313 81t107 238q0 119 -78 180.5t-229 61.5h-272zM358 721l-135 -631h342q201 0 309.5 87.5 t108.5 256.5q0 145 -90 216t-275 71h-260z" />
<glyph unicode="C" horiz-adv-x="1169" d="M961 1389q-197 0 -351.5 -104.5t-245 -304.5t-90.5 -441q0 -225 110.5 -346t317.5 -121q140 0 304 51v-94q-156 -49 -316 -49q-252 0 -386 145t-134 410q0 266 104.5 488t284.5 341t402 119q177 0 307 -68l-45 -90q-55 30 -124.5 47t-137.5 17z" />
<glyph unicode="D" horiz-adv-x="1350" d="M1288 879q0 -253 -109.5 -461.5t-300.5 -313t-446 -104.5h-330l310 1462h305q282 0 426.5 -147.5t144.5 -435.5zM430 90q226 0 394.5 94.5t261 275.5t92.5 412q0 498 -476 498h-206l-275 -1280h209z" />
<glyph unicode="E" horiz-adv-x="1067" d="M829 0h-727l310 1462h727l-21 -94h-624l-117 -553h590l-21 -94h-588l-135 -627h627z" />
<glyph unicode="F" horiz-adv-x="981" d="M205 0h-103l310 1462h708l-20 -94h-604l-134 -620h570l-21 -95h-569z" />
<glyph unicode="G" horiz-adv-x="1374" d="M856 735h406l-150 -682q-211 -73 -405 -73q-257 0 -397 146t-140 421q0 265 105 483.5t283.5 335.5t395.5 117q113 0 203 -19t184 -59l-38 -94q-110 46 -189.5 62t-167.5 16q-184 0 -339 -107.5t-244 -301.5t-89 -433q0 -229 114.5 -352t326.5 -123q155 0 309 47l117 526 h-303z" />
<glyph unicode="H" horiz-adv-x="1366" d="M1063 0h-100l151 719h-760l-149 -719h-103l310 1462h102l-139 -649h760l137 649h100z" />
<glyph unicode="I" horiz-adv-x="504" d="M102 0l310 1462h98l-309 -1462h-99z" />
<glyph unicode="J" horiz-adv-x="477" d="M-180 -360q-48 0 -88 8t-56 16l11 92q57 -20 137 -20q213 0 262 241l309 1485h105l-314 -1491q-35 -170 -125 -250.5t-241 -80.5z" />
<glyph unicode="K" horiz-adv-x="1122" d="M979 0h-111l-342 788l-190 -153l-131 -635h-103l310 1462h102l-158 -723l133 121l680 602h138l-699 -610z" />
<glyph unicode="L" horiz-adv-x="938" d="M102 0l310 1462h102l-289 -1366h621l-23 -96h-721z" />
<glyph unicode="M" horiz-adv-x="1669" d="M772 205l733 1257h150l-301 -1462h-101l191 901q79 369 100 447h-6l-780 -1348h-51l-222 1348h-6q-20 -154 -78 -426l-196 -922h-96l309 1462h143l205 -1257h6z" />
<glyph unicode="N" horiz-adv-x="1372" d="M1069 0h-86l-516 1284h-8q-23 -149 -48 -273t-214 -1011h-95l310 1462h80l522 -1294h8q23 176 74 416l188 878h94z" />
<glyph unicode="O" horiz-adv-x="1464" d="M1403 911q0 -255 -94 -481.5t-252 -338t-365 -111.5q-250 0 -385 149t-135 430q0 262 93 477.5t255 331t373 115.5q247 0 378.5 -148.5t131.5 -423.5zM879 1389q-174 0 -308.5 -101t-214.5 -298t-80 -417q0 -245 109.5 -373t319.5 -128q169 0 300 98.5t210 300t79 430.5 q0 240 -104.5 364t-310.5 124z" />
<glyph unicode="P" horiz-adv-x="1145" d="M1145 1102q0 -500 -610 -500h-201l-129 -602h-103l310 1462h315q202 0 310 -92.5t108 -267.5zM350 694h191q252 0 373.5 96.5t121.5 305.5q0 274 -329 274h-211z" />
<glyph unicode="Q" horiz-adv-x="1464" d="M1403 911q0 -216 -70 -418t-186.5 -324t-274.5 -167l267 -350h-142l-231 332l-74 -4q-250 0 -385 149t-135 430q0 262 93 477.5t255 331t373 115.5q247 0 378.5 -148.5t131.5 -423.5zM879 1389q-174 0 -308.5 -101t-214.5 -298t-80 -417q0 -245 109.5 -373t319.5 -128 q169 0 300 98.5t210 300t79 430.5q0 240 -104.5 364t-310.5 124z" />
<glyph unicode="R" horiz-adv-x="1145" d="M336 633l-131 -633h-103l310 1462h303q430 0 430 -360q0 -182 -103.5 -303t-281.5 -152q201 -591 221 -647h-111l-211 633h-323zM358 725h252q208 0 317 95.5t109 281.5q0 268 -329 268h-211z" />
<glyph unicode="S" horiz-adv-x="1020" d="M895 403q0 -126 -65.5 -224.5t-179.5 -148.5t-269 -50q-88 0 -172.5 17t-171.5 58v109q163 -92 348 -92q188 0 295.5 86.5t107.5 232.5q0 61 -17 104.5t-52.5 78.5t-91 68t-131.5 75q-150 76 -209.5 164t-59.5 206t59 207.5t165 139t237 49.5q99 0 180 -17.5t168 -60.5 l-32 -94q-66 40 -151.5 63t-164.5 23q-163 0 -259.5 -82.5t-96.5 -218.5q0 -103 49 -170t182 -133q154 -79 213.5 -130t89 -113t29.5 -147z" />
<glyph unicode="T" horiz-adv-x="985" d="M438 0h-102l289 1368h-432l20 94h973l-19 -94h-440z" />
<glyph unicode="U" horiz-adv-x="1370" d="M1395 1462l-207 -977q-58 -270 -197 -387.5t-375 -117.5q-440 0 -440 401q0 83 27 201l186 880h103l-193 -899q-20 -89 -20 -184q0 -309 342 -309q195 0 307.5 96.5t158.5 318.5l207 977h101z" />
<glyph unicode="V" horiz-adv-x="1079" d="M457 147q51 111 124 247l572 1068h117l-799 -1462h-88l-182 1462h100l117 -950q26 -217 35 -365h4z" />
<glyph unicode="W" horiz-adv-x="1702" d="M1018 1341q-27 -76 -62 -153.5t-563 -1187.5h-82l-73 1462h100l47 -1031l4 -165l-2 -86h6q85 226 170 398l434 884h105l61 -878q19 -266 19 -410h6q30 86 61.5 163t493.5 1125h108q-169 -365 -330.5 -731t-328.5 -731h-78l-78 1075q-11 142 -11 219l1 47h-8z" />
<glyph unicode="X" horiz-adv-x="971" d="M879 0h-107l-254 678l-526 -678h-127l608 766l-272 696h106l240 -626l483 626h119l-555 -719z" />
<glyph unicode="Y" horiz-adv-x="965" d="M494 645l544 817h117l-631 -932l-108 -530h-105l119 545l-237 917h100z" />
<glyph unicode="Z" d="M913 0h-925l22 92l1069 1276h-764l23 94h887l-19 -88l-1069 -1280h799z" />
<glyph unicode="[" horiz-adv-x="537" d="M369 -324h-426l376 1786h429l-19 -90h-330l-340 -1605h330z" />
<glyph unicode="\" horiz-adv-x="641" d="M295 1462l242 -1462h-82l-246 1462h86z" />
<glyph unicode="]" horiz-adv-x="537" d="M203 1462h426l-377 -1786h-428l18 91h330l340 1605h-330z" />
<glyph unicode="^" horiz-adv-x="1047" d="M70 569l587 906h91l260 -906h-105l-217 809l-500 -809h-116z" />
<glyph unicode="_" horiz-adv-x="801" d="M625 -291h-807l18 86h807z" />
<glyph unicode="`" horiz-adv-x="1135" d="M766 1241h-66q-50 52 -114 144.5t-99 162.5v21h115q46 -129 164 -303v-25z" />
<glyph unicode="a" horiz-adv-x="1133" d="M655 1104q232 0 279 -219h6l59 202h80l-229 -1087h-82l45 274h-6q-84 -142 -187 -218t-237 -76q-281 0 -281 374q0 197 75 376t200.5 276.5t277.5 97.5zM406 70q89 0 177.5 62t159 166t107.5 230t37 213q0 79 -26 141.5t-77 99t-127 36.5q-124 0 -224 -82t-164 -245.5 t-64 -325.5q0 -152 50 -223.5t151 -71.5z" />
<glyph unicode="b" horiz-adv-x="1151" d="M500 -16q-113 0 -186 59t-97 166h-6l-55 -209h-80l327 1556h95q-131 -628 -162 -751h6q93 156 199 229.5t231 73.5q281 0 281 -375q0 -203 -76 -380t-201 -273t-276 -96zM750 1018q-91 0 -180 -61.5t-160.5 -169.5t-106.5 -235t-35 -206q0 -129 64 -202.5t166 -73.5 q124 0 224 83t164 245t64 325q0 152 -49 223.5t-151 71.5z" />
<glyph unicode="c" horiz-adv-x="887" d="M477 -20q-174 0 -274.5 110.5t-100.5 306.5q0 193 73.5 361.5t198.5 257t290 88.5q134 0 241 -43l-28 -90q-107 47 -218 47q-129 0 -232.5 -77t-162.5 -222t-59 -320q0 -158 73.5 -243.5t208.5 -85.5q71 0 131.5 13t131.5 46v-92q-116 -57 -273 -57z" />
<glyph unicode="d" horiz-adv-x="1133" d="M655 1104q230 0 279 -219h4q12 66 143 671h99l-330 -1556h-82l45 274h-6q-173 -294 -424 -294q-281 0 -281 374q0 193 71.5 370t197.5 278.5t284 101.5zM406 70q89 0 178.5 62.5t160 168t106.5 231t36 209.5q0 126 -61.5 201.5t-168.5 75.5q-124 0 -224 -83t-164 -242.5 t-64 -327.5q0 -295 201 -295z" />
<glyph unicode="e" horiz-adv-x="928" d="M469 -20q-173 0 -270 109.5t-97 305.5q0 181 71 347t195.5 264t274.5 98q114 0 182 -61t68 -166q0 -181 -163.5 -276t-485.5 -95h-33q-6 -44 -6 -98q0 -165 74 -251.5t213 -86.5q132 0 276 73v-94q-140 -69 -299 -69zM631 1018q-131 0 -243.5 -115.5t-162.5 -308.5h49 q517 0 517 270q0 67 -43.5 110.5t-116.5 43.5z" />
<glyph unicode="f" horiz-adv-x="578" d="M-131 -492q-48 0 -102 19v90q53 -16 100 -16q88 0 134 53t75 186l246 1166h-205l14 67l205 14l35 160q35 168 116.5 244t227.5 76q73 0 166 -31l-25 -80q-87 27 -147 27q-96 0 -153.5 -53.5t-84.5 -178.5l-35 -164h248l-16 -81h-248l-252 -1190q-33 -161 -104 -234.5 t-195 -73.5z" />
<glyph unicode="g" horiz-adv-x="1040" d="M1100 1087l-17 -79l-243 -11q26 -28 43.5 -84t17.5 -114q0 -109 -54.5 -206.5t-148 -145.5t-213.5 -48q-63 0 -77 9q-80 -33 -124 -73t-44 -81t31.5 -64.5t113.5 -31.5l121 -11q346 -31 346 -264q0 -112 -65 -197.5t-187 -131.5t-291 -46q-186 0 -291.5 72t-105.5 203 q0 236 309 334q-78 42 -78 123q0 123 191 202q-71 36 -110.5 105.5t-39.5 157.5q0 111 53.5 204t148 146t206.5 53q69 0 147 -21h361zM14 -207q0 -101 81 -150t224 -49q203 0 317 74.5t114 204.5q0 85 -62.5 130.5t-218.5 57.5l-160 15q-157 -45 -226 -114.5t-69 -168.5z M285 711q0 -112 58.5 -170t164.5 -58q88 0 154 37t102.5 114t36.5 169q0 104 -56 161.5t-157 57.5q-93 0 -161 -43t-105 -116t-37 -152z" />
<glyph unicode="h" horiz-adv-x="1143" d="M764 0l149 692q21 92 21 156q0 80 -43.5 125t-134.5 45q-112 0 -210.5 -67t-166 -188t-103.5 -286l-102 -477h-98l332 1556h96l-86 -411q-44 -200 -66 -279h6q78 113 186.5 175.5t229.5 62.5q124 0 192 -65t68 -183q0 -70 -24 -182l-148 -674h-98z" />
<glyph unicode="i" horiz-adv-x="475" d="M174 0h-98l231 1087h96zM350 1366q0 55 22 88t60 33q57 0 57 -72q0 -57 -22 -90t-57 -33q-29 0 -44.5 19.5t-15.5 54.5z" />
<glyph unicode="j" horiz-adv-x="475" d="M-166 -492q-62 0 -113 19v92q47 -22 113 -22q82 0 128.5 51.5t72.5 177.5l266 1261h96l-268 -1271q-35 -165 -106.5 -236.5t-188.5 -71.5zM350 1366q0 55 22 88t60 33q57 0 57 -72q0 -57 -22 -90t-57 -33q-29 0 -44.5 19.5t-15.5 54.5z" />
<glyph unicode="k" horiz-adv-x="944" d="M270 477l609 610h125l-474 -469l297 -618h-106l-264 559l-205 -188l-80 -371h-96l330 1556h96l-166 -780l-70 -299h4z" />
<glyph unicode="l" horiz-adv-x="475" d="M170 0h-94l334 1556h94z" />
<glyph unicode="m" horiz-adv-x="1751" d="M711 0l147 674q25 125 25 162q0 182 -154 182q-106 0 -200 -67.5t-159 -188.5t-100 -287l-100 -475h-98l231 1087h80l-33 -210h6q80 113 181.5 170t212.5 57q106 0 163 -67t60 -195h6q77 129 181 195.5t222 66.5q117 0 182.5 -61.5t65.5 -176.5q0 -29 -2.5 -56.5 t-19.5 -119.5l-152 -690h-100l149 680q25 120 25 176q0 77 -43 119.5t-119 42.5q-157 0 -277.5 -137.5t-168.5 -362.5l-109 -518h-102z" />
<glyph unicode="n" horiz-adv-x="1143" d="M764 0l149 692q21 92 21 156q0 80 -43.5 125t-134.5 45q-112 0 -210.5 -67t-166 -187.5t-103.5 -286.5l-102 -477h-98l231 1087h82l-37 -221h6q164 238 416 238q130 0 195 -64t65 -184q0 -70 -24 -182l-148 -674h-98z" />
<glyph unicode="o" horiz-adv-x="1124" d="M649 1108q180 0 278.5 -108.5t98.5 -299.5q0 -197 -71.5 -368.5t-195.5 -261.5t-286 -90q-184 0 -279.5 109.5t-95.5 313.5q0 191 73 358t197 257t281 90zM641 1022q-124 0 -223 -78.5t-158 -225t-59 -310.5q0 -342 282 -342q127 0 225.5 77.5t157 228t58.5 330.5 q0 154 -73 237t-210 83z" />
<glyph unicode="p" horiz-adv-x="1149" d="M498 -16q-230 0 -279 219h-4q-13 -72 -149 -695h-99l336 1579h82l-45 -274h6q91 153 195.5 224t228.5 71q135 0 208 -92.5t73 -282.5q0 -195 -72 -371t-197.5 -277t-283.5 -101zM748 1018q-87 0 -174 -58.5t-161.5 -167.5t-110.5 -237.5t-36 -208.5q0 -125 61.5 -200.5 t168.5 -75.5q124 0 225 84t164 243.5t63 325.5q0 295 -200 295z" />
<glyph unicode="q" horiz-adv-x="1157" d="M651 1104q109 0 183.5 -58t99.5 -167h6l55 208h80l-327 -1556h-95l98 470l64 282h-6q-93 -156 -199 -229.5t-231 -73.5q-281 0 -281 374q0 201 75.5 379t200.5 274.5t277 96.5zM401 70q92 0 182 62.5t160.5 171.5t105 236.5t34.5 200.5q0 130 -63.5 203.5t-166.5 73.5 q-124 0 -224 -83t-164 -245t-64 -325q0 -143 45.5 -219t154.5 -76z" />
<glyph unicode="r" horiz-adv-x="752" d="M713 1106q69 0 123 -14l-21 -93q-47 15 -113 15q-94 0 -179 -64t-153 -192t-100 -277l-100 -481h-98l231 1087h80l-29 -204h6q73 94 123 135.5t106.5 64.5t123.5 23z" />
<glyph unicode="s" horiz-adv-x="827" d="M713 295q0 -144 -103 -229.5t-280 -85.5q-173 0 -305 75v107q74 -46 153 -71t148 -25q138 0 211 57.5t73 163.5q0 42 -15.5 74t-50 61.5t-132.5 85.5q-148 80 -200 145.5t-52 159.5q0 128 98.5 209.5t259.5 81.5q75 0 158.5 -17.5t140.5 -46.5l-35 -88q-136 64 -264 64 q-116 0 -186 -53t-70 -138q0 -55 17 -88t60.5 -68.5t119.5 -76.5q114 -63 161.5 -103.5t70 -86.5t22.5 -107z" />
<glyph unicode="t" horiz-adv-x="616" d="M694 1087l-18 -81h-283l-135 -635q-22 -99 -22 -164q0 -139 126 -139q68 0 152 26v-86q-101 -28 -170 -28q-99 0 -153 54.5t-54 158.5q0 73 29 206l129 607h-182l14 67l184 17l97 253h55l-55 -256h286z" />
<glyph unicode="u" horiz-adv-x="1143" d="M381 1087l-152 -698q-22 -106 -22 -158q0 -74 47.5 -117.5t138.5 -43.5q110 0 207.5 65.5t164 187t99.5 279.5l105 485h98l-231 -1087h-80l28 205h-6q-167 -221 -403 -221q-131 0 -198.5 62t-67.5 181q0 60 22 170l150 690h100z" />
<glyph unicode="v" horiz-adv-x="895" d="M276 0l-172 1087h101l108 -735q26 -165 33 -254h6q51 115 129 256l406 733h102l-600 -1087h-113z" />
<glyph unicode="w" horiz-adv-x="1393" d="M838 0l-60 686q-14 224 -14 266h-6q-34 -92 -144 -290l-356 -662h-117l-20 1087h92l13 -821l-3 -157h6q61 134 150 297l373 681h77l64 -681q14 -147 14 -297h6l24 61l101 236l320 681h96l-508 -1087h-108z" />
<glyph unicode="x" horiz-adv-x="922" d="M442 483l-393 -483h-121l471 559l-245 528h100l207 -462l373 462h120l-448 -534l258 -553h-98z" />
<glyph unicode="y" horiz-adv-x="920" d="M123 1087h100l82 -548q51 -351 55 -449h11q43 105 186 367l348 630h103l-713 -1290q-72 -127 -122.5 -178t-114 -81t-146.5 -30q-68 0 -129 21v92q71 -27 137 -27q80 0 147 49.5t130 164.5t100 184z" />
<glyph unicode="z" horiz-adv-x="887" d="M700 0h-729l15 72l776 932h-543l17 83h659l-18 -83l-762 -920h602z" />
<glyph unicode="{" horiz-adv-x="709" d="M424 -324q-256 0 -256 199q0 45 16 115l56 252q18 90 18 127q0 159 -199 159l21 78q126 0 191 49t89 158l89 393q30 135 106 195.5t215 60.5h29l-17 -86q-86 -2 -129 -20.5t-69.5 -61.5t-44.5 -120l-74 -338q-30 -134 -91.5 -194.5t-164.5 -78.5v-4q68 -18 105.5 -68.5 t37.5 -121.5q0 -52 -24 -164l-47 -225q-13 -58 -13 -101q0 -61 37.5 -89t138.5 -28v-86h-20z" />
<glyph unicode="|" d="M584 1561h100v-2071h-100v2071z" />
<glyph unicode="}" horiz-adv-x="709" d="M332 1462q131 0 189.5 -51t58.5 -147q0 -41 -17 -115l-55 -252q-19 -95 -19 -127q0 -77 49.5 -118.5t149.5 -41.5l-20 -78q-125 0 -191 -48.5t-90 -157.5l-88 -394q-32 -139 -108.5 -197.5t-213.5 -58.5h-18v86q96 2 138 21t68.5 61t43.5 121l74 338q27 126 87.5 189.5 t168.5 82.5v5q-75 20 -109.5 72.5t-34.5 117.5q0 55 18 131l54 258q12 61 12 101q0 44 -18 69t-54 36t-116 11l20 86h21z" />
<glyph unicode="~" d="M350 745q-49 0 -108 -30.5t-115 -89.5v94q108 110 233 110q61 0 115 -13.5t156 -57.5q126 -58 219 -58q54 0 107.5 29t117.5 96v-96q-111 -113 -233 -113q-117 0 -271 72q-62 29 -112.5 43t-108.5 14z" />
<glyph unicode="&#xa1;" horiz-adv-x="502" d="M264 711h62l-203 -1086h-119zM432 1030q0 -56 -25 -88.5t-69 -32.5q-66 0 -66 72q0 55 25 89t68 34q67 0 67 -74z" />
<glyph unicode="&#xa2;" d="M578 -20h-93l45 215q-132 25 -206 132.5t-74 272.5q0 184 63.5 341t178 253t256.5 111l36 178h90l-38 -176q116 -4 217 -43l-29 -90q-107 47 -217 47q-130 0 -233 -76t-162.5 -221t-59.5 -322q0 -164 74.5 -247t208.5 -83q127 0 264 60v-92q-118 -58 -281 -58z" />
<glyph unicode="&#xa3;" d="M879 1479q170 0 313 -78l-39 -84l-54 26q-108 50 -231 50q-134 0 -220.5 -74.5t-117.5 -220.5l-73 -340h409l-18 -82h-408l-57 -268q-50 -225 -188 -314h759l-20 -94h-938l16 84q93 11 165.5 95.5t107.5 236.5l57 260h-199l17 82h198l76 350q41 187 155 279t290 92z" />
<glyph unicode="&#xa4;" d="M262 723q0 118 74 225l-129 129l63 64l127 -129q105 78 230 78q118 0 223 -78l131 129l61 -62l-129 -129q78 -106 78 -227q0 -135 -78 -227l129 -127l-61 -62l-131 127q-104 -76 -223 -76q-126 0 -228 80l-129 -129l-61 62l127 127q-74 98 -74 225zM350 723 q0 -116 80 -196.5t197 -80.5t198.5 81t81.5 196q0 75 -36.5 140t-102.5 104t-141 39q-114 0 -195.5 -82t-81.5 -201z" />
<glyph unicode="&#xa5;" d="M584 645l544 817h117l-559 -823h266l-16 -76h-315l-39 -190h317l-18 -84h-316l-59 -289h-105l64 289h-299l18 84h299l41 190h-301l17 76h258l-215 823h100z" />
<glyph unicode="&#xa6;" d="M578 1561h100v-756h-100v756zM578 246h100v-756h-100v756z" />
<glyph unicode="&#xa7;" horiz-adv-x="995" d="M211 778q0 101 69.5 182t198.5 130q-64 31 -103.5 85.5t-39.5 120.5q0 74 46 134.5t132.5 94.5t202.5 34q163 0 289 -58l-31 -80q-138 54 -264 54q-124 0 -202.5 -46.5t-78.5 -123.5q0 -59 46 -104.5t183 -106.5q112 -52 158.5 -89.5t71 -85t24.5 -110.5 q0 -197 -249 -317q122 -64 122 -197q0 -86 -48 -153.5t-139.5 -105.5t-221.5 -38q-157 0 -275 53v99q47 -27 126 -46.5t153 -19.5q149 0 228 52.5t79 150.5q0 62 -42.5 106t-166.5 96q-155 65 -211.5 130t-56.5 159zM559 1038q-119 -30 -187.5 -97.5t-68.5 -154.5 q0 -57 24.5 -96.5t81 -73t187.5 -81.5q103 49 162 113.5t59 156.5q0 72 -57.5 126t-200.5 107z" />
<glyph unicode="&#xa8;" horiz-adv-x="1135" d="M836 1366q0 49 20.5 78t56.5 29q54 0 54 -64q0 -48 -21 -77t-55 -29q-55 0 -55 63zM492 1366q0 49 20.5 78t56.5 29q54 0 54 -64q0 -48 -21 -77t-55 -29q-55 0 -55 63z" />
<glyph unicode="&#xa9;" horiz-adv-x="1704" d="M944 1092q-142 0 -222.5 -94.5t-80.5 -264.5q0 -186 74.5 -275t220.5 -89q85 0 199 43v-88q-104 -45 -209 -45q-187 0 -288 116t-101 330q0 207 110 332t297 125q119 0 227 -52l-36 -83q-99 45 -191 45zM147 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275 t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM240 731q0 -178 88.5 -329.5t240.5 -240.5t330 -89q174 0 325 85.5t243 239t92 334.5q0 178 -89 330t-240.5 241t-330.5 89q-182 0 -335 -92t-238.5 -243t-85.5 -325z" />
<glyph unicode="&#xaa;" horiz-adv-x="643" d="M487 1485q55 0 97.5 -29t66.5 -86h6l35 103h66l-137 -650h-72l22 125h-4q-96 -137 -223 -137q-80 0 -127 56.5t-47 164.5q0 189 90.5 321t226.5 132zM369 885q66 0 133.5 75.5t97.5 184.5q16 51 16 123q0 58 -36 100.5t-93 42.5q-94 0 -161.5 -111.5t-67.5 -271.5 q0 -143 111 -143z" />
<glyph unicode="&#xab;" horiz-adv-x="860" d="M426 932l57 -49l-317 -336l213 -385l-64 -39l-254 418l2 26zM786 932l58 -49l-314 -336l209 -385l-63 -39l-254 418l2 26z" />
<glyph unicode="&#xac;" d="M1028 772v-500h-100v400h-803v100h903z" />
<glyph unicode="&#xad;" horiz-adv-x="629" d="M77 502zM77 502l18 90h457l-16 -90h-459z" />
<glyph unicode="&#xae;" horiz-adv-x="1704" d="M758 731h112q93 0 144 46.5t51 135.5q0 172 -197 172h-110v-354zM1169 918q0 -80 -39.5 -141t-109.5 -93l237 -393h-120l-211 360h-168v-360h-101v880h211q143 0 222 -62t79 -191zM150 731q0 207 103.5 382t276.5 272.5t371 97.5q200 0 375 -100t276 -275t101 -377 q0 -197 -97 -370t-272 -277t-383 -104q-204 0 -376.5 100.5t-273.5 273t-101 377.5zM242 731q0 -178 88.5 -329.5t240.5 -240.5t330 -89q174 0 325 85.5t243 239t92 334.5q0 178 -89 330t-240.5 241t-330.5 89q-182 0 -335 -92t-238.5 -243t-85.5 -325z" />
<glyph unicode="&#xaf;" horiz-adv-x="655" d="M1001 1556h-653l53 97h654z" />
<glyph unicode="&#xb0;" horiz-adv-x="877" d="M242 1190q0 120 85 206.5t208 86.5q122 0 207 -86.5t85 -206.5q0 -122 -85.5 -207.5t-206.5 -85.5q-122 0 -207.5 85.5t-85.5 207.5zM315 1190q0 -89 64.5 -153t155.5 -64q92 0 155.5 64t63.5 153q0 90 -64 155.5t-155 65.5q-90 0 -155 -65.5t-65 -155.5z" />
<glyph unicode="&#xb1;" d="M528 629h-401v98h401v406h101v-406h401v-98h-401v-400h-101v400zM127 0v100h903v-100h-903z" />
<glyph unicode="&#xb2;" horiz-adv-x="643" d="M604 586h-522l16 80l297 258q137 118 182.5 190.5t45.5 153.5q0 59 -38.5 97t-105.5 38q-95 0 -194 -76l-41 62q108 90 239 90q73 0 125 -27t78.5 -72t26.5 -100q0 -106 -59 -198.5t-183 -194.5l-266 -223h416z" />
<glyph unicode="&#xb3;" horiz-adv-x="643" d="M705 1276q0 -85 -48.5 -148t-154.5 -88v-4q66 -16 105.5 -68t39.5 -124q0 -77 -39 -141t-109 -99t-161 -35q-59 0 -123.5 15.5t-105.5 40.5v90q46 -28 108 -48t125 -20q99 0 159 52.5t60 142.5q0 162 -196 162h-84l16 79h86q102 0 168.5 49.5t66.5 129.5 q0 68 -37.5 102.5t-105.5 34.5q-100 0 -199 -68l-40 64q109 86 251 86q100 0 159 -56.5t59 -148.5z" />
<glyph unicode="&#xb4;" horiz-adv-x="1135" d="M580 1262q66 51 150.5 142t129.5 165h137v-23q-51 -66 -157.5 -158.5t-192.5 -146.5h-67v21z" />
<glyph unicode="&#xb5;" horiz-adv-x="1171" d="M238 242q0 -82 48.5 -127t135.5 -45q110 0 207 64.5t162.5 182.5t101.5 285l104 485h99l-234 -1087h-78l29 205h-6q-164 -221 -404 -221q-85 0 -139 32.5t-76 89.5h-6q-18 -132 -51 -284l-63 -314h-97l338 1579h101l-152 -698q-20 -96 -20 -147z" />
<glyph unicode="&#xb6;" horiz-adv-x="1341" d="M1208 -260h-100v1722h-227v-1722h-101v819q-64 -18 -145 -18q-216 0 -318 125t-102 376q0 260 109 387t342 127h542v-1816z" />
<glyph unicode="&#xb7;" horiz-adv-x="485" d="M207 625zM207 698q0 56 25 88.5t69 32.5q66 0 66 -72q0 -53 -25 -87.5t-67 -34.5q-68 0 -68 73z" />
<glyph unicode="&#xb8;" horiz-adv-x="420" d="M197 -289q0 -94 -75.5 -148.5t-217.5 -54.5q-46 0 -78 7v79q30 -6 72 -6q198 0 198 115q0 97 -151 107l110 190h80l-78 -137q140 -30 140 -152z" />
<glyph unicode="&#xb9;" horiz-adv-x="643" d="M512 1462h80l-186 -876h-84l118 569q5 21 11.5 50.5t14 60t15.5 59t15 49.5q-34 -31 -60 -51.5t-143 -93.5l-39 59z" />
<glyph unicode="&#xba;" horiz-adv-x="655" d="M518 1479q105 0 165 -64t60 -180q0 -115 -40 -214t-114 -156.5t-175 -57.5q-114 0 -169 67.5t-55 184.5q0 112 41.5 209.5t116 154t170.5 56.5zM508 1405q-70 0 -124 -46.5t-84 -124.5t-30 -167q0 -186 156 -186q73 0 125.5 46.5t81.5 127.5t29 176q0 83 -39 128.5 t-115 45.5z" />
<glyph unicode="&#xbb;" horiz-adv-x="860" d="M451 123l-58 49l314 336l-209 385l63 39l254 -418l-2 -27zM90 123l-57 49l313 336l-209 385l64 39l254 -418l-2 -27z" />
<glyph unicode="&#xbc;" horiz-adv-x="1481" d="M129 0zM1319 230h-131l-49 -229h-82l49 229h-391l21 76l506 577h86l-125 -581h133zM1121 302q61 294 79 365.5t29 105.5q-10 -16 -61 -79t-338 -392h291zM1323 1462l-1087 -1462h-107l1086 1462h108zM509 1462h80l-186 -876h-84l118 569q5 21 11.5 50.5t14 60t15.5 59 t15 49.5q-34 -31 -60 -51.5t-143 -93.5l-39 59z" />
<glyph unicode="&#xbd;" horiz-adv-x="1458" d="M53 0zM1278 1h-522l16 80l297 258q137 118 182.5 190.5t45.5 153.5q0 59 -38.5 97t-105.5 38q-95 0 -194 -76l-41 62q108 90 239 90q73 0 125 -27t78.5 -72t26.5 -100q0 -106 -59 -198.5t-183 -194.5l-266 -223h416zM431 1462h80l-186 -876h-84l118 569q5 21 11.5 50.5 t14 60t15.5 59t15 49.5q-34 -31 -60 -51.5t-143 -93.5l-39 59zM1247 1462l-1087 -1462h-107l1086 1462h108z" />
<glyph unicode="&#xbe;" horiz-adv-x="1458" d="M71 0zM1380 230h-131l-49 -229h-82l49 229h-391l21 76l506 577h86l-125 -581h133zM1182 302q61 294 79 365.5t29 105.5q-10 -16 -61 -79t-338 -392h291zM667 1276q0 -85 -48.5 -148t-154.5 -88v-4q66 -16 105.5 -68t39.5 -124q0 -77 -39 -141t-109 -99t-161 -35 q-59 0 -123.5 15.5t-105.5 40.5v90q46 -28 108 -48t125 -20q99 0 159 52.5t60 142.5q0 162 -196 162h-84l16 79h86q102 0 168.5 49.5t66.5 129.5q0 68 -37.5 102.5t-105.5 34.5q-100 0 -199 -68l-40 64q109 86 251 86q100 0 159 -56.5t59 -148.5zM1407 1462l-1087 -1462 h-107l1086 1462h108z" />
<glyph unicode="&#xbf;" horiz-adv-x="799" d="M641 717l-6 -29q-28 -127 -79 -200t-161 -154q-118 -84 -175 -145.5t-86.5 -127.5t-29.5 -141q0 -106 65.5 -168.5t184.5 -62.5q141 0 308 100l38 -86q-85 -49 -170.5 -77.5t-187.5 -28.5q-159 0 -250.5 84.5t-91.5 228.5q0 133 70 240.5t227 220.5q85 61 133.5 109 t73 95t45.5 142h92zM713 1020q0 -56 -25.5 -88.5t-69.5 -32.5q-65 0 -65 72q0 56 25 89.5t67 33.5q68 0 68 -74z" />
<glyph unicode="&#xc0;" horiz-adv-x="1059" d="M0 0zM805 520h-512l-287 -520h-117l822 1468h67l201 -1468h-105zM793 612l-39 291q-31 242 -39 402q-30 -63 -64.5 -130t-306.5 -563h449zM815 1579h-66q-50 52 -114 144.5t-99 162.5v21h115q46 -129 164 -303v-25z" />
<glyph unicode="&#xc1;" horiz-adv-x="1059" d="M0 0zM805 520h-512l-287 -520h-117l822 1468h67l201 -1468h-105zM793 612l-39 291q-31 242 -39 402q-30 -63 -64.5 -130t-306.5 -563h449zM668 1600q66 51 150.5 142t129.5 165h137v-23q-51 -66 -157.5 -158.5t-192.5 -146.5h-67v21z" />
<glyph unicode="&#xc2;" horiz-adv-x="1059" d="M0 0zM805 520h-512l-287 -520h-117l822 1468h67l201 -1468h-105zM793 612l-39 291q-31 242 -39 402q-30 -63 -64.5 -130t-306.5 -563h449zM1007 1579h-49q-70 60 -161 207q-55 -57 -125 -114.5t-125 -92.5h-54v29q68 56 157.5 148.5t127.5 150.5h64q23 -64 72.5 -152.5 t92.5 -146.5v-29z" />
<glyph unicode="&#xc3;" horiz-adv-x="1059" d="M0 0zM805 520h-512l-287 -520h-117l822 1468h67l201 -1468h-105zM793 612l-39 291q-31 242 -39 402q-30 -63 -64.5 -130t-306.5 -563h449zM911 1587q-40 0 -77.5 19t-75.5 45q-34 23 -64.5 41t-68.5 18q-45 0 -74 -28.5t-51 -100.5h-74q19 108 71 166.5t134 58.5 q41 0 73.5 -14t117.5 -72q52 -36 94 -36q43 0 71.5 30.5t46.5 100.5h76q-26 -118 -74.5 -173t-124.5 -55z" />
<glyph unicode="&#xc4;" horiz-adv-x="1059" d="M0 0zM805 520h-512l-287 -520h-117l822 1468h67l201 -1468h-105zM793 612l-39 291q-31 242 -39 402q-30 -63 -64.5 -130t-306.5 -563h449zM879 1704q0 49 20.5 78t56.5 29q54 0 54 -64q0 -48 -21 -77t-55 -29q-55 0 -55 63zM535 1704q0 49 20.5 78t56.5 29q54 0 54 -64 q0 -48 -21 -77t-55 -29q-55 0 -55 63z" />
<glyph unicode="&#xc5;" horiz-adv-x="1059" d="M0 0zM805 520h-512l-287 -520h-117l822 1468h67l201 -1468h-105zM793 612l-39 291q-31 242 -39 402q-30 -63 -64.5 -130t-306.5 -563h449zM945 1600q0 -92 -57.5 -148.5t-145.5 -56.5q-93 0 -148 52t-55 145q0 88 59.5 144t149.5 56q88 0 142.5 -50t54.5 -142zM867 1598 q0 57 -33.5 90t-87.5 33q-60 0 -93.5 -36t-33.5 -93t33 -90t90 -33q56 0 90.5 36t34.5 93z" />
<glyph unicode="&#xc6;" horiz-adv-x="1640" d="M1403 0h-727l110 522h-444l-328 -522h-131l946 1462h883l-20 -94h-625l-117 -553h590l-20 -94h-588l-135 -627h626zM408 627h401l156 741h-88z" />
<glyph unicode="&#xc7;" horiz-adv-x="1169" d="M170 0zM961 1389q-197 0 -351.5 -104.5t-245 -304.5t-90.5 -441q0 -225 110.5 -346t317.5 -121q140 0 304 51v-94q-156 -49 -316 -49q-252 0 -386 145t-134 410q0 266 104.5 488t284.5 341t402 119q177 0 307 -68l-45 -90q-55 30 -124.5 47t-137.5 17zM752 -289 q0 -94 -75.5 -148.5t-217.5 -54.5q-46 0 -78 7v79q30 -6 72 -6q198 0 198 115q0 97 -151 107l110 190h80l-78 -137q140 -30 140 -152z" />
<glyph unicode="&#xc8;" horiz-adv-x="1067" d="M102 0zM829 0h-727l310 1462h727l-21 -94h-624l-117 -553h590l-21 -94h-588l-135 -627h627zM891 1579h-66q-50 52 -114 144.5t-99 162.5v21h115q46 -129 164 -303v-25z" />
<glyph unicode="&#xc9;" horiz-adv-x="1067" d="M102 0zM829 0h-727l310 1462h727l-21 -94h-624l-117 -553h590l-21 -94h-588l-135 -627h627zM654 1600q66 51 150.5 142t129.5 165h137v-23q-51 -66 -157.5 -158.5t-192.5 -146.5h-67v21z" />
<glyph unicode="&#xca;" horiz-adv-x="1067" d="M102 0zM829 0h-727l310 1462h727l-21 -94h-624l-117 -553h590l-21 -94h-588l-135 -627h627zM1036 1579h-49q-70 60 -161 207q-55 -57 -125 -114.5t-125 -92.5h-54v29q68 56 157.5 148.5t127.5 150.5h64q23 -64 72.5 -152.5t92.5 -146.5v-29z" />
<glyph unicode="&#xcb;" horiz-adv-x="1067" d="M102 0zM829 0h-727l310 1462h727l-21 -94h-624l-117 -553h590l-21 -94h-588l-135 -627h627zM902 1704q0 49 20.5 78t56.5 29q54 0 54 -64q0 -48 -21 -77t-55 -29q-55 0 -55 63zM558 1704q0 49 20.5 78t56.5 29q54 0 54 -64q0 -48 -21 -77t-55 -29q-55 0 -55 63z" />
<glyph unicode="&#xcc;" horiz-adv-x="504" d="M102 0zM102 0l310 1462h98l-309 -1462h-99zM525 1579h-66q-50 52 -114 144.5t-99 162.5v21h115q46 -129 164 -303v-25z" />
<glyph unicode="&#xcd;" horiz-adv-x="504" d="M102 0zM102 0l310 1462h98l-309 -1462h-99zM419 1600q66 51 150.5 142t129.5 165h137v-23q-51 -66 -157.5 -158.5t-192.5 -146.5h-67v21z" />
<glyph unicode="&#xce;" horiz-adv-x="504" d="M102 0zM102 0l310 1462h98l-309 -1462h-99zM738 1579h-49q-70 60 -161 207q-55 -57 -125 -114.5t-125 -92.5h-54v29q68 56 157.5 148.5t127.5 150.5h64q23 -64 72.5 -152.5t92.5 -146.5v-29z" />
<glyph unicode="&#xcf;" horiz-adv-x="504" d="M102 0zM102 0l310 1462h98l-309 -1462h-99zM604 1704q0 49 20.5 78t56.5 29q54 0 54 -64q0 -48 -21 -77t-55 -29q-55 0 -55 63zM260 1704q0 49 20.5 78t56.5 29q54 0 54 -64q0 -48 -21 -77t-55 -29q-55 0 -55 63z" />
<glyph unicode="&#xd0;" horiz-adv-x="1352" d="M1288 879q0 -253 -109.5 -461.5t-300.5 -313t-446 -104.5h-330l144 676h-156l21 96h155l146 690h305q282 0 426.5 -147.5t144.5 -435.5zM430 90q226 0 394.5 94.5t261 275.5t92.5 412q0 498 -476 498h-206l-129 -598h378l-20 -96h-379l-125 -586h209z" />
<glyph unicode="&#xd1;" horiz-adv-x="1372" d="M102 0zM1069 0h-86l-516 1284h-8q-23 -149 -48 -273t-214 -1011h-95l310 1462h80l522 -1294h8q23 176 74 416l188 878h94zM1062 1587q-40 0 -77.5 19t-75.5 45q-34 23 -64.5 41t-68.5 18q-45 0 -74 -28.5t-51 -100.5h-74q19 108 71 166.5t134 58.5q41 0 73.5 -14 t117.5 -72q52 -36 94 -36q43 0 71.5 30.5t46.5 100.5h76q-26 -118 -74.5 -173t-124.5 -55z" />
<glyph unicode="&#xd2;" horiz-adv-x="1464" d="M172 0zM1403 911q0 -255 -94 -481.5t-252 -338t-365 -111.5q-250 0 -385 149t-135 430q0 262 93 477.5t255 331t373 115.5q247 0 378.5 -148.5t131.5 -423.5zM879 1389q-174 0 -308.5 -101t-214.5 -298t-80 -417q0 -245 109.5 -373t319.5 -128q169 0 300 98.5t210 300 t79 430.5q0 240 -104.5 364t-310.5 124zM989 1579h-66q-50 52 -114 144.5t-99 162.5v21h115q46 -129 164 -303v-25z" />
<glyph unicode="&#xd3;" horiz-adv-x="1464" d="M172 0zM1403 911q0 -255 -94 -481.5t-252 -338t-365 -111.5q-250 0 -385 149t-135 430q0 262 93 477.5t255 331t373 115.5q247 0 378.5 -148.5t131.5 -423.5zM879 1389q-174 0 -308.5 -101t-214.5 -298t-80 -417q0 -245 109.5 -373t319.5 -128q169 0 300 98.5t210 300 t79 430.5q0 240 -104.5 364t-310.5 124zM844 1600q66 51 150.5 142t129.5 165h137v-23q-51 -66 -157.5 -158.5t-192.5 -146.5h-67v21z" />
<glyph unicode="&#xd4;" horiz-adv-x="1464" d="M172 0zM1403 911q0 -255 -94 -481.5t-252 -338t-365 -111.5q-250 0 -385 149t-135 430q0 262 93 477.5t255 331t373 115.5q247 0 378.5 -148.5t131.5 -423.5zM879 1389q-174 0 -308.5 -101t-214.5 -298t-80 -417q0 -245 109.5 -373t319.5 -128q169 0 300 98.5t210 300 t79 430.5q0 240 -104.5 364t-310.5 124zM1171 1579h-49q-70 60 -161 207q-55 -57 -125 -114.5t-125 -92.5h-54v29q68 56 157.5 148.5t127.5 150.5h64q23 -64 72.5 -152.5t92.5 -146.5v-29z" />
<glyph unicode="&#xd5;" horiz-adv-x="1464" d="M172 0zM1403 911q0 -255 -94 -481.5t-252 -338t-365 -111.5q-250 0 -385 149t-135 430q0 262 93 477.5t255 331t373 115.5q247 0 378.5 -148.5t131.5 -423.5zM879 1389q-174 0 -308.5 -101t-214.5 -298t-80 -417q0 -245 109.5 -373t319.5 -128q169 0 300 98.5t210 300 t79 430.5q0 240 -104.5 364t-310.5 124zM1077 1587q-40 0 -77.5 19t-75.5 45q-34 23 -64.5 41t-68.5 18q-45 0 -74 -28.5t-51 -100.5h-74q19 108 71 166.5t134 58.5q41 0 73.5 -14t117.5 -72q52 -36 94 -36q43 0 71.5 30.5t46.5 100.5h76q-26 -118 -74.5 -173t-124.5 -55z " />
<glyph unicode="&#xd6;" horiz-adv-x="1464" d="M172 0zM1403 911q0 -255 -94 -481.5t-252 -338t-365 -111.5q-250 0 -385 149t-135 430q0 262 93 477.5t255 331t373 115.5q247 0 378.5 -148.5t131.5 -423.5zM879 1389q-174 0 -308.5 -101t-214.5 -298t-80 -417q0 -245 109.5 -373t319.5 -128q169 0 300 98.5t210 300 t79 430.5q0 240 -104.5 364t-310.5 124zM1031 1704q0 49 20.5 78t56.5 29q54 0 54 -64q0 -48 -21 -77t-55 -29q-55 0 -55 63zM687 1704q0 49 20.5 78t56.5 29q54 0 54 -64q0 -48 -21 -77t-55 -29q-55 0 -55 63z" />
<glyph unicode="&#xd7;" d="M551 723l-330 332l70 69l330 -329l333 329l68 -67l-332 -334l332 -332l-68 -67l-333 329l-330 -327l-68 67z" />
<glyph unicode="&#xd8;" horiz-adv-x="1464" d="M1403 911q0 -187 -52 -365.5t-144.5 -304.5t-223 -193.5t-291.5 -67.5q-215 0 -348 112l-139 -170l-66 64l146 172q-113 149 -113 401q0 263 94 479.5t256.5 330.5t370.5 114q219 0 352 -121l133 168l70 -53l-145 -183q45 -51 72.5 -161t27.5 -222zM879 1389 q-134 0 -244 -59.5t-188.5 -170t-124.5 -267.5t-46 -319q0 -105 21.5 -191t56.5 -138l826 1032q-107 113 -301 113zM1294 901q0 85 -17.5 172t-43.5 129l-821 -1030q107 -100 293 -100q170 0 301 100t209.5 296.5t78.5 432.5z" />
<glyph unicode="&#xd9;" horiz-adv-x="1370" d="M176 0zM1395 1462l-207 -977q-58 -270 -197 -387.5t-375 -117.5q-440 0 -440 401q0 83 27 201l186 880h103l-193 -899q-20 -89 -20 -184q0 -309 342 -309q195 0 307.5 96.5t158.5 318.5l207 977h101zM946 1579h-66q-50 52 -114 144.5t-99 162.5v21h115q46 -129 164 -303 v-25z" />
<glyph unicode="&#xda;" horiz-adv-x="1370" d="M176 0zM1395 1462l-207 -977q-58 -270 -197 -387.5t-375 -117.5q-440 0 -440 401q0 83 27 201l186 880h103l-193 -899q-20 -89 -20 -184q0 -309 342 -309q195 0 307.5 96.5t158.5 318.5l207 977h101zM838 1600q66 51 150.5 142t129.5 165h137v-23q-51 -66 -157.5 -158.5 t-192.5 -146.5h-67v21z" />
<glyph unicode="&#xdb;" horiz-adv-x="1370" d="M176 0zM1395 1462l-207 -977q-58 -270 -197 -387.5t-375 -117.5q-440 0 -440 401q0 83 27 201l186 880h103l-193 -899q-20 -89 -20 -184q0 -309 342 -309q195 0 307.5 96.5t158.5 318.5l207 977h101zM1148 1579h-49q-70 60 -161 207q-55 -57 -125 -114.5t-125 -92.5h-54 v29q68 56 157.5 148.5t127.5 150.5h64q23 -64 72.5 -152.5t92.5 -146.5v-29z" />
<glyph unicode="&#xdc;" horiz-adv-x="1370" d="M176 0zM1395 1462l-207 -977q-58 -270 -197 -387.5t-375 -117.5q-440 0 -440 401q0 83 27 201l186 880h103l-193 -899q-20 -89 -20 -184q0 -309 342 -309q195 0 307.5 96.5t158.5 318.5l207 977h101zM1022 1704q0 49 20.5 78t56.5 29q54 0 54 -64q0 -48 -21 -77t-55 -29 q-55 0 -55 63zM678 1704q0 49 20.5 78t56.5 29q54 0 54 -64q0 -48 -21 -77t-55 -29q-55 0 -55 63z" />
<glyph unicode="&#xdd;" horiz-adv-x="965" d="M193 0zM494 645l544 817h117l-631 -932l-108 -530h-105l119 545l-237 917h100zM563 1600q66 51 150.5 142t129.5 165h137v-23q-51 -66 -157.5 -158.5t-192.5 -146.5h-67v21z" />
<glyph unicode="&#xde;" horiz-adv-x="1145" d="M1087 836q0 -247 -153 -373.5t-457 -126.5h-201l-71 -336h-103l310 1462h102l-57 -266h213q200 0 308.5 -92.5t108.5 -267.5zM293 428h190q256 0 376 98.5t120 302.5q0 275 -330 275h-211z" />
<glyph unicode="&#xdf;" horiz-adv-x="1094" d="M-162 -492q-73 0 -119 23v90q53 -24 115 -24q79 0 123 50.5t66 153.5l305 1409q80 357 405 357q137 0 215 -61.5t78 -174.5q0 -75 -44.5 -140.5t-166.5 -148.5q-107 -76 -141.5 -124.5t-34.5 -106.5q0 -51 34 -88.5t93 -75.5q96 -63 138 -133.5t42 -165.5 q0 -170 -106.5 -269t-286.5 -99q-143 0 -234 65v109q45 -36 112.5 -59t129.5 -23q132 0 208.5 71t76.5 195q0 75 -31.5 129t-109.5 108q-82 58 -119 110.5t-37 121.5q0 57 21 103t60.5 88.5t137.5 113.5q101 70 131.5 116t30.5 101q0 70 -55 110t-150 40q-129 0 -205 -76 t-108 -229l-291 -1377q-33 -152 -103.5 -220.5t-179.5 -68.5z" />
<glyph unicode="&#xe0;" horiz-adv-x="1133" d="M102 0zM655 1104q232 0 279 -219h6l59 202h80l-229 -1087h-82l45 274h-6q-84 -142 -187 -218t-237 -76q-281 0 -281 374q0 197 75 376t200.5 276.5t277.5 97.5zM406 70q89 0 177.5 62t159 166t107.5 230t37 213q0 79 -26 141.5t-77 99t-127 36.5q-124 0 -224 -82 t-164 -245.5t-64 -325.5q0 -152 50 -223.5t151 -71.5zM809 1241h-66q-50 52 -114 144.5t-99 162.5v21h115q46 -129 164 -303v-25z" />
<glyph unicode="&#xe1;" horiz-adv-x="1133" d="M102 0zM655 1104q232 0 279 -219h6l59 202h80l-229 -1087h-82l45 274h-6q-84 -142 -187 -218t-237 -76q-281 0 -281 374q0 197 75 376t200.5 276.5t277.5 97.5zM406 70q89 0 177.5 62t159 166t107.5 230t37 213q0 79 -26 141.5t-77 99t-127 36.5q-124 0 -224 -82 t-164 -245.5t-64 -325.5q0 -152 50 -223.5t151 -71.5zM586 1262q66 51 150.5 142t129.5 165h137v-23q-51 -66 -157.5 -158.5t-192.5 -146.5h-67v21z" />
<glyph unicode="&#xe2;" horiz-adv-x="1133" d="M102 0zM655 1104q232 0 279 -219h6l59 202h80l-229 -1087h-82l45 274h-6q-84 -142 -187 -218t-237 -76q-281 0 -281 374q0 197 75 376t200.5 276.5t277.5 97.5zM406 70q89 0 177.5 62t159 166t107.5 230t37 213q0 79 -26 141.5t-77 99t-127 36.5q-124 0 -224 -82 t-164 -245.5t-64 -325.5q0 -152 50 -223.5t151 -71.5zM955 1243h-49q-70 60 -161 207q-55 -57 -125 -114.5t-125 -92.5h-54v29q68 56 157.5 148.5t127.5 150.5h64q23 -64 72.5 -152.5t92.5 -146.5v-29z" />
<glyph unicode="&#xe3;" horiz-adv-x="1133" d="M102 0zM655 1104q232 0 279 -219h6l59 202h80l-229 -1087h-82l45 274h-6q-84 -142 -187 -218t-237 -76q-281 0 -281 374q0 197 75 376t200.5 276.5t277.5 97.5zM406 70q89 0 177.5 62t159 166t107.5 230t37 213q0 79 -26 141.5t-77 99t-127 36.5q-124 0 -224 -82 t-164 -245.5t-64 -325.5q0 -152 50 -223.5t151 -71.5zM858 1249q-40 0 -77.5 19t-75.5 45q-34 23 -64.5 41t-68.5 18q-45 0 -74 -28.5t-51 -100.5h-74q19 108 71 166.5t134 58.5q41 0 73.5 -14t117.5 -72q52 -36 94 -36q43 0 71.5 30.5t46.5 100.5h76q-26 -118 -74.5 -173 t-124.5 -55z" />
<glyph unicode="&#xe4;" horiz-adv-x="1133" d="M102 0zM655 1104q232 0 279 -219h6l59 202h80l-229 -1087h-82l45 274h-6q-84 -142 -187 -218t-237 -76q-281 0 -281 374q0 197 75 376t200.5 276.5t277.5 97.5zM406 70q89 0 177.5 62t159 166t107.5 230t37 213q0 79 -26 141.5t-77 99t-127 36.5q-124 0 -224 -82 t-164 -245.5t-64 -325.5q0 -152 50 -223.5t151 -71.5zM835 1366q0 49 20.5 78t56.5 29q54 0 54 -64q0 -48 -21 -77t-55 -29q-55 0 -55 63zM491 1366q0 49 20.5 78t56.5 29q54 0 54 -64q0 -48 -21 -77t-55 -29q-55 0 -55 63z" />
<glyph unicode="&#xe5;" horiz-adv-x="1133" d="M102 0zM655 1104q232 0 279 -219h6l59 202h80l-229 -1087h-82l45 274h-6q-84 -142 -187 -218t-237 -76q-281 0 -281 374q0 197 75 376t200.5 276.5t277.5 97.5zM406 70q89 0 177.5 62t159 166t107.5 230t37 213q0 79 -26 141.5t-77 99t-127 36.5q-124 0 -224 -82 t-164 -245.5t-64 -325.5q0 -152 50 -223.5t151 -71.5zM927 1448q0 -92 -57.5 -148.5t-145.5 -56.5q-93 0 -148 52t-55 145q0 88 59.5 144t149.5 56q88 0 142.5 -50t54.5 -142zM849 1446q0 57 -33.5 90t-87.5 33q-60 0 -93.5 -36t-33.5 -93t33 -90t90 -33q56 0 90.5 36 t34.5 93z" />
<glyph unicode="&#xe6;" horiz-adv-x="1602" d="M1155 -20q-123 0 -211 60t-117 165l-39 -205h-77l41 254h-9q-94 -142 -189 -208t-208 -66q-120 0 -182 94t-62 270q0 206 70.5 384.5t192.5 277t274 98.5q106 0 166 -56.5t74 -156.5h10l59 192h66l-35 -186q139 207 350 207q112 0 175 -61.5t63 -172.5 q0 -179 -158.5 -271.5t-470.5 -92.5h-39q-8 -51 -8 -96q0 -161 69.5 -250.5t217.5 -89.5q69 0 133.5 21t130.5 52v-94q-80 -37 -147 -53t-140 -16zM369 70q67 0 138.5 42t134 117.5t106 170.5t63.5 199t20 165q0 118 -49 186t-141 68q-123 0 -223 -86t-156.5 -240 t-56.5 -340q0 -150 42.5 -216t121.5 -66zM1317 1018q-119 0 -232 -115.5t-172 -308.5h48q263 0 383 67t120 203q0 71 -38.5 112.5t-108.5 41.5z" />
<glyph unicode="&#xe7;" horiz-adv-x="887" d="M102 0zM477 -20q-174 0 -274.5 110.5t-100.5 306.5q0 193 73.5 361.5t198.5 257t290 88.5q134 0 241 -43l-28 -90q-107 47 -218 47q-129 0 -232.5 -77t-162.5 -222t-59 -320q0 -158 73.5 -243.5t208.5 -85.5q71 0 131.5 13t131.5 46v-92q-116 -57 -273 -57zM574 -289 q0 -94 -75.5 -148.5t-217.5 -54.5q-46 0 -78 7v79q30 -6 72 -6q198 0 198 115q0 97 -151 107l110 190h80l-78 -137q140 -30 140 -152z" />
<glyph unicode="&#xe8;" horiz-adv-x="928" d="M102 0zM469 -20q-173 0 -270 109.5t-97 305.5q0 181 71 347t195.5 264t274.5 98q114 0 182 -61t68 -166q0 -181 -163.5 -276t-485.5 -95h-33q-6 -44 -6 -98q0 -165 74 -251.5t213 -86.5q132 0 276 73v-94q-140 -69 -299 -69zM631 1018q-131 0 -243.5 -115.5 t-162.5 -308.5h49q517 0 517 270q0 67 -43.5 110.5t-116.5 43.5zM751 1241h-66q-50 52 -114 144.5t-99 162.5v21h115q46 -129 164 -303v-25z" />
<glyph unicode="&#xe9;" horiz-adv-x="928" d="M102 0zM469 -20q-173 0 -270 109.5t-97 305.5q0 181 71 347t195.5 264t274.5 98q114 0 182 -61t68 -166q0 -181 -163.5 -276t-485.5 -95h-33q-6 -44 -6 -98q0 -165 74 -251.5t213 -86.5q132 0 276 73v-94q-140 -69 -299 -69zM631 1018q-131 0 -243.5 -115.5 t-162.5 -308.5h49q517 0 517 270q0 67 -43.5 110.5t-116.5 43.5zM532 1262q66 51 150.5 142t129.5 165h137v-23q-51 -66 -157.5 -158.5t-192.5 -146.5h-67v21z" />
<glyph unicode="&#xea;" horiz-adv-x="928" d="M102 0zM469 -20q-173 0 -270 109.5t-97 305.5q0 181 71 347t195.5 264t274.5 98q114 0 182 -61t68 -166q0 -181 -163.5 -276t-485.5 -95h-33q-6 -44 -6 -98q0 -165 74 -251.5t213 -86.5q132 0 276 73v-94q-140 -69 -299 -69zM631 1018q-131 0 -243.5 -115.5 t-162.5 -308.5h49q517 0 517 270q0 67 -43.5 110.5t-116.5 43.5zM904 1241h-49q-70 60 -161 207q-55 -57 -125 -114.5t-125 -92.5h-54v29q68 56 157.5 148.5t127.5 150.5h64q23 -64 72.5 -152.5t92.5 -146.5v-29z" />
<glyph unicode="&#xeb;" horiz-adv-x="928" d="M102 0zM469 -20q-173 0 -270 109.5t-97 305.5q0 181 71 347t195.5 264t274.5 98q114 0 182 -61t68 -166q0 -181 -163.5 -276t-485.5 -95h-33q-6 -44 -6 -98q0 -165 74 -251.5t213 -86.5q132 0 276 73v-94q-140 -69 -299 -69zM631 1018q-131 0 -243.5 -115.5 t-162.5 -308.5h49q517 0 517 270q0 67 -43.5 110.5t-116.5 43.5zM780 1366q0 49 20.5 78t56.5 29q54 0 54 -64q0 -48 -21 -77t-55 -29q-55 0 -55 63zM436 1366q0 49 20.5 78t56.5 29q54 0 54 -64q0 -48 -21 -77t-55 -29q-55 0 -55 63z" />
<glyph unicode="&#xec;" horiz-adv-x="475" d="M76 0zM174 0h-98l231 1087h96zM454 1241h-66q-50 52 -114 144.5t-99 162.5v21h115q46 -129 164 -303v-25z" />
<glyph unicode="&#xed;" horiz-adv-x="475" d="M76 0zM174 0h-98l231 1087h96zM284 1262q66 51 150.5 142t129.5 165h137v-23q-51 -66 -157.5 -158.5t-192.5 -146.5h-67v21z" />
<glyph unicode="&#xee;" horiz-adv-x="475" d="M76 0zM174 0h-98l231 1087h96zM642 1241h-49q-70 60 -161 207q-55 -57 -125 -114.5t-125 -92.5h-54v29q68 56 157.5 148.5t127.5 150.5h64q23 -64 72.5 -152.5t92.5 -146.5v-29z" />
<glyph unicode="&#xef;" horiz-adv-x="475" d="M76 0zM174 0h-98l231 1087h96zM515 1366q0 49 20.5 78t56.5 29q54 0 54 -64q0 -48 -21 -77t-55 -29q-55 0 -55 63zM171 1366q0 49 20.5 78t56.5 29q54 0 54 -64q0 -48 -21 -77t-55 -29q-55 0 -55 63z" />
<glyph unicode="&#xf0;" horiz-adv-x="1124" d="M713 1364q-54 60 -158 139l59 68q32 -26 81 -66t100 -94l266 150l39 -74l-256 -141q87 -116 131.5 -276t44.5 -335q0 -355 -141.5 -555t-399.5 -200q-177 0 -277 106.5t-100 294.5q0 170 63 301.5t178.5 203.5t262.5 72q107 0 188 -49.5t121 -142.5h5q0 139 -43 289 t-115 243l-295 -163l-39 73zM489 70q118 0 208.5 61t144 186.5t53.5 270.5q0 77 -35 142t-100 101.5t-156 36.5q-124 0 -213.5 -61.5t-137.5 -169.5t-48 -248q0 -153 73.5 -236t210.5 -83z" />
<glyph unicode="&#xf1;" horiz-adv-x="1143" d="M76 0zM764 0l149 692q21 92 21 156q0 80 -43.5 125t-134.5 45q-112 0 -210.5 -67t-166 -187.5t-103.5 -286.5l-102 -477h-98l231 1087h82l-37 -221h6q164 238 416 238q130 0 195 -64t65 -184q0 -70 -24 -182l-148 -674h-98zM874 1249q-40 0 -77.5 19t-75.5 45 q-34 23 -64.5 41t-68.5 18q-45 0 -74 -28.5t-51 -100.5h-74q19 108 71 166.5t134 58.5q41 0 73.5 -14t117.5 -72q52 -36 94 -36q43 0 71.5 30.5t46.5 100.5h76q-26 -118 -74.5 -173t-124.5 -55z" />
<glyph unicode="&#xf2;" horiz-adv-x="1124" d="M98 0zM649 1108q180 0 278.5 -108.5t98.5 -299.5q0 -197 -71.5 -368.5t-195.5 -261.5t-286 -90q-184 0 -279.5 109.5t-95.5 313.5q0 191 73 358t197 257t281 90zM641 1022q-124 0 -223 -78.5t-158 -225t-59 -310.5q0 -342 282 -342q127 0 225.5 77.5t157 228t58.5 330.5 q0 154 -73 237t-210 83zM744 1241h-66q-50 52 -114 144.5t-99 162.5v21h115q46 -129 164 -303v-25z" />
<glyph unicode="&#xf3;" horiz-adv-x="1124" d="M98 0zM649 1108q180 0 278.5 -108.5t98.5 -299.5q0 -197 -71.5 -368.5t-195.5 -261.5t-286 -90q-184 0 -279.5 109.5t-95.5 313.5q0 191 73 358t197 257t281 90zM641 1022q-124 0 -223 -78.5t-158 -225t-59 -310.5q0 -342 282 -342q127 0 225.5 77.5t157 228t58.5 330.5 q0 154 -73 237t-210 83zM573 1262q66 51 150.5 142t129.5 165h137v-23q-51 -66 -157.5 -158.5t-192.5 -146.5h-67v21z" />
<glyph unicode="&#xf4;" horiz-adv-x="1124" d="M98 0zM649 1108q180 0 278.5 -108.5t98.5 -299.5q0 -197 -71.5 -368.5t-195.5 -261.5t-286 -90q-184 0 -279.5 109.5t-95.5 313.5q0 191 73 358t197 257t281 90zM641 1022q-124 0 -223 -78.5t-158 -225t-59 -310.5q0 -342 282 -342q127 0 225.5 77.5t157 228t58.5 330.5 q0 154 -73 237t-210 83zM941 1241h-49q-70 60 -161 207q-55 -57 -125 -114.5t-125 -92.5h-54v29q68 56 157.5 148.5t127.5 150.5h64q23 -64 72.5 -152.5t92.5 -146.5v-29z" />
<glyph unicode="&#xf5;" horiz-adv-x="1124" d="M98 0zM649 1108q180 0 278.5 -108.5t98.5 -299.5q0 -197 -71.5 -368.5t-195.5 -261.5t-286 -90q-184 0 -279.5 109.5t-95.5 313.5q0 191 73 358t197 257t281 90zM641 1022q-124 0 -223 -78.5t-158 -225t-59 -310.5q0 -342 282 -342q127 0 225.5 77.5t157 228t58.5 330.5 q0 154 -73 237t-210 83zM839 1249q-40 0 -77.5 19t-75.5 45q-34 23 -64.5 41t-68.5 18q-45 0 -74 -28.5t-51 -100.5h-74q19 108 71 166.5t134 58.5q41 0 73.5 -14t117.5 -72q52 -36 94 -36q43 0 71.5 30.5t46.5 100.5h76q-26 -118 -74.5 -173t-124.5 -55z" />
<glyph unicode="&#xf6;" horiz-adv-x="1124" d="M98 0zM649 1108q180 0 278.5 -108.5t98.5 -299.5q0 -197 -71.5 -368.5t-195.5 -261.5t-286 -90q-184 0 -279.5 109.5t-95.5 313.5q0 191 73 358t197 257t281 90zM641 1022q-124 0 -223 -78.5t-158 -225t-59 -310.5q0 -342 282 -342q127 0 225.5 77.5t157 228t58.5 330.5 q0 154 -73 237t-210 83zM812 1366q0 49 20.5 78t56.5 29q54 0 54 -64q0 -48 -21 -77t-55 -29q-55 0 -55 63zM468 1366q0 49 20.5 78t56.5 29q54 0 54 -64q0 -48 -21 -77t-55 -29q-55 0 -55 63z" />
<glyph unicode="&#xf7;" d="M168 672v100h903v-100h-903zM522 373q0 106 96 106q48 0 73.5 -27.5t25.5 -78.5q0 -57 -29 -82t-70 -25q-96 0 -96 107zM522 1071q0 107 96 107q46 0 72.5 -27.5t26.5 -79.5q0 -57 -29 -81.5t-70 -24.5q-96 0 -96 106z" />
<glyph unicode="&#xf8;" horiz-adv-x="1124" d="M164 127q-66 106 -66 276q0 191 73 358t197 257t281 90q150 0 250 -82l109 133l65 -53l-117 -143q70 -105 70 -263q0 -197 -71.5 -368.5t-195.5 -261.5t-286 -90q-163 0 -254 83l-110 -135l-64 54zM924 702q0 101 -35 179l-608 -742q67 -73 202 -73q127 0 225.5 77.5 t157 228t58.5 330.5zM641 1022q-124 0 -223 -78.5t-158 -225t-59 -310.5q0 -125 32 -197l605 739q-74 72 -197 72z" />
<glyph unicode="&#xf9;" horiz-adv-x="1143" d="M109 0zM381 1087l-152 -698q-22 -106 -22 -158q0 -74 47.5 -117.5t138.5 -43.5q110 0 207.5 65.5t164 187t99.5 279.5l105 485h98l-231 -1087h-80l28 205h-6q-167 -221 -403 -221q-131 0 -198.5 62t-67.5 181q0 60 22 170l150 690h100zM774 1241h-66q-50 52 -114 144.5 t-99 162.5v21h115q46 -129 164 -303v-25z" />
<glyph unicode="&#xfa;" horiz-adv-x="1143" d="M109 0zM381 1087l-152 -698q-22 -106 -22 -158q0 -74 47.5 -117.5t138.5 -43.5q110 0 207.5 65.5t164 187t99.5 279.5l105 485h98l-231 -1087h-80l28 205h-6q-167 -221 -403 -221q-131 0 -198.5 62t-67.5 181q0 60 22 170l150 690h100zM627 1262q66 51 150.5 142 t129.5 165h137v-23q-51 -66 -157.5 -158.5t-192.5 -146.5h-67v21z" />
<glyph unicode="&#xfb;" horiz-adv-x="1143" d="M109 0zM381 1087l-152 -698q-22 -106 -22 -158q0 -74 47.5 -117.5t138.5 -43.5q110 0 207.5 65.5t164 187t99.5 279.5l105 485h98l-231 -1087h-80l28 205h-6q-167 -221 -403 -221q-131 0 -198.5 62t-67.5 181q0 60 22 170l150 690h100zM957 1241h-49q-70 60 -161 207 q-55 -57 -125 -114.5t-125 -92.5h-54v29q68 56 157.5 148.5t127.5 150.5h64q23 -64 72.5 -152.5t92.5 -146.5v-29z" />
<glyph unicode="&#xfc;" horiz-adv-x="1143" d="M109 0zM381 1087l-152 -698q-22 -106 -22 -158q0 -74 47.5 -117.5t138.5 -43.5q110 0 207.5 65.5t164 187t99.5 279.5l105 485h98l-231 -1087h-80l28 205h-6q-167 -221 -403 -221q-131 0 -198.5 62t-67.5 181q0 60 22 170l150 690h100zM827 1366q0 49 20.5 78t56.5 29 q54 0 54 -64q0 -48 -21 -77t-55 -29q-55 0 -55 63zM483 1366q0 49 20.5 78t56.5 29q54 0 54 -64q0 -48 -21 -77t-55 -29q-55 0 -55 63z" />
<glyph unicode="&#xfd;" horiz-adv-x="920" d="M0 0zM123 1087h100l82 -548q51 -351 55 -449h11q43 105 186 367l348 630h103l-713 -1290q-72 -127 -122.5 -178t-114 -81t-146.5 -30q-68 0 -129 21v92q71 -27 137 -27q80 0 147 49.5t130 164.5t100 184zM505 1262q66 51 150.5 142t129.5 165h137v-23 q-51 -66 -157.5 -158.5t-192.5 -146.5h-67v21z" />
<glyph unicode="&#xfe;" horiz-adv-x="1163" d="M498 -16q-230 0 -279 219h-4q-13 -72 -149 -695h-99l434 2048h99q-114 -535 -164 -751h6q93 156 199 229.5t231 73.5q133 0 206 -92.5t73 -282.5q0 -195 -72 -371t-197.5 -277t-283.5 -101zM748 1018q-86 0 -172.5 -57.5t-162.5 -169.5t-111.5 -238t-35.5 -207 q0 -125 61.5 -200.5t168.5 -75.5q124 0 225 84t164 243.5t63 325.5q0 295 -200 295z" />
<glyph unicode="&#xff;" horiz-adv-x="920" d="M0 0zM123 1087h100l82 -548q51 -351 55 -449h11q43 105 186 367l348 630h103l-713 -1290q-72 -127 -122.5 -178t-114 -81t-146.5 -30q-68 0 -129 21v92q71 -27 137 -27q80 0 147 49.5t130 164.5t100 184zM698 1366q0 49 20.5 78t56.5 29q54 0 54 -64q0 -48 -21 -77 t-55 -29q-55 0 -55 63zM354 1366q0 49 20.5 78t56.5 29q54 0 54 -64q0 -48 -21 -77t-55 -29q-55 0 -55 63z" />
<glyph unicode="&#x131;" horiz-adv-x="475" d="M174 0h-98l231 1087h96z" />
<glyph unicode="&#x152;" horiz-adv-x="1767" d="M1530 0h-666q-25 -6 -77.5 -13t-94.5 -7q-251 0 -385.5 149.5t-134.5 429.5q0 263 96 482t262 330.5t381 111.5q130 0 240 -21h688l-20 -94h-625l-117 -553h590l-20 -94h-588l-135 -627h626zM705 72q68 0 116 12l271 1290q-110 15 -189 15q-182 0 -321.5 -98.5 t-222.5 -293.5t-83 -424q0 -245 109 -373t320 -128z" />
<glyph unicode="&#x153;" horiz-adv-x="1720" d="M1262 -20q-135 0 -228 69t-125 201q-65 -127 -179 -198.5t-257 -71.5q-184 0 -279.5 109.5t-95.5 313.5q0 191 73 358t197 257t281 90q141 0 237 -74.5t126 -212.5q70 132 182.5 207.5t241.5 75.5q114 0 182 -61t68 -166q0 -181 -163.5 -276t-486.5 -95h-32 q-7 -38 -7 -98q0 -165 74 -251.5t213 -86.5q133 0 277 73v-94q-140 -69 -299 -69zM641 1022q-124 0 -223 -78.5t-158 -225t-59 -310.5q0 -342 282 -342q127 0 225.5 77.5t157 228t58.5 330.5q0 154 -73 237t-210 83zM1423 1018q-131 0 -243 -115t-162 -309h49q516 0 516 270 q0 70 -44.5 112t-115.5 42z" />
<glyph unicode="&#x178;" horiz-adv-x="965" d="M193 0zM494 645l544 817h117l-631 -932l-108 -530h-105l119 545l-237 917h100zM798 1704q0 49 20.5 78t56.5 29q54 0 54 -64q0 -48 -21 -77t-55 -29q-55 0 -55 63zM454 1704q0 49 20.5 78t56.5 29q54 0 54 -64q0 -48 -21 -77t-55 -29q-55 0 -55 63z" />
<glyph unicode="&#x2c6;" horiz-adv-x="1135" d="M958 1241h-49q-70 60 -161 207q-55 -57 -125 -114.5t-125 -92.5h-54v29q68 56 157.5 148.5t127.5 150.5h64q23 -64 72.5 -152.5t92.5 -146.5v-29z" />
<glyph unicode="&#x2da;" horiz-adv-x="1182" d="M967 1448q0 -92 -57.5 -148.5t-145.5 -56.5q-93 0 -148 52t-55 145q0 88 59.5 144t149.5 56q88 0 142.5 -50t54.5 -142zM889 1446q0 57 -33.5 90t-87.5 33q-60 0 -93.5 -36t-33.5 -93t33 -90t90 -33q56 0 90.5 36t34.5 93z" />
<glyph unicode="&#x2dc;" horiz-adv-x="1135" d="M831 1249q-40 0 -77.5 19t-75.5 45q-34 23 -64.5 41t-68.5 18q-45 0 -74 -28.5t-51 -100.5h-74q19 108 71 166.5t134 58.5q41 0 73.5 -14t117.5 -72q52 -36 94 -36q43 0 71.5 30.5t46.5 100.5h76q-26 -118 -74.5 -173t-124.5 -55z" />
<glyph unicode="&#x2000;" horiz-adv-x="953" />
<glyph unicode="&#x2001;" horiz-adv-x="1907" />
<glyph unicode="&#x2002;" horiz-adv-x="953" />
<glyph unicode="&#x2003;" horiz-adv-x="1907" />
<glyph unicode="&#x2004;" horiz-adv-x="635" />
<glyph unicode="&#x2005;" horiz-adv-x="476" />
<glyph unicode="&#x2006;" horiz-adv-x="317" />
<glyph unicode="&#x2007;" horiz-adv-x="317" />
<glyph unicode="&#x2008;" horiz-adv-x="238" />
<glyph unicode="&#x2009;" horiz-adv-x="381" />
<glyph unicode="&#x200a;" horiz-adv-x="105" />
<glyph unicode="&#x2010;" horiz-adv-x="629" d="M82 502l18 90h457l-16 -90h-459z" />
<glyph unicode="&#x2011;" horiz-adv-x="629" d="M82 502l18 90h457l-16 -90h-459z" />
<glyph unicode="&#x2012;" horiz-adv-x="629" d="M82 502l18 90h457l-16 -90h-459z" />
<glyph unicode="&#x2013;" horiz-adv-x="983" d="M66 502l18 90h807l-17 -90h-808z" />
<glyph unicode="&#x2014;" horiz-adv-x="1966" d="M68 502l18 90h1788l-16 -90h-1790z" />
<glyph unicode="&#x2018;" horiz-adv-x="299" d="M133 961l-4 22q41 100 116 231t161 248h73q-66 -106 -129.5 -242.5t-103.5 -258.5h-113z" />
<glyph unicode="&#x2019;" horiz-adv-x="299" d="M475 1462l4 -22q-43 -105 -117.5 -235.5t-158.5 -243.5h-74q66 106 129.5 242.5t103.5 258.5h113z" />
<glyph unicode="&#x201a;" horiz-adv-x="451" d="M246 238l4 -23q-40 -97 -115.5 -230t-161.5 -249h-73q68 110 131.5 248t101.5 254h113z" />
<glyph unicode="&#x201c;" horiz-adv-x="631" d="M133 961l-4 22q41 100 116 231t161 248h73q-66 -106 -129.5 -242.5t-103.5 -258.5h-113zM467 961l-4 22q43 104 120 238.5t156 240.5h74q-66 -106 -129.5 -242.5t-103.5 -258.5h-113z" />
<glyph unicode="&#x201d;" horiz-adv-x="631" d="M809 1462l4 -22q-43 -105 -117.5 -235.5t-158.5 -243.5h-74q66 106 129.5 242.5t103.5 258.5h113zM475 1462l4 -22q-43 -105 -117.5 -235.5t-158.5 -243.5h-74q66 106 129.5 242.5t103.5 258.5h113z" />
<glyph unicode="&#x201e;" horiz-adv-x="776" d="M561 238l4 -23q-43 -105 -117.5 -235.5t-158.5 -243.5h-74q66 108 129 242.5t105 259.5h112zM227 238l4 -23q-43 -105 -117.5 -235.5t-158.5 -243.5h-74q73 119 135.5 254.5t98.5 247.5h112z" />
<glyph unicode="&#x2022;" horiz-adv-x="793" d="M248 682q0 137 63 213t172 76q76 0 116 -39.5t40 -118.5q0 -125 -66 -207t-176 -82q-149 0 -149 158z" />
<glyph unicode="&#x2026;" horiz-adv-x="1489" d="M69 0zM69 55q0 56 25 88.5t69 32.5q66 0 66 -72q0 -53 -25 -87.5t-67 -34.5q-68 0 -68 73zM569 55q0 56 25 88.5t69 32.5q66 0 66 -72q0 -53 -25 -87.5t-67 -34.5q-68 0 -68 73zM1071 55q0 56 25 88.5t69 32.5q66 0 66 -72q0 -53 -25 -87.5t-67 -34.5q-68 0 -68 73z" />
<glyph unicode="&#x202f;" horiz-adv-x="381" />
<glyph unicode="&#x2039;" horiz-adv-x="537" d="M451 932l57 -49l-318 -336l213 -385l-63 -39l-254 418l2 26z" />
<glyph unicode="&#x203a;" horiz-adv-x="537" d="M94 123l-57 49l317 336l-213 385l64 39l254 -418l-2 -27z" />
<glyph unicode="&#x2044;" horiz-adv-x="274" d="M731 1462l-1087 -1462h-107l1086 1462h108z" />
<glyph unicode="&#x205f;" horiz-adv-x="476" />
<glyph unicode="&#x2074;" horiz-adv-x="643" d="M657 815h-131l-49 -229h-82l49 229h-391l21 76l506 577h86l-125 -581h133zM459 887q61 294 79 365.5t29 105.5q-10 -16 -61 -79t-338 -392h291z" />
<glyph unicode="&#x20ac;" d="M991 1389q-186 0 -330.5 -120.5t-226.5 -346.5h457l-21 -82h-460q-30 -98 -39 -217h442l-20 -82h-424q0 -243 89 -356t265 -113q115 0 252 57v-94q-129 -55 -270 -55q-209 0 -325 139.5t-116 394.5v27h-184l16 82h172q5 101 35 217h-170l19 82h174q95 273 270 417 t399 144q166 0 287 -90l-53 -82q-102 78 -238 78z" />
<glyph unicode="&#x2122;" horiz-adv-x="1534" d="M477 741h-86v643h-217v78h522v-78h-219v-643zM1077 741l-221 609h-6l4 -201v-408h-82v721h125l221 -606l223 606h125v-721h-86v398l4 207h-6l-227 -605h-74z" />
<glyph unicode="&#xe000;" horiz-adv-x="1085" d="M0 1085h1085v-1085h-1085v1085z" />
<glyph horiz-adv-x="1133" d="M0 0z" />
<hkern u1="&#x22;" u2="&#x178;" k="-20" />
<hkern u1="&#x22;" u2="&#x153;" k="123" />
<hkern u1="&#x22;" u2="&#xfc;" k="61" />
<hkern u1="&#x22;" u2="&#xfb;" k="61" />
<hkern u1="&#x22;" u2="&#xfa;" k="61" />
<hkern u1="&#x22;" u2="&#xf9;" k="61" />
<hkern u1="&#x22;" u2="&#xf8;" k="123" />
<hkern u1="&#x22;" u2="&#xf6;" k="123" />
<hkern u1="&#x22;" u2="&#xf5;" k="123" />
<hkern u1="&#x22;" u2="&#xf4;" k="123" />
<hkern u1="&#x22;" u2="&#xf3;" k="123" />
<hkern u1="&#x22;" u2="&#xf2;" k="123" />
<hkern u1="&#x22;" u2="&#xeb;" k="123" />
<hkern u1="&#x22;" u2="&#xea;" k="123" />
<hkern u1="&#x22;" u2="&#xe9;" k="123" />
<hkern u1="&#x22;" u2="&#xe8;" k="123" />
<hkern u1="&#x22;" u2="&#xe7;" k="123" />
<hkern u1="&#x22;" u2="&#xe6;" k="82" />
<hkern u1="&#x22;" u2="&#xe5;" k="82" />
<hkern u1="&#x22;" u2="&#xe4;" k="82" />
<hkern u1="&#x22;" u2="&#xe3;" k="82" />
<hkern u1="&#x22;" u2="&#xe2;" k="82" />
<hkern u1="&#x22;" u2="&#xe1;" k="82" />
<hkern u1="&#x22;" u2="&#xe0;" k="123" />
<hkern u1="&#x22;" u2="&#xdd;" k="-20" />
<hkern u1="&#x22;" u2="&#xc5;" k="143" />
<hkern u1="&#x22;" u2="&#xc4;" k="143" />
<hkern u1="&#x22;" u2="&#xc3;" k="143" />
<hkern u1="&#x22;" u2="&#xc2;" k="143" />
<hkern u1="&#x22;" u2="&#xc1;" k="143" />
<hkern u1="&#x22;" u2="&#xc0;" k="143" />
<hkern u1="&#x22;" u2="u" k="61" />
<hkern u1="&#x22;" u2="s" k="61" />
<hkern u1="&#x22;" u2="r" k="61" />
<hkern u1="&#x22;" u2="q" k="123" />
<hkern u1="&#x22;" u2="p" k="61" />
<hkern u1="&#x22;" u2="o" k="123" />
<hkern u1="&#x22;" u2="n" k="61" />
<hkern u1="&#x22;" u2="m" k="61" />
<hkern u1="&#x22;" u2="g" k="61" />
<hkern u1="&#x22;" u2="e" k="123" />
<hkern u1="&#x22;" u2="d" k="123" />
<hkern u1="&#x22;" u2="c" k="123" />
<hkern u1="&#x22;" u2="a" k="82" />
<hkern u1="&#x22;" u2="Y" k="-20" />
<hkern u1="&#x22;" u2="W" k="-41" />
<hkern u1="&#x22;" u2="V" k="-41" />
<hkern u1="&#x22;" u2="T" k="-41" />
<hkern u1="&#x22;" u2="A" k="143" />
<hkern u1="&#x27;" u2="&#x178;" k="-20" />
<hkern u1="&#x27;" u2="&#x153;" k="123" />
<hkern u1="&#x27;" u2="&#xfc;" k="61" />
<hkern u1="&#x27;" u2="&#xfb;" k="61" />
<hkern u1="&#x27;" u2="&#xfa;" k="61" />
<hkern u1="&#x27;" u2="&#xf9;" k="61" />
<hkern u1="&#x27;" u2="&#xf8;" k="123" />
<hkern u1="&#x27;" u2="&#xf6;" k="123" />
<hkern u1="&#x27;" u2="&#xf5;" k="123" />
<hkern u1="&#x27;" u2="&#xf4;" k="123" />
<hkern u1="&#x27;" u2="&#xf3;" k="123" />
<hkern u1="&#x27;" u2="&#xf2;" k="123" />
<hkern u1="&#x27;" u2="&#xeb;" k="123" />
<hkern u1="&#x27;" u2="&#xea;" k="123" />
<hkern u1="&#x27;" u2="&#xe9;" k="123" />
<hkern u1="&#x27;" u2="&#xe8;" k="123" />
<hkern u1="&#x27;" u2="&#xe7;" k="123" />
<hkern u1="&#x27;" u2="&#xe6;" k="82" />
<hkern u1="&#x27;" u2="&#xe5;" k="82" />
<hkern u1="&#x27;" u2="&#xe4;" k="82" />
<hkern u1="&#x27;" u2="&#xe3;" k="82" />
<hkern u1="&#x27;" u2="&#xe2;" k="82" />
<hkern u1="&#x27;" u2="&#xe1;" k="82" />
<hkern u1="&#x27;" u2="&#xe0;" k="123" />
<hkern u1="&#x27;" u2="&#xdd;" k="-20" />
<hkern u1="&#x27;" u2="&#xc5;" k="143" />
<hkern u1="&#x27;" u2="&#xc4;" k="143" />
<hkern u1="&#x27;" u2="&#xc3;" k="143" />
<hkern u1="&#x27;" u2="&#xc2;" k="143" />
<hkern u1="&#x27;" u2="&#xc1;" k="143" />
<hkern u1="&#x27;" u2="&#xc0;" k="143" />
<hkern u1="&#x27;" u2="u" k="61" />
<hkern u1="&#x27;" u2="s" k="61" />
<hkern u1="&#x27;" u2="r" k="61" />
<hkern u1="&#x27;" u2="q" k="123" />
<hkern u1="&#x27;" u2="p" k="61" />
<hkern u1="&#x27;" u2="o" k="123" />
<hkern u1="&#x27;" u2="n" k="61" />
<hkern u1="&#x27;" u2="m" k="61" />
<hkern u1="&#x27;" u2="g" k="61" />
<hkern u1="&#x27;" u2="e" k="123" />
<hkern u1="&#x27;" u2="d" k="123" />
<hkern u1="&#x27;" u2="c" k="123" />
<hkern u1="&#x27;" u2="a" k="82" />
<hkern u1="&#x27;" u2="Y" k="-20" />
<hkern u1="&#x27;" u2="W" k="-41" />
<hkern u1="&#x27;" u2="V" k="-41" />
<hkern u1="&#x27;" u2="T" k="-41" />
<hkern u1="&#x27;" u2="A" k="143" />
<hkern u1="&#x28;" u2="J" k="-184" />
<hkern u1="&#x2c;" u2="&#x178;" k="123" />
<hkern u1="&#x2c;" u2="&#x152;" k="102" />
<hkern u1="&#x2c;" u2="&#xdd;" k="123" />
<hkern u1="&#x2c;" u2="&#xdc;" k="41" />
<hkern u1="&#x2c;" u2="&#xdb;" k="41" />
<hkern u1="&#x2c;" u2="&#xda;" k="41" />
<hkern u1="&#x2c;" u2="&#xd9;" k="41" />
<hkern u1="&#x2c;" u2="&#xd8;" k="102" />
<hkern u1="&#x2c;" u2="&#xd6;" k="102" />
<hkern u1="&#x2c;" u2="&#xd5;" k="102" />
<hkern u1="&#x2c;" u2="&#xd4;" k="102" />
<hkern u1="&#x2c;" u2="&#xd3;" k="102" />
<hkern u1="&#x2c;" u2="&#xd2;" k="102" />
<hkern u1="&#x2c;" u2="&#xc7;" k="102" />
<hkern u1="&#x2c;" u2="Y" k="123" />
<hkern u1="&#x2c;" u2="W" k="123" />
<hkern u1="&#x2c;" u2="V" k="123" />
<hkern u1="&#x2c;" u2="U" k="41" />
<hkern u1="&#x2c;" u2="T" k="143" />
<hkern u1="&#x2c;" u2="Q" k="102" />
<hkern u1="&#x2c;" u2="O" k="102" />
<hkern u1="&#x2c;" u2="G" k="102" />
<hkern u1="&#x2c;" u2="C" k="102" />
<hkern u1="&#x2d;" u2="T" k="82" />
<hkern u1="&#x2e;" u2="&#x178;" k="123" />
<hkern u1="&#x2e;" u2="&#x152;" k="102" />
<hkern u1="&#x2e;" u2="&#xdd;" k="123" />
<hkern u1="&#x2e;" u2="&#xdc;" k="41" />
<hkern u1="&#x2e;" u2="&#xdb;" k="41" />
<hkern u1="&#x2e;" u2="&#xda;" k="41" />
<hkern u1="&#x2e;" u2="&#xd9;" k="41" />
<hkern u1="&#x2e;" u2="&#xd8;" k="102" />
<hkern u1="&#x2e;" u2="&#xd6;" k="102" />
<hkern u1="&#x2e;" u2="&#xd5;" k="102" />
<hkern u1="&#x2e;" u2="&#xd4;" k="102" />
<hkern u1="&#x2e;" u2="&#xd3;" k="102" />
<hkern u1="&#x2e;" u2="&#xd2;" k="102" />
<hkern u1="&#x2e;" u2="&#xc7;" k="102" />
<hkern u1="&#x2e;" u2="Y" k="123" />
<hkern u1="&#x2e;" u2="W" k="123" />
<hkern u1="&#x2e;" u2="V" k="123" />
<hkern u1="&#x2e;" u2="U" k="41" />
<hkern u1="&#x2e;" u2="T" k="143" />
<hkern u1="&#x2e;" u2="Q" k="102" />
<hkern u1="&#x2e;" u2="O" k="102" />
<hkern u1="&#x2e;" u2="G" k="102" />
<hkern u1="&#x2e;" u2="C" k="102" />
<hkern u1="A" u2="&#x201d;" k="143" />
<hkern u1="A" u2="&#x2019;" k="143" />
<hkern u1="A" u2="&#x178;" k="123" />
<hkern u1="A" u2="&#x152;" k="41" />
<hkern u1="A" u2="&#xdd;" k="123" />
<hkern u1="A" u2="&#xd8;" k="41" />
<hkern u1="A" u2="&#xd6;" k="41" />
<hkern u1="A" u2="&#xd5;" k="41" />
<hkern u1="A" u2="&#xd4;" k="41" />
<hkern u1="A" u2="&#xd3;" k="41" />
<hkern u1="A" u2="&#xd2;" k="41" />
<hkern u1="A" u2="&#xc7;" k="41" />
<hkern u1="A" u2="Y" k="123" />
<hkern u1="A" u2="W" k="82" />
<hkern u1="A" u2="V" k="82" />
<hkern u1="A" u2="T" k="143" />
<hkern u1="A" u2="Q" k="41" />
<hkern u1="A" u2="O" k="41" />
<hkern u1="A" u2="J" k="-266" />
<hkern u1="A" u2="G" k="41" />
<hkern u1="A" u2="C" k="41" />
<hkern u1="A" u2="&#x27;" k="143" />
<hkern u1="A" u2="&#x22;" k="143" />
<hkern u1="B" u2="&#x201e;" k="82" />
<hkern u1="B" u2="&#x201a;" k="82" />
<hkern u1="B" u2="&#x178;" k="20" />
<hkern u1="B" u2="&#xdd;" k="20" />
<hkern u1="B" u2="&#xc5;" k="41" />
<hkern u1="B" u2="&#xc4;" k="41" />
<hkern u1="B" u2="&#xc3;" k="41" />
<hkern u1="B" u2="&#xc2;" k="41" />
<hkern u1="B" u2="&#xc1;" k="41" />
<hkern u1="B" u2="&#xc0;" k="41" />
<hkern u1="B" u2="Z" k="20" />
<hkern u1="B" u2="Y" k="20" />
<hkern u1="B" u2="X" k="41" />
<hkern u1="B" u2="W" k="20" />
<hkern u1="B" u2="V" k="20" />
<hkern u1="B" u2="T" k="61" />
<hkern u1="B" u2="A" k="41" />
<hkern u1="B" u2="&#x2e;" k="82" />
<hkern u1="B" u2="&#x2c;" k="82" />
<hkern u1="C" u2="&#x152;" k="41" />
<hkern u1="C" u2="&#xd8;" k="41" />
<hkern u1="C" u2="&#xd6;" k="41" />
<hkern u1="C" u2="&#xd5;" k="41" />
<hkern u1="C" u2="&#xd4;" k="41" />
<hkern u1="C" u2="&#xd3;" k="41" />
<hkern u1="C" u2="&#xd2;" k="41" />
<hkern u1="C" u2="&#xc7;" k="41" />
<hkern u1="C" u2="Q" k="41" />
<hkern u1="C" u2="O" k="41" />
<hkern u1="C" u2="G" k="41" />
<hkern u1="C" u2="C" k="41" />
<hkern u1="D" u2="&#x201e;" k="82" />
<hkern u1="D" u2="&#x201a;" k="82" />
<hkern u1="D" u2="&#x178;" k="20" />
<hkern u1="D" u2="&#xdd;" k="20" />
<hkern u1="D" u2="&#xc5;" k="41" />
<hkern u1="D" u2="&#xc4;" k="41" />
<hkern u1="D" u2="&#xc3;" k="41" />
<hkern u1="D" u2="&#xc2;" k="41" />
<hkern u1="D" u2="&#xc1;" k="41" />
<hkern u1="D" u2="&#xc0;" k="41" />
<hkern u1="D" u2="Z" k="20" />
<hkern u1="D" u2="Y" k="20" />
<hkern u1="D" u2="X" k="41" />
<hkern u1="D" u2="W" k="20" />
<hkern u1="D" u2="V" k="20" />
<hkern u1="D" u2="T" k="61" />
<hkern u1="D" u2="A" k="41" />
<hkern u1="D" u2="&#x2e;" k="82" />
<hkern u1="D" u2="&#x2c;" k="82" />
<hkern u1="E" u2="J" k="-123" />
<hkern u1="F" u2="&#x201e;" k="123" />
<hkern u1="F" u2="&#x201a;" k="123" />
<hkern u1="F" u2="&#xc5;" k="41" />
<hkern u1="F" u2="&#xc4;" k="41" />
<hkern u1="F" u2="&#xc3;" k="41" />
<hkern u1="F" u2="&#xc2;" k="41" />
<hkern u1="F" u2="&#xc1;" k="41" />
<hkern u1="F" u2="&#xc0;" k="41" />
<hkern u1="F" u2="A" k="41" />
<hkern u1="F" u2="&#x3f;" k="-41" />
<hkern u1="F" u2="&#x2e;" k="123" />
<hkern u1="F" u2="&#x2c;" k="123" />
<hkern u1="K" u2="&#x152;" k="41" />
<hkern u1="K" u2="&#xd8;" k="41" />
<hkern u1="K" u2="&#xd6;" k="41" />
<hkern u1="K" u2="&#xd5;" k="41" />
<hkern u1="K" u2="&#xd4;" k="41" />
<hkern u1="K" u2="&#xd3;" k="41" />
<hkern u1="K" u2="&#xd2;" k="41" />
<hkern u1="K" u2="&#xc7;" k="41" />
<hkern u1="K" u2="Q" k="41" />
<hkern u1="K" u2="O" k="41" />
<hkern u1="K" u2="G" k="41" />
<hkern u1="K" u2="C" k="41" />
<hkern u1="L" u2="&#x201d;" k="164" />
<hkern u1="L" u2="&#x2019;" k="164" />
<hkern u1="L" u2="&#x178;" k="61" />
<hkern u1="L" u2="&#x152;" k="41" />
<hkern u1="L" u2="&#xdd;" k="61" />
<hkern u1="L" u2="&#xdc;" k="20" />
<hkern u1="L" u2="&#xdb;" k="20" />
<hkern u1="L" u2="&#xda;" k="20" />
<hkern u1="L" u2="&#xd9;" k="20" />
<hkern u1="L" u2="&#xd8;" k="41" />
<hkern u1="L" u2="&#xd6;" k="41" />
<hkern u1="L" u2="&#xd5;" k="41" />
<hkern u1="L" u2="&#xd4;" k="41" />
<hkern u1="L" u2="&#xd3;" k="41" />
<hkern u1="L" u2="&#xd2;" k="41" />
<hkern u1="L" u2="&#xc7;" k="41" />
<hkern u1="L" u2="Y" k="61" />
<hkern u1="L" u2="W" k="41" />
<hkern u1="L" u2="V" k="41" />
<hkern u1="L" u2="U" k="20" />
<hkern u1="L" u2="T" k="41" />
<hkern u1="L" u2="Q" k="41" />
<hkern u1="L" u2="O" k="41" />
<hkern u1="L" u2="G" k="41" />
<hkern u1="L" u2="C" k="41" />
<hkern u1="L" u2="&#x27;" k="164" />
<hkern u1="L" u2="&#x22;" k="164" />
<hkern u1="O" u2="&#x201e;" k="82" />
<hkern u1="O" u2="&#x201a;" k="82" />
<hkern u1="O" u2="&#x178;" k="20" />
<hkern u1="O" u2="&#xdd;" k="20" />
<hkern u1="O" u2="&#xc5;" k="41" />
<hkern u1="O" u2="&#xc4;" k="41" />
<hkern u1="O" u2="&#xc3;" k="41" />
<hkern u1="O" u2="&#xc2;" k="41" />
<hkern u1="O" u2="&#xc1;" k="41" />
<hkern u1="O" u2="&#xc0;" k="41" />
<hkern u1="O" u2="Z" k="20" />
<hkern u1="O" u2="Y" k="20" />
<hkern u1="O" u2="X" k="41" />
<hkern u1="O" u2="W" k="20" />
<hkern u1="O" u2="V" k="20" />
<hkern u1="O" u2="T" k="61" />
<hkern u1="O" u2="A" k="41" />
<hkern u1="O" u2="&#x2e;" k="82" />
<hkern u1="O" u2="&#x2c;" k="82" />
<hkern u1="P" u2="&#x201e;" k="266" />
<hkern u1="P" u2="&#x201a;" k="266" />
<hkern u1="P" u2="&#xc5;" k="102" />
<hkern u1="P" u2="&#xc4;" k="102" />
<hkern u1="P" u2="&#xc3;" k="102" />
<hkern u1="P" u2="&#xc2;" k="102" />
<hkern u1="P" u2="&#xc1;" k="102" />
<hkern u1="P" u2="&#xc0;" k="102" />
<hkern u1="P" u2="Z" k="20" />
<hkern u1="P" u2="X" k="41" />
<hkern u1="P" u2="A" k="102" />
<hkern u1="P" u2="&#x2e;" k="266" />
<hkern u1="P" u2="&#x2c;" k="266" />
<hkern u1="Q" u2="&#x201e;" k="82" />
<hkern u1="Q" u2="&#x201a;" k="82" />
<hkern u1="Q" u2="&#x178;" k="20" />
<hkern u1="Q" u2="&#xdd;" k="20" />
<hkern u1="Q" u2="&#xc5;" k="41" />
<hkern u1="Q" u2="&#xc4;" k="41" />
<hkern u1="Q" u2="&#xc3;" k="41" />
<hkern u1="Q" u2="&#xc2;" k="41" />
<hkern u1="Q" u2="&#xc1;" k="41" />
<hkern u1="Q" u2="&#xc0;" k="41" />
<hkern u1="Q" u2="Z" k="20" />
<hkern u1="Q" u2="Y" k="20" />
<hkern u1="Q" u2="X" k="41" />
<hkern u1="Q" u2="W" k="20" />
<hkern u1="Q" u2="V" k="20" />
<hkern u1="Q" u2="T" k="61" />
<hkern u1="Q" u2="A" k="41" />
<hkern u1="Q" u2="&#x2e;" k="82" />
<hkern u1="Q" u2="&#x2c;" k="82" />
<hkern u1="T" u2="&#x201e;" k="123" />
<hkern u1="T" u2="&#x201a;" k="123" />
<hkern u1="T" u2="&#x2014;" k="82" />
<hkern u1="T" u2="&#x2013;" k="82" />
<hkern u1="T" u2="&#x153;" k="143" />
<hkern u1="T" u2="&#x152;" k="41" />
<hkern u1="T" u2="&#xfd;" k="41" />
<hkern u1="T" u2="&#xfc;" k="102" />
<hkern u1="T" u2="&#xfb;" k="102" />
<hkern u1="T" u2="&#xfa;" k="102" />
<hkern u1="T" u2="&#xf9;" k="102" />
<hkern u1="T" u2="&#xf8;" k="143" />
<hkern u1="T" u2="&#xf6;" k="143" />
<hkern u1="T" u2="&#xf5;" k="143" />
<hkern u1="T" u2="&#xf4;" k="143" />
<hkern u1="T" u2="&#xf3;" k="143" />
<hkern u1="T" u2="&#xf2;" k="143" />
<hkern u1="T" u2="&#xeb;" k="143" />
<hkern u1="T" u2="&#xea;" k="143" />
<hkern u1="T" u2="&#xe9;" k="143" />
<hkern u1="T" u2="&#xe8;" k="143" />
<hkern u1="T" u2="&#xe7;" k="143" />
<hkern u1="T" u2="&#xe6;" k="164" />
<hkern u1="T" u2="&#xe5;" k="164" />
<hkern u1="T" u2="&#xe4;" k="164" />
<hkern u1="T" u2="&#xe3;" k="164" />
<hkern u1="T" u2="&#xe2;" k="164" />
<hkern u1="T" u2="&#xe1;" k="164" />
<hkern u1="T" u2="&#xe0;" k="143" />
<hkern u1="T" u2="&#xd8;" k="41" />
<hkern u1="T" u2="&#xd6;" k="41" />
<hkern u1="T" u2="&#xd5;" k="41" />
<hkern u1="T" u2="&#xd4;" k="41" />
<hkern u1="T" u2="&#xd3;" k="41" />
<hkern u1="T" u2="&#xd2;" k="41" />
<hkern u1="T" u2="&#xc7;" k="41" />
<hkern u1="T" u2="&#xc5;" k="143" />
<hkern u1="T" u2="&#xc4;" k="143" />
<hkern u1="T" u2="&#xc3;" k="143" />
<hkern u1="T" u2="&#xc2;" k="143" />
<hkern u1="T" u2="&#xc1;" k="143" />
<hkern u1="T" u2="&#xc0;" k="143" />
<hkern u1="T" u2="z" k="82" />
<hkern u1="T" u2="y" k="41" />
<hkern u1="T" u2="x" k="41" />
<hkern u1="T" u2="w" k="41" />
<hkern u1="T" u2="v" k="41" />
<hkern u1="T" u2="u" k="102" />
<hkern u1="T" u2="s" k="123" />
<hkern u1="T" u2="r" k="102" />
<hkern u1="T" u2="q" k="143" />
<hkern u1="T" u2="p" k="102" />
<hkern u1="T" u2="o" k="143" />
<hkern u1="T" u2="n" k="102" />
<hkern u1="T" u2="m" k="102" />
<hkern u1="T" u2="g" k="143" />
<hkern u1="T" u2="e" k="143" />
<hkern u1="T" u2="d" k="143" />
<hkern u1="T" u2="c" k="143" />
<hkern u1="T" u2="a" k="164" />
<hkern u1="T" u2="T" k="-41" />
<hkern u1="T" u2="Q" k="41" />
<hkern u1="T" u2="O" k="41" />
<hkern u1="T" u2="G" k="41" />
<hkern u1="T" u2="C" k="41" />
<hkern u1="T" u2="A" k="143" />
<hkern u1="T" u2="&#x3f;" k="-41" />
<hkern u1="T" u2="&#x2e;" k="123" />
<hkern u1="T" u2="&#x2d;" k="82" />
<hkern u1="T" u2="&#x2c;" k="123" />
<hkern u1="U" u2="&#x201e;" k="41" />
<hkern u1="U" u2="&#x201a;" k="41" />
<hkern u1="U" u2="&#xc5;" k="20" />
<hkern u1="U" u2="&#xc4;" k="20" />
<hkern u1="U" u2="&#xc3;" k="20" />
<hkern u1="U" u2="&#xc2;" k="20" />
<hkern u1="U" u2="&#xc1;" k="20" />
<hkern u1="U" u2="&#xc0;" k="20" />
<hkern u1="U" u2="A" k="20" />
<hkern u1="U" u2="&#x2e;" k="41" />
<hkern u1="U" u2="&#x2c;" k="41" />
<hkern u1="V" u2="&#x201e;" k="102" />
<hkern u1="V" u2="&#x201a;" k="102" />
<hkern u1="V" u2="&#x153;" k="41" />
<hkern u1="V" u2="&#x152;" k="20" />
<hkern u1="V" u2="&#xfc;" k="20" />
<hkern u1="V" u2="&#xfb;" k="20" />
<hkern u1="V" u2="&#xfa;" k="20" />
<hkern u1="V" u2="&#xf9;" k="20" />
<hkern u1="V" u2="&#xf8;" k="41" />
<hkern u1="V" u2="&#xf6;" k="41" />
<hkern u1="V" u2="&#xf5;" k="41" />
<hkern u1="V" u2="&#xf4;" k="41" />
<hkern u1="V" u2="&#xf3;" k="41" />
<hkern u1="V" u2="&#xf2;" k="41" />
<hkern u1="V" u2="&#xeb;" k="41" />
<hkern u1="V" u2="&#xea;" k="41" />
<hkern u1="V" u2="&#xe9;" k="41" />
<hkern u1="V" u2="&#xe8;" k="41" />
<hkern u1="V" u2="&#xe7;" k="41" />
<hkern u1="V" u2="&#xe6;" k="41" />
<hkern u1="V" u2="&#xe5;" k="41" />
<hkern u1="V" u2="&#xe4;" k="41" />
<hkern u1="V" u2="&#xe3;" k="41" />
<hkern u1="V" u2="&#xe2;" k="41" />
<hkern u1="V" u2="&#xe1;" k="41" />
<hkern u1="V" u2="&#xe0;" k="41" />
<hkern u1="V" u2="&#xd8;" k="20" />
<hkern u1="V" u2="&#xd6;" k="20" />
<hkern u1="V" u2="&#xd5;" k="20" />
<hkern u1="V" u2="&#xd4;" k="20" />
<hkern u1="V" u2="&#xd3;" k="20" />
<hkern u1="V" u2="&#xd2;" k="20" />
<hkern u1="V" u2="&#xc7;" k="20" />
<hkern u1="V" u2="&#xc5;" k="82" />
<hkern u1="V" u2="&#xc4;" k="82" />
<hkern u1="V" u2="&#xc3;" k="82" />
<hkern u1="V" u2="&#xc2;" k="82" />
<hkern u1="V" u2="&#xc1;" k="82" />
<hkern u1="V" u2="&#xc0;" k="82" />
<hkern u1="V" u2="u" k="20" />
<hkern u1="V" u2="s" k="20" />
<hkern u1="V" u2="r" k="20" />
<hkern u1="V" u2="q" k="41" />
<hkern u1="V" u2="p" k="20" />
<hkern u1="V" u2="o" k="41" />
<hkern u1="V" u2="n" k="20" />
<hkern u1="V" u2="m" k="20" />
<hkern u1="V" u2="g" k="20" />
<hkern u1="V" u2="e" k="41" />
<hkern u1="V" u2="d" k="41" />
<hkern u1="V" u2="c" k="41" />
<hkern u1="V" u2="a" k="41" />
<hkern u1="V" u2="Q" k="20" />
<hkern u1="V" u2="O" k="20" />
<hkern u1="V" u2="G" k="20" />
<hkern u1="V" u2="C" k="20" />
<hkern u1="V" u2="A" k="82" />
<hkern u1="V" u2="&#x3f;" k="-41" />
<hkern u1="V" u2="&#x2e;" k="102" />
<hkern u1="V" u2="&#x2c;" k="102" />
<hkern u1="W" u2="&#x201e;" k="102" />
<hkern u1="W" u2="&#x201a;" k="102" />
<hkern u1="W" u2="&#x153;" k="41" />
<hkern u1="W" u2="&#x152;" k="20" />
<hkern u1="W" u2="&#xfc;" k="20" />
<hkern u1="W" u2="&#xfb;" k="20" />
<hkern u1="W" u2="&#xfa;" k="20" />
<hkern u1="W" u2="&#xf9;" k="20" />
<hkern u1="W" u2="&#xf8;" k="41" />
<hkern u1="W" u2="&#xf6;" k="41" />
<hkern u1="W" u2="&#xf5;" k="41" />
<hkern u1="W" u2="&#xf4;" k="41" />
<hkern u1="W" u2="&#xf3;" k="41" />
<hkern u1="W" u2="&#xf2;" k="41" />
<hkern u1="W" u2="&#xeb;" k="41" />
<hkern u1="W" u2="&#xea;" k="41" />
<hkern u1="W" u2="&#xe9;" k="41" />
<hkern u1="W" u2="&#xe8;" k="41" />
<hkern u1="W" u2="&#xe7;" k="41" />
<hkern u1="W" u2="&#xe6;" k="41" />
<hkern u1="W" u2="&#xe5;" k="41" />
<hkern u1="W" u2="&#xe4;" k="41" />
<hkern u1="W" u2="&#xe3;" k="41" />
<hkern u1="W" u2="&#xe2;" k="41" />
<hkern u1="W" u2="&#xe1;" k="41" />
<hkern u1="W" u2="&#xe0;" k="41" />
<hkern u1="W" u2="&#xd8;" k="20" />
<hkern u1="W" u2="&#xd6;" k="20" />
<hkern u1="W" u2="&#xd5;" k="20" />
<hkern u1="W" u2="&#xd4;" k="20" />
<hkern u1="W" u2="&#xd3;" k="20" />
<hkern u1="W" u2="&#xd2;" k="20" />
<hkern u1="W" u2="&#xc7;" k="20" />
<hkern u1="W" u2="&#xc5;" k="82" />
<hkern u1="W" u2="&#xc4;" k="82" />
<hkern u1="W" u2="&#xc3;" k="82" />
<hkern u1="W" u2="&#xc2;" k="82" />
<hkern u1="W" u2="&#xc1;" k="82" />
<hkern u1="W" u2="&#xc0;" k="82" />
<hkern u1="W" u2="u" k="20" />
<hkern u1="W" u2="s" k="20" />
<hkern u1="W" u2="r" k="20" />
<hkern u1="W" u2="q" k="41" />
<hkern u1="W" u2="p" k="20" />
<hkern u1="W" u2="o" k="41" />
<hkern u1="W" u2="n" k="20" />
<hkern u1="W" u2="m" k="20" />
<hkern u1="W" u2="g" k="20" />
<hkern u1="W" u2="e" k="41" />
<hkern u1="W" u2="d" k="41" />
<hkern u1="W" u2="c" k="41" />
<hkern u1="W" u2="a" k="41" />
<hkern u1="W" u2="Q" k="20" />
<hkern u1="W" u2="O" k="20" />
<hkern u1="W" u2="G" k="20" />
<hkern u1="W" u2="C" k="20" />
<hkern u1="W" u2="A" k="82" />
<hkern u1="W" u2="&#x3f;" k="-41" />
<hkern u1="W" u2="&#x2e;" k="102" />
<hkern u1="W" u2="&#x2c;" k="102" />
<hkern u1="X" u2="&#x152;" k="41" />
<hkern u1="X" u2="&#xd8;" k="41" />
<hkern u1="X" u2="&#xd6;" k="41" />
<hkern u1="X" u2="&#xd5;" k="41" />
<hkern u1="X" u2="&#xd4;" k="41" />
<hkern u1="X" u2="&#xd3;" k="41" />
<hkern u1="X" u2="&#xd2;" k="41" />
<hkern u1="X" u2="&#xc7;" k="41" />
<hkern u1="X" u2="Q" k="41" />
<hkern u1="X" u2="O" k="41" />
<hkern u1="X" u2="G" k="41" />
<hkern u1="X" u2="C" k="41" />
<hkern u1="Y" u2="&#x201e;" k="123" />
<hkern u1="Y" u2="&#x201a;" k="123" />
<hkern u1="Y" u2="&#x153;" k="102" />
<hkern u1="Y" u2="&#x152;" k="41" />
<hkern u1="Y" u2="&#xfc;" k="61" />
<hkern u1="Y" u2="&#xfb;" k="61" />
<hkern u1="Y" u2="&#xfa;" k="61" />
<hkern u1="Y" u2="&#xf9;" k="61" />
<hkern u1="Y" u2="&#xf8;" k="102" />
<hkern u1="Y" u2="&#xf6;" k="102" />
<hkern u1="Y" u2="&#xf5;" k="102" />
<hkern u1="Y" u2="&#xf4;" k="102" />
<hkern u1="Y" u2="&#xf3;" k="102" />
<hkern u1="Y" u2="&#xf2;" k="102" />
<hkern u1="Y" u2="&#xeb;" k="102" />
<hkern u1="Y" u2="&#xea;" k="102" />
<hkern u1="Y" u2="&#xe9;" k="102" />
<hkern u1="Y" u2="&#xe8;" k="102" />
<hkern u1="Y" u2="&#xe7;" k="102" />
<hkern u1="Y" u2="&#xe6;" k="102" />
<hkern u1="Y" u2="&#xe5;" k="102" />
<hkern u1="Y" u2="&#xe4;" k="102" />
<hkern u1="Y" u2="&#xe3;" k="102" />
<hkern u1="Y" u2="&#xe2;" k="102" />
<hkern u1="Y" u2="&#xe1;" k="102" />
<hkern u1="Y" u2="&#xe0;" k="102" />
<hkern u1="Y" u2="&#xd8;" k="41" />
<hkern u1="Y" u2="&#xd6;" k="41" />
<hkern u1="Y" u2="&#xd5;" k="41" />
<hkern u1="Y" u2="&#xd4;" k="41" />
<hkern u1="Y" u2="&#xd3;" k="41" />
<hkern u1="Y" u2="&#xd2;" k="41" />
<hkern u1="Y" u2="&#xc7;" k="41" />
<hkern u1="Y" u2="&#xc5;" k="123" />
<hkern u1="Y" u2="&#xc4;" k="123" />
<hkern u1="Y" u2="&#xc3;" k="123" />
<hkern u1="Y" u2="&#xc2;" k="123" />
<hkern u1="Y" u2="&#xc1;" k="123" />
<hkern u1="Y" u2="&#xc0;" k="123" />
<hkern u1="Y" u2="z" k="41" />
<hkern u1="Y" u2="u" k="61" />
<hkern u1="Y" u2="s" k="82" />
<hkern u1="Y" u2="r" k="61" />
<hkern u1="Y" u2="q" k="102" />
<hkern u1="Y" u2="p" k="61" />
<hkern u1="Y" u2="o" k="102" />
<hkern u1="Y" u2="n" k="61" />
<hkern u1="Y" u2="m" k="61" />
<hkern u1="Y" u2="g" k="41" />
<hkern u1="Y" u2="e" k="102" />
<hkern u1="Y" u2="d" k="102" />
<hkern u1="Y" u2="c" k="102" />
<hkern u1="Y" u2="a" k="102" />
<hkern u1="Y" u2="Q" k="41" />
<hkern u1="Y" u2="O" k="41" />
<hkern u1="Y" u2="G" k="41" />
<hkern u1="Y" u2="C" k="41" />
<hkern u1="Y" u2="A" k="123" />
<hkern u1="Y" u2="&#x3f;" k="-41" />
<hkern u1="Y" u2="&#x2e;" k="123" />
<hkern u1="Y" u2="&#x2c;" k="123" />
<hkern u1="Z" u2="&#x152;" k="20" />
<hkern u1="Z" u2="&#xd8;" k="20" />
<hkern u1="Z" u2="&#xd6;" k="20" />
<hkern u1="Z" u2="&#xd5;" k="20" />
<hkern u1="Z" u2="&#xd4;" k="20" />
<hkern u1="Z" u2="&#xd3;" k="20" />
<hkern u1="Z" u2="&#xd2;" k="20" />
<hkern u1="Z" u2="&#xc7;" k="20" />
<hkern u1="Z" u2="Q" k="20" />
<hkern u1="Z" u2="O" k="20" />
<hkern u1="Z" u2="G" k="20" />
<hkern u1="Z" u2="C" k="20" />
<hkern u1="[" u2="J" k="-184" />
<hkern u1="a" u2="&#x201d;" k="20" />
<hkern u1="a" u2="&#x2019;" k="20" />
<hkern u1="a" u2="&#x27;" k="20" />
<hkern u1="a" u2="&#x22;" k="20" />
<hkern u1="b" u2="&#x201d;" k="20" />
<hkern u1="b" u2="&#x2019;" k="20" />
<hkern u1="b" u2="&#xfd;" k="41" />
<hkern u1="b" u2="z" k="20" />
<hkern u1="b" u2="y" k="41" />
<hkern u1="b" u2="x" k="41" />
<hkern u1="b" u2="w" k="41" />
<hkern u1="b" u2="v" k="41" />
<hkern u1="b" u2="&#x27;" k="20" />
<hkern u1="b" u2="&#x22;" k="20" />
<hkern u1="c" u2="&#x201d;" k="-41" />
<hkern u1="c" u2="&#x2019;" k="-41" />
<hkern u1="c" u2="&#x27;" k="-41" />
<hkern u1="c" u2="&#x22;" k="-41" />
<hkern u1="e" u2="&#x201d;" k="20" />
<hkern u1="e" u2="&#x2019;" k="20" />
<hkern u1="e" u2="&#xfd;" k="41" />
<hkern u1="e" u2="z" k="20" />
<hkern u1="e" u2="y" k="41" />
<hkern u1="e" u2="x" k="41" />
<hkern u1="e" u2="w" k="41" />
<hkern u1="e" u2="v" k="41" />
<hkern u1="e" u2="&#x27;" k="20" />
<hkern u1="e" u2="&#x22;" k="20" />
<hkern u1="f" u2="&#x201d;" k="-123" />
<hkern u1="f" u2="&#x2019;" k="-123" />
<hkern u1="f" u2="&#x27;" k="-123" />
<hkern u1="f" u2="&#x22;" k="-123" />
<hkern u1="h" u2="&#x201d;" k="20" />
<hkern u1="h" u2="&#x2019;" k="20" />
<hkern u1="h" u2="&#x27;" k="20" />
<hkern u1="h" u2="&#x22;" k="20" />
<hkern u1="k" u2="&#x153;" k="41" />
<hkern u1="k" u2="&#xf8;" k="41" />
<hkern u1="k" u2="&#xf6;" k="41" />
<hkern u1="k" u2="&#xf5;" k="41" />
<hkern u1="k" u2="&#xf4;" k="41" />
<hkern u1="k" u2="&#xf3;" k="41" />
<hkern u1="k" u2="&#xf2;" k="41" />
<hkern u1="k" u2="&#xeb;" k="41" />
<hkern u1="k" u2="&#xea;" k="41" />
<hkern u1="k" u2="&#xe9;" k="41" />
<hkern u1="k" u2="&#xe8;" k="41" />
<hkern u1="k" u2="&#xe7;" k="41" />
<hkern u1="k" u2="&#xe0;" k="41" />
<hkern u1="k" u2="q" k="41" />
<hkern u1="k" u2="o" k="41" />
<hkern u1="k" u2="e" k="41" />
<hkern u1="k" u2="d" k="41" />
<hkern u1="k" u2="c" k="41" />
<hkern u1="m" u2="&#x201d;" k="20" />
<hkern u1="m" u2="&#x2019;" k="20" />
<hkern u1="m" u2="&#x27;" k="20" />
<hkern u1="m" u2="&#x22;" k="20" />
<hkern u1="n" u2="&#x201d;" k="20" />
<hkern u1="n" u2="&#x2019;" k="20" />
<hkern u1="n" u2="&#x27;" k="20" />
<hkern u1="n" u2="&#x22;" k="20" />
<hkern u1="o" u2="&#x201d;" k="20" />
<hkern u1="o" u2="&#x2019;" k="20" />
<hkern u1="o" u2="&#xfd;" k="41" />
<hkern u1="o" u2="z" k="20" />
<hkern u1="o" u2="y" k="41" />
<hkern u1="o" u2="x" k="41" />
<hkern u1="o" u2="w" k="41" />
<hkern u1="o" u2="v" k="41" />
<hkern u1="o" u2="&#x27;" k="20" />
<hkern u1="o" u2="&#x22;" k="20" />
<hkern u1="p" u2="&#x201d;" k="20" />
<hkern u1="p" u2="&#x2019;" k="20" />
<hkern u1="p" u2="&#xfd;" k="41" />
<hkern u1="p" u2="z" k="20" />
<hkern u1="p" u2="y" k="41" />
<hkern u1="p" u2="x" k="41" />
<hkern u1="p" u2="w" k="41" />
<hkern u1="p" u2="v" k="41" />
<hkern u1="p" u2="&#x27;" k="20" />
<hkern u1="p" u2="&#x22;" k="20" />
<hkern u1="r" u2="&#x201d;" k="-82" />
<hkern u1="r" u2="&#x2019;" k="-82" />
<hkern u1="r" u2="&#x153;" k="41" />
<hkern u1="r" u2="&#xf8;" k="41" />
<hkern u1="r" u2="&#xf6;" k="41" />
<hkern u1="r" u2="&#xf5;" k="41" />
<hkern u1="r" u2="&#xf4;" k="41" />
<hkern u1="r" u2="&#xf3;" k="41" />
<hkern u1="r" u2="&#xf2;" k="41" />
<hkern u1="r" u2="&#xeb;" k="41" />
<hkern u1="r" u2="&#xea;" k="41" />
<hkern u1="r" u2="&#xe9;" k="41" />
<hkern u1="r" u2="&#xe8;" k="41" />
<hkern u1="r" u2="&#xe7;" k="41" />
<hkern u1="r" u2="&#xe6;" k="41" />
<hkern u1="r" u2="&#xe5;" k="41" />
<hkern u1="r" u2="&#xe4;" k="41" />
<hkern u1="r" u2="&#xe3;" k="41" />
<hkern u1="r" u2="&#xe2;" k="41" />
<hkern u1="r" u2="&#xe1;" k="41" />
<hkern u1="r" u2="&#xe0;" k="41" />
<hkern u1="r" u2="q" k="41" />
<hkern u1="r" u2="o" k="41" />
<hkern u1="r" u2="g" k="20" />
<hkern u1="r" u2="e" k="41" />
<hkern u1="r" u2="d" k="41" />
<hkern u1="r" u2="c" k="41" />
<hkern u1="r" u2="a" k="41" />
<hkern u1="r" u2="&#x27;" k="-82" />
<hkern u1="r" u2="&#x22;" k="-82" />
<hkern u1="t" u2="&#x201d;" k="-41" />
<hkern u1="t" u2="&#x2019;" k="-41" />
<hkern u1="t" u2="&#x27;" k="-41" />
<hkern u1="t" u2="&#x22;" k="-41" />
<hkern u1="v" u2="&#x201e;" k="82" />
<hkern u1="v" u2="&#x201d;" k="-82" />
<hkern u1="v" u2="&#x201a;" k="82" />
<hkern u1="v" u2="&#x2019;" k="-82" />
<hkern u1="v" u2="&#x3f;" k="-41" />
<hkern u1="v" u2="&#x2e;" k="82" />
<hkern u1="v" u2="&#x2c;" k="82" />
<hkern u1="v" u2="&#x27;" k="-82" />
<hkern u1="v" u2="&#x22;" k="-82" />
<hkern u1="w" u2="&#x201e;" k="82" />
<hkern u1="w" u2="&#x201d;" k="-82" />
<hkern u1="w" u2="&#x201a;" k="82" />
<hkern u1="w" u2="&#x2019;" k="-82" />
<hkern u1="w" u2="&#x3f;" k="-41" />
<hkern u1="w" u2="&#x2e;" k="82" />
<hkern u1="w" u2="&#x2c;" k="82" />
<hkern u1="w" u2="&#x27;" k="-82" />
<hkern u1="w" u2="&#x22;" k="-82" />
<hkern u1="x" u2="&#x153;" k="41" />
<hkern u1="x" u2="&#xf8;" k="41" />
<hkern u1="x" u2="&#xf6;" k="41" />
<hkern u1="x" u2="&#xf5;" k="41" />
<hkern u1="x" u2="&#xf4;" k="41" />
<hkern u1="x" u2="&#xf3;" k="41" />
<hkern u1="x" u2="&#xf2;" k="41" />
<hkern u1="x" u2="&#xeb;" k="41" />
<hkern u1="x" u2="&#xea;" k="41" />
<hkern u1="x" u2="&#xe9;" k="41" />
<hkern u1="x" u2="&#xe8;" k="41" />
<hkern u1="x" u2="&#xe7;" k="41" />
<hkern u1="x" u2="&#xe0;" k="41" />
<hkern u1="x" u2="q" k="41" />
<hkern u1="x" u2="o" k="41" />
<hkern u1="x" u2="e" k="41" />
<hkern u1="x" u2="d" k="41" />
<hkern u1="x" u2="c" k="41" />
<hkern u1="y" u2="&#x201e;" k="82" />
<hkern u1="y" u2="&#x201d;" k="-82" />
<hkern u1="y" u2="&#x201a;" k="82" />
<hkern u1="y" u2="&#x2019;" k="-82" />
<hkern u1="y" u2="&#x3f;" k="-41" />
<hkern u1="y" u2="&#x2e;" k="82" />
<hkern u1="y" u2="&#x2c;" k="82" />
<hkern u1="y" u2="&#x27;" k="-82" />
<hkern u1="y" u2="&#x22;" k="-82" />
<hkern u1="&#x7b;" u2="J" k="-184" />
<hkern u1="&#xc0;" u2="&#x201d;" k="143" />
<hkern u1="&#xc0;" u2="&#x2019;" k="143" />
<hkern u1="&#xc0;" u2="&#x178;" k="123" />
<hkern u1="&#xc0;" u2="&#x152;" k="41" />
<hkern u1="&#xc0;" u2="&#xdd;" k="123" />
<hkern u1="&#xc0;" u2="&#xd8;" k="41" />
<hkern u1="&#xc0;" u2="&#xd6;" k="41" />
<hkern u1="&#xc0;" u2="&#xd5;" k="41" />
<hkern u1="&#xc0;" u2="&#xd4;" k="41" />
<hkern u1="&#xc0;" u2="&#xd3;" k="41" />
<hkern u1="&#xc0;" u2="&#xd2;" k="41" />
<hkern u1="&#xc0;" u2="&#xc7;" k="41" />
<hkern u1="&#xc0;" u2="Y" k="123" />
<hkern u1="&#xc0;" u2="W" k="82" />
<hkern u1="&#xc0;" u2="V" k="82" />
<hkern u1="&#xc0;" u2="T" k="143" />
<hkern u1="&#xc0;" u2="Q" k="41" />
<hkern u1="&#xc0;" u2="O" k="41" />
<hkern u1="&#xc0;" u2="J" k="-266" />
<hkern u1="&#xc0;" u2="G" k="41" />
<hkern u1="&#xc0;" u2="C" k="41" />
<hkern u1="&#xc0;" u2="&#x27;" k="143" />
<hkern u1="&#xc0;" u2="&#x22;" k="143" />
<hkern u1="&#xc1;" u2="&#x201d;" k="143" />
<hkern u1="&#xc1;" u2="&#x2019;" k="143" />
<hkern u1="&#xc1;" u2="&#x178;" k="123" />
<hkern u1="&#xc1;" u2="&#x152;" k="41" />
<hkern u1="&#xc1;" u2="&#xdd;" k="123" />
<hkern u1="&#xc1;" u2="&#xd8;" k="41" />
<hkern u1="&#xc1;" u2="&#xd6;" k="41" />
<hkern u1="&#xc1;" u2="&#xd5;" k="41" />
<hkern u1="&#xc1;" u2="&#xd4;" k="41" />
<hkern u1="&#xc1;" u2="&#xd3;" k="41" />
<hkern u1="&#xc1;" u2="&#xd2;" k="41" />
<hkern u1="&#xc1;" u2="&#xc7;" k="41" />
<hkern u1="&#xc1;" u2="Y" k="123" />
<hkern u1="&#xc1;" u2="W" k="82" />
<hkern u1="&#xc1;" u2="V" k="82" />
<hkern u1="&#xc1;" u2="T" k="143" />
<hkern u1="&#xc1;" u2="Q" k="41" />
<hkern u1="&#xc1;" u2="O" k="41" />
<hkern u1="&#xc1;" u2="J" k="-266" />
<hkern u1="&#xc1;" u2="G" k="41" />
<hkern u1="&#xc1;" u2="C" k="41" />
<hkern u1="&#xc1;" u2="&#x27;" k="143" />
<hkern u1="&#xc1;" u2="&#x22;" k="143" />
<hkern u1="&#xc2;" u2="&#x201d;" k="143" />
<hkern u1="&#xc2;" u2="&#x2019;" k="143" />
<hkern u1="&#xc2;" u2="&#x178;" k="123" />
<hkern u1="&#xc2;" u2="&#x152;" k="41" />
<hkern u1="&#xc2;" u2="&#xdd;" k="123" />
<hkern u1="&#xc2;" u2="&#xd8;" k="41" />
<hkern u1="&#xc2;" u2="&#xd6;" k="41" />
<hkern u1="&#xc2;" u2="&#xd5;" k="41" />
<hkern u1="&#xc2;" u2="&#xd4;" k="41" />
<hkern u1="&#xc2;" u2="&#xd3;" k="41" />
<hkern u1="&#xc2;" u2="&#xd2;" k="41" />
<hkern u1="&#xc2;" u2="&#xc7;" k="41" />
<hkern u1="&#xc2;" u2="Y" k="123" />
<hkern u1="&#xc2;" u2="W" k="82" />
<hkern u1="&#xc2;" u2="V" k="82" />
<hkern u1="&#xc2;" u2="T" k="143" />
<hkern u1="&#xc2;" u2="Q" k="41" />
<hkern u1="&#xc2;" u2="O" k="41" />
<hkern u1="&#xc2;" u2="J" k="-266" />
<hkern u1="&#xc2;" u2="G" k="41" />
<hkern u1="&#xc2;" u2="C" k="41" />
<hkern u1="&#xc2;" u2="&#x27;" k="143" />
<hkern u1="&#xc2;" u2="&#x22;" k="143" />
<hkern u1="&#xc3;" u2="&#x201d;" k="143" />
<hkern u1="&#xc3;" u2="&#x2019;" k="143" />
<hkern u1="&#xc3;" u2="&#x178;" k="123" />
<hkern u1="&#xc3;" u2="&#x152;" k="41" />
<hkern u1="&#xc3;" u2="&#xdd;" k="123" />
<hkern u1="&#xc3;" u2="&#xd8;" k="41" />
<hkern u1="&#xc3;" u2="&#xd6;" k="41" />
<hkern u1="&#xc3;" u2="&#xd5;" k="41" />
<hkern u1="&#xc3;" u2="&#xd4;" k="41" />
<hkern u1="&#xc3;" u2="&#xd3;" k="41" />
<hkern u1="&#xc3;" u2="&#xd2;" k="41" />
<hkern u1="&#xc3;" u2="&#xc7;" k="41" />
<hkern u1="&#xc3;" u2="Y" k="123" />
<hkern u1="&#xc3;" u2="W" k="82" />
<hkern u1="&#xc3;" u2="V" k="82" />
<hkern u1="&#xc3;" u2="T" k="143" />
<hkern u1="&#xc3;" u2="Q" k="41" />
<hkern u1="&#xc3;" u2="O" k="41" />
<hkern u1="&#xc3;" u2="J" k="-266" />
<hkern u1="&#xc3;" u2="G" k="41" />
<hkern u1="&#xc3;" u2="C" k="41" />
<hkern u1="&#xc3;" u2="&#x27;" k="143" />
<hkern u1="&#xc3;" u2="&#x22;" k="143" />
<hkern u1="&#xc4;" u2="&#x201d;" k="143" />
<hkern u1="&#xc4;" u2="&#x2019;" k="143" />
<hkern u1="&#xc4;" u2="&#x178;" k="123" />
<hkern u1="&#xc4;" u2="&#x152;" k="41" />
<hkern u1="&#xc4;" u2="&#xdd;" k="123" />
<hkern u1="&#xc4;" u2="&#xd8;" k="41" />
<hkern u1="&#xc4;" u2="&#xd6;" k="41" />
<hkern u1="&#xc4;" u2="&#xd5;" k="41" />
<hkern u1="&#xc4;" u2="&#xd4;" k="41" />
<hkern u1="&#xc4;" u2="&#xd3;" k="41" />
<hkern u1="&#xc4;" u2="&#xd2;" k="41" />
<hkern u1="&#xc4;" u2="&#xc7;" k="41" />
<hkern u1="&#xc4;" u2="Y" k="123" />
<hkern u1="&#xc4;" u2="W" k="82" />
<hkern u1="&#xc4;" u2="V" k="82" />
<hkern u1="&#xc4;" u2="T" k="143" />
<hkern u1="&#xc4;" u2="Q" k="41" />
<hkern u1="&#xc4;" u2="O" k="41" />
<hkern u1="&#xc4;" u2="J" k="-266" />
<hkern u1="&#xc4;" u2="G" k="41" />
<hkern u1="&#xc4;" u2="C" k="41" />
<hkern u1="&#xc4;" u2="&#x27;" k="143" />
<hkern u1="&#xc4;" u2="&#x22;" k="143" />
<hkern u1="&#xc5;" u2="&#x201d;" k="143" />
<hkern u1="&#xc5;" u2="&#x2019;" k="143" />
<hkern u1="&#xc5;" u2="&#x178;" k="123" />
<hkern u1="&#xc5;" u2="&#x152;" k="41" />
<hkern u1="&#xc5;" u2="&#xdd;" k="123" />
<hkern u1="&#xc5;" u2="&#xd8;" k="41" />
<hkern u1="&#xc5;" u2="&#xd6;" k="41" />
<hkern u1="&#xc5;" u2="&#xd5;" k="41" />
<hkern u1="&#xc5;" u2="&#xd4;" k="41" />
<hkern u1="&#xc5;" u2="&#xd3;" k="41" />
<hkern u1="&#xc5;" u2="&#xd2;" k="41" />
<hkern u1="&#xc5;" u2="&#xc7;" k="41" />
<hkern u1="&#xc5;" u2="Y" k="123" />
<hkern u1="&#xc5;" u2="W" k="82" />
<hkern u1="&#xc5;" u2="V" k="82" />
<hkern u1="&#xc5;" u2="T" k="143" />
<hkern u1="&#xc5;" u2="Q" k="41" />
<hkern u1="&#xc5;" u2="O" k="41" />
<hkern u1="&#xc5;" u2="J" k="-266" />
<hkern u1="&#xc5;" u2="G" k="41" />
<hkern u1="&#xc5;" u2="C" k="41" />
<hkern u1="&#xc5;" u2="&#x27;" k="143" />
<hkern u1="&#xc5;" u2="&#x22;" k="143" />
<hkern u1="&#xc6;" u2="J" k="-123" />
<hkern u1="&#xc7;" u2="&#x152;" k="41" />
<hkern u1="&#xc7;" u2="&#xd8;" k="41" />
<hkern u1="&#xc7;" u2="&#xd6;" k="41" />
<hkern u1="&#xc7;" u2="&#xd5;" k="41" />
<hkern u1="&#xc7;" u2="&#xd4;" k="41" />
<hkern u1="&#xc7;" u2="&#xd3;" k="41" />
<hkern u1="&#xc7;" u2="&#xd2;" k="41" />
<hkern u1="&#xc7;" u2="&#xc7;" k="41" />
<hkern u1="&#xc7;" u2="Q" k="41" />
<hkern u1="&#xc7;" u2="O" k="41" />
<hkern u1="&#xc7;" u2="G" k="41" />
<hkern u1="&#xc7;" u2="C" k="41" />
<hkern u1="&#xc8;" u2="J" k="-123" />
<hkern u1="&#xc9;" u2="J" k="-123" />
<hkern u1="&#xca;" u2="J" k="-123" />
<hkern u1="&#xcb;" u2="J" k="-123" />
<hkern u1="&#xd0;" u2="&#x201e;" k="82" />
<hkern u1="&#xd0;" u2="&#x201a;" k="82" />
<hkern u1="&#xd0;" u2="&#x178;" k="20" />
<hkern u1="&#xd0;" u2="&#xdd;" k="20" />
<hkern u1="&#xd0;" u2="&#xc5;" k="41" />
<hkern u1="&#xd0;" u2="&#xc4;" k="41" />
<hkern u1="&#xd0;" u2="&#xc3;" k="41" />
<hkern u1="&#xd0;" u2="&#xc2;" k="41" />
<hkern u1="&#xd0;" u2="&#xc1;" k="41" />
<hkern u1="&#xd0;" u2="&#xc0;" k="41" />
<hkern u1="&#xd0;" u2="Z" k="20" />
<hkern u1="&#xd0;" u2="Y" k="20" />
<hkern u1="&#xd0;" u2="X" k="41" />
<hkern u1="&#xd0;" u2="W" k="20" />
<hkern u1="&#xd0;" u2="V" k="20" />
<hkern u1="&#xd0;" u2="T" k="61" />
<hkern u1="&#xd0;" u2="A" k="41" />
<hkern u1="&#xd0;" u2="&#x2e;" k="82" />
<hkern u1="&#xd0;" u2="&#x2c;" k="82" />
<hkern u1="&#xd2;" u2="&#x201e;" k="82" />
<hkern u1="&#xd2;" u2="&#x201a;" k="82" />
<hkern u1="&#xd2;" u2="&#x178;" k="20" />
<hkern u1="&#xd2;" u2="&#xdd;" k="20" />
<hkern u1="&#xd2;" u2="&#xc5;" k="41" />
<hkern u1="&#xd2;" u2="&#xc4;" k="41" />
<hkern u1="&#xd2;" u2="&#xc3;" k="41" />
<hkern u1="&#xd2;" u2="&#xc2;" k="41" />
<hkern u1="&#xd2;" u2="&#xc1;" k="41" />
<hkern u1="&#xd2;" u2="&#xc0;" k="41" />
<hkern u1="&#xd2;" u2="Z" k="20" />
<hkern u1="&#xd2;" u2="Y" k="20" />
<hkern u1="&#xd2;" u2="X" k="41" />
<hkern u1="&#xd2;" u2="W" k="20" />
<hkern u1="&#xd2;" u2="V" k="20" />
<hkern u1="&#xd2;" u2="T" k="61" />
<hkern u1="&#xd2;" u2="A" k="41" />
<hkern u1="&#xd2;" u2="&#x2e;" k="82" />
<hkern u1="&#xd2;" u2="&#x2c;" k="82" />
<hkern u1="&#xd3;" u2="&#x201e;" k="82" />
<hkern u1="&#xd3;" u2="&#x201a;" k="82" />
<hkern u1="&#xd3;" u2="&#x178;" k="20" />
<hkern u1="&#xd3;" u2="&#xdd;" k="20" />
<hkern u1="&#xd3;" u2="&#xc5;" k="41" />
<hkern u1="&#xd3;" u2="&#xc4;" k="41" />
<hkern u1="&#xd3;" u2="&#xc3;" k="41" />
<hkern u1="&#xd3;" u2="&#xc2;" k="41" />
<hkern u1="&#xd3;" u2="&#xc1;" k="41" />
<hkern u1="&#xd3;" u2="&#xc0;" k="41" />
<hkern u1="&#xd3;" u2="Z" k="20" />
<hkern u1="&#xd3;" u2="Y" k="20" />
<hkern u1="&#xd3;" u2="X" k="41" />
<hkern u1="&#xd3;" u2="W" k="20" />
<hkern u1="&#xd3;" u2="V" k="20" />
<hkern u1="&#xd3;" u2="T" k="61" />
<hkern u1="&#xd3;" u2="A" k="41" />
<hkern u1="&#xd3;" u2="&#x2e;" k="82" />
<hkern u1="&#xd3;" u2="&#x2c;" k="82" />
<hkern u1="&#xd4;" u2="&#x201e;" k="82" />
<hkern u1="&#xd4;" u2="&#x201a;" k="82" />
<hkern u1="&#xd4;" u2="&#x178;" k="20" />
<hkern u1="&#xd4;" u2="&#xdd;" k="20" />
<hkern u1="&#xd4;" u2="&#xc5;" k="41" />
<hkern u1="&#xd4;" u2="&#xc4;" k="41" />
<hkern u1="&#xd4;" u2="&#xc3;" k="41" />
<hkern u1="&#xd4;" u2="&#xc2;" k="41" />
<hkern u1="&#xd4;" u2="&#xc1;" k="41" />
<hkern u1="&#xd4;" u2="&#xc0;" k="41" />
<hkern u1="&#xd4;" u2="Z" k="20" />
<hkern u1="&#xd4;" u2="Y" k="20" />
<hkern u1="&#xd4;" u2="X" k="41" />
<hkern u1="&#xd4;" u2="W" k="20" />
<hkern u1="&#xd4;" u2="V" k="20" />
<hkern u1="&#xd4;" u2="T" k="61" />
<hkern u1="&#xd4;" u2="A" k="41" />
<hkern u1="&#xd4;" u2="&#x2e;" k="82" />
<hkern u1="&#xd4;" u2="&#x2c;" k="82" />
<hkern u1="&#xd5;" u2="&#x201e;" k="82" />
<hkern u1="&#xd5;" u2="&#x201a;" k="82" />
<hkern u1="&#xd5;" u2="&#x178;" k="20" />
<hkern u1="&#xd5;" u2="&#xdd;" k="20" />
<hkern u1="&#xd5;" u2="&#xc5;" k="41" />
<hkern u1="&#xd5;" u2="&#xc4;" k="41" />
<hkern u1="&#xd5;" u2="&#xc3;" k="41" />
<hkern u1="&#xd5;" u2="&#xc2;" k="41" />
<hkern u1="&#xd5;" u2="&#xc1;" k="41" />
<hkern u1="&#xd5;" u2="&#xc0;" k="41" />
<hkern u1="&#xd5;" u2="Z" k="20" />
<hkern u1="&#xd5;" u2="Y" k="20" />
<hkern u1="&#xd5;" u2="X" k="41" />
<hkern u1="&#xd5;" u2="W" k="20" />
<hkern u1="&#xd5;" u2="V" k="20" />
<hkern u1="&#xd5;" u2="T" k="61" />
<hkern u1="&#xd5;" u2="A" k="41" />
<hkern u1="&#xd5;" u2="&#x2e;" k="82" />
<hkern u1="&#xd5;" u2="&#x2c;" k="82" />
<hkern u1="&#xd6;" u2="&#x201e;" k="82" />
<hkern u1="&#xd6;" u2="&#x201a;" k="82" />
<hkern u1="&#xd6;" u2="&#x178;" k="20" />
<hkern u1="&#xd6;" u2="&#xdd;" k="20" />
<hkern u1="&#xd6;" u2="&#xc5;" k="41" />
<hkern u1="&#xd6;" u2="&#xc4;" k="41" />
<hkern u1="&#xd6;" u2="&#xc3;" k="41" />
<hkern u1="&#xd6;" u2="&#xc2;" k="41" />
<hkern u1="&#xd6;" u2="&#xc1;" k="41" />
<hkern u1="&#xd6;" u2="&#xc0;" k="41" />
<hkern u1="&#xd6;" u2="Z" k="20" />
<hkern u1="&#xd6;" u2="Y" k="20" />
<hkern u1="&#xd6;" u2="X" k="41" />
<hkern u1="&#xd6;" u2="W" k="20" />
<hkern u1="&#xd6;" u2="V" k="20" />
<hkern u1="&#xd6;" u2="T" k="61" />
<hkern u1="&#xd6;" u2="A" k="41" />
<hkern u1="&#xd6;" u2="&#x2e;" k="82" />
<hkern u1="&#xd6;" u2="&#x2c;" k="82" />
<hkern u1="&#xd8;" u2="&#x201e;" k="82" />
<hkern u1="&#xd8;" u2="&#x201a;" k="82" />
<hkern u1="&#xd8;" u2="&#x178;" k="20" />
<hkern u1="&#xd8;" u2="&#xdd;" k="20" />
<hkern u1="&#xd8;" u2="&#xc5;" k="41" />
<hkern u1="&#xd8;" u2="&#xc4;" k="41" />
<hkern u1="&#xd8;" u2="&#xc3;" k="41" />
<hkern u1="&#xd8;" u2="&#xc2;" k="41" />
<hkern u1="&#xd8;" u2="&#xc1;" k="41" />
<hkern u1="&#xd8;" u2="&#xc0;" k="41" />
<hkern u1="&#xd8;" u2="Z" k="20" />
<hkern u1="&#xd8;" u2="Y" k="20" />
<hkern u1="&#xd8;" u2="X" k="41" />
<hkern u1="&#xd8;" u2="W" k="20" />
<hkern u1="&#xd8;" u2="V" k="20" />
<hkern u1="&#xd8;" u2="T" k="61" />
<hkern u1="&#xd8;" u2="A" k="41" />
<hkern u1="&#xd8;" u2="&#x2e;" k="82" />
<hkern u1="&#xd8;" u2="&#x2c;" k="82" />
<hkern u1="&#xd9;" u2="&#x201e;" k="41" />
<hkern u1="&#xd9;" u2="&#x201a;" k="41" />
<hkern u1="&#xd9;" u2="&#xc5;" k="20" />
<hkern u1="&#xd9;" u2="&#xc4;" k="20" />
<hkern u1="&#xd9;" u2="&#xc3;" k="20" />
<hkern u1="&#xd9;" u2="&#xc2;" k="20" />
<hkern u1="&#xd9;" u2="&#xc1;" k="20" />
<hkern u1="&#xd9;" u2="&#xc0;" k="20" />
<hkern u1="&#xd9;" u2="A" k="20" />
<hkern u1="&#xd9;" u2="&#x2e;" k="41" />
<hkern u1="&#xd9;" u2="&#x2c;" k="41" />
<hkern u1="&#xda;" u2="&#x201e;" k="41" />
<hkern u1="&#xda;" u2="&#x201a;" k="41" />
<hkern u1="&#xda;" u2="&#xc5;" k="20" />
<hkern u1="&#xda;" u2="&#xc4;" k="20" />
<hkern u1="&#xda;" u2="&#xc3;" k="20" />
<hkern u1="&#xda;" u2="&#xc2;" k="20" />
<hkern u1="&#xda;" u2="&#xc1;" k="20" />
<hkern u1="&#xda;" u2="&#xc0;" k="20" />
<hkern u1="&#xda;" u2="A" k="20" />
<hkern u1="&#xda;" u2="&#x2e;" k="41" />
<hkern u1="&#xda;" u2="&#x2c;" k="41" />
<hkern u1="&#xdb;" u2="&#x201e;" k="41" />
<hkern u1="&#xdb;" u2="&#x201a;" k="41" />
<hkern u1="&#xdb;" u2="&#xc5;" k="20" />
<hkern u1="&#xdb;" u2="&#xc4;" k="20" />
<hkern u1="&#xdb;" u2="&#xc3;" k="20" />
<hkern u1="&#xdb;" u2="&#xc2;" k="20" />
<hkern u1="&#xdb;" u2="&#xc1;" k="20" />
<hkern u1="&#xdb;" u2="&#xc0;" k="20" />
<hkern u1="&#xdb;" u2="A" k="20" />
<hkern u1="&#xdb;" u2="&#x2e;" k="41" />
<hkern u1="&#xdb;" u2="&#x2c;" k="41" />
<hkern u1="&#xdc;" u2="&#x201e;" k="41" />
<hkern u1="&#xdc;" u2="&#x201a;" k="41" />
<hkern u1="&#xdc;" u2="&#xc5;" k="20" />
<hkern u1="&#xdc;" u2="&#xc4;" k="20" />
<hkern u1="&#xdc;" u2="&#xc3;" k="20" />
<hkern u1="&#xdc;" u2="&#xc2;" k="20" />
<hkern u1="&#xdc;" u2="&#xc1;" k="20" />
<hkern u1="&#xdc;" u2="&#xc0;" k="20" />
<hkern u1="&#xdc;" u2="A" k="20" />
<hkern u1="&#xdc;" u2="&#x2e;" k="41" />
<hkern u1="&#xdc;" u2="&#x2c;" k="41" />
<hkern u1="&#xdd;" u2="&#x201e;" k="123" />
<hkern u1="&#xdd;" u2="&#x201a;" k="123" />
<hkern u1="&#xdd;" u2="&#x153;" k="102" />
<hkern u1="&#xdd;" u2="&#x152;" k="41" />
<hkern u1="&#xdd;" u2="&#xfc;" k="61" />
<hkern u1="&#xdd;" u2="&#xfb;" k="61" />
<hkern u1="&#xdd;" u2="&#xfa;" k="61" />
<hkern u1="&#xdd;" u2="&#xf9;" k="61" />
<hkern u1="&#xdd;" u2="&#xf8;" k="102" />
<hkern u1="&#xdd;" u2="&#xf6;" k="102" />
<hkern u1="&#xdd;" u2="&#xf5;" k="102" />
<hkern u1="&#xdd;" u2="&#xf4;" k="102" />
<hkern u1="&#xdd;" u2="&#xf3;" k="102" />
<hkern u1="&#xdd;" u2="&#xf2;" k="102" />
<hkern u1="&#xdd;" u2="&#xeb;" k="102" />
<hkern u1="&#xdd;" u2="&#xea;" k="102" />
<hkern u1="&#xdd;" u2="&#xe9;" k="102" />
<hkern u1="&#xdd;" u2="&#xe8;" k="102" />
<hkern u1="&#xdd;" u2="&#xe7;" k="102" />
<hkern u1="&#xdd;" u2="&#xe6;" k="102" />
<hkern u1="&#xdd;" u2="&#xe5;" k="102" />
<hkern u1="&#xdd;" u2="&#xe4;" k="102" />
<hkern u1="&#xdd;" u2="&#xe3;" k="102" />
<hkern u1="&#xdd;" u2="&#xe2;" k="102" />
<hkern u1="&#xdd;" u2="&#xe1;" k="102" />
<hkern u1="&#xdd;" u2="&#xe0;" k="102" />
<hkern u1="&#xdd;" u2="&#xd8;" k="41" />
<hkern u1="&#xdd;" u2="&#xd6;" k="41" />
<hkern u1="&#xdd;" u2="&#xd5;" k="41" />
<hkern u1="&#xdd;" u2="&#xd4;" k="41" />
<hkern u1="&#xdd;" u2="&#xd3;" k="41" />
<hkern u1="&#xdd;" u2="&#xd2;" k="41" />
<hkern u1="&#xdd;" u2="&#xc7;" k="41" />
<hkern u1="&#xdd;" u2="&#xc5;" k="123" />
<hkern u1="&#xdd;" u2="&#xc4;" k="123" />
<hkern u1="&#xdd;" u2="&#xc3;" k="123" />
<hkern u1="&#xdd;" u2="&#xc2;" k="123" />
<hkern u1="&#xdd;" u2="&#xc1;" k="123" />
<hkern u1="&#xdd;" u2="&#xc0;" k="123" />
<hkern u1="&#xdd;" u2="z" k="41" />
<hkern u1="&#xdd;" u2="u" k="61" />
<hkern u1="&#xdd;" u2="s" k="82" />
<hkern u1="&#xdd;" u2="r" k="61" />
<hkern u1="&#xdd;" u2="q" k="102" />
<hkern u1="&#xdd;" u2="p" k="61" />
<hkern u1="&#xdd;" u2="o" k="102" />
<hkern u1="&#xdd;" u2="n" k="61" />
<hkern u1="&#xdd;" u2="m" k="61" />
<hkern u1="&#xdd;" u2="g" k="41" />
<hkern u1="&#xdd;" u2="e" k="102" />
<hkern u1="&#xdd;" u2="d" k="102" />
<hkern u1="&#xdd;" u2="c" k="102" />
<hkern u1="&#xdd;" u2="a" k="102" />
<hkern u1="&#xdd;" u2="Q" k="41" />
<hkern u1="&#xdd;" u2="O" k="41" />
<hkern u1="&#xdd;" u2="G" k="41" />
<hkern u1="&#xdd;" u2="C" k="41" />
<hkern u1="&#xdd;" u2="A" k="123" />
<hkern u1="&#xdd;" u2="&#x3f;" k="-41" />
<hkern u1="&#xdd;" u2="&#x2e;" k="123" />
<hkern u1="&#xdd;" u2="&#x2c;" k="123" />
<hkern u1="&#xde;" u2="&#x201e;" k="266" />
<hkern u1="&#xde;" u2="&#x201a;" k="266" />
<hkern u1="&#xde;" u2="&#xc5;" k="102" />
<hkern u1="&#xde;" u2="&#xc4;" k="102" />
<hkern u1="&#xde;" u2="&#xc3;" k="102" />
<hkern u1="&#xde;" u2="&#xc2;" k="102" />
<hkern u1="&#xde;" u2="&#xc1;" k="102" />
<hkern u1="&#xde;" u2="&#xc0;" k="102" />
<hkern u1="&#xde;" u2="Z" k="20" />
<hkern u1="&#xde;" u2="X" k="41" />
<hkern u1="&#xde;" u2="A" k="102" />
<hkern u1="&#xde;" u2="&#x2e;" k="266" />
<hkern u1="&#xde;" u2="&#x2c;" k="266" />
<hkern u1="&#xe0;" u2="&#x201d;" k="20" />
<hkern u1="&#xe0;" u2="&#x2019;" k="20" />
<hkern u1="&#xe0;" u2="&#x27;" k="20" />
<hkern u1="&#xe0;" u2="&#x22;" k="20" />
<hkern u1="&#xe1;" u2="&#x201d;" k="20" />
<hkern u1="&#xe1;" u2="&#x2019;" k="20" />
<hkern u1="&#xe1;" u2="&#x27;" k="20" />
<hkern u1="&#xe1;" u2="&#x22;" k="20" />
<hkern u1="&#xe2;" u2="&#x201d;" k="20" />
<hkern u1="&#xe2;" u2="&#x2019;" k="20" />
<hkern u1="&#xe2;" u2="&#x27;" k="20" />
<hkern u1="&#xe2;" u2="&#x22;" k="20" />
<hkern u1="&#xe3;" u2="&#x201d;" k="20" />
<hkern u1="&#xe3;" u2="&#x2019;" k="20" />
<hkern u1="&#xe3;" u2="&#x27;" k="20" />
<hkern u1="&#xe3;" u2="&#x22;" k="20" />
<hkern u1="&#xe4;" u2="&#x201d;" k="20" />
<hkern u1="&#xe4;" u2="&#x2019;" k="20" />
<hkern u1="&#xe4;" u2="&#x27;" k="20" />
<hkern u1="&#xe4;" u2="&#x22;" k="20" />
<hkern u1="&#xe5;" u2="&#x201d;" k="20" />
<hkern u1="&#xe5;" u2="&#x2019;" k="20" />
<hkern u1="&#xe5;" u2="&#x27;" k="20" />
<hkern u1="&#xe5;" u2="&#x22;" k="20" />
<hkern u1="&#xe8;" u2="&#x201d;" k="20" />
<hkern u1="&#xe8;" u2="&#x2019;" k="20" />
<hkern u1="&#xe8;" u2="&#xfd;" k="41" />
<hkern u1="&#xe8;" u2="z" k="20" />
<hkern u1="&#xe8;" u2="y" k="41" />
<hkern u1="&#xe8;" u2="x" k="41" />
<hkern u1="&#xe8;" u2="w" k="41" />
<hkern u1="&#xe8;" u2="v" k="41" />
<hkern u1="&#xe8;" u2="&#x27;" k="20" />
<hkern u1="&#xe8;" u2="&#x22;" k="20" />
<hkern u1="&#xe9;" u2="&#x201d;" k="20" />
<hkern u1="&#xe9;" u2="&#x2019;" k="20" />
<hkern u1="&#xe9;" u2="&#xfd;" k="41" />
<hkern u1="&#xe9;" u2="z" k="20" />
<hkern u1="&#xe9;" u2="y" k="41" />
<hkern u1="&#xe9;" u2="x" k="41" />
<hkern u1="&#xe9;" u2="w" k="41" />
<hkern u1="&#xe9;" u2="v" k="41" />
<hkern u1="&#xe9;" u2="&#x27;" k="20" />
<hkern u1="&#xe9;" u2="&#x22;" k="20" />
<hkern u1="&#xea;" u2="&#x201d;" k="20" />
<hkern u1="&#xea;" u2="&#x2019;" k="20" />
<hkern u1="&#xea;" u2="&#xfd;" k="41" />
<hkern u1="&#xea;" u2="z" k="20" />
<hkern u1="&#xea;" u2="y" k="41" />
<hkern u1="&#xea;" u2="x" k="41" />
<hkern u1="&#xea;" u2="w" k="41" />
<hkern u1="&#xea;" u2="v" k="41" />
<hkern u1="&#xea;" u2="&#x27;" k="20" />
<hkern u1="&#xea;" u2="&#x22;" k="20" />
<hkern u1="&#xeb;" u2="&#x201d;" k="20" />
<hkern u1="&#xeb;" u2="&#x2019;" k="20" />
<hkern u1="&#xeb;" u2="&#xfd;" k="41" />
<hkern u1="&#xeb;" u2="z" k="20" />
<hkern u1="&#xeb;" u2="y" k="41" />
<hkern u1="&#xeb;" u2="x" k="41" />
<hkern u1="&#xeb;" u2="w" k="41" />
<hkern u1="&#xeb;" u2="v" k="41" />
<hkern u1="&#xeb;" u2="&#x27;" k="20" />
<hkern u1="&#xeb;" u2="&#x22;" k="20" />
<hkern u1="&#xf0;" u2="&#x201d;" k="20" />
<hkern u1="&#xf0;" u2="&#x2019;" k="20" />
<hkern u1="&#xf0;" u2="&#xfd;" k="41" />
<hkern u1="&#xf0;" u2="z" k="20" />
<hkern u1="&#xf0;" u2="y" k="41" />
<hkern u1="&#xf0;" u2="x" k="41" />
<hkern u1="&#xf0;" u2="w" k="41" />
<hkern u1="&#xf0;" u2="v" k="41" />
<hkern u1="&#xf0;" u2="&#x27;" k="20" />
<hkern u1="&#xf0;" u2="&#x22;" k="20" />
<hkern u1="&#xf2;" u2="&#x201d;" k="20" />
<hkern u1="&#xf2;" u2="&#x2019;" k="20" />
<hkern u1="&#xf2;" u2="&#xfd;" k="41" />
<hkern u1="&#xf2;" u2="z" k="20" />
<hkern u1="&#xf2;" u2="y" k="41" />
<hkern u1="&#xf2;" u2="x" k="41" />
<hkern u1="&#xf2;" u2="w" k="41" />
<hkern u1="&#xf2;" u2="v" k="41" />
<hkern u1="&#xf2;" u2="&#x27;" k="20" />
<hkern u1="&#xf2;" u2="&#x22;" k="20" />
<hkern u1="&#xf3;" u2="&#x201d;" k="20" />
<hkern u1="&#xf3;" u2="&#x2019;" k="20" />
<hkern u1="&#xf3;" u2="&#xfd;" k="41" />
<hkern u1="&#xf3;" u2="z" k="20" />
<hkern u1="&#xf3;" u2="y" k="41" />
<hkern u1="&#xf3;" u2="x" k="41" />
<hkern u1="&#xf3;" u2="w" k="41" />
<hkern u1="&#xf3;" u2="v" k="41" />
<hkern u1="&#xf3;" u2="&#x27;" k="20" />
<hkern u1="&#xf3;" u2="&#x22;" k="20" />
<hkern u1="&#xf4;" u2="&#x201d;" k="20" />
<hkern u1="&#xf4;" u2="&#x2019;" k="20" />
<hkern u1="&#xf4;" u2="&#xfd;" k="41" />
<hkern u1="&#xf4;" u2="z" k="20" />
<hkern u1="&#xf4;" u2="y" k="41" />
<hkern u1="&#xf4;" u2="x" k="41" />
<hkern u1="&#xf4;" u2="w" k="41" />
<hkern u1="&#xf4;" u2="v" k="41" />
<hkern u1="&#xf4;" u2="&#x27;" k="20" />
<hkern u1="&#xf4;" u2="&#x22;" k="20" />
<hkern u1="&#xf6;" u2="&#x201d;" k="41" />
<hkern u1="&#xf6;" u2="&#x2019;" k="41" />
<hkern u1="&#xf6;" u2="&#x27;" k="41" />
<hkern u1="&#xf6;" u2="&#x22;" k="41" />
<hkern u1="&#xf8;" u2="&#x201d;" k="20" />
<hkern u1="&#xf8;" u2="&#x2019;" k="20" />
<hkern u1="&#xf8;" u2="&#xfd;" k="41" />
<hkern u1="&#xf8;" u2="z" k="20" />
<hkern u1="&#xf8;" u2="y" k="41" />
<hkern u1="&#xf8;" u2="x" k="41" />
<hkern u1="&#xf8;" u2="w" k="41" />
<hkern u1="&#xf8;" u2="v" k="41" />
<hkern u1="&#xf8;" u2="&#x27;" k="20" />
<hkern u1="&#xf8;" u2="&#x22;" k="20" />
<hkern u1="&#xfd;" u2="&#x201e;" k="82" />
<hkern u1="&#xfd;" u2="&#x201d;" k="-82" />
<hkern u1="&#xfd;" u2="&#x201a;" k="82" />
<hkern u1="&#xfd;" u2="&#x2019;" k="-82" />
<hkern u1="&#xfd;" u2="&#x3f;" k="-41" />
<hkern u1="&#xfd;" u2="&#x2e;" k="82" />
<hkern u1="&#xfd;" u2="&#x2c;" k="82" />
<hkern u1="&#xfd;" u2="&#x27;" k="-82" />
<hkern u1="&#xfd;" u2="&#x22;" k="-82" />
<hkern u1="&#xfe;" u2="&#x201d;" k="20" />
<hkern u1="&#xfe;" u2="&#x2019;" k="20" />
<hkern u1="&#xfe;" u2="&#xfd;" k="41" />
<hkern u1="&#xfe;" u2="z" k="20" />
<hkern u1="&#xfe;" u2="y" k="41" />
<hkern u1="&#xfe;" u2="x" k="41" />
<hkern u1="&#xfe;" u2="w" k="41" />
<hkern u1="&#xfe;" u2="v" k="41" />
<hkern u1="&#xfe;" u2="&#x27;" k="20" />
<hkern u1="&#xfe;" u2="&#x22;" k="20" />
<hkern u1="&#xff;" u2="&#x201e;" k="82" />
<hkern u1="&#xff;" u2="&#x201d;" k="-82" />
<hkern u1="&#xff;" u2="&#x201a;" k="82" />
<hkern u1="&#xff;" u2="&#x2019;" k="-82" />
<hkern u1="&#xff;" u2="&#x3f;" k="-41" />
<hkern u1="&#xff;" u2="&#x2e;" k="82" />
<hkern u1="&#xff;" u2="&#x2c;" k="82" />
<hkern u1="&#xff;" u2="&#x27;" k="-82" />
<hkern u1="&#xff;" u2="&#x22;" k="-82" />
<hkern u1="&#x152;" u2="J" k="-123" />
<hkern u1="&#x178;" u2="&#x201e;" k="123" />
<hkern u1="&#x178;" u2="&#x201a;" k="123" />
<hkern u1="&#x178;" u2="&#x153;" k="102" />
<hkern u1="&#x178;" u2="&#x152;" k="41" />
<hkern u1="&#x178;" u2="&#xfc;" k="61" />
<hkern u1="&#x178;" u2="&#xfb;" k="61" />
<hkern u1="&#x178;" u2="&#xfa;" k="61" />
<hkern u1="&#x178;" u2="&#xf9;" k="61" />
<hkern u1="&#x178;" u2="&#xf8;" k="102" />
<hkern u1="&#x178;" u2="&#xf6;" k="102" />
<hkern u1="&#x178;" u2="&#xf5;" k="102" />
<hkern u1="&#x178;" u2="&#xf4;" k="102" />
<hkern u1="&#x178;" u2="&#xf3;" k="102" />
<hkern u1="&#x178;" u2="&#xf2;" k="102" />
<hkern u1="&#x178;" u2="&#xeb;" k="102" />
<hkern u1="&#x178;" u2="&#xea;" k="102" />
<hkern u1="&#x178;" u2="&#xe9;" k="102" />
<hkern u1="&#x178;" u2="&#xe8;" k="102" />
<hkern u1="&#x178;" u2="&#xe7;" k="102" />
<hkern u1="&#x178;" u2="&#xe6;" k="102" />
<hkern u1="&#x178;" u2="&#xe5;" k="102" />
<hkern u1="&#x178;" u2="&#xe4;" k="102" />
<hkern u1="&#x178;" u2="&#xe3;" k="102" />
<hkern u1="&#x178;" u2="&#xe2;" k="102" />
<hkern u1="&#x178;" u2="&#xe1;" k="102" />
<hkern u1="&#x178;" u2="&#xe0;" k="102" />
<hkern u1="&#x178;" u2="&#xd8;" k="41" />
<hkern u1="&#x178;" u2="&#xd6;" k="41" />
<hkern u1="&#x178;" u2="&#xd5;" k="41" />
<hkern u1="&#x178;" u2="&#xd4;" k="41" />
<hkern u1="&#x178;" u2="&#xd3;" k="41" />
<hkern u1="&#x178;" u2="&#xd2;" k="41" />
<hkern u1="&#x178;" u2="&#xc7;" k="41" />
<hkern u1="&#x178;" u2="&#xc5;" k="123" />
<hkern u1="&#x178;" u2="&#xc4;" k="123" />
<hkern u1="&#x178;" u2="&#xc3;" k="123" />
<hkern u1="&#x178;" u2="&#xc2;" k="123" />
<hkern u1="&#x178;" u2="&#xc1;" k="123" />
<hkern u1="&#x178;" u2="&#xc0;" k="123" />
<hkern u1="&#x178;" u2="z" k="41" />
<hkern u1="&#x178;" u2="u" k="61" />
<hkern u1="&#x178;" u2="s" k="82" />
<hkern u1="&#x178;" u2="r" k="61" />
<hkern u1="&#x178;" u2="q" k="102" />
<hkern u1="&#x178;" u2="p" k="61" />
<hkern u1="&#x178;" u2="o" k="102" />
<hkern u1="&#x178;" u2="n" k="61" />
<hkern u1="&#x178;" u2="m" k="61" />
<hkern u1="&#x178;" u2="g" k="41" />
<hkern u1="&#x178;" u2="e" k="102" />
<hkern u1="&#x178;" u2="d" k="102" />
<hkern u1="&#x178;" u2="c" k="102" />
<hkern u1="&#x178;" u2="a" k="102" />
<hkern u1="&#x178;" u2="Q" k="41" />
<hkern u1="&#x178;" u2="O" k="41" />
<hkern u1="&#x178;" u2="G" k="41" />
<hkern u1="&#x178;" u2="C" k="41" />
<hkern u1="&#x178;" u2="A" k="123" />
<hkern u1="&#x178;" u2="&#x3f;" k="-41" />
<hkern u1="&#x178;" u2="&#x2e;" k="123" />
<hkern u1="&#x178;" u2="&#x2c;" k="123" />
<hkern u1="&#x2013;" u2="T" k="82" />
<hkern u1="&#x2014;" u2="T" k="82" />
<hkern u1="&#x2018;" u2="&#x178;" k="-20" />
<hkern u1="&#x2018;" u2="&#x153;" k="123" />
<hkern u1="&#x2018;" u2="&#xfc;" k="61" />
<hkern u1="&#x2018;" u2="&#xfb;" k="61" />
<hkern u1="&#x2018;" u2="&#xfa;" k="61" />
<hkern u1="&#x2018;" u2="&#xf9;" k="61" />
<hkern u1="&#x2018;" u2="&#xf8;" k="123" />
<hkern u1="&#x2018;" u2="&#xf6;" k="123" />
<hkern u1="&#x2018;" u2="&#xf5;" k="123" />
<hkern u1="&#x2018;" u2="&#xf4;" k="123" />
<hkern u1="&#x2018;" u2="&#xf3;" k="123" />
<hkern u1="&#x2018;" u2="&#xf2;" k="123" />
<hkern u1="&#x2018;" u2="&#xeb;" k="123" />
<hkern u1="&#x2018;" u2="&#xea;" k="123" />
<hkern u1="&#x2018;" u2="&#xe9;" k="123" />
<hkern u1="&#x2018;" u2="&#xe8;" k="123" />
<hkern u1="&#x2018;" u2="&#xe7;" k="123" />
<hkern u1="&#x2018;" u2="&#xe6;" k="82" />
<hkern u1="&#x2018;" u2="&#xe5;" k="82" />
<hkern u1="&#x2018;" u2="&#xe4;" k="82" />
<hkern u1="&#x2018;" u2="&#xe3;" k="82" />
<hkern u1="&#x2018;" u2="&#xe2;" k="82" />
<hkern u1="&#x2018;" u2="&#xe1;" k="82" />
<hkern u1="&#x2018;" u2="&#xe0;" k="123" />
<hkern u1="&#x2018;" u2="&#xdd;" k="-20" />
<hkern u1="&#x2018;" u2="&#xc5;" k="143" />
<hkern u1="&#x2018;" u2="&#xc4;" k="143" />
<hkern u1="&#x2018;" u2="&#xc3;" k="143" />
<hkern u1="&#x2018;" u2="&#xc2;" k="143" />
<hkern u1="&#x2018;" u2="&#xc1;" k="143" />
<hkern u1="&#x2018;" u2="&#xc0;" k="143" />
<hkern u1="&#x2018;" u2="u" k="61" />
<hkern u1="&#x2018;" u2="s" k="61" />
<hkern u1="&#x2018;" u2="r" k="61" />
<hkern u1="&#x2018;" u2="q" k="123" />
<hkern u1="&#x2018;" u2="p" k="61" />
<hkern u1="&#x2018;" u2="o" k="123" />
<hkern u1="&#x2018;" u2="n" k="61" />
<hkern u1="&#x2018;" u2="m" k="61" />
<hkern u1="&#x2018;" u2="g" k="61" />
<hkern u1="&#x2018;" u2="e" k="123" />
<hkern u1="&#x2018;" u2="d" k="123" />
<hkern u1="&#x2018;" u2="c" k="123" />
<hkern u1="&#x2018;" u2="a" k="82" />
<hkern u1="&#x2018;" u2="Y" k="-20" />
<hkern u1="&#x2018;" u2="W" k="-41" />
<hkern u1="&#x2018;" u2="V" k="-41" />
<hkern u1="&#x2018;" u2="T" k="-41" />
<hkern u1="&#x2018;" u2="A" k="143" />
<hkern u1="&#x2019;" u2="&#x178;" k="-20" />
<hkern u1="&#x2019;" u2="&#x153;" k="123" />
<hkern u1="&#x2019;" u2="&#xfc;" k="61" />
<hkern u1="&#x2019;" u2="&#xfb;" k="61" />
<hkern u1="&#x2019;" u2="&#xfa;" k="61" />
<hkern u1="&#x2019;" u2="&#xf9;" k="61" />
<hkern u1="&#x2019;" u2="&#xf8;" k="123" />
<hkern u1="&#x2019;" u2="&#xf6;" k="123" />
<hkern u1="&#x2019;" u2="&#xf5;" k="123" />
<hkern u1="&#x2019;" u2="&#xf4;" k="123" />
<hkern u1="&#x2019;" u2="&#xf3;" k="123" />
<hkern u1="&#x2019;" u2="&#xf2;" k="123" />
<hkern u1="&#x2019;" u2="&#xeb;" k="123" />
<hkern u1="&#x2019;" u2="&#xea;" k="123" />
<hkern u1="&#x2019;" u2="&#xe9;" k="123" />
<hkern u1="&#x2019;" u2="&#xe8;" k="123" />
<hkern u1="&#x2019;" u2="&#xe7;" k="123" />
<hkern u1="&#x2019;" u2="&#xe6;" k="82" />
<hkern u1="&#x2019;" u2="&#xe5;" k="82" />
<hkern u1="&#x2019;" u2="&#xe4;" k="82" />
<hkern u1="&#x2019;" u2="&#xe3;" k="82" />
<hkern u1="&#x2019;" u2="&#xe2;" k="82" />
<hkern u1="&#x2019;" u2="&#xe1;" k="82" />
<hkern u1="&#x2019;" u2="&#xe0;" k="123" />
<hkern u1="&#x2019;" u2="&#xdd;" k="-20" />
<hkern u1="&#x2019;" u2="&#xc5;" k="143" />
<hkern u1="&#x2019;" u2="&#xc4;" k="143" />
<hkern u1="&#x2019;" u2="&#xc3;" k="143" />
<hkern u1="&#x2019;" u2="&#xc2;" k="143" />
<hkern u1="&#x2019;" u2="&#xc1;" k="143" />
<hkern u1="&#x2019;" u2="&#xc0;" k="143" />
<hkern u1="&#x2019;" u2="u" k="61" />
<hkern u1="&#x2019;" u2="s" k="61" />
<hkern u1="&#x2019;" u2="r" k="61" />
<hkern u1="&#x2019;" u2="q" k="123" />
<hkern u1="&#x2019;" u2="p" k="61" />
<hkern u1="&#x2019;" u2="o" k="123" />
<hkern u1="&#x2019;" u2="n" k="61" />
<hkern u1="&#x2019;" u2="m" k="61" />
<hkern u1="&#x2019;" u2="g" k="61" />
<hkern u1="&#x2019;" u2="e" k="123" />
<hkern u1="&#x2019;" u2="d" k="123" />
<hkern u1="&#x2019;" u2="c" k="123" />
<hkern u1="&#x2019;" u2="a" k="82" />
<hkern u1="&#x2019;" u2="Y" k="-20" />
<hkern u1="&#x2019;" u2="W" k="-41" />
<hkern u1="&#x2019;" u2="V" k="-41" />
<hkern u1="&#x2019;" u2="T" k="-41" />
<hkern u1="&#x2019;" u2="A" k="143" />
<hkern u1="&#x201a;" u2="&#x178;" k="123" />
<hkern u1="&#x201a;" u2="&#x152;" k="102" />
<hkern u1="&#x201a;" u2="&#xdd;" k="123" />
<hkern u1="&#x201a;" u2="&#xdc;" k="41" />
<hkern u1="&#x201a;" u2="&#xdb;" k="41" />
<hkern u1="&#x201a;" u2="&#xda;" k="41" />
<hkern u1="&#x201a;" u2="&#xd9;" k="41" />
<hkern u1="&#x201a;" u2="&#xd8;" k="102" />
<hkern u1="&#x201a;" u2="&#xd6;" k="102" />
<hkern u1="&#x201a;" u2="&#xd5;" k="102" />
<hkern u1="&#x201a;" u2="&#xd4;" k="102" />
<hkern u1="&#x201a;" u2="&#xd3;" k="102" />
<hkern u1="&#x201a;" u2="&#xd2;" k="102" />
<hkern u1="&#x201a;" u2="&#xc7;" k="102" />
<hkern u1="&#x201a;" u2="Y" k="123" />
<hkern u1="&#x201a;" u2="W" k="123" />
<hkern u1="&#x201a;" u2="V" k="123" />
<hkern u1="&#x201a;" u2="U" k="41" />
<hkern u1="&#x201a;" u2="T" k="143" />
<hkern u1="&#x201a;" u2="Q" k="102" />
<hkern u1="&#x201a;" u2="O" k="102" />
<hkern u1="&#x201a;" u2="G" k="102" />
<hkern u1="&#x201a;" u2="C" k="102" />
<hkern u1="&#x201c;" u2="&#x178;" k="-20" />
<hkern u1="&#x201c;" u2="&#x153;" k="123" />
<hkern u1="&#x201c;" u2="&#xfc;" k="61" />
<hkern u1="&#x201c;" u2="&#xfb;" k="61" />
<hkern u1="&#x201c;" u2="&#xfa;" k="61" />
<hkern u1="&#x201c;" u2="&#xf9;" k="61" />
<hkern u1="&#x201c;" u2="&#xf8;" k="123" />
<hkern u1="&#x201c;" u2="&#xf6;" k="123" />
<hkern u1="&#x201c;" u2="&#xf5;" k="123" />
<hkern u1="&#x201c;" u2="&#xf4;" k="123" />
<hkern u1="&#x201c;" u2="&#xf3;" k="123" />
<hkern u1="&#x201c;" u2="&#xf2;" k="123" />
<hkern u1="&#x201c;" u2="&#xeb;" k="123" />
<hkern u1="&#x201c;" u2="&#xea;" k="123" />
<hkern u1="&#x201c;" u2="&#xe9;" k="123" />
<hkern u1="&#x201c;" u2="&#xe8;" k="123" />
<hkern u1="&#x201c;" u2="&#xe7;" k="123" />
<hkern u1="&#x201c;" u2="&#xe6;" k="82" />
<hkern u1="&#x201c;" u2="&#xe5;" k="82" />
<hkern u1="&#x201c;" u2="&#xe4;" k="82" />
<hkern u1="&#x201c;" u2="&#xe3;" k="82" />
<hkern u1="&#x201c;" u2="&#xe2;" k="82" />
<hkern u1="&#x201c;" u2="&#xe1;" k="82" />
<hkern u1="&#x201c;" u2="&#xe0;" k="123" />
<hkern u1="&#x201c;" u2="&#xdd;" k="-20" />
<hkern u1="&#x201c;" u2="&#xc5;" k="143" />
<hkern u1="&#x201c;" u2="&#xc4;" k="143" />
<hkern u1="&#x201c;" u2="&#xc3;" k="143" />
<hkern u1="&#x201c;" u2="&#xc2;" k="143" />
<hkern u1="&#x201c;" u2="&#xc1;" k="143" />
<hkern u1="&#x201c;" u2="&#xc0;" k="143" />
<hkern u1="&#x201c;" u2="u" k="61" />
<hkern u1="&#x201c;" u2="s" k="61" />
<hkern u1="&#x201c;" u2="r" k="61" />
<hkern u1="&#x201c;" u2="q" k="123" />
<hkern u1="&#x201c;" u2="p" k="61" />
<hkern u1="&#x201c;" u2="o" k="123" />
<hkern u1="&#x201c;" u2="n" k="61" />
<hkern u1="&#x201c;" u2="m" k="61" />
<hkern u1="&#x201c;" u2="g" k="61" />
<hkern u1="&#x201c;" u2="e" k="123" />
<hkern u1="&#x201c;" u2="d" k="123" />
<hkern u1="&#x201c;" u2="c" k="123" />
<hkern u1="&#x201c;" u2="a" k="82" />
<hkern u1="&#x201c;" u2="Y" k="-20" />
<hkern u1="&#x201c;" u2="W" k="-41" />
<hkern u1="&#x201c;" u2="V" k="-41" />
<hkern u1="&#x201c;" u2="T" k="-41" />
<hkern u1="&#x201c;" u2="A" k="143" />
<hkern u1="&#x201e;" u2="&#x178;" k="123" />
<hkern u1="&#x201e;" u2="&#x152;" k="102" />
<hkern u1="&#x201e;" u2="&#xdd;" k="123" />
<hkern u1="&#x201e;" u2="&#xdc;" k="41" />
<hkern u1="&#x201e;" u2="&#xdb;" k="41" />
<hkern u1="&#x201e;" u2="&#xda;" k="41" />
<hkern u1="&#x201e;" u2="&#xd9;" k="41" />
<hkern u1="&#x201e;" u2="&#xd8;" k="102" />
<hkern u1="&#x201e;" u2="&#xd6;" k="102" />
<hkern u1="&#x201e;" u2="&#xd5;" k="102" />
<hkern u1="&#x201e;" u2="&#xd4;" k="102" />
<hkern u1="&#x201e;" u2="&#xd3;" k="102" />
<hkern u1="&#x201e;" u2="&#xd2;" k="102" />
<hkern u1="&#x201e;" u2="&#xc7;" k="102" />
<hkern u1="&#x201e;" u2="Y" k="123" />
<hkern u1="&#x201e;" u2="W" k="123" />
<hkern u1="&#x201e;" u2="V" k="123" />
<hkern u1="&#x201e;" u2="U" k="41" />
<hkern u1="&#x201e;" u2="T" k="143" />
<hkern u1="&#x201e;" u2="Q" k="102" />
<hkern u1="&#x201e;" u2="O" k="102" />
<hkern u1="&#x201e;" u2="G" k="102" />
<hkern u1="&#x201e;" u2="C" k="102" />
<hkern g1="uniFB00" u2="&#x201d;" k="-123" />
<hkern g1="uniFB00" u2="&#x2019;" k="-123" />
<hkern g1="uniFB00" u2="&#x27;" k="-123" />
<hkern g1="uniFB00" u2="&#x22;" k="-123" />
</font>
</defs></svg> wOFF     [h                            FFTM        cvGDEF          GPOS      	E	GSUB        kOS/2     _   `ocmap  t    plcvt   	   2   <)|fpgm  	D    	zAgasp  @         glyf  H  C  uhead  R$   3   6 bJhhea  RX   !   $Yhmtx  R|  a  rJPloca  T    Ѻmaxp  V        cname  V    zpost  X    
"]@prep  Z      D"webf  [`      gQ       =    cI
    xc`d``b	`b`@1  "  xڭKlUߙNh5h1hlHzq`Lk5XS,`R7jsԔKBgAJi-Zc6\+9;/O综
eGԇWTe9AmU
9oAS@D`);x}C tpl}(E~,Fù5/FџX2%-K7A%HzTTӻVo X+UȪ	0Vinc03%18Y8'ax'`rpwpu0p<6܁{M?M.%6C-
V5@f|N{9)('fT>BAz`)%%%%%%W1bOnS%+ D$#{d<㐅p249XRcx{XWIMU+yR|TBPGMAVq3p K*MR*uiU..
WfIC5j4h4-vv^ɑ]4Ci;ync03 VNv'/by"\!e
#0
an8LMj]{wo-XT(utTQjGTYAfY<:4thСE?~,9sϢC?~yɚ'kyʡC+VZ9rheʢE+V,ZYheʢE+V,ZYheʢC+V:9tбі|ْSӈW
Z{x_,ߗ|WYut?C׆]6tmеkC׆]6tmеkCצ.]:fT+kp/2S}L=Y0gzaT	owvNY}4q|irS+7Ơtpk{s{%-y},X~{wZJULq֮zݪf=7v/YU}m658X\coh)P[juJAqX#j5lF5;NXG~q:uWa?Q`xc`d``bb``qq	aJ,aPI/JfI,c``aH`c	00(0I(TƜDYz"f`AAAA3'?[0	{$}^IOFO {xc`f~¨:՘QB3_dHcb`bffcfeabbyށA!AxKc`d2R``cg{*~ xc```f`F1,	%d21g4df`:tBBEYԿ +AA@ABAEP?G|plzmX?$F6VF&  4,l\<|B"bR2r
J*jZ:zF&fV6vN.n^>~A!aQ1q	mݓg[hɲW^fu6n޺eێ{vPybaA,Y`0՘b>Hjj~w޼'=~=ޮ	Nc2gCN20j xc`@ia ̺MŞ6Gs'3
   xڝUiwF$%u3qȄ-0i*v!]],t;Y)#?6'GΛ\cDOq:Tr R>屒 nV)iDl7;K\vr*3%A£W' H4IO?I8(I)8f eJ^R6â*Ϻ`r#\^mq:Im=Q@*F#)9QRRZL~G22e+*u۶uQ4SuFlGDy6N'ζ/LQvͶ1p)%3}tHXձ
ng$(Uy
Qo fg/.dE@np/X)Q\EHJOĉ>xA\P"̡+ά54^coWJMIFSw"Y8Glk>Zݽؑ9qwY'󴘯.7@<)\ڷLQ}eSTh*)hM1M{5wL1C{H#9!7MrӾܴ 7Bnr^@nZܴ+Fu4Χ*idø5Y5ɻ!u*Չ/ȥ\\wiݶv_Z3ꆭ70Єo7uXsPA`R (kN q9MR}14}/{<8-]ZDuܘ=[Luud[1+Iyv%UVދj|dpCh=v)MyT)JepʃZĸujkz!H)]ߴwkxt#9Oq(x~tm^naJ>S}TV-5ͺFNXZ@MHU11eM.oZlUw}sv_esȺڠ\s$E@얬zg2c9u/LNYhS*˖]nˆ9vGhlixb{]\ 84r&6]zjlΕD]s8K7Ǯ|`=ȹpr>%3rn|N!%rCG#r6$+rbrrn<&	9_CB6&Pj6k>}`هzdK"RܘPR_,"v$sah     xڭ=@U50<10#LBEDEDR4w
>|gYYYff+5sZǺmnպ){aTfs=9C DC܋QV}9{E=qޢX0mF{	IfA~4G* CH8EgJ7wsX-#ZSa9r\x._p}=fpq;8+!7b4Ix GxI(\s'~$*J^G}G^$H¨Jg0Q%(Vjux	EX-fc_ͱdg/'gTسA<eeJ׌T˫VʛW\!_Pxy15܍} #mxh@v49K|Vj\N#rє& #b^%jTP5P㍇K;_1fڬFICzdbgnv3In׼B"lR#'4a㶞3=n:2iipL]?e95M^}IBLm܁㊟z]@{+V83^3l|&L#ZpbDqȅQLF5`VH, W0@2JJ2:Mu霟JKJ4ř:Ą*Rc6[jJnWm3Q$0Dw	ƋCѯ}7i=mݓNTߒgv>**[<p:Hg뫿?c[q^'.5xnk埖Ϝ(V2Q(k$YQ.*M<d8u<LmFL8~b	#~X0-Fde0+`Jbcss<XGGu8aДVK0(NvK-M9gf[?w|۴_b\ڿ%vڄ7_:O3\l㨍vxif¶K?<Xpj޺zpro$s;i"V$j`ጜiP&/9	iɫg >C%V31v#b4
'ʾcAJp|wP>,/_"jc +4 FB;ؕ8&|?rD}}s}I[댶L~hC:MEHU\a4^=hd),q؉=+gR{s,'&ӒsveN݆|xMDdY#Q 5$7S{\nt<Ɠ1yr<m|=RN(:\DF^x䱉Dr<U[K/V#_hX#j}* 00`'K&|ҀVUھGPl~
Zq#	
jK<~۶ bbt
-grYҥ6fu%P:QNRSPUVTb۬NN)I̜E
1vy]?_gg-+-kYwfsN_pU#O3~NKG@E{m*	p% <;yXN&Q1{ҋ?7U5'r,٣wN(u8NծR?TG*5i؃{Hq$Jv=as>=d=O+3y1s^ī/[S}*=(zxa8v>_3B@UNc3;)ɞNE"J8L v;s)>h.|7zu{{}}4Y~zmQˋ{}rso}Gri	+_{~ݖw^`U"ޛP3n7H"ᩙQ,KZIkMTtm14=Q||Wnf4jyLׄgʏuV_F29Nm%hgjlGGM=O,c6k%	 >dez;yϑOe߰7{ɿv=|jQ2Ʊܴ|15~RՅ?M6Zc?JQ0EBK&EHSpbu`&-`ڡ@/NLNIMN49*IDsYϳl#]T9;wg>ڜ?-4Y?:U6y|v[?3?]8m(v
Rై1~}FA	U"Frc%|#6BeacE/"Qr9(	*0II(KJ8]đvD)(`M/LGxb7Ͽ9=#;O%/w=сef:8s~UokGiE>ҞLY9:Xp el>Q b0"WśiTdB\dJT
l>rD*m	f`IMNqJ>r~#&/P=mgioʫ\e)*ϾkW"bɶwS_\u[{Mmnڱ	m|%3I?YG"hüE3νi%|o?OIv%д] _ R 4p0Ej@lLp-vt*ǋR~oXM-%
|kSZb1S_sv,gJ6泸/m0 oeJ=2ڭ^;s\S}<rXeZ
bf]:W-^{V*e27}JFy^. \C+_! Haz<͏_HvYmlhʙw:270|ۺ|lW	n]L^02Kav1u[YK[?q>hdj7jx$B@"-AyD$PHRN&nz5g;hPƜηhܽ[[}R))T/јMN~@aDe&Ȅyb2c+H.(R{o-cN7O?6c>m%Ü*ʮ3Sƿ-o7&?ٌ"5w[]c;dO\^<g튪p:bagjہ6ց:+ԡtSKy"l)#TRT:z6;8"pe$8-HTk%;.o-\!7$zvU %',Ds`:y#G%$&]	(1"uvN6o>{"uك8?ly\񡕸	v>Ļ'&ߪ߼nm޽k%+F\D*	S#)\h|+& dL=&zo*_7ijaʧ}s]A25%Uqz 	*, ?q(fQ15%7	$rvT_K W[w|>Mc>_8n/`|5td?.m2,a0l\/sVߣMۿ Z߹Z#Aul\x
? X\nG  w|lބXҁV܁H0t7%'''*':sA'E7m:&wx3צL}vA}~ԓMk_eҦƯ#%63᜼W?V2*ꎄlC;Kva TaVk_6ݳ*&cuDA%OOycS4ˏț'9IqGo4.z*58׻8P= Jw)7h?ƹf/]bwa*B"%2NLcINwdCޜ	ri\R{+؂7d>h$}C%k2CUOq6oFLX;Ԡ
	ԁc	L?H5d 0<i@'7gǿ3*^qIt=}z)(~D(yRup- c2s" h	p*P.a77QkUrʉFesZW/nXaSkxYb1A}PT(	MUGa3ˇq`wU[KX|SnmkEܩ?w:7\ZPs:7Wy#nO͆gN.?;8˗aCCG?&:ny;+3y0.,;ZfSt)l&f%]|xgv;syy߅#y M)<7
Ԫ_lQ2hv#A%yY3NZ϶~%վx{ܚw0e=%~ѼX'З*0qX("9#AL⤑sɢ8-ZקF4CG%6p/mDB˃?:v'Mye}>E476M|V@(lLyꕐ!t_РЎLvf0VLAtSF,$C<`
\;l3\WM@k|֖QcSG};	4_e:MavK2Z(&tpnst'=Zy)Zaڃ|g.1I4G(=&~$FA"4L͠@3\6MMVXѿ>'xW?֋eeZ,|.Pk?PnnVz꣕O_wz\AAV%6`2CP{0m컼?62"29[CeP7RD4T]ș Hsӌ5ߓ&Ozn}OFSyLG)j@sp&)c;u\ml\|Z;򆒣=!!mTqhxе!Wϐ+Y> ƥzOo1(L8\q51S?ۇ	v:l?w+a&\?bo>$Qx#X3˝sC22f&P_apC\Z9R<Ym^MD&N)5dF&)֋D0QOXտ%%vn#lD.y13>ů9_vy0(}1$4TYX8fFMv=\@u #6jhAh0Ǳ,
Sy$k%v/P!x|qӍ{G}넁>|/Gif|Ox|h浔m?4S"Z6`O<Ľy 4ֵlccFT)o':~e7j(6ƒhMԇk5ʘa(~.	hNJ"пGX)zq1KѿoQ޷`c͓>-o :%?.<xy:j']VL!@Φ3B-1@d	@2|ՓbRIiްܾ,?8uUe=)7ϼm?):NLu2Lxn<3*$Tvjd߲ ;ܐ/m#O?]&K|=uj>C>S"(\Іh
F-BD8THPN؟8`16lSpp9Q@`?{5?mA]|lG~M>x`+k{Gxl!+\6a7cN ;t_	N]i|%N&Qt;DGEX0ȣxыx̎BR5L-98^%/7kdMӺѣnfZ}l1Wku[wn/Բ}ȍ6P۶Sa(yPoǮ%X̍%DWt|m~
XGѰWnY %=3#Ũǁe1LC'l8΢=y4;19sqՒ+/>s;x[{\֞k˖O?M#>~|`mݦ_eMѥƦ?8ii/q0}j=}V53+ӵ;5vinT:bQY1(&l$Kݜ^E) quuDc+&*;Ge_]`cdjdh8xF˒>}TA	g
noJE4n8{Lfʫc/vN숍S/	JN0᠝!fTx
YM&V!xʎXS'_qk4,Dܷk 9
Kpś!犔4140uCJ&hreւE%)8Qvϓ˷d-W85)XĩAv].kPzȅ
qBb}APШ%.@#MF%IH_8nhL4|i9!#Kc/SA47-7FU|_]m-V^!'󅿛q/?3S+#;3ho|׃22X#Q؁LS:%K/<s 3}Np:{'uF]>4"kl3+XSccŮkj׶|g7Eǚþx~._vyS8c;hk{1@>IN6tiIG~	AdҝKV.,hN~!2cb?8EtިFjR?Zho蒿b͡ߗ~k[߉w`' y?cJTa*bp'Mw <S6FW%3K*#gM<?-pI\|/Q[%vG_ԤZJ
dBݽ]3.OPЬ
ؿ[NzZ0e&&P~*	9;ϚUTb3
hmh
C3$s$Z*rJ\IlFV%RX!%-x+Jck8܀>0<`Rfto{ʗ>#vqoZv
ay5j0rAЇnx;|WH2N;ԴS?͑&ʈ%79v{=po^+;Mi远)6@)Õ(!n60+RZx˷, M6Lb8ES"#@.n1za;/^Z2b_صt?/8z=}Z1@+ˋPM
.Ef`rYFe)=~r$	¨7Wn4xҭ`*Z :Oy(lchY;`Y@ٟ1M![,5X0
7['?5򅭧^<y7bæK% ȧ٘㽝"Pʶ\0bJ	͂7s?^Lȱ$s|)#gxӧHx?gIWH2閊m6z D;k]kq}>O񋆖-*_Lsc'b4_hBkM̸<A_`|'OSϩ|O$UCh]>P*N1>!\jRʙb14B8$v-cP'^5ayLxg2c:a]$rTձ\SiJDf/9ѧ*ٲSs+Ir sMi|߮ӿ*~2!(g=Q0]FkNOv .p_}99'!{`.:Xp,iI"rGP-Lq3Q\+N¹=	e'MP\d[ZELxbnX4fMyaI-	uic-wܼ+.2<1)HQEwsyL+G@GjV0_	BaI@Vleۧt?dĸ6-',7;m^ӓ=Ǔ
Nܭ[q݌~˫6	Ck'Ol$`ƅyj6ޭΓ7ZhI	ubh/F	Cua<j`!;1tax%Qo(#8Xg
htƲ]XT2k|줩K>qŢU[E{ ~YY;ztjݾS8h-MhZʂ	-M©|}P*a0Cq8N'%Kb[?iuqqvuM	ܐ0z#
'ʆEl\/ﮐ|3v͘osxy!PԪi6 6f6N4\8G6\IrjV]qzl4Iʩ@INO=tK.<qiⲲKf/`QȭMM_6I۞箬Ys=]4m3,)Nd<"3/BEhI(jz  QL[dqnҏ?|̉L'zLؕ&5brNIl0kl@bRiMh'kP![i*	kPXF>\}/P.apKRXJY;O+y$&8h__מQ`UA/*e;ή^\ʬ?p5i^Knzt3<5^=c}39mSJt+={uAc
.\90w\s؞#Zƭ?K~A\l	(i۫xt+
e	Cѕtt+nF)^.$-)/=#T~ݼ]laC%֍YQ2EefPPzĩ.
"A1rgvEAD;Jw6b=XDk2=k۸~oΞ4u凸#zOy.^řɟv@e]Ffgw!?n}tL\u2v<(q.rU8ͺaZI'AF~,nXp{Kpȉ	p=x/es),-sq@4^ Wl4nW ⋞ᑢhUnQy릢q~+51-||__oe{h>7ێD?׵H۰Y<_?8M>iLyoSo}lȨUK&52v=(;_u40{.׷x9?Zֆ$("aEhiȩo/- PqD xiƉ[Bj8ddJ)^hu$,o\X9ˉ9$Wpl*~jp9sٵϴ
T[ŏjnPQ_, fn3ģN*ǋM?}盙Kֈ{_s݁WZAiJXm"QJ*pw͟^fUKs^yeμ_7FU-]E01"?Q=.FA(JCu8]:q=2֭
`Wӛ)7#ڭ{giJ4o/RJN/d(aZ.[\bs8-ZYDIUN[U=x̸K76/⭤uCس*xh䓣I䤹{.&rwW&\49zocಇ/N\P8n(:eM}3:|aoh7>QUR'Vm<wr_pD;ػ(oZtڱhb*))z)cb{R[ѡ<ą1)%/'LGM	*FZ8WL꛲;n8;x^lٍD-t-1IQ+nqd/Wl\QҋJWqCkɭAMry"K
GL!mew;'ùMo`^<CfiJxoRLP%0_Սp_trBcVA7 }Ef%<@Lr5	qZ^ui8^۫X!rVP	иܓcmR,Rb&p1o^oOߝ钷9'kӨъ)pc;Xmc-2"NSXgr-'v+N<0k+?tQGo3̺᷃V&;11Kn5|)ٸ/vʵ1c-;xp78&!{}{%98Nc5ݷ$ĩl|Ri$b2hg93h1,pI;K1" s
2WEDav&͠	\?SkqLww2AsvW_H8IqUFyjRjޟK[QDmASI*Nj .XkvF;īE),=,{=z{dvv$Ya)$߇E@ܢ'z	J.FZܭMXѴڂB4L*b	St#/y³o<{ݝ{夗ӱ]-/=܌18^)>*LGL)(	Ql\Aw"-D08E<FX(uTʯVGXjzj>Uq.&>_pf4{V |EnNQDEZ!(p^ޞfN$Aj1tEA:JvQ9-cBZ%V#MB#, _uY |e|F|=
>	*NXx0Eb
uVB>01(!3
"$%EG{Xfb*AT(ȳ+Mcva/m\"\fZ|kHߪ붌$@ TGp]l)leVoZi-pp3b<@,'Ii2qF6B4$/Ł(^	@`P.QSH	SK8D=z%@G_- Y5"[;dUΰQN$
`%,l/}NTp}[|1|;XjSỂMs8
`#@7	6=𦇫	y,o%]WZ4zbzJn6Fc;nWnG$ʹCLʪ	,R( aZ?b(̯Cxllԑ| a62q$Rz?i1WT(*ŴT)]ױZwNV)#3b kSoi7ZY-J^Gv*Ut9k__iI5FFDNÚ;j0)I1ё4S)땀yg7=95`$	S/4" Xp$*G$'I\w݌U
X"0!xX#d{/}}	/62Aj =-5N*6 7,[ IՠQV՚.4:qLa\!s`W#z_"Va|J=> Zɥq	'HTzԫ8}p)T"K%,[~/qB	;4g ,[MIrNc/n"S#Ӕ*w!r@M_b))NAKC-_]~/.㻲O׸\Iѭ&ޅŧoO˻{c+ֽ3&ʫfȑ_MqCJY7/O{_a@CFݺnk8&:-ؒdIb]wcpFE2 7ߛyw ٞ)&H*6؍0fc SSTKU{0? 4N*ۼd73X,&Iw{
YBxN{ʘG<krs4NPZ
ONw}EGY?><D!ߡcf1-I cvxe3]2HOnRb\0ZKB!M^+heۇF6)?38^eԼIKlꌕ==QXVQ>xcoN-	3,:n)uה5L6w~}j<}7?qͫDD{&8&dw	+uHBj]q{Z\R-n1Lql9ђ(q),ugEFC ѠRB:)?K蝐JTҀq
&
m;aP1/CBǇ1v+0P
>vh8jBе!#A	ɿ'kvVFTGdv9z=mQv{B=@AO*h%ZwaE0t?a#L.7JdL.cb-2vsoS:HUk=DYZ{;qh$@}<H,h"90pހ@#LIFZ~Ċ*˧VNXYQO>܌=(zNɠUSjPg٨"IO$֛BI[T<VNɵbִB
tX4u3,x9:M":U뽸|Ek[F<7] ˜5ˎ?6gO{;k='{x2nţ+;T'8粏s:i!Et{փ#!or뛳p)_x˝,r-!bH"J8سZqC.Q'SvYX#I&k߆יH$1/ xEx])wmxPwTvz2'KXTaU舩܂Yݎ93#-1kCp-
>j]H"OQ87(f[,w뱘~=˯bX~-_ 纕@YcWk LA79"2Dz|y68
@.~`cVK(%9.@[s'O)yh2,~X+(CςP֦Ҡ/!_[npMwrmw;nwFT`yMf^ӁţLR^!OXW+')!=!͙i4%gs,R8lK	&z
UeJ<Yd^CnqÅ7Lږ*Tp4>ϒm\]Y򻿑vd7z5<7̻nВ??|⣳y0a!>**<MIz(W*\qWjJpO7Y"c)
.Ѫ%Tz03)UBԛ:z",CTѩ'Ii @[䤄_\I,!`^50˦bXPzX!xtPoRaG*l)jFFs+NQJe5k(Bƥ|GY@CƚR݊˯B.R/jP-CPSC'n_N
n8k,IV3oyt1}c5ف 
`a@ɘ1n'U]w\I˟5z9\$OlVkvWJCN+G$GEj鹥V35XE2y-h=3!>ޙLMKL.O (e߸+K0l8e{kOoҫk۞9|[W.:$_Xp9.]Ը6CV,];9ted|/S8_M-_)T֏)TG*:ql3PJz :j|Ko2b2֜Eifs !1vK;Rڎ!il3R!.#2~m1[.!mO]!5cr0zRW[pA7:_G::w?>bL'Y|UNAQꤸ("
&c#M|j$!l:,6sghQZ JK?Kt##-]Z%H75Pw?o9y9m|esj}nlFA*'[qR&@$૊ڻ_K\lbïl5-@!JBm(g;lg;o>Gc,PzO2DSBˉ#Ch4`#m1DV⑜h\iNQ4	}&ߐ.xnT禂J`v|).H,_[꣈0A?&ϻ߬Z97\|K2`hOHHW(ƎPGCF^d''a5;?>KrJ~;MKr=S _y8_~ݸ>,f =z^	@/sN6GYZhrƇ=NIc
=؁{Xg
Uo۫llW[MNSq|u6%iM&uHOUWq<PAr&)XɑK!zSyؓWZ6cCLG=yv;baG4-BY`;;X*ij5̑ή98GqQ=53F^__/^lW_pEJE+l9jNVZhÎNđ7nZҭJrV	Eu+LX-PkxtWi`7)Ѷ~:uK*<t_g8|U3CsG>+1;LH|ڦERXljnq˳i0plw8"&7f4b<Ξ5)W+,Jv|uTlR4p#=@yrRlF-RF]8'}'<̈ި6\=֑=u+8xGҶJFr_4ǰfbvɷᄥP-L{ӿ%{47~:k$,N!MGIa2!HNXlFk[=DodHA
s#ȴ;Owh:@eaZp Dq+_Ʒ>ߍ
ן
ޣn*W% %_3oW7N{?&m~]ayPsȄzB~[jF=,DTɺ\+^ٲ\AV3A˺pa {M4, m>V&ô(Eլy$*:fcL_XϝUuӧ>IZYc
N	gGgYl%\ǝ&zE_WVk#홹j#a\ss'Sm6փm-b
p6*ʔ^W0;33vYEjڌlPDdQ	<#U౉5'8\Ձ9ưi+ "_rJ^@ZȽ'oe5g|S!L_ɘ'/Seb|K9KO'ƣh.L8!&>E*8pjXnƲz{<]s2RGO=GbN?#G;3qx5q<WdSLO{a{q}{wŉJb h<?&bR iFt_)	GkeCÕ0KήtVFh2fgҐB`	pk	V/Ϻdb$<*r#G/XeGp8y{2_`Ocj!IL2֔D$M jwOMb|#XoC`	Ȳ^-r$+.< &E	.׻[س MS1>܃0\5mmM(PVѷwN/%:j2j?19HwZߙAE%c˯}zוCxc`d```عm<Wy8{UBF3^@  b xc`d`{H23gĐ ʀ>  l   xmAHTQ{yOW"ȬBB\H	q!n!,dx-A$A!"DDD"@	q!.b""DHHȻM .>ys>E# i4Q{:1$^-ᱚC&;*c8aڴ9t3W@'BΉ:;ɢۨ(;+,* )f?7d⿚KRXl83;vlaC{c.bV6PrX$MؼCFmܲǠOJ-Hro{ SHH^t1ֲf7	Ʈ׶B:l;{a]Rw߉CS"tAks1YS%d%ez}r޻uP׷y(z&8{Ds?eȇ:RW>\}S΋z"/߀|u]E=)Xאʩuy)hTWI_Qg>\a7,_uiuEi&{na}^ubY)EgЗfIb բ
   xc``Ёi2ZV1]bcbcbƼK6on+XOa.n¾#c+N#<yǸD":q]}G'g5^>^	xMw߀?%/r$ELJHW.D9g?$B$HrIHH~*z''&BLL-Y1<	r<rvrr]r[GO`0E?EEJ,JFJ	J(=QQ6SQ^@OF%Ge/)TRQQPn^OMBJKNNk7m5/<)jtOKқ̀ `WFRF3dL0ct0310b3=yf ss 0fabeqRr}V (      G  L   z  n  4F  xڝSNQ=<$SDuKśQ<,(@NEZZ/*@O&-p %Ν;gf@W Ĕ;(b8V졁9õ'(8EO|PWϱ亊}x_ܦ_b[T
<
/ŗxVwutѡ$hC	y"q1Y}j(eX-'Zic5v%ءMdK #mMys"mqiW<o2VqD^6Hs|210/egՕV7Xn}~cP7ķ{F6EsHDL{ו"<wV!ۖ5ƈ|Wyv,*s>/OKPXڦ%fթ0IV8!S].|ɹ^&戚:`f7?gCvM΂(DkYn	Oõ"wefY}rVn pf   xmWLqAi콧{oKJ{B[UqqhL|Ӹ^Ըgj+n}vU铗\>K%^/DH$hb0K$HɤJdIKPHŔІ=H':Ӆt;=cņRQNOzћ>qb 0AfCpF0Qfcx&0ILf
Stf0YTeWֳ-0$ͼe(&I4{a/GA?91rf;>yC1tg<)'n<~>M̥y̧:QH,b1XRX
s4U߸+Nr˼o,' $ɒ"&!Mr[ldq\lɑ\JKJKWLRiQڥ+JU=4ԔҪ)RCYVS{5UpK+6;o-=?5*m߃   K RXY  c #D#pE  K QKSZX4(Y`f UX%aEc#b#D***Y(	ERD*D$QX@XD&QX XDYYYY D Qg  |M  L           LP [  @(                                O p e n   S a n s    R e g u l a r    V e r s i o n   1 . 1 0   " O p e n   S a n s   R e g u l a r     BSGP                 l 4u A (DxZWh[qJx"cr,g,E&CĶ@rXY?&+uLFMlSMP+"betTR1U0:~bRˏbkšF}SC	X\7j)Y }	R#"Z	ABًUCTvmaiRxE|W)"ֻBKa0м#1hGm\={If4m{XDCzb]r~V}g	QL|GL|0牨l.Eܬuc2SR7f5;2&Z:f(YsX6@샬zJ0ZY0(?X, I8¶E !$ҕc	>f`*4KdM[KڮhX݂$4TԞƽƁ:5p4v(dI%N3Pf
"	?sC], Rk'6;$;N"5eRƇU9cBkny$Q'ilOf
ƿ&RT0yA[.XYv銦^ Ru4owdkc~-Γ5O5:rkyV6Љ.I[3_W-io	IVa@D׶6&ҁ6mh[SoGơOdOnTzBjbPjSozSolh[}-Ċȧ"#{}o2CnhE
,Xcnw.'8Vs^gB[oySJУ_-7h]%(XzVɵUunGJr26z:l+L}klHyr 8Gp\	AZ*(eCԌH:ao+"PʟqC~4A" .Lt ErB\B ICwzMJC,Qd­zi;$ձa| I$mp-"L-2q-B-b-r--sPϦGJ
#?/(A@9E~G$?fl-,G3ɳ&IR*LE$Y5;ˀb#hN84Y"e3Y|1PY|:gYb3@Hn  i Ĉb%K	dD $ W4-$"j#Pie	'OeC6sd%^ZHQ"@+uWD:C"쾹*D%,$ 2x@xC *"8!O^f.(b;f0CUy5	oCğH-dhFsǲŐH/-1EF"+7oZ?Z%$JAibYA ;4' 8i{k"Fe1ujn nnɵE@#An$
'L[M11ty	ɓ䜖>u6Pv Bׁq 0(PxXK7U؈ B@O[F6pS;/S8Utiَ;к1呵 |&j/d/#؞ýuE#ΐbh67H$κ!4x@Z)"	*%@T[*^_*jD/Fs)ᣠN|77՟\P4vEr&޾wX*cfN);g.0E|*i92PXQN ˯1j{2<8ZxMa:NN&lm㉦(#I@3v*H;>uT۰ V  eב@5ؿ`Q&gBf~1	`r%jT8 TYhix?U;~W_GRPr}#XC
4  hr{kꂸnC'M:`mD58QUnJ{Xd| URF)&4}BA.3 9X4Fܩ6͈(g
~#t#*oa~'*AXJ?H2GVBhEd`>||
x.o!,ID<YH撥46c$K+9~Vfr)Pe,@gE(c]xl^fj#BUC>fUD@P0-Z<= 1T! %V4eJ` iJ$(X^ۓ#='S-23͘@@Wn+xlp.UςK؝&20Zw\r8R`_
!-K/a9!yB!R;hi@$ǄA:#B"{K{O#t܆ʢ"=ԑ'Jˋ
tDV芒Ȫ)S$9>اЕ4$3{'IF$b0BHH$J%%1UoݻQ%Zu2A1yl?ɑ}DdUop[oRŬ[fH2$Ev\PAp@8ڄ>IRe(<5k".B7a	2Euh[4pE>")BIC-G/t$肬|{H)ÌPsW51Snk=lE;QHf ?pfb]M{T6xժ!
/	As`VIgeugf;s$1!`vE)q(q9諛8f9/!#2 $MhĿT0Xh`:k<dIL0KCSiN݉cQn8Jld	$w7<BrK Ye>=6Dk(5TtJT,f3+&fފpe%n:Uށ E)+x]h$:3|=-i	3#(Va'B@NndeB
]$KP>	fHnfKXH^e#.93\._ql(1SVIb-D֎Kh,̕((JE}ASl5J	OOŹ	 ˙(	AUe@j#}1u-klEOmjGe5ﾨLgwTH~Q53v{դ20r3(BBj&D5sm	i+|i]nEs`/|C1YlK[
4Y4ypCYK'70hתAFC9RJkB+u֊I|'tWEe=jɐ)3W(ԕn)<#G]W^%'hַ)myvDɫ5ߙk`br)[LgS·|PΦ=u+?aXq,֣y恷"@պ(#r.Lzg]USxbNr"%ƚJks׽lD@0;hXǲYh7 ad3Ih"YEhsv0Ny>"ĉƉMaT!1KO1R}]jDq0VK'SS@;Jqȗ*53Դ~bӟmO6AFi|ZV	'b*QbϽ>zKͯ <U X>e[]ƎzˑtA !N6zBZR9URάZHZ#k{;6=EJ8,tQD?$]K-v~bg.P4H˿2z^&U@
B`A':;P|tn]#<cePI+2YTd!etVA$YX% ORHGjacK]ֳs>_swtM_ql"ovϤa B'`@XTI	JuX Mfznj\觍0p)/#'Y 
+W!p;h4KjYVûo|noXG|$έLf!ti	SVbzpc[EΒ­t*0th$NACm.h{P2Iffk6D.w!sLxVaet `}u',`QMfx "֚*E
%p5+$_>T"p1-W};3bd{"vULBܮU/b4hHɶV 0!WTS<g&0W-<d~0AdI &83IzEl$5}\`jg::ߤi0?R3Zݦ~ c\^^|2ziO/u8Zd  Qj W!N )Pd֠hh(im7Rx, vQbg\1)CyEgg˱D}݄Y!6>^A4A,QBr<]_GYAH8AY#y̜\2 zJe<{&.WJpA)9Fgܡ9xq@	.?RL_dY	!@kjyb?M֡ ҩXx AYXx@04*Fu4']\%-/ A[f7ɸbA)F0S^hsФAZFip21&P)'BP2"Az=N4<X\Z#๨KƘK$@!=,(k n00kwr,8&P΅[Rr)>%5}ʝguTRol77't9w`J]V;@dx
O51:x8 }P =pn!·QEH'}d䵆 +vG?v a9O)0Mhx[S	+=!4nK*Q8h)I	̿e|$,A,xȇ4P8a@$Y[wMLYr;Z1
U#i%n
Ͽ<JtIIͨ{6& Ǖ+1:2	pGȾvE)[]jp9jx>8$3m>bי.Բ8ҍ6!_
 ,@_jChksx}xdqJ҉T'@D's8Rvyeg@܂Xǳu8#jN do(J+-
(VH
	70)aC(ǚ)Z>l Υѿ0"䎕RB!ԛ&$%2Ev8|3f
whtC hn:,\F6b1X#=q1)
`k!N;$xE>^$	 )|_S=he8#+4VSeɰ^؞&$vҽHBoUVd(H$Q&.4Vƹe
g" `2ȿ'ԙ|a1VHv*`$"u,Tᆼ3h`G95!\tkꠋ  \OՋ=q𭊻<ZPew3!GG=AOC\}D@S
dTn.DH4hx#~NŔм/EP!:'{@#@<Bߦ	>7`u%:y젚_N4=7@Tg<\~ϺfM01]-2>L|1.	RQt( t-!Lԕ8np8T@E-Da!>[Ԣ8E'<Aj`9r	I;0[8q$	
V̿U ~$\b%T@p ),~	$q2౭ޓF*IDڷ0R5G3Pߤ&̊4#T$|DX𖬌aTsXRŅTx(4M2	3➲Nl&ahkڛeOiAL9 V8&,3OS^C8,Ў!I`Nq	%H[\ʛ)b˺AbTa2*+RcRdrh
Q[DE%dKA}mYy<n[Zh}A4/;q[qHxF0rdDm YG`}dI] i=A*cp%pe`%5ti^֖Ӑ ɼۗظ-f[pU(;<V)	!KkgUloT'sL]h8vjФJD!t=e?!7/aatǽKx!rﰦ-孳<A"";杹9a,S)! GG!
fW"?e0,&j<nfFz`]zR"jx:qk{A&}HwL(b;ϓ-: #}\'_qU~s)F<L"?k(܆i.:Gb+8v㲟4P%	e4*L`kYXQ5~fb?iRq
'!z+r;CߘȸoO"۬54a+K=ʬ!o++l @1*bL"#ӡWy=#离HA+?)x\\!H`Vi4'k4~6 Jؚ4Eg'9#V_Cb7Fb.q~v[-*O݂*XᛵDc0c"v~.FVy&bY*pRAr7JLDoKDHl/(G~ d-BY4u 3_x!i2?E;H	LJCu%X=r=R_&IH3'VQ!/I"Ir ^YhUTcg;⬓AqM?%tgksɹk	zR($א	ʥ;r+aHW:W2]kHC{(5}1%SbFbWSm6"o)~>	%n6u'") w	DaOF'g	_ZɼqTbJ6LG0&eHRKK{\XM_Rj vtE+V`Q`ntCAO{h |ffH;I+9wن4މ")eBo&x;brv{=ZyӣhDdA,9wDu_\0m"B.A놝[w
UM3>zTA
cfHKDֹ̊a{mmxS*đU%X,y`޼/4ޑ}^zt1nq`Op7YaWCgdRItmG+Ul=ral4UV"[ɦP<=m]:6Xoq 	8*$Rq	rjݻb=ؔv?!fJ1̔KMG+D	@""	Y&ʌGS-3~!_EN@(V{~/A~O`US3:B[E
KQS@0rLƣut-@ΣHɏ<*{%[çTȑj52ك
1zipvF\N2P9ֺu40sy>h⻗
W:s8n Sh1w(/&TW-{7f&}]W+K}/4K.AVm_:YxGZK?6TP`qyGĂa=sz-&/P9
G'P~ۜQ?]'T#~Sâ=uhg(Z1B1]BհO`0r֡'Hj75JS'S
D<VC6GJvk47זC}lȬAA,2TI(G#I{cdf󃏱6 !nak =ؘ[.46ԌlA%ûdbH
l|Y!oTye?iBFZ
`xB\d0oܣMWd4I+hTf'.#7m"o}jpΕ8-JQ05ffis܂W~ EaNv;XFS]OSց֨eg.)~}t ~HX6\ЪQNfJm%@#BE7w1)έp(H\(<|UͿKlA;Ck`ggH%8H~mJ-nW?.uz$MRba?έعYNŪc	׶啋laYl}./ &O!c!6 6׉;/	1HĤEiTÚJGRyp?dD0\o8(qX 		UZF`E{
asb] 6b`Q*wO~0%{7#ԣj(0
<MB qZ}
,UF86AG{DasV>ZY#uon63q'P5z-bȚ'<?=c<Neg;d:s0kSl c
HKeN!rol(5	Llȗ٥EuNQ@%L"A>xXTw4@ݪܲ~' |rr<![C^65:k3iQ'b*M=5Cr DCGFY-pXd(s J|n?ۈ!{4`7;jeFxo/IyF9lׁ.Q]1㳖C`)<ijxbD/e˘`~;#M^#ܭk2vҖGo|\L"lҁ
	 ^Mn6fc1F=R".۴dO^/$ar}S&h|!*,b.h'_Ab|˖!|u9U;h\e"+lz!ߺ+SF.5Nbmmf;"+Vz D%-3Fܛ[|n!Qbnjʅ ,8	J.	)wC=j-8 IpG#Lc)Q AyՍ-
^O*
^09MjLo~9<78wK/S.'a[kr7WU
TTZhh%/<wBceםK4&΅J땑uZDR^@.rPu\h_(͓lezq^c(>#K8JX#FpEN#ӎBY$e#ϙM zcnWa!5fK.CzOrH+Tˀ ov;-u!4*j$t GȣeuFjyDsH*(q}xFtosr&]ȥb;Nj ah{0o$ 8t\?{_!`KM3I-J]KpUoe`&ps6_ys69xnm4-^Ĕ %6Ǐ?4@&&RƔRGcC¬Sۛz-Ҫ	Q>|UB܈- *5YU<O+
UZDs0lc.Y0ML<J?~XP0!y-xI6ɭ0F&䤰dFCaFY8eT$2Ht='Į SHA	ZaAzHk*1gd$.̩O.tلW"\׉ۑZ=k((_U|P7K~C\MdXG/2	DA7- @բ8ف`(Ck,<Lq`9	:Ȫܛz73BSA	 RdýŬX΀l&YO[.-'CO1kCN꨿ θQ?deII8O{R'qEUISCӰ	L,V_t}"pǐ8t_:ǂqgεbͱuM󑢬œ(#'Zd$QHˌJ9jXhE5! NϺH"\H#]l/ycƢ'HbR*V>FavSK$XGlay4 =鬜Nm	$=`B<	KmO<}N2X'sܗ	c݉Av?FBDl/	2xlwӐlXBRi?RECR)\dL=*lsLU	RޡgV.?m)G1W~u-$xK)F:߼䤁d'^~`Xͼ<#e{E*	,ٓ7Q1TȍV%սmAܨr_e$lQFYoMhޜ3[܉!q9]7Os<PGYeGµr#
äip6L.YF
^bu	t"@"nO~B4[SBF?JT^Bs"uzPaƶ+lpF6NѨgas@lKT3o`ʹU3vkZ0؇WUJ и=]TR0Sx f8G6;Cbt#n2C2%
Bɖx@1"XzT$"jUȏnKi&h#LL)"UnnP_8E*{R2K\kcH܄|}U4/ÔwC,1L
 9~)èNHhA(R_{+j:.R|*2SibT!Uhzouy:!zS ]C*t
@Jъ%%3Qs\ɉ1SIc2-b@m4l&t,hVH=K+u/#XU_ 3@<Twe$(QƞWh|'Vrh:(ot ć_F Pr_ޚVB"VpSg+=/ѧpTh%°8$HWČs2("*c/_+mbeNDxy<4SAl/0piz	R7o$xf0/0?1{j2ϖ`PPAp*J3 %	dKzYOߢUjvNf7&mm?	faAa2`%Ɵ;Qbe
ƪTꥯ.ڡ;ڬt릻Et-+59>ͱҿJ:z`&+RGgp jcYVG#ݑFiz>
t5=6;5?9v%2J	s7-n*C{+-9e<Md (X}J4t|=b[I!EjJ$V^Aq0u??8L[BFg]agU/ZDy<BTGւzPǂ7\W=q*k7<-%DW"U\%"98o=wnV@C퐙kIO,BE
La%XqlYT1E`/]hK
DǅY6J73"8p4^ƶ!o'EaIdqRjBdWE(4(L)'F.BM̓DdbU[>u"7Pf
+AfqIhk1(Z6BS CO\⭇U"{h%ZŶHS#Z MLz+zN*SGP@/BeѪBvky,m#t$^|qo=A#'07p<a$5zIy/ɋۛq1_/ꬅc4VϏ쀫PX}#A_uĦ)=Mf,^;w
P 5-"	ӹ:{S^ 9lWD]644H,A$OI""Ǳ@R1%sQ(<цf`X-y{ȝlh<6~EbxKC17ۙƃt?bFL(ro?+$cPC/d~{({Oo{j>;~:WOC=SE:/hڊwn5rcџ4xlۀĒE:{;2Emt]SA]ձ	we&8[p_94'-*/B%@4MRAA `Vk@t»Uz_0HqnRN1)ә/W3]ALh\saL1l(`L&co
iɓlJ+Ho0IpHg#=tjj,vI*p?W9QeZӲ#3$Rl!:lrAFU4Z䡀G)Fj40[M!:lMGx} VN+
sT%oWU+Eׂ*!OKR^|NqZHdI>!%R[eBʆRn>_N,]t*ʢ94"JbĸD4/X3^b-K7k%lN5*geKz+#w=.nv{~\eLeI0UY=UIri`6`Ӱw0642]mHnK `)gHjJ<83sxH~P00Y	`~Q,(BrOK^e)
Q}/ͅR,CϫbJotXhɈ#A!7>@ǐ5 2CsD N;mm	EKQ&j⸸E4a*W٘o0"U8l\c>anAS0awBSƚ*;&5Ҵ̠rJv{2zCK
7cH2,]mHE TV2q ne_F^gvµcNVhB![I.PXP3 u*nvzVL/Be(WWvn[.8;fQŤ)!%Ms1r#=G@LG"-t=ȁ5MVZ:ݱ4;5#QRmQ~;͔WCx`4 հ5rQ]1aB_@'ҷ#?\PۖAgMPf;xlxp4xɱ_v	7
@=ӧ7q}*@2!BEȾ4gj\^z.@VXXI lsq{Tw6tlݟf1-|fQ3<A,aU{Z*`8Ko󋐐KA2nҒTC!LWƾ΀5mhçЩ_x$lA/ \&A֒h0ZӋfsўM@PHSY2r@R9s&f 2eR\\0[RùE"g)e#@ڲvPZ"aᦏa^1"uA^2*fL<Q"D#F	}Wa2xKl`^	ٖdɈi+RftM }̠R)`ڊŐ\qJn󨽚bksh@l`b8PEe
BjK4Rn`.<kW(ŗݶJ32㒙 :4kOO лlڧ7JDө h)e!K\5y1JIFXʃ6k *
PKBlPxt𲋬YHib0 |:sJ]Λ*Pm 8<oX%LtT[Ob\H1.T(ę#|NPdub`(5`IY|JʭdgW :ְ#pd8U`NN=
=bh A)1Prxb	n:7=l`]
rRC\vVXƩIA0ò-v^әrr^,Y?yP=NגDJ%hͩYrYQ̨4KYslL{hcv&LquSGcmqЂĖ4(X"K vh[Tr_AہB.|d%qƆ]⏁51:p}PHs9n#qD":7 $F
hfk RF' @>0REP
1J	>VpU9B)L(4J9Bf/%Zqy?n2It$mZOgiȳ-:RU3N3ZN$1#`@C5?=YAPap!aCCqpj&abf46OZhnC?O$`S ܃7x@{KL9LsdFC>;vv8&(8qɋ2@8]P#FvrC$7E000^ŬLPNjIi 1󨜂ܕ9}+a\*FCjj+Bl͌ ZߴJU@/撷ªm<:J[ՈD)@LCr, k>D!kѵ!Ǚ4GQ4q£= xPp:A)6AKߐ)s:$cqD 1˲D0P]NӵI1K{ZtۈJ`>QeJj` J 4n* |+t)H)\6h>++%^pwKy`7rru+k
c[zD)vK/3ﬔ@#G' 6Fg~T`cR=PgHՅcOҝꖆ긲n%3e-I1p\O
^ә,(\)o\V5ZVu`jrq:~Q|\ܲsLN씴I]2;rԶ4S\H;'ۆ.A0ɐ:&P@L&F] +hL೐W%ɜ< loDI!!=&˖AĔa>83oq_֢:3saTĀ4kD]ktnf!3xy
Zʭ,0.Dn.ƠsWۮeM\<z[ЄqmG3~KJm.8JS)PQ2=3([*D;PN3| XH"u1JR4ZnQM.tB0~X%P~>7),pҭdJ|yx~p dސl@λUM_A+/l>:N?{rQ9{)zذ4tnj|&_P-Fe*4-?T<4Z+qt
W.r!7!q151ݛK$r~/+=(ԧƾ]	):Icj{n\^)t
fԳxl2.UE	 -3p8̂LhDq #$&CmmVKaMYTM4̳oWķUM!3A<%A`8ςwj/6uz|JtJh.C@cnn8f󬓥Cr8tF["6;ӡl[\E5I@㏦ǖ0Љ늷"w9l{ ߝ%Vv48?г-nmw24r.02Q=F~eZ728N~&̞k&l<@^ʅCQ&$TCG	0t.
H)߿?H׷D8ʎًo"c;Fc)ؐ-`sbCA-jujGtщg*C7s1X|@)G 5 R,xVCЬ*-,8ojp=y`֢i}NŎ'¸'bBlg֖Kg'vf#颅p8\Ԁf$Ph~I497{EB\'&gh+$Zҝ݁<8	+Q#Ǉ"Â4ʹTH׻o?֛:$r9r]~s/h	-X3'k39PuJZ<}j'3I	t .ۙAGƯQ-X%q (#b{?n'i`&CR#nhfc;gz|$<Ab=.5.2Ðn<u]U"y$C(dH.
]%!ɍ+^wBZ@LXopPcm;FJL-Q8}JuQ/pί	XY=(\.P>&@5F,?e84I#ÂE(:=Ym4A5Z6:Mv}yxKؙ}m,:I
~4[	eP31spe%W+P |ܼr >-)Y@Ks,ayAhOm\#fg@G"CDXS]0.BM"z@*ď9ip.hDLφV1#+:b\jWΎJ`eӄ	4p T%A@K(,)Ö9N&z1.! hu"<3ڼH͏:~@S3!|x2S5Jv9$eCd|b)I
@PX͒g~	_+)Av6'ԡۖ:덭er,d--%4ܿ+3nyd5oϩ)V½H&H27OB*un;1>F1,z/C^9Yw@
$Oע%5Z8LOt7YN<@PFE^Q{?!} ,hdXx'3A&ee`kvmh;,)@;P9P@3̋cqZa:	x'uF3`b`y,h},S>MRB8&?U<?2x+1&@f$LGNBM6P,ORQ#E0j
f3V9Ce`HN~ʅce8ÜePDPNUhҰvJYe&pyA,e2BHтupU@XpYX@_Mc q&"Ϧ0#3j*usp.2EU:\?q:mAGۈ0D+Y`^bhHh4tAN%4on'GU'@>q='ibS角VywȜy+Btak)FOcDwA*eB^hHNx ;Y]"LQtƿ\V;kVE#11c"ueK%@O Ii⺕I	c*ʱպ(qGlRz}E6A9vCy0T\M⺼c8w5q߫%6{^FH5\p&	 JqA$b	ZX	"S0 )˖.bFV^9328-l#z<c~uXR$jJrC~br,`-J8c%q*Yf?f:YM^RBC]X9^`񇈢Pt
b/"ݨ4#]U v:^J<= v>Yb8=;c5[p[Wuջ#77 -!CHJ6"HQ`~7R
YUNS>I<71;0o	)K.Uqzsxp?$pd
0Z=VfL`~cM(R"du]M|_Q~,;.2Y\ V':ɾ]T&iYD^2l>]U;Ôb W4DZ4PθX!Y1~FL3.t7{f_=8UJUɌ$U'`}\^["VHvumBc~cG=qk˩JpvRp<Cm;~00<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata></metadata>
<defs>
<font id="open_sansregular" horiz-adv-x="1171" >
<font-face units-per-em="2048" ascent="1638" descent="-410" />
<missing-glyph horiz-adv-x="532" />
<glyph unicode="&#xfb01;" horiz-adv-x="1212" d="M29 0zM670 967h-279v-967h-166v967h-196v75l196 60v61q0 404 353 404q87 0 204 -35l-43 -133q-96 31 -164 31q-94 0 -139 -62.5t-45 -200.5v-71h279v-129zM1036 0h-166v1096h166v-1096zM856 1393q0 57 28 83.5t70 26.5q40 0 69 -27t29 -83t-29 -83.5t-69 -27.5 q-42 0 -70 27.5t-28 83.5z" />
<glyph unicode="&#xfb02;" horiz-adv-x="1212" d="M29 0zM670 967h-279v-967h-166v967h-196v75l196 60v61q0 404 353 404q87 0 204 -35l-43 -133q-96 31 -164 31q-94 0 -139 -62.5t-45 -200.5v-71h279v-129zM1036 0h-166v1556h166v-1556z" />
<glyph unicode="&#xfb03;" horiz-adv-x="1909" d="M29 0zM1358 967h-279v-967h-166v967h-196v75l196 60v61q0 404 353 404q87 0 204 -35l-43 -133q-96 31 -164 31q-94 0 -139 -62.5t-45 -200.5v-71h279v-129zM670 967h-279v-967h-166v967h-196v75l196 60v61q0 404 353 404q87 0 204 -35l-43 -133q-96 31 -164 31 q-94 0 -139 -62.5t-45 -200.5v-71h279v-129zM1731 0h-166v1096h166v-1096zM1551 1393q0 57 28 83.5t70 26.5q40 0 69 -27t29 -83t-29 -83.5t-69 -27.5q-42 0 -70 27.5t-28 83.5z" />
<glyph unicode="&#xfb04;" horiz-adv-x="1909" d="M29 0zM1358 967h-279v-967h-166v967h-196v75l196 60v61q0 404 353 404q87 0 204 -35l-43 -133q-96 31 -164 31q-94 0 -139 -62.5t-45 -200.5v-71h279v-129zM670 967h-279v-967h-166v967h-196v75l196 60v61q0 404 353 404q87 0 204 -35l-43 -133q-96 31 -164 31 q-94 0 -139 -62.5t-45 -200.5v-71h279v-129zM1731 0h-166v1556h166v-1556z" />
<glyph horiz-adv-x="2048" />
<glyph horiz-adv-x="2048" />
<glyph unicode="&#xd;" horiz-adv-x="1044" />
<glyph unicode=" "  horiz-adv-x="532" />
<glyph unicode="&#x09;" horiz-adv-x="532" />
<glyph unicode="&#xa0;" horiz-adv-x="532" />
<glyph unicode="!" horiz-adv-x="547" d="M326 403h-105l-51 1059h207zM152 106q0 136 120 136q58 0 89.5 -35t31.5 -101q0 -64 -32 -99.5t-89 -35.5q-52 0 -86 31.5t-34 103.5z" />
<glyph unicode="&#x22;" horiz-adv-x="821" d="M319 1462l-40 -528h-105l-41 528h186zM688 1462l-41 -528h-104l-41 528h186z" />
<glyph unicode="#" horiz-adv-x="1323" d="M981 899l-66 -340h283v-129h-307l-84 -430h-137l84 430h-303l-82 -430h-136l80 430h-262v129h287l68 340h-277v127h299l82 436h139l-82 -436h305l84 436h134l-84 -436h264v-127h-289zM475 559h303l66 340h-303z" />
<glyph unicode="$" d="M1036 449q0 -136 -102 -224.5t-285 -111.5v-232h-129v223q-112 0 -217 17.5t-172 48.5v156q83 -37 191.5 -60.5t197.5 -23.5v440q-205 65 -287.5 151t-82.5 222q0 131 101.5 215t268.5 102v182h129v-180q184 -5 355 -74l-52 -131q-149 59 -303 70v-434q157 -50 235 -97.5 t115 -109t37 -149.5zM866 436q0 72 -44.5 116.5t-172.5 88.5v-389q217 30 217 184zM319 1057q0 -76 45 -122t156 -87v387q-99 -16 -150 -62.5t-51 -115.5z" />
<glyph unicode="%" horiz-adv-x="1686" d="M242 1026q0 -170 37 -255t120 -85q164 0 164 340q0 338 -164 338q-83 0 -120 -84t-37 -254zM700 1026q0 -228 -76.5 -344.5t-224.5 -116.5q-140 0 -217.5 119t-77.5 342q0 227 74.5 342t220.5 115q145 0 223 -119t78 -338zM1122 440q0 -171 37 -255.5t121 -84.5t124 83.5 t40 256.5q0 171 -40 253.5t-124 82.5t-121 -82.5t-37 -253.5zM1581 440q0 -227 -76.5 -343.5t-224.5 -116.5q-142 0 -218.5 119t-76.5 341q0 227 74.5 342t220.5 115q142 0 221.5 -117.5t79.5 -339.5zM1323 1462l-811 -1462h-147l811 1462h147z" />
<glyph unicode="&#x26;" horiz-adv-x="1495" d="M414 1171q0 -69 36 -131.5t123 -150.5q129 75 179.5 138.5t50.5 146.5q0 77 -51.5 125.5t-137.5 48.5q-89 0 -144.5 -48t-55.5 -129zM569 129q241 0 400 154l-437 424q-111 -68 -157 -112.5t-68 -95.5t-22 -116q0 -117 77.5 -185.5t206.5 -68.5zM113 379q0 130 69.5 230 t249.5 202q-85 95 -115.5 144t-48.5 102t-18 110q0 150 98 234t273 84q162 0 255 -83.5t93 -232.5q0 -107 -68 -197.5t-225 -183.5l407 -391q56 62 89.5 145.5t56.5 182.5h168q-68 -286 -205 -434l299 -291h-229l-185 178q-118 -106 -240 -152t-272 -46q-215 0 -333.5 106 t-118.5 293z" />
<glyph unicode="'" horiz-adv-x="453" d="M319 1462l-40 -528h-105l-41 528h186z" />
<glyph unicode="(" horiz-adv-x="606" d="M82 561q0 265 77.5 496t223.5 405h162q-144 -193 -216.5 -424t-72.5 -475q0 -240 74 -469t213 -418h-160q-147 170 -224 397t-77 488z" />
<glyph unicode=")" horiz-adv-x="606" d="M524 561q0 -263 -77.5 -490t-223.5 -395h-160q139 188 213 417.5t74 469.5q0 244 -72.5 475t-216.5 424h162q147 -175 224 -406.5t77 -494.5z" />
<glyph unicode="*" horiz-adv-x="1130" d="M657 1556l-43 -395l398 111l26 -182l-381 -31l248 -326l-172 -94l-176 362l-160 -362l-176 94l242 326l-377 31l29 182l391 -111l-43 395h194z" />
<glyph unicode="+" d="M653 791h412v-138h-412v-426h-139v426h-410v138h410v428h139v-428z" />
<glyph unicode="," horiz-adv-x="502" d="M350 238l15 -23q-26 -100 -75 -232.5t-102 -246.5h-125q27 104 59.5 257t45.5 245h182z" />
<glyph unicode="-" horiz-adv-x="659" d="M84 473v152h491v-152h-491z" />
<glyph unicode="." horiz-adv-x="545" d="M152 106q0 67 30.5 101.5t87.5 34.5q58 0 90.5 -34.5t32.5 -101.5q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5z" />
<glyph unicode="/" horiz-adv-x="752" d="M731 1462l-545 -1462h-166l545 1462h166z" />
<glyph unicode="0" d="M1069 733q0 -379 -119.5 -566t-365.5 -187q-236 0 -359 191.5t-123 561.5q0 382 119 567t363 185q238 0 361.5 -193t123.5 -559zM270 733q0 -319 75 -464.5t239 -145.5q166 0 240.5 147.5t74.5 462.5t-74.5 461.5t-240.5 146.5q-164 0 -239 -144.5t-75 -463.5z" />
<glyph unicode="1" d="M715 0h-162v1042q0 130 8 246q-21 -21 -47 -44t-238 -195l-88 114l387 299h140v-1462z" />
<glyph unicode="2" d="M1061 0h-961v143l385 387q176 178 232 254t84 148t28 155q0 117 -71 185.5t-197 68.5q-91 0 -172.5 -30t-181.5 -109l-88 113q202 168 440 168q206 0 323 -105.5t117 -283.5q0 -139 -78 -275t-292 -344l-320 -313v-8h752v-154z" />
<glyph unicode="3" d="M1006 1118q0 -140 -78.5 -229t-222.5 -119v-8q176 -22 261 -112t85 -236q0 -209 -145 -321.5t-412 -112.5q-116 0 -212.5 17.5t-187.5 61.5v158q95 -47 202.5 -71.5t203.5 -24.5q379 0 379 297q0 266 -418 266h-144v143h146q171 0 271 75.5t100 209.5q0 107 -73.5 168 t-199.5 61q-96 0 -181 -26t-194 -96l-84 112q90 71 207.5 111.5t247.5 40.5q213 0 331 -97.5t118 -267.5z" />
<glyph unicode="4" d="M1130 336h-217v-336h-159v336h-711v145l694 989h176v-983h217v-151zM754 487v486q0 143 10 323h-8q-48 -96 -90 -159l-457 -650h545z" />
<glyph unicode="5" d="M557 893q231 0 363.5 -114.5t132.5 -313.5q0 -227 -144.5 -356t-398.5 -129q-247 0 -377 79v160q70 -45 174 -70.5t205 -25.5q176 0 273.5 83t97.5 240q0 306 -375 306q-95 0 -254 -29l-86 55l55 684h727v-153h-585l-37 -439q115 23 229 23z" />
<glyph unicode="6" d="M117 625q0 431 167.5 644.5t495.5 213.5q113 0 178 -19v-143q-77 25 -176 25q-235 0 -359 -146.5t-136 -460.5h12q110 172 348 172q197 0 310.5 -119t113.5 -323q0 -228 -124.5 -358.5t-336.5 -130.5q-227 0 -360 170.5t-133 474.5zM608 121q142 0 220.5 89.5t78.5 258.5 q0 145 -73 228t-218 83q-90 0 -165 -37t-119.5 -102t-44.5 -135q0 -103 40 -192t113.5 -141t167.5 -52z" />
<glyph unicode="7" d="M285 0l606 1309h-797v153h973v-133l-598 -1329h-184z" />
<glyph unicode="8" d="M584 1483q200 0 317 -93t117 -257q0 -108 -67 -197t-214 -162q178 -85 253 -178.5t75 -216.5q0 -182 -127 -290.5t-348 -108.5q-234 0 -360 102.5t-126 290.5q0 251 306 391q-138 78 -198 168.5t-60 202.5q0 159 117.5 253.5t314.5 94.5zM268 369q0 -120 83.5 -187 t234.5 -67q149 0 232 70t83 192q0 97 -78 172.5t-272 146.5q-149 -64 -216 -141.5t-67 -185.5zM582 1348q-125 0 -196 -60t-71 -160q0 -92 59 -158t218 -132q143 60 202.5 129t59.5 161q0 101 -72.5 160.5t-199.5 59.5z" />
<glyph unicode="9" d="M1061 838q0 -858 -664 -858q-116 0 -184 20v143q80 -26 182 -26q240 0 362.5 148.5t133.5 455.5h-12q-55 -83 -146 -126.5t-205 -43.5q-194 0 -308 116t-114 324q0 228 127.5 360t335.5 132q149 0 260.5 -76.5t171.5 -223t60 -345.5zM569 1341q-143 0 -221 -92t-78 -256 q0 -144 72 -226.5t219 -82.5q91 0 167.5 37t120.5 101t44 134q0 105 -41 194t-114.5 140t-168.5 51z" />
<glyph unicode=":" horiz-adv-x="545" d="M152 106q0 67 30.5 101.5t87.5 34.5q58 0 90.5 -34.5t32.5 -101.5q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5zM152 989q0 135 118 135q123 0 123 -135q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5z" />
<glyph unicode=";" horiz-adv-x="545" d="M350 238l15 -23q-26 -100 -75 -232.5t-102 -246.5h-125q27 104 59.5 257t45.5 245h182zM147 989q0 135 119 135q123 0 123 -135q0 -65 -33 -100t-90 -35q-58 0 -88.5 35t-30.5 100z" />
<glyph unicode="&#x3c;" d="M1065 242l-961 422v98l961 479v-149l-782 -371l782 -328v-151z" />
<glyph unicode="=" d="M119 858v137h930v-137h-930zM119 449v137h930v-137h-930z" />
<glyph unicode="&#x3e;" d="M104 393l783 326l-783 373v149l961 -479v-98l-961 -422v151z" />
<glyph unicode="?" horiz-adv-x="879" d="M289 403v54q0 117 36 192.5t134 159.5q136 115 171.5 173t35.5 140q0 102 -65.5 157.5t-188.5 55.5q-79 0 -154 -18.5t-172 -67.5l-59 135q189 99 395 99q191 0 297 -94t106 -265q0 -73 -19.5 -128.5t-57.5 -105t-164 -159.5q-101 -86 -133.5 -143t-32.5 -152v-33h-129z M240 106q0 136 120 136q58 0 89.5 -35t31.5 -101q0 -64 -32 -99.5t-89 -35.5q-52 0 -86 31.5t-34 103.5z" />
<glyph unicode="@" horiz-adv-x="1841" d="M1720 729q0 -142 -44 -260t-124 -183t-184 -65q-86 0 -145 52t-70 133h-8q-40 -87 -114.5 -136t-176.5 -49q-150 0 -234.5 102.5t-84.5 278.5q0 204 118 331.5t310 127.5q68 0 154 -12.5t155 -34.5l-25 -470v-22q0 -178 133 -178q91 0 148 107.5t57 279.5q0 181 -74 317 t-210.5 209.5t-313.5 73.5q-223 0 -388 -92.5t-252 -264t-87 -396.5q0 -305 161 -469t464 -164q210 0 436 86v-133q-192 -84 -436 -84q-363 0 -563.5 199.5t-200.5 557.5q0 260 107 463t305 314.5t454 111.5q215 0 382.5 -90.5t259 -257t91.5 -383.5zM686 598 q0 -254 195 -254q207 0 225 313l14 261q-72 20 -157 20q-130 0 -203.5 -90t-73.5 -250z" />
<glyph unicode="A" horiz-adv-x="1296" d="M1120 0l-182 465h-586l-180 -465h-172l578 1468h143l575 -1468h-176zM885 618l-170 453q-33 86 -68 211q-22 -96 -63 -211l-172 -453h473z" />
<glyph unicode="B" horiz-adv-x="1327" d="M201 1462h413q291 0 421 -87t130 -275q0 -130 -72.5 -214.5t-211.5 -109.5v-10q333 -57 333 -350q0 -196 -132.5 -306t-370.5 -110h-510v1462zM371 836h280q180 0 259 56.5t79 190.5q0 123 -88 177.5t-280 54.5h-250v-479zM371 692v-547h305q177 0 266.5 68.5t89.5 214.5 q0 136 -91.5 200t-278.5 64h-291z" />
<glyph unicode="C" horiz-adv-x="1292" d="M827 1331q-241 0 -380.5 -160.5t-139.5 -439.5q0 -287 134.5 -443.5t383.5 -156.5q153 0 349 55v-149q-152 -57 -375 -57q-323 0 -498.5 196t-175.5 557q0 226 84.5 396t244 262t375.5 92q230 0 402 -84l-72 -146q-166 78 -332 78z" />
<glyph unicode="D" horiz-adv-x="1493" d="M1368 745q0 -362 -196.5 -553.5t-565.5 -191.5h-405v1462h448q341 0 530 -189t189 -528zM1188 739q0 286 -143.5 431t-426.5 145h-247v-1168h207q304 0 457 149.5t153 442.5z" />
<glyph unicode="E" horiz-adv-x="1139" d="M1016 0h-815v1462h815v-151h-645v-471h606v-150h-606v-538h645v-152z" />
<glyph unicode="F" horiz-adv-x="1057" d="M371 0h-170v1462h815v-151h-645v-535h606v-151h-606v-625z" />
<glyph unicode="G" horiz-adv-x="1491" d="M844 766h497v-711q-116 -37 -236 -56t-278 -19q-332 0 -517 197.5t-185 553.5q0 228 91.5 399.5t263.5 262t403 90.5q234 0 436 -86l-66 -150q-198 84 -381 84q-267 0 -417 -159t-150 -441q0 -296 144.5 -449t424.5 -153q152 0 297 35v450h-327v152z" />
<glyph unicode="H" horiz-adv-x="1511" d="M1311 0h-170v688h-770v-688h-170v1462h170v-622h770v622h170v-1462z" />
<glyph unicode="I" horiz-adv-x="571" d="M201 0v1462h170v-1462h-170z" />
<glyph unicode="J" horiz-adv-x="547" d="M-12 -385q-94 0 -148 27v145q71 -20 148 -20q99 0 150.5 60t51.5 173v1462h170v-1448q0 -190 -96 -294.5t-276 -104.5z" />
<glyph unicode="K" horiz-adv-x="1257" d="M1257 0h-200l-533 709l-153 -136v-573h-170v1462h170v-725l663 725h201l-588 -635z" />
<glyph unicode="L" horiz-adv-x="1063" d="M201 0v1462h170v-1308h645v-154h-815z" />
<glyph unicode="M" horiz-adv-x="1849" d="M848 0l-496 1296h-8q14 -154 14 -366v-930h-157v1462h256l463 -1206h8l467 1206h254v-1462h-170v942q0 162 14 352h-8l-500 -1294h-137z" />
<glyph unicode="N" horiz-adv-x="1544" d="M1343 0h-194l-799 1227h-8q16 -216 16 -396v-831h-157v1462h192l797 -1222h8q-2 27 -9 173.5t-5 209.5v839h159v-1462z" />
<glyph unicode="O" horiz-adv-x="1595" d="M1470 733q0 -351 -177.5 -552t-493.5 -201q-323 0 -498.5 197.5t-175.5 557.5q0 357 176 553.5t500 196.5q315 0 492 -200t177 -552zM305 733q0 -297 126.5 -450.5t367.5 -153.5q243 0 367 153t124 451q0 295 -123.5 447.5t-365.5 152.5q-243 0 -369.5 -153.5 t-126.5 -446.5z" />
<glyph unicode="P" horiz-adv-x="1233" d="M1128 1036q0 -222 -151.5 -341.5t-433.5 -119.5h-172v-575h-170v1462h379q548 0 548 -426zM371 721h153q226 0 327 73t101 234q0 145 -95 216t-296 71h-190v-594z" />
<glyph unicode="Q" horiz-adv-x="1595" d="M1470 733q0 -281 -113 -467t-319 -252l348 -362h-247l-285 330l-55 -2q-323 0 -498.5 197.5t-175.5 557.5q0 357 176 553.5t500 196.5q315 0 492 -200t177 -552zM305 733q0 -297 126.5 -450.5t367.5 -153.5q243 0 367 153t124 451q0 295 -123.5 447.5t-365.5 152.5 q-243 0 -369.5 -153.5t-126.5 -446.5z" />
<glyph unicode="R" horiz-adv-x="1266" d="M371 608v-608h-170v1462h401q269 0 397.5 -103t128.5 -310q0 -290 -294 -392l397 -657h-201l-354 608h-305zM371 754h233q180 0 264 71.5t84 214.5q0 145 -85.5 209t-274.5 64h-221v-559z" />
<glyph unicode="S" horiz-adv-x="1124" d="M1026 389q0 -193 -140 -301t-380 -108q-260 0 -400 67v164q90 -38 196 -60t210 -22q170 0 256 64.5t86 179.5q0 76 -30.5 124.5t-102 89.5t-217.5 93q-204 73 -291.5 173t-87.5 261q0 169 127 269t336 100q218 0 401 -80l-53 -148q-181 76 -352 76q-135 0 -211 -58 t-76 -161q0 -76 28 -124.5t94.5 -89t203.5 -89.5q230 -82 316.5 -176t86.5 -244z" />
<glyph unicode="T" horiz-adv-x="1133" d="M651 0h-170v1311h-463v151h1096v-151h-463v-1311z" />
<glyph unicode="U" horiz-adv-x="1491" d="M1305 1462v-946q0 -250 -151 -393t-415 -143t-408.5 144t-144.5 396v942h170v-954q0 -183 100 -281t294 -98q185 0 285 98.5t100 282.5v952h170z" />
<glyph unicode="V" horiz-adv-x="1219" d="M1036 1462h183l-527 -1462h-168l-524 1462h180l336 -946q58 -163 92 -317q36 162 94 323z" />
<glyph unicode="W" horiz-adv-x="1896" d="M1477 0h-168l-295 979q-21 65 -47 164t-27 119q-22 -132 -70 -289l-286 -973h-168l-389 1462h180l231 -903q48 -190 70 -344q27 183 80 358l262 889h180l275 -897q48 -155 81 -350q19 142 72 346l230 901h180z" />
<glyph unicode="X" horiz-adv-x="1182" d="M1174 0h-193l-393 643l-400 -643h-180l486 764l-453 698h188l363 -579l366 579h181l-453 -692z" />
<glyph unicode="Y" horiz-adv-x="1147" d="M573 731l390 731h184l-488 -895v-567h-172v559l-487 903h186z" />
<glyph unicode="Z" horiz-adv-x="1169" d="M1087 0h-1005v133l776 1176h-752v153h959v-133l-776 -1175h798v-154z" />
<glyph unicode="[" horiz-adv-x="674" d="M623 -324h-457v1786h457v-141h-289v-1503h289v-142z" />
<glyph unicode="\" horiz-adv-x="752" d="M186 1462l547 -1462h-166l-544 1462h163z" />
<glyph unicode="]" horiz-adv-x="674" d="M51 -182h289v1503h-289v141h457v-1786h-457v142z" />
<glyph unicode="^" horiz-adv-x="1110" d="M49 551l434 922h99l477 -922h-152l-372 745l-334 -745h-152z" />
<glyph unicode="_" horiz-adv-x="918" d="M922 -315h-926v131h926v-131z" />
<glyph unicode="`" horiz-adv-x="1182" d="M786 1241h-110q-65 52 -154 148t-129 159v21h203q32 -69 89 -159.5t101 -143.5v-25z" />
<glyph unicode="a" horiz-adv-x="1139" d="M850 0l-33 156h-8q-82 -103 -163.5 -139.5t-203.5 -36.5q-163 0 -255.5 84t-92.5 239q0 332 531 348l186 6v68q0 129 -55.5 190.5t-177.5 61.5q-137 0 -310 -84l-51 127q81 44 177.5 69t193.5 25q196 0 290.5 -87t94.5 -279v-748h-123zM475 117q155 0 243.5 85t88.5 238 v99l-166 -7q-198 -7 -285.5 -61.5t-87.5 -169.5q0 -90 54.5 -137t152.5 -47z" />
<glyph unicode="b" horiz-adv-x="1255" d="M686 1114q216 0 335.5 -147.5t119.5 -417.5t-120.5 -419.5t-334.5 -149.5q-107 0 -195.5 39.5t-148.5 121.5h-12l-35 -141h-119v1556h166v-378q0 -127 -8 -228h8q116 164 344 164zM662 975q-170 0 -245 -97.5t-75 -328.5t77 -330.5t247 -99.5q153 0 228 111.5t75 320.5 q0 214 -75 319t-232 105z" />
<glyph unicode="c" horiz-adv-x="975" d="M614 -20q-238 0 -368.5 146.5t-130.5 414.5q0 275 132.5 425t377.5 150q79 0 158 -17t124 -40l-51 -141q-55 22 -120 36.5t-115 14.5q-334 0 -334 -426q0 -202 81.5 -310t241.5 -108q137 0 281 59v-147q-110 -57 -277 -57z" />
<glyph unicode="d" horiz-adv-x="1255" d="M922 147h-9q-115 -167 -344 -167q-215 0 -334.5 147t-119.5 418t120 421t334 150q223 0 342 -162h13l-7 79l-4 77v446h166v-1556h-135zM590 119q170 0 246.5 92.5t76.5 298.5v35q0 233 -77.5 332.5t-247.5 99.5q-146 0 -223.5 -113.5t-77.5 -320.5q0 -210 77 -317 t226 -107z" />
<glyph unicode="e" horiz-adv-x="1149" d="M639 -20q-243 0 -383.5 148t-140.5 411q0 265 130.5 421t350.5 156q206 0 326 -135.5t120 -357.5v-105h-755q5 -193 97.5 -293t260.5 -100q177 0 350 74v-148q-88 -38 -166.5 -54.5t-189.5 -16.5zM594 977q-132 0 -210.5 -86t-92.5 -238h573q0 157 -70 240.5t-200 83.5z " />
<glyph unicode="f" horiz-adv-x="694" d="M670 967h-279v-967h-166v967h-196v75l196 60v61q0 404 353 404q87 0 204 -35l-43 -133q-96 31 -164 31q-94 0 -139 -62.5t-45 -200.5v-71h279v-129z" />
<glyph unicode="g" horiz-adv-x="1122" d="M1073 1096v-105l-203 -24q28 -35 50 -91.5t22 -127.5q0 -161 -110 -257t-302 -96q-49 0 -92 8q-106 -56 -106 -141q0 -45 37 -66.5t127 -21.5h194q178 0 273.5 -75t95.5 -218q0 -182 -146 -277.5t-426 -95.5q-215 0 -331.5 80t-116.5 226q0 100 64 173t180 99 q-42 19 -70.5 59t-28.5 93q0 60 32 105t101 87q-85 35 -138.5 119t-53.5 192q0 180 108 277.5t306 97.5q86 0 155 -20h379zM199 -184q0 -89 75 -135t215 -46q209 0 309.5 62.5t100.5 169.5q0 89 -55 123.5t-207 34.5h-199q-113 0 -176 -54t-63 -155zM289 745q0 -115 65 -174 t181 -59q243 0 243 236q0 247 -246 247q-117 0 -180 -63t-63 -187z" />
<glyph unicode="h" horiz-adv-x="1257" d="M926 0v709q0 134 -61 200t-191 66q-173 0 -252.5 -94t-79.5 -308v-573h-166v1556h166v-471q0 -85 -8 -141h10q49 79 139.5 124.5t206.5 45.5q201 0 301.5 -95.5t100.5 -303.5v-715h-166z" />
<glyph unicode="i" horiz-adv-x="518" d="M342 0h-166v1096h166v-1096zM162 1393q0 57 28 83.5t70 26.5q40 0 69 -27t29 -83t-29 -83.5t-69 -27.5q-42 0 -70 27.5t-28 83.5z" />
<glyph unicode="j" horiz-adv-x="518" d="M43 -492q-95 0 -154 25v135q69 -20 136 -20q78 0 114.5 42.5t36.5 129.5v1276h166v-1264q0 -324 -299 -324zM162 1393q0 57 28 83.5t70 26.5q40 0 69 -27t29 -83t-29 -83.5t-69 -27.5q-42 0 -70 27.5t-28 83.5z" />
<glyph unicode="k" horiz-adv-x="1075" d="M340 561q43 61 131 160l354 375h197l-444 -467l475 -629h-201l-387 518l-125 -108v-410h-164v1556h164v-825q0 -55 -8 -170h8z" />
<glyph unicode="l" horiz-adv-x="518" d="M342 0h-166v1556h166v-1556z" />
<glyph unicode="m" horiz-adv-x="1905" d="M1573 0v713q0 131 -56 196.5t-174 65.5q-155 0 -229 -89t-74 -274v-612h-166v713q0 131 -56 196.5t-175 65.5q-156 0 -228.5 -93.5t-72.5 -306.5v-575h-166v1096h135l27 -150h8q47 80 132.5 125t191.5 45q257 0 336 -186h8q49 86 142 136t212 50q186 0 278.5 -95.5 t92.5 -305.5v-715h-166z" />
<glyph unicode="n" horiz-adv-x="1257" d="M926 0v709q0 134 -61 200t-191 66q-172 0 -252 -93t-80 -307v-575h-166v1096h135l27 -150h8q51 81 143 125.5t205 44.5q198 0 298 -95.5t100 -305.5v-715h-166z" />
<glyph unicode="o" horiz-adv-x="1237" d="M1122 549q0 -268 -135 -418.5t-373 -150.5q-147 0 -261 69t-176 198t-62 302q0 268 134 417.5t372 149.5q230 0 365.5 -153t135.5 -414zM287 549q0 -210 84 -320t247 -110t247.5 109.5t84.5 320.5q0 209 -84.5 317.5t-249.5 108.5q-163 0 -246 -107t-83 -319z" />
<glyph unicode="p" horiz-adv-x="1255" d="M686 -20q-107 0 -195.5 39.5t-148.5 121.5h-12q12 -96 12 -182v-451h-166v1588h135l23 -150h8q64 90 149 130t195 40q218 0 336.5 -149t118.5 -418q0 -270 -120.5 -419.5t-334.5 -149.5zM662 975q-168 0 -243 -93t-77 -296v-37q0 -231 77 -330.5t247 -99.5 q142 0 222.5 115t80.5 317q0 205 -80.5 314.5t-226.5 109.5z" />
<glyph unicode="q" horiz-adv-x="1255" d="M590 119q166 0 242 89t81 300v37q0 230 -78 331t-247 101q-146 0 -223.5 -113.5t-77.5 -320.5t76.5 -315.5t226.5 -108.5zM565 -20q-212 0 -331 149t-119 416q0 269 120 420t334 151q225 0 346 -170h9l24 150h131v-1588h-166v469q0 100 11 170h-13q-115 -167 -346 -167z " />
<glyph unicode="r" horiz-adv-x="836" d="M676 1116q73 0 131 -12l-23 -154q-68 15 -120 15q-133 0 -227.5 -108t-94.5 -269v-588h-166v1096h137l19 -203h8q61 107 147 165t189 58z" />
<glyph unicode="s" horiz-adv-x="977" d="M883 299q0 -153 -114 -236t-320 -83q-218 0 -340 69v154q79 -40 169.5 -63t174.5 -23q130 0 200 41.5t70 126.5q0 64 -55.5 109.5t-216.5 107.5q-153 57 -217.5 99.5t-96 96.5t-31.5 129q0 134 109 211.5t299 77.5q177 0 346 -72l-59 -135q-165 68 -299 68 q-118 0 -178 -37t-60 -102q0 -44 22.5 -75t72.5 -59t192 -81q195 -71 263.5 -143t68.5 -181z" />
<glyph unicode="t" horiz-adv-x="723" d="M530 117q44 0 85 6.5t65 13.5v-127q-27 -13 -79.5 -21.5t-94.5 -8.5q-318 0 -318 335v652h-157v80l157 69l70 234h96v-254h318v-129h-318v-645q0 -99 47 -152t129 -53z" />
<glyph unicode="u" horiz-adv-x="1257" d="M332 1096v-711q0 -134 61 -200t191 -66q172 0 251.5 94t79.5 307v576h166v-1096h-137l-24 147h-9q-51 -81 -141.5 -124t-206.5 -43q-200 0 -299.5 95t-99.5 304v717h168z" />
<glyph unicode="v" horiz-adv-x="1026" d="M416 0l-416 1096h178l236 -650q80 -228 94 -296h8q11 53 69.5 219.5t262.5 726.5h178l-416 -1096h-194z" />
<glyph unicode="w" horiz-adv-x="1593" d="M1071 0l-201 643q-19 59 -71 268h-8q-40 -175 -70 -270l-207 -641h-192l-299 1096h174q106 -413 161.5 -629t63.5 -291h8q11 57 35.5 147.5t42.5 143.5l201 629h180l196 -629q56 -172 76 -289h8q4 36 21.5 111t208.5 807h172l-303 -1096h-197z" />
<glyph unicode="x" horiz-adv-x="1073" d="M440 561l-381 535h189l289 -420l288 420h187l-381 -535l401 -561h-188l-307 444l-310 -444h-188z" />
<glyph unicode="y" horiz-adv-x="1032" d="M2 1096h178l240 -625q79 -214 98 -309h8q13 51 54.5 174.5t271.5 759.5h178l-471 -1248q-70 -185 -163.5 -262.5t-229.5 -77.5q-76 0 -150 17v133q55 -12 123 -12q171 0 244 192l61 156z" />
<glyph unicode="z" horiz-adv-x="958" d="M877 0h-795v113l598 854h-561v129h743v-129l-590 -838h605v-129z" />
<glyph unicode="{" horiz-adv-x="776" d="M475 12q0 -102 58.5 -148t171.5 -48v-140q-190 2 -294 87t-104 239v303q0 104 -63 148.5t-183 44.5v141q130 2 188 48t58 142v306q0 155 108 241t290 86v-139q-230 -6 -230 -199v-295q0 -215 -223 -254v-12q223 -39 223 -254v-297z" />
<glyph unicode="|" horiz-adv-x="1128" d="M494 1556h141v-2052h-141v2052z" />
<glyph unicode="}" horiz-adv-x="776" d="M522 575q-223 39 -223 254v295q0 193 -227 199v139q184 0 289.5 -87t105.5 -240v-306q0 -97 59 -142.5t189 -47.5v-141q-122 0 -185 -44.5t-63 -148.5v-303q0 -153 -102.5 -238.5t-292.5 -87.5v140q111 2 169 48t58 148v297q0 114 55 174t168 80v12z" />
<glyph unicode="~" d="M338 713q-53 0 -116.5 -33.5t-117.5 -87.5v151q100 109 244 109q68 0 124.5 -14t145.5 -52q66 -28 115 -41.5t96 -13.5q54 0 118 32t118 89v-150q-102 -110 -244 -110q-72 0 -135 16.5t-135 48.5q-75 32 -120 44t-93 12z" />
<glyph unicode="&#xa1;" horiz-adv-x="547" d="M219 684h105l51 -1057h-207zM393 983q0 -135 -121 -135q-60 0 -90 35.5t-30 99.5q0 63 31.5 99t88.5 36q51 0 86 -32t35 -103z" />
<glyph unicode="&#xa2;" d="M971 240q-105 -54 -252 -60v-200h-133v206q-203 32 -299.5 168.5t-96.5 386.5q0 508 396 570v172h135v-164q75 -3 146 -19.5t120 -39.5l-49 -140q-133 51 -242 51q-172 0 -253 -105.5t-81 -322.5q0 -212 79.5 -313.5t246.5 -101.5q141 0 283 59v-147z" />
<glyph unicode="&#xa3;" d="M682 1481q190 0 360 -84l-61 -133q-154 77 -297 77q-123 0 -185.5 -62t-62.5 -202v-295h422v-127h-422v-221q0 -100 -32.5 -168t-106.5 -112h795v-154h-1029v141q205 47 205 291v223h-198v127h198v316q0 178 112 280.5t302 102.5z" />
<glyph unicode="&#xa4;" d="M184 723q0 122 74 229l-135 140l94 92l135 -133q104 73 234 73q127 0 229 -73l137 133l95 -92l-134 -138q74 -113 74 -231q0 -131 -74 -234l131 -135l-92 -92l-137 133q-102 -71 -229 -71q-134 0 -234 73l-135 -133l-92 92l133 136q-74 107 -74 231zM313 723 q0 -112 78.5 -192t194.5 -80t195 79.5t79 192.5q0 114 -80 195t-194 81q-116 0 -194.5 -82t-78.5 -194z" />
<glyph unicode="&#xa5;" d="M584 735l379 727h174l-416 -770h262v-127h-317v-170h317v-127h-317v-268h-164v268h-316v127h316v170h-316v127h256l-411 770h178z" />
<glyph unicode="&#xa6;" horiz-adv-x="1128" d="M494 1556h141v-776h-141v776zM494 281h141v-777h-141v777z" />
<glyph unicode="&#xa7;" horiz-adv-x="1057" d="M139 809q0 86 43 154.5t121 105.5q-74 40 -116 95.5t-42 140.5q0 121 103.5 190.5t300.5 69.5q94 0 173.5 -14.5t176.5 -53.5l-53 -131q-98 39 -165.5 52.5t-143.5 13.5q-116 0 -174 -29.5t-58 -93.5q0 -60 61.5 -102t215.5 -97q186 -68 261 -143.5t75 -182.5 q0 -90 -41 -160.5t-115 -111.5q153 -81 153 -227q0 -140 -117 -216.5t-329 -76.5q-218 0 -346 65v148q78 -37 175 -59.5t179 -22.5q134 0 204.5 38t70.5 109q0 46 -24 75t-78 58t-169 72q-142 52 -209 97t-100 102t-33 135zM285 829q0 -77 66 -129.5t233 -113.5l49 -19 q137 80 137 191q0 83 -73.5 139t-258.5 113q-68 -19 -110.5 -69t-42.5 -112z" />
<glyph unicode="&#xa8;" horiz-adv-x="1182" d="M309 1393q0 52 26.5 75t63.5 23q38 0 65.5 -23t27.5 -75q0 -50 -27.5 -74.5t-65.5 -24.5q-37 0 -63.5 24.5t-26.5 74.5zM690 1393q0 52 26.5 75t63.5 23t64.5 -23t27.5 -75q0 -50 -27.5 -74.5t-64.5 -24.5t-63.5 24.5t-26.5 74.5z" />
<glyph unicode="&#xa9;" horiz-adv-x="1704" d="M893 1059q-125 0 -192.5 -87t-67.5 -241q0 -168 63.5 -249t194.5 -81q86 0 211 45v-124q-48 -20 -98.5 -34t-120.5 -14q-194 0 -298 120.5t-104 336.5q0 209 110.5 332t301.5 123q128 0 246 -60l-58 -118q-108 51 -188 51zM100 731q0 200 100 375t275 276t377 101 q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM205 731q0 -173 87 -323.5t237.5 -237t322.5 -86.5q174 0 323 87t236.5 235.5t87.5 324.5q0 174 -87 323t-235.5 236.5t-324.5 87.5q-174 0 -323 -87 t-236.5 -235.5t-87.5 -324.5z" />
<glyph unicode="&#xaa;" horiz-adv-x="725" d="M532 801l-24 84q-92 -97 -232 -97q-95 0 -150.5 49.5t-55.5 151.5t77 154.5t242 58.5l117 4v39q0 133 -148 133q-100 0 -204 -51l-43 96q114 56 247 56q130 0 198.5 -52.5t68.5 -173.5v-452h-93zM193 989q0 -100 112 -100q201 0 201 180v49l-98 -4q-112 -4 -163.5 -32.5 t-51.5 -92.5z" />
<glyph unicode="&#xab;" horiz-adv-x="1018" d="M82 551l342 407l119 -69l-289 -350l289 -351l-119 -71l-342 407v27zM477 551l344 407l117 -69l-287 -350l287 -351l-117 -71l-344 407v27z" />
<glyph unicode="&#xac;" d="M1065 791v-527h-137v389h-824v138h961z" />
<glyph unicode="&#xad;" horiz-adv-x="659" d="M84 473zM84 473v152h491v-152h-491z" />
<glyph unicode="&#xae;" horiz-adv-x="1704" d="M723 762h108q80 0 128.5 41.5t48.5 105.5q0 75 -43 107.5t-136 32.5h-106v-287zM1157 913q0 -80 -42.5 -141.5t-119.5 -91.5l238 -395h-168l-207 354h-135v-354h-148v891h261q166 0 243.5 -65t77.5 -198zM100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275 t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM205 731q0 -173 87 -323.5t237.5 -237t322.5 -86.5q174 0 323 87t236.5 235.5t87.5 324.5q0 174 -87 323t-235.5 236.5t-324.5 87.5q-174 0 -323 -87t-236.5 -235.5t-87.5 -324.5z " />
<glyph unicode="&#xaf;" horiz-adv-x="1024" d="M1030 1556h-1036v127h1036v-127z" />
<glyph unicode="&#xb0;" horiz-adv-x="877" d="M127 1171q0 130 90.5 221t220.5 91t221 -90.5t91 -221.5q0 -84 -41 -155.5t-114 -113.5t-157 -42q-130 0 -220.5 90t-90.5 221zM242 1171q0 -82 58.5 -139t139.5 -57q80 0 137.5 56.5t57.5 139.5q0 84 -56.5 140.5t-138.5 56.5q-83 0 -140.5 -57t-57.5 -140z" />
<glyph unicode="&#xb1;" d="M104 1zM653 791h412v-138h-412v-426h-139v426h-410v138h410v428h139v-428zM104 1v138h961v-138h-961z" />
<glyph unicode="&#xb2;" horiz-adv-x="711" d="M653 586h-604v104l236 230q89 86 130 134.5t57.5 86.5t16.5 92q0 68 -40 102.5t-103 34.5q-52 0 -101 -19t-118 -69l-66 88q131 111 283 111q132 0 205.5 -65t73.5 -177q0 -80 -44.5 -155.5t-191.5 -213.5l-174 -165h440v-119z" />
<glyph unicode="&#xb3;" horiz-adv-x="711" d="M627 1255q0 -80 -41 -131.5t-109 -74.5q176 -47 176 -209q0 -128 -92 -199.5t-260 -71.5q-152 0 -268 56v123q147 -68 270 -68q211 0 211 162q0 145 -231 145h-117v107h119q103 0 152.5 39.5t49.5 107.5q0 61 -40 95t-107 34q-66 0 -122 -21.5t-112 -56.5l-69 90 q63 45 133 72t164 27q136 0 214.5 -59.5t78.5 -166.5z" />
<glyph unicode="&#xb4;" horiz-adv-x="1182" d="M393 1266q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111v25z" />
<glyph unicode="&#xb5;" horiz-adv-x="1268" d="M342 381q0 -262 254 -262q171 0 250.5 94.5t79.5 306.5v576h166v-1096h-136l-26 147h-10q-111 -167 -340 -167q-150 0 -238 92h-10q10 -84 10 -244v-320h-166v1588h166v-715z" />
<glyph unicode="&#xb6;" horiz-adv-x="1341" d="M1120 -260h-114v1712h-213v-1712h-115v819q-62 -18 -146 -18q-216 0 -317.5 125t-101.5 376q0 260 109 387t341 127h557v-1816z" />
<glyph unicode="&#xb7;" horiz-adv-x="545" d="M152 723q0 66 31 100.5t87 34.5q58 0 90.5 -34.5t32.5 -100.5q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5z" />
<glyph unicode="&#xb8;" horiz-adv-x="465" d="M436 -289q0 -97 -76.5 -150t-226.5 -53q-51 0 -96 9v106q45 -8 104 -8q79 0 119.5 20t40.5 74q0 43 -39.5 69.5t-148.5 43.5l88 178h110l-55 -115q180 -39 180 -174z" />
<glyph unicode="&#xb9;" horiz-adv-x="711" d="M338 1462h143v-876h-133v579q0 91 6 181q-22 -22 -49 -44.5t-162 -117.5l-67 96z" />
<glyph unicode="&#xba;" horiz-adv-x="768" d="M702 1135q0 -164 -85.5 -255.5t-235.5 -91.5q-146 0 -230.5 93t-84.5 254q0 163 84 253.5t235 90.5q152 0 234.5 -91t82.5 -253zM188 1135q0 -122 45.5 -183t149.5 -61q105 0 151 61t46 183q0 123 -46 182t-151 59q-103 0 -149 -59t-46 -182z" />
<glyph unicode="&#xbb;" horiz-adv-x="1018" d="M936 524l-344 -407l-117 71l287 351l-287 350l117 69l344 -407v-27zM541 524l-344 -407l-117 71l287 351l-287 350l117 69l344 -407v-27z" />
<glyph unicode="&#xbc;" horiz-adv-x="1597" d="M75 0zM1298 1462l-903 -1462h-143l903 1462h143zM337 1462h143v-876h-133v579q0 91 6 181q-22 -22 -49 -44.5t-162 -117.5l-67 96zM1489 203h-125v-202h-145v202h-402v101l408 579h139v-563h125v-117zM1219 320v195q0 134 6 209q-5 -12 -17 -31.5t-27 -42l-30 -45 t-26 -39.5l-168 -246h262z" />
<glyph unicode="&#xbd;" horiz-adv-x="1597" d="M46 0zM1230 1462l-903 -1462h-143l903 1462h143zM308 1462h143v-876h-133v579q0 91 6 181q-22 -22 -49 -44.5t-162 -117.5l-67 96zM1499 1h-604v104l236 230q89 86 130 134.5t57.5 86.5t16.5 92q0 68 -40 102.5t-103 34.5q-52 0 -101 -19t-118 -69l-66 88 q131 111 283 111q132 0 205.5 -65t73.5 -177q0 -80 -44.5 -155.5t-191.5 -213.5l-174 -165h440v-119z" />
<glyph unicode="&#xbe;" horiz-adv-x="1597" d="M26 0zM620 1255q0 -80 -41 -131.5t-109 -74.5q176 -47 176 -209q0 -128 -92 -199.5t-260 -71.5q-152 0 -268 56v123q147 -68 270 -68q211 0 211 162q0 145 -231 145h-117v107h119q103 0 152.5 39.5t49.5 107.5q0 61 -40 95t-107 34q-66 0 -122 -21.5t-112 -56.5l-69 90 q63 45 133 72t164 27q136 0 214.5 -59.5t78.5 -166.5zM1390 1462l-903 -1462h-143l903 1462h143zM1569 203h-125v-202h-145v202h-402v101l408 579h139v-563h125v-117zM1299 320v195q0 134 6 209q-5 -12 -17 -31.5t-27 -42l-30 -45t-26 -39.5l-168 -246h262z" />
<glyph unicode="&#xbf;" horiz-adv-x="879" d="M590 684v-51q0 -122 -37.5 -196t-134.5 -158q-121 -106 -151.5 -143.5t-43 -76t-12.5 -94.5q0 -100 66 -156.5t188 -56.5q80 0 155 19t173 67l59 -135q-197 -96 -395 -96q-190 0 -298 93t-108 263q0 70 17.5 122.5t49.5 97t76.5 85.5t98.5 88q101 88 133.5 146t32.5 151 v31h131zM639 983q0 -135 -121 -135q-59 0 -90 34.5t-31 100.5q0 64 33 99.5t88 35.5q51 0 86 -32t35 -103z" />
<glyph unicode="&#xc0;" horiz-adv-x="1296" d="M0 0zM1120 0l-182 465h-586l-180 -465h-172l578 1468h143l575 -1468h-176zM885 618l-170 453q-33 86 -68 211q-22 -96 -63 -211l-172 -453h473zM724 1579h-110q-65 52 -154 148t-129 159v21h203q32 -69 89 -159.5t101 -143.5v-25z" />
<glyph unicode="&#xc1;" horiz-adv-x="1296" d="M0 0zM1120 0l-182 465h-586l-180 -465h-172l578 1468h143l575 -1468h-176zM885 618l-170 453q-33 86 -68 211q-22 -96 -63 -211l-172 -453h473zM526 1604q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111v25z" />
<glyph unicode="&#xc2;" horiz-adv-x="1296" d="M0 0zM1120 0l-182 465h-586l-180 -465h-172l578 1468h143l575 -1468h-176zM885 618l-170 453q-33 86 -68 211q-22 -96 -63 -211l-172 -453h473zM303 1602q127 136 178 200t74 105h166q22 -42 76.5 -108.5t179.5 -196.5v-23h-119q-88 55 -221 186q-136 -134 -219 -186 h-115v23z" />
<glyph unicode="&#xc3;" horiz-adv-x="1296" d="M0 0zM1120 0l-182 465h-586l-180 -465h-172l578 1468h143l575 -1468h-176zM885 618l-170 453q-33 86 -68 211q-22 -96 -63 -211l-172 -453h473zM792 1581q-43 0 -84 18.5t-80.5 41t-76 41t-70.5 18.5q-50 0 -75.5 -30t-39.5 -91h-98q13 121 70.5 189.5t148.5 68.5 q46 0 89 -18.5t82 -41t75 -41t68 -18.5q49 0 73 29.5t39 91.5h99q-13 -121 -69.5 -189.5t-150.5 -68.5z" />
<glyph unicode="&#xc4;" horiz-adv-x="1296" d="M0 0zM1120 0l-182 465h-586l-180 -465h-172l578 1468h143l575 -1468h-176zM885 618l-170 453q-33 86 -68 211q-22 -96 -63 -211l-172 -453h473zM364 1731q0 52 26.5 75t63.5 23q38 0 65.5 -23t27.5 -75q0 -50 -27.5 -74.5t-65.5 -24.5q-37 0 -63.5 24.5t-26.5 74.5z M745 1731q0 52 26.5 75t63.5 23t64.5 -23t27.5 -75q0 -50 -27.5 -74.5t-64.5 -24.5t-63.5 24.5t-26.5 74.5z" />
<glyph unicode="&#xc5;" horiz-adv-x="1296" d="M0 0zM1120 0l-182 465h-586l-180 -465h-172l578 1468h143l575 -1468h-176zM885 618l-170 453q-33 86 -68 211q-22 -96 -63 -211l-172 -453h473zM870 1587q0 -98 -61.5 -157.5t-163.5 -59.5q-101 0 -161 58.5t-60 156.5t60.5 155.5t160.5 57.5q101 0 163 -59.5t62 -151.5z M762 1585q0 56 -33 86.5t-84 30.5t-84 -30.5t-33 -86.5t30 -86.5t87 -30.5q52 0 84.5 30.5t32.5 86.5z" />
<glyph unicode="&#xc6;" horiz-adv-x="1788" d="M1665 0h-750v465h-514l-227 -465h-176l698 1462h969v-151h-580v-471h541v-150h-541v-538h580v-152zM469 618h446v693h-118z" />
<glyph unicode="&#xc7;" horiz-adv-x="1292" d="M125 0zM827 1331q-241 0 -380.5 -160.5t-139.5 -439.5q0 -287 134.5 -443.5t383.5 -156.5q153 0 349 55v-149q-152 -57 -375 -57q-323 0 -498.5 196t-175.5 557q0 226 84.5 396t244 262t375.5 92q230 0 402 -84l-72 -146q-166 78 -332 78zM950 -289q0 -97 -76.5 -150 t-226.5 -53q-51 0 -96 9v106q45 -8 104 -8q79 0 119.5 20t40.5 74q0 43 -39.5 69.5t-148.5 43.5l88 178h110l-55 -115q180 -39 180 -174z" />
<glyph unicode="&#xc8;" horiz-adv-x="1139" d="M201 0zM1016 0h-815v1462h815v-151h-645v-471h606v-150h-606v-538h645v-152zM713 1579h-110q-65 52 -154 148t-129 159v21h203q32 -69 89 -159.5t101 -143.5v-25z" />
<glyph unicode="&#xc9;" horiz-adv-x="1139" d="M201 0zM1016 0h-815v1462h815v-151h-645v-471h606v-150h-606v-538h645v-152zM456 1604q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111v25z" />
<glyph unicode="&#xca;" horiz-adv-x="1139" d="M201 0zM1016 0h-815v1462h815v-151h-645v-471h606v-150h-606v-538h645v-152zM263 1602q127 136 178 200t74 105h166q22 -42 76.5 -108.5t179.5 -196.5v-23h-119q-88 55 -221 186q-136 -134 -219 -186h-115v23z" />
<glyph unicode="&#xcb;" horiz-adv-x="1139" d="M201 0zM1016 0h-815v1462h815v-151h-645v-471h606v-150h-606v-538h645v-152zM327 1731q0 52 26.5 75t63.5 23q38 0 65.5 -23t27.5 -75q0 -50 -27.5 -74.5t-65.5 -24.5q-37 0 -63.5 24.5t-26.5 74.5zM708 1731q0 52 26.5 75t63.5 23t64.5 -23t27.5 -75q0 -50 -27.5 -74.5 t-64.5 -24.5t-63.5 24.5t-26.5 74.5z" />
<glyph unicode="&#xcc;" horiz-adv-x="571" d="M5 0zM201 0v1462h170v-1462h-170zM398 1579h-110q-65 52 -154 148t-129 159v21h203q32 -69 89 -159.5t101 -143.5v-25z" />
<glyph unicode="&#xcd;" horiz-adv-x="571" d="M179 0zM201 0v1462h170v-1462h-170zM179 1604q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111v25z" />
<glyph unicode="&#xce;" horiz-adv-x="571" d="M0 0zM201 0v1462h170v-1462h-170zM-57 1602q127 136 178 200t74 105h166q22 -42 76.5 -108.5t179.5 -196.5v-23h-119q-88 55 -221 186q-136 -134 -219 -186h-115v23z" />
<glyph unicode="&#xcf;" horiz-adv-x="571" d="M5 0zM201 0v1462h170v-1462h-170zM5 1731q0 52 26.5 75t63.5 23q38 0 65.5 -23t27.5 -75q0 -50 -27.5 -74.5t-65.5 -24.5q-37 0 -63.5 24.5t-26.5 74.5zM386 1731q0 52 26.5 75t63.5 23t64.5 -23t27.5 -75q0 -50 -27.5 -74.5t-64.5 -24.5t-63.5 24.5t-26.5 74.5z" />
<glyph unicode="&#xd0;" horiz-adv-x="1479" d="M1352 745q0 -362 -196.5 -553.5t-565.5 -191.5h-389v649h-154v150h154v663h434q337 0 527 -187.5t190 -529.5zM1171 739q0 576 -569 576h-231v-516h379v-150h-379v-502h190q610 0 610 592z" />
<glyph unicode="&#xd1;" horiz-adv-x="1544" d="M201 0zM1343 0h-194l-799 1227h-8q16 -216 16 -396v-831h-157v1462h192l797 -1222h8q-2 27 -9 173.5t-5 209.5v839h159v-1462zM935 1581q-43 0 -84 18.5t-80.5 41t-76 41t-70.5 18.5q-50 0 -75.5 -30t-39.5 -91h-98q13 121 70.5 189.5t148.5 68.5q46 0 89 -18.5t82 -41 t75 -41t68 -18.5q49 0 73 29.5t39 91.5h99q-13 -121 -69.5 -189.5t-150.5 -68.5z" />
<glyph unicode="&#xd2;" horiz-adv-x="1595" d="M125 0zM1470 733q0 -351 -177.5 -552t-493.5 -201q-323 0 -498.5 197.5t-175.5 557.5q0 357 176 553.5t500 196.5q315 0 492 -200t177 -552zM305 733q0 -297 126.5 -450.5t367.5 -153.5q243 0 367 153t124 451q0 295 -123.5 447.5t-365.5 152.5q-243 0 -369.5 -153.5 t-126.5 -446.5zM907 1579h-110q-65 52 -154 148t-129 159v21h203q32 -69 89 -159.5t101 -143.5v-25z" />
<glyph unicode="&#xd3;" horiz-adv-x="1595" d="M125 0zM1470 733q0 -351 -177.5 -552t-493.5 -201q-323 0 -498.5 197.5t-175.5 557.5q0 357 176 553.5t500 196.5q315 0 492 -200t177 -552zM305 733q0 -297 126.5 -450.5t367.5 -153.5q243 0 367 153t124 451q0 295 -123.5 447.5t-365.5 152.5q-243 0 -369.5 -153.5 t-126.5 -446.5zM659 1604q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111v25z" />
<glyph unicode="&#xd4;" horiz-adv-x="1595" d="M125 0zM1470 733q0 -351 -177.5 -552t-493.5 -201q-323 0 -498.5 197.5t-175.5 557.5q0 357 176 553.5t500 196.5q315 0 492 -200t177 -552zM305 733q0 -297 126.5 -450.5t367.5 -153.5q243 0 367 153t124 451q0 295 -123.5 447.5t-365.5 152.5q-243 0 -369.5 -153.5 t-126.5 -446.5zM448 1602q127 136 178 200t74 105h166q22 -42 76.5 -108.5t179.5 -196.5v-23h-119q-88 55 -221 186q-136 -134 -219 -186h-115v23z" />
<glyph unicode="&#xd5;" horiz-adv-x="1595" d="M125 0zM1470 733q0 -351 -177.5 -552t-493.5 -201q-323 0 -498.5 197.5t-175.5 557.5q0 357 176 553.5t500 196.5q315 0 492 -200t177 -552zM305 733q0 -297 126.5 -450.5t367.5 -153.5q243 0 367 153t124 451q0 295 -123.5 447.5t-365.5 152.5q-243 0 -369.5 -153.5 t-126.5 -446.5zM942 1581q-43 0 -84 18.5t-80.5 41t-76 41t-70.5 18.5q-50 0 -75.5 -30t-39.5 -91h-98q13 121 70.5 189.5t148.5 68.5q46 0 89 -18.5t82 -41t75 -41t68 -18.5q49 0 73 29.5t39 91.5h99q-13 -121 -69.5 -189.5t-150.5 -68.5z" />
<glyph unicode="&#xd6;" horiz-adv-x="1595" d="M125 0zM1470 733q0 -351 -177.5 -552t-493.5 -201q-323 0 -498.5 197.5t-175.5 557.5q0 357 176 553.5t500 196.5q315 0 492 -200t177 -552zM305 733q0 -297 126.5 -450.5t367.5 -153.5q243 0 367 153t124 451q0 295 -123.5 447.5t-365.5 152.5q-243 0 -369.5 -153.5 t-126.5 -446.5zM522 1731q0 52 26.5 75t63.5 23q38 0 65.5 -23t27.5 -75q0 -50 -27.5 -74.5t-65.5 -24.5q-37 0 -63.5 24.5t-26.5 74.5zM903 1731q0 52 26.5 75t63.5 23t64.5 -23t27.5 -75q0 -50 -27.5 -74.5t-64.5 -24.5t-63.5 24.5t-26.5 74.5z" />
<glyph unicode="&#xd7;" d="M940 1176l96 -99l-352 -354l350 -352l-96 -99l-354 351l-348 -351l-101 99l350 352l-352 352l100 101l353 -355z" />
<glyph unicode="&#xd8;" horiz-adv-x="1595" d="M1470 733q0 -351 -177.5 -552t-493.5 -201q-235 0 -383 100l-101 -141l-120 79l108 154q-178 198 -178 563q0 357 176 553.5t500 196.5q209 0 366 -94l97 135l120 -80l-106 -148q192 -202 192 -565zM1290 733q0 272 -110 426l-672 -948q115 -82 291 -82q243 0 367 153 t124 451zM305 733q0 -262 101 -416l669 943q-106 73 -274 73q-243 0 -369.5 -153.5t-126.5 -446.5z" />
<glyph unicode="&#xd9;" horiz-adv-x="1491" d="M186 0zM1305 1462v-946q0 -250 -151 -393t-415 -143t-408.5 144t-144.5 396v942h170v-954q0 -183 100 -281t294 -98q185 0 285 98.5t100 282.5v952h170zM856 1579h-110q-65 52 -154 148t-129 159v21h203q32 -69 89 -159.5t101 -143.5v-25z" />
<glyph unicode="&#xda;" horiz-adv-x="1491" d="M186 0zM1305 1462v-946q0 -250 -151 -393t-415 -143t-408.5 144t-144.5 396v942h170v-954q0 -183 100 -281t294 -98q185 0 285 98.5t100 282.5v952h170zM600 1604q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111v25z" />
<glyph unicode="&#xdb;" horiz-adv-x="1491" d="M186 0zM1305 1462v-946q0 -250 -151 -393t-415 -143t-408.5 144t-144.5 396v942h170v-954q0 -183 100 -281t294 -98q185 0 285 98.5t100 282.5v952h170zM393 1602q127 136 178 200t74 105h166q22 -42 76.5 -108.5t179.5 -196.5v-23h-119q-88 55 -221 186 q-136 -134 -219 -186h-115v23z" />
<glyph unicode="&#xdc;" horiz-adv-x="1491" d="M186 0zM1305 1462v-946q0 -250 -151 -393t-415 -143t-408.5 144t-144.5 396v942h170v-954q0 -183 100 -281t294 -98q185 0 285 98.5t100 282.5v952h170zM461 1731q0 52 26.5 75t63.5 23q38 0 65.5 -23t27.5 -75q0 -50 -27.5 -74.5t-65.5 -24.5q-37 0 -63.5 24.5 t-26.5 74.5zM842 1731q0 52 26.5 75t63.5 23t64.5 -23t27.5 -75q0 -50 -27.5 -74.5t-64.5 -24.5t-63.5 24.5t-26.5 74.5z" />
<glyph unicode="&#xdd;" horiz-adv-x="1147" d="M0 0zM573 731l390 731h184l-488 -895v-567h-172v559l-487 903h186zM442 1604q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111v25z" />
<glyph unicode="&#xde;" horiz-adv-x="1251" d="M1145 784q0 -227 -151.5 -346t-438.5 -119h-184v-319h-170v1462h170v-256h215q281 0 420 -103.5t139 -318.5zM371 465h168q226 0 327 71.5t101 235.5q0 149 -95 218t-297 69h-204v-594z" />
<glyph unicode="&#xdf;" horiz-adv-x="1274" d="M1049 1266q0 -135 -143 -250q-88 -70 -116 -103.5t-28 -66.5q0 -32 13.5 -53t49 -49.5t113.5 -79.5q140 -95 191 -173.5t51 -179.5q0 -160 -97 -245.5t-276 -85.5q-188 0 -295 69v154q63 -39 141 -62.5t150 -23.5q215 0 215 182q0 75 -41.5 128.5t-151.5 123.5 q-127 82 -175 143.5t-48 145.5q0 63 34.5 116t105.5 106q75 57 107 102t32 98q0 80 -68 122.5t-195 42.5q-276 0 -276 -223v-1204h-166v1202q0 178 110 271.5t332 93.5q206 0 318.5 -78.5t112.5 -222.5z" />
<glyph unicode="&#xe0;" horiz-adv-x="1139" d="M94 0zM850 0l-33 156h-8q-82 -103 -163.5 -139.5t-203.5 -36.5q-163 0 -255.5 84t-92.5 239q0 332 531 348l186 6v68q0 129 -55.5 190.5t-177.5 61.5q-137 0 -310 -84l-51 127q81 44 177.5 69t193.5 25q196 0 290.5 -87t94.5 -279v-748h-123zM475 117q155 0 243.5 85 t88.5 238v99l-166 -7q-198 -7 -285.5 -61.5t-87.5 -169.5q0 -90 54.5 -137t152.5 -47zM672 1241h-110q-65 52 -154 148t-129 159v21h203q32 -69 89 -159.5t101 -143.5v-25z" />
<glyph unicode="&#xe1;" horiz-adv-x="1139" d="M94 0zM850 0l-33 156h-8q-82 -103 -163.5 -139.5t-203.5 -36.5q-163 0 -255.5 84t-92.5 239q0 332 531 348l186 6v68q0 129 -55.5 190.5t-177.5 61.5q-137 0 -310 -84l-51 127q81 44 177.5 69t193.5 25q196 0 290.5 -87t94.5 -279v-748h-123zM475 117q155 0 243.5 85 t88.5 238v99l-166 -7q-198 -7 -285.5 -61.5t-87.5 -169.5q0 -90 54.5 -137t152.5 -47zM436 1266q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111v25z" />
<glyph unicode="&#xe2;" horiz-adv-x="1139" d="M94 0zM850 0l-33 156h-8q-82 -103 -163.5 -139.5t-203.5 -36.5q-163 0 -255.5 84t-92.5 239q0 332 531 348l186 6v68q0 129 -55.5 190.5t-177.5 61.5q-137 0 -310 -84l-51 127q81 44 177.5 69t193.5 25q196 0 290.5 -87t94.5 -279v-748h-123zM475 117q155 0 243.5 85 t88.5 238v99l-166 -7q-198 -7 -285.5 -61.5t-87.5 -169.5q0 -90 54.5 -137t152.5 -47zM228 1264q127 136 178 200t74 105h166q22 -42 76.5 -108.5t179.5 -196.5v-23h-119q-88 55 -221 186q-136 -134 -219 -186h-115v23z" />
<glyph unicode="&#xe3;" horiz-adv-x="1139" d="M94 0zM850 0l-33 156h-8q-82 -103 -163.5 -139.5t-203.5 -36.5q-163 0 -255.5 84t-92.5 239q0 332 531 348l186 6v68q0 129 -55.5 190.5t-177.5 61.5q-137 0 -310 -84l-51 127q81 44 177.5 69t193.5 25q196 0 290.5 -87t94.5 -279v-748h-123zM475 117q155 0 243.5 85 t88.5 238v99l-166 -7q-198 -7 -285.5 -61.5t-87.5 -169.5q0 -90 54.5 -137t152.5 -47zM721 1243q-43 0 -84 18.5t-80.5 41t-76 41t-70.5 18.5q-50 0 -75.5 -30t-39.5 -91h-98q13 121 70.5 189.5t148.5 68.5q46 0 89 -18.5t82 -41t75 -41t68 -18.5q49 0 73 29.5t39 91.5h99 q-13 -121 -69.5 -189.5t-150.5 -68.5z" />
<glyph unicode="&#xe4;" horiz-adv-x="1139" d="M94 0zM850 0l-33 156h-8q-82 -103 -163.5 -139.5t-203.5 -36.5q-163 0 -255.5 84t-92.5 239q0 332 531 348l186 6v68q0 129 -55.5 190.5t-177.5 61.5q-137 0 -310 -84l-51 127q81 44 177.5 69t193.5 25q196 0 290.5 -87t94.5 -279v-748h-123zM475 117q155 0 243.5 85 t88.5 238v99l-166 -7q-198 -7 -285.5 -61.5t-87.5 -169.5q0 -90 54.5 -137t152.5 -47zM279 1393q0 52 26.5 75t63.5 23q38 0 65.5 -23t27.5 -75q0 -50 -27.5 -74.5t-65.5 -24.5q-37 0 -63.5 24.5t-26.5 74.5zM660 1393q0 52 26.5 75t63.5 23t64.5 -23t27.5 -75 q0 -50 -27.5 -74.5t-64.5 -24.5t-63.5 24.5t-26.5 74.5z" />
<glyph unicode="&#xe5;" horiz-adv-x="1139" d="M94 0zM850 0l-33 156h-8q-82 -103 -163.5 -139.5t-203.5 -36.5q-163 0 -255.5 84t-92.5 239q0 332 531 348l186 6v68q0 129 -55.5 190.5t-177.5 61.5q-137 0 -310 -84l-51 127q81 44 177.5 69t193.5 25q196 0 290.5 -87t94.5 -279v-748h-123zM475 117q155 0 243.5 85 t88.5 238v99l-166 -7q-198 -7 -285.5 -61.5t-87.5 -169.5q0 -90 54.5 -137t152.5 -47zM804 1458q0 -98 -61.5 -157.5t-163.5 -59.5q-101 0 -161 58.5t-60 156.5t60.5 155.5t160.5 57.5q101 0 163 -59.5t62 -151.5zM696 1456q0 56 -33 86.5t-84 30.5t-84 -30.5t-33 -86.5 t30 -86.5t87 -30.5q52 0 84.5 30.5t32.5 86.5z" />
<glyph unicode="&#xe6;" horiz-adv-x="1757" d="M94 303q0 161 124 250.5t378 97.5l184 6v68q0 129 -58 190.5t-177 61.5q-144 0 -307 -84l-52 127q74 41 173.5 67.5t197.5 26.5q130 0 212.5 -43.5t123.5 -138.5q53 88 138.5 136t195.5 48q192 0 308 -133.5t116 -355.5v-107h-701q8 -395 322 -395q91 0 169.5 17.5 t162.5 56.5v-148q-86 -38 -160.5 -54.5t-175.5 -16.5q-289 0 -414 233q-81 -127 -179.5 -180t-232.5 -53q-163 0 -255.5 85t-92.5 238zM268 301q0 -95 53.5 -139.5t141.5 -44.5q145 0 229 84.5t84 238.5v99l-158 -7q-186 -8 -268 -62.5t-82 -168.5zM1225 977 q-121 0 -190.5 -83t-80.5 -241h519q0 156 -64 240t-184 84z" />
<glyph unicode="&#xe7;" horiz-adv-x="975" d="M115 0zM614 -20q-238 0 -368.5 146.5t-130.5 414.5q0 275 132.5 425t377.5 150q79 0 158 -17t124 -40l-51 -141q-55 22 -120 36.5t-115 14.5q-334 0 -334 -426q0 -202 81.5 -310t241.5 -108q137 0 281 59v-147q-110 -57 -277 -57zM762 -289q0 -97 -76.5 -150t-226.5 -53 q-51 0 -96 9v106q45 -8 104 -8q79 0 119.5 20t40.5 74q0 43 -39.5 69.5t-148.5 43.5l88 178h110l-55 -115q180 -39 180 -174z" />
<glyph unicode="&#xe8;" horiz-adv-x="1149" d="M115 0zM639 -20q-243 0 -383.5 148t-140.5 411q0 265 130.5 421t350.5 156q206 0 326 -135.5t120 -357.5v-105h-755q5 -193 97.5 -293t260.5 -100q177 0 350 74v-148q-88 -38 -166.5 -54.5t-189.5 -16.5zM594 977q-132 0 -210.5 -86t-92.5 -238h573q0 157 -70 240.5 t-200 83.5zM711 1241h-110q-65 52 -154 148t-129 159v21h203q32 -69 89 -159.5t101 -143.5v-25z" />
<glyph unicode="&#xe9;" horiz-adv-x="1149" d="M115 0zM639 -20q-243 0 -383.5 148t-140.5 411q0 265 130.5 421t350.5 156q206 0 326 -135.5t120 -357.5v-105h-755q5 -193 97.5 -293t260.5 -100q177 0 350 74v-148q-88 -38 -166.5 -54.5t-189.5 -16.5zM594 977q-132 0 -210.5 -86t-92.5 -238h573q0 157 -70 240.5 t-200 83.5zM471 1266q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111v25z" />
<glyph unicode="&#xea;" horiz-adv-x="1149" d="M115 0zM639 -20q-243 0 -383.5 148t-140.5 411q0 265 130.5 421t350.5 156q206 0 326 -135.5t120 -357.5v-105h-755q5 -193 97.5 -293t260.5 -100q177 0 350 74v-148q-88 -38 -166.5 -54.5t-189.5 -16.5zM594 977q-132 0 -210.5 -86t-92.5 -238h573q0 157 -70 240.5 t-200 83.5zM259 1264q127 136 178 200t74 105h166q22 -42 76.5 -108.5t179.5 -196.5v-23h-119q-88 55 -221 186q-136 -134 -219 -186h-115v23z" />
<glyph unicode="&#xeb;" horiz-adv-x="1149" d="M115 0zM639 -20q-243 0 -383.5 148t-140.5 411q0 265 130.5 421t350.5 156q206 0 326 -135.5t120 -357.5v-105h-755q5 -193 97.5 -293t260.5 -100q177 0 350 74v-148q-88 -38 -166.5 -54.5t-189.5 -16.5zM594 977q-132 0 -210.5 -86t-92.5 -238h573q0 157 -70 240.5 t-200 83.5zM319 1393q0 52 26.5 75t63.5 23q38 0 65.5 -23t27.5 -75q0 -50 -27.5 -74.5t-65.5 -24.5q-37 0 -63.5 24.5t-26.5 74.5zM700 1393q0 52 26.5 75t63.5 23t64.5 -23t27.5 -75q0 -50 -27.5 -74.5t-64.5 -24.5t-63.5 24.5t-26.5 74.5z" />
<glyph unicode="&#xec;" horiz-adv-x="518" d="M0 0zM342 0h-166v1096h166v-1096zM355 1241h-110q-65 52 -154 148t-129 159v21h203q32 -69 89 -159.5t101 -143.5v-25z" />
<glyph unicode="&#xed;" horiz-adv-x="518" d="M169 0zM342 0h-166v1096h166v-1096zM169 1266q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111v25z" />
<glyph unicode="&#xee;" horiz-adv-x="518" d="M0 0zM342 0h-166v1096h166v-1096zM-77 1264q127 136 178 200t74 105h166q22 -42 76.5 -108.5t179.5 -196.5v-23h-119q-88 55 -221 186q-136 -134 -219 -186h-115v23z" />
<glyph unicode="&#xef;" horiz-adv-x="518" d="M0 0zM342 0h-166v1096h166v-1096zM-20 1393q0 52 26.5 75t63.5 23q38 0 65.5 -23t27.5 -75q0 -50 -27.5 -74.5t-65.5 -24.5q-37 0 -63.5 24.5t-26.5 74.5zM361 1393q0 52 26.5 75t63.5 23t64.5 -23t27.5 -75q0 -50 -27.5 -74.5t-64.5 -24.5t-63.5 24.5t-26.5 74.5z" />
<glyph unicode="&#xf0;" horiz-adv-x="1221" d="M1122 563q0 -281 -130.5 -432t-377.5 -151q-222 0 -361.5 134.5t-139.5 360.5q0 230 131.5 361t351.5 131q226 0 326 -121l8 4q-57 214 -262 405l-271 -155l-73 108l233 133q-92 62 -186 111l69 117q156 -73 258 -148l238 138l76 -107l-207 -119q152 -143 234.5 -342 t82.5 -428zM954 512q0 147 -90 232t-246 85q-337 0 -337 -360q0 -167 87.5 -258.5t249.5 -91.5q175 0 255.5 100.5t80.5 292.5z" />
<glyph unicode="&#xf1;" horiz-adv-x="1257" d="M176 0zM926 0v709q0 134 -61 200t-191 66q-172 0 -252 -93t-80 -307v-575h-166v1096h135l27 -150h8q51 81 143 125.5t205 44.5q198 0 298 -95.5t100 -305.5v-715h-166zM802 1243q-43 0 -84 18.5t-80.5 41t-76 41t-70.5 18.5q-50 0 -75.5 -30t-39.5 -91h-98 q13 121 70.5 189.5t148.5 68.5q46 0 89 -18.5t82 -41t75 -41t68 -18.5q49 0 73 29.5t39 91.5h99q-13 -121 -69.5 -189.5t-150.5 -68.5z" />
<glyph unicode="&#xf2;" horiz-adv-x="1237" d="M115 0zM1122 549q0 -268 -135 -418.5t-373 -150.5q-147 0 -261 69t-176 198t-62 302q0 268 134 417.5t372 149.5q230 0 365.5 -153t135.5 -414zM287 549q0 -210 84 -320t247 -110t247.5 109.5t84.5 320.5q0 209 -84.5 317.5t-249.5 108.5q-163 0 -246 -107t-83 -319z M742 1241h-110q-65 52 -154 148t-129 159v21h203q32 -69 89 -159.5t101 -143.5v-25z" />
<glyph unicode="&#xf3;" horiz-adv-x="1237" d="M115 0zM1122 549q0 -268 -135 -418.5t-373 -150.5q-147 0 -261 69t-176 198t-62 302q0 268 134 417.5t372 149.5q230 0 365.5 -153t135.5 -414zM287 549q0 -210 84 -320t247 -110t247.5 109.5t84.5 320.5q0 209 -84.5 317.5t-249.5 108.5q-163 0 -246 -107t-83 -319z M479 1266q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111v25z" />
<glyph unicode="&#xf4;" horiz-adv-x="1237" d="M115 0zM1122 549q0 -268 -135 -418.5t-373 -150.5q-147 0 -261 69t-176 198t-62 302q0 268 134 417.5t372 149.5q230 0 365.5 -153t135.5 -414zM287 549q0 -210 84 -320t247 -110t247.5 109.5t84.5 320.5q0 209 -84.5 317.5t-249.5 108.5q-163 0 -246 -107t-83 -319z M282 1264q127 136 178 200t74 105h166q22 -42 76.5 -108.5t179.5 -196.5v-23h-119q-88 55 -221 186q-136 -134 -219 -186h-115v23z" />
<glyph unicode="&#xf5;" horiz-adv-x="1237" d="M115 0zM1122 549q0 -268 -135 -418.5t-373 -150.5q-147 0 -261 69t-176 198t-62 302q0 268 134 417.5t372 149.5q230 0 365.5 -153t135.5 -414zM287 549q0 -210 84 -320t247 -110t247.5 109.5t84.5 320.5q0 209 -84.5 317.5t-249.5 108.5q-163 0 -246 -107t-83 -319z M773 1243q-43 0 -84 18.5t-80.5 41t-76 41t-70.5 18.5q-50 0 -75.5 -30t-39.5 -91h-98q13 121 70.5 189.5t148.5 68.5q46 0 89 -18.5t82 -41t75 -41t68 -18.5q49 0 73 29.5t39 91.5h99q-13 -121 -69.5 -189.5t-150.5 -68.5z" />
<glyph unicode="&#xf6;" horiz-adv-x="1237" d="M115 0zM1122 549q0 -268 -135 -418.5t-373 -150.5q-147 0 -261 69t-176 198t-62 302q0 268 134 417.5t372 149.5q230 0 365.5 -153t135.5 -414zM287 549q0 -210 84 -320t247 -110t247.5 109.5t84.5 320.5q0 209 -84.5 317.5t-249.5 108.5q-163 0 -246 -107t-83 -319z M336 1393q0 52 26.5 75t63.5 23q38 0 65.5 -23t27.5 -75q0 -50 -27.5 -74.5t-65.5 -24.5q-37 0 -63.5 24.5t-26.5 74.5zM717 1393q0 52 26.5 75t63.5 23t64.5 -23t27.5 -75q0 -50 -27.5 -74.5t-64.5 -24.5t-63.5 24.5t-26.5 74.5z" />
<glyph unicode="&#xf7;" d="M104 653v138h961v-138h-961zM471 373q0 60 29.5 90.5t83.5 30.5q52 0 81 -31.5t29 -89.5q0 -57 -29.5 -89t-80.5 -32q-52 0 -82.5 31.5t-30.5 89.5zM471 1071q0 60 29.5 90.5t83.5 30.5q52 0 81 -31.5t29 -89.5q0 -57 -29.5 -89t-80.5 -32q-52 0 -82.5 31.5t-30.5 89.5z " />
<glyph unicode="&#xf8;" horiz-adv-x="1237" d="M1122 549q0 -268 -135 -418.5t-373 -150.5q-154 0 -266 69l-84 -117l-114 78l94 131q-129 152 -129 408q0 268 134 417.5t372 149.5q154 0 270 -76l84 119l117 -76l-97 -133q127 -152 127 -401zM287 549q0 -171 53 -273l465 646q-75 53 -189 53q-163 0 -246 -107 t-83 -319zM950 549q0 164 -51 264l-465 -643q71 -51 184 -51q163 0 247.5 109.5t84.5 320.5z" />
<glyph unicode="&#xf9;" horiz-adv-x="1257" d="M164 0zM332 1096v-711q0 -134 61 -200t191 -66q172 0 251.5 94t79.5 307v576h166v-1096h-137l-24 147h-9q-51 -81 -141.5 -124t-206.5 -43q-200 0 -299.5 95t-99.5 304v717h168zM726 1241h-110q-65 52 -154 148t-129 159v21h203q32 -69 89 -159.5t101 -143.5v-25z" />
<glyph unicode="&#xfa;" horiz-adv-x="1257" d="M164 0zM332 1096v-711q0 -134 61 -200t191 -66q172 0 251.5 94t79.5 307v576h166v-1096h-137l-24 147h-9q-51 -81 -141.5 -124t-206.5 -43q-200 0 -299.5 95t-99.5 304v717h168zM506 1266q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111v25z" />
<glyph unicode="&#xfb;" horiz-adv-x="1257" d="M164 0zM332 1096v-711q0 -134 61 -200t191 -66q172 0 251.5 94t79.5 307v576h166v-1096h-137l-24 147h-9q-51 -81 -141.5 -124t-206.5 -43q-200 0 -299.5 95t-99.5 304v717h168zM286 1264q127 136 178 200t74 105h166q22 -42 76.5 -108.5t179.5 -196.5v-23h-119 q-88 55 -221 186q-136 -134 -219 -186h-115v23z" />
<glyph unicode="&#xfc;" horiz-adv-x="1257" d="M164 0zM332 1096v-711q0 -134 61 -200t191 -66q172 0 251.5 94t79.5 307v576h166v-1096h-137l-24 147h-9q-51 -81 -141.5 -124t-206.5 -43q-200 0 -299.5 95t-99.5 304v717h168zM342 1393q0 52 26.5 75t63.5 23q38 0 65.5 -23t27.5 -75q0 -50 -27.5 -74.5t-65.5 -24.5 q-37 0 -63.5 24.5t-26.5 74.5zM723 1393q0 52 26.5 75t63.5 23t64.5 -23t27.5 -75q0 -50 -27.5 -74.5t-64.5 -24.5t-63.5 24.5t-26.5 74.5z" />
<glyph unicode="&#xfd;" horiz-adv-x="1032" d="M2 0zM2 1096h178l240 -625q79 -214 98 -309h8q13 51 54.5 174.5t271.5 759.5h178l-471 -1248q-70 -185 -163.5 -262.5t-229.5 -77.5q-76 0 -150 17v133q55 -12 123 -12q171 0 244 192l61 156zM411 1266q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147 h-111v25z" />
<glyph unicode="&#xfe;" horiz-adv-x="1255" d="M344 948q66 89 151 128.5t191 39.5q215 0 335 -150t120 -417q0 -268 -120.5 -418.5t-334.5 -150.5q-222 0 -344 161h-12l4 -34q8 -77 8 -140v-459h-166v2048h166v-466q0 -52 -6 -142h8zM664 975q-168 0 -244 -92t-78 -293v-41q0 -231 77 -330.5t247 -99.5q303 0 303 432 q0 215 -74 319.5t-231 104.5z" />
<glyph unicode="&#xff;" horiz-adv-x="1032" d="M2 0zM2 1096h178l240 -625q79 -214 98 -309h8q13 51 54.5 174.5t271.5 759.5h178l-471 -1248q-70 -185 -163.5 -262.5t-229.5 -77.5q-76 0 -150 17v133q55 -12 123 -12q171 0 244 192l61 156zM234 1393q0 52 26.5 75t63.5 23q38 0 65.5 -23t27.5 -75q0 -50 -27.5 -74.5 t-65.5 -24.5q-37 0 -63.5 24.5t-26.5 74.5zM615 1393q0 52 26.5 75t63.5 23t64.5 -23t27.5 -75q0 -50 -27.5 -74.5t-64.5 -24.5t-63.5 24.5t-26.5 74.5z" />
<glyph unicode="&#x131;" horiz-adv-x="518" d="M342 0h-166v1096h166v-1096z" />
<glyph unicode="&#x152;" horiz-adv-x="1890" d="M1767 0h-768q-102 -20 -194 -20q-327 0 -503.5 196.5t-176.5 558.5q0 360 174 555t494 195q102 0 192 -23h782v-151h-589v-471h551v-150h-551v-538h589v-152zM811 1333q-249 0 -377.5 -152.5t-128.5 -447.5q0 -297 128.5 -450.5t375.5 -153.5q112 0 199 33v1141 q-87 30 -197 30z" />
<glyph unicode="&#x153;" horiz-adv-x="1929" d="M1430 -20q-293 0 -418 235q-62 -116 -166.5 -175.5t-241.5 -59.5q-223 0 -357 152.5t-134 416.5q0 265 131 415t366 150q131 0 233.5 -59.5t164.5 -173.5q58 112 154 172.5t222 60.5q201 0 320 -132.5t119 -358.5v-105h-729q8 -393 338 -393q94 0 174.5 17.5t167.5 56.5 v-148q-88 -39 -164 -55t-180 -16zM287 549q0 -211 76 -320.5t243 -109.5q163 0 239.5 106.5t76.5 315.5q0 221 -77.5 327.5t-242.5 106.5q-166 0 -240.5 -108t-74.5 -318zM1382 975q-127 0 -199.5 -82t-84.5 -240h544q0 158 -66 240t-194 82z" />
<glyph unicode="&#x178;" horiz-adv-x="1147" d="M0 0zM573 731l390 731h184l-488 -895v-567h-172v559l-487 903h186zM294 1731q0 52 26.5 75t63.5 23q38 0 65.5 -23t27.5 -75q0 -50 -27.5 -74.5t-65.5 -24.5q-37 0 -63.5 24.5t-26.5 74.5zM675 1731q0 52 26.5 75t63.5 23t64.5 -23t27.5 -75q0 -50 -27.5 -74.5 t-64.5 -24.5t-63.5 24.5t-26.5 74.5z" />
<glyph unicode="&#x2c6;" horiz-adv-x="1212" d="M268 1264q127 136 178 200t74 105h166q22 -42 76.5 -108.5t179.5 -196.5v-23h-119q-88 55 -221 186q-136 -134 -219 -186h-115v23z" />
<glyph unicode="&#x2da;" horiz-adv-x="1182" d="M813 1458q0 -98 -61.5 -157.5t-163.5 -59.5q-101 0 -161 58.5t-60 156.5t60.5 155.5t160.5 57.5q101 0 163 -59.5t62 -151.5zM705 1456q0 56 -33 86.5t-84 30.5t-84 -30.5t-33 -86.5t30 -86.5t87 -30.5q52 0 84.5 30.5t32.5 86.5z" />
<glyph unicode="&#x2dc;" horiz-adv-x="1212" d="M788 1243q-43 0 -84 18.5t-80.5 41t-76 41t-70.5 18.5q-50 0 -75.5 -30t-39.5 -91h-98q13 121 70.5 189.5t148.5 68.5q46 0 89 -18.5t82 -41t75 -41t68 -18.5q49 0 73 29.5t39 91.5h99q-13 -121 -69.5 -189.5t-150.5 -68.5z" />
<glyph unicode="&#x2000;" horiz-adv-x="953" />
<glyph unicode="&#x2001;" horiz-adv-x="1907" />
<glyph unicode="&#x2002;" horiz-adv-x="953" />
<glyph unicode="&#x2003;" horiz-adv-x="1907" />
<glyph unicode="&#x2004;" horiz-adv-x="635" />
<glyph unicode="&#x2005;" horiz-adv-x="476" />
<glyph unicode="&#x2006;" horiz-adv-x="317" />
<glyph unicode="&#x2007;" horiz-adv-x="317" />
<glyph unicode="&#x2008;" horiz-adv-x="238" />
<glyph unicode="&#x2009;" horiz-adv-x="381" />
<glyph unicode="&#x200a;" horiz-adv-x="105" />
<glyph unicode="&#x2010;" horiz-adv-x="659" d="M84 473v152h491v-152h-491z" />
<glyph unicode="&#x2011;" horiz-adv-x="659" d="M84 473v152h491v-152h-491z" />
<glyph unicode="&#x2012;" horiz-adv-x="659" d="M84 473v152h491v-152h-491z" />
<glyph unicode="&#x2013;" horiz-adv-x="1024" d="M82 473v152h860v-152h-860z" />
<glyph unicode="&#x2014;" horiz-adv-x="2048" d="M82 473v152h1884v-152h-1884z" />
<glyph unicode="&#x2018;" horiz-adv-x="348" d="M37 961l-12 22q22 90 71 224t105 255h123q-66 -254 -103 -501h-184z" />
<glyph unicode="&#x2019;" horiz-adv-x="348" d="M309 1462l15 -22q-26 -100 -75 -232.5t-102 -246.5h-122q70 285 102 501h182z" />
<glyph unicode="&#x201a;" horiz-adv-x="502" d="M63 0zM350 238l15 -23q-26 -100 -75 -232.5t-102 -246.5h-125q27 104 59.5 257t45.5 245h182z" />
<glyph unicode="&#x201c;" horiz-adv-x="717" d="M406 961l-15 22q56 215 178 479h123q-30 -115 -59.5 -259.5t-42.5 -241.5h-184zM37 961l-12 22q22 90 71 224t105 255h123q-66 -254 -103 -501h-184z" />
<glyph unicode="&#x201d;" horiz-adv-x="717" d="M309 1462l15 -22q-26 -100 -75 -232.5t-102 -246.5h-122q70 285 102 501h182zM678 1462l14 -22q-24 -91 -72 -224t-104 -255h-125q26 100 59 254t46 247h182z" />
<glyph unicode="&#x201e;" horiz-adv-x="829" d="M25 0zM309 238l15 -22q-26 -100 -75 -232.5t-102 -246.5h-122q70 285 102 501h182zM678 238l14 -22q-24 -91 -72 -224t-104 -255h-125q26 100 59 254t46 247h182z" />
<glyph unicode="&#x2022;" horiz-adv-x="770" d="M164 748q0 121 56.5 184t164.5 63q105 0 163 -62t58 -185q0 -119 -57.5 -183.5t-163.5 -64.5q-107 0 -164 65.5t-57 182.5z" />
<glyph unicode="&#x2026;" horiz-adv-x="1606" d="M152 0zM152 106q0 67 30.5 101.5t87.5 34.5q58 0 90.5 -34.5t32.5 -101.5q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5zM682 106q0 67 30.5 101.5t87.5 34.5q58 0 90.5 -34.5t32.5 -101.5q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5zM1213 106 q0 67 30.5 101.5t87.5 34.5q58 0 90.5 -34.5t32.5 -101.5q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5z" />
<glyph unicode="&#x202f;" horiz-adv-x="381" />
<glyph unicode="&#x2039;" horiz-adv-x="623" d="M82 551l342 407l119 -69l-289 -350l289 -351l-119 -71l-342 407v27z" />
<glyph unicode="&#x203a;" horiz-adv-x="623" d="M541 524l-344 -407l-117 71l287 351l-287 350l117 69l344 -407v-27z" />
<glyph unicode="&#x2044;" horiz-adv-x="266" d="M655 1462l-903 -1462h-143l903 1462h143z" />
<glyph unicode="&#x205f;" horiz-adv-x="476" />
<glyph unicode="&#x2074;" horiz-adv-x="711" d="M692 788h-125v-202h-145v202h-402v101l408 579h139v-563h125v-117zM422 905v195q0 134 6 209q-5 -12 -17 -31.5t-27 -42l-30 -45t-26 -39.5l-168 -246h262z" />
<glyph unicode="&#x20ac;" horiz-adv-x="1208" d="M795 1333q-319 0 -398 -403h510v-129h-524l-2 -57v-64l2 -45h463v-129h-447q37 -180 138.5 -278.5t271.5 -98.5q156 0 309 66v-150q-146 -65 -317 -65q-237 0 -381.5 134.5t-190.5 391.5h-166v129h152l-2 42v44l2 80h-152v129h164q39 261 185 407t383 146q201 0 366 -97 l-71 -139q-166 86 -295 86z" />
<glyph unicode="&#x2122;" horiz-adv-x="1589" d="M369 741h-123v615h-209v106h543v-106h-211v-615zM969 741l-201 559h-8l6 -129v-430h-119v721h187l196 -559l203 559h180v-721h-127v420l6 137h-8l-211 -557h-104z" />
<glyph unicode="&#x2212;" d="M104 653v138h961v-138h-961z" />
<glyph unicode="&#xe000;" horiz-adv-x="1095" d="M0 1095h1095v-1095h-1095v1095z" />
<glyph horiz-adv-x="1255" d="M0 0z" />
<hkern u1="&#x22;" u2="&#x178;" k="-20" />
<hkern u1="&#x22;" u2="&#x153;" k="123" />
<hkern u1="&#x22;" u2="&#xfc;" k="61" />
<hkern u1="&#x22;" u2="&#xfb;" k="61" />
<hkern u1="&#x22;" u2="&#xfa;" k="61" />
<hkern u1="&#x22;" u2="&#xf9;" k="61" />
<hkern u1="&#x22;" u2="&#xf8;" k="123" />
<hkern u1="&#x22;" u2="&#xf6;" k="123" />
<hkern u1="&#x22;" u2="&#xf5;" k="123" />
<hkern u1="&#x22;" u2="&#xf4;" k="123" />
<hkern u1="&#x22;" u2="&#xf3;" k="123" />
<hkern u1="&#x22;" u2="&#xf2;" k="123" />
<hkern u1="&#x22;" u2="&#xeb;" k="123" />
<hkern u1="&#x22;" u2="&#xea;" k="123" />
<hkern u1="&#x22;" u2="&#xe9;" k="123" />
<hkern u1="&#x22;" u2="&#xe8;" k="123" />
<hkern u1="&#x22;" u2="&#xe7;" k="123" />
<hkern u1="&#x22;" u2="&#xe6;" k="82" />
<hkern u1="&#x22;" u2="&#xe5;" k="82" />
<hkern u1="&#x22;" u2="&#xe4;" k="82" />
<hkern u1="&#x22;" u2="&#xe3;" k="82" />
<hkern u1="&#x22;" u2="&#xe2;" k="82" />
<hkern u1="&#x22;" u2="&#xe1;" k="82" />
<hkern u1="&#x22;" u2="&#xe0;" k="123" />
<hkern u1="&#x22;" u2="&#xdd;" k="-20" />
<hkern u1="&#x22;" u2="&#xc5;" k="143" />
<hkern u1="&#x22;" u2="&#xc4;" k="143" />
<hkern u1="&#x22;" u2="&#xc3;" k="143" />
<hkern u1="&#x22;" u2="&#xc2;" k="143" />
<hkern u1="&#x22;" u2="&#xc1;" k="143" />
<hkern u1="&#x22;" u2="&#xc0;" k="143" />
<hkern u1="&#x22;" u2="u" k="61" />
<hkern u1="&#x22;" u2="s" k="61" />
<hkern u1="&#x22;" u2="r" k="61" />
<hkern u1="&#x22;" u2="q" k="123" />
<hkern u1="&#x22;" u2="p" k="61" />
<hkern u1="&#x22;" u2="o" k="123" />
<hkern u1="&#x22;" u2="n" k="61" />
<hkern u1="&#x22;" u2="m" k="61" />
<hkern u1="&#x22;" u2="g" k="61" />
<hkern u1="&#x22;" u2="e" k="123" />
<hkern u1="&#x22;" u2="d" k="123" />
<hkern u1="&#x22;" u2="c" k="123" />
<hkern u1="&#x22;" u2="a" k="82" />
<hkern u1="&#x22;" u2="Y" k="-20" />
<hkern u1="&#x22;" u2="W" k="-41" />
<hkern u1="&#x22;" u2="V" k="-41" />
<hkern u1="&#x22;" u2="T" k="-41" />
<hkern u1="&#x22;" u2="A" k="143" />
<hkern u1="&#x27;" u2="&#x178;" k="-20" />
<hkern u1="&#x27;" u2="&#x153;" k="123" />
<hkern u1="&#x27;" u2="&#xfc;" k="61" />
<hkern u1="&#x27;" u2="&#xfb;" k="61" />
<hkern u1="&#x27;" u2="&#xfa;" k="61" />
<hkern u1="&#x27;" u2="&#xf9;" k="61" />
<hkern u1="&#x27;" u2="&#xf8;" k="123" />
<hkern u1="&#x27;" u2="&#xf6;" k="123" />
<hkern u1="&#x27;" u2="&#xf5;" k="123" />
<hkern u1="&#x27;" u2="&#xf4;" k="123" />
<hkern u1="&#x27;" u2="&#xf3;" k="123" />
<hkern u1="&#x27;" u2="&#xf2;" k="123" />
<hkern u1="&#x27;" u2="&#xeb;" k="123" />
<hkern u1="&#x27;" u2="&#xea;" k="123" />
<hkern u1="&#x27;" u2="&#xe9;" k="123" />
<hkern u1="&#x27;" u2="&#xe8;" k="123" />
<hkern u1="&#x27;" u2="&#xe7;" k="123" />
<hkern u1="&#x27;" u2="&#xe6;" k="82" />
<hkern u1="&#x27;" u2="&#xe5;" k="82" />
<hkern u1="&#x27;" u2="&#xe4;" k="82" />
<hkern u1="&#x27;" u2="&#xe3;" k="82" />
<hkern u1="&#x27;" u2="&#xe2;" k="82" />
<hkern u1="&#x27;" u2="&#xe1;" k="82" />
<hkern u1="&#x27;" u2="&#xe0;" k="123" />
<hkern u1="&#x27;" u2="&#xdd;" k="-20" />
<hkern u1="&#x27;" u2="&#xc5;" k="143" />
<hkern u1="&#x27;" u2="&#xc4;" k="143" />
<hkern u1="&#x27;" u2="&#xc3;" k="143" />
<hkern u1="&#x27;" u2="&#xc2;" k="143" />
<hkern u1="&#x27;" u2="&#xc1;" k="143" />
<hkern u1="&#x27;" u2="&#xc0;" k="143" />
<hkern u1="&#x27;" u2="u" k="61" />
<hkern u1="&#x27;" u2="s" k="61" />
<hkern u1="&#x27;" u2="r" k="61" />
<hkern u1="&#x27;" u2="q" k="123" />
<hkern u1="&#x27;" u2="p" k="61" />
<hkern u1="&#x27;" u2="o" k="123" />
<hkern u1="&#x27;" u2="n" k="61" />
<hkern u1="&#x27;" u2="m" k="61" />
<hkern u1="&#x27;" u2="g" k="61" />
<hkern u1="&#x27;" u2="e" k="123" />
<hkern u1="&#x27;" u2="d" k="123" />
<hkern u1="&#x27;" u2="c" k="123" />
<hkern u1="&#x27;" u2="a" k="82" />
<hkern u1="&#x27;" u2="Y" k="-20" />
<hkern u1="&#x27;" u2="W" k="-41" />
<hkern u1="&#x27;" u2="V" k="-41" />
<hkern u1="&#x27;" u2="T" k="-41" />
<hkern u1="&#x27;" u2="A" k="143" />
<hkern u1="&#x28;" u2="J" k="-184" />
<hkern u1="&#x2c;" u2="&#x178;" k="123" />
<hkern u1="&#x2c;" u2="&#x152;" k="102" />
<hkern u1="&#x2c;" u2="&#xdd;" k="123" />
<hkern u1="&#x2c;" u2="&#xdc;" k="41" />
<hkern u1="&#x2c;" u2="&#xdb;" k="41" />
<hkern u1="&#x2c;" u2="&#xda;" k="41" />
<hkern u1="&#x2c;" u2="&#xd9;" k="41" />
<hkern u1="&#x2c;" u2="&#xd8;" k="102" />
<hkern u1="&#x2c;" u2="&#xd6;" k="102" />
<hkern u1="&#x2c;" u2="&#xd5;" k="102" />
<hkern u1="&#x2c;" u2="&#xd4;" k="102" />
<hkern u1="&#x2c;" u2="&#xd3;" k="102" />
<hkern u1="&#x2c;" u2="&#xd2;" k="102" />
<hkern u1="&#x2c;" u2="&#xc7;" k="102" />
<hkern u1="&#x2c;" u2="Y" k="123" />
<hkern u1="&#x2c;" u2="W" k="123" />
<hkern u1="&#x2c;" u2="V" k="123" />
<hkern u1="&#x2c;" u2="U" k="41" />
<hkern u1="&#x2c;" u2="T" k="143" />
<hkern u1="&#x2c;" u2="Q" k="102" />
<hkern u1="&#x2c;" u2="O" k="102" />
<hkern u1="&#x2c;" u2="G" k="102" />
<hkern u1="&#x2c;" u2="C" k="102" />
<hkern u1="&#x2d;" u2="T" k="82" />
<hkern u1="&#x2e;" u2="&#x178;" k="123" />
<hkern u1="&#x2e;" u2="&#x152;" k="102" />
<hkern u1="&#x2e;" u2="&#xdd;" k="123" />
<hkern u1="&#x2e;" u2="&#xdc;" k="41" />
<hkern u1="&#x2e;" u2="&#xdb;" k="41" />
<hkern u1="&#x2e;" u2="&#xda;" k="41" />
<hkern u1="&#x2e;" u2="&#xd9;" k="41" />
<hkern u1="&#x2e;" u2="&#xd8;" k="102" />
<hkern u1="&#x2e;" u2="&#xd6;" k="102" />
<hkern u1="&#x2e;" u2="&#xd5;" k="102" />
<hkern u1="&#x2e;" u2="&#xd4;" k="102" />
<hkern u1="&#x2e;" u2="&#xd3;" k="102" />
<hkern u1="&#x2e;" u2="&#xd2;" k="102" />
<hkern u1="&#x2e;" u2="&#xc7;" k="102" />
<hkern u1="&#x2e;" u2="Y" k="123" />
<hkern u1="&#x2e;" u2="W" k="123" />
<hkern u1="&#x2e;" u2="V" k="123" />
<hkern u1="&#x2e;" u2="U" k="41" />
<hkern u1="&#x2e;" u2="T" k="143" />
<hkern u1="&#x2e;" u2="Q" k="102" />
<hkern u1="&#x2e;" u2="O" k="102" />
<hkern u1="&#x2e;" u2="G" k="102" />
<hkern u1="&#x2e;" u2="C" k="102" />
<hkern u1="A" u2="&#x201d;" k="143" />
<hkern u1="A" u2="&#x2019;" k="143" />
<hkern u1="A" u2="&#x178;" k="123" />
<hkern u1="A" u2="&#x152;" k="41" />
<hkern u1="A" u2="&#xdd;" k="123" />
<hkern u1="A" u2="&#xd8;" k="41" />
<hkern u1="A" u2="&#xd6;" k="41" />
<hkern u1="A" u2="&#xd5;" k="41" />
<hkern u1="A" u2="&#xd4;" k="41" />
<hkern u1="A" u2="&#xd3;" k="41" />
<hkern u1="A" u2="&#xd2;" k="41" />
<hkern u1="A" u2="&#xc7;" k="41" />
<hkern u1="A" u2="Y" k="123" />
<hkern u1="A" u2="W" k="82" />
<hkern u1="A" u2="V" k="82" />
<hkern u1="A" u2="T" k="143" />
<hkern u1="A" u2="Q" k="41" />
<hkern u1="A" u2="O" k="41" />
<hkern u1="A" u2="J" k="-266" />
<hkern u1="A" u2="G" k="41" />
<hkern u1="A" u2="C" k="41" />
<hkern u1="A" u2="&#x27;" k="143" />
<hkern u1="A" u2="&#x22;" k="143" />
<hkern u1="B" u2="&#x201e;" k="82" />
<hkern u1="B" u2="&#x201a;" k="82" />
<hkern u1="B" u2="&#x178;" k="20" />
<hkern u1="B" u2="&#xdd;" k="20" />
<hkern u1="B" u2="&#xc5;" k="41" />
<hkern u1="B" u2="&#xc4;" k="41" />
<hkern u1="B" u2="&#xc3;" k="41" />
<hkern u1="B" u2="&#xc2;" k="41" />
<hkern u1="B" u2="&#xc1;" k="41" />
<hkern u1="B" u2="&#xc0;" k="41" />
<hkern u1="B" u2="Z" k="20" />
<hkern u1="B" u2="Y" k="20" />
<hkern u1="B" u2="X" k="41" />
<hkern u1="B" u2="W" k="20" />
<hkern u1="B" u2="V" k="20" />
<hkern u1="B" u2="T" k="61" />
<hkern u1="B" u2="A" k="41" />
<hkern u1="B" u2="&#x2e;" k="82" />
<hkern u1="B" u2="&#x2c;" k="82" />
<hkern u1="C" u2="&#x152;" k="41" />
<hkern u1="C" u2="&#xd8;" k="41" />
<hkern u1="C" u2="&#xd6;" k="41" />
<hkern u1="C" u2="&#xd5;" k="41" />
<hkern u1="C" u2="&#xd4;" k="41" />
<hkern u1="C" u2="&#xd3;" k="41" />
<hkern u1="C" u2="&#xd2;" k="41" />
<hkern u1="C" u2="&#xc7;" k="41" />
<hkern u1="C" u2="Q" k="41" />
<hkern u1="C" u2="O" k="41" />
<hkern u1="C" u2="G" k="41" />
<hkern u1="C" u2="C" k="41" />
<hkern u1="D" u2="&#x201e;" k="82" />
<hkern u1="D" u2="&#x201a;" k="82" />
<hkern u1="D" u2="&#x178;" k="20" />
<hkern u1="D" u2="&#xdd;" k="20" />
<hkern u1="D" u2="&#xc5;" k="41" />
<hkern u1="D" u2="&#xc4;" k="41" />
<hkern u1="D" u2="&#xc3;" k="41" />
<hkern u1="D" u2="&#xc2;" k="41" />
<hkern u1="D" u2="&#xc1;" k="41" />
<hkern u1="D" u2="&#xc0;" k="41" />
<hkern u1="D" u2="Z" k="20" />
<hkern u1="D" u2="Y" k="20" />
<hkern u1="D" u2="X" k="41" />
<hkern u1="D" u2="W" k="20" />
<hkern u1="D" u2="V" k="20" />
<hkern u1="D" u2="T" k="61" />
<hkern u1="D" u2="A" k="41" />
<hkern u1="D" u2="&#x2e;" k="82" />
<hkern u1="D" u2="&#x2c;" k="82" />
<hkern u1="E" u2="J" k="-123" />
<hkern u1="F" u2="&#x201e;" k="123" />
<hkern u1="F" u2="&#x201a;" k="123" />
<hkern u1="F" u2="&#xc5;" k="41" />
<hkern u1="F" u2="&#xc4;" k="41" />
<hkern u1="F" u2="&#xc3;" k="41" />
<hkern u1="F" u2="&#xc2;" k="41" />
<hkern u1="F" u2="&#xc1;" k="41" />
<hkern u1="F" u2="&#xc0;" k="41" />
<hkern u1="F" u2="A" k="41" />
<hkern u1="F" u2="&#x3f;" k="-41" />
<hkern u1="F" u2="&#x2e;" k="123" />
<hkern u1="F" u2="&#x2c;" k="123" />
<hkern u1="K" u2="&#x152;" k="41" />
<hkern u1="K" u2="&#xd8;" k="41" />
<hkern u1="K" u2="&#xd6;" k="41" />
<hkern u1="K" u2="&#xd5;" k="41" />
<hkern u1="K" u2="&#xd4;" k="41" />
<hkern u1="K" u2="&#xd3;" k="41" />
<hkern u1="K" u2="&#xd2;" k="41" />
<hkern u1="K" u2="&#xc7;" k="41" />
<hkern u1="K" u2="Q" k="41" />
<hkern u1="K" u2="O" k="41" />
<hkern u1="K" u2="G" k="41" />
<hkern u1="K" u2="C" k="41" />
<hkern u1="L" u2="&#x201d;" k="164" />
<hkern u1="L" u2="&#x2019;" k="164" />
<hkern u1="L" u2="&#x178;" k="61" />
<hkern u1="L" u2="&#x152;" k="41" />
<hkern u1="L" u2="&#xdd;" k="61" />
<hkern u1="L" u2="&#xdc;" k="20" />
<hkern u1="L" u2="&#xdb;" k="20" />
<hkern u1="L" u2="&#xda;" k="20" />
<hkern u1="L" u2="&#xd9;" k="20" />
<hkern u1="L" u2="&#xd8;" k="41" />
<hkern u1="L" u2="&#xd6;" k="41" />
<hkern u1="L" u2="&#xd5;" k="41" />
<hkern u1="L" u2="&#xd4;" k="41" />
<hkern u1="L" u2="&#xd3;" k="41" />
<hkern u1="L" u2="&#xd2;" k="41" />
<hkern u1="L" u2="&#xc7;" k="41" />
<hkern u1="L" u2="Y" k="61" />
<hkern u1="L" u2="W" k="41" />
<hkern u1="L" u2="V" k="41" />
<hkern u1="L" u2="U" k="20" />
<hkern u1="L" u2="T" k="41" />
<hkern u1="L" u2="Q" k="41" />
<hkern u1="L" u2="O" k="41" />
<hkern u1="L" u2="G" k="41" />
<hkern u1="L" u2="C" k="41" />
<hkern u1="L" u2="&#x27;" k="164" />
<hkern u1="L" u2="&#x22;" k="164" />
<hkern u1="O" u2="&#x201e;" k="82" />
<hkern u1="O" u2="&#x201a;" k="82" />
<hkern u1="O" u2="&#x178;" k="20" />
<hkern u1="O" u2="&#xdd;" k="20" />
<hkern u1="O" u2="&#xc5;" k="41" />
<hkern u1="O" u2="&#xc4;" k="41" />
<hkern u1="O" u2="&#xc3;" k="41" />
<hkern u1="O" u2="&#xc2;" k="41" />
<hkern u1="O" u2="&#xc1;" k="41" />
<hkern u1="O" u2="&#xc0;" k="41" />
<hkern u1="O" u2="Z" k="20" />
<hkern u1="O" u2="Y" k="20" />
<hkern u1="O" u2="X" k="41" />
<hkern u1="O" u2="W" k="20" />
<hkern u1="O" u2="V" k="20" />
<hkern u1="O" u2="T" k="61" />
<hkern u1="O" u2="A" k="41" />
<hkern u1="O" u2="&#x2e;" k="82" />
<hkern u1="O" u2="&#x2c;" k="82" />
<hkern u1="P" u2="&#x201e;" k="266" />
<hkern u1="P" u2="&#x201a;" k="266" />
<hkern u1="P" u2="&#xc5;" k="102" />
<hkern u1="P" u2="&#xc4;" k="102" />
<hkern u1="P" u2="&#xc3;" k="102" />
<hkern u1="P" u2="&#xc2;" k="102" />
<hkern u1="P" u2="&#xc1;" k="102" />
<hkern u1="P" u2="&#xc0;" k="102" />
<hkern u1="P" u2="Z" k="20" />
<hkern u1="P" u2="X" k="41" />
<hkern u1="P" u2="A" k="102" />
<hkern u1="P" u2="&#x2e;" k="266" />
<hkern u1="P" u2="&#x2c;" k="266" />
<hkern u1="Q" u2="&#x201e;" k="82" />
<hkern u1="Q" u2="&#x201a;" k="82" />
<hkern u1="Q" u2="&#x178;" k="20" />
<hkern u1="Q" u2="&#xdd;" k="20" />
<hkern u1="Q" u2="&#xc5;" k="41" />
<hkern u1="Q" u2="&#xc4;" k="41" />
<hkern u1="Q" u2="&#xc3;" k="41" />
<hkern u1="Q" u2="&#xc2;" k="41" />
<hkern u1="Q" u2="&#xc1;" k="41" />
<hkern u1="Q" u2="&#xc0;" k="41" />
<hkern u1="Q" u2="Z" k="20" />
<hkern u1="Q" u2="Y" k="20" />
<hkern u1="Q" u2="X" k="41" />
<hkern u1="Q" u2="W" k="20" />
<hkern u1="Q" u2="V" k="20" />
<hkern u1="Q" u2="T" k="61" />
<hkern u1="Q" u2="A" k="41" />
<hkern u1="Q" u2="&#x2e;" k="82" />
<hkern u1="Q" u2="&#x2c;" k="82" />
<hkern u1="T" u2="&#x201e;" k="123" />
<hkern u1="T" u2="&#x201a;" k="123" />
<hkern u1="T" u2="&#x2014;" k="82" />
<hkern u1="T" u2="&#x2013;" k="82" />
<hkern u1="T" u2="&#x153;" k="143" />
<hkern u1="T" u2="&#x152;" k="41" />
<hkern u1="T" u2="&#xfd;" k="41" />
<hkern u1="T" u2="&#xfc;" k="102" />
<hkern u1="T" u2="&#xfb;" k="102" />
<hkern u1="T" u2="&#xfa;" k="102" />
<hkern u1="T" u2="&#xf9;" k="102" />
<hkern u1="T" u2="&#xf8;" k="143" />
<hkern u1="T" u2="&#xf6;" k="143" />
<hkern u1="T" u2="&#xf5;" k="143" />
<hkern u1="T" u2="&#xf4;" k="143" />
<hkern u1="T" u2="&#xf3;" k="143" />
<hkern u1="T" u2="&#xf2;" k="143" />
<hkern u1="T" u2="&#xeb;" k="143" />
<hkern u1="T" u2="&#xea;" k="143" />
<hkern u1="T" u2="&#xe9;" k="143" />
<hkern u1="T" u2="&#xe8;" k="143" />
<hkern u1="T" u2="&#xe7;" k="143" />
<hkern u1="T" u2="&#xe6;" k="164" />
<hkern u1="T" u2="&#xe5;" k="164" />
<hkern u1="T" u2="&#xe4;" k="164" />
<hkern u1="T" u2="&#xe3;" k="164" />
<hkern u1="T" u2="&#xe2;" k="164" />
<hkern u1="T" u2="&#xe1;" k="164" />
<hkern u1="T" u2="&#xe0;" k="143" />
<hkern u1="T" u2="&#xd8;" k="41" />
<hkern u1="T" u2="&#xd6;" k="41" />
<hkern u1="T" u2="&#xd5;" k="41" />
<hkern u1="T" u2="&#xd4;" k="41" />
<hkern u1="T" u2="&#xd3;" k="41" />
<hkern u1="T" u2="&#xd2;" k="41" />
<hkern u1="T" u2="&#xc7;" k="41" />
<hkern u1="T" u2="&#xc5;" k="143" />
<hkern u1="T" u2="&#xc4;" k="143" />
<hkern u1="T" u2="&#xc3;" k="143" />
<hkern u1="T" u2="&#xc2;" k="143" />
<hkern u1="T" u2="&#xc1;" k="143" />
<hkern u1="T" u2="&#xc0;" k="143" />
<hkern u1="T" u2="z" k="82" />
<hkern u1="T" u2="y" k="41" />
<hkern u1="T" u2="x" k="41" />
<hkern u1="T" u2="w" k="41" />
<hkern u1="T" u2="v" k="41" />
<hkern u1="T" u2="u" k="102" />
<hkern u1="T" u2="s" k="123" />
<hkern u1="T" u2="r" k="102" />
<hkern u1="T" u2="q" k="143" />
<hkern u1="T" u2="p" k="102" />
<hkern u1="T" u2="o" k="143" />
<hkern u1="T" u2="n" k="102" />
<hkern u1="T" u2="m" k="102" />
<hkern u1="T" u2="g" k="143" />
<hkern u1="T" u2="e" k="143" />
<hkern u1="T" u2="d" k="143" />
<hkern u1="T" u2="c" k="143" />
<hkern u1="T" u2="a" k="164" />
<hkern u1="T" u2="T" k="-41" />
<hkern u1="T" u2="Q" k="41" />
<hkern u1="T" u2="O" k="41" />
<hkern u1="T" u2="G" k="41" />
<hkern u1="T" u2="C" k="41" />
<hkern u1="T" u2="A" k="143" />
<hkern u1="T" u2="&#x3f;" k="-41" />
<hkern u1="T" u2="&#x2e;" k="123" />
<hkern u1="T" u2="&#x2d;" k="82" />
<hkern u1="T" u2="&#x2c;" k="123" />
<hkern u1="U" u2="&#x201e;" k="41" />
<hkern u1="U" u2="&#x201a;" k="41" />
<hkern u1="U" u2="&#xc5;" k="20" />
<hkern u1="U" u2="&#xc4;" k="20" />
<hkern u1="U" u2="&#xc3;" k="20" />
<hkern u1="U" u2="&#xc2;" k="20" />
<hkern u1="U" u2="&#xc1;" k="20" />
<hkern u1="U" u2="&#xc0;" k="20" />
<hkern u1="U" u2="A" k="20" />
<hkern u1="U" u2="&#x2e;" k="41" />
<hkern u1="U" u2="&#x2c;" k="41" />
<hkern u1="V" u2="&#x201e;" k="102" />
<hkern u1="V" u2="&#x201a;" k="102" />
<hkern u1="V" u2="&#x153;" k="41" />
<hkern u1="V" u2="&#x152;" k="20" />
<hkern u1="V" u2="&#xfc;" k="20" />
<hkern u1="V" u2="&#xfb;" k="20" />
<hkern u1="V" u2="&#xfa;" k="20" />
<hkern u1="V" u2="&#xf9;" k="20" />
<hkern u1="V" u2="&#xf8;" k="41" />
<hkern u1="V" u2="&#xf6;" k="41" />
<hkern u1="V" u2="&#xf5;" k="41" />
<hkern u1="V" u2="&#xf4;" k="41" />
<hkern u1="V" u2="&#xf3;" k="41" />
<hkern u1="V" u2="&#xf2;" k="41" />
<hkern u1="V" u2="&#xeb;" k="41" />
<hkern u1="V" u2="&#xea;" k="41" />
<hkern u1="V" u2="&#xe9;" k="41" />
<hkern u1="V" u2="&#xe8;" k="41" />
<hkern u1="V" u2="&#xe7;" k="41" />
<hkern u1="V" u2="&#xe6;" k="41" />
<hkern u1="V" u2="&#xe5;" k="41" />
<hkern u1="V" u2="&#xe4;" k="41" />
<hkern u1="V" u2="&#xe3;" k="41" />
<hkern u1="V" u2="&#xe2;" k="41" />
<hkern u1="V" u2="&#xe1;" k="41" />
<hkern u1="V" u2="&#xe0;" k="41" />
<hkern u1="V" u2="&#xd8;" k="20" />
<hkern u1="V" u2="&#xd6;" k="20" />
<hkern u1="V" u2="&#xd5;" k="20" />
<hkern u1="V" u2="&#xd4;" k="20" />
<hkern u1="V" u2="&#xd3;" k="20" />
<hkern u1="V" u2="&#xd2;" k="20" />
<hkern u1="V" u2="&#xc7;" k="20" />
<hkern u1="V" u2="&#xc5;" k="82" />
<hkern u1="V" u2="&#xc4;" k="82" />
<hkern u1="V" u2="&#xc3;" k="82" />
<hkern u1="V" u2="&#xc2;" k="82" />
<hkern u1="V" u2="&#xc1;" k="82" />
<hkern u1="V" u2="&#xc0;" k="82" />
<hkern u1="V" u2="u" k="20" />
<hkern u1="V" u2="s" k="20" />
<hkern u1="V" u2="r" k="20" />
<hkern u1="V" u2="q" k="41" />
<hkern u1="V" u2="p" k="20" />
<hkern u1="V" u2="o" k="41" />
<hkern u1="V" u2="n" k="20" />
<hkern u1="V" u2="m" k="20" />
<hkern u1="V" u2="g" k="20" />
<hkern u1="V" u2="e" k="41" />
<hkern u1="V" u2="d" k="41" />
<hkern u1="V" u2="c" k="41" />
<hkern u1="V" u2="a" k="41" />
<hkern u1="V" u2="Q" k="20" />
<hkern u1="V" u2="O" k="20" />
<hkern u1="V" u2="G" k="20" />
<hkern u1="V" u2="C" k="20" />
<hkern u1="V" u2="A" k="82" />
<hkern u1="V" u2="&#x3f;" k="-41" />
<hkern u1="V" u2="&#x2e;" k="102" />
<hkern u1="V" u2="&#x2c;" k="102" />
<hkern u1="W" u2="&#x201e;" k="102" />
<hkern u1="W" u2="&#x201a;" k="102" />
<hkern u1="W" u2="&#x153;" k="41" />
<hkern u1="W" u2="&#x152;" k="20" />
<hkern u1="W" u2="&#xfc;" k="20" />
<hkern u1="W" u2="&#xfb;" k="20" />
<hkern u1="W" u2="&#xfa;" k="20" />
<hkern u1="W" u2="&#xf9;" k="20" />
<hkern u1="W" u2="&#xf8;" k="41" />
<hkern u1="W" u2="&#xf6;" k="41" />
<hkern u1="W" u2="&#xf5;" k="41" />
<hkern u1="W" u2="&#xf4;" k="41" />
<hkern u1="W" u2="&#xf3;" k="41" />
<hkern u1="W" u2="&#xf2;" k="41" />
<hkern u1="W" u2="&#xeb;" k="41" />
<hkern u1="W" u2="&#xea;" k="41" />
<hkern u1="W" u2="&#xe9;" k="41" />
<hkern u1="W" u2="&#xe8;" k="41" />
<hkern u1="W" u2="&#xe7;" k="41" />
<hkern u1="W" u2="&#xe6;" k="41" />
<hkern u1="W" u2="&#xe5;" k="41" />
<hkern u1="W" u2="&#xe4;" k="41" />
<hkern u1="W" u2="&#xe3;" k="41" />
<hkern u1="W" u2="&#xe2;" k="41" />
<hkern u1="W" u2="&#xe1;" k="41" />
<hkern u1="W" u2="&#xe0;" k="41" />
<hkern u1="W" u2="&#xd8;" k="20" />
<hkern u1="W" u2="&#xd6;" k="20" />
<hkern u1="W" u2="&#xd5;" k="20" />
<hkern u1="W" u2="&#xd4;" k="20" />
<hkern u1="W" u2="&#xd3;" k="20" />
<hkern u1="W" u2="&#xd2;" k="20" />
<hkern u1="W" u2="&#xc7;" k="20" />
<hkern u1="W" u2="&#xc5;" k="82" />
<hkern u1="W" u2="&#xc4;" k="82" />
<hkern u1="W" u2="&#xc3;" k="82" />
<hkern u1="W" u2="&#xc2;" k="82" />
<hkern u1="W" u2="&#xc1;" k="82" />
<hkern u1="W" u2="&#xc0;" k="82" />
<hkern u1="W" u2="u" k="20" />
<hkern u1="W" u2="s" k="20" />
<hkern u1="W" u2="r" k="20" />
<hkern u1="W" u2="q" k="41" />
<hkern u1="W" u2="p" k="20" />
<hkern u1="W" u2="o" k="41" />
<hkern u1="W" u2="n" k="20" />
<hkern u1="W" u2="m" k="20" />
<hkern u1="W" u2="g" k="20" />
<hkern u1="W" u2="e" k="41" />
<hkern u1="W" u2="d" k="41" />
<hkern u1="W" u2="c" k="41" />
<hkern u1="W" u2="a" k="41" />
<hkern u1="W" u2="Q" k="20" />
<hkern u1="W" u2="O" k="20" />
<hkern u1="W" u2="G" k="20" />
<hkern u1="W" u2="C" k="20" />
<hkern u1="W" u2="A" k="82" />
<hkern u1="W" u2="&#x3f;" k="-41" />
<hkern u1="W" u2="&#x2e;" k="102" />
<hkern u1="W" u2="&#x2c;" k="102" />
<hkern u1="X" u2="&#x152;" k="41" />
<hkern u1="X" u2="&#xd8;" k="41" />
<hkern u1="X" u2="&#xd6;" k="41" />
<hkern u1="X" u2="&#xd5;" k="41" />
<hkern u1="X" u2="&#xd4;" k="41" />
<hkern u1="X" u2="&#xd3;" k="41" />
<hkern u1="X" u2="&#xd2;" k="41" />
<hkern u1="X" u2="&#xc7;" k="41" />
<hkern u1="X" u2="Q" k="41" />
<hkern u1="X" u2="O" k="41" />
<hkern u1="X" u2="G" k="41" />
<hkern u1="X" u2="C" k="41" />
<hkern u1="Y" u2="&#x201e;" k="123" />
<hkern u1="Y" u2="&#x201a;" k="123" />
<hkern u1="Y" u2="&#x153;" k="102" />
<hkern u1="Y" u2="&#x152;" k="41" />
<hkern u1="Y" u2="&#xfc;" k="61" />
<hkern u1="Y" u2="&#xfb;" k="61" />
<hkern u1="Y" u2="&#xfa;" k="61" />
<hkern u1="Y" u2="&#xf9;" k="61" />
<hkern u1="Y" u2="&#xf8;" k="102" />
<hkern u1="Y" u2="&#xf6;" k="102" />
<hkern u1="Y" u2="&#xf5;" k="102" />
<hkern u1="Y" u2="&#xf4;" k="102" />
<hkern u1="Y" u2="&#xf3;" k="102" />
<hkern u1="Y" u2="&#xf2;" k="102" />
<hkern u1="Y" u2="&#xeb;" k="102" />
<hkern u1="Y" u2="&#xea;" k="102" />
<hkern u1="Y" u2="&#xe9;" k="102" />
<hkern u1="Y" u2="&#xe8;" k="102" />
<hkern u1="Y" u2="&#xe7;" k="102" />
<hkern u1="Y" u2="&#xe6;" k="102" />
<hkern u1="Y" u2="&#xe5;" k="102" />
<hkern u1="Y" u2="&#xe4;" k="102" />
<hkern u1="Y" u2="&#xe3;" k="102" />
<hkern u1="Y" u2="&#xe2;" k="102" />
<hkern u1="Y" u2="&#xe1;" k="102" />
<hkern u1="Y" u2="&#xe0;" k="102" />
<hkern u1="Y" u2="&#xd8;" k="41" />
<hkern u1="Y" u2="&#xd6;" k="41" />
<hkern u1="Y" u2="&#xd5;" k="41" />
<hkern u1="Y" u2="&#xd4;" k="41" />
<hkern u1="Y" u2="&#xd3;" k="41" />
<hkern u1="Y" u2="&#xd2;" k="41" />
<hkern u1="Y" u2="&#xc7;" k="41" />
<hkern u1="Y" u2="&#xc5;" k="123" />
<hkern u1="Y" u2="&#xc4;" k="123" />
<hkern u1="Y" u2="&#xc3;" k="123" />
<hkern u1="Y" u2="&#xc2;" k="123" />
<hkern u1="Y" u2="&#xc1;" k="123" />
<hkern u1="Y" u2="&#xc0;" k="123" />
<hkern u1="Y" u2="z" k="41" />
<hkern u1="Y" u2="u" k="61" />
<hkern u1="Y" u2="s" k="82" />
<hkern u1="Y" u2="r" k="61" />
<hkern u1="Y" u2="q" k="102" />
<hkern u1="Y" u2="p" k="61" />
<hkern u1="Y" u2="o" k="102" />
<hkern u1="Y" u2="n" k="61" />
<hkern u1="Y" u2="m" k="61" />
<hkern u1="Y" u2="g" k="41" />
<hkern u1="Y" u2="e" k="102" />
<hkern u1="Y" u2="d" k="102" />
<hkern u1="Y" u2="c" k="102" />
<hkern u1="Y" u2="a" k="102" />
<hkern u1="Y" u2="Q" k="41" />
<hkern u1="Y" u2="O" k="41" />
<hkern u1="Y" u2="G" k="41" />
<hkern u1="Y" u2="C" k="41" />
<hkern u1="Y" u2="A" k="123" />
<hkern u1="Y" u2="&#x3f;" k="-41" />
<hkern u1="Y" u2="&#x2e;" k="123" />
<hkern u1="Y" u2="&#x2c;" k="123" />
<hkern u1="Z" u2="&#x152;" k="20" />
<hkern u1="Z" u2="&#xd8;" k="20" />
<hkern u1="Z" u2="&#xd6;" k="20" />
<hkern u1="Z" u2="&#xd5;" k="20" />
<hkern u1="Z" u2="&#xd4;" k="20" />
<hkern u1="Z" u2="&#xd3;" k="20" />
<hkern u1="Z" u2="&#xd2;" k="20" />
<hkern u1="Z" u2="&#xc7;" k="20" />
<hkern u1="Z" u2="Q" k="20" />
<hkern u1="Z" u2="O" k="20" />
<hkern u1="Z" u2="G" k="20" />
<hkern u1="Z" u2="C" k="20" />
<hkern u1="[" u2="J" k="-184" />
<hkern u1="a" u2="&#x201d;" k="20" />
<hkern u1="a" u2="&#x2019;" k="20" />
<hkern u1="a" u2="&#x27;" k="20" />
<hkern u1="a" u2="&#x22;" k="20" />
<hkern u1="b" u2="&#x201d;" k="20" />
<hkern u1="b" u2="&#x2019;" k="20" />
<hkern u1="b" u2="&#xfd;" k="41" />
<hkern u1="b" u2="z" k="20" />
<hkern u1="b" u2="y" k="41" />
<hkern u1="b" u2="x" k="41" />
<hkern u1="b" u2="w" k="41" />
<hkern u1="b" u2="v" k="41" />
<hkern u1="b" u2="&#x27;" k="20" />
<hkern u1="b" u2="&#x22;" k="20" />
<hkern u1="c" u2="&#x201d;" k="-41" />
<hkern u1="c" u2="&#x2019;" k="-41" />
<hkern u1="c" u2="&#x27;" k="-41" />
<hkern u1="c" u2="&#x22;" k="-41" />
<hkern u1="e" u2="&#x201d;" k="20" />
<hkern u1="e" u2="&#x2019;" k="20" />
<hkern u1="e" u2="&#xfd;" k="41" />
<hkern u1="e" u2="z" k="20" />
<hkern u1="e" u2="y" k="41" />
<hkern u1="e" u2="x" k="41" />
<hkern u1="e" u2="w" k="41" />
<hkern u1="e" u2="v" k="41" />
<hkern u1="e" u2="&#x27;" k="20" />
<hkern u1="e" u2="&#x22;" k="20" />
<hkern u1="f" u2="&#x201d;" k="-123" />
<hkern u1="f" u2="&#x2019;" k="-123" />
<hkern u1="f" u2="&#x27;" k="-123" />
<hkern u1="f" u2="&#x22;" k="-123" />
<hkern u1="h" u2="&#x201d;" k="20" />
<hkern u1="h" u2="&#x2019;" k="20" />
<hkern u1="h" u2="&#x27;" k="20" />
<hkern u1="h" u2="&#x22;" k="20" />
<hkern u1="k" u2="&#x153;" k="41" />
<hkern u1="k" u2="&#xf8;" k="41" />
<hkern u1="k" u2="&#xf6;" k="41" />
<hkern u1="k" u2="&#xf5;" k="41" />
<hkern u1="k" u2="&#xf4;" k="41" />
<hkern u1="k" u2="&#xf3;" k="41" />
<hkern u1="k" u2="&#xf2;" k="41" />
<hkern u1="k" u2="&#xeb;" k="41" />
<hkern u1="k" u2="&#xea;" k="41" />
<hkern u1="k" u2="&#xe9;" k="41" />
<hkern u1="k" u2="&#xe8;" k="41" />
<hkern u1="k" u2="&#xe7;" k="41" />
<hkern u1="k" u2="&#xe0;" k="41" />
<hkern u1="k" u2="q" k="41" />
<hkern u1="k" u2="o" k="41" />
<hkern u1="k" u2="e" k="41" />
<hkern u1="k" u2="d" k="41" />
<hkern u1="k" u2="c" k="41" />
<hkern u1="m" u2="&#x201d;" k="20" />
<hkern u1="m" u2="&#x2019;" k="20" />
<hkern u1="m" u2="&#x27;" k="20" />
<hkern u1="m" u2="&#x22;" k="20" />
<hkern u1="n" u2="&#x201d;" k="20" />
<hkern u1="n" u2="&#x2019;" k="20" />
<hkern u1="n" u2="&#x27;" k="20" />
<hkern u1="n" u2="&#x22;" k="20" />
<hkern u1="o" u2="&#x201d;" k="20" />
<hkern u1="o" u2="&#x2019;" k="20" />
<hkern u1="o" u2="&#xfd;" k="41" />
<hkern u1="o" u2="z" k="20" />
<hkern u1="o" u2="y" k="41" />
<hkern u1="o" u2="x" k="41" />
<hkern u1="o" u2="w" k="41" />
<hkern u1="o" u2="v" k="41" />
<hkern u1="o" u2="&#x27;" k="20" />
<hkern u1="o" u2="&#x22;" k="20" />
<hkern u1="p" u2="&#x201d;" k="20" />
<hkern u1="p" u2="&#x2019;" k="20" />
<hkern u1="p" u2="&#xfd;" k="41" />
<hkern u1="p" u2="z" k="20" />
<hkern u1="p" u2="y" k="41" />
<hkern u1="p" u2="x" k="41" />
<hkern u1="p" u2="w" k="41" />
<hkern u1="p" u2="v" k="41" />
<hkern u1="p" u2="&#x27;" k="20" />
<hkern u1="p" u2="&#x22;" k="20" />
<hkern u1="r" u2="&#x201d;" k="-82" />
<hkern u1="r" u2="&#x2019;" k="-82" />
<hkern u1="r" u2="&#x153;" k="41" />
<hkern u1="r" u2="&#xf8;" k="41" />
<hkern u1="r" u2="&#xf6;" k="41" />
<hkern u1="r" u2="&#xf5;" k="41" />
<hkern u1="r" u2="&#xf4;" k="41" />
<hkern u1="r" u2="&#xf3;" k="41" />
<hkern u1="r" u2="&#xf2;" k="41" />
<hkern u1="r" u2="&#xeb;" k="41" />
<hkern u1="r" u2="&#xea;" k="41" />
<hkern u1="r" u2="&#xe9;" k="41" />
<hkern u1="r" u2="&#xe8;" k="41" />
<hkern u1="r" u2="&#xe7;" k="41" />
<hkern u1="r" u2="&#xe6;" k="41" />
<hkern u1="r" u2="&#xe5;" k="41" />
<hkern u1="r" u2="&#xe4;" k="41" />
<hkern u1="r" u2="&#xe3;" k="41" />
<hkern u1="r" u2="&#xe2;" k="41" />
<hkern u1="r" u2="&#xe1;" k="41" />
<hkern u1="r" u2="&#xe0;" k="41" />
<hkern u1="r" u2="q" k="41" />
<hkern u1="r" u2="o" k="41" />
<hkern u1="r" u2="g" k="20" />
<hkern u1="r" u2="e" k="41" />
<hkern u1="r" u2="d" k="41" />
<hkern u1="r" u2="c" k="41" />
<hkern u1="r" u2="a" k="41" />
<hkern u1="r" u2="&#x27;" k="-82" />
<hkern u1="r" u2="&#x22;" k="-82" />
<hkern u1="t" u2="&#x201d;" k="-41" />
<hkern u1="t" u2="&#x2019;" k="-41" />
<hkern u1="t" u2="&#x27;" k="-41" />
<hkern u1="t" u2="&#x22;" k="-41" />
<hkern u1="v" u2="&#x201e;" k="82" />
<hkern u1="v" u2="&#x201d;" k="-82" />
<hkern u1="v" u2="&#x201a;" k="82" />
<hkern u1="v" u2="&#x2019;" k="-82" />
<hkern u1="v" u2="&#x3f;" k="-41" />
<hkern u1="v" u2="&#x2e;" k="82" />
<hkern u1="v" u2="&#x2c;" k="82" />
<hkern u1="v" u2="&#x27;" k="-82" />
<hkern u1="v" u2="&#x22;" k="-82" />
<hkern u1="w" u2="&#x201e;" k="82" />
<hkern u1="w" u2="&#x201d;" k="-82" />
<hkern u1="w" u2="&#x201a;" k="82" />
<hkern u1="w" u2="&#x2019;" k="-82" />
<hkern u1="w" u2="&#x3f;" k="-41" />
<hkern u1="w" u2="&#x2e;" k="82" />
<hkern u1="w" u2="&#x2c;" k="82" />
<hkern u1="w" u2="&#x27;" k="-82" />
<hkern u1="w" u2="&#x22;" k="-82" />
<hkern u1="x" u2="&#x153;" k="41" />
<hkern u1="x" u2="&#xf8;" k="41" />
<hkern u1="x" u2="&#xf6;" k="41" />
<hkern u1="x" u2="&#xf5;" k="41" />
<hkern u1="x" u2="&#xf4;" k="41" />
<hkern u1="x" u2="&#xf3;" k="41" />
<hkern u1="x" u2="&#xf2;" k="41" />
<hkern u1="x" u2="&#xeb;" k="41" />
<hkern u1="x" u2="&#xea;" k="41" />
<hkern u1="x" u2="&#xe9;" k="41" />
<hkern u1="x" u2="&#xe8;" k="41" />
<hkern u1="x" u2="&#xe7;" k="41" />
<hkern u1="x" u2="&#xe0;" k="41" />
<hkern u1="x" u2="q" k="41" />
<hkern u1="x" u2="o" k="41" />
<hkern u1="x" u2="e" k="41" />
<hkern u1="x" u2="d" k="41" />
<hkern u1="x" u2="c" k="41" />
<hkern u1="y" u2="&#x201e;" k="82" />
<hkern u1="y" u2="&#x201d;" k="-82" />
<hkern u1="y" u2="&#x201a;" k="82" />
<hkern u1="y" u2="&#x2019;" k="-82" />
<hkern u1="y" u2="&#x3f;" k="-41" />
<hkern u1="y" u2="&#x2e;" k="82" />
<hkern u1="y" u2="&#x2c;" k="82" />
<hkern u1="y" u2="&#x27;" k="-82" />
<hkern u1="y" u2="&#x22;" k="-82" />
<hkern u1="&#x7b;" u2="J" k="-184" />
<hkern u1="&#xc0;" u2="&#x201d;" k="143" />
<hkern u1="&#xc0;" u2="&#x2019;" k="143" />
<hkern u1="&#xc0;" u2="&#x178;" k="123" />
<hkern u1="&#xc0;" u2="&#x152;" k="41" />
<hkern u1="&#xc0;" u2="&#xdd;" k="123" />
<hkern u1="&#xc0;" u2="&#xd8;" k="41" />
<hkern u1="&#xc0;" u2="&#xd6;" k="41" />
<hkern u1="&#xc0;" u2="&#xd5;" k="41" />
<hkern u1="&#xc0;" u2="&#xd4;" k="41" />
<hkern u1="&#xc0;" u2="&#xd3;" k="41" />
<hkern u1="&#xc0;" u2="&#xd2;" k="41" />
<hkern u1="&#xc0;" u2="&#xc7;" k="41" />
<hkern u1="&#xc0;" u2="Y" k="123" />
<hkern u1="&#xc0;" u2="W" k="82" />
<hkern u1="&#xc0;" u2="V" k="82" />
<hkern u1="&#xc0;" u2="T" k="143" />
<hkern u1="&#xc0;" u2="Q" k="41" />
<hkern u1="&#xc0;" u2="O" k="41" />
<hkern u1="&#xc0;" u2="J" k="-266" />
<hkern u1="&#xc0;" u2="G" k="41" />
<hkern u1="&#xc0;" u2="C" k="41" />
<hkern u1="&#xc0;" u2="&#x27;" k="143" />
<hkern u1="&#xc0;" u2="&#x22;" k="143" />
<hkern u1="&#xc1;" u2="&#x201d;" k="143" />
<hkern u1="&#xc1;" u2="&#x2019;" k="143" />
<hkern u1="&#xc1;" u2="&#x178;" k="123" />
<hkern u1="&#xc1;" u2="&#x152;" k="41" />
<hkern u1="&#xc1;" u2="&#xdd;" k="123" />
<hkern u1="&#xc1;" u2="&#xd8;" k="41" />
<hkern u1="&#xc1;" u2="&#xd6;" k="41" />
<hkern u1="&#xc1;" u2="&#xd5;" k="41" />
<hkern u1="&#xc1;" u2="&#xd4;" k="41" />
<hkern u1="&#xc1;" u2="&#xd3;" k="41" />
<hkern u1="&#xc1;" u2="&#xd2;" k="41" />
<hkern u1="&#xc1;" u2="&#xc7;" k="41" />
<hkern u1="&#xc1;" u2="Y" k="123" />
<hkern u1="&#xc1;" u2="W" k="82" />
<hkern u1="&#xc1;" u2="V" k="82" />
<hkern u1="&#xc1;" u2="T" k="143" />
<hkern u1="&#xc1;" u2="Q" k="41" />
<hkern u1="&#xc1;" u2="O" k="41" />
<hkern u1="&#xc1;" u2="J" k="-266" />
<hkern u1="&#xc1;" u2="G" k="41" />
<hkern u1="&#xc1;" u2="C" k="41" />
<hkern u1="&#xc1;" u2="&#x27;" k="143" />
<hkern u1="&#xc1;" u2="&#x22;" k="143" />
<hkern u1="&#xc2;" u2="&#x201d;" k="143" />
<hkern u1="&#xc2;" u2="&#x2019;" k="143" />
<hkern u1="&#xc2;" u2="&#x178;" k="123" />
<hkern u1="&#xc2;" u2="&#x152;" k="41" />
<hkern u1="&#xc2;" u2="&#xdd;" k="123" />
<hkern u1="&#xc2;" u2="&#xd8;" k="41" />
<hkern u1="&#xc2;" u2="&#xd6;" k="41" />
<hkern u1="&#xc2;" u2="&#xd5;" k="41" />
<hkern u1="&#xc2;" u2="&#xd4;" k="41" />
<hkern u1="&#xc2;" u2="&#xd3;" k="41" />
<hkern u1="&#xc2;" u2="&#xd2;" k="41" />
<hkern u1="&#xc2;" u2="&#xc7;" k="41" />
<hkern u1="&#xc2;" u2="Y" k="123" />
<hkern u1="&#xc2;" u2="W" k="82" />
<hkern u1="&#xc2;" u2="V" k="82" />
<hkern u1="&#xc2;" u2="T" k="143" />
<hkern u1="&#xc2;" u2="Q" k="41" />
<hkern u1="&#xc2;" u2="O" k="41" />
<hkern u1="&#xc2;" u2="J" k="-266" />
<hkern u1="&#xc2;" u2="G" k="41" />
<hkern u1="&#xc2;" u2="C" k="41" />
<hkern u1="&#xc2;" u2="&#x27;" k="143" />
<hkern u1="&#xc2;" u2="&#x22;" k="143" />
<hkern u1="&#xc3;" u2="&#x201d;" k="143" />
<hkern u1="&#xc3;" u2="&#x2019;" k="143" />
<hkern u1="&#xc3;" u2="&#x178;" k="123" />
<hkern u1="&#xc3;" u2="&#x152;" k="41" />
<hkern u1="&#xc3;" u2="&#xdd;" k="123" />
<hkern u1="&#xc3;" u2="&#xd8;" k="41" />
<hkern u1="&#xc3;" u2="&#xd6;" k="41" />
<hkern u1="&#xc3;" u2="&#xd5;" k="41" />
<hkern u1="&#xc3;" u2="&#xd4;" k="41" />
<hkern u1="&#xc3;" u2="&#xd3;" k="41" />
<hkern u1="&#xc3;" u2="&#xd2;" k="41" />
<hkern u1="&#xc3;" u2="&#xc7;" k="41" />
<hkern u1="&#xc3;" u2="Y" k="123" />
<hkern u1="&#xc3;" u2="W" k="82" />
<hkern u1="&#xc3;" u2="V" k="82" />
<hkern u1="&#xc3;" u2="T" k="143" />
<hkern u1="&#xc3;" u2="Q" k="41" />
<hkern u1="&#xc3;" u2="O" k="41" />
<hkern u1="&#xc3;" u2="J" k="-266" />
<hkern u1="&#xc3;" u2="G" k="41" />
<hkern u1="&#xc3;" u2="C" k="41" />
<hkern u1="&#xc3;" u2="&#x27;" k="143" />
<hkern u1="&#xc3;" u2="&#x22;" k="143" />
<hkern u1="&#xc4;" u2="&#x201d;" k="143" />
<hkern u1="&#xc4;" u2="&#x2019;" k="143" />
<hkern u1="&#xc4;" u2="&#x178;" k="123" />
<hkern u1="&#xc4;" u2="&#x152;" k="41" />
<hkern u1="&#xc4;" u2="&#xdd;" k="123" />
<hkern u1="&#xc4;" u2="&#xd8;" k="41" />
<hkern u1="&#xc4;" u2="&#xd6;" k="41" />
<hkern u1="&#xc4;" u2="&#xd5;" k="41" />
<hkern u1="&#xc4;" u2="&#xd4;" k="41" />
<hkern u1="&#xc4;" u2="&#xd3;" k="41" />
<hkern u1="&#xc4;" u2="&#xd2;" k="41" />
<hkern u1="&#xc4;" u2="&#xc7;" k="41" />
<hkern u1="&#xc4;" u2="Y" k="123" />
<hkern u1="&#xc4;" u2="W" k="82" />
<hkern u1="&#xc4;" u2="V" k="82" />
<hkern u1="&#xc4;" u2="T" k="143" />
<hkern u1="&#xc4;" u2="Q" k="41" />
<hkern u1="&#xc4;" u2="O" k="41" />
<hkern u1="&#xc4;" u2="J" k="-266" />
<hkern u1="&#xc4;" u2="G" k="41" />
<hkern u1="&#xc4;" u2="C" k="41" />
<hkern u1="&#xc4;" u2="&#x27;" k="143" />
<hkern u1="&#xc4;" u2="&#x22;" k="143" />
<hkern u1="&#xc5;" u2="&#x201d;" k="143" />
<hkern u1="&#xc5;" u2="&#x2019;" k="143" />
<hkern u1="&#xc5;" u2="&#x178;" k="123" />
<hkern u1="&#xc5;" u2="&#x152;" k="41" />
<hkern u1="&#xc5;" u2="&#xdd;" k="123" />
<hkern u1="&#xc5;" u2="&#xd8;" k="41" />
<hkern u1="&#xc5;" u2="&#xd6;" k="41" />
<hkern u1="&#xc5;" u2="&#xd5;" k="41" />
<hkern u1="&#xc5;" u2="&#xd4;" k="41" />
<hkern u1="&#xc5;" u2="&#xd3;" k="41" />
<hkern u1="&#xc5;" u2="&#xd2;" k="41" />
<hkern u1="&#xc5;" u2="&#xc7;" k="41" />
<hkern u1="&#xc5;" u2="Y" k="123" />
<hkern u1="&#xc5;" u2="W" k="82" />
<hkern u1="&#xc5;" u2="V" k="82" />
<hkern u1="&#xc5;" u2="T" k="143" />
<hkern u1="&#xc5;" u2="Q" k="41" />
<hkern u1="&#xc5;" u2="O" k="41" />
<hkern u1="&#xc5;" u2="J" k="-266" />
<hkern u1="&#xc5;" u2="G" k="41" />
<hkern u1="&#xc5;" u2="C" k="41" />
<hkern u1="&#xc5;" u2="&#x27;" k="143" />
<hkern u1="&#xc5;" u2="&#x22;" k="143" />
<hkern u1="&#xc6;" u2="J" k="-123" />
<hkern u1="&#xc7;" u2="&#x152;" k="41" />
<hkern u1="&#xc7;" u2="&#xd8;" k="41" />
<hkern u1="&#xc7;" u2="&#xd6;" k="41" />
<hkern u1="&#xc7;" u2="&#xd5;" k="41" />
<hkern u1="&#xc7;" u2="&#xd4;" k="41" />
<hkern u1="&#xc7;" u2="&#xd3;" k="41" />
<hkern u1="&#xc7;" u2="&#xd2;" k="41" />
<hkern u1="&#xc7;" u2="&#xc7;" k="41" />
<hkern u1="&#xc7;" u2="Q" k="41" />
<hkern u1="&#xc7;" u2="O" k="41" />
<hkern u1="&#xc7;" u2="G" k="41" />
<hkern u1="&#xc7;" u2="C" k="41" />
<hkern u1="&#xc8;" u2="J" k="-123" />
<hkern u1="&#xc9;" u2="J" k="-123" />
<hkern u1="&#xca;" u2="J" k="-123" />
<hkern u1="&#xcb;" u2="J" k="-123" />
<hkern u1="&#xd0;" u2="&#x201e;" k="82" />
<hkern u1="&#xd0;" u2="&#x201a;" k="82" />
<hkern u1="&#xd0;" u2="&#x178;" k="20" />
<hkern u1="&#xd0;" u2="&#xdd;" k="20" />
<hkern u1="&#xd0;" u2="&#xc5;" k="41" />
<hkern u1="&#xd0;" u2="&#xc4;" k="41" />
<hkern u1="&#xd0;" u2="&#xc3;" k="41" />
<hkern u1="&#xd0;" u2="&#xc2;" k="41" />
<hkern u1="&#xd0;" u2="&#xc1;" k="41" />
<hkern u1="&#xd0;" u2="&#xc0;" k="41" />
<hkern u1="&#xd0;" u2="Z" k="20" />
<hkern u1="&#xd0;" u2="Y" k="20" />
<hkern u1="&#xd0;" u2="X" k="41" />
<hkern u1="&#xd0;" u2="W" k="20" />
<hkern u1="&#xd0;" u2="V" k="20" />
<hkern u1="&#xd0;" u2="T" k="61" />
<hkern u1="&#xd0;" u2="A" k="41" />
<hkern u1="&#xd0;" u2="&#x2e;" k="82" />
<hkern u1="&#xd0;" u2="&#x2c;" k="82" />
<hkern u1="&#xd2;" u2="&#x201e;" k="82" />
<hkern u1="&#xd2;" u2="&#x201a;" k="82" />
<hkern u1="&#xd2;" u2="&#x178;" k="20" />
<hkern u1="&#xd2;" u2="&#xdd;" k="20" />
<hkern u1="&#xd2;" u2="&#xc5;" k="41" />
<hkern u1="&#xd2;" u2="&#xc4;" k="41" />
<hkern u1="&#xd2;" u2="&#xc3;" k="41" />
<hkern u1="&#xd2;" u2="&#xc2;" k="41" />
<hkern u1="&#xd2;" u2="&#xc1;" k="41" />
<hkern u1="&#xd2;" u2="&#xc0;" k="41" />
<hkern u1="&#xd2;" u2="Z" k="20" />
<hkern u1="&#xd2;" u2="Y" k="20" />
<hkern u1="&#xd2;" u2="X" k="41" />
<hkern u1="&#xd2;" u2="W" k="20" />
<hkern u1="&#xd2;" u2="V" k="20" />
<hkern u1="&#xd2;" u2="T" k="61" />
<hkern u1="&#xd2;" u2="A" k="41" />
<hkern u1="&#xd2;" u2="&#x2e;" k="82" />
<hkern u1="&#xd2;" u2="&#x2c;" k="82" />
<hkern u1="&#xd3;" u2="&#x201e;" k="82" />
<hkern u1="&#xd3;" u2="&#x201a;" k="82" />
<hkern u1="&#xd3;" u2="&#x178;" k="20" />
<hkern u1="&#xd3;" u2="&#xdd;" k="20" />
<hkern u1="&#xd3;" u2="&#xc5;" k="41" />
<hkern u1="&#xd3;" u2="&#xc4;" k="41" />
<hkern u1="&#xd3;" u2="&#xc3;" k="41" />
<hkern u1="&#xd3;" u2="&#xc2;" k="41" />
<hkern u1="&#xd3;" u2="&#xc1;" k="41" />
<hkern u1="&#xd3;" u2="&#xc0;" k="41" />
<hkern u1="&#xd3;" u2="Z" k="20" />
<hkern u1="&#xd3;" u2="Y" k="20" />
<hkern u1="&#xd3;" u2="X" k="41" />
<hkern u1="&#xd3;" u2="W" k="20" />
<hkern u1="&#xd3;" u2="V" k="20" />
<hkern u1="&#xd3;" u2="T" k="61" />
<hkern u1="&#xd3;" u2="A" k="41" />
<hkern u1="&#xd3;" u2="&#x2e;" k="82" />
<hkern u1="&#xd3;" u2="&#x2c;" k="82" />
<hkern u1="&#xd4;" u2="&#x201e;" k="82" />
<hkern u1="&#xd4;" u2="&#x201a;" k="82" />
<hkern u1="&#xd4;" u2="&#x178;" k="20" />
<hkern u1="&#xd4;" u2="&#xdd;" k="20" />
<hkern u1="&#xd4;" u2="&#xc5;" k="41" />
<hkern u1="&#xd4;" u2="&#xc4;" k="41" />
<hkern u1="&#xd4;" u2="&#xc3;" k="41" />
<hkern u1="&#xd4;" u2="&#xc2;" k="41" />
<hkern u1="&#xd4;" u2="&#xc1;" k="41" />
<hkern u1="&#xd4;" u2="&#xc0;" k="41" />
<hkern u1="&#xd4;" u2="Z" k="20" />
<hkern u1="&#xd4;" u2="Y" k="20" />
<hkern u1="&#xd4;" u2="X" k="41" />
<hkern u1="&#xd4;" u2="W" k="20" />
<hkern u1="&#xd4;" u2="V" k="20" />
<hkern u1="&#xd4;" u2="T" k="61" />
<hkern u1="&#xd4;" u2="A" k="41" />
<hkern u1="&#xd4;" u2="&#x2e;" k="82" />
<hkern u1="&#xd4;" u2="&#x2c;" k="82" />
<hkern u1="&#xd5;" u2="&#x201e;" k="82" />
<hkern u1="&#xd5;" u2="&#x201a;" k="82" />
<hkern u1="&#xd5;" u2="&#x178;" k="20" />
<hkern u1="&#xd5;" u2="&#xdd;" k="20" />
<hkern u1="&#xd5;" u2="&#xc5;" k="41" />
<hkern u1="&#xd5;" u2="&#xc4;" k="41" />
<hkern u1="&#xd5;" u2="&#xc3;" k="41" />
<hkern u1="&#xd5;" u2="&#xc2;" k="41" />
<hkern u1="&#xd5;" u2="&#xc1;" k="41" />
<hkern u1="&#xd5;" u2="&#xc0;" k="41" />
<hkern u1="&#xd5;" u2="Z" k="20" />
<hkern u1="&#xd5;" u2="Y" k="20" />
<hkern u1="&#xd5;" u2="X" k="41" />
<hkern u1="&#xd5;" u2="W" k="20" />
<hkern u1="&#xd5;" u2="V" k="20" />
<hkern u1="&#xd5;" u2="T" k="61" />
<hkern u1="&#xd5;" u2="A" k="41" />
<hkern u1="&#xd5;" u2="&#x2e;" k="82" />
<hkern u1="&#xd5;" u2="&#x2c;" k="82" />
<hkern u1="&#xd6;" u2="&#x201e;" k="82" />
<hkern u1="&#xd6;" u2="&#x201a;" k="82" />
<hkern u1="&#xd6;" u2="&#x178;" k="20" />
<hkern u1="&#xd6;" u2="&#xdd;" k="20" />
<hkern u1="&#xd6;" u2="&#xc5;" k="41" />
<hkern u1="&#xd6;" u2="&#xc4;" k="41" />
<hkern u1="&#xd6;" u2="&#xc3;" k="41" />
<hkern u1="&#xd6;" u2="&#xc2;" k="41" />
<hkern u1="&#xd6;" u2="&#xc1;" k="41" />
<hkern u1="&#xd6;" u2="&#xc0;" k="41" />
<hkern u1="&#xd6;" u2="Z" k="20" />
<hkern u1="&#xd6;" u2="Y" k="20" />
<hkern u1="&#xd6;" u2="X" k="41" />
<hkern u1="&#xd6;" u2="W" k="20" />
<hkern u1="&#xd6;" u2="V" k="20" />
<hkern u1="&#xd6;" u2="T" k="61" />
<hkern u1="&#xd6;" u2="A" k="41" />
<hkern u1="&#xd6;" u2="&#x2e;" k="82" />
<hkern u1="&#xd6;" u2="&#x2c;" k="82" />
<hkern u1="&#xd8;" u2="&#x201e;" k="82" />
<hkern u1="&#xd8;" u2="&#x201a;" k="82" />
<hkern u1="&#xd8;" u2="&#x178;" k="20" />
<hkern u1="&#xd8;" u2="&#xdd;" k="20" />
<hkern u1="&#xd8;" u2="&#xc5;" k="41" />
<hkern u1="&#xd8;" u2="&#xc4;" k="41" />
<hkern u1="&#xd8;" u2="&#xc3;" k="41" />
<hkern u1="&#xd8;" u2="&#xc2;" k="41" />
<hkern u1="&#xd8;" u2="&#xc1;" k="41" />
<hkern u1="&#xd8;" u2="&#xc0;" k="41" />
<hkern u1="&#xd8;" u2="Z" k="20" />
<hkern u1="&#xd8;" u2="Y" k="20" />
<hkern u1="&#xd8;" u2="X" k="41" />
<hkern u1="&#xd8;" u2="W" k="20" />
<hkern u1="&#xd8;" u2="V" k="20" />
<hkern u1="&#xd8;" u2="T" k="61" />
<hkern u1="&#xd8;" u2="A" k="41" />
<hkern u1="&#xd8;" u2="&#x2e;" k="82" />
<hkern u1="&#xd8;" u2="&#x2c;" k="82" />
<hkern u1="&#xd9;" u2="&#x201e;" k="41" />
<hkern u1="&#xd9;" u2="&#x201a;" k="41" />
<hkern u1="&#xd9;" u2="&#xc5;" k="20" />
<hkern u1="&#xd9;" u2="&#xc4;" k="20" />
<hkern u1="&#xd9;" u2="&#xc3;" k="20" />
<hkern u1="&#xd9;" u2="&#xc2;" k="20" />
<hkern u1="&#xd9;" u2="&#xc1;" k="20" />
<hkern u1="&#xd9;" u2="&#xc0;" k="20" />
<hkern u1="&#xd9;" u2="A" k="20" />
<hkern u1="&#xd9;" u2="&#x2e;" k="41" />
<hkern u1="&#xd9;" u2="&#x2c;" k="41" />
<hkern u1="&#xda;" u2="&#x201e;" k="41" />
<hkern u1="&#xda;" u2="&#x201a;" k="41" />
<hkern u1="&#xda;" u2="&#xc5;" k="20" />
<hkern u1="&#xda;" u2="&#xc4;" k="20" />
<hkern u1="&#xda;" u2="&#xc3;" k="20" />
<hkern u1="&#xda;" u2="&#xc2;" k="20" />
<hkern u1="&#xda;" u2="&#xc1;" k="20" />
<hkern u1="&#xda;" u2="&#xc0;" k="20" />
<hkern u1="&#xda;" u2="A" k="20" />
<hkern u1="&#xda;" u2="&#x2e;" k="41" />
<hkern u1="&#xda;" u2="&#x2c;" k="41" />
<hkern u1="&#xdb;" u2="&#x201e;" k="41" />
<hkern u1="&#xdb;" u2="&#x201a;" k="41" />
<hkern u1="&#xdb;" u2="&#xc5;" k="20" />
<hkern u1="&#xdb;" u2="&#xc4;" k="20" />
<hkern u1="&#xdb;" u2="&#xc3;" k="20" />
<hkern u1="&#xdb;" u2="&#xc2;" k="20" />
<hkern u1="&#xdb;" u2="&#xc1;" k="20" />
<hkern u1="&#xdb;" u2="&#xc0;" k="20" />
<hkern u1="&#xdb;" u2="A" k="20" />
<hkern u1="&#xdb;" u2="&#x2e;" k="41" />
<hkern u1="&#xdb;" u2="&#x2c;" k="41" />
<hkern u1="&#xdc;" u2="&#x201e;" k="41" />
<hkern u1="&#xdc;" u2="&#x201a;" k="41" />
<hkern u1="&#xdc;" u2="&#xc5;" k="20" />
<hkern u1="&#xdc;" u2="&#xc4;" k="20" />
<hkern u1="&#xdc;" u2="&#xc3;" k="20" />
<hkern u1="&#xdc;" u2="&#xc2;" k="20" />
<hkern u1="&#xdc;" u2="&#xc1;" k="20" />
<hkern u1="&#xdc;" u2="&#xc0;" k="20" />
<hkern u1="&#xdc;" u2="A" k="20" />
<hkern u1="&#xdc;" u2="&#x2e;" k="41" />
<hkern u1="&#xdc;" u2="&#x2c;" k="41" />
<hkern u1="&#xdd;" u2="&#x201e;" k="123" />
<hkern u1="&#xdd;" u2="&#x201a;" k="123" />
<hkern u1="&#xdd;" u2="&#x153;" k="102" />
<hkern u1="&#xdd;" u2="&#x152;" k="41" />
<hkern u1="&#xdd;" u2="&#xfc;" k="61" />
<hkern u1="&#xdd;" u2="&#xfb;" k="61" />
<hkern u1="&#xdd;" u2="&#xfa;" k="61" />
<hkern u1="&#xdd;" u2="&#xf9;" k="61" />
<hkern u1="&#xdd;" u2="&#xf8;" k="102" />
<hkern u1="&#xdd;" u2="&#xf6;" k="102" />
<hkern u1="&#xdd;" u2="&#xf5;" k="102" />
<hkern u1="&#xdd;" u2="&#xf4;" k="102" />
<hkern u1="&#xdd;" u2="&#xf3;" k="102" />
<hkern u1="&#xdd;" u2="&#xf2;" k="102" />
<hkern u1="&#xdd;" u2="&#xeb;" k="102" />
<hkern u1="&#xdd;" u2="&#xea;" k="102" />
<hkern u1="&#xdd;" u2="&#xe9;" k="102" />
<hkern u1="&#xdd;" u2="&#xe8;" k="102" />
<hkern u1="&#xdd;" u2="&#xe7;" k="102" />
<hkern u1="&#xdd;" u2="&#xe6;" k="102" />
<hkern u1="&#xdd;" u2="&#xe5;" k="102" />
<hkern u1="&#xdd;" u2="&#xe4;" k="102" />
<hkern u1="&#xdd;" u2="&#xe3;" k="102" />
<hkern u1="&#xdd;" u2="&#xe2;" k="102" />
<hkern u1="&#xdd;" u2="&#xe1;" k="102" />
<hkern u1="&#xdd;" u2="&#xe0;" k="102" />
<hkern u1="&#xdd;" u2="&#xd8;" k="41" />
<hkern u1="&#xdd;" u2="&#xd6;" k="41" />
<hkern u1="&#xdd;" u2="&#xd5;" k="41" />
<hkern u1="&#xdd;" u2="&#xd4;" k="41" />
<hkern u1="&#xdd;" u2="&#xd3;" k="41" />
<hkern u1="&#xdd;" u2="&#xd2;" k="41" />
<hkern u1="&#xdd;" u2="&#xc7;" k="41" />
<hkern u1="&#xdd;" u2="&#xc5;" k="123" />
<hkern u1="&#xdd;" u2="&#xc4;" k="123" />
<hkern u1="&#xdd;" u2="&#xc3;" k="123" />
<hkern u1="&#xdd;" u2="&#xc2;" k="123" />
<hkern u1="&#xdd;" u2="&#xc1;" k="123" />
<hkern u1="&#xdd;" u2="&#xc0;" k="123" />
<hkern u1="&#xdd;" u2="z" k="41" />
<hkern u1="&#xdd;" u2="u" k="61" />
<hkern u1="&#xdd;" u2="s" k="82" />
<hkern u1="&#xdd;" u2="r" k="61" />
<hkern u1="&#xdd;" u2="q" k="102" />
<hkern u1="&#xdd;" u2="p" k="61" />
<hkern u1="&#xdd;" u2="o" k="102" />
<hkern u1="&#xdd;" u2="n" k="61" />
<hkern u1="&#xdd;" u2="m" k="61" />
<hkern u1="&#xdd;" u2="g" k="41" />
<hkern u1="&#xdd;" u2="e" k="102" />
<hkern u1="&#xdd;" u2="d" k="102" />
<hkern u1="&#xdd;" u2="c" k="102" />
<hkern u1="&#xdd;" u2="a" k="102" />
<hkern u1="&#xdd;" u2="Q" k="41" />
<hkern u1="&#xdd;" u2="O" k="41" />
<hkern u1="&#xdd;" u2="G" k="41" />
<hkern u1="&#xdd;" u2="C" k="41" />
<hkern u1="&#xdd;" u2="A" k="123" />
<hkern u1="&#xdd;" u2="&#x3f;" k="-41" />
<hkern u1="&#xdd;" u2="&#x2e;" k="123" />
<hkern u1="&#xdd;" u2="&#x2c;" k="123" />
<hkern u1="&#xde;" u2="&#x201e;" k="266" />
<hkern u1="&#xde;" u2="&#x201a;" k="266" />
<hkern u1="&#xde;" u2="&#xc5;" k="102" />
<hkern u1="&#xde;" u2="&#xc4;" k="102" />
<hkern u1="&#xde;" u2="&#xc3;" k="102" />
<hkern u1="&#xde;" u2="&#xc2;" k="102" />
<hkern u1="&#xde;" u2="&#xc1;" k="102" />
<hkern u1="&#xde;" u2="&#xc0;" k="102" />
<hkern u1="&#xde;" u2="Z" k="20" />
<hkern u1="&#xde;" u2="X" k="41" />
<hkern u1="&#xde;" u2="A" k="102" />
<hkern u1="&#xde;" u2="&#x2e;" k="266" />
<hkern u1="&#xde;" u2="&#x2c;" k="266" />
<hkern u1="&#xe0;" u2="&#x201d;" k="20" />
<hkern u1="&#xe0;" u2="&#x2019;" k="20" />
<hkern u1="&#xe0;" u2="&#x27;" k="20" />
<hkern u1="&#xe0;" u2="&#x22;" k="20" />
<hkern u1="&#xe1;" u2="&#x201d;" k="20" />
<hkern u1="&#xe1;" u2="&#x2019;" k="20" />
<hkern u1="&#xe1;" u2="&#x27;" k="20" />
<hkern u1="&#xe1;" u2="&#x22;" k="20" />
<hkern u1="&#xe2;" u2="&#x201d;" k="20" />
<hkern u1="&#xe2;" u2="&#x2019;" k="20" />
<hkern u1="&#xe2;" u2="&#x27;" k="20" />
<hkern u1="&#xe2;" u2="&#x22;" k="20" />
<hkern u1="&#xe3;" u2="&#x201d;" k="20" />
<hkern u1="&#xe3;" u2="&#x2019;" k="20" />
<hkern u1="&#xe3;" u2="&#x27;" k="20" />
<hkern u1="&#xe3;" u2="&#x22;" k="20" />
<hkern u1="&#xe4;" u2="&#x201d;" k="20" />
<hkern u1="&#xe4;" u2="&#x2019;" k="20" />
<hkern u1="&#xe4;" u2="&#x27;" k="20" />
<hkern u1="&#xe4;" u2="&#x22;" k="20" />
<hkern u1="&#xe5;" u2="&#x201d;" k="20" />
<hkern u1="&#xe5;" u2="&#x2019;" k="20" />
<hkern u1="&#xe5;" u2="&#x27;" k="20" />
<hkern u1="&#xe5;" u2="&#x22;" k="20" />
<hkern u1="&#xe8;" u2="&#x201d;" k="20" />
<hkern u1="&#xe8;" u2="&#x2019;" k="20" />
<hkern u1="&#xe8;" u2="&#xfd;" k="41" />
<hkern u1="&#xe8;" u2="z" k="20" />
<hkern u1="&#xe8;" u2="y" k="41" />
<hkern u1="&#xe8;" u2="x" k="41" />
<hkern u1="&#xe8;" u2="w" k="41" />
<hkern u1="&#xe8;" u2="v" k="41" />
<hkern u1="&#xe8;" u2="&#x27;" k="20" />
<hkern u1="&#xe8;" u2="&#x22;" k="20" />
<hkern u1="&#xe9;" u2="&#x201d;" k="20" />
<hkern u1="&#xe9;" u2="&#x2019;" k="20" />
<hkern u1="&#xe9;" u2="&#xfd;" k="41" />
<hkern u1="&#xe9;" u2="z" k="20" />
<hkern u1="&#xe9;" u2="y" k="41" />
<hkern u1="&#xe9;" u2="x" k="41" />
<hkern u1="&#xe9;" u2="w" k="41" />
<hkern u1="&#xe9;" u2="v" k="41" />
<hkern u1="&#xe9;" u2="&#x27;" k="20" />
<hkern u1="&#xe9;" u2="&#x22;" k="20" />
<hkern u1="&#xea;" u2="&#x201d;" k="20" />
<hkern u1="&#xea;" u2="&#x2019;" k="20" />
<hkern u1="&#xea;" u2="&#xfd;" k="41" />
<hkern u1="&#xea;" u2="z" k="20" />
<hkern u1="&#xea;" u2="y" k="41" />
<hkern u1="&#xea;" u2="x" k="41" />
<hkern u1="&#xea;" u2="w" k="41" />
<hkern u1="&#xea;" u2="v" k="41" />
<hkern u1="&#xea;" u2="&#x27;" k="20" />
<hkern u1="&#xea;" u2="&#x22;" k="20" />
<hkern u1="&#xeb;" u2="&#x201d;" k="20" />
<hkern u1="&#xeb;" u2="&#x2019;" k="20" />
<hkern u1="&#xeb;" u2="&#xfd;" k="41" />
<hkern u1="&#xeb;" u2="z" k="20" />
<hkern u1="&#xeb;" u2="y" k="41" />
<hkern u1="&#xeb;" u2="x" k="41" />
<hkern u1="&#xeb;" u2="w" k="41" />
<hkern u1="&#xeb;" u2="v" k="41" />
<hkern u1="&#xeb;" u2="&#x27;" k="20" />
<hkern u1="&#xeb;" u2="&#x22;" k="20" />
<hkern u1="&#xf0;" u2="&#x201d;" k="20" />
<hkern u1="&#xf0;" u2="&#x2019;" k="20" />
<hkern u1="&#xf0;" u2="&#xfd;" k="41" />
<hkern u1="&#xf0;" u2="z" k="20" />
<hkern u1="&#xf0;" u2="y" k="41" />
<hkern u1="&#xf0;" u2="x" k="41" />
<hkern u1="&#xf0;" u2="w" k="41" />
<hkern u1="&#xf0;" u2="v" k="41" />
<hkern u1="&#xf0;" u2="&#x27;" k="20" />
<hkern u1="&#xf0;" u2="&#x22;" k="20" />
<hkern u1="&#xf2;" u2="&#x201d;" k="20" />
<hkern u1="&#xf2;" u2="&#x2019;" k="20" />
<hkern u1="&#xf2;" u2="&#xfd;" k="41" />
<hkern u1="&#xf2;" u2="z" k="20" />
<hkern u1="&#xf2;" u2="y" k="41" />
<hkern u1="&#xf2;" u2="x" k="41" />
<hkern u1="&#xf2;" u2="w" k="41" />
<hkern u1="&#xf2;" u2="v" k="41" />
<hkern u1="&#xf2;" u2="&#x27;" k="20" />
<hkern u1="&#xf2;" u2="&#x22;" k="20" />
<hkern u1="&#xf3;" u2="&#x201d;" k="20" />
<hkern u1="&#xf3;" u2="&#x2019;" k="20" />
<hkern u1="&#xf3;" u2="&#xfd;" k="41" />
<hkern u1="&#xf3;" u2="z" k="20" />
<hkern u1="&#xf3;" u2="y" k="41" />
<hkern u1="&#xf3;" u2="x" k="41" />
<hkern u1="&#xf3;" u2="w" k="41" />
<hkern u1="&#xf3;" u2="v" k="41" />
<hkern u1="&#xf3;" u2="&#x27;" k="20" />
<hkern u1="&#xf3;" u2="&#x22;" k="20" />
<hkern u1="&#xf4;" u2="&#x201d;" k="20" />
<hkern u1="&#xf4;" u2="&#x2019;" k="20" />
<hkern u1="&#xf4;" u2="&#xfd;" k="41" />
<hkern u1="&#xf4;" u2="z" k="20" />
<hkern u1="&#xf4;" u2="y" k="41" />
<hkern u1="&#xf4;" u2="x" k="41" />
<hkern u1="&#xf4;" u2="w" k="41" />
<hkern u1="&#xf4;" u2="v" k="41" />
<hkern u1="&#xf4;" u2="&#x27;" k="20" />
<hkern u1="&#xf4;" u2="&#x22;" k="20" />
<hkern u1="&#xf6;" u2="&#x201d;" k="41" />
<hkern u1="&#xf6;" u2="&#x2019;" k="41" />
<hkern u1="&#xf6;" u2="&#x27;" k="41" />
<hkern u1="&#xf6;" u2="&#x22;" k="41" />
<hkern u1="&#xf8;" u2="&#x201d;" k="20" />
<hkern u1="&#xf8;" u2="&#x2019;" k="20" />
<hkern u1="&#xf8;" u2="&#xfd;" k="41" />
<hkern u1="&#xf8;" u2="z" k="20" />
<hkern u1="&#xf8;" u2="y" k="41" />
<hkern u1="&#xf8;" u2="x" k="41" />
<hkern u1="&#xf8;" u2="w" k="41" />
<hkern u1="&#xf8;" u2="v" k="41" />
<hkern u1="&#xf8;" u2="&#x27;" k="20" />
<hkern u1="&#xf8;" u2="&#x22;" k="20" />
<hkern u1="&#xfd;" u2="&#x201e;" k="82" />
<hkern u1="&#xfd;" u2="&#x201d;" k="-82" />
<hkern u1="&#xfd;" u2="&#x201a;" k="82" />
<hkern u1="&#xfd;" u2="&#x2019;" k="-82" />
<hkern u1="&#xfd;" u2="&#x3f;" k="-41" />
<hkern u1="&#xfd;" u2="&#x2e;" k="82" />
<hkern u1="&#xfd;" u2="&#x2c;" k="82" />
<hkern u1="&#xfd;" u2="&#x27;" k="-82" />
<hkern u1="&#xfd;" u2="&#x22;" k="-82" />
<hkern u1="&#xfe;" u2="&#x201d;" k="20" />
<hkern u1="&#xfe;" u2="&#x2019;" k="20" />
<hkern u1="&#xfe;" u2="&#xfd;" k="41" />
<hkern u1="&#xfe;" u2="z" k="20" />
<hkern u1="&#xfe;" u2="y" k="41" />
<hkern u1="&#xfe;" u2="x" k="41" />
<hkern u1="&#xfe;" u2="w" k="41" />
<hkern u1="&#xfe;" u2="v" k="41" />
<hkern u1="&#xfe;" u2="&#x27;" k="20" />
<hkern u1="&#xfe;" u2="&#x22;" k="20" />
<hkern u1="&#xff;" u2="&#x201e;" k="82" />
<hkern u1="&#xff;" u2="&#x201d;" k="-82" />
<hkern u1="&#xff;" u2="&#x201a;" k="82" />
<hkern u1="&#xff;" u2="&#x2019;" k="-82" />
<hkern u1="&#xff;" u2="&#x3f;" k="-41" />
<hkern u1="&#xff;" u2="&#x2e;" k="82" />
<hkern u1="&#xff;" u2="&#x2c;" k="82" />
<hkern u1="&#xff;" u2="&#x27;" k="-82" />
<hkern u1="&#xff;" u2="&#x22;" k="-82" />
<hkern u1="&#x152;" u2="J" k="-123" />
<hkern u1="&#x178;" u2="&#x201e;" k="123" />
<hkern u1="&#x178;" u2="&#x201a;" k="123" />
<hkern u1="&#x178;" u2="&#x153;" k="102" />
<hkern u1="&#x178;" u2="&#x152;" k="41" />
<hkern u1="&#x178;" u2="&#xfc;" k="61" />
<hkern u1="&#x178;" u2="&#xfb;" k="61" />
<hkern u1="&#x178;" u2="&#xfa;" k="61" />
<hkern u1="&#x178;" u2="&#xf9;" k="61" />
<hkern u1="&#x178;" u2="&#xf8;" k="102" />
<hkern u1="&#x178;" u2="&#xf6;" k="102" />
<hkern u1="&#x178;" u2="&#xf5;" k="102" />
<hkern u1="&#x178;" u2="&#xf4;" k="102" />
<hkern u1="&#x178;" u2="&#xf3;" k="102" />
<hkern u1="&#x178;" u2="&#xf2;" k="102" />
<hkern u1="&#x178;" u2="&#xeb;" k="102" />
<hkern u1="&#x178;" u2="&#xea;" k="102" />
<hkern u1="&#x178;" u2="&#xe9;" k="102" />
<hkern u1="&#x178;" u2="&#xe8;" k="102" />
<hkern u1="&#x178;" u2="&#xe7;" k="102" />
<hkern u1="&#x178;" u2="&#xe6;" k="102" />
<hkern u1="&#x178;" u2="&#xe5;" k="102" />
<hkern u1="&#x178;" u2="&#xe4;" k="102" />
<hkern u1="&#x178;" u2="&#xe3;" k="102" />
<hkern u1="&#x178;" u2="&#xe2;" k="102" />
<hkern u1="&#x178;" u2="&#xe1;" k="102" />
<hkern u1="&#x178;" u2="&#xe0;" k="102" />
<hkern u1="&#x178;" u2="&#xd8;" k="41" />
<hkern u1="&#x178;" u2="&#xd6;" k="41" />
<hkern u1="&#x178;" u2="&#xd5;" k="41" />
<hkern u1="&#x178;" u2="&#xd4;" k="41" />
<hkern u1="&#x178;" u2="&#xd3;" k="41" />
<hkern u1="&#x178;" u2="&#xd2;" k="41" />
<hkern u1="&#x178;" u2="&#xc7;" k="41" />
<hkern u1="&#x178;" u2="&#xc5;" k="123" />
<hkern u1="&#x178;" u2="&#xc4;" k="123" />
<hkern u1="&#x178;" u2="&#xc3;" k="123" />
<hkern u1="&#x178;" u2="&#xc2;" k="123" />
<hkern u1="&#x178;" u2="&#xc1;" k="123" />
<hkern u1="&#x178;" u2="&#xc0;" k="123" />
<hkern u1="&#x178;" u2="z" k="41" />
<hkern u1="&#x178;" u2="u" k="61" />
<hkern u1="&#x178;" u2="s" k="82" />
<hkern u1="&#x178;" u2="r" k="61" />
<hkern u1="&#x178;" u2="q" k="102" />
<hkern u1="&#x178;" u2="p" k="61" />
<hkern u1="&#x178;" u2="o" k="102" />
<hkern u1="&#x178;" u2="n" k="61" />
<hkern u1="&#x178;" u2="m" k="61" />
<hkern u1="&#x178;" u2="g" k="41" />
<hkern u1="&#x178;" u2="e" k="102" />
<hkern u1="&#x178;" u2="d" k="102" />
<hkern u1="&#x178;" u2="c" k="102" />
<hkern u1="&#x178;" u2="a" k="102" />
<hkern u1="&#x178;" u2="Q" k="41" />
<hkern u1="&#x178;" u2="O" k="41" />
<hkern u1="&#x178;" u2="G" k="41" />
<hkern u1="&#x178;" u2="C" k="41" />
<hkern u1="&#x178;" u2="A" k="123" />
<hkern u1="&#x178;" u2="&#x3f;" k="-41" />
<hkern u1="&#x178;" u2="&#x2e;" k="123" />
<hkern u1="&#x178;" u2="&#x2c;" k="123" />
<hkern u1="&#x2013;" u2="T" k="82" />
<hkern u1="&#x2014;" u2="T" k="82" />
<hkern u1="&#x2018;" u2="&#x178;" k="-20" />
<hkern u1="&#x2018;" u2="&#x153;" k="123" />
<hkern u1="&#x2018;" u2="&#xfc;" k="61" />
<hkern u1="&#x2018;" u2="&#xfb;" k="61" />
<hkern u1="&#x2018;" u2="&#xfa;" k="61" />
<hkern u1="&#x2018;" u2="&#xf9;" k="61" />
<hkern u1="&#x2018;" u2="&#xf8;" k="123" />
<hkern u1="&#x2018;" u2="&#xf6;" k="123" />
<hkern u1="&#x2018;" u2="&#xf5;" k="123" />
<hkern u1="&#x2018;" u2="&#xf4;" k="123" />
<hkern u1="&#x2018;" u2="&#xf3;" k="123" />
<hkern u1="&#x2018;" u2="&#xf2;" k="123" />
<hkern u1="&#x2018;" u2="&#xeb;" k="123" />
<hkern u1="&#x2018;" u2="&#xea;" k="123" />
<hkern u1="&#x2018;" u2="&#xe9;" k="123" />
<hkern u1="&#x2018;" u2="&#xe8;" k="123" />
<hkern u1="&#x2018;" u2="&#xe7;" k="123" />
<hkern u1="&#x2018;" u2="&#xe6;" k="82" />
<hkern u1="&#x2018;" u2="&#xe5;" k="82" />
<hkern u1="&#x2018;" u2="&#xe4;" k="82" />
<hkern u1="&#x2018;" u2="&#xe3;" k="82" />
<hkern u1="&#x2018;" u2="&#xe2;" k="82" />
<hkern u1="&#x2018;" u2="&#xe1;" k="82" />
<hkern u1="&#x2018;" u2="&#xe0;" k="123" />
<hkern u1="&#x2018;" u2="&#xdd;" k="-20" />
<hkern u1="&#x2018;" u2="&#xc5;" k="143" />
<hkern u1="&#x2018;" u2="&#xc4;" k="143" />
<hkern u1="&#x2018;" u2="&#xc3;" k="143" />
<hkern u1="&#x2018;" u2="&#xc2;" k="143" />
<hkern u1="&#x2018;" u2="&#xc1;" k="143" />
<hkern u1="&#x2018;" u2="&#xc0;" k="143" />
<hkern u1="&#x2018;" u2="u" k="61" />
<hkern u1="&#x2018;" u2="s" k="61" />
<hkern u1="&#x2018;" u2="r" k="61" />
<hkern u1="&#x2018;" u2="q" k="123" />
<hkern u1="&#x2018;" u2="p" k="61" />
<hkern u1="&#x2018;" u2="o" k="123" />
<hkern u1="&#x2018;" u2="n" k="61" />
<hkern u1="&#x2018;" u2="m" k="61" />
<hkern u1="&#x2018;" u2="g" k="61" />
<hkern u1="&#x2018;" u2="e" k="123" />
<hkern u1="&#x2018;" u2="d" k="123" />
<hkern u1="&#x2018;" u2="c" k="123" />
<hkern u1="&#x2018;" u2="a" k="82" />
<hkern u1="&#x2018;" u2="Y" k="-20" />
<hkern u1="&#x2018;" u2="W" k="-41" />
<hkern u1="&#x2018;" u2="V" k="-41" />
<hkern u1="&#x2018;" u2="T" k="-41" />
<hkern u1="&#x2018;" u2="A" k="143" />
<hkern u1="&#x2019;" u2="&#x178;" k="-20" />
<hkern u1="&#x2019;" u2="&#x153;" k="123" />
<hkern u1="&#x2019;" u2="&#xfc;" k="61" />
<hkern u1="&#x2019;" u2="&#xfb;" k="61" />
<hkern u1="&#x2019;" u2="&#xfa;" k="61" />
<hkern u1="&#x2019;" u2="&#xf9;" k="61" />
<hkern u1="&#x2019;" u2="&#xf8;" k="123" />
<hkern u1="&#x2019;" u2="&#xf6;" k="123" />
<hkern u1="&#x2019;" u2="&#xf5;" k="123" />
<hkern u1="&#x2019;" u2="&#xf4;" k="123" />
<hkern u1="&#x2019;" u2="&#xf3;" k="123" />
<hkern u1="&#x2019;" u2="&#xf2;" k="123" />
<hkern u1="&#x2019;" u2="&#xeb;" k="123" />
<hkern u1="&#x2019;" u2="&#xea;" k="123" />
<hkern u1="&#x2019;" u2="&#xe9;" k="123" />
<hkern u1="&#x2019;" u2="&#xe8;" k="123" />
<hkern u1="&#x2019;" u2="&#xe7;" k="123" />
<hkern u1="&#x2019;" u2="&#xe6;" k="82" />
<hkern u1="&#x2019;" u2="&#xe5;" k="82" />
<hkern u1="&#x2019;" u2="&#xe4;" k="82" />
<hkern u1="&#x2019;" u2="&#xe3;" k="82" />
<hkern u1="&#x2019;" u2="&#xe2;" k="82" />
<hkern u1="&#x2019;" u2="&#xe1;" k="82" />
<hkern u1="&#x2019;" u2="&#xe0;" k="123" />
<hkern u1="&#x2019;" u2="&#xdd;" k="-20" />
<hkern u1="&#x2019;" u2="&#xc5;" k="143" />
<hkern u1="&#x2019;" u2="&#xc4;" k="143" />
<hkern u1="&#x2019;" u2="&#xc3;" k="143" />
<hkern u1="&#x2019;" u2="&#xc2;" k="143" />
<hkern u1="&#x2019;" u2="&#xc1;" k="143" />
<hkern u1="&#x2019;" u2="&#xc0;" k="143" />
<hkern u1="&#x2019;" u2="u" k="61" />
<hkern u1="&#x2019;" u2="s" k="61" />
<hkern u1="&#x2019;" u2="r" k="61" />
<hkern u1="&#x2019;" u2="q" k="123" />
<hkern u1="&#x2019;" u2="p" k="61" />
<hkern u1="&#x2019;" u2="o" k="123" />
<hkern u1="&#x2019;" u2="n" k="61" />
<hkern u1="&#x2019;" u2="m" k="61" />
<hkern u1="&#x2019;" u2="g" k="61" />
<hkern u1="&#x2019;" u2="e" k="123" />
<hkern u1="&#x2019;" u2="d" k="123" />
<hkern u1="&#x2019;" u2="c" k="123" />
<hkern u1="&#x2019;" u2="a" k="82" />
<hkern u1="&#x2019;" u2="Y" k="-20" />
<hkern u1="&#x2019;" u2="W" k="-41" />
<hkern u1="&#x2019;" u2="V" k="-41" />
<hkern u1="&#x2019;" u2="T" k="-41" />
<hkern u1="&#x2019;" u2="A" k="143" />
<hkern u1="&#x201a;" u2="&#x178;" k="123" />
<hkern u1="&#x201a;" u2="&#x152;" k="102" />
<hkern u1="&#x201a;" u2="&#xdd;" k="123" />
<hkern u1="&#x201a;" u2="&#xdc;" k="41" />
<hkern u1="&#x201a;" u2="&#xdb;" k="41" />
<hkern u1="&#x201a;" u2="&#xda;" k="41" />
<hkern u1="&#x201a;" u2="&#xd9;" k="41" />
<hkern u1="&#x201a;" u2="&#xd8;" k="102" />
<hkern u1="&#x201a;" u2="&#xd6;" k="102" />
<hkern u1="&#x201a;" u2="&#xd5;" k="102" />
<hkern u1="&#x201a;" u2="&#xd4;" k="102" />
<hkern u1="&#x201a;" u2="&#xd3;" k="102" />
<hkern u1="&#x201a;" u2="&#xd2;" k="102" />
<hkern u1="&#x201a;" u2="&#xc7;" k="102" />
<hkern u1="&#x201a;" u2="Y" k="123" />
<hkern u1="&#x201a;" u2="W" k="123" />
<hkern u1="&#x201a;" u2="V" k="123" />
<hkern u1="&#x201a;" u2="U" k="41" />
<hkern u1="&#x201a;" u2="T" k="143" />
<hkern u1="&#x201a;" u2="Q" k="102" />
<hkern u1="&#x201a;" u2="O" k="102" />
<hkern u1="&#x201a;" u2="G" k="102" />
<hkern u1="&#x201a;" u2="C" k="102" />
<hkern u1="&#x201c;" u2="&#x178;" k="-20" />
<hkern u1="&#x201c;" u2="&#x153;" k="123" />
<hkern u1="&#x201c;" u2="&#xfc;" k="61" />
<hkern u1="&#x201c;" u2="&#xfb;" k="61" />
<hkern u1="&#x201c;" u2="&#xfa;" k="61" />
<hkern u1="&#x201c;" u2="&#xf9;" k="61" />
<hkern u1="&#x201c;" u2="&#xf8;" k="123" />
<hkern u1="&#x201c;" u2="&#xf6;" k="123" />
<hkern u1="&#x201c;" u2="&#xf5;" k="123" />
<hkern u1="&#x201c;" u2="&#xf4;" k="123" />
<hkern u1="&#x201c;" u2="&#xf3;" k="123" />
<hkern u1="&#x201c;" u2="&#xf2;" k="123" />
<hkern u1="&#x201c;" u2="&#xeb;" k="123" />
<hkern u1="&#x201c;" u2="&#xea;" k="123" />
<hkern u1="&#x201c;" u2="&#xe9;" k="123" />
<hkern u1="&#x201c;" u2="&#xe8;" k="123" />
<hkern u1="&#x201c;" u2="&#xe7;" k="123" />
<hkern u1="&#x201c;" u2="&#xe6;" k="82" />
<hkern u1="&#x201c;" u2="&#xe5;" k="82" />
<hkern u1="&#x201c;" u2="&#xe4;" k="82" />
<hkern u1="&#x201c;" u2="&#xe3;" k="82" />
<hkern u1="&#x201c;" u2="&#xe2;" k="82" />
<hkern u1="&#x201c;" u2="&#xe1;" k="82" />
<hkern u1="&#x201c;" u2="&#xe0;" k="123" />
<hkern u1="&#x201c;" u2="&#xdd;" k="-20" />
<hkern u1="&#x201c;" u2="&#xc5;" k="143" />
<hkern u1="&#x201c;" u2="&#xc4;" k="143" />
<hkern u1="&#x201c;" u2="&#xc3;" k="143" />
<hkern u1="&#x201c;" u2="&#xc2;" k="143" />
<hkern u1="&#x201c;" u2="&#xc1;" k="143" />
<hkern u1="&#x201c;" u2="&#xc0;" k="143" />
<hkern u1="&#x201c;" u2="u" k="61" />
<hkern u1="&#x201c;" u2="s" k="61" />
<hkern u1="&#x201c;" u2="r" k="61" />
<hkern u1="&#x201c;" u2="q" k="123" />
<hkern u1="&#x201c;" u2="p" k="61" />
<hkern u1="&#x201c;" u2="o" k="123" />
<hkern u1="&#x201c;" u2="n" k="61" />
<hkern u1="&#x201c;" u2="m" k="61" />
<hkern u1="&#x201c;" u2="g" k="61" />
<hkern u1="&#x201c;" u2="e" k="123" />
<hkern u1="&#x201c;" u2="d" k="123" />
<hkern u1="&#x201c;" u2="c" k="123" />
<hkern u1="&#x201c;" u2="a" k="82" />
<hkern u1="&#x201c;" u2="Y" k="-20" />
<hkern u1="&#x201c;" u2="W" k="-41" />
<hkern u1="&#x201c;" u2="V" k="-41" />
<hkern u1="&#x201c;" u2="T" k="-41" />
<hkern u1="&#x201c;" u2="A" k="143" />
<hkern u1="&#x201e;" u2="&#x178;" k="123" />
<hkern u1="&#x201e;" u2="&#x152;" k="102" />
<hkern u1="&#x201e;" u2="&#xdd;" k="123" />
<hkern u1="&#x201e;" u2="&#xdc;" k="41" />
<hkern u1="&#x201e;" u2="&#xdb;" k="41" />
<hkern u1="&#x201e;" u2="&#xda;" k="41" />
<hkern u1="&#x201e;" u2="&#xd9;" k="41" />
<hkern u1="&#x201e;" u2="&#xd8;" k="102" />
<hkern u1="&#x201e;" u2="&#xd6;" k="102" />
<hkern u1="&#x201e;" u2="&#xd5;" k="102" />
<hkern u1="&#x201e;" u2="&#xd4;" k="102" />
<hkern u1="&#x201e;" u2="&#xd3;" k="102" />
<hkern u1="&#x201e;" u2="&#xd2;" k="102" />
<hkern u1="&#x201e;" u2="&#xc7;" k="102" />
<hkern u1="&#x201e;" u2="Y" k="123" />
<hkern u1="&#x201e;" u2="W" k="123" />
<hkern u1="&#x201e;" u2="V" k="123" />
<hkern u1="&#x201e;" u2="U" k="41" />
<hkern u1="&#x201e;" u2="T" k="143" />
<hkern u1="&#x201e;" u2="Q" k="102" />
<hkern u1="&#x201e;" u2="O" k="102" />
<hkern u1="&#x201e;" u2="G" k="102" />
<hkern u1="&#x201e;" u2="C" k="102" />
</font>
</defs></svg> wOFF     X     X                       FFTM        cGGDEF          GPOS      	-rBGSUB        cOS/2     `   `cmap  l    
4Qcvt   	   0   <);fpgm  	@    	zAgasp  <         glyf  D  A>  opRj-head  O   3   6hhea  O      $hmtx  O  E  Yloca  R     Ufmaxp  S        name  T    (g:post  U    ﰥprep  W      D"webf  X|      gQ       =    51    4xc`d``b	`b`@1  "  xڭMLG,miӏhc(4)1 bk?LIcҐx@WCXjEQ`	~A.zSNcv+m/23VIeg55ס?{޵[{>j6)yyٽ{)S4	EsNh/rE,LEْt͖ί-r4\:/xOT"H'ĻK?lV:_r )X	IOttJo2OuzMF=|NZ[! 9 o 3< p.n.%p`:܀pIG^cz^UyPGU~Iho?C 	|O)8O0?!Z,*H,l׀WrYrYrYrYrYrYrb{uYY!ќFƍA88GBDG4-Wúrju_23/Jtezjj`L&'~T@.Tғ*wU@%{YPPFC57͡ABgeͼkVh-D
);;+͸G;/bxgdaE0W`5j7&Zۼ6[2U,xU;vTQ?UovoY0:4tgϢE?~9ϢC?~>k9Ț#k9rhʡC+VZYheʢE+V,ZYheʢE+V,ZYhʡC+N6tl/C4-
m=/}i\/w*Cu3tbеkC׆]6tmеkC׆]6tmݥ,UE^xb[:Tfdh[0~fzӏ*:mή!vة=G?Η8MYxb)s_zN[{+icc-+KïP*YBoMvV&4q۽V.FڢvNR`j1V^}Vc:z 46]6kDzc;~XZV}O\ xc`d``bb``qq	aJ,aPI/JfI,c``aH`c	00(0I(TƜDYz"z`h;fO`ڇH U22x g    >  3  3   f @  [   (    1ASC @ ff  bS      H     xc```f`F 1,/%d21g4df`:tBBE%%Yԧ /AA@ABAM#P?G|plzmX?v+W`sprq
	KHJI+(*)khji[XZY;8:9{xzyGDFE'$2wvO1o%˖._z՚mظym;ٽwCQJj/ʲ:f130]SðbWcr[ u#oܹ{NG<Zz{'L:aʜ;Qp
 0>  xc`@kz@uO"Iײȏgpa _!"xڝUiwF$%u3qȄ-0i*v!]],t;Y)#?6'GΛ\cDOq:Tr R>屒 nV)iDl7;K\vr*3%A£W' H4IO?I8(I)8f eJ^R6â*Ϻ`r#\^mq:Im=Q@*F#)9QRRZL~G22e+*u۶uQ4SuFlGDy6N'ζ/LQvͶ1p)%3}tHXձ
ng$(Uy
Qo fg/.dE@np/X)Q\EHJOĉ>xA\P"̡+ά54^coWJMIFSw"Y8Glk>Zݽؑ9qwY'󴘯.7@<)\ڷLQ}eSTh*)hM1M{5wL1C{H#9!7MrӾܴ 7Bnr^@nZܴ+Fu4Χ*idø5Y5ɻ!u*Չ/ȥ\\wiݶv_Z3ꆭ70Єo7uXsPA`R (kN q9MR}14}/{<8-]ZDuܘ=[Luud[1+Iyv%UVދj|dpCh=v)MyT)JepʃZĸujkz!H)]ߴwkxt#9Oq(x~tm^naJ>S}TV-5ͺFNXZ@MHU11eM.oZlUw}sv_esȺڠ\s$E@얬zg2c9u/LNYhS*˖]nˆ9vGhlixb{]\ 84r&6]zjlΕD]s8K7Ǯ|`=ȹpr>%3rn|N!%rCG#r6$+rbrrn<&	9_CB6&Pj6k>}`هzdK"RܘPR_,"v$sah     xڥ}	`E|W&iΦ=4hӃr5CJ[ܖ""r%VDXXD,,x *ȢOXWUf3ߗ4-~Mw̛w{DP)Bd4	HAǨc_9G~De|@umRB&Z-T|hS\:QR ^ÃDP)Z-={ωq:dOj:=
sKzsaY@">b*H!M,	 sRQDHTDE``-XnEm'ěP[ba_l>?<#̗Q@@t 2,$	^o,1!&<KNJl$ź o5'@ ο//'_q}ry%=W^ɥkYgW.ĺqbzNXD.xZ+:}ͧ{q%\Դ\46Qu`QlMKlg6g-!
DI5#$a9̨4!~W00<F`W!k!+NO^j//	p^n~AR}$·|qYX4ZRq<ȞǶl֯ꡋO7X=ۼ{-m; Z5ޞs	}ӹI2`d^d-o,#'rho.-i$ yBAOQDQaYvʥ	j:pΤ>#UUk;dԨL#ƟcxRe>p6f妷z]=~vUomްrcnu*+*+37غOPz!S$쫫|qҞgӞs嫫Bʵ~|'MmF:/yhz'wE%,bK
ؿ@ ES1~4HHR)d!;49*KANz`h{N6#ՁԃjPp\'
̘ޱ`]Cl	[+tO{Gm;v.Ǚ87cF_߾.skOMslMag|tNgO7ЏԌ|1t.✊8&#bT>WN7<gB@4HDȈKcĚi
2isyIu;]aŎ[H6w9?|K_'\a.cx6E\BO-/16bܺnǊk&.39͆YvfXL(^>6ˆdS	1ULPK+Qgr\WE?ݿcti"^);)Q֎½M+ n5"fyA$D"F %ҋQĠG+Ot"޲Bp=BG^Eg|t(-1.&o<:F`V^UGEǏ͛t54dc+ERD&[UGWJ5iǃ<=ЧQ<``
Br{aŅ^Jz.Rpֹ3.b%)RΘ `Jzb7b߿.nkCv0[*a'*eJZ 6?ǆVWjvWc%<OiAc
2 p0K>jF==3V|O9smg8;읆3a`Pe6`A\ Օ֖y8 P|*AA8ݢ/_xjmWȷk۠XA}	 ߇
S`a?Mb1 ]8WeCSLdYLNLcUOGӿ81\:u{Npt=ÿ^7⨕t1}ixlk6.@n~=xV#PNaؖ⶝&.EVl/+\|"XHHt\F㲵Ǎ5TJuG%@Ȯ~05 X:$ 	n_h;`|&H(+UrDyR9ǀUw37*d}2iaw'.Bw07P:hGn;I, {7\O	uAi8P$ZdY. Dm`Kc]Im\iiin'U m9.' y@ijO3 wjρhW~y
zk֓9Ǿ&^'^g:rg[LaM32ee;r?mjagaЎNɨ+z)qkgU#1 u@y,UP(_\4FiLQ(lee""^	!/l1N!Mjl9g6>Vǖ.Vzbҙ>pې?=tcW~'^^w'U#.	_jk) |-%Y"r5C0"-6g\lrb7Λja-1H/=ܓE6#eoдW?CM>v~X#6+_/ns}鯸~u%ȮGPI& q<T̵$>x<\7GZ+ClŬCҥ -:t!aȍ5hfP0BVAth]7Eo7{ mSŌ"D{\7_~G '\Qc Zd`f
nߘ5[8J)_޵|9Y <zDr|GB(b@dDlԻPZUuB^Or"2dpXrVCV'0w>w^~7	=+(8śtܱ=Mwiw酈XwNSo >yZ9A花-QVdD; lX /hD;@* k0$ >z@~=x=^/A`67"%8\#4OHL_8eO
g#͝#0#vTkgyto#m~2=ctx%F|woVcbhĖ/g?g鑡+<AEq!,pH@ͨS +Q
@H\t2ufG2,z,dEG
jKא":؋юұk1t鴫Odn-tN_3s%H<f
G.BlllJlrj]Fȝ"2e㶻qXsoP\?]6<k8Y:g	S̽'6uR<гg}9u zpĄbf+Bѭ9	rh 3Bc
T[\[?ǥ]_a/_tD|}޾uL7+Oquu~IÀ_:dzS3Rƒt}ZVw
@<V
<Ig5t2~4 :;Ct	}'ix /
xaDIT-k%I!30/sB\2*,m/"գ@27<Er0?YOMڨԝ.pkE# H
i|GX<^TYaFߢlw3}6Շ/V=Ʊ	z
<3|UJɜ)DU0<]$}_Jo'e@#O4|[4CZO׳Pt>1/Jz	lwD֠Mg&1:SP<!G8W´Îˇ-9&J'.f٬v=Xa?:zs}=x:@X|$GʜeHNʛ<	IcTd]l";j`6,rdX7XHBSvdIU'~@oeaeԢ3oެFɲQҡD୰ok߇ \3xbQC*;0u5p ,Rβ!QG	̇' L-7EnU~SPd<+LqtcO~?AkW	x986k|ڴbXV(Js<*y8V9z<6Ez	\JwqZaWC&0!P	{%°rs?}^)%_ҕŴ#gF`8ėzv#($
,T.h6k9?DEL!fku:Mgjؽ祏;g'֬Yt^
'9bP蚽}O*`!SB$>
Iؕ[ڸr{{Y蹿;g΋'ć%/>`Lym|Tن30fpv1l#?`0KbŮrɊz-Rƍ^9
[d)8$DoEV#1~:Rs]*-)/ןzSҡۯOqJ8"a0Z8Gbd!1x8KjZ5xS[v>q]N2#,]Ҭcb.բadogsk ~3tsl} yF?s|9󷾶/םX>T1q	k_Юd|Aڕ,
#h%R\{	`iZsf؄ O%Gh^w\"OR5sq=~$-	JsVfZ<wEvA/7,$-7m^|}*7u.!˴ ^ȭ !Ú{B|^nzLꚛpG.?t#<pc6;$Lvyx!_dx>DtbˣmdfQd~RqMt%=@|Ɖ F/
8OpʒXq"5:	(Ubl&\X!y화iŋ9{}9mq84(`b>?iXldv Ř=e\cCuXLM
8JIOKHqiO /Y<\ՒN7';Xܭ+ꁧ^$SX'c^>_w{uxE.]0r~}37S{<SvvtzYj_Hk昢
)
`J,&	q%<0QIcN`dO9 Nc%TS	!<5wifȾf̮fvKZq8H*_%;vx/߼|r:
qCa 	p¦{1.5a!xCJbt!"XAgOXFlS]bз>캾/X buyЄ4-@i	))괽XdP!	CG46=!ΞH?1m;39t.wİ&.~~pyI7o_ugp:w|敳 ųܡ<A%kA**Lzb]xg|)ʠJyul|'a%>z۠Izq}ͤJnǝwtTn󽛶?,'#6bQ0)DI>A=ymhfqZ:=i4S<[s }8;ff.5ڛu<=Qk
POrB0QtKm0xPeBXY*@
OML^LX	,Vz@.Ꮱ[?H|sͣA \%1PoKq2>&U]yvհZ8UGy81LYo^\
L^Z{79gǙ}'zy]!Ykcunyv:9orUng}Ӄ.C)TnGS0lfdh<"&
B#&x'Ťڭv6ªn15!<?=QW3dq4yc>:/cHA#^~7j;щe .yNyB^_quu۵ҥmb_Q߹sAi-uy(uEDn uT	 ɠI]Nk4(Gg#{K$;*f1SD]DX:qC .-V˵E{	57S0dmv<4S]E[\9}KyvHvqx6
 th|`&x(TE'.o!ײvgl3=h,fDɄm2^P	wa'<X:1[kIJ5R0x뱬< p[R vefu1MqT7k놺fo[[4AqOƃtGg}^m֖?:t@CT"v`+.t7<u_9j_"wS'O]u*j^L#r Q&yȲ!q,Wэ/~g}:?`'p2;_?tz~&
q"h\swK`yh$3BwƱŀ+tǸ-fD$f[sҘq˘Of[ۿl_䓎A壇rn2ф+Gx|޾@cmr$
*^Hd -VYQX8h40JJJmdsNf	hFui)rq2nu[7{|2G.4}/޺rP__{?h*eV"`o!y JV`Vx@RM.l0#el~^BLvUv]H6}L܏0h܏릹 7ݧH?{o:Xp'7/(Yg_rז*F(rw%[.-׳}y}e%7}CvK1;seB"K@2T`6G@$WTp|aEbk_0}uޣqꨙ&eɊeI玫ktFط.cLB\=q}4xɭ߅*)ިp(R
)x 'gzS,}~dϑQ(B 7~&{LHމۭ-SD|ݏ:7ef]̿aYၤ#܅y۰7o,f	pAmv;v@
;ŋLh@ŎIg_龎EeN7١=/Ȣ瞻38_KѲ3jG-8Ɂ6zX~sµľf))#tK؍SLc$H+U,>FK	0wtD."K(1-,Vk,'U(xv w09 T+(s[w`Dx=ŭWi,gU,jzr?ѿi%_?L.XxjOHԵ#B#Vn`v (ZQ4ufiz~'+si>xeđd%߂;VW"#G㜭{W'>pZܖBf&V})~|)v~Z%;~jTצ/j^]UBA&*00"`7(b!+Epʑ>ǧ̸w*)]};cFUU=@ȉ8c6 .VƔ5DGcPę;"UjQ>l/ra?Lڔ삕qyN*1>طpr$=m$
ku/G^ 5cK:$"F Qx tVTM^,X'P7??Z8CPFٚKb|.눈v,hsZe2)u`;4+2I9W.:;{={w>̪˧Ik]۵{gN	&`D^IөY~hv5'#*V 1ݷ;=		ׯ}H+Jzq㗵߲nԳX]-ҳ
o1@.e -k#	qGd%m4Wb/3͊  a=o騥O\~~\>qKG.`6c;9#v⑏L.xli;wqeg1,bD<Xb2\As݀Õ/x>:5ܝB#_?M`5&$B(Qx̛`9!`gC_:y\55?SSO?;gVND٨;*؍0}6&AX hBΐd.	M!j޶|¹5<}at5CoWyQOts-_-_W/)^3׿X:Dvʐ9+}|	]*J7N*c𺕛{nfӡK^6Bx<,TKYqLΒ˨AGC^7 ݛy^o45Cܜ;;\bQ>=пUmtX=Ƭ`ɶonNvim5kXU8j*Sż<C9Dwm?'*[:y&~ݏ_~hV7£b_ҝ;_g݇=^ؿ~ٷeά?:|#7hݻggcr[pқ@2zXe	`o"_MV%ڄuHR@]HCM0(0T7CFA(PRXN`E}Z_LfI9usqĎ\y-O0:si}w3nI[ylQ,dtBpu÷ʹc+ث~+CgcٴfOpL^t'}ޘ#XvDx)|L2gyw*=y
~?Gxпv&^,ڄVd[&Fߋ	DW<
<[
cRu[δClfA=`!'䕜l?C^}v,m~7%\﹬lnǅ)~7EQvt0\~SZ5JsCE vl\xpeӧWL/<tpQʆEӦVTNSĳ^K*w5g

V*I2XŤL&bSޝTUWĲ*uO:)pi?,(h?!Gc7YMU(wlE^_~>BU1t̀^9æ,l#O3~I!A]`K'b֐I(K|`_77Oh;<	OkYo74N4c_Μ}׸:*Z9jv˲\w>ҝk'*^?ՙ/p3_w@yƳ3_ZŚ@5+ӔLﱿ\wxb4>|F׬>f0"pB͆$ngw\3>ʫ=O-7LvPWk/ǃgFVȹj\06/FeYC2ٱ!|휄XO;crb˷Dxo,^U{Ջcْw?GgE	~۵X*. \lwu ->BoG6MŽzwԁ)ӯV3x>Dz0lr	KT
Jn\:h{[@/gYL$T?7.5%ҡd;G6){v(UT	a%SP/u޸ Q=iIw:|ɧ ;kLYvlwk;>=.MMwx31I}xT/:)GUg;uN:tVd",2<*e(AIX ފ:8JOtZ'ŉĠV9)
,:		'% <rqXG"eFe .Ra`nlK68		YB5CU"epn4E~4p?jA"3F@P:bQ*uv.FDрuQ7kLBZ%fv%7yPUmgɹ^onNgs ?-TBڲ3x}sՐ~XJ%|^w2<֎5Mw,K#B~r{1s=@Yخo<'P?gÜ=Xʚ;i'Uw68si@ [3^Lgk!*izkjl) H5- 4E@Rg􉙷1-Va8-`5, ȿ#.a0N"(MpY@̠[@E@IJl	c+8@ӗl= W-zD$F[@  7-5%1!.6aY}0͑0`֠Y(Ra*XM<>X-Dh!&*D]]AH!+tA	̙ C4@.xlNƊi%JePn5k&<8PJ6A[^O
Hb
)^M&Z+9?t:њi}l@+@dqFz D _ ì,JD,JϵܫU~DXUzMf".]|&AY<sL[mcQdvk~!áQ[?LD+0ߘ;?t0	a 6 2i=4:ҜU"۫z-N%jQ>J!ln/^@3jjh<lZh6uބ&E<u0[v(	DO
ggi&U]As}hId.#kCS%ızv'SduҗĻX_b9[V\WKQ7yCjW*YKN%ǟ"Jsl`ǃ7sdڭDגt9EZjˠT:YF5(z?zHd[o֮aRccl޾a5p={1z%G4G]D$>ܴYa#hq9ga:gRxIXŜ1I sR2괊;3<gVsB[`ΞnEtX'h9g:g|\`;91S|' *V0j w`ASUa	a&/D֗sV/MwQt<ǈ;;h<z{t^kqGf	ӃFRHNrt2	Pl8 !ޮm=GM3~ X|8_?bݠZ&֬rnk^i78z@u_5hI|kYl[1l8k[nc;WW饣|t$7p6/JrmT۰cOSTVBgycfIpyOy0oa ?)ZN[9k&2(g<SSշFnaNhv"	BjEa1a٤LhkJ R:e'w@ts-*6]͡'G/8xmo/UzB:Ԅfc𚙦omr2ĲڼfƆ1+Vkf_fXiDPK->]^\}֟"ߪ:uL{	WF
^Ǣ%1nͰ	}n_9M.BŽG?l>K)
wncO-O]>&px^ِyxf:+4@F%z*ݱڴӥ8^'VгכKx!㐏:}҉[w;xCTn6	Cm8u<،əFìLNCf:n 2nAutz@бC'?Dhw.HD>*0
xWɈd[߄Srf3ǭ8B/!
B2ЍщF݈a0(G!s͜$y}錨]:;vh.{+əʹoE[ͧLn-5gٍ
u(820IcFN%n]s;uh׶roОihFFQzp5tbToIG@3P.ꊖj %QNƲbY(vx+JHadHR*B	[Ejh[uUg~^a缮]inY)pd&bE$L1ѧr9vy{}AeʡM~cS/<lǏ^"(OS;2sh߿O3=o-=$mLַ`:j VL3
$!PeatD,JEm?D`C[MӣFk_FDhu ڛBd622u@ƺZ4{κY[:bXU3 ï:vQqDf\eWqmb.\i)\O.X<makh>mȔ-W0texMqUsDC!l Rp*\4`OMq'PXڥ!-'ZmiI8$zLz KIl=E ?iVS
VB=ޠZArpHM,3NRV]>p(-ań239.7 +Y]X52Hf
eOf?awce7);Ȋ*YŽ8qLk<)IîN ~ 'A+M`>Z,;
+}:^W6Fmg7=a}=IKWl,?xy݋{dϼ#g?M>?t?~ZSĠ3dEW0(hO1Sr[>"zeϊ1ܳ"l6NNjsduifǙ9U]Byx~ hKnڷJoHQu,sKس2<EW`ߐPj[O*;u=߄rSKCE@qG趱é;aH:IRzRSpIqd+nމxy24nr!LiobG*fN(څo-.kZ85?KWnwG?u/R("?h?ppz1qEX$g,jٝ:	籴rVWYj}F-ƫ[fT3<|F?gSϪ=Xf޾hFk7g"Y{/u=0u罎LI^s*)a΍2hu@*CM V-MRzo׬~+bf-)N-+9)>wu҆мf%38aFo2;iBqYkjTpR7cW母aNUo&>6WT/O9°&pmZEd)
j*4#YB̋6y	74$<7U{
S{1GŪZއ{S<4Z2V}@Zo27_P> ˺)b"b8'օPr+56՘ZִTU~Ty\1i֐bMÊk.|(dw&w 4Td"CC#3|p.2=]ìoJ7bK'3,QCTV`x_sKRz9P2
I`a-cuˊ$WtK%pЮIP/h57#gJ^&	=uk~Y05?eO5CQ8;c!irJ<Wq|fCkeMI_O80q`@|d`c/	^kp5^RO,nr3;dq8JBP60c@i+^vq Aۦu쐙>eF,$dΔԴB6YȆanjy=-L׋O_tߨ'{3Omtcbk$a3flz~П>Dg{||)}z]zqnD͇zfPzˉYvE8fS#Eaf}8JQhR%K^ɺT58vVj:axzqDW]=f[b2-^*X$rLXYb^$5dҜInNpxw_ܭ0t`cN=sEOwQVW! ;Ft:Xnv+S;V&aDXߌGfRs汦#:oJvq%o[9[sr;/F҇\p򻩒	X묹TW>gx1c;-
'bc#H0<{?Akm8ݝ@P4'~d^l&E.# i7ŧOzw~p h&	لma7jQ6Zm22#o|v? (ĵѝLN/9E"#v8<΢sp?W!
3ǎ</̔?/BT1m1B;3I9\ƤO"Ko[&Vd?QYOkݓfL<|3?Ν`gSiixO+qme0g|%*\/V/fXLo$=$##\gc{x\x΁E[;>/bM5ϋp~ǐ}@ R.SX3cQfpӓ}j@^nYƤaZz/޴b^bvޚ@Joїe>\:0YӰ̼>ӬU:,(j>cmW?O#`)WWK{$痠tnU>Iq2^OߗW ېz-q=1=gm^_rMli:t:)޳0ڞڗ-P>m̊O/\ZM,-s8Y^
	/4 l;bu@
-X^Hj̓y	#sϑdi<ϯi/Γ]55ͤZNϑxyx?=zkM}4Qk7iV>_d_gal9Dcn;e a`
݈pnDb+_Vi!v^cP%Vz!_W0z؝iZśqvgA& f^^Q"^9
nuWMu$^7(}H&&f7vAPQ:>4"t*0>tُ",lĤYIGQH3X]sQt͎VÐ0EQ	%AqH4o
47sU-5_%8UفQ$u"x
Q׃jj&0l/s(܂uʠxp3^tB-G"yc&=}z.Fw.  xc`d```5[dx~ p	WO}{1 jiq xc`d`HH2W;(>  E xmOd\Qƿw}TUCQ1"1fcii1*C1".jYFvVdS1fQ5bjW]D.F;735,~wϽsw:l $ %cKgp6xm~F9DCQ 9S$O${BIi޸L*v}bOaŽhCZNq|ʒ$ZZ^@M8WB,ޛ_ƨF`Vyuc/Y05mқv9F?Nu"&HyQ^n;k$n:v}$9zmc5
f0lR#(},;{r~}@7dL-BIu0(^bqW/ṍ5"I{߈jo	h&{},>/lܔo; *^b
o(Z/_=rbQe䞉z_>R׾3V~S8|%pJO9'
|[F,^>bD9*dεٛ^%[&lw&C/_1   xc``ЁqLLL1]alƜż#{29'X߱m`{.n^~c'gk\j\~\i\Sq> '^).wxIY%U-W_F@9!!	B	a)y"':GX
bN-HaI.45&IIIo$N&GMfY%?&m{%/&"?AAH!Ka9E&E<EOf)R\<CJJg\93T~RQsQSPR?a1OA3ME+Jk6v,s:,:V:1:;ttt{t1їOb`ap!#3IFp@c%ccLLLL:LV{&L~.2`cdV`v| t     B  >   z  n  4   xڝS.A==XEʂ3HDD!Bi/`c|OpVySιuj }x@B WЋmV6[2֣]AaK{[x5	y,#BѮsq+֠XG:H71zWɎɫ1%j5?)\l9ء):zaT8'UR9l|=lS,R$K&5=
GXWśHF*Z&GrZ }>fp+>̻S{-w2\ՁѺdW3*NW]w%fِjBD<թӫF߷Y	ޟyr%*wk)=XcWɛ_bsVdh}]w8eĳ'?)d#   xmUlqm]۹N놷ݝV	^nI]r#HD0K$HɤJdIKPHŔPJ+Zӆ=H':Ӆt;4tذSr*AOzћ>N\70AfCpF0Qfcx&0ILf
Stf0*1p*z=İa61Xr_78]nsYfܧ;1x#>'<vg9<jc̧ XB,,gJV|xINq׼I$H$IHIdHdI69y.p8*9\:W$W$|)"))5j)TX,]Ҫ++ÍJM+JҮ,S:55W_(XS]菔tODa3Cĭ"ՕVr[9yR   K RXY  c #D#pE  K QKSZX4(Y`f UX%aEc#b#D***Y(	ERD*D$QX@XD&QX XDYYYY D Qg  /**
 * [js-md4]{@link https://github.com/emn178/js-md4}
 *
 * @namespace md4
 * @version 0.3.2
 * @author Yi-Cyuan Chen [emn178@gmail.com]
 * @copyright Yi-Cyuan Chen 2015-2027
 * @license MIT
 */
!function(){"use strict";function t(t){if(t)p[0]=p[16]=p[1]=p[2]=p[3]=p[4]=p[5]=p[6]=p[7]=p[8]=p[9]=p[10]=p[11]=p[12]=p[13]=p[14]=p[15]=0,this.blocks=p,this.buffer8=r;else if(n){var e=new ArrayBuffer(68);this.buffer8=new Uint8Array(e),this.blocks=new Uint32Array(e)}else this.blocks=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];this.h0=this.h1=this.h2=this.h3=this.start=this.bytes=0,this.finalized=this.hashed=!1,this.first=!0}var e="object"==typeof window?window:{},i=!e.JS_MD4_NO_NODE_JS&&"object"==typeof process&&process.versions&&process.versions.node;i&&(e=global);var r,h=!e.JS_MD4_NO_COMMON_JS&&"object"==typeof module&&module.exports,s="function"==typeof define&&define.amd,n=!e.JS_MD4_NO_ARRAY_BUFFER&&"undefined"!=typeof ArrayBuffer,f="0123456789abcdef".split(""),a=[128,32768,8388608,-2147483648],o=[0,8,16,24],u=["hex","array","digest","buffer","arrayBuffer"],p=[];if(n){var d=new ArrayBuffer(68);r=new Uint8Array(d),p=new Uint32Array(d)}var y=function(e){return function(i){return new t(!0).update(i)[e]()}},c=function(){var e=y("hex");i&&(e=l(e)),e.create=function(){return new t},e.update=function(t){return e.create().update(t)};for(var r=0;r<u.length;++r){var h=u[r];e[h]=y(h)}return e},l=function(t){var e=require("crypto"),i=require("buffer").Buffer,r=function(r){if("string"==typeof r)return e.createHash("md4").update(r,"utf8").digest("hex");if(n&&r instanceof ArrayBuffer)r=new Uint8Array(r);else if(void 0===r.length)return t(r);return e.createHash("md4").update(new i(r)).digest("hex")};return r};t.prototype.update=function(t){if(!this.finalized){var e="string"!=typeof t;e&&n&&t instanceof ArrayBuffer&&(t=new Uint8Array(t));for(var i,r,h=0,s=t.length||0,f=this.blocks,a=this.buffer8;s>h;){if(this.hashed&&(this.hashed=!1,f[0]=f[16],f[16]=f[1]=f[2]=f[3]=f[4]=f[5]=f[6]=f[7]=f[8]=f[9]=f[10]=f[11]=f[12]=f[13]=f[14]=f[15]=0),e)if(n)for(r=this.start;s>h&&64>r;++h)a[r++]=t[h];else for(r=this.start;s>h&&64>r;++h)f[r>>2]|=t[h]<<o[3&r++];else if(n)for(r=this.start;s>h&&64>r;++h)i=t.charCodeAt(h),128>i?a[r++]=i:2048>i?(a[r++]=192|i>>6,a[r++]=128|63&i):55296>i||i>=57344?(a[r++]=224|i>>12,a[r++]=128|i>>6&63,a[r++]=128|63&i):(i=65536+((1023&i)<<10|1023&t.charCodeAt(++h)),a[r++]=240|i>>18,a[r++]=128|i>>12&63,a[r++]=128|i>>6&63,a[r++]=128|63&i);else for(r=this.start;s>h&&64>r;++h)i=t.charCodeAt(h),128>i?f[r>>2]|=i<<o[3&r++]:2048>i?(f[r>>2]|=(192|i>>6)<<o[3&r++],f[r>>2]|=(128|63&i)<<o[3&r++]):55296>i||i>=57344?(f[r>>2]|=(224|i>>12)<<o[3&r++],f[r>>2]|=(128|i>>6&63)<<o[3&r++],f[r>>2]|=(128|63&i)<<o[3&r++]):(i=65536+((1023&i)<<10|1023&t.charCodeAt(++h)),f[r>>2]|=(240|i>>18)<<o[3&r++],f[r>>2]|=(128|i>>12&63)<<o[3&r++],f[r>>2]|=(128|i>>6&63)<<o[3&r++],f[r>>2]|=(128|63&i)<<o[3&r++]);this.lastByteIndex=r,this.bytes+=r-this.start,r>=64?(this.start=r-64,this.hash(),this.hashed=!0):this.start=r}return this}},t.prototype.finalize=function(){if(!this.finalized){this.finalized=!0;var t=this.blocks,e=this.lastByteIndex;t[e>>2]|=a[3&e],e>=56&&(this.hashed||this.hash(),t[0]=t[16],t[16]=t[1]=t[2]=t[3]=t[4]=t[5]=t[6]=t[7]=t[8]=t[9]=t[10]=t[11]=t[12]=t[13]=t[14]=t[15]=0),t[14]=this.bytes<<3,this.hash()}},t.prototype.hash=function(){var t,e,i,r,h,s,n,f,a=this.blocks;this.first?(t=a[0]-1,t=t<<3|t>>>29,r=(4023233417&t|2562383102&~t)+a[1]+271733878,r=r<<7|r>>>25,i=(r&t|4023233417&~r)+a[2]-1732584194,i=i<<11|i>>>21,e=(i&r|~i&t)+a[3]-271733879,e=e<<19|e>>>13):(t=this.h0,e=this.h1,i=this.h2,r=this.h3,t+=(e&i|~e&r)+a[0],t=t<<3|t>>>29,r+=(t&e|~t&i)+a[1],r=r<<7|r>>>25,i+=(r&t|~r&e)+a[2],i=i<<11|i>>>21,e+=(i&r|~i&t)+a[3],e=e<<19|e>>>13),t+=(e&i|~e&r)+a[4],t=t<<3|t>>>29,r+=(t&e|~t&i)+a[5],r=r<<7|r>>>25,i+=(r&t|~r&e)+a[6],i=i<<11|i>>>21,e+=(i&r|~i&t)+a[7],e=e<<19|e>>>13,t+=(e&i|~e&r)+a[8],t=t<<3|t>>>29,r+=(t&e|~t&i)+a[9],r=r<<7|r>>>25,i+=(r&t|~r&e)+a[10],i=i<<11|i>>>21,e+=(i&r|~i&t)+a[11],e=e<<19|e>>>13,t+=(e&i|~e&r)+a[12],t=t<<3|t>>>29,r+=(t&e|~t&i)+a[13],r=r<<7|r>>>25,i+=(r&t|~r&e)+a[14],i=i<<11|i>>>21,e+=(i&r|~i&t)+a[15],e=e<<19|e>>>13,s=e&i,t+=(s|e&r|i&r)+a[0]+1518500249,t=t<<3|t>>>29,h=t&e,r+=(h|t&i|s)+a[4]+1518500249,r=r<<5|r>>>27,f=r&t,i+=(f|r&e|h)+a[8]+1518500249,i=i<<9|i>>>23,n=i&r,e+=(n|i&t|f)+a[12]+1518500249,e=e<<13|e>>>19,s=e&i,t+=(s|e&r|n)+a[1]+1518500249,t=t<<3|t>>>29,h=t&e,r+=(h|t&i|s)+a[5]+1518500249,r=r<<5|r>>>27,f=r&t,i+=(f|r&e|h)+a[9]+1518500249,i=i<<9|i>>>23,n=i&r,e+=(n|i&t|f)+a[13]+1518500249,e=e<<13|e>>>19,s=e&i,t+=(s|e&r|n)+a[2]+1518500249,t=t<<3|t>>>29,h=t&e,r+=(h|t&i|s)+a[6]+1518500249,r=r<<5|r>>>27,f=r&t,i+=(f|r&e|h)+a[10]+1518500249,i=i<<9|i>>>23,n=i&r,e+=(n|i&t|f)+a[14]+1518500249,e=e<<13|e>>>19,s=e&i,t+=(s|e&r|n)+a[3]+1518500249,t=t<<3|t>>>29,h=t&e,r+=(h|t&i|s)+a[7]+1518500249,r=r<<5|r>>>27,f=r&t,i+=(f|r&e|h)+a[11]+1518500249,i=i<<9|i>>>23,e+=(i&r|i&t|f)+a[15]+1518500249,e=e<<13|e>>>19,s=e^i,t+=(s^r)+a[0]+1859775393,t=t<<3|t>>>29,r+=(s^t)+a[8]+1859775393,r=r<<9|r>>>23,f=r^t,i+=(f^e)+a[4]+1859775393,i=i<<11|i>>>21,e+=(f^i)+a[12]+1859775393,e=e<<15|e>>>17,s=e^i,t+=(s^r)+a[2]+1859775393,t=t<<3|t>>>29,r+=(s^t)+a[10]+1859775393,r=r<<9|r>>>23,f=r^t,i+=(f^e)+a[6]+1859775393,i=i<<11|i>>>21,e+=(f^i)+a[14]+1859775393,e=e<<15|e>>>17,s=e^i,t+=(s^r)+a[1]+1859775393,t=t<<3|t>>>29,r+=(s^t)+a[9]+1859775393,r=r<<9|r>>>23,f=r^t,i+=(f^e)+a[5]+1859775393,i=i<<11|i>>>21,e+=(f^i)+a[13]+1859775393,e=e<<15|e>>>17,s=e^i,t+=(s^r)+a[3]+1859775393,t=t<<3|t>>>29,r+=(s^t)+a[11]+1859775393,r=r<<9|r>>>23,f=r^t,i+=(f^e)+a[7]+1859775393,i=i<<11|i>>>21,e+=(f^i)+a[15]+1859775393,e=e<<15|e>>>17,this.first?(this.h0=t+1732584193<<0,this.h1=e-271733879<<0,this.h2=i-1732584194<<0,this.h3=r+271733878<<0,this.first=!1):(this.h0=this.h0+t<<0,this.h1=this.h1+e<<0,this.h2=this.h2+i<<0,this.h3=this.h3+r<<0)},t.prototype.hex=function(){this.finalize();var t=this.h0,e=this.h1,i=this.h2,r=this.h3;return f[t>>4&15]+f[15&t]+f[t>>12&15]+f[t>>8&15]+f[t>>20&15]+f[t>>16&15]+f[t>>28&15]+f[t>>24&15]+f[e>>4&15]+f[15&e]+f[e>>12&15]+f[e>>8&15]+f[e>>20&15]+f[e>>16&15]+f[e>>28&15]+f[e>>24&15]+f[i>>4&15]+f[15&i]+f[i>>12&15]+f[i>>8&15]+f[i>>20&15]+f[i>>16&15]+f[i>>28&15]+f[i>>24&15]+f[r>>4&15]+f[15&r]+f[r>>12&15]+f[r>>8&15]+f[r>>20&15]+f[r>>16&15]+f[r>>28&15]+f[r>>24&15]},t.prototype.toString=t.prototype.hex,t.prototype.digest=function(){this.finalize();var t=this.h0,e=this.h1,i=this.h2,r=this.h3;return[255&t,t>>8&255,t>>16&255,t>>24&255,255&e,e>>8&255,e>>16&255,e>>24&255,255&i,i>>8&255,i>>16&255,i>>24&255,255&r,r>>8&255,r>>16&255,r>>24&255]},t.prototype.array=t.prototype.digest,t.prototype.arrayBuffer=function(){this.finalize();var t=new ArrayBuffer(16),e=new Uint32Array(t);return e[0]=this.h0,e[1]=this.h1,e[2]=this.h2,e[3]=this.h3,t},t.prototype.buffer=t.prototype.arrayBuffer;var b=c();h?module.exports=b:(e.md4=b,s&&define(function(){return b}))}();                                 Apache License
                           Version 2.0, January 2004
                        https://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS
{
  "name": "jsbi",
  "version": "4.3.0",
  "repository": "GoogleChromeLabs/jsbi",
  "devDependencies": {
    "@babel/preset-env": "^7.5.5",
    "@typescript-eslint/eslint-plugin": "^4.29.1",
    "@typescript-eslint/parser": "^4.29.1",
    "eslint": "^6.2.0",
    "eslint-config-google": "^0.13.0",
    "rollup": "^1.19.4",
    "rollup-plugin-babel": "^4.3.3",
    "rollup-plugin-babel-minify": "^9.0.0",
    "typescript": "^4.4.2"
  },
  "main": "dist/jsbi-cjs.js",
  "module": "dist/jsbi.mjs",
  "browser": "dist/jsbi-umd.js",
  "types": "jsbi.d.ts",
  "files": [
    "dist",
    "jsbi.d.ts"
  ],
  "license": "Apache-2.0"
}"use strict";class JSBI extends Array{constructor(i,_){if(super(i),this.sign=_,Object.setPrototypeOf(this,JSBI.prototype),i>JSBI.__kMaxLength)throw new RangeError("Maximum BigInt size exceeded")}static BigInt(i){var _=Math.floor,t=Number.isFinite;if("number"==typeof i){if(0===i)return JSBI.__zero();if(JSBI.__isOneDigitInt(i))return 0>i?JSBI.__oneDigit(-i,!0):JSBI.__oneDigit(i,!1);if(!t(i)||_(i)!==i)throw new RangeError("The number "+i+" cannot be converted to BigInt because it is not an integer");return JSBI.__fromDouble(i)}if("string"==typeof i){const _=JSBI.__fromString(i);if(null===_)throw new SyntaxError("Cannot convert "+i+" to a BigInt");return _}if("boolean"==typeof i)return!0===i?JSBI.__oneDigit(1,!1):JSBI.__zero();if("object"==typeof i){if(i.constructor===JSBI)return i;const _=JSBI.__toPrimitive(i);return JSBI.BigInt(_)}throw new TypeError("Cannot convert "+i+" to a BigInt")}toDebugString(){const i=["BigInt["];for(const _ of this)i.push((_?(_>>>0).toString(16):_)+", ");return i.push("]"),i.join("")}toString(i=10){if(2>i||36<i)throw new RangeError("toString() radix argument must be between 2 and 36");return 0===this.length?"0":0==(i&i-1)?JSBI.__toStringBasePowerOfTwo(this,i):JSBI.__toStringGeneric(this,i,!1)}valueOf(){throw new Error("Convert JSBI instances to native numbers using `toNumber`.")}static toNumber(i){const _=i.length;if(0===_)return 0;if(1===_){const _=i.__unsignedDigit(0);return i.sign?-_:_}const t=i.__digit(_-1),e=JSBI.__clz30(t),n=30*_-e;if(1024<n)return i.sign?-Infinity:1/0;let g=n-1,s=t,o=_-1;const l=e+3;let r=32===l?0:s<<l;r>>>=12;const a=l-12;let u=12<=l?0:s<<20+l,d=20+l;for(0<a&&0<o&&(o--,s=i.__digit(o),r|=s>>>30-a,u=s<<a+2,d=a+2);0<d&&0<o;)o--,s=i.__digit(o),u|=30<=d?s<<d-30:s>>>30-d,d-=30;const h=JSBI.__decideRounding(i,d,o,s);if((1===h||0===h&&1==(1&u))&&(u=u+1>>>0,0===u&&(r++,0!=r>>>20&&(r=0,g++,1023<g))))return i.sign?-Infinity:1/0;const m=i.sign?-2147483648:0;return g=g+1023<<20,JSBI.__kBitConversionInts[1]=m|g|r,JSBI.__kBitConversionInts[0]=u,JSBI.__kBitConversionDouble[0]}static unaryMinus(i){if(0===i.length)return i;const _=i.__copy();return _.sign=!i.sign,_}static bitwiseNot(i){return i.sign?JSBI.__absoluteSubOne(i).__trim():JSBI.__absoluteAddOne(i,!0)}static exponentiate(i,_){if(_.sign)throw new RangeError("Exponent must be positive");if(0===_.length)return JSBI.__oneDigit(1,!1);if(0===i.length)return i;if(1===i.length&&1===i.__digit(0))return i.sign&&0==(1&_.__digit(0))?JSBI.unaryMinus(i):i;if(1<_.length)throw new RangeError("BigInt too big");let t=_.__unsignedDigit(0);if(1===t)return i;if(t>=JSBI.__kMaxLengthBits)throw new RangeError("BigInt too big");if(1===i.length&&2===i.__digit(0)){const _=1+(0|t/30),e=i.sign&&0!=(1&t),n=new JSBI(_,e);n.__initializeDigits();const g=1<<t%30;return n.__setDigit(_-1,g),n}let e=null,n=i;for(0!=(1&t)&&(e=i),t>>=1;0!==t;t>>=1)n=JSBI.multiply(n,n),0!=(1&t)&&(null===e?e=n:e=JSBI.multiply(e,n));return e}static multiply(_,t){if(0===_.length)return _;if(0===t.length)return t;let i=_.length+t.length;30<=_.__clzmsd()+t.__clzmsd()&&i--;const e=new JSBI(i,_.sign!==t.sign);e.__initializeDigits();for(let n=0;n<_.length;n++)JSBI.__multiplyAccumulate(t,_.__digit(n),e,n);return e.__trim()}static divide(i,_){if(0===_.length)throw new RangeError("Division by zero");if(0>JSBI.__absoluteCompare(i,_))return JSBI.__zero();const t=i.sign!==_.sign,e=_.__unsignedDigit(0);let n;if(1===_.length&&32767>=e){if(1===e)return t===i.sign?i:JSBI.unaryMinus(i);n=JSBI.__absoluteDivSmall(i,e,null)}else n=JSBI.__absoluteDivLarge(i,_,!0,!1);return n.sign=t,n.__trim()}static remainder(i,_){if(0===_.length)throw new RangeError("Division by zero");if(0>JSBI.__absoluteCompare(i,_))return i;const t=_.__unsignedDigit(0);if(1===_.length&&32767>=t){if(1===t)return JSBI.__zero();const _=JSBI.__absoluteModSmall(i,t);return 0===_?JSBI.__zero():JSBI.__oneDigit(_,i.sign)}const e=JSBI.__absoluteDivLarge(i,_,!1,!0);return e.sign=i.sign,e.__trim()}static add(i,_){const t=i.sign;return t===_.sign?JSBI.__absoluteAdd(i,_,t):0<=JSBI.__absoluteCompare(i,_)?JSBI.__absoluteSub(i,_,t):JSBI.__absoluteSub(_,i,!t)}static subtract(i,_){const t=i.sign;return t===_.sign?0<=JSBI.__absoluteCompare(i,_)?JSBI.__absoluteSub(i,_,t):JSBI.__absoluteSub(_,i,!t):JSBI.__absoluteAdd(i,_,t)}static leftShift(i,_){return 0===_.length||0===i.length?i:_.sign?JSBI.__rightShiftByAbsolute(i,_):JSBI.__leftShiftByAbsolute(i,_)}static signedRightShift(i,_){return 0===_.length||0===i.length?i:_.sign?JSBI.__leftShiftByAbsolute(i,_):JSBI.__rightShiftByAbsolute(i,_)}static unsignedRightShift(){throw new TypeError("BigInts have no unsigned right shift; use >> instead")}static lessThan(i,_){return 0>JSBI.__compareToBigInt(i,_)}static lessThanOrEqual(i,_){return 0>=JSBI.__compareToBigInt(i,_)}static greaterThan(i,_){return 0<JSBI.__compareToBigInt(i,_)}static greaterThanOrEqual(i,_){return 0<=JSBI.__compareToBigInt(i,_)}static equal(_,t){if(_.sign!==t.sign)return!1;if(_.length!==t.length)return!1;for(let e=0;e<_.length;e++)if(_.__digit(e)!==t.__digit(e))return!1;return!0}static notEqual(i,_){return!JSBI.equal(i,_)}static bitwiseAnd(i,_){var t=Math.max;if(!i.sign&&!_.sign)return JSBI.__absoluteAnd(i,_).__trim();if(i.sign&&_.sign){const e=t(i.length,_.length)+1;let n=JSBI.__absoluteSubOne(i,e);const g=JSBI.__absoluteSubOne(_);return n=JSBI.__absoluteOr(n,g,n),JSBI.__absoluteAddOne(n,!0,n).__trim()}return i.sign&&([i,_]=[_,i]),JSBI.__absoluteAndNot(i,JSBI.__absoluteSubOne(_)).__trim()}static bitwiseXor(i,_){var t=Math.max;if(!i.sign&&!_.sign)return JSBI.__absoluteXor(i,_).__trim();if(i.sign&&_.sign){const e=t(i.length,_.length),n=JSBI.__absoluteSubOne(i,e),g=JSBI.__absoluteSubOne(_);return JSBI.__absoluteXor(n,g,n).__trim()}const e=t(i.length,_.length)+1;i.sign&&([i,_]=[_,i]);let n=JSBI.__absoluteSubOne(_,e);return n=JSBI.__absoluteXor(n,i,n),JSBI.__absoluteAddOne(n,!0,n).__trim()}static bitwiseOr(i,_){var t=Math.max;const e=t(i.length,_.length);if(!i.sign&&!_.sign)return JSBI.__absoluteOr(i,_).__trim();if(i.sign&&_.sign){let t=JSBI.__absoluteSubOne(i,e);const n=JSBI.__absoluteSubOne(_);return t=JSBI.__absoluteAnd(t,n,t),JSBI.__absoluteAddOne(t,!0,t).__trim()}i.sign&&([i,_]=[_,i]);let n=JSBI.__absoluteSubOne(_,e);return n=JSBI.__absoluteAndNot(n,i,n),JSBI.__absoluteAddOne(n,!0,n).__trim()}static asIntN(_,t){var i=Math.floor;if(0===t.length)return t;if(_=i(_),0>_)throw new RangeError("Invalid value: not (convertible to) a safe integer");if(0===_)return JSBI.__zero();if(_>=JSBI.__kMaxLengthBits)return t;const e=0|(_+29)/30;if(t.length<e)return t;const g=t.__unsignedDigit(e-1),s=1<<(_-1)%30;if(t.length===e&&g<s)return t;if(!((g&s)===s))return JSBI.__truncateToNBits(_,t);if(!t.sign)return JSBI.__truncateAndSubFromPowerOfTwo(_,t,!0);if(0==(g&s-1)){for(let n=e-2;0<=n;n--)if(0!==t.__digit(n))return JSBI.__truncateAndSubFromPowerOfTwo(_,t,!1);return t.length===e&&g===s?t:JSBI.__truncateToNBits(_,t)}return JSBI.__truncateAndSubFromPowerOfTwo(_,t,!1)}static asUintN(i,_){var t=Math.floor;if(0===_.length)return _;if(i=t(i),0>i)throw new RangeError("Invalid value: not (convertible to) a safe integer");if(0===i)return JSBI.__zero();if(_.sign){if(i>JSBI.__kMaxLengthBits)throw new RangeError("BigInt too big");return JSBI.__truncateAndSubFromPowerOfTwo(i,_,!1)}if(i>=JSBI.__kMaxLengthBits)return _;const e=0|(i+29)/30;if(_.length<e)return _;const g=i%30;if(_.length==e){if(0===g)return _;const i=_.__digit(e-1);if(0==i>>>g)return _}return JSBI.__truncateToNBits(i,_)}static ADD(i,_){if(i=JSBI.__toPrimitive(i),_=JSBI.__toPrimitive(_),"string"==typeof i)return"string"!=typeof _&&(_=_.toString()),i+_;if("string"==typeof _)return i.toString()+_;if(i=JSBI.__toNumeric(i),_=JSBI.__toNumeric(_),JSBI.__isBigInt(i)&&JSBI.__isBigInt(_))return JSBI.add(i,_);if("number"==typeof i&&"number"==typeof _)return i+_;throw new TypeError("Cannot mix BigInt and other types, use explicit conversions")}static LT(i,_){return JSBI.__compare(i,_,0)}static LE(i,_){return JSBI.__compare(i,_,1)}static GT(i,_){return JSBI.__compare(i,_,2)}static GE(i,_){return JSBI.__compare(i,_,3)}static EQ(i,_){for(;;){if(JSBI.__isBigInt(i))return JSBI.__isBigInt(_)?JSBI.equal(i,_):JSBI.EQ(_,i);if("number"==typeof i){if(JSBI.__isBigInt(_))return JSBI.__equalToNumber(_,i);if("object"!=typeof _)return i==_;_=JSBI.__toPrimitive(_)}else if("string"==typeof i){if(JSBI.__isBigInt(_))return i=JSBI.__fromString(i),null!==i&&JSBI.equal(i,_);if("object"!=typeof _)return i==_;_=JSBI.__toPrimitive(_)}else if("boolean"==typeof i){if(JSBI.__isBigInt(_))return JSBI.__equalToNumber(_,+i);if("object"!=typeof _)return i==_;_=JSBI.__toPrimitive(_)}else if("symbol"==typeof i){if(JSBI.__isBigInt(_))return!1;if("object"!=typeof _)return i==_;_=JSBI.__toPrimitive(_)}else if("object"==typeof i){if("object"==typeof _&&_.constructor!==JSBI)return i==_;i=JSBI.__toPrimitive(i)}else return i==_}}static NE(i,_){return!JSBI.EQ(i,_)}static DataViewGetBigInt64(i,_,t=!1){return JSBI.asIntN(64,JSBI.DataViewGetBigUint64(i,_,t))}static DataViewGetBigUint64(i,_,t=!1){const[e,n]=t?[4,0]:[0,4],g=i.getUint32(_+e,t),s=i.getUint32(_+n,t),o=new JSBI(3,!1);return o.__setDigit(0,1073741823&s),o.__setDigit(1,(268435455&g)<<2|s>>>30),o.__setDigit(2,g>>>28),o.__trim()}static DataViewSetBigInt64(i,_,t,e=!1){JSBI.DataViewSetBigUint64(i,_,t,e)}static DataViewSetBigUint64(i,_,t,e=!1){t=JSBI.asUintN(64,t);let n=0,g=0;if(0<t.length&&(g=t.__digit(0),1<t.length)){const i=t.__digit(1);g|=i<<30,n=i>>>2,2<t.length&&(n|=t.__digit(2)<<28)}const[s,o]=e?[4,0]:[0,4];i.setUint32(_+s,n,e),i.setUint32(_+o,g,e)}static __zero(){return new JSBI(0,!1)}static __oneDigit(i,_){const t=new JSBI(1,_);return t.__setDigit(0,i),t}__copy(){const _=new JSBI(this.length,this.sign);for(let t=0;t<this.length;t++)_[t]=this[t];return _}__trim(){let i=this.length,_=this[i-1];for(;0===_;)i--,_=this[i-1],this.pop();return 0===i&&(this.sign=!1),this}__initializeDigits(){for(let _=0;_<this.length;_++)this[_]=0}static __decideRounding(i,_,t,e){if(0<_)return-1;let n;if(0>_)n=-_-1;else{if(0===t)return-1;t--,e=i.__digit(t),n=29}let g=1<<n;if(0==(e&g))return-1;if(g-=1,0!=(e&g))return 1;for(;0<t;)if(t--,0!==i.__digit(t))return 1;return 0}static __fromDouble(i){JSBI.__kBitConversionDouble[0]=i;const _=2047&JSBI.__kBitConversionInts[1]>>>20,t=_-1023,e=(0|t/30)+1,n=new JSBI(e,0>i);let g=1048575&JSBI.__kBitConversionInts[1]|1048576,s=JSBI.__kBitConversionInts[0];const o=20,l=t%30;let r,a=0;if(l<20){const i=o-l;a=i+32,r=g>>>i,g=g<<32-i|s>>>i,s<<=32-i}else if(l===20)a=32,r=g,g=s,s=0;else{const i=l-o;a=32-i,r=g<<i|s>>>32-i,g=s<<i,s=0}n.__setDigit(e-1,r);for(let _=e-2;0<=_;_--)0<a?(a-=30,r=g>>>2,g=g<<30|s>>>2,s<<=30):r=0,n.__setDigit(_,r);return n.__trim()}static __isWhitespace(i){return!!(13>=i&&9<=i)||(159>=i?32==i:131071>=i?160==i||5760==i:196607>=i?(i&=131071,10>=i||40==i||41==i||47==i||95==i||4096==i):65279==i)}static __fromString(i,_=0){let t=0;const e=i.length;let n=0;if(n===e)return JSBI.__zero();let g=i.charCodeAt(n);for(;JSBI.__isWhitespace(g);){if(++n===e)return JSBI.__zero();g=i.charCodeAt(n)}if(43===g){if(++n===e)return null;g=i.charCodeAt(n),t=1}else if(45===g){if(++n===e)return null;g=i.charCodeAt(n),t=-1}if(0===_){if(_=10,48===g){if(++n===e)return JSBI.__zero();if(g=i.charCodeAt(n),88===g||120===g){if(_=16,++n===e)return null;g=i.charCodeAt(n)}else if(79===g||111===g){if(_=8,++n===e)return null;g=i.charCodeAt(n)}else if(66===g||98===g){if(_=2,++n===e)return null;g=i.charCodeAt(n)}}}else if(16===_&&48===g){if(++n===e)return JSBI.__zero();if(g=i.charCodeAt(n),88===g||120===g){if(++n===e)return null;g=i.charCodeAt(n)}}if(0!=t&&10!==_)return null;for(;48===g;){if(++n===e)return JSBI.__zero();g=i.charCodeAt(n)}const s=e-n;let o=JSBI.__kMaxBitsPerChar[_],l=JSBI.__kBitsPerCharTableMultiplier-1;if(s>1073741824/o)return null;const r=o*s+l>>>JSBI.__kBitsPerCharTableShift,a=new JSBI(0|(r+29)/30,!1),u=10>_?_:10,h=10<_?_-10:0;if(0==(_&_-1)){o>>=JSBI.__kBitsPerCharTableShift;const _=[],t=[];let s=!1;do{let l=0,r=0;for(;;){let _;if(g-48>>>0<u)_=g-48;else if((32|g)-97>>>0<h)_=(32|g)-87;else{s=!0;break}if(r+=o,l=l<<o|_,++n===e){s=!0;break}if(g=i.charCodeAt(n),30<r+o)break}_.push(l),t.push(r)}while(!s);JSBI.__fillFromParts(a,_,t)}else{a.__initializeDigits();let t=!1,s=0;do{let r=0,b=1;for(;;){let o;if(g-48>>>0<u)o=g-48;else if((32|g)-97>>>0<h)o=(32|g)-87;else{t=!0;break}const l=b*_;if(1073741823<l)break;if(b=l,r=r*_+o,s++,++n===e){t=!0;break}g=i.charCodeAt(n)}l=30*JSBI.__kBitsPerCharTableMultiplier-1;const D=0|(o*s+l>>>JSBI.__kBitsPerCharTableShift)/30;a.__inplaceMultiplyAdd(b,r,D)}while(!t)}if(n!==e){if(!JSBI.__isWhitespace(g))return null;for(n++;n<e;n++)if(g=i.charCodeAt(n),!JSBI.__isWhitespace(g))return null}return a.sign=-1==t,a.__trim()}static __fillFromParts(_,t,e){let n=0,g=0,s=0;for(let o=t.length-1;0<=o;o--){const i=t[o],l=e[o];g|=i<<s,s+=l,30===s?(_.__setDigit(n++,g),s=0,g=0):30<s&&(_.__setDigit(n++,1073741823&g),s-=30,g=i>>>l-s)}if(0!==g){if(n>=_.length)throw new Error("implementation bug");_.__setDigit(n++,g)}for(;n<_.length;n++)_.__setDigit(n,0)}static __toStringBasePowerOfTwo(_,i){const t=_.length;let e=i-1;e=(85&e>>>1)+(85&e),e=(51&e>>>2)+(51&e),e=(15&e>>>4)+(15&e);const n=e,g=i-1,s=_.__digit(t-1),o=JSBI.__clz30(s);let l=0|(30*t-o+n-1)/n;if(_.sign&&l++,268435456<l)throw new Error("string too long");const r=Array(l);let a=l-1,u=0,d=0;for(let e=0;e<t-1;e++){const i=_.__digit(e),t=(u|i<<d)&g;r[a--]=JSBI.__kConversionChars[t];const s=n-d;for(u=i>>>s,d=30-s;d>=n;)r[a--]=JSBI.__kConversionChars[u&g],u>>>=n,d-=n}const h=(u|s<<d)&g;for(r[a--]=JSBI.__kConversionChars[h],u=s>>>n-d;0!==u;)r[a--]=JSBI.__kConversionChars[u&g],u>>>=n;if(_.sign&&(r[a--]="-"),-1!=a)throw new Error("implementation bug");return r.join("")}static __toStringGeneric(_,i,t){const e=_.length;if(0===e)return"";if(1===e){let e=_.__unsignedDigit(0).toString(i);return!1===t&&_.sign&&(e="-"+e),e}const n=30*e-JSBI.__clz30(_.__digit(e-1)),g=JSBI.__kMaxBitsPerChar[i],s=g-1;let o=n*JSBI.__kBitsPerCharTableMultiplier;o+=s-1,o=0|o/s;const l=o+1>>1,r=JSBI.exponentiate(JSBI.__oneDigit(i,!1),JSBI.__oneDigit(l,!1));let a,u;const d=r.__unsignedDigit(0);if(1===r.length&&32767>=d){a=new JSBI(_.length,!1),a.__initializeDigits();let t=0;for(let e=2*_.length-1;0<=e;e--){const i=t<<15|_.__halfDigit(e);a.__setHalfDigit(e,0|i/d),t=0|i%d}u=t.toString(i)}else{const t=JSBI.__absoluteDivLarge(_,r,!0,!0);a=t.quotient;const e=t.remainder.__trim();u=JSBI.__toStringGeneric(e,i,!0)}a.__trim();let h=JSBI.__toStringGeneric(a,i,!0);for(;u.length<l;)u="0"+u;return!1===t&&_.sign&&(h="-"+h),h+u}static __unequalSign(i){return i?-1:1}static __absoluteGreater(i){return i?-1:1}static __absoluteLess(i){return i?1:-1}static __compareToBigInt(i,_){const t=i.sign;if(t!==_.sign)return JSBI.__unequalSign(t);const e=JSBI.__absoluteCompare(i,_);return 0<e?JSBI.__absoluteGreater(t):0>e?JSBI.__absoluteLess(t):0}static __compareToNumber(i,_){if(JSBI.__isOneDigitInt(_)){const t=i.sign,e=0>_;if(t!==e)return JSBI.__unequalSign(t);if(0===i.length){if(e)throw new Error("implementation bug");return 0===_?0:-1}if(1<i.length)return JSBI.__absoluteGreater(t);const n=Math.abs(_),g=i.__unsignedDigit(0);return g>n?JSBI.__absoluteGreater(t):g<n?JSBI.__absoluteLess(t):0}return JSBI.__compareToDouble(i,_)}static __compareToDouble(i,_){if(_!==_)return _;if(_===1/0)return-1;if(_===-Infinity)return 1;const t=i.sign;if(t!==0>_)return JSBI.__unequalSign(t);if(0===_)throw new Error("implementation bug: should be handled elsewhere");if(0===i.length)return-1;JSBI.__kBitConversionDouble[0]=_;const e=2047&JSBI.__kBitConversionInts[1]>>>20;if(2047==e)throw new Error("implementation bug: handled elsewhere");const n=e-1023;if(0>n)return JSBI.__absoluteGreater(t);const g=i.length;let s=i.__digit(g-1);const o=JSBI.__clz30(s),l=30*g-o,r=n+1;if(l<r)return JSBI.__absoluteLess(t);if(l>r)return JSBI.__absoluteGreater(t);let a=1048576|1048575&JSBI.__kBitConversionInts[1],u=JSBI.__kBitConversionInts[0];const d=20,h=29-o;if(h!==(0|(l-1)%30))throw new Error("implementation bug");let m,b=0;if(20>h){const i=d-h;b=i+32,m=a>>>i,a=a<<32-i|u>>>i,u<<=32-i}else if(20===h)b=32,m=a,a=u,u=0;else{const i=h-d;b=32-i,m=a<<i|u>>>32-i,a=u<<i,u=0}if(s>>>=0,m>>>=0,s>m)return JSBI.__absoluteGreater(t);if(s<m)return JSBI.__absoluteLess(t);for(let e=g-2;0<=e;e--){0<b?(b-=30,m=a>>>2,a=a<<30|u>>>2,u<<=30):m=0;const _=i.__unsignedDigit(e);if(_>m)return JSBI.__absoluteGreater(t);if(_<m)return JSBI.__absoluteLess(t)}if(0!==a||0!==u){if(0===b)throw new Error("implementation bug");return JSBI.__absoluteLess(t)}return 0}static __equalToNumber(i,_){var t=Math.abs;return JSBI.__isOneDigitInt(_)?0===_?0===i.length:1===i.length&&i.sign===0>_&&i.__unsignedDigit(0)===t(_):0===JSBI.__compareToDouble(i,_)}static __comparisonResultToBool(i,_){return 0===_?0>i:1===_?0>=i:2===_?0<i:3===_?0<=i:void 0}static __compare(i,_,t){if(i=JSBI.__toPrimitive(i),_=JSBI.__toPrimitive(_),"string"==typeof i&&"string"==typeof _)switch(t){case 0:return i<_;case 1:return i<=_;case 2:return i>_;case 3:return i>=_;}if(JSBI.__isBigInt(i)&&"string"==typeof _)return _=JSBI.__fromString(_),null!==_&&JSBI.__comparisonResultToBool(JSBI.__compareToBigInt(i,_),t);if("string"==typeof i&&JSBI.__isBigInt(_))return i=JSBI.__fromString(i),null!==i&&JSBI.__comparisonResultToBool(JSBI.__compareToBigInt(i,_),t);if(i=JSBI.__toNumeric(i),_=JSBI.__toNumeric(_),JSBI.__isBigInt(i)){if(JSBI.__isBigInt(_))return JSBI.__comparisonResultToBool(JSBI.__compareToBigInt(i,_),t);if("number"!=typeof _)throw new Error("implementation bug");return JSBI.__comparisonResultToBool(JSBI.__compareToNumber(i,_),t)}if("number"!=typeof i)throw new Error("implementation bug");if(JSBI.__isBigInt(_))return JSBI.__comparisonResultToBool(JSBI.__compareToNumber(_,i),2^t);if("number"!=typeof _)throw new Error("implementation bug");return 0===t?i<_:1===t?i<=_:2===t?i>_:3===t?i>=_:void 0}__clzmsd(){return JSBI.__clz30(this.__digit(this.length-1))}static __absoluteAdd(_,t,e){if(_.length<t.length)return JSBI.__absoluteAdd(t,_,e);if(0===_.length)return _;if(0===t.length)return _.sign===e?_:JSBI.unaryMinus(_);let n=_.length;(0===_.__clzmsd()||t.length===_.length&&0===t.__clzmsd())&&n++;const g=new JSBI(n,e);let s=0,o=0;for(;o<t.length;o++){const i=_.__digit(o)+t.__digit(o)+s;s=i>>>30,g.__setDigit(o,1073741823&i)}for(;o<_.length;o++){const i=_.__digit(o)+s;s=i>>>30,g.__setDigit(o,1073741823&i)}return o<g.length&&g.__setDigit(o,s),g.__trim()}static __absoluteSub(_,t,e){if(0===_.length)return _;if(0===t.length)return _.sign===e?_:JSBI.unaryMinus(_);const n=new JSBI(_.length,e);let g=0,s=0;for(;s<t.length;s++){const i=_.__digit(s)-t.__digit(s)-g;g=1&i>>>30,n.__setDigit(s,1073741823&i)}for(;s<_.length;s++){const i=_.__digit(s)-g;g=1&i>>>30,n.__setDigit(s,1073741823&i)}return n.__trim()}static __absoluteAddOne(_,i,t=null){const e=_.length;null===t?t=new JSBI(e,i):t.sign=i;let n=1;for(let g=0;g<e;g++){const i=_.__digit(g)+n;n=i>>>30,t.__setDigit(g,1073741823&i)}return 0!=n&&t.__setDigitGrow(e,1),t}static __absoluteSubOne(_,t){const e=_.length;t=t||e;const n=new JSBI(t,!1);let g=1;for(let s=0;s<e;s++){const i=_.__digit(s)-g;g=1&i>>>30,n.__setDigit(s,1073741823&i)}if(0!=g)throw new Error("implementation bug");for(let g=e;g<t;g++)n.__setDigit(g,0);return n}static __absoluteAnd(_,t,e=null){let n=_.length,g=t.length,s=g;if(n<g){s=n;const i=_,e=n;_=t,n=g,t=i,g=e}let o=s;null===e?e=new JSBI(o,!1):o=e.length;let l=0;for(;l<s;l++)e.__setDigit(l,_.__digit(l)&t.__digit(l));for(;l<o;l++)e.__setDigit(l,0);return e}static __absoluteAndNot(_,t,e=null){const n=_.length,g=t.length;let s=g;n<g&&(s=n);let o=n;null===e?e=new JSBI(o,!1):o=e.length;let l=0;for(;l<s;l++)e.__setDigit(l,_.__digit(l)&~t.__digit(l));for(;l<n;l++)e.__setDigit(l,_.__digit(l));for(;l<o;l++)e.__setDigit(l,0);return e}static __absoluteOr(_,t,e=null){let n=_.length,g=t.length,s=g;if(n<g){s=n;const i=_,e=n;_=t,n=g,t=i,g=e}let o=n;null===e?e=new JSBI(o,!1):o=e.length;let l=0;for(;l<s;l++)e.__setDigit(l,_.__digit(l)|t.__digit(l));for(;l<n;l++)e.__setDigit(l,_.__digit(l));for(;l<o;l++)e.__setDigit(l,0);return e}static __absoluteXor(_,t,e=null){let n=_.length,g=t.length,s=g;if(n<g){s=n;const i=_,e=n;_=t,n=g,t=i,g=e}let o=n;null===e?e=new JSBI(o,!1):o=e.length;let l=0;for(;l<s;l++)e.__setDigit(l,_.__digit(l)^t.__digit(l));for(;l<n;l++)e.__setDigit(l,_.__digit(l));for(;l<o;l++)e.__setDigit(l,0);return e}static __absoluteCompare(_,t){const e=_.length-t.length;if(0!=e)return e;let n=_.length-1;for(;0<=n&&_.__digit(n)===t.__digit(n);)n--;return 0>n?0:_.__unsignedDigit(n)>t.__unsignedDigit(n)?1:-1}static __multiplyAccumulate(_,t,e,n){if(0===t)return;const g=32767&t,s=t>>>15;let o=0,l=0;for(let r,a=0;a<_.length;a++,n++){r=e.__digit(n);const i=_.__digit(a),t=32767&i,u=i>>>15,d=JSBI.__imul(t,g),h=JSBI.__imul(t,s),m=JSBI.__imul(u,g),b=JSBI.__imul(u,s);r+=l+d+o,o=r>>>30,r&=1073741823,r+=((32767&h)<<15)+((32767&m)<<15),o+=r>>>30,l=b+(h>>>15)+(m>>>15),e.__setDigit(n,1073741823&r)}for(;0!=o||0!==l;n++){let i=e.__digit(n);i+=o+l,l=0,o=i>>>30,e.__setDigit(n,1073741823&i)}}static __internalMultiplyAdd(_,t,e,g,s){let o=e,l=0;for(let n=0;n<g;n++){const i=_.__digit(n),e=JSBI.__imul(32767&i,t),g=JSBI.__imul(i>>>15,t),a=e+((32767&g)<<15)+l+o;o=a>>>30,l=g>>>15,s.__setDigit(n,1073741823&a)}if(s.length>g)for(s.__setDigit(g++,o+l);g<s.length;)s.__setDigit(g++,0);else if(0!==o+l)throw new Error("implementation bug")}__inplaceMultiplyAdd(i,_,t){t>this.length&&(t=this.length);const e=32767&i,n=i>>>15;let g=0,s=_;for(let o=0;o<t;o++){const i=this.__digit(o),_=32767&i,t=i>>>15,l=JSBI.__imul(_,e),r=JSBI.__imul(_,n),a=JSBI.__imul(t,e),u=JSBI.__imul(t,n);let d=s+l+g;g=d>>>30,d&=1073741823,d+=((32767&r)<<15)+((32767&a)<<15),g+=d>>>30,s=u+(r>>>15)+(a>>>15),this.__setDigit(o,1073741823&d)}if(0!=g||0!==s)throw new Error("implementation bug")}static __absoluteDivSmall(_,t,e=null){null===e&&(e=new JSBI(_.length,!1));let n=0;for(let g,s=2*_.length-1;0<=s;s-=2){g=(n<<15|_.__halfDigit(s))>>>0;const i=0|g/t;n=0|g%t,g=(n<<15|_.__halfDigit(s-1))>>>0;const o=0|g/t;n=0|g%t,e.__setDigit(s>>>1,i<<15|o)}return e}static __absoluteModSmall(_,t){let e=0;for(let n=2*_.length-1;0<=n;n--){const i=(e<<15|_.__halfDigit(n))>>>0;e=0|i%t}return e}static __absoluteDivLarge(i,_,t,e){const g=_.__halfDigitLength(),n=_.length,s=i.__halfDigitLength()-g;let o=null;t&&(o=new JSBI(s+2>>>1,!1),o.__initializeDigits());const l=new JSBI(g+2>>>1,!1);l.__initializeDigits();const r=JSBI.__clz15(_.__halfDigit(g-1));0<r&&(_=JSBI.__specialLeftShift(_,r,0));const a=JSBI.__specialLeftShift(i,r,1),u=_.__halfDigit(g-1);let d=0;for(let r,h=s;0<=h;h--){r=32767;const i=a.__halfDigit(h+g);if(i!==u){const t=(i<<15|a.__halfDigit(h+g-1))>>>0;r=0|t/u;let e=0|t%u;const n=_.__halfDigit(g-2),s=a.__halfDigit(h+g-2);for(;JSBI.__imul(r,n)>>>0>(e<<16|s)>>>0&&(r--,e+=u,!(32767<e)););}JSBI.__internalMultiplyAdd(_,r,0,n,l);let e=a.__inplaceSub(l,h,g+1);0!==e&&(e=a.__inplaceAdd(_,h,g),a.__setHalfDigit(h+g,32767&a.__halfDigit(h+g)+e),r--),t&&(1&h?d=r<<15:o.__setDigit(h>>>1,d|r))}if(e)return a.__inplaceRightShift(r),t?{quotient:o,remainder:a}:a;if(t)return o;throw new Error("unreachable")}static __clz15(i){return JSBI.__clz30(i)-15}__inplaceAdd(_,t,e){let n=0;for(let g=0;g<e;g++){const i=this.__halfDigit(t+g)+_.__halfDigit(g)+n;n=i>>>15,this.__setHalfDigit(t+g,32767&i)}return n}__inplaceSub(_,t,e){let n=0;if(1&t){t>>=1;let g=this.__digit(t),s=32767&g,o=0;for(;o<e-1>>>1;o++){const i=_.__digit(o),e=(g>>>15)-(32767&i)-n;n=1&e>>>15,this.__setDigit(t+o,(32767&e)<<15|32767&s),g=this.__digit(t+o+1),s=(32767&g)-(i>>>15)-n,n=1&s>>>15}const i=_.__digit(o),l=(g>>>15)-(32767&i)-n;n=1&l>>>15,this.__setDigit(t+o,(32767&l)<<15|32767&s);if(t+o+1>=this.length)throw new RangeError("out of bounds");0==(1&e)&&(g=this.__digit(t+o+1),s=(32767&g)-(i>>>15)-n,n=1&s>>>15,this.__setDigit(t+_.length,1073709056&g|32767&s))}else{t>>=1;let g=0;for(;g<_.length-1;g++){const i=this.__digit(t+g),e=_.__digit(g),s=(32767&i)-(32767&e)-n;n=1&s>>>15;const o=(i>>>15)-(e>>>15)-n;n=1&o>>>15,this.__setDigit(t+g,(32767&o)<<15|32767&s)}const i=this.__digit(t+g),s=_.__digit(g),o=(32767&i)-(32767&s)-n;n=1&o>>>15;let l=0;0==(1&e)&&(l=(i>>>15)-(s>>>15)-n,n=1&l>>>15),this.__setDigit(t+g,(32767&l)<<15|32767&o)}return n}__inplaceRightShift(_){if(0===_)return;let t=this.__digit(0)>>>_;const e=this.length-1;for(let n=0;n<e;n++){const i=this.__digit(n+1);this.__setDigit(n,1073741823&i<<30-_|t),t=i>>>_}this.__setDigit(e,t)}static __specialLeftShift(_,t,e){const g=_.length,n=new JSBI(g+e,!1);if(0===t){for(let t=0;t<g;t++)n.__setDigit(t,_.__digit(t));return 0<e&&n.__setDigit(g,0),n}let s=0;for(let o=0;o<g;o++){const i=_.__digit(o);n.__setDigit(o,1073741823&i<<t|s),s=i>>>30-t}return 0<e&&n.__setDigit(g,s),n}static __leftShiftByAbsolute(_,i){const t=JSBI.__toShiftAmount(i);if(0>t)throw new RangeError("BigInt too big");const e=0|t/30,n=t%30,g=_.length,s=0!==n&&0!=_.__digit(g-1)>>>30-n,o=g+e+(s?1:0),l=new JSBI(o,_.sign);if(0===n){let t=0;for(;t<e;t++)l.__setDigit(t,0);for(;t<o;t++)l.__setDigit(t,_.__digit(t-e))}else{let t=0;for(let _=0;_<e;_++)l.__setDigit(_,0);for(let s=0;s<g;s++){const i=_.__digit(s);l.__setDigit(s+e,1073741823&i<<n|t),t=i>>>30-n}if(s)l.__setDigit(g+e,t);else if(0!==t)throw new Error("implementation bug")}return l.__trim()}static __rightShiftByAbsolute(_,i){const t=_.length,e=_.sign,n=JSBI.__toShiftAmount(i);if(0>n)return JSBI.__rightShiftByMaximum(e);const g=0|n/30,s=n%30;let o=t-g;if(0>=o)return JSBI.__rightShiftByMaximum(e);let l=!1;if(e){if(0!=(_.__digit(g)&(1<<s)-1))l=!0;else for(let t=0;t<g;t++)if(0!==_.__digit(t)){l=!0;break}}if(l&&0===s){const i=_.__digit(t-1);0==~i&&o++}let r=new JSBI(o,e);if(0===s){r.__setDigit(o-1,0);for(let e=g;e<t;e++)r.__setDigit(e-g,_.__digit(e))}else{let e=_.__digit(g)>>>s;const n=t-g-1;for(let t=0;t<n;t++){const i=_.__digit(t+g+1);r.__setDigit(t,1073741823&i<<30-s|e),e=i>>>s}r.__setDigit(n,e)}return l&&(r=JSBI.__absoluteAddOne(r,!0,r)),r.__trim()}static __rightShiftByMaximum(i){return i?JSBI.__oneDigit(1,!0):JSBI.__zero()}static __toShiftAmount(i){if(1<i.length)return-1;const _=i.__unsignedDigit(0);return _>JSBI.__kMaxLengthBits?-1:_}static __toPrimitive(i,_="default"){if("object"!=typeof i)return i;if(i.constructor===JSBI)return i;if("undefined"!=typeof Symbol&&"symbol"==typeof Symbol.toPrimitive){const t=i[Symbol.toPrimitive];if(t){const i=t(_);if("object"!=typeof i)return i;throw new TypeError("Cannot convert object to primitive value")}}const t=i.valueOf;if(t){const _=t.call(i);if("object"!=typeof _)return _}const e=i.toString;if(e){const _=e.call(i);if("object"!=typeof _)return _}throw new TypeError("Cannot convert object to primitive value")}static __toNumeric(i){return JSBI.__isBigInt(i)?i:+i}static __isBigInt(i){return"object"==typeof i&&null!==i&&i.constructor===JSBI}static __truncateToNBits(i,_){const t=0|(i+29)/30,e=new JSBI(t,_.sign),n=t-1;for(let t=0;t<n;t++)e.__setDigit(t,_.__digit(t));let g=_.__digit(n);if(0!=i%30){const _=32-i%30;g=g<<_>>>_}return e.__setDigit(n,g),e.__trim()}static __truncateAndSubFromPowerOfTwo(_,t,e){var n=Math.min;const g=0|(_+29)/30,s=new JSBI(g,e);let o=0;const l=g-1;let a=0;for(const i=n(l,t.length);o<i;o++){const i=0-t.__digit(o)-a;a=1&i>>>30,s.__setDigit(o,1073741823&i)}for(;o<l;o++)s.__setDigit(o,0|1073741823&-a);let u=l<t.length?t.__digit(l):0;const d=_%30;let h;if(0==d)h=0-u-a,h&=1073741823;else{const i=32-d;u=u<<i>>>i;const _=1<<32-i;h=_-u-a,h&=_-1}return s.__setDigit(l,h),s.__trim()}__digit(_){return this[_]}__unsignedDigit(_){return this[_]>>>0}__setDigit(_,i){this[_]=0|i}__setDigitGrow(_,i){this[_]=0|i}__halfDigitLength(){const i=this.length;return 32767>=this.__unsignedDigit(i-1)?2*i-1:2*i}__halfDigit(_){return 32767&this[_>>>1]>>>15*(1&_)}__setHalfDigit(_,i){const t=_>>>1,e=this.__digit(t),n=1&_?32767&e|i<<15:1073709056&e|32767&i;this.__setDigit(t,n)}static __digitPow(i,_){let t=1;for(;0<_;)1&_&&(t*=i),_>>>=1,i*=i;return t}static __isOneDigitInt(i){return(1073741823&i)===i}}JSBI.__kMaxLength=33554432,JSBI.__kMaxLengthBits=JSBI.__kMaxLength<<5,JSBI.__kMaxBitsPerChar=[0,0,32,51,64,75,83,90,96,102,107,111,115,119,122,126,128,131,134,136,139,141,143,145,147,149,151,153,154,156,158,159,160,162,163,165,166],JSBI.__kBitsPerCharTableShift=5,JSBI.__kBitsPerCharTableMultiplier=1<<JSBI.__kBitsPerCharTableShift,JSBI.__kConversionChars=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"],JSBI.__kBitConversionBuffer=new ArrayBuffer(8),JSBI.__kBitConversionDouble=new Float64Array(JSBI.__kBitConversionBuffer),JSBI.__kBitConversionInts=new Int32Array(JSBI.__kBitConversionBuffer),JSBI.__clz30=Math.clz32?function(i){return Math.clz32(i)-2}:function(i){return 0===i?30:0|29-(0|Math.log(i>>>0)/Math.LN2)},JSBI.__imul=Math.imul||function(i,_){return 0|i*_},module.exports=JSBI;
//# sourceMappingURL=jsbi-cjs.js.map
(function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self,e.JSBI=t())})(this,function(){"use strict";var e=Math.imul,t=Math.clz32;function i(e){"@babel/helpers - typeof";return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i(e)}function _(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){for(var _,n=0;n<t.length;n++)_=t[n],_.enumerable=_.enumerable||!1,_.configurable=!0,"value"in _&&(_.writable=!0),Object.defineProperty(e,_.key,_)}function l(e,t,i){return t&&n(e.prototype,t),i&&n(e,i),Object.defineProperty(e,"prototype",{writable:!1}),e}function g(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&u(e,t)}function a(e){return a=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},a(e)}function u(e,t){return u=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},u(e,t)}function s(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(t){return!1}}function r(){return r=s()?Reflect.construct:function(e,t,i){var _=[null];_.push.apply(_,t);var n=Function.bind.apply(e,_),l=new n;return i&&u(l,i.prototype),l},r.apply(null,arguments)}function d(e){return-1!==Function.toString.call(e).indexOf("[native code]")}function h(e){var t="function"==typeof Map?new Map:void 0;return h=function(e){function i(){return r(e,arguments,a(this).constructor)}if(null===e||!d(e))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if("undefined"!=typeof t){if(t.has(e))return t.get(e);t.set(e,i)}return i.prototype=Object.create(e.prototype,{constructor:{value:i,enumerable:!1,writable:!0,configurable:!0}}),u(i,e)},h(e)}function b(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function m(e,t){if(t&&("object"==typeof t||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return b(e)}function c(e){var t=s();return function(){var i,_=a(e);if(t){var n=a(this).constructor;i=Reflect.construct(_,arguments,n)}else i=_.apply(this,arguments);return m(this,i)}}function v(e,t){return y(e)||f(e,t)||D(e,t)||k()}function y(e){if(Array.isArray(e))return e}function f(e,t){var i=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=i){var _,n,l=[],g=!0,o=!1;try{for(i=i.call(e);!(g=(_=i.next()).done)&&(l.push(_.value),!(t&&l.length===t));g=!0);}catch(e){o=!0,n=e}finally{try{g||null==i["return"]||i["return"]()}finally{if(o)throw n}}return l}}function D(e,t){if(e){if("string"==typeof e)return p(e,t);var i=Object.prototype.toString.call(e).slice(8,-1);return"Object"===i&&e.constructor&&(i=e.constructor.name),"Map"===i||"Set"===i?Array.from(e):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?p(e,t):void 0}}function p(e,t){(null==t||t>e.length)&&(t=e.length);for(var _=0,n=Array(t);_<t;_++)n[_]=e[_];return n}function k(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function B(e,t){var _="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!_){if(Array.isArray(e)||(_=D(e))||t&&e&&"number"==typeof e.length){_&&(e=_);var n=0,l=function(){};return{s:l,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(t){throw t},f:l}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var g,a=!0,u=!1;return{s:function(){_=_.call(e)},n:function(){var e=_.next();return a=e.done,e},e:function(t){u=!0,g=t},f:function(){try{a||null==_.return||_.return()}finally{if(u)throw g}}}}var S=function(e){var t=Math.abs,n=Math.max,o=Math.floor;function a(e,t){var i;if(_(this,a),i=u.call(this,e),i.sign=t,Object.setPrototypeOf(b(i),a.prototype),e>a.__kMaxLength)throw new RangeError("Maximum BigInt size exceeded");return i}g(a,e);var u=c(a);return l(a,[{key:"toDebugString",value:function(){var e,t=["BigInt["],i=B(this);try{for(i.s();!(e=i.n()).done;){var _=e.value;t.push((_?(_>>>0).toString(16):_)+", ")}}catch(e){i.e(e)}finally{i.f()}return t.push("]"),t.join("")}},{key:"toString",value:function(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:10;if(2>e||36<e)throw new RangeError("toString() radix argument must be between 2 and 36");return 0===this.length?"0":0==(e&e-1)?a.__toStringBasePowerOfTwo(this,e):a.__toStringGeneric(this,e,!1)}},{key:"valueOf",value:function(){throw new Error("Convert JSBI instances to native numbers using `toNumber`.")}},{key:"__copy",value:function(){for(var e=new a(this.length,this.sign),t=0;t<this.length;t++)e[t]=this[t];return e}},{key:"__trim",value:function(){for(var e=this.length,t=this[e-1];0===t;)e--,t=this[e-1],this.pop();return 0===e&&(this.sign=!1),this}},{key:"__initializeDigits",value:function(){for(var e=0;e<this.length;e++)this[e]=0}},{key:"__clzmsd",value:function(){return a.__clz30(this.__digit(this.length-1))}},{key:"__inplaceMultiplyAdd",value:function(e,t,_){_>this.length&&(_=this.length);for(var n=32767&e,l=e>>>15,g=0,o=t,u=0;u<_;u++){var s=this.__digit(u),r=32767&s,d=s>>>15,h=a.__imul(r,n),b=a.__imul(r,l),m=a.__imul(d,n),c=a.__imul(d,l),v=o+h+g;g=v>>>30,v&=1073741823,v+=((32767&b)<<15)+((32767&m)<<15),g+=v>>>30,o=c+(b>>>15)+(m>>>15),this.__setDigit(u,1073741823&v)}if(0!==g||0!==o)throw new Error("implementation bug")}},{key:"__inplaceAdd",value:function(e,t,_){for(var n,l=0,g=0;g<_;g++)n=this.__halfDigit(t+g)+e.__halfDigit(g)+l,l=n>>>15,this.__setHalfDigit(t+g,32767&n);return l}},{key:"__inplaceSub",value:function(e,t,_){var n=0;if(1&t){t>>=1;for(var l=this.__digit(t),g=32767&l,o=0;o<_-1>>>1;o++){var a=e.__digit(o),u=(l>>>15)-(32767&a)-n;n=1&u>>>15,this.__setDigit(t+o,(32767&u)<<15|32767&g),l=this.__digit(t+o+1),g=(32767&l)-(a>>>15)-n,n=1&g>>>15}var s=e.__digit(o),r=(l>>>15)-(32767&s)-n;n=1&r>>>15,this.__setDigit(t+o,(32767&r)<<15|32767&g);if(t+o+1>=this.length)throw new RangeError("out of bounds");0==(1&_)&&(l=this.__digit(t+o+1),g=(32767&l)-(s>>>15)-n,n=1&g>>>15,this.__setDigit(t+e.length,1073709056&l|32767&g))}else{t>>=1;for(var d=0;d<e.length-1;d++){var h=this.__digit(t+d),b=e.__digit(d),m=(32767&h)-(32767&b)-n;n=1&m>>>15;var c=(h>>>15)-(b>>>15)-n;n=1&c>>>15,this.__setDigit(t+d,(32767&c)<<15|32767&m)}var v=this.__digit(t+d),y=e.__digit(d),f=(32767&v)-(32767&y)-n;n=1&f>>>15;var D=0;0==(1&_)&&(D=(v>>>15)-(y>>>15)-n,n=1&D>>>15),this.__setDigit(t+d,(32767&D)<<15|32767&f)}return n}},{key:"__inplaceRightShift",value:function(e){if(0!==e){for(var t,_=this.__digit(0)>>>e,n=this.length-1,l=0;l<n;l++)t=this.__digit(l+1),this.__setDigit(l,1073741823&t<<30-e|_),_=t>>>e;this.__setDigit(n,_)}}},{key:"__digit",value:function(e){return this[e]}},{key:"__unsignedDigit",value:function(e){return this[e]>>>0}},{key:"__setDigit",value:function(e,t){this[e]=0|t}},{key:"__setDigitGrow",value:function(e,t){this[e]=0|t}},{key:"__halfDigitLength",value:function(){var e=this.length;return 32767>=this.__unsignedDigit(e-1)?2*e-1:2*e}},{key:"__halfDigit",value:function(e){return 32767&this[e>>>1]>>>15*(1&e)}},{key:"__setHalfDigit",value:function(e,t){var i=e>>>1,_=this.__digit(i),n=1&e?32767&_|t<<15:1073709056&_|32767&t;this.__setDigit(i,n)}}],[{key:"BigInt",value:function(e){var t=Number.isFinite;if("number"==typeof e){if(0===e)return a.__zero();if(a.__isOneDigitInt(e))return 0>e?a.__oneDigit(-e,!0):a.__oneDigit(e,!1);if(!t(e)||o(e)!==e)throw new RangeError("The number "+e+" cannot be converted to BigInt because it is not an integer");return a.__fromDouble(e)}if("string"==typeof e){var _=a.__fromString(e);if(null===_)throw new SyntaxError("Cannot convert "+e+" to a BigInt");return _}if("boolean"==typeof e)return!0===e?a.__oneDigit(1,!1):a.__zero();if("object"===i(e)){if(e.constructor===a)return e;var n=a.__toPrimitive(e);return a.BigInt(n)}throw new TypeError("Cannot convert "+e+" to a BigInt")}},{key:"toNumber",value:function(e){var t=e.length;if(0===t)return 0;if(1===t){var i=e.__unsignedDigit(0);return e.sign?-i:i}var _=e.__digit(t-1),n=a.__clz30(_),l=30*t-n;if(1024<l)return e.sign?-Infinity:1/0;var g=l-1,o=_,u=t-1,s=n+3,r=32===s?0:o<<s;r>>>=12;var d=s-12,h=12<=s?0:o<<20+s,b=20+s;for(0<d&&0<u&&(u--,o=e.__digit(u),r|=o>>>30-d,h=o<<d+2,b=d+2);0<b&&0<u;)u--,o=e.__digit(u),h|=30<=b?o<<b-30:o>>>30-b,b-=30;var m=a.__decideRounding(e,b,u,o);if((1===m||0===m&&1==(1&h))&&(h=h+1>>>0,0===h&&(r++,0!=r>>>20&&(r=0,g++,1023<g))))return e.sign?-Infinity:1/0;var c=e.sign?-2147483648:0;return g=g+1023<<20,a.__kBitConversionInts[1]=c|g|r,a.__kBitConversionInts[0]=h,a.__kBitConversionDouble[0]}},{key:"unaryMinus",value:function(e){if(0===e.length)return e;var t=e.__copy();return t.sign=!e.sign,t}},{key:"bitwiseNot",value:function(e){return e.sign?a.__absoluteSubOne(e).__trim():a.__absoluteAddOne(e,!0)}},{key:"exponentiate",value:function(e,t){if(t.sign)throw new RangeError("Exponent must be positive");if(0===t.length)return a.__oneDigit(1,!1);if(0===e.length)return e;if(1===e.length&&1===e.__digit(0))return e.sign&&0==(1&t.__digit(0))?a.unaryMinus(e):e;if(1<t.length)throw new RangeError("BigInt too big");var i=t.__unsignedDigit(0);if(1===i)return e;if(i>=a.__kMaxLengthBits)throw new RangeError("BigInt too big");if(1===e.length&&2===e.__digit(0)){var _=1+(0|i/30),n=e.sign&&0!=(1&i),l=new a(_,n);l.__initializeDigits();var g=1<<i%30;return l.__setDigit(_-1,g),l}var o=null,u=e;for(0!=(1&i)&&(o=e),i>>=1;0!==i;i>>=1)u=a.multiply(u,u),0!=(1&i)&&(null===o?o=u:o=a.multiply(o,u));return o}},{key:"multiply",value:function(e,t){if(0===e.length)return e;if(0===t.length)return t;var _=e.length+t.length;30<=e.__clzmsd()+t.__clzmsd()&&_--;var n=new a(_,e.sign!==t.sign);n.__initializeDigits();for(var l=0;l<e.length;l++)a.__multiplyAccumulate(t,e.__digit(l),n,l);return n.__trim()}},{key:"divide",value:function(e,t){if(0===t.length)throw new RangeError("Division by zero");if(0>a.__absoluteCompare(e,t))return a.__zero();var i,_=e.sign!==t.sign,n=t.__unsignedDigit(0);if(1===t.length&&32767>=n){if(1===n)return _===e.sign?e:a.unaryMinus(e);i=a.__absoluteDivSmall(e,n,null)}else i=a.__absoluteDivLarge(e,t,!0,!1);return i.sign=_,i.__trim()}},{key:"remainder",value:function i(e,t){if(0===t.length)throw new RangeError("Division by zero");if(0>a.__absoluteCompare(e,t))return e;var _=t.__unsignedDigit(0);if(1===t.length&&32767>=_){if(1===_)return a.__zero();var n=a.__absoluteModSmall(e,_);return 0===n?a.__zero():a.__oneDigit(n,e.sign)}var i=a.__absoluteDivLarge(e,t,!1,!0);return i.sign=e.sign,i.__trim()}},{key:"add",value:function(e,t){var i=e.sign;return i===t.sign?a.__absoluteAdd(e,t,i):0<=a.__absoluteCompare(e,t)?a.__absoluteSub(e,t,i):a.__absoluteSub(t,e,!i)}},{key:"subtract",value:function(e,t){var i=e.sign;return i===t.sign?0<=a.__absoluteCompare(e,t)?a.__absoluteSub(e,t,i):a.__absoluteSub(t,e,!i):a.__absoluteAdd(e,t,i)}},{key:"leftShift",value:function(e,t){return 0===t.length||0===e.length?e:t.sign?a.__rightShiftByAbsolute(e,t):a.__leftShiftByAbsolute(e,t)}},{key:"signedRightShift",value:function(e,t){return 0===t.length||0===e.length?e:t.sign?a.__leftShiftByAbsolute(e,t):a.__rightShiftByAbsolute(e,t)}},{key:"unsignedRightShift",value:function(){throw new TypeError("BigInts have no unsigned right shift; use >> instead")}},{key:"lessThan",value:function(e,t){return 0>a.__compareToBigInt(e,t)}},{key:"lessThanOrEqual",value:function(e,t){return 0>=a.__compareToBigInt(e,t)}},{key:"greaterThan",value:function(e,t){return 0<a.__compareToBigInt(e,t)}},{key:"greaterThanOrEqual",value:function(e,t){return 0<=a.__compareToBigInt(e,t)}},{key:"equal",value:function(e,t){if(e.sign!==t.sign)return!1;if(e.length!==t.length)return!1;for(var _=0;_<e.length;_++)if(e.__digit(_)!==t.__digit(_))return!1;return!0}},{key:"notEqual",value:function(e,t){return!a.equal(e,t)}},{key:"bitwiseAnd",value:function(e,t){if(!e.sign&&!t.sign)return a.__absoluteAnd(e,t).__trim();if(e.sign&&t.sign){var i=n(e.length,t.length)+1,_=a.__absoluteSubOne(e,i),l=a.__absoluteSubOne(t);return _=a.__absoluteOr(_,l,_),a.__absoluteAddOne(_,!0,_).__trim()}if(e.sign){var g=[t,e];e=g[0],t=g[1]}return a.__absoluteAndNot(e,a.__absoluteSubOne(t)).__trim()}},{key:"bitwiseXor",value:function(e,t){if(!e.sign&&!t.sign)return a.__absoluteXor(e,t).__trim();if(e.sign&&t.sign){var i=n(e.length,t.length),_=a.__absoluteSubOne(e,i),l=a.__absoluteSubOne(t);return a.__absoluteXor(_,l,_).__trim()}var g=n(e.length,t.length)+1;if(e.sign){var o=[t,e];e=o[0],t=o[1]}var u=a.__absoluteSubOne(t,g);return u=a.__absoluteXor(u,e,u),a.__absoluteAddOne(u,!0,u).__trim()}},{key:"bitwiseOr",value:function(e,t){var i=n(e.length,t.length);if(!e.sign&&!t.sign)return a.__absoluteOr(e,t).__trim();if(e.sign&&t.sign){var _=a.__absoluteSubOne(e,i),l=a.__absoluteSubOne(t);return _=a.__absoluteAnd(_,l,_),a.__absoluteAddOne(_,!0,_).__trim()}if(e.sign){var g=[t,e];e=g[0],t=g[1]}var o=a.__absoluteSubOne(t,i);return o=a.__absoluteAndNot(o,e,o),a.__absoluteAddOne(o,!0,o).__trim()}},{key:"asIntN",value:function(e,t){if(0===t.length)return t;if(e=o(e),0>e)throw new RangeError("Invalid value: not (convertible to) a safe integer");if(0===e)return a.__zero();if(e>=a.__kMaxLengthBits)return t;var _=0|(e+29)/30;if(t.length<_)return t;var l=t.__unsignedDigit(_-1),g=1<<(e-1)%30;if(t.length===_&&l<g)return t;if(!((l&g)===g))return a.__truncateToNBits(e,t);if(!t.sign)return a.__truncateAndSubFromPowerOfTwo(e,t,!0);if(0==(l&g-1)){for(var u=_-2;0<=u;u--)if(0!==t.__digit(u))return a.__truncateAndSubFromPowerOfTwo(e,t,!1);return t.length===_&&l===g?t:a.__truncateToNBits(e,t)}return a.__truncateAndSubFromPowerOfTwo(e,t,!1)}},{key:"asUintN",value:function(e,t){if(0===t.length)return t;if(e=o(e),0>e)throw new RangeError("Invalid value: not (convertible to) a safe integer");if(0===e)return a.__zero();if(t.sign){if(e>a.__kMaxLengthBits)throw new RangeError("BigInt too big");return a.__truncateAndSubFromPowerOfTwo(e,t,!1)}if(e>=a.__kMaxLengthBits)return t;var i=0|(e+29)/30;if(t.length<i)return t;var _=e%30;if(t.length==i){if(0===_)return t;var l=t.__digit(i-1);if(0==l>>>_)return t}return a.__truncateToNBits(e,t)}},{key:"ADD",value:function(e,t){if(e=a.__toPrimitive(e),t=a.__toPrimitive(t),"string"==typeof e)return"string"!=typeof t&&(t=t.toString()),e+t;if("string"==typeof t)return e.toString()+t;if(e=a.__toNumeric(e),t=a.__toNumeric(t),a.__isBigInt(e)&&a.__isBigInt(t))return a.add(e,t);if("number"==typeof e&&"number"==typeof t)return e+t;throw new TypeError("Cannot mix BigInt and other types, use explicit conversions")}},{key:"LT",value:function(e,t){return a.__compare(e,t,0)}},{key:"LE",value:function(e,t){return a.__compare(e,t,1)}},{key:"GT",value:function(e,t){return a.__compare(e,t,2)}},{key:"GE",value:function(e,t){return a.__compare(e,t,3)}},{key:"EQ",value:function(e,t){for(;;){if(a.__isBigInt(e))return a.__isBigInt(t)?a.equal(e,t):a.EQ(t,e);if("number"==typeof e){if(a.__isBigInt(t))return a.__equalToNumber(t,e);if("object"!==i(t))return e==t;t=a.__toPrimitive(t)}else if("string"==typeof e){if(a.__isBigInt(t))return e=a.__fromString(e),null!==e&&a.equal(e,t);if("object"!==i(t))return e==t;t=a.__toPrimitive(t)}else if("boolean"==typeof e){if(a.__isBigInt(t))return a.__equalToNumber(t,+e);if("object"!==i(t))return e==t;t=a.__toPrimitive(t)}else if("symbol"===i(e)){if(a.__isBigInt(t))return!1;if("object"!==i(t))return e==t;t=a.__toPrimitive(t)}else if("object"===i(e)){if("object"===i(t)&&t.constructor!==a)return e==t;e=a.__toPrimitive(e)}else return e==t}}},{key:"NE",value:function(e,t){return!a.EQ(e,t)}},{key:"DataViewGetBigInt64",value:function(e,t){var i=!!(2<arguments.length&&void 0!==arguments[2])&&arguments[2];return a.asIntN(64,a.DataViewGetBigUint64(e,t,i))}},{key:"DataViewGetBigUint64",value:function(e,t){var i=!!(2<arguments.length&&void 0!==arguments[2])&&arguments[2],_=i?[4,0]:[0,4],n=v(_,2),g=n[0],o=n[1],l=e.getUint32(t+g,i),u=e.getUint32(t+o,i),s=new a(3,!1);return s.__setDigit(0,1073741823&u),s.__setDigit(1,(268435455&l)<<2|u>>>30),s.__setDigit(2,l>>>28),s.__trim()}},{key:"DataViewSetBigInt64",value:function(e,t,i){var _=!!(3<arguments.length&&void 0!==arguments[3])&&arguments[3];a.DataViewSetBigUint64(e,t,i,_)}},{key:"DataViewSetBigUint64",value:function(e,t,i){var _=!!(3<arguments.length&&void 0!==arguments[3])&&arguments[3];i=a.asUintN(64,i);var n=0,g=0;if(0<i.length&&(g=i.__digit(0),1<i.length)){var o=i.__digit(1);g|=o<<30,n=o>>>2,2<i.length&&(n|=i.__digit(2)<<28)}var u=_?[4,0]:[0,4],s=v(u,2),r=s[0],d=s[1];e.setUint32(t+r,n,_),e.setUint32(t+d,g,_)}},{key:"__zero",value:function(){return new a(0,!1)}},{key:"__oneDigit",value:function(e,t){var i=new a(1,t);return i.__setDigit(0,e),i}},{key:"__decideRounding",value:function(e,t,i,_){if(0<t)return-1;var n;if(0>t)n=-t-1;else{if(0===i)return-1;i--,_=e.__digit(i),n=29}var l=1<<n;if(0==(_&l))return-1;if(l-=1,0!=(_&l))return 1;for(;0<i;)if(i--,0!==e.__digit(i))return 1;return 0}},{key:"__fromDouble",value:function(e){a.__kBitConversionDouble[0]=e;var t,i=2047&a.__kBitConversionInts[1]>>>20,_=i-1023,n=(0|_/30)+1,l=new a(n,0>e),g=1048575&a.__kBitConversionInts[1]|1048576,o=a.__kBitConversionInts[0],u=20,s=_%30,r=0;if(s<u){var d=u-s;r=d+32,t=g>>>d,g=g<<32-d|o>>>d,o<<=32-d}else if(s===u)r=32,t=g,g=o,o=0;else{var h=s-u;r=32-h,t=g<<h|o>>>32-h,g=o<<h,o=0}l.__setDigit(n-1,t);for(var b=n-2;0<=b;b--)0<r?(r-=30,t=g>>>2,g=g<<30|o>>>2,o<<=30):t=0,l.__setDigit(b,t);return l.__trim()}},{key:"__isWhitespace",value:function(e){return!!(13>=e&&9<=e)||(159>=e?32==e:131071>=e?160==e||5760==e:196607>=e?(e&=131071,10>=e||40==e||41==e||47==e||95==e||4096==e):65279==e)}},{key:"__fromString",value:function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:0,i=0,_=e.length,n=0;if(n===_)return a.__zero();for(var l=e.charCodeAt(n);a.__isWhitespace(l);){if(++n===_)return a.__zero();l=e.charCodeAt(n)}if(43===l){if(++n===_)return null;l=e.charCodeAt(n),i=1}else if(45===l){if(++n===_)return null;l=e.charCodeAt(n),i=-1}if(0===t){if(t=10,48===l){if(++n===_)return a.__zero();if(l=e.charCodeAt(n),88===l||120===l){if(t=16,++n===_)return null;l=e.charCodeAt(n)}else if(79===l||111===l){if(t=8,++n===_)return null;l=e.charCodeAt(n)}else if(66===l||98===l){if(t=2,++n===_)return null;l=e.charCodeAt(n)}}}else if(16===t&&48===l){if(++n===_)return a.__zero();if(l=e.charCodeAt(n),88===l||120===l){if(++n===_)return null;l=e.charCodeAt(n)}}if(0!==i&&10!==t)return null;for(;48===l;){if(++n===_)return a.__zero();l=e.charCodeAt(n)}var g=_-n,o=a.__kMaxBitsPerChar[t],u=a.__kBitsPerCharTableMultiplier-1;if(g>1073741824/o)return null;var s=o*g+u>>>a.__kBitsPerCharTableShift,r=new a(0|(s+29)/30,!1),h=10>t?t:10,b=10<t?t-10:0;if(0==(t&t-1)){o>>=a.__kBitsPerCharTableShift;var c=[],v=[],y=!1;do{for(var f,D=0,p=0;;){if(f=void 0,l-48>>>0<h)f=l-48;else if((32|l)-97>>>0<b)f=(32|l)-87;else{y=!0;break}if(p+=o,D=D<<o|f,++n===_){y=!0;break}if(l=e.charCodeAt(n),30<p+o)break}c.push(D),v.push(p)}while(!y);a.__fillFromParts(r,c,v)}else{r.__initializeDigits();var k=!1,B=0;do{for(var S,C=0,I=1;;){if(S=void 0,l-48>>>0<h)S=l-48;else if((32|l)-97>>>0<b)S=(32|l)-87;else{k=!0;break}var A=I*t;if(1073741823<A)break;if(I=A,C=C*t+S,B++,++n===_){k=!0;break}l=e.charCodeAt(n)}u=30*a.__kBitsPerCharTableMultiplier-1;var m=0|(o*B+u>>>a.__kBitsPerCharTableShift)/30;r.__inplaceMultiplyAdd(I,C,m)}while(!k)}if(n!==_){if(!a.__isWhitespace(l))return null;for(n++;n<_;n++)if(l=e.charCodeAt(n),!a.__isWhitespace(l))return null}return r.sign=-1===i,r.__trim()}},{key:"__fillFromParts",value:function(e,t,_){for(var n=0,l=0,g=0,o=t.length-1;0<=o;o--){var a=t[o],u=_[o];l|=a<<g,g+=u,30===g?(e.__setDigit(n++,l),g=0,l=0):30<g&&(e.__setDigit(n++,1073741823&l),g-=30,l=a>>>u-g)}if(0!==l){if(n>=e.length)throw new Error("implementation bug");e.__setDigit(n++,l)}for(;n<e.length;n++)e.__setDigit(n,0)}},{key:"__toStringBasePowerOfTwo",value:function(e,t){var _=e.length,n=t-1;n=(85&n>>>1)+(85&n),n=(51&n>>>2)+(51&n),n=(15&n>>>4)+(15&n);var l=n,g=t-1,o=e.__digit(_-1),u=a.__clz30(o),s=0|(30*_-u+l-1)/l;if(e.sign&&s++,268435456<s)throw new Error("string too long");for(var r=Array(s),d=s-1,h=0,b=0,m=0;m<_-1;m++){var c=e.__digit(m),v=(h|c<<b)&g;r[d--]=a.__kConversionChars[v];var y=l-b;for(h=c>>>y,b=30-y;b>=l;)r[d--]=a.__kConversionChars[h&g],h>>>=l,b-=l}var f=(h|o<<b)&g;for(r[d--]=a.__kConversionChars[f],h=o>>>l-b;0!==h;)r[d--]=a.__kConversionChars[h&g],h>>>=l;if(e.sign&&(r[d--]="-"),-1!==d)throw new Error("implementation bug");return r.join("")}},{key:"__toStringGeneric",value:function(e,t,_){var n=e.length;if(0===n)return"";if(1===n){var l=e.__unsignedDigit(0).toString(t);return!1===_&&e.sign&&(l="-"+l),l}var g=30*n-a.__clz30(e.__digit(n-1)),o=a.__kMaxBitsPerChar[t],u=o-1,s=g*a.__kBitsPerCharTableMultiplier;s+=u-1,s=0|s/u;var r,d,h=s+1>>1,b=a.exponentiate(a.__oneDigit(t,!1),a.__oneDigit(h,!1)),m=b.__unsignedDigit(0);if(1===b.length&&32767>=m){r=new a(e.length,!1),r.__initializeDigits();for(var c,v=0,y=2*e.length-1;0<=y;y--)c=v<<15|e.__halfDigit(y),r.__setHalfDigit(y,0|c/m),v=0|c%m;d=v.toString(t)}else{var f=a.__absoluteDivLarge(e,b,!0,!0);r=f.quotient;var D=f.remainder.__trim();d=a.__toStringGeneric(D,t,!0)}r.__trim();for(var p=a.__toStringGeneric(r,t,!0);d.length<h;)d="0"+d;return!1===_&&e.sign&&(p="-"+p),p+d}},{key:"__unequalSign",value:function(e){return e?-1:1}},{key:"__absoluteGreater",value:function(e){return e?-1:1}},{key:"__absoluteLess",value:function(e){return e?1:-1}},{key:"__compareToBigInt",value:function(e,t){var i=e.sign;if(i!==t.sign)return a.__unequalSign(i);var _=a.__absoluteCompare(e,t);return 0<_?a.__absoluteGreater(i):0>_?a.__absoluteLess(i):0}},{key:"__compareToNumber",value:function(e,i){if(a.__isOneDigitInt(i)){var _=e.sign,n=0>i;if(_!==n)return a.__unequalSign(_);if(0===e.length){if(n)throw new Error("implementation bug");return 0===i?0:-1}if(1<e.length)return a.__absoluteGreater(_);var l=t(i),g=e.__unsignedDigit(0);return g>l?a.__absoluteGreater(_):g<l?a.__absoluteLess(_):0}return a.__compareToDouble(e,i)}},{key:"__compareToDouble",value:function(e,t){if(t!==t)return t;if(t===1/0)return-1;if(t===-Infinity)return 1;var i=e.sign;if(i!==0>t)return a.__unequalSign(i);if(0===t)throw new Error("implementation bug: should be handled elsewhere");if(0===e.length)return-1;a.__kBitConversionDouble[0]=t;var _=2047&a.__kBitConversionInts[1]>>>20;if(2047==_)throw new Error("implementation bug: handled elsewhere");var n=_-1023;if(0>n)return a.__absoluteGreater(i);var l=e.length,g=e.__digit(l-1),o=a.__clz30(g),u=30*l-o,s=n+1;if(u<s)return a.__absoluteLess(i);if(u>s)return a.__absoluteGreater(i);var r=1048576|1048575&a.__kBitConversionInts[1],d=a.__kBitConversionInts[0],h=20,b=29-o;if(b!==(0|(u-1)%30))throw new Error("implementation bug");var m,c=0;if(b<h){var v=h-b;c=v+32,m=r>>>v,r=r<<32-v|d>>>v,d<<=32-v}else if(b===h)c=32,m=r,r=d,d=0;else{var y=b-h;c=32-y,m=r<<y|d>>>32-y,r=d<<y,d=0}if(g>>>=0,m>>>=0,g>m)return a.__absoluteGreater(i);if(g<m)return a.__absoluteLess(i);for(var f=l-2;0<=f;f--){0<c?(c-=30,m=r>>>2,r=r<<30|d>>>2,d<<=30):m=0;var D=e.__unsignedDigit(f);if(D>m)return a.__absoluteGreater(i);if(D<m)return a.__absoluteLess(i)}if(0!==r||0!==d){if(0===c)throw new Error("implementation bug");return a.__absoluteLess(i)}return 0}},{key:"__equalToNumber",value:function(e,i){return a.__isOneDigitInt(i)?0===i?0===e.length:1===e.length&&e.sign===0>i&&e.__unsignedDigit(0)===t(i):0===a.__compareToDouble(e,i)}},{key:"__comparisonResultToBool",value:function(e,t){return 0===t?0>e:1===t?0>=e:2===t?0<e:3===t?0<=e:void 0}},{key:"__compare",value:function(e,t,i){if(e=a.__toPrimitive(e),t=a.__toPrimitive(t),"string"==typeof e&&"string"==typeof t)switch(i){case 0:return e<t;case 1:return e<=t;case 2:return e>t;case 3:return e>=t;}if(a.__isBigInt(e)&&"string"==typeof t)return t=a.__fromString(t),null!==t&&a.__comparisonResultToBool(a.__compareToBigInt(e,t),i);if("string"==typeof e&&a.__isBigInt(t))return e=a.__fromString(e),null!==e&&a.__comparisonResultToBool(a.__compareToBigInt(e,t),i);if(e=a.__toNumeric(e),t=a.__toNumeric(t),a.__isBigInt(e)){if(a.__isBigInt(t))return a.__comparisonResultToBool(a.__compareToBigInt(e,t),i);if("number"!=typeof t)throw new Error("implementation bug");return a.__comparisonResultToBool(a.__compareToNumber(e,t),i)}if("number"!=typeof e)throw new Error("implementation bug");if(a.__isBigInt(t))return a.__comparisonResultToBool(a.__compareToNumber(t,e),2^i);if("number"!=typeof t)throw new Error("implementation bug");return 0===i?e<t:1===i?e<=t:2===i?e>t:3===i?e>=t:void 0}},{key:"__absoluteAdd",value:function(e,t,_){if(e.length<t.length)return a.__absoluteAdd(t,e,_);if(0===e.length)return e;if(0===t.length)return e.sign===_?e:a.unaryMinus(e);var n=e.length;(0===e.__clzmsd()||t.length===e.length&&0===t.__clzmsd())&&n++;for(var l,g=new a(n,_),o=0,u=0;u<t.length;u++)l=e.__digit(u)+t.__digit(u)+o,o=l>>>30,g.__setDigit(u,1073741823&l);for(;u<e.length;u++){var s=e.__digit(u)+o;o=s>>>30,g.__setDigit(u,1073741823&s)}return u<g.length&&g.__setDigit(u,o),g.__trim()}},{key:"__absoluteSub",value:function(e,t,_){if(0===e.length)return e;if(0===t.length)return e.sign===_?e:a.unaryMinus(e);for(var n,l=new a(e.length,_),g=0,o=0;o<t.length;o++)n=e.__digit(o)-t.__digit(o)-g,g=1&n>>>30,l.__setDigit(o,1073741823&n);for(;o<e.length;o++){var u=e.__digit(o)-g;g=1&u>>>30,l.__setDigit(o,1073741823&u)}return l.__trim()}},{key:"__absoluteAddOne",value:function(e,t){var _=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null,n=e.length;null===_?_=new a(n,t):_.sign=t;for(var l,g=1,o=0;o<n;o++)l=e.__digit(o)+g,g=l>>>30,_.__setDigit(o,1073741823&l);return 0!==g&&_.__setDigitGrow(n,1),_}},{key:"__absoluteSubOne",value:function(e,t){var _=e.length;t=t||_;for(var n,l=new a(t,!1),g=1,o=0;o<_;o++)n=e.__digit(o)-g,g=1&n>>>30,l.__setDigit(o,1073741823&n);if(0!==g)throw new Error("implementation bug");for(var u=_;u<t;u++)l.__setDigit(u,0);return l}},{key:"__absoluteAnd",value:function(e,t){var _=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null,n=e.length,l=t.length,g=l;if(n<l){g=n;var o=e,u=n;e=t,n=l,t=o,l=u}var s=g;null===_?_=new a(s,!1):s=_.length;for(var r=0;r<g;r++)_.__setDigit(r,e.__digit(r)&t.__digit(r));for(;r<s;r++)_.__setDigit(r,0);return _}},{key:"__absoluteAndNot",value:function(e,t){var _=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null,n=e.length,l=t.length,g=l;n<l&&(g=n);var o=n;null===_?_=new a(o,!1):o=_.length;for(var u=0;u<g;u++)_.__setDigit(u,e.__digit(u)&~t.__digit(u));for(;u<n;u++)_.__setDigit(u,e.__digit(u));for(;u<o;u++)_.__setDigit(u,0);return _}},{key:"__absoluteOr",value:function(e,t){var _=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null,n=e.length,l=t.length,g=l;if(n<l){g=n;var o=e,u=n;e=t,n=l,t=o,l=u}var s=n;null===_?_=new a(s,!1):s=_.length;for(var r=0;r<g;r++)_.__setDigit(r,e.__digit(r)|t.__digit(r));for(;r<n;r++)_.__setDigit(r,e.__digit(r));for(;r<s;r++)_.__setDigit(r,0);return _}},{key:"__absoluteXor",value:function(e,t){var _=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null,n=e.length,l=t.length,g=l;if(n<l){g=n;var o=e,u=n;e=t,n=l,t=o,l=u}var s=n;null===_?_=new a(s,!1):s=_.length;for(var r=0;r<g;r++)_.__setDigit(r,e.__digit(r)^t.__digit(r));for(;r<n;r++)_.__setDigit(r,e.__digit(r));for(;r<s;r++)_.__setDigit(r,0);return _}},{key:"__absoluteCompare",value:function(e,t){var _=e.length-t.length;if(0!=_)return _;for(var n=e.length-1;0<=n&&e.__digit(n)===t.__digit(n);)n--;return 0>n?0:e.__unsignedDigit(n)>t.__unsignedDigit(n)?1:-1}},{key:"__multiplyAccumulate",value:function(e,t,_,n){if(0!==t){for(var l=32767&t,g=t>>>15,o=0,u=0,s=0;s<e.length;s++,n++){var r=_.__digit(n),d=e.__digit(s),h=32767&d,b=d>>>15,m=a.__imul(h,l),c=a.__imul(h,g),v=a.__imul(b,l),y=a.__imul(b,g);r+=u+m+o,o=r>>>30,r&=1073741823,r+=((32767&c)<<15)+((32767&v)<<15),o+=r>>>30,u=y+(c>>>15)+(v>>>15),_.__setDigit(n,1073741823&r)}for(;0!==o||0!==u;n++){var f=_.__digit(n);f+=o+u,u=0,o=f>>>30,_.__setDigit(n,1073741823&f)}}}},{key:"__internalMultiplyAdd",value:function(e,t,_,l,g){for(var o=_,u=0,s=0;s<l;s++){var d=e.__digit(s),h=a.__imul(32767&d,t),b=a.__imul(d>>>15,t),m=h+((32767&b)<<15)+u+o;o=m>>>30,u=b>>>15,g.__setDigit(s,1073741823&m)}if(g.length>l)for(g.__setDigit(l++,o+u);l<g.length;)g.__setDigit(l++,0);else if(0!==o+u)throw new Error("implementation bug")}},{key:"__absoluteDivSmall",value:function(e,t){var _=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;null===_&&(_=new a(e.length,!1));for(var n=0,l=2*e.length-1;0<=l;l-=2){var g=(n<<15|e.__halfDigit(l))>>>0,o=0|g/t;n=0|g%t,g=(n<<15|e.__halfDigit(l-1))>>>0;var u=0|g/t;n=0|g%t,_.__setDigit(l>>>1,o<<15|u)}return _}},{key:"__absoluteModSmall",value:function(e,t){for(var _,n=0,l=2*e.length-1;0<=l;l--)_=(n<<15|e.__halfDigit(l))>>>0,n=0|_%t;return n}},{key:"__absoluteDivLarge",value:function(e,t,i,_){var l=t.__halfDigitLength(),n=t.length,g=e.__halfDigitLength()-l,o=null;i&&(o=new a(g+2>>>1,!1),o.__initializeDigits());var s=new a(l+2>>>1,!1);s.__initializeDigits();var r=a.__clz15(t.__halfDigit(l-1));0<r&&(t=a.__specialLeftShift(t,r,0));for(var d=a.__specialLeftShift(e,r,1),u=t.__halfDigit(l-1),h=0,b=g;0<=b;b--){var m=32767,v=d.__halfDigit(b+l);if(v!==u){var y=(v<<15|d.__halfDigit(b+l-1))>>>0;m=0|y/u;for(var f=0|y%u,D=t.__halfDigit(l-2),p=d.__halfDigit(b+l-2);a.__imul(m,D)>>>0>(f<<16|p)>>>0&&(m--,f+=u,!(32767<f)););}a.__internalMultiplyAdd(t,m,0,n,s);var k=d.__inplaceSub(s,b,l+1);0!==k&&(k=d.__inplaceAdd(t,b,l),d.__setHalfDigit(b+l,32767&d.__halfDigit(b+l)+k),m--),i&&(1&b?h=m<<15:o.__setDigit(b>>>1,h|m))}if(_)return d.__inplaceRightShift(r),i?{quotient:o,remainder:d}:d;if(i)return o;throw new Error("unreachable")}},{key:"__clz15",value:function(e){return a.__clz30(e)-15}},{key:"__specialLeftShift",value:function(e,t,_){var l=e.length,n=new a(l+_,!1);if(0===t){for(var g=0;g<l;g++)n.__setDigit(g,e.__digit(g));return 0<_&&n.__setDigit(l,0),n}for(var o,u=0,s=0;s<l;s++)o=e.__digit(s),n.__setDigit(s,1073741823&o<<t|u),u=o>>>30-t;return 0<_&&n.__setDigit(l,u),n}},{key:"__leftShiftByAbsolute",value:function(e,t){var _=a.__toShiftAmount(t);if(0>_)throw new RangeError("BigInt too big");var n=0|_/30,l=_%30,g=e.length,o=0!==l&&0!=e.__digit(g-1)>>>30-l,u=g+n+(o?1:0),s=new a(u,e.sign);if(0===l){for(var r=0;r<n;r++)s.__setDigit(r,0);for(;r<u;r++)s.__setDigit(r,e.__digit(r-n))}else{for(var h=0,b=0;b<n;b++)s.__setDigit(b,0);for(var m,c=0;c<g;c++)m=e.__digit(c),s.__setDigit(c+n,1073741823&m<<l|h),h=m>>>30-l;if(o)s.__setDigit(g+n,h);else if(0!==h)throw new Error("implementation bug")}return s.__trim()}},{key:"__rightShiftByAbsolute",value:function(e,t){var _=e.length,n=e.sign,l=a.__toShiftAmount(t);if(0>l)return a.__rightShiftByMaximum(n);var g=0|l/30,o=l%30,u=_-g;if(0>=u)return a.__rightShiftByMaximum(n);var s=!1;if(n){if(0!=(e.__digit(g)&(1<<o)-1))s=!0;else for(var r=0;r<g;r++)if(0!==e.__digit(r)){s=!0;break}}if(s&&0===o){var h=e.__digit(_-1);0==~h&&u++}var b=new a(u,n);if(0===o){b.__setDigit(u-1,0);for(var m=g;m<_;m++)b.__setDigit(m-g,e.__digit(m))}else{for(var c,v=e.__digit(g)>>>o,y=_-g-1,f=0;f<y;f++)c=e.__digit(f+g+1),b.__setDigit(f,1073741823&c<<30-o|v),v=c>>>o;b.__setDigit(y,v)}return s&&(b=a.__absoluteAddOne(b,!0,b)),b.__trim()}},{key:"__rightShiftByMaximum",value:function(e){return e?a.__oneDigit(1,!0):a.__zero()}},{key:"__toShiftAmount",value:function(e){if(1<e.length)return-1;var t=e.__unsignedDigit(0);return t>a.__kMaxLengthBits?-1:t}},{key:"__toPrimitive",value:function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:"default";if("object"!==i(e))return e;if(e.constructor===a)return e;if("undefined"!=typeof Symbol&&"symbol"===i(Symbol.toPrimitive)){var _=e[Symbol.toPrimitive];if(_){var n=_(t);if("object"!==i(n))return n;throw new TypeError("Cannot convert object to primitive value")}}var l=e.valueOf;if(l){var g=l.call(e);if("object"!==i(g))return g}var o=e.toString;if(o){var u=o.call(e);if("object"!==i(u))return u}throw new TypeError("Cannot convert object to primitive value")}},{key:"__toNumeric",value:function(e){return a.__isBigInt(e)?e:+e}},{key:"__isBigInt",value:function(e){return"object"===i(e)&&null!==e&&e.constructor===a}},{key:"__truncateToNBits",value:function(e,t){for(var _=0|(e+29)/30,n=new a(_,t.sign),l=_-1,g=0;g<l;g++)n.__setDigit(g,t.__digit(g));var o=t.__digit(l);if(0!=e%30){var u=32-e%30;o=o<<u>>>u}return n.__setDigit(l,o),n.__trim()}},{key:"__truncateAndSubFromPowerOfTwo",value:function(e,t,_){for(var n=Math.min,l,g=0|(e+29)/30,o=new a(g,_),u=0,s=g-1,d=0,h=n(s,t.length);u<h;u++)l=0-t.__digit(u)-d,d=1&l>>>30,o.__setDigit(u,1073741823&l);for(;u<s;u++)o.__setDigit(u,0|1073741823&-d);var b,m=s<t.length?t.__digit(s):0,c=e%30;if(0===c)b=0-m-d,b&=1073741823;else{var v=32-c;m=m<<v>>>v;var y=1<<32-v;b=y-m-d,b&=y-1}return o.__setDigit(s,b),o.__trim()}},{key:"__digitPow",value:function(e,t){for(var i=1;0<t;)1&t&&(i*=e),t>>>=1,e*=e;return i}},{key:"__isOneDigitInt",value:function(e){return(1073741823&e)===e}}]),a}(h(Array));return S.__kMaxLength=33554432,S.__kMaxLengthBits=S.__kMaxLength<<5,S.__kMaxBitsPerChar=[0,0,32,51,64,75,83,90,96,102,107,111,115,119,122,126,128,131,134,136,139,141,143,145,147,149,151,153,154,156,158,159,160,162,163,165,166],S.__kBitsPerCharTableShift=5,S.__kBitsPerCharTableMultiplier=1<<S.__kBitsPerCharTableShift,S.__kConversionChars=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"],S.__kBitConversionBuffer=new ArrayBuffer(8),S.__kBitConversionDouble=new Float64Array(S.__kBitConversionBuffer),S.__kBitConversionInts=new Int32Array(S.__kBitConversionBuffer),S.__clz30=t?function(e){return t(e)-2}:function(e){var t=Math.LN2,i=Math.log;return 0===e?30:0|29-(0|i(e>>>0)/t)},S.__imul=e||function(e,t){return 0|e*t},S});
//# sourceMappingURL=jsbi-umd.js.map
class JSBI extends Array{constructor(i,_){if(super(i),this.sign=_,Object.setPrototypeOf(this,JSBI.prototype),i>JSBI.__kMaxLength)throw new RangeError("Maximum BigInt size exceeded")}static BigInt(i){var _=Math.floor,t=Number.isFinite;if("number"==typeof i){if(0===i)return JSBI.__zero();if(JSBI.__isOneDigitInt(i))return 0>i?JSBI.__oneDigit(-i,!0):JSBI.__oneDigit(i,!1);if(!t(i)||_(i)!==i)throw new RangeError("The number "+i+" cannot be converted to BigInt because it is not an integer");return JSBI.__fromDouble(i)}if("string"==typeof i){const _=JSBI.__fromString(i);if(null===_)throw new SyntaxError("Cannot convert "+i+" to a BigInt");return _}if("boolean"==typeof i)return!0===i?JSBI.__oneDigit(1,!1):JSBI.__zero();if("object"==typeof i){if(i.constructor===JSBI)return i;const _=JSBI.__toPrimitive(i);return JSBI.BigInt(_)}throw new TypeError("Cannot convert "+i+" to a BigInt")}toDebugString(){const i=["BigInt["];for(const _ of this)i.push((_?(_>>>0).toString(16):_)+", ");return i.push("]"),i.join("")}toString(i=10){if(2>i||36<i)throw new RangeError("toString() radix argument must be between 2 and 36");return 0===this.length?"0":0==(i&i-1)?JSBI.__toStringBasePowerOfTwo(this,i):JSBI.__toStringGeneric(this,i,!1)}valueOf(){throw new Error("Convert JSBI instances to native numbers using `toNumber`.")}static toNumber(i){const _=i.length;if(0===_)return 0;if(1===_){const _=i.__unsignedDigit(0);return i.sign?-_:_}const t=i.__digit(_-1),e=JSBI.__clz30(t),n=30*_-e;if(1024<n)return i.sign?-Infinity:1/0;let g=n-1,s=t,o=_-1;const l=e+3;let r=32===l?0:s<<l;r>>>=12;const a=l-12;let u=12<=l?0:s<<20+l,d=20+l;for(0<a&&0<o&&(o--,s=i.__digit(o),r|=s>>>30-a,u=s<<a+2,d=a+2);0<d&&0<o;)o--,s=i.__digit(o),u|=30<=d?s<<d-30:s>>>30-d,d-=30;const h=JSBI.__decideRounding(i,d,o,s);if((1===h||0===h&&1==(1&u))&&(u=u+1>>>0,0===u&&(r++,0!=r>>>20&&(r=0,g++,1023<g))))return i.sign?-Infinity:1/0;const m=i.sign?-2147483648:0;return g=g+1023<<20,JSBI.__kBitConversionInts[1]=m|g|r,JSBI.__kBitConversionInts[0]=u,JSBI.__kBitConversionDouble[0]}static unaryMinus(i){if(0===i.length)return i;const _=i.__copy();return _.sign=!i.sign,_}static bitwiseNot(i){return i.sign?JSBI.__absoluteSubOne(i).__trim():JSBI.__absoluteAddOne(i,!0)}static exponentiate(i,_){if(_.sign)throw new RangeError("Exponent must be positive");if(0===_.length)return JSBI.__oneDigit(1,!1);if(0===i.length)return i;if(1===i.length&&1===i.__digit(0))return i.sign&&0==(1&_.__digit(0))?JSBI.unaryMinus(i):i;if(1<_.length)throw new RangeError("BigInt too big");let t=_.__unsignedDigit(0);if(1===t)return i;if(t>=JSBI.__kMaxLengthBits)throw new RangeError("BigInt too big");if(1===i.length&&2===i.__digit(0)){const _=1+(0|t/30),e=i.sign&&0!=(1&t),n=new JSBI(_,e);n.__initializeDigits();const g=1<<t%30;return n.__setDigit(_-1,g),n}let e=null,n=i;for(0!=(1&t)&&(e=i),t>>=1;0!==t;t>>=1)n=JSBI.multiply(n,n),0!=(1&t)&&(null===e?e=n:e=JSBI.multiply(e,n));return e}static multiply(_,t){if(0===_.length)return _;if(0===t.length)return t;let i=_.length+t.length;30<=_.__clzmsd()+t.__clzmsd()&&i--;const e=new JSBI(i,_.sign!==t.sign);e.__initializeDigits();for(let n=0;n<_.length;n++)JSBI.__multiplyAccumulate(t,_.__digit(n),e,n);return e.__trim()}static divide(i,_){if(0===_.length)throw new RangeError("Division by zero");if(0>JSBI.__absoluteCompare(i,_))return JSBI.__zero();const t=i.sign!==_.sign,e=_.__unsignedDigit(0);let n;if(1===_.length&&32767>=e){if(1===e)return t===i.sign?i:JSBI.unaryMinus(i);n=JSBI.__absoluteDivSmall(i,e,null)}else n=JSBI.__absoluteDivLarge(i,_,!0,!1);return n.sign=t,n.__trim()}static remainder(i,_){if(0===_.length)throw new RangeError("Division by zero");if(0>JSBI.__absoluteCompare(i,_))return i;const t=_.__unsignedDigit(0);if(1===_.length&&32767>=t){if(1===t)return JSBI.__zero();const _=JSBI.__absoluteModSmall(i,t);return 0===_?JSBI.__zero():JSBI.__oneDigit(_,i.sign)}const e=JSBI.__absoluteDivLarge(i,_,!1,!0);return e.sign=i.sign,e.__trim()}static add(i,_){const t=i.sign;return t===_.sign?JSBI.__absoluteAdd(i,_,t):0<=JSBI.__absoluteCompare(i,_)?JSBI.__absoluteSub(i,_,t):JSBI.__absoluteSub(_,i,!t)}static subtract(i,_){const t=i.sign;return t===_.sign?0<=JSBI.__absoluteCompare(i,_)?JSBI.__absoluteSub(i,_,t):JSBI.__absoluteSub(_,i,!t):JSBI.__absoluteAdd(i,_,t)}static leftShift(i,_){return 0===_.length||0===i.length?i:_.sign?JSBI.__rightShiftByAbsolute(i,_):JSBI.__leftShiftByAbsolute(i,_)}static signedRightShift(i,_){return 0===_.length||0===i.length?i:_.sign?JSBI.__leftShiftByAbsolute(i,_):JSBI.__rightShiftByAbsolute(i,_)}static unsignedRightShift(){throw new TypeError("BigInts have no unsigned right shift; use >> instead")}static lessThan(i,_){return 0>JSBI.__compareToBigInt(i,_)}static lessThanOrEqual(i,_){return 0>=JSBI.__compareToBigInt(i,_)}static greaterThan(i,_){return 0<JSBI.__compareToBigInt(i,_)}static greaterThanOrEqual(i,_){return 0<=JSBI.__compareToBigInt(i,_)}static equal(_,t){if(_.sign!==t.sign)return!1;if(_.length!==t.length)return!1;for(let e=0;e<_.length;e++)if(_.__digit(e)!==t.__digit(e))return!1;return!0}static notEqual(i,_){return!JSBI.equal(i,_)}static bitwiseAnd(i,_){var t=Math.max;if(!i.sign&&!_.sign)return JSBI.__absoluteAnd(i,_).__trim();if(i.sign&&_.sign){const e=t(i.length,_.length)+1;let n=JSBI.__absoluteSubOne(i,e);const g=JSBI.__absoluteSubOne(_);return n=JSBI.__absoluteOr(n,g,n),JSBI.__absoluteAddOne(n,!0,n).__trim()}return i.sign&&([i,_]=[_,i]),JSBI.__absoluteAndNot(i,JSBI.__absoluteSubOne(_)).__trim()}static bitwiseXor(i,_){var t=Math.max;if(!i.sign&&!_.sign)return JSBI.__absoluteXor(i,_).__trim();if(i.sign&&_.sign){const e=t(i.length,_.length),n=JSBI.__absoluteSubOne(i,e),g=JSBI.__absoluteSubOne(_);return JSBI.__absoluteXor(n,g,n).__trim()}const e=t(i.length,_.length)+1;i.sign&&([i,_]=[_,i]);let n=JSBI.__absoluteSubOne(_,e);return n=JSBI.__absoluteXor(n,i,n),JSBI.__absoluteAddOne(n,!0,n).__trim()}static bitwiseOr(i,_){var t=Math.max;const e=t(i.length,_.length);if(!i.sign&&!_.sign)return JSBI.__absoluteOr(i,_).__trim();if(i.sign&&_.sign){let t=JSBI.__absoluteSubOne(i,e);const n=JSBI.__absoluteSubOne(_);return t=JSBI.__absoluteAnd(t,n,t),JSBI.__absoluteAddOne(t,!0,t).__trim()}i.sign&&([i,_]=[_,i]);let n=JSBI.__absoluteSubOne(_,e);return n=JSBI.__absoluteAndNot(n,i,n),JSBI.__absoluteAddOne(n,!0,n).__trim()}static asIntN(_,t){var i=Math.floor;if(0===t.length)return t;if(_=i(_),0>_)throw new RangeError("Invalid value: not (convertible to) a safe integer");if(0===_)return JSBI.__zero();if(_>=JSBI.__kMaxLengthBits)return t;const e=0|(_+29)/30;if(t.length<e)return t;const g=t.__unsignedDigit(e-1),s=1<<(_-1)%30;if(t.length===e&&g<s)return t;if(!((g&s)===s))return JSBI.__truncateToNBits(_,t);if(!t.sign)return JSBI.__truncateAndSubFromPowerOfTwo(_,t,!0);if(0==(g&s-1)){for(let n=e-2;0<=n;n--)if(0!==t.__digit(n))return JSBI.__truncateAndSubFromPowerOfTwo(_,t,!1);return t.length===e&&g===s?t:JSBI.__truncateToNBits(_,t)}return JSBI.__truncateAndSubFromPowerOfTwo(_,t,!1)}static asUintN(i,_){var t=Math.floor;if(0===_.length)return _;if(i=t(i),0>i)throw new RangeError("Invalid value: not (convertible to) a safe integer");if(0===i)return JSBI.__zero();if(_.sign){if(i>JSBI.__kMaxLengthBits)throw new RangeError("BigInt too big");return JSBI.__truncateAndSubFromPowerOfTwo(i,_,!1)}if(i>=JSBI.__kMaxLengthBits)return _;const e=0|(i+29)/30;if(_.length<e)return _;const g=i%30;if(_.length==e){if(0===g)return _;const i=_.__digit(e-1);if(0==i>>>g)return _}return JSBI.__truncateToNBits(i,_)}static ADD(i,_){if(i=JSBI.__toPrimitive(i),_=JSBI.__toPrimitive(_),"string"==typeof i)return"string"!=typeof _&&(_=_.toString()),i+_;if("string"==typeof _)return i.toString()+_;if(i=JSBI.__toNumeric(i),_=JSBI.__toNumeric(_),JSBI.__isBigInt(i)&&JSBI.__isBigInt(_))return JSBI.add(i,_);if("number"==typeof i&&"number"==typeof _)return i+_;throw new TypeError("Cannot mix BigInt and other types, use explicit conversions")}static LT(i,_){return JSBI.__compare(i,_,0)}static LE(i,_){return JSBI.__compare(i,_,1)}static GT(i,_){return JSBI.__compare(i,_,2)}static GE(i,_){return JSBI.__compare(i,_,3)}static EQ(i,_){for(;;){if(JSBI.__isBigInt(i))return JSBI.__isBigInt(_)?JSBI.equal(i,_):JSBI.EQ(_,i);if("number"==typeof i){if(JSBI.__isBigInt(_))return JSBI.__equalToNumber(_,i);if("object"!=typeof _)return i==_;_=JSBI.__toPrimitive(_)}else if("string"==typeof i){if(JSBI.__isBigInt(_))return i=JSBI.__fromString(i),null!==i&&JSBI.equal(i,_);if("object"!=typeof _)return i==_;_=JSBI.__toPrimitive(_)}else if("boolean"==typeof i){if(JSBI.__isBigInt(_))return JSBI.__equalToNumber(_,+i);if("object"!=typeof _)return i==_;_=JSBI.__toPrimitive(_)}else if("symbol"==typeof i){if(JSBI.__isBigInt(_))return!1;if("object"!=typeof _)return i==_;_=JSBI.__toPrimitive(_)}else if("object"==typeof i){if("object"==typeof _&&_.constructor!==JSBI)return i==_;i=JSBI.__toPrimitive(i)}else return i==_}}static NE(i,_){return!JSBI.EQ(i,_)}static DataViewGetBigInt64(i,_,t=!1){return JSBI.asIntN(64,JSBI.DataViewGetBigUint64(i,_,t))}static DataViewGetBigUint64(i,_,t=!1){const[e,n]=t?[4,0]:[0,4],g=i.getUint32(_+e,t),s=i.getUint32(_+n,t),o=new JSBI(3,!1);return o.__setDigit(0,1073741823&s),o.__setDigit(1,(268435455&g)<<2|s>>>30),o.__setDigit(2,g>>>28),o.__trim()}static DataViewSetBigInt64(i,_,t,e=!1){JSBI.DataViewSetBigUint64(i,_,t,e)}static DataViewSetBigUint64(i,_,t,e=!1){t=JSBI.asUintN(64,t);let n=0,g=0;if(0<t.length&&(g=t.__digit(0),1<t.length)){const i=t.__digit(1);g|=i<<30,n=i>>>2,2<t.length&&(n|=t.__digit(2)<<28)}const[s,o]=e?[4,0]:[0,4];i.setUint32(_+s,n,e),i.setUint32(_+o,g,e)}static __zero(){return new JSBI(0,!1)}static __oneDigit(i,_){const t=new JSBI(1,_);return t.__setDigit(0,i),t}__copy(){const _=new JSBI(this.length,this.sign);for(let t=0;t<this.length;t++)_[t]=this[t];return _}__trim(){let i=this.length,_=this[i-1];for(;0===_;)i--,_=this[i-1],this.pop();return 0===i&&(this.sign=!1),this}__initializeDigits(){for(let _=0;_<this.length;_++)this[_]=0}static __decideRounding(i,_,t,e){if(0<_)return-1;let n;if(0>_)n=-_-1;else{if(0===t)return-1;t--,e=i.__digit(t),n=29}let g=1<<n;if(0==(e&g))return-1;if(g-=1,0!=(e&g))return 1;for(;0<t;)if(t--,0!==i.__digit(t))return 1;return 0}static __fromDouble(i){JSBI.__kBitConversionDouble[0]=i;const _=2047&JSBI.__kBitConversionInts[1]>>>20,t=_-1023,e=(0|t/30)+1,n=new JSBI(e,0>i);let g=1048575&JSBI.__kBitConversionInts[1]|1048576,s=JSBI.__kBitConversionInts[0];const o=20,l=t%30;let r,a=0;if(l<20){const i=o-l;a=i+32,r=g>>>i,g=g<<32-i|s>>>i,s<<=32-i}else if(l===20)a=32,r=g,g=s,s=0;else{const i=l-o;a=32-i,r=g<<i|s>>>32-i,g=s<<i,s=0}n.__setDigit(e-1,r);for(let _=e-2;0<=_;_--)0<a?(a-=30,r=g>>>2,g=g<<30|s>>>2,s<<=30):r=0,n.__setDigit(_,r);return n.__trim()}static __isWhitespace(i){return!!(13>=i&&9<=i)||(159>=i?32==i:131071>=i?160==i||5760==i:196607>=i?(i&=131071,10>=i||40==i||41==i||47==i||95==i||4096==i):65279==i)}static __fromString(i,_=0){let t=0;const e=i.length;let n=0;if(n===e)return JSBI.__zero();let g=i.charCodeAt(n);for(;JSBI.__isWhitespace(g);){if(++n===e)return JSBI.__zero();g=i.charCodeAt(n)}if(43===g){if(++n===e)return null;g=i.charCodeAt(n),t=1}else if(45===g){if(++n===e)return null;g=i.charCodeAt(n),t=-1}if(0===_){if(_=10,48===g){if(++n===e)return JSBI.__zero();if(g=i.charCodeAt(n),88===g||120===g){if(_=16,++n===e)return null;g=i.charCodeAt(n)}else if(79===g||111===g){if(_=8,++n===e)return null;g=i.charCodeAt(n)}else if(66===g||98===g){if(_=2,++n===e)return null;g=i.charCodeAt(n)}}}else if(16===_&&48===g){if(++n===e)return JSBI.__zero();if(g=i.charCodeAt(n),88===g||120===g){if(++n===e)return null;g=i.charCodeAt(n)}}if(0!=t&&10!==_)return null;for(;48===g;){if(++n===e)return JSBI.__zero();g=i.charCodeAt(n)}const s=e-n;let o=JSBI.__kMaxBitsPerChar[_],l=JSBI.__kBitsPerCharTableMultiplier-1;if(s>1073741824/o)return null;const r=o*s+l>>>JSBI.__kBitsPerCharTableShift,a=new JSBI(0|(r+29)/30,!1),u=10>_?_:10,h=10<_?_-10:0;if(0==(_&_-1)){o>>=JSBI.__kBitsPerCharTableShift;const _=[],t=[];let s=!1;do{let l=0,r=0;for(;;){let _;if(g-48>>>0<u)_=g-48;else if((32|g)-97>>>0<h)_=(32|g)-87;else{s=!0;break}if(r+=o,l=l<<o|_,++n===e){s=!0;break}if(g=i.charCodeAt(n),30<r+o)break}_.push(l),t.push(r)}while(!s);JSBI.__fillFromParts(a,_,t)}else{a.__initializeDigits();let t=!1,s=0;do{let r=0,b=1;for(;;){let o;if(g-48>>>0<u)o=g-48;else if((32|g)-97>>>0<h)o=(32|g)-87;else{t=!0;break}const l=b*_;if(1073741823<l)break;if(b=l,r=r*_+o,s++,++n===e){t=!0;break}g=i.charCodeAt(n)}l=30*JSBI.__kBitsPerCharTableMultiplier-1;const D=0|(o*s+l>>>JSBI.__kBitsPerCharTableShift)/30;a.__inplaceMultiplyAdd(b,r,D)}while(!t)}if(n!==e){if(!JSBI.__isWhitespace(g))return null;for(n++;n<e;n++)if(g=i.charCodeAt(n),!JSBI.__isWhitespace(g))return null}return a.sign=-1==t,a.__trim()}static __fillFromParts(_,t,e){let n=0,g=0,s=0;for(let o=t.length-1;0<=o;o--){const i=t[o],l=e[o];g|=i<<s,s+=l,30===s?(_.__setDigit(n++,g),s=0,g=0):30<s&&(_.__setDigit(n++,1073741823&g),s-=30,g=i>>>l-s)}if(0!==g){if(n>=_.length)throw new Error("implementation bug");_.__setDigit(n++,g)}for(;n<_.length;n++)_.__setDigit(n,0)}static __toStringBasePowerOfTwo(_,i){const t=_.length;let e=i-1;e=(85&e>>>1)+(85&e),e=(51&e>>>2)+(51&e),e=(15&e>>>4)+(15&e);const n=e,g=i-1,s=_.__digit(t-1),o=JSBI.__clz30(s);let l=0|(30*t-o+n-1)/n;if(_.sign&&l++,268435456<l)throw new Error("string too long");const r=Array(l);let a=l-1,u=0,d=0;for(let e=0;e<t-1;e++){const i=_.__digit(e),t=(u|i<<d)&g;r[a--]=JSBI.__kConversionChars[t];const s=n-d;for(u=i>>>s,d=30-s;d>=n;)r[a--]=JSBI.__kConversionChars[u&g],u>>>=n,d-=n}const h=(u|s<<d)&g;for(r[a--]=JSBI.__kConversionChars[h],u=s>>>n-d;0!==u;)r[a--]=JSBI.__kConversionChars[u&g],u>>>=n;if(_.sign&&(r[a--]="-"),-1!=a)throw new Error("implementation bug");return r.join("")}static __toStringGeneric(_,i,t){const e=_.length;if(0===e)return"";if(1===e){let e=_.__unsignedDigit(0).toString(i);return!1===t&&_.sign&&(e="-"+e),e}const n=30*e-JSBI.__clz30(_.__digit(e-1)),g=JSBI.__kMaxBitsPerChar[i],s=g-1;let o=n*JSBI.__kBitsPerCharTableMultiplier;o+=s-1,o=0|o/s;const l=o+1>>1,r=JSBI.exponentiate(JSBI.__oneDigit(i,!1),JSBI.__oneDigit(l,!1));let a,u;const d=r.__unsignedDigit(0);if(1===r.length&&32767>=d){a=new JSBI(_.length,!1),a.__initializeDigits();let t=0;for(let e=2*_.length-1;0<=e;e--){const i=t<<15|_.__halfDigit(e);a.__setHalfDigit(e,0|i/d),t=0|i%d}u=t.toString(i)}else{const t=JSBI.__absoluteDivLarge(_,r,!0,!0);a=t.quotient;const e=t.remainder.__trim();u=JSBI.__toStringGeneric(e,i,!0)}a.__trim();let h=JSBI.__toStringGeneric(a,i,!0);for(;u.length<l;)u="0"+u;return!1===t&&_.sign&&(h="-"+h),h+u}static __unequalSign(i){return i?-1:1}static __absoluteGreater(i){return i?-1:1}static __absoluteLess(i){return i?1:-1}static __compareToBigInt(i,_){const t=i.sign;if(t!==_.sign)return JSBI.__unequalSign(t);const e=JSBI.__absoluteCompare(i,_);return 0<e?JSBI.__absoluteGreater(t):0>e?JSBI.__absoluteLess(t):0}static __compareToNumber(i,_){if(JSBI.__isOneDigitInt(_)){const t=i.sign,e=0>_;if(t!==e)return JSBI.__unequalSign(t);if(0===i.length){if(e)throw new Error("implementation bug");return 0===_?0:-1}if(1<i.length)return JSBI.__absoluteGreater(t);const n=Math.abs(_),g=i.__unsignedDigit(0);return g>n?JSBI.__absoluteGreater(t):g<n?JSBI.__absoluteLess(t):0}return JSBI.__compareToDouble(i,_)}static __compareToDouble(i,_){if(_!==_)return _;if(_===1/0)return-1;if(_===-Infinity)return 1;const t=i.sign;if(t!==0>_)return JSBI.__unequalSign(t);if(0===_)throw new Error("implementation bug: should be handled elsewhere");if(0===i.length)return-1;JSBI.__kBitConversionDouble[0]=_;const e=2047&JSBI.__kBitConversionInts[1]>>>20;if(2047==e)throw new Error("implementation bug: handled elsewhere");const n=e-1023;if(0>n)return JSBI.__absoluteGreater(t);const g=i.length;let s=i.__digit(g-1);const o=JSBI.__clz30(s),l=30*g-o,r=n+1;if(l<r)return JSBI.__absoluteLess(t);if(l>r)return JSBI.__absoluteGreater(t);let a=1048576|1048575&JSBI.__kBitConversionInts[1],u=JSBI.__kBitConversionInts[0];const d=20,h=29-o;if(h!==(0|(l-1)%30))throw new Error("implementation bug");let m,b=0;if(20>h){const i=d-h;b=i+32,m=a>>>i,a=a<<32-i|u>>>i,u<<=32-i}else if(20===h)b=32,m=a,a=u,u=0;else{const i=h-d;b=32-i,m=a<<i|u>>>32-i,a=u<<i,u=0}if(s>>>=0,m>>>=0,s>m)return JSBI.__absoluteGreater(t);if(s<m)return JSBI.__absoluteLess(t);for(let e=g-2;0<=e;e--){0<b?(b-=30,m=a>>>2,a=a<<30|u>>>2,u<<=30):m=0;const _=i.__unsignedDigit(e);if(_>m)return JSBI.__absoluteGreater(t);if(_<m)return JSBI.__absoluteLess(t)}if(0!==a||0!==u){if(0===b)throw new Error("implementation bug");return JSBI.__absoluteLess(t)}return 0}static __equalToNumber(i,_){var t=Math.abs;return JSBI.__isOneDigitInt(_)?0===_?0===i.length:1===i.length&&i.sign===0>_&&i.__unsignedDigit(0)===t(_):0===JSBI.__compareToDouble(i,_)}static __comparisonResultToBool(i,_){return 0===_?0>i:1===_?0>=i:2===_?0<i:3===_?0<=i:void 0}static __compare(i,_,t){if(i=JSBI.__toPrimitive(i),_=JSBI.__toPrimitive(_),"string"==typeof i&&"string"==typeof _)switch(t){case 0:return i<_;case 1:return i<=_;case 2:return i>_;case 3:return i>=_;}if(JSBI.__isBigInt(i)&&"string"==typeof _)return _=JSBI.__fromString(_),null!==_&&JSBI.__comparisonResultToBool(JSBI.__compareToBigInt(i,_),t);if("string"==typeof i&&JSBI.__isBigInt(_))return i=JSBI.__fromString(i),null!==i&&JSBI.__comparisonResultToBool(JSBI.__compareToBigInt(i,_),t);if(i=JSBI.__toNumeric(i),_=JSBI.__toNumeric(_),JSBI.__isBigInt(i)){if(JSBI.__isBigInt(_))return JSBI.__comparisonResultToBool(JSBI.__compareToBigInt(i,_),t);if("number"!=typeof _)throw new Error("implementation bug");return JSBI.__comparisonResultToBool(JSBI.__compareToNumber(i,_),t)}if("number"!=typeof i)throw new Error("implementation bug");if(JSBI.__isBigInt(_))return JSBI.__comparisonResultToBool(JSBI.__compareToNumber(_,i),2^t);if("number"!=typeof _)throw new Error("implementation bug");return 0===t?i<_:1===t?i<=_:2===t?i>_:3===t?i>=_:void 0}__clzmsd(){return JSBI.__clz30(this.__digit(this.length-1))}static __absoluteAdd(_,t,e){if(_.length<t.length)return JSBI.__absoluteAdd(t,_,e);if(0===_.length)return _;if(0===t.length)return _.sign===e?_:JSBI.unaryMinus(_);let n=_.length;(0===_.__clzmsd()||t.length===_.length&&0===t.__clzmsd())&&n++;const g=new JSBI(n,e);let s=0,o=0;for(;o<t.length;o++){const i=_.__digit(o)+t.__digit(o)+s;s=i>>>30,g.__setDigit(o,1073741823&i)}for(;o<_.length;o++){const i=_.__digit(o)+s;s=i>>>30,g.__setDigit(o,1073741823&i)}return o<g.length&&g.__setDigit(o,s),g.__trim()}static __absoluteSub(_,t,e){if(0===_.length)return _;if(0===t.length)return _.sign===e?_:JSBI.unaryMinus(_);const n=new JSBI(_.length,e);let g=0,s=0;for(;s<t.length;s++){const i=_.__digit(s)-t.__digit(s)-g;g=1&i>>>30,n.__setDigit(s,1073741823&i)}for(;s<_.length;s++){const i=_.__digit(s)-g;g=1&i>>>30,n.__setDigit(s,1073741823&i)}return n.__trim()}static __absoluteAddOne(_,i,t=null){const e=_.length;null===t?t=new JSBI(e,i):t.sign=i;let n=1;for(let g=0;g<e;g++){const i=_.__digit(g)+n;n=i>>>30,t.__setDigit(g,1073741823&i)}return 0!=n&&t.__setDigitGrow(e,1),t}static __absoluteSubOne(_,t){const e=_.length;t=t||e;const n=new JSBI(t,!1);let g=1;for(let s=0;s<e;s++){const i=_.__digit(s)-g;g=1&i>>>30,n.__setDigit(s,1073741823&i)}if(0!=g)throw new Error("implementation bug");for(let g=e;g<t;g++)n.__setDigit(g,0);return n}static __absoluteAnd(_,t,e=null){let n=_.length,g=t.length,s=g;if(n<g){s=n;const i=_,e=n;_=t,n=g,t=i,g=e}let o=s;null===e?e=new JSBI(o,!1):o=e.length;let l=0;for(;l<s;l++)e.__setDigit(l,_.__digit(l)&t.__digit(l));for(;l<o;l++)e.__setDigit(l,0);return e}static __absoluteAndNot(_,t,e=null){const n=_.length,g=t.length;let s=g;n<g&&(s=n);let o=n;null===e?e=new JSBI(o,!1):o=e.length;let l=0;for(;l<s;l++)e.__setDigit(l,_.__digit(l)&~t.__digit(l));for(;l<n;l++)e.__setDigit(l,_.__digit(l));for(;l<o;l++)e.__setDigit(l,0);return e}static __absoluteOr(_,t,e=null){let n=_.length,g=t.length,s=g;if(n<g){s=n;const i=_,e=n;_=t,n=g,t=i,g=e}let o=n;null===e?e=new JSBI(o,!1):o=e.length;let l=0;for(;l<s;l++)e.__setDigit(l,_.__digit(l)|t.__digit(l));for(;l<n;l++)e.__setDigit(l,_.__digit(l));for(;l<o;l++)e.__setDigit(l,0);return e}static __absoluteXor(_,t,e=null){let n=_.length,g=t.length,s=g;if(n<g){s=n;const i=_,e=n;_=t,n=g,t=i,g=e}let o=n;null===e?e=new JSBI(o,!1):o=e.length;let l=0;for(;l<s;l++)e.__setDigit(l,_.__digit(l)^t.__digit(l));for(;l<n;l++)e.__setDigit(l,_.__digit(l));for(;l<o;l++)e.__setDigit(l,0);return e}static __absoluteCompare(_,t){const e=_.length-t.length;if(0!=e)return e;let n=_.length-1;for(;0<=n&&_.__digit(n)===t.__digit(n);)n--;return 0>n?0:_.__unsignedDigit(n)>t.__unsignedDigit(n)?1:-1}static __multiplyAccumulate(_,t,e,n){if(0===t)return;const g=32767&t,s=t>>>15;let o=0,l=0;for(let r,a=0;a<_.length;a++,n++){r=e.__digit(n);const i=_.__digit(a),t=32767&i,u=i>>>15,d=JSBI.__imul(t,g),h=JSBI.__imul(t,s),m=JSBI.__imul(u,g),b=JSBI.__imul(u,s);r+=l+d+o,o=r>>>30,r&=1073741823,r+=((32767&h)<<15)+((32767&m)<<15),o+=r>>>30,l=b+(h>>>15)+(m>>>15),e.__setDigit(n,1073741823&r)}for(;0!=o||0!==l;n++){let i=e.__digit(n);i+=o+l,l=0,o=i>>>30,e.__setDigit(n,1073741823&i)}}static __internalMultiplyAdd(_,t,e,g,s){let o=e,l=0;for(let n=0;n<g;n++){const i=_.__digit(n),e=JSBI.__imul(32767&i,t),g=JSBI.__imul(i>>>15,t),a=e+((32767&g)<<15)+l+o;o=a>>>30,l=g>>>15,s.__setDigit(n,1073741823&a)}if(s.length>g)for(s.__setDigit(g++,o+l);g<s.length;)s.__setDigit(g++,0);else if(0!==o+l)throw new Error("implementation bug")}__inplaceMultiplyAdd(i,_,t){t>this.length&&(t=this.length);const e=32767&i,n=i>>>15;let g=0,s=_;for(let o=0;o<t;o++){const i=this.__digit(o),_=32767&i,t=i>>>15,l=JSBI.__imul(_,e),r=JSBI.__imul(_,n),a=JSBI.__imul(t,e),u=JSBI.__imul(t,n);let d=s+l+g;g=d>>>30,d&=1073741823,d+=((32767&r)<<15)+((32767&a)<<15),g+=d>>>30,s=u+(r>>>15)+(a>>>15),this.__setDigit(o,1073741823&d)}if(0!=g||0!==s)throw new Error("implementation bug")}static __absoluteDivSmall(_,t,e=null){null===e&&(e=new JSBI(_.length,!1));let n=0;for(let g,s=2*_.length-1;0<=s;s-=2){g=(n<<15|_.__halfDigit(s))>>>0;const i=0|g/t;n=0|g%t,g=(n<<15|_.__halfDigit(s-1))>>>0;const o=0|g/t;n=0|g%t,e.__setDigit(s>>>1,i<<15|o)}return e}static __absoluteModSmall(_,t){let e=0;for(let n=2*_.length-1;0<=n;n--){const i=(e<<15|_.__halfDigit(n))>>>0;e=0|i%t}return e}static __absoluteDivLarge(i,_,t,e){const g=_.__halfDigitLength(),n=_.length,s=i.__halfDigitLength()-g;let o=null;t&&(o=new JSBI(s+2>>>1,!1),o.__initializeDigits());const l=new JSBI(g+2>>>1,!1);l.__initializeDigits();const r=JSBI.__clz15(_.__halfDigit(g-1));0<r&&(_=JSBI.__specialLeftShift(_,r,0));const a=JSBI.__specialLeftShift(i,r,1),u=_.__halfDigit(g-1);let d=0;for(let r,h=s;0<=h;h--){r=32767;const i=a.__halfDigit(h+g);if(i!==u){const t=(i<<15|a.__halfDigit(h+g-1))>>>0;r=0|t/u;let e=0|t%u;const n=_.__halfDigit(g-2),s=a.__halfDigit(h+g-2);for(;JSBI.__imul(r,n)>>>0>(e<<16|s)>>>0&&(r--,e+=u,!(32767<e)););}JSBI.__internalMultiplyAdd(_,r,0,n,l);let e=a.__inplaceSub(l,h,g+1);0!==e&&(e=a.__inplaceAdd(_,h,g),a.__setHalfDigit(h+g,32767&a.__halfDigit(h+g)+e),r--),t&&(1&h?d=r<<15:o.__setDigit(h>>>1,d|r))}if(e)return a.__inplaceRightShift(r),t?{quotient:o,remainder:a}:a;if(t)return o;throw new Error("unreachable")}static __clz15(i){return JSBI.__clz30(i)-15}__inplaceAdd(_,t,e){let n=0;for(let g=0;g<e;g++){const i=this.__halfDigit(t+g)+_.__halfDigit(g)+n;n=i>>>15,this.__setHalfDigit(t+g,32767&i)}return n}__inplaceSub(_,t,e){let n=0;if(1&t){t>>=1;let g=this.__digit(t),s=32767&g,o=0;for(;o<e-1>>>1;o++){const i=_.__digit(o),e=(g>>>15)-(32767&i)-n;n=1&e>>>15,this.__setDigit(t+o,(32767&e)<<15|32767&s),g=this.__digit(t+o+1),s=(32767&g)-(i>>>15)-n,n=1&s>>>15}const i=_.__digit(o),l=(g>>>15)-(32767&i)-n;n=1&l>>>15,this.__setDigit(t+o,(32767&l)<<15|32767&s);if(t+o+1>=this.length)throw new RangeError("out of bounds");0==(1&e)&&(g=this.__digit(t+o+1),s=(32767&g)-(i>>>15)-n,n=1&s>>>15,this.__setDigit(t+_.length,1073709056&g|32767&s))}else{t>>=1;let g=0;for(;g<_.length-1;g++){const i=this.__digit(t+g),e=_.__digit(g),s=(32767&i)-(32767&e)-n;n=1&s>>>15;const o=(i>>>15)-(e>>>15)-n;n=1&o>>>15,this.__setDigit(t+g,(32767&o)<<15|32767&s)}const i=this.__digit(t+g),s=_.__digit(g),o=(32767&i)-(32767&s)-n;n=1&o>>>15;let l=0;0==(1&e)&&(l=(i>>>15)-(s>>>15)-n,n=1&l>>>15),this.__setDigit(t+g,(32767&l)<<15|32767&o)}return n}__inplaceRightShift(_){if(0===_)return;let t=this.__digit(0)>>>_;const e=this.length-1;for(let n=0;n<e;n++){const i=this.__digit(n+1);this.__setDigit(n,1073741823&i<<30-_|t),t=i>>>_}this.__setDigit(e,t)}static __specialLeftShift(_,t,e){const g=_.length,n=new JSBI(g+e,!1);if(0===t){for(let t=0;t<g;t++)n.__setDigit(t,_.__digit(t));return 0<e&&n.__setDigit(g,0),n}let s=0;for(let o=0;o<g;o++){const i=_.__digit(o);n.__setDigit(o,1073741823&i<<t|s),s=i>>>30-t}return 0<e&&n.__setDigit(g,s),n}static __leftShiftByAbsolute(_,i){const t=JSBI.__toShiftAmount(i);if(0>t)throw new RangeError("BigInt too big");const e=0|t/30,n=t%30,g=_.length,s=0!==n&&0!=_.__digit(g-1)>>>30-n,o=g+e+(s?1:0),l=new JSBI(o,_.sign);if(0===n){let t=0;for(;t<e;t++)l.__setDigit(t,0);for(;t<o;t++)l.__setDigit(t,_.__digit(t-e))}else{let t=0;for(let _=0;_<e;_++)l.__setDigit(_,0);for(let s=0;s<g;s++){const i=_.__digit(s);l.__setDigit(s+e,1073741823&i<<n|t),t=i>>>30-n}if(s)l.__setDigit(g+e,t);else if(0!==t)throw new Error("implementation bug")}return l.__trim()}static __rightShiftByAbsolute(_,i){const t=_.length,e=_.sign,n=JSBI.__toShiftAmount(i);if(0>n)return JSBI.__rightShiftByMaximum(e);const g=0|n/30,s=n%30;let o=t-g;if(0>=o)return JSBI.__rightShiftByMaximum(e);let l=!1;if(e){if(0!=(_.__digit(g)&(1<<s)-1))l=!0;else for(let t=0;t<g;t++)if(0!==_.__digit(t)){l=!0;break}}if(l&&0===s){const i=_.__digit(t-1);0==~i&&o++}let r=new JSBI(o,e);if(0===s){r.__setDigit(o-1,0);for(let e=g;e<t;e++)r.__setDigit(e-g,_.__digit(e))}else{let e=_.__digit(g)>>>s;const n=t-g-1;for(let t=0;t<n;t++){const i=_.__digit(t+g+1);r.__setDigit(t,1073741823&i<<30-s|e),e=i>>>s}r.__setDigit(n,e)}return l&&(r=JSBI.__absoluteAddOne(r,!0,r)),r.__trim()}static __rightShiftByMaximum(i){return i?JSBI.__oneDigit(1,!0):JSBI.__zero()}static __toShiftAmount(i){if(1<i.length)return-1;const _=i.__unsignedDigit(0);return _>JSBI.__kMaxLengthBits?-1:_}static __toPrimitive(i,_="default"){if("object"!=typeof i)return i;if(i.constructor===JSBI)return i;if("undefined"!=typeof Symbol&&"symbol"==typeof Symbol.toPrimitive){const t=i[Symbol.toPrimitive];if(t){const i=t(_);if("object"!=typeof i)return i;throw new TypeError("Cannot convert object to primitive value")}}const t=i.valueOf;if(t){const _=t.call(i);if("object"!=typeof _)return _}const e=i.toString;if(e){const _=e.call(i);if("object"!=typeof _)return _}throw new TypeError("Cannot convert object to primitive value")}static __toNumeric(i){return JSBI.__isBigInt(i)?i:+i}static __isBigInt(i){return"object"==typeof i&&null!==i&&i.constructor===JSBI}static __truncateToNBits(i,_){const t=0|(i+29)/30,e=new JSBI(t,_.sign),n=t-1;for(let t=0;t<n;t++)e.__setDigit(t,_.__digit(t));let g=_.__digit(n);if(0!=i%30){const _=32-i%30;g=g<<_>>>_}return e.__setDigit(n,g),e.__trim()}static __truncateAndSubFromPowerOfTwo(_,t,e){var n=Math.min;const g=0|(_+29)/30,s=new JSBI(g,e);let o=0;const l=g-1;let a=0;for(const i=n(l,t.length);o<i;o++){const i=0-t.__digit(o)-a;a=1&i>>>30,s.__setDigit(o,1073741823&i)}for(;o<l;o++)s.__setDigit(o,0|1073741823&-a);let u=l<t.length?t.__digit(l):0;const d=_%30;let h;if(0==d)h=0-u-a,h&=1073741823;else{const i=32-d;u=u<<i>>>i;const _=1<<32-i;h=_-u-a,h&=_-1}return s.__setDigit(l,h),s.__trim()}__digit(_){return this[_]}__unsignedDigit(_){return this[_]>>>0}__setDigit(_,i){this[_]=0|i}__setDigitGrow(_,i){this[_]=0|i}__halfDigitLength(){const i=this.length;return 32767>=this.__unsignedDigit(i-1)?2*i-1:2*i}__halfDigit(_){return 32767&this[_>>>1]>>>15*(1&_)}__setHalfDigit(_,i){const t=_>>>1,e=this.__digit(t),n=1&_?32767&e|i<<15:1073709056&e|32767&i;this.__setDigit(t,n)}static __digitPow(i,_){let t=1;for(;0<_;)1&_&&(t*=i),_>>>=1,i*=i;return t}static __isOneDigitInt(i){return(1073741823&i)===i}}JSBI.__kMaxLength=33554432,JSBI.__kMaxLengthBits=JSBI.__kMaxLength<<5,JSBI.__kMaxBitsPerChar=[0,0,32,51,64,75,83,90,96,102,107,111,115,119,122,126,128,131,134,136,139,141,143,145,147,149,151,153,154,156,158,159,160,162,163,165,166],JSBI.__kBitsPerCharTableShift=5,JSBI.__kBitsPerCharTableMultiplier=1<<JSBI.__kBitsPerCharTableShift,JSBI.__kConversionChars=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"],JSBI.__kBitConversionBuffer=new ArrayBuffer(8),JSBI.__kBitConversionDouble=new Float64Array(JSBI.__kBitConversionBuffer),JSBI.__kBitConversionInts=new Int32Array(JSBI.__kBitConversionBuffer),JSBI.__clz30=Math.clz32?function(i){return Math.clz32(i)-2}:function(i){return 0===i?30:0|29-(0|Math.log(i>>>0)/Math.LN2)},JSBI.__imul=Math.imul||function(i,_){return 0|i*_};export default JSBI;
//# sourceMappingURL=jsbi.mjs.map
(The MIT License)

Copyright (c) 2012-2015, JP Richardson <jprichardson@gmail.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.
let _fs
try {
  _fs = require('graceful-fs')
} catch (_) {
  _fs = require('fs')
}
const universalify = require('universalify')
const { stringify, stripBom } = require('./utils')

async function _readFile (file, options = {}) {
  if (typeof options === 'string') {
    options = { encoding: options }
  }

  const fs = options.fs || _fs

  const shouldThrow = 'throws' in options ? options.throws : true

  let data = await universalify.fromCallback(fs.readFile)(file, options)

  data = stripBom(data)

  let obj
  try {
    obj = JSON.parse(data, options ? options.reviver : null)
  } catch (err) {
    if (shouldThrow) {
      err.message = `${file}: ${err.message}`
      throw err
    } else {
      return null
    }
  }

  return obj
}

const readFile = universalify.fromPromise(_readFile)

function readFileSync (file, options = {}) {
  if (typeof options === 'string') {
    options = { encoding: options }
  }

  const fs = options.fs || _fs

  const shouldThrow = 'throws' in options ? options.throws : true

  try {
    let content = fs.readFileSync(file, options)
    content = stripBom(content)
    return JSON.parse(content, options.reviver)
  } catch (err) {
    if (shouldThrow) {
      err.message = `${file}: ${err.message}`
      throw err
    } else {
      return null
    }
  }
}

async function _writeFile (file, obj, options = {}) {
  const fs = options.fs || _fs

  const str = stringify(obj, options)

  await universalify.fromCallback(fs.writeFile)(file, str, options)
}

const writeFile = universalify.fromPromise(_writeFile)

function writeFileSync (file, obj, options = {}) {
  const fs = options.fs || _fs

  const str = stringify(obj, options)
  // not sure if fs.writeFileSync returns anything, but just in case
  return fs.writeFileSync(file, str, options)
}

const jsonfile = {
  readFile,
  readFileSync,
  writeFile,
  writeFileSync
}

module.exports = jsonfile
{
  "name": "jsonfile",
  "version": "6.1.0",
  "description": "Easily read/write JSON files.",
  "repository": {
    "type": "git",
    "url": "git@github.com:jprichardson/node-jsonfile.git"
  },
  "author": "JP Richardson <jprichardson@gmail.com>",
  "license": "MIT",
  "dependencies": {
    "universalify": "^2.0.0"
  },
  "optionalDependencies": {
    "graceful-fs": "^4.1.6"
  },
  "devDependencies": {
    "mocha": "^8.2.0",
    "rimraf": "^2.4.0",
    "standard": "^16.0.1"
  },
  "main": "index.js",
  "files": [
    "index.js",
    "utils.js"
  ]
}function stringify (obj, { EOL = '\n', finalEOL = true, replacer = null, spaces } = {}) {
  const EOF = finalEOL ? EOL : ''
  const str = JSON.stringify(obj, replacer, spaces)

  return str.replace(/\n/g, EOL) + EOF
}

function stripBom (content) {
  // we do this because JSON.parse would convert it to a utf8 string if encoding wasn't specified
  if (Buffer.isBuffer(content)) content = content.toString('utf8')
  return content.replace(/^\uFEFF/, '')
}

module.exports = { stringify, stripBom }
The MIT License (MIT)
 
Copyright (c) 2015 Auth0, Inc. <support@auth0.com> (http://auth0.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.
var jws = require('jws');

module.exports = function (jwt, options) {
  options = options || {};
  var decoded = jws.decode(jwt, options);
  if (!decoded) { return null; }
  var payload = decoded.payload;

  //try parse the payload
  if(typeof payload === 'string') {
    try {
      var obj = JSON.parse(payload);
      if(obj !== null && typeof obj === 'object') {
        payload = obj;
      }
    } catch (e) { }
  }

  //return header if `complete` option is enabled.  header includes claims
  //such as `kid` and `alg` used to select the key within a JWKS needed to
  //verify the signature
  if (options.complete === true) {
    return {
      header: decoded.header,
      payload: payload,
      signature: decoded.signature
    };
  }
  return payload;
};
module.exports = {
  decode: require('./decode'),
  verify: require('./verify'),
  sign: require('./sign'),
  JsonWebTokenError: require('./lib/JsonWebTokenError'),
  NotBeforeError: require('./lib/NotBeforeError'),
  TokenExpiredError: require('./lib/TokenExpiredError'),
};
{
  "name": "jsonwebtoken",
  "version": "8.5.1",
  "description": "JSON Web Token implementation (symmetric and asymmetric)",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "https://github.com/auth0/node-jsonwebtoken"
  },
  "author": "auth0",
  "license": "MIT",
  "dependencies": {
    "jws": "^3.2.2",
    "lodash.includes": "^4.3.0",
    "lodash.isboolean": "^3.0.3",
    "lodash.isinteger": "^4.0.4",
    "lodash.isnumber": "^3.0.3",
    "lodash.isplainobject": "^4.0.6",
    "lodash.isstring": "^4.0.1",
    "lodash.once": "^4.0.0",
    "ms": "^2.1.1",
    "semver": "^5.6.0"
  },
  "devDependencies": {
    "atob": "^2.1.2",
    "chai": "^4.1.2",
    "conventional-changelog": "~1.1.0",
    "cost-of-modules": "^1.0.1",
    "eslint": "^4.19.1",
    "mocha": "^5.2.0",
    "nsp": "^2.6.2",
    "nyc": "^11.9.0",
    "sinon": "^6.0.0"
  },
  "engines": {
    "npm": ">=1.4.28",
    "node": ">=4"
  },
  "files": [
    "lib",
    "decode.js",
    "sign.js",
    "verify.js"
  ]
}var timespan = require('./lib/timespan');
var PS_SUPPORTED = require('./lib/psSupported');
var jws = require('jws');
var includes = require('lodash.includes');
var isBoolean = require('lodash.isboolean');
var isInteger = require('lodash.isinteger');
var isNumber = require('lodash.isnumber');
var isPlainObject = require('lodash.isplainobject');
var isString = require('lodash.isstring');
var once = require('lodash.once');

var SUPPORTED_ALGS = ['RS256', 'RS384', 'RS512', 'ES256', 'ES384', 'ES512', 'HS256', 'HS384', 'HS512', 'none']
if (PS_SUPPORTED) {
  SUPPORTED_ALGS.splice(3, 0, 'PS256', 'PS384', 'PS512');
}

var sign_options_schema = {
  expiresIn: { isValid: function(value) { return isInteger(value) || (isString(value) && value); }, message: '"expiresIn" should be a number of seconds or string representing a timespan' },
  notBefore: { isValid: function(value) { return isInteger(value) || (isString(value) && value); }, message: '"notBefore" should be a number of seconds or string representing a timespan' },
  audience: { isValid: function(value) { return isString(value) || Array.isArray(value); }, message: '"audience" must be a string or array' },
  algorithm: { isValid: includes.bind(null, SUPPORTED_ALGS), message: '"algorithm" must be a valid string enum value' },
  header: { isValid: isPlainObject, message: '"header" must be an object' },
  encoding: { isValid: isString, message: '"encoding" must be a string' },
  issuer: { isValid: isString, message: '"issuer" must be a string' },
  subject: { isValid: isString, message: '"subject" must be a string' },
  jwtid: { isValid: isString, message: '"jwtid" must be a string' },
  noTimestamp: { isValid: isBoolean, message: '"noTimestamp" must be a boolean' },
  keyid: { isValid: isString, message: '"keyid" must be a string' },
  mutatePayload: { isValid: isBoolean, message: '"mutatePayload" must be a boolean' }
};

var registered_claims_schema = {
  iat: { isValid: isNumber, message: '"iat" should be a number of seconds' },
  exp: { isValid: isNumber, message: '"exp" should be a number of seconds' },
  nbf: { isValid: isNumber, message: '"nbf" should be a number of seconds' }
};

function validate(schema, allowUnknown, object, parameterName) {
  if (!isPlainObject(object)) {
    throw new Error('Expected "' + parameterName + '" to be a plain object.');
  }
  Object.keys(object)
    .forEach(function(key) {
      var validator = schema[key];
      if (!validator) {
        if (!allowUnknown) {
          throw new Error('"' + key + '" is not allowed in "' + parameterName + '"');
        }
        return;
      }
      if (!validator.isValid(object[key])) {
        throw new Error(validator.message);
      }
    });
}

function validateOptions(options) {
  return validate(sign_options_schema, false, options, 'options');
}

function validatePayload(payload) {
  return validate(registered_claims_schema, true, payload, 'payload');
}

var options_to_payload = {
  'audience': 'aud',
  'issuer': 'iss',
  'subject': 'sub',
  'jwtid': 'jti'
};

var options_for_objects = [
  'expiresIn',
  'notBefore',
  'noTimestamp',
  'audience',
  'issuer',
  'subject',
  'jwtid',
];

module.exports = function (payload, secretOrPrivateKey, options, callback) {
  if (typeof options === 'function') {
    callback = options;
    options = {};
  } else {
    options = options || {};
  }

  var isObjectPayload = typeof payload === 'object' &&
                        !Buffer.isBuffer(payload);

  var header = Object.assign({
    alg: options.algorithm || 'HS256',
    typ: isObjectPayload ? 'JWT' : undefined,
    kid: options.keyid
  }, options.header);

  function failure(err) {
    if (callback) {
      return callback(err);
    }
    throw err;
  }

  if (!secretOrPrivateKey && options.algorithm !== 'none') {
    return failure(new Error('secretOrPrivateKey must have a value'));
  }

  if (typeof payload === 'undefined') {
    return failure(new Error('payload is required'));
  } else if (isObjectPayload) {
    try {
      validatePayload(payload);
    }
    catch (error) {
      return failure(error);
    }
    if (!options.mutatePayload) {
      payload = Object.assign({},payload);
    }
  } else {
    var invalid_options = options_for_objects.filter(function (opt) {
      return typeof options[opt] !== 'undefined';
    });

    if (invalid_options.length > 0) {
      return failure(new Error('invalid ' + invalid_options.join(',') + ' option for ' + (typeof payload ) + ' payload'));
    }
  }

  if (typeof payload.exp !== 'undefined' && typeof options.expiresIn !== 'undefined') {
    return failure(new Error('Bad "options.expiresIn" option the payload already has an "exp" property.'));
  }

  if (typeof payload.nbf !== 'undefined' && typeof options.notBefore !== 'undefined') {
    return failure(new Error('Bad "options.notBefore" option the payload already has an "nbf" property.'));
  }

  try {
    validateOptions(options);
  }
  catch (error) {
    return failure(error);
  }

  var timestamp = payload.iat || Math.floor(Date.now() / 1000);

  if (options.noTimestamp) {
    delete payload.iat;
  } else if (isObjectPayload) {
    payload.iat = timestamp;
  }

  if (typeof options.notBefore !== 'undefined') {
    try {
      payload.nbf = timespan(options.notBefore, timestamp);
    }
    catch (err) {
      return failure(err);
    }
    if (typeof payload.nbf === 'undefined') {
      return failure(new Error('"notBefore" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'));
    }
  }

  if (typeof options.expiresIn !== 'undefined' && typeof payload === 'object') {
    try {
      payload.exp = timespan(options.expiresIn, timestamp);
    }
    catch (err) {
      return failure(err);
    }
    if (typeof payload.exp === 'undefined') {
      return failure(new Error('"expiresIn" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'));
    }
  }

  Object.keys(options_to_payload).forEach(function (key) {
    var claim = options_to_payload[key];
    if (typeof options[key] !== 'undefined') {
      if (typeof payload[claim] !== 'undefined') {
        return failure(new Error('Bad "options.' + key + '" option. The payload already has an "' + claim + '" property.'));
      }
      payload[claim] = options[key];
    }
  });

  var encoding = options.encoding || 'utf8';

  if (typeof callback === 'function') {
    callback = callback && once(callback);

    jws.createSign({
      header: header,
      privateKey: secretOrPrivateKey,
      payload: payload,
      encoding: encoding
    }).once('error', callback)
      .once('done', function (signature) {
        callback(null, signature);
      });
  } else {
    return jws.sign({header: header, payload: payload, secret: secretOrPrivateKey, encoding: encoding});
  }
};
var JsonWebTokenError = require('./lib/JsonWebTokenError');
var NotBeforeError    = require('./lib/NotBeforeError');
var TokenExpiredError = require('./lib/TokenExpiredError');
var decode            = require('./decode');
var timespan          = require('./lib/timespan');
var PS_SUPPORTED      = require('./lib/psSupported');
var jws               = require('jws');

var PUB_KEY_ALGS = ['RS256', 'RS384', 'RS512', 'ES256', 'ES384', 'ES512'];
var RSA_KEY_ALGS = ['RS256', 'RS384', 'RS512'];
var HS_ALGS = ['HS256', 'HS384', 'HS512'];

if (PS_SUPPORTED) {
  PUB_KEY_ALGS.splice(3, 0, 'PS256', 'PS384', 'PS512');
  RSA_KEY_ALGS.splice(3, 0, 'PS256', 'PS384', 'PS512');
}

module.exports = function (jwtString, secretOrPublicKey, options, callback) {
  if ((typeof options === 'function') && !callback) {
    callback = options;
    options = {};
  }

  if (!options) {
    options = {};
  }

  //clone this object since we are going to mutate it.
  options = Object.assign({}, options);

  var done;

  if (callback) {
    done = callback;
  } else {
    done = function(err, data) {
      if (err) throw err;
      return data;
    };
  }

  if (options.clockTimestamp && typeof options.clockTimestamp !== 'number') {
    return done(new JsonWebTokenError('clockTimestamp must be a number'));
  }

  if (options.nonce !== undefined && (typeof options.nonce !== 'string' || options.nonce.trim() === '')) {
    return done(new JsonWebTokenError('nonce must be a non-empty string'));
  }

  var clockTimestamp = options.clockTimestamp || Math.floor(Date.now() / 1000);

  if (!jwtString){
    return done(new JsonWebTokenError('jwt must be provided'));
  }

  if (typeof jwtString !== 'string') {
    return done(new JsonWebTokenError('jwt must be a string'));
  }

  var parts = jwtString.split('.');

  if (parts.length !== 3){
    return done(new JsonWebTokenError('jwt malformed'));
  }

  var decodedToken;

  try {
    decodedToken = decode(jwtString, { complete: true });
  } catch(err) {
    return done(err);
  }

  if (!decodedToken) {
    return done(new JsonWebTokenError('invalid token'));
  }

  var header = decodedToken.header;
  var getSecret;

  if(typeof secretOrPublicKey === 'function') {
    if(!callback) {
      return done(new JsonWebTokenError('verify must be called asynchronous if secret or public key is provided as a callback'));
    }

    getSecret = secretOrPublicKey;
  }
  else {
    getSecret = function(header, secretCallback) {
      return secretCallback(null, secretOrPublicKey);
    };
  }

  return getSecret(header, function(err, secretOrPublicKey) {
    if(err) {
      return done(new JsonWebTokenError('error in secret or public key callback: ' + err.message));
    }

    var hasSignature = parts[2].trim() !== '';

    if (!hasSignature && secretOrPublicKey){
      return done(new JsonWebTokenError('jwt signature is required'));
    }

    if (hasSignature && !secretOrPublicKey) {
      return done(new JsonWebTokenError('secret or public key must be provided'));
    }

    if (!hasSignature && !options.algorithms) {
      options.algorithms = ['none'];
    }

    if (!options.algorithms) {
      options.algorithms = ~secretOrPublicKey.toString().indexOf('BEGIN CERTIFICATE') ||
        ~secretOrPublicKey.toString().indexOf('BEGIN PUBLIC KEY') ? PUB_KEY_ALGS :
        ~secretOrPublicKey.toString().indexOf('BEGIN RSA PUBLIC KEY') ? RSA_KEY_ALGS : HS_ALGS;

    }

    if (!~options.algorithms.indexOf(decodedToken.header.alg)) {
      return done(new JsonWebTokenError('invalid algorithm'));
    }

    var valid;

    try {
      valid = jws.verify(jwtString, decodedToken.header.alg, secretOrPublicKey);
    } catch (e) {
      return done(e);
    }

    if (!valid) {
      return done(new JsonWebTokenError('invalid signature'));
    }

    var payload = decodedToken.payload;

    if (typeof payload.nbf !== 'undefined' && !options.ignoreNotBefore) {
      if (typeof payload.nbf !== 'number') {
        return done(new JsonWebTokenError('invalid nbf value'));
      }
      if (payload.nbf > clockTimestamp + (options.clockTolerance || 0)) {
        return done(new NotBeforeError('jwt not active', new Date(payload.nbf * 1000)));
      }
    }

    if (typeof payload.exp !== 'undefined' && !options.ignoreExpiration) {
      if (typeof payload.exp !== 'number') {
        return done(new JsonWebTokenError('invalid exp value'));
      }
      if (clockTimestamp >= payload.exp + (options.clockTolerance || 0)) {
        return done(new TokenExpiredError('jwt expired', new Date(payload.exp * 1000)));
      }
    }

    if (options.audience) {
      var audiences = Array.isArray(options.audience) ? options.audience : [options.audience];
      var target = Array.isArray(payload.aud) ? payload.aud : [payload.aud];

      var match = target.some(function (targetAudience) {
        return audiences.some(function (audience) {
          return audience instanceof RegExp ? audience.test(targetAudience) : audience === targetAudience;
        });
      });

      if (!match) {
        return done(new JsonWebTokenError('jwt audience invalid. expected: ' + audiences.join(' or ')));
      }
    }

    if (options.issuer) {
      var invalid_issuer =
              (typeof options.issuer === 'string' && payload.iss !== options.issuer) ||
              (Array.isArray(options.issuer) && options.issuer.indexOf(payload.iss) === -1);

      if (invalid_issuer) {
        return done(new JsonWebTokenError('jwt issuer invalid. expected: ' + options.issuer));
      }
    }

    if (options.subject) {
      if (payload.sub !== options.subject) {
        return done(new JsonWebTokenError('jwt subject invalid. expected: ' + options.subject));
      }
    }

    if (options.jwtid) {
      if (payload.jti !== options.jwtid) {
        return done(new JsonWebTokenError('jwt jwtid invalid. expected: ' + options.jwtid));
      }
    }

    if (options.nonce) {
      if (payload.nonce !== options.nonce) {
        return done(new JsonWebTokenError('jwt nonce invalid. expected: ' + options.nonce));
      }
    }

    if (options.maxAge) {
      if (typeof payload.iat !== 'number') {
        return done(new JsonWebTokenError('iat required when maxAge is specified'));
      }

      var maxAgeTimestamp = timespan(options.maxAge, payload.iat);
      if (typeof maxAgeTimestamp === 'undefined') {
        return done(new JsonWebTokenError('"maxAge" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'));
      }
      if (clockTimestamp >= maxAgeTimestamp + (options.clockTolerance || 0)) {
        return done(new TokenExpiredError('maxAge exceeded', new Date(maxAgeTimestamp * 1000)));
      }
    }

    if (options.complete === true) {
      var signature = decodedToken.signature;

      return done(null, {
        header: header,
        payload: payload,
        signature: signature
      });
    }

    return done(null, payload);
  });
};
var JsonWebTokenError = function (message, error) {
  Error.call(this, message);
  if(Error.captureStackTrace) {
    Error.captureStackTrace(this, this.constructor);
  }
  this.name = 'JsonWebTokenError';
  this.message = message;
  if (error) this.inner = error;
};

JsonWebTokenError.prototype = Object.create(Error.prototype);
JsonWebTokenError.prototype.constructor = JsonWebTokenError;

module.exports = JsonWebTokenError;
var JsonWebTokenError = require('./JsonWebTokenError');

var NotBeforeError = function (message, date) {
  JsonWebTokenError.call(this, message);
  this.name = 'NotBeforeError';
  this.date = date;
};

NotBeforeError.prototype = Object.create(JsonWebTokenError.prototype);

NotBeforeError.prototype.constructor = NotBeforeError;

module.exports = NotBeforeError;var JsonWebTokenError = require('./JsonWebTokenError');

var TokenExpiredError = function (message, expiredAt) {
  JsonWebTokenError.call(this, message);
  this.name = 'TokenExpiredError';
  this.expiredAt = expiredAt;
};

TokenExpiredError.prototype = Object.create(JsonWebTokenError.prototype);

TokenExpiredError.prototype.constructor = TokenExpiredError;

module.exports = TokenExpiredError;var semver = require('semver');

module.exports = semver.satisfies(process.version, '^6.12.0 || >=8.0.0');
var ms = require('ms');

module.exports = function (time, iat) {
  var timestamp = iat || Math.floor(Date.now() / 1000);

  if (typeof time === 'string') {
    var milliseconds = ms(time);
    if (typeof milliseconds === 'undefined') {
      return;
    }
    return Math.floor(timestamp + milliseconds / 1000);
  } else if (typeof time === 'number') {
    return timestamp + time;
  } else {
    return;
  }

};Copyright (c) 2013 Brian J. Brennan

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

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

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
var bufferEqual = require('buffer-equal-constant-time');
var Buffer = require('safe-buffer').Buffer;
var crypto = require('crypto');
var formatEcdsa = require('ecdsa-sig-formatter');
var util = require('util');

var MSG_INVALID_ALGORITHM = '"%s" is not a valid algorithm.\n  Supported algorithms are:\n  "HS256", "HS384", "HS512", "RS256", "RS384", "RS512", "PS256", "PS384", "PS512", "ES256", "ES384", "ES512" and "none".'
var MSG_INVALID_SECRET = 'secret must be a string or buffer';
var MSG_INVALID_VERIFIER_KEY = 'key must be a string or a buffer';
var MSG_INVALID_SIGNER_KEY = 'key must be a string, a buffer or an object';

var supportsKeyObjects = typeof crypto.createPublicKey === 'function';
if (supportsKeyObjects) {
  MSG_INVALID_VERIFIER_KEY += ' or a KeyObject';
  MSG_INVALID_SECRET += 'or a KeyObject';
}

function checkIsPublicKey(key) {
  if (Buffer.isBuffer(key)) {
    return;
  }

  if (typeof key === 'string') {
    return;
  }

  if (!supportsKeyObjects) {
    throw typeError(MSG_INVALID_VERIFIER_KEY);
  }

  if (typeof key !== 'object') {
    throw typeError(MSG_INVALID_VERIFIER_KEY);
  }

  if (typeof key.type !== 'string') {
    throw typeError(MSG_INVALID_VERIFIER_KEY);
  }

  if (typeof key.asymmetricKeyType !== 'string') {
    throw typeError(MSG_INVALID_VERIFIER_KEY);
  }

  if (typeof key.export !== 'function') {
    throw typeError(MSG_INVALID_VERIFIER_KEY);
  }
};

function checkIsPrivateKey(key) {
  if (Buffer.isBuffer(key)) {
    return;
  }

  if (typeof key === 'string') {
    return;
  }

  if (typeof key === 'object') {
    return;
  }

  throw typeError(MSG_INVALID_SIGNER_KEY);
};

function checkIsSecretKey(key) {
  if (Buffer.isBuffer(key)) {
    return;
  }

  if (typeof key === 'string') {
    return key;
  }

  if (!supportsKeyObjects) {
    throw typeError(MSG_INVALID_SECRET);
  }

  if (typeof key !== 'object') {
    throw typeError(MSG_INVALID_SECRET);
  }

  if (key.type !== 'secret') {
    throw typeError(MSG_INVALID_SECRET);
  }

  if (typeof key.export !== 'function') {
    throw typeError(MSG_INVALID_SECRET);
  }
}

function fromBase64(base64) {
  return base64
    .replace(/=/g, '')
    .replace(/\+/g, '-')
    .replace(/\//g, '_');
}

function toBase64(base64url) {
  base64url = base64url.toString();

  var padding = 4 - base64url.length % 4;
  if (padding !== 4) {
    for (var i = 0; i < padding; ++i) {
      base64url += '=';
    }
  }

  return base64url
    .replace(/\-/g, '+')
    .replace(/_/g, '/');
}

function typeError(template) {
  var args = [].slice.call(arguments, 1);
  var errMsg = util.format.bind(util, template).apply(null, args);
  return new TypeError(errMsg);
}

function bufferOrString(obj) {
  return Buffer.isBuffer(obj) || typeof obj === 'string';
}

function normalizeInput(thing) {
  if (!bufferOrString(thing))
    thing = JSON.stringify(thing);
  return thing;
}

function createHmacSigner(bits) {
  return function sign(thing, secret) {
    checkIsSecretKey(secret);
    thing = normalizeInput(thing);
    var hmac = crypto.createHmac('sha' + bits, secret);
    var sig = (hmac.update(thing), hmac.digest('base64'))
    return fromBase64(sig);
  }
}

function createHmacVerifier(bits) {
  return function verify(thing, signature, secret) {
    var computedSig = createHmacSigner(bits)(thing, secret);
    return bufferEqual(Buffer.from(signature), Buffer.from(computedSig));
  }
}

function createKeySigner(bits) {
 return function sign(thing, privateKey) {
    checkIsPrivateKey(privateKey);
    thing = normalizeInput(thing);
    // Even though we are specifying "RSA" here, this works with ECDSA
    // keys as well.
    var signer = crypto.createSign('RSA-SHA' + bits);
    var sig = (signer.update(thing), signer.sign(privateKey, 'base64'));
    return fromBase64(sig);
  }
}

function createKeyVerifier(bits) {
  return function verify(thing, signature, publicKey) {
    checkIsPublicKey(publicKey);
    thing = normalizeInput(thing);
    signature = toBase64(signature);
    var verifier = crypto.createVerify('RSA-SHA' + bits);
    verifier.update(thing);
    return verifier.verify(publicKey, signature, 'base64');
  }
}

function createPSSKeySigner(bits) {
  return function sign(thing, privateKey) {
    checkIsPrivateKey(privateKey);
    thing = normalizeInput(thing);
    var signer = crypto.createSign('RSA-SHA' + bits);
    var sig = (signer.update(thing), signer.sign({
      key: privateKey,
      padding: crypto.constants.RSA_PKCS1_PSS_PADDING,
      saltLength: crypto.constants.RSA_PSS_SALTLEN_DIGEST
    }, 'base64'));
    return fromBase64(sig);
  }
}

function createPSSKeyVerifier(bits) {
  return function verify(thing, signature, publicKey) {
    checkIsPublicKey(publicKey);
    thing = normalizeInput(thing);
    signature = toBase64(signature);
    var verifier = crypto.createVerify('RSA-SHA' + bits);
    verifier.update(thing);
    return verifier.verify({
      key: publicKey,
      padding: crypto.constants.RSA_PKCS1_PSS_PADDING,
      saltLength: crypto.constants.RSA_PSS_SALTLEN_DIGEST
    }, signature, 'base64');
  }
}

function createECDSASigner(bits) {
  var inner = createKeySigner(bits);
  return function sign() {
    var signature = inner.apply(null, arguments);
    signature = formatEcdsa.derToJose(signature, 'ES' + bits);
    return signature;
  };
}

function createECDSAVerifer(bits) {
  var inner = createKeyVerifier(bits);
  return function verify(thing, signature, publicKey) {
    signature = formatEcdsa.joseToDer(signature, 'ES' + bits).toString('base64');
    var result = inner(thing, signature, publicKey);
    return result;
  };
}

function createNoneSigner() {
  return function sign() {
    return '';
  }
}

function createNoneVerifier() {
  return function verify(thing, signature) {
    return signature === '';
  }
}

module.exports = function jwa(algorithm) {
  var signerFactories = {
    hs: createHmacSigner,
    rs: createKeySigner,
    ps: createPSSKeySigner,
    es: createECDSASigner,
    none: createNoneSigner,
  }
  var verifierFactories = {
    hs: createHmacVerifier,
    rs: createKeyVerifier,
    ps: createPSSKeyVerifier,
    es: createECDSAVerifer,
    none: createNoneVerifier,
  }
  var match = algorithm.match(/^(RS|PS|ES|HS)(256|384|512)$|^(none)$/);
  if (!match)
    throw typeError(MSG_INVALID_ALGORITHM, algorithm);
  var algo = (match[1] || match[3]).toLowerCase();
  var bits = match[2];

  return {
    sign: signerFactories[algo](bits),
    verify: verifierFactories[algo](bits),
  }
};
{
  "name": "jwa",
  "version": "2.0.0",
  "description": "JWA implementation (supports all JWS algorithms)",
  "main": "index.js",
  "directories": {
    "test": "test"
  },
  "dependencies": {
    "buffer-equal-constant-time": "1.0.1",
    "ecdsa-sig-formatter": "1.0.11",
    "safe-buffer": "^5.0.1"
  },
  "devDependencies": {
    "base64url": "^2.0.0",
    "jwk-to-pem": "^2.0.1",
    "semver": "4.3.6",
    "tap": "6.2.0"
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/brianloveswords/node-jwa.git"
  },
  "author": "Brian J. Brennan <brianloveswords@gmail.com>",
  "license": "MIT"
}Copyright (c) 2013 Brian J. Brennan

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.
/*global exports*/
var SignStream = require('./lib/sign-stream');
var VerifyStream = require('./lib/verify-stream');

var ALGORITHMS = [
  'HS256', 'HS384', 'HS512',
  'RS256', 'RS384', 'RS512',
  'PS256', 'PS384', 'PS512',
  'ES256', 'ES384', 'ES512'
];

exports.ALGORITHMS = ALGORITHMS;
exports.sign = SignStream.sign;
exports.verify = VerifyStream.verify;
exports.decode = VerifyStream.decode;
exports.isValid = VerifyStream.isValid;
exports.createSign = function createSign(opts) {
  return new SignStream(opts);
};
exports.createVerify = function createVerify(opts) {
  return new VerifyStream(opts);
};
{
  "name": "jws",
  "version": "4.0.0",
  "description": "Implementation of JSON Web Signatures",
  "main": "index.js",
  "directories": {
    "test": "test"
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/brianloveswords/node-jws.git"
  },
  "author": "Brian J Brennan",
  "license": "MIT",
  "readmeFilename": "readme.md",
  "dependencies": {
    "jwa": "^2.0.0",
    "safe-buffer": "^5.0.1"
  },
  "devDependencies": {
    "semver": "^5.1.0",
    "tape": "~2.14.0"
  }
}/*global module, process*/
var Buffer = require('safe-buffer').Buffer;
var Stream = require('stream');
var util = require('util');

function DataStream(data) {
  this.buffer = null;
  this.writable = true;
  this.readable = true;

  // No input
  if (!data) {
    this.buffer = Buffer.alloc(0);
    return this;
  }

  // Stream
  if (typeof data.pipe === 'function') {
    this.buffer = Buffer.alloc(0);
    data.pipe(this);
    return this;
  }

  // Buffer or String
  // or Object (assumedly a passworded key)
  if (data.length || typeof data === 'object') {
    this.buffer = data;
    this.writable = false;
    process.nextTick(function () {
      this.emit('end', data);
      this.readable = false;
      this.emit('close');
    }.bind(this));
    return this;
  }

  throw new TypeError('Unexpected data type ('+ typeof data + ')');
}
util.inherits(DataStream, Stream);

DataStream.prototype.write = function write(data) {
  this.buffer = Buffer.concat([this.buffer, Buffer.from(data)]);
  this.emit('data', data);
};

DataStream.prototype.end = function end(data) {
  if (data)
    this.write(data);
  this.emit('end', data);
  this.emit('close');
  this.writable = false;
  this.readable = false;
};

module.exports = DataStream;
/*global module*/
var Buffer = require('safe-buffer').Buffer;
var DataStream = require('./data-stream');
var jwa = require('jwa');
var Stream = require('stream');
var toString = require('./tostring');
var util = require('util');

function base64url(string, encoding) {
  return Buffer
    .from(string, encoding)
    .toString('base64')
    .replace(/=/g, '')
    .replace(/\+/g, '-')
    .replace(/\//g, '_');
}

function jwsSecuredInput(header, payload, encoding) {
  encoding = encoding || 'utf8';
  var encodedHeader = base64url(toString(header), 'binary');
  var encodedPayload = base64url(toString(payload), encoding);
  return util.format('%s.%s', encodedHeader, encodedPayload);
}

function jwsSign(opts) {
  var header = opts.header;
  var payload = opts.payload;
  var secretOrKey = opts.secret || opts.privateKey;
  var encoding = opts.encoding;
  var algo = jwa(header.alg);
  var securedInput = jwsSecuredInput(header, payload, encoding);
  var signature = algo.sign(securedInput, secretOrKey);
  return util.format('%s.%s', securedInput, signature);
}

function SignStream(opts) {
  var secret = opts.secret||opts.privateKey||opts.key;
  var secretStream = new DataStream(secret);
  this.readable = true;
  this.header = opts.header;
  this.encoding = opts.encoding;
  this.secret = this.privateKey = this.key = secretStream;
  this.payload = new DataStream(opts.payload);
  this.secret.once('close', function () {
    if (!this.payload.writable && this.readable)
      this.sign();
  }.bind(this));

  this.payload.once('close', function () {
    if (!this.secret.writable && this.readable)
      this.sign();
  }.bind(this));
}
util.inherits(SignStream, Stream);

SignStream.prototype.sign = function sign() {
  try {
    var signature = jwsSign({
      header: this.header,
      payload: this.payload.buffer,
      secret: this.secret.buffer,
      encoding: this.encoding
    });
    this.emit('done', signature);
    this.emit('data', signature);
    this.emit('end');
    this.readable = false;
    return signature;
  } catch (e) {
    this.readable = false;
    this.emit('error', e);
    this.emit('close');
  }
};

SignStream.sign = jwsSign;

module.exports = SignStream;
/*global module*/
var Buffer = require('buffer').Buffer;

module.exports = function toString(obj) {
  if (typeof obj === 'string')
    return obj;
  if (typeof obj === 'number' || Buffer.isBuffer(obj))
    return obj.toString();
  return JSON.stringify(obj);
};
/*global module*/
var Buffer = require('safe-buffer').Buffer;
var DataStream = require('./data-stream');
var jwa = require('jwa');
var Stream = require('stream');
var toString = require('./tostring');
var util = require('util');
var JWS_REGEX = /^[a-zA-Z0-9\-_]+?\.[a-zA-Z0-9\-_]+?\.([a-zA-Z0-9\-_]+)?$/;

function isObject(thing) {
  return Object.prototype.toString.call(thing) === '[object Object]';
}

function safeJsonParse(thing) {
  if (isObject(thing))
    return thing;
  try { return JSON.parse(thing); }
  catch (e) { return undefined; }
}

function headerFromJWS(jwsSig) {
  var encodedHeader = jwsSig.split('.', 1)[0];
  return safeJsonParse(Buffer.from(encodedHeader, 'base64').toString('binary'));
}

function securedInputFromJWS(jwsSig) {
  return jwsSig.split('.', 2).join('.');
}

function signatureFromJWS(jwsSig) {
  return jwsSig.split('.')[2];
}

function payloadFromJWS(jwsSig, encoding) {
  encoding = encoding || 'utf8';
  var payload = jwsSig.split('.')[1];
  return Buffer.from(payload, 'base64').toString(encoding);
}

function isValidJws(string) {
  return JWS_REGEX.test(string) && !!headerFromJWS(string);
}

function jwsVerify(jwsSig, algorithm, secretOrKey) {
  if (!algorithm) {
    var err = new Error("Missing algorithm parameter for jws.verify");
    err.code = "MISSING_ALGORITHM";
    throw err;
  }
  jwsSig = toString(jwsSig);
  var signature = signatureFromJWS(jwsSig);
  var securedInput = securedInputFromJWS(jwsSig);
  var algo = jwa(algorithm);
  return algo.verify(securedInput, signature, secretOrKey);
}

function jwsDecode(jwsSig, opts) {
  opts = opts || {};
  jwsSig = toString(jwsSig);

  if (!isValidJws(jwsSig))
    return null;

  var header = headerFromJWS(jwsSig);

  if (!header)
    return null;

  var payload = payloadFromJWS(jwsSig);
  if (header.typ === 'JWT' || opts.json)
    payload = JSON.parse(payload, opts.encoding);

  return {
    header: header,
    payload: payload,
    signature: signatureFromJWS(jwsSig)
  };
}

function VerifyStream(opts) {
  opts = opts || {};
  var secretOrKey = opts.secret||opts.publicKey||opts.key;
  var secretStream = new DataStream(secretOrKey);
  this.readable = true;
  this.algorithm = opts.algorithm;
  this.encoding = opts.encoding;
  this.secret = this.publicKey = this.key = secretStream;
  this.signature = new DataStream(opts.signature);
  this.secret.once('close', function () {
    if (!this.signature.writable && this.readable)
      this.verify();
  }.bind(this));

  this.signature.once('close', function () {
    if (!this.secret.writable && this.readable)
      this.verify();
  }.bind(this));
}
util.inherits(VerifyStream, Stream);
VerifyStream.prototype.verify = function verify() {
  try {
    var valid = jwsVerify(this.signature.buffer, this.algorithm, this.key.buffer);
    var obj = jwsDecode(this.signature.buffer, this.encoding);
    this.emit('done', valid, obj);
    this.emit('data', valid);
    this.emit('end');
    this.readable = false;
    return valid;
  } catch (e) {
    this.readable = false;
    this.emit('error', e);
    this.emit('close');
  }
};

VerifyStream.decode = jwsDecode;
VerifyStream.isValid = isValidJws;
VerifyStream.verify = jwsVerify;

module.exports = VerifyStream;
{
  "name": "lazy-val",
  "version": "1.0.5",
  "main": "out/main.js",
  "author": "Vladimir Krivosheev",
  "license": "MIT",
  "repository": "develar/lazy-val",
  "homepage": "https://github.com/develar/lazy-val",
  "files": [
    "out"
  ],
  "devDependencies": {
    "typescript": "^4.2.4"
  },
  "typings": "./out/main.d.ts"
}"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Lazy = void 0;
class Lazy {
    constructor(creator) {
        this._value = null;
        this.creator = creator;
    }
    get hasValue() {
        return this.creator == null;
    }
    get value() {
        if (this.creator == null) {
            return this._value;
        }
        const result = this.creator();
        this.value = result;
        return result;
    }
    set value(value) {
        this._value = value;
        this.creator = null;
    }
}
exports.Lazy = Lazy;
//# sourceMappingURL=main.js.mapCopyright OpenJS Foundation and other contributors <https://openjsf.org/>

Based on Underscore.js, copyright Jeremy Ashkenas,
DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>

This software consists of voluntary contributions made by many
individuals. For exact contribution history, see the revision history
available at https://github.com/lodash/lodash

The following license applies to all parts of this software except as
documented below:

====

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.

====

Copyright and related rights for sample code are waived via CC0. Sample
code is defined as all source code displayed within the prose of the
documentation.

CC0: http://creativecommons.org/publicdomain/zero/1.0/

====

Files located in the node_modules and vendor directories are externally
maintained libraries used by this software which have their own
licenses; we recommend you read them, as their terms may differ from the
terms above.
var getNative = require('./_getNative'),
    root = require('./_root');

/* Built-in method references that are verified to be native. */
var DataView = getNative(root, 'DataView');

module.exports = DataView;
var hashClear = require('./_hashClear'),
    hashDelete = require('./_hashDelete'),
    hashGet = require('./_hashGet'),
    hashHas = require('./_hashHas'),
    hashSet = require('./_hashSet');

/**
 * Creates a hash object.
 *
 * @private
 * @constructor
 * @param {Array} [entries] The key-value pairs to cache.
 */
function Hash(entries) {
  var index = -1,
      length = entries == null ? 0 : entries.length;

  this.clear();
  while (++index < length) {
    var entry = entries[index];
    this.set(entry[0], entry[1]);
  }
}

// Add methods to `Hash`.
Hash.prototype.clear = hashClear;
Hash.prototype['delete'] = hashDelete;
Hash.prototype.get = hashGet;
Hash.prototype.has = hashHas;
Hash.prototype.set = hashSet;

module.exports = Hash;
var baseCreate = require('./_baseCreate'),
    baseLodash = require('./_baseLodash');

/** Used as references for the maximum length and index of an array. */
var MAX_ARRAY_LENGTH = 4294967295;

/**
 * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
 *
 * @private
 * @constructor
 * @param {*} value The value to wrap.
 */
function LazyWrapper(value) {
  this.__wrapped__ = value;
  this.__actions__ = [];
  this.__dir__ = 1;
  this.__filtered__ = false;
  this.__iteratees__ = [];
  this.__takeCount__ = MAX_ARRAY_LENGTH;
  this.__views__ = [];
}

// Ensure `LazyWrapper` is an instance of `baseLodash`.
LazyWrapper.prototype = baseCreate(baseLodash.prototype);
LazyWrapper.prototype.constructor = LazyWrapper;

module.exports = LazyWrapper;
var listCacheClear = require('./_listCacheClear'),
    listCacheDelete = require('./_listCacheDelete'),
    listCacheGet = require('./_listCacheGet'),
    listCacheHas = require('./_listCacheHas'),
    listCacheSet = require('./_listCacheSet');

/**
 * Creates an list cache object.
 *
 * @private
 * @constructor
 * @param {Array} [entries] The key-value pairs to cache.
 */
function ListCache(entries) {
  var index = -1,
      length = entries == null ? 0 : entries.length;

  this.clear();
  while (++index < length) {
    var entry = entries[index];
    this.set(entry[0], entry[1]);
  }
}

// Add methods to `ListCache`.
ListCache.prototype.clear = listCacheClear;
ListCache.prototype['delete'] = listCacheDelete;
ListCache.prototype.get = listCacheGet;
ListCache.prototype.has = listCacheHas;
ListCache.prototype.set = listCacheSet;

module.exports = ListCache;
var baseCreate = require('./_baseCreate'),
    baseLodash = require('./_baseLodash');

/**
 * The base constructor for creating `lodash` wrapper objects.
 *
 * @private
 * @param {*} value The value to wrap.
 * @param {boolean} [chainAll] Enable explicit method chain sequences.
 */
function LodashWrapper(value, chainAll) {
  this.__wrapped__ = value;
  this.__actions__ = [];
  this.__chain__ = !!chainAll;
  this.__index__ = 0;
  this.__values__ = undefined;
}

LodashWrapper.prototype = baseCreate(baseLodash.prototype);
LodashWrapper.prototype.constructor = LodashWrapper;

module.exports = LodashWrapper;
var getNative = require('./_getNative'),
    root = require('./_root');

/* Built-in method references that are verified to be native. */
var Map = getNative(root, 'Map');

module.exports = Map;
var mapCacheClear = require('./_mapCacheClear'),
    mapCacheDelete = require('./_mapCacheDelete'),
    mapCacheGet = require('./_mapCacheGet'),
    mapCacheHas = require('./_mapCacheHas'),
    mapCacheSet = require('./_mapCacheSet');

/**
 * Creates a map cache object to store key-value pairs.
 *
 * @private
 * @constructor
 * @param {Array} [entries] The key-value pairs to cache.
 */
function MapCache(entries) {
  var index = -1,
      length = entries == null ? 0 : entries.length;

  this.clear();
  while (++index < length) {
    var entry = entries[index];
    this.set(entry[0], entry[1]);
  }
}

// Add methods to `MapCache`.
MapCache.prototype.clear = mapCacheClear;
MapCache.prototype['delete'] = mapCacheDelete;
MapCache.prototype.get = mapCacheGet;
MapCache.prototype.has = mapCacheHas;
MapCache.prototype.set = mapCacheSet;

module.exports = MapCache;
var getNative = require('./_getNative'),
    root = require('./_root');

/* Built-in method references that are verified to be native. */
var Promise = getNative(root, 'Promise');

module.exports = Promise;
var getNative = require('./_getNative'),
    root = require('./_root');

/* Built-in method references that are verified to be native. */
var Set = getNative(root, 'Set');

module.exports = Set;
var MapCache = require('./_MapCache'),
    setCacheAdd = require('./_setCacheAdd'),
    setCacheHas = require('./_setCacheHas');

/**
 *
 * Creates an array cache object to store unique values.
 *
 * @private
 * @constructor
 * @param {Array} [values] The values to cache.
 */
function SetCache(values) {
  var index = -1,
      length = values == null ? 0 : values.length;

  this.__data__ = new MapCache;
  while (++index < length) {
    this.add(values[index]);
  }
}

// Add methods to `SetCache`.
SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
SetCache.prototype.has = setCacheHas;

module.exports = SetCache;
var ListCache = require('./_ListCache'),
    stackClear = require('./_stackClear'),
    stackDelete = require('./_stackDelete'),
    stackGet = require('./_stackGet'),
    stackHas = require('./_stackHas'),
    stackSet = require('./_stackSet');

/**
 * Creates a stack cache object to store key-value pairs.
 *
 * @private
 * @constructor
 * @param {Array} [entries] The key-value pairs to cache.
 */
function Stack(entries) {
  var data = this.__data__ = new ListCache(entries);
  this.size = data.size;
}

// Add methods to `Stack`.
Stack.prototype.clear = stackClear;
Stack.prototype['delete'] = stackDelete;
Stack.prototype.get = stackGet;
Stack.prototype.has = stackHas;
Stack.prototype.set = stackSet;

module.exports = Stack;
var root = require('./_root');

/** Built-in value references. */
var Symbol = root.Symbol;

module.exports = Symbol;
var root = require('./_root');

/** Built-in value references. */
var Uint8Array = root.Uint8Array;

module.exports = Uint8Array;
var getNative = require('./_getNative'),
    root = require('./_root');

/* Built-in method references that are verified to be native. */
var WeakMap = getNative(root, 'WeakMap');

module.exports = WeakMap;
/**
 * A faster alternative to `Function#apply`, this function invokes `func`
 * with the `this` binding of `thisArg` and the arguments of `args`.
 *
 * @private
 * @param {Function} func The function to invoke.
 * @param {*} thisArg The `this` binding of `func`.
 * @param {Array} args The arguments to invoke `func` with.
 * @returns {*} Returns the result of `func`.
 */
function apply(func, thisArg, args) {
  switch (args.length) {
    case 0: return func.call(thisArg);
    case 1: return func.call(thisArg, args[0]);
    case 2: return func.call(thisArg, args[0], args[1]);
    case 3: return func.call(thisArg, args[0], args[1], args[2]);
  }
  return func.apply(thisArg, args);
}

module.exports = apply;
/**
 * A specialized version of `baseAggregator` for arrays.
 *
 * @private
 * @param {Array} [array] The array to iterate over.
 * @param {Function} setter The function to set `accumulator` values.
 * @param {Function} iteratee The iteratee to transform keys.
 * @param {Object} accumulator The initial aggregated object.
 * @returns {Function} Returns `accumulator`.
 */
function arrayAggregator(array, setter, iteratee, accumulator) {
  var index = -1,
      length = array == null ? 0 : array.length;

  while (++index < length) {
    var value = array[index];
    setter(accumulator, value, iteratee(value), array);
  }
  return accumulator;
}

module.exports = arrayAggregator;
/**
 * A specialized version of `_.forEach` for arrays without support for
 * iteratee shorthands.
 *
 * @private
 * @param {Array} [array] The array to iterate over.
 * @param {Function} iteratee The function invoked per iteration.
 * @returns {Array} Returns `array`.
 */
function arrayEach(array, iteratee) {
  var index = -1,
      length = array == null ? 0 : array.length;

  while (++index < length) {
    if (iteratee(array[index], index, array) === false) {
      break;
    }
  }
  return array;
}

module.exports = arrayEach;
/**
 * A specialized version of `_.forEachRight` for arrays without support for
 * iteratee shorthands.
 *
 * @private
 * @param {Array} [array] The array to iterate over.
 * @param {Function} iteratee The function invoked per iteration.
 * @returns {Array} Returns `array`.
 */
function arrayEachRight(array, iteratee) {
  var length = array == null ? 0 : array.length;

  while (length--) {
    if (iteratee(array[length], length, array) === false) {
      break;
    }
  }
  return array;
}

module.exports = arrayEachRight;
/**
 * A specialized version of `_.every` for arrays without support for
 * iteratee shorthands.
 *
 * @private
 * @param {Array} [array] The array to iterate over.
 * @param {Function} predicate The function invoked per iteration.
 * @returns {boolean} Returns `true` if all elements pass the predicate check,
 *  else `false`.
 */
function arrayEvery(array, predicate) {
  var index = -1,
      length = array == null ? 0 : array.length;

  while (++index < length) {
    if (!predicate(array[index], index, array)) {
      return false;
    }
  }
  return true;
}

module.exports = arrayEvery;
/**
 * A specialized version of `_.filter` for arrays without support for
 * iteratee shorthands.
 *
 * @private
 * @param {Array} [array] The array to iterate over.
 * @param {Function} predicate The function invoked per iteration.
 * @returns {Array} Returns the new filtered array.
 */
function arrayFilter(array, predicate) {
  var index = -1,
      length = array == null ? 0 : array.length,
      resIndex = 0,
      result = [];

  while (++index < length) {
    var value = array[index];
    if (predicate(value, index, array)) {
      result[resIndex++] = value;
    }
  }
  return result;
}

module.exports = arrayFilter;
var baseIndexOf = require('./_baseIndexOf');

/**
 * A specialized version of `_.includes` for arrays without support for
 * specifying an index to search from.
 *
 * @private
 * @param {Array} [array] The array to inspect.
 * @param {*} target The value to search for.
 * @returns {boolean} Returns `true` if `target` is found, else `false`.
 */
function arrayIncludes(array, value) {
  var length = array == null ? 0 : array.length;
  return !!length && baseIndexOf(array, value, 0) > -1;
}

module.exports = arrayIncludes;
/**
 * This function is like `arrayIncludes` except that it accepts a comparator.
 *
 * @private
 * @param {Array} [array] The array to inspect.
 * @param {*} target The value to search for.
 * @param {Function} comparator The comparator invoked per element.
 * @returns {boolean} Returns `true` if `target` is found, else `false`.
 */
function arrayIncludesWith(array, value, comparator) {
  var index = -1,
      length = array == null ? 0 : array.length;

  while (++index < length) {
    if (comparator(value, array[index])) {
      return true;
    }
  }
  return false;
}

module.exports = arrayIncludesWith;
var baseTimes = require('./_baseTimes'),
    isArguments = require('./isArguments'),
    isArray = require('./isArray'),
    isBuffer = require('./isBuffer'),
    isIndex = require('./_isIndex'),
    isTypedArray = require('./isTypedArray');

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * Creates an array of the enumerable property names of the array-like `value`.
 *
 * @private
 * @param {*} value The value to query.
 * @param {boolean} inherited Specify returning inherited property names.
 * @returns {Array} Returns the array of property names.
 */
function arrayLikeKeys(value, inherited) {
  var isArr = isArray(value),
      isArg = !isArr && isArguments(value),
      isBuff = !isArr && !isArg && isBuffer(value),
      isType = !isArr && !isArg && !isBuff && isTypedArray(value),
      skipIndexes = isArr || isArg || isBuff || isType,
      result = skipIndexes ? baseTimes(value.length, String) : [],
      length = result.length;

  for (var key in value) {
    if ((inherited || hasOwnProperty.call(value, key)) &&
        !(skipIndexes && (
           // Safari 9 has enumerable `arguments.length` in strict mode.
           key == 'length' ||
           // Node.js 0.10 has enumerable non-index properties on buffers.
           (isBuff && (key == 'offset' || key == 'parent')) ||
           // PhantomJS 2 has enumerable non-index properties on typed arrays.
           (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
           // Skip index properties.
           isIndex(key, length)
        ))) {
      result.push(key);
    }
  }
  return result;
}

module.exports = arrayLikeKeys;
/**
 * A specialized version of `_.map` for arrays without support for iteratee
 * shorthands.
 *
 * @private
 * @param {Array} [array] The array to iterate over.
 * @param {Function} iteratee The function invoked per iteration.
 * @returns {Array} Returns the new mapped array.
 */
function arrayMap(array, iteratee) {
  var index = -1,
      length = array == null ? 0 : array.length,
      result = Array(length);

  while (++index < length) {
    result[index] = iteratee(array[index], index, array);
  }
  return result;
}

module.exports = arrayMap;
/**
 * Appends the elements of `values` to `array`.
 *
 * @private
 * @param {Array} array The array to modify.
 * @param {Array} values The values to append.
 * @returns {Array} Returns `array`.
 */
function arrayPush(array, values) {
  var index = -1,
      length = values.length,
      offset = array.length;

  while (++index < length) {
    array[offset + index] = values[index];
  }
  return array;
}

module.exports = arrayPush;
/**
 * A specialized version of `_.reduce` for arrays without support for
 * iteratee shorthands.
 *
 * @private
 * @param {Array} [array] The array to iterate over.
 * @param {Function} iteratee The function invoked per iteration.
 * @param {*} [accumulator] The initial value.
 * @param {boolean} [initAccum] Specify using the first element of `array` as
 *  the initial value.
 * @returns {*} Returns the accumulated value.
 */
function arrayReduce(array, iteratee, accumulator, initAccum) {
  var index = -1,
      length = array == null ? 0 : array.length;

  if (initAccum && length) {
    accumulator = array[++index];
  }
  while (++index < length) {
    accumulator = iteratee(accumulator, array[index], index, array);
  }
  return accumulator;
}

module.exports = arrayReduce;
/**
 * A specialized version of `_.reduceRight` for arrays without support for
 * iteratee shorthands.
 *
 * @private
 * @param {Array} [array] The array to iterate over.
 * @param {Function} iteratee The function invoked per iteration.
 * @param {*} [accumulator] The initial value.
 * @param {boolean} [initAccum] Specify using the last element of `array` as
 *  the initial value.
 * @returns {*} Returns the accumulated value.
 */
function arrayReduceRight(array, iteratee, accumulator, initAccum) {
  var length = array == null ? 0 : array.length;
  if (initAccum && length) {
    accumulator = array[--length];
  }
  while (length--) {
    accumulator = iteratee(accumulator, array[length], length, array);
  }
  return accumulator;
}

module.exports = arrayReduceRight;
var baseRandom = require('./_baseRandom');

/**
 * A specialized version of `_.sample` for arrays.
 *
 * @private
 * @param {Array} array The array to sample.
 * @returns {*} Returns the random element.
 */
function arraySample(array) {
  var length = array.length;
  return length ? array[baseRandom(0, length - 1)] : undefined;
}

module.exports = arraySample;
var baseClamp = require('./_baseClamp'),
    copyArray = require('./_copyArray'),
    shuffleSelf = require('./_shuffleSelf');

/**
 * A specialized version of `_.sampleSize` for arrays.
 *
 * @private
 * @param {Array} array The array to sample.
 * @param {number} n The number of elements to sample.
 * @returns {Array} Returns the random elements.
 */
function arraySampleSize(array, n) {
  return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));
}

module.exports = arraySampleSize;
var copyArray = require('./_copyArray'),
    shuffleSelf = require('./_shuffleSelf');

/**
 * A specialized version of `_.shuffle` for arrays.
 *
 * @private
 * @param {Array} array The array to shuffle.
 * @returns {Array} Returns the new shuffled array.
 */
function arrayShuffle(array) {
  return shuffleSelf(copyArray(array));
}

module.exports = arrayShuffle;
/**
 * A specialized version of `_.some` for arrays without support for iteratee
 * shorthands.
 *
 * @private
 * @param {Array} [array] The array to iterate over.
 * @param {Function} predicate The function invoked per iteration.
 * @returns {boolean} Returns `true` if any element passes the predicate check,
 *  else `false`.
 */
function arraySome(array, predicate) {
  var index = -1,
      length = array == null ? 0 : array.length;

  while (++index < length) {
    if (predicate(array[index], index, array)) {
      return true;
    }
  }
  return false;
}

module.exports = arraySome;
var baseProperty = require('./_baseProperty');

/**
 * Gets the size of an ASCII `string`.
 *
 * @private
 * @param {string} string The string inspect.
 * @returns {number} Returns the string size.
 */
var asciiSize = baseProperty('length');

module.exports = asciiSize;
/**
 * Converts an ASCII `string` to an array.
 *
 * @private
 * @param {string} string The string to convert.
 * @returns {Array} Returns the converted array.
 */
function asciiToArray(string) {
  return string.split('');
}

module.exports = asciiToArray;
/** Used to match words composed of alphanumeric characters. */
var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;

/**
 * Splits an ASCII `string` into an array of its words.
 *
 * @private
 * @param {string} The string to inspect.
 * @returns {Array} Returns the words of `string`.
 */
function asciiWords(string) {
  return string.match(reAsciiWord) || [];
}

module.exports = asciiWords;
var baseAssignValue = require('./_baseAssignValue'),
    eq = require('./eq');

/**
 * This function is like `assignValue` except that it doesn't assign
 * `undefined` values.
 *
 * @private
 * @param {Object} object The object to modify.
 * @param {string} key The key of the property to assign.
 * @param {*} value The value to assign.
 */
function assignMergeValue(object, key, value) {
  if ((value !== undefined && !eq(object[key], value)) ||
      (value === undefined && !(key in object))) {
    baseAssignValue(object, key, value);
  }
}

module.exports = assignMergeValue;
var baseAssignValue = require('./_baseAssignValue'),
    eq = require('./eq');

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * Assigns `value` to `key` of `object` if the existing value is not equivalent
 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
 * for equality comparisons.
 *
 * @private
 * @param {Object} object The object to modify.
 * @param {string} key The key of the property to assign.
 * @param {*} value The value to assign.
 */
function assignValue(object, key, value) {
  var objValue = object[key];
  if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
      (value === undefined && !(key in object))) {
    baseAssignValue(object, key, value);
  }
}

module.exports = assignValue;
var eq = require('./eq');

/**
 * Gets the index at which the `key` is found in `array` of key-value pairs.
 *
 * @private
 * @param {Array} array The array to inspect.
 * @param {*} key The key to search for.
 * @returns {number} Returns the index of the matched value, else `-1`.
 */
function assocIndexOf(array, key) {
  var length = array.length;
  while (length--) {
    if (eq(array[length][0], key)) {
      return length;
    }
  }
  return -1;
}

module.exports = assocIndexOf;
var baseEach = require('./_baseEach');

/**
 * Aggregates elements of `collection` on `accumulator` with keys transformed
 * by `iteratee` and values set by `setter`.
 *
 * @private
 * @param {Array|Object} collection The collection to iterate over.
 * @param {Function} setter The function to set `accumulator` values.
 * @param {Function} iteratee The iteratee to transform keys.
 * @param {Object} accumulator The initial aggregated object.
 * @returns {Function} Returns `accumulator`.
 */
function baseAggregator(collection, setter, iteratee, accumulator) {
  baseEach(collection, function(value, key, collection) {
    setter(accumulator, value, iteratee(value), collection);
  });
  return accumulator;
}

module.exports = baseAggregator;
var copyObject = require('./_copyObject'),
    keys = require('./keys');

/**
 * The base implementation of `_.assign` without support for multiple sources
 * or `customizer` functions.
 *
 * @private
 * @param {Object} object The destination object.
 * @param {Object} source The source object.
 * @returns {Object} Returns `object`.
 */
function baseAssign(object, source) {
  return object && copyObject(source, keys(source), object);
}

module.exports = baseAssign;
var copyObject = require('./_copyObject'),
    keysIn = require('./keysIn');

/**
 * The base implementation of `_.assignIn` without support for multiple sources
 * or `customizer` functions.
 *
 * @private
 * @param {Object} object The destination object.
 * @param {Object} source The source object.
 * @returns {Object} Returns `object`.
 */
function baseAssignIn(object, source) {
  return object && copyObject(source, keysIn(source), object);
}

module.exports = baseAssignIn;
var defineProperty = require('./_defineProperty');

/**
 * The base implementation of `assignValue` and `assignMergeValue` without
 * value checks.
 *
 * @private
 * @param {Object} object The object to modify.
 * @param {string} key The key of the property to assign.
 * @param {*} value The value to assign.
 */
function baseAssignValue(object, key, value) {
  if (key == '__proto__' && defineProperty) {
    defineProperty(object, key, {
      'configurable': true,
      'enumerable': true,
      'value': value,
      'writable': true
    });
  } else {
    object[key] = value;
  }
}

module.exports = baseAssignValue;
var get = require('./get');

/**
 * The base implementation of `_.at` without support for individual paths.
 *
 * @private
 * @param {Object} object The object to iterate over.
 * @param {string[]} paths The property paths to pick.
 * @returns {Array} Returns the picked elements.
 */
function baseAt(object, paths) {
  var index = -1,
      length = paths.length,
      result = Array(length),
      skip = object == null;

  while (++index < length) {
    result[index] = skip ? undefined : get(object, paths[index]);
  }
  return result;
}

module.exports = baseAt;
/**
 * The base implementation of `_.clamp` which doesn't coerce arguments.
 *
 * @private
 * @param {number} number The number to clamp.
 * @param {number} [lower] The lower bound.
 * @param {number} upper The upper bound.
 * @returns {number} Returns the clamped number.
 */
function baseClamp(number, lower, upper) {
  if (number === number) {
    if (upper !== undefined) {
      number = number <= upper ? number : upper;
    }
    if (lower !== undefined) {
      number = number >= lower ? number : lower;
    }
  }
  return number;
}

module.exports = baseClamp;
var Stack = require('./_Stack'),
    arrayEach = require('./_arrayEach'),
    assignValue = require('./_assignValue'),
    baseAssign = require('./_baseAssign'),
    baseAssignIn = require('./_baseAssignIn'),
    cloneBuffer = require('./_cloneBuffer'),
    copyArray = require('./_copyArray'),
    copySymbols = require('./_copySymbols'),
    copySymbolsIn = require('./_copySymbolsIn'),
    getAllKeys = require('./_getAllKeys'),
    getAllKeysIn = require('./_getAllKeysIn'),
    getTag = require('./_getTag'),
    initCloneArray = require('./_initCloneArray'),
    initCloneByTag = require('./_initCloneByTag'),
    initCloneObject = require('./_initCloneObject'),
    isArray = require('./isArray'),
    isBuffer = require('./isBuffer'),
    isMap = require('./isMap'),
    isObject = require('./isObject'),
    isSet = require('./isSet'),
    keys = require('./keys'),
    keysIn = require('./keysIn');

/** Used to compose bitmasks for cloning. */
var CLONE_DEEP_FLAG = 1,
    CLONE_FLAT_FLAG = 2,
    CLONE_SYMBOLS_FLAG = 4;

/** `Object#toString` result references. */
var argsTag = '[object Arguments]',
    arrayTag = '[object Array]',
    boolTag = '[object Boolean]',
    dateTag = '[object Date]',
    errorTag = '[object Error]',
    funcTag = '[object Function]',
    genTag = '[object GeneratorFunction]',
    mapTag = '[object Map]',
    numberTag = '[object Number]',
    objectTag = '[object Object]',
    regexpTag = '[object RegExp]',
    setTag = '[object Set]',
    stringTag = '[object String]',
    symbolTag = '[object Symbol]',
    weakMapTag = '[object WeakMap]';

var arrayBufferTag = '[object ArrayBuffer]',
    dataViewTag = '[object DataView]',
    float32Tag = '[object Float32Array]',
    float64Tag = '[object Float64Array]',
    int8Tag = '[object Int8Array]',
    int16Tag = '[object Int16Array]',
    int32Tag = '[object Int32Array]',
    uint8Tag = '[object Uint8Array]',
    uint8ClampedTag = '[object Uint8ClampedArray]',
    uint16Tag = '[object Uint16Array]',
    uint32Tag = '[object Uint32Array]';

/** Used to identify `toStringTag` values supported by `_.clone`. */
var cloneableTags = {};
cloneableTags[argsTag] = cloneableTags[arrayTag] =
cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =
cloneableTags[boolTag] = cloneableTags[dateTag] =
cloneableTags[float32Tag] = cloneableTags[float64Tag] =
cloneableTags[int8Tag] = cloneableTags[int16Tag] =
cloneableTags[int32Tag] = cloneableTags[mapTag] =
cloneableTags[numberTag] = cloneableTags[objectTag] =
cloneableTags[regexpTag] = cloneableTags[setTag] =
cloneableTags[stringTag] = cloneableTags[symbolTag] =
cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
cloneableTags[errorTag] = cloneableTags[funcTag] =
cloneableTags[weakMapTag] = false;

/**
 * The base implementation of `_.clone` and `_.cloneDeep` which tracks
 * traversed objects.
 *
 * @private
 * @param {*} value The value to clone.
 * @param {boolean} bitmask The bitmask flags.
 *  1 - Deep clone
 *  2 - Flatten inherited properties
 *  4 - Clone symbols
 * @param {Function} [customizer] The function to customize cloning.
 * @param {string} [key] The key of `value`.
 * @param {Object} [object] The parent object of `value`.
 * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
 * @returns {*} Returns the cloned value.
 */
function baseClone(value, bitmask, customizer, key, object, stack) {
  var result,
      isDeep = bitmask & CLONE_DEEP_FLAG,
      isFlat = bitmask & CLONE_FLAT_FLAG,
      isFull = bitmask & CLONE_SYMBOLS_FLAG;

  if (customizer) {
    result = object ? customizer(value, key, object, stack) : customizer(value);
  }
  if (result !== undefined) {
    return result;
  }
  if (!isObject(value)) {
    return value;
  }
  var isArr = isArray(value);
  if (isArr) {
    result = initCloneArray(value);
    if (!isDeep) {
      return copyArray(value, result);
    }
  } else {
    var tag = getTag(value),
        isFunc = tag == funcTag || tag == genTag;

    if (isBuffer(value)) {
      return cloneBuffer(value, isDeep);
    }
    if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
      result = (isFlat || isFunc) ? {} : initCloneObject(value);
      if (!isDeep) {
        return isFlat
          ? copySymbolsIn(value, baseAssignIn(result, value))
          : copySymbols(value, baseAssign(result, value));
      }
    } else {
      if (!cloneableTags[tag]) {
        return object ? value : {};
      }
      result = initCloneByTag(value, tag, isDeep);
    }
  }
  // Check for circular references and return its corresponding clone.
  stack || (stack = new Stack);
  var stacked = stack.get(value);
  if (stacked) {
    return stacked;
  }
  stack.set(value, result);

  if (isSet(value)) {
    value.forEach(function(subValue) {
      result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
    });
  } else if (isMap(value)) {
    value.forEach(function(subValue, key) {
      result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
    });
  }

  var keysFunc = isFull
    ? (isFlat ? getAllKeysIn : getAllKeys)
    : (isFlat ? keysIn : keys);

  var props = isArr ? undefined : keysFunc(value);
  arrayEach(props || value, function(subValue, key) {
    if (props) {
      key = subValue;
      subValue = value[key];
    }
    // Recursively populate clone (susceptible to call stack limits).
    assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
  });
  return result;
}

module.exports = baseClone;
var baseConformsTo = require('./_baseConformsTo'),
    keys = require('./keys');

/**
 * The base implementation of `_.conforms` which doesn't clone `source`.
 *
 * @private
 * @param {Object} source The object of property predicates to conform to.
 * @returns {Function} Returns the new spec function.
 */
function baseConforms(source) {
  var props = keys(source);
  return function(object) {
    return baseConformsTo(object, source, props);
  };
}

module.exports = baseConforms;
/**
 * The base implementation of `_.conformsTo` which accepts `props` to check.
 *
 * @private
 * @param {Object} object The object to inspect.
 * @param {Object} source The object of property predicates to conform to.
 * @returns {boolean} Returns `true` if `object` conforms, else `false`.
 */
function baseConformsTo(object, source, props) {
  var length = props.length;
  if (object == null) {
    return !length;
  }
  object = Object(object);
  while (length--) {
    var key = props[length],
        predicate = source[key],
        value = object[key];

    if ((value === undefined && !(key in object)) || !predicate(value)) {
      return false;
    }
  }
  return true;
}

module.exports = baseConformsTo;
var isObject = require('./isObject');

/** Built-in value references. */
var objectCreate = Object.create;

/**
 * The base implementation of `_.create` without support for assigning
 * properties to the created object.
 *
 * @private
 * @param {Object} proto The object to inherit from.
 * @returns {Object} Returns the new object.
 */
var baseCreate = (function() {
  function object() {}
  return function(proto) {
    if (!isObject(proto)) {
      return {};
    }
    if (objectCreate) {
      return objectCreate(proto);
    }
    object.prototype = proto;
    var result = new object;
    object.prototype = undefined;
    return result;
  };
}());

module.exports = baseCreate;
/** Error message constants. */
var FUNC_ERROR_TEXT = 'Expected a function';

/**
 * The base implementation of `_.delay` and `_.defer` which accepts `args`
 * to provide to `func`.
 *
 * @private
 * @param {Function} func The function to delay.
 * @param {number} wait The number of milliseconds to delay invocation.
 * @param {Array} args The arguments to provide to `func`.
 * @returns {number|Object} Returns the timer id or timeout object.
 */
function baseDelay(func, wait, args) {
  if (typeof func != 'function') {
    throw new TypeError(FUNC_ERROR_TEXT);
  }
  return setTimeout(function() { func.apply(undefined, args); }, wait);
}

module.exports = baseDelay;
var SetCache = require('./_SetCache'),
    arrayIncludes = require('./_arrayIncludes'),
    arrayIncludesWith = require('./_arrayIncludesWith'),
    arrayMap = require('./_arrayMap'),
    baseUnary = require('./_baseUnary'),
    cacheHas = require('./_cacheHas');

/** Used as the size to enable large array optimizations. */
var LARGE_ARRAY_SIZE = 200;

/**
 * The base implementation of methods like `_.difference` without support
 * for excluding multiple arrays or iteratee shorthands.
 *
 * @private
 * @param {Array} array The array to inspect.
 * @param {Array} values The values to exclude.
 * @param {Function} [iteratee] The iteratee invoked per element.
 * @param {Function} [comparator] The comparator invoked per element.
 * @returns {Array} Returns the new array of filtered values.
 */
function baseDifference(array, values, iteratee, comparator) {
  var index = -1,
      includes = arrayIncludes,
      isCommon = true,
      length = array.length,
      result = [],
      valuesLength = values.length;

  if (!length) {
    return result;
  }
  if (iteratee) {
    values = arrayMap(values, baseUnary(iteratee));
  }
  if (comparator) {
    includes = arrayIncludesWith;
    isCommon = false;
  }
  else if (values.length >= LARGE_ARRAY_SIZE) {
    includes = cacheHas;
    isCommon = false;
    values = new SetCache(values);
  }
  outer:
  while (++index < length) {
    var value = array[index],
        computed = iteratee == null ? value : iteratee(value);

    value = (comparator || value !== 0) ? value : 0;
    if (isCommon && computed === computed) {
      var valuesIndex = valuesLength;
      while (valuesIndex--) {
        if (values[valuesIndex] === computed) {
          continue outer;
        }
      }
      result.push(value);
    }
    else if (!includes(values, computed, comparator)) {
      result.push(value);
    }
  }
  return result;
}

module.exports = baseDifference;
var baseForOwn = require('./_baseForOwn'),
    createBaseEach = require('./_createBaseEach');

/**
 * The base implementation of `_.forEach` without support for iteratee shorthands.
 *
 * @private
 * @param {Array|Object} collection The collection to iterate over.
 * @param {Function} iteratee The function invoked per iteration.
 * @returns {Array|Object} Returns `collection`.
 */
var baseEach = createBaseEach(baseForOwn);

module.exports = baseEach;
var baseForOwnRight = require('./_baseForOwnRight'),
    createBaseEach = require('./_createBaseEach');

/**
 * The base implementation of `_.forEachRight` without support for iteratee shorthands.
 *
 * @private
 * @param {Array|Object} collection The collection to iterate over.
 * @param {Function} iteratee The function invoked per iteration.
 * @returns {Array|Object} Returns `collection`.
 */
var baseEachRight = createBaseEach(baseForOwnRight, true);

module.exports = baseEachRight;
var baseEach = require('./_baseEach');

/**
 * The base implementation of `_.every` without support for iteratee shorthands.
 *
 * @private
 * @param {Array|Object} collection The collection to iterate over.
 * @param {Function} predicate The function invoked per iteration.
 * @returns {boolean} Returns `true` if all elements pass the predicate check,
 *  else `false`
 */
function baseEvery(collection, predicate) {
  var result = true;
  baseEach(collection, function(value, index, collection) {
    result = !!predicate(value, index, collection);
    return result;
  });
  return result;
}

module.exports = baseEvery;
var isSymbol = require('./isSymbol');

/**
 * The base implementation of methods like `_.max` and `_.min` which accepts a
 * `comparator` to determine the extremum value.
 *
 * @private
 * @param {Array} array The array to iterate over.
 * @param {Function} iteratee The iteratee invoked per iteration.
 * @param {Function} comparator The comparator used to compare values.
 * @returns {*} Returns the extremum value.
 */
function baseExtremum(array, iteratee, comparator) {
  var index = -1,
      length = array.length;

  while (++index < length) {
    var value = array[index],
        current = iteratee(value);

    if (current != null && (computed === undefined
          ? (current === current && !isSymbol(current))
          : comparator(current, computed)
        )) {
      var computed = current,
          result = value;
    }
  }
  return result;
}

module.exports = baseExtremum;
var toInteger = require('./toInteger'),
    toLength = require('./toLength');

/**
 * The base implementation of `_.fill` without an iteratee call guard.
 *
 * @private
 * @param {Array} array The array to fill.
 * @param {*} value The value to fill `array` with.
 * @param {number} [start=0] The start position.
 * @param {number} [end=array.length] The end position.
 * @returns {Array} Returns `array`.
 */
function baseFill(array, value, start, end) {
  var length = array.length;

  start = toInteger(start);
  if (start < 0) {
    start = -start > length ? 0 : (length + start);
  }
  end = (end === undefined || end > length) ? length : toInteger(end);
  if (end < 0) {
    end += length;
  }
  end = start > end ? 0 : toLength(end);
  while (start < end) {
    array[start++] = value;
  }
  return array;
}

module.exports = baseFill;
var baseEach = require('./_baseEach');

/**
 * The base implementation of `_.filter` without support for iteratee shorthands.
 *
 * @private
 * @param {Array|Object} collection The collection to iterate over.
 * @param {Function} predicate The function invoked per iteration.
 * @returns {Array} Returns the new filtered array.
 */
function baseFilter(collection, predicate) {
  var result = [];
  baseEach(collection, function(value, index, collection) {
    if (predicate(value, index, collection)) {
      result.push(value);
    }
  });
  return result;
}

module.exports = baseFilter;
/**
 * The base implementation of `_.findIndex` and `_.findLastIndex` without
 * support for iteratee shorthands.
 *
 * @private
 * @param {Array} array The array to inspect.
 * @param {Function} predicate The function invoked per iteration.
 * @param {number} fromIndex The index to search from.
 * @param {boolean} [fromRight] Specify iterating from right to left.
 * @returns {number} Returns the index of the matched value, else `-1`.
 */
function baseFindIndex(array, predicate, fromIndex, fromRight) {
  var length = array.length,
      index = fromIndex + (fromRight ? 1 : -1);

  while ((fromRight ? index-- : ++index < length)) {
    if (predicate(array[index], index, array)) {
      return index;
    }
  }
  return -1;
}

module.exports = baseFindIndex;
/**
 * The base implementation of methods like `_.findKey` and `_.findLastKey`,
 * without support for iteratee shorthands, which iterates over `collection`
 * using `eachFunc`.
 *
 * @private
 * @param {Array|Object} collection The collection to inspect.
 * @param {Function} predicate The function invoked per iteration.
 * @param {Function} eachFunc The function to iterate over `collection`.
 * @returns {*} Returns the found element or its key, else `undefined`.
 */
function baseFindKey(collection, predicate, eachFunc) {
  var result;
  eachFunc(collection, function(value, key, collection) {
    if (predicate(value, key, collection)) {
      result = key;
      return false;
    }
  });
  return result;
}

module.exports = baseFindKey;
var arrayPush = require('./_arrayPush'),
    isFlattenable = require('./_isFlattenable');

/**
 * The base implementation of `_.flatten` with support for restricting flattening.
 *
 * @private
 * @param {Array} array The array to flatten.
 * @param {number} depth The maximum recursion depth.
 * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
 * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
 * @param {Array} [result=[]] The initial result value.
 * @returns {Array} Returns the new flattened array.
 */
function baseFlatten(array, depth, predicate, isStrict, result) {
  var index = -1,
      length = array.length;

  predicate || (predicate = isFlattenable);
  result || (result = []);

  while (++index < length) {
    var value = array[index];
    if (depth > 0 && predicate(value)) {
      if (depth > 1) {
        // Recursively flatten arrays (susceptible to call stack limits).
        baseFlatten(value, depth - 1, predicate, isStrict, result);
      } else {
        arrayPush(result, value);
      }
    } else if (!isStrict) {
      result[result.length] = value;
    }
  }
  return result;
}

module.exports = baseFlatten;
var createBaseFor = require('./_createBaseFor');

/**
 * The base implementation of `baseForOwn` which iterates over `object`
 * properties returned by `keysFunc` and invokes `iteratee` for each property.
 * Iteratee functions may exit iteration early by explicitly returning `false`.
 *
 * @private
 * @param {Object} object The object to iterate over.
 * @param {Function} iteratee The function invoked per iteration.
 * @param {Function} keysFunc The function to get the keys of `object`.
 * @returns {Object} Returns `object`.
 */
var baseFor = createBaseFor();

module.exports = baseFor;
var baseFor = require('./_baseFor'),
    keys = require('./keys');

/**
 * The base implementation of `_.forOwn` without support for iteratee shorthands.
 *
 * @private
 * @param {Object} object The object to iterate over.
 * @param {Function} iteratee The function invoked per iteration.
 * @returns {Object} Returns `object`.
 */
function baseForOwn(object, iteratee) {
  return object && baseFor(object, iteratee, keys);
}

module.exports = baseForOwn;
var baseForRight = require('./_baseForRight'),
    keys = require('./keys');

/**
 * The base implementation of `_.forOwnRight` without support for iteratee shorthands.
 *
 * @private
 * @param {Object} object The object to iterate over.
 * @param {Function} iteratee The function invoked per iteration.
 * @returns {Object} Returns `object`.
 */
function baseForOwnRight(object, iteratee) {
  return object && baseForRight(object, iteratee, keys);
}

module.exports = baseForOwnRight;
var createBaseFor = require('./_createBaseFor');

/**
 * This function is like `baseFor` except that it iterates over properties
 * in the opposite order.
 *
 * @private
 * @param {Object} object The object to iterate over.
 * @param {Function} iteratee The function invoked per iteration.
 * @param {Function} keysFunc The function to get the keys of `object`.
 * @returns {Object} Returns `object`.
 */
var baseForRight = createBaseFor(true);

module.exports = baseForRight;
var arrayFilter = require('./_arrayFilter'),
    isFunction = require('./isFunction');

/**
 * The base implementation of `_.functions` which creates an array of
 * `object` function property names filtered from `props`.
 *
 * @private
 * @param {Object} object The object to inspect.
 * @param {Array} props The property names to filter.
 * @returns {Array} Returns the function names.
 */
function baseFunctions(object, props) {
  return arrayFilter(props, function(key) {
    return isFunction(object[key]);
  });
}

module.exports = baseFunctions;
var castPath = require('./_castPath'),
    toKey = require('./_toKey');

/**
 * The base implementation of `_.get` without support for default values.
 *
 * @private
 * @param {Object} object The object to query.
 * @param {Array|string} path The path of the property to get.
 * @returns {*} Returns the resolved value.
 */
function baseGet(object, path) {
  path = castPath(path, object);

  var index = 0,
      length = path.length;

  while (object != null && index < length) {
    object = object[toKey(path[index++])];
  }
  return (index && index == length) ? object : undefined;
}

module.exports = baseGet;
var arrayPush = require('./_arrayPush'),
    isArray = require('./isArray');

/**
 * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
 * `keysFunc` and `symbolsFunc` to get the enumerable property names and
 * symbols of `object`.
 *
 * @private
 * @param {Object} object The object to query.
 * @param {Function} keysFunc The function to get the keys of `object`.
 * @param {Function} symbolsFunc The function to get the symbols of `object`.
 * @returns {Array} Returns the array of property names and symbols.
 */
function baseGetAllKeys(object, keysFunc, symbolsFunc) {
  var result = keysFunc(object);
  return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
}

module.exports = baseGetAllKeys;
var Symbol = require('./_Symbol'),
    getRawTag = require('./_getRawTag'),
    objectToString = require('./_objectToString');

/** `Object#toString` result references. */
var nullTag = '[object Null]',
    undefinedTag = '[object Undefined]';

/** Built-in value references. */
var symToStringTag = Symbol ? Symbol.toStringTag : undefined;

/**
 * The base implementation of `getTag` without fallbacks for buggy environments.
 *
 * @private
 * @param {*} value The value to query.
 * @returns {string} Returns the `toStringTag`.
 */
function baseGetTag(value) {
  if (value == null) {
    return value === undefined ? undefinedTag : nullTag;
  }
  return (symToStringTag && symToStringTag in Object(value))
    ? getRawTag(value)
    : objectToString(value);
}

module.exports = baseGetTag;
/**
 * The base implementation of `_.gt` which doesn't coerce arguments.
 *
 * @private
 * @param {*} value The value to compare.
 * @param {*} other The other value to compare.
 * @returns {boolean} Returns `true` if `value` is greater than `other`,
 *  else `false`.
 */
function baseGt(value, other) {
  return value > other;
}

module.exports = baseGt;
/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * The base implementation of `_.has` without support for deep paths.
 *
 * @private
 * @param {Object} [object] The object to query.
 * @param {Array|string} key The key to check.
 * @returns {boolean} Returns `true` if `key` exists, else `false`.
 */
function baseHas(object, key) {
  return object != null && hasOwnProperty.call(object, key);
}

module.exports = baseHas;
/**
 * The base implementation of `_.hasIn` without support for deep paths.
 *
 * @private
 * @param {Object} [object] The object to query.
 * @param {Array|string} key The key to check.
 * @returns {boolean} Returns `true` if `key` exists, else `false`.
 */
function baseHasIn(object, key) {
  return object != null && key in Object(object);
}

module.exports = baseHasIn;
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max,
    nativeMin = Math.min;

/**
 * The base implementation of `_.inRange` which doesn't coerce arguments.
 *
 * @private
 * @param {number} number The number to check.
 * @param {number} start The start of the range.
 * @param {number} end The end of the range.
 * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
 */
function baseInRange(number, start, end) {
  return number >= nativeMin(start, end) && number < nativeMax(start, end);
}

module.exports = baseInRange;
var baseFindIndex = require('./_baseFindIndex'),
    baseIsNaN = require('./_baseIsNaN'),
    strictIndexOf = require('./_strictIndexOf');

/**
 * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
 *
 * @private
 * @param {Array} array The array to inspect.
 * @param {*} value The value to search for.
 * @param {number} fromIndex The index to search from.
 * @returns {number} Returns the index of the matched value, else `-1`.
 */
function baseIndexOf(array, value, fromIndex) {
  return value === value
    ? strictIndexOf(array, value, fromIndex)
    : baseFindIndex(array, baseIsNaN, fromIndex);
}

module.exports = baseIndexOf;
/**
 * This function is like `baseIndexOf` except that it accepts a comparator.
 *
 * @private
 * @param {Array} array The array to inspect.
 * @param {*} value The value to search for.
 * @param {number} fromIndex The index to search from.
 * @param {Function} comparator The comparator invoked per element.
 * @returns {number} Returns the index of the matched value, else `-1`.
 */
function baseIndexOfWith(array, value, fromIndex, comparator) {
  var index = fromIndex - 1,
      length = array.length;

  while (++index < length) {
    if (comparator(array[index], value)) {
      return index;
    }
  }
  return -1;
}

module.exports = baseIndexOfWith;
var SetCache = require('./_SetCache'),
    arrayIncludes = require('./_arrayIncludes'),
    arrayIncludesWith = require('./_arrayIncludesWith'),
    arrayMap = require('./_arrayMap'),
    baseUnary = require('./_baseUnary'),
    cacheHas = require('./_cacheHas');

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMin = Math.min;

/**
 * The base implementation of methods like `_.intersection`, without support
 * for iteratee shorthands, that accepts an array of arrays to inspect.
 *
 * @private
 * @param {Array} arrays The arrays to inspect.
 * @param {Function} [iteratee] The iteratee invoked per element.
 * @param {Function} [comparator] The comparator invoked per element.
 * @returns {Array} Returns the new array of shared values.
 */
function baseIntersection(arrays, iteratee, comparator) {
  var includes = comparator ? arrayIncludesWith : arrayIncludes,
      length = arrays[0].length,
      othLength = arrays.length,
      othIndex = othLength,
      caches = Array(othLength),
      maxLength = Infinity,
      result = [];

  while (othIndex--) {
    var array = arrays[othIndex];
    if (othIndex && iteratee) {
      array = arrayMap(array, baseUnary(iteratee));
    }
    maxLength = nativeMin(array.length, maxLength);
    caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
      ? new SetCache(othIndex && array)
      : undefined;
  }
  array = arrays[0];

  var index = -1,
      seen = caches[0];

  outer:
  while (++index < length && result.length < maxLength) {
    var value = array[index],
        computed = iteratee ? iteratee(value) : value;

    value = (comparator || value !== 0) ? value : 0;
    if (!(seen
          ? cacheHas(seen, computed)
          : includes(result, computed, comparator)
        )) {
      othIndex = othLength;
      while (--othIndex) {
        var cache = caches[othIndex];
        if (!(cache
              ? cacheHas(cache, computed)
              : includes(arrays[othIndex], computed, comparator))
            ) {
          continue outer;
        }
      }
      if (seen) {
        seen.push(computed);
      }
      result.push(value);
    }
  }
  return result;
}

module.exports = baseIntersection;
var baseForOwn = require('./_baseForOwn');

/**
 * The base implementation of `_.invert` and `_.invertBy` which inverts
 * `object` with values transformed by `iteratee` and set by `setter`.
 *
 * @private
 * @param {Object} object The object to iterate over.
 * @param {Function} setter The function to set `accumulator` values.
 * @param {Function} iteratee The iteratee to transform values.
 * @param {Object} accumulator The initial inverted object.
 * @returns {Function} Returns `accumulator`.
 */
function baseInverter(object, setter, iteratee, accumulator) {
  baseForOwn(object, function(value, key, object) {
    setter(accumulator, iteratee(value), key, object);
  });
  return accumulator;
}

module.exports = baseInverter;
var apply = require('./_apply'),
    castPath = require('./_castPath'),
    last = require('./last'),
    parent = require('./_parent'),
    toKey = require('./_toKey');

/**
 * The base implementation of `_.invoke` without support for individual
 * method arguments.
 *
 * @private
 * @param {Object} object The object to query.
 * @param {Array|string} path The path of the method to invoke.
 * @param {Array} args The arguments to invoke the method with.
 * @returns {*} Returns the result of the invoked method.
 */
function baseInvoke(object, path, args) {
  path = castPath(path, object);
  object = parent(object, path);
  var func = object == null ? object : object[toKey(last(path))];
  return func == null ? undefined : apply(func, object, args);
}

module.exports = baseInvoke;
var baseGetTag = require('./_baseGetTag'),
    isObjectLike = require('./isObjectLike');

/** `Object#toString` result references. */
var argsTag = '[object Arguments]';

/**
 * The base implementation of `_.isArguments`.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an `arguments` object,
 */
function baseIsArguments(value) {
  return isObjectLike(value) && baseGetTag(value) == argsTag;
}

module.exports = baseIsArguments;
var baseGetTag = require('./_baseGetTag'),
    isObjectLike = require('./isObjectLike');

var arrayBufferTag = '[object ArrayBuffer]';

/**
 * The base implementation of `_.isArrayBuffer` without Node.js optimizations.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
 */
function baseIsArrayBuffer(value) {
  return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;
}

module.exports = baseIsArrayBuffer;
var baseGetTag = require('./_baseGetTag'),
    isObjectLike = require('./isObjectLike');

/** `Object#toString` result references. */
var dateTag = '[object Date]';

/**
 * The base implementation of `_.isDate` without Node.js optimizations.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
 */
function baseIsDate(value) {
  return isObjectLike(value) && baseGetTag(value) == dateTag;
}

module.exports = baseIsDate;
var baseIsEqualDeep = require('./_baseIsEqualDeep'),
    isObjectLike = require('./isObjectLike');

/**
 * The base implementation of `_.isEqual` which supports partial comparisons
 * and tracks traversed objects.
 *
 * @private
 * @param {*} value The value to compare.
 * @param {*} other The other value to compare.
 * @param {boolean} bitmask The bitmask flags.
 *  1 - Unordered comparison
 *  2 - Partial comparison
 * @param {Function} [customizer] The function to customize comparisons.
 * @param {Object} [stack] Tracks traversed `value` and `other` objects.
 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
 */
function baseIsEqual(value, other, bitmask, customizer, stack) {
  if (value === other) {
    return true;
  }
  if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
    return value !== value && other !== other;
  }
  return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
}

module.exports = baseIsEqual;
var Stack = require('./_Stack'),
    equalArrays = require('./_equalArrays'),
    equalByTag = require('./_equalByTag'),
    equalObjects = require('./_equalObjects'),
    getTag = require('./_getTag'),
    isArray = require('./isArray'),
    isBuffer = require('./isBuffer'),
    isTypedArray = require('./isTypedArray');

/** Used to compose bitmasks for value comparisons. */
var COMPARE_PARTIAL_FLAG = 1;

/** `Object#toString` result references. */
var argsTag = '[object Arguments]',
    arrayTag = '[object Array]',
    objectTag = '[object Object]';

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * A specialized version of `baseIsEqual` for arrays and objects which performs
 * deep comparisons and tracks traversed objects enabling objects with circular
 * references to be compared.
 *
 * @private
 * @param {Object} object The object to compare.
 * @param {Object} other The other object to compare.
 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
 * @param {Function} customizer The function to customize comparisons.
 * @param {Function} equalFunc The function to determine equivalents of values.
 * @param {Object} [stack] Tracks traversed `object` and `other` objects.
 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
 */
function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
  var objIsArr = isArray(object),
      othIsArr = isArray(other),
      objTag = objIsArr ? arrayTag : getTag(object),
      othTag = othIsArr ? arrayTag : getTag(other);

  objTag = objTag == argsTag ? objectTag : objTag;
  othTag = othTag == argsTag ? objectTag : othTag;

  var objIsObj = objTag == objectTag,
      othIsObj = othTag == objectTag,
      isSameTag = objTag == othTag;

  if (isSameTag && isBuffer(object)) {
    if (!isBuffer(other)) {
      return false;
    }
    objIsArr = true;
    objIsObj = false;
  }
  if (isSameTag && !objIsObj) {
    stack || (stack = new Stack);
    return (objIsArr || isTypedArray(object))
      ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
      : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
  }
  if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');

    if (objIsWrapped || othIsWrapped) {
      var objUnwrapped = objIsWrapped ? object.value() : object,
          othUnwrapped = othIsWrapped ? other.value() : other;

      stack || (stack = new Stack);
      return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
    }
  }
  if (!isSameTag) {
    return false;
  }
  stack || (stack = new Stack);
  return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
}

module.exports = baseIsEqualDeep;
var getTag = require('./_getTag'),
    isObjectLike = require('./isObjectLike');

/** `Object#toString` result references. */
var mapTag = '[object Map]';

/**
 * The base implementation of `_.isMap` without Node.js optimizations.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a map, else `false`.
 */
function baseIsMap(value) {
  return isObjectLike(value) && getTag(value) == mapTag;
}

module.exports = baseIsMap;
var Stack = require('./_Stack'),
    baseIsEqual = require('./_baseIsEqual');

/** Used to compose bitmasks for value comparisons. */
var COMPARE_PARTIAL_FLAG = 1,
    COMPARE_UNORDERED_FLAG = 2;

/**
 * The base implementation of `_.isMatch` without support for iteratee shorthands.
 *
 * @private
 * @param {Object} object The object to inspect.
 * @param {Object} source The object of property values to match.
 * @param {Array} matchData The property names, values, and compare flags to match.
 * @param {Function} [customizer] The function to customize comparisons.
 * @returns {boolean} Returns `true` if `object` is a match, else `false`.
 */
function baseIsMatch(object, source, matchData, customizer) {
  var index = matchData.length,
      length = index,
      noCustomizer = !customizer;

  if (object == null) {
    return !length;
  }
  object = Object(object);
  while (index--) {
    var data = matchData[index];
    if ((noCustomizer && data[2])
          ? data[1] !== object[data[0]]
          : !(data[0] in object)
        ) {
      return false;
    }
  }
  while (++index < length) {
    data = matchData[index];
    var key = data[0],
        objValue = object[key],
        srcValue = data[1];

    if (noCustomizer && data[2]) {
      if (objValue === undefined && !(key in object)) {
        return false;
      }
    } else {
      var stack = new Stack;
      if (customizer) {
        var result = customizer(objValue, srcValue, key, object, source, stack);
      }
      if (!(result === undefined
            ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)
            : result
          )) {
        return false;
      }
    }
  }
  return true;
}

module.exports = baseIsMatch;
/**
 * The base implementation of `_.isNaN` without support for number objects.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
 */
function baseIsNaN(value) {
  return value !== value;
}

module.exports = baseIsNaN;
var isFunction = require('./isFunction'),
    isMasked = require('./_isMasked'),
    isObject = require('./isObject'),
    toSource = require('./_toSource');

/**
 * Used to match `RegExp`
 * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
 */
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;

/** Used to detect host constructors (Safari). */
var reIsHostCtor = /^\[object .+?Constructor\]$/;

/** Used for built-in method references. */
var funcProto = Function.prototype,
    objectProto = Object.prototype;

/** Used to resolve the decompiled source of functions. */
var funcToString = funcProto.toString;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/** Used to detect if a method is native. */
var reIsNative = RegExp('^' +
  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
  .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
);

/**
 * The base implementation of `_.isNative` without bad shim checks.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a native function,
 *  else `false`.
 */
function baseIsNative(value) {
  if (!isObject(value) || isMasked(value)) {
    return false;
  }
  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
  return pattern.test(toSource(value));
}

module.exports = baseIsNative;
var baseGetTag = require('./_baseGetTag'),
    isObjectLike = require('./isObjectLike');

/** `Object#toString` result references. */
var regexpTag = '[object RegExp]';

/**
 * The base implementation of `_.isRegExp` without Node.js optimizations.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
 */
function baseIsRegExp(value) {
  return isObjectLike(value) && baseGetTag(value) == regexpTag;
}

module.exports = baseIsRegExp;
var getTag = require('./_getTag'),
    isObjectLike = require('./isObjectLike');

/** `Object#toString` result references. */
var setTag = '[object Set]';

/**
 * The base implementation of `_.isSet` without Node.js optimizations.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a set, else `false`.
 */
function baseIsSet(value) {
  return isObjectLike(value) && getTag(value) == setTag;
}

module.exports = baseIsSet;
var baseGetTag = require('./_baseGetTag'),
    isLength = require('./isLength'),
    isObjectLike = require('./isObjectLike');

/** `Object#toString` result references. */
var argsTag = '[object Arguments]',
    arrayTag = '[object Array]',
    boolTag = '[object Boolean]',
    dateTag = '[object Date]',
    errorTag = '[object Error]',
    funcTag = '[object Function]',
    mapTag = '[object Map]',
    numberTag = '[object Number]',
    objectTag = '[object Object]',
    regexpTag = '[object RegExp]',
    setTag = '[object Set]',
    stringTag = '[object String]',
    weakMapTag = '[object WeakMap]';

var arrayBufferTag = '[object ArrayBuffer]',
    dataViewTag = '[object DataView]',
    float32Tag = '[object Float32Array]',
    float64Tag = '[object Float64Array]',
    int8Tag = '[object Int8Array]',
    int16Tag = '[object Int16Array]',
    int32Tag = '[object Int32Array]',
    uint8Tag = '[object Uint8Array]',
    uint8ClampedTag = '[object Uint8ClampedArray]',
    uint16Tag = '[object Uint16Array]',
    uint32Tag = '[object Uint32Array]';

/** Used to identify `toStringTag` values of typed arrays. */
var typedArrayTags = {};
typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
typedArrayTags[uint32Tag] = true;
typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
typedArrayTags[errorTag] = typedArrayTags[funcTag] =
typedArrayTags[mapTag] = typedArrayTags[numberTag] =
typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
typedArrayTags[setTag] = typedArrayTags[stringTag] =
typedArrayTags[weakMapTag] = false;

/**
 * The base implementation of `_.isTypedArray` without Node.js optimizations.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
 */
function baseIsTypedArray(value) {
  return isObjectLike(value) &&
    isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
}

module.exports = baseIsTypedArray;
var baseMatches = require('./_baseMatches'),
    baseMatchesProperty = require('./_baseMatchesProperty'),
    identity = require('./identity'),
    isArray = require('./isArray'),
    property = require('./property');

/**
 * The base implementation of `_.iteratee`.
 *
 * @private
 * @param {*} [value=_.identity] The value to convert to an iteratee.
 * @returns {Function} Returns the iteratee.
 */
function baseIteratee(value) {
  // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
  // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
  if (typeof value == 'function') {
    return value;
  }
  if (value == null) {
    return identity;
  }
  if (typeof value == 'object') {
    return isArray(value)
      ? baseMatchesProperty(value[0], value[1])
      : baseMatches(value);
  }
  return property(value);
}

module.exports = baseIteratee;
var isPrototype = require('./_isPrototype'),
    nativeKeys = require('./_nativeKeys');

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
 *
 * @private
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of property names.
 */
function baseKeys(object) {
  if (!isPrototype(object)) {
    return nativeKeys(object);
  }
  var result = [];
  for (var key in Object(object)) {
    if (hasOwnProperty.call(object, key) && key != 'constructor') {
      result.push(key);
    }
  }
  return result;
}

module.exports = baseKeys;
var isObject = require('./isObject'),
    isPrototype = require('./_isPrototype'),
    nativeKeysIn = require('./_nativeKeysIn');

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
 *
 * @private
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of property names.
 */
function baseKeysIn(object) {
  if (!isObject(object)) {
    return nativeKeysIn(object);
  }
  var isProto = isPrototype(object),
      result = [];

  for (var key in object) {
    if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
      result.push(key);
    }
  }
  return result;
}

module.exports = baseKeysIn;
/**
 * The function whose prototype chain sequence wrappers inherit from.
 *
 * @private
 */
function baseLodash() {
  // No operation performed.
}

module.exports = baseLodash;
/**
 * The base implementation of `_.lt` which doesn't coerce arguments.
 *
 * @private
 * @param {*} value The value to compare.
 * @param {*} other The other value to compare.
 * @returns {boolean} Returns `true` if `value` is less than `other`,
 *  else `false`.
 */
function baseLt(value, other) {
  return value < other;
}

module.exports = baseLt;
var baseEach = require('./_baseEach'),
    isArrayLike = require('./isArrayLike');

/**
 * The base implementation of `_.map` without support for iteratee shorthands.
 *
 * @private
 * @param {Array|Object} collection The collection to iterate over.
 * @param {Function} iteratee The function invoked per iteration.
 * @returns {Array} Returns the new mapped array.
 */
function baseMap(collection, iteratee) {
  var index = -1,
      result = isArrayLike(collection) ? Array(collection.length) : [];

  baseEach(collection, function(value, key, collection) {
    result[++index] = iteratee(value, key, collection);
  });
  return result;
}

module.exports = baseMap;
var baseIsMatch = require('./_baseIsMatch'),
    getMatchData = require('./_getMatchData'),
    matchesStrictComparable = require('./_matchesStrictComparable');

/**
 * The base implementation of `_.matches` which doesn't clone `source`.
 *
 * @private
 * @param {Object} source The object of property values to match.
 * @returns {Function} Returns the new spec function.
 */
function baseMatches(source) {
  var matchData = getMatchData(source);
  if (matchData.length == 1 && matchData[0][2]) {
    return matchesStrictComparable(matchData[0][0], matchData[0][1]);
  }
  return function(object) {
    return object === source || baseIsMatch(object, source, matchData);
  };
}

module.exports = baseMatches;
var baseIsEqual = require('./_baseIsEqual'),
    get = require('./get'),
    hasIn = require('./hasIn'),
    isKey = require('./_isKey'),
    isStrictComparable = require('./_isStrictComparable'),
    matchesStrictComparable = require('./_matchesStrictComparable'),
    toKey = require('./_toKey');

/** Used to compose bitmasks for value comparisons. */
var COMPARE_PARTIAL_FLAG = 1,
    COMPARE_UNORDERED_FLAG = 2;

/**
 * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
 *
 * @private
 * @param {string} path The path of the property to get.
 * @param {*} srcValue The value to match.
 * @returns {Function} Returns the new spec function.
 */
function baseMatchesProperty(path, srcValue) {
  if (isKey(path) && isStrictComparable(srcValue)) {
    return matchesStrictComparable(toKey(path), srcValue);
  }
  return function(object) {
    var objValue = get(object, path);
    return (objValue === undefined && objValue === srcValue)
      ? hasIn(object, path)
      : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
  };
}

module.exports = baseMatchesProperty;
var baseSum = require('./_baseSum');

/** Used as references for various `Number` constants. */
var NAN = 0 / 0;

/**
 * The base implementation of `_.mean` and `_.meanBy` without support for
 * iteratee shorthands.
 *
 * @private
 * @param {Array} array The array to iterate over.
 * @param {Function} iteratee The function invoked per iteration.
 * @returns {number} Returns the mean.
 */
function baseMean(array, iteratee) {
  var length = array == null ? 0 : array.length;
  return length ? (baseSum(array, iteratee) / length) : NAN;
}

module.exports = baseMean;
var Stack = require('./_Stack'),
    assignMergeValue = require('./_assignMergeValue'),
    baseFor = require('./_baseFor'),
    baseMergeDeep = require('./_baseMergeDeep'),
    isObject = require('./isObject'),
    keysIn = require('./keysIn'),
    safeGet = require('./_safeGet');

/**
 * The base implementation of `_.merge` without support for multiple sources.
 *
 * @private
 * @param {Object} object The destination object.
 * @param {Object} source The source object.
 * @param {number} srcIndex The index of `source`.
 * @param {Function} [customizer] The function to customize merged values.
 * @param {Object} [stack] Tracks traversed source values and their merged
 *  counterparts.
 */
function baseMerge(object, source, srcIndex, customizer, stack) {
  if (object === source) {
    return;
  }
  baseFor(source, function(srcValue, key) {
    stack || (stack = new Stack);
    if (isObject(srcValue)) {
      baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
    }
    else {
      var newValue = customizer
        ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)
        : undefined;

      if (newValue === undefined) {
        newValue = srcValue;
      }
      assignMergeValue(object, key, newValue);
    }
  }, keysIn);
}

module.exports = baseMerge;
var assignMergeValue = require('./_assignMergeValue'),
    cloneBuffer = require('./_cloneBuffer'),
    cloneTypedArray = require('./_cloneTypedArray'),
    copyArray = require('./_copyArray'),
    initCloneObject = require('./_initCloneObject'),
    isArguments = require('./isArguments'),
    isArray = require('./isArray'),
    isArrayLikeObject = require('./isArrayLikeObject'),
    isBuffer = require('./isBuffer'),
    isFunction = require('./isFunction'),
    isObject = require('./isObject'),
    isPlainObject = require('./isPlainObject'),
    isTypedArray = require('./isTypedArray'),
    safeGet = require('./_safeGet'),
    toPlainObject = require('./toPlainObject');

/**
 * A specialized version of `baseMerge` for arrays and objects which performs
 * deep merges and tracks traversed objects enabling objects with circular
 * references to be merged.
 *
 * @private
 * @param {Object} object The destination object.
 * @param {Object} source The source object.
 * @param {string} key The key of the value to merge.
 * @param {number} srcIndex The index of `source`.
 * @param {Function} mergeFunc The function to merge values.
 * @param {Function} [customizer] The function to customize assigned values.
 * @param {Object} [stack] Tracks traversed source values and their merged
 *  counterparts.
 */
function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
  var objValue = safeGet(object, key),
      srcValue = safeGet(source, key),
      stacked = stack.get(srcValue);

  if (stacked) {
    assignMergeValue(object, key, stacked);
    return;
  }
  var newValue = customizer
    ? customizer(objValue, srcValue, (key + ''), object, source, stack)
    : undefined;

  var isCommon = newValue === undefined;

  if (isCommon) {
    var isArr = isArray(srcValue),
        isBuff = !isArr && isBuffer(srcValue),
        isTyped = !isArr && !isBuff && isTypedArray(srcValue);

    newValue = srcValue;
    if (isArr || isBuff || isTyped) {
      if (isArray(objValue)) {
        newValue = objValue;
      }
      else if (isArrayLikeObject(objValue)) {
        newValue = copyArray(objValue);
      }
      else if (isBuff) {
        isCommon = false;
        newValue = cloneBuffer(srcValue, true);
      }
      else if (isTyped) {
        isCommon = false;
        newValue = cloneTypedArray(srcValue, true);
      }
      else {
        newValue = [];
      }
    }
    else if (isPlainObject(srcValue) || isArguments(srcValue)) {
      newValue = objValue;
      if (isArguments(objValue)) {
        newValue = toPlainObject(objValue);
      }
      else if (!isObject(objValue) || isFunction(objValue)) {
        newValue = initCloneObject(srcValue);
      }
    }
    else {
      isCommon = false;
    }
  }
  if (isCommon) {
    // Recursively merge objects and arrays (susceptible to call stack limits).
    stack.set(srcValue, newValue);
    mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
    stack['delete'](srcValue);
  }
  assignMergeValue(object, key, newValue);
}

module.exports = baseMergeDeep;
var isIndex = require('./_isIndex');

/**
 * The base implementation of `_.nth` which doesn't coerce arguments.
 *
 * @private
 * @param {Array} array The array to query.
 * @param {number} n The index of the element to return.
 * @returns {*} Returns the nth element of `array`.
 */
function baseNth(array, n) {
  var length = array.length;
  if (!length) {
    return;
  }
  n += n < 0 ? length : 0;
  return isIndex(n, length) ? array[n] : undefined;
}

module.exports = baseNth;
var arrayMap = require('./_arrayMap'),
    baseGet = require('./_baseGet'),
    baseIteratee = require('./_baseIteratee'),
    baseMap = require('./_baseMap'),
    baseSortBy = require('./_baseSortBy'),
    baseUnary = require('./_baseUnary'),
    compareMultiple = require('./_compareMultiple'),
    identity = require('./identity'),
    isArray = require('./isArray');

/**
 * The base implementation of `_.orderBy` without param guards.
 *
 * @private
 * @param {Array|Object} collection The collection to iterate over.
 * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
 * @param {string[]} orders The sort orders of `iteratees`.
 * @returns {Array} Returns the new sorted array.
 */
function baseOrderBy(collection, iteratees, orders) {
  if (iteratees.length) {
    iteratees = arrayMap(iteratees, function(iteratee) {
      if (isArray(iteratee)) {
        return function(value) {
          return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);
        }
      }
      return iteratee;
    });
  } else {
    iteratees = [identity];
  }

  var index = -1;
  iteratees = arrayMap(iteratees, baseUnary(baseIteratee));

  var result = baseMap(collection, function(value, key, collection) {
    var criteria = arrayMap(iteratees, function(iteratee) {
      return iteratee(value);
    });
    return { 'criteria': criteria, 'index': ++index, 'value': value };
  });

  return baseSortBy(result, function(object, other) {
    return compareMultiple(object, other, orders);
  });
}

module.exports = baseOrderBy;
var basePickBy = require('./_basePickBy'),
    hasIn = require('./hasIn');

/**
 * The base implementation of `_.pick` without support for individual
 * property identifiers.
 *
 * @private
 * @param {Object} object The source object.
 * @param {string[]} paths The property paths to pick.
 * @returns {Object} Returns the new object.
 */
function basePick(object, paths) {
  return basePickBy(object, paths, function(value, path) {
    return hasIn(object, path);
  });
}

module.exports = basePick;
var baseGet = require('./_baseGet'),
    baseSet = require('./_baseSet'),
    castPath = require('./_castPath');

/**
 * The base implementation of  `_.pickBy` without support for iteratee shorthands.
 *
 * @private
 * @param {Object} object The source object.
 * @param {string[]} paths The property paths to pick.
 * @param {Function} predicate The function invoked per property.
 * @returns {Object} Returns the new object.
 */
function basePickBy(object, paths, predicate) {
  var index = -1,
      length = paths.length,
      result = {};

  while (++index < length) {
    var path = paths[index],
        value = baseGet(object, path);

    if (predicate(value, path)) {
      baseSet(result, castPath(path, object), value);
    }
  }
  return result;
}

module.exports = basePickBy;
/**
 * The base implementation of `_.property` without support for deep paths.
 *
 * @private
 * @param {string} key The key of the property to get.
 * @returns {Function} Returns the new accessor function.
 */
function baseProperty(key) {
  return function(object) {
    return object == null ? undefined : object[key];
  };
}

module.exports = baseProperty;
var baseGet = require('./_baseGet');

/**
 * A specialized version of `baseProperty` which supports deep paths.
 *
 * @private
 * @param {Array|string} path The path of the property to get.
 * @returns {Function} Returns the new accessor function.
 */
function basePropertyDeep(path) {
  return function(object) {
    return baseGet(object, path);
  };
}

module.exports = basePropertyDeep;
/**
 * The base implementation of `_.propertyOf` without support for deep paths.
 *
 * @private
 * @param {Object} object The object to query.
 * @returns {Function} Returns the new accessor function.
 */
function basePropertyOf(object) {
  return function(key) {
    return object == null ? undefined : object[key];
  };
}

module.exports = basePropertyOf;
var arrayMap = require('./_arrayMap'),
    baseIndexOf = require('./_baseIndexOf'),
    baseIndexOfWith = require('./_baseIndexOfWith'),
    baseUnary = require('./_baseUnary'),
    copyArray = require('./_copyArray');

/** Used for built-in method references. */
var arrayProto = Array.prototype;

/** Built-in value references. */
var splice = arrayProto.splice;

/**
 * The base implementation of `_.pullAllBy` without support for iteratee
 * shorthands.
 *
 * @private
 * @param {Array} array The array to modify.
 * @param {Array} values The values to remove.
 * @param {Function} [iteratee] The iteratee invoked per element.
 * @param {Function} [comparator] The comparator invoked per element.
 * @returns {Array} Returns `array`.
 */
function basePullAll(array, values, iteratee, comparator) {
  var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
      index = -1,
      length = values.length,
      seen = array;

  if (array === values) {
    values = copyArray(values);
  }
  if (iteratee) {
    seen = arrayMap(array, baseUnary(iteratee));
  }
  while (++index < length) {
    var fromIndex = 0,
        value = values[index],
        computed = iteratee ? iteratee(value) : value;

    while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
      if (seen !== array) {
        splice.call(seen, fromIndex, 1);
      }
      splice.call(array, fromIndex, 1);
    }
  }
  return array;
}

module.exports = basePullAll;
var baseUnset = require('./_baseUnset'),
    isIndex = require('./_isIndex');

/** Used for built-in method references. */
var arrayProto = Array.prototype;

/** Built-in value references. */
var splice = arrayProto.splice;

/**
 * The base implementation of `_.pullAt` without support for individual
 * indexes or capturing the removed elements.
 *
 * @private
 * @param {Array} array The array to modify.
 * @param {number[]} indexes The indexes of elements to remove.
 * @returns {Array} Returns `array`.
 */
function basePullAt(array, indexes) {
  var length = array ? indexes.length : 0,
      lastIndex = length - 1;

  while (length--) {
    var index = indexes[length];
    if (length == lastIndex || index !== previous) {
      var previous = index;
      if (isIndex(index)) {
        splice.call(array, index, 1);
      } else {
        baseUnset(array, index);
      }
    }
  }
  return array;
}

module.exports = basePullAt;
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeFloor = Math.floor,
    nativeRandom = Math.random;

/**
 * The base implementation of `_.random` without support for returning
 * floating-point numbers.
 *
 * @private
 * @param {number} lower The lower bound.
 * @param {number} upper The upper bound.
 * @returns {number} Returns the random number.
 */
function baseRandom(lower, upper) {
  return lower + nativeFloor(nativeRandom() * (upper - lower + 1));
}

module.exports = baseRandom;
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeCeil = Math.ceil,
    nativeMax = Math.max;

/**
 * The base implementation of `_.range` and `_.rangeRight` which doesn't
 * coerce arguments.
 *
 * @private
 * @param {number} start The start of the range.
 * @param {number} end The end of the range.
 * @param {number} step The value to increment or decrement by.
 * @param {boolean} [fromRight] Specify iterating from right to left.
 * @returns {Array} Returns the range of numbers.
 */
function baseRange(start, end, step, fromRight) {
  var index = -1,
      length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),
      result = Array(length);

  while (length--) {
    result[fromRight ? length : ++index] = start;
    start += step;
  }
  return result;
}

module.exports = baseRange;
/**
 * The base implementation of `_.reduce` and `_.reduceRight`, without support
 * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
 *
 * @private
 * @param {Array|Object} collection The collection to iterate over.
 * @param {Function} iteratee The function invoked per iteration.
 * @param {*} accumulator The initial value.
 * @param {boolean} initAccum Specify using the first or last element of
 *  `collection` as the initial value.
 * @param {Function} eachFunc The function to iterate over `collection`.
 * @returns {*} Returns the accumulated value.
 */
function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
  eachFunc(collection, function(value, index, collection) {
    accumulator = initAccum
      ? (initAccum = false, value)
      : iteratee(accumulator, value, index, collection);
  });
  return accumulator;
}

module.exports = baseReduce;
/** Used as references for various `Number` constants. */
var MAX_SAFE_INTEGER = 9007199254740991;

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeFloor = Math.floor;

/**
 * The base implementation of `_.repeat` which doesn't coerce arguments.
 *
 * @private
 * @param {string} string The string to repeat.
 * @param {number} n The number of times to repeat the string.
 * @returns {string} Returns the repeated string.
 */
function baseRepeat(string, n) {
  var result = '';
  if (!string || n < 1 || n > MAX_SAFE_INTEGER) {
    return result;
  }
  // Leverage the exponentiation by squaring algorithm for a faster repeat.
  // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.
  do {
    if (n % 2) {
      result += string;
    }
    n = nativeFloor(n / 2);
    if (n) {
      string += string;
    }
  } while (n);

  return result;
}

module.exports = baseRepeat;
var identity = require('./identity'),
    overRest = require('./_overRest'),
    setToString = require('./_setToString');

/**
 * The base implementation of `_.rest` which doesn't validate or coerce arguments.
 *
 * @private
 * @param {Function} func The function to apply a rest parameter to.
 * @param {number} [start=func.length-1] The start position of the rest parameter.
 * @returns {Function} Returns the new function.
 */
function baseRest(func, start) {
  return setToString(overRest(func, start, identity), func + '');
}

module.exports = baseRest;
var arraySample = require('./_arraySample'),
    values = require('./values');

/**
 * The base implementation of `_.sample`.
 *
 * @private
 * @param {Array|Object} collection The collection to sample.
 * @returns {*} Returns the random element.
 */
function baseSample(collection) {
  return arraySample(values(collection));
}

module.exports = baseSample;
var baseClamp = require('./_baseClamp'),
    shuffleSelf = require('./_shuffleSelf'),
    values = require('./values');

/**
 * The base implementation of `_.sampleSize` without param guards.
 *
 * @private
 * @param {Array|Object} collection The collection to sample.
 * @param {number} n The number of elements to sample.
 * @returns {Array} Returns the random elements.
 */
function baseSampleSize(collection, n) {
  var array = values(collection);
  return shuffleSelf(array, baseClamp(n, 0, array.length));
}

module.exports = baseSampleSize;
var assignValue = require('./_assignValue'),
    castPath = require('./_castPath'),
    isIndex = require('./_isIndex'),
    isObject = require('./isObject'),
    toKey = require('./_toKey');

/**
 * The base implementation of `_.set`.
 *
 * @private
 * @param {Object} object The object to modify.
 * @param {Array|string} path The path of the property to set.
 * @param {*} value The value to set.
 * @param {Function} [customizer] The function to customize path creation.
 * @returns {Object} Returns `object`.
 */
function baseSet(object, path, value, customizer) {
  if (!isObject(object)) {
    return object;
  }
  path = castPath(path, object);

  var index = -1,
      length = path.length,
      lastIndex = length - 1,
      nested = object;

  while (nested != null && ++index < length) {
    var key = toKey(path[index]),
        newValue = value;

    if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
      return object;
    }

    if (index != lastIndex) {
      var objValue = nested[key];
      newValue = customizer ? customizer(objValue, key, nested) : undefined;
      if (newValue === undefined) {
        newValue = isObject(objValue)
          ? objValue
          : (isIndex(path[index + 1]) ? [] : {});
      }
    }
    assignValue(nested, key, newValue);
    nested = nested[key];
  }
  return object;
}

module.exports = baseSet;
var identity = require('./identity'),
    metaMap = require('./_metaMap');

/**
 * The base implementation of `setData` without support for hot loop shorting.
 *
 * @private
 * @param {Function} func The function to associate metadata with.
 * @param {*} data The metadata.
 * @returns {Function} Returns `func`.
 */
var baseSetData = !metaMap ? identity : function(func, data) {
  metaMap.set(func, data);
  return func;
};

module.exports = baseSetData;
var constant = require('./constant'),
    defineProperty = require('./_defineProperty'),
    identity = require('./identity');

/**
 * The base implementation of `setToString` without support for hot loop shorting.
 *
 * @private
 * @param {Function} func The function to modify.
 * @param {Function} string The `toString` result.
 * @returns {Function} Returns `func`.
 */
var baseSetToString = !defineProperty ? identity : function(func, string) {
  return defineProperty(func, 'toString', {
    'configurable': true,
    'enumerable': false,
    'value': constant(string),
    'writable': true
  });
};

module.exports = baseSetToString;
var shuffleSelf = require('./_shuffleSelf'),
    values = require('./values');

/**
 * The base implementation of `_.shuffle`.
 *
 * @private
 * @param {Array|Object} collection The collection to shuffle.
 * @returns {Array} Returns the new shuffled array.
 */
function baseShuffle(collection) {
  return shuffleSelf(values(collection));
}

module.exports = baseShuffle;
/**
 * The base implementation of `_.slice` without an iteratee call guard.
 *
 * @private
 * @param {Array} array The array to slice.
 * @param {number} [start=0] The start position.
 * @param {number} [end=array.length] The end position.
 * @returns {Array} Returns the slice of `array`.
 */
function baseSlice(array, start, end) {
  var index = -1,
      length = array.length;

  if (start < 0) {
    start = -start > length ? 0 : (length + start);
  }
  end = end > length ? length : end;
  if (end < 0) {
    end += length;
  }
  length = start > end ? 0 : ((end - start) >>> 0);
  start >>>= 0;

  var result = Array(length);
  while (++index < length) {
    result[index] = array[index + start];
  }
  return result;
}

module.exports = baseSlice;
var baseEach = require('./_baseEach');

/**
 * The base implementation of `_.some` without support for iteratee shorthands.
 *
 * @private
 * @param {Array|Object} collection The collection to iterate over.
 * @param {Function} predicate The function invoked per iteration.
 * @returns {boolean} Returns `true` if any element passes the predicate check,
 *  else `false`.
 */
function baseSome(collection, predicate) {
  var result;

  baseEach(collection, function(value, index, collection) {
    result = predicate(value, index, collection);
    return !result;
  });
  return !!result;
}

module.exports = baseSome;
/**
 * The base implementation of `_.sortBy` which uses `comparer` to define the
 * sort order of `array` and replaces criteria objects with their corresponding
 * values.
 *
 * @private
 * @param {Array} array The array to sort.
 * @param {Function} comparer The function to define sort order.
 * @returns {Array} Returns `array`.
 */
function baseSortBy(array, comparer) {
  var length = array.length;

  array.sort(comparer);
  while (length--) {
    array[length] = array[length].value;
  }
  return array;
}

module.exports = baseSortBy;
var baseSortedIndexBy = require('./_baseSortedIndexBy'),
    identity = require('./identity'),
    isSymbol = require('./isSymbol');

/** Used as references for the maximum length and index of an array. */
var MAX_ARRAY_LENGTH = 4294967295,
    HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;

/**
 * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which
 * performs a binary search of `array` to determine the index at which `value`
 * should be inserted into `array` in order to maintain its sort order.
 *
 * @private
 * @param {Array} array The sorted array to inspect.
 * @param {*} value The value to evaluate.
 * @param {boolean} [retHighest] Specify returning the highest qualified index.
 * @returns {number} Returns the index at which `value` should be inserted
 *  into `array`.
 */
function baseSortedIndex(array, value, retHighest) {
  var low = 0,
      high = array == null ? low : array.length;

  if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
    while (low < high) {
      var mid = (low + high) >>> 1,
          computed = array[mid];

      if (computed !== null && !isSymbol(computed) &&
          (retHighest ? (computed <= value) : (computed < value))) {
        low = mid + 1;
      } else {
        high = mid;
      }
    }
    return high;
  }
  return baseSortedIndexBy(array, value, identity, retHighest);
}

module.exports = baseSortedIndex;
var isSymbol = require('./isSymbol');

/** Used as references for the maximum length and index of an array. */
var MAX_ARRAY_LENGTH = 4294967295,
    MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1;

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeFloor = Math.floor,
    nativeMin = Math.min;

/**
 * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`
 * which invokes `iteratee` for `value` and each element of `array` to compute
 * their sort ranking. The iteratee is invoked with one argument; (value).
 *
 * @private
 * @param {Array} array The sorted array to inspect.
 * @param {*} value The value to evaluate.
 * @param {Function} iteratee The iteratee invoked per element.
 * @param {boolean} [retHighest] Specify returning the highest qualified index.
 * @returns {number} Returns the index at which `value` should be inserted
 *  into `array`.
 */
function baseSortedIndexBy(array, value, iteratee, retHighest) {
  var low = 0,
      high = array == null ? 0 : array.length;
  if (high === 0) {
    return 0;
  }

  value = iteratee(value);
  var valIsNaN = value !== value,
      valIsNull = value === null,
      valIsSymbol = isSymbol(value),
      valIsUndefined = value === undefined;

  while (low < high) {
    var mid = nativeFloor((low + high) / 2),
        computed = iteratee(array[mid]),
        othIsDefined = computed !== undefined,
        othIsNull = computed === null,
        othIsReflexive = computed === computed,
        othIsSymbol = isSymbol(computed);

    if (valIsNaN) {
      var setLow = retHighest || othIsReflexive;
    } else if (valIsUndefined) {
      setLow = othIsReflexive && (retHighest || othIsDefined);
    } else if (valIsNull) {
      setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);
    } else if (valIsSymbol) {
      setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);
    } else if (othIsNull || othIsSymbol) {
      setLow = false;
    } else {
      setLow = retHighest ? (computed <= value) : (computed < value);
    }
    if (setLow) {
      low = mid + 1;
    } else {
      high = mid;
    }
  }
  return nativeMin(high, MAX_ARRAY_INDEX);
}

module.exports = baseSortedIndexBy;
var eq = require('./eq');

/**
 * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without
 * support for iteratee shorthands.
 *
 * @private
 * @param {Array} array The array to inspect.
 * @param {Function} [iteratee] The iteratee invoked per element.
 * @returns {Array} Returns the new duplicate free array.
 */
function baseSortedUniq(array, iteratee) {
  var index = -1,
      length = array.length,
      resIndex = 0,
      result = [];

  while (++index < length) {
    var value = array[index],
        computed = iteratee ? iteratee(value) : value;

    if (!index || !eq(computed, seen)) {
      var seen = computed;
      result[resIndex++] = value === 0 ? 0 : value;
    }
  }
  return result;
}

module.exports = baseSortedUniq;
/**
 * The base implementation of `_.sum` and `_.sumBy` without support for
 * iteratee shorthands.
 *
 * @private
 * @param {Array} array The array to iterate over.
 * @param {Function} iteratee The function invoked per iteration.
 * @returns {number} Returns the sum.
 */
function baseSum(array, iteratee) {
  var result,
      index = -1,
      length = array.length;

  while (++index < length) {
    var current = iteratee(array[index]);
    if (current !== undefined) {
      result = result === undefined ? current : (result + current);
    }
  }
  return result;
}

module.exports = baseSum;
/**
 * The base implementation of `_.times` without support for iteratee shorthands
 * or max array length checks.
 *
 * @private
 * @param {number} n The number of times to invoke `iteratee`.
 * @param {Function} iteratee The function invoked per iteration.
 * @returns {Array} Returns the array of results.
 */
function baseTimes(n, iteratee) {
  var index = -1,
      result = Array(n);

  while (++index < n) {
    result[index] = iteratee(index);
  }
  return result;
}

module.exports = baseTimes;
var isSymbol = require('./isSymbol');

/** Used as references for various `Number` constants. */
var NAN = 0 / 0;

/**
 * The base implementation of `_.toNumber` which doesn't ensure correct
 * conversions of binary, hexadecimal, or octal string values.
 *
 * @private
 * @param {*} value The value to process.
 * @returns {number} Returns the number.
 */
function baseToNumber(value) {
  if (typeof value == 'number') {
    return value;
  }
  if (isSymbol(value)) {
    return NAN;
  }
  return +value;
}

module.exports = baseToNumber;
var arrayMap = require('./_arrayMap');

/**
 * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
 * of key-value pairs for `object` corresponding to the property names of `props`.
 *
 * @private
 * @param {Object} object The object to query.
 * @param {Array} props The property names to get values for.
 * @returns {Object} Returns the key-value pairs.
 */
function baseToPairs(object, props) {
  return arrayMap(props, function(key) {
    return [key, object[key]];
  });
}

module.exports = baseToPairs;
var Symbol = require('./_Symbol'),
    arrayMap = require('./_arrayMap'),
    isArray = require('./isArray'),
    isSymbol = require('./isSymbol');

/** Used as references for various `Number` constants. */
var INFINITY = 1 / 0;

/** Used to convert symbols to primitives and strings. */
var symbolProto = Symbol ? Symbol.prototype : undefined,
    symbolToString = symbolProto ? symbolProto.toString : undefined;

/**
 * The base implementation of `_.toString` which doesn't convert nullish
 * values to empty strings.
 *
 * @private
 * @param {*} value The value to process.
 * @returns {string} Returns the string.
 */
function baseToString(value) {
  // Exit early for strings to avoid a performance hit in some environments.
  if (typeof value == 'string') {
    return value;
  }
  if (isArray(value)) {
    // Recursively convert values (susceptible to call stack limits).
    return arrayMap(value, baseToString) + '';
  }
  if (isSymbol(value)) {
    return symbolToString ? symbolToString.call(value) : '';
  }
  var result = (value + '');
  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
}

module.exports = baseToString;
var trimmedEndIndex = require('./_trimmedEndIndex');

/** Used to match leading whitespace. */
var reTrimStart = /^\s+/;

/**
 * The base implementation of `_.trim`.
 *
 * @private
 * @param {string} string The string to trim.
 * @returns {string} Returns the trimmed string.
 */
function baseTrim(string) {
  return string
    ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')
    : string;
}

module.exports = baseTrim;
/**
 * The base implementation of `_.unary` without support for storing metadata.
 *
 * @private
 * @param {Function} func The function to cap arguments for.
 * @returns {Function} Returns the new capped function.
 */
function baseUnary(func) {
  return function(value) {
    return func(value);
  };
}

module.exports = baseUnary;
var SetCache = require('./_SetCache'),
    arrayIncludes = require('./_arrayIncludes'),
    arrayIncludesWith = require('./_arrayIncludesWith'),
    cacheHas = require('./_cacheHas'),
    createSet = require('./_createSet'),
    setToArray = require('./_setToArray');

/** Used as the size to enable large array optimizations. */
var LARGE_ARRAY_SIZE = 200;

/**
 * The base implementation of `_.uniqBy` without support for iteratee shorthands.
 *
 * @private
 * @param {Array} array The array to inspect.
 * @param {Function} [iteratee] The iteratee invoked per element.
 * @param {Function} [comparator] The comparator invoked per element.
 * @returns {Array} Returns the new duplicate free array.
 */
function baseUniq(array, iteratee, comparator) {
  var index = -1,
      includes = arrayIncludes,
      length = array.length,
      isCommon = true,
      result = [],
      seen = result;

  if (comparator) {
    isCommon = false;
    includes = arrayIncludesWith;
  }
  else if (length >= LARGE_ARRAY_SIZE) {
    var set = iteratee ? null : createSet(array);
    if (set) {
      return setToArray(set);
    }
    isCommon = false;
    includes = cacheHas;
    seen = new SetCache;
  }
  else {
    seen = iteratee ? [] : result;
  }
  outer:
  while (++index < length) {
    var value = array[index],
        computed = iteratee ? iteratee(value) : value;

    value = (comparator || value !== 0) ? value : 0;
    if (isCommon && computed === computed) {
      var seenIndex = seen.length;
      while (seenIndex--) {
        if (seen[seenIndex] === computed) {
          continue outer;
        }
      }
      if (iteratee) {
        seen.push(computed);
      }
      result.push(value);
    }
    else if (!includes(seen, computed, comparator)) {
      if (seen !== result) {
        seen.push(computed);
      }
      result.push(value);
    }
  }
  return result;
}

module.exports = baseUniq;
var castPath = require('./_castPath'),
    last = require('./last'),
    parent = require('./_parent'),
    toKey = require('./_toKey');

/**
 * The base implementation of `_.unset`.
 *
 * @private
 * @param {Object} object The object to modify.
 * @param {Array|string} path The property path to unset.
 * @returns {boolean} Returns `true` if the property is deleted, else `false`.
 */
function baseUnset(object, path) {
  path = castPath(path, object);
  object = parent(object, path);
  return object == null || delete object[toKey(last(path))];
}

module.exports = baseUnset;
var baseGet = require('./_baseGet'),
    baseSet = require('./_baseSet');

/**
 * The base implementation of `_.update`.
 *
 * @private
 * @param {Object} object The object to modify.
 * @param {Array|string} path The path of the property to update.
 * @param {Function} updater The function to produce the updated value.
 * @param {Function} [customizer] The function to customize path creation.
 * @returns {Object} Returns `object`.
 */
function baseUpdate(object, path, updater, customizer) {
  return baseSet(object, path, updater(baseGet(object, path)), customizer);
}

module.exports = baseUpdate;
var arrayMap = require('./_arrayMap');

/**
 * The base implementation of `_.values` and `_.valuesIn` which creates an
 * array of `object` property values corresponding to the property names
 * of `props`.
 *
 * @private
 * @param {Object} object The object to query.
 * @param {Array} props The property names to get values for.
 * @returns {Object} Returns the array of property values.
 */
function baseValues(object, props) {
  return arrayMap(props, function(key) {
    return object[key];
  });
}

module.exports = baseValues;
var baseSlice = require('./_baseSlice');

/**
 * The base implementation of methods like `_.dropWhile` and `_.takeWhile`
 * without support for iteratee shorthands.
 *
 * @private
 * @param {Array} array The array to query.
 * @param {Function} predicate The function invoked per iteration.
 * @param {boolean} [isDrop] Specify dropping elements instead of taking them.
 * @param {boolean} [fromRight] Specify iterating from right to left.
 * @returns {Array} Returns the slice of `array`.
 */
function baseWhile(array, predicate, isDrop, fromRight) {
  var length = array.length,
      index = fromRight ? length : -1;

  while ((fromRight ? index-- : ++index < length) &&
    predicate(array[index], index, array)) {}

  return isDrop
    ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
    : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));
}

module.exports = baseWhile;
var LazyWrapper = require('./_LazyWrapper'),
    arrayPush = require('./_arrayPush'),
    arrayReduce = require('./_arrayReduce');

/**
 * The base implementation of `wrapperValue` which returns the result of
 * performing a sequence of actions on the unwrapped `value`, where each
 * successive action is supplied the return value of the previous.
 *
 * @private
 * @param {*} value The unwrapped value.
 * @param {Array} actions Actions to perform to resolve the unwrapped value.
 * @returns {*} Returns the resolved value.
 */
function baseWrapperValue(value, actions) {
  var result = value;
  if (result instanceof LazyWrapper) {
    result = result.value();
  }
  return arrayReduce(actions, function(result, action) {
    return action.func.apply(action.thisArg, arrayPush([result], action.args));
  }, result);
}

module.exports = baseWrapperValue;
var baseDifference = require('./_baseDifference'),
    baseFlatten = require('./_baseFlatten'),
    baseUniq = require('./_baseUniq');

/**
 * The base implementation of methods like `_.xor`, without support for
 * iteratee shorthands, that accepts an array of arrays to inspect.
 *
 * @private
 * @param {Array} arrays The arrays to inspect.
 * @param {Function} [iteratee] The iteratee invoked per element.
 * @param {Function} [comparator] The comparator invoked per element.
 * @returns {Array} Returns the new array of values.
 */
function baseXor(arrays, iteratee, comparator) {
  var length = arrays.length;
  if (length < 2) {
    return length ? baseUniq(arrays[0]) : [];
  }
  var index = -1,
      result = Array(length);

  while (++index < length) {
    var array = arrays[index],
        othIndex = -1;

    while (++othIndex < length) {
      if (othIndex != index) {
        result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);
      }
    }
  }
  return baseUniq(baseFlatten(result, 1), iteratee, comparator);
}

module.exports = baseXor;
/**
 * This base implementation of `_.zipObject` which assigns values using `assignFunc`.
 *
 * @private
 * @param {Array} props The property identifiers.
 * @param {Array} values The property values.
 * @param {Function} assignFunc The function to assign values.
 * @returns {Object} Returns the new object.
 */
function baseZipObject(props, values, assignFunc) {
  var index = -1,
      length = props.length,
      valsLength = values.length,
      result = {};

  while (++index < length) {
    var value = index < valsLength ? values[index] : undefined;
    assignFunc(result, props[index], value);
  }
  return result;
}

module.exports = baseZipObject;
/**
 * Checks if a `cache` value for `key` exists.
 *
 * @private
 * @param {Object} cache The cache to query.
 * @param {string} key The key of the entry to check.
 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
 */
function cacheHas(cache, key) {
  return cache.has(key);
}

module.exports = cacheHas;
var isArrayLikeObject = require('./isArrayLikeObject');

/**
 * Casts `value` to an empty array if it's not an array like object.
 *
 * @private
 * @param {*} value The value to inspect.
 * @returns {Array|Object} Returns the cast array-like object.
 */
function castArrayLikeObject(value) {
  return isArrayLikeObject(value) ? value : [];
}

module.exports = castArrayLikeObject;
var identity = require('./identity');

/**
 * Casts `value` to `identity` if it's not a function.
 *
 * @private
 * @param {*} value The value to inspect.
 * @returns {Function} Returns cast function.
 */
function castFunction(value) {
  return typeof value == 'function' ? value : identity;
}

module.exports = castFunction;
var isArray = require('./isArray'),
    isKey = require('./_isKey'),
    stringToPath = require('./_stringToPath'),
    toString = require('./toString');

/**
 * Casts `value` to a path array if it's not one.
 *
 * @private
 * @param {*} value The value to inspect.
 * @param {Object} [object] The object to query keys on.
 * @returns {Array} Returns the cast property path array.
 */
function castPath(value, object) {
  if (isArray(value)) {
    return value;
  }
  return isKey(value, object) ? [value] : stringToPath(toString(value));
}

module.exports = castPath;
var baseRest = require('./_baseRest');

/**
 * A `baseRest` alias which can be replaced with `identity` by module
 * replacement plugins.
 *
 * @private
 * @type {Function}
 * @param {Function} func The function to apply a rest parameter to.
 * @returns {Function} Returns the new function.
 */
var castRest = baseRest;

module.exports = castRest;
var baseSlice = require('./_baseSlice');

/**
 * Casts `array` to a slice if it's needed.
 *
 * @private
 * @param {Array} array The array to inspect.
 * @param {number} start The start position.
 * @param {number} [end=array.length] The end position.
 * @returns {Array} Returns the cast slice.
 */
function castSlice(array, start, end) {
  var length = array.length;
  end = end === undefined ? length : end;
  return (!start && end >= length) ? array : baseSlice(array, start, end);
}

module.exports = castSlice;
var baseIndexOf = require('./_baseIndexOf');

/**
 * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol
 * that is not found in the character symbols.
 *
 * @private
 * @param {Array} strSymbols The string symbols to inspect.
 * @param {Array} chrSymbols The character symbols to find.
 * @returns {number} Returns the index of the last unmatched string symbol.
 */
function charsEndIndex(strSymbols, chrSymbols) {
  var index = strSymbols.length;

  while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
  return index;
}

module.exports = charsEndIndex;
var baseIndexOf = require('./_baseIndexOf');

/**
 * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol
 * that is not found in the character symbols.
 *
 * @private
 * @param {Array} strSymbols The string symbols to inspect.
 * @param {Array} chrSymbols The character symbols to find.
 * @returns {number} Returns the index of the first unmatched string symbol.
 */
function charsStartIndex(strSymbols, chrSymbols) {
  var index = -1,
      length = strSymbols.length;

  while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
  return index;
}

module.exports = charsStartIndex;
var Uint8Array = require('./_Uint8Array');

/**
 * Creates a clone of `arrayBuffer`.
 *
 * @private
 * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
 * @returns {ArrayBuffer} Returns the cloned array buffer.
 */
function cloneArrayBuffer(arrayBuffer) {
  var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
  new Uint8Array(result).set(new Uint8Array(arrayBuffer));
  return result;
}

module.exports = cloneArrayBuffer;
var root = require('./_root');

/** Detect free variable `exports`. */
var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;

/** Detect free variable `module`. */
var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;

/** Detect the popular CommonJS extension `module.exports`. */
var moduleExports = freeModule && freeModule.exports === freeExports;

/** Built-in value references. */
var Buffer = moduleExports ? root.Buffer : undefined,
    allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;

/**
 * Creates a clone of  `buffer`.
 *
 * @private
 * @param {Buffer} buffer The buffer to clone.
 * @param {boolean} [isDeep] Specify a deep clone.
 * @returns {Buffer} Returns the cloned buffer.
 */
function cloneBuffer(buffer, isDeep) {
  if (isDeep) {
    return buffer.slice();
  }
  var length = buffer.length,
      result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);

  buffer.copy(result);
  return result;
}

module.exports = cloneBuffer;
var cloneArrayBuffer = require('./_cloneArrayBuffer');

/**
 * Creates a clone of `dataView`.
 *
 * @private
 * @param {Object} dataView The data view to clone.
 * @param {boolean} [isDeep] Specify a deep clone.
 * @returns {Object} Returns the cloned data view.
 */
function cloneDataView(dataView, isDeep) {
  var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
  return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
}

module.exports = cloneDataView;
/** Used to match `RegExp` flags from their coerced string values. */
var reFlags = /\w*$/;

/**
 * Creates a clone of `regexp`.
 *
 * @private
 * @param {Object} regexp The regexp to clone.
 * @returns {Object} Returns the cloned regexp.
 */
function cloneRegExp(regexp) {
  var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
  result.lastIndex = regexp.lastIndex;
  return result;
}

module.exports = cloneRegExp;
var Symbol = require('./_Symbol');

/** Used to convert symbols to primitives and strings. */
var symbolProto = Symbol ? Symbol.prototype : undefined,
    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;

/**
 * Creates a clone of the `symbol` object.
 *
 * @private
 * @param {Object} symbol The symbol object to clone.
 * @returns {Object} Returns the cloned symbol object.
 */
function cloneSymbol(symbol) {
  return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
}

module.exports = cloneSymbol;
var cloneArrayBuffer = require('./_cloneArrayBuffer');

/**
 * Creates a clone of `typedArray`.
 *
 * @private
 * @param {Object} typedArray The typed array to clone.
 * @param {boolean} [isDeep] Specify a deep clone.
 * @returns {Object} Returns the cloned typed array.
 */
function cloneTypedArray(typedArray, isDeep) {
  var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
  return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
}

module.exports = cloneTypedArray;
var isSymbol = require('./isSymbol');

/**
 * Compares values to sort them in ascending order.
 *
 * @private
 * @param {*} value The value to compare.
 * @param {*} other The other value to compare.
 * @returns {number} Returns the sort order indicator for `value`.
 */
function compareAscending(value, other) {
  if (value !== other) {
    var valIsDefined = value !== undefined,
        valIsNull = value === null,
        valIsReflexive = value === value,
        valIsSymbol = isSymbol(value);

    var othIsDefined = other !== undefined,
        othIsNull = other === null,
        othIsReflexive = other === other,
        othIsSymbol = isSymbol(other);

    if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||
        (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||
        (valIsNull && othIsDefined && othIsReflexive) ||
        (!valIsDefined && othIsReflexive) ||
        !valIsReflexive) {
      return 1;
    }
    if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||
        (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||
        (othIsNull && valIsDefined && valIsReflexive) ||
        (!othIsDefined && valIsReflexive) ||
        !othIsReflexive) {
      return -1;
    }
  }
  return 0;
}

module.exports = compareAscending;
var compareAscending = require('./_compareAscending');

/**
 * Used by `_.orderBy` to compare multiple properties of a value to another
 * and stable sort them.
 *
 * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,
 * specify an order of "desc" for descending or "asc" for ascending sort order
 * of corresponding values.
 *
 * @private
 * @param {Object} object The object to compare.
 * @param {Object} other The other object to compare.
 * @param {boolean[]|string[]} orders The order to sort by for each property.
 * @returns {number} Returns the sort order indicator for `object`.
 */
function compareMultiple(object, other, orders) {
  var index = -1,
      objCriteria = object.criteria,
      othCriteria = other.criteria,
      length = objCriteria.length,
      ordersLength = orders.length;

  while (++index < length) {
    var result = compareAscending(objCriteria[index], othCriteria[index]);
    if (result) {
      if (index >= ordersLength) {
        return result;
      }
      var order = orders[index];
      return result * (order == 'desc' ? -1 : 1);
    }
  }
  // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
  // that causes it, under certain circumstances, to provide the same value for
  // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247
  // for more details.
  //
  // This also ensures a stable sort in V8 and other engines.
  // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.
  return object.index - other.index;
}

module.exports = compareMultiple;
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max;

/**
 * Creates an array that is the composition of partially applied arguments,
 * placeholders, and provided arguments into a single array of arguments.
 *
 * @private
 * @param {Array} args The provided arguments.
 * @param {Array} partials The arguments to prepend to those provided.
 * @param {Array} holders The `partials` placeholder indexes.
 * @params {boolean} [isCurried] Specify composing for a curried function.
 * @returns {Array} Returns the new array of composed arguments.
 */
function composeArgs(args, partials, holders, isCurried) {
  var argsIndex = -1,
      argsLength = args.length,
      holdersLength = holders.length,
      leftIndex = -1,
      leftLength = partials.length,
      rangeLength = nativeMax(argsLength - holdersLength, 0),
      result = Array(leftLength + rangeLength),
      isUncurried = !isCurried;

  while (++leftIndex < leftLength) {
    result[leftIndex] = partials[leftIndex];
  }
  while (++argsIndex < holdersLength) {
    if (isUncurried || argsIndex < argsLength) {
      result[holders[argsIndex]] = args[argsIndex];
    }
  }
  while (rangeLength--) {
    result[leftIndex++] = args[argsIndex++];
  }
  return result;
}

module.exports = composeArgs;
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max;

/**
 * This function is like `composeArgs` except that the arguments composition
 * is tailored for `_.partialRight`.
 *
 * @private
 * @param {Array} args The provided arguments.
 * @param {Array} partials The arguments to append to those provided.
 * @param {Array} holders The `partials` placeholder indexes.
 * @params {boolean} [isCurried] Specify composing for a curried function.
 * @returns {Array} Returns the new array of composed arguments.
 */
function composeArgsRight(args, partials, holders, isCurried) {
  var argsIndex = -1,
      argsLength = args.length,
      holdersIndex = -1,
      holdersLength = holders.length,
      rightIndex = -1,
      rightLength = partials.length,
      rangeLength = nativeMax(argsLength - holdersLength, 0),
      result = Array(rangeLength + rightLength),
      isUncurried = !isCurried;

  while (++argsIndex < rangeLength) {
    result[argsIndex] = args[argsIndex];
  }
  var offset = argsIndex;
  while (++rightIndex < rightLength) {
    result[offset + rightIndex] = partials[rightIndex];
  }
  while (++holdersIndex < holdersLength) {
    if (isUncurried || argsIndex < argsLength) {
      result[offset + holders[holdersIndex]] = args[argsIndex++];
    }
  }
  return result;
}

module.exports = composeArgsRight;
/**
 * Copies the values of `source` to `array`.
 *
 * @private
 * @param {Array} source The array to copy values from.
 * @param {Array} [array=[]] The array to copy values to.
 * @returns {Array} Returns `array`.
 */
function copyArray(source, array) {
  var index = -1,
      length = source.length;

  array || (array = Array(length));
  while (++index < length) {
    array[index] = source[index];
  }
  return array;
}

module.exports = copyArray;
var assignValue = require('./_assignValue'),
    baseAssignValue = require('./_baseAssignValue');

/**
 * Copies properties of `source` to `object`.
 *
 * @private
 * @param {Object} source The object to copy properties from.
 * @param {Array} props The property identifiers to copy.
 * @param {Object} [object={}] The object to copy properties to.
 * @param {Function} [customizer] The function to customize copied values.
 * @returns {Object} Returns `object`.
 */
function copyObject(source, props, object, customizer) {
  var isNew = !object;
  object || (object = {});

  var index = -1,
      length = props.length;

  while (++index < length) {
    var key = props[index];

    var newValue = customizer
      ? customizer(object[key], source[key], key, object, source)
      : undefined;

    if (newValue === undefined) {
      newValue = source[key];
    }
    if (isNew) {
      baseAssignValue(object, key, newValue);
    } else {
      assignValue(object, key, newValue);
    }
  }
  return object;
}

module.exports = copyObject;
var copyObject = require('./_copyObject'),
    getSymbols = require('./_getSymbols');

/**
 * Copies own symbols of `source` to `object`.
 *
 * @private
 * @param {Object} source The object to copy symbols from.
 * @param {Object} [object={}] The object to copy symbols to.
 * @returns {Object} Returns `object`.
 */
function copySymbols(source, object) {
  return copyObject(source, getSymbols(source), object);
}

module.exports = copySymbols;
var copyObject = require('./_copyObject'),
    getSymbolsIn = require('./_getSymbolsIn');

/**
 * Copies own and inherited symbols of `source` to `object`.
 *
 * @private
 * @param {Object} source The object to copy symbols from.
 * @param {Object} [object={}] The object to copy symbols to.
 * @returns {Object} Returns `object`.
 */
function copySymbolsIn(source, object) {
  return copyObject(source, getSymbolsIn(source), object);
}

module.exports = copySymbolsIn;
var root = require('./_root');

/** Used to detect overreaching core-js shims. */
var coreJsData = root['__core-js_shared__'];

module.exports = coreJsData;
/**
 * Gets the number of `placeholder` occurrences in `array`.
 *
 * @private
 * @param {Array} array The array to inspect.
 * @param {*} placeholder The placeholder to search for.
 * @returns {number} Returns the placeholder count.
 */
function countHolders(array, placeholder) {
  var length = array.length,
      result = 0;

  while (length--) {
    if (array[length] === placeholder) {
      ++result;
    }
  }
  return result;
}

module.exports = countHolders;
var arrayAggregator = require('./_arrayAggregator'),
    baseAggregator = require('./_baseAggregator'),
    baseIteratee = require('./_baseIteratee'),
    isArray = require('./isArray');

/**
 * Creates a function like `_.groupBy`.
 *
 * @private
 * @param {Function} setter The function to set accumulator values.
 * @param {Function} [initializer] The accumulator object initializer.
 * @returns {Function} Returns the new aggregator function.
 */
function createAggregator(setter, initializer) {
  return function(collection, iteratee) {
    var func = isArray(collection) ? arrayAggregator : baseAggregator,
        accumulator = initializer ? initializer() : {};

    return func(collection, setter, baseIteratee(iteratee, 2), accumulator);
  };
}

module.exports = createAggregator;
var baseRest = require('./_baseRest'),
    isIterateeCall = require('./_isIterateeCall');

/**
 * Creates a function like `_.assign`.
 *
 * @private
 * @param {Function} assigner The function to assign values.
 * @returns {Function} Returns the new assigner function.
 */
function createAssigner(assigner) {
  return baseRest(function(object, sources) {
    var index = -1,
        length = sources.length,
        customizer = length > 1 ? sources[length - 1] : undefined,
        guard = length > 2 ? sources[2] : undefined;

    customizer = (assigner.length > 3 && typeof customizer == 'function')
      ? (length--, customizer)
      : undefined;

    if (guard && isIterateeCall(sources[0], sources[1], guard)) {
      customizer = length < 3 ? undefined : customizer;
      length = 1;
    }
    object = Object(object);
    while (++index < length) {
      var source = sources[index];
      if (source) {
        assigner(object, source, index, customizer);
      }
    }
    return object;
  });
}

module.exports = createAssigner;
var isArrayLike = require('./isArrayLike');

/**
 * Creates a `baseEach` or `baseEachRight` function.
 *
 * @private
 * @param {Function} eachFunc The function to iterate over a collection.
 * @param {boolean} [fromRight] Specify iterating from right to left.
 * @returns {Function} Returns the new base function.
 */
function createBaseEach(eachFunc, fromRight) {
  return function(collection, iteratee) {
    if (collection == null) {
      return collection;
    }
    if (!isArrayLike(collection)) {
      return eachFunc(collection, iteratee);
    }
    var length = collection.length,
        index = fromRight ? length : -1,
        iterable = Object(collection);

    while ((fromRight ? index-- : ++index < length)) {
      if (iteratee(iterable[index], index, iterable) === false) {
        break;
      }
    }
    return collection;
  };
}

module.exports = createBaseEach;
/**
 * Creates a base function for methods like `_.forIn` and `_.forOwn`.
 *
 * @private
 * @param {boolean} [fromRight] Specify iterating from right to left.
 * @returns {Function} Returns the new base function.
 */
function createBaseFor(fromRight) {
  return function(object, iteratee, keysFunc) {
    var index = -1,
        iterable = Object(object),
        props = keysFunc(object),
        length = props.length;

    while (length--) {
      var key = props[fromRight ? length : ++index];
      if (iteratee(iterable[key], key, iterable) === false) {
        break;
      }
    }
    return object;
  };
}

module.exports = createBaseFor;
var createCtor = require('./_createCtor'),
    root = require('./_root');

/** Used to compose bitmasks for function metadata. */
var WRAP_BIND_FLAG = 1;

/**
 * Creates a function that wraps `func` to invoke it with the optional `this`
 * binding of `thisArg`.
 *
 * @private
 * @param {Function} func The function to wrap.
 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
 * @param {*} [thisArg] The `this` binding of `func`.
 * @returns {Function} Returns the new wrapped function.
 */
function createBind(func, bitmask, thisArg) {
  var isBind = bitmask & WRAP_BIND_FLAG,
      Ctor = createCtor(func);

  function wrapper() {
    var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
    return fn.apply(isBind ? thisArg : this, arguments);
  }
  return wrapper;
}

module.exports = createBind;
var castSlice = require('./_castSlice'),
    hasUnicode = require('./_hasUnicode'),
    stringToArray = require('./_stringToArray'),
    toString = require('./toString');

/**
 * Creates a function like `_.lowerFirst`.
 *
 * @private
 * @param {string} methodName The name of the `String` case method to use.
 * @returns {Function} Returns the new case function.
 */
function createCaseFirst(methodName) {
  return function(string) {
    string = toString(string);

    var strSymbols = hasUnicode(string)
      ? stringToArray(string)
      : undefined;

    var chr = strSymbols
      ? strSymbols[0]
      : string.charAt(0);

    var trailing = strSymbols
      ? castSlice(strSymbols, 1).join('')
      : string.slice(1);

    return chr[methodName]() + trailing;
  };
}

module.exports = createCaseFirst;
var arrayReduce = require('./_arrayReduce'),
    deburr = require('./deburr'),
    words = require('./words');

/** Used to compose unicode capture groups. */
var rsApos = "['\u2019]";

/** Used to match apostrophes. */
var reApos = RegExp(rsApos, 'g');

/**
 * Creates a function like `_.camelCase`.
 *
 * @private
 * @param {Function} callback The function to combine each word.
 * @returns {Function} Returns the new compounder function.
 */
function createCompounder(callback) {
  return function(string) {
    return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');
  };
}

module.exports = createCompounder;
var baseCreate = require('./_baseCreate'),
    isObject = require('./isObject');

/**
 * Creates a function that produces an instance of `Ctor` regardless of
 * whether it was invoked as part of a `new` expression or by `call` or `apply`.
 *
 * @private
 * @param {Function} Ctor The constructor to wrap.
 * @returns {Function} Returns the new wrapped function.
 */
function createCtor(Ctor) {
  return function() {
    // Use a `switch` statement to work with class constructors. See
    // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
    // for more details.
    var args = arguments;
    switch (args.length) {
      case 0: return new Ctor;
      case 1: return new Ctor(args[0]);
      case 2: return new Ctor(args[0], args[1]);
      case 3: return new Ctor(args[0], args[1], args[2]);
      case 4: return new Ctor(args[0], args[1], args[2], args[3]);
      case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
      case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
      case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
    }
    var thisBinding = baseCreate(Ctor.prototype),
        result = Ctor.apply(thisBinding, args);

    // Mimic the constructor's `return` behavior.
    // See https://es5.github.io/#x13.2.2 for more details.
    return isObject(result) ? result : thisBinding;
  };
}

module.exports = createCtor;
var apply = require('./_apply'),
    createCtor = require('./_createCtor'),
    createHybrid = require('./_createHybrid'),
    createRecurry = require('./_createRecurry'),
    getHolder = require('./_getHolder'),
    replaceHolders = require('./_replaceHolders'),
    root = require('./_root');

/**
 * Creates a function that wraps `func` to enable currying.
 *
 * @private
 * @param {Function} func The function to wrap.
 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
 * @param {number} arity The arity of `func`.
 * @returns {Function} Returns the new wrapped function.
 */
function createCurry(func, bitmask, arity) {
  var Ctor = createCtor(func);

  function wrapper() {
    var length = arguments.length,
        args = Array(length),
        index = length,
        placeholder = getHolder(wrapper);

    while (index--) {
      args[index] = arguments[index];
    }
    var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
      ? []
      : replaceHolders(args, placeholder);

    length -= holders.length;
    if (length < arity) {
      return createRecurry(
        func, bitmask, createHybrid, wrapper.placeholder, undefined,
        args, holders, undefined, undefined, arity - length);
    }
    var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
    return apply(fn, this, args);
  }
  return wrapper;
}

module.exports = createCurry;
var baseIteratee = require('./_baseIteratee'),
    isArrayLike = require('./isArrayLike'),
    keys = require('./keys');

/**
 * Creates a `_.find` or `_.findLast` function.
 *
 * @private
 * @param {Function} findIndexFunc The function to find the collection index.
 * @returns {Function} Returns the new find function.
 */
function createFind(findIndexFunc) {
  return function(collection, predicate, fromIndex) {
    var iterable = Object(collection);
    if (!isArrayLike(collection)) {
      var iteratee = baseIteratee(predicate, 3);
      collection = keys(collection);
      predicate = function(key) { return iteratee(iterable[key], key, iterable); };
    }
    var index = findIndexFunc(collection, predicate, fromIndex);
    return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
  };
}

module.exports = createFind;
var LodashWrapper = require('./_LodashWrapper'),
    flatRest = require('./_flatRest'),
    getData = require('./_getData'),
    getFuncName = require('./_getFuncName'),
    isArray = require('./isArray'),
    isLaziable = require('./_isLaziable');

/** Error message constants. */
var FUNC_ERROR_TEXT = 'Expected a function';

/** Used to compose bitmasks for function metadata. */
var WRAP_CURRY_FLAG = 8,
    WRAP_PARTIAL_FLAG = 32,
    WRAP_ARY_FLAG = 128,
    WRAP_REARG_FLAG = 256;

/**
 * Creates a `_.flow` or `_.flowRight` function.
 *
 * @private
 * @param {boolean} [fromRight] Specify iterating from right to left.
 * @returns {Function} Returns the new flow function.
 */
function createFlow(fromRight) {
  return flatRest(function(funcs) {
    var length = funcs.length,
        index = length,
        prereq = LodashWrapper.prototype.thru;

    if (fromRight) {
      funcs.reverse();
    }
    while (index--) {
      var func = funcs[index];
      if (typeof func != 'function') {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      if (prereq && !wrapper && getFuncName(func) == 'wrapper') {
        var wrapper = new LodashWrapper([], true);
      }
    }
    index = wrapper ? index : length;
    while (++index < length) {
      func = funcs[index];

      var funcName = getFuncName(func),
          data = funcName == 'wrapper' ? getData(func) : undefined;

      if (data && isLaziable(data[0]) &&
            data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&
            !data[4].length && data[9] == 1
          ) {
        wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
      } else {
        wrapper = (func.length == 1 && isLaziable(func))
          ? wrapper[funcName]()
          : wrapper.thru(func);
      }
    }
    return function() {
      var args = arguments,
          value = args[0];

      if (wrapper && args.length == 1 && isArray(value)) {
        return wrapper.plant(value).value();
      }
      var index = 0,
          result = length ? funcs[index].apply(this, args) : value;

      while (++index < length) {
        result = funcs[index].call(this, result);
      }
      return result;
    };
  });
}

module.exports = createFlow;
var composeArgs = require('./_composeArgs'),
    composeArgsRight = require('./_composeArgsRight'),
    countHolders = require('./_countHolders'),
    createCtor = require('./_createCtor'),
    createRecurry = require('./_createRecurry'),
    getHolder = require('./_getHolder'),
    reorder = require('./_reorder'),
    replaceHolders = require('./_replaceHolders'),
    root = require('./_root');

/** Used to compose bitmasks for function metadata. */
var WRAP_BIND_FLAG = 1,
    WRAP_BIND_KEY_FLAG = 2,
    WRAP_CURRY_FLAG = 8,
    WRAP_CURRY_RIGHT_FLAG = 16,
    WRAP_ARY_FLAG = 128,
    WRAP_FLIP_FLAG = 512;

/**
 * Creates a function that wraps `func` to invoke it with optional `this`
 * binding of `thisArg`, partial application, and currying.
 *
 * @private
 * @param {Function|string} func The function or method name to wrap.
 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
 * @param {*} [thisArg] The `this` binding of `func`.
 * @param {Array} [partials] The arguments to prepend to those provided to
 *  the new function.
 * @param {Array} [holders] The `partials` placeholder indexes.
 * @param {Array} [partialsRight] The arguments to append to those provided
 *  to the new function.
 * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
 * @param {Array} [argPos] The argument positions of the new function.
 * @param {number} [ary] The arity cap of `func`.
 * @param {number} [arity] The arity of `func`.
 * @returns {Function} Returns the new wrapped function.
 */
function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
  var isAry = bitmask & WRAP_ARY_FLAG,
      isBind = bitmask & WRAP_BIND_FLAG,
      isBindKey = bitmask & WRAP_BIND_KEY_FLAG,
      isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),
      isFlip = bitmask & WRAP_FLIP_FLAG,
      Ctor = isBindKey ? undefined : createCtor(func);

  function wrapper() {
    var length = arguments.length,
        args = Array(length),
        index = length;

    while (index--) {
      args[index] = arguments[index];
    }
    if (isCurried) {
      var placeholder = getHolder(wrapper),
          holdersCount = countHolders(args, placeholder);
    }
    if (partials) {
      args = composeArgs(args, partials, holders, isCurried);
    }
    if (partialsRight) {
      args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
    }
    length -= holdersCount;
    if (isCurried && length < arity) {
      var newHolders = replaceHolders(args, placeholder);
      return createRecurry(
        func, bitmask, createHybrid, wrapper.placeholder, thisArg,
        args, newHolders, argPos, ary, arity - length
      );
    }
    var thisBinding = isBind ? thisArg : this,
        fn = isBindKey ? thisBinding[func] : func;

    length = args.length;
    if (argPos) {
      args = reorder(args, argPos);
    } else if (isFlip && length > 1) {
      args.reverse();
    }
    if (isAry && ary < length) {
      args.length = ary;
    }
    if (this && this !== root && this instanceof wrapper) {
      fn = Ctor || createCtor(fn);
    }
    return fn.apply(thisBinding, args);
  }
  return wrapper;
}

module.exports = createHybrid;
var baseInverter = require('./_baseInverter');

/**
 * Creates a function like `_.invertBy`.
 *
 * @private
 * @param {Function} setter The function to set accumulator values.
 * @param {Function} toIteratee The function to resolve iteratees.
 * @returns {Function} Returns the new inverter function.
 */
function createInverter(setter, toIteratee) {
  return function(object, iteratee) {
    return baseInverter(object, setter, toIteratee(iteratee), {});
  };
}

module.exports = createInverter;
var baseToNumber = require('./_baseToNumber'),
    baseToString = require('./_baseToString');

/**
 * Creates a function that performs a mathematical operation on two values.
 *
 * @private
 * @param {Function} operator The function to perform the operation.
 * @param {number} [defaultValue] The value used for `undefined` arguments.
 * @returns {Function} Returns the new mathematical operation function.
 */
function createMathOperation(operator, defaultValue) {
  return function(value, other) {
    var result;
    if (value === undefined && other === undefined) {
      return defaultValue;
    }
    if (value !== undefined) {
      result = value;
    }
    if (other !== undefined) {
      if (result === undefined) {
        return other;
      }
      if (typeof value == 'string' || typeof other == 'string') {
        value = baseToString(value);
        other = baseToString(other);
      } else {
        value = baseToNumber(value);
        other = baseToNumber(other);
      }
      result = operator(value, other);
    }
    return result;
  };
}

module.exports = createMathOperation;
var apply = require('./_apply'),
    arrayMap = require('./_arrayMap'),
    baseIteratee = require('./_baseIteratee'),
    baseRest = require('./_baseRest'),
    baseUnary = require('./_baseUnary'),
    flatRest = require('./_flatRest');

/**
 * Creates a function like `_.over`.
 *
 * @private
 * @param {Function} arrayFunc The function to iterate over iteratees.
 * @returns {Function} Returns the new over function.
 */
function createOver(arrayFunc) {
  return flatRest(function(iteratees) {
    iteratees = arrayMap(iteratees, baseUnary(baseIteratee));
    return baseRest(function(args) {
      var thisArg = this;
      return arrayFunc(iteratees, function(iteratee) {
        return apply(iteratee, thisArg, args);
      });
    });
  });
}

module.exports = createOver;
var baseRepeat = require('./_baseRepeat'),
    baseToString = require('./_baseToString'),
    castSlice = require('./_castSlice'),
    hasUnicode = require('./_hasUnicode'),
    stringSize = require('./_stringSize'),
    stringToArray = require('./_stringToArray');

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeCeil = Math.ceil;

/**
 * Creates the padding for `string` based on `length`. The `chars` string
 * is truncated if the number of characters exceeds `length`.
 *
 * @private
 * @param {number} length The padding length.
 * @param {string} [chars=' '] The string used as padding.
 * @returns {string} Returns the padding for `string`.
 */
function createPadding(length, chars) {
  chars = chars === undefined ? ' ' : baseToString(chars);

  var charsLength = chars.length;
  if (charsLength < 2) {
    return charsLength ? baseRepeat(chars, length) : chars;
  }
  var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));
  return hasUnicode(chars)
    ? castSlice(stringToArray(result), 0, length).join('')
    : result.slice(0, length);
}

module.exports = createPadding;
var apply = require('./_apply'),
    createCtor = require('./_createCtor'),
    root = require('./_root');

/** Used to compose bitmasks for function metadata. */
var WRAP_BIND_FLAG = 1;

/**
 * Creates a function that wraps `func` to invoke it with the `this` binding
 * of `thisArg` and `partials` prepended to the arguments it receives.
 *
 * @private
 * @param {Function} func The function to wrap.
 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
 * @param {*} thisArg The `this` binding of `func`.
 * @param {Array} partials The arguments to prepend to those provided to
 *  the new function.
 * @returns {Function} Returns the new wrapped function.
 */
function createPartial(func, bitmask, thisArg, partials) {
  var isBind = bitmask & WRAP_BIND_FLAG,
      Ctor = createCtor(func);

  function wrapper() {
    var argsIndex = -1,
        argsLength = arguments.length,
        leftIndex = -1,
        leftLength = partials.length,
        args = Array(leftLength + argsLength),
        fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;

    while (++leftIndex < leftLength) {
      args[leftIndex] = partials[leftIndex];
    }
    while (argsLength--) {
      args[leftIndex++] = arguments[++argsIndex];
    }
    return apply(fn, isBind ? thisArg : this, args);
  }
  return wrapper;
}

module.exports = createPartial;
var baseRange = require('./_baseRange'),
    isIterateeCall = require('./_isIterateeCall'),
    toFinite = require('./toFinite');

/**
 * Creates a `_.range` or `_.rangeRight` function.
 *
 * @private
 * @param {boolean} [fromRight] Specify iterating from right to left.
 * @returns {Function} Returns the new range function.
 */
function createRange(fromRight) {
  return function(start, end, step) {
    if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {
      end = step = undefined;
    }
    // Ensure the sign of `-0` is preserved.
    start = toFinite(start);
    if (end === undefined) {
      end = start;
      start = 0;
    } else {
      end = toFinite(end);
    }
    step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);
    return baseRange(start, end, step, fromRight);
  };
}

module.exports = createRange;
var isLaziable = require('./_isLaziable'),
    setData = require('./_setData'),
    setWrapToString = require('./_setWrapToString');

/** Used to compose bitmasks for function metadata. */
var WRAP_BIND_FLAG = 1,
    WRAP_BIND_KEY_FLAG = 2,
    WRAP_CURRY_BOUND_FLAG = 4,
    WRAP_CURRY_FLAG = 8,
    WRAP_PARTIAL_FLAG = 32,
    WRAP_PARTIAL_RIGHT_FLAG = 64;

/**
 * Creates a function that wraps `func` to continue currying.
 *
 * @private
 * @param {Function} func The function to wrap.
 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
 * @param {Function} wrapFunc The function to create the `func` wrapper.
 * @param {*} placeholder The placeholder value.
 * @param {*} [thisArg] The `this` binding of `func`.
 * @param {Array} [partials] The arguments to prepend to those provided to
 *  the new function.
 * @param {Array} [holders] The `partials` placeholder indexes.
 * @param {Array} [argPos] The argument positions of the new function.
 * @param {number} [ary] The arity cap of `func`.
 * @param {number} [arity] The arity of `func`.
 * @returns {Function} Returns the new wrapped function.
 */
function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
  var isCurry = bitmask & WRAP_CURRY_FLAG,
      newHolders = isCurry ? holders : undefined,
      newHoldersRight = isCurry ? undefined : holders,
      newPartials = isCurry ? partials : undefined,
      newPartialsRight = isCurry ? undefined : partials;

  bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);
  bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);

  if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
    bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);
  }
  var newData = [
    func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
    newHoldersRight, argPos, ary, arity
  ];

  var result = wrapFunc.apply(undefined, newData);
  if (isLaziable(func)) {
    setData(result, newData);
  }
  result.placeholder = placeholder;
  return setWrapToString(result, func, bitmask);
}

module.exports = createRecurry;
var toNumber = require('./toNumber');

/**
 * Creates a function that performs a relational operation on two values.
 *
 * @private
 * @param {Function} operator The function to perform the operation.
 * @returns {Function} Returns the new relational operation function.
 */
function createRelationalOperation(operator) {
  return function(value, other) {
    if (!(typeof value == 'string' && typeof other == 'string')) {
      value = toNumber(value);
      other = toNumber(other);
    }
    return operator(value, other);
  };
}

module.exports = createRelationalOperation;
var root = require('./_root'),
    toInteger = require('./toInteger'),
    toNumber = require('./toNumber'),
    toString = require('./toString');

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeIsFinite = root.isFinite,
    nativeMin = Math.min;

/**
 * Creates a function like `_.round`.
 *
 * @private
 * @param {string} methodName The name of the `Math` method to use when rounding.
 * @returns {Function} Returns the new round function.
 */
function createRound(methodName) {
  var func = Math[methodName];
  return function(number, precision) {
    number = toNumber(number);
    precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);
    if (precision && nativeIsFinite(number)) {
      // Shift with exponential notation to avoid floating-point issues.
      // See [MDN](https://mdn.io/round#Examples) for more details.
      var pair = (toString(number) + 'e').split('e'),
          value = func(pair[0] + 'e' + (+pair[1] + precision));

      pair = (toString(value) + 'e').split('e');
      return +(pair[0] + 'e' + (+pair[1] - precision));
    }
    return func(number);
  };
}

module.exports = createRound;
var Set = require('./_Set'),
    noop = require('./noop'),
    setToArray = require('./_setToArray');

/** Used as references for various `Number` constants. */
var INFINITY = 1 / 0;

/**
 * Creates a set object of `values`.
 *
 * @private
 * @param {Array} values The values to add to the set.
 * @returns {Object} Returns the new set.
 */
var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {
  return new Set(values);
};

module.exports = createSet;
var baseToPairs = require('./_baseToPairs'),
    getTag = require('./_getTag'),
    mapToArray = require('./_mapToArray'),
    setToPairs = require('./_setToPairs');

/** `Object#toString` result references. */
var mapTag = '[object Map]',
    setTag = '[object Set]';

/**
 * Creates a `_.toPairs` or `_.toPairsIn` function.
 *
 * @private
 * @param {Function} keysFunc The function to get the keys of a given object.
 * @returns {Function} Returns the new pairs function.
 */
function createToPairs(keysFunc) {
  return function(object) {
    var tag = getTag(object);
    if (tag == mapTag) {
      return mapToArray(object);
    }
    if (tag == setTag) {
      return setToPairs(object);
    }
    return baseToPairs(object, keysFunc(object));
  };
}

module.exports = createToPairs;
var baseSetData = require('./_baseSetData'),
    createBind = require('./_createBind'),
    createCurry = require('./_createCurry'),
    createHybrid = require('./_createHybrid'),
    createPartial = require('./_createPartial'),
    getData = require('./_getData'),
    mergeData = require('./_mergeData'),
    setData = require('./_setData'),
    setWrapToString = require('./_setWrapToString'),
    toInteger = require('./toInteger');

/** Error message constants. */
var FUNC_ERROR_TEXT = 'Expected a function';

/** Used to compose bitmasks for function metadata. */
var WRAP_BIND_FLAG = 1,
    WRAP_BIND_KEY_FLAG = 2,
    WRAP_CURRY_FLAG = 8,
    WRAP_CURRY_RIGHT_FLAG = 16,
    WRAP_PARTIAL_FLAG = 32,
    WRAP_PARTIAL_RIGHT_FLAG = 64;

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max;

/**
 * Creates a function that either curries or invokes `func` with optional
 * `this` binding and partially applied arguments.
 *
 * @private
 * @param {Function|string} func The function or method name to wrap.
 * @param {number} bitmask The bitmask flags.
 *    1 - `_.bind`
 *    2 - `_.bindKey`
 *    4 - `_.curry` or `_.curryRight` of a bound function
 *    8 - `_.curry`
 *   16 - `_.curryRight`
 *   32 - `_.partial`
 *   64 - `_.partialRight`
 *  128 - `_.rearg`
 *  256 - `_.ary`
 *  512 - `_.flip`
 * @param {*} [thisArg] The `this` binding of `func`.
 * @param {Array} [partials] The arguments to be partially applied.
 * @param {Array} [holders] The `partials` placeholder indexes.
 * @param {Array} [argPos] The argument positions of the new function.
 * @param {number} [ary] The arity cap of `func`.
 * @param {number} [arity] The arity of `func`.
 * @returns {Function} Returns the new wrapped function.
 */
function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
  var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
  if (!isBindKey && typeof func != 'function') {
    throw new TypeError(FUNC_ERROR_TEXT);
  }
  var length = partials ? partials.length : 0;
  if (!length) {
    bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);
    partials = holders = undefined;
  }
  ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);
  arity = arity === undefined ? arity : toInteger(arity);
  length -= holders ? holders.length : 0;

  if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
    var partialsRight = partials,
        holdersRight = holders;

    partials = holders = undefined;
  }
  var data = isBindKey ? undefined : getData(func);

  var newData = [
    func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
    argPos, ary, arity
  ];

  if (data) {
    mergeData(newData, data);
  }
  func = newData[0];
  bitmask = newData[1];
  thisArg = newData[2];
  partials = newData[3];
  holders = newData[4];
  arity = newData[9] = newData[9] === undefined
    ? (isBindKey ? 0 : func.length)
    : nativeMax(newData[9] - length, 0);

  if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
    bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
  }
  if (!bitmask || bitmask == WRAP_BIND_FLAG) {
    var result = createBind(func, bitmask, thisArg);
  } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
    result = createCurry(func, bitmask, arity);
  } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {
    result = createPartial(func, bitmask, thisArg, partials);
  } else {
    result = createHybrid.apply(undefined, newData);
  }
  var setter = data ? baseSetData : setData;
  return setWrapToString(setter(result, newData), func, bitmask);
}

module.exports = createWrap;
var eq = require('./eq');

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * Used by `_.defaults` to customize its `_.assignIn` use to assign properties
 * of source objects to the destination object for all destination properties
 * that resolve to `undefined`.
 *
 * @private
 * @param {*} objValue The destination value.
 * @param {*} srcValue The source value.
 * @param {string} key The key of the property to assign.
 * @param {Object} object The parent object of `objValue`.
 * @returns {*} Returns the value to assign.
 */
function customDefaultsAssignIn(objValue, srcValue, key, object) {
  if (objValue === undefined ||
      (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {
    return srcValue;
  }
  return objValue;
}

module.exports = customDefaultsAssignIn;
var baseMerge = require('./_baseMerge'),
    isObject = require('./isObject');

/**
 * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source
 * objects into destination objects that are passed thru.
 *
 * @private
 * @param {*} objValue The destination value.
 * @param {*} srcValue The source value.
 * @param {string} key The key of the property to merge.
 * @param {Object} object The parent object of `objValue`.
 * @param {Object} source The parent object of `srcValue`.
 * @param {Object} [stack] Tracks traversed source values and their merged
 *  counterparts.
 * @returns {*} Returns the value to assign.
 */
function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {
  if (isObject(objValue) && isObject(srcValue)) {
    // Recursively merge objects and arrays (susceptible to call stack limits).
    stack.set(srcValue, objValue);
    baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);
    stack['delete'](srcValue);
  }
  return objValue;
}

module.exports = customDefaultsMerge;
var isPlainObject = require('./isPlainObject');

/**
 * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
 * objects.
 *
 * @private
 * @param {*} value The value to inspect.
 * @param {string} key The key of the property to inspect.
 * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
 */
function customOmitClone(value) {
  return isPlainObject(value) ? undefined : value;
}

module.exports = customOmitClone;
var basePropertyOf = require('./_basePropertyOf');

/** Used to map Latin Unicode letters to basic Latin letters. */
var deburredLetters = {
  // Latin-1 Supplement block.
  '\xc0': 'A',  '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A',
  '\xe0': 'a',  '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a',
  '\xc7': 'C',  '\xe7': 'c',
  '\xd0': 'D',  '\xf0': 'd',
  '\xc8': 'E',  '\xc9': 'E', '\xca': 'E', '\xcb': 'E',
  '\xe8': 'e',  '\xe9': 'e', '\xea': 'e', '\xeb': 'e',
  '\xcc': 'I',  '\xcd': 'I', '\xce': 'I', '\xcf': 'I',
  '\xec': 'i',  '\xed': 'i', '\xee': 'i', '\xef': 'i',
  '\xd1': 'N',  '\xf1': 'n',
  '\xd2': 'O',  '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O',
  '\xf2': 'o',  '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o',
  '\xd9': 'U',  '\xda': 'U', '\xdb': 'U', '\xdc': 'U',
  '\xf9': 'u',  '\xfa': 'u', '\xfb': 'u', '\xfc': 'u',
  '\xdd': 'Y',  '\xfd': 'y', '\xff': 'y',
  '\xc6': 'Ae', '\xe6': 'ae',
  '\xde': 'Th', '\xfe': 'th',
  '\xdf': 'ss',
  // Latin Extended-A block.
  '\u0100': 'A',  '\u0102': 'A', '\u0104': 'A',
  '\u0101': 'a',  '\u0103': 'a', '\u0105': 'a',
  '\u0106': 'C',  '\u0108': 'C', '\u010a': 'C', '\u010c': 'C',
  '\u0107': 'c',  '\u0109': 'c', '\u010b': 'c', '\u010d': 'c',
  '\u010e': 'D',  '\u0110': 'D', '\u010f': 'd', '\u0111': 'd',
  '\u0112': 'E',  '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E',
  '\u0113': 'e',  '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e',
  '\u011c': 'G',  '\u011e': 'G', '\u0120': 'G', '\u0122': 'G',
  '\u011d': 'g',  '\u011f': 'g', '\u0121': 'g', '\u0123': 'g',
  '\u0124': 'H',  '\u0126': 'H', '\u0125': 'h', '\u0127': 'h',
  '\u0128': 'I',  '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I',
  '\u0129': 'i',  '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i',
  '\u0134': 'J',  '\u0135': 'j',
  '\u0136': 'K',  '\u0137': 'k', '\u0138': 'k',
  '\u0139': 'L',  '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L',
  '\u013a': 'l',  '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l',
  '\u0143': 'N',  '\u0145': 'N', '\u0147': 'N', '\u014a': 'N',
  '\u0144': 'n',  '\u0146': 'n', '\u0148': 'n', '\u014b': 'n',
  '\u014c': 'O',  '\u014e': 'O', '\u0150': 'O',
  '\u014d': 'o',  '\u014f': 'o', '\u0151': 'o',
  '\u0154': 'R',  '\u0156': 'R', '\u0158': 'R',
  '\u0155': 'r',  '\u0157': 'r', '\u0159': 'r',
  '\u015a': 'S',  '\u015c': 'S', '\u015e': 'S', '\u0160': 'S',
  '\u015b': 's',  '\u015d': 's', '\u015f': 's', '\u0161': 's',
  '\u0162': 'T',  '\u0164': 'T', '\u0166': 'T',
  '\u0163': 't',  '\u0165': 't', '\u0167': 't',
  '\u0168': 'U',  '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U',
  '\u0169': 'u',  '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u',
  '\u0174': 'W',  '\u0175': 'w',
  '\u0176': 'Y',  '\u0177': 'y', '\u0178': 'Y',
  '\u0179': 'Z',  '\u017b': 'Z', '\u017d': 'Z',
  '\u017a': 'z',  '\u017c': 'z', '\u017e': 'z',
  '\u0132': 'IJ', '\u0133': 'ij',
  '\u0152': 'Oe', '\u0153': 'oe',
  '\u0149': "'n", '\u017f': 's'
};

/**
 * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A
 * letters to basic Latin letters.
 *
 * @private
 * @param {string} letter The matched letter to deburr.
 * @returns {string} Returns the deburred letter.
 */
var deburrLetter = basePropertyOf(deburredLetters);

module.exports = deburrLetter;
var getNative = require('./_getNative');

var defineProperty = (function() {
  try {
    var func = getNative(Object, 'defineProperty');
    func({}, '', {});
    return func;
  } catch (e) {}
}());

module.exports = defineProperty;
var SetCache = require('./_SetCache'),
    arraySome = require('./_arraySome'),
    cacheHas = require('./_cacheHas');

/** Used to compose bitmasks for value comparisons. */
var COMPARE_PARTIAL_FLAG = 1,
    COMPARE_UNORDERED_FLAG = 2;

/**
 * A specialized version of `baseIsEqualDeep` for arrays with support for
 * partial deep comparisons.
 *
 * @private
 * @param {Array} array The array to compare.
 * @param {Array} other The other array to compare.
 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
 * @param {Function} customizer The function to customize comparisons.
 * @param {Function} equalFunc The function to determine equivalents of values.
 * @param {Object} stack Tracks traversed `array` and `other` objects.
 * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
 */
function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
      arrLength = array.length,
      othLength = other.length;

  if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
    return false;
  }
  // Check that cyclic values are equal.
  var arrStacked = stack.get(array);
  var othStacked = stack.get(other);
  if (arrStacked && othStacked) {
    return arrStacked == other && othStacked == array;
  }
  var index = -1,
      result = true,
      seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;

  stack.set(array, other);
  stack.set(other, array);

  // Ignore non-index properties.
  while (++index < arrLength) {
    var arrValue = array[index],
        othValue = other[index];

    if (customizer) {
      var compared = isPartial
        ? customizer(othValue, arrValue, index, other, array, stack)
        : customizer(arrValue, othValue, index, array, other, stack);
    }
    if (compared !== undefined) {
      if (compared) {
        continue;
      }
      result = false;
      break;
    }
    // Recursively compare arrays (susceptible to call stack limits).
    if (seen) {
      if (!arraySome(other, function(othValue, othIndex) {
            if (!cacheHas(seen, othIndex) &&
                (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
              return seen.push(othIndex);
            }
          })) {
        result = false;
        break;
      }
    } else if (!(
          arrValue === othValue ||
            equalFunc(arrValue, othValue, bitmask, customizer, stack)
        )) {
      result = false;
      break;
    }
  }
  stack['delete'](array);
  stack['delete'](other);
  return result;
}

module.exports = equalArrays;
var Symbol = require('./_Symbol'),
    Uint8Array = require('./_Uint8Array'),
    eq = require('./eq'),
    equalArrays = require('./_equalArrays'),
    mapToArray = require('./_mapToArray'),
    setToArray = require('./_setToArray');

/** Used to compose bitmasks for value comparisons. */
var COMPARE_PARTIAL_FLAG = 1,
    COMPARE_UNORDERED_FLAG = 2;

/** `Object#toString` result references. */
var boolTag = '[object Boolean]',
    dateTag = '[object Date]',
    errorTag = '[object Error]',
    mapTag = '[object Map]',
    numberTag = '[object Number]',
    regexpTag = '[object RegExp]',
    setTag = '[object Set]',
    stringTag = '[object String]',
    symbolTag = '[object Symbol]';

var arrayBufferTag = '[object ArrayBuffer]',
    dataViewTag = '[object DataView]';

/** Used to convert symbols to primitives and strings. */
var symbolProto = Symbol ? Symbol.prototype : undefined,
    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;

/**
 * A specialized version of `baseIsEqualDeep` for comparing objects of
 * the same `toStringTag`.
 *
 * **Note:** This function only supports comparing values with tags of
 * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
 *
 * @private
 * @param {Object} object The object to compare.
 * @param {Object} other The other object to compare.
 * @param {string} tag The `toStringTag` of the objects to compare.
 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
 * @param {Function} customizer The function to customize comparisons.
 * @param {Function} equalFunc The function to determine equivalents of values.
 * @param {Object} stack Tracks traversed `object` and `other` objects.
 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
 */
function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
  switch (tag) {
    case dataViewTag:
      if ((object.byteLength != other.byteLength) ||
          (object.byteOffset != other.byteOffset)) {
        return false;
      }
      object = object.buffer;
      other = other.buffer;

    case arrayBufferTag:
      if ((object.byteLength != other.byteLength) ||
          !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
        return false;
      }
      return true;

    case boolTag:
    case dateTag:
    case numberTag:
      // Coerce booleans to `1` or `0` and dates to milliseconds.
      // Invalid dates are coerced to `NaN`.
      return eq(+object, +other);

    case errorTag:
      return object.name == other.name && object.message == other.message;

    case regexpTag:
    case stringTag:
      // Coerce regexes to strings and treat strings, primitives and objects,
      // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
      // for more details.
      return object == (other + '');

    case mapTag:
      var convert = mapToArray;

    case setTag:
      var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
      convert || (convert = setToArray);

      if (object.size != other.size && !isPartial) {
        return false;
      }
      // Assume cyclic values are equal.
      var stacked = stack.get(object);
      if (stacked) {
        return stacked == other;
      }
      bitmask |= COMPARE_UNORDERED_FLAG;

      // Recursively compare objects (susceptible to call stack limits).
      stack.set(object, other);
      var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
      stack['delete'](object);
      return result;

    case symbolTag:
      if (symbolValueOf) {
        return symbolValueOf.call(object) == symbolValueOf.call(other);
      }
  }
  return false;
}

module.exports = equalByTag;
var getAllKeys = require('./_getAllKeys');

/** Used to compose bitmasks for value comparisons. */
var COMPARE_PARTIAL_FLAG = 1;

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * A specialized version of `baseIsEqualDeep` for objects with support for
 * partial deep comparisons.
 *
 * @private
 * @param {Object} object The object to compare.
 * @param {Object} other The other object to compare.
 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
 * @param {Function} customizer The function to customize comparisons.
 * @param {Function} equalFunc The function to determine equivalents of values.
 * @param {Object} stack Tracks traversed `object` and `other` objects.
 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
 */
function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
      objProps = getAllKeys(object),
      objLength = objProps.length,
      othProps = getAllKeys(other),
      othLength = othProps.length;

  if (objLength != othLength && !isPartial) {
    return false;
  }
  var index = objLength;
  while (index--) {
    var key = objProps[index];
    if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
      return false;
    }
  }
  // Check that cyclic values are equal.
  var objStacked = stack.get(object);
  var othStacked = stack.get(other);
  if (objStacked && othStacked) {
    return objStacked == other && othStacked == object;
  }
  var result = true;
  stack.set(object, other);
  stack.set(other, object);

  var skipCtor = isPartial;
  while (++index < objLength) {
    key = objProps[index];
    var objValue = object[key],
        othValue = other[key];

    if (customizer) {
      var compared = isPartial
        ? customizer(othValue, objValue, key, other, object, stack)
        : customizer(objValue, othValue, key, object, other, stack);
    }
    // Recursively compare objects (susceptible to call stack limits).
    if (!(compared === undefined
          ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
          : compared
        )) {
      result = false;
      break;
    }
    skipCtor || (skipCtor = key == 'constructor');
  }
  if (result && !skipCtor) {
    var objCtor = object.constructor,
        othCtor = other.constructor;

    // Non `Object` object instances with different constructors are not equal.
    if (objCtor != othCtor &&
        ('constructor' in object && 'constructor' in other) &&
        !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
          typeof othCtor == 'function' && othCtor instanceof othCtor)) {
      result = false;
    }
  }
  stack['delete'](object);
  stack['delete'](other);
  return result;
}

module.exports = equalObjects;
var basePropertyOf = require('./_basePropertyOf');

/** Used to map characters to HTML entities. */
var htmlEscapes = {
  '&': '&amp;',
  '<': '&lt;',
  '>': '&gt;',
  '"': '&quot;',
  "'": '&#39;'
};

/**
 * Used by `_.escape` to convert characters to HTML entities.
 *
 * @private
 * @param {string} chr The matched character to escape.
 * @returns {string} Returns the escaped character.
 */
var escapeHtmlChar = basePropertyOf(htmlEscapes);

module.exports = escapeHtmlChar;
/** Used to escape characters for inclusion in compiled string literals. */
var stringEscapes = {
  '\\': '\\',
  "'": "'",
  '\n': 'n',
  '\r': 'r',
  '\u2028': 'u2028',
  '\u2029': 'u2029'
};

/**
 * Used by `_.template` to escape characters for inclusion in compiled string literals.
 *
 * @private
 * @param {string} chr The matched character to escape.
 * @returns {string} Returns the escaped character.
 */
function escapeStringChar(chr) {
  return '\\' + stringEscapes[chr];
}

module.exports = escapeStringChar;
var flatten = require('./flatten'),
    overRest = require('./_overRest'),
    setToString = require('./_setToString');

/**
 * A specialized version of `baseRest` which flattens the rest array.
 *
 * @private
 * @param {Function} func The function to apply a rest parameter to.
 * @returns {Function} Returns the new function.
 */
function flatRest(func) {
  return setToString(overRest(func, undefined, flatten), func + '');
}

module.exports = flatRest;
/** Detect free variable `global` from Node.js. */
var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;

module.exports = freeGlobal;
var baseGetAllKeys = require('./_baseGetAllKeys'),
    getSymbols = require('./_getSymbols'),
    keys = require('./keys');

/**
 * Creates an array of own enumerable property names and symbols of `object`.
 *
 * @private
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of property names and symbols.
 */
function getAllKeys(object) {
  return baseGetAllKeys(object, keys, getSymbols);
}

module.exports = getAllKeys;
var baseGetAllKeys = require('./_baseGetAllKeys'),
    getSymbolsIn = require('./_getSymbolsIn'),
    keysIn = require('./keysIn');

/**
 * Creates an array of own and inherited enumerable property names and
 * symbols of `object`.
 *
 * @private
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of property names and symbols.
 */
function getAllKeysIn(object) {
  return baseGetAllKeys(object, keysIn, getSymbolsIn);
}

module.exports = getAllKeysIn;
var metaMap = require('./_metaMap'),
    noop = require('./noop');

/**
 * Gets metadata for `func`.
 *
 * @private
 * @param {Function} func The function to query.
 * @returns {*} Returns the metadata for `func`.
 */
var getData = !metaMap ? noop : function(func) {
  return metaMap.get(func);
};

module.exports = getData;
var realNames = require('./_realNames');

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * Gets the name of `func`.
 *
 * @private
 * @param {Function} func The function to query.
 * @returns {string} Returns the function name.
 */
function getFuncName(func) {
  var result = (func.name + ''),
      array = realNames[result],
      length = hasOwnProperty.call(realNames, result) ? array.length : 0;

  while (length--) {
    var data = array[length],
        otherFunc = data.func;
    if (otherFunc == null || otherFunc == func) {
      return data.name;
    }
  }
  return result;
}

module.exports = getFuncName;
/**
 * Gets the argument placeholder value for `func`.
 *
 * @private
 * @param {Function} func The function to inspect.
 * @returns {*} Returns the placeholder value.
 */
function getHolder(func) {
  var object = func;
  return object.placeholder;
}

module.exports = getHolder;
var isKeyable = require('./_isKeyable');

/**
 * Gets the data for `map`.
 *
 * @private
 * @param {Object} map The map to query.
 * @param {string} key The reference key.
 * @returns {*} Returns the map data.
 */
function getMapData(map, key) {
  var data = map.__data__;
  return isKeyable(key)
    ? data[typeof key == 'string' ? 'string' : 'hash']
    : data.map;
}

module.exports = getMapData;
var isStrictComparable = require('./_isStrictComparable'),
    keys = require('./keys');

/**
 * Gets the property names, values, and compare flags of `object`.
 *
 * @private
 * @param {Object} object The object to query.
 * @returns {Array} Returns the match data of `object`.
 */
function getMatchData(object) {
  var result = keys(object),
      length = result.length;

  while (length--) {
    var key = result[length],
        value = object[key];

    result[length] = [key, value, isStrictComparable(value)];
  }
  return result;
}

module.exports = getMatchData;
var baseIsNative = require('./_baseIsNative'),
    getValue = require('./_getValue');

/**
 * Gets the native function at `key` of `object`.
 *
 * @private
 * @param {Object} object The object to query.
 * @param {string} key The key of the method to get.
 * @returns {*} Returns the function if it's native, else `undefined`.
 */
function getNative(object, key) {
  var value = getValue(object, key);
  return baseIsNative(value) ? value : undefined;
}

module.exports = getNative;
var overArg = require('./_overArg');

/** Built-in value references. */
var getPrototype = overArg(Object.getPrototypeOf, Object);

module.exports = getPrototype;
var Symbol = require('./_Symbol');

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * Used to resolve the
 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
 * of values.
 */
var nativeObjectToString = objectProto.toString;

/** Built-in value references. */
var symToStringTag = Symbol ? Symbol.toStringTag : undefined;

/**
 * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
 *
 * @private
 * @param {*} value The value to query.
 * @returns {string} Returns the raw `toStringTag`.
 */
function getRawTag(value) {
  var isOwn = hasOwnProperty.call(value, symToStringTag),
      tag = value[symToStringTag];

  try {
    value[symToStringTag] = undefined;
    var unmasked = true;
  } catch (e) {}

  var result = nativeObjectToString.call(value);
  if (unmasked) {
    if (isOwn) {
      value[symToStringTag] = tag;
    } else {
      delete value[symToStringTag];
    }
  }
  return result;
}

module.exports = getRawTag;
var arrayFilter = require('./_arrayFilter'),
    stubArray = require('./stubArray');

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Built-in value references. */
var propertyIsEnumerable = objectProto.propertyIsEnumerable;

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeGetSymbols = Object.getOwnPropertySymbols;

/**
 * Creates an array of the own enumerable symbols of `object`.
 *
 * @private
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of symbols.
 */
var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
  if (object == null) {
    return [];
  }
  object = Object(object);
  return arrayFilter(nativeGetSymbols(object), function(symbol) {
    return propertyIsEnumerable.call(object, symbol);
  });
};

module.exports = getSymbols;
var arrayPush = require('./_arrayPush'),
    getPrototype = require('./_getPrototype'),
    getSymbols = require('./_getSymbols'),
    stubArray = require('./stubArray');

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeGetSymbols = Object.getOwnPropertySymbols;

/**
 * Creates an array of the own and inherited enumerable symbols of `object`.
 *
 * @private
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of symbols.
 */
var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {
  var result = [];
  while (object) {
    arrayPush(result, getSymbols(object));
    object = getPrototype(object);
  }
  return result;
};

module.exports = getSymbolsIn;
var DataView = require('./_DataView'),
    Map = require('./_Map'),
    Promise = require('./_Promise'),
    Set = require('./_Set'),
    WeakMap = require('./_WeakMap'),
    baseGetTag = require('./_baseGetTag'),
    toSource = require('./_toSource');

/** `Object#toString` result references. */
var mapTag = '[object Map]',
    objectTag = '[object Object]',
    promiseTag = '[object Promise]',
    setTag = '[object Set]',
    weakMapTag = '[object WeakMap]';

var dataViewTag = '[object DataView]';

/** Used to detect maps, sets, and weakmaps. */
var dataViewCtorString = toSource(DataView),
    mapCtorString = toSource(Map),
    promiseCtorString = toSource(Promise),
    setCtorString = toSource(Set),
    weakMapCtorString = toSource(WeakMap);

/**
 * Gets the `toStringTag` of `value`.
 *
 * @private
 * @param {*} value The value to query.
 * @returns {string} Returns the `toStringTag`.
 */
var getTag = baseGetTag;

// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
    (Map && getTag(new Map) != mapTag) ||
    (Promise && getTag(Promise.resolve()) != promiseTag) ||
    (Set && getTag(new Set) != setTag) ||
    (WeakMap && getTag(new WeakMap) != weakMapTag)) {
  getTag = function(value) {
    var result = baseGetTag(value),
        Ctor = result == objectTag ? value.constructor : undefined,
        ctorString = Ctor ? toSource(Ctor) : '';

    if (ctorString) {
      switch (ctorString) {
        case dataViewCtorString: return dataViewTag;
        case mapCtorString: return mapTag;
        case promiseCtorString: return promiseTag;
        case setCtorString: return setTag;
        case weakMapCtorString: return weakMapTag;
      }
    }
    return result;
  };
}

module.exports = getTag;
/**
 * Gets the value at `key` of `object`.
 *
 * @private
 * @param {Object} [object] The object to query.
 * @param {string} key The key of the property to get.
 * @returns {*} Returns the property value.
 */
function getValue(object, key) {
  return object == null ? undefined : object[key];
}

module.exports = getValue;
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max,
    nativeMin = Math.min;

/**
 * Gets the view, applying any `transforms` to the `start` and `end` positions.
 *
 * @private
 * @param {number} start The start of the view.
 * @param {number} end The end of the view.
 * @param {Array} transforms The transformations to apply to the view.
 * @returns {Object} Returns an object containing the `start` and `end`
 *  positions of the view.
 */
function getView(start, end, transforms) {
  var index = -1,
      length = transforms.length;

  while (++index < length) {
    var data = transforms[index],
        size = data.size;

    switch (data.type) {
      case 'drop':      start += size; break;
      case 'dropRight': end -= size; break;
      case 'take':      end = nativeMin(end, start + size); break;
      case 'takeRight': start = nativeMax(start, end - size); break;
    }
  }
  return { 'start': start, 'end': end };
}

module.exports = getView;
/** Used to match wrap detail comments. */
var reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
    reSplitDetails = /,? & /;

/**
 * Extracts wrapper details from the `source` body comment.
 *
 * @private
 * @param {string} source The source to inspect.
 * @returns {Array} Returns the wrapper details.
 */
function getWrapDetails(source) {
  var match = source.match(reWrapDetails);
  return match ? match[1].split(reSplitDetails) : [];
}

module.exports = getWrapDetails;
var castPath = require('./_castPath'),
    isArguments = require('./isArguments'),
    isArray = require('./isArray'),
    isIndex = require('./_isIndex'),
    isLength = require('./isLength'),
    toKey = require('./_toKey');

/**
 * Checks if `path` exists on `object`.
 *
 * @private
 * @param {Object} object The object to query.
 * @param {Array|string} path The path to check.
 * @param {Function} hasFunc The function to check properties.
 * @returns {boolean} Returns `true` if `path` exists, else `false`.
 */
function hasPath(object, path, hasFunc) {
  path = castPath(path, object);

  var index = -1,
      length = path.length,
      result = false;

  while (++index < length) {
    var key = toKey(path[index]);
    if (!(result = object != null && hasFunc(object, key))) {
      break;
    }
    object = object[key];
  }
  if (result || ++index != length) {
    return result;
  }
  length = object == null ? 0 : object.length;
  return !!length && isLength(length) && isIndex(key, length) &&
    (isArray(object) || isArguments(object));
}

module.exports = hasPath;
/** Used to compose unicode character classes. */
var rsAstralRange = '\\ud800-\\udfff',
    rsComboMarksRange = '\\u0300-\\u036f',
    reComboHalfMarksRange = '\\ufe20-\\ufe2f',
    rsComboSymbolsRange = '\\u20d0-\\u20ff',
    rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,
    rsVarRange = '\\ufe0e\\ufe0f';

/** Used to compose unicode capture groups. */
var rsZWJ = '\\u200d';

/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */
var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');

/**
 * Checks if `string` contains Unicode symbols.
 *
 * @private
 * @param {string} string The string to inspect.
 * @returns {boolean} Returns `true` if a symbol is found, else `false`.
 */
function hasUnicode(string) {
  return reHasUnicode.test(string);
}

module.exports = hasUnicode;
/** Used to detect strings that need a more robust regexp to match words. */
var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;

/**
 * Checks if `string` contains a word composed of Unicode symbols.
 *
 * @private
 * @param {string} string The string to inspect.
 * @returns {boolean} Returns `true` if a word is found, else `false`.
 */
function hasUnicodeWord(string) {
  return reHasUnicodeWord.test(string);
}

module.exports = hasUnicodeWord;
var nativeCreate = require('./_nativeCreate');

/**
 * Removes all key-value entries from the hash.
 *
 * @private
 * @name clear
 * @memberOf Hash
 */
function hashClear() {
  this.__data__ = nativeCreate ? nativeCreate(null) : {};
  this.size = 0;
}

module.exports = hashClear;
/**
 * Removes `key` and its value from the hash.
 *
 * @private
 * @name delete
 * @memberOf Hash
 * @param {Object} hash The hash to modify.
 * @param {string} key The key of the value to remove.
 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
 */
function hashDelete(key) {
  var result = this.has(key) && delete this.__data__[key];
  this.size -= result ? 1 : 0;
  return result;
}

module.exports = hashDelete;
var nativeCreate = require('./_nativeCreate');

/** Used to stand-in for `undefined` hash values. */
var HASH_UNDEFINED = '__lodash_hash_undefined__';

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * Gets the hash value for `key`.
 *
 * @private
 * @name get
 * @memberOf Hash
 * @param {string} key The key of the value to get.
 * @returns {*} Returns the entry value.
 */
function hashGet(key) {
  var data = this.__data__;
  if (nativeCreate) {
    var result = data[key];
    return result === HASH_UNDEFINED ? undefined : result;
  }
  return hasOwnProperty.call(data, key) ? data[key] : undefined;
}

module.exports = hashGet;
var nativeCreate = require('./_nativeCreate');

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * Checks if a hash value for `key` exists.
 *
 * @private
 * @name has
 * @memberOf Hash
 * @param {string} key The key of the entry to check.
 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
 */
function hashHas(key) {
  var data = this.__data__;
  return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);
}

module.exports = hashHas;
var nativeCreate = require('./_nativeCreate');

/** Used to stand-in for `undefined` hash values. */
var HASH_UNDEFINED = '__lodash_hash_undefined__';

/**
 * Sets the hash `key` to `value`.
 *
 * @private
 * @name set
 * @memberOf Hash
 * @param {string} key The key of the value to set.
 * @param {*} value The value to set.
 * @returns {Object} Returns the hash instance.
 */
function hashSet(key, value) {
  var data = this.__data__;
  this.size += this.has(key) ? 0 : 1;
  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
  return this;
}

module.exports = hashSet;
/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * Initializes an array clone.
 *
 * @private
 * @param {Array} array The array to clone.
 * @returns {Array} Returns the initialized clone.
 */
function initCloneArray(array) {
  var length = array.length,
      result = new array.constructor(length);

  // Add properties assigned by `RegExp#exec`.
  if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
    result.index = array.index;
    result.input = array.input;
  }
  return result;
}

module.exports = initCloneArray;
var cloneArrayBuffer = require('./_cloneArrayBuffer'),
    cloneDataView = require('./_cloneDataView'),
    cloneRegExp = require('./_cloneRegExp'),
    cloneSymbol = require('./_cloneSymbol'),
    cloneTypedArray = require('./_cloneTypedArray');

/** `Object#toString` result references. */
var boolTag = '[object Boolean]',
    dateTag = '[object Date]',
    mapTag = '[object Map]',
    numberTag = '[object Number]',
    regexpTag = '[object RegExp]',
    setTag = '[object Set]',
    stringTag = '[object String]',
    symbolTag = '[object Symbol]';

var arrayBufferTag = '[object ArrayBuffer]',
    dataViewTag = '[object DataView]',
    float32Tag = '[object Float32Array]',
    float64Tag = '[object Float64Array]',
    int8Tag = '[object Int8Array]',
    int16Tag = '[object Int16Array]',
    int32Tag = '[object Int32Array]',
    uint8Tag = '[object Uint8Array]',
    uint8ClampedTag = '[object Uint8ClampedArray]',
    uint16Tag = '[object Uint16Array]',
    uint32Tag = '[object Uint32Array]';

/**
 * Initializes an object clone based on its `toStringTag`.
 *
 * **Note:** This function only supports cloning values with tags of
 * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
 *
 * @private
 * @param {Object} object The object to clone.
 * @param {string} tag The `toStringTag` of the object to clone.
 * @param {boolean} [isDeep] Specify a deep clone.
 * @returns {Object} Returns the initialized clone.
 */
function initCloneByTag(object, tag, isDeep) {
  var Ctor = object.constructor;
  switch (tag) {
    case arrayBufferTag:
      return cloneArrayBuffer(object);

    case boolTag:
    case dateTag:
      return new Ctor(+object);

    case dataViewTag:
      return cloneDataView(object, isDeep);

    case float32Tag: case float64Tag:
    case int8Tag: case int16Tag: case int32Tag:
    case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
      return cloneTypedArray(object, isDeep);

    case mapTag:
      return new Ctor;

    case numberTag:
    case stringTag:
      return new Ctor(object);

    case regexpTag:
      return cloneRegExp(object);

    case setTag:
      return new Ctor;

    case symbolTag:
      return cloneSymbol(object);
  }
}

module.exports = initCloneByTag;
var baseCreate = require('./_baseCreate'),
    getPrototype = require('./_getPrototype'),
    isPrototype = require('./_isPrototype');

/**
 * Initializes an object clone.
 *
 * @private
 * @param {Object} object The object to clone.
 * @returns {Object} Returns the initialized clone.
 */
function initCloneObject(object) {
  return (typeof object.constructor == 'function' && !isPrototype(object))
    ? baseCreate(getPrototype(object))
    : {};
}

module.exports = initCloneObject;
/** Used to match wrap detail comments. */
var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;

/**
 * Inserts wrapper `details` in a comment at the top of the `source` body.
 *
 * @private
 * @param {string} source The source to modify.
 * @returns {Array} details The details to insert.
 * @returns {string} Returns the modified source.
 */
function insertWrapDetails(source, details) {
  var length = details.length;
  if (!length) {
    return source;
  }
  var lastIndex = length - 1;
  details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
  details = details.join(length > 2 ? ', ' : ' ');
  return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
}

module.exports = insertWrapDetails;
var Symbol = require('./_Symbol'),
    isArguments = require('./isArguments'),
    isArray = require('./isArray');

/** Built-in value references. */
var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;

/**
 * Checks if `value` is a flattenable `arguments` object or array.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
 */
function isFlattenable(value) {
  return isArray(value) || isArguments(value) ||
    !!(spreadableSymbol && value && value[spreadableSymbol]);
}

module.exports = isFlattenable;
/** Used as references for various `Number` constants. */
var MAX_SAFE_INTEGER = 9007199254740991;

/** Used to detect unsigned integer values. */
var reIsUint = /^(?:0|[1-9]\d*)$/;

/**
 * Checks if `value` is a valid array-like index.
 *
 * @private
 * @param {*} value The value to check.
 * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
 * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
 */
function isIndex(value, length) {
  var type = typeof value;
  length = length == null ? MAX_SAFE_INTEGER : length;

  return !!length &&
    (type == 'number' ||
      (type != 'symbol' && reIsUint.test(value))) &&
        (value > -1 && value % 1 == 0 && value < length);
}

module.exports = isIndex;
var eq = require('./eq'),
    isArrayLike = require('./isArrayLike'),
    isIndex = require('./_isIndex'),
    isObject = require('./isObject');

/**
 * Checks if the given arguments are from an iteratee call.
 *
 * @private
 * @param {*} value The potential iteratee value argument.
 * @param {*} index The potential iteratee index or key argument.
 * @param {*} object The potential iteratee object argument.
 * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
 *  else `false`.
 */
function isIterateeCall(value, index, object) {
  if (!isObject(object)) {
    return false;
  }
  var type = typeof index;
  if (type == 'number'
        ? (isArrayLike(object) && isIndex(index, object.length))
        : (type == 'string' && index in object)
      ) {
    return eq(object[index], value);
  }
  return false;
}

module.exports = isIterateeCall;
var isArray = require('./isArray'),
    isSymbol = require('./isSymbol');

/** Used to match property names within property paths. */
var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
    reIsPlainProp = /^\w*$/;

/**
 * Checks if `value` is a property name and not a property path.
 *
 * @private
 * @param {*} value The value to check.
 * @param {Object} [object] The object to query keys on.
 * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
 */
function isKey(value, object) {
  if (isArray(value)) {
    return false;
  }
  var type = typeof value;
  if (type == 'number' || type == 'symbol' || type == 'boolean' ||
      value == null || isSymbol(value)) {
    return true;
  }
  return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
    (object != null && value in Object(object));
}

module.exports = isKey;
/**
 * Checks if `value` is suitable for use as unique object key.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
 */
function isKeyable(value) {
  var type = typeof value;
  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
    ? (value !== '__proto__')
    : (value === null);
}

module.exports = isKeyable;
var LazyWrapper = require('./_LazyWrapper'),
    getData = require('./_getData'),
    getFuncName = require('./_getFuncName'),
    lodash = require('./wrapperLodash');

/**
 * Checks if `func` has a lazy counterpart.
 *
 * @private
 * @param {Function} func The function to check.
 * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
 *  else `false`.
 */
function isLaziable(func) {
  var funcName = getFuncName(func),
      other = lodash[funcName];

  if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
    return false;
  }
  if (func === other) {
    return true;
  }
  var data = getData(other);
  return !!data && func === data[0];
}

module.exports = isLaziable;
var coreJsData = require('./_coreJsData'),
    isFunction = require('./isFunction'),
    stubFalse = require('./stubFalse');

/**
 * Checks if `func` is capable of being masked.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `func` is maskable, else `false`.
 */
var isMaskable = coreJsData ? isFunction : stubFalse;

module.exports = isMaskable;
var coreJsData = require('./_coreJsData');

/** Used to detect methods masquerading as native. */
var maskSrcKey = (function() {
  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
  return uid ? ('Symbol(src)_1.' + uid) : '';
}());

/**
 * Checks if `func` has its source masked.
 *
 * @private
 * @param {Function} func The function to check.
 * @returns {boolean} Returns `true` if `func` is masked, else `false`.
 */
function isMasked(func) {
  return !!maskSrcKey && (maskSrcKey in func);
}

module.exports = isMasked;
/** Used for built-in method references. */
var objectProto = Object.prototype;

/**
 * Checks if `value` is likely a prototype object.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
 */
function isPrototype(value) {
  var Ctor = value && value.constructor,
      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;

  return value === proto;
}

module.exports = isPrototype;
var isObject = require('./isObject');

/**
 * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` if suitable for strict
 *  equality comparisons, else `false`.
 */
function isStrictComparable(value) {
  return value === value && !isObject(value);
}

module.exports = isStrictComparable;
/**
 * Converts `iterator` to an array.
 *
 * @private
 * @param {Object} iterator The iterator to convert.
 * @returns {Array} Returns the converted array.
 */
function iteratorToArray(iterator) {
  var data,
      result = [];

  while (!(data = iterator.next()).done) {
    result.push(data.value);
  }
  return result;
}

module.exports = iteratorToArray;
var LazyWrapper = require('./_LazyWrapper'),
    copyArray = require('./_copyArray');

/**
 * Creates a clone of the lazy wrapper object.
 *
 * @private
 * @name clone
 * @memberOf LazyWrapper
 * @returns {Object} Returns the cloned `LazyWrapper` object.
 */
function lazyClone() {
  var result = new LazyWrapper(this.__wrapped__);
  result.__actions__ = copyArray(this.__actions__);
  result.__dir__ = this.__dir__;
  result.__filtered__ = this.__filtered__;
  result.__iteratees__ = copyArray(this.__iteratees__);
  result.__takeCount__ = this.__takeCount__;
  result.__views__ = copyArray(this.__views__);
  return result;
}

module.exports = lazyClone;
var LazyWrapper = require('./_LazyWrapper');

/**
 * Reverses the direction of lazy iteration.
 *
 * @private
 * @name reverse
 * @memberOf LazyWrapper
 * @returns {Object} Returns the new reversed `LazyWrapper` object.
 */
function lazyReverse() {
  if (this.__filtered__) {
    var result = new LazyWrapper(this);
    result.__dir__ = -1;
    result.__filtered__ = true;
  } else {
    result = this.clone();
    result.__dir__ *= -1;
  }
  return result;
}

module.exports = lazyReverse;
var baseWrapperValue = require('./_baseWrapperValue'),
    getView = require('./_getView'),
    isArray = require('./isArray');

/** Used to indicate the type of lazy iteratees. */
var LAZY_FILTER_FLAG = 1,
    LAZY_MAP_FLAG = 2;

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMin = Math.min;

/**
 * Extracts the unwrapped value from its lazy wrapper.
 *
 * @private
 * @name value
 * @memberOf LazyWrapper
 * @returns {*} Returns the unwrapped value.
 */
function lazyValue() {
  var array = this.__wrapped__.value(),
      dir = this.__dir__,
      isArr = isArray(array),
      isRight = dir < 0,
      arrLength = isArr ? array.length : 0,
      view = getView(0, arrLength, this.__views__),
      start = view.start,
      end = view.end,
      length = end - start,
      index = isRight ? end : (start - 1),
      iteratees = this.__iteratees__,
      iterLength = iteratees.length,
      resIndex = 0,
      takeCount = nativeMin(length, this.__takeCount__);

  if (!isArr || (!isRight && arrLength == length && takeCount == length)) {
    return baseWrapperValue(array, this.__actions__);
  }
  var result = [];

  outer:
  while (length-- && resIndex < takeCount) {
    index += dir;

    var iterIndex = -1,
        value = array[index];

    while (++iterIndex < iterLength) {
      var data = iteratees[iterIndex],
          iteratee = data.iteratee,
          type = data.type,
          computed = iteratee(value);

      if (type == LAZY_MAP_FLAG) {
        value = computed;
      } else if (!computed) {
        if (type == LAZY_FILTER_FLAG) {
          continue outer;
        } else {
          break outer;
        }
      }
    }
    result[resIndex++] = value;
  }
  return result;
}

module.exports = lazyValue;
/**
 * Removes all key-value entries from the list cache.
 *
 * @private
 * @name clear
 * @memberOf ListCache
 */
function listCacheClear() {
  this.__data__ = [];
  this.size = 0;
}

module.exports = listCacheClear;
var assocIndexOf = require('./_assocIndexOf');

/** Used for built-in method references. */
var arrayProto = Array.prototype;

/** Built-in value references. */
var splice = arrayProto.splice;

/**
 * Removes `key` and its value from the list cache.
 *
 * @private
 * @name delete
 * @memberOf ListCache
 * @param {string} key The key of the value to remove.
 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
 */
function listCacheDelete(key) {
  var data = this.__data__,
      index = assocIndexOf(data, key);

  if (index < 0) {
    return false;
  }
  var lastIndex = data.length - 1;
  if (index == lastIndex) {
    data.pop();
  } else {
    splice.call(data, index, 1);
  }
  --this.size;
  return true;
}

module.exports = listCacheDelete;
var assocIndexOf = require('./_assocIndexOf');

/**
 * Gets the list cache value for `key`.
 *
 * @private
 * @name get
 * @memberOf ListCache
 * @param {string} key The key of the value to get.
 * @returns {*} Returns the entry value.
 */
function listCacheGet(key) {
  var data = this.__data__,
      index = assocIndexOf(data, key);

  return index < 0 ? undefined : data[index][1];
}

module.exports = listCacheGet;
var assocIndexOf = require('./_assocIndexOf');

/**
 * Checks if a list cache value for `key` exists.
 *
 * @private
 * @name has
 * @memberOf ListCache
 * @param {string} key The key of the entry to check.
 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
 */
function listCacheHas(key) {
  return assocIndexOf(this.__data__, key) > -1;
}

module.exports = listCacheHas;
var assocIndexOf = require('./_assocIndexOf');

/**
 * Sets the list cache `key` to `value`.
 *
 * @private
 * @name set
 * @memberOf ListCache
 * @param {string} key The key of the value to set.
 * @param {*} value The value to set.
 * @returns {Object} Returns the list cache instance.
 */
function listCacheSet(key, value) {
  var data = this.__data__,
      index = assocIndexOf(data, key);

  if (index < 0) {
    ++this.size;
    data.push([key, value]);
  } else {
    data[index][1] = value;
  }
  return this;
}

module.exports = listCacheSet;
var Hash = require('./_Hash'),
    ListCache = require('./_ListCache'),
    Map = require('./_Map');

/**
 * Removes all key-value entries from the map.
 *
 * @private
 * @name clear
 * @memberOf MapCache
 */
function mapCacheClear() {
  this.size = 0;
  this.__data__ = {
    'hash': new Hash,
    'map': new (Map || ListCache),
    'string': new Hash
  };
}

module.exports = mapCacheClear;
var getMapData = require('./_getMapData');

/**
 * Removes `key` and its value from the map.
 *
 * @private
 * @name delete
 * @memberOf MapCache
 * @param {string} key The key of the value to remove.
 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
 */
function mapCacheDelete(key) {
  var result = getMapData(this, key)['delete'](key);
  this.size -= result ? 1 : 0;
  return result;
}

module.exports = mapCacheDelete;
var getMapData = require('./_getMapData');

/**
 * Gets the map value for `key`.
 *
 * @private
 * @name get
 * @memberOf MapCache
 * @param {string} key The key of the value to get.
 * @returns {*} Returns the entry value.
 */
function mapCacheGet(key) {
  return getMapData(this, key).get(key);
}

module.exports = mapCacheGet;
var getMapData = require('./_getMapData');

/**
 * Checks if a map value for `key` exists.
 *
 * @private
 * @name has
 * @memberOf MapCache
 * @param {string} key The key of the entry to check.
 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
 */
function mapCacheHas(key) {
  return getMapData(this, key).has(key);
}

module.exports = mapCacheHas;
var getMapData = require('./_getMapData');

/**
 * Sets the map `key` to `value`.
 *
 * @private
 * @name set
 * @memberOf MapCache
 * @param {string} key The key of the value to set.
 * @param {*} value The value to set.
 * @returns {Object} Returns the map cache instance.
 */
function mapCacheSet(key, value) {
  var data = getMapData(this, key),
      size = data.size;

  data.set(key, value);
  this.size += data.size == size ? 0 : 1;
  return this;
}

module.exports = mapCacheSet;
/**
 * Converts `map` to its key-value pairs.
 *
 * @private
 * @param {Object} map The map to convert.
 * @returns {Array} Returns the key-value pairs.
 */
function mapToArray(map) {
  var index = -1,
      result = Array(map.size);

  map.forEach(function(value, key) {
    result[++index] = [key, value];
  });
  return result;
}

module.exports = mapToArray;
/**
 * A specialized version of `matchesProperty` for source values suitable
 * for strict equality comparisons, i.e. `===`.
 *
 * @private
 * @param {string} key The key of the property to get.
 * @param {*} srcValue The value to match.
 * @returns {Function} Returns the new spec function.
 */
function matchesStrictComparable(key, srcValue) {
  return function(object) {
    if (object == null) {
      return false;
    }
    return object[key] === srcValue &&
      (srcValue !== undefined || (key in Object(object)));
  };
}

module.exports = matchesStrictComparable;
var memoize = require('./memoize');

/** Used as the maximum memoize cache size. */
var MAX_MEMOIZE_SIZE = 500;

/**
 * A specialized version of `_.memoize` which clears the memoized function's
 * cache when it exceeds `MAX_MEMOIZE_SIZE`.
 *
 * @private
 * @param {Function} func The function to have its output memoized.
 * @returns {Function} Returns the new memoized function.
 */
function memoizeCapped(func) {
  var result = memoize(func, function(key) {
    if (cache.size === MAX_MEMOIZE_SIZE) {
      cache.clear();
    }
    return key;
  });

  var cache = result.cache;
  return result;
}

module.exports = memoizeCapped;
var composeArgs = require('./_composeArgs'),
    composeArgsRight = require('./_composeArgsRight'),
    replaceHolders = require('./_replaceHolders');

/** Used as the internal argument placeholder. */
var PLACEHOLDER = '__lodash_placeholder__';

/** Used to compose bitmasks for function metadata. */
var WRAP_BIND_FLAG = 1,
    WRAP_BIND_KEY_FLAG = 2,
    WRAP_CURRY_BOUND_FLAG = 4,
    WRAP_CURRY_FLAG = 8,
    WRAP_ARY_FLAG = 128,
    WRAP_REARG_FLAG = 256;

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMin = Math.min;

/**
 * Merges the function metadata of `source` into `data`.
 *
 * Merging metadata reduces the number of wrappers used to invoke a function.
 * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
 * may be applied regardless of execution order. Methods like `_.ary` and
 * `_.rearg` modify function arguments, making the order in which they are
 * executed important, preventing the merging of metadata. However, we make
 * an exception for a safe combined case where curried functions have `_.ary`
 * and or `_.rearg` applied.
 *
 * @private
 * @param {Array} data The destination metadata.
 * @param {Array} source The source metadata.
 * @returns {Array} Returns `data`.
 */
function mergeData(data, source) {
  var bitmask = data[1],
      srcBitmask = source[1],
      newBitmask = bitmask | srcBitmask,
      isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);

  var isCombo =
    ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||
    ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||
    ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));

  // Exit early if metadata can't be merged.
  if (!(isCommon || isCombo)) {
    return data;
  }
  // Use source `thisArg` if available.
  if (srcBitmask & WRAP_BIND_FLAG) {
    data[2] = source[2];
    // Set when currying a bound function.
    newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;
  }
  // Compose partial arguments.
  var value = source[3];
  if (value) {
    var partials = data[3];
    data[3] = partials ? composeArgs(partials, value, source[4]) : value;
    data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];
  }
  // Compose partial right arguments.
  value = source[5];
  if (value) {
    partials = data[5];
    data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
    data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];
  }
  // Use source `argPos` if available.
  value = source[7];
  if (value) {
    data[7] = value;
  }
  // Use source `ary` if it's smaller.
  if (srcBitmask & WRAP_ARY_FLAG) {
    data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);
  }
  // Use source `arity` if one is not provided.
  if (data[9] == null) {
    data[9] = source[9];
  }
  // Use source `func` and merge bitmasks.
  data[0] = source[0];
  data[1] = newBitmask;

  return data;
}

module.exports = mergeData;
var WeakMap = require('./_WeakMap');

/** Used to store function metadata. */
var metaMap = WeakMap && new WeakMap;

module.exports = metaMap;
var getNative = require('./_getNative');

/* Built-in method references that are verified to be native. */
var nativeCreate = getNative(Object, 'create');

module.exports = nativeCreate;
var overArg = require('./_overArg');

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeKeys = overArg(Object.keys, Object);

module.exports = nativeKeys;
/**
 * This function is like
 * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
 * except that it includes inherited enumerable properties.
 *
 * @private
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of property names.
 */
function nativeKeysIn(object) {
  var result = [];
  if (object != null) {
    for (var key in Object(object)) {
      result.push(key);
    }
  }
  return result;
}

module.exports = nativeKeysIn;
var freeGlobal = require('./_freeGlobal');

/** Detect free variable `exports`. */
var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;

/** Detect free variable `module`. */
var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;

/** Detect the popular CommonJS extension `module.exports`. */
var moduleExports = freeModule && freeModule.exports === freeExports;

/** Detect free variable `process` from Node.js. */
var freeProcess = moduleExports && freeGlobal.process;

/** Used to access faster Node.js helpers. */
var nodeUtil = (function() {
  try {
    // Use `util.types` for Node.js 10+.
    var types = freeModule && freeModule.require && freeModule.require('util').types;

    if (types) {
      return types;
    }

    // Legacy `process.binding('util')` for Node.js < 10.
    return freeProcess && freeProcess.binding && freeProcess.binding('util');
  } catch (e) {}
}());

module.exports = nodeUtil;
/** Used for built-in method references. */
var objectProto = Object.prototype;

/**
 * Used to resolve the
 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
 * of values.
 */
var nativeObjectToString = objectProto.toString;

/**
 * Converts `value` to a string using `Object.prototype.toString`.
 *
 * @private
 * @param {*} value The value to convert.
 * @returns {string} Returns the converted string.
 */
function objectToString(value) {
  return nativeObjectToString.call(value);
}

module.exports = objectToString;
/**
 * Creates a unary function that invokes `func` with its argument transformed.
 *
 * @private
 * @param {Function} func The function to wrap.
 * @param {Function} transform The argument transform.
 * @returns {Function} Returns the new function.
 */
function overArg(func, transform) {
  return function(arg) {
    return func(transform(arg));
  };
}

module.exports = overArg;
var apply = require('./_apply');

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max;

/**
 * A specialized version of `baseRest` which transforms the rest array.
 *
 * @private
 * @param {Function} func The function to apply a rest parameter to.
 * @param {number} [start=func.length-1] The start position of the rest parameter.
 * @param {Function} transform The rest array transform.
 * @returns {Function} Returns the new function.
 */
function overRest(func, start, transform) {
  start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
  return function() {
    var args = arguments,
        index = -1,
        length = nativeMax(args.length - start, 0),
        array = Array(length);

    while (++index < length) {
      array[index] = args[start + index];
    }
    index = -1;
    var otherArgs = Array(start + 1);
    while (++index < start) {
      otherArgs[index] = args[index];
    }
    otherArgs[start] = transform(array);
    return apply(func, this, otherArgs);
  };
}

module.exports = overRest;
var baseGet = require('./_baseGet'),
    baseSlice = require('./_baseSlice');

/**
 * Gets the parent value at `path` of `object`.
 *
 * @private
 * @param {Object} object The object to query.
 * @param {Array} path The path to get the parent value of.
 * @returns {*} Returns the parent value.
 */
function parent(object, path) {
  return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
}

module.exports = parent;
/** Used to match template delimiters. */
var reEscape = /<%-([\s\S]+?)%>/g;

module.exports = reEscape;
/** Used to match template delimiters. */
var reEvaluate = /<%([\s\S]+?)%>/g;

module.exports = reEvaluate;
/** Used to match template delimiters. */
var reInterpolate = /<%=([\s\S]+?)%>/g;

module.exports = reInterpolate;
/** Used to lookup unminified function names. */
var realNames = {};

module.exports = realNames;
var copyArray = require('./_copyArray'),
    isIndex = require('./_isIndex');

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMin = Math.min;

/**
 * Reorder `array` according to the specified indexes where the element at
 * the first index is assigned as the first element, the element at
 * the second index is assigned as the second element, and so on.
 *
 * @private
 * @param {Array} array The array to reorder.
 * @param {Array} indexes The arranged array indexes.
 * @returns {Array} Returns `array`.
 */
function reorder(array, indexes) {
  var arrLength = array.length,
      length = nativeMin(indexes.length, arrLength),
      oldArray = copyArray(array);

  while (length--) {
    var index = indexes[length];
    array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
  }
  return array;
}

module.exports = reorder;
/** Used as the internal argument placeholder. */
var PLACEHOLDER = '__lodash_placeholder__';

/**
 * Replaces all `placeholder` elements in `array` with an internal placeholder
 * and returns an array of their indexes.
 *
 * @private
 * @param {Array} array The array to modify.
 * @param {*} placeholder The placeholder to replace.
 * @returns {Array} Returns the new array of placeholder indexes.
 */
function replaceHolders(array, placeholder) {
  var index = -1,
      length = array.length,
      resIndex = 0,
      result = [];

  while (++index < length) {
    var value = array[index];
    if (value === placeholder || value === PLACEHOLDER) {
      array[index] = PLACEHOLDER;
      result[resIndex++] = index;
    }
  }
  return result;
}

module.exports = replaceHolders;
var freeGlobal = require('./_freeGlobal');

/** Detect free variable `self`. */
var freeSelf = typeof self == 'object' && self && self.Object === Object && self;

/** Used as a reference to the global object. */
var root = freeGlobal || freeSelf || Function('return this')();

module.exports = root;
/**
 * Gets the value at `key`, unless `key` is "__proto__" or "constructor".
 *
 * @private
 * @param {Object} object The object to query.
 * @param {string} key The key of the property to get.
 * @returns {*} Returns the property value.
 */
function safeGet(object, key) {
  if (key === 'constructor' && typeof object[key] === 'function') {
    return;
  }

  if (key == '__proto__') {
    return;
  }

  return object[key];
}

module.exports = safeGet;
/** Used to stand-in for `undefined` hash values. */
var HASH_UNDEFINED = '__lodash_hash_undefined__';

/**
 * Adds `value` to the array cache.
 *
 * @private
 * @name add
 * @memberOf SetCache
 * @alias push
 * @param {*} value The value to cache.
 * @returns {Object} Returns the cache instance.
 */
function setCacheAdd(value) {
  this.__data__.set(value, HASH_UNDEFINED);
  return this;
}

module.exports = setCacheAdd;
/**
 * Checks if `value` is in the array cache.
 *
 * @private
 * @name has
 * @memberOf SetCache
 * @param {*} value The value to search for.
 * @returns {number} Returns `true` if `value` is found, else `false`.
 */
function setCacheHas(value) {
  return this.__data__.has(value);
}

module.exports = setCacheHas;
var baseSetData = require('./_baseSetData'),
    shortOut = require('./_shortOut');

/**
 * Sets metadata for `func`.
 *
 * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
 * period of time, it will trip its breaker and transition to an identity
 * function to avoid garbage collection pauses in V8. See
 * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
 * for more details.
 *
 * @private
 * @param {Function} func The function to associate metadata with.
 * @param {*} data The metadata.
 * @returns {Function} Returns `func`.
 */
var setData = shortOut(baseSetData);

module.exports = setData;
/**
 * Converts `set` to an array of its values.
 *
 * @private
 * @param {Object} set The set to convert.
 * @returns {Array} Returns the values.
 */
function setToArray(set) {
  var index = -1,
      result = Array(set.size);

  set.forEach(function(value) {
    result[++index] = value;
  });
  return result;
}

module.exports = setToArray;
/**
 * Converts `set` to its value-value pairs.
 *
 * @private
 * @param {Object} set The set to convert.
 * @returns {Array} Returns the value-value pairs.
 */
function setToPairs(set) {
  var index = -1,
      result = Array(set.size);

  set.forEach(function(value) {
    result[++index] = [value, value];
  });
  return result;
}

module.exports = setToPairs;
var baseSetToString = require('./_baseSetToString'),
    shortOut = require('./_shortOut');

/**
 * Sets the `toString` method of `func` to return `string`.
 *
 * @private
 * @param {Function} func The function to modify.
 * @param {Function} string The `toString` result.
 * @returns {Function} Returns `func`.
 */
var setToString = shortOut(baseSetToString);

module.exports = setToString;
var getWrapDetails = require('./_getWrapDetails'),
    insertWrapDetails = require('./_insertWrapDetails'),
    setToString = require('./_setToString'),
    updateWrapDetails = require('./_updateWrapDetails');

/**
 * Sets the `toString` method of `wrapper` to mimic the source of `reference`
 * with wrapper details in a comment at the top of the source body.
 *
 * @private
 * @param {Function} wrapper The function to modify.
 * @param {Function} reference The reference function.
 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
 * @returns {Function} Returns `wrapper`.
 */
function setWrapToString(wrapper, reference, bitmask) {
  var source = (reference + '');
  return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
}

module.exports = setWrapToString;
/** Used to detect hot functions by number of calls within a span of milliseconds. */
var HOT_COUNT = 800,
    HOT_SPAN = 16;

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeNow = Date.now;

/**
 * Creates a function that'll short out and invoke `identity` instead
 * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
 * milliseconds.
 *
 * @private
 * @param {Function} func The function to restrict.
 * @returns {Function} Returns the new shortable function.
 */
function shortOut(func) {
  var count = 0,
      lastCalled = 0;

  return function() {
    var stamp = nativeNow(),
        remaining = HOT_SPAN - (stamp - lastCalled);

    lastCalled = stamp;
    if (remaining > 0) {
      if (++count >= HOT_COUNT) {
        return arguments[0];
      }
    } else {
      count = 0;
    }
    return func.apply(undefined, arguments);
  };
}

module.exports = shortOut;
var baseRandom = require('./_baseRandom');

/**
 * A specialized version of `_.shuffle` which mutates and sets the size of `array`.
 *
 * @private
 * @param {Array} array The array to shuffle.
 * @param {number} [size=array.length] The size of `array`.
 * @returns {Array} Returns `array`.
 */
function shuffleSelf(array, size) {
  var index = -1,
      length = array.length,
      lastIndex = length - 1;

  size = size === undefined ? length : size;
  while (++index < size) {
    var rand = baseRandom(index, lastIndex),
        value = array[rand];

    array[rand] = array[index];
    array[index] = value;
  }
  array.length = size;
  return array;
}

module.exports = shuffleSelf;
var ListCache = require('./_ListCache');

/**
 * Removes all key-value entries from the stack.
 *
 * @private
 * @name clear
 * @memberOf Stack
 */
function stackClear() {
  this.__data__ = new ListCache;
  this.size = 0;
}

module.exports = stackClear;
/**
 * Removes `key` and its value from the stack.
 *
 * @private
 * @name delete
 * @memberOf Stack
 * @param {string} key The key of the value to remove.
 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
 */
function stackDelete(key) {
  var data = this.__data__,
      result = data['delete'](key);

  this.size = data.size;
  return result;
}

module.exports = stackDelete;
/**
 * Gets the stack value for `key`.
 *
 * @private
 * @name get
 * @memberOf Stack
 * @param {string} key The key of the value to get.
 * @returns {*} Returns the entry value.
 */
function stackGet(key) {
  return this.__data__.get(key);
}

module.exports = stackGet;
/**
 * Checks if a stack value for `key` exists.
 *
 * @private
 * @name has
 * @memberOf Stack
 * @param {string} key The key of the entry to check.
 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
 */
function stackHas(key) {
  return this.__data__.has(key);
}

module.exports = stackHas;
var ListCache = require('./_ListCache'),
    Map = require('./_Map'),
    MapCache = require('./_MapCache');

/** Used as the size to enable large array optimizations. */
var LARGE_ARRAY_SIZE = 200;

/**
 * Sets the stack `key` to `value`.
 *
 * @private
 * @name set
 * @memberOf Stack
 * @param {string} key The key of the value to set.
 * @param {*} value The value to set.
 * @returns {Object} Returns the stack cache instance.
 */
function stackSet(key, value) {
  var data = this.__data__;
  if (data instanceof ListCache) {
    var pairs = data.__data__;
    if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
      pairs.push([key, value]);
      this.size = ++data.size;
      return this;
    }
    data = this.__data__ = new MapCache(pairs);
  }
  data.set(key, value);
  this.size = data.size;
  return this;
}

module.exports = stackSet;
/**
 * A specialized version of `_.indexOf` which performs strict equality
 * comparisons of values, i.e. `===`.
 *
 * @private
 * @param {Array} array The array to inspect.
 * @param {*} value The value to search for.
 * @param {number} fromIndex The index to search from.
 * @returns {number} Returns the index of the matched value, else `-1`.
 */
function strictIndexOf(array, value, fromIndex) {
  var index = fromIndex - 1,
      length = array.length;

  while (++index < length) {
    if (array[index] === value) {
      return index;
    }
  }
  return -1;
}

module.exports = strictIndexOf;
/**
 * A specialized version of `_.lastIndexOf` which performs strict equality
 * comparisons of values, i.e. `===`.
 *
 * @private
 * @param {Array} array The array to inspect.
 * @param {*} value The value to search for.
 * @param {number} fromIndex The index to search from.
 * @returns {number} Returns the index of the matched value, else `-1`.
 */
function strictLastIndexOf(array, value, fromIndex) {
  var index = fromIndex + 1;
  while (index--) {
    if (array[index] === value) {
      return index;
    }
  }
  return index;
}

module.exports = strictLastIndexOf;
var asciiSize = require('./_asciiSize'),
    hasUnicode = require('./_hasUnicode'),
    unicodeSize = require('./_unicodeSize');

/**
 * Gets the number of symbols in `string`.
 *
 * @private
 * @param {string} string The string to inspect.
 * @returns {number} Returns the string size.
 */
function stringSize(string) {
  return hasUnicode(string)
    ? unicodeSize(string)
    : asciiSize(string);
}

module.exports = stringSize;
var asciiToArray = require('./_asciiToArray'),
    hasUnicode = require('./_hasUnicode'),
    unicodeToArray = require('./_unicodeToArray');

/**
 * Converts `string` to an array.
 *
 * @private
 * @param {string} string The string to convert.
 * @returns {Array} Returns the converted array.
 */
function stringToArray(string) {
  return hasUnicode(string)
    ? unicodeToArray(string)
    : asciiToArray(string);
}

module.exports = stringToArray;
var memoizeCapped = require('./_memoizeCapped');

/** Used to match property names within property paths. */
var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;

/** Used to match backslashes in property paths. */
var reEscapeChar = /\\(\\)?/g;

/**
 * Converts `string` to a property path array.
 *
 * @private
 * @param {string} string The string to convert.
 * @returns {Array} Returns the property path array.
 */
var stringToPath = memoizeCapped(function(string) {
  var result = [];
  if (string.charCodeAt(0) === 46 /* . */) {
    result.push('');
  }
  string.replace(rePropName, function(match, number, quote, subString) {
    result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
  });
  return result;
});

module.exports = stringToPath;
var isSymbol = require('./isSymbol');

/** Used as references for various `Number` constants. */
var INFINITY = 1 / 0;

/**
 * Converts `value` to a string key if it's not a string or symbol.
 *
 * @private
 * @param {*} value The value to inspect.
 * @returns {string|symbol} Returns the key.
 */
function toKey(value) {
  if (typeof value == 'string' || isSymbol(value)) {
    return value;
  }
  var result = (value + '');
  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
}

module.exports = toKey;
/** Used for built-in method references. */
var funcProto = Function.prototype;

/** Used to resolve the decompiled source of functions. */
var funcToString = funcProto.toString;

/**
 * Converts `func` to its source code.
 *
 * @private
 * @param {Function} func The function to convert.
 * @returns {string} Returns the source code.
 */
function toSource(func) {
  if (func != null) {
    try {
      return funcToString.call(func);
    } catch (e) {}
    try {
      return (func + '');
    } catch (e) {}
  }
  return '';
}

module.exports = toSource;
/** Used to match a single whitespace character. */
var reWhitespace = /\s/;

/**
 * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace
 * character of `string`.
 *
 * @private
 * @param {string} string The string to inspect.
 * @returns {number} Returns the index of the last non-whitespace character.
 */
function trimmedEndIndex(string) {
  var index = string.length;

  while (index-- && reWhitespace.test(string.charAt(index))) {}
  return index;
}

module.exports = trimmedEndIndex;
var basePropertyOf = require('./_basePropertyOf');

/** Used to map HTML entities to characters. */
var htmlUnescapes = {
  '&amp;': '&',
  '&lt;': '<',
  '&gt;': '>',
  '&quot;': '"',
  '&#39;': "'"
};

/**
 * Used by `_.unescape` to convert HTML entities to characters.
 *
 * @private
 * @param {string} chr The matched character to unescape.
 * @returns {string} Returns the unescaped character.
 */
var unescapeHtmlChar = basePropertyOf(htmlUnescapes);

module.exports = unescapeHtmlChar;
/** Used to compose unicode character classes. */
var rsAstralRange = '\\ud800-\\udfff',
    rsComboMarksRange = '\\u0300-\\u036f',
    reComboHalfMarksRange = '\\ufe20-\\ufe2f',
    rsComboSymbolsRange = '\\u20d0-\\u20ff',
    rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,
    rsVarRange = '\\ufe0e\\ufe0f';

/** Used to compose unicode capture groups. */
var rsAstral = '[' + rsAstralRange + ']',
    rsCombo = '[' + rsComboRange + ']',
    rsFitz = '\\ud83c[\\udffb-\\udfff]',
    rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',
    rsNonAstral = '[^' + rsAstralRange + ']',
    rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}',
    rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]',
    rsZWJ = '\\u200d';

/** Used to compose unicode regexes. */
var reOptMod = rsModifier + '?',
    rsOptVar = '[' + rsVarRange + ']?',
    rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',
    rsSeq = rsOptVar + reOptMod + rsOptJoin,
    rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';

/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');

/**
 * Gets the size of a Unicode `string`.
 *
 * @private
 * @param {string} string The string inspect.
 * @returns {number} Returns the string size.
 */
function unicodeSize(string) {
  var result = reUnicode.lastIndex = 0;
  while (reUnicode.test(string)) {
    ++result;
  }
  return result;
}

module.exports = unicodeSize;
/** Used to compose unicode character classes. */
var rsAstralRange = '\\ud800-\\udfff',
    rsComboMarksRange = '\\u0300-\\u036f',
    reComboHalfMarksRange = '\\ufe20-\\ufe2f',
    rsComboSymbolsRange = '\\u20d0-\\u20ff',
    rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,
    rsVarRange = '\\ufe0e\\ufe0f';

/** Used to compose unicode capture groups. */
var rsAstral = '[' + rsAstralRange + ']',
    rsCombo = '[' + rsComboRange + ']',
    rsFitz = '\\ud83c[\\udffb-\\udfff]',
    rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',
    rsNonAstral = '[^' + rsAstralRange + ']',
    rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}',
    rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]',
    rsZWJ = '\\u200d';

/** Used to compose unicode regexes. */
var reOptMod = rsModifier + '?',
    rsOptVar = '[' + rsVarRange + ']?',
    rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',
    rsSeq = rsOptVar + reOptMod + rsOptJoin,
    rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';

/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');

/**
 * Converts a Unicode `string` to an array.
 *
 * @private
 * @param {string} string The string to convert.
 * @returns {Array} Returns the converted array.
 */
function unicodeToArray(string) {
  return string.match(reUnicode) || [];
}

module.exports = unicodeToArray;
/** Used to compose unicode character classes. */
var rsAstralRange = '\\ud800-\\udfff',
    rsComboMarksRange = '\\u0300-\\u036f',
    reComboHalfMarksRange = '\\ufe20-\\ufe2f',
    rsComboSymbolsRange = '\\u20d0-\\u20ff',
    rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,
    rsDingbatRange = '\\u2700-\\u27bf',
    rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff',
    rsMathOpRange = '\\xac\\xb1\\xd7\\xf7',
    rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf',
    rsPunctuationRange = '\\u2000-\\u206f',
    rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000',
    rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde',
    rsVarRange = '\\ufe0e\\ufe0f',
    rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;

/** Used to compose unicode capture groups. */
var rsApos = "['\u2019]",
    rsBreak = '[' + rsBreakRange + ']',
    rsCombo = '[' + rsComboRange + ']',
    rsDigits = '\\d+',
    rsDingbat = '[' + rsDingbatRange + ']',
    rsLower = '[' + rsLowerRange + ']',
    rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',
    rsFitz = '\\ud83c[\\udffb-\\udfff]',
    rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',
    rsNonAstral = '[^' + rsAstralRange + ']',
    rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}',
    rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]',
    rsUpper = '[' + rsUpperRange + ']',
    rsZWJ = '\\u200d';

/** Used to compose unicode regexes. */
var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',
    rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',
    rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',
    rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',
    reOptMod = rsModifier + '?',
    rsOptVar = '[' + rsVarRange + ']?',
    rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',
    rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])',
    rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])',
    rsSeq = rsOptVar + reOptMod + rsOptJoin,
    rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq;

/** Used to match complex or compound words. */
var reUnicodeWord = RegExp([
  rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',
  rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',
  rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,
  rsUpper + '+' + rsOptContrUpper,
  rsOrdUpper,
  rsOrdLower,
  rsDigits,
  rsEmoji
].join('|'), 'g');

/**
 * Splits a Unicode `string` into an array of its words.
 *
 * @private
 * @param {string} The string to inspect.
 * @returns {Array} Returns the words of `string`.
 */
function unicodeWords(string) {
  return string.match(reUnicodeWord) || [];
}

module.exports = unicodeWords;
var arrayEach = require('./_arrayEach'),
    arrayIncludes = require('./_arrayIncludes');

/** Used to compose bitmasks for function metadata. */
var WRAP_BIND_FLAG = 1,
    WRAP_BIND_KEY_FLAG = 2,
    WRAP_CURRY_FLAG = 8,
    WRAP_CURRY_RIGHT_FLAG = 16,
    WRAP_PARTIAL_FLAG = 32,
    WRAP_PARTIAL_RIGHT_FLAG = 64,
    WRAP_ARY_FLAG = 128,
    WRAP_REARG_FLAG = 256,
    WRAP_FLIP_FLAG = 512;

/** Used to associate wrap methods with their bit flags. */
var wrapFlags = [
  ['ary', WRAP_ARY_FLAG],
  ['bind', WRAP_BIND_FLAG],
  ['bindKey', WRAP_BIND_KEY_FLAG],
  ['curry', WRAP_CURRY_FLAG],
  ['curryRight', WRAP_CURRY_RIGHT_FLAG],
  ['flip', WRAP_FLIP_FLAG],
  ['partial', WRAP_PARTIAL_FLAG],
  ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
  ['rearg', WRAP_REARG_FLAG]
];

/**
 * Updates wrapper `details` based on `bitmask` flags.
 *
 * @private
 * @returns {Array} details The details to modify.
 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
 * @returns {Array} Returns `details`.
 */
function updateWrapDetails(details, bitmask) {
  arrayEach(wrapFlags, function(pair) {
    var value = '_.' + pair[0];
    if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
      details.push(value);
    }
  });
  return details.sort();
}

module.exports = updateWrapDetails;
var LazyWrapper = require('./_LazyWrapper'),
    LodashWrapper = require('./_LodashWrapper'),
    copyArray = require('./_copyArray');

/**
 * Creates a clone of `wrapper`.
 *
 * @private
 * @param {Object} wrapper The wrapper to clone.
 * @returns {Object} Returns the cloned wrapper.
 */
function wrapperClone(wrapper) {
  if (wrapper instanceof LazyWrapper) {
    return wrapper.clone();
  }
  var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
  result.__actions__ = copyArray(wrapper.__actions__);
  result.__index__  = wrapper.__index__;
  result.__values__ = wrapper.__values__;
  return result;
}

module.exports = wrapperClone;
var createMathOperation = require('./_createMathOperation');

/**
 * Adds two numbers.
 *
 * @static
 * @memberOf _
 * @since 3.4.0
 * @category Math
 * @param {number} augend The first number in an addition.
 * @param {number} addend The second number in an addition.
 * @returns {number} Returns the total.
 * @example
 *
 * _.add(6, 4);
 * // => 10
 */
var add = createMathOperation(function(augend, addend) {
  return augend + addend;
}, 0);

module.exports = add;
var toInteger = require('./toInteger');

/** Error message constants. */
var FUNC_ERROR_TEXT = 'Expected a function';

/**
 * The opposite of `_.before`; this method creates a function that invokes
 * `func` once it's called `n` or more times.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Function
 * @param {number} n The number of calls before `func` is invoked.
 * @param {Function} func The function to restrict.
 * @returns {Function} Returns the new restricted function.
 * @example
 *
 * var saves = ['profile', 'settings'];
 *
 * var done = _.after(saves.length, function() {
 *   console.log('done saving!');
 * });
 *
 * _.forEach(saves, function(type) {
 *   asyncSave({ 'type': type, 'complete': done });
 * });
 * // => Logs 'done saving!' after the two async saves have completed.
 */
function after(n, func) {
  if (typeof func != 'function') {
    throw new TypeError(FUNC_ERROR_TEXT);
  }
  n = toInteger(n);
  return function() {
    if (--n < 1) {
      return func.apply(this, arguments);
    }
  };
}

module.exports = after;
module.exports = {
  'chunk': require('./chunk'),
  'compact': require('./compact'),
  'concat': require('./concat'),
  'difference': require('./difference'),
  'differenceBy': require('./differenceBy'),
  'differenceWith': require('./differenceWith'),
  'drop': require('./drop'),
  'dropRight': require('./dropRight'),
  'dropRightWhile': require('./dropRightWhile'),
  'dropWhile': require('./dropWhile'),
  'fill': require('./fill'),
  'findIndex': require('./findIndex'),
  'findLastIndex': require('./findLastIndex'),
  'first': require('./first'),
  'flatten': require('./flatten'),
  'flattenDeep': require('./flattenDeep'),
  'flattenDepth': require('./flattenDepth'),
  'fromPairs': require('./fromPairs'),
  'head': require('./head'),
  'indexOf': require('./indexOf'),
  'initial': require('./initial'),
  'intersection': require('./intersection'),
  'intersectionBy': require('./intersectionBy'),
  'intersectionWith': require('./intersectionWith'),
  'join': require('./join'),
  'last': require('./last'),
  'lastIndexOf': require('./lastIndexOf'),
  'nth': require('./nth'),
  'pull': require('./pull'),
  'pullAll': require('./pullAll'),
  'pullAllBy': require('./pullAllBy'),
  'pullAllWith': require('./pullAllWith'),
  'pullAt': require('./pullAt'),
  'remove': require('./remove'),
  'reverse': require('./reverse'),
  'slice': require('./slice'),
  'sortedIndex': require('./sortedIndex'),
  'sortedIndexBy': require('./sortedIndexBy'),
  'sortedIndexOf': require('./sortedIndexOf'),
  'sortedLastIndex': require('./sortedLastIndex'),
  'sortedLastIndexBy': require('./sortedLastIndexBy'),
  'sortedLastIndexOf': require('./sortedLastIndexOf'),
  'sortedUniq': require('./sortedUniq'),
  'sortedUniqBy': require('./sortedUniqBy'),
  'tail': require('./tail'),
  'take': require('./take'),
  'takeRight': require('./takeRight'),
  'takeRightWhile': require('./takeRightWhile'),
  'takeWhile': require('./takeWhile'),
  'union': require('./union'),
  'unionBy': require('./unionBy'),
  'unionWith': require('./unionWith'),
  'uniq': require('./uniq'),
  'uniqBy': require('./uniqBy'),
  'uniqWith': require('./uniqWith'),
  'unzip': require('./unzip'),
  'unzipWith': require('./unzipWith'),
  'without': require('./without'),
  'xor': require('./xor'),
  'xorBy': require('./xorBy'),
  'xorWith': require('./xorWith'),
  'zip': require('./zip'),
  'zipObject': require('./zipObject'),
  'zipObjectDeep': require('./zipObjectDeep'),
  'zipWith': require('./zipWith')
};
var createWrap = require('./_createWrap');

/** Used to compose bitmasks for function metadata. */
var WRAP_ARY_FLAG = 128;

/**
 * Creates a function that invokes `func`, with up to `n` arguments,
 * ignoring any additional arguments.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Function
 * @param {Function} func The function to cap arguments for.
 * @param {number} [n=func.length] The arity cap.
 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
 * @returns {Function} Returns the new capped function.
 * @example
 *
 * _.map(['6', '8', '10'], _.ary(parseInt, 1));
 * // => [6, 8, 10]
 */
function ary(func, n, guard) {
  n = guard ? undefined : n;
  n = (func && n == null) ? func.length : n;
  return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);
}

module.exports = ary;
var assignValue = require('./_assignValue'),
    copyObject = require('./_copyObject'),
    createAssigner = require('./_createAssigner'),
    isArrayLike = require('./isArrayLike'),
    isPrototype = require('./_isPrototype'),
    keys = require('./keys');

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * Assigns own enumerable string keyed properties of source objects to the
 * destination object. Source objects are applied from left to right.
 * Subsequent sources overwrite property assignments of previous sources.
 *
 * **Note:** This method mutates `object` and is loosely based on
 * [`Object.assign`](https://mdn.io/Object/assign).
 *
 * @static
 * @memberOf _
 * @since 0.10.0
 * @category Object
 * @param {Object} object The destination object.
 * @param {...Object} [sources] The source objects.
 * @returns {Object} Returns `object`.
 * @see _.assignIn
 * @example
 *
 * function Foo() {
 *   this.a = 1;
 * }
 *
 * function Bar() {
 *   this.c = 3;
 * }
 *
 * Foo.prototype.b = 2;
 * Bar.prototype.d = 4;
 *
 * _.assign({ 'a': 0 }, new Foo, new Bar);
 * // => { 'a': 1, 'c': 3 }
 */
var assign = createAssigner(function(object, source) {
  if (isPrototype(source) || isArrayLike(source)) {
    copyObject(source, keys(source), object);
    return;
  }
  for (var key in source) {
    if (hasOwnProperty.call(source, key)) {
      assignValue(object, key, source[key]);
    }
  }
});

module.exports = assign;
var copyObject = require('./_copyObject'),
    createAssigner = require('./_createAssigner'),
    keysIn = require('./keysIn');

/**
 * This method is like `_.assign` except that it iterates over own and
 * inherited source properties.
 *
 * **Note:** This method mutates `object`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @alias extend
 * @category Object
 * @param {Object} object The destination object.
 * @param {...Object} [sources] The source objects.
 * @returns {Object} Returns `object`.
 * @see _.assign
 * @example
 *
 * function Foo() {
 *   this.a = 1;
 * }
 *
 * function Bar() {
 *   this.c = 3;
 * }
 *
 * Foo.prototype.b = 2;
 * Bar.prototype.d = 4;
 *
 * _.assignIn({ 'a': 0 }, new Foo, new Bar);
 * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
 */
var assignIn = createAssigner(function(object, source) {
  copyObject(source, keysIn(source), object);
});

module.exports = assignIn;
var copyObject = require('./_copyObject'),
    createAssigner = require('./_createAssigner'),
    keysIn = require('./keysIn');

/**
 * This method is like `_.assignIn` except that it accepts `customizer`
 * which is invoked to produce the assigned values. If `customizer` returns
 * `undefined`, assignment is handled by the method instead. The `customizer`
 * is invoked with five arguments: (objValue, srcValue, key, object, source).
 *
 * **Note:** This method mutates `object`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @alias extendWith
 * @category Object
 * @param {Object} object The destination object.
 * @param {...Object} sources The source objects.
 * @param {Function} [customizer] The function to customize assigned values.
 * @returns {Object} Returns `object`.
 * @see _.assignWith
 * @example
 *
 * function customizer(objValue, srcValue) {
 *   return _.isUndefined(objValue) ? srcValue : objValue;
 * }
 *
 * var defaults = _.partialRight(_.assignInWith, customizer);
 *
 * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
 * // => { 'a': 1, 'b': 2 }
 */
var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {
  copyObject(source, keysIn(source), object, customizer);
});

module.exports = assignInWith;
var copyObject = require('./_copyObject'),
    createAssigner = require('./_createAssigner'),
    keys = require('./keys');

/**
 * This method is like `_.assign` except that it accepts `customizer`
 * which is invoked to produce the assigned values. If `customizer` returns
 * `undefined`, assignment is handled by the method instead. The `customizer`
 * is invoked with five arguments: (objValue, srcValue, key, object, source).
 *
 * **Note:** This method mutates `object`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Object
 * @param {Object} object The destination object.
 * @param {...Object} sources The source objects.
 * @param {Function} [customizer] The function to customize assigned values.
 * @returns {Object} Returns `object`.
 * @see _.assignInWith
 * @example
 *
 * function customizer(objValue, srcValue) {
 *   return _.isUndefined(objValue) ? srcValue : objValue;
 * }
 *
 * var defaults = _.partialRight(_.assignWith, customizer);
 *
 * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
 * // => { 'a': 1, 'b': 2 }
 */
var assignWith = createAssigner(function(object, source, srcIndex, customizer) {
  copyObject(source, keys(source), object, customizer);
});

module.exports = assignWith;
var baseAt = require('./_baseAt'),
    flatRest = require('./_flatRest');

/**
 * Creates an array of values corresponding to `paths` of `object`.
 *
 * @static
 * @memberOf _
 * @since 1.0.0
 * @category Object
 * @param {Object} object The object to iterate over.
 * @param {...(string|string[])} [paths] The property paths to pick.
 * @returns {Array} Returns the picked values.
 * @example
 *
 * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
 *
 * _.at(object, ['a[0].b.c', 'a[1]']);
 * // => [3, 4]
 */
var at = flatRest(baseAt);

module.exports = at;
var apply = require('./_apply'),
    baseRest = require('./_baseRest'),
    isError = require('./isError');

/**
 * Attempts to invoke `func`, returning either the result or the caught error
 * object. Any additional arguments are provided to `func` when it's invoked.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Util
 * @param {Function} func The function to attempt.
 * @param {...*} [args] The arguments to invoke `func` with.
 * @returns {*} Returns the `func` result or error object.
 * @example
 *
 * // Avoid throwing errors for invalid selectors.
 * var elements = _.attempt(function(selector) {
 *   return document.querySelectorAll(selector);
 * }, '>_>');
 *
 * if (_.isError(elements)) {
 *   elements = [];
 * }
 */
var attempt = baseRest(function(func, args) {
  try {
    return apply(func, undefined, args);
  } catch (e) {
    return isError(e) ? e : new Error(e);
  }
});

module.exports = attempt;
var toInteger = require('./toInteger');

/** Error message constants. */
var FUNC_ERROR_TEXT = 'Expected a function';

/**
 * Creates a function that invokes `func`, with the `this` binding and arguments
 * of the created function, while it's called less than `n` times. Subsequent
 * calls to the created function return the result of the last `func` invocation.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Function
 * @param {number} n The number of calls at which `func` is no longer invoked.
 * @param {Function} func The function to restrict.
 * @returns {Function} Returns the new restricted function.
 * @example
 *
 * jQuery(element).on('click', _.before(5, addContactToList));
 * // => Allows adding up to 4 contacts to the list.
 */
function before(n, func) {
  var result;
  if (typeof func != 'function') {
    throw new TypeError(FUNC_ERROR_TEXT);
  }
  n = toInteger(n);
  return function() {
    if (--n > 0) {
      result = func.apply(this, arguments);
    }
    if (n <= 1) {
      func = undefined;
    }
    return result;
  };
}

module.exports = before;
var baseRest = require('./_baseRest'),
    createWrap = require('./_createWrap'),
    getHolder = require('./_getHolder'),
    replaceHolders = require('./_replaceHolders');

/** Used to compose bitmasks for function metadata. */
var WRAP_BIND_FLAG = 1,
    WRAP_PARTIAL_FLAG = 32;

/**
 * Creates a function that invokes `func` with the `this` binding of `thisArg`
 * and `partials` prepended to the arguments it receives.
 *
 * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
 * may be used as a placeholder for partially applied arguments.
 *
 * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
 * property of bound functions.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Function
 * @param {Function} func The function to bind.
 * @param {*} thisArg The `this` binding of `func`.
 * @param {...*} [partials] The arguments to be partially applied.
 * @returns {Function} Returns the new bound function.
 * @example
 *
 * function greet(greeting, punctuation) {
 *   return greeting + ' ' + this.user + punctuation;
 * }
 *
 * var object = { 'user': 'fred' };
 *
 * var bound = _.bind(greet, object, 'hi');
 * bound('!');
 * // => 'hi fred!'
 *
 * // Bound with placeholders.
 * var bound = _.bind(greet, object, _, '!');
 * bound('hi');
 * // => 'hi fred!'
 */
var bind = baseRest(function(func, thisArg, partials) {
  var bitmask = WRAP_BIND_FLAG;
  if (partials.length) {
    var holders = replaceHolders(partials, getHolder(bind));
    bitmask |= WRAP_PARTIAL_FLAG;
  }
  return createWrap(func, bitmask, thisArg, partials, holders);
});

// Assign default placeholders.
bind.placeholder = {};

module.exports = bind;
var arrayEach = require('./_arrayEach'),
    baseAssignValue = require('./_baseAssignValue'),
    bind = require('./bind'),
    flatRest = require('./_flatRest'),
    toKey = require('./_toKey');

/**
 * Binds methods of an object to the object itself, overwriting the existing
 * method.
 *
 * **Note:** This method doesn't set the "length" property of bound functions.
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category Util
 * @param {Object} object The object to bind and assign the bound methods to.
 * @param {...(string|string[])} methodNames The object method names to bind.
 * @returns {Object} Returns `object`.
 * @example
 *
 * var view = {
 *   'label': 'docs',
 *   'click': function() {
 *     console.log('clicked ' + this.label);
 *   }
 * };
 *
 * _.bindAll(view, ['click']);
 * jQuery(element).on('click', view.click);
 * // => Logs 'clicked docs' when clicked.
 */
var bindAll = flatRest(function(object, methodNames) {
  arrayEach(methodNames, function(key) {
    key = toKey(key);
    baseAssignValue(object, key, bind(object[key], object));
  });
  return object;
});

module.exports = bindAll;
var baseRest = require('./_baseRest'),
    createWrap = require('./_createWrap'),
    getHolder = require('./_getHolder'),
    replaceHolders = require('./_replaceHolders');

/** Used to compose bitmasks for function metadata. */
var WRAP_BIND_FLAG = 1,
    WRAP_BIND_KEY_FLAG = 2,
    WRAP_PARTIAL_FLAG = 32;

/**
 * Creates a function that invokes the method at `object[key]` with `partials`
 * prepended to the arguments it receives.
 *
 * This method differs from `_.bind` by allowing bound functions to reference
 * methods that may be redefined or don't yet exist. See
 * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)
 * for more details.
 *
 * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic
 * builds, may be used as a placeholder for partially applied arguments.
 *
 * @static
 * @memberOf _
 * @since 0.10.0
 * @category Function
 * @param {Object} object The object to invoke the method on.
 * @param {string} key The key of the method.
 * @param {...*} [partials] The arguments to be partially applied.
 * @returns {Function} Returns the new bound function.
 * @example
 *
 * var object = {
 *   'user': 'fred',
 *   'greet': function(greeting, punctuation) {
 *     return greeting + ' ' + this.user + punctuation;
 *   }
 * };
 *
 * var bound = _.bindKey(object, 'greet', 'hi');
 * bound('!');
 * // => 'hi fred!'
 *
 * object.greet = function(greeting, punctuation) {
 *   return greeting + 'ya ' + this.user + punctuation;
 * };
 *
 * bound('!');
 * // => 'hiya fred!'
 *
 * // Bound with placeholders.
 * var bound = _.bindKey(object, 'greet', _, '!');
 * bound('hi');
 * // => 'hiya fred!'
 */
var bindKey = baseRest(function(object, key, partials) {
  var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;
  if (partials.length) {
    var holders = replaceHolders(partials, getHolder(bindKey));
    bitmask |= WRAP_PARTIAL_FLAG;
  }
  return createWrap(key, bitmask, object, partials, holders);
});

// Assign default placeholders.
bindKey.placeholder = {};

module.exports = bindKey;
var capitalize = require('./capitalize'),
    createCompounder = require('./_createCompounder');

/**
 * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category String
 * @param {string} [string=''] The string to convert.
 * @returns {string} Returns the camel cased string.
 * @example
 *
 * _.camelCase('Foo Bar');
 * // => 'fooBar'
 *
 * _.camelCase('--foo-bar--');
 * // => 'fooBar'
 *
 * _.camelCase('__FOO_BAR__');
 * // => 'fooBar'
 */
var camelCase = createCompounder(function(result, word, index) {
  word = word.toLowerCase();
  return result + (index ? capitalize(word) : word);
});

module.exports = camelCase;
var toString = require('./toString'),
    upperFirst = require('./upperFirst');

/**
 * Converts the first character of `string` to upper case and the remaining
 * to lower case.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category String
 * @param {string} [string=''] The string to capitalize.
 * @returns {string} Returns the capitalized string.
 * @example
 *
 * _.capitalize('FRED');
 * // => 'Fred'
 */
function capitalize(string) {
  return upperFirst(toString(string).toLowerCase());
}

module.exports = capitalize;
var isArray = require('./isArray');

/**
 * Casts `value` as an array if it's not one.
 *
 * @static
 * @memberOf _
 * @since 4.4.0
 * @category Lang
 * @param {*} value The value to inspect.
 * @returns {Array} Returns the cast array.
 * @example
 *
 * _.castArray(1);
 * // => [1]
 *
 * _.castArray({ 'a': 1 });
 * // => [{ 'a': 1 }]
 *
 * _.castArray('abc');
 * // => ['abc']
 *
 * _.castArray(null);
 * // => [null]
 *
 * _.castArray(undefined);
 * // => [undefined]
 *
 * _.castArray();
 * // => []
 *
 * var array = [1, 2, 3];
 * console.log(_.castArray(array) === array);
 * // => true
 */
function castArray() {
  if (!arguments.length) {
    return [];
  }
  var value = arguments[0];
  return isArray(value) ? value : [value];
}

module.exports = castArray;
var createRound = require('./_createRound');

/**
 * Computes `number` rounded up to `precision`.
 *
 * @static
 * @memberOf _
 * @since 3.10.0
 * @category Math
 * @param {number} number The number to round up.
 * @param {number} [precision=0] The precision to round up to.
 * @returns {number} Returns the rounded up number.
 * @example
 *
 * _.ceil(4.006);
 * // => 5
 *
 * _.ceil(6.004, 2);
 * // => 6.01
 *
 * _.ceil(6040, -2);
 * // => 6100
 */
var ceil = createRound('ceil');

module.exports = ceil;
var lodash = require('./wrapperLodash');

/**
 * Creates a `lodash` wrapper instance that wraps `value` with explicit method
 * chain sequences enabled. The result of such sequences must be unwrapped
 * with `_#value`.
 *
 * @static
 * @memberOf _
 * @since 1.3.0
 * @category Seq
 * @param {*} value The value to wrap.
 * @returns {Object} Returns the new `lodash` wrapper instance.
 * @example
 *
 * var users = [
 *   { 'user': 'barney',  'age': 36 },
 *   { 'user': 'fred',    'age': 40 },
 *   { 'user': 'pebbles', 'age': 1 }
 * ];
 *
 * var youngest = _
 *   .chain(users)
 *   .sortBy('age')
 *   .map(function(o) {
 *     return o.user + ' is ' + o.age;
 *   })
 *   .head()
 *   .value();
 * // => 'pebbles is 1'
 */
function chain(value) {
  var result = lodash(value);
  result.__chain__ = true;
  return result;
}

module.exports = chain;
var baseSlice = require('./_baseSlice'),
    isIterateeCall = require('./_isIterateeCall'),
    toInteger = require('./toInteger');

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeCeil = Math.ceil,
    nativeMax = Math.max;

/**
 * Creates an array of elements split into groups the length of `size`.
 * If `array` can't be split evenly, the final chunk will be the remaining
 * elements.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Array
 * @param {Array} array The array to process.
 * @param {number} [size=1] The length of each chunk
 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
 * @returns {Array} Returns the new array of chunks.
 * @example
 *
 * _.chunk(['a', 'b', 'c', 'd'], 2);
 * // => [['a', 'b'], ['c', 'd']]
 *
 * _.chunk(['a', 'b', 'c', 'd'], 3);
 * // => [['a', 'b', 'c'], ['d']]
 */
function chunk(array, size, guard) {
  if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
    size = 1;
  } else {
    size = nativeMax(toInteger(size), 0);
  }
  var length = array == null ? 0 : array.length;
  if (!length || size < 1) {
    return [];
  }
  var index = 0,
      resIndex = 0,
      result = Array(nativeCeil(length / size));

  while (index < length) {
    result[resIndex++] = baseSlice(array, index, (index += size));
  }
  return result;
}

module.exports = chunk;
var baseClamp = require('./_baseClamp'),
    toNumber = require('./toNumber');

/**
 * Clamps `number` within the inclusive `lower` and `upper` bounds.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Number
 * @param {number} number The number to clamp.
 * @param {number} [lower] The lower bound.
 * @param {number} upper The upper bound.
 * @returns {number} Returns the clamped number.
 * @example
 *
 * _.clamp(-10, -5, 5);
 * // => -5
 *
 * _.clamp(10, -5, 5);
 * // => 5
 */
function clamp(number, lower, upper) {
  if (upper === undefined) {
    upper = lower;
    lower = undefined;
  }
  if (upper !== undefined) {
    upper = toNumber(upper);
    upper = upper === upper ? upper : 0;
  }
  if (lower !== undefined) {
    lower = toNumber(lower);
    lower = lower === lower ? lower : 0;
  }
  return baseClamp(toNumber(number), lower, upper);
}

module.exports = clamp;
var baseClone = require('./_baseClone');

/** Used to compose bitmasks for cloning. */
var CLONE_SYMBOLS_FLAG = 4;

/**
 * Creates a shallow clone of `value`.
 *
 * **Note:** This method is loosely based on the
 * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
 * and supports cloning arrays, array buffers, booleans, date objects, maps,
 * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
 * arrays. The own enumerable properties of `arguments` objects are cloned
 * as plain objects. An empty object is returned for uncloneable values such
 * as error objects, functions, DOM nodes, and WeakMaps.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to clone.
 * @returns {*} Returns the cloned value.
 * @see _.cloneDeep
 * @example
 *
 * var objects = [{ 'a': 1 }, { 'b': 2 }];
 *
 * var shallow = _.clone(objects);
 * console.log(shallow[0] === objects[0]);
 * // => true
 */
function clone(value) {
  return baseClone(value, CLONE_SYMBOLS_FLAG);
}

module.exports = clone;
var baseClone = require('./_baseClone');

/** Used to compose bitmasks for cloning. */
var CLONE_DEEP_FLAG = 1,
    CLONE_SYMBOLS_FLAG = 4;

/**
 * This method is like `_.clone` except that it recursively clones `value`.
 *
 * @static
 * @memberOf _
 * @since 1.0.0
 * @category Lang
 * @param {*} value The value to recursively clone.
 * @returns {*} Returns the deep cloned value.
 * @see _.clone
 * @example
 *
 * var objects = [{ 'a': 1 }, { 'b': 2 }];
 *
 * var deep = _.cloneDeep(objects);
 * console.log(deep[0] === objects[0]);
 * // => false
 */
function cloneDeep(value) {
  return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);
}

module.exports = cloneDeep;
var baseClone = require('./_baseClone');

/** Used to compose bitmasks for cloning. */
var CLONE_DEEP_FLAG = 1,
    CLONE_SYMBOLS_FLAG = 4;

/**
 * This method is like `_.cloneWith` except that it recursively clones `value`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to recursively clone.
 * @param {Function} [customizer] The function to customize cloning.
 * @returns {*} Returns the deep cloned value.
 * @see _.cloneWith
 * @example
 *
 * function customizer(value) {
 *   if (_.isElement(value)) {
 *     return value.cloneNode(true);
 *   }
 * }
 *
 * var el = _.cloneDeepWith(document.body, customizer);
 *
 * console.log(el === document.body);
 * // => false
 * console.log(el.nodeName);
 * // => 'BODY'
 * console.log(el.childNodes.length);
 * // => 20
 */
function cloneDeepWith(value, customizer) {
  customizer = typeof customizer == 'function' ? customizer : undefined;
  return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);
}

module.exports = cloneDeepWith;
var baseClone = require('./_baseClone');

/** Used to compose bitmasks for cloning. */
var CLONE_SYMBOLS_FLAG = 4;

/**
 * This method is like `_.clone` except that it accepts `customizer` which
 * is invoked to produce the cloned value. If `customizer` returns `undefined`,
 * cloning is handled by the method instead. The `customizer` is invoked with
 * up to four arguments; (value [, index|key, object, stack]).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to clone.
 * @param {Function} [customizer] The function to customize cloning.
 * @returns {*} Returns the cloned value.
 * @see _.cloneDeepWith
 * @example
 *
 * function customizer(value) {
 *   if (_.isElement(value)) {
 *     return value.cloneNode(false);
 *   }
 * }
 *
 * var el = _.cloneWith(document.body, customizer);
 *
 * console.log(el === document.body);
 * // => false
 * console.log(el.nodeName);
 * // => 'BODY'
 * console.log(el.childNodes.length);
 * // => 0
 */
function cloneWith(value, customizer) {
  customizer = typeof customizer == 'function' ? customizer : undefined;
  return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);
}

module.exports = cloneWith;
module.exports = {
  'countBy': require('./countBy'),
  'each': require('./each'),
  'eachRight': require('./eachRight'),
  'every': require('./every'),
  'filter': require('./filter'),
  'find': require('./find'),
  'findLast': require('./findLast'),
  'flatMap': require('./flatMap'),
  'flatMapDeep': require('./flatMapDeep'),
  'flatMapDepth': require('./flatMapDepth'),
  'forEach': require('./forEach'),
  'forEachRight': require('./forEachRight'),
  'groupBy': require('./groupBy'),
  'includes': require('./includes'),
  'invokeMap': require('./invokeMap'),
  'keyBy': require('./keyBy'),
  'map': require('./map'),
  'orderBy': require('./orderBy'),
  'partition': require('./partition'),
  'reduce': require('./reduce'),
  'reduceRight': require('./reduceRight'),
  'reject': require('./reject'),
  'sample': require('./sample'),
  'sampleSize': require('./sampleSize'),
  'shuffle': require('./shuffle'),
  'size': require('./size'),
  'some': require('./some'),
  'sortBy': require('./sortBy')
};
var LodashWrapper = require('./_LodashWrapper');

/**
 * Executes the chain sequence and returns the wrapped result.
 *
 * @name commit
 * @memberOf _
 * @since 3.2.0
 * @category Seq
 * @returns {Object} Returns the new `lodash` wrapper instance.
 * @example
 *
 * var array = [1, 2];
 * var wrapped = _(array).push(3);
 *
 * console.log(array);
 * // => [1, 2]
 *
 * wrapped = wrapped.commit();
 * console.log(array);
 * // => [1, 2, 3]
 *
 * wrapped.last();
 * // => 3
 *
 * console.log(array);
 * // => [1, 2, 3]
 */
function wrapperCommit() {
  return new LodashWrapper(this.value(), this.__chain__);
}

module.exports = wrapperCommit;
/**
 * Creates an array with all falsey values removed. The values `false`, `null`,
 * `0`, `""`, `undefined`, and `NaN` are falsey.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Array
 * @param {Array} array The array to compact.
 * @returns {Array} Returns the new array of filtered values.
 * @example
 *
 * _.compact([0, 1, false, 2, '', 3]);
 * // => [1, 2, 3]
 */
function compact(array) {
  var index = -1,
      length = array == null ? 0 : array.length,
      resIndex = 0,
      result = [];

  while (++index < length) {
    var value = array[index];
    if (value) {
      result[resIndex++] = value;
    }
  }
  return result;
}

module.exports = compact;
var arrayPush = require('./_arrayPush'),
    baseFlatten = require('./_baseFlatten'),
    copyArray = require('./_copyArray'),
    isArray = require('./isArray');

/**
 * Creates a new array concatenating `array` with any additional arrays
 * and/or values.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Array
 * @param {Array} array The array to concatenate.
 * @param {...*} [values] The values to concatenate.
 * @returns {Array} Returns the new concatenated array.
 * @example
 *
 * var array = [1];
 * var other = _.concat(array, 2, [3], [[4]]);
 *
 * console.log(other);
 * // => [1, 2, 3, [4]]
 *
 * console.log(array);
 * // => [1]
 */
function concat() {
  var length = arguments.length;
  if (!length) {
    return [];
  }
  var args = Array(length - 1),
      array = arguments[0],
      index = length;

  while (index--) {
    args[index - 1] = arguments[index];
  }
  return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
}

module.exports = concat;
var apply = require('./_apply'),
    arrayMap = require('./_arrayMap'),
    baseIteratee = require('./_baseIteratee'),
    baseRest = require('./_baseRest');

/** Error message constants. */
var FUNC_ERROR_TEXT = 'Expected a function';

/**
 * Creates a function that iterates over `pairs` and invokes the corresponding
 * function of the first predicate to return truthy. The predicate-function
 * pairs are invoked with the `this` binding and arguments of the created
 * function.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Util
 * @param {Array} pairs The predicate-function pairs.
 * @returns {Function} Returns the new composite function.
 * @example
 *
 * var func = _.cond([
 *   [_.matches({ 'a': 1 }),           _.constant('matches A')],
 *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],
 *   [_.stubTrue,                      _.constant('no match')]
 * ]);
 *
 * func({ 'a': 1, 'b': 2 });
 * // => 'matches A'
 *
 * func({ 'a': 0, 'b': 1 });
 * // => 'matches B'
 *
 * func({ 'a': '1', 'b': '2' });
 * // => 'no match'
 */
function cond(pairs) {
  var length = pairs == null ? 0 : pairs.length,
      toIteratee = baseIteratee;

  pairs = !length ? [] : arrayMap(pairs, function(pair) {
    if (typeof pair[1] != 'function') {
      throw new TypeError(FUNC_ERROR_TEXT);
    }
    return [toIteratee(pair[0]), pair[1]];
  });

  return baseRest(function(args) {
    var index = -1;
    while (++index < length) {
      var pair = pairs[index];
      if (apply(pair[0], this, args)) {
        return apply(pair[1], this, args);
      }
    }
  });
}

module.exports = cond;
var baseClone = require('./_baseClone'),
    baseConforms = require('./_baseConforms');

/** Used to compose bitmasks for cloning. */
var CLONE_DEEP_FLAG = 1;

/**
 * Creates a function that invokes the predicate properties of `source` with
 * the corresponding property values of a given object, returning `true` if
 * all predicates return truthy, else `false`.
 *
 * **Note:** The created function is equivalent to `_.conformsTo` with
 * `source` partially applied.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Util
 * @param {Object} source The object of property predicates to conform to.
 * @returns {Function} Returns the new spec function.
 * @example
 *
 * var objects = [
 *   { 'a': 2, 'b': 1 },
 *   { 'a': 1, 'b': 2 }
 * ];
 *
 * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));
 * // => [{ 'a': 1, 'b': 2 }]
 */
function conforms(source) {
  return baseConforms(baseClone(source, CLONE_DEEP_FLAG));
}

module.exports = conforms;
var baseConformsTo = require('./_baseConformsTo'),
    keys = require('./keys');

/**
 * Checks if `object` conforms to `source` by invoking the predicate
 * properties of `source` with the corresponding property values of `object`.
 *
 * **Note:** This method is equivalent to `_.conforms` when `source` is
 * partially applied.
 *
 * @static
 * @memberOf _
 * @since 4.14.0
 * @category Lang
 * @param {Object} object The object to inspect.
 * @param {Object} source The object of property predicates to conform to.
 * @returns {boolean} Returns `true` if `object` conforms, else `false`.
 * @example
 *
 * var object = { 'a': 1, 'b': 2 };
 *
 * _.conformsTo(object, { 'b': function(n) { return n > 1; } });
 * // => true
 *
 * _.conformsTo(object, { 'b': function(n) { return n > 2; } });
 * // => false
 */
function conformsTo(object, source) {
  return source == null || baseConformsTo(object, source, keys(source));
}

module.exports = conformsTo;
/**
 * Creates a function that returns `value`.
 *
 * @static
 * @memberOf _
 * @since 2.4.0
 * @category Util
 * @param {*} value The value to return from the new function.
 * @returns {Function} Returns the new constant function.
 * @example
 *
 * var objects = _.times(2, _.constant({ 'a': 1 }));
 *
 * console.log(objects);
 * // => [{ 'a': 1 }, { 'a': 1 }]
 *
 * console.log(objects[0] === objects[1]);
 * // => true
 */
function constant(value) {
  return function() {
    return value;
  };
}

module.exports = constant;
/**
 * @license
 * Lodash (Custom Build) <https://lodash.com/>
 * Build: `lodash core -o ./dist/lodash.core.js`
 * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
 * Released under MIT license <https://lodash.com/license>
 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
 */
;(function() {

  /** Used as a safe reference for `undefined` in pre-ES5 environments. */
  var undefined;

  /** Used as the semantic version number. */
  var VERSION = '4.17.21';

  /** Error message constants. */
  var FUNC_ERROR_TEXT = 'Expected a function';

  /** Used to compose bitmasks for value comparisons. */
  var COMPARE_PARTIAL_FLAG = 1,
      COMPARE_UNORDERED_FLAG = 2;

  /** Used to compose bitmasks for function metadata. */
  var WRAP_BIND_FLAG = 1,
      WRAP_PARTIAL_FLAG = 32;

  /** Used as references for various `Number` constants. */
  var INFINITY = 1 / 0,
      MAX_SAFE_INTEGER = 9007199254740991;

  /** `Object#toString` result references. */
  var argsTag = '[object Arguments]',
      arrayTag = '[object Array]',
      asyncTag = '[object AsyncFunction]',
      boolTag = '[object Boolean]',
      dateTag = '[object Date]',
      errorTag = '[object Error]',
      funcTag = '[object Function]',
      genTag = '[object GeneratorFunction]',
      numberTag = '[object Number]',
      objectTag = '[object Object]',
      proxyTag = '[object Proxy]',
      regexpTag = '[object RegExp]',
      stringTag = '[object String]';

  /** Used to match HTML entities and HTML characters. */
  var reUnescapedHtml = /[&<>"']/g,
      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);

  /** Used to detect unsigned integer values. */
  var reIsUint = /^(?:0|[1-9]\d*)$/;

  /** Used to map characters to HTML entities. */
  var htmlEscapes = {
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#39;'
  };

  /** Detect free variable `global` from Node.js. */
  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;

  /** Detect free variable `self`. */
  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;

  /** Used as a reference to the global object. */
  var root = freeGlobal || freeSelf || Function('return this')();

  /** Detect free variable `exports`. */
  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;

  /** Detect free variable `module`. */
  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;

  /*--------------------------------------------------------------------------*/

  /**
   * Appends the elements of `values` to `array`.
   *
   * @private
   * @param {Array} array The array to modify.
   * @param {Array} values The values to append.
   * @returns {Array} Returns `array`.
   */
  function arrayPush(array, values) {
    array.push.apply(array, values);
    return array;
  }

  /**
   * The base implementation of `_.findIndex` and `_.findLastIndex` without
   * support for iteratee shorthands.
   *
   * @private
   * @param {Array} array The array to inspect.
   * @param {Function} predicate The function invoked per iteration.
   * @param {number} fromIndex The index to search from.
   * @param {boolean} [fromRight] Specify iterating from right to left.
   * @returns {number} Returns the index of the matched value, else `-1`.
   */
  function baseFindIndex(array, predicate, fromIndex, fromRight) {
    var length = array.length,
        index = fromIndex + (fromRight ? 1 : -1);

    while ((fromRight ? index-- : ++index < length)) {
      if (predicate(array[index], index, array)) {
        return index;
      }
    }
    return -1;
  }

  /**
   * The base implementation of `_.property` without support for deep paths.
   *
   * @private
   * @param {string} key The key of the property to get.
   * @returns {Function} Returns the new accessor function.
   */
  function baseProperty(key) {
    return function(object) {
      return object == null ? undefined : object[key];
    };
  }

  /**
   * The base implementation of `_.propertyOf` without support for deep paths.
   *
   * @private
   * @param {Object} object The object to query.
   * @returns {Function} Returns the new accessor function.
   */
  function basePropertyOf(object) {
    return function(key) {
      return object == null ? undefined : object[key];
    };
  }

  /**
   * The base implementation of `_.reduce` and `_.reduceRight`, without support
   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
   *
   * @private
   * @param {Array|Object} collection The collection to iterate over.
   * @param {Function} iteratee The function invoked per iteration.
   * @param {*} accumulator The initial value.
   * @param {boolean} initAccum Specify using the first or last element of
   *  `collection` as the initial value.
   * @param {Function} eachFunc The function to iterate over `collection`.
   * @returns {*} Returns the accumulated value.
   */
  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
    eachFunc(collection, function(value, index, collection) {
      accumulator = initAccum
        ? (initAccum = false, value)
        : iteratee(accumulator, value, index, collection);
    });
    return accumulator;
  }

  /**
   * The base implementation of `_.values` and `_.valuesIn` which creates an
   * array of `object` property values corresponding to the property names
   * of `props`.
   *
   * @private
   * @param {Object} object The object to query.
   * @param {Array} props The property names to get values for.
   * @returns {Object} Returns the array of property values.
   */
  function baseValues(object, props) {
    return baseMap(props, function(key) {
      return object[key];
    });
  }

  /**
   * Used by `_.escape` to convert characters to HTML entities.
   *
   * @private
   * @param {string} chr The matched character to escape.
   * @returns {string} Returns the escaped character.
   */
  var escapeHtmlChar = basePropertyOf(htmlEscapes);

  /**
   * Creates a unary function that invokes `func` with its argument transformed.
   *
   * @private
   * @param {Function} func The function to wrap.
   * @param {Function} transform The argument transform.
   * @returns {Function} Returns the new function.
   */
  function overArg(func, transform) {
    return function(arg) {
      return func(transform(arg));
    };
  }

  /*--------------------------------------------------------------------------*/

  /** Used for built-in method references. */
  var arrayProto = Array.prototype,
      objectProto = Object.prototype;

  /** Used to check objects for own properties. */
  var hasOwnProperty = objectProto.hasOwnProperty;

  /** Used to generate unique IDs. */
  var idCounter = 0;

  /**
   * Used to resolve the
   * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
   * of values.
   */
  var nativeObjectToString = objectProto.toString;

  /** Used to restore the original `_` reference in `_.noConflict`. */
  var oldDash = root._;

  /** Built-in value references. */
  var objectCreate = Object.create,
      propertyIsEnumerable = objectProto.propertyIsEnumerable;

  /* Built-in method references for those with the same name as other `lodash` methods. */
  var nativeIsFinite = root.isFinite,
      nativeKeys = overArg(Object.keys, Object),
      nativeMax = Math.max;

  /*------------------------------------------------------------------------*/

  /**
   * Creates a `lodash` object which wraps `value` to enable implicit method
   * chain sequences. Methods that operate on and return arrays, collections,
   * and functions can be chained together. Methods that retrieve a single value
   * or may return a primitive value will automatically end the chain sequence
   * and return the unwrapped value. Otherwise, the value must be unwrapped
   * with `_#value`.
   *
   * Explicit chain sequences, which must be unwrapped with `_#value`, may be
   * enabled using `_.chain`.
   *
   * The execution of chained methods is lazy, that is, it's deferred until
   * `_#value` is implicitly or explicitly called.
   *
   * Lazy evaluation allows several methods to support shortcut fusion.
   * Shortcut fusion is an optimization to merge iteratee calls; this avoids
   * the creation of intermediate arrays and can greatly reduce the number of
   * iteratee executions. Sections of a chain sequence qualify for shortcut
   * fusion if the section is applied to an array and iteratees accept only
   * one argument. The heuristic for whether a section qualifies for shortcut
   * fusion is subject to change.
   *
   * Chaining is supported in custom builds as long as the `_#value` method is
   * directly or indirectly included in the build.
   *
   * In addition to lodash methods, wrappers have `Array` and `String` methods.
   *
   * The wrapper `Array` methods are:
   * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
   *
   * The wrapper `String` methods are:
   * `replace` and `split`
   *
   * The wrapper methods that support shortcut fusion are:
   * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
   * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
   * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
   *
   * The chainable wrapper methods are:
   * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
   * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
   * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
   * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
   * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
   * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
   * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
   * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
   * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
   * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
   * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
   * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
   * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
   * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
   * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
   * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
   * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
   * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
   * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
   * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
   * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
   * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
   * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
   * `zipObject`, `zipObjectDeep`, and `zipWith`
   *
   * The wrapper methods that are **not** chainable by default are:
   * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
   * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
   * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
   * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
   * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
   * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
   * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
   * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
   * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
   * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
   * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
   * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
   * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
   * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
   * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
   * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
   * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
   * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
   * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
   * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
   * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
   * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
   * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
   * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
   * `upperFirst`, `value`, and `words`
   *
   * @name _
   * @constructor
   * @category Seq
   * @param {*} value The value to wrap in a `lodash` instance.
   * @returns {Object} Returns the new `lodash` wrapper instance.
   * @example
   *
   * function square(n) {
   *   return n * n;
   * }
   *
   * var wrapped = _([1, 2, 3]);
   *
   * // Returns an unwrapped value.
   * wrapped.reduce(_.add);
   * // => 6
   *
   * // Returns a wrapped value.
   * var squares = wrapped.map(square);
   *
   * _.isArray(squares);
   * // => false
   *
   * _.isArray(squares.value());
   * // => true
   */
  function lodash(value) {
    return value instanceof LodashWrapper
      ? value
      : new LodashWrapper(value);
  }

  /**
   * The base implementation of `_.create` without support for assigning
   * properties to the created object.
   *
   * @private
   * @param {Object} proto The object to inherit from.
   * @returns {Object} Returns the new object.
   */
  var baseCreate = (function() {
    function object() {}
    return function(proto) {
      if (!isObject(proto)) {
        return {};
      }
      if (objectCreate) {
        return objectCreate(proto);
      }
      object.prototype = proto;
      var result = new object;
      object.prototype = undefined;
      return result;
    };
  }());

  /**
   * The base constructor for creating `lodash` wrapper objects.
   *
   * @private
   * @param {*} value The value to wrap.
   * @param {boolean} [chainAll] Enable explicit method chain sequences.
   */
  function LodashWrapper(value, chainAll) {
    this.__wrapped__ = value;
    this.__actions__ = [];
    this.__chain__ = !!chainAll;
  }

  LodashWrapper.prototype = baseCreate(lodash.prototype);
  LodashWrapper.prototype.constructor = LodashWrapper;

  /*------------------------------------------------------------------------*/

  /**
   * Assigns `value` to `key` of `object` if the existing value is not equivalent
   * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
   * for equality comparisons.
   *
   * @private
   * @param {Object} object The object to modify.
   * @param {string} key The key of the property to assign.
   * @param {*} value The value to assign.
   */
  function assignValue(object, key, value) {
    var objValue = object[key];
    if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
        (value === undefined && !(key in object))) {
      baseAssignValue(object, key, value);
    }
  }

  /**
   * The base implementation of `assignValue` and `assignMergeValue` without
   * value checks.
   *
   * @private
   * @param {Object} object The object to modify.
   * @param {string} key The key of the property to assign.
   * @param {*} value The value to assign.
   */
  function baseAssignValue(object, key, value) {
    object[key] = value;
  }

  /**
   * The base implementation of `_.delay` and `_.defer` which accepts `args`
   * to provide to `func`.
   *
   * @private
   * @param {Function} func The function to delay.
   * @param {number} wait The number of milliseconds to delay invocation.
   * @param {Array} args The arguments to provide to `func`.
   * @returns {number|Object} Returns the timer id or timeout object.
   */
  function baseDelay(func, wait, args) {
    if (typeof func != 'function') {
      throw new TypeError(FUNC_ERROR_TEXT);
    }
    return setTimeout(function() { func.apply(undefined, args); }, wait);
  }

  /**
   * The base implementation of `_.forEach` without support for iteratee shorthands.
   *
   * @private
   * @param {Array|Object} collection The collection to iterate over.
   * @param {Function} iteratee The function invoked per iteration.
   * @returns {Array|Object} Returns `collection`.
   */
  var baseEach = createBaseEach(baseForOwn);

  /**
   * The base implementation of `_.every` without support for iteratee shorthands.
   *
   * @private
   * @param {Array|Object} collection The collection to iterate over.
   * @param {Function} predicate The function invoked per iteration.
   * @returns {boolean} Returns `true` if all elements pass the predicate check,
   *  else `false`
   */
  function baseEvery(collection, predicate) {
    var result = true;
    baseEach(collection, function(value, index, collection) {
      result = !!predicate(value, index, collection);
      return result;
    });
    return result;
  }

  /**
   * The base implementation of methods like `_.max` and `_.min` which accepts a
   * `comparator` to determine the extremum value.
   *
   * @private
   * @param {Array} array The array to iterate over.
   * @param {Function} iteratee The iteratee invoked per iteration.
   * @param {Function} comparator The comparator used to compare values.
   * @returns {*} Returns the extremum value.
   */
  function baseExtremum(array, iteratee, comparator) {
    var index = -1,
        length = array.length;

    while (++index < length) {
      var value = array[index],
          current = iteratee(value);

      if (current != null && (computed === undefined
            ? (current === current && !false)
            : comparator(current, computed)
          )) {
        var computed = current,
            result = value;
      }
    }
    return result;
  }

  /**
   * The base implementation of `_.filter` without support for iteratee shorthands.
   *
   * @private
   * @param {Array|Object} collection The collection to iterate over.
   * @param {Function} predicate The function invoked per iteration.
   * @returns {Array} Returns the new filtered array.
   */
  function baseFilter(collection, predicate) {
    var result = [];
    baseEach(collection, function(value, index, collection) {
      if (predicate(value, index, collection)) {
        result.push(value);
      }
    });
    return result;
  }

  /**
   * The base implementation of `_.flatten` with support for restricting flattening.
   *
   * @private
   * @param {Array} array The array to flatten.
   * @param {number} depth The maximum recursion depth.
   * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
   * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
   * @param {Array} [result=[]] The initial result value.
   * @returns {Array} Returns the new flattened array.
   */
  function baseFlatten(array, depth, predicate, isStrict, result) {
    var index = -1,
        length = array.length;

    predicate || (predicate = isFlattenable);
    result || (result = []);

    while (++index < length) {
      var value = array[index];
      if (depth > 0 && predicate(value)) {
        if (depth > 1) {
          // Recursively flatten arrays (susceptible to call stack limits).
          baseFlatten(value, depth - 1, predicate, isStrict, result);
        } else {
          arrayPush(result, value);
        }
      } else if (!isStrict) {
        result[result.length] = value;
      }
    }
    return result;
  }

  /**
   * The base implementation of `baseForOwn` which iterates over `object`
   * properties returned by `keysFunc` and invokes `iteratee` for each property.
   * Iteratee functions may exit iteration early by explicitly returning `false`.
   *
   * @private
   * @param {Object} object The object to iterate over.
   * @param {Function} iteratee The function invoked per iteration.
   * @param {Function} keysFunc The function to get the keys of `object`.
   * @returns {Object} Returns `object`.
   */
  var baseFor = createBaseFor();

  /**
   * The base implementation of `_.forOwn` without support for iteratee shorthands.
   *
   * @private
   * @param {Object} object The object to iterate over.
   * @param {Function} iteratee The function invoked per iteration.
   * @returns {Object} Returns `object`.
   */
  function baseForOwn(object, iteratee) {
    return object && baseFor(object, iteratee, keys);
  }

  /**
   * The base implementation of `_.functions` which creates an array of
   * `object` function property names filtered from `props`.
   *
   * @private
   * @param {Object} object The object to inspect.
   * @param {Array} props The property names to filter.
   * @returns {Array} Returns the function names.
   */
  function baseFunctions(object, props) {
    return baseFilter(props, function(key) {
      return isFunction(object[key]);
    });
  }

  /**
   * The base implementation of `getTag` without fallbacks for buggy environments.
   *
   * @private
   * @param {*} value The value to query.
   * @returns {string} Returns the `toStringTag`.
   */
  function baseGetTag(value) {
    return objectToString(value);
  }

  /**
   * The base implementation of `_.gt` which doesn't coerce arguments.
   *
   * @private
   * @param {*} value The value to compare.
   * @param {*} other The other value to compare.
   * @returns {boolean} Returns `true` if `value` is greater than `other`,
   *  else `false`.
   */
  function baseGt(value, other) {
    return value > other;
  }

  /**
   * The base implementation of `_.isArguments`.
   *
   * @private
   * @param {*} value The value to check.
   * @returns {boolean} Returns `true` if `value` is an `arguments` object,
   */
  var baseIsArguments = noop;

  /**
   * The base implementation of `_.isDate` without Node.js optimizations.
   *
   * @private
   * @param {*} value The value to check.
   * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
   */
  function baseIsDate(value) {
    return isObjectLike(value) && baseGetTag(value) == dateTag;
  }

  /**
   * The base implementation of `_.isEqual` which supports partial comparisons
   * and tracks traversed objects.
   *
   * @private
   * @param {*} value The value to compare.
   * @param {*} other The other value to compare.
   * @param {boolean} bitmask The bitmask flags.
   *  1 - Unordered comparison
   *  2 - Partial comparison
   * @param {Function} [customizer] The function to customize comparisons.
   * @param {Object} [stack] Tracks traversed `value` and `other` objects.
   * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
   */
  function baseIsEqual(value, other, bitmask, customizer, stack) {
    if (value === other) {
      return true;
    }
    if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
      return value !== value && other !== other;
    }
    return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
  }

  /**
   * A specialized version of `baseIsEqual` for arrays and objects which performs
   * deep comparisons and tracks traversed objects enabling objects with circular
   * references to be compared.
   *
   * @private
   * @param {Object} object The object to compare.
   * @param {Object} other The other object to compare.
   * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
   * @param {Function} customizer The function to customize comparisons.
   * @param {Function} equalFunc The function to determine equivalents of values.
   * @param {Object} [stack] Tracks traversed `object` and `other` objects.
   * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
   */
  function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
    var objIsArr = isArray(object),
        othIsArr = isArray(other),
        objTag = objIsArr ? arrayTag : baseGetTag(object),
        othTag = othIsArr ? arrayTag : baseGetTag(other);

    objTag = objTag == argsTag ? objectTag : objTag;
    othTag = othTag == argsTag ? objectTag : othTag;

    var objIsObj = objTag == objectTag,
        othIsObj = othTag == objectTag,
        isSameTag = objTag == othTag;

    stack || (stack = []);
    var objStack = find(stack, function(entry) {
      return entry[0] == object;
    });
    var othStack = find(stack, function(entry) {
      return entry[0] == other;
    });
    if (objStack && othStack) {
      return objStack[1] == other;
    }
    stack.push([object, other]);
    stack.push([other, object]);
    if (isSameTag && !objIsObj) {
      var result = (objIsArr)
        ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
        : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
      stack.pop();
      return result;
    }
    if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
      var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
          othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');

      if (objIsWrapped || othIsWrapped) {
        var objUnwrapped = objIsWrapped ? object.value() : object,
            othUnwrapped = othIsWrapped ? other.value() : other;

        var result = equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
        stack.pop();
        return result;
      }
    }
    if (!isSameTag) {
      return false;
    }
    var result = equalObjects(object, other, bitmask, customizer, equalFunc, stack);
    stack.pop();
    return result;
  }

  /**
   * The base implementation of `_.isRegExp` without Node.js optimizations.
   *
   * @private
   * @param {*} value The value to check.
   * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
   */
  function baseIsRegExp(value) {
    return isObjectLike(value) && baseGetTag(value) == regexpTag;
  }

  /**
   * The base implementation of `_.iteratee`.
   *
   * @private
   * @param {*} [value=_.identity] The value to convert to an iteratee.
   * @returns {Function} Returns the iteratee.
   */
  function baseIteratee(func) {
    if (typeof func == 'function') {
      return func;
    }
    if (func == null) {
      return identity;
    }
    return (typeof func == 'object' ? baseMatches : baseProperty)(func);
  }

  /**
   * The base implementation of `_.lt` which doesn't coerce arguments.
   *
   * @private
   * @param {*} value The value to compare.
   * @param {*} other The other value to compare.
   * @returns {boolean} Returns `true` if `value` is less than `other`,
   *  else `false`.
   */
  function baseLt(value, other) {
    return value < other;
  }

  /**
   * The base implementation of `_.map` without support for iteratee shorthands.
   *
   * @private
   * @param {Array|Object} collection The collection to iterate over.
   * @param {Function} iteratee The function invoked per iteration.
   * @returns {Array} Returns the new mapped array.
   */
  function baseMap(collection, iteratee) {
    var index = -1,
        result = isArrayLike(collection) ? Array(collection.length) : [];

    baseEach(collection, function(value, key, collection) {
      result[++index] = iteratee(value, key, collection);
    });
    return result;
  }

  /**
   * The base implementation of `_.matches` which doesn't clone `source`.
   *
   * @private
   * @param {Object} source The object of property values to match.
   * @returns {Function} Returns the new spec function.
   */
  function baseMatches(source) {
    var props = nativeKeys(source);
    return function(object) {
      var length = props.length;
      if (object == null) {
        return !length;
      }
      object = Object(object);
      while (length--) {
        var key = props[length];
        if (!(key in object &&
              baseIsEqual(source[key], object[key], COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG)
            )) {
          return false;
        }
      }
      return true;
    };
  }

  /**
   * The base implementation of `_.pick` without support for individual
   * property identifiers.
   *
   * @private
   * @param {Object} object The source object.
   * @param {string[]} paths The property paths to pick.
   * @returns {Object} Returns the new object.
   */
  function basePick(object, props) {
    object = Object(object);
    return reduce(props, function(result, key) {
      if (key in object) {
        result[key] = object[key];
      }
      return result;
    }, {});
  }

  /**
   * The base implementation of `_.rest` which doesn't validate or coerce arguments.
   *
   * @private
   * @param {Function} func The function to apply a rest parameter to.
   * @param {number} [start=func.length-1] The start position of the rest parameter.
   * @returns {Function} Returns the new function.
   */
  function baseRest(func, start) {
    return setToString(overRest(func, start, identity), func + '');
  }

  /**
   * The base implementation of `_.slice` without an iteratee call guard.
   *
   * @private
   * @param {Array} array The array to slice.
   * @param {number} [start=0] The start position.
   * @param {number} [end=array.length] The end position.
   * @returns {Array} Returns the slice of `array`.
   */
  function baseSlice(array, start, end) {
    var index = -1,
        length = array.length;

    if (start < 0) {
      start = -start > length ? 0 : (length + start);
    }
    end = end > length ? length : end;
    if (end < 0) {
      end += length;
    }
    length = start > end ? 0 : ((end - start) >>> 0);
    start >>>= 0;

    var result = Array(length);
    while (++index < length) {
      result[index] = array[index + start];
    }
    return result;
  }

  /**
   * Copies the values of `source` to `array`.
   *
   * @private
   * @param {Array} source The array to copy values from.
   * @param {Array} [array=[]] The array to copy values to.
   * @returns {Array} Returns `array`.
   */
  function copyArray(source) {
    return baseSlice(source, 0, source.length);
  }

  /**
   * The base implementation of `_.some` without support for iteratee shorthands.
   *
   * @private
   * @param {Array|Object} collection The collection to iterate over.
   * @param {Function} predicate The function invoked per iteration.
   * @returns {boolean} Returns `true` if any element passes the predicate check,
   *  else `false`.
   */
  function baseSome(collection, predicate) {
    var result;

    baseEach(collection, function(value, index, collection) {
      result = predicate(value, index, collection);
      return !result;
    });
    return !!result;
  }

  /**
   * The base implementation of `wrapperValue` which returns the result of
   * performing a sequence of actions on the unwrapped `value`, where each
   * successive action is supplied the return value of the previous.
   *
   * @private
   * @param {*} value The unwrapped value.
   * @param {Array} actions Actions to perform to resolve the unwrapped value.
   * @returns {*} Returns the resolved value.
   */
  function baseWrapperValue(value, actions) {
    var result = value;
    return reduce(actions, function(result, action) {
      return action.func.apply(action.thisArg, arrayPush([result], action.args));
    }, result);
  }

  /**
   * Compares values to sort them in ascending order.
   *
   * @private
   * @param {*} value The value to compare.
   * @param {*} other The other value to compare.
   * @returns {number} Returns the sort order indicator for `value`.
   */
  function compareAscending(value, other) {
    if (value !== other) {
      var valIsDefined = value !== undefined,
          valIsNull = value === null,
          valIsReflexive = value === value,
          valIsSymbol = false;

      var othIsDefined = other !== undefined,
          othIsNull = other === null,
          othIsReflexive = other === other,
          othIsSymbol = false;

      if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||
          (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||
          (valIsNull && othIsDefined && othIsReflexive) ||
          (!valIsDefined && othIsReflexive) ||
          !valIsReflexive) {
        return 1;
      }
      if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||
          (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||
          (othIsNull && valIsDefined && valIsReflexive) ||
          (!othIsDefined && valIsReflexive) ||
          !othIsReflexive) {
        return -1;
      }
    }
    return 0;
  }

  /**
   * Copies properties of `source` to `object`.
   *
   * @private
   * @param {Object} source The object to copy properties from.
   * @param {Array} props The property identifiers to copy.
   * @param {Object} [object={}] The object to copy properties to.
   * @param {Function} [customizer] The function to customize copied values.
   * @returns {Object} Returns `object`.
   */
  function copyObject(source, props, object, customizer) {
    var isNew = !object;
    object || (object = {});

    var index = -1,
        length = props.length;

    while (++index < length) {
      var key = props[index];

      var newValue = customizer
        ? customizer(object[key], source[key], key, object, source)
        : undefined;

      if (newValue === undefined) {
        newValue = source[key];
      }
      if (isNew) {
        baseAssignValue(object, key, newValue);
      } else {
        assignValue(object, key, newValue);
      }
    }
    return object;
  }

  /**
   * Creates a function like `_.assign`.
   *
   * @private
   * @param {Function} assigner The function to assign values.
   * @returns {Function} Returns the new assigner function.
   */
  function createAssigner(assigner) {
    return baseRest(function(object, sources) {
      var index = -1,
          length = sources.length,
          customizer = length > 1 ? sources[length - 1] : undefined;

      customizer = (assigner.length > 3 && typeof customizer == 'function')
        ? (length--, customizer)
        : undefined;

      object = Object(object);
      while (++index < length) {
        var source = sources[index];
        if (source) {
          assigner(object, source, index, customizer);
        }
      }
      return object;
    });
  }

  /**
   * Creates a `baseEach` or `baseEachRight` function.
   *
   * @private
   * @param {Function} eachFunc The function to iterate over a collection.
   * @param {boolean} [fromRight] Specify iterating from right to left.
   * @returns {Function} Returns the new base function.
   */
  function createBaseEach(eachFunc, fromRight) {
    return function(collection, iteratee) {
      if (collection == null) {
        return collection;
      }
      if (!isArrayLike(collection)) {
        return eachFunc(collection, iteratee);
      }
      var length = collection.length,
          index = fromRight ? length : -1,
          iterable = Object(collection);

      while ((fromRight ? index-- : ++index < length)) {
        if (iteratee(iterable[index], index, iterable) === false) {
          break;
        }
      }
      return collection;
    };
  }

  /**
   * Creates a base function for methods like `_.forIn` and `_.forOwn`.
   *
   * @private
   * @param {boolean} [fromRight] Specify iterating from right to left.
   * @returns {Function} Returns the new base function.
   */
  function createBaseFor(fromRight) {
    return function(object, iteratee, keysFunc) {
      var index = -1,
          iterable = Object(object),
          props = keysFunc(object),
          length = props.length;

      while (length--) {
        var key = props[fromRight ? length : ++index];
        if (iteratee(iterable[key], key, iterable) === false) {
          break;
        }
      }
      return object;
    };
  }

  /**
   * Creates a function that produces an instance of `Ctor` regardless of
   * whether it was invoked as part of a `new` expression or by `call` or `apply`.
   *
   * @private
   * @param {Function} Ctor The constructor to wrap.
   * @returns {Function} Returns the new wrapped function.
   */
  function createCtor(Ctor) {
    return function() {
      // Use a `switch` statement to work with class constructors. See
      // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
      // for more details.
      var args = arguments;
      var thisBinding = baseCreate(Ctor.prototype),
          result = Ctor.apply(thisBinding, args);

      // Mimic the constructor's `return` behavior.
      // See https://es5.github.io/#x13.2.2 for more details.
      return isObject(result) ? result : thisBinding;
    };
  }

  /**
   * Creates a `_.find` or `_.findLast` function.
   *
   * @private
   * @param {Function} findIndexFunc The function to find the collection index.
   * @returns {Function} Returns the new find function.
   */
  function createFind(findIndexFunc) {
    return function(collection, predicate, fromIndex) {
      var iterable = Object(collection);
      if (!isArrayLike(collection)) {
        var iteratee = baseIteratee(predicate, 3);
        collection = keys(collection);
        predicate = function(key) { return iteratee(iterable[key], key, iterable); };
      }
      var index = findIndexFunc(collection, predicate, fromIndex);
      return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
    };
  }

  /**
   * Creates a function that wraps `func` to invoke it with the `this` binding
   * of `thisArg` and `partials` prepended to the arguments it receives.
   *
   * @private
   * @param {Function} func The function to wrap.
   * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
   * @param {*} thisArg The `this` binding of `func`.
   * @param {Array} partials The arguments to prepend to those provided to
   *  the new function.
   * @returns {Function} Returns the new wrapped function.
   */
  function createPartial(func, bitmask, thisArg, partials) {
    if (typeof func != 'function') {
      throw new TypeError(FUNC_ERROR_TEXT);
    }
    var isBind = bitmask & WRAP_BIND_FLAG,
        Ctor = createCtor(func);

    function wrapper() {
      var argsIndex = -1,
          argsLength = arguments.length,
          leftIndex = -1,
          leftLength = partials.length,
          args = Array(leftLength + argsLength),
          fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;

      while (++leftIndex < leftLength) {
        args[leftIndex] = partials[leftIndex];
      }
      while (argsLength--) {
        args[leftIndex++] = arguments[++argsIndex];
      }
      return fn.apply(isBind ? thisArg : this, args);
    }
    return wrapper;
  }

  /**
   * A specialized version of `baseIsEqualDeep` for arrays with support for
   * partial deep comparisons.
   *
   * @private
   * @param {Array} array The array to compare.
   * @param {Array} other The other array to compare.
   * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
   * @param {Function} customizer The function to customize comparisons.
   * @param {Function} equalFunc The function to determine equivalents of values.
   * @param {Object} stack Tracks traversed `array` and `other` objects.
   * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
   */
  function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
    var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
        arrLength = array.length,
        othLength = other.length;

    if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
      return false;
    }
    // Check that cyclic values are equal.
    var arrStacked = stack.get(array);
    var othStacked = stack.get(other);
    if (arrStacked && othStacked) {
      return arrStacked == other && othStacked == array;
    }
    var index = -1,
        result = true,
        seen = (bitmask & COMPARE_UNORDERED_FLAG) ? [] : undefined;

    // Ignore non-index properties.
    while (++index < arrLength) {
      var arrValue = array[index],
          othValue = other[index];

      var compared;
      if (compared !== undefined) {
        if (compared) {
          continue;
        }
        result = false;
        break;
      }
      // Recursively compare arrays (susceptible to call stack limits).
      if (seen) {
        if (!baseSome(other, function(othValue, othIndex) {
              if (!indexOf(seen, othIndex) &&
                  (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
                return seen.push(othIndex);
              }
            })) {
          result = false;
          break;
        }
      } else if (!(
            arrValue === othValue ||
              equalFunc(arrValue, othValue, bitmask, customizer, stack)
          )) {
        result = false;
        break;
      }
    }
    return result;
  }

  /**
   * A specialized version of `baseIsEqualDeep` for comparing objects of
   * the same `toStringTag`.
   *
   * **Note:** This function only supports comparing values with tags of
   * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
   *
   * @private
   * @param {Object} object The object to compare.
   * @param {Object} other The other object to compare.
   * @param {string} tag The `toStringTag` of the objects to compare.
   * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
   * @param {Function} customizer The function to customize comparisons.
   * @param {Function} equalFunc The function to determine equivalents of values.
   * @param {Object} stack Tracks traversed `object` and `other` objects.
   * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
   */
  function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
    switch (tag) {

      case boolTag:
      case dateTag:
      case numberTag:
        // Coerce booleans to `1` or `0` and dates to milliseconds.
        // Invalid dates are coerced to `NaN`.
        return eq(+object, +other);

      case errorTag:
        return object.name == other.name && object.message == other.message;

      case regexpTag:
      case stringTag:
        // Coerce regexes to strings and treat strings, primitives and objects,
        // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
        // for more details.
        return object == (other + '');

    }
    return false;
  }

  /**
   * A specialized version of `baseIsEqualDeep` for objects with support for
   * partial deep comparisons.
   *
   * @private
   * @param {Object} object The object to compare.
   * @param {Object} other The other object to compare.
   * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
   * @param {Function} customizer The function to customize comparisons.
   * @param {Function} equalFunc The function to determine equivalents of values.
   * @param {Object} stack Tracks traversed `object` and `other` objects.
   * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
   */
  function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
    var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
        objProps = keys(object),
        objLength = objProps.length,
        othProps = keys(other),
        othLength = othProps.length;

    if (objLength != othLength && !isPartial) {
      return false;
    }
    var index = objLength;
    while (index--) {
      var key = objProps[index];
      if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
        return false;
      }
    }
    // Check that cyclic values are equal.
    var objStacked = stack.get(object);
    var othStacked = stack.get(other);
    if (objStacked && othStacked) {
      return objStacked == other && othStacked == object;
    }
    var result = true;

    var skipCtor = isPartial;
    while (++index < objLength) {
      key = objProps[index];
      var objValue = object[key],
          othValue = other[key];

      var compared;
      // Recursively compare objects (susceptible to call stack limits).
      if (!(compared === undefined
            ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
            : compared
          )) {
        result = false;
        break;
      }
      skipCtor || (skipCtor = key == 'constructor');
    }
    if (result && !skipCtor) {
      var objCtor = object.constructor,
          othCtor = other.constructor;

      // Non `Object` object instances with different constructors are not equal.
      if (objCtor != othCtor &&
          ('constructor' in object && 'constructor' in other) &&
          !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
            typeof othCtor == 'function' && othCtor instanceof othCtor)) {
        result = false;
      }
    }
    return result;
  }

  /**
   * A specialized version of `baseRest` which flattens the rest array.
   *
   * @private
   * @param {Function} func The function to apply a rest parameter to.
   * @returns {Function} Returns the new function.
   */
  function flatRest(func) {
    return setToString(overRest(func, undefined, flatten), func + '');
  }

  /**
   * Checks if `value` is a flattenable `arguments` object or array.
   *
   * @private
   * @param {*} value The value to check.
   * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
   */
  function isFlattenable(value) {
    return isArray(value) || isArguments(value);
  }

  /**
   * Checks if `value` is a valid array-like index.
   *
   * @private
   * @param {*} value The value to check.
   * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
   * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
   */
  function isIndex(value, length) {
    var type = typeof value;
    length = length == null ? MAX_SAFE_INTEGER : length;

    return !!length &&
      (type == 'number' ||
        (type != 'symbol' && reIsUint.test(value))) &&
          (value > -1 && value % 1 == 0 && value < length);
  }

  /**
   * Checks if the given arguments are from an iteratee call.
   *
   * @private
   * @param {*} value The potential iteratee value argument.
   * @param {*} index The potential iteratee index or key argument.
   * @param {*} object The potential iteratee object argument.
   * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
   *  else `false`.
   */
  function isIterateeCall(value, index, object) {
    if (!isObject(object)) {
      return false;
    }
    var type = typeof index;
    if (type == 'number'
          ? (isArrayLike(object) && isIndex(index, object.length))
          : (type == 'string' && index in object)
        ) {
      return eq(object[index], value);
    }
    return false;
  }

  /**
   * This function is like
   * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
   * except that it includes inherited enumerable properties.
   *
   * @private
   * @param {Object} object The object to query.
   * @returns {Array} Returns the array of property names.
   */
  function nativeKeysIn(object) {
    var result = [];
    if (object != null) {
      for (var key in Object(object)) {
        result.push(key);
      }
    }
    return result;
  }

  /**
   * Converts `value` to a string using `Object.prototype.toString`.
   *
   * @private
   * @param {*} value The value to convert.
   * @returns {string} Returns the converted string.
   */
  function objectToString(value) {
    return nativeObjectToString.call(value);
  }

  /**
   * A specialized version of `baseRest` which transforms the rest array.
   *
   * @private
   * @param {Function} func The function to apply a rest parameter to.
   * @param {number} [start=func.length-1] The start position of the rest parameter.
   * @param {Function} transform The rest array transform.
   * @returns {Function} Returns the new function.
   */
  function overRest(func, start, transform) {
    start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
    return function() {
      var args = arguments,
          index = -1,
          length = nativeMax(args.length - start, 0),
          array = Array(length);

      while (++index < length) {
        array[index] = args[start + index];
      }
      index = -1;
      var otherArgs = Array(start + 1);
      while (++index < start) {
        otherArgs[index] = args[index];
      }
      otherArgs[start] = transform(array);
      return func.apply(this, otherArgs);
    };
  }

  /**
   * Sets the `toString` method of `func` to return `string`.
   *
   * @private
   * @param {Function} func The function to modify.
   * @param {Function} string The `toString` result.
   * @returns {Function} Returns `func`.
   */
  var setToString = identity;

  /*------------------------------------------------------------------------*/

  /**
   * Creates an array with all falsey values removed. The values `false`, `null`,
   * `0`, `""`, `undefined`, and `NaN` are falsey.
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Array
   * @param {Array} array The array to compact.
   * @returns {Array} Returns the new array of filtered values.
   * @example
   *
   * _.compact([0, 1, false, 2, '', 3]);
   * // => [1, 2, 3]
   */
  function compact(array) {
    return baseFilter(array, Boolean);
  }

  /**
   * Creates a new array concatenating `array` with any additional arrays
   * and/or values.
   *
   * @static
   * @memberOf _
   * @since 4.0.0
   * @category Array
   * @param {Array} array The array to concatenate.
   * @param {...*} [values] The values to concatenate.
   * @returns {Array} Returns the new concatenated array.
   * @example
   *
   * var array = [1];
   * var other = _.concat(array, 2, [3], [[4]]);
   *
   * console.log(other);
   * // => [1, 2, 3, [4]]
   *
   * console.log(array);
   * // => [1]
   */
  function concat() {
    var length = arguments.length;
    if (!length) {
      return [];
    }
    var args = Array(length - 1),
        array = arguments[0],
        index = length;

    while (index--) {
      args[index - 1] = arguments[index];
    }
    return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
  }

  /**
   * This method is like `_.find` except that it returns the index of the first
   * element `predicate` returns truthy for instead of the element itself.
   *
   * @static
   * @memberOf _
   * @since 1.1.0
   * @category Array
   * @param {Array} array The array to inspect.
   * @param {Function} [predicate=_.identity] The function invoked per iteration.
   * @param {number} [fromIndex=0] The index to search from.
   * @returns {number} Returns the index of the found element, else `-1`.
   * @example
   *
   * var users = [
   *   { 'user': 'barney',  'active': false },
   *   { 'user': 'fred',    'active': false },
   *   { 'user': 'pebbles', 'active': true }
   * ];
   *
   * _.findIndex(users, function(o) { return o.user == 'barney'; });
   * // => 0
   *
   * // The `_.matches` iteratee shorthand.
   * _.findIndex(users, { 'user': 'fred', 'active': false });
   * // => 1
   *
   * // The `_.matchesProperty` iteratee shorthand.
   * _.findIndex(users, ['active', false]);
   * // => 0
   *
   * // The `_.property` iteratee shorthand.
   * _.findIndex(users, 'active');
   * // => 2
   */
  function findIndex(array, predicate, fromIndex) {
    var length = array == null ? 0 : array.length;
    if (!length) {
      return -1;
    }
    var index = fromIndex == null ? 0 : toInteger(fromIndex);
    if (index < 0) {
      index = nativeMax(length + index, 0);
    }
    return baseFindIndex(array, baseIteratee(predicate, 3), index);
  }

  /**
   * Flattens `array` a single level deep.
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Array
   * @param {Array} array The array to flatten.
   * @returns {Array} Returns the new flattened array.
   * @example
   *
   * _.flatten([1, [2, [3, [4]], 5]]);
   * // => [1, 2, [3, [4]], 5]
   */
  function flatten(array) {
    var length = array == null ? 0 : array.length;
    return length ? baseFlatten(array, 1) : [];
  }

  /**
   * Recursively flattens `array`.
   *
   * @static
   * @memberOf _
   * @since 3.0.0
   * @category Array
   * @param {Array} array The array to flatten.
   * @returns {Array} Returns the new flattened array.
   * @example
   *
   * _.flattenDeep([1, [2, [3, [4]], 5]]);
   * // => [1, 2, 3, 4, 5]
   */
  function flattenDeep(array) {
    var length = array == null ? 0 : array.length;
    return length ? baseFlatten(array, INFINITY) : [];
  }

  /**
   * Gets the first element of `array`.
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @alias first
   * @category Array
   * @param {Array} array The array to query.
   * @returns {*} Returns the first element of `array`.
   * @example
   *
   * _.head([1, 2, 3]);
   * // => 1
   *
   * _.head([]);
   * // => undefined
   */
  function head(array) {
    return (array && array.length) ? array[0] : undefined;
  }

  /**
   * Gets the index at which the first occurrence of `value` is found in `array`
   * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
   * for equality comparisons. If `fromIndex` is negative, it's used as the
   * offset from the end of `array`.
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Array
   * @param {Array} array The array to inspect.
   * @param {*} value The value to search for.
   * @param {number} [fromIndex=0] The index to search from.
   * @returns {number} Returns the index of the matched value, else `-1`.
   * @example
   *
   * _.indexOf([1, 2, 1, 2], 2);
   * // => 1
   *
   * // Search from the `fromIndex`.
   * _.indexOf([1, 2, 1, 2], 2, 2);
   * // => 3
   */
  function indexOf(array, value, fromIndex) {
    var length = array == null ? 0 : array.length;
    if (typeof fromIndex == 'number') {
      fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex;
    } else {
      fromIndex = 0;
    }
    var index = (fromIndex || 0) - 1,
        isReflexive = value === value;

    while (++index < length) {
      var other = array[index];
      if ((isReflexive ? other === value : other !== other)) {
        return index;
      }
    }
    return -1;
  }

  /**
   * Gets the last element of `array`.
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Array
   * @param {Array} array The array to query.
   * @returns {*} Returns the last element of `array`.
   * @example
   *
   * _.last([1, 2, 3]);
   * // => 3
   */
  function last(array) {
    var length = array == null ? 0 : array.length;
    return length ? array[length - 1] : undefined;
  }

  /**
   * Creates a slice of `array` from `start` up to, but not including, `end`.
   *
   * **Note:** This method is used instead of
   * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are
   * returned.
   *
   * @static
   * @memberOf _
   * @since 3.0.0
   * @category Array
   * @param {Array} array The array to slice.
   * @param {number} [start=0] The start position.
   * @param {number} [end=array.length] The end position.
   * @returns {Array} Returns the slice of `array`.
   */
  function slice(array, start, end) {
    var length = array == null ? 0 : array.length;
    start = start == null ? 0 : +start;
    end = end === undefined ? length : +end;
    return length ? baseSlice(array, start, end) : [];
  }

  /*------------------------------------------------------------------------*/

  /**
   * Creates a `lodash` wrapper instance that wraps `value` with explicit method
   * chain sequences enabled. The result of such sequences must be unwrapped
   * with `_#value`.
   *
   * @static
   * @memberOf _
   * @since 1.3.0
   * @category Seq
   * @param {*} value The value to wrap.
   * @returns {Object} Returns the new `lodash` wrapper instance.
   * @example
   *
   * var users = [
   *   { 'user': 'barney',  'age': 36 },
   *   { 'user': 'fred',    'age': 40 },
   *   { 'user': 'pebbles', 'age': 1 }
   * ];
   *
   * var youngest = _
   *   .chain(users)
   *   .sortBy('age')
   *   .map(function(o) {
   *     return o.user + ' is ' + o.age;
   *   })
   *   .head()
   *   .value();
   * // => 'pebbles is 1'
   */
  function chain(value) {
    var result = lodash(value);
    result.__chain__ = true;
    return result;
  }

  /**
   * This method invokes `interceptor` and returns `value`. The interceptor
   * is invoked with one argument; (value). The purpose of this method is to
   * "tap into" a method chain sequence in order to modify intermediate results.
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Seq
   * @param {*} value The value to provide to `interceptor`.
   * @param {Function} interceptor The function to invoke.
   * @returns {*} Returns `value`.
   * @example
   *
   * _([1, 2, 3])
   *  .tap(function(array) {
   *    // Mutate input array.
   *    array.pop();
   *  })
   *  .reverse()
   *  .value();
   * // => [2, 1]
   */
  function tap(value, interceptor) {
    interceptor(value);
    return value;
  }

  /**
   * This method is like `_.tap` except that it returns the result of `interceptor`.
   * The purpose of this method is to "pass thru" values replacing intermediate
   * results in a method chain sequence.
   *
   * @static
   * @memberOf _
   * @since 3.0.0
   * @category Seq
   * @param {*} value The value to provide to `interceptor`.
   * @param {Function} interceptor The function to invoke.
   * @returns {*} Returns the result of `interceptor`.
   * @example
   *
   * _('  abc  ')
   *  .chain()
   *  .trim()
   *  .thru(function(value) {
   *    return [value];
   *  })
   *  .value();
   * // => ['abc']
   */
  function thru(value, interceptor) {
    return interceptor(value);
  }

  /**
   * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.
   *
   * @name chain
   * @memberOf _
   * @since 0.1.0
   * @category Seq
   * @returns {Object} Returns the new `lodash` wrapper instance.
   * @example
   *
   * var users = [
   *   { 'user': 'barney', 'age': 36 },
   *   { 'user': 'fred',   'age': 40 }
   * ];
   *
   * // A sequence without explicit chaining.
   * _(users).head();
   * // => { 'user': 'barney', 'age': 36 }
   *
   * // A sequence with explicit chaining.
   * _(users)
   *   .chain()
   *   .head()
   *   .pick('user')
   *   .value();
   * // => { 'user': 'barney' }
   */
  function wrapperChain() {
    return chain(this);
  }

  /**
   * Executes the chain sequence to resolve the unwrapped value.
   *
   * @name value
   * @memberOf _
   * @since 0.1.0
   * @alias toJSON, valueOf
   * @category Seq
   * @returns {*} Returns the resolved unwrapped value.
   * @example
   *
   * _([1, 2, 3]).value();
   * // => [1, 2, 3]
   */
  function wrapperValue() {
    return baseWrapperValue(this.__wrapped__, this.__actions__);
  }

  /*------------------------------------------------------------------------*/

  /**
   * Checks if `predicate` returns truthy for **all** elements of `collection`.
   * Iteration is stopped once `predicate` returns falsey. The predicate is
   * invoked with three arguments: (value, index|key, collection).
   *
   * **Note:** This method returns `true` for
   * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
   * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
   * elements of empty collections.
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Collection
   * @param {Array|Object} collection The collection to iterate over.
   * @param {Function} [predicate=_.identity] The function invoked per iteration.
   * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
   * @returns {boolean} Returns `true` if all elements pass the predicate check,
   *  else `false`.
   * @example
   *
   * _.every([true, 1, null, 'yes'], Boolean);
   * // => false
   *
   * var users = [
   *   { 'user': 'barney', 'age': 36, 'active': false },
   *   { 'user': 'fred',   'age': 40, 'active': false }
   * ];
   *
   * // The `_.matches` iteratee shorthand.
   * _.every(users, { 'user': 'barney', 'active': false });
   * // => false
   *
   * // The `_.matchesProperty` iteratee shorthand.
   * _.every(users, ['active', false]);
   * // => true
   *
   * // The `_.property` iteratee shorthand.
   * _.every(users, 'active');
   * // => false
   */
  function every(collection, predicate, guard) {
    predicate = guard ? undefined : predicate;
    return baseEvery(collection, baseIteratee(predicate));
  }

  /**
   * Iterates over elements of `collection`, returning an array of all elements
   * `predicate` returns truthy for. The predicate is invoked with three
   * arguments: (value, index|key, collection).
   *
   * **Note:** Unlike `_.remove`, this method returns a new array.
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Collection
   * @param {Array|Object} collection The collection to iterate over.
   * @param {Function} [predicate=_.identity] The function invoked per iteration.
   * @returns {Array} Returns the new filtered array.
   * @see _.reject
   * @example
   *
   * var users = [
   *   { 'user': 'barney', 'age': 36, 'active': true },
   *   { 'user': 'fred',   'age': 40, 'active': false }
   * ];
   *
   * _.filter(users, function(o) { return !o.active; });
   * // => objects for ['fred']
   *
   * // The `_.matches` iteratee shorthand.
   * _.filter(users, { 'age': 36, 'active': true });
   * // => objects for ['barney']
   *
   * // The `_.matchesProperty` iteratee shorthand.
   * _.filter(users, ['active', false]);
   * // => objects for ['fred']
   *
   * // The `_.property` iteratee shorthand.
   * _.filter(users, 'active');
   * // => objects for ['barney']
   *
   * // Combining several predicates using `_.overEvery` or `_.overSome`.
   * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));
   * // => objects for ['fred', 'barney']
   */
  function filter(collection, predicate) {
    return baseFilter(collection, baseIteratee(predicate));
  }

  /**
   * Iterates over elements of `collection`, returning the first element
   * `predicate` returns truthy for. The predicate is invoked with three
   * arguments: (value, index|key, collection).
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Collection
   * @param {Array|Object} collection The collection to inspect.
   * @param {Function} [predicate=_.identity] The function invoked per iteration.
   * @param {number} [fromIndex=0] The index to search from.
   * @returns {*} Returns the matched element, else `undefined`.
   * @example
   *
   * var users = [
   *   { 'user': 'barney',  'age': 36, 'active': true },
   *   { 'user': 'fred',    'age': 40, 'active': false },
   *   { 'user': 'pebbles', 'age': 1,  'active': true }
   * ];
   *
   * _.find(users, function(o) { return o.age < 40; });
   * // => object for 'barney'
   *
   * // The `_.matches` iteratee shorthand.
   * _.find(users, { 'age': 1, 'active': true });
   * // => object for 'pebbles'
   *
   * // The `_.matchesProperty` iteratee shorthand.
   * _.find(users, ['active', false]);
   * // => object for 'fred'
   *
   * // The `_.property` iteratee shorthand.
   * _.find(users, 'active');
   * // => object for 'barney'
   */
  var find = createFind(findIndex);

  /**
   * Iterates over elements of `collection` and invokes `iteratee` for each element.
   * The iteratee is invoked with three arguments: (value, index|key, collection).
   * Iteratee functions may exit iteration early by explicitly returning `false`.
   *
   * **Note:** As with other "Collections" methods, objects with a "length"
   * property are iterated like arrays. To avoid this behavior use `_.forIn`
   * or `_.forOwn` for object iteration.
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @alias each
   * @category Collection
   * @param {Array|Object} collection The collection to iterate over.
   * @param {Function} [iteratee=_.identity] The function invoked per iteration.
   * @returns {Array|Object} Returns `collection`.
   * @see _.forEachRight
   * @example
   *
   * _.forEach([1, 2], function(value) {
   *   console.log(value);
   * });
   * // => Logs `1` then `2`.
   *
   * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
   *   console.log(key);
   * });
   * // => Logs 'a' then 'b' (iteration order is not guaranteed).
   */
  function forEach(collection, iteratee) {
    return baseEach(collection, baseIteratee(iteratee));
  }

  /**
   * Creates an array of values by running each element in `collection` thru
   * `iteratee`. The iteratee is invoked with three arguments:
   * (value, index|key, collection).
   *
   * Many lodash methods are guarded to work as iteratees for methods like
   * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
   *
   * The guarded methods are:
   * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
   * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
   * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
   * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Collection
   * @param {Array|Object} collection The collection to iterate over.
   * @param {Function} [iteratee=_.identity] The function invoked per iteration.
   * @returns {Array} Returns the new mapped array.
   * @example
   *
   * function square(n) {
   *   return n * n;
   * }
   *
   * _.map([4, 8], square);
   * // => [16, 64]
   *
   * _.map({ 'a': 4, 'b': 8 }, square);
   * // => [16, 64] (iteration order is not guaranteed)
   *
   * var users = [
   *   { 'user': 'barney' },
   *   { 'user': 'fred' }
   * ];
   *
   * // The `_.property` iteratee shorthand.
   * _.map(users, 'user');
   * // => ['barney', 'fred']
   */
  function map(collection, iteratee) {
    return baseMap(collection, baseIteratee(iteratee));
  }

  /**
   * Reduces `collection` to a value which is the accumulated result of running
   * each element in `collection` thru `iteratee`, where each successive
   * invocation is supplied the return value of the previous. If `accumulator`
   * is not given, the first element of `collection` is used as the initial
   * value. The iteratee is invoked with four arguments:
   * (accumulator, value, index|key, collection).
   *
   * Many lodash methods are guarded to work as iteratees for methods like
   * `_.reduce`, `_.reduceRight`, and `_.transform`.
   *
   * The guarded methods are:
   * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
   * and `sortBy`
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Collection
   * @param {Array|Object} collection The collection to iterate over.
   * @param {Function} [iteratee=_.identity] The function invoked per iteration.
   * @param {*} [accumulator] The initial value.
   * @returns {*} Returns the accumulated value.
   * @see _.reduceRight
   * @example
   *
   * _.reduce([1, 2], function(sum, n) {
   *   return sum + n;
   * }, 0);
   * // => 3
   *
   * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
   *   (result[value] || (result[value] = [])).push(key);
   *   return result;
   * }, {});
   * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
   */
  function reduce(collection, iteratee, accumulator) {
    return baseReduce(collection, baseIteratee(iteratee), accumulator, arguments.length < 3, baseEach);
  }

  /**
   * Gets the size of `collection` by returning its length for array-like
   * values or the number of own enumerable string keyed properties for objects.
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Collection
   * @param {Array|Object|string} collection The collection to inspect.
   * @returns {number} Returns the collection size.
   * @example
   *
   * _.size([1, 2, 3]);
   * // => 3
   *
   * _.size({ 'a': 1, 'b': 2 });
   * // => 2
   *
   * _.size('pebbles');
   * // => 7
   */
  function size(collection) {
    if (collection == null) {
      return 0;
    }
    collection = isArrayLike(collection) ? collection : nativeKeys(collection);
    return collection.length;
  }

  /**
   * Checks if `predicate` returns truthy for **any** element of `collection`.
   * Iteration is stopped once `predicate` returns truthy. The predicate is
   * invoked with three arguments: (value, index|key, collection).
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Collection
   * @param {Array|Object} collection The collection to iterate over.
   * @param {Function} [predicate=_.identity] The function invoked per iteration.
   * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
   * @returns {boolean} Returns `true` if any element passes the predicate check,
   *  else `false`.
   * @example
   *
   * _.some([null, 0, 'yes', false], Boolean);
   * // => true
   *
   * var users = [
   *   { 'user': 'barney', 'active': true },
   *   { 'user': 'fred',   'active': false }
   * ];
   *
   * // The `_.matches` iteratee shorthand.
   * _.some(users, { 'user': 'barney', 'active': false });
   * // => false
   *
   * // The `_.matchesProperty` iteratee shorthand.
   * _.some(users, ['active', false]);
   * // => true
   *
   * // The `_.property` iteratee shorthand.
   * _.some(users, 'active');
   * // => true
   */
  function some(collection, predicate, guard) {
    predicate = guard ? undefined : predicate;
    return baseSome(collection, baseIteratee(predicate));
  }

  /**
   * Creates an array of elements, sorted in ascending order by the results of
   * running each element in a collection thru each iteratee. This method
   * performs a stable sort, that is, it preserves the original sort order of
   * equal elements. The iteratees are invoked with one argument: (value).
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Collection
   * @param {Array|Object} collection The collection to iterate over.
   * @param {...(Function|Function[])} [iteratees=[_.identity]]
   *  The iteratees to sort by.
   * @returns {Array} Returns the new sorted array.
   * @example
   *
   * var users = [
   *   { 'user': 'fred',   'age': 48 },
   *   { 'user': 'barney', 'age': 36 },
   *   { 'user': 'fred',   'age': 30 },
   *   { 'user': 'barney', 'age': 34 }
   * ];
   *
   * _.sortBy(users, [function(o) { return o.user; }]);
   * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]
   *
   * _.sortBy(users, ['user', 'age']);
   * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]
   */
  function sortBy(collection, iteratee) {
    var index = 0;
    iteratee = baseIteratee(iteratee);

    return baseMap(baseMap(collection, function(value, key, collection) {
      return { 'value': value, 'index': index++, 'criteria': iteratee(value, key, collection) };
    }).sort(function(object, other) {
      return compareAscending(object.criteria, other.criteria) || (object.index - other.index);
    }), baseProperty('value'));
  }

  /*------------------------------------------------------------------------*/

  /**
   * Creates a function that invokes `func`, with the `this` binding and arguments
   * of the created function, while it's called less than `n` times. Subsequent
   * calls to the created function return the result of the last `func` invocation.
   *
   * @static
   * @memberOf _
   * @since 3.0.0
   * @category Function
   * @param {number} n The number of calls at which `func` is no longer invoked.
   * @param {Function} func The function to restrict.
   * @returns {Function} Returns the new restricted function.
   * @example
   *
   * jQuery(element).on('click', _.before(5, addContactToList));
   * // => Allows adding up to 4 contacts to the list.
   */
  function before(n, func) {
    var result;
    if (typeof func != 'function') {
      throw new TypeError(FUNC_ERROR_TEXT);
    }
    n = toInteger(n);
    return function() {
      if (--n > 0) {
        result = func.apply(this, arguments);
      }
      if (n <= 1) {
        func = undefined;
      }
      return result;
    };
  }

  /**
   * Creates a function that invokes `func` with the `this` binding of `thisArg`
   * and `partials` prepended to the arguments it receives.
   *
   * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
   * may be used as a placeholder for partially applied arguments.
   *
   * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
   * property of bound functions.
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Function
   * @param {Function} func The function to bind.
   * @param {*} thisArg The `this` binding of `func`.
   * @param {...*} [partials] The arguments to be partially applied.
   * @returns {Function} Returns the new bound function.
   * @example
   *
   * function greet(greeting, punctuation) {
   *   return greeting + ' ' + this.user + punctuation;
   * }
   *
   * var object = { 'user': 'fred' };
   *
   * var bound = _.bind(greet, object, 'hi');
   * bound('!');
   * // => 'hi fred!'
   *
   * // Bound with placeholders.
   * var bound = _.bind(greet, object, _, '!');
   * bound('hi');
   * // => 'hi fred!'
   */
  var bind = baseRest(function(func, thisArg, partials) {
    return createPartial(func, WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG, thisArg, partials);
  });

  /**
   * Defers invoking the `func` until the current call stack has cleared. Any
   * additional arguments are provided to `func` when it's invoked.
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Function
   * @param {Function} func The function to defer.
   * @param {...*} [args] The arguments to invoke `func` with.
   * @returns {number} Returns the timer id.
   * @example
   *
   * _.defer(function(text) {
   *   console.log(text);
   * }, 'deferred');
   * // => Logs 'deferred' after one millisecond.
   */
  var defer = baseRest(function(func, args) {
    return baseDelay(func, 1, args);
  });

  /**
   * Invokes `func` after `wait` milliseconds. Any additional arguments are
   * provided to `func` when it's invoked.
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Function
   * @param {Function} func The function to delay.
   * @param {number} wait The number of milliseconds to delay invocation.
   * @param {...*} [args] The arguments to invoke `func` with.
   * @returns {number} Returns the timer id.
   * @example
   *
   * _.delay(function(text) {
   *   console.log(text);
   * }, 1000, 'later');
   * // => Logs 'later' after one second.
   */
  var delay = baseRest(function(func, wait, args) {
    return baseDelay(func, toNumber(wait) || 0, args);
  });

  /**
   * Creates a function that negates the result of the predicate `func`. The
   * `func` predicate is invoked with the `this` binding and arguments of the
   * created function.
   *
   * @static
   * @memberOf _
   * @since 3.0.0
   * @category Function
   * @param {Function} predicate The predicate to negate.
   * @returns {Function} Returns the new negated function.
   * @example
   *
   * function isEven(n) {
   *   return n % 2 == 0;
   * }
   *
   * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
   * // => [1, 3, 5]
   */
  function negate(predicate) {
    if (typeof predicate != 'function') {
      throw new TypeError(FUNC_ERROR_TEXT);
    }
    return function() {
      var args = arguments;
      return !predicate.apply(this, args);
    };
  }

  /**
   * Creates a function that is restricted to invoking `func` once. Repeat calls
   * to the function return the value of the first invocation. The `func` is
   * invoked with the `this` binding and arguments of the created function.
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Function
   * @param {Function} func The function to restrict.
   * @returns {Function} Returns the new restricted function.
   * @example
   *
   * var initialize = _.once(createApplication);
   * initialize();
   * initialize();
   * // => `createApplication` is invoked once
   */
  function once(func) {
    return before(2, func);
  }

  /*------------------------------------------------------------------------*/

  /**
   * Creates a shallow clone of `value`.
   *
   * **Note:** This method is loosely based on the
   * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
   * and supports cloning arrays, array buffers, booleans, date objects, maps,
   * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
   * arrays. The own enumerable properties of `arguments` objects are cloned
   * as plain objects. An empty object is returned for uncloneable values such
   * as error objects, functions, DOM nodes, and WeakMaps.
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Lang
   * @param {*} value The value to clone.
   * @returns {*} Returns the cloned value.
   * @see _.cloneDeep
   * @example
   *
   * var objects = [{ 'a': 1 }, { 'b': 2 }];
   *
   * var shallow = _.clone(objects);
   * console.log(shallow[0] === objects[0]);
   * // => true
   */
  function clone(value) {
    if (!isObject(value)) {
      return value;
    }
    return isArray(value) ? copyArray(value) : copyObject(value, nativeKeys(value));
  }

  /**
   * Performs a
   * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
   * comparison between two values to determine if they are equivalent.
   *
   * @static
   * @memberOf _
   * @since 4.0.0
   * @category Lang
   * @param {*} value The value to compare.
   * @param {*} other The other value to compare.
   * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
   * @example
   *
   * var object = { 'a': 1 };
   * var other = { 'a': 1 };
   *
   * _.eq(object, object);
   * // => true
   *
   * _.eq(object, other);
   * // => false
   *
   * _.eq('a', 'a');
   * // => true
   *
   * _.eq('a', Object('a'));
   * // => false
   *
   * _.eq(NaN, NaN);
   * // => true
   */
  function eq(value, other) {
    return value === other || (value !== value && other !== other);
  }

  /**
   * Checks if `value` is likely an `arguments` object.
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Lang
   * @param {*} value The value to check.
   * @returns {boolean} Returns `true` if `value` is an `arguments` object,
   *  else `false`.
   * @example
   *
   * _.isArguments(function() { return arguments; }());
   * // => true
   *
   * _.isArguments([1, 2, 3]);
   * // => false
   */
  var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
    return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
      !propertyIsEnumerable.call(value, 'callee');
  };

  /**
   * Checks if `value` is classified as an `Array` object.
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Lang
   * @param {*} value The value to check.
   * @returns {boolean} Returns `true` if `value` is an array, else `false`.
   * @example
   *
   * _.isArray([1, 2, 3]);
   * // => true
   *
   * _.isArray(document.body.children);
   * // => false
   *
   * _.isArray('abc');
   * // => false
   *
   * _.isArray(_.noop);
   * // => false
   */
  var isArray = Array.isArray;

  /**
   * Checks if `value` is array-like. A value is considered array-like if it's
   * not a function and has a `value.length` that's an integer greater than or
   * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
   *
   * @static
   * @memberOf _
   * @since 4.0.0
   * @category Lang
   * @param {*} value The value to check.
   * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
   * @example
   *
   * _.isArrayLike([1, 2, 3]);
   * // => true
   *
   * _.isArrayLike(document.body.children);
   * // => true
   *
   * _.isArrayLike('abc');
   * // => true
   *
   * _.isArrayLike(_.noop);
   * // => false
   */
  function isArrayLike(value) {
    return value != null && isLength(value.length) && !isFunction(value);
  }

  /**
   * Checks if `value` is classified as a boolean primitive or object.
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Lang
   * @param {*} value The value to check.
   * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
   * @example
   *
   * _.isBoolean(false);
   * // => true
   *
   * _.isBoolean(null);
   * // => false
   */
  function isBoolean(value) {
    return value === true || value === false ||
      (isObjectLike(value) && baseGetTag(value) == boolTag);
  }

  /**
   * Checks if `value` is classified as a `Date` object.
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Lang
   * @param {*} value The value to check.
   * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
   * @example
   *
   * _.isDate(new Date);
   * // => true
   *
   * _.isDate('Mon April 23 2012');
   * // => false
   */
  var isDate = baseIsDate;

  /**
   * Checks if `value` is an empty object, collection, map, or set.
   *
   * Objects are considered empty if they have no own enumerable string keyed
   * properties.
   *
   * Array-like values such as `arguments` objects, arrays, buffers, strings, or
   * jQuery-like collections are considered empty if they have a `length` of `0`.
   * Similarly, maps and sets are considered empty if they have a `size` of `0`.
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Lang
   * @param {*} value The value to check.
   * @returns {boolean} Returns `true` if `value` is empty, else `false`.
   * @example
   *
   * _.isEmpty(null);
   * // => true
   *
   * _.isEmpty(true);
   * // => true
   *
   * _.isEmpty(1);
   * // => true
   *
   * _.isEmpty([1, 2, 3]);
   * // => false
   *
   * _.isEmpty({ 'a': 1 });
   * // => false
   */
  function isEmpty(value) {
    if (isArrayLike(value) &&
        (isArray(value) || isString(value) ||
          isFunction(value.splice) || isArguments(value))) {
      return !value.length;
    }
    return !nativeKeys(value).length;
  }

  /**
   * Performs a deep comparison between two values to determine if they are
   * equivalent.
   *
   * **Note:** This method supports comparing arrays, array buffers, booleans,
   * date objects, error objects, maps, numbers, `Object` objects, regexes,
   * sets, strings, symbols, and typed arrays. `Object` objects are compared
   * by their own, not inherited, enumerable properties. Functions and DOM
   * nodes are compared by strict equality, i.e. `===`.
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Lang
   * @param {*} value The value to compare.
   * @param {*} other The other value to compare.
   * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
   * @example
   *
   * var object = { 'a': 1 };
   * var other = { 'a': 1 };
   *
   * _.isEqual(object, other);
   * // => true
   *
   * object === other;
   * // => false
   */
  function isEqual(value, other) {
    return baseIsEqual(value, other);
  }

  /**
   * Checks if `value` is a finite primitive number.
   *
   * **Note:** This method is based on
   * [`Number.isFinite`](https://mdn.io/Number/isFinite).
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Lang
   * @param {*} value The value to check.
   * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
   * @example
   *
   * _.isFinite(3);
   * // => true
   *
   * _.isFinite(Number.MIN_VALUE);
   * // => true
   *
   * _.isFinite(Infinity);
   * // => false
   *
   * _.isFinite('3');
   * // => false
   */
  function isFinite(value) {
    return typeof value == 'number' && nativeIsFinite(value);
  }

  /**
   * Checks if `value` is classified as a `Function` object.
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Lang
   * @param {*} value The value to check.
   * @returns {boolean} Returns `true` if `value` is a function, else `false`.
   * @example
   *
   * _.isFunction(_);
   * // => true
   *
   * _.isFunction(/abc/);
   * // => false
   */
  function isFunction(value) {
    if (!isObject(value)) {
      return false;
    }
    // The use of `Object#toString` avoids issues with the `typeof` operator
    // in Safari 9 which returns 'object' for typed arrays and other constructors.
    var tag = baseGetTag(value);
    return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
  }

  /**
   * Checks if `value` is a valid array-like length.
   *
   * **Note:** This method is loosely based on
   * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
   *
   * @static
   * @memberOf _
   * @since 4.0.0
   * @category Lang
   * @param {*} value The value to check.
   * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
   * @example
   *
   * _.isLength(3);
   * // => true
   *
   * _.isLength(Number.MIN_VALUE);
   * // => false
   *
   * _.isLength(Infinity);
   * // => false
   *
   * _.isLength('3');
   * // => false
   */
  function isLength(value) {
    return typeof value == 'number' &&
      value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
  }

  /**
   * Checks if `value` is the
   * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
   * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Lang
   * @param {*} value The value to check.
   * @returns {boolean} Returns `true` if `value` is an object, else `false`.
   * @example
   *
   * _.isObject({});
   * // => true
   *
   * _.isObject([1, 2, 3]);
   * // => true
   *
   * _.isObject(_.noop);
   * // => true
   *
   * _.isObject(null);
   * // => false
   */
  function isObject(value) {
    var type = typeof value;
    return value != null && (type == 'object' || type == 'function');
  }

  /**
   * Checks if `value` is object-like. A value is object-like if it's not `null`
   * and has a `typeof` result of "object".
   *
   * @static
   * @memberOf _
   * @since 4.0.0
   * @category Lang
   * @param {*} value The value to check.
   * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
   * @example
   *
   * _.isObjectLike({});
   * // => true
   *
   * _.isObjectLike([1, 2, 3]);
   * // => true
   *
   * _.isObjectLike(_.noop);
   * // => false
   *
   * _.isObjectLike(null);
   * // => false
   */
  function isObjectLike(value) {
    return value != null && typeof value == 'object';
  }

  /**
   * Checks if `value` is `NaN`.
   *
   * **Note:** This method is based on
   * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
   * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
   * `undefined` and other non-number values.
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Lang
   * @param {*} value The value to check.
   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
   * @example
   *
   * _.isNaN(NaN);
   * // => true
   *
   * _.isNaN(new Number(NaN));
   * // => true
   *
   * isNaN(undefined);
   * // => true
   *
   * _.isNaN(undefined);
   * // => false
   */
  function isNaN(value) {
    // An `NaN` primitive is the only value that is not equal to itself.
    // Perform the `toStringTag` check first to avoid errors with some
    // ActiveX objects in IE.
    return isNumber(value) && value != +value;
  }

  /**
   * Checks if `value` is `null`.
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Lang
   * @param {*} value The value to check.
   * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
   * @example
   *
   * _.isNull(null);
   * // => true
   *
   * _.isNull(void 0);
   * // => false
   */
  function isNull(value) {
    return value === null;
  }

  /**
   * Checks if `value` is classified as a `Number` primitive or object.
   *
   * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
   * classified as numbers, use the `_.isFinite` method.
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Lang
   * @param {*} value The value to check.
   * @returns {boolean} Returns `true` if `value` is a number, else `false`.
   * @example
   *
   * _.isNumber(3);
   * // => true
   *
   * _.isNumber(Number.MIN_VALUE);
   * // => true
   *
   * _.isNumber(Infinity);
   * // => true
   *
   * _.isNumber('3');
   * // => false
   */
  function isNumber(value) {
    return typeof value == 'number' ||
      (isObjectLike(value) && baseGetTag(value) == numberTag);
  }

  /**
   * Checks if `value` is classified as a `RegExp` object.
   *
   * @static
   * @memberOf _
   * @since 0.1.0
   * @category Lang
   * @param {*} value The value to check.
   * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
   * @example
   *
   * _.isRegExp(/abc/);
   * // => true
   *
   * _.isRegExp('/abc/');
   * // => false
   */
  var isRegExp = baseIsRegExp;

  /**
   * Checks if `value` is classified as a `String` primitive or object.
   *
   * @static
   * @since 0.1.0
   * @memberOf _
   * @category Lang
   * @param {*} value The value to check.
   * @returns {boolean} Returns `true` if `value` is a string, else `false`.
   * @example
   *
   * _.isString('abc');
   * // => true
   *
   * _.isString(1);
   * // => false
   */
  function isString(value) {
    return typeof value == 'string' ||
      (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);
  }

  /**
   * Checks if `value` is `undefined`.
   *
   * @static
   * @since 0.1.0
   * @memberOf _
   * @category Lang
   * @param {*} value The value to check.
   * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
   * @example
   *
   * _.isUndefined(void 0);
   * // => true
   *
   * _.isUndefined(null);
   * // => false
   */
  function isUndefined(value) {
    return value === undefined;
  }

  /**
   * Converts `value` to an array.
   *
   * @static
   * @since 0.1.0
   * @memberOf _
   * @category Lang
   * @param {*} value The value to convert.
   * @returns {Array} Returns the converted array.
   * @example
   *
   * _.toArray({ 'a': 1, 'b': 2 });
   * // => [1, 2]
   *
   * _.toArray('abc');
   * // => ['a', 'b', 'c']
   *
   * _.toArray(1);
   * // => []
   *
   * _.toArray(null);
   * // => []
   */
  function toArray(value) {
    if (!isArrayLike(value)) {
      return values(value);
    }
    return value.length ? copyArray(value) : [];
  }

  /**
   * Converts `value` to an integer.
   *
   * **Note:** This method is loosely based on
   * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
   *
   * @static
   * @memberOf _
   * @since 4.0.0
   * @category Lang
   * @param {*} value The value to convert.
   * @returns {number} Returns the converted integer.
   * @example
   *
   * _.toInteger(3.2);
   * // => 3
   *
   * _.toInteger(Number.MIN_VALUE);
   * // => 0
   *
   * _.toInteger(Infinity);
   * // => 1.7976931348623157e+308
   *
   * _.toInteger('3.2');
   * // => 3
   */
  var toInteger = Number;

  /**
   * Converts `value` to a number.
   *
   * @static
   * @memberOf _
   * @since 4.0.0
   * @category Lang
   * @param {*} value The value to process.
   * @returns {number} Returns the number.
   * @example
   *
   * _.toNumber(3.2);
   * // => 3.2
   *
   * _.toNumber(Number.MIN_VALUE);
   * // => 5e-324
   *
   * _.toNumber(Infinity);
   * // => Infinity
   *
   * _.toNumber('3.2');
   * // => 3.2
   */
  var toNumber = Number;

  /**
   * Converts `value` to a string. An empty string is returned for `null`
   * and `undefined` values. The sign of `-0` is preserved.
   *
   * @static
   * @memberOf _
   * @since 4.0.0
   * @category Lang
   * @param {*} value The value to convert.
   * @returns {string} Returns the converted string.
   * @example
   *
   * _.toString(null);
   * // => ''
   *
   * _.toString(-0);
   * // => '-0'
   *
   * _.toString([1, 2, 3]);
   * // => '1,2,3'
   */
  function toString(value) {
    if (typeof value == 'string') {
      return value;
    }
    return value == null ? '' : (value + '');
  }

  /*------------------------------------------------------------------------*/

  /**
   * Assigns own enumerable string keyed properties of source objects to the
   * destination object. Source objects are applied from left to right.
   * Subsequent sources overwrite property assignments of previous sources.
   *
   * **Note:** This method mutates `object` and is loosely based on
   * [`Object.assign`](https://mdn.io/Object/assign).
   *
   * @static
   * @memberOf _
   * @since 0.10.0
   * @category Object
   * @param {Object} object The destination object.
   * @param {...Object} [sources] The source objects.
   * @returns {Object} Returns `object`.
   * @see _.assignIn
   * @example
   *
   * function Foo() {
   *   this.a = 1;
   * }
   *
   * function Bar() {
   *   this.c = 3;
   * }
   *
   * Foo.prototype.b = 2;
   * Bar.prototype.d = 4;
   *
   * _.assign({ 'a': 0 }, new Foo, new Bar);
   * // => { 'a': 1, 'c': 3 }
   */
  var assign = createAssigner(function(object, source) {
    copyObject(source, nativeKeys(source), object);
  });

  /**
   * This method is like `_.assign` except that it iterates over own and
   * inherited source properties.
   *
   * **Note:** This method mutates `object`.
   *
   * @static
   * @memberOf _
   * @since 4.0.0
   * @alias extend
   * @category Object
   * @param {Object} object The destination object.
   * @param {...Object} [sources] The source objects.
   * @returns {Object} Returns `object`.
   * @see _.assign
   * @example
   *
   * function Foo() {
   *   this.a = 1;
   * }
   *
   * function Bar() {
   *   this.c = 3;
   * }
   *
   * Foo.prototype.b = 2;
   * Bar.prototype.d = 4;
   *
   * _.assignIn({ 'a': 0 }, new Foo, new Bar);
   * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
   */
  var assignIn = createAssigner(function(object, source) {
    copyObject(source, nativeKeysIn(source), object);
  });

  /**
   * Creates an object that inherits from the `prototype` object. If a
   * `properties` object is given, its own enumerable string keyed properties
   * are assigned to the created object.
   *
   * @static
   * @memberOf _
   * @since 2.3.0
   * @category Object
   * @param {Object} prototype The object to inherit from.
   * @param {Object} [properties] The properties to assign to the object.
   * @returns {Object} Returns the new object.
   * @example
   *
   * function Shape() {
   *   this.x = 0;
   *   this.y = 0;
   * }
   *
   * function Circle() {
   *   Shape.call(this);
   * }
   *
   * Circle.prototype = _.create(Shape.prototype, {
   *   'constructor': Circle
   * });
   *
   * var circle = new Circle;
   * circle instanceof Circle;
   * // => true
   *
   * circle instanceof Shape;
   * // => true
   */
  function create(prototype, properties) {
    var result = baseCreate(prototype);
    return properties == null ? result : assign(result, properties);
  }

  /**
   * Assigns own and inherited enumerable string keyed properties of source
   * objects to the destination object for all destination properties that
   * resolve to `undefined`. Source objects are applied from left to right.
   * Once a property is set, additional values of the same property are ignored.
   *
   * **Note:** This method mutates `object`.
   *
   * @static
   * @since 0.1.0
   * @memberOf _
   * @category Object
   * @param {Object} object The destination object.
   * @param {...Object} [sources] The source objects.
   * @returns {Object} Returns `object`.
   * @see _.defaultsDeep
   * @example
   *
   * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
   * // => { 'a': 1, 'b': 2 }
   */
  var defaults = baseRest(function(object, sources) {
    object = Object(object);

    var index = -1;
    var length = sources.length;
    var guard = length > 2 ? sources[2] : undefined;

    if (guard && isIterateeCall(sources[0], sources[1], guard)) {
      length = 1;
    }

    while (++index < length) {
      var source = sources[index];
      var props = keysIn(source);
      var propsIndex = -1;
      var propsLength = props.length;

      while (++propsIndex < propsLength) {
        var key = props[propsIndex];
        var value = object[key];

        if (value === undefined ||
            (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {
          object[key] = source[key];
        }
      }
    }

    return object;
  });

  /**
   * Checks if `path` is a direct property of `object`.
   *
   * @static
   * @since 0.1.0
   * @memberOf _
   * @category Object
   * @param {Object} object The object to query.
   * @param {Array|string} path The path to check.
   * @returns {boolean} Returns `true` if `path` exists, else `false`.
   * @example
   *
   * var object = { 'a': { 'b': 2 } };
   * var other = _.create({ 'a': _.create({ 'b': 2 }) });
   *
   * _.has(object, 'a');
   * // => true
   *
   * _.has(object, 'a.b');
   * // => true
   *
   * _.has(object, ['a', 'b']);
   * // => true
   *
   * _.has(other, 'a');
   * // => false
   */
  function has(object, path) {
    return object != null && hasOwnProperty.call(object, path);
  }

  /**
   * Creates an array of the own enumerable property names of `object`.
   *
   * **Note:** Non-object values are coerced to objects. See the
   * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
   * for more details.
   *
   * @static
   * @since 0.1.0
   * @memberOf _
   * @category Object
   * @param {Object} object The object to query.
   * @returns {Array} Returns the array of property names.
   * @example
   *
   * function Foo() {
   *   this.a = 1;
   *   this.b = 2;
   * }
   *
   * Foo.prototype.c = 3;
   *
   * _.keys(new Foo);
   * // => ['a', 'b'] (iteration order is not guaranteed)
   *
   * _.keys('hi');
   * // => ['0', '1']
   */
  var keys = nativeKeys;

  /**
   * Creates an array of the own and inherited enumerable property names of `object`.
   *
   * **Note:** Non-object values are coerced to objects.
   *
   * @static
   * @memberOf _
   * @since 3.0.0
   * @category Object
   * @param {Object} object The object to query.
   * @returns {Array} Returns the array of property names.
   * @example
   *
   * function Foo() {
   *   this.a = 1;
   *   this.b = 2;
   * }
   *
   * Foo.prototype.c = 3;
   *
   * _.keysIn(new Foo);
   * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
   */
  var keysIn = nativeKeysIn;

  /**
   * Creates an object composed of the picked `object` properties.
   *
   * @static
   * @since 0.1.0
   * @memberOf _
   * @category Object
   * @param {Object} object The source object.
   * @param {...(string|string[])} [paths] The property paths to pick.
   * @returns {Object} Returns the new object.
   * @example
   *
   * var object = { 'a': 1, 'b': '2', 'c': 3 };
   *
   * _.pick(object, ['a', 'c']);
   * // => { 'a': 1, 'c': 3 }
   */
  var pick = flatRest(function(object, paths) {
    return object == null ? {} : basePick(object, paths);
  });

  /**
   * This method is like `_.get` except that if the resolved value is a
   * function it's invoked with the `this` binding of its parent object and
   * its result is returned.
   *
   * @static
   * @since 0.1.0
   * @memberOf _
   * @category Object
   * @param {Object} object The object to query.
   * @param {Array|string} path The path of the property to resolve.
   * @param {*} [defaultValue] The value returned for `undefined` resolved values.
   * @returns {*} Returns the resolved value.
   * @example
   *
   * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
   *
   * _.result(object, 'a[0].b.c1');
   * // => 3
   *
   * _.result(object, 'a[0].b.c2');
   * // => 4
   *
   * _.result(object, 'a[0].b.c3', 'default');
   * // => 'default'
   *
   * _.result(object, 'a[0].b.c3', _.constant('default'));
   * // => 'default'
   */
  function result(object, path, defaultValue) {
    var value = object == null ? undefined : object[path];
    if (value === undefined) {
      value = defaultValue;
    }
    return isFunction(value) ? value.call(object) : value;
  }

  /**
   * Creates an array of the own enumerable string keyed property values of `object`.
   *
   * **Note:** Non-object values are coerced to objects.
   *
   * @static
   * @since 0.1.0
   * @memberOf _
   * @category Object
   * @param {Object} object The object to query.
   * @returns {Array} Returns the array of property values.
   * @example
   *
   * function Foo() {
   *   this.a = 1;
   *   this.b = 2;
   * }
   *
   * Foo.prototype.c = 3;
   *
   * _.values(new Foo);
   * // => [1, 2] (iteration order is not guaranteed)
   *
   * _.values('hi');
   * // => ['h', 'i']
   */
  function values(object) {
    return object == null ? [] : baseValues(object, keys(object));
  }

  /*------------------------------------------------------------------------*/

  /**
   * Converts the characters "&", "<", ">", '"', and "'" in `string` to their
   * corresponding HTML entities.
   *
   * **Note:** No other characters are escaped. To escape additional
   * characters use a third-party library like [_he_](https://mths.be/he).
   *
   * Though the ">" character is escaped for symmetry, characters like
   * ">" and "/" don't need escaping in HTML and have no special meaning
   * unless they're part of a tag or unquoted attribute value. See
   * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
   * (under "semi-related fun fact") for more details.
   *
   * When working with HTML you should always
   * [quote attribute values](http://wonko.com/post/html-escaping) to reduce
   * XSS vectors.
   *
   * @static
   * @since 0.1.0
   * @memberOf _
   * @category String
   * @param {string} [string=''] The string to escape.
   * @returns {string} Returns the escaped string.
   * @example
   *
   * _.escape('fred, barney, & pebbles');
   * // => 'fred, barney, &amp; pebbles'
   */
  function escape(string) {
    string = toString(string);
    return (string && reHasUnescapedHtml.test(string))
      ? string.replace(reUnescapedHtml, escapeHtmlChar)
      : string;
  }

  /*------------------------------------------------------------------------*/

  /**
   * This method returns the first argument it receives.
   *
   * @static
   * @since 0.1.0
   * @memberOf _
   * @category Util
   * @param {*} value Any value.
   * @returns {*} Returns `value`.
   * @example
   *
   * var object = { 'a': 1 };
   *
   * console.log(_.identity(object) === object);
   * // => true
   */
  function identity(value) {
    return value;
  }

  /**
   * Creates a function that invokes `func` with the arguments of the created
   * function. If `func` is a property name, the created function returns the
   * property value for a given element. If `func` is an array or object, the
   * created function returns `true` for elements that contain the equivalent
   * source properties, otherwise it returns `false`.
   *
   * @static
   * @since 4.0.0
   * @memberOf _
   * @category Util
   * @param {*} [func=_.identity] The value to convert to a callback.
   * @returns {Function} Returns the callback.
   * @example
   *
   * var users = [
   *   { 'user': 'barney', 'age': 36, 'active': true },
   *   { 'user': 'fred',   'age': 40, 'active': false }
   * ];
   *
   * // The `_.matches` iteratee shorthand.
   * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));
   * // => [{ 'user': 'barney', 'age': 36, 'active': true }]
   *
   * // The `_.matchesProperty` iteratee shorthand.
   * _.filter(users, _.iteratee(['user', 'fred']));
   * // => [{ 'user': 'fred', 'age': 40 }]
   *
   * // The `_.property` iteratee shorthand.
   * _.map(users, _.iteratee('user'));
   * // => ['barney', 'fred']
   *
   * // Create custom iteratee shorthands.
   * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {
   *   return !_.isRegExp(func) ? iteratee(func) : function(string) {
   *     return func.test(string);
   *   };
   * });
   *
   * _.filter(['abc', 'def'], /ef/);
   * // => ['def']
   */
  var iteratee = baseIteratee;

  /**
   * Creates a function that performs a partial deep comparison between a given
   * object and `source`, returning `true` if the given object has equivalent
   * property values, else `false`.
   *
   * **Note:** The created function is equivalent to `_.isMatch` with `source`
   * partially applied.
   *
   * Partial comparisons will match empty array and empty object `source`
   * values against any array or object value, respectively. See `_.isEqual`
   * for a list of supported value comparisons.
   *
   * **Note:** Multiple values can be checked by combining several matchers
   * using `_.overSome`
   *
   * @static
   * @memberOf _
   * @since 3.0.0
   * @category Util
   * @param {Object} source The object of property values to match.
   * @returns {Function} Returns the new spec function.
   * @example
   *
   * var objects = [
   *   { 'a': 1, 'b': 2, 'c': 3 },
   *   { 'a': 4, 'b': 5, 'c': 6 }
   * ];
   *
   * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
   * // => [{ 'a': 4, 'b': 5, 'c': 6 }]
   *
   * // Checking for several possible values
   * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));
   * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]
   */
  function matches(source) {
    return baseMatches(assign({}, source));
  }

  /**
   * Adds all own enumerable string keyed function properties of a source
   * object to the destination object. If `object` is a function, then methods
   * are added to its prototype as well.
   *
   * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
   * avoid conflicts caused by modifying the original.
   *
   * @static
   * @since 0.1.0
   * @memberOf _
   * @category Util
   * @param {Function|Object} [object=lodash] The destination object.
   * @param {Object} source The object of functions to add.
   * @param {Object} [options={}] The options object.
   * @param {boolean} [options.chain=true] Specify whether mixins are chainable.
   * @returns {Function|Object} Returns `object`.
   * @example
   *
   * function vowels(string) {
   *   return _.filter(string, function(v) {
   *     return /[aeiou]/i.test(v);
   *   });
   * }
   *
   * _.mixin({ 'vowels': vowels });
   * _.vowels('fred');
   * // => ['e']
   *
   * _('fred').vowels().value();
   * // => ['e']
   *
   * _.mixin({ 'vowels': vowels }, { 'chain': false });
   * _('fred').vowels();
   * // => ['e']
   */
  function mixin(object, source, options) {
    var props = keys(source),
        methodNames = baseFunctions(source, props);

    if (options == null &&
        !(isObject(source) && (methodNames.length || !props.length))) {
      options = source;
      source = object;
      object = this;
      methodNames = baseFunctions(source, keys(source));
    }
    var chain = !(isObject(options) && 'chain' in options) || !!options.chain,
        isFunc = isFunction(object);

    baseEach(methodNames, function(methodName) {
      var func = source[methodName];
      object[methodName] = func;
      if (isFunc) {
        object.prototype[methodName] = function() {
          var chainAll = this.__chain__;
          if (chain || chainAll) {
            var result = object(this.__wrapped__),
                actions = result.__actions__ = copyArray(this.__actions__);

            actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
            result.__chain__ = chainAll;
            return result;
          }
          return func.apply(object, arrayPush([this.value()], arguments));
        };
      }
    });

    return object;
  }

  /**
   * Reverts the `_` variable to its previous value and returns a reference to
   * the `lodash` function.
   *
   * @static
   * @since 0.1.0
   * @memberOf _
   * @category Util
   * @returns {Function} Returns the `lodash` function.
   * @example
   *
   * var lodash = _.noConflict();
   */
  function noConflict() {
    if (root._ === this) {
      root._ = oldDash;
    }
    return this;
  }

  /**
   * This method returns `undefined`.
   *
   * @static
   * @memberOf _
   * @since 2.3.0
   * @category Util
   * @example
   *
   * _.times(2, _.noop);
   * // => [undefined, undefined]
   */
  function noop() {
    // No operation performed.
  }

  /**
   * Generates a unique ID. If `prefix` is given, the ID is appended to it.
   *
   * @static
   * @since 0.1.0
   * @memberOf _
   * @category Util
   * @param {string} [prefix=''] The value to prefix the ID with.
   * @returns {string} Returns the unique ID.
   * @example
   *
   * _.uniqueId('contact_');
   * // => 'contact_104'
   *
   * _.uniqueId();
   * // => '105'
   */
  function uniqueId(prefix) {
    var id = ++idCounter;
    return toString(prefix) + id;
  }

  /*------------------------------------------------------------------------*/

  /**
   * Computes the maximum value of `array`. If `array` is empty or falsey,
   * `undefined` is returned.
   *
   * @static
   * @since 0.1.0
   * @memberOf _
   * @category Math
   * @param {Array} array The array to iterate over.
   * @returns {*} Returns the maximum value.
   * @example
   *
   * _.max([4, 2, 8, 6]);
   * // => 8
   *
   * _.max([]);
   * // => undefined
   */
  function max(array) {
    return (array && array.length)
      ? baseExtremum(array, identity, baseGt)
      : undefined;
  }

  /**
   * Computes the minimum value of `array`. If `array` is empty or falsey,
   * `undefined` is returned.
   *
   * @static
   * @since 0.1.0
   * @memberOf _
   * @category Math
   * @param {Array} array The array to iterate over.
   * @returns {*} Returns the minimum value.
   * @example
   *
   * _.min([4, 2, 8, 6]);
   * // => 2
   *
   * _.min([]);
   * // => undefined
   */
  function min(array) {
    return (array && array.length)
      ? baseExtremum(array, identity, baseLt)
      : undefined;
  }

  /*------------------------------------------------------------------------*/

  // Add methods that return wrapped values in chain sequences.
  lodash.assignIn = assignIn;
  lodash.before = before;
  lodash.bind = bind;
  lodash.chain = chain;
  lodash.compact = compact;
  lodash.concat = concat;
  lodash.create = create;
  lodash.defaults = defaults;
  lodash.defer = defer;
  lodash.delay = delay;
  lodash.filter = filter;
  lodash.flatten = flatten;
  lodash.flattenDeep = flattenDeep;
  lodash.iteratee = iteratee;
  lodash.keys = keys;
  lodash.map = map;
  lodash.matches = matches;
  lodash.mixin = mixin;
  lodash.negate = negate;
  lodash.once = once;
  lodash.pick = pick;
  lodash.slice = slice;
  lodash.sortBy = sortBy;
  lodash.tap = tap;
  lodash.thru = thru;
  lodash.toArray = toArray;
  lodash.values = values;

  // Add aliases.
  lodash.extend = assignIn;

  // Add methods to `lodash.prototype`.
  mixin(lodash, lodash);

  /*------------------------------------------------------------------------*/

  // Add methods that return unwrapped values in chain sequences.
  lodash.clone = clone;
  lodash.escape = escape;
  lodash.every = every;
  lodash.find = find;
  lodash.forEach = forEach;
  lodash.has = has;
  lodash.head = head;
  lodash.identity = identity;
  lodash.indexOf = indexOf;
  lodash.isArguments = isArguments;
  lodash.isArray = isArray;
  lodash.isBoolean = isBoolean;
  lodash.isDate = isDate;
  lodash.isEmpty = isEmpty;
  lodash.isEqual = isEqual;
  lodash.isFinite = isFinite;
  lodash.isFunction = isFunction;
  lodash.isNaN = isNaN;
  lodash.isNull = isNull;
  lodash.isNumber = isNumber;
  lodash.isObject = isObject;
  lodash.isRegExp = isRegExp;
  lodash.isString = isString;
  lodash.isUndefined = isUndefined;
  lodash.last = last;
  lodash.max = max;
  lodash.min = min;
  lodash.noConflict = noConflict;
  lodash.noop = noop;
  lodash.reduce = reduce;
  lodash.result = result;
  lodash.size = size;
  lodash.some = some;
  lodash.uniqueId = uniqueId;

  // Add aliases.
  lodash.each = forEach;
  lodash.first = head;

  mixin(lodash, (function() {
    var source = {};
    baseForOwn(lodash, function(func, methodName) {
      if (!hasOwnProperty.call(lodash.prototype, methodName)) {
        source[methodName] = func;
      }
    });
    return source;
  }()), { 'chain': false });

  /*------------------------------------------------------------------------*/

  /**
   * The semantic version number.
   *
   * @static
   * @memberOf _
   * @type {string}
   */
  lodash.VERSION = VERSION;

  // Add `Array` methods to `lodash.prototype`.
  baseEach(['pop', 'join', 'replace', 'reverse', 'split', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {
    var func = (/^(?:replace|split)$/.test(methodName) ? String.prototype : arrayProto)[methodName],
        chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',
        retUnwrapped = /^(?:pop|join|replace|shift)$/.test(methodName);

    lodash.prototype[methodName] = function() {
      var args = arguments;
      if (retUnwrapped && !this.__chain__) {
        var value = this.value();
        return func.apply(isArray(value) ? value : [], args);
      }
      return this[chainName](function(value) {
        return func.apply(isArray(value) ? value : [], args);
      });
    };
  });

  // Add chain sequence methods to the `lodash` wrapper.
  lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;

  /*--------------------------------------------------------------------------*/

  // Some AMD build optimizers, like r.js, check for condition patterns like:
  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
    // Expose Lodash on the global object to prevent errors when Lodash is
    // loaded by a script tag in the presence of an AMD loader.
    // See http://requirejs.org/docs/errors.html#mismatch for more details.
    // Use `_.noConflict` to remove Lodash from the global object.
    root._ = lodash;

    // Define as an anonymous module so, through path mapping, it can be
    // referenced as the "underscore" module.
    define(function() {
      return lodash;
    });
  }
  // Check for `exports` after `define` in case a build optimizer adds it.
  else if (freeModule) {
    // Export for Node.js.
    (freeModule.exports = lodash)._ = lodash;
    // Export for CommonJS support.
    freeExports._ = lodash;
  }
  else {
    // Export to the global object.
    root._ = lodash;
  }
}.call(this));
/**
 * @license
 * Lodash (Custom Build) lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE
 * Build: `lodash core -o ./dist/lodash.core.js`
 */
;(function(){function n(n){return H(n)&&pn.call(n,"callee")&&!yn.call(n,"callee")}function t(n,t){return n.push.apply(n,t),n}function r(n){return function(t){return null==t?Z:t[n]}}function e(n,t,r,e,u){return u(n,function(n,u,o){r=e?(e=false,n):t(r,n,u,o)}),r}function u(n,t){return j(t,function(t){return n[t]})}function o(n){return n instanceof i?n:new i(n)}function i(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t}function c(n,t,r){if(typeof n!="function")throw new TypeError("Expected a function");
return setTimeout(function(){n.apply(Z,r)},t)}function f(n,t){var r=true;return mn(n,function(n,e,u){return r=!!t(n,e,u)}),r}function a(n,t,r){for(var e=-1,u=n.length;++e<u;){var o=n[e],i=t(o);if(null!=i&&(c===Z?i===i:r(i,c)))var c=i,f=o}return f}function l(n,t){var r=[];return mn(n,function(n,e,u){t(n,e,u)&&r.push(n)}),r}function p(n,r,e,u,o){var i=-1,c=n.length;for(e||(e=R),o||(o=[]);++i<c;){var f=n[i];0<r&&e(f)?1<r?p(f,r-1,e,u,o):t(o,f):u||(o[o.length]=f)}return o}function s(n,t){return n&&On(n,t,Dn);
}function h(n,t){return l(t,function(t){return U(n[t])})}function v(n,t){return n>t}function b(n,t,r,e,u){return n===t||(null==n||null==t||!H(n)&&!H(t)?n!==n&&t!==t:y(n,t,r,e,b,u))}function y(n,t,r,e,u,o){var i=Nn(n),c=Nn(t),f=i?"[object Array]":hn.call(n),a=c?"[object Array]":hn.call(t),f="[object Arguments]"==f?"[object Object]":f,a="[object Arguments]"==a?"[object Object]":a,l="[object Object]"==f,c="[object Object]"==a,a=f==a;o||(o=[]);var p=An(o,function(t){return t[0]==n}),s=An(o,function(n){
return n[0]==t});if(p&&s)return p[1]==t;if(o.push([n,t]),o.push([t,n]),a&&!l){if(i)r=T(n,t,r,e,u,o);else n:{switch(f){case"[object Boolean]":case"[object Date]":case"[object Number]":r=J(+n,+t);break n;case"[object Error]":r=n.name==t.name&&n.message==t.message;break n;case"[object RegExp]":case"[object String]":r=n==t+"";break n}r=false}return o.pop(),r}return 1&r||(i=l&&pn.call(n,"__wrapped__"),f=c&&pn.call(t,"__wrapped__"),!i&&!f)?!!a&&(r=B(n,t,r,e,u,o),o.pop(),r):(i=i?n.value():n,f=f?t.value():t,
r=u(i,f,r,e,o),o.pop(),r)}function g(n){return typeof n=="function"?n:null==n?X:(typeof n=="object"?d:r)(n)}function _(n,t){return n<t}function j(n,t){var r=-1,e=M(n)?Array(n.length):[];return mn(n,function(n,u,o){e[++r]=t(n,u,o)}),e}function d(n){var t=_n(n);return function(r){var e=t.length;if(null==r)return!e;for(r=Object(r);e--;){var u=t[e];if(!(u in r&&b(n[u],r[u],3)))return false}return true}}function m(n,t){return n=Object(n),C(t,function(t,r){return r in n&&(t[r]=n[r]),t},{})}function O(n){return xn(I(n,void 0,X),n+"");
}function x(n,t,r){var e=-1,u=n.length;for(0>t&&(t=-t>u?0:u+t),r=r>u?u:r,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Array(u);++e<u;)r[e]=n[e+t];return r}function A(n){return x(n,0,n.length)}function E(n,t){var r;return mn(n,function(n,e,u){return r=t(n,e,u),!r}),!!r}function w(n,r){return C(r,function(n,r){return r.func.apply(r.thisArg,t([n],r.args))},n)}function k(n,t,r){var e=!r;r||(r={});for(var u=-1,o=t.length;++u<o;){var i=t[u],c=Z;if(c===Z&&(c=n[i]),e)r[i]=c;else{var f=r,a=f[i];pn.call(f,i)&&J(a,c)&&(c!==Z||i in f)||(f[i]=c);
}}return r}function N(n){return O(function(t,r){var e=-1,u=r.length,o=1<u?r[u-1]:Z,o=3<n.length&&typeof o=="function"?(u--,o):Z;for(t=Object(t);++e<u;){var i=r[e];i&&n(t,i,e,o)}return t})}function F(n){return function(){var t=arguments,r=dn(n.prototype),t=n.apply(r,t);return V(t)?t:r}}function S(n,t,r){function e(){for(var o=-1,i=arguments.length,c=-1,f=r.length,a=Array(f+i),l=this&&this!==on&&this instanceof e?u:n;++c<f;)a[c]=r[c];for(;i--;)a[c++]=arguments[++o];return l.apply(t,a)}if(typeof n!="function")throw new TypeError("Expected a function");
var u=F(n);return e}function T(n,t,r,e,u,o){var i=n.length,c=t.length;if(i!=c&&!(1&r&&c>i))return false;var c=o.get(n),f=o.get(t);if(c&&f)return c==t&&f==n;for(var c=-1,f=true,a=2&r?[]:Z;++c<i;){var l=n[c],p=t[c];if(void 0!==Z){f=false;break}if(a){if(!E(t,function(n,t){if(!P(a,t)&&(l===n||u(l,n,r,e,o)))return a.push(t)})){f=false;break}}else if(l!==p&&!u(l,p,r,e,o)){f=false;break}}return f}function B(n,t,r,e,u,o){var i=1&r,c=Dn(n),f=c.length,a=Dn(t).length;if(f!=a&&!i)return false;for(a=f;a--;){var l=c[a];if(!(i?l in t:pn.call(t,l)))return false;
}var p=o.get(n),l=o.get(t);if(p&&l)return p==t&&l==n;for(p=true;++a<f;){var l=c[a],s=n[l],h=t[l];if(void 0!==Z||s!==h&&!u(s,h,r,e,o)){p=false;break}i||(i="constructor"==l)}return p&&!i&&(r=n.constructor,e=t.constructor,r!=e&&"constructor"in n&&"constructor"in t&&!(typeof r=="function"&&r instanceof r&&typeof e=="function"&&e instanceof e)&&(p=false)),p}function R(t){return Nn(t)||n(t)}function D(n){var t=[];if(null!=n)for(var r in Object(n))t.push(r);return t}function I(n,t,r){return t=jn(t===Z?n.length-1:t,0),
function(){for(var e=arguments,u=-1,o=jn(e.length-t,0),i=Array(o);++u<o;)i[u]=e[t+u];for(u=-1,o=Array(t+1);++u<t;)o[u]=e[u];return o[t]=r(i),n.apply(this,o)}}function $(n){return(null==n?0:n.length)?p(n,1):[]}function q(n){return n&&n.length?n[0]:Z}function P(n,t,r){var e=null==n?0:n.length;r=typeof r=="number"?0>r?jn(e+r,0):r:0,r=(r||0)-1;for(var u=t===t;++r<e;){var o=n[r];if(u?o===t:o!==o)return r}return-1}function z(n,t){return mn(n,g(t))}function C(n,t,r){return e(n,g(t),r,3>arguments.length,mn);
}function G(n,t){var r;if(typeof t!="function")throw new TypeError("Expected a function");return n=Fn(n),function(){return 0<--n&&(r=t.apply(this,arguments)),1>=n&&(t=Z),r}}function J(n,t){return n===t||n!==n&&t!==t}function M(n){var t;return(t=null!=n)&&(t=n.length,t=typeof t=="number"&&-1<t&&0==t%1&&9007199254740991>=t),t&&!U(n)}function U(n){return!!V(n)&&(n=hn.call(n),"[object Function]"==n||"[object GeneratorFunction]"==n||"[object AsyncFunction]"==n||"[object Proxy]"==n)}function V(n){var t=typeof n;
return null!=n&&("object"==t||"function"==t)}function H(n){return null!=n&&typeof n=="object"}function K(n){return typeof n=="number"||H(n)&&"[object Number]"==hn.call(n)}function L(n){return typeof n=="string"||!Nn(n)&&H(n)&&"[object String]"==hn.call(n)}function Q(n){return typeof n=="string"?n:null==n?"":n+""}function W(n){return null==n?[]:u(n,Dn(n))}function X(n){return n}function Y(n,r,e){var u=Dn(r),o=h(r,u);null!=e||V(r)&&(o.length||!u.length)||(e=r,r=n,n=this,o=h(r,Dn(r)));var i=!(V(e)&&"chain"in e&&!e.chain),c=U(n);
return mn(o,function(e){var u=r[e];n[e]=u,c&&(n.prototype[e]=function(){var r=this.__chain__;if(i||r){var e=n(this.__wrapped__);return(e.__actions__=A(this.__actions__)).push({func:u,args:arguments,thisArg:n}),e.__chain__=r,e}return u.apply(n,t([this.value()],arguments))})}),n}var Z,nn=1/0,tn=/[&<>"']/g,rn=RegExp(tn.source),en=/^(?:0|[1-9]\d*)$/,un=typeof self=="object"&&self&&self.Object===Object&&self,on=typeof global=="object"&&global&&global.Object===Object&&global||un||Function("return this")(),cn=(un=typeof exports=="object"&&exports&&!exports.nodeType&&exports)&&typeof module=="object"&&module&&!module.nodeType&&module,fn=function(n){
return function(t){return null==n?Z:n[t]}}({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"}),an=Array.prototype,ln=Object.prototype,pn=ln.hasOwnProperty,sn=0,hn=ln.toString,vn=on._,bn=Object.create,yn=ln.propertyIsEnumerable,gn=on.isFinite,_n=function(n,t){return function(r){return n(t(r))}}(Object.keys,Object),jn=Math.max,dn=function(){function n(){}return function(t){return V(t)?bn?bn(t):(n.prototype=t,t=new n,n.prototype=Z,t):{}}}();i.prototype=dn(o.prototype),i.prototype.constructor=i;
var mn=function(n,t){return function(r,e){if(null==r)return r;if(!M(r))return n(r,e);for(var u=r.length,o=t?u:-1,i=Object(r);(t?o--:++o<u)&&false!==e(i[o],o,i););return r}}(s),On=function(n){return function(t,r,e){var u=-1,o=Object(t);e=e(t);for(var i=e.length;i--;){var c=e[n?i:++u];if(false===r(o[c],c,o))break}return t}}(),xn=X,An=function(n){return function(t,r,e){var u=Object(t);if(!M(t)){var o=g(r);t=Dn(t),r=function(n){return o(u[n],n,u)}}return r=n(t,r,e),-1<r?u[o?t[r]:r]:Z}}(function(n,t,r){var e=null==n?0:n.length;
if(!e)return-1;r=null==r?0:Fn(r),0>r&&(r=jn(e+r,0));n:{for(t=g(t),e=n.length,r+=-1;++r<e;)if(t(n[r],r,n)){n=r;break n}n=-1}return n}),En=O(function(n,t,r){return S(n,t,r)}),wn=O(function(n,t){return c(n,1,t)}),kn=O(function(n,t,r){return c(n,Sn(t)||0,r)}),Nn=Array.isArray,Fn=Number,Sn=Number,Tn=N(function(n,t){k(t,_n(t),n)}),Bn=N(function(n,t){k(t,D(t),n)}),Rn=O(function(n,t){n=Object(n);var r,e=-1,u=t.length,o=2<u?t[2]:Z;if(r=o){r=t[0];var i=t[1];if(V(o)){var c=typeof i;if("number"==c){if(c=M(o))var c=o.length,f=typeof i,c=null==c?9007199254740991:c,c=!!c&&("number"==f||"symbol"!=f&&en.test(i))&&-1<i&&0==i%1&&i<c;
}else c="string"==c&&i in o;r=!!c&&J(o[i],r)}else r=false}for(r&&(u=1);++e<u;)for(o=t[e],r=In(o),i=-1,c=r.length;++i<c;){var f=r[i],a=n[f];(a===Z||J(a,ln[f])&&!pn.call(n,f))&&(n[f]=o[f])}return n}),Dn=_n,In=D,$n=function(n){return xn(I(n,Z,$),n+"")}(function(n,t){return null==n?{}:m(n,t)});o.assignIn=Bn,o.before=G,o.bind=En,o.chain=function(n){return n=o(n),n.__chain__=true,n},o.compact=function(n){return l(n,Boolean)},o.concat=function(){var n=arguments.length;if(!n)return[];for(var r=Array(n-1),e=arguments[0];n--;)r[n-1]=arguments[n];
return t(Nn(e)?A(e):[e],p(r,1))},o.create=function(n,t){var r=dn(n);return null==t?r:Tn(r,t)},o.defaults=Rn,o.defer=wn,o.delay=kn,o.filter=function(n,t){return l(n,g(t))},o.flatten=$,o.flattenDeep=function(n){return(null==n?0:n.length)?p(n,nn):[]},o.iteratee=g,o.keys=Dn,o.map=function(n,t){return j(n,g(t))},o.matches=function(n){return d(Tn({},n))},o.mixin=Y,o.negate=function(n){if(typeof n!="function")throw new TypeError("Expected a function");return function(){return!n.apply(this,arguments)}},o.once=function(n){
return G(2,n)},o.pick=$n,o.slice=function(n,t,r){var e=null==n?0:n.length;return r=r===Z?e:+r,e?x(n,null==t?0:+t,r):[]},o.sortBy=function(n,t){var e=0;return t=g(t),j(j(n,function(n,r,u){return{value:n,index:e++,criteria:t(n,r,u)}}).sort(function(n,t){var r;n:{r=n.criteria;var e=t.criteria;if(r!==e){var u=r!==Z,o=null===r,i=r===r,c=e!==Z,f=null===e,a=e===e;if(!f&&r>e||o&&c&&a||!u&&a||!i){r=1;break n}if(!o&&r<e||f&&u&&i||!c&&i||!a){r=-1;break n}}r=0}return r||n.index-t.index}),r("value"))},o.tap=function(n,t){
return t(n),n},o.thru=function(n,t){return t(n)},o.toArray=function(n){return M(n)?n.length?A(n):[]:W(n)},o.values=W,o.extend=Bn,Y(o,o),o.clone=function(n){return V(n)?Nn(n)?A(n):k(n,_n(n)):n},o.escape=function(n){return(n=Q(n))&&rn.test(n)?n.replace(tn,fn):n},o.every=function(n,t,r){return t=r?Z:t,f(n,g(t))},o.find=An,o.forEach=z,o.has=function(n,t){return null!=n&&pn.call(n,t)},o.head=q,o.identity=X,o.indexOf=P,o.isArguments=n,o.isArray=Nn,o.isBoolean=function(n){return true===n||false===n||H(n)&&"[object Boolean]"==hn.call(n);
},o.isDate=function(n){return H(n)&&"[object Date]"==hn.call(n)},o.isEmpty=function(t){return M(t)&&(Nn(t)||L(t)||U(t.splice)||n(t))?!t.length:!_n(t).length},o.isEqual=function(n,t){return b(n,t)},o.isFinite=function(n){return typeof n=="number"&&gn(n)},o.isFunction=U,o.isNaN=function(n){return K(n)&&n!=+n},o.isNull=function(n){return null===n},o.isNumber=K,o.isObject=V,o.isRegExp=function(n){return H(n)&&"[object RegExp]"==hn.call(n)},o.isString=L,o.isUndefined=function(n){return n===Z},o.last=function(n){
var t=null==n?0:n.length;return t?n[t-1]:Z},o.max=function(n){return n&&n.length?a(n,X,v):Z},o.min=function(n){return n&&n.length?a(n,X,_):Z},o.noConflict=function(){return on._===this&&(on._=vn),this},o.noop=function(){},o.reduce=C,o.result=function(n,t,r){return t=null==n?Z:n[t],t===Z&&(t=r),U(t)?t.call(n):t},o.size=function(n){return null==n?0:(n=M(n)?n:_n(n),n.length)},o.some=function(n,t,r){return t=r?Z:t,E(n,g(t))},o.uniqueId=function(n){var t=++sn;return Q(n)+t},o.each=z,o.first=q,Y(o,function(){
var n={};return s(o,function(t,r){pn.call(o.prototype,r)||(n[r]=t)}),n}(),{chain:false}),o.VERSION="4.17.21",mn("pop join replace reverse split push shift sort splice unshift".split(" "),function(n){var t=(/^(?:replace|split)$/.test(n)?String.prototype:an)[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:pop|join|replace|shift)$/.test(n);o.prototype[n]=function(){var n=arguments;if(e&&!this.__chain__){var u=this.value();return t.apply(Nn(u)?u:[],n)}return this[r](function(r){return t.apply(Nn(r)?r:[],n);
})}}),o.prototype.toJSON=o.prototype.valueOf=o.prototype.value=function(){return w(this.__wrapped__,this.__actions__)},typeof define=="function"&&typeof define.amd=="object"&&define.amd?(on._=o, define(function(){return o})):cn?((cn.exports=o)._=o,un._=o):on._=o}).call(this);var baseAssignValue = require('./_baseAssignValue'),
    createAggregator = require('./_createAggregator');

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * Creates an object composed of keys generated from the results of running
 * each element of `collection` thru `iteratee`. The corresponding value of
 * each key is the number of times the key was returned by `iteratee`. The
 * iteratee is invoked with one argument: (value).
 *
 * @static
 * @memberOf _
 * @since 0.5.0
 * @category Collection
 * @param {Array|Object} collection The collection to iterate over.
 * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
 * @returns {Object} Returns the composed aggregate object.
 * @example
 *
 * _.countBy([6.1, 4.2, 6.3], Math.floor);
 * // => { '4': 1, '6': 2 }
 *
 * // The `_.property` iteratee shorthand.
 * _.countBy(['one', 'two', 'three'], 'length');
 * // => { '3': 2, '5': 1 }
 */
var countBy = createAggregator(function(result, value, key) {
  if (hasOwnProperty.call(result, key)) {
    ++result[key];
  } else {
    baseAssignValue(result, key, 1);
  }
});

module.exports = countBy;
var baseAssign = require('./_baseAssign'),
    baseCreate = require('./_baseCreate');

/**
 * Creates an object that inherits from the `prototype` object. If a
 * `properties` object is given, its own enumerable string keyed properties
 * are assigned to the created object.
 *
 * @static
 * @memberOf _
 * @since 2.3.0
 * @category Object
 * @param {Object} prototype The object to inherit from.
 * @param {Object} [properties] The properties to assign to the object.
 * @returns {Object} Returns the new object.
 * @example
 *
 * function Shape() {
 *   this.x = 0;
 *   this.y = 0;
 * }
 *
 * function Circle() {
 *   Shape.call(this);
 * }
 *
 * Circle.prototype = _.create(Shape.prototype, {
 *   'constructor': Circle
 * });
 *
 * var circle = new Circle;
 * circle instanceof Circle;
 * // => true
 *
 * circle instanceof Shape;
 * // => true
 */
function create(prototype, properties) {
  var result = baseCreate(prototype);
  return properties == null ? result : baseAssign(result, properties);
}

module.exports = create;
var createWrap = require('./_createWrap');

/** Used to compose bitmasks for function metadata. */
var WRAP_CURRY_FLAG = 8;

/**
 * Creates a function that accepts arguments of `func` and either invokes
 * `func` returning its result, if at least `arity` number of arguments have
 * been provided, or returns a function that accepts the remaining `func`
 * arguments, and so on. The arity of `func` may be specified if `func.length`
 * is not sufficient.
 *
 * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,
 * may be used as a placeholder for provided arguments.
 *
 * **Note:** This method doesn't set the "length" property of curried functions.
 *
 * @static
 * @memberOf _
 * @since 2.0.0
 * @category Function
 * @param {Function} func The function to curry.
 * @param {number} [arity=func.length] The arity of `func`.
 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
 * @returns {Function} Returns the new curried function.
 * @example
 *
 * var abc = function(a, b, c) {
 *   return [a, b, c];
 * };
 *
 * var curried = _.curry(abc);
 *
 * curried(1)(2)(3);
 * // => [1, 2, 3]
 *
 * curried(1, 2)(3);
 * // => [1, 2, 3]
 *
 * curried(1, 2, 3);
 * // => [1, 2, 3]
 *
 * // Curried with placeholders.
 * curried(1)(_, 3)(2);
 * // => [1, 2, 3]
 */
function curry(func, arity, guard) {
  arity = guard ? undefined : arity;
  var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
  result.placeholder = curry.placeholder;
  return result;
}

// Assign default placeholders.
curry.placeholder = {};

module.exports = curry;
var createWrap = require('./_createWrap');

/** Used to compose bitmasks for function metadata. */
var WRAP_CURRY_RIGHT_FLAG = 16;

/**
 * This method is like `_.curry` except that arguments are applied to `func`
 * in the manner of `_.partialRight` instead of `_.partial`.
 *
 * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic
 * builds, may be used as a placeholder for provided arguments.
 *
 * **Note:** This method doesn't set the "length" property of curried functions.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Function
 * @param {Function} func The function to curry.
 * @param {number} [arity=func.length] The arity of `func`.
 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
 * @returns {Function} Returns the new curried function.
 * @example
 *
 * var abc = function(a, b, c) {
 *   return [a, b, c];
 * };
 *
 * var curried = _.curryRight(abc);
 *
 * curried(3)(2)(1);
 * // => [1, 2, 3]
 *
 * curried(2, 3)(1);
 * // => [1, 2, 3]
 *
 * curried(1, 2, 3);
 * // => [1, 2, 3]
 *
 * // Curried with placeholders.
 * curried(3)(1, _)(2);
 * // => [1, 2, 3]
 */
function curryRight(func, arity, guard) {
  arity = guard ? undefined : arity;
  var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
  result.placeholder = curryRight.placeholder;
  return result;
}

// Assign default placeholders.
curryRight.placeholder = {};

module.exports = curryRight;
module.exports = {
  'now': require('./now')
};
var isObject = require('./isObject'),
    now = require('./now'),
    toNumber = require('./toNumber');

/** Error message constants. */
var FUNC_ERROR_TEXT = 'Expected a function';

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max,
    nativeMin = Math.min;

/**
 * Creates a debounced function that delays invoking `func` until after `wait`
 * milliseconds have elapsed since the last time the debounced function was
 * invoked. The debounced function comes with a `cancel` method to cancel
 * delayed `func` invocations and a `flush` method to immediately invoke them.
 * Provide `options` to indicate whether `func` should be invoked on the
 * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
 * with the last arguments provided to the debounced function. Subsequent
 * calls to the debounced function return the result of the last `func`
 * invocation.
 *
 * **Note:** If `leading` and `trailing` options are `true`, `func` is
 * invoked on the trailing edge of the timeout only if the debounced function
 * is invoked more than once during the `wait` timeout.
 *
 * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
 * until to the next tick, similar to `setTimeout` with a timeout of `0`.
 *
 * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
 * for details over the differences between `_.debounce` and `_.throttle`.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Function
 * @param {Function} func The function to debounce.
 * @param {number} [wait=0] The number of milliseconds to delay.
 * @param {Object} [options={}] The options object.
 * @param {boolean} [options.leading=false]
 *  Specify invoking on the leading edge of the timeout.
 * @param {number} [options.maxWait]
 *  The maximum time `func` is allowed to be delayed before it's invoked.
 * @param {boolean} [options.trailing=true]
 *  Specify invoking on the trailing edge of the timeout.
 * @returns {Function} Returns the new debounced function.
 * @example
 *
 * // Avoid costly calculations while the window size is in flux.
 * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
 *
 * // Invoke `sendMail` when clicked, debouncing subsequent calls.
 * jQuery(element).on('click', _.debounce(sendMail, 300, {
 *   'leading': true,
 *   'trailing': false
 * }));
 *
 * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
 * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
 * var source = new EventSource('/stream');
 * jQuery(source).on('message', debounced);
 *
 * // Cancel the trailing debounced invocation.
 * jQuery(window).on('popstate', debounced.cancel);
 */
function debounce(func, wait, options) {
  var lastArgs,
      lastThis,
      maxWait,
      result,
      timerId,
      lastCallTime,
      lastInvokeTime = 0,
      leading = false,
      maxing = false,
      trailing = true;

  if (typeof func != 'function') {
    throw new TypeError(FUNC_ERROR_TEXT);
  }
  wait = toNumber(wait) || 0;
  if (isObject(options)) {
    leading = !!options.leading;
    maxing = 'maxWait' in options;
    maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
    trailing = 'trailing' in options ? !!options.trailing : trailing;
  }

  function invokeFunc(time) {
    var args = lastArgs,
        thisArg = lastThis;

    lastArgs = lastThis = undefined;
    lastInvokeTime = time;
    result = func.apply(thisArg, args);
    return result;
  }

  function leadingEdge(time) {
    // Reset any `maxWait` timer.
    lastInvokeTime = time;
    // Start the timer for the trailing edge.
    timerId = setTimeout(timerExpired, wait);
    // Invoke the leading edge.
    return leading ? invokeFunc(time) : result;
  }

  function remainingWait(time) {
    var timeSinceLastCall = time - lastCallTime,
        timeSinceLastInvoke = time - lastInvokeTime,
        timeWaiting = wait - timeSinceLastCall;

    return maxing
      ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
      : timeWaiting;
  }

  function shouldInvoke(time) {
    var timeSinceLastCall = time - lastCallTime,
        timeSinceLastInvoke = time - lastInvokeTime;

    // Either this is the first call, activity has stopped and we're at the
    // trailing edge, the system time has gone backwards and we're treating
    // it as the trailing edge, or we've hit the `maxWait` limit.
    return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
      (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
  }

  function timerExpired() {
    var time = now();
    if (shouldInvoke(time)) {
      return trailingEdge(time);
    }
    // Restart the timer.
    timerId = setTimeout(timerExpired, remainingWait(time));
  }

  function trailingEdge(time) {
    timerId = undefined;

    // Only invoke if we have `lastArgs` which means `func` has been
    // debounced at least once.
    if (trailing && lastArgs) {
      return invokeFunc(time);
    }
    lastArgs = lastThis = undefined;
    return result;
  }

  function cancel() {
    if (timerId !== undefined) {
      clearTimeout(timerId);
    }
    lastInvokeTime = 0;
    lastArgs = lastCallTime = lastThis = timerId = undefined;
  }

  function flush() {
    return timerId === undefined ? result : trailingEdge(now());
  }

  function debounced() {
    var time = now(),
        isInvoking = shouldInvoke(time);

    lastArgs = arguments;
    lastThis = this;
    lastCallTime = time;

    if (isInvoking) {
      if (timerId === undefined) {
        return leadingEdge(lastCallTime);
      }
      if (maxing) {
        // Handle invocations in a tight loop.
        clearTimeout(timerId);
        timerId = setTimeout(timerExpired, wait);
        return invokeFunc(lastCallTime);
      }
    }
    if (timerId === undefined) {
      timerId = setTimeout(timerExpired, wait);
    }
    return result;
  }
  debounced.cancel = cancel;
  debounced.flush = flush;
  return debounced;
}

module.exports = debounce;
var deburrLetter = require('./_deburrLetter'),
    toString = require('./toString');

/** Used to match Latin Unicode letters (excluding mathematical operators). */
var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;

/** Used to compose unicode character classes. */
var rsComboMarksRange = '\\u0300-\\u036f',
    reComboHalfMarksRange = '\\ufe20-\\ufe2f',
    rsComboSymbolsRange = '\\u20d0-\\u20ff',
    rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange;

/** Used to compose unicode capture groups. */
var rsCombo = '[' + rsComboRange + ']';

/**
 * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and
 * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).
 */
var reComboMark = RegExp(rsCombo, 'g');

/**
 * Deburrs `string` by converting
 * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
 * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)
 * letters to basic Latin letters and removing
 * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category String
 * @param {string} [string=''] The string to deburr.
 * @returns {string} Returns the deburred string.
 * @example
 *
 * _.deburr('déjà vu');
 * // => 'deja vu'
 */
function deburr(string) {
  string = toString(string);
  return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');
}

module.exports = deburr;
/**
 * Checks `value` to determine whether a default value should be returned in
 * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,
 * or `undefined`.
 *
 * @static
 * @memberOf _
 * @since 4.14.0
 * @category Util
 * @param {*} value The value to check.
 * @param {*} defaultValue The default value.
 * @returns {*} Returns the resolved value.
 * @example
 *
 * _.defaultTo(1, 10);
 * // => 1
 *
 * _.defaultTo(undefined, 10);
 * // => 10
 */
function defaultTo(value, defaultValue) {
  return (value == null || value !== value) ? defaultValue : value;
}

module.exports = defaultTo;
var baseRest = require('./_baseRest'),
    eq = require('./eq'),
    isIterateeCall = require('./_isIterateeCall'),
    keysIn = require('./keysIn');

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * Assigns own and inherited enumerable string keyed properties of source
 * objects to the destination object for all destination properties that
 * resolve to `undefined`. Source objects are applied from left to right.
 * Once a property is set, additional values of the same property are ignored.
 *
 * **Note:** This method mutates `object`.
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category Object
 * @param {Object} object The destination object.
 * @param {...Object} [sources] The source objects.
 * @returns {Object} Returns `object`.
 * @see _.defaultsDeep
 * @example
 *
 * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
 * // => { 'a': 1, 'b': 2 }
 */
var defaults = baseRest(function(object, sources) {
  object = Object(object);

  var index = -1;
  var length = sources.length;
  var guard = length > 2 ? sources[2] : undefined;

  if (guard && isIterateeCall(sources[0], sources[1], guard)) {
    length = 1;
  }

  while (++index < length) {
    var source = sources[index];
    var props = keysIn(source);
    var propsIndex = -1;
    var propsLength = props.length;

    while (++propsIndex < propsLength) {
      var key = props[propsIndex];
      var value = object[key];

      if (value === undefined ||
          (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {
        object[key] = source[key];
      }
    }
  }

  return object;
});

module.exports = defaults;
var apply = require('./_apply'),
    baseRest = require('./_baseRest'),
    customDefaultsMerge = require('./_customDefaultsMerge'),
    mergeWith = require('./mergeWith');

/**
 * This method is like `_.defaults` except that it recursively assigns
 * default properties.
 *
 * **Note:** This method mutates `object`.
 *
 * @static
 * @memberOf _
 * @since 3.10.0
 * @category Object
 * @param {Object} object The destination object.
 * @param {...Object} [sources] The source objects.
 * @returns {Object} Returns `object`.
 * @see _.defaults
 * @example
 *
 * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });
 * // => { 'a': { 'b': 2, 'c': 3 } }
 */
var defaultsDeep = baseRest(function(args) {
  args.push(undefined, customDefaultsMerge);
  return apply(mergeWith, undefined, args);
});

module.exports = defaultsDeep;
var baseDelay = require('./_baseDelay'),
    baseRest = require('./_baseRest');

/**
 * Defers invoking the `func` until the current call stack has cleared. Any
 * additional arguments are provided to `func` when it's invoked.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Function
 * @param {Function} func The function to defer.
 * @param {...*} [args] The arguments to invoke `func` with.
 * @returns {number} Returns the timer id.
 * @example
 *
 * _.defer(function(text) {
 *   console.log(text);
 * }, 'deferred');
 * // => Logs 'deferred' after one millisecond.
 */
var defer = baseRest(function(func, args) {
  return baseDelay(func, 1, args);
});

module.exports = defer;
var baseDelay = require('./_baseDelay'),
    baseRest = require('./_baseRest'),
    toNumber = require('./toNumber');

/**
 * Invokes `func` after `wait` milliseconds. Any additional arguments are
 * provided to `func` when it's invoked.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Function
 * @param {Function} func The function to delay.
 * @param {number} wait The number of milliseconds to delay invocation.
 * @param {...*} [args] The arguments to invoke `func` with.
 * @returns {number} Returns the timer id.
 * @example
 *
 * _.delay(function(text) {
 *   console.log(text);
 * }, 1000, 'later');
 * // => Logs 'later' after one second.
 */
var delay = baseRest(function(func, wait, args) {
  return baseDelay(func, toNumber(wait) || 0, args);
});

module.exports = delay;
var baseDifference = require('./_baseDifference'),
    baseFlatten = require('./_baseFlatten'),
    baseRest = require('./_baseRest'),
    isArrayLikeObject = require('./isArrayLikeObject');

/**
 * Creates an array of `array` values not included in the other given arrays
 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
 * for equality comparisons. The order and references of result values are
 * determined by the first array.
 *
 * **Note:** Unlike `_.pullAll`, this method returns a new array.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Array
 * @param {Array} array The array to inspect.
 * @param {...Array} [values] The values to exclude.
 * @returns {Array} Returns the new array of filtered values.
 * @see _.without, _.xor
 * @example
 *
 * _.difference([2, 1], [2, 3]);
 * // => [1]
 */
var difference = baseRest(function(array, values) {
  return isArrayLikeObject(array)
    ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
    : [];
});

module.exports = difference;
var baseDifference = require('./_baseDifference'),
    baseFlatten = require('./_baseFlatten'),
    baseIteratee = require('./_baseIteratee'),
    baseRest = require('./_baseRest'),
    isArrayLikeObject = require('./isArrayLikeObject'),
    last = require('./last');

/**
 * This method is like `_.difference` except that it accepts `iteratee` which
 * is invoked for each element of `array` and `values` to generate the criterion
 * by which they're compared. The order and references of result values are
 * determined by the first array. The iteratee is invoked with one argument:
 * (value).
 *
 * **Note:** Unlike `_.pullAllBy`, this method returns a new array.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Array
 * @param {Array} array The array to inspect.
 * @param {...Array} [values] The values to exclude.
 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
 * @returns {Array} Returns the new array of filtered values.
 * @example
 *
 * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);
 * // => [1.2]
 *
 * // The `_.property` iteratee shorthand.
 * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');
 * // => [{ 'x': 2 }]
 */
var differenceBy = baseRest(function(array, values) {
  var iteratee = last(values);
  if (isArrayLikeObject(iteratee)) {
    iteratee = undefined;
  }
  return isArrayLikeObject(array)
    ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), baseIteratee(iteratee, 2))
    : [];
});

module.exports = differenceBy;
var baseDifference = require('./_baseDifference'),
    baseFlatten = require('./_baseFlatten'),
    baseRest = require('./_baseRest'),
    isArrayLikeObject = require('./isArrayLikeObject'),
    last = require('./last');

/**
 * This method is like `_.difference` except that it accepts `comparator`
 * which is invoked to compare elements of `array` to `values`. The order and
 * references of result values are determined by the first array. The comparator
 * is invoked with two arguments: (arrVal, othVal).
 *
 * **Note:** Unlike `_.pullAllWith`, this method returns a new array.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Array
 * @param {Array} array The array to inspect.
 * @param {...Array} [values] The values to exclude.
 * @param {Function} [comparator] The comparator invoked per element.
 * @returns {Array} Returns the new array of filtered values.
 * @example
 *
 * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
 *
 * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);
 * // => [{ 'x': 2, 'y': 1 }]
 */
var differenceWith = baseRest(function(array, values) {
  var comparator = last(values);
  if (isArrayLikeObject(comparator)) {
    comparator = undefined;
  }
  return isArrayLikeObject(array)
    ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)
    : [];
});

module.exports = differenceWith;
var createMathOperation = require('./_createMathOperation');

/**
 * Divide two numbers.
 *
 * @static
 * @memberOf _
 * @since 4.7.0
 * @category Math
 * @param {number} dividend The first number in a division.
 * @param {number} divisor The second number in a division.
 * @returns {number} Returns the quotient.
 * @example
 *
 * _.divide(6, 4);
 * // => 1.5
 */
var divide = createMathOperation(function(dividend, divisor) {
  return dividend / divisor;
}, 1);

module.exports = divide;
var baseSlice = require('./_baseSlice'),
    toInteger = require('./toInteger');

/**
 * Creates a slice of `array` with `n` elements dropped from the beginning.
 *
 * @static
 * @memberOf _
 * @since 0.5.0
 * @category Array
 * @param {Array} array The array to query.
 * @param {number} [n=1] The number of elements to drop.
 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
 * @returns {Array} Returns the slice of `array`.
 * @example
 *
 * _.drop([1, 2, 3]);
 * // => [2, 3]
 *
 * _.drop([1, 2, 3], 2);
 * // => [3]
 *
 * _.drop([1, 2, 3], 5);
 * // => []
 *
 * _.drop([1, 2, 3], 0);
 * // => [1, 2, 3]
 */
function drop(array, n, guard) {
  var length = array == null ? 0 : array.length;
  if (!length) {
    return [];
  }
  n = (guard || n === undefined) ? 1 : toInteger(n);
  return baseSlice(array, n < 0 ? 0 : n, length);
}

module.exports = drop;
var baseSlice = require('./_baseSlice'),
    toInteger = require('./toInteger');

/**
 * Creates a slice of `array` with `n` elements dropped from the end.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Array
 * @param {Array} array The array to query.
 * @param {number} [n=1] The number of elements to drop.
 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
 * @returns {Array} Returns the slice of `array`.
 * @example
 *
 * _.dropRight([1, 2, 3]);
 * // => [1, 2]
 *
 * _.dropRight([1, 2, 3], 2);
 * // => [1]
 *
 * _.dropRight([1, 2, 3], 5);
 * // => []
 *
 * _.dropRight([1, 2, 3], 0);
 * // => [1, 2, 3]
 */
function dropRight(array, n, guard) {
  var length = array == null ? 0 : array.length;
  if (!length) {
    return [];
  }
  n = (guard || n === undefined) ? 1 : toInteger(n);
  n = length - n;
  return baseSlice(array, 0, n < 0 ? 0 : n);
}

module.exports = dropRight;
var baseIteratee = require('./_baseIteratee'),
    baseWhile = require('./_baseWhile');

/**
 * Creates a slice of `array` excluding elements dropped from the end.
 * Elements are dropped until `predicate` returns falsey. The predicate is
 * invoked with three arguments: (value, index, array).
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Array
 * @param {Array} array The array to query.
 * @param {Function} [predicate=_.identity] The function invoked per iteration.
 * @returns {Array} Returns the slice of `array`.
 * @example
 *
 * var users = [
 *   { 'user': 'barney',  'active': true },
 *   { 'user': 'fred',    'active': false },
 *   { 'user': 'pebbles', 'active': false }
 * ];
 *
 * _.dropRightWhile(users, function(o) { return !o.active; });
 * // => objects for ['barney']
 *
 * // The `_.matches` iteratee shorthand.
 * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });
 * // => objects for ['barney', 'fred']
 *
 * // The `_.matchesProperty` iteratee shorthand.
 * _.dropRightWhile(users, ['active', false]);
 * // => objects for ['barney']
 *
 * // The `_.property` iteratee shorthand.
 * _.dropRightWhile(users, 'active');
 * // => objects for ['barney', 'fred', 'pebbles']
 */
function dropRightWhile(array, predicate) {
  return (array && array.length)
    ? baseWhile(array, baseIteratee(predicate, 3), true, true)
    : [];
}

module.exports = dropRightWhile;
var baseIteratee = require('./_baseIteratee'),
    baseWhile = require('./_baseWhile');

/**
 * Creates a slice of `array` excluding elements dropped from the beginning.
 * Elements are dropped until `predicate` returns falsey. The predicate is
 * invoked with three arguments: (value, index, array).
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Array
 * @param {Array} array The array to query.
 * @param {Function} [predicate=_.identity] The function invoked per iteration.
 * @returns {Array} Returns the slice of `array`.
 * @example
 *
 * var users = [
 *   { 'user': 'barney',  'active': false },
 *   { 'user': 'fred',    'active': false },
 *   { 'user': 'pebbles', 'active': true }
 * ];
 *
 * _.dropWhile(users, function(o) { return !o.active; });
 * // => objects for ['pebbles']
 *
 * // The `_.matches` iteratee shorthand.
 * _.dropWhile(users, { 'user': 'barney', 'active': false });
 * // => objects for ['fred', 'pebbles']
 *
 * // The `_.matchesProperty` iteratee shorthand.
 * _.dropWhile(users, ['active', false]);
 * // => objects for ['pebbles']
 *
 * // The `_.property` iteratee shorthand.
 * _.dropWhile(users, 'active');
 * // => objects for ['barney', 'fred', 'pebbles']
 */
function dropWhile(array, predicate) {
  return (array && array.length)
    ? baseWhile(array, baseIteratee(predicate, 3), true)
    : [];
}

module.exports = dropWhile;
module.exports = require('./forEach');
module.exports = require('./forEachRight');
var baseClamp = require('./_baseClamp'),
    baseToString = require('./_baseToString'),
    toInteger = require('./toInteger'),
    toString = require('./toString');

/**
 * Checks if `string` ends with the given target string.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category String
 * @param {string} [string=''] The string to inspect.
 * @param {string} [target] The string to search for.
 * @param {number} [position=string.length] The position to search up to.
 * @returns {boolean} Returns `true` if `string` ends with `target`,
 *  else `false`.
 * @example
 *
 * _.endsWith('abc', 'c');
 * // => true
 *
 * _.endsWith('abc', 'b');
 * // => false
 *
 * _.endsWith('abc', 'b', 2);
 * // => true
 */
function endsWith(string, target, position) {
  string = toString(string);
  target = baseToString(target);

  var length = string.length;
  position = position === undefined
    ? length
    : baseClamp(toInteger(position), 0, length);

  var end = position;
  position -= target.length;
  return position >= 0 && string.slice(position, end) == target;
}

module.exports = endsWith;
module.exports = require('./toPairs');
module.exports = require('./toPairsIn');
/**
 * Performs a
 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
 * comparison between two values to determine if they are equivalent.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to compare.
 * @param {*} other The other value to compare.
 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
 * @example
 *
 * var object = { 'a': 1 };
 * var other = { 'a': 1 };
 *
 * _.eq(object, object);
 * // => true
 *
 * _.eq(object, other);
 * // => false
 *
 * _.eq('a', 'a');
 * // => true
 *
 * _.eq('a', Object('a'));
 * // => false
 *
 * _.eq(NaN, NaN);
 * // => true
 */
function eq(value, other) {
  return value === other || (value !== value && other !== other);
}

module.exports = eq;
var escapeHtmlChar = require('./_escapeHtmlChar'),
    toString = require('./toString');

/** Used to match HTML entities and HTML characters. */
var reUnescapedHtml = /[&<>"']/g,
    reHasUnescapedHtml = RegExp(reUnescapedHtml.source);

/**
 * Converts the characters "&", "<", ">", '"', and "'" in `string` to their
 * corresponding HTML entities.
 *
 * **Note:** No other characters are escaped. To escape additional
 * characters use a third-party library like [_he_](https://mths.be/he).
 *
 * Though the ">" character is escaped for symmetry, characters like
 * ">" and "/" don't need escaping in HTML and have no special meaning
 * unless they're part of a tag or unquoted attribute value. See
 * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
 * (under "semi-related fun fact") for more details.
 *
 * When working with HTML you should always
 * [quote attribute values](http://wonko.com/post/html-escaping) to reduce
 * XSS vectors.
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category String
 * @param {string} [string=''] The string to escape.
 * @returns {string} Returns the escaped string.
 * @example
 *
 * _.escape('fred, barney, & pebbles');
 * // => 'fred, barney, &amp; pebbles'
 */
function escape(string) {
  string = toString(string);
  return (string && reHasUnescapedHtml.test(string))
    ? string.replace(reUnescapedHtml, escapeHtmlChar)
    : string;
}

module.exports = escape;
var toString = require('./toString');

/**
 * Used to match `RegExp`
 * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
 */
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g,
    reHasRegExpChar = RegExp(reRegExpChar.source);

/**
 * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+",
 * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category String
 * @param {string} [string=''] The string to escape.
 * @returns {string} Returns the escaped string.
 * @example
 *
 * _.escapeRegExp('[lodash](https://lodash.com/)');
 * // => '\[lodash\]\(https://lodash\.com/\)'
 */
function escapeRegExp(string) {
  string = toString(string);
  return (string && reHasRegExpChar.test(string))
    ? string.replace(reRegExpChar, '\\$&')
    : string;
}

module.exports = escapeRegExp;
var arrayEvery = require('./_arrayEvery'),
    baseEvery = require('./_baseEvery'),
    baseIteratee = require('./_baseIteratee'),
    isArray = require('./isArray'),
    isIterateeCall = require('./_isIterateeCall');

/**
 * Checks if `predicate` returns truthy for **all** elements of `collection`.
 * Iteration is stopped once `predicate` returns falsey. The predicate is
 * invoked with three arguments: (value, index|key, collection).
 *
 * **Note:** This method returns `true` for
 * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
 * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
 * elements of empty collections.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Collection
 * @param {Array|Object} collection The collection to iterate over.
 * @param {Function} [predicate=_.identity] The function invoked per iteration.
 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
 * @returns {boolean} Returns `true` if all elements pass the predicate check,
 *  else `false`.
 * @example
 *
 * _.every([true, 1, null, 'yes'], Boolean);
 * // => false
 *
 * var users = [
 *   { 'user': 'barney', 'age': 36, 'active': false },
 *   { 'user': 'fred',   'age': 40, 'active': false }
 * ];
 *
 * // The `_.matches` iteratee shorthand.
 * _.every(users, { 'user': 'barney', 'active': false });
 * // => false
 *
 * // The `_.matchesProperty` iteratee shorthand.
 * _.every(users, ['active', false]);
 * // => true
 *
 * // The `_.property` iteratee shorthand.
 * _.every(users, 'active');
 * // => false
 */
function every(collection, predicate, guard) {
  var func = isArray(collection) ? arrayEvery : baseEvery;
  if (guard && isIterateeCall(collection, predicate, guard)) {
    predicate = undefined;
  }
  return func(collection, baseIteratee(predicate, 3));
}

module.exports = every;
module.exports = require('./assignIn');
module.exports = require('./assignInWith');
var baseFill = require('./_baseFill'),
    isIterateeCall = require('./_isIterateeCall');

/**
 * Fills elements of `array` with `value` from `start` up to, but not
 * including, `end`.
 *
 * **Note:** This method mutates `array`.
 *
 * @static
 * @memberOf _
 * @since 3.2.0
 * @category Array
 * @param {Array} array The array to fill.
 * @param {*} value The value to fill `array` with.
 * @param {number} [start=0] The start position.
 * @param {number} [end=array.length] The end position.
 * @returns {Array} Returns `array`.
 * @example
 *
 * var array = [1, 2, 3];
 *
 * _.fill(array, 'a');
 * console.log(array);
 * // => ['a', 'a', 'a']
 *
 * _.fill(Array(3), 2);
 * // => [2, 2, 2]
 *
 * _.fill([4, 6, 8, 10], '*', 1, 3);
 * // => [4, '*', '*', 10]
 */
function fill(array, value, start, end) {
  var length = array == null ? 0 : array.length;
  if (!length) {
    return [];
  }
  if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {
    start = 0;
    end = length;
  }
  return baseFill(array, value, start, end);
}

module.exports = fill;
var arrayFilter = require('./_arrayFilter'),
    baseFilter = require('./_baseFilter'),
    baseIteratee = require('./_baseIteratee'),
    isArray = require('./isArray');

/**
 * Iterates over elements of `collection`, returning an array of all elements
 * `predicate` returns truthy for. The predicate is invoked with three
 * arguments: (value, index|key, collection).
 *
 * **Note:** Unlike `_.remove`, this method returns a new array.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Collection
 * @param {Array|Object} collection The collection to iterate over.
 * @param {Function} [predicate=_.identity] The function invoked per iteration.
 * @returns {Array} Returns the new filtered array.
 * @see _.reject
 * @example
 *
 * var users = [
 *   { 'user': 'barney', 'age': 36, 'active': true },
 *   { 'user': 'fred',   'age': 40, 'active': false }
 * ];
 *
 * _.filter(users, function(o) { return !o.active; });
 * // => objects for ['fred']
 *
 * // The `_.matches` iteratee shorthand.
 * _.filter(users, { 'age': 36, 'active': true });
 * // => objects for ['barney']
 *
 * // The `_.matchesProperty` iteratee shorthand.
 * _.filter(users, ['active', false]);
 * // => objects for ['fred']
 *
 * // The `_.property` iteratee shorthand.
 * _.filter(users, 'active');
 * // => objects for ['barney']
 *
 * // Combining several predicates using `_.overEvery` or `_.overSome`.
 * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));
 * // => objects for ['fred', 'barney']
 */
function filter(collection, predicate) {
  var func = isArray(collection) ? arrayFilter : baseFilter;
  return func(collection, baseIteratee(predicate, 3));
}

module.exports = filter;
var createFind = require('./_createFind'),
    findIndex = require('./findIndex');

/**
 * Iterates over elements of `collection`, returning the first element
 * `predicate` returns truthy for. The predicate is invoked with three
 * arguments: (value, index|key, collection).
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Collection
 * @param {Array|Object} collection The collection to inspect.
 * @param {Function} [predicate=_.identity] The function invoked per iteration.
 * @param {number} [fromIndex=0] The index to search from.
 * @returns {*} Returns the matched element, else `undefined`.
 * @example
 *
 * var users = [
 *   { 'user': 'barney',  'age': 36, 'active': true },
 *   { 'user': 'fred',    'age': 40, 'active': false },
 *   { 'user': 'pebbles', 'age': 1,  'active': true }
 * ];
 *
 * _.find(users, function(o) { return o.age < 40; });
 * // => object for 'barney'
 *
 * // The `_.matches` iteratee shorthand.
 * _.find(users, { 'age': 1, 'active': true });
 * // => object for 'pebbles'
 *
 * // The `_.matchesProperty` iteratee shorthand.
 * _.find(users, ['active', false]);
 * // => object for 'fred'
 *
 * // The `_.property` iteratee shorthand.
 * _.find(users, 'active');
 * // => object for 'barney'
 */
var find = createFind(findIndex);

module.exports = find;
var baseFindIndex = require('./_baseFindIndex'),
    baseIteratee = require('./_baseIteratee'),
    toInteger = require('./toInteger');

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max;

/**
 * This method is like `_.find` except that it returns the index of the first
 * element `predicate` returns truthy for instead of the element itself.
 *
 * @static
 * @memberOf _
 * @since 1.1.0
 * @category Array
 * @param {Array} array The array to inspect.
 * @param {Function} [predicate=_.identity] The function invoked per iteration.
 * @param {number} [fromIndex=0] The index to search from.
 * @returns {number} Returns the index of the found element, else `-1`.
 * @example
 *
 * var users = [
 *   { 'user': 'barney',  'active': false },
 *   { 'user': 'fred',    'active': false },
 *   { 'user': 'pebbles', 'active': true }
 * ];
 *
 * _.findIndex(users, function(o) { return o.user == 'barney'; });
 * // => 0
 *
 * // The `_.matches` iteratee shorthand.
 * _.findIndex(users, { 'user': 'fred', 'active': false });
 * // => 1
 *
 * // The `_.matchesProperty` iteratee shorthand.
 * _.findIndex(users, ['active', false]);
 * // => 0
 *
 * // The `_.property` iteratee shorthand.
 * _.findIndex(users, 'active');
 * // => 2
 */
function findIndex(array, predicate, fromIndex) {
  var length = array == null ? 0 : array.length;
  if (!length) {
    return -1;
  }
  var index = fromIndex == null ? 0 : toInteger(fromIndex);
  if (index < 0) {
    index = nativeMax(length + index, 0);
  }
  return baseFindIndex(array, baseIteratee(predicate, 3), index);
}

module.exports = findIndex;
var baseFindKey = require('./_baseFindKey'),
    baseForOwn = require('./_baseForOwn'),
    baseIteratee = require('./_baseIteratee');

/**
 * This method is like `_.find` except that it returns the key of the first
 * element `predicate` returns truthy for instead of the element itself.
 *
 * @static
 * @memberOf _
 * @since 1.1.0
 * @category Object
 * @param {Object} object The object to inspect.
 * @param {Function} [predicate=_.identity] The function invoked per iteration.
 * @returns {string|undefined} Returns the key of the matched element,
 *  else `undefined`.
 * @example
 *
 * var users = {
 *   'barney':  { 'age': 36, 'active': true },
 *   'fred':    { 'age': 40, 'active': false },
 *   'pebbles': { 'age': 1,  'active': true }
 * };
 *
 * _.findKey(users, function(o) { return o.age < 40; });
 * // => 'barney' (iteration order is not guaranteed)
 *
 * // The `_.matches` iteratee shorthand.
 * _.findKey(users, { 'age': 1, 'active': true });
 * // => 'pebbles'
 *
 * // The `_.matchesProperty` iteratee shorthand.
 * _.findKey(users, ['active', false]);
 * // => 'fred'
 *
 * // The `_.property` iteratee shorthand.
 * _.findKey(users, 'active');
 * // => 'barney'
 */
function findKey(object, predicate) {
  return baseFindKey(object, baseIteratee(predicate, 3), baseForOwn);
}

module.exports = findKey;
var createFind = require('./_createFind'),
    findLastIndex = require('./findLastIndex');

/**
 * This method is like `_.find` except that it iterates over elements of
 * `collection` from right to left.
 *
 * @static
 * @memberOf _
 * @since 2.0.0
 * @category Collection
 * @param {Array|Object} collection The collection to inspect.
 * @param {Function} [predicate=_.identity] The function invoked per iteration.
 * @param {number} [fromIndex=collection.length-1] The index to search from.
 * @returns {*} Returns the matched element, else `undefined`.
 * @example
 *
 * _.findLast([1, 2, 3, 4], function(n) {
 *   return n % 2 == 1;
 * });
 * // => 3
 */
var findLast = createFind(findLastIndex);

module.exports = findLast;
var baseFindIndex = require('./_baseFindIndex'),
    baseIteratee = require('./_baseIteratee'),
    toInteger = require('./toInteger');

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max,
    nativeMin = Math.min;

/**
 * This method is like `_.findIndex` except that it iterates over elements
 * of `collection` from right to left.
 *
 * @static
 * @memberOf _
 * @since 2.0.0
 * @category Array
 * @param {Array} array The array to inspect.
 * @param {Function} [predicate=_.identity] The function invoked per iteration.
 * @param {number} [fromIndex=array.length-1] The index to search from.
 * @returns {number} Returns the index of the found element, else `-1`.
 * @example
 *
 * var users = [
 *   { 'user': 'barney',  'active': true },
 *   { 'user': 'fred',    'active': false },
 *   { 'user': 'pebbles', 'active': false }
 * ];
 *
 * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });
 * // => 2
 *
 * // The `_.matches` iteratee shorthand.
 * _.findLastIndex(users, { 'user': 'barney', 'active': true });
 * // => 0
 *
 * // The `_.matchesProperty` iteratee shorthand.
 * _.findLastIndex(users, ['active', false]);
 * // => 2
 *
 * // The `_.property` iteratee shorthand.
 * _.findLastIndex(users, 'active');
 * // => 0
 */
function findLastIndex(array, predicate, fromIndex) {
  var length = array == null ? 0 : array.length;
  if (!length) {
    return -1;
  }
  var index = length - 1;
  if (fromIndex !== undefined) {
    index = toInteger(fromIndex);
    index = fromIndex < 0
      ? nativeMax(length + index, 0)
      : nativeMin(index, length - 1);
  }
  return baseFindIndex(array, baseIteratee(predicate, 3), index, true);
}

module.exports = findLastIndex;
var baseFindKey = require('./_baseFindKey'),
    baseForOwnRight = require('./_baseForOwnRight'),
    baseIteratee = require('./_baseIteratee');

/**
 * This method is like `_.findKey` except that it iterates over elements of
 * a collection in the opposite order.
 *
 * @static
 * @memberOf _
 * @since 2.0.0
 * @category Object
 * @param {Object} object The object to inspect.
 * @param {Function} [predicate=_.identity] The function invoked per iteration.
 * @returns {string|undefined} Returns the key of the matched element,
 *  else `undefined`.
 * @example
 *
 * var users = {
 *   'barney':  { 'age': 36, 'active': true },
 *   'fred':    { 'age': 40, 'active': false },
 *   'pebbles': { 'age': 1,  'active': true }
 * };
 *
 * _.findLastKey(users, function(o) { return o.age < 40; });
 * // => returns 'pebbles' assuming `_.findKey` returns 'barney'
 *
 * // The `_.matches` iteratee shorthand.
 * _.findLastKey(users, { 'age': 36, 'active': true });
 * // => 'barney'
 *
 * // The `_.matchesProperty` iteratee shorthand.
 * _.findLastKey(users, ['active', false]);
 * // => 'fred'
 *
 * // The `_.property` iteratee shorthand.
 * _.findLastKey(users, 'active');
 * // => 'pebbles'
 */
function findLastKey(object, predicate) {
  return baseFindKey(object, baseIteratee(predicate, 3), baseForOwnRight);
}

module.exports = findLastKey;
module.exports = require('./head');
{
  "nodes": {
    "nixpkgs": {
      "locked": {
        "lastModified": 1613582597,
        "narHash": "sha256-6LvipIvFuhyorHpUqK3HjySC5Y6gshXHFBhU9EJ4DoM=",
        "path": "/nix/store/srvplqq673sqd9vyfhyc5w1p88y1gfm4-source",
        "rev": "6b1057b452c55bb3b463f0d7055bc4ec3fd1f381",
        "type": "path"
      },
      "original": {
        "id": "nixpkgs",
        "type": "indirect"
      }
    },
    "root": {
      "inputs": {
        "nixpkgs": "nixpkgs",
        "utils": "utils"
      }
    },
    "utils": {
      "locked": {
        "lastModified": 1610051610,
        "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
        "owner": "numtide",
        "repo": "flake-utils",
        "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
        "type": "github"
      },
      "original": {
        "owner": "numtide",
        "repo": "flake-utils",
        "type": "github"
      }
    }
  },
  "root": "root",
  "version": 7
}
{
  inputs = {
    utils.url = "github:numtide/flake-utils";
  };

  outputs = { self, nixpkgs, utils }:
    utils.lib.eachDefaultSystem (system:
      let
        pkgs = nixpkgs.legacyPackages."${system}";
      in rec {
       devShell = pkgs.mkShell {
          nativeBuildInputs = with pkgs; [
            yarn
            nodejs-14_x
            nodePackages.typescript-language-server
            nodePackages.eslint
          ];
        };
      });
}
var baseFlatten = require('./_baseFlatten'),
    map = require('./map');

/**
 * Creates a flattened array of values by running each element in `collection`
 * thru `iteratee` and flattening the mapped results. The iteratee is invoked
 * with three arguments: (value, index|key, collection).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Collection
 * @param {Array|Object} collection The collection to iterate over.
 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
 * @returns {Array} Returns the new flattened array.
 * @example
 *
 * function duplicate(n) {
 *   return [n, n];
 * }
 *
 * _.flatMap([1, 2], duplicate);
 * // => [1, 1, 2, 2]
 */
function flatMap(collection, iteratee) {
  return baseFlatten(map(collection, iteratee), 1);
}

module.exports = flatMap;
var baseFlatten = require('./_baseFlatten'),
    map = require('./map');

/** Used as references for various `Number` constants. */
var INFINITY = 1 / 0;

/**
 * This method is like `_.flatMap` except that it recursively flattens the
 * mapped results.
 *
 * @static
 * @memberOf _
 * @since 4.7.0
 * @category Collection
 * @param {Array|Object} collection The collection to iterate over.
 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
 * @returns {Array} Returns the new flattened array.
 * @example
 *
 * function duplicate(n) {
 *   return [[[n, n]]];
 * }
 *
 * _.flatMapDeep([1, 2], duplicate);
 * // => [1, 1, 2, 2]
 */
function flatMapDeep(collection, iteratee) {
  return baseFlatten(map(collection, iteratee), INFINITY);
}

module.exports = flatMapDeep;
var baseFlatten = require('./_baseFlatten'),
    map = require('./map'),
    toInteger = require('./toInteger');

/**
 * This method is like `_.flatMap` except that it recursively flattens the
 * mapped results up to `depth` times.
 *
 * @static
 * @memberOf _
 * @since 4.7.0
 * @category Collection
 * @param {Array|Object} collection The collection to iterate over.
 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
 * @param {number} [depth=1] The maximum recursion depth.
 * @returns {Array} Returns the new flattened array.
 * @example
 *
 * function duplicate(n) {
 *   return [[[n, n]]];
 * }
 *
 * _.flatMapDepth([1, 2], duplicate, 2);
 * // => [[1, 1], [2, 2]]
 */
function flatMapDepth(collection, iteratee, depth) {
  depth = depth === undefined ? 1 : toInteger(depth);
  return baseFlatten(map(collection, iteratee), depth);
}

module.exports = flatMapDepth;
var baseFlatten = require('./_baseFlatten');

/**
 * Flattens `array` a single level deep.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Array
 * @param {Array} array The array to flatten.
 * @returns {Array} Returns the new flattened array.
 * @example
 *
 * _.flatten([1, [2, [3, [4]], 5]]);
 * // => [1, 2, [3, [4]], 5]
 */
function flatten(array) {
  var length = array == null ? 0 : array.length;
  return length ? baseFlatten(array, 1) : [];
}

module.exports = flatten;
var baseFlatten = require('./_baseFlatten');

/** Used as references for various `Number` constants. */
var INFINITY = 1 / 0;

/**
 * Recursively flattens `array`.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Array
 * @param {Array} array The array to flatten.
 * @returns {Array} Returns the new flattened array.
 * @example
 *
 * _.flattenDeep([1, [2, [3, [4]], 5]]);
 * // => [1, 2, 3, 4, 5]
 */
function flattenDeep(array) {
  var length = array == null ? 0 : array.length;
  return length ? baseFlatten(array, INFINITY) : [];
}

module.exports = flattenDeep;
var baseFlatten = require('./_baseFlatten'),
    toInteger = require('./toInteger');

/**
 * Recursively flatten `array` up to `depth` times.
 *
 * @static
 * @memberOf _
 * @since 4.4.0
 * @category Array
 * @param {Array} array The array to flatten.
 * @param {number} [depth=1] The maximum recursion depth.
 * @returns {Array} Returns the new flattened array.
 * @example
 *
 * var array = [1, [2, [3, [4]], 5]];
 *
 * _.flattenDepth(array, 1);
 * // => [1, 2, [3, [4]], 5]
 *
 * _.flattenDepth(array, 2);
 * // => [1, 2, 3, [4], 5]
 */
function flattenDepth(array, depth) {
  var length = array == null ? 0 : array.length;
  if (!length) {
    return [];
  }
  depth = depth === undefined ? 1 : toInteger(depth);
  return baseFlatten(array, depth);
}

module.exports = flattenDepth;
var createWrap = require('./_createWrap');

/** Used to compose bitmasks for function metadata. */
var WRAP_FLIP_FLAG = 512;

/**
 * Creates a function that invokes `func` with arguments reversed.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Function
 * @param {Function} func The function to flip arguments for.
 * @returns {Function} Returns the new flipped function.
 * @example
 *
 * var flipped = _.flip(function() {
 *   return _.toArray(arguments);
 * });
 *
 * flipped('a', 'b', 'c', 'd');
 * // => ['d', 'c', 'b', 'a']
 */
function flip(func) {
  return createWrap(func, WRAP_FLIP_FLAG);
}

module.exports = flip;
var createRound = require('./_createRound');

/**
 * Computes `number` rounded down to `precision`.
 *
 * @static
 * @memberOf _
 * @since 3.10.0
 * @category Math
 * @param {number} number The number to round down.
 * @param {number} [precision=0] The precision to round down to.
 * @returns {number} Returns the rounded down number.
 * @example
 *
 * _.floor(4.006);
 * // => 4
 *
 * _.floor(0.046, 2);
 * // => 0.04
 *
 * _.floor(4060, -2);
 * // => 4000
 */
var floor = createRound('floor');

module.exports = floor;
var createFlow = require('./_createFlow');

/**
 * Creates a function that returns the result of invoking the given functions
 * with the `this` binding of the created function, where each successive
 * invocation is supplied the return value of the previous.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Util
 * @param {...(Function|Function[])} [funcs] The functions to invoke.
 * @returns {Function} Returns the new composite function.
 * @see _.flowRight
 * @example
 *
 * function square(n) {
 *   return n * n;
 * }
 *
 * var addSquare = _.flow([_.add, square]);
 * addSquare(1, 2);
 * // => 9
 */
var flow = createFlow();

module.exports = flow;
var createFlow = require('./_createFlow');

/**
 * This method is like `_.flow` except that it creates a function that
 * invokes the given functions from right to left.
 *
 * @static
 * @since 3.0.0
 * @memberOf _
 * @category Util
 * @param {...(Function|Function[])} [funcs] The functions to invoke.
 * @returns {Function} Returns the new composite function.
 * @see _.flow
 * @example
 *
 * function square(n) {
 *   return n * n;
 * }
 *
 * var addSquare = _.flowRight([square, _.add]);
 * addSquare(1, 2);
 * // => 9
 */
var flowRight = createFlow(true);

module.exports = flowRight;
var arrayEach = require('./_arrayEach'),
    baseEach = require('./_baseEach'),
    castFunction = require('./_castFunction'),
    isArray = require('./isArray');

/**
 * Iterates over elements of `collection` and invokes `iteratee` for each element.
 * The iteratee is invoked with three arguments: (value, index|key, collection).
 * Iteratee functions may exit iteration early by explicitly returning `false`.
 *
 * **Note:** As with other "Collections" methods, objects with a "length"
 * property are iterated like arrays. To avoid this behavior use `_.forIn`
 * or `_.forOwn` for object iteration.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @alias each
 * @category Collection
 * @param {Array|Object} collection The collection to iterate over.
 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
 * @returns {Array|Object} Returns `collection`.
 * @see _.forEachRight
 * @example
 *
 * _.forEach([1, 2], function(value) {
 *   console.log(value);
 * });
 * // => Logs `1` then `2`.
 *
 * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
 *   console.log(key);
 * });
 * // => Logs 'a' then 'b' (iteration order is not guaranteed).
 */
function forEach(collection, iteratee) {
  var func = isArray(collection) ? arrayEach : baseEach;
  return func(collection, castFunction(iteratee));
}

module.exports = forEach;
var arrayEachRight = require('./_arrayEachRight'),
    baseEachRight = require('./_baseEachRight'),
    castFunction = require('./_castFunction'),
    isArray = require('./isArray');

/**
 * This method is like `_.forEach` except that it iterates over elements of
 * `collection` from right to left.
 *
 * @static
 * @memberOf _
 * @since 2.0.0
 * @alias eachRight
 * @category Collection
 * @param {Array|Object} collection The collection to iterate over.
 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
 * @returns {Array|Object} Returns `collection`.
 * @see _.forEach
 * @example
 *
 * _.forEachRight([1, 2], function(value) {
 *   console.log(value);
 * });
 * // => Logs `2` then `1`.
 */
function forEachRight(collection, iteratee) {
  var func = isArray(collection) ? arrayEachRight : baseEachRight;
  return func(collection, castFunction(iteratee));
}

module.exports = forEachRight;
var baseFor = require('./_baseFor'),
    castFunction = require('./_castFunction'),
    keysIn = require('./keysIn');

/**
 * Iterates over own and inherited enumerable string keyed properties of an
 * object and invokes `iteratee` for each property. The iteratee is invoked
 * with three arguments: (value, key, object). Iteratee functions may exit
 * iteration early by explicitly returning `false`.
 *
 * @static
 * @memberOf _
 * @since 0.3.0
 * @category Object
 * @param {Object} object The object to iterate over.
 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
 * @returns {Object} Returns `object`.
 * @see _.forInRight
 * @example
 *
 * function Foo() {
 *   this.a = 1;
 *   this.b = 2;
 * }
 *
 * Foo.prototype.c = 3;
 *
 * _.forIn(new Foo, function(value, key) {
 *   console.log(key);
 * });
 * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).
 */
function forIn(object, iteratee) {
  return object == null
    ? object
    : baseFor(object, castFunction(iteratee), keysIn);
}

module.exports = forIn;
var baseForRight = require('./_baseForRight'),
    castFunction = require('./_castFunction'),
    keysIn = require('./keysIn');

/**
 * This method is like `_.forIn` except that it iterates over properties of
 * `object` in the opposite order.
 *
 * @static
 * @memberOf _
 * @since 2.0.0
 * @category Object
 * @param {Object} object The object to iterate over.
 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
 * @returns {Object} Returns `object`.
 * @see _.forIn
 * @example
 *
 * function Foo() {
 *   this.a = 1;
 *   this.b = 2;
 * }
 *
 * Foo.prototype.c = 3;
 *
 * _.forInRight(new Foo, function(value, key) {
 *   console.log(key);
 * });
 * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.
 */
function forInRight(object, iteratee) {
  return object == null
    ? object
    : baseForRight(object, castFunction(iteratee), keysIn);
}

module.exports = forInRight;
var baseForOwn = require('./_baseForOwn'),
    castFunction = require('./_castFunction');

/**
 * Iterates over own enumerable string keyed properties of an object and
 * invokes `iteratee` for each property. The iteratee is invoked with three
 * arguments: (value, key, object). Iteratee functions may exit iteration
 * early by explicitly returning `false`.
 *
 * @static
 * @memberOf _
 * @since 0.3.0
 * @category Object
 * @param {Object} object The object to iterate over.
 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
 * @returns {Object} Returns `object`.
 * @see _.forOwnRight
 * @example
 *
 * function Foo() {
 *   this.a = 1;
 *   this.b = 2;
 * }
 *
 * Foo.prototype.c = 3;
 *
 * _.forOwn(new Foo, function(value, key) {
 *   console.log(key);
 * });
 * // => Logs 'a' then 'b' (iteration order is not guaranteed).
 */
function forOwn(object, iteratee) {
  return object && baseForOwn(object, castFunction(iteratee));
}

module.exports = forOwn;
var baseForOwnRight = require('./_baseForOwnRight'),
    castFunction = require('./_castFunction');

/**
 * This method is like `_.forOwn` except that it iterates over properties of
 * `object` in the opposite order.
 *
 * @static
 * @memberOf _
 * @since 2.0.0
 * @category Object
 * @param {Object} object The object to iterate over.
 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
 * @returns {Object} Returns `object`.
 * @see _.forOwn
 * @example
 *
 * function Foo() {
 *   this.a = 1;
 *   this.b = 2;
 * }
 *
 * Foo.prototype.c = 3;
 *
 * _.forOwnRight(new Foo, function(value, key) {
 *   console.log(key);
 * });
 * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.
 */
function forOwnRight(object, iteratee) {
  return object && baseForOwnRight(object, castFunction(iteratee));
}

module.exports = forOwnRight;
var _ = require('./lodash.min').runInContext();
module.exports = require('./fp/_baseConvert')(_, _);
/**
 * The inverse of `_.toPairs`; this method returns an object composed
 * from key-value `pairs`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Array
 * @param {Array} pairs The key-value pairs.
 * @returns {Object} Returns the new object.
 * @example
 *
 * _.fromPairs([['a', 1], ['b', 2]]);
 * // => { 'a': 1, 'b': 2 }
 */
function fromPairs(pairs) {
  var index = -1,
      length = pairs == null ? 0 : pairs.length,
      result = {};

  while (++index < length) {
    var pair = pairs[index];
    result[pair[0]] = pair[1];
  }
  return result;
}

module.exports = fromPairs;
module.exports = {
  'after': require('./after'),
  'ary': require('./ary'),
  'before': require('./before'),
  'bind': require('./bind'),
  'bindKey': require('./bindKey'),
  'curry': require('./curry'),
  'curryRight': require('./curryRight'),
  'debounce': require('./debounce'),
  'defer': require('./defer'),
  'delay': require('./delay'),
  'flip': require('./flip'),
  'memoize': require('./memoize'),
  'negate': require('./negate'),
  'once': require('./once'),
  'overArgs': require('./overArgs'),
  'partial': require('./partial'),
  'partialRight': require('./partialRight'),
  'rearg': require('./rearg'),
  'rest': require('./rest'),
  'spread': require('./spread'),
  'throttle': require('./throttle'),
  'unary': require('./unary'),
  'wrap': require('./wrap')
};
var baseFunctions = require('./_baseFunctions'),
    keys = require('./keys');

/**
 * Creates an array of function property names from own enumerable properties
 * of `object`.
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category Object
 * @param {Object} object The object to inspect.
 * @returns {Array} Returns the function names.
 * @see _.functionsIn
 * @example
 *
 * function Foo() {
 *   this.a = _.constant('a');
 *   this.b = _.constant('b');
 * }
 *
 * Foo.prototype.c = _.constant('c');
 *
 * _.functions(new Foo);
 * // => ['a', 'b']
 */
function functions(object) {
  return object == null ? [] : baseFunctions(object, keys(object));
}

module.exports = functions;
var baseFunctions = require('./_baseFunctions'),
    keysIn = require('./keysIn');

/**
 * Creates an array of function property names from own and inherited
 * enumerable properties of `object`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Object
 * @param {Object} object The object to inspect.
 * @returns {Array} Returns the function names.
 * @see _.functions
 * @example
 *
 * function Foo() {
 *   this.a = _.constant('a');
 *   this.b = _.constant('b');
 * }
 *
 * Foo.prototype.c = _.constant('c');
 *
 * _.functionsIn(new Foo);
 * // => ['a', 'b', 'c']
 */
function functionsIn(object) {
  return object == null ? [] : baseFunctions(object, keysIn(object));
}

module.exports = functionsIn;
var baseGet = require('./_baseGet');

/**
 * Gets the value at `path` of `object`. If the resolved value is
 * `undefined`, the `defaultValue` is returned in its place.
 *
 * @static
 * @memberOf _
 * @since 3.7.0
 * @category Object
 * @param {Object} object The object to query.
 * @param {Array|string} path The path of the property to get.
 * @param {*} [defaultValue] The value returned for `undefined` resolved values.
 * @returns {*} Returns the resolved value.
 * @example
 *
 * var object = { 'a': [{ 'b': { 'c': 3 } }] };
 *
 * _.get(object, 'a[0].b.c');
 * // => 3
 *
 * _.get(object, ['a', '0', 'b', 'c']);
 * // => 3
 *
 * _.get(object, 'a.b.c', 'default');
 * // => 'default'
 */
function get(object, path, defaultValue) {
  var result = object == null ? undefined : baseGet(object, path);
  return result === undefined ? defaultValue : result;
}

module.exports = get;
var baseAssignValue = require('./_baseAssignValue'),
    createAggregator = require('./_createAggregator');

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * Creates an object composed of keys generated from the results of running
 * each element of `collection` thru `iteratee`. The order of grouped values
 * is determined by the order they occur in `collection`. The corresponding
 * value of each key is an array of elements responsible for generating the
 * key. The iteratee is invoked with one argument: (value).
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Collection
 * @param {Array|Object} collection The collection to iterate over.
 * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
 * @returns {Object} Returns the composed aggregate object.
 * @example
 *
 * _.groupBy([6.1, 4.2, 6.3], Math.floor);
 * // => { '4': [4.2], '6': [6.1, 6.3] }
 *
 * // The `_.property` iteratee shorthand.
 * _.groupBy(['one', 'two', 'three'], 'length');
 * // => { '3': ['one', 'two'], '5': ['three'] }
 */
var groupBy = createAggregator(function(result, value, key) {
  if (hasOwnProperty.call(result, key)) {
    result[key].push(value);
  } else {
    baseAssignValue(result, key, [value]);
  }
});

module.exports = groupBy;
var baseGt = require('./_baseGt'),
    createRelationalOperation = require('./_createRelationalOperation');

/**
 * Checks if `value` is greater than `other`.
 *
 * @static
 * @memberOf _
 * @since 3.9.0
 * @category Lang
 * @param {*} value The value to compare.
 * @param {*} other The other value to compare.
 * @returns {boolean} Returns `true` if `value` is greater than `other`,
 *  else `false`.
 * @see _.lt
 * @example
 *
 * _.gt(3, 1);
 * // => true
 *
 * _.gt(3, 3);
 * // => false
 *
 * _.gt(1, 3);
 * // => false
 */
var gt = createRelationalOperation(baseGt);

module.exports = gt;
var createRelationalOperation = require('./_createRelationalOperation');

/**
 * Checks if `value` is greater than or equal to `other`.
 *
 * @static
 * @memberOf _
 * @since 3.9.0
 * @category Lang
 * @param {*} value The value to compare.
 * @param {*} other The other value to compare.
 * @returns {boolean} Returns `true` if `value` is greater than or equal to
 *  `other`, else `false`.
 * @see _.lte
 * @example
 *
 * _.gte(3, 1);
 * // => true
 *
 * _.gte(3, 3);
 * // => true
 *
 * _.gte(1, 3);
 * // => false
 */
var gte = createRelationalOperation(function(value, other) {
  return value >= other;
});

module.exports = gte;
var baseHas = require('./_baseHas'),
    hasPath = require('./_hasPath');

/**
 * Checks if `path` is a direct property of `object`.
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category Object
 * @param {Object} object The object to query.
 * @param {Array|string} path The path to check.
 * @returns {boolean} Returns `true` if `path` exists, else `false`.
 * @example
 *
 * var object = { 'a': { 'b': 2 } };
 * var other = _.create({ 'a': _.create({ 'b': 2 }) });
 *
 * _.has(object, 'a');
 * // => true
 *
 * _.has(object, 'a.b');
 * // => true
 *
 * _.has(object, ['a', 'b']);
 * // => true
 *
 * _.has(other, 'a');
 * // => false
 */
function has(object, path) {
  return object != null && hasPath(object, path, baseHas);
}

module.exports = has;
var baseHasIn = require('./_baseHasIn'),
    hasPath = require('./_hasPath');

/**
 * Checks if `path` is a direct or inherited property of `object`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Object
 * @param {Object} object The object to query.
 * @param {Array|string} path The path to check.
 * @returns {boolean} Returns `true` if `path` exists, else `false`.
 * @example
 *
 * var object = _.create({ 'a': _.create({ 'b': 2 }) });
 *
 * _.hasIn(object, 'a');
 * // => true
 *
 * _.hasIn(object, 'a.b');
 * // => true
 *
 * _.hasIn(object, ['a', 'b']);
 * // => true
 *
 * _.hasIn(object, 'b');
 * // => false
 */
function hasIn(object, path) {
  return object != null && hasPath(object, path, baseHasIn);
}

module.exports = hasIn;
/**
 * Gets the first element of `array`.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @alias first
 * @category Array
 * @param {Array} array The array to query.
 * @returns {*} Returns the first element of `array`.
 * @example
 *
 * _.head([1, 2, 3]);
 * // => 1
 *
 * _.head([]);
 * // => undefined
 */
function head(array) {
  return (array && array.length) ? array[0] : undefined;
}

module.exports = head;
/**
 * This method returns the first argument it receives.
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category Util
 * @param {*} value Any value.
 * @returns {*} Returns `value`.
 * @example
 *
 * var object = { 'a': 1 };
 *
 * console.log(_.identity(object) === object);
 * // => true
 */
function identity(value) {
  return value;
}

module.exports = identity;
var baseInRange = require('./_baseInRange'),
    toFinite = require('./toFinite'),
    toNumber = require('./toNumber');

/**
 * Checks if `n` is between `start` and up to, but not including, `end`. If
 * `end` is not specified, it's set to `start` with `start` then set to `0`.
 * If `start` is greater than `end` the params are swapped to support
 * negative ranges.
 *
 * @static
 * @memberOf _
 * @since 3.3.0
 * @category Number
 * @param {number} number The number to check.
 * @param {number} [start=0] The start of the range.
 * @param {number} end The end of the range.
 * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
 * @see _.range, _.rangeRight
 * @example
 *
 * _.inRange(3, 2, 4);
 * // => true
 *
 * _.inRange(4, 8);
 * // => true
 *
 * _.inRange(4, 2);
 * // => false
 *
 * _.inRange(2, 2);
 * // => false
 *
 * _.inRange(1.2, 2);
 * // => true
 *
 * _.inRange(5.2, 4);
 * // => false
 *
 * _.inRange(-3, -2, -6);
 * // => true
 */
function inRange(number, start, end) {
  start = toFinite(start);
  if (end === undefined) {
    end = start;
    start = 0;
  } else {
    end = toFinite(end);
  }
  number = toNumber(number);
  return baseInRange(number, start, end);
}

module.exports = inRange;
var baseIndexOf = require('./_baseIndexOf'),
    isArrayLike = require('./isArrayLike'),
    isString = require('./isString'),
    toInteger = require('./toInteger'),
    values = require('./values');

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max;

/**
 * Checks if `value` is in `collection`. If `collection` is a string, it's
 * checked for a substring of `value`, otherwise
 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
 * is used for equality comparisons. If `fromIndex` is negative, it's used as
 * the offset from the end of `collection`.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Collection
 * @param {Array|Object|string} collection The collection to inspect.
 * @param {*} value The value to search for.
 * @param {number} [fromIndex=0] The index to search from.
 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
 * @returns {boolean} Returns `true` if `value` is found, else `false`.
 * @example
 *
 * _.includes([1, 2, 3], 1);
 * // => true
 *
 * _.includes([1, 2, 3], 1, 2);
 * // => false
 *
 * _.includes({ 'a': 1, 'b': 2 }, 1);
 * // => true
 *
 * _.includes('abcd', 'bc');
 * // => true
 */
function includes(collection, value, fromIndex, guard) {
  collection = isArrayLike(collection) ? collection : values(collection);
  fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;

  var length = collection.length;
  if (fromIndex < 0) {
    fromIndex = nativeMax(length + fromIndex, 0);
  }
  return isString(collection)
    ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
    : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
}

module.exports = includes;
module.exports = require('./lodash');var baseIndexOf = require('./_baseIndexOf'),
    toInteger = require('./toInteger');

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max;

/**
 * Gets the index at which the first occurrence of `value` is found in `array`
 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
 * for equality comparisons. If `fromIndex` is negative, it's used as the
 * offset from the end of `array`.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Array
 * @param {Array} array The array to inspect.
 * @param {*} value The value to search for.
 * @param {number} [fromIndex=0] The index to search from.
 * @returns {number} Returns the index of the matched value, else `-1`.
 * @example
 *
 * _.indexOf([1, 2, 1, 2], 2);
 * // => 1
 *
 * // Search from the `fromIndex`.
 * _.indexOf([1, 2, 1, 2], 2, 2);
 * // => 3
 */
function indexOf(array, value, fromIndex) {
  var length = array == null ? 0 : array.length;
  if (!length) {
    return -1;
  }
  var index = fromIndex == null ? 0 : toInteger(fromIndex);
  if (index < 0) {
    index = nativeMax(length + index, 0);
  }
  return baseIndexOf(array, value, index);
}

module.exports = indexOf;
var baseSlice = require('./_baseSlice');

/**
 * Gets all but the last element of `array`.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Array
 * @param {Array} array The array to query.
 * @returns {Array} Returns the slice of `array`.
 * @example
 *
 * _.initial([1, 2, 3]);
 * // => [1, 2]
 */
function initial(array) {
  var length = array == null ? 0 : array.length;
  return length ? baseSlice(array, 0, -1) : [];
}

module.exports = initial;
var arrayMap = require('./_arrayMap'),
    baseIntersection = require('./_baseIntersection'),
    baseRest = require('./_baseRest'),
    castArrayLikeObject = require('./_castArrayLikeObject');

/**
 * Creates an array of unique values that are included in all given arrays
 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
 * for equality comparisons. The order and references of result values are
 * determined by the first array.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Array
 * @param {...Array} [arrays] The arrays to inspect.
 * @returns {Array} Returns the new array of intersecting values.
 * @example
 *
 * _.intersection([2, 1], [2, 3]);
 * // => [2]
 */
var intersection = baseRest(function(arrays) {
  var mapped = arrayMap(arrays, castArrayLikeObject);
  return (mapped.length && mapped[0] === arrays[0])
    ? baseIntersection(mapped)
    : [];
});

module.exports = intersection;
var arrayMap = require('./_arrayMap'),
    baseIntersection = require('./_baseIntersection'),
    baseIteratee = require('./_baseIteratee'),
    baseRest = require('./_baseRest'),
    castArrayLikeObject = require('./_castArrayLikeObject'),
    last = require('./last');

/**
 * This method is like `_.intersection` except that it accepts `iteratee`
 * which is invoked for each element of each `arrays` to generate the criterion
 * by which they're compared. The order and references of result values are
 * determined by the first array. The iteratee is invoked with one argument:
 * (value).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Array
 * @param {...Array} [arrays] The arrays to inspect.
 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
 * @returns {Array} Returns the new array of intersecting values.
 * @example
 *
 * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);
 * // => [2.1]
 *
 * // The `_.property` iteratee shorthand.
 * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
 * // => [{ 'x': 1 }]
 */
var intersectionBy = baseRest(function(arrays) {
  var iteratee = last(arrays),
      mapped = arrayMap(arrays, castArrayLikeObject);

  if (iteratee === last(mapped)) {
    iteratee = undefined;
  } else {
    mapped.pop();
  }
  return (mapped.length && mapped[0] === arrays[0])
    ? baseIntersection(mapped, baseIteratee(iteratee, 2))
    : [];
});

module.exports = intersectionBy;
var arrayMap = require('./_arrayMap'),
    baseIntersection = require('./_baseIntersection'),
    baseRest = require('./_baseRest'),
    castArrayLikeObject = require('./_castArrayLikeObject'),
    last = require('./last');

/**
 * This method is like `_.intersection` except that it accepts `comparator`
 * which is invoked to compare elements of `arrays`. The order and references
 * of result values are determined by the first array. The comparator is
 * invoked with two arguments: (arrVal, othVal).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Array
 * @param {...Array} [arrays] The arrays to inspect.
 * @param {Function} [comparator] The comparator invoked per element.
 * @returns {Array} Returns the new array of intersecting values.
 * @example
 *
 * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
 * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
 *
 * _.intersectionWith(objects, others, _.isEqual);
 * // => [{ 'x': 1, 'y': 2 }]
 */
var intersectionWith = baseRest(function(arrays) {
  var comparator = last(arrays),
      mapped = arrayMap(arrays, castArrayLikeObject);

  comparator = typeof comparator == 'function' ? comparator : undefined;
  if (comparator) {
    mapped.pop();
  }
  return (mapped.length && mapped[0] === arrays[0])
    ? baseIntersection(mapped, undefined, comparator)
    : [];
});

module.exports = intersectionWith;
var constant = require('./constant'),
    createInverter = require('./_createInverter'),
    identity = require('./identity');

/** Used for built-in method references. */
var objectProto = Object.prototype;

/**
 * Used to resolve the
 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
 * of values.
 */
var nativeObjectToString = objectProto.toString;

/**
 * Creates an object composed of the inverted keys and values of `object`.
 * If `object` contains duplicate values, subsequent values overwrite
 * property assignments of previous values.
 *
 * @static
 * @memberOf _
 * @since 0.7.0
 * @category Object
 * @param {Object} object The object to invert.
 * @returns {Object} Returns the new inverted object.
 * @example
 *
 * var object = { 'a': 1, 'b': 2, 'c': 1 };
 *
 * _.invert(object);
 * // => { '1': 'c', '2': 'b' }
 */
var invert = createInverter(function(result, value, key) {
  if (value != null &&
      typeof value.toString != 'function') {
    value = nativeObjectToString.call(value);
  }

  result[value] = key;
}, constant(identity));

module.exports = invert;
var baseIteratee = require('./_baseIteratee'),
    createInverter = require('./_createInverter');

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * Used to resolve the
 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
 * of values.
 */
var nativeObjectToString = objectProto.toString;

/**
 * This method is like `_.invert` except that the inverted object is generated
 * from the results of running each element of `object` thru `iteratee`. The
 * corresponding inverted value of each inverted key is an array of keys
 * responsible for generating the inverted value. The iteratee is invoked
 * with one argument: (value).
 *
 * @static
 * @memberOf _
 * @since 4.1.0
 * @category Object
 * @param {Object} object The object to invert.
 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
 * @returns {Object} Returns the new inverted object.
 * @example
 *
 * var object = { 'a': 1, 'b': 2, 'c': 1 };
 *
 * _.invertBy(object);
 * // => { '1': ['a', 'c'], '2': ['b'] }
 *
 * _.invertBy(object, function(value) {
 *   return 'group' + value;
 * });
 * // => { 'group1': ['a', 'c'], 'group2': ['b'] }
 */
var invertBy = createInverter(function(result, value, key) {
  if (value != null &&
      typeof value.toString != 'function') {
    value = nativeObjectToString.call(value);
  }

  if (hasOwnProperty.call(result, value)) {
    result[value].push(key);
  } else {
    result[value] = [key];
  }
}, baseIteratee);

module.exports = invertBy;
var baseInvoke = require('./_baseInvoke'),
    baseRest = require('./_baseRest');

/**
 * Invokes the method at `path` of `object`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Object
 * @param {Object} object The object to query.
 * @param {Array|string} path The path of the method to invoke.
 * @param {...*} [args] The arguments to invoke the method with.
 * @returns {*} Returns the result of the invoked method.
 * @example
 *
 * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };
 *
 * _.invoke(object, 'a[0].b.c.slice', 1, 3);
 * // => [2, 3]
 */
var invoke = baseRest(baseInvoke);

module.exports = invoke;
var apply = require('./_apply'),
    baseEach = require('./_baseEach'),
    baseInvoke = require('./_baseInvoke'),
    baseRest = require('./_baseRest'),
    isArrayLike = require('./isArrayLike');

/**
 * Invokes the method at `path` of each element in `collection`, returning
 * an array of the results of each invoked method. Any additional arguments
 * are provided to each invoked method. If `path` is a function, it's invoked
 * for, and `this` bound to, each element in `collection`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Collection
 * @param {Array|Object} collection The collection to iterate over.
 * @param {Array|Function|string} path The path of the method to invoke or
 *  the function invoked per iteration.
 * @param {...*} [args] The arguments to invoke each method with.
 * @returns {Array} Returns the array of results.
 * @example
 *
 * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');
 * // => [[1, 5, 7], [1, 2, 3]]
 *
 * _.invokeMap([123, 456], String.prototype.split, '');
 * // => [['1', '2', '3'], ['4', '5', '6']]
 */
var invokeMap = baseRest(function(collection, path, args) {
  var index = -1,
      isFunc = typeof path == 'function',
      result = isArrayLike(collection) ? Array(collection.length) : [];

  baseEach(collection, function(value) {
    result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);
  });
  return result;
});

module.exports = invokeMap;
var baseIsArguments = require('./_baseIsArguments'),
    isObjectLike = require('./isObjectLike');

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/** Built-in value references. */
var propertyIsEnumerable = objectProto.propertyIsEnumerable;

/**
 * Checks if `value` is likely an `arguments` object.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an `arguments` object,
 *  else `false`.
 * @example
 *
 * _.isArguments(function() { return arguments; }());
 * // => true
 *
 * _.isArguments([1, 2, 3]);
 * // => false
 */
var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
  return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
    !propertyIsEnumerable.call(value, 'callee');
};

module.exports = isArguments;
/**
 * Checks if `value` is classified as an `Array` object.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an array, else `false`.
 * @example
 *
 * _.isArray([1, 2, 3]);
 * // => true
 *
 * _.isArray(document.body.children);
 * // => false
 *
 * _.isArray('abc');
 * // => false
 *
 * _.isArray(_.noop);
 * // => false
 */
var isArray = Array.isArray;

module.exports = isArray;
var baseIsArrayBuffer = require('./_baseIsArrayBuffer'),
    baseUnary = require('./_baseUnary'),
    nodeUtil = require('./_nodeUtil');

/* Node.js helper references. */
var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer;

/**
 * Checks if `value` is classified as an `ArrayBuffer` object.
 *
 * @static
 * @memberOf _
 * @since 4.3.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
 * @example
 *
 * _.isArrayBuffer(new ArrayBuffer(2));
 * // => true
 *
 * _.isArrayBuffer(new Array(2));
 * // => false
 */
var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;

module.exports = isArrayBuffer;
var isFunction = require('./isFunction'),
    isLength = require('./isLength');

/**
 * Checks if `value` is array-like. A value is considered array-like if it's
 * not a function and has a `value.length` that's an integer greater than or
 * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
 * @example
 *
 * _.isArrayLike([1, 2, 3]);
 * // => true
 *
 * _.isArrayLike(document.body.children);
 * // => true
 *
 * _.isArrayLike('abc');
 * // => true
 *
 * _.isArrayLike(_.noop);
 * // => false
 */
function isArrayLike(value) {
  return value != null && isLength(value.length) && !isFunction(value);
}

module.exports = isArrayLike;
var isArrayLike = require('./isArrayLike'),
    isObjectLike = require('./isObjectLike');

/**
 * This method is like `_.isArrayLike` except that it also checks if `value`
 * is an object.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an array-like object,
 *  else `false`.
 * @example
 *
 * _.isArrayLikeObject([1, 2, 3]);
 * // => true
 *
 * _.isArrayLikeObject(document.body.children);
 * // => true
 *
 * _.isArrayLikeObject('abc');
 * // => false
 *
 * _.isArrayLikeObject(_.noop);
 * // => false
 */
function isArrayLikeObject(value) {
  return isObjectLike(value) && isArrayLike(value);
}

module.exports = isArrayLikeObject;
var baseGetTag = require('./_baseGetTag'),
    isObjectLike = require('./isObjectLike');

/** `Object#toString` result references. */
var boolTag = '[object Boolean]';

/**
 * Checks if `value` is classified as a boolean primitive or object.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
 * @example
 *
 * _.isBoolean(false);
 * // => true
 *
 * _.isBoolean(null);
 * // => false
 */
function isBoolean(value) {
  return value === true || value === false ||
    (isObjectLike(value) && baseGetTag(value) == boolTag);
}

module.exports = isBoolean;
var root = require('./_root'),
    stubFalse = require('./stubFalse');

/** Detect free variable `exports`. */
var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;

/** Detect free variable `module`. */
var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;

/** Detect the popular CommonJS extension `module.exports`. */
var moduleExports = freeModule && freeModule.exports === freeExports;

/** Built-in value references. */
var Buffer = moduleExports ? root.Buffer : undefined;

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;

/**
 * Checks if `value` is a buffer.
 *
 * @static
 * @memberOf _
 * @since 4.3.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
 * @example
 *
 * _.isBuffer(new Buffer(2));
 * // => true
 *
 * _.isBuffer(new Uint8Array(2));
 * // => false
 */
var isBuffer = nativeIsBuffer || stubFalse;

module.exports = isBuffer;
var baseIsDate = require('./_baseIsDate'),
    baseUnary = require('./_baseUnary'),
    nodeUtil = require('./_nodeUtil');

/* Node.js helper references. */
var nodeIsDate = nodeUtil && nodeUtil.isDate;

/**
 * Checks if `value` is classified as a `Date` object.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
 * @example
 *
 * _.isDate(new Date);
 * // => true
 *
 * _.isDate('Mon April 23 2012');
 * // => false
 */
var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;

module.exports = isDate;
var isObjectLike = require('./isObjectLike'),
    isPlainObject = require('./isPlainObject');

/**
 * Checks if `value` is likely a DOM element.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.
 * @example
 *
 * _.isElement(document.body);
 * // => true
 *
 * _.isElement('<body>');
 * // => false
 */
function isElement(value) {
  return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);
}

module.exports = isElement;
var baseKeys = require('./_baseKeys'),
    getTag = require('./_getTag'),
    isArguments = require('./isArguments'),
    isArray = require('./isArray'),
    isArrayLike = require('./isArrayLike'),
    isBuffer = require('./isBuffer'),
    isPrototype = require('./_isPrototype'),
    isTypedArray = require('./isTypedArray');

/** `Object#toString` result references. */
var mapTag = '[object Map]',
    setTag = '[object Set]';

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * Checks if `value` is an empty object, collection, map, or set.
 *
 * Objects are considered empty if they have no own enumerable string keyed
 * properties.
 *
 * Array-like values such as `arguments` objects, arrays, buffers, strings, or
 * jQuery-like collections are considered empty if they have a `length` of `0`.
 * Similarly, maps and sets are considered empty if they have a `size` of `0`.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is empty, else `false`.
 * @example
 *
 * _.isEmpty(null);
 * // => true
 *
 * _.isEmpty(true);
 * // => true
 *
 * _.isEmpty(1);
 * // => true
 *
 * _.isEmpty([1, 2, 3]);
 * // => false
 *
 * _.isEmpty({ 'a': 1 });
 * // => false
 */
function isEmpty(value) {
  if (value == null) {
    return true;
  }
  if (isArrayLike(value) &&
      (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
        isBuffer(value) || isTypedArray(value) || isArguments(value))) {
    return !value.length;
  }
  var tag = getTag(value);
  if (tag == mapTag || tag == setTag) {
    return !value.size;
  }
  if (isPrototype(value)) {
    return !baseKeys(value).length;
  }
  for (var key in value) {
    if (hasOwnProperty.call(value, key)) {
      return false;
    }
  }
  return true;
}

module.exports = isEmpty;
var baseIsEqual = require('./_baseIsEqual');

/**
 * Performs a deep comparison between two values to determine if they are
 * equivalent.
 *
 * **Note:** This method supports comparing arrays, array buffers, booleans,
 * date objects, error objects, maps, numbers, `Object` objects, regexes,
 * sets, strings, symbols, and typed arrays. `Object` objects are compared
 * by their own, not inherited, enumerable properties. Functions and DOM
 * nodes are compared by strict equality, i.e. `===`.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to compare.
 * @param {*} other The other value to compare.
 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
 * @example
 *
 * var object = { 'a': 1 };
 * var other = { 'a': 1 };
 *
 * _.isEqual(object, other);
 * // => true
 *
 * object === other;
 * // => false
 */
function isEqual(value, other) {
  return baseIsEqual(value, other);
}

module.exports = isEqual;
var baseIsEqual = require('./_baseIsEqual');

/**
 * This method is like `_.isEqual` except that it accepts `customizer` which
 * is invoked to compare values. If `customizer` returns `undefined`, comparisons
 * are handled by the method instead. The `customizer` is invoked with up to
 * six arguments: (objValue, othValue [, index|key, object, other, stack]).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to compare.
 * @param {*} other The other value to compare.
 * @param {Function} [customizer] The function to customize comparisons.
 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
 * @example
 *
 * function isGreeting(value) {
 *   return /^h(?:i|ello)$/.test(value);
 * }
 *
 * function customizer(objValue, othValue) {
 *   if (isGreeting(objValue) && isGreeting(othValue)) {
 *     return true;
 *   }
 * }
 *
 * var array = ['hello', 'goodbye'];
 * var other = ['hi', 'goodbye'];
 *
 * _.isEqualWith(array, other, customizer);
 * // => true
 */
function isEqualWith(value, other, customizer) {
  customizer = typeof customizer == 'function' ? customizer : undefined;
  var result = customizer ? customizer(value, other) : undefined;
  return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;
}

module.exports = isEqualWith;
var baseGetTag = require('./_baseGetTag'),
    isObjectLike = require('./isObjectLike'),
    isPlainObject = require('./isPlainObject');

/** `Object#toString` result references. */
var domExcTag = '[object DOMException]',
    errorTag = '[object Error]';

/**
 * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,
 * `SyntaxError`, `TypeError`, or `URIError` object.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an error object, else `false`.
 * @example
 *
 * _.isError(new Error);
 * // => true
 *
 * _.isError(Error);
 * // => false
 */
function isError(value) {
  if (!isObjectLike(value)) {
    return false;
  }
  var tag = baseGetTag(value);
  return tag == errorTag || tag == domExcTag ||
    (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));
}

module.exports = isError;
var root = require('./_root');

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeIsFinite = root.isFinite;

/**
 * Checks if `value` is a finite primitive number.
 *
 * **Note:** This method is based on
 * [`Number.isFinite`](https://mdn.io/Number/isFinite).
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
 * @example
 *
 * _.isFinite(3);
 * // => true
 *
 * _.isFinite(Number.MIN_VALUE);
 * // => true
 *
 * _.isFinite(Infinity);
 * // => false
 *
 * _.isFinite('3');
 * // => false
 */
function isFinite(value) {
  return typeof value == 'number' && nativeIsFinite(value);
}

module.exports = isFinite;
var baseGetTag = require('./_baseGetTag'),
    isObject = require('./isObject');

/** `Object#toString` result references. */
var asyncTag = '[object AsyncFunction]',
    funcTag = '[object Function]',
    genTag = '[object GeneratorFunction]',
    proxyTag = '[object Proxy]';

/**
 * Checks if `value` is classified as a `Function` object.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a function, else `false`.
 * @example
 *
 * _.isFunction(_);
 * // => true
 *
 * _.isFunction(/abc/);
 * // => false
 */
function isFunction(value) {
  if (!isObject(value)) {
    return false;
  }
  // The use of `Object#toString` avoids issues with the `typeof` operator
  // in Safari 9 which returns 'object' for typed arrays and other constructors.
  var tag = baseGetTag(value);
  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
}

module.exports = isFunction;
var toInteger = require('./toInteger');

/**
 * Checks if `value` is an integer.
 *
 * **Note:** This method is based on
 * [`Number.isInteger`](https://mdn.io/Number/isInteger).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an integer, else `false`.
 * @example
 *
 * _.isInteger(3);
 * // => true
 *
 * _.isInteger(Number.MIN_VALUE);
 * // => false
 *
 * _.isInteger(Infinity);
 * // => false
 *
 * _.isInteger('3');
 * // => false
 */
function isInteger(value) {
  return typeof value == 'number' && value == toInteger(value);
}

module.exports = isInteger;
/** Used as references for various `Number` constants. */
var MAX_SAFE_INTEGER = 9007199254740991;

/**
 * Checks if `value` is a valid array-like length.
 *
 * **Note:** This method is loosely based on
 * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
 * @example
 *
 * _.isLength(3);
 * // => true
 *
 * _.isLength(Number.MIN_VALUE);
 * // => false
 *
 * _.isLength(Infinity);
 * // => false
 *
 * _.isLength('3');
 * // => false
 */
function isLength(value) {
  return typeof value == 'number' &&
    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
}

module.exports = isLength;
var baseIsMap = require('./_baseIsMap'),
    baseUnary = require('./_baseUnary'),
    nodeUtil = require('./_nodeUtil');

/* Node.js helper references. */
var nodeIsMap = nodeUtil && nodeUtil.isMap;

/**
 * Checks if `value` is classified as a `Map` object.
 *
 * @static
 * @memberOf _
 * @since 4.3.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a map, else `false`.
 * @example
 *
 * _.isMap(new Map);
 * // => true
 *
 * _.isMap(new WeakMap);
 * // => false
 */
var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;

module.exports = isMap;
var baseIsMatch = require('./_baseIsMatch'),
    getMatchData = require('./_getMatchData');

/**
 * Performs a partial deep comparison between `object` and `source` to
 * determine if `object` contains equivalent property values.
 *
 * **Note:** This method is equivalent to `_.matches` when `source` is
 * partially applied.
 *
 * Partial comparisons will match empty array and empty object `source`
 * values against any array or object value, respectively. See `_.isEqual`
 * for a list of supported value comparisons.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Lang
 * @param {Object} object The object to inspect.
 * @param {Object} source The object of property values to match.
 * @returns {boolean} Returns `true` if `object` is a match, else `false`.
 * @example
 *
 * var object = { 'a': 1, 'b': 2 };
 *
 * _.isMatch(object, { 'b': 2 });
 * // => true
 *
 * _.isMatch(object, { 'b': 1 });
 * // => false
 */
function isMatch(object, source) {
  return object === source || baseIsMatch(object, source, getMatchData(source));
}

module.exports = isMatch;
var baseIsMatch = require('./_baseIsMatch'),
    getMatchData = require('./_getMatchData');

/**
 * This method is like `_.isMatch` except that it accepts `customizer` which
 * is invoked to compare values. If `customizer` returns `undefined`, comparisons
 * are handled by the method instead. The `customizer` is invoked with five
 * arguments: (objValue, srcValue, index|key, object, source).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {Object} object The object to inspect.
 * @param {Object} source The object of property values to match.
 * @param {Function} [customizer] The function to customize comparisons.
 * @returns {boolean} Returns `true` if `object` is a match, else `false`.
 * @example
 *
 * function isGreeting(value) {
 *   return /^h(?:i|ello)$/.test(value);
 * }
 *
 * function customizer(objValue, srcValue) {
 *   if (isGreeting(objValue) && isGreeting(srcValue)) {
 *     return true;
 *   }
 * }
 *
 * var object = { 'greeting': 'hello' };
 * var source = { 'greeting': 'hi' };
 *
 * _.isMatchWith(object, source, customizer);
 * // => true
 */
function isMatchWith(object, source, customizer) {
  customizer = typeof customizer == 'function' ? customizer : undefined;
  return baseIsMatch(object, source, getMatchData(source), customizer);
}

module.exports = isMatchWith;
var isNumber = require('./isNumber');

/**
 * Checks if `value` is `NaN`.
 *
 * **Note:** This method is based on
 * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
 * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
 * `undefined` and other non-number values.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
 * @example
 *
 * _.isNaN(NaN);
 * // => true
 *
 * _.isNaN(new Number(NaN));
 * // => true
 *
 * isNaN(undefined);
 * // => true
 *
 * _.isNaN(undefined);
 * // => false
 */
function isNaN(value) {
  // An `NaN` primitive is the only value that is not equal to itself.
  // Perform the `toStringTag` check first to avoid errors with some
  // ActiveX objects in IE.
  return isNumber(value) && value != +value;
}

module.exports = isNaN;
var baseIsNative = require('./_baseIsNative'),
    isMaskable = require('./_isMaskable');

/** Error message constants. */
var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.';

/**
 * Checks if `value` is a pristine native function.
 *
 * **Note:** This method can't reliably detect native functions in the presence
 * of the core-js package because core-js circumvents this kind of detection.
 * Despite multiple requests, the core-js maintainer has made it clear: any
 * attempt to fix the detection will be obstructed. As a result, we're left
 * with little choice but to throw an error. Unfortunately, this also affects
 * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),
 * which rely on core-js.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a native function,
 *  else `false`.
 * @example
 *
 * _.isNative(Array.prototype.push);
 * // => true
 *
 * _.isNative(_);
 * // => false
 */
function isNative(value) {
  if (isMaskable(value)) {
    throw new Error(CORE_ERROR_TEXT);
  }
  return baseIsNative(value);
}

module.exports = isNative;
/**
 * Checks if `value` is `null` or `undefined`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is nullish, else `false`.
 * @example
 *
 * _.isNil(null);
 * // => true
 *
 * _.isNil(void 0);
 * // => true
 *
 * _.isNil(NaN);
 * // => false
 */
function isNil(value) {
  return value == null;
}

module.exports = isNil;
/**
 * Checks if `value` is `null`.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
 * @example
 *
 * _.isNull(null);
 * // => true
 *
 * _.isNull(void 0);
 * // => false
 */
function isNull(value) {
  return value === null;
}

module.exports = isNull;
var baseGetTag = require('./_baseGetTag'),
    isObjectLike = require('./isObjectLike');

/** `Object#toString` result references. */
var numberTag = '[object Number]';

/**
 * Checks if `value` is classified as a `Number` primitive or object.
 *
 * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
 * classified as numbers, use the `_.isFinite` method.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a number, else `false`.
 * @example
 *
 * _.isNumber(3);
 * // => true
 *
 * _.isNumber(Number.MIN_VALUE);
 * // => true
 *
 * _.isNumber(Infinity);
 * // => true
 *
 * _.isNumber('3');
 * // => false
 */
function isNumber(value) {
  return typeof value == 'number' ||
    (isObjectLike(value) && baseGetTag(value) == numberTag);
}

module.exports = isNumber;
/**
 * Checks if `value` is the
 * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
 * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an object, else `false`.
 * @example
 *
 * _.isObject({});
 * // => true
 *
 * _.isObject([1, 2, 3]);
 * // => true
 *
 * _.isObject(_.noop);
 * // => true
 *
 * _.isObject(null);
 * // => false
 */
function isObject(value) {
  var type = typeof value;
  return value != null && (type == 'object' || type == 'function');
}

module.exports = isObject;
/**
 * Checks if `value` is object-like. A value is object-like if it's not `null`
 * and has a `typeof` result of "object".
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
 * @example
 *
 * _.isObjectLike({});
 * // => true
 *
 * _.isObjectLike([1, 2, 3]);
 * // => true
 *
 * _.isObjectLike(_.noop);
 * // => false
 *
 * _.isObjectLike(null);
 * // => false
 */
function isObjectLike(value) {
  return value != null && typeof value == 'object';
}

module.exports = isObjectLike;
var baseGetTag = require('./_baseGetTag'),
    getPrototype = require('./_getPrototype'),
    isObjectLike = require('./isObjectLike');

/** `Object#toString` result references. */
var objectTag = '[object Object]';

/** Used for built-in method references. */
var funcProto = Function.prototype,
    objectProto = Object.prototype;

/** Used to resolve the decompiled source of functions. */
var funcToString = funcProto.toString;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/** Used to infer the `Object` constructor. */
var objectCtorString = funcToString.call(Object);

/**
 * Checks if `value` is a plain object, that is, an object created by the
 * `Object` constructor or one with a `[[Prototype]]` of `null`.
 *
 * @static
 * @memberOf _
 * @since 0.8.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
 * @example
 *
 * function Foo() {
 *   this.a = 1;
 * }
 *
 * _.isPlainObject(new Foo);
 * // => false
 *
 * _.isPlainObject([1, 2, 3]);
 * // => false
 *
 * _.isPlainObject({ 'x': 0, 'y': 0 });
 * // => true
 *
 * _.isPlainObject(Object.create(null));
 * // => true
 */
function isPlainObject(value) {
  if (!isObjectLike(value) || baseGetTag(value) != objectTag) {
    return false;
  }
  var proto = getPrototype(value);
  if (proto === null) {
    return true;
  }
  var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
  return typeof Ctor == 'function' && Ctor instanceof Ctor &&
    funcToString.call(Ctor) == objectCtorString;
}

module.exports = isPlainObject;
var baseIsRegExp = require('./_baseIsRegExp'),
    baseUnary = require('./_baseUnary'),
    nodeUtil = require('./_nodeUtil');

/* Node.js helper references. */
var nodeIsRegExp = nodeUtil && nodeUtil.isRegExp;

/**
 * Checks if `value` is classified as a `RegExp` object.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
 * @example
 *
 * _.isRegExp(/abc/);
 * // => true
 *
 * _.isRegExp('/abc/');
 * // => false
 */
var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;

module.exports = isRegExp;
var isInteger = require('./isInteger');

/** Used as references for various `Number` constants. */
var MAX_SAFE_INTEGER = 9007199254740991;

/**
 * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754
 * double precision number which isn't the result of a rounded unsafe integer.
 *
 * **Note:** This method is based on
 * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.
 * @example
 *
 * _.isSafeInteger(3);
 * // => true
 *
 * _.isSafeInteger(Number.MIN_VALUE);
 * // => false
 *
 * _.isSafeInteger(Infinity);
 * // => false
 *
 * _.isSafeInteger('3');
 * // => false
 */
function isSafeInteger(value) {
  return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;
}

module.exports = isSafeInteger;
var baseIsSet = require('./_baseIsSet'),
    baseUnary = require('./_baseUnary'),
    nodeUtil = require('./_nodeUtil');

/* Node.js helper references. */
var nodeIsSet = nodeUtil && nodeUtil.isSet;

/**
 * Checks if `value` is classified as a `Set` object.
 *
 * @static
 * @memberOf _
 * @since 4.3.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a set, else `false`.
 * @example
 *
 * _.isSet(new Set);
 * // => true
 *
 * _.isSet(new WeakSet);
 * // => false
 */
var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;

module.exports = isSet;
var baseGetTag = require('./_baseGetTag'),
    isArray = require('./isArray'),
    isObjectLike = require('./isObjectLike');

/** `Object#toString` result references. */
var stringTag = '[object String]';

/**
 * Checks if `value` is classified as a `String` primitive or object.
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a string, else `false`.
 * @example
 *
 * _.isString('abc');
 * // => true
 *
 * _.isString(1);
 * // => false
 */
function isString(value) {
  return typeof value == 'string' ||
    (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);
}

module.exports = isString;
var baseGetTag = require('./_baseGetTag'),
    isObjectLike = require('./isObjectLike');

/** `Object#toString` result references. */
var symbolTag = '[object Symbol]';

/**
 * Checks if `value` is classified as a `Symbol` primitive or object.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
 * @example
 *
 * _.isSymbol(Symbol.iterator);
 * // => true
 *
 * _.isSymbol('abc');
 * // => false
 */
function isSymbol(value) {
  return typeof value == 'symbol' ||
    (isObjectLike(value) && baseGetTag(value) == symbolTag);
}

module.exports = isSymbol;
var baseIsTypedArray = require('./_baseIsTypedArray'),
    baseUnary = require('./_baseUnary'),
    nodeUtil = require('./_nodeUtil');

/* Node.js helper references. */
var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;

/**
 * Checks if `value` is classified as a typed array.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
 * @example
 *
 * _.isTypedArray(new Uint8Array);
 * // => true
 *
 * _.isTypedArray([]);
 * // => false
 */
var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;

module.exports = isTypedArray;
/**
 * Checks if `value` is `undefined`.
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
 * @example
 *
 * _.isUndefined(void 0);
 * // => true
 *
 * _.isUndefined(null);
 * // => false
 */
function isUndefined(value) {
  return value === undefined;
}

module.exports = isUndefined;
var getTag = require('./_getTag'),
    isObjectLike = require('./isObjectLike');

/** `Object#toString` result references. */
var weakMapTag = '[object WeakMap]';

/**
 * Checks if `value` is classified as a `WeakMap` object.
 *
 * @static
 * @memberOf _
 * @since 4.3.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.
 * @example
 *
 * _.isWeakMap(new WeakMap);
 * // => true
 *
 * _.isWeakMap(new Map);
 * // => false
 */
function isWeakMap(value) {
  return isObjectLike(value) && getTag(value) == weakMapTag;
}

module.exports = isWeakMap;
var baseGetTag = require('./_baseGetTag'),
    isObjectLike = require('./isObjectLike');

/** `Object#toString` result references. */
var weakSetTag = '[object WeakSet]';

/**
 * Checks if `value` is classified as a `WeakSet` object.
 *
 * @static
 * @memberOf _
 * @since 4.3.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.
 * @example
 *
 * _.isWeakSet(new WeakSet);
 * // => true
 *
 * _.isWeakSet(new Set);
 * // => false
 */
function isWeakSet(value) {
  return isObjectLike(value) && baseGetTag(value) == weakSetTag;
}

module.exports = isWeakSet;
var baseClone = require('./_baseClone'),
    baseIteratee = require('./_baseIteratee');

/** Used to compose bitmasks for cloning. */
var CLONE_DEEP_FLAG = 1;

/**
 * Creates a function that invokes `func` with the arguments of the created
 * function. If `func` is a property name, the created function returns the
 * property value for a given element. If `func` is an array or object, the
 * created function returns `true` for elements that contain the equivalent
 * source properties, otherwise it returns `false`.
 *
 * @static
 * @since 4.0.0
 * @memberOf _
 * @category Util
 * @param {*} [func=_.identity] The value to convert to a callback.
 * @returns {Function} Returns the callback.
 * @example
 *
 * var users = [
 *   { 'user': 'barney', 'age': 36, 'active': true },
 *   { 'user': 'fred',   'age': 40, 'active': false }
 * ];
 *
 * // The `_.matches` iteratee shorthand.
 * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));
 * // => [{ 'user': 'barney', 'age': 36, 'active': true }]
 *
 * // The `_.matchesProperty` iteratee shorthand.
 * _.filter(users, _.iteratee(['user', 'fred']));
 * // => [{ 'user': 'fred', 'age': 40 }]
 *
 * // The `_.property` iteratee shorthand.
 * _.map(users, _.iteratee('user'));
 * // => ['barney', 'fred']
 *
 * // Create custom iteratee shorthands.
 * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {
 *   return !_.isRegExp(func) ? iteratee(func) : function(string) {
 *     return func.test(string);
 *   };
 * });
 *
 * _.filter(['abc', 'def'], /ef/);
 * // => ['def']
 */
function iteratee(func) {
  return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));
}

module.exports = iteratee;
/** Used for built-in method references. */
var arrayProto = Array.prototype;

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeJoin = arrayProto.join;

/**
 * Converts all elements in `array` into a string separated by `separator`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Array
 * @param {Array} array The array to convert.
 * @param {string} [separator=','] The element separator.
 * @returns {string} Returns the joined string.
 * @example
 *
 * _.join(['a', 'b', 'c'], '~');
 * // => 'a~b~c'
 */
function join(array, separator) {
  return array == null ? '' : nativeJoin.call(array, separator);
}

module.exports = join;
var createCompounder = require('./_createCompounder');

/**
 * Converts `string` to
 * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category String
 * @param {string} [string=''] The string to convert.
 * @returns {string} Returns the kebab cased string.
 * @example
 *
 * _.kebabCase('Foo Bar');
 * // => 'foo-bar'
 *
 * _.kebabCase('fooBar');
 * // => 'foo-bar'
 *
 * _.kebabCase('__FOO_BAR__');
 * // => 'foo-bar'
 */
var kebabCase = createCompounder(function(result, word, index) {
  return result + (index ? '-' : '') + word.toLowerCase();
});

module.exports = kebabCase;
var baseAssignValue = require('./_baseAssignValue'),
    createAggregator = require('./_createAggregator');

/**
 * Creates an object composed of keys generated from the results of running
 * each element of `collection` thru `iteratee`. The corresponding value of
 * each key is the last element responsible for generating the key. The
 * iteratee is invoked with one argument: (value).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Collection
 * @param {Array|Object} collection The collection to iterate over.
 * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
 * @returns {Object} Returns the composed aggregate object.
 * @example
 *
 * var array = [
 *   { 'dir': 'left', 'code': 97 },
 *   { 'dir': 'right', 'code': 100 }
 * ];
 *
 * _.keyBy(array, function(o) {
 *   return String.fromCharCode(o.code);
 * });
 * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
 *
 * _.keyBy(array, 'dir');
 * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
 */
var keyBy = createAggregator(function(result, value, key) {
  baseAssignValue(result, key, value);
});

module.exports = keyBy;
var arrayLikeKeys = require('./_arrayLikeKeys'),
    baseKeys = require('./_baseKeys'),
    isArrayLike = require('./isArrayLike');

/**
 * Creates an array of the own enumerable property names of `object`.
 *
 * **Note:** Non-object values are coerced to objects. See the
 * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
 * for more details.
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category Object
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of property names.
 * @example
 *
 * function Foo() {
 *   this.a = 1;
 *   this.b = 2;
 * }
 *
 * Foo.prototype.c = 3;
 *
 * _.keys(new Foo);
 * // => ['a', 'b'] (iteration order is not guaranteed)
 *
 * _.keys('hi');
 * // => ['0', '1']
 */
function keys(object) {
  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
}

module.exports = keys;
var arrayLikeKeys = require('./_arrayLikeKeys'),
    baseKeysIn = require('./_baseKeysIn'),
    isArrayLike = require('./isArrayLike');

/**
 * Creates an array of the own and inherited enumerable property names of `object`.
 *
 * **Note:** Non-object values are coerced to objects.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Object
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of property names.
 * @example
 *
 * function Foo() {
 *   this.a = 1;
 *   this.b = 2;
 * }
 *
 * Foo.prototype.c = 3;
 *
 * _.keysIn(new Foo);
 * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
 */
function keysIn(object) {
  return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
}

module.exports = keysIn;
module.exports = {
  'castArray': require('./castArray'),
  'clone': require('./clone'),
  'cloneDeep': require('./cloneDeep'),
  'cloneDeepWith': require('./cloneDeepWith'),
  'cloneWith': require('./cloneWith'),
  'conformsTo': require('./conformsTo'),
  'eq': require('./eq'),
  'gt': require('./gt'),
  'gte': require('./gte'),
  'isArguments': require('./isArguments'),
  'isArray': require('./isArray'),
  'isArrayBuffer': require('./isArrayBuffer'),
  'isArrayLike': require('./isArrayLike'),
  'isArrayLikeObject': require('./isArrayLikeObject'),
  'isBoolean': require('./isBoolean'),
  'isBuffer': require('./isBuffer'),
  'isDate': require('./isDate'),
  'isElement': require('./isElement'),
  'isEmpty': require('./isEmpty'),
  'isEqual': require('./isEqual'),
  'isEqualWith': require('./isEqualWith'),
  'isError': require('./isError'),
  'isFinite': require('./isFinite'),
  'isFunction': require('./isFunction'),
  'isInteger': require('./isInteger'),
  'isLength': require('./isLength'),
  'isMap': require('./isMap'),
  'isMatch': require('./isMatch'),
  'isMatchWith': require('./isMatchWith'),
  'isNaN': require('./isNaN'),
  'isNative': require('./isNative'),
  'isNil': require('./isNil'),
  'isNull': require('./isNull'),
  'isNumber': require('./isNumber'),
  'isObject': require('./isObject'),
  'isObjectLike': require('./isObjectLike'),
  'isPlainObject': require('./isPlainObject'),
  'isRegExp': require('./isRegExp'),
  'isSafeInteger': require('./isSafeInteger'),
  'isSet': require('./isSet'),
  'isString': require('./isString'),
  'isSymbol': require('./isSymbol'),
  'isTypedArray': require('./isTypedArray'),
  'isUndefined': require('./isUndefined'),
  'isWeakMap': require('./isWeakMap'),
  'isWeakSet': require('./isWeakSet'),
  'lt': require('./lt'),
  'lte': require('./lte'),
  'toArray': require('./toArray'),
  'toFinite': require('./toFinite'),
  'toInteger': require('./toInteger'),
  'toLength': require('./toLength'),
  'toNumber': require('./toNumber'),
  'toPlainObject': require('./toPlainObject'),
  'toSafeInteger': require('./toSafeInteger'),
  'toString': require('./toString')
};
/**
 * Gets the last element of `array`.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Array
 * @param {Array} array The array to query.
 * @returns {*} Returns the last element of `array`.
 * @example
 *
 * _.last([1, 2, 3]);
 * // => 3
 */
function last(array) {
  var length = array == null ? 0 : array.length;
  return length ? array[length - 1] : undefined;
}

module.exports = last;
var baseFindIndex = require('./_baseFindIndex'),
    baseIsNaN = require('./_baseIsNaN'),
    strictLastIndexOf = require('./_strictLastIndexOf'),
    toInteger = require('./toInteger');

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max,
    nativeMin = Math.min;

/**
 * This method is like `_.indexOf` except that it iterates over elements of
 * `array` from right to left.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Array
 * @param {Array} array The array to inspect.
 * @param {*} value The value to search for.
 * @param {number} [fromIndex=array.length-1] The index to search from.
 * @returns {number} Returns the index of the matched value, else `-1`.
 * @example
 *
 * _.lastIndexOf([1, 2, 1, 2], 2);
 * // => 3
 *
 * // Search from the `fromIndex`.
 * _.lastIndexOf([1, 2, 1, 2], 2, 2);
 * // => 1
 */
function lastIndexOf(array, value, fromIndex) {
  var length = array == null ? 0 : array.length;
  if (!length) {
    return -1;
  }
  var index = length;
  if (fromIndex !== undefined) {
    index = toInteger(fromIndex);
    index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);
  }
  return value === value
    ? strictLastIndexOf(array, value, index)
    : baseFindIndex(array, baseIsNaN, index, true);
}

module.exports = lastIndexOf;
/**
 * @license
 * Lodash <https://lodash.com/>
 * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
 * Released under MIT license <https://lodash.com/license>
 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
 */
;(function() {

  /** Used as a safe reference for `undefined` in pre-ES5 environments. */
  var undefined;

  /** Used as the semantic version number. */
  var VERSION = '4.17.21';

  /** Used as the size to enable large array optimizations. */
  var LARGE_ARRAY_SIZE = 200;

  /** Error message constants. */
  var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',
      FUNC_ERROR_TEXT = 'Expected a function',
      INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';

  /** Used to stand-in for `undefined` hash values. */
  var HASH_UNDEFINED = '__lodash_hash_undefined__';

  /** Used as the maximum memoize cache size. */
  var MAX_MEMOIZE_SIZE = 500;

  /** Used as the internal argument placeholder. */
  var PLACEHOLDER = '__lodash_placeholder__';

  /** Used to compose bitmasks for cloning. */
  var CLONE_DEEP_FLAG = 1,
      CLONE_FLAT_FLAG = 2,
      CLONE_SYMBOLS_FLAG = 4;

  /** Used to compose bitmasks for value comparisons. */
  var COMPARE_PARTIAL_FLAG = 1,
      COMPARE_UNORDERED_FLAG = 2;

  /** Used to compose bitmasks for function metadata. */
  var WRAP_BIND_FLAG = 1,
      WRAP_BIND_KEY_FLAG = 2,
      WRAP_CURRY_BOUND_FLAG = 4,
      WRAP_CURRY_FLAG = 8,
      WRAP_CURRY_RIGHT_FLAG = 16,
      WRAP_PARTIAL_FLAG = 32,
      WRAP_PARTIAL_RIGHT_FLAG = 64,
      WRAP_ARY_FLAG = 128,
      WRAP_REARG_FLAG = 256,
      WRAP_FLIP_FLAG = 512;

  /** Used as default options for `_.truncate`. */
  var DEFAULT_TRUNC_LENGTH = 30,
      DEFAULT_TRUNC_OMISSION = '...';

  /** Used to detect hot functions by number of calls within a span of milliseconds. */
  var HOT_COUNT = 800,
      HOT_SPAN = 16;

  /** Used to indicate the type of lazy iteratees. */
  var LAZY_FILTER_FLAG = 1,
      LAZY_MAP_FLAG = 2,
      LAZY_WHILE_FLAG = 3;

  /** Used as references for various `Number` constants. */
  var INFINITY = 1 / 0,
      MAX_SAFE_INTEGER = 9007199254740991,
      MAX_INTEGER = 1.7976931348623157e+308,
      NAN = 0 / 0;

  /** Used as references for the maximum length and index of an array. */
  var MAX_ARRAY_LENGTH = 4294967295,
      MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,
      HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;

  /** Used to associate wrap methods with their bit flags. */
  var wrapFlags = [
    ['ary', WRAP_ARY_FLAG],
    ['bind', WRAP_BIND_FLAG],
    ['bindKey', WRAP_BIND_KEY_FLAG],
    ['curry', WRAP_CURRY_FLAG],
    ['curryRight', WRAP_CURRY_RIGHT_FLAG],
    ['flip', WRAP_FLIP_FLAG],
    ['partial', WRAP_PARTIAL_FLAG],
    ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
    ['rearg', WRAP_REARG_FLAG]
  ];

  /** `Object#toString` result references. */
  var argsTag = '[object Arguments]',
      arrayTag = '[object Array]',
      asyncTag = '[object AsyncFunction]',
      boolTag = '[object Boolean]',
      dateTag = '[object Date]',
      domExcTag = '[object DOMException]',
      errorTag = '[object Error]',
      funcTag = '[object Function]',
      genTag = '[object GeneratorFunction]',
      mapTag = '[object Map]',
      numberTag = '[object Number]',
      nullTag = '[object Null]',
      objectTag = '[object Object]',
      promiseTag = '[object Promise]',
      proxyTag = '[object Proxy]',
      regexpTag = '[object RegExp]',
      setTag = '[object Set]',
      stringTag = '[object String]',
      symbolTag = '[object Symbol]',
      undefinedTag = '[object Undefined]',
      weakMapTag = '[object WeakMap]',
      weakSetTag = '[object WeakSet]';

  var arrayBufferTag = '[object ArrayBuffer]',
      dataViewTag = '[object DataView]',
      float32Tag = '[object Float32Array]',
      float64Tag = '[object Float64Array]',
      int8Tag = '[object Int8Array]',
      int16Tag = '[object Int16Array]',
      int32Tag = '[object Int32Array]',
      uint8Tag = '[object Uint8Array]',
      uint8ClampedTag = '[object Uint8ClampedArray]',
      uint16Tag = '[object Uint16Array]',
      uint32Tag = '[object Uint32Array]';

  /** Used to match empty string literals in compiled template source. */
  var reEmptyStringLeading = /\b__p \+= '';/g,
      reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
      reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;

  /** Used to match HTML entities and HTML characters. */
  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,
      reUnescapedHtml = /[&<>"']/g,
      reHasEscapedHtml = RegExp(reEscapedHtml.source),
      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);

  /** Used to match template delimiters. */
  var reEscape = /<%-([\s\S]+?)%>/g,
      reEvaluate = /<%([\s\S]+?)%>/g,
      reInterpolate = /<%=([\s\S]+?)%>/g;

  /** Used to match property names within property paths. */
  var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
      reIsPlainProp = /^\w*$/,
      rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;

  /**
   * Used to match `RegExp`
   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
   */
  var reRegExpChar = /[\\^$.*+?()[\]{}|]/g,
      reHasRegExpChar = RegExp(reRegExpChar.source);

  /** Used to match leading whitespace. */
  var reTrimStart = /^\s+/;

  /** Used to match a single whitespace character. */
  var reWhitespace = /\s/;

  /** Used to match wrap detail comments. */
  var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,
      reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
      reSplitDetails = /,? & /;

  /** Used to match words composed of alphanumeric characters. */
  var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;

  /**
   * Used to validate the `validate` option in `_.template` variable.
   *
   * Forbids characters which could potentially change the meaning of the function argument definition:
   * - "()," (modification of function parameters)
   * - "=" (default value)
   * - "[]{}" (destructuring of function parameters)
   * - "/" (beginning of a comment)
   * - whitespace
   */
  var reForbiddenIdentifierChars = /[()=,{}\[\]\/\s]/;

  /** Used to match backslashes in property paths. */
  var reEscapeChar = /\\(\\)?/g;

  /**
   * Used to match
   * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).
   */
  var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;

  /** Used to match `RegExp` flags from their coerced string values. */
  var reFlags = /\w*$/;

  /** Used to detect bad signed hexadecimal string values. */
  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;

  /** Used to detect binary string values. */
  var reIsBinary = /^0b[01]+$/i;

  /** Used to detect host constructors (Safari). */
  var reIsHostCtor = /^\[object .+?Constructor\]$/;

  /** Used to detect octal string values. */
  var reIsOctal = /^0o[0-7]+$/i;

  /** Used to detect unsigned integer values. */
  var reIsUint = /^(?:0|[1-9]\d*)$/;

  /** Used to match Latin Unicode letters (excluding mathematical operators). */
  var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;

  /** Used to ensure capturing order of template delimiters. */
  var reNoMatch = /($^)/;

  /** Used to match unescaped characters in compiled string literals. */
  var reUnescapedString = /['\n\r\u2028\u2029\\]/g;

  /** Used to compose unicode character classes. */
  var rsAstralRange = '\\ud800-\\udfff',
      rsComboMarksRange = '\\u0300-\\u036f',
      reComboHalfMarksRange = '\\ufe20-\\ufe2f',
      rsComboSymbolsRange = '\\u20d0-\\u20ff',
      rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,
      rsDingbatRange = '\\u2700-\\u27bf',
      rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff',
      rsMathOpRange = '\\xac\\xb1\\xd7\\xf7',
      rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf',
      rsPunctuationRange = '\\u2000-\\u206f',
      rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000',
      rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde',
      rsVarRange = '\\ufe0e\\ufe0f',
      rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;

  /** Used to compose unicode capture groups. */
  var rsApos = "['\u2019]",
      rsAstral = '[' + rsAstralRange + ']',
      rsBreak = '[' + rsBreakRange + ']',
      rsCombo = '[' + rsComboRange + ']',
      rsDigits = '\\d+',
      rsDingbat = '[' + rsDingbatRange + ']',
      rsLower = '[' + rsLowerRange + ']',
      rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',
      rsFitz = '\\ud83c[\\udffb-\\udfff]',
      rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',
      rsNonAstral = '[^' + rsAstralRange + ']',
      rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}',
      rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]',
      rsUpper = '[' + rsUpperRange + ']',
      rsZWJ = '\\u200d';

  /** Used to compose unicode regexes. */
  var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',
      rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',
      rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',
      rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',
      reOptMod = rsModifier + '?',
      rsOptVar = '[' + rsVarRange + ']?',
      rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',
      rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])',
      rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])',
      rsSeq = rsOptVar + reOptMod + rsOptJoin,
      rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,
      rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';

  /** Used to match apostrophes. */
  var reApos = RegExp(rsApos, 'g');

  /**
   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and
   * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).
   */
  var reComboMark = RegExp(rsCombo, 'g');

  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
  var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');

  /** Used to match complex or compound words. */
  var reUnicodeWord = RegExp([
    rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',
    rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',
    rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,
    rsUpper + '+' + rsOptContrUpper,
    rsOrdUpper,
    rsOrdLower,
    rsDigits,
    rsEmoji
  ].join('|'), 'g');

  /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */
  var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');

  /** Used to detect strings that need a more robust regexp to match words. */
  var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;

  /** Used to assign default `context` object properties. */
  var contextProps = [
    'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',
    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',
    'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',
    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',
    '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'
  ];

  /** Used to make template sourceURLs easier to identify. */
  var templateCounter = -1;

  /** Used to identify `toStringTag` values of typed arrays. */
  var typedArrayTags = {};
  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
  typedArrayTags[uint32Tag] = true;
  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
  typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
  typedArrayTags[errorTag] = typedArrayTags[funcTag] =
  typedArrayTags[mapTag] = typedArrayTags[numberTag] =
  typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
  typedArrayTags[setTag] = typedArrayTags[stringTag] =
  typedArrayTags[weakMapTag] = false;

  /** Used to identify `toStringTag` values supported by `_.clone`. */
  var cloneableTags = {};
  cloneableTags[argsTag] = cloneableTags[arrayTag] =
  cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =
  cloneableTags[boolTag] = cloneableTags[dateTag] =
  cloneableTags[float32Tag] = cloneableTags[float64Tag] =
  cloneableTags[int8Tag] = cloneableTags[int16Tag] =
  cloneableTags[int32Tag] = cloneableTags[mapTag] =
  cloneableTags[numberTag] = cloneableTags[objectTag] =
  cloneableTags[regexpTag] = cloneableTags[setTag] =
  cloneableTags[stringTag] = cloneableTags[symbolTag] =
  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
  cloneableTags[errorTag] = cloneableTags[funcTag] =
  cloneableTags[weakMapTag] = false;

  /** Used to map Latin Unicode letters to basic Latin letters. */
  var deburredLetters = {
    // Latin-1 Supplement block.
    '\xc0': 'A',  '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A',
    '\xe0': 'a',  '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a',
    '\xc7': 'C',  '\xe7': 'c',
    '\xd0': 'D',  '\xf0': 'd',
    '\xc8': 'E',  '\xc9': 'E', '\xca': 'E', '\xcb': 'E',
    '\xe8': 'e',  '\xe9': 'e', '\xea': 'e', '\xeb': 'e',
    '\xcc': 'I',  '\xcd': 'I', '\xce': 'I', '\xcf': 'I',
    '\xec': 'i',  '\xed': 'i', '\xee': 'i', '\xef': 'i',
    '\xd1': 'N',  '\xf1': 'n',
    '\xd2': 'O',  '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O',
    '\xf2': 'o',  '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o',
    '\xd9': 'U',  '\xda': 'U', '\xdb': 'U', '\xdc': 'U',
    '\xf9': 'u',  '\xfa': 'u', '\xfb': 'u', '\xfc': 'u',
    '\xdd': 'Y',  '\xfd': 'y', '\xff': 'y',
    '\xc6': 'Ae', '\xe6': 'ae',
    '\xde': 'Th', '\xfe': 'th',
    '\xdf': 'ss',
    // Latin Extended-A block.
    '\u0100': 'A',  '\u0102': 'A', '\u0104': 'A',
    '\u0101': 'a',  '\u0103': 'a', '\u0105': 'a',
    '\u0106': 'C',  '\u0108': 'C', '\u010a': 'C', '\u010c': 'C',
    '\u0107': 'c',  '\u0109': 'c', '\u010b': 'c', '\u010d': 'c',
    '\u010e': 'D',  '\u0110': 'D', '\u010f': 'd', '\u0111': 'd',
    '\u0112': 'E',  '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E',
    '\u0113': 'e',  '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e',
    '\u011c': 'G',  '\u011e': 'G', '\u0120': 'G', '\u0122': 'G',
    '\u011d': 'g',  '\u011f': 'g', '\u0121': 'g', '\u0123': 'g',
    '\u0124': 'H',  '\u0126': 'H', '\u0125': 'h', '\u0127': 'h',
    '\u0128': 'I',  '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I',
    '\u0129': 'i',  '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i',
    '\u0134': 'J',  '\u0135': 'j',
    '\u0136': 'K',  '\u0137': 'k', '\u0138': 'k',
    '\u0139': 'L',  '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L',
    '\u013a': 'l',  '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l',
    '\u0143': 'N',  '\u0145': 'N', '\u0147': 'N', '\u014a': 'N',
    '\u0144': 'n',  '\u0146': 'n', '\u0148': 'n', '\u014b': 'n',
    '\u014c': 'O',  '\u014e': 'O', '\u0150': 'O',
    '\u014d': 'o',  '\u014f': 'o', '\u0151': 'o',
    '\u0154': 'R',  '\u0156': 'R', '\u0158': 'R',
    '\u0155': 'r',  '\u0157': 'r', '\u0159': 'r',
    '\u015a': 'S',  '\u015c': 'S', '\u015e': 'S', '\u0160': 'S',
    '\u015b': 's',  '\u015d': 's', '\u015f': 's', '\u0161': 's',
    '\u0162': 'T',  '\u0164': 'T', '\u0166': 'T',
    '\u0163': 't',  '\u0165': 't', '\u0167': 't',
    '\u0168': 'U',  '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U',
    '\u0169': 'u',  '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u',
    '\u0174': 'W',  '\u0175': 'w',
    '\u0176': 'Y',  '\u0177': 'y', '\u0178': 'Y',
    '\u0179': 'Z',  '\u017b': 'Z', '\u017d': 'Z',
    '\u017a': 'z',  '\u017c': 'z', '\u017e': 'z',
    '\u0132': 'IJ', '\u0133': 'ij',
    '\u0152': 'Oe', '\u0153': 'oe',
    '\u0149': "'n", '\u017f': 's'
  };

  /** Used to map characters to HTML entities. */
  var htmlEscapes = {
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#39;'
  };

  /** Used to map HTML entities to characters. */
  var htmlUnescapes = {
    '&amp;': '&',
    '&lt;': '<',
    '&gt;': '>',
    '&quot;': '"',
    '&#39;': "'"
  };

  /** Used to escape characters for inclusion in compiled string literals. */
  var stringEscapes = {
    '\\': '\\',
    "'": "'",
    '\n': 'n',
    '\r': 'r',
    '\u2028': 'u2028',
    '\u2029': 'u2029'
  };

  /** Built-in method references without a dependency on `root`. */
  var freeParseFloat = parseFloat,
      freeParseInt = parseInt;

  /** Detect free variable `global` from Node.js. */
  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;

  /** Detect free variable `self`. */
  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;

  /** Used as a reference to the global object. */
  var root = freeGlobal || freeSelf || Function('return this')();

  /** Detect free variable `exports`. */
  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;

  /** Detect free variable `module`. */
  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;

  /** Detect the popular CommonJS extension `module.exports`. */
  var moduleExports = freeModule && freeModule.exports === freeExports;

  /** Detect free variable `process` from Node.js. */
  var freeProcess = moduleExports && freeGlobal.process;

  /** Used to access faster Node.js helpers. */
  var nodeUtil = (function() {
    try {
      // Use `util.types` for Node.js 10+.
      var types = freeModule && freeModule.require && freeModule.require('util').types;

      if (types) {
        return types;
      }

      // Legacy `process.binding('util')` for Node.js < 10.
      return freeProcess && freeProcess.binding && freeProcess.binding('util');
    } catch (e) {}
  }());

  /* Node.js helper references. */
  var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,
      nodeIsDate = nodeUtil && nodeUtil.isDate,
      nodeIsMap = nodeUtil && nodeUtil.isMap,
      nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,
      nodeIsSet = nodeUtil && nodeUtil.isSet,
      nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;

  /*--------------------------------------------------------------------------*/

  /**
   * A faster alternative to `Function#apply`, this function invokes `func`
   * with the `this` binding of `thisArg` and the arguments of `args`.
   *
   * @private
   * @param {Function} func The function to invoke.
   * @param {*} thisArg The `this` binding of `func`.
   * @param {Array} args The arguments to invoke `func` with.
   * @returns {*} Returns the result of `func`.
   */
  function apply(func, thisArg, args) {
    switch (args.length) {
      case 0: return func.call(thisArg);
      case 1: return func.call(thisArg, args[0]);
      case 2: return func.call(thisArg, args[0], args[1]);
      case 3: return func.call(thisArg, args[0], args[1], args[2]);
    }
    return func.apply(thisArg, args);
  }

  /**
   * A specialized version of `baseAggregator` for arrays.
   *
   * @private
   * @param {Array} [array] The array to iterate over.
   * @param {Function} setter The function to set `accumulator` values.
   * @param {Function} iteratee The iteratee to transform keys.
   * @param {Object} accumulator The initial aggregated object.
   * @returns {Function} Returns `accumulator`.
   */
  function arrayAggregator(array, setter, iteratee, accumulator) {
    var index = -1,
        length = array == null ? 0 : array.length;

    while (++index < length) {
      var value = array[index];
      setter(accumulator, value, iteratee(value), array);
    }
    return accumulator;
  }

  /**
   * A specialized version of `_.forEach` for arrays without support for
   * iteratee shorthands.
   *
   * @private
   * @param {Array} [array] The array to iterate over.
   * @param {Function} iteratee The function invoked per iteration.
   * @returns {Array} Returns `array`.
   */
  function arrayEach(array, iteratee) {
    var index = -1,
        length = array == null ? 0 : array.length;

    while (++index < length) {
      if (iteratee(array[index], index, array) === false) {
        break;
      }
    }
    return array;
  }

  /**
   * A specialized version of `_.forEachRight` for arrays without support for
   * iteratee shorthands.
   *
   * @private
   * @param {Array} [array] The array to iterate over.
   * @param {Function} iteratee The function invoked per iteration.
   * @returns {Array} Returns `array`.
   */
  function arrayEachRight(array, iteratee) {
    var length = array == null ? 0 : array.length;

    while (length--) {
      if (iteratee(array[length], length, array) === false) {
        break;
      }
    }
    return array;
  }

  /**
   * A specialized version of `_.every` for arrays without support for
   * iteratee shorthands.
   *
   * @private
   * @param {Array} [array] The array to iterate over.
   * @param {Function} predicate The function invoked per iteration.
   * @returns {boolean} Returns `true` if all elements pass the predicate check,
   *  else `false`.
   */
  function arrayEvery(array, predicate) {
    var index = -1,
        length = array == null ? 0 : array.length;

    while (++index < length) {
      if (!predicate(array[index], index, array)) {
        return false;
      }
    }
    return true;
  }

  /**
   * A specialized version of `_.filter` for arrays without support for
   * iteratee shorthands.
   *
   * @private
   * @param {Array} [array] The array to iterate over.
   * @param {Function} predicate The function invoked per iteration.
   * @returns {Array} Returns the new filtered array.
   */
  function arrayFilter(array, predicate) {
    var index = -1,
        length = array == null ? 0 : array.length,
        resIndex = 0,
        result = [];

    while (++index < length) {
      var value = array[index];
      if (predicate(value, index, array)) {
        result[resIndex++] = value;
      }
    }
    return result;
  }

  /**
   * A specialized version of `_.includes` for arrays without support for
   * specifying an index to search from.
   *
   * @private
   * @param {Array} [array] The array to inspect.
   * @param {*} target The value to search for.
   * @returns {boolean} Returns `true` if `target` is found, else `false`.
   */
  function arrayIncludes(array, value) {
    var length = array == null ? 0 : array.length;
    return !!length && baseIndexOf(array, value, 0) > -1;
  }

  /**
   * This function is like `arrayIncludes` except that it accepts a comparator.
   *
   * @private
   * @param {Array} [array] The array to inspect.
   * @param {*} target The value to search for.
   * @param {Function} comparator The comparator invoked per element.
   * @returns {boolean} Returns `true` if `target` is found, else `false`.
   */
  function arrayIncludesWith(array, value, comparator) {
    var index = -1,
        length = array == null ? 0 : array.length;

    while (++index < length) {
      if (comparator(value, array[index])) {
        return true;
      }
    }
    return false;
  }

  /**
   * A specialized version of `_.map` for arrays without support for iteratee
   * shorthands.
   *
   * @private
   * @param {Array} [array] The array to iterate over.
   * @param {Function} iteratee The function invoked per iteration.
   * @returns {Array} Returns the new mapped array.
   */
  function arrayMap(array, iteratee) {
    var index = -1,
        length = array == null ? 0 : array.length,
        result = Array(length);

    while (++index < length) {
      result[index] = iteratee(array[index], index, array);
    }
    return result;
  }

  /**
   * Appends the elements of `values` to `array`.
   *
   * @private
   * @param {Array} array The array to modify.
   * @param {Array} values The values to append.
   * @returns {Array} Returns `array`.
   */
  function arrayPush(array, values) {
    var index = -1,
        length = values.length,
        offset = array.length;

    while (++index < length) {
      array[offset + index] = values[index];
    }
    return array;
  }

  /**
   * A specialized version of `_.reduce` for arrays without support for
   * iteratee shorthands.
   *
   * @private
   * @param {Array} [array] The array to iterate over.
   * @param {Function} iteratee The function invoked per iteration.
   * @param {*} [accumulator] The initial value.
   * @param {boolean} [initAccum] Specify using the first element of `array` as
   *  the initial value.
   * @returns {*} Returns the accumulated value.
   */
  function arrayReduce(array, iteratee, accumulator, initAccum) {
    var index = -1,
        length = array == null ? 0 : array.length;

    if (initAccum && length) {
      accumulator = array[++index];
    }
    while (++index < length) {
      accumulator = iteratee(accumulator, array[index], index, array);
    }
    return accumulator;
  }

  /**
   * A specialized version of `_.reduceRight` for arrays without support for
   * iteratee shorthands.
   *
   * @private
   * @param {Array} [array] The array to iterate over.
   * @param {Function} iteratee The function invoked per iteration.
   * @param {*} [accumulator] The initial value.
   * @param {boolean} [initAccum] Specify using the last element of `array` as
   *  the initial value.
   * @returns {*} Returns the accumulated value.
   */
  function arrayReduceRight(array, iteratee, accumulator, initAccum) {
    var length = array == null ? 0 : array.length;
    if (initAccum && length) {
      accumulator = array[--length];
    }
    while (length--) {
      accumulator = iteratee(accumulator, array[length], length, array);
    }
    return accumulator;
  }

  /**
   * A specialized version of `_.some` for arrays without support for iteratee
   * shorthands.
   *
   * @private
   * @param {Array} [array] The array to iterate over.
   * @param {Function} predicate The function invoked per iteration.
   * @returns {boolean} Returns `true` if any element passes the predicate check,
   *  else `false`.
   */
  function arraySome(array, predicate) {
    var index = -1,
        length = array == null ? 0 : array.length;

    while (++index < length) {
      if (predicate(array[index], index, array)) {
        return true;
      }
    }
    return false;
  }

  /**
   * Gets the size of an ASCII `string`.
   *
   * @private
   * @param {string} string The string inspect.
   * @returns {number} Returns the string size.
   */
  var asciiSize = baseProperty('length');

  /**
   * Converts an ASCII `string` to an array.
   *
   * @private
   * @param {string} string The string to convert.
   * @returns {Array} Returns the converted array.
   */
  function asciiToArray(string) {
    return string.split('');
  }

  /**
   * Splits an ASCII `string` into an array of its words.
   *
   * @private
   * @param {string} The string to inspect.
   * @returns {Array} Returns the words of `string`.
   */
  function asciiWords(string) {
    return string.match(reAsciiWord) || [];
  }

  /**
   * The base implementation of methods like `_.findKey` and `_.findLastKey`,
   * without support for iteratee shorthands, which iterates over `collection`
   * using `eachFunc`.
   *
   * @private
   * @param {Array|Object} collection The collection to inspect.
   * @param {Function} predicate The function invoked per iteration.
   * @param {Function} eachFunc The function to iterate over `collection`.
   * @returns {*} Returns the found element or its key, else `undefined`.
   */
  function baseFindKey(collection, predicate, eachFunc) {
    var result;
    eachFunc(collection, function(value, key, collection) {
      if (predicate(value, key, collection)) {
        result = key;
        return false;
      }
    });
    return result;
  }

  /**
   * The base implementation of `_.findIndex` and `_.findLastIndex` without
   * support for iteratee shorthands.
   *
   * @private
   * @param {Array} array The array to inspect.
   * @param {Function} predicate The function invoked per iteration.
   * @param {number} fromIndex The index to search from.
   * @param {boolean} [fromRight] Specify iterating from right to left.
   * @returns {number} Returns the index of the matched value, else `-1`.
   */
  function baseFindIndex(array, predicate, fromIndex, fromRight) {
    var length = array.length,
        index = fromIndex + (fromRight ? 1 : -1);

    while ((fromRight ? index-- : ++index < length)) {
      if (predicate(array[index], index, array)) {
        return index;
      }
    }
    return -1;
  }

  /**
   * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
   *
   * @private
   * @param {Array} array The array to inspect.
   * @param {*} value The value to search for.
   * @param {number} fromIndex The index to search from.
   * @returns {number} Returns the index of the matched value, else `-1`.
   */
  function baseIndexOf(array, value, fromIndex) {
    return value === value
      ? strictIndexOf(array, value, fromIndex)
      : baseFindIndex(array, baseIsNaN, fromIndex);
  }

  /**
   * This function is like `baseIndexOf` except that it accepts a comparator.
   *
   * @private
   * @param {Array} array The array to inspect.
   * @param {*} value The value to search for.
   * @param {number} fromIndex The index to search from.
   * @param {Function} comparator The comparator invoked per element.
   * @returns {number} Returns the index of the matched value, else `-1`.
   */
  function baseIndexOfWith(array, value, fromIndex, comparator) {
    var index = fromIndex - 1,
        length = array.length;

    while (++index < length) {
      if (comparator(array[index], value)) {
        return index;
      }
    }
    return -1;
  }

  /**
   * The base implementation of `_.isNaN` without support for number objects.
   *
   * @private
   * @param {*} value The value to check.
   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
   */
  function baseIsNaN(value) {
    return value !== value;
  }

  /**
   * The base implementation of `_.mean` and `_.meanBy` without support for
   * iteratee shorthands.
   *
   * @private
   * @param {Array} array The array to iterate over.
   * @param {Function} iteratee The function invoked per iteration.
   * @returns {number} Returns the mean.
   */
  function baseMean(array, iteratee) {
    var length = array == null ? 0 : array.length;
    return length ? (baseSum(array, iteratee) / length) : NAN;
  }

  /**
   * The base implementation of `_.property` without support for deep paths.
   *
   * @private
   * @param {string} key The key of the property to get.
   * @returns {Function} Returns the new accessor function.
   */
  function baseProperty(key) {
    return function(object) {
      return object == null ? undefined : object[key];
    };
  }

  /**
   * The base implementation of `_.propertyOf` without support for deep paths.
   *
   * @private
   * @param {Object} object The object to query.
   * @returns {Function} Returns the new accessor function.
   */
  function basePropertyOf(object) {
    return function(key) {
      return object == null ? undefined : object[key];
    };
  }

  /**
   * The base implementation of `_.reduce` and `_.reduceRight`, without support
   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
   *
   * @private
   * @param {Array|Object} collection The collection to iterate over.
   * @param {Function} iteratee The function invoked per iteration.
   * @param {*} accumulator The initial value.
   * @param {boolean} initAccum Specify using the first or last element of
   *  `collection` as the initial value.
   * @param {Function} eachFunc The function to iterate over `collection`.
   * @returns {*} Returns the accumulated value.
   */
  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
    eachFunc(collection, function(value, index, collection) {
      accumulator = initAccum
        ? (initAccum = false, value)
        : iteratee(accumulator, value, index, collection);
    });
    return accumulator;
  }

  /**
   * The base implementation of `_.sortBy` which uses `comparer` to define the
   * sort order of `array` and replaces criteria objects with their corresponding
   * values.
   *
   * @private
   * @param {Array} array The array to sort.
   * @param {Function} comparer The function to define sort order.
   * @returns {Array} Returns `array`.
   */
  function baseSortBy(array, comparer) {
    var length = array.length;

    array.sort(comparer);
    while (length--) {
      array[length] = array[length].value;
    }
    return array;
  }

  /**
   * The base implementation of `_.sum` and `_.sumBy` without support for
   * iteratee shorthands.
   *
   * @private
   * @param {Array} array The array to iterate over.
   * @param {Function} iteratee The function invoked per iteration.
   * @returns {number} Returns the sum.
   */
  function baseSum(array, iteratee) {
    var result,
        index = -1,
        length = array.length;

    while (++index < length) {
      var current = iteratee(array[index]);
      if (current !== undefined) {
        result = result === undefined ? current : (result + current);
      }
    }
    return result;
  }

  /**
   * The base implementation of `_.times` without support for iteratee shorthands
   * or max array length checks.
   *
   * @private
   * @param {number} n The number of times to invoke `iteratee`.
   * @param {Function} iteratee The function invoked per iteration.
   * @returns {Array} Returns the array of results.
   */
  function baseTimes(n, iteratee) {
    var index = -1,
        result = Array(n);

    while (++index < n) {
      result[index] = iteratee(index);
    }
    return result;
  }

  /**
   * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
   * of key-value pairs for `object` corresponding to the property names of `props`.
   *
   * @private
   * @param {Object} object The object to query.
   * @param {Array} props The property names to get values for.
   * @returns {Object} Returns the key-value pairs.
   */
  function baseToPairs(object, props) {
    return arrayMap(props, function(key) {
      return [key, object[key]];
    });
  }

  /**
   * The base implementation of `_.trim`.
   *
   * @private
   * @param {string} string The string to trim.
   * @returns {string} Returns the trimmed string.
   */
  function baseTrim(string) {
    return string
      ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')
      : string;
  }

  /**
   * The base implementation of `_.unary` without support for storing metadata.
   *
   * @private
   * @param {Function} func The function to cap arguments for.
   * @returns {Function} Returns the new capped function.
   */
  function baseUnary(func) {
    return function(value) {
      return func(value);
    };
  }

  /**
   * The base implementation of `_.values` and `_.valuesIn` which creates an
   * array of `object` property values corresponding to the property names
   * of `props`.
   *
   * @private
   * @param {Object} object The object to query.
   * @param {Array} props The property names to get values for.
   * @returns {Object} Returns the array of property values.
   */
  function baseValues(object, props) {
    return arrayMap(props, function(key) {
      return object[key];
    });
  }

  /**
   * Checks if a `cache` value for `key` exists.
   *
   * @private
   * @param {Object} cache The cache to query.
   * @param {string} key The key of the entry to check.
   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
   */
  function cacheHas(cache, key) {
    return cache.has(key);
  }

  /**
   * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol
   * that is not found in the character symbols.
   *
   * @private
   * @param {Array} strSymbols The string symbols to inspect.
   * @param {Array} chrSymbols The character symbols to find.
   * @returns {number} Returns the index of the first unmatched string symbol.
   */
  function charsStartIndex(strSymbols, chrSymbols) {
    var index = -1,
        length = strSymbols.length;

    while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
    return index;
  }

  /**
   * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol
   * that is not found in the character symbols.
   *
   * @private
   * @param {Array} strSymbols The string symbols to inspect.
   * @param {Array} chrSymbols The character symbols to find.
   * @returns {number} Returns the index of the last unmatched string symbol.
   */
  function charsEndIndex(strSymbols, chrSymbols) {
    var index = strSymbols.length;

    while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
    return index;
  }

  /**
   * Gets the number of `placeholder` occurrences in `array`.
   *
   * @private
   * @param {Array} array The array to inspect.
   * @param {*} placeholder The placeholder to search for.
   * @returns {number} Returns the placeholder count.
   */
  function countHolders(array, placeholder) {
    var length = array.length,
        result = 0;

    while (length--) {
      if (array[length] === placeholder) {
        ++result;
      }
    }
    return result;
  }

  /**
   * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A
   * letters to basic Latin letters.
   *
   * @private
   * @param {string} letter The matched letter to deburr.
   * @returns {string} Returns the deburred letter.
   */
  var deburrLetter = basePropertyOf(deburredLetters);

  /**
   * Used by `_.escape` to convert characters to HTML entities.
   *
   * @private
   * @param {string} chr The matched character to escape.
   * @returns {string} Returns the escaped character.
   */
  var escapeHtmlChar = basePropertyOf(htmlEscapes);

  /**
   * Used by `_.template` to escape characters for inclusion in compiled string literals.
   *
   * @private
   * @param {string} chr The matched character to escape.
   * @returns {string} Returns the escaped character.
   */
  function escapeStringChar(chr) {
    return '\\' + stringEscapes[chr];
  }

  /**
   * Gets the value at `key` of `object`.
   *
   * @private
   * @param {Object} [object] The object to query.
   * @param {string} key The key of the property to get.
   * @returns {*} Returns the property value.
   */
  function getValue(object, key) {
    return object == null ? undefined : object[key];
  }

  /**
   * Checks if `string` contains Unicode symbols.
   *
   * @private
   * @param {string} string The string to inspect.
   * @returns {boolean} Returns `true` if a symbol is found, else `false`.
   */
  function hasUnicode(string) {
    return reHasUnicode.test(string);
  }

  /**
   * Checks if `string` contains a word composed of Unicode symbols.
   *
   * @private
   * @param {string} string The string to inspect.
   * @returns {boolean} Returns `true` if a word is found, else `false`.
   */
  function hasUnicodeWord(string) {
    return reHasUnicodeWord.test(string);
  }

  /**
   * Converts `iterator` to an array.
   *
   * @private
   * @param {Object} iterator The iterator to convert.
   * @returns {Array} Returns the converted array.
   */
  function iteratorToArray(iterator) {
    var data,
        result = [];

    while (!(data = iterator.next()).done) {
      result.push(data.value);
    }
    return result;
  }

  /**
   * Converts `map` to its key-value pairs.
   *
   * @private
   * @param {Object} map The map to convert.
   * @returns {Array} Returns the key-value pairs.
   */
  function mapToArray(map) {
    var index = -1,
        result = Array(map.size);

    map.forEach(function(value, key) {
      result[++index] = [key, value];
    });
    return result;
  }

  /**
   * Creates a unary function that invokes `func` with its argument transformed.
   *
   * @private
   * @param {Function} func The function to wrap.
   * @param {Function} transform The argument transform.
   * @returns {Function} Returns the new function.
   */
  function overArg(func, transform) {
    return function(arg) {
      return func(transform(arg));
    };
  }

  /**
   * Replaces all `placeholder` elements in `array` with an internal placeholder
   * and returns an array of their indexes.
   *
   * @private
   * @param {Array} array The array to modify.
   * @param {*} placeholder The placeholder to replace.
   * @returns {Array} Returns the new array of placeholder indexes.
   */
  function replaceHolders(array, placeholder) {
    var index = -1,
        length = array.length,
        resIndex = 0,
        result = [];

    while (++index < length) {
      var value = array[index];
      if (value === placeholder || value === PLACEHOLDER) {
        array[index] = PLACEHOLDER;
        result[resIndex++] = index;
      }
    }
    return result;
  }

  /**
   * Converts `set` to an array of its values.
   *
   * @private
   * @param {Object} set The set to convert.
   * @returns {Array} Returns the values.
   */
  function setToArray(set) {
    var index = -1,
        result = Array(set.size);

    set.forEach(function(value) {
      result[++index] = value;
    });
    return result;
  }

  /**
   * Converts `set` to its value-value pairs.
   *
   * @private
   * @param {Object} set The set to convert.
   * @returns {Array} Returns the value-value pairs.
   */
  function setToPairs(set) {
    var index = -1,
        result = Array(set.size);

    set.forEach(function(value) {
      result[++index] = [value, value];
    });
    return result;
  }

  /**
   * A specialized version of `_.indexOf` which performs strict equality
   * comparisons of values, i.e. `===`.
   *
   * @private
   * @param {Array} array The array to inspect.
   * @param {*} value The value to search for.
   * @param {number} fromIndex The index to search from.
   * @returns {number} Returns the index of the matched value, else `-1`.
   */
  function strictIndexOf(array, value, fromIndex) {
    var index = fromIndex - 1,
        length = array.length;

    while (++index < length) {
      if (array[index] === value) {
        return index;
      }
    }
    return -1;
  }

  /**
   * A specialized version of `_.lastIndexOf` which performs strict equality
   * comparisons of values, i.e. `===`.
   *
   * @private
   * @param {Array} array The array to inspect.
   * @param {*} value The value to search for.
   * @param {number} fromIndex The index to search from.
   * @returns {number} Returns the index of the matched value, else `-1`.
   */
  function strictLastIndexOf(array, value, fromIndex) {
    var index = fromIndex + 1;
    while (index--) {
      if (array[index] === value) {
        return index;
      }
    }
    return index;
  }

  /**
   * Gets the number of symbols in `string`.
   *
   * @private
   * @param {string} string The string to inspect.
   * @returns {number} Returns the string size.
   */
  function stringSize(string) {
    return hasUnicode(string)
      ? unicodeSize(string)
      : asciiSize(string);
  }

  /**
   * Converts `string` to an array.
   *
   * @private
   * @param {string} string The string to convert.
   * @returns {Array} Returns the converted array.
   */
  function stringToArray(string) {
    return hasUnicode(string)
      ? unicodeToArray(string)
      : asciiToArray(string);
  }

  /**
   * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace
   * character of `string`.
   *
   * @private
   * @param {string} string The string to inspect.
   * @returns {number} Returns the index of the last non-whitespace character.
   */
  function trimmedEndIndex(string) {
    var index = string.length;

    while (index-- && reWhitespace.test(string.charAt(index))) {}
    return index;
  }

  /**
   * Used by `_.unescape` to convert HTML entities to characters.
   *
   * @private
   * @param {string} chr The matched character to unescape.
   * @returns {string} Returns the unescaped character.
   */
  var unescapeHtmlChar = basePropertyOf(htmlUnescapes);

  /**
   * Gets the size of a Unicode `string`.
   *
   * @private
   * @param {string} string The string inspect.
   * @returns {number} Returns the string size.
   */
  function unicodeSize(string) {
    var result = reUnicode.lastIndex = 0;
    while (reUnicode.test(string)) {
      ++result;
    }
    return result;
  }

  /**
   * Converts a Unicode `string` to an array.
   *
   * @private
   * @param {string} string The string to convert.
   * @returns {Array} Returns the converted array.
   */
  function unicodeToArray(string) {
    return string.match(reUnicode) || [];
  }

  /**
   * Splits a Unicode `string` into an array of its words.
   *
   * @private
   * @param {string} The string to inspect.
   * @returns {Array} Returns the words of `string`.
   */
  function unicodeWords(string) {
    return string.match(reUnicodeWord) || [];
  }

  /*--------------------------------------------------------------------------*/

  /**
   * Create a new pristine `lodash` function using the `context` object.
   *
   * @static
   * @memberOf _
   * @since 1.1.0
   * @category Util
   * @param {Object} [context=root] The context object.
   * @returns {Function} Returns a new `lodash` function.
   * @example
   *
   * _.mixin({ 'foo': _.constant('foo') });
   *
   * var lodash = _.runInContext();
   * lodash.mixin({ 'bar': lodash.constant('bar') });
   *
   * _.isFunction(_.foo);
   * // => true
   * _.isFunction(_.bar);
   * // => false
   *
   * lodash.isFunction(lodash.foo);
   * // => false
   * lodash.isFunction(lodash.bar);
   * // => true
   *
   * // Create a suped-up `defer` in Node.js.
   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;
   */
  var runInContext = (function runInContext(context) {
    context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));

    /** Built-in constructor references. */
    var Array = context.Array,
        Date = context.Date,
        Error = context.Error,
        Function = context.Function,
        Math = context.Math,
        Object = context.Object,
        RegExp = context.RegExp,
        String = context.String,
        TypeError = context.TypeError;

    /** Used for built-in method references. */
    var arrayProto = Array.prototype,
        funcProto = Function.prototype,
        objectProto = Object.prototype;

    /** Used to detect overreaching core-js shims. */
    var coreJsData = context['__core-js_shared__'];

    /** Used to resolve the decompiled source of functions. */
    var funcToString = funcProto.toString;

    /** Used to check objects for own properties. */
    var hasOwnProperty = objectProto.hasOwnProperty;

    /** Used to generate unique IDs. */
    var idCounter = 0;

    /** Used to detect methods masquerading as native. */
    var maskSrcKey = (function() {
      var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
      return uid ? ('Symbol(src)_1.' + uid) : '';
    }());

    /**
     * Used to resolve the
     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
     * of values.
     */
    var nativeObjectToString = objectProto.toString;

    /** Used to infer the `Object` constructor. */
    var objectCtorString = funcToString.call(Object);

    /** Used to restore the original `_` reference in `_.noConflict`. */
    var oldDash = root._;

    /** Used to detect if a method is native. */
    var reIsNative = RegExp('^' +
      funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
      .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
    );

    /** Built-in value references. */
    var Buffer = moduleExports ? context.Buffer : undefined,
        Symbol = context.Symbol,
        Uint8Array = context.Uint8Array,
        allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,
        getPrototype = overArg(Object.getPrototypeOf, Object),
        objectCreate = Object.create,
        propertyIsEnumerable = objectProto.propertyIsEnumerable,
        splice = arrayProto.splice,
        spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,
        symIterator = Symbol ? Symbol.iterator : undefined,
        symToStringTag = Symbol ? Symbol.toStringTag : undefined;

    var defineProperty = (function() {
      try {
        var func = getNative(Object, 'defineProperty');
        func({}, '', {});
        return func;
      } catch (e) {}
    }());

    /** Mocked built-ins. */
    var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,
        ctxNow = Date && Date.now !== root.Date.now && Date.now,
        ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;

    /* Built-in method references for those with the same name as other `lodash` methods. */
    var nativeCeil = Math.ceil,
        nativeFloor = Math.floor,
        nativeGetSymbols = Object.getOwnPropertySymbols,
        nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,
        nativeIsFinite = context.isFinite,
        nativeJoin = arrayProto.join,
        nativeKeys = overArg(Object.keys, Object),
        nativeMax = Math.max,
        nativeMin = Math.min,
        nativeNow = Date.now,
        nativeParseInt = context.parseInt,
        nativeRandom = Math.random,
        nativeReverse = arrayProto.reverse;

    /* Built-in method references that are verified to be native. */
    var DataView = getNative(context, 'DataView'),
        Map = getNative(context, 'Map'),
        Promise = getNative(context, 'Promise'),
        Set = getNative(context, 'Set'),
        WeakMap = getNative(context, 'WeakMap'),
        nativeCreate = getNative(Object, 'create');

    /** Used to store function metadata. */
    var metaMap = WeakMap && new WeakMap;

    /** Used to lookup unminified function names. */
    var realNames = {};

    /** Used to detect maps, sets, and weakmaps. */
    var dataViewCtorString = toSource(DataView),
        mapCtorString = toSource(Map),
        promiseCtorString = toSource(Promise),
        setCtorString = toSource(Set),
        weakMapCtorString = toSource(WeakMap);

    /** Used to convert symbols to primitives and strings. */
    var symbolProto = Symbol ? Symbol.prototype : undefined,
        symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,
        symbolToString = symbolProto ? symbolProto.toString : undefined;

    /*------------------------------------------------------------------------*/

    /**
     * Creates a `lodash` object which wraps `value` to enable implicit method
     * chain sequences. Methods that operate on and return arrays, collections,
     * and functions can be chained together. Methods that retrieve a single value
     * or may return a primitive value will automatically end the chain sequence
     * and return the unwrapped value. Otherwise, the value must be unwrapped
     * with `_#value`.
     *
     * Explicit chain sequences, which must be unwrapped with `_#value`, may be
     * enabled using `_.chain`.
     *
     * The execution of chained methods is lazy, that is, it's deferred until
     * `_#value` is implicitly or explicitly called.
     *
     * Lazy evaluation allows several methods to support shortcut fusion.
     * Shortcut fusion is an optimization to merge iteratee calls; this avoids
     * the creation of intermediate arrays and can greatly reduce the number of
     * iteratee executions. Sections of a chain sequence qualify for shortcut
     * fusion if the section is applied to an array and iteratees accept only
     * one argument. The heuristic for whether a section qualifies for shortcut
     * fusion is subject to change.
     *
     * Chaining is supported in custom builds as long as the `_#value` method is
     * directly or indirectly included in the build.
     *
     * In addition to lodash methods, wrappers have `Array` and `String` methods.
     *
     * The wrapper `Array` methods are:
     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
     *
     * The wrapper `String` methods are:
     * `replace` and `split`
     *
     * The wrapper methods that support shortcut fusion are:
     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
     *
     * The chainable wrapper methods are:
     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
     * `zipObject`, `zipObjectDeep`, and `zipWith`
     *
     * The wrapper methods that are **not** chainable by default are:
     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
     * `upperFirst`, `value`, and `words`
     *
     * @name _
     * @constructor
     * @category Seq
     * @param {*} value The value to wrap in a `lodash` instance.
     * @returns {Object} Returns the new `lodash` wrapper instance.
     * @example
     *
     * function square(n) {
     *   return n * n;
     * }
     *
     * var wrapped = _([1, 2, 3]);
     *
     * // Returns an unwrapped value.
     * wrapped.reduce(_.add);
     * // => 6
     *
     * // Returns a wrapped value.
     * var squares = wrapped.map(square);
     *
     * _.isArray(squares);
     * // => false
     *
     * _.isArray(squares.value());
     * // => true
     */
    function lodash(value) {
      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
        if (value instanceof LodashWrapper) {
          return value;
        }
        if (hasOwnProperty.call(value, '__wrapped__')) {
          return wrapperClone(value);
        }
      }
      return new LodashWrapper(value);
    }

    /**
     * The base implementation of `_.create` without support for assigning
     * properties to the created object.
     *
     * @private
     * @param {Object} proto The object to inherit from.
     * @returns {Object} Returns the new object.
     */
    var baseCreate = (function() {
      function object() {}
      return function(proto) {
        if (!isObject(proto)) {
          return {};
        }
        if (objectCreate) {
          return objectCreate(proto);
        }
        object.prototype = proto;
        var result = new object;
        object.prototype = undefined;
        return result;
      };
    }());

    /**
     * The function whose prototype chain sequence wrappers inherit from.
     *
     * @private
     */
    function baseLodash() {
      // No operation performed.
    }

    /**
     * The base constructor for creating `lodash` wrapper objects.
     *
     * @private
     * @param {*} value The value to wrap.
     * @param {boolean} [chainAll] Enable explicit method chain sequences.
     */
    function LodashWrapper(value, chainAll) {
      this.__wrapped__ = value;
      this.__actions__ = [];
      this.__chain__ = !!chainAll;
      this.__index__ = 0;
      this.__values__ = undefined;
    }

    /**
     * By default, the template delimiters used by lodash are like those in
     * embedded Ruby (ERB) as well as ES2015 template strings. Change the
     * following template settings to use alternative delimiters.
     *
     * @static
     * @memberOf _
     * @type {Object}
     */
    lodash.templateSettings = {

      /**
       * Used to detect `data` property values to be HTML-escaped.
       *
       * @memberOf _.templateSettings
       * @type {RegExp}
       */
      'escape': reEscape,

      /**
       * Used to detect code to be evaluated.
       *
       * @memberOf _.templateSettings
       * @type {RegExp}
       */
      'evaluate': reEvaluate,

      /**
       * Used to detect `data` property values to inject.
       *
       * @memberOf _.templateSettings
       * @type {RegExp}
       */
      'interpolate': reInterpolate,

      /**
       * Used to reference the data object in the template text.
       *
       * @memberOf _.templateSettings
       * @type {string}
       */
      'variable': '',

      /**
       * Used to import variables into the compiled template.
       *
       * @memberOf _.templateSettings
       * @type {Object}
       */
      'imports': {

        /**
         * A reference to the `lodash` function.
         *
         * @memberOf _.templateSettings.imports
         * @type {Function}
         */
        '_': lodash
      }
    };

    // Ensure wrappers are instances of `baseLodash`.
    lodash.prototype = baseLodash.prototype;
    lodash.prototype.constructor = lodash;

    LodashWrapper.prototype = baseCreate(baseLodash.prototype);
    LodashWrapper.prototype.constructor = LodashWrapper;

    /*------------------------------------------------------------------------*/

    /**
     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
     *
     * @private
     * @constructor
     * @param {*} value The value to wrap.
     */
    function LazyWrapper(value) {
      this.__wrapped__ = value;
      this.__actions__ = [];
      this.__dir__ = 1;
      this.__filtered__ = false;
      this.__iteratees__ = [];
      this.__takeCount__ = MAX_ARRAY_LENGTH;
      this.__views__ = [];
    }

    /**
     * Creates a clone of the lazy wrapper object.
     *
     * @private
     * @name clone
     * @memberOf LazyWrapper
     * @returns {Object} Returns the cloned `LazyWrapper` object.
     */
    function lazyClone() {
      var result = new LazyWrapper(this.__wrapped__);
      result.__actions__ = copyArray(this.__actions__);
      result.__dir__ = this.__dir__;
      result.__filtered__ = this.__filtered__;
      result.__iteratees__ = copyArray(this.__iteratees__);
      result.__takeCount__ = this.__takeCount__;
      result.__views__ = copyArray(this.__views__);
      return result;
    }

    /**
     * Reverses the direction of lazy iteration.
     *
     * @private
     * @name reverse
     * @memberOf LazyWrapper
     * @returns {Object} Returns the new reversed `LazyWrapper` object.
     */
    function lazyReverse() {
      if (this.__filtered__) {
        var result = new LazyWrapper(this);
        result.__dir__ = -1;
        result.__filtered__ = true;
      } else {
        result = this.clone();
        result.__dir__ *= -1;
      }
      return result;
    }

    /**
     * Extracts the unwrapped value from its lazy wrapper.
     *
     * @private
     * @name value
     * @memberOf LazyWrapper
     * @returns {*} Returns the unwrapped value.
     */
    function lazyValue() {
      var array = this.__wrapped__.value(),
          dir = this.__dir__,
          isArr = isArray(array),
          isRight = dir < 0,
          arrLength = isArr ? array.length : 0,
          view = getView(0, arrLength, this.__views__),
          start = view.start,
          end = view.end,
          length = end - start,
          index = isRight ? end : (start - 1),
          iteratees = this.__iteratees__,
          iterLength = iteratees.length,
          resIndex = 0,
          takeCount = nativeMin(length, this.__takeCount__);

      if (!isArr || (!isRight && arrLength == length && takeCount == length)) {
        return baseWrapperValue(array, this.__actions__);
      }
      var result = [];

      outer:
      while (length-- && resIndex < takeCount) {
        index += dir;

        var iterIndex = -1,
            value = array[index];

        while (++iterIndex < iterLength) {
          var data = iteratees[iterIndex],
              iteratee = data.iteratee,
              type = data.type,
              computed = iteratee(value);

          if (type == LAZY_MAP_FLAG) {
            value = computed;
          } else if (!computed) {
            if (type == LAZY_FILTER_FLAG) {
              continue outer;
            } else {
              break outer;
            }
          }
        }
        result[resIndex++] = value;
      }
      return result;
    }

    // Ensure `LazyWrapper` is an instance of `baseLodash`.
    LazyWrapper.prototype = baseCreate(baseLodash.prototype);
    LazyWrapper.prototype.constructor = LazyWrapper;

    /*------------------------------------------------------------------------*/

    /**
     * Creates a hash object.
     *
     * @private
     * @constructor
     * @param {Array} [entries] The key-value pairs to cache.
     */
    function Hash(entries) {
      var index = -1,
          length = entries == null ? 0 : entries.length;

      this.clear();
      while (++index < length) {
        var entry = entries[index];
        this.set(entry[0], entry[1]);
      }
    }

    /**
     * Removes all key-value entries from the hash.
     *
     * @private
     * @name clear
     * @memberOf Hash
     */
    function hashClear() {
      this.__data__ = nativeCreate ? nativeCreate(null) : {};
      this.size = 0;
    }

    /**
     * Removes `key` and its value from the hash.
     *
     * @private
     * @name delete
     * @memberOf Hash
     * @param {Object} hash The hash to modify.
     * @param {string} key The key of the value to remove.
     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
     */
    function hashDelete(key) {
      var result = this.has(key) && delete this.__data__[key];
      this.size -= result ? 1 : 0;
      return result;
    }

    /**
     * Gets the hash value for `key`.
     *
     * @private
     * @name get
     * @memberOf Hash
     * @param {string} key The key of the value to get.
     * @returns {*} Returns the entry value.
     */
    function hashGet(key) {
      var data = this.__data__;
      if (nativeCreate) {
        var result = data[key];
        return result === HASH_UNDEFINED ? undefined : result;
      }
      return hasOwnProperty.call(data, key) ? data[key] : undefined;
    }

    /**
     * Checks if a hash value for `key` exists.
     *
     * @private
     * @name has
     * @memberOf Hash
     * @param {string} key The key of the entry to check.
     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
     */
    function hashHas(key) {
      var data = this.__data__;
      return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);
    }

    /**
     * Sets the hash `key` to `value`.
     *
     * @private
     * @name set
     * @memberOf Hash
     * @param {string} key The key of the value to set.
     * @param {*} value The value to set.
     * @returns {Object} Returns the hash instance.
     */
    function hashSet(key, value) {
      var data = this.__data__;
      this.size += this.has(key) ? 0 : 1;
      data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
      return this;
    }

    // Add methods to `Hash`.
    Hash.prototype.clear = hashClear;
    Hash.prototype['delete'] = hashDelete;
    Hash.prototype.get = hashGet;
    Hash.prototype.has = hashHas;
    Hash.prototype.set = hashSet;

    /*------------------------------------------------------------------------*/

    /**
     * Creates an list cache object.
     *
     * @private
     * @constructor
     * @param {Array} [entries] The key-value pairs to cache.
     */
    function ListCache(entries) {
      var index = -1,
          length = entries == null ? 0 : entries.length;

      this.clear();
      while (++index < length) {
        var entry = entries[index];
        this.set(entry[0], entry[1]);
      }
    }

    /**
     * Removes all key-value entries from the list cache.
     *
     * @private
     * @name clear
     * @memberOf ListCache
     */
    function listCacheClear() {
      this.__data__ = [];
      this.size = 0;
    }

    /**
     * Removes `key` and its value from the list cache.
     *
     * @private
     * @name delete
     * @memberOf ListCache
     * @param {string} key The key of the value to remove.
     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
     */
    function listCacheDelete(key) {
      var data = this.__data__,
          index = assocIndexOf(data, key);

      if (index < 0) {
        return false;
      }
      var lastIndex = data.length - 1;
      if (index == lastIndex) {
        data.pop();
      } else {
        splice.call(data, index, 1);
      }
      --this.size;
      return true;
    }

    /**
     * Gets the list cache value for `key`.
     *
     * @private
     * @name get
     * @memberOf ListCache
     * @param {string} key The key of the value to get.
     * @returns {*} Returns the entry value.
     */
    function listCacheGet(key) {
      var data = this.__data__,
          index = assocIndexOf(data, key);

      return index < 0 ? undefined : data[index][1];
    }

    /**
     * Checks if a list cache value for `key` exists.
     *
     * @private
     * @name has
     * @memberOf ListCache
     * @param {string} key The key of the entry to check.
     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
     */
    function listCacheHas(key) {
      return assocIndexOf(this.__data__, key) > -1;
    }

    /**
     * Sets the list cache `key` to `value`.
     *
     * @private
     * @name set
     * @memberOf ListCache
     * @param {string} key The key of the value to set.
     * @param {*} value The value to set.
     * @returns {Object} Returns the list cache instance.
     */
    function listCacheSet(key, value) {
      var data = this.__data__,
          index = assocIndexOf(data, key);

      if (index < 0) {
        ++this.size;
        data.push([key, value]);
      } else {
        data[index][1] = value;
      }
      return this;
    }

    // Add methods to `ListCache`.
    ListCache.prototype.clear = listCacheClear;
    ListCache.prototype['delete'] = listCacheDelete;
    ListCache.prototype.get = listCacheGet;
    ListCache.prototype.has = listCacheHas;
    ListCache.prototype.set = listCacheSet;

    /*------------------------------------------------------------------------*/

    /**
     * Creates a map cache object to store key-value pairs.
     *
     * @private
     * @constructor
     * @param {Array} [entries] The key-value pairs to cache.
     */
    function MapCache(entries) {
      var index = -1,
          length = entries == null ? 0 : entries.length;

      this.clear();
      while (++index < length) {
        var entry = entries[index];
        this.set(entry[0], entry[1]);
      }
    }

    /**
     * Removes all key-value entries from the map.
     *
     * @private
     * @name clear
     * @memberOf MapCache
     */
    function mapCacheClear() {
      this.size = 0;
      this.__data__ = {
        'hash': new Hash,
        'map': new (Map || ListCache),
        'string': new Hash
      };
    }

    /**
     * Removes `key` and its value from the map.
     *
     * @private
     * @name delete
     * @memberOf MapCache
     * @param {string} key The key of the value to remove.
     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
     */
    function mapCacheDelete(key) {
      var result = getMapData(this, key)['delete'](key);
      this.size -= result ? 1 : 0;
      return result;
    }

    /**
     * Gets the map value for `key`.
     *
     * @private
     * @name get
     * @memberOf MapCache
     * @param {string} key The key of the value to get.
     * @returns {*} Returns the entry value.
     */
    function mapCacheGet(key) {
      return getMapData(this, key).get(key);
    }

    /**
     * Checks if a map value for `key` exists.
     *
     * @private
     * @name has
     * @memberOf MapCache
     * @param {string} key The key of the entry to check.
     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
     */
    function mapCacheHas(key) {
      return getMapData(this, key).has(key);
    }

    /**
     * Sets the map `key` to `value`.
     *
     * @private
     * @name set
     * @memberOf MapCache
     * @param {string} key The key of the value to set.
     * @param {*} value The value to set.
     * @returns {Object} Returns the map cache instance.
     */
    function mapCacheSet(key, value) {
      var data = getMapData(this, key),
          size = data.size;

      data.set(key, value);
      this.size += data.size == size ? 0 : 1;
      return this;
    }

    // Add methods to `MapCache`.
    MapCache.prototype.clear = mapCacheClear;
    MapCache.prototype['delete'] = mapCacheDelete;
    MapCache.prototype.get = mapCacheGet;
    MapCache.prototype.has = mapCacheHas;
    MapCache.prototype.set = mapCacheSet;

    /*------------------------------------------------------------------------*/

    /**
     *
     * Creates an array cache object to store unique values.
     *
     * @private
     * @constructor
     * @param {Array} [values] The values to cache.
     */
    function SetCache(values) {
      var index = -1,
          length = values == null ? 0 : values.length;

      this.__data__ = new MapCache;
      while (++index < length) {
        this.add(values[index]);
      }
    }

    /**
     * Adds `value` to the array cache.
     *
     * @private
     * @name add
     * @memberOf SetCache
     * @alias push
     * @param {*} value The value to cache.
     * @returns {Object} Returns the cache instance.
     */
    function setCacheAdd(value) {
      this.__data__.set(value, HASH_UNDEFINED);
      return this;
    }

    /**
     * Checks if `value` is in the array cache.
     *
     * @private
     * @name has
     * @memberOf SetCache
     * @param {*} value The value to search for.
     * @returns {number} Returns `true` if `value` is found, else `false`.
     */
    function setCacheHas(value) {
      return this.__data__.has(value);
    }

    // Add methods to `SetCache`.
    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
    SetCache.prototype.has = setCacheHas;

    /*------------------------------------------------------------------------*/

    /**
     * Creates a stack cache object to store key-value pairs.
     *
     * @private
     * @constructor
     * @param {Array} [entries] The key-value pairs to cache.
     */
    function Stack(entries) {
      var data = this.__data__ = new ListCache(entries);
      this.size = data.size;
    }

    /**
     * Removes all key-value entries from the stack.
     *
     * @private
     * @name clear
     * @memberOf Stack
     */
    function stackClear() {
      this.__data__ = new ListCache;
      this.size = 0;
    }

    /**
     * Removes `key` and its value from the stack.
     *
     * @private
     * @name delete
     * @memberOf Stack
     * @param {string} key The key of the value to remove.
     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
     */
    function stackDelete(key) {
      var data = this.__data__,
          result = data['delete'](key);

      this.size = data.size;
      return result;
    }

    /**
     * Gets the stack value for `key`.
     *
     * @private
     * @name get
     * @memberOf Stack
     * @param {string} key The key of the value to get.
     * @returns {*} Returns the entry value.
     */
    function stackGet(key) {
      return this.__data__.get(key);
    }

    /**
     * Checks if a stack value for `key` exists.
     *
     * @private
     * @name has
     * @memberOf Stack
     * @param {string} key The key of the entry to check.
     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
     */
    function stackHas(key) {
      return this.__data__.has(key);
    }

    /**
     * Sets the stack `key` to `value`.
     *
     * @private
     * @name set
     * @memberOf Stack
     * @param {string} key The key of the value to set.
     * @param {*} value The value to set.
     * @returns {Object} Returns the stack cache instance.
     */
    function stackSet(key, value) {
      var data = this.__data__;
      if (data instanceof ListCache) {
        var pairs = data.__data__;
        if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
          pairs.push([key, value]);
          this.size = ++data.size;
          return this;
        }
        data = this.__data__ = new MapCache(pairs);
      }
      data.set(key, value);
      this.size = data.size;
      return this;
    }

    // Add methods to `Stack`.
    Stack.prototype.clear = stackClear;
    Stack.prototype['delete'] = stackDelete;
    Stack.prototype.get = stackGet;
    Stack.prototype.has = stackHas;
    Stack.prototype.set = stackSet;

    /*------------------------------------------------------------------------*/

    /**
     * Creates an array of the enumerable property names of the array-like `value`.
     *
     * @private
     * @param {*} value The value to query.
     * @param {boolean} inherited Specify returning inherited property names.
     * @returns {Array} Returns the array of property names.
     */
    function arrayLikeKeys(value, inherited) {
      var isArr = isArray(value),
          isArg = !isArr && isArguments(value),
          isBuff = !isArr && !isArg && isBuffer(value),
          isType = !isArr && !isArg && !isBuff && isTypedArray(value),
          skipIndexes = isArr || isArg || isBuff || isType,
          result = skipIndexes ? baseTimes(value.length, String) : [],
          length = result.length;

      for (var key in value) {
        if ((inherited || hasOwnProperty.call(value, key)) &&
            !(skipIndexes && (
               // Safari 9 has enumerable `arguments.length` in strict mode.
               key == 'length' ||
               // Node.js 0.10 has enumerable non-index properties on buffers.
               (isBuff && (key == 'offset' || key == 'parent')) ||
               // PhantomJS 2 has enumerable non-index properties on typed arrays.
               (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
               // Skip index properties.
               isIndex(key, length)
            ))) {
          result.push(key);
        }
      }
      return result;
    }

    /**
     * A specialized version of `_.sample` for arrays.
     *
     * @private
     * @param {Array} array The array to sample.
     * @returns {*} Returns the random element.
     */
    function arraySample(array) {
      var length = array.length;
      return length ? array[baseRandom(0, length - 1)] : undefined;
    }

    /**
     * A specialized version of `_.sampleSize` for arrays.
     *
     * @private
     * @param {Array} array The array to sample.
     * @param {number} n The number of elements to sample.
     * @returns {Array} Returns the random elements.
     */
    function arraySampleSize(array, n) {
      return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));
    }

    /**
     * A specialized version of `_.shuffle` for arrays.
     *
     * @private
     * @param {Array} array The array to shuffle.
     * @returns {Array} Returns the new shuffled array.
     */
    function arrayShuffle(array) {
      return shuffleSelf(copyArray(array));
    }

    /**
     * This function is like `assignValue` except that it doesn't assign
     * `undefined` values.
     *
     * @private
     * @param {Object} object The object to modify.
     * @param {string} key The key of the property to assign.
     * @param {*} value The value to assign.
     */
    function assignMergeValue(object, key, value) {
      if ((value !== undefined && !eq(object[key], value)) ||
          (value === undefined && !(key in object))) {
        baseAssignValue(object, key, value);
      }
    }

    /**
     * Assigns `value` to `key` of `object` if the existing value is not equivalent
     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
     * for equality comparisons.
     *
     * @private
     * @param {Object} object The object to modify.
     * @param {string} key The key of the property to assign.
     * @param {*} value The value to assign.
     */
    function assignValue(object, key, value) {
      var objValue = object[key];
      if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
          (value === undefined && !(key in object))) {
        baseAssignValue(object, key, value);
      }
    }

    /**
     * Gets the index at which the `key` is found in `array` of key-value pairs.
     *
     * @private
     * @param {Array} array The array to inspect.
     * @param {*} key The key to search for.
     * @returns {number} Returns the index of the matched value, else `-1`.
     */
    function assocIndexOf(array, key) {
      var length = array.length;
      while (length--) {
        if (eq(array[length][0], key)) {
          return length;
        }
      }
      return -1;
    }

    /**
     * Aggregates elements of `collection` on `accumulator` with keys transformed
     * by `iteratee` and values set by `setter`.
     *
     * @private
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} setter The function to set `accumulator` values.
     * @param {Function} iteratee The iteratee to transform keys.
     * @param {Object} accumulator The initial aggregated object.
     * @returns {Function} Returns `accumulator`.
     */
    function baseAggregator(collection, setter, iteratee, accumulator) {
      baseEach(collection, function(value, key, collection) {
        setter(accumulator, value, iteratee(value), collection);
      });
      return accumulator;
    }

    /**
     * The base implementation of `_.assign` without support for multiple sources
     * or `customizer` functions.
     *
     * @private
     * @param {Object} object The destination object.
     * @param {Object} source The source object.
     * @returns {Object} Returns `object`.
     */
    function baseAssign(object, source) {
      return object && copyObject(source, keys(source), object);
    }

    /**
     * The base implementation of `_.assignIn` without support for multiple sources
     * or `customizer` functions.
     *
     * @private
     * @param {Object} object The destination object.
     * @param {Object} source The source object.
     * @returns {Object} Returns `object`.
     */
    function baseAssignIn(object, source) {
      return object && copyObject(source, keysIn(source), object);
    }

    /**
     * The base implementation of `assignValue` and `assignMergeValue` without
     * value checks.
     *
     * @private
     * @param {Object} object The object to modify.
     * @param {string} key The key of the property to assign.
     * @param {*} value The value to assign.
     */
    function baseAssignValue(object, key, value) {
      if (key == '__proto__' && defineProperty) {
        defineProperty(object, key, {
          'configurable': true,
          'enumerable': true,
          'value': value,
          'writable': true
        });
      } else {
        object[key] = value;
      }
    }

    /**
     * The base implementation of `_.at` without support for individual paths.
     *
     * @private
     * @param {Object} object The object to iterate over.
     * @param {string[]} paths The property paths to pick.
     * @returns {Array} Returns the picked elements.
     */
    function baseAt(object, paths) {
      var index = -1,
          length = paths.length,
          result = Array(length),
          skip = object == null;

      while (++index < length) {
        result[index] = skip ? undefined : get(object, paths[index]);
      }
      return result;
    }

    /**
     * The base implementation of `_.clamp` which doesn't coerce arguments.
     *
     * @private
     * @param {number} number The number to clamp.
     * @param {number} [lower] The lower bound.
     * @param {number} upper The upper bound.
     * @returns {number} Returns the clamped number.
     */
    function baseClamp(number, lower, upper) {
      if (number === number) {
        if (upper !== undefined) {
          number = number <= upper ? number : upper;
        }
        if (lower !== undefined) {
          number = number >= lower ? number : lower;
        }
      }
      return number;
    }

    /**
     * The base implementation of `_.clone` and `_.cloneDeep` which tracks
     * traversed objects.
     *
     * @private
     * @param {*} value The value to clone.
     * @param {boolean} bitmask The bitmask flags.
     *  1 - Deep clone
     *  2 - Flatten inherited properties
     *  4 - Clone symbols
     * @param {Function} [customizer] The function to customize cloning.
     * @param {string} [key] The key of `value`.
     * @param {Object} [object] The parent object of `value`.
     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
     * @returns {*} Returns the cloned value.
     */
    function baseClone(value, bitmask, customizer, key, object, stack) {
      var result,
          isDeep = bitmask & CLONE_DEEP_FLAG,
          isFlat = bitmask & CLONE_FLAT_FLAG,
          isFull = bitmask & CLONE_SYMBOLS_FLAG;

      if (customizer) {
        result = object ? customizer(value, key, object, stack) : customizer(value);
      }
      if (result !== undefined) {
        return result;
      }
      if (!isObject(value)) {
        return value;
      }
      var isArr = isArray(value);
      if (isArr) {
        result = initCloneArray(value);
        if (!isDeep) {
          return copyArray(value, result);
        }
      } else {
        var tag = getTag(value),
            isFunc = tag == funcTag || tag == genTag;

        if (isBuffer(value)) {
          return cloneBuffer(value, isDeep);
        }
        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
          result = (isFlat || isFunc) ? {} : initCloneObject(value);
          if (!isDeep) {
            return isFlat
              ? copySymbolsIn(value, baseAssignIn(result, value))
              : copySymbols(value, baseAssign(result, value));
          }
        } else {
          if (!cloneableTags[tag]) {
            return object ? value : {};
          }
          result = initCloneByTag(value, tag, isDeep);
        }
      }
      // Check for circular references and return its corresponding clone.
      stack || (stack = new Stack);
      var stacked = stack.get(value);
      if (stacked) {
        return stacked;
      }
      stack.set(value, result);

      if (isSet(value)) {
        value.forEach(function(subValue) {
          result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
        });
      } else if (isMap(value)) {
        value.forEach(function(subValue, key) {
          result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
        });
      }

      var keysFunc = isFull
        ? (isFlat ? getAllKeysIn : getAllKeys)
        : (isFlat ? keysIn : keys);

      var props = isArr ? undefined : keysFunc(value);
      arrayEach(props || value, function(subValue, key) {
        if (props) {
          key = subValue;
          subValue = value[key];
        }
        // Recursively populate clone (susceptible to call stack limits).
        assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
      });
      return result;
    }

    /**
     * The base implementation of `_.conforms` which doesn't clone `source`.
     *
     * @private
     * @param {Object} source The object of property predicates to conform to.
     * @returns {Function} Returns the new spec function.
     */
    function baseConforms(source) {
      var props = keys(source);
      return function(object) {
        return baseConformsTo(object, source, props);
      };
    }

    /**
     * The base implementation of `_.conformsTo` which accepts `props` to check.
     *
     * @private
     * @param {Object} object The object to inspect.
     * @param {Object} source The object of property predicates to conform to.
     * @returns {boolean} Returns `true` if `object` conforms, else `false`.
     */
    function baseConformsTo(object, source, props) {
      var length = props.length;
      if (object == null) {
        return !length;
      }
      object = Object(object);
      while (length--) {
        var key = props[length],
            predicate = source[key],
            value = object[key];

        if ((value === undefined && !(key in object)) || !predicate(value)) {
          return false;
        }
      }
      return true;
    }

    /**
     * The base implementation of `_.delay` and `_.defer` which accepts `args`
     * to provide to `func`.
     *
     * @private
     * @param {Function} func The function to delay.
     * @param {number} wait The number of milliseconds to delay invocation.
     * @param {Array} args The arguments to provide to `func`.
     * @returns {number|Object} Returns the timer id or timeout object.
     */
    function baseDelay(func, wait, args) {
      if (typeof func != 'function') {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      return setTimeout(function() { func.apply(undefined, args); }, wait);
    }

    /**
     * The base implementation of methods like `_.difference` without support
     * for excluding multiple arrays or iteratee shorthands.
     *
     * @private
     * @param {Array} array The array to inspect.
     * @param {Array} values The values to exclude.
     * @param {Function} [iteratee] The iteratee invoked per element.
     * @param {Function} [comparator] The comparator invoked per element.
     * @returns {Array} Returns the new array of filtered values.
     */
    function baseDifference(array, values, iteratee, comparator) {
      var index = -1,
          includes = arrayIncludes,
          isCommon = true,
          length = array.length,
          result = [],
          valuesLength = values.length;

      if (!length) {
        return result;
      }
      if (iteratee) {
        values = arrayMap(values, baseUnary(iteratee));
      }
      if (comparator) {
        includes = arrayIncludesWith;
        isCommon = false;
      }
      else if (values.length >= LARGE_ARRAY_SIZE) {
        includes = cacheHas;
        isCommon = false;
        values = new SetCache(values);
      }
      outer:
      while (++index < length) {
        var value = array[index],
            computed = iteratee == null ? value : iteratee(value);

        value = (comparator || value !== 0) ? value : 0;
        if (isCommon && computed === computed) {
          var valuesIndex = valuesLength;
          while (valuesIndex--) {
            if (values[valuesIndex] === computed) {
              continue outer;
            }
          }
          result.push(value);
        }
        else if (!includes(values, computed, comparator)) {
          result.push(value);
        }
      }
      return result;
    }

    /**
     * The base implementation of `_.forEach` without support for iteratee shorthands.
     *
     * @private
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} iteratee The function invoked per iteration.
     * @returns {Array|Object} Returns `collection`.
     */
    var baseEach = createBaseEach(baseForOwn);

    /**
     * The base implementation of `_.forEachRight` without support for iteratee shorthands.
     *
     * @private
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} iteratee The function invoked per iteration.
     * @returns {Array|Object} Returns `collection`.
     */
    var baseEachRight = createBaseEach(baseForOwnRight, true);

    /**
     * The base implementation of `_.every` without support for iteratee shorthands.
     *
     * @private
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} predicate The function invoked per iteration.
     * @returns {boolean} Returns `true` if all elements pass the predicate check,
     *  else `false`
     */
    function baseEvery(collection, predicate) {
      var result = true;
      baseEach(collection, function(value, index, collection) {
        result = !!predicate(value, index, collection);
        return result;
      });
      return result;
    }

    /**
     * The base implementation of methods like `_.max` and `_.min` which accepts a
     * `comparator` to determine the extremum value.
     *
     * @private
     * @param {Array} array The array to iterate over.
     * @param {Function} iteratee The iteratee invoked per iteration.
     * @param {Function} comparator The comparator used to compare values.
     * @returns {*} Returns the extremum value.
     */
    function baseExtremum(array, iteratee, comparator) {
      var index = -1,
          length = array.length;

      while (++index < length) {
        var value = array[index],
            current = iteratee(value);

        if (current != null && (computed === undefined
              ? (current === current && !isSymbol(current))
              : comparator(current, computed)
            )) {
          var computed = current,
              result = value;
        }
      }
      return result;
    }

    /**
     * The base implementation of `_.fill` without an iteratee call guard.
     *
     * @private
     * @param {Array} array The array to fill.
     * @param {*} value The value to fill `array` with.
     * @param {number} [start=0] The start position.
     * @param {number} [end=array.length] The end position.
     * @returns {Array} Returns `array`.
     */
    function baseFill(array, value, start, end) {
      var length = array.length;

      start = toInteger(start);
      if (start < 0) {
        start = -start > length ? 0 : (length + start);
      }
      end = (end === undefined || end > length) ? length : toInteger(end);
      if (end < 0) {
        end += length;
      }
      end = start > end ? 0 : toLength(end);
      while (start < end) {
        array[start++] = value;
      }
      return array;
    }

    /**
     * The base implementation of `_.filter` without support for iteratee shorthands.
     *
     * @private
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} predicate The function invoked per iteration.
     * @returns {Array} Returns the new filtered array.
     */
    function baseFilter(collection, predicate) {
      var result = [];
      baseEach(collection, function(value, index, collection) {
        if (predicate(value, index, collection)) {
          result.push(value);
        }
      });
      return result;
    }

    /**
     * The base implementation of `_.flatten` with support for restricting flattening.
     *
     * @private
     * @param {Array} array The array to flatten.
     * @param {number} depth The maximum recursion depth.
     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
     * @param {Array} [result=[]] The initial result value.
     * @returns {Array} Returns the new flattened array.
     */
    function baseFlatten(array, depth, predicate, isStrict, result) {
      var index = -1,
          length = array.length;

      predicate || (predicate = isFlattenable);
      result || (result = []);

      while (++index < length) {
        var value = array[index];
        if (depth > 0 && predicate(value)) {
          if (depth > 1) {
            // Recursively flatten arrays (susceptible to call stack limits).
            baseFlatten(value, depth - 1, predicate, isStrict, result);
          } else {
            arrayPush(result, value);
          }
        } else if (!isStrict) {
          result[result.length] = value;
        }
      }
      return result;
    }

    /**
     * The base implementation of `baseForOwn` which iterates over `object`
     * properties returned by `keysFunc` and invokes `iteratee` for each property.
     * Iteratee functions may exit iteration early by explicitly returning `false`.
     *
     * @private
     * @param {Object} object The object to iterate over.
     * @param {Function} iteratee The function invoked per iteration.
     * @param {Function} keysFunc The function to get the keys of `object`.
     * @returns {Object} Returns `object`.
     */
    var baseFor = createBaseFor();

    /**
     * This function is like `baseFor` except that it iterates over properties
     * in the opposite order.
     *
     * @private
     * @param {Object} object The object to iterate over.
     * @param {Function} iteratee The function invoked per iteration.
     * @param {Function} keysFunc The function to get the keys of `object`.
     * @returns {Object} Returns `object`.
     */
    var baseForRight = createBaseFor(true);

    /**
     * The base implementation of `_.forOwn` without support for iteratee shorthands.
     *
     * @private
     * @param {Object} object The object to iterate over.
     * @param {Function} iteratee The function invoked per iteration.
     * @returns {Object} Returns `object`.
     */
    function baseForOwn(object, iteratee) {
      return object && baseFor(object, iteratee, keys);
    }

    /**
     * The base implementation of `_.forOwnRight` without support for iteratee shorthands.
     *
     * @private
     * @param {Object} object The object to iterate over.
     * @param {Function} iteratee The function invoked per iteration.
     * @returns {Object} Returns `object`.
     */
    function baseForOwnRight(object, iteratee) {
      return object && baseForRight(object, iteratee, keys);
    }

    /**
     * The base implementation of `_.functions` which creates an array of
     * `object` function property names filtered from `props`.
     *
     * @private
     * @param {Object} object The object to inspect.
     * @param {Array} props The property names to filter.
     * @returns {Array} Returns the function names.
     */
    function baseFunctions(object, props) {
      return arrayFilter(props, function(key) {
        return isFunction(object[key]);
      });
    }

    /**
     * The base implementation of `_.get` without support for default values.
     *
     * @private
     * @param {Object} object The object to query.
     * @param {Array|string} path The path of the property to get.
     * @returns {*} Returns the resolved value.
     */
    function baseGet(object, path) {
      path = castPath(path, object);

      var index = 0,
          length = path.length;

      while (object != null && index < length) {
        object = object[toKey(path[index++])];
      }
      return (index && index == length) ? object : undefined;
    }

    /**
     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
     * `keysFunc` and `symbolsFunc` to get the enumerable property names and
     * symbols of `object`.
     *
     * @private
     * @param {Object} object The object to query.
     * @param {Function} keysFunc The function to get the keys of `object`.
     * @param {Function} symbolsFunc The function to get the symbols of `object`.
     * @returns {Array} Returns the array of property names and symbols.
     */
    function baseGetAllKeys(object, keysFunc, symbolsFunc) {
      var result = keysFunc(object);
      return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
    }

    /**
     * The base implementation of `getTag` without fallbacks for buggy environments.
     *
     * @private
     * @param {*} value The value to query.
     * @returns {string} Returns the `toStringTag`.
     */
    function baseGetTag(value) {
      if (value == null) {
        return value === undefined ? undefinedTag : nullTag;
      }
      return (symToStringTag && symToStringTag in Object(value))
        ? getRawTag(value)
        : objectToString(value);
    }

    /**
     * The base implementation of `_.gt` which doesn't coerce arguments.
     *
     * @private
     * @param {*} value The value to compare.
     * @param {*} other The other value to compare.
     * @returns {boolean} Returns `true` if `value` is greater than `other`,
     *  else `false`.
     */
    function baseGt(value, other) {
      return value > other;
    }

    /**
     * The base implementation of `_.has` without support for deep paths.
     *
     * @private
     * @param {Object} [object] The object to query.
     * @param {Array|string} key The key to check.
     * @returns {boolean} Returns `true` if `key` exists, else `false`.
     */
    function baseHas(object, key) {
      return object != null && hasOwnProperty.call(object, key);
    }

    /**
     * The base implementation of `_.hasIn` without support for deep paths.
     *
     * @private
     * @param {Object} [object] The object to query.
     * @param {Array|string} key The key to check.
     * @returns {boolean} Returns `true` if `key` exists, else `false`.
     */
    function baseHasIn(object, key) {
      return object != null && key in Object(object);
    }

    /**
     * The base implementation of `_.inRange` which doesn't coerce arguments.
     *
     * @private
     * @param {number} number The number to check.
     * @param {number} start The start of the range.
     * @param {number} end The end of the range.
     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
     */
    function baseInRange(number, start, end) {
      return number >= nativeMin(start, end) && number < nativeMax(start, end);
    }

    /**
     * The base implementation of methods like `_.intersection`, without support
     * for iteratee shorthands, that accepts an array of arrays to inspect.
     *
     * @private
     * @param {Array} arrays The arrays to inspect.
     * @param {Function} [iteratee] The iteratee invoked per element.
     * @param {Function} [comparator] The comparator invoked per element.
     * @returns {Array} Returns the new array of shared values.
     */
    function baseIntersection(arrays, iteratee, comparator) {
      var includes = comparator ? arrayIncludesWith : arrayIncludes,
          length = arrays[0].length,
          othLength = arrays.length,
          othIndex = othLength,
          caches = Array(othLength),
          maxLength = Infinity,
          result = [];

      while (othIndex--) {
        var array = arrays[othIndex];
        if (othIndex && iteratee) {
          array = arrayMap(array, baseUnary(iteratee));
        }
        maxLength = nativeMin(array.length, maxLength);
        caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
          ? new SetCache(othIndex && array)
          : undefined;
      }
      array = arrays[0];

      var index = -1,
          seen = caches[0];

      outer:
      while (++index < length && result.length < maxLength) {
        var value = array[index],
            computed = iteratee ? iteratee(value) : value;

        value = (comparator || value !== 0) ? value : 0;
        if (!(seen
              ? cacheHas(seen, computed)
              : includes(result, computed, comparator)
            )) {
          othIndex = othLength;
          while (--othIndex) {
            var cache = caches[othIndex];
            if (!(cache
                  ? cacheHas(cache, computed)
                  : includes(arrays[othIndex], computed, comparator))
                ) {
              continue outer;
            }
          }
          if (seen) {
            seen.push(computed);
          }
          result.push(value);
        }
      }
      return result;
    }

    /**
     * The base implementation of `_.invert` and `_.invertBy` which inverts
     * `object` with values transformed by `iteratee` and set by `setter`.
     *
     * @private
     * @param {Object} object The object to iterate over.
     * @param {Function} setter The function to set `accumulator` values.
     * @param {Function} iteratee The iteratee to transform values.
     * @param {Object} accumulator The initial inverted object.
     * @returns {Function} Returns `accumulator`.
     */
    function baseInverter(object, setter, iteratee, accumulator) {
      baseForOwn(object, function(value, key, object) {
        setter(accumulator, iteratee(value), key, object);
      });
      return accumulator;
    }

    /**
     * The base implementation of `_.invoke` without support for individual
     * method arguments.
     *
     * @private
     * @param {Object} object The object to query.
     * @param {Array|string} path The path of the method to invoke.
     * @param {Array} args The arguments to invoke the method with.
     * @returns {*} Returns the result of the invoked method.
     */
    function baseInvoke(object, path, args) {
      path = castPath(path, object);
      object = parent(object, path);
      var func = object == null ? object : object[toKey(last(path))];
      return func == null ? undefined : apply(func, object, args);
    }

    /**
     * The base implementation of `_.isArguments`.
     *
     * @private
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is an `arguments` object,
     */
    function baseIsArguments(value) {
      return isObjectLike(value) && baseGetTag(value) == argsTag;
    }

    /**
     * The base implementation of `_.isArrayBuffer` without Node.js optimizations.
     *
     * @private
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
     */
    function baseIsArrayBuffer(value) {
      return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;
    }

    /**
     * The base implementation of `_.isDate` without Node.js optimizations.
     *
     * @private
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
     */
    function baseIsDate(value) {
      return isObjectLike(value) && baseGetTag(value) == dateTag;
    }

    /**
     * The base implementation of `_.isEqual` which supports partial comparisons
     * and tracks traversed objects.
     *
     * @private
     * @param {*} value The value to compare.
     * @param {*} other The other value to compare.
     * @param {boolean} bitmask The bitmask flags.
     *  1 - Unordered comparison
     *  2 - Partial comparison
     * @param {Function} [customizer] The function to customize comparisons.
     * @param {Object} [stack] Tracks traversed `value` and `other` objects.
     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
     */
    function baseIsEqual(value, other, bitmask, customizer, stack) {
      if (value === other) {
        return true;
      }
      if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
        return value !== value && other !== other;
      }
      return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
    }

    /**
     * A specialized version of `baseIsEqual` for arrays and objects which performs
     * deep comparisons and tracks traversed objects enabling objects with circular
     * references to be compared.
     *
     * @private
     * @param {Object} object The object to compare.
     * @param {Object} other The other object to compare.
     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
     * @param {Function} customizer The function to customize comparisons.
     * @param {Function} equalFunc The function to determine equivalents of values.
     * @param {Object} [stack] Tracks traversed `object` and `other` objects.
     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
     */
    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
      var objIsArr = isArray(object),
          othIsArr = isArray(other),
          objTag = objIsArr ? arrayTag : getTag(object),
          othTag = othIsArr ? arrayTag : getTag(other);

      objTag = objTag == argsTag ? objectTag : objTag;
      othTag = othTag == argsTag ? objectTag : othTag;

      var objIsObj = objTag == objectTag,
          othIsObj = othTag == objectTag,
          isSameTag = objTag == othTag;

      if (isSameTag && isBuffer(object)) {
        if (!isBuffer(other)) {
          return false;
        }
        objIsArr = true;
        objIsObj = false;
      }
      if (isSameTag && !objIsObj) {
        stack || (stack = new Stack);
        return (objIsArr || isTypedArray(object))
          ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
          : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
      }
      if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');

        if (objIsWrapped || othIsWrapped) {
          var objUnwrapped = objIsWrapped ? object.value() : object,
              othUnwrapped = othIsWrapped ? other.value() : other;

          stack || (stack = new Stack);
          return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
        }
      }
      if (!isSameTag) {
        return false;
      }
      stack || (stack = new Stack);
      return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
    }

    /**
     * The base implementation of `_.isMap` without Node.js optimizations.
     *
     * @private
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a map, else `false`.
     */
    function baseIsMap(value) {
      return isObjectLike(value) && getTag(value) == mapTag;
    }

    /**
     * The base implementation of `_.isMatch` without support for iteratee shorthands.
     *
     * @private
     * @param {Object} object The object to inspect.
     * @param {Object} source The object of property values to match.
     * @param {Array} matchData The property names, values, and compare flags to match.
     * @param {Function} [customizer] The function to customize comparisons.
     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
     */
    function baseIsMatch(object, source, matchData, customizer) {
      var index = matchData.length,
          length = index,
          noCustomizer = !customizer;

      if (object == null) {
        return !length;
      }
      object = Object(object);
      while (index--) {
        var data = matchData[index];
        if ((noCustomizer && data[2])
              ? data[1] !== object[data[0]]
              : !(data[0] in object)
            ) {
          return false;
        }
      }
      while (++index < length) {
        data = matchData[index];
        var key = data[0],
            objValue = object[key],
            srcValue = data[1];

        if (noCustomizer && data[2]) {
          if (objValue === undefined && !(key in object)) {
            return false;
          }
        } else {
          var stack = new Stack;
          if (customizer) {
            var result = customizer(objValue, srcValue, key, object, source, stack);
          }
          if (!(result === undefined
                ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)
                : result
              )) {
            return false;
          }
        }
      }
      return true;
    }

    /**
     * The base implementation of `_.isNative` without bad shim checks.
     *
     * @private
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a native function,
     *  else `false`.
     */
    function baseIsNative(value) {
      if (!isObject(value) || isMasked(value)) {
        return false;
      }
      var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
      return pattern.test(toSource(value));
    }

    /**
     * The base implementation of `_.isRegExp` without Node.js optimizations.
     *
     * @private
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
     */
    function baseIsRegExp(value) {
      return isObjectLike(value) && baseGetTag(value) == regexpTag;
    }

    /**
     * The base implementation of `_.isSet` without Node.js optimizations.
     *
     * @private
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a set, else `false`.
     */
    function baseIsSet(value) {
      return isObjectLike(value) && getTag(value) == setTag;
    }

    /**
     * The base implementation of `_.isTypedArray` without Node.js optimizations.
     *
     * @private
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
     */
    function baseIsTypedArray(value) {
      return isObjectLike(value) &&
        isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
    }

    /**
     * The base implementation of `_.iteratee`.
     *
     * @private
     * @param {*} [value=_.identity] The value to convert to an iteratee.
     * @returns {Function} Returns the iteratee.
     */
    function baseIteratee(value) {
      // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
      // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
      if (typeof value == 'function') {
        return value;
      }
      if (value == null) {
        return identity;
      }
      if (typeof value == 'object') {
        return isArray(value)
          ? baseMatchesProperty(value[0], value[1])
          : baseMatches(value);
      }
      return property(value);
    }

    /**
     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
     *
     * @private
     * @param {Object} object The object to query.
     * @returns {Array} Returns the array of property names.
     */
    function baseKeys(object) {
      if (!isPrototype(object)) {
        return nativeKeys(object);
      }
      var result = [];
      for (var key in Object(object)) {
        if (hasOwnProperty.call(object, key) && key != 'constructor') {
          result.push(key);
        }
      }
      return result;
    }

    /**
     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
     *
     * @private
     * @param {Object} object The object to query.
     * @returns {Array} Returns the array of property names.
     */
    function baseKeysIn(object) {
      if (!isObject(object)) {
        return nativeKeysIn(object);
      }
      var isProto = isPrototype(object),
          result = [];

      for (var key in object) {
        if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
          result.push(key);
        }
      }
      return result;
    }

    /**
     * The base implementation of `_.lt` which doesn't coerce arguments.
     *
     * @private
     * @param {*} value The value to compare.
     * @param {*} other The other value to compare.
     * @returns {boolean} Returns `true` if `value` is less than `other`,
     *  else `false`.
     */
    function baseLt(value, other) {
      return value < other;
    }

    /**
     * The base implementation of `_.map` without support for iteratee shorthands.
     *
     * @private
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} iteratee The function invoked per iteration.
     * @returns {Array} Returns the new mapped array.
     */
    function baseMap(collection, iteratee) {
      var index = -1,
          result = isArrayLike(collection) ? Array(collection.length) : [];

      baseEach(collection, function(value, key, collection) {
        result[++index] = iteratee(value, key, collection);
      });
      return result;
    }

    /**
     * The base implementation of `_.matches` which doesn't clone `source`.
     *
     * @private
     * @param {Object} source The object of property values to match.
     * @returns {Function} Returns the new spec function.
     */
    function baseMatches(source) {
      var matchData = getMatchData(source);
      if (matchData.length == 1 && matchData[0][2]) {
        return matchesStrictComparable(matchData[0][0], matchData[0][1]);
      }
      return function(object) {
        return object === source || baseIsMatch(object, source, matchData);
      };
    }

    /**
     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
     *
     * @private
     * @param {string} path The path of the property to get.
     * @param {*} srcValue The value to match.
     * @returns {Function} Returns the new spec function.
     */
    function baseMatchesProperty(path, srcValue) {
      if (isKey(path) && isStrictComparable(srcValue)) {
        return matchesStrictComparable(toKey(path), srcValue);
      }
      return function(object) {
        var objValue = get(object, path);
        return (objValue === undefined && objValue === srcValue)
          ? hasIn(object, path)
          : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
      };
    }

    /**
     * The base implementation of `_.merge` without support for multiple sources.
     *
     * @private
     * @param {Object} object The destination object.
     * @param {Object} source The source object.
     * @param {number} srcIndex The index of `source`.
     * @param {Function} [customizer] The function to customize merged values.
     * @param {Object} [stack] Tracks traversed source values and their merged
     *  counterparts.
     */
    function baseMerge(object, source, srcIndex, customizer, stack) {
      if (object === source) {
        return;
      }
      baseFor(source, function(srcValue, key) {
        stack || (stack = new Stack);
        if (isObject(srcValue)) {
          baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
        }
        else {
          var newValue = customizer
            ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)
            : undefined;

          if (newValue === undefined) {
            newValue = srcValue;
          }
          assignMergeValue(object, key, newValue);
        }
      }, keysIn);
    }

    /**
     * A specialized version of `baseMerge` for arrays and objects which performs
     * deep merges and tracks traversed objects enabling objects with circular
     * references to be merged.
     *
     * @private
     * @param {Object} object The destination object.
     * @param {Object} source The source object.
     * @param {string} key The key of the value to merge.
     * @param {number} srcIndex The index of `source`.
     * @param {Function} mergeFunc The function to merge values.
     * @param {Function} [customizer] The function to customize assigned values.
     * @param {Object} [stack] Tracks traversed source values and their merged
     *  counterparts.
     */
    function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
      var objValue = safeGet(object, key),
          srcValue = safeGet(source, key),
          stacked = stack.get(srcValue);

      if (stacked) {
        assignMergeValue(object, key, stacked);
        return;
      }
      var newValue = customizer
        ? customizer(objValue, srcValue, (key + ''), object, source, stack)
        : undefined;

      var isCommon = newValue === undefined;

      if (isCommon) {
        var isArr = isArray(srcValue),
            isBuff = !isArr && isBuffer(srcValue),
            isTyped = !isArr && !isBuff && isTypedArray(srcValue);

        newValue = srcValue;
        if (isArr || isBuff || isTyped) {
          if (isArray(objValue)) {
            newValue = objValue;
          }
          else if (isArrayLikeObject(objValue)) {
            newValue = copyArray(objValue);
          }
          else if (isBuff) {
            isCommon = false;
            newValue = cloneBuffer(srcValue, true);
          }
          else if (isTyped) {
            isCommon = false;
            newValue = cloneTypedArray(srcValue, true);
          }
          else {
            newValue = [];
          }
        }
        else if (isPlainObject(srcValue) || isArguments(srcValue)) {
          newValue = objValue;
          if (isArguments(objValue)) {
            newValue = toPlainObject(objValue);
          }
          else if (!isObject(objValue) || isFunction(objValue)) {
            newValue = initCloneObject(srcValue);
          }
        }
        else {
          isCommon = false;
        }
      }
      if (isCommon) {
        // Recursively merge objects and arrays (susceptible to call stack limits).
        stack.set(srcValue, newValue);
        mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
        stack['delete'](srcValue);
      }
      assignMergeValue(object, key, newValue);
    }

    /**
     * The base implementation of `_.nth` which doesn't coerce arguments.
     *
     * @private
     * @param {Array} array The array to query.
     * @param {number} n The index of the element to return.
     * @returns {*} Returns the nth element of `array`.
     */
    function baseNth(array, n) {
      var length = array.length;
      if (!length) {
        return;
      }
      n += n < 0 ? length : 0;
      return isIndex(n, length) ? array[n] : undefined;
    }

    /**
     * The base implementation of `_.orderBy` without param guards.
     *
     * @private
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
     * @param {string[]} orders The sort orders of `iteratees`.
     * @returns {Array} Returns the new sorted array.
     */
    function baseOrderBy(collection, iteratees, orders) {
      if (iteratees.length) {
        iteratees = arrayMap(iteratees, function(iteratee) {
          if (isArray(iteratee)) {
            return function(value) {
              return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);
            }
          }
          return iteratee;
        });
      } else {
        iteratees = [identity];
      }

      var index = -1;
      iteratees = arrayMap(iteratees, baseUnary(getIteratee()));

      var result = baseMap(collection, function(value, key, collection) {
        var criteria = arrayMap(iteratees, function(iteratee) {
          return iteratee(value);
        });
        return { 'criteria': criteria, 'index': ++index, 'value': value };
      });

      return baseSortBy(result, function(object, other) {
        return compareMultiple(object, other, orders);
      });
    }

    /**
     * The base implementation of `_.pick` without support for individual
     * property identifiers.
     *
     * @private
     * @param {Object} object The source object.
     * @param {string[]} paths The property paths to pick.
     * @returns {Object} Returns the new object.
     */
    function basePick(object, paths) {
      return basePickBy(object, paths, function(value, path) {
        return hasIn(object, path);
      });
    }

    /**
     * The base implementation of  `_.pickBy` without support for iteratee shorthands.
     *
     * @private
     * @param {Object} object The source object.
     * @param {string[]} paths The property paths to pick.
     * @param {Function} predicate The function invoked per property.
     * @returns {Object} Returns the new object.
     */
    function basePickBy(object, paths, predicate) {
      var index = -1,
          length = paths.length,
          result = {};

      while (++index < length) {
        var path = paths[index],
            value = baseGet(object, path);

        if (predicate(value, path)) {
          baseSet(result, castPath(path, object), value);
        }
      }
      return result;
    }

    /**
     * A specialized version of `baseProperty` which supports deep paths.
     *
     * @private
     * @param {Array|string} path The path of the property to get.
     * @returns {Function} Returns the new accessor function.
     */
    function basePropertyDeep(path) {
      return function(object) {
        return baseGet(object, path);
      };
    }

    /**
     * The base implementation of `_.pullAllBy` without support for iteratee
     * shorthands.
     *
     * @private
     * @param {Array} array The array to modify.
     * @param {Array} values The values to remove.
     * @param {Function} [iteratee] The iteratee invoked per element.
     * @param {Function} [comparator] The comparator invoked per element.
     * @returns {Array} Returns `array`.
     */
    function basePullAll(array, values, iteratee, comparator) {
      var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
          index = -1,
          length = values.length,
          seen = array;

      if (array === values) {
        values = copyArray(values);
      }
      if (iteratee) {
        seen = arrayMap(array, baseUnary(iteratee));
      }
      while (++index < length) {
        var fromIndex = 0,
            value = values[index],
            computed = iteratee ? iteratee(value) : value;

        while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
          if (seen !== array) {
            splice.call(seen, fromIndex, 1);
          }
          splice.call(array, fromIndex, 1);
        }
      }
      return array;
    }

    /**
     * The base implementation of `_.pullAt` without support for individual
     * indexes or capturing the removed elements.
     *
     * @private
     * @param {Array} array The array to modify.
     * @param {number[]} indexes The indexes of elements to remove.
     * @returns {Array} Returns `array`.
     */
    function basePullAt(array, indexes) {
      var length = array ? indexes.length : 0,
          lastIndex = length - 1;

      while (length--) {
        var index = indexes[length];
        if (length == lastIndex || index !== previous) {
          var previous = index;
          if (isIndex(index)) {
            splice.call(array, index, 1);
          } else {
            baseUnset(array, index);
          }
        }
      }
      return array;
    }

    /**
     * The base implementation of `_.random` without support for returning
     * floating-point numbers.
     *
     * @private
     * @param {number} lower The lower bound.
     * @param {number} upper The upper bound.
     * @returns {number} Returns the random number.
     */
    function baseRandom(lower, upper) {
      return lower + nativeFloor(nativeRandom() * (upper - lower + 1));
    }

    /**
     * The base implementation of `_.range` and `_.rangeRight` which doesn't
     * coerce arguments.
     *
     * @private
     * @param {number} start The start of the range.
     * @param {number} end The end of the range.
     * @param {number} step The value to increment or decrement by.
     * @param {boolean} [fromRight] Specify iterating from right to left.
     * @returns {Array} Returns the range of numbers.
     */
    function baseRange(start, end, step, fromRight) {
      var index = -1,
          length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),
          result = Array(length);

      while (length--) {
        result[fromRight ? length : ++index] = start;
        start += step;
      }
      return result;
    }

    /**
     * The base implementation of `_.repeat` which doesn't coerce arguments.
     *
     * @private
     * @param {string} string The string to repeat.
     * @param {number} n The number of times to repeat the string.
     * @returns {string} Returns the repeated string.
     */
    function baseRepeat(string, n) {
      var result = '';
      if (!string || n < 1 || n > MAX_SAFE_INTEGER) {
        return result;
      }
      // Leverage the exponentiation by squaring algorithm for a faster repeat.
      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.
      do {
        if (n % 2) {
          result += string;
        }
        n = nativeFloor(n / 2);
        if (n) {
          string += string;
        }
      } while (n);

      return result;
    }

    /**
     * The base implementation of `_.rest` which doesn't validate or coerce arguments.
     *
     * @private
     * @param {Function} func The function to apply a rest parameter to.
     * @param {number} [start=func.length-1] The start position of the rest parameter.
     * @returns {Function} Returns the new function.
     */
    function baseRest(func, start) {
      return setToString(overRest(func, start, identity), func + '');
    }

    /**
     * The base implementation of `_.sample`.
     *
     * @private
     * @param {Array|Object} collection The collection to sample.
     * @returns {*} Returns the random element.
     */
    function baseSample(collection) {
      return arraySample(values(collection));
    }

    /**
     * The base implementation of `_.sampleSize` without param guards.
     *
     * @private
     * @param {Array|Object} collection The collection to sample.
     * @param {number} n The number of elements to sample.
     * @returns {Array} Returns the random elements.
     */
    function baseSampleSize(collection, n) {
      var array = values(collection);
      return shuffleSelf(array, baseClamp(n, 0, array.length));
    }

    /**
     * The base implementation of `_.set`.
     *
     * @private
     * @param {Object} object The object to modify.
     * @param {Array|string} path The path of the property to set.
     * @param {*} value The value to set.
     * @param {Function} [customizer] The function to customize path creation.
     * @returns {Object} Returns `object`.
     */
    function baseSet(object, path, value, customizer) {
      if (!isObject(object)) {
        return object;
      }
      path = castPath(path, object);

      var index = -1,
          length = path.length,
          lastIndex = length - 1,
          nested = object;

      while (nested != null && ++index < length) {
        var key = toKey(path[index]),
            newValue = value;

        if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
          return object;
        }

        if (index != lastIndex) {
          var objValue = nested[key];
          newValue = customizer ? customizer(objValue, key, nested) : undefined;
          if (newValue === undefined) {
            newValue = isObject(objValue)
              ? objValue
              : (isIndex(path[index + 1]) ? [] : {});
          }
        }
        assignValue(nested, key, newValue);
        nested = nested[key];
      }
      return object;
    }

    /**
     * The base implementation of `setData` without support for hot loop shorting.
     *
     * @private
     * @param {Function} func The function to associate metadata with.
     * @param {*} data The metadata.
     * @returns {Function} Returns `func`.
     */
    var baseSetData = !metaMap ? identity : function(func, data) {
      metaMap.set(func, data);
      return func;
    };

    /**
     * The base implementation of `setToString` without support for hot loop shorting.
     *
     * @private
     * @param {Function} func The function to modify.
     * @param {Function} string The `toString` result.
     * @returns {Function} Returns `func`.
     */
    var baseSetToString = !defineProperty ? identity : function(func, string) {
      return defineProperty(func, 'toString', {
        'configurable': true,
        'enumerable': false,
        'value': constant(string),
        'writable': true
      });
    };

    /**
     * The base implementation of `_.shuffle`.
     *
     * @private
     * @param {Array|Object} collection The collection to shuffle.
     * @returns {Array} Returns the new shuffled array.
     */
    function baseShuffle(collection) {
      return shuffleSelf(values(collection));
    }

    /**
     * The base implementation of `_.slice` without an iteratee call guard.
     *
     * @private
     * @param {Array} array The array to slice.
     * @param {number} [start=0] The start position.
     * @param {number} [end=array.length] The end position.
     * @returns {Array} Returns the slice of `array`.
     */
    function baseSlice(array, start, end) {
      var index = -1,
          length = array.length;

      if (start < 0) {
        start = -start > length ? 0 : (length + start);
      }
      end = end > length ? length : end;
      if (end < 0) {
        end += length;
      }
      length = start > end ? 0 : ((end - start) >>> 0);
      start >>>= 0;

      var result = Array(length);
      while (++index < length) {
        result[index] = array[index + start];
      }
      return result;
    }

    /**
     * The base implementation of `_.some` without support for iteratee shorthands.
     *
     * @private
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} predicate The function invoked per iteration.
     * @returns {boolean} Returns `true` if any element passes the predicate check,
     *  else `false`.
     */
    function baseSome(collection, predicate) {
      var result;

      baseEach(collection, function(value, index, collection) {
        result = predicate(value, index, collection);
        return !result;
      });
      return !!result;
    }

    /**
     * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which
     * performs a binary search of `array` to determine the index at which `value`
     * should be inserted into `array` in order to maintain its sort order.
     *
     * @private
     * @param {Array} array The sorted array to inspect.
     * @param {*} value The value to evaluate.
     * @param {boolean} [retHighest] Specify returning the highest qualified index.
     * @returns {number} Returns the index at which `value` should be inserted
     *  into `array`.
     */
    function baseSortedIndex(array, value, retHighest) {
      var low = 0,
          high = array == null ? low : array.length;

      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
        while (low < high) {
          var mid = (low + high) >>> 1,
              computed = array[mid];

          if (computed !== null && !isSymbol(computed) &&
              (retHighest ? (computed <= value) : (computed < value))) {
            low = mid + 1;
          } else {
            high = mid;
          }
        }
        return high;
      }
      return baseSortedIndexBy(array, value, identity, retHighest);
    }

    /**
     * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`
     * which invokes `iteratee` for `value` and each element of `array` to compute
     * their sort ranking. The iteratee is invoked with one argument; (value).
     *
     * @private
     * @param {Array} array The sorted array to inspect.
     * @param {*} value The value to evaluate.
     * @param {Function} iteratee The iteratee invoked per element.
     * @param {boolean} [retHighest] Specify returning the highest qualified index.
     * @returns {number} Returns the index at which `value` should be inserted
     *  into `array`.
     */
    function baseSortedIndexBy(array, value, iteratee, retHighest) {
      var low = 0,
          high = array == null ? 0 : array.length;
      if (high === 0) {
        return 0;
      }

      value = iteratee(value);
      var valIsNaN = value !== value,
          valIsNull = value === null,
          valIsSymbol = isSymbol(value),
          valIsUndefined = value === undefined;

      while (low < high) {
        var mid = nativeFloor((low + high) / 2),
            computed = iteratee(array[mid]),
            othIsDefined = computed !== undefined,
            othIsNull = computed === null,
            othIsReflexive = computed === computed,
            othIsSymbol = isSymbol(computed);

        if (valIsNaN) {
          var setLow = retHighest || othIsReflexive;
        } else if (valIsUndefined) {
          setLow = othIsReflexive && (retHighest || othIsDefined);
        } else if (valIsNull) {
          setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);
        } else if (valIsSymbol) {
          setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);
        } else if (othIsNull || othIsSymbol) {
          setLow = false;
        } else {
          setLow = retHighest ? (computed <= value) : (computed < value);
        }
        if (setLow) {
          low = mid + 1;
        } else {
          high = mid;
        }
      }
      return nativeMin(high, MAX_ARRAY_INDEX);
    }

    /**
     * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without
     * support for iteratee shorthands.
     *
     * @private
     * @param {Array} array The array to inspect.
     * @param {Function} [iteratee] The iteratee invoked per element.
     * @returns {Array} Returns the new duplicate free array.
     */
    function baseSortedUniq(array, iteratee) {
      var index = -1,
          length = array.length,
          resIndex = 0,
          result = [];

      while (++index < length) {
        var value = array[index],
            computed = iteratee ? iteratee(value) : value;

        if (!index || !eq(computed, seen)) {
          var seen = computed;
          result[resIndex++] = value === 0 ? 0 : value;
        }
      }
      return result;
    }

    /**
     * The base implementation of `_.toNumber` which doesn't ensure correct
     * conversions of binary, hexadecimal, or octal string values.
     *
     * @private
     * @param {*} value The value to process.
     * @returns {number} Returns the number.
     */
    function baseToNumber(value) {
      if (typeof value == 'number') {
        return value;
      }
      if (isSymbol(value)) {
        return NAN;
      }
      return +value;
    }

    /**
     * The base implementation of `_.toString` which doesn't convert nullish
     * values to empty strings.
     *
     * @private
     * @param {*} value The value to process.
     * @returns {string} Returns the string.
     */
    function baseToString(value) {
      // Exit early for strings to avoid a performance hit in some environments.
      if (typeof value == 'string') {
        return value;
      }
      if (isArray(value)) {
        // Recursively convert values (susceptible to call stack limits).
        return arrayMap(value, baseToString) + '';
      }
      if (isSymbol(value)) {
        return symbolToString ? symbolToString.call(value) : '';
      }
      var result = (value + '');
      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
    }

    /**
     * The base implementation of `_.uniqBy` without support for iteratee shorthands.
     *
     * @private
     * @param {Array} array The array to inspect.
     * @param {Function} [iteratee] The iteratee invoked per element.
     * @param {Function} [comparator] The comparator invoked per element.
     * @returns {Array} Returns the new duplicate free array.
     */
    function baseUniq(array, iteratee, comparator) {
      var index = -1,
          includes = arrayIncludes,
          length = array.length,
          isCommon = true,
          result = [],
          seen = result;

      if (comparator) {
        isCommon = false;
        includes = arrayIncludesWith;
      }
      else if (length >= LARGE_ARRAY_SIZE) {
        var set = iteratee ? null : createSet(array);
        if (set) {
          return setToArray(set);
        }
        isCommon = false;
        includes = cacheHas;
        seen = new SetCache;
      }
      else {
        seen = iteratee ? [] : result;
      }
      outer:
      while (++index < length) {
        var value = array[index],
            computed = iteratee ? iteratee(value) : value;

        value = (comparator || value !== 0) ? value : 0;
        if (isCommon && computed === computed) {
          var seenIndex = seen.length;
          while (seenIndex--) {
            if (seen[seenIndex] === computed) {
              continue outer;
            }
          }
          if (iteratee) {
            seen.push(computed);
          }
          result.push(value);
        }
        else if (!includes(seen, computed, comparator)) {
          if (seen !== result) {
            seen.push(computed);
          }
          result.push(value);
        }
      }
      return result;
    }

    /**
     * The base implementation of `_.unset`.
     *
     * @private
     * @param {Object} object The object to modify.
     * @param {Array|string} path The property path to unset.
     * @returns {boolean} Returns `true` if the property is deleted, else `false`.
     */
    function baseUnset(object, path) {
      path = castPath(path, object);
      object = parent(object, path);
      return object == null || delete object[toKey(last(path))];
    }

    /**
     * The base implementation of `_.update`.
     *
     * @private
     * @param {Object} object The object to modify.
     * @param {Array|string} path The path of the property to update.
     * @param {Function} updater The function to produce the updated value.
     * @param {Function} [customizer] The function to customize path creation.
     * @returns {Object} Returns `object`.
     */
    function baseUpdate(object, path, updater, customizer) {
      return baseSet(object, path, updater(baseGet(object, path)), customizer);
    }

    /**
     * The base implementation of methods like `_.dropWhile` and `_.takeWhile`
     * without support for iteratee shorthands.
     *
     * @private
     * @param {Array} array The array to query.
     * @param {Function} predicate The function invoked per iteration.
     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.
     * @param {boolean} [fromRight] Specify iterating from right to left.
     * @returns {Array} Returns the slice of `array`.
     */
    function baseWhile(array, predicate, isDrop, fromRight) {
      var length = array.length,
          index = fromRight ? length : -1;

      while ((fromRight ? index-- : ++index < length) &&
        predicate(array[index], index, array)) {}

      return isDrop
        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));
    }

    /**
     * The base implementation of `wrapperValue` which returns the result of
     * performing a sequence of actions on the unwrapped `value`, where each
     * successive action is supplied the return value of the previous.
     *
     * @private
     * @param {*} value The unwrapped value.
     * @param {Array} actions Actions to perform to resolve the unwrapped value.
     * @returns {*} Returns the resolved value.
     */
    function baseWrapperValue(value, actions) {
      var result = value;
      if (result instanceof LazyWrapper) {
        result = result.value();
      }
      return arrayReduce(actions, function(result, action) {
        return action.func.apply(action.thisArg, arrayPush([result], action.args));
      }, result);
    }

    /**
     * The base implementation of methods like `_.xor`, without support for
     * iteratee shorthands, that accepts an array of arrays to inspect.
     *
     * @private
     * @param {Array} arrays The arrays to inspect.
     * @param {Function} [iteratee] The iteratee invoked per element.
     * @param {Function} [comparator] The comparator invoked per element.
     * @returns {Array} Returns the new array of values.
     */
    function baseXor(arrays, iteratee, comparator) {
      var length = arrays.length;
      if (length < 2) {
        return length ? baseUniq(arrays[0]) : [];
      }
      var index = -1,
          result = Array(length);

      while (++index < length) {
        var array = arrays[index],
            othIndex = -1;

        while (++othIndex < length) {
          if (othIndex != index) {
            result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);
          }
        }
      }
      return baseUniq(baseFlatten(result, 1), iteratee, comparator);
    }

    /**
     * This base implementation of `_.zipObject` which assigns values using `assignFunc`.
     *
     * @private
     * @param {Array} props The property identifiers.
     * @param {Array} values The property values.
     * @param {Function} assignFunc The function to assign values.
     * @returns {Object} Returns the new object.
     */
    function baseZipObject(props, values, assignFunc) {
      var index = -1,
          length = props.length,
          valsLength = values.length,
          result = {};

      while (++index < length) {
        var value = index < valsLength ? values[index] : undefined;
        assignFunc(result, props[index], value);
      }
      return result;
    }

    /**
     * Casts `value` to an empty array if it's not an array like object.
     *
     * @private
     * @param {*} value The value to inspect.
     * @returns {Array|Object} Returns the cast array-like object.
     */
    function castArrayLikeObject(value) {
      return isArrayLikeObject(value) ? value : [];
    }

    /**
     * Casts `value` to `identity` if it's not a function.
     *
     * @private
     * @param {*} value The value to inspect.
     * @returns {Function} Returns cast function.
     */
    function castFunction(value) {
      return typeof value == 'function' ? value : identity;
    }

    /**
     * Casts `value` to a path array if it's not one.
     *
     * @private
     * @param {*} value The value to inspect.
     * @param {Object} [object] The object to query keys on.
     * @returns {Array} Returns the cast property path array.
     */
    function castPath(value, object) {
      if (isArray(value)) {
        return value;
      }
      return isKey(value, object) ? [value] : stringToPath(toString(value));
    }

    /**
     * A `baseRest` alias which can be replaced with `identity` by module
     * replacement plugins.
     *
     * @private
     * @type {Function}
     * @param {Function} func The function to apply a rest parameter to.
     * @returns {Function} Returns the new function.
     */
    var castRest = baseRest;

    /**
     * Casts `array` to a slice if it's needed.
     *
     * @private
     * @param {Array} array The array to inspect.
     * @param {number} start The start position.
     * @param {number} [end=array.length] The end position.
     * @returns {Array} Returns the cast slice.
     */
    function castSlice(array, start, end) {
      var length = array.length;
      end = end === undefined ? length : end;
      return (!start && end >= length) ? array : baseSlice(array, start, end);
    }

    /**
     * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).
     *
     * @private
     * @param {number|Object} id The timer id or timeout object of the timer to clear.
     */
    var clearTimeout = ctxClearTimeout || function(id) {
      return root.clearTimeout(id);
    };

    /**
     * Creates a clone of  `buffer`.
     *
     * @private
     * @param {Buffer} buffer The buffer to clone.
     * @param {boolean} [isDeep] Specify a deep clone.
     * @returns {Buffer} Returns the cloned buffer.
     */
    function cloneBuffer(buffer, isDeep) {
      if (isDeep) {
        return buffer.slice();
      }
      var length = buffer.length,
          result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);

      buffer.copy(result);
      return result;
    }

    /**
     * Creates a clone of `arrayBuffer`.
     *
     * @private
     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
     * @returns {ArrayBuffer} Returns the cloned array buffer.
     */
    function cloneArrayBuffer(arrayBuffer) {
      var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
      new Uint8Array(result).set(new Uint8Array(arrayBuffer));
      return result;
    }

    /**
     * Creates a clone of `dataView`.
     *
     * @private
     * @param {Object} dataView The data view to clone.
     * @param {boolean} [isDeep] Specify a deep clone.
     * @returns {Object} Returns the cloned data view.
     */
    function cloneDataView(dataView, isDeep) {
      var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
      return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
    }

    /**
     * Creates a clone of `regexp`.
     *
     * @private
     * @param {Object} regexp The regexp to clone.
     * @returns {Object} Returns the cloned regexp.
     */
    function cloneRegExp(regexp) {
      var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
      result.lastIndex = regexp.lastIndex;
      return result;
    }

    /**
     * Creates a clone of the `symbol` object.
     *
     * @private
     * @param {Object} symbol The symbol object to clone.
     * @returns {Object} Returns the cloned symbol object.
     */
    function cloneSymbol(symbol) {
      return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
    }

    /**
     * Creates a clone of `typedArray`.
     *
     * @private
     * @param {Object} typedArray The typed array to clone.
     * @param {boolean} [isDeep] Specify a deep clone.
     * @returns {Object} Returns the cloned typed array.
     */
    function cloneTypedArray(typedArray, isDeep) {
      var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
      return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
    }

    /**
     * Compares values to sort them in ascending order.
     *
     * @private
     * @param {*} value The value to compare.
     * @param {*} other The other value to compare.
     * @returns {number} Returns the sort order indicator for `value`.
     */
    function compareAscending(value, other) {
      if (value !== other) {
        var valIsDefined = value !== undefined,
            valIsNull = value === null,
            valIsReflexive = value === value,
            valIsSymbol = isSymbol(value);

        var othIsDefined = other !== undefined,
            othIsNull = other === null,
            othIsReflexive = other === other,
            othIsSymbol = isSymbol(other);

        if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||
            (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||
            (valIsNull && othIsDefined && othIsReflexive) ||
            (!valIsDefined && othIsReflexive) ||
            !valIsReflexive) {
          return 1;
        }
        if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||
            (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||
            (othIsNull && valIsDefined && valIsReflexive) ||
            (!othIsDefined && valIsReflexive) ||
            !othIsReflexive) {
          return -1;
        }
      }
      return 0;
    }

    /**
     * Used by `_.orderBy` to compare multiple properties of a value to another
     * and stable sort them.
     *
     * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,
     * specify an order of "desc" for descending or "asc" for ascending sort order
     * of corresponding values.
     *
     * @private
     * @param {Object} object The object to compare.
     * @param {Object} other The other object to compare.
     * @param {boolean[]|string[]} orders The order to sort by for each property.
     * @returns {number} Returns the sort order indicator for `object`.
     */
    function compareMultiple(object, other, orders) {
      var index = -1,
          objCriteria = object.criteria,
          othCriteria = other.criteria,
          length = objCriteria.length,
          ordersLength = orders.length;

      while (++index < length) {
        var result = compareAscending(objCriteria[index], othCriteria[index]);
        if (result) {
          if (index >= ordersLength) {
            return result;
          }
          var order = orders[index];
          return result * (order == 'desc' ? -1 : 1);
        }
      }
      // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
      // that causes it, under certain circumstances, to provide the same value for
      // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247
      // for more details.
      //
      // This also ensures a stable sort in V8 and other engines.
      // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.
      return object.index - other.index;
    }

    /**
     * Creates an array that is the composition of partially applied arguments,
     * placeholders, and provided arguments into a single array of arguments.
     *
     * @private
     * @param {Array} args The provided arguments.
     * @param {Array} partials The arguments to prepend to those provided.
     * @param {Array} holders The `partials` placeholder indexes.
     * @params {boolean} [isCurried] Specify composing for a curried function.
     * @returns {Array} Returns the new array of composed arguments.
     */
    function composeArgs(args, partials, holders, isCurried) {
      var argsIndex = -1,
          argsLength = args.length,
          holdersLength = holders.length,
          leftIndex = -1,
          leftLength = partials.length,
          rangeLength = nativeMax(argsLength - holdersLength, 0),
          result = Array(leftLength + rangeLength),
          isUncurried = !isCurried;

      while (++leftIndex < leftLength) {
        result[leftIndex] = partials[leftIndex];
      }
      while (++argsIndex < holdersLength) {
        if (isUncurried || argsIndex < argsLength) {
          result[holders[argsIndex]] = args[argsIndex];
        }
      }
      while (rangeLength--) {
        result[leftIndex++] = args[argsIndex++];
      }
      return result;
    }

    /**
     * This function is like `composeArgs` except that the arguments composition
     * is tailored for `_.partialRight`.
     *
     * @private
     * @param {Array} args The provided arguments.
     * @param {Array} partials The arguments to append to those provided.
     * @param {Array} holders The `partials` placeholder indexes.
     * @params {boolean} [isCurried] Specify composing for a curried function.
     * @returns {Array} Returns the new array of composed arguments.
     */
    function composeArgsRight(args, partials, holders, isCurried) {
      var argsIndex = -1,
          argsLength = args.length,
          holdersIndex = -1,
          holdersLength = holders.length,
          rightIndex = -1,
          rightLength = partials.length,
          rangeLength = nativeMax(argsLength - holdersLength, 0),
          result = Array(rangeLength + rightLength),
          isUncurried = !isCurried;

      while (++argsIndex < rangeLength) {
        result[argsIndex] = args[argsIndex];
      }
      var offset = argsIndex;
      while (++rightIndex < rightLength) {
        result[offset + rightIndex] = partials[rightIndex];
      }
      while (++holdersIndex < holdersLength) {
        if (isUncurried || argsIndex < argsLength) {
          result[offset + holders[holdersIndex]] = args[argsIndex++];
        }
      }
      return result;
    }

    /**
     * Copies the values of `source` to `array`.
     *
     * @private
     * @param {Array} source The array to copy values from.
     * @param {Array} [array=[]] The array to copy values to.
     * @returns {Array} Returns `array`.
     */
    function copyArray(source, array) {
      var index = -1,
          length = source.length;

      array || (array = Array(length));
      while (++index < length) {
        array[index] = source[index];
      }
      return array;
    }

    /**
     * Copies properties of `source` to `object`.
     *
     * @private
     * @param {Object} source The object to copy properties from.
     * @param {Array} props The property identifiers to copy.
     * @param {Object} [object={}] The object to copy properties to.
     * @param {Function} [customizer] The function to customize copied values.
     * @returns {Object} Returns `object`.
     */
    function copyObject(source, props, object, customizer) {
      var isNew = !object;
      object || (object = {});

      var index = -1,
          length = props.length;

      while (++index < length) {
        var key = props[index];

        var newValue = customizer
          ? customizer(object[key], source[key], key, object, source)
          : undefined;

        if (newValue === undefined) {
          newValue = source[key];
        }
        if (isNew) {
          baseAssignValue(object, key, newValue);
        } else {
          assignValue(object, key, newValue);
        }
      }
      return object;
    }

    /**
     * Copies own symbols of `source` to `object`.
     *
     * @private
     * @param {Object} source The object to copy symbols from.
     * @param {Object} [object={}] The object to copy symbols to.
     * @returns {Object} Returns `object`.
     */
    function copySymbols(source, object) {
      return copyObject(source, getSymbols(source), object);
    }

    /**
     * Copies own and inherited symbols of `source` to `object`.
     *
     * @private
     * @param {Object} source The object to copy symbols from.
     * @param {Object} [object={}] The object to copy symbols to.
     * @returns {Object} Returns `object`.
     */
    function copySymbolsIn(source, object) {
      return copyObject(source, getSymbolsIn(source), object);
    }

    /**
     * Creates a function like `_.groupBy`.
     *
     * @private
     * @param {Function} setter The function to set accumulator values.
     * @param {Function} [initializer] The accumulator object initializer.
     * @returns {Function} Returns the new aggregator function.
     */
    function createAggregator(setter, initializer) {
      return function(collection, iteratee) {
        var func = isArray(collection) ? arrayAggregator : baseAggregator,
            accumulator = initializer ? initializer() : {};

        return func(collection, setter, getIteratee(iteratee, 2), accumulator);
      };
    }

    /**
     * Creates a function like `_.assign`.
     *
     * @private
     * @param {Function} assigner The function to assign values.
     * @returns {Function} Returns the new assigner function.
     */
    function createAssigner(assigner) {
      return baseRest(function(object, sources) {
        var index = -1,
            length = sources.length,
            customizer = length > 1 ? sources[length - 1] : undefined,
            guard = length > 2 ? sources[2] : undefined;

        customizer = (assigner.length > 3 && typeof customizer == 'function')
          ? (length--, customizer)
          : undefined;

        if (guard && isIterateeCall(sources[0], sources[1], guard)) {
          customizer = length < 3 ? undefined : customizer;
          length = 1;
        }
        object = Object(object);
        while (++index < length) {
          var source = sources[index];
          if (source) {
            assigner(object, source, index, customizer);
          }
        }
        return object;
      });
    }

    /**
     * Creates a `baseEach` or `baseEachRight` function.
     *
     * @private
     * @param {Function} eachFunc The function to iterate over a collection.
     * @param {boolean} [fromRight] Specify iterating from right to left.
     * @returns {Function} Returns the new base function.
     */
    function createBaseEach(eachFunc, fromRight) {
      return function(collection, iteratee) {
        if (collection == null) {
          return collection;
        }
        if (!isArrayLike(collection)) {
          return eachFunc(collection, iteratee);
        }
        var length = collection.length,
            index = fromRight ? length : -1,
            iterable = Object(collection);

        while ((fromRight ? index-- : ++index < length)) {
          if (iteratee(iterable[index], index, iterable) === false) {
            break;
          }
        }
        return collection;
      };
    }

    /**
     * Creates a base function for methods like `_.forIn` and `_.forOwn`.
     *
     * @private
     * @param {boolean} [fromRight] Specify iterating from right to left.
     * @returns {Function} Returns the new base function.
     */
    function createBaseFor(fromRight) {
      return function(object, iteratee, keysFunc) {
        var index = -1,
            iterable = Object(object),
            props = keysFunc(object),
            length = props.length;

        while (length--) {
          var key = props[fromRight ? length : ++index];
          if (iteratee(iterable[key], key, iterable) === false) {
            break;
          }
        }
        return object;
      };
    }

    /**
     * Creates a function that wraps `func` to invoke it with the optional `this`
     * binding of `thisArg`.
     *
     * @private
     * @param {Function} func The function to wrap.
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
     * @param {*} [thisArg] The `this` binding of `func`.
     * @returns {Function} Returns the new wrapped function.
     */
    function createBind(func, bitmask, thisArg) {
      var isBind = bitmask & WRAP_BIND_FLAG,
          Ctor = createCtor(func);

      function wrapper() {
        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
        return fn.apply(isBind ? thisArg : this, arguments);
      }
      return wrapper;
    }

    /**
     * Creates a function like `_.lowerFirst`.
     *
     * @private
     * @param {string} methodName The name of the `String` case method to use.
     * @returns {Function} Returns the new case function.
     */
    function createCaseFirst(methodName) {
      return function(string) {
        string = toString(string);

        var strSymbols = hasUnicode(string)
          ? stringToArray(string)
          : undefined;

        var chr = strSymbols
          ? strSymbols[0]
          : string.charAt(0);

        var trailing = strSymbols
          ? castSlice(strSymbols, 1).join('')
          : string.slice(1);

        return chr[methodName]() + trailing;
      };
    }

    /**
     * Creates a function like `_.camelCase`.
     *
     * @private
     * @param {Function} callback The function to combine each word.
     * @returns {Function} Returns the new compounder function.
     */
    function createCompounder(callback) {
      return function(string) {
        return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');
      };
    }

    /**
     * Creates a function that produces an instance of `Ctor` regardless of
     * whether it was invoked as part of a `new` expression or by `call` or `apply`.
     *
     * @private
     * @param {Function} Ctor The constructor to wrap.
     * @returns {Function} Returns the new wrapped function.
     */
    function createCtor(Ctor) {
      return function() {
        // Use a `switch` statement to work with class constructors. See
        // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
        // for more details.
        var args = arguments;
        switch (args.length) {
          case 0: return new Ctor;
          case 1: return new Ctor(args[0]);
          case 2: return new Ctor(args[0], args[1]);
          case 3: return new Ctor(args[0], args[1], args[2]);
          case 4: return new Ctor(args[0], args[1], args[2], args[3]);
          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
        }
        var thisBinding = baseCreate(Ctor.prototype),
            result = Ctor.apply(thisBinding, args);

        // Mimic the constructor's `return` behavior.
        // See https://es5.github.io/#x13.2.2 for more details.
        return isObject(result) ? result : thisBinding;
      };
    }

    /**
     * Creates a function that wraps `func` to enable currying.
     *
     * @private
     * @param {Function} func The function to wrap.
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
     * @param {number} arity The arity of `func`.
     * @returns {Function} Returns the new wrapped function.
     */
    function createCurry(func, bitmask, arity) {
      var Ctor = createCtor(func);

      function wrapper() {
        var length = arguments.length,
            args = Array(length),
            index = length,
            placeholder = getHolder(wrapper);

        while (index--) {
          args[index] = arguments[index];
        }
        var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
          ? []
          : replaceHolders(args, placeholder);

        length -= holders.length;
        if (length < arity) {
          return createRecurry(
            func, bitmask, createHybrid, wrapper.placeholder, undefined,
            args, holders, undefined, undefined, arity - length);
        }
        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
        return apply(fn, this, args);
      }
      return wrapper;
    }

    /**
     * Creates a `_.find` or `_.findLast` function.
     *
     * @private
     * @param {Function} findIndexFunc The function to find the collection index.
     * @returns {Function} Returns the new find function.
     */
    function createFind(findIndexFunc) {
      return function(collection, predicate, fromIndex) {
        var iterable = Object(collection);
        if (!isArrayLike(collection)) {
          var iteratee = getIteratee(predicate, 3);
          collection = keys(collection);
          predicate = function(key) { return iteratee(iterable[key], key, iterable); };
        }
        var index = findIndexFunc(collection, predicate, fromIndex);
        return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
      };
    }

    /**
     * Creates a `_.flow` or `_.flowRight` function.
     *
     * @private
     * @param {boolean} [fromRight] Specify iterating from right to left.
     * @returns {Function} Returns the new flow function.
     */
    function createFlow(fromRight) {
      return flatRest(function(funcs) {
        var length = funcs.length,
            index = length,
            prereq = LodashWrapper.prototype.thru;

        if (fromRight) {
          funcs.reverse();
        }
        while (index--) {
          var func = funcs[index];
          if (typeof func != 'function') {
            throw new TypeError(FUNC_ERROR_TEXT);
          }
          if (prereq && !wrapper && getFuncName(func) == 'wrapper') {
            var wrapper = new LodashWrapper([], true);
          }
        }
        index = wrapper ? index : length;
        while (++index < length) {
          func = funcs[index];

          var funcName = getFuncName(func),
              data = funcName == 'wrapper' ? getData(func) : undefined;

          if (data && isLaziable(data[0]) &&
                data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&
                !data[4].length && data[9] == 1
              ) {
            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
          } else {
            wrapper = (func.length == 1 && isLaziable(func))
              ? wrapper[funcName]()
              : wrapper.thru(func);
          }
        }
        return function() {
          var args = arguments,
              value = args[0];

          if (wrapper && args.length == 1 && isArray(value)) {
            return wrapper.plant(value).value();
          }
          var index = 0,
              result = length ? funcs[index].apply(this, args) : value;

          while (++index < length) {
            result = funcs[index].call(this, result);
          }
          return result;
        };
      });
    }

    /**
     * Creates a function that wraps `func` to invoke it with optional `this`
     * binding of `thisArg`, partial application, and currying.
     *
     * @private
     * @param {Function|string} func The function or method name to wrap.
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
     * @param {*} [thisArg] The `this` binding of `func`.
     * @param {Array} [partials] The arguments to prepend to those provided to
     *  the new function.
     * @param {Array} [holders] The `partials` placeholder indexes.
     * @param {Array} [partialsRight] The arguments to append to those provided
     *  to the new function.
     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
     * @param {Array} [argPos] The argument positions of the new function.
     * @param {number} [ary] The arity cap of `func`.
     * @param {number} [arity] The arity of `func`.
     * @returns {Function} Returns the new wrapped function.
     */
    function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
      var isAry = bitmask & WRAP_ARY_FLAG,
          isBind = bitmask & WRAP_BIND_FLAG,
          isBindKey = bitmask & WRAP_BIND_KEY_FLAG,
          isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),
          isFlip = bitmask & WRAP_FLIP_FLAG,
          Ctor = isBindKey ? undefined : createCtor(func);

      function wrapper() {
        var length = arguments.length,
            args = Array(length),
            index = length;

        while (index--) {
          args[index] = arguments[index];
        }
        if (isCurried) {
          var placeholder = getHolder(wrapper),
              holdersCount = countHolders(args, placeholder);
        }
        if (partials) {
          args = composeArgs(args, partials, holders, isCurried);
        }
        if (partialsRight) {
          args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
        }
        length -= holdersCount;
        if (isCurried && length < arity) {
          var newHolders = replaceHolders(args, placeholder);
          return createRecurry(
            func, bitmask, createHybrid, wrapper.placeholder, thisArg,
            args, newHolders, argPos, ary, arity - length
          );
        }
        var thisBinding = isBind ? thisArg : this,
            fn = isBindKey ? thisBinding[func] : func;

        length = args.length;
        if (argPos) {
          args = reorder(args, argPos);
        } else if (isFlip && length > 1) {
          args.reverse();
        }
        if (isAry && ary < length) {
          args.length = ary;
        }
        if (this && this !== root && this instanceof wrapper) {
          fn = Ctor || createCtor(fn);
        }
        return fn.apply(thisBinding, args);
      }
      return wrapper;
    }

    /**
     * Creates a function like `_.invertBy`.
     *
     * @private
     * @param {Function} setter The function to set accumulator values.
     * @param {Function} toIteratee The function to resolve iteratees.
     * @returns {Function} Returns the new inverter function.
     */
    function createInverter(setter, toIteratee) {
      return function(object, iteratee) {
        return baseInverter(object, setter, toIteratee(iteratee), {});
      };
    }

    /**
     * Creates a function that performs a mathematical operation on two values.
     *
     * @private
     * @param {Function} operator The function to perform the operation.
     * @param {number} [defaultValue] The value used for `undefined` arguments.
     * @returns {Function} Returns the new mathematical operation function.
     */
    function createMathOperation(operator, defaultValue) {
      return function(value, other) {
        var result;
        if (value === undefined && other === undefined) {
          return defaultValue;
        }
        if (value !== undefined) {
          result = value;
        }
        if (other !== undefined) {
          if (result === undefined) {
            return other;
          }
          if (typeof value == 'string' || typeof other == 'string') {
            value = baseToString(value);
            other = baseToString(other);
          } else {
            value = baseToNumber(value);
            other = baseToNumber(other);
          }
          result = operator(value, other);
        }
        return result;
      };
    }

    /**
     * Creates a function like `_.over`.
     *
     * @private
     * @param {Function} arrayFunc The function to iterate over iteratees.
     * @returns {Function} Returns the new over function.
     */
    function createOver(arrayFunc) {
      return flatRest(function(iteratees) {
        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
        return baseRest(function(args) {
          var thisArg = this;
          return arrayFunc(iteratees, function(iteratee) {
            return apply(iteratee, thisArg, args);
          });
        });
      });
    }

    /**
     * Creates the padding for `string` based on `length`. The `chars` string
     * is truncated if the number of characters exceeds `length`.
     *
     * @private
     * @param {number} length The padding length.
     * @param {string} [chars=' '] The string used as padding.
     * @returns {string} Returns the padding for `string`.
     */
    function createPadding(length, chars) {
      chars = chars === undefined ? ' ' : baseToString(chars);

      var charsLength = chars.length;
      if (charsLength < 2) {
        return charsLength ? baseRepeat(chars, length) : chars;
      }
      var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));
      return hasUnicode(chars)
        ? castSlice(stringToArray(result), 0, length).join('')
        : result.slice(0, length);
    }

    /**
     * Creates a function that wraps `func` to invoke it with the `this` binding
     * of `thisArg` and `partials` prepended to the arguments it receives.
     *
     * @private
     * @param {Function} func The function to wrap.
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
     * @param {*} thisArg The `this` binding of `func`.
     * @param {Array} partials The arguments to prepend to those provided to
     *  the new function.
     * @returns {Function} Returns the new wrapped function.
     */
    function createPartial(func, bitmask, thisArg, partials) {
      var isBind = bitmask & WRAP_BIND_FLAG,
          Ctor = createCtor(func);

      function wrapper() {
        var argsIndex = -1,
            argsLength = arguments.length,
            leftIndex = -1,
            leftLength = partials.length,
            args = Array(leftLength + argsLength),
            fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;

        while (++leftIndex < leftLength) {
          args[leftIndex] = partials[leftIndex];
        }
        while (argsLength--) {
          args[leftIndex++] = arguments[++argsIndex];
        }
        return apply(fn, isBind ? thisArg : this, args);
      }
      return wrapper;
    }

    /**
     * Creates a `_.range` or `_.rangeRight` function.
     *
     * @private
     * @param {boolean} [fromRight] Specify iterating from right to left.
     * @returns {Function} Returns the new range function.
     */
    function createRange(fromRight) {
      return function(start, end, step) {
        if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {
          end = step = undefined;
        }
        // Ensure the sign of `-0` is preserved.
        start = toFinite(start);
        if (end === undefined) {
          end = start;
          start = 0;
        } else {
          end = toFinite(end);
        }
        step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);
        return baseRange(start, end, step, fromRight);
      };
    }

    /**
     * Creates a function that performs a relational operation on two values.
     *
     * @private
     * @param {Function} operator The function to perform the operation.
     * @returns {Function} Returns the new relational operation function.
     */
    function createRelationalOperation(operator) {
      return function(value, other) {
        if (!(typeof value == 'string' && typeof other == 'string')) {
          value = toNumber(value);
          other = toNumber(other);
        }
        return operator(value, other);
      };
    }

    /**
     * Creates a function that wraps `func` to continue currying.
     *
     * @private
     * @param {Function} func The function to wrap.
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
     * @param {Function} wrapFunc The function to create the `func` wrapper.
     * @param {*} placeholder The placeholder value.
     * @param {*} [thisArg] The `this` binding of `func`.
     * @param {Array} [partials] The arguments to prepend to those provided to
     *  the new function.
     * @param {Array} [holders] The `partials` placeholder indexes.
     * @param {Array} [argPos] The argument positions of the new function.
     * @param {number} [ary] The arity cap of `func`.
     * @param {number} [arity] The arity of `func`.
     * @returns {Function} Returns the new wrapped function.
     */
    function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
      var isCurry = bitmask & WRAP_CURRY_FLAG,
          newHolders = isCurry ? holders : undefined,
          newHoldersRight = isCurry ? undefined : holders,
          newPartials = isCurry ? partials : undefined,
          newPartialsRight = isCurry ? undefined : partials;

      bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);
      bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);

      if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
        bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);
      }
      var newData = [
        func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
        newHoldersRight, argPos, ary, arity
      ];

      var result = wrapFunc.apply(undefined, newData);
      if (isLaziable(func)) {
        setData(result, newData);
      }
      result.placeholder = placeholder;
      return setWrapToString(result, func, bitmask);
    }

    /**
     * Creates a function like `_.round`.
     *
     * @private
     * @param {string} methodName The name of the `Math` method to use when rounding.
     * @returns {Function} Returns the new round function.
     */
    function createRound(methodName) {
      var func = Math[methodName];
      return function(number, precision) {
        number = toNumber(number);
        precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);
        if (precision && nativeIsFinite(number)) {
          // Shift with exponential notation to avoid floating-point issues.
          // See [MDN](https://mdn.io/round#Examples) for more details.
          var pair = (toString(number) + 'e').split('e'),
              value = func(pair[0] + 'e' + (+pair[1] + precision));

          pair = (toString(value) + 'e').split('e');
          return +(pair[0] + 'e' + (+pair[1] - precision));
        }
        return func(number);
      };
    }

    /**
     * Creates a set object of `values`.
     *
     * @private
     * @param {Array} values The values to add to the set.
     * @returns {Object} Returns the new set.
     */
    var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {
      return new Set(values);
    };

    /**
     * Creates a `_.toPairs` or `_.toPairsIn` function.
     *
     * @private
     * @param {Function} keysFunc The function to get the keys of a given object.
     * @returns {Function} Returns the new pairs function.
     */
    function createToPairs(keysFunc) {
      return function(object) {
        var tag = getTag(object);
        if (tag == mapTag) {
          return mapToArray(object);
        }
        if (tag == setTag) {
          return setToPairs(object);
        }
        return baseToPairs(object, keysFunc(object));
      };
    }

    /**
     * Creates a function that either curries or invokes `func` with optional
     * `this` binding and partially applied arguments.
     *
     * @private
     * @param {Function|string} func The function or method name to wrap.
     * @param {number} bitmask The bitmask flags.
     *    1 - `_.bind`
     *    2 - `_.bindKey`
     *    4 - `_.curry` or `_.curryRight` of a bound function
     *    8 - `_.curry`
     *   16 - `_.curryRight`
     *   32 - `_.partial`
     *   64 - `_.partialRight`
     *  128 - `_.rearg`
     *  256 - `_.ary`
     *  512 - `_.flip`
     * @param {*} [thisArg] The `this` binding of `func`.
     * @param {Array} [partials] The arguments to be partially applied.
     * @param {Array} [holders] The `partials` placeholder indexes.
     * @param {Array} [argPos] The argument positions of the new function.
     * @param {number} [ary] The arity cap of `func`.
     * @param {number} [arity] The arity of `func`.
     * @returns {Function} Returns the new wrapped function.
     */
    function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
      var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
      if (!isBindKey && typeof func != 'function') {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      var length = partials ? partials.length : 0;
      if (!length) {
        bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);
        partials = holders = undefined;
      }
      ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);
      arity = arity === undefined ? arity : toInteger(arity);
      length -= holders ? holders.length : 0;

      if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
        var partialsRight = partials,
            holdersRight = holders;

        partials = holders = undefined;
      }
      var data = isBindKey ? undefined : getData(func);

      var newData = [
        func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
        argPos, ary, arity
      ];

      if (data) {
        mergeData(newData, data);
      }
      func = newData[0];
      bitmask = newData[1];
      thisArg = newData[2];
      partials = newData[3];
      holders = newData[4];
      arity = newData[9] = newData[9] === undefined
        ? (isBindKey ? 0 : func.length)
        : nativeMax(newData[9] - length, 0);

      if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
        bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
      }
      if (!bitmask || bitmask == WRAP_BIND_FLAG) {
        var result = createBind(func, bitmask, thisArg);
      } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
        result = createCurry(func, bitmask, arity);
      } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {
        result = createPartial(func, bitmask, thisArg, partials);
      } else {
        result = createHybrid.apply(undefined, newData);
      }
      var setter = data ? baseSetData : setData;
      return setWrapToString(setter(result, newData), func, bitmask);
    }

    /**
     * Used by `_.defaults` to customize its `_.assignIn` use to assign properties
     * of source objects to the destination object for all destination properties
     * that resolve to `undefined`.
     *
     * @private
     * @param {*} objValue The destination value.
     * @param {*} srcValue The source value.
     * @param {string} key The key of the property to assign.
     * @param {Object} object The parent object of `objValue`.
     * @returns {*} Returns the value to assign.
     */
    function customDefaultsAssignIn(objValue, srcValue, key, object) {
      if (objValue === undefined ||
          (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {
        return srcValue;
      }
      return objValue;
    }

    /**
     * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source
     * objects into destination objects that are passed thru.
     *
     * @private
     * @param {*} objValue The destination value.
     * @param {*} srcValue The source value.
     * @param {string} key The key of the property to merge.
     * @param {Object} object The parent object of `objValue`.
     * @param {Object} source The parent object of `srcValue`.
     * @param {Object} [stack] Tracks traversed source values and their merged
     *  counterparts.
     * @returns {*} Returns the value to assign.
     */
    function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {
      if (isObject(objValue) && isObject(srcValue)) {
        // Recursively merge objects and arrays (susceptible to call stack limits).
        stack.set(srcValue, objValue);
        baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);
        stack['delete'](srcValue);
      }
      return objValue;
    }

    /**
     * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
     * objects.
     *
     * @private
     * @param {*} value The value to inspect.
     * @param {string} key The key of the property to inspect.
     * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
     */
    function customOmitClone(value) {
      return isPlainObject(value) ? undefined : value;
    }

    /**
     * A specialized version of `baseIsEqualDeep` for arrays with support for
     * partial deep comparisons.
     *
     * @private
     * @param {Array} array The array to compare.
     * @param {Array} other The other array to compare.
     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
     * @param {Function} customizer The function to customize comparisons.
     * @param {Function} equalFunc The function to determine equivalents of values.
     * @param {Object} stack Tracks traversed `array` and `other` objects.
     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
     */
    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
          arrLength = array.length,
          othLength = other.length;

      if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
        return false;
      }
      // Check that cyclic values are equal.
      var arrStacked = stack.get(array);
      var othStacked = stack.get(other);
      if (arrStacked && othStacked) {
        return arrStacked == other && othStacked == array;
      }
      var index = -1,
          result = true,
          seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;

      stack.set(array, other);
      stack.set(other, array);

      // Ignore non-index properties.
      while (++index < arrLength) {
        var arrValue = array[index],
            othValue = other[index];

        if (customizer) {
          var compared = isPartial
            ? customizer(othValue, arrValue, index, other, array, stack)
            : customizer(arrValue, othValue, index, array, other, stack);
        }
        if (compared !== undefined) {
          if (compared) {
            continue;
          }
          result = false;
          break;
        }
        // Recursively compare arrays (susceptible to call stack limits).
        if (seen) {
          if (!arraySome(other, function(othValue, othIndex) {
                if (!cacheHas(seen, othIndex) &&
                    (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
                  return seen.push(othIndex);
                }
              })) {
            result = false;
            break;
          }
        } else if (!(
              arrValue === othValue ||
                equalFunc(arrValue, othValue, bitmask, customizer, stack)
            )) {
          result = false;
          break;
        }
      }
      stack['delete'](array);
      stack['delete'](other);
      return result;
    }

    /**
     * A specialized version of `baseIsEqualDeep` for comparing objects of
     * the same `toStringTag`.
     *
     * **Note:** This function only supports comparing values with tags of
     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
     *
     * @private
     * @param {Object} object The object to compare.
     * @param {Object} other The other object to compare.
     * @param {string} tag The `toStringTag` of the objects to compare.
     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
     * @param {Function} customizer The function to customize comparisons.
     * @param {Function} equalFunc The function to determine equivalents of values.
     * @param {Object} stack Tracks traversed `object` and `other` objects.
     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
     */
    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
      switch (tag) {
        case dataViewTag:
          if ((object.byteLength != other.byteLength) ||
              (object.byteOffset != other.byteOffset)) {
            return false;
          }
          object = object.buffer;
          other = other.buffer;

        case arrayBufferTag:
          if ((object.byteLength != other.byteLength) ||
              !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
            return false;
          }
          return true;

        case boolTag:
        case dateTag:
        case numberTag:
          // Coerce booleans to `1` or `0` and dates to milliseconds.
          // Invalid dates are coerced to `NaN`.
          return eq(+object, +other);

        case errorTag:
          return object.name == other.name && object.message == other.message;

        case regexpTag:
        case stringTag:
          // Coerce regexes to strings and treat strings, primitives and objects,
          // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
          // for more details.
          return object == (other + '');

        case mapTag:
          var convert = mapToArray;

        case setTag:
          var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
          convert || (convert = setToArray);

          if (object.size != other.size && !isPartial) {
            return false;
          }
          // Assume cyclic values are equal.
          var stacked = stack.get(object);
          if (stacked) {
            return stacked == other;
          }
          bitmask |= COMPARE_UNORDERED_FLAG;

          // Recursively compare objects (susceptible to call stack limits).
          stack.set(object, other);
          var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
          stack['delete'](object);
          return result;

        case symbolTag:
          if (symbolValueOf) {
            return symbolValueOf.call(object) == symbolValueOf.call(other);
          }
      }
      return false;
    }

    /**
     * A specialized version of `baseIsEqualDeep` for objects with support for
     * partial deep comparisons.
     *
     * @private
     * @param {Object} object The object to compare.
     * @param {Object} other The other object to compare.
     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
     * @param {Function} customizer The function to customize comparisons.
     * @param {Function} equalFunc The function to determine equivalents of values.
     * @param {Object} stack Tracks traversed `object` and `other` objects.
     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
     */
    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
          objProps = getAllKeys(object),
          objLength = objProps.length,
          othProps = getAllKeys(other),
          othLength = othProps.length;

      if (objLength != othLength && !isPartial) {
        return false;
      }
      var index = objLength;
      while (index--) {
        var key = objProps[index];
        if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
          return false;
        }
      }
      // Check that cyclic values are equal.
      var objStacked = stack.get(object);
      var othStacked = stack.get(other);
      if (objStacked && othStacked) {
        return objStacked == other && othStacked == object;
      }
      var result = true;
      stack.set(object, other);
      stack.set(other, object);

      var skipCtor = isPartial;
      while (++index < objLength) {
        key = objProps[index];
        var objValue = object[key],
            othValue = other[key];

        if (customizer) {
          var compared = isPartial
            ? customizer(othValue, objValue, key, other, object, stack)
            : customizer(objValue, othValue, key, object, other, stack);
        }
        // Recursively compare objects (susceptible to call stack limits).
        if (!(compared === undefined
              ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
              : compared
            )) {
          result = false;
          break;
        }
        skipCtor || (skipCtor = key == 'constructor');
      }
      if (result && !skipCtor) {
        var objCtor = object.constructor,
            othCtor = other.constructor;

        // Non `Object` object instances with different constructors are not equal.
        if (objCtor != othCtor &&
            ('constructor' in object && 'constructor' in other) &&
            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
              typeof othCtor == 'function' && othCtor instanceof othCtor)) {
          result = false;
        }
      }
      stack['delete'](object);
      stack['delete'](other);
      return result;
    }

    /**
     * A specialized version of `baseRest` which flattens the rest array.
     *
     * @private
     * @param {Function} func The function to apply a rest parameter to.
     * @returns {Function} Returns the new function.
     */
    function flatRest(func) {
      return setToString(overRest(func, undefined, flatten), func + '');
    }

    /**
     * Creates an array of own enumerable property names and symbols of `object`.
     *
     * @private
     * @param {Object} object The object to query.
     * @returns {Array} Returns the array of property names and symbols.
     */
    function getAllKeys(object) {
      return baseGetAllKeys(object, keys, getSymbols);
    }

    /**
     * Creates an array of own and inherited enumerable property names and
     * symbols of `object`.
     *
     * @private
     * @param {Object} object The object to query.
     * @returns {Array} Returns the array of property names and symbols.
     */
    function getAllKeysIn(object) {
      return baseGetAllKeys(object, keysIn, getSymbolsIn);
    }

    /**
     * Gets metadata for `func`.
     *
     * @private
     * @param {Function} func The function to query.
     * @returns {*} Returns the metadata for `func`.
     */
    var getData = !metaMap ? noop : function(func) {
      return metaMap.get(func);
    };

    /**
     * Gets the name of `func`.
     *
     * @private
     * @param {Function} func The function to query.
     * @returns {string} Returns the function name.
     */
    function getFuncName(func) {
      var result = (func.name + ''),
          array = realNames[result],
          length = hasOwnProperty.call(realNames, result) ? array.length : 0;

      while (length--) {
        var data = array[length],
            otherFunc = data.func;
        if (otherFunc == null || otherFunc == func) {
          return data.name;
        }
      }
      return result;
    }

    /**
     * Gets the argument placeholder value for `func`.
     *
     * @private
     * @param {Function} func The function to inspect.
     * @returns {*} Returns the placeholder value.
     */
    function getHolder(func) {
      var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;
      return object.placeholder;
    }

    /**
     * Gets the appropriate "iteratee" function. If `_.iteratee` is customized,
     * this function returns the custom method, otherwise it returns `baseIteratee`.
     * If arguments are provided, the chosen function is invoked with them and
     * its result is returned.
     *
     * @private
     * @param {*} [value] The value to convert to an iteratee.
     * @param {number} [arity] The arity of the created iteratee.
     * @returns {Function} Returns the chosen function or its result.
     */
    function getIteratee() {
      var result = lodash.iteratee || iteratee;
      result = result === iteratee ? baseIteratee : result;
      return arguments.length ? result(arguments[0], arguments[1]) : result;
    }

    /**
     * Gets the data for `map`.
     *
     * @private
     * @param {Object} map The map to query.
     * @param {string} key The reference key.
     * @returns {*} Returns the map data.
     */
    function getMapData(map, key) {
      var data = map.__data__;
      return isKeyable(key)
        ? data[typeof key == 'string' ? 'string' : 'hash']
        : data.map;
    }

    /**
     * Gets the property names, values, and compare flags of `object`.
     *
     * @private
     * @param {Object} object The object to query.
     * @returns {Array} Returns the match data of `object`.
     */
    function getMatchData(object) {
      var result = keys(object),
          length = result.length;

      while (length--) {
        var key = result[length],
            value = object[key];

        result[length] = [key, value, isStrictComparable(value)];
      }
      return result;
    }

    /**
     * Gets the native function at `key` of `object`.
     *
     * @private
     * @param {Object} object The object to query.
     * @param {string} key The key of the method to get.
     * @returns {*} Returns the function if it's native, else `undefined`.
     */
    function getNative(object, key) {
      var value = getValue(object, key);
      return baseIsNative(value) ? value : undefined;
    }

    /**
     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
     *
     * @private
     * @param {*} value The value to query.
     * @returns {string} Returns the raw `toStringTag`.
     */
    function getRawTag(value) {
      var isOwn = hasOwnProperty.call(value, symToStringTag),
          tag = value[symToStringTag];

      try {
        value[symToStringTag] = undefined;
        var unmasked = true;
      } catch (e) {}

      var result = nativeObjectToString.call(value);
      if (unmasked) {
        if (isOwn) {
          value[symToStringTag] = tag;
        } else {
          delete value[symToStringTag];
        }
      }
      return result;
    }

    /**
     * Creates an array of the own enumerable symbols of `object`.
     *
     * @private
     * @param {Object} object The object to query.
     * @returns {Array} Returns the array of symbols.
     */
    var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
      if (object == null) {
        return [];
      }
      object = Object(object);
      return arrayFilter(nativeGetSymbols(object), function(symbol) {
        return propertyIsEnumerable.call(object, symbol);
      });
    };

    /**
     * Creates an array of the own and inherited enumerable symbols of `object`.
     *
     * @private
     * @param {Object} object The object to query.
     * @returns {Array} Returns the array of symbols.
     */
    var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {
      var result = [];
      while (object) {
        arrayPush(result, getSymbols(object));
        object = getPrototype(object);
      }
      return result;
    };

    /**
     * Gets the `toStringTag` of `value`.
     *
     * @private
     * @param {*} value The value to query.
     * @returns {string} Returns the `toStringTag`.
     */
    var getTag = baseGetTag;

    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
    if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
        (Map && getTag(new Map) != mapTag) ||
        (Promise && getTag(Promise.resolve()) != promiseTag) ||
        (Set && getTag(new Set) != setTag) ||
        (WeakMap && getTag(new WeakMap) != weakMapTag)) {
      getTag = function(value) {
        var result = baseGetTag(value),
            Ctor = result == objectTag ? value.constructor : undefined,
            ctorString = Ctor ? toSource(Ctor) : '';

        if (ctorString) {
          switch (ctorString) {
            case dataViewCtorString: return dataViewTag;
            case mapCtorString: return mapTag;
            case promiseCtorString: return promiseTag;
            case setCtorString: return setTag;
            case weakMapCtorString: return weakMapTag;
          }
        }
        return result;
      };
    }

    /**
     * Gets the view, applying any `transforms` to the `start` and `end` positions.
     *
     * @private
     * @param {number} start The start of the view.
     * @param {number} end The end of the view.
     * @param {Array} transforms The transformations to apply to the view.
     * @returns {Object} Returns an object containing the `start` and `end`
     *  positions of the view.
     */
    function getView(start, end, transforms) {
      var index = -1,
          length = transforms.length;

      while (++index < length) {
        var data = transforms[index],
            size = data.size;

        switch (data.type) {
          case 'drop':      start += size; break;
          case 'dropRight': end -= size; break;
          case 'take':      end = nativeMin(end, start + size); break;
          case 'takeRight': start = nativeMax(start, end - size); break;
        }
      }
      return { 'start': start, 'end': end };
    }

    /**
     * Extracts wrapper details from the `source` body comment.
     *
     * @private
     * @param {string} source The source to inspect.
     * @returns {Array} Returns the wrapper details.
     */
    function getWrapDetails(source) {
      var match = source.match(reWrapDetails);
      return match ? match[1].split(reSplitDetails) : [];
    }

    /**
     * Checks if `path` exists on `object`.
     *
     * @private
     * @param {Object} object The object to query.
     * @param {Array|string} path The path to check.
     * @param {Function} hasFunc The function to check properties.
     * @returns {boolean} Returns `true` if `path` exists, else `false`.
     */
    function hasPath(object, path, hasFunc) {
      path = castPath(path, object);

      var index = -1,
          length = path.length,
          result = false;

      while (++index < length) {
        var key = toKey(path[index]);
        if (!(result = object != null && hasFunc(object, key))) {
          break;
        }
        object = object[key];
      }
      if (result || ++index != length) {
        return result;
      }
      length = object == null ? 0 : object.length;
      return !!length && isLength(length) && isIndex(key, length) &&
        (isArray(object) || isArguments(object));
    }

    /**
     * Initializes an array clone.
     *
     * @private
     * @param {Array} array The array to clone.
     * @returns {Array} Returns the initialized clone.
     */
    function initCloneArray(array) {
      var length = array.length,
          result = new array.constructor(length);

      // Add properties assigned by `RegExp#exec`.
      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
        result.index = array.index;
        result.input = array.input;
      }
      return result;
    }

    /**
     * Initializes an object clone.
     *
     * @private
     * @param {Object} object The object to clone.
     * @returns {Object} Returns the initialized clone.
     */
    function initCloneObject(object) {
      return (typeof object.constructor == 'function' && !isPrototype(object))
        ? baseCreate(getPrototype(object))
        : {};
    }

    /**
     * Initializes an object clone based on its `toStringTag`.
     *
     * **Note:** This function only supports cloning values with tags of
     * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
     *
     * @private
     * @param {Object} object The object to clone.
     * @param {string} tag The `toStringTag` of the object to clone.
     * @param {boolean} [isDeep] Specify a deep clone.
     * @returns {Object} Returns the initialized clone.
     */
    function initCloneByTag(object, tag, isDeep) {
      var Ctor = object.constructor;
      switch (tag) {
        case arrayBufferTag:
          return cloneArrayBuffer(object);

        case boolTag:
        case dateTag:
          return new Ctor(+object);

        case dataViewTag:
          return cloneDataView(object, isDeep);

        case float32Tag: case float64Tag:
        case int8Tag: case int16Tag: case int32Tag:
        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
          return cloneTypedArray(object, isDeep);

        case mapTag:
          return new Ctor;

        case numberTag:
        case stringTag:
          return new Ctor(object);

        case regexpTag:
          return cloneRegExp(object);

        case setTag:
          return new Ctor;

        case symbolTag:
          return cloneSymbol(object);
      }
    }

    /**
     * Inserts wrapper `details` in a comment at the top of the `source` body.
     *
     * @private
     * @param {string} source The source to modify.
     * @returns {Array} details The details to insert.
     * @returns {string} Returns the modified source.
     */
    function insertWrapDetails(source, details) {
      var length = details.length;
      if (!length) {
        return source;
      }
      var lastIndex = length - 1;
      details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
      details = details.join(length > 2 ? ', ' : ' ');
      return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
    }

    /**
     * Checks if `value` is a flattenable `arguments` object or array.
     *
     * @private
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
     */
    function isFlattenable(value) {
      return isArray(value) || isArguments(value) ||
        !!(spreadableSymbol && value && value[spreadableSymbol]);
    }

    /**
     * Checks if `value` is a valid array-like index.
     *
     * @private
     * @param {*} value The value to check.
     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
     */
    function isIndex(value, length) {
      var type = typeof value;
      length = length == null ? MAX_SAFE_INTEGER : length;

      return !!length &&
        (type == 'number' ||
          (type != 'symbol' && reIsUint.test(value))) &&
            (value > -1 && value % 1 == 0 && value < length);
    }

    /**
     * Checks if the given arguments are from an iteratee call.
     *
     * @private
     * @param {*} value The potential iteratee value argument.
     * @param {*} index The potential iteratee index or key argument.
     * @param {*} object The potential iteratee object argument.
     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
     *  else `false`.
     */
    function isIterateeCall(value, index, object) {
      if (!isObject(object)) {
        return false;
      }
      var type = typeof index;
      if (type == 'number'
            ? (isArrayLike(object) && isIndex(index, object.length))
            : (type == 'string' && index in object)
          ) {
        return eq(object[index], value);
      }
      return false;
    }

    /**
     * Checks if `value` is a property name and not a property path.
     *
     * @private
     * @param {*} value The value to check.
     * @param {Object} [object] The object to query keys on.
     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
     */
    function isKey(value, object) {
      if (isArray(value)) {
        return false;
      }
      var type = typeof value;
      if (type == 'number' || type == 'symbol' || type == 'boolean' ||
          value == null || isSymbol(value)) {
        return true;
      }
      return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
        (object != null && value in Object(object));
    }

    /**
     * Checks if `value` is suitable for use as unique object key.
     *
     * @private
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
     */
    function isKeyable(value) {
      var type = typeof value;
      return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
        ? (value !== '__proto__')
        : (value === null);
    }

    /**
     * Checks if `func` has a lazy counterpart.
     *
     * @private
     * @param {Function} func The function to check.
     * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
     *  else `false`.
     */
    function isLaziable(func) {
      var funcName = getFuncName(func),
          other = lodash[funcName];

      if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
        return false;
      }
      if (func === other) {
        return true;
      }
      var data = getData(other);
      return !!data && func === data[0];
    }

    /**
     * Checks if `func` has its source masked.
     *
     * @private
     * @param {Function} func The function to check.
     * @returns {boolean} Returns `true` if `func` is masked, else `false`.
     */
    function isMasked(func) {
      return !!maskSrcKey && (maskSrcKey in func);
    }

    /**
     * Checks if `func` is capable of being masked.
     *
     * @private
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `func` is maskable, else `false`.
     */
    var isMaskable = coreJsData ? isFunction : stubFalse;

    /**
     * Checks if `value` is likely a prototype object.
     *
     * @private
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
     */
    function isPrototype(value) {
      var Ctor = value && value.constructor,
          proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;

      return value === proto;
    }

    /**
     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
     *
     * @private
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` if suitable for strict
     *  equality comparisons, else `false`.
     */
    function isStrictComparable(value) {
      return value === value && !isObject(value);
    }

    /**
     * A specialized version of `matchesProperty` for source values suitable
     * for strict equality comparisons, i.e. `===`.
     *
     * @private
     * @param {string} key The key of the property to get.
     * @param {*} srcValue The value to match.
     * @returns {Function} Returns the new spec function.
     */
    function matchesStrictComparable(key, srcValue) {
      return function(object) {
        if (object == null) {
          return false;
        }
        return object[key] === srcValue &&
          (srcValue !== undefined || (key in Object(object)));
      };
    }

    /**
     * A specialized version of `_.memoize` which clears the memoized function's
     * cache when it exceeds `MAX_MEMOIZE_SIZE`.
     *
     * @private
     * @param {Function} func The function to have its output memoized.
     * @returns {Function} Returns the new memoized function.
     */
    function memoizeCapped(func) {
      var result = memoize(func, function(key) {
        if (cache.size === MAX_MEMOIZE_SIZE) {
          cache.clear();
        }
        return key;
      });

      var cache = result.cache;
      return result;
    }

    /**
     * Merges the function metadata of `source` into `data`.
     *
     * Merging metadata reduces the number of wrappers used to invoke a function.
     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
     * may be applied regardless of execution order. Methods like `_.ary` and
     * `_.rearg` modify function arguments, making the order in which they are
     * executed important, preventing the merging of metadata. However, we make
     * an exception for a safe combined case where curried functions have `_.ary`
     * and or `_.rearg` applied.
     *
     * @private
     * @param {Array} data The destination metadata.
     * @param {Array} source The source metadata.
     * @returns {Array} Returns `data`.
     */
    function mergeData(data, source) {
      var bitmask = data[1],
          srcBitmask = source[1],
          newBitmask = bitmask | srcBitmask,
          isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);

      var isCombo =
        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||
        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||
        ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));

      // Exit early if metadata can't be merged.
      if (!(isCommon || isCombo)) {
        return data;
      }
      // Use source `thisArg` if available.
      if (srcBitmask & WRAP_BIND_FLAG) {
        data[2] = source[2];
        // Set when currying a bound function.
        newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;
      }
      // Compose partial arguments.
      var value = source[3];
      if (value) {
        var partials = data[3];
        data[3] = partials ? composeArgs(partials, value, source[4]) : value;
        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];
      }
      // Compose partial right arguments.
      value = source[5];
      if (value) {
        partials = data[5];
        data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];
      }
      // Use source `argPos` if available.
      value = source[7];
      if (value) {
        data[7] = value;
      }
      // Use source `ary` if it's smaller.
      if (srcBitmask & WRAP_ARY_FLAG) {
        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);
      }
      // Use source `arity` if one is not provided.
      if (data[9] == null) {
        data[9] = source[9];
      }
      // Use source `func` and merge bitmasks.
      data[0] = source[0];
      data[1] = newBitmask;

      return data;
    }

    /**
     * This function is like
     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
     * except that it includes inherited enumerable properties.
     *
     * @private
     * @param {Object} object The object to query.
     * @returns {Array} Returns the array of property names.
     */
    function nativeKeysIn(object) {
      var result = [];
      if (object != null) {
        for (var key in Object(object)) {
          result.push(key);
        }
      }
      return result;
    }

    /**
     * Converts `value` to a string using `Object.prototype.toString`.
     *
     * @private
     * @param {*} value The value to convert.
     * @returns {string} Returns the converted string.
     */
    function objectToString(value) {
      return nativeObjectToString.call(value);
    }

    /**
     * A specialized version of `baseRest` which transforms the rest array.
     *
     * @private
     * @param {Function} func The function to apply a rest parameter to.
     * @param {number} [start=func.length-1] The start position of the rest parameter.
     * @param {Function} transform The rest array transform.
     * @returns {Function} Returns the new function.
     */
    function overRest(func, start, transform) {
      start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
      return function() {
        var args = arguments,
            index = -1,
            length = nativeMax(args.length - start, 0),
            array = Array(length);

        while (++index < length) {
          array[index] = args[start + index];
        }
        index = -1;
        var otherArgs = Array(start + 1);
        while (++index < start) {
          otherArgs[index] = args[index];
        }
        otherArgs[start] = transform(array);
        return apply(func, this, otherArgs);
      };
    }

    /**
     * Gets the parent value at `path` of `object`.
     *
     * @private
     * @param {Object} object The object to query.
     * @param {Array} path The path to get the parent value of.
     * @returns {*} Returns the parent value.
     */
    function parent(object, path) {
      return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
    }

    /**
     * Reorder `array` according to the specified indexes where the element at
     * the first index is assigned as the first element, the element at
     * the second index is assigned as the second element, and so on.
     *
     * @private
     * @param {Array} array The array to reorder.
     * @param {Array} indexes The arranged array indexes.
     * @returns {Array} Returns `array`.
     */
    function reorder(array, indexes) {
      var arrLength = array.length,
          length = nativeMin(indexes.length, arrLength),
          oldArray = copyArray(array);

      while (length--) {
        var index = indexes[length];
        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
      }
      return array;
    }

    /**
     * Gets the value at `key`, unless `key` is "__proto__" or "constructor".
     *
     * @private
     * @param {Object} object The object to query.
     * @param {string} key The key of the property to get.
     * @returns {*} Returns the property value.
     */
    function safeGet(object, key) {
      if (key === 'constructor' && typeof object[key] === 'function') {
        return;
      }

      if (key == '__proto__') {
        return;
      }

      return object[key];
    }

    /**
     * Sets metadata for `func`.
     *
     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
     * period of time, it will trip its breaker and transition to an identity
     * function to avoid garbage collection pauses in V8. See
     * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
     * for more details.
     *
     * @private
     * @param {Function} func The function to associate metadata with.
     * @param {*} data The metadata.
     * @returns {Function} Returns `func`.
     */
    var setData = shortOut(baseSetData);

    /**
     * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).
     *
     * @private
     * @param {Function} func The function to delay.
     * @param {number} wait The number of milliseconds to delay invocation.
     * @returns {number|Object} Returns the timer id or timeout object.
     */
    var setTimeout = ctxSetTimeout || function(func, wait) {
      return root.setTimeout(func, wait);
    };

    /**
     * Sets the `toString` method of `func` to return `string`.
     *
     * @private
     * @param {Function} func The function to modify.
     * @param {Function} string The `toString` result.
     * @returns {Function} Returns `func`.
     */
    var setToString = shortOut(baseSetToString);

    /**
     * Sets the `toString` method of `wrapper` to mimic the source of `reference`
     * with wrapper details in a comment at the top of the source body.
     *
     * @private
     * @param {Function} wrapper The function to modify.
     * @param {Function} reference The reference function.
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
     * @returns {Function} Returns `wrapper`.
     */
    function setWrapToString(wrapper, reference, bitmask) {
      var source = (reference + '');
      return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
    }

    /**
     * Creates a function that'll short out and invoke `identity` instead
     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
     * milliseconds.
     *
     * @private
     * @param {Function} func The function to restrict.
     * @returns {Function} Returns the new shortable function.
     */
    function shortOut(func) {
      var count = 0,
          lastCalled = 0;

      return function() {
        var stamp = nativeNow(),
            remaining = HOT_SPAN - (stamp - lastCalled);

        lastCalled = stamp;
        if (remaining > 0) {
          if (++count >= HOT_COUNT) {
            return arguments[0];
          }
        } else {
          count = 0;
        }
        return func.apply(undefined, arguments);
      };
    }

    /**
     * A specialized version of `_.shuffle` which mutates and sets the size of `array`.
     *
     * @private
     * @param {Array} array The array to shuffle.
     * @param {number} [size=array.length] The size of `array`.
     * @returns {Array} Returns `array`.
     */
    function shuffleSelf(array, size) {
      var index = -1,
          length = array.length,
          lastIndex = length - 1;

      size = size === undefined ? length : size;
      while (++index < size) {
        var rand = baseRandom(index, lastIndex),
            value = array[rand];

        array[rand] = array[index];
        array[index] = value;
      }
      array.length = size;
      return array;
    }

    /**
     * Converts `string` to a property path array.
     *
     * @private
     * @param {string} string The string to convert.
     * @returns {Array} Returns the property path array.
     */
    var stringToPath = memoizeCapped(function(string) {
      var result = [];
      if (string.charCodeAt(0) === 46 /* . */) {
        result.push('');
      }
      string.replace(rePropName, function(match, number, quote, subString) {
        result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
      });
      return result;
    });

    /**
     * Converts `value` to a string key if it's not a string or symbol.
     *
     * @private
     * @param {*} value The value to inspect.
     * @returns {string|symbol} Returns the key.
     */
    function toKey(value) {
      if (typeof value == 'string' || isSymbol(value)) {
        return value;
      }
      var result = (value + '');
      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
    }

    /**
     * Converts `func` to its source code.
     *
     * @private
     * @param {Function} func The function to convert.
     * @returns {string} Returns the source code.
     */
    function toSource(func) {
      if (func != null) {
        try {
          return funcToString.call(func);
        } catch (e) {}
        try {
          return (func + '');
        } catch (e) {}
      }
      return '';
    }

    /**
     * Updates wrapper `details` based on `bitmask` flags.
     *
     * @private
     * @returns {Array} details The details to modify.
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
     * @returns {Array} Returns `details`.
     */
    function updateWrapDetails(details, bitmask) {
      arrayEach(wrapFlags, function(pair) {
        var value = '_.' + pair[0];
        if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
          details.push(value);
        }
      });
      return details.sort();
    }

    /**
     * Creates a clone of `wrapper`.
     *
     * @private
     * @param {Object} wrapper The wrapper to clone.
     * @returns {Object} Returns the cloned wrapper.
     */
    function wrapperClone(wrapper) {
      if (wrapper instanceof LazyWrapper) {
        return wrapper.clone();
      }
      var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
      result.__actions__ = copyArray(wrapper.__actions__);
      result.__index__  = wrapper.__index__;
      result.__values__ = wrapper.__values__;
      return result;
    }

    /*------------------------------------------------------------------------*/

    /**
     * Creates an array of elements split into groups the length of `size`.
     * If `array` can't be split evenly, the final chunk will be the remaining
     * elements.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Array
     * @param {Array} array The array to process.
     * @param {number} [size=1] The length of each chunk
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {Array} Returns the new array of chunks.
     * @example
     *
     * _.chunk(['a', 'b', 'c', 'd'], 2);
     * // => [['a', 'b'], ['c', 'd']]
     *
     * _.chunk(['a', 'b', 'c', 'd'], 3);
     * // => [['a', 'b', 'c'], ['d']]
     */
    function chunk(array, size, guard) {
      if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
        size = 1;
      } else {
        size = nativeMax(toInteger(size), 0);
      }
      var length = array == null ? 0 : array.length;
      if (!length || size < 1) {
        return [];
      }
      var index = 0,
          resIndex = 0,
          result = Array(nativeCeil(length / size));

      while (index < length) {
        result[resIndex++] = baseSlice(array, index, (index += size));
      }
      return result;
    }

    /**
     * Creates an array with all falsey values removed. The values `false`, `null`,
     * `0`, `""`, `undefined`, and `NaN` are falsey.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {Array} array The array to compact.
     * @returns {Array} Returns the new array of filtered values.
     * @example
     *
     * _.compact([0, 1, false, 2, '', 3]);
     * // => [1, 2, 3]
     */
    function compact(array) {
      var index = -1,
          length = array == null ? 0 : array.length,
          resIndex = 0,
          result = [];

      while (++index < length) {
        var value = array[index];
        if (value) {
          result[resIndex++] = value;
        }
      }
      return result;
    }

    /**
     * Creates a new array concatenating `array` with any additional arrays
     * and/or values.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to concatenate.
     * @param {...*} [values] The values to concatenate.
     * @returns {Array} Returns the new concatenated array.
     * @example
     *
     * var array = [1];
     * var other = _.concat(array, 2, [3], [[4]]);
     *
     * console.log(other);
     * // => [1, 2, 3, [4]]
     *
     * console.log(array);
     * // => [1]
     */
    function concat() {
      var length = arguments.length;
      if (!length) {
        return [];
      }
      var args = Array(length - 1),
          array = arguments[0],
          index = length;

      while (index--) {
        args[index - 1] = arguments[index];
      }
      return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
    }

    /**
     * Creates an array of `array` values not included in the other given arrays
     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
     * for equality comparisons. The order and references of result values are
     * determined by the first array.
     *
     * **Note:** Unlike `_.pullAll`, this method returns a new array.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @param {...Array} [values] The values to exclude.
     * @returns {Array} Returns the new array of filtered values.
     * @see _.without, _.xor
     * @example
     *
     * _.difference([2, 1], [2, 3]);
     * // => [1]
     */
    var difference = baseRest(function(array, values) {
      return isArrayLikeObject(array)
        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
        : [];
    });

    /**
     * This method is like `_.difference` except that it accepts `iteratee` which
     * is invoked for each element of `array` and `values` to generate the criterion
     * by which they're compared. The order and references of result values are
     * determined by the first array. The iteratee is invoked with one argument:
     * (value).
     *
     * **Note:** Unlike `_.pullAllBy`, this method returns a new array.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @param {...Array} [values] The values to exclude.
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
     * @returns {Array} Returns the new array of filtered values.
     * @example
     *
     * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);
     * // => [1.2]
     *
     * // The `_.property` iteratee shorthand.
     * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');
     * // => [{ 'x': 2 }]
     */
    var differenceBy = baseRest(function(array, values) {
      var iteratee = last(values);
      if (isArrayLikeObject(iteratee)) {
        iteratee = undefined;
      }
      return isArrayLikeObject(array)
        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))
        : [];
    });

    /**
     * This method is like `_.difference` except that it accepts `comparator`
     * which is invoked to compare elements of `array` to `values`. The order and
     * references of result values are determined by the first array. The comparator
     * is invoked with two arguments: (arrVal, othVal).
     *
     * **Note:** Unlike `_.pullAllWith`, this method returns a new array.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @param {...Array} [values] The values to exclude.
     * @param {Function} [comparator] The comparator invoked per element.
     * @returns {Array} Returns the new array of filtered values.
     * @example
     *
     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
     *
     * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);
     * // => [{ 'x': 2, 'y': 1 }]
     */
    var differenceWith = baseRest(function(array, values) {
      var comparator = last(values);
      if (isArrayLikeObject(comparator)) {
        comparator = undefined;
      }
      return isArrayLikeObject(array)
        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)
        : [];
    });

    /**
     * Creates a slice of `array` with `n` elements dropped from the beginning.
     *
     * @static
     * @memberOf _
     * @since 0.5.0
     * @category Array
     * @param {Array} array The array to query.
     * @param {number} [n=1] The number of elements to drop.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {Array} Returns the slice of `array`.
     * @example
     *
     * _.drop([1, 2, 3]);
     * // => [2, 3]
     *
     * _.drop([1, 2, 3], 2);
     * // => [3]
     *
     * _.drop([1, 2, 3], 5);
     * // => []
     *
     * _.drop([1, 2, 3], 0);
     * // => [1, 2, 3]
     */
    function drop(array, n, guard) {
      var length = array == null ? 0 : array.length;
      if (!length) {
        return [];
      }
      n = (guard || n === undefined) ? 1 : toInteger(n);
      return baseSlice(array, n < 0 ? 0 : n, length);
    }

    /**
     * Creates a slice of `array` with `n` elements dropped from the end.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Array
     * @param {Array} array The array to query.
     * @param {number} [n=1] The number of elements to drop.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {Array} Returns the slice of `array`.
     * @example
     *
     * _.dropRight([1, 2, 3]);
     * // => [1, 2]
     *
     * _.dropRight([1, 2, 3], 2);
     * // => [1]
     *
     * _.dropRight([1, 2, 3], 5);
     * // => []
     *
     * _.dropRight([1, 2, 3], 0);
     * // => [1, 2, 3]
     */
    function dropRight(array, n, guard) {
      var length = array == null ? 0 : array.length;
      if (!length) {
        return [];
      }
      n = (guard || n === undefined) ? 1 : toInteger(n);
      n = length - n;
      return baseSlice(array, 0, n < 0 ? 0 : n);
    }

    /**
     * Creates a slice of `array` excluding elements dropped from the end.
     * Elements are dropped until `predicate` returns falsey. The predicate is
     * invoked with three arguments: (value, index, array).
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Array
     * @param {Array} array The array to query.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @returns {Array} Returns the slice of `array`.
     * @example
     *
     * var users = [
     *   { 'user': 'barney',  'active': true },
     *   { 'user': 'fred',    'active': false },
     *   { 'user': 'pebbles', 'active': false }
     * ];
     *
     * _.dropRightWhile(users, function(o) { return !o.active; });
     * // => objects for ['barney']
     *
     * // The `_.matches` iteratee shorthand.
     * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });
     * // => objects for ['barney', 'fred']
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.dropRightWhile(users, ['active', false]);
     * // => objects for ['barney']
     *
     * // The `_.property` iteratee shorthand.
     * _.dropRightWhile(users, 'active');
     * // => objects for ['barney', 'fred', 'pebbles']
     */
    function dropRightWhile(array, predicate) {
      return (array && array.length)
        ? baseWhile(array, getIteratee(predicate, 3), true, true)
        : [];
    }

    /**
     * Creates a slice of `array` excluding elements dropped from the beginning.
     * Elements are dropped until `predicate` returns falsey. The predicate is
     * invoked with three arguments: (value, index, array).
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Array
     * @param {Array} array The array to query.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @returns {Array} Returns the slice of `array`.
     * @example
     *
     * var users = [
     *   { 'user': 'barney',  'active': false },
     *   { 'user': 'fred',    'active': false },
     *   { 'user': 'pebbles', 'active': true }
     * ];
     *
     * _.dropWhile(users, function(o) { return !o.active; });
     * // => objects for ['pebbles']
     *
     * // The `_.matches` iteratee shorthand.
     * _.dropWhile(users, { 'user': 'barney', 'active': false });
     * // => objects for ['fred', 'pebbles']
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.dropWhile(users, ['active', false]);
     * // => objects for ['pebbles']
     *
     * // The `_.property` iteratee shorthand.
     * _.dropWhile(users, 'active');
     * // => objects for ['barney', 'fred', 'pebbles']
     */
    function dropWhile(array, predicate) {
      return (array && array.length)
        ? baseWhile(array, getIteratee(predicate, 3), true)
        : [];
    }

    /**
     * Fills elements of `array` with `value` from `start` up to, but not
     * including, `end`.
     *
     * **Note:** This method mutates `array`.
     *
     * @static
     * @memberOf _
     * @since 3.2.0
     * @category Array
     * @param {Array} array The array to fill.
     * @param {*} value The value to fill `array` with.
     * @param {number} [start=0] The start position.
     * @param {number} [end=array.length] The end position.
     * @returns {Array} Returns `array`.
     * @example
     *
     * var array = [1, 2, 3];
     *
     * _.fill(array, 'a');
     * console.log(array);
     * // => ['a', 'a', 'a']
     *
     * _.fill(Array(3), 2);
     * // => [2, 2, 2]
     *
     * _.fill([4, 6, 8, 10], '*', 1, 3);
     * // => [4, '*', '*', 10]
     */
    function fill(array, value, start, end) {
      var length = array == null ? 0 : array.length;
      if (!length) {
        return [];
      }
      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {
        start = 0;
        end = length;
      }
      return baseFill(array, value, start, end);
    }

    /**
     * This method is like `_.find` except that it returns the index of the first
     * element `predicate` returns truthy for instead of the element itself.
     *
     * @static
     * @memberOf _
     * @since 1.1.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @param {number} [fromIndex=0] The index to search from.
     * @returns {number} Returns the index of the found element, else `-1`.
     * @example
     *
     * var users = [
     *   { 'user': 'barney',  'active': false },
     *   { 'user': 'fred',    'active': false },
     *   { 'user': 'pebbles', 'active': true }
     * ];
     *
     * _.findIndex(users, function(o) { return o.user == 'barney'; });
     * // => 0
     *
     * // The `_.matches` iteratee shorthand.
     * _.findIndex(users, { 'user': 'fred', 'active': false });
     * // => 1
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.findIndex(users, ['active', false]);
     * // => 0
     *
     * // The `_.property` iteratee shorthand.
     * _.findIndex(users, 'active');
     * // => 2
     */
    function findIndex(array, predicate, fromIndex) {
      var length = array == null ? 0 : array.length;
      if (!length) {
        return -1;
      }
      var index = fromIndex == null ? 0 : toInteger(fromIndex);
      if (index < 0) {
        index = nativeMax(length + index, 0);
      }
      return baseFindIndex(array, getIteratee(predicate, 3), index);
    }

    /**
     * This method is like `_.findIndex` except that it iterates over elements
     * of `collection` from right to left.
     *
     * @static
     * @memberOf _
     * @since 2.0.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @param {number} [fromIndex=array.length-1] The index to search from.
     * @returns {number} Returns the index of the found element, else `-1`.
     * @example
     *
     * var users = [
     *   { 'user': 'barney',  'active': true },
     *   { 'user': 'fred',    'active': false },
     *   { 'user': 'pebbles', 'active': false }
     * ];
     *
     * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });
     * // => 2
     *
     * // The `_.matches` iteratee shorthand.
     * _.findLastIndex(users, { 'user': 'barney', 'active': true });
     * // => 0
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.findLastIndex(users, ['active', false]);
     * // => 2
     *
     * // The `_.property` iteratee shorthand.
     * _.findLastIndex(users, 'active');
     * // => 0
     */
    function findLastIndex(array, predicate, fromIndex) {
      var length = array == null ? 0 : array.length;
      if (!length) {
        return -1;
      }
      var index = length - 1;
      if (fromIndex !== undefined) {
        index = toInteger(fromIndex);
        index = fromIndex < 0
          ? nativeMax(length + index, 0)
          : nativeMin(index, length - 1);
      }
      return baseFindIndex(array, getIteratee(predicate, 3), index, true);
    }

    /**
     * Flattens `array` a single level deep.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {Array} array The array to flatten.
     * @returns {Array} Returns the new flattened array.
     * @example
     *
     * _.flatten([1, [2, [3, [4]], 5]]);
     * // => [1, 2, [3, [4]], 5]
     */
    function flatten(array) {
      var length = array == null ? 0 : array.length;
      return length ? baseFlatten(array, 1) : [];
    }

    /**
     * Recursively flattens `array`.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Array
     * @param {Array} array The array to flatten.
     * @returns {Array} Returns the new flattened array.
     * @example
     *
     * _.flattenDeep([1, [2, [3, [4]], 5]]);
     * // => [1, 2, 3, 4, 5]
     */
    function flattenDeep(array) {
      var length = array == null ? 0 : array.length;
      return length ? baseFlatten(array, INFINITY) : [];
    }

    /**
     * Recursively flatten `array` up to `depth` times.
     *
     * @static
     * @memberOf _
     * @since 4.4.0
     * @category Array
     * @param {Array} array The array to flatten.
     * @param {number} [depth=1] The maximum recursion depth.
     * @returns {Array} Returns the new flattened array.
     * @example
     *
     * var array = [1, [2, [3, [4]], 5]];
     *
     * _.flattenDepth(array, 1);
     * // => [1, 2, [3, [4]], 5]
     *
     * _.flattenDepth(array, 2);
     * // => [1, 2, 3, [4], 5]
     */
    function flattenDepth(array, depth) {
      var length = array == null ? 0 : array.length;
      if (!length) {
        return [];
      }
      depth = depth === undefined ? 1 : toInteger(depth);
      return baseFlatten(array, depth);
    }

    /**
     * The inverse of `_.toPairs`; this method returns an object composed
     * from key-value `pairs`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} pairs The key-value pairs.
     * @returns {Object} Returns the new object.
     * @example
     *
     * _.fromPairs([['a', 1], ['b', 2]]);
     * // => { 'a': 1, 'b': 2 }
     */
    function fromPairs(pairs) {
      var index = -1,
          length = pairs == null ? 0 : pairs.length,
          result = {};

      while (++index < length) {
        var pair = pairs[index];
        result[pair[0]] = pair[1];
      }
      return result;
    }

    /**
     * Gets the first element of `array`.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @alias first
     * @category Array
     * @param {Array} array The array to query.
     * @returns {*} Returns the first element of `array`.
     * @example
     *
     * _.head([1, 2, 3]);
     * // => 1
     *
     * _.head([]);
     * // => undefined
     */
    function head(array) {
      return (array && array.length) ? array[0] : undefined;
    }

    /**
     * Gets the index at which the first occurrence of `value` is found in `array`
     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
     * for equality comparisons. If `fromIndex` is negative, it's used as the
     * offset from the end of `array`.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @param {*} value The value to search for.
     * @param {number} [fromIndex=0] The index to search from.
     * @returns {number} Returns the index of the matched value, else `-1`.
     * @example
     *
     * _.indexOf([1, 2, 1, 2], 2);
     * // => 1
     *
     * // Search from the `fromIndex`.
     * _.indexOf([1, 2, 1, 2], 2, 2);
     * // => 3
     */
    function indexOf(array, value, fromIndex) {
      var length = array == null ? 0 : array.length;
      if (!length) {
        return -1;
      }
      var index = fromIndex == null ? 0 : toInteger(fromIndex);
      if (index < 0) {
        index = nativeMax(length + index, 0);
      }
      return baseIndexOf(array, value, index);
    }

    /**
     * Gets all but the last element of `array`.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {Array} array The array to query.
     * @returns {Array} Returns the slice of `array`.
     * @example
     *
     * _.initial([1, 2, 3]);
     * // => [1, 2]
     */
    function initial(array) {
      var length = array == null ? 0 : array.length;
      return length ? baseSlice(array, 0, -1) : [];
    }

    /**
     * Creates an array of unique values that are included in all given arrays
     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
     * for equality comparisons. The order and references of result values are
     * determined by the first array.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {...Array} [arrays] The arrays to inspect.
     * @returns {Array} Returns the new array of intersecting values.
     * @example
     *
     * _.intersection([2, 1], [2, 3]);
     * // => [2]
     */
    var intersection = baseRest(function(arrays) {
      var mapped = arrayMap(arrays, castArrayLikeObject);
      return (mapped.length && mapped[0] === arrays[0])
        ? baseIntersection(mapped)
        : [];
    });

    /**
     * This method is like `_.intersection` except that it accepts `iteratee`
     * which is invoked for each element of each `arrays` to generate the criterion
     * by which they're compared. The order and references of result values are
     * determined by the first array. The iteratee is invoked with one argument:
     * (value).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {...Array} [arrays] The arrays to inspect.
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
     * @returns {Array} Returns the new array of intersecting values.
     * @example
     *
     * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);
     * // => [2.1]
     *
     * // The `_.property` iteratee shorthand.
     * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
     * // => [{ 'x': 1 }]
     */
    var intersectionBy = baseRest(function(arrays) {
      var iteratee = last(arrays),
          mapped = arrayMap(arrays, castArrayLikeObject);

      if (iteratee === last(mapped)) {
        iteratee = undefined;
      } else {
        mapped.pop();
      }
      return (mapped.length && mapped[0] === arrays[0])
        ? baseIntersection(mapped, getIteratee(iteratee, 2))
        : [];
    });

    /**
     * This method is like `_.intersection` except that it accepts `comparator`
     * which is invoked to compare elements of `arrays`. The order and references
     * of result values are determined by the first array. The comparator is
     * invoked with two arguments: (arrVal, othVal).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {...Array} [arrays] The arrays to inspect.
     * @param {Function} [comparator] The comparator invoked per element.
     * @returns {Array} Returns the new array of intersecting values.
     * @example
     *
     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
     *
     * _.intersectionWith(objects, others, _.isEqual);
     * // => [{ 'x': 1, 'y': 2 }]
     */
    var intersectionWith = baseRest(function(arrays) {
      var comparator = last(arrays),
          mapped = arrayMap(arrays, castArrayLikeObject);

      comparator = typeof comparator == 'function' ? comparator : undefined;
      if (comparator) {
        mapped.pop();
      }
      return (mapped.length && mapped[0] === arrays[0])
        ? baseIntersection(mapped, undefined, comparator)
        : [];
    });

    /**
     * Converts all elements in `array` into a string separated by `separator`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to convert.
     * @param {string} [separator=','] The element separator.
     * @returns {string} Returns the joined string.
     * @example
     *
     * _.join(['a', 'b', 'c'], '~');
     * // => 'a~b~c'
     */
    function join(array, separator) {
      return array == null ? '' : nativeJoin.call(array, separator);
    }

    /**
     * Gets the last element of `array`.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {Array} array The array to query.
     * @returns {*} Returns the last element of `array`.
     * @example
     *
     * _.last([1, 2, 3]);
     * // => 3
     */
    function last(array) {
      var length = array == null ? 0 : array.length;
      return length ? array[length - 1] : undefined;
    }

    /**
     * This method is like `_.indexOf` except that it iterates over elements of
     * `array` from right to left.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @param {*} value The value to search for.
     * @param {number} [fromIndex=array.length-1] The index to search from.
     * @returns {number} Returns the index of the matched value, else `-1`.
     * @example
     *
     * _.lastIndexOf([1, 2, 1, 2], 2);
     * // => 3
     *
     * // Search from the `fromIndex`.
     * _.lastIndexOf([1, 2, 1, 2], 2, 2);
     * // => 1
     */
    function lastIndexOf(array, value, fromIndex) {
      var length = array == null ? 0 : array.length;
      if (!length) {
        return -1;
      }
      var index = length;
      if (fromIndex !== undefined) {
        index = toInteger(fromIndex);
        index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);
      }
      return value === value
        ? strictLastIndexOf(array, value, index)
        : baseFindIndex(array, baseIsNaN, index, true);
    }

    /**
     * Gets the element at index `n` of `array`. If `n` is negative, the nth
     * element from the end is returned.
     *
     * @static
     * @memberOf _
     * @since 4.11.0
     * @category Array
     * @param {Array} array The array to query.
     * @param {number} [n=0] The index of the element to return.
     * @returns {*} Returns the nth element of `array`.
     * @example
     *
     * var array = ['a', 'b', 'c', 'd'];
     *
     * _.nth(array, 1);
     * // => 'b'
     *
     * _.nth(array, -2);
     * // => 'c';
     */
    function nth(array, n) {
      return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;
    }

    /**
     * Removes all given values from `array` using
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
     * for equality comparisons.
     *
     * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
     * to remove elements from an array by predicate.
     *
     * @static
     * @memberOf _
     * @since 2.0.0
     * @category Array
     * @param {Array} array The array to modify.
     * @param {...*} [values] The values to remove.
     * @returns {Array} Returns `array`.
     * @example
     *
     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
     *
     * _.pull(array, 'a', 'c');
     * console.log(array);
     * // => ['b', 'b']
     */
    var pull = baseRest(pullAll);

    /**
     * This method is like `_.pull` except that it accepts an array of values to remove.
     *
     * **Note:** Unlike `_.difference`, this method mutates `array`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to modify.
     * @param {Array} values The values to remove.
     * @returns {Array} Returns `array`.
     * @example
     *
     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
     *
     * _.pullAll(array, ['a', 'c']);
     * console.log(array);
     * // => ['b', 'b']
     */
    function pullAll(array, values) {
      return (array && array.length && values && values.length)
        ? basePullAll(array, values)
        : array;
    }

    /**
     * This method is like `_.pullAll` except that it accepts `iteratee` which is
     * invoked for each element of `array` and `values` to generate the criterion
     * by which they're compared. The iteratee is invoked with one argument: (value).
     *
     * **Note:** Unlike `_.differenceBy`, this method mutates `array`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to modify.
     * @param {Array} values The values to remove.
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
     * @returns {Array} Returns `array`.
     * @example
     *
     * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];
     *
     * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');
     * console.log(array);
     * // => [{ 'x': 2 }]
     */
    function pullAllBy(array, values, iteratee) {
      return (array && array.length && values && values.length)
        ? basePullAll(array, values, getIteratee(iteratee, 2))
        : array;
    }

    /**
     * This method is like `_.pullAll` except that it accepts `comparator` which
     * is invoked to compare elements of `array` to `values`. The comparator is
     * invoked with two arguments: (arrVal, othVal).
     *
     * **Note:** Unlike `_.differenceWith`, this method mutates `array`.
     *
     * @static
     * @memberOf _
     * @since 4.6.0
     * @category Array
     * @param {Array} array The array to modify.
     * @param {Array} values The values to remove.
     * @param {Function} [comparator] The comparator invoked per element.
     * @returns {Array} Returns `array`.
     * @example
     *
     * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];
     *
     * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);
     * console.log(array);
     * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]
     */
    function pullAllWith(array, values, comparator) {
      return (array && array.length && values && values.length)
        ? basePullAll(array, values, undefined, comparator)
        : array;
    }

    /**
     * Removes elements from `array` corresponding to `indexes` and returns an
     * array of removed elements.
     *
     * **Note:** Unlike `_.at`, this method mutates `array`.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Array
     * @param {Array} array The array to modify.
     * @param {...(number|number[])} [indexes] The indexes of elements to remove.
     * @returns {Array} Returns the new array of removed elements.
     * @example
     *
     * var array = ['a', 'b', 'c', 'd'];
     * var pulled = _.pullAt(array, [1, 3]);
     *
     * console.log(array);
     * // => ['a', 'c']
     *
     * console.log(pulled);
     * // => ['b', 'd']
     */
    var pullAt = flatRest(function(array, indexes) {
      var length = array == null ? 0 : array.length,
          result = baseAt(array, indexes);

      basePullAt(array, arrayMap(indexes, function(index) {
        return isIndex(index, length) ? +index : index;
      }).sort(compareAscending));

      return result;
    });

    /**
     * Removes all elements from `array` that `predicate` returns truthy for
     * and returns an array of the removed elements. The predicate is invoked
     * with three arguments: (value, index, array).
     *
     * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
     * to pull elements from an array by value.
     *
     * @static
     * @memberOf _
     * @since 2.0.0
     * @category Array
     * @param {Array} array The array to modify.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @returns {Array} Returns the new array of removed elements.
     * @example
     *
     * var array = [1, 2, 3, 4];
     * var evens = _.remove(array, function(n) {
     *   return n % 2 == 0;
     * });
     *
     * console.log(array);
     * // => [1, 3]
     *
     * console.log(evens);
     * // => [2, 4]
     */
    function remove(array, predicate) {
      var result = [];
      if (!(array && array.length)) {
        return result;
      }
      var index = -1,
          indexes = [],
          length = array.length;

      predicate = getIteratee(predicate, 3);
      while (++index < length) {
        var value = array[index];
        if (predicate(value, index, array)) {
          result.push(value);
          indexes.push(index);
        }
      }
      basePullAt(array, indexes);
      return result;
    }

    /**
     * Reverses `array` so that the first element becomes the last, the second
     * element becomes the second to last, and so on.
     *
     * **Note:** This method mutates `array` and is based on
     * [`Array#reverse`](https://mdn.io/Array/reverse).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to modify.
     * @returns {Array} Returns `array`.
     * @example
     *
     * var array = [1, 2, 3];
     *
     * _.reverse(array);
     * // => [3, 2, 1]
     *
     * console.log(array);
     * // => [3, 2, 1]
     */
    function reverse(array) {
      return array == null ? array : nativeReverse.call(array);
    }

    /**
     * Creates a slice of `array` from `start` up to, but not including, `end`.
     *
     * **Note:** This method is used instead of
     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are
     * returned.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Array
     * @param {Array} array The array to slice.
     * @param {number} [start=0] The start position.
     * @param {number} [end=array.length] The end position.
     * @returns {Array} Returns the slice of `array`.
     */
    function slice(array, start, end) {
      var length = array == null ? 0 : array.length;
      if (!length) {
        return [];
      }
      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {
        start = 0;
        end = length;
      }
      else {
        start = start == null ? 0 : toInteger(start);
        end = end === undefined ? length : toInteger(end);
      }
      return baseSlice(array, start, end);
    }

    /**
     * Uses a binary search to determine the lowest index at which `value`
     * should be inserted into `array` in order to maintain its sort order.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {Array} array The sorted array to inspect.
     * @param {*} value The value to evaluate.
     * @returns {number} Returns the index at which `value` should be inserted
     *  into `array`.
     * @example
     *
     * _.sortedIndex([30, 50], 40);
     * // => 1
     */
    function sortedIndex(array, value) {
      return baseSortedIndex(array, value);
    }

    /**
     * This method is like `_.sortedIndex` except that it accepts `iteratee`
     * which is invoked for `value` and each element of `array` to compute their
     * sort ranking. The iteratee is invoked with one argument: (value).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The sorted array to inspect.
     * @param {*} value The value to evaluate.
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
     * @returns {number} Returns the index at which `value` should be inserted
     *  into `array`.
     * @example
     *
     * var objects = [{ 'x': 4 }, { 'x': 5 }];
     *
     * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
     * // => 0
     *
     * // The `_.property` iteratee shorthand.
     * _.sortedIndexBy(objects, { 'x': 4 }, 'x');
     * // => 0
     */
    function sortedIndexBy(array, value, iteratee) {
      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));
    }

    /**
     * This method is like `_.indexOf` except that it performs a binary
     * search on a sorted `array`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @param {*} value The value to search for.
     * @returns {number} Returns the index of the matched value, else `-1`.
     * @example
     *
     * _.sortedIndexOf([4, 5, 5, 5, 6], 5);
     * // => 1
     */
    function sortedIndexOf(array, value) {
      var length = array == null ? 0 : array.length;
      if (length) {
        var index = baseSortedIndex(array, value);
        if (index < length && eq(array[index], value)) {
          return index;
        }
      }
      return -1;
    }

    /**
     * This method is like `_.sortedIndex` except that it returns the highest
     * index at which `value` should be inserted into `array` in order to
     * maintain its sort order.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Array
     * @param {Array} array The sorted array to inspect.
     * @param {*} value The value to evaluate.
     * @returns {number} Returns the index at which `value` should be inserted
     *  into `array`.
     * @example
     *
     * _.sortedLastIndex([4, 5, 5, 5, 6], 5);
     * // => 4
     */
    function sortedLastIndex(array, value) {
      return baseSortedIndex(array, value, true);
    }

    /**
     * This method is like `_.sortedLastIndex` except that it accepts `iteratee`
     * which is invoked for `value` and each element of `array` to compute their
     * sort ranking. The iteratee is invoked with one argument: (value).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The sorted array to inspect.
     * @param {*} value The value to evaluate.
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
     * @returns {number} Returns the index at which `value` should be inserted
     *  into `array`.
     * @example
     *
     * var objects = [{ 'x': 4 }, { 'x': 5 }];
     *
     * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
     * // => 1
     *
     * // The `_.property` iteratee shorthand.
     * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');
     * // => 1
     */
    function sortedLastIndexBy(array, value, iteratee) {
      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);
    }

    /**
     * This method is like `_.lastIndexOf` except that it performs a binary
     * search on a sorted `array`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @param {*} value The value to search for.
     * @returns {number} Returns the index of the matched value, else `-1`.
     * @example
     *
     * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);
     * // => 3
     */
    function sortedLastIndexOf(array, value) {
      var length = array == null ? 0 : array.length;
      if (length) {
        var index = baseSortedIndex(array, value, true) - 1;
        if (eq(array[index], value)) {
          return index;
        }
      }
      return -1;
    }

    /**
     * This method is like `_.uniq` except that it's designed and optimized
     * for sorted arrays.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @returns {Array} Returns the new duplicate free array.
     * @example
     *
     * _.sortedUniq([1, 1, 2]);
     * // => [1, 2]
     */
    function sortedUniq(array) {
      return (array && array.length)
        ? baseSortedUniq(array)
        : [];
    }

    /**
     * This method is like `_.uniqBy` except that it's designed and optimized
     * for sorted arrays.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @param {Function} [iteratee] The iteratee invoked per element.
     * @returns {Array} Returns the new duplicate free array.
     * @example
     *
     * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);
     * // => [1.1, 2.3]
     */
    function sortedUniqBy(array, iteratee) {
      return (array && array.length)
        ? baseSortedUniq(array, getIteratee(iteratee, 2))
        : [];
    }

    /**
     * Gets all but the first element of `array`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to query.
     * @returns {Array} Returns the slice of `array`.
     * @example
     *
     * _.tail([1, 2, 3]);
     * // => [2, 3]
     */
    function tail(array) {
      var length = array == null ? 0 : array.length;
      return length ? baseSlice(array, 1, length) : [];
    }

    /**
     * Creates a slice of `array` with `n` elements taken from the beginning.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {Array} array The array to query.
     * @param {number} [n=1] The number of elements to take.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {Array} Returns the slice of `array`.
     * @example
     *
     * _.take([1, 2, 3]);
     * // => [1]
     *
     * _.take([1, 2, 3], 2);
     * // => [1, 2]
     *
     * _.take([1, 2, 3], 5);
     * // => [1, 2, 3]
     *
     * _.take([1, 2, 3], 0);
     * // => []
     */
    function take(array, n, guard) {
      if (!(array && array.length)) {
        return [];
      }
      n = (guard || n === undefined) ? 1 : toInteger(n);
      return baseSlice(array, 0, n < 0 ? 0 : n);
    }

    /**
     * Creates a slice of `array` with `n` elements taken from the end.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Array
     * @param {Array} array The array to query.
     * @param {number} [n=1] The number of elements to take.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {Array} Returns the slice of `array`.
     * @example
     *
     * _.takeRight([1, 2, 3]);
     * // => [3]
     *
     * _.takeRight([1, 2, 3], 2);
     * // => [2, 3]
     *
     * _.takeRight([1, 2, 3], 5);
     * // => [1, 2, 3]
     *
     * _.takeRight([1, 2, 3], 0);
     * // => []
     */
    function takeRight(array, n, guard) {
      var length = array == null ? 0 : array.length;
      if (!length) {
        return [];
      }
      n = (guard || n === undefined) ? 1 : toInteger(n);
      n = length - n;
      return baseSlice(array, n < 0 ? 0 : n, length);
    }

    /**
     * Creates a slice of `array` with elements taken from the end. Elements are
     * taken until `predicate` returns falsey. The predicate is invoked with
     * three arguments: (value, index, array).
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Array
     * @param {Array} array The array to query.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @returns {Array} Returns the slice of `array`.
     * @example
     *
     * var users = [
     *   { 'user': 'barney',  'active': true },
     *   { 'user': 'fred',    'active': false },
     *   { 'user': 'pebbles', 'active': false }
     * ];
     *
     * _.takeRightWhile(users, function(o) { return !o.active; });
     * // => objects for ['fred', 'pebbles']
     *
     * // The `_.matches` iteratee shorthand.
     * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });
     * // => objects for ['pebbles']
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.takeRightWhile(users, ['active', false]);
     * // => objects for ['fred', 'pebbles']
     *
     * // The `_.property` iteratee shorthand.
     * _.takeRightWhile(users, 'active');
     * // => []
     */
    function takeRightWhile(array, predicate) {
      return (array && array.length)
        ? baseWhile(array, getIteratee(predicate, 3), false, true)
        : [];
    }

    /**
     * Creates a slice of `array` with elements taken from the beginning. Elements
     * are taken until `predicate` returns falsey. The predicate is invoked with
     * three arguments: (value, index, array).
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Array
     * @param {Array} array The array to query.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @returns {Array} Returns the slice of `array`.
     * @example
     *
     * var users = [
     *   { 'user': 'barney',  'active': false },
     *   { 'user': 'fred',    'active': false },
     *   { 'user': 'pebbles', 'active': true }
     * ];
     *
     * _.takeWhile(users, function(o) { return !o.active; });
     * // => objects for ['barney', 'fred']
     *
     * // The `_.matches` iteratee shorthand.
     * _.takeWhile(users, { 'user': 'barney', 'active': false });
     * // => objects for ['barney']
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.takeWhile(users, ['active', false]);
     * // => objects for ['barney', 'fred']
     *
     * // The `_.property` iteratee shorthand.
     * _.takeWhile(users, 'active');
     * // => []
     */
    function takeWhile(array, predicate) {
      return (array && array.length)
        ? baseWhile(array, getIteratee(predicate, 3))
        : [];
    }

    /**
     * Creates an array of unique values, in order, from all given arrays using
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
     * for equality comparisons.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {...Array} [arrays] The arrays to inspect.
     * @returns {Array} Returns the new array of combined values.
     * @example
     *
     * _.union([2], [1, 2]);
     * // => [2, 1]
     */
    var union = baseRest(function(arrays) {
      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
    });

    /**
     * This method is like `_.union` except that it accepts `iteratee` which is
     * invoked for each element of each `arrays` to generate the criterion by
     * which uniqueness is computed. Result values are chosen from the first
     * array in which the value occurs. The iteratee is invoked with one argument:
     * (value).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {...Array} [arrays] The arrays to inspect.
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
     * @returns {Array} Returns the new array of combined values.
     * @example
     *
     * _.unionBy([2.1], [1.2, 2.3], Math.floor);
     * // => [2.1, 1.2]
     *
     * // The `_.property` iteratee shorthand.
     * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
     * // => [{ 'x': 1 }, { 'x': 2 }]
     */
    var unionBy = baseRest(function(arrays) {
      var iteratee = last(arrays);
      if (isArrayLikeObject(iteratee)) {
        iteratee = undefined;
      }
      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));
    });

    /**
     * This method is like `_.union` except that it accepts `comparator` which
     * is invoked to compare elements of `arrays`. Result values are chosen from
     * the first array in which the value occurs. The comparator is invoked
     * with two arguments: (arrVal, othVal).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {...Array} [arrays] The arrays to inspect.
     * @param {Function} [comparator] The comparator invoked per element.
     * @returns {Array} Returns the new array of combined values.
     * @example
     *
     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
     *
     * _.unionWith(objects, others, _.isEqual);
     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
     */
    var unionWith = baseRest(function(arrays) {
      var comparator = last(arrays);
      comparator = typeof comparator == 'function' ? comparator : undefined;
      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);
    });

    /**
     * Creates a duplicate-free version of an array, using
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
     * for equality comparisons, in which only the first occurrence of each element
     * is kept. The order of result values is determined by the order they occur
     * in the array.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @returns {Array} Returns the new duplicate free array.
     * @example
     *
     * _.uniq([2, 1, 2]);
     * // => [2, 1]
     */
    function uniq(array) {
      return (array && array.length) ? baseUniq(array) : [];
    }

    /**
     * This method is like `_.uniq` except that it accepts `iteratee` which is
     * invoked for each element in `array` to generate the criterion by which
     * uniqueness is computed. The order of result values is determined by the
     * order they occur in the array. The iteratee is invoked with one argument:
     * (value).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
     * @returns {Array} Returns the new duplicate free array.
     * @example
     *
     * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
     * // => [2.1, 1.2]
     *
     * // The `_.property` iteratee shorthand.
     * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
     * // => [{ 'x': 1 }, { 'x': 2 }]
     */
    function uniqBy(array, iteratee) {
      return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];
    }

    /**
     * This method is like `_.uniq` except that it accepts `comparator` which
     * is invoked to compare elements of `array`. The order of result values is
     * determined by the order they occur in the array.The comparator is invoked
     * with two arguments: (arrVal, othVal).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @param {Function} [comparator] The comparator invoked per element.
     * @returns {Array} Returns the new duplicate free array.
     * @example
     *
     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];
     *
     * _.uniqWith(objects, _.isEqual);
     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]
     */
    function uniqWith(array, comparator) {
      comparator = typeof comparator == 'function' ? comparator : undefined;
      return (array && array.length) ? baseUniq(array, undefined, comparator) : [];
    }

    /**
     * This method is like `_.zip` except that it accepts an array of grouped
     * elements and creates an array regrouping the elements to their pre-zip
     * configuration.
     *
     * @static
     * @memberOf _
     * @since 1.2.0
     * @category Array
     * @param {Array} array The array of grouped elements to process.
     * @returns {Array} Returns the new array of regrouped elements.
     * @example
     *
     * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);
     * // => [['a', 1, true], ['b', 2, false]]
     *
     * _.unzip(zipped);
     * // => [['a', 'b'], [1, 2], [true, false]]
     */
    function unzip(array) {
      if (!(array && array.length)) {
        return [];
      }
      var length = 0;
      array = arrayFilter(array, function(group) {
        if (isArrayLikeObject(group)) {
          length = nativeMax(group.length, length);
          return true;
        }
      });
      return baseTimes(length, function(index) {
        return arrayMap(array, baseProperty(index));
      });
    }

    /**
     * This method is like `_.unzip` except that it accepts `iteratee` to specify
     * how regrouped values should be combined. The iteratee is invoked with the
     * elements of each group: (...group).
     *
     * @static
     * @memberOf _
     * @since 3.8.0
     * @category Array
     * @param {Array} array The array of grouped elements to process.
     * @param {Function} [iteratee=_.identity] The function to combine
     *  regrouped values.
     * @returns {Array} Returns the new array of regrouped elements.
     * @example
     *
     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);
     * // => [[1, 10, 100], [2, 20, 200]]
     *
     * _.unzipWith(zipped, _.add);
     * // => [3, 30, 300]
     */
    function unzipWith(array, iteratee) {
      if (!(array && array.length)) {
        return [];
      }
      var result = unzip(array);
      if (iteratee == null) {
        return result;
      }
      return arrayMap(result, function(group) {
        return apply(iteratee, undefined, group);
      });
    }

    /**
     * Creates an array excluding all given values using
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
     * for equality comparisons.
     *
     * **Note:** Unlike `_.pull`, this method returns a new array.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {Array} array The array to inspect.
     * @param {...*} [values] The values to exclude.
     * @returns {Array} Returns the new array of filtered values.
     * @see _.difference, _.xor
     * @example
     *
     * _.without([2, 1, 2, 3], 1, 2);
     * // => [3]
     */
    var without = baseRest(function(array, values) {
      return isArrayLikeObject(array)
        ? baseDifference(array, values)
        : [];
    });

    /**
     * Creates an array of unique values that is the
     * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
     * of the given arrays. The order of result values is determined by the order
     * they occur in the arrays.
     *
     * @static
     * @memberOf _
     * @since 2.4.0
     * @category Array
     * @param {...Array} [arrays] The arrays to inspect.
     * @returns {Array} Returns the new array of filtered values.
     * @see _.difference, _.without
     * @example
     *
     * _.xor([2, 1], [2, 3]);
     * // => [1, 3]
     */
    var xor = baseRest(function(arrays) {
      return baseXor(arrayFilter(arrays, isArrayLikeObject));
    });

    /**
     * This method is like `_.xor` except that it accepts `iteratee` which is
     * invoked for each element of each `arrays` to generate the criterion by
     * which by which they're compared. The order of result values is determined
     * by the order they occur in the arrays. The iteratee is invoked with one
     * argument: (value).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {...Array} [arrays] The arrays to inspect.
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
     * @returns {Array} Returns the new array of filtered values.
     * @example
     *
     * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);
     * // => [1.2, 3.4]
     *
     * // The `_.property` iteratee shorthand.
     * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
     * // => [{ 'x': 2 }]
     */
    var xorBy = baseRest(function(arrays) {
      var iteratee = last(arrays);
      if (isArrayLikeObject(iteratee)) {
        iteratee = undefined;
      }
      return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));
    });

    /**
     * This method is like `_.xor` except that it accepts `comparator` which is
     * invoked to compare elements of `arrays`. The order of result values is
     * determined by the order they occur in the arrays. The comparator is invoked
     * with two arguments: (arrVal, othVal).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Array
     * @param {...Array} [arrays] The arrays to inspect.
     * @param {Function} [comparator] The comparator invoked per element.
     * @returns {Array} Returns the new array of filtered values.
     * @example
     *
     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
     *
     * _.xorWith(objects, others, _.isEqual);
     * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
     */
    var xorWith = baseRest(function(arrays) {
      var comparator = last(arrays);
      comparator = typeof comparator == 'function' ? comparator : undefined;
      return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);
    });

    /**
     * Creates an array of grouped elements, the first of which contains the
     * first elements of the given arrays, the second of which contains the
     * second elements of the given arrays, and so on.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Array
     * @param {...Array} [arrays] The arrays to process.
     * @returns {Array} Returns the new array of grouped elements.
     * @example
     *
     * _.zip(['a', 'b'], [1, 2], [true, false]);
     * // => [['a', 1, true], ['b', 2, false]]
     */
    var zip = baseRest(unzip);

    /**
     * This method is like `_.fromPairs` except that it accepts two arrays,
     * one of property identifiers and one of corresponding values.
     *
     * @static
     * @memberOf _
     * @since 0.4.0
     * @category Array
     * @param {Array} [props=[]] The property identifiers.
     * @param {Array} [values=[]] The property values.
     * @returns {Object} Returns the new object.
     * @example
     *
     * _.zipObject(['a', 'b'], [1, 2]);
     * // => { 'a': 1, 'b': 2 }
     */
    function zipObject(props, values) {
      return baseZipObject(props || [], values || [], assignValue);
    }

    /**
     * This method is like `_.zipObject` except that it supports property paths.
     *
     * @static
     * @memberOf _
     * @since 4.1.0
     * @category Array
     * @param {Array} [props=[]] The property identifiers.
     * @param {Array} [values=[]] The property values.
     * @returns {Object} Returns the new object.
     * @example
     *
     * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);
     * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }
     */
    function zipObjectDeep(props, values) {
      return baseZipObject(props || [], values || [], baseSet);
    }

    /**
     * This method is like `_.zip` except that it accepts `iteratee` to specify
     * how grouped values should be combined. The iteratee is invoked with the
     * elements of each group: (...group).
     *
     * @static
     * @memberOf _
     * @since 3.8.0
     * @category Array
     * @param {...Array} [arrays] The arrays to process.
     * @param {Function} [iteratee=_.identity] The function to combine
     *  grouped values.
     * @returns {Array} Returns the new array of grouped elements.
     * @example
     *
     * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {
     *   return a + b + c;
     * });
     * // => [111, 222]
     */
    var zipWith = baseRest(function(arrays) {
      var length = arrays.length,
          iteratee = length > 1 ? arrays[length - 1] : undefined;

      iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;
      return unzipWith(arrays, iteratee);
    });

    /*------------------------------------------------------------------------*/

    /**
     * Creates a `lodash` wrapper instance that wraps `value` with explicit method
     * chain sequences enabled. The result of such sequences must be unwrapped
     * with `_#value`.
     *
     * @static
     * @memberOf _
     * @since 1.3.0
     * @category Seq
     * @param {*} value The value to wrap.
     * @returns {Object} Returns the new `lodash` wrapper instance.
     * @example
     *
     * var users = [
     *   { 'user': 'barney',  'age': 36 },
     *   { 'user': 'fred',    'age': 40 },
     *   { 'user': 'pebbles', 'age': 1 }
     * ];
     *
     * var youngest = _
     *   .chain(users)
     *   .sortBy('age')
     *   .map(function(o) {
     *     return o.user + ' is ' + o.age;
     *   })
     *   .head()
     *   .value();
     * // => 'pebbles is 1'
     */
    function chain(value) {
      var result = lodash(value);
      result.__chain__ = true;
      return result;
    }

    /**
     * This method invokes `interceptor` and returns `value`. The interceptor
     * is invoked with one argument; (value). The purpose of this method is to
     * "tap into" a method chain sequence in order to modify intermediate results.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Seq
     * @param {*} value The value to provide to `interceptor`.
     * @param {Function} interceptor The function to invoke.
     * @returns {*} Returns `value`.
     * @example
     *
     * _([1, 2, 3])
     *  .tap(function(array) {
     *    // Mutate input array.
     *    array.pop();
     *  })
     *  .reverse()
     *  .value();
     * // => [2, 1]
     */
    function tap(value, interceptor) {
      interceptor(value);
      return value;
    }

    /**
     * This method is like `_.tap` except that it returns the result of `interceptor`.
     * The purpose of this method is to "pass thru" values replacing intermediate
     * results in a method chain sequence.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Seq
     * @param {*} value The value to provide to `interceptor`.
     * @param {Function} interceptor The function to invoke.
     * @returns {*} Returns the result of `interceptor`.
     * @example
     *
     * _('  abc  ')
     *  .chain()
     *  .trim()
     *  .thru(function(value) {
     *    return [value];
     *  })
     *  .value();
     * // => ['abc']
     */
    function thru(value, interceptor) {
      return interceptor(value);
    }

    /**
     * This method is the wrapper version of `_.at`.
     *
     * @name at
     * @memberOf _
     * @since 1.0.0
     * @category Seq
     * @param {...(string|string[])} [paths] The property paths to pick.
     * @returns {Object} Returns the new `lodash` wrapper instance.
     * @example
     *
     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
     *
     * _(object).at(['a[0].b.c', 'a[1]']).value();
     * // => [3, 4]
     */
    var wrapperAt = flatRest(function(paths) {
      var length = paths.length,
          start = length ? paths[0] : 0,
          value = this.__wrapped__,
          interceptor = function(object) { return baseAt(object, paths); };

      if (length > 1 || this.__actions__.length ||
          !(value instanceof LazyWrapper) || !isIndex(start)) {
        return this.thru(interceptor);
      }
      value = value.slice(start, +start + (length ? 1 : 0));
      value.__actions__.push({
        'func': thru,
        'args': [interceptor],
        'thisArg': undefined
      });
      return new LodashWrapper(value, this.__chain__).thru(function(array) {
        if (length && !array.length) {
          array.push(undefined);
        }
        return array;
      });
    });

    /**
     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.
     *
     * @name chain
     * @memberOf _
     * @since 0.1.0
     * @category Seq
     * @returns {Object} Returns the new `lodash` wrapper instance.
     * @example
     *
     * var users = [
     *   { 'user': 'barney', 'age': 36 },
     *   { 'user': 'fred',   'age': 40 }
     * ];
     *
     * // A sequence without explicit chaining.
     * _(users).head();
     * // => { 'user': 'barney', 'age': 36 }
     *
     * // A sequence with explicit chaining.
     * _(users)
     *   .chain()
     *   .head()
     *   .pick('user')
     *   .value();
     * // => { 'user': 'barney' }
     */
    function wrapperChain() {
      return chain(this);
    }

    /**
     * Executes the chain sequence and returns the wrapped result.
     *
     * @name commit
     * @memberOf _
     * @since 3.2.0
     * @category Seq
     * @returns {Object} Returns the new `lodash` wrapper instance.
     * @example
     *
     * var array = [1, 2];
     * var wrapped = _(array).push(3);
     *
     * console.log(array);
     * // => [1, 2]
     *
     * wrapped = wrapped.commit();
     * console.log(array);
     * // => [1, 2, 3]
     *
     * wrapped.last();
     * // => 3
     *
     * console.log(array);
     * // => [1, 2, 3]
     */
    function wrapperCommit() {
      return new LodashWrapper(this.value(), this.__chain__);
    }

    /**
     * Gets the next value on a wrapped object following the
     * [iterator protocol](https://mdn.io/iteration_protocols#iterator).
     *
     * @name next
     * @memberOf _
     * @since 4.0.0
     * @category Seq
     * @returns {Object} Returns the next iterator value.
     * @example
     *
     * var wrapped = _([1, 2]);
     *
     * wrapped.next();
     * // => { 'done': false, 'value': 1 }
     *
     * wrapped.next();
     * // => { 'done': false, 'value': 2 }
     *
     * wrapped.next();
     * // => { 'done': true, 'value': undefined }
     */
    function wrapperNext() {
      if (this.__values__ === undefined) {
        this.__values__ = toArray(this.value());
      }
      var done = this.__index__ >= this.__values__.length,
          value = done ? undefined : this.__values__[this.__index__++];

      return { 'done': done, 'value': value };
    }

    /**
     * Enables the wrapper to be iterable.
     *
     * @name Symbol.iterator
     * @memberOf _
     * @since 4.0.0
     * @category Seq
     * @returns {Object} Returns the wrapper object.
     * @example
     *
     * var wrapped = _([1, 2]);
     *
     * wrapped[Symbol.iterator]() === wrapped;
     * // => true
     *
     * Array.from(wrapped);
     * // => [1, 2]
     */
    function wrapperToIterator() {
      return this;
    }

    /**
     * Creates a clone of the chain sequence planting `value` as the wrapped value.
     *
     * @name plant
     * @memberOf _
     * @since 3.2.0
     * @category Seq
     * @param {*} value The value to plant.
     * @returns {Object} Returns the new `lodash` wrapper instance.
     * @example
     *
     * function square(n) {
     *   return n * n;
     * }
     *
     * var wrapped = _([1, 2]).map(square);
     * var other = wrapped.plant([3, 4]);
     *
     * other.value();
     * // => [9, 16]
     *
     * wrapped.value();
     * // => [1, 4]
     */
    function wrapperPlant(value) {
      var result,
          parent = this;

      while (parent instanceof baseLodash) {
        var clone = wrapperClone(parent);
        clone.__index__ = 0;
        clone.__values__ = undefined;
        if (result) {
          previous.__wrapped__ = clone;
        } else {
          result = clone;
        }
        var previous = clone;
        parent = parent.__wrapped__;
      }
      previous.__wrapped__ = value;
      return result;
    }

    /**
     * This method is the wrapper version of `_.reverse`.
     *
     * **Note:** This method mutates the wrapped array.
     *
     * @name reverse
     * @memberOf _
     * @since 0.1.0
     * @category Seq
     * @returns {Object} Returns the new `lodash` wrapper instance.
     * @example
     *
     * var array = [1, 2, 3];
     *
     * _(array).reverse().value()
     * // => [3, 2, 1]
     *
     * console.log(array);
     * // => [3, 2, 1]
     */
    function wrapperReverse() {
      var value = this.__wrapped__;
      if (value instanceof LazyWrapper) {
        var wrapped = value;
        if (this.__actions__.length) {
          wrapped = new LazyWrapper(this);
        }
        wrapped = wrapped.reverse();
        wrapped.__actions__.push({
          'func': thru,
          'args': [reverse],
          'thisArg': undefined
        });
        return new LodashWrapper(wrapped, this.__chain__);
      }
      return this.thru(reverse);
    }

    /**
     * Executes the chain sequence to resolve the unwrapped value.
     *
     * @name value
     * @memberOf _
     * @since 0.1.0
     * @alias toJSON, valueOf
     * @category Seq
     * @returns {*} Returns the resolved unwrapped value.
     * @example
     *
     * _([1, 2, 3]).value();
     * // => [1, 2, 3]
     */
    function wrapperValue() {
      return baseWrapperValue(this.__wrapped__, this.__actions__);
    }

    /*------------------------------------------------------------------------*/

    /**
     * Creates an object composed of keys generated from the results of running
     * each element of `collection` thru `iteratee`. The corresponding value of
     * each key is the number of times the key was returned by `iteratee`. The
     * iteratee is invoked with one argument: (value).
     *
     * @static
     * @memberOf _
     * @since 0.5.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
     * @returns {Object} Returns the composed aggregate object.
     * @example
     *
     * _.countBy([6.1, 4.2, 6.3], Math.floor);
     * // => { '4': 1, '6': 2 }
     *
     * // The `_.property` iteratee shorthand.
     * _.countBy(['one', 'two', 'three'], 'length');
     * // => { '3': 2, '5': 1 }
     */
    var countBy = createAggregator(function(result, value, key) {
      if (hasOwnProperty.call(result, key)) {
        ++result[key];
      } else {
        baseAssignValue(result, key, 1);
      }
    });

    /**
     * Checks if `predicate` returns truthy for **all** elements of `collection`.
     * Iteration is stopped once `predicate` returns falsey. The predicate is
     * invoked with three arguments: (value, index|key, collection).
     *
     * **Note:** This method returns `true` for
     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
     * elements of empty collections.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {boolean} Returns `true` if all elements pass the predicate check,
     *  else `false`.
     * @example
     *
     * _.every([true, 1, null, 'yes'], Boolean);
     * // => false
     *
     * var users = [
     *   { 'user': 'barney', 'age': 36, 'active': false },
     *   { 'user': 'fred',   'age': 40, 'active': false }
     * ];
     *
     * // The `_.matches` iteratee shorthand.
     * _.every(users, { 'user': 'barney', 'active': false });
     * // => false
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.every(users, ['active', false]);
     * // => true
     *
     * // The `_.property` iteratee shorthand.
     * _.every(users, 'active');
     * // => false
     */
    function every(collection, predicate, guard) {
      var func = isArray(collection) ? arrayEvery : baseEvery;
      if (guard && isIterateeCall(collection, predicate, guard)) {
        predicate = undefined;
      }
      return func(collection, getIteratee(predicate, 3));
    }

    /**
     * Iterates over elements of `collection`, returning an array of all elements
     * `predicate` returns truthy for. The predicate is invoked with three
     * arguments: (value, index|key, collection).
     *
     * **Note:** Unlike `_.remove`, this method returns a new array.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @returns {Array} Returns the new filtered array.
     * @see _.reject
     * @example
     *
     * var users = [
     *   { 'user': 'barney', 'age': 36, 'active': true },
     *   { 'user': 'fred',   'age': 40, 'active': false }
     * ];
     *
     * _.filter(users, function(o) { return !o.active; });
     * // => objects for ['fred']
     *
     * // The `_.matches` iteratee shorthand.
     * _.filter(users, { 'age': 36, 'active': true });
     * // => objects for ['barney']
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.filter(users, ['active', false]);
     * // => objects for ['fred']
     *
     * // The `_.property` iteratee shorthand.
     * _.filter(users, 'active');
     * // => objects for ['barney']
     *
     * // Combining several predicates using `_.overEvery` or `_.overSome`.
     * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));
     * // => objects for ['fred', 'barney']
     */
    function filter(collection, predicate) {
      var func = isArray(collection) ? arrayFilter : baseFilter;
      return func(collection, getIteratee(predicate, 3));
    }

    /**
     * Iterates over elements of `collection`, returning the first element
     * `predicate` returns truthy for. The predicate is invoked with three
     * arguments: (value, index|key, collection).
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Collection
     * @param {Array|Object} collection The collection to inspect.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @param {number} [fromIndex=0] The index to search from.
     * @returns {*} Returns the matched element, else `undefined`.
     * @example
     *
     * var users = [
     *   { 'user': 'barney',  'age': 36, 'active': true },
     *   { 'user': 'fred',    'age': 40, 'active': false },
     *   { 'user': 'pebbles', 'age': 1,  'active': true }
     * ];
     *
     * _.find(users, function(o) { return o.age < 40; });
     * // => object for 'barney'
     *
     * // The `_.matches` iteratee shorthand.
     * _.find(users, { 'age': 1, 'active': true });
     * // => object for 'pebbles'
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.find(users, ['active', false]);
     * // => object for 'fred'
     *
     * // The `_.property` iteratee shorthand.
     * _.find(users, 'active');
     * // => object for 'barney'
     */
    var find = createFind(findIndex);

    /**
     * This method is like `_.find` except that it iterates over elements of
     * `collection` from right to left.
     *
     * @static
     * @memberOf _
     * @since 2.0.0
     * @category Collection
     * @param {Array|Object} collection The collection to inspect.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @param {number} [fromIndex=collection.length-1] The index to search from.
     * @returns {*} Returns the matched element, else `undefined`.
     * @example
     *
     * _.findLast([1, 2, 3, 4], function(n) {
     *   return n % 2 == 1;
     * });
     * // => 3
     */
    var findLast = createFind(findLastIndex);

    /**
     * Creates a flattened array of values by running each element in `collection`
     * thru `iteratee` and flattening the mapped results. The iteratee is invoked
     * with three arguments: (value, index|key, collection).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @returns {Array} Returns the new flattened array.
     * @example
     *
     * function duplicate(n) {
     *   return [n, n];
     * }
     *
     * _.flatMap([1, 2], duplicate);
     * // => [1, 1, 2, 2]
     */
    function flatMap(collection, iteratee) {
      return baseFlatten(map(collection, iteratee), 1);
    }

    /**
     * This method is like `_.flatMap` except that it recursively flattens the
     * mapped results.
     *
     * @static
     * @memberOf _
     * @since 4.7.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @returns {Array} Returns the new flattened array.
     * @example
     *
     * function duplicate(n) {
     *   return [[[n, n]]];
     * }
     *
     * _.flatMapDeep([1, 2], duplicate);
     * // => [1, 1, 2, 2]
     */
    function flatMapDeep(collection, iteratee) {
      return baseFlatten(map(collection, iteratee), INFINITY);
    }

    /**
     * This method is like `_.flatMap` except that it recursively flattens the
     * mapped results up to `depth` times.
     *
     * @static
     * @memberOf _
     * @since 4.7.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @param {number} [depth=1] The maximum recursion depth.
     * @returns {Array} Returns the new flattened array.
     * @example
     *
     * function duplicate(n) {
     *   return [[[n, n]]];
     * }
     *
     * _.flatMapDepth([1, 2], duplicate, 2);
     * // => [[1, 1], [2, 2]]
     */
    function flatMapDepth(collection, iteratee, depth) {
      depth = depth === undefined ? 1 : toInteger(depth);
      return baseFlatten(map(collection, iteratee), depth);
    }

    /**
     * Iterates over elements of `collection` and invokes `iteratee` for each element.
     * The iteratee is invoked with three arguments: (value, index|key, collection).
     * Iteratee functions may exit iteration early by explicitly returning `false`.
     *
     * **Note:** As with other "Collections" methods, objects with a "length"
     * property are iterated like arrays. To avoid this behavior use `_.forIn`
     * or `_.forOwn` for object iteration.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @alias each
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @returns {Array|Object} Returns `collection`.
     * @see _.forEachRight
     * @example
     *
     * _.forEach([1, 2], function(value) {
     *   console.log(value);
     * });
     * // => Logs `1` then `2`.
     *
     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
     *   console.log(key);
     * });
     * // => Logs 'a' then 'b' (iteration order is not guaranteed).
     */
    function forEach(collection, iteratee) {
      var func = isArray(collection) ? arrayEach : baseEach;
      return func(collection, getIteratee(iteratee, 3));
    }

    /**
     * This method is like `_.forEach` except that it iterates over elements of
     * `collection` from right to left.
     *
     * @static
     * @memberOf _
     * @since 2.0.0
     * @alias eachRight
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @returns {Array|Object} Returns `collection`.
     * @see _.forEach
     * @example
     *
     * _.forEachRight([1, 2], function(value) {
     *   console.log(value);
     * });
     * // => Logs `2` then `1`.
     */
    function forEachRight(collection, iteratee) {
      var func = isArray(collection) ? arrayEachRight : baseEachRight;
      return func(collection, getIteratee(iteratee, 3));
    }

    /**
     * Creates an object composed of keys generated from the results of running
     * each element of `collection` thru `iteratee`. The order of grouped values
     * is determined by the order they occur in `collection`. The corresponding
     * value of each key is an array of elements responsible for generating the
     * key. The iteratee is invoked with one argument: (value).
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
     * @returns {Object} Returns the composed aggregate object.
     * @example
     *
     * _.groupBy([6.1, 4.2, 6.3], Math.floor);
     * // => { '4': [4.2], '6': [6.1, 6.3] }
     *
     * // The `_.property` iteratee shorthand.
     * _.groupBy(['one', 'two', 'three'], 'length');
     * // => { '3': ['one', 'two'], '5': ['three'] }
     */
    var groupBy = createAggregator(function(result, value, key) {
      if (hasOwnProperty.call(result, key)) {
        result[key].push(value);
      } else {
        baseAssignValue(result, key, [value]);
      }
    });

    /**
     * Checks if `value` is in `collection`. If `collection` is a string, it's
     * checked for a substring of `value`, otherwise
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
     * is used for equality comparisons. If `fromIndex` is negative, it's used as
     * the offset from the end of `collection`.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Collection
     * @param {Array|Object|string} collection The collection to inspect.
     * @param {*} value The value to search for.
     * @param {number} [fromIndex=0] The index to search from.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
     * @returns {boolean} Returns `true` if `value` is found, else `false`.
     * @example
     *
     * _.includes([1, 2, 3], 1);
     * // => true
     *
     * _.includes([1, 2, 3], 1, 2);
     * // => false
     *
     * _.includes({ 'a': 1, 'b': 2 }, 1);
     * // => true
     *
     * _.includes('abcd', 'bc');
     * // => true
     */
    function includes(collection, value, fromIndex, guard) {
      collection = isArrayLike(collection) ? collection : values(collection);
      fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;

      var length = collection.length;
      if (fromIndex < 0) {
        fromIndex = nativeMax(length + fromIndex, 0);
      }
      return isString(collection)
        ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
        : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
    }

    /**
     * Invokes the method at `path` of each element in `collection`, returning
     * an array of the results of each invoked method. Any additional arguments
     * are provided to each invoked method. If `path` is a function, it's invoked
     * for, and `this` bound to, each element in `collection`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Array|Function|string} path The path of the method to invoke or
     *  the function invoked per iteration.
     * @param {...*} [args] The arguments to invoke each method with.
     * @returns {Array} Returns the array of results.
     * @example
     *
     * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');
     * // => [[1, 5, 7], [1, 2, 3]]
     *
     * _.invokeMap([123, 456], String.prototype.split, '');
     * // => [['1', '2', '3'], ['4', '5', '6']]
     */
    var invokeMap = baseRest(function(collection, path, args) {
      var index = -1,
          isFunc = typeof path == 'function',
          result = isArrayLike(collection) ? Array(collection.length) : [];

      baseEach(collection, function(value) {
        result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);
      });
      return result;
    });

    /**
     * Creates an object composed of keys generated from the results of running
     * each element of `collection` thru `iteratee`. The corresponding value of
     * each key is the last element responsible for generating the key. The
     * iteratee is invoked with one argument: (value).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
     * @returns {Object} Returns the composed aggregate object.
     * @example
     *
     * var array = [
     *   { 'dir': 'left', 'code': 97 },
     *   { 'dir': 'right', 'code': 100 }
     * ];
     *
     * _.keyBy(array, function(o) {
     *   return String.fromCharCode(o.code);
     * });
     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
     *
     * _.keyBy(array, 'dir');
     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
     */
    var keyBy = createAggregator(function(result, value, key) {
      baseAssignValue(result, key, value);
    });

    /**
     * Creates an array of values by running each element in `collection` thru
     * `iteratee`. The iteratee is invoked with three arguments:
     * (value, index|key, collection).
     *
     * Many lodash methods are guarded to work as iteratees for methods like
     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
     *
     * The guarded methods are:
     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @returns {Array} Returns the new mapped array.
     * @example
     *
     * function square(n) {
     *   return n * n;
     * }
     *
     * _.map([4, 8], square);
     * // => [16, 64]
     *
     * _.map({ 'a': 4, 'b': 8 }, square);
     * // => [16, 64] (iteration order is not guaranteed)
     *
     * var users = [
     *   { 'user': 'barney' },
     *   { 'user': 'fred' }
     * ];
     *
     * // The `_.property` iteratee shorthand.
     * _.map(users, 'user');
     * // => ['barney', 'fred']
     */
    function map(collection, iteratee) {
      var func = isArray(collection) ? arrayMap : baseMap;
      return func(collection, getIteratee(iteratee, 3));
    }

    /**
     * This method is like `_.sortBy` except that it allows specifying the sort
     * orders of the iteratees to sort by. If `orders` is unspecified, all values
     * are sorted in ascending order. Otherwise, specify an order of "desc" for
     * descending or "asc" for ascending sort order of corresponding values.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]
     *  The iteratees to sort by.
     * @param {string[]} [orders] The sort orders of `iteratees`.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
     * @returns {Array} Returns the new sorted array.
     * @example
     *
     * var users = [
     *   { 'user': 'fred',   'age': 48 },
     *   { 'user': 'barney', 'age': 34 },
     *   { 'user': 'fred',   'age': 40 },
     *   { 'user': 'barney', 'age': 36 }
     * ];
     *
     * // Sort by `user` in ascending order and by `age` in descending order.
     * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);
     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
     */
    function orderBy(collection, iteratees, orders, guard) {
      if (collection == null) {
        return [];
      }
      if (!isArray(iteratees)) {
        iteratees = iteratees == null ? [] : [iteratees];
      }
      orders = guard ? undefined : orders;
      if (!isArray(orders)) {
        orders = orders == null ? [] : [orders];
      }
      return baseOrderBy(collection, iteratees, orders);
    }

    /**
     * Creates an array of elements split into two groups, the first of which
     * contains elements `predicate` returns truthy for, the second of which
     * contains elements `predicate` returns falsey for. The predicate is
     * invoked with one argument: (value).
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @returns {Array} Returns the array of grouped elements.
     * @example
     *
     * var users = [
     *   { 'user': 'barney',  'age': 36, 'active': false },
     *   { 'user': 'fred',    'age': 40, 'active': true },
     *   { 'user': 'pebbles', 'age': 1,  'active': false }
     * ];
     *
     * _.partition(users, function(o) { return o.active; });
     * // => objects for [['fred'], ['barney', 'pebbles']]
     *
     * // The `_.matches` iteratee shorthand.
     * _.partition(users, { 'age': 1, 'active': false });
     * // => objects for [['pebbles'], ['barney', 'fred']]
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.partition(users, ['active', false]);
     * // => objects for [['barney', 'pebbles'], ['fred']]
     *
     * // The `_.property` iteratee shorthand.
     * _.partition(users, 'active');
     * // => objects for [['fred'], ['barney', 'pebbles']]
     */
    var partition = createAggregator(function(result, value, key) {
      result[key ? 0 : 1].push(value);
    }, function() { return [[], []]; });

    /**
     * Reduces `collection` to a value which is the accumulated result of running
     * each element in `collection` thru `iteratee`, where each successive
     * invocation is supplied the return value of the previous. If `accumulator`
     * is not given, the first element of `collection` is used as the initial
     * value. The iteratee is invoked with four arguments:
     * (accumulator, value, index|key, collection).
     *
     * Many lodash methods are guarded to work as iteratees for methods like
     * `_.reduce`, `_.reduceRight`, and `_.transform`.
     *
     * The guarded methods are:
     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
     * and `sortBy`
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @param {*} [accumulator] The initial value.
     * @returns {*} Returns the accumulated value.
     * @see _.reduceRight
     * @example
     *
     * _.reduce([1, 2], function(sum, n) {
     *   return sum + n;
     * }, 0);
     * // => 3
     *
     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
     *   (result[value] || (result[value] = [])).push(key);
     *   return result;
     * }, {});
     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
     */
    function reduce(collection, iteratee, accumulator) {
      var func = isArray(collection) ? arrayReduce : baseReduce,
          initAccum = arguments.length < 3;

      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);
    }

    /**
     * This method is like `_.reduce` except that it iterates over elements of
     * `collection` from right to left.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @param {*} [accumulator] The initial value.
     * @returns {*} Returns the accumulated value.
     * @see _.reduce
     * @example
     *
     * var array = [[0, 1], [2, 3], [4, 5]];
     *
     * _.reduceRight(array, function(flattened, other) {
     *   return flattened.concat(other);
     * }, []);
     * // => [4, 5, 2, 3, 0, 1]
     */
    function reduceRight(collection, iteratee, accumulator) {
      var func = isArray(collection) ? arrayReduceRight : baseReduce,
          initAccum = arguments.length < 3;

      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);
    }

    /**
     * The opposite of `_.filter`; this method returns the elements of `collection`
     * that `predicate` does **not** return truthy for.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @returns {Array} Returns the new filtered array.
     * @see _.filter
     * @example
     *
     * var users = [
     *   { 'user': 'barney', 'age': 36, 'active': false },
     *   { 'user': 'fred',   'age': 40, 'active': true }
     * ];
     *
     * _.reject(users, function(o) { return !o.active; });
     * // => objects for ['fred']
     *
     * // The `_.matches` iteratee shorthand.
     * _.reject(users, { 'age': 40, 'active': true });
     * // => objects for ['barney']
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.reject(users, ['active', false]);
     * // => objects for ['fred']
     *
     * // The `_.property` iteratee shorthand.
     * _.reject(users, 'active');
     * // => objects for ['barney']
     */
    function reject(collection, predicate) {
      var func = isArray(collection) ? arrayFilter : baseFilter;
      return func(collection, negate(getIteratee(predicate, 3)));
    }

    /**
     * Gets a random element from `collection`.
     *
     * @static
     * @memberOf _
     * @since 2.0.0
     * @category Collection
     * @param {Array|Object} collection The collection to sample.
     * @returns {*} Returns the random element.
     * @example
     *
     * _.sample([1, 2, 3, 4]);
     * // => 2
     */
    function sample(collection) {
      var func = isArray(collection) ? arraySample : baseSample;
      return func(collection);
    }

    /**
     * Gets `n` random elements at unique keys from `collection` up to the
     * size of `collection`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Collection
     * @param {Array|Object} collection The collection to sample.
     * @param {number} [n=1] The number of elements to sample.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {Array} Returns the random elements.
     * @example
     *
     * _.sampleSize([1, 2, 3], 2);
     * // => [3, 1]
     *
     * _.sampleSize([1, 2, 3], 4);
     * // => [2, 3, 1]
     */
    function sampleSize(collection, n, guard) {
      if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {
        n = 1;
      } else {
        n = toInteger(n);
      }
      var func = isArray(collection) ? arraySampleSize : baseSampleSize;
      return func(collection, n);
    }

    /**
     * Creates an array of shuffled values, using a version of the
     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Collection
     * @param {Array|Object} collection The collection to shuffle.
     * @returns {Array} Returns the new shuffled array.
     * @example
     *
     * _.shuffle([1, 2, 3, 4]);
     * // => [4, 1, 3, 2]
     */
    function shuffle(collection) {
      var func = isArray(collection) ? arrayShuffle : baseShuffle;
      return func(collection);
    }

    /**
     * Gets the size of `collection` by returning its length for array-like
     * values or the number of own enumerable string keyed properties for objects.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Collection
     * @param {Array|Object|string} collection The collection to inspect.
     * @returns {number} Returns the collection size.
     * @example
     *
     * _.size([1, 2, 3]);
     * // => 3
     *
     * _.size({ 'a': 1, 'b': 2 });
     * // => 2
     *
     * _.size('pebbles');
     * // => 7
     */
    function size(collection) {
      if (collection == null) {
        return 0;
      }
      if (isArrayLike(collection)) {
        return isString(collection) ? stringSize(collection) : collection.length;
      }
      var tag = getTag(collection);
      if (tag == mapTag || tag == setTag) {
        return collection.size;
      }
      return baseKeys(collection).length;
    }

    /**
     * Checks if `predicate` returns truthy for **any** element of `collection`.
     * Iteration is stopped once `predicate` returns truthy. The predicate is
     * invoked with three arguments: (value, index|key, collection).
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {boolean} Returns `true` if any element passes the predicate check,
     *  else `false`.
     * @example
     *
     * _.some([null, 0, 'yes', false], Boolean);
     * // => true
     *
     * var users = [
     *   { 'user': 'barney', 'active': true },
     *   { 'user': 'fred',   'active': false }
     * ];
     *
     * // The `_.matches` iteratee shorthand.
     * _.some(users, { 'user': 'barney', 'active': false });
     * // => false
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.some(users, ['active', false]);
     * // => true
     *
     * // The `_.property` iteratee shorthand.
     * _.some(users, 'active');
     * // => true
     */
    function some(collection, predicate, guard) {
      var func = isArray(collection) ? arraySome : baseSome;
      if (guard && isIterateeCall(collection, predicate, guard)) {
        predicate = undefined;
      }
      return func(collection, getIteratee(predicate, 3));
    }

    /**
     * Creates an array of elements, sorted in ascending order by the results of
     * running each element in a collection thru each iteratee. This method
     * performs a stable sort, that is, it preserves the original sort order of
     * equal elements. The iteratees are invoked with one argument: (value).
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Collection
     * @param {Array|Object} collection The collection to iterate over.
     * @param {...(Function|Function[])} [iteratees=[_.identity]]
     *  The iteratees to sort by.
     * @returns {Array} Returns the new sorted array.
     * @example
     *
     * var users = [
     *   { 'user': 'fred',   'age': 48 },
     *   { 'user': 'barney', 'age': 36 },
     *   { 'user': 'fred',   'age': 30 },
     *   { 'user': 'barney', 'age': 34 }
     * ];
     *
     * _.sortBy(users, [function(o) { return o.user; }]);
     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]
     *
     * _.sortBy(users, ['user', 'age']);
     * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]
     */
    var sortBy = baseRest(function(collection, iteratees) {
      if (collection == null) {
        return [];
      }
      var length = iteratees.length;
      if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {
        iteratees = [];
      } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {
        iteratees = [iteratees[0]];
      }
      return baseOrderBy(collection, baseFlatten(iteratees, 1), []);
    });

    /*------------------------------------------------------------------------*/

    /**
     * Gets the timestamp of the number of milliseconds that have elapsed since
     * the Unix epoch (1 January 1970 00:00:00 UTC).
     *
     * @static
     * @memberOf _
     * @since 2.4.0
     * @category Date
     * @returns {number} Returns the timestamp.
     * @example
     *
     * _.defer(function(stamp) {
     *   console.log(_.now() - stamp);
     * }, _.now());
     * // => Logs the number of milliseconds it took for the deferred invocation.
     */
    var now = ctxNow || function() {
      return root.Date.now();
    };

    /*------------------------------------------------------------------------*/

    /**
     * The opposite of `_.before`; this method creates a function that invokes
     * `func` once it's called `n` or more times.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Function
     * @param {number} n The number of calls before `func` is invoked.
     * @param {Function} func The function to restrict.
     * @returns {Function} Returns the new restricted function.
     * @example
     *
     * var saves = ['profile', 'settings'];
     *
     * var done = _.after(saves.length, function() {
     *   console.log('done saving!');
     * });
     *
     * _.forEach(saves, function(type) {
     *   asyncSave({ 'type': type, 'complete': done });
     * });
     * // => Logs 'done saving!' after the two async saves have completed.
     */
    function after(n, func) {
      if (typeof func != 'function') {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      n = toInteger(n);
      return function() {
        if (--n < 1) {
          return func.apply(this, arguments);
        }
      };
    }

    /**
     * Creates a function that invokes `func`, with up to `n` arguments,
     * ignoring any additional arguments.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Function
     * @param {Function} func The function to cap arguments for.
     * @param {number} [n=func.length] The arity cap.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {Function} Returns the new capped function.
     * @example
     *
     * _.map(['6', '8', '10'], _.ary(parseInt, 1));
     * // => [6, 8, 10]
     */
    function ary(func, n, guard) {
      n = guard ? undefined : n;
      n = (func && n == null) ? func.length : n;
      return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);
    }

    /**
     * Creates a function that invokes `func`, with the `this` binding and arguments
     * of the created function, while it's called less than `n` times. Subsequent
     * calls to the created function return the result of the last `func` invocation.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Function
     * @param {number} n The number of calls at which `func` is no longer invoked.
     * @param {Function} func The function to restrict.
     * @returns {Function} Returns the new restricted function.
     * @example
     *
     * jQuery(element).on('click', _.before(5, addContactToList));
     * // => Allows adding up to 4 contacts to the list.
     */
    function before(n, func) {
      var result;
      if (typeof func != 'function') {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      n = toInteger(n);
      return function() {
        if (--n > 0) {
          result = func.apply(this, arguments);
        }
        if (n <= 1) {
          func = undefined;
        }
        return result;
      };
    }

    /**
     * Creates a function that invokes `func` with the `this` binding of `thisArg`
     * and `partials` prepended to the arguments it receives.
     *
     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
     * may be used as a placeholder for partially applied arguments.
     *
     * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
     * property of bound functions.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Function
     * @param {Function} func The function to bind.
     * @param {*} thisArg The `this` binding of `func`.
     * @param {...*} [partials] The arguments to be partially applied.
     * @returns {Function} Returns the new bound function.
     * @example
     *
     * function greet(greeting, punctuation) {
     *   return greeting + ' ' + this.user + punctuation;
     * }
     *
     * var object = { 'user': 'fred' };
     *
     * var bound = _.bind(greet, object, 'hi');
     * bound('!');
     * // => 'hi fred!'
     *
     * // Bound with placeholders.
     * var bound = _.bind(greet, object, _, '!');
     * bound('hi');
     * // => 'hi fred!'
     */
    var bind = baseRest(function(func, thisArg, partials) {
      var bitmask = WRAP_BIND_FLAG;
      if (partials.length) {
        var holders = replaceHolders(partials, getHolder(bind));
        bitmask |= WRAP_PARTIAL_FLAG;
      }
      return createWrap(func, bitmask, thisArg, partials, holders);
    });

    /**
     * Creates a function that invokes the method at `object[key]` with `partials`
     * prepended to the arguments it receives.
     *
     * This method differs from `_.bind` by allowing bound functions to reference
     * methods that may be redefined or don't yet exist. See
     * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)
     * for more details.
     *
     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic
     * builds, may be used as a placeholder for partially applied arguments.
     *
     * @static
     * @memberOf _
     * @since 0.10.0
     * @category Function
     * @param {Object} object The object to invoke the method on.
     * @param {string} key The key of the method.
     * @param {...*} [partials] The arguments to be partially applied.
     * @returns {Function} Returns the new bound function.
     * @example
     *
     * var object = {
     *   'user': 'fred',
     *   'greet': function(greeting, punctuation) {
     *     return greeting + ' ' + this.user + punctuation;
     *   }
     * };
     *
     * var bound = _.bindKey(object, 'greet', 'hi');
     * bound('!');
     * // => 'hi fred!'
     *
     * object.greet = function(greeting, punctuation) {
     *   return greeting + 'ya ' + this.user + punctuation;
     * };
     *
     * bound('!');
     * // => 'hiya fred!'
     *
     * // Bound with placeholders.
     * var bound = _.bindKey(object, 'greet', _, '!');
     * bound('hi');
     * // => 'hiya fred!'
     */
    var bindKey = baseRest(function(object, key, partials) {
      var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;
      if (partials.length) {
        var holders = replaceHolders(partials, getHolder(bindKey));
        bitmask |= WRAP_PARTIAL_FLAG;
      }
      return createWrap(key, bitmask, object, partials, holders);
    });

    /**
     * Creates a function that accepts arguments of `func` and either invokes
     * `func` returning its result, if at least `arity` number of arguments have
     * been provided, or returns a function that accepts the remaining `func`
     * arguments, and so on. The arity of `func` may be specified if `func.length`
     * is not sufficient.
     *
     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,
     * may be used as a placeholder for provided arguments.
     *
     * **Note:** This method doesn't set the "length" property of curried functions.
     *
     * @static
     * @memberOf _
     * @since 2.0.0
     * @category Function
     * @param {Function} func The function to curry.
     * @param {number} [arity=func.length] The arity of `func`.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {Function} Returns the new curried function.
     * @example
     *
     * var abc = function(a, b, c) {
     *   return [a, b, c];
     * };
     *
     * var curried = _.curry(abc);
     *
     * curried(1)(2)(3);
     * // => [1, 2, 3]
     *
     * curried(1, 2)(3);
     * // => [1, 2, 3]
     *
     * curried(1, 2, 3);
     * // => [1, 2, 3]
     *
     * // Curried with placeholders.
     * curried(1)(_, 3)(2);
     * // => [1, 2, 3]
     */
    function curry(func, arity, guard) {
      arity = guard ? undefined : arity;
      var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
      result.placeholder = curry.placeholder;
      return result;
    }

    /**
     * This method is like `_.curry` except that arguments are applied to `func`
     * in the manner of `_.partialRight` instead of `_.partial`.
     *
     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic
     * builds, may be used as a placeholder for provided arguments.
     *
     * **Note:** This method doesn't set the "length" property of curried functions.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Function
     * @param {Function} func The function to curry.
     * @param {number} [arity=func.length] The arity of `func`.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {Function} Returns the new curried function.
     * @example
     *
     * var abc = function(a, b, c) {
     *   return [a, b, c];
     * };
     *
     * var curried = _.curryRight(abc);
     *
     * curried(3)(2)(1);
     * // => [1, 2, 3]
     *
     * curried(2, 3)(1);
     * // => [1, 2, 3]
     *
     * curried(1, 2, 3);
     * // => [1, 2, 3]
     *
     * // Curried with placeholders.
     * curried(3)(1, _)(2);
     * // => [1, 2, 3]
     */
    function curryRight(func, arity, guard) {
      arity = guard ? undefined : arity;
      var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
      result.placeholder = curryRight.placeholder;
      return result;
    }

    /**
     * Creates a debounced function that delays invoking `func` until after `wait`
     * milliseconds have elapsed since the last time the debounced function was
     * invoked. The debounced function comes with a `cancel` method to cancel
     * delayed `func` invocations and a `flush` method to immediately invoke them.
     * Provide `options` to indicate whether `func` should be invoked on the
     * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
     * with the last arguments provided to the debounced function. Subsequent
     * calls to the debounced function return the result of the last `func`
     * invocation.
     *
     * **Note:** If `leading` and `trailing` options are `true`, `func` is
     * invoked on the trailing edge of the timeout only if the debounced function
     * is invoked more than once during the `wait` timeout.
     *
     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
     * until to the next tick, similar to `setTimeout` with a timeout of `0`.
     *
     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
     * for details over the differences between `_.debounce` and `_.throttle`.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Function
     * @param {Function} func The function to debounce.
     * @param {number} [wait=0] The number of milliseconds to delay.
     * @param {Object} [options={}] The options object.
     * @param {boolean} [options.leading=false]
     *  Specify invoking on the leading edge of the timeout.
     * @param {number} [options.maxWait]
     *  The maximum time `func` is allowed to be delayed before it's invoked.
     * @param {boolean} [options.trailing=true]
     *  Specify invoking on the trailing edge of the timeout.
     * @returns {Function} Returns the new debounced function.
     * @example
     *
     * // Avoid costly calculations while the window size is in flux.
     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
     *
     * // Invoke `sendMail` when clicked, debouncing subsequent calls.
     * jQuery(element).on('click', _.debounce(sendMail, 300, {
     *   'leading': true,
     *   'trailing': false
     * }));
     *
     * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
     * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
     * var source = new EventSource('/stream');
     * jQuery(source).on('message', debounced);
     *
     * // Cancel the trailing debounced invocation.
     * jQuery(window).on('popstate', debounced.cancel);
     */
    function debounce(func, wait, options) {
      var lastArgs,
          lastThis,
          maxWait,
          result,
          timerId,
          lastCallTime,
          lastInvokeTime = 0,
          leading = false,
          maxing = false,
          trailing = true;

      if (typeof func != 'function') {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      wait = toNumber(wait) || 0;
      if (isObject(options)) {
        leading = !!options.leading;
        maxing = 'maxWait' in options;
        maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
        trailing = 'trailing' in options ? !!options.trailing : trailing;
      }

      function invokeFunc(time) {
        var args = lastArgs,
            thisArg = lastThis;

        lastArgs = lastThis = undefined;
        lastInvokeTime = time;
        result = func.apply(thisArg, args);
        return result;
      }

      function leadingEdge(time) {
        // Reset any `maxWait` timer.
        lastInvokeTime = time;
        // Start the timer for the trailing edge.
        timerId = setTimeout(timerExpired, wait);
        // Invoke the leading edge.
        return leading ? invokeFunc(time) : result;
      }

      function remainingWait(time) {
        var timeSinceLastCall = time - lastCallTime,
            timeSinceLastInvoke = time - lastInvokeTime,
            timeWaiting = wait - timeSinceLastCall;

        return maxing
          ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
          : timeWaiting;
      }

      function shouldInvoke(time) {
        var timeSinceLastCall = time - lastCallTime,
            timeSinceLastInvoke = time - lastInvokeTime;

        // Either this is the first call, activity has stopped and we're at the
        // trailing edge, the system time has gone backwards and we're treating
        // it as the trailing edge, or we've hit the `maxWait` limit.
        return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
          (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
      }

      function timerExpired() {
        var time = now();
        if (shouldInvoke(time)) {
          return trailingEdge(time);
        }
        // Restart the timer.
        timerId = setTimeout(timerExpired, remainingWait(time));
      }

      function trailingEdge(time) {
        timerId = undefined;

        // Only invoke if we have `lastArgs` which means `func` has been
        // debounced at least once.
        if (trailing && lastArgs) {
          return invokeFunc(time);
        }
        lastArgs = lastThis = undefined;
        return result;
      }

      function cancel() {
        if (timerId !== undefined) {
          clearTimeout(timerId);
        }
        lastInvokeTime = 0;
        lastArgs = lastCallTime = lastThis = timerId = undefined;
      }

      function flush() {
        return timerId === undefined ? result : trailingEdge(now());
      }

      function debounced() {
        var time = now(),
            isInvoking = shouldInvoke(time);

        lastArgs = arguments;
        lastThis = this;
        lastCallTime = time;

        if (isInvoking) {
          if (timerId === undefined) {
            return leadingEdge(lastCallTime);
          }
          if (maxing) {
            // Handle invocations in a tight loop.
            clearTimeout(timerId);
            timerId = setTimeout(timerExpired, wait);
            return invokeFunc(lastCallTime);
          }
        }
        if (timerId === undefined) {
          timerId = setTimeout(timerExpired, wait);
        }
        return result;
      }
      debounced.cancel = cancel;
      debounced.flush = flush;
      return debounced;
    }

    /**
     * Defers invoking the `func` until the current call stack has cleared. Any
     * additional arguments are provided to `func` when it's invoked.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Function
     * @param {Function} func The function to defer.
     * @param {...*} [args] The arguments to invoke `func` with.
     * @returns {number} Returns the timer id.
     * @example
     *
     * _.defer(function(text) {
     *   console.log(text);
     * }, 'deferred');
     * // => Logs 'deferred' after one millisecond.
     */
    var defer = baseRest(function(func, args) {
      return baseDelay(func, 1, args);
    });

    /**
     * Invokes `func` after `wait` milliseconds. Any additional arguments are
     * provided to `func` when it's invoked.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Function
     * @param {Function} func The function to delay.
     * @param {number} wait The number of milliseconds to delay invocation.
     * @param {...*} [args] The arguments to invoke `func` with.
     * @returns {number} Returns the timer id.
     * @example
     *
     * _.delay(function(text) {
     *   console.log(text);
     * }, 1000, 'later');
     * // => Logs 'later' after one second.
     */
    var delay = baseRest(function(func, wait, args) {
      return baseDelay(func, toNumber(wait) || 0, args);
    });

    /**
     * Creates a function that invokes `func` with arguments reversed.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Function
     * @param {Function} func The function to flip arguments for.
     * @returns {Function} Returns the new flipped function.
     * @example
     *
     * var flipped = _.flip(function() {
     *   return _.toArray(arguments);
     * });
     *
     * flipped('a', 'b', 'c', 'd');
     * // => ['d', 'c', 'b', 'a']
     */
    function flip(func) {
      return createWrap(func, WRAP_FLIP_FLAG);
    }

    /**
     * Creates a function that memoizes the result of `func`. If `resolver` is
     * provided, it determines the cache key for storing the result based on the
     * arguments provided to the memoized function. By default, the first argument
     * provided to the memoized function is used as the map cache key. The `func`
     * is invoked with the `this` binding of the memoized function.
     *
     * **Note:** The cache is exposed as the `cache` property on the memoized
     * function. Its creation may be customized by replacing the `_.memoize.Cache`
     * constructor with one whose instances implement the
     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
     * method interface of `clear`, `delete`, `get`, `has`, and `set`.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Function
     * @param {Function} func The function to have its output memoized.
     * @param {Function} [resolver] The function to resolve the cache key.
     * @returns {Function} Returns the new memoized function.
     * @example
     *
     * var object = { 'a': 1, 'b': 2 };
     * var other = { 'c': 3, 'd': 4 };
     *
     * var values = _.memoize(_.values);
     * values(object);
     * // => [1, 2]
     *
     * values(other);
     * // => [3, 4]
     *
     * object.a = 2;
     * values(object);
     * // => [1, 2]
     *
     * // Modify the result cache.
     * values.cache.set(object, ['a', 'b']);
     * values(object);
     * // => ['a', 'b']
     *
     * // Replace `_.memoize.Cache`.
     * _.memoize.Cache = WeakMap;
     */
    function memoize(func, resolver) {
      if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      var memoized = function() {
        var args = arguments,
            key = resolver ? resolver.apply(this, args) : args[0],
            cache = memoized.cache;

        if (cache.has(key)) {
          return cache.get(key);
        }
        var result = func.apply(this, args);
        memoized.cache = cache.set(key, result) || cache;
        return result;
      };
      memoized.cache = new (memoize.Cache || MapCache);
      return memoized;
    }

    // Expose `MapCache`.
    memoize.Cache = MapCache;

    /**
     * Creates a function that negates the result of the predicate `func`. The
     * `func` predicate is invoked with the `this` binding and arguments of the
     * created function.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Function
     * @param {Function} predicate The predicate to negate.
     * @returns {Function} Returns the new negated function.
     * @example
     *
     * function isEven(n) {
     *   return n % 2 == 0;
     * }
     *
     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
     * // => [1, 3, 5]
     */
    function negate(predicate) {
      if (typeof predicate != 'function') {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      return function() {
        var args = arguments;
        switch (args.length) {
          case 0: return !predicate.call(this);
          case 1: return !predicate.call(this, args[0]);
          case 2: return !predicate.call(this, args[0], args[1]);
          case 3: return !predicate.call(this, args[0], args[1], args[2]);
        }
        return !predicate.apply(this, args);
      };
    }

    /**
     * Creates a function that is restricted to invoking `func` once. Repeat calls
     * to the function return the value of the first invocation. The `func` is
     * invoked with the `this` binding and arguments of the created function.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Function
     * @param {Function} func The function to restrict.
     * @returns {Function} Returns the new restricted function.
     * @example
     *
     * var initialize = _.once(createApplication);
     * initialize();
     * initialize();
     * // => `createApplication` is invoked once
     */
    function once(func) {
      return before(2, func);
    }

    /**
     * Creates a function that invokes `func` with its arguments transformed.
     *
     * @static
     * @since 4.0.0
     * @memberOf _
     * @category Function
     * @param {Function} func The function to wrap.
     * @param {...(Function|Function[])} [transforms=[_.identity]]
     *  The argument transforms.
     * @returns {Function} Returns the new function.
     * @example
     *
     * function doubled(n) {
     *   return n * 2;
     * }
     *
     * function square(n) {
     *   return n * n;
     * }
     *
     * var func = _.overArgs(function(x, y) {
     *   return [x, y];
     * }, [square, doubled]);
     *
     * func(9, 3);
     * // => [81, 6]
     *
     * func(10, 5);
     * // => [100, 10]
     */
    var overArgs = castRest(function(func, transforms) {
      transforms = (transforms.length == 1 && isArray(transforms[0]))
        ? arrayMap(transforms[0], baseUnary(getIteratee()))
        : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));

      var funcsLength = transforms.length;
      return baseRest(function(args) {
        var index = -1,
            length = nativeMin(args.length, funcsLength);

        while (++index < length) {
          args[index] = transforms[index].call(this, args[index]);
        }
        return apply(func, this, args);
      });
    });

    /**
     * Creates a function that invokes `func` with `partials` prepended to the
     * arguments it receives. This method is like `_.bind` except it does **not**
     * alter the `this` binding.
     *
     * The `_.partial.placeholder` value, which defaults to `_` in monolithic
     * builds, may be used as a placeholder for partially applied arguments.
     *
     * **Note:** This method doesn't set the "length" property of partially
     * applied functions.
     *
     * @static
     * @memberOf _
     * @since 0.2.0
     * @category Function
     * @param {Function} func The function to partially apply arguments to.
     * @param {...*} [partials] The arguments to be partially applied.
     * @returns {Function} Returns the new partially applied function.
     * @example
     *
     * function greet(greeting, name) {
     *   return greeting + ' ' + name;
     * }
     *
     * var sayHelloTo = _.partial(greet, 'hello');
     * sayHelloTo('fred');
     * // => 'hello fred'
     *
     * // Partially applied with placeholders.
     * var greetFred = _.partial(greet, _, 'fred');
     * greetFred('hi');
     * // => 'hi fred'
     */
    var partial = baseRest(function(func, partials) {
      var holders = replaceHolders(partials, getHolder(partial));
      return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);
    });

    /**
     * This method is like `_.partial` except that partially applied arguments
     * are appended to the arguments it receives.
     *
     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic
     * builds, may be used as a placeholder for partially applied arguments.
     *
     * **Note:** This method doesn't set the "length" property of partially
     * applied functions.
     *
     * @static
     * @memberOf _
     * @since 1.0.0
     * @category Function
     * @param {Function} func The function to partially apply arguments to.
     * @param {...*} [partials] The arguments to be partially applied.
     * @returns {Function} Returns the new partially applied function.
     * @example
     *
     * function greet(greeting, name) {
     *   return greeting + ' ' + name;
     * }
     *
     * var greetFred = _.partialRight(greet, 'fred');
     * greetFred('hi');
     * // => 'hi fred'
     *
     * // Partially applied with placeholders.
     * var sayHelloTo = _.partialRight(greet, 'hello', _);
     * sayHelloTo('fred');
     * // => 'hello fred'
     */
    var partialRight = baseRest(function(func, partials) {
      var holders = replaceHolders(partials, getHolder(partialRight));
      return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);
    });

    /**
     * Creates a function that invokes `func` with arguments arranged according
     * to the specified `indexes` where the argument value at the first index is
     * provided as the first argument, the argument value at the second index is
     * provided as the second argument, and so on.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Function
     * @param {Function} func The function to rearrange arguments for.
     * @param {...(number|number[])} indexes The arranged argument indexes.
     * @returns {Function} Returns the new function.
     * @example
     *
     * var rearged = _.rearg(function(a, b, c) {
     *   return [a, b, c];
     * }, [2, 0, 1]);
     *
     * rearged('b', 'c', 'a')
     * // => ['a', 'b', 'c']
     */
    var rearg = flatRest(function(func, indexes) {
      return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);
    });

    /**
     * Creates a function that invokes `func` with the `this` binding of the
     * created function and arguments from `start` and beyond provided as
     * an array.
     *
     * **Note:** This method is based on the
     * [rest parameter](https://mdn.io/rest_parameters).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Function
     * @param {Function} func The function to apply a rest parameter to.
     * @param {number} [start=func.length-1] The start position of the rest parameter.
     * @returns {Function} Returns the new function.
     * @example
     *
     * var say = _.rest(function(what, names) {
     *   return what + ' ' + _.initial(names).join(', ') +
     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);
     * });
     *
     * say('hello', 'fred', 'barney', 'pebbles');
     * // => 'hello fred, barney, & pebbles'
     */
    function rest(func, start) {
      if (typeof func != 'function') {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      start = start === undefined ? start : toInteger(start);
      return baseRest(func, start);
    }

    /**
     * Creates a function that invokes `func` with the `this` binding of the
     * create function and an array of arguments much like
     * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).
     *
     * **Note:** This method is based on the
     * [spread operator](https://mdn.io/spread_operator).
     *
     * @static
     * @memberOf _
     * @since 3.2.0
     * @category Function
     * @param {Function} func The function to spread arguments over.
     * @param {number} [start=0] The start position of the spread.
     * @returns {Function} Returns the new function.
     * @example
     *
     * var say = _.spread(function(who, what) {
     *   return who + ' says ' + what;
     * });
     *
     * say(['fred', 'hello']);
     * // => 'fred says hello'
     *
     * var numbers = Promise.all([
     *   Promise.resolve(40),
     *   Promise.resolve(36)
     * ]);
     *
     * numbers.then(_.spread(function(x, y) {
     *   return x + y;
     * }));
     * // => a Promise of 76
     */
    function spread(func, start) {
      if (typeof func != 'function') {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      start = start == null ? 0 : nativeMax(toInteger(start), 0);
      return baseRest(function(args) {
        var array = args[start],
            otherArgs = castSlice(args, 0, start);

        if (array) {
          arrayPush(otherArgs, array);
        }
        return apply(func, this, otherArgs);
      });
    }

    /**
     * Creates a throttled function that only invokes `func` at most once per
     * every `wait` milliseconds. The throttled function comes with a `cancel`
     * method to cancel delayed `func` invocations and a `flush` method to
     * immediately invoke them. Provide `options` to indicate whether `func`
     * should be invoked on the leading and/or trailing edge of the `wait`
     * timeout. The `func` is invoked with the last arguments provided to the
     * throttled function. Subsequent calls to the throttled function return the
     * result of the last `func` invocation.
     *
     * **Note:** If `leading` and `trailing` options are `true`, `func` is
     * invoked on the trailing edge of the timeout only if the throttled function
     * is invoked more than once during the `wait` timeout.
     *
     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
     * until to the next tick, similar to `setTimeout` with a timeout of `0`.
     *
     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
     * for details over the differences between `_.throttle` and `_.debounce`.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Function
     * @param {Function} func The function to throttle.
     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
     * @param {Object} [options={}] The options object.
     * @param {boolean} [options.leading=true]
     *  Specify invoking on the leading edge of the timeout.
     * @param {boolean} [options.trailing=true]
     *  Specify invoking on the trailing edge of the timeout.
     * @returns {Function} Returns the new throttled function.
     * @example
     *
     * // Avoid excessively updating the position while scrolling.
     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
     *
     * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
     * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
     * jQuery(element).on('click', throttled);
     *
     * // Cancel the trailing throttled invocation.
     * jQuery(window).on('popstate', throttled.cancel);
     */
    function throttle(func, wait, options) {
      var leading = true,
          trailing = true;

      if (typeof func != 'function') {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      if (isObject(options)) {
        leading = 'leading' in options ? !!options.leading : leading;
        trailing = 'trailing' in options ? !!options.trailing : trailing;
      }
      return debounce(func, wait, {
        'leading': leading,
        'maxWait': wait,
        'trailing': trailing
      });
    }

    /**
     * Creates a function that accepts up to one argument, ignoring any
     * additional arguments.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Function
     * @param {Function} func The function to cap arguments for.
     * @returns {Function} Returns the new capped function.
     * @example
     *
     * _.map(['6', '8', '10'], _.unary(parseInt));
     * // => [6, 8, 10]
     */
    function unary(func) {
      return ary(func, 1);
    }

    /**
     * Creates a function that provides `value` to `wrapper` as its first
     * argument. Any additional arguments provided to the function are appended
     * to those provided to the `wrapper`. The wrapper is invoked with the `this`
     * binding of the created function.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Function
     * @param {*} value The value to wrap.
     * @param {Function} [wrapper=identity] The wrapper function.
     * @returns {Function} Returns the new function.
     * @example
     *
     * var p = _.wrap(_.escape, function(func, text) {
     *   return '<p>' + func(text) + '</p>';
     * });
     *
     * p('fred, barney, & pebbles');
     * // => '<p>fred, barney, &amp; pebbles</p>'
     */
    function wrap(value, wrapper) {
      return partial(castFunction(wrapper), value);
    }

    /*------------------------------------------------------------------------*/

    /**
     * Casts `value` as an array if it's not one.
     *
     * @static
     * @memberOf _
     * @since 4.4.0
     * @category Lang
     * @param {*} value The value to inspect.
     * @returns {Array} Returns the cast array.
     * @example
     *
     * _.castArray(1);
     * // => [1]
     *
     * _.castArray({ 'a': 1 });
     * // => [{ 'a': 1 }]
     *
     * _.castArray('abc');
     * // => ['abc']
     *
     * _.castArray(null);
     * // => [null]
     *
     * _.castArray(undefined);
     * // => [undefined]
     *
     * _.castArray();
     * // => []
     *
     * var array = [1, 2, 3];
     * console.log(_.castArray(array) === array);
     * // => true
     */
    function castArray() {
      if (!arguments.length) {
        return [];
      }
      var value = arguments[0];
      return isArray(value) ? value : [value];
    }

    /**
     * Creates a shallow clone of `value`.
     *
     * **Note:** This method is loosely based on the
     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
     * and supports cloning arrays, array buffers, booleans, date objects, maps,
     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
     * arrays. The own enumerable properties of `arguments` objects are cloned
     * as plain objects. An empty object is returned for uncloneable values such
     * as error objects, functions, DOM nodes, and WeakMaps.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to clone.
     * @returns {*} Returns the cloned value.
     * @see _.cloneDeep
     * @example
     *
     * var objects = [{ 'a': 1 }, { 'b': 2 }];
     *
     * var shallow = _.clone(objects);
     * console.log(shallow[0] === objects[0]);
     * // => true
     */
    function clone(value) {
      return baseClone(value, CLONE_SYMBOLS_FLAG);
    }

    /**
     * This method is like `_.clone` except that it accepts `customizer` which
     * is invoked to produce the cloned value. If `customizer` returns `undefined`,
     * cloning is handled by the method instead. The `customizer` is invoked with
     * up to four arguments; (value [, index|key, object, stack]).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to clone.
     * @param {Function} [customizer] The function to customize cloning.
     * @returns {*} Returns the cloned value.
     * @see _.cloneDeepWith
     * @example
     *
     * function customizer(value) {
     *   if (_.isElement(value)) {
     *     return value.cloneNode(false);
     *   }
     * }
     *
     * var el = _.cloneWith(document.body, customizer);
     *
     * console.log(el === document.body);
     * // => false
     * console.log(el.nodeName);
     * // => 'BODY'
     * console.log(el.childNodes.length);
     * // => 0
     */
    function cloneWith(value, customizer) {
      customizer = typeof customizer == 'function' ? customizer : undefined;
      return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);
    }

    /**
     * This method is like `_.clone` except that it recursively clones `value`.
     *
     * @static
     * @memberOf _
     * @since 1.0.0
     * @category Lang
     * @param {*} value The value to recursively clone.
     * @returns {*} Returns the deep cloned value.
     * @see _.clone
     * @example
     *
     * var objects = [{ 'a': 1 }, { 'b': 2 }];
     *
     * var deep = _.cloneDeep(objects);
     * console.log(deep[0] === objects[0]);
     * // => false
     */
    function cloneDeep(value) {
      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);
    }

    /**
     * This method is like `_.cloneWith` except that it recursively clones `value`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to recursively clone.
     * @param {Function} [customizer] The function to customize cloning.
     * @returns {*} Returns the deep cloned value.
     * @see _.cloneWith
     * @example
     *
     * function customizer(value) {
     *   if (_.isElement(value)) {
     *     return value.cloneNode(true);
     *   }
     * }
     *
     * var el = _.cloneDeepWith(document.body, customizer);
     *
     * console.log(el === document.body);
     * // => false
     * console.log(el.nodeName);
     * // => 'BODY'
     * console.log(el.childNodes.length);
     * // => 20
     */
    function cloneDeepWith(value, customizer) {
      customizer = typeof customizer == 'function' ? customizer : undefined;
      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);
    }

    /**
     * Checks if `object` conforms to `source` by invoking the predicate
     * properties of `source` with the corresponding property values of `object`.
     *
     * **Note:** This method is equivalent to `_.conforms` when `source` is
     * partially applied.
     *
     * @static
     * @memberOf _
     * @since 4.14.0
     * @category Lang
     * @param {Object} object The object to inspect.
     * @param {Object} source The object of property predicates to conform to.
     * @returns {boolean} Returns `true` if `object` conforms, else `false`.
     * @example
     *
     * var object = { 'a': 1, 'b': 2 };
     *
     * _.conformsTo(object, { 'b': function(n) { return n > 1; } });
     * // => true
     *
     * _.conformsTo(object, { 'b': function(n) { return n > 2; } });
     * // => false
     */
    function conformsTo(object, source) {
      return source == null || baseConformsTo(object, source, keys(source));
    }

    /**
     * Performs a
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
     * comparison between two values to determine if they are equivalent.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to compare.
     * @param {*} other The other value to compare.
     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
     * @example
     *
     * var object = { 'a': 1 };
     * var other = { 'a': 1 };
     *
     * _.eq(object, object);
     * // => true
     *
     * _.eq(object, other);
     * // => false
     *
     * _.eq('a', 'a');
     * // => true
     *
     * _.eq('a', Object('a'));
     * // => false
     *
     * _.eq(NaN, NaN);
     * // => true
     */
    function eq(value, other) {
      return value === other || (value !== value && other !== other);
    }

    /**
     * Checks if `value` is greater than `other`.
     *
     * @static
     * @memberOf _
     * @since 3.9.0
     * @category Lang
     * @param {*} value The value to compare.
     * @param {*} other The other value to compare.
     * @returns {boolean} Returns `true` if `value` is greater than `other`,
     *  else `false`.
     * @see _.lt
     * @example
     *
     * _.gt(3, 1);
     * // => true
     *
     * _.gt(3, 3);
     * // => false
     *
     * _.gt(1, 3);
     * // => false
     */
    var gt = createRelationalOperation(baseGt);

    /**
     * Checks if `value` is greater than or equal to `other`.
     *
     * @static
     * @memberOf _
     * @since 3.9.0
     * @category Lang
     * @param {*} value The value to compare.
     * @param {*} other The other value to compare.
     * @returns {boolean} Returns `true` if `value` is greater than or equal to
     *  `other`, else `false`.
     * @see _.lte
     * @example
     *
     * _.gte(3, 1);
     * // => true
     *
     * _.gte(3, 3);
     * // => true
     *
     * _.gte(1, 3);
     * // => false
     */
    var gte = createRelationalOperation(function(value, other) {
      return value >= other;
    });

    /**
     * Checks if `value` is likely an `arguments` object.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is an `arguments` object,
     *  else `false`.
     * @example
     *
     * _.isArguments(function() { return arguments; }());
     * // => true
     *
     * _.isArguments([1, 2, 3]);
     * // => false
     */
    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
      return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
        !propertyIsEnumerable.call(value, 'callee');
    };

    /**
     * Checks if `value` is classified as an `Array` object.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is an array, else `false`.
     * @example
     *
     * _.isArray([1, 2, 3]);
     * // => true
     *
     * _.isArray(document.body.children);
     * // => false
     *
     * _.isArray('abc');
     * // => false
     *
     * _.isArray(_.noop);
     * // => false
     */
    var isArray = Array.isArray;

    /**
     * Checks if `value` is classified as an `ArrayBuffer` object.
     *
     * @static
     * @memberOf _
     * @since 4.3.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
     * @example
     *
     * _.isArrayBuffer(new ArrayBuffer(2));
     * // => true
     *
     * _.isArrayBuffer(new Array(2));
     * // => false
     */
    var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;

    /**
     * Checks if `value` is array-like. A value is considered array-like if it's
     * not a function and has a `value.length` that's an integer greater than or
     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
     * @example
     *
     * _.isArrayLike([1, 2, 3]);
     * // => true
     *
     * _.isArrayLike(document.body.children);
     * // => true
     *
     * _.isArrayLike('abc');
     * // => true
     *
     * _.isArrayLike(_.noop);
     * // => false
     */
    function isArrayLike(value) {
      return value != null && isLength(value.length) && !isFunction(value);
    }

    /**
     * This method is like `_.isArrayLike` except that it also checks if `value`
     * is an object.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is an array-like object,
     *  else `false`.
     * @example
     *
     * _.isArrayLikeObject([1, 2, 3]);
     * // => true
     *
     * _.isArrayLikeObject(document.body.children);
     * // => true
     *
     * _.isArrayLikeObject('abc');
     * // => false
     *
     * _.isArrayLikeObject(_.noop);
     * // => false
     */
    function isArrayLikeObject(value) {
      return isObjectLike(value) && isArrayLike(value);
    }

    /**
     * Checks if `value` is classified as a boolean primitive or object.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
     * @example
     *
     * _.isBoolean(false);
     * // => true
     *
     * _.isBoolean(null);
     * // => false
     */
    function isBoolean(value) {
      return value === true || value === false ||
        (isObjectLike(value) && baseGetTag(value) == boolTag);
    }

    /**
     * Checks if `value` is a buffer.
     *
     * @static
     * @memberOf _
     * @since 4.3.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
     * @example
     *
     * _.isBuffer(new Buffer(2));
     * // => true
     *
     * _.isBuffer(new Uint8Array(2));
     * // => false
     */
    var isBuffer = nativeIsBuffer || stubFalse;

    /**
     * Checks if `value` is classified as a `Date` object.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
     * @example
     *
     * _.isDate(new Date);
     * // => true
     *
     * _.isDate('Mon April 23 2012');
     * // => false
     */
    var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;

    /**
     * Checks if `value` is likely a DOM element.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.
     * @example
     *
     * _.isElement(document.body);
     * // => true
     *
     * _.isElement('<body>');
     * // => false
     */
    function isElement(value) {
      return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);
    }

    /**
     * Checks if `value` is an empty object, collection, map, or set.
     *
     * Objects are considered empty if they have no own enumerable string keyed
     * properties.
     *
     * Array-like values such as `arguments` objects, arrays, buffers, strings, or
     * jQuery-like collections are considered empty if they have a `length` of `0`.
     * Similarly, maps and sets are considered empty if they have a `size` of `0`.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is empty, else `false`.
     * @example
     *
     * _.isEmpty(null);
     * // => true
     *
     * _.isEmpty(true);
     * // => true
     *
     * _.isEmpty(1);
     * // => true
     *
     * _.isEmpty([1, 2, 3]);
     * // => false
     *
     * _.isEmpty({ 'a': 1 });
     * // => false
     */
    function isEmpty(value) {
      if (value == null) {
        return true;
      }
      if (isArrayLike(value) &&
          (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
            isBuffer(value) || isTypedArray(value) || isArguments(value))) {
        return !value.length;
      }
      var tag = getTag(value);
      if (tag == mapTag || tag == setTag) {
        return !value.size;
      }
      if (isPrototype(value)) {
        return !baseKeys(value).length;
      }
      for (var key in value) {
        if (hasOwnProperty.call(value, key)) {
          return false;
        }
      }
      return true;
    }

    /**
     * Performs a deep comparison between two values to determine if they are
     * equivalent.
     *
     * **Note:** This method supports comparing arrays, array buffers, booleans,
     * date objects, error objects, maps, numbers, `Object` objects, regexes,
     * sets, strings, symbols, and typed arrays. `Object` objects are compared
     * by their own, not inherited, enumerable properties. Functions and DOM
     * nodes are compared by strict equality, i.e. `===`.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to compare.
     * @param {*} other The other value to compare.
     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
     * @example
     *
     * var object = { 'a': 1 };
     * var other = { 'a': 1 };
     *
     * _.isEqual(object, other);
     * // => true
     *
     * object === other;
     * // => false
     */
    function isEqual(value, other) {
      return baseIsEqual(value, other);
    }

    /**
     * This method is like `_.isEqual` except that it accepts `customizer` which
     * is invoked to compare values. If `customizer` returns `undefined`, comparisons
     * are handled by the method instead. The `customizer` is invoked with up to
     * six arguments: (objValue, othValue [, index|key, object, other, stack]).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to compare.
     * @param {*} other The other value to compare.
     * @param {Function} [customizer] The function to customize comparisons.
     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
     * @example
     *
     * function isGreeting(value) {
     *   return /^h(?:i|ello)$/.test(value);
     * }
     *
     * function customizer(objValue, othValue) {
     *   if (isGreeting(objValue) && isGreeting(othValue)) {
     *     return true;
     *   }
     * }
     *
     * var array = ['hello', 'goodbye'];
     * var other = ['hi', 'goodbye'];
     *
     * _.isEqualWith(array, other, customizer);
     * // => true
     */
    function isEqualWith(value, other, customizer) {
      customizer = typeof customizer == 'function' ? customizer : undefined;
      var result = customizer ? customizer(value, other) : undefined;
      return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;
    }

    /**
     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,
     * `SyntaxError`, `TypeError`, or `URIError` object.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.
     * @example
     *
     * _.isError(new Error);
     * // => true
     *
     * _.isError(Error);
     * // => false
     */
    function isError(value) {
      if (!isObjectLike(value)) {
        return false;
      }
      var tag = baseGetTag(value);
      return tag == errorTag || tag == domExcTag ||
        (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));
    }

    /**
     * Checks if `value` is a finite primitive number.
     *
     * **Note:** This method is based on
     * [`Number.isFinite`](https://mdn.io/Number/isFinite).
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
     * @example
     *
     * _.isFinite(3);
     * // => true
     *
     * _.isFinite(Number.MIN_VALUE);
     * // => true
     *
     * _.isFinite(Infinity);
     * // => false
     *
     * _.isFinite('3');
     * // => false
     */
    function isFinite(value) {
      return typeof value == 'number' && nativeIsFinite(value);
    }

    /**
     * Checks if `value` is classified as a `Function` object.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a function, else `false`.
     * @example
     *
     * _.isFunction(_);
     * // => true
     *
     * _.isFunction(/abc/);
     * // => false
     */
    function isFunction(value) {
      if (!isObject(value)) {
        return false;
      }
      // The use of `Object#toString` avoids issues with the `typeof` operator
      // in Safari 9 which returns 'object' for typed arrays and other constructors.
      var tag = baseGetTag(value);
      return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
    }

    /**
     * Checks if `value` is an integer.
     *
     * **Note:** This method is based on
     * [`Number.isInteger`](https://mdn.io/Number/isInteger).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is an integer, else `false`.
     * @example
     *
     * _.isInteger(3);
     * // => true
     *
     * _.isInteger(Number.MIN_VALUE);
     * // => false
     *
     * _.isInteger(Infinity);
     * // => false
     *
     * _.isInteger('3');
     * // => false
     */
    function isInteger(value) {
      return typeof value == 'number' && value == toInteger(value);
    }

    /**
     * Checks if `value` is a valid array-like length.
     *
     * **Note:** This method is loosely based on
     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
     * @example
     *
     * _.isLength(3);
     * // => true
     *
     * _.isLength(Number.MIN_VALUE);
     * // => false
     *
     * _.isLength(Infinity);
     * // => false
     *
     * _.isLength('3');
     * // => false
     */
    function isLength(value) {
      return typeof value == 'number' &&
        value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
    }

    /**
     * Checks if `value` is the
     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is an object, else `false`.
     * @example
     *
     * _.isObject({});
     * // => true
     *
     * _.isObject([1, 2, 3]);
     * // => true
     *
     * _.isObject(_.noop);
     * // => true
     *
     * _.isObject(null);
     * // => false
     */
    function isObject(value) {
      var type = typeof value;
      return value != null && (type == 'object' || type == 'function');
    }

    /**
     * Checks if `value` is object-like. A value is object-like if it's not `null`
     * and has a `typeof` result of "object".
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
     * @example
     *
     * _.isObjectLike({});
     * // => true
     *
     * _.isObjectLike([1, 2, 3]);
     * // => true
     *
     * _.isObjectLike(_.noop);
     * // => false
     *
     * _.isObjectLike(null);
     * // => false
     */
    function isObjectLike(value) {
      return value != null && typeof value == 'object';
    }

    /**
     * Checks if `value` is classified as a `Map` object.
     *
     * @static
     * @memberOf _
     * @since 4.3.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a map, else `false`.
     * @example
     *
     * _.isMap(new Map);
     * // => true
     *
     * _.isMap(new WeakMap);
     * // => false
     */
    var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;

    /**
     * Performs a partial deep comparison between `object` and `source` to
     * determine if `object` contains equivalent property values.
     *
     * **Note:** This method is equivalent to `_.matches` when `source` is
     * partially applied.
     *
     * Partial comparisons will match empty array and empty object `source`
     * values against any array or object value, respectively. See `_.isEqual`
     * for a list of supported value comparisons.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Lang
     * @param {Object} object The object to inspect.
     * @param {Object} source The object of property values to match.
     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
     * @example
     *
     * var object = { 'a': 1, 'b': 2 };
     *
     * _.isMatch(object, { 'b': 2 });
     * // => true
     *
     * _.isMatch(object, { 'b': 1 });
     * // => false
     */
    function isMatch(object, source) {
      return object === source || baseIsMatch(object, source, getMatchData(source));
    }

    /**
     * This method is like `_.isMatch` except that it accepts `customizer` which
     * is invoked to compare values. If `customizer` returns `undefined`, comparisons
     * are handled by the method instead. The `customizer` is invoked with five
     * arguments: (objValue, srcValue, index|key, object, source).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {Object} object The object to inspect.
     * @param {Object} source The object of property values to match.
     * @param {Function} [customizer] The function to customize comparisons.
     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
     * @example
     *
     * function isGreeting(value) {
     *   return /^h(?:i|ello)$/.test(value);
     * }
     *
     * function customizer(objValue, srcValue) {
     *   if (isGreeting(objValue) && isGreeting(srcValue)) {
     *     return true;
     *   }
     * }
     *
     * var object = { 'greeting': 'hello' };
     * var source = { 'greeting': 'hi' };
     *
     * _.isMatchWith(object, source, customizer);
     * // => true
     */
    function isMatchWith(object, source, customizer) {
      customizer = typeof customizer == 'function' ? customizer : undefined;
      return baseIsMatch(object, source, getMatchData(source), customizer);
    }

    /**
     * Checks if `value` is `NaN`.
     *
     * **Note:** This method is based on
     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
     * `undefined` and other non-number values.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
     * @example
     *
     * _.isNaN(NaN);
     * // => true
     *
     * _.isNaN(new Number(NaN));
     * // => true
     *
     * isNaN(undefined);
     * // => true
     *
     * _.isNaN(undefined);
     * // => false
     */
    function isNaN(value) {
      // An `NaN` primitive is the only value that is not equal to itself.
      // Perform the `toStringTag` check first to avoid errors with some
      // ActiveX objects in IE.
      return isNumber(value) && value != +value;
    }

    /**
     * Checks if `value` is a pristine native function.
     *
     * **Note:** This method can't reliably detect native functions in the presence
     * of the core-js package because core-js circumvents this kind of detection.
     * Despite multiple requests, the core-js maintainer has made it clear: any
     * attempt to fix the detection will be obstructed. As a result, we're left
     * with little choice but to throw an error. Unfortunately, this also affects
     * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),
     * which rely on core-js.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a native function,
     *  else `false`.
     * @example
     *
     * _.isNative(Array.prototype.push);
     * // => true
     *
     * _.isNative(_);
     * // => false
     */
    function isNative(value) {
      if (isMaskable(value)) {
        throw new Error(CORE_ERROR_TEXT);
      }
      return baseIsNative(value);
    }

    /**
     * Checks if `value` is `null`.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
     * @example
     *
     * _.isNull(null);
     * // => true
     *
     * _.isNull(void 0);
     * // => false
     */
    function isNull(value) {
      return value === null;
    }

    /**
     * Checks if `value` is `null` or `undefined`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is nullish, else `false`.
     * @example
     *
     * _.isNil(null);
     * // => true
     *
     * _.isNil(void 0);
     * // => true
     *
     * _.isNil(NaN);
     * // => false
     */
    function isNil(value) {
      return value == null;
    }

    /**
     * Checks if `value` is classified as a `Number` primitive or object.
     *
     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
     * classified as numbers, use the `_.isFinite` method.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a number, else `false`.
     * @example
     *
     * _.isNumber(3);
     * // => true
     *
     * _.isNumber(Number.MIN_VALUE);
     * // => true
     *
     * _.isNumber(Infinity);
     * // => true
     *
     * _.isNumber('3');
     * // => false
     */
    function isNumber(value) {
      return typeof value == 'number' ||
        (isObjectLike(value) && baseGetTag(value) == numberTag);
    }

    /**
     * Checks if `value` is a plain object, that is, an object created by the
     * `Object` constructor or one with a `[[Prototype]]` of `null`.
     *
     * @static
     * @memberOf _
     * @since 0.8.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
     * @example
     *
     * function Foo() {
     *   this.a = 1;
     * }
     *
     * _.isPlainObject(new Foo);
     * // => false
     *
     * _.isPlainObject([1, 2, 3]);
     * // => false
     *
     * _.isPlainObject({ 'x': 0, 'y': 0 });
     * // => true
     *
     * _.isPlainObject(Object.create(null));
     * // => true
     */
    function isPlainObject(value) {
      if (!isObjectLike(value) || baseGetTag(value) != objectTag) {
        return false;
      }
      var proto = getPrototype(value);
      if (proto === null) {
        return true;
      }
      var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
      return typeof Ctor == 'function' && Ctor instanceof Ctor &&
        funcToString.call(Ctor) == objectCtorString;
    }

    /**
     * Checks if `value` is classified as a `RegExp` object.
     *
     * @static
     * @memberOf _
     * @since 0.1.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
     * @example
     *
     * _.isRegExp(/abc/);
     * // => true
     *
     * _.isRegExp('/abc/');
     * // => false
     */
    var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;

    /**
     * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754
     * double precision number which isn't the result of a rounded unsafe integer.
     *
     * **Note:** This method is based on
     * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.
     * @example
     *
     * _.isSafeInteger(3);
     * // => true
     *
     * _.isSafeInteger(Number.MIN_VALUE);
     * // => false
     *
     * _.isSafeInteger(Infinity);
     * // => false
     *
     * _.isSafeInteger('3');
     * // => false
     */
    function isSafeInteger(value) {
      return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;
    }

    /**
     * Checks if `value` is classified as a `Set` object.
     *
     * @static
     * @memberOf _
     * @since 4.3.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a set, else `false`.
     * @example
     *
     * _.isSet(new Set);
     * // => true
     *
     * _.isSet(new WeakSet);
     * // => false
     */
    var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;

    /**
     * Checks if `value` is classified as a `String` primitive or object.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a string, else `false`.
     * @example
     *
     * _.isString('abc');
     * // => true
     *
     * _.isString(1);
     * // => false
     */
    function isString(value) {
      return typeof value == 'string' ||
        (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);
    }

    /**
     * Checks if `value` is classified as a `Symbol` primitive or object.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
     * @example
     *
     * _.isSymbol(Symbol.iterator);
     * // => true
     *
     * _.isSymbol('abc');
     * // => false
     */
    function isSymbol(value) {
      return typeof value == 'symbol' ||
        (isObjectLike(value) && baseGetTag(value) == symbolTag);
    }

    /**
     * Checks if `value` is classified as a typed array.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
     * @example
     *
     * _.isTypedArray(new Uint8Array);
     * // => true
     *
     * _.isTypedArray([]);
     * // => false
     */
    var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;

    /**
     * Checks if `value` is `undefined`.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
     * @example
     *
     * _.isUndefined(void 0);
     * // => true
     *
     * _.isUndefined(null);
     * // => false
     */
    function isUndefined(value) {
      return value === undefined;
    }

    /**
     * Checks if `value` is classified as a `WeakMap` object.
     *
     * @static
     * @memberOf _
     * @since 4.3.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.
     * @example
     *
     * _.isWeakMap(new WeakMap);
     * // => true
     *
     * _.isWeakMap(new Map);
     * // => false
     */
    function isWeakMap(value) {
      return isObjectLike(value) && getTag(value) == weakMapTag;
    }

    /**
     * Checks if `value` is classified as a `WeakSet` object.
     *
     * @static
     * @memberOf _
     * @since 4.3.0
     * @category Lang
     * @param {*} value The value to check.
     * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.
     * @example
     *
     * _.isWeakSet(new WeakSet);
     * // => true
     *
     * _.isWeakSet(new Set);
     * // => false
     */
    function isWeakSet(value) {
      return isObjectLike(value) && baseGetTag(value) == weakSetTag;
    }

    /**
     * Checks if `value` is less than `other`.
     *
     * @static
     * @memberOf _
     * @since 3.9.0
     * @category Lang
     * @param {*} value The value to compare.
     * @param {*} other The other value to compare.
     * @returns {boolean} Returns `true` if `value` is less than `other`,
     *  else `false`.
     * @see _.gt
     * @example
     *
     * _.lt(1, 3);
     * // => true
     *
     * _.lt(3, 3);
     * // => false
     *
     * _.lt(3, 1);
     * // => false
     */
    var lt = createRelationalOperation(baseLt);

    /**
     * Checks if `value` is less than or equal to `other`.
     *
     * @static
     * @memberOf _
     * @since 3.9.0
     * @category Lang
     * @param {*} value The value to compare.
     * @param {*} other The other value to compare.
     * @returns {boolean} Returns `true` if `value` is less than or equal to
     *  `other`, else `false`.
     * @see _.gte
     * @example
     *
     * _.lte(1, 3);
     * // => true
     *
     * _.lte(3, 3);
     * // => true
     *
     * _.lte(3, 1);
     * // => false
     */
    var lte = createRelationalOperation(function(value, other) {
      return value <= other;
    });

    /**
     * Converts `value` to an array.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Lang
     * @param {*} value The value to convert.
     * @returns {Array} Returns the converted array.
     * @example
     *
     * _.toArray({ 'a': 1, 'b': 2 });
     * // => [1, 2]
     *
     * _.toArray('abc');
     * // => ['a', 'b', 'c']
     *
     * _.toArray(1);
     * // => []
     *
     * _.toArray(null);
     * // => []
     */
    function toArray(value) {
      if (!value) {
        return [];
      }
      if (isArrayLike(value)) {
        return isString(value) ? stringToArray(value) : copyArray(value);
      }
      if (symIterator && value[symIterator]) {
        return iteratorToArray(value[symIterator]());
      }
      var tag = getTag(value),
          func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);

      return func(value);
    }

    /**
     * Converts `value` to a finite number.
     *
     * @static
     * @memberOf _
     * @since 4.12.0
     * @category Lang
     * @param {*} value The value to convert.
     * @returns {number} Returns the converted number.
     * @example
     *
     * _.toFinite(3.2);
     * // => 3.2
     *
     * _.toFinite(Number.MIN_VALUE);
     * // => 5e-324
     *
     * _.toFinite(Infinity);
     * // => 1.7976931348623157e+308
     *
     * _.toFinite('3.2');
     * // => 3.2
     */
    function toFinite(value) {
      if (!value) {
        return value === 0 ? value : 0;
      }
      value = toNumber(value);
      if (value === INFINITY || value === -INFINITY) {
        var sign = (value < 0 ? -1 : 1);
        return sign * MAX_INTEGER;
      }
      return value === value ? value : 0;
    }

    /**
     * Converts `value` to an integer.
     *
     * **Note:** This method is loosely based on
     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to convert.
     * @returns {number} Returns the converted integer.
     * @example
     *
     * _.toInteger(3.2);
     * // => 3
     *
     * _.toInteger(Number.MIN_VALUE);
     * // => 0
     *
     * _.toInteger(Infinity);
     * // => 1.7976931348623157e+308
     *
     * _.toInteger('3.2');
     * // => 3
     */
    function toInteger(value) {
      var result = toFinite(value),
          remainder = result % 1;

      return result === result ? (remainder ? result - remainder : result) : 0;
    }

    /**
     * Converts `value` to an integer suitable for use as the length of an
     * array-like object.
     *
     * **Note:** This method is based on
     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to convert.
     * @returns {number} Returns the converted integer.
     * @example
     *
     * _.toLength(3.2);
     * // => 3
     *
     * _.toLength(Number.MIN_VALUE);
     * // => 0
     *
     * _.toLength(Infinity);
     * // => 4294967295
     *
     * _.toLength('3.2');
     * // => 3
     */
    function toLength(value) {
      return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;
    }

    /**
     * Converts `value` to a number.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to process.
     * @returns {number} Returns the number.
     * @example
     *
     * _.toNumber(3.2);
     * // => 3.2
     *
     * _.toNumber(Number.MIN_VALUE);
     * // => 5e-324
     *
     * _.toNumber(Infinity);
     * // => Infinity
     *
     * _.toNumber('3.2');
     * // => 3.2
     */
    function toNumber(value) {
      if (typeof value == 'number') {
        return value;
      }
      if (isSymbol(value)) {
        return NAN;
      }
      if (isObject(value)) {
        var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
        value = isObject(other) ? (other + '') : other;
      }
      if (typeof value != 'string') {
        return value === 0 ? value : +value;
      }
      value = baseTrim(value);
      var isBinary = reIsBinary.test(value);
      return (isBinary || reIsOctal.test(value))
        ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
        : (reIsBadHex.test(value) ? NAN : +value);
    }

    /**
     * Converts `value` to a plain object flattening inherited enumerable string
     * keyed properties of `value` to own properties of the plain object.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Lang
     * @param {*} value The value to convert.
     * @returns {Object} Returns the converted plain object.
     * @example
     *
     * function Foo() {
     *   this.b = 2;
     * }
     *
     * Foo.prototype.c = 3;
     *
     * _.assign({ 'a': 1 }, new Foo);
     * // => { 'a': 1, 'b': 2 }
     *
     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
     * // => { 'a': 1, 'b': 2, 'c': 3 }
     */
    function toPlainObject(value) {
      return copyObject(value, keysIn(value));
    }

    /**
     * Converts `value` to a safe integer. A safe integer can be compared and
     * represented correctly.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to convert.
     * @returns {number} Returns the converted integer.
     * @example
     *
     * _.toSafeInteger(3.2);
     * // => 3
     *
     * _.toSafeInteger(Number.MIN_VALUE);
     * // => 0
     *
     * _.toSafeInteger(Infinity);
     * // => 9007199254740991
     *
     * _.toSafeInteger('3.2');
     * // => 3
     */
    function toSafeInteger(value) {
      return value
        ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)
        : (value === 0 ? value : 0);
    }

    /**
     * Converts `value` to a string. An empty string is returned for `null`
     * and `undefined` values. The sign of `-0` is preserved.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Lang
     * @param {*} value The value to convert.
     * @returns {string} Returns the converted string.
     * @example
     *
     * _.toString(null);
     * // => ''
     *
     * _.toString(-0);
     * // => '-0'
     *
     * _.toString([1, 2, 3]);
     * // => '1,2,3'
     */
    function toString(value) {
      return value == null ? '' : baseToString(value);
    }

    /*------------------------------------------------------------------------*/

    /**
     * Assigns own enumerable string keyed properties of source objects to the
     * destination object. Source objects are applied from left to right.
     * Subsequent sources overwrite property assignments of previous sources.
     *
     * **Note:** This method mutates `object` and is loosely based on
     * [`Object.assign`](https://mdn.io/Object/assign).
     *
     * @static
     * @memberOf _
     * @since 0.10.0
     * @category Object
     * @param {Object} object The destination object.
     * @param {...Object} [sources] The source objects.
     * @returns {Object} Returns `object`.
     * @see _.assignIn
     * @example
     *
     * function Foo() {
     *   this.a = 1;
     * }
     *
     * function Bar() {
     *   this.c = 3;
     * }
     *
     * Foo.prototype.b = 2;
     * Bar.prototype.d = 4;
     *
     * _.assign({ 'a': 0 }, new Foo, new Bar);
     * // => { 'a': 1, 'c': 3 }
     */
    var assign = createAssigner(function(object, source) {
      if (isPrototype(source) || isArrayLike(source)) {
        copyObject(source, keys(source), object);
        return;
      }
      for (var key in source) {
        if (hasOwnProperty.call(source, key)) {
          assignValue(object, key, source[key]);
        }
      }
    });

    /**
     * This method is like `_.assign` except that it iterates over own and
     * inherited source properties.
     *
     * **Note:** This method mutates `object`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @alias extend
     * @category Object
     * @param {Object} object The destination object.
     * @param {...Object} [sources] The source objects.
     * @returns {Object} Returns `object`.
     * @see _.assign
     * @example
     *
     * function Foo() {
     *   this.a = 1;
     * }
     *
     * function Bar() {
     *   this.c = 3;
     * }
     *
     * Foo.prototype.b = 2;
     * Bar.prototype.d = 4;
     *
     * _.assignIn({ 'a': 0 }, new Foo, new Bar);
     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
     */
    var assignIn = createAssigner(function(object, source) {
      copyObject(source, keysIn(source), object);
    });

    /**
     * This method is like `_.assignIn` except that it accepts `customizer`
     * which is invoked to produce the assigned values. If `customizer` returns
     * `undefined`, assignment is handled by the method instead. The `customizer`
     * is invoked with five arguments: (objValue, srcValue, key, object, source).
     *
     * **Note:** This method mutates `object`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @alias extendWith
     * @category Object
     * @param {Object} object The destination object.
     * @param {...Object} sources The source objects.
     * @param {Function} [customizer] The function to customize assigned values.
     * @returns {Object} Returns `object`.
     * @see _.assignWith
     * @example
     *
     * function customizer(objValue, srcValue) {
     *   return _.isUndefined(objValue) ? srcValue : objValue;
     * }
     *
     * var defaults = _.partialRight(_.assignInWith, customizer);
     *
     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
     * // => { 'a': 1, 'b': 2 }
     */
    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {
      copyObject(source, keysIn(source), object, customizer);
    });

    /**
     * This method is like `_.assign` except that it accepts `customizer`
     * which is invoked to produce the assigned values. If `customizer` returns
     * `undefined`, assignment is handled by the method instead. The `customizer`
     * is invoked with five arguments: (objValue, srcValue, key, object, source).
     *
     * **Note:** This method mutates `object`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Object
     * @param {Object} object The destination object.
     * @param {...Object} sources The source objects.
     * @param {Function} [customizer] The function to customize assigned values.
     * @returns {Object} Returns `object`.
     * @see _.assignInWith
     * @example
     *
     * function customizer(objValue, srcValue) {
     *   return _.isUndefined(objValue) ? srcValue : objValue;
     * }
     *
     * var defaults = _.partialRight(_.assignWith, customizer);
     *
     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
     * // => { 'a': 1, 'b': 2 }
     */
    var assignWith = createAssigner(function(object, source, srcIndex, customizer) {
      copyObject(source, keys(source), object, customizer);
    });

    /**
     * Creates an array of values corresponding to `paths` of `object`.
     *
     * @static
     * @memberOf _
     * @since 1.0.0
     * @category Object
     * @param {Object} object The object to iterate over.
     * @param {...(string|string[])} [paths] The property paths to pick.
     * @returns {Array} Returns the picked values.
     * @example
     *
     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
     *
     * _.at(object, ['a[0].b.c', 'a[1]']);
     * // => [3, 4]
     */
    var at = flatRest(baseAt);

    /**
     * Creates an object that inherits from the `prototype` object. If a
     * `properties` object is given, its own enumerable string keyed properties
     * are assigned to the created object.
     *
     * @static
     * @memberOf _
     * @since 2.3.0
     * @category Object
     * @param {Object} prototype The object to inherit from.
     * @param {Object} [properties] The properties to assign to the object.
     * @returns {Object} Returns the new object.
     * @example
     *
     * function Shape() {
     *   this.x = 0;
     *   this.y = 0;
     * }
     *
     * function Circle() {
     *   Shape.call(this);
     * }
     *
     * Circle.prototype = _.create(Shape.prototype, {
     *   'constructor': Circle
     * });
     *
     * var circle = new Circle;
     * circle instanceof Circle;
     * // => true
     *
     * circle instanceof Shape;
     * // => true
     */
    function create(prototype, properties) {
      var result = baseCreate(prototype);
      return properties == null ? result : baseAssign(result, properties);
    }

    /**
     * Assigns own and inherited enumerable string keyed properties of source
     * objects to the destination object for all destination properties that
     * resolve to `undefined`. Source objects are applied from left to right.
     * Once a property is set, additional values of the same property are ignored.
     *
     * **Note:** This method mutates `object`.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Object
     * @param {Object} object The destination object.
     * @param {...Object} [sources] The source objects.
     * @returns {Object} Returns `object`.
     * @see _.defaultsDeep
     * @example
     *
     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
     * // => { 'a': 1, 'b': 2 }
     */
    var defaults = baseRest(function(object, sources) {
      object = Object(object);

      var index = -1;
      var length = sources.length;
      var guard = length > 2 ? sources[2] : undefined;

      if (guard && isIterateeCall(sources[0], sources[1], guard)) {
        length = 1;
      }

      while (++index < length) {
        var source = sources[index];
        var props = keysIn(source);
        var propsIndex = -1;
        var propsLength = props.length;

        while (++propsIndex < propsLength) {
          var key = props[propsIndex];
          var value = object[key];

          if (value === undefined ||
              (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {
            object[key] = source[key];
          }
        }
      }

      return object;
    });

    /**
     * This method is like `_.defaults` except that it recursively assigns
     * default properties.
     *
     * **Note:** This method mutates `object`.
     *
     * @static
     * @memberOf _
     * @since 3.10.0
     * @category Object
     * @param {Object} object The destination object.
     * @param {...Object} [sources] The source objects.
     * @returns {Object} Returns `object`.
     * @see _.defaults
     * @example
     *
     * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });
     * // => { 'a': { 'b': 2, 'c': 3 } }
     */
    var defaultsDeep = baseRest(function(args) {
      args.push(undefined, customDefaultsMerge);
      return apply(mergeWith, undefined, args);
    });

    /**
     * This method is like `_.find` except that it returns the key of the first
     * element `predicate` returns truthy for instead of the element itself.
     *
     * @static
     * @memberOf _
     * @since 1.1.0
     * @category Object
     * @param {Object} object The object to inspect.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @returns {string|undefined} Returns the key of the matched element,
     *  else `undefined`.
     * @example
     *
     * var users = {
     *   'barney':  { 'age': 36, 'active': true },
     *   'fred':    { 'age': 40, 'active': false },
     *   'pebbles': { 'age': 1,  'active': true }
     * };
     *
     * _.findKey(users, function(o) { return o.age < 40; });
     * // => 'barney' (iteration order is not guaranteed)
     *
     * // The `_.matches` iteratee shorthand.
     * _.findKey(users, { 'age': 1, 'active': true });
     * // => 'pebbles'
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.findKey(users, ['active', false]);
     * // => 'fred'
     *
     * // The `_.property` iteratee shorthand.
     * _.findKey(users, 'active');
     * // => 'barney'
     */
    function findKey(object, predicate) {
      return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);
    }

    /**
     * This method is like `_.findKey` except that it iterates over elements of
     * a collection in the opposite order.
     *
     * @static
     * @memberOf _
     * @since 2.0.0
     * @category Object
     * @param {Object} object The object to inspect.
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
     * @returns {string|undefined} Returns the key of the matched element,
     *  else `undefined`.
     * @example
     *
     * var users = {
     *   'barney':  { 'age': 36, 'active': true },
     *   'fred':    { 'age': 40, 'active': false },
     *   'pebbles': { 'age': 1,  'active': true }
     * };
     *
     * _.findLastKey(users, function(o) { return o.age < 40; });
     * // => returns 'pebbles' assuming `_.findKey` returns 'barney'
     *
     * // The `_.matches` iteratee shorthand.
     * _.findLastKey(users, { 'age': 36, 'active': true });
     * // => 'barney'
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.findLastKey(users, ['active', false]);
     * // => 'fred'
     *
     * // The `_.property` iteratee shorthand.
     * _.findLastKey(users, 'active');
     * // => 'pebbles'
     */
    function findLastKey(object, predicate) {
      return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);
    }

    /**
     * Iterates over own and inherited enumerable string keyed properties of an
     * object and invokes `iteratee` for each property. The iteratee is invoked
     * with three arguments: (value, key, object). Iteratee functions may exit
     * iteration early by explicitly returning `false`.
     *
     * @static
     * @memberOf _
     * @since 0.3.0
     * @category Object
     * @param {Object} object The object to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @returns {Object} Returns `object`.
     * @see _.forInRight
     * @example
     *
     * function Foo() {
     *   this.a = 1;
     *   this.b = 2;
     * }
     *
     * Foo.prototype.c = 3;
     *
     * _.forIn(new Foo, function(value, key) {
     *   console.log(key);
     * });
     * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).
     */
    function forIn(object, iteratee) {
      return object == null
        ? object
        : baseFor(object, getIteratee(iteratee, 3), keysIn);
    }

    /**
     * This method is like `_.forIn` except that it iterates over properties of
     * `object` in the opposite order.
     *
     * @static
     * @memberOf _
     * @since 2.0.0
     * @category Object
     * @param {Object} object The object to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @returns {Object} Returns `object`.
     * @see _.forIn
     * @example
     *
     * function Foo() {
     *   this.a = 1;
     *   this.b = 2;
     * }
     *
     * Foo.prototype.c = 3;
     *
     * _.forInRight(new Foo, function(value, key) {
     *   console.log(key);
     * });
     * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.
     */
    function forInRight(object, iteratee) {
      return object == null
        ? object
        : baseForRight(object, getIteratee(iteratee, 3), keysIn);
    }

    /**
     * Iterates over own enumerable string keyed properties of an object and
     * invokes `iteratee` for each property. The iteratee is invoked with three
     * arguments: (value, key, object). Iteratee functions may exit iteration
     * early by explicitly returning `false`.
     *
     * @static
     * @memberOf _
     * @since 0.3.0
     * @category Object
     * @param {Object} object The object to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @returns {Object} Returns `object`.
     * @see _.forOwnRight
     * @example
     *
     * function Foo() {
     *   this.a = 1;
     *   this.b = 2;
     * }
     *
     * Foo.prototype.c = 3;
     *
     * _.forOwn(new Foo, function(value, key) {
     *   console.log(key);
     * });
     * // => Logs 'a' then 'b' (iteration order is not guaranteed).
     */
    function forOwn(object, iteratee) {
      return object && baseForOwn(object, getIteratee(iteratee, 3));
    }

    /**
     * This method is like `_.forOwn` except that it iterates over properties of
     * `object` in the opposite order.
     *
     * @static
     * @memberOf _
     * @since 2.0.0
     * @category Object
     * @param {Object} object The object to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @returns {Object} Returns `object`.
     * @see _.forOwn
     * @example
     *
     * function Foo() {
     *   this.a = 1;
     *   this.b = 2;
     * }
     *
     * Foo.prototype.c = 3;
     *
     * _.forOwnRight(new Foo, function(value, key) {
     *   console.log(key);
     * });
     * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.
     */
    function forOwnRight(object, iteratee) {
      return object && baseForOwnRight(object, getIteratee(iteratee, 3));
    }

    /**
     * Creates an array of function property names from own enumerable properties
     * of `object`.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Object
     * @param {Object} object The object to inspect.
     * @returns {Array} Returns the function names.
     * @see _.functionsIn
     * @example
     *
     * function Foo() {
     *   this.a = _.constant('a');
     *   this.b = _.constant('b');
     * }
     *
     * Foo.prototype.c = _.constant('c');
     *
     * _.functions(new Foo);
     * // => ['a', 'b']
     */
    function functions(object) {
      return object == null ? [] : baseFunctions(object, keys(object));
    }

    /**
     * Creates an array of function property names from own and inherited
     * enumerable properties of `object`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Object
     * @param {Object} object The object to inspect.
     * @returns {Array} Returns the function names.
     * @see _.functions
     * @example
     *
     * function Foo() {
     *   this.a = _.constant('a');
     *   this.b = _.constant('b');
     * }
     *
     * Foo.prototype.c = _.constant('c');
     *
     * _.functionsIn(new Foo);
     * // => ['a', 'b', 'c']
     */
    function functionsIn(object) {
      return object == null ? [] : baseFunctions(object, keysIn(object));
    }

    /**
     * Gets the value at `path` of `object`. If the resolved value is
     * `undefined`, the `defaultValue` is returned in its place.
     *
     * @static
     * @memberOf _
     * @since 3.7.0
     * @category Object
     * @param {Object} object The object to query.
     * @param {Array|string} path The path of the property to get.
     * @param {*} [defaultValue] The value returned for `undefined` resolved values.
     * @returns {*} Returns the resolved value.
     * @example
     *
     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
     *
     * _.get(object, 'a[0].b.c');
     * // => 3
     *
     * _.get(object, ['a', '0', 'b', 'c']);
     * // => 3
     *
     * _.get(object, 'a.b.c', 'default');
     * // => 'default'
     */
    function get(object, path, defaultValue) {
      var result = object == null ? undefined : baseGet(object, path);
      return result === undefined ? defaultValue : result;
    }

    /**
     * Checks if `path` is a direct property of `object`.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Object
     * @param {Object} object The object to query.
     * @param {Array|string} path The path to check.
     * @returns {boolean} Returns `true` if `path` exists, else `false`.
     * @example
     *
     * var object = { 'a': { 'b': 2 } };
     * var other = _.create({ 'a': _.create({ 'b': 2 }) });
     *
     * _.has(object, 'a');
     * // => true
     *
     * _.has(object, 'a.b');
     * // => true
     *
     * _.has(object, ['a', 'b']);
     * // => true
     *
     * _.has(other, 'a');
     * // => false
     */
    function has(object, path) {
      return object != null && hasPath(object, path, baseHas);
    }

    /**
     * Checks if `path` is a direct or inherited property of `object`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Object
     * @param {Object} object The object to query.
     * @param {Array|string} path The path to check.
     * @returns {boolean} Returns `true` if `path` exists, else `false`.
     * @example
     *
     * var object = _.create({ 'a': _.create({ 'b': 2 }) });
     *
     * _.hasIn(object, 'a');
     * // => true
     *
     * _.hasIn(object, 'a.b');
     * // => true
     *
     * _.hasIn(object, ['a', 'b']);
     * // => true
     *
     * _.hasIn(object, 'b');
     * // => false
     */
    function hasIn(object, path) {
      return object != null && hasPath(object, path, baseHasIn);
    }

    /**
     * Creates an object composed of the inverted keys and values of `object`.
     * If `object` contains duplicate values, subsequent values overwrite
     * property assignments of previous values.
     *
     * @static
     * @memberOf _
     * @since 0.7.0
     * @category Object
     * @param {Object} object The object to invert.
     * @returns {Object} Returns the new inverted object.
     * @example
     *
     * var object = { 'a': 1, 'b': 2, 'c': 1 };
     *
     * _.invert(object);
     * // => { '1': 'c', '2': 'b' }
     */
    var invert = createInverter(function(result, value, key) {
      if (value != null &&
          typeof value.toString != 'function') {
        value = nativeObjectToString.call(value);
      }

      result[value] = key;
    }, constant(identity));

    /**
     * This method is like `_.invert` except that the inverted object is generated
     * from the results of running each element of `object` thru `iteratee`. The
     * corresponding inverted value of each inverted key is an array of keys
     * responsible for generating the inverted value. The iteratee is invoked
     * with one argument: (value).
     *
     * @static
     * @memberOf _
     * @since 4.1.0
     * @category Object
     * @param {Object} object The object to invert.
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
     * @returns {Object} Returns the new inverted object.
     * @example
     *
     * var object = { 'a': 1, 'b': 2, 'c': 1 };
     *
     * _.invertBy(object);
     * // => { '1': ['a', 'c'], '2': ['b'] }
     *
     * _.invertBy(object, function(value) {
     *   return 'group' + value;
     * });
     * // => { 'group1': ['a', 'c'], 'group2': ['b'] }
     */
    var invertBy = createInverter(function(result, value, key) {
      if (value != null &&
          typeof value.toString != 'function') {
        value = nativeObjectToString.call(value);
      }

      if (hasOwnProperty.call(result, value)) {
        result[value].push(key);
      } else {
        result[value] = [key];
      }
    }, getIteratee);

    /**
     * Invokes the method at `path` of `object`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Object
     * @param {Object} object The object to query.
     * @param {Array|string} path The path of the method to invoke.
     * @param {...*} [args] The arguments to invoke the method with.
     * @returns {*} Returns the result of the invoked method.
     * @example
     *
     * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };
     *
     * _.invoke(object, 'a[0].b.c.slice', 1, 3);
     * // => [2, 3]
     */
    var invoke = baseRest(baseInvoke);

    /**
     * Creates an array of the own enumerable property names of `object`.
     *
     * **Note:** Non-object values are coerced to objects. See the
     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
     * for more details.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Object
     * @param {Object} object The object to query.
     * @returns {Array} Returns the array of property names.
     * @example
     *
     * function Foo() {
     *   this.a = 1;
     *   this.b = 2;
     * }
     *
     * Foo.prototype.c = 3;
     *
     * _.keys(new Foo);
     * // => ['a', 'b'] (iteration order is not guaranteed)
     *
     * _.keys('hi');
     * // => ['0', '1']
     */
    function keys(object) {
      return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
    }

    /**
     * Creates an array of the own and inherited enumerable property names of `object`.
     *
     * **Note:** Non-object values are coerced to objects.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Object
     * @param {Object} object The object to query.
     * @returns {Array} Returns the array of property names.
     * @example
     *
     * function Foo() {
     *   this.a = 1;
     *   this.b = 2;
     * }
     *
     * Foo.prototype.c = 3;
     *
     * _.keysIn(new Foo);
     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
     */
    function keysIn(object) {
      return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
    }

    /**
     * The opposite of `_.mapValues`; this method creates an object with the
     * same values as `object` and keys generated by running each own enumerable
     * string keyed property of `object` thru `iteratee`. The iteratee is invoked
     * with three arguments: (value, key, object).
     *
     * @static
     * @memberOf _
     * @since 3.8.0
     * @category Object
     * @param {Object} object The object to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @returns {Object} Returns the new mapped object.
     * @see _.mapValues
     * @example
     *
     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {
     *   return key + value;
     * });
     * // => { 'a1': 1, 'b2': 2 }
     */
    function mapKeys(object, iteratee) {
      var result = {};
      iteratee = getIteratee(iteratee, 3);

      baseForOwn(object, function(value, key, object) {
        baseAssignValue(result, iteratee(value, key, object), value);
      });
      return result;
    }

    /**
     * Creates an object with the same keys as `object` and values generated
     * by running each own enumerable string keyed property of `object` thru
     * `iteratee`. The iteratee is invoked with three arguments:
     * (value, key, object).
     *
     * @static
     * @memberOf _
     * @since 2.4.0
     * @category Object
     * @param {Object} object The object to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @returns {Object} Returns the new mapped object.
     * @see _.mapKeys
     * @example
     *
     * var users = {
     *   'fred':    { 'user': 'fred',    'age': 40 },
     *   'pebbles': { 'user': 'pebbles', 'age': 1 }
     * };
     *
     * _.mapValues(users, function(o) { return o.age; });
     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
     *
     * // The `_.property` iteratee shorthand.
     * _.mapValues(users, 'age');
     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
     */
    function mapValues(object, iteratee) {
      var result = {};
      iteratee = getIteratee(iteratee, 3);

      baseForOwn(object, function(value, key, object) {
        baseAssignValue(result, key, iteratee(value, key, object));
      });
      return result;
    }

    /**
     * This method is like `_.assign` except that it recursively merges own and
     * inherited enumerable string keyed properties of source objects into the
     * destination object. Source properties that resolve to `undefined` are
     * skipped if a destination value exists. Array and plain object properties
     * are merged recursively. Other objects and value types are overridden by
     * assignment. Source objects are applied from left to right. Subsequent
     * sources overwrite property assignments of previous sources.
     *
     * **Note:** This method mutates `object`.
     *
     * @static
     * @memberOf _
     * @since 0.5.0
     * @category Object
     * @param {Object} object The destination object.
     * @param {...Object} [sources] The source objects.
     * @returns {Object} Returns `object`.
     * @example
     *
     * var object = {
     *   'a': [{ 'b': 2 }, { 'd': 4 }]
     * };
     *
     * var other = {
     *   'a': [{ 'c': 3 }, { 'e': 5 }]
     * };
     *
     * _.merge(object, other);
     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
     */
    var merge = createAssigner(function(object, source, srcIndex) {
      baseMerge(object, source, srcIndex);
    });

    /**
     * This method is like `_.merge` except that it accepts `customizer` which
     * is invoked to produce the merged values of the destination and source
     * properties. If `customizer` returns `undefined`, merging is handled by the
     * method instead. The `customizer` is invoked with six arguments:
     * (objValue, srcValue, key, object, source, stack).
     *
     * **Note:** This method mutates `object`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Object
     * @param {Object} object The destination object.
     * @param {...Object} sources The source objects.
     * @param {Function} customizer The function to customize assigned values.
     * @returns {Object} Returns `object`.
     * @example
     *
     * function customizer(objValue, srcValue) {
     *   if (_.isArray(objValue)) {
     *     return objValue.concat(srcValue);
     *   }
     * }
     *
     * var object = { 'a': [1], 'b': [2] };
     * var other = { 'a': [3], 'b': [4] };
     *
     * _.mergeWith(object, other, customizer);
     * // => { 'a': [1, 3], 'b': [2, 4] }
     */
    var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {
      baseMerge(object, source, srcIndex, customizer);
    });

    /**
     * The opposite of `_.pick`; this method creates an object composed of the
     * own and inherited enumerable property paths of `object` that are not omitted.
     *
     * **Note:** This method is considerably slower than `_.pick`.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Object
     * @param {Object} object The source object.
     * @param {...(string|string[])} [paths] The property paths to omit.
     * @returns {Object} Returns the new object.
     * @example
     *
     * var object = { 'a': 1, 'b': '2', 'c': 3 };
     *
     * _.omit(object, ['a', 'c']);
     * // => { 'b': '2' }
     */
    var omit = flatRest(function(object, paths) {
      var result = {};
      if (object == null) {
        return result;
      }
      var isDeep = false;
      paths = arrayMap(paths, function(path) {
        path = castPath(path, object);
        isDeep || (isDeep = path.length > 1);
        return path;
      });
      copyObject(object, getAllKeysIn(object), result);
      if (isDeep) {
        result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);
      }
      var length = paths.length;
      while (length--) {
        baseUnset(result, paths[length]);
      }
      return result;
    });

    /**
     * The opposite of `_.pickBy`; this method creates an object composed of
     * the own and inherited enumerable string keyed properties of `object` that
     * `predicate` doesn't return truthy for. The predicate is invoked with two
     * arguments: (value, key).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Object
     * @param {Object} object The source object.
     * @param {Function} [predicate=_.identity] The function invoked per property.
     * @returns {Object} Returns the new object.
     * @example
     *
     * var object = { 'a': 1, 'b': '2', 'c': 3 };
     *
     * _.omitBy(object, _.isNumber);
     * // => { 'b': '2' }
     */
    function omitBy(object, predicate) {
      return pickBy(object, negate(getIteratee(predicate)));
    }

    /**
     * Creates an object composed of the picked `object` properties.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Object
     * @param {Object} object The source object.
     * @param {...(string|string[])} [paths] The property paths to pick.
     * @returns {Object} Returns the new object.
     * @example
     *
     * var object = { 'a': 1, 'b': '2', 'c': 3 };
     *
     * _.pick(object, ['a', 'c']);
     * // => { 'a': 1, 'c': 3 }
     */
    var pick = flatRest(function(object, paths) {
      return object == null ? {} : basePick(object, paths);
    });

    /**
     * Creates an object composed of the `object` properties `predicate` returns
     * truthy for. The predicate is invoked with two arguments: (value, key).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Object
     * @param {Object} object The source object.
     * @param {Function} [predicate=_.identity] The function invoked per property.
     * @returns {Object} Returns the new object.
     * @example
     *
     * var object = { 'a': 1, 'b': '2', 'c': 3 };
     *
     * _.pickBy(object, _.isNumber);
     * // => { 'a': 1, 'c': 3 }
     */
    function pickBy(object, predicate) {
      if (object == null) {
        return {};
      }
      var props = arrayMap(getAllKeysIn(object), function(prop) {
        return [prop];
      });
      predicate = getIteratee(predicate);
      return basePickBy(object, props, function(value, path) {
        return predicate(value, path[0]);
      });
    }

    /**
     * This method is like `_.get` except that if the resolved value is a
     * function it's invoked with the `this` binding of its parent object and
     * its result is returned.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Object
     * @param {Object} object The object to query.
     * @param {Array|string} path The path of the property to resolve.
     * @param {*} [defaultValue] The value returned for `undefined` resolved values.
     * @returns {*} Returns the resolved value.
     * @example
     *
     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
     *
     * _.result(object, 'a[0].b.c1');
     * // => 3
     *
     * _.result(object, 'a[0].b.c2');
     * // => 4
     *
     * _.result(object, 'a[0].b.c3', 'default');
     * // => 'default'
     *
     * _.result(object, 'a[0].b.c3', _.constant('default'));
     * // => 'default'
     */
    function result(object, path, defaultValue) {
      path = castPath(path, object);

      var index = -1,
          length = path.length;

      // Ensure the loop is entered when path is empty.
      if (!length) {
        length = 1;
        object = undefined;
      }
      while (++index < length) {
        var value = object == null ? undefined : object[toKey(path[index])];
        if (value === undefined) {
          index = length;
          value = defaultValue;
        }
        object = isFunction(value) ? value.call(object) : value;
      }
      return object;
    }

    /**
     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,
     * it's created. Arrays are created for missing index properties while objects
     * are created for all other missing properties. Use `_.setWith` to customize
     * `path` creation.
     *
     * **Note:** This method mutates `object`.
     *
     * @static
     * @memberOf _
     * @since 3.7.0
     * @category Object
     * @param {Object} object The object to modify.
     * @param {Array|string} path The path of the property to set.
     * @param {*} value The value to set.
     * @returns {Object} Returns `object`.
     * @example
     *
     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
     *
     * _.set(object, 'a[0].b.c', 4);
     * console.log(object.a[0].b.c);
     * // => 4
     *
     * _.set(object, ['x', '0', 'y', 'z'], 5);
     * console.log(object.x[0].y.z);
     * // => 5
     */
    function set(object, path, value) {
      return object == null ? object : baseSet(object, path, value);
    }

    /**
     * This method is like `_.set` except that it accepts `customizer` which is
     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`
     * path creation is handled by the method instead. The `customizer` is invoked
     * with three arguments: (nsValue, key, nsObject).
     *
     * **Note:** This method mutates `object`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Object
     * @param {Object} object The object to modify.
     * @param {Array|string} path The path of the property to set.
     * @param {*} value The value to set.
     * @param {Function} [customizer] The function to customize assigned values.
     * @returns {Object} Returns `object`.
     * @example
     *
     * var object = {};
     *
     * _.setWith(object, '[0][1]', 'a', Object);
     * // => { '0': { '1': 'a' } }
     */
    function setWith(object, path, value, customizer) {
      customizer = typeof customizer == 'function' ? customizer : undefined;
      return object == null ? object : baseSet(object, path, value, customizer);
    }

    /**
     * Creates an array of own enumerable string keyed-value pairs for `object`
     * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
     * entries are returned.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @alias entries
     * @category Object
     * @param {Object} object The object to query.
     * @returns {Array} Returns the key-value pairs.
     * @example
     *
     * function Foo() {
     *   this.a = 1;
     *   this.b = 2;
     * }
     *
     * Foo.prototype.c = 3;
     *
     * _.toPairs(new Foo);
     * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
     */
    var toPairs = createToPairs(keys);

    /**
     * Creates an array of own and inherited enumerable string keyed-value pairs
     * for `object` which can be consumed by `_.fromPairs`. If `object` is a map
     * or set, its entries are returned.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @alias entriesIn
     * @category Object
     * @param {Object} object The object to query.
     * @returns {Array} Returns the key-value pairs.
     * @example
     *
     * function Foo() {
     *   this.a = 1;
     *   this.b = 2;
     * }
     *
     * Foo.prototype.c = 3;
     *
     * _.toPairsIn(new Foo);
     * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)
     */
    var toPairsIn = createToPairs(keysIn);

    /**
     * An alternative to `_.reduce`; this method transforms `object` to a new
     * `accumulator` object which is the result of running each of its own
     * enumerable string keyed properties thru `iteratee`, with each invocation
     * potentially mutating the `accumulator` object. If `accumulator` is not
     * provided, a new object with the same `[[Prototype]]` will be used. The
     * iteratee is invoked with four arguments: (accumulator, value, key, object).
     * Iteratee functions may exit iteration early by explicitly returning `false`.
     *
     * @static
     * @memberOf _
     * @since 1.3.0
     * @category Object
     * @param {Object} object The object to iterate over.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @param {*} [accumulator] The custom accumulator value.
     * @returns {*} Returns the accumulated value.
     * @example
     *
     * _.transform([2, 3, 4], function(result, n) {
     *   result.push(n *= n);
     *   return n % 2 == 0;
     * }, []);
     * // => [4, 9]
     *
     * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
     *   (result[value] || (result[value] = [])).push(key);
     * }, {});
     * // => { '1': ['a', 'c'], '2': ['b'] }
     */
    function transform(object, iteratee, accumulator) {
      var isArr = isArray(object),
          isArrLike = isArr || isBuffer(object) || isTypedArray(object);

      iteratee = getIteratee(iteratee, 4);
      if (accumulator == null) {
        var Ctor = object && object.constructor;
        if (isArrLike) {
          accumulator = isArr ? new Ctor : [];
        }
        else if (isObject(object)) {
          accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
        }
        else {
          accumulator = {};
        }
      }
      (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {
        return iteratee(accumulator, value, index, object);
      });
      return accumulator;
    }

    /**
     * Removes the property at `path` of `object`.
     *
     * **Note:** This method mutates `object`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Object
     * @param {Object} object The object to modify.
     * @param {Array|string} path The path of the property to unset.
     * @returns {boolean} Returns `true` if the property is deleted, else `false`.
     * @example
     *
     * var object = { 'a': [{ 'b': { 'c': 7 } }] };
     * _.unset(object, 'a[0].b.c');
     * // => true
     *
     * console.log(object);
     * // => { 'a': [{ 'b': {} }] };
     *
     * _.unset(object, ['a', '0', 'b', 'c']);
     * // => true
     *
     * console.log(object);
     * // => { 'a': [{ 'b': {} }] };
     */
    function unset(object, path) {
      return object == null ? true : baseUnset(object, path);
    }

    /**
     * This method is like `_.set` except that accepts `updater` to produce the
     * value to set. Use `_.updateWith` to customize `path` creation. The `updater`
     * is invoked with one argument: (value).
     *
     * **Note:** This method mutates `object`.
     *
     * @static
     * @memberOf _
     * @since 4.6.0
     * @category Object
     * @param {Object} object The object to modify.
     * @param {Array|string} path The path of the property to set.
     * @param {Function} updater The function to produce the updated value.
     * @returns {Object} Returns `object`.
     * @example
     *
     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
     *
     * _.update(object, 'a[0].b.c', function(n) { return n * n; });
     * console.log(object.a[0].b.c);
     * // => 9
     *
     * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });
     * console.log(object.x[0].y.z);
     * // => 0
     */
    function update(object, path, updater) {
      return object == null ? object : baseUpdate(object, path, castFunction(updater));
    }

    /**
     * This method is like `_.update` except that it accepts `customizer` which is
     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`
     * path creation is handled by the method instead. The `customizer` is invoked
     * with three arguments: (nsValue, key, nsObject).
     *
     * **Note:** This method mutates `object`.
     *
     * @static
     * @memberOf _
     * @since 4.6.0
     * @category Object
     * @param {Object} object The object to modify.
     * @param {Array|string} path The path of the property to set.
     * @param {Function} updater The function to produce the updated value.
     * @param {Function} [customizer] The function to customize assigned values.
     * @returns {Object} Returns `object`.
     * @example
     *
     * var object = {};
     *
     * _.updateWith(object, '[0][1]', _.constant('a'), Object);
     * // => { '0': { '1': 'a' } }
     */
    function updateWith(object, path, updater, customizer) {
      customizer = typeof customizer == 'function' ? customizer : undefined;
      return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);
    }

    /**
     * Creates an array of the own enumerable string keyed property values of `object`.
     *
     * **Note:** Non-object values are coerced to objects.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Object
     * @param {Object} object The object to query.
     * @returns {Array} Returns the array of property values.
     * @example
     *
     * function Foo() {
     *   this.a = 1;
     *   this.b = 2;
     * }
     *
     * Foo.prototype.c = 3;
     *
     * _.values(new Foo);
     * // => [1, 2] (iteration order is not guaranteed)
     *
     * _.values('hi');
     * // => ['h', 'i']
     */
    function values(object) {
      return object == null ? [] : baseValues(object, keys(object));
    }

    /**
     * Creates an array of the own and inherited enumerable string keyed property
     * values of `object`.
     *
     * **Note:** Non-object values are coerced to objects.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Object
     * @param {Object} object The object to query.
     * @returns {Array} Returns the array of property values.
     * @example
     *
     * function Foo() {
     *   this.a = 1;
     *   this.b = 2;
     * }
     *
     * Foo.prototype.c = 3;
     *
     * _.valuesIn(new Foo);
     * // => [1, 2, 3] (iteration order is not guaranteed)
     */
    function valuesIn(object) {
      return object == null ? [] : baseValues(object, keysIn(object));
    }

    /*------------------------------------------------------------------------*/

    /**
     * Clamps `number` within the inclusive `lower` and `upper` bounds.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Number
     * @param {number} number The number to clamp.
     * @param {number} [lower] The lower bound.
     * @param {number} upper The upper bound.
     * @returns {number} Returns the clamped number.
     * @example
     *
     * _.clamp(-10, -5, 5);
     * // => -5
     *
     * _.clamp(10, -5, 5);
     * // => 5
     */
    function clamp(number, lower, upper) {
      if (upper === undefined) {
        upper = lower;
        lower = undefined;
      }
      if (upper !== undefined) {
        upper = toNumber(upper);
        upper = upper === upper ? upper : 0;
      }
      if (lower !== undefined) {
        lower = toNumber(lower);
        lower = lower === lower ? lower : 0;
      }
      return baseClamp(toNumber(number), lower, upper);
    }

    /**
     * Checks if `n` is between `start` and up to, but not including, `end`. If
     * `end` is not specified, it's set to `start` with `start` then set to `0`.
     * If `start` is greater than `end` the params are swapped to support
     * negative ranges.
     *
     * @static
     * @memberOf _
     * @since 3.3.0
     * @category Number
     * @param {number} number The number to check.
     * @param {number} [start=0] The start of the range.
     * @param {number} end The end of the range.
     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
     * @see _.range, _.rangeRight
     * @example
     *
     * _.inRange(3, 2, 4);
     * // => true
     *
     * _.inRange(4, 8);
     * // => true
     *
     * _.inRange(4, 2);
     * // => false
     *
     * _.inRange(2, 2);
     * // => false
     *
     * _.inRange(1.2, 2);
     * // => true
     *
     * _.inRange(5.2, 4);
     * // => false
     *
     * _.inRange(-3, -2, -6);
     * // => true
     */
    function inRange(number, start, end) {
      start = toFinite(start);
      if (end === undefined) {
        end = start;
        start = 0;
      } else {
        end = toFinite(end);
      }
      number = toNumber(number);
      return baseInRange(number, start, end);
    }

    /**
     * Produces a random number between the inclusive `lower` and `upper` bounds.
     * If only one argument is provided a number between `0` and the given number
     * is returned. If `floating` is `true`, or either `lower` or `upper` are
     * floats, a floating-point number is returned instead of an integer.
     *
     * **Note:** JavaScript follows the IEEE-754 standard for resolving
     * floating-point values which can produce unexpected results.
     *
     * @static
     * @memberOf _
     * @since 0.7.0
     * @category Number
     * @param {number} [lower=0] The lower bound.
     * @param {number} [upper=1] The upper bound.
     * @param {boolean} [floating] Specify returning a floating-point number.
     * @returns {number} Returns the random number.
     * @example
     *
     * _.random(0, 5);
     * // => an integer between 0 and 5
     *
     * _.random(5);
     * // => also an integer between 0 and 5
     *
     * _.random(5, true);
     * // => a floating-point number between 0 and 5
     *
     * _.random(1.2, 5.2);
     * // => a floating-point number between 1.2 and 5.2
     */
    function random(lower, upper, floating) {
      if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {
        upper = floating = undefined;
      }
      if (floating === undefined) {
        if (typeof upper == 'boolean') {
          floating = upper;
          upper = undefined;
        }
        else if (typeof lower == 'boolean') {
          floating = lower;
          lower = undefined;
        }
      }
      if (lower === undefined && upper === undefined) {
        lower = 0;
        upper = 1;
      }
      else {
        lower = toFinite(lower);
        if (upper === undefined) {
          upper = lower;
          lower = 0;
        } else {
          upper = toFinite(upper);
        }
      }
      if (lower > upper) {
        var temp = lower;
        lower = upper;
        upper = temp;
      }
      if (floating || lower % 1 || upper % 1) {
        var rand = nativeRandom();
        return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);
      }
      return baseRandom(lower, upper);
    }

    /*------------------------------------------------------------------------*/

    /**
     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category String
     * @param {string} [string=''] The string to convert.
     * @returns {string} Returns the camel cased string.
     * @example
     *
     * _.camelCase('Foo Bar');
     * // => 'fooBar'
     *
     * _.camelCase('--foo-bar--');
     * // => 'fooBar'
     *
     * _.camelCase('__FOO_BAR__');
     * // => 'fooBar'
     */
    var camelCase = createCompounder(function(result, word, index) {
      word = word.toLowerCase();
      return result + (index ? capitalize(word) : word);
    });

    /**
     * Converts the first character of `string` to upper case and the remaining
     * to lower case.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category String
     * @param {string} [string=''] The string to capitalize.
     * @returns {string} Returns the capitalized string.
     * @example
     *
     * _.capitalize('FRED');
     * // => 'Fred'
     */
    function capitalize(string) {
      return upperFirst(toString(string).toLowerCase());
    }

    /**
     * Deburrs `string` by converting
     * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
     * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)
     * letters to basic Latin letters and removing
     * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category String
     * @param {string} [string=''] The string to deburr.
     * @returns {string} Returns the deburred string.
     * @example
     *
     * _.deburr('déjà vu');
     * // => 'deja vu'
     */
    function deburr(string) {
      string = toString(string);
      return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');
    }

    /**
     * Checks if `string` ends with the given target string.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category String
     * @param {string} [string=''] The string to inspect.
     * @param {string} [target] The string to search for.
     * @param {number} [position=string.length] The position to search up to.
     * @returns {boolean} Returns `true` if `string` ends with `target`,
     *  else `false`.
     * @example
     *
     * _.endsWith('abc', 'c');
     * // => true
     *
     * _.endsWith('abc', 'b');
     * // => false
     *
     * _.endsWith('abc', 'b', 2);
     * // => true
     */
    function endsWith(string, target, position) {
      string = toString(string);
      target = baseToString(target);

      var length = string.length;
      position = position === undefined
        ? length
        : baseClamp(toInteger(position), 0, length);

      var end = position;
      position -= target.length;
      return position >= 0 && string.slice(position, end) == target;
    }

    /**
     * Converts the characters "&", "<", ">", '"', and "'" in `string` to their
     * corresponding HTML entities.
     *
     * **Note:** No other characters are escaped. To escape additional
     * characters use a third-party library like [_he_](https://mths.be/he).
     *
     * Though the ">" character is escaped for symmetry, characters like
     * ">" and "/" don't need escaping in HTML and have no special meaning
     * unless they're part of a tag or unquoted attribute value. See
     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
     * (under "semi-related fun fact") for more details.
     *
     * When working with HTML you should always
     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce
     * XSS vectors.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category String
     * @param {string} [string=''] The string to escape.
     * @returns {string} Returns the escaped string.
     * @example
     *
     * _.escape('fred, barney, & pebbles');
     * // => 'fred, barney, &amp; pebbles'
     */
    function escape(string) {
      string = toString(string);
      return (string && reHasUnescapedHtml.test(string))
        ? string.replace(reUnescapedHtml, escapeHtmlChar)
        : string;
    }

    /**
     * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+",
     * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category String
     * @param {string} [string=''] The string to escape.
     * @returns {string} Returns the escaped string.
     * @example
     *
     * _.escapeRegExp('[lodash](https://lodash.com/)');
     * // => '\[lodash\]\(https://lodash\.com/\)'
     */
    function escapeRegExp(string) {
      string = toString(string);
      return (string && reHasRegExpChar.test(string))
        ? string.replace(reRegExpChar, '\\$&')
        : string;
    }

    /**
     * Converts `string` to
     * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category String
     * @param {string} [string=''] The string to convert.
     * @returns {string} Returns the kebab cased string.
     * @example
     *
     * _.kebabCase('Foo Bar');
     * // => 'foo-bar'
     *
     * _.kebabCase('fooBar');
     * // => 'foo-bar'
     *
     * _.kebabCase('__FOO_BAR__');
     * // => 'foo-bar'
     */
    var kebabCase = createCompounder(function(result, word, index) {
      return result + (index ? '-' : '') + word.toLowerCase();
    });

    /**
     * Converts `string`, as space separated words, to lower case.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category String
     * @param {string} [string=''] The string to convert.
     * @returns {string} Returns the lower cased string.
     * @example
     *
     * _.lowerCase('--Foo-Bar--');
     * // => 'foo bar'
     *
     * _.lowerCase('fooBar');
     * // => 'foo bar'
     *
     * _.lowerCase('__FOO_BAR__');
     * // => 'foo bar'
     */
    var lowerCase = createCompounder(function(result, word, index) {
      return result + (index ? ' ' : '') + word.toLowerCase();
    });

    /**
     * Converts the first character of `string` to lower case.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category String
     * @param {string} [string=''] The string to convert.
     * @returns {string} Returns the converted string.
     * @example
     *
     * _.lowerFirst('Fred');
     * // => 'fred'
     *
     * _.lowerFirst('FRED');
     * // => 'fRED'
     */
    var lowerFirst = createCaseFirst('toLowerCase');

    /**
     * Pads `string` on the left and right sides if it's shorter than `length`.
     * Padding characters are truncated if they can't be evenly divided by `length`.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category String
     * @param {string} [string=''] The string to pad.
     * @param {number} [length=0] The padding length.
     * @param {string} [chars=' '] The string used as padding.
     * @returns {string} Returns the padded string.
     * @example
     *
     * _.pad('abc', 8);
     * // => '  abc   '
     *
     * _.pad('abc', 8, '_-');
     * // => '_-abc_-_'
     *
     * _.pad('abc', 3);
     * // => 'abc'
     */
    function pad(string, length, chars) {
      string = toString(string);
      length = toInteger(length);

      var strLength = length ? stringSize(string) : 0;
      if (!length || strLength >= length) {
        return string;
      }
      var mid = (length - strLength) / 2;
      return (
        createPadding(nativeFloor(mid), chars) +
        string +
        createPadding(nativeCeil(mid), chars)
      );
    }

    /**
     * Pads `string` on the right side if it's shorter than `length`. Padding
     * characters are truncated if they exceed `length`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category String
     * @param {string} [string=''] The string to pad.
     * @param {number} [length=0] The padding length.
     * @param {string} [chars=' '] The string used as padding.
     * @returns {string} Returns the padded string.
     * @example
     *
     * _.padEnd('abc', 6);
     * // => 'abc   '
     *
     * _.padEnd('abc', 6, '_-');
     * // => 'abc_-_'
     *
     * _.padEnd('abc', 3);
     * // => 'abc'
     */
    function padEnd(string, length, chars) {
      string = toString(string);
      length = toInteger(length);

      var strLength = length ? stringSize(string) : 0;
      return (length && strLength < length)
        ? (string + createPadding(length - strLength, chars))
        : string;
    }

    /**
     * Pads `string` on the left side if it's shorter than `length`. Padding
     * characters are truncated if they exceed `length`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category String
     * @param {string} [string=''] The string to pad.
     * @param {number} [length=0] The padding length.
     * @param {string} [chars=' '] The string used as padding.
     * @returns {string} Returns the padded string.
     * @example
     *
     * _.padStart('abc', 6);
     * // => '   abc'
     *
     * _.padStart('abc', 6, '_-');
     * // => '_-_abc'
     *
     * _.padStart('abc', 3);
     * // => 'abc'
     */
    function padStart(string, length, chars) {
      string = toString(string);
      length = toInteger(length);

      var strLength = length ? stringSize(string) : 0;
      return (length && strLength < length)
        ? (createPadding(length - strLength, chars) + string)
        : string;
    }

    /**
     * Converts `string` to an integer of the specified radix. If `radix` is
     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a
     * hexadecimal, in which case a `radix` of `16` is used.
     *
     * **Note:** This method aligns with the
     * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.
     *
     * @static
     * @memberOf _
     * @since 1.1.0
     * @category String
     * @param {string} string The string to convert.
     * @param {number} [radix=10] The radix to interpret `value` by.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {number} Returns the converted integer.
     * @example
     *
     * _.parseInt('08');
     * // => 8
     *
     * _.map(['6', '08', '10'], _.parseInt);
     * // => [6, 8, 10]
     */
    function parseInt(string, radix, guard) {
      if (guard || radix == null) {
        radix = 0;
      } else if (radix) {
        radix = +radix;
      }
      return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);
    }

    /**
     * Repeats the given string `n` times.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category String
     * @param {string} [string=''] The string to repeat.
     * @param {number} [n=1] The number of times to repeat the string.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {string} Returns the repeated string.
     * @example
     *
     * _.repeat('*', 3);
     * // => '***'
     *
     * _.repeat('abc', 2);
     * // => 'abcabc'
     *
     * _.repeat('abc', 0);
     * // => ''
     */
    function repeat(string, n, guard) {
      if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {
        n = 1;
      } else {
        n = toInteger(n);
      }
      return baseRepeat(toString(string), n);
    }

    /**
     * Replaces matches for `pattern` in `string` with `replacement`.
     *
     * **Note:** This method is based on
     * [`String#replace`](https://mdn.io/String/replace).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category String
     * @param {string} [string=''] The string to modify.
     * @param {RegExp|string} pattern The pattern to replace.
     * @param {Function|string} replacement The match replacement.
     * @returns {string} Returns the modified string.
     * @example
     *
     * _.replace('Hi Fred', 'Fred', 'Barney');
     * // => 'Hi Barney'
     */
    function replace() {
      var args = arguments,
          string = toString(args[0]);

      return args.length < 3 ? string : string.replace(args[1], args[2]);
    }

    /**
     * Converts `string` to
     * [snake case](https://en.wikipedia.org/wiki/Snake_case).
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category String
     * @param {string} [string=''] The string to convert.
     * @returns {string} Returns the snake cased string.
     * @example
     *
     * _.snakeCase('Foo Bar');
     * // => 'foo_bar'
     *
     * _.snakeCase('fooBar');
     * // => 'foo_bar'
     *
     * _.snakeCase('--FOO-BAR--');
     * // => 'foo_bar'
     */
    var snakeCase = createCompounder(function(result, word, index) {
      return result + (index ? '_' : '') + word.toLowerCase();
    });

    /**
     * Splits `string` by `separator`.
     *
     * **Note:** This method is based on
     * [`String#split`](https://mdn.io/String/split).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category String
     * @param {string} [string=''] The string to split.
     * @param {RegExp|string} separator The separator pattern to split by.
     * @param {number} [limit] The length to truncate results to.
     * @returns {Array} Returns the string segments.
     * @example
     *
     * _.split('a-b-c', '-', 2);
     * // => ['a', 'b']
     */
    function split(string, separator, limit) {
      if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {
        separator = limit = undefined;
      }
      limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;
      if (!limit) {
        return [];
      }
      string = toString(string);
      if (string && (
            typeof separator == 'string' ||
            (separator != null && !isRegExp(separator))
          )) {
        separator = baseToString(separator);
        if (!separator && hasUnicode(string)) {
          return castSlice(stringToArray(string), 0, limit);
        }
      }
      return string.split(separator, limit);
    }

    /**
     * Converts `string` to
     * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).
     *
     * @static
     * @memberOf _
     * @since 3.1.0
     * @category String
     * @param {string} [string=''] The string to convert.
     * @returns {string} Returns the start cased string.
     * @example
     *
     * _.startCase('--foo-bar--');
     * // => 'Foo Bar'
     *
     * _.startCase('fooBar');
     * // => 'Foo Bar'
     *
     * _.startCase('__FOO_BAR__');
     * // => 'FOO BAR'
     */
    var startCase = createCompounder(function(result, word, index) {
      return result + (index ? ' ' : '') + upperFirst(word);
    });

    /**
     * Checks if `string` starts with the given target string.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category String
     * @param {string} [string=''] The string to inspect.
     * @param {string} [target] The string to search for.
     * @param {number} [position=0] The position to search from.
     * @returns {boolean} Returns `true` if `string` starts with `target`,
     *  else `false`.
     * @example
     *
     * _.startsWith('abc', 'a');
     * // => true
     *
     * _.startsWith('abc', 'b');
     * // => false
     *
     * _.startsWith('abc', 'b', 1);
     * // => true
     */
    function startsWith(string, target, position) {
      string = toString(string);
      position = position == null
        ? 0
        : baseClamp(toInteger(position), 0, string.length);

      target = baseToString(target);
      return string.slice(position, position + target.length) == target;
    }

    /**
     * Creates a compiled template function that can interpolate data properties
     * in "interpolate" delimiters, HTML-escape interpolated data properties in
     * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data
     * properties may be accessed as free variables in the template. If a setting
     * object is given, it takes precedence over `_.templateSettings` values.
     *
     * **Note:** In the development build `_.template` utilizes
     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
     * for easier debugging.
     *
     * For more information on precompiling templates see
     * [lodash's custom builds documentation](https://lodash.com/custom-builds).
     *
     * For more information on Chrome extension sandboxes see
     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category String
     * @param {string} [string=''] The template string.
     * @param {Object} [options={}] The options object.
     * @param {RegExp} [options.escape=_.templateSettings.escape]
     *  The HTML "escape" delimiter.
     * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]
     *  The "evaluate" delimiter.
     * @param {Object} [options.imports=_.templateSettings.imports]
     *  An object to import into the template as free variables.
     * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]
     *  The "interpolate" delimiter.
     * @param {string} [options.sourceURL='lodash.templateSources[n]']
     *  The sourceURL of the compiled template.
     * @param {string} [options.variable='obj']
     *  The data object variable name.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {Function} Returns the compiled template function.
     * @example
     *
     * // Use the "interpolate" delimiter to create a compiled template.
     * var compiled = _.template('hello <%= user %>!');
     * compiled({ 'user': 'fred' });
     * // => 'hello fred!'
     *
     * // Use the HTML "escape" delimiter to escape data property values.
     * var compiled = _.template('<b><%- value %></b>');
     * compiled({ 'value': '<script>' });
     * // => '<b>&lt;script&gt;</b>'
     *
     * // Use the "evaluate" delimiter to execute JavaScript and generate HTML.
     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');
     * compiled({ 'users': ['fred', 'barney'] });
     * // => '<li>fred</li><li>barney</li>'
     *
     * // Use the internal `print` function in "evaluate" delimiters.
     * var compiled = _.template('<% print("hello " + user); %>!');
     * compiled({ 'user': 'barney' });
     * // => 'hello barney!'
     *
     * // Use the ES template literal delimiter as an "interpolate" delimiter.
     * // Disable support by replacing the "interpolate" delimiter.
     * var compiled = _.template('hello ${ user }!');
     * compiled({ 'user': 'pebbles' });
     * // => 'hello pebbles!'
     *
     * // Use backslashes to treat delimiters as plain text.
     * var compiled = _.template('<%= "\\<%- value %\\>" %>');
     * compiled({ 'value': 'ignored' });
     * // => '<%- value %>'
     *
     * // Use the `imports` option to import `jQuery` as `jq`.
     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';
     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });
     * compiled({ 'users': ['fred', 'barney'] });
     * // => '<li>fred</li><li>barney</li>'
     *
     * // Use the `sourceURL` option to specify a custom sourceURL for the template.
     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });
     * compiled(data);
     * // => Find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector.
     *
     * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.
     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });
     * compiled.source;
     * // => function(data) {
     * //   var __t, __p = '';
     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';
     * //   return __p;
     * // }
     *
     * // Use custom template delimiters.
     * _.templateSettings.interpolate = /{{([\s\S]+?)}}/g;
     * var compiled = _.template('hello {{ user }}!');
     * compiled({ 'user': 'mustache' });
     * // => 'hello mustache!'
     *
     * // Use the `source` property to inline compiled templates for meaningful
     * // line numbers in error messages and stack traces.
     * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\
     *   var JST = {\
     *     "main": ' + _.template(mainText).source + '\
     *   };\
     * ');
     */
    function template(string, options, guard) {
      // Based on John Resig's `tmpl` implementation
      // (http://ejohn.org/blog/javascript-micro-templating/)
      // and Laura Doktorova's doT.js (https://github.com/olado/doT).
      var settings = lodash.templateSettings;

      if (guard && isIterateeCall(string, options, guard)) {
        options = undefined;
      }
      string = toString(string);
      options = assignInWith({}, options, settings, customDefaultsAssignIn);

      var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),
          importsKeys = keys(imports),
          importsValues = baseValues(imports, importsKeys);

      var isEscaping,
          isEvaluating,
          index = 0,
          interpolate = options.interpolate || reNoMatch,
          source = "__p += '";

      // Compile the regexp to match each delimiter.
      var reDelimiters = RegExp(
        (options.escape || reNoMatch).source + '|' +
        interpolate.source + '|' +
        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +
        (options.evaluate || reNoMatch).source + '|$'
      , 'g');

      // Use a sourceURL for easier debugging.
      // The sourceURL gets injected into the source that's eval-ed, so be careful
      // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in
      // and escape the comment, thus injecting code that gets evaled.
      var sourceURL = '//# sourceURL=' +
        (hasOwnProperty.call(options, 'sourceURL')
          ? (options.sourceURL + '').replace(/\s/g, ' ')
          : ('lodash.templateSources[' + (++templateCounter) + ']')
        ) + '\n';

      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
        interpolateValue || (interpolateValue = esTemplateValue);

        // Escape characters that can't be included in string literals.
        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);

        // Replace delimiters with snippets.
        if (escapeValue) {
          isEscaping = true;
          source += "' +\n__e(" + escapeValue + ") +\n'";
        }
        if (evaluateValue) {
          isEvaluating = true;
          source += "';\n" + evaluateValue + ";\n__p += '";
        }
        if (interpolateValue) {
          source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
        }
        index = offset + match.length;

        // The JS engine embedded in Adobe products needs `match` returned in
        // order to produce the correct `offset` value.
        return match;
      });

      source += "';\n";

      // If `variable` is not specified wrap a with-statement around the generated
      // code to add the data object to the top of the scope chain.
      var variable = hasOwnProperty.call(options, 'variable') && options.variable;
      if (!variable) {
        source = 'with (obj) {\n' + source + '\n}\n';
      }
      // Throw an error if a forbidden character was found in `variable`, to prevent
      // potential command injection attacks.
      else if (reForbiddenIdentifierChars.test(variable)) {
        throw new Error(INVALID_TEMPL_VAR_ERROR_TEXT);
      }

      // Cleanup code by stripping empty strings.
      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)
        .replace(reEmptyStringMiddle, '$1')
        .replace(reEmptyStringTrailing, '$1;');

      // Frame code as the function body.
      source = 'function(' + (variable || 'obj') + ') {\n' +
        (variable
          ? ''
          : 'obj || (obj = {});\n'
        ) +
        "var __t, __p = ''" +
        (isEscaping
           ? ', __e = _.escape'
           : ''
        ) +
        (isEvaluating
          ? ', __j = Array.prototype.join;\n' +
            "function print() { __p += __j.call(arguments, '') }\n"
          : ';\n'
        ) +
        source +
        'return __p\n}';

      var result = attempt(function() {
        return Function(importsKeys, sourceURL + 'return ' + source)
          .apply(undefined, importsValues);
      });

      // Provide the compiled function's source by its `toString` method or
      // the `source` property as a convenience for inlining compiled templates.
      result.source = source;
      if (isError(result)) {
        throw result;
      }
      return result;
    }

    /**
     * Converts `string`, as a whole, to lower case just like
     * [String#toLowerCase](https://mdn.io/toLowerCase).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category String
     * @param {string} [string=''] The string to convert.
     * @returns {string} Returns the lower cased string.
     * @example
     *
     * _.toLower('--Foo-Bar--');
     * // => '--foo-bar--'
     *
     * _.toLower('fooBar');
     * // => 'foobar'
     *
     * _.toLower('__FOO_BAR__');
     * // => '__foo_bar__'
     */
    function toLower(value) {
      return toString(value).toLowerCase();
    }

    /**
     * Converts `string`, as a whole, to upper case just like
     * [String#toUpperCase](https://mdn.io/toUpperCase).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category String
     * @param {string} [string=''] The string to convert.
     * @returns {string} Returns the upper cased string.
     * @example
     *
     * _.toUpper('--foo-bar--');
     * // => '--FOO-BAR--'
     *
     * _.toUpper('fooBar');
     * // => 'FOOBAR'
     *
     * _.toUpper('__foo_bar__');
     * // => '__FOO_BAR__'
     */
    function toUpper(value) {
      return toString(value).toUpperCase();
    }

    /**
     * Removes leading and trailing whitespace or specified characters from `string`.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category String
     * @param {string} [string=''] The string to trim.
     * @param {string} [chars=whitespace] The characters to trim.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {string} Returns the trimmed string.
     * @example
     *
     * _.trim('  abc  ');
     * // => 'abc'
     *
     * _.trim('-_-abc-_-', '_-');
     * // => 'abc'
     *
     * _.map(['  foo  ', '  bar  '], _.trim);
     * // => ['foo', 'bar']
     */
    function trim(string, chars, guard) {
      string = toString(string);
      if (string && (guard || chars === undefined)) {
        return baseTrim(string);
      }
      if (!string || !(chars = baseToString(chars))) {
        return string;
      }
      var strSymbols = stringToArray(string),
          chrSymbols = stringToArray(chars),
          start = charsStartIndex(strSymbols, chrSymbols),
          end = charsEndIndex(strSymbols, chrSymbols) + 1;

      return castSlice(strSymbols, start, end).join('');
    }

    /**
     * Removes trailing whitespace or specified characters from `string`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category String
     * @param {string} [string=''] The string to trim.
     * @param {string} [chars=whitespace] The characters to trim.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {string} Returns the trimmed string.
     * @example
     *
     * _.trimEnd('  abc  ');
     * // => '  abc'
     *
     * _.trimEnd('-_-abc-_-', '_-');
     * // => '-_-abc'
     */
    function trimEnd(string, chars, guard) {
      string = toString(string);
      if (string && (guard || chars === undefined)) {
        return string.slice(0, trimmedEndIndex(string) + 1);
      }
      if (!string || !(chars = baseToString(chars))) {
        return string;
      }
      var strSymbols = stringToArray(string),
          end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;

      return castSlice(strSymbols, 0, end).join('');
    }

    /**
     * Removes leading whitespace or specified characters from `string`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category String
     * @param {string} [string=''] The string to trim.
     * @param {string} [chars=whitespace] The characters to trim.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {string} Returns the trimmed string.
     * @example
     *
     * _.trimStart('  abc  ');
     * // => 'abc  '
     *
     * _.trimStart('-_-abc-_-', '_-');
     * // => 'abc-_-'
     */
    function trimStart(string, chars, guard) {
      string = toString(string);
      if (string && (guard || chars === undefined)) {
        return string.replace(reTrimStart, '');
      }
      if (!string || !(chars = baseToString(chars))) {
        return string;
      }
      var strSymbols = stringToArray(string),
          start = charsStartIndex(strSymbols, stringToArray(chars));

      return castSlice(strSymbols, start).join('');
    }

    /**
     * Truncates `string` if it's longer than the given maximum string length.
     * The last characters of the truncated string are replaced with the omission
     * string which defaults to "...".
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category String
     * @param {string} [string=''] The string to truncate.
     * @param {Object} [options={}] The options object.
     * @param {number} [options.length=30] The maximum string length.
     * @param {string} [options.omission='...'] The string to indicate text is omitted.
     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.
     * @returns {string} Returns the truncated string.
     * @example
     *
     * _.truncate('hi-diddly-ho there, neighborino');
     * // => 'hi-diddly-ho there, neighbo...'
     *
     * _.truncate('hi-diddly-ho there, neighborino', {
     *   'length': 24,
     *   'separator': ' '
     * });
     * // => 'hi-diddly-ho there,...'
     *
     * _.truncate('hi-diddly-ho there, neighborino', {
     *   'length': 24,
     *   'separator': /,? +/
     * });
     * // => 'hi-diddly-ho there...'
     *
     * _.truncate('hi-diddly-ho there, neighborino', {
     *   'omission': ' [...]'
     * });
     * // => 'hi-diddly-ho there, neig [...]'
     */
    function truncate(string, options) {
      var length = DEFAULT_TRUNC_LENGTH,
          omission = DEFAULT_TRUNC_OMISSION;

      if (isObject(options)) {
        var separator = 'separator' in options ? options.separator : separator;
        length = 'length' in options ? toInteger(options.length) : length;
        omission = 'omission' in options ? baseToString(options.omission) : omission;
      }
      string = toString(string);

      var strLength = string.length;
      if (hasUnicode(string)) {
        var strSymbols = stringToArray(string);
        strLength = strSymbols.length;
      }
      if (length >= strLength) {
        return string;
      }
      var end = length - stringSize(omission);
      if (end < 1) {
        return omission;
      }
      var result = strSymbols
        ? castSlice(strSymbols, 0, end).join('')
        : string.slice(0, end);

      if (separator === undefined) {
        return result + omission;
      }
      if (strSymbols) {
        end += (result.length - end);
      }
      if (isRegExp(separator)) {
        if (string.slice(end).search(separator)) {
          var match,
              substring = result;

          if (!separator.global) {
            separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');
          }
          separator.lastIndex = 0;
          while ((match = separator.exec(substring))) {
            var newEnd = match.index;
          }
          result = result.slice(0, newEnd === undefined ? end : newEnd);
        }
      } else if (string.indexOf(baseToString(separator), end) != end) {
        var index = result.lastIndexOf(separator);
        if (index > -1) {
          result = result.slice(0, index);
        }
      }
      return result + omission;
    }

    /**
     * The inverse of `_.escape`; this method converts the HTML entities
     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to
     * their corresponding characters.
     *
     * **Note:** No other HTML entities are unescaped. To unescape additional
     * HTML entities use a third-party library like [_he_](https://mths.be/he).
     *
     * @static
     * @memberOf _
     * @since 0.6.0
     * @category String
     * @param {string} [string=''] The string to unescape.
     * @returns {string} Returns the unescaped string.
     * @example
     *
     * _.unescape('fred, barney, &amp; pebbles');
     * // => 'fred, barney, & pebbles'
     */
    function unescape(string) {
      string = toString(string);
      return (string && reHasEscapedHtml.test(string))
        ? string.replace(reEscapedHtml, unescapeHtmlChar)
        : string;
    }

    /**
     * Converts `string`, as space separated words, to upper case.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category String
     * @param {string} [string=''] The string to convert.
     * @returns {string} Returns the upper cased string.
     * @example
     *
     * _.upperCase('--foo-bar');
     * // => 'FOO BAR'
     *
     * _.upperCase('fooBar');
     * // => 'FOO BAR'
     *
     * _.upperCase('__foo_bar__');
     * // => 'FOO BAR'
     */
    var upperCase = createCompounder(function(result, word, index) {
      return result + (index ? ' ' : '') + word.toUpperCase();
    });

    /**
     * Converts the first character of `string` to upper case.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category String
     * @param {string} [string=''] The string to convert.
     * @returns {string} Returns the converted string.
     * @example
     *
     * _.upperFirst('fred');
     * // => 'Fred'
     *
     * _.upperFirst('FRED');
     * // => 'FRED'
     */
    var upperFirst = createCaseFirst('toUpperCase');

    /**
     * Splits `string` into an array of its words.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category String
     * @param {string} [string=''] The string to inspect.
     * @param {RegExp|string} [pattern] The pattern to match words.
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
     * @returns {Array} Returns the words of `string`.
     * @example
     *
     * _.words('fred, barney, & pebbles');
     * // => ['fred', 'barney', 'pebbles']
     *
     * _.words('fred, barney, & pebbles', /[^, ]+/g);
     * // => ['fred', 'barney', '&', 'pebbles']
     */
    function words(string, pattern, guard) {
      string = toString(string);
      pattern = guard ? undefined : pattern;

      if (pattern === undefined) {
        return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);
      }
      return string.match(pattern) || [];
    }

    /*------------------------------------------------------------------------*/

    /**
     * Attempts to invoke `func`, returning either the result or the caught error
     * object. Any additional arguments are provided to `func` when it's invoked.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Util
     * @param {Function} func The function to attempt.
     * @param {...*} [args] The arguments to invoke `func` with.
     * @returns {*} Returns the `func` result or error object.
     * @example
     *
     * // Avoid throwing errors for invalid selectors.
     * var elements = _.attempt(function(selector) {
     *   return document.querySelectorAll(selector);
     * }, '>_>');
     *
     * if (_.isError(elements)) {
     *   elements = [];
     * }
     */
    var attempt = baseRest(function(func, args) {
      try {
        return apply(func, undefined, args);
      } catch (e) {
        return isError(e) ? e : new Error(e);
      }
    });

    /**
     * Binds methods of an object to the object itself, overwriting the existing
     * method.
     *
     * **Note:** This method doesn't set the "length" property of bound functions.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Util
     * @param {Object} object The object to bind and assign the bound methods to.
     * @param {...(string|string[])} methodNames The object method names to bind.
     * @returns {Object} Returns `object`.
     * @example
     *
     * var view = {
     *   'label': 'docs',
     *   'click': function() {
     *     console.log('clicked ' + this.label);
     *   }
     * };
     *
     * _.bindAll(view, ['click']);
     * jQuery(element).on('click', view.click);
     * // => Logs 'clicked docs' when clicked.
     */
    var bindAll = flatRest(function(object, methodNames) {
      arrayEach(methodNames, function(key) {
        key = toKey(key);
        baseAssignValue(object, key, bind(object[key], object));
      });
      return object;
    });

    /**
     * Creates a function that iterates over `pairs` and invokes the corresponding
     * function of the first predicate to return truthy. The predicate-function
     * pairs are invoked with the `this` binding and arguments of the created
     * function.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Util
     * @param {Array} pairs The predicate-function pairs.
     * @returns {Function} Returns the new composite function.
     * @example
     *
     * var func = _.cond([
     *   [_.matches({ 'a': 1 }),           _.constant('matches A')],
     *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],
     *   [_.stubTrue,                      _.constant('no match')]
     * ]);
     *
     * func({ 'a': 1, 'b': 2 });
     * // => 'matches A'
     *
     * func({ 'a': 0, 'b': 1 });
     * // => 'matches B'
     *
     * func({ 'a': '1', 'b': '2' });
     * // => 'no match'
     */
    function cond(pairs) {
      var length = pairs == null ? 0 : pairs.length,
          toIteratee = getIteratee();

      pairs = !length ? [] : arrayMap(pairs, function(pair) {
        if (typeof pair[1] != 'function') {
          throw new TypeError(FUNC_ERROR_TEXT);
        }
        return [toIteratee(pair[0]), pair[1]];
      });

      return baseRest(function(args) {
        var index = -1;
        while (++index < length) {
          var pair = pairs[index];
          if (apply(pair[0], this, args)) {
            return apply(pair[1], this, args);
          }
        }
      });
    }

    /**
     * Creates a function that invokes the predicate properties of `source` with
     * the corresponding property values of a given object, returning `true` if
     * all predicates return truthy, else `false`.
     *
     * **Note:** The created function is equivalent to `_.conformsTo` with
     * `source` partially applied.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Util
     * @param {Object} source The object of property predicates to conform to.
     * @returns {Function} Returns the new spec function.
     * @example
     *
     * var objects = [
     *   { 'a': 2, 'b': 1 },
     *   { 'a': 1, 'b': 2 }
     * ];
     *
     * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));
     * // => [{ 'a': 1, 'b': 2 }]
     */
    function conforms(source) {
      return baseConforms(baseClone(source, CLONE_DEEP_FLAG));
    }

    /**
     * Creates a function that returns `value`.
     *
     * @static
     * @memberOf _
     * @since 2.4.0
     * @category Util
     * @param {*} value The value to return from the new function.
     * @returns {Function} Returns the new constant function.
     * @example
     *
     * var objects = _.times(2, _.constant({ 'a': 1 }));
     *
     * console.log(objects);
     * // => [{ 'a': 1 }, { 'a': 1 }]
     *
     * console.log(objects[0] === objects[1]);
     * // => true
     */
    function constant(value) {
      return function() {
        return value;
      };
    }

    /**
     * Checks `value` to determine whether a default value should be returned in
     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,
     * or `undefined`.
     *
     * @static
     * @memberOf _
     * @since 4.14.0
     * @category Util
     * @param {*} value The value to check.
     * @param {*} defaultValue The default value.
     * @returns {*} Returns the resolved value.
     * @example
     *
     * _.defaultTo(1, 10);
     * // => 1
     *
     * _.defaultTo(undefined, 10);
     * // => 10
     */
    function defaultTo(value, defaultValue) {
      return (value == null || value !== value) ? defaultValue : value;
    }

    /**
     * Creates a function that returns the result of invoking the given functions
     * with the `this` binding of the created function, where each successive
     * invocation is supplied the return value of the previous.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Util
     * @param {...(Function|Function[])} [funcs] The functions to invoke.
     * @returns {Function} Returns the new composite function.
     * @see _.flowRight
     * @example
     *
     * function square(n) {
     *   return n * n;
     * }
     *
     * var addSquare = _.flow([_.add, square]);
     * addSquare(1, 2);
     * // => 9
     */
    var flow = createFlow();

    /**
     * This method is like `_.flow` except that it creates a function that
     * invokes the given functions from right to left.
     *
     * @static
     * @since 3.0.0
     * @memberOf _
     * @category Util
     * @param {...(Function|Function[])} [funcs] The functions to invoke.
     * @returns {Function} Returns the new composite function.
     * @see _.flow
     * @example
     *
     * function square(n) {
     *   return n * n;
     * }
     *
     * var addSquare = _.flowRight([square, _.add]);
     * addSquare(1, 2);
     * // => 9
     */
    var flowRight = createFlow(true);

    /**
     * This method returns the first argument it receives.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Util
     * @param {*} value Any value.
     * @returns {*} Returns `value`.
     * @example
     *
     * var object = { 'a': 1 };
     *
     * console.log(_.identity(object) === object);
     * // => true
     */
    function identity(value) {
      return value;
    }

    /**
     * Creates a function that invokes `func` with the arguments of the created
     * function. If `func` is a property name, the created function returns the
     * property value for a given element. If `func` is an array or object, the
     * created function returns `true` for elements that contain the equivalent
     * source properties, otherwise it returns `false`.
     *
     * @static
     * @since 4.0.0
     * @memberOf _
     * @category Util
     * @param {*} [func=_.identity] The value to convert to a callback.
     * @returns {Function} Returns the callback.
     * @example
     *
     * var users = [
     *   { 'user': 'barney', 'age': 36, 'active': true },
     *   { 'user': 'fred',   'age': 40, 'active': false }
     * ];
     *
     * // The `_.matches` iteratee shorthand.
     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));
     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]
     *
     * // The `_.matchesProperty` iteratee shorthand.
     * _.filter(users, _.iteratee(['user', 'fred']));
     * // => [{ 'user': 'fred', 'age': 40 }]
     *
     * // The `_.property` iteratee shorthand.
     * _.map(users, _.iteratee('user'));
     * // => ['barney', 'fred']
     *
     * // Create custom iteratee shorthands.
     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {
     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {
     *     return func.test(string);
     *   };
     * });
     *
     * _.filter(['abc', 'def'], /ef/);
     * // => ['def']
     */
    function iteratee(func) {
      return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));
    }

    /**
     * Creates a function that performs a partial deep comparison between a given
     * object and `source`, returning `true` if the given object has equivalent
     * property values, else `false`.
     *
     * **Note:** The created function is equivalent to `_.isMatch` with `source`
     * partially applied.
     *
     * Partial comparisons will match empty array and empty object `source`
     * values against any array or object value, respectively. See `_.isEqual`
     * for a list of supported value comparisons.
     *
     * **Note:** Multiple values can be checked by combining several matchers
     * using `_.overSome`
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Util
     * @param {Object} source The object of property values to match.
     * @returns {Function} Returns the new spec function.
     * @example
     *
     * var objects = [
     *   { 'a': 1, 'b': 2, 'c': 3 },
     *   { 'a': 4, 'b': 5, 'c': 6 }
     * ];
     *
     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]
     *
     * // Checking for several possible values
     * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));
     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]
     */
    function matches(source) {
      return baseMatches(baseClone(source, CLONE_DEEP_FLAG));
    }

    /**
     * Creates a function that performs a partial deep comparison between the
     * value at `path` of a given object to `srcValue`, returning `true` if the
     * object value is equivalent, else `false`.
     *
     * **Note:** Partial comparisons will match empty array and empty object
     * `srcValue` values against any array or object value, respectively. See
     * `_.isEqual` for a list of supported value comparisons.
     *
     * **Note:** Multiple values can be checked by combining several matchers
     * using `_.overSome`
     *
     * @static
     * @memberOf _
     * @since 3.2.0
     * @category Util
     * @param {Array|string} path The path of the property to get.
     * @param {*} srcValue The value to match.
     * @returns {Function} Returns the new spec function.
     * @example
     *
     * var objects = [
     *   { 'a': 1, 'b': 2, 'c': 3 },
     *   { 'a': 4, 'b': 5, 'c': 6 }
     * ];
     *
     * _.find(objects, _.matchesProperty('a', 4));
     * // => { 'a': 4, 'b': 5, 'c': 6 }
     *
     * // Checking for several possible values
     * _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));
     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]
     */
    function matchesProperty(path, srcValue) {
      return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));
    }

    /**
     * Creates a function that invokes the method at `path` of a given object.
     * Any additional arguments are provided to the invoked method.
     *
     * @static
     * @memberOf _
     * @since 3.7.0
     * @category Util
     * @param {Array|string} path The path of the method to invoke.
     * @param {...*} [args] The arguments to invoke the method with.
     * @returns {Function} Returns the new invoker function.
     * @example
     *
     * var objects = [
     *   { 'a': { 'b': _.constant(2) } },
     *   { 'a': { 'b': _.constant(1) } }
     * ];
     *
     * _.map(objects, _.method('a.b'));
     * // => [2, 1]
     *
     * _.map(objects, _.method(['a', 'b']));
     * // => [2, 1]
     */
    var method = baseRest(function(path, args) {
      return function(object) {
        return baseInvoke(object, path, args);
      };
    });

    /**
     * The opposite of `_.method`; this method creates a function that invokes
     * the method at a given path of `object`. Any additional arguments are
     * provided to the invoked method.
     *
     * @static
     * @memberOf _
     * @since 3.7.0
     * @category Util
     * @param {Object} object The object to query.
     * @param {...*} [args] The arguments to invoke the method with.
     * @returns {Function} Returns the new invoker function.
     * @example
     *
     * var array = _.times(3, _.constant),
     *     object = { 'a': array, 'b': array, 'c': array };
     *
     * _.map(['a[2]', 'c[0]'], _.methodOf(object));
     * // => [2, 0]
     *
     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));
     * // => [2, 0]
     */
    var methodOf = baseRest(function(object, args) {
      return function(path) {
        return baseInvoke(object, path, args);
      };
    });

    /**
     * Adds all own enumerable string keyed function properties of a source
     * object to the destination object. If `object` is a function, then methods
     * are added to its prototype as well.
     *
     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
     * avoid conflicts caused by modifying the original.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Util
     * @param {Function|Object} [object=lodash] The destination object.
     * @param {Object} source The object of functions to add.
     * @param {Object} [options={}] The options object.
     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.
     * @returns {Function|Object} Returns `object`.
     * @example
     *
     * function vowels(string) {
     *   return _.filter(string, function(v) {
     *     return /[aeiou]/i.test(v);
     *   });
     * }
     *
     * _.mixin({ 'vowels': vowels });
     * _.vowels('fred');
     * // => ['e']
     *
     * _('fred').vowels().value();
     * // => ['e']
     *
     * _.mixin({ 'vowels': vowels }, { 'chain': false });
     * _('fred').vowels();
     * // => ['e']
     */
    function mixin(object, source, options) {
      var props = keys(source),
          methodNames = baseFunctions(source, props);

      if (options == null &&
          !(isObject(source) && (methodNames.length || !props.length))) {
        options = source;
        source = object;
        object = this;
        methodNames = baseFunctions(source, keys(source));
      }
      var chain = !(isObject(options) && 'chain' in options) || !!options.chain,
          isFunc = isFunction(object);

      arrayEach(methodNames, function(methodName) {
        var func = source[methodName];
        object[methodName] = func;
        if (isFunc) {
          object.prototype[methodName] = function() {
            var chainAll = this.__chain__;
            if (chain || chainAll) {
              var result = object(this.__wrapped__),
                  actions = result.__actions__ = copyArray(this.__actions__);

              actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
              result.__chain__ = chainAll;
              return result;
            }
            return func.apply(object, arrayPush([this.value()], arguments));
          };
        }
      });

      return object;
    }

    /**
     * Reverts the `_` variable to its previous value and returns a reference to
     * the `lodash` function.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Util
     * @returns {Function} Returns the `lodash` function.
     * @example
     *
     * var lodash = _.noConflict();
     */
    function noConflict() {
      if (root._ === this) {
        root._ = oldDash;
      }
      return this;
    }

    /**
     * This method returns `undefined`.
     *
     * @static
     * @memberOf _
     * @since 2.3.0
     * @category Util
     * @example
     *
     * _.times(2, _.noop);
     * // => [undefined, undefined]
     */
    function noop() {
      // No operation performed.
    }

    /**
     * Creates a function that gets the argument at index `n`. If `n` is negative,
     * the nth argument from the end is returned.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Util
     * @param {number} [n=0] The index of the argument to return.
     * @returns {Function} Returns the new pass-thru function.
     * @example
     *
     * var func = _.nthArg(1);
     * func('a', 'b', 'c', 'd');
     * // => 'b'
     *
     * var func = _.nthArg(-2);
     * func('a', 'b', 'c', 'd');
     * // => 'c'
     */
    function nthArg(n) {
      n = toInteger(n);
      return baseRest(function(args) {
        return baseNth(args, n);
      });
    }

    /**
     * Creates a function that invokes `iteratees` with the arguments it receives
     * and returns their results.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Util
     * @param {...(Function|Function[])} [iteratees=[_.identity]]
     *  The iteratees to invoke.
     * @returns {Function} Returns the new function.
     * @example
     *
     * var func = _.over([Math.max, Math.min]);
     *
     * func(1, 2, 3, 4);
     * // => [4, 1]
     */
    var over = createOver(arrayMap);

    /**
     * Creates a function that checks if **all** of the `predicates` return
     * truthy when invoked with the arguments it receives.
     *
     * Following shorthands are possible for providing predicates.
     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.
     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Util
     * @param {...(Function|Function[])} [predicates=[_.identity]]
     *  The predicates to check.
     * @returns {Function} Returns the new function.
     * @example
     *
     * var func = _.overEvery([Boolean, isFinite]);
     *
     * func('1');
     * // => true
     *
     * func(null);
     * // => false
     *
     * func(NaN);
     * // => false
     */
    var overEvery = createOver(arrayEvery);

    /**
     * Creates a function that checks if **any** of the `predicates` return
     * truthy when invoked with the arguments it receives.
     *
     * Following shorthands are possible for providing predicates.
     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.
     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Util
     * @param {...(Function|Function[])} [predicates=[_.identity]]
     *  The predicates to check.
     * @returns {Function} Returns the new function.
     * @example
     *
     * var func = _.overSome([Boolean, isFinite]);
     *
     * func('1');
     * // => true
     *
     * func(null);
     * // => true
     *
     * func(NaN);
     * // => false
     *
     * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])
     * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])
     */
    var overSome = createOver(arraySome);

    /**
     * Creates a function that returns the value at `path` of a given object.
     *
     * @static
     * @memberOf _
     * @since 2.4.0
     * @category Util
     * @param {Array|string} path The path of the property to get.
     * @returns {Function} Returns the new accessor function.
     * @example
     *
     * var objects = [
     *   { 'a': { 'b': 2 } },
     *   { 'a': { 'b': 1 } }
     * ];
     *
     * _.map(objects, _.property('a.b'));
     * // => [2, 1]
     *
     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
     * // => [1, 2]
     */
    function property(path) {
      return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
    }

    /**
     * The opposite of `_.property`; this method creates a function that returns
     * the value at a given path of `object`.
     *
     * @static
     * @memberOf _
     * @since 3.0.0
     * @category Util
     * @param {Object} object The object to query.
     * @returns {Function} Returns the new accessor function.
     * @example
     *
     * var array = [0, 1, 2],
     *     object = { 'a': array, 'b': array, 'c': array };
     *
     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));
     * // => [2, 0]
     *
     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));
     * // => [2, 0]
     */
    function propertyOf(object) {
      return function(path) {
        return object == null ? undefined : baseGet(object, path);
      };
    }

    /**
     * Creates an array of numbers (positive and/or negative) progressing from
     * `start` up to, but not including, `end`. A step of `-1` is used if a negative
     * `start` is specified without an `end` or `step`. If `end` is not specified,
     * it's set to `start` with `start` then set to `0`.
     *
     * **Note:** JavaScript follows the IEEE-754 standard for resolving
     * floating-point values which can produce unexpected results.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Util
     * @param {number} [start=0] The start of the range.
     * @param {number} end The end of the range.
     * @param {number} [step=1] The value to increment or decrement by.
     * @returns {Array} Returns the range of numbers.
     * @see _.inRange, _.rangeRight
     * @example
     *
     * _.range(4);
     * // => [0, 1, 2, 3]
     *
     * _.range(-4);
     * // => [0, -1, -2, -3]
     *
     * _.range(1, 5);
     * // => [1, 2, 3, 4]
     *
     * _.range(0, 20, 5);
     * // => [0, 5, 10, 15]
     *
     * _.range(0, -4, -1);
     * // => [0, -1, -2, -3]
     *
     * _.range(1, 4, 0);
     * // => [1, 1, 1]
     *
     * _.range(0);
     * // => []
     */
    var range = createRange();

    /**
     * This method is like `_.range` except that it populates values in
     * descending order.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Util
     * @param {number} [start=0] The start of the range.
     * @param {number} end The end of the range.
     * @param {number} [step=1] The value to increment or decrement by.
     * @returns {Array} Returns the range of numbers.
     * @see _.inRange, _.range
     * @example
     *
     * _.rangeRight(4);
     * // => [3, 2, 1, 0]
     *
     * _.rangeRight(-4);
     * // => [-3, -2, -1, 0]
     *
     * _.rangeRight(1, 5);
     * // => [4, 3, 2, 1]
     *
     * _.rangeRight(0, 20, 5);
     * // => [15, 10, 5, 0]
     *
     * _.rangeRight(0, -4, -1);
     * // => [-3, -2, -1, 0]
     *
     * _.rangeRight(1, 4, 0);
     * // => [1, 1, 1]
     *
     * _.rangeRight(0);
     * // => []
     */
    var rangeRight = createRange(true);

    /**
     * This method returns a new empty array.
     *
     * @static
     * @memberOf _
     * @since 4.13.0
     * @category Util
     * @returns {Array} Returns the new empty array.
     * @example
     *
     * var arrays = _.times(2, _.stubArray);
     *
     * console.log(arrays);
     * // => [[], []]
     *
     * console.log(arrays[0] === arrays[1]);
     * // => false
     */
    function stubArray() {
      return [];
    }

    /**
     * This method returns `false`.
     *
     * @static
     * @memberOf _
     * @since 4.13.0
     * @category Util
     * @returns {boolean} Returns `false`.
     * @example
     *
     * _.times(2, _.stubFalse);
     * // => [false, false]
     */
    function stubFalse() {
      return false;
    }

    /**
     * This method returns a new empty object.
     *
     * @static
     * @memberOf _
     * @since 4.13.0
     * @category Util
     * @returns {Object} Returns the new empty object.
     * @example
     *
     * var objects = _.times(2, _.stubObject);
     *
     * console.log(objects);
     * // => [{}, {}]
     *
     * console.log(objects[0] === objects[1]);
     * // => false
     */
    function stubObject() {
      return {};
    }

    /**
     * This method returns an empty string.
     *
     * @static
     * @memberOf _
     * @since 4.13.0
     * @category Util
     * @returns {string} Returns the empty string.
     * @example
     *
     * _.times(2, _.stubString);
     * // => ['', '']
     */
    function stubString() {
      return '';
    }

    /**
     * This method returns `true`.
     *
     * @static
     * @memberOf _
     * @since 4.13.0
     * @category Util
     * @returns {boolean} Returns `true`.
     * @example
     *
     * _.times(2, _.stubTrue);
     * // => [true, true]
     */
    function stubTrue() {
      return true;
    }

    /**
     * Invokes the iteratee `n` times, returning an array of the results of
     * each invocation. The iteratee is invoked with one argument; (index).
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Util
     * @param {number} n The number of times to invoke `iteratee`.
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
     * @returns {Array} Returns the array of results.
     * @example
     *
     * _.times(3, String);
     * // => ['0', '1', '2']
     *
     *  _.times(4, _.constant(0));
     * // => [0, 0, 0, 0]
     */
    function times(n, iteratee) {
      n = toInteger(n);
      if (n < 1 || n > MAX_SAFE_INTEGER) {
        return [];
      }
      var index = MAX_ARRAY_LENGTH,
          length = nativeMin(n, MAX_ARRAY_LENGTH);

      iteratee = getIteratee(iteratee);
      n -= MAX_ARRAY_LENGTH;

      var result = baseTimes(length, iteratee);
      while (++index < n) {
        iteratee(index);
      }
      return result;
    }

    /**
     * Converts `value` to a property path array.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Util
     * @param {*} value The value to convert.
     * @returns {Array} Returns the new property path array.
     * @example
     *
     * _.toPath('a.b.c');
     * // => ['a', 'b', 'c']
     *
     * _.toPath('a[0].b.c');
     * // => ['a', '0', 'b', 'c']
     */
    function toPath(value) {
      if (isArray(value)) {
        return arrayMap(value, toKey);
      }
      return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));
    }

    /**
     * Generates a unique ID. If `prefix` is given, the ID is appended to it.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Util
     * @param {string} [prefix=''] The value to prefix the ID with.
     * @returns {string} Returns the unique ID.
     * @example
     *
     * _.uniqueId('contact_');
     * // => 'contact_104'
     *
     * _.uniqueId();
     * // => '105'
     */
    function uniqueId(prefix) {
      var id = ++idCounter;
      return toString(prefix) + id;
    }

    /*------------------------------------------------------------------------*/

    /**
     * Adds two numbers.
     *
     * @static
     * @memberOf _
     * @since 3.4.0
     * @category Math
     * @param {number} augend The first number in an addition.
     * @param {number} addend The second number in an addition.
     * @returns {number} Returns the total.
     * @example
     *
     * _.add(6, 4);
     * // => 10
     */
    var add = createMathOperation(function(augend, addend) {
      return augend + addend;
    }, 0);

    /**
     * Computes `number` rounded up to `precision`.
     *
     * @static
     * @memberOf _
     * @since 3.10.0
     * @category Math
     * @param {number} number The number to round up.
     * @param {number} [precision=0] The precision to round up to.
     * @returns {number} Returns the rounded up number.
     * @example
     *
     * _.ceil(4.006);
     * // => 5
     *
     * _.ceil(6.004, 2);
     * // => 6.01
     *
     * _.ceil(6040, -2);
     * // => 6100
     */
    var ceil = createRound('ceil');

    /**
     * Divide two numbers.
     *
     * @static
     * @memberOf _
     * @since 4.7.0
     * @category Math
     * @param {number} dividend The first number in a division.
     * @param {number} divisor The second number in a division.
     * @returns {number} Returns the quotient.
     * @example
     *
     * _.divide(6, 4);
     * // => 1.5
     */
    var divide = createMathOperation(function(dividend, divisor) {
      return dividend / divisor;
    }, 1);

    /**
     * Computes `number` rounded down to `precision`.
     *
     * @static
     * @memberOf _
     * @since 3.10.0
     * @category Math
     * @param {number} number The number to round down.
     * @param {number} [precision=0] The precision to round down to.
     * @returns {number} Returns the rounded down number.
     * @example
     *
     * _.floor(4.006);
     * // => 4
     *
     * _.floor(0.046, 2);
     * // => 0.04
     *
     * _.floor(4060, -2);
     * // => 4000
     */
    var floor = createRound('floor');

    /**
     * Computes the maximum value of `array`. If `array` is empty or falsey,
     * `undefined` is returned.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Math
     * @param {Array} array The array to iterate over.
     * @returns {*} Returns the maximum value.
     * @example
     *
     * _.max([4, 2, 8, 6]);
     * // => 8
     *
     * _.max([]);
     * // => undefined
     */
    function max(array) {
      return (array && array.length)
        ? baseExtremum(array, identity, baseGt)
        : undefined;
    }

    /**
     * This method is like `_.max` except that it accepts `iteratee` which is
     * invoked for each element in `array` to generate the criterion by which
     * the value is ranked. The iteratee is invoked with one argument: (value).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Math
     * @param {Array} array The array to iterate over.
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
     * @returns {*} Returns the maximum value.
     * @example
     *
     * var objects = [{ 'n': 1 }, { 'n': 2 }];
     *
     * _.maxBy(objects, function(o) { return o.n; });
     * // => { 'n': 2 }
     *
     * // The `_.property` iteratee shorthand.
     * _.maxBy(objects, 'n');
     * // => { 'n': 2 }
     */
    function maxBy(array, iteratee) {
      return (array && array.length)
        ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)
        : undefined;
    }

    /**
     * Computes the mean of the values in `array`.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Math
     * @param {Array} array The array to iterate over.
     * @returns {number} Returns the mean.
     * @example
     *
     * _.mean([4, 2, 8, 6]);
     * // => 5
     */
    function mean(array) {
      return baseMean(array, identity);
    }

    /**
     * This method is like `_.mean` except that it accepts `iteratee` which is
     * invoked for each element in `array` to generate the value to be averaged.
     * The iteratee is invoked with one argument: (value).
     *
     * @static
     * @memberOf _
     * @since 4.7.0
     * @category Math
     * @param {Array} array The array to iterate over.
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
     * @returns {number} Returns the mean.
     * @example
     *
     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
     *
     * _.meanBy(objects, function(o) { return o.n; });
     * // => 5
     *
     * // The `_.property` iteratee shorthand.
     * _.meanBy(objects, 'n');
     * // => 5
     */
    function meanBy(array, iteratee) {
      return baseMean(array, getIteratee(iteratee, 2));
    }

    /**
     * Computes the minimum value of `array`. If `array` is empty or falsey,
     * `undefined` is returned.
     *
     * @static
     * @since 0.1.0
     * @memberOf _
     * @category Math
     * @param {Array} array The array to iterate over.
     * @returns {*} Returns the minimum value.
     * @example
     *
     * _.min([4, 2, 8, 6]);
     * // => 2
     *
     * _.min([]);
     * // => undefined
     */
    function min(array) {
      return (array && array.length)
        ? baseExtremum(array, identity, baseLt)
        : undefined;
    }

    /**
     * This method is like `_.min` except that it accepts `iteratee` which is
     * invoked for each element in `array` to generate the criterion by which
     * the value is ranked. The iteratee is invoked with one argument: (value).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Math
     * @param {Array} array The array to iterate over.
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
     * @returns {*} Returns the minimum value.
     * @example
     *
     * var objects = [{ 'n': 1 }, { 'n': 2 }];
     *
     * _.minBy(objects, function(o) { return o.n; });
     * // => { 'n': 1 }
     *
     * // The `_.property` iteratee shorthand.
     * _.minBy(objects, 'n');
     * // => { 'n': 1 }
     */
    function minBy(array, iteratee) {
      return (array && array.length)
        ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)
        : undefined;
    }

    /**
     * Multiply two numbers.
     *
     * @static
     * @memberOf _
     * @since 4.7.0
     * @category Math
     * @param {number} multiplier The first number in a multiplication.
     * @param {number} multiplicand The second number in a multiplication.
     * @returns {number} Returns the product.
     * @example
     *
     * _.multiply(6, 4);
     * // => 24
     */
    var multiply = createMathOperation(function(multiplier, multiplicand) {
      return multiplier * multiplicand;
    }, 1);

    /**
     * Computes `number` rounded to `precision`.
     *
     * @static
     * @memberOf _
     * @since 3.10.0
     * @category Math
     * @param {number} number The number to round.
     * @param {number} [precision=0] The precision to round to.
     * @returns {number} Returns the rounded number.
     * @example
     *
     * _.round(4.006);
     * // => 4
     *
     * _.round(4.006, 2);
     * // => 4.01
     *
     * _.round(4060, -2);
     * // => 4100
     */
    var round = createRound('round');

    /**
     * Subtract two numbers.
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Math
     * @param {number} minuend The first number in a subtraction.
     * @param {number} subtrahend The second number in a subtraction.
     * @returns {number} Returns the difference.
     * @example
     *
     * _.subtract(6, 4);
     * // => 2
     */
    var subtract = createMathOperation(function(minuend, subtrahend) {
      return minuend - subtrahend;
    }, 0);

    /**
     * Computes the sum of the values in `array`.
     *
     * @static
     * @memberOf _
     * @since 3.4.0
     * @category Math
     * @param {Array} array The array to iterate over.
     * @returns {number} Returns the sum.
     * @example
     *
     * _.sum([4, 2, 8, 6]);
     * // => 20
     */
    function sum(array) {
      return (array && array.length)
        ? baseSum(array, identity)
        : 0;
    }

    /**
     * This method is like `_.sum` except that it accepts `iteratee` which is
     * invoked for each element in `array` to generate the value to be summed.
     * The iteratee is invoked with one argument: (value).
     *
     * @static
     * @memberOf _
     * @since 4.0.0
     * @category Math
     * @param {Array} array The array to iterate over.
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
     * @returns {number} Returns the sum.
     * @example
     *
     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
     *
     * _.sumBy(objects, function(o) { return o.n; });
     * // => 20
     *
     * // The `_.property` iteratee shorthand.
     * _.sumBy(objects, 'n');
     * // => 20
     */
    function sumBy(array, iteratee) {
      return (array && array.length)
        ? baseSum(array, getIteratee(iteratee, 2))
        : 0;
    }

    /*------------------------------------------------------------------------*/

    // Add methods that return wrapped values in chain sequences.
    lodash.after = after;
    lodash.ary = ary;
    lodash.assign = assign;
    lodash.assignIn = assignIn;
    lodash.assignInWith = assignInWith;
    lodash.assignWith = assignWith;
    lodash.at = at;
    lodash.before = before;
    lodash.bind = bind;
    lodash.bindAll = bindAll;
    lodash.bindKey = bindKey;
    lodash.castArray = castArray;
    lodash.chain = chain;
    lodash.chunk = chunk;
    lodash.compact = compact;
    lodash.concat = concat;
    lodash.cond = cond;
    lodash.conforms = conforms;
    lodash.constant = constant;
    lodash.countBy = countBy;
    lodash.create = create;
    lodash.curry = curry;
    lodash.curryRight = curryRight;
    lodash.debounce = debounce;
    lodash.defaults = defaults;
    lodash.defaultsDeep = defaultsDeep;
    lodash.defer = defer;
    lodash.delay = delay;
    lodash.difference = difference;
    lodash.differenceBy = differenceBy;
    lodash.differenceWith = differenceWith;
    lodash.drop = drop;
    lodash.dropRight = dropRight;
    lodash.dropRightWhile = dropRightWhile;
    lodash.dropWhile = dropWhile;
    lodash.fill = fill;
    lodash.filter = filter;
    lodash.flatMap = flatMap;
    lodash.flatMapDeep = flatMapDeep;
    lodash.flatMapDepth = flatMapDepth;
    lodash.flatten = flatten;
    lodash.flattenDeep = flattenDeep;
    lodash.flattenDepth = flattenDepth;
    lodash.flip = flip;
    lodash.flow = flow;
    lodash.flowRight = flowRight;
    lodash.fromPairs = fromPairs;
    lodash.functions = functions;
    lodash.functionsIn = functionsIn;
    lodash.groupBy = groupBy;
    lodash.initial = initial;
    lodash.intersection = intersection;
    lodash.intersectionBy = intersectionBy;
    lodash.intersectionWith = intersectionWith;
    lodash.invert = invert;
    lodash.invertBy = invertBy;
    lodash.invokeMap = invokeMap;
    lodash.iteratee = iteratee;
    lodash.keyBy = keyBy;
    lodash.keys = keys;
    lodash.keysIn = keysIn;
    lodash.map = map;
    lodash.mapKeys = mapKeys;
    lodash.mapValues = mapValues;
    lodash.matches = matches;
    lodash.matchesProperty = matchesProperty;
    lodash.memoize = memoize;
    lodash.merge = merge;
    lodash.mergeWith = mergeWith;
    lodash.method = method;
    lodash.methodOf = methodOf;
    lodash.mixin = mixin;
    lodash.negate = negate;
    lodash.nthArg = nthArg;
    lodash.omit = omit;
    lodash.omitBy = omitBy;
    lodash.once = once;
    lodash.orderBy = orderBy;
    lodash.over = over;
    lodash.overArgs = overArgs;
    lodash.overEvery = overEvery;
    lodash.overSome = overSome;
    lodash.partial = partial;
    lodash.partialRight = partialRight;
    lodash.partition = partition;
    lodash.pick = pick;
    lodash.pickBy = pickBy;
    lodash.property = property;
    lodash.propertyOf = propertyOf;
    lodash.pull = pull;
    lodash.pullAll = pullAll;
    lodash.pullAllBy = pullAllBy;
    lodash.pullAllWith = pullAllWith;
    lodash.pullAt = pullAt;
    lodash.range = range;
    lodash.rangeRight = rangeRight;
    lodash.rearg = rearg;
    lodash.reject = reject;
    lodash.remove = remove;
    lodash.rest = rest;
    lodash.reverse = reverse;
    lodash.sampleSize = sampleSize;
    lodash.set = set;
    lodash.setWith = setWith;
    lodash.shuffle = shuffle;
    lodash.slice = slice;
    lodash.sortBy = sortBy;
    lodash.sortedUniq = sortedUniq;
    lodash.sortedUniqBy = sortedUniqBy;
    lodash.split = split;
    lodash.spread = spread;
    lodash.tail = tail;
    lodash.take = take;
    lodash.takeRight = takeRight;
    lodash.takeRightWhile = takeRightWhile;
    lodash.takeWhile = takeWhile;
    lodash.tap = tap;
    lodash.throttle = throttle;
    lodash.thru = thru;
    lodash.toArray = toArray;
    lodash.toPairs = toPairs;
    lodash.toPairsIn = toPairsIn;
    lodash.toPath = toPath;
    lodash.toPlainObject = toPlainObject;
    lodash.transform = transform;
    lodash.unary = unary;
    lodash.union = union;
    lodash.unionBy = unionBy;
    lodash.unionWith = unionWith;
    lodash.uniq = uniq;
    lodash.uniqBy = uniqBy;
    lodash.uniqWith = uniqWith;
    lodash.unset = unset;
    lodash.unzip = unzip;
    lodash.unzipWith = unzipWith;
    lodash.update = update;
    lodash.updateWith = updateWith;
    lodash.values = values;
    lodash.valuesIn = valuesIn;
    lodash.without = without;
    lodash.words = words;
    lodash.wrap = wrap;
    lodash.xor = xor;
    lodash.xorBy = xorBy;
    lodash.xorWith = xorWith;
    lodash.zip = zip;
    lodash.zipObject = zipObject;
    lodash.zipObjectDeep = zipObjectDeep;
    lodash.zipWith = zipWith;

    // Add aliases.
    lodash.entries = toPairs;
    lodash.entriesIn = toPairsIn;
    lodash.extend = assignIn;
    lodash.extendWith = assignInWith;

    // Add methods to `lodash.prototype`.
    mixin(lodash, lodash);

    /*------------------------------------------------------------------------*/

    // Add methods that return unwrapped values in chain sequences.
    lodash.add = add;
    lodash.attempt = attempt;
    lodash.camelCase = camelCase;
    lodash.capitalize = capitalize;
    lodash.ceil = ceil;
    lodash.clamp = clamp;
    lodash.clone = clone;
    lodash.cloneDeep = cloneDeep;
    lodash.cloneDeepWith = cloneDeepWith;
    lodash.cloneWith = cloneWith;
    lodash.conformsTo = conformsTo;
    lodash.deburr = deburr;
    lodash.defaultTo = defaultTo;
    lodash.divide = divide;
    lodash.endsWith = endsWith;
    lodash.eq = eq;
    lodash.escape = escape;
    lodash.escapeRegExp = escapeRegExp;
    lodash.every = every;
    lodash.find = find;
    lodash.findIndex = findIndex;
    lodash.findKey = findKey;
    lodash.findLast = findLast;
    lodash.findLastIndex = findLastIndex;
    lodash.findLastKey = findLastKey;
    lodash.floor = floor;
    lodash.forEach = forEach;
    lodash.forEachRight = forEachRight;
    lodash.forIn = forIn;
    lodash.forInRight = forInRight;
    lodash.forOwn = forOwn;
    lodash.forOwnRight = forOwnRight;
    lodash.get = get;
    lodash.gt = gt;
    lodash.gte = gte;
    lodash.has = has;
    lodash.hasIn = hasIn;
    lodash.head = head;
    lodash.identity = identity;
    lodash.includes = includes;
    lodash.indexOf = indexOf;
    lodash.inRange = inRange;
    lodash.invoke = invoke;
    lodash.isArguments = isArguments;
    lodash.isArray = isArray;
    lodash.isArrayBuffer = isArrayBuffer;
    lodash.isArrayLike = isArrayLike;
    lodash.isArrayLikeObject = isArrayLikeObject;
    lodash.isBoolean = isBoolean;
    lodash.isBuffer = isBuffer;
    lodash.isDate = isDate;
    lodash.isElement = isElement;
    lodash.isEmpty = isEmpty;
    lodash.isEqual = isEqual;
    lodash.isEqualWith = isEqualWith;
    lodash.isError = isError;
    lodash.isFinite = isFinite;
    lodash.isFunction = isFunction;
    lodash.isInteger = isInteger;
    lodash.isLength = isLength;
    lodash.isMap = isMap;
    lodash.isMatch = isMatch;
    lodash.isMatchWith = isMatchWith;
    lodash.isNaN = isNaN;
    lodash.isNative = isNative;
    lodash.isNil = isNil;
    lodash.isNull = isNull;
    lodash.isNumber = isNumber;
    lodash.isObject = isObject;
    lodash.isObjectLike = isObjectLike;
    lodash.isPlainObject = isPlainObject;
    lodash.isRegExp = isRegExp;
    lodash.isSafeInteger = isSafeInteger;
    lodash.isSet = isSet;
    lodash.isString = isString;
    lodash.isSymbol = isSymbol;
    lodash.isTypedArray = isTypedArray;
    lodash.isUndefined = isUndefined;
    lodash.isWeakMap = isWeakMap;
    lodash.isWeakSet = isWeakSet;
    lodash.join = join;
    lodash.kebabCase = kebabCase;
    lodash.last = last;
    lodash.lastIndexOf = lastIndexOf;
    lodash.lowerCase = lowerCase;
    lodash.lowerFirst = lowerFirst;
    lodash.lt = lt;
    lodash.lte = lte;
    lodash.max = max;
    lodash.maxBy = maxBy;
    lodash.mean = mean;
    lodash.meanBy = meanBy;
    lodash.min = min;
    lodash.minBy = minBy;
    lodash.stubArray = stubArray;
    lodash.stubFalse = stubFalse;
    lodash.stubObject = stubObject;
    lodash.stubString = stubString;
    lodash.stubTrue = stubTrue;
    lodash.multiply = multiply;
    lodash.nth = nth;
    lodash.noConflict = noConflict;
    lodash.noop = noop;
    lodash.now = now;
    lodash.pad = pad;
    lodash.padEnd = padEnd;
    lodash.padStart = padStart;
    lodash.parseInt = parseInt;
    lodash.random = random;
    lodash.reduce = reduce;
    lodash.reduceRight = reduceRight;
    lodash.repeat = repeat;
    lodash.replace = replace;
    lodash.result = result;
    lodash.round = round;
    lodash.runInContext = runInContext;
    lodash.sample = sample;
    lodash.size = size;
    lodash.snakeCase = snakeCase;
    lodash.some = some;
    lodash.sortedIndex = sortedIndex;
    lodash.sortedIndexBy = sortedIndexBy;
    lodash.sortedIndexOf = sortedIndexOf;
    lodash.sortedLastIndex = sortedLastIndex;
    lodash.sortedLastIndexBy = sortedLastIndexBy;
    lodash.sortedLastIndexOf = sortedLastIndexOf;
    lodash.startCase = startCase;
    lodash.startsWith = startsWith;
    lodash.subtract = subtract;
    lodash.sum = sum;
    lodash.sumBy = sumBy;
    lodash.template = template;
    lodash.times = times;
    lodash.toFinite = toFinite;
    lodash.toInteger = toInteger;
    lodash.toLength = toLength;
    lodash.toLower = toLower;
    lodash.toNumber = toNumber;
    lodash.toSafeInteger = toSafeInteger;
    lodash.toString = toString;
    lodash.toUpper = toUpper;
    lodash.trim = trim;
    lodash.trimEnd = trimEnd;
    lodash.trimStart = trimStart;
    lodash.truncate = truncate;
    lodash.unescape = unescape;
    lodash.uniqueId = uniqueId;
    lodash.upperCase = upperCase;
    lodash.upperFirst = upperFirst;

    // Add aliases.
    lodash.each = forEach;
    lodash.eachRight = forEachRight;
    lodash.first = head;

    mixin(lodash, (function() {
      var source = {};
      baseForOwn(lodash, function(func, methodName) {
        if (!hasOwnProperty.call(lodash.prototype, methodName)) {
          source[methodName] = func;
        }
      });
      return source;
    }()), { 'chain': false });

    /*------------------------------------------------------------------------*/

    /**
     * The semantic version number.
     *
     * @static
     * @memberOf _
     * @type {string}
     */
    lodash.VERSION = VERSION;

    // Assign default placeholders.
    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {
      lodash[methodName].placeholder = lodash;
    });

    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.
    arrayEach(['drop', 'take'], function(methodName, index) {
      LazyWrapper.prototype[methodName] = function(n) {
        n = n === undefined ? 1 : nativeMax(toInteger(n), 0);

        var result = (this.__filtered__ && !index)
          ? new LazyWrapper(this)
          : this.clone();

        if (result.__filtered__) {
          result.__takeCount__ = nativeMin(n, result.__takeCount__);
        } else {
          result.__views__.push({
            'size': nativeMin(n, MAX_ARRAY_LENGTH),
            'type': methodName + (result.__dir__ < 0 ? 'Right' : '')
          });
        }
        return result;
      };

      LazyWrapper.prototype[methodName + 'Right'] = function(n) {
        return this.reverse()[methodName](n).reverse();
      };
    });

    // Add `LazyWrapper` methods that accept an `iteratee` value.
    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {
      var type = index + 1,
          isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;

      LazyWrapper.prototype[methodName] = function(iteratee) {
        var result = this.clone();
        result.__iteratees__.push({
          'iteratee': getIteratee(iteratee, 3),
          'type': type
        });
        result.__filtered__ = result.__filtered__ || isFilter;
        return result;
      };
    });

    // Add `LazyWrapper` methods for `_.head` and `_.last`.
    arrayEach(['head', 'last'], function(methodName, index) {
      var takeName = 'take' + (index ? 'Right' : '');

      LazyWrapper.prototype[methodName] = function() {
        return this[takeName](1).value()[0];
      };
    });

    // Add `LazyWrapper` methods for `_.initial` and `_.tail`.
    arrayEach(['initial', 'tail'], function(methodName, index) {
      var dropName = 'drop' + (index ? '' : 'Right');

      LazyWrapper.prototype[methodName] = function() {
        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);
      };
    });

    LazyWrapper.prototype.compact = function() {
      return this.filter(identity);
    };

    LazyWrapper.prototype.find = function(predicate) {
      return this.filter(predicate).head();
    };

    LazyWrapper.prototype.findLast = function(predicate) {
      return this.reverse().find(predicate);
    };

    LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {
      if (typeof path == 'function') {
        return new LazyWrapper(this);
      }
      return this.map(function(value) {
        return baseInvoke(value, path, args);
      });
    });

    LazyWrapper.prototype.reject = function(predicate) {
      return this.filter(negate(getIteratee(predicate)));
    };

    LazyWrapper.prototype.slice = function(start, end) {
      start = toInteger(start);

      var result = this;
      if (result.__filtered__ && (start > 0 || end < 0)) {
        return new LazyWrapper(result);
      }
      if (start < 0) {
        result = result.takeRight(-start);
      } else if (start) {
        result = result.drop(start);
      }
      if (end !== undefined) {
        end = toInteger(end);
        result = end < 0 ? result.dropRight(-end) : result.take(end - start);
      }
      return result;
    };

    LazyWrapper.prototype.takeRightWhile = function(predicate) {
      return this.reverse().takeWhile(predicate).reverse();
    };

    LazyWrapper.prototype.toArray = function() {
      return this.take(MAX_ARRAY_LENGTH);
    };

    // Add `LazyWrapper` methods to `lodash.prototype`.
    baseForOwn(LazyWrapper.prototype, function(func, methodName) {
      var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),
          isTaker = /^(?:head|last)$/.test(methodName),
          lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],
          retUnwrapped = isTaker || /^find/.test(methodName);

      if (!lodashFunc) {
        return;
      }
      lodash.prototype[methodName] = function() {
        var value = this.__wrapped__,
            args = isTaker ? [1] : arguments,
            isLazy = value instanceof LazyWrapper,
            iteratee = args[0],
            useLazy = isLazy || isArray(value);

        var interceptor = function(value) {
          var result = lodashFunc.apply(lodash, arrayPush([value], args));
          return (isTaker && chainAll) ? result[0] : result;
        };

        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {
          // Avoid lazy use if the iteratee has a "length" value other than `1`.
          isLazy = useLazy = false;
        }
        var chainAll = this.__chain__,
            isHybrid = !!this.__actions__.length,
            isUnwrapped = retUnwrapped && !chainAll,
            onlyLazy = isLazy && !isHybrid;

        if (!retUnwrapped && useLazy) {
          value = onlyLazy ? value : new LazyWrapper(this);
          var result = func.apply(value, args);
          result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });
          return new LodashWrapper(result, chainAll);
        }
        if (isUnwrapped && onlyLazy) {
          return func.apply(this, args);
        }
        result = this.thru(interceptor);
        return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;
      };
    });

    // Add `Array` methods to `lodash.prototype`.
    arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {
      var func = arrayProto[methodName],
          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',
          retUnwrapped = /^(?:pop|shift)$/.test(methodName);

      lodash.prototype[methodName] = function() {
        var args = arguments;
        if (retUnwrapped && !this.__chain__) {
          var value = this.value();
          return func.apply(isArray(value) ? value : [], args);
        }
        return this[chainName](function(value) {
          return func.apply(isArray(value) ? value : [], args);
        });
      };
    });

    // Map minified method names to their real names.
    baseForOwn(LazyWrapper.prototype, function(func, methodName) {
      var lodashFunc = lodash[methodName];
      if (lodashFunc) {
        var key = lodashFunc.name + '';
        if (!hasOwnProperty.call(realNames, key)) {
          realNames[key] = [];
        }
        realNames[key].push({ 'name': methodName, 'func': lodashFunc });
      }
    });

    realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{
      'name': 'wrapper',
      'func': undefined
    }];

    // Add methods to `LazyWrapper`.
    LazyWrapper.prototype.clone = lazyClone;
    LazyWrapper.prototype.reverse = lazyReverse;
    LazyWrapper.prototype.value = lazyValue;

    // Add chain sequence methods to the `lodash` wrapper.
    lodash.prototype.at = wrapperAt;
    lodash.prototype.chain = wrapperChain;
    lodash.prototype.commit = wrapperCommit;
    lodash.prototype.next = wrapperNext;
    lodash.prototype.plant = wrapperPlant;
    lodash.prototype.reverse = wrapperReverse;
    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;

    // Add lazy aliases.
    lodash.prototype.first = lodash.prototype.head;

    if (symIterator) {
      lodash.prototype[symIterator] = wrapperToIterator;
    }
    return lodash;
  });

  /*--------------------------------------------------------------------------*/

  // Export lodash.
  var _ = runInContext();

  // Some AMD build optimizers, like r.js, check for condition patterns like:
  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
    // Expose Lodash on the global object to prevent errors when Lodash is
    // loaded by a script tag in the presence of an AMD loader.
    // See http://requirejs.org/docs/errors.html#mismatch for more details.
    // Use `_.noConflict` to remove Lodash from the global object.
    root._ = _;

    // Define as an anonymous module so, through path mapping, it can be
    // referenced as the "underscore" module.
    define(function() {
      return _;
    });
  }
  // Check for `exports` after `define` in case a build optimizer adds it.
  else if (freeModule) {
    // Export for Node.js.
    (freeModule.exports = _)._ = _;
    // Export for CommonJS support.
    freeExports._ = _;
  }
  else {
    // Export to the global object.
    root._ = _;
  }
}.call(this));
/**
 * @license
 * Lodash <https://lodash.com/>
 * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
 * Released under MIT license <https://lodash.com/license>
 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
 */
(function(){function n(n,t,r){switch(r.length){case 0:return n.call(t);case 1:return n.call(t,r[0]);case 2:return n.call(t,r[0],r[1]);case 3:return n.call(t,r[0],r[1],r[2])}return n.apply(t,r)}function t(n,t,r,e){for(var u=-1,i=null==n?0:n.length;++u<i;){var o=n[u];t(e,o,r(o),n)}return e}function r(n,t){for(var r=-1,e=null==n?0:n.length;++r<e&&t(n[r],r,n)!==!1;);return n}function e(n,t){for(var r=null==n?0:n.length;r--&&t(n[r],r,n)!==!1;);return n}function u(n,t){for(var r=-1,e=null==n?0:n.length;++r<e;)if(!t(n[r],r,n))return!1;
return!0}function i(n,t){for(var r=-1,e=null==n?0:n.length,u=0,i=[];++r<e;){var o=n[r];t(o,r,n)&&(i[u++]=o)}return i}function o(n,t){return!!(null==n?0:n.length)&&y(n,t,0)>-1}function f(n,t,r){for(var e=-1,u=null==n?0:n.length;++e<u;)if(r(t,n[e]))return!0;return!1}function c(n,t){for(var r=-1,e=null==n?0:n.length,u=Array(e);++r<e;)u[r]=t(n[r],r,n);return u}function a(n,t){for(var r=-1,e=t.length,u=n.length;++r<e;)n[u+r]=t[r];return n}function l(n,t,r,e){var u=-1,i=null==n?0:n.length;for(e&&i&&(r=n[++u]);++u<i;)r=t(r,n[u],u,n);
return r}function s(n,t,r,e){var u=null==n?0:n.length;for(e&&u&&(r=n[--u]);u--;)r=t(r,n[u],u,n);return r}function h(n,t){for(var r=-1,e=null==n?0:n.length;++r<e;)if(t(n[r],r,n))return!0;return!1}function p(n){return n.split("")}function _(n){return n.match($t)||[]}function v(n,t,r){var e;return r(n,function(n,r,u){if(t(n,r,u))return e=r,!1}),e}function g(n,t,r,e){for(var u=n.length,i=r+(e?1:-1);e?i--:++i<u;)if(t(n[i],i,n))return i;return-1}function y(n,t,r){return t===t?Z(n,t,r):g(n,b,r)}function d(n,t,r,e){
for(var u=r-1,i=n.length;++u<i;)if(e(n[u],t))return u;return-1}function b(n){return n!==n}function w(n,t){var r=null==n?0:n.length;return r?k(n,t)/r:Cn}function m(n){return function(t){return null==t?X:t[n]}}function x(n){return function(t){return null==n?X:n[t]}}function j(n,t,r,e,u){return u(n,function(n,u,i){r=e?(e=!1,n):t(r,n,u,i)}),r}function A(n,t){var r=n.length;for(n.sort(t);r--;)n[r]=n[r].value;return n}function k(n,t){for(var r,e=-1,u=n.length;++e<u;){var i=t(n[e]);i!==X&&(r=r===X?i:r+i);
}return r}function O(n,t){for(var r=-1,e=Array(n);++r<n;)e[r]=t(r);return e}function I(n,t){return c(t,function(t){return[t,n[t]]})}function R(n){return n?n.slice(0,H(n)+1).replace(Lt,""):n}function z(n){return function(t){return n(t)}}function E(n,t){return c(t,function(t){return n[t]})}function S(n,t){return n.has(t)}function W(n,t){for(var r=-1,e=n.length;++r<e&&y(t,n[r],0)>-1;);return r}function L(n,t){for(var r=n.length;r--&&y(t,n[r],0)>-1;);return r}function C(n,t){for(var r=n.length,e=0;r--;)n[r]===t&&++e;
return e}function U(n){return"\\"+Yr[n]}function B(n,t){return null==n?X:n[t]}function T(n){return Nr.test(n)}function $(n){return Pr.test(n)}function D(n){for(var t,r=[];!(t=n.next()).done;)r.push(t.value);return r}function M(n){var t=-1,r=Array(n.size);return n.forEach(function(n,e){r[++t]=[e,n]}),r}function F(n,t){return function(r){return n(t(r))}}function N(n,t){for(var r=-1,e=n.length,u=0,i=[];++r<e;){var o=n[r];o!==t&&o!==cn||(n[r]=cn,i[u++]=r)}return i}function P(n){var t=-1,r=Array(n.size);
return n.forEach(function(n){r[++t]=n}),r}function q(n){var t=-1,r=Array(n.size);return n.forEach(function(n){r[++t]=[n,n]}),r}function Z(n,t,r){for(var e=r-1,u=n.length;++e<u;)if(n[e]===t)return e;return-1}function K(n,t,r){for(var e=r+1;e--;)if(n[e]===t)return e;return e}function V(n){return T(n)?J(n):_e(n)}function G(n){return T(n)?Y(n):p(n)}function H(n){for(var t=n.length;t--&&Ct.test(n.charAt(t)););return t}function J(n){for(var t=Mr.lastIndex=0;Mr.test(n);)++t;return t}function Y(n){return n.match(Mr)||[];
}function Q(n){return n.match(Fr)||[]}var X,nn="4.17.21",tn=200,rn="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",en="Expected a function",un="Invalid `variable` option passed into `_.template`",on="__lodash_hash_undefined__",fn=500,cn="__lodash_placeholder__",an=1,ln=2,sn=4,hn=1,pn=2,_n=1,vn=2,gn=4,yn=8,dn=16,bn=32,wn=64,mn=128,xn=256,jn=512,An=30,kn="...",On=800,In=16,Rn=1,zn=2,En=3,Sn=1/0,Wn=9007199254740991,Ln=1.7976931348623157e308,Cn=NaN,Un=4294967295,Bn=Un-1,Tn=Un>>>1,$n=[["ary",mn],["bind",_n],["bindKey",vn],["curry",yn],["curryRight",dn],["flip",jn],["partial",bn],["partialRight",wn],["rearg",xn]],Dn="[object Arguments]",Mn="[object Array]",Fn="[object AsyncFunction]",Nn="[object Boolean]",Pn="[object Date]",qn="[object DOMException]",Zn="[object Error]",Kn="[object Function]",Vn="[object GeneratorFunction]",Gn="[object Map]",Hn="[object Number]",Jn="[object Null]",Yn="[object Object]",Qn="[object Promise]",Xn="[object Proxy]",nt="[object RegExp]",tt="[object Set]",rt="[object String]",et="[object Symbol]",ut="[object Undefined]",it="[object WeakMap]",ot="[object WeakSet]",ft="[object ArrayBuffer]",ct="[object DataView]",at="[object Float32Array]",lt="[object Float64Array]",st="[object Int8Array]",ht="[object Int16Array]",pt="[object Int32Array]",_t="[object Uint8Array]",vt="[object Uint8ClampedArray]",gt="[object Uint16Array]",yt="[object Uint32Array]",dt=/\b__p \+= '';/g,bt=/\b(__p \+=) '' \+/g,wt=/(__e\(.*?\)|\b__t\)) \+\n'';/g,mt=/&(?:amp|lt|gt|quot|#39);/g,xt=/[&<>"']/g,jt=RegExp(mt.source),At=RegExp(xt.source),kt=/<%-([\s\S]+?)%>/g,Ot=/<%([\s\S]+?)%>/g,It=/<%=([\s\S]+?)%>/g,Rt=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,zt=/^\w*$/,Et=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,St=/[\\^$.*+?()[\]{}|]/g,Wt=RegExp(St.source),Lt=/^\s+/,Ct=/\s/,Ut=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Bt=/\{\n\/\* \[wrapped with (.+)\] \*/,Tt=/,? & /,$t=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Dt=/[()=,{}\[\]\/\s]/,Mt=/\\(\\)?/g,Ft=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,Nt=/\w*$/,Pt=/^[-+]0x[0-9a-f]+$/i,qt=/^0b[01]+$/i,Zt=/^\[object .+?Constructor\]$/,Kt=/^0o[0-7]+$/i,Vt=/^(?:0|[1-9]\d*)$/,Gt=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Ht=/($^)/,Jt=/['\n\r\u2028\u2029\\]/g,Yt="\\ud800-\\udfff",Qt="\\u0300-\\u036f",Xt="\\ufe20-\\ufe2f",nr="\\u20d0-\\u20ff",tr=Qt+Xt+nr,rr="\\u2700-\\u27bf",er="a-z\\xdf-\\xf6\\xf8-\\xff",ur="\\xac\\xb1\\xd7\\xf7",ir="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",or="\\u2000-\\u206f",fr=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",cr="A-Z\\xc0-\\xd6\\xd8-\\xde",ar="\\ufe0e\\ufe0f",lr=ur+ir+or+fr,sr="['\u2019]",hr="["+Yt+"]",pr="["+lr+"]",_r="["+tr+"]",vr="\\d+",gr="["+rr+"]",yr="["+er+"]",dr="[^"+Yt+lr+vr+rr+er+cr+"]",br="\\ud83c[\\udffb-\\udfff]",wr="(?:"+_r+"|"+br+")",mr="[^"+Yt+"]",xr="(?:\\ud83c[\\udde6-\\uddff]){2}",jr="[\\ud800-\\udbff][\\udc00-\\udfff]",Ar="["+cr+"]",kr="\\u200d",Or="(?:"+yr+"|"+dr+")",Ir="(?:"+Ar+"|"+dr+")",Rr="(?:"+sr+"(?:d|ll|m|re|s|t|ve))?",zr="(?:"+sr+"(?:D|LL|M|RE|S|T|VE))?",Er=wr+"?",Sr="["+ar+"]?",Wr="(?:"+kr+"(?:"+[mr,xr,jr].join("|")+")"+Sr+Er+")*",Lr="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",Cr="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",Ur=Sr+Er+Wr,Br="(?:"+[gr,xr,jr].join("|")+")"+Ur,Tr="(?:"+[mr+_r+"?",_r,xr,jr,hr].join("|")+")",$r=RegExp(sr,"g"),Dr=RegExp(_r,"g"),Mr=RegExp(br+"(?="+br+")|"+Tr+Ur,"g"),Fr=RegExp([Ar+"?"+yr+"+"+Rr+"(?="+[pr,Ar,"$"].join("|")+")",Ir+"+"+zr+"(?="+[pr,Ar+Or,"$"].join("|")+")",Ar+"?"+Or+"+"+Rr,Ar+"+"+zr,Cr,Lr,vr,Br].join("|"),"g"),Nr=RegExp("["+kr+Yt+tr+ar+"]"),Pr=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,qr=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Zr=-1,Kr={};
Kr[at]=Kr[lt]=Kr[st]=Kr[ht]=Kr[pt]=Kr[_t]=Kr[vt]=Kr[gt]=Kr[yt]=!0,Kr[Dn]=Kr[Mn]=Kr[ft]=Kr[Nn]=Kr[ct]=Kr[Pn]=Kr[Zn]=Kr[Kn]=Kr[Gn]=Kr[Hn]=Kr[Yn]=Kr[nt]=Kr[tt]=Kr[rt]=Kr[it]=!1;var Vr={};Vr[Dn]=Vr[Mn]=Vr[ft]=Vr[ct]=Vr[Nn]=Vr[Pn]=Vr[at]=Vr[lt]=Vr[st]=Vr[ht]=Vr[pt]=Vr[Gn]=Vr[Hn]=Vr[Yn]=Vr[nt]=Vr[tt]=Vr[rt]=Vr[et]=Vr[_t]=Vr[vt]=Vr[gt]=Vr[yt]=!0,Vr[Zn]=Vr[Kn]=Vr[it]=!1;var Gr={"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a",
"\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae",
"\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g",
"\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O",
"\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w",
"\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"},Hr={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Jr={"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&#39;":"'"},Yr={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Qr=parseFloat,Xr=parseInt,ne="object"==typeof global&&global&&global.Object===Object&&global,te="object"==typeof self&&self&&self.Object===Object&&self,re=ne||te||Function("return this")(),ee="object"==typeof exports&&exports&&!exports.nodeType&&exports,ue=ee&&"object"==typeof module&&module&&!module.nodeType&&module,ie=ue&&ue.exports===ee,oe=ie&&ne.process,fe=function(){
try{var n=ue&&ue.require&&ue.require("util").types;return n?n:oe&&oe.binding&&oe.binding("util")}catch(n){}}(),ce=fe&&fe.isArrayBuffer,ae=fe&&fe.isDate,le=fe&&fe.isMap,se=fe&&fe.isRegExp,he=fe&&fe.isSet,pe=fe&&fe.isTypedArray,_e=m("length"),ve=x(Gr),ge=x(Hr),ye=x(Jr),de=function p(x){function Z(n){if(cc(n)&&!bh(n)&&!(n instanceof Ct)){if(n instanceof Y)return n;if(bl.call(n,"__wrapped__"))return eo(n)}return new Y(n)}function J(){}function Y(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t,
this.__index__=0,this.__values__=X}function Ct(n){this.__wrapped__=n,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=Un,this.__views__=[]}function $t(){var n=new Ct(this.__wrapped__);return n.__actions__=Tu(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=Tu(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=Tu(this.__views__),n}function Yt(){if(this.__filtered__){var n=new Ct(this);n.__dir__=-1,
n.__filtered__=!0}else n=this.clone(),n.__dir__*=-1;return n}function Qt(){var n=this.__wrapped__.value(),t=this.__dir__,r=bh(n),e=t<0,u=r?n.length:0,i=Oi(0,u,this.__views__),o=i.start,f=i.end,c=f-o,a=e?f:o-1,l=this.__iteratees__,s=l.length,h=0,p=Hl(c,this.__takeCount__);if(!r||!e&&u==c&&p==c)return wu(n,this.__actions__);var _=[];n:for(;c--&&h<p;){a+=t;for(var v=-1,g=n[a];++v<s;){var y=l[v],d=y.iteratee,b=y.type,w=d(g);if(b==zn)g=w;else if(!w){if(b==Rn)continue n;break n}}_[h++]=g}return _}function Xt(n){
var t=-1,r=null==n?0:n.length;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function nr(){this.__data__=is?is(null):{},this.size=0}function tr(n){var t=this.has(n)&&delete this.__data__[n];return this.size-=t?1:0,t}function rr(n){var t=this.__data__;if(is){var r=t[n];return r===on?X:r}return bl.call(t,n)?t[n]:X}function er(n){var t=this.__data__;return is?t[n]!==X:bl.call(t,n)}function ur(n,t){var r=this.__data__;return this.size+=this.has(n)?0:1,r[n]=is&&t===X?on:t,this}function ir(n){
var t=-1,r=null==n?0:n.length;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function or(){this.__data__=[],this.size=0}function fr(n){var t=this.__data__,r=Wr(t,n);return!(r<0)&&(r==t.length-1?t.pop():Ll.call(t,r,1),--this.size,!0)}function cr(n){var t=this.__data__,r=Wr(t,n);return r<0?X:t[r][1]}function ar(n){return Wr(this.__data__,n)>-1}function lr(n,t){var r=this.__data__,e=Wr(r,n);return e<0?(++this.size,r.push([n,t])):r[e][1]=t,this}function sr(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t<r;){
var e=n[t];this.set(e[0],e[1])}}function hr(){this.size=0,this.__data__={hash:new Xt,map:new(ts||ir),string:new Xt}}function pr(n){var t=xi(this,n).delete(n);return this.size-=t?1:0,t}function _r(n){return xi(this,n).get(n)}function vr(n){return xi(this,n).has(n)}function gr(n,t){var r=xi(this,n),e=r.size;return r.set(n,t),this.size+=r.size==e?0:1,this}function yr(n){var t=-1,r=null==n?0:n.length;for(this.__data__=new sr;++t<r;)this.add(n[t])}function dr(n){return this.__data__.set(n,on),this}function br(n){
return this.__data__.has(n)}function wr(n){this.size=(this.__data__=new ir(n)).size}function mr(){this.__data__=new ir,this.size=0}function xr(n){var t=this.__data__,r=t.delete(n);return this.size=t.size,r}function jr(n){return this.__data__.get(n)}function Ar(n){return this.__data__.has(n)}function kr(n,t){var r=this.__data__;if(r instanceof ir){var e=r.__data__;if(!ts||e.length<tn-1)return e.push([n,t]),this.size=++r.size,this;r=this.__data__=new sr(e)}return r.set(n,t),this.size=r.size,this}function Or(n,t){
var r=bh(n),e=!r&&dh(n),u=!r&&!e&&mh(n),i=!r&&!e&&!u&&Oh(n),o=r||e||u||i,f=o?O(n.length,hl):[],c=f.length;for(var a in n)!t&&!bl.call(n,a)||o&&("length"==a||u&&("offset"==a||"parent"==a)||i&&("buffer"==a||"byteLength"==a||"byteOffset"==a)||Ci(a,c))||f.push(a);return f}function Ir(n){var t=n.length;return t?n[tu(0,t-1)]:X}function Rr(n,t){return Xi(Tu(n),Mr(t,0,n.length))}function zr(n){return Xi(Tu(n))}function Er(n,t,r){(r===X||Gf(n[t],r))&&(r!==X||t in n)||Br(n,t,r)}function Sr(n,t,r){var e=n[t];
bl.call(n,t)&&Gf(e,r)&&(r!==X||t in n)||Br(n,t,r)}function Wr(n,t){for(var r=n.length;r--;)if(Gf(n[r][0],t))return r;return-1}function Lr(n,t,r,e){return ys(n,function(n,u,i){t(e,n,r(n),i)}),e}function Cr(n,t){return n&&$u(t,Pc(t),n)}function Ur(n,t){return n&&$u(t,qc(t),n)}function Br(n,t,r){"__proto__"==t&&Tl?Tl(n,t,{configurable:!0,enumerable:!0,value:r,writable:!0}):n[t]=r}function Tr(n,t){for(var r=-1,e=t.length,u=il(e),i=null==n;++r<e;)u[r]=i?X:Mc(n,t[r]);return u}function Mr(n,t,r){return n===n&&(r!==X&&(n=n<=r?n:r),
t!==X&&(n=n>=t?n:t)),n}function Fr(n,t,e,u,i,o){var f,c=t&an,a=t&ln,l=t&sn;if(e&&(f=i?e(n,u,i,o):e(n)),f!==X)return f;if(!fc(n))return n;var s=bh(n);if(s){if(f=zi(n),!c)return Tu(n,f)}else{var h=zs(n),p=h==Kn||h==Vn;if(mh(n))return Iu(n,c);if(h==Yn||h==Dn||p&&!i){if(f=a||p?{}:Ei(n),!c)return a?Mu(n,Ur(f,n)):Du(n,Cr(f,n))}else{if(!Vr[h])return i?n:{};f=Si(n,h,c)}}o||(o=new wr);var _=o.get(n);if(_)return _;o.set(n,f),kh(n)?n.forEach(function(r){f.add(Fr(r,t,e,r,n,o))}):jh(n)&&n.forEach(function(r,u){
f.set(u,Fr(r,t,e,u,n,o))});var v=l?a?di:yi:a?qc:Pc,g=s?X:v(n);return r(g||n,function(r,u){g&&(u=r,r=n[u]),Sr(f,u,Fr(r,t,e,u,n,o))}),f}function Nr(n){var t=Pc(n);return function(r){return Pr(r,n,t)}}function Pr(n,t,r){var e=r.length;if(null==n)return!e;for(n=ll(n);e--;){var u=r[e],i=t[u],o=n[u];if(o===X&&!(u in n)||!i(o))return!1}return!0}function Gr(n,t,r){if("function"!=typeof n)throw new pl(en);return Ws(function(){n.apply(X,r)},t)}function Hr(n,t,r,e){var u=-1,i=o,a=!0,l=n.length,s=[],h=t.length;
if(!l)return s;r&&(t=c(t,z(r))),e?(i=f,a=!1):t.length>=tn&&(i=S,a=!1,t=new yr(t));n:for(;++u<l;){var p=n[u],_=null==r?p:r(p);if(p=e||0!==p?p:0,a&&_===_){for(var v=h;v--;)if(t[v]===_)continue n;s.push(p)}else i(t,_,e)||s.push(p)}return s}function Jr(n,t){var r=!0;return ys(n,function(n,e,u){return r=!!t(n,e,u)}),r}function Yr(n,t,r){for(var e=-1,u=n.length;++e<u;){var i=n[e],o=t(i);if(null!=o&&(f===X?o===o&&!bc(o):r(o,f)))var f=o,c=i}return c}function ne(n,t,r,e){var u=n.length;for(r=kc(r),r<0&&(r=-r>u?0:u+r),
e=e===X||e>u?u:kc(e),e<0&&(e+=u),e=r>e?0:Oc(e);r<e;)n[r++]=t;return n}function te(n,t){var r=[];return ys(n,function(n,e,u){t(n,e,u)&&r.push(n)}),r}function ee(n,t,r,e,u){var i=-1,o=n.length;for(r||(r=Li),u||(u=[]);++i<o;){var f=n[i];t>0&&r(f)?t>1?ee(f,t-1,r,e,u):a(u,f):e||(u[u.length]=f)}return u}function ue(n,t){return n&&bs(n,t,Pc)}function oe(n,t){return n&&ws(n,t,Pc)}function fe(n,t){return i(t,function(t){return uc(n[t])})}function _e(n,t){t=ku(t,n);for(var r=0,e=t.length;null!=n&&r<e;)n=n[no(t[r++])];
return r&&r==e?n:X}function de(n,t,r){var e=t(n);return bh(n)?e:a(e,r(n))}function we(n){return null==n?n===X?ut:Jn:Bl&&Bl in ll(n)?ki(n):Ki(n)}function me(n,t){return n>t}function xe(n,t){return null!=n&&bl.call(n,t)}function je(n,t){return null!=n&&t in ll(n)}function Ae(n,t,r){return n>=Hl(t,r)&&n<Gl(t,r)}function ke(n,t,r){for(var e=r?f:o,u=n[0].length,i=n.length,a=i,l=il(i),s=1/0,h=[];a--;){var p=n[a];a&&t&&(p=c(p,z(t))),s=Hl(p.length,s),l[a]=!r&&(t||u>=120&&p.length>=120)?new yr(a&&p):X}p=n[0];
var _=-1,v=l[0];n:for(;++_<u&&h.length<s;){var g=p[_],y=t?t(g):g;if(g=r||0!==g?g:0,!(v?S(v,y):e(h,y,r))){for(a=i;--a;){var d=l[a];if(!(d?S(d,y):e(n[a],y,r)))continue n}v&&v.push(y),h.push(g)}}return h}function Oe(n,t,r,e){return ue(n,function(n,u,i){t(e,r(n),u,i)}),e}function Ie(t,r,e){r=ku(r,t),t=Gi(t,r);var u=null==t?t:t[no(jo(r))];return null==u?X:n(u,t,e)}function Re(n){return cc(n)&&we(n)==Dn}function ze(n){return cc(n)&&we(n)==ft}function Ee(n){return cc(n)&&we(n)==Pn}function Se(n,t,r,e,u){
return n===t||(null==n||null==t||!cc(n)&&!cc(t)?n!==n&&t!==t:We(n,t,r,e,Se,u))}function We(n,t,r,e,u,i){var o=bh(n),f=bh(t),c=o?Mn:zs(n),a=f?Mn:zs(t);c=c==Dn?Yn:c,a=a==Dn?Yn:a;var l=c==Yn,s=a==Yn,h=c==a;if(h&&mh(n)){if(!mh(t))return!1;o=!0,l=!1}if(h&&!l)return i||(i=new wr),o||Oh(n)?pi(n,t,r,e,u,i):_i(n,t,c,r,e,u,i);if(!(r&hn)){var p=l&&bl.call(n,"__wrapped__"),_=s&&bl.call(t,"__wrapped__");if(p||_){var v=p?n.value():n,g=_?t.value():t;return i||(i=new wr),u(v,g,r,e,i)}}return!!h&&(i||(i=new wr),vi(n,t,r,e,u,i));
}function Le(n){return cc(n)&&zs(n)==Gn}function Ce(n,t,r,e){var u=r.length,i=u,o=!e;if(null==n)return!i;for(n=ll(n);u--;){var f=r[u];if(o&&f[2]?f[1]!==n[f[0]]:!(f[0]in n))return!1}for(;++u<i;){f=r[u];var c=f[0],a=n[c],l=f[1];if(o&&f[2]){if(a===X&&!(c in n))return!1}else{var s=new wr;if(e)var h=e(a,l,c,n,t,s);if(!(h===X?Se(l,a,hn|pn,e,s):h))return!1}}return!0}function Ue(n){return!(!fc(n)||Di(n))&&(uc(n)?kl:Zt).test(to(n))}function Be(n){return cc(n)&&we(n)==nt}function Te(n){return cc(n)&&zs(n)==tt;
}function $e(n){return cc(n)&&oc(n.length)&&!!Kr[we(n)]}function De(n){return"function"==typeof n?n:null==n?La:"object"==typeof n?bh(n)?Ze(n[0],n[1]):qe(n):Fa(n)}function Me(n){if(!Mi(n))return Vl(n);var t=[];for(var r in ll(n))bl.call(n,r)&&"constructor"!=r&&t.push(r);return t}function Fe(n){if(!fc(n))return Zi(n);var t=Mi(n),r=[];for(var e in n)("constructor"!=e||!t&&bl.call(n,e))&&r.push(e);return r}function Ne(n,t){return n<t}function Pe(n,t){var r=-1,e=Hf(n)?il(n.length):[];return ys(n,function(n,u,i){
e[++r]=t(n,u,i)}),e}function qe(n){var t=ji(n);return 1==t.length&&t[0][2]?Ni(t[0][0],t[0][1]):function(r){return r===n||Ce(r,n,t)}}function Ze(n,t){return Bi(n)&&Fi(t)?Ni(no(n),t):function(r){var e=Mc(r,n);return e===X&&e===t?Nc(r,n):Se(t,e,hn|pn)}}function Ke(n,t,r,e,u){n!==t&&bs(t,function(i,o){if(u||(u=new wr),fc(i))Ve(n,t,o,r,Ke,e,u);else{var f=e?e(Ji(n,o),i,o+"",n,t,u):X;f===X&&(f=i),Er(n,o,f)}},qc)}function Ve(n,t,r,e,u,i,o){var f=Ji(n,r),c=Ji(t,r),a=o.get(c);if(a)return Er(n,r,a),X;var l=i?i(f,c,r+"",n,t,o):X,s=l===X;
if(s){var h=bh(c),p=!h&&mh(c),_=!h&&!p&&Oh(c);l=c,h||p||_?bh(f)?l=f:Jf(f)?l=Tu(f):p?(s=!1,l=Iu(c,!0)):_?(s=!1,l=Wu(c,!0)):l=[]:gc(c)||dh(c)?(l=f,dh(f)?l=Rc(f):fc(f)&&!uc(f)||(l=Ei(c))):s=!1}s&&(o.set(c,l),u(l,c,e,i,o),o.delete(c)),Er(n,r,l)}function Ge(n,t){var r=n.length;if(r)return t+=t<0?r:0,Ci(t,r)?n[t]:X}function He(n,t,r){t=t.length?c(t,function(n){return bh(n)?function(t){return _e(t,1===n.length?n[0]:n)}:n}):[La];var e=-1;return t=c(t,z(mi())),A(Pe(n,function(n,r,u){return{criteria:c(t,function(t){
return t(n)}),index:++e,value:n}}),function(n,t){return Cu(n,t,r)})}function Je(n,t){return Ye(n,t,function(t,r){return Nc(n,r)})}function Ye(n,t,r){for(var e=-1,u=t.length,i={};++e<u;){var o=t[e],f=_e(n,o);r(f,o)&&fu(i,ku(o,n),f)}return i}function Qe(n){return function(t){return _e(t,n)}}function Xe(n,t,r,e){var u=e?d:y,i=-1,o=t.length,f=n;for(n===t&&(t=Tu(t)),r&&(f=c(n,z(r)));++i<o;)for(var a=0,l=t[i],s=r?r(l):l;(a=u(f,s,a,e))>-1;)f!==n&&Ll.call(f,a,1),Ll.call(n,a,1);return n}function nu(n,t){for(var r=n?t.length:0,e=r-1;r--;){
var u=t[r];if(r==e||u!==i){var i=u;Ci(u)?Ll.call(n,u,1):yu(n,u)}}return n}function tu(n,t){return n+Nl(Ql()*(t-n+1))}function ru(n,t,r,e){for(var u=-1,i=Gl(Fl((t-n)/(r||1)),0),o=il(i);i--;)o[e?i:++u]=n,n+=r;return o}function eu(n,t){var r="";if(!n||t<1||t>Wn)return r;do t%2&&(r+=n),t=Nl(t/2),t&&(n+=n);while(t);return r}function uu(n,t){return Ls(Vi(n,t,La),n+"")}function iu(n){return Ir(ra(n))}function ou(n,t){var r=ra(n);return Xi(r,Mr(t,0,r.length))}function fu(n,t,r,e){if(!fc(n))return n;t=ku(t,n);
for(var u=-1,i=t.length,o=i-1,f=n;null!=f&&++u<i;){var c=no(t[u]),a=r;if("__proto__"===c||"constructor"===c||"prototype"===c)return n;if(u!=o){var l=f[c];a=e?e(l,c,f):X,a===X&&(a=fc(l)?l:Ci(t[u+1])?[]:{})}Sr(f,c,a),f=f[c]}return n}function cu(n){return Xi(ra(n))}function au(n,t,r){var e=-1,u=n.length;t<0&&(t=-t>u?0:u+t),r=r>u?u:r,r<0&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0;for(var i=il(u);++e<u;)i[e]=n[e+t];return i}function lu(n,t){var r;return ys(n,function(n,e,u){return r=t(n,e,u),!r}),!!r}function su(n,t,r){
var e=0,u=null==n?e:n.length;if("number"==typeof t&&t===t&&u<=Tn){for(;e<u;){var i=e+u>>>1,o=n[i];null!==o&&!bc(o)&&(r?o<=t:o<t)?e=i+1:u=i}return u}return hu(n,t,La,r)}function hu(n,t,r,e){var u=0,i=null==n?0:n.length;if(0===i)return 0;t=r(t);for(var o=t!==t,f=null===t,c=bc(t),a=t===X;u<i;){var l=Nl((u+i)/2),s=r(n[l]),h=s!==X,p=null===s,_=s===s,v=bc(s);if(o)var g=e||_;else g=a?_&&(e||h):f?_&&h&&(e||!p):c?_&&h&&!p&&(e||!v):!p&&!v&&(e?s<=t:s<t);g?u=l+1:i=l}return Hl(i,Bn)}function pu(n,t){for(var r=-1,e=n.length,u=0,i=[];++r<e;){
var o=n[r],f=t?t(o):o;if(!r||!Gf(f,c)){var c=f;i[u++]=0===o?0:o}}return i}function _u(n){return"number"==typeof n?n:bc(n)?Cn:+n}function vu(n){if("string"==typeof n)return n;if(bh(n))return c(n,vu)+"";if(bc(n))return vs?vs.call(n):"";var t=n+"";return"0"==t&&1/n==-Sn?"-0":t}function gu(n,t,r){var e=-1,u=o,i=n.length,c=!0,a=[],l=a;if(r)c=!1,u=f;else if(i>=tn){var s=t?null:ks(n);if(s)return P(s);c=!1,u=S,l=new yr}else l=t?[]:a;n:for(;++e<i;){var h=n[e],p=t?t(h):h;if(h=r||0!==h?h:0,c&&p===p){for(var _=l.length;_--;)if(l[_]===p)continue n;
t&&l.push(p),a.push(h)}else u(l,p,r)||(l!==a&&l.push(p),a.push(h))}return a}function yu(n,t){return t=ku(t,n),n=Gi(n,t),null==n||delete n[no(jo(t))]}function du(n,t,r,e){return fu(n,t,r(_e(n,t)),e)}function bu(n,t,r,e){for(var u=n.length,i=e?u:-1;(e?i--:++i<u)&&t(n[i],i,n););return r?au(n,e?0:i,e?i+1:u):au(n,e?i+1:0,e?u:i)}function wu(n,t){var r=n;return r instanceof Ct&&(r=r.value()),l(t,function(n,t){return t.func.apply(t.thisArg,a([n],t.args))},r)}function mu(n,t,r){var e=n.length;if(e<2)return e?gu(n[0]):[];
for(var u=-1,i=il(e);++u<e;)for(var o=n[u],f=-1;++f<e;)f!=u&&(i[u]=Hr(i[u]||o,n[f],t,r));return gu(ee(i,1),t,r)}function xu(n,t,r){for(var e=-1,u=n.length,i=t.length,o={};++e<u;){r(o,n[e],e<i?t[e]:X)}return o}function ju(n){return Jf(n)?n:[]}function Au(n){return"function"==typeof n?n:La}function ku(n,t){return bh(n)?n:Bi(n,t)?[n]:Cs(Ec(n))}function Ou(n,t,r){var e=n.length;return r=r===X?e:r,!t&&r>=e?n:au(n,t,r)}function Iu(n,t){if(t)return n.slice();var r=n.length,e=zl?zl(r):new n.constructor(r);
return n.copy(e),e}function Ru(n){var t=new n.constructor(n.byteLength);return new Rl(t).set(new Rl(n)),t}function zu(n,t){return new n.constructor(t?Ru(n.buffer):n.buffer,n.byteOffset,n.byteLength)}function Eu(n){var t=new n.constructor(n.source,Nt.exec(n));return t.lastIndex=n.lastIndex,t}function Su(n){return _s?ll(_s.call(n)):{}}function Wu(n,t){return new n.constructor(t?Ru(n.buffer):n.buffer,n.byteOffset,n.length)}function Lu(n,t){if(n!==t){var r=n!==X,e=null===n,u=n===n,i=bc(n),o=t!==X,f=null===t,c=t===t,a=bc(t);
if(!f&&!a&&!i&&n>t||i&&o&&c&&!f&&!a||e&&o&&c||!r&&c||!u)return 1;if(!e&&!i&&!a&&n<t||a&&r&&u&&!e&&!i||f&&r&&u||!o&&u||!c)return-1}return 0}function Cu(n,t,r){for(var e=-1,u=n.criteria,i=t.criteria,o=u.length,f=r.length;++e<o;){var c=Lu(u[e],i[e]);if(c){if(e>=f)return c;return c*("desc"==r[e]?-1:1)}}return n.index-t.index}function Uu(n,t,r,e){for(var u=-1,i=n.length,o=r.length,f=-1,c=t.length,a=Gl(i-o,0),l=il(c+a),s=!e;++f<c;)l[f]=t[f];for(;++u<o;)(s||u<i)&&(l[r[u]]=n[u]);for(;a--;)l[f++]=n[u++];return l;
}function Bu(n,t,r,e){for(var u=-1,i=n.length,o=-1,f=r.length,c=-1,a=t.length,l=Gl(i-f,0),s=il(l+a),h=!e;++u<l;)s[u]=n[u];for(var p=u;++c<a;)s[p+c]=t[c];for(;++o<f;)(h||u<i)&&(s[p+r[o]]=n[u++]);return s}function Tu(n,t){var r=-1,e=n.length;for(t||(t=il(e));++r<e;)t[r]=n[r];return t}function $u(n,t,r,e){var u=!r;r||(r={});for(var i=-1,o=t.length;++i<o;){var f=t[i],c=e?e(r[f],n[f],f,r,n):X;c===X&&(c=n[f]),u?Br(r,f,c):Sr(r,f,c)}return r}function Du(n,t){return $u(n,Is(n),t)}function Mu(n,t){return $u(n,Rs(n),t);
}function Fu(n,r){return function(e,u){var i=bh(e)?t:Lr,o=r?r():{};return i(e,n,mi(u,2),o)}}function Nu(n){return uu(function(t,r){var e=-1,u=r.length,i=u>1?r[u-1]:X,o=u>2?r[2]:X;for(i=n.length>3&&"function"==typeof i?(u--,i):X,o&&Ui(r[0],r[1],o)&&(i=u<3?X:i,u=1),t=ll(t);++e<u;){var f=r[e];f&&n(t,f,e,i)}return t})}function Pu(n,t){return function(r,e){if(null==r)return r;if(!Hf(r))return n(r,e);for(var u=r.length,i=t?u:-1,o=ll(r);(t?i--:++i<u)&&e(o[i],i,o)!==!1;);return r}}function qu(n){return function(t,r,e){
for(var u=-1,i=ll(t),o=e(t),f=o.length;f--;){var c=o[n?f:++u];if(r(i[c],c,i)===!1)break}return t}}function Zu(n,t,r){function e(){return(this&&this!==re&&this instanceof e?i:n).apply(u?r:this,arguments)}var u=t&_n,i=Gu(n);return e}function Ku(n){return function(t){t=Ec(t);var r=T(t)?G(t):X,e=r?r[0]:t.charAt(0),u=r?Ou(r,1).join(""):t.slice(1);return e[n]()+u}}function Vu(n){return function(t){return l(Ra(ca(t).replace($r,"")),n,"")}}function Gu(n){return function(){var t=arguments;switch(t.length){
case 0:return new n;case 1:return new n(t[0]);case 2:return new n(t[0],t[1]);case 3:return new n(t[0],t[1],t[2]);case 4:return new n(t[0],t[1],t[2],t[3]);case 5:return new n(t[0],t[1],t[2],t[3],t[4]);case 6:return new n(t[0],t[1],t[2],t[3],t[4],t[5]);case 7:return new n(t[0],t[1],t[2],t[3],t[4],t[5],t[6])}var r=gs(n.prototype),e=n.apply(r,t);return fc(e)?e:r}}function Hu(t,r,e){function u(){for(var o=arguments.length,f=il(o),c=o,a=wi(u);c--;)f[c]=arguments[c];var l=o<3&&f[0]!==a&&f[o-1]!==a?[]:N(f,a);
return o-=l.length,o<e?oi(t,r,Qu,u.placeholder,X,f,l,X,X,e-o):n(this&&this!==re&&this instanceof u?i:t,this,f)}var i=Gu(t);return u}function Ju(n){return function(t,r,e){var u=ll(t);if(!Hf(t)){var i=mi(r,3);t=Pc(t),r=function(n){return i(u[n],n,u)}}var o=n(t,r,e);return o>-1?u[i?t[o]:o]:X}}function Yu(n){return gi(function(t){var r=t.length,e=r,u=Y.prototype.thru;for(n&&t.reverse();e--;){var i=t[e];if("function"!=typeof i)throw new pl(en);if(u&&!o&&"wrapper"==bi(i))var o=new Y([],!0)}for(e=o?e:r;++e<r;){
i=t[e];var f=bi(i),c="wrapper"==f?Os(i):X;o=c&&$i(c[0])&&c[1]==(mn|yn|bn|xn)&&!c[4].length&&1==c[9]?o[bi(c[0])].apply(o,c[3]):1==i.length&&$i(i)?o[f]():o.thru(i)}return function(){var n=arguments,e=n[0];if(o&&1==n.length&&bh(e))return o.plant(e).value();for(var u=0,i=r?t[u].apply(this,n):e;++u<r;)i=t[u].call(this,i);return i}})}function Qu(n,t,r,e,u,i,o,f,c,a){function l(){for(var y=arguments.length,d=il(y),b=y;b--;)d[b]=arguments[b];if(_)var w=wi(l),m=C(d,w);if(e&&(d=Uu(d,e,u,_)),i&&(d=Bu(d,i,o,_)),
y-=m,_&&y<a){return oi(n,t,Qu,l.placeholder,r,d,N(d,w),f,c,a-y)}var x=h?r:this,j=p?x[n]:n;return y=d.length,f?d=Hi(d,f):v&&y>1&&d.reverse(),s&&c<y&&(d.length=c),this&&this!==re&&this instanceof l&&(j=g||Gu(j)),j.apply(x,d)}var s=t&mn,h=t&_n,p=t&vn,_=t&(yn|dn),v=t&jn,g=p?X:Gu(n);return l}function Xu(n,t){return function(r,e){return Oe(r,n,t(e),{})}}function ni(n,t){return function(r,e){var u;if(r===X&&e===X)return t;if(r!==X&&(u=r),e!==X){if(u===X)return e;"string"==typeof r||"string"==typeof e?(r=vu(r),
e=vu(e)):(r=_u(r),e=_u(e)),u=n(r,e)}return u}}function ti(t){return gi(function(r){return r=c(r,z(mi())),uu(function(e){var u=this;return t(r,function(t){return n(t,u,e)})})})}function ri(n,t){t=t===X?" ":vu(t);var r=t.length;if(r<2)return r?eu(t,n):t;var e=eu(t,Fl(n/V(t)));return T(t)?Ou(G(e),0,n).join(""):e.slice(0,n)}function ei(t,r,e,u){function i(){for(var r=-1,c=arguments.length,a=-1,l=u.length,s=il(l+c),h=this&&this!==re&&this instanceof i?f:t;++a<l;)s[a]=u[a];for(;c--;)s[a++]=arguments[++r];
return n(h,o?e:this,s)}var o=r&_n,f=Gu(t);return i}function ui(n){return function(t,r,e){return e&&"number"!=typeof e&&Ui(t,r,e)&&(r=e=X),t=Ac(t),r===X?(r=t,t=0):r=Ac(r),e=e===X?t<r?1:-1:Ac(e),ru(t,r,e,n)}}function ii(n){return function(t,r){return"string"==typeof t&&"string"==typeof r||(t=Ic(t),r=Ic(r)),n(t,r)}}function oi(n,t,r,e,u,i,o,f,c,a){var l=t&yn,s=l?o:X,h=l?X:o,p=l?i:X,_=l?X:i;t|=l?bn:wn,t&=~(l?wn:bn),t&gn||(t&=~(_n|vn));var v=[n,t,u,p,s,_,h,f,c,a],g=r.apply(X,v);return $i(n)&&Ss(g,v),g.placeholder=e,
Yi(g,n,t)}function fi(n){var t=al[n];return function(n,r){if(n=Ic(n),r=null==r?0:Hl(kc(r),292),r&&Zl(n)){var e=(Ec(n)+"e").split("e");return e=(Ec(t(e[0]+"e"+(+e[1]+r)))+"e").split("e"),+(e[0]+"e"+(+e[1]-r))}return t(n)}}function ci(n){return function(t){var r=zs(t);return r==Gn?M(t):r==tt?q(t):I(t,n(t))}}function ai(n,t,r,e,u,i,o,f){var c=t&vn;if(!c&&"function"!=typeof n)throw new pl(en);var a=e?e.length:0;if(a||(t&=~(bn|wn),e=u=X),o=o===X?o:Gl(kc(o),0),f=f===X?f:kc(f),a-=u?u.length:0,t&wn){var l=e,s=u;
e=u=X}var h=c?X:Os(n),p=[n,t,r,e,u,l,s,i,o,f];if(h&&qi(p,h),n=p[0],t=p[1],r=p[2],e=p[3],u=p[4],f=p[9]=p[9]===X?c?0:n.length:Gl(p[9]-a,0),!f&&t&(yn|dn)&&(t&=~(yn|dn)),t&&t!=_n)_=t==yn||t==dn?Hu(n,t,f):t!=bn&&t!=(_n|bn)||u.length?Qu.apply(X,p):ei(n,t,r,e);else var _=Zu(n,t,r);return Yi((h?ms:Ss)(_,p),n,t)}function li(n,t,r,e){return n===X||Gf(n,gl[r])&&!bl.call(e,r)?t:n}function si(n,t,r,e,u,i){return fc(n)&&fc(t)&&(i.set(t,n),Ke(n,t,X,si,i),i.delete(t)),n}function hi(n){return gc(n)?X:n}function pi(n,t,r,e,u,i){
var o=r&hn,f=n.length,c=t.length;if(f!=c&&!(o&&c>f))return!1;var a=i.get(n),l=i.get(t);if(a&&l)return a==t&&l==n;var s=-1,p=!0,_=r&pn?new yr:X;for(i.set(n,t),i.set(t,n);++s<f;){var v=n[s],g=t[s];if(e)var y=o?e(g,v,s,t,n,i):e(v,g,s,n,t,i);if(y!==X){if(y)continue;p=!1;break}if(_){if(!h(t,function(n,t){if(!S(_,t)&&(v===n||u(v,n,r,e,i)))return _.push(t)})){p=!1;break}}else if(v!==g&&!u(v,g,r,e,i)){p=!1;break}}return i.delete(n),i.delete(t),p}function _i(n,t,r,e,u,i,o){switch(r){case ct:if(n.byteLength!=t.byteLength||n.byteOffset!=t.byteOffset)return!1;
n=n.buffer,t=t.buffer;case ft:return!(n.byteLength!=t.byteLength||!i(new Rl(n),new Rl(t)));case Nn:case Pn:case Hn:return Gf(+n,+t);case Zn:return n.name==t.name&&n.message==t.message;case nt:case rt:return n==t+"";case Gn:var f=M;case tt:var c=e&hn;if(f||(f=P),n.size!=t.size&&!c)return!1;var a=o.get(n);if(a)return a==t;e|=pn,o.set(n,t);var l=pi(f(n),f(t),e,u,i,o);return o.delete(n),l;case et:if(_s)return _s.call(n)==_s.call(t)}return!1}function vi(n,t,r,e,u,i){var o=r&hn,f=yi(n),c=f.length;if(c!=yi(t).length&&!o)return!1;
for(var a=c;a--;){var l=f[a];if(!(o?l in t:bl.call(t,l)))return!1}var s=i.get(n),h=i.get(t);if(s&&h)return s==t&&h==n;var p=!0;i.set(n,t),i.set(t,n);for(var _=o;++a<c;){l=f[a];var v=n[l],g=t[l];if(e)var y=o?e(g,v,l,t,n,i):e(v,g,l,n,t,i);if(!(y===X?v===g||u(v,g,r,e,i):y)){p=!1;break}_||(_="constructor"==l)}if(p&&!_){var d=n.constructor,b=t.constructor;d!=b&&"constructor"in n&&"constructor"in t&&!("function"==typeof d&&d instanceof d&&"function"==typeof b&&b instanceof b)&&(p=!1)}return i.delete(n),
i.delete(t),p}function gi(n){return Ls(Vi(n,X,_o),n+"")}function yi(n){return de(n,Pc,Is)}function di(n){return de(n,qc,Rs)}function bi(n){for(var t=n.name+"",r=fs[t],e=bl.call(fs,t)?r.length:0;e--;){var u=r[e],i=u.func;if(null==i||i==n)return u.name}return t}function wi(n){return(bl.call(Z,"placeholder")?Z:n).placeholder}function mi(){var n=Z.iteratee||Ca;return n=n===Ca?De:n,arguments.length?n(arguments[0],arguments[1]):n}function xi(n,t){var r=n.__data__;return Ti(t)?r["string"==typeof t?"string":"hash"]:r.map;
}function ji(n){for(var t=Pc(n),r=t.length;r--;){var e=t[r],u=n[e];t[r]=[e,u,Fi(u)]}return t}function Ai(n,t){var r=B(n,t);return Ue(r)?r:X}function ki(n){var t=bl.call(n,Bl),r=n[Bl];try{n[Bl]=X;var e=!0}catch(n){}var u=xl.call(n);return e&&(t?n[Bl]=r:delete n[Bl]),u}function Oi(n,t,r){for(var e=-1,u=r.length;++e<u;){var i=r[e],o=i.size;switch(i.type){case"drop":n+=o;break;case"dropRight":t-=o;break;case"take":t=Hl(t,n+o);break;case"takeRight":n=Gl(n,t-o)}}return{start:n,end:t}}function Ii(n){var t=n.match(Bt);
return t?t[1].split(Tt):[]}function Ri(n,t,r){t=ku(t,n);for(var e=-1,u=t.length,i=!1;++e<u;){var o=no(t[e]);if(!(i=null!=n&&r(n,o)))break;n=n[o]}return i||++e!=u?i:(u=null==n?0:n.length,!!u&&oc(u)&&Ci(o,u)&&(bh(n)||dh(n)))}function zi(n){var t=n.length,r=new n.constructor(t);return t&&"string"==typeof n[0]&&bl.call(n,"index")&&(r.index=n.index,r.input=n.input),r}function Ei(n){return"function"!=typeof n.constructor||Mi(n)?{}:gs(El(n))}function Si(n,t,r){var e=n.constructor;switch(t){case ft:return Ru(n);
case Nn:case Pn:return new e(+n);case ct:return zu(n,r);case at:case lt:case st:case ht:case pt:case _t:case vt:case gt:case yt:return Wu(n,r);case Gn:return new e;case Hn:case rt:return new e(n);case nt:return Eu(n);case tt:return new e;case et:return Su(n)}}function Wi(n,t){var r=t.length;if(!r)return n;var e=r-1;return t[e]=(r>1?"& ":"")+t[e],t=t.join(r>2?", ":" "),n.replace(Ut,"{\n/* [wrapped with "+t+"] */\n")}function Li(n){return bh(n)||dh(n)||!!(Cl&&n&&n[Cl])}function Ci(n,t){var r=typeof n;
return t=null==t?Wn:t,!!t&&("number"==r||"symbol"!=r&&Vt.test(n))&&n>-1&&n%1==0&&n<t}function Ui(n,t,r){if(!fc(r))return!1;var e=typeof t;return!!("number"==e?Hf(r)&&Ci(t,r.length):"string"==e&&t in r)&&Gf(r[t],n)}function Bi(n,t){if(bh(n))return!1;var r=typeof n;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=n&&!bc(n))||(zt.test(n)||!Rt.test(n)||null!=t&&n in ll(t))}function Ti(n){var t=typeof n;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==n:null===n}function $i(n){
var t=bi(n),r=Z[t];if("function"!=typeof r||!(t in Ct.prototype))return!1;if(n===r)return!0;var e=Os(r);return!!e&&n===e[0]}function Di(n){return!!ml&&ml in n}function Mi(n){var t=n&&n.constructor;return n===("function"==typeof t&&t.prototype||gl)}function Fi(n){return n===n&&!fc(n)}function Ni(n,t){return function(r){return null!=r&&(r[n]===t&&(t!==X||n in ll(r)))}}function Pi(n){var t=Cf(n,function(n){return r.size===fn&&r.clear(),n}),r=t.cache;return t}function qi(n,t){var r=n[1],e=t[1],u=r|e,i=u<(_n|vn|mn),o=e==mn&&r==yn||e==mn&&r==xn&&n[7].length<=t[8]||e==(mn|xn)&&t[7].length<=t[8]&&r==yn;
if(!i&&!o)return n;e&_n&&(n[2]=t[2],u|=r&_n?0:gn);var f=t[3];if(f){var c=n[3];n[3]=c?Uu(c,f,t[4]):f,n[4]=c?N(n[3],cn):t[4]}return f=t[5],f&&(c=n[5],n[5]=c?Bu(c,f,t[6]):f,n[6]=c?N(n[5],cn):t[6]),f=t[7],f&&(n[7]=f),e&mn&&(n[8]=null==n[8]?t[8]:Hl(n[8],t[8])),null==n[9]&&(n[9]=t[9]),n[0]=t[0],n[1]=u,n}function Zi(n){var t=[];if(null!=n)for(var r in ll(n))t.push(r);return t}function Ki(n){return xl.call(n)}function Vi(t,r,e){return r=Gl(r===X?t.length-1:r,0),function(){for(var u=arguments,i=-1,o=Gl(u.length-r,0),f=il(o);++i<o;)f[i]=u[r+i];
i=-1;for(var c=il(r+1);++i<r;)c[i]=u[i];return c[r]=e(f),n(t,this,c)}}function Gi(n,t){return t.length<2?n:_e(n,au(t,0,-1))}function Hi(n,t){for(var r=n.length,e=Hl(t.length,r),u=Tu(n);e--;){var i=t[e];n[e]=Ci(i,r)?u[i]:X}return n}function Ji(n,t){if(("constructor"!==t||"function"!=typeof n[t])&&"__proto__"!=t)return n[t]}function Yi(n,t,r){var e=t+"";return Ls(n,Wi(e,ro(Ii(e),r)))}function Qi(n){var t=0,r=0;return function(){var e=Jl(),u=In-(e-r);if(r=e,u>0){if(++t>=On)return arguments[0]}else t=0;
return n.apply(X,arguments)}}function Xi(n,t){var r=-1,e=n.length,u=e-1;for(t=t===X?e:t;++r<t;){var i=tu(r,u),o=n[i];n[i]=n[r],n[r]=o}return n.length=t,n}function no(n){if("string"==typeof n||bc(n))return n;var t=n+"";return"0"==t&&1/n==-Sn?"-0":t}function to(n){if(null!=n){try{return dl.call(n)}catch(n){}try{return n+""}catch(n){}}return""}function ro(n,t){return r($n,function(r){var e="_."+r[0];t&r[1]&&!o(n,e)&&n.push(e)}),n.sort()}function eo(n){if(n instanceof Ct)return n.clone();var t=new Y(n.__wrapped__,n.__chain__);
return t.__actions__=Tu(n.__actions__),t.__index__=n.__index__,t.__values__=n.__values__,t}function uo(n,t,r){t=(r?Ui(n,t,r):t===X)?1:Gl(kc(t),0);var e=null==n?0:n.length;if(!e||t<1)return[];for(var u=0,i=0,o=il(Fl(e/t));u<e;)o[i++]=au(n,u,u+=t);return o}function io(n){for(var t=-1,r=null==n?0:n.length,e=0,u=[];++t<r;){var i=n[t];i&&(u[e++]=i)}return u}function oo(){var n=arguments.length;if(!n)return[];for(var t=il(n-1),r=arguments[0],e=n;e--;)t[e-1]=arguments[e];return a(bh(r)?Tu(r):[r],ee(t,1));
}function fo(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===X?1:kc(t),au(n,t<0?0:t,e)):[]}function co(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===X?1:kc(t),t=e-t,au(n,0,t<0?0:t)):[]}function ao(n,t){return n&&n.length?bu(n,mi(t,3),!0,!0):[]}function lo(n,t){return n&&n.length?bu(n,mi(t,3),!0):[]}function so(n,t,r,e){var u=null==n?0:n.length;return u?(r&&"number"!=typeof r&&Ui(n,t,r)&&(r=0,e=u),ne(n,t,r,e)):[]}function ho(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=null==r?0:kc(r);
return u<0&&(u=Gl(e+u,0)),g(n,mi(t,3),u)}function po(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e-1;return r!==X&&(u=kc(r),u=r<0?Gl(e+u,0):Hl(u,e-1)),g(n,mi(t,3),u,!0)}function _o(n){return(null==n?0:n.length)?ee(n,1):[]}function vo(n){return(null==n?0:n.length)?ee(n,Sn):[]}function go(n,t){return(null==n?0:n.length)?(t=t===X?1:kc(t),ee(n,t)):[]}function yo(n){for(var t=-1,r=null==n?0:n.length,e={};++t<r;){var u=n[t];e[u[0]]=u[1]}return e}function bo(n){return n&&n.length?n[0]:X}function wo(n,t,r){
var e=null==n?0:n.length;if(!e)return-1;var u=null==r?0:kc(r);return u<0&&(u=Gl(e+u,0)),y(n,t,u)}function mo(n){return(null==n?0:n.length)?au(n,0,-1):[]}function xo(n,t){return null==n?"":Kl.call(n,t)}function jo(n){var t=null==n?0:n.length;return t?n[t-1]:X}function Ao(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e;return r!==X&&(u=kc(r),u=u<0?Gl(e+u,0):Hl(u,e-1)),t===t?K(n,t,u):g(n,b,u,!0)}function ko(n,t){return n&&n.length?Ge(n,kc(t)):X}function Oo(n,t){return n&&n.length&&t&&t.length?Xe(n,t):n;
}function Io(n,t,r){return n&&n.length&&t&&t.length?Xe(n,t,mi(r,2)):n}function Ro(n,t,r){return n&&n.length&&t&&t.length?Xe(n,t,X,r):n}function zo(n,t){var r=[];if(!n||!n.length)return r;var e=-1,u=[],i=n.length;for(t=mi(t,3);++e<i;){var o=n[e];t(o,e,n)&&(r.push(o),u.push(e))}return nu(n,u),r}function Eo(n){return null==n?n:Xl.call(n)}function So(n,t,r){var e=null==n?0:n.length;return e?(r&&"number"!=typeof r&&Ui(n,t,r)?(t=0,r=e):(t=null==t?0:kc(t),r=r===X?e:kc(r)),au(n,t,r)):[]}function Wo(n,t){
return su(n,t)}function Lo(n,t,r){return hu(n,t,mi(r,2))}function Co(n,t){var r=null==n?0:n.length;if(r){var e=su(n,t);if(e<r&&Gf(n[e],t))return e}return-1}function Uo(n,t){return su(n,t,!0)}function Bo(n,t,r){return hu(n,t,mi(r,2),!0)}function To(n,t){if(null==n?0:n.length){var r=su(n,t,!0)-1;if(Gf(n[r],t))return r}return-1}function $o(n){return n&&n.length?pu(n):[]}function Do(n,t){return n&&n.length?pu(n,mi(t,2)):[]}function Mo(n){var t=null==n?0:n.length;return t?au(n,1,t):[]}function Fo(n,t,r){
return n&&n.length?(t=r||t===X?1:kc(t),au(n,0,t<0?0:t)):[]}function No(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===X?1:kc(t),t=e-t,au(n,t<0?0:t,e)):[]}function Po(n,t){return n&&n.length?bu(n,mi(t,3),!1,!0):[]}function qo(n,t){return n&&n.length?bu(n,mi(t,3)):[]}function Zo(n){return n&&n.length?gu(n):[]}function Ko(n,t){return n&&n.length?gu(n,mi(t,2)):[]}function Vo(n,t){return t="function"==typeof t?t:X,n&&n.length?gu(n,X,t):[]}function Go(n){if(!n||!n.length)return[];var t=0;return n=i(n,function(n){
if(Jf(n))return t=Gl(n.length,t),!0}),O(t,function(t){return c(n,m(t))})}function Ho(t,r){if(!t||!t.length)return[];var e=Go(t);return null==r?e:c(e,function(t){return n(r,X,t)})}function Jo(n,t){return xu(n||[],t||[],Sr)}function Yo(n,t){return xu(n||[],t||[],fu)}function Qo(n){var t=Z(n);return t.__chain__=!0,t}function Xo(n,t){return t(n),n}function nf(n,t){return t(n)}function tf(){return Qo(this)}function rf(){return new Y(this.value(),this.__chain__)}function ef(){this.__values__===X&&(this.__values__=jc(this.value()));
var n=this.__index__>=this.__values__.length;return{done:n,value:n?X:this.__values__[this.__index__++]}}function uf(){return this}function of(n){for(var t,r=this;r instanceof J;){var e=eo(r);e.__index__=0,e.__values__=X,t?u.__wrapped__=e:t=e;var u=e;r=r.__wrapped__}return u.__wrapped__=n,t}function ff(){var n=this.__wrapped__;if(n instanceof Ct){var t=n;return this.__actions__.length&&(t=new Ct(this)),t=t.reverse(),t.__actions__.push({func:nf,args:[Eo],thisArg:X}),new Y(t,this.__chain__)}return this.thru(Eo);
}function cf(){return wu(this.__wrapped__,this.__actions__)}function af(n,t,r){var e=bh(n)?u:Jr;return r&&Ui(n,t,r)&&(t=X),e(n,mi(t,3))}function lf(n,t){return(bh(n)?i:te)(n,mi(t,3))}function sf(n,t){return ee(yf(n,t),1)}function hf(n,t){return ee(yf(n,t),Sn)}function pf(n,t,r){return r=r===X?1:kc(r),ee(yf(n,t),r)}function _f(n,t){return(bh(n)?r:ys)(n,mi(t,3))}function vf(n,t){return(bh(n)?e:ds)(n,mi(t,3))}function gf(n,t,r,e){n=Hf(n)?n:ra(n),r=r&&!e?kc(r):0;var u=n.length;return r<0&&(r=Gl(u+r,0)),
dc(n)?r<=u&&n.indexOf(t,r)>-1:!!u&&y(n,t,r)>-1}function yf(n,t){return(bh(n)?c:Pe)(n,mi(t,3))}function df(n,t,r,e){return null==n?[]:(bh(t)||(t=null==t?[]:[t]),r=e?X:r,bh(r)||(r=null==r?[]:[r]),He(n,t,r))}function bf(n,t,r){var e=bh(n)?l:j,u=arguments.length<3;return e(n,mi(t,4),r,u,ys)}function wf(n,t,r){var e=bh(n)?s:j,u=arguments.length<3;return e(n,mi(t,4),r,u,ds)}function mf(n,t){return(bh(n)?i:te)(n,Uf(mi(t,3)))}function xf(n){return(bh(n)?Ir:iu)(n)}function jf(n,t,r){return t=(r?Ui(n,t,r):t===X)?1:kc(t),
(bh(n)?Rr:ou)(n,t)}function Af(n){return(bh(n)?zr:cu)(n)}function kf(n){if(null==n)return 0;if(Hf(n))return dc(n)?V(n):n.length;var t=zs(n);return t==Gn||t==tt?n.size:Me(n).length}function Of(n,t,r){var e=bh(n)?h:lu;return r&&Ui(n,t,r)&&(t=X),e(n,mi(t,3))}function If(n,t){if("function"!=typeof t)throw new pl(en);return n=kc(n),function(){if(--n<1)return t.apply(this,arguments)}}function Rf(n,t,r){return t=r?X:t,t=n&&null==t?n.length:t,ai(n,mn,X,X,X,X,t)}function zf(n,t){var r;if("function"!=typeof t)throw new pl(en);
return n=kc(n),function(){return--n>0&&(r=t.apply(this,arguments)),n<=1&&(t=X),r}}function Ef(n,t,r){t=r?X:t;var e=ai(n,yn,X,X,X,X,X,t);return e.placeholder=Ef.placeholder,e}function Sf(n,t,r){t=r?X:t;var e=ai(n,dn,X,X,X,X,X,t);return e.placeholder=Sf.placeholder,e}function Wf(n,t,r){function e(t){var r=h,e=p;return h=p=X,d=t,v=n.apply(e,r)}function u(n){return d=n,g=Ws(f,t),b?e(n):v}function i(n){var r=n-y,e=n-d,u=t-r;return w?Hl(u,_-e):u}function o(n){var r=n-y,e=n-d;return y===X||r>=t||r<0||w&&e>=_;
}function f(){var n=fh();return o(n)?c(n):(g=Ws(f,i(n)),X)}function c(n){return g=X,m&&h?e(n):(h=p=X,v)}function a(){g!==X&&As(g),d=0,h=y=p=g=X}function l(){return g===X?v:c(fh())}function s(){var n=fh(),r=o(n);if(h=arguments,p=this,y=n,r){if(g===X)return u(y);if(w)return As(g),g=Ws(f,t),e(y)}return g===X&&(g=Ws(f,t)),v}var h,p,_,v,g,y,d=0,b=!1,w=!1,m=!0;if("function"!=typeof n)throw new pl(en);return t=Ic(t)||0,fc(r)&&(b=!!r.leading,w="maxWait"in r,_=w?Gl(Ic(r.maxWait)||0,t):_,m="trailing"in r?!!r.trailing:m),
s.cancel=a,s.flush=l,s}function Lf(n){return ai(n,jn)}function Cf(n,t){if("function"!=typeof n||null!=t&&"function"!=typeof t)throw new pl(en);var r=function(){var e=arguments,u=t?t.apply(this,e):e[0],i=r.cache;if(i.has(u))return i.get(u);var o=n.apply(this,e);return r.cache=i.set(u,o)||i,o};return r.cache=new(Cf.Cache||sr),r}function Uf(n){if("function"!=typeof n)throw new pl(en);return function(){var t=arguments;switch(t.length){case 0:return!n.call(this);case 1:return!n.call(this,t[0]);case 2:
return!n.call(this,t[0],t[1]);case 3:return!n.call(this,t[0],t[1],t[2])}return!n.apply(this,t)}}function Bf(n){return zf(2,n)}function Tf(n,t){if("function"!=typeof n)throw new pl(en);return t=t===X?t:kc(t),uu(n,t)}function $f(t,r){if("function"!=typeof t)throw new pl(en);return r=null==r?0:Gl(kc(r),0),uu(function(e){var u=e[r],i=Ou(e,0,r);return u&&a(i,u),n(t,this,i)})}function Df(n,t,r){var e=!0,u=!0;if("function"!=typeof n)throw new pl(en);return fc(r)&&(e="leading"in r?!!r.leading:e,u="trailing"in r?!!r.trailing:u),
Wf(n,t,{leading:e,maxWait:t,trailing:u})}function Mf(n){return Rf(n,1)}function Ff(n,t){return ph(Au(t),n)}function Nf(){if(!arguments.length)return[];var n=arguments[0];return bh(n)?n:[n]}function Pf(n){return Fr(n,sn)}function qf(n,t){return t="function"==typeof t?t:X,Fr(n,sn,t)}function Zf(n){return Fr(n,an|sn)}function Kf(n,t){return t="function"==typeof t?t:X,Fr(n,an|sn,t)}function Vf(n,t){return null==t||Pr(n,t,Pc(t))}function Gf(n,t){return n===t||n!==n&&t!==t}function Hf(n){return null!=n&&oc(n.length)&&!uc(n);
}function Jf(n){return cc(n)&&Hf(n)}function Yf(n){return n===!0||n===!1||cc(n)&&we(n)==Nn}function Qf(n){return cc(n)&&1===n.nodeType&&!gc(n)}function Xf(n){if(null==n)return!0;if(Hf(n)&&(bh(n)||"string"==typeof n||"function"==typeof n.splice||mh(n)||Oh(n)||dh(n)))return!n.length;var t=zs(n);if(t==Gn||t==tt)return!n.size;if(Mi(n))return!Me(n).length;for(var r in n)if(bl.call(n,r))return!1;return!0}function nc(n,t){return Se(n,t)}function tc(n,t,r){r="function"==typeof r?r:X;var e=r?r(n,t):X;return e===X?Se(n,t,X,r):!!e;
}function rc(n){if(!cc(n))return!1;var t=we(n);return t==Zn||t==qn||"string"==typeof n.message&&"string"==typeof n.name&&!gc(n)}function ec(n){return"number"==typeof n&&Zl(n)}function uc(n){if(!fc(n))return!1;var t=we(n);return t==Kn||t==Vn||t==Fn||t==Xn}function ic(n){return"number"==typeof n&&n==kc(n)}function oc(n){return"number"==typeof n&&n>-1&&n%1==0&&n<=Wn}function fc(n){var t=typeof n;return null!=n&&("object"==t||"function"==t)}function cc(n){return null!=n&&"object"==typeof n}function ac(n,t){
return n===t||Ce(n,t,ji(t))}function lc(n,t,r){return r="function"==typeof r?r:X,Ce(n,t,ji(t),r)}function sc(n){return vc(n)&&n!=+n}function hc(n){if(Es(n))throw new fl(rn);return Ue(n)}function pc(n){return null===n}function _c(n){return null==n}function vc(n){return"number"==typeof n||cc(n)&&we(n)==Hn}function gc(n){if(!cc(n)||we(n)!=Yn)return!1;var t=El(n);if(null===t)return!0;var r=bl.call(t,"constructor")&&t.constructor;return"function"==typeof r&&r instanceof r&&dl.call(r)==jl}function yc(n){
return ic(n)&&n>=-Wn&&n<=Wn}function dc(n){return"string"==typeof n||!bh(n)&&cc(n)&&we(n)==rt}function bc(n){return"symbol"==typeof n||cc(n)&&we(n)==et}function wc(n){return n===X}function mc(n){return cc(n)&&zs(n)==it}function xc(n){return cc(n)&&we(n)==ot}function jc(n){if(!n)return[];if(Hf(n))return dc(n)?G(n):Tu(n);if(Ul&&n[Ul])return D(n[Ul]());var t=zs(n);return(t==Gn?M:t==tt?P:ra)(n)}function Ac(n){if(!n)return 0===n?n:0;if(n=Ic(n),n===Sn||n===-Sn){return(n<0?-1:1)*Ln}return n===n?n:0}function kc(n){
var t=Ac(n),r=t%1;return t===t?r?t-r:t:0}function Oc(n){return n?Mr(kc(n),0,Un):0}function Ic(n){if("number"==typeof n)return n;if(bc(n))return Cn;if(fc(n)){var t="function"==typeof n.valueOf?n.valueOf():n;n=fc(t)?t+"":t}if("string"!=typeof n)return 0===n?n:+n;n=R(n);var r=qt.test(n);return r||Kt.test(n)?Xr(n.slice(2),r?2:8):Pt.test(n)?Cn:+n}function Rc(n){return $u(n,qc(n))}function zc(n){return n?Mr(kc(n),-Wn,Wn):0===n?n:0}function Ec(n){return null==n?"":vu(n)}function Sc(n,t){var r=gs(n);return null==t?r:Cr(r,t);
}function Wc(n,t){return v(n,mi(t,3),ue)}function Lc(n,t){return v(n,mi(t,3),oe)}function Cc(n,t){return null==n?n:bs(n,mi(t,3),qc)}function Uc(n,t){return null==n?n:ws(n,mi(t,3),qc)}function Bc(n,t){return n&&ue(n,mi(t,3))}function Tc(n,t){return n&&oe(n,mi(t,3))}function $c(n){return null==n?[]:fe(n,Pc(n))}function Dc(n){return null==n?[]:fe(n,qc(n))}function Mc(n,t,r){var e=null==n?X:_e(n,t);return e===X?r:e}function Fc(n,t){return null!=n&&Ri(n,t,xe)}function Nc(n,t){return null!=n&&Ri(n,t,je);
}function Pc(n){return Hf(n)?Or(n):Me(n)}function qc(n){return Hf(n)?Or(n,!0):Fe(n)}function Zc(n,t){var r={};return t=mi(t,3),ue(n,function(n,e,u){Br(r,t(n,e,u),n)}),r}function Kc(n,t){var r={};return t=mi(t,3),ue(n,function(n,e,u){Br(r,e,t(n,e,u))}),r}function Vc(n,t){return Gc(n,Uf(mi(t)))}function Gc(n,t){if(null==n)return{};var r=c(di(n),function(n){return[n]});return t=mi(t),Ye(n,r,function(n,r){return t(n,r[0])})}function Hc(n,t,r){t=ku(t,n);var e=-1,u=t.length;for(u||(u=1,n=X);++e<u;){var i=null==n?X:n[no(t[e])];
i===X&&(e=u,i=r),n=uc(i)?i.call(n):i}return n}function Jc(n,t,r){return null==n?n:fu(n,t,r)}function Yc(n,t,r,e){return e="function"==typeof e?e:X,null==n?n:fu(n,t,r,e)}function Qc(n,t,e){var u=bh(n),i=u||mh(n)||Oh(n);if(t=mi(t,4),null==e){var o=n&&n.constructor;e=i?u?new o:[]:fc(n)&&uc(o)?gs(El(n)):{}}return(i?r:ue)(n,function(n,r,u){return t(e,n,r,u)}),e}function Xc(n,t){return null==n||yu(n,t)}function na(n,t,r){return null==n?n:du(n,t,Au(r))}function ta(n,t,r,e){return e="function"==typeof e?e:X,
null==n?n:du(n,t,Au(r),e)}function ra(n){return null==n?[]:E(n,Pc(n))}function ea(n){return null==n?[]:E(n,qc(n))}function ua(n,t,r){return r===X&&(r=t,t=X),r!==X&&(r=Ic(r),r=r===r?r:0),t!==X&&(t=Ic(t),t=t===t?t:0),Mr(Ic(n),t,r)}function ia(n,t,r){return t=Ac(t),r===X?(r=t,t=0):r=Ac(r),n=Ic(n),Ae(n,t,r)}function oa(n,t,r){if(r&&"boolean"!=typeof r&&Ui(n,t,r)&&(t=r=X),r===X&&("boolean"==typeof t?(r=t,t=X):"boolean"==typeof n&&(r=n,n=X)),n===X&&t===X?(n=0,t=1):(n=Ac(n),t===X?(t=n,n=0):t=Ac(t)),n>t){
var e=n;n=t,t=e}if(r||n%1||t%1){var u=Ql();return Hl(n+u*(t-n+Qr("1e-"+((u+"").length-1))),t)}return tu(n,t)}function fa(n){return Qh(Ec(n).toLowerCase())}function ca(n){return n=Ec(n),n&&n.replace(Gt,ve).replace(Dr,"")}function aa(n,t,r){n=Ec(n),t=vu(t);var e=n.length;r=r===X?e:Mr(kc(r),0,e);var u=r;return r-=t.length,r>=0&&n.slice(r,u)==t}function la(n){return n=Ec(n),n&&At.test(n)?n.replace(xt,ge):n}function sa(n){return n=Ec(n),n&&Wt.test(n)?n.replace(St,"\\$&"):n}function ha(n,t,r){n=Ec(n),t=kc(t);
var e=t?V(n):0;if(!t||e>=t)return n;var u=(t-e)/2;return ri(Nl(u),r)+n+ri(Fl(u),r)}function pa(n,t,r){n=Ec(n),t=kc(t);var e=t?V(n):0;return t&&e<t?n+ri(t-e,r):n}function _a(n,t,r){n=Ec(n),t=kc(t);var e=t?V(n):0;return t&&e<t?ri(t-e,r)+n:n}function va(n,t,r){return r||null==t?t=0:t&&(t=+t),Yl(Ec(n).replace(Lt,""),t||0)}function ga(n,t,r){return t=(r?Ui(n,t,r):t===X)?1:kc(t),eu(Ec(n),t)}function ya(){var n=arguments,t=Ec(n[0]);return n.length<3?t:t.replace(n[1],n[2])}function da(n,t,r){return r&&"number"!=typeof r&&Ui(n,t,r)&&(t=r=X),
(r=r===X?Un:r>>>0)?(n=Ec(n),n&&("string"==typeof t||null!=t&&!Ah(t))&&(t=vu(t),!t&&T(n))?Ou(G(n),0,r):n.split(t,r)):[]}function ba(n,t,r){return n=Ec(n),r=null==r?0:Mr(kc(r),0,n.length),t=vu(t),n.slice(r,r+t.length)==t}function wa(n,t,r){var e=Z.templateSettings;r&&Ui(n,t,r)&&(t=X),n=Ec(n),t=Sh({},t,e,li);var u,i,o=Sh({},t.imports,e.imports,li),f=Pc(o),c=E(o,f),a=0,l=t.interpolate||Ht,s="__p += '",h=sl((t.escape||Ht).source+"|"+l.source+"|"+(l===It?Ft:Ht).source+"|"+(t.evaluate||Ht).source+"|$","g"),p="//# sourceURL="+(bl.call(t,"sourceURL")?(t.sourceURL+"").replace(/\s/g," "):"lodash.templateSources["+ ++Zr+"]")+"\n";
n.replace(h,function(t,r,e,o,f,c){return e||(e=o),s+=n.slice(a,c).replace(Jt,U),r&&(u=!0,s+="' +\n__e("+r+") +\n'"),f&&(i=!0,s+="';\n"+f+";\n__p += '"),e&&(s+="' +\n((__t = ("+e+")) == null ? '' : __t) +\n'"),a=c+t.length,t}),s+="';\n";var _=bl.call(t,"variable")&&t.variable;if(_){if(Dt.test(_))throw new fl(un)}else s="with (obj) {\n"+s+"\n}\n";s=(i?s.replace(dt,""):s).replace(bt,"$1").replace(wt,"$1;"),s="function("+(_||"obj")+") {\n"+(_?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(u?", __e = _.escape":"")+(i?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+s+"return __p\n}";
var v=Xh(function(){return cl(f,p+"return "+s).apply(X,c)});if(v.source=s,rc(v))throw v;return v}function ma(n){return Ec(n).toLowerCase()}function xa(n){return Ec(n).toUpperCase()}function ja(n,t,r){if(n=Ec(n),n&&(r||t===X))return R(n);if(!n||!(t=vu(t)))return n;var e=G(n),u=G(t);return Ou(e,W(e,u),L(e,u)+1).join("")}function Aa(n,t,r){if(n=Ec(n),n&&(r||t===X))return n.slice(0,H(n)+1);if(!n||!(t=vu(t)))return n;var e=G(n);return Ou(e,0,L(e,G(t))+1).join("")}function ka(n,t,r){if(n=Ec(n),n&&(r||t===X))return n.replace(Lt,"");
if(!n||!(t=vu(t)))return n;var e=G(n);return Ou(e,W(e,G(t))).join("")}function Oa(n,t){var r=An,e=kn;if(fc(t)){var u="separator"in t?t.separator:u;r="length"in t?kc(t.length):r,e="omission"in t?vu(t.omission):e}n=Ec(n);var i=n.length;if(T(n)){var o=G(n);i=o.length}if(r>=i)return n;var f=r-V(e);if(f<1)return e;var c=o?Ou(o,0,f).join(""):n.slice(0,f);if(u===X)return c+e;if(o&&(f+=c.length-f),Ah(u)){if(n.slice(f).search(u)){var a,l=c;for(u.global||(u=sl(u.source,Ec(Nt.exec(u))+"g")),u.lastIndex=0;a=u.exec(l);)var s=a.index;
c=c.slice(0,s===X?f:s)}}else if(n.indexOf(vu(u),f)!=f){var h=c.lastIndexOf(u);h>-1&&(c=c.slice(0,h))}return c+e}function Ia(n){return n=Ec(n),n&&jt.test(n)?n.replace(mt,ye):n}function Ra(n,t,r){return n=Ec(n),t=r?X:t,t===X?$(n)?Q(n):_(n):n.match(t)||[]}function za(t){var r=null==t?0:t.length,e=mi();return t=r?c(t,function(n){if("function"!=typeof n[1])throw new pl(en);return[e(n[0]),n[1]]}):[],uu(function(e){for(var u=-1;++u<r;){var i=t[u];if(n(i[0],this,e))return n(i[1],this,e)}})}function Ea(n){
return Nr(Fr(n,an))}function Sa(n){return function(){return n}}function Wa(n,t){return null==n||n!==n?t:n}function La(n){return n}function Ca(n){return De("function"==typeof n?n:Fr(n,an))}function Ua(n){return qe(Fr(n,an))}function Ba(n,t){return Ze(n,Fr(t,an))}function Ta(n,t,e){var u=Pc(t),i=fe(t,u);null!=e||fc(t)&&(i.length||!u.length)||(e=t,t=n,n=this,i=fe(t,Pc(t)));var o=!(fc(e)&&"chain"in e&&!e.chain),f=uc(n);return r(i,function(r){var e=t[r];n[r]=e,f&&(n.prototype[r]=function(){var t=this.__chain__;
if(o||t){var r=n(this.__wrapped__);return(r.__actions__=Tu(this.__actions__)).push({func:e,args:arguments,thisArg:n}),r.__chain__=t,r}return e.apply(n,a([this.value()],arguments))})}),n}function $a(){return re._===this&&(re._=Al),this}function Da(){}function Ma(n){return n=kc(n),uu(function(t){return Ge(t,n)})}function Fa(n){return Bi(n)?m(no(n)):Qe(n)}function Na(n){return function(t){return null==n?X:_e(n,t)}}function Pa(){return[]}function qa(){return!1}function Za(){return{}}function Ka(){return"";
}function Va(){return!0}function Ga(n,t){if(n=kc(n),n<1||n>Wn)return[];var r=Un,e=Hl(n,Un);t=mi(t),n-=Un;for(var u=O(e,t);++r<n;)t(r);return u}function Ha(n){return bh(n)?c(n,no):bc(n)?[n]:Tu(Cs(Ec(n)))}function Ja(n){var t=++wl;return Ec(n)+t}function Ya(n){return n&&n.length?Yr(n,La,me):X}function Qa(n,t){return n&&n.length?Yr(n,mi(t,2),me):X}function Xa(n){return w(n,La)}function nl(n,t){return w(n,mi(t,2))}function tl(n){return n&&n.length?Yr(n,La,Ne):X}function rl(n,t){return n&&n.length?Yr(n,mi(t,2),Ne):X;
}function el(n){return n&&n.length?k(n,La):0}function ul(n,t){return n&&n.length?k(n,mi(t,2)):0}x=null==x?re:be.defaults(re.Object(),x,be.pick(re,qr));var il=x.Array,ol=x.Date,fl=x.Error,cl=x.Function,al=x.Math,ll=x.Object,sl=x.RegExp,hl=x.String,pl=x.TypeError,_l=il.prototype,vl=cl.prototype,gl=ll.prototype,yl=x["__core-js_shared__"],dl=vl.toString,bl=gl.hasOwnProperty,wl=0,ml=function(){var n=/[^.]+$/.exec(yl&&yl.keys&&yl.keys.IE_PROTO||"");return n?"Symbol(src)_1."+n:""}(),xl=gl.toString,jl=dl.call(ll),Al=re._,kl=sl("^"+dl.call(bl).replace(St,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Ol=ie?x.Buffer:X,Il=x.Symbol,Rl=x.Uint8Array,zl=Ol?Ol.allocUnsafe:X,El=F(ll.getPrototypeOf,ll),Sl=ll.create,Wl=gl.propertyIsEnumerable,Ll=_l.splice,Cl=Il?Il.isConcatSpreadable:X,Ul=Il?Il.iterator:X,Bl=Il?Il.toStringTag:X,Tl=function(){
try{var n=Ai(ll,"defineProperty");return n({},"",{}),n}catch(n){}}(),$l=x.clearTimeout!==re.clearTimeout&&x.clearTimeout,Dl=ol&&ol.now!==re.Date.now&&ol.now,Ml=x.setTimeout!==re.setTimeout&&x.setTimeout,Fl=al.ceil,Nl=al.floor,Pl=ll.getOwnPropertySymbols,ql=Ol?Ol.isBuffer:X,Zl=x.isFinite,Kl=_l.join,Vl=F(ll.keys,ll),Gl=al.max,Hl=al.min,Jl=ol.now,Yl=x.parseInt,Ql=al.random,Xl=_l.reverse,ns=Ai(x,"DataView"),ts=Ai(x,"Map"),rs=Ai(x,"Promise"),es=Ai(x,"Set"),us=Ai(x,"WeakMap"),is=Ai(ll,"create"),os=us&&new us,fs={},cs=to(ns),as=to(ts),ls=to(rs),ss=to(es),hs=to(us),ps=Il?Il.prototype:X,_s=ps?ps.valueOf:X,vs=ps?ps.toString:X,gs=function(){
function n(){}return function(t){if(!fc(t))return{};if(Sl)return Sl(t);n.prototype=t;var r=new n;return n.prototype=X,r}}();Z.templateSettings={escape:kt,evaluate:Ot,interpolate:It,variable:"",imports:{_:Z}},Z.prototype=J.prototype,Z.prototype.constructor=Z,Y.prototype=gs(J.prototype),Y.prototype.constructor=Y,Ct.prototype=gs(J.prototype),Ct.prototype.constructor=Ct,Xt.prototype.clear=nr,Xt.prototype.delete=tr,Xt.prototype.get=rr,Xt.prototype.has=er,Xt.prototype.set=ur,ir.prototype.clear=or,ir.prototype.delete=fr,
ir.prototype.get=cr,ir.prototype.has=ar,ir.prototype.set=lr,sr.prototype.clear=hr,sr.prototype.delete=pr,sr.prototype.get=_r,sr.prototype.has=vr,sr.prototype.set=gr,yr.prototype.add=yr.prototype.push=dr,yr.prototype.has=br,wr.prototype.clear=mr,wr.prototype.delete=xr,wr.prototype.get=jr,wr.prototype.has=Ar,wr.prototype.set=kr;var ys=Pu(ue),ds=Pu(oe,!0),bs=qu(),ws=qu(!0),ms=os?function(n,t){return os.set(n,t),n}:La,xs=Tl?function(n,t){return Tl(n,"toString",{configurable:!0,enumerable:!1,value:Sa(t),
writable:!0})}:La,js=uu,As=$l||function(n){return re.clearTimeout(n)},ks=es&&1/P(new es([,-0]))[1]==Sn?function(n){return new es(n)}:Da,Os=os?function(n){return os.get(n)}:Da,Is=Pl?function(n){return null==n?[]:(n=ll(n),i(Pl(n),function(t){return Wl.call(n,t)}))}:Pa,Rs=Pl?function(n){for(var t=[];n;)a(t,Is(n)),n=El(n);return t}:Pa,zs=we;(ns&&zs(new ns(new ArrayBuffer(1)))!=ct||ts&&zs(new ts)!=Gn||rs&&zs(rs.resolve())!=Qn||es&&zs(new es)!=tt||us&&zs(new us)!=it)&&(zs=function(n){var t=we(n),r=t==Yn?n.constructor:X,e=r?to(r):"";
if(e)switch(e){case cs:return ct;case as:return Gn;case ls:return Qn;case ss:return tt;case hs:return it}return t});var Es=yl?uc:qa,Ss=Qi(ms),Ws=Ml||function(n,t){return re.setTimeout(n,t)},Ls=Qi(xs),Cs=Pi(function(n){var t=[];return 46===n.charCodeAt(0)&&t.push(""),n.replace(Et,function(n,r,e,u){t.push(e?u.replace(Mt,"$1"):r||n)}),t}),Us=uu(function(n,t){return Jf(n)?Hr(n,ee(t,1,Jf,!0)):[]}),Bs=uu(function(n,t){var r=jo(t);return Jf(r)&&(r=X),Jf(n)?Hr(n,ee(t,1,Jf,!0),mi(r,2)):[]}),Ts=uu(function(n,t){
var r=jo(t);return Jf(r)&&(r=X),Jf(n)?Hr(n,ee(t,1,Jf,!0),X,r):[]}),$s=uu(function(n){var t=c(n,ju);return t.length&&t[0]===n[0]?ke(t):[]}),Ds=uu(function(n){var t=jo(n),r=c(n,ju);return t===jo(r)?t=X:r.pop(),r.length&&r[0]===n[0]?ke(r,mi(t,2)):[]}),Ms=uu(function(n){var t=jo(n),r=c(n,ju);return t="function"==typeof t?t:X,t&&r.pop(),r.length&&r[0]===n[0]?ke(r,X,t):[]}),Fs=uu(Oo),Ns=gi(function(n,t){var r=null==n?0:n.length,e=Tr(n,t);return nu(n,c(t,function(n){return Ci(n,r)?+n:n}).sort(Lu)),e}),Ps=uu(function(n){
return gu(ee(n,1,Jf,!0))}),qs=uu(function(n){var t=jo(n);return Jf(t)&&(t=X),gu(ee(n,1,Jf,!0),mi(t,2))}),Zs=uu(function(n){var t=jo(n);return t="function"==typeof t?t:X,gu(ee(n,1,Jf,!0),X,t)}),Ks=uu(function(n,t){return Jf(n)?Hr(n,t):[]}),Vs=uu(function(n){return mu(i(n,Jf))}),Gs=uu(function(n){var t=jo(n);return Jf(t)&&(t=X),mu(i(n,Jf),mi(t,2))}),Hs=uu(function(n){var t=jo(n);return t="function"==typeof t?t:X,mu(i(n,Jf),X,t)}),Js=uu(Go),Ys=uu(function(n){var t=n.length,r=t>1?n[t-1]:X;return r="function"==typeof r?(n.pop(),
r):X,Ho(n,r)}),Qs=gi(function(n){var t=n.length,r=t?n[0]:0,e=this.__wrapped__,u=function(t){return Tr(t,n)};return!(t>1||this.__actions__.length)&&e instanceof Ct&&Ci(r)?(e=e.slice(r,+r+(t?1:0)),e.__actions__.push({func:nf,args:[u],thisArg:X}),new Y(e,this.__chain__).thru(function(n){return t&&!n.length&&n.push(X),n})):this.thru(u)}),Xs=Fu(function(n,t,r){bl.call(n,r)?++n[r]:Br(n,r,1)}),nh=Ju(ho),th=Ju(po),rh=Fu(function(n,t,r){bl.call(n,r)?n[r].push(t):Br(n,r,[t])}),eh=uu(function(t,r,e){var u=-1,i="function"==typeof r,o=Hf(t)?il(t.length):[];
return ys(t,function(t){o[++u]=i?n(r,t,e):Ie(t,r,e)}),o}),uh=Fu(function(n,t,r){Br(n,r,t)}),ih=Fu(function(n,t,r){n[r?0:1].push(t)},function(){return[[],[]]}),oh=uu(function(n,t){if(null==n)return[];var r=t.length;return r>1&&Ui(n,t[0],t[1])?t=[]:r>2&&Ui(t[0],t[1],t[2])&&(t=[t[0]]),He(n,ee(t,1),[])}),fh=Dl||function(){return re.Date.now()},ch=uu(function(n,t,r){var e=_n;if(r.length){var u=N(r,wi(ch));e|=bn}return ai(n,e,t,r,u)}),ah=uu(function(n,t,r){var e=_n|vn;if(r.length){var u=N(r,wi(ah));e|=bn;
}return ai(t,e,n,r,u)}),lh=uu(function(n,t){return Gr(n,1,t)}),sh=uu(function(n,t,r){return Gr(n,Ic(t)||0,r)});Cf.Cache=sr;var hh=js(function(t,r){r=1==r.length&&bh(r[0])?c(r[0],z(mi())):c(ee(r,1),z(mi()));var e=r.length;return uu(function(u){for(var i=-1,o=Hl(u.length,e);++i<o;)u[i]=r[i].call(this,u[i]);return n(t,this,u)})}),ph=uu(function(n,t){return ai(n,bn,X,t,N(t,wi(ph)))}),_h=uu(function(n,t){return ai(n,wn,X,t,N(t,wi(_h)))}),vh=gi(function(n,t){return ai(n,xn,X,X,X,t)}),gh=ii(me),yh=ii(function(n,t){
return n>=t}),dh=Re(function(){return arguments}())?Re:function(n){return cc(n)&&bl.call(n,"callee")&&!Wl.call(n,"callee")},bh=il.isArray,wh=ce?z(ce):ze,mh=ql||qa,xh=ae?z(ae):Ee,jh=le?z(le):Le,Ah=se?z(se):Be,kh=he?z(he):Te,Oh=pe?z(pe):$e,Ih=ii(Ne),Rh=ii(function(n,t){return n<=t}),zh=Nu(function(n,t){if(Mi(t)||Hf(t))return $u(t,Pc(t),n),X;for(var r in t)bl.call(t,r)&&Sr(n,r,t[r])}),Eh=Nu(function(n,t){$u(t,qc(t),n)}),Sh=Nu(function(n,t,r,e){$u(t,qc(t),n,e)}),Wh=Nu(function(n,t,r,e){$u(t,Pc(t),n,e);
}),Lh=gi(Tr),Ch=uu(function(n,t){n=ll(n);var r=-1,e=t.length,u=e>2?t[2]:X;for(u&&Ui(t[0],t[1],u)&&(e=1);++r<e;)for(var i=t[r],o=qc(i),f=-1,c=o.length;++f<c;){var a=o[f],l=n[a];(l===X||Gf(l,gl[a])&&!bl.call(n,a))&&(n[a]=i[a])}return n}),Uh=uu(function(t){return t.push(X,si),n(Mh,X,t)}),Bh=Xu(function(n,t,r){null!=t&&"function"!=typeof t.toString&&(t=xl.call(t)),n[t]=r},Sa(La)),Th=Xu(function(n,t,r){null!=t&&"function"!=typeof t.toString&&(t=xl.call(t)),bl.call(n,t)?n[t].push(r):n[t]=[r]},mi),$h=uu(Ie),Dh=Nu(function(n,t,r){
Ke(n,t,r)}),Mh=Nu(function(n,t,r,e){Ke(n,t,r,e)}),Fh=gi(function(n,t){var r={};if(null==n)return r;var e=!1;t=c(t,function(t){return t=ku(t,n),e||(e=t.length>1),t}),$u(n,di(n),r),e&&(r=Fr(r,an|ln|sn,hi));for(var u=t.length;u--;)yu(r,t[u]);return r}),Nh=gi(function(n,t){return null==n?{}:Je(n,t)}),Ph=ci(Pc),qh=ci(qc),Zh=Vu(function(n,t,r){return t=t.toLowerCase(),n+(r?fa(t):t)}),Kh=Vu(function(n,t,r){return n+(r?"-":"")+t.toLowerCase()}),Vh=Vu(function(n,t,r){return n+(r?" ":"")+t.toLowerCase()}),Gh=Ku("toLowerCase"),Hh=Vu(function(n,t,r){
return n+(r?"_":"")+t.toLowerCase()}),Jh=Vu(function(n,t,r){return n+(r?" ":"")+Qh(t)}),Yh=Vu(function(n,t,r){return n+(r?" ":"")+t.toUpperCase()}),Qh=Ku("toUpperCase"),Xh=uu(function(t,r){try{return n(t,X,r)}catch(n){return rc(n)?n:new fl(n)}}),np=gi(function(n,t){return r(t,function(t){t=no(t),Br(n,t,ch(n[t],n))}),n}),tp=Yu(),rp=Yu(!0),ep=uu(function(n,t){return function(r){return Ie(r,n,t)}}),up=uu(function(n,t){return function(r){return Ie(n,r,t)}}),ip=ti(c),op=ti(u),fp=ti(h),cp=ui(),ap=ui(!0),lp=ni(function(n,t){
return n+t},0),sp=fi("ceil"),hp=ni(function(n,t){return n/t},1),pp=fi("floor"),_p=ni(function(n,t){return n*t},1),vp=fi("round"),gp=ni(function(n,t){return n-t},0);return Z.after=If,Z.ary=Rf,Z.assign=zh,Z.assignIn=Eh,Z.assignInWith=Sh,Z.assignWith=Wh,Z.at=Lh,Z.before=zf,Z.bind=ch,Z.bindAll=np,Z.bindKey=ah,Z.castArray=Nf,Z.chain=Qo,Z.chunk=uo,Z.compact=io,Z.concat=oo,Z.cond=za,Z.conforms=Ea,Z.constant=Sa,Z.countBy=Xs,Z.create=Sc,Z.curry=Ef,Z.curryRight=Sf,Z.debounce=Wf,Z.defaults=Ch,Z.defaultsDeep=Uh,
Z.defer=lh,Z.delay=sh,Z.difference=Us,Z.differenceBy=Bs,Z.differenceWith=Ts,Z.drop=fo,Z.dropRight=co,Z.dropRightWhile=ao,Z.dropWhile=lo,Z.fill=so,Z.filter=lf,Z.flatMap=sf,Z.flatMapDeep=hf,Z.flatMapDepth=pf,Z.flatten=_o,Z.flattenDeep=vo,Z.flattenDepth=go,Z.flip=Lf,Z.flow=tp,Z.flowRight=rp,Z.fromPairs=yo,Z.functions=$c,Z.functionsIn=Dc,Z.groupBy=rh,Z.initial=mo,Z.intersection=$s,Z.intersectionBy=Ds,Z.intersectionWith=Ms,Z.invert=Bh,Z.invertBy=Th,Z.invokeMap=eh,Z.iteratee=Ca,Z.keyBy=uh,Z.keys=Pc,Z.keysIn=qc,
Z.map=yf,Z.mapKeys=Zc,Z.mapValues=Kc,Z.matches=Ua,Z.matchesProperty=Ba,Z.memoize=Cf,Z.merge=Dh,Z.mergeWith=Mh,Z.method=ep,Z.methodOf=up,Z.mixin=Ta,Z.negate=Uf,Z.nthArg=Ma,Z.omit=Fh,Z.omitBy=Vc,Z.once=Bf,Z.orderBy=df,Z.over=ip,Z.overArgs=hh,Z.overEvery=op,Z.overSome=fp,Z.partial=ph,Z.partialRight=_h,Z.partition=ih,Z.pick=Nh,Z.pickBy=Gc,Z.property=Fa,Z.propertyOf=Na,Z.pull=Fs,Z.pullAll=Oo,Z.pullAllBy=Io,Z.pullAllWith=Ro,Z.pullAt=Ns,Z.range=cp,Z.rangeRight=ap,Z.rearg=vh,Z.reject=mf,Z.remove=zo,Z.rest=Tf,
Z.reverse=Eo,Z.sampleSize=jf,Z.set=Jc,Z.setWith=Yc,Z.shuffle=Af,Z.slice=So,Z.sortBy=oh,Z.sortedUniq=$o,Z.sortedUniqBy=Do,Z.split=da,Z.spread=$f,Z.tail=Mo,Z.take=Fo,Z.takeRight=No,Z.takeRightWhile=Po,Z.takeWhile=qo,Z.tap=Xo,Z.throttle=Df,Z.thru=nf,Z.toArray=jc,Z.toPairs=Ph,Z.toPairsIn=qh,Z.toPath=Ha,Z.toPlainObject=Rc,Z.transform=Qc,Z.unary=Mf,Z.union=Ps,Z.unionBy=qs,Z.unionWith=Zs,Z.uniq=Zo,Z.uniqBy=Ko,Z.uniqWith=Vo,Z.unset=Xc,Z.unzip=Go,Z.unzipWith=Ho,Z.update=na,Z.updateWith=ta,Z.values=ra,Z.valuesIn=ea,
Z.without=Ks,Z.words=Ra,Z.wrap=Ff,Z.xor=Vs,Z.xorBy=Gs,Z.xorWith=Hs,Z.zip=Js,Z.zipObject=Jo,Z.zipObjectDeep=Yo,Z.zipWith=Ys,Z.entries=Ph,Z.entriesIn=qh,Z.extend=Eh,Z.extendWith=Sh,Ta(Z,Z),Z.add=lp,Z.attempt=Xh,Z.camelCase=Zh,Z.capitalize=fa,Z.ceil=sp,Z.clamp=ua,Z.clone=Pf,Z.cloneDeep=Zf,Z.cloneDeepWith=Kf,Z.cloneWith=qf,Z.conformsTo=Vf,Z.deburr=ca,Z.defaultTo=Wa,Z.divide=hp,Z.endsWith=aa,Z.eq=Gf,Z.escape=la,Z.escapeRegExp=sa,Z.every=af,Z.find=nh,Z.findIndex=ho,Z.findKey=Wc,Z.findLast=th,Z.findLastIndex=po,
Z.findLastKey=Lc,Z.floor=pp,Z.forEach=_f,Z.forEachRight=vf,Z.forIn=Cc,Z.forInRight=Uc,Z.forOwn=Bc,Z.forOwnRight=Tc,Z.get=Mc,Z.gt=gh,Z.gte=yh,Z.has=Fc,Z.hasIn=Nc,Z.head=bo,Z.identity=La,Z.includes=gf,Z.indexOf=wo,Z.inRange=ia,Z.invoke=$h,Z.isArguments=dh,Z.isArray=bh,Z.isArrayBuffer=wh,Z.isArrayLike=Hf,Z.isArrayLikeObject=Jf,Z.isBoolean=Yf,Z.isBuffer=mh,Z.isDate=xh,Z.isElement=Qf,Z.isEmpty=Xf,Z.isEqual=nc,Z.isEqualWith=tc,Z.isError=rc,Z.isFinite=ec,Z.isFunction=uc,Z.isInteger=ic,Z.isLength=oc,Z.isMap=jh,
Z.isMatch=ac,Z.isMatchWith=lc,Z.isNaN=sc,Z.isNative=hc,Z.isNil=_c,Z.isNull=pc,Z.isNumber=vc,Z.isObject=fc,Z.isObjectLike=cc,Z.isPlainObject=gc,Z.isRegExp=Ah,Z.isSafeInteger=yc,Z.isSet=kh,Z.isString=dc,Z.isSymbol=bc,Z.isTypedArray=Oh,Z.isUndefined=wc,Z.isWeakMap=mc,Z.isWeakSet=xc,Z.join=xo,Z.kebabCase=Kh,Z.last=jo,Z.lastIndexOf=Ao,Z.lowerCase=Vh,Z.lowerFirst=Gh,Z.lt=Ih,Z.lte=Rh,Z.max=Ya,Z.maxBy=Qa,Z.mean=Xa,Z.meanBy=nl,Z.min=tl,Z.minBy=rl,Z.stubArray=Pa,Z.stubFalse=qa,Z.stubObject=Za,Z.stubString=Ka,
Z.stubTrue=Va,Z.multiply=_p,Z.nth=ko,Z.noConflict=$a,Z.noop=Da,Z.now=fh,Z.pad=ha,Z.padEnd=pa,Z.padStart=_a,Z.parseInt=va,Z.random=oa,Z.reduce=bf,Z.reduceRight=wf,Z.repeat=ga,Z.replace=ya,Z.result=Hc,Z.round=vp,Z.runInContext=p,Z.sample=xf,Z.size=kf,Z.snakeCase=Hh,Z.some=Of,Z.sortedIndex=Wo,Z.sortedIndexBy=Lo,Z.sortedIndexOf=Co,Z.sortedLastIndex=Uo,Z.sortedLastIndexBy=Bo,Z.sortedLastIndexOf=To,Z.startCase=Jh,Z.startsWith=ba,Z.subtract=gp,Z.sum=el,Z.sumBy=ul,Z.template=wa,Z.times=Ga,Z.toFinite=Ac,Z.toInteger=kc,
Z.toLength=Oc,Z.toLower=ma,Z.toNumber=Ic,Z.toSafeInteger=zc,Z.toString=Ec,Z.toUpper=xa,Z.trim=ja,Z.trimEnd=Aa,Z.trimStart=ka,Z.truncate=Oa,Z.unescape=Ia,Z.uniqueId=Ja,Z.upperCase=Yh,Z.upperFirst=Qh,Z.each=_f,Z.eachRight=vf,Z.first=bo,Ta(Z,function(){var n={};return ue(Z,function(t,r){bl.call(Z.prototype,r)||(n[r]=t)}),n}(),{chain:!1}),Z.VERSION=nn,r(["bind","bindKey","curry","curryRight","partial","partialRight"],function(n){Z[n].placeholder=Z}),r(["drop","take"],function(n,t){Ct.prototype[n]=function(r){
r=r===X?1:Gl(kc(r),0);var e=this.__filtered__&&!t?new Ct(this):this.clone();return e.__filtered__?e.__takeCount__=Hl(r,e.__takeCount__):e.__views__.push({size:Hl(r,Un),type:n+(e.__dir__<0?"Right":"")}),e},Ct.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse()}}),r(["filter","map","takeWhile"],function(n,t){var r=t+1,e=r==Rn||r==En;Ct.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({iteratee:mi(n,3),type:r}),t.__filtered__=t.__filtered__||e,t}}),r(["head","last"],function(n,t){
var r="take"+(t?"Right":"");Ct.prototype[n]=function(){return this[r](1).value()[0]}}),r(["initial","tail"],function(n,t){var r="drop"+(t?"":"Right");Ct.prototype[n]=function(){return this.__filtered__?new Ct(this):this[r](1)}}),Ct.prototype.compact=function(){return this.filter(La)},Ct.prototype.find=function(n){return this.filter(n).head()},Ct.prototype.findLast=function(n){return this.reverse().find(n)},Ct.prototype.invokeMap=uu(function(n,t){return"function"==typeof n?new Ct(this):this.map(function(r){
return Ie(r,n,t)})}),Ct.prototype.reject=function(n){return this.filter(Uf(mi(n)))},Ct.prototype.slice=function(n,t){n=kc(n);var r=this;return r.__filtered__&&(n>0||t<0)?new Ct(r):(n<0?r=r.takeRight(-n):n&&(r=r.drop(n)),t!==X&&(t=kc(t),r=t<0?r.dropRight(-t):r.take(t-n)),r)},Ct.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},Ct.prototype.toArray=function(){return this.take(Un)},ue(Ct.prototype,function(n,t){var r=/^(?:filter|find|map|reject)|While$/.test(t),e=/^(?:head|last)$/.test(t),u=Z[e?"take"+("last"==t?"Right":""):t],i=e||/^find/.test(t);
u&&(Z.prototype[t]=function(){var t=this.__wrapped__,o=e?[1]:arguments,f=t instanceof Ct,c=o[0],l=f||bh(t),s=function(n){var t=u.apply(Z,a([n],o));return e&&h?t[0]:t};l&&r&&"function"==typeof c&&1!=c.length&&(f=l=!1);var h=this.__chain__,p=!!this.__actions__.length,_=i&&!h,v=f&&!p;if(!i&&l){t=v?t:new Ct(this);var g=n.apply(t,o);return g.__actions__.push({func:nf,args:[s],thisArg:X}),new Y(g,h)}return _&&v?n.apply(this,o):(g=this.thru(s),_?e?g.value()[0]:g.value():g)})}),r(["pop","push","shift","sort","splice","unshift"],function(n){
var t=_l[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:pop|shift)$/.test(n);Z.prototype[n]=function(){var n=arguments;if(e&&!this.__chain__){var u=this.value();return t.apply(bh(u)?u:[],n)}return this[r](function(r){return t.apply(bh(r)?r:[],n)})}}),ue(Ct.prototype,function(n,t){var r=Z[t];if(r){var e=r.name+"";bl.call(fs,e)||(fs[e]=[]),fs[e].push({name:t,func:r})}}),fs[Qu(X,vn).name]=[{name:"wrapper",func:X}],Ct.prototype.clone=$t,Ct.prototype.reverse=Yt,Ct.prototype.value=Qt,Z.prototype.at=Qs,
Z.prototype.chain=tf,Z.prototype.commit=rf,Z.prototype.next=ef,Z.prototype.plant=of,Z.prototype.reverse=ff,Z.prototype.toJSON=Z.prototype.valueOf=Z.prototype.value=cf,Z.prototype.first=Z.prototype.head,Ul&&(Z.prototype[Ul]=uf),Z},be=de();"function"==typeof define&&"object"==typeof define.amd&&define.amd?(re._=be,define(function(){return be})):ue?((ue.exports=be)._=be,ee._=be):re._=be}).call(this);var createCompounder = require('./_createCompounder');

/**
 * Converts `string`, as space separated words, to lower case.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category String
 * @param {string} [string=''] The string to convert.
 * @returns {string} Returns the lower cased string.
 * @example
 *
 * _.lowerCase('--Foo-Bar--');
 * // => 'foo bar'
 *
 * _.lowerCase('fooBar');
 * // => 'foo bar'
 *
 * _.lowerCase('__FOO_BAR__');
 * // => 'foo bar'
 */
var lowerCase = createCompounder(function(result, word, index) {
  return result + (index ? ' ' : '') + word.toLowerCase();
});

module.exports = lowerCase;
var createCaseFirst = require('./_createCaseFirst');

/**
 * Converts the first character of `string` to lower case.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category String
 * @param {string} [string=''] The string to convert.
 * @returns {string} Returns the converted string.
 * @example
 *
 * _.lowerFirst('Fred');
 * // => 'fred'
 *
 * _.lowerFirst('FRED');
 * // => 'fRED'
 */
var lowerFirst = createCaseFirst('toLowerCase');

module.exports = lowerFirst;
var baseLt = require('./_baseLt'),
    createRelationalOperation = require('./_createRelationalOperation');

/**
 * Checks if `value` is less than `other`.
 *
 * @static
 * @memberOf _
 * @since 3.9.0
 * @category Lang
 * @param {*} value The value to compare.
 * @param {*} other The other value to compare.
 * @returns {boolean} Returns `true` if `value` is less than `other`,
 *  else `false`.
 * @see _.gt
 * @example
 *
 * _.lt(1, 3);
 * // => true
 *
 * _.lt(3, 3);
 * // => false
 *
 * _.lt(3, 1);
 * // => false
 */
var lt = createRelationalOperation(baseLt);

module.exports = lt;
var createRelationalOperation = require('./_createRelationalOperation');

/**
 * Checks if `value` is less than or equal to `other`.
 *
 * @static
 * @memberOf _
 * @since 3.9.0
 * @category Lang
 * @param {*} value The value to compare.
 * @param {*} other The other value to compare.
 * @returns {boolean} Returns `true` if `value` is less than or equal to
 *  `other`, else `false`.
 * @see _.gte
 * @example
 *
 * _.lte(1, 3);
 * // => true
 *
 * _.lte(3, 3);
 * // => true
 *
 * _.lte(3, 1);
 * // => false
 */
var lte = createRelationalOperation(function(value, other) {
  return value <= other;
});

module.exports = lte;
var arrayMap = require('./_arrayMap'),
    baseIteratee = require('./_baseIteratee'),
    baseMap = require('./_baseMap'),
    isArray = require('./isArray');

/**
 * Creates an array of values by running each element in `collection` thru
 * `iteratee`. The iteratee is invoked with three arguments:
 * (value, index|key, collection).
 *
 * Many lodash methods are guarded to work as iteratees for methods like
 * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
 *
 * The guarded methods are:
 * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
 * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
 * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
 * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Collection
 * @param {Array|Object} collection The collection to iterate over.
 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
 * @returns {Array} Returns the new mapped array.
 * @example
 *
 * function square(n) {
 *   return n * n;
 * }
 *
 * _.map([4, 8], square);
 * // => [16, 64]
 *
 * _.map({ 'a': 4, 'b': 8 }, square);
 * // => [16, 64] (iteration order is not guaranteed)
 *
 * var users = [
 *   { 'user': 'barney' },
 *   { 'user': 'fred' }
 * ];
 *
 * // The `_.property` iteratee shorthand.
 * _.map(users, 'user');
 * // => ['barney', 'fred']
 */
function map(collection, iteratee) {
  var func = isArray(collection) ? arrayMap : baseMap;
  return func(collection, baseIteratee(iteratee, 3));
}

module.exports = map;
var baseAssignValue = require('./_baseAssignValue'),
    baseForOwn = require('./_baseForOwn'),
    baseIteratee = require('./_baseIteratee');

/**
 * The opposite of `_.mapValues`; this method creates an object with the
 * same values as `object` and keys generated by running each own enumerable
 * string keyed property of `object` thru `iteratee`. The iteratee is invoked
 * with three arguments: (value, key, object).
 *
 * @static
 * @memberOf _
 * @since 3.8.0
 * @category Object
 * @param {Object} object The object to iterate over.
 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
 * @returns {Object} Returns the new mapped object.
 * @see _.mapValues
 * @example
 *
 * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {
 *   return key + value;
 * });
 * // => { 'a1': 1, 'b2': 2 }
 */
function mapKeys(object, iteratee) {
  var result = {};
  iteratee = baseIteratee(iteratee, 3);

  baseForOwn(object, function(value, key, object) {
    baseAssignValue(result, iteratee(value, key, object), value);
  });
  return result;
}

module.exports = mapKeys;
var baseAssignValue = require('./_baseAssignValue'),
    baseForOwn = require('./_baseForOwn'),
    baseIteratee = require('./_baseIteratee');

/**
 * Creates an object with the same keys as `object` and values generated
 * by running each own enumerable string keyed property of `object` thru
 * `iteratee`. The iteratee is invoked with three arguments:
 * (value, key, object).
 *
 * @static
 * @memberOf _
 * @since 2.4.0
 * @category Object
 * @param {Object} object The object to iterate over.
 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
 * @returns {Object} Returns the new mapped object.
 * @see _.mapKeys
 * @example
 *
 * var users = {
 *   'fred':    { 'user': 'fred',    'age': 40 },
 *   'pebbles': { 'user': 'pebbles', 'age': 1 }
 * };
 *
 * _.mapValues(users, function(o) { return o.age; });
 * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
 *
 * // The `_.property` iteratee shorthand.
 * _.mapValues(users, 'age');
 * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
 */
function mapValues(object, iteratee) {
  var result = {};
  iteratee = baseIteratee(iteratee, 3);

  baseForOwn(object, function(value, key, object) {
    baseAssignValue(result, key, iteratee(value, key, object));
  });
  return result;
}

module.exports = mapValues;
var baseClone = require('./_baseClone'),
    baseMatches = require('./_baseMatches');

/** Used to compose bitmasks for cloning. */
var CLONE_DEEP_FLAG = 1;

/**
 * Creates a function that performs a partial deep comparison between a given
 * object and `source`, returning `true` if the given object has equivalent
 * property values, else `false`.
 *
 * **Note:** The created function is equivalent to `_.isMatch` with `source`
 * partially applied.
 *
 * Partial comparisons will match empty array and empty object `source`
 * values against any array or object value, respectively. See `_.isEqual`
 * for a list of supported value comparisons.
 *
 * **Note:** Multiple values can be checked by combining several matchers
 * using `_.overSome`
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Util
 * @param {Object} source The object of property values to match.
 * @returns {Function} Returns the new spec function.
 * @example
 *
 * var objects = [
 *   { 'a': 1, 'b': 2, 'c': 3 },
 *   { 'a': 4, 'b': 5, 'c': 6 }
 * ];
 *
 * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
 * // => [{ 'a': 4, 'b': 5, 'c': 6 }]
 *
 * // Checking for several possible values
 * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));
 * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]
 */
function matches(source) {
  return baseMatches(baseClone(source, CLONE_DEEP_FLAG));
}

module.exports = matches;
var baseClone = require('./_baseClone'),
    baseMatchesProperty = require('./_baseMatchesProperty');

/** Used to compose bitmasks for cloning. */
var CLONE_DEEP_FLAG = 1;

/**
 * Creates a function that performs a partial deep comparison between the
 * value at `path` of a given object to `srcValue`, returning `true` if the
 * object value is equivalent, else `false`.
 *
 * **Note:** Partial comparisons will match empty array and empty object
 * `srcValue` values against any array or object value, respectively. See
 * `_.isEqual` for a list of supported value comparisons.
 *
 * **Note:** Multiple values can be checked by combining several matchers
 * using `_.overSome`
 *
 * @static
 * @memberOf _
 * @since 3.2.0
 * @category Util
 * @param {Array|string} path The path of the property to get.
 * @param {*} srcValue The value to match.
 * @returns {Function} Returns the new spec function.
 * @example
 *
 * var objects = [
 *   { 'a': 1, 'b': 2, 'c': 3 },
 *   { 'a': 4, 'b': 5, 'c': 6 }
 * ];
 *
 * _.find(objects, _.matchesProperty('a', 4));
 * // => { 'a': 4, 'b': 5, 'c': 6 }
 *
 * // Checking for several possible values
 * _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));
 * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]
 */
function matchesProperty(path, srcValue) {
  return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));
}

module.exports = matchesProperty;
module.exports = {
  'add': require('./add'),
  'ceil': require('./ceil'),
  'divide': require('./divide'),
  'floor': require('./floor'),
  'max': require('./max'),
  'maxBy': require('./maxBy'),
  'mean': require('./mean'),
  'meanBy': require('./meanBy'),
  'min': require('./min'),
  'minBy': require('./minBy'),
  'multiply': require('./multiply'),
  'round': require('./round'),
  'subtract': require('./subtract'),
  'sum': require('./sum'),
  'sumBy': require('./sumBy')
};
var baseExtremum = require('./_baseExtremum'),
    baseGt = require('./_baseGt'),
    identity = require('./identity');

/**
 * Computes the maximum value of `array`. If `array` is empty or falsey,
 * `undefined` is returned.
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category Math
 * @param {Array} array The array to iterate over.
 * @returns {*} Returns the maximum value.
 * @example
 *
 * _.max([4, 2, 8, 6]);
 * // => 8
 *
 * _.max([]);
 * // => undefined
 */
function max(array) {
  return (array && array.length)
    ? baseExtremum(array, identity, baseGt)
    : undefined;
}

module.exports = max;
var baseExtremum = require('./_baseExtremum'),
    baseGt = require('./_baseGt'),
    baseIteratee = require('./_baseIteratee');

/**
 * This method is like `_.max` except that it accepts `iteratee` which is
 * invoked for each element in `array` to generate the criterion by which
 * the value is ranked. The iteratee is invoked with one argument: (value).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Math
 * @param {Array} array The array to iterate over.
 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
 * @returns {*} Returns the maximum value.
 * @example
 *
 * var objects = [{ 'n': 1 }, { 'n': 2 }];
 *
 * _.maxBy(objects, function(o) { return o.n; });
 * // => { 'n': 2 }
 *
 * // The `_.property` iteratee shorthand.
 * _.maxBy(objects, 'n');
 * // => { 'n': 2 }
 */
function maxBy(array, iteratee) {
  return (array && array.length)
    ? baseExtremum(array, baseIteratee(iteratee, 2), baseGt)
    : undefined;
}

module.exports = maxBy;
var baseMean = require('./_baseMean'),
    identity = require('./identity');

/**
 * Computes the mean of the values in `array`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Math
 * @param {Array} array The array to iterate over.
 * @returns {number} Returns the mean.
 * @example
 *
 * _.mean([4, 2, 8, 6]);
 * // => 5
 */
function mean(array) {
  return baseMean(array, identity);
}

module.exports = mean;
var baseIteratee = require('./_baseIteratee'),
    baseMean = require('./_baseMean');

/**
 * This method is like `_.mean` except that it accepts `iteratee` which is
 * invoked for each element in `array` to generate the value to be averaged.
 * The iteratee is invoked with one argument: (value).
 *
 * @static
 * @memberOf _
 * @since 4.7.0
 * @category Math
 * @param {Array} array The array to iterate over.
 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
 * @returns {number} Returns the mean.
 * @example
 *
 * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
 *
 * _.meanBy(objects, function(o) { return o.n; });
 * // => 5
 *
 * // The `_.property` iteratee shorthand.
 * _.meanBy(objects, 'n');
 * // => 5
 */
function meanBy(array, iteratee) {
  return baseMean(array, baseIteratee(iteratee, 2));
}

module.exports = meanBy;
var MapCache = require('./_MapCache');

/** Error message constants. */
var FUNC_ERROR_TEXT = 'Expected a function';

/**
 * Creates a function that memoizes the result of `func`. If `resolver` is
 * provided, it determines the cache key for storing the result based on the
 * arguments provided to the memoized function. By default, the first argument
 * provided to the memoized function is used as the map cache key. The `func`
 * is invoked with the `this` binding of the memoized function.
 *
 * **Note:** The cache is exposed as the `cache` property on the memoized
 * function. Its creation may be customized by replacing the `_.memoize.Cache`
 * constructor with one whose instances implement the
 * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
 * method interface of `clear`, `delete`, `get`, `has`, and `set`.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Function
 * @param {Function} func The function to have its output memoized.
 * @param {Function} [resolver] The function to resolve the cache key.
 * @returns {Function} Returns the new memoized function.
 * @example
 *
 * var object = { 'a': 1, 'b': 2 };
 * var other = { 'c': 3, 'd': 4 };
 *
 * var values = _.memoize(_.values);
 * values(object);
 * // => [1, 2]
 *
 * values(other);
 * // => [3, 4]
 *
 * object.a = 2;
 * values(object);
 * // => [1, 2]
 *
 * // Modify the result cache.
 * values.cache.set(object, ['a', 'b']);
 * values(object);
 * // => ['a', 'b']
 *
 * // Replace `_.memoize.Cache`.
 * _.memoize.Cache = WeakMap;
 */
function memoize(func, resolver) {
  if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
    throw new TypeError(FUNC_ERROR_TEXT);
  }
  var memoized = function() {
    var args = arguments,
        key = resolver ? resolver.apply(this, args) : args[0],
        cache = memoized.cache;

    if (cache.has(key)) {
      return cache.get(key);
    }
    var result = func.apply(this, args);
    memoized.cache = cache.set(key, result) || cache;
    return result;
  };
  memoized.cache = new (memoize.Cache || MapCache);
  return memoized;
}

// Expose `MapCache`.
memoize.Cache = MapCache;

module.exports = memoize;
var baseMerge = require('./_baseMerge'),
    createAssigner = require('./_createAssigner');

/**
 * This method is like `_.assign` except that it recursively merges own and
 * inherited enumerable string keyed properties of source objects into the
 * destination object. Source properties that resolve to `undefined` are
 * skipped if a destination value exists. Array and plain object properties
 * are merged recursively. Other objects and value types are overridden by
 * assignment. Source objects are applied from left to right. Subsequent
 * sources overwrite property assignments of previous sources.
 *
 * **Note:** This method mutates `object`.
 *
 * @static
 * @memberOf _
 * @since 0.5.0
 * @category Object
 * @param {Object} object The destination object.
 * @param {...Object} [sources] The source objects.
 * @returns {Object} Returns `object`.
 * @example
 *
 * var object = {
 *   'a': [{ 'b': 2 }, { 'd': 4 }]
 * };
 *
 * var other = {
 *   'a': [{ 'c': 3 }, { 'e': 5 }]
 * };
 *
 * _.merge(object, other);
 * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
 */
var merge = createAssigner(function(object, source, srcIndex) {
  baseMerge(object, source, srcIndex);
});

module.exports = merge;
var baseMerge = require('./_baseMerge'),
    createAssigner = require('./_createAssigner');

/**
 * This method is like `_.merge` except that it accepts `customizer` which
 * is invoked to produce the merged values of the destination and source
 * properties. If `customizer` returns `undefined`, merging is handled by the
 * method instead. The `customizer` is invoked with six arguments:
 * (objValue, srcValue, key, object, source, stack).
 *
 * **Note:** This method mutates `object`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Object
 * @param {Object} object The destination object.
 * @param {...Object} sources The source objects.
 * @param {Function} customizer The function to customize assigned values.
 * @returns {Object} Returns `object`.
 * @example
 *
 * function customizer(objValue, srcValue) {
 *   if (_.isArray(objValue)) {
 *     return objValue.concat(srcValue);
 *   }
 * }
 *
 * var object = { 'a': [1], 'b': [2] };
 * var other = { 'a': [3], 'b': [4] };
 *
 * _.mergeWith(object, other, customizer);
 * // => { 'a': [1, 3], 'b': [2, 4] }
 */
var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {
  baseMerge(object, source, srcIndex, customizer);
});

module.exports = mergeWith;
var baseInvoke = require('./_baseInvoke'),
    baseRest = require('./_baseRest');

/**
 * Creates a function that invokes the method at `path` of a given object.
 * Any additional arguments are provided to the invoked method.
 *
 * @static
 * @memberOf _
 * @since 3.7.0
 * @category Util
 * @param {Array|string} path The path of the method to invoke.
 * @param {...*} [args] The arguments to invoke the method with.
 * @returns {Function} Returns the new invoker function.
 * @example
 *
 * var objects = [
 *   { 'a': { 'b': _.constant(2) } },
 *   { 'a': { 'b': _.constant(1) } }
 * ];
 *
 * _.map(objects, _.method('a.b'));
 * // => [2, 1]
 *
 * _.map(objects, _.method(['a', 'b']));
 * // => [2, 1]
 */
var method = baseRest(function(path, args) {
  return function(object) {
    return baseInvoke(object, path, args);
  };
});

module.exports = method;
var baseInvoke = require('./_baseInvoke'),
    baseRest = require('./_baseRest');

/**
 * The opposite of `_.method`; this method creates a function that invokes
 * the method at a given path of `object`. Any additional arguments are
 * provided to the invoked method.
 *
 * @static
 * @memberOf _
 * @since 3.7.0
 * @category Util
 * @param {Object} object The object to query.
 * @param {...*} [args] The arguments to invoke the method with.
 * @returns {Function} Returns the new invoker function.
 * @example
 *
 * var array = _.times(3, _.constant),
 *     object = { 'a': array, 'b': array, 'c': array };
 *
 * _.map(['a[2]', 'c[0]'], _.methodOf(object));
 * // => [2, 0]
 *
 * _.map([['a', '2'], ['c', '0']], _.methodOf(object));
 * // => [2, 0]
 */
var methodOf = baseRest(function(object, args) {
  return function(path) {
    return baseInvoke(object, path, args);
  };
});

module.exports = methodOf;
var baseExtremum = require('./_baseExtremum'),
    baseLt = require('./_baseLt'),
    identity = require('./identity');

/**
 * Computes the minimum value of `array`. If `array` is empty or falsey,
 * `undefined` is returned.
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category Math
 * @param {Array} array The array to iterate over.
 * @returns {*} Returns the minimum value.
 * @example
 *
 * _.min([4, 2, 8, 6]);
 * // => 2
 *
 * _.min([]);
 * // => undefined
 */
function min(array) {
  return (array && array.length)
    ? baseExtremum(array, identity, baseLt)
    : undefined;
}

module.exports = min;
var baseExtremum = require('./_baseExtremum'),
    baseIteratee = require('./_baseIteratee'),
    baseLt = require('./_baseLt');

/**
 * This method is like `_.min` except that it accepts `iteratee` which is
 * invoked for each element in `array` to generate the criterion by which
 * the value is ranked. The iteratee is invoked with one argument: (value).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Math
 * @param {Array} array The array to iterate over.
 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
 * @returns {*} Returns the minimum value.
 * @example
 *
 * var objects = [{ 'n': 1 }, { 'n': 2 }];
 *
 * _.minBy(objects, function(o) { return o.n; });
 * // => { 'n': 1 }
 *
 * // The `_.property` iteratee shorthand.
 * _.minBy(objects, 'n');
 * // => { 'n': 1 }
 */
function minBy(array, iteratee) {
  return (array && array.length)
    ? baseExtremum(array, baseIteratee(iteratee, 2), baseLt)
    : undefined;
}

module.exports = minBy;
var arrayEach = require('./_arrayEach'),
    arrayPush = require('./_arrayPush'),
    baseFunctions = require('./_baseFunctions'),
    copyArray = require('./_copyArray'),
    isFunction = require('./isFunction'),
    isObject = require('./isObject'),
    keys = require('./keys');

/**
 * Adds all own enumerable string keyed function properties of a source
 * object to the destination object. If `object` is a function, then methods
 * are added to its prototype as well.
 *
 * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
 * avoid conflicts caused by modifying the original.
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category Util
 * @param {Function|Object} [object=lodash] The destination object.
 * @param {Object} source The object of functions to add.
 * @param {Object} [options={}] The options object.
 * @param {boolean} [options.chain=true] Specify whether mixins are chainable.
 * @returns {Function|Object} Returns `object`.
 * @example
 *
 * function vowels(string) {
 *   return _.filter(string, function(v) {
 *     return /[aeiou]/i.test(v);
 *   });
 * }
 *
 * _.mixin({ 'vowels': vowels });
 * _.vowels('fred');
 * // => ['e']
 *
 * _('fred').vowels().value();
 * // => ['e']
 *
 * _.mixin({ 'vowels': vowels }, { 'chain': false });
 * _('fred').vowels();
 * // => ['e']
 */
function mixin(object, source, options) {
  var props = keys(source),
      methodNames = baseFunctions(source, props);

  var chain = !(isObject(options) && 'chain' in options) || !!options.chain,
      isFunc = isFunction(object);

  arrayEach(methodNames, function(methodName) {
    var func = source[methodName];
    object[methodName] = func;
    if (isFunc) {
      object.prototype[methodName] = function() {
        var chainAll = this.__chain__;
        if (chain || chainAll) {
          var result = object(this.__wrapped__),
              actions = result.__actions__ = copyArray(this.__actions__);

          actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
          result.__chain__ = chainAll;
          return result;
        }
        return func.apply(object, arrayPush([this.value()], arguments));
      };
    }
  });

  return object;
}

module.exports = mixin;
var createMathOperation = require('./_createMathOperation');

/**
 * Multiply two numbers.
 *
 * @static
 * @memberOf _
 * @since 4.7.0
 * @category Math
 * @param {number} multiplier The first number in a multiplication.
 * @param {number} multiplicand The second number in a multiplication.
 * @returns {number} Returns the product.
 * @example
 *
 * _.multiply(6, 4);
 * // => 24
 */
var multiply = createMathOperation(function(multiplier, multiplicand) {
  return multiplier * multiplicand;
}, 1);

module.exports = multiply;
/** Error message constants. */
var FUNC_ERROR_TEXT = 'Expected a function';

/**
 * Creates a function that negates the result of the predicate `func`. The
 * `func` predicate is invoked with the `this` binding and arguments of the
 * created function.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Function
 * @param {Function} predicate The predicate to negate.
 * @returns {Function} Returns the new negated function.
 * @example
 *
 * function isEven(n) {
 *   return n % 2 == 0;
 * }
 *
 * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
 * // => [1, 3, 5]
 */
function negate(predicate) {
  if (typeof predicate != 'function') {
    throw new TypeError(FUNC_ERROR_TEXT);
  }
  return function() {
    var args = arguments;
    switch (args.length) {
      case 0: return !predicate.call(this);
      case 1: return !predicate.call(this, args[0]);
      case 2: return !predicate.call(this, args[0], args[1]);
      case 3: return !predicate.call(this, args[0], args[1], args[2]);
    }
    return !predicate.apply(this, args);
  };
}

module.exports = negate;
var toArray = require('./toArray');

/**
 * Gets the next value on a wrapped object following the
 * [iterator protocol](https://mdn.io/iteration_protocols#iterator).
 *
 * @name next
 * @memberOf _
 * @since 4.0.0
 * @category Seq
 * @returns {Object} Returns the next iterator value.
 * @example
 *
 * var wrapped = _([1, 2]);
 *
 * wrapped.next();
 * // => { 'done': false, 'value': 1 }
 *
 * wrapped.next();
 * // => { 'done': false, 'value': 2 }
 *
 * wrapped.next();
 * // => { 'done': true, 'value': undefined }
 */
function wrapperNext() {
  if (this.__values__ === undefined) {
    this.__values__ = toArray(this.value());
  }
  var done = this.__index__ >= this.__values__.length,
      value = done ? undefined : this.__values__[this.__index__++];

  return { 'done': done, 'value': value };
}

module.exports = wrapperNext;
/**
 * This method returns `undefined`.
 *
 * @static
 * @memberOf _
 * @since 2.3.0
 * @category Util
 * @example
 *
 * _.times(2, _.noop);
 * // => [undefined, undefined]
 */
function noop() {
  // No operation performed.
}

module.exports = noop;
var root = require('./_root');

/**
 * Gets the timestamp of the number of milliseconds that have elapsed since
 * the Unix epoch (1 January 1970 00:00:00 UTC).
 *
 * @static
 * @memberOf _
 * @since 2.4.0
 * @category Date
 * @returns {number} Returns the timestamp.
 * @example
 *
 * _.defer(function(stamp) {
 *   console.log(_.now() - stamp);
 * }, _.now());
 * // => Logs the number of milliseconds it took for the deferred invocation.
 */
var now = function() {
  return root.Date.now();
};

module.exports = now;
var baseNth = require('./_baseNth'),
    toInteger = require('./toInteger');

/**
 * Gets the element at index `n` of `array`. If `n` is negative, the nth
 * element from the end is returned.
 *
 * @static
 * @memberOf _
 * @since 4.11.0
 * @category Array
 * @param {Array} array The array to query.
 * @param {number} [n=0] The index of the element to return.
 * @returns {*} Returns the nth element of `array`.
 * @example
 *
 * var array = ['a', 'b', 'c', 'd'];
 *
 * _.nth(array, 1);
 * // => 'b'
 *
 * _.nth(array, -2);
 * // => 'c';
 */
function nth(array, n) {
  return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;
}

module.exports = nth;
var baseNth = require('./_baseNth'),
    baseRest = require('./_baseRest'),
    toInteger = require('./toInteger');

/**
 * Creates a function that gets the argument at index `n`. If `n` is negative,
 * the nth argument from the end is returned.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Util
 * @param {number} [n=0] The index of the argument to return.
 * @returns {Function} Returns the new pass-thru function.
 * @example
 *
 * var func = _.nthArg(1);
 * func('a', 'b', 'c', 'd');
 * // => 'b'
 *
 * var func = _.nthArg(-2);
 * func('a', 'b', 'c', 'd');
 * // => 'c'
 */
function nthArg(n) {
  n = toInteger(n);
  return baseRest(function(args) {
    return baseNth(args, n);
  });
}

module.exports = nthArg;
module.exports = {
  'clamp': require('./clamp'),
  'inRange': require('./inRange'),
  'random': require('./random')
};
module.exports = {
  'assign': require('./assign'),
  'assignIn': require('./assignIn'),
  'assignInWith': require('./assignInWith'),
  'assignWith': require('./assignWith'),
  'at': require('./at'),
  'create': require('./create'),
  'defaults': require('./defaults'),
  'defaultsDeep': require('./defaultsDeep'),
  'entries': require('./entries'),
  'entriesIn': require('./entriesIn'),
  'extend': require('./extend'),
  'extendWith': require('./extendWith'),
  'findKey': require('./findKey'),
  'findLastKey': require('./findLastKey'),
  'forIn': require('./forIn'),
  'forInRight': require('./forInRight'),
  'forOwn': require('./forOwn'),
  'forOwnRight': require('./forOwnRight'),
  'functions': require('./functions'),
  'functionsIn': require('./functionsIn'),
  'get': require('./get'),
  'has': require('./has'),
  'hasIn': require('./hasIn'),
  'invert': require('./invert'),
  'invertBy': require('./invertBy'),
  'invoke': require('./invoke'),
  'keys': require('./keys'),
  'keysIn': require('./keysIn'),
  'mapKeys': require('./mapKeys'),
  'mapValues': require('./mapValues'),
  'merge': require('./merge'),
  'mergeWith': require('./mergeWith'),
  'omit': require('./omit'),
  'omitBy': require('./omitBy'),
  'pick': require('./pick'),
  'pickBy': require('./pickBy'),
  'result': require('./result'),
  'set': require('./set'),
  'setWith': require('./setWith'),
  'toPairs': require('./toPairs'),
  'toPairsIn': require('./toPairsIn'),
  'transform': require('./transform'),
  'unset': require('./unset'),
  'update': require('./update'),
  'updateWith': require('./updateWith'),
  'values': require('./values'),
  'valuesIn': require('./valuesIn')
};
var arrayMap = require('./_arrayMap'),
    baseClone = require('./_baseClone'),
    baseUnset = require('./_baseUnset'),
    castPath = require('./_castPath'),
    copyObject = require('./_copyObject'),
    customOmitClone = require('./_customOmitClone'),
    flatRest = require('./_flatRest'),
    getAllKeysIn = require('./_getAllKeysIn');

/** Used to compose bitmasks for cloning. */
var CLONE_DEEP_FLAG = 1,
    CLONE_FLAT_FLAG = 2,
    CLONE_SYMBOLS_FLAG = 4;

/**
 * The opposite of `_.pick`; this method creates an object composed of the
 * own and inherited enumerable property paths of `object` that are not omitted.
 *
 * **Note:** This method is considerably slower than `_.pick`.
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category Object
 * @param {Object} object The source object.
 * @param {...(string|string[])} [paths] The property paths to omit.
 * @returns {Object} Returns the new object.
 * @example
 *
 * var object = { 'a': 1, 'b': '2', 'c': 3 };
 *
 * _.omit(object, ['a', 'c']);
 * // => { 'b': '2' }
 */
var omit = flatRest(function(object, paths) {
  var result = {};
  if (object == null) {
    return result;
  }
  var isDeep = false;
  paths = arrayMap(paths, function(path) {
    path = castPath(path, object);
    isDeep || (isDeep = path.length > 1);
    return path;
  });
  copyObject(object, getAllKeysIn(object), result);
  if (isDeep) {
    result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);
  }
  var length = paths.length;
  while (length--) {
    baseUnset(result, paths[length]);
  }
  return result;
});

module.exports = omit;
var baseIteratee = require('./_baseIteratee'),
    negate = require('./negate'),
    pickBy = require('./pickBy');

/**
 * The opposite of `_.pickBy`; this method creates an object composed of
 * the own and inherited enumerable string keyed properties of `object` that
 * `predicate` doesn't return truthy for. The predicate is invoked with two
 * arguments: (value, key).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Object
 * @param {Object} object The source object.
 * @param {Function} [predicate=_.identity] The function invoked per property.
 * @returns {Object} Returns the new object.
 * @example
 *
 * var object = { 'a': 1, 'b': '2', 'c': 3 };
 *
 * _.omitBy(object, _.isNumber);
 * // => { 'b': '2' }
 */
function omitBy(object, predicate) {
  return pickBy(object, negate(baseIteratee(predicate)));
}

module.exports = omitBy;
var before = require('./before');

/**
 * Creates a function that is restricted to invoking `func` once. Repeat calls
 * to the function return the value of the first invocation. The `func` is
 * invoked with the `this` binding and arguments of the created function.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Function
 * @param {Function} func The function to restrict.
 * @returns {Function} Returns the new restricted function.
 * @example
 *
 * var initialize = _.once(createApplication);
 * initialize();
 * initialize();
 * // => `createApplication` is invoked once
 */
function once(func) {
  return before(2, func);
}

module.exports = once;
var baseOrderBy = require('./_baseOrderBy'),
    isArray = require('./isArray');

/**
 * This method is like `_.sortBy` except that it allows specifying the sort
 * orders of the iteratees to sort by. If `orders` is unspecified, all values
 * are sorted in ascending order. Otherwise, specify an order of "desc" for
 * descending or "asc" for ascending sort order of corresponding values.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Collection
 * @param {Array|Object} collection The collection to iterate over.
 * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]
 *  The iteratees to sort by.
 * @param {string[]} [orders] The sort orders of `iteratees`.
 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
 * @returns {Array} Returns the new sorted array.
 * @example
 *
 * var users = [
 *   { 'user': 'fred',   'age': 48 },
 *   { 'user': 'barney', 'age': 34 },
 *   { 'user': 'fred',   'age': 40 },
 *   { 'user': 'barney', 'age': 36 }
 * ];
 *
 * // Sort by `user` in ascending order and by `age` in descending order.
 * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);
 * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
 */
function orderBy(collection, iteratees, orders, guard) {
  if (collection == null) {
    return [];
  }
  if (!isArray(iteratees)) {
    iteratees = iteratees == null ? [] : [iteratees];
  }
  orders = guard ? undefined : orders;
  if (!isArray(orders)) {
    orders = orders == null ? [] : [orders];
  }
  return baseOrderBy(collection, iteratees, orders);
}

module.exports = orderBy;
var arrayMap = require('./_arrayMap'),
    createOver = require('./_createOver');

/**
 * Creates a function that invokes `iteratees` with the arguments it receives
 * and returns their results.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Util
 * @param {...(Function|Function[])} [iteratees=[_.identity]]
 *  The iteratees to invoke.
 * @returns {Function} Returns the new function.
 * @example
 *
 * var func = _.over([Math.max, Math.min]);
 *
 * func(1, 2, 3, 4);
 * // => [4, 1]
 */
var over = createOver(arrayMap);

module.exports = over;
var apply = require('./_apply'),
    arrayMap = require('./_arrayMap'),
    baseFlatten = require('./_baseFlatten'),
    baseIteratee = require('./_baseIteratee'),
    baseRest = require('./_baseRest'),
    baseUnary = require('./_baseUnary'),
    castRest = require('./_castRest'),
    isArray = require('./isArray');

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMin = Math.min;

/**
 * Creates a function that invokes `func` with its arguments transformed.
 *
 * @static
 * @since 4.0.0
 * @memberOf _
 * @category Function
 * @param {Function} func The function to wrap.
 * @param {...(Function|Function[])} [transforms=[_.identity]]
 *  The argument transforms.
 * @returns {Function} Returns the new function.
 * @example
 *
 * function doubled(n) {
 *   return n * 2;
 * }
 *
 * function square(n) {
 *   return n * n;
 * }
 *
 * var func = _.overArgs(function(x, y) {
 *   return [x, y];
 * }, [square, doubled]);
 *
 * func(9, 3);
 * // => [81, 6]
 *
 * func(10, 5);
 * // => [100, 10]
 */
var overArgs = castRest(function(func, transforms) {
  transforms = (transforms.length == 1 && isArray(transforms[0]))
    ? arrayMap(transforms[0], baseUnary(baseIteratee))
    : arrayMap(baseFlatten(transforms, 1), baseUnary(baseIteratee));

  var funcsLength = transforms.length;
  return baseRest(function(args) {
    var index = -1,
        length = nativeMin(args.length, funcsLength);

    while (++index < length) {
      args[index] = transforms[index].call(this, args[index]);
    }
    return apply(func, this, args);
  });
});

module.exports = overArgs;
var arrayEvery = require('./_arrayEvery'),
    createOver = require('./_createOver');

/**
 * Creates a function that checks if **all** of the `predicates` return
 * truthy when invoked with the arguments it receives.
 *
 * Following shorthands are possible for providing predicates.
 * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.
 * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Util
 * @param {...(Function|Function[])} [predicates=[_.identity]]
 *  The predicates to check.
 * @returns {Function} Returns the new function.
 * @example
 *
 * var func = _.overEvery([Boolean, isFinite]);
 *
 * func('1');
 * // => true
 *
 * func(null);
 * // => false
 *
 * func(NaN);
 * // => false
 */
var overEvery = createOver(arrayEvery);

module.exports = overEvery;
var arraySome = require('./_arraySome'),
    createOver = require('./_createOver');

/**
 * Creates a function that checks if **any** of the `predicates` return
 * truthy when invoked with the arguments it receives.
 *
 * Following shorthands are possible for providing predicates.
 * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.
 * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Util
 * @param {...(Function|Function[])} [predicates=[_.identity]]
 *  The predicates to check.
 * @returns {Function} Returns the new function.
 * @example
 *
 * var func = _.overSome([Boolean, isFinite]);
 *
 * func('1');
 * // => true
 *
 * func(null);
 * // => true
 *
 * func(NaN);
 * // => false
 *
 * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])
 * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])
 */
var overSome = createOver(arraySome);

module.exports = overSome;
{
  "name": "lodash",
  "version": "4.17.21",
  "description": "Lodash modular utilities.",
  "homepage": "https://lodash.com/",
  "repository": "lodash/lodash",
  "icon": "https://lodash.com/icon.svg",
  "license": "MIT",
  "main": "lodash.js",
  "author": "John-David Dalton <john.david.dalton@gmail.com>"
}var createPadding = require('./_createPadding'),
    stringSize = require('./_stringSize'),
    toInteger = require('./toInteger'),
    toString = require('./toString');

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeCeil = Math.ceil,
    nativeFloor = Math.floor;

/**
 * Pads `string` on the left and right sides if it's shorter than `length`.
 * Padding characters are truncated if they can't be evenly divided by `length`.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category String
 * @param {string} [string=''] The string to pad.
 * @param {number} [length=0] The padding length.
 * @param {string} [chars=' '] The string used as padding.
 * @returns {string} Returns the padded string.
 * @example
 *
 * _.pad('abc', 8);
 * // => '  abc   '
 *
 * _.pad('abc', 8, '_-');
 * // => '_-abc_-_'
 *
 * _.pad('abc', 3);
 * // => 'abc'
 */
function pad(string, length, chars) {
  string = toString(string);
  length = toInteger(length);

  var strLength = length ? stringSize(string) : 0;
  if (!length || strLength >= length) {
    return string;
  }
  var mid = (length - strLength) / 2;
  return (
    createPadding(nativeFloor(mid), chars) +
    string +
    createPadding(nativeCeil(mid), chars)
  );
}

module.exports = pad;
var createPadding = require('./_createPadding'),
    stringSize = require('./_stringSize'),
    toInteger = require('./toInteger'),
    toString = require('./toString');

/**
 * Pads `string` on the right side if it's shorter than `length`. Padding
 * characters are truncated if they exceed `length`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category String
 * @param {string} [string=''] The string to pad.
 * @param {number} [length=0] The padding length.
 * @param {string} [chars=' '] The string used as padding.
 * @returns {string} Returns the padded string.
 * @example
 *
 * _.padEnd('abc', 6);
 * // => 'abc   '
 *
 * _.padEnd('abc', 6, '_-');
 * // => 'abc_-_'
 *
 * _.padEnd('abc', 3);
 * // => 'abc'
 */
function padEnd(string, length, chars) {
  string = toString(string);
  length = toInteger(length);

  var strLength = length ? stringSize(string) : 0;
  return (length && strLength < length)
    ? (string + createPadding(length - strLength, chars))
    : string;
}

module.exports = padEnd;
var createPadding = require('./_createPadding'),
    stringSize = require('./_stringSize'),
    toInteger = require('./toInteger'),
    toString = require('./toString');

/**
 * Pads `string` on the left side if it's shorter than `length`. Padding
 * characters are truncated if they exceed `length`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category String
 * @param {string} [string=''] The string to pad.
 * @param {number} [length=0] The padding length.
 * @param {string} [chars=' '] The string used as padding.
 * @returns {string} Returns the padded string.
 * @example
 *
 * _.padStart('abc', 6);
 * // => '   abc'
 *
 * _.padStart('abc', 6, '_-');
 * // => '_-_abc'
 *
 * _.padStart('abc', 3);
 * // => 'abc'
 */
function padStart(string, length, chars) {
  string = toString(string);
  length = toInteger(length);

  var strLength = length ? stringSize(string) : 0;
  return (length && strLength < length)
    ? (createPadding(length - strLength, chars) + string)
    : string;
}

module.exports = padStart;
var root = require('./_root'),
    toString = require('./toString');

/** Used to match leading whitespace. */
var reTrimStart = /^\s+/;

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeParseInt = root.parseInt;

/**
 * Converts `string` to an integer of the specified radix. If `radix` is
 * `undefined` or `0`, a `radix` of `10` is used unless `value` is a
 * hexadecimal, in which case a `radix` of `16` is used.
 *
 * **Note:** This method aligns with the
 * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.
 *
 * @static
 * @memberOf _
 * @since 1.1.0
 * @category String
 * @param {string} string The string to convert.
 * @param {number} [radix=10] The radix to interpret `value` by.
 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
 * @returns {number} Returns the converted integer.
 * @example
 *
 * _.parseInt('08');
 * // => 8
 *
 * _.map(['6', '08', '10'], _.parseInt);
 * // => [6, 8, 10]
 */
function parseInt(string, radix, guard) {
  if (guard || radix == null) {
    radix = 0;
  } else if (radix) {
    radix = +radix;
  }
  return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);
}

module.exports = parseInt;
var baseRest = require('./_baseRest'),
    createWrap = require('./_createWrap'),
    getHolder = require('./_getHolder'),
    replaceHolders = require('./_replaceHolders');

/** Used to compose bitmasks for function metadata. */
var WRAP_PARTIAL_FLAG = 32;

/**
 * Creates a function that invokes `func` with `partials` prepended to the
 * arguments it receives. This method is like `_.bind` except it does **not**
 * alter the `this` binding.
 *
 * The `_.partial.placeholder` value, which defaults to `_` in monolithic
 * builds, may be used as a placeholder for partially applied arguments.
 *
 * **Note:** This method doesn't set the "length" property of partially
 * applied functions.
 *
 * @static
 * @memberOf _
 * @since 0.2.0
 * @category Function
 * @param {Function} func The function to partially apply arguments to.
 * @param {...*} [partials] The arguments to be partially applied.
 * @returns {Function} Returns the new partially applied function.
 * @example
 *
 * function greet(greeting, name) {
 *   return greeting + ' ' + name;
 * }
 *
 * var sayHelloTo = _.partial(greet, 'hello');
 * sayHelloTo('fred');
 * // => 'hello fred'
 *
 * // Partially applied with placeholders.
 * var greetFred = _.partial(greet, _, 'fred');
 * greetFred('hi');
 * // => 'hi fred'
 */
var partial = baseRest(function(func, partials) {
  var holders = replaceHolders(partials, getHolder(partial));
  return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);
});

// Assign default placeholders.
partial.placeholder = {};

module.exports = partial;
var baseRest = require('./_baseRest'),
    createWrap = require('./_createWrap'),
    getHolder = require('./_getHolder'),
    replaceHolders = require('./_replaceHolders');

/** Used to compose bitmasks for function metadata. */
var WRAP_PARTIAL_RIGHT_FLAG = 64;

/**
 * This method is like `_.partial` except that partially applied arguments
 * are appended to the arguments it receives.
 *
 * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic
 * builds, may be used as a placeholder for partially applied arguments.
 *
 * **Note:** This method doesn't set the "length" property of partially
 * applied functions.
 *
 * @static
 * @memberOf _
 * @since 1.0.0
 * @category Function
 * @param {Function} func The function to partially apply arguments to.
 * @param {...*} [partials] The arguments to be partially applied.
 * @returns {Function} Returns the new partially applied function.
 * @example
 *
 * function greet(greeting, name) {
 *   return greeting + ' ' + name;
 * }
 *
 * var greetFred = _.partialRight(greet, 'fred');
 * greetFred('hi');
 * // => 'hi fred'
 *
 * // Partially applied with placeholders.
 * var sayHelloTo = _.partialRight(greet, 'hello', _);
 * sayHelloTo('fred');
 * // => 'hello fred'
 */
var partialRight = baseRest(function(func, partials) {
  var holders = replaceHolders(partials, getHolder(partialRight));
  return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);
});

// Assign default placeholders.
partialRight.placeholder = {};

module.exports = partialRight;
var createAggregator = require('./_createAggregator');

/**
 * Creates an array of elements split into two groups, the first of which
 * contains elements `predicate` returns truthy for, the second of which
 * contains elements `predicate` returns falsey for. The predicate is
 * invoked with one argument: (value).
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Collection
 * @param {Array|Object} collection The collection to iterate over.
 * @param {Function} [predicate=_.identity] The function invoked per iteration.
 * @returns {Array} Returns the array of grouped elements.
 * @example
 *
 * var users = [
 *   { 'user': 'barney',  'age': 36, 'active': false },
 *   { 'user': 'fred',    'age': 40, 'active': true },
 *   { 'user': 'pebbles', 'age': 1,  'active': false }
 * ];
 *
 * _.partition(users, function(o) { return o.active; });
 * // => objects for [['fred'], ['barney', 'pebbles']]
 *
 * // The `_.matches` iteratee shorthand.
 * _.partition(users, { 'age': 1, 'active': false });
 * // => objects for [['pebbles'], ['barney', 'fred']]
 *
 * // The `_.matchesProperty` iteratee shorthand.
 * _.partition(users, ['active', false]);
 * // => objects for [['barney', 'pebbles'], ['fred']]
 *
 * // The `_.property` iteratee shorthand.
 * _.partition(users, 'active');
 * // => objects for [['fred'], ['barney', 'pebbles']]
 */
var partition = createAggregator(function(result, value, key) {
  result[key ? 0 : 1].push(value);
}, function() { return [[], []]; });

module.exports = partition;
var basePick = require('./_basePick'),
    flatRest = require('./_flatRest');

/**
 * Creates an object composed of the picked `object` properties.
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category Object
 * @param {Object} object The source object.
 * @param {...(string|string[])} [paths] The property paths to pick.
 * @returns {Object} Returns the new object.
 * @example
 *
 * var object = { 'a': 1, 'b': '2', 'c': 3 };
 *
 * _.pick(object, ['a', 'c']);
 * // => { 'a': 1, 'c': 3 }
 */
var pick = flatRest(function(object, paths) {
  return object == null ? {} : basePick(object, paths);
});

module.exports = pick;
var arrayMap = require('./_arrayMap'),
    baseIteratee = require('./_baseIteratee'),
    basePickBy = require('./_basePickBy'),
    getAllKeysIn = require('./_getAllKeysIn');

/**
 * Creates an object composed of the `object` properties `predicate` returns
 * truthy for. The predicate is invoked with two arguments: (value, key).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Object
 * @param {Object} object The source object.
 * @param {Function} [predicate=_.identity] The function invoked per property.
 * @returns {Object} Returns the new object.
 * @example
 *
 * var object = { 'a': 1, 'b': '2', 'c': 3 };
 *
 * _.pickBy(object, _.isNumber);
 * // => { 'a': 1, 'c': 3 }
 */
function pickBy(object, predicate) {
  if (object == null) {
    return {};
  }
  var props = arrayMap(getAllKeysIn(object), function(prop) {
    return [prop];
  });
  predicate = baseIteratee(predicate);
  return basePickBy(object, props, function(value, path) {
    return predicate(value, path[0]);
  });
}

module.exports = pickBy;
var baseLodash = require('./_baseLodash'),
    wrapperClone = require('./_wrapperClone');

/**
 * Creates a clone of the chain sequence planting `value` as the wrapped value.
 *
 * @name plant
 * @memberOf _
 * @since 3.2.0
 * @category Seq
 * @param {*} value The value to plant.
 * @returns {Object} Returns the new `lodash` wrapper instance.
 * @example
 *
 * function square(n) {
 *   return n * n;
 * }
 *
 * var wrapped = _([1, 2]).map(square);
 * var other = wrapped.plant([3, 4]);
 *
 * other.value();
 * // => [9, 16]
 *
 * wrapped.value();
 * // => [1, 4]
 */
function wrapperPlant(value) {
  var result,
      parent = this;

  while (parent instanceof baseLodash) {
    var clone = wrapperClone(parent);
    clone.__index__ = 0;
    clone.__values__ = undefined;
    if (result) {
      previous.__wrapped__ = clone;
    } else {
      result = clone;
    }
    var previous = clone;
    parent = parent.__wrapped__;
  }
  previous.__wrapped__ = value;
  return result;
}

module.exports = wrapperPlant;
var baseProperty = require('./_baseProperty'),
    basePropertyDeep = require('./_basePropertyDeep'),
    isKey = require('./_isKey'),
    toKey = require('./_toKey');

/**
 * Creates a function that returns the value at `path` of a given object.
 *
 * @static
 * @memberOf _
 * @since 2.4.0
 * @category Util
 * @param {Array|string} path The path of the property to get.
 * @returns {Function} Returns the new accessor function.
 * @example
 *
 * var objects = [
 *   { 'a': { 'b': 2 } },
 *   { 'a': { 'b': 1 } }
 * ];
 *
 * _.map(objects, _.property('a.b'));
 * // => [2, 1]
 *
 * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
 * // => [1, 2]
 */
function property(path) {
  return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
}

module.exports = property;
var baseGet = require('./_baseGet');

/**
 * The opposite of `_.property`; this method creates a function that returns
 * the value at a given path of `object`.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Util
 * @param {Object} object The object to query.
 * @returns {Function} Returns the new accessor function.
 * @example
 *
 * var array = [0, 1, 2],
 *     object = { 'a': array, 'b': array, 'c': array };
 *
 * _.map(['a[2]', 'c[0]'], _.propertyOf(object));
 * // => [2, 0]
 *
 * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));
 * // => [2, 0]
 */
function propertyOf(object) {
  return function(path) {
    return object == null ? undefined : baseGet(object, path);
  };
}

module.exports = propertyOf;
var baseRest = require('./_baseRest'),
    pullAll = require('./pullAll');

/**
 * Removes all given values from `array` using
 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
 * for equality comparisons.
 *
 * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
 * to remove elements from an array by predicate.
 *
 * @static
 * @memberOf _
 * @since 2.0.0
 * @category Array
 * @param {Array} array The array to modify.
 * @param {...*} [values] The values to remove.
 * @returns {Array} Returns `array`.
 * @example
 *
 * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
 *
 * _.pull(array, 'a', 'c');
 * console.log(array);
 * // => ['b', 'b']
 */
var pull = baseRest(pullAll);

module.exports = pull;
var basePullAll = require('./_basePullAll');

/**
 * This method is like `_.pull` except that it accepts an array of values to remove.
 *
 * **Note:** Unlike `_.difference`, this method mutates `array`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Array
 * @param {Array} array The array to modify.
 * @param {Array} values The values to remove.
 * @returns {Array} Returns `array`.
 * @example
 *
 * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
 *
 * _.pullAll(array, ['a', 'c']);
 * console.log(array);
 * // => ['b', 'b']
 */
function pullAll(array, values) {
  return (array && array.length && values && values.length)
    ? basePullAll(array, values)
    : array;
}

module.exports = pullAll;
var baseIteratee = require('./_baseIteratee'),
    basePullAll = require('./_basePullAll');

/**
 * This method is like `_.pullAll` except that it accepts `iteratee` which is
 * invoked for each element of `array` and `values` to generate the criterion
 * by which they're compared. The iteratee is invoked with one argument: (value).
 *
 * **Note:** Unlike `_.differenceBy`, this method mutates `array`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Array
 * @param {Array} array The array to modify.
 * @param {Array} values The values to remove.
 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
 * @returns {Array} Returns `array`.
 * @example
 *
 * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];
 *
 * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');
 * console.log(array);
 * // => [{ 'x': 2 }]
 */
function pullAllBy(array, values, iteratee) {
  return (array && array.length && values && values.length)
    ? basePullAll(array, values, baseIteratee(iteratee, 2))
    : array;
}

module.exports = pullAllBy;
var basePullAll = require('./_basePullAll');

/**
 * This method is like `_.pullAll` except that it accepts `comparator` which
 * is invoked to compare elements of `array` to `values`. The comparator is
 * invoked with two arguments: (arrVal, othVal).
 *
 * **Note:** Unlike `_.differenceWith`, this method mutates `array`.
 *
 * @static
 * @memberOf _
 * @since 4.6.0
 * @category Array
 * @param {Array} array The array to modify.
 * @param {Array} values The values to remove.
 * @param {Function} [comparator] The comparator invoked per element.
 * @returns {Array} Returns `array`.
 * @example
 *
 * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];
 *
 * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);
 * console.log(array);
 * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]
 */
function pullAllWith(array, values, comparator) {
  return (array && array.length && values && values.length)
    ? basePullAll(array, values, undefined, comparator)
    : array;
}

module.exports = pullAllWith;
var arrayMap = require('./_arrayMap'),
    baseAt = require('./_baseAt'),
    basePullAt = require('./_basePullAt'),
    compareAscending = require('./_compareAscending'),
    flatRest = require('./_flatRest'),
    isIndex = require('./_isIndex');

/**
 * Removes elements from `array` corresponding to `indexes` and returns an
 * array of removed elements.
 *
 * **Note:** Unlike `_.at`, this method mutates `array`.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Array
 * @param {Array} array The array to modify.
 * @param {...(number|number[])} [indexes] The indexes of elements to remove.
 * @returns {Array} Returns the new array of removed elements.
 * @example
 *
 * var array = ['a', 'b', 'c', 'd'];
 * var pulled = _.pullAt(array, [1, 3]);
 *
 * console.log(array);
 * // => ['a', 'c']
 *
 * console.log(pulled);
 * // => ['b', 'd']
 */
var pullAt = flatRest(function(array, indexes) {
  var length = array == null ? 0 : array.length,
      result = baseAt(array, indexes);

  basePullAt(array, arrayMap(indexes, function(index) {
    return isIndex(index, length) ? +index : index;
  }).sort(compareAscending));

  return result;
});

module.exports = pullAt;
var baseRandom = require('./_baseRandom'),
    isIterateeCall = require('./_isIterateeCall'),
    toFinite = require('./toFinite');

/** Built-in method references without a dependency on `root`. */
var freeParseFloat = parseFloat;

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMin = Math.min,
    nativeRandom = Math.random;

/**
 * Produces a random number between the inclusive `lower` and `upper` bounds.
 * If only one argument is provided a number between `0` and the given number
 * is returned. If `floating` is `true`, or either `lower` or `upper` are
 * floats, a floating-point number is returned instead of an integer.
 *
 * **Note:** JavaScript follows the IEEE-754 standard for resolving
 * floating-point values which can produce unexpected results.
 *
 * @static
 * @memberOf _
 * @since 0.7.0
 * @category Number
 * @param {number} [lower=0] The lower bound.
 * @param {number} [upper=1] The upper bound.
 * @param {boolean} [floating] Specify returning a floating-point number.
 * @returns {number} Returns the random number.
 * @example
 *
 * _.random(0, 5);
 * // => an integer between 0 and 5
 *
 * _.random(5);
 * // => also an integer between 0 and 5
 *
 * _.random(5, true);
 * // => a floating-point number between 0 and 5
 *
 * _.random(1.2, 5.2);
 * // => a floating-point number between 1.2 and 5.2
 */
function random(lower, upper, floating) {
  if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {
    upper = floating = undefined;
  }
  if (floating === undefined) {
    if (typeof upper == 'boolean') {
      floating = upper;
      upper = undefined;
    }
    else if (typeof lower == 'boolean') {
      floating = lower;
      lower = undefined;
    }
  }
  if (lower === undefined && upper === undefined) {
    lower = 0;
    upper = 1;
  }
  else {
    lower = toFinite(lower);
    if (upper === undefined) {
      upper = lower;
      lower = 0;
    } else {
      upper = toFinite(upper);
    }
  }
  if (lower > upper) {
    var temp = lower;
    lower = upper;
    upper = temp;
  }
  if (floating || lower % 1 || upper % 1) {
    var rand = nativeRandom();
    return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);
  }
  return baseRandom(lower, upper);
}

module.exports = random;
var createRange = require('./_createRange');

/**
 * Creates an array of numbers (positive and/or negative) progressing from
 * `start` up to, but not including, `end`. A step of `-1` is used if a negative
 * `start` is specified without an `end` or `step`. If `end` is not specified,
 * it's set to `start` with `start` then set to `0`.
 *
 * **Note:** JavaScript follows the IEEE-754 standard for resolving
 * floating-point values which can produce unexpected results.
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category Util
 * @param {number} [start=0] The start of the range.
 * @param {number} end The end of the range.
 * @param {number} [step=1] The value to increment or decrement by.
 * @returns {Array} Returns the range of numbers.
 * @see _.inRange, _.rangeRight
 * @example
 *
 * _.range(4);
 * // => [0, 1, 2, 3]
 *
 * _.range(-4);
 * // => [0, -1, -2, -3]
 *
 * _.range(1, 5);
 * // => [1, 2, 3, 4]
 *
 * _.range(0, 20, 5);
 * // => [0, 5, 10, 15]
 *
 * _.range(0, -4, -1);
 * // => [0, -1, -2, -3]
 *
 * _.range(1, 4, 0);
 * // => [1, 1, 1]
 *
 * _.range(0);
 * // => []
 */
var range = createRange();

module.exports = range;
var createRange = require('./_createRange');

/**
 * This method is like `_.range` except that it populates values in
 * descending order.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Util
 * @param {number} [start=0] The start of the range.
 * @param {number} end The end of the range.
 * @param {number} [step=1] The value to increment or decrement by.
 * @returns {Array} Returns the range of numbers.
 * @see _.inRange, _.range
 * @example
 *
 * _.rangeRight(4);
 * // => [3, 2, 1, 0]
 *
 * _.rangeRight(-4);
 * // => [-3, -2, -1, 0]
 *
 * _.rangeRight(1, 5);
 * // => [4, 3, 2, 1]
 *
 * _.rangeRight(0, 20, 5);
 * // => [15, 10, 5, 0]
 *
 * _.rangeRight(0, -4, -1);
 * // => [-3, -2, -1, 0]
 *
 * _.rangeRight(1, 4, 0);
 * // => [1, 1, 1]
 *
 * _.rangeRight(0);
 * // => []
 */
var rangeRight = createRange(true);

module.exports = rangeRight;
var createWrap = require('./_createWrap'),
    flatRest = require('./_flatRest');

/** Used to compose bitmasks for function metadata. */
var WRAP_REARG_FLAG = 256;

/**
 * Creates a function that invokes `func` with arguments arranged according
 * to the specified `indexes` where the argument value at the first index is
 * provided as the first argument, the argument value at the second index is
 * provided as the second argument, and so on.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Function
 * @param {Function} func The function to rearrange arguments for.
 * @param {...(number|number[])} indexes The arranged argument indexes.
 * @returns {Function} Returns the new function.
 * @example
 *
 * var rearged = _.rearg(function(a, b, c) {
 *   return [a, b, c];
 * }, [2, 0, 1]);
 *
 * rearged('b', 'c', 'a')
 * // => ['a', 'b', 'c']
 */
var rearg = flatRest(function(func, indexes) {
  return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);
});

module.exports = rearg;
var arrayReduce = require('./_arrayReduce'),
    baseEach = require('./_baseEach'),
    baseIteratee = require('./_baseIteratee'),
    baseReduce = require('./_baseReduce'),
    isArray = require('./isArray');

/**
 * Reduces `collection` to a value which is the accumulated result of running
 * each element in `collection` thru `iteratee`, where each successive
 * invocation is supplied the return value of the previous. If `accumulator`
 * is not given, the first element of `collection` is used as the initial
 * value. The iteratee is invoked with four arguments:
 * (accumulator, value, index|key, collection).
 *
 * Many lodash methods are guarded to work as iteratees for methods like
 * `_.reduce`, `_.reduceRight`, and `_.transform`.
 *
 * The guarded methods are:
 * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
 * and `sortBy`
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Collection
 * @param {Array|Object} collection The collection to iterate over.
 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
 * @param {*} [accumulator] The initial value.
 * @returns {*} Returns the accumulated value.
 * @see _.reduceRight
 * @example
 *
 * _.reduce([1, 2], function(sum, n) {
 *   return sum + n;
 * }, 0);
 * // => 3
 *
 * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
 *   (result[value] || (result[value] = [])).push(key);
 *   return result;
 * }, {});
 * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
 */
function reduce(collection, iteratee, accumulator) {
  var func = isArray(collection) ? arrayReduce : baseReduce,
      initAccum = arguments.length < 3;

  return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);
}

module.exports = reduce;
var arrayReduceRight = require('./_arrayReduceRight'),
    baseEachRight = require('./_baseEachRight'),
    baseIteratee = require('./_baseIteratee'),
    baseReduce = require('./_baseReduce'),
    isArray = require('./isArray');

/**
 * This method is like `_.reduce` except that it iterates over elements of
 * `collection` from right to left.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Collection
 * @param {Array|Object} collection The collection to iterate over.
 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
 * @param {*} [accumulator] The initial value.
 * @returns {*} Returns the accumulated value.
 * @see _.reduce
 * @example
 *
 * var array = [[0, 1], [2, 3], [4, 5]];
 *
 * _.reduceRight(array, function(flattened, other) {
 *   return flattened.concat(other);
 * }, []);
 * // => [4, 5, 2, 3, 0, 1]
 */
function reduceRight(collection, iteratee, accumulator) {
  var func = isArray(collection) ? arrayReduceRight : baseReduce,
      initAccum = arguments.length < 3;

  return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);
}

module.exports = reduceRight;
var arrayFilter = require('./_arrayFilter'),
    baseFilter = require('./_baseFilter'),
    baseIteratee = require('./_baseIteratee'),
    isArray = require('./isArray'),
    negate = require('./negate');

/**
 * The opposite of `_.filter`; this method returns the elements of `collection`
 * that `predicate` does **not** return truthy for.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Collection
 * @param {Array|Object} collection The collection to iterate over.
 * @param {Function} [predicate=_.identity] The function invoked per iteration.
 * @returns {Array} Returns the new filtered array.
 * @see _.filter
 * @example
 *
 * var users = [
 *   { 'user': 'barney', 'age': 36, 'active': false },
 *   { 'user': 'fred',   'age': 40, 'active': true }
 * ];
 *
 * _.reject(users, function(o) { return !o.active; });
 * // => objects for ['fred']
 *
 * // The `_.matches` iteratee shorthand.
 * _.reject(users, { 'age': 40, 'active': true });
 * // => objects for ['barney']
 *
 * // The `_.matchesProperty` iteratee shorthand.
 * _.reject(users, ['active', false]);
 * // => objects for ['fred']
 *
 * // The `_.property` iteratee shorthand.
 * _.reject(users, 'active');
 * // => objects for ['barney']
 */
function reject(collection, predicate) {
  var func = isArray(collection) ? arrayFilter : baseFilter;
  return func(collection, negate(baseIteratee(predicate, 3)));
}

module.exports = reject;
npm run build
npm run doc
npm i
git clone --depth=10 --branch=master git@github.com:lodash-archive/lodash-cli.git ./node_modules/lodash-cli
mkdir -p ./node_modules/lodash-cli/node_modules/lodash; cd $_; cp ../../../../lodash.js ./lodash.js; cp ../../../../package.json ./package.json
cd ../../; npm i --production; cd ../../
node ./node_modules/lodash-cli/bin/lodash core exports=node -o ./npm-package/core.js
node ./node_modules/lodash-cli/bin/lodash modularize exports=node -o ./npm-package
cp lodash.js npm-package/lodash.js
cp dist/lodash.min.js npm-package/lodash.min.js
cp LICENSE npm-package/LICENSE

1. Clone two repos
Bump lodash version in package.json, readme, package=locak, lodash.js
npm run build
npm run doc

2. update mappings in ldoash-cli
3. copy ldoash into lodash-cli node modules and package json.

node ./node_modules/lodash-cli/bin/lodash core exports=node -o ./npm-package/core.js
node ./node_modules/lodash-cli/bin/lodash modularize exports=node -o ./npm-package



1. Clone the two repositories:
```sh
$ git clone https://github.com/lodash/lodash.git
$ git clone https://github.com/bnjmnt4n/lodash-cli.git
```
2. Update lodash-cli to accomdate changes in lodash source. This can typically involve adding new function dependency mappings in lib/mappings.js. Sometimes, additional changes might be needed for more involved functions.
3. In the lodash repository, update references to the lodash version in README.md, lodash.js, package.jsona nd package-lock.json
4. Run:
```sh
npm run build
npm run doc
node ../lodash-cli/bin/lodash core -o ./dist/lodash.core.js
```
5. Add a commit and tag the release
mkdir ../lodash-temp
cp lodash.js dist/lodash.min.js dist/lodash.core.js dist/lodash.core.min.js ../lodash-temp/
node ../lodash-cli/bin/lodash modularize exports=node -o .
cp ../lodash-temp/lodash.core.js core.js
cp ../lodash-temp/lodash.core.min.js core.min.js
cp ../lodash-temp/lodash.js lodash.js
cp ../lodash-temp/lodash.min.js lodash.min.js

❯ node ../lodash-cli/bin/lodash modularize exports=es -o .
var baseIteratee = require('./_baseIteratee'),
    basePullAt = require('./_basePullAt');

/**
 * Removes all elements from `array` that `predicate` returns truthy for
 * and returns an array of the removed elements. The predicate is invoked
 * with three arguments: (value, index, array).
 *
 * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
 * to pull elements from an array by value.
 *
 * @static
 * @memberOf _
 * @since 2.0.0
 * @category Array
 * @param {Array} array The array to modify.
 * @param {Function} [predicate=_.identity] The function invoked per iteration.
 * @returns {Array} Returns the new array of removed elements.
 * @example
 *
 * var array = [1, 2, 3, 4];
 * var evens = _.remove(array, function(n) {
 *   return n % 2 == 0;
 * });
 *
 * console.log(array);
 * // => [1, 3]
 *
 * console.log(evens);
 * // => [2, 4]
 */
function remove(array, predicate) {
  var result = [];
  if (!(array && array.length)) {
    return result;
  }
  var index = -1,
      indexes = [],
      length = array.length;

  predicate = baseIteratee(predicate, 3);
  while (++index < length) {
    var value = array[index];
    if (predicate(value, index, array)) {
      result.push(value);
      indexes.push(index);
    }
  }
  basePullAt(array, indexes);
  return result;
}

module.exports = remove;
var baseRepeat = require('./_baseRepeat'),
    isIterateeCall = require('./_isIterateeCall'),
    toInteger = require('./toInteger'),
    toString = require('./toString');

/**
 * Repeats the given string `n` times.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category String
 * @param {string} [string=''] The string to repeat.
 * @param {number} [n=1] The number of times to repeat the string.
 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
 * @returns {string} Returns the repeated string.
 * @example
 *
 * _.repeat('*', 3);
 * // => '***'
 *
 * _.repeat('abc', 2);
 * // => 'abcabc'
 *
 * _.repeat('abc', 0);
 * // => ''
 */
function repeat(string, n, guard) {
  if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {
    n = 1;
  } else {
    n = toInteger(n);
  }
  return baseRepeat(toString(string), n);
}

module.exports = repeat;
var toString = require('./toString');

/**
 * Replaces matches for `pattern` in `string` with `replacement`.
 *
 * **Note:** This method is based on
 * [`String#replace`](https://mdn.io/String/replace).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category String
 * @param {string} [string=''] The string to modify.
 * @param {RegExp|string} pattern The pattern to replace.
 * @param {Function|string} replacement The match replacement.
 * @returns {string} Returns the modified string.
 * @example
 *
 * _.replace('Hi Fred', 'Fred', 'Barney');
 * // => 'Hi Barney'
 */
function replace() {
  var args = arguments,
      string = toString(args[0]);

  return args.length < 3 ? string : string.replace(args[1], args[2]);
}

module.exports = replace;
var baseRest = require('./_baseRest'),
    toInteger = require('./toInteger');

/** Error message constants. */
var FUNC_ERROR_TEXT = 'Expected a function';

/**
 * Creates a function that invokes `func` with the `this` binding of the
 * created function and arguments from `start` and beyond provided as
 * an array.
 *
 * **Note:** This method is based on the
 * [rest parameter](https://mdn.io/rest_parameters).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Function
 * @param {Function} func The function to apply a rest parameter to.
 * @param {number} [start=func.length-1] The start position of the rest parameter.
 * @returns {Function} Returns the new function.
 * @example
 *
 * var say = _.rest(function(what, names) {
 *   return what + ' ' + _.initial(names).join(', ') +
 *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);
 * });
 *
 * say('hello', 'fred', 'barney', 'pebbles');
 * // => 'hello fred, barney, & pebbles'
 */
function rest(func, start) {
  if (typeof func != 'function') {
    throw new TypeError(FUNC_ERROR_TEXT);
  }
  start = start === undefined ? start : toInteger(start);
  return baseRest(func, start);
}

module.exports = rest;
var castPath = require('./_castPath'),
    isFunction = require('./isFunction'),
    toKey = require('./_toKey');

/**
 * This method is like `_.get` except that if the resolved value is a
 * function it's invoked with the `this` binding of its parent object and
 * its result is returned.
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category Object
 * @param {Object} object The object to query.
 * @param {Array|string} path The path of the property to resolve.
 * @param {*} [defaultValue] The value returned for `undefined` resolved values.
 * @returns {*} Returns the resolved value.
 * @example
 *
 * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
 *
 * _.result(object, 'a[0].b.c1');
 * // => 3
 *
 * _.result(object, 'a[0].b.c2');
 * // => 4
 *
 * _.result(object, 'a[0].b.c3', 'default');
 * // => 'default'
 *
 * _.result(object, 'a[0].b.c3', _.constant('default'));
 * // => 'default'
 */
function result(object, path, defaultValue) {
  path = castPath(path, object);

  var index = -1,
      length = path.length;

  // Ensure the loop is entered when path is empty.
  if (!length) {
    length = 1;
    object = undefined;
  }
  while (++index < length) {
    var value = object == null ? undefined : object[toKey(path[index])];
    if (value === undefined) {
      index = length;
      value = defaultValue;
    }
    object = isFunction(value) ? value.call(object) : value;
  }
  return object;
}

module.exports = result;
/** Used for built-in method references. */
var arrayProto = Array.prototype;

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeReverse = arrayProto.reverse;

/**
 * Reverses `array` so that the first element becomes the last, the second
 * element becomes the second to last, and so on.
 *
 * **Note:** This method mutates `array` and is based on
 * [`Array#reverse`](https://mdn.io/Array/reverse).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Array
 * @param {Array} array The array to modify.
 * @returns {Array} Returns `array`.
 * @example
 *
 * var array = [1, 2, 3];
 *
 * _.reverse(array);
 * // => [3, 2, 1]
 *
 * console.log(array);
 * // => [3, 2, 1]
 */
function reverse(array) {
  return array == null ? array : nativeReverse.call(array);
}

module.exports = reverse;
var createRound = require('./_createRound');

/**
 * Computes `number` rounded to `precision`.
 *
 * @static
 * @memberOf _
 * @since 3.10.0
 * @category Math
 * @param {number} number The number to round.
 * @param {number} [precision=0] The precision to round to.
 * @returns {number} Returns the rounded number.
 * @example
 *
 * _.round(4.006);
 * // => 4
 *
 * _.round(4.006, 2);
 * // => 4.01
 *
 * _.round(4060, -2);
 * // => 4100
 */
var round = createRound('round');

module.exports = round;
var arraySample = require('./_arraySample'),
    baseSample = require('./_baseSample'),
    isArray = require('./isArray');

/**
 * Gets a random element from `collection`.
 *
 * @static
 * @memberOf _
 * @since 2.0.0
 * @category Collection
 * @param {Array|Object} collection The collection to sample.
 * @returns {*} Returns the random element.
 * @example
 *
 * _.sample([1, 2, 3, 4]);
 * // => 2
 */
function sample(collection) {
  var func = isArray(collection) ? arraySample : baseSample;
  return func(collection);
}

module.exports = sample;
var arraySampleSize = require('./_arraySampleSize'),
    baseSampleSize = require('./_baseSampleSize'),
    isArray = require('./isArray'),
    isIterateeCall = require('./_isIterateeCall'),
    toInteger = require('./toInteger');

/**
 * Gets `n` random elements at unique keys from `collection` up to the
 * size of `collection`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Collection
 * @param {Array|Object} collection The collection to sample.
 * @param {number} [n=1] The number of elements to sample.
 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
 * @returns {Array} Returns the random elements.
 * @example
 *
 * _.sampleSize([1, 2, 3], 2);
 * // => [3, 1]
 *
 * _.sampleSize([1, 2, 3], 4);
 * // => [2, 3, 1]
 */
function sampleSize(collection, n, guard) {
  if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {
    n = 1;
  } else {
    n = toInteger(n);
  }
  var func = isArray(collection) ? arraySampleSize : baseSampleSize;
  return func(collection, n);
}

module.exports = sampleSize;
module.exports = {
  'at': require('./wrapperAt'),
  'chain': require('./chain'),
  'commit': require('./commit'),
  'lodash': require('./wrapperLodash'),
  'next': require('./next'),
  'plant': require('./plant'),
  'reverse': require('./wrapperReverse'),
  'tap': require('./tap'),
  'thru': require('./thru'),
  'toIterator': require('./toIterator'),
  'toJSON': require('./toJSON'),
  'value': require('./wrapperValue'),
  'valueOf': require('./valueOf'),
  'wrapperChain': require('./wrapperChain')
};
var baseSet = require('./_baseSet');

/**
 * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,
 * it's created. Arrays are created for missing index properties while objects
 * are created for all other missing properties. Use `_.setWith` to customize
 * `path` creation.
 *
 * **Note:** This method mutates `object`.
 *
 * @static
 * @memberOf _
 * @since 3.7.0
 * @category Object
 * @param {Object} object The object to modify.
 * @param {Array|string} path The path of the property to set.
 * @param {*} value The value to set.
 * @returns {Object} Returns `object`.
 * @example
 *
 * var object = { 'a': [{ 'b': { 'c': 3 } }] };
 *
 * _.set(object, 'a[0].b.c', 4);
 * console.log(object.a[0].b.c);
 * // => 4
 *
 * _.set(object, ['x', '0', 'y', 'z'], 5);
 * console.log(object.x[0].y.z);
 * // => 5
 */
function set(object, path, value) {
  return object == null ? object : baseSet(object, path, value);
}

module.exports = set;
var baseSet = require('./_baseSet');

/**
 * This method is like `_.set` except that it accepts `customizer` which is
 * invoked to produce the objects of `path`.  If `customizer` returns `undefined`
 * path creation is handled by the method instead. The `customizer` is invoked
 * with three arguments: (nsValue, key, nsObject).
 *
 * **Note:** This method mutates `object`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Object
 * @param {Object} object The object to modify.
 * @param {Array|string} path The path of the property to set.
 * @param {*} value The value to set.
 * @param {Function} [customizer] The function to customize assigned values.
 * @returns {Object} Returns `object`.
 * @example
 *
 * var object = {};
 *
 * _.setWith(object, '[0][1]', 'a', Object);
 * // => { '0': { '1': 'a' } }
 */
function setWith(object, path, value, customizer) {
  customizer = typeof customizer == 'function' ? customizer : undefined;
  return object == null ? object : baseSet(object, path, value, customizer);
}

module.exports = setWith;
var arrayShuffle = require('./_arrayShuffle'),
    baseShuffle = require('./_baseShuffle'),
    isArray = require('./isArray');

/**
 * Creates an array of shuffled values, using a version of the
 * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Collection
 * @param {Array|Object} collection The collection to shuffle.
 * @returns {Array} Returns the new shuffled array.
 * @example
 *
 * _.shuffle([1, 2, 3, 4]);
 * // => [4, 1, 3, 2]
 */
function shuffle(collection) {
  var func = isArray(collection) ? arrayShuffle : baseShuffle;
  return func(collection);
}

module.exports = shuffle;
var baseKeys = require('./_baseKeys'),
    getTag = require('./_getTag'),
    isArrayLike = require('./isArrayLike'),
    isString = require('./isString'),
    stringSize = require('./_stringSize');

/** `Object#toString` result references. */
var mapTag = '[object Map]',
    setTag = '[object Set]';

/**
 * Gets the size of `collection` by returning its length for array-like
 * values or the number of own enumerable string keyed properties for objects.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Collection
 * @param {Array|Object|string} collection The collection to inspect.
 * @returns {number} Returns the collection size.
 * @example
 *
 * _.size([1, 2, 3]);
 * // => 3
 *
 * _.size({ 'a': 1, 'b': 2 });
 * // => 2
 *
 * _.size('pebbles');
 * // => 7
 */
function size(collection) {
  if (collection == null) {
    return 0;
  }
  if (isArrayLike(collection)) {
    return isString(collection) ? stringSize(collection) : collection.length;
  }
  var tag = getTag(collection);
  if (tag == mapTag || tag == setTag) {
    return collection.size;
  }
  return baseKeys(collection).length;
}

module.exports = size;
var baseSlice = require('./_baseSlice'),
    isIterateeCall = require('./_isIterateeCall'),
    toInteger = require('./toInteger');

/**
 * Creates a slice of `array` from `start` up to, but not including, `end`.
 *
 * **Note:** This method is used instead of
 * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are
 * returned.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Array
 * @param {Array} array The array to slice.
 * @param {number} [start=0] The start position.
 * @param {number} [end=array.length] The end position.
 * @returns {Array} Returns the slice of `array`.
 */
function slice(array, start, end) {
  var length = array == null ? 0 : array.length;
  if (!length) {
    return [];
  }
  if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {
    start = 0;
    end = length;
  }
  else {
    start = start == null ? 0 : toInteger(start);
    end = end === undefined ? length : toInteger(end);
  }
  return baseSlice(array, start, end);
}

module.exports = slice;
var createCompounder = require('./_createCompounder');

/**
 * Converts `string` to
 * [snake case](https://en.wikipedia.org/wiki/Snake_case).
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category String
 * @param {string} [string=''] The string to convert.
 * @returns {string} Returns the snake cased string.
 * @example
 *
 * _.snakeCase('Foo Bar');
 * // => 'foo_bar'
 *
 * _.snakeCase('fooBar');
 * // => 'foo_bar'
 *
 * _.snakeCase('--FOO-BAR--');
 * // => 'foo_bar'
 */
var snakeCase = createCompounder(function(result, word, index) {
  return result + (index ? '_' : '') + word.toLowerCase();
});

module.exports = snakeCase;
var arraySome = require('./_arraySome'),
    baseIteratee = require('./_baseIteratee'),
    baseSome = require('./_baseSome'),
    isArray = require('./isArray'),
    isIterateeCall = require('./_isIterateeCall');

/**
 * Checks if `predicate` returns truthy for **any** element of `collection`.
 * Iteration is stopped once `predicate` returns truthy. The predicate is
 * invoked with three arguments: (value, index|key, collection).
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Collection
 * @param {Array|Object} collection The collection to iterate over.
 * @param {Function} [predicate=_.identity] The function invoked per iteration.
 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
 * @returns {boolean} Returns `true` if any element passes the predicate check,
 *  else `false`.
 * @example
 *
 * _.some([null, 0, 'yes', false], Boolean);
 * // => true
 *
 * var users = [
 *   { 'user': 'barney', 'active': true },
 *   { 'user': 'fred',   'active': false }
 * ];
 *
 * // The `_.matches` iteratee shorthand.
 * _.some(users, { 'user': 'barney', 'active': false });
 * // => false
 *
 * // The `_.matchesProperty` iteratee shorthand.
 * _.some(users, ['active', false]);
 * // => true
 *
 * // The `_.property` iteratee shorthand.
 * _.some(users, 'active');
 * // => true
 */
function some(collection, predicate, guard) {
  var func = isArray(collection) ? arraySome : baseSome;
  if (guard && isIterateeCall(collection, predicate, guard)) {
    predicate = undefined;
  }
  return func(collection, baseIteratee(predicate, 3));
}

module.exports = some;
var baseFlatten = require('./_baseFlatten'),
    baseOrderBy = require('./_baseOrderBy'),
    baseRest = require('./_baseRest'),
    isIterateeCall = require('./_isIterateeCall');

/**
 * Creates an array of elements, sorted in ascending order by the results of
 * running each element in a collection thru each iteratee. This method
 * performs a stable sort, that is, it preserves the original sort order of
 * equal elements. The iteratees are invoked with one argument: (value).
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Collection
 * @param {Array|Object} collection The collection to iterate over.
 * @param {...(Function|Function[])} [iteratees=[_.identity]]
 *  The iteratees to sort by.
 * @returns {Array} Returns the new sorted array.
 * @example
 *
 * var users = [
 *   { 'user': 'fred',   'age': 48 },
 *   { 'user': 'barney', 'age': 36 },
 *   { 'user': 'fred',   'age': 30 },
 *   { 'user': 'barney', 'age': 34 }
 * ];
 *
 * _.sortBy(users, [function(o) { return o.user; }]);
 * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]
 *
 * _.sortBy(users, ['user', 'age']);
 * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]
 */
var sortBy = baseRest(function(collection, iteratees) {
  if (collection == null) {
    return [];
  }
  var length = iteratees.length;
  if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {
    iteratees = [];
  } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {
    iteratees = [iteratees[0]];
  }
  return baseOrderBy(collection, baseFlatten(iteratees, 1), []);
});

module.exports = sortBy;
var baseSortedIndex = require('./_baseSortedIndex');

/**
 * Uses a binary search to determine the lowest index at which `value`
 * should be inserted into `array` in order to maintain its sort order.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Array
 * @param {Array} array The sorted array to inspect.
 * @param {*} value The value to evaluate.
 * @returns {number} Returns the index at which `value` should be inserted
 *  into `array`.
 * @example
 *
 * _.sortedIndex([30, 50], 40);
 * // => 1
 */
function sortedIndex(array, value) {
  return baseSortedIndex(array, value);
}

module.exports = sortedIndex;
var baseIteratee = require('./_baseIteratee'),
    baseSortedIndexBy = require('./_baseSortedIndexBy');

/**
 * This method is like `_.sortedIndex` except that it accepts `iteratee`
 * which is invoked for `value` and each element of `array` to compute their
 * sort ranking. The iteratee is invoked with one argument: (value).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Array
 * @param {Array} array The sorted array to inspect.
 * @param {*} value The value to evaluate.
 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
 * @returns {number} Returns the index at which `value` should be inserted
 *  into `array`.
 * @example
 *
 * var objects = [{ 'x': 4 }, { 'x': 5 }];
 *
 * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
 * // => 0
 *
 * // The `_.property` iteratee shorthand.
 * _.sortedIndexBy(objects, { 'x': 4 }, 'x');
 * // => 0
 */
function sortedIndexBy(array, value, iteratee) {
  return baseSortedIndexBy(array, value, baseIteratee(iteratee, 2));
}

module.exports = sortedIndexBy;
var baseSortedIndex = require('./_baseSortedIndex'),
    eq = require('./eq');

/**
 * This method is like `_.indexOf` except that it performs a binary
 * search on a sorted `array`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Array
 * @param {Array} array The array to inspect.
 * @param {*} value The value to search for.
 * @returns {number} Returns the index of the matched value, else `-1`.
 * @example
 *
 * _.sortedIndexOf([4, 5, 5, 5, 6], 5);
 * // => 1
 */
function sortedIndexOf(array, value) {
  var length = array == null ? 0 : array.length;
  if (length) {
    var index = baseSortedIndex(array, value);
    if (index < length && eq(array[index], value)) {
      return index;
    }
  }
  return -1;
}

module.exports = sortedIndexOf;
var baseSortedIndex = require('./_baseSortedIndex');

/**
 * This method is like `_.sortedIndex` except that it returns the highest
 * index at which `value` should be inserted into `array` in order to
 * maintain its sort order.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Array
 * @param {Array} array The sorted array to inspect.
 * @param {*} value The value to evaluate.
 * @returns {number} Returns the index at which `value` should be inserted
 *  into `array`.
 * @example
 *
 * _.sortedLastIndex([4, 5, 5, 5, 6], 5);
 * // => 4
 */
function sortedLastIndex(array, value) {
  return baseSortedIndex(array, value, true);
}

module.exports = sortedLastIndex;
var baseIteratee = require('./_baseIteratee'),
    baseSortedIndexBy = require('./_baseSortedIndexBy');

/**
 * This method is like `_.sortedLastIndex` except that it accepts `iteratee`
 * which is invoked for `value` and each element of `array` to compute their
 * sort ranking. The iteratee is invoked with one argument: (value).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Array
 * @param {Array} array The sorted array to inspect.
 * @param {*} value The value to evaluate.
 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
 * @returns {number} Returns the index at which `value` should be inserted
 *  into `array`.
 * @example
 *
 * var objects = [{ 'x': 4 }, { 'x': 5 }];
 *
 * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
 * // => 1
 *
 * // The `_.property` iteratee shorthand.
 * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');
 * // => 1
 */
function sortedLastIndexBy(array, value, iteratee) {
  return baseSortedIndexBy(array, value, baseIteratee(iteratee, 2), true);
}

module.exports = sortedLastIndexBy;
var baseSortedIndex = require('./_baseSortedIndex'),
    eq = require('./eq');

/**
 * This method is like `_.lastIndexOf` except that it performs a binary
 * search on a sorted `array`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Array
 * @param {Array} array The array to inspect.
 * @param {*} value The value to search for.
 * @returns {number} Returns the index of the matched value, else `-1`.
 * @example
 *
 * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);
 * // => 3
 */
function sortedLastIndexOf(array, value) {
  var length = array == null ? 0 : array.length;
  if (length) {
    var index = baseSortedIndex(array, value, true) - 1;
    if (eq(array[index], value)) {
      return index;
    }
  }
  return -1;
}

module.exports = sortedLastIndexOf;
var baseSortedUniq = require('./_baseSortedUniq');

/**
 * This method is like `_.uniq` except that it's designed and optimized
 * for sorted arrays.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Array
 * @param {Array} array The array to inspect.
 * @returns {Array} Returns the new duplicate free array.
 * @example
 *
 * _.sortedUniq([1, 1, 2]);
 * // => [1, 2]
 */
function sortedUniq(array) {
  return (array && array.length)
    ? baseSortedUniq(array)
    : [];
}

module.exports = sortedUniq;
var baseIteratee = require('./_baseIteratee'),
    baseSortedUniq = require('./_baseSortedUniq');

/**
 * This method is like `_.uniqBy` except that it's designed and optimized
 * for sorted arrays.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Array
 * @param {Array} array The array to inspect.
 * @param {Function} [iteratee] The iteratee invoked per element.
 * @returns {Array} Returns the new duplicate free array.
 * @example
 *
 * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);
 * // => [1.1, 2.3]
 */
function sortedUniqBy(array, iteratee) {
  return (array && array.length)
    ? baseSortedUniq(array, baseIteratee(iteratee, 2))
    : [];
}

module.exports = sortedUniqBy;
var baseToString = require('./_baseToString'),
    castSlice = require('./_castSlice'),
    hasUnicode = require('./_hasUnicode'),
    isIterateeCall = require('./_isIterateeCall'),
    isRegExp = require('./isRegExp'),
    stringToArray = require('./_stringToArray'),
    toString = require('./toString');

/** Used as references for the maximum length and index of an array. */
var MAX_ARRAY_LENGTH = 4294967295;

/**
 * Splits `string` by `separator`.
 *
 * **Note:** This method is based on
 * [`String#split`](https://mdn.io/String/split).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category String
 * @param {string} [string=''] The string to split.
 * @param {RegExp|string} separator The separator pattern to split by.
 * @param {number} [limit] The length to truncate results to.
 * @returns {Array} Returns the string segments.
 * @example
 *
 * _.split('a-b-c', '-', 2);
 * // => ['a', 'b']
 */
function split(string, separator, limit) {
  if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {
    separator = limit = undefined;
  }
  limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;
  if (!limit) {
    return [];
  }
  string = toString(string);
  if (string && (
        typeof separator == 'string' ||
        (separator != null && !isRegExp(separator))
      )) {
    separator = baseToString(separator);
    if (!separator && hasUnicode(string)) {
      return castSlice(stringToArray(string), 0, limit);
    }
  }
  return string.split(separator, limit);
}

module.exports = split;
var apply = require('./_apply'),
    arrayPush = require('./_arrayPush'),
    baseRest = require('./_baseRest'),
    castSlice = require('./_castSlice'),
    toInteger = require('./toInteger');

/** Error message constants. */
var FUNC_ERROR_TEXT = 'Expected a function';

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max;

/**
 * Creates a function that invokes `func` with the `this` binding of the
 * create function and an array of arguments much like
 * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).
 *
 * **Note:** This method is based on the
 * [spread operator](https://mdn.io/spread_operator).
 *
 * @static
 * @memberOf _
 * @since 3.2.0
 * @category Function
 * @param {Function} func The function to spread arguments over.
 * @param {number} [start=0] The start position of the spread.
 * @returns {Function} Returns the new function.
 * @example
 *
 * var say = _.spread(function(who, what) {
 *   return who + ' says ' + what;
 * });
 *
 * say(['fred', 'hello']);
 * // => 'fred says hello'
 *
 * var numbers = Promise.all([
 *   Promise.resolve(40),
 *   Promise.resolve(36)
 * ]);
 *
 * numbers.then(_.spread(function(x, y) {
 *   return x + y;
 * }));
 * // => a Promise of 76
 */
function spread(func, start) {
  if (typeof func != 'function') {
    throw new TypeError(FUNC_ERROR_TEXT);
  }
  start = start == null ? 0 : nativeMax(toInteger(start), 0);
  return baseRest(function(args) {
    var array = args[start],
        otherArgs = castSlice(args, 0, start);

    if (array) {
      arrayPush(otherArgs, array);
    }
    return apply(func, this, otherArgs);
  });
}

module.exports = spread;
var createCompounder = require('./_createCompounder'),
    upperFirst = require('./upperFirst');

/**
 * Converts `string` to
 * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).
 *
 * @static
 * @memberOf _
 * @since 3.1.0
 * @category String
 * @param {string} [string=''] The string to convert.
 * @returns {string} Returns the start cased string.
 * @example
 *
 * _.startCase('--foo-bar--');
 * // => 'Foo Bar'
 *
 * _.startCase('fooBar');
 * // => 'Foo Bar'
 *
 * _.startCase('__FOO_BAR__');
 * // => 'FOO BAR'
 */
var startCase = createCompounder(function(result, word, index) {
  return result + (index ? ' ' : '') + upperFirst(word);
});

module.exports = startCase;
var baseClamp = require('./_baseClamp'),
    baseToString = require('./_baseToString'),
    toInteger = require('./toInteger'),
    toString = require('./toString');

/**
 * Checks if `string` starts with the given target string.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category String
 * @param {string} [string=''] The string to inspect.
 * @param {string} [target] The string to search for.
 * @param {number} [position=0] The position to search from.
 * @returns {boolean} Returns `true` if `string` starts with `target`,
 *  else `false`.
 * @example
 *
 * _.startsWith('abc', 'a');
 * // => true
 *
 * _.startsWith('abc', 'b');
 * // => false
 *
 * _.startsWith('abc', 'b', 1);
 * // => true
 */
function startsWith(string, target, position) {
  string = toString(string);
  position = position == null
    ? 0
    : baseClamp(toInteger(position), 0, string.length);

  target = baseToString(target);
  return string.slice(position, position + target.length) == target;
}

module.exports = startsWith;
module.exports = {
  'camelCase': require('./camelCase'),
  'capitalize': require('./capitalize'),
  'deburr': require('./deburr'),
  'endsWith': require('./endsWith'),
  'escape': require('./escape'),
  'escapeRegExp': require('./escapeRegExp'),
  'kebabCase': require('./kebabCase'),
  'lowerCase': require('./lowerCase'),
  'lowerFirst': require('./lowerFirst'),
  'pad': require('./pad'),
  'padEnd': require('./padEnd'),
  'padStart': require('./padStart'),
  'parseInt': require('./parseInt'),
  'repeat': require('./repeat'),
  'replace': require('./replace'),
  'snakeCase': require('./snakeCase'),
  'split': require('./split'),
  'startCase': require('./startCase'),
  'startsWith': require('./startsWith'),
  'template': require('./template'),
  'templateSettings': require('./templateSettings'),
  'toLower': require('./toLower'),
  'toUpper': require('./toUpper'),
  'trim': require('./trim'),
  'trimEnd': require('./trimEnd'),
  'trimStart': require('./trimStart'),
  'truncate': require('./truncate'),
  'unescape': require('./unescape'),
  'upperCase': require('./upperCase'),
  'upperFirst': require('./upperFirst'),
  'words': require('./words')
};
/**
 * This method returns a new empty array.
 *
 * @static
 * @memberOf _
 * @since 4.13.0
 * @category Util
 * @returns {Array} Returns the new empty array.
 * @example
 *
 * var arrays = _.times(2, _.stubArray);
 *
 * console.log(arrays);
 * // => [[], []]
 *
 * console.log(arrays[0] === arrays[1]);
 * // => false
 */
function stubArray() {
  return [];
}

module.exports = stubArray;
/**
 * This method returns `false`.
 *
 * @static
 * @memberOf _
 * @since 4.13.0
 * @category Util
 * @returns {boolean} Returns `false`.
 * @example
 *
 * _.times(2, _.stubFalse);
 * // => [false, false]
 */
function stubFalse() {
  return false;
}

module.exports = stubFalse;
/**
 * This method returns a new empty object.
 *
 * @static
 * @memberOf _
 * @since 4.13.0
 * @category Util
 * @returns {Object} Returns the new empty object.
 * @example
 *
 * var objects = _.times(2, _.stubObject);
 *
 * console.log(objects);
 * // => [{}, {}]
 *
 * console.log(objects[0] === objects[1]);
 * // => false
 */
function stubObject() {
  return {};
}

module.exports = stubObject;
/**
 * This method returns an empty string.
 *
 * @static
 * @memberOf _
 * @since 4.13.0
 * @category Util
 * @returns {string} Returns the empty string.
 * @example
 *
 * _.times(2, _.stubString);
 * // => ['', '']
 */
function stubString() {
  return '';
}

module.exports = stubString;
/**
 * This method returns `true`.
 *
 * @static
 * @memberOf _
 * @since 4.13.0
 * @category Util
 * @returns {boolean} Returns `true`.
 * @example
 *
 * _.times(2, _.stubTrue);
 * // => [true, true]
 */
function stubTrue() {
  return true;
}

module.exports = stubTrue;
var createMathOperation = require('./_createMathOperation');

/**
 * Subtract two numbers.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Math
 * @param {number} minuend The first number in a subtraction.
 * @param {number} subtrahend The second number in a subtraction.
 * @returns {number} Returns the difference.
 * @example
 *
 * _.subtract(6, 4);
 * // => 2
 */
var subtract = createMathOperation(function(minuend, subtrahend) {
  return minuend - subtrahend;
}, 0);

module.exports = subtract;
var baseSum = require('./_baseSum'),
    identity = require('./identity');

/**
 * Computes the sum of the values in `array`.
 *
 * @static
 * @memberOf _
 * @since 3.4.0
 * @category Math
 * @param {Array} array The array to iterate over.
 * @returns {number} Returns the sum.
 * @example
 *
 * _.sum([4, 2, 8, 6]);
 * // => 20
 */
function sum(array) {
  return (array && array.length)
    ? baseSum(array, identity)
    : 0;
}

module.exports = sum;
var baseIteratee = require('./_baseIteratee'),
    baseSum = require('./_baseSum');

/**
 * This method is like `_.sum` except that it accepts `iteratee` which is
 * invoked for each element in `array` to generate the value to be summed.
 * The iteratee is invoked with one argument: (value).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Math
 * @param {Array} array The array to iterate over.
 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
 * @returns {number} Returns the sum.
 * @example
 *
 * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
 *
 * _.sumBy(objects, function(o) { return o.n; });
 * // => 20
 *
 * // The `_.property` iteratee shorthand.
 * _.sumBy(objects, 'n');
 * // => 20
 */
function sumBy(array, iteratee) {
  return (array && array.length)
    ? baseSum(array, baseIteratee(iteratee, 2))
    : 0;
}

module.exports = sumBy;
var baseSlice = require('./_baseSlice');

/**
 * Gets all but the first element of `array`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Array
 * @param {Array} array The array to query.
 * @returns {Array} Returns the slice of `array`.
 * @example
 *
 * _.tail([1, 2, 3]);
 * // => [2, 3]
 */
function tail(array) {
  var length = array == null ? 0 : array.length;
  return length ? baseSlice(array, 1, length) : [];
}

module.exports = tail;
var baseSlice = require('./_baseSlice'),
    toInteger = require('./toInteger');

/**
 * Creates a slice of `array` with `n` elements taken from the beginning.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Array
 * @param {Array} array The array to query.
 * @param {number} [n=1] The number of elements to take.
 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
 * @returns {Array} Returns the slice of `array`.
 * @example
 *
 * _.take([1, 2, 3]);
 * // => [1]
 *
 * _.take([1, 2, 3], 2);
 * // => [1, 2]
 *
 * _.take([1, 2, 3], 5);
 * // => [1, 2, 3]
 *
 * _.take([1, 2, 3], 0);
 * // => []
 */
function take(array, n, guard) {
  if (!(array && array.length)) {
    return [];
  }
  n = (guard || n === undefined) ? 1 : toInteger(n);
  return baseSlice(array, 0, n < 0 ? 0 : n);
}

module.exports = take;
var baseSlice = require('./_baseSlice'),
    toInteger = require('./toInteger');

/**
 * Creates a slice of `array` with `n` elements taken from the end.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Array
 * @param {Array} array The array to query.
 * @param {number} [n=1] The number of elements to take.
 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
 * @returns {Array} Returns the slice of `array`.
 * @example
 *
 * _.takeRight([1, 2, 3]);
 * // => [3]
 *
 * _.takeRight([1, 2, 3], 2);
 * // => [2, 3]
 *
 * _.takeRight([1, 2, 3], 5);
 * // => [1, 2, 3]
 *
 * _.takeRight([1, 2, 3], 0);
 * // => []
 */
function takeRight(array, n, guard) {
  var length = array == null ? 0 : array.length;
  if (!length) {
    return [];
  }
  n = (guard || n === undefined) ? 1 : toInteger(n);
  n = length - n;
  return baseSlice(array, n < 0 ? 0 : n, length);
}

module.exports = takeRight;
var baseIteratee = require('./_baseIteratee'),
    baseWhile = require('./_baseWhile');

/**
 * Creates a slice of `array` with elements taken from the end. Elements are
 * taken until `predicate` returns falsey. The predicate is invoked with
 * three arguments: (value, index, array).
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Array
 * @param {Array} array The array to query.
 * @param {Function} [predicate=_.identity] The function invoked per iteration.
 * @returns {Array} Returns the slice of `array`.
 * @example
 *
 * var users = [
 *   { 'user': 'barney',  'active': true },
 *   { 'user': 'fred',    'active': false },
 *   { 'user': 'pebbles', 'active': false }
 * ];
 *
 * _.takeRightWhile(users, function(o) { return !o.active; });
 * // => objects for ['fred', 'pebbles']
 *
 * // The `_.matches` iteratee shorthand.
 * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });
 * // => objects for ['pebbles']
 *
 * // The `_.matchesProperty` iteratee shorthand.
 * _.takeRightWhile(users, ['active', false]);
 * // => objects for ['fred', 'pebbles']
 *
 * // The `_.property` iteratee shorthand.
 * _.takeRightWhile(users, 'active');
 * // => []
 */
function takeRightWhile(array, predicate) {
  return (array && array.length)
    ? baseWhile(array, baseIteratee(predicate, 3), false, true)
    : [];
}

module.exports = takeRightWhile;
var baseIteratee = require('./_baseIteratee'),
    baseWhile = require('./_baseWhile');

/**
 * Creates a slice of `array` with elements taken from the beginning. Elements
 * are taken until `predicate` returns falsey. The predicate is invoked with
 * three arguments: (value, index, array).
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Array
 * @param {Array} array The array to query.
 * @param {Function} [predicate=_.identity] The function invoked per iteration.
 * @returns {Array} Returns the slice of `array`.
 * @example
 *
 * var users = [
 *   { 'user': 'barney',  'active': false },
 *   { 'user': 'fred',    'active': false },
 *   { 'user': 'pebbles', 'active': true }
 * ];
 *
 * _.takeWhile(users, function(o) { return !o.active; });
 * // => objects for ['barney', 'fred']
 *
 * // The `_.matches` iteratee shorthand.
 * _.takeWhile(users, { 'user': 'barney', 'active': false });
 * // => objects for ['barney']
 *
 * // The `_.matchesProperty` iteratee shorthand.
 * _.takeWhile(users, ['active', false]);
 * // => objects for ['barney', 'fred']
 *
 * // The `_.property` iteratee shorthand.
 * _.takeWhile(users, 'active');
 * // => []
 */
function takeWhile(array, predicate) {
  return (array && array.length)
    ? baseWhile(array, baseIteratee(predicate, 3))
    : [];
}

module.exports = takeWhile;
/**
 * This method invokes `interceptor` and returns `value`. The interceptor
 * is invoked with one argument; (value). The purpose of this method is to
 * "tap into" a method chain sequence in order to modify intermediate results.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Seq
 * @param {*} value The value to provide to `interceptor`.
 * @param {Function} interceptor The function to invoke.
 * @returns {*} Returns `value`.
 * @example
 *
 * _([1, 2, 3])
 *  .tap(function(array) {
 *    // Mutate input array.
 *    array.pop();
 *  })
 *  .reverse()
 *  .value();
 * // => [2, 1]
 */
function tap(value, interceptor) {
  interceptor(value);
  return value;
}

module.exports = tap;
var assignInWith = require('./assignInWith'),
    attempt = require('./attempt'),
    baseValues = require('./_baseValues'),
    customDefaultsAssignIn = require('./_customDefaultsAssignIn'),
    escapeStringChar = require('./_escapeStringChar'),
    isError = require('./isError'),
    isIterateeCall = require('./_isIterateeCall'),
    keys = require('./keys'),
    reInterpolate = require('./_reInterpolate'),
    templateSettings = require('./templateSettings'),
    toString = require('./toString');

/** Error message constants. */
var INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';

/** Used to match empty string literals in compiled template source. */
var reEmptyStringLeading = /\b__p \+= '';/g,
    reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
    reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;

/**
 * Used to validate the `validate` option in `_.template` variable.
 *
 * Forbids characters which could potentially change the meaning of the function argument definition:
 * - "()," (modification of function parameters)
 * - "=" (default value)
 * - "[]{}" (destructuring of function parameters)
 * - "/" (beginning of a comment)
 * - whitespace
 */
var reForbiddenIdentifierChars = /[()=,{}\[\]\/\s]/;

/**
 * Used to match
 * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).
 */
var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;

/** Used to ensure capturing order of template delimiters. */
var reNoMatch = /($^)/;

/** Used to match unescaped characters in compiled string literals. */
var reUnescapedString = /['\n\r\u2028\u2029\\]/g;

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * Creates a compiled template function that can interpolate data properties
 * in "interpolate" delimiters, HTML-escape interpolated data properties in
 * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data
 * properties may be accessed as free variables in the template. If a setting
 * object is given, it takes precedence over `_.templateSettings` values.
 *
 * **Note:** In the development build `_.template` utilizes
 * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
 * for easier debugging.
 *
 * For more information on precompiling templates see
 * [lodash's custom builds documentation](https://lodash.com/custom-builds).
 *
 * For more information on Chrome extension sandboxes see
 * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category String
 * @param {string} [string=''] The template string.
 * @param {Object} [options={}] The options object.
 * @param {RegExp} [options.escape=_.templateSettings.escape]
 *  The HTML "escape" delimiter.
 * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]
 *  The "evaluate" delimiter.
 * @param {Object} [options.imports=_.templateSettings.imports]
 *  An object to import into the template as free variables.
 * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]
 *  The "interpolate" delimiter.
 * @param {string} [options.sourceURL='templateSources[n]']
 *  The sourceURL of the compiled template.
 * @param {string} [options.variable='obj']
 *  The data object variable name.
 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
 * @returns {Function} Returns the compiled template function.
 * @example
 *
 * // Use the "interpolate" delimiter to create a compiled template.
 * var compiled = _.template('hello <%= user %>!');
 * compiled({ 'user': 'fred' });
 * // => 'hello fred!'
 *
 * // Use the HTML "escape" delimiter to escape data property values.
 * var compiled = _.template('<b><%- value %></b>');
 * compiled({ 'value': '<script>' });
 * // => '<b>&lt;script&gt;</b>'
 *
 * // Use the "evaluate" delimiter to execute JavaScript and generate HTML.
 * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');
 * compiled({ 'users': ['fred', 'barney'] });
 * // => '<li>fred</li><li>barney</li>'
 *
 * // Use the internal `print` function in "evaluate" delimiters.
 * var compiled = _.template('<% print("hello " + user); %>!');
 * compiled({ 'user': 'barney' });
 * // => 'hello barney!'
 *
 * // Use the ES template literal delimiter as an "interpolate" delimiter.
 * // Disable support by replacing the "interpolate" delimiter.
 * var compiled = _.template('hello ${ user }!');
 * compiled({ 'user': 'pebbles' });
 * // => 'hello pebbles!'
 *
 * // Use backslashes to treat delimiters as plain text.
 * var compiled = _.template('<%= "\\<%- value %\\>" %>');
 * compiled({ 'value': 'ignored' });
 * // => '<%- value %>'
 *
 * // Use the `imports` option to import `jQuery` as `jq`.
 * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';
 * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });
 * compiled({ 'users': ['fred', 'barney'] });
 * // => '<li>fred</li><li>barney</li>'
 *
 * // Use the `sourceURL` option to specify a custom sourceURL for the template.
 * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });
 * compiled(data);
 * // => Find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector.
 *
 * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.
 * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });
 * compiled.source;
 * // => function(data) {
 * //   var __t, __p = '';
 * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';
 * //   return __p;
 * // }
 *
 * // Use custom template delimiters.
 * _.templateSettings.interpolate = /{{([\s\S]+?)}}/g;
 * var compiled = _.template('hello {{ user }}!');
 * compiled({ 'user': 'mustache' });
 * // => 'hello mustache!'
 *
 * // Use the `source` property to inline compiled templates for meaningful
 * // line numbers in error messages and stack traces.
 * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\
 *   var JST = {\
 *     "main": ' + _.template(mainText).source + '\
 *   };\
 * ');
 */
function template(string, options, guard) {
  // Based on John Resig's `tmpl` implementation
  // (http://ejohn.org/blog/javascript-micro-templating/)
  // and Laura Doktorova's doT.js (https://github.com/olado/doT).
  var settings = templateSettings.imports._.templateSettings || templateSettings;

  if (guard && isIterateeCall(string, options, guard)) {
    options = undefined;
  }
  string = toString(string);
  options = assignInWith({}, options, settings, customDefaultsAssignIn);

  var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),
      importsKeys = keys(imports),
      importsValues = baseValues(imports, importsKeys);

  var isEscaping,
      isEvaluating,
      index = 0,
      interpolate = options.interpolate || reNoMatch,
      source = "__p += '";

  // Compile the regexp to match each delimiter.
  var reDelimiters = RegExp(
    (options.escape || reNoMatch).source + '|' +
    interpolate.source + '|' +
    (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +
    (options.evaluate || reNoMatch).source + '|$'
  , 'g');

  // Use a sourceURL for easier debugging.
  // The sourceURL gets injected into the source that's eval-ed, so be careful
  // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in
  // and escape the comment, thus injecting code that gets evaled.
  var sourceURL = hasOwnProperty.call(options, 'sourceURL')
    ? ('//# sourceURL=' +
       (options.sourceURL + '').replace(/\s/g, ' ') +
       '\n')
    : '';

  string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
    interpolateValue || (interpolateValue = esTemplateValue);

    // Escape characters that can't be included in string literals.
    source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);

    // Replace delimiters with snippets.
    if (escapeValue) {
      isEscaping = true;
      source += "' +\n__e(" + escapeValue + ") +\n'";
    }
    if (evaluateValue) {
      isEvaluating = true;
      source += "';\n" + evaluateValue + ";\n__p += '";
    }
    if (interpolateValue) {
      source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
    }
    index = offset + match.length;

    // The JS engine embedded in Adobe products needs `match` returned in
    // order to produce the correct `offset` value.
    return match;
  });

  source += "';\n";

  // If `variable` is not specified wrap a with-statement around the generated
  // code to add the data object to the top of the scope chain.
  var variable = hasOwnProperty.call(options, 'variable') && options.variable;
  if (!variable) {
    source = 'with (obj) {\n' + source + '\n}\n';
  }
  // Throw an error if a forbidden character was found in `variable`, to prevent
  // potential command injection attacks.
  else if (reForbiddenIdentifierChars.test(variable)) {
    throw new Error(INVALID_TEMPL_VAR_ERROR_TEXT);
  }

  // Cleanup code by stripping empty strings.
  source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)
    .replace(reEmptyStringMiddle, '$1')
    .replace(reEmptyStringTrailing, '$1;');

  // Frame code as the function body.
  source = 'function(' + (variable || 'obj') + ') {\n' +
    (variable
      ? ''
      : 'obj || (obj = {});\n'
    ) +
    "var __t, __p = ''" +
    (isEscaping
       ? ', __e = _.escape'
       : ''
    ) +
    (isEvaluating
      ? ', __j = Array.prototype.join;\n' +
        "function print() { __p += __j.call(arguments, '') }\n"
      : ';\n'
    ) +
    source +
    'return __p\n}';

  var result = attempt(function() {
    return Function(importsKeys, sourceURL + 'return ' + source)
      .apply(undefined, importsValues);
  });

  // Provide the compiled function's source by its `toString` method or
  // the `source` property as a convenience for inlining compiled templates.
  result.source = source;
  if (isError(result)) {
    throw result;
  }
  return result;
}

module.exports = template;
var escape = require('./escape'),
    reEscape = require('./_reEscape'),
    reEvaluate = require('./_reEvaluate'),
    reInterpolate = require('./_reInterpolate');

/**
 * By default, the template delimiters used by lodash are like those in
 * embedded Ruby (ERB) as well as ES2015 template strings. Change the
 * following template settings to use alternative delimiters.
 *
 * @static
 * @memberOf _
 * @type {Object}
 */
var templateSettings = {

  /**
   * Used to detect `data` property values to be HTML-escaped.
   *
   * @memberOf _.templateSettings
   * @type {RegExp}
   */
  'escape': reEscape,

  /**
   * Used to detect code to be evaluated.
   *
   * @memberOf _.templateSettings
   * @type {RegExp}
   */
  'evaluate': reEvaluate,

  /**
   * Used to detect `data` property values to inject.
   *
   * @memberOf _.templateSettings
   * @type {RegExp}
   */
  'interpolate': reInterpolate,

  /**
   * Used to reference the data object in the template text.
   *
   * @memberOf _.templateSettings
   * @type {string}
   */
  'variable': '',

  /**
   * Used to import variables into the compiled template.
   *
   * @memberOf _.templateSettings
   * @type {Object}
   */
  'imports': {

    /**
     * A reference to the `lodash` function.
     *
     * @memberOf _.templateSettings.imports
     * @type {Function}
     */
    '_': { 'escape': escape }
  }
};

module.exports = templateSettings;
var debounce = require('./debounce'),
    isObject = require('./isObject');

/** Error message constants. */
var FUNC_ERROR_TEXT = 'Expected a function';

/**
 * Creates a throttled function that only invokes `func` at most once per
 * every `wait` milliseconds. The throttled function comes with a `cancel`
 * method to cancel delayed `func` invocations and a `flush` method to
 * immediately invoke them. Provide `options` to indicate whether `func`
 * should be invoked on the leading and/or trailing edge of the `wait`
 * timeout. The `func` is invoked with the last arguments provided to the
 * throttled function. Subsequent calls to the throttled function return the
 * result of the last `func` invocation.
 *
 * **Note:** If `leading` and `trailing` options are `true`, `func` is
 * invoked on the trailing edge of the timeout only if the throttled function
 * is invoked more than once during the `wait` timeout.
 *
 * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
 * until to the next tick, similar to `setTimeout` with a timeout of `0`.
 *
 * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
 * for details over the differences between `_.throttle` and `_.debounce`.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Function
 * @param {Function} func The function to throttle.
 * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
 * @param {Object} [options={}] The options object.
 * @param {boolean} [options.leading=true]
 *  Specify invoking on the leading edge of the timeout.
 * @param {boolean} [options.trailing=true]
 *  Specify invoking on the trailing edge of the timeout.
 * @returns {Function} Returns the new throttled function.
 * @example
 *
 * // Avoid excessively updating the position while scrolling.
 * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
 *
 * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
 * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
 * jQuery(element).on('click', throttled);
 *
 * // Cancel the trailing throttled invocation.
 * jQuery(window).on('popstate', throttled.cancel);
 */
function throttle(func, wait, options) {
  var leading = true,
      trailing = true;

  if (typeof func != 'function') {
    throw new TypeError(FUNC_ERROR_TEXT);
  }
  if (isObject(options)) {
    leading = 'leading' in options ? !!options.leading : leading;
    trailing = 'trailing' in options ? !!options.trailing : trailing;
  }
  return debounce(func, wait, {
    'leading': leading,
    'maxWait': wait,
    'trailing': trailing
  });
}

module.exports = throttle;
/**
 * This method is like `_.tap` except that it returns the result of `interceptor`.
 * The purpose of this method is to "pass thru" values replacing intermediate
 * results in a method chain sequence.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Seq
 * @param {*} value The value to provide to `interceptor`.
 * @param {Function} interceptor The function to invoke.
 * @returns {*} Returns the result of `interceptor`.
 * @example
 *
 * _('  abc  ')
 *  .chain()
 *  .trim()
 *  .thru(function(value) {
 *    return [value];
 *  })
 *  .value();
 * // => ['abc']
 */
function thru(value, interceptor) {
  return interceptor(value);
}

module.exports = thru;
var baseTimes = require('./_baseTimes'),
    castFunction = require('./_castFunction'),
    toInteger = require('./toInteger');

/** Used as references for various `Number` constants. */
var MAX_SAFE_INTEGER = 9007199254740991;

/** Used as references for the maximum length and index of an array. */
var MAX_ARRAY_LENGTH = 4294967295;

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMin = Math.min;

/**
 * Invokes the iteratee `n` times, returning an array of the results of
 * each invocation. The iteratee is invoked with one argument; (index).
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category Util
 * @param {number} n The number of times to invoke `iteratee`.
 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
 * @returns {Array} Returns the array of results.
 * @example
 *
 * _.times(3, String);
 * // => ['0', '1', '2']
 *
 *  _.times(4, _.constant(0));
 * // => [0, 0, 0, 0]
 */
function times(n, iteratee) {
  n = toInteger(n);
  if (n < 1 || n > MAX_SAFE_INTEGER) {
    return [];
  }
  var index = MAX_ARRAY_LENGTH,
      length = nativeMin(n, MAX_ARRAY_LENGTH);

  iteratee = castFunction(iteratee);
  n -= MAX_ARRAY_LENGTH;

  var result = baseTimes(length, iteratee);
  while (++index < n) {
    iteratee(index);
  }
  return result;
}

module.exports = times;
var Symbol = require('./_Symbol'),
    copyArray = require('./_copyArray'),
    getTag = require('./_getTag'),
    isArrayLike = require('./isArrayLike'),
    isString = require('./isString'),
    iteratorToArray = require('./_iteratorToArray'),
    mapToArray = require('./_mapToArray'),
    setToArray = require('./_setToArray'),
    stringToArray = require('./_stringToArray'),
    values = require('./values');

/** `Object#toString` result references. */
var mapTag = '[object Map]',
    setTag = '[object Set]';

/** Built-in value references. */
var symIterator = Symbol ? Symbol.iterator : undefined;

/**
 * Converts `value` to an array.
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category Lang
 * @param {*} value The value to convert.
 * @returns {Array} Returns the converted array.
 * @example
 *
 * _.toArray({ 'a': 1, 'b': 2 });
 * // => [1, 2]
 *
 * _.toArray('abc');
 * // => ['a', 'b', 'c']
 *
 * _.toArray(1);
 * // => []
 *
 * _.toArray(null);
 * // => []
 */
function toArray(value) {
  if (!value) {
    return [];
  }
  if (isArrayLike(value)) {
    return isString(value) ? stringToArray(value) : copyArray(value);
  }
  if (symIterator && value[symIterator]) {
    return iteratorToArray(value[symIterator]());
  }
  var tag = getTag(value),
      func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);

  return func(value);
}

module.exports = toArray;
var toNumber = require('./toNumber');

/** Used as references for various `Number` constants. */
var INFINITY = 1 / 0,
    MAX_INTEGER = 1.7976931348623157e+308;

/**
 * Converts `value` to a finite number.
 *
 * @static
 * @memberOf _
 * @since 4.12.0
 * @category Lang
 * @param {*} value The value to convert.
 * @returns {number} Returns the converted number.
 * @example
 *
 * _.toFinite(3.2);
 * // => 3.2
 *
 * _.toFinite(Number.MIN_VALUE);
 * // => 5e-324
 *
 * _.toFinite(Infinity);
 * // => 1.7976931348623157e+308
 *
 * _.toFinite('3.2');
 * // => 3.2
 */
function toFinite(value) {
  if (!value) {
    return value === 0 ? value : 0;
  }
  value = toNumber(value);
  if (value === INFINITY || value === -INFINITY) {
    var sign = (value < 0 ? -1 : 1);
    return sign * MAX_INTEGER;
  }
  return value === value ? value : 0;
}

module.exports = toFinite;
var toFinite = require('./toFinite');

/**
 * Converts `value` to an integer.
 *
 * **Note:** This method is loosely based on
 * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to convert.
 * @returns {number} Returns the converted integer.
 * @example
 *
 * _.toInteger(3.2);
 * // => 3
 *
 * _.toInteger(Number.MIN_VALUE);
 * // => 0
 *
 * _.toInteger(Infinity);
 * // => 1.7976931348623157e+308
 *
 * _.toInteger('3.2');
 * // => 3
 */
function toInteger(value) {
  var result = toFinite(value),
      remainder = result % 1;

  return result === result ? (remainder ? result - remainder : result) : 0;
}

module.exports = toInteger;
/**
 * Enables the wrapper to be iterable.
 *
 * @name Symbol.iterator
 * @memberOf _
 * @since 4.0.0
 * @category Seq
 * @returns {Object} Returns the wrapper object.
 * @example
 *
 * var wrapped = _([1, 2]);
 *
 * wrapped[Symbol.iterator]() === wrapped;
 * // => true
 *
 * Array.from(wrapped);
 * // => [1, 2]
 */
function wrapperToIterator() {
  return this;
}

module.exports = wrapperToIterator;
module.exports = require('./wrapperValue');
var baseClamp = require('./_baseClamp'),
    toInteger = require('./toInteger');

/** Used as references for the maximum length and index of an array. */
var MAX_ARRAY_LENGTH = 4294967295;

/**
 * Converts `value` to an integer suitable for use as the length of an
 * array-like object.
 *
 * **Note:** This method is based on
 * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to convert.
 * @returns {number} Returns the converted integer.
 * @example
 *
 * _.toLength(3.2);
 * // => 3
 *
 * _.toLength(Number.MIN_VALUE);
 * // => 0
 *
 * _.toLength(Infinity);
 * // => 4294967295
 *
 * _.toLength('3.2');
 * // => 3
 */
function toLength(value) {
  return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;
}

module.exports = toLength;
var toString = require('./toString');

/**
 * Converts `string`, as a whole, to lower case just like
 * [String#toLowerCase](https://mdn.io/toLowerCase).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category String
 * @param {string} [string=''] The string to convert.
 * @returns {string} Returns the lower cased string.
 * @example
 *
 * _.toLower('--Foo-Bar--');
 * // => '--foo-bar--'
 *
 * _.toLower('fooBar');
 * // => 'foobar'
 *
 * _.toLower('__FOO_BAR__');
 * // => '__foo_bar__'
 */
function toLower(value) {
  return toString(value).toLowerCase();
}

module.exports = toLower;
var baseTrim = require('./_baseTrim'),
    isObject = require('./isObject'),
    isSymbol = require('./isSymbol');

/** Used as references for various `Number` constants. */
var NAN = 0 / 0;

/** Used to detect bad signed hexadecimal string values. */
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;

/** Used to detect binary string values. */
var reIsBinary = /^0b[01]+$/i;

/** Used to detect octal string values. */
var reIsOctal = /^0o[0-7]+$/i;

/** Built-in method references without a dependency on `root`. */
var freeParseInt = parseInt;

/**
 * Converts `value` to a number.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to process.
 * @returns {number} Returns the number.
 * @example
 *
 * _.toNumber(3.2);
 * // => 3.2
 *
 * _.toNumber(Number.MIN_VALUE);
 * // => 5e-324
 *
 * _.toNumber(Infinity);
 * // => Infinity
 *
 * _.toNumber('3.2');
 * // => 3.2
 */
function toNumber(value) {
  if (typeof value == 'number') {
    return value;
  }
  if (isSymbol(value)) {
    return NAN;
  }
  if (isObject(value)) {
    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
    value = isObject(other) ? (other + '') : other;
  }
  if (typeof value != 'string') {
    return value === 0 ? value : +value;
  }
  value = baseTrim(value);
  var isBinary = reIsBinary.test(value);
  return (isBinary || reIsOctal.test(value))
    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
    : (reIsBadHex.test(value) ? NAN : +value);
}

module.exports = toNumber;
var createToPairs = require('./_createToPairs'),
    keys = require('./keys');

/**
 * Creates an array of own enumerable string keyed-value pairs for `object`
 * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
 * entries are returned.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @alias entries
 * @category Object
 * @param {Object} object The object to query.
 * @returns {Array} Returns the key-value pairs.
 * @example
 *
 * function Foo() {
 *   this.a = 1;
 *   this.b = 2;
 * }
 *
 * Foo.prototype.c = 3;
 *
 * _.toPairs(new Foo);
 * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
 */
var toPairs = createToPairs(keys);

module.exports = toPairs;
var createToPairs = require('./_createToPairs'),
    keysIn = require('./keysIn');

/**
 * Creates an array of own and inherited enumerable string keyed-value pairs
 * for `object` which can be consumed by `_.fromPairs`. If `object` is a map
 * or set, its entries are returned.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @alias entriesIn
 * @category Object
 * @param {Object} object The object to query.
 * @returns {Array} Returns the key-value pairs.
 * @example
 *
 * function Foo() {
 *   this.a = 1;
 *   this.b = 2;
 * }
 *
 * Foo.prototype.c = 3;
 *
 * _.toPairsIn(new Foo);
 * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)
 */
var toPairsIn = createToPairs(keysIn);

module.exports = toPairsIn;
var arrayMap = require('./_arrayMap'),
    copyArray = require('./_copyArray'),
    isArray = require('./isArray'),
    isSymbol = require('./isSymbol'),
    stringToPath = require('./_stringToPath'),
    toKey = require('./_toKey'),
    toString = require('./toString');

/**
 * Converts `value` to a property path array.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Util
 * @param {*} value The value to convert.
 * @returns {Array} Returns the new property path array.
 * @example
 *
 * _.toPath('a.b.c');
 * // => ['a', 'b', 'c']
 *
 * _.toPath('a[0].b.c');
 * // => ['a', '0', 'b', 'c']
 */
function toPath(value) {
  if (isArray(value)) {
    return arrayMap(value, toKey);
  }
  return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));
}

module.exports = toPath;
var copyObject = require('./_copyObject'),
    keysIn = require('./keysIn');

/**
 * Converts `value` to a plain object flattening inherited enumerable string
 * keyed properties of `value` to own properties of the plain object.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Lang
 * @param {*} value The value to convert.
 * @returns {Object} Returns the converted plain object.
 * @example
 *
 * function Foo() {
 *   this.b = 2;
 * }
 *
 * Foo.prototype.c = 3;
 *
 * _.assign({ 'a': 1 }, new Foo);
 * // => { 'a': 1, 'b': 2 }
 *
 * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
 * // => { 'a': 1, 'b': 2, 'c': 3 }
 */
function toPlainObject(value) {
  return copyObject(value, keysIn(value));
}

module.exports = toPlainObject;
var baseClamp = require('./_baseClamp'),
    toInteger = require('./toInteger');

/** Used as references for various `Number` constants. */
var MAX_SAFE_INTEGER = 9007199254740991;

/**
 * Converts `value` to a safe integer. A safe integer can be compared and
 * represented correctly.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to convert.
 * @returns {number} Returns the converted integer.
 * @example
 *
 * _.toSafeInteger(3.2);
 * // => 3
 *
 * _.toSafeInteger(Number.MIN_VALUE);
 * // => 0
 *
 * _.toSafeInteger(Infinity);
 * // => 9007199254740991
 *
 * _.toSafeInteger('3.2');
 * // => 3
 */
function toSafeInteger(value) {
  return value
    ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)
    : (value === 0 ? value : 0);
}

module.exports = toSafeInteger;
var baseToString = require('./_baseToString');

/**
 * Converts `value` to a string. An empty string is returned for `null`
 * and `undefined` values. The sign of `-0` is preserved.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to convert.
 * @returns {string} Returns the converted string.
 * @example
 *
 * _.toString(null);
 * // => ''
 *
 * _.toString(-0);
 * // => '-0'
 *
 * _.toString([1, 2, 3]);
 * // => '1,2,3'
 */
function toString(value) {
  return value == null ? '' : baseToString(value);
}

module.exports = toString;
var toString = require('./toString');

/**
 * Converts `string`, as a whole, to upper case just like
 * [String#toUpperCase](https://mdn.io/toUpperCase).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category String
 * @param {string} [string=''] The string to convert.
 * @returns {string} Returns the upper cased string.
 * @example
 *
 * _.toUpper('--foo-bar--');
 * // => '--FOO-BAR--'
 *
 * _.toUpper('fooBar');
 * // => 'FOOBAR'
 *
 * _.toUpper('__foo_bar__');
 * // => '__FOO_BAR__'
 */
function toUpper(value) {
  return toString(value).toUpperCase();
}

module.exports = toUpper;
var arrayEach = require('./_arrayEach'),
    baseCreate = require('./_baseCreate'),
    baseForOwn = require('./_baseForOwn'),
    baseIteratee = require('./_baseIteratee'),
    getPrototype = require('./_getPrototype'),
    isArray = require('./isArray'),
    isBuffer = require('./isBuffer'),
    isFunction = require('./isFunction'),
    isObject = require('./isObject'),
    isTypedArray = require('./isTypedArray');

/**
 * An alternative to `_.reduce`; this method transforms `object` to a new
 * `accumulator` object which is the result of running each of its own
 * enumerable string keyed properties thru `iteratee`, with each invocation
 * potentially mutating the `accumulator` object. If `accumulator` is not
 * provided, a new object with the same `[[Prototype]]` will be used. The
 * iteratee is invoked with four arguments: (accumulator, value, key, object).
 * Iteratee functions may exit iteration early by explicitly returning `false`.
 *
 * @static
 * @memberOf _
 * @since 1.3.0
 * @category Object
 * @param {Object} object The object to iterate over.
 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
 * @param {*} [accumulator] The custom accumulator value.
 * @returns {*} Returns the accumulated value.
 * @example
 *
 * _.transform([2, 3, 4], function(result, n) {
 *   result.push(n *= n);
 *   return n % 2 == 0;
 * }, []);
 * // => [4, 9]
 *
 * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
 *   (result[value] || (result[value] = [])).push(key);
 * }, {});
 * // => { '1': ['a', 'c'], '2': ['b'] }
 */
function transform(object, iteratee, accumulator) {
  var isArr = isArray(object),
      isArrLike = isArr || isBuffer(object) || isTypedArray(object);

  iteratee = baseIteratee(iteratee, 4);
  if (accumulator == null) {
    var Ctor = object && object.constructor;
    if (isArrLike) {
      accumulator = isArr ? new Ctor : [];
    }
    else if (isObject(object)) {
      accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
    }
    else {
      accumulator = {};
    }
  }
  (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {
    return iteratee(accumulator, value, index, object);
  });
  return accumulator;
}

module.exports = transform;
var baseToString = require('./_baseToString'),
    baseTrim = require('./_baseTrim'),
    castSlice = require('./_castSlice'),
    charsEndIndex = require('./_charsEndIndex'),
    charsStartIndex = require('./_charsStartIndex'),
    stringToArray = require('./_stringToArray'),
    toString = require('./toString');

/**
 * Removes leading and trailing whitespace or specified characters from `string`.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category String
 * @param {string} [string=''] The string to trim.
 * @param {string} [chars=whitespace] The characters to trim.
 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
 * @returns {string} Returns the trimmed string.
 * @example
 *
 * _.trim('  abc  ');
 * // => 'abc'
 *
 * _.trim('-_-abc-_-', '_-');
 * // => 'abc'
 *
 * _.map(['  foo  ', '  bar  '], _.trim);
 * // => ['foo', 'bar']
 */
function trim(string, chars, guard) {
  string = toString(string);
  if (string && (guard || chars === undefined)) {
    return baseTrim(string);
  }
  if (!string || !(chars = baseToString(chars))) {
    return string;
  }
  var strSymbols = stringToArray(string),
      chrSymbols = stringToArray(chars),
      start = charsStartIndex(strSymbols, chrSymbols),
      end = charsEndIndex(strSymbols, chrSymbols) + 1;

  return castSlice(strSymbols, start, end).join('');
}

module.exports = trim;
var baseToString = require('./_baseToString'),
    castSlice = require('./_castSlice'),
    charsEndIndex = require('./_charsEndIndex'),
    stringToArray = require('./_stringToArray'),
    toString = require('./toString'),
    trimmedEndIndex = require('./_trimmedEndIndex');

/**
 * Removes trailing whitespace or specified characters from `string`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category String
 * @param {string} [string=''] The string to trim.
 * @param {string} [chars=whitespace] The characters to trim.
 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
 * @returns {string} Returns the trimmed string.
 * @example
 *
 * _.trimEnd('  abc  ');
 * // => '  abc'
 *
 * _.trimEnd('-_-abc-_-', '_-');
 * // => '-_-abc'
 */
function trimEnd(string, chars, guard) {
  string = toString(string);
  if (string && (guard || chars === undefined)) {
    return string.slice(0, trimmedEndIndex(string) + 1);
  }
  if (!string || !(chars = baseToString(chars))) {
    return string;
  }
  var strSymbols = stringToArray(string),
      end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;

  return castSlice(strSymbols, 0, end).join('');
}

module.exports = trimEnd;
var baseToString = require('./_baseToString'),
    castSlice = require('./_castSlice'),
    charsStartIndex = require('./_charsStartIndex'),
    stringToArray = require('./_stringToArray'),
    toString = require('./toString');

/** Used to match leading whitespace. */
var reTrimStart = /^\s+/;

/**
 * Removes leading whitespace or specified characters from `string`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category String
 * @param {string} [string=''] The string to trim.
 * @param {string} [chars=whitespace] The characters to trim.
 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
 * @returns {string} Returns the trimmed string.
 * @example
 *
 * _.trimStart('  abc  ');
 * // => 'abc  '
 *
 * _.trimStart('-_-abc-_-', '_-');
 * // => 'abc-_-'
 */
function trimStart(string, chars, guard) {
  string = toString(string);
  if (string && (guard || chars === undefined)) {
    return string.replace(reTrimStart, '');
  }
  if (!string || !(chars = baseToString(chars))) {
    return string;
  }
  var strSymbols = stringToArray(string),
      start = charsStartIndex(strSymbols, stringToArray(chars));

  return castSlice(strSymbols, start).join('');
}

module.exports = trimStart;
var baseToString = require('./_baseToString'),
    castSlice = require('./_castSlice'),
    hasUnicode = require('./_hasUnicode'),
    isObject = require('./isObject'),
    isRegExp = require('./isRegExp'),
    stringSize = require('./_stringSize'),
    stringToArray = require('./_stringToArray'),
    toInteger = require('./toInteger'),
    toString = require('./toString');

/** Used as default options for `_.truncate`. */
var DEFAULT_TRUNC_LENGTH = 30,
    DEFAULT_TRUNC_OMISSION = '...';

/** Used to match `RegExp` flags from their coerced string values. */
var reFlags = /\w*$/;

/**
 * Truncates `string` if it's longer than the given maximum string length.
 * The last characters of the truncated string are replaced with the omission
 * string which defaults to "...".
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category String
 * @param {string} [string=''] The string to truncate.
 * @param {Object} [options={}] The options object.
 * @param {number} [options.length=30] The maximum string length.
 * @param {string} [options.omission='...'] The string to indicate text is omitted.
 * @param {RegExp|string} [options.separator] The separator pattern to truncate to.
 * @returns {string} Returns the truncated string.
 * @example
 *
 * _.truncate('hi-diddly-ho there, neighborino');
 * // => 'hi-diddly-ho there, neighbo...'
 *
 * _.truncate('hi-diddly-ho there, neighborino', {
 *   'length': 24,
 *   'separator': ' '
 * });
 * // => 'hi-diddly-ho there,...'
 *
 * _.truncate('hi-diddly-ho there, neighborino', {
 *   'length': 24,
 *   'separator': /,? +/
 * });
 * // => 'hi-diddly-ho there...'
 *
 * _.truncate('hi-diddly-ho there, neighborino', {
 *   'omission': ' [...]'
 * });
 * // => 'hi-diddly-ho there, neig [...]'
 */
function truncate(string, options) {
  var length = DEFAULT_TRUNC_LENGTH,
      omission = DEFAULT_TRUNC_OMISSION;

  if (isObject(options)) {
    var separator = 'separator' in options ? options.separator : separator;
    length = 'length' in options ? toInteger(options.length) : length;
    omission = 'omission' in options ? baseToString(options.omission) : omission;
  }
  string = toString(string);

  var strLength = string.length;
  if (hasUnicode(string)) {
    var strSymbols = stringToArray(string);
    strLength = strSymbols.length;
  }
  if (length >= strLength) {
    return string;
  }
  var end = length - stringSize(omission);
  if (end < 1) {
    return omission;
  }
  var result = strSymbols
    ? castSlice(strSymbols, 0, end).join('')
    : string.slice(0, end);

  if (separator === undefined) {
    return result + omission;
  }
  if (strSymbols) {
    end += (result.length - end);
  }
  if (isRegExp(separator)) {
    if (string.slice(end).search(separator)) {
      var match,
          substring = result;

      if (!separator.global) {
        separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');
      }
      separator.lastIndex = 0;
      while ((match = separator.exec(substring))) {
        var newEnd = match.index;
      }
      result = result.slice(0, newEnd === undefined ? end : newEnd);
    }
  } else if (string.indexOf(baseToString(separator), end) != end) {
    var index = result.lastIndexOf(separator);
    if (index > -1) {
      result = result.slice(0, index);
    }
  }
  return result + omission;
}

module.exports = truncate;
var ary = require('./ary');

/**
 * Creates a function that accepts up to one argument, ignoring any
 * additional arguments.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Function
 * @param {Function} func The function to cap arguments for.
 * @returns {Function} Returns the new capped function.
 * @example
 *
 * _.map(['6', '8', '10'], _.unary(parseInt));
 * // => [6, 8, 10]
 */
function unary(func) {
  return ary(func, 1);
}

module.exports = unary;
var toString = require('./toString'),
    unescapeHtmlChar = require('./_unescapeHtmlChar');

/** Used to match HTML entities and HTML characters. */
var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,
    reHasEscapedHtml = RegExp(reEscapedHtml.source);

/**
 * The inverse of `_.escape`; this method converts the HTML entities
 * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to
 * their corresponding characters.
 *
 * **Note:** No other HTML entities are unescaped. To unescape additional
 * HTML entities use a third-party library like [_he_](https://mths.be/he).
 *
 * @static
 * @memberOf _
 * @since 0.6.0
 * @category String
 * @param {string} [string=''] The string to unescape.
 * @returns {string} Returns the unescaped string.
 * @example
 *
 * _.unescape('fred, barney, &amp; pebbles');
 * // => 'fred, barney, & pebbles'
 */
function unescape(string) {
  string = toString(string);
  return (string && reHasEscapedHtml.test(string))
    ? string.replace(reEscapedHtml, unescapeHtmlChar)
    : string;
}

module.exports = unescape;
var baseFlatten = require('./_baseFlatten'),
    baseRest = require('./_baseRest'),
    baseUniq = require('./_baseUniq'),
    isArrayLikeObject = require('./isArrayLikeObject');

/**
 * Creates an array of unique values, in order, from all given arrays using
 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
 * for equality comparisons.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Array
 * @param {...Array} [arrays] The arrays to inspect.
 * @returns {Array} Returns the new array of combined values.
 * @example
 *
 * _.union([2], [1, 2]);
 * // => [2, 1]
 */
var union = baseRest(function(arrays) {
  return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
});

module.exports = union;
var baseFlatten = require('./_baseFlatten'),
    baseIteratee = require('./_baseIteratee'),
    baseRest = require('./_baseRest'),
    baseUniq = require('./_baseUniq'),
    isArrayLikeObject = require('./isArrayLikeObject'),
    last = require('./last');

/**
 * This method is like `_.union` except that it accepts `iteratee` which is
 * invoked for each element of each `arrays` to generate the criterion by
 * which uniqueness is computed. Result values are chosen from the first
 * array in which the value occurs. The iteratee is invoked with one argument:
 * (value).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Array
 * @param {...Array} [arrays] The arrays to inspect.
 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
 * @returns {Array} Returns the new array of combined values.
 * @example
 *
 * _.unionBy([2.1], [1.2, 2.3], Math.floor);
 * // => [2.1, 1.2]
 *
 * // The `_.property` iteratee shorthand.
 * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
 * // => [{ 'x': 1 }, { 'x': 2 }]
 */
var unionBy = baseRest(function(arrays) {
  var iteratee = last(arrays);
  if (isArrayLikeObject(iteratee)) {
    iteratee = undefined;
  }
  return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), baseIteratee(iteratee, 2));
});

module.exports = unionBy;
var baseFlatten = require('./_baseFlatten'),
    baseRest = require('./_baseRest'),
    baseUniq = require('./_baseUniq'),
    isArrayLikeObject = require('./isArrayLikeObject'),
    last = require('./last');

/**
 * This method is like `_.union` except that it accepts `comparator` which
 * is invoked to compare elements of `arrays`. Result values are chosen from
 * the first array in which the value occurs. The comparator is invoked
 * with two arguments: (arrVal, othVal).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Array
 * @param {...Array} [arrays] The arrays to inspect.
 * @param {Function} [comparator] The comparator invoked per element.
 * @returns {Array} Returns the new array of combined values.
 * @example
 *
 * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
 * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
 *
 * _.unionWith(objects, others, _.isEqual);
 * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
 */
var unionWith = baseRest(function(arrays) {
  var comparator = last(arrays);
  comparator = typeof comparator == 'function' ? comparator : undefined;
  return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);
});

module.exports = unionWith;
var baseUniq = require('./_baseUniq');

/**
 * Creates a duplicate-free version of an array, using
 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
 * for equality comparisons, in which only the first occurrence of each element
 * is kept. The order of result values is determined by the order they occur
 * in the array.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Array
 * @param {Array} array The array to inspect.
 * @returns {Array} Returns the new duplicate free array.
 * @example
 *
 * _.uniq([2, 1, 2]);
 * // => [2, 1]
 */
function uniq(array) {
  return (array && array.length) ? baseUniq(array) : [];
}

module.exports = uniq;
var baseIteratee = require('./_baseIteratee'),
    baseUniq = require('./_baseUniq');

/**
 * This method is like `_.uniq` except that it accepts `iteratee` which is
 * invoked for each element in `array` to generate the criterion by which
 * uniqueness is computed. The order of result values is determined by the
 * order they occur in the array. The iteratee is invoked with one argument:
 * (value).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Array
 * @param {Array} array The array to inspect.
 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
 * @returns {Array} Returns the new duplicate free array.
 * @example
 *
 * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
 * // => [2.1, 1.2]
 *
 * // The `_.property` iteratee shorthand.
 * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
 * // => [{ 'x': 1 }, { 'x': 2 }]
 */
function uniqBy(array, iteratee) {
  return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];
}

module.exports = uniqBy;
var baseUniq = require('./_baseUniq');

/**
 * This method is like `_.uniq` except that it accepts `comparator` which
 * is invoked to compare elements of `array`. The order of result values is
 * determined by the order they occur in the array.The comparator is invoked
 * with two arguments: (arrVal, othVal).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Array
 * @param {Array} array The array to inspect.
 * @param {Function} [comparator] The comparator invoked per element.
 * @returns {Array} Returns the new duplicate free array.
 * @example
 *
 * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];
 *
 * _.uniqWith(objects, _.isEqual);
 * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]
 */
function uniqWith(array, comparator) {
  comparator = typeof comparator == 'function' ? comparator : undefined;
  return (array && array.length) ? baseUniq(array, undefined, comparator) : [];
}

module.exports = uniqWith;
var toString = require('./toString');

/** Used to generate unique IDs. */
var idCounter = 0;

/**
 * Generates a unique ID. If `prefix` is given, the ID is appended to it.
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category Util
 * @param {string} [prefix=''] The value to prefix the ID with.
 * @returns {string} Returns the unique ID.
 * @example
 *
 * _.uniqueId('contact_');
 * // => 'contact_104'
 *
 * _.uniqueId();
 * // => '105'
 */
function uniqueId(prefix) {
  var id = ++idCounter;
  return toString(prefix) + id;
}

module.exports = uniqueId;
var baseUnset = require('./_baseUnset');

/**
 * Removes the property at `path` of `object`.
 *
 * **Note:** This method mutates `object`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Object
 * @param {Object} object The object to modify.
 * @param {Array|string} path The path of the property to unset.
 * @returns {boolean} Returns `true` if the property is deleted, else `false`.
 * @example
 *
 * var object = { 'a': [{ 'b': { 'c': 7 } }] };
 * _.unset(object, 'a[0].b.c');
 * // => true
 *
 * console.log(object);
 * // => { 'a': [{ 'b': {} }] };
 *
 * _.unset(object, ['a', '0', 'b', 'c']);
 * // => true
 *
 * console.log(object);
 * // => { 'a': [{ 'b': {} }] };
 */
function unset(object, path) {
  return object == null ? true : baseUnset(object, path);
}

module.exports = unset;
var arrayFilter = require('./_arrayFilter'),
    arrayMap = require('./_arrayMap'),
    baseProperty = require('./_baseProperty'),
    baseTimes = require('./_baseTimes'),
    isArrayLikeObject = require('./isArrayLikeObject');

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max;

/**
 * This method is like `_.zip` except that it accepts an array of grouped
 * elements and creates an array regrouping the elements to their pre-zip
 * configuration.
 *
 * @static
 * @memberOf _
 * @since 1.2.0
 * @category Array
 * @param {Array} array The array of grouped elements to process.
 * @returns {Array} Returns the new array of regrouped elements.
 * @example
 *
 * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);
 * // => [['a', 1, true], ['b', 2, false]]
 *
 * _.unzip(zipped);
 * // => [['a', 'b'], [1, 2], [true, false]]
 */
function unzip(array) {
  if (!(array && array.length)) {
    return [];
  }
  var length = 0;
  array = arrayFilter(array, function(group) {
    if (isArrayLikeObject(group)) {
      length = nativeMax(group.length, length);
      return true;
    }
  });
  return baseTimes(length, function(index) {
    return arrayMap(array, baseProperty(index));
  });
}

module.exports = unzip;
var apply = require('./_apply'),
    arrayMap = require('./_arrayMap'),
    unzip = require('./unzip');

/**
 * This method is like `_.unzip` except that it accepts `iteratee` to specify
 * how regrouped values should be combined. The iteratee is invoked with the
 * elements of each group: (...group).
 *
 * @static
 * @memberOf _
 * @since 3.8.0
 * @category Array
 * @param {Array} array The array of grouped elements to process.
 * @param {Function} [iteratee=_.identity] The function to combine
 *  regrouped values.
 * @returns {Array} Returns the new array of regrouped elements.
 * @example
 *
 * var zipped = _.zip([1, 2], [10, 20], [100, 200]);
 * // => [[1, 10, 100], [2, 20, 200]]
 *
 * _.unzipWith(zipped, _.add);
 * // => [3, 30, 300]
 */
function unzipWith(array, iteratee) {
  if (!(array && array.length)) {
    return [];
  }
  var result = unzip(array);
  if (iteratee == null) {
    return result;
  }
  return arrayMap(result, function(group) {
    return apply(iteratee, undefined, group);
  });
}

module.exports = unzipWith;
var baseUpdate = require('./_baseUpdate'),
    castFunction = require('./_castFunction');

/**
 * This method is like `_.set` except that accepts `updater` to produce the
 * value to set. Use `_.updateWith` to customize `path` creation. The `updater`
 * is invoked with one argument: (value).
 *
 * **Note:** This method mutates `object`.
 *
 * @static
 * @memberOf _
 * @since 4.6.0
 * @category Object
 * @param {Object} object The object to modify.
 * @param {Array|string} path The path of the property to set.
 * @param {Function} updater The function to produce the updated value.
 * @returns {Object} Returns `object`.
 * @example
 *
 * var object = { 'a': [{ 'b': { 'c': 3 } }] };
 *
 * _.update(object, 'a[0].b.c', function(n) { return n * n; });
 * console.log(object.a[0].b.c);
 * // => 9
 *
 * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });
 * console.log(object.x[0].y.z);
 * // => 0
 */
function update(object, path, updater) {
  return object == null ? object : baseUpdate(object, path, castFunction(updater));
}

module.exports = update;
var baseUpdate = require('./_baseUpdate'),
    castFunction = require('./_castFunction');

/**
 * This method is like `_.update` except that it accepts `customizer` which is
 * invoked to produce the objects of `path`.  If `customizer` returns `undefined`
 * path creation is handled by the method instead. The `customizer` is invoked
 * with three arguments: (nsValue, key, nsObject).
 *
 * **Note:** This method mutates `object`.
 *
 * @static
 * @memberOf _
 * @since 4.6.0
 * @category Object
 * @param {Object} object The object to modify.
 * @param {Array|string} path The path of the property to set.
 * @param {Function} updater The function to produce the updated value.
 * @param {Function} [customizer] The function to customize assigned values.
 * @returns {Object} Returns `object`.
 * @example
 *
 * var object = {};
 *
 * _.updateWith(object, '[0][1]', _.constant('a'), Object);
 * // => { '0': { '1': 'a' } }
 */
function updateWith(object, path, updater, customizer) {
  customizer = typeof customizer == 'function' ? customizer : undefined;
  return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);
}

module.exports = updateWith;
var createCompounder = require('./_createCompounder');

/**
 * Converts `string`, as space separated words, to upper case.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category String
 * @param {string} [string=''] The string to convert.
 * @returns {string} Returns the upper cased string.
 * @example
 *
 * _.upperCase('--foo-bar');
 * // => 'FOO BAR'
 *
 * _.upperCase('fooBar');
 * // => 'FOO BAR'
 *
 * _.upperCase('__foo_bar__');
 * // => 'FOO BAR'
 */
var upperCase = createCompounder(function(result, word, index) {
  return result + (index ? ' ' : '') + word.toUpperCase();
});

module.exports = upperCase;
var createCaseFirst = require('./_createCaseFirst');

/**
 * Converts the first character of `string` to upper case.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category String
 * @param {string} [string=''] The string to convert.
 * @returns {string} Returns the converted string.
 * @example
 *
 * _.upperFirst('fred');
 * // => 'Fred'
 *
 * _.upperFirst('FRED');
 * // => 'FRED'
 */
var upperFirst = createCaseFirst('toUpperCase');

module.exports = upperFirst;
module.exports = {
  'attempt': require('./attempt'),
  'bindAll': require('./bindAll'),
  'cond': require('./cond'),
  'conforms': require('./conforms'),
  'constant': require('./constant'),
  'defaultTo': require('./defaultTo'),
  'flow': require('./flow'),
  'flowRight': require('./flowRight'),
  'identity': require('./identity'),
  'iteratee': require('./iteratee'),
  'matches': require('./matches'),
  'matchesProperty': require('./matchesProperty'),
  'method': require('./method'),
  'methodOf': require('./methodOf'),
  'mixin': require('./mixin'),
  'noop': require('./noop'),
  'nthArg': require('./nthArg'),
  'over': require('./over'),
  'overEvery': require('./overEvery'),
  'overSome': require('./overSome'),
  'property': require('./property'),
  'propertyOf': require('./propertyOf'),
  'range': require('./range'),
  'rangeRight': require('./rangeRight'),
  'stubArray': require('./stubArray'),
  'stubFalse': require('./stubFalse'),
  'stubObject': require('./stubObject'),
  'stubString': require('./stubString'),
  'stubTrue': require('./stubTrue'),
  'times': require('./times'),
  'toPath': require('./toPath'),
  'uniqueId': require('./uniqueId')
};
module.exports = require('./wrapperValue');
module.exports = require('./wrapperValue');
var baseValues = require('./_baseValues'),
    keys = require('./keys');

/**
 * Creates an array of the own enumerable string keyed property values of `object`.
 *
 * **Note:** Non-object values are coerced to objects.
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category Object
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of property values.
 * @example
 *
 * function Foo() {
 *   this.a = 1;
 *   this.b = 2;
 * }
 *
 * Foo.prototype.c = 3;
 *
 * _.values(new Foo);
 * // => [1, 2] (iteration order is not guaranteed)
 *
 * _.values('hi');
 * // => ['h', 'i']
 */
function values(object) {
  return object == null ? [] : baseValues(object, keys(object));
}

module.exports = values;
var baseValues = require('./_baseValues'),
    keysIn = require('./keysIn');

/**
 * Creates an array of the own and inherited enumerable string keyed property
 * values of `object`.
 *
 * **Note:** Non-object values are coerced to objects.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Object
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of property values.
 * @example
 *
 * function Foo() {
 *   this.a = 1;
 *   this.b = 2;
 * }
 *
 * Foo.prototype.c = 3;
 *
 * _.valuesIn(new Foo);
 * // => [1, 2, 3] (iteration order is not guaranteed)
 */
function valuesIn(object) {
  return object == null ? [] : baseValues(object, keysIn(object));
}

module.exports = valuesIn;
var baseDifference = require('./_baseDifference'),
    baseRest = require('./_baseRest'),
    isArrayLikeObject = require('./isArrayLikeObject');

/**
 * Creates an array excluding all given values using
 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
 * for equality comparisons.
 *
 * **Note:** Unlike `_.pull`, this method returns a new array.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Array
 * @param {Array} array The array to inspect.
 * @param {...*} [values] The values to exclude.
 * @returns {Array} Returns the new array of filtered values.
 * @see _.difference, _.xor
 * @example
 *
 * _.without([2, 1, 2, 3], 1, 2);
 * // => [3]
 */
var without = baseRest(function(array, values) {
  return isArrayLikeObject(array)
    ? baseDifference(array, values)
    : [];
});

module.exports = without;
var asciiWords = require('./_asciiWords'),
    hasUnicodeWord = require('./_hasUnicodeWord'),
    toString = require('./toString'),
    unicodeWords = require('./_unicodeWords');

/**
 * Splits `string` into an array of its words.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category String
 * @param {string} [string=''] The string to inspect.
 * @param {RegExp|string} [pattern] The pattern to match words.
 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
 * @returns {Array} Returns the words of `string`.
 * @example
 *
 * _.words('fred, barney, & pebbles');
 * // => ['fred', 'barney', 'pebbles']
 *
 * _.words('fred, barney, & pebbles', /[^, ]+/g);
 * // => ['fred', 'barney', '&', 'pebbles']
 */
function words(string, pattern, guard) {
  string = toString(string);
  pattern = guard ? undefined : pattern;

  if (pattern === undefined) {
    return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);
  }
  return string.match(pattern) || [];
}

module.exports = words;
var castFunction = require('./_castFunction'),
    partial = require('./partial');

/**
 * Creates a function that provides `value` to `wrapper` as its first
 * argument. Any additional arguments provided to the function are appended
 * to those provided to the `wrapper`. The wrapper is invoked with the `this`
 * binding of the created function.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Function
 * @param {*} value The value to wrap.
 * @param {Function} [wrapper=identity] The wrapper function.
 * @returns {Function} Returns the new function.
 * @example
 *
 * var p = _.wrap(_.escape, function(func, text) {
 *   return '<p>' + func(text) + '</p>';
 * });
 *
 * p('fred, barney, & pebbles');
 * // => '<p>fred, barney, &amp; pebbles</p>'
 */
function wrap(value, wrapper) {
  return partial(castFunction(wrapper), value);
}

module.exports = wrap;
var LazyWrapper = require('./_LazyWrapper'),
    LodashWrapper = require('./_LodashWrapper'),
    baseAt = require('./_baseAt'),
    flatRest = require('./_flatRest'),
    isIndex = require('./_isIndex'),
    thru = require('./thru');

/**
 * This method is the wrapper version of `_.at`.
 *
 * @name at
 * @memberOf _
 * @since 1.0.0
 * @category Seq
 * @param {...(string|string[])} [paths] The property paths to pick.
 * @returns {Object} Returns the new `lodash` wrapper instance.
 * @example
 *
 * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
 *
 * _(object).at(['a[0].b.c', 'a[1]']).value();
 * // => [3, 4]
 */
var wrapperAt = flatRest(function(paths) {
  var length = paths.length,
      start = length ? paths[0] : 0,
      value = this.__wrapped__,
      interceptor = function(object) { return baseAt(object, paths); };

  if (length > 1 || this.__actions__.length ||
      !(value instanceof LazyWrapper) || !isIndex(start)) {
    return this.thru(interceptor);
  }
  value = value.slice(start, +start + (length ? 1 : 0));
  value.__actions__.push({
    'func': thru,
    'args': [interceptor],
    'thisArg': undefined
  });
  return new LodashWrapper(value, this.__chain__).thru(function(array) {
    if (length && !array.length) {
      array.push(undefined);
    }
    return array;
  });
});

module.exports = wrapperAt;
var chain = require('./chain');

/**
 * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.
 *
 * @name chain
 * @memberOf _
 * @since 0.1.0
 * @category Seq
 * @returns {Object} Returns the new `lodash` wrapper instance.
 * @example
 *
 * var users = [
 *   { 'user': 'barney', 'age': 36 },
 *   { 'user': 'fred',   'age': 40 }
 * ];
 *
 * // A sequence without explicit chaining.
 * _(users).head();
 * // => { 'user': 'barney', 'age': 36 }
 *
 * // A sequence with explicit chaining.
 * _(users)
 *   .chain()
 *   .head()
 *   .pick('user')
 *   .value();
 * // => { 'user': 'barney' }
 */
function wrapperChain() {
  return chain(this);
}

module.exports = wrapperChain;
var LazyWrapper = require('./_LazyWrapper'),
    LodashWrapper = require('./_LodashWrapper'),
    baseLodash = require('./_baseLodash'),
    isArray = require('./isArray'),
    isObjectLike = require('./isObjectLike'),
    wrapperClone = require('./_wrapperClone');

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * Creates a `lodash` object which wraps `value` to enable implicit method
 * chain sequences. Methods that operate on and return arrays, collections,
 * and functions can be chained together. Methods that retrieve a single value
 * or may return a primitive value will automatically end the chain sequence
 * and return the unwrapped value. Otherwise, the value must be unwrapped
 * with `_#value`.
 *
 * Explicit chain sequences, which must be unwrapped with `_#value`, may be
 * enabled using `_.chain`.
 *
 * The execution of chained methods is lazy, that is, it's deferred until
 * `_#value` is implicitly or explicitly called.
 *
 * Lazy evaluation allows several methods to support shortcut fusion.
 * Shortcut fusion is an optimization to merge iteratee calls; this avoids
 * the creation of intermediate arrays and can greatly reduce the number of
 * iteratee executions. Sections of a chain sequence qualify for shortcut
 * fusion if the section is applied to an array and iteratees accept only
 * one argument. The heuristic for whether a section qualifies for shortcut
 * fusion is subject to change.
 *
 * Chaining is supported in custom builds as long as the `_#value` method is
 * directly or indirectly included in the build.
 *
 * In addition to lodash methods, wrappers have `Array` and `String` methods.
 *
 * The wrapper `Array` methods are:
 * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
 *
 * The wrapper `String` methods are:
 * `replace` and `split`
 *
 * The wrapper methods that support shortcut fusion are:
 * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
 * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
 * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
 *
 * The chainable wrapper methods are:
 * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
 * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
 * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
 * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
 * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
 * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
 * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
 * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
 * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
 * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
 * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
 * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
 * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
 * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
 * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
 * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
 * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
 * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
 * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
 * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
 * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
 * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
 * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
 * `zipObject`, `zipObjectDeep`, and `zipWith`
 *
 * The wrapper methods that are **not** chainable by default are:
 * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
 * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
 * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
 * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
 * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
 * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
 * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
 * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
 * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
 * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
 * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
 * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
 * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
 * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
 * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
 * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
 * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
 * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
 * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
 * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
 * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
 * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
 * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
 * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
 * `upperFirst`, `value`, and `words`
 *
 * @name _
 * @constructor
 * @category Seq
 * @param {*} value The value to wrap in a `lodash` instance.
 * @returns {Object} Returns the new `lodash` wrapper instance.
 * @example
 *
 * function square(n) {
 *   return n * n;
 * }
 *
 * var wrapped = _([1, 2, 3]);
 *
 * // Returns an unwrapped value.
 * wrapped.reduce(_.add);
 * // => 6
 *
 * // Returns a wrapped value.
 * var squares = wrapped.map(square);
 *
 * _.isArray(squares);
 * // => false
 *
 * _.isArray(squares.value());
 * // => true
 */
function lodash(value) {
  if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
    if (value instanceof LodashWrapper) {
      return value;
    }
    if (hasOwnProperty.call(value, '__wrapped__')) {
      return wrapperClone(value);
    }
  }
  return new LodashWrapper(value);
}

// Ensure wrappers are instances of `baseLodash`.
lodash.prototype = baseLodash.prototype;
lodash.prototype.constructor = lodash;

module.exports = lodash;
var LazyWrapper = require('./_LazyWrapper'),
    LodashWrapper = require('./_LodashWrapper'),
    reverse = require('./reverse'),
    thru = require('./thru');

/**
 * This method is the wrapper version of `_.reverse`.
 *
 * **Note:** This method mutates the wrapped array.
 *
 * @name reverse
 * @memberOf _
 * @since 0.1.0
 * @category Seq
 * @returns {Object} Returns the new `lodash` wrapper instance.
 * @example
 *
 * var array = [1, 2, 3];
 *
 * _(array).reverse().value()
 * // => [3, 2, 1]
 *
 * console.log(array);
 * // => [3, 2, 1]
 */
function wrapperReverse() {
  var value = this.__wrapped__;
  if (value instanceof LazyWrapper) {
    var wrapped = value;
    if (this.__actions__.length) {
      wrapped = new LazyWrapper(this);
    }
    wrapped = wrapped.reverse();
    wrapped.__actions__.push({
      'func': thru,
      'args': [reverse],
      'thisArg': undefined
    });
    return new LodashWrapper(wrapped, this.__chain__);
  }
  return this.thru(reverse);
}

module.exports = wrapperReverse;
var baseWrapperValue = require('./_baseWrapperValue');

/**
 * Executes the chain sequence to resolve the unwrapped value.
 *
 * @name value
 * @memberOf _
 * @since 0.1.0
 * @alias toJSON, valueOf
 * @category Seq
 * @returns {*} Returns the resolved unwrapped value.
 * @example
 *
 * _([1, 2, 3]).value();
 * // => [1, 2, 3]
 */
function wrapperValue() {
  return baseWrapperValue(this.__wrapped__, this.__actions__);
}

module.exports = wrapperValue;
var arrayFilter = require('./_arrayFilter'),
    baseRest = require('./_baseRest'),
    baseXor = require('./_baseXor'),
    isArrayLikeObject = require('./isArrayLikeObject');

/**
 * Creates an array of unique values that is the
 * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
 * of the given arrays. The order of result values is determined by the order
 * they occur in the arrays.
 *
 * @static
 * @memberOf _
 * @since 2.4.0
 * @category Array
 * @param {...Array} [arrays] The arrays to inspect.
 * @returns {Array} Returns the new array of filtered values.
 * @see _.difference, _.without
 * @example
 *
 * _.xor([2, 1], [2, 3]);
 * // => [1, 3]
 */
var xor = baseRest(function(arrays) {
  return baseXor(arrayFilter(arrays, isArrayLikeObject));
});

module.exports = xor;
var arrayFilter = require('./_arrayFilter'),
    baseIteratee = require('./_baseIteratee'),
    baseRest = require('./_baseRest'),
    baseXor = require('./_baseXor'),
    isArrayLikeObject = require('./isArrayLikeObject'),
    last = require('./last');

/**
 * This method is like `_.xor` except that it accepts `iteratee` which is
 * invoked for each element of each `arrays` to generate the criterion by
 * which by which they're compared. The order of result values is determined
 * by the order they occur in the arrays. The iteratee is invoked with one
 * argument: (value).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Array
 * @param {...Array} [arrays] The arrays to inspect.
 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
 * @returns {Array} Returns the new array of filtered values.
 * @example
 *
 * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);
 * // => [1.2, 3.4]
 *
 * // The `_.property` iteratee shorthand.
 * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
 * // => [{ 'x': 2 }]
 */
var xorBy = baseRest(function(arrays) {
  var iteratee = last(arrays);
  if (isArrayLikeObject(iteratee)) {
    iteratee = undefined;
  }
  return baseXor(arrayFilter(arrays, isArrayLikeObject), baseIteratee(iteratee, 2));
});

module.exports = xorBy;
var arrayFilter = require('./_arrayFilter'),
    baseRest = require('./_baseRest'),
    baseXor = require('./_baseXor'),
    isArrayLikeObject = require('./isArrayLikeObject'),
    last = require('./last');

/**
 * This method is like `_.xor` except that it accepts `comparator` which is
 * invoked to compare elements of `arrays`. The order of result values is
 * determined by the order they occur in the arrays. The comparator is invoked
 * with two arguments: (arrVal, othVal).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Array
 * @param {...Array} [arrays] The arrays to inspect.
 * @param {Function} [comparator] The comparator invoked per element.
 * @returns {Array} Returns the new array of filtered values.
 * @example
 *
 * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
 * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
 *
 * _.xorWith(objects, others, _.isEqual);
 * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
 */
var xorWith = baseRest(function(arrays) {
  var comparator = last(arrays);
  comparator = typeof comparator == 'function' ? comparator : undefined;
  return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);
});

module.exports = xorWith;
var baseRest = require('./_baseRest'),
    unzip = require('./unzip');

/**
 * Creates an array of grouped elements, the first of which contains the
 * first elements of the given arrays, the second of which contains the
 * second elements of the given arrays, and so on.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Array
 * @param {...Array} [arrays] The arrays to process.
 * @returns {Array} Returns the new array of grouped elements.
 * @example
 *
 * _.zip(['a', 'b'], [1, 2], [true, false]);
 * // => [['a', 1, true], ['b', 2, false]]
 */
var zip = baseRest(unzip);

module.exports = zip;
var assignValue = require('./_assignValue'),
    baseZipObject = require('./_baseZipObject');

/**
 * This method is like `_.fromPairs` except that it accepts two arrays,
 * one of property identifiers and one of corresponding values.
 *
 * @static
 * @memberOf _
 * @since 0.4.0
 * @category Array
 * @param {Array} [props=[]] The property identifiers.
 * @param {Array} [values=[]] The property values.
 * @returns {Object} Returns the new object.
 * @example
 *
 * _.zipObject(['a', 'b'], [1, 2]);
 * // => { 'a': 1, 'b': 2 }
 */
function zipObject(props, values) {
  return baseZipObject(props || [], values || [], assignValue);
}

module.exports = zipObject;
var baseSet = require('./_baseSet'),
    baseZipObject = require('./_baseZipObject');

/**
 * This method is like `_.zipObject` except that it supports property paths.
 *
 * @static
 * @memberOf _
 * @since 4.1.0
 * @category Array
 * @param {Array} [props=[]] The property identifiers.
 * @param {Array} [values=[]] The property values.
 * @returns {Object} Returns the new object.
 * @example
 *
 * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);
 * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }
 */
function zipObjectDeep(props, values) {
  return baseZipObject(props || [], values || [], baseSet);
}

module.exports = zipObjectDeep;
var baseRest = require('./_baseRest'),
    unzipWith = require('./unzipWith');

/**
 * This method is like `_.zip` except that it accepts `iteratee` to specify
 * how grouped values should be combined. The iteratee is invoked with the
 * elements of each group: (...group).
 *
 * @static
 * @memberOf _
 * @since 3.8.0
 * @category Array
 * @param {...Array} [arrays] The arrays to process.
 * @param {Function} [iteratee=_.identity] The function to combine
 *  grouped values.
 * @returns {Array} Returns the new array of grouped elements.
 * @example
 *
 * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {
 *   return a + b + c;
 * });
 * // => [111, 222]
 */
var zipWith = baseRest(function(arrays) {
  var length = arrays.length,
      iteratee = length > 1 ? arrays[length - 1] : undefined;

  iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;
  return unzipWith(arrays, iteratee);
});

module.exports = zipWith;
module.exports = require('./stubFalse');
module.exports = require('./stubTrue');
module.exports = require('./placeholder');
var mapping = require('./_mapping'),
    fallbackHolder = require('./placeholder');

/** Built-in value reference. */
var push = Array.prototype.push;

/**
 * Creates a function, with an arity of `n`, that invokes `func` with the
 * arguments it receives.
 *
 * @private
 * @param {Function} func The function to wrap.
 * @param {number} n The arity of the new function.
 * @returns {Function} Returns the new function.
 */
function baseArity(func, n) {
  return n == 2
    ? function(a, b) { return func.apply(undefined, arguments); }
    : function(a) { return func.apply(undefined, arguments); };
}

/**
 * Creates a function that invokes `func`, with up to `n` arguments, ignoring
 * any additional arguments.
 *
 * @private
 * @param {Function} func The function to cap arguments for.
 * @param {number} n The arity cap.
 * @returns {Function} Returns the new function.
 */
function baseAry(func, n) {
  return n == 2
    ? function(a, b) { return func(a, b); }
    : function(a) { return func(a); };
}

/**
 * Creates a clone of `array`.
 *
 * @private
 * @param {Array} array The array to clone.
 * @returns {Array} Returns the cloned array.
 */
function cloneArray(array) {
  var length = array ? array.length : 0,
      result = Array(length);

  while (length--) {
    result[length] = array[length];
  }
  return result;
}

/**
 * Creates a function that clones a given object using the assignment `func`.
 *
 * @private
 * @param {Function} func The assignment function.
 * @returns {Function} Returns the new cloner function.
 */
function createCloner(func) {
  return function(object) {
    return func({}, object);
  };
}

/**
 * A specialized version of `_.spread` which flattens the spread array into
 * the arguments of the invoked `func`.
 *
 * @private
 * @param {Function} func The function to spread arguments over.
 * @param {number} start The start position of the spread.
 * @returns {Function} Returns the new function.
 */
function flatSpread(func, start) {
  return function() {
    var length = arguments.length,
        lastIndex = length - 1,
        args = Array(length);

    while (length--) {
      args[length] = arguments[length];
    }
    var array = args[start],
        otherArgs = args.slice(0, start);

    if (array) {
      push.apply(otherArgs, array);
    }
    if (start != lastIndex) {
      push.apply(otherArgs, args.slice(start + 1));
    }
    return func.apply(this, otherArgs);
  };
}

/**
 * Creates a function that wraps `func` and uses `cloner` to clone the first
 * argument it receives.
 *
 * @private
 * @param {Function} func The function to wrap.
 * @param {Function} cloner The function to clone arguments.
 * @returns {Function} Returns the new immutable function.
 */
function wrapImmutable(func, cloner) {
  return function() {
    var length = arguments.length;
    if (!length) {
      return;
    }
    var args = Array(length);
    while (length--) {
      args[length] = arguments[length];
    }
    var result = args[0] = cloner.apply(undefined, args);
    func.apply(undefined, args);
    return result;
  };
}

/**
 * The base implementation of `convert` which accepts a `util` object of methods
 * required to perform conversions.
 *
 * @param {Object} util The util object.
 * @param {string} name The name of the function to convert.
 * @param {Function} func The function to convert.
 * @param {Object} [options] The options object.
 * @param {boolean} [options.cap=true] Specify capping iteratee arguments.
 * @param {boolean} [options.curry=true] Specify currying.
 * @param {boolean} [options.fixed=true] Specify fixed arity.
 * @param {boolean} [options.immutable=true] Specify immutable operations.
 * @param {boolean} [options.rearg=true] Specify rearranging arguments.
 * @returns {Function|Object} Returns the converted function or object.
 */
function baseConvert(util, name, func, options) {
  var isLib = typeof name == 'function',
      isObj = name === Object(name);

  if (isObj) {
    options = func;
    func = name;
    name = undefined;
  }
  if (func == null) {
    throw new TypeError;
  }
  options || (options = {});

  var config = {
    'cap': 'cap' in options ? options.cap : true,
    'curry': 'curry' in options ? options.curry : true,
    'fixed': 'fixed' in options ? options.fixed : true,
    'immutable': 'immutable' in options ? options.immutable : true,
    'rearg': 'rearg' in options ? options.rearg : true
  };

  var defaultHolder = isLib ? func : fallbackHolder,
      forceCurry = ('curry' in options) && options.curry,
      forceFixed = ('fixed' in options) && options.fixed,
      forceRearg = ('rearg' in options) && options.rearg,
      pristine = isLib ? func.runInContext() : undefined;

  var helpers = isLib ? func : {
    'ary': util.ary,
    'assign': util.assign,
    'clone': util.clone,
    'curry': util.curry,
    'forEach': util.forEach,
    'isArray': util.isArray,
    'isError': util.isError,
    'isFunction': util.isFunction,
    'isWeakMap': util.isWeakMap,
    'iteratee': util.iteratee,
    'keys': util.keys,
    'rearg': util.rearg,
    'toInteger': util.toInteger,
    'toPath': util.toPath
  };

  var ary = helpers.ary,
      assign = helpers.assign,
      clone = helpers.clone,
      curry = helpers.curry,
      each = helpers.forEach,
      isArray = helpers.isArray,
      isError = helpers.isError,
      isFunction = helpers.isFunction,
      isWeakMap = helpers.isWeakMap,
      keys = helpers.keys,
      rearg = helpers.rearg,
      toInteger = helpers.toInteger,
      toPath = helpers.toPath;

  var aryMethodKeys = keys(mapping.aryMethod);

  var wrappers = {
    'castArray': function(castArray) {
      return function() {
        var value = arguments[0];
        return isArray(value)
          ? castArray(cloneArray(value))
          : castArray.apply(undefined, arguments);
      };
    },
    'iteratee': function(iteratee) {
      return function() {
        var func = arguments[0],
            arity = arguments[1],
            result = iteratee(func, arity),
            length = result.length;

        if (config.cap && typeof arity == 'number') {
          arity = arity > 2 ? (arity - 2) : 1;
          return (length && length <= arity) ? result : baseAry(result, arity);
        }
        return result;
      };
    },
    'mixin': function(mixin) {
      return function(source) {
        var func = this;
        if (!isFunction(func)) {
          return mixin(func, Object(source));
        }
        var pairs = [];
        each(keys(source), function(key) {
          if (isFunction(source[key])) {
            pairs.push([key, func.prototype[key]]);
          }
        });

        mixin(func, Object(source));

        each(pairs, function(pair) {
          var value = pair[1];
          if (isFunction(value)) {
            func.prototype[pair[0]] = value;
          } else {
            delete func.prototype[pair[0]];
          }
        });
        return func;
      };
    },
    'nthArg': function(nthArg) {
      return function(n) {
        var arity = n < 0 ? 1 : (toInteger(n) + 1);
        return curry(nthArg(n), arity);
      };
    },
    'rearg': function(rearg) {
      return function(func, indexes) {
        var arity = indexes ? indexes.length : 0;
        return curry(rearg(func, indexes), arity);
      };
    },
    'runInContext': function(runInContext) {
      return function(context) {
        return baseConvert(util, runInContext(context), options);
      };
    }
  };

  /*--------------------------------------------------------------------------*/

  /**
   * Casts `func` to a function with an arity capped iteratee if needed.
   *
   * @private
   * @param {string} name The name of the function to inspect.
   * @param {Function} func The function to inspect.
   * @returns {Function} Returns the cast function.
   */
  function castCap(name, func) {
    if (config.cap) {
      var indexes = mapping.iterateeRearg[name];
      if (indexes) {
        return iterateeRearg(func, indexes);
      }
      var n = !isLib && mapping.iterateeAry[name];
      if (n) {
        return iterateeAry(func, n);
      }
    }
    return func;
  }

  /**
   * Casts `func` to a curried function if needed.
   *
   * @private
   * @param {string} name The name of the function to inspect.
   * @param {Function} func The function to inspect.
   * @param {number} n The arity of `func`.
   * @returns {Function} Returns the cast function.
   */
  function castCurry(name, func, n) {
    return (forceCurry || (config.curry && n > 1))
      ? curry(func, n)
      : func;
  }

  /**
   * Casts `func` to a fixed arity function if needed.
   *
   * @private
   * @param {string} name The name of the function to inspect.
   * @param {Function} func The function to inspect.
   * @param {number} n The arity cap.
   * @returns {Function} Returns the cast function.
   */
  function castFixed(name, func, n) {
    if (config.fixed && (forceFixed || !mapping.skipFixed[name])) {
      var data = mapping.methodSpread[name],
          start = data && data.start;

      return start  === undefined ? ary(func, n) : flatSpread(func, start);
    }
    return func;
  }

  /**
   * Casts `func` to an rearged function if needed.
   *
   * @private
   * @param {string} name The name of the function to inspect.
   * @param {Function} func The function to inspect.
   * @param {number} n The arity of `func`.
   * @returns {Function} Returns the cast function.
   */
  function castRearg(name, func, n) {
    return (config.rearg && n > 1 && (forceRearg || !mapping.skipRearg[name]))
      ? rearg(func, mapping.methodRearg[name] || mapping.aryRearg[n])
      : func;
  }

  /**
   * Creates a clone of `object` by `path`.
   *
   * @private
   * @param {Object} object The object to clone.
   * @param {Array|string} path The path to clone by.
   * @returns {Object} Returns the cloned object.
   */
  function cloneByPath(object, path) {
    path = toPath(path);

    var index = -1,
        length = path.length,
        lastIndex = length - 1,
        result = clone(Object(object)),
        nested = result;

    while (nested != null && ++index < length) {
      var key = path[index],
          value = nested[key];

      if (value != null &&
          !(isFunction(value) || isError(value) || isWeakMap(value))) {
        nested[key] = clone(index == lastIndex ? value : Object(value));
      }
      nested = nested[key];
    }
    return result;
  }

  /**
   * Converts `lodash` to an immutable auto-curried iteratee-first data-last
   * version with conversion `options` applied.
   *
   * @param {Object} [options] The options object. See `baseConvert` for more details.
   * @returns {Function} Returns the converted `lodash`.
   */
  function convertLib(options) {
    return _.runInContext.convert(options)(undefined);
  }

  /**
   * Create a converter function for `func` of `name`.
   *
   * @param {string} name The name of the function to convert.
   * @param {Function} func The function to convert.
   * @returns {Function} Returns the new converter function.
   */
  function createConverter(name, func) {
    var realName = mapping.aliasToReal[name] || name,
        methodName = mapping.remap[realName] || realName,
        oldOptions = options;

    return function(options) {
      var newUtil = isLib ? pristine : helpers,
          newFunc = isLib ? pristine[methodName] : func,
          newOptions = assign(assign({}, oldOptions), options);

      return baseConvert(newUtil, realName, newFunc, newOptions);
    };
  }

  /**
   * Creates a function that wraps `func` to invoke its iteratee, with up to `n`
   * arguments, ignoring any additional arguments.
   *
   * @private
   * @param {Function} func The function to cap iteratee arguments for.
   * @param {number} n The arity cap.
   * @returns {Function} Returns the new function.
   */
  function iterateeAry(func, n) {
    return overArg(func, function(func) {
      return typeof func == 'function' ? baseAry(func, n) : func;
    });
  }

  /**
   * Creates a function that wraps `func` to invoke its iteratee with arguments
   * arranged according to the specified `indexes` where the argument value at
   * the first index is provided as the first argument, the argument value at
   * the second index is provided as the second argument, and so on.
   *
   * @private
   * @param {Function} func The function to rearrange iteratee arguments for.
   * @param {number[]} indexes The arranged argument indexes.
   * @returns {Function} Returns the new function.
   */
  function iterateeRearg(func, indexes) {
    return overArg(func, function(func) {
      var n = indexes.length;
      return baseArity(rearg(baseAry(func, n), indexes), n);
    });
  }

  /**
   * Creates a function that invokes `func` with its first argument transformed.
   *
   * @private
   * @param {Function} func The function to wrap.
   * @param {Function} transform The argument transform.
   * @returns {Function} Returns the new function.
   */
  function overArg(func, transform) {
    return function() {
      var length = arguments.length;
      if (!length) {
        return func();
      }
      var args = Array(length);
      while (length--) {
        args[length] = arguments[length];
      }
      var index = config.rearg ? 0 : (length - 1);
      args[index] = transform(args[index]);
      return func.apply(undefined, args);
    };
  }

  /**
   * Creates a function that wraps `func` and applys the conversions
   * rules by `name`.
   *
   * @private
   * @param {string} name The name of the function to wrap.
   * @param {Function} func The function to wrap.
   * @returns {Function} Returns the converted function.
   */
  function wrap(name, func, placeholder) {
    var result,
        realName = mapping.aliasToReal[name] || name,
        wrapped = func,
        wrapper = wrappers[realName];

    if (wrapper) {
      wrapped = wrapper(func);
    }
    else if (config.immutable) {
      if (mapping.mutate.array[realName]) {
        wrapped = wrapImmutable(func, cloneArray);
      }
      else if (mapping.mutate.object[realName]) {
        wrapped = wrapImmutable(func, createCloner(func));
      }
      else if (mapping.mutate.set[realName]) {
        wrapped = wrapImmutable(func, cloneByPath);
      }
    }
    each(aryMethodKeys, function(aryKey) {
      each(mapping.aryMethod[aryKey], function(otherName) {
        if (realName == otherName) {
          var data = mapping.methodSpread[realName],
              afterRearg = data && data.afterRearg;

          result = afterRearg
            ? castFixed(realName, castRearg(realName, wrapped, aryKey), aryKey)
            : castRearg(realName, castFixed(realName, wrapped, aryKey), aryKey);

          result = castCap(realName, result);
          result = castCurry(realName, result, aryKey);
          return false;
        }
      });
      return !result;
    });

    result || (result = wrapped);
    if (result == func) {
      result = forceCurry ? curry(result, 1) : function() {
        return func.apply(this, arguments);
      };
    }
    result.convert = createConverter(realName, func);
    result.placeholder = func.placeholder = placeholder;

    return result;
  }

  /*--------------------------------------------------------------------------*/

  if (!isObj) {
    return wrap(name, func, defaultHolder);
  }
  var _ = func;

  // Convert methods by ary cap.
  var pairs = [];
  each(aryMethodKeys, function(aryKey) {
    each(mapping.aryMethod[aryKey], function(key) {
      var func = _[mapping.remap[key] || key];
      if (func) {
        pairs.push([key, wrap(key, func, _)]);
      }
    });
  });

  // Convert remaining methods.
  each(keys(_), function(key) {
    var func = _[key];
    if (typeof func == 'function') {
      var length = pairs.length;
      while (length--) {
        if (pairs[length][0] == key) {
          return;
        }
      }
      func.convert = createConverter(key, func);
      pairs.push([key, func]);
    }
  });

  // Assign to `_` leaving `_.prototype` unchanged to allow chaining.
  each(pairs, function(pair) {
    _[pair[0]] = pair[1];
  });

  _.convert = convertLib;
  _.placeholder = _;

  // Assign aliases.
  each(keys(_), function(key) {
    each(mapping.realToAlias[key] || [], function(alias) {
      _[alias] = _[key];
    });
  });

  return _;
}

module.exports = baseConvert;
var baseConvert = require('./_baseConvert');

/**
 * Converts `lodash` to an immutable auto-curried iteratee-first data-last
 * version with conversion `options` applied.
 *
 * @param {Function} lodash The lodash function to convert.
 * @param {Object} [options] The options object. See `baseConvert` for more details.
 * @returns {Function} Returns the converted `lodash`.
 */
function browserConvert(lodash, options) {
  return baseConvert(lodash, lodash, options);
}

if (typeof _ == 'function' && typeof _.runInContext == 'function') {
  _ = browserConvert(_.runInContext());
}
module.exports = browserConvert;
module.exports = {
  'cap': false,
  'curry': false,
  'fixed': false,
  'immutable': false,
  'rearg': false
};
/** Used to map aliases to their real names. */
exports.aliasToReal = {

  // Lodash aliases.
  'each': 'forEach',
  'eachRight': 'forEachRight',
  'entries': 'toPairs',
  'entriesIn': 'toPairsIn',
  'extend': 'assignIn',
  'extendAll': 'assignInAll',
  'extendAllWith': 'assignInAllWith',
  'extendWith': 'assignInWith',
  'first': 'head',

  // Methods that are curried variants of others.
  'conforms': 'conformsTo',
  'matches': 'isMatch',
  'property': 'get',

  // Ramda aliases.
  '__': 'placeholder',
  'F': 'stubFalse',
  'T': 'stubTrue',
  'all': 'every',
  'allPass': 'overEvery',
  'always': 'constant',
  'any': 'some',
  'anyPass': 'overSome',
  'apply': 'spread',
  'assoc': 'set',
  'assocPath': 'set',
  'complement': 'negate',
  'compose': 'flowRight',
  'contains': 'includes',
  'dissoc': 'unset',
  'dissocPath': 'unset',
  'dropLast': 'dropRight',
  'dropLastWhile': 'dropRightWhile',
  'equals': 'isEqual',
  'identical': 'eq',
  'indexBy': 'keyBy',
  'init': 'initial',
  'invertObj': 'invert',
  'juxt': 'over',
  'omitAll': 'omit',
  'nAry': 'ary',
  'path': 'get',
  'pathEq': 'matchesProperty',
  'pathOr': 'getOr',
  'paths': 'at',
  'pickAll': 'pick',
  'pipe': 'flow',
  'pluck': 'map',
  'prop': 'get',
  'propEq': 'matchesProperty',
  'propOr': 'getOr',
  'props': 'at',
  'symmetricDifference': 'xor',
  'symmetricDifferenceBy': 'xorBy',
  'symmetricDifferenceWith': 'xorWith',
  'takeLast': 'takeRight',
  'takeLastWhile': 'takeRightWhile',
  'unapply': 'rest',
  'unnest': 'flatten',
  'useWith': 'overArgs',
  'where': 'conformsTo',
  'whereEq': 'isMatch',
  'zipObj': 'zipObject'
};

/** Used to map ary to method names. */
exports.aryMethod = {
  '1': [
    'assignAll', 'assignInAll', 'attempt', 'castArray', 'ceil', 'create',
    'curry', 'curryRight', 'defaultsAll', 'defaultsDeepAll', 'floor', 'flow',
    'flowRight', 'fromPairs', 'invert', 'iteratee', 'memoize', 'method', 'mergeAll',
    'methodOf', 'mixin', 'nthArg', 'over', 'overEvery', 'overSome','rest', 'reverse',
    'round', 'runInContext', 'spread', 'template', 'trim', 'trimEnd', 'trimStart',
    'uniqueId', 'words', 'zipAll'
  ],
  '2': [
    'add', 'after', 'ary', 'assign', 'assignAllWith', 'assignIn', 'assignInAllWith',
    'at', 'before', 'bind', 'bindAll', 'bindKey', 'chunk', 'cloneDeepWith',
    'cloneWith', 'concat', 'conformsTo', 'countBy', 'curryN', 'curryRightN',
    'debounce', 'defaults', 'defaultsDeep', 'defaultTo', 'delay', 'difference',
    'divide', 'drop', 'dropRight', 'dropRightWhile', 'dropWhile', 'endsWith', 'eq',
    'every', 'filter', 'find', 'findIndex', 'findKey', 'findLast', 'findLastIndex',
    'findLastKey', 'flatMap', 'flatMapDeep', 'flattenDepth', 'forEach',
    'forEachRight', 'forIn', 'forInRight', 'forOwn', 'forOwnRight', 'get',
    'groupBy', 'gt', 'gte', 'has', 'hasIn', 'includes', 'indexOf', 'intersection',
    'invertBy', 'invoke', 'invokeMap', 'isEqual', 'isMatch', 'join', 'keyBy',
    'lastIndexOf', 'lt', 'lte', 'map', 'mapKeys', 'mapValues', 'matchesProperty',
    'maxBy', 'meanBy', 'merge', 'mergeAllWith', 'minBy', 'multiply', 'nth', 'omit',
    'omitBy', 'overArgs', 'pad', 'padEnd', 'padStart', 'parseInt', 'partial',
    'partialRight', 'partition', 'pick', 'pickBy', 'propertyOf', 'pull', 'pullAll',
    'pullAt', 'random', 'range', 'rangeRight', 'rearg', 'reject', 'remove',
    'repeat', 'restFrom', 'result', 'sampleSize', 'some', 'sortBy', 'sortedIndex',
    'sortedIndexOf', 'sortedLastIndex', 'sortedLastIndexOf', 'sortedUniqBy',
    'split', 'spreadFrom', 'startsWith', 'subtract', 'sumBy', 'take', 'takeRight',
    'takeRightWhile', 'takeWhile', 'tap', 'throttle', 'thru', 'times', 'trimChars',
    'trimCharsEnd', 'trimCharsStart', 'truncate', 'union', 'uniqBy', 'uniqWith',
    'unset', 'unzipWith', 'without', 'wrap', 'xor', 'zip', 'zipObject',
    'zipObjectDeep'
  ],
  '3': [
    'assignInWith', 'assignWith', 'clamp', 'differenceBy', 'differenceWith',
    'findFrom', 'findIndexFrom', 'findLastFrom', 'findLastIndexFrom', 'getOr',
    'includesFrom', 'indexOfFrom', 'inRange', 'intersectionBy', 'intersectionWith',
    'invokeArgs', 'invokeArgsMap', 'isEqualWith', 'isMatchWith', 'flatMapDepth',
    'lastIndexOfFrom', 'mergeWith', 'orderBy', 'padChars', 'padCharsEnd',
    'padCharsStart', 'pullAllBy', 'pullAllWith', 'rangeStep', 'rangeStepRight',
    'reduce', 'reduceRight', 'replace', 'set', 'slice', 'sortedIndexBy',
    'sortedLastIndexBy', 'transform', 'unionBy', 'unionWith', 'update', 'xorBy',
    'xorWith', 'zipWith'
  ],
  '4': [
    'fill', 'setWith', 'updateWith'
  ]
};

/** Used to map ary to rearg configs. */
exports.aryRearg = {
  '2': [1, 0],
  '3': [2, 0, 1],
  '4': [3, 2, 0, 1]
};

/** Used to map method names to their iteratee ary. */
exports.iterateeAry = {
  'dropRightWhile': 1,
  'dropWhile': 1,
  'every': 1,
  'filter': 1,
  'find': 1,
  'findFrom': 1,
  'findIndex': 1,
  'findIndexFrom': 1,
  'findKey': 1,
  'findLast': 1,
  'findLastFrom': 1,
  'findLastIndex': 1,
  'findLastIndexFrom': 1,
  'findLastKey': 1,
  'flatMap': 1,
  'flatMapDeep': 1,
  'flatMapDepth': 1,
  'forEach': 1,
  'forEachRight': 1,
  'forIn': 1,
  'forInRight': 1,
  'forOwn': 1,
  'forOwnRight': 1,
  'map': 1,
  'mapKeys': 1,
  'mapValues': 1,
  'partition': 1,
  'reduce': 2,
  'reduceRight': 2,
  'reject': 1,
  'remove': 1,
  'some': 1,
  'takeRightWhile': 1,
  'takeWhile': 1,
  'times': 1,
  'transform': 2
};

/** Used to map method names to iteratee rearg configs. */
exports.iterateeRearg = {
  'mapKeys': [1],
  'reduceRight': [1, 0]
};

/** Used to map method names to rearg configs. */
exports.methodRearg = {
  'assignInAllWith': [1, 0],
  'assignInWith': [1, 2, 0],
  'assignAllWith': [1, 0],
  'assignWith': [1, 2, 0],
  'differenceBy': [1, 2, 0],
  'differenceWith': [1, 2, 0],
  'getOr': [2, 1, 0],
  'intersectionBy': [1, 2, 0],
  'intersectionWith': [1, 2, 0],
  'isEqualWith': [1, 2, 0],
  'isMatchWith': [2, 1, 0],
  'mergeAllWith': [1, 0],
  'mergeWith': [1, 2, 0],
  'padChars': [2, 1, 0],
  'padCharsEnd': [2, 1, 0],
  'padCharsStart': [2, 1, 0],
  'pullAllBy': [2, 1, 0],
  'pullAllWith': [2, 1, 0],
  'rangeStep': [1, 2, 0],
  'rangeStepRight': [1, 2, 0],
  'setWith': [3, 1, 2, 0],
  'sortedIndexBy': [2, 1, 0],
  'sortedLastIndexBy': [2, 1, 0],
  'unionBy': [1, 2, 0],
  'unionWith': [1, 2, 0],
  'updateWith': [3, 1, 2, 0],
  'xorBy': [1, 2, 0],
  'xorWith': [1, 2, 0],
  'zipWith': [1, 2, 0]
};

/** Used to map method names to spread configs. */
exports.methodSpread = {
  'assignAll': { 'start': 0 },
  'assignAllWith': { 'start': 0 },
  'assignInAll': { 'start': 0 },
  'assignInAllWith': { 'start': 0 },
  'defaultsAll': { 'start': 0 },
  'defaultsDeepAll': { 'start': 0 },
  'invokeArgs': { 'start': 2 },
  'invokeArgsMap': { 'start': 2 },
  'mergeAll': { 'start': 0 },
  'mergeAllWith': { 'start': 0 },
  'partial': { 'start': 1 },
  'partialRight': { 'start': 1 },
  'without': { 'start': 1 },
  'zipAll': { 'start': 0 }
};

/** Used to identify methods which mutate arrays or objects. */
exports.mutate = {
  'array': {
    'fill': true,
    'pull': true,
    'pullAll': true,
    'pullAllBy': true,
    'pullAllWith': true,
    'pullAt': true,
    'remove': true,
    'reverse': true
  },
  'object': {
    'assign': true,
    'assignAll': true,
    'assignAllWith': true,
    'assignIn': true,
    'assignInAll': true,
    'assignInAllWith': true,
    'assignInWith': true,
    'assignWith': true,
    'defaults': true,
    'defaultsAll': true,
    'defaultsDeep': true,
    'defaultsDeepAll': true,
    'merge': true,
    'mergeAll': true,
    'mergeAllWith': true,
    'mergeWith': true,
  },
  'set': {
    'set': true,
    'setWith': true,
    'unset': true,
    'update': true,
    'updateWith': true
  }
};

/** Used to map real names to their aliases. */
exports.realToAlias = (function() {
  var hasOwnProperty = Object.prototype.hasOwnProperty,
      object = exports.aliasToReal,
      result = {};

  for (var key in object) {
    var value = object[key];
    if (hasOwnProperty.call(result, value)) {
      result[value].push(key);
    } else {
      result[value] = [key];
    }
  }
  return result;
}());

/** Used to map method names to other names. */
exports.remap = {
  'assignAll': 'assign',
  'assignAllWith': 'assignWith',
  'assignInAll': 'assignIn',
  'assignInAllWith': 'assignInWith',
  'curryN': 'curry',
  'curryRightN': 'curryRight',
  'defaultsAll': 'defaults',
  'defaultsDeepAll': 'defaultsDeep',
  'findFrom': 'find',
  'findIndexFrom': 'findIndex',
  'findLastFrom': 'findLast',
  'findLastIndexFrom': 'findLastIndex',
  'getOr': 'get',
  'includesFrom': 'includes',
  'indexOfFrom': 'indexOf',
  'invokeArgs': 'invoke',
  'invokeArgsMap': 'invokeMap',
  'lastIndexOfFrom': 'lastIndexOf',
  'mergeAll': 'merge',
  'mergeAllWith': 'mergeWith',
  'padChars': 'pad',
  'padCharsEnd': 'padEnd',
  'padCharsStart': 'padStart',
  'propertyOf': 'get',
  'rangeStep': 'range',
  'rangeStepRight': 'rangeRight',
  'restFrom': 'rest',
  'spreadFrom': 'spread',
  'trimChars': 'trim',
  'trimCharsEnd': 'trimEnd',
  'trimCharsStart': 'trimStart',
  'zipAll': 'zip'
};

/** Used to track methods that skip fixing their arity. */
exports.skipFixed = {
  'castArray': true,
  'flow': true,
  'flowRight': true,
  'iteratee': true,
  'mixin': true,
  'rearg': true,
  'runInContext': true
};

/** Used to track methods that skip rearranging arguments. */
exports.skipRearg = {
  'add': true,
  'assign': true,
  'assignIn': true,
  'bind': true,
  'bindKey': true,
  'concat': true,
  'difference': true,
  'divide': true,
  'eq': true,
  'gt': true,
  'gte': true,
  'isEqual': true,
  'lt': true,
  'lte': true,
  'matchesProperty': true,
  'merge': true,
  'multiply': true,
  'overArgs': true,
  'partial': true,
  'partialRight': true,
  'propertyOf': true,
  'random': true,
  'range': true,
  'rangeRight': true,
  'subtract': true,
  'zip': true,
  'zipObject': true,
  'zipObjectDeep': true
};
module.exports = {
  'ary': require('../ary'),
  'assign': require('../_baseAssign'),
  'clone': require('../clone'),
  'curry': require('../curry'),
  'forEach': require('../_arrayEach'),
  'isArray': require('../isArray'),
  'isError': require('../isError'),
  'isFunction': require('../isFunction'),
  'isWeakMap': require('../isWeakMap'),
  'iteratee': require('../iteratee'),
  'keys': require('../_baseKeys'),
  'rearg': require('../rearg'),
  'toInteger': require('../toInteger'),
  'toPath': require('../toPath')
};
var convert = require('./convert'),
    func = convert('add', require('../add'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('after', require('../after'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./every');
module.exports = require('./overEvery');
module.exports = require('./constant');
module.exports = require('./some');
module.exports = require('./overSome');
module.exports = require('./spread');
var convert = require('./convert');
module.exports = convert(require('../array'));
var convert = require('./convert'),
    func = convert('ary', require('../ary'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('assign', require('../assign'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('assignAll', require('../assign'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('assignAllWith', require('../assignWith'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('assignIn', require('../assignIn'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('assignInAll', require('../assignIn'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('assignInAllWith', require('../assignInWith'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('assignInWith', require('../assignInWith'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('assignWith', require('../assignWith'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./set');
module.exports = require('./set');
var convert = require('./convert'),
    func = convert('at', require('../at'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('attempt', require('../attempt'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('before', require('../before'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('bind', require('../bind'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('bindAll', require('../bindAll'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('bindKey', require('../bindKey'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('camelCase', require('../camelCase'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('capitalize', require('../capitalize'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('castArray', require('../castArray'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('ceil', require('../ceil'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('chain', require('../chain'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('chunk', require('../chunk'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('clamp', require('../clamp'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('clone', require('../clone'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('cloneDeep', require('../cloneDeep'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('cloneDeepWith', require('../cloneDeepWith'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('cloneWith', require('../cloneWith'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert');
module.exports = convert(require('../collection'));
var convert = require('./convert'),
    func = convert('commit', require('../commit'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('compact', require('../compact'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./negate');
module.exports = require('./flowRight');
var convert = require('./convert'),
    func = convert('concat', require('../concat'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('cond', require('../cond'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./conformsTo');
var convert = require('./convert'),
    func = convert('conformsTo', require('../conformsTo'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('constant', require('../constant'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./includes');
var baseConvert = require('./_baseConvert'),
    util = require('./_util');

/**
 * Converts `func` of `name` to an immutable auto-curried iteratee-first data-last
 * version with conversion `options` applied. If `name` is an object its methods
 * will be converted.
 *
 * @param {string} name The name of the function to wrap.
 * @param {Function} [func] The function to wrap.
 * @param {Object} [options] The options object. See `baseConvert` for more details.
 * @returns {Function|Object} Returns the converted function or object.
 */
function convert(name, func, options) {
  return baseConvert(util, name, func, options);
}

module.exports = convert;
var convert = require('./convert'),
    func = convert('countBy', require('../countBy'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('create', require('../create'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('curry', require('../curry'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('curryN', require('../curry'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('curryRight', require('../curryRight'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('curryRightN', require('../curryRight'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert');
module.exports = convert(require('../date'));
var convert = require('./convert'),
    func = convert('debounce', require('../debounce'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('deburr', require('../deburr'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('defaultTo', require('../defaultTo'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('defaults', require('../defaults'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('defaultsAll', require('../defaults'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('defaultsDeep', require('../defaultsDeep'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('defaultsDeepAll', require('../defaultsDeep'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('defer', require('../defer'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('delay', require('../delay'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('difference', require('../difference'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('differenceBy', require('../differenceBy'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('differenceWith', require('../differenceWith'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./unset');
module.exports = require('./unset');
var convert = require('./convert'),
    func = convert('divide', require('../divide'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('drop', require('../drop'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./dropRight');
module.exports = require('./dropRightWhile');
var convert = require('./convert'),
    func = convert('dropRight', require('../dropRight'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('dropRightWhile', require('../dropRightWhile'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('dropWhile', require('../dropWhile'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./forEach');
module.exports = require('./forEachRight');
var convert = require('./convert'),
    func = convert('endsWith', require('../endsWith'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./toPairs');
module.exports = require('./toPairsIn');
var convert = require('./convert'),
    func = convert('eq', require('../eq'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./isEqual');
var convert = require('./convert'),
    func = convert('escape', require('../escape'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('escapeRegExp', require('../escapeRegExp'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('every', require('../every'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./assignIn');
module.exports = require('./assignInAll');
module.exports = require('./assignInAllWith');
module.exports = require('./assignInWith');
var convert = require('./convert'),
    func = convert('fill', require('../fill'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('filter', require('../filter'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('find', require('../find'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('findFrom', require('../find'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('findIndex', require('../findIndex'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('findIndexFrom', require('../findIndex'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('findKey', require('../findKey'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('findLast', require('../findLast'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('findLastFrom', require('../findLast'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('findLastIndex', require('../findLastIndex'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('findLastIndexFrom', require('../findLastIndex'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('findLastKey', require('../findLastKey'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./head');
var convert = require('./convert'),
    func = convert('flatMap', require('../flatMap'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('flatMapDeep', require('../flatMapDeep'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('flatMapDepth', require('../flatMapDepth'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('flatten', require('../flatten'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('flattenDeep', require('../flattenDeep'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('flattenDepth', require('../flattenDepth'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('flip', require('../flip'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('floor', require('../floor'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('flow', require('../flow'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('flowRight', require('../flowRight'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('forEach', require('../forEach'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('forEachRight', require('../forEachRight'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('forIn', require('../forIn'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('forInRight', require('../forInRight'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('forOwn', require('../forOwn'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('forOwnRight', require('../forOwnRight'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('fromPairs', require('../fromPairs'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert');
module.exports = convert(require('../function'));
var convert = require('./convert'),
    func = convert('functions', require('../functions'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('functionsIn', require('../functionsIn'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('get', require('../get'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('getOr', require('../get'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('groupBy', require('../groupBy'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('gt', require('../gt'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('gte', require('../gte'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('has', require('../has'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('hasIn', require('../hasIn'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('head', require('../head'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./eq');
var convert = require('./convert'),
    func = convert('identity', require('../identity'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('inRange', require('../inRange'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('includes', require('../includes'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('includesFrom', require('../includes'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./keyBy');
var convert = require('./convert'),
    func = convert('indexOf', require('../indexOf'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('indexOfFrom', require('../indexOf'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./initial');
var convert = require('./convert'),
    func = convert('initial', require('../initial'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('intersection', require('../intersection'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('intersectionBy', require('../intersectionBy'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('intersectionWith', require('../intersectionWith'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('invert', require('../invert'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('invertBy', require('../invertBy'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./invert');
var convert = require('./convert'),
    func = convert('invoke', require('../invoke'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('invokeArgs', require('../invoke'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('invokeArgsMap', require('../invokeMap'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('invokeMap', require('../invokeMap'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isArguments', require('../isArguments'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isArray', require('../isArray'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isArrayBuffer', require('../isArrayBuffer'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isArrayLike', require('../isArrayLike'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isArrayLikeObject', require('../isArrayLikeObject'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isBoolean', require('../isBoolean'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isBuffer', require('../isBuffer'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isDate', require('../isDate'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isElement', require('../isElement'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isEmpty', require('../isEmpty'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isEqual', require('../isEqual'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isEqualWith', require('../isEqualWith'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isError', require('../isError'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isFinite', require('../isFinite'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isFunction', require('../isFunction'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isInteger', require('../isInteger'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isLength', require('../isLength'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isMap', require('../isMap'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isMatch', require('../isMatch'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isMatchWith', require('../isMatchWith'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isNaN', require('../isNaN'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isNative', require('../isNative'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isNil', require('../isNil'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isNull', require('../isNull'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isNumber', require('../isNumber'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isObject', require('../isObject'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isObjectLike', require('../isObjectLike'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isPlainObject', require('../isPlainObject'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isRegExp', require('../isRegExp'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isSafeInteger', require('../isSafeInteger'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isSet', require('../isSet'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isString', require('../isString'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isSymbol', require('../isSymbol'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isTypedArray', require('../isTypedArray'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isUndefined', require('../isUndefined'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isWeakMap', require('../isWeakMap'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('isWeakSet', require('../isWeakSet'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('iteratee', require('../iteratee'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('join', require('../join'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./over');
var convert = require('./convert'),
    func = convert('kebabCase', require('../kebabCase'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('keyBy', require('../keyBy'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('keys', require('../keys'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('keysIn', require('../keysIn'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert');
module.exports = convert(require('../lang'));
var convert = require('./convert'),
    func = convert('last', require('../last'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('lastIndexOf', require('../lastIndexOf'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('lastIndexOfFrom', require('../lastIndexOf'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('lowerCase', require('../lowerCase'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('lowerFirst', require('../lowerFirst'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('lt', require('../lt'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('lte', require('../lte'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('map', require('../map'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('mapKeys', require('../mapKeys'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('mapValues', require('../mapValues'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./isMatch');
var convert = require('./convert'),
    func = convert('matchesProperty', require('../matchesProperty'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert');
module.exports = convert(require('../math'));
var convert = require('./convert'),
    func = convert('max', require('../max'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('maxBy', require('../maxBy'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('mean', require('../mean'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('meanBy', require('../meanBy'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('memoize', require('../memoize'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('merge', require('../merge'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('mergeAll', require('../merge'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('mergeAllWith', require('../mergeWith'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('mergeWith', require('../mergeWith'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('method', require('../method'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('methodOf', require('../methodOf'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('min', require('../min'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('minBy', require('../minBy'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('mixin', require('../mixin'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('multiply', require('../multiply'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./ary');
var convert = require('./convert'),
    func = convert('negate', require('../negate'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('next', require('../next'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('noop', require('../noop'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('now', require('../now'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('nth', require('../nth'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('nthArg', require('../nthArg'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert');
module.exports = convert(require('../number'));
var convert = require('./convert');
module.exports = convert(require('../object'));
var convert = require('./convert'),
    func = convert('omit', require('../omit'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./omit');
var convert = require('./convert'),
    func = convert('omitBy', require('../omitBy'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('once', require('../once'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('orderBy', require('../orderBy'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('over', require('../over'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('overArgs', require('../overArgs'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('overEvery', require('../overEvery'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('overSome', require('../overSome'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('pad', require('../pad'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('padChars', require('../pad'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('padCharsEnd', require('../padEnd'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('padCharsStart', require('../padStart'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('padEnd', require('../padEnd'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('padStart', require('../padStart'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('parseInt', require('../parseInt'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('partial', require('../partial'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('partialRight', require('../partialRight'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('partition', require('../partition'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./get');
module.exports = require('./matchesProperty');
module.exports = require('./getOr');
module.exports = require('./at');
var convert = require('./convert'),
    func = convert('pick', require('../pick'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./pick');
var convert = require('./convert'),
    func = convert('pickBy', require('../pickBy'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./flow');
/**
 * The default argument placeholder value for methods.
 *
 * @type {Object}
 */
module.exports = {};
var convert = require('./convert'),
    func = convert('plant', require('../plant'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./map');
module.exports = require('./get');
module.exports = require('./matchesProperty');
module.exports = require('./getOr');
module.exports = require('./get');
var convert = require('./convert'),
    func = convert('propertyOf', require('../get'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./at');
var convert = require('./convert'),
    func = convert('pull', require('../pull'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('pullAll', require('../pullAll'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('pullAllBy', require('../pullAllBy'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('pullAllWith', require('../pullAllWith'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('pullAt', require('../pullAt'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('random', require('../random'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('range', require('../range'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('rangeRight', require('../rangeRight'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('rangeStep', require('../range'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('rangeStepRight', require('../rangeRight'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('rearg', require('../rearg'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('reduce', require('../reduce'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('reduceRight', require('../reduceRight'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('reject', require('../reject'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('remove', require('../remove'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('repeat', require('../repeat'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('replace', require('../replace'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('rest', require('../rest'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('restFrom', require('../rest'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('result', require('../result'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('reverse', require('../reverse'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('round', require('../round'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('sample', require('../sample'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('sampleSize', require('../sampleSize'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert');
module.exports = convert(require('../seq'));
var convert = require('./convert'),
    func = convert('set', require('../set'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('setWith', require('../setWith'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('shuffle', require('../shuffle'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('size', require('../size'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('slice', require('../slice'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('snakeCase', require('../snakeCase'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('some', require('../some'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('sortBy', require('../sortBy'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('sortedIndex', require('../sortedIndex'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('sortedIndexBy', require('../sortedIndexBy'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('sortedIndexOf', require('../sortedIndexOf'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('sortedLastIndex', require('../sortedLastIndex'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('sortedLastIndexBy', require('../sortedLastIndexBy'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('sortedLastIndexOf', require('../sortedLastIndexOf'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('sortedUniq', require('../sortedUniq'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('sortedUniqBy', require('../sortedUniqBy'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('split', require('../split'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('spread', require('../spread'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('spreadFrom', require('../spread'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('startCase', require('../startCase'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('startsWith', require('../startsWith'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert');
module.exports = convert(require('../string'));
var convert = require('./convert'),
    func = convert('stubArray', require('../stubArray'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('stubFalse', require('../stubFalse'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('stubObject', require('../stubObject'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('stubString', require('../stubString'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('stubTrue', require('../stubTrue'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('subtract', require('../subtract'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('sum', require('../sum'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('sumBy', require('../sumBy'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./xor');
module.exports = require('./xorBy');
module.exports = require('./xorWith');
var convert = require('./convert'),
    func = convert('tail', require('../tail'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('take', require('../take'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./takeRight');
module.exports = require('./takeRightWhile');
var convert = require('./convert'),
    func = convert('takeRight', require('../takeRight'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('takeRightWhile', require('../takeRightWhile'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('takeWhile', require('../takeWhile'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('tap', require('../tap'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('template', require('../template'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('templateSettings', require('../templateSettings'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('throttle', require('../throttle'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('thru', require('../thru'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('times', require('../times'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('toArray', require('../toArray'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('toFinite', require('../toFinite'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('toInteger', require('../toInteger'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('toIterator', require('../toIterator'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('toJSON', require('../toJSON'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('toLength', require('../toLength'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('toLower', require('../toLower'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('toNumber', require('../toNumber'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('toPairs', require('../toPairs'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('toPairsIn', require('../toPairsIn'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('toPath', require('../toPath'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('toPlainObject', require('../toPlainObject'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('toSafeInteger', require('../toSafeInteger'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('toString', require('../toString'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('toUpper', require('../toUpper'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('transform', require('../transform'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('trim', require('../trim'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('trimChars', require('../trim'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('trimCharsEnd', require('../trimEnd'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('trimCharsStart', require('../trimStart'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('trimEnd', require('../trimEnd'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('trimStart', require('../trimStart'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('truncate', require('../truncate'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./rest');
var convert = require('./convert'),
    func = convert('unary', require('../unary'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('unescape', require('../unescape'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('union', require('../union'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('unionBy', require('../unionBy'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('unionWith', require('../unionWith'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('uniq', require('../uniq'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('uniqBy', require('../uniqBy'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('uniqWith', require('../uniqWith'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('uniqueId', require('../uniqueId'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./flatten');
var convert = require('./convert'),
    func = convert('unset', require('../unset'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('unzip', require('../unzip'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('unzipWith', require('../unzipWith'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('update', require('../update'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('updateWith', require('../updateWith'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('upperCase', require('../upperCase'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('upperFirst', require('../upperFirst'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./overArgs');
var convert = require('./convert');
module.exports = convert(require('../util'));
var convert = require('./convert'),
    func = convert('value', require('../value'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('valueOf', require('../valueOf'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('values', require('../values'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('valuesIn', require('../valuesIn'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./conformsTo');
module.exports = require('./isMatch');
var convert = require('./convert'),
    func = convert('without', require('../without'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('words', require('../words'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('wrap', require('../wrap'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('wrapperAt', require('../wrapperAt'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('wrapperChain', require('../wrapperChain'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('wrapperLodash', require('../wrapperLodash'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('wrapperReverse', require('../wrapperReverse'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('wrapperValue', require('../wrapperValue'), require('./_falseOptions'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('xor', require('../xor'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('xorBy', require('../xorBy'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('xorWith', require('../xorWith'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('zip', require('../zip'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('zipAll', require('../zip'));

func.placeholder = require('./placeholder');
module.exports = func;
module.exports = require('./zipObject');
var convert = require('./convert'),
    func = convert('zipObject', require('../zipObject'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('zipObjectDeep', require('../zipObjectDeep'));

func.placeholder = require('./placeholder');
module.exports = func;
var convert = require('./convert'),
    func = convert('zipWith', require('../zipWith'));

func.placeholder = require('./placeholder');
module.exports = func;
Copyright jQuery Foundation and other contributors <https://jquery.org/>

Based on Underscore.js, copyright Jeremy Ashkenas,
DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>

This software consists of voluntary contributions made by many
individuals. For exact contribution history, see the revision history
available at https://github.com/lodash/lodash

The following license applies to all parts of this software except as
documented below:

====

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.

====

Copyright and related rights for sample code are waived via CC0. Sample
code is defined as all source code displayed within the prose of the
documentation.

CC0: http://creativecommons.org/publicdomain/zero/1.0/

====

Files located in the node_modules and vendor directories are externally
maintained libraries used by this software which have their own
licenses; we recommend you read them, as their terms may differ from the
terms above.
/**
 * lodash (Custom Build) <https://lodash.com/>
 * Build: `lodash modularize exports="npm" -o ./`
 * Copyright jQuery Foundation and other contributors <https://jquery.org/>
 * Released under MIT license <https://lodash.com/license>
 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
 */

/** Used as references for various `Number` constants. */
var INFINITY = 1 / 0;

/** `Object#toString` result references. */
var symbolTag = '[object Symbol]';

/**
 * Used to match `RegExp`
 * [syntax characters](http://ecma-international.org/ecma-262/6.0/#sec-patterns).
 */
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g,
    reHasRegExpChar = RegExp(reRegExpChar.source);

/** Detect free variable `global` from Node.js. */
var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;

/** Detect free variable `self`. */
var freeSelf = typeof self == 'object' && self && self.Object === Object && self;

/** Used as a reference to the global object. */
var root = freeGlobal || freeSelf || Function('return this')();

/** Used for built-in method references. */
var objectProto = Object.prototype;

/**
 * Used to resolve the
 * [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
 * of values.
 */
var objectToString = objectProto.toString;

/** Built-in value references. */
var Symbol = root.Symbol;

/** Used to convert symbols to primitives and strings. */
var symbolProto = Symbol ? Symbol.prototype : undefined,
    symbolToString = symbolProto ? symbolProto.toString : undefined;

/**
 * The base implementation of `_.toString` which doesn't convert nullish
 * values to empty strings.
 *
 * @private
 * @param {*} value The value to process.
 * @returns {string} Returns the string.
 */
function baseToString(value) {
  // Exit early for strings to avoid a performance hit in some environments.
  if (typeof value == 'string') {
    return value;
  }
  if (isSymbol(value)) {
    return symbolToString ? symbolToString.call(value) : '';
  }
  var result = (value + '');
  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
}

/**
 * Checks if `value` is object-like. A value is object-like if it's not `null`
 * and has a `typeof` result of "object".
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
 * @example
 *
 * _.isObjectLike({});
 * // => true
 *
 * _.isObjectLike([1, 2, 3]);
 * // => true
 *
 * _.isObjectLike(_.noop);
 * // => false
 *
 * _.isObjectLike(null);
 * // => false
 */
function isObjectLike(value) {
  return !!value && typeof value == 'object';
}

/**
 * Checks if `value` is classified as a `Symbol` primitive or object.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
 * @example
 *
 * _.isSymbol(Symbol.iterator);
 * // => true
 *
 * _.isSymbol('abc');
 * // => false
 */
function isSymbol(value) {
  return typeof value == 'symbol' ||
    (isObjectLike(value) && objectToString.call(value) == symbolTag);
}

/**
 * Converts `value` to a string. An empty string is returned for `null`
 * and `undefined` values. The sign of `-0` is preserved.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to process.
 * @returns {string} Returns the string.
 * @example
 *
 * _.toString(null);
 * // => ''
 *
 * _.toString(-0);
 * // => '-0'
 *
 * _.toString([1, 2, 3]);
 * // => '1,2,3'
 */
function toString(value) {
  return value == null ? '' : baseToString(value);
}

/**
 * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+",
 * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category String
 * @param {string} [string=''] The string to escape.
 * @returns {string} Returns the escaped string.
 * @example
 *
 * _.escapeRegExp('[lodash](https://lodash.com/)');
 * // => '\[lodash\]\(https://lodash\.com/\)'
 */
function escapeRegExp(string) {
  string = toString(string);
  return (string && reHasRegExpChar.test(string))
    ? string.replace(reRegExpChar, '\\$&')
    : string;
}

module.exports = escapeRegExp;
{
  "name": "lodash.escaperegexp",
  "version": "4.1.2",
  "description": "The lodash method `_.escapeRegExp` exported as a module.",
  "homepage": "https://lodash.com/",
  "icon": "https://lodash.com/icon.svg",
  "license": "MIT",
  "author": "John-David Dalton <john.david.dalton@gmail.com> (http://allyoucanleet.com/)",
  "repository": "lodash/lodash"
}Copyright jQuery Foundation and other contributors <https://jquery.org/>

Based on Underscore.js, copyright Jeremy Ashkenas,
DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>

This software consists of voluntary contributions made by many
individuals. For exact contribution history, see the revision history
available at https://github.com/lodash/lodash

The following license applies to all parts of this software except as
documented below:

====

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.

====

Copyright and related rights for sample code are waived via CC0. Sample
code is defined as all source code displayed within the prose of the
documentation.

CC0: http://creativecommons.org/publicdomain/zero/1.0/

====

Files located in the node_modules and vendor directories are externally
maintained libraries used by this software which have their own
licenses; we recommend you read them, as their terms may differ from the
terms above.
/**
 * lodash (Custom Build) <https://lodash.com/>
 * Build: `lodash modularize exports="npm" -o ./`
 * Copyright jQuery Foundation and other contributors <https://jquery.org/>
 * Released under MIT license <https://lodash.com/license>
 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
 */

/** Used as references for various `Number` constants. */
var INFINITY = 1 / 0,
    MAX_SAFE_INTEGER = 9007199254740991,
    MAX_INTEGER = 1.7976931348623157e+308,
    NAN = 0 / 0;

/** `Object#toString` result references. */
var argsTag = '[object Arguments]',
    funcTag = '[object Function]',
    genTag = '[object GeneratorFunction]',
    stringTag = '[object String]',
    symbolTag = '[object Symbol]';

/** Used to match leading and trailing whitespace. */
var reTrim = /^\s+|\s+$/g;

/** Used to detect bad signed hexadecimal string values. */
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;

/** Used to detect binary string values. */
var reIsBinary = /^0b[01]+$/i;

/** Used to detect octal string values. */
var reIsOctal = /^0o[0-7]+$/i;

/** Used to detect unsigned integer values. */
var reIsUint = /^(?:0|[1-9]\d*)$/;

/** Built-in method references without a dependency on `root`. */
var freeParseInt = parseInt;

/**
 * A specialized version of `_.map` for arrays without support for iteratee
 * shorthands.
 *
 * @private
 * @param {Array} [array] The array to iterate over.
 * @param {Function} iteratee The function invoked per iteration.
 * @returns {Array} Returns the new mapped array.
 */
function arrayMap(array, iteratee) {
  var index = -1,
      length = array ? array.length : 0,
      result = Array(length);

  while (++index < length) {
    result[index] = iteratee(array[index], index, array);
  }
  return result;
}

/**
 * The base implementation of `_.findIndex` and `_.findLastIndex` without
 * support for iteratee shorthands.
 *
 * @private
 * @param {Array} array The array to inspect.
 * @param {Function} predicate The function invoked per iteration.
 * @param {number} fromIndex The index to search from.
 * @param {boolean} [fromRight] Specify iterating from right to left.
 * @returns {number} Returns the index of the matched value, else `-1`.
 */
function baseFindIndex(array, predicate, fromIndex, fromRight) {
  var length = array.length,
      index = fromIndex + (fromRight ? 1 : -1);

  while ((fromRight ? index-- : ++index < length)) {
    if (predicate(array[index], index, array)) {
      return index;
    }
  }
  return -1;
}

/**
 * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
 *
 * @private
 * @param {Array} array The array to inspect.
 * @param {*} value The value to search for.
 * @param {number} fromIndex The index to search from.
 * @returns {number} Returns the index of the matched value, else `-1`.
 */
function baseIndexOf(array, value, fromIndex) {
  if (value !== value) {
    return baseFindIndex(array, baseIsNaN, fromIndex);
  }
  var index = fromIndex - 1,
      length = array.length;

  while (++index < length) {
    if (array[index] === value) {
      return index;
    }
  }
  return -1;
}

/**
 * The base implementation of `_.isNaN` without support for number objects.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
 */
function baseIsNaN(value) {
  return value !== value;
}

/**
 * The base implementation of `_.times` without support for iteratee shorthands
 * or max array length checks.
 *
 * @private
 * @param {number} n The number of times to invoke `iteratee`.
 * @param {Function} iteratee The function invoked per iteration.
 * @returns {Array} Returns the array of results.
 */
function baseTimes(n, iteratee) {
  var index = -1,
      result = Array(n);

  while (++index < n) {
    result[index] = iteratee(index);
  }
  return result;
}

/**
 * The base implementation of `_.values` and `_.valuesIn` which creates an
 * array of `object` property values corresponding to the property names
 * of `props`.
 *
 * @private
 * @param {Object} object The object to query.
 * @param {Array} props The property names to get values for.
 * @returns {Object} Returns the array of property values.
 */
function baseValues(object, props) {
  return arrayMap(props, function(key) {
    return object[key];
  });
}

/**
 * Creates a unary function that invokes `func` with its argument transformed.
 *
 * @private
 * @param {Function} func The function to wrap.
 * @param {Function} transform The argument transform.
 * @returns {Function} Returns the new function.
 */
function overArg(func, transform) {
  return function(arg) {
    return func(transform(arg));
  };
}

/** Used for built-in method references. */
var objectProto = Object.prototype;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/**
 * Used to resolve the
 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
 * of values.
 */
var objectToString = objectProto.toString;

/** Built-in value references. */
var propertyIsEnumerable = objectProto.propertyIsEnumerable;

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeKeys = overArg(Object.keys, Object),
    nativeMax = Math.max;

/**
 * Creates an array of the enumerable property names of the array-like `value`.
 *
 * @private
 * @param {*} value The value to query.
 * @param {boolean} inherited Specify returning inherited property names.
 * @returns {Array} Returns the array of property names.
 */
function arrayLikeKeys(value, inherited) {
  // Safari 8.1 makes `arguments.callee` enumerable in strict mode.
  // Safari 9 makes `arguments.length` enumerable in strict mode.
  var result = (isArray(value) || isArguments(value))
    ? baseTimes(value.length, String)
    : [];

  var length = result.length,
      skipIndexes = !!length;

  for (var key in value) {
    if ((inherited || hasOwnProperty.call(value, key)) &&
        !(skipIndexes && (key == 'length' || isIndex(key, length)))) {
      result.push(key);
    }
  }
  return result;
}

/**
 * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
 *
 * @private
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of property names.
 */
function baseKeys(object) {
  if (!isPrototype(object)) {
    return nativeKeys(object);
  }
  var result = [];
  for (var key in Object(object)) {
    if (hasOwnProperty.call(object, key) && key != 'constructor') {
      result.push(key);
    }
  }
  return result;
}

/**
 * Checks if `value` is a valid array-like index.
 *
 * @private
 * @param {*} value The value to check.
 * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
 * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
 */
function isIndex(value, length) {
  length = length == null ? MAX_SAFE_INTEGER : length;
  return !!length &&
    (typeof value == 'number' || reIsUint.test(value)) &&
    (value > -1 && value % 1 == 0 && value < length);
}

/**
 * Checks if `value` is likely a prototype object.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
 */
function isPrototype(value) {
  var Ctor = value && value.constructor,
      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;

  return value === proto;
}

/**
 * Checks if `value` is in `collection`. If `collection` is a string, it's
 * checked for a substring of `value`, otherwise
 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
 * is used for equality comparisons. If `fromIndex` is negative, it's used as
 * the offset from the end of `collection`.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Collection
 * @param {Array|Object|string} collection The collection to inspect.
 * @param {*} value The value to search for.
 * @param {number} [fromIndex=0] The index to search from.
 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
 * @returns {boolean} Returns `true` if `value` is found, else `false`.
 * @example
 *
 * _.includes([1, 2, 3], 1);
 * // => true
 *
 * _.includes([1, 2, 3], 1, 2);
 * // => false
 *
 * _.includes({ 'a': 1, 'b': 2 }, 1);
 * // => true
 *
 * _.includes('abcd', 'bc');
 * // => true
 */
function includes(collection, value, fromIndex, guard) {
  collection = isArrayLike(collection) ? collection : values(collection);
  fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;

  var length = collection.length;
  if (fromIndex < 0) {
    fromIndex = nativeMax(length + fromIndex, 0);
  }
  return isString(collection)
    ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
    : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
}

/**
 * Checks if `value` is likely an `arguments` object.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an `arguments` object,
 *  else `false`.
 * @example
 *
 * _.isArguments(function() { return arguments; }());
 * // => true
 *
 * _.isArguments([1, 2, 3]);
 * // => false
 */
function isArguments(value) {
  // Safari 8.1 makes `arguments.callee` enumerable in strict mode.
  return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&
    (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);
}

/**
 * Checks if `value` is classified as an `Array` object.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an array, else `false`.
 * @example
 *
 * _.isArray([1, 2, 3]);
 * // => true
 *
 * _.isArray(document.body.children);
 * // => false
 *
 * _.isArray('abc');
 * // => false
 *
 * _.isArray(_.noop);
 * // => false
 */
var isArray = Array.isArray;

/**
 * Checks if `value` is array-like. A value is considered array-like if it's
 * not a function and has a `value.length` that's an integer greater than or
 * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
 * @example
 *
 * _.isArrayLike([1, 2, 3]);
 * // => true
 *
 * _.isArrayLike(document.body.children);
 * // => true
 *
 * _.isArrayLike('abc');
 * // => true
 *
 * _.isArrayLike(_.noop);
 * // => false
 */
function isArrayLike(value) {
  return value != null && isLength(value.length) && !isFunction(value);
}

/**
 * This method is like `_.isArrayLike` except that it also checks if `value`
 * is an object.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an array-like object,
 *  else `false`.
 * @example
 *
 * _.isArrayLikeObject([1, 2, 3]);
 * // => true
 *
 * _.isArrayLikeObject(document.body.children);
 * // => true
 *
 * _.isArrayLikeObject('abc');
 * // => false
 *
 * _.isArrayLikeObject(_.noop);
 * // => false
 */
function isArrayLikeObject(value) {
  return isObjectLike(value) && isArrayLike(value);
}

/**
 * Checks if `value` is classified as a `Function` object.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a function, else `false`.
 * @example
 *
 * _.isFunction(_);
 * // => true
 *
 * _.isFunction(/abc/);
 * // => false
 */
function isFunction(value) {
  // The use of `Object#toString` avoids issues with the `typeof` operator
  // in Safari 8-9 which returns 'object' for typed array and other constructors.
  var tag = isObject(value) ? objectToString.call(value) : '';
  return tag == funcTag || tag == genTag;
}

/**
 * Checks if `value` is a valid array-like length.
 *
 * **Note:** This method is loosely based on
 * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
 * @example
 *
 * _.isLength(3);
 * // => true
 *
 * _.isLength(Number.MIN_VALUE);
 * // => false
 *
 * _.isLength(Infinity);
 * // => false
 *
 * _.isLength('3');
 * // => false
 */
function isLength(value) {
  return typeof value == 'number' &&
    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
}

/**
 * Checks if `value` is the
 * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
 * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an object, else `false`.
 * @example
 *
 * _.isObject({});
 * // => true
 *
 * _.isObject([1, 2, 3]);
 * // => true
 *
 * _.isObject(_.noop);
 * // => true
 *
 * _.isObject(null);
 * // => false
 */
function isObject(value) {
  var type = typeof value;
  return !!value && (type == 'object' || type == 'function');
}

/**
 * Checks if `value` is object-like. A value is object-like if it's not `null`
 * and has a `typeof` result of "object".
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
 * @example
 *
 * _.isObjectLike({});
 * // => true
 *
 * _.isObjectLike([1, 2, 3]);
 * // => true
 *
 * _.isObjectLike(_.noop);
 * // => false
 *
 * _.isObjectLike(null);
 * // => false
 */
function isObjectLike(value) {
  return !!value && typeof value == 'object';
}

/**
 * Checks if `value` is classified as a `String` primitive or object.
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a string, else `false`.
 * @example
 *
 * _.isString('abc');
 * // => true
 *
 * _.isString(1);
 * // => false
 */
function isString(value) {
  return typeof value == 'string' ||
    (!isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag);
}

/**
 * Checks if `value` is classified as a `Symbol` primitive or object.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
 * @example
 *
 * _.isSymbol(Symbol.iterator);
 * // => true
 *
 * _.isSymbol('abc');
 * // => false
 */
function isSymbol(value) {
  return typeof value == 'symbol' ||
    (isObjectLike(value) && objectToString.call(value) == symbolTag);
}

/**
 * Converts `value` to a finite number.
 *
 * @static
 * @memberOf _
 * @since 4.12.0
 * @category Lang
 * @param {*} value The value to convert.
 * @returns {number} Returns the converted number.
 * @example
 *
 * _.toFinite(3.2);
 * // => 3.2
 *
 * _.toFinite(Number.MIN_VALUE);
 * // => 5e-324
 *
 * _.toFinite(Infinity);
 * // => 1.7976931348623157e+308
 *
 * _.toFinite('3.2');
 * // => 3.2
 */
function toFinite(value) {
  if (!value) {
    return value === 0 ? value : 0;
  }
  value = toNumber(value);
  if (value === INFINITY || value === -INFINITY) {
    var sign = (value < 0 ? -1 : 1);
    return sign * MAX_INTEGER;
  }
  return value === value ? value : 0;
}

/**
 * Converts `value` to an integer.
 *
 * **Note:** This method is loosely based on
 * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to convert.
 * @returns {number} Returns the converted integer.
 * @example
 *
 * _.toInteger(3.2);
 * // => 3
 *
 * _.toInteger(Number.MIN_VALUE);
 * // => 0
 *
 * _.toInteger(Infinity);
 * // => 1.7976931348623157e+308
 *
 * _.toInteger('3.2');
 * // => 3
 */
function toInteger(value) {
  var result = toFinite(value),
      remainder = result % 1;

  return result === result ? (remainder ? result - remainder : result) : 0;
}

/**
 * Converts `value` to a number.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to process.
 * @returns {number} Returns the number.
 * @example
 *
 * _.toNumber(3.2);
 * // => 3.2
 *
 * _.toNumber(Number.MIN_VALUE);
 * // => 5e-324
 *
 * _.toNumber(Infinity);
 * // => Infinity
 *
 * _.toNumber('3.2');
 * // => 3.2
 */
function toNumber(value) {
  if (typeof value == 'number') {
    return value;
  }
  if (isSymbol(value)) {
    return NAN;
  }
  if (isObject(value)) {
    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
    value = isObject(other) ? (other + '') : other;
  }
  if (typeof value != 'string') {
    return value === 0 ? value : +value;
  }
  value = value.replace(reTrim, '');
  var isBinary = reIsBinary.test(value);
  return (isBinary || reIsOctal.test(value))
    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
    : (reIsBadHex.test(value) ? NAN : +value);
}

/**
 * Creates an array of the own enumerable property names of `object`.
 *
 * **Note:** Non-object values are coerced to objects. See the
 * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
 * for more details.
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category Object
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of property names.
 * @example
 *
 * function Foo() {
 *   this.a = 1;
 *   this.b = 2;
 * }
 *
 * Foo.prototype.c = 3;
 *
 * _.keys(new Foo);
 * // => ['a', 'b'] (iteration order is not guaranteed)
 *
 * _.keys('hi');
 * // => ['0', '1']
 */
function keys(object) {
  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
}

/**
 * Creates an array of the own enumerable string keyed property values of `object`.
 *
 * **Note:** Non-object values are coerced to objects.
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category Object
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of property values.
 * @example
 *
 * function Foo() {
 *   this.a = 1;
 *   this.b = 2;
 * }
 *
 * Foo.prototype.c = 3;
 *
 * _.values(new Foo);
 * // => [1, 2] (iteration order is not guaranteed)
 *
 * _.values('hi');
 * // => ['h', 'i']
 */
function values(object) {
  return object ? baseValues(object, keys(object)) : [];
}

module.exports = includes;
{
  "name": "lodash.includes",
  "version": "4.3.0",
  "description": "The lodash method `_.includes` exported as a module.",
  "homepage": "https://lodash.com/",
  "icon": "https://lodash.com/icon.svg",
  "license": "MIT",
  "author": "John-David Dalton <john.david.dalton@gmail.com> (http://allyoucanleet.com/)",
  "repository": "lodash/lodash"
}Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/>
Based on Underscore.js, copyright 2009-2016 Jeremy Ashkenas,
DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>

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.
/**
 * lodash 3.0.3 (Custom Build) <https://lodash.com/>
 * Build: `lodash modularize exports="npm" -o ./`
 * Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/>
 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
 * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
 * Available under MIT license <https://lodash.com/license>
 */

/** `Object#toString` result references. */
var boolTag = '[object Boolean]';

/** Used for built-in method references. */
var objectProto = Object.prototype;

/**
 * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
 * of values.
 */
var objectToString = objectProto.toString;

/**
 * Checks if `value` is classified as a boolean primitive or object.
 *
 * @static
 * @memberOf _
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
 * @example
 *
 * _.isBoolean(false);
 * // => true
 *
 * _.isBoolean(null);
 * // => false
 */
function isBoolean(value) {
  return value === true || value === false ||
    (isObjectLike(value) && objectToString.call(value) == boolTag);
}

/**
 * Checks if `value` is object-like. A value is object-like if it's not `null`
 * and has a `typeof` result of "object".
 *
 * @static
 * @memberOf _
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
 * @example
 *
 * _.isObjectLike({});
 * // => true
 *
 * _.isObjectLike([1, 2, 3]);
 * // => true
 *
 * _.isObjectLike(_.noop);
 * // => false
 *
 * _.isObjectLike(null);
 * // => false
 */
function isObjectLike(value) {
  return !!value && typeof value == 'object';
}

module.exports = isBoolean;
{
  "name": "lodash.isboolean",
  "version": "3.0.3",
  "description": "The lodash method `_.isBoolean` exported as a module.",
  "homepage": "https://lodash.com/",
  "icon": "https://lodash.com/icon.svg",
  "license": "MIT",
  "author": "John-David Dalton <john.david.dalton@gmail.com> (http://allyoucanleet.com/)",
  "repository": "lodash/lodash"
}Copyright JS Foundation and other contributors <https://js.foundation/>

Based on Underscore.js, copyright Jeremy Ashkenas,
DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>

This software consists of voluntary contributions made by many
individuals. For exact contribution history, see the revision history
available at https://github.com/lodash/lodash

The following license applies to all parts of this software except as
documented below:

====

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.

====

Copyright and related rights for sample code are waived via CC0. Sample
code is defined as all source code displayed within the prose of the
documentation.

CC0: http://creativecommons.org/publicdomain/zero/1.0/

====

Files located in the node_modules and vendor directories are externally
maintained libraries used by this software which have their own
licenses; we recommend you read them, as their terms may differ from the
terms above.
/**
 * Lodash (Custom Build) <https://lodash.com/>
 * Build: `lodash modularize exports="npm" -o ./`
 * Copyright JS Foundation and other contributors <https://js.foundation/>
 * Released under MIT license <https://lodash.com/license>
 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
 */

/** Used as the size to enable large array optimizations. */
var LARGE_ARRAY_SIZE = 200;

/** Used to stand-in for `undefined` hash values. */
var HASH_UNDEFINED = '__lodash_hash_undefined__';

/** Used to compose bitmasks for value comparisons. */
var COMPARE_PARTIAL_FLAG = 1,
    COMPARE_UNORDERED_FLAG = 2;

/** Used as references for various `Number` constants. */
var MAX_SAFE_INTEGER = 9007199254740991;

/** `Object#toString` result references. */
var argsTag = '[object Arguments]',
    arrayTag = '[object Array]',
    asyncTag = '[object AsyncFunction]',
    boolTag = '[object Boolean]',
    dateTag = '[object Date]',
    errorTag = '[object Error]',
    funcTag = '[object Function]',
    genTag = '[object GeneratorFunction]',
    mapTag = '[object Map]',
    numberTag = '[object Number]',
    nullTag = '[object Null]',
    objectTag = '[object Object]',
    promiseTag = '[object Promise]',
    proxyTag = '[object Proxy]',
    regexpTag = '[object RegExp]',
    setTag = '[object Set]',
    stringTag = '[object String]',
    symbolTag = '[object Symbol]',
    undefinedTag = '[object Undefined]',
    weakMapTag = '[object WeakMap]';

var arrayBufferTag = '[object ArrayBuffer]',
    dataViewTag = '[object DataView]',
    float32Tag = '[object Float32Array]',
    float64Tag = '[object Float64Array]',
    int8Tag = '[object Int8Array]',
    int16Tag = '[object Int16Array]',
    int32Tag = '[object Int32Array]',
    uint8Tag = '[object Uint8Array]',
    uint8ClampedTag = '[object Uint8ClampedArray]',
    uint16Tag = '[object Uint16Array]',
    uint32Tag = '[object Uint32Array]';

/**
 * Used to match `RegExp`
 * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
 */
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;

/** Used to detect host constructors (Safari). */
var reIsHostCtor = /^\[object .+?Constructor\]$/;

/** Used to detect unsigned integer values. */
var reIsUint = /^(?:0|[1-9]\d*)$/;

/** Used to identify `toStringTag` values of typed arrays. */
var typedArrayTags = {};
typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
typedArrayTags[uint32Tag] = true;
typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
typedArrayTags[errorTag] = typedArrayTags[funcTag] =
typedArrayTags[mapTag] = typedArrayTags[numberTag] =
typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
typedArrayTags[setTag] = typedArrayTags[stringTag] =
typedArrayTags[weakMapTag] = false;

/** Detect free variable `global` from Node.js. */
var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;

/** Detect free variable `self`. */
var freeSelf = typeof self == 'object' && self && self.Object === Object && self;

/** Used as a reference to the global object. */
var root = freeGlobal || freeSelf || Function('return this')();

/** Detect free variable `exports`. */
var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;

/** Detect free variable `module`. */
var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;

/** Detect the popular CommonJS extension `module.exports`. */
var moduleExports = freeModule && freeModule.exports === freeExports;

/** Detect free variable `process` from Node.js. */
var freeProcess = moduleExports && freeGlobal.process;

/** Used to access faster Node.js helpers. */
var nodeUtil = (function() {
  try {
    return freeProcess && freeProcess.binding && freeProcess.binding('util');
  } catch (e) {}
}());

/* Node.js helper references. */
var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;

/**
 * A specialized version of `_.filter` for arrays without support for
 * iteratee shorthands.
 *
 * @private
 * @param {Array} [array] The array to iterate over.
 * @param {Function} predicate The function invoked per iteration.
 * @returns {Array} Returns the new filtered array.
 */
function arrayFilter(array, predicate) {
  var index = -1,
      length = array == null ? 0 : array.length,
      resIndex = 0,
      result = [];

  while (++index < length) {
    var value = array[index];
    if (predicate(value, index, array)) {
      result[resIndex++] = value;
    }
  }
  return result;
}

/**
 * Appends the elements of `values` to `array`.
 *
 * @private
 * @param {Array} array The array to modify.
 * @param {Array} values The values to append.
 * @returns {Array} Returns `array`.
 */
function arrayPush(array, values) {
  var index = -1,
      length = values.length,
      offset = array.length;

  while (++index < length) {
    array[offset + index] = values[index];
  }
  return array;
}

/**
 * A specialized version of `_.some` for arrays without support for iteratee
 * shorthands.
 *
 * @private
 * @param {Array} [array] The array to iterate over.
 * @param {Function} predicate The function invoked per iteration.
 * @returns {boolean} Returns `true` if any element passes the predicate check,
 *  else `false`.
 */
function arraySome(array, predicate) {
  var index = -1,
      length = array == null ? 0 : array.length;

  while (++index < length) {
    if (predicate(array[index], index, array)) {
      return true;
    }
  }
  return false;
}

/**
 * The base implementation of `_.times` without support for iteratee shorthands
 * or max array length checks.
 *
 * @private
 * @param {number} n The number of times to invoke `iteratee`.
 * @param {Function} iteratee The function invoked per iteration.
 * @returns {Array} Returns the array of results.
 */
function baseTimes(n, iteratee) {
  var index = -1,
      result = Array(n);

  while (++index < n) {
    result[index] = iteratee(index);
  }
  return result;
}

/**
 * The base implementation of `_.unary` without support for storing metadata.
 *
 * @private
 * @param {Function} func The function to cap arguments for.
 * @returns {Function} Returns the new capped function.
 */
function baseUnary(func) {
  return function(value) {
    return func(value);
  };
}

/**
 * Checks if a `cache` value for `key` exists.
 *
 * @private
 * @param {Object} cache The cache to query.
 * @param {string} key The key of the entry to check.
 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
 */
function cacheHas(cache, key) {
  return cache.has(key);
}

/**
 * Gets the value at `key` of `object`.
 *
 * @private
 * @param {Object} [object] The object to query.
 * @param {string} key The key of the property to get.
 * @returns {*} Returns the property value.
 */
function getValue(object, key) {
  return object == null ? undefined : object[key];
}

/**
 * Converts `map` to its key-value pairs.
 *
 * @private
 * @param {Object} map The map to convert.
 * @returns {Array} Returns the key-value pairs.
 */
function mapToArray(map) {
  var index = -1,
      result = Array(map.size);

  map.forEach(function(value, key) {
    result[++index] = [key, value];
  });
  return result;
}

/**
 * Creates a unary function that invokes `func` with its argument transformed.
 *
 * @private
 * @param {Function} func The function to wrap.
 * @param {Function} transform The argument transform.
 * @returns {Function} Returns the new function.
 */
function overArg(func, transform) {
  return function(arg) {
    return func(transform(arg));
  };
}

/**
 * Converts `set` to an array of its values.
 *
 * @private
 * @param {Object} set The set to convert.
 * @returns {Array} Returns the values.
 */
function setToArray(set) {
  var index = -1,
      result = Array(set.size);

  set.forEach(function(value) {
    result[++index] = value;
  });
  return result;
}

/** Used for built-in method references. */
var arrayProto = Array.prototype,
    funcProto = Function.prototype,
    objectProto = Object.prototype;

/** Used to detect overreaching core-js shims. */
var coreJsData = root['__core-js_shared__'];

/** Used to resolve the decompiled source of functions. */
var funcToString = funcProto.toString;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/** Used to detect methods masquerading as native. */
var maskSrcKey = (function() {
  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
  return uid ? ('Symbol(src)_1.' + uid) : '';
}());

/**
 * Used to resolve the
 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
 * of values.
 */
var nativeObjectToString = objectProto.toString;

/** Used to detect if a method is native. */
var reIsNative = RegExp('^' +
  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
  .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
);

/** Built-in value references. */
var Buffer = moduleExports ? root.Buffer : undefined,
    Symbol = root.Symbol,
    Uint8Array = root.Uint8Array,
    propertyIsEnumerable = objectProto.propertyIsEnumerable,
    splice = arrayProto.splice,
    symToStringTag = Symbol ? Symbol.toStringTag : undefined;

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeGetSymbols = Object.getOwnPropertySymbols,
    nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,
    nativeKeys = overArg(Object.keys, Object);

/* Built-in method references that are verified to be native. */
var DataView = getNative(root, 'DataView'),
    Map = getNative(root, 'Map'),
    Promise = getNative(root, 'Promise'),
    Set = getNative(root, 'Set'),
    WeakMap = getNative(root, 'WeakMap'),
    nativeCreate = getNative(Object, 'create');

/** Used to detect maps, sets, and weakmaps. */
var dataViewCtorString = toSource(DataView),
    mapCtorString = toSource(Map),
    promiseCtorString = toSource(Promise),
    setCtorString = toSource(Set),
    weakMapCtorString = toSource(WeakMap);

/** Used to convert symbols to primitives and strings. */
var symbolProto = Symbol ? Symbol.prototype : undefined,
    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;

/**
 * Creates a hash object.
 *
 * @private
 * @constructor
 * @param {Array} [entries] The key-value pairs to cache.
 */
function Hash(entries) {
  var index = -1,
      length = entries == null ? 0 : entries.length;

  this.clear();
  while (++index < length) {
    var entry = entries[index];
    this.set(entry[0], entry[1]);
  }
}

/**
 * Removes all key-value entries from the hash.
 *
 * @private
 * @name clear
 * @memberOf Hash
 */
function hashClear() {
  this.__data__ = nativeCreate ? nativeCreate(null) : {};
  this.size = 0;
}

/**
 * Removes `key` and its value from the hash.
 *
 * @private
 * @name delete
 * @memberOf Hash
 * @param {Object} hash The hash to modify.
 * @param {string} key The key of the value to remove.
 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
 */
function hashDelete(key) {
  var result = this.has(key) && delete this.__data__[key];
  this.size -= result ? 1 : 0;
  return result;
}

/**
 * Gets the hash value for `key`.
 *
 * @private
 * @name get
 * @memberOf Hash
 * @param {string} key The key of the value to get.
 * @returns {*} Returns the entry value.
 */
function hashGet(key) {
  var data = this.__data__;
  if (nativeCreate) {
    var result = data[key];
    return result === HASH_UNDEFINED ? undefined : result;
  }
  return hasOwnProperty.call(data, key) ? data[key] : undefined;
}

/**
 * Checks if a hash value for `key` exists.
 *
 * @private
 * @name has
 * @memberOf Hash
 * @param {string} key The key of the entry to check.
 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
 */
function hashHas(key) {
  var data = this.__data__;
  return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);
}

/**
 * Sets the hash `key` to `value`.
 *
 * @private
 * @name set
 * @memberOf Hash
 * @param {string} key The key of the value to set.
 * @param {*} value The value to set.
 * @returns {Object} Returns the hash instance.
 */
function hashSet(key, value) {
  var data = this.__data__;
  this.size += this.has(key) ? 0 : 1;
  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
  return this;
}

// Add methods to `Hash`.
Hash.prototype.clear = hashClear;
Hash.prototype['delete'] = hashDelete;
Hash.prototype.get = hashGet;
Hash.prototype.has = hashHas;
Hash.prototype.set = hashSet;

/**
 * Creates an list cache object.
 *
 * @private
 * @constructor
 * @param {Array} [entries] The key-value pairs to cache.
 */
function ListCache(entries) {
  var index = -1,
      length = entries == null ? 0 : entries.length;

  this.clear();
  while (++index < length) {
    var entry = entries[index];
    this.set(entry[0], entry[1]);
  }
}

/**
 * Removes all key-value entries from the list cache.
 *
 * @private
 * @name clear
 * @memberOf ListCache
 */
function listCacheClear() {
  this.__data__ = [];
  this.size = 0;
}

/**
 * Removes `key` and its value from the list cache.
 *
 * @private
 * @name delete
 * @memberOf ListCache
 * @param {string} key The key of the value to remove.
 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
 */
function listCacheDelete(key) {
  var data = this.__data__,
      index = assocIndexOf(data, key);

  if (index < 0) {
    return false;
  }
  var lastIndex = data.length - 1;
  if (index == lastIndex) {
    data.pop();
  } else {
    splice.call(data, index, 1);
  }
  --this.size;
  return true;
}

/**
 * Gets the list cache value for `key`.
 *
 * @private
 * @name get
 * @memberOf ListCache
 * @param {string} key The key of the value to get.
 * @returns {*} Returns the entry value.
 */
function listCacheGet(key) {
  var data = this.__data__,
      index = assocIndexOf(data, key);

  return index < 0 ? undefined : data[index][1];
}

/**
 * Checks if a list cache value for `key` exists.
 *
 * @private
 * @name has
 * @memberOf ListCache
 * @param {string} key The key of the entry to check.
 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
 */
function listCacheHas(key) {
  return assocIndexOf(this.__data__, key) > -1;
}

/**
 * Sets the list cache `key` to `value`.
 *
 * @private
 * @name set
 * @memberOf ListCache
 * @param {string} key The key of the value to set.
 * @param {*} value The value to set.
 * @returns {Object} Returns the list cache instance.
 */
function listCacheSet(key, value) {
  var data = this.__data__,
      index = assocIndexOf(data, key);

  if (index < 0) {
    ++this.size;
    data.push([key, value]);
  } else {
    data[index][1] = value;
  }
  return this;
}

// Add methods to `ListCache`.
ListCache.prototype.clear = listCacheClear;
ListCache.prototype['delete'] = listCacheDelete;
ListCache.prototype.get = listCacheGet;
ListCache.prototype.has = listCacheHas;
ListCache.prototype.set = listCacheSet;

/**
 * Creates a map cache object to store key-value pairs.
 *
 * @private
 * @constructor
 * @param {Array} [entries] The key-value pairs to cache.
 */
function MapCache(entries) {
  var index = -1,
      length = entries == null ? 0 : entries.length;

  this.clear();
  while (++index < length) {
    var entry = entries[index];
    this.set(entry[0], entry[1]);
  }
}

/**
 * Removes all key-value entries from the map.
 *
 * @private
 * @name clear
 * @memberOf MapCache
 */
function mapCacheClear() {
  this.size = 0;
  this.__data__ = {
    'hash': new Hash,
    'map': new (Map || ListCache),
    'string': new Hash
  };
}

/**
 * Removes `key` and its value from the map.
 *
 * @private
 * @name delete
 * @memberOf MapCache
 * @param {string} key The key of the value to remove.
 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
 */
function mapCacheDelete(key) {
  var result = getMapData(this, key)['delete'](key);
  this.size -= result ? 1 : 0;
  return result;
}

/**
 * Gets the map value for `key`.
 *
 * @private
 * @name get
 * @memberOf MapCache
 * @param {string} key The key of the value to get.
 * @returns {*} Returns the entry value.
 */
function mapCacheGet(key) {
  return getMapData(this, key).get(key);
}

/**
 * Checks if a map value for `key` exists.
 *
 * @private
 * @name has
 * @memberOf MapCache
 * @param {string} key The key of the entry to check.
 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
 */
function mapCacheHas(key) {
  return getMapData(this, key).has(key);
}

/**
 * Sets the map `key` to `value`.
 *
 * @private
 * @name set
 * @memberOf MapCache
 * @param {string} key The key of the value to set.
 * @param {*} value The value to set.
 * @returns {Object} Returns the map cache instance.
 */
function mapCacheSet(key, value) {
  var data = getMapData(this, key),
      size = data.size;

  data.set(key, value);
  this.size += data.size == size ? 0 : 1;
  return this;
}

// Add methods to `MapCache`.
MapCache.prototype.clear = mapCacheClear;
MapCache.prototype['delete'] = mapCacheDelete;
MapCache.prototype.get = mapCacheGet;
MapCache.prototype.has = mapCacheHas;
MapCache.prototype.set = mapCacheSet;

/**
 *
 * Creates an array cache object to store unique values.
 *
 * @private
 * @constructor
 * @param {Array} [values] The values to cache.
 */
function SetCache(values) {
  var index = -1,
      length = values == null ? 0 : values.length;

  this.__data__ = new MapCache;
  while (++index < length) {
    this.add(values[index]);
  }
}

/**
 * Adds `value` to the array cache.
 *
 * @private
 * @name add
 * @memberOf SetCache
 * @alias push
 * @param {*} value The value to cache.
 * @returns {Object} Returns the cache instance.
 */
function setCacheAdd(value) {
  this.__data__.set(value, HASH_UNDEFINED);
  return this;
}

/**
 * Checks if `value` is in the array cache.
 *
 * @private
 * @name has
 * @memberOf SetCache
 * @param {*} value The value to search for.
 * @returns {number} Returns `true` if `value` is found, else `false`.
 */
function setCacheHas(value) {
  return this.__data__.has(value);
}

// Add methods to `SetCache`.
SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
SetCache.prototype.has = setCacheHas;

/**
 * Creates a stack cache object to store key-value pairs.
 *
 * @private
 * @constructor
 * @param {Array} [entries] The key-value pairs to cache.
 */
function Stack(entries) {
  var data = this.__data__ = new ListCache(entries);
  this.size = data.size;
}

/**
 * Removes all key-value entries from the stack.
 *
 * @private
 * @name clear
 * @memberOf Stack
 */
function stackClear() {
  this.__data__ = new ListCache;
  this.size = 0;
}

/**
 * Removes `key` and its value from the stack.
 *
 * @private
 * @name delete
 * @memberOf Stack
 * @param {string} key The key of the value to remove.
 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
 */
function stackDelete(key) {
  var data = this.__data__,
      result = data['delete'](key);

  this.size = data.size;
  return result;
}

/**
 * Gets the stack value for `key`.
 *
 * @private
 * @name get
 * @memberOf Stack
 * @param {string} key The key of the value to get.
 * @returns {*} Returns the entry value.
 */
function stackGet(key) {
  return this.__data__.get(key);
}

/**
 * Checks if a stack value for `key` exists.
 *
 * @private
 * @name has
 * @memberOf Stack
 * @param {string} key The key of the entry to check.
 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
 */
function stackHas(key) {
  return this.__data__.has(key);
}

/**
 * Sets the stack `key` to `value`.
 *
 * @private
 * @name set
 * @memberOf Stack
 * @param {string} key The key of the value to set.
 * @param {*} value The value to set.
 * @returns {Object} Returns the stack cache instance.
 */
function stackSet(key, value) {
  var data = this.__data__;
  if (data instanceof ListCache) {
    var pairs = data.__data__;
    if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
      pairs.push([key, value]);
      this.size = ++data.size;
      return this;
    }
    data = this.__data__ = new MapCache(pairs);
  }
  data.set(key, value);
  this.size = data.size;
  return this;
}

// Add methods to `Stack`.
Stack.prototype.clear = stackClear;
Stack.prototype['delete'] = stackDelete;
Stack.prototype.get = stackGet;
Stack.prototype.has = stackHas;
Stack.prototype.set = stackSet;

/**
 * Creates an array of the enumerable property names of the array-like `value`.
 *
 * @private
 * @param {*} value The value to query.
 * @param {boolean} inherited Specify returning inherited property names.
 * @returns {Array} Returns the array of property names.
 */
function arrayLikeKeys(value, inherited) {
  var isArr = isArray(value),
      isArg = !isArr && isArguments(value),
      isBuff = !isArr && !isArg && isBuffer(value),
      isType = !isArr && !isArg && !isBuff && isTypedArray(value),
      skipIndexes = isArr || isArg || isBuff || isType,
      result = skipIndexes ? baseTimes(value.length, String) : [],
      length = result.length;

  for (var key in value) {
    if ((inherited || hasOwnProperty.call(value, key)) &&
        !(skipIndexes && (
           // Safari 9 has enumerable `arguments.length` in strict mode.
           key == 'length' ||
           // Node.js 0.10 has enumerable non-index properties on buffers.
           (isBuff && (key == 'offset' || key == 'parent')) ||
           // PhantomJS 2 has enumerable non-index properties on typed arrays.
           (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
           // Skip index properties.
           isIndex(key, length)
        ))) {
      result.push(key);
    }
  }
  return result;
}

/**
 * Gets the index at which the `key` is found in `array` of key-value pairs.
 *
 * @private
 * @param {Array} array The array to inspect.
 * @param {*} key The key to search for.
 * @returns {number} Returns the index of the matched value, else `-1`.
 */
function assocIndexOf(array, key) {
  var length = array.length;
  while (length--) {
    if (eq(array[length][0], key)) {
      return length;
    }
  }
  return -1;
}

/**
 * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
 * `keysFunc` and `symbolsFunc` to get the enumerable property names and
 * symbols of `object`.
 *
 * @private
 * @param {Object} object The object to query.
 * @param {Function} keysFunc The function to get the keys of `object`.
 * @param {Function} symbolsFunc The function to get the symbols of `object`.
 * @returns {Array} Returns the array of property names and symbols.
 */
function baseGetAllKeys(object, keysFunc, symbolsFunc) {
  var result = keysFunc(object);
  return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
}

/**
 * The base implementation of `getTag` without fallbacks for buggy environments.
 *
 * @private
 * @param {*} value The value to query.
 * @returns {string} Returns the `toStringTag`.
 */
function baseGetTag(value) {
  if (value == null) {
    return value === undefined ? undefinedTag : nullTag;
  }
  return (symToStringTag && symToStringTag in Object(value))
    ? getRawTag(value)
    : objectToString(value);
}

/**
 * The base implementation of `_.isArguments`.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an `arguments` object,
 */
function baseIsArguments(value) {
  return isObjectLike(value) && baseGetTag(value) == argsTag;
}

/**
 * The base implementation of `_.isEqual` which supports partial comparisons
 * and tracks traversed objects.
 *
 * @private
 * @param {*} value The value to compare.
 * @param {*} other The other value to compare.
 * @param {boolean} bitmask The bitmask flags.
 *  1 - Unordered comparison
 *  2 - Partial comparison
 * @param {Function} [customizer] The function to customize comparisons.
 * @param {Object} [stack] Tracks traversed `value` and `other` objects.
 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
 */
function baseIsEqual(value, other, bitmask, customizer, stack) {
  if (value === other) {
    return true;
  }
  if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
    return value !== value && other !== other;
  }
  return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
}

/**
 * A specialized version of `baseIsEqual` for arrays and objects which performs
 * deep comparisons and tracks traversed objects enabling objects with circular
 * references to be compared.
 *
 * @private
 * @param {Object} object The object to compare.
 * @param {Object} other The other object to compare.
 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
 * @param {Function} customizer The function to customize comparisons.
 * @param {Function} equalFunc The function to determine equivalents of values.
 * @param {Object} [stack] Tracks traversed `object` and `other` objects.
 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
 */
function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
  var objIsArr = isArray(object),
      othIsArr = isArray(other),
      objTag = objIsArr ? arrayTag : getTag(object),
      othTag = othIsArr ? arrayTag : getTag(other);

  objTag = objTag == argsTag ? objectTag : objTag;
  othTag = othTag == argsTag ? objectTag : othTag;

  var objIsObj = objTag == objectTag,
      othIsObj = othTag == objectTag,
      isSameTag = objTag == othTag;

  if (isSameTag && isBuffer(object)) {
    if (!isBuffer(other)) {
      return false;
    }
    objIsArr = true;
    objIsObj = false;
  }
  if (isSameTag && !objIsObj) {
    stack || (stack = new Stack);
    return (objIsArr || isTypedArray(object))
      ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
      : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
  }
  if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');

    if (objIsWrapped || othIsWrapped) {
      var objUnwrapped = objIsWrapped ? object.value() : object,
          othUnwrapped = othIsWrapped ? other.value() : other;

      stack || (stack = new Stack);
      return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
    }
  }
  if (!isSameTag) {
    return false;
  }
  stack || (stack = new Stack);
  return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
}

/**
 * The base implementation of `_.isNative` without bad shim checks.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a native function,
 *  else `false`.
 */
function baseIsNative(value) {
  if (!isObject(value) || isMasked(value)) {
    return false;
  }
  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
  return pattern.test(toSource(value));
}

/**
 * The base implementation of `_.isTypedArray` without Node.js optimizations.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
 */
function baseIsTypedArray(value) {
  return isObjectLike(value) &&
    isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
}

/**
 * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
 *
 * @private
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of property names.
 */
function baseKeys(object) {
  if (!isPrototype(object)) {
    return nativeKeys(object);
  }
  var result = [];
  for (var key in Object(object)) {
    if (hasOwnProperty.call(object, key) && key != 'constructor') {
      result.push(key);
    }
  }
  return result;
}

/**
 * A specialized version of `baseIsEqualDeep` for arrays with support for
 * partial deep comparisons.
 *
 * @private
 * @param {Array} array The array to compare.
 * @param {Array} other The other array to compare.
 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
 * @param {Function} customizer The function to customize comparisons.
 * @param {Function} equalFunc The function to determine equivalents of values.
 * @param {Object} stack Tracks traversed `array` and `other` objects.
 * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
 */
function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
      arrLength = array.length,
      othLength = other.length;

  if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
    return false;
  }
  // Assume cyclic values are equal.
  var stacked = stack.get(array);
  if (stacked && stack.get(other)) {
    return stacked == other;
  }
  var index = -1,
      result = true,
      seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;

  stack.set(array, other);
  stack.set(other, array);

  // Ignore non-index properties.
  while (++index < arrLength) {
    var arrValue = array[index],
        othValue = other[index];

    if (customizer) {
      var compared = isPartial
        ? customizer(othValue, arrValue, index, other, array, stack)
        : customizer(arrValue, othValue, index, array, other, stack);
    }
    if (compared !== undefined) {
      if (compared) {
        continue;
      }
      result = false;
      break;
    }
    // Recursively compare arrays (susceptible to call stack limits).
    if (seen) {
      if (!arraySome(other, function(othValue, othIndex) {
            if (!cacheHas(seen, othIndex) &&
                (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
              return seen.push(othIndex);
            }
          })) {
        result = false;
        break;
      }
    } else if (!(
          arrValue === othValue ||
            equalFunc(arrValue, othValue, bitmask, customizer, stack)
        )) {
      result = false;
      break;
    }
  }
  stack['delete'](array);
  stack['delete'](other);
  return result;
}

/**
 * A specialized version of `baseIsEqualDeep` for comparing objects of
 * the same `toStringTag`.
 *
 * **Note:** This function only supports comparing values with tags of
 * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
 *
 * @private
 * @param {Object} object The object to compare.
 * @param {Object} other The other object to compare.
 * @param {string} tag The `toStringTag` of the objects to compare.
 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
 * @param {Function} customizer The function to customize comparisons.
 * @param {Function} equalFunc The function to determine equivalents of values.
 * @param {Object} stack Tracks traversed `object` and `other` objects.
 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
 */
function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
  switch (tag) {
    case dataViewTag:
      if ((object.byteLength != other.byteLength) ||
          (object.byteOffset != other.byteOffset)) {
        return false;
      }
      object = object.buffer;
      other = other.buffer;

    case arrayBufferTag:
      if ((object.byteLength != other.byteLength) ||
          !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
        return false;
      }
      return true;

    case boolTag:
    case dateTag:
    case numberTag:
      // Coerce booleans to `1` or `0` and dates to milliseconds.
      // Invalid dates are coerced to `NaN`.
      return eq(+object, +other);

    case errorTag:
      return object.name == other.name && object.message == other.message;

    case regexpTag:
    case stringTag:
      // Coerce regexes to strings and treat strings, primitives and objects,
      // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
      // for more details.
      return object == (other + '');

    case mapTag:
      var convert = mapToArray;

    case setTag:
      var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
      convert || (convert = setToArray);

      if (object.size != other.size && !isPartial) {
        return false;
      }
      // Assume cyclic values are equal.
      var stacked = stack.get(object);
      if (stacked) {
        return stacked == other;
      }
      bitmask |= COMPARE_UNORDERED_FLAG;

      // Recursively compare objects (susceptible to call stack limits).
      stack.set(object, other);
      var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
      stack['delete'](object);
      return result;

    case symbolTag:
      if (symbolValueOf) {
        return symbolValueOf.call(object) == symbolValueOf.call(other);
      }
  }
  return false;
}

/**
 * A specialized version of `baseIsEqualDeep` for objects with support for
 * partial deep comparisons.
 *
 * @private
 * @param {Object} object The object to compare.
 * @param {Object} other The other object to compare.
 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
 * @param {Function} customizer The function to customize comparisons.
 * @param {Function} equalFunc The function to determine equivalents of values.
 * @param {Object} stack Tracks traversed `object` and `other` objects.
 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
 */
function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
      objProps = getAllKeys(object),
      objLength = objProps.length,
      othProps = getAllKeys(other),
      othLength = othProps.length;

  if (objLength != othLength && !isPartial) {
    return false;
  }
  var index = objLength;
  while (index--) {
    var key = objProps[index];
    if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
      return false;
    }
  }
  // Assume cyclic values are equal.
  var stacked = stack.get(object);
  if (stacked && stack.get(other)) {
    return stacked == other;
  }
  var result = true;
  stack.set(object, other);
  stack.set(other, object);

  var skipCtor = isPartial;
  while (++index < objLength) {
    key = objProps[index];
    var objValue = object[key],
        othValue = other[key];

    if (customizer) {
      var compared = isPartial
        ? customizer(othValue, objValue, key, other, object, stack)
        : customizer(objValue, othValue, key, object, other, stack);
    }
    // Recursively compare objects (susceptible to call stack limits).
    if (!(compared === undefined
          ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
          : compared
        )) {
      result = false;
      break;
    }
    skipCtor || (skipCtor = key == 'constructor');
  }
  if (result && !skipCtor) {
    var objCtor = object.constructor,
        othCtor = other.constructor;

    // Non `Object` object instances with different constructors are not equal.
    if (objCtor != othCtor &&
        ('constructor' in object && 'constructor' in other) &&
        !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
          typeof othCtor == 'function' && othCtor instanceof othCtor)) {
      result = false;
    }
  }
  stack['delete'](object);
  stack['delete'](other);
  return result;
}

/**
 * Creates an array of own enumerable property names and symbols of `object`.
 *
 * @private
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of property names and symbols.
 */
function getAllKeys(object) {
  return baseGetAllKeys(object, keys, getSymbols);
}

/**
 * Gets the data for `map`.
 *
 * @private
 * @param {Object} map The map to query.
 * @param {string} key The reference key.
 * @returns {*} Returns the map data.
 */
function getMapData(map, key) {
  var data = map.__data__;
  return isKeyable(key)
    ? data[typeof key == 'string' ? 'string' : 'hash']
    : data.map;
}

/**
 * Gets the native function at `key` of `object`.
 *
 * @private
 * @param {Object} object The object to query.
 * @param {string} key The key of the method to get.
 * @returns {*} Returns the function if it's native, else `undefined`.
 */
function getNative(object, key) {
  var value = getValue(object, key);
  return baseIsNative(value) ? value : undefined;
}

/**
 * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
 *
 * @private
 * @param {*} value The value to query.
 * @returns {string} Returns the raw `toStringTag`.
 */
function getRawTag(value) {
  var isOwn = hasOwnProperty.call(value, symToStringTag),
      tag = value[symToStringTag];

  try {
    value[symToStringTag] = undefined;
    var unmasked = true;
  } catch (e) {}

  var result = nativeObjectToString.call(value);
  if (unmasked) {
    if (isOwn) {
      value[symToStringTag] = tag;
    } else {
      delete value[symToStringTag];
    }
  }
  return result;
}

/**
 * Creates an array of the own enumerable symbols of `object`.
 *
 * @private
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of symbols.
 */
var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
  if (object == null) {
    return [];
  }
  object = Object(object);
  return arrayFilter(nativeGetSymbols(object), function(symbol) {
    return propertyIsEnumerable.call(object, symbol);
  });
};

/**
 * Gets the `toStringTag` of `value`.
 *
 * @private
 * @param {*} value The value to query.
 * @returns {string} Returns the `toStringTag`.
 */
var getTag = baseGetTag;

// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
    (Map && getTag(new Map) != mapTag) ||
    (Promise && getTag(Promise.resolve()) != promiseTag) ||
    (Set && getTag(new Set) != setTag) ||
    (WeakMap && getTag(new WeakMap) != weakMapTag)) {
  getTag = function(value) {
    var result = baseGetTag(value),
        Ctor = result == objectTag ? value.constructor : undefined,
        ctorString = Ctor ? toSource(Ctor) : '';

    if (ctorString) {
      switch (ctorString) {
        case dataViewCtorString: return dataViewTag;
        case mapCtorString: return mapTag;
        case promiseCtorString: return promiseTag;
        case setCtorString: return setTag;
        case weakMapCtorString: return weakMapTag;
      }
    }
    return result;
  };
}

/**
 * Checks if `value` is a valid array-like index.
 *
 * @private
 * @param {*} value The value to check.
 * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
 * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
 */
function isIndex(value, length) {
  length = length == null ? MAX_SAFE_INTEGER : length;
  return !!length &&
    (typeof value == 'number' || reIsUint.test(value)) &&
    (value > -1 && value % 1 == 0 && value < length);
}

/**
 * Checks if `value` is suitable for use as unique object key.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
 */
function isKeyable(value) {
  var type = typeof value;
  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
    ? (value !== '__proto__')
    : (value === null);
}

/**
 * Checks if `func` has its source masked.
 *
 * @private
 * @param {Function} func The function to check.
 * @returns {boolean} Returns `true` if `func` is masked, else `false`.
 */
function isMasked(func) {
  return !!maskSrcKey && (maskSrcKey in func);
}

/**
 * Checks if `value` is likely a prototype object.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
 */
function isPrototype(value) {
  var Ctor = value && value.constructor,
      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;

  return value === proto;
}

/**
 * Converts `value` to a string using `Object.prototype.toString`.
 *
 * @private
 * @param {*} value The value to convert.
 * @returns {string} Returns the converted string.
 */
function objectToString(value) {
  return nativeObjectToString.call(value);
}

/**
 * Converts `func` to its source code.
 *
 * @private
 * @param {Function} func The function to convert.
 * @returns {string} Returns the source code.
 */
function toSource(func) {
  if (func != null) {
    try {
      return funcToString.call(func);
    } catch (e) {}
    try {
      return (func + '');
    } catch (e) {}
  }
  return '';
}

/**
 * Performs a
 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
 * comparison between two values to determine if they are equivalent.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to compare.
 * @param {*} other The other value to compare.
 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
 * @example
 *
 * var object = { 'a': 1 };
 * var other = { 'a': 1 };
 *
 * _.eq(object, object);
 * // => true
 *
 * _.eq(object, other);
 * // => false
 *
 * _.eq('a', 'a');
 * // => true
 *
 * _.eq('a', Object('a'));
 * // => false
 *
 * _.eq(NaN, NaN);
 * // => true
 */
function eq(value, other) {
  return value === other || (value !== value && other !== other);
}

/**
 * Checks if `value` is likely an `arguments` object.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an `arguments` object,
 *  else `false`.
 * @example
 *
 * _.isArguments(function() { return arguments; }());
 * // => true
 *
 * _.isArguments([1, 2, 3]);
 * // => false
 */
var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
  return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
    !propertyIsEnumerable.call(value, 'callee');
};

/**
 * Checks if `value` is classified as an `Array` object.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an array, else `false`.
 * @example
 *
 * _.isArray([1, 2, 3]);
 * // => true
 *
 * _.isArray(document.body.children);
 * // => false
 *
 * _.isArray('abc');
 * // => false
 *
 * _.isArray(_.noop);
 * // => false
 */
var isArray = Array.isArray;

/**
 * Checks if `value` is array-like. A value is considered array-like if it's
 * not a function and has a `value.length` that's an integer greater than or
 * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
 * @example
 *
 * _.isArrayLike([1, 2, 3]);
 * // => true
 *
 * _.isArrayLike(document.body.children);
 * // => true
 *
 * _.isArrayLike('abc');
 * // => true
 *
 * _.isArrayLike(_.noop);
 * // => false
 */
function isArrayLike(value) {
  return value != null && isLength(value.length) && !isFunction(value);
}

/**
 * Checks if `value` is a buffer.
 *
 * @static
 * @memberOf _
 * @since 4.3.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
 * @example
 *
 * _.isBuffer(new Buffer(2));
 * // => true
 *
 * _.isBuffer(new Uint8Array(2));
 * // => false
 */
var isBuffer = nativeIsBuffer || stubFalse;

/**
 * Performs a deep comparison between two values to determine if they are
 * equivalent.
 *
 * **Note:** This method supports comparing arrays, array buffers, booleans,
 * date objects, error objects, maps, numbers, `Object` objects, regexes,
 * sets, strings, symbols, and typed arrays. `Object` objects are compared
 * by their own, not inherited, enumerable properties. Functions and DOM
 * nodes are compared by strict equality, i.e. `===`.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to compare.
 * @param {*} other The other value to compare.
 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
 * @example
 *
 * var object = { 'a': 1 };
 * var other = { 'a': 1 };
 *
 * _.isEqual(object, other);
 * // => true
 *
 * object === other;
 * // => false
 */
function isEqual(value, other) {
  return baseIsEqual(value, other);
}

/**
 * Checks if `value` is classified as a `Function` object.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a function, else `false`.
 * @example
 *
 * _.isFunction(_);
 * // => true
 *
 * _.isFunction(/abc/);
 * // => false
 */
function isFunction(value) {
  if (!isObject(value)) {
    return false;
  }
  // The use of `Object#toString` avoids issues with the `typeof` operator
  // in Safari 9 which returns 'object' for typed arrays and other constructors.
  var tag = baseGetTag(value);
  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
}

/**
 * Checks if `value` is a valid array-like length.
 *
 * **Note:** This method is loosely based on
 * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
 * @example
 *
 * _.isLength(3);
 * // => true
 *
 * _.isLength(Number.MIN_VALUE);
 * // => false
 *
 * _.isLength(Infinity);
 * // => false
 *
 * _.isLength('3');
 * // => false
 */
function isLength(value) {
  return typeof value == 'number' &&
    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
}

/**
 * Checks if `value` is the
 * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
 * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an object, else `false`.
 * @example
 *
 * _.isObject({});
 * // => true
 *
 * _.isObject([1, 2, 3]);
 * // => true
 *
 * _.isObject(_.noop);
 * // => true
 *
 * _.isObject(null);
 * // => false
 */
function isObject(value) {
  var type = typeof value;
  return value != null && (type == 'object' || type == 'function');
}

/**
 * Checks if `value` is object-like. A value is object-like if it's not `null`
 * and has a `typeof` result of "object".
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
 * @example
 *
 * _.isObjectLike({});
 * // => true
 *
 * _.isObjectLike([1, 2, 3]);
 * // => true
 *
 * _.isObjectLike(_.noop);
 * // => false
 *
 * _.isObjectLike(null);
 * // => false
 */
function isObjectLike(value) {
  return value != null && typeof value == 'object';
}

/**
 * Checks if `value` is classified as a typed array.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
 * @example
 *
 * _.isTypedArray(new Uint8Array);
 * // => true
 *
 * _.isTypedArray([]);
 * // => false
 */
var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;

/**
 * Creates an array of the own enumerable property names of `object`.
 *
 * **Note:** Non-object values are coerced to objects. See the
 * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
 * for more details.
 *
 * @static
 * @since 0.1.0
 * @memberOf _
 * @category Object
 * @param {Object} object The object to query.
 * @returns {Array} Returns the array of property names.
 * @example
 *
 * function Foo() {
 *   this.a = 1;
 *   this.b = 2;
 * }
 *
 * Foo.prototype.c = 3;
 *
 * _.keys(new Foo);
 * // => ['a', 'b'] (iteration order is not guaranteed)
 *
 * _.keys('hi');
 * // => ['0', '1']
 */
function keys(object) {
  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
}

/**
 * This method returns a new empty array.
 *
 * @static
 * @memberOf _
 * @since 4.13.0
 * @category Util
 * @returns {Array} Returns the new empty array.
 * @example
 *
 * var arrays = _.times(2, _.stubArray);
 *
 * console.log(arrays);
 * // => [[], []]
 *
 * console.log(arrays[0] === arrays[1]);
 * // => false
 */
function stubArray() {
  return [];
}

/**
 * This method returns `false`.
 *
 * @static
 * @memberOf _
 * @since 4.13.0
 * @category Util
 * @returns {boolean} Returns `false`.
 * @example
 *
 * _.times(2, _.stubFalse);
 * // => [false, false]
 */
function stubFalse() {
  return false;
}

module.exports = isEqual;
{
  "name": "lodash.isequal",
  "version": "4.5.0",
  "description": "The Lodash method `_.isEqual` exported as a module.",
  "homepage": "https://lodash.com/",
  "icon": "https://lodash.com/icon.svg",
  "license": "MIT",
  "author": "John-David Dalton <john.david.dalton@gmail.com> (http://allyoucanleet.com/)",
  "repository": "lodash/lodash"
}Copyright jQuery Foundation and other contributors <https://jquery.org/>

Based on Underscore.js, copyright Jeremy Ashkenas,
DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>

This software consists of voluntary contributions made by many
individuals. For exact contribution history, see the revision history
available at https://github.com/lodash/lodash

The following license applies to all parts of this software except as
documented below:

====

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.

====

Copyright and related rights for sample code are waived via CC0. Sample
code is defined as all source code displayed within the prose of the
documentation.

CC0: http://creativecommons.org/publicdomain/zero/1.0/

====

Files located in the node_modules and vendor directories are externally
maintained libraries used by this software which have their own
licenses; we recommend you read them, as their terms may differ from the
terms above.
/**
 * lodash (Custom Build) <https://lodash.com/>
 * Build: `lodash modularize exports="npm" -o ./`
 * Copyright jQuery Foundation and other contributors <https://jquery.org/>
 * Released under MIT license <https://lodash.com/license>
 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
 */

/** Used as references for various `Number` constants. */
var INFINITY = 1 / 0,
    MAX_INTEGER = 1.7976931348623157e+308,
    NAN = 0 / 0;

/** `Object#toString` result references. */
var symbolTag = '[object Symbol]';

/** Used to match leading and trailing whitespace. */
var reTrim = /^\s+|\s+$/g;

/** Used to detect bad signed hexadecimal string values. */
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;

/** Used to detect binary string values. */
var reIsBinary = /^0b[01]+$/i;

/** Used to detect octal string values. */
var reIsOctal = /^0o[0-7]+$/i;

/** Built-in method references without a dependency on `root`. */
var freeParseInt = parseInt;

/** Used for built-in method references. */
var objectProto = Object.prototype;

/**
 * Used to resolve the
 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
 * of values.
 */
var objectToString = objectProto.toString;

/**
 * Checks if `value` is an integer.
 *
 * **Note:** This method is based on
 * [`Number.isInteger`](https://mdn.io/Number/isInteger).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an integer, else `false`.
 * @example
 *
 * _.isInteger(3);
 * // => true
 *
 * _.isInteger(Number.MIN_VALUE);
 * // => false
 *
 * _.isInteger(Infinity);
 * // => false
 *
 * _.isInteger('3');
 * // => false
 */
function isInteger(value) {
  return typeof value == 'number' && value == toInteger(value);
}

/**
 * Checks if `value` is the
 * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
 * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an object, else `false`.
 * @example
 *
 * _.isObject({});
 * // => true
 *
 * _.isObject([1, 2, 3]);
 * // => true
 *
 * _.isObject(_.noop);
 * // => true
 *
 * _.isObject(null);
 * // => false
 */
function isObject(value) {
  var type = typeof value;
  return !!value && (type == 'object' || type == 'function');
}

/**
 * Checks if `value` is object-like. A value is object-like if it's not `null`
 * and has a `typeof` result of "object".
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
 * @example
 *
 * _.isObjectLike({});
 * // => true
 *
 * _.isObjectLike([1, 2, 3]);
 * // => true
 *
 * _.isObjectLike(_.noop);
 * // => false
 *
 * _.isObjectLike(null);
 * // => false
 */
function isObjectLike(value) {
  return !!value && typeof value == 'object';
}

/**
 * Checks if `value` is classified as a `Symbol` primitive or object.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
 * @example
 *
 * _.isSymbol(Symbol.iterator);
 * // => true
 *
 * _.isSymbol('abc');
 * // => false
 */
function isSymbol(value) {
  return typeof value == 'symbol' ||
    (isObjectLike(value) && objectToString.call(value) == symbolTag);
}

/**
 * Converts `value` to a finite number.
 *
 * @static
 * @memberOf _
 * @since 4.12.0
 * @category Lang
 * @param {*} value The value to convert.
 * @returns {number} Returns the converted number.
 * @example
 *
 * _.toFinite(3.2);
 * // => 3.2
 *
 * _.toFinite(Number.MIN_VALUE);
 * // => 5e-324
 *
 * _.toFinite(Infinity);
 * // => 1.7976931348623157e+308
 *
 * _.toFinite('3.2');
 * // => 3.2
 */
function toFinite(value) {
  if (!value) {
    return value === 0 ? value : 0;
  }
  value = toNumber(value);
  if (value === INFINITY || value === -INFINITY) {
    var sign = (value < 0 ? -1 : 1);
    return sign * MAX_INTEGER;
  }
  return value === value ? value : 0;
}

/**
 * Converts `value` to an integer.
 *
 * **Note:** This method is loosely based on
 * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to convert.
 * @returns {number} Returns the converted integer.
 * @example
 *
 * _.toInteger(3.2);
 * // => 3
 *
 * _.toInteger(Number.MIN_VALUE);
 * // => 0
 *
 * _.toInteger(Infinity);
 * // => 1.7976931348623157e+308
 *
 * _.toInteger('3.2');
 * // => 3
 */
function toInteger(value) {
  var result = toFinite(value),
      remainder = result % 1;

  return result === result ? (remainder ? result - remainder : result) : 0;
}

/**
 * Converts `value` to a number.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to process.
 * @returns {number} Returns the number.
 * @example
 *
 * _.toNumber(3.2);
 * // => 3.2
 *
 * _.toNumber(Number.MIN_VALUE);
 * // => 5e-324
 *
 * _.toNumber(Infinity);
 * // => Infinity
 *
 * _.toNumber('3.2');
 * // => 3.2
 */
function toNumber(value) {
  if (typeof value == 'number') {
    return value;
  }
  if (isSymbol(value)) {
    return NAN;
  }
  if (isObject(value)) {
    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
    value = isObject(other) ? (other + '') : other;
  }
  if (typeof value != 'string') {
    return value === 0 ? value : +value;
  }
  value = value.replace(reTrim, '');
  var isBinary = reIsBinary.test(value);
  return (isBinary || reIsOctal.test(value))
    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
    : (reIsBadHex.test(value) ? NAN : +value);
}

module.exports = isInteger;
{
  "name": "lodash.isinteger",
  "version": "4.0.4",
  "description": "The lodash method `_.isInteger` exported as a module.",
  "homepage": "https://lodash.com/",
  "icon": "https://lodash.com/icon.svg",
  "license": "MIT",
  "author": "John-David Dalton <john.david.dalton@gmail.com> (http://allyoucanleet.com/)",
  "repository": "lodash/lodash"
}Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/>
Based on Underscore.js, copyright 2009-2016 Jeremy Ashkenas,
DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>

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.
/**
 * lodash 3.0.3 (Custom Build) <https://lodash.com/>
 * Build: `lodash modularize exports="npm" -o ./`
 * Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/>
 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
 * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
 * Available under MIT license <https://lodash.com/license>
 */

/** `Object#toString` result references. */
var numberTag = '[object Number]';

/** Used for built-in method references. */
var objectProto = Object.prototype;

/**
 * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
 * of values.
 */
var objectToString = objectProto.toString;

/**
 * Checks if `value` is object-like. A value is object-like if it's not `null`
 * and has a `typeof` result of "object".
 *
 * @static
 * @memberOf _
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
 * @example
 *
 * _.isObjectLike({});
 * // => true
 *
 * _.isObjectLike([1, 2, 3]);
 * // => true
 *
 * _.isObjectLike(_.noop);
 * // => false
 *
 * _.isObjectLike(null);
 * // => false
 */
function isObjectLike(value) {
  return !!value && typeof value == 'object';
}

/**
 * Checks if `value` is classified as a `Number` primitive or object.
 *
 * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are classified
 * as numbers, use the `_.isFinite` method.
 *
 * @static
 * @memberOf _
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
 * @example
 *
 * _.isNumber(3);
 * // => true
 *
 * _.isNumber(Number.MIN_VALUE);
 * // => true
 *
 * _.isNumber(Infinity);
 * // => true
 *
 * _.isNumber('3');
 * // => false
 */
function isNumber(value) {
  return typeof value == 'number' ||
    (isObjectLike(value) && objectToString.call(value) == numberTag);
}

module.exports = isNumber;
{
  "name": "lodash.isnumber",
  "version": "3.0.3",
  "description": "The lodash method `_.isNumber` exported as a module.",
  "homepage": "https://lodash.com/",
  "icon": "https://lodash.com/icon.svg",
  "license": "MIT",
  "author": "John-David Dalton <john.david.dalton@gmail.com> (http://allyoucanleet.com/)",
  "repository": "lodash/lodash"
}Copyright jQuery Foundation and other contributors <https://jquery.org/>

Based on Underscore.js, copyright Jeremy Ashkenas,
DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>

This software consists of voluntary contributions made by many
individuals. For exact contribution history, see the revision history
available at https://github.com/lodash/lodash

The following license applies to all parts of this software except as
documented below:

====

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.

====

Copyright and related rights for sample code are waived via CC0. Sample
code is defined as all source code displayed within the prose of the
documentation.

CC0: http://creativecommons.org/publicdomain/zero/1.0/

====

Files located in the node_modules and vendor directories are externally
maintained libraries used by this software which have their own
licenses; we recommend you read them, as their terms may differ from the
terms above.
/**
 * lodash (Custom Build) <https://lodash.com/>
 * Build: `lodash modularize exports="npm" -o ./`
 * Copyright jQuery Foundation and other contributors <https://jquery.org/>
 * Released under MIT license <https://lodash.com/license>
 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
 */

/** `Object#toString` result references. */
var objectTag = '[object Object]';

/**
 * Checks if `value` is a host object in IE < 9.
 *
 * @private
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a host object, else `false`.
 */
function isHostObject(value) {
  // Many host objects are `Object` objects that can coerce to strings
  // despite having improperly defined `toString` methods.
  var result = false;
  if (value != null && typeof value.toString != 'function') {
    try {
      result = !!(value + '');
    } catch (e) {}
  }
  return result;
}

/**
 * Creates a unary function that invokes `func` with its argument transformed.
 *
 * @private
 * @param {Function} func The function to wrap.
 * @param {Function} transform The argument transform.
 * @returns {Function} Returns the new function.
 */
function overArg(func, transform) {
  return function(arg) {
    return func(transform(arg));
  };
}

/** Used for built-in method references. */
var funcProto = Function.prototype,
    objectProto = Object.prototype;

/** Used to resolve the decompiled source of functions. */
var funcToString = funcProto.toString;

/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;

/** Used to infer the `Object` constructor. */
var objectCtorString = funcToString.call(Object);

/**
 * Used to resolve the
 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
 * of values.
 */
var objectToString = objectProto.toString;

/** Built-in value references. */
var getPrototype = overArg(Object.getPrototypeOf, Object);

/**
 * Checks if `value` is object-like. A value is object-like if it's not `null`
 * and has a `typeof` result of "object".
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
 * @example
 *
 * _.isObjectLike({});
 * // => true
 *
 * _.isObjectLike([1, 2, 3]);
 * // => true
 *
 * _.isObjectLike(_.noop);
 * // => false
 *
 * _.isObjectLike(null);
 * // => false
 */
function isObjectLike(value) {
  return !!value && typeof value == 'object';
}

/**
 * Checks if `value` is a plain object, that is, an object created by the
 * `Object` constructor or one with a `[[Prototype]]` of `null`.
 *
 * @static
 * @memberOf _
 * @since 0.8.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
 * @example
 *
 * function Foo() {
 *   this.a = 1;
 * }
 *
 * _.isPlainObject(new Foo);
 * // => false
 *
 * _.isPlainObject([1, 2, 3]);
 * // => false
 *
 * _.isPlainObject({ 'x': 0, 'y': 0 });
 * // => true
 *
 * _.isPlainObject(Object.create(null));
 * // => true
 */
function isPlainObject(value) {
  if (!isObjectLike(value) ||
      objectToString.call(value) != objectTag || isHostObject(value)) {
    return false;
  }
  var proto = getPrototype(value);
  if (proto === null) {
    return true;
  }
  var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
  return (typeof Ctor == 'function' &&
    Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString);
}

module.exports = isPlainObject;
{
  "name": "lodash.isplainobject",
  "version": "4.0.6",
  "description": "The lodash method `_.isPlainObject` exported as a module.",
  "homepage": "https://lodash.com/",
  "icon": "https://lodash.com/icon.svg",
  "license": "MIT",
  "author": "John-David Dalton <john.david.dalton@gmail.com> (http://allyoucanleet.com/)",
  "repository": "lodash/lodash"
}Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/>
Based on Underscore.js, copyright 2009-2016 Jeremy Ashkenas,
DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>

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.
/**
 * lodash 4.0.1 (Custom Build) <https://lodash.com/>
 * Build: `lodash modularize exports="npm" -o ./`
 * Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/>
 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
 * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
 * Available under MIT license <https://lodash.com/license>
 */

/** `Object#toString` result references. */
var stringTag = '[object String]';

/** Used for built-in method references. */
var objectProto = Object.prototype;

/**
 * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
 * of values.
 */
var objectToString = objectProto.toString;

/**
 * Checks if `value` is classified as an `Array` object.
 *
 * @static
 * @memberOf _
 * @type Function
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
 * @example
 *
 * _.isArray([1, 2, 3]);
 * // => true
 *
 * _.isArray(document.body.children);
 * // => false
 *
 * _.isArray('abc');
 * // => false
 *
 * _.isArray(_.noop);
 * // => false
 */
var isArray = Array.isArray;

/**
 * Checks if `value` is object-like. A value is object-like if it's not `null`
 * and has a `typeof` result of "object".
 *
 * @static
 * @memberOf _
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
 * @example
 *
 * _.isObjectLike({});
 * // => true
 *
 * _.isObjectLike([1, 2, 3]);
 * // => true
 *
 * _.isObjectLike(_.noop);
 * // => false
 *
 * _.isObjectLike(null);
 * // => false
 */
function isObjectLike(value) {
  return !!value && typeof value == 'object';
}

/**
 * Checks if `value` is classified as a `String` primitive or object.
 *
 * @static
 * @memberOf _
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
 * @example
 *
 * _.isString('abc');
 * // => true
 *
 * _.isString(1);
 * // => false
 */
function isString(value) {
  return typeof value == 'string' ||
    (!isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag);
}

module.exports = isString;
{
  "name": "lodash.isstring",
  "version": "4.0.1",
  "description": "The lodash method `_.isString` exported as a module.",
  "homepage": "https://lodash.com/",
  "icon": "https://lodash.com/icon.svg",
  "license": "MIT",
  "author": "John-David Dalton <john.david.dalton@gmail.com> (http://allyoucanleet.com/)",
  "repository": "lodash/lodash"
}Copyright jQuery Foundation and other contributors <https://jquery.org/>

Based on Underscore.js, copyright Jeremy Ashkenas,
DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>

This software consists of voluntary contributions made by many
individuals. For exact contribution history, see the revision history
available at https://github.com/lodash/lodash

The following license applies to all parts of this software except as
documented below:

====

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.

====

Copyright and related rights for sample code are waived via CC0. Sample
code is defined as all source code displayed within the prose of the
documentation.

CC0: http://creativecommons.org/publicdomain/zero/1.0/

====

Files located in the node_modules and vendor directories are externally
maintained libraries used by this software which have their own
licenses; we recommend you read them, as their terms may differ from the
terms above.
/**
 * lodash (Custom Build) <https://lodash.com/>
 * Build: `lodash modularize exports="npm" -o ./`
 * Copyright jQuery Foundation and other contributors <https://jquery.org/>
 * Released under MIT license <https://lodash.com/license>
 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
 */

/** Used as the `TypeError` message for "Functions" methods. */
var FUNC_ERROR_TEXT = 'Expected a function';

/** Used as references for various `Number` constants. */
var INFINITY = 1 / 0,
    MAX_INTEGER = 1.7976931348623157e+308,
    NAN = 0 / 0;

/** `Object#toString` result references. */
var symbolTag = '[object Symbol]';

/** Used to match leading and trailing whitespace. */
var reTrim = /^\s+|\s+$/g;

/** Used to detect bad signed hexadecimal string values. */
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;

/** Used to detect binary string values. */
var reIsBinary = /^0b[01]+$/i;

/** Used to detect octal string values. */
var reIsOctal = /^0o[0-7]+$/i;

/** Built-in method references without a dependency on `root`. */
var freeParseInt = parseInt;

/** Used for built-in method references. */
var objectProto = Object.prototype;

/**
 * Used to resolve the
 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
 * of values.
 */
var objectToString = objectProto.toString;

/**
 * Creates a function that invokes `func`, with the `this` binding and arguments
 * of the created function, while it's called less than `n` times. Subsequent
 * calls to the created function return the result of the last `func` invocation.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Function
 * @param {number} n The number of calls at which `func` is no longer invoked.
 * @param {Function} func The function to restrict.
 * @returns {Function} Returns the new restricted function.
 * @example
 *
 * jQuery(element).on('click', _.before(5, addContactToList));
 * // => Allows adding up to 4 contacts to the list.
 */
function before(n, func) {
  var result;
  if (typeof func != 'function') {
    throw new TypeError(FUNC_ERROR_TEXT);
  }
  n = toInteger(n);
  return function() {
    if (--n > 0) {
      result = func.apply(this, arguments);
    }
    if (n <= 1) {
      func = undefined;
    }
    return result;
  };
}

/**
 * Creates a function that is restricted to invoking `func` once. Repeat calls
 * to the function return the value of the first invocation. The `func` is
 * invoked with the `this` binding and arguments of the created function.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Function
 * @param {Function} func The function to restrict.
 * @returns {Function} Returns the new restricted function.
 * @example
 *
 * var initialize = _.once(createApplication);
 * initialize();
 * initialize();
 * // => `createApplication` is invoked once
 */
function once(func) {
  return before(2, func);
}

/**
 * Checks if `value` is the
 * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
 * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is an object, else `false`.
 * @example
 *
 * _.isObject({});
 * // => true
 *
 * _.isObject([1, 2, 3]);
 * // => true
 *
 * _.isObject(_.noop);
 * // => true
 *
 * _.isObject(null);
 * // => false
 */
function isObject(value) {
  var type = typeof value;
  return !!value && (type == 'object' || type == 'function');
}

/**
 * Checks if `value` is object-like. A value is object-like if it's not `null`
 * and has a `typeof` result of "object".
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
 * @example
 *
 * _.isObjectLike({});
 * // => true
 *
 * _.isObjectLike([1, 2, 3]);
 * // => true
 *
 * _.isObjectLike(_.noop);
 * // => false
 *
 * _.isObjectLike(null);
 * // => false
 */
function isObjectLike(value) {
  return !!value && typeof value == 'object';
}

/**
 * Checks if `value` is classified as a `Symbol` primitive or object.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to check.
 * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
 * @example
 *
 * _.isSymbol(Symbol.iterator);
 * // => true
 *
 * _.isSymbol('abc');
 * // => false
 */
function isSymbol(value) {
  return typeof value == 'symbol' ||
    (isObjectLike(value) && objectToString.call(value) == symbolTag);
}

/**
 * Converts `value` to a finite number.
 *
 * @static
 * @memberOf _
 * @since 4.12.0
 * @category Lang
 * @param {*} value The value to convert.
 * @returns {number} Returns the converted number.
 * @example
 *
 * _.toFinite(3.2);
 * // => 3.2
 *
 * _.toFinite(Number.MIN_VALUE);
 * // => 5e-324
 *
 * _.toFinite(Infinity);
 * // => 1.7976931348623157e+308
 *
 * _.toFinite('3.2');
 * // => 3.2
 */
function toFinite(value) {
  if (!value) {
    return value === 0 ? value : 0;
  }
  value = toNumber(value);
  if (value === INFINITY || value === -INFINITY) {
    var sign = (value < 0 ? -1 : 1);
    return sign * MAX_INTEGER;
  }
  return value === value ? value : 0;
}

/**
 * Converts `value` to an integer.
 *
 * **Note:** This method is loosely based on
 * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to convert.
 * @returns {number} Returns the converted integer.
 * @example
 *
 * _.toInteger(3.2);
 * // => 3
 *
 * _.toInteger(Number.MIN_VALUE);
 * // => 0
 *
 * _.toInteger(Infinity);
 * // => 1.7976931348623157e+308
 *
 * _.toInteger('3.2');
 * // => 3
 */
function toInteger(value) {
  var result = toFinite(value),
      remainder = result % 1;

  return result === result ? (remainder ? result - remainder : result) : 0;
}

/**
 * Converts `value` to a number.
 *
 * @static
 * @memberOf _
 * @since 4.0.0
 * @category Lang
 * @param {*} value The value to process.
 * @returns {number} Returns the number.
 * @example
 *
 * _.toNumber(3.2);
 * // => 3.2
 *
 * _.toNumber(Number.MIN_VALUE);
 * // => 5e-324
 *
 * _.toNumber(Infinity);
 * // => Infinity
 *
 * _.toNumber('3.2');
 * // => 3.2
 */
function toNumber(value) {
  if (typeof value == 'number') {
    return value;
  }
  if (isSymbol(value)) {
    return NAN;
  }
  if (isObject(value)) {
    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
    value = isObject(other) ? (other + '') : other;
  }
  if (typeof value != 'string') {
    return value === 0 ? value : +value;
  }
  value = value.replace(reTrim, '');
  var isBinary = reIsBinary.test(value);
  return (isBinary || reIsOctal.test(value))
    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
    : (reIsBadHex.test(value) ? NAN : +value);
}

module.exports = once;
{
  "name": "lodash.once",
  "version": "4.1.1",
  "description": "The lodash method `_.once` exported as a module.",
  "homepage": "https://lodash.com/",
  "icon": "https://lodash.com/icon.svg",
  "license": "MIT",
  "author": "John-David Dalton <john.david.dalton@gmail.com> (http://allyoucanleet.com/)",
  "repository": "lodash/lodash"
}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.
'use strict'

// A linked list to keep track of recently-used-ness
const Yallist = require('yallist')

const MAX = Symbol('max')
const LENGTH = Symbol('length')
const LENGTH_CALCULATOR = Symbol('lengthCalculator')
const ALLOW_STALE = Symbol('allowStale')
const MAX_AGE = Symbol('maxAge')
const DISPOSE = Symbol('dispose')
const NO_DISPOSE_ON_SET = Symbol('noDisposeOnSet')
const LRU_LIST = Symbol('lruList')
const CACHE = Symbol('cache')
const UPDATE_AGE_ON_GET = Symbol('updateAgeOnGet')

const naiveLength = () => 1

// lruList is a yallist where the head is the youngest
// item, and the tail is the oldest.  the list contains the Hit
// objects as the entries.
// Each Hit object has a reference to its Yallist.Node.  This
// never changes.
//
// cache is a Map (or PseudoMap) that matches the keys to
// the Yallist.Node object.
class LRUCache {
  constructor (options) {
    if (typeof options === 'number')
      options = { max: options }

    if (!options)
      options = {}

    if (options.max && (typeof options.max !== 'number' || options.max < 0))
      throw new TypeError('max must be a non-negative number')
    // Kind of weird to have a default max of Infinity, but oh well.
    const max = this[MAX] = options.max || Infinity

    const lc = options.length || naiveLength
    this[LENGTH_CALCULATOR] = (typeof lc !== 'function') ? naiveLength : lc
    this[ALLOW_STALE] = options.stale || false
    if (options.maxAge && typeof options.maxAge !== 'number')
      throw new TypeError('maxAge must be a number')
    this[MAX_AGE] = options.maxAge || 0
    this[DISPOSE] = options.dispose
    this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false
    this[UPDATE_AGE_ON_GET] = options.updateAgeOnGet || false
    this.reset()
  }

  // resize the cache when the max changes.
  set max (mL) {
    if (typeof mL !== 'number' || mL < 0)
      throw new TypeError('max must be a non-negative number')

    this[MAX] = mL || Infinity
    trim(this)
  }
  get max () {
    return this[MAX]
  }

  set allowStale (allowStale) {
    this[ALLOW_STALE] = !!allowStale
  }
  get allowStale () {
    return this[ALLOW_STALE]
  }

  set maxAge (mA) {
    if (typeof mA !== 'number')
      throw new TypeError('maxAge must be a non-negative number')

    this[MAX_AGE] = mA
    trim(this)
  }
  get maxAge () {
    return this[MAX_AGE]
  }

  // resize the cache when the lengthCalculator changes.
  set lengthCalculator (lC) {
    if (typeof lC !== 'function')
      lC = naiveLength

    if (lC !== this[LENGTH_CALCULATOR]) {
      this[LENGTH_CALCULATOR] = lC
      this[LENGTH] = 0
      this[LRU_LIST].forEach(hit => {
        hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key)
        this[LENGTH] += hit.length
      })
    }
    trim(this)
  }
  get lengthCalculator () { return this[LENGTH_CALCULATOR] }

  get length () { return this[LENGTH] }
  get itemCount () { return this[LRU_LIST].length }

  rforEach (fn, thisp) {
    thisp = thisp || this
    for (let walker = this[LRU_LIST].tail; walker !== null;) {
      const prev = walker.prev
      forEachStep(this, fn, walker, thisp)
      walker = prev
    }
  }

  forEach (fn, thisp) {
    thisp = thisp || this
    for (let walker = this[LRU_LIST].head; walker !== null;) {
      const next = walker.next
      forEachStep(this, fn, walker, thisp)
      walker = next
    }
  }

  keys () {
    return this[LRU_LIST].toArray().map(k => k.key)
  }

  values () {
    return this[LRU_LIST].toArray().map(k => k.value)
  }

  reset () {
    if (this[DISPOSE] &&
        this[LRU_LIST] &&
        this[LRU_LIST].length) {
      this[LRU_LIST].forEach(hit => this[DISPOSE](hit.key, hit.value))
    }

    this[CACHE] = new Map() // hash of items by key
    this[LRU_LIST] = new Yallist() // list of items in order of use recency
    this[LENGTH] = 0 // length of items in the list
  }

  dump () {
    return this[LRU_LIST].map(hit =>
      isStale(this, hit) ? false : {
        k: hit.key,
        v: hit.value,
        e: hit.now + (hit.maxAge || 0)
      }).toArray().filter(h => h)
  }

  dumpLru () {
    return this[LRU_LIST]
  }

  set (key, value, maxAge) {
    maxAge = maxAge || this[MAX_AGE]

    if (maxAge && typeof maxAge !== 'number')
      throw new TypeError('maxAge must be a number')

    const now = maxAge ? Date.now() : 0
    const len = this[LENGTH_CALCULATOR](value, key)

    if (this[CACHE].has(key)) {
      if (len > this[MAX]) {
        del(this, this[CACHE].get(key))
        return false
      }

      const node = this[CACHE].get(key)
      const item = node.value

      // dispose of the old one before overwriting
      // split out into 2 ifs for better coverage tracking
      if (this[DISPOSE]) {
        if (!this[NO_DISPOSE_ON_SET])
          this[DISPOSE](key, item.value)
      }

      item.now = now
      item.maxAge = maxAge
      item.value = value
      this[LENGTH] += len - item.length
      item.length = len
      this.get(key)
      trim(this)
      return true
    }

    const hit = new Entry(key, value, len, now, maxAge)

    // oversized objects fall out of cache automatically.
    if (hit.length > this[MAX]) {
      if (this[DISPOSE])
        this[DISPOSE](key, value)

      return false
    }

    this[LENGTH] += hit.length
    this[LRU_LIST].unshift(hit)
    this[CACHE].set(key, this[LRU_LIST].head)
    trim(this)
    return true
  }

  has (key) {
    if (!this[CACHE].has(key)) return false
    const hit = this[CACHE].get(key).value
    return !isStale(this, hit)
  }

  get (key) {
    return get(this, key, true)
  }

  peek (key) {
    return get(this, key, false)
  }

  pop () {
    const node = this[LRU_LIST].tail
    if (!node)
      return null

    del(this, node)
    return node.value
  }

  del (key) {
    del(this, this[CACHE].get(key))
  }

  load (arr) {
    // reset the cache
    this.reset()

    const now = Date.now()
    // A previous serialized cache has the most recent items first
    for (let l = arr.length - 1; l >= 0; l--) {
      const hit = arr[l]
      const expiresAt = hit.e || 0
      if (expiresAt === 0)
        // the item was created without expiration in a non aged cache
        this.set(hit.k, hit.v)
      else {
        const maxAge = expiresAt - now
        // dont add already expired items
        if (maxAge > 0) {
          this.set(hit.k, hit.v, maxAge)
        }
      }
    }
  }

  prune () {
    this[CACHE].forEach((value, key) => get(this, key, false))
  }
}

const get = (self, key, doUse) => {
  const node = self[CACHE].get(key)
  if (node) {
    const hit = node.value
    if (isStale(self, hit)) {
      del(self, node)
      if (!self[ALLOW_STALE])
        return undefined
    } else {
      if (doUse) {
        if (self[UPDATE_AGE_ON_GET])
          node.value.now = Date.now()
        self[LRU_LIST].unshiftNode(node)
      }
    }
    return hit.value
  }
}

const isStale = (self, hit) => {
  if (!hit || (!hit.maxAge && !self[MAX_AGE]))
    return false

  const diff = Date.now() - hit.now
  return hit.maxAge ? diff > hit.maxAge
    : self[MAX_AGE] && (diff > self[MAX_AGE])
}

const trim = self => {
  if (self[LENGTH] > self[MAX]) {
    for (let walker = self[LRU_LIST].tail;
      self[LENGTH] > self[MAX] && walker !== null;) {
      // We know that we're about to delete this one, and also
      // what the next least recently used key will be, so just
      // go ahead and set it now.
      const prev = walker.prev
      del(self, walker)
      walker = prev
    }
  }
}

const del = (self, node) => {
  if (node) {
    const hit = node.value
    if (self[DISPOSE])
      self[DISPOSE](hit.key, hit.value)

    self[LENGTH] -= hit.length
    self[CACHE].delete(hit.key)
    self[LRU_LIST].removeNode(node)
  }
}

class Entry {
  constructor (key, value, length, now, maxAge) {
    this.key = key
    this.value = value
    this.length = length
    this.now = now
    this.maxAge = maxAge || 0
  }
}

const forEachStep = (self, fn, node, thisp) => {
  let hit = node.value
  if (isStale(self, hit)) {
    del(self, node)
    if (!self[ALLOW_STALE])
      hit = undefined
  }
  if (hit)
    fn.call(thisp, hit.value, hit.key, self)
}

module.exports = LRUCache
{
  "name": "lru-cache",
  "description": "A cache object that deletes the least-recently-used items.",
  "version": "6.0.0",
  "author": "Isaac Z. Schlueter <i@izs.me>",
  "main": "index.js",
  "repository": "git://github.com/isaacs/node-lru-cache.git",
  "devDependencies": {
    "benchmark": "^2.1.4",
    "tap": "^14.10.7"
  },
  "license": "ISC",
  "dependencies": {
    "yallist": "^4.0.0"
  },
  "files": [
    "index.js"
  ],
  "engines": {
    "node": ">=10"
  }
}'use strict';
const fs = require('fs');
const path = require('path');
const {promisify} = require('util');
const semver = require('semver');

const useNativeRecursiveOption = semver.satisfies(process.version, '>=10.12.0');

// https://github.com/nodejs/node/issues/8987
// https://github.com/libuv/libuv/pull/1088
const checkPath = pth => {
	if (process.platform === 'win32') {
		const pathHasInvalidWinCharacters = /[<>:"|?*]/.test(pth.replace(path.parse(pth).root, ''));

		if (pathHasInvalidWinCharacters) {
			const error = new Error(`Path contains invalid characters: ${pth}`);
			error.code = 'EINVAL';
			throw error;
		}
	}
};

const processOptions = options => {
	// https://github.com/sindresorhus/make-dir/issues/18
	const defaults = {
		mode: 0o777,
		fs
	};

	return {
		...defaults,
		...options
	};
};

const permissionError = pth => {
	// This replicates the exception of `fs.mkdir` with native the
	// `recusive` option when run on an invalid drive under Windows.
	const error = new Error(`operation not permitted, mkdir '${pth}'`);
	error.code = 'EPERM';
	error.errno = -4048;
	error.path = pth;
	error.syscall = 'mkdir';
	return error;
};

const makeDir = async (input, options) => {
	checkPath(input);
	options = processOptions(options);

	const mkdir = promisify(options.fs.mkdir);
	const stat = promisify(options.fs.stat);

	if (useNativeRecursiveOption && options.fs.mkdir === fs.mkdir) {
		const pth = path.resolve(input);

		await mkdir(pth, {
			mode: options.mode,
			recursive: true
		});

		return pth;
	}

	const make = async pth => {
		try {
			await mkdir(pth, options.mode);

			return pth;
		} catch (error) {
			if (error.code === 'EPERM') {
				throw error;
			}

			if (error.code === 'ENOENT') {
				if (path.dirname(pth) === pth) {
					throw permissionError(pth);
				}

				if (error.message.includes('null bytes')) {
					throw error;
				}

				await make(path.dirname(pth));

				return make(pth);
			}

			try {
				const stats = await stat(pth);
				if (!stats.isDirectory()) {
					throw new Error('The path is not a directory');
				}
			} catch (_) {
				throw error;
			}

			return pth;
		}
	};

	return make(path.resolve(input));
};

module.exports = makeDir;

module.exports.sync = (input, options) => {
	checkPath(input);
	options = processOptions(options);

	if (useNativeRecursiveOption && options.fs.mkdirSync === fs.mkdirSync) {
		const pth = path.resolve(input);

		fs.mkdirSync(pth, {
			mode: options.mode,
			recursive: true
		});

		return pth;
	}

	const make = pth => {
		try {
			options.fs.mkdirSync(pth, options.mode);
		} catch (error) {
			if (error.code === 'EPERM') {
				throw error;
			}

			if (error.code === 'ENOENT') {
				if (path.dirname(pth) === pth) {
					throw permissionError(pth);
				}

				if (error.message.includes('null bytes')) {
					throw error;
				}

				make(path.dirname(pth));
				return make(pth);
			}

			try {
				if (!options.fs.statSync(pth).isDirectory()) {
					throw new Error('The path is not a directory');
				}
			} catch (_) {
				throw error;
			}
		}

		return pth;
	};

	return make(path.resolve(input));
};
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": "make-dir",
  "version": "3.1.0",
  "description": "Make a directory and its parents if needed - Think `mkdir -p`",
  "license": "MIT",
  "repository": "sindresorhus/make-dir",
  "funding": "https://github.com/sponsors/sindresorhus",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "engines": {
    "node": ">=8"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "dependencies": {
    "semver": "^6.0.0"
  },
  "devDependencies": {
    "@types/graceful-fs": "^4.1.3",
    "@types/node": "^13.7.1",
    "ava": "^1.4.0",
    "codecov": "^3.2.0",
    "graceful-fs": "^4.1.15",
    "nyc": "^15.0.0",
    "path-type": "^4.0.0",
    "tempy": "^0.2.1",
    "tsd": "^0.11.0",
    "xo": "^0.25.4"
  }
}0.3.0 / 2014-09-07
==================

  * Support Node.js 0.6
  * Throw error when parameter format invalid on parse

0.2.0 / 2014-06-18
==================

  * Add `typer.format()` to format media types

0.1.0 / 2014-06-17
==================

  * Accept `req` as argument to `parse`
  * Accept `res` as argument to `parse`
  * Parse media type with extra LWS between type and first parameter

0.0.0 / 2014-06-13
==================

  * Initial implementation
(The MIT License)

Copyright (c) 2014 Douglas Christopher Wilson

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.
/*!
 * media-typer
 * Copyright(c) 2014 Douglas Christopher Wilson
 * MIT Licensed
 */

/**
 * RegExp to match *( ";" parameter ) in RFC 2616 sec 3.7
 *
 * parameter     = token "=" ( token | quoted-string )
 * token         = 1*<any CHAR except CTLs or separators>
 * separators    = "(" | ")" | "<" | ">" | "@"
 *               | "," | ";" | ":" | "\" | <">
 *               | "/" | "[" | "]" | "?" | "="
 *               | "{" | "}" | SP | HT
 * quoted-string = ( <"> *(qdtext | quoted-pair ) <"> )
 * qdtext        = <any TEXT except <">>
 * quoted-pair   = "\" CHAR
 * CHAR          = <any US-ASCII character (octets 0 - 127)>
 * TEXT          = <any OCTET except CTLs, but including LWS>
 * LWS           = [CRLF] 1*( SP | HT )
 * CRLF          = CR LF
 * CR            = <US-ASCII CR, carriage return (13)>
 * LF            = <US-ASCII LF, linefeed (10)>
 * SP            = <US-ASCII SP, space (32)>
 * SHT           = <US-ASCII HT, horizontal-tab (9)>
 * CTL           = <any US-ASCII control character (octets 0 - 31) and DEL (127)>
 * OCTET         = <any 8-bit sequence of data>
 */
var paramRegExp = /; *([!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+) *= *("(?:[ !\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\u0020-\u007e])*"|[!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+) */g;
var textRegExp = /^[\u0020-\u007e\u0080-\u00ff]+$/
var tokenRegExp = /^[!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+$/

/**
 * RegExp to match quoted-pair in RFC 2616
 *
 * quoted-pair = "\" CHAR
 * CHAR        = <any US-ASCII character (octets 0 - 127)>
 */
var qescRegExp = /\\([\u0000-\u007f])/g;

/**
 * RegExp to match chars that must be quoted-pair in RFC 2616
 */
var quoteRegExp = /([\\"])/g;

/**
 * RegExp to match type in RFC 6838
 *
 * type-name = restricted-name
 * subtype-name = restricted-name
 * restricted-name = restricted-name-first *126restricted-name-chars
 * restricted-name-first  = ALPHA / DIGIT
 * restricted-name-chars  = ALPHA / DIGIT / "!" / "#" /
 *                          "$" / "&" / "-" / "^" / "_"
 * restricted-name-chars =/ "." ; Characters before first dot always
 *                              ; specify a facet name
 * restricted-name-chars =/ "+" ; Characters after last plus always
 *                              ; specify a structured syntax suffix
 * ALPHA =  %x41-5A / %x61-7A   ; A-Z / a-z
 * DIGIT =  %x30-39             ; 0-9
 */
var subtypeNameRegExp = /^[A-Za-z0-9][A-Za-z0-9!#$&^_.-]{0,126}$/
var typeNameRegExp = /^[A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126}$/
var typeRegExp = /^ *([A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126})\/([A-Za-z0-9][A-Za-z0-9!#$&^_.+-]{0,126}) *$/;

/**
 * Module exports.
 */

exports.format = format
exports.parse = parse

/**
 * Format object to media type.
 *
 * @param {object} obj
 * @return {string}
 * @api public
 */

function format(obj) {
  if (!obj || typeof obj !== 'object') {
    throw new TypeError('argument obj is required')
  }

  var parameters = obj.parameters
  var subtype = obj.subtype
  var suffix = obj.suffix
  var type = obj.type

  if (!type || !typeNameRegExp.test(type)) {
    throw new TypeError('invalid type')
  }

  if (!subtype || !subtypeNameRegExp.test(subtype)) {
    throw new TypeError('invalid subtype')
  }

  // format as type/subtype
  var string = type + '/' + subtype

  // append +suffix
  if (suffix) {
    if (!typeNameRegExp.test(suffix)) {
      throw new TypeError('invalid suffix')
    }

    string += '+' + suffix
  }

  // append parameters
  if (parameters && typeof parameters === 'object') {
    var param
    var params = Object.keys(parameters).sort()

    for (var i = 0; i < params.length; i++) {
      param = params[i]

      if (!tokenRegExp.test(param)) {
        throw new TypeError('invalid parameter name')
      }

      string += '; ' + param + '=' + qstring(parameters[param])
    }
  }

  return string
}

/**
 * Parse media type to object.
 *
 * @param {string|object} string
 * @return {Object}
 * @api public
 */

function parse(string) {
  if (!string) {
    throw new TypeError('argument string is required')
  }

  // support req/res-like objects as argument
  if (typeof string === 'object') {
    string = getcontenttype(string)
  }

  if (typeof string !== 'string') {
    throw new TypeError('argument string is required to be a string')
  }

  var index = string.indexOf(';')
  var type = index !== -1
    ? string.substr(0, index)
    : string

  var key
  var match
  var obj = splitType(type)
  var params = {}
  var value

  paramRegExp.lastIndex = index

  while (match = paramRegExp.exec(string)) {
    if (match.index !== index) {
      throw new TypeError('invalid parameter format')
    }

    index += match[0].length
    key = match[1].toLowerCase()
    value = match[2]

    if (value[0] === '"') {
      // remove quotes and escapes
      value = value
        .substr(1, value.length - 2)
        .replace(qescRegExp, '$1')
    }

    params[key] = value
  }

  if (index !== -1 && index !== string.length) {
    throw new TypeError('invalid parameter format')
  }

  obj.parameters = params

  return obj
}

/**
 * Get content-type from req/res objects.
 *
 * @param {object}
 * @return {Object}
 * @api private
 */

function getcontenttype(obj) {
  if (typeof obj.getHeader === 'function') {
    // res-like
    return obj.getHeader('content-type')
  }

  if (typeof obj.headers === 'object') {
    // req-like
    return obj.headers && obj.headers['content-type']
  }
}

/**
 * Quote a string if necessary.
 *
 * @param {string} val
 * @return {string}
 * @api private
 */

function qstring(val) {
  var str = String(val)

  // no need to quote tokens
  if (tokenRegExp.test(str)) {
    return str
  }

  if (str.length > 0 && !textRegExp.test(str)) {
    throw new TypeError('invalid parameter value')
  }

  return '"' + str.replace(quoteRegExp, '\\$1') + '"'
}

/**
 * Simply "type/subtype+siffx" into parts.
 *
 * @param {string} string
 * @return {Object}
 * @api private
 */

function splitType(string) {
  var match = typeRegExp.exec(string.toLowerCase())

  if (!match) {
    throw new TypeError('invalid media type')
  }

  var type = match[1]
  var subtype = match[2]
  var suffix

  // suffix after last +
  var index = subtype.lastIndexOf('+')
  if (index !== -1) {
    suffix = subtype.substr(index + 1)
    subtype = subtype.substr(0, index)
  }

  var obj = {
    type: type,
    subtype: subtype,
    suffix: suffix
  }

  return obj
}
{
  "name": "media-typer",
  "description": "Simple RFC 6838 media type parser and formatter",
  "version": "0.3.0",
  "author": "Douglas Christopher Wilson <doug@somethingdoug.com>",
  "license": "MIT",
  "repository": "jshttp/media-typer",
  "devDependencies": {
    "istanbul": "0.3.2",
    "mocha": "~1.21.4",
    "should": "~4.0.4"
  },
  "files": [
    "LICENSE",
    "HISTORY.md",
    "index.js"
  ],
  "engines": {
    "node": ">= 0.6"
  }
}1.0.1 / 2016-01-17
==================

  * perf: enable strict mode

1.0.0 / 2015-03-01
==================

  * Add option to only add new descriptors
  * Add simple argument validation
  * Add jsdoc to source file

0.0.2 / 2013-12-14
==================

  * Move repository to `component` organization

0.0.1 / 2013-10-29
==================

  * Initial release
(The MIT License)

Copyright (c) 2013 Jonathan Ong <me@jongleberry.com>
Copyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.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.
/*!
 * merge-descriptors
 * Copyright(c) 2014 Jonathan Ong
 * Copyright(c) 2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module exports.
 * @public
 */

module.exports = merge

/**
 * Module variables.
 * @private
 */

var hasOwnProperty = Object.prototype.hasOwnProperty

/**
 * Merge the property descriptors of `src` into `dest`
 *
 * @param {object} dest Object to add descriptors to
 * @param {object} src Object to clone descriptors from
 * @param {boolean} [redefine=true] Redefine `dest` properties with `src` properties
 * @returns {object} Reference to dest
 * @public
 */

function merge(dest, src, redefine) {
  if (!dest) {
    throw new TypeError('argument dest is required')
  }

  if (!src) {
    throw new TypeError('argument src is required')
  }

  if (redefine === undefined) {
    // Default to true
    redefine = true
  }

  Object.getOwnPropertyNames(src).forEach(function forEachOwnPropertyName(name) {
    if (!redefine && hasOwnProperty.call(dest, name)) {
      // Skip desriptor
      return
    }

    // Copy descriptor
    var descriptor = Object.getOwnPropertyDescriptor(src, name)
    Object.defineProperty(dest, name, descriptor)
  })

  return dest
}
{
  "name": "merge-descriptors",
  "description": "Merge objects using descriptors",
  "version": "1.0.1",
  "author": {
    "name": "Jonathan Ong",
    "email": "me@jongleberry.com",
    "url": "http://jongleberry.com",
    "twitter": "https://twitter.com/jongleberry"
  },
  "license": "MIT",
  "repository": "component/merge-descriptors",
  "devDependencies": {
    "istanbul": "0.4.1",
    "mocha": "1.21.5"
  },
  "files": [
    "HISTORY.md",
    "LICENSE",
    "README.md",
    "index.js"
  ]
}1.1.2 / 2016-01-17
==================

  * perf: enable strict mode

1.1.1 / 2014-12-30
==================

  * Improve `browserify` support

1.1.0 / 2014-07-05
==================

  * Add `CONNECT` method
 
1.0.1 / 2014-06-02
==================

  * Fix module to work with harmony transform

1.0.0 / 2014-05-08
==================

  * Add `PURGE` method

0.1.0 / 2013-10-28
==================

  * Add `http.METHODS` support
(The MIT License)

Copyright (c) 2013-2014 TJ Holowaychuk <tj@vision-media.ca>
Copyright (c) 2015-2016 Douglas Christopher Wilson <doug@somethingdoug.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.

/*!
 * methods
 * Copyright(c) 2013-2014 TJ Holowaychuk
 * Copyright(c) 2015-2016 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict';

/**
 * Module dependencies.
 * @private
 */

var http = require('http');

/**
 * Module exports.
 * @public
 */

module.exports = getCurrentNodeMethods() || getBasicNodeMethods();

/**
 * Get the current Node.js methods.
 * @private
 */

function getCurrentNodeMethods() {
  return http.METHODS && http.METHODS.map(function lowerCaseMethod(method) {
    return method.toLowerCase();
  });
}

/**
 * Get the "basic" Node.js methods, a snapshot from Node.js 0.10.
 * @private
 */

function getBasicNodeMethods() {
  return [
    'get',
    'post',
    'put',
    'head',
    'delete',
    'options',
    'trace',
    'copy',
    'lock',
    'mkcol',
    'move',
    'purge',
    'propfind',
    'proppatch',
    'unlock',
    'report',
    'mkactivity',
    'checkout',
    'merge',
    'm-search',
    'notify',
    'subscribe',
    'unsubscribe',
    'patch',
    'search',
    'connect'
  ];
}
{
  "name": "methods",
  "description": "HTTP methods that node supports",
  "version": "1.1.2",
  "license": "MIT",
  "repository": "jshttp/methods",
  "devDependencies": {
    "istanbul": "0.4.1",
    "mocha": "1.21.5"
  },
  "files": [
    "index.js",
    "HISTORY.md",
    "LICENSE"
  ],
  "engines": {
    "node": ">= 0.6"
  },
  "browser": {
    "http": false
  }
}The MIT License (MIT)

Copyright (c) 2010 Benjamin Thomas, Robert Kieffer

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.
#!/usr/bin/env node

var mime = require('./mime.js');
var file = process.argv[2];
var type = mime.lookup(file);

process.stdout.write(type + '\n');

var path = require('path');
var fs = require('fs');

function Mime() {
  // Map of extension -> mime type
  this.types = Object.create(null);

  // Map of mime type -> extension
  this.extensions = Object.create(null);
}

/**
 * Define mimetype -> extension mappings.  Each key is a mime-type that maps
 * to an array of extensions associated with the type.  The first extension is
 * used as the default extension for the type.
 *
 * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']});
 *
 * @param map (Object) type definitions
 */
Mime.prototype.define = function (map) {
  for (var type in map) {
    var exts = map[type];
    for (var i = 0; i < exts.length; i++) {
      if (process.env.DEBUG_MIME && this.types[exts[i]]) {
        console.warn((this._loading || "define()").replace(/.*\//, ''), 'changes "' + exts[i] + '" extension type from ' +
          this.types[exts[i]] + ' to ' + type);
      }

      this.types[exts[i]] = type;
    }

    // Default extension is the first one we encounter
    if (!this.extensions[type]) {
      this.extensions[type] = exts[0];
    }
  }
};

/**
 * Load an Apache2-style ".types" file
 *
 * This may be called multiple times (it's expected).  Where files declare
 * overlapping types/extensions, the last file wins.
 *
 * @param file (String) path of file to load.
 */
Mime.prototype.load = function(file) {
  this._loading = file;
  // Read file and split into lines
  var map = {},
      content = fs.readFileSync(file, 'ascii'),
      lines = content.split(/[\r\n]+/);

  lines.forEach(function(line) {
    // Clean up whitespace/comments, and split into fields
    var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/);
    map[fields.shift()] = fields;
  });

  this.define(map);

  this._loading = null;
};

/**
 * Lookup a mime type based on extension
 */
Mime.prototype.lookup = function(path, fallback) {
  var ext = path.replace(/^.*[\.\/\\]/, '').toLowerCase();

  return this.types[ext] || fallback || this.default_type;
};

/**
 * Return file extension associated with a mime type
 */
Mime.prototype.extension = function(mimeType) {
  var type = mimeType.match(/^\s*([^;\s]*)(?:;|\s|$)/)[1].toLowerCase();
  return this.extensions[type];
};

// Default instance
var mime = new Mime();

// Define built-in types
mime.define(require('./types.json'));

// Default type
mime.default_type = mime.lookup('bin');

//
// Additional API specific to the default instance
//

mime.Mime = Mime;

/**
 * Lookup a charset based on mime type.
 */
mime.charsets = {
  lookup: function(mimeType, fallback) {
    // Assume text types are utf8
    return (/^text\/|^application\/(javascript|json)/).test(mimeType) ? 'UTF-8' : fallback;
  }
};

module.exports = mime;
{
  "author": {
    "name": "Robert Kieffer",
    "url": "http://github.com/broofa",
    "email": "robert@broofa.com"
  },
  "bin": {
    "mime": "cli.js"
  },
  "engines": {
    "node": ">=4"
  },
  "description": "A comprehensive library for mime-type mapping",
  "license": "MIT",
  "dependencies": {},
  "devDependencies": {
    "github-release-notes": "0.13.1",
    "mime-db": "1.31.0",
    "mime-score": "1.1.0"
  },
  "main": "mime.js",
  "name": "mime",
  "repository": {
    "url": "https://github.com/broofa/node-mime",
    "type": "git"
  },
  "version": "1.6.0"
}{"application/andrew-inset":["ez"],"application/applixware":["aw"],"application/atom+xml":["atom"],"application/atomcat+xml":["atomcat"],"application/atomsvc+xml":["atomsvc"],"application/bdoc":["bdoc"],"application/ccxml+xml":["ccxml"],"application/cdmi-capability":["cdmia"],"application/cdmi-container":["cdmic"],"application/cdmi-domain":["cdmid"],"application/cdmi-object":["cdmio"],"application/cdmi-queue":["cdmiq"],"application/cu-seeme":["cu"],"application/dash+xml":["mpd"],"application/davmount+xml":["davmount"],"application/docbook+xml":["dbk"],"application/dssc+der":["dssc"],"application/dssc+xml":["xdssc"],"application/ecmascript":["ecma"],"application/emma+xml":["emma"],"application/epub+zip":["epub"],"application/exi":["exi"],"application/font-tdpfr":["pfr"],"application/font-woff":[],"application/font-woff2":[],"application/geo+json":["geojson"],"application/gml+xml":["gml"],"application/gpx+xml":["gpx"],"application/gxf":["gxf"],"application/gzip":["gz"],"application/hyperstudio":["stk"],"application/inkml+xml":["ink","inkml"],"application/ipfix":["ipfix"],"application/java-archive":["jar","war","ear"],"application/java-serialized-object":["ser"],"application/java-vm":["class"],"application/javascript":["js","mjs"],"application/json":["json","map"],"application/json5":["json5"],"application/jsonml+json":["jsonml"],"application/ld+json":["jsonld"],"application/lost+xml":["lostxml"],"application/mac-binhex40":["hqx"],"application/mac-compactpro":["cpt"],"application/mads+xml":["mads"],"application/manifest+json":["webmanifest"],"application/marc":["mrc"],"application/marcxml+xml":["mrcx"],"application/mathematica":["ma","nb","mb"],"application/mathml+xml":["mathml"],"application/mbox":["mbox"],"application/mediaservercontrol+xml":["mscml"],"application/metalink+xml":["metalink"],"application/metalink4+xml":["meta4"],"application/mets+xml":["mets"],"application/mods+xml":["mods"],"application/mp21":["m21","mp21"],"application/mp4":["mp4s","m4p"],"application/msword":["doc","dot"],"application/mxf":["mxf"],"application/octet-stream":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"],"application/oda":["oda"],"application/oebps-package+xml":["opf"],"application/ogg":["ogx"],"application/omdoc+xml":["omdoc"],"application/onenote":["onetoc","onetoc2","onetmp","onepkg"],"application/oxps":["oxps"],"application/patch-ops-error+xml":["xer"],"application/pdf":["pdf"],"application/pgp-encrypted":["pgp"],"application/pgp-signature":["asc","sig"],"application/pics-rules":["prf"],"application/pkcs10":["p10"],"application/pkcs7-mime":["p7m","p7c"],"application/pkcs7-signature":["p7s"],"application/pkcs8":["p8"],"application/pkix-attr-cert":["ac"],"application/pkix-cert":["cer"],"application/pkix-crl":["crl"],"application/pkix-pkipath":["pkipath"],"application/pkixcmp":["pki"],"application/pls+xml":["pls"],"application/postscript":["ai","eps","ps"],"application/prs.cww":["cww"],"application/pskc+xml":["pskcxml"],"application/raml+yaml":["raml"],"application/rdf+xml":["rdf"],"application/reginfo+xml":["rif"],"application/relax-ng-compact-syntax":["rnc"],"application/resource-lists+xml":["rl"],"application/resource-lists-diff+xml":["rld"],"application/rls-services+xml":["rs"],"application/rpki-ghostbusters":["gbr"],"application/rpki-manifest":["mft"],"application/rpki-roa":["roa"],"application/rsd+xml":["rsd"],"application/rss+xml":["rss"],"application/rtf":["rtf"],"application/sbml+xml":["sbml"],"application/scvp-cv-request":["scq"],"application/scvp-cv-response":["scs"],"application/scvp-vp-request":["spq"],"application/scvp-vp-response":["spp"],"application/sdp":["sdp"],"application/set-payment-initiation":["setpay"],"application/set-registration-initiation":["setreg"],"application/shf+xml":["shf"],"application/smil+xml":["smi","smil"],"application/sparql-query":["rq"],"application/sparql-results+xml":["srx"],"application/srgs":["gram"],"application/srgs+xml":["grxml"],"application/sru+xml":["sru"],"application/ssdl+xml":["ssdl"],"application/ssml+xml":["ssml"],"application/tei+xml":["tei","teicorpus"],"application/thraud+xml":["tfi"],"application/timestamped-data":["tsd"],"application/vnd.3gpp.pic-bw-large":["plb"],"application/vnd.3gpp.pic-bw-small":["psb"],"application/vnd.3gpp.pic-bw-var":["pvb"],"application/vnd.3gpp2.tcap":["tcap"],"application/vnd.3m.post-it-notes":["pwn"],"application/vnd.accpac.simply.aso":["aso"],"application/vnd.accpac.simply.imp":["imp"],"application/vnd.acucobol":["acu"],"application/vnd.acucorp":["atc","acutc"],"application/vnd.adobe.air-application-installer-package+zip":["air"],"application/vnd.adobe.formscentral.fcdt":["fcdt"],"application/vnd.adobe.fxp":["fxp","fxpl"],"application/vnd.adobe.xdp+xml":["xdp"],"application/vnd.adobe.xfdf":["xfdf"],"application/vnd.ahead.space":["ahead"],"application/vnd.airzip.filesecure.azf":["azf"],"application/vnd.airzip.filesecure.azs":["azs"],"application/vnd.amazon.ebook":["azw"],"application/vnd.americandynamics.acc":["acc"],"application/vnd.amiga.ami":["ami"],"application/vnd.android.package-archive":["apk"],"application/vnd.anser-web-certificate-issue-initiation":["cii"],"application/vnd.anser-web-funds-transfer-initiation":["fti"],"application/vnd.antix.game-component":["atx"],"application/vnd.apple.installer+xml":["mpkg"],"application/vnd.apple.mpegurl":["m3u8"],"application/vnd.apple.pkpass":["pkpass"],"application/vnd.aristanetworks.swi":["swi"],"application/vnd.astraea-software.iota":["iota"],"application/vnd.audiograph":["aep"],"application/vnd.blueice.multipass":["mpm"],"application/vnd.bmi":["bmi"],"application/vnd.businessobjects":["rep"],"application/vnd.chemdraw+xml":["cdxml"],"application/vnd.chipnuts.karaoke-mmd":["mmd"],"application/vnd.cinderella":["cdy"],"application/vnd.claymore":["cla"],"application/vnd.cloanto.rp9":["rp9"],"application/vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"application/vnd.cluetrust.cartomobile-config":["c11amc"],"application/vnd.cluetrust.cartomobile-config-pkg":["c11amz"],"application/vnd.commonspace":["csp"],"application/vnd.contact.cmsg":["cdbcmsg"],"application/vnd.cosmocaller":["cmc"],"application/vnd.crick.clicker":["clkx"],"application/vnd.crick.clicker.keyboard":["clkk"],"application/vnd.crick.clicker.palette":["clkp"],"application/vnd.crick.clicker.template":["clkt"],"application/vnd.crick.clicker.wordbank":["clkw"],"application/vnd.criticaltools.wbs+xml":["wbs"],"application/vnd.ctc-posml":["pml"],"application/vnd.cups-ppd":["ppd"],"application/vnd.curl.car":["car"],"application/vnd.curl.pcurl":["pcurl"],"application/vnd.dart":["dart"],"application/vnd.data-vision.rdz":["rdz"],"application/vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"application/vnd.dece.ttml+xml":["uvt","uvvt"],"application/vnd.dece.unspecified":["uvx","uvvx"],"application/vnd.dece.zip":["uvz","uvvz"],"application/vnd.denovo.fcselayout-link":["fe_launch"],"application/vnd.dna":["dna"],"application/vnd.dolby.mlp":["mlp"],"application/vnd.dpgraph":["dpg"],"application/vnd.dreamfactory":["dfac"],"application/vnd.ds-keypoint":["kpxx"],"application/vnd.dvb.ait":["ait"],"application/vnd.dvb.service":["svc"],"application/vnd.dynageo":["geo"],"application/vnd.ecowin.chart":["mag"],"application/vnd.enliven":["nml"],"application/vnd.epson.esf":["esf"],"application/vnd.epson.msf":["msf"],"application/vnd.epson.quickanime":["qam"],"application/vnd.epson.salt":["slt"],"application/vnd.epson.ssf":["ssf"],"application/vnd.eszigno3+xml":["es3","et3"],"application/vnd.ezpix-album":["ez2"],"application/vnd.ezpix-package":["ez3"],"application/vnd.fdf":["fdf"],"application/vnd.fdsn.mseed":["mseed"],"application/vnd.fdsn.seed":["seed","dataless"],"application/vnd.flographit":["gph"],"application/vnd.fluxtime.clip":["ftc"],"application/vnd.framemaker":["fm","frame","maker","book"],"application/vnd.frogans.fnc":["fnc"],"application/vnd.frogans.ltf":["ltf"],"application/vnd.fsc.weblaunch":["fsc"],"application/vnd.fujitsu.oasys":["oas"],"application/vnd.fujitsu.oasys2":["oa2"],"application/vnd.fujitsu.oasys3":["oa3"],"application/vnd.fujitsu.oasysgp":["fg5"],"application/vnd.fujitsu.oasysprs":["bh2"],"application/vnd.fujixerox.ddd":["ddd"],"application/vnd.fujixerox.docuworks":["xdw"],"application/vnd.fujixerox.docuworks.binder":["xbd"],"application/vnd.fuzzysheet":["fzs"],"application/vnd.genomatix.tuxedo":["txd"],"application/vnd.geogebra.file":["ggb"],"application/vnd.geogebra.tool":["ggt"],"application/vnd.geometry-explorer":["gex","gre"],"application/vnd.geonext":["gxt"],"application/vnd.geoplan":["g2w"],"application/vnd.geospace":["g3w"],"application/vnd.gmx":["gmx"],"application/vnd.google-apps.document":["gdoc"],"application/vnd.google-apps.presentation":["gslides"],"application/vnd.google-apps.spreadsheet":["gsheet"],"application/vnd.google-earth.kml+xml":["kml"],"application/vnd.google-earth.kmz":["kmz"],"application/vnd.grafeq":["gqf","gqs"],"application/vnd.groove-account":["gac"],"application/vnd.groove-help":["ghf"],"application/vnd.groove-identity-message":["gim"],"application/vnd.groove-injector":["grv"],"application/vnd.groove-tool-message":["gtm"],"application/vnd.groove-tool-template":["tpl"],"application/vnd.groove-vcard":["vcg"],"application/vnd.hal+xml":["hal"],"application/vnd.handheld-entertainment+xml":["zmm"],"application/vnd.hbci":["hbci"],"application/vnd.hhe.lesson-player":["les"],"application/vnd.hp-hpgl":["hpgl"],"application/vnd.hp-hpid":["hpid"],"application/vnd.hp-hps":["hps"],"application/vnd.hp-jlyt":["jlt"],"application/vnd.hp-pcl":["pcl"],"application/vnd.hp-pclxl":["pclxl"],"application/vnd.hydrostatix.sof-data":["sfd-hdstx"],"application/vnd.ibm.minipay":["mpy"],"application/vnd.ibm.modcap":["afp","listafp","list3820"],"application/vnd.ibm.rights-management":["irm"],"application/vnd.ibm.secure-container":["sc"],"application/vnd.iccprofile":["icc","icm"],"application/vnd.igloader":["igl"],"application/vnd.immervision-ivp":["ivp"],"application/vnd.immervision-ivu":["ivu"],"application/vnd.insors.igm":["igm"],"application/vnd.intercon.formnet":["xpw","xpx"],"application/vnd.intergeo":["i2g"],"application/vnd.intu.qbo":["qbo"],"application/vnd.intu.qfx":["qfx"],"application/vnd.ipunplugged.rcprofile":["rcprofile"],"application/vnd.irepository.package+xml":["irp"],"application/vnd.is-xpr":["xpr"],"application/vnd.isac.fcs":["fcs"],"application/vnd.jam":["jam"],"application/vnd.jcp.javame.midlet-rms":["rms"],"application/vnd.jisp":["jisp"],"application/vnd.joost.joda-archive":["joda"],"application/vnd.kahootz":["ktz","ktr"],"application/vnd.kde.karbon":["karbon"],"application/vnd.kde.kchart":["chrt"],"application/vnd.kde.kformula":["kfo"],"application/vnd.kde.kivio":["flw"],"application/vnd.kde.kontour":["kon"],"application/vnd.kde.kpresenter":["kpr","kpt"],"application/vnd.kde.kspread":["ksp"],"application/vnd.kde.kword":["kwd","kwt"],"application/vnd.kenameaapp":["htke"],"application/vnd.kidspiration":["kia"],"application/vnd.kinar":["kne","knp"],"application/vnd.koan":["skp","skd","skt","skm"],"application/vnd.kodak-descriptor":["sse"],"application/vnd.las.las+xml":["lasxml"],"application/vnd.llamagraphics.life-balance.desktop":["lbd"],"application/vnd.llamagraphics.life-balance.exchange+xml":["lbe"],"application/vnd.lotus-1-2-3":["123"],"application/vnd.lotus-approach":["apr"],"application/vnd.lotus-freelance":["pre"],"application/vnd.lotus-notes":["nsf"],"application/vnd.lotus-organizer":["org"],"application/vnd.lotus-screencam":["scm"],"application/vnd.lotus-wordpro":["lwp"],"application/vnd.macports.portpkg":["portpkg"],"application/vnd.mcd":["mcd"],"application/vnd.medcalcdata":["mc1"],"application/vnd.mediastation.cdkey":["cdkey"],"application/vnd.mfer":["mwf"],"application/vnd.mfmp":["mfm"],"application/vnd.micrografx.flo":["flo"],"application/vnd.micrografx.igx":["igx"],"application/vnd.mif":["mif"],"application/vnd.mobius.daf":["daf"],"application/vnd.mobius.dis":["dis"],"application/vnd.mobius.mbk":["mbk"],"application/vnd.mobius.mqy":["mqy"],"application/vnd.mobius.msl":["msl"],"application/vnd.mobius.plc":["plc"],"application/vnd.mobius.txf":["txf"],"application/vnd.mophun.application":["mpn"],"application/vnd.mophun.certificate":["mpc"],"application/vnd.mozilla.xul+xml":["xul"],"application/vnd.ms-artgalry":["cil"],"application/vnd.ms-cab-compressed":["cab"],"application/vnd.ms-excel":["xls","xlm","xla","xlc","xlt","xlw"],"application/vnd.ms-excel.addin.macroenabled.12":["xlam"],"application/vnd.ms-excel.sheet.binary.macroenabled.12":["xlsb"],"application/vnd.ms-excel.sheet.macroenabled.12":["xlsm"],"application/vnd.ms-excel.template.macroenabled.12":["xltm"],"application/vnd.ms-fontobject":["eot"],"application/vnd.ms-htmlhelp":["chm"],"application/vnd.ms-ims":["ims"],"application/vnd.ms-lrm":["lrm"],"application/vnd.ms-officetheme":["thmx"],"application/vnd.ms-outlook":["msg"],"application/vnd.ms-pki.seccat":["cat"],"application/vnd.ms-pki.stl":["stl"],"application/vnd.ms-powerpoint":["ppt","pps","pot"],"application/vnd.ms-powerpoint.addin.macroenabled.12":["ppam"],"application/vnd.ms-powerpoint.presentation.macroenabled.12":["pptm"],"application/vnd.ms-powerpoint.slide.macroenabled.12":["sldm"],"application/vnd.ms-powerpoint.slideshow.macroenabled.12":["ppsm"],"application/vnd.ms-powerpoint.template.macroenabled.12":["potm"],"application/vnd.ms-project":["mpp","mpt"],"application/vnd.ms-word.document.macroenabled.12":["docm"],"application/vnd.ms-word.template.macroenabled.12":["dotm"],"application/vnd.ms-works":["wps","wks","wcm","wdb"],"application/vnd.ms-wpl":["wpl"],"application/vnd.ms-xpsdocument":["xps"],"application/vnd.mseq":["mseq"],"application/vnd.musician":["mus"],"application/vnd.muvee.style":["msty"],"application/vnd.mynfc":["taglet"],"application/vnd.neurolanguage.nlu":["nlu"],"application/vnd.nitf":["ntf","nitf"],"application/vnd.noblenet-directory":["nnd"],"application/vnd.noblenet-sealer":["nns"],"application/vnd.noblenet-web":["nnw"],"application/vnd.nokia.n-gage.data":["ngdat"],"application/vnd.nokia.n-gage.symbian.install":["n-gage"],"application/vnd.nokia.radio-preset":["rpst"],"application/vnd.nokia.radio-presets":["rpss"],"application/vnd.novadigm.edm":["edm"],"application/vnd.novadigm.edx":["edx"],"application/vnd.novadigm.ext":["ext"],"application/vnd.oasis.opendocument.chart":["odc"],"application/vnd.oasis.opendocument.chart-template":["otc"],"application/vnd.oasis.opendocument.database":["odb"],"application/vnd.oasis.opendocument.formula":["odf"],"application/vnd.oasis.opendocument.formula-template":["odft"],"application/vnd.oasis.opendocument.graphics":["odg"],"application/vnd.oasis.opendocument.graphics-template":["otg"],"application/vnd.oasis.opendocument.image":["odi"],"application/vnd.oasis.opendocument.image-template":["oti"],"application/vnd.oasis.opendocument.presentation":["odp"],"application/vnd.oasis.opendocument.presentation-template":["otp"],"application/vnd.oasis.opendocument.spreadsheet":["ods"],"application/vnd.oasis.opendocument.spreadsheet-template":["ots"],"application/vnd.oasis.opendocument.text":["odt"],"application/vnd.oasis.opendocument.text-master":["odm"],"application/vnd.oasis.opendocument.text-template":["ott"],"application/vnd.oasis.opendocument.text-web":["oth"],"application/vnd.olpc-sugar":["xo"],"application/vnd.oma.dd2+xml":["dd2"],"application/vnd.openofficeorg.extension":["oxt"],"application/vnd.openxmlformats-officedocument.presentationml.presentation":["pptx"],"application/vnd.openxmlformats-officedocument.presentationml.slide":["sldx"],"application/vnd.openxmlformats-officedocument.presentationml.slideshow":["ppsx"],"application/vnd.openxmlformats-officedocument.presentationml.template":["potx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":["xlsx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.template":["xltx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.document":["docx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.template":["dotx"],"application/vnd.osgeo.mapguide.package":["mgp"],"application/vnd.osgi.dp":["dp"],"application/vnd.osgi.subsystem":["esa"],"application/vnd.palm":["pdb","pqa","oprc"],"application/vnd.pawaafile":["paw"],"application/vnd.pg.format":["str"],"application/vnd.pg.osasli":["ei6"],"application/vnd.picsel":["efif"],"application/vnd.pmi.widget":["wg"],"application/vnd.pocketlearn":["plf"],"application/vnd.powerbuilder6":["pbd"],"application/vnd.previewsystems.box":["box"],"application/vnd.proteus.magazine":["mgz"],"application/vnd.publishare-delta-tree":["qps"],"application/vnd.pvi.ptid1":["ptid"],"application/vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"application/vnd.realvnc.bed":["bed"],"application/vnd.recordare.musicxml":["mxl"],"application/vnd.recordare.musicxml+xml":["musicxml"],"application/vnd.rig.cryptonote":["cryptonote"],"application/vnd.rim.cod":["cod"],"application/vnd.rn-realmedia":["rm"],"application/vnd.rn-realmedia-vbr":["rmvb"],"application/vnd.route66.link66+xml":["link66"],"application/vnd.sailingtracker.track":["st"],"application/vnd.seemail":["see"],"application/vnd.sema":["sema"],"application/vnd.semd":["semd"],"application/vnd.semf":["semf"],"application/vnd.shana.informed.formdata":["ifm"],"application/vnd.shana.informed.formtemplate":["itp"],"application/vnd.shana.informed.interchange":["iif"],"application/vnd.shana.informed.package":["ipk"],"application/vnd.simtech-mindmapper":["twd","twds"],"application/vnd.smaf":["mmf"],"application/vnd.smart.teacher":["teacher"],"application/vnd.solent.sdkm+xml":["sdkm","sdkd"],"application/vnd.spotfire.dxp":["dxp"],"application/vnd.spotfire.sfs":["sfs"],"application/vnd.stardivision.calc":["sdc"],"application/vnd.stardivision.draw":["sda"],"application/vnd.stardivision.impress":["sdd"],"application/vnd.stardivision.math":["smf"],"application/vnd.stardivision.writer":["sdw","vor"],"application/vnd.stardivision.writer-global":["sgl"],"application/vnd.stepmania.package":["smzip"],"application/vnd.stepmania.stepchart":["sm"],"application/vnd.sun.wadl+xml":["wadl"],"application/vnd.sun.xml.calc":["sxc"],"application/vnd.sun.xml.calc.template":["stc"],"application/vnd.sun.xml.draw":["sxd"],"application/vnd.sun.xml.draw.template":["std"],"application/vnd.sun.xml.impress":["sxi"],"application/vnd.sun.xml.impress.template":["sti"],"application/vnd.sun.xml.math":["sxm"],"application/vnd.sun.xml.writer":["sxw"],"application/vnd.sun.xml.writer.global":["sxg"],"application/vnd.sun.xml.writer.template":["stw"],"application/vnd.sus-calendar":["sus","susp"],"application/vnd.svd":["svd"],"application/vnd.symbian.install":["sis","sisx"],"application/vnd.syncml+xml":["xsm"],"application/vnd.syncml.dm+wbxml":["bdm"],"application/vnd.syncml.dm+xml":["xdm"],"application/vnd.tao.intent-module-archive":["tao"],"application/vnd.tcpdump.pcap":["pcap","cap","dmp"],"application/vnd.tmobile-livetv":["tmo"],"application/vnd.trid.tpt":["tpt"],"application/vnd.triscape.mxs":["mxs"],"application/vnd.trueapp":["tra"],"application/vnd.ufdl":["ufd","ufdl"],"application/vnd.uiq.theme":["utz"],"application/vnd.umajin":["umj"],"application/vnd.unity":["unityweb"],"application/vnd.uoml+xml":["uoml"],"application/vnd.vcx":["vcx"],"application/vnd.visio":["vsd","vst","vss","vsw"],"application/vnd.visionary":["vis"],"application/vnd.vsf":["vsf"],"application/vnd.wap.wbxml":["wbxml"],"application/vnd.wap.wmlc":["wmlc"],"application/vnd.wap.wmlscriptc":["wmlsc"],"application/vnd.webturbo":["wtb"],"application/vnd.wolfram.player":["nbp"],"application/vnd.wordperfect":["wpd"],"application/vnd.wqd":["wqd"],"application/vnd.wt.stf":["stf"],"application/vnd.xara":["xar"],"application/vnd.xfdl":["xfdl"],"application/vnd.yamaha.hv-dic":["hvd"],"application/vnd.yamaha.hv-script":["hvs"],"application/vnd.yamaha.hv-voice":["hvp"],"application/vnd.yamaha.openscoreformat":["osf"],"application/vnd.yamaha.openscoreformat.osfpvg+xml":["osfpvg"],"application/vnd.yamaha.smaf-audio":["saf"],"application/vnd.yamaha.smaf-phrase":["spf"],"application/vnd.yellowriver-custom-menu":["cmp"],"application/vnd.zul":["zir","zirz"],"application/vnd.zzazz.deck+xml":["zaz"],"application/voicexml+xml":["vxml"],"application/wasm":["wasm"],"application/widget":["wgt"],"application/winhlp":["hlp"],"application/wsdl+xml":["wsdl"],"application/wspolicy+xml":["wspolicy"],"application/x-7z-compressed":["7z"],"application/x-abiword":["abw"],"application/x-ace-compressed":["ace"],"application/x-apple-diskimage":[],"application/x-arj":["arj"],"application/x-authorware-bin":["aab","x32","u32","vox"],"application/x-authorware-map":["aam"],"application/x-authorware-seg":["aas"],"application/x-bcpio":["bcpio"],"application/x-bdoc":[],"application/x-bittorrent":["torrent"],"application/x-blorb":["blb","blorb"],"application/x-bzip":["bz"],"application/x-bzip2":["bz2","boz"],"application/x-cbr":["cbr","cba","cbt","cbz","cb7"],"application/x-cdlink":["vcd"],"application/x-cfs-compressed":["cfs"],"application/x-chat":["chat"],"application/x-chess-pgn":["pgn"],"application/x-chrome-extension":["crx"],"application/x-cocoa":["cco"],"application/x-conference":["nsc"],"application/x-cpio":["cpio"],"application/x-csh":["csh"],"application/x-debian-package":["udeb"],"application/x-dgc-compressed":["dgc"],"application/x-director":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"],"application/x-doom":["wad"],"application/x-dtbncx+xml":["ncx"],"application/x-dtbook+xml":["dtb"],"application/x-dtbresource+xml":["res"],"application/x-dvi":["dvi"],"application/x-envoy":["evy"],"application/x-eva":["eva"],"application/x-font-bdf":["bdf"],"application/x-font-ghostscript":["gsf"],"application/x-font-linux-psf":["psf"],"application/x-font-pcf":["pcf"],"application/x-font-snf":["snf"],"application/x-font-type1":["pfa","pfb","pfm","afm"],"application/x-freearc":["arc"],"application/x-futuresplash":["spl"],"application/x-gca-compressed":["gca"],"application/x-glulx":["ulx"],"application/x-gnumeric":["gnumeric"],"application/x-gramps-xml":["gramps"],"application/x-gtar":["gtar"],"application/x-hdf":["hdf"],"application/x-httpd-php":["php"],"application/x-install-instructions":["install"],"application/x-iso9660-image":[],"application/x-java-archive-diff":["jardiff"],"application/x-java-jnlp-file":["jnlp"],"application/x-latex":["latex"],"application/x-lua-bytecode":["luac"],"application/x-lzh-compressed":["lzh","lha"],"application/x-makeself":["run"],"application/x-mie":["mie"],"application/x-mobipocket-ebook":["prc","mobi"],"application/x-ms-application":["application"],"application/x-ms-shortcut":["lnk"],"application/x-ms-wmd":["wmd"],"application/x-ms-wmz":["wmz"],"application/x-ms-xbap":["xbap"],"application/x-msaccess":["mdb"],"application/x-msbinder":["obd"],"application/x-mscardfile":["crd"],"application/x-msclip":["clp"],"application/x-msdos-program":[],"application/x-msdownload":["com","bat"],"application/x-msmediaview":["mvb","m13","m14"],"application/x-msmetafile":["wmf","emf","emz"],"application/x-msmoney":["mny"],"application/x-mspublisher":["pub"],"application/x-msschedule":["scd"],"application/x-msterminal":["trm"],"application/x-mswrite":["wri"],"application/x-netcdf":["nc","cdf"],"application/x-ns-proxy-autoconfig":["pac"],"application/x-nzb":["nzb"],"application/x-perl":["pl","pm"],"application/x-pilot":[],"application/x-pkcs12":["p12","pfx"],"application/x-pkcs7-certificates":["p7b","spc"],"application/x-pkcs7-certreqresp":["p7r"],"application/x-rar-compressed":["rar"],"application/x-redhat-package-manager":["rpm"],"application/x-research-info-systems":["ris"],"application/x-sea":["sea"],"application/x-sh":["sh"],"application/x-shar":["shar"],"application/x-shockwave-flash":["swf"],"application/x-silverlight-app":["xap"],"application/x-sql":["sql"],"application/x-stuffit":["sit"],"application/x-stuffitx":["sitx"],"application/x-subrip":["srt"],"application/x-sv4cpio":["sv4cpio"],"application/x-sv4crc":["sv4crc"],"application/x-t3vm-image":["t3"],"application/x-tads":["gam"],"application/x-tar":["tar"],"application/x-tcl":["tcl","tk"],"application/x-tex":["tex"],"application/x-tex-tfm":["tfm"],"application/x-texinfo":["texinfo","texi"],"application/x-tgif":["obj"],"application/x-ustar":["ustar"],"application/x-virtualbox-hdd":["hdd"],"application/x-virtualbox-ova":["ova"],"application/x-virtualbox-ovf":["ovf"],"application/x-virtualbox-vbox":["vbox"],"application/x-virtualbox-vbox-extpack":["vbox-extpack"],"application/x-virtualbox-vdi":["vdi"],"application/x-virtualbox-vhd":["vhd"],"application/x-virtualbox-vmdk":["vmdk"],"application/x-wais-source":["src"],"application/x-web-app-manifest+json":["webapp"],"application/x-x509-ca-cert":["der","crt","pem"],"application/x-xfig":["fig"],"application/x-xliff+xml":["xlf"],"application/x-xpinstall":["xpi"],"application/x-xz":["xz"],"application/x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"application/xaml+xml":["xaml"],"application/xcap-diff+xml":["xdf"],"application/xenc+xml":["xenc"],"application/xhtml+xml":["xhtml","xht"],"application/xml":["xml","xsl","xsd","rng"],"application/xml-dtd":["dtd"],"application/xop+xml":["xop"],"application/xproc+xml":["xpl"],"application/xslt+xml":["xslt"],"application/xspf+xml":["xspf"],"application/xv+xml":["mxml","xhvml","xvml","xvm"],"application/yang":["yang"],"application/yin+xml":["yin"],"application/zip":["zip"],"audio/3gpp":[],"audio/adpcm":["adp"],"audio/basic":["au","snd"],"audio/midi":["mid","midi","kar","rmi"],"audio/mp3":[],"audio/mp4":["m4a","mp4a"],"audio/mpeg":["mpga","mp2","mp2a","mp3","m2a","m3a"],"audio/ogg":["oga","ogg","spx"],"audio/s3m":["s3m"],"audio/silk":["sil"],"audio/vnd.dece.audio":["uva","uvva"],"audio/vnd.digital-winds":["eol"],"audio/vnd.dra":["dra"],"audio/vnd.dts":["dts"],"audio/vnd.dts.hd":["dtshd"],"audio/vnd.lucent.voice":["lvp"],"audio/vnd.ms-playready.media.pya":["pya"],"audio/vnd.nuera.ecelp4800":["ecelp4800"],"audio/vnd.nuera.ecelp7470":["ecelp7470"],"audio/vnd.nuera.ecelp9600":["ecelp9600"],"audio/vnd.rip":["rip"],"audio/wav":["wav"],"audio/wave":[],"audio/webm":["weba"],"audio/x-aac":["aac"],"audio/x-aiff":["aif","aiff","aifc"],"audio/x-caf":["caf"],"audio/x-flac":["flac"],"audio/x-m4a":[],"audio/x-matroska":["mka"],"audio/x-mpegurl":["m3u"],"audio/x-ms-wax":["wax"],"audio/x-ms-wma":["wma"],"audio/x-pn-realaudio":["ram","ra"],"audio/x-pn-realaudio-plugin":["rmp"],"audio/x-realaudio":[],"audio/x-wav":[],"audio/xm":["xm"],"chemical/x-cdx":["cdx"],"chemical/x-cif":["cif"],"chemical/x-cmdf":["cmdf"],"chemical/x-cml":["cml"],"chemical/x-csml":["csml"],"chemical/x-xyz":["xyz"],"font/collection":["ttc"],"font/otf":["otf"],"font/ttf":["ttf"],"font/woff":["woff"],"font/woff2":["woff2"],"image/apng":["apng"],"image/bmp":["bmp"],"image/cgm":["cgm"],"image/g3fax":["g3"],"image/gif":["gif"],"image/ief":["ief"],"image/jp2":["jp2","jpg2"],"image/jpeg":["jpeg","jpg","jpe"],"image/jpm":["jpm"],"image/jpx":["jpx","jpf"],"image/ktx":["ktx"],"image/png":["png"],"image/prs.btif":["btif"],"image/sgi":["sgi"],"image/svg+xml":["svg","svgz"],"image/tiff":["tiff","tif"],"image/vnd.adobe.photoshop":["psd"],"image/vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"image/vnd.djvu":["djvu","djv"],"image/vnd.dvb.subtitle":[],"image/vnd.dwg":["dwg"],"image/vnd.dxf":["dxf"],"image/vnd.fastbidsheet":["fbs"],"image/vnd.fpx":["fpx"],"image/vnd.fst":["fst"],"image/vnd.fujixerox.edmics-mmr":["mmr"],"image/vnd.fujixerox.edmics-rlc":["rlc"],"image/vnd.ms-modi":["mdi"],"image/vnd.ms-photo":["wdp"],"image/vnd.net-fpx":["npx"],"image/vnd.wap.wbmp":["wbmp"],"image/vnd.xiff":["xif"],"image/webp":["webp"],"image/x-3ds":["3ds"],"image/x-cmu-raster":["ras"],"image/x-cmx":["cmx"],"image/x-freehand":["fh","fhc","fh4","fh5","fh7"],"image/x-icon":["ico"],"image/x-jng":["jng"],"image/x-mrsid-image":["sid"],"image/x-ms-bmp":[],"image/x-pcx":["pcx"],"image/x-pict":["pic","pct"],"image/x-portable-anymap":["pnm"],"image/x-portable-bitmap":["pbm"],"image/x-portable-graymap":["pgm"],"image/x-portable-pixmap":["ppm"],"image/x-rgb":["rgb"],"image/x-tga":["tga"],"image/x-xbitmap":["xbm"],"image/x-xpixmap":["xpm"],"image/x-xwindowdump":["xwd"],"message/rfc822":["eml","mime"],"model/gltf+json":["gltf"],"model/gltf-binary":["glb"],"model/iges":["igs","iges"],"model/mesh":["msh","mesh","silo"],"model/vnd.collada+xml":["dae"],"model/vnd.dwf":["dwf"],"model/vnd.gdl":["gdl"],"model/vnd.gtw":["gtw"],"model/vnd.mts":["mts"],"model/vnd.vtu":["vtu"],"model/vrml":["wrl","vrml"],"model/x3d+binary":["x3db","x3dbz"],"model/x3d+vrml":["x3dv","x3dvz"],"model/x3d+xml":["x3d","x3dz"],"text/cache-manifest":["appcache","manifest"],"text/calendar":["ics","ifb"],"text/coffeescript":["coffee","litcoffee"],"text/css":["css"],"text/csv":["csv"],"text/hjson":["hjson"],"text/html":["html","htm","shtml"],"text/jade":["jade"],"text/jsx":["jsx"],"text/less":["less"],"text/markdown":["markdown","md"],"text/mathml":["mml"],"text/n3":["n3"],"text/plain":["txt","text","conf","def","list","log","in","ini"],"text/prs.lines.tag":["dsc"],"text/richtext":["rtx"],"text/rtf":[],"text/sgml":["sgml","sgm"],"text/slim":["slim","slm"],"text/stylus":["stylus","styl"],"text/tab-separated-values":["tsv"],"text/troff":["t","tr","roff","man","me","ms"],"text/turtle":["ttl"],"text/uri-list":["uri","uris","urls"],"text/vcard":["vcard"],"text/vnd.curl":["curl"],"text/vnd.curl.dcurl":["dcurl"],"text/vnd.curl.mcurl":["mcurl"],"text/vnd.curl.scurl":["scurl"],"text/vnd.dvb.subtitle":["sub"],"text/vnd.fly":["fly"],"text/vnd.fmi.flexstor":["flx"],"text/vnd.graphviz":["gv"],"text/vnd.in3d.3dml":["3dml"],"text/vnd.in3d.spot":["spot"],"text/vnd.sun.j2me.app-descriptor":["jad"],"text/vnd.wap.wml":["wml"],"text/vnd.wap.wmlscript":["wmls"],"text/vtt":["vtt"],"text/x-asm":["s","asm"],"text/x-c":["c","cc","cxx","cpp","h","hh","dic"],"text/x-component":["htc"],"text/x-fortran":["f","for","f77","f90"],"text/x-handlebars-template":["hbs"],"text/x-java-source":["java"],"text/x-lua":["lua"],"text/x-markdown":["mkd"],"text/x-nfo":["nfo"],"text/x-opml":["opml"],"text/x-org":[],"text/x-pascal":["p","pas"],"text/x-processing":["pde"],"text/x-sass":["sass"],"text/x-scss":["scss"],"text/x-setext":["etx"],"text/x-sfv":["sfv"],"text/x-suse-ymp":["ymp"],"text/x-uuencode":["uu"],"text/x-vcalendar":["vcs"],"text/x-vcard":["vcf"],"text/xml":[],"text/yaml":["yaml","yml"],"video/3gpp":["3gp","3gpp"],"video/3gpp2":["3g2"],"video/h261":["h261"],"video/h263":["h263"],"video/h264":["h264"],"video/jpeg":["jpgv"],"video/jpm":["jpgm"],"video/mj2":["mj2","mjp2"],"video/mp2t":["ts"],"video/mp4":["mp4","mp4v","mpg4"],"video/mpeg":["mpeg","mpg","mpe","m1v","m2v"],"video/ogg":["ogv"],"video/quicktime":["qt","mov"],"video/vnd.dece.hd":["uvh","uvvh"],"video/vnd.dece.mobile":["uvm","uvvm"],"video/vnd.dece.pd":["uvp","uvvp"],"video/vnd.dece.sd":["uvs","uvvs"],"video/vnd.dece.video":["uvv","uvvv"],"video/vnd.dvb.file":["dvb"],"video/vnd.fvt":["fvt"],"video/vnd.mpegurl":["mxu","m4u"],"video/vnd.ms-playready.media.pyv":["pyv"],"video/vnd.uvvu.mp4":["uvu","uvvu"],"video/vnd.vivo":["viv"],"video/webm":["webm"],"video/x-f4v":["f4v"],"video/x-fli":["fli"],"video/x-flv":["flv"],"video/x-m4v":["m4v"],"video/x-matroska":["mkv","mk3d","mks"],"video/x-mng":["mng"],"video/x-ms-asf":["asf","asx"],"video/x-ms-vob":["vob"],"video/x-ms-wm":["wm"],"video/x-ms-wmv":["wmv"],"video/x-ms-wmx":["wmx"],"video/x-ms-wvx":["wvx"],"video/x-msvideo":["avi"],"video/x-sgi-movie":["movie"],"video/x-smv":["smv"],"x-conference/x-cooltalk":["ice"]}#!/usr/bin/env node

'use strict';

const fs = require('fs');
const path = require('path');
const mimeScore = require('mime-score');

let db = require('mime-db');
let chalk = require('chalk');

const STANDARD_FACET_SCORE = 900;

const byExtension = {};

// Clear out any conflict extensions in mime-db
for (let type in db) {
  let entry = db[type];
  entry.type = type;

  if (!entry.extensions) continue;

  entry.extensions.forEach(ext => {
    if (ext in byExtension) {
      const e0 = entry;
      const e1 = byExtension[ext];
      e0.pri = mimeScore(e0.type, e0.source);
      e1.pri = mimeScore(e1.type, e1.source);

      let drop = e0.pri < e1.pri ? e0 : e1;
      let keep = e0.pri >= e1.pri ? e0 : e1;
      drop.extensions = drop.extensions.filter(e => e !== ext);

      console.log(`${ext}: Keeping ${chalk.green(keep.type)} (${keep.pri}), dropping ${chalk.red(drop.type)} (${drop.pri})`);
    }
    byExtension[ext] = entry;
  });
}

function writeTypesFile(types, path) {
  fs.writeFileSync(path, JSON.stringify(types));
}

// Segregate into standard and non-standard types based on facet per
// https://tools.ietf.org/html/rfc6838#section-3.1
const types = {};

Object.keys(db).sort().forEach(k => {
  const entry = db[k];
  types[entry.type] = entry.extensions;
});

writeTypesFile(types, path.join(__dirname, '..', 'types.json'));
/**
 * Usage: node test.js
 */

var mime = require('../mime');
var assert = require('assert');
var path = require('path');

//
// Test mime lookups
//

assert.equal('text/plain', mime.lookup('text.txt'));     // normal file
assert.equal('text/plain', mime.lookup('TEXT.TXT'));     // uppercase
assert.equal('text/plain', mime.lookup('dir/text.txt')); // dir + file
assert.equal('text/plain', mime.lookup('.text.txt'));    // hidden file
assert.equal('text/plain', mime.lookup('.txt'));         // nameless
assert.equal('text/plain', mime.lookup('txt'));          // extension-only
assert.equal('text/plain', mime.lookup('/txt'));         // extension-less ()
assert.equal('text/plain', mime.lookup('\\txt'));        // Windows, extension-less
assert.equal('application/octet-stream', mime.lookup('text.nope')); // unrecognized
assert.equal('fallback', mime.lookup('text.fallback', 'fallback')); // alternate default

//
// Test extensions
//

assert.equal('txt', mime.extension(mime.types.text));
assert.equal('html', mime.extension(mime.types.htm));
assert.equal('bin', mime.extension('application/octet-stream'));
assert.equal('bin', mime.extension('application/octet-stream '));
assert.equal('html', mime.extension(' text/html; charset=UTF-8'));
assert.equal('html', mime.extension('text/html; charset=UTF-8 '));
assert.equal('html', mime.extension('text/html; charset=UTF-8'));
assert.equal('html', mime.extension('text/html ; charset=UTF-8'));
assert.equal('html', mime.extension('text/html;charset=UTF-8'));
assert.equal('html', mime.extension('text/Html;charset=UTF-8'));
assert.equal(undefined, mime.extension('unrecognized'));

//
// Test node.types lookups
//

assert.equal('font/woff', mime.lookup('file.woff'));
assert.equal('application/octet-stream', mime.lookup('file.buffer'));
// TODO: Uncomment once #157 is resolved
// assert.equal('audio/mp4', mime.lookup('file.m4a'));
assert.equal('font/otf', mime.lookup('file.otf'));

//
// Test charsets
//

assert.equal('UTF-8', mime.charsets.lookup('text/plain'));
assert.equal('UTF-8', mime.charsets.lookup(mime.types.js));
assert.equal('UTF-8', mime.charsets.lookup(mime.types.json));
assert.equal(undefined, mime.charsets.lookup(mime.types.bin));
assert.equal('fallback', mime.charsets.lookup('application/octet-stream', 'fallback'));

console.log('\nAll tests passed');
1.52.0 / 2022-02-21
===================

  * Add extensions from IANA for more `image/*` types
  * Add extension `.asc` to `application/pgp-keys`
  * Add extensions to various XML types
  * Add new upstream MIME types

1.51.0 / 2021-11-08
===================

  * Add new upstream MIME types
  * Mark `image/vnd.microsoft.icon` as compressible
  * Mark `image/vnd.ms-dds` as compressible

1.50.0 / 2021-09-15
===================

  * Add deprecated iWorks mime types and extensions
  * Add new upstream MIME types

1.49.0 / 2021-07-26
===================

  * Add extension `.trig` to `application/trig`
  * Add new upstream MIME types

1.48.0 / 2021-05-30
===================

  * Add extension `.mvt` to `application/vnd.mapbox-vector-tile`
  * Add new upstream MIME types
  * Mark `text/yaml` as compressible

1.47.0 / 2021-04-01
===================

  * Add new upstream MIME types
  * Remove ambigious extensions from IANA for `application/*+xml` types
  * Update primary extension to `.es` for `application/ecmascript`

1.46.0 / 2021-02-13
===================

  * Add extension `.amr` to `audio/amr`
  * Add extension `.m4s` to `video/iso.segment`
  * Add extension `.opus` to `audio/ogg`
  * Add new upstream MIME types

1.45.0 / 2020-09-22
===================

  * Add `application/ubjson` with extension `.ubj`
  * Add `image/avif` with extension `.avif`
  * Add `image/ktx2` with extension `.ktx2`
  * Add extension `.dbf` to `application/vnd.dbf`
  * Add extension `.rar` to `application/vnd.rar`
  * Add extension `.td` to `application/urc-targetdesc+xml`
  * Add new upstream MIME types
  * Fix extension of `application/vnd.apple.keynote` to be `.key`

1.44.0 / 2020-04-22
===================

  * Add charsets from IANA
  * Add extension `.cjs` to `application/node`
  * Add new upstream MIME types

1.43.0 / 2020-01-05
===================

  * Add `application/x-keepass2` with extension `.kdbx`
  * Add extension `.mxmf` to `audio/mobile-xmf`
  * Add extensions from IANA for `application/*+xml` types
  * Add new upstream MIME types

1.42.0 / 2019-09-25
===================

  * Add `image/vnd.ms-dds` with extension `.dds`
  * Add new upstream MIME types
  * Remove compressible from `multipart/mixed`

1.41.0 / 2019-08-30
===================

  * Add new upstream MIME types
  * Add `application/toml` with extension `.toml`
  * Mark `font/ttf` as compressible

1.40.0 / 2019-04-20
===================

  * Add extensions from IANA for `model/*` types
  * Add `text/mdx` with extension `.mdx`

1.39.0 / 2019-04-04
===================

  * Add extensions `.siv` and `.sieve` to `application/sieve`
  * Add new upstream MIME types

1.38.0 / 2019-02-04
===================

  * Add extension `.nq` to `application/n-quads`
  * Add extension `.nt` to `application/n-triples`
  * Add new upstream MIME types
  * Mark `text/less` as compressible

1.37.0 / 2018-10-19
===================

  * Add extensions to HEIC image types
  * Add new upstream MIME types

1.36.0 / 2018-08-20
===================

  * Add Apple file extensions from IANA
  * Add extensions from IANA for `image/*` types
  * Add new upstream MIME types

1.35.0 / 2018-07-15
===================

  * Add extension `.owl` to `application/rdf+xml`
  * Add new upstream MIME types
    - Removes extension `.woff` from `application/font-woff`

1.34.0 / 2018-06-03
===================

  * Add extension `.csl` to `application/vnd.citationstyles.style+xml`
  * Add extension `.es` to `application/ecmascript`
  * Add new upstream MIME types
  * Add `UTF-8` as default charset for `text/turtle`
  * Mark all XML-derived types as compressible

1.33.0 / 2018-02-15
===================

  * Add extensions from IANA for `message/*` types
  * Add new upstream MIME types
  * Fix some incorrect OOXML types
  * Remove `application/font-woff2`

1.32.0 / 2017-11-29
===================

  * Add new upstream MIME types
  * Update `text/hjson` to registered `application/hjson`
  * Add `text/shex` with extension `.shex`

1.31.0 / 2017-10-25
===================

  * Add `application/raml+yaml` with extension `.raml`
  * Add `application/wasm` with extension `.wasm`
  * Add new `font` type from IANA
  * Add new upstream font extensions
  * Add new upstream MIME types
  * Add extensions for JPEG-2000 images

1.30.0 / 2017-08-27
===================

  * Add `application/vnd.ms-outlook`
  * Add `application/x-arj`
  * Add extension `.mjs` to `application/javascript`
  * Add glTF types and extensions
  * Add new upstream MIME types
  * Add `text/x-org`
  * Add VirtualBox MIME types
  * Fix `source` records for `video/*` types that are IANA
  * Update `font/opentype` to registered `font/otf`

1.29.0 / 2017-07-10
===================

  * Add `application/fido.trusted-apps+json`
  * Add extension `.wadl` to `application/vnd.sun.wadl+xml`
  * Add new upstream MIME types
  * Add `UTF-8` as default charset for `text/css`

1.28.0 / 2017-05-14
===================

  * Add new upstream MIME types
  * Add extension `.gz` to `application/gzip`
  * Update extensions `.md` and `.markdown` to be `text/markdown`

1.27.0 / 2017-03-16
===================

  * Add new upstream MIME types
  * Add `image/apng` with extension `.apng`

1.26.0 / 2017-01-14
===================

  * Add new upstream MIME types
  * Add extension `.geojson` to `application/geo+json`

1.25.0 / 2016-11-11
===================

  * Add new upstream MIME types

1.24.0 / 2016-09-18
===================

  * Add `audio/mp3`
  * Add new upstream MIME types

1.23.0 / 2016-05-01
===================

  * Add new upstream MIME types
  * Add extension `.3gpp` to `audio/3gpp`

1.22.0 / 2016-02-15
===================

  * Add `text/slim`
  * Add extension `.rng` to `application/xml`
  * Add new upstream MIME types
  * Fix extension of `application/dash+xml` to be `.mpd`
  * Update primary extension to `.m4a` for `audio/mp4`

1.21.0 / 2016-01-06
===================

  * Add Google document types
  * Add new upstream MIME types

1.20.0 / 2015-11-10
===================

  * Add `text/x-suse-ymp`
  * Add new upstream MIME types

1.19.0 / 2015-09-17
===================

  * Add `application/vnd.apple.pkpass`
  * Add new upstream MIME types

1.18.0 / 2015-09-03
===================

  * Add new upstream MIME types

1.17.0 / 2015-08-13
===================

  * Add `application/x-msdos-program`
  * Add `audio/g711-0`
  * Add `image/vnd.mozilla.apng`
  * Add extension `.exe` to `application/x-msdos-program`

1.16.0 / 2015-07-29
===================

  * Add `application/vnd.uri-map`

1.15.0 / 2015-07-13
===================

  * Add `application/x-httpd-php`

1.14.0 / 2015-06-25
===================

  * Add `application/scim+json`
  * Add `application/vnd.3gpp.ussd+xml`
  * Add `application/vnd.biopax.rdf+xml`
  * Add `text/x-processing`

1.13.0 / 2015-06-07
===================

  * Add nginx as a source
  * Add `application/x-cocoa`
  * Add `application/x-java-archive-diff`
  * Add `application/x-makeself`
  * Add `application/x-perl`
  * Add `application/x-pilot`
  * Add `application/x-redhat-package-manager`
  * Add `application/x-sea`
  * Add `audio/x-m4a`
  * Add `audio/x-realaudio`
  * Add `image/x-jng`
  * Add `text/mathml`

1.12.0 / 2015-06-05
===================

  * Add `application/bdoc`
  * Add `application/vnd.hyperdrive+json`
  * Add `application/x-bdoc`
  * Add extension `.rtf` to `text/rtf`

1.11.0 / 2015-05-31
===================

  * Add `audio/wav`
  * Add `audio/wave`
  * Add extension `.litcoffee` to `text/coffeescript`
  * Add extension `.sfd-hdstx` to `application/vnd.hydrostatix.sof-data`
  * Add extension `.n-gage` to `application/vnd.nokia.n-gage.symbian.install`

1.10.0 / 2015-05-19
===================

  * Add `application/vnd.balsamiq.bmpr`
  * Add `application/vnd.microsoft.portable-executable`
  * Add `application/x-ns-proxy-autoconfig`

1.9.1 / 2015-04-19
==================

  * Remove `.json` extension from `application/manifest+json`
    - This is causing bugs downstream

1.9.0 / 2015-04-19
==================

  * Add `application/manifest+json`
  * Add `application/vnd.micro+json`
  * Add `image/vnd.zbrush.pcx`
  * Add `image/x-ms-bmp`

1.8.0 / 2015-03-13
==================

  * Add `application/vnd.citationstyles.style+xml`
  * Add `application/vnd.fastcopy-disk-image`
  * Add `application/vnd.gov.sk.xmldatacontainer+xml`
  * Add extension `.jsonld` to `application/ld+json`

1.7.0 / 2015-02-08
==================

  * Add `application/vnd.gerber`
  * Add `application/vnd.msa-disk-image`

1.6.1 / 2015-02-05
==================

  * Community extensions ownership transferred from `node-mime`

1.6.0 / 2015-01-29
==================

  * Add `application/jose`
  * Add `application/jose+json`
  * Add `application/json-seq`
  * Add `application/jwk+json`
  * Add `application/jwk-set+json`
  * Add `application/jwt`
  * Add `application/rdap+json`
  * Add `application/vnd.gov.sk.e-form+xml`
  * Add `application/vnd.ims.imsccv1p3`

1.5.0 / 2014-12-30
==================

  * Add `application/vnd.oracle.resource+json`
  * Fix various invalid MIME type entries
    - `application/mbox+xml`
    - `application/oscp-response`
    - `application/vwg-multiplexed`
    - `audio/g721`

1.4.0 / 2014-12-21
==================

  * Add `application/vnd.ims.imsccv1p2`
  * Fix various invalid MIME type entries
    - `application/vnd-acucobol`
    - `application/vnd-curl`
    - `application/vnd-dart`
    - `application/vnd-dxr`
    - `application/vnd-fdf`
    - `application/vnd-mif`
    - `application/vnd-sema`
    - `application/vnd-wap-wmlc`
    - `application/vnd.adobe.flash-movie`
    - `application/vnd.dece-zip`
    - `application/vnd.dvb_service`
    - `application/vnd.micrografx-igx`
    - `application/vnd.sealed-doc`
    - `application/vnd.sealed-eml`
    - `application/vnd.sealed-mht`
    - `application/vnd.sealed-ppt`
    - `application/vnd.sealed-tiff`
    - `application/vnd.sealed-xls`
    - `application/vnd.sealedmedia.softseal-html`
    - `application/vnd.sealedmedia.softseal-pdf`
    - `application/vnd.wap-slc`
    - `application/vnd.wap-wbxml`
    - `audio/vnd.sealedmedia.softseal-mpeg`
    - `image/vnd-djvu`
    - `image/vnd-svf`
    - `image/vnd-wap-wbmp`
    - `image/vnd.sealed-png`
    - `image/vnd.sealedmedia.softseal-gif`
    - `image/vnd.sealedmedia.softseal-jpg`
    - `model/vnd-dwf`
    - `model/vnd.parasolid.transmit-binary`
    - `model/vnd.parasolid.transmit-text`
    - `text/vnd-a`
    - `text/vnd-curl`
    - `text/vnd.wap-wml`
  * Remove example template MIME types
    - `application/example`
    - `audio/example`
    - `image/example`
    - `message/example`
    - `model/example`
    - `multipart/example`
    - `text/example`
    - `video/example`

1.3.1 / 2014-12-16
==================

  * Fix missing extensions
    - `application/json5`
    - `text/hjson`

1.3.0 / 2014-12-07
==================

  * Add `application/a2l`
  * Add `application/aml`
  * Add `application/atfx`
  * Add `application/atxml`
  * Add `application/cdfx+xml`
  * Add `application/dii`
  * Add `application/json5`
  * Add `application/lxf`
  * Add `application/mf4`
  * Add `application/vnd.apache.thrift.compact`
  * Add `application/vnd.apache.thrift.json`
  * Add `application/vnd.coffeescript`
  * Add `application/vnd.enphase.envoy`
  * Add `application/vnd.ims.imsccv1p1`
  * Add `text/csv-schema`
  * Add `text/hjson`
  * Add `text/markdown`
  * Add `text/yaml`

1.2.0 / 2014-11-09
==================

  * Add `application/cea`
  * Add `application/dit`
  * Add `application/vnd.gov.sk.e-form+zip`
  * Add `application/vnd.tmd.mediaflex.api+xml`
  * Type `application/epub+zip` is now IANA-registered

1.1.2 / 2014-10-23
==================

  * Rebuild database for `application/x-www-form-urlencoded` change

1.1.1 / 2014-10-20
==================

  * Mark `application/x-www-form-urlencoded` as compressible.

1.1.0 / 2014-09-28
==================

  * Add `application/font-woff2`

1.0.3 / 2014-09-25
==================

  * Fix engine requirement in package

1.0.2 / 2014-09-25
==================

  * Add `application/coap-group+json`
  * Add `application/dcd`
  * Add `application/vnd.apache.thrift.binary`
  * Add `image/vnd.tencent.tap`
  * Mark all JSON-derived types as compressible
  * Update `text/vtt` data

1.0.1 / 2014-08-30
==================

  * Fix extension ordering

1.0.0 / 2014-08-30
==================

  * Add `application/atf`
  * Add `application/merge-patch+json`
  * Add `multipart/x-mixed-replace`
  * Add `source: 'apache'` metadata
  * Add `source: 'iana'` metadata
  * Remove badly-assumed charset data
(The MIT License)

Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
Copyright (c) 2015-2022 Douglas Christopher Wilson <doug@somethingdoug.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.
{
  "application/1d-interleaved-parityfec": {
    "source": "iana"
  },
  "application/3gpdash-qoe-report+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/3gpp-ims+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/3gpphal+json": {
    "source": "iana",
    "compressible": true
  },
  "application/3gpphalforms+json": {
    "source": "iana",
    "compressible": true
  },
  "application/a2l": {
    "source": "iana"
  },
  "application/ace+cbor": {
    "source": "iana"
  },
  "application/activemessage": {
    "source": "iana"
  },
  "application/activity+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-costmap+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-costmapfilter+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-directory+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-endpointcost+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-endpointcostparams+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-endpointprop+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-endpointpropparams+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-error+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-networkmap+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-networkmapfilter+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-updatestreamcontrol+json": {
    "source": "iana",
    "compressible": true
  },
  "application/alto-updatestreamparams+json": {
    "source": "iana",
    "compressible": true
  },
  "application/aml": {
    "source": "iana"
  },
  "application/andrew-inset": {
    "source": "iana",
    "extensions": ["ez"]
  },
  "application/applefile": {
    "source": "iana"
  },
  "application/applixware": {
    "source": "apache",
    "extensions": ["aw"]
  },
  "application/at+jwt": {
    "source": "iana"
  },
  "application/atf": {
    "source": "iana"
  },
  "application/atfx": {
    "source": "iana"
  },
  "application/atom+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["atom"]
  },
  "application/atomcat+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["atomcat"]
  },
  "application/atomdeleted+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["atomdeleted"]
  },
  "application/atomicmail": {
    "source": "iana"
  },
  "application/atomsvc+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["atomsvc"]
  },
  "application/atsc-dwd+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["dwd"]
  },
  "application/atsc-dynamic-event-message": {
    "source": "iana"
  },
  "application/atsc-held+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["held"]
  },
  "application/atsc-rdt+json": {
    "source": "iana",
    "compressible": true
  },
  "application/atsc-rsat+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rsat"]
  },
  "application/atxml": {
    "source": "iana"
  },
  "application/auth-policy+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/bacnet-xdd+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/batch-smtp": {
    "source": "iana"
  },
  "application/bdoc": {
    "compressible": false,
    "extensions": ["bdoc"]
  },
  "application/beep+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/calendar+json": {
    "source": "iana",
    "compressible": true
  },
  "application/calendar+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xcs"]
  },
  "application/call-completion": {
    "source": "iana"
  },
  "application/cals-1840": {
    "source": "iana"
  },
  "application/captive+json": {
    "source": "iana",
    "compressible": true
  },
  "application/cbor": {
    "source": "iana"
  },
  "application/cbor-seq": {
    "source": "iana"
  },
  "application/cccex": {
    "source": "iana"
  },
  "application/ccmp+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/ccxml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["ccxml"]
  },
  "application/cdfx+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["cdfx"]
  },
  "application/cdmi-capability": {
    "source": "iana",
    "extensions": ["cdmia"]
  },
  "application/cdmi-container": {
    "source": "iana",
    "extensions": ["cdmic"]
  },
  "application/cdmi-domain": {
    "source": "iana",
    "extensions": ["cdmid"]
  },
  "application/cdmi-object": {
    "source": "iana",
    "extensions": ["cdmio"]
  },
  "application/cdmi-queue": {
    "source": "iana",
    "extensions": ["cdmiq"]
  },
  "application/cdni": {
    "source": "iana"
  },
  "application/cea": {
    "source": "iana"
  },
  "application/cea-2018+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/cellml+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/cfw": {
    "source": "iana"
  },
  "application/city+json": {
    "source": "iana",
    "compressible": true
  },
  "application/clr": {
    "source": "iana"
  },
  "application/clue+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/clue_info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/cms": {
    "source": "iana"
  },
  "application/cnrp+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/coap-group+json": {
    "source": "iana",
    "compressible": true
  },
  "application/coap-payload": {
    "source": "iana"
  },
  "application/commonground": {
    "source": "iana"
  },
  "application/conference-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/cose": {
    "source": "iana"
  },
  "application/cose-key": {
    "source": "iana"
  },
  "application/cose-key-set": {
    "source": "iana"
  },
  "application/cpl+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["cpl"]
  },
  "application/csrattrs": {
    "source": "iana"
  },
  "application/csta+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/cstadata+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/csvm+json": {
    "source": "iana",
    "compressible": true
  },
  "application/cu-seeme": {
    "source": "apache",
    "extensions": ["cu"]
  },
  "application/cwt": {
    "source": "iana"
  },
  "application/cybercash": {
    "source": "iana"
  },
  "application/dart": {
    "compressible": true
  },
  "application/dash+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mpd"]
  },
  "application/dash-patch+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mpp"]
  },
  "application/dashdelta": {
    "source": "iana"
  },
  "application/davmount+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["davmount"]
  },
  "application/dca-rft": {
    "source": "iana"
  },
  "application/dcd": {
    "source": "iana"
  },
  "application/dec-dx": {
    "source": "iana"
  },
  "application/dialog-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/dicom": {
    "source": "iana"
  },
  "application/dicom+json": {
    "source": "iana",
    "compressible": true
  },
  "application/dicom+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/dii": {
    "source": "iana"
  },
  "application/dit": {
    "source": "iana"
  },
  "application/dns": {
    "source": "iana"
  },
  "application/dns+json": {
    "source": "iana",
    "compressible": true
  },
  "application/dns-message": {
    "source": "iana"
  },
  "application/docbook+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["dbk"]
  },
  "application/dots+cbor": {
    "source": "iana"
  },
  "application/dskpp+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/dssc+der": {
    "source": "iana",
    "extensions": ["dssc"]
  },
  "application/dssc+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xdssc"]
  },
  "application/dvcs": {
    "source": "iana"
  },
  "application/ecmascript": {
    "source": "iana",
    "compressible": true,
    "extensions": ["es","ecma"]
  },
  "application/edi-consent": {
    "source": "iana"
  },
  "application/edi-x12": {
    "source": "iana",
    "compressible": false
  },
  "application/edifact": {
    "source": "iana",
    "compressible": false
  },
  "application/efi": {
    "source": "iana"
  },
  "application/elm+json": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/elm+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/emergencycalldata.cap+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/emergencycalldata.comment+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/emergencycalldata.control+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/emergencycalldata.deviceinfo+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/emergencycalldata.ecall.msd": {
    "source": "iana"
  },
  "application/emergencycalldata.providerinfo+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/emergencycalldata.serviceinfo+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/emergencycalldata.subscriberinfo+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/emergencycalldata.veds+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/emma+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["emma"]
  },
  "application/emotionml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["emotionml"]
  },
  "application/encaprtp": {
    "source": "iana"
  },
  "application/epp+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/epub+zip": {
    "source": "iana",
    "compressible": false,
    "extensions": ["epub"]
  },
  "application/eshop": {
    "source": "iana"
  },
  "application/exi": {
    "source": "iana",
    "extensions": ["exi"]
  },
  "application/expect-ct-report+json": {
    "source": "iana",
    "compressible": true
  },
  "application/express": {
    "source": "iana",
    "extensions": ["exp"]
  },
  "application/fastinfoset": {
    "source": "iana"
  },
  "application/fastsoap": {
    "source": "iana"
  },
  "application/fdt+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["fdt"]
  },
  "application/fhir+json": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/fhir+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/fido.trusted-apps+json": {
    "compressible": true
  },
  "application/fits": {
    "source": "iana"
  },
  "application/flexfec": {
    "source": "iana"
  },
  "application/font-sfnt": {
    "source": "iana"
  },
  "application/font-tdpfr": {
    "source": "iana",
    "extensions": ["pfr"]
  },
  "application/font-woff": {
    "source": "iana",
    "compressible": false
  },
  "application/framework-attributes+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/geo+json": {
    "source": "iana",
    "compressible": true,
    "extensions": ["geojson"]
  },
  "application/geo+json-seq": {
    "source": "iana"
  },
  "application/geopackage+sqlite3": {
    "source": "iana"
  },
  "application/geoxacml+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/gltf-buffer": {
    "source": "iana"
  },
  "application/gml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["gml"]
  },
  "application/gpx+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["gpx"]
  },
  "application/gxf": {
    "source": "apache",
    "extensions": ["gxf"]
  },
  "application/gzip": {
    "source": "iana",
    "compressible": false,
    "extensions": ["gz"]
  },
  "application/h224": {
    "source": "iana"
  },
  "application/held+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/hjson": {
    "extensions": ["hjson"]
  },
  "application/http": {
    "source": "iana"
  },
  "application/hyperstudio": {
    "source": "iana",
    "extensions": ["stk"]
  },
  "application/ibe-key-request+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/ibe-pkg-reply+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/ibe-pp-data": {
    "source": "iana"
  },
  "application/iges": {
    "source": "iana"
  },
  "application/im-iscomposing+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/index": {
    "source": "iana"
  },
  "application/index.cmd": {
    "source": "iana"
  },
  "application/index.obj": {
    "source": "iana"
  },
  "application/index.response": {
    "source": "iana"
  },
  "application/index.vnd": {
    "source": "iana"
  },
  "application/inkml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["ink","inkml"]
  },
  "application/iotp": {
    "source": "iana"
  },
  "application/ipfix": {
    "source": "iana",
    "extensions": ["ipfix"]
  },
  "application/ipp": {
    "source": "iana"
  },
  "application/isup": {
    "source": "iana"
  },
  "application/its+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["its"]
  },
  "application/java-archive": {
    "source": "apache",
    "compressible": false,
    "extensions": ["jar","war","ear"]
  },
  "application/java-serialized-object": {
    "source": "apache",
    "compressible": false,
    "extensions": ["ser"]
  },
  "application/java-vm": {
    "source": "apache",
    "compressible": false,
    "extensions": ["class"]
  },
  "application/javascript": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true,
    "extensions": ["js","mjs"]
  },
  "application/jf2feed+json": {
    "source": "iana",
    "compressible": true
  },
  "application/jose": {
    "source": "iana"
  },
  "application/jose+json": {
    "source": "iana",
    "compressible": true
  },
  "application/jrd+json": {
    "source": "iana",
    "compressible": true
  },
  "application/jscalendar+json": {
    "source": "iana",
    "compressible": true
  },
  "application/json": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true,
    "extensions": ["json","map"]
  },
  "application/json-patch+json": {
    "source": "iana",
    "compressible": true
  },
  "application/json-seq": {
    "source": "iana"
  },
  "application/json5": {
    "extensions": ["json5"]
  },
  "application/jsonml+json": {
    "source": "apache",
    "compressible": true,
    "extensions": ["jsonml"]
  },
  "application/jwk+json": {
    "source": "iana",
    "compressible": true
  },
  "application/jwk-set+json": {
    "source": "iana",
    "compressible": true
  },
  "application/jwt": {
    "source": "iana"
  },
  "application/kpml-request+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/kpml-response+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/ld+json": {
    "source": "iana",
    "compressible": true,
    "extensions": ["jsonld"]
  },
  "application/lgr+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["lgr"]
  },
  "application/link-format": {
    "source": "iana"
  },
  "application/load-control+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/lost+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["lostxml"]
  },
  "application/lostsync+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/lpf+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/lxf": {
    "source": "iana"
  },
  "application/mac-binhex40": {
    "source": "iana",
    "extensions": ["hqx"]
  },
  "application/mac-compactpro": {
    "source": "apache",
    "extensions": ["cpt"]
  },
  "application/macwriteii": {
    "source": "iana"
  },
  "application/mads+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mads"]
  },
  "application/manifest+json": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true,
    "extensions": ["webmanifest"]
  },
  "application/marc": {
    "source": "iana",
    "extensions": ["mrc"]
  },
  "application/marcxml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mrcx"]
  },
  "application/mathematica": {
    "source": "iana",
    "extensions": ["ma","nb","mb"]
  },
  "application/mathml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mathml"]
  },
  "application/mathml-content+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mathml-presentation+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-associated-procedure-description+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-deregister+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-envelope+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-msk+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-msk-response+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-protection-description+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-reception-report+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-register+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-register-response+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-schedule+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbms-user-service-description+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mbox": {
    "source": "iana",
    "extensions": ["mbox"]
  },
  "application/media-policy-dataset+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mpf"]
  },
  "application/media_control+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mediaservercontrol+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mscml"]
  },
  "application/merge-patch+json": {
    "source": "iana",
    "compressible": true
  },
  "application/metalink+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["metalink"]
  },
  "application/metalink4+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["meta4"]
  },
  "application/mets+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mets"]
  },
  "application/mf4": {
    "source": "iana"
  },
  "application/mikey": {
    "source": "iana"
  },
  "application/mipc": {
    "source": "iana"
  },
  "application/missing-blocks+cbor-seq": {
    "source": "iana"
  },
  "application/mmt-aei+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["maei"]
  },
  "application/mmt-usd+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["musd"]
  },
  "application/mods+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mods"]
  },
  "application/moss-keys": {
    "source": "iana"
  },
  "application/moss-signature": {
    "source": "iana"
  },
  "application/mosskey-data": {
    "source": "iana"
  },
  "application/mosskey-request": {
    "source": "iana"
  },
  "application/mp21": {
    "source": "iana",
    "extensions": ["m21","mp21"]
  },
  "application/mp4": {
    "source": "iana",
    "extensions": ["mp4s","m4p"]
  },
  "application/mpeg4-generic": {
    "source": "iana"
  },
  "application/mpeg4-iod": {
    "source": "iana"
  },
  "application/mpeg4-iod-xmt": {
    "source": "iana"
  },
  "application/mrb-consumer+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/mrb-publish+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/msc-ivr+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/msc-mixer+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/msword": {
    "source": "iana",
    "compressible": false,
    "extensions": ["doc","dot"]
  },
  "application/mud+json": {
    "source": "iana",
    "compressible": true
  },
  "application/multipart-core": {
    "source": "iana"
  },
  "application/mxf": {
    "source": "iana",
    "extensions": ["mxf"]
  },
  "application/n-quads": {
    "source": "iana",
    "extensions": ["nq"]
  },
  "application/n-triples": {
    "source": "iana",
    "extensions": ["nt"]
  },
  "application/nasdata": {
    "source": "iana"
  },
  "application/news-checkgroups": {
    "source": "iana",
    "charset": "US-ASCII"
  },
  "application/news-groupinfo": {
    "source": "iana",
    "charset": "US-ASCII"
  },
  "application/news-transmission": {
    "source": "iana"
  },
  "application/nlsml+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/node": {
    "source": "iana",
    "extensions": ["cjs"]
  },
  "application/nss": {
    "source": "iana"
  },
  "application/oauth-authz-req+jwt": {
    "source": "iana"
  },
  "application/oblivious-dns-message": {
    "source": "iana"
  },
  "application/ocsp-request": {
    "source": "iana"
  },
  "application/ocsp-response": {
    "source": "iana"
  },
  "application/octet-stream": {
    "source": "iana",
    "compressible": false,
    "extensions": ["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"]
  },
  "application/oda": {
    "source": "iana",
    "extensions": ["oda"]
  },
  "application/odm+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/odx": {
    "source": "iana"
  },
  "application/oebps-package+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["opf"]
  },
  "application/ogg": {
    "source": "iana",
    "compressible": false,
    "extensions": ["ogx"]
  },
  "application/omdoc+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["omdoc"]
  },
  "application/onenote": {
    "source": "apache",
    "extensions": ["onetoc","onetoc2","onetmp","onepkg"]
  },
  "application/opc-nodeset+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/oscore": {
    "source": "iana"
  },
  "application/oxps": {
    "source": "iana",
    "extensions": ["oxps"]
  },
  "application/p21": {
    "source": "iana"
  },
  "application/p21+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/p2p-overlay+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["relo"]
  },
  "application/parityfec": {
    "source": "iana"
  },
  "application/passport": {
    "source": "iana"
  },
  "application/patch-ops-error+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xer"]
  },
  "application/pdf": {
    "source": "iana",
    "compressible": false,
    "extensions": ["pdf"]
  },
  "application/pdx": {
    "source": "iana"
  },
  "application/pem-certificate-chain": {
    "source": "iana"
  },
  "application/pgp-encrypted": {
    "source": "iana",
    "compressible": false,
    "extensions": ["pgp"]
  },
  "application/pgp-keys": {
    "source": "iana",
    "extensions": ["asc"]
  },
  "application/pgp-signature": {
    "source": "iana",
    "extensions": ["asc","sig"]
  },
  "application/pics-rules": {
    "source": "apache",
    "extensions": ["prf"]
  },
  "application/pidf+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/pidf-diff+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/pkcs10": {
    "source": "iana",
    "extensions": ["p10"]
  },
  "application/pkcs12": {
    "source": "iana"
  },
  "application/pkcs7-mime": {
    "source": "iana",
    "extensions": ["p7m","p7c"]
  },
  "application/pkcs7-signature": {
    "source": "iana",
    "extensions": ["p7s"]
  },
  "application/pkcs8": {
    "source": "iana",
    "extensions": ["p8"]
  },
  "application/pkcs8-encrypted": {
    "source": "iana"
  },
  "application/pkix-attr-cert": {
    "source": "iana",
    "extensions": ["ac"]
  },
  "application/pkix-cert": {
    "source": "iana",
    "extensions": ["cer"]
  },
  "application/pkix-crl": {
    "source": "iana",
    "extensions": ["crl"]
  },
  "application/pkix-pkipath": {
    "source": "iana",
    "extensions": ["pkipath"]
  },
  "application/pkixcmp": {
    "source": "iana",
    "extensions": ["pki"]
  },
  "application/pls+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["pls"]
  },
  "application/poc-settings+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/postscript": {
    "source": "iana",
    "compressible": true,
    "extensions": ["ai","eps","ps"]
  },
  "application/ppsp-tracker+json": {
    "source": "iana",
    "compressible": true
  },
  "application/problem+json": {
    "source": "iana",
    "compressible": true
  },
  "application/problem+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/provenance+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["provx"]
  },
  "application/prs.alvestrand.titrax-sheet": {
    "source": "iana"
  },
  "application/prs.cww": {
    "source": "iana",
    "extensions": ["cww"]
  },
  "application/prs.cyn": {
    "source": "iana",
    "charset": "7-BIT"
  },
  "application/prs.hpub+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/prs.nprend": {
    "source": "iana"
  },
  "application/prs.plucker": {
    "source": "iana"
  },
  "application/prs.rdf-xml-crypt": {
    "source": "iana"
  },
  "application/prs.xsf+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/pskc+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["pskcxml"]
  },
  "application/pvd+json": {
    "source": "iana",
    "compressible": true
  },
  "application/qsig": {
    "source": "iana"
  },
  "application/raml+yaml": {
    "compressible": true,
    "extensions": ["raml"]
  },
  "application/raptorfec": {
    "source": "iana"
  },
  "application/rdap+json": {
    "source": "iana",
    "compressible": true
  },
  "application/rdf+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rdf","owl"]
  },
  "application/reginfo+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rif"]
  },
  "application/relax-ng-compact-syntax": {
    "source": "iana",
    "extensions": ["rnc"]
  },
  "application/remote-printing": {
    "source": "iana"
  },
  "application/reputon+json": {
    "source": "iana",
    "compressible": true
  },
  "application/resource-lists+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rl"]
  },
  "application/resource-lists-diff+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rld"]
  },
  "application/rfc+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/riscos": {
    "source": "iana"
  },
  "application/rlmi+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/rls-services+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rs"]
  },
  "application/route-apd+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rapd"]
  },
  "application/route-s-tsid+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["sls"]
  },
  "application/route-usd+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rusd"]
  },
  "application/rpki-ghostbusters": {
    "source": "iana",
    "extensions": ["gbr"]
  },
  "application/rpki-manifest": {
    "source": "iana",
    "extensions": ["mft"]
  },
  "application/rpki-publication": {
    "source": "iana"
  },
  "application/rpki-roa": {
    "source": "iana",
    "extensions": ["roa"]
  },
  "application/rpki-updown": {
    "source": "iana"
  },
  "application/rsd+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["rsd"]
  },
  "application/rss+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["rss"]
  },
  "application/rtf": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rtf"]
  },
  "application/rtploopback": {
    "source": "iana"
  },
  "application/rtx": {
    "source": "iana"
  },
  "application/samlassertion+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/samlmetadata+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/sarif+json": {
    "source": "iana",
    "compressible": true
  },
  "application/sarif-external-properties+json": {
    "source": "iana",
    "compressible": true
  },
  "application/sbe": {
    "source": "iana"
  },
  "application/sbml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["sbml"]
  },
  "application/scaip+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/scim+json": {
    "source": "iana",
    "compressible": true
  },
  "application/scvp-cv-request": {
    "source": "iana",
    "extensions": ["scq"]
  },
  "application/scvp-cv-response": {
    "source": "iana",
    "extensions": ["scs"]
  },
  "application/scvp-vp-request": {
    "source": "iana",
    "extensions": ["spq"]
  },
  "application/scvp-vp-response": {
    "source": "iana",
    "extensions": ["spp"]
  },
  "application/sdp": {
    "source": "iana",
    "extensions": ["sdp"]
  },
  "application/secevent+jwt": {
    "source": "iana"
  },
  "application/senml+cbor": {
    "source": "iana"
  },
  "application/senml+json": {
    "source": "iana",
    "compressible": true
  },
  "application/senml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["senmlx"]
  },
  "application/senml-etch+cbor": {
    "source": "iana"
  },
  "application/senml-etch+json": {
    "source": "iana",
    "compressible": true
  },
  "application/senml-exi": {
    "source": "iana"
  },
  "application/sensml+cbor": {
    "source": "iana"
  },
  "application/sensml+json": {
    "source": "iana",
    "compressible": true
  },
  "application/sensml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["sensmlx"]
  },
  "application/sensml-exi": {
    "source": "iana"
  },
  "application/sep+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/sep-exi": {
    "source": "iana"
  },
  "application/session-info": {
    "source": "iana"
  },
  "application/set-payment": {
    "source": "iana"
  },
  "application/set-payment-initiation": {
    "source": "iana",
    "extensions": ["setpay"]
  },
  "application/set-registration": {
    "source": "iana"
  },
  "application/set-registration-initiation": {
    "source": "iana",
    "extensions": ["setreg"]
  },
  "application/sgml": {
    "source": "iana"
  },
  "application/sgml-open-catalog": {
    "source": "iana"
  },
  "application/shf+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["shf"]
  },
  "application/sieve": {
    "source": "iana",
    "extensions": ["siv","sieve"]
  },
  "application/simple-filter+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/simple-message-summary": {
    "source": "iana"
  },
  "application/simplesymbolcontainer": {
    "source": "iana"
  },
  "application/sipc": {
    "source": "iana"
  },
  "application/slate": {
    "source": "iana"
  },
  "application/smil": {
    "source": "iana"
  },
  "application/smil+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["smi","smil"]
  },
  "application/smpte336m": {
    "source": "iana"
  },
  "application/soap+fastinfoset": {
    "source": "iana"
  },
  "application/soap+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/sparql-query": {
    "source": "iana",
    "extensions": ["rq"]
  },
  "application/sparql-results+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["srx"]
  },
  "application/spdx+json": {
    "source": "iana",
    "compressible": true
  },
  "application/spirits-event+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/sql": {
    "source": "iana"
  },
  "application/srgs": {
    "source": "iana",
    "extensions": ["gram"]
  },
  "application/srgs+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["grxml"]
  },
  "application/sru+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["sru"]
  },
  "application/ssdl+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["ssdl"]
  },
  "application/ssml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["ssml"]
  },
  "application/stix+json": {
    "source": "iana",
    "compressible": true
  },
  "application/swid+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["swidtag"]
  },
  "application/tamp-apex-update": {
    "source": "iana"
  },
  "application/tamp-apex-update-confirm": {
    "source": "iana"
  },
  "application/tamp-community-update": {
    "source": "iana"
  },
  "application/tamp-community-update-confirm": {
    "source": "iana"
  },
  "application/tamp-error": {
    "source": "iana"
  },
  "application/tamp-sequence-adjust": {
    "source": "iana"
  },
  "application/tamp-sequence-adjust-confirm": {
    "source": "iana"
  },
  "application/tamp-status-query": {
    "source": "iana"
  },
  "application/tamp-status-response": {
    "source": "iana"
  },
  "application/tamp-update": {
    "source": "iana"
  },
  "application/tamp-update-confirm": {
    "source": "iana"
  },
  "application/tar": {
    "compressible": true
  },
  "application/taxii+json": {
    "source": "iana",
    "compressible": true
  },
  "application/td+json": {
    "source": "iana",
    "compressible": true
  },
  "application/tei+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["tei","teicorpus"]
  },
  "application/tetra_isi": {
    "source": "iana"
  },
  "application/thraud+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["tfi"]
  },
  "application/timestamp-query": {
    "source": "iana"
  },
  "application/timestamp-reply": {
    "source": "iana"
  },
  "application/timestamped-data": {
    "source": "iana",
    "extensions": ["tsd"]
  },
  "application/tlsrpt+gzip": {
    "source": "iana"
  },
  "application/tlsrpt+json": {
    "source": "iana",
    "compressible": true
  },
  "application/tnauthlist": {
    "source": "iana"
  },
  "application/token-introspection+jwt": {
    "source": "iana"
  },
  "application/toml": {
    "compressible": true,
    "extensions": ["toml"]
  },
  "application/trickle-ice-sdpfrag": {
    "source": "iana"
  },
  "application/trig": {
    "source": "iana",
    "extensions": ["trig"]
  },
  "application/ttml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["ttml"]
  },
  "application/tve-trigger": {
    "source": "iana"
  },
  "application/tzif": {
    "source": "iana"
  },
  "application/tzif-leap": {
    "source": "iana"
  },
  "application/ubjson": {
    "compressible": false,
    "extensions": ["ubj"]
  },
  "application/ulpfec": {
    "source": "iana"
  },
  "application/urc-grpsheet+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/urc-ressheet+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rsheet"]
  },
  "application/urc-targetdesc+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["td"]
  },
  "application/urc-uisocketdesc+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vcard+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vcard+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vemmi": {
    "source": "iana"
  },
  "application/vividence.scriptfile": {
    "source": "apache"
  },
  "application/vnd.1000minds.decision-model+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["1km"]
  },
  "application/vnd.3gpp-prose+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp-prose-pc3ch+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp-v2x-local-service-information": {
    "source": "iana"
  },
  "application/vnd.3gpp.5gnas": {
    "source": "iana"
  },
  "application/vnd.3gpp.access-transfer-events+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.bsf+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.gmop+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.gtpc": {
    "source": "iana"
  },
  "application/vnd.3gpp.interworking-data": {
    "source": "iana"
  },
  "application/vnd.3gpp.lpp": {
    "source": "iana"
  },
  "application/vnd.3gpp.mc-signalling-ear": {
    "source": "iana"
  },
  "application/vnd.3gpp.mcdata-affiliation-command+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcdata-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcdata-payload": {
    "source": "iana"
  },
  "application/vnd.3gpp.mcdata-service-config+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcdata-signalling": {
    "source": "iana"
  },
  "application/vnd.3gpp.mcdata-ue-config+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcdata-user-profile+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-affiliation-command+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-floor-request+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-location-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-mbms-usage-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-service-config+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-signed+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-ue-config+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-ue-init-config+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcptt-user-profile+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcvideo-affiliation-command+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcvideo-affiliation-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcvideo-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcvideo-location-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcvideo-mbms-usage-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcvideo-service-config+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcvideo-transmission-request+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcvideo-ue-config+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mcvideo-user-profile+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.mid-call+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.ngap": {
    "source": "iana"
  },
  "application/vnd.3gpp.pfcp": {
    "source": "iana"
  },
  "application/vnd.3gpp.pic-bw-large": {
    "source": "iana",
    "extensions": ["plb"]
  },
  "application/vnd.3gpp.pic-bw-small": {
    "source": "iana",
    "extensions": ["psb"]
  },
  "application/vnd.3gpp.pic-bw-var": {
    "source": "iana",
    "extensions": ["pvb"]
  },
  "application/vnd.3gpp.s1ap": {
    "source": "iana"
  },
  "application/vnd.3gpp.sms": {
    "source": "iana"
  },
  "application/vnd.3gpp.sms+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.srvcc-ext+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.srvcc-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.state-and-event-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp.ussd+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp2.bcmcsinfo+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.3gpp2.sms": {
    "source": "iana"
  },
  "application/vnd.3gpp2.tcap": {
    "source": "iana",
    "extensions": ["tcap"]
  },
  "application/vnd.3lightssoftware.imagescal": {
    "source": "iana"
  },
  "application/vnd.3m.post-it-notes": {
    "source": "iana",
    "extensions": ["pwn"]
  },
  "application/vnd.accpac.simply.aso": {
    "source": "iana",
    "extensions": ["aso"]
  },
  "application/vnd.accpac.simply.imp": {
    "source": "iana",
    "extensions": ["imp"]
  },
  "application/vnd.acucobol": {
    "source": "iana",
    "extensions": ["acu"]
  },
  "application/vnd.acucorp": {
    "source": "iana",
    "extensions": ["atc","acutc"]
  },
  "application/vnd.adobe.air-application-installer-package+zip": {
    "source": "apache",
    "compressible": false,
    "extensions": ["air"]
  },
  "application/vnd.adobe.flash.movie": {
    "source": "iana"
  },
  "application/vnd.adobe.formscentral.fcdt": {
    "source": "iana",
    "extensions": ["fcdt"]
  },
  "application/vnd.adobe.fxp": {
    "source": "iana",
    "extensions": ["fxp","fxpl"]
  },
  "application/vnd.adobe.partial-upload": {
    "source": "iana"
  },
  "application/vnd.adobe.xdp+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xdp"]
  },
  "application/vnd.adobe.xfdf": {
    "source": "iana",
    "extensions": ["xfdf"]
  },
  "application/vnd.aether.imp": {
    "source": "iana"
  },
  "application/vnd.afpc.afplinedata": {
    "source": "iana"
  },
  "application/vnd.afpc.afplinedata-pagedef": {
    "source": "iana"
  },
  "application/vnd.afpc.cmoca-cmresource": {
    "source": "iana"
  },
  "application/vnd.afpc.foca-charset": {
    "source": "iana"
  },
  "application/vnd.afpc.foca-codedfont": {
    "source": "iana"
  },
  "application/vnd.afpc.foca-codepage": {
    "source": "iana"
  },
  "application/vnd.afpc.modca": {
    "source": "iana"
  },
  "application/vnd.afpc.modca-cmtable": {
    "source": "iana"
  },
  "application/vnd.afpc.modca-formdef": {
    "source": "iana"
  },
  "application/vnd.afpc.modca-mediummap": {
    "source": "iana"
  },
  "application/vnd.afpc.modca-objectcontainer": {
    "source": "iana"
  },
  "application/vnd.afpc.modca-overlay": {
    "source": "iana"
  },
  "application/vnd.afpc.modca-pagesegment": {
    "source": "iana"
  },
  "application/vnd.age": {
    "source": "iana",
    "extensions": ["age"]
  },
  "application/vnd.ah-barcode": {
    "source": "iana"
  },
  "application/vnd.ahead.space": {
    "source": "iana",
    "extensions": ["ahead"]
  },
  "application/vnd.airzip.filesecure.azf": {
    "source": "iana",
    "extensions": ["azf"]
  },
  "application/vnd.airzip.filesecure.azs": {
    "source": "iana",
    "extensions": ["azs"]
  },
  "application/vnd.amadeus+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.amazon.ebook": {
    "source": "apache",
    "extensions": ["azw"]
  },
  "application/vnd.amazon.mobi8-ebook": {
    "source": "iana"
  },
  "application/vnd.americandynamics.acc": {
    "source": "iana",
    "extensions": ["acc"]
  },
  "application/vnd.amiga.ami": {
    "source": "iana",
    "extensions": ["ami"]
  },
  "application/vnd.amundsen.maze+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.android.ota": {
    "source": "iana"
  },
  "application/vnd.android.package-archive": {
    "source": "apache",
    "compressible": false,
    "extensions": ["apk"]
  },
  "application/vnd.anki": {
    "source": "iana"
  },
  "application/vnd.anser-web-certificate-issue-initiation": {
    "source": "iana",
    "extensions": ["cii"]
  },
  "application/vnd.anser-web-funds-transfer-initiation": {
    "source": "apache",
    "extensions": ["fti"]
  },
  "application/vnd.antix.game-component": {
    "source": "iana",
    "extensions": ["atx"]
  },
  "application/vnd.apache.arrow.file": {
    "source": "iana"
  },
  "application/vnd.apache.arrow.stream": {
    "source": "iana"
  },
  "application/vnd.apache.thrift.binary": {
    "source": "iana"
  },
  "application/vnd.apache.thrift.compact": {
    "source": "iana"
  },
  "application/vnd.apache.thrift.json": {
    "source": "iana"
  },
  "application/vnd.api+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.aplextor.warrp+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.apothekende.reservation+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.apple.installer+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mpkg"]
  },
  "application/vnd.apple.keynote": {
    "source": "iana",
    "extensions": ["key"]
  },
  "application/vnd.apple.mpegurl": {
    "source": "iana",
    "extensions": ["m3u8"]
  },
  "application/vnd.apple.numbers": {
    "source": "iana",
    "extensions": ["numbers"]
  },
  "application/vnd.apple.pages": {
    "source": "iana",
    "extensions": ["pages"]
  },
  "application/vnd.apple.pkpass": {
    "compressible": false,
    "extensions": ["pkpass"]
  },
  "application/vnd.arastra.swi": {
    "source": "iana"
  },
  "application/vnd.aristanetworks.swi": {
    "source": "iana",
    "extensions": ["swi"]
  },
  "application/vnd.artisan+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.artsquare": {
    "source": "iana"
  },
  "application/vnd.astraea-software.iota": {
    "source": "iana",
    "extensions": ["iota"]
  },
  "application/vnd.audiograph": {
    "source": "iana",
    "extensions": ["aep"]
  },
  "application/vnd.autopackage": {
    "source": "iana"
  },
  "application/vnd.avalon+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.avistar+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.balsamiq.bmml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["bmml"]
  },
  "application/vnd.balsamiq.bmpr": {
    "source": "iana"
  },
  "application/vnd.banana-accounting": {
    "source": "iana"
  },
  "application/vnd.bbf.usp.error": {
    "source": "iana"
  },
  "application/vnd.bbf.usp.msg": {
    "source": "iana"
  },
  "application/vnd.bbf.usp.msg+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.bekitzur-stech+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.bint.med-content": {
    "source": "iana"
  },
  "application/vnd.biopax.rdf+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.blink-idb-value-wrapper": {
    "source": "iana"
  },
  "application/vnd.blueice.multipass": {
    "source": "iana",
    "extensions": ["mpm"]
  },
  "application/vnd.bluetooth.ep.oob": {
    "source": "iana"
  },
  "application/vnd.bluetooth.le.oob": {
    "source": "iana"
  },
  "application/vnd.bmi": {
    "source": "iana",
    "extensions": ["bmi"]
  },
  "application/vnd.bpf": {
    "source": "iana"
  },
  "application/vnd.bpf3": {
    "source": "iana"
  },
  "application/vnd.businessobjects": {
    "source": "iana",
    "extensions": ["rep"]
  },
  "application/vnd.byu.uapi+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.cab-jscript": {
    "source": "iana"
  },
  "application/vnd.canon-cpdl": {
    "source": "iana"
  },
  "application/vnd.canon-lips": {
    "source": "iana"
  },
  "application/vnd.capasystems-pg+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.cendio.thinlinc.clientconf": {
    "source": "iana"
  },
  "application/vnd.century-systems.tcp_stream": {
    "source": "iana"
  },
  "application/vnd.chemdraw+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["cdxml"]
  },
  "application/vnd.chess-pgn": {
    "source": "iana"
  },
  "application/vnd.chipnuts.karaoke-mmd": {
    "source": "iana",
    "extensions": ["mmd"]
  },
  "application/vnd.ciedi": {
    "source": "iana"
  },
  "application/vnd.cinderella": {
    "source": "iana",
    "extensions": ["cdy"]
  },
  "application/vnd.cirpack.isdn-ext": {
    "source": "iana"
  },
  "application/vnd.citationstyles.style+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["csl"]
  },
  "application/vnd.claymore": {
    "source": "iana",
    "extensions": ["cla"]
  },
  "application/vnd.cloanto.rp9": {
    "source": "iana",
    "extensions": ["rp9"]
  },
  "application/vnd.clonk.c4group": {
    "source": "iana",
    "extensions": ["c4g","c4d","c4f","c4p","c4u"]
  },
  "application/vnd.cluetrust.cartomobile-config": {
    "source": "iana",
    "extensions": ["c11amc"]
  },
  "application/vnd.cluetrust.cartomobile-config-pkg": {
    "source": "iana",
    "extensions": ["c11amz"]
  },
  "application/vnd.coffeescript": {
    "source": "iana"
  },
  "application/vnd.collabio.xodocuments.document": {
    "source": "iana"
  },
  "application/vnd.collabio.xodocuments.document-template": {
    "source": "iana"
  },
  "application/vnd.collabio.xodocuments.presentation": {
    "source": "iana"
  },
  "application/vnd.collabio.xodocuments.presentation-template": {
    "source": "iana"
  },
  "application/vnd.collabio.xodocuments.spreadsheet": {
    "source": "iana"
  },
  "application/vnd.collabio.xodocuments.spreadsheet-template": {
    "source": "iana"
  },
  "application/vnd.collection+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.collection.doc+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.collection.next+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.comicbook+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.comicbook-rar": {
    "source": "iana"
  },
  "application/vnd.commerce-battelle": {
    "source": "iana"
  },
  "application/vnd.commonspace": {
    "source": "iana",
    "extensions": ["csp"]
  },
  "application/vnd.contact.cmsg": {
    "source": "iana",
    "extensions": ["cdbcmsg"]
  },
  "application/vnd.coreos.ignition+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.cosmocaller": {
    "source": "iana",
    "extensions": ["cmc"]
  },
  "application/vnd.crick.clicker": {
    "source": "iana",
    "extensions": ["clkx"]
  },
  "application/vnd.crick.clicker.keyboard": {
    "source": "iana",
    "extensions": ["clkk"]
  },
  "application/vnd.crick.clicker.palette": {
    "source": "iana",
    "extensions": ["clkp"]
  },
  "application/vnd.crick.clicker.template": {
    "source": "iana",
    "extensions": ["clkt"]
  },
  "application/vnd.crick.clicker.wordbank": {
    "source": "iana",
    "extensions": ["clkw"]
  },
  "application/vnd.criticaltools.wbs+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["wbs"]
  },
  "application/vnd.cryptii.pipe+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.crypto-shade-file": {
    "source": "iana"
  },
  "application/vnd.cryptomator.encrypted": {
    "source": "iana"
  },
  "application/vnd.cryptomator.vault": {
    "source": "iana"
  },
  "application/vnd.ctc-posml": {
    "source": "iana",
    "extensions": ["pml"]
  },
  "application/vnd.ctct.ws+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.cups-pdf": {
    "source": "iana"
  },
  "application/vnd.cups-postscript": {
    "source": "iana"
  },
  "application/vnd.cups-ppd": {
    "source": "iana",
    "extensions": ["ppd"]
  },
  "application/vnd.cups-raster": {
    "source": "iana"
  },
  "application/vnd.cups-raw": {
    "source": "iana"
  },
  "application/vnd.curl": {
    "source": "iana"
  },
  "application/vnd.curl.car": {
    "source": "apache",
    "extensions": ["car"]
  },
  "application/vnd.curl.pcurl": {
    "source": "apache",
    "extensions": ["pcurl"]
  },
  "application/vnd.cyan.dean.root+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.cybank": {
    "source": "iana"
  },
  "application/vnd.cyclonedx+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.cyclonedx+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.d2l.coursepackage1p0+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.d3m-dataset": {
    "source": "iana"
  },
  "application/vnd.d3m-problem": {
    "source": "iana"
  },
  "application/vnd.dart": {
    "source": "iana",
    "compressible": true,
    "extensions": ["dart"]
  },
  "application/vnd.data-vision.rdz": {
    "source": "iana",
    "extensions": ["rdz"]
  },
  "application/vnd.datapackage+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dataresource+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dbf": {
    "source": "iana",
    "extensions": ["dbf"]
  },
  "application/vnd.debian.binary-package": {
    "source": "iana"
  },
  "application/vnd.dece.data": {
    "source": "iana",
    "extensions": ["uvf","uvvf","uvd","uvvd"]
  },
  "application/vnd.dece.ttml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["uvt","uvvt"]
  },
  "application/vnd.dece.unspecified": {
    "source": "iana",
    "extensions": ["uvx","uvvx"]
  },
  "application/vnd.dece.zip": {
    "source": "iana",
    "extensions": ["uvz","uvvz"]
  },
  "application/vnd.denovo.fcselayout-link": {
    "source": "iana",
    "extensions": ["fe_launch"]
  },
  "application/vnd.desmume.movie": {
    "source": "iana"
  },
  "application/vnd.dir-bi.plate-dl-nosuffix": {
    "source": "iana"
  },
  "application/vnd.dm.delegation+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dna": {
    "source": "iana",
    "extensions": ["dna"]
  },
  "application/vnd.document+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dolby.mlp": {
    "source": "apache",
    "extensions": ["mlp"]
  },
  "application/vnd.dolby.mobile.1": {
    "source": "iana"
  },
  "application/vnd.dolby.mobile.2": {
    "source": "iana"
  },
  "application/vnd.doremir.scorecloud-binary-document": {
    "source": "iana"
  },
  "application/vnd.dpgraph": {
    "source": "iana",
    "extensions": ["dpg"]
  },
  "application/vnd.dreamfactory": {
    "source": "iana",
    "extensions": ["dfac"]
  },
  "application/vnd.drive+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ds-keypoint": {
    "source": "apache",
    "extensions": ["kpxx"]
  },
  "application/vnd.dtg.local": {
    "source": "iana"
  },
  "application/vnd.dtg.local.flash": {
    "source": "iana"
  },
  "application/vnd.dtg.local.html": {
    "source": "iana"
  },
  "application/vnd.dvb.ait": {
    "source": "iana",
    "extensions": ["ait"]
  },
  "application/vnd.dvb.dvbisl+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dvb.dvbj": {
    "source": "iana"
  },
  "application/vnd.dvb.esgcontainer": {
    "source": "iana"
  },
  "application/vnd.dvb.ipdcdftnotifaccess": {
    "source": "iana"
  },
  "application/vnd.dvb.ipdcesgaccess": {
    "source": "iana"
  },
  "application/vnd.dvb.ipdcesgaccess2": {
    "source": "iana"
  },
  "application/vnd.dvb.ipdcesgpdd": {
    "source": "iana"
  },
  "application/vnd.dvb.ipdcroaming": {
    "source": "iana"
  },
  "application/vnd.dvb.iptv.alfec-base": {
    "source": "iana"
  },
  "application/vnd.dvb.iptv.alfec-enhancement": {
    "source": "iana"
  },
  "application/vnd.dvb.notif-aggregate-root+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dvb.notif-container+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dvb.notif-generic+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dvb.notif-ia-msglist+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dvb.notif-ia-registration-request+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dvb.notif-ia-registration-response+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dvb.notif-init+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.dvb.pfr": {
    "source": "iana"
  },
  "application/vnd.dvb.service": {
    "source": "iana",
    "extensions": ["svc"]
  },
  "application/vnd.dxr": {
    "source": "iana"
  },
  "application/vnd.dynageo": {
    "source": "iana",
    "extensions": ["geo"]
  },
  "application/vnd.dzr": {
    "source": "iana"
  },
  "application/vnd.easykaraoke.cdgdownload": {
    "source": "iana"
  },
  "application/vnd.ecdis-update": {
    "source": "iana"
  },
  "application/vnd.ecip.rlp": {
    "source": "iana"
  },
  "application/vnd.eclipse.ditto+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ecowin.chart": {
    "source": "iana",
    "extensions": ["mag"]
  },
  "application/vnd.ecowin.filerequest": {
    "source": "iana"
  },
  "application/vnd.ecowin.fileupdate": {
    "source": "iana"
  },
  "application/vnd.ecowin.series": {
    "source": "iana"
  },
  "application/vnd.ecowin.seriesrequest": {
    "source": "iana"
  },
  "application/vnd.ecowin.seriesupdate": {
    "source": "iana"
  },
  "application/vnd.efi.img": {
    "source": "iana"
  },
  "application/vnd.efi.iso": {
    "source": "iana"
  },
  "application/vnd.emclient.accessrequest+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.enliven": {
    "source": "iana",
    "extensions": ["nml"]
  },
  "application/vnd.enphase.envoy": {
    "source": "iana"
  },
  "application/vnd.eprints.data+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.epson.esf": {
    "source": "iana",
    "extensions": ["esf"]
  },
  "application/vnd.epson.msf": {
    "source": "iana",
    "extensions": ["msf"]
  },
  "application/vnd.epson.quickanime": {
    "source": "iana",
    "extensions": ["qam"]
  },
  "application/vnd.epson.salt": {
    "source": "iana",
    "extensions": ["slt"]
  },
  "application/vnd.epson.ssf": {
    "source": "iana",
    "extensions": ["ssf"]
  },
  "application/vnd.ericsson.quickcall": {
    "source": "iana"
  },
  "application/vnd.espass-espass+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.eszigno3+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["es3","et3"]
  },
  "application/vnd.etsi.aoc+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.asic-e+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.etsi.asic-s+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.etsi.cug+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.iptvcommand+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.iptvdiscovery+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.iptvprofile+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.iptvsad-bc+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.iptvsad-cod+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.iptvsad-npvr+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.iptvservice+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.iptvsync+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.iptvueprofile+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.mcid+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.mheg5": {
    "source": "iana"
  },
  "application/vnd.etsi.overload-control-policy-dataset+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.pstn+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.sci+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.simservs+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.timestamp-token": {
    "source": "iana"
  },
  "application/vnd.etsi.tsl+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.etsi.tsl.der": {
    "source": "iana"
  },
  "application/vnd.eu.kasparian.car+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.eudora.data": {
    "source": "iana"
  },
  "application/vnd.evolv.ecig.profile": {
    "source": "iana"
  },
  "application/vnd.evolv.ecig.settings": {
    "source": "iana"
  },
  "application/vnd.evolv.ecig.theme": {
    "source": "iana"
  },
  "application/vnd.exstream-empower+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.exstream-package": {
    "source": "iana"
  },
  "application/vnd.ezpix-album": {
    "source": "iana",
    "extensions": ["ez2"]
  },
  "application/vnd.ezpix-package": {
    "source": "iana",
    "extensions": ["ez3"]
  },
  "application/vnd.f-secure.mobile": {
    "source": "iana"
  },
  "application/vnd.familysearch.gedcom+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.fastcopy-disk-image": {
    "source": "iana"
  },
  "application/vnd.fdf": {
    "source": "iana",
    "extensions": ["fdf"]
  },
  "application/vnd.fdsn.mseed": {
    "source": "iana",
    "extensions": ["mseed"]
  },
  "application/vnd.fdsn.seed": {
    "source": "iana",
    "extensions": ["seed","dataless"]
  },
  "application/vnd.ffsns": {
    "source": "iana"
  },
  "application/vnd.ficlab.flb+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.filmit.zfc": {
    "source": "iana"
  },
  "application/vnd.fints": {
    "source": "iana"
  },
  "application/vnd.firemonkeys.cloudcell": {
    "source": "iana"
  },
  "application/vnd.flographit": {
    "source": "iana",
    "extensions": ["gph"]
  },
  "application/vnd.fluxtime.clip": {
    "source": "iana",
    "extensions": ["ftc"]
  },
  "application/vnd.font-fontforge-sfd": {
    "source": "iana"
  },
  "application/vnd.framemaker": {
    "source": "iana",
    "extensions": ["fm","frame","maker","book"]
  },
  "application/vnd.frogans.fnc": {
    "source": "iana",
    "extensions": ["fnc"]
  },
  "application/vnd.frogans.ltf": {
    "source": "iana",
    "extensions": ["ltf"]
  },
  "application/vnd.fsc.weblaunch": {
    "source": "iana",
    "extensions": ["fsc"]
  },
  "application/vnd.fujifilm.fb.docuworks": {
    "source": "iana"
  },
  "application/vnd.fujifilm.fb.docuworks.binder": {
    "source": "iana"
  },
  "application/vnd.fujifilm.fb.docuworks.container": {
    "source": "iana"
  },
  "application/vnd.fujifilm.fb.jfi+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.fujitsu.oasys": {
    "source": "iana",
    "extensions": ["oas"]
  },
  "application/vnd.fujitsu.oasys2": {
    "source": "iana",
    "extensions": ["oa2"]
  },
  "application/vnd.fujitsu.oasys3": {
    "source": "iana",
    "extensions": ["oa3"]
  },
  "application/vnd.fujitsu.oasysgp": {
    "source": "iana",
    "extensions": ["fg5"]
  },
  "application/vnd.fujitsu.oasysprs": {
    "source": "iana",
    "extensions": ["bh2"]
  },
  "application/vnd.fujixerox.art-ex": {
    "source": "iana"
  },
  "application/vnd.fujixerox.art4": {
    "source": "iana"
  },
  "application/vnd.fujixerox.ddd": {
    "source": "iana",
    "extensions": ["ddd"]
  },
  "application/vnd.fujixerox.docuworks": {
    "source": "iana",
    "extensions": ["xdw"]
  },
  "application/vnd.fujixerox.docuworks.binder": {
    "source": "iana",
    "extensions": ["xbd"]
  },
  "application/vnd.fujixerox.docuworks.container": {
    "source": "iana"
  },
  "application/vnd.fujixerox.hbpl": {
    "source": "iana"
  },
  "application/vnd.fut-misnet": {
    "source": "iana"
  },
  "application/vnd.futoin+cbor": {
    "source": "iana"
  },
  "application/vnd.futoin+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.fuzzysheet": {
    "source": "iana",
    "extensions": ["fzs"]
  },
  "application/vnd.genomatix.tuxedo": {
    "source": "iana",
    "extensions": ["txd"]
  },
  "application/vnd.gentics.grd+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.geo+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.geocube+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.geogebra.file": {
    "source": "iana",
    "extensions": ["ggb"]
  },
  "application/vnd.geogebra.slides": {
    "source": "iana"
  },
  "application/vnd.geogebra.tool": {
    "source": "iana",
    "extensions": ["ggt"]
  },
  "application/vnd.geometry-explorer": {
    "source": "iana",
    "extensions": ["gex","gre"]
  },
  "application/vnd.geonext": {
    "source": "iana",
    "extensions": ["gxt"]
  },
  "application/vnd.geoplan": {
    "source": "iana",
    "extensions": ["g2w"]
  },
  "application/vnd.geospace": {
    "source": "iana",
    "extensions": ["g3w"]
  },
  "application/vnd.gerber": {
    "source": "iana"
  },
  "application/vnd.globalplatform.card-content-mgt": {
    "source": "iana"
  },
  "application/vnd.globalplatform.card-content-mgt-response": {
    "source": "iana"
  },
  "application/vnd.gmx": {
    "source": "iana",
    "extensions": ["gmx"]
  },
  "application/vnd.google-apps.document": {
    "compressible": false,
    "extensions": ["gdoc"]
  },
  "application/vnd.google-apps.presentation": {
    "compressible": false,
    "extensions": ["gslides"]
  },
  "application/vnd.google-apps.spreadsheet": {
    "compressible": false,
    "extensions": ["gsheet"]
  },
  "application/vnd.google-earth.kml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["kml"]
  },
  "application/vnd.google-earth.kmz": {
    "source": "iana",
    "compressible": false,
    "extensions": ["kmz"]
  },
  "application/vnd.gov.sk.e-form+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.gov.sk.e-form+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.gov.sk.xmldatacontainer+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.grafeq": {
    "source": "iana",
    "extensions": ["gqf","gqs"]
  },
  "application/vnd.gridmp": {
    "source": "iana"
  },
  "application/vnd.groove-account": {
    "source": "iana",
    "extensions": ["gac"]
  },
  "application/vnd.groove-help": {
    "source": "iana",
    "extensions": ["ghf"]
  },
  "application/vnd.groove-identity-message": {
    "source": "iana",
    "extensions": ["gim"]
  },
  "application/vnd.groove-injector": {
    "source": "iana",
    "extensions": ["grv"]
  },
  "application/vnd.groove-tool-message": {
    "source": "iana",
    "extensions": ["gtm"]
  },
  "application/vnd.groove-tool-template": {
    "source": "iana",
    "extensions": ["tpl"]
  },
  "application/vnd.groove-vcard": {
    "source": "iana",
    "extensions": ["vcg"]
  },
  "application/vnd.hal+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.hal+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["hal"]
  },
  "application/vnd.handheld-entertainment+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["zmm"]
  },
  "application/vnd.hbci": {
    "source": "iana",
    "extensions": ["hbci"]
  },
  "application/vnd.hc+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.hcl-bireports": {
    "source": "iana"
  },
  "application/vnd.hdt": {
    "source": "iana"
  },
  "application/vnd.heroku+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.hhe.lesson-player": {
    "source": "iana",
    "extensions": ["les"]
  },
  "application/vnd.hl7cda+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/vnd.hl7v2+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/vnd.hp-hpgl": {
    "source": "iana",
    "extensions": ["hpgl"]
  },
  "application/vnd.hp-hpid": {
    "source": "iana",
    "extensions": ["hpid"]
  },
  "application/vnd.hp-hps": {
    "source": "iana",
    "extensions": ["hps"]
  },
  "application/vnd.hp-jlyt": {
    "source": "iana",
    "extensions": ["jlt"]
  },
  "application/vnd.hp-pcl": {
    "source": "iana",
    "extensions": ["pcl"]
  },
  "application/vnd.hp-pclxl": {
    "source": "iana",
    "extensions": ["pclxl"]
  },
  "application/vnd.httphone": {
    "source": "iana"
  },
  "application/vnd.hydrostatix.sof-data": {
    "source": "iana",
    "extensions": ["sfd-hdstx"]
  },
  "application/vnd.hyper+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.hyper-item+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.hyperdrive+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.hzn-3d-crossword": {
    "source": "iana"
  },
  "application/vnd.ibm.afplinedata": {
    "source": "iana"
  },
  "application/vnd.ibm.electronic-media": {
    "source": "iana"
  },
  "application/vnd.ibm.minipay": {
    "source": "iana",
    "extensions": ["mpy"]
  },
  "application/vnd.ibm.modcap": {
    "source": "iana",
    "extensions": ["afp","listafp","list3820"]
  },
  "application/vnd.ibm.rights-management": {
    "source": "iana",
    "extensions": ["irm"]
  },
  "application/vnd.ibm.secure-container": {
    "source": "iana",
    "extensions": ["sc"]
  },
  "application/vnd.iccprofile": {
    "source": "iana",
    "extensions": ["icc","icm"]
  },
  "application/vnd.ieee.1905": {
    "source": "iana"
  },
  "application/vnd.igloader": {
    "source": "iana",
    "extensions": ["igl"]
  },
  "application/vnd.imagemeter.folder+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.imagemeter.image+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.immervision-ivp": {
    "source": "iana",
    "extensions": ["ivp"]
  },
  "application/vnd.immervision-ivu": {
    "source": "iana",
    "extensions": ["ivu"]
  },
  "application/vnd.ims.imsccv1p1": {
    "source": "iana"
  },
  "application/vnd.ims.imsccv1p2": {
    "source": "iana"
  },
  "application/vnd.ims.imsccv1p3": {
    "source": "iana"
  },
  "application/vnd.ims.lis.v2.result+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ims.lti.v2.toolconsumerprofile+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ims.lti.v2.toolproxy+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ims.lti.v2.toolproxy.id+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ims.lti.v2.toolsettings+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ims.lti.v2.toolsettings.simple+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.informedcontrol.rms+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.informix-visionary": {
    "source": "iana"
  },
  "application/vnd.infotech.project": {
    "source": "iana"
  },
  "application/vnd.infotech.project+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.innopath.wamp.notification": {
    "source": "iana"
  },
  "application/vnd.insors.igm": {
    "source": "iana",
    "extensions": ["igm"]
  },
  "application/vnd.intercon.formnet": {
    "source": "iana",
    "extensions": ["xpw","xpx"]
  },
  "application/vnd.intergeo": {
    "source": "iana",
    "extensions": ["i2g"]
  },
  "application/vnd.intertrust.digibox": {
    "source": "iana"
  },
  "application/vnd.intertrust.nncp": {
    "source": "iana"
  },
  "application/vnd.intu.qbo": {
    "source": "iana",
    "extensions": ["qbo"]
  },
  "application/vnd.intu.qfx": {
    "source": "iana",
    "extensions": ["qfx"]
  },
  "application/vnd.iptc.g2.catalogitem+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.iptc.g2.conceptitem+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.iptc.g2.knowledgeitem+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.iptc.g2.newsitem+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.iptc.g2.newsmessage+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.iptc.g2.packageitem+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.iptc.g2.planningitem+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ipunplugged.rcprofile": {
    "source": "iana",
    "extensions": ["rcprofile"]
  },
  "application/vnd.irepository.package+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["irp"]
  },
  "application/vnd.is-xpr": {
    "source": "iana",
    "extensions": ["xpr"]
  },
  "application/vnd.isac.fcs": {
    "source": "iana",
    "extensions": ["fcs"]
  },
  "application/vnd.iso11783-10+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.jam": {
    "source": "iana",
    "extensions": ["jam"]
  },
  "application/vnd.japannet-directory-service": {
    "source": "iana"
  },
  "application/vnd.japannet-jpnstore-wakeup": {
    "source": "iana"
  },
  "application/vnd.japannet-payment-wakeup": {
    "source": "iana"
  },
  "application/vnd.japannet-registration": {
    "source": "iana"
  },
  "application/vnd.japannet-registration-wakeup": {
    "source": "iana"
  },
  "application/vnd.japannet-setstore-wakeup": {
    "source": "iana"
  },
  "application/vnd.japannet-verification": {
    "source": "iana"
  },
  "application/vnd.japannet-verification-wakeup": {
    "source": "iana"
  },
  "application/vnd.jcp.javame.midlet-rms": {
    "source": "iana",
    "extensions": ["rms"]
  },
  "application/vnd.jisp": {
    "source": "iana",
    "extensions": ["jisp"]
  },
  "application/vnd.joost.joda-archive": {
    "source": "iana",
    "extensions": ["joda"]
  },
  "application/vnd.jsk.isdn-ngn": {
    "source": "iana"
  },
  "application/vnd.kahootz": {
    "source": "iana",
    "extensions": ["ktz","ktr"]
  },
  "application/vnd.kde.karbon": {
    "source": "iana",
    "extensions": ["karbon"]
  },
  "application/vnd.kde.kchart": {
    "source": "iana",
    "extensions": ["chrt"]
  },
  "application/vnd.kde.kformula": {
    "source": "iana",
    "extensions": ["kfo"]
  },
  "application/vnd.kde.kivio": {
    "source": "iana",
    "extensions": ["flw"]
  },
  "application/vnd.kde.kontour": {
    "source": "iana",
    "extensions": ["kon"]
  },
  "application/vnd.kde.kpresenter": {
    "source": "iana",
    "extensions": ["kpr","kpt"]
  },
  "application/vnd.kde.kspread": {
    "source": "iana",
    "extensions": ["ksp"]
  },
  "application/vnd.kde.kword": {
    "source": "iana",
    "extensions": ["kwd","kwt"]
  },
  "application/vnd.kenameaapp": {
    "source": "iana",
    "extensions": ["htke"]
  },
  "application/vnd.kidspiration": {
    "source": "iana",
    "extensions": ["kia"]
  },
  "application/vnd.kinar": {
    "source": "iana",
    "extensions": ["kne","knp"]
  },
  "application/vnd.koan": {
    "source": "iana",
    "extensions": ["skp","skd","skt","skm"]
  },
  "application/vnd.kodak-descriptor": {
    "source": "iana",
    "extensions": ["sse"]
  },
  "application/vnd.las": {
    "source": "iana"
  },
  "application/vnd.las.las+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.las.las+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["lasxml"]
  },
  "application/vnd.laszip": {
    "source": "iana"
  },
  "application/vnd.leap+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.liberty-request+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.llamagraphics.life-balance.desktop": {
    "source": "iana",
    "extensions": ["lbd"]
  },
  "application/vnd.llamagraphics.life-balance.exchange+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["lbe"]
  },
  "application/vnd.logipipe.circuit+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.loom": {
    "source": "iana"
  },
  "application/vnd.lotus-1-2-3": {
    "source": "iana",
    "extensions": ["123"]
  },
  "application/vnd.lotus-approach": {
    "source": "iana",
    "extensions": ["apr"]
  },
  "application/vnd.lotus-freelance": {
    "source": "iana",
    "extensions": ["pre"]
  },
  "application/vnd.lotus-notes": {
    "source": "iana",
    "extensions": ["nsf"]
  },
  "application/vnd.lotus-organizer": {
    "source": "iana",
    "extensions": ["org"]
  },
  "application/vnd.lotus-screencam": {
    "source": "iana",
    "extensions": ["scm"]
  },
  "application/vnd.lotus-wordpro": {
    "source": "iana",
    "extensions": ["lwp"]
  },
  "application/vnd.macports.portpkg": {
    "source": "iana",
    "extensions": ["portpkg"]
  },
  "application/vnd.mapbox-vector-tile": {
    "source": "iana",
    "extensions": ["mvt"]
  },
  "application/vnd.marlin.drm.actiontoken+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.marlin.drm.conftoken+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.marlin.drm.license+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.marlin.drm.mdcf": {
    "source": "iana"
  },
  "application/vnd.mason+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.maxar.archive.3tz+zip": {
    "source": "iana",
    "compressible": false
  },
  "application/vnd.maxmind.maxmind-db": {
    "source": "iana"
  },
  "application/vnd.mcd": {
    "source": "iana",
    "extensions": ["mcd"]
  },
  "application/vnd.medcalcdata": {
    "source": "iana",
    "extensions": ["mc1"]
  },
  "application/vnd.mediastation.cdkey": {
    "source": "iana",
    "extensions": ["cdkey"]
  },
  "application/vnd.meridian-slingshot": {
    "source": "iana"
  },
  "application/vnd.mfer": {
    "source": "iana",
    "extensions": ["mwf"]
  },
  "application/vnd.mfmp": {
    "source": "iana",
    "extensions": ["mfm"]
  },
  "application/vnd.micro+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.micrografx.flo": {
    "source": "iana",
    "extensions": ["flo"]
  },
  "application/vnd.micrografx.igx": {
    "source": "iana",
    "extensions": ["igx"]
  },
  "application/vnd.microsoft.portable-executable": {
    "source": "iana"
  },
  "application/vnd.microsoft.windows.thumbnail-cache": {
    "source": "iana"
  },
  "application/vnd.miele+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.mif": {
    "source": "iana",
    "extensions": ["mif"]
  },
  "application/vnd.minisoft-hp3000-save": {
    "source": "iana"
  },
  "application/vnd.mitsubishi.misty-guard.trustweb": {
    "source": "iana"
  },
  "application/vnd.mobius.daf": {
    "source": "iana",
    "extensions": ["daf"]
  },
  "application/vnd.mobius.dis": {
    "source": "iana",
    "extensions": ["dis"]
  },
  "application/vnd.mobius.mbk": {
    "source": "iana",
    "extensions": ["mbk"]
  },
  "application/vnd.mobius.mqy": {
    "source": "iana",
    "extensions": ["mqy"]
  },
  "application/vnd.mobius.msl": {
    "source": "iana",
    "extensions": ["msl"]
  },
  "application/vnd.mobius.plc": {
    "source": "iana",
    "extensions": ["plc"]
  },
  "application/vnd.mobius.txf": {
    "source": "iana",
    "extensions": ["txf"]
  },
  "application/vnd.mophun.application": {
    "source": "iana",
    "extensions": ["mpn"]
  },
  "application/vnd.mophun.certificate": {
    "source": "iana",
    "extensions": ["mpc"]
  },
  "application/vnd.motorola.flexsuite": {
    "source": "iana"
  },
  "application/vnd.motorola.flexsuite.adsi": {
    "source": "iana"
  },
  "application/vnd.motorola.flexsuite.fis": {
    "source": "iana"
  },
  "application/vnd.motorola.flexsuite.gotap": {
    "source": "iana"
  },
  "application/vnd.motorola.flexsuite.kmr": {
    "source": "iana"
  },
  "application/vnd.motorola.flexsuite.ttc": {
    "source": "iana"
  },
  "application/vnd.motorola.flexsuite.wem": {
    "source": "iana"
  },
  "application/vnd.motorola.iprm": {
    "source": "iana"
  },
  "application/vnd.mozilla.xul+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xul"]
  },
  "application/vnd.ms-3mfdocument": {
    "source": "iana"
  },
  "application/vnd.ms-artgalry": {
    "source": "iana",
    "extensions": ["cil"]
  },
  "application/vnd.ms-asf": {
    "source": "iana"
  },
  "application/vnd.ms-cab-compressed": {
    "source": "iana",
    "extensions": ["cab"]
  },
  "application/vnd.ms-color.iccprofile": {
    "source": "apache"
  },
  "application/vnd.ms-excel": {
    "source": "iana",
    "compressible": false,
    "extensions": ["xls","xlm","xla","xlc","xlt","xlw"]
  },
  "application/vnd.ms-excel.addin.macroenabled.12": {
    "source": "iana",
    "extensions": ["xlam"]
  },
  "application/vnd.ms-excel.sheet.binary.macroenabled.12": {
    "source": "iana",
    "extensions": ["xlsb"]
  },
  "application/vnd.ms-excel.sheet.macroenabled.12": {
    "source": "iana",
    "extensions": ["xlsm"]
  },
  "application/vnd.ms-excel.template.macroenabled.12": {
    "source": "iana",
    "extensions": ["xltm"]
  },
  "application/vnd.ms-fontobject": {
    "source": "iana",
    "compressible": true,
    "extensions": ["eot"]
  },
  "application/vnd.ms-htmlhelp": {
    "source": "iana",
    "extensions": ["chm"]
  },
  "application/vnd.ms-ims": {
    "source": "iana",
    "extensions": ["ims"]
  },
  "application/vnd.ms-lrm": {
    "source": "iana",
    "extensions": ["lrm"]
  },
  "application/vnd.ms-office.activex+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ms-officetheme": {
    "source": "iana",
    "extensions": ["thmx"]
  },
  "application/vnd.ms-opentype": {
    "source": "apache",
    "compressible": true
  },
  "application/vnd.ms-outlook": {
    "compressible": false,
    "extensions": ["msg"]
  },
  "application/vnd.ms-package.obfuscated-opentype": {
    "source": "apache"
  },
  "application/vnd.ms-pki.seccat": {
    "source": "apache",
    "extensions": ["cat"]
  },
  "application/vnd.ms-pki.stl": {
    "source": "apache",
    "extensions": ["stl"]
  },
  "application/vnd.ms-playready.initiator+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ms-powerpoint": {
    "source": "iana",
    "compressible": false,
    "extensions": ["ppt","pps","pot"]
  },
  "application/vnd.ms-powerpoint.addin.macroenabled.12": {
    "source": "iana",
    "extensions": ["ppam"]
  },
  "application/vnd.ms-powerpoint.presentation.macroenabled.12": {
    "source": "iana",
    "extensions": ["pptm"]
  },
  "application/vnd.ms-powerpoint.slide.macroenabled.12": {
    "source": "iana",
    "extensions": ["sldm"]
  },
  "application/vnd.ms-powerpoint.slideshow.macroenabled.12": {
    "source": "iana",
    "extensions": ["ppsm"]
  },
  "application/vnd.ms-powerpoint.template.macroenabled.12": {
    "source": "iana",
    "extensions": ["potm"]
  },
  "application/vnd.ms-printdevicecapabilities+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ms-printing.printticket+xml": {
    "source": "apache",
    "compressible": true
  },
  "application/vnd.ms-printschematicket+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ms-project": {
    "source": "iana",
    "extensions": ["mpp","mpt"]
  },
  "application/vnd.ms-tnef": {
    "source": "iana"
  },
  "application/vnd.ms-windows.devicepairing": {
    "source": "iana"
  },
  "application/vnd.ms-windows.nwprinting.oob": {
    "source": "iana"
  },
  "application/vnd.ms-windows.printerpairing": {
    "source": "iana"
  },
  "application/vnd.ms-windows.wsd.oob": {
    "source": "iana"
  },
  "application/vnd.ms-wmdrm.lic-chlg-req": {
    "source": "iana"
  },
  "application/vnd.ms-wmdrm.lic-resp": {
    "source": "iana"
  },
  "application/vnd.ms-wmdrm.meter-chlg-req": {
    "source": "iana"
  },
  "application/vnd.ms-wmdrm.meter-resp": {
    "source": "iana"
  },
  "application/vnd.ms-word.document.macroenabled.12": {
    "source": "iana",
    "extensions": ["docm"]
  },
  "application/vnd.ms-word.template.macroenabled.12": {
    "source": "iana",
    "extensions": ["dotm"]
  },
  "application/vnd.ms-works": {
    "source": "iana",
    "extensions": ["wps","wks","wcm","wdb"]
  },
  "application/vnd.ms-wpl": {
    "source": "iana",
    "extensions": ["wpl"]
  },
  "application/vnd.ms-xpsdocument": {
    "source": "iana",
    "compressible": false,
    "extensions": ["xps"]
  },
  "application/vnd.msa-disk-image": {
    "source": "iana"
  },
  "application/vnd.mseq": {
    "source": "iana",
    "extensions": ["mseq"]
  },
  "application/vnd.msign": {
    "source": "iana"
  },
  "application/vnd.multiad.creator": {
    "source": "iana"
  },
  "application/vnd.multiad.creator.cif": {
    "source": "iana"
  },
  "application/vnd.music-niff": {
    "source": "iana"
  },
  "application/vnd.musician": {
    "source": "iana",
    "extensions": ["mus"]
  },
  "application/vnd.muvee.style": {
    "source": "iana",
    "extensions": ["msty"]
  },
  "application/vnd.mynfc": {
    "source": "iana",
    "extensions": ["taglet"]
  },
  "application/vnd.nacamar.ybrid+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.ncd.control": {
    "source": "iana"
  },
  "application/vnd.ncd.reference": {
    "source": "iana"
  },
  "application/vnd.nearst.inv+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.nebumind.line": {
    "source": "iana"
  },
  "application/vnd.nervana": {
    "source": "iana"
  },
  "application/vnd.netfpx": {
    "source": "iana"
  },
  "application/vnd.neurolanguage.nlu": {
    "source": "iana",
    "extensions": ["nlu"]
  },
  "application/vnd.nimn": {
    "source": "iana"
  },
  "application/vnd.nintendo.nitro.rom": {
    "source": "iana"
  },
  "application/vnd.nintendo.snes.rom": {
    "source": "iana"
  },
  "application/vnd.nitf": {
    "source": "iana",
    "extensions": ["ntf","nitf"]
  },
  "application/vnd.noblenet-directory": {
    "source": "iana",
    "extensions": ["nnd"]
  },
  "application/vnd.noblenet-sealer": {
    "source": "iana",
    "extensions": ["nns"]
  },
  "application/vnd.noblenet-web": {
    "source": "iana",
    "extensions": ["nnw"]
  },
  "application/vnd.nokia.catalogs": {
    "source": "iana"
  },
  "application/vnd.nokia.conml+wbxml": {
    "source": "iana"
  },
  "application/vnd.nokia.conml+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.nokia.iptv.config+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.nokia.isds-radio-presets": {
    "source": "iana"
  },
  "application/vnd.nokia.landmark+wbxml": {
    "source": "iana"
  },
  "application/vnd.nokia.landmark+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.nokia.landmarkcollection+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.nokia.n-gage.ac+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["ac"]
  },
  "application/vnd.nokia.n-gage.data": {
    "source": "iana",
    "extensions": ["ngdat"]
  },
  "application/vnd.nokia.n-gage.symbian.install": {
    "source": "iana",
    "extensions": ["n-gage"]
  },
  "application/vnd.nokia.ncd": {
    "source": "iana"
  },
  "application/vnd.nokia.pcd+wbxml": {
    "source": "iana"
  },
  "application/vnd.nokia.pcd+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.nokia.radio-preset": {
    "source": "iana",
    "extensions": ["rpst"]
  },
  "application/vnd.nokia.radio-presets": {
    "source": "iana",
    "extensions": ["rpss"]
  },
  "application/vnd.novadigm.edm": {
    "source": "iana",
    "extensions": ["edm"]
  },
  "application/vnd.novadigm.edx": {
    "source": "iana",
    "extensions": ["edx"]
  },
  "application/vnd.novadigm.ext": {
    "source": "iana",
    "extensions": ["ext"]
  },
  "application/vnd.ntt-local.content-share": {
    "source": "iana"
  },
  "application/vnd.ntt-local.file-transfer": {
    "source": "iana"
  },
  "application/vnd.ntt-local.ogw_remote-access": {
    "source": "iana"
  },
  "application/vnd.ntt-local.sip-ta_remote": {
    "source": "iana"
  },
  "application/vnd.ntt-local.sip-ta_tcp_stream": {
    "source": "iana"
  },
  "application/vnd.oasis.opendocument.chart": {
    "source": "iana",
    "extensions": ["odc"]
  },
  "application/vnd.oasis.opendocument.chart-template": {
    "source": "iana",
    "extensions": ["otc"]
  },
  "application/vnd.oasis.opendocument.database": {
    "source": "iana",
    "extensions": ["odb"]
  },
  "application/vnd.oasis.opendocument.formula": {
    "source": "iana",
    "extensions": ["odf"]
  },
  "application/vnd.oasis.opendocument.formula-template": {
    "source": "iana",
    "extensions": ["odft"]
  },
  "application/vnd.oasis.opendocument.graphics": {
    "source": "iana",
    "compressible": false,
    "extensions": ["odg"]
  },
  "application/vnd.oasis.opendocument.graphics-template": {
    "source": "iana",
    "extensions": ["otg"]
  },
  "application/vnd.oasis.opendocument.image": {
    "source": "iana",
    "extensions": ["odi"]
  },
  "application/vnd.oasis.opendocument.image-template": {
    "source": "iana",
    "extensions": ["oti"]
  },
  "application/vnd.oasis.opendocument.presentation": {
    "source": "iana",
    "compressible": false,
    "extensions": ["odp"]
  },
  "application/vnd.oasis.opendocument.presentation-template": {
    "source": "iana",
    "extensions": ["otp"]
  },
  "application/vnd.oasis.opendocument.spreadsheet": {
    "source": "iana",
    "compressible": false,
    "extensions": ["ods"]
  },
  "application/vnd.oasis.opendocument.spreadsheet-template": {
    "source": "iana",
    "extensions": ["ots"]
  },
  "application/vnd.oasis.opendocument.text": {
    "source": "iana",
    "compressible": false,
    "extensions": ["odt"]
  },
  "application/vnd.oasis.opendocument.text-master": {
    "source": "iana",
    "extensions": ["odm"]
  },
  "application/vnd.oasis.opendocument.text-template": {
    "source": "iana",
    "extensions": ["ott"]
  },
  "application/vnd.oasis.opendocument.text-web": {
    "source": "iana",
    "extensions": ["oth"]
  },
  "application/vnd.obn": {
    "source": "iana"
  },
  "application/vnd.ocf+cbor": {
    "source": "iana"
  },
  "application/vnd.oci.image.manifest.v1+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oftn.l10n+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oipf.contentaccessdownload+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oipf.contentaccessstreaming+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oipf.cspg-hexbinary": {
    "source": "iana"
  },
  "application/vnd.oipf.dae.svg+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oipf.dae.xhtml+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oipf.mippvcontrolmessage+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oipf.pae.gem": {
    "source": "iana"
  },
  "application/vnd.oipf.spdiscovery+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oipf.spdlist+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oipf.ueprofile+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oipf.userprofile+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.olpc-sugar": {
    "source": "iana",
    "extensions": ["xo"]
  },
  "application/vnd.oma-scws-config": {
    "source": "iana"
  },
  "application/vnd.oma-scws-http-request": {
    "source": "iana"
  },
  "application/vnd.oma-scws-http-response": {
    "source": "iana"
  },
  "application/vnd.oma.bcast.associated-procedure-parameter+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.bcast.drm-trigger+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.bcast.imd+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.bcast.ltkm": {
    "source": "iana"
  },
  "application/vnd.oma.bcast.notification+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.bcast.provisioningtrigger": {
    "source": "iana"
  },
  "application/vnd.oma.bcast.sgboot": {
    "source": "iana"
  },
  "application/vnd.oma.bcast.sgdd+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.bcast.sgdu": {
    "source": "iana"
  },
  "application/vnd.oma.bcast.simple-symbol-container": {
    "source": "iana"
  },
  "application/vnd.oma.bcast.smartcard-trigger+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.bcast.sprov+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.bcast.stkm": {
    "source": "iana"
  },
  "application/vnd.oma.cab-address-book+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.cab-feature-handler+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.cab-pcc+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.cab-subs-invite+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.cab-user-prefs+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.dcd": {
    "source": "iana"
  },
  "application/vnd.oma.dcdc": {
    "source": "iana"
  },
  "application/vnd.oma.dd2+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["dd2"]
  },
  "application/vnd.oma.drm.risd+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.group-usage-list+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.lwm2m+cbor": {
    "source": "iana"
  },
  "application/vnd.oma.lwm2m+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.lwm2m+tlv": {
    "source": "iana"
  },
  "application/vnd.oma.pal+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.poc.detailed-progress-report+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.poc.final-report+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.poc.groups+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.poc.invocation-descriptor+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.poc.optimized-progress-report+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.push": {
    "source": "iana"
  },
  "application/vnd.oma.scidm.messages+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oma.xcap-directory+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.omads-email+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/vnd.omads-file+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/vnd.omads-folder+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/vnd.omaloc-supl-init": {
    "source": "iana"
  },
  "application/vnd.onepager": {
    "source": "iana"
  },
  "application/vnd.onepagertamp": {
    "source": "iana"
  },
  "application/vnd.onepagertamx": {
    "source": "iana"
  },
  "application/vnd.onepagertat": {
    "source": "iana"
  },
  "application/vnd.onepagertatp": {
    "source": "iana"
  },
  "application/vnd.onepagertatx": {
    "source": "iana"
  },
  "application/vnd.openblox.game+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["obgx"]
  },
  "application/vnd.openblox.game-binary": {
    "source": "iana"
  },
  "application/vnd.openeye.oeb": {
    "source": "iana"
  },
  "application/vnd.openofficeorg.extension": {
    "source": "apache",
    "extensions": ["oxt"]
  },
  "application/vnd.openstreetmap.data+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["osm"]
  },
  "application/vnd.opentimestamps.ots": {
    "source": "iana"
  },
  "application/vnd.openxmlformats-officedocument.custom-properties+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.customxmlproperties+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.drawing+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.extended-properties+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.comments+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.presentation": {
    "source": "iana",
    "compressible": false,
    "extensions": ["pptx"]
  },
  "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.slide": {
    "source": "iana",
    "extensions": ["sldx"]
  },
  "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.slideshow": {
    "source": "iana",
    "extensions": ["ppsx"]
  },
  "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.tags+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.template": {
    "source": "iana",
    "extensions": ["potx"]
  },
  "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": {
    "source": "iana",
    "compressible": false,
    "extensions": ["xlsx"]
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.template": {
    "source": "iana",
    "extensions": ["xltx"]
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.theme+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.themeoverride+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.vmldrawing": {
    "source": "iana"
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.document": {
    "source": "iana",
    "compressible": false,
    "extensions": ["docx"]
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.template": {
    "source": "iana",
    "extensions": ["dotx"]
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-package.core-properties+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.openxmlformats-package.relationships+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oracle.resource+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.orange.indata": {
    "source": "iana"
  },
  "application/vnd.osa.netdeploy": {
    "source": "iana"
  },
  "application/vnd.osgeo.mapguide.package": {
    "source": "iana",
    "extensions": ["mgp"]
  },
  "application/vnd.osgi.bundle": {
    "source": "iana"
  },
  "application/vnd.osgi.dp": {
    "source": "iana",
    "extensions": ["dp"]
  },
  "application/vnd.osgi.subsystem": {
    "source": "iana",
    "extensions": ["esa"]
  },
  "application/vnd.otps.ct-kip+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.oxli.countgraph": {
    "source": "iana"
  },
  "application/vnd.pagerduty+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.palm": {
    "source": "iana",
    "extensions": ["pdb","pqa","oprc"]
  },
  "application/vnd.panoply": {
    "source": "iana"
  },
  "application/vnd.paos.xml": {
    "source": "iana"
  },
  "application/vnd.patentdive": {
    "source": "iana"
  },
  "application/vnd.patientecommsdoc": {
    "source": "iana"
  },
  "application/vnd.pawaafile": {
    "source": "iana",
    "extensions": ["paw"]
  },
  "application/vnd.pcos": {
    "source": "iana"
  },
  "application/vnd.pg.format": {
    "source": "iana",
    "extensions": ["str"]
  },
  "application/vnd.pg.osasli": {
    "source": "iana",
    "extensions": ["ei6"]
  },
  "application/vnd.piaccess.application-licence": {
    "source": "iana"
  },
  "application/vnd.picsel": {
    "source": "iana",
    "extensions": ["efif"]
  },
  "application/vnd.pmi.widget": {
    "source": "iana",
    "extensions": ["wg"]
  },
  "application/vnd.poc.group-advertisement+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.pocketlearn": {
    "source": "iana",
    "extensions": ["plf"]
  },
  "application/vnd.powerbuilder6": {
    "source": "iana",
    "extensions": ["pbd"]
  },
  "application/vnd.powerbuilder6-s": {
    "source": "iana"
  },
  "application/vnd.powerbuilder7": {
    "source": "iana"
  },
  "application/vnd.powerbuilder7-s": {
    "source": "iana"
  },
  "application/vnd.powerbuilder75": {
    "source": "iana"
  },
  "application/vnd.powerbuilder75-s": {
    "source": "iana"
  },
  "application/vnd.preminet": {
    "source": "iana"
  },
  "application/vnd.previewsystems.box": {
    "source": "iana",
    "extensions": ["box"]
  },
  "application/vnd.proteus.magazine": {
    "source": "iana",
    "extensions": ["mgz"]
  },
  "application/vnd.psfs": {
    "source": "iana"
  },
  "application/vnd.publishare-delta-tree": {
    "source": "iana",
    "extensions": ["qps"]
  },
  "application/vnd.pvi.ptid1": {
    "source": "iana",
    "extensions": ["ptid"]
  },
  "application/vnd.pwg-multiplexed": {
    "source": "iana"
  },
  "application/vnd.pwg-xhtml-print+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.qualcomm.brew-app-res": {
    "source": "iana"
  },
  "application/vnd.quarantainenet": {
    "source": "iana"
  },
  "application/vnd.quark.quarkxpress": {
    "source": "iana",
    "extensions": ["qxd","qxt","qwd","qwt","qxl","qxb"]
  },
  "application/vnd.quobject-quoxdocument": {
    "source": "iana"
  },
  "application/vnd.radisys.moml+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-audit+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-audit-conf+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-audit-conn+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-audit-dialog+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-audit-stream+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-conf+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-dialog+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-dialog-base+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-dialog-fax-detect+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-dialog-fax-sendrecv+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-dialog-group+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-dialog-speech+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.radisys.msml-dialog-transform+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.rainstor.data": {
    "source": "iana"
  },
  "application/vnd.rapid": {
    "source": "iana"
  },
  "application/vnd.rar": {
    "source": "iana",
    "extensions": ["rar"]
  },
  "application/vnd.realvnc.bed": {
    "source": "iana",
    "extensions": ["bed"]
  },
  "application/vnd.recordare.musicxml": {
    "source": "iana",
    "extensions": ["mxl"]
  },
  "application/vnd.recordare.musicxml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["musicxml"]
  },
  "application/vnd.renlearn.rlprint": {
    "source": "iana"
  },
  "application/vnd.resilient.logic": {
    "source": "iana"
  },
  "application/vnd.restful+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.rig.cryptonote": {
    "source": "iana",
    "extensions": ["cryptonote"]
  },
  "application/vnd.rim.cod": {
    "source": "apache",
    "extensions": ["cod"]
  },
  "application/vnd.rn-realmedia": {
    "source": "apache",
    "extensions": ["rm"]
  },
  "application/vnd.rn-realmedia-vbr": {
    "source": "apache",
    "extensions": ["rmvb"]
  },
  "application/vnd.route66.link66+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["link66"]
  },
  "application/vnd.rs-274x": {
    "source": "iana"
  },
  "application/vnd.ruckus.download": {
    "source": "iana"
  },
  "application/vnd.s3sms": {
    "source": "iana"
  },
  "application/vnd.sailingtracker.track": {
    "source": "iana",
    "extensions": ["st"]
  },
  "application/vnd.sar": {
    "source": "iana"
  },
  "application/vnd.sbm.cid": {
    "source": "iana"
  },
  "application/vnd.sbm.mid2": {
    "source": "iana"
  },
  "application/vnd.scribus": {
    "source": "iana"
  },
  "application/vnd.sealed.3df": {
    "source": "iana"
  },
  "application/vnd.sealed.csf": {
    "source": "iana"
  },
  "application/vnd.sealed.doc": {
    "source": "iana"
  },
  "application/vnd.sealed.eml": {
    "source": "iana"
  },
  "application/vnd.sealed.mht": {
    "source": "iana"
  },
  "application/vnd.sealed.net": {
    "source": "iana"
  },
  "application/vnd.sealed.ppt": {
    "source": "iana"
  },
  "application/vnd.sealed.tiff": {
    "source": "iana"
  },
  "application/vnd.sealed.xls": {
    "source": "iana"
  },
  "application/vnd.sealedmedia.softseal.html": {
    "source": "iana"
  },
  "application/vnd.sealedmedia.softseal.pdf": {
    "source": "iana"
  },
  "application/vnd.seemail": {
    "source": "iana",
    "extensions": ["see"]
  },
  "application/vnd.seis+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.sema": {
    "source": "iana",
    "extensions": ["sema"]
  },
  "application/vnd.semd": {
    "source": "iana",
    "extensions": ["semd"]
  },
  "application/vnd.semf": {
    "source": "iana",
    "extensions": ["semf"]
  },
  "application/vnd.shade-save-file": {
    "source": "iana"
  },
  "application/vnd.shana.informed.formdata": {
    "source": "iana",
    "extensions": ["ifm"]
  },
  "application/vnd.shana.informed.formtemplate": {
    "source": "iana",
    "extensions": ["itp"]
  },
  "application/vnd.shana.informed.interchange": {
    "source": "iana",
    "extensions": ["iif"]
  },
  "application/vnd.shana.informed.package": {
    "source": "iana",
    "extensions": ["ipk"]
  },
  "application/vnd.shootproof+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.shopkick+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.shp": {
    "source": "iana"
  },
  "application/vnd.shx": {
    "source": "iana"
  },
  "application/vnd.sigrok.session": {
    "source": "iana"
  },
  "application/vnd.simtech-mindmapper": {
    "source": "iana",
    "extensions": ["twd","twds"]
  },
  "application/vnd.siren+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.smaf": {
    "source": "iana",
    "extensions": ["mmf"]
  },
  "application/vnd.smart.notebook": {
    "source": "iana"
  },
  "application/vnd.smart.teacher": {
    "source": "iana",
    "extensions": ["teacher"]
  },
  "application/vnd.snesdev-page-table": {
    "source": "iana"
  },
  "application/vnd.software602.filler.form+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["fo"]
  },
  "application/vnd.software602.filler.form-xml-zip": {
    "source": "iana"
  },
  "application/vnd.solent.sdkm+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["sdkm","sdkd"]
  },
  "application/vnd.spotfire.dxp": {
    "source": "iana",
    "extensions": ["dxp"]
  },
  "application/vnd.spotfire.sfs": {
    "source": "iana",
    "extensions": ["sfs"]
  },
  "application/vnd.sqlite3": {
    "source": "iana"
  },
  "application/vnd.sss-cod": {
    "source": "iana"
  },
  "application/vnd.sss-dtf": {
    "source": "iana"
  },
  "application/vnd.sss-ntf": {
    "source": "iana"
  },
  "application/vnd.stardivision.calc": {
    "source": "apache",
    "extensions": ["sdc"]
  },
  "application/vnd.stardivision.draw": {
    "source": "apache",
    "extensions": ["sda"]
  },
  "application/vnd.stardivision.impress": {
    "source": "apache",
    "extensions": ["sdd"]
  },
  "application/vnd.stardivision.math": {
    "source": "apache",
    "extensions": ["smf"]
  },
  "application/vnd.stardivision.writer": {
    "source": "apache",
    "extensions": ["sdw","vor"]
  },
  "application/vnd.stardivision.writer-global": {
    "source": "apache",
    "extensions": ["sgl"]
  },
  "application/vnd.stepmania.package": {
    "source": "iana",
    "extensions": ["smzip"]
  },
  "application/vnd.stepmania.stepchart": {
    "source": "iana",
    "extensions": ["sm"]
  },
  "application/vnd.street-stream": {
    "source": "iana"
  },
  "application/vnd.sun.wadl+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["wadl"]
  },
  "application/vnd.sun.xml.calc": {
    "source": "apache",
    "extensions": ["sxc"]
  },
  "application/vnd.sun.xml.calc.template": {
    "source": "apache",
    "extensions": ["stc"]
  },
  "application/vnd.sun.xml.draw": {
    "source": "apache",
    "extensions": ["sxd"]
  },
  "application/vnd.sun.xml.draw.template": {
    "source": "apache",
    "extensions": ["std"]
  },
  "application/vnd.sun.xml.impress": {
    "source": "apache",
    "extensions": ["sxi"]
  },
  "application/vnd.sun.xml.impress.template": {
    "source": "apache",
    "extensions": ["sti"]
  },
  "application/vnd.sun.xml.math": {
    "source": "apache",
    "extensions": ["sxm"]
  },
  "application/vnd.sun.xml.writer": {
    "source": "apache",
    "extensions": ["sxw"]
  },
  "application/vnd.sun.xml.writer.global": {
    "source": "apache",
    "extensions": ["sxg"]
  },
  "application/vnd.sun.xml.writer.template": {
    "source": "apache",
    "extensions": ["stw"]
  },
  "application/vnd.sus-calendar": {
    "source": "iana",
    "extensions": ["sus","susp"]
  },
  "application/vnd.svd": {
    "source": "iana",
    "extensions": ["svd"]
  },
  "application/vnd.swiftview-ics": {
    "source": "iana"
  },
  "application/vnd.sycle+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.syft+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.symbian.install": {
    "source": "apache",
    "extensions": ["sis","sisx"]
  },
  "application/vnd.syncml+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true,
    "extensions": ["xsm"]
  },
  "application/vnd.syncml.dm+wbxml": {
    "source": "iana",
    "charset": "UTF-8",
    "extensions": ["bdm"]
  },
  "application/vnd.syncml.dm+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true,
    "extensions": ["xdm"]
  },
  "application/vnd.syncml.dm.notification": {
    "source": "iana"
  },
  "application/vnd.syncml.dmddf+wbxml": {
    "source": "iana"
  },
  "application/vnd.syncml.dmddf+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true,
    "extensions": ["ddf"]
  },
  "application/vnd.syncml.dmtnds+wbxml": {
    "source": "iana"
  },
  "application/vnd.syncml.dmtnds+xml": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true
  },
  "application/vnd.syncml.ds.notification": {
    "source": "iana"
  },
  "application/vnd.tableschema+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.tao.intent-module-archive": {
    "source": "iana",
    "extensions": ["tao"]
  },
  "application/vnd.tcpdump.pcap": {
    "source": "iana",
    "extensions": ["pcap","cap","dmp"]
  },
  "application/vnd.think-cell.ppttc+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.tmd.mediaflex.api+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.tml": {
    "source": "iana"
  },
  "application/vnd.tmobile-livetv": {
    "source": "iana",
    "extensions": ["tmo"]
  },
  "application/vnd.tri.onesource": {
    "source": "iana"
  },
  "application/vnd.trid.tpt": {
    "source": "iana",
    "extensions": ["tpt"]
  },
  "application/vnd.triscape.mxs": {
    "source": "iana",
    "extensions": ["mxs"]
  },
  "application/vnd.trueapp": {
    "source": "iana",
    "extensions": ["tra"]
  },
  "application/vnd.truedoc": {
    "source": "iana"
  },
  "application/vnd.ubisoft.webplayer": {
    "source": "iana"
  },
  "application/vnd.ufdl": {
    "source": "iana",
    "extensions": ["ufd","ufdl"]
  },
  "application/vnd.uiq.theme": {
    "source": "iana",
    "extensions": ["utz"]
  },
  "application/vnd.umajin": {
    "source": "iana",
    "extensions": ["umj"]
  },
  "application/vnd.unity": {
    "source": "iana",
    "extensions": ["unityweb"]
  },
  "application/vnd.uoml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["uoml"]
  },
  "application/vnd.uplanet.alert": {
    "source": "iana"
  },
  "application/vnd.uplanet.alert-wbxml": {
    "source": "iana"
  },
  "application/vnd.uplanet.bearer-choice": {
    "source": "iana"
  },
  "application/vnd.uplanet.bearer-choice-wbxml": {
    "source": "iana"
  },
  "application/vnd.uplanet.cacheop": {
    "source": "iana"
  },
  "application/vnd.uplanet.cacheop-wbxml": {
    "source": "iana"
  },
  "application/vnd.uplanet.channel": {
    "source": "iana"
  },
  "application/vnd.uplanet.channel-wbxml": {
    "source": "iana"
  },
  "application/vnd.uplanet.list": {
    "source": "iana"
  },
  "application/vnd.uplanet.list-wbxml": {
    "source": "iana"
  },
  "application/vnd.uplanet.listcmd": {
    "source": "iana"
  },
  "application/vnd.uplanet.listcmd-wbxml": {
    "source": "iana"
  },
  "application/vnd.uplanet.signal": {
    "source": "iana"
  },
  "application/vnd.uri-map": {
    "source": "iana"
  },
  "application/vnd.valve.source.material": {
    "source": "iana"
  },
  "application/vnd.vcx": {
    "source": "iana",
    "extensions": ["vcx"]
  },
  "application/vnd.vd-study": {
    "source": "iana"
  },
  "application/vnd.vectorworks": {
    "source": "iana"
  },
  "application/vnd.vel+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.verimatrix.vcas": {
    "source": "iana"
  },
  "application/vnd.veritone.aion+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.veryant.thin": {
    "source": "iana"
  },
  "application/vnd.ves.encrypted": {
    "source": "iana"
  },
  "application/vnd.vidsoft.vidconference": {
    "source": "iana"
  },
  "application/vnd.visio": {
    "source": "iana",
    "extensions": ["vsd","vst","vss","vsw"]
  },
  "application/vnd.visionary": {
    "source": "iana",
    "extensions": ["vis"]
  },
  "application/vnd.vividence.scriptfile": {
    "source": "iana"
  },
  "application/vnd.vsf": {
    "source": "iana",
    "extensions": ["vsf"]
  },
  "application/vnd.wap.sic": {
    "source": "iana"
  },
  "application/vnd.wap.slc": {
    "source": "iana"
  },
  "application/vnd.wap.wbxml": {
    "source": "iana",
    "charset": "UTF-8",
    "extensions": ["wbxml"]
  },
  "application/vnd.wap.wmlc": {
    "source": "iana",
    "extensions": ["wmlc"]
  },
  "application/vnd.wap.wmlscriptc": {
    "source": "iana",
    "extensions": ["wmlsc"]
  },
  "application/vnd.webturbo": {
    "source": "iana",
    "extensions": ["wtb"]
  },
  "application/vnd.wfa.dpp": {
    "source": "iana"
  },
  "application/vnd.wfa.p2p": {
    "source": "iana"
  },
  "application/vnd.wfa.wsc": {
    "source": "iana"
  },
  "application/vnd.windows.devicepairing": {
    "source": "iana"
  },
  "application/vnd.wmc": {
    "source": "iana"
  },
  "application/vnd.wmf.bootstrap": {
    "source": "iana"
  },
  "application/vnd.wolfram.mathematica": {
    "source": "iana"
  },
  "application/vnd.wolfram.mathematica.package": {
    "source": "iana"
  },
  "application/vnd.wolfram.player": {
    "source": "iana",
    "extensions": ["nbp"]
  },
  "application/vnd.wordperfect": {
    "source": "iana",
    "extensions": ["wpd"]
  },
  "application/vnd.wqd": {
    "source": "iana",
    "extensions": ["wqd"]
  },
  "application/vnd.wrq-hp3000-labelled": {
    "source": "iana"
  },
  "application/vnd.wt.stf": {
    "source": "iana",
    "extensions": ["stf"]
  },
  "application/vnd.wv.csp+wbxml": {
    "source": "iana"
  },
  "application/vnd.wv.csp+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.wv.ssp+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.xacml+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.xara": {
    "source": "iana",
    "extensions": ["xar"]
  },
  "application/vnd.xfdl": {
    "source": "iana",
    "extensions": ["xfdl"]
  },
  "application/vnd.xfdl.webform": {
    "source": "iana"
  },
  "application/vnd.xmi+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/vnd.xmpie.cpkg": {
    "source": "iana"
  },
  "application/vnd.xmpie.dpkg": {
    "source": "iana"
  },
  "application/vnd.xmpie.plan": {
    "source": "iana"
  },
  "application/vnd.xmpie.ppkg": {
    "source": "iana"
  },
  "application/vnd.xmpie.xlim": {
    "source": "iana"
  },
  "application/vnd.yamaha.hv-dic": {
    "source": "iana",
    "extensions": ["hvd"]
  },
  "application/vnd.yamaha.hv-script": {
    "source": "iana",
    "extensions": ["hvs"]
  },
  "application/vnd.yamaha.hv-voice": {
    "source": "iana",
    "extensions": ["hvp"]
  },
  "application/vnd.yamaha.openscoreformat": {
    "source": "iana",
    "extensions": ["osf"]
  },
  "application/vnd.yamaha.openscoreformat.osfpvg+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["osfpvg"]
  },
  "application/vnd.yamaha.remote-setup": {
    "source": "iana"
  },
  "application/vnd.yamaha.smaf-audio": {
    "source": "iana",
    "extensions": ["saf"]
  },
  "application/vnd.yamaha.smaf-phrase": {
    "source": "iana",
    "extensions": ["spf"]
  },
  "application/vnd.yamaha.through-ngn": {
    "source": "iana"
  },
  "application/vnd.yamaha.tunnel-udpencap": {
    "source": "iana"
  },
  "application/vnd.yaoweme": {
    "source": "iana"
  },
  "application/vnd.yellowriver-custom-menu": {
    "source": "iana",
    "extensions": ["cmp"]
  },
  "application/vnd.youtube.yt": {
    "source": "iana"
  },
  "application/vnd.zul": {
    "source": "iana",
    "extensions": ["zir","zirz"]
  },
  "application/vnd.zzazz.deck+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["zaz"]
  },
  "application/voicexml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["vxml"]
  },
  "application/voucher-cms+json": {
    "source": "iana",
    "compressible": true
  },
  "application/vq-rtcpxr": {
    "source": "iana"
  },
  "application/wasm": {
    "source": "iana",
    "compressible": true,
    "extensions": ["wasm"]
  },
  "application/watcherinfo+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["wif"]
  },
  "application/webpush-options+json": {
    "source": "iana",
    "compressible": true
  },
  "application/whoispp-query": {
    "source": "iana"
  },
  "application/whoispp-response": {
    "source": "iana"
  },
  "application/widget": {
    "source": "iana",
    "extensions": ["wgt"]
  },
  "application/winhlp": {
    "source": "apache",
    "extensions": ["hlp"]
  },
  "application/wita": {
    "source": "iana"
  },
  "application/wordperfect5.1": {
    "source": "iana"
  },
  "application/wsdl+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["wsdl"]
  },
  "application/wspolicy+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["wspolicy"]
  },
  "application/x-7z-compressed": {
    "source": "apache",
    "compressible": false,
    "extensions": ["7z"]
  },
  "application/x-abiword": {
    "source": "apache",
    "extensions": ["abw"]
  },
  "application/x-ace-compressed": {
    "source": "apache",
    "extensions": ["ace"]
  },
  "application/x-amf": {
    "source": "apache"
  },
  "application/x-apple-diskimage": {
    "source": "apache",
    "extensions": ["dmg"]
  },
  "application/x-arj": {
    "compressible": false,
    "extensions": ["arj"]
  },
  "application/x-authorware-bin": {
    "source": "apache",
    "extensions": ["aab","x32","u32","vox"]
  },
  "application/x-authorware-map": {
    "source": "apache",
    "extensions": ["aam"]
  },
  "application/x-authorware-seg": {
    "source": "apache",
    "extensions": ["aas"]
  },
  "application/x-bcpio": {
    "source": "apache",
    "extensions": ["bcpio"]
  },
  "application/x-bdoc": {
    "compressible": false,
    "extensions": ["bdoc"]
  },
  "application/x-bittorrent": {
    "source": "apache",
    "extensions": ["torrent"]
  },
  "application/x-blorb": {
    "source": "apache",
    "extensions": ["blb","blorb"]
  },
  "application/x-bzip": {
    "source": "apache",
    "compressible": false,
    "extensions": ["bz"]
  },
  "application/x-bzip2": {
    "source": "apache",
    "compressible": false,
    "extensions": ["bz2","boz"]
  },
  "application/x-cbr": {
    "source": "apache",
    "extensions": ["cbr","cba","cbt","cbz","cb7"]
  },
  "application/x-cdlink": {
    "source": "apache",
    "extensions": ["vcd"]
  },
  "application/x-cfs-compressed": {
    "source": "apache",
    "extensions": ["cfs"]
  },
  "application/x-chat": {
    "source": "apache",
    "extensions": ["chat"]
  },
  "application/x-chess-pgn": {
    "source": "apache",
    "extensions": ["pgn"]
  },
  "application/x-chrome-extension": {
    "extensions": ["crx"]
  },
  "application/x-cocoa": {
    "source": "nginx",
    "extensions": ["cco"]
  },
  "application/x-compress": {
    "source": "apache"
  },
  "application/x-conference": {
    "source": "apache",
    "extensions": ["nsc"]
  },
  "application/x-cpio": {
    "source": "apache",
    "extensions": ["cpio"]
  },
  "application/x-csh": {
    "source": "apache",
    "extensions": ["csh"]
  },
  "application/x-deb": {
    "compressible": false
  },
  "application/x-debian-package": {
    "source": "apache",
    "extensions": ["deb","udeb"]
  },
  "application/x-dgc-compressed": {
    "source": "apache",
    "extensions": ["dgc"]
  },
  "application/x-director": {
    "source": "apache",
    "extensions": ["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"]
  },
  "application/x-doom": {
    "source": "apache",
    "extensions": ["wad"]
  },
  "application/x-dtbncx+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["ncx"]
  },
  "application/x-dtbook+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["dtb"]
  },
  "application/x-dtbresource+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["res"]
  },
  "application/x-dvi": {
    "source": "apache",
    "compressible": false,
    "extensions": ["dvi"]
  },
  "application/x-envoy": {
    "source": "apache",
    "extensions": ["evy"]
  },
  "application/x-eva": {
    "source": "apache",
    "extensions": ["eva"]
  },
  "application/x-font-bdf": {
    "source": "apache",
    "extensions": ["bdf"]
  },
  "application/x-font-dos": {
    "source": "apache"
  },
  "application/x-font-framemaker": {
    "source": "apache"
  },
  "application/x-font-ghostscript": {
    "source": "apache",
    "extensions": ["gsf"]
  },
  "application/x-font-libgrx": {
    "source": "apache"
  },
  "application/x-font-linux-psf": {
    "source": "apache",
    "extensions": ["psf"]
  },
  "application/x-font-pcf": {
    "source": "apache",
    "extensions": ["pcf"]
  },
  "application/x-font-snf": {
    "source": "apache",
    "extensions": ["snf"]
  },
  "application/x-font-speedo": {
    "source": "apache"
  },
  "application/x-font-sunos-news": {
    "source": "apache"
  },
  "application/x-font-type1": {
    "source": "apache",
    "extensions": ["pfa","pfb","pfm","afm"]
  },
  "application/x-font-vfont": {
    "source": "apache"
  },
  "application/x-freearc": {
    "source": "apache",
    "extensions": ["arc"]
  },
  "application/x-futuresplash": {
    "source": "apache",
    "extensions": ["spl"]
  },
  "application/x-gca-compressed": {
    "source": "apache",
    "extensions": ["gca"]
  },
  "application/x-glulx": {
    "source": "apache",
    "extensions": ["ulx"]
  },
  "application/x-gnumeric": {
    "source": "apache",
    "extensions": ["gnumeric"]
  },
  "application/x-gramps-xml": {
    "source": "apache",
    "extensions": ["gramps"]
  },
  "application/x-gtar": {
    "source": "apache",
    "extensions": ["gtar"]
  },
  "application/x-gzip": {
    "source": "apache"
  },
  "application/x-hdf": {
    "source": "apache",
    "extensions": ["hdf"]
  },
  "application/x-httpd-php": {
    "compressible": true,
    "extensions": ["php"]
  },
  "application/x-install-instructions": {
    "source": "apache",
    "extensions": ["install"]
  },
  "application/x-iso9660-image": {
    "source": "apache",
    "extensions": ["iso"]
  },
  "application/x-iwork-keynote-sffkey": {
    "extensions": ["key"]
  },
  "application/x-iwork-numbers-sffnumbers": {
    "extensions": ["numbers"]
  },
  "application/x-iwork-pages-sffpages": {
    "extensions": ["pages"]
  },
  "application/x-java-archive-diff": {
    "source": "nginx",
    "extensions": ["jardiff"]
  },
  "application/x-java-jnlp-file": {
    "source": "apache",
    "compressible": false,
    "extensions": ["jnlp"]
  },
  "application/x-javascript": {
    "compressible": true
  },
  "application/x-keepass2": {
    "extensions": ["kdbx"]
  },
  "application/x-latex": {
    "source": "apache",
    "compressible": false,
    "extensions": ["latex"]
  },
  "application/x-lua-bytecode": {
    "extensions": ["luac"]
  },
  "application/x-lzh-compressed": {
    "source": "apache",
    "extensions": ["lzh","lha"]
  },
  "application/x-makeself": {
    "source": "nginx",
    "extensions": ["run"]
  },
  "application/x-mie": {
    "source": "apache",
    "extensions": ["mie"]
  },
  "application/x-mobipocket-ebook": {
    "source": "apache",
    "extensions": ["prc","mobi"]
  },
  "application/x-mpegurl": {
    "compressible": false
  },
  "application/x-ms-application": {
    "source": "apache",
    "extensions": ["application"]
  },
  "application/x-ms-shortcut": {
    "source": "apache",
    "extensions": ["lnk"]
  },
  "application/x-ms-wmd": {
    "source": "apache",
    "extensions": ["wmd"]
  },
  "application/x-ms-wmz": {
    "source": "apache",
    "extensions": ["wmz"]
  },
  "application/x-ms-xbap": {
    "source": "apache",
    "extensions": ["xbap"]
  },
  "application/x-msaccess": {
    "source": "apache",
    "extensions": ["mdb"]
  },
  "application/x-msbinder": {
    "source": "apache",
    "extensions": ["obd"]
  },
  "application/x-mscardfile": {
    "source": "apache",
    "extensions": ["crd"]
  },
  "application/x-msclip": {
    "source": "apache",
    "extensions": ["clp"]
  },
  "application/x-msdos-program": {
    "extensions": ["exe"]
  },
  "application/x-msdownload": {
    "source": "apache",
    "extensions": ["exe","dll","com","bat","msi"]
  },
  "application/x-msmediaview": {
    "source": "apache",
    "extensions": ["mvb","m13","m14"]
  },
  "application/x-msmetafile": {
    "source": "apache",
    "extensions": ["wmf","wmz","emf","emz"]
  },
  "application/x-msmoney": {
    "source": "apache",
    "extensions": ["mny"]
  },
  "application/x-mspublisher": {
    "source": "apache",
    "extensions": ["pub"]
  },
  "application/x-msschedule": {
    "source": "apache",
    "extensions": ["scd"]
  },
  "application/x-msterminal": {
    "source": "apache",
    "extensions": ["trm"]
  },
  "application/x-mswrite": {
    "source": "apache",
    "extensions": ["wri"]
  },
  "application/x-netcdf": {
    "source": "apache",
    "extensions": ["nc","cdf"]
  },
  "application/x-ns-proxy-autoconfig": {
    "compressible": true,
    "extensions": ["pac"]
  },
  "application/x-nzb": {
    "source": "apache",
    "extensions": ["nzb"]
  },
  "application/x-perl": {
    "source": "nginx",
    "extensions": ["pl","pm"]
  },
  "application/x-pilot": {
    "source": "nginx",
    "extensions": ["prc","pdb"]
  },
  "application/x-pkcs12": {
    "source": "apache",
    "compressible": false,
    "extensions": ["p12","pfx"]
  },
  "application/x-pkcs7-certificates": {
    "source": "apache",
    "extensions": ["p7b","spc"]
  },
  "application/x-pkcs7-certreqresp": {
    "source": "apache",
    "extensions": ["p7r"]
  },
  "application/x-pki-message": {
    "source": "iana"
  },
  "application/x-rar-compressed": {
    "source": "apache",
    "compressible": false,
    "extensions": ["rar"]
  },
  "application/x-redhat-package-manager": {
    "source": "nginx",
    "extensions": ["rpm"]
  },
  "application/x-research-info-systems": {
    "source": "apache",
    "extensions": ["ris"]
  },
  "application/x-sea": {
    "source": "nginx",
    "extensions": ["sea"]
  },
  "application/x-sh": {
    "source": "apache",
    "compressible": true,
    "extensions": ["sh"]
  },
  "application/x-shar": {
    "source": "apache",
    "extensions": ["shar"]
  },
  "application/x-shockwave-flash": {
    "source": "apache",
    "compressible": false,
    "extensions": ["swf"]
  },
  "application/x-silverlight-app": {
    "source": "apache",
    "extensions": ["xap"]
  },
  "application/x-sql": {
    "source": "apache",
    "extensions": ["sql"]
  },
  "application/x-stuffit": {
    "source": "apache",
    "compressible": false,
    "extensions": ["sit"]
  },
  "application/x-stuffitx": {
    "source": "apache",
    "extensions": ["sitx"]
  },
  "application/x-subrip": {
    "source": "apache",
    "extensions": ["srt"]
  },
  "application/x-sv4cpio": {
    "source": "apache",
    "extensions": ["sv4cpio"]
  },
  "application/x-sv4crc": {
    "source": "apache",
    "extensions": ["sv4crc"]
  },
  "application/x-t3vm-image": {
    "source": "apache",
    "extensions": ["t3"]
  },
  "application/x-tads": {
    "source": "apache",
    "extensions": ["gam"]
  },
  "application/x-tar": {
    "source": "apache",
    "compressible": true,
    "extensions": ["tar"]
  },
  "application/x-tcl": {
    "source": "apache",
    "extensions": ["tcl","tk"]
  },
  "application/x-tex": {
    "source": "apache",
    "extensions": ["tex"]
  },
  "application/x-tex-tfm": {
    "source": "apache",
    "extensions": ["tfm"]
  },
  "application/x-texinfo": {
    "source": "apache",
    "extensions": ["texinfo","texi"]
  },
  "application/x-tgif": {
    "source": "apache",
    "extensions": ["obj"]
  },
  "application/x-ustar": {
    "source": "apache",
    "extensions": ["ustar"]
  },
  "application/x-virtualbox-hdd": {
    "compressible": true,
    "extensions": ["hdd"]
  },
  "application/x-virtualbox-ova": {
    "compressible": true,
    "extensions": ["ova"]
  },
  "application/x-virtualbox-ovf": {
    "compressible": true,
    "extensions": ["ovf"]
  },
  "application/x-virtualbox-vbox": {
    "compressible": true,
    "extensions": ["vbox"]
  },
  "application/x-virtualbox-vbox-extpack": {
    "compressible": false,
    "extensions": ["vbox-extpack"]
  },
  "application/x-virtualbox-vdi": {
    "compressible": true,
    "extensions": ["vdi"]
  },
  "application/x-virtualbox-vhd": {
    "compressible": true,
    "extensions": ["vhd"]
  },
  "application/x-virtualbox-vmdk": {
    "compressible": true,
    "extensions": ["vmdk"]
  },
  "application/x-wais-source": {
    "source": "apache",
    "extensions": ["src"]
  },
  "application/x-web-app-manifest+json": {
    "compressible": true,
    "extensions": ["webapp"]
  },
  "application/x-www-form-urlencoded": {
    "source": "iana",
    "compressible": true
  },
  "application/x-x509-ca-cert": {
    "source": "iana",
    "extensions": ["der","crt","pem"]
  },
  "application/x-x509-ca-ra-cert": {
    "source": "iana"
  },
  "application/x-x509-next-ca-cert": {
    "source": "iana"
  },
  "application/x-xfig": {
    "source": "apache",
    "extensions": ["fig"]
  },
  "application/x-xliff+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["xlf"]
  },
  "application/x-xpinstall": {
    "source": "apache",
    "compressible": false,
    "extensions": ["xpi"]
  },
  "application/x-xz": {
    "source": "apache",
    "extensions": ["xz"]
  },
  "application/x-zmachine": {
    "source": "apache",
    "extensions": ["z1","z2","z3","z4","z5","z6","z7","z8"]
  },
  "application/x400-bp": {
    "source": "iana"
  },
  "application/xacml+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/xaml+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["xaml"]
  },
  "application/xcap-att+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xav"]
  },
  "application/xcap-caps+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xca"]
  },
  "application/xcap-diff+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xdf"]
  },
  "application/xcap-el+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xel"]
  },
  "application/xcap-error+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/xcap-ns+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xns"]
  },
  "application/xcon-conference-info+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/xcon-conference-info-diff+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/xenc+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xenc"]
  },
  "application/xhtml+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xhtml","xht"]
  },
  "application/xhtml-voice+xml": {
    "source": "apache",
    "compressible": true
  },
  "application/xliff+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xlf"]
  },
  "application/xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xml","xsl","xsd","rng"]
  },
  "application/xml-dtd": {
    "source": "iana",
    "compressible": true,
    "extensions": ["dtd"]
  },
  "application/xml-external-parsed-entity": {
    "source": "iana"
  },
  "application/xml-patch+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/xmpp+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/xop+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xop"]
  },
  "application/xproc+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["xpl"]
  },
  "application/xslt+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xsl","xslt"]
  },
  "application/xspf+xml": {
    "source": "apache",
    "compressible": true,
    "extensions": ["xspf"]
  },
  "application/xv+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["mxml","xhvml","xvml","xvm"]
  },
  "application/yang": {
    "source": "iana",
    "extensions": ["yang"]
  },
  "application/yang-data+json": {
    "source": "iana",
    "compressible": true
  },
  "application/yang-data+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/yang-patch+json": {
    "source": "iana",
    "compressible": true
  },
  "application/yang-patch+xml": {
    "source": "iana",
    "compressible": true
  },
  "application/yin+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["yin"]
  },
  "application/zip": {
    "source": "iana",
    "compressible": false,
    "extensions": ["zip"]
  },
  "application/zlib": {
    "source": "iana"
  },
  "application/zstd": {
    "source": "iana"
  },
  "audio/1d-interleaved-parityfec": {
    "source": "iana"
  },
  "audio/32kadpcm": {
    "source": "iana"
  },
  "audio/3gpp": {
    "source": "iana",
    "compressible": false,
    "extensions": ["3gpp"]
  },
  "audio/3gpp2": {
    "source": "iana"
  },
  "audio/aac": {
    "source": "iana"
  },
  "audio/ac3": {
    "source": "iana"
  },
  "audio/adpcm": {
    "source": "apache",
    "extensions": ["adp"]
  },
  "audio/amr": {
    "source": "iana",
    "extensions": ["amr"]
  },
  "audio/amr-wb": {
    "source": "iana"
  },
  "audio/amr-wb+": {
    "source": "iana"
  },
  "audio/aptx": {
    "source": "iana"
  },
  "audio/asc": {
    "source": "iana"
  },
  "audio/atrac-advanced-lossless": {
    "source": "iana"
  },
  "audio/atrac-x": {
    "source": "iana"
  },
  "audio/atrac3": {
    "source": "iana"
  },
  "audio/basic": {
    "source": "iana",
    "compressible": false,
    "extensions": ["au","snd"]
  },
  "audio/bv16": {
    "source": "iana"
  },
  "audio/bv32": {
    "source": "iana"
  },
  "audio/clearmode": {
    "source": "iana"
  },
  "audio/cn": {
    "source": "iana"
  },
  "audio/dat12": {
    "source": "iana"
  },
  "audio/dls": {
    "source": "iana"
  },
  "audio/dsr-es201108": {
    "source": "iana"
  },
  "audio/dsr-es202050": {
    "source": "iana"
  },
  "audio/dsr-es202211": {
    "source": "iana"
  },
  "audio/dsr-es202212": {
    "source": "iana"
  },
  "audio/dv": {
    "source": "iana"
  },
  "audio/dvi4": {
    "source": "iana"
  },
  "audio/eac3": {
    "source": "iana"
  },
  "audio/encaprtp": {
    "source": "iana"
  },
  "audio/evrc": {
    "source": "iana"
  },
  "audio/evrc-qcp": {
    "source": "iana"
  },
  "audio/evrc0": {
    "source": "iana"
  },
  "audio/evrc1": {
    "source": "iana"
  },
  "audio/evrcb": {
    "source": "iana"
  },
  "audio/evrcb0": {
    "source": "iana"
  },
  "audio/evrcb1": {
    "source": "iana"
  },
  "audio/evrcnw": {
    "source": "iana"
  },
  "audio/evrcnw0": {
    "source": "iana"
  },
  "audio/evrcnw1": {
    "source": "iana"
  },
  "audio/evrcwb": {
    "source": "iana"
  },
  "audio/evrcwb0": {
    "source": "iana"
  },
  "audio/evrcwb1": {
    "source": "iana"
  },
  "audio/evs": {
    "source": "iana"
  },
  "audio/flexfec": {
    "source": "iana"
  },
  "audio/fwdred": {
    "source": "iana"
  },
  "audio/g711-0": {
    "source": "iana"
  },
  "audio/g719": {
    "source": "iana"
  },
  "audio/g722": {
    "source": "iana"
  },
  "audio/g7221": {
    "source": "iana"
  },
  "audio/g723": {
    "source": "iana"
  },
  "audio/g726-16": {
    "source": "iana"
  },
  "audio/g726-24": {
    "source": "iana"
  },
  "audio/g726-32": {
    "source": "iana"
  },
  "audio/g726-40": {
    "source": "iana"
  },
  "audio/g728": {
    "source": "iana"
  },
  "audio/g729": {
    "source": "iana"
  },
  "audio/g7291": {
    "source": "iana"
  },
  "audio/g729d": {
    "source": "iana"
  },
  "audio/g729e": {
    "source": "iana"
  },
  "audio/gsm": {
    "source": "iana"
  },
  "audio/gsm-efr": {
    "source": "iana"
  },
  "audio/gsm-hr-08": {
    "source": "iana"
  },
  "audio/ilbc": {
    "source": "iana"
  },
  "audio/ip-mr_v2.5": {
    "source": "iana"
  },
  "audio/isac": {
    "source": "apache"
  },
  "audio/l16": {
    "source": "iana"
  },
  "audio/l20": {
    "source": "iana"
  },
  "audio/l24": {
    "source": "iana",
    "compressible": false
  },
  "audio/l8": {
    "source": "iana"
  },
  "audio/lpc": {
    "source": "iana"
  },
  "audio/melp": {
    "source": "iana"
  },
  "audio/melp1200": {
    "source": "iana"
  },
  "audio/melp2400": {
    "source": "iana"
  },
  "audio/melp600": {
    "source": "iana"
  },
  "audio/mhas": {
    "source": "iana"
  },
  "audio/midi": {
    "source": "apache",
    "extensions": ["mid","midi","kar","rmi"]
  },
  "audio/mobile-xmf": {
    "source": "iana",
    "extensions": ["mxmf"]
  },
  "audio/mp3": {
    "compressible": false,
    "extensions": ["mp3"]
  },
  "audio/mp4": {
    "source": "iana",
    "compressible": false,
    "extensions": ["m4a","mp4a"]
  },
  "audio/mp4a-latm": {
    "source": "iana"
  },
  "audio/mpa": {
    "source": "iana"
  },
  "audio/mpa-robust": {
    "source": "iana"
  },
  "audio/mpeg": {
    "source": "iana",
    "compressible": false,
    "extensions": ["mpga","mp2","mp2a","mp3","m2a","m3a"]
  },
  "audio/mpeg4-generic": {
    "source": "iana"
  },
  "audio/musepack": {
    "source": "apache"
  },
  "audio/ogg": {
    "source": "iana",
    "compressible": false,
    "extensions": ["oga","ogg","spx","opus"]
  },
  "audio/opus": {
    "source": "iana"
  },
  "audio/parityfec": {
    "source": "iana"
  },
  "audio/pcma": {
    "source": "iana"
  },
  "audio/pcma-wb": {
    "source": "iana"
  },
  "audio/pcmu": {
    "source": "iana"
  },
  "audio/pcmu-wb": {
    "source": "iana"
  },
  "audio/prs.sid": {
    "source": "iana"
  },
  "audio/qcelp": {
    "source": "iana"
  },
  "audio/raptorfec": {
    "source": "iana"
  },
  "audio/red": {
    "source": "iana"
  },
  "audio/rtp-enc-aescm128": {
    "source": "iana"
  },
  "audio/rtp-midi": {
    "source": "iana"
  },
  "audio/rtploopback": {
    "source": "iana"
  },
  "audio/rtx": {
    "source": "iana"
  },
  "audio/s3m": {
    "source": "apache",
    "extensions": ["s3m"]
  },
  "audio/scip": {
    "source": "iana"
  },
  "audio/silk": {
    "source": "apache",
    "extensions": ["sil"]
  },
  "audio/smv": {
    "source": "iana"
  },
  "audio/smv-qcp": {
    "source": "iana"
  },
  "audio/smv0": {
    "source": "iana"
  },
  "audio/sofa": {
    "source": "iana"
  },
  "audio/sp-midi": {
    "source": "iana"
  },
  "audio/speex": {
    "source": "iana"
  },
  "audio/t140c": {
    "source": "iana"
  },
  "audio/t38": {
    "source": "iana"
  },
  "audio/telephone-event": {
    "source": "iana"
  },
  "audio/tetra_acelp": {
    "source": "iana"
  },
  "audio/tetra_acelp_bb": {
    "source": "iana"
  },
  "audio/tone": {
    "source": "iana"
  },
  "audio/tsvcis": {
    "source": "iana"
  },
  "audio/uemclip": {
    "source": "iana"
  },
  "audio/ulpfec": {
    "source": "iana"
  },
  "audio/usac": {
    "source": "iana"
  },
  "audio/vdvi": {
    "source": "iana"
  },
  "audio/vmr-wb": {
    "source": "iana"
  },
  "audio/vnd.3gpp.iufp": {
    "source": "iana"
  },
  "audio/vnd.4sb": {
    "source": "iana"
  },
  "audio/vnd.audiokoz": {
    "source": "iana"
  },
  "audio/vnd.celp": {
    "source": "iana"
  },
  "audio/vnd.cisco.nse": {
    "source": "iana"
  },
  "audio/vnd.cmles.radio-events": {
    "source": "iana"
  },
  "audio/vnd.cns.anp1": {
    "source": "iana"
  },
  "audio/vnd.cns.inf1": {
    "source": "iana"
  },
  "audio/vnd.dece.audio": {
    "source": "iana",
    "extensions": ["uva","uvva"]
  },
  "audio/vnd.digital-winds": {
    "source": "iana",
    "extensions": ["eol"]
  },
  "audio/vnd.dlna.adts": {
    "source": "iana"
  },
  "audio/vnd.dolby.heaac.1": {
    "source": "iana"
  },
  "audio/vnd.dolby.heaac.2": {
    "source": "iana"
  },
  "audio/vnd.dolby.mlp": {
    "source": "iana"
  },
  "audio/vnd.dolby.mps": {
    "source": "iana"
  },
  "audio/vnd.dolby.pl2": {
    "source": "iana"
  },
  "audio/vnd.dolby.pl2x": {
    "source": "iana"
  },
  "audio/vnd.dolby.pl2z": {
    "source": "iana"
  },
  "audio/vnd.dolby.pulse.1": {
    "source": "iana"
  },
  "audio/vnd.dra": {
    "source": "iana",
    "extensions": ["dra"]
  },
  "audio/vnd.dts": {
    "source": "iana",
    "extensions": ["dts"]
  },
  "audio/vnd.dts.hd": {
    "source": "iana",
    "extensions": ["dtshd"]
  },
  "audio/vnd.dts.uhd": {
    "source": "iana"
  },
  "audio/vnd.dvb.file": {
    "source": "iana"
  },
  "audio/vnd.everad.plj": {
    "source": "iana"
  },
  "audio/vnd.hns.audio": {
    "source": "iana"
  },
  "audio/vnd.lucent.voice": {
    "source": "iana",
    "extensions": ["lvp"]
  },
  "audio/vnd.ms-playready.media.pya": {
    "source": "iana",
    "extensions": ["pya"]
  },
  "audio/vnd.nokia.mobile-xmf": {
    "source": "iana"
  },
  "audio/vnd.nortel.vbk": {
    "source": "iana"
  },
  "audio/vnd.nuera.ecelp4800": {
    "source": "iana",
    "extensions": ["ecelp4800"]
  },
  "audio/vnd.nuera.ecelp7470": {
    "source": "iana",
    "extensions": ["ecelp7470"]
  },
  "audio/vnd.nuera.ecelp9600": {
    "source": "iana",
    "extensions": ["ecelp9600"]
  },
  "audio/vnd.octel.sbc": {
    "source": "iana"
  },
  "audio/vnd.presonus.multitrack": {
    "source": "iana"
  },
  "audio/vnd.qcelp": {
    "source": "iana"
  },
  "audio/vnd.rhetorex.32kadpcm": {
    "source": "iana"
  },
  "audio/vnd.rip": {
    "source": "iana",
    "extensions": ["rip"]
  },
  "audio/vnd.rn-realaudio": {
    "compressible": false
  },
  "audio/vnd.sealedmedia.softseal.mpeg": {
    "source": "iana"
  },
  "audio/vnd.vmx.cvsd": {
    "source": "iana"
  },
  "audio/vnd.wave": {
    "compressible": false
  },
  "audio/vorbis": {
    "source": "iana",
    "compressible": false
  },
  "audio/vorbis-config": {
    "source": "iana"
  },
  "audio/wav": {
    "compressible": false,
    "extensions": ["wav"]
  },
  "audio/wave": {
    "compressible": false,
    "extensions": ["wav"]
  },
  "audio/webm": {
    "source": "apache",
    "compressible": false,
    "extensions": ["weba"]
  },
  "audio/x-aac": {
    "source": "apache",
    "compressible": false,
    "extensions": ["aac"]
  },
  "audio/x-aiff": {
    "source": "apache",
    "extensions": ["aif","aiff","aifc"]
  },
  "audio/x-caf": {
    "source": "apache",
    "compressible": false,
    "extensions": ["caf"]
  },
  "audio/x-flac": {
    "source": "apache",
    "extensions": ["flac"]
  },
  "audio/x-m4a": {
    "source": "nginx",
    "extensions": ["m4a"]
  },
  "audio/x-matroska": {
    "source": "apache",
    "extensions": ["mka"]
  },
  "audio/x-mpegurl": {
    "source": "apache",
    "extensions": ["m3u"]
  },
  "audio/x-ms-wax": {
    "source": "apache",
    "extensions": ["wax"]
  },
  "audio/x-ms-wma": {
    "source": "apache",
    "extensions": ["wma"]
  },
  "audio/x-pn-realaudio": {
    "source": "apache",
    "extensions": ["ram","ra"]
  },
  "audio/x-pn-realaudio-plugin": {
    "source": "apache",
    "extensions": ["rmp"]
  },
  "audio/x-realaudio": {
    "source": "nginx",
    "extensions": ["ra"]
  },
  "audio/x-tta": {
    "source": "apache"
  },
  "audio/x-wav": {
    "source": "apache",
    "extensions": ["wav"]
  },
  "audio/xm": {
    "source": "apache",
    "extensions": ["xm"]
  },
  "chemical/x-cdx": {
    "source": "apache",
    "extensions": ["cdx"]
  },
  "chemical/x-cif": {
    "source": "apache",
    "extensions": ["cif"]
  },
  "chemical/x-cmdf": {
    "source": "apache",
    "extensions": ["cmdf"]
  },
  "chemical/x-cml": {
    "source": "apache",
    "extensions": ["cml"]
  },
  "chemical/x-csml": {
    "source": "apache",
    "extensions": ["csml"]
  },
  "chemical/x-pdb": {
    "source": "apache"
  },
  "chemical/x-xyz": {
    "source": "apache",
    "extensions": ["xyz"]
  },
  "font/collection": {
    "source": "iana",
    "extensions": ["ttc"]
  },
  "font/otf": {
    "source": "iana",
    "compressible": true,
    "extensions": ["otf"]
  },
  "font/sfnt": {
    "source": "iana"
  },
  "font/ttf": {
    "source": "iana",
    "compressible": true,
    "extensions": ["ttf"]
  },
  "font/woff": {
    "source": "iana",
    "extensions": ["woff"]
  },
  "font/woff2": {
    "source": "iana",
    "extensions": ["woff2"]
  },
  "image/aces": {
    "source": "iana",
    "extensions": ["exr"]
  },
  "image/apng": {
    "compressible": false,
    "extensions": ["apng"]
  },
  "image/avci": {
    "source": "iana",
    "extensions": ["avci"]
  },
  "image/avcs": {
    "source": "iana",
    "extensions": ["avcs"]
  },
  "image/avif": {
    "source": "iana",
    "compressible": false,
    "extensions": ["avif"]
  },
  "image/bmp": {
    "source": "iana",
    "compressible": true,
    "extensions": ["bmp"]
  },
  "image/cgm": {
    "source": "iana",
    "extensions": ["cgm"]
  },
  "image/dicom-rle": {
    "source": "iana",
    "extensions": ["drle"]
  },
  "image/emf": {
    "source": "iana",
    "extensions": ["emf"]
  },
  "image/fits": {
    "source": "iana",
    "extensions": ["fits"]
  },
  "image/g3fax": {
    "source": "iana",
    "extensions": ["g3"]
  },
  "image/gif": {
    "source": "iana",
    "compressible": false,
    "extensions": ["gif"]
  },
  "image/heic": {
    "source": "iana",
    "extensions": ["heic"]
  },
  "image/heic-sequence": {
    "source": "iana",
    "extensions": ["heics"]
  },
  "image/heif": {
    "source": "iana",
    "extensions": ["heif"]
  },
  "image/heif-sequence": {
    "source": "iana",
    "extensions": ["heifs"]
  },
  "image/hej2k": {
    "source": "iana",
    "extensions": ["hej2"]
  },
  "image/hsj2": {
    "source": "iana",
    "extensions": ["hsj2"]
  },
  "image/ief": {
    "source": "iana",
    "extensions": ["ief"]
  },
  "image/jls": {
    "source": "iana",
    "extensions": ["jls"]
  },
  "image/jp2": {
    "source": "iana",
    "compressible": false,
    "extensions": ["jp2","jpg2"]
  },
  "image/jpeg": {
    "source": "iana",
    "compressible": false,
    "extensions": ["jpeg","jpg","jpe"]
  },
  "image/jph": {
    "source": "iana",
    "extensions": ["jph"]
  },
  "image/jphc": {
    "source": "iana",
    "extensions": ["jhc"]
  },
  "image/jpm": {
    "source": "iana",
    "compressible": false,
    "extensions": ["jpm"]
  },
  "image/jpx": {
    "source": "iana",
    "compressible": false,
    "extensions": ["jpx","jpf"]
  },
  "image/jxr": {
    "source": "iana",
    "extensions": ["jxr"]
  },
  "image/jxra": {
    "source": "iana",
    "extensions": ["jxra"]
  },
  "image/jxrs": {
    "source": "iana",
    "extensions": ["jxrs"]
  },
  "image/jxs": {
    "source": "iana",
    "extensions": ["jxs"]
  },
  "image/jxsc": {
    "source": "iana",
    "extensions": ["jxsc"]
  },
  "image/jxsi": {
    "source": "iana",
    "extensions": ["jxsi"]
  },
  "image/jxss": {
    "source": "iana",
    "extensions": ["jxss"]
  },
  "image/ktx": {
    "source": "iana",
    "extensions": ["ktx"]
  },
  "image/ktx2": {
    "source": "iana",
    "extensions": ["ktx2"]
  },
  "image/naplps": {
    "source": "iana"
  },
  "image/pjpeg": {
    "compressible": false
  },
  "image/png": {
    "source": "iana",
    "compressible": false,
    "extensions": ["png"]
  },
  "image/prs.btif": {
    "source": "iana",
    "extensions": ["btif"]
  },
  "image/prs.pti": {
    "source": "iana",
    "extensions": ["pti"]
  },
  "image/pwg-raster": {
    "source": "iana"
  },
  "image/sgi": {
    "source": "apache",
    "extensions": ["sgi"]
  },
  "image/svg+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["svg","svgz"]
  },
  "image/t38": {
    "source": "iana",
    "extensions": ["t38"]
  },
  "image/tiff": {
    "source": "iana",
    "compressible": false,
    "extensions": ["tif","tiff"]
  },
  "image/tiff-fx": {
    "source": "iana",
    "extensions": ["tfx"]
  },
  "image/vnd.adobe.photoshop": {
    "source": "iana",
    "compressible": true,
    "extensions": ["psd"]
  },
  "image/vnd.airzip.accelerator.azv": {
    "source": "iana",
    "extensions": ["azv"]
  },
  "image/vnd.cns.inf2": {
    "source": "iana"
  },
  "image/vnd.dece.graphic": {
    "source": "iana",
    "extensions": ["uvi","uvvi","uvg","uvvg"]
  },
  "image/vnd.djvu": {
    "source": "iana",
    "extensions": ["djvu","djv"]
  },
  "image/vnd.dvb.subtitle": {
    "source": "iana",
    "extensions": ["sub"]
  },
  "image/vnd.dwg": {
    "source": "iana",
    "extensions": ["dwg"]
  },
  "image/vnd.dxf": {
    "source": "iana",
    "extensions": ["dxf"]
  },
  "image/vnd.fastbidsheet": {
    "source": "iana",
    "extensions": ["fbs"]
  },
  "image/vnd.fpx": {
    "source": "iana",
    "extensions": ["fpx"]
  },
  "image/vnd.fst": {
    "source": "iana",
    "extensions": ["fst"]
  },
  "image/vnd.fujixerox.edmics-mmr": {
    "source": "iana",
    "extensions": ["mmr"]
  },
  "image/vnd.fujixerox.edmics-rlc": {
    "source": "iana",
    "extensions": ["rlc"]
  },
  "image/vnd.globalgraphics.pgb": {
    "source": "iana"
  },
  "image/vnd.microsoft.icon": {
    "source": "iana",
    "compressible": true,
    "extensions": ["ico"]
  },
  "image/vnd.mix": {
    "source": "iana"
  },
  "image/vnd.mozilla.apng": {
    "source": "iana"
  },
  "image/vnd.ms-dds": {
    "compressible": true,
    "extensions": ["dds"]
  },
  "image/vnd.ms-modi": {
    "source": "iana",
    "extensions": ["mdi"]
  },
  "image/vnd.ms-photo": {
    "source": "apache",
    "extensions": ["wdp"]
  },
  "image/vnd.net-fpx": {
    "source": "iana",
    "extensions": ["npx"]
  },
  "image/vnd.pco.b16": {
    "source": "iana",
    "extensions": ["b16"]
  },
  "image/vnd.radiance": {
    "source": "iana"
  },
  "image/vnd.sealed.png": {
    "source": "iana"
  },
  "image/vnd.sealedmedia.softseal.gif": {
    "source": "iana"
  },
  "image/vnd.sealedmedia.softseal.jpg": {
    "source": "iana"
  },
  "image/vnd.svf": {
    "source": "iana"
  },
  "image/vnd.tencent.tap": {
    "source": "iana",
    "extensions": ["tap"]
  },
  "image/vnd.valve.source.texture": {
    "source": "iana",
    "extensions": ["vtf"]
  },
  "image/vnd.wap.wbmp": {
    "source": "iana",
    "extensions": ["wbmp"]
  },
  "image/vnd.xiff": {
    "source": "iana",
    "extensions": ["xif"]
  },
  "image/vnd.zbrush.pcx": {
    "source": "iana",
    "extensions": ["pcx"]
  },
  "image/webp": {
    "source": "apache",
    "extensions": ["webp"]
  },
  "image/wmf": {
    "source": "iana",
    "extensions": ["wmf"]
  },
  "image/x-3ds": {
    "source": "apache",
    "extensions": ["3ds"]
  },
  "image/x-cmu-raster": {
    "source": "apache",
    "extensions": ["ras"]
  },
  "image/x-cmx": {
    "source": "apache",
    "extensions": ["cmx"]
  },
  "image/x-freehand": {
    "source": "apache",
    "extensions": ["fh","fhc","fh4","fh5","fh7"]
  },
  "image/x-icon": {
    "source": "apache",
    "compressible": true,
    "extensions": ["ico"]
  },
  "image/x-jng": {
    "source": "nginx",
    "extensions": ["jng"]
  },
  "image/x-mrsid-image": {
    "source": "apache",
    "extensions": ["sid"]
  },
  "image/x-ms-bmp": {
    "source": "nginx",
    "compressible": true,
    "extensions": ["bmp"]
  },
  "image/x-pcx": {
    "source": "apache",
    "extensions": ["pcx"]
  },
  "image/x-pict": {
    "source": "apache",
    "extensions": ["pic","pct"]
  },
  "image/x-portable-anymap": {
    "source": "apache",
    "extensions": ["pnm"]
  },
  "image/x-portable-bitmap": {
    "source": "apache",
    "extensions": ["pbm"]
  },
  "image/x-portable-graymap": {
    "source": "apache",
    "extensions": ["pgm"]
  },
  "image/x-portable-pixmap": {
    "source": "apache",
    "extensions": ["ppm"]
  },
  "image/x-rgb": {
    "source": "apache",
    "extensions": ["rgb"]
  },
  "image/x-tga": {
    "source": "apache",
    "extensions": ["tga"]
  },
  "image/x-xbitmap": {
    "source": "apache",
    "extensions": ["xbm"]
  },
  "image/x-xcf": {
    "compressible": false
  },
  "image/x-xpixmap": {
    "source": "apache",
    "extensions": ["xpm"]
  },
  "image/x-xwindowdump": {
    "source": "apache",
    "extensions": ["xwd"]
  },
  "message/cpim": {
    "source": "iana"
  },
  "message/delivery-status": {
    "source": "iana"
  },
  "message/disposition-notification": {
    "source": "iana",
    "extensions": [
      "disposition-notification"
    ]
  },
  "message/external-body": {
    "source": "iana"
  },
  "message/feedback-report": {
    "source": "iana"
  },
  "message/global": {
    "source": "iana",
    "extensions": ["u8msg"]
  },
  "message/global-delivery-status": {
    "source": "iana",
    "extensions": ["u8dsn"]
  },
  "message/global-disposition-notification": {
    "source": "iana",
    "extensions": ["u8mdn"]
  },
  "message/global-headers": {
    "source": "iana",
    "extensions": ["u8hdr"]
  },
  "message/http": {
    "source": "iana",
    "compressible": false
  },
  "message/imdn+xml": {
    "source": "iana",
    "compressible": true
  },
  "message/news": {
    "source": "iana"
  },
  "message/partial": {
    "source": "iana",
    "compressible": false
  },
  "message/rfc822": {
    "source": "iana",
    "compressible": true,
    "extensions": ["eml","mime"]
  },
  "message/s-http": {
    "source": "iana"
  },
  "message/sip": {
    "source": "iana"
  },
  "message/sipfrag": {
    "source": "iana"
  },
  "message/tracking-status": {
    "source": "iana"
  },
  "message/vnd.si.simp": {
    "source": "iana"
  },
  "message/vnd.wfa.wsc": {
    "source": "iana",
    "extensions": ["wsc"]
  },
  "model/3mf": {
    "source": "iana",
    "extensions": ["3mf"]
  },
  "model/e57": {
    "source": "iana"
  },
  "model/gltf+json": {
    "source": "iana",
    "compressible": true,
    "extensions": ["gltf"]
  },
  "model/gltf-binary": {
    "source": "iana",
    "compressible": true,
    "extensions": ["glb"]
  },
  "model/iges": {
    "source": "iana",
    "compressible": false,
    "extensions": ["igs","iges"]
  },
  "model/mesh": {
    "source": "iana",
    "compressible": false,
    "extensions": ["msh","mesh","silo"]
  },
  "model/mtl": {
    "source": "iana",
    "extensions": ["mtl"]
  },
  "model/obj": {
    "source": "iana",
    "extensions": ["obj"]
  },
  "model/step": {
    "source": "iana"
  },
  "model/step+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["stpx"]
  },
  "model/step+zip": {
    "source": "iana",
    "compressible": false,
    "extensions": ["stpz"]
  },
  "model/step-xml+zip": {
    "source": "iana",
    "compressible": false,
    "extensions": ["stpxz"]
  },
  "model/stl": {
    "source": "iana",
    "extensions": ["stl"]
  },
  "model/vnd.collada+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["dae"]
  },
  "model/vnd.dwf": {
    "source": "iana",
    "extensions": ["dwf"]
  },
  "model/vnd.flatland.3dml": {
    "source": "iana"
  },
  "model/vnd.gdl": {
    "source": "iana",
    "extensions": ["gdl"]
  },
  "model/vnd.gs-gdl": {
    "source": "apache"
  },
  "model/vnd.gs.gdl": {
    "source": "iana"
  },
  "model/vnd.gtw": {
    "source": "iana",
    "extensions": ["gtw"]
  },
  "model/vnd.moml+xml": {
    "source": "iana",
    "compressible": true
  },
  "model/vnd.mts": {
    "source": "iana",
    "extensions": ["mts"]
  },
  "model/vnd.opengex": {
    "source": "iana",
    "extensions": ["ogex"]
  },
  "model/vnd.parasolid.transmit.binary": {
    "source": "iana",
    "extensions": ["x_b"]
  },
  "model/vnd.parasolid.transmit.text": {
    "source": "iana",
    "extensions": ["x_t"]
  },
  "model/vnd.pytha.pyox": {
    "source": "iana"
  },
  "model/vnd.rosette.annotated-data-model": {
    "source": "iana"
  },
  "model/vnd.sap.vds": {
    "source": "iana",
    "extensions": ["vds"]
  },
  "model/vnd.usdz+zip": {
    "source": "iana",
    "compressible": false,
    "extensions": ["usdz"]
  },
  "model/vnd.valve.source.compiled-map": {
    "source": "iana",
    "extensions": ["bsp"]
  },
  "model/vnd.vtu": {
    "source": "iana",
    "extensions": ["vtu"]
  },
  "model/vrml": {
    "source": "iana",
    "compressible": false,
    "extensions": ["wrl","vrml"]
  },
  "model/x3d+binary": {
    "source": "apache",
    "compressible": false,
    "extensions": ["x3db","x3dbz"]
  },
  "model/x3d+fastinfoset": {
    "source": "iana",
    "extensions": ["x3db"]
  },
  "model/x3d+vrml": {
    "source": "apache",
    "compressible": false,
    "extensions": ["x3dv","x3dvz"]
  },
  "model/x3d+xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["x3d","x3dz"]
  },
  "model/x3d-vrml": {
    "source": "iana",
    "extensions": ["x3dv"]
  },
  "multipart/alternative": {
    "source": "iana",
    "compressible": false
  },
  "multipart/appledouble": {
    "source": "iana"
  },
  "multipart/byteranges": {
    "source": "iana"
  },
  "multipart/digest": {
    "source": "iana"
  },
  "multipart/encrypted": {
    "source": "iana",
    "compressible": false
  },
  "multipart/form-data": {
    "source": "iana",
    "compressible": false
  },
  "multipart/header-set": {
    "source": "iana"
  },
  "multipart/mixed": {
    "source": "iana"
  },
  "multipart/multilingual": {
    "source": "iana"
  },
  "multipart/parallel": {
    "source": "iana"
  },
  "multipart/related": {
    "source": "iana",
    "compressible": false
  },
  "multipart/report": {
    "source": "iana"
  },
  "multipart/signed": {
    "source": "iana",
    "compressible": false
  },
  "multipart/vnd.bint.med-plus": {
    "source": "iana"
  },
  "multipart/voice-message": {
    "source": "iana"
  },
  "multipart/x-mixed-replace": {
    "source": "iana"
  },
  "text/1d-interleaved-parityfec": {
    "source": "iana"
  },
  "text/cache-manifest": {
    "source": "iana",
    "compressible": true,
    "extensions": ["appcache","manifest"]
  },
  "text/calendar": {
    "source": "iana",
    "extensions": ["ics","ifb"]
  },
  "text/calender": {
    "compressible": true
  },
  "text/cmd": {
    "compressible": true
  },
  "text/coffeescript": {
    "extensions": ["coffee","litcoffee"]
  },
  "text/cql": {
    "source": "iana"
  },
  "text/cql-expression": {
    "source": "iana"
  },
  "text/cql-identifier": {
    "source": "iana"
  },
  "text/css": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true,
    "extensions": ["css"]
  },
  "text/csv": {
    "source": "iana",
    "compressible": true,
    "extensions": ["csv"]
  },
  "text/csv-schema": {
    "source": "iana"
  },
  "text/directory": {
    "source": "iana"
  },
  "text/dns": {
    "source": "iana"
  },
  "text/ecmascript": {
    "source": "iana"
  },
  "text/encaprtp": {
    "source": "iana"
  },
  "text/enriched": {
    "source": "iana"
  },
  "text/fhirpath": {
    "source": "iana"
  },
  "text/flexfec": {
    "source": "iana"
  },
  "text/fwdred": {
    "source": "iana"
  },
  "text/gff3": {
    "source": "iana"
  },
  "text/grammar-ref-list": {
    "source": "iana"
  },
  "text/html": {
    "source": "iana",
    "compressible": true,
    "extensions": ["html","htm","shtml"]
  },
  "text/jade": {
    "extensions": ["jade"]
  },
  "text/javascript": {
    "source": "iana",
    "compressible": true
  },
  "text/jcr-cnd": {
    "source": "iana"
  },
  "text/jsx": {
    "compressible": true,
    "extensions": ["jsx"]
  },
  "text/less": {
    "compressible": true,
    "extensions": ["less"]
  },
  "text/markdown": {
    "source": "iana",
    "compressible": true,
    "extensions": ["markdown","md"]
  },
  "text/mathml": {
    "source": "nginx",
    "extensions": ["mml"]
  },
  "text/mdx": {
    "compressible": true,
    "extensions": ["mdx"]
  },
  "text/mizar": {
    "source": "iana"
  },
  "text/n3": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true,
    "extensions": ["n3"]
  },
  "text/parameters": {
    "source": "iana",
    "charset": "UTF-8"
  },
  "text/parityfec": {
    "source": "iana"
  },
  "text/plain": {
    "source": "iana",
    "compressible": true,
    "extensions": ["txt","text","conf","def","list","log","in","ini"]
  },
  "text/provenance-notation": {
    "source": "iana",
    "charset": "UTF-8"
  },
  "text/prs.fallenstein.rst": {
    "source": "iana"
  },
  "text/prs.lines.tag": {
    "source": "iana",
    "extensions": ["dsc"]
  },
  "text/prs.prop.logic": {
    "source": "iana"
  },
  "text/raptorfec": {
    "source": "iana"
  },
  "text/red": {
    "source": "iana"
  },
  "text/rfc822-headers": {
    "source": "iana"
  },
  "text/richtext": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rtx"]
  },
  "text/rtf": {
    "source": "iana",
    "compressible": true,
    "extensions": ["rtf"]
  },
  "text/rtp-enc-aescm128": {
    "source": "iana"
  },
  "text/rtploopback": {
    "source": "iana"
  },
  "text/rtx": {
    "source": "iana"
  },
  "text/sgml": {
    "source": "iana",
    "extensions": ["sgml","sgm"]
  },
  "text/shaclc": {
    "source": "iana"
  },
  "text/shex": {
    "source": "iana",
    "extensions": ["shex"]
  },
  "text/slim": {
    "extensions": ["slim","slm"]
  },
  "text/spdx": {
    "source": "iana",
    "extensions": ["spdx"]
  },
  "text/strings": {
    "source": "iana"
  },
  "text/stylus": {
    "extensions": ["stylus","styl"]
  },
  "text/t140": {
    "source": "iana"
  },
  "text/tab-separated-values": {
    "source": "iana",
    "compressible": true,
    "extensions": ["tsv"]
  },
  "text/troff": {
    "source": "iana",
    "extensions": ["t","tr","roff","man","me","ms"]
  },
  "text/turtle": {
    "source": "iana",
    "charset": "UTF-8",
    "extensions": ["ttl"]
  },
  "text/ulpfec": {
    "source": "iana"
  },
  "text/uri-list": {
    "source": "iana",
    "compressible": true,
    "extensions": ["uri","uris","urls"]
  },
  "text/vcard": {
    "source": "iana",
    "compressible": true,
    "extensions": ["vcard"]
  },
  "text/vnd.a": {
    "source": "iana"
  },
  "text/vnd.abc": {
    "source": "iana"
  },
  "text/vnd.ascii-art": {
    "source": "iana"
  },
  "text/vnd.curl": {
    "source": "iana",
    "extensions": ["curl"]
  },
  "text/vnd.curl.dcurl": {
    "source": "apache",
    "extensions": ["dcurl"]
  },
  "text/vnd.curl.mcurl": {
    "source": "apache",
    "extensions": ["mcurl"]
  },
  "text/vnd.curl.scurl": {
    "source": "apache",
    "extensions": ["scurl"]
  },
  "text/vnd.debian.copyright": {
    "source": "iana",
    "charset": "UTF-8"
  },
  "text/vnd.dmclientscript": {
    "source": "iana"
  },
  "text/vnd.dvb.subtitle": {
    "source": "iana",
    "extensions": ["sub"]
  },
  "text/vnd.esmertec.theme-descriptor": {
    "source": "iana",
    "charset": "UTF-8"
  },
  "text/vnd.familysearch.gedcom": {
    "source": "iana",
    "extensions": ["ged"]
  },
  "text/vnd.ficlab.flt": {
    "source": "iana"
  },
  "text/vnd.fly": {
    "source": "iana",
    "extensions": ["fly"]
  },
  "text/vnd.fmi.flexstor": {
    "source": "iana",
    "extensions": ["flx"]
  },
  "text/vnd.gml": {
    "source": "iana"
  },
  "text/vnd.graphviz": {
    "source": "iana",
    "extensions": ["gv"]
  },
  "text/vnd.hans": {
    "source": "iana"
  },
  "text/vnd.hgl": {
    "source": "iana"
  },
  "text/vnd.in3d.3dml": {
    "source": "iana",
    "extensions": ["3dml"]
  },
  "text/vnd.in3d.spot": {
    "source": "iana",
    "extensions": ["spot"]
  },
  "text/vnd.iptc.newsml": {
    "source": "iana"
  },
  "text/vnd.iptc.nitf": {
    "source": "iana"
  },
  "text/vnd.latex-z": {
    "source": "iana"
  },
  "text/vnd.motorola.reflex": {
    "source": "iana"
  },
  "text/vnd.ms-mediapackage": {
    "source": "iana"
  },
  "text/vnd.net2phone.commcenter.command": {
    "source": "iana"
  },
  "text/vnd.radisys.msml-basic-layout": {
    "source": "iana"
  },
  "text/vnd.senx.warpscript": {
    "source": "iana"
  },
  "text/vnd.si.uricatalogue": {
    "source": "iana"
  },
  "text/vnd.sosi": {
    "source": "iana"
  },
  "text/vnd.sun.j2me.app-descriptor": {
    "source": "iana",
    "charset": "UTF-8",
    "extensions": ["jad"]
  },
  "text/vnd.trolltech.linguist": {
    "source": "iana",
    "charset": "UTF-8"
  },
  "text/vnd.wap.si": {
    "source": "iana"
  },
  "text/vnd.wap.sl": {
    "source": "iana"
  },
  "text/vnd.wap.wml": {
    "source": "iana",
    "extensions": ["wml"]
  },
  "text/vnd.wap.wmlscript": {
    "source": "iana",
    "extensions": ["wmls"]
  },
  "text/vtt": {
    "source": "iana",
    "charset": "UTF-8",
    "compressible": true,
    "extensions": ["vtt"]
  },
  "text/x-asm": {
    "source": "apache",
    "extensions": ["s","asm"]
  },
  "text/x-c": {
    "source": "apache",
    "extensions": ["c","cc","cxx","cpp","h","hh","dic"]
  },
  "text/x-component": {
    "source": "nginx",
    "extensions": ["htc"]
  },
  "text/x-fortran": {
    "source": "apache",
    "extensions": ["f","for","f77","f90"]
  },
  "text/x-gwt-rpc": {
    "compressible": true
  },
  "text/x-handlebars-template": {
    "extensions": ["hbs"]
  },
  "text/x-java-source": {
    "source": "apache",
    "extensions": ["java"]
  },
  "text/x-jquery-tmpl": {
    "compressible": true
  },
  "text/x-lua": {
    "extensions": ["lua"]
  },
  "text/x-markdown": {
    "compressible": true,
    "extensions": ["mkd"]
  },
  "text/x-nfo": {
    "source": "apache",
    "extensions": ["nfo"]
  },
  "text/x-opml": {
    "source": "apache",
    "extensions": ["opml"]
  },
  "text/x-org": {
    "compressible": true,
    "extensions": ["org"]
  },
  "text/x-pascal": {
    "source": "apache",
    "extensions": ["p","pas"]
  },
  "text/x-processing": {
    "compressible": true,
    "extensions": ["pde"]
  },
  "text/x-sass": {
    "extensions": ["sass"]
  },
  "text/x-scss": {
    "extensions": ["scss"]
  },
  "text/x-setext": {
    "source": "apache",
    "extensions": ["etx"]
  },
  "text/x-sfv": {
    "source": "apache",
    "extensions": ["sfv"]
  },
  "text/x-suse-ymp": {
    "compressible": true,
    "extensions": ["ymp"]
  },
  "text/x-uuencode": {
    "source": "apache",
    "extensions": ["uu"]
  },
  "text/x-vcalendar": {
    "source": "apache",
    "extensions": ["vcs"]
  },
  "text/x-vcard": {
    "source": "apache",
    "extensions": ["vcf"]
  },
  "text/xml": {
    "source": "iana",
    "compressible": true,
    "extensions": ["xml"]
  },
  "text/xml-external-parsed-entity": {
    "source": "iana"
  },
  "text/yaml": {
    "compressible": true,
    "extensions": ["yaml","yml"]
  },
  "video/1d-interleaved-parityfec": {
    "source": "iana"
  },
  "video/3gpp": {
    "source": "iana",
    "extensions": ["3gp","3gpp"]
  },
  "video/3gpp-tt": {
    "source": "iana"
  },
  "video/3gpp2": {
    "source": "iana",
    "extensions": ["3g2"]
  },
  "video/av1": {
    "source": "iana"
  },
  "video/bmpeg": {
    "source": "iana"
  },
  "video/bt656": {
    "source": "iana"
  },
  "video/celb": {
    "source": "iana"
  },
  "video/dv": {
    "source": "iana"
  },
  "video/encaprtp": {
    "source": "iana"
  },
  "video/ffv1": {
    "source": "iana"
  },
  "video/flexfec": {
    "source": "iana"
  },
  "video/h261": {
    "source": "iana",
    "extensions": ["h261"]
  },
  "video/h263": {
    "source": "iana",
    "extensions": ["h263"]
  },
  "video/h263-1998": {
    "source": "iana"
  },
  "video/h263-2000": {
    "source": "iana"
  },
  "video/h264": {
    "source": "iana",
    "extensions": ["h264"]
  },
  "video/h264-rcdo": {
    "source": "iana"
  },
  "video/h264-svc": {
    "source": "iana"
  },
  "video/h265": {
    "source": "iana"
  },
  "video/iso.segment": {
    "source": "iana",
    "extensions": ["m4s"]
  },
  "video/jpeg": {
    "source": "iana",
    "extensions": ["jpgv"]
  },
  "video/jpeg2000": {
    "source": "iana"
  },
  "video/jpm": {
    "source": "apache",
    "extensions": ["jpm","jpgm"]
  },
  "video/jxsv": {
    "source": "iana"
  },
  "video/mj2": {
    "source": "iana",
    "extensions": ["mj2","mjp2"]
  },
  "video/mp1s": {
    "source": "iana"
  },
  "video/mp2p": {
    "source": "iana"
  },
  "video/mp2t": {
    "source": "iana",
    "extensions": ["ts"]
  },
  "video/mp4": {
    "source": "iana",
    "compressible": false,
    "extensions": ["mp4","mp4v","mpg4"]
  },
  "video/mp4v-es": {
    "source": "iana"
  },
  "video/mpeg": {
    "source": "iana",
    "compressible": false,
    "extensions": ["mpeg","mpg","mpe","m1v","m2v"]
  },
  "video/mpeg4-generic": {
    "source": "iana"
  },
  "video/mpv": {
    "source": "iana"
  },
  "video/nv": {
    "source": "iana"
  },
  "video/ogg": {
    "source": "iana",
    "compressible": false,
    "extensions": ["ogv"]
  },
  "video/parityfec": {
    "source": "iana"
  },
  "video/pointer": {
    "source": "iana"
  },
  "video/quicktime": {
    "source": "iana",
    "compressible": false,
    "extensions": ["qt","mov"]
  },
  "video/raptorfec": {
    "source": "iana"
  },
  "video/raw": {
    "source": "iana"
  },
  "video/rtp-enc-aescm128": {
    "source": "iana"
  },
  "video/rtploopback": {
    "source": "iana"
  },
  "video/rtx": {
    "source": "iana"
  },
  "video/scip": {
    "source": "iana"
  },
  "video/smpte291": {
    "source": "iana"
  },
  "video/smpte292m": {
    "source": "iana"
  },
  "video/ulpfec": {
    "source": "iana"
  },
  "video/vc1": {
    "source": "iana"
  },
  "video/vc2": {
    "source": "iana"
  },
  "video/vnd.cctv": {
    "source": "iana"
  },
  "video/vnd.dece.hd": {
    "source": "iana",
    "extensions": ["uvh","uvvh"]
  },
  "video/vnd.dece.mobile": {
    "source": "iana",
    "extensions": ["uvm","uvvm"]
  },
  "video/vnd.dece.mp4": {
    "source": "iana"
  },
  "video/vnd.dece.pd": {
    "source": "iana",
    "extensions": ["uvp","uvvp"]
  },
  "video/vnd.dece.sd": {
    "source": "iana",
    "extensions": ["uvs","uvvs"]
  },
  "video/vnd.dece.video": {
    "source": "iana",
    "extensions": ["uvv","uvvv"]
  },
  "video/vnd.directv.mpeg": {
    "source": "iana"
  },
  "video/vnd.directv.mpeg-tts": {
    "source": "iana"
  },
  "video/vnd.dlna.mpeg-tts": {
    "source": "iana"
  },
  "video/vnd.dvb.file": {
    "source": "iana",
    "extensions": ["dvb"]
  },
  "video/vnd.fvt": {
    "source": "iana",
    "extensions": ["fvt"]
  },
  "video/vnd.hns.video": {
    "source": "iana"
  },
  "video/vnd.iptvforum.1dparityfec-1010": {
    "source": "iana"
  },
  "video/vnd.iptvforum.1dparityfec-2005": {
    "source": "iana"
  },
  "video/vnd.iptvforum.2dparityfec-1010": {
    "source": "iana"
  },
  "video/vnd.iptvforum.2dparityfec-2005": {
    "source": "iana"
  },
  "video/vnd.iptvforum.ttsavc": {
    "source": "iana"
  },
  "video/vnd.iptvforum.ttsmpeg2": {
    "source": "iana"
  },
  "video/vnd.motorola.video": {
    "source": "iana"
  },
  "video/vnd.motorola.videop": {
    "source": "iana"
  },
  "video/vnd.mpegurl": {
    "source": "iana",
    "extensions": ["mxu","m4u"]
  },
  "video/vnd.ms-playready.media.pyv": {
    "source": "iana",
    "extensions": ["pyv"]
  },
  "video/vnd.nokia.interleaved-multimedia": {
    "source": "iana"
  },
  "video/vnd.nokia.mp4vr": {
    "source": "iana"
  },
  "video/vnd.nokia.videovoip": {
    "source": "iana"
  },
  "video/vnd.objectvideo": {
    "source": "iana"
  },
  "video/vnd.radgamettools.bink": {
    "source": "iana"
  },
  "video/vnd.radgamettools.smacker": {
    "source": "iana"
  },
  "video/vnd.sealed.mpeg1": {
    "source": "iana"
  },
  "video/vnd.sealed.mpeg4": {
    "source": "iana"
  },
  "video/vnd.sealed.swf": {
    "source": "iana"
  },
  "video/vnd.sealedmedia.softseal.mov": {
    "source": "iana"
  },
  "video/vnd.uvvu.mp4": {
    "source": "iana",
    "extensions": ["uvu","uvvu"]
  },
  "video/vnd.vivo": {
    "source": "iana",
    "extensions": ["viv"]
  },
  "video/vnd.youtube.yt": {
    "source": "iana"
  },
  "video/vp8": {
    "source": "iana"
  },
  "video/vp9": {
    "source": "iana"
  },
  "video/webm": {
    "source": "apache",
    "compressible": false,
    "extensions": ["webm"]
  },
  "video/x-f4v": {
    "source": "apache",
    "extensions": ["f4v"]
  },
  "video/x-fli": {
    "source": "apache",
    "extensions": ["fli"]
  },
  "video/x-flv": {
    "source": "apache",
    "compressible": false,
    "extensions": ["flv"]
  },
  "video/x-m4v": {
    "source": "apache",
    "extensions": ["m4v"]
  },
  "video/x-matroska": {
    "source": "apache",
    "compressible": false,
    "extensions": ["mkv","mk3d","mks"]
  },
  "video/x-mng": {
    "source": "apache",
    "extensions": ["mng"]
  },
  "video/x-ms-asf": {
    "source": "apache",
    "extensions": ["asf","asx"]
  },
  "video/x-ms-vob": {
    "source": "apache",
    "extensions": ["vob"]
  },
  "video/x-ms-wm": {
    "source": "apache",
    "extensions": ["wm"]
  },
  "video/x-ms-wmv": {
    "source": "apache",
    "compressible": false,
    "extensions": ["wmv"]
  },
  "video/x-ms-wmx": {
    "source": "apache",
    "extensions": ["wmx"]
  },
  "video/x-ms-wvx": {
    "source": "apache",
    "extensions": ["wvx"]
  },
  "video/x-msvideo": {
    "source": "apache",
    "extensions": ["avi"]
  },
  "video/x-sgi-movie": {
    "source": "apache",
    "extensions": ["movie"]
  },
  "video/x-smv": {
    "source": "apache",
    "extensions": ["smv"]
  },
  "x-conference/x-cooltalk": {
    "source": "apache",
    "extensions": ["ice"]
  },
  "x-shader/x-fragment": {
    "compressible": true
  },
  "x-shader/x-vertex": {
    "compressible": true
  }
}
/*!
 * mime-db
 * Copyright(c) 2014 Jonathan Ong
 * Copyright(c) 2015-2022 Douglas Christopher Wilson
 * MIT Licensed
 */

/**
 * Module exports.
 */

module.exports = require('./db.json')
{
  "name": "mime-db",
  "description": "Media Type Database",
  "version": "1.52.0",
  "license": "MIT",
  "repository": "jshttp/mime-db",
  "devDependencies": {
    "bluebird": "3.7.2",
    "co": "4.6.0",
    "cogent": "1.0.1",
    "csv-parse": "4.16.3",
    "eslint": "7.32.0",
    "eslint-config-standard": "15.0.1",
    "eslint-plugin-import": "2.25.4",
    "eslint-plugin-markdown": "2.2.1",
    "eslint-plugin-node": "11.1.0",
    "eslint-plugin-promise": "5.1.1",
    "eslint-plugin-standard": "4.1.0",
    "gnode": "0.1.2",
    "media-typer": "1.1.0",
    "mocha": "9.2.1",
    "nyc": "15.1.0",
    "raw-body": "2.5.0",
    "stream-to-array": "2.3.0"
  },
  "files": [
    "HISTORY.md",
    "LICENSE",
    "README.md",
    "db.json",
    "index.js"
  ],
  "engines": {
    "node": ">= 0.6"
  }
}2.1.35 / 2022-03-12
===================

  * deps: mime-db@1.52.0
    - Add extensions from IANA for more `image/*` types
    - Add extension `.asc` to `application/pgp-keys`
    - Add extensions to various XML types
    - Add new upstream MIME types

2.1.34 / 2021-11-08
===================

  * deps: mime-db@1.51.0
    - Add new upstream MIME types

2.1.33 / 2021-10-01
===================

  * deps: mime-db@1.50.0
    - Add deprecated iWorks mime types and extensions
    - Add new upstream MIME types

2.1.32 / 2021-07-27
===================

  * deps: mime-db@1.49.0
    - Add extension `.trig` to `application/trig`
    - Add new upstream MIME types

2.1.31 / 2021-06-01
===================

  * deps: mime-db@1.48.0
    - Add extension `.mvt` to `application/vnd.mapbox-vector-tile`
    - Add new upstream MIME types

2.1.30 / 2021-04-02
===================

  * deps: mime-db@1.47.0
    - Add extension `.amr` to `audio/amr`
    - Remove ambigious extensions from IANA for `application/*+xml` types
    - Update primary extension to `.es` for `application/ecmascript`

2.1.29 / 2021-02-17
===================

  * deps: mime-db@1.46.0
    - Add extension `.amr` to `audio/amr`
    - Add extension `.m4s` to `video/iso.segment`
    - Add extension `.opus` to `audio/ogg`
    - Add new upstream MIME types

2.1.28 / 2021-01-01
===================

  * deps: mime-db@1.45.0
    - Add `application/ubjson` with extension `.ubj`
    - Add `image/avif` with extension `.avif`
    - Add `image/ktx2` with extension `.ktx2`
    - Add extension `.dbf` to `application/vnd.dbf`
    - Add extension `.rar` to `application/vnd.rar`
    - Add extension `.td` to `application/urc-targetdesc+xml`
    - Add new upstream MIME types
    - Fix extension of `application/vnd.apple.keynote` to be `.key`

2.1.27 / 2020-04-23
===================

  * deps: mime-db@1.44.0
    - Add charsets from IANA
    - Add extension `.cjs` to `application/node`
    - Add new upstream MIME types

2.1.26 / 2020-01-05
===================

  * deps: mime-db@1.43.0
    - Add `application/x-keepass2` with extension `.kdbx`
    - Add extension `.mxmf` to `audio/mobile-xmf`
    - Add extensions from IANA for `application/*+xml` types
    - Add new upstream MIME types

2.1.25 / 2019-11-12
===================

  * deps: mime-db@1.42.0
    - Add new upstream MIME types
    - Add `application/toml` with extension `.toml`
    - Add `image/vnd.ms-dds` with extension `.dds`

2.1.24 / 2019-04-20
===================

  * deps: mime-db@1.40.0
    - Add extensions from IANA for `model/*` types
    - Add `text/mdx` with extension `.mdx`

2.1.23 / 2019-04-17
===================

  * deps: mime-db@~1.39.0
    - Add extensions `.siv` and `.sieve` to `application/sieve`
    - Add new upstream MIME types

2.1.22 / 2019-02-14
===================

  * deps: mime-db@~1.38.0
    - Add extension `.nq` to `application/n-quads`
    - Add extension `.nt` to `application/n-triples`
    - Add new upstream MIME types

2.1.21 / 2018-10-19
===================

  * deps: mime-db@~1.37.0
    - Add extensions to HEIC image types
    - Add new upstream MIME types

2.1.20 / 2018-08-26
===================

  * deps: mime-db@~1.36.0
    - Add Apple file extensions from IANA
    - Add extensions from IANA for `image/*` types
    - Add new upstream MIME types

2.1.19 / 2018-07-17
===================

  * deps: mime-db@~1.35.0
    - Add extension `.csl` to `application/vnd.citationstyles.style+xml`
    - Add extension `.es` to `application/ecmascript`
    - Add extension `.owl` to `application/rdf+xml`
    - Add new upstream MIME types
    - Add UTF-8 as default charset for `text/turtle`

2.1.18 / 2018-02-16
===================

  * deps: mime-db@~1.33.0
    - Add `application/raml+yaml` with extension `.raml`
    - Add `application/wasm` with extension `.wasm`
    - Add `text/shex` with extension `.shex`
    - Add extensions for JPEG-2000 images
    - Add extensions from IANA for `message/*` types
    - Add new upstream MIME types
    - Update font MIME types
    - Update `text/hjson` to registered `application/hjson`

2.1.17 / 2017-09-01
===================

  * deps: mime-db@~1.30.0
    - Add `application/vnd.ms-outlook`
    - Add `application/x-arj`
    - Add extension `.mjs` to `application/javascript`
    - Add glTF types and extensions
    - Add new upstream MIME types
    - Add `text/x-org`
    - Add VirtualBox MIME types
    - Fix `source` records for `video/*` types that are IANA
    - Update `font/opentype` to registered `font/otf`

2.1.16 / 2017-07-24
===================

  * deps: mime-db@~1.29.0
    - Add `application/fido.trusted-apps+json`
    - Add extension `.wadl` to `application/vnd.sun.wadl+xml`
    - Add extension `.gz` to `application/gzip`
    - Add new upstream MIME types
    - Update extensions `.md` and `.markdown` to be `text/markdown`

2.1.15 / 2017-03-23
===================

  * deps: mime-db@~1.27.0
    - Add new mime types
    - Add `image/apng`

2.1.14 / 2017-01-14
===================

  * deps: mime-db@~1.26.0
    - Add new mime types

2.1.13 / 2016-11-18
===================

  * deps: mime-db@~1.25.0
    - Add new mime types

2.1.12 / 2016-09-18
===================

  * deps: mime-db@~1.24.0
    - Add new mime types
    - Add `audio/mp3`

2.1.11 / 2016-05-01
===================

  * deps: mime-db@~1.23.0
    - Add new mime types

2.1.10 / 2016-02-15
===================

  * deps: mime-db@~1.22.0
    - Add new mime types
    - Fix extension of `application/dash+xml`
    - Update primary extension for `audio/mp4`

2.1.9 / 2016-01-06
==================

  * deps: mime-db@~1.21.0
    - Add new mime types

2.1.8 / 2015-11-30
==================

  * deps: mime-db@~1.20.0
    - Add new mime types

2.1.7 / 2015-09-20
==================

  * deps: mime-db@~1.19.0
    - Add new mime types

2.1.6 / 2015-09-03
==================

  * deps: mime-db@~1.18.0
    - Add new mime types

2.1.5 / 2015-08-20
==================

  * deps: mime-db@~1.17.0
    - Add new mime types

2.1.4 / 2015-07-30
==================

  * deps: mime-db@~1.16.0
    - Add new mime types

2.1.3 / 2015-07-13
==================

  * deps: mime-db@~1.15.0
    - Add new mime types

2.1.2 / 2015-06-25
==================

  * deps: mime-db@~1.14.0
    - Add new mime types

2.1.1 / 2015-06-08
==================

  * perf: fix deopt during mapping

2.1.0 / 2015-06-07
==================

  * Fix incorrectly treating extension-less file name as extension
    - i.e. `'path/to/json'` will no longer return `application/json`
  * Fix `.charset(type)` to accept parameters
  * Fix `.charset(type)` to match case-insensitive
  * Improve generation of extension to MIME mapping
  * Refactor internals for readability and no argument reassignment
  * Prefer `application/*` MIME types from the same source
  * Prefer any type over `application/octet-stream`
  * deps: mime-db@~1.13.0
    - Add nginx as a source
    - Add new mime types

2.0.14 / 2015-06-06
===================

  * deps: mime-db@~1.12.0
    - Add new mime types

2.0.13 / 2015-05-31
===================

  * deps: mime-db@~1.11.0
    - Add new mime types

2.0.12 / 2015-05-19
===================

  * deps: mime-db@~1.10.0
    - Add new mime types

2.0.11 / 2015-05-05
===================

  * deps: mime-db@~1.9.1
    - Add new mime types

2.0.10 / 2015-03-13
===================

  * deps: mime-db@~1.8.0
    - Add new mime types

2.0.9 / 2015-02-09
==================

  * deps: mime-db@~1.7.0
    - Add new mime types
    - Community extensions ownership transferred from `node-mime`

2.0.8 / 2015-01-29
==================

  * deps: mime-db@~1.6.0
    - Add new mime types

2.0.7 / 2014-12-30
==================

  * deps: mime-db@~1.5.0
    - Add new mime types
    - Fix various invalid MIME type entries

2.0.6 / 2014-12-30
==================

  * deps: mime-db@~1.4.0
    - Add new mime types
    - Fix various invalid MIME type entries
    - Remove example template MIME types

2.0.5 / 2014-12-29
==================

  * deps: mime-db@~1.3.1
    - Fix missing extensions

2.0.4 / 2014-12-10
==================

  * deps: mime-db@~1.3.0
    - Add new mime types

2.0.3 / 2014-11-09
==================

  * deps: mime-db@~1.2.0
    - Add new mime types

2.0.2 / 2014-09-28
==================

  * deps: mime-db@~1.1.0
    - Add new mime types
    - Update charsets

2.0.1 / 2014-09-07
==================

  * Support Node.js 0.6

2.0.0 / 2014-09-02
==================

  * Use `mime-db`
  * Remove `.define()`

1.0.2 / 2014-08-04
==================

  * Set charset=utf-8 for `text/javascript`

1.0.1 / 2014-06-24
==================

  * Add `text/jsx` type

1.0.0 / 2014-05-12
==================

  * Return `false` for unknown types
  * Set charset=utf-8 for `application/json`

0.1.0 / 2014-05-02
==================

  * Initial release
(The MIT License)

Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
Copyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.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.
/*!
 * mime-types
 * Copyright(c) 2014 Jonathan Ong
 * Copyright(c) 2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module dependencies.
 * @private
 */

var db = require('mime-db')
var extname = require('path').extname

/**
 * Module variables.
 * @private
 */

var EXTRACT_TYPE_REGEXP = /^\s*([^;\s]*)(?:;|\s|$)/
var TEXT_TYPE_REGEXP = /^text\//i

/**
 * Module exports.
 * @public
 */

exports.charset = charset
exports.charsets = { lookup: charset }
exports.contentType = contentType
exports.extension = extension
exports.extensions = Object.create(null)
exports.lookup = lookup
exports.types = Object.create(null)

// Populate the extensions/types maps
populateMaps(exports.extensions, exports.types)

/**
 * Get the default charset for a MIME type.
 *
 * @param {string} type
 * @return {boolean|string}
 */

function charset (type) {
  if (!type || typeof type !== 'string') {
    return false
  }

  // TODO: use media-typer
  var match = EXTRACT_TYPE_REGEXP.exec(type)
  var mime = match && db[match[1].toLowerCase()]

  if (mime && mime.charset) {
    return mime.charset
  }

  // default text/* to utf-8
  if (match && TEXT_TYPE_REGEXP.test(match[1])) {
    return 'UTF-8'
  }

  return false
}

/**
 * Create a full Content-Type header given a MIME type or extension.
 *
 * @param {string} str
 * @return {boolean|string}
 */

function contentType (str) {
  // TODO: should this even be in this module?
  if (!str || typeof str !== 'string') {
    return false
  }

  var mime = str.indexOf('/') === -1
    ? exports.lookup(str)
    : str

  if (!mime) {
    return false
  }

  // TODO: use content-type or other module
  if (mime.indexOf('charset') === -1) {
    var charset = exports.charset(mime)
    if (charset) mime += '; charset=' + charset.toLowerCase()
  }

  return mime
}

/**
 * Get the default extension for a MIME type.
 *
 * @param {string} type
 * @return {boolean|string}
 */

function extension (type) {
  if (!type || typeof type !== 'string') {
    return false
  }

  // TODO: use media-typer
  var match = EXTRACT_TYPE_REGEXP.exec(type)

  // get extensions
  var exts = match && exports.extensions[match[1].toLowerCase()]

  if (!exts || !exts.length) {
    return false
  }

  return exts[0]
}

/**
 * Lookup the MIME type for a file path/extension.
 *
 * @param {string} path
 * @return {boolean|string}
 */

function lookup (path) {
  if (!path || typeof path !== 'string') {
    return false
  }

  // get the extension ("ext" or ".ext" or full path)
  var extension = extname('x.' + path)
    .toLowerCase()
    .substr(1)

  if (!extension) {
    return false
  }

  return exports.types[extension] || false
}

/**
 * Populate the extensions and types maps.
 * @private
 */

function populateMaps (extensions, types) {
  // source preference (least -> most)
  var preference = ['nginx', 'apache', undefined, 'iana']

  Object.keys(db).forEach(function forEachMimeType (type) {
    var mime = db[type]
    var exts = mime.extensions

    if (!exts || !exts.length) {
      return
    }

    // mime -> extensions
    extensions[type] = exts

    // extension -> mime
    for (var i = 0; i < exts.length; i++) {
      var extension = exts[i]

      if (types[extension]) {
        var from = preference.indexOf(db[types[extension]].source)
        var to = preference.indexOf(mime.source)

        if (types[extension] !== 'application/octet-stream' &&
          (from > to || (from === to && types[extension].substr(0, 12) === 'application/'))) {
          // skip the remapping
          continue
        }
      }

      // set the extension -> mime
      types[extension] = type
    }
  })
}
{
  "name": "mime-types",
  "description": "The ultimate javascript content-type utility.",
  "version": "2.1.35",
  "license": "MIT",
  "repository": "jshttp/mime-types",
  "dependencies": {
    "mime-db": "1.52.0"
  },
  "devDependencies": {
    "eslint": "7.32.0",
    "eslint-config-standard": "14.1.1",
    "eslint-plugin-import": "2.25.4",
    "eslint-plugin-markdown": "2.2.1",
    "eslint-plugin-node": "11.1.0",
    "eslint-plugin-promise": "5.2.0",
    "eslint-plugin-standard": "4.1.0",
    "mocha": "9.2.2",
    "nyc": "15.1.0"
  },
  "files": [
    "HISTORY.md",
    "LICENSE",
    "index.js"
  ],
  "engines": {
    "node": ">= 0.6"
  }
}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.
module.exports = minimatch
minimatch.Minimatch = Minimatch

var path = (function () { try { return require('path') } catch (e) {}}()) || {
  sep: '/'
}
minimatch.sep = path.sep

var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}
var expand = require('brace-expansion')

var plTypes = {
  '!': { open: '(?:(?!(?:', close: '))[^/]*?)'},
  '?': { open: '(?:', close: ')?' },
  '+': { open: '(?:', close: ')+' },
  '*': { open: '(?:', close: ')*' },
  '@': { open: '(?:', close: ')' }
}

// any single thing other than /
// don't need to escape / when using new RegExp()
var qmark = '[^/]'

// * => any number of characters
var star = qmark + '*?'

// ** when dots are allowed.  Anything goes, except .. and .
// not (^ or / followed by one or two dots followed by $ or /),
// followed by anything, any number of times.
var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?'

// not a ^ or / followed by a dot,
// followed by anything, any number of times.
var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?'

// characters that need to be escaped in RegExp.
var reSpecials = charSet('().*{}+?[]^$\\!')

// "abc" -> { a:true, b:true, c:true }
function charSet (s) {
  return s.split('').reduce(function (set, c) {
    set[c] = true
    return set
  }, {})
}

// normalizes slashes.
var slashSplit = /\/+/

minimatch.filter = filter
function filter (pattern, options) {
  options = options || {}
  return function (p, i, list) {
    return minimatch(p, pattern, options)
  }
}

function ext (a, b) {
  b = b || {}
  var t = {}
  Object.keys(a).forEach(function (k) {
    t[k] = a[k]
  })
  Object.keys(b).forEach(function (k) {
    t[k] = b[k]
  })
  return t
}

minimatch.defaults = function (def) {
  if (!def || typeof def !== 'object' || !Object.keys(def).length) {
    return minimatch
  }

  var orig = minimatch

  var m = function minimatch (p, pattern, options) {
    return orig(p, pattern, ext(def, options))
  }

  m.Minimatch = function Minimatch (pattern, options) {
    return new orig.Minimatch(pattern, ext(def, options))
  }
  m.Minimatch.defaults = function defaults (options) {
    return orig.defaults(ext(def, options)).Minimatch
  }

  m.filter = function filter (pattern, options) {
    return orig.filter(pattern, ext(def, options))
  }

  m.defaults = function defaults (options) {
    return orig.defaults(ext(def, options))
  }

  m.makeRe = function makeRe (pattern, options) {
    return orig.makeRe(pattern, ext(def, options))
  }

  m.braceExpand = function braceExpand (pattern, options) {
    return orig.braceExpand(pattern, ext(def, options))
  }

  m.match = function (list, pattern, options) {
    return orig.match(list, pattern, ext(def, options))
  }

  return m
}

Minimatch.defaults = function (def) {
  return minimatch.defaults(def).Minimatch
}

function minimatch (p, pattern, options) {
  assertValidPattern(pattern)

  if (!options) options = {}

  // shortcut: comments match nothing.
  if (!options.nocomment && pattern.charAt(0) === '#') {
    return false
  }

  return new Minimatch(pattern, options).match(p)
}

function Minimatch (pattern, options) {
  if (!(this instanceof Minimatch)) {
    return new Minimatch(pattern, options)
  }

  assertValidPattern(pattern)

  if (!options) options = {}

  pattern = pattern.trim()

  // windows support: need to use /, not \
  if (!options.allowWindowsEscape && path.sep !== '/') {
    pattern = pattern.split(path.sep).join('/')
  }

  this.options = options
  this.set = []
  this.pattern = pattern
  this.regexp = null
  this.negate = false
  this.comment = false
  this.empty = false
  this.partial = !!options.partial

  // make the set of regexps etc.
  this.make()
}

Minimatch.prototype.debug = function () {}

Minimatch.prototype.make = make
function make () {
  var pattern = this.pattern
  var options = this.options

  // empty patterns and comments match nothing.
  if (!options.nocomment && pattern.charAt(0) === '#') {
    this.comment = true
    return
  }
  if (!pattern) {
    this.empty = true
    return
  }

  // step 1: figure out negation, etc.
  this.parseNegate()

  // step 2: expand braces
  var set = this.globSet = this.braceExpand()

  if (options.debug) this.debug = function debug() { console.error.apply(console, arguments) }

  this.debug(this.pattern, set)

  // step 3: now we have a set, so turn each one into a series of path-portion
  // matching patterns.
  // These will be regexps, except in the case of "**", which is
  // set to the GLOBSTAR object for globstar behavior,
  // and will not contain any / characters
  set = this.globParts = set.map(function (s) {
    return s.split(slashSplit)
  })

  this.debug(this.pattern, set)

  // glob --> regexps
  set = set.map(function (s, si, set) {
    return s.map(this.parse, this)
  }, this)

  this.debug(this.pattern, set)

  // filter out everything that didn't compile properly.
  set = set.filter(function (s) {
    return s.indexOf(false) === -1
  })

  this.debug(this.pattern, set)

  this.set = set
}

Minimatch.prototype.parseNegate = parseNegate
function parseNegate () {
  var pattern = this.pattern
  var negate = false
  var options = this.options
  var negateOffset = 0

  if (options.nonegate) return

  for (var i = 0, l = pattern.length
    ; i < l && pattern.charAt(i) === '!'
    ; i++) {
    negate = !negate
    negateOffset++
  }

  if (negateOffset) this.pattern = pattern.substr(negateOffset)
  this.negate = negate
}

// Brace expansion:
// a{b,c}d -> abd acd
// a{b,}c -> abc ac
// a{0..3}d -> a0d a1d a2d a3d
// a{b,c{d,e}f}g -> abg acdfg acefg
// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
//
// Invalid sets are not expanded.
// a{2..}b -> a{2..}b
// a{b}c -> a{b}c
minimatch.braceExpand = function (pattern, options) {
  return braceExpand(pattern, options)
}

Minimatch.prototype.braceExpand = braceExpand

function braceExpand (pattern, options) {
  if (!options) {
    if (this instanceof Minimatch) {
      options = this.options
    } else {
      options = {}
    }
  }

  pattern = typeof pattern === 'undefined'
    ? this.pattern : pattern

  assertValidPattern(pattern)

  // Thanks to Yeting Li <https://github.com/yetingli> for
  // improving this regexp to avoid a ReDOS vulnerability.
  if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) {
    // shortcut. no need to expand.
    return [pattern]
  }

  return expand(pattern)
}

var MAX_PATTERN_LENGTH = 1024 * 64
var assertValidPattern = function (pattern) {
  if (typeof pattern !== 'string') {
    throw new TypeError('invalid pattern')
  }

  if (pattern.length > MAX_PATTERN_LENGTH) {
    throw new TypeError('pattern is too long')
  }
}

// parse a component of the expanded set.
// At this point, no pattern may contain "/" in it
// so we're going to return a 2d array, where each entry is the full
// pattern, split on '/', and then turned into a regular expression.
// A regexp is made at the end which joins each array with an
// escaped /, and another full one which joins each regexp with |.
//
// Following the lead of Bash 4.1, note that "**" only has special meaning
// when it is the *only* thing in a path portion.  Otherwise, any series
// of * is equivalent to a single *.  Globstar behavior is enabled by
// default, and can be disabled by setting options.noglobstar.
Minimatch.prototype.parse = parse
var SUBPARSE = {}
function parse (pattern, isSub) {
  assertValidPattern(pattern)

  var options = this.options

  // shortcuts
  if (pattern === '**') {
    if (!options.noglobstar)
      return GLOBSTAR
    else
      pattern = '*'
  }
  if (pattern === '') return ''

  var re = ''
  var hasMagic = !!options.nocase
  var escaping = false
  // ? => one single character
  var patternListStack = []
  var negativeLists = []
  var stateChar
  var inClass = false
  var reClassStart = -1
  var classStart = -1
  // . and .. never match anything that doesn't start with .,
  // even when options.dot is set.
  var patternStart = pattern.charAt(0) === '.' ? '' // anything
  // not (start or / followed by . or .. followed by / or end)
  : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))'
  : '(?!\\.)'
  var self = this

  function clearStateChar () {
    if (stateChar) {
      // we had some state-tracking character
      // that wasn't consumed by this pass.
      switch (stateChar) {
        case '*':
          re += star
          hasMagic = true
        break
        case '?':
          re += qmark
          hasMagic = true
        break
        default:
          re += '\\' + stateChar
        break
      }
      self.debug('clearStateChar %j %j', stateChar, re)
      stateChar = false
    }
  }

  for (var i = 0, len = pattern.length, c
    ; (i < len) && (c = pattern.charAt(i))
    ; i++) {
    this.debug('%s\t%s %s %j', pattern, i, re, c)

    // skip over any that are escaped.
    if (escaping && reSpecials[c]) {
      re += '\\' + c
      escaping = false
      continue
    }

    switch (c) {
      /* istanbul ignore next */
      case '/': {
        // completely not allowed, even escaped.
        // Should already be path-split by now.
        return false
      }

      case '\\':
        clearStateChar()
        escaping = true
      continue

      // the various stateChar values
      // for the "extglob" stuff.
      case '?':
      case '*':
      case '+':
      case '@':
      case '!':
        this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c)

        // all of those are literals inside a class, except that
        // the glob [!a] means [^a] in regexp
        if (inClass) {
          this.debug('  in class')
          if (c === '!' && i === classStart + 1) c = '^'
          re += c
          continue
        }

        // if we already have a stateChar, then it means
        // that there was something like ** or +? in there.
        // Handle the stateChar, then proceed with this one.
        self.debug('call clearStateChar %j', stateChar)
        clearStateChar()
        stateChar = c
        // if extglob is disabled, then +(asdf|foo) isn't a thing.
        // just clear the statechar *now*, rather than even diving into
        // the patternList stuff.
        if (options.noext) clearStateChar()
      continue

      case '(':
        if (inClass) {
          re += '('
          continue
        }

        if (!stateChar) {
          re += '\\('
          continue
        }

        patternListStack.push({
          type: stateChar,
          start: i - 1,
          reStart: re.length,
          open: plTypes[stateChar].open,
          close: plTypes[stateChar].close
        })
        // negation is (?:(?!js)[^/]*)
        re += stateChar === '!' ? '(?:(?!(?:' : '(?:'
        this.debug('plType %j %j', stateChar, re)
        stateChar = false
      continue

      case ')':
        if (inClass || !patternListStack.length) {
          re += '\\)'
          continue
        }

        clearStateChar()
        hasMagic = true
        var pl = patternListStack.pop()
        // negation is (?:(?!js)[^/]*)
        // The others are (?:<pattern>)<type>
        re += pl.close
        if (pl.type === '!') {
          negativeLists.push(pl)
        }
        pl.reEnd = re.length
      continue

      case '|':
        if (inClass || !patternListStack.length || escaping) {
          re += '\\|'
          escaping = false
          continue
        }

        clearStateChar()
        re += '|'
      continue

      // these are mostly the same in regexp and glob
      case '[':
        // swallow any state-tracking char before the [
        clearStateChar()

        if (inClass) {
          re += '\\' + c
          continue
        }

        inClass = true
        classStart = i
        reClassStart = re.length
        re += c
      continue

      case ']':
        //  a right bracket shall lose its special
        //  meaning and represent itself in
        //  a bracket expression if it occurs
        //  first in the list.  -- POSIX.2 2.8.3.2
        if (i === classStart + 1 || !inClass) {
          re += '\\' + c
          escaping = false
          continue
        }

        // handle the case where we left a class open.
        // "[z-a]" is valid, equivalent to "\[z-a\]"
        // split where the last [ was, make sure we don't have
        // an invalid re. if so, re-walk the contents of the
        // would-be class to re-translate any characters that
        // were passed through as-is
        // TODO: It would probably be faster to determine this
        // without a try/catch and a new RegExp, but it's tricky
        // to do safely.  For now, this is safe and works.
        var cs = pattern.substring(classStart + 1, i)
        try {
          RegExp('[' + cs + ']')
        } catch (er) {
          // not a valid class!
          var sp = this.parse(cs, SUBPARSE)
          re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]'
          hasMagic = hasMagic || sp[1]
          inClass = false
          continue
        }

        // finish up the class.
        hasMagic = true
        inClass = false
        re += c
      continue

      default:
        // swallow any state char that wasn't consumed
        clearStateChar()

        if (escaping) {
          // no need
          escaping = false
        } else if (reSpecials[c]
          && !(c === '^' && inClass)) {
          re += '\\'
        }

        re += c

    } // switch
  } // for

  // handle the case where we left a class open.
  // "[abc" is valid, equivalent to "\[abc"
  if (inClass) {
    // split where the last [ was, and escape it
    // this is a huge pita.  We now have to re-walk
    // the contents of the would-be class to re-translate
    // any characters that were passed through as-is
    cs = pattern.substr(classStart + 1)
    sp = this.parse(cs, SUBPARSE)
    re = re.substr(0, reClassStart) + '\\[' + sp[0]
    hasMagic = hasMagic || sp[1]
  }

  // handle the case where we had a +( thing at the *end*
  // of the pattern.
  // each pattern list stack adds 3 chars, and we need to go through
  // and escape any | chars that were passed through as-is for the regexp.
  // Go through and escape them, taking care not to double-escape any
  // | chars that were already escaped.
  for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {
    var tail = re.slice(pl.reStart + pl.open.length)
    this.debug('setting tail', re, pl)
    // maybe some even number of \, then maybe 1 \, followed by a |
    tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) {
      if (!$2) {
        // the | isn't already escaped, so escape it.
        $2 = '\\'
      }

      // need to escape all those slashes *again*, without escaping the
      // one that we need for escaping the | character.  As it works out,
      // escaping an even number of slashes can be done by simply repeating
      // it exactly after itself.  That's why this trick works.
      //
      // I am sorry that you have to see this.
      return $1 + $1 + $2 + '|'
    })

    this.debug('tail=%j\n   %s', tail, tail, pl, re)
    var t = pl.type === '*' ? star
      : pl.type === '?' ? qmark
      : '\\' + pl.type

    hasMagic = true
    re = re.slice(0, pl.reStart) + t + '\\(' + tail
  }

  // handle trailing things that only matter at the very end.
  clearStateChar()
  if (escaping) {
    // trailing \\
    re += '\\\\'
  }

  // only need to apply the nodot start if the re starts with
  // something that could conceivably capture a dot
  var addPatternStart = false
  switch (re.charAt(0)) {
    case '[': case '.': case '(': addPatternStart = true
  }

  // Hack to work around lack of negative lookbehind in JS
  // A pattern like: *.!(x).!(y|z) needs to ensure that a name
  // like 'a.xyz.yz' doesn't match.  So, the first negative
  // lookahead, has to look ALL the way ahead, to the end of
  // the pattern.
  for (var n = negativeLists.length - 1; n > -1; n--) {
    var nl = negativeLists[n]

    var nlBefore = re.slice(0, nl.reStart)
    var nlFirst = re.slice(nl.reStart, nl.reEnd - 8)
    var nlLast = re.slice(nl.reEnd - 8, nl.reEnd)
    var nlAfter = re.slice(nl.reEnd)

    nlLast += nlAfter

    // Handle nested stuff like *(*.js|!(*.json)), where open parens
    // mean that we should *not* include the ) in the bit that is considered
    // "after" the negated section.
    var openParensBefore = nlBefore.split('(').length - 1
    var cleanAfter = nlAfter
    for (i = 0; i < openParensBefore; i++) {
      cleanAfter = cleanAfter.replace(/\)[+*?]?/, '')
    }
    nlAfter = cleanAfter

    var dollar = ''
    if (nlAfter === '' && isSub !== SUBPARSE) {
      dollar = '$'
    }
    var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast
    re = newRe
  }

  // if the re is not "" at this point, then we need to make sure
  // it doesn't match against an empty path part.
  // Otherwise a/* will match a/, which it should not.
  if (re !== '' && hasMagic) {
    re = '(?=.)' + re
  }

  if (addPatternStart) {
    re = patternStart + re
  }

  // parsing just a piece of a larger pattern.
  if (isSub === SUBPARSE) {
    return [re, hasMagic]
  }

  // skip the regexp for non-magical patterns
  // unescape anything in it, though, so that it'll be
  // an exact match against a file etc.
  if (!hasMagic) {
    return globUnescape(pattern)
  }

  var flags = options.nocase ? 'i' : ''
  try {
    var regExp = new RegExp('^' + re + '$', flags)
  } catch (er) /* istanbul ignore next - should be impossible */ {
    // If it was an invalid regular expression, then it can't match
    // anything.  This trick looks for a character after the end of
    // the string, which is of course impossible, except in multi-line
    // mode, but it's not a /m regex.
    return new RegExp('$.')
  }

  regExp._glob = pattern
  regExp._src = re

  return regExp
}

minimatch.makeRe = function (pattern, options) {
  return new Minimatch(pattern, options || {}).makeRe()
}

Minimatch.prototype.makeRe = makeRe
function makeRe () {
  if (this.regexp || this.regexp === false) return this.regexp

  // at this point, this.set is a 2d array of partial
  // pattern strings, or "**".
  //
  // It's better to use .match().  This function shouldn't
  // be used, really, but it's pretty convenient sometimes,
  // when you just want to work with a regex.
  var set = this.set

  if (!set.length) {
    this.regexp = false
    return this.regexp
  }
  var options = this.options

  var twoStar = options.noglobstar ? star
    : options.dot ? twoStarDot
    : twoStarNoDot
  var flags = options.nocase ? 'i' : ''

  var re = set.map(function (pattern) {
    return pattern.map(function (p) {
      return (p === GLOBSTAR) ? twoStar
      : (typeof p === 'string') ? regExpEscape(p)
      : p._src
    }).join('\\\/')
  }).join('|')

  // must match entire pattern
  // ending in a * or ** will make it less strict.
  re = '^(?:' + re + ')$'

  // can match anything, as long as it's not this.
  if (this.negate) re = '^(?!' + re + ').*$'

  try {
    this.regexp = new RegExp(re, flags)
  } catch (ex) /* istanbul ignore next - should be impossible */ {
    this.regexp = false
  }
  return this.regexp
}

minimatch.match = function (list, pattern, options) {
  options = options || {}
  var mm = new Minimatch(pattern, options)
  list = list.filter(function (f) {
    return mm.match(f)
  })
  if (mm.options.nonull && !list.length) {
    list.push(pattern)
  }
  return list
}

Minimatch.prototype.match = function match (f, partial) {
  if (typeof partial === 'undefined') partial = this.partial
  this.debug('match', f, this.pattern)
  // short-circuit in the case of busted things.
  // comments, etc.
  if (this.comment) return false
  if (this.empty) return f === ''

  if (f === '/' && partial) return true

  var options = this.options

  // windows: need to use /, not \
  if (path.sep !== '/') {
    f = f.split(path.sep).join('/')
  }

  // treat the test path as a set of pathparts.
  f = f.split(slashSplit)
  this.debug(this.pattern, 'split', f)

  // just ONE of the pattern sets in this.set needs to match
  // in order for it to be valid.  If negating, then just one
  // match means that we have failed.
  // Either way, return on the first hit.

  var set = this.set
  this.debug(this.pattern, 'set', set)

  // Find the basename of the path by looking for the last non-empty segment
  var filename
  var i
  for (i = f.length - 1; i >= 0; i--) {
    filename = f[i]
    if (filename) break
  }

  for (i = 0; i < set.length; i++) {
    var pattern = set[i]
    var file = f
    if (options.matchBase && pattern.length === 1) {
      file = [filename]
    }
    var hit = this.matchOne(file, pattern, partial)
    if (hit) {
      if (options.flipNegate) return true
      return !this.negate
    }
  }

  // didn't get any hits.  this is success if it's a negative
  // pattern, failure otherwise.
  if (options.flipNegate) return false
  return this.negate
}

// set partial to true to test if, for example,
// "/a/b" matches the start of "/*/b/*/d"
// Partial means, if you run out of file before you run
// out of pattern, then that's fine, as long as all
// the parts match.
Minimatch.prototype.matchOne = function (file, pattern, partial) {
  var options = this.options

  this.debug('matchOne',
    { 'this': this, file: file, pattern: pattern })

  this.debug('matchOne', file.length, pattern.length)

  for (var fi = 0,
      pi = 0,
      fl = file.length,
      pl = pattern.length
      ; (fi < fl) && (pi < pl)
      ; fi++, pi++) {
    this.debug('matchOne loop')
    var p = pattern[pi]
    var f = file[fi]

    this.debug(pattern, p, f)

    // should be impossible.
    // some invalid regexp stuff in the set.
    /* istanbul ignore if */
    if (p === false) return false

    if (p === GLOBSTAR) {
      this.debug('GLOBSTAR', [pattern, p, f])

      // "**"
      // a/**/b/**/c would match the following:
      // a/b/x/y/z/c
      // a/x/y/z/b/c
      // a/b/x/b/x/c
      // a/b/c
      // To do this, take the rest of the pattern after
      // the **, and see if it would match the file remainder.
      // If so, return success.
      // If not, the ** "swallows" a segment, and try again.
      // This is recursively awful.
      //
      // a/**/b/**/c matching a/b/x/y/z/c
      // - a matches a
      // - doublestar
      //   - matchOne(b/x/y/z/c, b/**/c)
      //     - b matches b
      //     - doublestar
      //       - matchOne(x/y/z/c, c) -> no
      //       - matchOne(y/z/c, c) -> no
      //       - matchOne(z/c, c) -> no
      //       - matchOne(c, c) yes, hit
      var fr = fi
      var pr = pi + 1
      if (pr === pl) {
        this.debug('** at the end')
        // a ** at the end will just swallow the rest.
        // We have found a match.
        // however, it will not swallow /.x, unless
        // options.dot is set.
        // . and .. are *never* matched by **, for explosively
        // exponential reasons.
        for (; fi < fl; fi++) {
          if (file[fi] === '.' || file[fi] === '..' ||
            (!options.dot && file[fi].charAt(0) === '.')) return false
        }
        return true
      }

      // ok, let's see if we can swallow whatever we can.
      while (fr < fl) {
        var swallowee = file[fr]

        this.debug('\nglobstar while', file, fr, pattern, pr, swallowee)

        // XXX remove this slice.  Just pass the start index.
        if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
          this.debug('globstar found match!', fr, fl, swallowee)
          // found a match.
          return true
        } else {
          // can't swallow "." or ".." ever.
          // can only swallow ".foo" when explicitly asked.
          if (swallowee === '.' || swallowee === '..' ||
            (!options.dot && swallowee.charAt(0) === '.')) {
            this.debug('dot detected!', file, fr, pattern, pr)
            break
          }

          // ** swallows a segment, and continue.
          this.debug('globstar swallow a segment, and continue')
          fr++
        }
      }

      // no match was found.
      // However, in partial mode, we can't say this is necessarily over.
      // If there's more *pattern* left, then
      /* istanbul ignore if */
      if (partial) {
        // ran out of file
        this.debug('\n>>> no match, partial?', file, fr, pattern, pr)
        if (fr === fl) return true
      }
      return false
    }

    // something other than **
    // non-magic patterns just have to match exactly
    // patterns with magic have been turned into regexps.
    var hit
    if (typeof p === 'string') {
      hit = f === p
      this.debug('string match', p, f, hit)
    } else {
      hit = f.match(p)
      this.debug('pattern match', p, f, hit)
    }

    if (!hit) return false
  }

  // Note: ending in / means that we'll get a final ""
  // at the end of the pattern.  This can only match a
  // corresponding "" at the end of the file.
  // If the file ends in /, then it can only match a
  // a pattern that ends in /, unless the pattern just
  // doesn't have any more for it. But, a/b/ should *not*
  // match "a/b/*", even though "" matches against the
  // [^/]*? pattern, except in partial mode, where it might
  // simply not be reached yet.
  // However, a/b/ should still satisfy a/*

  // now either we fell off the end of the pattern, or we're done.
  if (fi === fl && pi === pl) {
    // ran out of pattern and filename at the same time.
    // an exact hit!
    return true
  } else if (fi === fl) {
    // ran out of file, but still had pattern left.
    // this is ok if we're doing the match as part of
    // a glob fs traversal.
    return partial
  } else /* istanbul ignore else */ if (pi === pl) {
    // ran out of pattern, still have file left.
    // this is only acceptable if we're on the very last
    // empty segment of a file with a trailing slash.
    // a/* should match a/b/
    return (fi === fl - 1) && (file[fi] === '')
  }

  // should be unreachable.
  /* istanbul ignore next */
  throw new Error('wtf?')
}

// replace stuff like \* with *
function globUnescape (s) {
  return s.replace(/\\(.)/g, '$1')
}

function regExpEscape (s) {
  return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
}
{
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me)",
  "name": "minimatch",
  "description": "a glob matcher in javascript",
  "version": "3.1.2",
  "publishConfig": {
    "tag": "v3-legacy"
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/minimatch.git"
  },
  "main": "minimatch.js",
  "engines": {
    "node": "*"
  },
  "dependencies": {
    "brace-expansion": "^1.1.7"
  },
  "devDependencies": {
    "tap": "^15.1.6"
  },
  "license": "ISC",
  "files": [
    "minimatch.js"
  ]
}This software is released under the MIT license:

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.
module.exports = function (args, opts) {
    if (!opts) opts = {};
    
    var flags = { bools : {}, strings : {}, unknownFn: null };

    if (typeof opts['unknown'] === 'function') {
        flags.unknownFn = opts['unknown'];
    }

    if (typeof opts['boolean'] === 'boolean' && opts['boolean']) {
      flags.allBools = true;
    } else {
      [].concat(opts['boolean']).filter(Boolean).forEach(function (key) {
          flags.bools[key] = true;
      });
    }
    
    var aliases = {};
    Object.keys(opts.alias || {}).forEach(function (key) {
        aliases[key] = [].concat(opts.alias[key]);
        aliases[key].forEach(function (x) {
            aliases[x] = [key].concat(aliases[key].filter(function (y) {
                return x !== y;
            }));
        });
    });

    [].concat(opts.string).filter(Boolean).forEach(function (key) {
        flags.strings[key] = true;
        if (aliases[key]) {
            flags.strings[aliases[key]] = true;
        }
     });

    var defaults = opts['default'] || {};
    
    var argv = { _ : [] };
    Object.keys(flags.bools).forEach(function (key) {
        setArg(key, defaults[key] === undefined ? false : defaults[key]);
    });
    
    var notFlags = [];

    if (args.indexOf('--') !== -1) {
        notFlags = args.slice(args.indexOf('--')+1);
        args = args.slice(0, args.indexOf('--'));
    }

    function argDefined(key, arg) {
        return (flags.allBools && /^--[^=]+$/.test(arg)) ||
            flags.strings[key] || flags.bools[key] || aliases[key];
    }

    function setArg (key, val, arg) {
        if (arg && flags.unknownFn && !argDefined(key, arg)) {
            if (flags.unknownFn(arg) === false) return;
        }

        var value = !flags.strings[key] && isNumber(val)
            ? Number(val) : val
        ;
        setKey(argv, key.split('.'), value);
        
        (aliases[key] || []).forEach(function (x) {
            setKey(argv, x.split('.'), value);
        });
    }

    function setKey (obj, keys, value) {
        var o = obj;
        for (var i = 0; i < keys.length-1; i++) {
            var key = keys[i];
            if (isConstructorOrProto(o, key)) return;
            if (o[key] === undefined) o[key] = {};
            if (o[key] === Object.prototype || o[key] === Number.prototype
                || o[key] === String.prototype) o[key] = {};
            if (o[key] === Array.prototype) o[key] = [];
            o = o[key];
        }

        var key = keys[keys.length - 1];
        if (isConstructorOrProto(o, key)) return;
        if (o === Object.prototype || o === Number.prototype
            || o === String.prototype) o = {};
        if (o === Array.prototype) o = [];
        if (o[key] === undefined || flags.bools[key] || typeof o[key] === 'boolean') {
            o[key] = value;
        }
        else if (Array.isArray(o[key])) {
            o[key].push(value);
        }
        else {
            o[key] = [ o[key], value ];
        }
    }
    
    function aliasIsBoolean(key) {
      return aliases[key].some(function (x) {
          return flags.bools[x];
      });
    }

    for (var i = 0; i < args.length; i++) {
        var arg = args[i];
        
        if (/^--.+=/.test(arg)) {
            // Using [\s\S] instead of . because js doesn't support the
            // 'dotall' regex modifier. See:
            // http://stackoverflow.com/a/1068308/13216
            var m = arg.match(/^--([^=]+)=([\s\S]*)$/);
            var key = m[1];
            var value = m[2];
            if (flags.bools[key]) {
                value = value !== 'false';
            }
            setArg(key, value, arg);
        }
        else if (/^--no-.+/.test(arg)) {
            var key = arg.match(/^--no-(.+)/)[1];
            setArg(key, false, arg);
        }
        else if (/^--.+/.test(arg)) {
            var key = arg.match(/^--(.+)/)[1];
            var next = args[i + 1];
            if (next !== undefined && !/^-/.test(next)
            && !flags.bools[key]
            && !flags.allBools
            && (aliases[key] ? !aliasIsBoolean(key) : true)) {
                setArg(key, next, arg);
                i++;
            }
            else if (/^(true|false)$/.test(next)) {
                setArg(key, next === 'true', arg);
                i++;
            }
            else {
                setArg(key, flags.strings[key] ? '' : true, arg);
            }
        }
        else if (/^-[^-]+/.test(arg)) {
            var letters = arg.slice(1,-1).split('');
            
            var broken = false;
            for (var j = 0; j < letters.length; j++) {
                var next = arg.slice(j+2);
                
                if (next === '-') {
                    setArg(letters[j], next, arg)
                    continue;
                }
                
                if (/[A-Za-z]/.test(letters[j]) && /=/.test(next)) {
                    setArg(letters[j], next.split('=')[1], arg);
                    broken = true;
                    break;
                }
                
                if (/[A-Za-z]/.test(letters[j])
                && /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) {
                    setArg(letters[j], next, arg);
                    broken = true;
                    break;
                }
                
                if (letters[j+1] && letters[j+1].match(/\W/)) {
                    setArg(letters[j], arg.slice(j+2), arg);
                    broken = true;
                    break;
                }
                else {
                    setArg(letters[j], flags.strings[letters[j]] ? '' : true, arg);
                }
            }
            
            var key = arg.slice(-1)[0];
            if (!broken && key !== '-') {
                if (args[i+1] && !/^(-|--)[^-]/.test(args[i+1])
                && !flags.bools[key]
                && (aliases[key] ? !aliasIsBoolean(key) : true)) {
                    setArg(key, args[i+1], arg);
                    i++;
                }
                else if (args[i+1] && /^(true|false)$/.test(args[i+1])) {
                    setArg(key, args[i+1] === 'true', arg);
                    i++;
                }
                else {
                    setArg(key, flags.strings[key] ? '' : true, arg);
                }
            }
        }
        else {
            if (!flags.unknownFn || flags.unknownFn(arg) !== false) {
                argv._.push(
                    flags.strings['_'] || !isNumber(arg) ? arg : Number(arg)
                );
            }
            if (opts.stopEarly) {
                argv._.push.apply(argv._, args.slice(i + 1));
                break;
            }
        }
    }
    
    Object.keys(defaults).forEach(function (key) {
        if (!hasKey(argv, key.split('.'))) {
            setKey(argv, key.split('.'), defaults[key]);
            
            (aliases[key] || []).forEach(function (x) {
                setKey(argv, x.split('.'), defaults[key]);
            });
        }
    });
    
    if (opts['--']) {
        argv['--'] = new Array();
        notFlags.forEach(function(key) {
            argv['--'].push(key);
        });
    }
    else {
        notFlags.forEach(function(key) {
            argv._.push(key);
        });
    }

    return argv;
};

function hasKey (obj, keys) {
    var o = obj;
    keys.slice(0,-1).forEach(function (key) {
        o = (o[key] || {});
    });

    var key = keys[keys.length - 1];
    return key in o;
}

function isNumber (x) {
    if (typeof x === 'number') return true;
    if (/^0x[0-9a-f]+$/i.test(x)) return true;
    return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x);
}


function isConstructorOrProto (obj, key) {
    return key === 'constructor' && typeof obj[key] === 'function' || key === '__proto__';
}
{
  "name": "minimist",
  "version": "1.2.6",
  "description": "parse argument options",
  "main": "index.js",
  "devDependencies": {
    "covert": "^1.0.0",
    "tap": "~0.4.0",
    "tape": "^3.5.0"
  },
  "testling": {
    "files": "test/*.js",
    "browsers": [
      "ie/6..latest",
      "ff/5",
      "firefox/latest",
      "chrome/10",
      "chrome/latest",
      "safari/5.1",
      "safari/latest",
      "opera/12"
    ]
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/substack/minimist.git"
  },
  "homepage": "https://github.com/substack/minimist",
  "author": {
    "name": "James Halliday",
    "email": "mail@substack.net",
    "url": "http://substack.net"
  },
  "license": "MIT"
}The ISC License

Copyright (c) 2017-2022 npm, Inc., 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.
'use strict'
const proc = typeof process === 'object' && process ? process : {
  stdout: null,
  stderr: null,
}
const EE = require('events')
const Stream = require('stream')
const SD = require('string_decoder').StringDecoder

const EOF = Symbol('EOF')
const MAYBE_EMIT_END = Symbol('maybeEmitEnd')
const EMITTED_END = Symbol('emittedEnd')
const EMITTING_END = Symbol('emittingEnd')
const EMITTED_ERROR = Symbol('emittedError')
const CLOSED = Symbol('closed')
const READ = Symbol('read')
const FLUSH = Symbol('flush')
const FLUSHCHUNK = Symbol('flushChunk')
const ENCODING = Symbol('encoding')
const DECODER = Symbol('decoder')
const FLOWING = Symbol('flowing')
const PAUSED = Symbol('paused')
const RESUME = Symbol('resume')
const BUFFERLENGTH = Symbol('bufferLength')
const BUFFERPUSH = Symbol('bufferPush')
const BUFFERSHIFT = Symbol('bufferShift')
const OBJECTMODE = Symbol('objectMode')
const DESTROYED = Symbol('destroyed')
const EMITDATA = Symbol('emitData')
const EMITEND = Symbol('emitEnd')
const EMITEND2 = Symbol('emitEnd2')
const ASYNC = Symbol('async')

const defer = fn => Promise.resolve().then(fn)

// TODO remove when Node v8 support drops
const doIter = global._MP_NO_ITERATOR_SYMBOLS_  !== '1'
const ASYNCITERATOR = doIter && Symbol.asyncIterator
  || Symbol('asyncIterator not implemented')
const ITERATOR = doIter && Symbol.iterator
  || Symbol('iterator not implemented')

// events that mean 'the stream is over'
// these are treated specially, and re-emitted
// if they are listened for after emitting.
const isEndish = ev =>
  ev === 'end' ||
  ev === 'finish' ||
  ev === 'prefinish'

const isArrayBuffer = b => b instanceof ArrayBuffer ||
  typeof b === 'object' &&
  b.constructor &&
  b.constructor.name === 'ArrayBuffer' &&
  b.byteLength >= 0

const isArrayBufferView = b => !Buffer.isBuffer(b) && ArrayBuffer.isView(b)

class Pipe {
  constructor (src, dest, opts) {
    this.src = src
    this.dest = dest
    this.opts = opts
    this.ondrain = () => src[RESUME]()
    dest.on('drain', this.ondrain)
  }
  unpipe () {
    this.dest.removeListener('drain', this.ondrain)
  }
  // istanbul ignore next - only here for the prototype
  proxyErrors () {}
  end () {
    this.unpipe()
    if (this.opts.end)
      this.dest.end()
  }
}

class PipeProxyErrors extends Pipe {
  unpipe () {
    this.src.removeListener('error', this.proxyErrors)
    super.unpipe()
  }
  constructor (src, dest, opts) {
    super(src, dest, opts)
    this.proxyErrors = er => dest.emit('error', er)
    src.on('error', this.proxyErrors)
  }
}

module.exports = class Minipass extends Stream {
  constructor (options) {
    super()
    this[FLOWING] = false
    // whether we're explicitly paused
    this[PAUSED] = false
    this.pipes = []
    this.buffer = []
    this[OBJECTMODE] = options && options.objectMode || false
    if (this[OBJECTMODE])
      this[ENCODING] = null
    else
      this[ENCODING] = options && options.encoding || null
    if (this[ENCODING] === 'buffer')
      this[ENCODING] = null
    this[ASYNC] = options && !!options.async || false
    this[DECODER] = this[ENCODING] ? new SD(this[ENCODING]) : null
    this[EOF] = false
    this[EMITTED_END] = false
    this[EMITTING_END] = false
    this[CLOSED] = false
    this[EMITTED_ERROR] = null
    this.writable = true
    this.readable = true
    this[BUFFERLENGTH] = 0
    this[DESTROYED] = false
  }

  get bufferLength () { return this[BUFFERLENGTH] }

  get encoding () { return this[ENCODING] }
  set encoding (enc) {
    if (this[OBJECTMODE])
      throw new Error('cannot set encoding in objectMode')

    if (this[ENCODING] && enc !== this[ENCODING] &&
        (this[DECODER] && this[DECODER].lastNeed || this[BUFFERLENGTH]))
      throw new Error('cannot change encoding')

    if (this[ENCODING] !== enc) {
      this[DECODER] = enc ? new SD(enc) : null
      if (this.buffer.length)
        this.buffer = this.buffer.map(chunk => this[DECODER].write(chunk))
    }

    this[ENCODING] = enc
  }

  setEncoding (enc) {
    this.encoding = enc
  }

  get objectMode () { return this[OBJECTMODE] }
  set objectMode (om) { this[OBJECTMODE] = this[OBJECTMODE] || !!om }

  get ['async'] () { return this[ASYNC] }
  set ['async'] (a) { this[ASYNC] = this[ASYNC] || !!a }

  write (chunk, encoding, cb) {
    if (this[EOF])
      throw new Error('write after end')

    if (this[DESTROYED]) {
      this.emit('error', Object.assign(
        new Error('Cannot call write after a stream was destroyed'),
        { code: 'ERR_STREAM_DESTROYED' }
      ))
      return true
    }

    if (typeof encoding === 'function')
      cb = encoding, encoding = 'utf8'

    if (!encoding)
      encoding = 'utf8'

    const fn = this[ASYNC] ? defer : f => f()

    // convert array buffers and typed array views into buffers
    // at some point in the future, we may want to do the opposite!
    // leave strings and buffers as-is
    // anything else switches us into object mode
    if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) {
      if (isArrayBufferView(chunk))
        chunk = Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength)
      else if (isArrayBuffer(chunk))
        chunk = Buffer.from(chunk)
      else if (typeof chunk !== 'string')
        // use the setter so we throw if we have encoding set
        this.objectMode = true
    }

    // handle object mode up front, since it's simpler
    // this yields better performance, fewer checks later.
    if (this[OBJECTMODE]) {
      /* istanbul ignore if - maybe impossible? */
      if (this.flowing && this[BUFFERLENGTH] !== 0)
        this[FLUSH](true)

      if (this.flowing)
        this.emit('data', chunk)
      else
        this[BUFFERPUSH](chunk)

      if (this[BUFFERLENGTH] !== 0)
        this.emit('readable')

      if (cb)
        fn(cb)

      return this.flowing
    }

    // at this point the chunk is a buffer or string
    // don't buffer it up or send it to the decoder
    if (!chunk.length) {
      if (this[BUFFERLENGTH] !== 0)
        this.emit('readable')
      if (cb)
        fn(cb)
      return this.flowing
    }

    // fast-path writing strings of same encoding to a stream with
    // an empty buffer, skipping the buffer/decoder dance
    if (typeof chunk === 'string' &&
        // unless it is a string already ready for us to use
        !(encoding === this[ENCODING] && !this[DECODER].lastNeed)) {
      chunk = Buffer.from(chunk, encoding)
    }

    if (Buffer.isBuffer(chunk) && this[ENCODING])
      chunk = this[DECODER].write(chunk)

    // Note: flushing CAN potentially switch us into not-flowing mode
    if (this.flowing && this[BUFFERLENGTH] !== 0)
      this[FLUSH](true)

    if (this.flowing)
      this.emit('data', chunk)
    else
      this[BUFFERPUSH](chunk)

    if (this[BUFFERLENGTH] !== 0)
      this.emit('readable')

    if (cb)
      fn(cb)

    return this.flowing
  }

  read (n) {
    if (this[DESTROYED])
      return null

    if (this[BUFFERLENGTH] === 0 || n === 0 || n > this[BUFFERLENGTH]) {
      this[MAYBE_EMIT_END]()
      return null
    }

    if (this[OBJECTMODE])
      n = null

    if (this.buffer.length > 1 && !this[OBJECTMODE]) {
      if (this.encoding)
        this.buffer = [this.buffer.join('')]
      else
        this.buffer = [Buffer.concat(this.buffer, this[BUFFERLENGTH])]
    }

    const ret = this[READ](n || null, this.buffer[0])
    this[MAYBE_EMIT_END]()
    return ret
  }

  [READ] (n, chunk) {
    if (n === chunk.length || n === null)
      this[BUFFERSHIFT]()
    else {
      this.buffer[0] = chunk.slice(n)
      chunk = chunk.slice(0, n)
      this[BUFFERLENGTH] -= n
    }

    this.emit('data', chunk)

    if (!this.buffer.length && !this[EOF])
      this.emit('drain')

    return chunk
  }

  end (chunk, encoding, cb) {
    if (typeof chunk === 'function')
      cb = chunk, chunk = null
    if (typeof encoding === 'function')
      cb = encoding, encoding = 'utf8'
    if (chunk)
      this.write(chunk, encoding)
    if (cb)
      this.once('end', cb)
    this[EOF] = true
    this.writable = false

    // if we haven't written anything, then go ahead and emit,
    // even if we're not reading.
    // we'll re-emit if a new 'end' listener is added anyway.
    // This makes MP more suitable to write-only use cases.
    if (this.flowing || !this[PAUSED])
      this[MAYBE_EMIT_END]()
    return this
  }

  // don't let the internal resume be overwritten
  [RESUME] () {
    if (this[DESTROYED])
      return

    this[PAUSED] = false
    this[FLOWING] = true
    this.emit('resume')
    if (this.buffer.length)
      this[FLUSH]()
    else if (this[EOF])
      this[MAYBE_EMIT_END]()
    else
      this.emit('drain')
  }

  resume () {
    return this[RESUME]()
  }

  pause () {
    this[FLOWING] = false
    this[PAUSED] = true
  }

  get destroyed () {
    return this[DESTROYED]
  }

  get flowing () {
    return this[FLOWING]
  }

  get paused () {
    return this[PAUSED]
  }

  [BUFFERPUSH] (chunk) {
    if (this[OBJECTMODE])
      this[BUFFERLENGTH] += 1
    else
      this[BUFFERLENGTH] += chunk.length
    this.buffer.push(chunk)
  }

  [BUFFERSHIFT] () {
    if (this.buffer.length) {
      if (this[OBJECTMODE])
        this[BUFFERLENGTH] -= 1
      else
        this[BUFFERLENGTH] -= this.buffer[0].length
    }
    return this.buffer.shift()
  }

  [FLUSH] (noDrain) {
    do {} while (this[FLUSHCHUNK](this[BUFFERSHIFT]()))

    if (!noDrain && !this.buffer.length && !this[EOF])
      this.emit('drain')
  }

  [FLUSHCHUNK] (chunk) {
    return chunk ? (this.emit('data', chunk), this.flowing) : false
  }

  pipe (dest, opts) {
    if (this[DESTROYED])
      return

    const ended = this[EMITTED_END]
    opts = opts || {}
    if (dest === proc.stdout || dest === proc.stderr)
      opts.end = false
    else
      opts.end = opts.end !== false
    opts.proxyErrors = !!opts.proxyErrors

    // piping an ended stream ends immediately
    if (ended) {
      if (opts.end)
        dest.end()
    } else {
      this.pipes.push(!opts.proxyErrors ? new Pipe(this, dest, opts)
        : new PipeProxyErrors(this, dest, opts))
      if (this[ASYNC])
        defer(() => this[RESUME]())
      else
        this[RESUME]()
    }

    return dest
  }

  unpipe (dest) {
    const p = this.pipes.find(p => p.dest === dest)
    if (p) {
      this.pipes.splice(this.pipes.indexOf(p), 1)
      p.unpipe()
    }
  }

  addListener (ev, fn) {
    return this.on(ev, fn)
  }

  on (ev, fn) {
    const ret = super.on(ev, fn)
    if (ev === 'data' && !this.pipes.length && !this.flowing)
      this[RESUME]()
    else if (ev === 'readable' && this[BUFFERLENGTH] !== 0)
      super.emit('readable')
    else if (isEndish(ev) && this[EMITTED_END]) {
      super.emit(ev)
      this.removeAllListeners(ev)
    } else if (ev === 'error' && this[EMITTED_ERROR]) {
      if (this[ASYNC])
        defer(() => fn.call(this, this[EMITTED_ERROR]))
      else
        fn.call(this, this[EMITTED_ERROR])
    }
    return ret
  }

  get emittedEnd () {
    return this[EMITTED_END]
  }

  [MAYBE_EMIT_END] () {
    if (!this[EMITTING_END] &&
        !this[EMITTED_END] &&
        !this[DESTROYED] &&
        this.buffer.length === 0 &&
        this[EOF]) {
      this[EMITTING_END] = true
      this.emit('end')
      this.emit('prefinish')
      this.emit('finish')
      if (this[CLOSED])
        this.emit('close')
      this[EMITTING_END] = false
    }
  }

  emit (ev, data, ...extra) {
    // error and close are only events allowed after calling destroy()
    if (ev !== 'error' && ev !== 'close' && ev !== DESTROYED && this[DESTROYED])
      return
    else if (ev === 'data') {
      return !data ? false
        : this[ASYNC] ? defer(() => this[EMITDATA](data))
        : this[EMITDATA](data)
    } else if (ev === 'end') {
      return this[EMITEND]()
    } else if (ev === 'close') {
      this[CLOSED] = true
      // don't emit close before 'end' and 'finish'
      if (!this[EMITTED_END] && !this[DESTROYED])
        return
      const ret = super.emit('close')
      this.removeAllListeners('close')
      return ret
    } else if (ev === 'error') {
      this[EMITTED_ERROR] = data
      const ret = super.emit('error', data)
      this[MAYBE_EMIT_END]()
      return ret
    } else if (ev === 'resume') {
      const ret = super.emit('resume')
      this[MAYBE_EMIT_END]()
      return ret
    } else if (ev === 'finish' || ev === 'prefinish') {
      const ret = super.emit(ev)
      this.removeAllListeners(ev)
      return ret
    }

    // Some other unknown event
    const ret = super.emit(ev, data, ...extra)
    this[MAYBE_EMIT_END]()
    return ret
  }

  [EMITDATA] (data) {
    for (const p of this.pipes) {
      if (p.dest.write(data) === false)
        this.pause()
    }
    const ret = super.emit('data', data)
    this[MAYBE_EMIT_END]()
    return ret
  }

  [EMITEND] () {
    if (this[EMITTED_END])
      return

    this[EMITTED_END] = true
    this.readable = false
    if (this[ASYNC])
      defer(() => this[EMITEND2]())
    else
      this[EMITEND2]()
  }

  [EMITEND2] () {
    if (this[DECODER]) {
      const data = this[DECODER].end()
      if (data) {
        for (const p of this.pipes) {
          p.dest.write(data)
        }
        super.emit('data', data)
      }
    }

    for (const p of this.pipes) {
      p.end()
    }
    const ret = super.emit('end')
    this.removeAllListeners('end')
    return ret
  }

  // const all = await stream.collect()
  collect () {
    const buf = []
    if (!this[OBJECTMODE])
      buf.dataLength = 0
    // set the promise first, in case an error is raised
    // by triggering the flow here.
    const p = this.promise()
    this.on('data', c => {
      buf.push(c)
      if (!this[OBJECTMODE])
        buf.dataLength += c.length
    })
    return p.then(() => buf)
  }

  // const data = await stream.concat()
  concat () {
    return this[OBJECTMODE]
      ? Promise.reject(new Error('cannot concat in objectMode'))
      : this.collect().then(buf =>
          this[OBJECTMODE]
            ? Promise.reject(new Error('cannot concat in objectMode'))
            : this[ENCODING] ? buf.join('') : Buffer.concat(buf, buf.dataLength))
  }

  // stream.promise().then(() => done, er => emitted error)
  promise () {
    return new Promise((resolve, reject) => {
      this.on(DESTROYED, () => reject(new Error('stream destroyed')))
      this.on('error', er => reject(er))
      this.on('end', () => resolve())
    })
  }

  // for await (let chunk of stream)
  [ASYNCITERATOR] () {
    const next = () => {
      const res = this.read()
      if (res !== null)
        return Promise.resolve({ done: false, value: res })

      if (this[EOF])
        return Promise.resolve({ done: true })

      let resolve = null
      let reject = null
      const onerr = er => {
        this.removeListener('data', ondata)
        this.removeListener('end', onend)
        reject(er)
      }
      const ondata = value => {
        this.removeListener('error', onerr)
        this.removeListener('end', onend)
        this.pause()
        resolve({ value: value, done: !!this[EOF] })
      }
      const onend = () => {
        this.removeListener('error', onerr)
        this.removeListener('data', ondata)
        resolve({ done: true })
      }
      const ondestroy = () => onerr(new Error('stream destroyed'))
      return new Promise((res, rej) => {
        reject = rej
        resolve = res
        this.once(DESTROYED, ondestroy)
        this.once('error', onerr)
        this.once('end', onend)
        this.once('data', ondata)
      })
    }

    return { next }
  }

  // for (let chunk of stream)
  [ITERATOR] () {
    const next = () => {
      const value = this.read()
      const done = value === null
      return { value, done }
    }
    return { next }
  }

  destroy (er) {
    if (this[DESTROYED]) {
      if (er)
        this.emit('error', er)
      else
        this.emit(DESTROYED)
      return this
    }

    this[DESTROYED] = true

    // throw away all buffered data, it's never coming out
    this.buffer.length = 0
    this[BUFFERLENGTH] = 0

    if (typeof this.close === 'function' && !this[CLOSED])
      this.close()

    if (er)
      this.emit('error', er)
    else // if no error to emit, still reject pending promises
      this.emit(DESTROYED)

    return this
  }

  static isStream (s) {
    return !!s && (s instanceof Minipass || s instanceof Stream ||
      s instanceof EE && (
        typeof s.pipe === 'function' || // readable
        (typeof s.write === 'function' && typeof s.end === 'function') // writable
      ))
  }
}
{
  "name": "minipass",
  "version": "3.3.4",
  "description": "minimal implementation of a PassThrough stream",
  "main": "index.js",
  "dependencies": {
    "yallist": "^4.0.0"
  },
  "devDependencies": {
    "@types/node": "^17.0.41",
    "end-of-stream": "^1.4.0",
    "prettier": "^2.6.2",
    "tap": "^16.2.0",
    "through2": "^2.0.3",
    "ts-node": "^10.8.1",
    "typescript": "^4.7.3"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/isaacs/minipass.git"
  },
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
  "license": "ISC",
  "files": [
    "index.d.ts",
    "index.js"
  ],
  "tap": {
    "check-coverage": true
  },
  "engines": {
    "node": ">=8"
  },
  "prettier": {
    "semi": false,
    "printWidth": 80,
    "tabWidth": 2,
    "useTabs": false,
    "singleQuote": true,
    "jsxSingleQuote": false,
    "bracketSameLine": true,
    "arrowParens": "avoid",
    "endOfLine": "lf"
  }
}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.
const Minipass = require('minipass')
const _data = Symbol('_data')
const _length = Symbol('_length')
class Collect extends Minipass {
  constructor (options) {
    super(options)
    this[_data] = []
    this[_length] = 0
  }
  write (chunk, encoding, cb) {
    if (typeof encoding === 'function')
      cb = encoding, encoding = 'utf8'

    if (!encoding)
      encoding = 'utf8'

    const c = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, encoding)
    this[_data].push(c)
    this[_length] += c.length
    if (cb)
      cb()
    return true
  }
  end (chunk, encoding, cb) {
    if (typeof chunk === 'function')
      cb = chunk, chunk = null
    if (typeof encoding === 'function')
      cb = encoding, encoding = 'utf8'
    if (chunk)
      this.write(chunk, encoding)
    const result = Buffer.concat(this[_data], this[_length])
    super.write(result)
    return super.end(cb)
  }
}
module.exports = Collect

// it would be possible to DRY this a bit by doing something like
// this.collector = new Collect() and listening on its data event,
// but it's not much code, and we may as well save the extra obj
class CollectPassThrough extends Minipass {
  constructor (options) {
    super(options)
    this[_data] = []
    this[_length] = 0
  }
  write (chunk, encoding, cb) {
    if (typeof encoding === 'function')
      cb = encoding, encoding = 'utf8'

    if (!encoding)
      encoding = 'utf8'

    const c = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, encoding)
    this[_data].push(c)
    this[_length] += c.length
    return super.write(chunk, encoding, cb)
  }
  end (chunk, encoding, cb) {
    if (typeof chunk === 'function')
      cb = chunk, chunk = null
    if (typeof encoding === 'function')
      cb = encoding, encoding = 'utf8'
    if (chunk)
      this.write(chunk, encoding)
    const result = Buffer.concat(this[_data], this[_length])
    this.emit('collect', result)
    return super.end(cb)
  }
}
module.exports.PassThrough = CollectPassThrough
{
  "name": "minipass-collect",
  "version": "1.0.2",
  "description": "A Minipass stream that collects all the data into a single chunk",
  "author": "Isaac Z. Schlueter <i@izs.me> (https://izs.me)",
  "license": "ISC",
  "tap": {
    "check-coverage": true
  },
  "devDependencies": {
    "tap": "^14.6.9"
  },
  "dependencies": {
    "minipass": "^3.0.0"
  },
  "files": [
    "index.js"
  ],
  "engines": {
    "node": ">= 8"
  }
}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.
const Minipass = require('minipass')
const _flush = Symbol('_flush')
const _flushed = Symbol('_flushed')
const _flushing = Symbol('_flushing')
class Flush extends Minipass {
  constructor (opt = {}) {
    if (typeof opt === 'function')
      opt = { flush: opt }

    super(opt)

    // or extend this class and provide a 'flush' method in your subclass
    if (typeof opt.flush !== 'function' && typeof this.flush !== 'function')
      throw new TypeError('must provide flush function in options')

    this[_flush] = opt.flush || this.flush
  }

  emit (ev, ...data) {
    if ((ev !== 'end' && ev !== 'finish') || this[_flushed])
      return super.emit(ev, ...data)

    if (this[_flushing])
      return

    this[_flushing] = true

    const afterFlush = er => {
      this[_flushed] = true
      er ? super.emit('error', er) : super.emit('end')
    }

    const ret = this[_flush](afterFlush)
    if (ret && ret.then)
      ret.then(() => afterFlush(), er => afterFlush(er))
  }
}

module.exports = Flush
{
  "name": "minipass-flush",
  "version": "1.0.5",
  "description": "A Minipass stream that calls a flush function before emitting 'end'",
  "author": "Isaac Z. Schlueter <i@izs.me> (https://izs.me)",
  "license": "ISC",
  "tap": {
    "check-coverage": true
  },
  "devDependencies": {
    "tap": "^14.6.9"
  },
  "dependencies": {
    "minipass": "^3.0.0"
  },
  "files": [
    "index.js"
  ],
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/isaacs/minipass-flush.git"
  },
  "engines": {
    "node": ">= 8"
  }
}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.
const Minipass = require('minipass')
const EE = require('events')
const isStream = s => s && s instanceof EE && (
  typeof s.pipe === 'function' || // readable
  (typeof s.write === 'function' && typeof s.end === 'function') // writable
)

const _head = Symbol('_head')
const _tail = Symbol('_tail')
const _linkStreams = Symbol('_linkStreams')
const _setHead = Symbol('_setHead')
const _setTail = Symbol('_setTail')
const _onError = Symbol('_onError')
const _onData = Symbol('_onData')
const _onEnd = Symbol('_onEnd')
const _onDrain = Symbol('_onDrain')
const _streams = Symbol('_streams')
class Pipeline extends Minipass {
  constructor (opts, ...streams) {
    if (isStream(opts)) {
      streams.unshift(opts)
      opts = {}
    }

    super(opts)
    this[_streams] = []
    if (streams.length)
      this.push(...streams)
  }

  [_linkStreams] (streams) {
    // reduce takes (left,right), and we return right to make it the
    // new left value.
    return streams.reduce((src, dest) => {
      src.on('error', er => dest.emit('error', er))
      src.pipe(dest)
      return dest
    })
  }

  push (...streams) {
    this[_streams].push(...streams)
    if (this[_tail])
      streams.unshift(this[_tail])

    const linkRet = this[_linkStreams](streams)

    this[_setTail](linkRet)
    if (!this[_head])
      this[_setHead](streams[0])
  }

  unshift (...streams) {
    this[_streams].unshift(...streams)
    if (this[_head])
      streams.push(this[_head])

    const linkRet = this[_linkStreams](streams)
    this[_setHead](streams[0])
    if (!this[_tail])
      this[_setTail](linkRet)
  }

  destroy (er) {
    // set fire to the whole thing.
    this[_streams].forEach(s =>
      typeof s.destroy === 'function' && s.destroy())
    return super.destroy(er)
  }

  // readable interface -> tail
  [_setTail] (stream) {
    this[_tail] = stream
    stream.on('error', er => this[_onError](stream, er))
    stream.on('data', chunk => this[_onData](stream, chunk))
    stream.on('end', () => this[_onEnd](stream))
    stream.on('finish', () => this[_onEnd](stream))
  }

  // errors proxied down the pipeline
  // they're considered part of the "read" interface
  [_onError] (stream, er) {
    if (stream === this[_tail])
      this.emit('error', er)
  }
  [_onData] (stream, chunk) {
    if (stream === this[_tail])
      super.write(chunk)
  }
  [_onEnd] (stream) {
    if (stream === this[_tail])
      super.end()
  }
  pause () {
    super.pause()
    return this[_tail] && this[_tail].pause && this[_tail].pause()
  }

  // NB: Minipass calls its internal private [RESUME] method during
  // pipe drains, to avoid hazards where stream.resume() is overridden.
  // Thus, we need to listen to the resume *event*, not override the
  // resume() method, and proxy *that* to the tail.
  emit (ev, ...args) {
    if (ev === 'resume' && this[_tail] && this[_tail].resume)
      this[_tail].resume()
    return super.emit(ev, ...args)
  }

  // writable interface -> head
  [_setHead] (stream) {
    this[_head] = stream
    stream.on('drain', () => this[_onDrain](stream))
  }
  [_onDrain] (stream) {
    if (stream === this[_head])
      this.emit('drain')
  }
  write (chunk, enc, cb) {
    return this[_head].write(chunk, enc, cb) &&
      (this.flowing || this.buffer.length === 0)
  }
  end (chunk, enc, cb) {
    this[_head].end(chunk, enc, cb)
    return this
  }
}

module.exports = Pipeline
{
  "name": "minipass-pipeline",
  "version": "1.2.4",
  "description": "create a pipeline of streams using Minipass",
  "author": "Isaac Z. Schlueter <i@izs.me> (https://izs.me)",
  "license": "ISC",
  "tap": {
    "check-coverage": true
  },
  "devDependencies": {
    "tap": "^14.6.9"
  },
  "dependencies": {
    "minipass": "^3.0.0"
  },
  "files": [
    "index.js"
  ],
  "engines": {
    "node": ">=8"
  }
}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.
const Minipass = require('minipass')

class SizeError extends Error {
  constructor (found, expect) {
    super(`Bad data size: expected ${expect} bytes, but got ${found}`)
    this.expect = expect
    this.found = found
    this.code = 'EBADSIZE'
	  Error.captureStackTrace(this, this.constructor)
  }
  get name () {
    return 'SizeError'
  }
}

class MinipassSized extends Minipass {
  constructor (options = {}) {
    super(options)

    if (options.objectMode)
      throw new TypeError(`${
        this.constructor.name
      } streams only work with string and buffer data`)

    this.found = 0
    this.expect = options.size
    if (typeof this.expect !== 'number' ||
        this.expect > Number.MAX_SAFE_INTEGER ||
        isNaN(this.expect) ||
        this.expect < 0 ||
        !isFinite(this.expect) ||
        this.expect !== Math.floor(this.expect))
      throw new Error('invalid expected size: ' + this.expect)
  }

  write (chunk, encoding, cb) {
    const buffer = Buffer.isBuffer(chunk) ? chunk
      : typeof chunk === 'string' ?
        Buffer.from(chunk, typeof encoding === 'string' ? encoding : 'utf8')
      : chunk

    if (!Buffer.isBuffer(buffer)) {
      this.emit('error', new TypeError(`${
        this.constructor.name
      } streams only work with string and buffer data`))
      return false
    }

    this.found += buffer.length
    if (this.found > this.expect)
      this.emit('error', new SizeError(this.found, this.expect))

    return super.write(chunk, encoding, cb)
  }

  emit (ev, ...data) {
    if (ev === 'end') {
      if (this.found !== this.expect)
        this.emit('error', new SizeError(this.found, this.expect))
    }
    return super.emit(ev, ...data)
  }
}

MinipassSized.SizeError = SizeError

module.exports = MinipassSized
{
  "name": "minipass-sized",
  "version": "1.0.3",
  "description": "A Minipass stream that raises an error if you get a different number of bytes than expected",
  "author": "Isaac Z. Schlueter <i@izs.me> (https://izs.me)",
  "license": "ISC",
  "tap": {
    "check-coverage": true
  },
  "devDependencies": {
    "tap": "^14.6.4"
  },
  "dependencies": {
    "minipass": "^3.0.0"
  },
  "main": "index.js",
  "directories": {
    "test": "test"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/isaacs/minipass-sized.git"
  },
  "engines": {
    "node": ">=8"
  }
}Minizlib was created by Isaac Z. Schlueter.
It is a derivative work of the Node.js project.

"""
Copyright Isaac Z. Schlueter and Contributors
Copyright Node.js contributors. All rights reserved.
Copyright Joyent, Inc. and other Node contributors. All rights reserved.

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.
"""
// Update with any zlib constants that are added or changed in the future.
// Node v6 didn't export this, so we just hard code the version and rely
// on all the other hard-coded values from zlib v4736.  When node v6
// support drops, we can just export the realZlibConstants object.
const realZlibConstants = require('zlib').constants ||
  /* istanbul ignore next */ { ZLIB_VERNUM: 4736 }

module.exports = Object.freeze(Object.assign(Object.create(null), {
  Z_NO_FLUSH: 0,
  Z_PARTIAL_FLUSH: 1,
  Z_SYNC_FLUSH: 2,
  Z_FULL_FLUSH: 3,
  Z_FINISH: 4,
  Z_BLOCK: 5,
  Z_OK: 0,
  Z_STREAM_END: 1,
  Z_NEED_DICT: 2,
  Z_ERRNO: -1,
  Z_STREAM_ERROR: -2,
  Z_DATA_ERROR: -3,
  Z_MEM_ERROR: -4,
  Z_BUF_ERROR: -5,
  Z_VERSION_ERROR: -6,
  Z_NO_COMPRESSION: 0,
  Z_BEST_SPEED: 1,
  Z_BEST_COMPRESSION: 9,
  Z_DEFAULT_COMPRESSION: -1,
  Z_FILTERED: 1,
  Z_HUFFMAN_ONLY: 2,
  Z_RLE: 3,
  Z_FIXED: 4,
  Z_DEFAULT_STRATEGY: 0,
  DEFLATE: 1,
  INFLATE: 2,
  GZIP: 3,
  GUNZIP: 4,
  DEFLATERAW: 5,
  INFLATERAW: 6,
  UNZIP: 7,
  BROTLI_DECODE: 8,
  BROTLI_ENCODE: 9,
  Z_MIN_WINDOWBITS: 8,
  Z_MAX_WINDOWBITS: 15,
  Z_DEFAULT_WINDOWBITS: 15,
  Z_MIN_CHUNK: 64,
  Z_MAX_CHUNK: Infinity,
  Z_DEFAULT_CHUNK: 16384,
  Z_MIN_MEMLEVEL: 1,
  Z_MAX_MEMLEVEL: 9,
  Z_DEFAULT_MEMLEVEL: 8,
  Z_MIN_LEVEL: -1,
  Z_MAX_LEVEL: 9,
  Z_DEFAULT_LEVEL: -1,
  BROTLI_OPERATION_PROCESS: 0,
  BROTLI_OPERATION_FLUSH: 1,
  BROTLI_OPERATION_FINISH: 2,
  BROTLI_OPERATION_EMIT_METADATA: 3,
  BROTLI_MODE_GENERIC: 0,
  BROTLI_MODE_TEXT: 1,
  BROTLI_MODE_FONT: 2,
  BROTLI_DEFAULT_MODE: 0,
  BROTLI_MIN_QUALITY: 0,
  BROTLI_MAX_QUALITY: 11,
  BROTLI_DEFAULT_QUALITY: 11,
  BROTLI_MIN_WINDOW_BITS: 10,
  BROTLI_MAX_WINDOW_BITS: 24,
  BROTLI_LARGE_MAX_WINDOW_BITS: 30,
  BROTLI_DEFAULT_WINDOW: 22,
  BROTLI_MIN_INPUT_BLOCK_BITS: 16,
  BROTLI_MAX_INPUT_BLOCK_BITS: 24,
  BROTLI_PARAM_MODE: 0,
  BROTLI_PARAM_QUALITY: 1,
  BROTLI_PARAM_LGWIN: 2,
  BROTLI_PARAM_LGBLOCK: 3,
  BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING: 4,
  BROTLI_PARAM_SIZE_HINT: 5,
  BROTLI_PARAM_LARGE_WINDOW: 6,
  BROTLI_PARAM_NPOSTFIX: 7,
  BROTLI_PARAM_NDIRECT: 8,
  BROTLI_DECODER_RESULT_ERROR: 0,
  BROTLI_DECODER_RESULT_SUCCESS: 1,
  BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT: 2,
  BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT: 3,
  BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION: 0,
  BROTLI_DECODER_PARAM_LARGE_WINDOW: 1,
  BROTLI_DECODER_NO_ERROR: 0,
  BROTLI_DECODER_SUCCESS: 1,
  BROTLI_DECODER_NEEDS_MORE_INPUT: 2,
  BROTLI_DECODER_NEEDS_MORE_OUTPUT: 3,
  BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE: -1,
  BROTLI_DECODER_ERROR_FORMAT_RESERVED: -2,
  BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE: -3,
  BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET: -4,
  BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME: -5,
  BROTLI_DECODER_ERROR_FORMAT_CL_SPACE: -6,
  BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE: -7,
  BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT: -8,
  BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1: -9,
  BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2: -10,
  BROTLI_DECODER_ERROR_FORMAT_TRANSFORM: -11,
  BROTLI_DECODER_ERROR_FORMAT_DICTIONARY: -12,
  BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS: -13,
  BROTLI_DECODER_ERROR_FORMAT_PADDING_1: -14,
  BROTLI_DECODER_ERROR_FORMAT_PADDING_2: -15,
  BROTLI_DECODER_ERROR_FORMAT_DISTANCE: -16,
  BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET: -19,
  BROTLI_DECODER_ERROR_INVALID_ARGUMENTS: -20,
  BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES: -21,
  BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS: -22,
  BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP: -25,
  BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1: -26,
  BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2: -27,
  BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES: -30,
  BROTLI_DECODER_ERROR_UNREACHABLE: -31,
}, realZlibConstants))
'use strict'

const assert = require('assert')
const Buffer = require('buffer').Buffer
const realZlib = require('zlib')

const constants = exports.constants = require('./constants.js')
const Minipass = require('minipass')

const OriginalBufferConcat = Buffer.concat

const _superWrite = Symbol('_superWrite')
class ZlibError extends Error {
  constructor (err) {
    super('zlib: ' + err.message)
    this.code = err.code
    this.errno = err.errno
    /* istanbul ignore if */
    if (!this.code)
      this.code = 'ZLIB_ERROR'

    this.message = 'zlib: ' + err.message
    Error.captureStackTrace(this, this.constructor)
  }

  get name () {
    return 'ZlibError'
  }
}

// the Zlib class they all inherit from
// This thing manages the queue of requests, and returns
// true or false if there is anything in the queue when
// you call the .write() method.
const _opts = Symbol('opts')
const _flushFlag = Symbol('flushFlag')
const _finishFlushFlag = Symbol('finishFlushFlag')
const _fullFlushFlag = Symbol('fullFlushFlag')
const _handle = Symbol('handle')
const _onError = Symbol('onError')
const _sawError = Symbol('sawError')
const _level = Symbol('level')
const _strategy = Symbol('strategy')
const _ended = Symbol('ended')
const _defaultFullFlush = Symbol('_defaultFullFlush')

class ZlibBase extends Minipass {
  constructor (opts, mode) {
    if (!opts || typeof opts !== 'object')
      throw new TypeError('invalid options for ZlibBase constructor')

    super(opts)
    this[_sawError] = false
    this[_ended] = false
    this[_opts] = opts

    this[_flushFlag] = opts.flush
    this[_finishFlushFlag] = opts.finishFlush
    // this will throw if any options are invalid for the class selected
    try {
      this[_handle] = new realZlib[mode](opts)
    } catch (er) {
      // make sure that all errors get decorated properly
      throw new ZlibError(er)
    }

    this[_onError] = (err) => {
      // no sense raising multiple errors, since we abort on the first one.
      if (this[_sawError])
        return

      this[_sawError] = true

      // there is no way to cleanly recover.
      // continuing only obscures problems.
      this.close()
      this.emit('error', err)
    }

    this[_handle].on('error', er => this[_onError](new ZlibError(er)))
    this.once('end', () => this.close)
  }

  close () {
    if (this[_handle]) {
      this[_handle].close()
      this[_handle] = null
      this.emit('close')
    }
  }

  reset () {
    if (!this[_sawError]) {
      assert(this[_handle], 'zlib binding closed')
      return this[_handle].reset()
    }
  }

  flush (flushFlag) {
    if (this.ended)
      return

    if (typeof flushFlag !== 'number')
      flushFlag = this[_fullFlushFlag]
    this.write(Object.assign(Buffer.alloc(0), { [_flushFlag]: flushFlag }))
  }

  end (chunk, encoding, cb) {
    if (chunk)
      this.write(chunk, encoding)
    this.flush(this[_finishFlushFlag])
    this[_ended] = true
    return super.end(null, null, cb)
  }

  get ended () {
    return this[_ended]
  }

  write (chunk, encoding, cb) {
    // process the chunk using the sync process
    // then super.write() all the outputted chunks
    if (typeof encoding === 'function')
      cb = encoding, encoding = 'utf8'

    if (typeof chunk === 'string')
      chunk = Buffer.from(chunk, encoding)

    if (this[_sawError])
      return
    assert(this[_handle], 'zlib binding closed')

    // _processChunk tries to .close() the native handle after it's done, so we
    // intercept that by temporarily making it a no-op.
    const nativeHandle = this[_handle]._handle
    const originalNativeClose = nativeHandle.close
    nativeHandle.close = () => {}
    const originalClose = this[_handle].close
    this[_handle].close = () => {}
    // It also calls `Buffer.concat()` at the end, which may be convenient
    // for some, but which we are not interested in as it slows us down.
    Buffer.concat = (args) => args
    let result
    try {
      const flushFlag = typeof chunk[_flushFlag] === 'number'
        ? chunk[_flushFlag] : this[_flushFlag]
      result = this[_handle]._processChunk(chunk, flushFlag)
      // if we don't throw, reset it back how it was
      Buffer.concat = OriginalBufferConcat
    } catch (err) {
      // or if we do, put Buffer.concat() back before we emit error
      // Error events call into user code, which may call Buffer.concat()
      Buffer.concat = OriginalBufferConcat
      this[_onError](new ZlibError(err))
    } finally {
      if (this[_handle]) {
        // Core zlib resets `_handle` to null after attempting to close the
        // native handle. Our no-op handler prevented actual closure, but we
        // need to restore the `._handle` property.
        this[_handle]._handle = nativeHandle
        nativeHandle.close = originalNativeClose
        this[_handle].close = originalClose
        // `_processChunk()` adds an 'error' listener. If we don't remove it
        // after each call, these handlers start piling up.
        this[_handle].removeAllListeners('error')
        // make sure OUR error listener is still attached tho
      }
    }

    if (this[_handle])
      this[_handle].on('error', er => this[_onError](new ZlibError(er)))

    let writeReturn
    if (result) {
      if (Array.isArray(result) && result.length > 0) {
        // The first buffer is always `handle._outBuffer`, which would be
        // re-used for later invocations; so, we always have to copy that one.
        writeReturn = this[_superWrite](Buffer.from(result[0]))
        for (let i = 1; i < result.length; i++) {
          writeReturn = this[_superWrite](result[i])
        }
      } else {
        writeReturn = this[_superWrite](Buffer.from(result))
      }
    }

    if (cb)
      cb()
    return writeReturn
  }

  [_superWrite] (data) {
    return super.write(data)
  }
}

class Zlib extends ZlibBase {
  constructor (opts, mode) {
    opts = opts || {}

    opts.flush = opts.flush || constants.Z_NO_FLUSH
    opts.finishFlush = opts.finishFlush || constants.Z_FINISH
    super(opts, mode)

    this[_fullFlushFlag] = constants.Z_FULL_FLUSH
    this[_level] = opts.level
    this[_strategy] = opts.strategy
  }

  params (level, strategy) {
    if (this[_sawError])
      return

    if (!this[_handle])
      throw new Error('cannot switch params when binding is closed')

    // no way to test this without also not supporting params at all
    /* istanbul ignore if */
    if (!this[_handle].params)
      throw new Error('not supported in this implementation')

    if (this[_level] !== level || this[_strategy] !== strategy) {
      this.flush(constants.Z_SYNC_FLUSH)
      assert(this[_handle], 'zlib binding closed')
      // .params() calls .flush(), but the latter is always async in the
      // core zlib. We override .flush() temporarily to intercept that and
      // flush synchronously.
      const origFlush = this[_handle].flush
      this[_handle].flush = (flushFlag, cb) => {
        this.flush(flushFlag)
        cb()
      }
      try {
        this[_handle].params(level, strategy)
      } finally {
        this[_handle].flush = origFlush
      }
      /* istanbul ignore else */
      if (this[_handle]) {
        this[_level] = level
        this[_strategy] = strategy
      }
    }
  }
}

// minimal 2-byte header
class Deflate extends Zlib {
  constructor (opts) {
    super(opts, 'Deflate')
  }
}

class Inflate extends Zlib {
  constructor (opts) {
    super(opts, 'Inflate')
  }
}

// gzip - bigger header, same deflate compression
const _portable = Symbol('_portable')
class Gzip extends Zlib {
  constructor (opts) {
    super(opts, 'Gzip')
    this[_portable] = opts && !!opts.portable
  }

  [_superWrite] (data) {
    if (!this[_portable])
      return super[_superWrite](data)

    // we'll always get the header emitted in one first chunk
    // overwrite the OS indicator byte with 0xFF
    this[_portable] = false
    data[9] = 255
    return super[_superWrite](data)
  }
}

class Gunzip extends Zlib {
  constructor (opts) {
    super(opts, 'Gunzip')
  }
}

// raw - no header
class DeflateRaw extends Zlib {
  constructor (opts) {
    super(opts, 'DeflateRaw')
  }
}

class InflateRaw extends Zlib {
  constructor (opts) {
    super(opts, 'InflateRaw')
  }
}

// auto-detect header.
class Unzip extends Zlib {
  constructor (opts) {
    super(opts, 'Unzip')
  }
}

class Brotli extends ZlibBase {
  constructor (opts, mode) {
    opts = opts || {}

    opts.flush = opts.flush || constants.BROTLI_OPERATION_PROCESS
    opts.finishFlush = opts.finishFlush || constants.BROTLI_OPERATION_FINISH

    super(opts, mode)

    this[_fullFlushFlag] = constants.BROTLI_OPERATION_FLUSH
  }
}

class BrotliCompress extends Brotli {
  constructor (opts) {
    super(opts, 'BrotliCompress')
  }
}

class BrotliDecompress extends Brotli {
  constructor (opts) {
    super(opts, 'BrotliDecompress')
  }
}

exports.Deflate = Deflate
exports.Inflate = Inflate
exports.Gzip = Gzip
exports.Gunzip = Gunzip
exports.DeflateRaw = DeflateRaw
exports.InflateRaw = InflateRaw
exports.Unzip = Unzip
/* istanbul ignore else */
if (typeof realZlib.BrotliCompress === 'function') {
  exports.BrotliCompress = BrotliCompress
  exports.BrotliDecompress = BrotliDecompress
} else {
  exports.BrotliCompress = exports.BrotliDecompress = class {
    constructor () {
      throw new Error('Brotli is not supported in this version of Node.js')
    }
  }
}
{
  "name": "minizlib",
  "version": "2.1.2",
  "description": "A small fast zlib stream built on [minipass](http://npm.im/minipass) and Node.js's zlib binding.",
  "main": "index.js",
  "dependencies": {
    "minipass": "^3.0.0",
    "yallist": "^4.0.0"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/isaacs/minizlib.git"
  },
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
  "license": "MIT",
  "devDependencies": {
    "tap": "^14.6.9"
  },
  "files": [
    "index.js",
    "constants.js"
  ],
  "engines": {
    "node": ">= 8"
  }
}Copyright 2010 James Halliday (mail@substack.net)

This project is free software released under the MIT/X11 license:

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

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

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

module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP;

function mkdirP (p, opts, f, made) {
    if (typeof opts === 'function') {
        f = opts;
        opts = {};
    }
    else if (!opts || typeof opts !== 'object') {
        opts = { mode: opts };
    }
    
    var mode = opts.mode;
    var xfs = opts.fs || fs;
    
    if (mode === undefined) {
        mode = _0777
    }
    if (!made) made = null;
    
    var cb = f || /* istanbul ignore next */ function () {};
    p = path.resolve(p);
    
    xfs.mkdir(p, mode, function (er) {
        if (!er) {
            made = made || p;
            return cb(null, made);
        }
        switch (er.code) {
            case 'ENOENT':
                /* istanbul ignore if */
                if (path.dirname(p) === p) return cb(er);
                mkdirP(path.dirname(p), opts, function (er, made) {
                    /* istanbul ignore if */
                    if (er) cb(er, made);
                    else mkdirP(p, opts, cb, made);
                });
                break;

            // In the case of any other error, just see if there's a dir
            // there already.  If so, then hooray!  If not, then something
            // is borked.
            default:
                xfs.stat(p, function (er2, stat) {
                    // if the stat fails, then that's super weird.
                    // let the original error be the failure reason.
                    if (er2 || !stat.isDirectory()) cb(er, made)
                    else cb(null, made);
                });
                break;
        }
    });
}

mkdirP.sync = function sync (p, opts, made) {
    if (!opts || typeof opts !== 'object') {
        opts = { mode: opts };
    }
    
    var mode = opts.mode;
    var xfs = opts.fs || fs;
    
    if (mode === undefined) {
        mode = _0777
    }
    if (!made) made = null;

    p = path.resolve(p);

    try {
        xfs.mkdirSync(p, mode);
        made = made || p;
    }
    catch (err0) {
        switch (err0.code) {
            case 'ENOENT' :
                made = sync(path.dirname(p), opts, made);
                sync(p, opts, made);
                break;

            // In the case of any other error, just see if there's a dir
            // there already.  If so, then hooray!  If not, then something
            // is borked.
            default:
                var stat;
                try {
                    stat = xfs.statSync(p);
                }
                catch (err1) /* istanbul ignore next */ {
                    throw err0;
                }
                /* istanbul ignore if */
                if (!stat.isDirectory()) throw err0;
                break;
        }
    }

    return made;
};
{
  "name": "mkdirp",
  "description": "Recursively mkdir, like `mkdir -p`",
  "version": "0.5.6",
  "publishConfig": {
    "tag": "legacy"
  },
  "author": "James Halliday <mail@substack.net> (http://substack.net)",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "https://github.com/substack/node-mkdirp.git"
  },
  "dependencies": {
    "minimist": "^1.2.6"
  },
  "devDependencies": {
    "tap": "^16.0.1"
  },
  "bin": "bin/cmd.js",
  "license": "MIT",
  "files": [
    "bin",
    "index.js"
  ]
}#!/usr/bin/env node

var mkdirp = require('../');
var minimist = require('minimist');
var fs = require('fs');

var argv = minimist(process.argv.slice(2), {
    alias: { m: 'mode', h: 'help' },
    string: [ 'mode' ]
});
if (argv.help) {
    fs.createReadStream(__dirname + '/usage.txt').pipe(process.stdout);
    return;
}

var paths = argv._.slice();
var mode = argv.mode ? parseInt(argv.mode, 8) : undefined;

(function next () {
    if (paths.length === 0) return;
    var p = paths.shift();
    
    if (mode === undefined) mkdirp(p, cb)
    else mkdirp(p, mode, cb)
    
    function cb (err) {
        if (err) {
            console.error(err.message);
            process.exit(1);
        }
        else next();
    }
})();
usage: mkdirp [DIR1,DIR2..] {OPTIONS}

  Create each supplied directory including any necessary parent directories that
  don't yet exist.
  
  If the directory already exists, do nothing.

OPTIONS are:

  -m, --mode   If a directory needs to be created, set the mode as an octal
               permission string.

The MIT License (MIT)

Copyright (c) 2020 James Halliday (mail@substack.net) and Mathias Buus

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

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

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

module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP;

function mkdirP (p, opts, f, made) {
    if (typeof opts === 'function') {
        f = opts;
        opts = {};
    }
    else if (!opts || typeof opts !== 'object') {
        opts = { mode: opts };
    }
    
    var mode = opts.mode;
    var xfs = opts.fs || fs;
    
    if (mode === undefined) {
        mode = _0777 & (~process.umask());
    }
    if (!made) made = null;
    
    var cb = f || function () {};
    p = path.resolve(p);
    
    xfs.mkdir(p, mode, function (er) {
        if (!er) {
            made = made || p;
            return cb(null, made);
        }
        switch (er.code) {
            case 'ENOENT':
                mkdirP(path.dirname(p), opts, function (er, made) {
                    if (er) cb(er, made);
                    else mkdirP(p, opts, cb, made);
                });
                break;

            // In the case of any other error, just see if there's a dir
            // there already.  If so, then hooray!  If not, then something
            // is borked.
            default:
                xfs.stat(p, function (er2, stat) {
                    // if the stat fails, then that's super weird.
                    // let the original error be the failure reason.
                    if (er2 || !stat.isDirectory()) cb(er, made)
                    else cb(null, made);
                });
                break;
        }
    });
}

mkdirP.sync = function sync (p, opts, made) {
    if (!opts || typeof opts !== 'object') {
        opts = { mode: opts };
    }
    
    var mode = opts.mode;
    var xfs = opts.fs || fs;
    
    if (mode === undefined) {
        mode = _0777 & (~process.umask());
    }
    if (!made) made = null;

    p = path.resolve(p);

    try {
        xfs.mkdirSync(p, mode);
        made = made || p;
    }
    catch (err0) {
        switch (err0.code) {
            case 'ENOENT' :
                made = sync(path.dirname(p), opts, made);
                sync(p, opts, made);
                break;

            // In the case of any other error, just see if there's a dir
            // there already.  If so, then hooray!  If not, then something
            // is borked.
            default:
                var stat;
                try {
                    stat = xfs.statSync(p);
                }
                catch (err1) {
                    throw err0;
                }
                if (!stat.isDirectory()) throw err0;
                break;
        }
    }

    return made;
};
{
  "name": "mkdirp-classic",
  "version": "0.5.3",
  "description": "Mirror of mkdirp 0.5.2",
  "main": "index.js",
  "dependencies": {},
  "devDependencies": {},
  "repository": {
    "type": "git",
    "url": "https://github.com/mafintosh/mkdirp-classic.git"
  },
  "author": "Mathias Buus (@mafintosh)",
  "license": "MIT",
  "homepage": "https://github.com/mafintosh/mkdirp-classic"
}Copyright (c) JS Foundation and other contributors

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

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

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
$.ender({ moment: require('moment') })
//! moment.js
//! version : 2.29.4
//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
//! license : MIT
//! momentjs.com

;(function (global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
    typeof define === 'function' && define.amd ? define(factory) :
    global.moment = factory()
}(this, (function () { 'use strict';

    var hookCallback;

    function hooks() {
        return hookCallback.apply(null, arguments);
    }

    // This is done to register the method called with moment()
    // without creating circular dependencies.
    function setHookCallback(callback) {
        hookCallback = callback;
    }

    function isArray(input) {
        return (
            input instanceof Array ||
            Object.prototype.toString.call(input) === '[object Array]'
        );
    }

    function isObject(input) {
        // IE8 will treat undefined and null as object if it wasn't for
        // input != null
        return (
            input != null &&
            Object.prototype.toString.call(input) === '[object Object]'
        );
    }

    function hasOwnProp(a, b) {
        return Object.prototype.hasOwnProperty.call(a, b);
    }

    function isObjectEmpty(obj) {
        if (Object.getOwnPropertyNames) {
            return Object.getOwnPropertyNames(obj).length === 0;
        } else {
            var k;
            for (k in obj) {
                if (hasOwnProp(obj, k)) {
                    return false;
                }
            }
            return true;
        }
    }

    function isUndefined(input) {
        return input === void 0;
    }

    function isNumber(input) {
        return (
            typeof input === 'number' ||
            Object.prototype.toString.call(input) === '[object Number]'
        );
    }

    function isDate(input) {
        return (
            input instanceof Date ||
            Object.prototype.toString.call(input) === '[object Date]'
        );
    }

    function map(arr, fn) {
        var res = [],
            i,
            arrLen = arr.length;
        for (i = 0; i < arrLen; ++i) {
            res.push(fn(arr[i], i));
        }
        return res;
    }

    function extend(a, b) {
        for (var i in b) {
            if (hasOwnProp(b, i)) {
                a[i] = b[i];
            }
        }

        if (hasOwnProp(b, 'toString')) {
            a.toString = b.toString;
        }

        if (hasOwnProp(b, 'valueOf')) {
            a.valueOf = b.valueOf;
        }

        return a;
    }

    function createUTC(input, format, locale, strict) {
        return createLocalOrUTC(input, format, locale, strict, true).utc();
    }

    function defaultParsingFlags() {
        // We need to deep clone this object.
        return {
            empty: false,
            unusedTokens: [],
            unusedInput: [],
            overflow: -2,
            charsLeftOver: 0,
            nullInput: false,
            invalidEra: null,
            invalidMonth: null,
            invalidFormat: false,
            userInvalidated: false,
            iso: false,
            parsedDateParts: [],
            era: null,
            meridiem: null,
            rfc2822: false,
            weekdayMismatch: false,
        };
    }

    function getParsingFlags(m) {
        if (m._pf == null) {
            m._pf = defaultParsingFlags();
        }
        return m._pf;
    }

    var some;
    if (Array.prototype.some) {
        some = Array.prototype.some;
    } else {
        some = function (fun) {
            var t = Object(this),
                len = t.length >>> 0,
                i;

            for (i = 0; i < len; i++) {
                if (i in t && fun.call(this, t[i], i, t)) {
                    return true;
                }
            }

            return false;
        };
    }

    function isValid(m) {
        if (m._isValid == null) {
            var flags = getParsingFlags(m),
                parsedParts = some.call(flags.parsedDateParts, function (i) {
                    return i != null;
                }),
                isNowValid =
                    !isNaN(m._d.getTime()) &&
                    flags.overflow < 0 &&
                    !flags.empty &&
                    !flags.invalidEra &&
                    !flags.invalidMonth &&
                    !flags.invalidWeekday &&
                    !flags.weekdayMismatch &&
                    !flags.nullInput &&
                    !flags.invalidFormat &&
                    !flags.userInvalidated &&
                    (!flags.meridiem || (flags.meridiem && parsedParts));

            if (m._strict) {
                isNowValid =
                    isNowValid &&
                    flags.charsLeftOver === 0 &&
                    flags.unusedTokens.length === 0 &&
                    flags.bigHour === undefined;
            }

            if (Object.isFrozen == null || !Object.isFrozen(m)) {
                m._isValid = isNowValid;
            } else {
                return isNowValid;
            }
        }
        return m._isValid;
    }

    function createInvalid(flags) {
        var m = createUTC(NaN);
        if (flags != null) {
            extend(getParsingFlags(m), flags);
        } else {
            getParsingFlags(m).userInvalidated = true;
        }

        return m;
    }

    // Plugins that add properties should also add the key here (null value),
    // so we can properly clone ourselves.
    var momentProperties = (hooks.momentProperties = []),
        updateInProgress = false;

    function copyConfig(to, from) {
        var i,
            prop,
            val,
            momentPropertiesLen = momentProperties.length;

        if (!isUndefined(from._isAMomentObject)) {
            to._isAMomentObject = from._isAMomentObject;
        }
        if (!isUndefined(from._i)) {
            to._i = from._i;
        }
        if (!isUndefined(from._f)) {
            to._f = from._f;
        }
        if (!isUndefined(from._l)) {
            to._l = from._l;
        }
        if (!isUndefined(from._strict)) {
            to._strict = from._strict;
        }
        if (!isUndefined(from._tzm)) {
            to._tzm = from._tzm;
        }
        if (!isUndefined(from._isUTC)) {
            to._isUTC = from._isUTC;
        }
        if (!isUndefined(from._offset)) {
            to._offset = from._offset;
        }
        if (!isUndefined(from._pf)) {
            to._pf = getParsingFlags(from);
        }
        if (!isUndefined(from._locale)) {
            to._locale = from._locale;
        }

        if (momentPropertiesLen > 0) {
            for (i = 0; i < momentPropertiesLen; i++) {
                prop = momentProperties[i];
                val = from[prop];
                if (!isUndefined(val)) {
                    to[prop] = val;
                }
            }
        }

        return to;
    }

    // Moment prototype object
    function Moment(config) {
        copyConfig(this, config);
        this._d = new Date(config._d != null ? config._d.getTime() : NaN);
        if (!this.isValid()) {
            this._d = new Date(NaN);
        }
        // Prevent infinite loop in case updateOffset creates new moment
        // objects.
        if (updateInProgress === false) {
            updateInProgress = true;
            hooks.updateOffset(this);
            updateInProgress = false;
        }
    }

    function isMoment(obj) {
        return (
            obj instanceof Moment || (obj != null && obj._isAMomentObject != null)
        );
    }

    function warn(msg) {
        if (
            hooks.suppressDeprecationWarnings === false &&
            typeof console !== 'undefined' &&
            console.warn
        ) {
            console.warn('Deprecation warning: ' + msg);
        }
    }

    function deprecate(msg, fn) {
        var firstTime = true;

        return extend(function () {
            if (hooks.deprecationHandler != null) {
                hooks.deprecationHandler(null, msg);
            }
            if (firstTime) {
                var args = [],
                    arg,
                    i,
                    key,
                    argLen = arguments.length;
                for (i = 0; i < argLen; i++) {
                    arg = '';
                    if (typeof arguments[i] === 'object') {
                        arg += '\n[' + i + '] ';
                        for (key in arguments[0]) {
                            if (hasOwnProp(arguments[0], key)) {
                                arg += key + ': ' + arguments[0][key] + ', ';
                            }
                        }
                        arg = arg.slice(0, -2); // Remove trailing comma and space
                    } else {
                        arg = arguments[i];
                    }
                    args.push(arg);
                }
                warn(
                    msg +
                        '\nArguments: ' +
                        Array.prototype.slice.call(args).join('') +
                        '\n' +
                        new Error().stack
                );
                firstTime = false;
            }
            return fn.apply(this, arguments);
        }, fn);
    }

    var deprecations = {};

    function deprecateSimple(name, msg) {
        if (hooks.deprecationHandler != null) {
            hooks.deprecationHandler(name, msg);
        }
        if (!deprecations[name]) {
            warn(msg);
            deprecations[name] = true;
        }
    }

    hooks.suppressDeprecationWarnings = false;
    hooks.deprecationHandler = null;

    function isFunction(input) {
        return (
            (typeof Function !== 'undefined' && input instanceof Function) ||
            Object.prototype.toString.call(input) === '[object Function]'
        );
    }

    function set(config) {
        var prop, i;
        for (i in config) {
            if (hasOwnProp(config, i)) {
                prop = config[i];
                if (isFunction(prop)) {
                    this[i] = prop;
                } else {
                    this['_' + i] = prop;
                }
            }
        }
        this._config = config;
        // Lenient ordinal parsing accepts just a number in addition to
        // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.
        // TODO: Remove "ordinalParse" fallback in next major release.
        this._dayOfMonthOrdinalParseLenient = new RegExp(
            (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +
                '|' +
                /\d{1,2}/.source
        );
    }

    function mergeConfigs(parentConfig, childConfig) {
        var res = extend({}, parentConfig),
            prop;
        for (prop in childConfig) {
            if (hasOwnProp(childConfig, prop)) {
                if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {
                    res[prop] = {};
                    extend(res[prop], parentConfig[prop]);
                    extend(res[prop], childConfig[prop]);
                } else if (childConfig[prop] != null) {
                    res[prop] = childConfig[prop];
                } else {
                    delete res[prop];
                }
            }
        }
        for (prop in parentConfig) {
            if (
                hasOwnProp(parentConfig, prop) &&
                !hasOwnProp(childConfig, prop) &&
                isObject(parentConfig[prop])
            ) {
                // make sure changes to properties don't modify parent config
                res[prop] = extend({}, res[prop]);
            }
        }
        return res;
    }

    function Locale(config) {
        if (config != null) {
            this.set(config);
        }
    }

    var keys;

    if (Object.keys) {
        keys = Object.keys;
    } else {
        keys = function (obj) {
            var i,
                res = [];
            for (i in obj) {
                if (hasOwnProp(obj, i)) {
                    res.push(i);
                }
            }
            return res;
        };
    }

    var defaultCalendar = {
        sameDay: '[Today at] LT',
        nextDay: '[Tomorrow at] LT',
        nextWeek: 'dddd [at] LT',
        lastDay: '[Yesterday at] LT',
        lastWeek: '[Last] dddd [at] LT',
        sameElse: 'L',
    };

    function calendar(key, mom, now) {
        var output = this._calendar[key] || this._calendar['sameElse'];
        return isFunction(output) ? output.call(mom, now) : output;
    }

    function zeroFill(number, targetLength, forceSign) {
        var absNumber = '' + Math.abs(number),
            zerosToFill = targetLength - absNumber.length,
            sign = number >= 0;
        return (
            (sign ? (forceSign ? '+' : '') : '-') +
            Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) +
            absNumber
        );
    }

    var formattingTokens =
            /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,
        localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,
        formatFunctions = {},
        formatTokenFunctions = {};

    // token:    'M'
    // padded:   ['MM', 2]
    // ordinal:  'Mo'
    // callback: function () { this.month() + 1 }
    function addFormatToken(token, padded, ordinal, callback) {
        var func = callback;
        if (typeof callback === 'string') {
            func = function () {
                return this[callback]();
            };
        }
        if (token) {
            formatTokenFunctions[token] = func;
        }
        if (padded) {
            formatTokenFunctions[padded[0]] = function () {
                return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
            };
        }
        if (ordinal) {
            formatTokenFunctions[ordinal] = function () {
                return this.localeData().ordinal(
                    func.apply(this, arguments),
                    token
                );
            };
        }
    }

    function removeFormattingTokens(input) {
        if (input.match(/\[[\s\S]/)) {
            return input.replace(/^\[|\]$/g, '');
        }
        return input.replace(/\\/g, '');
    }

    function makeFormatFunction(format) {
        var array = format.match(formattingTokens),
            i,
            length;

        for (i = 0, length = array.length; i < length; i++) {
            if (formatTokenFunctions[array[i]]) {
                array[i] = formatTokenFunctions[array[i]];
            } else {
                array[i] = removeFormattingTokens(array[i]);
            }
        }

        return function (mom) {
            var output = '',
                i;
            for (i = 0; i < length; i++) {
                output += isFunction(array[i])
                    ? array[i].call(mom, format)
                    : array[i];
            }
            return output;
        };
    }

    // format date using native date object
    function formatMoment(m, format) {
        if (!m.isValid()) {
            return m.localeData().invalidDate();
        }

        format = expandFormat(format, m.localeData());
        formatFunctions[format] =
            formatFunctions[format] || makeFormatFunction(format);

        return formatFunctions[format](m);
    }

    function expandFormat(format, locale) {
        var i = 5;

        function replaceLongDateFormatTokens(input) {
            return locale.longDateFormat(input) || input;
        }

        localFormattingTokens.lastIndex = 0;
        while (i >= 0 && localFormattingTokens.test(format)) {
            format = format.replace(
                localFormattingTokens,
                replaceLongDateFormatTokens
            );
            localFormattingTokens.lastIndex = 0;
            i -= 1;
        }

        return format;
    }

    var defaultLongDateFormat = {
        LTS: 'h:mm:ss A',
        LT: 'h:mm A',
        L: 'MM/DD/YYYY',
        LL: 'MMMM D, YYYY',
        LLL: 'MMMM D, YYYY h:mm A',
        LLLL: 'dddd, MMMM D, YYYY h:mm A',
    };

    function longDateFormat(key) {
        var format = this._longDateFormat[key],
            formatUpper = this._longDateFormat[key.toUpperCase()];

        if (format || !formatUpper) {
            return format;
        }

        this._longDateFormat[key] = formatUpper
            .match(formattingTokens)
            .map(function (tok) {
                if (
                    tok === 'MMMM' ||
                    tok === 'MM' ||
                    tok === 'DD' ||
                    tok === 'dddd'
                ) {
                    return tok.slice(1);
                }
                return tok;
            })
            .join('');

        return this._longDateFormat[key];
    }

    var defaultInvalidDate = 'Invalid date';

    function invalidDate() {
        return this._invalidDate;
    }

    var defaultOrdinal = '%d',
        defaultDayOfMonthOrdinalParse = /\d{1,2}/;

    function ordinal(number) {
        return this._ordinal.replace('%d', number);
    }

    var defaultRelativeTime = {
        future: 'in %s',
        past: '%s ago',
        s: 'a few seconds',
        ss: '%d seconds',
        m: 'a minute',
        mm: '%d minutes',
        h: 'an hour',
        hh: '%d hours',
        d: 'a day',
        dd: '%d days',
        w: 'a week',
        ww: '%d weeks',
        M: 'a month',
        MM: '%d months',
        y: 'a year',
        yy: '%d years',
    };

    function relativeTime(number, withoutSuffix, string, isFuture) {
        var output = this._relativeTime[string];
        return isFunction(output)
            ? output(number, withoutSuffix, string, isFuture)
            : output.replace(/%d/i, number);
    }

    function pastFuture(diff, output) {
        var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
        return isFunction(format) ? format(output) : format.replace(/%s/i, output);
    }

    var aliases = {};

    function addUnitAlias(unit, shorthand) {
        var lowerCase = unit.toLowerCase();
        aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;
    }

    function normalizeUnits(units) {
        return typeof units === 'string'
            ? aliases[units] || aliases[units.toLowerCase()]
            : undefined;
    }

    function normalizeObjectUnits(inputObject) {
        var normalizedInput = {},
            normalizedProp,
            prop;

        for (prop in inputObject) {
            if (hasOwnProp(inputObject, prop)) {
                normalizedProp = normalizeUnits(prop);
                if (normalizedProp) {
                    normalizedInput[normalizedProp] = inputObject[prop];
                }
            }
        }

        return normalizedInput;
    }

    var priorities = {};

    function addUnitPriority(unit, priority) {
        priorities[unit] = priority;
    }

    function getPrioritizedUnits(unitsObj) {
        var units = [],
            u;
        for (u in unitsObj) {
            if (hasOwnProp(unitsObj, u)) {
                units.push({ unit: u, priority: priorities[u] });
            }
        }
        units.sort(function (a, b) {
            return a.priority - b.priority;
        });
        return units;
    }

    function isLeapYear(year) {
        return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
    }

    function absFloor(number) {
        if (number < 0) {
            // -0 -> 0
            return Math.ceil(number) || 0;
        } else {
            return Math.floor(number);
        }
    }

    function toInt(argumentForCoercion) {
        var coercedNumber = +argumentForCoercion,
            value = 0;

        if (coercedNumber !== 0 && isFinite(coercedNumber)) {
            value = absFloor(coercedNumber);
        }

        return value;
    }

    function makeGetSet(unit, keepTime) {
        return function (value) {
            if (value != null) {
                set$1(this, unit, value);
                hooks.updateOffset(this, keepTime);
                return this;
            } else {
                return get(this, unit);
            }
        };
    }

    function get(mom, unit) {
        return mom.isValid()
            ? mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]()
            : NaN;
    }

    function set$1(mom, unit, value) {
        if (mom.isValid() && !isNaN(value)) {
            if (
                unit === 'FullYear' &&
                isLeapYear(mom.year()) &&
                mom.month() === 1 &&
                mom.date() === 29
            ) {
                value = toInt(value);
                mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](
                    value,
                    mom.month(),
                    daysInMonth(value, mom.month())
                );
            } else {
                mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
            }
        }
    }

    // MOMENTS

    function stringGet(units) {
        units = normalizeUnits(units);
        if (isFunction(this[units])) {
            return this[units]();
        }
        return this;
    }

    function stringSet(units, value) {
        if (typeof units === 'object') {
            units = normalizeObjectUnits(units);
            var prioritized = getPrioritizedUnits(units),
                i,
                prioritizedLen = prioritized.length;
            for (i = 0; i < prioritizedLen; i++) {
                this[prioritized[i].unit](units[prioritized[i].unit]);
            }
        } else {
            units = normalizeUnits(units);
            if (isFunction(this[units])) {
                return this[units](value);
            }
        }
        return this;
    }

    var match1 = /\d/, //       0 - 9
        match2 = /\d\d/, //      00 - 99
        match3 = /\d{3}/, //     000 - 999
        match4 = /\d{4}/, //    0000 - 9999
        match6 = /[+-]?\d{6}/, // -999999 - 999999
        match1to2 = /\d\d?/, //       0 - 99
        match3to4 = /\d\d\d\d?/, //     999 - 9999
        match5to6 = /\d\d\d\d\d\d?/, //   99999 - 999999
        match1to3 = /\d{1,3}/, //       0 - 999
        match1to4 = /\d{1,4}/, //       0 - 9999
        match1to6 = /[+-]?\d{1,6}/, // -999999 - 999999
        matchUnsigned = /\d+/, //       0 - inf
        matchSigned = /[+-]?\d+/, //    -inf - inf
        matchOffset = /Z|[+-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z
        matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi, // +00 -00 +00:00 -00:00 +0000 -0000 or Z
        matchTimestamp = /[+-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123
        // any word (or two) characters or numbers including two/three word month in arabic.
        // includes scottish gaelic two word and hyphenated months
        matchWord =
            /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,
        regexes;

    regexes = {};

    function addRegexToken(token, regex, strictRegex) {
        regexes[token] = isFunction(regex)
            ? regex
            : function (isStrict, localeData) {
                  return isStrict && strictRegex ? strictRegex : regex;
              };
    }

    function getParseRegexForToken(token, config) {
        if (!hasOwnProp(regexes, token)) {
            return new RegExp(unescapeFormat(token));
        }

        return regexes[token](config._strict, config._locale);
    }

    // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
    function unescapeFormat(s) {
        return regexEscape(
            s
                .replace('\\', '')
                .replace(
                    /\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,
                    function (matched, p1, p2, p3, p4) {
                        return p1 || p2 || p3 || p4;
                    }
                )
        );
    }

    function regexEscape(s) {
        return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
    }

    var tokens = {};

    function addParseToken(token, callback) {
        var i,
            func = callback,
            tokenLen;
        if (typeof token === 'string') {
            token = [token];
        }
        if (isNumber(callback)) {
            func = function (input, array) {
                array[callback] = toInt(input);
            };
        }
        tokenLen = token.length;
        for (i = 0; i < tokenLen; i++) {
            tokens[token[i]] = func;
        }
    }

    function addWeekParseToken(token, callback) {
        addParseToken(token, function (input, array, config, token) {
            config._w = config._w || {};
            callback(input, config._w, config, token);
        });
    }

    function addTimeToArrayFromToken(token, input, config) {
        if (input != null && hasOwnProp(tokens, token)) {
            tokens[token](input, config._a, config, token);
        }
    }

    var YEAR = 0,
        MONTH = 1,
        DATE = 2,
        HOUR = 3,
        MINUTE = 4,
        SECOND = 5,
        MILLISECOND = 6,
        WEEK = 7,
        WEEKDAY = 8;

    function mod(n, x) {
        return ((n % x) + x) % x;
    }

    var indexOf;

    if (Array.prototype.indexOf) {
        indexOf = Array.prototype.indexOf;
    } else {
        indexOf = function (o) {
            // I know
            var i;
            for (i = 0; i < this.length; ++i) {
                if (this[i] === o) {
                    return i;
                }
            }
            return -1;
        };
    }

    function daysInMonth(year, month) {
        if (isNaN(year) || isNaN(month)) {
            return NaN;
        }
        var modMonth = mod(month, 12);
        year += (month - modMonth) / 12;
        return modMonth === 1
            ? isLeapYear(year)
                ? 29
                : 28
            : 31 - ((modMonth % 7) % 2);
    }

    // FORMATTING

    addFormatToken('M', ['MM', 2], 'Mo', function () {
        return this.month() + 1;
    });

    addFormatToken('MMM', 0, 0, function (format) {
        return this.localeData().monthsShort(this, format);
    });

    addFormatToken('MMMM', 0, 0, function (format) {
        return this.localeData().months(this, format);
    });

    // ALIASES

    addUnitAlias('month', 'M');

    // PRIORITY

    addUnitPriority('month', 8);

    // PARSING

    addRegexToken('M', match1to2);
    addRegexToken('MM', match1to2, match2);
    addRegexToken('MMM', function (isStrict, locale) {
        return locale.monthsShortRegex(isStrict);
    });
    addRegexToken('MMMM', function (isStrict, locale) {
        return locale.monthsRegex(isStrict);
    });

    addParseToken(['M', 'MM'], function (input, array) {
        array[MONTH] = toInt(input) - 1;
    });

    addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {
        var month = config._locale.monthsParse(input, token, config._strict);
        // if we didn't find a month name, mark the date as invalid.
        if (month != null) {
            array[MONTH] = month;
        } else {
            getParsingFlags(config).invalidMonth = input;
        }
    });

    // LOCALES

    var defaultLocaleMonths =
            'January_February_March_April_May_June_July_August_September_October_November_December'.split(
                '_'
            ),
        defaultLocaleMonthsShort =
            'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
        MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,
        defaultMonthsShortRegex = matchWord,
        defaultMonthsRegex = matchWord;

    function localeMonths(m, format) {
        if (!m) {
            return isArray(this._months)
                ? this._months
                : this._months['standalone'];
        }
        return isArray(this._months)
            ? this._months[m.month()]
            : this._months[
                  (this._months.isFormat || MONTHS_IN_FORMAT).test(format)
                      ? 'format'
                      : 'standalone'
              ][m.month()];
    }

    function localeMonthsShort(m, format) {
        if (!m) {
            return isArray(this._monthsShort)
                ? this._monthsShort
                : this._monthsShort['standalone'];
        }
        return isArray(this._monthsShort)
            ? this._monthsShort[m.month()]
            : this._monthsShort[
                  MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'
              ][m.month()];
    }

    function handleStrictParse(monthName, format, strict) {
        var i,
            ii,
            mom,
            llc = monthName.toLocaleLowerCase();
        if (!this._monthsParse) {
            // this is not used
            this._monthsParse = [];
            this._longMonthsParse = [];
            this._shortMonthsParse = [];
            for (i = 0; i < 12; ++i) {
                mom = createUTC([2000, i]);
                this._shortMonthsParse[i] = this.monthsShort(
                    mom,
                    ''
                ).toLocaleLowerCase();
                this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();
            }
        }

        if (strict) {
            if (format === 'MMM') {
                ii = indexOf.call(this._shortMonthsParse, llc);
                return ii !== -1 ? ii : null;
            } else {
                ii = indexOf.call(this._longMonthsParse, llc);
                return ii !== -1 ? ii : null;
            }
        } else {
            if (format === 'MMM') {
                ii = indexOf.call(this._shortMonthsParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._longMonthsParse, llc);
                return ii !== -1 ? ii : null;
            } else {
                ii = indexOf.call(this._longMonthsParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._shortMonthsParse, llc);
                return ii !== -1 ? ii : null;
            }
        }
    }

    function localeMonthsParse(monthName, format, strict) {
        var i, mom, regex;

        if (this._monthsParseExact) {
            return handleStrictParse.call(this, monthName, format, strict);
        }

        if (!this._monthsParse) {
            this._monthsParse = [];
            this._longMonthsParse = [];
            this._shortMonthsParse = [];
        }

        // TODO: add sorting
        // Sorting makes sure if one month (or abbr) is a prefix of another
        // see sorting in computeMonthsParse
        for (i = 0; i < 12; i++) {
            // make the regex if we don't have it already
            mom = createUTC([2000, i]);
            if (strict && !this._longMonthsParse[i]) {
                this._longMonthsParse[i] = new RegExp(
                    '^' + this.months(mom, '').replace('.', '') + '$',
                    'i'
                );
                this._shortMonthsParse[i] = new RegExp(
                    '^' + this.monthsShort(mom, '').replace('.', '') + '$',
                    'i'
                );
            }
            if (!strict && !this._monthsParse[i]) {
                regex =
                    '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
                this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
            }
            // test the regex
            if (
                strict &&
                format === 'MMMM' &&
                this._longMonthsParse[i].test(monthName)
            ) {
                return i;
            } else if (
                strict &&
                format === 'MMM' &&
                this._shortMonthsParse[i].test(monthName)
            ) {
                return i;
            } else if (!strict && this._monthsParse[i].test(monthName)) {
                return i;
            }
        }
    }

    // MOMENTS

    function setMonth(mom, value) {
        var dayOfMonth;

        if (!mom.isValid()) {
            // No op
            return mom;
        }

        if (typeof value === 'string') {
            if (/^\d+$/.test(value)) {
                value = toInt(value);
            } else {
                value = mom.localeData().monthsParse(value);
                // TODO: Another silent failure?
                if (!isNumber(value)) {
                    return mom;
                }
            }
        }

        dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));
        mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
        return mom;
    }

    function getSetMonth(value) {
        if (value != null) {
            setMonth(this, value);
            hooks.updateOffset(this, true);
            return this;
        } else {
            return get(this, 'Month');
        }
    }

    function getDaysInMonth() {
        return daysInMonth(this.year(), this.month());
    }

    function monthsShortRegex(isStrict) {
        if (this._monthsParseExact) {
            if (!hasOwnProp(this, '_monthsRegex')) {
                computeMonthsParse.call(this);
            }
            if (isStrict) {
                return this._monthsShortStrictRegex;
            } else {
                return this._monthsShortRegex;
            }
        } else {
            if (!hasOwnProp(this, '_monthsShortRegex')) {
                this._monthsShortRegex = defaultMonthsShortRegex;
            }
            return this._monthsShortStrictRegex && isStrict
                ? this._monthsShortStrictRegex
                : this._monthsShortRegex;
        }
    }

    function monthsRegex(isStrict) {
        if (this._monthsParseExact) {
            if (!hasOwnProp(this, '_monthsRegex')) {
                computeMonthsParse.call(this);
            }
            if (isStrict) {
                return this._monthsStrictRegex;
            } else {
                return this._monthsRegex;
            }
        } else {
            if (!hasOwnProp(this, '_monthsRegex')) {
                this._monthsRegex = defaultMonthsRegex;
            }
            return this._monthsStrictRegex && isStrict
                ? this._monthsStrictRegex
                : this._monthsRegex;
        }
    }

    function computeMonthsParse() {
        function cmpLenRev(a, b) {
            return b.length - a.length;
        }

        var shortPieces = [],
            longPieces = [],
            mixedPieces = [],
            i,
            mom;
        for (i = 0; i < 12; i++) {
            // make the regex if we don't have it already
            mom = createUTC([2000, i]);
            shortPieces.push(this.monthsShort(mom, ''));
            longPieces.push(this.months(mom, ''));
            mixedPieces.push(this.months(mom, ''));
            mixedPieces.push(this.monthsShort(mom, ''));
        }
        // Sorting makes sure if one month (or abbr) is a prefix of another it
        // will match the longer piece.
        shortPieces.sort(cmpLenRev);
        longPieces.sort(cmpLenRev);
        mixedPieces.sort(cmpLenRev);
        for (i = 0; i < 12; i++) {
            shortPieces[i] = regexEscape(shortPieces[i]);
            longPieces[i] = regexEscape(longPieces[i]);
        }
        for (i = 0; i < 24; i++) {
            mixedPieces[i] = regexEscape(mixedPieces[i]);
        }

        this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
        this._monthsShortRegex = this._monthsRegex;
        this._monthsStrictRegex = new RegExp(
            '^(' + longPieces.join('|') + ')',
            'i'
        );
        this._monthsShortStrictRegex = new RegExp(
            '^(' + shortPieces.join('|') + ')',
            'i'
        );
    }

    // FORMATTING

    addFormatToken('Y', 0, 0, function () {
        var y = this.year();
        return y <= 9999 ? zeroFill(y, 4) : '+' + y;
    });

    addFormatToken(0, ['YY', 2], 0, function () {
        return this.year() % 100;
    });

    addFormatToken(0, ['YYYY', 4], 0, 'year');
    addFormatToken(0, ['YYYYY', 5], 0, 'year');
    addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');

    // ALIASES

    addUnitAlias('year', 'y');

    // PRIORITIES

    addUnitPriority('year', 1);

    // PARSING

    addRegexToken('Y', matchSigned);
    addRegexToken('YY', match1to2, match2);
    addRegexToken('YYYY', match1to4, match4);
    addRegexToken('YYYYY', match1to6, match6);
    addRegexToken('YYYYYY', match1to6, match6);

    addParseToken(['YYYYY', 'YYYYYY'], YEAR);
    addParseToken('YYYY', function (input, array) {
        array[YEAR] =
            input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);
    });
    addParseToken('YY', function (input, array) {
        array[YEAR] = hooks.parseTwoDigitYear(input);
    });
    addParseToken('Y', function (input, array) {
        array[YEAR] = parseInt(input, 10);
    });

    // HELPERS

    function daysInYear(year) {
        return isLeapYear(year) ? 366 : 365;
    }

    // HOOKS

    hooks.parseTwoDigitYear = function (input) {
        return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
    };

    // MOMENTS

    var getSetYear = makeGetSet('FullYear', true);

    function getIsLeapYear() {
        return isLeapYear(this.year());
    }

    function createDate(y, m, d, h, M, s, ms) {
        // can't just apply() to create a date:
        // https://stackoverflow.com/q/181348
        var date;
        // the date constructor remaps years 0-99 to 1900-1999
        if (y < 100 && y >= 0) {
            // preserve leap years using a full 400 year cycle, then reset
            date = new Date(y + 400, m, d, h, M, s, ms);
            if (isFinite(date.getFullYear())) {
                date.setFullYear(y);
            }
        } else {
            date = new Date(y, m, d, h, M, s, ms);
        }

        return date;
    }

    function createUTCDate(y) {
        var date, args;
        // the Date.UTC function remaps years 0-99 to 1900-1999
        if (y < 100 && y >= 0) {
            args = Array.prototype.slice.call(arguments);
            // preserve leap years using a full 400 year cycle, then reset
            args[0] = y + 400;
            date = new Date(Date.UTC.apply(null, args));
            if (isFinite(date.getUTCFullYear())) {
                date.setUTCFullYear(y);
            }
        } else {
            date = new Date(Date.UTC.apply(null, arguments));
        }

        return date;
    }

    // start-of-first-week - start-of-year
    function firstWeekOffset(year, dow, doy) {
        var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
            fwd = 7 + dow - doy,
            // first-week day local weekday -- which local weekday is fwd
            fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;

        return -fwdlw + fwd - 1;
    }

    // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
    function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
        var localWeekday = (7 + weekday - dow) % 7,
            weekOffset = firstWeekOffset(year, dow, doy),
            dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,
            resYear,
            resDayOfYear;

        if (dayOfYear <= 0) {
            resYear = year - 1;
            resDayOfYear = daysInYear(resYear) + dayOfYear;
        } else if (dayOfYear > daysInYear(year)) {
            resYear = year + 1;
            resDayOfYear = dayOfYear - daysInYear(year);
        } else {
            resYear = year;
            resDayOfYear = dayOfYear;
        }

        return {
            year: resYear,
            dayOfYear: resDayOfYear,
        };
    }

    function weekOfYear(mom, dow, doy) {
        var weekOffset = firstWeekOffset(mom.year(), dow, doy),
            week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,
            resWeek,
            resYear;

        if (week < 1) {
            resYear = mom.year() - 1;
            resWeek = week + weeksInYear(resYear, dow, doy);
        } else if (week > weeksInYear(mom.year(), dow, doy)) {
            resWeek = week - weeksInYear(mom.year(), dow, doy);
            resYear = mom.year() + 1;
        } else {
            resYear = mom.year();
            resWeek = week;
        }

        return {
            week: resWeek,
            year: resYear,
        };
    }

    function weeksInYear(year, dow, doy) {
        var weekOffset = firstWeekOffset(year, dow, doy),
            weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
        return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
    }

    // FORMATTING

    addFormatToken('w', ['ww', 2], 'wo', 'week');
    addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');

    // ALIASES

    addUnitAlias('week', 'w');
    addUnitAlias('isoWeek', 'W');

    // PRIORITIES

    addUnitPriority('week', 5);
    addUnitPriority('isoWeek', 5);

    // PARSING

    addRegexToken('w', match1to2);
    addRegexToken('ww', match1to2, match2);
    addRegexToken('W', match1to2);
    addRegexToken('WW', match1to2, match2);

    addWeekParseToken(
        ['w', 'ww', 'W', 'WW'],
        function (input, week, config, token) {
            week[token.substr(0, 1)] = toInt(input);
        }
    );

    // HELPERS

    // LOCALES

    function localeWeek(mom) {
        return weekOfYear(mom, this._week.dow, this._week.doy).week;
    }

    var defaultLocaleWeek = {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    };

    function localeFirstDayOfWeek() {
        return this._week.dow;
    }

    function localeFirstDayOfYear() {
        return this._week.doy;
    }

    // MOMENTS

    function getSetWeek(input) {
        var week = this.localeData().week(this);
        return input == null ? week : this.add((input - week) * 7, 'd');
    }

    function getSetISOWeek(input) {
        var week = weekOfYear(this, 1, 4).week;
        return input == null ? week : this.add((input - week) * 7, 'd');
    }

    // FORMATTING

    addFormatToken('d', 0, 'do', 'day');

    addFormatToken('dd', 0, 0, function (format) {
        return this.localeData().weekdaysMin(this, format);
    });

    addFormatToken('ddd', 0, 0, function (format) {
        return this.localeData().weekdaysShort(this, format);
    });

    addFormatToken('dddd', 0, 0, function (format) {
        return this.localeData().weekdays(this, format);
    });

    addFormatToken('e', 0, 0, 'weekday');
    addFormatToken('E', 0, 0, 'isoWeekday');

    // ALIASES

    addUnitAlias('day', 'd');
    addUnitAlias('weekday', 'e');
    addUnitAlias('isoWeekday', 'E');

    // PRIORITY
    addUnitPriority('day', 11);
    addUnitPriority('weekday', 11);
    addUnitPriority('isoWeekday', 11);

    // PARSING

    addRegexToken('d', match1to2);
    addRegexToken('e', match1to2);
    addRegexToken('E', match1to2);
    addRegexToken('dd', function (isStrict, locale) {
        return locale.weekdaysMinRegex(isStrict);
    });
    addRegexToken('ddd', function (isStrict, locale) {
        return locale.weekdaysShortRegex(isStrict);
    });
    addRegexToken('dddd', function (isStrict, locale) {
        return locale.weekdaysRegex(isStrict);
    });

    addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {
        var weekday = config._locale.weekdaysParse(input, token, config._strict);
        // if we didn't get a weekday name, mark the date as invalid
        if (weekday != null) {
            week.d = weekday;
        } else {
            getParsingFlags(config).invalidWeekday = input;
        }
    });

    addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
        week[token] = toInt(input);
    });

    // HELPERS

    function parseWeekday(input, locale) {
        if (typeof input !== 'string') {
            return input;
        }

        if (!isNaN(input)) {
            return parseInt(input, 10);
        }

        input = locale.weekdaysParse(input);
        if (typeof input === 'number') {
            return input;
        }

        return null;
    }

    function parseIsoWeekday(input, locale) {
        if (typeof input === 'string') {
            return locale.weekdaysParse(input) % 7 || 7;
        }
        return isNaN(input) ? null : input;
    }

    // LOCALES
    function shiftWeekdays(ws, n) {
        return ws.slice(n, 7).concat(ws.slice(0, n));
    }

    var defaultLocaleWeekdays =
            'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
        defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
        defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
        defaultWeekdaysRegex = matchWord,
        defaultWeekdaysShortRegex = matchWord,
        defaultWeekdaysMinRegex = matchWord;

    function localeWeekdays(m, format) {
        var weekdays = isArray(this._weekdays)
            ? this._weekdays
            : this._weekdays[
                  m && m !== true && this._weekdays.isFormat.test(format)
                      ? 'format'
                      : 'standalone'
              ];
        return m === true
            ? shiftWeekdays(weekdays, this._week.dow)
            : m
            ? weekdays[m.day()]
            : weekdays;
    }

    function localeWeekdaysShort(m) {
        return m === true
            ? shiftWeekdays(this._weekdaysShort, this._week.dow)
            : m
            ? this._weekdaysShort[m.day()]
            : this._weekdaysShort;
    }

    function localeWeekdaysMin(m) {
        return m === true
            ? shiftWeekdays(this._weekdaysMin, this._week.dow)
            : m
            ? this._weekdaysMin[m.day()]
            : this._weekdaysMin;
    }

    function handleStrictParse$1(weekdayName, format, strict) {
        var i,
            ii,
            mom,
            llc = weekdayName.toLocaleLowerCase();
        if (!this._weekdaysParse) {
            this._weekdaysParse = [];
            this._shortWeekdaysParse = [];
            this._minWeekdaysParse = [];

            for (i = 0; i < 7; ++i) {
                mom = createUTC([2000, 1]).day(i);
                this._minWeekdaysParse[i] = this.weekdaysMin(
                    mom,
                    ''
                ).toLocaleLowerCase();
                this._shortWeekdaysParse[i] = this.weekdaysShort(
                    mom,
                    ''
                ).toLocaleLowerCase();
                this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();
            }
        }

        if (strict) {
            if (format === 'dddd') {
                ii = indexOf.call(this._weekdaysParse, llc);
                return ii !== -1 ? ii : null;
            } else if (format === 'ddd') {
                ii = indexOf.call(this._shortWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            } else {
                ii = indexOf.call(this._minWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            }
        } else {
            if (format === 'dddd') {
                ii = indexOf.call(this._weekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._shortWeekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._minWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            } else if (format === 'ddd') {
                ii = indexOf.call(this._shortWeekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._weekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._minWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            } else {
                ii = indexOf.call(this._minWeekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._weekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._shortWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            }
        }
    }

    function localeWeekdaysParse(weekdayName, format, strict) {
        var i, mom, regex;

        if (this._weekdaysParseExact) {
            return handleStrictParse$1.call(this, weekdayName, format, strict);
        }

        if (!this._weekdaysParse) {
            this._weekdaysParse = [];
            this._minWeekdaysParse = [];
            this._shortWeekdaysParse = [];
            this._fullWeekdaysParse = [];
        }

        for (i = 0; i < 7; i++) {
            // make the regex if we don't have it already

            mom = createUTC([2000, 1]).day(i);
            if (strict && !this._fullWeekdaysParse[i]) {
                this._fullWeekdaysParse[i] = new RegExp(
                    '^' + this.weekdays(mom, '').replace('.', '\\.?') + '$',
                    'i'
                );
                this._shortWeekdaysParse[i] = new RegExp(
                    '^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$',
                    'i'
                );
                this._minWeekdaysParse[i] = new RegExp(
                    '^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$',
                    'i'
                );
            }
            if (!this._weekdaysParse[i]) {
                regex =
                    '^' +
                    this.weekdays(mom, '') +
                    '|^' +
                    this.weekdaysShort(mom, '') +
                    '|^' +
                    this.weekdaysMin(mom, '');
                this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
            }
            // test the regex
            if (
                strict &&
                format === 'dddd' &&
                this._fullWeekdaysParse[i].test(weekdayName)
            ) {
                return i;
            } else if (
                strict &&
                format === 'ddd' &&
                this._shortWeekdaysParse[i].test(weekdayName)
            ) {
                return i;
            } else if (
                strict &&
                format === 'dd' &&
                this._minWeekdaysParse[i].test(weekdayName)
            ) {
                return i;
            } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {
                return i;
            }
        }
    }

    // MOMENTS

    function getSetDayOfWeek(input) {
        if (!this.isValid()) {
            return input != null ? this : NaN;
        }
        var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
        if (input != null) {
            input = parseWeekday(input, this.localeData());
            return this.add(input - day, 'd');
        } else {
            return day;
        }
    }

    function getSetLocaleDayOfWeek(input) {
        if (!this.isValid()) {
            return input != null ? this : NaN;
        }
        var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
        return input == null ? weekday : this.add(input - weekday, 'd');
    }

    function getSetISODayOfWeek(input) {
        if (!this.isValid()) {
            return input != null ? this : NaN;
        }

        // behaves the same as moment#day except
        // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
        // as a setter, sunday should belong to the previous week.

        if (input != null) {
            var weekday = parseIsoWeekday(input, this.localeData());
            return this.day(this.day() % 7 ? weekday : weekday - 7);
        } else {
            return this.day() || 7;
        }
    }

    function weekdaysRegex(isStrict) {
        if (this._weekdaysParseExact) {
            if (!hasOwnProp(this, '_weekdaysRegex')) {
                computeWeekdaysParse.call(this);
            }
            if (isStrict) {
                return this._weekdaysStrictRegex;
            } else {
                return this._weekdaysRegex;
            }
        } else {
            if (!hasOwnProp(this, '_weekdaysRegex')) {
                this._weekdaysRegex = defaultWeekdaysRegex;
            }
            return this._weekdaysStrictRegex && isStrict
                ? this._weekdaysStrictRegex
                : this._weekdaysRegex;
        }
    }

    function weekdaysShortRegex(isStrict) {
        if (this._weekdaysParseExact) {
            if (!hasOwnProp(this, '_weekdaysRegex')) {
                computeWeekdaysParse.call(this);
            }
            if (isStrict) {
                return this._weekdaysShortStrictRegex;
            } else {
                return this._weekdaysShortRegex;
            }
        } else {
            if (!hasOwnProp(this, '_weekdaysShortRegex')) {
                this._weekdaysShortRegex = defaultWeekdaysShortRegex;
            }
            return this._weekdaysShortStrictRegex && isStrict
                ? this._weekdaysShortStrictRegex
                : this._weekdaysShortRegex;
        }
    }

    function weekdaysMinRegex(isStrict) {
        if (this._weekdaysParseExact) {
            if (!hasOwnProp(this, '_weekdaysRegex')) {
                computeWeekdaysParse.call(this);
            }
            if (isStrict) {
                return this._weekdaysMinStrictRegex;
            } else {
                return this._weekdaysMinRegex;
            }
        } else {
            if (!hasOwnProp(this, '_weekdaysMinRegex')) {
                this._weekdaysMinRegex = defaultWeekdaysMinRegex;
            }
            return this._weekdaysMinStrictRegex && isStrict
                ? this._weekdaysMinStrictRegex
                : this._weekdaysMinRegex;
        }
    }

    function computeWeekdaysParse() {
        function cmpLenRev(a, b) {
            return b.length - a.length;
        }

        var minPieces = [],
            shortPieces = [],
            longPieces = [],
            mixedPieces = [],
            i,
            mom,
            minp,
            shortp,
            longp;
        for (i = 0; i < 7; i++) {
            // make the regex if we don't have it already
            mom = createUTC([2000, 1]).day(i);
            minp = regexEscape(this.weekdaysMin(mom, ''));
            shortp = regexEscape(this.weekdaysShort(mom, ''));
            longp = regexEscape(this.weekdays(mom, ''));
            minPieces.push(minp);
            shortPieces.push(shortp);
            longPieces.push(longp);
            mixedPieces.push(minp);
            mixedPieces.push(shortp);
            mixedPieces.push(longp);
        }
        // Sorting makes sure if one weekday (or abbr) is a prefix of another it
        // will match the longer piece.
        minPieces.sort(cmpLenRev);
        shortPieces.sort(cmpLenRev);
        longPieces.sort(cmpLenRev);
        mixedPieces.sort(cmpLenRev);

        this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
        this._weekdaysShortRegex = this._weekdaysRegex;
        this._weekdaysMinRegex = this._weekdaysRegex;

        this._weekdaysStrictRegex = new RegExp(
            '^(' + longPieces.join('|') + ')',
            'i'
        );
        this._weekdaysShortStrictRegex = new RegExp(
            '^(' + shortPieces.join('|') + ')',
            'i'
        );
        this._weekdaysMinStrictRegex = new RegExp(
            '^(' + minPieces.join('|') + ')',
            'i'
        );
    }

    // FORMATTING

    function hFormat() {
        return this.hours() % 12 || 12;
    }

    function kFormat() {
        return this.hours() || 24;
    }

    addFormatToken('H', ['HH', 2], 0, 'hour');
    addFormatToken('h', ['hh', 2], 0, hFormat);
    addFormatToken('k', ['kk', 2], 0, kFormat);

    addFormatToken('hmm', 0, 0, function () {
        return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);
    });

    addFormatToken('hmmss', 0, 0, function () {
        return (
            '' +
            hFormat.apply(this) +
            zeroFill(this.minutes(), 2) +
            zeroFill(this.seconds(), 2)
        );
    });

    addFormatToken('Hmm', 0, 0, function () {
        return '' + this.hours() + zeroFill(this.minutes(), 2);
    });

    addFormatToken('Hmmss', 0, 0, function () {
        return (
            '' +
            this.hours() +
            zeroFill(this.minutes(), 2) +
            zeroFill(this.seconds(), 2)
        );
    });

    function meridiem(token, lowercase) {
        addFormatToken(token, 0, 0, function () {
            return this.localeData().meridiem(
                this.hours(),
                this.minutes(),
                lowercase
            );
        });
    }

    meridiem('a', true);
    meridiem('A', false);

    // ALIASES

    addUnitAlias('hour', 'h');

    // PRIORITY
    addUnitPriority('hour', 13);

    // PARSING

    function matchMeridiem(isStrict, locale) {
        return locale._meridiemParse;
    }

    addRegexToken('a', matchMeridiem);
    addRegexToken('A', matchMeridiem);
    addRegexToken('H', match1to2);
    addRegexToken('h', match1to2);
    addRegexToken('k', match1to2);
    addRegexToken('HH', match1to2, match2);
    addRegexToken('hh', match1to2, match2);
    addRegexToken('kk', match1to2, match2);

    addRegexToken('hmm', match3to4);
    addRegexToken('hmmss', match5to6);
    addRegexToken('Hmm', match3to4);
    addRegexToken('Hmmss', match5to6);

    addParseToken(['H', 'HH'], HOUR);
    addParseToken(['k', 'kk'], function (input, array, config) {
        var kInput = toInt(input);
        array[HOUR] = kInput === 24 ? 0 : kInput;
    });
    addParseToken(['a', 'A'], function (input, array, config) {
        config._isPm = config._locale.isPM(input);
        config._meridiem = input;
    });
    addParseToken(['h', 'hh'], function (input, array, config) {
        array[HOUR] = toInt(input);
        getParsingFlags(config).bigHour = true;
    });
    addParseToken('hmm', function (input, array, config) {
        var pos = input.length - 2;
        array[HOUR] = toInt(input.substr(0, pos));
        array[MINUTE] = toInt(input.substr(pos));
        getParsingFlags(config).bigHour = true;
    });
    addParseToken('hmmss', function (input, array, config) {
        var pos1 = input.length - 4,
            pos2 = input.length - 2;
        array[HOUR] = toInt(input.substr(0, pos1));
        array[MINUTE] = toInt(input.substr(pos1, 2));
        array[SECOND] = toInt(input.substr(pos2));
        getParsingFlags(config).bigHour = true;
    });
    addParseToken('Hmm', function (input, array, config) {
        var pos = input.length - 2;
        array[HOUR] = toInt(input.substr(0, pos));
        array[MINUTE] = toInt(input.substr(pos));
    });
    addParseToken('Hmmss', function (input, array, config) {
        var pos1 = input.length - 4,
            pos2 = input.length - 2;
        array[HOUR] = toInt(input.substr(0, pos1));
        array[MINUTE] = toInt(input.substr(pos1, 2));
        array[SECOND] = toInt(input.substr(pos2));
    });

    // LOCALES

    function localeIsPM(input) {
        // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
        // Using charAt should be more compatible.
        return (input + '').toLowerCase().charAt(0) === 'p';
    }

    var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i,
        // Setting the hour should keep the time, because the user explicitly
        // specified which hour they want. So trying to maintain the same hour (in
        // a new timezone) makes sense. Adding/subtracting hours does not follow
        // this rule.
        getSetHour = makeGetSet('Hours', true);

    function localeMeridiem(hours, minutes, isLower) {
        if (hours > 11) {
            return isLower ? 'pm' : 'PM';
        } else {
            return isLower ? 'am' : 'AM';
        }
    }

    var baseConfig = {
        calendar: defaultCalendar,
        longDateFormat: defaultLongDateFormat,
        invalidDate: defaultInvalidDate,
        ordinal: defaultOrdinal,
        dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,
        relativeTime: defaultRelativeTime,

        months: defaultLocaleMonths,
        monthsShort: defaultLocaleMonthsShort,

        week: defaultLocaleWeek,

        weekdays: defaultLocaleWeekdays,
        weekdaysMin: defaultLocaleWeekdaysMin,
        weekdaysShort: defaultLocaleWeekdaysShort,

        meridiemParse: defaultLocaleMeridiemParse,
    };

    // internal storage for locale config files
    var locales = {},
        localeFamilies = {},
        globalLocale;

    function commonPrefix(arr1, arr2) {
        var i,
            minl = Math.min(arr1.length, arr2.length);
        for (i = 0; i < minl; i += 1) {
            if (arr1[i] !== arr2[i]) {
                return i;
            }
        }
        return minl;
    }

    function normalizeLocale(key) {
        return key ? key.toLowerCase().replace('_', '-') : key;
    }

    // pick the locale from the array
    // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
    // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
    function chooseLocale(names) {
        var i = 0,
            j,
            next,
            locale,
            split;

        while (i < names.length) {
            split = normalizeLocale(names[i]).split('-');
            j = split.length;
            next = normalizeLocale(names[i + 1]);
            next = next ? next.split('-') : null;
            while (j > 0) {
                locale = loadLocale(split.slice(0, j).join('-'));
                if (locale) {
                    return locale;
                }
                if (
                    next &&
                    next.length >= j &&
                    commonPrefix(split, next) >= j - 1
                ) {
                    //the next array item is better than a shallower substring of this one
                    break;
                }
                j--;
            }
            i++;
        }
        return globalLocale;
    }

    function isLocaleNameSane(name) {
        // Prevent names that look like filesystem paths, i.e contain '/' or '\'
        return name.match('^[^/\\\\]*$') != null;
    }

    function loadLocale(name) {
        var oldLocale = null,
            aliasedRequire;
        // TODO: Find a better way to register and load all the locales in Node
        if (
            locales[name] === undefined &&
            typeof module !== 'undefined' &&
            module &&
            module.exports &&
            isLocaleNameSane(name)
        ) {
            try {
                oldLocale = globalLocale._abbr;
                aliasedRequire = require;
                aliasedRequire('./locale/' + name);
                getSetGlobalLocale(oldLocale);
            } catch (e) {
                // mark as not found to avoid repeating expensive file require call causing high CPU
                // when trying to find en-US, en_US, en-us for every format call
                locales[name] = null; // null means not found
            }
        }
        return locales[name];
    }

    // This function will load locale and then set the global locale.  If
    // no arguments are passed in, it will simply return the current global
    // locale key.
    function getSetGlobalLocale(key, values) {
        var data;
        if (key) {
            if (isUndefined(values)) {
                data = getLocale(key);
            } else {
                data = defineLocale(key, values);
            }

            if (data) {
                // moment.duration._locale = moment._locale = data;
                globalLocale = data;
            } else {
                if (typeof console !== 'undefined' && console.warn) {
                    //warn user if arguments are passed but the locale could not be set
                    console.warn(
                        'Locale ' + key + ' not found. Did you forget to load it?'
                    );
                }
            }
        }

        return globalLocale._abbr;
    }

    function defineLocale(name, config) {
        if (config !== null) {
            var locale,
                parentConfig = baseConfig;
            config.abbr = name;
            if (locales[name] != null) {
                deprecateSimple(
                    'defineLocaleOverride',
                    'use moment.updateLocale(localeName, config) to change ' +
                        'an existing locale. moment.defineLocale(localeName, ' +
                        'config) should only be used for creating a new locale ' +
                        'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'
                );
                parentConfig = locales[name]._config;
            } else if (config.parentLocale != null) {
                if (locales[config.parentLocale] != null) {
                    parentConfig = locales[config.parentLocale]._config;
                } else {
                    locale = loadLocale(config.parentLocale);
                    if (locale != null) {
                        parentConfig = locale._config;
                    } else {
                        if (!localeFamilies[config.parentLocale]) {
                            localeFamilies[config.parentLocale] = [];
                        }
                        localeFamilies[config.parentLocale].push({
                            name: name,
                            config: config,
                        });
                        return null;
                    }
                }
            }
            locales[name] = new Locale(mergeConfigs(parentConfig, config));

            if (localeFamilies[name]) {
                localeFamilies[name].forEach(function (x) {
                    defineLocale(x.name, x.config);
                });
            }

            // backwards compat for now: also set the locale
            // make sure we set the locale AFTER all child locales have been
            // created, so we won't end up with the child locale set.
            getSetGlobalLocale(name);

            return locales[name];
        } else {
            // useful for testing
            delete locales[name];
            return null;
        }
    }

    function updateLocale(name, config) {
        if (config != null) {
            var locale,
                tmpLocale,
                parentConfig = baseConfig;

            if (locales[name] != null && locales[name].parentLocale != null) {
                // Update existing child locale in-place to avoid memory-leaks
                locales[name].set(mergeConfigs(locales[name]._config, config));
            } else {
                // MERGE
                tmpLocale = loadLocale(name);
                if (tmpLocale != null) {
                    parentConfig = tmpLocale._config;
                }
                config = mergeConfigs(parentConfig, config);
                if (tmpLocale == null) {
                    // updateLocale is called for creating a new locale
                    // Set abbr so it will have a name (getters return
                    // undefined otherwise).
                    config.abbr = name;
                }
                locale = new Locale(config);
                locale.parentLocale = locales[name];
                locales[name] = locale;
            }

            // backwards compat for now: also set the locale
            getSetGlobalLocale(name);
        } else {
            // pass null for config to unupdate, useful for tests
            if (locales[name] != null) {
                if (locales[name].parentLocale != null) {
                    locales[name] = locales[name].parentLocale;
                    if (name === getSetGlobalLocale()) {
                        getSetGlobalLocale(name);
                    }
                } else if (locales[name] != null) {
                    delete locales[name];
                }
            }
        }
        return locales[name];
    }

    // returns locale data
    function getLocale(key) {
        var locale;

        if (key && key._locale && key._locale._abbr) {
            key = key._locale._abbr;
        }

        if (!key) {
            return globalLocale;
        }

        if (!isArray(key)) {
            //short-circuit everything else
            locale = loadLocale(key);
            if (locale) {
                return locale;
            }
            key = [key];
        }

        return chooseLocale(key);
    }

    function listLocales() {
        return keys(locales);
    }

    function checkOverflow(m) {
        var overflow,
            a = m._a;

        if (a && getParsingFlags(m).overflow === -2) {
            overflow =
                a[MONTH] < 0 || a[MONTH] > 11
                    ? MONTH
                    : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH])
                    ? DATE
                    : a[HOUR] < 0 ||
                      a[HOUR] > 24 ||
                      (a[HOUR] === 24 &&
                          (a[MINUTE] !== 0 ||
                              a[SECOND] !== 0 ||
                              a[MILLISECOND] !== 0))
                    ? HOUR
                    : a[MINUTE] < 0 || a[MINUTE] > 59
                    ? MINUTE
                    : a[SECOND] < 0 || a[SECOND] > 59
                    ? SECOND
                    : a[MILLISECOND] < 0 || a[MILLISECOND] > 999
                    ? MILLISECOND
                    : -1;

            if (
                getParsingFlags(m)._overflowDayOfYear &&
                (overflow < YEAR || overflow > DATE)
            ) {
                overflow = DATE;
            }
            if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
                overflow = WEEK;
            }
            if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
                overflow = WEEKDAY;
            }

            getParsingFlags(m).overflow = overflow;
        }

        return m;
    }

    // iso 8601 regex
    // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
    var extendedIsoRegex =
            /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
        basicIsoRegex =
            /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
        tzRegex = /Z|[+-]\d\d(?::?\d\d)?/,
        isoDates = [
            ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
            ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/],
            ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/],
            ['GGGG-[W]WW', /\d{4}-W\d\d/, false],
            ['YYYY-DDD', /\d{4}-\d{3}/],
            ['YYYY-MM', /\d{4}-\d\d/, false],
            ['YYYYYYMMDD', /[+-]\d{10}/],
            ['YYYYMMDD', /\d{8}/],
            ['GGGG[W]WWE', /\d{4}W\d{3}/],
            ['GGGG[W]WW', /\d{4}W\d{2}/, false],
            ['YYYYDDD', /\d{7}/],
            ['YYYYMM', /\d{6}/, false],
            ['YYYY', /\d{4}/, false],
        ],
        // iso time formats and regexes
        isoTimes = [
            ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/],
            ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/],
            ['HH:mm:ss', /\d\d:\d\d:\d\d/],
            ['HH:mm', /\d\d:\d\d/],
            ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/],
            ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/],
            ['HHmmss', /\d\d\d\d\d\d/],
            ['HHmm', /\d\d\d\d/],
            ['HH', /\d\d/],
        ],
        aspNetJsonRegex = /^\/?Date\((-?\d+)/i,
        // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3
        rfc2822 =
            /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,
        obsOffsets = {
            UT: 0,
            GMT: 0,
            EDT: -4 * 60,
            EST: -5 * 60,
            CDT: -5 * 60,
            CST: -6 * 60,
            MDT: -6 * 60,
            MST: -7 * 60,
            PDT: -7 * 60,
            PST: -8 * 60,
        };

    // date from iso format
    function configFromISO(config) {
        var i,
            l,
            string = config._i,
            match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),
            allowTime,
            dateFormat,
            timeFormat,
            tzFormat,
            isoDatesLen = isoDates.length,
            isoTimesLen = isoTimes.length;

        if (match) {
            getParsingFlags(config).iso = true;
            for (i = 0, l = isoDatesLen; i < l; i++) {
                if (isoDates[i][1].exec(match[1])) {
                    dateFormat = isoDates[i][0];
                    allowTime = isoDates[i][2] !== false;
                    break;
                }
            }
            if (dateFormat == null) {
                config._isValid = false;
                return;
            }
            if (match[3]) {
                for (i = 0, l = isoTimesLen; i < l; i++) {
                    if (isoTimes[i][1].exec(match[3])) {
                        // match[2] should be 'T' or space
                        timeFormat = (match[2] || ' ') + isoTimes[i][0];
                        break;
                    }
                }
                if (timeFormat == null) {
                    config._isValid = false;
                    return;
                }
            }
            if (!allowTime && timeFormat != null) {
                config._isValid = false;
                return;
            }
            if (match[4]) {
                if (tzRegex.exec(match[4])) {
                    tzFormat = 'Z';
                } else {
                    config._isValid = false;
                    return;
                }
            }
            config._f = dateFormat + (timeFormat || '') + (tzFormat || '');
            configFromStringAndFormat(config);
        } else {
            config._isValid = false;
        }
    }

    function extractFromRFC2822Strings(
        yearStr,
        monthStr,
        dayStr,
        hourStr,
        minuteStr,
        secondStr
    ) {
        var result = [
            untruncateYear(yearStr),
            defaultLocaleMonthsShort.indexOf(monthStr),
            parseInt(dayStr, 10),
            parseInt(hourStr, 10),
            parseInt(minuteStr, 10),
        ];

        if (secondStr) {
            result.push(parseInt(secondStr, 10));
        }

        return result;
    }

    function untruncateYear(yearStr) {
        var year = parseInt(yearStr, 10);
        if (year <= 49) {
            return 2000 + year;
        } else if (year <= 999) {
            return 1900 + year;
        }
        return year;
    }

    function preprocessRFC2822(s) {
        // Remove comments and folding whitespace and replace multiple-spaces with a single space
        return s
            .replace(/\([^()]*\)|[\n\t]/g, ' ')
            .replace(/(\s\s+)/g, ' ')
            .replace(/^\s\s*/, '')
            .replace(/\s\s*$/, '');
    }

    function checkWeekday(weekdayStr, parsedInput, config) {
        if (weekdayStr) {
            // TODO: Replace the vanilla JS Date object with an independent day-of-week check.
            var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),
                weekdayActual = new Date(
                    parsedInput[0],
                    parsedInput[1],
                    parsedInput[2]
                ).getDay();
            if (weekdayProvided !== weekdayActual) {
                getParsingFlags(config).weekdayMismatch = true;
                config._isValid = false;
                return false;
            }
        }
        return true;
    }

    function calculateOffset(obsOffset, militaryOffset, numOffset) {
        if (obsOffset) {
            return obsOffsets[obsOffset];
        } else if (militaryOffset) {
            // the only allowed military tz is Z
            return 0;
        } else {
            var hm = parseInt(numOffset, 10),
                m = hm % 100,
                h = (hm - m) / 100;
            return h * 60 + m;
        }
    }

    // date and time from ref 2822 format
    function configFromRFC2822(config) {
        var match = rfc2822.exec(preprocessRFC2822(config._i)),
            parsedArray;
        if (match) {
            parsedArray = extractFromRFC2822Strings(
                match[4],
                match[3],
                match[2],
                match[5],
                match[6],
                match[7]
            );
            if (!checkWeekday(match[1], parsedArray, config)) {
                return;
            }

            config._a = parsedArray;
            config._tzm = calculateOffset(match[8], match[9], match[10]);

            config._d = createUTCDate.apply(null, config._a);
            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);

            getParsingFlags(config).rfc2822 = true;
        } else {
            config._isValid = false;
        }
    }

    // date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict
    function configFromString(config) {
        var matched = aspNetJsonRegex.exec(config._i);
        if (matched !== null) {
            config._d = new Date(+matched[1]);
            return;
        }

        configFromISO(config);
        if (config._isValid === false) {
            delete config._isValid;
        } else {
            return;
        }

        configFromRFC2822(config);
        if (config._isValid === false) {
            delete config._isValid;
        } else {
            return;
        }

        if (config._strict) {
            config._isValid = false;
        } else {
            // Final attempt, use Input Fallback
            hooks.createFromInputFallback(config);
        }
    }

    hooks.createFromInputFallback = deprecate(
        'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +
            'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +
            'discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.',
        function (config) {
            config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
        }
    );

    // Pick the first defined of two or three arguments.
    function defaults(a, b, c) {
        if (a != null) {
            return a;
        }
        if (b != null) {
            return b;
        }
        return c;
    }

    function currentDateArray(config) {
        // hooks is actually the exported moment object
        var nowValue = new Date(hooks.now());
        if (config._useUTC) {
            return [
                nowValue.getUTCFullYear(),
                nowValue.getUTCMonth(),
                nowValue.getUTCDate(),
            ];
        }
        return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];
    }

    // convert an array to a date.
    // the array should mirror the parameters below
    // note: all values past the year are optional and will default to the lowest possible value.
    // [year, month, day , hour, minute, second, millisecond]
    function configFromArray(config) {
        var i,
            date,
            input = [],
            currentDate,
            expectedWeekday,
            yearToUse;

        if (config._d) {
            return;
        }

        currentDate = currentDateArray(config);

        //compute day of the year from weeks and weekdays
        if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
            dayOfYearFromWeekInfo(config);
        }

        //if the day of the year is set, figure out what it is
        if (config._dayOfYear != null) {
            yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);

            if (
                config._dayOfYear > daysInYear(yearToUse) ||
                config._dayOfYear === 0
            ) {
                getParsingFlags(config)._overflowDayOfYear = true;
            }

            date = createUTCDate(yearToUse, 0, config._dayOfYear);
            config._a[MONTH] = date.getUTCMonth();
            config._a[DATE] = date.getUTCDate();
        }

        // Default to current date.
        // * if no year, month, day of month are given, default to today
        // * if day of month is given, default month and year
        // * if month is given, default only year
        // * if year is given, don't default anything
        for (i = 0; i < 3 && config._a[i] == null; ++i) {
            config._a[i] = input[i] = currentDate[i];
        }

        // Zero out whatever was not defaulted, including time
        for (; i < 7; i++) {
            config._a[i] = input[i] =
                config._a[i] == null ? (i === 2 ? 1 : 0) : config._a[i];
        }

        // Check for 24:00:00.000
        if (
            config._a[HOUR] === 24 &&
            config._a[MINUTE] === 0 &&
            config._a[SECOND] === 0 &&
            config._a[MILLISECOND] === 0
        ) {
            config._nextDay = true;
            config._a[HOUR] = 0;
        }

        config._d = (config._useUTC ? createUTCDate : createDate).apply(
            null,
            input
        );
        expectedWeekday = config._useUTC
            ? config._d.getUTCDay()
            : config._d.getDay();

        // Apply timezone offset from input. The actual utcOffset can be changed
        // with parseZone.
        if (config._tzm != null) {
            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
        }

        if (config._nextDay) {
            config._a[HOUR] = 24;
        }

        // check for mismatching day of week
        if (
            config._w &&
            typeof config._w.d !== 'undefined' &&
            config._w.d !== expectedWeekday
        ) {
            getParsingFlags(config).weekdayMismatch = true;
        }
    }

    function dayOfYearFromWeekInfo(config) {
        var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek;

        w = config._w;
        if (w.GG != null || w.W != null || w.E != null) {
            dow = 1;
            doy = 4;

            // TODO: We need to take the current isoWeekYear, but that depends on
            // how we interpret now (local, utc, fixed offset). So create
            // a now version of current config (take local/utc/offset flags, and
            // create now).
            weekYear = defaults(
                w.GG,
                config._a[YEAR],
                weekOfYear(createLocal(), 1, 4).year
            );
            week = defaults(w.W, 1);
            weekday = defaults(w.E, 1);
            if (weekday < 1 || weekday > 7) {
                weekdayOverflow = true;
            }
        } else {
            dow = config._locale._week.dow;
            doy = config._locale._week.doy;

            curWeek = weekOfYear(createLocal(), dow, doy);

            weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);

            // Default to current week.
            week = defaults(w.w, curWeek.week);

            if (w.d != null) {
                // weekday -- low day numbers are considered next week
                weekday = w.d;
                if (weekday < 0 || weekday > 6) {
                    weekdayOverflow = true;
                }
            } else if (w.e != null) {
                // local weekday -- counting starts from beginning of week
                weekday = w.e + dow;
                if (w.e < 0 || w.e > 6) {
                    weekdayOverflow = true;
                }
            } else {
                // default to beginning of week
                weekday = dow;
            }
        }
        if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {
            getParsingFlags(config)._overflowWeeks = true;
        } else if (weekdayOverflow != null) {
            getParsingFlags(config)._overflowWeekday = true;
        } else {
            temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);
            config._a[YEAR] = temp.year;
            config._dayOfYear = temp.dayOfYear;
        }
    }

    // constant that refers to the ISO standard
    hooks.ISO_8601 = function () {};

    // constant that refers to the RFC 2822 form
    hooks.RFC_2822 = function () {};

    // date from string and format string
    function configFromStringAndFormat(config) {
        // TODO: Move this to another part of the creation flow to prevent circular deps
        if (config._f === hooks.ISO_8601) {
            configFromISO(config);
            return;
        }
        if (config._f === hooks.RFC_2822) {
            configFromRFC2822(config);
            return;
        }
        config._a = [];
        getParsingFlags(config).empty = true;

        // This array is used to make a Date, either with `new Date` or `Date.UTC`
        var string = '' + config._i,
            i,
            parsedInput,
            tokens,
            token,
            skipped,
            stringLength = string.length,
            totalParsedInputLength = 0,
            era,
            tokenLen;

        tokens =
            expandFormat(config._f, config._locale).match(formattingTokens) || [];
        tokenLen = tokens.length;
        for (i = 0; i < tokenLen; i++) {
            token = tokens[i];
            parsedInput = (string.match(getParseRegexForToken(token, config)) ||
                [])[0];
            if (parsedInput) {
                skipped = string.substr(0, string.indexOf(parsedInput));
                if (skipped.length > 0) {
                    getParsingFlags(config).unusedInput.push(skipped);
                }
                string = string.slice(
                    string.indexOf(parsedInput) + parsedInput.length
                );
                totalParsedInputLength += parsedInput.length;
            }
            // don't parse if it's not a known token
            if (formatTokenFunctions[token]) {
                if (parsedInput) {
                    getParsingFlags(config).empty = false;
                } else {
                    getParsingFlags(config).unusedTokens.push(token);
                }
                addTimeToArrayFromToken(token, parsedInput, config);
            } else if (config._strict && !parsedInput) {
                getParsingFlags(config).unusedTokens.push(token);
            }
        }

        // add remaining unparsed input length to the string
        getParsingFlags(config).charsLeftOver =
            stringLength - totalParsedInputLength;
        if (string.length > 0) {
            getParsingFlags(config).unusedInput.push(string);
        }

        // clear _12h flag if hour is <= 12
        if (
            config._a[HOUR] <= 12 &&
            getParsingFlags(config).bigHour === true &&
            config._a[HOUR] > 0
        ) {
            getParsingFlags(config).bigHour = undefined;
        }

        getParsingFlags(config).parsedDateParts = config._a.slice(0);
        getParsingFlags(config).meridiem = config._meridiem;
        // handle meridiem
        config._a[HOUR] = meridiemFixWrap(
            config._locale,
            config._a[HOUR],
            config._meridiem
        );

        // handle era
        era = getParsingFlags(config).era;
        if (era !== null) {
            config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]);
        }

        configFromArray(config);
        checkOverflow(config);
    }

    function meridiemFixWrap(locale, hour, meridiem) {
        var isPm;

        if (meridiem == null) {
            // nothing to do
            return hour;
        }
        if (locale.meridiemHour != null) {
            return locale.meridiemHour(hour, meridiem);
        } else if (locale.isPM != null) {
            // Fallback
            isPm = locale.isPM(meridiem);
            if (isPm && hour < 12) {
                hour += 12;
            }
            if (!isPm && hour === 12) {
                hour = 0;
            }
            return hour;
        } else {
            // this is not supposed to happen
            return hour;
        }
    }

    // date from string and array of format strings
    function configFromStringAndArray(config) {
        var tempConfig,
            bestMoment,
            scoreToBeat,
            i,
            currentScore,
            validFormatFound,
            bestFormatIsValid = false,
            configfLen = config._f.length;

        if (configfLen === 0) {
            getParsingFlags(config).invalidFormat = true;
            config._d = new Date(NaN);
            return;
        }

        for (i = 0; i < configfLen; i++) {
            currentScore = 0;
            validFormatFound = false;
            tempConfig = copyConfig({}, config);
            if (config._useUTC != null) {
                tempConfig._useUTC = config._useUTC;
            }
            tempConfig._f = config._f[i];
            configFromStringAndFormat(tempConfig);

            if (isValid(tempConfig)) {
                validFormatFound = true;
            }

            // if there is any input that was not parsed add a penalty for that format
            currentScore += getParsingFlags(tempConfig).charsLeftOver;

            //or tokens
            currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;

            getParsingFlags(tempConfig).score = currentScore;

            if (!bestFormatIsValid) {
                if (
                    scoreToBeat == null ||
                    currentScore < scoreToBeat ||
                    validFormatFound
                ) {
                    scoreToBeat = currentScore;
                    bestMoment = tempConfig;
                    if (validFormatFound) {
                        bestFormatIsValid = true;
                    }
                }
            } else {
                if (currentScore < scoreToBeat) {
                    scoreToBeat = currentScore;
                    bestMoment = tempConfig;
                }
            }
        }

        extend(config, bestMoment || tempConfig);
    }

    function configFromObject(config) {
        if (config._d) {
            return;
        }

        var i = normalizeObjectUnits(config._i),
            dayOrDate = i.day === undefined ? i.date : i.day;
        config._a = map(
            [i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond],
            function (obj) {
                return obj && parseInt(obj, 10);
            }
        );

        configFromArray(config);
    }

    function createFromConfig(config) {
        var res = new Moment(checkOverflow(prepareConfig(config)));
        if (res._nextDay) {
            // Adding is smart enough around DST
            res.add(1, 'd');
            res._nextDay = undefined;
        }

        return res;
    }

    function prepareConfig(config) {
        var input = config._i,
            format = config._f;

        config._locale = config._locale || getLocale(config._l);

        if (input === null || (format === undefined && input === '')) {
            return createInvalid({ nullInput: true });
        }

        if (typeof input === 'string') {
            config._i = input = config._locale.preparse(input);
        }

        if (isMoment(input)) {
            return new Moment(checkOverflow(input));
        } else if (isDate(input)) {
            config._d = input;
        } else if (isArray(format)) {
            configFromStringAndArray(config);
        } else if (format) {
            configFromStringAndFormat(config);
        } else {
            configFromInput(config);
        }

        if (!isValid(config)) {
            config._d = null;
        }

        return config;
    }

    function configFromInput(config) {
        var input = config._i;
        if (isUndefined(input)) {
            config._d = new Date(hooks.now());
        } else if (isDate(input)) {
            config._d = new Date(input.valueOf());
        } else if (typeof input === 'string') {
            configFromString(config);
        } else if (isArray(input)) {
            config._a = map(input.slice(0), function (obj) {
                return parseInt(obj, 10);
            });
            configFromArray(config);
        } else if (isObject(input)) {
            configFromObject(config);
        } else if (isNumber(input)) {
            // from milliseconds
            config._d = new Date(input);
        } else {
            hooks.createFromInputFallback(config);
        }
    }

    function createLocalOrUTC(input, format, locale, strict, isUTC) {
        var c = {};

        if (format === true || format === false) {
            strict = format;
            format = undefined;
        }

        if (locale === true || locale === false) {
            strict = locale;
            locale = undefined;
        }

        if (
            (isObject(input) && isObjectEmpty(input)) ||
            (isArray(input) && input.length === 0)
        ) {
            input = undefined;
        }
        // object construction must be done this way.
        // https://github.com/moment/moment/issues/1423
        c._isAMomentObject = true;
        c._useUTC = c._isUTC = isUTC;
        c._l = locale;
        c._i = input;
        c._f = format;
        c._strict = strict;

        return createFromConfig(c);
    }

    function createLocal(input, format, locale, strict) {
        return createLocalOrUTC(input, format, locale, strict, false);
    }

    var prototypeMin = deprecate(
            'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',
            function () {
                var other = createLocal.apply(null, arguments);
                if (this.isValid() && other.isValid()) {
                    return other < this ? this : other;
                } else {
                    return createInvalid();
                }
            }
        ),
        prototypeMax = deprecate(
            'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',
            function () {
                var other = createLocal.apply(null, arguments);
                if (this.isValid() && other.isValid()) {
                    return other > this ? this : other;
                } else {
                    return createInvalid();
                }
            }
        );

    // Pick a moment m from moments so that m[fn](other) is true for all
    // other. This relies on the function fn to be transitive.
    //
    // moments should either be an array of moment objects or an array, whose
    // first element is an array of moment objects.
    function pickBy(fn, moments) {
        var res, i;
        if (moments.length === 1 && isArray(moments[0])) {
            moments = moments[0];
        }
        if (!moments.length) {
            return createLocal();
        }
        res = moments[0];
        for (i = 1; i < moments.length; ++i) {
            if (!moments[i].isValid() || moments[i][fn](res)) {
                res = moments[i];
            }
        }
        return res;
    }

    // TODO: Use [].sort instead?
    function min() {
        var args = [].slice.call(arguments, 0);

        return pickBy('isBefore', args);
    }

    function max() {
        var args = [].slice.call(arguments, 0);

        return pickBy('isAfter', args);
    }

    var now = function () {
        return Date.now ? Date.now() : +new Date();
    };

    var ordering = [
        'year',
        'quarter',
        'month',
        'week',
        'day',
        'hour',
        'minute',
        'second',
        'millisecond',
    ];

    function isDurationValid(m) {
        var key,
            unitHasDecimal = false,
            i,
            orderLen = ordering.length;
        for (key in m) {
            if (
                hasOwnProp(m, key) &&
                !(
                    indexOf.call(ordering, key) !== -1 &&
                    (m[key] == null || !isNaN(m[key]))
                )
            ) {
                return false;
            }
        }

        for (i = 0; i < orderLen; ++i) {
            if (m[ordering[i]]) {
                if (unitHasDecimal) {
                    return false; // only allow non-integers for smallest unit
                }
                if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {
                    unitHasDecimal = true;
                }
            }
        }

        return true;
    }

    function isValid$1() {
        return this._isValid;
    }

    function createInvalid$1() {
        return createDuration(NaN);
    }

    function Duration(duration) {
        var normalizedInput = normalizeObjectUnits(duration),
            years = normalizedInput.year || 0,
            quarters = normalizedInput.quarter || 0,
            months = normalizedInput.month || 0,
            weeks = normalizedInput.week || normalizedInput.isoWeek || 0,
            days = normalizedInput.day || 0,
            hours = normalizedInput.hour || 0,
            minutes = normalizedInput.minute || 0,
            seconds = normalizedInput.second || 0,
            milliseconds = normalizedInput.millisecond || 0;

        this._isValid = isDurationValid(normalizedInput);

        // representation for dateAddRemove
        this._milliseconds =
            +milliseconds +
            seconds * 1e3 + // 1000
            minutes * 6e4 + // 1000 * 60
            hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
        // Because of dateAddRemove treats 24 hours as different from a
        // day when working around DST, we need to store them separately
        this._days = +days + weeks * 7;
        // It is impossible to translate months into days without knowing
        // which months you are are talking about, so we have to store
        // it separately.
        this._months = +months + quarters * 3 + years * 12;

        this._data = {};

        this._locale = getLocale();

        this._bubble();
    }

    function isDuration(obj) {
        return obj instanceof Duration;
    }

    function absRound(number) {
        if (number < 0) {
            return Math.round(-1 * number) * -1;
        } else {
            return Math.round(number);
        }
    }

    // compare two arrays, return the number of differences
    function compareArrays(array1, array2, dontConvert) {
        var len = Math.min(array1.length, array2.length),
            lengthDiff = Math.abs(array1.length - array2.length),
            diffs = 0,
            i;
        for (i = 0; i < len; i++) {
            if (
                (dontConvert && array1[i] !== array2[i]) ||
                (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))
            ) {
                diffs++;
            }
        }
        return diffs + lengthDiff;
    }

    // FORMATTING

    function offset(token, separator) {
        addFormatToken(token, 0, 0, function () {
            var offset = this.utcOffset(),
                sign = '+';
            if (offset < 0) {
                offset = -offset;
                sign = '-';
            }
            return (
                sign +
                zeroFill(~~(offset / 60), 2) +
                separator +
                zeroFill(~~offset % 60, 2)
            );
        });
    }

    offset('Z', ':');
    offset('ZZ', '');

    // PARSING

    addRegexToken('Z', matchShortOffset);
    addRegexToken('ZZ', matchShortOffset);
    addParseToken(['Z', 'ZZ'], function (input, array, config) {
        config._useUTC = true;
        config._tzm = offsetFromString(matchShortOffset, input);
    });

    // HELPERS

    // timezone chunker
    // '+10:00' > ['10',  '00']
    // '-1530'  > ['-15', '30']
    var chunkOffset = /([\+\-]|\d\d)/gi;

    function offsetFromString(matcher, string) {
        var matches = (string || '').match(matcher),
            chunk,
            parts,
            minutes;

        if (matches === null) {
            return null;
        }

        chunk = matches[matches.length - 1] || [];
        parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];
        minutes = +(parts[1] * 60) + toInt(parts[2]);

        return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes;
    }

    // Return a moment from input, that is local/utc/zone equivalent to model.
    function cloneWithOffset(input, model) {
        var res, diff;
        if (model._isUTC) {
            res = model.clone();
            diff =
                (isMoment(input) || isDate(input)
                    ? input.valueOf()
                    : createLocal(input).valueOf()) - res.valueOf();
            // Use low-level api, because this fn is low-level api.
            res._d.setTime(res._d.valueOf() + diff);
            hooks.updateOffset(res, false);
            return res;
        } else {
            return createLocal(input).local();
        }
    }

    function getDateOffset(m) {
        // On Firefox.24 Date#getTimezoneOffset returns a floating point.
        // https://github.com/moment/moment/pull/1871
        return -Math.round(m._d.getTimezoneOffset());
    }

    // HOOKS

    // This function will be called whenever a moment is mutated.
    // It is intended to keep the offset in sync with the timezone.
    hooks.updateOffset = function () {};

    // MOMENTS

    // keepLocalTime = true means only change the timezone, without
    // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
    // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
    // +0200, so we adjust the time as needed, to be valid.
    //
    // Keeping the time actually adds/subtracts (one hour)
    // from the actual represented time. That is why we call updateOffset
    // a second time. In case it wants us to change the offset again
    // _changeInProgress == true case, then we have to adjust, because
    // there is no such time in the given timezone.
    function getSetOffset(input, keepLocalTime, keepMinutes) {
        var offset = this._offset || 0,
            localAdjust;
        if (!this.isValid()) {
            return input != null ? this : NaN;
        }
        if (input != null) {
            if (typeof input === 'string') {
                input = offsetFromString(matchShortOffset, input);
                if (input === null) {
                    return this;
                }
            } else if (Math.abs(input) < 16 && !keepMinutes) {
                input = input * 60;
            }
            if (!this._isUTC && keepLocalTime) {
                localAdjust = getDateOffset(this);
            }
            this._offset = input;
            this._isUTC = true;
            if (localAdjust != null) {
                this.add(localAdjust, 'm');
            }
            if (offset !== input) {
                if (!keepLocalTime || this._changeInProgress) {
                    addSubtract(
                        this,
                        createDuration(input - offset, 'm'),
                        1,
                        false
                    );
                } else if (!this._changeInProgress) {
                    this._changeInProgress = true;
                    hooks.updateOffset(this, true);
                    this._changeInProgress = null;
                }
            }
            return this;
        } else {
            return this._isUTC ? offset : getDateOffset(this);
        }
    }

    function getSetZone(input, keepLocalTime) {
        if (input != null) {
            if (typeof input !== 'string') {
                input = -input;
            }

            this.utcOffset(input, keepLocalTime);

            return this;
        } else {
            return -this.utcOffset();
        }
    }

    function setOffsetToUTC(keepLocalTime) {
        return this.utcOffset(0, keepLocalTime);
    }

    function setOffsetToLocal(keepLocalTime) {
        if (this._isUTC) {
            this.utcOffset(0, keepLocalTime);
            this._isUTC = false;

            if (keepLocalTime) {
                this.subtract(getDateOffset(this), 'm');
            }
        }
        return this;
    }

    function setOffsetToParsedOffset() {
        if (this._tzm != null) {
            this.utcOffset(this._tzm, false, true);
        } else if (typeof this._i === 'string') {
            var tZone = offsetFromString(matchOffset, this._i);
            if (tZone != null) {
                this.utcOffset(tZone);
            } else {
                this.utcOffset(0, true);
            }
        }
        return this;
    }

    function hasAlignedHourOffset(input) {
        if (!this.isValid()) {
            return false;
        }
        input = input ? createLocal(input).utcOffset() : 0;

        return (this.utcOffset() - input) % 60 === 0;
    }

    function isDaylightSavingTime() {
        return (
            this.utcOffset() > this.clone().month(0).utcOffset() ||
            this.utcOffset() > this.clone().month(5).utcOffset()
        );
    }

    function isDaylightSavingTimeShifted() {
        if (!isUndefined(this._isDSTShifted)) {
            return this._isDSTShifted;
        }

        var c = {},
            other;

        copyConfig(c, this);
        c = prepareConfig(c);

        if (c._a) {
            other = c._isUTC ? createUTC(c._a) : createLocal(c._a);
            this._isDSTShifted =
                this.isValid() && compareArrays(c._a, other.toArray()) > 0;
        } else {
            this._isDSTShifted = false;
        }

        return this._isDSTShifted;
    }

    function isLocal() {
        return this.isValid() ? !this._isUTC : false;
    }

    function isUtcOffset() {
        return this.isValid() ? this._isUTC : false;
    }

    function isUtc() {
        return this.isValid() ? this._isUTC && this._offset === 0 : false;
    }

    // ASP.NET json date format regex
    var aspNetRegex = /^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,
        // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
        // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
        // and further modified to allow for strings containing both week and day
        isoRegex =
            /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;

    function createDuration(input, key) {
        var duration = input,
            // matching against regexp is expensive, do it on demand
            match = null,
            sign,
            ret,
            diffRes;

        if (isDuration(input)) {
            duration = {
                ms: input._milliseconds,
                d: input._days,
                M: input._months,
            };
        } else if (isNumber(input) || !isNaN(+input)) {
            duration = {};
            if (key) {
                duration[key] = +input;
            } else {
                duration.milliseconds = +input;
            }
        } else if ((match = aspNetRegex.exec(input))) {
            sign = match[1] === '-' ? -1 : 1;
            duration = {
                y: 0,
                d: toInt(match[DATE]) * sign,
                h: toInt(match[HOUR]) * sign,
                m: toInt(match[MINUTE]) * sign,
                s: toInt(match[SECOND]) * sign,
                ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign, // the millisecond decimal point is included in the match
            };
        } else if ((match = isoRegex.exec(input))) {
            sign = match[1] === '-' ? -1 : 1;
            duration = {
                y: parseIso(match[2], sign),
                M: parseIso(match[3], sign),
                w: parseIso(match[4], sign),
                d: parseIso(match[5], sign),
                h: parseIso(match[6], sign),
                m: parseIso(match[7], sign),
                s: parseIso(match[8], sign),
            };
        } else if (duration == null) {
            // checks for null or undefined
            duration = {};
        } else if (
            typeof duration === 'object' &&
            ('from' in duration || 'to' in duration)
        ) {
            diffRes = momentsDifference(
                createLocal(duration.from),
                createLocal(duration.to)
            );

            duration = {};
            duration.ms = diffRes.milliseconds;
            duration.M = diffRes.months;
        }

        ret = new Duration(duration);

        if (isDuration(input) && hasOwnProp(input, '_locale')) {
            ret._locale = input._locale;
        }

        if (isDuration(input) && hasOwnProp(input, '_isValid')) {
            ret._isValid = input._isValid;
        }

        return ret;
    }

    createDuration.fn = Duration.prototype;
    createDuration.invalid = createInvalid$1;

    function parseIso(inp, sign) {
        // We'd normally use ~~inp for this, but unfortunately it also
        // converts floats to ints.
        // inp may be undefined, so careful calling replace on it.
        var res = inp && parseFloat(inp.replace(',', '.'));
        // apply sign while we're at it
        return (isNaN(res) ? 0 : res) * sign;
    }

    function positiveMomentsDifference(base, other) {
        var res = {};

        res.months =
            other.month() - base.month() + (other.year() - base.year()) * 12;
        if (base.clone().add(res.months, 'M').isAfter(other)) {
            --res.months;
        }

        res.milliseconds = +other - +base.clone().add(res.months, 'M');

        return res;
    }

    function momentsDifference(base, other) {
        var res;
        if (!(base.isValid() && other.isValid())) {
            return { milliseconds: 0, months: 0 };
        }

        other = cloneWithOffset(other, base);
        if (base.isBefore(other)) {
            res = positiveMomentsDifference(base, other);
        } else {
            res = positiveMomentsDifference(other, base);
            res.milliseconds = -res.milliseconds;
            res.months = -res.months;
        }

        return res;
    }

    // TODO: remove 'name' arg after deprecation is removed
    function createAdder(direction, name) {
        return function (val, period) {
            var dur, tmp;
            //invert the arguments, but complain about it
            if (period !== null && !isNaN(+period)) {
                deprecateSimple(
                    name,
                    'moment().' +
                        name +
                        '(period, number) is deprecated. Please use moment().' +
                        name +
                        '(number, period). ' +
                        'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'
                );
                tmp = val;
                val = period;
                period = tmp;
            }

            dur = createDuration(val, period);
            addSubtract(this, dur, direction);
            return this;
        };
    }

    function addSubtract(mom, duration, isAdding, updateOffset) {
        var milliseconds = duration._milliseconds,
            days = absRound(duration._days),
            months = absRound(duration._months);

        if (!mom.isValid()) {
            // No op
            return;
        }

        updateOffset = updateOffset == null ? true : updateOffset;

        if (months) {
            setMonth(mom, get(mom, 'Month') + months * isAdding);
        }
        if (days) {
            set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);
        }
        if (milliseconds) {
            mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
        }
        if (updateOffset) {
            hooks.updateOffset(mom, days || months);
        }
    }

    var add = createAdder(1, 'add'),
        subtract = createAdder(-1, 'subtract');

    function isString(input) {
        return typeof input === 'string' || input instanceof String;
    }

    // type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined
    function isMomentInput(input) {
        return (
            isMoment(input) ||
            isDate(input) ||
            isString(input) ||
            isNumber(input) ||
            isNumberOrStringArray(input) ||
            isMomentInputObject(input) ||
            input === null ||
            input === undefined
        );
    }

    function isMomentInputObject(input) {
        var objectTest = isObject(input) && !isObjectEmpty(input),
            propertyTest = false,
            properties = [
                'years',
                'year',
                'y',
                'months',
                'month',
                'M',
                'days',
                'day',
                'd',
                'dates',
                'date',
                'D',
                'hours',
                'hour',
                'h',
                'minutes',
                'minute',
                'm',
                'seconds',
                'second',
                's',
                'milliseconds',
                'millisecond',
                'ms',
            ],
            i,
            property,
            propertyLen = properties.length;

        for (i = 0; i < propertyLen; i += 1) {
            property = properties[i];
            propertyTest = propertyTest || hasOwnProp(input, property);
        }

        return objectTest && propertyTest;
    }

    function isNumberOrStringArray(input) {
        var arrayTest = isArray(input),
            dataTypeTest = false;
        if (arrayTest) {
            dataTypeTest =
                input.filter(function (item) {
                    return !isNumber(item) && isString(input);
                }).length === 0;
        }
        return arrayTest && dataTypeTest;
    }

    function isCalendarSpec(input) {
        var objectTest = isObject(input) && !isObjectEmpty(input),
            propertyTest = false,
            properties = [
                'sameDay',
                'nextDay',
                'lastDay',
                'nextWeek',
                'lastWeek',
                'sameElse',
            ],
            i,
            property;

        for (i = 0; i < properties.length; i += 1) {
            property = properties[i];
            propertyTest = propertyTest || hasOwnProp(input, property);
        }

        return objectTest && propertyTest;
    }

    function getCalendarFormat(myMoment, now) {
        var diff = myMoment.diff(now, 'days', true);
        return diff < -6
            ? 'sameElse'
            : diff < -1
            ? 'lastWeek'
            : diff < 0
            ? 'lastDay'
            : diff < 1
            ? 'sameDay'
            : diff < 2
            ? 'nextDay'
            : diff < 7
            ? 'nextWeek'
            : 'sameElse';
    }

    function calendar$1(time, formats) {
        // Support for single parameter, formats only overload to the calendar function
        if (arguments.length === 1) {
            if (!arguments[0]) {
                time = undefined;
                formats = undefined;
            } else if (isMomentInput(arguments[0])) {
                time = arguments[0];
                formats = undefined;
            } else if (isCalendarSpec(arguments[0])) {
                formats = arguments[0];
                time = undefined;
            }
        }
        // We want to compare the start of today, vs this.
        // Getting start-of-today depends on whether we're local/utc/offset or not.
        var now = time || createLocal(),
            sod = cloneWithOffset(now, this).startOf('day'),
            format = hooks.calendarFormat(this, sod) || 'sameElse',
            output =
                formats &&
                (isFunction(formats[format])
                    ? formats[format].call(this, now)
                    : formats[format]);

        return this.format(
            output || this.localeData().calendar(format, this, createLocal(now))
        );
    }

    function clone() {
        return new Moment(this);
    }

    function isAfter(input, units) {
        var localInput = isMoment(input) ? input : createLocal(input);
        if (!(this.isValid() && localInput.isValid())) {
            return false;
        }
        units = normalizeUnits(units) || 'millisecond';
        if (units === 'millisecond') {
            return this.valueOf() > localInput.valueOf();
        } else {
            return localInput.valueOf() < this.clone().startOf(units).valueOf();
        }
    }

    function isBefore(input, units) {
        var localInput = isMoment(input) ? input : createLocal(input);
        if (!(this.isValid() && localInput.isValid())) {
            return false;
        }
        units = normalizeUnits(units) || 'millisecond';
        if (units === 'millisecond') {
            return this.valueOf() < localInput.valueOf();
        } else {
            return this.clone().endOf(units).valueOf() < localInput.valueOf();
        }
    }

    function isBetween(from, to, units, inclusivity) {
        var localFrom = isMoment(from) ? from : createLocal(from),
            localTo = isMoment(to) ? to : createLocal(to);
        if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) {
            return false;
        }
        inclusivity = inclusivity || '()';
        return (
            (inclusivity[0] === '('
                ? this.isAfter(localFrom, units)
                : !this.isBefore(localFrom, units)) &&
            (inclusivity[1] === ')'
                ? this.isBefore(localTo, units)
                : !this.isAfter(localTo, units))
        );
    }

    function isSame(input, units) {
        var localInput = isMoment(input) ? input : createLocal(input),
            inputMs;
        if (!(this.isValid() && localInput.isValid())) {
            return false;
        }
        units = normalizeUnits(units) || 'millisecond';
        if (units === 'millisecond') {
            return this.valueOf() === localInput.valueOf();
        } else {
            inputMs = localInput.valueOf();
            return (
                this.clone().startOf(units).valueOf() <= inputMs &&
                inputMs <= this.clone().endOf(units).valueOf()
            );
        }
    }

    function isSameOrAfter(input, units) {
        return this.isSame(input, units) || this.isAfter(input, units);
    }

    function isSameOrBefore(input, units) {
        return this.isSame(input, units) || this.isBefore(input, units);
    }

    function diff(input, units, asFloat) {
        var that, zoneDelta, output;

        if (!this.isValid()) {
            return NaN;
        }

        that = cloneWithOffset(input, this);

        if (!that.isValid()) {
            return NaN;
        }

        zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;

        units = normalizeUnits(units);

        switch (units) {
            case 'year':
                output = monthDiff(this, that) / 12;
                break;
            case 'month':
                output = monthDiff(this, that);
                break;
            case 'quarter':
                output = monthDiff(this, that) / 3;
                break;
            case 'second':
                output = (this - that) / 1e3;
                break; // 1000
            case 'minute':
                output = (this - that) / 6e4;
                break; // 1000 * 60
            case 'hour':
                output = (this - that) / 36e5;
                break; // 1000 * 60 * 60
            case 'day':
                output = (this - that - zoneDelta) / 864e5;
                break; // 1000 * 60 * 60 * 24, negate dst
            case 'week':
                output = (this - that - zoneDelta) / 6048e5;
                break; // 1000 * 60 * 60 * 24 * 7, negate dst
            default:
                output = this - that;
        }

        return asFloat ? output : absFloor(output);
    }

    function monthDiff(a, b) {
        if (a.date() < b.date()) {
            // end-of-month calculations work correct when the start month has more
            // days than the end month.
            return -monthDiff(b, a);
        }
        // difference in months
        var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()),
            // b is in (anchor - 1 month, anchor + 1 month)
            anchor = a.clone().add(wholeMonthDiff, 'months'),
            anchor2,
            adjust;

        if (b - anchor < 0) {
            anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
            // linear across the month
            adjust = (b - anchor) / (anchor - anchor2);
        } else {
            anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
            // linear across the month
            adjust = (b - anchor) / (anchor2 - anchor);
        }

        //check for negative zero, return zero if negative zero
        return -(wholeMonthDiff + adjust) || 0;
    }

    hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
    hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';

    function toString() {
        return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
    }

    function toISOString(keepOffset) {
        if (!this.isValid()) {
            return null;
        }
        var utc = keepOffset !== true,
            m = utc ? this.clone().utc() : this;
        if (m.year() < 0 || m.year() > 9999) {
            return formatMoment(
                m,
                utc
                    ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'
                    : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'
            );
        }
        if (isFunction(Date.prototype.toISOString)) {
            // native implementation is ~50x faster, use it when we can
            if (utc) {
                return this.toDate().toISOString();
            } else {
                return new Date(this.valueOf() + this.utcOffset() * 60 * 1000)
                    .toISOString()
                    .replace('Z', formatMoment(m, 'Z'));
            }
        }
        return formatMoment(
            m,
            utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'
        );
    }

    /**
     * Return a human readable representation of a moment that can
     * also be evaluated to get a new moment which is the same
     *
     * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects
     */
    function inspect() {
        if (!this.isValid()) {
            return 'moment.invalid(/* ' + this._i + ' */)';
        }
        var func = 'moment',
            zone = '',
            prefix,
            year,
            datetime,
            suffix;
        if (!this.isLocal()) {
            func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';
            zone = 'Z';
        }
        prefix = '[' + func + '("]';
        year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY';
        datetime = '-MM-DD[T]HH:mm:ss.SSS';
        suffix = zone + '[")]';

        return this.format(prefix + year + datetime + suffix);
    }

    function format(inputString) {
        if (!inputString) {
            inputString = this.isUtc()
                ? hooks.defaultFormatUtc
                : hooks.defaultFormat;
        }
        var output = formatMoment(this, inputString);
        return this.localeData().postformat(output);
    }

    function from(time, withoutSuffix) {
        if (
            this.isValid() &&
            ((isMoment(time) && time.isValid()) || createLocal(time).isValid())
        ) {
            return createDuration({ to: this, from: time })
                .locale(this.locale())
                .humanize(!withoutSuffix);
        } else {
            return this.localeData().invalidDate();
        }
    }

    function fromNow(withoutSuffix) {
        return this.from(createLocal(), withoutSuffix);
    }

    function to(time, withoutSuffix) {
        if (
            this.isValid() &&
            ((isMoment(time) && time.isValid()) || createLocal(time).isValid())
        ) {
            return createDuration({ from: this, to: time })
                .locale(this.locale())
                .humanize(!withoutSuffix);
        } else {
            return this.localeData().invalidDate();
        }
    }

    function toNow(withoutSuffix) {
        return this.to(createLocal(), withoutSuffix);
    }

    // If passed a locale key, it will set the locale for this
    // instance.  Otherwise, it will return the locale configuration
    // variables for this instance.
    function locale(key) {
        var newLocaleData;

        if (key === undefined) {
            return this._locale._abbr;
        } else {
            newLocaleData = getLocale(key);
            if (newLocaleData != null) {
                this._locale = newLocaleData;
            }
            return this;
        }
    }

    var lang = deprecate(
        'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
        function (key) {
            if (key === undefined) {
                return this.localeData();
            } else {
                return this.locale(key);
            }
        }
    );

    function localeData() {
        return this._locale;
    }

    var MS_PER_SECOND = 1000,
        MS_PER_MINUTE = 60 * MS_PER_SECOND,
        MS_PER_HOUR = 60 * MS_PER_MINUTE,
        MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR;

    // actual modulo - handles negative numbers (for dates before 1970):
    function mod$1(dividend, divisor) {
        return ((dividend % divisor) + divisor) % divisor;
    }

    function localStartOfDate(y, m, d) {
        // the date constructor remaps years 0-99 to 1900-1999
        if (y < 100 && y >= 0) {
            // preserve leap years using a full 400 year cycle, then reset
            return new Date(y + 400, m, d) - MS_PER_400_YEARS;
        } else {
            return new Date(y, m, d).valueOf();
        }
    }

    function utcStartOfDate(y, m, d) {
        // Date.UTC remaps years 0-99 to 1900-1999
        if (y < 100 && y >= 0) {
            // preserve leap years using a full 400 year cycle, then reset
            return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS;
        } else {
            return Date.UTC(y, m, d);
        }
    }

    function startOf(units) {
        var time, startOfDate;
        units = normalizeUnits(units);
        if (units === undefined || units === 'millisecond' || !this.isValid()) {
            return this;
        }

        startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;

        switch (units) {
            case 'year':
                time = startOfDate(this.year(), 0, 1);
                break;
            case 'quarter':
                time = startOfDate(
                    this.year(),
                    this.month() - (this.month() % 3),
                    1
                );
                break;
            case 'month':
                time = startOfDate(this.year(), this.month(), 1);
                break;
            case 'week':
                time = startOfDate(
                    this.year(),
                    this.month(),
                    this.date() - this.weekday()
                );
                break;
            case 'isoWeek':
                time = startOfDate(
                    this.year(),
                    this.month(),
                    this.date() - (this.isoWeekday() - 1)
                );
                break;
            case 'day':
            case 'date':
                time = startOfDate(this.year(), this.month(), this.date());
                break;
            case 'hour':
                time = this._d.valueOf();
                time -= mod$1(
                    time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),
                    MS_PER_HOUR
                );
                break;
            case 'minute':
                time = this._d.valueOf();
                time -= mod$1(time, MS_PER_MINUTE);
                break;
            case 'second':
                time = this._d.valueOf();
                time -= mod$1(time, MS_PER_SECOND);
                break;
        }

        this._d.setTime(time);
        hooks.updateOffset(this, true);
        return this;
    }

    function endOf(units) {
        var time, startOfDate;
        units = normalizeUnits(units);
        if (units === undefined || units === 'millisecond' || !this.isValid()) {
            return this;
        }

        startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;

        switch (units) {
            case 'year':
                time = startOfDate(this.year() + 1, 0, 1) - 1;
                break;
            case 'quarter':
                time =
                    startOfDate(
                        this.year(),
                        this.month() - (this.month() % 3) + 3,
                        1
                    ) - 1;
                break;
            case 'month':
                time = startOfDate(this.year(), this.month() + 1, 1) - 1;
                break;
            case 'week':
                time =
                    startOfDate(
                        this.year(),
                        this.month(),
                        this.date() - this.weekday() + 7
                    ) - 1;
                break;
            case 'isoWeek':
                time =
                    startOfDate(
                        this.year(),
                        this.month(),
                        this.date() - (this.isoWeekday() - 1) + 7
                    ) - 1;
                break;
            case 'day':
            case 'date':
                time = startOfDate(this.year(), this.month(), this.date() + 1) - 1;
                break;
            case 'hour':
                time = this._d.valueOf();
                time +=
                    MS_PER_HOUR -
                    mod$1(
                        time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),
                        MS_PER_HOUR
                    ) -
                    1;
                break;
            case 'minute':
                time = this._d.valueOf();
                time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1;
                break;
            case 'second':
                time = this._d.valueOf();
                time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1;
                break;
        }

        this._d.setTime(time);
        hooks.updateOffset(this, true);
        return this;
    }

    function valueOf() {
        return this._d.valueOf() - (this._offset || 0) * 60000;
    }

    function unix() {
        return Math.floor(this.valueOf() / 1000);
    }

    function toDate() {
        return new Date(this.valueOf());
    }

    function toArray() {
        var m = this;
        return [
            m.year(),
            m.month(),
            m.date(),
            m.hour(),
            m.minute(),
            m.second(),
            m.millisecond(),
        ];
    }

    function toObject() {
        var m = this;
        return {
            years: m.year(),
            months: m.month(),
            date: m.date(),
            hours: m.hours(),
            minutes: m.minutes(),
            seconds: m.seconds(),
            milliseconds: m.milliseconds(),
        };
    }

    function toJSON() {
        // new Date(NaN).toJSON() === null
        return this.isValid() ? this.toISOString() : null;
    }

    function isValid$2() {
        return isValid(this);
    }

    function parsingFlags() {
        return extend({}, getParsingFlags(this));
    }

    function invalidAt() {
        return getParsingFlags(this).overflow;
    }

    function creationData() {
        return {
            input: this._i,
            format: this._f,
            locale: this._locale,
            isUTC: this._isUTC,
            strict: this._strict,
        };
    }

    addFormatToken('N', 0, 0, 'eraAbbr');
    addFormatToken('NN', 0, 0, 'eraAbbr');
    addFormatToken('NNN', 0, 0, 'eraAbbr');
    addFormatToken('NNNN', 0, 0, 'eraName');
    addFormatToken('NNNNN', 0, 0, 'eraNarrow');

    addFormatToken('y', ['y', 1], 'yo', 'eraYear');
    addFormatToken('y', ['yy', 2], 0, 'eraYear');
    addFormatToken('y', ['yyy', 3], 0, 'eraYear');
    addFormatToken('y', ['yyyy', 4], 0, 'eraYear');

    addRegexToken('N', matchEraAbbr);
    addRegexToken('NN', matchEraAbbr);
    addRegexToken('NNN', matchEraAbbr);
    addRegexToken('NNNN', matchEraName);
    addRegexToken('NNNNN', matchEraNarrow);

    addParseToken(
        ['N', 'NN', 'NNN', 'NNNN', 'NNNNN'],
        function (input, array, config, token) {
            var era = config._locale.erasParse(input, token, config._strict);
            if (era) {
                getParsingFlags(config).era = era;
            } else {
                getParsingFlags(config).invalidEra = input;
            }
        }
    );

    addRegexToken('y', matchUnsigned);
    addRegexToken('yy', matchUnsigned);
    addRegexToken('yyy', matchUnsigned);
    addRegexToken('yyyy', matchUnsigned);
    addRegexToken('yo', matchEraYearOrdinal);

    addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR);
    addParseToken(['yo'], function (input, array, config, token) {
        var match;
        if (config._locale._eraYearOrdinalRegex) {
            match = input.match(config._locale._eraYearOrdinalRegex);
        }

        if (config._locale.eraYearOrdinalParse) {
            array[YEAR] = config._locale.eraYearOrdinalParse(input, match);
        } else {
            array[YEAR] = parseInt(input, 10);
        }
    });

    function localeEras(m, format) {
        var i,
            l,
            date,
            eras = this._eras || getLocale('en')._eras;
        for (i = 0, l = eras.length; i < l; ++i) {
            switch (typeof eras[i].since) {
                case 'string':
                    // truncate time
                    date = hooks(eras[i].since).startOf('day');
                    eras[i].since = date.valueOf();
                    break;
            }

            switch (typeof eras[i].until) {
                case 'undefined':
                    eras[i].until = +Infinity;
                    break;
                case 'string':
                    // truncate time
                    date = hooks(eras[i].until).startOf('day').valueOf();
                    eras[i].until = date.valueOf();
                    break;
            }
        }
        return eras;
    }

    function localeErasParse(eraName, format, strict) {
        var i,
            l,
            eras = this.eras(),
            name,
            abbr,
            narrow;
        eraName = eraName.toUpperCase();

        for (i = 0, l = eras.length; i < l; ++i) {
            name = eras[i].name.toUpperCase();
            abbr = eras[i].abbr.toUpperCase();
            narrow = eras[i].narrow.toUpperCase();

            if (strict) {
                switch (format) {
                    case 'N':
                    case 'NN':
                    case 'NNN':
                        if (abbr === eraName) {
                            return eras[i];
                        }
                        break;

                    case 'NNNN':
                        if (name === eraName) {
                            return eras[i];
                        }
                        break;

                    case 'NNNNN':
                        if (narrow === eraName) {
                            return eras[i];
                        }
                        break;
                }
            } else if ([name, abbr, narrow].indexOf(eraName) >= 0) {
                return eras[i];
            }
        }
    }

    function localeErasConvertYear(era, year) {
        var dir = era.since <= era.until ? +1 : -1;
        if (year === undefined) {
            return hooks(era.since).year();
        } else {
            return hooks(era.since).year() + (year - era.offset) * dir;
        }
    }

    function getEraName() {
        var i,
            l,
            val,
            eras = this.localeData().eras();
        for (i = 0, l = eras.length; i < l; ++i) {
            // truncate time
            val = this.clone().startOf('day').valueOf();

            if (eras[i].since <= val && val <= eras[i].until) {
                return eras[i].name;
            }
            if (eras[i].until <= val && val <= eras[i].since) {
                return eras[i].name;
            }
        }

        return '';
    }

    function getEraNarrow() {
        var i,
            l,
            val,
            eras = this.localeData().eras();
        for (i = 0, l = eras.length; i < l; ++i) {
            // truncate time
            val = this.clone().startOf('day').valueOf();

            if (eras[i].since <= val && val <= eras[i].until) {
                return eras[i].narrow;
            }
            if (eras[i].until <= val && val <= eras[i].since) {
                return eras[i].narrow;
            }
        }

        return '';
    }

    function getEraAbbr() {
        var i,
            l,
            val,
            eras = this.localeData().eras();
        for (i = 0, l = eras.length; i < l; ++i) {
            // truncate time
            val = this.clone().startOf('day').valueOf();

            if (eras[i].since <= val && val <= eras[i].until) {
                return eras[i].abbr;
            }
            if (eras[i].until <= val && val <= eras[i].since) {
                return eras[i].abbr;
            }
        }

        return '';
    }

    function getEraYear() {
        var i,
            l,
            dir,
            val,
            eras = this.localeData().eras();
        for (i = 0, l = eras.length; i < l; ++i) {
            dir = eras[i].since <= eras[i].until ? +1 : -1;

            // truncate time
            val = this.clone().startOf('day').valueOf();

            if (
                (eras[i].since <= val && val <= eras[i].until) ||
                (eras[i].until <= val && val <= eras[i].since)
            ) {
                return (
                    (this.year() - hooks(eras[i].since).year()) * dir +
                    eras[i].offset
                );
            }
        }

        return this.year();
    }

    function erasNameRegex(isStrict) {
        if (!hasOwnProp(this, '_erasNameRegex')) {
            computeErasParse.call(this);
        }
        return isStrict ? this._erasNameRegex : this._erasRegex;
    }

    function erasAbbrRegex(isStrict) {
        if (!hasOwnProp(this, '_erasAbbrRegex')) {
            computeErasParse.call(this);
        }
        return isStrict ? this._erasAbbrRegex : this._erasRegex;
    }

    function erasNarrowRegex(isStrict) {
        if (!hasOwnProp(this, '_erasNarrowRegex')) {
            computeErasParse.call(this);
        }
        return isStrict ? this._erasNarrowRegex : this._erasRegex;
    }

    function matchEraAbbr(isStrict, locale) {
        return locale.erasAbbrRegex(isStrict);
    }

    function matchEraName(isStrict, locale) {
        return locale.erasNameRegex(isStrict);
    }

    function matchEraNarrow(isStrict, locale) {
        return locale.erasNarrowRegex(isStrict);
    }

    function matchEraYearOrdinal(isStrict, locale) {
        return locale._eraYearOrdinalRegex || matchUnsigned;
    }

    function computeErasParse() {
        var abbrPieces = [],
            namePieces = [],
            narrowPieces = [],
            mixedPieces = [],
            i,
            l,
            eras = this.eras();

        for (i = 0, l = eras.length; i < l; ++i) {
            namePieces.push(regexEscape(eras[i].name));
            abbrPieces.push(regexEscape(eras[i].abbr));
            narrowPieces.push(regexEscape(eras[i].narrow));

            mixedPieces.push(regexEscape(eras[i].name));
            mixedPieces.push(regexEscape(eras[i].abbr));
            mixedPieces.push(regexEscape(eras[i].narrow));
        }

        this._erasRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
        this._erasNameRegex = new RegExp('^(' + namePieces.join('|') + ')', 'i');
        this._erasAbbrRegex = new RegExp('^(' + abbrPieces.join('|') + ')', 'i');
        this._erasNarrowRegex = new RegExp(
            '^(' + narrowPieces.join('|') + ')',
            'i'
        );
    }

    // FORMATTING

    addFormatToken(0, ['gg', 2], 0, function () {
        return this.weekYear() % 100;
    });

    addFormatToken(0, ['GG', 2], 0, function () {
        return this.isoWeekYear() % 100;
    });

    function addWeekYearFormatToken(token, getter) {
        addFormatToken(0, [token, token.length], 0, getter);
    }

    addWeekYearFormatToken('gggg', 'weekYear');
    addWeekYearFormatToken('ggggg', 'weekYear');
    addWeekYearFormatToken('GGGG', 'isoWeekYear');
    addWeekYearFormatToken('GGGGG', 'isoWeekYear');

    // ALIASES

    addUnitAlias('weekYear', 'gg');
    addUnitAlias('isoWeekYear', 'GG');

    // PRIORITY

    addUnitPriority('weekYear', 1);
    addUnitPriority('isoWeekYear', 1);

    // PARSING

    addRegexToken('G', matchSigned);
    addRegexToken('g', matchSigned);
    addRegexToken('GG', match1to2, match2);
    addRegexToken('gg', match1to2, match2);
    addRegexToken('GGGG', match1to4, match4);
    addRegexToken('gggg', match1to4, match4);
    addRegexToken('GGGGG', match1to6, match6);
    addRegexToken('ggggg', match1to6, match6);

    addWeekParseToken(
        ['gggg', 'ggggg', 'GGGG', 'GGGGG'],
        function (input, week, config, token) {
            week[token.substr(0, 2)] = toInt(input);
        }
    );

    addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
        week[token] = hooks.parseTwoDigitYear(input);
    });

    // MOMENTS

    function getSetWeekYear(input) {
        return getSetWeekYearHelper.call(
            this,
            input,
            this.week(),
            this.weekday(),
            this.localeData()._week.dow,
            this.localeData()._week.doy
        );
    }

    function getSetISOWeekYear(input) {
        return getSetWeekYearHelper.call(
            this,
            input,
            this.isoWeek(),
            this.isoWeekday(),
            1,
            4
        );
    }

    function getISOWeeksInYear() {
        return weeksInYear(this.year(), 1, 4);
    }

    function getISOWeeksInISOWeekYear() {
        return weeksInYear(this.isoWeekYear(), 1, 4);
    }

    function getWeeksInYear() {
        var weekInfo = this.localeData()._week;
        return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
    }

    function getWeeksInWeekYear() {
        var weekInfo = this.localeData()._week;
        return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy);
    }

    function getSetWeekYearHelper(input, week, weekday, dow, doy) {
        var weeksTarget;
        if (input == null) {
            return weekOfYear(this, dow, doy).year;
        } else {
            weeksTarget = weeksInYear(input, dow, doy);
            if (week > weeksTarget) {
                week = weeksTarget;
            }
            return setWeekAll.call(this, input, week, weekday, dow, doy);
        }
    }

    function setWeekAll(weekYear, week, weekday, dow, doy) {
        var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),
            date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);

        this.year(date.getUTCFullYear());
        this.month(date.getUTCMonth());
        this.date(date.getUTCDate());
        return this;
    }

    // FORMATTING

    addFormatToken('Q', 0, 'Qo', 'quarter');

    // ALIASES

    addUnitAlias('quarter', 'Q');

    // PRIORITY

    addUnitPriority('quarter', 7);

    // PARSING

    addRegexToken('Q', match1);
    addParseToken('Q', function (input, array) {
        array[MONTH] = (toInt(input) - 1) * 3;
    });

    // MOMENTS

    function getSetQuarter(input) {
        return input == null
            ? Math.ceil((this.month() + 1) / 3)
            : this.month((input - 1) * 3 + (this.month() % 3));
    }

    // FORMATTING

    addFormatToken('D', ['DD', 2], 'Do', 'date');

    // ALIASES

    addUnitAlias('date', 'D');

    // PRIORITY
    addUnitPriority('date', 9);

    // PARSING

    addRegexToken('D', match1to2);
    addRegexToken('DD', match1to2, match2);
    addRegexToken('Do', function (isStrict, locale) {
        // TODO: Remove "ordinalParse" fallback in next major release.
        return isStrict
            ? locale._dayOfMonthOrdinalParse || locale._ordinalParse
            : locale._dayOfMonthOrdinalParseLenient;
    });

    addParseToken(['D', 'DD'], DATE);
    addParseToken('Do', function (input, array) {
        array[DATE] = toInt(input.match(match1to2)[0]);
    });

    // MOMENTS

    var getSetDayOfMonth = makeGetSet('Date', true);

    // FORMATTING

    addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');

    // ALIASES

    addUnitAlias('dayOfYear', 'DDD');

    // PRIORITY
    addUnitPriority('dayOfYear', 4);

    // PARSING

    addRegexToken('DDD', match1to3);
    addRegexToken('DDDD', match3);
    addParseToken(['DDD', 'DDDD'], function (input, array, config) {
        config._dayOfYear = toInt(input);
    });

    // HELPERS

    // MOMENTS

    function getSetDayOfYear(input) {
        var dayOfYear =
            Math.round(
                (this.clone().startOf('day') - this.clone().startOf('year')) / 864e5
            ) + 1;
        return input == null ? dayOfYear : this.add(input - dayOfYear, 'd');
    }

    // FORMATTING

    addFormatToken('m', ['mm', 2], 0, 'minute');

    // ALIASES

    addUnitAlias('minute', 'm');

    // PRIORITY

    addUnitPriority('minute', 14);

    // PARSING

    addRegexToken('m', match1to2);
    addRegexToken('mm', match1to2, match2);
    addParseToken(['m', 'mm'], MINUTE);

    // MOMENTS

    var getSetMinute = makeGetSet('Minutes', false);

    // FORMATTING

    addFormatToken('s', ['ss', 2], 0, 'second');

    // ALIASES

    addUnitAlias('second', 's');

    // PRIORITY

    addUnitPriority('second', 15);

    // PARSING

    addRegexToken('s', match1to2);
    addRegexToken('ss', match1to2, match2);
    addParseToken(['s', 'ss'], SECOND);

    // MOMENTS

    var getSetSecond = makeGetSet('Seconds', false);

    // FORMATTING

    addFormatToken('S', 0, 0, function () {
        return ~~(this.millisecond() / 100);
    });

    addFormatToken(0, ['SS', 2], 0, function () {
        return ~~(this.millisecond() / 10);
    });

    addFormatToken(0, ['SSS', 3], 0, 'millisecond');
    addFormatToken(0, ['SSSS', 4], 0, function () {
        return this.millisecond() * 10;
    });
    addFormatToken(0, ['SSSSS', 5], 0, function () {
        return this.millisecond() * 100;
    });
    addFormatToken(0, ['SSSSSS', 6], 0, function () {
        return this.millisecond() * 1000;
    });
    addFormatToken(0, ['SSSSSSS', 7], 0, function () {
        return this.millisecond() * 10000;
    });
    addFormatToken(0, ['SSSSSSSS', 8], 0, function () {
        return this.millisecond() * 100000;
    });
    addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
        return this.millisecond() * 1000000;
    });

    // ALIASES

    addUnitAlias('millisecond', 'ms');

    // PRIORITY

    addUnitPriority('millisecond', 16);

    // PARSING

    addRegexToken('S', match1to3, match1);
    addRegexToken('SS', match1to3, match2);
    addRegexToken('SSS', match1to3, match3);

    var token, getSetMillisecond;
    for (token = 'SSSS'; token.length <= 9; token += 'S') {
        addRegexToken(token, matchUnsigned);
    }

    function parseMs(input, array) {
        array[MILLISECOND] = toInt(('0.' + input) * 1000);
    }

    for (token = 'S'; token.length <= 9; token += 'S') {
        addParseToken(token, parseMs);
    }

    getSetMillisecond = makeGetSet('Milliseconds', false);

    // FORMATTING

    addFormatToken('z', 0, 0, 'zoneAbbr');
    addFormatToken('zz', 0, 0, 'zoneName');

    // MOMENTS

    function getZoneAbbr() {
        return this._isUTC ? 'UTC' : '';
    }

    function getZoneName() {
        return this._isUTC ? 'Coordinated Universal Time' : '';
    }

    var proto = Moment.prototype;

    proto.add = add;
    proto.calendar = calendar$1;
    proto.clone = clone;
    proto.diff = diff;
    proto.endOf = endOf;
    proto.format = format;
    proto.from = from;
    proto.fromNow = fromNow;
    proto.to = to;
    proto.toNow = toNow;
    proto.get = stringGet;
    proto.invalidAt = invalidAt;
    proto.isAfter = isAfter;
    proto.isBefore = isBefore;
    proto.isBetween = isBetween;
    proto.isSame = isSame;
    proto.isSameOrAfter = isSameOrAfter;
    proto.isSameOrBefore = isSameOrBefore;
    proto.isValid = isValid$2;
    proto.lang = lang;
    proto.locale = locale;
    proto.localeData = localeData;
    proto.max = prototypeMax;
    proto.min = prototypeMin;
    proto.parsingFlags = parsingFlags;
    proto.set = stringSet;
    proto.startOf = startOf;
    proto.subtract = subtract;
    proto.toArray = toArray;
    proto.toObject = toObject;
    proto.toDate = toDate;
    proto.toISOString = toISOString;
    proto.inspect = inspect;
    if (typeof Symbol !== 'undefined' && Symbol.for != null) {
        proto[Symbol.for('nodejs.util.inspect.custom')] = function () {
            return 'Moment<' + this.format() + '>';
        };
    }
    proto.toJSON = toJSON;
    proto.toString = toString;
    proto.unix = unix;
    proto.valueOf = valueOf;
    proto.creationData = creationData;
    proto.eraName = getEraName;
    proto.eraNarrow = getEraNarrow;
    proto.eraAbbr = getEraAbbr;
    proto.eraYear = getEraYear;
    proto.year = getSetYear;
    proto.isLeapYear = getIsLeapYear;
    proto.weekYear = getSetWeekYear;
    proto.isoWeekYear = getSetISOWeekYear;
    proto.quarter = proto.quarters = getSetQuarter;
    proto.month = getSetMonth;
    proto.daysInMonth = getDaysInMonth;
    proto.week = proto.weeks = getSetWeek;
    proto.isoWeek = proto.isoWeeks = getSetISOWeek;
    proto.weeksInYear = getWeeksInYear;
    proto.weeksInWeekYear = getWeeksInWeekYear;
    proto.isoWeeksInYear = getISOWeeksInYear;
    proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear;
    proto.date = getSetDayOfMonth;
    proto.day = proto.days = getSetDayOfWeek;
    proto.weekday = getSetLocaleDayOfWeek;
    proto.isoWeekday = getSetISODayOfWeek;
    proto.dayOfYear = getSetDayOfYear;
    proto.hour = proto.hours = getSetHour;
    proto.minute = proto.minutes = getSetMinute;
    proto.second = proto.seconds = getSetSecond;
    proto.millisecond = proto.milliseconds = getSetMillisecond;
    proto.utcOffset = getSetOffset;
    proto.utc = setOffsetToUTC;
    proto.local = setOffsetToLocal;
    proto.parseZone = setOffsetToParsedOffset;
    proto.hasAlignedHourOffset = hasAlignedHourOffset;
    proto.isDST = isDaylightSavingTime;
    proto.isLocal = isLocal;
    proto.isUtcOffset = isUtcOffset;
    proto.isUtc = isUtc;
    proto.isUTC = isUtc;
    proto.zoneAbbr = getZoneAbbr;
    proto.zoneName = getZoneName;
    proto.dates = deprecate(
        'dates accessor is deprecated. Use date instead.',
        getSetDayOfMonth
    );
    proto.months = deprecate(
        'months accessor is deprecated. Use month instead',
        getSetMonth
    );
    proto.years = deprecate(
        'years accessor is deprecated. Use year instead',
        getSetYear
    );
    proto.zone = deprecate(
        'moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/',
        getSetZone
    );
    proto.isDSTShifted = deprecate(
        'isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information',
        isDaylightSavingTimeShifted
    );

    function createUnix(input) {
        return createLocal(input * 1000);
    }

    function createInZone() {
        return createLocal.apply(null, arguments).parseZone();
    }

    function preParsePostFormat(string) {
        return string;
    }

    var proto$1 = Locale.prototype;

    proto$1.calendar = calendar;
    proto$1.longDateFormat = longDateFormat;
    proto$1.invalidDate = invalidDate;
    proto$1.ordinal = ordinal;
    proto$1.preparse = preParsePostFormat;
    proto$1.postformat = preParsePostFormat;
    proto$1.relativeTime = relativeTime;
    proto$1.pastFuture = pastFuture;
    proto$1.set = set;
    proto$1.eras = localeEras;
    proto$1.erasParse = localeErasParse;
    proto$1.erasConvertYear = localeErasConvertYear;
    proto$1.erasAbbrRegex = erasAbbrRegex;
    proto$1.erasNameRegex = erasNameRegex;
    proto$1.erasNarrowRegex = erasNarrowRegex;

    proto$1.months = localeMonths;
    proto$1.monthsShort = localeMonthsShort;
    proto$1.monthsParse = localeMonthsParse;
    proto$1.monthsRegex = monthsRegex;
    proto$1.monthsShortRegex = monthsShortRegex;
    proto$1.week = localeWeek;
    proto$1.firstDayOfYear = localeFirstDayOfYear;
    proto$1.firstDayOfWeek = localeFirstDayOfWeek;

    proto$1.weekdays = localeWeekdays;
    proto$1.weekdaysMin = localeWeekdaysMin;
    proto$1.weekdaysShort = localeWeekdaysShort;
    proto$1.weekdaysParse = localeWeekdaysParse;

    proto$1.weekdaysRegex = weekdaysRegex;
    proto$1.weekdaysShortRegex = weekdaysShortRegex;
    proto$1.weekdaysMinRegex = weekdaysMinRegex;

    proto$1.isPM = localeIsPM;
    proto$1.meridiem = localeMeridiem;

    function get$1(format, index, field, setter) {
        var locale = getLocale(),
            utc = createUTC().set(setter, index);
        return locale[field](utc, format);
    }

    function listMonthsImpl(format, index, field) {
        if (isNumber(format)) {
            index = format;
            format = undefined;
        }

        format = format || '';

        if (index != null) {
            return get$1(format, index, field, 'month');
        }

        var i,
            out = [];
        for (i = 0; i < 12; i++) {
            out[i] = get$1(format, i, field, 'month');
        }
        return out;
    }

    // ()
    // (5)
    // (fmt, 5)
    // (fmt)
    // (true)
    // (true, 5)
    // (true, fmt, 5)
    // (true, fmt)
    function listWeekdaysImpl(localeSorted, format, index, field) {
        if (typeof localeSorted === 'boolean') {
            if (isNumber(format)) {
                index = format;
                format = undefined;
            }

            format = format || '';
        } else {
            format = localeSorted;
            index = format;
            localeSorted = false;

            if (isNumber(format)) {
                index = format;
                format = undefined;
            }

            format = format || '';
        }

        var locale = getLocale(),
            shift = localeSorted ? locale._week.dow : 0,
            i,
            out = [];

        if (index != null) {
            return get$1(format, (index + shift) % 7, field, 'day');
        }

        for (i = 0; i < 7; i++) {
            out[i] = get$1(format, (i + shift) % 7, field, 'day');
        }
        return out;
    }

    function listMonths(format, index) {
        return listMonthsImpl(format, index, 'months');
    }

    function listMonthsShort(format, index) {
        return listMonthsImpl(format, index, 'monthsShort');
    }

    function listWeekdays(localeSorted, format, index) {
        return listWeekdaysImpl(localeSorted, format, index, 'weekdays');
    }

    function listWeekdaysShort(localeSorted, format, index) {
        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');
    }

    function listWeekdaysMin(localeSorted, format, index) {
        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');
    }

    getSetGlobalLocale('en', {
        eras: [
            {
                since: '0001-01-01',
                until: +Infinity,
                offset: 1,
                name: 'Anno Domini',
                narrow: 'AD',
                abbr: 'AD',
            },
            {
                since: '0000-12-31',
                until: -Infinity,
                offset: 1,
                name: 'Before Christ',
                narrow: 'BC',
                abbr: 'BC',
            },
        ],
        dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    toInt((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
    });

    // Side effect imports

    hooks.lang = deprecate(
        'moment.lang is deprecated. Use moment.locale instead.',
        getSetGlobalLocale
    );
    hooks.langData = deprecate(
        'moment.langData is deprecated. Use moment.localeData instead.',
        getLocale
    );

    var mathAbs = Math.abs;

    function abs() {
        var data = this._data;

        this._milliseconds = mathAbs(this._milliseconds);
        this._days = mathAbs(this._days);
        this._months = mathAbs(this._months);

        data.milliseconds = mathAbs(data.milliseconds);
        data.seconds = mathAbs(data.seconds);
        data.minutes = mathAbs(data.minutes);
        data.hours = mathAbs(data.hours);
        data.months = mathAbs(data.months);
        data.years = mathAbs(data.years);

        return this;
    }

    function addSubtract$1(duration, input, value, direction) {
        var other = createDuration(input, value);

        duration._milliseconds += direction * other._milliseconds;
        duration._days += direction * other._days;
        duration._months += direction * other._months;

        return duration._bubble();
    }

    // supports only 2.0-style add(1, 's') or add(duration)
    function add$1(input, value) {
        return addSubtract$1(this, input, value, 1);
    }

    // supports only 2.0-style subtract(1, 's') or subtract(duration)
    function subtract$1(input, value) {
        return addSubtract$1(this, input, value, -1);
    }

    function absCeil(number) {
        if (number < 0) {
            return Math.floor(number);
        } else {
            return Math.ceil(number);
        }
    }

    function bubble() {
        var milliseconds = this._milliseconds,
            days = this._days,
            months = this._months,
            data = this._data,
            seconds,
            minutes,
            hours,
            years,
            monthsFromDays;

        // if we have a mix of positive and negative values, bubble down first
        // check: https://github.com/moment/moment/issues/2166
        if (
            !(
                (milliseconds >= 0 && days >= 0 && months >= 0) ||
                (milliseconds <= 0 && days <= 0 && months <= 0)
            )
        ) {
            milliseconds += absCeil(monthsToDays(months) + days) * 864e5;
            days = 0;
            months = 0;
        }

        // The following code bubbles up values, see the tests for
        // examples of what that means.
        data.milliseconds = milliseconds % 1000;

        seconds = absFloor(milliseconds / 1000);
        data.seconds = seconds % 60;

        minutes = absFloor(seconds / 60);
        data.minutes = minutes % 60;

        hours = absFloor(minutes / 60);
        data.hours = hours % 24;

        days += absFloor(hours / 24);

        // convert days to months
        monthsFromDays = absFloor(daysToMonths(days));
        months += monthsFromDays;
        days -= absCeil(monthsToDays(monthsFromDays));

        // 12 months -> 1 year
        years = absFloor(months / 12);
        months %= 12;

        data.days = days;
        data.months = months;
        data.years = years;

        return this;
    }

    function daysToMonths(days) {
        // 400 years have 146097 days (taking into account leap year rules)
        // 400 years have 12 months === 4800
        return (days * 4800) / 146097;
    }

    function monthsToDays(months) {
        // the reverse of daysToMonths
        return (months * 146097) / 4800;
    }

    function as(units) {
        if (!this.isValid()) {
            return NaN;
        }
        var days,
            months,
            milliseconds = this._milliseconds;

        units = normalizeUnits(units);

        if (units === 'month' || units === 'quarter' || units === 'year') {
            days = this._days + milliseconds / 864e5;
            months = this._months + daysToMonths(days);
            switch (units) {
                case 'month':
                    return months;
                case 'quarter':
                    return months / 3;
                case 'year':
                    return months / 12;
            }
        } else {
            // handle milliseconds separately because of floating point math errors (issue #1867)
            days = this._days + Math.round(monthsToDays(this._months));
            switch (units) {
                case 'week':
                    return days / 7 + milliseconds / 6048e5;
                case 'day':
                    return days + milliseconds / 864e5;
                case 'hour':
                    return days * 24 + milliseconds / 36e5;
                case 'minute':
                    return days * 1440 + milliseconds / 6e4;
                case 'second':
                    return days * 86400 + milliseconds / 1000;
                // Math.floor prevents floating point math errors here
                case 'millisecond':
                    return Math.floor(days * 864e5) + milliseconds;
                default:
                    throw new Error('Unknown unit ' + units);
            }
        }
    }

    // TODO: Use this.as('ms')?
    function valueOf$1() {
        if (!this.isValid()) {
            return NaN;
        }
        return (
            this._milliseconds +
            this._days * 864e5 +
            (this._months % 12) * 2592e6 +
            toInt(this._months / 12) * 31536e6
        );
    }

    function makeAs(alias) {
        return function () {
            return this.as(alias);
        };
    }

    var asMilliseconds = makeAs('ms'),
        asSeconds = makeAs('s'),
        asMinutes = makeAs('m'),
        asHours = makeAs('h'),
        asDays = makeAs('d'),
        asWeeks = makeAs('w'),
        asMonths = makeAs('M'),
        asQuarters = makeAs('Q'),
        asYears = makeAs('y');

    function clone$1() {
        return createDuration(this);
    }

    function get$2(units) {
        units = normalizeUnits(units);
        return this.isValid() ? this[units + 's']() : NaN;
    }

    function makeGetter(name) {
        return function () {
            return this.isValid() ? this._data[name] : NaN;
        };
    }

    var milliseconds = makeGetter('milliseconds'),
        seconds = makeGetter('seconds'),
        minutes = makeGetter('minutes'),
        hours = makeGetter('hours'),
        days = makeGetter('days'),
        months = makeGetter('months'),
        years = makeGetter('years');

    function weeks() {
        return absFloor(this.days() / 7);
    }

    var round = Math.round,
        thresholds = {
            ss: 44, // a few seconds to seconds
            s: 45, // seconds to minute
            m: 45, // minutes to hour
            h: 22, // hours to day
            d: 26, // days to month/week
            w: null, // weeks to month
            M: 11, // months to year
        };

    // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
    function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
        return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
    }

    function relativeTime$1(posNegDuration, withoutSuffix, thresholds, locale) {
        var duration = createDuration(posNegDuration).abs(),
            seconds = round(duration.as('s')),
            minutes = round(duration.as('m')),
            hours = round(duration.as('h')),
            days = round(duration.as('d')),
            months = round(duration.as('M')),
            weeks = round(duration.as('w')),
            years = round(duration.as('y')),
            a =
                (seconds <= thresholds.ss && ['s', seconds]) ||
                (seconds < thresholds.s && ['ss', seconds]) ||
                (minutes <= 1 && ['m']) ||
                (minutes < thresholds.m && ['mm', minutes]) ||
                (hours <= 1 && ['h']) ||
                (hours < thresholds.h && ['hh', hours]) ||
                (days <= 1 && ['d']) ||
                (days < thresholds.d && ['dd', days]);

        if (thresholds.w != null) {
            a =
                a ||
                (weeks <= 1 && ['w']) ||
                (weeks < thresholds.w && ['ww', weeks]);
        }
        a = a ||
            (months <= 1 && ['M']) ||
            (months < thresholds.M && ['MM', months]) ||
            (years <= 1 && ['y']) || ['yy', years];

        a[2] = withoutSuffix;
        a[3] = +posNegDuration > 0;
        a[4] = locale;
        return substituteTimeAgo.apply(null, a);
    }

    // This function allows you to set the rounding function for relative time strings
    function getSetRelativeTimeRounding(roundingFunction) {
        if (roundingFunction === undefined) {
            return round;
        }
        if (typeof roundingFunction === 'function') {
            round = roundingFunction;
            return true;
        }
        return false;
    }

    // This function allows you to set a threshold for relative time strings
    function getSetRelativeTimeThreshold(threshold, limit) {
        if (thresholds[threshold] === undefined) {
            return false;
        }
        if (limit === undefined) {
            return thresholds[threshold];
        }
        thresholds[threshold] = limit;
        if (threshold === 's') {
            thresholds.ss = limit - 1;
        }
        return true;
    }

    function humanize(argWithSuffix, argThresholds) {
        if (!this.isValid()) {
            return this.localeData().invalidDate();
        }

        var withSuffix = false,
            th = thresholds,
            locale,
            output;

        if (typeof argWithSuffix === 'object') {
            argThresholds = argWithSuffix;
            argWithSuffix = false;
        }
        if (typeof argWithSuffix === 'boolean') {
            withSuffix = argWithSuffix;
        }
        if (typeof argThresholds === 'object') {
            th = Object.assign({}, thresholds, argThresholds);
            if (argThresholds.s != null && argThresholds.ss == null) {
                th.ss = argThresholds.s - 1;
            }
        }

        locale = this.localeData();
        output = relativeTime$1(this, !withSuffix, th, locale);

        if (withSuffix) {
            output = locale.pastFuture(+this, output);
        }

        return locale.postformat(output);
    }

    var abs$1 = Math.abs;

    function sign(x) {
        return (x > 0) - (x < 0) || +x;
    }

    function toISOString$1() {
        // for ISO strings we do not use the normal bubbling rules:
        //  * milliseconds bubble up until they become hours
        //  * days do not bubble at all
        //  * months bubble up until they become years
        // This is because there is no context-free conversion between hours and days
        // (think of clock changes)
        // and also not between days and months (28-31 days per month)
        if (!this.isValid()) {
            return this.localeData().invalidDate();
        }

        var seconds = abs$1(this._milliseconds) / 1000,
            days = abs$1(this._days),
            months = abs$1(this._months),
            minutes,
            hours,
            years,
            s,
            total = this.asSeconds(),
            totalSign,
            ymSign,
            daysSign,
            hmsSign;

        if (!total) {
            // this is the same as C#'s (Noda) and python (isodate)...
            // but not other JS (goog.date)
            return 'P0D';
        }

        // 3600 seconds -> 60 minutes -> 1 hour
        minutes = absFloor(seconds / 60);
        hours = absFloor(minutes / 60);
        seconds %= 60;
        minutes %= 60;

        // 12 months -> 1 year
        years = absFloor(months / 12);
        months %= 12;

        // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
        s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : '';

        totalSign = total < 0 ? '-' : '';
        ymSign = sign(this._months) !== sign(total) ? '-' : '';
        daysSign = sign(this._days) !== sign(total) ? '-' : '';
        hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';

        return (
            totalSign +
            'P' +
            (years ? ymSign + years + 'Y' : '') +
            (months ? ymSign + months + 'M' : '') +
            (days ? daysSign + days + 'D' : '') +
            (hours || minutes || seconds ? 'T' : '') +
            (hours ? hmsSign + hours + 'H' : '') +
            (minutes ? hmsSign + minutes + 'M' : '') +
            (seconds ? hmsSign + s + 'S' : '')
        );
    }

    var proto$2 = Duration.prototype;

    proto$2.isValid = isValid$1;
    proto$2.abs = abs;
    proto$2.add = add$1;
    proto$2.subtract = subtract$1;
    proto$2.as = as;
    proto$2.asMilliseconds = asMilliseconds;
    proto$2.asSeconds = asSeconds;
    proto$2.asMinutes = asMinutes;
    proto$2.asHours = asHours;
    proto$2.asDays = asDays;
    proto$2.asWeeks = asWeeks;
    proto$2.asMonths = asMonths;
    proto$2.asQuarters = asQuarters;
    proto$2.asYears = asYears;
    proto$2.valueOf = valueOf$1;
    proto$2._bubble = bubble;
    proto$2.clone = clone$1;
    proto$2.get = get$2;
    proto$2.milliseconds = milliseconds;
    proto$2.seconds = seconds;
    proto$2.minutes = minutes;
    proto$2.hours = hours;
    proto$2.days = days;
    proto$2.weeks = weeks;
    proto$2.months = months;
    proto$2.years = years;
    proto$2.humanize = humanize;
    proto$2.toISOString = toISOString$1;
    proto$2.toString = toISOString$1;
    proto$2.toJSON = toISOString$1;
    proto$2.locale = locale;
    proto$2.localeData = localeData;

    proto$2.toIsoString = deprecate(
        'toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)',
        toISOString$1
    );
    proto$2.lang = lang;

    // FORMATTING

    addFormatToken('X', 0, 0, 'unix');
    addFormatToken('x', 0, 0, 'valueOf');

    // PARSING

    addRegexToken('x', matchSigned);
    addRegexToken('X', matchTimestamp);
    addParseToken('X', function (input, array, config) {
        config._d = new Date(parseFloat(input) * 1000);
    });
    addParseToken('x', function (input, array, config) {
        config._d = new Date(toInt(input));
    });

    //! moment.js

    hooks.version = '2.29.4';

    setHookCallback(createLocal);

    hooks.fn = proto;
    hooks.min = min;
    hooks.max = max;
    hooks.now = now;
    hooks.utc = createUTC;
    hooks.unix = createUnix;
    hooks.months = listMonths;
    hooks.isDate = isDate;
    hooks.locale = getSetGlobalLocale;
    hooks.invalid = createInvalid;
    hooks.duration = createDuration;
    hooks.isMoment = isMoment;
    hooks.weekdays = listWeekdays;
    hooks.parseZone = createInZone;
    hooks.localeData = getLocale;
    hooks.isDuration = isDuration;
    hooks.monthsShort = listMonthsShort;
    hooks.weekdaysMin = listWeekdaysMin;
    hooks.defineLocale = defineLocale;
    hooks.updateLocale = updateLocale;
    hooks.locales = listLocales;
    hooks.weekdaysShort = listWeekdaysShort;
    hooks.normalizeUnits = normalizeUnits;
    hooks.relativeTimeRounding = getSetRelativeTimeRounding;
    hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;
    hooks.calendarFormat = getCalendarFormat;
    hooks.prototype = proto;

    // currently HTML5 input type only supports 24-hour formats
    hooks.HTML5_FMT = {
        DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // <input type="datetime-local" />
        DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // <input type="datetime-local" step="1" />
        DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // <input type="datetime-local" step="0.001" />
        DATE: 'YYYY-MM-DD', // <input type="date" />
        TIME: 'HH:mm', // <input type="time" />
        TIME_SECONDS: 'HH:mm:ss', // <input type="time" step="1" />
        TIME_MS: 'HH:mm:ss.SSS', // <input type="time" step="0.001" />
        WEEK: 'GGGG-[W]WW', // <input type="week" />
        MONTH: 'YYYY-MM', // <input type="month" />
    };

    return hooks;

})));
var profile = {
    resourceTags: {
        ignore: function(filename, mid){
            // only include moment/moment
            return mid != "moment/moment";
        },
        amd: function(filename, mid){
            return /\.js$/.test(filename);
        }
    }
};
{
  "name": "moment",
  "version": "2.29.4",
  "description": "Parse, validate, manipulate, and display dates",
  "homepage": "https://momentjs.com",
  "author": "Iskren Ivov Chernev <iskren.chernev@gmail.com> (https://github.com/ichernev)",
  "main": "./moment.js",
  "jsnext:main": "./dist/moment.js",
  "typings": "./moment.d.ts",
  "typesVersions": {
    ">=3.1": {
      "*": [
        "ts3.1-typings/*"
      ]
    }
  },
  "engines": {
    "node": "*"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/moment/moment.git"
  },
  "license": "MIT",
  "devDependencies": {
    "benchmark": "latest",
    "coveralls": "latest",
    "cross-env": "^6.0.3",
    "es6-promise": "latest",
    "eslint": "~6",
    "grunt": "latest",
    "grunt-benchmark": "latest",
    "grunt-cli": "latest",
    "grunt-contrib-clean": "latest",
    "grunt-contrib-concat": "latest",
    "grunt-contrib-copy": "latest",
    "grunt-contrib-uglify": "latest",
    "grunt-contrib-watch": "latest",
    "grunt-env": "latest",
    "grunt-exec": "latest",
    "grunt-karma": "latest",
    "grunt-nuget": "latest",
    "grunt-string-replace": "latest",
    "karma": "latest",
    "karma-chrome-launcher": "latest",
    "karma-firefox-launcher": "latest",
    "karma-qunit": "latest",
    "karma-sauce-launcher": "4.1.4",
    "load-grunt-tasks": "latest",
    "lodash": ">=4.17.19",
    "node-qunit": "latest",
    "nyc": "latest",
    "prettier": "latest",
    "qunit": "^2.10.0",
    "rollup": "2.17.1",
    "typescript": "^1.8.10",
    "typescript3": "npm:typescript@^3.1.6",
    "uglify-js": "latest"
  },
  "ender": "./ender.js",
  "dojoBuild": "package.js",
  "spm": {
    "main": "moment.js",
    "output": [
      "locale/*.js"
    ]
  }
}//! moment.js
//! version : 2.29.4
//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
//! license : MIT
//! momentjs.com

import { hooks as moment, setHookCallback } from './lib/utils/hooks';

moment.version = '2.29.4';

import {
    min,
    max,
    now,
    isMoment,
    momentPrototype as fn,
    createUTC as utc,
    createUnix as unix,
    createLocal as local,
    createInvalid as invalid,
    createInZone as parseZone,
} from './lib/moment/moment';

import { getCalendarFormat } from './lib/moment/calendar';

import {
    defineLocale,
    updateLocale,
    getSetGlobalLocale as locale,
    getLocale as localeData,
    listLocales as locales,
    listMonths as months,
    listMonthsShort as monthsShort,
    listWeekdays as weekdays,
    listWeekdaysMin as weekdaysMin,
    listWeekdaysShort as weekdaysShort,
} from './lib/locale/locale';

import {
    isDuration,
    createDuration as duration,
    getSetRelativeTimeRounding as relativeTimeRounding,
    getSetRelativeTimeThreshold as relativeTimeThreshold,
} from './lib/duration/duration';

import { normalizeUnits } from './lib/units/units';

import isDate from './lib/utils/is-date';

setHookCallback(local);

moment.fn = fn;
moment.min = min;
moment.max = max;
moment.now = now;
moment.utc = utc;
moment.unix = unix;
moment.months = months;
moment.isDate = isDate;
moment.locale = locale;
moment.invalid = invalid;
moment.duration = duration;
moment.isMoment = isMoment;
moment.weekdays = weekdays;
moment.parseZone = parseZone;
moment.localeData = localeData;
moment.isDuration = isDuration;
moment.monthsShort = monthsShort;
moment.weekdaysMin = weekdaysMin;
moment.defineLocale = defineLocale;
moment.updateLocale = updateLocale;
moment.locales = locales;
moment.weekdaysShort = weekdaysShort;
moment.normalizeUnits = normalizeUnits;
moment.relativeTimeRounding = relativeTimeRounding;
moment.relativeTimeThreshold = relativeTimeThreshold;
moment.calendarFormat = getCalendarFormat;
moment.prototype = fn;

// currently HTML5 input type only supports 24-hour formats
moment.HTML5_FMT = {
    DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // <input type="datetime-local" />
    DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // <input type="datetime-local" step="1" />
    DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // <input type="datetime-local" step="0.001" />
    DATE: 'YYYY-MM-DD', // <input type="date" />
    TIME: 'HH:mm', // <input type="time" />
    TIME_SECONDS: 'HH:mm:ss', // <input type="time" step="1" />
    TIME_MS: 'HH:mm:ss.SSS', // <input type="time" step="0.001" />
    WEEK: 'GGGG-[W]WW', // <input type="week" />
    MONTH: 'YYYY-MM', // <input type="month" />
};

export default moment;
//! moment.js locale configuration
//! locale : Afrikaans [af]
//! author : Werner Mollentze : https://github.com/wernerm

import moment from '../moment';

export default moment.defineLocale('af', {
    months: 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'),
    weekdays: 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split(
        '_'
    ),
    weekdaysShort: 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'),
    weekdaysMin: 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'),
    meridiemParse: /vm|nm/i,
    isPM: function (input) {
        return /^nm$/i.test(input);
    },
    meridiem: function (hours, minutes, isLower) {
        if (hours < 12) {
            return isLower ? 'vm' : 'VM';
        } else {
            return isLower ? 'nm' : 'NM';
        }
    },
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Vandag om] LT',
        nextDay: '[Môre om] LT',
        nextWeek: 'dddd [om] LT',
        lastDay: '[Gister om] LT',
        lastWeek: '[Laas] dddd [om] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'oor %s',
        past: '%s gelede',
        s: "'n paar sekondes",
        ss: '%d sekondes',
        m: "'n minuut",
        mm: '%d minute',
        h: "'n uur",
        hh: '%d ure',
        d: "'n dag",
        dd: '%d dae',
        M: "'n maand",
        MM: '%d maande',
        y: "'n jaar",
        yy: '%d jaar',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/,
    ordinal: function (number) {
        return (
            number +
            (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')
        ); // Thanks to Joris Röling : https://github.com/jjupiter
    },
    week: {
        dow: 1, // Maandag is die eerste dag van die week.
        doy: 4, // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
    },
});
//! moment.js locale configuration
//! locale : Arabic (Algeria) [ar-dz]
//! author : Amine Roukh: https://github.com/Amine27
//! author : Abdel Said: https://github.com/abdelsaid
//! author : Ahmed Elkhatib
//! author : forabi https://github.com/forabi
//! author : Noureddine LOUAHEDJ : https://github.com/noureddinem

import moment from '../moment';

var pluralForm = function (n) {
        return n === 0
            ? 0
            : n === 1
            ? 1
            : n === 2
            ? 2
            : n % 100 >= 3 && n % 100 <= 10
            ? 3
            : n % 100 >= 11
            ? 4
            : 5;
    },
    plurals = {
        s: [
            'أقل من ثانية',
            'ثانية واحدة',
            ['ثانيتان', 'ثانيتين'],
            '%d ثوان',
            '%d ثانية',
            '%d ثانية',
        ],
        m: [
            'أقل من دقيقة',
            'دقيقة واحدة',
            ['دقيقتان', 'دقيقتين'],
            '%d دقائق',
            '%d دقيقة',
            '%d دقيقة',
        ],
        h: [
            'أقل من ساعة',
            'ساعة واحدة',
            ['ساعتان', 'ساعتين'],
            '%d ساعات',
            '%d ساعة',
            '%d ساعة',
        ],
        d: [
            'أقل من يوم',
            'يوم واحد',
            ['يومان', 'يومين'],
            '%d أيام',
            '%d يومًا',
            '%d يوم',
        ],
        M: [
            'أقل من شهر',
            'شهر واحد',
            ['شهران', 'شهرين'],
            '%d أشهر',
            '%d شهرا',
            '%d شهر',
        ],
        y: [
            'أقل من عام',
            'عام واحد',
            ['عامان', 'عامين'],
            '%d أعوام',
            '%d عامًا',
            '%d عام',
        ],
    },
    pluralize = function (u) {
        return function (number, withoutSuffix, string, isFuture) {
            var f = pluralForm(number),
                str = plurals[u][pluralForm(number)];
            if (f === 2) {
                str = str[withoutSuffix ? 0 : 1];
            }
            return str.replace(/%d/i, number);
        };
    },
    months = [
        'جانفي',
        'فيفري',
        'مارس',
        'أفريل',
        'ماي',
        'جوان',
        'جويلية',
        'أوت',
        'سبتمبر',
        'أكتوبر',
        'نوفمبر',
        'ديسمبر',
    ];

export default moment.defineLocale('ar-dz', {
    months: months,
    monthsShort: months,
    weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
    weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'D/\u200FM/\u200FYYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    meridiemParse: /ص|م/,
    isPM: function (input) {
        return 'م' === input;
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return 'ص';
        } else {
            return 'م';
        }
    },
    calendar: {
        sameDay: '[اليوم عند الساعة] LT',
        nextDay: '[غدًا عند الساعة] LT',
        nextWeek: 'dddd [عند الساعة] LT',
        lastDay: '[أمس عند الساعة] LT',
        lastWeek: 'dddd [عند الساعة] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'بعد %s',
        past: 'منذ %s',
        s: pluralize('s'),
        ss: pluralize('s'),
        m: pluralize('m'),
        mm: pluralize('m'),
        h: pluralize('h'),
        hh: pluralize('h'),
        d: pluralize('d'),
        dd: pluralize('d'),
        M: pluralize('M'),
        MM: pluralize('M'),
        y: pluralize('y'),
        yy: pluralize('y'),
    },
    postformat: function (string) {
        return string.replace(/,/g, '،');
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Arabic (Kuwait) [ar-kw]
//! author : Nusret Parlak: https://github.com/nusretparlak

import moment from '../moment';

export default moment.defineLocale('ar-kw', {
    months: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(
        '_'
    ),
    monthsShort:
        'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(
            '_'
        ),
    weekdays: 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
    weekdaysShort: 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[اليوم على الساعة] LT',
        nextDay: '[غدا على الساعة] LT',
        nextWeek: 'dddd [على الساعة] LT',
        lastDay: '[أمس على الساعة] LT',
        lastWeek: 'dddd [على الساعة] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'في %s',
        past: 'منذ %s',
        s: 'ثوان',
        ss: '%d ثانية',
        m: 'دقيقة',
        mm: '%d دقائق',
        h: 'ساعة',
        hh: '%d ساعات',
        d: 'يوم',
        dd: '%d أيام',
        M: 'شهر',
        MM: '%d أشهر',
        y: 'سنة',
        yy: '%d سنوات',
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 12, // The week that contains Jan 12th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Arabic (Libya) [ar-ly]
//! author : Ali Hmer: https://github.com/kikoanis

import moment from '../moment';

var symbolMap = {
        1: '1',
        2: '2',
        3: '3',
        4: '4',
        5: '5',
        6: '6',
        7: '7',
        8: '8',
        9: '9',
        0: '0',
    },
    pluralForm = function (n) {
        return n === 0
            ? 0
            : n === 1
            ? 1
            : n === 2
            ? 2
            : n % 100 >= 3 && n % 100 <= 10
            ? 3
            : n % 100 >= 11
            ? 4
            : 5;
    },
    plurals = {
        s: [
            'أقل من ثانية',
            'ثانية واحدة',
            ['ثانيتان', 'ثانيتين'],
            '%d ثوان',
            '%d ثانية',
            '%d ثانية',
        ],
        m: [
            'أقل من دقيقة',
            'دقيقة واحدة',
            ['دقيقتان', 'دقيقتين'],
            '%d دقائق',
            '%d دقيقة',
            '%d دقيقة',
        ],
        h: [
            'أقل من ساعة',
            'ساعة واحدة',
            ['ساعتان', 'ساعتين'],
            '%d ساعات',
            '%d ساعة',
            '%d ساعة',
        ],
        d: [
            'أقل من يوم',
            'يوم واحد',
            ['يومان', 'يومين'],
            '%d أيام',
            '%d يومًا',
            '%d يوم',
        ],
        M: [
            'أقل من شهر',
            'شهر واحد',
            ['شهران', 'شهرين'],
            '%d أشهر',
            '%d شهرا',
            '%d شهر',
        ],
        y: [
            'أقل من عام',
            'عام واحد',
            ['عامان', 'عامين'],
            '%d أعوام',
            '%d عامًا',
            '%d عام',
        ],
    },
    pluralize = function (u) {
        return function (number, withoutSuffix, string, isFuture) {
            var f = pluralForm(number),
                str = plurals[u][pluralForm(number)];
            if (f === 2) {
                str = str[withoutSuffix ? 0 : 1];
            }
            return str.replace(/%d/i, number);
        };
    },
    months = [
        'يناير',
        'فبراير',
        'مارس',
        'أبريل',
        'مايو',
        'يونيو',
        'يوليو',
        'أغسطس',
        'سبتمبر',
        'أكتوبر',
        'نوفمبر',
        'ديسمبر',
    ];

export default moment.defineLocale('ar-ly', {
    months: months,
    monthsShort: months,
    weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
    weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'D/\u200FM/\u200FYYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    meridiemParse: /ص|م/,
    isPM: function (input) {
        return 'م' === input;
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return 'ص';
        } else {
            return 'م';
        }
    },
    calendar: {
        sameDay: '[اليوم عند الساعة] LT',
        nextDay: '[غدًا عند الساعة] LT',
        nextWeek: 'dddd [عند الساعة] LT',
        lastDay: '[أمس عند الساعة] LT',
        lastWeek: 'dddd [عند الساعة] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'بعد %s',
        past: 'منذ %s',
        s: pluralize('s'),
        ss: pluralize('s'),
        m: pluralize('m'),
        mm: pluralize('m'),
        h: pluralize('h'),
        hh: pluralize('h'),
        d: pluralize('d'),
        dd: pluralize('d'),
        M: pluralize('M'),
        MM: pluralize('M'),
        y: pluralize('y'),
        yy: pluralize('y'),
    },
    preparse: function (string) {
        return string.replace(/،/g, ',');
    },
    postformat: function (string) {
        return string
            .replace(/\d/g, function (match) {
                return symbolMap[match];
            })
            .replace(/,/g, '،');
    },
    week: {
        dow: 6, // Saturday is the first day of the week.
        doy: 12, // The week that contains Jan 12th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Arabic (Morocco) [ar-ma]
//! author : ElFadili Yassine : https://github.com/ElFadiliY
//! author : Abdel Said : https://github.com/abdelsaid

import moment from '../moment';

export default moment.defineLocale('ar-ma', {
    months: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(
        '_'
    ),
    monthsShort:
        'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(
            '_'
        ),
    weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
    weekdaysShort: 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[اليوم على الساعة] LT',
        nextDay: '[غدا على الساعة] LT',
        nextWeek: 'dddd [على الساعة] LT',
        lastDay: '[أمس على الساعة] LT',
        lastWeek: 'dddd [على الساعة] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'في %s',
        past: 'منذ %s',
        s: 'ثوان',
        ss: '%d ثانية',
        m: 'دقيقة',
        mm: '%d دقائق',
        h: 'ساعة',
        hh: '%d ساعات',
        d: 'يوم',
        dd: '%d أيام',
        M: 'شهر',
        MM: '%d أشهر',
        y: 'سنة',
        yy: '%d سنوات',
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Arabic (Saudi Arabia) [ar-sa]
//! author : Suhail Alkowaileet : https://github.com/xsoh

import moment from '../moment';

var symbolMap = {
        1: '١',
        2: '٢',
        3: '٣',
        4: '٤',
        5: '٥',
        6: '٦',
        7: '٧',
        8: '٨',
        9: '٩',
        0: '٠',
    },
    numberMap = {
        '١': '1',
        '٢': '2',
        '٣': '3',
        '٤': '4',
        '٥': '5',
        '٦': '6',
        '٧': '7',
        '٨': '8',
        '٩': '9',
        '٠': '0',
    };

export default moment.defineLocale('ar-sa', {
    months: 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(
        '_'
    ),
    monthsShort:
        'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(
            '_'
        ),
    weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
    weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    meridiemParse: /ص|م/,
    isPM: function (input) {
        return 'م' === input;
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return 'ص';
        } else {
            return 'م';
        }
    },
    calendar: {
        sameDay: '[اليوم على الساعة] LT',
        nextDay: '[غدا على الساعة] LT',
        nextWeek: 'dddd [على الساعة] LT',
        lastDay: '[أمس على الساعة] LT',
        lastWeek: 'dddd [على الساعة] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'في %s',
        past: 'منذ %s',
        s: 'ثوان',
        ss: '%d ثانية',
        m: 'دقيقة',
        mm: '%d دقائق',
        h: 'ساعة',
        hh: '%d ساعات',
        d: 'يوم',
        dd: '%d أيام',
        M: 'شهر',
        MM: '%d أشهر',
        y: 'سنة',
        yy: '%d سنوات',
    },
    preparse: function (string) {
        return string
            .replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
                return numberMap[match];
            })
            .replace(/،/g, ',');
    },
    postformat: function (string) {
        return string
            .replace(/\d/g, function (match) {
                return symbolMap[match];
            })
            .replace(/,/g, '،');
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale  :  Arabic (Tunisia) [ar-tn]
//! author : Nader Toukabri : https://github.com/naderio

import moment from '../moment';

export default moment.defineLocale('ar-tn', {
    months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(
        '_'
    ),
    monthsShort:
        'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(
            '_'
        ),
    weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
    weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[اليوم على الساعة] LT',
        nextDay: '[غدا على الساعة] LT',
        nextWeek: 'dddd [على الساعة] LT',
        lastDay: '[أمس على الساعة] LT',
        lastWeek: 'dddd [على الساعة] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'في %s',
        past: 'منذ %s',
        s: 'ثوان',
        ss: '%d ثانية',
        m: 'دقيقة',
        mm: '%d دقائق',
        h: 'ساعة',
        hh: '%d ساعات',
        d: 'يوم',
        dd: '%d أيام',
        M: 'شهر',
        MM: '%d أشهر',
        y: 'سنة',
        yy: '%d سنوات',
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Arabic [ar]
//! author : Abdel Said: https://github.com/abdelsaid
//! author : Ahmed Elkhatib
//! author : forabi https://github.com/forabi

import moment from '../moment';

var symbolMap = {
        1: '١',
        2: '٢',
        3: '٣',
        4: '٤',
        5: '٥',
        6: '٦',
        7: '٧',
        8: '٨',
        9: '٩',
        0: '٠',
    },
    numberMap = {
        '١': '1',
        '٢': '2',
        '٣': '3',
        '٤': '4',
        '٥': '5',
        '٦': '6',
        '٧': '7',
        '٨': '8',
        '٩': '9',
        '٠': '0',
    },
    pluralForm = function (n) {
        return n === 0
            ? 0
            : n === 1
            ? 1
            : n === 2
            ? 2
            : n % 100 >= 3 && n % 100 <= 10
            ? 3
            : n % 100 >= 11
            ? 4
            : 5;
    },
    plurals = {
        s: [
            'أقل من ثانية',
            'ثانية واحدة',
            ['ثانيتان', 'ثانيتين'],
            '%d ثوان',
            '%d ثانية',
            '%d ثانية',
        ],
        m: [
            'أقل من دقيقة',
            'دقيقة واحدة',
            ['دقيقتان', 'دقيقتين'],
            '%d دقائق',
            '%d دقيقة',
            '%d دقيقة',
        ],
        h: [
            'أقل من ساعة',
            'ساعة واحدة',
            ['ساعتان', 'ساعتين'],
            '%d ساعات',
            '%d ساعة',
            '%d ساعة',
        ],
        d: [
            'أقل من يوم',
            'يوم واحد',
            ['يومان', 'يومين'],
            '%d أيام',
            '%d يومًا',
            '%d يوم',
        ],
        M: [
            'أقل من شهر',
            'شهر واحد',
            ['شهران', 'شهرين'],
            '%d أشهر',
            '%d شهرا',
            '%d شهر',
        ],
        y: [
            'أقل من عام',
            'عام واحد',
            ['عامان', 'عامين'],
            '%d أعوام',
            '%d عامًا',
            '%d عام',
        ],
    },
    pluralize = function (u) {
        return function (number, withoutSuffix, string, isFuture) {
            var f = pluralForm(number),
                str = plurals[u][pluralForm(number)];
            if (f === 2) {
                str = str[withoutSuffix ? 0 : 1];
            }
            return str.replace(/%d/i, number);
        };
    },
    months = [
        'يناير',
        'فبراير',
        'مارس',
        'أبريل',
        'مايو',
        'يونيو',
        'يوليو',
        'أغسطس',
        'سبتمبر',
        'أكتوبر',
        'نوفمبر',
        'ديسمبر',
    ];

export default moment.defineLocale('ar', {
    months: months,
    monthsShort: months,
    weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
    weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'D/\u200FM/\u200FYYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    meridiemParse: /ص|م/,
    isPM: function (input) {
        return 'م' === input;
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return 'ص';
        } else {
            return 'م';
        }
    },
    calendar: {
        sameDay: '[اليوم عند الساعة] LT',
        nextDay: '[غدًا عند الساعة] LT',
        nextWeek: 'dddd [عند الساعة] LT',
        lastDay: '[أمس عند الساعة] LT',
        lastWeek: 'dddd [عند الساعة] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'بعد %s',
        past: 'منذ %s',
        s: pluralize('s'),
        ss: pluralize('s'),
        m: pluralize('m'),
        mm: pluralize('m'),
        h: pluralize('h'),
        hh: pluralize('h'),
        d: pluralize('d'),
        dd: pluralize('d'),
        M: pluralize('M'),
        MM: pluralize('M'),
        y: pluralize('y'),
        yy: pluralize('y'),
    },
    preparse: function (string) {
        return string
            .replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
                return numberMap[match];
            })
            .replace(/،/g, ',');
    },
    postformat: function (string) {
        return string
            .replace(/\d/g, function (match) {
                return symbolMap[match];
            })
            .replace(/,/g, '،');
    },
    week: {
        dow: 6, // Saturday is the first day of the week.
        doy: 12, // The week that contains Jan 12th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Azerbaijani [az]
//! author : topchiyev : https://github.com/topchiyev

import moment from '../moment';

var suffixes = {
    1: '-inci',
    5: '-inci',
    8: '-inci',
    70: '-inci',
    80: '-inci',
    2: '-nci',
    7: '-nci',
    20: '-nci',
    50: '-nci',
    3: '-üncü',
    4: '-üncü',
    100: '-üncü',
    6: '-ncı',
    9: '-uncu',
    10: '-uncu',
    30: '-uncu',
    60: '-ıncı',
    90: '-ıncı',
};

export default moment.defineLocale('az', {
    months: 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split(
        '_'
    ),
    monthsShort: 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'),
    weekdays:
        'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split(
            '_'
        ),
    weekdaysShort: 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'),
    weekdaysMin: 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[bugün saat] LT',
        nextDay: '[sabah saat] LT',
        nextWeek: '[gələn həftə] dddd [saat] LT',
        lastDay: '[dünən] LT',
        lastWeek: '[keçən həftə] dddd [saat] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s sonra',
        past: '%s əvvəl',
        s: 'bir neçə saniyə',
        ss: '%d saniyə',
        m: 'bir dəqiqə',
        mm: '%d dəqiqə',
        h: 'bir saat',
        hh: '%d saat',
        d: 'bir gün',
        dd: '%d gün',
        M: 'bir ay',
        MM: '%d ay',
        y: 'bir il',
        yy: '%d il',
    },
    meridiemParse: /gecə|səhər|gündüz|axşam/,
    isPM: function (input) {
        return /^(gündüz|axşam)$/.test(input);
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'gecə';
        } else if (hour < 12) {
            return 'səhər';
        } else if (hour < 17) {
            return 'gündüz';
        } else {
            return 'axşam';
        }
    },
    dayOfMonthOrdinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,
    ordinal: function (number) {
        if (number === 0) {
            // special case for zero
            return number + '-ıncı';
        }
        var a = number % 10,
            b = (number % 100) - a,
            c = number >= 100 ? 100 : null;
        return number + (suffixes[a] || suffixes[b] || suffixes[c]);
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Belarusian [be]
//! author : Dmitry Demidov : https://github.com/demidov91
//! author: Praleska: http://praleska.pro/
//! Author : Menelion Elensúle : https://github.com/Oire

import moment from '../moment';

function plural(word, num) {
    var forms = word.split('_');
    return num % 10 === 1 && num % 100 !== 11
        ? forms[0]
        : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20)
        ? forms[1]
        : forms[2];
}
function relativeTimeWithPlural(number, withoutSuffix, key) {
    var format = {
        ss: withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд',
        mm: withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін',
        hh: withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін',
        dd: 'дзень_дні_дзён',
        MM: 'месяц_месяцы_месяцаў',
        yy: 'год_гады_гадоў',
    };
    if (key === 'm') {
        return withoutSuffix ? 'хвіліна' : 'хвіліну';
    } else if (key === 'h') {
        return withoutSuffix ? 'гадзіна' : 'гадзіну';
    } else {
        return number + ' ' + plural(format[key], +number);
    }
}

export default moment.defineLocale('be', {
    months: {
        format: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split(
            '_'
        ),
        standalone:
            'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split(
                '_'
            ),
    },
    monthsShort:
        'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'),
    weekdays: {
        format: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split(
            '_'
        ),
        standalone:
            'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split(
                '_'
            ),
        isFormat: /\[ ?[Ууў] ?(?:мінулую|наступную)? ?\] ?dddd/,
    },
    weekdaysShort: 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
    weekdaysMin: 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY г.',
        LLL: 'D MMMM YYYY г., HH:mm',
        LLLL: 'dddd, D MMMM YYYY г., HH:mm',
    },
    calendar: {
        sameDay: '[Сёння ў] LT',
        nextDay: '[Заўтра ў] LT',
        lastDay: '[Учора ў] LT',
        nextWeek: function () {
            return '[У] dddd [ў] LT';
        },
        lastWeek: function () {
            switch (this.day()) {
                case 0:
                case 3:
                case 5:
                case 6:
                    return '[У мінулую] dddd [ў] LT';
                case 1:
                case 2:
                case 4:
                    return '[У мінулы] dddd [ў] LT';
            }
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'праз %s',
        past: '%s таму',
        s: 'некалькі секунд',
        m: relativeTimeWithPlural,
        mm: relativeTimeWithPlural,
        h: relativeTimeWithPlural,
        hh: relativeTimeWithPlural,
        d: 'дзень',
        dd: relativeTimeWithPlural,
        M: 'месяц',
        MM: relativeTimeWithPlural,
        y: 'год',
        yy: relativeTimeWithPlural,
    },
    meridiemParse: /ночы|раніцы|дня|вечара/,
    isPM: function (input) {
        return /^(дня|вечара)$/.test(input);
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'ночы';
        } else if (hour < 12) {
            return 'раніцы';
        } else if (hour < 17) {
            return 'дня';
        } else {
            return 'вечара';
        }
    },
    dayOfMonthOrdinalParse: /\d{1,2}-(і|ы|га)/,
    ordinal: function (number, period) {
        switch (period) {
            case 'M':
            case 'd':
            case 'DDD':
            case 'w':
            case 'W':
                return (number % 10 === 2 || number % 10 === 3) &&
                    number % 100 !== 12 &&
                    number % 100 !== 13
                    ? number + '-і'
                    : number + '-ы';
            case 'D':
                return number + '-га';
            default:
                return number;
        }
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Bulgarian [bg]
//! author : Krasen Borisov : https://github.com/kraz

import moment from '../moment';

export default moment.defineLocale('bg', {
    months: 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split(
        '_'
    ),
    monthsShort: 'яну_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'),
    weekdays: 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split(
        '_'
    ),
    weekdaysShort: 'нед_пон_вто_сря_чет_пет_съб'.split('_'),
    weekdaysMin: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'D.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY H:mm',
        LLLL: 'dddd, D MMMM YYYY H:mm',
    },
    calendar: {
        sameDay: '[Днес в] LT',
        nextDay: '[Утре в] LT',
        nextWeek: 'dddd [в] LT',
        lastDay: '[Вчера в] LT',
        lastWeek: function () {
            switch (this.day()) {
                case 0:
                case 3:
                case 6:
                    return '[Миналата] dddd [в] LT';
                case 1:
                case 2:
                case 4:
                case 5:
                    return '[Миналия] dddd [в] LT';
            }
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'след %s',
        past: 'преди %s',
        s: 'няколко секунди',
        ss: '%d секунди',
        m: 'минута',
        mm: '%d минути',
        h: 'час',
        hh: '%d часа',
        d: 'ден',
        dd: '%d дена',
        w: 'седмица',
        ww: '%d седмици',
        M: 'месец',
        MM: '%d месеца',
        y: 'година',
        yy: '%d години',
    },
    dayOfMonthOrdinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/,
    ordinal: function (number) {
        var lastDigit = number % 10,
            last2Digits = number % 100;
        if (number === 0) {
            return number + '-ев';
        } else if (last2Digits === 0) {
            return number + '-ен';
        } else if (last2Digits > 10 && last2Digits < 20) {
            return number + '-ти';
        } else if (lastDigit === 1) {
            return number + '-ви';
        } else if (lastDigit === 2) {
            return number + '-ри';
        } else if (lastDigit === 7 || lastDigit === 8) {
            return number + '-ми';
        } else {
            return number + '-ти';
        }
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Bambara [bm]
//! author : Estelle Comment : https://github.com/estellecomment
// Language contact person : Abdoufata Kane : https://github.com/abdoufata

import moment from '../moment';

export default moment.defineLocale('bm', {
    months: 'Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_Mɛkalo_Zuwɛnkalo_Zuluyekalo_Utikalo_Sɛtanburukalo_ɔkutɔburukalo_Nowanburukalo_Desanburukalo'.split(
        '_'
    ),
    monthsShort: 'Zan_Few_Mar_Awi_Mɛ_Zuw_Zul_Uti_Sɛt_ɔku_Now_Des'.split('_'),
    weekdays: 'Kari_Ntɛnɛn_Tarata_Araba_Alamisa_Juma_Sibiri'.split('_'),
    weekdaysShort: 'Kar_Ntɛ_Tar_Ara_Ala_Jum_Sib'.split('_'),
    weekdaysMin: 'Ka_Nt_Ta_Ar_Al_Ju_Si'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'MMMM [tile] D [san] YYYY',
        LLL: 'MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm',
        LLLL: 'dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm',
    },
    calendar: {
        sameDay: '[Bi lɛrɛ] LT',
        nextDay: '[Sini lɛrɛ] LT',
        nextWeek: 'dddd [don lɛrɛ] LT',
        lastDay: '[Kunu lɛrɛ] LT',
        lastWeek: 'dddd [tɛmɛnen lɛrɛ] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s kɔnɔ',
        past: 'a bɛ %s bɔ',
        s: 'sanga dama dama',
        ss: 'sekondi %d',
        m: 'miniti kelen',
        mm: 'miniti %d',
        h: 'lɛrɛ kelen',
        hh: 'lɛrɛ %d',
        d: 'tile kelen',
        dd: 'tile %d',
        M: 'kalo kelen',
        MM: 'kalo %d',
        y: 'san kelen',
        yy: 'san %d',
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Bengali (Bangladesh) [bn-bd]
//! author : Asraf Hossain Patoary : https://github.com/ashwoolford

import moment from '../moment';

var symbolMap = {
        1: '১',
        2: '২',
        3: '৩',
        4: '৪',
        5: '৫',
        6: '৬',
        7: '৭',
        8: '৮',
        9: '৯',
        0: '০',
    },
    numberMap = {
        '১': '1',
        '২': '2',
        '৩': '3',
        '৪': '4',
        '৫': '5',
        '৬': '6',
        '৭': '7',
        '৮': '8',
        '৯': '9',
        '০': '0',
    };

export default moment.defineLocale('bn-bd', {
    months: 'জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split(
        '_'
    ),
    monthsShort:
        'জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে'.split(
            '_'
        ),
    weekdays: 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split(
        '_'
    ),
    weekdaysShort: 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),
    weekdaysMin: 'রবি_সোম_মঙ্গল_বুধ_বৃহ_শুক্র_শনি'.split('_'),
    longDateFormat: {
        LT: 'A h:mm সময়',
        LTS: 'A h:mm:ss সময়',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY, A h:mm সময়',
        LLLL: 'dddd, D MMMM YYYY, A h:mm সময়',
    },
    calendar: {
        sameDay: '[আজ] LT',
        nextDay: '[আগামীকাল] LT',
        nextWeek: 'dddd, LT',
        lastDay: '[গতকাল] LT',
        lastWeek: '[গত] dddd, LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s পরে',
        past: '%s আগে',
        s: 'কয়েক সেকেন্ড',
        ss: '%d সেকেন্ড',
        m: 'এক মিনিট',
        mm: '%d মিনিট',
        h: 'এক ঘন্টা',
        hh: '%d ঘন্টা',
        d: 'এক দিন',
        dd: '%d দিন',
        M: 'এক মাস',
        MM: '%d মাস',
        y: 'এক বছর',
        yy: '%d বছর',
    },
    preparse: function (string) {
        return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {
            return numberMap[match];
        });
    },
    postformat: function (string) {
        return string.replace(/\d/g, function (match) {
            return symbolMap[match];
        });
    },

    meridiemParse: /রাত|ভোর|সকাল|দুপুর|বিকাল|সন্ধ্যা|রাত/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'রাত') {
            return hour < 4 ? hour : hour + 12;
        } else if (meridiem === 'ভোর') {
            return hour;
        } else if (meridiem === 'সকাল') {
            return hour;
        } else if (meridiem === 'দুপুর') {
            return hour >= 3 ? hour : hour + 12;
        } else if (meridiem === 'বিকাল') {
            return hour + 12;
        } else if (meridiem === 'সন্ধ্যা') {
            return hour + 12;
        }
    },

    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'রাত';
        } else if (hour < 6) {
            return 'ভোর';
        } else if (hour < 12) {
            return 'সকাল';
        } else if (hour < 15) {
            return 'দুপুর';
        } else if (hour < 18) {
            return 'বিকাল';
        } else if (hour < 20) {
            return 'সন্ধ্যা';
        } else {
            return 'রাত';
        }
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Bengali [bn]
//! author : Kaushik Gandhi : https://github.com/kaushikgandhi

import moment from '../moment';

var symbolMap = {
        1: '১',
        2: '২',
        3: '৩',
        4: '৪',
        5: '৫',
        6: '৬',
        7: '৭',
        8: '৮',
        9: '৯',
        0: '০',
    },
    numberMap = {
        '১': '1',
        '২': '2',
        '৩': '3',
        '৪': '4',
        '৫': '5',
        '৬': '6',
        '৭': '7',
        '৮': '8',
        '৯': '9',
        '০': '0',
    };

export default moment.defineLocale('bn', {
    months: 'জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split(
        '_'
    ),
    monthsShort:
        'জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে'.split(
            '_'
        ),
    weekdays: 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split(
        '_'
    ),
    weekdaysShort: 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),
    weekdaysMin: 'রবি_সোম_মঙ্গল_বুধ_বৃহ_শুক্র_শনি'.split('_'),
    longDateFormat: {
        LT: 'A h:mm সময়',
        LTS: 'A h:mm:ss সময়',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY, A h:mm সময়',
        LLLL: 'dddd, D MMMM YYYY, A h:mm সময়',
    },
    calendar: {
        sameDay: '[আজ] LT',
        nextDay: '[আগামীকাল] LT',
        nextWeek: 'dddd, LT',
        lastDay: '[গতকাল] LT',
        lastWeek: '[গত] dddd, LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s পরে',
        past: '%s আগে',
        s: 'কয়েক সেকেন্ড',
        ss: '%d সেকেন্ড',
        m: 'এক মিনিট',
        mm: '%d মিনিট',
        h: 'এক ঘন্টা',
        hh: '%d ঘন্টা',
        d: 'এক দিন',
        dd: '%d দিন',
        M: 'এক মাস',
        MM: '%d মাস',
        y: 'এক বছর',
        yy: '%d বছর',
    },
    preparse: function (string) {
        return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {
            return numberMap[match];
        });
    },
    postformat: function (string) {
        return string.replace(/\d/g, function (match) {
            return symbolMap[match];
        });
    },
    meridiemParse: /রাত|সকাল|দুপুর|বিকাল|রাত/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (
            (meridiem === 'রাত' && hour >= 4) ||
            (meridiem === 'দুপুর' && hour < 5) ||
            meridiem === 'বিকাল'
        ) {
            return hour + 12;
        } else {
            return hour;
        }
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'রাত';
        } else if (hour < 10) {
            return 'সকাল';
        } else if (hour < 17) {
            return 'দুপুর';
        } else if (hour < 20) {
            return 'বিকাল';
        } else {
            return 'রাত';
        }
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Tibetan [bo]
//! author : Thupten N. Chakrishar : https://github.com/vajradog

import moment from '../moment';

var symbolMap = {
        1: '༡',
        2: '༢',
        3: '༣',
        4: '༤',
        5: '༥',
        6: '༦',
        7: '༧',
        8: '༨',
        9: '༩',
        0: '༠',
    },
    numberMap = {
        '༡': '1',
        '༢': '2',
        '༣': '3',
        '༤': '4',
        '༥': '5',
        '༦': '6',
        '༧': '7',
        '༨': '8',
        '༩': '9',
        '༠': '0',
    };

export default moment.defineLocale('bo', {
    months: 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split(
        '_'
    ),
    monthsShort:
        'ཟླ་1_ཟླ་2_ཟླ་3_ཟླ་4_ཟླ་5_ཟླ་6_ཟླ་7_ཟླ་8_ཟླ་9_ཟླ་10_ཟླ་11_ཟླ་12'.split(
            '_'
        ),
    monthsShortRegex: /^(ཟླ་\d{1,2})/,
    monthsParseExact: true,
    weekdays:
        'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split(
            '_'
        ),
    weekdaysShort: 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split(
        '_'
    ),
    weekdaysMin: 'ཉི_ཟླ_མིག_ལྷག_ཕུར_སངས_སྤེན'.split('_'),
    longDateFormat: {
        LT: 'A h:mm',
        LTS: 'A h:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY, A h:mm',
        LLLL: 'dddd, D MMMM YYYY, A h:mm',
    },
    calendar: {
        sameDay: '[དི་རིང] LT',
        nextDay: '[སང་ཉིན] LT',
        nextWeek: '[བདུན་ཕྲག་རྗེས་མ], LT',
        lastDay: '[ཁ་སང] LT',
        lastWeek: '[བདུན་ཕྲག་མཐའ་མ] dddd, LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s ལ་',
        past: '%s སྔན་ལ',
        s: 'ལམ་སང',
        ss: '%d སྐར་ཆ།',
        m: 'སྐར་མ་གཅིག',
        mm: '%d སྐར་མ',
        h: 'ཆུ་ཚོད་གཅིག',
        hh: '%d ཆུ་ཚོད',
        d: 'ཉིན་གཅིག',
        dd: '%d ཉིན་',
        M: 'ཟླ་བ་གཅིག',
        MM: '%d ཟླ་བ',
        y: 'ལོ་གཅིག',
        yy: '%d ལོ',
    },
    preparse: function (string) {
        return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) {
            return numberMap[match];
        });
    },
    postformat: function (string) {
        return string.replace(/\d/g, function (match) {
            return symbolMap[match];
        });
    },
    meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (
            (meridiem === 'མཚན་མོ' && hour >= 4) ||
            (meridiem === 'ཉིན་གུང' && hour < 5) ||
            meridiem === 'དགོང་དག'
        ) {
            return hour + 12;
        } else {
            return hour;
        }
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'མཚན་མོ';
        } else if (hour < 10) {
            return 'ཞོགས་ཀས';
        } else if (hour < 17) {
            return 'ཉིན་གུང';
        } else if (hour < 20) {
            return 'དགོང་དག';
        } else {
            return 'མཚན་མོ';
        }
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Breton [br]
//! author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou

import moment from '../moment';

function relativeTimeWithMutation(number, withoutSuffix, key) {
    var format = {
        mm: 'munutenn',
        MM: 'miz',
        dd: 'devezh',
    };
    return number + ' ' + mutation(format[key], number);
}
function specialMutationForYears(number) {
    switch (lastNumber(number)) {
        case 1:
        case 3:
        case 4:
        case 5:
        case 9:
            return number + ' bloaz';
        default:
            return number + ' vloaz';
    }
}
function lastNumber(number) {
    if (number > 9) {
        return lastNumber(number % 10);
    }
    return number;
}
function mutation(text, number) {
    if (number === 2) {
        return softMutation(text);
    }
    return text;
}
function softMutation(text) {
    var mutationTable = {
        m: 'v',
        b: 'v',
        d: 'z',
    };
    if (mutationTable[text.charAt(0)] === undefined) {
        return text;
    }
    return mutationTable[text.charAt(0)] + text.substring(1);
}

var monthsParse = [
        /^gen/i,
        /^c[ʼ\']hwe/i,
        /^meu/i,
        /^ebr/i,
        /^mae/i,
        /^(mez|eve)/i,
        /^gou/i,
        /^eos/i,
        /^gwe/i,
        /^her/i,
        /^du/i,
        /^ker/i,
    ],
    monthsRegex =
        /^(genver|c[ʼ\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu|gen|c[ʼ\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,
    monthsStrictRegex =
        /^(genver|c[ʼ\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu)/i,
    monthsShortStrictRegex =
        /^(gen|c[ʼ\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,
    fullWeekdaysParse = [
        /^sul/i,
        /^lun/i,
        /^meurzh/i,
        /^merc[ʼ\']her/i,
        /^yaou/i,
        /^gwener/i,
        /^sadorn/i,
    ],
    shortWeekdaysParse = [
        /^Sul/i,
        /^Lun/i,
        /^Meu/i,
        /^Mer/i,
        /^Yao/i,
        /^Gwe/i,
        /^Sad/i,
    ],
    minWeekdaysParse = [
        /^Su/i,
        /^Lu/i,
        /^Me([^r]|$)/i,
        /^Mer/i,
        /^Ya/i,
        /^Gw/i,
        /^Sa/i,
    ];

export default moment.defineLocale('br', {
    months: 'Genver_Cʼhwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split(
        '_'
    ),
    monthsShort: 'Gen_Cʼhwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'),
    weekdays: 'Sul_Lun_Meurzh_Mercʼher_Yaou_Gwener_Sadorn'.split('_'),
    weekdaysShort: 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'),
    weekdaysMin: 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'),
    weekdaysParse: minWeekdaysParse,
    fullWeekdaysParse: fullWeekdaysParse,
    shortWeekdaysParse: shortWeekdaysParse,
    minWeekdaysParse: minWeekdaysParse,

    monthsRegex: monthsRegex,
    monthsShortRegex: monthsRegex,
    monthsStrictRegex: monthsStrictRegex,
    monthsShortStrictRegex: monthsShortStrictRegex,
    monthsParse: monthsParse,
    longMonthsParse: monthsParse,
    shortMonthsParse: monthsParse,

    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D [a viz] MMMM YYYY',
        LLL: 'D [a viz] MMMM YYYY HH:mm',
        LLLL: 'dddd, D [a viz] MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Hiziv da] LT',
        nextDay: '[Warcʼhoazh da] LT',
        nextWeek: 'dddd [da] LT',
        lastDay: '[Decʼh da] LT',
        lastWeek: 'dddd [paset da] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'a-benn %s',
        past: '%s ʼzo',
        s: 'un nebeud segondennoù',
        ss: '%d eilenn',
        m: 'ur vunutenn',
        mm: relativeTimeWithMutation,
        h: 'un eur',
        hh: '%d eur',
        d: 'un devezh',
        dd: relativeTimeWithMutation,
        M: 'ur miz',
        MM: relativeTimeWithMutation,
        y: 'ur bloaz',
        yy: specialMutationForYears,
    },
    dayOfMonthOrdinalParse: /\d{1,2}(añ|vet)/,
    ordinal: function (number) {
        var output = number === 1 ? 'añ' : 'vet';
        return number + output;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
    meridiemParse: /a.m.|g.m./, // goude merenn | a-raok merenn
    isPM: function (token) {
        return token === 'g.m.';
    },
    meridiem: function (hour, minute, isLower) {
        return hour < 12 ? 'a.m.' : 'g.m.';
    },
});
//! moment.js locale configuration
//! locale : Bosnian [bs]
//! author : Nedim Cholich : https://github.com/frontyard
//! based on (hr) translation by Bojan Marković

import moment from '../moment';

function translate(number, withoutSuffix, key) {
    var result = number + ' ';
    switch (key) {
        case 'ss':
            if (number === 1) {
                result += 'sekunda';
            } else if (number === 2 || number === 3 || number === 4) {
                result += 'sekunde';
            } else {
                result += 'sekundi';
            }
            return result;
        case 'm':
            return withoutSuffix ? 'jedna minuta' : 'jedne minute';
        case 'mm':
            if (number === 1) {
                result += 'minuta';
            } else if (number === 2 || number === 3 || number === 4) {
                result += 'minute';
            } else {
                result += 'minuta';
            }
            return result;
        case 'h':
            return withoutSuffix ? 'jedan sat' : 'jednog sata';
        case 'hh':
            if (number === 1) {
                result += 'sat';
            } else if (number === 2 || number === 3 || number === 4) {
                result += 'sata';
            } else {
                result += 'sati';
            }
            return result;
        case 'dd':
            if (number === 1) {
                result += 'dan';
            } else {
                result += 'dana';
            }
            return result;
        case 'MM':
            if (number === 1) {
                result += 'mjesec';
            } else if (number === 2 || number === 3 || number === 4) {
                result += 'mjeseca';
            } else {
                result += 'mjeseci';
            }
            return result;
        case 'yy':
            if (number === 1) {
                result += 'godina';
            } else if (number === 2 || number === 3 || number === 4) {
                result += 'godine';
            } else {
                result += 'godina';
            }
            return result;
    }
}

export default moment.defineLocale('bs', {
    months: 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split(
        '_'
    ),
    monthsShort:
        'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split(
        '_'
    ),
    weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
    weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY H:mm',
        LLLL: 'dddd, D. MMMM YYYY H:mm',
    },
    calendar: {
        sameDay: '[danas u] LT',
        nextDay: '[sutra u] LT',
        nextWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[u] [nedjelju] [u] LT';
                case 3:
                    return '[u] [srijedu] [u] LT';
                case 6:
                    return '[u] [subotu] [u] LT';
                case 1:
                case 2:
                case 4:
                case 5:
                    return '[u] dddd [u] LT';
            }
        },
        lastDay: '[jučer u] LT',
        lastWeek: function () {
            switch (this.day()) {
                case 0:
                case 3:
                    return '[prošlu] dddd [u] LT';
                case 6:
                    return '[prošle] [subote] [u] LT';
                case 1:
                case 2:
                case 4:
                case 5:
                    return '[prošli] dddd [u] LT';
            }
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'za %s',
        past: 'prije %s',
        s: 'par sekundi',
        ss: translate,
        m: translate,
        mm: translate,
        h: translate,
        hh: translate,
        d: 'dan',
        dd: translate,
        M: 'mjesec',
        MM: translate,
        y: 'godinu',
        yy: translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Catalan [ca]
//! author : Juan G. Hurtado : https://github.com/juanghurtado

import moment from '../moment';

export default moment.defineLocale('ca', {
    months: {
        standalone:
            'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split(
                '_'
            ),
        format: "de gener_de febrer_de març_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split(
            '_'
        ),
        isFormat: /D[oD]?(\s)+MMMM/,
    },
    monthsShort:
        'gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays:
        'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split(
            '_'
        ),
    weekdaysShort: 'dg._dl._dt._dc._dj._dv._ds.'.split('_'),
    weekdaysMin: 'dg_dl_dt_dc_dj_dv_ds'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM [de] YYYY',
        ll: 'D MMM YYYY',
        LLL: 'D MMMM [de] YYYY [a les] H:mm',
        lll: 'D MMM YYYY, H:mm',
        LLLL: 'dddd D MMMM [de] YYYY [a les] H:mm',
        llll: 'ddd D MMM YYYY, H:mm',
    },
    calendar: {
        sameDay: function () {
            return '[avui a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';
        },
        nextDay: function () {
            return '[demà a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';
        },
        nextWeek: function () {
            return 'dddd [a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';
        },
        lastDay: function () {
            return '[ahir a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';
        },
        lastWeek: function () {
            return (
                '[el] dddd [passat a ' +
                (this.hours() !== 1 ? 'les' : 'la') +
                '] LT'
            );
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: "d'aquí %s",
        past: 'fa %s',
        s: 'uns segons',
        ss: '%d segons',
        m: 'un minut',
        mm: '%d minuts',
        h: 'una hora',
        hh: '%d hores',
        d: 'un dia',
        dd: '%d dies',
        M: 'un mes',
        MM: '%d mesos',
        y: 'un any',
        yy: '%d anys',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(r|n|t|è|a)/,
    ordinal: function (number, period) {
        var output =
            number === 1
                ? 'r'
                : number === 2
                ? 'n'
                : number === 3
                ? 'r'
                : number === 4
                ? 't'
                : 'è';
        if (period === 'w' || period === 'W') {
            output = 'a';
        }
        return number + output;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Czech [cs]
//! author : petrbela : https://github.com/petrbela

import moment from '../moment';

var months = {
        format: 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split(
            '_'
        ),
        standalone:
            'ledna_února_března_dubna_května_června_července_srpna_září_října_listopadu_prosince'.split(
                '_'
            ),
    },
    monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_'),
    monthsParse = [
        /^led/i,
        /^úno/i,
        /^bře/i,
        /^dub/i,
        /^kvě/i,
        /^(čvn|červen$|června)/i,
        /^(čvc|červenec|července)/i,
        /^srp/i,
        /^zář/i,
        /^říj/i,
        /^lis/i,
        /^pro/i,
    ],
    // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched.
    // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'.
    monthsRegex =
        /^(leden|únor|březen|duben|květen|červenec|července|červen|června|srpen|září|říjen|listopad|prosinec|led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i;

function plural(n) {
    return n > 1 && n < 5 && ~~(n / 10) !== 1;
}
function translate(number, withoutSuffix, key, isFuture) {
    var result = number + ' ';
    switch (key) {
        case 's': // a few seconds / in a few seconds / a few seconds ago
            return withoutSuffix || isFuture ? 'pár sekund' : 'pár sekundami';
        case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago
            if (withoutSuffix || isFuture) {
                return result + (plural(number) ? 'sekundy' : 'sekund');
            } else {
                return result + 'sekundami';
            }
        case 'm': // a minute / in a minute / a minute ago
            return withoutSuffix ? 'minuta' : isFuture ? 'minutu' : 'minutou';
        case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
            if (withoutSuffix || isFuture) {
                return result + (plural(number) ? 'minuty' : 'minut');
            } else {
                return result + 'minutami';
            }
        case 'h': // an hour / in an hour / an hour ago
            return withoutSuffix ? 'hodina' : isFuture ? 'hodinu' : 'hodinou';
        case 'hh': // 9 hours / in 9 hours / 9 hours ago
            if (withoutSuffix || isFuture) {
                return result + (plural(number) ? 'hodiny' : 'hodin');
            } else {
                return result + 'hodinami';
            }
        case 'd': // a day / in a day / a day ago
            return withoutSuffix || isFuture ? 'den' : 'dnem';
        case 'dd': // 9 days / in 9 days / 9 days ago
            if (withoutSuffix || isFuture) {
                return result + (plural(number) ? 'dny' : 'dní');
            } else {
                return result + 'dny';
            }
        case 'M': // a month / in a month / a month ago
            return withoutSuffix || isFuture ? 'měsíc' : 'měsícem';
        case 'MM': // 9 months / in 9 months / 9 months ago
            if (withoutSuffix || isFuture) {
                return result + (plural(number) ? 'měsíce' : 'měsíců');
            } else {
                return result + 'měsíci';
            }
        case 'y': // a year / in a year / a year ago
            return withoutSuffix || isFuture ? 'rok' : 'rokem';
        case 'yy': // 9 years / in 9 years / 9 years ago
            if (withoutSuffix || isFuture) {
                return result + (plural(number) ? 'roky' : 'let');
            } else {
                return result + 'lety';
            }
    }
}

export default moment.defineLocale('cs', {
    months: months,
    monthsShort: monthsShort,
    monthsRegex: monthsRegex,
    monthsShortRegex: monthsRegex,
    // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched.
    // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'.
    monthsStrictRegex:
        /^(leden|ledna|února|únor|březen|března|duben|dubna|květen|května|červenec|července|červen|června|srpen|srpna|září|říjen|října|listopadu|listopad|prosinec|prosince)/i,
    monthsShortStrictRegex:
        /^(led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i,
    monthsParse: monthsParse,
    longMonthsParse: monthsParse,
    shortMonthsParse: monthsParse,
    weekdays: 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'),
    weekdaysShort: 'ne_po_út_st_čt_pá_so'.split('_'),
    weekdaysMin: 'ne_po_út_st_čt_pá_so'.split('_'),
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY H:mm',
        LLLL: 'dddd D. MMMM YYYY H:mm',
        l: 'D. M. YYYY',
    },
    calendar: {
        sameDay: '[dnes v] LT',
        nextDay: '[zítra v] LT',
        nextWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[v neděli v] LT';
                case 1:
                case 2:
                    return '[v] dddd [v] LT';
                case 3:
                    return '[ve středu v] LT';
                case 4:
                    return '[ve čtvrtek v] LT';
                case 5:
                    return '[v pátek v] LT';
                case 6:
                    return '[v sobotu v] LT';
            }
        },
        lastDay: '[včera v] LT',
        lastWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[minulou neděli v] LT';
                case 1:
                case 2:
                    return '[minulé] dddd [v] LT';
                case 3:
                    return '[minulou středu v] LT';
                case 4:
                case 5:
                    return '[minulý] dddd [v] LT';
                case 6:
                    return '[minulou sobotu v] LT';
            }
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'za %s',
        past: 'před %s',
        s: translate,
        ss: translate,
        m: translate,
        mm: translate,
        h: translate,
        hh: translate,
        d: translate,
        dd: translate,
        M: translate,
        MM: translate,
        y: translate,
        yy: translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Chuvash [cv]
//! author : Anatoly Mironov : https://github.com/mirontoli

import moment from '../moment';

export default moment.defineLocale('cv', {
    months: 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split(
        '_'
    ),
    monthsShort: 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'),
    weekdays:
        'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split(
            '_'
        ),
    weekdaysShort: 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'),
    weekdaysMin: 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD-MM-YYYY',
        LL: 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]',
        LLL: 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm',
        LLLL: 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm',
    },
    calendar: {
        sameDay: '[Паян] LT [сехетре]',
        nextDay: '[Ыран] LT [сехетре]',
        lastDay: '[Ӗнер] LT [сехетре]',
        nextWeek: '[Ҫитес] dddd LT [сехетре]',
        lastWeek: '[Иртнӗ] dddd LT [сехетре]',
        sameElse: 'L',
    },
    relativeTime: {
        future: function (output) {
            var affix = /сехет$/i.exec(output)
                ? 'рен'
                : /ҫул$/i.exec(output)
                ? 'тан'
                : 'ран';
            return output + affix;
        },
        past: '%s каялла',
        s: 'пӗр-ик ҫеккунт',
        ss: '%d ҫеккунт',
        m: 'пӗр минут',
        mm: '%d минут',
        h: 'пӗр сехет',
        hh: '%d сехет',
        d: 'пӗр кун',
        dd: '%d кун',
        M: 'пӗр уйӑх',
        MM: '%d уйӑх',
        y: 'пӗр ҫул',
        yy: '%d ҫул',
    },
    dayOfMonthOrdinalParse: /\d{1,2}-мӗш/,
    ordinal: '%d-мӗш',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Welsh [cy]
//! author : Robert Allen : https://github.com/robgallen
//! author : https://github.com/ryangreaves

import moment from '../moment';

export default moment.defineLocale('cy', {
    months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split(
        '_'
    ),
    monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split(
        '_'
    ),
    weekdays:
        'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split(
            '_'
        ),
    weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'),
    weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'),
    weekdaysParseExact: true,
    // time formats are the same as en-gb
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Heddiw am] LT',
        nextDay: '[Yfory am] LT',
        nextWeek: 'dddd [am] LT',
        lastDay: '[Ddoe am] LT',
        lastWeek: 'dddd [diwethaf am] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'mewn %s',
        past: '%s yn ôl',
        s: 'ychydig eiliadau',
        ss: '%d eiliad',
        m: 'munud',
        mm: '%d munud',
        h: 'awr',
        hh: '%d awr',
        d: 'diwrnod',
        dd: '%d diwrnod',
        M: 'mis',
        MM: '%d mis',
        y: 'blwyddyn',
        yy: '%d flynedd',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,
    // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh
    ordinal: function (number) {
        var b = number,
            output = '',
            lookup = [
                '',
                'af',
                'il',
                'ydd',
                'ydd',
                'ed',
                'ed',
                'ed',
                'fed',
                'fed',
                'fed', // 1af to 10fed
                'eg',
                'fed',
                'eg',
                'eg',
                'fed',
                'eg',
                'eg',
                'fed',
                'eg',
                'fed', // 11eg to 20fed
            ];
        if (b > 20) {
            if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) {
                output = 'fed'; // not 30ain, 70ain or 90ain
            } else {
                output = 'ain';
            }
        } else if (b > 0) {
            output = lookup[b];
        }
        return number + output;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Danish [da]
//! author : Ulrik Nielsen : https://github.com/mrbase

import moment from '../moment';

export default moment.defineLocale('da', {
    months: 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split(
        '_'
    ),
    monthsShort: 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
    weekdays: 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
    weekdaysShort: 'søn_man_tir_ons_tor_fre_lør'.split('_'),
    weekdaysMin: 'sø_ma_ti_on_to_fr_lø'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY HH:mm',
        LLLL: 'dddd [d.] D. MMMM YYYY [kl.] HH:mm',
    },
    calendar: {
        sameDay: '[i dag kl.] LT',
        nextDay: '[i morgen kl.] LT',
        nextWeek: 'på dddd [kl.] LT',
        lastDay: '[i går kl.] LT',
        lastWeek: '[i] dddd[s kl.] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'om %s',
        past: '%s siden',
        s: 'få sekunder',
        ss: '%d sekunder',
        m: 'et minut',
        mm: '%d minutter',
        h: 'en time',
        hh: '%d timer',
        d: 'en dag',
        dd: '%d dage',
        M: 'en måned',
        MM: '%d måneder',
        y: 'et år',
        yy: '%d år',
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : German (Austria) [de-at]
//! author : lluchs : https://github.com/lluchs
//! author: Menelion Elensúle: https://github.com/Oire
//! author : Martin Groller : https://github.com/MadMG
//! author : Mikolaj Dadela : https://github.com/mik01aj

import moment from '../moment';

function processRelativeTime(number, withoutSuffix, key, isFuture) {
    var format = {
        m: ['eine Minute', 'einer Minute'],
        h: ['eine Stunde', 'einer Stunde'],
        d: ['ein Tag', 'einem Tag'],
        dd: [number + ' Tage', number + ' Tagen'],
        w: ['eine Woche', 'einer Woche'],
        M: ['ein Monat', 'einem Monat'],
        MM: [number + ' Monate', number + ' Monaten'],
        y: ['ein Jahr', 'einem Jahr'],
        yy: [number + ' Jahre', number + ' Jahren'],
    };
    return withoutSuffix ? format[key][0] : format[key][1];
}

export default moment.defineLocale('de-at', {
    months: 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split(
        '_'
    ),
    monthsShort:
        'Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),
    monthsParseExact: true,
    weekdays:
        'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split(
            '_'
        ),
    weekdaysShort: 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
    weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY HH:mm',
        LLLL: 'dddd, D. MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[heute um] LT [Uhr]',
        sameElse: 'L',
        nextDay: '[morgen um] LT [Uhr]',
        nextWeek: 'dddd [um] LT [Uhr]',
        lastDay: '[gestern um] LT [Uhr]',
        lastWeek: '[letzten] dddd [um] LT [Uhr]',
    },
    relativeTime: {
        future: 'in %s',
        past: 'vor %s',
        s: 'ein paar Sekunden',
        ss: '%d Sekunden',
        m: processRelativeTime,
        mm: '%d Minuten',
        h: processRelativeTime,
        hh: '%d Stunden',
        d: processRelativeTime,
        dd: processRelativeTime,
        w: processRelativeTime,
        ww: '%d Wochen',
        M: processRelativeTime,
        MM: processRelativeTime,
        y: processRelativeTime,
        yy: processRelativeTime,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : German (Switzerland) [de-ch]
//! author : sschueller : https://github.com/sschueller

// based on: https://www.bk.admin.ch/dokumentation/sprachen/04915/05016/index.html?lang=de#

import moment from '../moment';

function processRelativeTime(number, withoutSuffix, key, isFuture) {
    var format = {
        m: ['eine Minute', 'einer Minute'],
        h: ['eine Stunde', 'einer Stunde'],
        d: ['ein Tag', 'einem Tag'],
        dd: [number + ' Tage', number + ' Tagen'],
        w: ['eine Woche', 'einer Woche'],
        M: ['ein Monat', 'einem Monat'],
        MM: [number + ' Monate', number + ' Monaten'],
        y: ['ein Jahr', 'einem Jahr'],
        yy: [number + ' Jahre', number + ' Jahren'],
    };
    return withoutSuffix ? format[key][0] : format[key][1];
}

export default moment.defineLocale('de-ch', {
    months: 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split(
        '_'
    ),
    monthsShort:
        'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),
    monthsParseExact: true,
    weekdays:
        'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split(
            '_'
        ),
    weekdaysShort: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
    weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY HH:mm',
        LLLL: 'dddd, D. MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[heute um] LT [Uhr]',
        sameElse: 'L',
        nextDay: '[morgen um] LT [Uhr]',
        nextWeek: 'dddd [um] LT [Uhr]',
        lastDay: '[gestern um] LT [Uhr]',
        lastWeek: '[letzten] dddd [um] LT [Uhr]',
    },
    relativeTime: {
        future: 'in %s',
        past: 'vor %s',
        s: 'ein paar Sekunden',
        ss: '%d Sekunden',
        m: processRelativeTime,
        mm: '%d Minuten',
        h: processRelativeTime,
        hh: '%d Stunden',
        d: processRelativeTime,
        dd: processRelativeTime,
        w: processRelativeTime,
        ww: '%d Wochen',
        M: processRelativeTime,
        MM: processRelativeTime,
        y: processRelativeTime,
        yy: processRelativeTime,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : German [de]
//! author : lluchs : https://github.com/lluchs
//! author: Menelion Elensúle: https://github.com/Oire
//! author : Mikolaj Dadela : https://github.com/mik01aj

import moment from '../moment';

function processRelativeTime(number, withoutSuffix, key, isFuture) {
    var format = {
        m: ['eine Minute', 'einer Minute'],
        h: ['eine Stunde', 'einer Stunde'],
        d: ['ein Tag', 'einem Tag'],
        dd: [number + ' Tage', number + ' Tagen'],
        w: ['eine Woche', 'einer Woche'],
        M: ['ein Monat', 'einem Monat'],
        MM: [number + ' Monate', number + ' Monaten'],
        y: ['ein Jahr', 'einem Jahr'],
        yy: [number + ' Jahre', number + ' Jahren'],
    };
    return withoutSuffix ? format[key][0] : format[key][1];
}

export default moment.defineLocale('de', {
    months: 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split(
        '_'
    ),
    monthsShort:
        'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),
    monthsParseExact: true,
    weekdays:
        'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split(
            '_'
        ),
    weekdaysShort: 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
    weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY HH:mm',
        LLLL: 'dddd, D. MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[heute um] LT [Uhr]',
        sameElse: 'L',
        nextDay: '[morgen um] LT [Uhr]',
        nextWeek: 'dddd [um] LT [Uhr]',
        lastDay: '[gestern um] LT [Uhr]',
        lastWeek: '[letzten] dddd [um] LT [Uhr]',
    },
    relativeTime: {
        future: 'in %s',
        past: 'vor %s',
        s: 'ein paar Sekunden',
        ss: '%d Sekunden',
        m: processRelativeTime,
        mm: '%d Minuten',
        h: processRelativeTime,
        hh: '%d Stunden',
        d: processRelativeTime,
        dd: processRelativeTime,
        w: processRelativeTime,
        ww: '%d Wochen',
        M: processRelativeTime,
        MM: processRelativeTime,
        y: processRelativeTime,
        yy: processRelativeTime,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Maldivian [dv]
//! author : Jawish Hameed : https://github.com/jawish

import moment from '../moment';

var months = [
        'ޖެނުއަރީ',
        'ފެބްރުއަރީ',
        'މާރިޗު',
        'އޭޕްރީލު',
        'މޭ',
        'ޖޫން',
        'ޖުލައި',
        'އޯގަސްޓު',
        'ސެޕްޓެމްބަރު',
        'އޮކްޓޯބަރު',
        'ނޮވެމްބަރު',
        'ޑިސެމްބަރު',
    ],
    weekdays = [
        'އާދިއްތަ',
        'ހޯމަ',
        'އަންގާރަ',
        'ބުދަ',
        'ބުރާސްފަތި',
        'ހުކުރު',
        'ހޮނިހިރު',
    ];

export default moment.defineLocale('dv', {
    months: months,
    monthsShort: months,
    weekdays: weekdays,
    weekdaysShort: weekdays,
    weekdaysMin: 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'D/M/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    meridiemParse: /މކ|މފ/,
    isPM: function (input) {
        return 'މފ' === input;
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return 'މކ';
        } else {
            return 'މފ';
        }
    },
    calendar: {
        sameDay: '[މިއަދު] LT',
        nextDay: '[މާދަމާ] LT',
        nextWeek: 'dddd LT',
        lastDay: '[އިއްޔެ] LT',
        lastWeek: '[ފާއިތުވި] dddd LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'ތެރޭގައި %s',
        past: 'ކުރިން %s',
        s: 'ސިކުންތުކޮޅެއް',
        ss: 'd% ސިކުންތު',
        m: 'މިނިޓެއް',
        mm: 'މިނިޓު %d',
        h: 'ގަޑިއިރެއް',
        hh: 'ގަޑިއިރު %d',
        d: 'ދުވަހެއް',
        dd: 'ދުވަސް %d',
        M: 'މަހެއް',
        MM: 'މަސް %d',
        y: 'އަހަރެއް',
        yy: 'އަހަރު %d',
    },
    preparse: function (string) {
        return string.replace(/،/g, ',');
    },
    postformat: function (string) {
        return string.replace(/,/g, '،');
    },
    week: {
        dow: 7, // Sunday is the first day of the week.
        doy: 12, // The week that contains Jan 12th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Greek [el]
//! author : Aggelos Karalias : https://github.com/mehiel

import moment from '../moment';

function isFunction(input) {
    return (
        (typeof Function !== 'undefined' && input instanceof Function) ||
        Object.prototype.toString.call(input) === '[object Function]'
    );
}

export default moment.defineLocale('el', {
    monthsNominativeEl:
        'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split(
            '_'
        ),
    monthsGenitiveEl:
        'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split(
            '_'
        ),
    months: function (momentToFormat, format) {
        if (!momentToFormat) {
            return this._monthsNominativeEl;
        } else if (
            typeof format === 'string' &&
            /D/.test(format.substring(0, format.indexOf('MMMM')))
        ) {
            // if there is a day number before 'MMMM'
            return this._monthsGenitiveEl[momentToFormat.month()];
        } else {
            return this._monthsNominativeEl[momentToFormat.month()];
        }
    },
    monthsShort: 'Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ'.split('_'),
    weekdays: 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split(
        '_'
    ),
    weekdaysShort: 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'),
    weekdaysMin: 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'),
    meridiem: function (hours, minutes, isLower) {
        if (hours > 11) {
            return isLower ? 'μμ' : 'ΜΜ';
        } else {
            return isLower ? 'πμ' : 'ΠΜ';
        }
    },
    isPM: function (input) {
        return (input + '').toLowerCase()[0] === 'μ';
    },
    meridiemParse: /[ΠΜ]\.?Μ?\.?/i,
    longDateFormat: {
        LT: 'h:mm A',
        LTS: 'h:mm:ss A',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY h:mm A',
        LLLL: 'dddd, D MMMM YYYY h:mm A',
    },
    calendarEl: {
        sameDay: '[Σήμερα {}] LT',
        nextDay: '[Αύριο {}] LT',
        nextWeek: 'dddd [{}] LT',
        lastDay: '[Χθες {}] LT',
        lastWeek: function () {
            switch (this.day()) {
                case 6:
                    return '[το προηγούμενο] dddd [{}] LT';
                default:
                    return '[την προηγούμενη] dddd [{}] LT';
            }
        },
        sameElse: 'L',
    },
    calendar: function (key, mom) {
        var output = this._calendarEl[key],
            hours = mom && mom.hours();
        if (isFunction(output)) {
            output = output.apply(mom);
        }
        return output.replace('{}', hours % 12 === 1 ? 'στη' : 'στις');
    },
    relativeTime: {
        future: 'σε %s',
        past: '%s πριν',
        s: 'λίγα δευτερόλεπτα',
        ss: '%d δευτερόλεπτα',
        m: 'ένα λεπτό',
        mm: '%d λεπτά',
        h: 'μία ώρα',
        hh: '%d ώρες',
        d: 'μία μέρα',
        dd: '%d μέρες',
        M: 'ένας μήνας',
        MM: '%d μήνες',
        y: 'ένας χρόνος',
        yy: '%d χρόνια',
    },
    dayOfMonthOrdinalParse: /\d{1,2}η/,
    ordinal: '%dη',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4st is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : English (Australia) [en-au]
//! author : Jared Morse : https://github.com/jarcoal

import moment from '../moment';

export default moment.defineLocale('en-au', {
    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
        '_'
    ),
    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
    longDateFormat: {
        LT: 'h:mm A',
        LTS: 'h:mm:ss A',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY h:mm A',
        LLLL: 'dddd, D MMMM YYYY h:mm A',
    },
    calendar: {
        sameDay: '[Today at] LT',
        nextDay: '[Tomorrow at] LT',
        nextWeek: 'dddd [at] LT',
        lastDay: '[Yesterday at] LT',
        lastWeek: '[Last] dddd [at] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'in %s',
        past: '%s ago',
        s: 'a few seconds',
        ss: '%d seconds',
        m: 'a minute',
        mm: '%d minutes',
        h: 'an hour',
        hh: '%d hours',
        d: 'a day',
        dd: '%d days',
        M: 'a month',
        MM: '%d months',
        y: 'a year',
        yy: '%d years',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
    ordinal: function (number) {
        var b = number % 10,
            output =
                ~~((number % 100) / 10) === 1
                    ? 'th'
                    : b === 1
                    ? 'st'
                    : b === 2
                    ? 'nd'
                    : b === 3
                    ? 'rd'
                    : 'th';
        return number + output;
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : English (Canada) [en-ca]
//! author : Jonathan Abourbih : https://github.com/jonbca

import moment from '../moment';

export default moment.defineLocale('en-ca', {
    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
        '_'
    ),
    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
    longDateFormat: {
        LT: 'h:mm A',
        LTS: 'h:mm:ss A',
        L: 'YYYY-MM-DD',
        LL: 'MMMM D, YYYY',
        LLL: 'MMMM D, YYYY h:mm A',
        LLLL: 'dddd, MMMM D, YYYY h:mm A',
    },
    calendar: {
        sameDay: '[Today at] LT',
        nextDay: '[Tomorrow at] LT',
        nextWeek: 'dddd [at] LT',
        lastDay: '[Yesterday at] LT',
        lastWeek: '[Last] dddd [at] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'in %s',
        past: '%s ago',
        s: 'a few seconds',
        ss: '%d seconds',
        m: 'a minute',
        mm: '%d minutes',
        h: 'an hour',
        hh: '%d hours',
        d: 'a day',
        dd: '%d days',
        M: 'a month',
        MM: '%d months',
        y: 'a year',
        yy: '%d years',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
    ordinal: function (number) {
        var b = number % 10,
            output =
                ~~((number % 100) / 10) === 1
                    ? 'th'
                    : b === 1
                    ? 'st'
                    : b === 2
                    ? 'nd'
                    : b === 3
                    ? 'rd'
                    : 'th';
        return number + output;
    },
});
//! moment.js locale configuration
//! locale : English (United Kingdom) [en-gb]
//! author : Chris Gedrim : https://github.com/chrisgedrim

import moment from '../moment';

export default moment.defineLocale('en-gb', {
    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
        '_'
    ),
    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Today at] LT',
        nextDay: '[Tomorrow at] LT',
        nextWeek: 'dddd [at] LT',
        lastDay: '[Yesterday at] LT',
        lastWeek: '[Last] dddd [at] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'in %s',
        past: '%s ago',
        s: 'a few seconds',
        ss: '%d seconds',
        m: 'a minute',
        mm: '%d minutes',
        h: 'an hour',
        hh: '%d hours',
        d: 'a day',
        dd: '%d days',
        M: 'a month',
        MM: '%d months',
        y: 'a year',
        yy: '%d years',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
    ordinal: function (number) {
        var b = number % 10,
            output =
                ~~((number % 100) / 10) === 1
                    ? 'th'
                    : b === 1
                    ? 'st'
                    : b === 2
                    ? 'nd'
                    : b === 3
                    ? 'rd'
                    : 'th';
        return number + output;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : English (Ireland) [en-ie]
//! author : Chris Cartlidge : https://github.com/chriscartlidge

import moment from '../moment';

export default moment.defineLocale('en-ie', {
    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
        '_'
    ),
    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Today at] LT',
        nextDay: '[Tomorrow at] LT',
        nextWeek: 'dddd [at] LT',
        lastDay: '[Yesterday at] LT',
        lastWeek: '[Last] dddd [at] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'in %s',
        past: '%s ago',
        s: 'a few seconds',
        ss: '%d seconds',
        m: 'a minute',
        mm: '%d minutes',
        h: 'an hour',
        hh: '%d hours',
        d: 'a day',
        dd: '%d days',
        M: 'a month',
        MM: '%d months',
        y: 'a year',
        yy: '%d years',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
    ordinal: function (number) {
        var b = number % 10,
            output =
                ~~((number % 100) / 10) === 1
                    ? 'th'
                    : b === 1
                    ? 'st'
                    : b === 2
                    ? 'nd'
                    : b === 3
                    ? 'rd'
                    : 'th';
        return number + output;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : English (Israel) [en-il]
//! author : Chris Gedrim : https://github.com/chrisgedrim

import moment from '../moment';

export default moment.defineLocale('en-il', {
    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
        '_'
    ),
    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Today at] LT',
        nextDay: '[Tomorrow at] LT',
        nextWeek: 'dddd [at] LT',
        lastDay: '[Yesterday at] LT',
        lastWeek: '[Last] dddd [at] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'in %s',
        past: '%s ago',
        s: 'a few seconds',
        ss: '%d seconds',
        m: 'a minute',
        mm: '%d minutes',
        h: 'an hour',
        hh: '%d hours',
        d: 'a day',
        dd: '%d days',
        M: 'a month',
        MM: '%d months',
        y: 'a year',
        yy: '%d years',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
    ordinal: function (number) {
        var b = number % 10,
            output =
                ~~((number % 100) / 10) === 1
                    ? 'th'
                    : b === 1
                    ? 'st'
                    : b === 2
                    ? 'nd'
                    : b === 3
                    ? 'rd'
                    : 'th';
        return number + output;
    },
});
//! moment.js locale configuration
//! locale : English (India) [en-in]
//! author : Jatin Agrawal : https://github.com/jatinag22

import moment from '../moment';

export default moment.defineLocale('en-in', {
    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
        '_'
    ),
    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
    longDateFormat: {
        LT: 'h:mm A',
        LTS: 'h:mm:ss A',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY h:mm A',
        LLLL: 'dddd, D MMMM YYYY h:mm A',
    },
    calendar: {
        sameDay: '[Today at] LT',
        nextDay: '[Tomorrow at] LT',
        nextWeek: 'dddd [at] LT',
        lastDay: '[Yesterday at] LT',
        lastWeek: '[Last] dddd [at] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'in %s',
        past: '%s ago',
        s: 'a few seconds',
        ss: '%d seconds',
        m: 'a minute',
        mm: '%d minutes',
        h: 'an hour',
        hh: '%d hours',
        d: 'a day',
        dd: '%d days',
        M: 'a month',
        MM: '%d months',
        y: 'a year',
        yy: '%d years',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
    ordinal: function (number) {
        var b = number % 10,
            output =
                ~~((number % 100) / 10) === 1
                    ? 'th'
                    : b === 1
                    ? 'st'
                    : b === 2
                    ? 'nd'
                    : b === 3
                    ? 'rd'
                    : 'th';
        return number + output;
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 1st is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : English (New Zealand) [en-nz]
//! author : Luke McGregor : https://github.com/lukemcgregor

import moment from '../moment';

export default moment.defineLocale('en-nz', {
    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
        '_'
    ),
    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
    longDateFormat: {
        LT: 'h:mm A',
        LTS: 'h:mm:ss A',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY h:mm A',
        LLLL: 'dddd, D MMMM YYYY h:mm A',
    },
    calendar: {
        sameDay: '[Today at] LT',
        nextDay: '[Tomorrow at] LT',
        nextWeek: 'dddd [at] LT',
        lastDay: '[Yesterday at] LT',
        lastWeek: '[Last] dddd [at] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'in %s',
        past: '%s ago',
        s: 'a few seconds',
        ss: '%d seconds',
        m: 'a minute',
        mm: '%d minutes',
        h: 'an hour',
        hh: '%d hours',
        d: 'a day',
        dd: '%d days',
        M: 'a month',
        MM: '%d months',
        y: 'a year',
        yy: '%d years',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
    ordinal: function (number) {
        var b = number % 10,
            output =
                ~~((number % 100) / 10) === 1
                    ? 'th'
                    : b === 1
                    ? 'st'
                    : b === 2
                    ? 'nd'
                    : b === 3
                    ? 'rd'
                    : 'th';
        return number + output;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : English (Singapore) [en-sg]
//! author : Matthew Castrillon-Madrigal : https://github.com/techdimension

import moment from '../moment';

export default moment.defineLocale('en-sg', {
    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
        '_'
    ),
    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Today at] LT',
        nextDay: '[Tomorrow at] LT',
        nextWeek: 'dddd [at] LT',
        lastDay: '[Yesterday at] LT',
        lastWeek: '[Last] dddd [at] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'in %s',
        past: '%s ago',
        s: 'a few seconds',
        ss: '%d seconds',
        m: 'a minute',
        mm: '%d minutes',
        h: 'an hour',
        hh: '%d hours',
        d: 'a day',
        dd: '%d days',
        M: 'a month',
        MM: '%d months',
        y: 'a year',
        yy: '%d years',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
    ordinal: function (number) {
        var b = number % 10,
            output =
                ~~((number % 100) / 10) === 1
                    ? 'th'
                    : b === 1
                    ? 'st'
                    : b === 2
                    ? 'nd'
                    : b === 3
                    ? 'rd'
                    : 'th';
        return number + output;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Esperanto [eo]
//! author : Colin Dean : https://github.com/colindean
//! author : Mia Nordentoft Imperatori : https://github.com/miestasmia
//! comment : miestasmia corrected the translation by colindean
//! comment : Vivakvo corrected the translation by colindean and miestasmia

import moment from '../moment';

export default moment.defineLocale('eo', {
    months: 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split(
        '_'
    ),
    monthsShort: 'jan_feb_mart_apr_maj_jun_jul_aŭg_sept_okt_nov_dec'.split('_'),
    weekdays: 'dimanĉo_lundo_mardo_merkredo_ĵaŭdo_vendredo_sabato'.split('_'),
    weekdaysShort: 'dim_lun_mard_merk_ĵaŭ_ven_sab'.split('_'),
    weekdaysMin: 'di_lu_ma_me_ĵa_ve_sa'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'YYYY-MM-DD',
        LL: '[la] D[-an de] MMMM, YYYY',
        LLL: '[la] D[-an de] MMMM, YYYY HH:mm',
        LLLL: 'dddd[n], [la] D[-an de] MMMM, YYYY HH:mm',
        llll: 'ddd, [la] D[-an de] MMM, YYYY HH:mm',
    },
    meridiemParse: /[ap]\.t\.m/i,
    isPM: function (input) {
        return input.charAt(0).toLowerCase() === 'p';
    },
    meridiem: function (hours, minutes, isLower) {
        if (hours > 11) {
            return isLower ? 'p.t.m.' : 'P.T.M.';
        } else {
            return isLower ? 'a.t.m.' : 'A.T.M.';
        }
    },
    calendar: {
        sameDay: '[Hodiaŭ je] LT',
        nextDay: '[Morgaŭ je] LT',
        nextWeek: 'dddd[n je] LT',
        lastDay: '[Hieraŭ je] LT',
        lastWeek: '[pasintan] dddd[n je] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'post %s',
        past: 'antaŭ %s',
        s: 'kelkaj sekundoj',
        ss: '%d sekundoj',
        m: 'unu minuto',
        mm: '%d minutoj',
        h: 'unu horo',
        hh: '%d horoj',
        d: 'unu tago', //ne 'diurno', ĉar estas uzita por proksimumo
        dd: '%d tagoj',
        M: 'unu monato',
        MM: '%d monatoj',
        y: 'unu jaro',
        yy: '%d jaroj',
    },
    dayOfMonthOrdinalParse: /\d{1,2}a/,
    ordinal: '%da',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Spanish (Dominican Republic) [es-do]

import moment from '../moment';

var monthsShortDot =
        'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(
            '_'
        ),
    monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
    monthsParse = [
        /^ene/i,
        /^feb/i,
        /^mar/i,
        /^abr/i,
        /^may/i,
        /^jun/i,
        /^jul/i,
        /^ago/i,
        /^sep/i,
        /^oct/i,
        /^nov/i,
        /^dic/i,
    ],
    monthsRegex =
        /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;

export default moment.defineLocale('es-do', {
    months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(
        '_'
    ),
    monthsShort: function (m, format) {
        if (!m) {
            return monthsShortDot;
        } else if (/-MMM-/.test(format)) {
            return monthsShort[m.month()];
        } else {
            return monthsShortDot[m.month()];
        }
    },
    monthsRegex: monthsRegex,
    monthsShortRegex: monthsRegex,
    monthsStrictRegex:
        /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,
    monthsShortStrictRegex:
        /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,
    monthsParse: monthsParse,
    longMonthsParse: monthsParse,
    shortMonthsParse: monthsParse,
    weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
    weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
    weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'h:mm A',
        LTS: 'h:mm:ss A',
        L: 'DD/MM/YYYY',
        LL: 'D [de] MMMM [de] YYYY',
        LLL: 'D [de] MMMM [de] YYYY h:mm A',
        LLLL: 'dddd, D [de] MMMM [de] YYYY h:mm A',
    },
    calendar: {
        sameDay: function () {
            return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        nextDay: function () {
            return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        nextWeek: function () {
            return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        lastDay: function () {
            return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        lastWeek: function () {
            return (
                '[el] dddd [pasado a la' +
                (this.hours() !== 1 ? 's' : '') +
                '] LT'
            );
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'en %s',
        past: 'hace %s',
        s: 'unos segundos',
        ss: '%d segundos',
        m: 'un minuto',
        mm: '%d minutos',
        h: 'una hora',
        hh: '%d horas',
        d: 'un día',
        dd: '%d días',
        w: 'una semana',
        ww: '%d semanas',
        M: 'un mes',
        MM: '%d meses',
        y: 'un año',
        yy: '%d años',
    },
    dayOfMonthOrdinalParse: /\d{1,2}º/,
    ordinal: '%dº',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Spanish (Mexico) [es-mx]
//! author : JC Franco : https://github.com/jcfranco

import moment from '../moment';

var monthsShortDot =
        'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(
            '_'
        ),
    monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
    monthsParse = [
        /^ene/i,
        /^feb/i,
        /^mar/i,
        /^abr/i,
        /^may/i,
        /^jun/i,
        /^jul/i,
        /^ago/i,
        /^sep/i,
        /^oct/i,
        /^nov/i,
        /^dic/i,
    ],
    monthsRegex =
        /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;

export default moment.defineLocale('es-mx', {
    months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(
        '_'
    ),
    monthsShort: function (m, format) {
        if (!m) {
            return monthsShortDot;
        } else if (/-MMM-/.test(format)) {
            return monthsShort[m.month()];
        } else {
            return monthsShortDot[m.month()];
        }
    },
    monthsRegex: monthsRegex,
    monthsShortRegex: monthsRegex,
    monthsStrictRegex:
        /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,
    monthsShortStrictRegex:
        /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,
    monthsParse: monthsParse,
    longMonthsParse: monthsParse,
    shortMonthsParse: monthsParse,
    weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
    weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
    weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D [de] MMMM [de] YYYY',
        LLL: 'D [de] MMMM [de] YYYY H:mm',
        LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm',
    },
    calendar: {
        sameDay: function () {
            return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        nextDay: function () {
            return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        nextWeek: function () {
            return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        lastDay: function () {
            return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        lastWeek: function () {
            return (
                '[el] dddd [pasado a la' +
                (this.hours() !== 1 ? 's' : '') +
                '] LT'
            );
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'en %s',
        past: 'hace %s',
        s: 'unos segundos',
        ss: '%d segundos',
        m: 'un minuto',
        mm: '%d minutos',
        h: 'una hora',
        hh: '%d horas',
        d: 'un día',
        dd: '%d días',
        w: 'una semana',
        ww: '%d semanas',
        M: 'un mes',
        MM: '%d meses',
        y: 'un año',
        yy: '%d años',
    },
    dayOfMonthOrdinalParse: /\d{1,2}º/,
    ordinal: '%dº',
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
    invalidDate: 'Fecha inválida',
});
//! moment.js locale configuration
//! locale : Spanish (United States) [es-us]
//! author : bustta : https://github.com/bustta
//! author : chrisrodz : https://github.com/chrisrodz

import moment from '../moment';

var monthsShortDot =
        'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(
            '_'
        ),
    monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
    monthsParse = [
        /^ene/i,
        /^feb/i,
        /^mar/i,
        /^abr/i,
        /^may/i,
        /^jun/i,
        /^jul/i,
        /^ago/i,
        /^sep/i,
        /^oct/i,
        /^nov/i,
        /^dic/i,
    ],
    monthsRegex =
        /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;

export default moment.defineLocale('es-us', {
    months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(
        '_'
    ),
    monthsShort: function (m, format) {
        if (!m) {
            return monthsShortDot;
        } else if (/-MMM-/.test(format)) {
            return monthsShort[m.month()];
        } else {
            return monthsShortDot[m.month()];
        }
    },
    monthsRegex: monthsRegex,
    monthsShortRegex: monthsRegex,
    monthsStrictRegex:
        /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,
    monthsShortStrictRegex:
        /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,
    monthsParse: monthsParse,
    longMonthsParse: monthsParse,
    shortMonthsParse: monthsParse,
    weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
    weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
    weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'h:mm A',
        LTS: 'h:mm:ss A',
        L: 'MM/DD/YYYY',
        LL: 'D [de] MMMM [de] YYYY',
        LLL: 'D [de] MMMM [de] YYYY h:mm A',
        LLLL: 'dddd, D [de] MMMM [de] YYYY h:mm A',
    },
    calendar: {
        sameDay: function () {
            return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        nextDay: function () {
            return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        nextWeek: function () {
            return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        lastDay: function () {
            return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        lastWeek: function () {
            return (
                '[el] dddd [pasado a la' +
                (this.hours() !== 1 ? 's' : '') +
                '] LT'
            );
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'en %s',
        past: 'hace %s',
        s: 'unos segundos',
        ss: '%d segundos',
        m: 'un minuto',
        mm: '%d minutos',
        h: 'una hora',
        hh: '%d horas',
        d: 'un día',
        dd: '%d días',
        w: 'una semana',
        ww: '%d semanas',
        M: 'un mes',
        MM: '%d meses',
        y: 'un año',
        yy: '%d años',
    },
    dayOfMonthOrdinalParse: /\d{1,2}º/,
    ordinal: '%dº',
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Spanish [es]
//! author : Julio Napurí : https://github.com/julionc

import moment from '../moment';

var monthsShortDot =
        'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(
            '_'
        ),
    monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
    monthsParse = [
        /^ene/i,
        /^feb/i,
        /^mar/i,
        /^abr/i,
        /^may/i,
        /^jun/i,
        /^jul/i,
        /^ago/i,
        /^sep/i,
        /^oct/i,
        /^nov/i,
        /^dic/i,
    ],
    monthsRegex =
        /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;

export default moment.defineLocale('es', {
    months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(
        '_'
    ),
    monthsShort: function (m, format) {
        if (!m) {
            return monthsShortDot;
        } else if (/-MMM-/.test(format)) {
            return monthsShort[m.month()];
        } else {
            return monthsShortDot[m.month()];
        }
    },
    monthsRegex: monthsRegex,
    monthsShortRegex: monthsRegex,
    monthsStrictRegex:
        /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,
    monthsShortStrictRegex:
        /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,
    monthsParse: monthsParse,
    longMonthsParse: monthsParse,
    shortMonthsParse: monthsParse,
    weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
    weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
    weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D [de] MMMM [de] YYYY',
        LLL: 'D [de] MMMM [de] YYYY H:mm',
        LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm',
    },
    calendar: {
        sameDay: function () {
            return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        nextDay: function () {
            return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        nextWeek: function () {
            return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        lastDay: function () {
            return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        lastWeek: function () {
            return (
                '[el] dddd [pasado a la' +
                (this.hours() !== 1 ? 's' : '') +
                '] LT'
            );
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'en %s',
        past: 'hace %s',
        s: 'unos segundos',
        ss: '%d segundos',
        m: 'un minuto',
        mm: '%d minutos',
        h: 'una hora',
        hh: '%d horas',
        d: 'un día',
        dd: '%d días',
        w: 'una semana',
        ww: '%d semanas',
        M: 'un mes',
        MM: '%d meses',
        y: 'un año',
        yy: '%d años',
    },
    dayOfMonthOrdinalParse: /\d{1,2}º/,
    ordinal: '%dº',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
    invalidDate: 'Fecha inválida',
});
//! moment.js locale configuration
//! locale : Estonian [et]
//! author : Henry Kehlmann : https://github.com/madhenry
//! improvements : Illimar Tambek : https://github.com/ragulka

import moment from '../moment';

function processRelativeTime(number, withoutSuffix, key, isFuture) {
    var format = {
        s: ['mõne sekundi', 'mõni sekund', 'paar sekundit'],
        ss: [number + 'sekundi', number + 'sekundit'],
        m: ['ühe minuti', 'üks minut'],
        mm: [number + ' minuti', number + ' minutit'],
        h: ['ühe tunni', 'tund aega', 'üks tund'],
        hh: [number + ' tunni', number + ' tundi'],
        d: ['ühe päeva', 'üks päev'],
        M: ['kuu aja', 'kuu aega', 'üks kuu'],
        MM: [number + ' kuu', number + ' kuud'],
        y: ['ühe aasta', 'aasta', 'üks aasta'],
        yy: [number + ' aasta', number + ' aastat'],
    };
    if (withoutSuffix) {
        return format[key][2] ? format[key][2] : format[key][1];
    }
    return isFuture ? format[key][0] : format[key][1];
}

export default moment.defineLocale('et', {
    months: 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split(
        '_'
    ),
    monthsShort:
        'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'),
    weekdays:
        'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split(
            '_'
        ),
    weekdaysShort: 'P_E_T_K_N_R_L'.split('_'),
    weekdaysMin: 'P_E_T_K_N_R_L'.split('_'),
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY H:mm',
        LLLL: 'dddd, D. MMMM YYYY H:mm',
    },
    calendar: {
        sameDay: '[Täna,] LT',
        nextDay: '[Homme,] LT',
        nextWeek: '[Järgmine] dddd LT',
        lastDay: '[Eile,] LT',
        lastWeek: '[Eelmine] dddd LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s pärast',
        past: '%s tagasi',
        s: processRelativeTime,
        ss: processRelativeTime,
        m: processRelativeTime,
        mm: processRelativeTime,
        h: processRelativeTime,
        hh: processRelativeTime,
        d: processRelativeTime,
        dd: '%d päeva',
        M: processRelativeTime,
        MM: processRelativeTime,
        y: processRelativeTime,
        yy: processRelativeTime,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Basque [eu]
//! author : Eneko Illarramendi : https://github.com/eillarra

import moment from '../moment';

export default moment.defineLocale('eu', {
    months: 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split(
        '_'
    ),
    monthsShort:
        'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays:
        'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split(
            '_'
        ),
    weekdaysShort: 'ig._al._ar._az._og._ol._lr.'.split('_'),
    weekdaysMin: 'ig_al_ar_az_og_ol_lr'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'YYYY-MM-DD',
        LL: 'YYYY[ko] MMMM[ren] D[a]',
        LLL: 'YYYY[ko] MMMM[ren] D[a] HH:mm',
        LLLL: 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm',
        l: 'YYYY-M-D',
        ll: 'YYYY[ko] MMM D[a]',
        lll: 'YYYY[ko] MMM D[a] HH:mm',
        llll: 'ddd, YYYY[ko] MMM D[a] HH:mm',
    },
    calendar: {
        sameDay: '[gaur] LT[etan]',
        nextDay: '[bihar] LT[etan]',
        nextWeek: 'dddd LT[etan]',
        lastDay: '[atzo] LT[etan]',
        lastWeek: '[aurreko] dddd LT[etan]',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s barru',
        past: 'duela %s',
        s: 'segundo batzuk',
        ss: '%d segundo',
        m: 'minutu bat',
        mm: '%d minutu',
        h: 'ordu bat',
        hh: '%d ordu',
        d: 'egun bat',
        dd: '%d egun',
        M: 'hilabete bat',
        MM: '%d hilabete',
        y: 'urte bat',
        yy: '%d urte',
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Persian [fa]
//! author : Ebrahim Byagowi : https://github.com/ebraminio

import moment from '../moment';

var symbolMap = {
        1: '۱',
        2: '۲',
        3: '۳',
        4: '۴',
        5: '۵',
        6: '۶',
        7: '۷',
        8: '۸',
        9: '۹',
        0: '۰',
    },
    numberMap = {
        '۱': '1',
        '۲': '2',
        '۳': '3',
        '۴': '4',
        '۵': '5',
        '۶': '6',
        '۷': '7',
        '۸': '8',
        '۹': '9',
        '۰': '0',
    };

export default moment.defineLocale('fa', {
    months: 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split(
        '_'
    ),
    monthsShort:
        'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split(
            '_'
        ),
    weekdays:
        'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split(
            '_'
        ),
    weekdaysShort:
        'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split(
            '_'
        ),
    weekdaysMin: 'ی_د_س_چ_پ_ج_ش'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    meridiemParse: /قبل از ظهر|بعد از ظهر/,
    isPM: function (input) {
        return /بعد از ظهر/.test(input);
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return 'قبل از ظهر';
        } else {
            return 'بعد از ظهر';
        }
    },
    calendar: {
        sameDay: '[امروز ساعت] LT',
        nextDay: '[فردا ساعت] LT',
        nextWeek: 'dddd [ساعت] LT',
        lastDay: '[دیروز ساعت] LT',
        lastWeek: 'dddd [پیش] [ساعت] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'در %s',
        past: '%s پیش',
        s: 'چند ثانیه',
        ss: '%d ثانیه',
        m: 'یک دقیقه',
        mm: '%d دقیقه',
        h: 'یک ساعت',
        hh: '%d ساعت',
        d: 'یک روز',
        dd: '%d روز',
        M: 'یک ماه',
        MM: '%d ماه',
        y: 'یک سال',
        yy: '%d سال',
    },
    preparse: function (string) {
        return string
            .replace(/[۰-۹]/g, function (match) {
                return numberMap[match];
            })
            .replace(/،/g, ',');
    },
    postformat: function (string) {
        return string
            .replace(/\d/g, function (match) {
                return symbolMap[match];
            })
            .replace(/,/g, '،');
    },
    dayOfMonthOrdinalParse: /\d{1,2}م/,
    ordinal: '%dم',
    week: {
        dow: 6, // Saturday is the first day of the week.
        doy: 12, // The week that contains Jan 12th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Finnish [fi]
//! author : Tarmo Aidantausta : https://github.com/bleadof

import moment from '../moment';

var numbersPast =
        'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(
            ' '
        ),
    numbersFuture = [
        'nolla',
        'yhden',
        'kahden',
        'kolmen',
        'neljän',
        'viiden',
        'kuuden',
        numbersPast[7],
        numbersPast[8],
        numbersPast[9],
    ];
function translate(number, withoutSuffix, key, isFuture) {
    var result = '';
    switch (key) {
        case 's':
            return isFuture ? 'muutaman sekunnin' : 'muutama sekunti';
        case 'ss':
            result = isFuture ? 'sekunnin' : 'sekuntia';
            break;
        case 'm':
            return isFuture ? 'minuutin' : 'minuutti';
        case 'mm':
            result = isFuture ? 'minuutin' : 'minuuttia';
            break;
        case 'h':
            return isFuture ? 'tunnin' : 'tunti';
        case 'hh':
            result = isFuture ? 'tunnin' : 'tuntia';
            break;
        case 'd':
            return isFuture ? 'päivän' : 'päivä';
        case 'dd':
            result = isFuture ? 'päivän' : 'päivää';
            break;
        case 'M':
            return isFuture ? 'kuukauden' : 'kuukausi';
        case 'MM':
            result = isFuture ? 'kuukauden' : 'kuukautta';
            break;
        case 'y':
            return isFuture ? 'vuoden' : 'vuosi';
        case 'yy':
            result = isFuture ? 'vuoden' : 'vuotta';
            break;
    }
    result = verbalNumber(number, isFuture) + ' ' + result;
    return result;
}
function verbalNumber(number, isFuture) {
    return number < 10
        ? isFuture
            ? numbersFuture[number]
            : numbersPast[number]
        : number;
}

export default moment.defineLocale('fi', {
    months: 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split(
        '_'
    ),
    monthsShort:
        'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split(
            '_'
        ),
    weekdays:
        'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split(
            '_'
        ),
    weekdaysShort: 'su_ma_ti_ke_to_pe_la'.split('_'),
    weekdaysMin: 'su_ma_ti_ke_to_pe_la'.split('_'),
    longDateFormat: {
        LT: 'HH.mm',
        LTS: 'HH.mm.ss',
        L: 'DD.MM.YYYY',
        LL: 'Do MMMM[ta] YYYY',
        LLL: 'Do MMMM[ta] YYYY, [klo] HH.mm',
        LLLL: 'dddd, Do MMMM[ta] YYYY, [klo] HH.mm',
        l: 'D.M.YYYY',
        ll: 'Do MMM YYYY',
        lll: 'Do MMM YYYY, [klo] HH.mm',
        llll: 'ddd, Do MMM YYYY, [klo] HH.mm',
    },
    calendar: {
        sameDay: '[tänään] [klo] LT',
        nextDay: '[huomenna] [klo] LT',
        nextWeek: 'dddd [klo] LT',
        lastDay: '[eilen] [klo] LT',
        lastWeek: '[viime] dddd[na] [klo] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s päästä',
        past: '%s sitten',
        s: translate,
        ss: translate,
        m: translate,
        mm: translate,
        h: translate,
        hh: translate,
        d: translate,
        dd: translate,
        M: translate,
        MM: translate,
        y: translate,
        yy: translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Filipino [fil]
//! author : Dan Hagman : https://github.com/hagmandan
//! author : Matthew Co : https://github.com/matthewdeeco

import moment from '../moment';

export default moment.defineLocale('fil', {
    months: 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split(
        '_'
    ),
    monthsShort: 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),
    weekdays: 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split(
        '_'
    ),
    weekdaysShort: 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'),
    weekdaysMin: 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'MM/D/YYYY',
        LL: 'MMMM D, YYYY',
        LLL: 'MMMM D, YYYY HH:mm',
        LLLL: 'dddd, MMMM DD, YYYY HH:mm',
    },
    calendar: {
        sameDay: 'LT [ngayong araw]',
        nextDay: '[Bukas ng] LT',
        nextWeek: 'LT [sa susunod na] dddd',
        lastDay: 'LT [kahapon]',
        lastWeek: 'LT [noong nakaraang] dddd',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'sa loob ng %s',
        past: '%s ang nakalipas',
        s: 'ilang segundo',
        ss: '%d segundo',
        m: 'isang minuto',
        mm: '%d minuto',
        h: 'isang oras',
        hh: '%d oras',
        d: 'isang araw',
        dd: '%d araw',
        M: 'isang buwan',
        MM: '%d buwan',
        y: 'isang taon',
        yy: '%d taon',
    },
    dayOfMonthOrdinalParse: /\d{1,2}/,
    ordinal: function (number) {
        return number;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Faroese [fo]
//! author : Ragnar Johannesen : https://github.com/ragnar123
//! author : Kristian Sakarisson : https://github.com/sakarisson

import moment from '../moment';

export default moment.defineLocale('fo', {
    months: 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split(
        '_'
    ),
    monthsShort: 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
    weekdays:
        'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split(
            '_'
        ),
    weekdaysShort: 'sun_mán_týs_mik_hós_frí_ley'.split('_'),
    weekdaysMin: 'su_má_tý_mi_hó_fr_le'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D. MMMM, YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Í dag kl.] LT',
        nextDay: '[Í morgin kl.] LT',
        nextWeek: 'dddd [kl.] LT',
        lastDay: '[Í gjár kl.] LT',
        lastWeek: '[síðstu] dddd [kl] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'um %s',
        past: '%s síðani',
        s: 'fá sekund',
        ss: '%d sekundir',
        m: 'ein minuttur',
        mm: '%d minuttir',
        h: 'ein tími',
        hh: '%d tímar',
        d: 'ein dagur',
        dd: '%d dagar',
        M: 'ein mánaður',
        MM: '%d mánaðir',
        y: 'eitt ár',
        yy: '%d ár',
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : French (Canada) [fr-ca]
//! author : Jonathan Abourbih : https://github.com/jonbca

import moment from '../moment';

export default moment.defineLocale('fr-ca', {
    months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split(
        '_'
    ),
    monthsShort:
        'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
    weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
    weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'YYYY-MM-DD',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Aujourd’hui à] LT',
        nextDay: '[Demain à] LT',
        nextWeek: 'dddd [à] LT',
        lastDay: '[Hier à] LT',
        lastWeek: 'dddd [dernier à] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'dans %s',
        past: 'il y a %s',
        s: 'quelques secondes',
        ss: '%d secondes',
        m: 'une minute',
        mm: '%d minutes',
        h: 'une heure',
        hh: '%d heures',
        d: 'un jour',
        dd: '%d jours',
        M: 'un mois',
        MM: '%d mois',
        y: 'un an',
        yy: '%d ans',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(er|e)/,
    ordinal: function (number, period) {
        switch (period) {
            // Words with masculine grammatical gender: mois, trimestre, jour
            default:
            case 'M':
            case 'Q':
            case 'D':
            case 'DDD':
            case 'd':
                return number + (number === 1 ? 'er' : 'e');

            // Words with feminine grammatical gender: semaine
            case 'w':
            case 'W':
                return number + (number === 1 ? 're' : 'e');
        }
    },
});
//! moment.js locale configuration
//! locale : French (Switzerland) [fr-ch]
//! author : Gaspard Bucher : https://github.com/gaspard

import moment from '../moment';

export default moment.defineLocale('fr-ch', {
    months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split(
        '_'
    ),
    monthsShort:
        'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
    weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
    weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Aujourd’hui à] LT',
        nextDay: '[Demain à] LT',
        nextWeek: 'dddd [à] LT',
        lastDay: '[Hier à] LT',
        lastWeek: 'dddd [dernier à] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'dans %s',
        past: 'il y a %s',
        s: 'quelques secondes',
        ss: '%d secondes',
        m: 'une minute',
        mm: '%d minutes',
        h: 'une heure',
        hh: '%d heures',
        d: 'un jour',
        dd: '%d jours',
        M: 'un mois',
        MM: '%d mois',
        y: 'un an',
        yy: '%d ans',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(er|e)/,
    ordinal: function (number, period) {
        switch (period) {
            // Words with masculine grammatical gender: mois, trimestre, jour
            default:
            case 'M':
            case 'Q':
            case 'D':
            case 'DDD':
            case 'd':
                return number + (number === 1 ? 'er' : 'e');

            // Words with feminine grammatical gender: semaine
            case 'w':
            case 'W':
                return number + (number === 1 ? 're' : 'e');
        }
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : French [fr]
//! author : John Fischer : https://github.com/jfroffice

import moment from '../moment';

var monthsStrictRegex =
        /^(janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i,
    monthsShortStrictRegex =
        /(janv\.?|févr\.?|mars|avr\.?|mai|juin|juil\.?|août|sept\.?|oct\.?|nov\.?|déc\.?)/i,
    monthsRegex =
        /(janv\.?|févr\.?|mars|avr\.?|mai|juin|juil\.?|août|sept\.?|oct\.?|nov\.?|déc\.?|janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i,
    monthsParse = [
        /^janv/i,
        /^févr/i,
        /^mars/i,
        /^avr/i,
        /^mai/i,
        /^juin/i,
        /^juil/i,
        /^août/i,
        /^sept/i,
        /^oct/i,
        /^nov/i,
        /^déc/i,
    ];

export default moment.defineLocale('fr', {
    months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split(
        '_'
    ),
    monthsShort:
        'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split(
            '_'
        ),
    monthsRegex: monthsRegex,
    monthsShortRegex: monthsRegex,
    monthsStrictRegex: monthsStrictRegex,
    monthsShortStrictRegex: monthsShortStrictRegex,
    monthsParse: monthsParse,
    longMonthsParse: monthsParse,
    shortMonthsParse: monthsParse,
    weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
    weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
    weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Aujourd’hui à] LT',
        nextDay: '[Demain à] LT',
        nextWeek: 'dddd [à] LT',
        lastDay: '[Hier à] LT',
        lastWeek: 'dddd [dernier à] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'dans %s',
        past: 'il y a %s',
        s: 'quelques secondes',
        ss: '%d secondes',
        m: 'une minute',
        mm: '%d minutes',
        h: 'une heure',
        hh: '%d heures',
        d: 'un jour',
        dd: '%d jours',
        w: 'une semaine',
        ww: '%d semaines',
        M: 'un mois',
        MM: '%d mois',
        y: 'un an',
        yy: '%d ans',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(er|)/,
    ordinal: function (number, period) {
        switch (period) {
            // TODO: Return 'e' when day of month > 1. Move this case inside
            // block for masculine words below.
            // See https://github.com/moment/moment/issues/3375
            case 'D':
                return number + (number === 1 ? 'er' : '');

            // Words with masculine grammatical gender: mois, trimestre, jour
            default:
            case 'M':
            case 'Q':
            case 'DDD':
            case 'd':
                return number + (number === 1 ? 'er' : 'e');

            // Words with feminine grammatical gender: semaine
            case 'w':
            case 'W':
                return number + (number === 1 ? 're' : 'e');
        }
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Frisian [fy]
//! author : Robin van der Vliet : https://github.com/robin0van0der0v

import moment from '../moment';

var monthsShortWithDots =
        'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'),
    monthsShortWithoutDots =
        'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_');

export default moment.defineLocale('fy', {
    months: 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split(
        '_'
    ),
    monthsShort: function (m, format) {
        if (!m) {
            return monthsShortWithDots;
        } else if (/-MMM-/.test(format)) {
            return monthsShortWithoutDots[m.month()];
        } else {
            return monthsShortWithDots[m.month()];
        }
    },
    monthsParseExact: true,
    weekdays: 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split(
        '_'
    ),
    weekdaysShort: 'si._mo._ti._wo._to._fr._so.'.split('_'),
    weekdaysMin: 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD-MM-YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[hjoed om] LT',
        nextDay: '[moarn om] LT',
        nextWeek: 'dddd [om] LT',
        lastDay: '[juster om] LT',
        lastWeek: '[ôfrûne] dddd [om] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'oer %s',
        past: '%s lyn',
        s: 'in pear sekonden',
        ss: '%d sekonden',
        m: 'ien minút',
        mm: '%d minuten',
        h: 'ien oere',
        hh: '%d oeren',
        d: 'ien dei',
        dd: '%d dagen',
        M: 'ien moanne',
        MM: '%d moannen',
        y: 'ien jier',
        yy: '%d jierren',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/,
    ordinal: function (number) {
        return (
            number +
            (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')
        );
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Irish or Irish Gaelic [ga]
//! author : André Silva : https://github.com/askpt

import moment from '../moment';

var months = [
        'Eanáir',
        'Feabhra',
        'Márta',
        'Aibreán',
        'Bealtaine',
        'Meitheamh',
        'Iúil',
        'Lúnasa',
        'Meán Fómhair',
        'Deireadh Fómhair',
        'Samhain',
        'Nollaig',
    ],
    monthsShort = [
        'Ean',
        'Feabh',
        'Márt',
        'Aib',
        'Beal',
        'Meith',
        'Iúil',
        'Lún',
        'M.F.',
        'D.F.',
        'Samh',
        'Noll',
    ],
    weekdays = [
        'Dé Domhnaigh',
        'Dé Luain',
        'Dé Máirt',
        'Dé Céadaoin',
        'Déardaoin',
        'Dé hAoine',
        'Dé Sathairn',
    ],
    weekdaysShort = ['Domh', 'Luan', 'Máirt', 'Céad', 'Déar', 'Aoine', 'Sath'],
    weekdaysMin = ['Do', 'Lu', 'Má', 'Cé', 'Dé', 'A', 'Sa'];

export default moment.defineLocale('ga', {
    months: months,
    monthsShort: monthsShort,
    monthsParseExact: true,
    weekdays: weekdays,
    weekdaysShort: weekdaysShort,
    weekdaysMin: weekdaysMin,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Inniu ag] LT',
        nextDay: '[Amárach ag] LT',
        nextWeek: 'dddd [ag] LT',
        lastDay: '[Inné ag] LT',
        lastWeek: 'dddd [seo caite] [ag] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'i %s',
        past: '%s ó shin',
        s: 'cúpla soicind',
        ss: '%d soicind',
        m: 'nóiméad',
        mm: '%d nóiméad',
        h: 'uair an chloig',
        hh: '%d uair an chloig',
        d: 'lá',
        dd: '%d lá',
        M: 'mí',
        MM: '%d míonna',
        y: 'bliain',
        yy: '%d bliain',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(d|na|mh)/,
    ordinal: function (number) {
        var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh';
        return number + output;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Scottish Gaelic [gd]
//! author : Jon Ashdown : https://github.com/jonashdown

import moment from '../moment';

var months = [
        'Am Faoilleach',
        'An Gearran',
        'Am Màrt',
        'An Giblean',
        'An Cèitean',
        'An t-Ògmhios',
        'An t-Iuchar',
        'An Lùnastal',
        'An t-Sultain',
        'An Dàmhair',
        'An t-Samhain',
        'An Dùbhlachd',
    ],
    monthsShort = [
        'Faoi',
        'Gear',
        'Màrt',
        'Gibl',
        'Cèit',
        'Ògmh',
        'Iuch',
        'Lùn',
        'Sult',
        'Dàmh',
        'Samh',
        'Dùbh',
    ],
    weekdays = [
        'Didòmhnaich',
        'Diluain',
        'Dimàirt',
        'Diciadain',
        'Diardaoin',
        'Dihaoine',
        'Disathairne',
    ],
    weekdaysShort = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis'],
    weekdaysMin = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa'];

export default moment.defineLocale('gd', {
    months: months,
    monthsShort: monthsShort,
    monthsParseExact: true,
    weekdays: weekdays,
    weekdaysShort: weekdaysShort,
    weekdaysMin: weekdaysMin,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[An-diugh aig] LT',
        nextDay: '[A-màireach aig] LT',
        nextWeek: 'dddd [aig] LT',
        lastDay: '[An-dè aig] LT',
        lastWeek: 'dddd [seo chaidh] [aig] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'ann an %s',
        past: 'bho chionn %s',
        s: 'beagan diogan',
        ss: '%d diogan',
        m: 'mionaid',
        mm: '%d mionaidean',
        h: 'uair',
        hh: '%d uairean',
        d: 'latha',
        dd: '%d latha',
        M: 'mìos',
        MM: '%d mìosan',
        y: 'bliadhna',
        yy: '%d bliadhna',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(d|na|mh)/,
    ordinal: function (number) {
        var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh';
        return number + output;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Galician [gl]
//! author : Juan G. Hurtado : https://github.com/juanghurtado

import moment from '../moment';

export default moment.defineLocale('gl', {
    months: 'xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro'.split(
        '_'
    ),
    monthsShort:
        'xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'domingo_luns_martes_mércores_xoves_venres_sábado'.split('_'),
    weekdaysShort: 'dom._lun._mar._mér._xov._ven._sáb.'.split('_'),
    weekdaysMin: 'do_lu_ma_mé_xo_ve_sá'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D [de] MMMM [de] YYYY',
        LLL: 'D [de] MMMM [de] YYYY H:mm',
        LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm',
    },
    calendar: {
        sameDay: function () {
            return '[hoxe ' + (this.hours() !== 1 ? 'ás' : 'á') + '] LT';
        },
        nextDay: function () {
            return '[mañá ' + (this.hours() !== 1 ? 'ás' : 'á') + '] LT';
        },
        nextWeek: function () {
            return 'dddd [' + (this.hours() !== 1 ? 'ás' : 'a') + '] LT';
        },
        lastDay: function () {
            return '[onte ' + (this.hours() !== 1 ? 'á' : 'a') + '] LT';
        },
        lastWeek: function () {
            return (
                '[o] dddd [pasado ' + (this.hours() !== 1 ? 'ás' : 'a') + '] LT'
            );
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: function (str) {
            if (str.indexOf('un') === 0) {
                return 'n' + str;
            }
            return 'en ' + str;
        },
        past: 'hai %s',
        s: 'uns segundos',
        ss: '%d segundos',
        m: 'un minuto',
        mm: '%d minutos',
        h: 'unha hora',
        hh: '%d horas',
        d: 'un día',
        dd: '%d días',
        M: 'un mes',
        MM: '%d meses',
        y: 'un ano',
        yy: '%d anos',
    },
    dayOfMonthOrdinalParse: /\d{1,2}º/,
    ordinal: '%dº',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Konkani Devanagari script [gom-deva]
//! author : The Discoverer : https://github.com/WikiDiscoverer

import moment from '../moment';

function processRelativeTime(number, withoutSuffix, key, isFuture) {
    var format = {
        s: ['थोडया सॅकंडांनी', 'थोडे सॅकंड'],
        ss: [number + ' सॅकंडांनी', number + ' सॅकंड'],
        m: ['एका मिणटान', 'एक मिनूट'],
        mm: [number + ' मिणटांनी', number + ' मिणटां'],
        h: ['एका वरान', 'एक वर'],
        hh: [number + ' वरांनी', number + ' वरां'],
        d: ['एका दिसान', 'एक दीस'],
        dd: [number + ' दिसांनी', number + ' दीस'],
        M: ['एका म्हयन्यान', 'एक म्हयनो'],
        MM: [number + ' म्हयन्यानी', number + ' म्हयने'],
        y: ['एका वर्सान', 'एक वर्स'],
        yy: [number + ' वर्सांनी', number + ' वर्सां'],
    };
    return isFuture ? format[key][0] : format[key][1];
}

export default moment.defineLocale('gom-deva', {
    months: {
        standalone:
            'जानेवारी_फेब्रुवारी_मार्च_एप्रील_मे_जून_जुलय_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split(
                '_'
            ),
        format: 'जानेवारीच्या_फेब्रुवारीच्या_मार्चाच्या_एप्रीलाच्या_मेयाच्या_जूनाच्या_जुलयाच्या_ऑगस्टाच्या_सप्टेंबराच्या_ऑक्टोबराच्या_नोव्हेंबराच्या_डिसेंबराच्या'.split(
            '_'
        ),
        isFormat: /MMMM(\s)+D[oD]?/,
    },
    monthsShort:
        'जाने._फेब्रु._मार्च_एप्री._मे_जून_जुल._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'आयतार_सोमार_मंगळार_बुधवार_बिरेस्तार_सुक्रार_शेनवार'.split('_'),
    weekdaysShort: 'आयत._सोम._मंगळ._बुध._ब्रेस्त._सुक्र._शेन.'.split('_'),
    weekdaysMin: 'आ_सो_मं_बु_ब्रे_सु_शे'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'A h:mm [वाजतां]',
        LTS: 'A h:mm:ss [वाजतां]',
        L: 'DD-MM-YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY A h:mm [वाजतां]',
        LLLL: 'dddd, MMMM Do, YYYY, A h:mm [वाजतां]',
        llll: 'ddd, D MMM YYYY, A h:mm [वाजतां]',
    },
    calendar: {
        sameDay: '[आयज] LT',
        nextDay: '[फाल्यां] LT',
        nextWeek: '[फुडलो] dddd[,] LT',
        lastDay: '[काल] LT',
        lastWeek: '[फाटलो] dddd[,] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s',
        past: '%s आदीं',
        s: processRelativeTime,
        ss: processRelativeTime,
        m: processRelativeTime,
        mm: processRelativeTime,
        h: processRelativeTime,
        hh: processRelativeTime,
        d: processRelativeTime,
        dd: processRelativeTime,
        M: processRelativeTime,
        MM: processRelativeTime,
        y: processRelativeTime,
        yy: processRelativeTime,
    },
    dayOfMonthOrdinalParse: /\d{1,2}(वेर)/,
    ordinal: function (number, period) {
        switch (period) {
            // the ordinal 'वेर' only applies to day of the month
            case 'D':
                return number + 'वेर';
            default:
            case 'M':
            case 'Q':
            case 'DDD':
            case 'd':
            case 'w':
            case 'W':
                return number;
        }
    },
    week: {
        dow: 0, // Sunday is the first day of the week
        doy: 3, // The week that contains Jan 4th is the first week of the year (7 + 0 - 4)
    },
    meridiemParse: /राती|सकाळीं|दनपारां|सांजे/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'राती') {
            return hour < 4 ? hour : hour + 12;
        } else if (meridiem === 'सकाळीं') {
            return hour;
        } else if (meridiem === 'दनपारां') {
            return hour > 12 ? hour : hour + 12;
        } else if (meridiem === 'सांजे') {
            return hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'राती';
        } else if (hour < 12) {
            return 'सकाळीं';
        } else if (hour < 16) {
            return 'दनपारां';
        } else if (hour < 20) {
            return 'सांजे';
        } else {
            return 'राती';
        }
    },
});
//! moment.js locale configuration
//! locale : Konkani Latin script [gom-latn]
//! author : The Discoverer : https://github.com/WikiDiscoverer

import moment from '../moment';

function processRelativeTime(number, withoutSuffix, key, isFuture) {
    var format = {
        s: ['thoddea sekondamni', 'thodde sekond'],
        ss: [number + ' sekondamni', number + ' sekond'],
        m: ['eka mintan', 'ek minut'],
        mm: [number + ' mintamni', number + ' mintam'],
        h: ['eka voran', 'ek vor'],
        hh: [number + ' voramni', number + ' voram'],
        d: ['eka disan', 'ek dis'],
        dd: [number + ' disamni', number + ' dis'],
        M: ['eka mhoinean', 'ek mhoino'],
        MM: [number + ' mhoineamni', number + ' mhoine'],
        y: ['eka vorsan', 'ek voros'],
        yy: [number + ' vorsamni', number + ' vorsam'],
    };
    return isFuture ? format[key][0] : format[key][1];
}

export default moment.defineLocale('gom-latn', {
    months: {
        standalone:
            'Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr'.split(
                '_'
            ),
        format: 'Janerachea_Febrerachea_Marsachea_Abrilachea_Maiachea_Junachea_Julaiachea_Agostachea_Setembrachea_Otubrachea_Novembrachea_Dezembrachea'.split(
            '_'
        ),
        isFormat: /MMMM(\s)+D[oD]?/,
    },
    monthsShort:
        'Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.'.split('_'),
    monthsParseExact: true,
    weekdays: "Aitar_Somar_Mongllar_Budhvar_Birestar_Sukrar_Son'var".split('_'),
    weekdaysShort: 'Ait._Som._Mon._Bud._Bre._Suk._Son.'.split('_'),
    weekdaysMin: 'Ai_Sm_Mo_Bu_Br_Su_Sn'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'A h:mm [vazta]',
        LTS: 'A h:mm:ss [vazta]',
        L: 'DD-MM-YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY A h:mm [vazta]',
        LLLL: 'dddd, MMMM Do, YYYY, A h:mm [vazta]',
        llll: 'ddd, D MMM YYYY, A h:mm [vazta]',
    },
    calendar: {
        sameDay: '[Aiz] LT',
        nextDay: '[Faleam] LT',
        nextWeek: '[Fuddlo] dddd[,] LT',
        lastDay: '[Kal] LT',
        lastWeek: '[Fattlo] dddd[,] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s',
        past: '%s adim',
        s: processRelativeTime,
        ss: processRelativeTime,
        m: processRelativeTime,
        mm: processRelativeTime,
        h: processRelativeTime,
        hh: processRelativeTime,
        d: processRelativeTime,
        dd: processRelativeTime,
        M: processRelativeTime,
        MM: processRelativeTime,
        y: processRelativeTime,
        yy: processRelativeTime,
    },
    dayOfMonthOrdinalParse: /\d{1,2}(er)/,
    ordinal: function (number, period) {
        switch (period) {
            // the ordinal 'er' only applies to day of the month
            case 'D':
                return number + 'er';
            default:
            case 'M':
            case 'Q':
            case 'DDD':
            case 'd':
            case 'w':
            case 'W':
                return number;
        }
    },
    week: {
        dow: 0, // Sunday is the first day of the week
        doy: 3, // The week that contains Jan 4th is the first week of the year (7 + 0 - 4)
    },
    meridiemParse: /rati|sokallim|donparam|sanje/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'rati') {
            return hour < 4 ? hour : hour + 12;
        } else if (meridiem === 'sokallim') {
            return hour;
        } else if (meridiem === 'donparam') {
            return hour > 12 ? hour : hour + 12;
        } else if (meridiem === 'sanje') {
            return hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'rati';
        } else if (hour < 12) {
            return 'sokallim';
        } else if (hour < 16) {
            return 'donparam';
        } else if (hour < 20) {
            return 'sanje';
        } else {
            return 'rati';
        }
    },
});
//! moment.js locale configuration
//! locale : Gujarati [gu]
//! author : Kaushik Thanki : https://github.com/Kaushik1987

import moment from '../moment';

var symbolMap = {
        1: '૧',
        2: '૨',
        3: '૩',
        4: '૪',
        5: '૫',
        6: '૬',
        7: '૭',
        8: '૮',
        9: '૯',
        0: '૦',
    },
    numberMap = {
        '૧': '1',
        '૨': '2',
        '૩': '3',
        '૪': '4',
        '૫': '5',
        '૬': '6',
        '૭': '7',
        '૮': '8',
        '૯': '9',
        '૦': '0',
    };

export default moment.defineLocale('gu', {
    months: 'જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર'.split(
        '_'
    ),
    monthsShort:
        'જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'રવિવાર_સોમવાર_મંગળવાર_બુધ્વાર_ગુરુવાર_શુક્રવાર_શનિવાર'.split(
        '_'
    ),
    weekdaysShort: 'રવિ_સોમ_મંગળ_બુધ્_ગુરુ_શુક્ર_શનિ'.split('_'),
    weekdaysMin: 'ર_સો_મં_બુ_ગુ_શુ_શ'.split('_'),
    longDateFormat: {
        LT: 'A h:mm વાગ્યે',
        LTS: 'A h:mm:ss વાગ્યે',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY, A h:mm વાગ્યે',
        LLLL: 'dddd, D MMMM YYYY, A h:mm વાગ્યે',
    },
    calendar: {
        sameDay: '[આજ] LT',
        nextDay: '[કાલે] LT',
        nextWeek: 'dddd, LT',
        lastDay: '[ગઇકાલે] LT',
        lastWeek: '[પાછલા] dddd, LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s મા',
        past: '%s પહેલા',
        s: 'અમુક પળો',
        ss: '%d સેકંડ',
        m: 'એક મિનિટ',
        mm: '%d મિનિટ',
        h: 'એક કલાક',
        hh: '%d કલાક',
        d: 'એક દિવસ',
        dd: '%d દિવસ',
        M: 'એક મહિનો',
        MM: '%d મહિનો',
        y: 'એક વર્ષ',
        yy: '%d વર્ષ',
    },
    preparse: function (string) {
        return string.replace(/[૧૨૩૪૫૬૭૮૯૦]/g, function (match) {
            return numberMap[match];
        });
    },
    postformat: function (string) {
        return string.replace(/\d/g, function (match) {
            return symbolMap[match];
        });
    },
    // Gujarati notation for meridiems are quite fuzzy in practice. While there exists
    // a rigid notion of a 'Pahar' it is not used as rigidly in modern Gujarati.
    meridiemParse: /રાત|બપોર|સવાર|સાંજ/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'રાત') {
            return hour < 4 ? hour : hour + 12;
        } else if (meridiem === 'સવાર') {
            return hour;
        } else if (meridiem === 'બપોર') {
            return hour >= 10 ? hour : hour + 12;
        } else if (meridiem === 'સાંજ') {
            return hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'રાત';
        } else if (hour < 10) {
            return 'સવાર';
        } else if (hour < 17) {
            return 'બપોર';
        } else if (hour < 20) {
            return 'સાંજ';
        } else {
            return 'રાત';
        }
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Hebrew [he]
//! author : Tomer Cohen : https://github.com/tomer
//! author : Moshe Simantov : https://github.com/DevelopmentIL
//! author : Tal Ater : https://github.com/TalAter

import moment from '../moment';

export default moment.defineLocale('he', {
    months: 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split(
        '_'
    ),
    monthsShort:
        'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'),
    weekdays: 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'),
    weekdaysShort: 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'),
    weekdaysMin: 'א_ב_ג_ד_ה_ו_ש'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D [ב]MMMM YYYY',
        LLL: 'D [ב]MMMM YYYY HH:mm',
        LLLL: 'dddd, D [ב]MMMM YYYY HH:mm',
        l: 'D/M/YYYY',
        ll: 'D MMM YYYY',
        lll: 'D MMM YYYY HH:mm',
        llll: 'ddd, D MMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[היום ב־]LT',
        nextDay: '[מחר ב־]LT',
        nextWeek: 'dddd [בשעה] LT',
        lastDay: '[אתמול ב־]LT',
        lastWeek: '[ביום] dddd [האחרון בשעה] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'בעוד %s',
        past: 'לפני %s',
        s: 'מספר שניות',
        ss: '%d שניות',
        m: 'דקה',
        mm: '%d דקות',
        h: 'שעה',
        hh: function (number) {
            if (number === 2) {
                return 'שעתיים';
            }
            return number + ' שעות';
        },
        d: 'יום',
        dd: function (number) {
            if (number === 2) {
                return 'יומיים';
            }
            return number + ' ימים';
        },
        M: 'חודש',
        MM: function (number) {
            if (number === 2) {
                return 'חודשיים';
            }
            return number + ' חודשים';
        },
        y: 'שנה',
        yy: function (number) {
            if (number === 2) {
                return 'שנתיים';
            } else if (number % 10 === 0 && number !== 10) {
                return number + ' שנה';
            }
            return number + ' שנים';
        },
    },
    meridiemParse:
        /אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,
    isPM: function (input) {
        return /^(אחה"צ|אחרי הצהריים|בערב)$/.test(input);
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 5) {
            return 'לפנות בוקר';
        } else if (hour < 10) {
            return 'בבוקר';
        } else if (hour < 12) {
            return isLower ? 'לפנה"צ' : 'לפני הצהריים';
        } else if (hour < 18) {
            return isLower ? 'אחה"צ' : 'אחרי הצהריים';
        } else {
            return 'בערב';
        }
    },
});
//! moment.js locale configuration
//! locale : Hindi [hi]
//! author : Mayank Singhal : https://github.com/mayanksinghal

import moment from '../moment';

var symbolMap = {
        1: '१',
        2: '२',
        3: '३',
        4: '४',
        5: '५',
        6: '६',
        7: '७',
        8: '८',
        9: '९',
        0: '०',
    },
    numberMap = {
        '१': '1',
        '२': '2',
        '३': '3',
        '४': '4',
        '५': '5',
        '६': '6',
        '७': '7',
        '८': '8',
        '९': '9',
        '०': '0',
    },
    monthsParse = [
        /^जन/i,
        /^फ़र|फर/i,
        /^मार्च/i,
        /^अप्रै/i,
        /^मई/i,
        /^जून/i,
        /^जुल/i,
        /^अग/i,
        /^सितं|सित/i,
        /^अक्टू/i,
        /^नव|नवं/i,
        /^दिसं|दिस/i,
    ],
    shortMonthsParse = [
        /^जन/i,
        /^फ़र/i,
        /^मार्च/i,
        /^अप्रै/i,
        /^मई/i,
        /^जून/i,
        /^जुल/i,
        /^अग/i,
        /^सित/i,
        /^अक्टू/i,
        /^नव/i,
        /^दिस/i,
    ];

export default moment.defineLocale('hi', {
    months: {
        format: 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split(
            '_'
        ),
        standalone:
            'जनवरी_फरवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितंबर_अक्टूबर_नवंबर_दिसंबर'.split(
                '_'
            ),
    },
    monthsShort:
        'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'),
    weekdays: 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
    weekdaysShort: 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'),
    weekdaysMin: 'र_सो_मं_बु_गु_शु_श'.split('_'),
    longDateFormat: {
        LT: 'A h:mm बजे',
        LTS: 'A h:mm:ss बजे',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY, A h:mm बजे',
        LLLL: 'dddd, D MMMM YYYY, A h:mm बजे',
    },

    monthsParse: monthsParse,
    longMonthsParse: monthsParse,
    shortMonthsParse: shortMonthsParse,

    monthsRegex:
        /^(जनवरी|जन\.?|फ़रवरी|फरवरी|फ़र\.?|मार्च?|अप्रैल|अप्रै\.?|मई?|जून?|जुलाई|जुल\.?|अगस्त|अग\.?|सितम्बर|सितंबर|सित\.?|अक्टूबर|अक्टू\.?|नवम्बर|नवंबर|नव\.?|दिसम्बर|दिसंबर|दिस\.?)/i,

    monthsShortRegex:
        /^(जनवरी|जन\.?|फ़रवरी|फरवरी|फ़र\.?|मार्च?|अप्रैल|अप्रै\.?|मई?|जून?|जुलाई|जुल\.?|अगस्त|अग\.?|सितम्बर|सितंबर|सित\.?|अक्टूबर|अक्टू\.?|नवम्बर|नवंबर|नव\.?|दिसम्बर|दिसंबर|दिस\.?)/i,

    monthsStrictRegex:
        /^(जनवरी?|फ़रवरी|फरवरी?|मार्च?|अप्रैल?|मई?|जून?|जुलाई?|अगस्त?|सितम्बर|सितंबर|सित?\.?|अक्टूबर|अक्टू\.?|नवम्बर|नवंबर?|दिसम्बर|दिसंबर?)/i,

    monthsShortStrictRegex:
        /^(जन\.?|फ़र\.?|मार्च?|अप्रै\.?|मई?|जून?|जुल\.?|अग\.?|सित\.?|अक्टू\.?|नव\.?|दिस\.?)/i,

    calendar: {
        sameDay: '[आज] LT',
        nextDay: '[कल] LT',
        nextWeek: 'dddd, LT',
        lastDay: '[कल] LT',
        lastWeek: '[पिछले] dddd, LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s में',
        past: '%s पहले',
        s: 'कुछ ही क्षण',
        ss: '%d सेकंड',
        m: 'एक मिनट',
        mm: '%d मिनट',
        h: 'एक घंटा',
        hh: '%d घंटे',
        d: 'एक दिन',
        dd: '%d दिन',
        M: 'एक महीने',
        MM: '%d महीने',
        y: 'एक वर्ष',
        yy: '%d वर्ष',
    },
    preparse: function (string) {
        return string.replace(/[१२३४५६७८९०]/g, function (match) {
            return numberMap[match];
        });
    },
    postformat: function (string) {
        return string.replace(/\d/g, function (match) {
            return symbolMap[match];
        });
    },
    // Hindi notation for meridiems are quite fuzzy in practice. While there exists
    // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.
    meridiemParse: /रात|सुबह|दोपहर|शाम/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'रात') {
            return hour < 4 ? hour : hour + 12;
        } else if (meridiem === 'सुबह') {
            return hour;
        } else if (meridiem === 'दोपहर') {
            return hour >= 10 ? hour : hour + 12;
        } else if (meridiem === 'शाम') {
            return hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'रात';
        } else if (hour < 10) {
            return 'सुबह';
        } else if (hour < 17) {
            return 'दोपहर';
        } else if (hour < 20) {
            return 'शाम';
        } else {
            return 'रात';
        }
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Croatian [hr]
//! author : Bojan Marković : https://github.com/bmarkovic

import moment from '../moment';

function translate(number, withoutSuffix, key) {
    var result = number + ' ';
    switch (key) {
        case 'ss':
            if (number === 1) {
                result += 'sekunda';
            } else if (number === 2 || number === 3 || number === 4) {
                result += 'sekunde';
            } else {
                result += 'sekundi';
            }
            return result;
        case 'm':
            return withoutSuffix ? 'jedna minuta' : 'jedne minute';
        case 'mm':
            if (number === 1) {
                result += 'minuta';
            } else if (number === 2 || number === 3 || number === 4) {
                result += 'minute';
            } else {
                result += 'minuta';
            }
            return result;
        case 'h':
            return withoutSuffix ? 'jedan sat' : 'jednog sata';
        case 'hh':
            if (number === 1) {
                result += 'sat';
            } else if (number === 2 || number === 3 || number === 4) {
                result += 'sata';
            } else {
                result += 'sati';
            }
            return result;
        case 'dd':
            if (number === 1) {
                result += 'dan';
            } else {
                result += 'dana';
            }
            return result;
        case 'MM':
            if (number === 1) {
                result += 'mjesec';
            } else if (number === 2 || number === 3 || number === 4) {
                result += 'mjeseca';
            } else {
                result += 'mjeseci';
            }
            return result;
        case 'yy':
            if (number === 1) {
                result += 'godina';
            } else if (number === 2 || number === 3 || number === 4) {
                result += 'godine';
            } else {
                result += 'godina';
            }
            return result;
    }
}

export default moment.defineLocale('hr', {
    months: {
        format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split(
            '_'
        ),
        standalone:
            'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split(
                '_'
            ),
    },
    monthsShort:
        'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split(
        '_'
    ),
    weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
    weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'Do MMMM YYYY',
        LLL: 'Do MMMM YYYY H:mm',
        LLLL: 'dddd, Do MMMM YYYY H:mm',
    },
    calendar: {
        sameDay: '[danas u] LT',
        nextDay: '[sutra u] LT',
        nextWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[u] [nedjelju] [u] LT';
                case 3:
                    return '[u] [srijedu] [u] LT';
                case 6:
                    return '[u] [subotu] [u] LT';
                case 1:
                case 2:
                case 4:
                case 5:
                    return '[u] dddd [u] LT';
            }
        },
        lastDay: '[jučer u] LT',
        lastWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[prošlu] [nedjelju] [u] LT';
                case 3:
                    return '[prošlu] [srijedu] [u] LT';
                case 6:
                    return '[prošle] [subote] [u] LT';
                case 1:
                case 2:
                case 4:
                case 5:
                    return '[prošli] dddd [u] LT';
            }
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'za %s',
        past: 'prije %s',
        s: 'par sekundi',
        ss: translate,
        m: translate,
        mm: translate,
        h: translate,
        hh: translate,
        d: 'dan',
        dd: translate,
        M: 'mjesec',
        MM: translate,
        y: 'godinu',
        yy: translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Hungarian [hu]
//! author : Adam Brunner : https://github.com/adambrunner
//! author : Peter Viszt  : https://github.com/passatgt

import moment from '../moment';

var weekEndings =
    'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');
function translate(number, withoutSuffix, key, isFuture) {
    var num = number;
    switch (key) {
        case 's':
            return isFuture || withoutSuffix
                ? 'néhány másodperc'
                : 'néhány másodperce';
        case 'ss':
            return num + (isFuture || withoutSuffix)
                ? ' másodperc'
                : ' másodperce';
        case 'm':
            return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce');
        case 'mm':
            return num + (isFuture || withoutSuffix ? ' perc' : ' perce');
        case 'h':
            return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája');
        case 'hh':
            return num + (isFuture || withoutSuffix ? ' óra' : ' órája');
        case 'd':
            return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja');
        case 'dd':
            return num + (isFuture || withoutSuffix ? ' nap' : ' napja');
        case 'M':
            return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
        case 'MM':
            return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
        case 'y':
            return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve');
        case 'yy':
            return num + (isFuture || withoutSuffix ? ' év' : ' éve');
    }
    return '';
}
function week(isFuture) {
    return (
        (isFuture ? '' : '[múlt] ') +
        '[' +
        weekEndings[this.day()] +
        '] LT[-kor]'
    );
}

export default moment.defineLocale('hu', {
    months: 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split(
        '_'
    ),
    monthsShort:
        'jan._feb._márc._ápr._máj._jún._júl._aug._szept._okt._nov._dec.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'),
    weekdaysShort: 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'),
    weekdaysMin: 'v_h_k_sze_cs_p_szo'.split('_'),
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'YYYY.MM.DD.',
        LL: 'YYYY. MMMM D.',
        LLL: 'YYYY. MMMM D. H:mm',
        LLLL: 'YYYY. MMMM D., dddd H:mm',
    },
    meridiemParse: /de|du/i,
    isPM: function (input) {
        return input.charAt(1).toLowerCase() === 'u';
    },
    meridiem: function (hours, minutes, isLower) {
        if (hours < 12) {
            return isLower === true ? 'de' : 'DE';
        } else {
            return isLower === true ? 'du' : 'DU';
        }
    },
    calendar: {
        sameDay: '[ma] LT[-kor]',
        nextDay: '[holnap] LT[-kor]',
        nextWeek: function () {
            return week.call(this, true);
        },
        lastDay: '[tegnap] LT[-kor]',
        lastWeek: function () {
            return week.call(this, false);
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s múlva',
        past: '%s',
        s: translate,
        ss: translate,
        m: translate,
        mm: translate,
        h: translate,
        hh: translate,
        d: translate,
        dd: translate,
        M: translate,
        MM: translate,
        y: translate,
        yy: translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Armenian [hy-am]
//! author : Armendarabyan : https://github.com/armendarabyan

import moment from '../moment';

export default moment.defineLocale('hy-am', {
    months: {
        format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split(
            '_'
        ),
        standalone:
            'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split(
                '_'
            ),
    },
    monthsShort: 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'),
    weekdays:
        'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split(
            '_'
        ),
    weekdaysShort: 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
    weekdaysMin: 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY թ.',
        LLL: 'D MMMM YYYY թ., HH:mm',
        LLLL: 'dddd, D MMMM YYYY թ., HH:mm',
    },
    calendar: {
        sameDay: '[այսօր] LT',
        nextDay: '[վաղը] LT',
        lastDay: '[երեկ] LT',
        nextWeek: function () {
            return 'dddd [օրը ժամը] LT';
        },
        lastWeek: function () {
            return '[անցած] dddd [օրը ժամը] LT';
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s հետո',
        past: '%s առաջ',
        s: 'մի քանի վայրկյան',
        ss: '%d վայրկյան',
        m: 'րոպե',
        mm: '%d րոպե',
        h: 'ժամ',
        hh: '%d ժամ',
        d: 'օր',
        dd: '%d օր',
        M: 'ամիս',
        MM: '%d ամիս',
        y: 'տարի',
        yy: '%d տարի',
    },
    meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/,
    isPM: function (input) {
        return /^(ցերեկվա|երեկոյան)$/.test(input);
    },
    meridiem: function (hour) {
        if (hour < 4) {
            return 'գիշերվա';
        } else if (hour < 12) {
            return 'առավոտվա';
        } else if (hour < 17) {
            return 'ցերեկվա';
        } else {
            return 'երեկոյան';
        }
    },
    dayOfMonthOrdinalParse: /\d{1,2}|\d{1,2}-(ին|րդ)/,
    ordinal: function (number, period) {
        switch (period) {
            case 'DDD':
            case 'w':
            case 'W':
            case 'DDDo':
                if (number === 1) {
                    return number + '-ին';
                }
                return number + '-րդ';
            default:
                return number;
        }
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Indonesian [id]
//! author : Mohammad Satrio Utomo : https://github.com/tyok
//! reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan

import moment from '../moment';

export default moment.defineLocale('id', {
    months: 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des'.split('_'),
    weekdays: 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'),
    weekdaysShort: 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'),
    weekdaysMin: 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'),
    longDateFormat: {
        LT: 'HH.mm',
        LTS: 'HH.mm.ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY [pukul] HH.mm',
        LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',
    },
    meridiemParse: /pagi|siang|sore|malam/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'pagi') {
            return hour;
        } else if (meridiem === 'siang') {
            return hour >= 11 ? hour : hour + 12;
        } else if (meridiem === 'sore' || meridiem === 'malam') {
            return hour + 12;
        }
    },
    meridiem: function (hours, minutes, isLower) {
        if (hours < 11) {
            return 'pagi';
        } else if (hours < 15) {
            return 'siang';
        } else if (hours < 19) {
            return 'sore';
        } else {
            return 'malam';
        }
    },
    calendar: {
        sameDay: '[Hari ini pukul] LT',
        nextDay: '[Besok pukul] LT',
        nextWeek: 'dddd [pukul] LT',
        lastDay: '[Kemarin pukul] LT',
        lastWeek: 'dddd [lalu pukul] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'dalam %s',
        past: '%s yang lalu',
        s: 'beberapa detik',
        ss: '%d detik',
        m: 'semenit',
        mm: '%d menit',
        h: 'sejam',
        hh: '%d jam',
        d: 'sehari',
        dd: '%d hari',
        M: 'sebulan',
        MM: '%d bulan',
        y: 'setahun',
        yy: '%d tahun',
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Icelandic [is]
//! author : Hinrik Örn Sigurðsson : https://github.com/hinrik

import moment from '../moment';

function plural(n) {
    if (n % 100 === 11) {
        return true;
    } else if (n % 10 === 1) {
        return false;
    }
    return true;
}
function translate(number, withoutSuffix, key, isFuture) {
    var result = number + ' ';
    switch (key) {
        case 's':
            return withoutSuffix || isFuture
                ? 'nokkrar sekúndur'
                : 'nokkrum sekúndum';
        case 'ss':
            if (plural(number)) {
                return (
                    result +
                    (withoutSuffix || isFuture ? 'sekúndur' : 'sekúndum')
                );
            }
            return result + 'sekúnda';
        case 'm':
            return withoutSuffix ? 'mínúta' : 'mínútu';
        case 'mm':
            if (plural(number)) {
                return (
                    result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum')
                );
            } else if (withoutSuffix) {
                return result + 'mínúta';
            }
            return result + 'mínútu';
        case 'hh':
            if (plural(number)) {
                return (
                    result +
                    (withoutSuffix || isFuture
                        ? 'klukkustundir'
                        : 'klukkustundum')
                );
            }
            return result + 'klukkustund';
        case 'd':
            if (withoutSuffix) {
                return 'dagur';
            }
            return isFuture ? 'dag' : 'degi';
        case 'dd':
            if (plural(number)) {
                if (withoutSuffix) {
                    return result + 'dagar';
                }
                return result + (isFuture ? 'daga' : 'dögum');
            } else if (withoutSuffix) {
                return result + 'dagur';
            }
            return result + (isFuture ? 'dag' : 'degi');
        case 'M':
            if (withoutSuffix) {
                return 'mánuður';
            }
            return isFuture ? 'mánuð' : 'mánuði';
        case 'MM':
            if (plural(number)) {
                if (withoutSuffix) {
                    return result + 'mánuðir';
                }
                return result + (isFuture ? 'mánuði' : 'mánuðum');
            } else if (withoutSuffix) {
                return result + 'mánuður';
            }
            return result + (isFuture ? 'mánuð' : 'mánuði');
        case 'y':
            return withoutSuffix || isFuture ? 'ár' : 'ári';
        case 'yy':
            if (plural(number)) {
                return result + (withoutSuffix || isFuture ? 'ár' : 'árum');
            }
            return result + (withoutSuffix || isFuture ? 'ár' : 'ári');
    }
}

export default moment.defineLocale('is', {
    months: 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split(
        '_'
    ),
    monthsShort: 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'),
    weekdays:
        'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split(
            '_'
        ),
    weekdaysShort: 'sun_mán_þri_mið_fim_fös_lau'.split('_'),
    weekdaysMin: 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'),
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY [kl.] H:mm',
        LLLL: 'dddd, D. MMMM YYYY [kl.] H:mm',
    },
    calendar: {
        sameDay: '[í dag kl.] LT',
        nextDay: '[á morgun kl.] LT',
        nextWeek: 'dddd [kl.] LT',
        lastDay: '[í gær kl.] LT',
        lastWeek: '[síðasta] dddd [kl.] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'eftir %s',
        past: 'fyrir %s síðan',
        s: translate,
        ss: translate,
        m: translate,
        mm: translate,
        h: 'klukkustund',
        hh: translate,
        d: translate,
        dd: translate,
        M: translate,
        MM: translate,
        y: translate,
        yy: translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Italian (Switzerland) [it-ch]
//! author : xfh : https://github.com/xfh

import moment from '../moment';

export default moment.defineLocale('it-ch', {
    months: 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split(
        '_'
    ),
    monthsShort: 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),
    weekdays: 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split(
        '_'
    ),
    weekdaysShort: 'dom_lun_mar_mer_gio_ven_sab'.split('_'),
    weekdaysMin: 'do_lu_ma_me_gi_ve_sa'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Oggi alle] LT',
        nextDay: '[Domani alle] LT',
        nextWeek: 'dddd [alle] LT',
        lastDay: '[Ieri alle] LT',
        lastWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[la scorsa] dddd [alle] LT';
                default:
                    return '[lo scorso] dddd [alle] LT';
            }
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: function (s) {
            return (/^[0-9].+$/.test(s) ? 'tra' : 'in') + ' ' + s;
        },
        past: '%s fa',
        s: 'alcuni secondi',
        ss: '%d secondi',
        m: 'un minuto',
        mm: '%d minuti',
        h: "un'ora",
        hh: '%d ore',
        d: 'un giorno',
        dd: '%d giorni',
        M: 'un mese',
        MM: '%d mesi',
        y: 'un anno',
        yy: '%d anni',
    },
    dayOfMonthOrdinalParse: /\d{1,2}º/,
    ordinal: '%dº',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Italian [it]
//! author : Lorenzo : https://github.com/aliem
//! author: Mattia Larentis: https://github.com/nostalgiaz
//! author: Marco : https://github.com/Manfre98

import moment from '../moment';

export default moment.defineLocale('it', {
    months: 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split(
        '_'
    ),
    monthsShort: 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),
    weekdays: 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split(
        '_'
    ),
    weekdaysShort: 'dom_lun_mar_mer_gio_ven_sab'.split('_'),
    weekdaysMin: 'do_lu_ma_me_gi_ve_sa'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: function () {
            return (
                '[Oggi a' +
                (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : "ll'") +
                ']LT'
            );
        },
        nextDay: function () {
            return (
                '[Domani a' +
                (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : "ll'") +
                ']LT'
            );
        },
        nextWeek: function () {
            return (
                'dddd [a' +
                (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : "ll'") +
                ']LT'
            );
        },
        lastDay: function () {
            return (
                '[Ieri a' +
                (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : "ll'") +
                ']LT'
            );
        },
        lastWeek: function () {
            switch (this.day()) {
                case 0:
                    return (
                        '[La scorsa] dddd [a' +
                        (this.hours() > 1
                            ? 'lle '
                            : this.hours() === 0
                            ? ' '
                            : "ll'") +
                        ']LT'
                    );
                default:
                    return (
                        '[Lo scorso] dddd [a' +
                        (this.hours() > 1
                            ? 'lle '
                            : this.hours() === 0
                            ? ' '
                            : "ll'") +
                        ']LT'
                    );
            }
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'tra %s',
        past: '%s fa',
        s: 'alcuni secondi',
        ss: '%d secondi',
        m: 'un minuto',
        mm: '%d minuti',
        h: "un'ora",
        hh: '%d ore',
        d: 'un giorno',
        dd: '%d giorni',
        w: 'una settimana',
        ww: '%d settimane',
        M: 'un mese',
        MM: '%d mesi',
        y: 'un anno',
        yy: '%d anni',
    },
    dayOfMonthOrdinalParse: /\d{1,2}º/,
    ordinal: '%dº',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Japanese [ja]
//! author : LI Long : https://github.com/baryon

import moment from '../moment';

export default moment.defineLocale('ja', {
    eras: [
        {
            since: '2019-05-01',
            offset: 1,
            name: '令和',
            narrow: '㋿',
            abbr: 'R',
        },
        {
            since: '1989-01-08',
            until: '2019-04-30',
            offset: 1,
            name: '平成',
            narrow: '㍻',
            abbr: 'H',
        },
        {
            since: '1926-12-25',
            until: '1989-01-07',
            offset: 1,
            name: '昭和',
            narrow: '㍼',
            abbr: 'S',
        },
        {
            since: '1912-07-30',
            until: '1926-12-24',
            offset: 1,
            name: '大正',
            narrow: '㍽',
            abbr: 'T',
        },
        {
            since: '1873-01-01',
            until: '1912-07-29',
            offset: 6,
            name: '明治',
            narrow: '㍾',
            abbr: 'M',
        },
        {
            since: '0001-01-01',
            until: '1873-12-31',
            offset: 1,
            name: '西暦',
            narrow: 'AD',
            abbr: 'AD',
        },
        {
            since: '0000-12-31',
            until: -Infinity,
            offset: 1,
            name: '紀元前',
            narrow: 'BC',
            abbr: 'BC',
        },
    ],
    eraYearOrdinalRegex: /(元|\d+)年/,
    eraYearOrdinalParse: function (input, match) {
        return match[1] === '元' ? 1 : parseInt(match[1] || input, 10);
    },
    months: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
    monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(
        '_'
    ),
    weekdays: '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'),
    weekdaysShort: '日_月_火_水_木_金_土'.split('_'),
    weekdaysMin: '日_月_火_水_木_金_土'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'YYYY/MM/DD',
        LL: 'YYYY年M月D日',
        LLL: 'YYYY年M月D日 HH:mm',
        LLLL: 'YYYY年M月D日 dddd HH:mm',
        l: 'YYYY/MM/DD',
        ll: 'YYYY年M月D日',
        lll: 'YYYY年M月D日 HH:mm',
        llll: 'YYYY年M月D日(ddd) HH:mm',
    },
    meridiemParse: /午前|午後/i,
    isPM: function (input) {
        return input === '午後';
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return '午前';
        } else {
            return '午後';
        }
    },
    calendar: {
        sameDay: '[今日] LT',
        nextDay: '[明日] LT',
        nextWeek: function (now) {
            if (now.week() !== this.week()) {
                return '[来週]dddd LT';
            } else {
                return 'dddd LT';
            }
        },
        lastDay: '[昨日] LT',
        lastWeek: function (now) {
            if (this.week() !== now.week()) {
                return '[先週]dddd LT';
            } else {
                return 'dddd LT';
            }
        },
        sameElse: 'L',
    },
    dayOfMonthOrdinalParse: /\d{1,2}日/,
    ordinal: function (number, period) {
        switch (period) {
            case 'y':
                return number === 1 ? '元年' : number + '年';
            case 'd':
            case 'D':
            case 'DDD':
                return number + '日';
            default:
                return number;
        }
    },
    relativeTime: {
        future: '%s後',
        past: '%s前',
        s: '数秒',
        ss: '%d秒',
        m: '1分',
        mm: '%d分',
        h: '1時間',
        hh: '%d時間',
        d: '1日',
        dd: '%d日',
        M: '1ヶ月',
        MM: '%dヶ月',
        y: '1年',
        yy: '%d年',
    },
});
//! moment.js locale configuration
//! locale : Javanese [jv]
//! author : Rony Lantip : https://github.com/lantip
//! reference: http://jv.wikipedia.org/wiki/Basa_Jawa

import moment from '../moment';

export default moment.defineLocale('jv', {
    months: 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'),
    weekdays: 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'),
    weekdaysShort: 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'),
    weekdaysMin: 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'),
    longDateFormat: {
        LT: 'HH.mm',
        LTS: 'HH.mm.ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY [pukul] HH.mm',
        LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',
    },
    meridiemParse: /enjing|siyang|sonten|ndalu/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'enjing') {
            return hour;
        } else if (meridiem === 'siyang') {
            return hour >= 11 ? hour : hour + 12;
        } else if (meridiem === 'sonten' || meridiem === 'ndalu') {
            return hour + 12;
        }
    },
    meridiem: function (hours, minutes, isLower) {
        if (hours < 11) {
            return 'enjing';
        } else if (hours < 15) {
            return 'siyang';
        } else if (hours < 19) {
            return 'sonten';
        } else {
            return 'ndalu';
        }
    },
    calendar: {
        sameDay: '[Dinten puniko pukul] LT',
        nextDay: '[Mbenjang pukul] LT',
        nextWeek: 'dddd [pukul] LT',
        lastDay: '[Kala wingi pukul] LT',
        lastWeek: 'dddd [kepengker pukul] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'wonten ing %s',
        past: '%s ingkang kepengker',
        s: 'sawetawis detik',
        ss: '%d detik',
        m: 'setunggal menit',
        mm: '%d menit',
        h: 'setunggal jam',
        hh: '%d jam',
        d: 'sedinten',
        dd: '%d dinten',
        M: 'sewulan',
        MM: '%d wulan',
        y: 'setaun',
        yy: '%d taun',
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Georgian [ka]
//! author : Irakli Janiashvili : https://github.com/IrakliJani

import moment from '../moment';

export default moment.defineLocale('ka', {
    months: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split(
        '_'
    ),
    monthsShort: 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'),
    weekdays: {
        standalone:
            'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split(
                '_'
            ),
        format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split(
            '_'
        ),
        isFormat: /(წინა|შემდეგ)/,
    },
    weekdaysShort: 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'),
    weekdaysMin: 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[დღეს] LT[-ზე]',
        nextDay: '[ხვალ] LT[-ზე]',
        lastDay: '[გუშინ] LT[-ზე]',
        nextWeek: '[შემდეგ] dddd LT[-ზე]',
        lastWeek: '[წინა] dddd LT-ზე',
        sameElse: 'L',
    },
    relativeTime: {
        future: function (s) {
            return s.replace(
                /(წამ|წუთ|საათ|წელ|დღ|თვ)(ი|ე)/,
                function ($0, $1, $2) {
                    return $2 === 'ი' ? $1 + 'ში' : $1 + $2 + 'ში';
                }
            );
        },
        past: function (s) {
            if (/(წამი|წუთი|საათი|დღე|თვე)/.test(s)) {
                return s.replace(/(ი|ე)$/, 'ის წინ');
            }
            if (/წელი/.test(s)) {
                return s.replace(/წელი$/, 'წლის წინ');
            }
            return s;
        },
        s: 'რამდენიმე წამი',
        ss: '%d წამი',
        m: 'წუთი',
        mm: '%d წუთი',
        h: 'საათი',
        hh: '%d საათი',
        d: 'დღე',
        dd: '%d დღე',
        M: 'თვე',
        MM: '%d თვე',
        y: 'წელი',
        yy: '%d წელი',
    },
    dayOfMonthOrdinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,
    ordinal: function (number) {
        if (number === 0) {
            return number;
        }
        if (number === 1) {
            return number + '-ლი';
        }
        if (
            number < 20 ||
            (number <= 100 && number % 20 === 0) ||
            number % 100 === 0
        ) {
            return 'მე-' + number;
        }
        return number + '-ე';
    },
    week: {
        dow: 1,
        doy: 7,
    },
});
//! moment.js locale configuration
//! locale : Kazakh [kk]
//! authors : Nurlan Rakhimzhanov : https://github.com/nurlan

import moment from '../moment';

var suffixes = {
    0: '-ші',
    1: '-ші',
    2: '-ші',
    3: '-ші',
    4: '-ші',
    5: '-ші',
    6: '-шы',
    7: '-ші',
    8: '-ші',
    9: '-шы',
    10: '-шы',
    20: '-шы',
    30: '-шы',
    40: '-шы',
    50: '-ші',
    60: '-шы',
    70: '-ші',
    80: '-ші',
    90: '-шы',
    100: '-ші',
};

export default moment.defineLocale('kk', {
    months: 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split(
        '_'
    ),
    monthsShort: 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'),
    weekdays: 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split(
        '_'
    ),
    weekdaysShort: 'жек_дүй_сей_сәр_бей_жұм_сен'.split('_'),
    weekdaysMin: 'жк_дй_сй_ср_бй_жм_сн'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Бүгін сағат] LT',
        nextDay: '[Ертең сағат] LT',
        nextWeek: 'dddd [сағат] LT',
        lastDay: '[Кеше сағат] LT',
        lastWeek: '[Өткен аптаның] dddd [сағат] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s ішінде',
        past: '%s бұрын',
        s: 'бірнеше секунд',
        ss: '%d секунд',
        m: 'бір минут',
        mm: '%d минут',
        h: 'бір сағат',
        hh: '%d сағат',
        d: 'бір күн',
        dd: '%d күн',
        M: 'бір ай',
        MM: '%d ай',
        y: 'бір жыл',
        yy: '%d жыл',
    },
    dayOfMonthOrdinalParse: /\d{1,2}-(ші|шы)/,
    ordinal: function (number) {
        var a = number % 10,
            b = number >= 100 ? 100 : null;
        return number + (suffixes[number] || suffixes[a] || suffixes[b]);
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Cambodian [km]
//! author : Kruy Vanna : https://github.com/kruyvanna

import moment from '../moment';

var symbolMap = {
        1: '១',
        2: '២',
        3: '៣',
        4: '៤',
        5: '៥',
        6: '៦',
        7: '៧',
        8: '៨',
        9: '៩',
        0: '០',
    },
    numberMap = {
        '១': '1',
        '២': '2',
        '៣': '3',
        '៤': '4',
        '៥': '5',
        '៦': '6',
        '៧': '7',
        '៨': '8',
        '៩': '9',
        '០': '0',
    };

export default moment.defineLocale('km', {
    months: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split(
        '_'
    ),
    monthsShort:
        'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split(
            '_'
        ),
    weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
    weekdaysShort: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'),
    weekdaysMin: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    meridiemParse: /ព្រឹក|ល្ងាច/,
    isPM: function (input) {
        return input === 'ល្ងាច';
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return 'ព្រឹក';
        } else {
            return 'ល្ងាច';
        }
    },
    calendar: {
        sameDay: '[ថ្ងៃនេះ ម៉ោង] LT',
        nextDay: '[ស្អែក ម៉ោង] LT',
        nextWeek: 'dddd [ម៉ោង] LT',
        lastDay: '[ម្សិលមិញ ម៉ោង] LT',
        lastWeek: 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%sទៀត',
        past: '%sមុន',
        s: 'ប៉ុន្មានវិនាទី',
        ss: '%d វិនាទី',
        m: 'មួយនាទី',
        mm: '%d នាទី',
        h: 'មួយម៉ោង',
        hh: '%d ម៉ោង',
        d: 'មួយថ្ងៃ',
        dd: '%d ថ្ងៃ',
        M: 'មួយខែ',
        MM: '%d ខែ',
        y: 'មួយឆ្នាំ',
        yy: '%d ឆ្នាំ',
    },
    dayOfMonthOrdinalParse: /ទី\d{1,2}/,
    ordinal: 'ទី%d',
    preparse: function (string) {
        return string.replace(/[១២៣៤៥៦៧៨៩០]/g, function (match) {
            return numberMap[match];
        });
    },
    postformat: function (string) {
        return string.replace(/\d/g, function (match) {
            return symbolMap[match];
        });
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Kannada [kn]
//! author : Rajeev Naik : https://github.com/rajeevnaikte

import moment from '../moment';

var symbolMap = {
        1: '೧',
        2: '೨',
        3: '೩',
        4: '೪',
        5: '೫',
        6: '೬',
        7: '೭',
        8: '೮',
        9: '೯',
        0: '೦',
    },
    numberMap = {
        '೧': '1',
        '೨': '2',
        '೩': '3',
        '೪': '4',
        '೫': '5',
        '೬': '6',
        '೭': '7',
        '೮': '8',
        '೯': '9',
        '೦': '0',
    };

export default moment.defineLocale('kn', {
    months: 'ಜನವರಿ_ಫೆಬ್ರವರಿ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬರ್_ಅಕ್ಟೋಬರ್_ನವೆಂಬರ್_ಡಿಸೆಂಬರ್'.split(
        '_'
    ),
    monthsShort:
        'ಜನ_ಫೆಬ್ರ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂ_ಅಕ್ಟೋ_ನವೆಂ_ಡಿಸೆಂ'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'ಭಾನುವಾರ_ಸೋಮವಾರ_ಮಂಗಳವಾರ_ಬುಧವಾರ_ಗುರುವಾರ_ಶುಕ್ರವಾರ_ಶನಿವಾರ'.split(
        '_'
    ),
    weekdaysShort: 'ಭಾನು_ಸೋಮ_ಮಂಗಳ_ಬುಧ_ಗುರು_ಶುಕ್ರ_ಶನಿ'.split('_'),
    weekdaysMin: 'ಭಾ_ಸೋ_ಮಂ_ಬು_ಗು_ಶು_ಶ'.split('_'),
    longDateFormat: {
        LT: 'A h:mm',
        LTS: 'A h:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY, A h:mm',
        LLLL: 'dddd, D MMMM YYYY, A h:mm',
    },
    calendar: {
        sameDay: '[ಇಂದು] LT',
        nextDay: '[ನಾಳೆ] LT',
        nextWeek: 'dddd, LT',
        lastDay: '[ನಿನ್ನೆ] LT',
        lastWeek: '[ಕೊನೆಯ] dddd, LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s ನಂತರ',
        past: '%s ಹಿಂದೆ',
        s: 'ಕೆಲವು ಕ್ಷಣಗಳು',
        ss: '%d ಸೆಕೆಂಡುಗಳು',
        m: 'ಒಂದು ನಿಮಿಷ',
        mm: '%d ನಿಮಿಷ',
        h: 'ಒಂದು ಗಂಟೆ',
        hh: '%d ಗಂಟೆ',
        d: 'ಒಂದು ದಿನ',
        dd: '%d ದಿನ',
        M: 'ಒಂದು ತಿಂಗಳು',
        MM: '%d ತಿಂಗಳು',
        y: 'ಒಂದು ವರ್ಷ',
        yy: '%d ವರ್ಷ',
    },
    preparse: function (string) {
        return string.replace(/[೧೨೩೪೫೬೭೮೯೦]/g, function (match) {
            return numberMap[match];
        });
    },
    postformat: function (string) {
        return string.replace(/\d/g, function (match) {
            return symbolMap[match];
        });
    },
    meridiemParse: /ರಾತ್ರಿ|ಬೆಳಿಗ್ಗೆ|ಮಧ್ಯಾಹ್ನ|ಸಂಜೆ/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'ರಾತ್ರಿ') {
            return hour < 4 ? hour : hour + 12;
        } else if (meridiem === 'ಬೆಳಿಗ್ಗೆ') {
            return hour;
        } else if (meridiem === 'ಮಧ್ಯಾಹ್ನ') {
            return hour >= 10 ? hour : hour + 12;
        } else if (meridiem === 'ಸಂಜೆ') {
            return hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'ರಾತ್ರಿ';
        } else if (hour < 10) {
            return 'ಬೆಳಿಗ್ಗೆ';
        } else if (hour < 17) {
            return 'ಮಧ್ಯಾಹ್ನ';
        } else if (hour < 20) {
            return 'ಸಂಜೆ';
        } else {
            return 'ರಾತ್ರಿ';
        }
    },
    dayOfMonthOrdinalParse: /\d{1,2}(ನೇ)/,
    ordinal: function (number) {
        return number + 'ನೇ';
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Korean [ko]
//! author : Kyungwook, Park : https://github.com/kyungw00k
//! author : Jeeeyul Lee <jeeeyul@gmail.com>

import moment from '../moment';

export default moment.defineLocale('ko', {
    months: '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),
    monthsShort: '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split(
        '_'
    ),
    weekdays: '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'),
    weekdaysShort: '일_월_화_수_목_금_토'.split('_'),
    weekdaysMin: '일_월_화_수_목_금_토'.split('_'),
    longDateFormat: {
        LT: 'A h:mm',
        LTS: 'A h:mm:ss',
        L: 'YYYY.MM.DD.',
        LL: 'YYYY년 MMMM D일',
        LLL: 'YYYY년 MMMM D일 A h:mm',
        LLLL: 'YYYY년 MMMM D일 dddd A h:mm',
        l: 'YYYY.MM.DD.',
        ll: 'YYYY년 MMMM D일',
        lll: 'YYYY년 MMMM D일 A h:mm',
        llll: 'YYYY년 MMMM D일 dddd A h:mm',
    },
    calendar: {
        sameDay: '오늘 LT',
        nextDay: '내일 LT',
        nextWeek: 'dddd LT',
        lastDay: '어제 LT',
        lastWeek: '지난주 dddd LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s 후',
        past: '%s 전',
        s: '몇 초',
        ss: '%d초',
        m: '1분',
        mm: '%d분',
        h: '한 시간',
        hh: '%d시간',
        d: '하루',
        dd: '%d일',
        M: '한 달',
        MM: '%d달',
        y: '일 년',
        yy: '%d년',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(일|월|주)/,
    ordinal: function (number, period) {
        switch (period) {
            case 'd':
            case 'D':
            case 'DDD':
                return number + '일';
            case 'M':
                return number + '월';
            case 'w':
            case 'W':
                return number + '주';
            default:
                return number;
        }
    },
    meridiemParse: /오전|오후/,
    isPM: function (token) {
        return token === '오후';
    },
    meridiem: function (hour, minute, isUpper) {
        return hour < 12 ? '오전' : '오후';
    },
});
//! moment.js locale configuration
//! locale : Kurdish [ku]
//! author : Shahram Mebashar : https://github.com/ShahramMebashar

import moment from '../moment';

var symbolMap = {
        1: '١',
        2: '٢',
        3: '٣',
        4: '٤',
        5: '٥',
        6: '٦',
        7: '٧',
        8: '٨',
        9: '٩',
        0: '٠',
    },
    numberMap = {
        '١': '1',
        '٢': '2',
        '٣': '3',
        '٤': '4',
        '٥': '5',
        '٦': '6',
        '٧': '7',
        '٨': '8',
        '٩': '9',
        '٠': '0',
    },
    months = [
        'کانونی دووەم',
        'شوبات',
        'ئازار',
        'نیسان',
        'ئایار',
        'حوزەیران',
        'تەمموز',
        'ئاب',
        'ئەیلوول',
        'تشرینی یەكەم',
        'تشرینی دووەم',
        'كانونی یەکەم',
    ];

export default moment.defineLocale('ku', {
    months: months,
    monthsShort: months,
    weekdays:
        'یه‌كشه‌ممه‌_دووشه‌ممه‌_سێشه‌ممه‌_چوارشه‌ممه‌_پێنجشه‌ممه‌_هه‌ینی_شه‌ممه‌'.split(
            '_'
        ),
    weekdaysShort:
        'یه‌كشه‌م_دووشه‌م_سێشه‌م_چوارشه‌م_پێنجشه‌م_هه‌ینی_شه‌ممه‌'.split('_'),
    weekdaysMin: 'ی_د_س_چ_پ_ه_ش'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    meridiemParse: /ئێواره‌|به‌یانی/,
    isPM: function (input) {
        return /ئێواره‌/.test(input);
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return 'به‌یانی';
        } else {
            return 'ئێواره‌';
        }
    },
    calendar: {
        sameDay: '[ئه‌مرۆ كاتژمێر] LT',
        nextDay: '[به‌یانی كاتژمێر] LT',
        nextWeek: 'dddd [كاتژمێر] LT',
        lastDay: '[دوێنێ كاتژمێر] LT',
        lastWeek: 'dddd [كاتژمێر] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'له‌ %s',
        past: '%s',
        s: 'چه‌ند چركه‌یه‌ك',
        ss: 'چركه‌ %d',
        m: 'یه‌ك خوله‌ك',
        mm: '%d خوله‌ك',
        h: 'یه‌ك كاتژمێر',
        hh: '%d كاتژمێر',
        d: 'یه‌ك ڕۆژ',
        dd: '%d ڕۆژ',
        M: 'یه‌ك مانگ',
        MM: '%d مانگ',
        y: 'یه‌ك ساڵ',
        yy: '%d ساڵ',
    },
    preparse: function (string) {
        return string
            .replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
                return numberMap[match];
            })
            .replace(/،/g, ',');
    },
    postformat: function (string) {
        return string
            .replace(/\d/g, function (match) {
                return symbolMap[match];
            })
            .replace(/,/g, '،');
    },
    week: {
        dow: 6, // Saturday is the first day of the week.
        doy: 12, // The week that contains Jan 12th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Kyrgyz [ky]
//! author : Chyngyz Arystan uulu : https://github.com/chyngyz

import moment from '../moment';

var suffixes = {
    0: '-чү',
    1: '-чи',
    2: '-чи',
    3: '-чү',
    4: '-чү',
    5: '-чи',
    6: '-чы',
    7: '-чи',
    8: '-чи',
    9: '-чу',
    10: '-чу',
    20: '-чы',
    30: '-чу',
    40: '-чы',
    50: '-чү',
    60: '-чы',
    70: '-чи',
    80: '-чи',
    90: '-чу',
    100: '-чү',
};

export default moment.defineLocale('ky', {
    months: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split(
        '_'
    ),
    monthsShort: 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split(
        '_'
    ),
    weekdays: 'Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби'.split(
        '_'
    ),
    weekdaysShort: 'Жек_Дүй_Шей_Шар_Бей_Жум_Ише'.split('_'),
    weekdaysMin: 'Жк_Дй_Шй_Шр_Бй_Жм_Иш'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Бүгүн саат] LT',
        nextDay: '[Эртең саат] LT',
        nextWeek: 'dddd [саат] LT',
        lastDay: '[Кечээ саат] LT',
        lastWeek: '[Өткөн аптанын] dddd [күнү] [саат] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s ичинде',
        past: '%s мурун',
        s: 'бирнече секунд',
        ss: '%d секунд',
        m: 'бир мүнөт',
        mm: '%d мүнөт',
        h: 'бир саат',
        hh: '%d саат',
        d: 'бир күн',
        dd: '%d күн',
        M: 'бир ай',
        MM: '%d ай',
        y: 'бир жыл',
        yy: '%d жыл',
    },
    dayOfMonthOrdinalParse: /\d{1,2}-(чи|чы|чү|чу)/,
    ordinal: function (number) {
        var a = number % 10,
            b = number >= 100 ? 100 : null;
        return number + (suffixes[number] || suffixes[a] || suffixes[b]);
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Luxembourgish [lb]
//! author : mweimerskirch : https://github.com/mweimerskirch
//! author : David Raison : https://github.com/kwisatz

import moment from '../moment';

function processRelativeTime(number, withoutSuffix, key, isFuture) {
    var format = {
        m: ['eng Minutt', 'enger Minutt'],
        h: ['eng Stonn', 'enger Stonn'],
        d: ['een Dag', 'engem Dag'],
        M: ['ee Mount', 'engem Mount'],
        y: ['ee Joer', 'engem Joer'],
    };
    return withoutSuffix ? format[key][0] : format[key][1];
}
function processFutureTime(string) {
    var number = string.substr(0, string.indexOf(' '));
    if (eifelerRegelAppliesToNumber(number)) {
        return 'a ' + string;
    }
    return 'an ' + string;
}
function processPastTime(string) {
    var number = string.substr(0, string.indexOf(' '));
    if (eifelerRegelAppliesToNumber(number)) {
        return 'viru ' + string;
    }
    return 'virun ' + string;
}
/**
 * Returns true if the word before the given number loses the '-n' ending.
 * e.g. 'an 10 Deeg' but 'a 5 Deeg'
 *
 * @param number {integer}
 * @returns {boolean}
 */
function eifelerRegelAppliesToNumber(number) {
    number = parseInt(number, 10);
    if (isNaN(number)) {
        return false;
    }
    if (number < 0) {
        // Negative Number --> always true
        return true;
    } else if (number < 10) {
        // Only 1 digit
        if (4 <= number && number <= 7) {
            return true;
        }
        return false;
    } else if (number < 100) {
        // 2 digits
        var lastDigit = number % 10,
            firstDigit = number / 10;
        if (lastDigit === 0) {
            return eifelerRegelAppliesToNumber(firstDigit);
        }
        return eifelerRegelAppliesToNumber(lastDigit);
    } else if (number < 10000) {
        // 3 or 4 digits --> recursively check first digit
        while (number >= 10) {
            number = number / 10;
        }
        return eifelerRegelAppliesToNumber(number);
    } else {
        // Anything larger than 4 digits: recursively check first n-3 digits
        number = number / 1000;
        return eifelerRegelAppliesToNumber(number);
    }
}

export default moment.defineLocale('lb', {
    months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split(
        '_'
    ),
    monthsShort:
        'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays:
        'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split(
            '_'
        ),
    weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'),
    weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'H:mm [Auer]',
        LTS: 'H:mm:ss [Auer]',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY H:mm [Auer]',
        LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]',
    },
    calendar: {
        sameDay: '[Haut um] LT',
        sameElse: 'L',
        nextDay: '[Muer um] LT',
        nextWeek: 'dddd [um] LT',
        lastDay: '[Gëschter um] LT',
        lastWeek: function () {
            // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule
            switch (this.day()) {
                case 2:
                case 4:
                    return '[Leschten] dddd [um] LT';
                default:
                    return '[Leschte] dddd [um] LT';
            }
        },
    },
    relativeTime: {
        future: processFutureTime,
        past: processPastTime,
        s: 'e puer Sekonnen',
        ss: '%d Sekonnen',
        m: processRelativeTime,
        mm: '%d Minutten',
        h: processRelativeTime,
        hh: '%d Stonnen',
        d: processRelativeTime,
        dd: '%d Deeg',
        M: processRelativeTime,
        MM: '%d Méint',
        y: processRelativeTime,
        yy: '%d Joer',
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Lao [lo]
//! author : Ryan Hart : https://github.com/ryanhart2

import moment from '../moment';

export default moment.defineLocale('lo', {
    months: 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split(
        '_'
    ),
    monthsShort:
        'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split(
            '_'
        ),
    weekdays: 'ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),
    weekdaysShort: 'ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),
    weekdaysMin: 'ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'ວັນdddd D MMMM YYYY HH:mm',
    },
    meridiemParse: /ຕອນເຊົ້າ|ຕອນແລງ/,
    isPM: function (input) {
        return input === 'ຕອນແລງ';
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return 'ຕອນເຊົ້າ';
        } else {
            return 'ຕອນແລງ';
        }
    },
    calendar: {
        sameDay: '[ມື້ນີ້ເວລາ] LT',
        nextDay: '[ມື້ອື່ນເວລາ] LT',
        nextWeek: '[ວັນ]dddd[ໜ້າເວລາ] LT',
        lastDay: '[ມື້ວານນີ້ເວລາ] LT',
        lastWeek: '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'ອີກ %s',
        past: '%sຜ່ານມາ',
        s: 'ບໍ່ເທົ່າໃດວິນາທີ',
        ss: '%d ວິນາທີ',
        m: '1 ນາທີ',
        mm: '%d ນາທີ',
        h: '1 ຊົ່ວໂມງ',
        hh: '%d ຊົ່ວໂມງ',
        d: '1 ມື້',
        dd: '%d ມື້',
        M: '1 ເດືອນ',
        MM: '%d ເດືອນ',
        y: '1 ປີ',
        yy: '%d ປີ',
    },
    dayOfMonthOrdinalParse: /(ທີ່)\d{1,2}/,
    ordinal: function (number) {
        return 'ທີ່' + number;
    },
});
//! moment.js locale configuration
//! locale : Lithuanian [lt]
//! author : Mindaugas Mozūras : https://github.com/mmozuras

import moment from '../moment';

var units = {
    ss: 'sekundė_sekundžių_sekundes',
    m: 'minutė_minutės_minutę',
    mm: 'minutės_minučių_minutes',
    h: 'valanda_valandos_valandą',
    hh: 'valandos_valandų_valandas',
    d: 'diena_dienos_dieną',
    dd: 'dienos_dienų_dienas',
    M: 'mėnuo_mėnesio_mėnesį',
    MM: 'mėnesiai_mėnesių_mėnesius',
    y: 'metai_metų_metus',
    yy: 'metai_metų_metus',
};
function translateSeconds(number, withoutSuffix, key, isFuture) {
    if (withoutSuffix) {
        return 'kelios sekundės';
    } else {
        return isFuture ? 'kelių sekundžių' : 'kelias sekundes';
    }
}
function translateSingular(number, withoutSuffix, key, isFuture) {
    return withoutSuffix
        ? forms(key)[0]
        : isFuture
        ? forms(key)[1]
        : forms(key)[2];
}
function special(number) {
    return number % 10 === 0 || (number > 10 && number < 20);
}
function forms(key) {
    return units[key].split('_');
}
function translate(number, withoutSuffix, key, isFuture) {
    var result = number + ' ';
    if (number === 1) {
        return (
            result + translateSingular(number, withoutSuffix, key[0], isFuture)
        );
    } else if (withoutSuffix) {
        return result + (special(number) ? forms(key)[1] : forms(key)[0]);
    } else {
        if (isFuture) {
            return result + forms(key)[1];
        } else {
            return result + (special(number) ? forms(key)[1] : forms(key)[2]);
        }
    }
}
export default moment.defineLocale('lt', {
    months: {
        format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split(
            '_'
        ),
        standalone:
            'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split(
                '_'
            ),
        isFormat: /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/,
    },
    monthsShort: 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'),
    weekdays: {
        format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split(
            '_'
        ),
        standalone:
            'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split(
                '_'
            ),
        isFormat: /dddd HH:mm/,
    },
    weekdaysShort: 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'),
    weekdaysMin: 'S_P_A_T_K_Pn_Š'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'YYYY-MM-DD',
        LL: 'YYYY [m.] MMMM D [d.]',
        LLL: 'YYYY [m.] MMMM D [d.], HH:mm [val.]',
        LLLL: 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]',
        l: 'YYYY-MM-DD',
        ll: 'YYYY [m.] MMMM D [d.]',
        lll: 'YYYY [m.] MMMM D [d.], HH:mm [val.]',
        llll: 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]',
    },
    calendar: {
        sameDay: '[Šiandien] LT',
        nextDay: '[Rytoj] LT',
        nextWeek: 'dddd LT',
        lastDay: '[Vakar] LT',
        lastWeek: '[Praėjusį] dddd LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'po %s',
        past: 'prieš %s',
        s: translateSeconds,
        ss: translate,
        m: translateSingular,
        mm: translate,
        h: translateSingular,
        hh: translate,
        d: translateSingular,
        dd: translate,
        M: translateSingular,
        MM: translate,
        y: translateSingular,
        yy: translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2}-oji/,
    ordinal: function (number) {
        return number + '-oji';
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Latvian [lv]
//! author : Kristaps Karlsons : https://github.com/skakri
//! author : Jānis Elmeris : https://github.com/JanisE

import moment from '../moment';

var units = {
    ss: 'sekundes_sekundēm_sekunde_sekundes'.split('_'),
    m: 'minūtes_minūtēm_minūte_minūtes'.split('_'),
    mm: 'minūtes_minūtēm_minūte_minūtes'.split('_'),
    h: 'stundas_stundām_stunda_stundas'.split('_'),
    hh: 'stundas_stundām_stunda_stundas'.split('_'),
    d: 'dienas_dienām_diena_dienas'.split('_'),
    dd: 'dienas_dienām_diena_dienas'.split('_'),
    M: 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),
    MM: 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),
    y: 'gada_gadiem_gads_gadi'.split('_'),
    yy: 'gada_gadiem_gads_gadi'.split('_'),
};
/**
 * @param withoutSuffix boolean true = a length of time; false = before/after a period of time.
 */
function format(forms, number, withoutSuffix) {
    if (withoutSuffix) {
        // E.g. "21 minūte", "3 minūtes".
        return number % 10 === 1 && number % 100 !== 11 ? forms[2] : forms[3];
    } else {
        // E.g. "21 minūtes" as in "pēc 21 minūtes".
        // E.g. "3 minūtēm" as in "pēc 3 minūtēm".
        return number % 10 === 1 && number % 100 !== 11 ? forms[0] : forms[1];
    }
}
function relativeTimeWithPlural(number, withoutSuffix, key) {
    return number + ' ' + format(units[key], number, withoutSuffix);
}
function relativeTimeWithSingular(number, withoutSuffix, key) {
    return format(units[key], number, withoutSuffix);
}
function relativeSeconds(number, withoutSuffix) {
    return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm';
}

export default moment.defineLocale('lv', {
    months: 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split(
        '_'
    ),
    monthsShort: 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'),
    weekdays:
        'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split(
            '_'
        ),
    weekdaysShort: 'Sv_P_O_T_C_Pk_S'.split('_'),
    weekdaysMin: 'Sv_P_O_T_C_Pk_S'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY.',
        LL: 'YYYY. [gada] D. MMMM',
        LLL: 'YYYY. [gada] D. MMMM, HH:mm',
        LLLL: 'YYYY. [gada] D. MMMM, dddd, HH:mm',
    },
    calendar: {
        sameDay: '[Šodien pulksten] LT',
        nextDay: '[Rīt pulksten] LT',
        nextWeek: 'dddd [pulksten] LT',
        lastDay: '[Vakar pulksten] LT',
        lastWeek: '[Pagājušā] dddd [pulksten] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'pēc %s',
        past: 'pirms %s',
        s: relativeSeconds,
        ss: relativeTimeWithPlural,
        m: relativeTimeWithSingular,
        mm: relativeTimeWithPlural,
        h: relativeTimeWithSingular,
        hh: relativeTimeWithPlural,
        d: relativeTimeWithSingular,
        dd: relativeTimeWithPlural,
        M: relativeTimeWithSingular,
        MM: relativeTimeWithPlural,
        y: relativeTimeWithSingular,
        yy: relativeTimeWithPlural,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Montenegrin [me]
//! author : Miodrag Nikač <miodrag@restartit.me> : https://github.com/miodragnikac

import moment from '../moment';

var translator = {
    words: {
        //Different grammatical cases
        ss: ['sekund', 'sekunda', 'sekundi'],
        m: ['jedan minut', 'jednog minuta'],
        mm: ['minut', 'minuta', 'minuta'],
        h: ['jedan sat', 'jednog sata'],
        hh: ['sat', 'sata', 'sati'],
        dd: ['dan', 'dana', 'dana'],
        MM: ['mjesec', 'mjeseca', 'mjeseci'],
        yy: ['godina', 'godine', 'godina'],
    },
    correctGrammaticalCase: function (number, wordKey) {
        return number === 1
            ? wordKey[0]
            : number >= 2 && number <= 4
            ? wordKey[1]
            : wordKey[2];
    },
    translate: function (number, withoutSuffix, key) {
        var wordKey = translator.words[key];
        if (key.length === 1) {
            return withoutSuffix ? wordKey[0] : wordKey[1];
        } else {
            return (
                number +
                ' ' +
                translator.correctGrammaticalCase(number, wordKey)
            );
        }
    },
};

export default moment.defineLocale('me', {
    months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split(
        '_'
    ),
    monthsShort:
        'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),
    monthsParseExact: true,
    weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split(
        '_'
    ),
    weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
    weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY H:mm',
        LLLL: 'dddd, D. MMMM YYYY H:mm',
    },
    calendar: {
        sameDay: '[danas u] LT',
        nextDay: '[sjutra u] LT',

        nextWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[u] [nedjelju] [u] LT';
                case 3:
                    return '[u] [srijedu] [u] LT';
                case 6:
                    return '[u] [subotu] [u] LT';
                case 1:
                case 2:
                case 4:
                case 5:
                    return '[u] dddd [u] LT';
            }
        },
        lastDay: '[juče u] LT',
        lastWeek: function () {
            var lastWeekDays = [
                '[prošle] [nedjelje] [u] LT',
                '[prošlog] [ponedjeljka] [u] LT',
                '[prošlog] [utorka] [u] LT',
                '[prošle] [srijede] [u] LT',
                '[prošlog] [četvrtka] [u] LT',
                '[prošlog] [petka] [u] LT',
                '[prošle] [subote] [u] LT',
            ];
            return lastWeekDays[this.day()];
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'za %s',
        past: 'prije %s',
        s: 'nekoliko sekundi',
        ss: translator.translate,
        m: translator.translate,
        mm: translator.translate,
        h: translator.translate,
        hh: translator.translate,
        d: 'dan',
        dd: translator.translate,
        M: 'mjesec',
        MM: translator.translate,
        y: 'godinu',
        yy: translator.translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Maori [mi]
//! author : John Corrigan <robbiecloset@gmail.com> : https://github.com/johnideal

import moment from '../moment';

export default moment.defineLocale('mi', {
    months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split(
        '_'
    ),
    monthsShort:
        'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split(
            '_'
        ),
    monthsRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
    monthsStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
    monthsShortRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
    monthsShortStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,
    weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'),
    weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),
    weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY [i] HH:mm',
        LLLL: 'dddd, D MMMM YYYY [i] HH:mm',
    },
    calendar: {
        sameDay: '[i teie mahana, i] LT',
        nextDay: '[apopo i] LT',
        nextWeek: 'dddd [i] LT',
        lastDay: '[inanahi i] LT',
        lastWeek: 'dddd [whakamutunga i] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'i roto i %s',
        past: '%s i mua',
        s: 'te hēkona ruarua',
        ss: '%d hēkona',
        m: 'he meneti',
        mm: '%d meneti',
        h: 'te haora',
        hh: '%d haora',
        d: 'he ra',
        dd: '%d ra',
        M: 'he marama',
        MM: '%d marama',
        y: 'he tau',
        yy: '%d tau',
    },
    dayOfMonthOrdinalParse: /\d{1,2}º/,
    ordinal: '%dº',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Macedonian [mk]
//! author : Borislav Mickov : https://github.com/B0k0
//! author : Sashko Todorov : https://github.com/bkyceh
import moment from '../moment';

export default moment.defineLocale('mk', {
    months: 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split(
        '_'
    ),
    monthsShort: 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'),
    weekdays: 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split(
        '_'
    ),
    weekdaysShort: 'нед_пон_вто_сре_чет_пет_саб'.split('_'),
    weekdaysMin: 'нe_пo_вт_ср_че_пе_сa'.split('_'),
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'D.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY H:mm',
        LLLL: 'dddd, D MMMM YYYY H:mm',
    },
    calendar: {
        sameDay: '[Денес во] LT',
        nextDay: '[Утре во] LT',
        nextWeek: '[Во] dddd [во] LT',
        lastDay: '[Вчера во] LT',
        lastWeek: function () {
            switch (this.day()) {
                case 0:
                case 3:
                case 6:
                    return '[Изминатата] dddd [во] LT';
                case 1:
                case 2:
                case 4:
                case 5:
                    return '[Изминатиот] dddd [во] LT';
            }
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'за %s',
        past: 'пред %s',
        s: 'неколку секунди',
        ss: '%d секунди',
        m: 'една минута',
        mm: '%d минути',
        h: 'еден час',
        hh: '%d часа',
        d: 'еден ден',
        dd: '%d дена',
        M: 'еден месец',
        MM: '%d месеци',
        y: 'една година',
        yy: '%d години',
    },
    dayOfMonthOrdinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/,
    ordinal: function (number) {
        var lastDigit = number % 10,
            last2Digits = number % 100;
        if (number === 0) {
            return number + '-ев';
        } else if (last2Digits === 0) {
            return number + '-ен';
        } else if (last2Digits > 10 && last2Digits < 20) {
            return number + '-ти';
        } else if (lastDigit === 1) {
            return number + '-ви';
        } else if (lastDigit === 2) {
            return number + '-ри';
        } else if (lastDigit === 7 || lastDigit === 8) {
            return number + '-ми';
        } else {
            return number + '-ти';
        }
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Malayalam [ml]
//! author : Floyd Pink : https://github.com/floydpink

import moment from '../moment';

export default moment.defineLocale('ml', {
    months: 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split(
        '_'
    ),
    monthsShort:
        'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays:
        'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split(
            '_'
        ),
    weekdaysShort: 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'),
    weekdaysMin: 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'),
    longDateFormat: {
        LT: 'A h:mm -നു',
        LTS: 'A h:mm:ss -നു',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY, A h:mm -നു',
        LLLL: 'dddd, D MMMM YYYY, A h:mm -നു',
    },
    calendar: {
        sameDay: '[ഇന്ന്] LT',
        nextDay: '[നാളെ] LT',
        nextWeek: 'dddd, LT',
        lastDay: '[ഇന്നലെ] LT',
        lastWeek: '[കഴിഞ്ഞ] dddd, LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s കഴിഞ്ഞ്',
        past: '%s മുൻപ്',
        s: 'അൽപ നിമിഷങ്ങൾ',
        ss: '%d സെക്കൻഡ്',
        m: 'ഒരു മിനിറ്റ്',
        mm: '%d മിനിറ്റ്',
        h: 'ഒരു മണിക്കൂർ',
        hh: '%d മണിക്കൂർ',
        d: 'ഒരു ദിവസം',
        dd: '%d ദിവസം',
        M: 'ഒരു മാസം',
        MM: '%d മാസം',
        y: 'ഒരു വർഷം',
        yy: '%d വർഷം',
    },
    meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (
            (meridiem === 'രാത്രി' && hour >= 4) ||
            meridiem === 'ഉച്ച കഴിഞ്ഞ്' ||
            meridiem === 'വൈകുന്നേരം'
        ) {
            return hour + 12;
        } else {
            return hour;
        }
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'രാത്രി';
        } else if (hour < 12) {
            return 'രാവിലെ';
        } else if (hour < 17) {
            return 'ഉച്ച കഴിഞ്ഞ്';
        } else if (hour < 20) {
            return 'വൈകുന്നേരം';
        } else {
            return 'രാത്രി';
        }
    },
});
//! moment.js locale configuration
//! locale : Mongolian [mn]
//! author : Javkhlantugs Nyamdorj : https://github.com/javkhaanj7

import moment from '../moment';

function translate(number, withoutSuffix, key, isFuture) {
    switch (key) {
        case 's':
            return withoutSuffix ? 'хэдхэн секунд' : 'хэдхэн секундын';
        case 'ss':
            return number + (withoutSuffix ? ' секунд' : ' секундын');
        case 'm':
        case 'mm':
            return number + (withoutSuffix ? ' минут' : ' минутын');
        case 'h':
        case 'hh':
            return number + (withoutSuffix ? ' цаг' : ' цагийн');
        case 'd':
        case 'dd':
            return number + (withoutSuffix ? ' өдөр' : ' өдрийн');
        case 'M':
        case 'MM':
            return number + (withoutSuffix ? ' сар' : ' сарын');
        case 'y':
        case 'yy':
            return number + (withoutSuffix ? ' жил' : ' жилийн');
        default:
            return number;
    }
}

export default moment.defineLocale('mn', {
    months: 'Нэгдүгээр сар_Хоёрдугаар сар_Гуравдугаар сар_Дөрөвдүгээр сар_Тавдугаар сар_Зургадугаар сар_Долдугаар сар_Наймдугаар сар_Есдүгээр сар_Аравдугаар сар_Арван нэгдүгээр сар_Арван хоёрдугаар сар'.split(
        '_'
    ),
    monthsShort:
        '1 сар_2 сар_3 сар_4 сар_5 сар_6 сар_7 сар_8 сар_9 сар_10 сар_11 сар_12 сар'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'Ням_Даваа_Мягмар_Лхагва_Пүрэв_Баасан_Бямба'.split('_'),
    weekdaysShort: 'Ням_Дав_Мяг_Лха_Пүр_Баа_Бям'.split('_'),
    weekdaysMin: 'Ня_Да_Мя_Лх_Пү_Ба_Бя'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'YYYY-MM-DD',
        LL: 'YYYY оны MMMMын D',
        LLL: 'YYYY оны MMMMын D HH:mm',
        LLLL: 'dddd, YYYY оны MMMMын D HH:mm',
    },
    meridiemParse: /ҮӨ|ҮХ/i,
    isPM: function (input) {
        return input === 'ҮХ';
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return 'ҮӨ';
        } else {
            return 'ҮХ';
        }
    },
    calendar: {
        sameDay: '[Өнөөдөр] LT',
        nextDay: '[Маргааш] LT',
        nextWeek: '[Ирэх] dddd LT',
        lastDay: '[Өчигдөр] LT',
        lastWeek: '[Өнгөрсөн] dddd LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s дараа',
        past: '%s өмнө',
        s: translate,
        ss: translate,
        m: translate,
        mm: translate,
        h: translate,
        hh: translate,
        d: translate,
        dd: translate,
        M: translate,
        MM: translate,
        y: translate,
        yy: translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2} өдөр/,
    ordinal: function (number, period) {
        switch (period) {
            case 'd':
            case 'D':
            case 'DDD':
                return number + ' өдөр';
            default:
                return number;
        }
    },
});
//! moment.js locale configuration
//! locale : Marathi [mr]
//! author : Harshad Kale : https://github.com/kalehv
//! author : Vivek Athalye : https://github.com/vnathalye

import moment from '../moment';

var symbolMap = {
        1: '१',
        2: '२',
        3: '३',
        4: '४',
        5: '५',
        6: '६',
        7: '७',
        8: '८',
        9: '९',
        0: '०',
    },
    numberMap = {
        '१': '1',
        '२': '2',
        '३': '3',
        '४': '4',
        '५': '5',
        '६': '6',
        '७': '7',
        '८': '8',
        '९': '9',
        '०': '0',
    };

function relativeTimeMr(number, withoutSuffix, string, isFuture) {
    var output = '';
    if (withoutSuffix) {
        switch (string) {
            case 's':
                output = 'काही सेकंद';
                break;
            case 'ss':
                output = '%d सेकंद';
                break;
            case 'm':
                output = 'एक मिनिट';
                break;
            case 'mm':
                output = '%d मिनिटे';
                break;
            case 'h':
                output = 'एक तास';
                break;
            case 'hh':
                output = '%d तास';
                break;
            case 'd':
                output = 'एक दिवस';
                break;
            case 'dd':
                output = '%d दिवस';
                break;
            case 'M':
                output = 'एक महिना';
                break;
            case 'MM':
                output = '%d महिने';
                break;
            case 'y':
                output = 'एक वर्ष';
                break;
            case 'yy':
                output = '%d वर्षे';
                break;
        }
    } else {
        switch (string) {
            case 's':
                output = 'काही सेकंदां';
                break;
            case 'ss':
                output = '%d सेकंदां';
                break;
            case 'm':
                output = 'एका मिनिटा';
                break;
            case 'mm':
                output = '%d मिनिटां';
                break;
            case 'h':
                output = 'एका तासा';
                break;
            case 'hh':
                output = '%d तासां';
                break;
            case 'd':
                output = 'एका दिवसा';
                break;
            case 'dd':
                output = '%d दिवसां';
                break;
            case 'M':
                output = 'एका महिन्या';
                break;
            case 'MM':
                output = '%d महिन्यां';
                break;
            case 'y':
                output = 'एका वर्षा';
                break;
            case 'yy':
                output = '%d वर्षां';
                break;
        }
    }
    return output.replace(/%d/i, number);
}

export default moment.defineLocale('mr', {
    months: 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split(
        '_'
    ),
    monthsShort:
        'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
    weekdaysShort: 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'),
    weekdaysMin: 'र_सो_मं_बु_गु_शु_श'.split('_'),
    longDateFormat: {
        LT: 'A h:mm वाजता',
        LTS: 'A h:mm:ss वाजता',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY, A h:mm वाजता',
        LLLL: 'dddd, D MMMM YYYY, A h:mm वाजता',
    },
    calendar: {
        sameDay: '[आज] LT',
        nextDay: '[उद्या] LT',
        nextWeek: 'dddd, LT',
        lastDay: '[काल] LT',
        lastWeek: '[मागील] dddd, LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%sमध्ये',
        past: '%sपूर्वी',
        s: relativeTimeMr,
        ss: relativeTimeMr,
        m: relativeTimeMr,
        mm: relativeTimeMr,
        h: relativeTimeMr,
        hh: relativeTimeMr,
        d: relativeTimeMr,
        dd: relativeTimeMr,
        M: relativeTimeMr,
        MM: relativeTimeMr,
        y: relativeTimeMr,
        yy: relativeTimeMr,
    },
    preparse: function (string) {
        return string.replace(/[१२३४५६७८९०]/g, function (match) {
            return numberMap[match];
        });
    },
    postformat: function (string) {
        return string.replace(/\d/g, function (match) {
            return symbolMap[match];
        });
    },
    meridiemParse: /पहाटे|सकाळी|दुपारी|सायंकाळी|रात्री/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'पहाटे' || meridiem === 'सकाळी') {
            return hour;
        } else if (
            meridiem === 'दुपारी' ||
            meridiem === 'सायंकाळी' ||
            meridiem === 'रात्री'
        ) {
            return hour >= 12 ? hour : hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        if (hour >= 0 && hour < 6) {
            return 'पहाटे';
        } else if (hour < 12) {
            return 'सकाळी';
        } else if (hour < 17) {
            return 'दुपारी';
        } else if (hour < 20) {
            return 'सायंकाळी';
        } else {
            return 'रात्री';
        }
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Malay [ms-my]
//! note : DEPRECATED, the correct one is [ms]
//! author : Weldan Jamili : https://github.com/weldan

import moment from '../moment';

export default moment.defineLocale('ms-my', {
    months: 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),
    weekdays: 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),
    weekdaysShort: 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),
    weekdaysMin: 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
    longDateFormat: {
        LT: 'HH.mm',
        LTS: 'HH.mm.ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY [pukul] HH.mm',
        LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',
    },
    meridiemParse: /pagi|tengahari|petang|malam/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'pagi') {
            return hour;
        } else if (meridiem === 'tengahari') {
            return hour >= 11 ? hour : hour + 12;
        } else if (meridiem === 'petang' || meridiem === 'malam') {
            return hour + 12;
        }
    },
    meridiem: function (hours, minutes, isLower) {
        if (hours < 11) {
            return 'pagi';
        } else if (hours < 15) {
            return 'tengahari';
        } else if (hours < 19) {
            return 'petang';
        } else {
            return 'malam';
        }
    },
    calendar: {
        sameDay: '[Hari ini pukul] LT',
        nextDay: '[Esok pukul] LT',
        nextWeek: 'dddd [pukul] LT',
        lastDay: '[Kelmarin pukul] LT',
        lastWeek: 'dddd [lepas pukul] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'dalam %s',
        past: '%s yang lepas',
        s: 'beberapa saat',
        ss: '%d saat',
        m: 'seminit',
        mm: '%d minit',
        h: 'sejam',
        hh: '%d jam',
        d: 'sehari',
        dd: '%d hari',
        M: 'sebulan',
        MM: '%d bulan',
        y: 'setahun',
        yy: '%d tahun',
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Malay [ms]
//! author : Weldan Jamili : https://github.com/weldan

import moment from '../moment';

export default moment.defineLocale('ms', {
    months: 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),
    weekdays: 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),
    weekdaysShort: 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),
    weekdaysMin: 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
    longDateFormat: {
        LT: 'HH.mm',
        LTS: 'HH.mm.ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY [pukul] HH.mm',
        LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',
    },
    meridiemParse: /pagi|tengahari|petang|malam/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'pagi') {
            return hour;
        } else if (meridiem === 'tengahari') {
            return hour >= 11 ? hour : hour + 12;
        } else if (meridiem === 'petang' || meridiem === 'malam') {
            return hour + 12;
        }
    },
    meridiem: function (hours, minutes, isLower) {
        if (hours < 11) {
            return 'pagi';
        } else if (hours < 15) {
            return 'tengahari';
        } else if (hours < 19) {
            return 'petang';
        } else {
            return 'malam';
        }
    },
    calendar: {
        sameDay: '[Hari ini pukul] LT',
        nextDay: '[Esok pukul] LT',
        nextWeek: 'dddd [pukul] LT',
        lastDay: '[Kelmarin pukul] LT',
        lastWeek: 'dddd [lepas pukul] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'dalam %s',
        past: '%s yang lepas',
        s: 'beberapa saat',
        ss: '%d saat',
        m: 'seminit',
        mm: '%d minit',
        h: 'sejam',
        hh: '%d jam',
        d: 'sehari',
        dd: '%d hari',
        M: 'sebulan',
        MM: '%d bulan',
        y: 'setahun',
        yy: '%d tahun',
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Maltese (Malta) [mt]
//! author : Alessandro Maruccia : https://github.com/alesma

import moment from '../moment';

export default moment.defineLocale('mt', {
    months: 'Jannar_Frar_Marzu_April_Mejju_Ġunju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Diċembru'.split(
        '_'
    ),
    monthsShort: 'Jan_Fra_Mar_Apr_Mej_Ġun_Lul_Aww_Set_Ott_Nov_Diċ'.split('_'),
    weekdays:
        'Il-Ħadd_It-Tnejn_It-Tlieta_L-Erbgħa_Il-Ħamis_Il-Ġimgħa_Is-Sibt'.split(
            '_'
        ),
    weekdaysShort: 'Ħad_Tne_Tli_Erb_Ħam_Ġim_Sib'.split('_'),
    weekdaysMin: 'Ħa_Tn_Tl_Er_Ħa_Ġi_Si'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Illum fil-]LT',
        nextDay: '[Għada fil-]LT',
        nextWeek: 'dddd [fil-]LT',
        lastDay: '[Il-bieraħ fil-]LT',
        lastWeek: 'dddd [li għadda] [fil-]LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'f’ %s',
        past: '%s ilu',
        s: 'ftit sekondi',
        ss: '%d sekondi',
        m: 'minuta',
        mm: '%d minuti',
        h: 'siegħa',
        hh: '%d siegħat',
        d: 'ġurnata',
        dd: '%d ġranet',
        M: 'xahar',
        MM: '%d xhur',
        y: 'sena',
        yy: '%d sni',
    },
    dayOfMonthOrdinalParse: /\d{1,2}º/,
    ordinal: '%dº',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Burmese [my]
//! author : Squar team, mysquar.com
//! author : David Rossellat : https://github.com/gholadr
//! author : Tin Aung Lin : https://github.com/thanyawzinmin

import moment from '../moment';

var symbolMap = {
        1: '၁',
        2: '၂',
        3: '၃',
        4: '၄',
        5: '၅',
        6: '၆',
        7: '၇',
        8: '၈',
        9: '၉',
        0: '၀',
    },
    numberMap = {
        '၁': '1',
        '၂': '2',
        '၃': '3',
        '၄': '4',
        '၅': '5',
        '၆': '6',
        '၇': '7',
        '၈': '8',
        '၉': '9',
        '၀': '0',
    };

export default moment.defineLocale('my', {
    months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split(
        '_'
    ),
    monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'),
    weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split(
        '_'
    ),
    weekdaysShort: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
    weekdaysMin: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),

    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[ယနေ.] LT [မှာ]',
        nextDay: '[မနက်ဖြန်] LT [မှာ]',
        nextWeek: 'dddd LT [မှာ]',
        lastDay: '[မနေ.က] LT [မှာ]',
        lastWeek: '[ပြီးခဲ့သော] dddd LT [မှာ]',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'လာမည့် %s မှာ',
        past: 'လွန်ခဲ့သော %s က',
        s: 'စက္ကန်.အနည်းငယ်',
        ss: '%d စက္ကန့်',
        m: 'တစ်မိနစ်',
        mm: '%d မိနစ်',
        h: 'တစ်နာရီ',
        hh: '%d နာရီ',
        d: 'တစ်ရက်',
        dd: '%d ရက်',
        M: 'တစ်လ',
        MM: '%d လ',
        y: 'တစ်နှစ်',
        yy: '%d နှစ်',
    },
    preparse: function (string) {
        return string.replace(/[၁၂၃၄၅၆၇၈၉၀]/g, function (match) {
            return numberMap[match];
        });
    },
    postformat: function (string) {
        return string.replace(/\d/g, function (match) {
            return symbolMap[match];
        });
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Norwegian Bokmål [nb]
//! authors : Espen Hovlandsdal : https://github.com/rexxars
//!           Sigurd Gartmann : https://github.com/sigurdga
//!           Stephen Ramthun : https://github.com/stephenramthun

import moment from '../moment';

export default moment.defineLocale('nb', {
    months: 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split(
        '_'
    ),
    monthsShort:
        'jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),
    monthsParseExact: true,
    weekdays: 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
    weekdaysShort: 'sø._ma._ti._on._to._fr._lø.'.split('_'),
    weekdaysMin: 'sø_ma_ti_on_to_fr_lø'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY [kl.] HH:mm',
        LLLL: 'dddd D. MMMM YYYY [kl.] HH:mm',
    },
    calendar: {
        sameDay: '[i dag kl.] LT',
        nextDay: '[i morgen kl.] LT',
        nextWeek: 'dddd [kl.] LT',
        lastDay: '[i går kl.] LT',
        lastWeek: '[forrige] dddd [kl.] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'om %s',
        past: '%s siden',
        s: 'noen sekunder',
        ss: '%d sekunder',
        m: 'ett minutt',
        mm: '%d minutter',
        h: 'en time',
        hh: '%d timer',
        d: 'en dag',
        dd: '%d dager',
        w: 'en uke',
        ww: '%d uker',
        M: 'en måned',
        MM: '%d måneder',
        y: 'ett år',
        yy: '%d år',
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Nepalese [ne]
//! author : suvash : https://github.com/suvash

import moment from '../moment';

var symbolMap = {
        1: '१',
        2: '२',
        3: '३',
        4: '४',
        5: '५',
        6: '६',
        7: '७',
        8: '८',
        9: '९',
        0: '०',
    },
    numberMap = {
        '१': '1',
        '२': '2',
        '३': '3',
        '४': '4',
        '५': '5',
        '६': '6',
        '७': '7',
        '८': '8',
        '९': '9',
        '०': '0',
    };

export default moment.defineLocale('ne', {
    months: 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split(
        '_'
    ),
    monthsShort:
        'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split(
        '_'
    ),
    weekdaysShort: 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'),
    weekdaysMin: 'आ._सो._मं._बु._बि._शु._श.'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'Aको h:mm बजे',
        LTS: 'Aको h:mm:ss बजे',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY, Aको h:mm बजे',
        LLLL: 'dddd, D MMMM YYYY, Aको h:mm बजे',
    },
    preparse: function (string) {
        return string.replace(/[१२३४५६७८९०]/g, function (match) {
            return numberMap[match];
        });
    },
    postformat: function (string) {
        return string.replace(/\d/g, function (match) {
            return symbolMap[match];
        });
    },
    meridiemParse: /राति|बिहान|दिउँसो|साँझ/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'राति') {
            return hour < 4 ? hour : hour + 12;
        } else if (meridiem === 'बिहान') {
            return hour;
        } else if (meridiem === 'दिउँसो') {
            return hour >= 10 ? hour : hour + 12;
        } else if (meridiem === 'साँझ') {
            return hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 3) {
            return 'राति';
        } else if (hour < 12) {
            return 'बिहान';
        } else if (hour < 16) {
            return 'दिउँसो';
        } else if (hour < 20) {
            return 'साँझ';
        } else {
            return 'राति';
        }
    },
    calendar: {
        sameDay: '[आज] LT',
        nextDay: '[भोलि] LT',
        nextWeek: '[आउँदो] dddd[,] LT',
        lastDay: '[हिजो] LT',
        lastWeek: '[गएको] dddd[,] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%sमा',
        past: '%s अगाडि',
        s: 'केही क्षण',
        ss: '%d सेकेण्ड',
        m: 'एक मिनेट',
        mm: '%d मिनेट',
        h: 'एक घण्टा',
        hh: '%d घण्टा',
        d: 'एक दिन',
        dd: '%d दिन',
        M: 'एक महिना',
        MM: '%d महिना',
        y: 'एक बर्ष',
        yy: '%d बर्ष',
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Dutch (Belgium) [nl-be]
//! author : Joris Röling : https://github.com/jorisroling
//! author : Jacob Middag : https://github.com/middagj

import moment from '../moment';

var monthsShortWithDots =
        'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),
    monthsShortWithoutDots =
        'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'),
    monthsParse = [
        /^jan/i,
        /^feb/i,
        /^maart|mrt.?$/i,
        /^apr/i,
        /^mei$/i,
        /^jun[i.]?$/i,
        /^jul[i.]?$/i,
        /^aug/i,
        /^sep/i,
        /^okt/i,
        /^nov/i,
        /^dec/i,
    ],
    monthsRegex =
        /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;

export default moment.defineLocale('nl-be', {
    months: 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split(
        '_'
    ),
    monthsShort: function (m, format) {
        if (!m) {
            return monthsShortWithDots;
        } else if (/-MMM-/.test(format)) {
            return monthsShortWithoutDots[m.month()];
        } else {
            return monthsShortWithDots[m.month()];
        }
    },

    monthsRegex: monthsRegex,
    monthsShortRegex: monthsRegex,
    monthsStrictRegex:
        /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,
    monthsShortStrictRegex:
        /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,

    monthsParse: monthsParse,
    longMonthsParse: monthsParse,
    shortMonthsParse: monthsParse,

    weekdays:
        'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
    weekdaysShort: 'zo._ma._di._wo._do._vr._za.'.split('_'),
    weekdaysMin: 'zo_ma_di_wo_do_vr_za'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[vandaag om] LT',
        nextDay: '[morgen om] LT',
        nextWeek: 'dddd [om] LT',
        lastDay: '[gisteren om] LT',
        lastWeek: '[afgelopen] dddd [om] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'over %s',
        past: '%s geleden',
        s: 'een paar seconden',
        ss: '%d seconden',
        m: 'één minuut',
        mm: '%d minuten',
        h: 'één uur',
        hh: '%d uur',
        d: 'één dag',
        dd: '%d dagen',
        M: 'één maand',
        MM: '%d maanden',
        y: 'één jaar',
        yy: '%d jaar',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/,
    ordinal: function (number) {
        return (
            number +
            (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')
        );
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Dutch [nl]
//! author : Joris Röling : https://github.com/jorisroling
//! author : Jacob Middag : https://github.com/middagj

import moment from '../moment';

var monthsShortWithDots =
        'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),
    monthsShortWithoutDots =
        'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'),
    monthsParse = [
        /^jan/i,
        /^feb/i,
        /^maart|mrt.?$/i,
        /^apr/i,
        /^mei$/i,
        /^jun[i.]?$/i,
        /^jul[i.]?$/i,
        /^aug/i,
        /^sep/i,
        /^okt/i,
        /^nov/i,
        /^dec/i,
    ],
    monthsRegex =
        /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;

export default moment.defineLocale('nl', {
    months: 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split(
        '_'
    ),
    monthsShort: function (m, format) {
        if (!m) {
            return monthsShortWithDots;
        } else if (/-MMM-/.test(format)) {
            return monthsShortWithoutDots[m.month()];
        } else {
            return monthsShortWithDots[m.month()];
        }
    },

    monthsRegex: monthsRegex,
    monthsShortRegex: monthsRegex,
    monthsStrictRegex:
        /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,
    monthsShortStrictRegex:
        /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,

    monthsParse: monthsParse,
    longMonthsParse: monthsParse,
    shortMonthsParse: monthsParse,

    weekdays:
        'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
    weekdaysShort: 'zo._ma._di._wo._do._vr._za.'.split('_'),
    weekdaysMin: 'zo_ma_di_wo_do_vr_za'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD-MM-YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[vandaag om] LT',
        nextDay: '[morgen om] LT',
        nextWeek: 'dddd [om] LT',
        lastDay: '[gisteren om] LT',
        lastWeek: '[afgelopen] dddd [om] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'over %s',
        past: '%s geleden',
        s: 'een paar seconden',
        ss: '%d seconden',
        m: 'één minuut',
        mm: '%d minuten',
        h: 'één uur',
        hh: '%d uur',
        d: 'één dag',
        dd: '%d dagen',
        w: 'één week',
        ww: '%d weken',
        M: 'één maand',
        MM: '%d maanden',
        y: 'één jaar',
        yy: '%d jaar',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/,
    ordinal: function (number) {
        return (
            number +
            (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')
        );
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Nynorsk [nn]
//! authors : https://github.com/mechuwind
//!           Stephen Ramthun : https://github.com/stephenramthun

import moment from '../moment';

export default moment.defineLocale('nn', {
    months: 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split(
        '_'
    ),
    monthsShort:
        'jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),
    monthsParseExact: true,
    weekdays: 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'),
    weekdaysShort: 'su._må._ty._on._to._fr._lau.'.split('_'),
    weekdaysMin: 'su_må_ty_on_to_fr_la'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY [kl.] H:mm',
        LLLL: 'dddd D. MMMM YYYY [kl.] HH:mm',
    },
    calendar: {
        sameDay: '[I dag klokka] LT',
        nextDay: '[I morgon klokka] LT',
        nextWeek: 'dddd [klokka] LT',
        lastDay: '[I går klokka] LT',
        lastWeek: '[Føregåande] dddd [klokka] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'om %s',
        past: '%s sidan',
        s: 'nokre sekund',
        ss: '%d sekund',
        m: 'eit minutt',
        mm: '%d minutt',
        h: 'ein time',
        hh: '%d timar',
        d: 'ein dag',
        dd: '%d dagar',
        w: 'ei veke',
        ww: '%d veker',
        M: 'ein månad',
        MM: '%d månader',
        y: 'eit år',
        yy: '%d år',
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Occitan, lengadocian dialecte [oc-lnc]
//! author : Quentin PAGÈS : https://github.com/Quenty31

import moment from '../moment';

export default moment.defineLocale('oc-lnc', {
    months: {
        standalone:
            'genièr_febrièr_març_abril_mai_junh_julhet_agost_setembre_octòbre_novembre_decembre'.split(
                '_'
            ),
        format: "de genièr_de febrièr_de març_d'abril_de mai_de junh_de julhet_d'agost_de setembre_d'octòbre_de novembre_de decembre".split(
            '_'
        ),
        isFormat: /D[oD]?(\s)+MMMM/,
    },
    monthsShort:
        'gen._febr._març_abr._mai_junh_julh._ago._set._oct._nov._dec.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'dimenge_diluns_dimars_dimècres_dijòus_divendres_dissabte'.split(
        '_'
    ),
    weekdaysShort: 'dg._dl._dm._dc._dj._dv._ds.'.split('_'),
    weekdaysMin: 'dg_dl_dm_dc_dj_dv_ds'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM [de] YYYY',
        ll: 'D MMM YYYY',
        LLL: 'D MMMM [de] YYYY [a] H:mm',
        lll: 'D MMM YYYY, H:mm',
        LLLL: 'dddd D MMMM [de] YYYY [a] H:mm',
        llll: 'ddd D MMM YYYY, H:mm',
    },
    calendar: {
        sameDay: '[uèi a] LT',
        nextDay: '[deman a] LT',
        nextWeek: 'dddd [a] LT',
        lastDay: '[ièr a] LT',
        lastWeek: 'dddd [passat a] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: "d'aquí %s",
        past: 'fa %s',
        s: 'unas segondas',
        ss: '%d segondas',
        m: 'una minuta',
        mm: '%d minutas',
        h: 'una ora',
        hh: '%d oras',
        d: 'un jorn',
        dd: '%d jorns',
        M: 'un mes',
        MM: '%d meses',
        y: 'un an',
        yy: '%d ans',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(r|n|t|è|a)/,
    ordinal: function (number, period) {
        var output =
            number === 1
                ? 'r'
                : number === 2
                ? 'n'
                : number === 3
                ? 'r'
                : number === 4
                ? 't'
                : 'è';
        if (period === 'w' || period === 'W') {
            output = 'a';
        }
        return number + output;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4,
    },
});
//! moment.js locale configuration
//! locale : Punjabi (India) [pa-in]
//! author : Harpreet Singh : https://github.com/harpreetkhalsagtbit

import moment from '../moment';

var symbolMap = {
        1: '੧',
        2: '੨',
        3: '੩',
        4: '੪',
        5: '੫',
        6: '੬',
        7: '੭',
        8: '੮',
        9: '੯',
        0: '੦',
    },
    numberMap = {
        '੧': '1',
        '੨': '2',
        '੩': '3',
        '੪': '4',
        '੫': '5',
        '੬': '6',
        '੭': '7',
        '੮': '8',
        '੯': '9',
        '੦': '0',
    };

export default moment.defineLocale('pa-in', {
    // There are months name as per Nanakshahi Calendar but they are not used as rigidly in modern Punjabi.
    months: 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split(
        '_'
    ),
    monthsShort:
        'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split(
            '_'
        ),
    weekdays: 'ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ'.split(
        '_'
    ),
    weekdaysShort: 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),
    weekdaysMin: 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),
    longDateFormat: {
        LT: 'A h:mm ਵਜੇ',
        LTS: 'A h:mm:ss ਵਜੇ',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY, A h:mm ਵਜੇ',
        LLLL: 'dddd, D MMMM YYYY, A h:mm ਵਜੇ',
    },
    calendar: {
        sameDay: '[ਅਜ] LT',
        nextDay: '[ਕਲ] LT',
        nextWeek: '[ਅਗਲਾ] dddd, LT',
        lastDay: '[ਕਲ] LT',
        lastWeek: '[ਪਿਛਲੇ] dddd, LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s ਵਿੱਚ',
        past: '%s ਪਿਛਲੇ',
        s: 'ਕੁਝ ਸਕਿੰਟ',
        ss: '%d ਸਕਿੰਟ',
        m: 'ਇਕ ਮਿੰਟ',
        mm: '%d ਮਿੰਟ',
        h: 'ਇੱਕ ਘੰਟਾ',
        hh: '%d ਘੰਟੇ',
        d: 'ਇੱਕ ਦਿਨ',
        dd: '%d ਦਿਨ',
        M: 'ਇੱਕ ਮਹੀਨਾ',
        MM: '%d ਮਹੀਨੇ',
        y: 'ਇੱਕ ਸਾਲ',
        yy: '%d ਸਾਲ',
    },
    preparse: function (string) {
        return string.replace(/[੧੨੩੪੫੬੭੮੯੦]/g, function (match) {
            return numberMap[match];
        });
    },
    postformat: function (string) {
        return string.replace(/\d/g, function (match) {
            return symbolMap[match];
        });
    },
    // Punjabi notation for meridiems are quite fuzzy in practice. While there exists
    // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi.
    meridiemParse: /ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'ਰਾਤ') {
            return hour < 4 ? hour : hour + 12;
        } else if (meridiem === 'ਸਵੇਰ') {
            return hour;
        } else if (meridiem === 'ਦੁਪਹਿਰ') {
            return hour >= 10 ? hour : hour + 12;
        } else if (meridiem === 'ਸ਼ਾਮ') {
            return hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'ਰਾਤ';
        } else if (hour < 10) {
            return 'ਸਵੇਰ';
        } else if (hour < 17) {
            return 'ਦੁਪਹਿਰ';
        } else if (hour < 20) {
            return 'ਸ਼ਾਮ';
        } else {
            return 'ਰਾਤ';
        }
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Polish [pl]
//! author : Rafal Hirsz : https://github.com/evoL

import moment from '../moment';

var monthsNominative =
        'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split(
            '_'
        ),
    monthsSubjective =
        'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split(
            '_'
        ),
    monthsParse = [
        /^sty/i,
        /^lut/i,
        /^mar/i,
        /^kwi/i,
        /^maj/i,
        /^cze/i,
        /^lip/i,
        /^sie/i,
        /^wrz/i,
        /^paź/i,
        /^lis/i,
        /^gru/i,
    ];
function plural(n) {
    return n % 10 < 5 && n % 10 > 1 && ~~(n / 10) % 10 !== 1;
}
function translate(number, withoutSuffix, key) {
    var result = number + ' ';
    switch (key) {
        case 'ss':
            return result + (plural(number) ? 'sekundy' : 'sekund');
        case 'm':
            return withoutSuffix ? 'minuta' : 'minutę';
        case 'mm':
            return result + (plural(number) ? 'minuty' : 'minut');
        case 'h':
            return withoutSuffix ? 'godzina' : 'godzinę';
        case 'hh':
            return result + (plural(number) ? 'godziny' : 'godzin');
        case 'ww':
            return result + (plural(number) ? 'tygodnie' : 'tygodni');
        case 'MM':
            return result + (plural(number) ? 'miesiące' : 'miesięcy');
        case 'yy':
            return result + (plural(number) ? 'lata' : 'lat');
    }
}

export default moment.defineLocale('pl', {
    months: function (momentToFormat, format) {
        if (!momentToFormat) {
            return monthsNominative;
        } else if (/D MMMM/.test(format)) {
            return monthsSubjective[momentToFormat.month()];
        } else {
            return monthsNominative[momentToFormat.month()];
        }
    },
    monthsShort: 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'),
    monthsParse: monthsParse,
    longMonthsParse: monthsParse,
    shortMonthsParse: monthsParse,
    weekdays:
        'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'),
    weekdaysShort: 'ndz_pon_wt_śr_czw_pt_sob'.split('_'),
    weekdaysMin: 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Dziś o] LT',
        nextDay: '[Jutro o] LT',
        nextWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[W niedzielę o] LT';

                case 2:
                    return '[We wtorek o] LT';

                case 3:
                    return '[W środę o] LT';

                case 6:
                    return '[W sobotę o] LT';

                default:
                    return '[W] dddd [o] LT';
            }
        },
        lastDay: '[Wczoraj o] LT',
        lastWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[W zeszłą niedzielę o] LT';
                case 3:
                    return '[W zeszłą środę o] LT';
                case 6:
                    return '[W zeszłą sobotę o] LT';
                default:
                    return '[W zeszły] dddd [o] LT';
            }
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'za %s',
        past: '%s temu',
        s: 'kilka sekund',
        ss: translate,
        m: translate,
        mm: translate,
        h: translate,
        hh: translate,
        d: '1 dzień',
        dd: '%d dni',
        w: 'tydzień',
        ww: translate,
        M: 'miesiąc',
        MM: translate,
        y: 'rok',
        yy: translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Portuguese (Brazil) [pt-br]
//! author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira

import moment from '../moment';

export default moment.defineLocale('pt-br', {
    months: 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split(
        '_'
    ),
    monthsShort: 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),
    weekdays:
        'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split(
            '_'
        ),
    weekdaysShort: 'dom_seg_ter_qua_qui_sex_sáb'.split('_'),
    weekdaysMin: 'do_2ª_3ª_4ª_5ª_6ª_sá'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D [de] MMMM [de] YYYY',
        LLL: 'D [de] MMMM [de] YYYY [às] HH:mm',
        LLLL: 'dddd, D [de] MMMM [de] YYYY [às] HH:mm',
    },
    calendar: {
        sameDay: '[Hoje às] LT',
        nextDay: '[Amanhã às] LT',
        nextWeek: 'dddd [às] LT',
        lastDay: '[Ontem às] LT',
        lastWeek: function () {
            return this.day() === 0 || this.day() === 6
                ? '[Último] dddd [às] LT' // Saturday + Sunday
                : '[Última] dddd [às] LT'; // Monday - Friday
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'em %s',
        past: 'há %s',
        s: 'poucos segundos',
        ss: '%d segundos',
        m: 'um minuto',
        mm: '%d minutos',
        h: 'uma hora',
        hh: '%d horas',
        d: 'um dia',
        dd: '%d dias',
        M: 'um mês',
        MM: '%d meses',
        y: 'um ano',
        yy: '%d anos',
    },
    dayOfMonthOrdinalParse: /\d{1,2}º/,
    ordinal: '%dº',
    invalidDate: 'Data inválida',
});
//! moment.js locale configuration
//! locale : Portuguese [pt]
//! author : Jefferson : https://github.com/jalex79

import moment from '../moment';

export default moment.defineLocale('pt', {
    months: 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split(
        '_'
    ),
    monthsShort: 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),
    weekdays:
        'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split(
            '_'
        ),
    weekdaysShort: 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),
    weekdaysMin: 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D [de] MMMM [de] YYYY',
        LLL: 'D [de] MMMM [de] YYYY HH:mm',
        LLLL: 'dddd, D [de] MMMM [de] YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Hoje às] LT',
        nextDay: '[Amanhã às] LT',
        nextWeek: 'dddd [às] LT',
        lastDay: '[Ontem às] LT',
        lastWeek: function () {
            return this.day() === 0 || this.day() === 6
                ? '[Último] dddd [às] LT' // Saturday + Sunday
                : '[Última] dddd [às] LT'; // Monday - Friday
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'em %s',
        past: 'há %s',
        s: 'segundos',
        ss: '%d segundos',
        m: 'um minuto',
        mm: '%d minutos',
        h: 'uma hora',
        hh: '%d horas',
        d: 'um dia',
        dd: '%d dias',
        w: 'uma semana',
        ww: '%d semanas',
        M: 'um mês',
        MM: '%d meses',
        y: 'um ano',
        yy: '%d anos',
    },
    dayOfMonthOrdinalParse: /\d{1,2}º/,
    ordinal: '%dº',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Romanian [ro]
//! author : Vlad Gurdiga : https://github.com/gurdiga
//! author : Valentin Agachi : https://github.com/avaly
//! author : Emanuel Cepoi : https://github.com/cepem

import moment from '../moment';

function relativeTimeWithPlural(number, withoutSuffix, key) {
    var format = {
            ss: 'secunde',
            mm: 'minute',
            hh: 'ore',
            dd: 'zile',
            ww: 'săptămâni',
            MM: 'luni',
            yy: 'ani',
        },
        separator = ' ';
    if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) {
        separator = ' de ';
    }
    return number + separator + format[key];
}

export default moment.defineLocale('ro', {
    months: 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split(
        '_'
    ),
    monthsShort:
        'ian._feb._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'),
    weekdaysShort: 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'),
    weekdaysMin: 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'),
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY H:mm',
        LLLL: 'dddd, D MMMM YYYY H:mm',
    },
    calendar: {
        sameDay: '[azi la] LT',
        nextDay: '[mâine la] LT',
        nextWeek: 'dddd [la] LT',
        lastDay: '[ieri la] LT',
        lastWeek: '[fosta] dddd [la] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'peste %s',
        past: '%s în urmă',
        s: 'câteva secunde',
        ss: relativeTimeWithPlural,
        m: 'un minut',
        mm: relativeTimeWithPlural,
        h: 'o oră',
        hh: relativeTimeWithPlural,
        d: 'o zi',
        dd: relativeTimeWithPlural,
        w: 'o săptămână',
        ww: relativeTimeWithPlural,
        M: 'o lună',
        MM: relativeTimeWithPlural,
        y: 'un an',
        yy: relativeTimeWithPlural,
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Russian [ru]
//! author : Viktorminator : https://github.com/Viktorminator
//! author : Menelion Elensúle : https://github.com/Oire
//! author : Коренберг Марк : https://github.com/socketpair

import moment from '../moment';

function plural(word, num) {
    var forms = word.split('_');
    return num % 10 === 1 && num % 100 !== 11
        ? forms[0]
        : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20)
        ? forms[1]
        : forms[2];
}
function relativeTimeWithPlural(number, withoutSuffix, key) {
    var format = {
        ss: withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд',
        mm: withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут',
        hh: 'час_часа_часов',
        dd: 'день_дня_дней',
        ww: 'неделя_недели_недель',
        MM: 'месяц_месяца_месяцев',
        yy: 'год_года_лет',
    };
    if (key === 'm') {
        return withoutSuffix ? 'минута' : 'минуту';
    } else {
        return number + ' ' + plural(format[key], +number);
    }
}
var monthsParse = [
    /^янв/i,
    /^фев/i,
    /^мар/i,
    /^апр/i,
    /^ма[йя]/i,
    /^июн/i,
    /^июл/i,
    /^авг/i,
    /^сен/i,
    /^окт/i,
    /^ноя/i,
    /^дек/i,
];

// http://new.gramota.ru/spravka/rules/139-prop : § 103
// Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637
// CLDR data:          http://www.unicode.org/cldr/charts/28/summary/ru.html#1753
export default moment.defineLocale('ru', {
    months: {
        format: 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split(
            '_'
        ),
        standalone:
            'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split(
                '_'
            ),
    },
    monthsShort: {
        // по CLDR именно "июл." и "июн.", но какой смысл менять букву на точку?
        format: 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split(
            '_'
        ),
        standalone:
            'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split(
                '_'
            ),
    },
    weekdays: {
        standalone:
            'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split(
                '_'
            ),
        format: 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split(
            '_'
        ),
        isFormat: /\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?] ?dddd/,
    },
    weekdaysShort: 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
    weekdaysMin: 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
    monthsParse: monthsParse,
    longMonthsParse: monthsParse,
    shortMonthsParse: monthsParse,

    // полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки
    monthsRegex:
        /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,

    // копия предыдущего
    monthsShortRegex:
        /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,

    // полные названия с падежами
    monthsStrictRegex:
        /^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i,

    // Выражение, которое соответствует только сокращённым формам
    monthsShortStrictRegex:
        /^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i,
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY г.',
        LLL: 'D MMMM YYYY г., H:mm',
        LLLL: 'dddd, D MMMM YYYY г., H:mm',
    },
    calendar: {
        sameDay: '[Сегодня, в] LT',
        nextDay: '[Завтра, в] LT',
        lastDay: '[Вчера, в] LT',
        nextWeek: function (now) {
            if (now.week() !== this.week()) {
                switch (this.day()) {
                    case 0:
                        return '[В следующее] dddd, [в] LT';
                    case 1:
                    case 2:
                    case 4:
                        return '[В следующий] dddd, [в] LT';
                    case 3:
                    case 5:
                    case 6:
                        return '[В следующую] dddd, [в] LT';
                }
            } else {
                if (this.day() === 2) {
                    return '[Во] dddd, [в] LT';
                } else {
                    return '[В] dddd, [в] LT';
                }
            }
        },
        lastWeek: function (now) {
            if (now.week() !== this.week()) {
                switch (this.day()) {
                    case 0:
                        return '[В прошлое] dddd, [в] LT';
                    case 1:
                    case 2:
                    case 4:
                        return '[В прошлый] dddd, [в] LT';
                    case 3:
                    case 5:
                    case 6:
                        return '[В прошлую] dddd, [в] LT';
                }
            } else {
                if (this.day() === 2) {
                    return '[Во] dddd, [в] LT';
                } else {
                    return '[В] dddd, [в] LT';
                }
            }
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'через %s',
        past: '%s назад',
        s: 'несколько секунд',
        ss: relativeTimeWithPlural,
        m: relativeTimeWithPlural,
        mm: relativeTimeWithPlural,
        h: 'час',
        hh: relativeTimeWithPlural,
        d: 'день',
        dd: relativeTimeWithPlural,
        w: 'неделя',
        ww: relativeTimeWithPlural,
        M: 'месяц',
        MM: relativeTimeWithPlural,
        y: 'год',
        yy: relativeTimeWithPlural,
    },
    meridiemParse: /ночи|утра|дня|вечера/i,
    isPM: function (input) {
        return /^(дня|вечера)$/.test(input);
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'ночи';
        } else if (hour < 12) {
            return 'утра';
        } else if (hour < 17) {
            return 'дня';
        } else {
            return 'вечера';
        }
    },
    dayOfMonthOrdinalParse: /\d{1,2}-(й|го|я)/,
    ordinal: function (number, period) {
        switch (period) {
            case 'M':
            case 'd':
            case 'DDD':
                return number + '-й';
            case 'D':
                return number + '-го';
            case 'w':
            case 'W':
                return number + '-я';
            default:
                return number;
        }
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Sindhi [sd]
//! author : Narain Sagar : https://github.com/narainsagar

import moment from '../moment';

var months = [
        'جنوري',
        'فيبروري',
        'مارچ',
        'اپريل',
        'مئي',
        'جون',
        'جولاءِ',
        'آگسٽ',
        'سيپٽمبر',
        'آڪٽوبر',
        'نومبر',
        'ڊسمبر',
    ],
    days = ['آچر', 'سومر', 'اڱارو', 'اربع', 'خميس', 'جمع', 'ڇنڇر'];

export default moment.defineLocale('sd', {
    months: months,
    monthsShort: months,
    weekdays: days,
    weekdaysShort: days,
    weekdaysMin: days,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd، D MMMM YYYY HH:mm',
    },
    meridiemParse: /صبح|شام/,
    isPM: function (input) {
        return 'شام' === input;
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return 'صبح';
        }
        return 'شام';
    },
    calendar: {
        sameDay: '[اڄ] LT',
        nextDay: '[سڀاڻي] LT',
        nextWeek: 'dddd [اڳين هفتي تي] LT',
        lastDay: '[ڪالهه] LT',
        lastWeek: '[گزريل هفتي] dddd [تي] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s پوء',
        past: '%s اڳ',
        s: 'چند سيڪنڊ',
        ss: '%d سيڪنڊ',
        m: 'هڪ منٽ',
        mm: '%d منٽ',
        h: 'هڪ ڪلاڪ',
        hh: '%d ڪلاڪ',
        d: 'هڪ ڏينهن',
        dd: '%d ڏينهن',
        M: 'هڪ مهينو',
        MM: '%d مهينا',
        y: 'هڪ سال',
        yy: '%d سال',
    },
    preparse: function (string) {
        return string.replace(/،/g, ',');
    },
    postformat: function (string) {
        return string.replace(/,/g, '،');
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Northern Sami [se]
//! authors : Bård Rolstad Henriksen : https://github.com/karamell

import moment from '../moment';

export default moment.defineLocale('se', {
    months: 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split(
        '_'
    ),
    monthsShort:
        'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'),
    weekdays:
        'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split(
            '_'
        ),
    weekdaysShort: 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'),
    weekdaysMin: 's_v_m_g_d_b_L'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'MMMM D. [b.] YYYY',
        LLL: 'MMMM D. [b.] YYYY [ti.] HH:mm',
        LLLL: 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm',
    },
    calendar: {
        sameDay: '[otne ti] LT',
        nextDay: '[ihttin ti] LT',
        nextWeek: 'dddd [ti] LT',
        lastDay: '[ikte ti] LT',
        lastWeek: '[ovddit] dddd [ti] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s geažes',
        past: 'maŋit %s',
        s: 'moadde sekunddat',
        ss: '%d sekunddat',
        m: 'okta minuhta',
        mm: '%d minuhtat',
        h: 'okta diimmu',
        hh: '%d diimmut',
        d: 'okta beaivi',
        dd: '%d beaivvit',
        M: 'okta mánnu',
        MM: '%d mánut',
        y: 'okta jahki',
        yy: '%d jagit',
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Sinhalese [si]
//! author : Sampath Sitinamaluwa : https://github.com/sampathsris

import moment from '../moment';

/*jshint -W100*/
export default moment.defineLocale('si', {
    months: 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split(
        '_'
    ),
    monthsShort: 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split(
        '_'
    ),
    weekdays:
        'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split(
            '_'
        ),
    weekdaysShort: 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'),
    weekdaysMin: 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'a h:mm',
        LTS: 'a h:mm:ss',
        L: 'YYYY/MM/DD',
        LL: 'YYYY MMMM D',
        LLL: 'YYYY MMMM D, a h:mm',
        LLLL: 'YYYY MMMM D [වැනි] dddd, a h:mm:ss',
    },
    calendar: {
        sameDay: '[අද] LT[ට]',
        nextDay: '[හෙට] LT[ට]',
        nextWeek: 'dddd LT[ට]',
        lastDay: '[ඊයේ] LT[ට]',
        lastWeek: '[පසුගිය] dddd LT[ට]',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%sකින්',
        past: '%sකට පෙර',
        s: 'තත්පර කිහිපය',
        ss: 'තත්පර %d',
        m: 'මිනිත්තුව',
        mm: 'මිනිත්තු %d',
        h: 'පැය',
        hh: 'පැය %d',
        d: 'දිනය',
        dd: 'දින %d',
        M: 'මාසය',
        MM: 'මාස %d',
        y: 'වසර',
        yy: 'වසර %d',
    },
    dayOfMonthOrdinalParse: /\d{1,2} වැනි/,
    ordinal: function (number) {
        return number + ' වැනි';
    },
    meridiemParse: /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./,
    isPM: function (input) {
        return input === 'ප.ව.' || input === 'පස් වරු';
    },
    meridiem: function (hours, minutes, isLower) {
        if (hours > 11) {
            return isLower ? 'ප.ව.' : 'පස් වරු';
        } else {
            return isLower ? 'පෙ.ව.' : 'පෙර වරු';
        }
    },
});
//! moment.js locale configuration
//! locale : Slovak [sk]
//! author : Martin Minka : https://github.com/k2s
//! based on work of petrbela : https://github.com/petrbela

import moment from '../moment';

var months =
        'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split(
            '_'
        ),
    monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_');
function plural(n) {
    return n > 1 && n < 5;
}
function translate(number, withoutSuffix, key, isFuture) {
    var result = number + ' ';
    switch (key) {
        case 's': // a few seconds / in a few seconds / a few seconds ago
            return withoutSuffix || isFuture ? 'pár sekúnd' : 'pár sekundami';
        case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago
            if (withoutSuffix || isFuture) {
                return result + (plural(number) ? 'sekundy' : 'sekúnd');
            } else {
                return result + 'sekundami';
            }
        case 'm': // a minute / in a minute / a minute ago
            return withoutSuffix ? 'minúta' : isFuture ? 'minútu' : 'minútou';
        case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
            if (withoutSuffix || isFuture) {
                return result + (plural(number) ? 'minúty' : 'minút');
            } else {
                return result + 'minútami';
            }
        case 'h': // an hour / in an hour / an hour ago
            return withoutSuffix ? 'hodina' : isFuture ? 'hodinu' : 'hodinou';
        case 'hh': // 9 hours / in 9 hours / 9 hours ago
            if (withoutSuffix || isFuture) {
                return result + (plural(number) ? 'hodiny' : 'hodín');
            } else {
                return result + 'hodinami';
            }
        case 'd': // a day / in a day / a day ago
            return withoutSuffix || isFuture ? 'deň' : 'dňom';
        case 'dd': // 9 days / in 9 days / 9 days ago
            if (withoutSuffix || isFuture) {
                return result + (plural(number) ? 'dni' : 'dní');
            } else {
                return result + 'dňami';
            }
        case 'M': // a month / in a month / a month ago
            return withoutSuffix || isFuture ? 'mesiac' : 'mesiacom';
        case 'MM': // 9 months / in 9 months / 9 months ago
            if (withoutSuffix || isFuture) {
                return result + (plural(number) ? 'mesiace' : 'mesiacov');
            } else {
                return result + 'mesiacmi';
            }
        case 'y': // a year / in a year / a year ago
            return withoutSuffix || isFuture ? 'rok' : 'rokom';
        case 'yy': // 9 years / in 9 years / 9 years ago
            if (withoutSuffix || isFuture) {
                return result + (plural(number) ? 'roky' : 'rokov');
            } else {
                return result + 'rokmi';
            }
    }
}

export default moment.defineLocale('sk', {
    months: months,
    monthsShort: monthsShort,
    weekdays: 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'),
    weekdaysShort: 'ne_po_ut_st_št_pi_so'.split('_'),
    weekdaysMin: 'ne_po_ut_st_št_pi_so'.split('_'),
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY H:mm',
        LLLL: 'dddd D. MMMM YYYY H:mm',
    },
    calendar: {
        sameDay: '[dnes o] LT',
        nextDay: '[zajtra o] LT',
        nextWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[v nedeľu o] LT';
                case 1:
                case 2:
                    return '[v] dddd [o] LT';
                case 3:
                    return '[v stredu o] LT';
                case 4:
                    return '[vo štvrtok o] LT';
                case 5:
                    return '[v piatok o] LT';
                case 6:
                    return '[v sobotu o] LT';
            }
        },
        lastDay: '[včera o] LT',
        lastWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[minulú nedeľu o] LT';
                case 1:
                case 2:
                    return '[minulý] dddd [o] LT';
                case 3:
                    return '[minulú stredu o] LT';
                case 4:
                case 5:
                    return '[minulý] dddd [o] LT';
                case 6:
                    return '[minulú sobotu o] LT';
            }
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'za %s',
        past: 'pred %s',
        s: translate,
        ss: translate,
        m: translate,
        mm: translate,
        h: translate,
        hh: translate,
        d: translate,
        dd: translate,
        M: translate,
        MM: translate,
        y: translate,
        yy: translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Slovenian [sl]
//! author : Robert Sedovšek : https://github.com/sedovsek

import moment from '../moment';

function processRelativeTime(number, withoutSuffix, key, isFuture) {
    var result = number + ' ';
    switch (key) {
        case 's':
            return withoutSuffix || isFuture
                ? 'nekaj sekund'
                : 'nekaj sekundami';
        case 'ss':
            if (number === 1) {
                result += withoutSuffix ? 'sekundo' : 'sekundi';
            } else if (number === 2) {
                result += withoutSuffix || isFuture ? 'sekundi' : 'sekundah';
            } else if (number < 5) {
                result += withoutSuffix || isFuture ? 'sekunde' : 'sekundah';
            } else {
                result += 'sekund';
            }
            return result;
        case 'm':
            return withoutSuffix ? 'ena minuta' : 'eno minuto';
        case 'mm':
            if (number === 1) {
                result += withoutSuffix ? 'minuta' : 'minuto';
            } else if (number === 2) {
                result += withoutSuffix || isFuture ? 'minuti' : 'minutama';
            } else if (number < 5) {
                result += withoutSuffix || isFuture ? 'minute' : 'minutami';
            } else {
                result += withoutSuffix || isFuture ? 'minut' : 'minutami';
            }
            return result;
        case 'h':
            return withoutSuffix ? 'ena ura' : 'eno uro';
        case 'hh':
            if (number === 1) {
                result += withoutSuffix ? 'ura' : 'uro';
            } else if (number === 2) {
                result += withoutSuffix || isFuture ? 'uri' : 'urama';
            } else if (number < 5) {
                result += withoutSuffix || isFuture ? 'ure' : 'urami';
            } else {
                result += withoutSuffix || isFuture ? 'ur' : 'urami';
            }
            return result;
        case 'd':
            return withoutSuffix || isFuture ? 'en dan' : 'enim dnem';
        case 'dd':
            if (number === 1) {
                result += withoutSuffix || isFuture ? 'dan' : 'dnem';
            } else if (number === 2) {
                result += withoutSuffix || isFuture ? 'dni' : 'dnevoma';
            } else {
                result += withoutSuffix || isFuture ? 'dni' : 'dnevi';
            }
            return result;
        case 'M':
            return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem';
        case 'MM':
            if (number === 1) {
                result += withoutSuffix || isFuture ? 'mesec' : 'mesecem';
            } else if (number === 2) {
                result += withoutSuffix || isFuture ? 'meseca' : 'mesecema';
            } else if (number < 5) {
                result += withoutSuffix || isFuture ? 'mesece' : 'meseci';
            } else {
                result += withoutSuffix || isFuture ? 'mesecev' : 'meseci';
            }
            return result;
        case 'y':
            return withoutSuffix || isFuture ? 'eno leto' : 'enim letom';
        case 'yy':
            if (number === 1) {
                result += withoutSuffix || isFuture ? 'leto' : 'letom';
            } else if (number === 2) {
                result += withoutSuffix || isFuture ? 'leti' : 'letoma';
            } else if (number < 5) {
                result += withoutSuffix || isFuture ? 'leta' : 'leti';
            } else {
                result += withoutSuffix || isFuture ? 'let' : 'leti';
            }
            return result;
    }
}

export default moment.defineLocale('sl', {
    months: 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split(
        '_'
    ),
    monthsShort:
        'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'),
    weekdaysShort: 'ned._pon._tor._sre._čet._pet._sob.'.split('_'),
    weekdaysMin: 'ne_po_to_sr_če_pe_so'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD. MM. YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY H:mm',
        LLLL: 'dddd, D. MMMM YYYY H:mm',
    },
    calendar: {
        sameDay: '[danes ob] LT',
        nextDay: '[jutri ob] LT',

        nextWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[v] [nedeljo] [ob] LT';
                case 3:
                    return '[v] [sredo] [ob] LT';
                case 6:
                    return '[v] [soboto] [ob] LT';
                case 1:
                case 2:
                case 4:
                case 5:
                    return '[v] dddd [ob] LT';
            }
        },
        lastDay: '[včeraj ob] LT',
        lastWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[prejšnjo] [nedeljo] [ob] LT';
                case 3:
                    return '[prejšnjo] [sredo] [ob] LT';
                case 6:
                    return '[prejšnjo] [soboto] [ob] LT';
                case 1:
                case 2:
                case 4:
                case 5:
                    return '[prejšnji] dddd [ob] LT';
            }
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'čez %s',
        past: 'pred %s',
        s: processRelativeTime,
        ss: processRelativeTime,
        m: processRelativeTime,
        mm: processRelativeTime,
        h: processRelativeTime,
        hh: processRelativeTime,
        d: processRelativeTime,
        dd: processRelativeTime,
        M: processRelativeTime,
        MM: processRelativeTime,
        y: processRelativeTime,
        yy: processRelativeTime,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Albanian [sq]
//! author : Flakërim Ismani : https://github.com/flakerimi
//! author : Menelion Elensúle : https://github.com/Oire
//! author : Oerd Cukalla : https://github.com/oerd

import moment from '../moment';

export default moment.defineLocale('sq', {
    months: 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split(
        '_'
    ),
    monthsShort: 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'),
    weekdays: 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split(
        '_'
    ),
    weekdaysShort: 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'),
    weekdaysMin: 'D_H_Ma_Më_E_P_Sh'.split('_'),
    weekdaysParseExact: true,
    meridiemParse: /PD|MD/,
    isPM: function (input) {
        return input.charAt(0) === 'M';
    },
    meridiem: function (hours, minutes, isLower) {
        return hours < 12 ? 'PD' : 'MD';
    },
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Sot në] LT',
        nextDay: '[Nesër në] LT',
        nextWeek: 'dddd [në] LT',
        lastDay: '[Dje në] LT',
        lastWeek: 'dddd [e kaluar në] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'në %s',
        past: '%s më parë',
        s: 'disa sekonda',
        ss: '%d sekonda',
        m: 'një minutë',
        mm: '%d minuta',
        h: 'një orë',
        hh: '%d orë',
        d: 'një ditë',
        dd: '%d ditë',
        M: 'një muaj',
        MM: '%d muaj',
        y: 'një vit',
        yy: '%d vite',
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Serbian Cyrillic [sr-cyrl]
//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
//! author : Stefan Crnjaković <stefan@hotmail.rs> : https://github.com/crnjakovic

import moment from '../moment';

var translator = {
    words: {
        //Different grammatical cases
        ss: ['секунда', 'секунде', 'секунди'],
        m: ['један минут', 'једног минута'],
        mm: ['минут', 'минута', 'минута'],
        h: ['један сат', 'једног сата'],
        hh: ['сат', 'сата', 'сати'],
        d: ['један дан', 'једног дана'],
        dd: ['дан', 'дана', 'дана'],
        M: ['један месец', 'једног месеца'],
        MM: ['месец', 'месеца', 'месеци'],
        y: ['једну годину', 'једне године'],
        yy: ['годину', 'године', 'година'],
    },
    correctGrammaticalCase: function (number, wordKey) {
        if (
            number % 10 >= 1 &&
            number % 10 <= 4 &&
            (number % 100 < 10 || number % 100 >= 20)
        ) {
            return number % 10 === 1 ? wordKey[0] : wordKey[1];
        }
        return wordKey[2];
    },
    translate: function (number, withoutSuffix, key, isFuture) {
        var wordKey = translator.words[key],
            word;

        if (key.length === 1) {
            // Nominativ
            if (key === 'y' && withoutSuffix) return 'једна година';
            return isFuture || withoutSuffix ? wordKey[0] : wordKey[1];
        }

        word = translator.correctGrammaticalCase(number, wordKey);
        // Nominativ
        if (key === 'yy' && withoutSuffix && word === 'годину') {
            return number + ' година';
        }

        return number + ' ' + word;
    },
};

export default moment.defineLocale('sr-cyrl', {
    months: 'јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар'.split(
        '_'
    ),
    monthsShort:
        'јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.'.split('_'),
    monthsParseExact: true,
    weekdays: 'недеља_понедељак_уторак_среда_четвртак_петак_субота'.split('_'),
    weekdaysShort: 'нед._пон._уто._сре._чет._пет._суб.'.split('_'),
    weekdaysMin: 'не_по_ут_ср_че_пе_су'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'D. M. YYYY.',
        LL: 'D. MMMM YYYY.',
        LLL: 'D. MMMM YYYY. H:mm',
        LLLL: 'dddd, D. MMMM YYYY. H:mm',
    },
    calendar: {
        sameDay: '[данас у] LT',
        nextDay: '[сутра у] LT',
        nextWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[у] [недељу] [у] LT';
                case 3:
                    return '[у] [среду] [у] LT';
                case 6:
                    return '[у] [суботу] [у] LT';
                case 1:
                case 2:
                case 4:
                case 5:
                    return '[у] dddd [у] LT';
            }
        },
        lastDay: '[јуче у] LT',
        lastWeek: function () {
            var lastWeekDays = [
                '[прошле] [недеље] [у] LT',
                '[прошлог] [понедељка] [у] LT',
                '[прошлог] [уторка] [у] LT',
                '[прошле] [среде] [у] LT',
                '[прошлог] [четвртка] [у] LT',
                '[прошлог] [петка] [у] LT',
                '[прошле] [суботе] [у] LT',
            ];
            return lastWeekDays[this.day()];
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'за %s',
        past: 'пре %s',
        s: 'неколико секунди',
        ss: translator.translate,
        m: translator.translate,
        mm: translator.translate,
        h: translator.translate,
        hh: translator.translate,
        d: translator.translate,
        dd: translator.translate,
        M: translator.translate,
        MM: translator.translate,
        y: translator.translate,
        yy: translator.translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 1st is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Serbian [sr]
//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
//! author : Stefan Crnjaković <stefan@hotmail.rs> : https://github.com/crnjakovic

import moment from '../moment';

var translator = {
    words: {
        //Different grammatical cases
        ss: ['sekunda', 'sekunde', 'sekundi'],
        m: ['jedan minut', 'jednog minuta'],
        mm: ['minut', 'minuta', 'minuta'],
        h: ['jedan sat', 'jednog sata'],
        hh: ['sat', 'sata', 'sati'],
        d: ['jedan dan', 'jednog dana'],
        dd: ['dan', 'dana', 'dana'],
        M: ['jedan mesec', 'jednog meseca'],
        MM: ['mesec', 'meseca', 'meseci'],
        y: ['jednu godinu', 'jedne godine'],
        yy: ['godinu', 'godine', 'godina'],
    },
    correctGrammaticalCase: function (number, wordKey) {
        if (
            number % 10 >= 1 &&
            number % 10 <= 4 &&
            (number % 100 < 10 || number % 100 >= 20)
        ) {
            return number % 10 === 1 ? wordKey[0] : wordKey[1];
        }
        return wordKey[2];
    },
    translate: function (number, withoutSuffix, key, isFuture) {
        var wordKey = translator.words[key],
            word;

        if (key.length === 1) {
            // Nominativ
            if (key === 'y' && withoutSuffix) return 'jedna godina';
            return isFuture || withoutSuffix ? wordKey[0] : wordKey[1];
        }

        word = translator.correctGrammaticalCase(number, wordKey);
        // Nominativ
        if (key === 'yy' && withoutSuffix && word === 'godinu') {
            return number + ' godina';
        }

        return number + ' ' + word;
    },
};

export default moment.defineLocale('sr', {
    months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split(
        '_'
    ),
    monthsShort:
        'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),
    monthsParseExact: true,
    weekdays: 'nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota'.split(
        '_'
    ),
    weekdaysShort: 'ned._pon._uto._sre._čet._pet._sub.'.split('_'),
    weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'D. M. YYYY.',
        LL: 'D. MMMM YYYY.',
        LLL: 'D. MMMM YYYY. H:mm',
        LLLL: 'dddd, D. MMMM YYYY. H:mm',
    },
    calendar: {
        sameDay: '[danas u] LT',
        nextDay: '[sutra u] LT',
        nextWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[u] [nedelju] [u] LT';
                case 3:
                    return '[u] [sredu] [u] LT';
                case 6:
                    return '[u] [subotu] [u] LT';
                case 1:
                case 2:
                case 4:
                case 5:
                    return '[u] dddd [u] LT';
            }
        },
        lastDay: '[juče u] LT',
        lastWeek: function () {
            var lastWeekDays = [
                '[prošle] [nedelje] [u] LT',
                '[prošlog] [ponedeljka] [u] LT',
                '[prošlog] [utorka] [u] LT',
                '[prošle] [srede] [u] LT',
                '[prošlog] [četvrtka] [u] LT',
                '[prošlog] [petka] [u] LT',
                '[prošle] [subote] [u] LT',
            ];
            return lastWeekDays[this.day()];
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'za %s',
        past: 'pre %s',
        s: 'nekoliko sekundi',
        ss: translator.translate,
        m: translator.translate,
        mm: translator.translate,
        h: translator.translate,
        hh: translator.translate,
        d: translator.translate,
        dd: translator.translate,
        M: translator.translate,
        MM: translator.translate,
        y: translator.translate,
        yy: translator.translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : siSwati [ss]
//! author : Nicolai Davies<mail@nicolai.io> : https://github.com/nicolaidavies

import moment from '../moment';

export default moment.defineLocale('ss', {
    months: "Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split(
        '_'
    ),
    monthsShort: 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'),
    weekdays:
        'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split(
            '_'
        ),
    weekdaysShort: 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'),
    weekdaysMin: 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'h:mm A',
        LTS: 'h:mm:ss A',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY h:mm A',
        LLLL: 'dddd, D MMMM YYYY h:mm A',
    },
    calendar: {
        sameDay: '[Namuhla nga] LT',
        nextDay: '[Kusasa nga] LT',
        nextWeek: 'dddd [nga] LT',
        lastDay: '[Itolo nga] LT',
        lastWeek: 'dddd [leliphelile] [nga] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'nga %s',
        past: 'wenteka nga %s',
        s: 'emizuzwana lomcane',
        ss: '%d mzuzwana',
        m: 'umzuzu',
        mm: '%d emizuzu',
        h: 'lihora',
        hh: '%d emahora',
        d: 'lilanga',
        dd: '%d emalanga',
        M: 'inyanga',
        MM: '%d tinyanga',
        y: 'umnyaka',
        yy: '%d iminyaka',
    },
    meridiemParse: /ekuseni|emini|entsambama|ebusuku/,
    meridiem: function (hours, minutes, isLower) {
        if (hours < 11) {
            return 'ekuseni';
        } else if (hours < 15) {
            return 'emini';
        } else if (hours < 19) {
            return 'entsambama';
        } else {
            return 'ebusuku';
        }
    },
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'ekuseni') {
            return hour;
        } else if (meridiem === 'emini') {
            return hour >= 11 ? hour : hour + 12;
        } else if (meridiem === 'entsambama' || meridiem === 'ebusuku') {
            if (hour === 0) {
                return 0;
            }
            return hour + 12;
        }
    },
    dayOfMonthOrdinalParse: /\d{1,2}/,
    ordinal: '%d',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Swedish [sv]
//! author : Jens Alm : https://github.com/ulmus

import moment from '../moment';

export default moment.defineLocale('sv', {
    months: 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split(
        '_'
    ),
    monthsShort: 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
    weekdays: 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'),
    weekdaysShort: 'sön_mån_tis_ons_tor_fre_lör'.split('_'),
    weekdaysMin: 'sö_må_ti_on_to_fr_lö'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'YYYY-MM-DD',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY [kl.] HH:mm',
        LLLL: 'dddd D MMMM YYYY [kl.] HH:mm',
        lll: 'D MMM YYYY HH:mm',
        llll: 'ddd D MMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Idag] LT',
        nextDay: '[Imorgon] LT',
        lastDay: '[Igår] LT',
        nextWeek: '[På] dddd LT',
        lastWeek: '[I] dddd[s] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'om %s',
        past: 'för %s sedan',
        s: 'några sekunder',
        ss: '%d sekunder',
        m: 'en minut',
        mm: '%d minuter',
        h: 'en timme',
        hh: '%d timmar',
        d: 'en dag',
        dd: '%d dagar',
        M: 'en månad',
        MM: '%d månader',
        y: 'ett år',
        yy: '%d år',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(\:e|\:a)/,
    ordinal: function (number) {
        var b = number % 10,
            output =
                ~~((number % 100) / 10) === 1
                    ? ':e'
                    : b === 1
                    ? ':a'
                    : b === 2
                    ? ':a'
                    : b === 3
                    ? ':e'
                    : ':e';
        return number + output;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Swahili [sw]
//! author : Fahad Kassim : https://github.com/fadsel

import moment from '../moment';

export default moment.defineLocale('sw', {
    months: 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'),
    weekdays:
        'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split(
            '_'
        ),
    weekdaysShort: 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'),
    weekdaysMin: 'J2_J3_J4_J5_Al_Ij_J1'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'hh:mm A',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[leo saa] LT',
        nextDay: '[kesho saa] LT',
        nextWeek: '[wiki ijayo] dddd [saat] LT',
        lastDay: '[jana] LT',
        lastWeek: '[wiki iliyopita] dddd [saat] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s baadaye',
        past: 'tokea %s',
        s: 'hivi punde',
        ss: 'sekunde %d',
        m: 'dakika moja',
        mm: 'dakika %d',
        h: 'saa limoja',
        hh: 'masaa %d',
        d: 'siku moja',
        dd: 'siku %d',
        M: 'mwezi mmoja',
        MM: 'miezi %d',
        y: 'mwaka mmoja',
        yy: 'miaka %d',
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Tamil [ta]
//! author : Arjunkumar Krishnamoorthy : https://github.com/tk120404

import moment from '../moment';

var symbolMap = {
        1: '௧',
        2: '௨',
        3: '௩',
        4: '௪',
        5: '௫',
        6: '௬',
        7: '௭',
        8: '௮',
        9: '௯',
        0: '௦',
    },
    numberMap = {
        '௧': '1',
        '௨': '2',
        '௩': '3',
        '௪': '4',
        '௫': '5',
        '௬': '6',
        '௭': '7',
        '௮': '8',
        '௯': '9',
        '௦': '0',
    };

export default moment.defineLocale('ta', {
    months: 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split(
        '_'
    ),
    monthsShort:
        'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split(
            '_'
        ),
    weekdays:
        'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split(
            '_'
        ),
    weekdaysShort: 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split(
        '_'
    ),
    weekdaysMin: 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY, HH:mm',
        LLLL: 'dddd, D MMMM YYYY, HH:mm',
    },
    calendar: {
        sameDay: '[இன்று] LT',
        nextDay: '[நாளை] LT',
        nextWeek: 'dddd, LT',
        lastDay: '[நேற்று] LT',
        lastWeek: '[கடந்த வாரம்] dddd, LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s இல்',
        past: '%s முன்',
        s: 'ஒரு சில விநாடிகள்',
        ss: '%d விநாடிகள்',
        m: 'ஒரு நிமிடம்',
        mm: '%d நிமிடங்கள்',
        h: 'ஒரு மணி நேரம்',
        hh: '%d மணி நேரம்',
        d: 'ஒரு நாள்',
        dd: '%d நாட்கள்',
        M: 'ஒரு மாதம்',
        MM: '%d மாதங்கள்',
        y: 'ஒரு வருடம்',
        yy: '%d ஆண்டுகள்',
    },
    dayOfMonthOrdinalParse: /\d{1,2}வது/,
    ordinal: function (number) {
        return number + 'வது';
    },
    preparse: function (string) {
        return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) {
            return numberMap[match];
        });
    },
    postformat: function (string) {
        return string.replace(/\d/g, function (match) {
            return symbolMap[match];
        });
    },
    // refer http://ta.wikipedia.org/s/1er1
    meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/,
    meridiem: function (hour, minute, isLower) {
        if (hour < 2) {
            return ' யாமம்';
        } else if (hour < 6) {
            return ' வைகறை'; // வைகறை
        } else if (hour < 10) {
            return ' காலை'; // காலை
        } else if (hour < 14) {
            return ' நண்பகல்'; // நண்பகல்
        } else if (hour < 18) {
            return ' எற்பாடு'; // எற்பாடு
        } else if (hour < 22) {
            return ' மாலை'; // மாலை
        } else {
            return ' யாமம்';
        }
    },
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'யாமம்') {
            return hour < 2 ? hour : hour + 12;
        } else if (meridiem === 'வைகறை' || meridiem === 'காலை') {
            return hour;
        } else if (meridiem === 'நண்பகல்') {
            return hour >= 10 ? hour : hour + 12;
        } else {
            return hour + 12;
        }
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Telugu [te]
//! author : Krishna Chaitanya Thota : https://github.com/kcthota

import moment from '../moment';

export default moment.defineLocale('te', {
    months: 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జులై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split(
        '_'
    ),
    monthsShort:
        'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జులై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays:
        'ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం'.split(
            '_'
        ),
    weekdaysShort: 'ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని'.split('_'),
    weekdaysMin: 'ఆ_సో_మం_బు_గు_శు_శ'.split('_'),
    longDateFormat: {
        LT: 'A h:mm',
        LTS: 'A h:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY, A h:mm',
        LLLL: 'dddd, D MMMM YYYY, A h:mm',
    },
    calendar: {
        sameDay: '[నేడు] LT',
        nextDay: '[రేపు] LT',
        nextWeek: 'dddd, LT',
        lastDay: '[నిన్న] LT',
        lastWeek: '[గత] dddd, LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s లో',
        past: '%s క్రితం',
        s: 'కొన్ని క్షణాలు',
        ss: '%d సెకన్లు',
        m: 'ఒక నిమిషం',
        mm: '%d నిమిషాలు',
        h: 'ఒక గంట',
        hh: '%d గంటలు',
        d: 'ఒక రోజు',
        dd: '%d రోజులు',
        M: 'ఒక నెల',
        MM: '%d నెలలు',
        y: 'ఒక సంవత్సరం',
        yy: '%d సంవత్సరాలు',
    },
    dayOfMonthOrdinalParse: /\d{1,2}వ/,
    ordinal: '%dవ',
    meridiemParse: /రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'రాత్రి') {
            return hour < 4 ? hour : hour + 12;
        } else if (meridiem === 'ఉదయం') {
            return hour;
        } else if (meridiem === 'మధ్యాహ్నం') {
            return hour >= 10 ? hour : hour + 12;
        } else if (meridiem === 'సాయంత్రం') {
            return hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'రాత్రి';
        } else if (hour < 10) {
            return 'ఉదయం';
        } else if (hour < 17) {
            return 'మధ్యాహ్నం';
        } else if (hour < 20) {
            return 'సాయంత్రం';
        } else {
            return 'రాత్రి';
        }
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Tetun Dili (East Timor) [tet]
//! author : Joshua Brooks : https://github.com/joshbrooks
//! author : Onorio De J. Afonso : https://github.com/marobo
//! author : Sonia Simoes : https://github.com/soniasimoes

import moment from '../moment';

export default moment.defineLocale('tet', {
    months: 'Janeiru_Fevereiru_Marsu_Abril_Maiu_Juñu_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru'.split(
        '_'
    ),
    monthsShort: 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),
    weekdays: 'Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu'.split('_'),
    weekdaysShort: 'Dom_Seg_Ters_Kua_Kint_Sest_Sab'.split('_'),
    weekdaysMin: 'Do_Seg_Te_Ku_Ki_Ses_Sa'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Ohin iha] LT',
        nextDay: '[Aban iha] LT',
        nextWeek: 'dddd [iha] LT',
        lastDay: '[Horiseik iha] LT',
        lastWeek: 'dddd [semana kotuk] [iha] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'iha %s',
        past: '%s liuba',
        s: 'segundu balun',
        ss: 'segundu %d',
        m: 'minutu ida',
        mm: 'minutu %d',
        h: 'oras ida',
        hh: 'oras %d',
        d: 'loron ida',
        dd: 'loron %d',
        M: 'fulan ida',
        MM: 'fulan %d',
        y: 'tinan ida',
        yy: 'tinan %d',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
    ordinal: function (number) {
        var b = number % 10,
            output =
                ~~((number % 100) / 10) === 1
                    ? 'th'
                    : b === 1
                    ? 'st'
                    : b === 2
                    ? 'nd'
                    : b === 3
                    ? 'rd'
                    : 'th';
        return number + output;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Tajik [tg]
//! author : Orif N. Jr. : https://github.com/orif-jr

import moment from '../moment';

var suffixes = {
    0: '-ум',
    1: '-ум',
    2: '-юм',
    3: '-юм',
    4: '-ум',
    5: '-ум',
    6: '-ум',
    7: '-ум',
    8: '-ум',
    9: '-ум',
    10: '-ум',
    12: '-ум',
    13: '-ум',
    20: '-ум',
    30: '-юм',
    40: '-ум',
    50: '-ум',
    60: '-ум',
    70: '-ум',
    80: '-ум',
    90: '-ум',
    100: '-ум',
};

export default moment.defineLocale('tg', {
    months: {
        format: 'январи_феврали_марти_апрели_майи_июни_июли_августи_сентябри_октябри_ноябри_декабри'.split(
            '_'
        ),
        standalone:
            'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split(
                '_'
            ),
    },
    monthsShort: 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),
    weekdays: 'якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе'.split(
        '_'
    ),
    weekdaysShort: 'яшб_дшб_сшб_чшб_пшб_ҷум_шнб'.split('_'),
    weekdaysMin: 'яш_дш_сш_чш_пш_ҷм_шб'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Имрӯз соати] LT',
        nextDay: '[Фардо соати] LT',
        lastDay: '[Дирӯз соати] LT',
        nextWeek: 'dddd[и] [ҳафтаи оянда соати] LT',
        lastWeek: 'dddd[и] [ҳафтаи гузашта соати] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'баъди %s',
        past: '%s пеш',
        s: 'якчанд сония',
        m: 'як дақиқа',
        mm: '%d дақиқа',
        h: 'як соат',
        hh: '%d соат',
        d: 'як рӯз',
        dd: '%d рӯз',
        M: 'як моҳ',
        MM: '%d моҳ',
        y: 'як сол',
        yy: '%d сол',
    },
    meridiemParse: /шаб|субҳ|рӯз|бегоҳ/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'шаб') {
            return hour < 4 ? hour : hour + 12;
        } else if (meridiem === 'субҳ') {
            return hour;
        } else if (meridiem === 'рӯз') {
            return hour >= 11 ? hour : hour + 12;
        } else if (meridiem === 'бегоҳ') {
            return hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'шаб';
        } else if (hour < 11) {
            return 'субҳ';
        } else if (hour < 16) {
            return 'рӯз';
        } else if (hour < 19) {
            return 'бегоҳ';
        } else {
            return 'шаб';
        }
    },
    dayOfMonthOrdinalParse: /\d{1,2}-(ум|юм)/,
    ordinal: function (number) {
        var a = number % 10,
            b = number >= 100 ? 100 : null;
        return number + (suffixes[number] || suffixes[a] || suffixes[b]);
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 1th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Thai [th]
//! author : Kridsada Thanabulpong : https://github.com/sirn

import moment from '../moment';

export default moment.defineLocale('th', {
    months: 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split(
        '_'
    ),
    monthsShort:
        'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'),
    weekdaysShort: 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference
    weekdaysMin: 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY เวลา H:mm',
        LLLL: 'วันddddที่ D MMMM YYYY เวลา H:mm',
    },
    meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/,
    isPM: function (input) {
        return input === 'หลังเที่ยง';
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return 'ก่อนเที่ยง';
        } else {
            return 'หลังเที่ยง';
        }
    },
    calendar: {
        sameDay: '[วันนี้ เวลา] LT',
        nextDay: '[พรุ่งนี้ เวลา] LT',
        nextWeek: 'dddd[หน้า เวลา] LT',
        lastDay: '[เมื่อวานนี้ เวลา] LT',
        lastWeek: '[วัน]dddd[ที่แล้ว เวลา] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'อีก %s',
        past: '%sที่แล้ว',
        s: 'ไม่กี่วินาที',
        ss: '%d วินาที',
        m: '1 นาที',
        mm: '%d นาที',
        h: '1 ชั่วโมง',
        hh: '%d ชั่วโมง',
        d: '1 วัน',
        dd: '%d วัน',
        w: '1 สัปดาห์',
        ww: '%d สัปดาห์',
        M: '1 เดือน',
        MM: '%d เดือน',
        y: '1 ปี',
        yy: '%d ปี',
    },
});
//! moment.js locale configuration
//! locale : Turkmen [tk]
//! author : Atamyrat Abdyrahmanov : https://github.com/atamyratabdy

import moment from '../moment';

var suffixes = {
    1: "'inji",
    5: "'inji",
    8: "'inji",
    70: "'inji",
    80: "'inji",
    2: "'nji",
    7: "'nji",
    20: "'nji",
    50: "'nji",
    3: "'ünji",
    4: "'ünji",
    100: "'ünji",
    6: "'njy",
    9: "'unjy",
    10: "'unjy",
    30: "'unjy",
    60: "'ynjy",
    90: "'ynjy",
};

export default moment.defineLocale('tk', {
    months: 'Ýanwar_Fewral_Mart_Aprel_Maý_Iýun_Iýul_Awgust_Sentýabr_Oktýabr_Noýabr_Dekabr'.split(
        '_'
    ),
    monthsShort: 'Ýan_Few_Mar_Apr_Maý_Iýn_Iýl_Awg_Sen_Okt_Noý_Dek'.split('_'),
    weekdays: 'Ýekşenbe_Duşenbe_Sişenbe_Çarşenbe_Penşenbe_Anna_Şenbe'.split(
        '_'
    ),
    weekdaysShort: 'Ýek_Duş_Siş_Çar_Pen_Ann_Şen'.split('_'),
    weekdaysMin: 'Ýk_Dş_Sş_Çr_Pn_An_Şn'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[bugün sagat] LT',
        nextDay: '[ertir sagat] LT',
        nextWeek: '[indiki] dddd [sagat] LT',
        lastDay: '[düýn] LT',
        lastWeek: '[geçen] dddd [sagat] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s soň',
        past: '%s öň',
        s: 'birnäçe sekunt',
        m: 'bir minut',
        mm: '%d minut',
        h: 'bir sagat',
        hh: '%d sagat',
        d: 'bir gün',
        dd: '%d gün',
        M: 'bir aý',
        MM: '%d aý',
        y: 'bir ýyl',
        yy: '%d ýyl',
    },
    ordinal: function (number, period) {
        switch (period) {
            case 'd':
            case 'D':
            case 'Do':
            case 'DD':
                return number;
            default:
                if (number === 0) {
                    // special case for zero
                    return number + "'unjy";
                }
                var a = number % 10,
                    b = (number % 100) - a,
                    c = number >= 100 ? 100 : null;
                return number + (suffixes[a] || suffixes[b] || suffixes[c]);
        }
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Tagalog (Philippines) [tl-ph]
//! author : Dan Hagman : https://github.com/hagmandan

import moment from '../moment';

export default moment.defineLocale('tl-ph', {
    months: 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split(
        '_'
    ),
    monthsShort: 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),
    weekdays: 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split(
        '_'
    ),
    weekdaysShort: 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'),
    weekdaysMin: 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'MM/D/YYYY',
        LL: 'MMMM D, YYYY',
        LLL: 'MMMM D, YYYY HH:mm',
        LLLL: 'dddd, MMMM DD, YYYY HH:mm',
    },
    calendar: {
        sameDay: 'LT [ngayong araw]',
        nextDay: '[Bukas ng] LT',
        nextWeek: 'LT [sa susunod na] dddd',
        lastDay: 'LT [kahapon]',
        lastWeek: 'LT [noong nakaraang] dddd',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'sa loob ng %s',
        past: '%s ang nakalipas',
        s: 'ilang segundo',
        ss: '%d segundo',
        m: 'isang minuto',
        mm: '%d minuto',
        h: 'isang oras',
        hh: '%d oras',
        d: 'isang araw',
        dd: '%d araw',
        M: 'isang buwan',
        MM: '%d buwan',
        y: 'isang taon',
        yy: '%d taon',
    },
    dayOfMonthOrdinalParse: /\d{1,2}/,
    ordinal: function (number) {
        return number;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Klingon [tlh]
//! author : Dominika Kruk : https://github.com/amaranthrose

import moment from '../moment';

var numbersNouns = 'pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut'.split('_');

function translateFuture(output) {
    var time = output;
    time =
        output.indexOf('jaj') !== -1
            ? time.slice(0, -3) + 'leS'
            : output.indexOf('jar') !== -1
            ? time.slice(0, -3) + 'waQ'
            : output.indexOf('DIS') !== -1
            ? time.slice(0, -3) + 'nem'
            : time + ' pIq';
    return time;
}

function translatePast(output) {
    var time = output;
    time =
        output.indexOf('jaj') !== -1
            ? time.slice(0, -3) + 'Hu’'
            : output.indexOf('jar') !== -1
            ? time.slice(0, -3) + 'wen'
            : output.indexOf('DIS') !== -1
            ? time.slice(0, -3) + 'ben'
            : time + ' ret';
    return time;
}

function translate(number, withoutSuffix, string, isFuture) {
    var numberNoun = numberAsNoun(number);
    switch (string) {
        case 'ss':
            return numberNoun + ' lup';
        case 'mm':
            return numberNoun + ' tup';
        case 'hh':
            return numberNoun + ' rep';
        case 'dd':
            return numberNoun + ' jaj';
        case 'MM':
            return numberNoun + ' jar';
        case 'yy':
            return numberNoun + ' DIS';
    }
}

function numberAsNoun(number) {
    var hundred = Math.floor((number % 1000) / 100),
        ten = Math.floor((number % 100) / 10),
        one = number % 10,
        word = '';
    if (hundred > 0) {
        word += numbersNouns[hundred] + 'vatlh';
    }
    if (ten > 0) {
        word += (word !== '' ? ' ' : '') + numbersNouns[ten] + 'maH';
    }
    if (one > 0) {
        word += (word !== '' ? ' ' : '') + numbersNouns[one];
    }
    return word === '' ? 'pagh' : word;
}

export default moment.defineLocale('tlh', {
    months: 'tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’'.split(
        '_'
    ),
    monthsShort:
        'jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split(
        '_'
    ),
    weekdaysShort:
        'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),
    weekdaysMin:
        'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[DaHjaj] LT',
        nextDay: '[wa’leS] LT',
        nextWeek: 'LLL',
        lastDay: '[wa’Hu’] LT',
        lastWeek: 'LLL',
        sameElse: 'L',
    },
    relativeTime: {
        future: translateFuture,
        past: translatePast,
        s: 'puS lup',
        ss: translate,
        m: 'wa’ tup',
        mm: translate,
        h: 'wa’ rep',
        hh: translate,
        d: 'wa’ jaj',
        dd: translate,
        M: 'wa’ jar',
        MM: translate,
        y: 'wa’ DIS',
        yy: translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Turkish [tr]
//! authors : Erhan Gundogan : https://github.com/erhangundogan,
//!           Burak Yiğit Kaya: https://github.com/BYK

import moment from '../moment';

var suffixes = {
    1: "'inci",
    5: "'inci",
    8: "'inci",
    70: "'inci",
    80: "'inci",
    2: "'nci",
    7: "'nci",
    20: "'nci",
    50: "'nci",
    3: "'üncü",
    4: "'üncü",
    100: "'üncü",
    6: "'ncı",
    9: "'uncu",
    10: "'uncu",
    30: "'uncu",
    60: "'ıncı",
    90: "'ıncı",
};

export default moment.defineLocale('tr', {
    months: 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split(
        '_'
    ),
    monthsShort: 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'),
    weekdays: 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split(
        '_'
    ),
    weekdaysShort: 'Paz_Pzt_Sal_Çar_Per_Cum_Cmt'.split('_'),
    weekdaysMin: 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'),
    meridiem: function (hours, minutes, isLower) {
        if (hours < 12) {
            return isLower ? 'öö' : 'ÖÖ';
        } else {
            return isLower ? 'ös' : 'ÖS';
        }
    },
    meridiemParse: /öö|ÖÖ|ös|ÖS/,
    isPM: function (input) {
        return input === 'ös' || input === 'ÖS';
    },
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[bugün saat] LT',
        nextDay: '[yarın saat] LT',
        nextWeek: '[gelecek] dddd [saat] LT',
        lastDay: '[dün] LT',
        lastWeek: '[geçen] dddd [saat] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s sonra',
        past: '%s önce',
        s: 'birkaç saniye',
        ss: '%d saniye',
        m: 'bir dakika',
        mm: '%d dakika',
        h: 'bir saat',
        hh: '%d saat',
        d: 'bir gün',
        dd: '%d gün',
        w: 'bir hafta',
        ww: '%d hafta',
        M: 'bir ay',
        MM: '%d ay',
        y: 'bir yıl',
        yy: '%d yıl',
    },
    ordinal: function (number, period) {
        switch (period) {
            case 'd':
            case 'D':
            case 'Do':
            case 'DD':
                return number;
            default:
                if (number === 0) {
                    // special case for zero
                    return number + "'ıncı";
                }
                var a = number % 10,
                    b = (number % 100) - a,
                    c = number >= 100 ? 100 : null;
                return number + (suffixes[a] || suffixes[b] || suffixes[c]);
        }
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Talossan [tzl]
//! author : Robin van der Vliet : https://github.com/robin0van0der0v
//! author : Iustì Canun

import moment from '../moment';

// After the year there should be a slash and the amount of years since December 26, 1979 in Roman numerals.
// This is currently too difficult (maybe even impossible) to add.
export default moment.defineLocale('tzl', {
    months: 'Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar'.split(
        '_'
    ),
    monthsShort: 'Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec'.split('_'),
    weekdays: 'Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi'.split('_'),
    weekdaysShort: 'Súl_Lún_Mai_Már_Xhú_Vié_Sát'.split('_'),
    weekdaysMin: 'Sú_Lú_Ma_Má_Xh_Vi_Sá'.split('_'),
    longDateFormat: {
        LT: 'HH.mm',
        LTS: 'HH.mm.ss',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM [dallas] YYYY',
        LLL: 'D. MMMM [dallas] YYYY HH.mm',
        LLLL: 'dddd, [li] D. MMMM [dallas] YYYY HH.mm',
    },
    meridiemParse: /d\'o|d\'a/i,
    isPM: function (input) {
        return "d'o" === input.toLowerCase();
    },
    meridiem: function (hours, minutes, isLower) {
        if (hours > 11) {
            return isLower ? "d'o" : "D'O";
        } else {
            return isLower ? "d'a" : "D'A";
        }
    },
    calendar: {
        sameDay: '[oxhi à] LT',
        nextDay: '[demà à] LT',
        nextWeek: 'dddd [à] LT',
        lastDay: '[ieiri à] LT',
        lastWeek: '[sür el] dddd [lasteu à] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'osprei %s',
        past: 'ja%s',
        s: processRelativeTime,
        ss: processRelativeTime,
        m: processRelativeTime,
        mm: processRelativeTime,
        h: processRelativeTime,
        hh: processRelativeTime,
        d: processRelativeTime,
        dd: processRelativeTime,
        M: processRelativeTime,
        MM: processRelativeTime,
        y: processRelativeTime,
        yy: processRelativeTime,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});

function processRelativeTime(number, withoutSuffix, key, isFuture) {
    var format = {
        s: ['viensas secunds', "'iensas secunds"],
        ss: [number + ' secunds', '' + number + ' secunds'],
        m: ["'n míut", "'iens míut"],
        mm: [number + ' míuts', '' + number + ' míuts'],
        h: ["'n þora", "'iensa þora"],
        hh: [number + ' þoras', '' + number + ' þoras'],
        d: ["'n ziua", "'iensa ziua"],
        dd: [number + ' ziuas', '' + number + ' ziuas'],
        M: ["'n mes", "'iens mes"],
        MM: [number + ' mesen', '' + number + ' mesen'],
        y: ["'n ar", "'iens ar"],
        yy: [number + ' ars', '' + number + ' ars'],
    };
    return isFuture
        ? format[key][0]
        : withoutSuffix
        ? format[key][0]
        : format[key][1];
}
//! moment.js locale configuration
//! locale : Central Atlas Tamazight Latin [tzm-latn]
//! author : Abdel Said : https://github.com/abdelsaid

import moment from '../moment';

export default moment.defineLocale('tzm-latn', {
    months: 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split(
        '_'
    ),
    monthsShort:
        'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split(
            '_'
        ),
    weekdays: 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
    weekdaysShort: 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
    weekdaysMin: 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[asdkh g] LT',
        nextDay: '[aska g] LT',
        nextWeek: 'dddd [g] LT',
        lastDay: '[assant g] LT',
        lastWeek: 'dddd [g] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'dadkh s yan %s',
        past: 'yan %s',
        s: 'imik',
        ss: '%d imik',
        m: 'minuḍ',
        mm: '%d minuḍ',
        h: 'saɛa',
        hh: '%d tassaɛin',
        d: 'ass',
        dd: '%d ossan',
        M: 'ayowr',
        MM: '%d iyyirn',
        y: 'asgas',
        yy: '%d isgasn',
    },
    week: {
        dow: 6, // Saturday is the first day of the week.
        doy: 12, // The week that contains Jan 12th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Central Atlas Tamazight [tzm]
//! author : Abdel Said : https://github.com/abdelsaid

import moment from '../moment';

export default moment.defineLocale('tzm', {
    months: 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split(
        '_'
    ),
    monthsShort:
        'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split(
            '_'
        ),
    weekdays: 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
    weekdaysShort: 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
    weekdaysMin: 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[ⴰⵙⴷⵅ ⴴ] LT',
        nextDay: '[ⴰⵙⴽⴰ ⴴ] LT',
        nextWeek: 'dddd [ⴴ] LT',
        lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT',
        lastWeek: 'dddd [ⴴ] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s',
        past: 'ⵢⴰⵏ %s',
        s: 'ⵉⵎⵉⴽ',
        ss: '%d ⵉⵎⵉⴽ',
        m: 'ⵎⵉⵏⵓⴺ',
        mm: '%d ⵎⵉⵏⵓⴺ',
        h: 'ⵙⴰⵄⴰ',
        hh: '%d ⵜⴰⵙⵙⴰⵄⵉⵏ',
        d: 'ⴰⵙⵙ',
        dd: '%d oⵙⵙⴰⵏ',
        M: 'ⴰⵢoⵓⵔ',
        MM: '%d ⵉⵢⵢⵉⵔⵏ',
        y: 'ⴰⵙⴳⴰⵙ',
        yy: '%d ⵉⵙⴳⴰⵙⵏ',
    },
    week: {
        dow: 6, // Saturday is the first day of the week.
        doy: 12, // The week that contains Jan 12th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Uyghur (China) [ug-cn]
//! author: boyaq : https://github.com/boyaq

import moment from '../moment';

export default moment.defineLocale('ug-cn', {
    months: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split(
        '_'
    ),
    monthsShort:
        'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split(
            '_'
        ),
    weekdays: 'يەكشەنبە_دۈشەنبە_سەيشەنبە_چارشەنبە_پەيشەنبە_جۈمە_شەنبە'.split(
        '_'
    ),
    weekdaysShort: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'),
    weekdaysMin: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'YYYY-MM-DD',
        LL: 'YYYY-يىلىM-ئاينىڭD-كۈنى',
        LLL: 'YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm',
        LLLL: 'dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm',
    },
    meridiemParse: /يېرىم كېچە|سەھەر|چۈشتىن بۇرۇن|چۈش|چۈشتىن كېيىن|كەچ/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (
            meridiem === 'يېرىم كېچە' ||
            meridiem === 'سەھەر' ||
            meridiem === 'چۈشتىن بۇرۇن'
        ) {
            return hour;
        } else if (meridiem === 'چۈشتىن كېيىن' || meridiem === 'كەچ') {
            return hour + 12;
        } else {
            return hour >= 11 ? hour : hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        var hm = hour * 100 + minute;
        if (hm < 600) {
            return 'يېرىم كېچە';
        } else if (hm < 900) {
            return 'سەھەر';
        } else if (hm < 1130) {
            return 'چۈشتىن بۇرۇن';
        } else if (hm < 1230) {
            return 'چۈش';
        } else if (hm < 1800) {
            return 'چۈشتىن كېيىن';
        } else {
            return 'كەچ';
        }
    },
    calendar: {
        sameDay: '[بۈگۈن سائەت] LT',
        nextDay: '[ئەتە سائەت] LT',
        nextWeek: '[كېلەركى] dddd [سائەت] LT',
        lastDay: '[تۆنۈگۈن] LT',
        lastWeek: '[ئالدىنقى] dddd [سائەت] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s كېيىن',
        past: '%s بۇرۇن',
        s: 'نەچچە سېكونت',
        ss: '%d سېكونت',
        m: 'بىر مىنۇت',
        mm: '%d مىنۇت',
        h: 'بىر سائەت',
        hh: '%d سائەت',
        d: 'بىر كۈن',
        dd: '%d كۈن',
        M: 'بىر ئاي',
        MM: '%d ئاي',
        y: 'بىر يىل',
        yy: '%d يىل',
    },

    dayOfMonthOrdinalParse: /\d{1,2}(-كۈنى|-ئاي|-ھەپتە)/,
    ordinal: function (number, period) {
        switch (period) {
            case 'd':
            case 'D':
            case 'DDD':
                return number + '-كۈنى';
            case 'w':
            case 'W':
                return number + '-ھەپتە';
            default:
                return number;
        }
    },
    preparse: function (string) {
        return string.replace(/،/g, ',');
    },
    postformat: function (string) {
        return string.replace(/,/g, '،');
    },
    week: {
        // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 1st is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Ukrainian [uk]
//! author : zemlanin : https://github.com/zemlanin
//! Author : Menelion Elensúle : https://github.com/Oire

import moment from '../moment';

function plural(word, num) {
    var forms = word.split('_');
    return num % 10 === 1 && num % 100 !== 11
        ? forms[0]
        : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20)
        ? forms[1]
        : forms[2];
}
function relativeTimeWithPlural(number, withoutSuffix, key) {
    var format = {
        ss: withoutSuffix ? 'секунда_секунди_секунд' : 'секунду_секунди_секунд',
        mm: withoutSuffix ? 'хвилина_хвилини_хвилин' : 'хвилину_хвилини_хвилин',
        hh: withoutSuffix ? 'година_години_годин' : 'годину_години_годин',
        dd: 'день_дні_днів',
        MM: 'місяць_місяці_місяців',
        yy: 'рік_роки_років',
    };
    if (key === 'm') {
        return withoutSuffix ? 'хвилина' : 'хвилину';
    } else if (key === 'h') {
        return withoutSuffix ? 'година' : 'годину';
    } else {
        return number + ' ' + plural(format[key], +number);
    }
}
function weekdaysCaseReplace(m, format) {
    var weekdays = {
            nominative:
                'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split(
                    '_'
                ),
            accusative:
                'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split(
                    '_'
                ),
            genitive:
                'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split(
                    '_'
                ),
        },
        nounCase;

    if (m === true) {
        return weekdays['nominative']
            .slice(1, 7)
            .concat(weekdays['nominative'].slice(0, 1));
    }
    if (!m) {
        return weekdays['nominative'];
    }

    nounCase = /(\[[ВвУу]\]) ?dddd/.test(format)
        ? 'accusative'
        : /\[?(?:минулої|наступної)? ?\] ?dddd/.test(format)
        ? 'genitive'
        : 'nominative';
    return weekdays[nounCase][m.day()];
}
function processHoursFunction(str) {
    return function () {
        return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT';
    };
}

export default moment.defineLocale('uk', {
    months: {
        format: 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split(
            '_'
        ),
        standalone:
            'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split(
                '_'
            ),
    },
    monthsShort: 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split(
        '_'
    ),
    weekdays: weekdaysCaseReplace,
    weekdaysShort: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
    weekdaysMin: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY р.',
        LLL: 'D MMMM YYYY р., HH:mm',
        LLLL: 'dddd, D MMMM YYYY р., HH:mm',
    },
    calendar: {
        sameDay: processHoursFunction('[Сьогодні '),
        nextDay: processHoursFunction('[Завтра '),
        lastDay: processHoursFunction('[Вчора '),
        nextWeek: processHoursFunction('[У] dddd ['),
        lastWeek: function () {
            switch (this.day()) {
                case 0:
                case 3:
                case 5:
                case 6:
                    return processHoursFunction('[Минулої] dddd [').call(this);
                case 1:
                case 2:
                case 4:
                    return processHoursFunction('[Минулого] dddd [').call(this);
            }
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'за %s',
        past: '%s тому',
        s: 'декілька секунд',
        ss: relativeTimeWithPlural,
        m: relativeTimeWithPlural,
        mm: relativeTimeWithPlural,
        h: 'годину',
        hh: relativeTimeWithPlural,
        d: 'день',
        dd: relativeTimeWithPlural,
        M: 'місяць',
        MM: relativeTimeWithPlural,
        y: 'рік',
        yy: relativeTimeWithPlural,
    },
    // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
    meridiemParse: /ночі|ранку|дня|вечора/,
    isPM: function (input) {
        return /^(дня|вечора)$/.test(input);
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'ночі';
        } else if (hour < 12) {
            return 'ранку';
        } else if (hour < 17) {
            return 'дня';
        } else {
            return 'вечора';
        }
    },
    dayOfMonthOrdinalParse: /\d{1,2}-(й|го)/,
    ordinal: function (number, period) {
        switch (period) {
            case 'M':
            case 'd':
            case 'DDD':
            case 'w':
            case 'W':
                return number + '-й';
            case 'D':
                return number + '-го';
            default:
                return number;
        }
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Urdu [ur]
//! author : Sawood Alam : https://github.com/ibnesayeed
//! author : Zack : https://github.com/ZackVision

import moment from '../moment';

var months = [
        'جنوری',
        'فروری',
        'مارچ',
        'اپریل',
        'مئی',
        'جون',
        'جولائی',
        'اگست',
        'ستمبر',
        'اکتوبر',
        'نومبر',
        'دسمبر',
    ],
    days = ['اتوار', 'پیر', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'ہفتہ'];

export default moment.defineLocale('ur', {
    months: months,
    monthsShort: months,
    weekdays: days,
    weekdaysShort: days,
    weekdaysMin: days,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd، D MMMM YYYY HH:mm',
    },
    meridiemParse: /صبح|شام/,
    isPM: function (input) {
        return 'شام' === input;
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return 'صبح';
        }
        return 'شام';
    },
    calendar: {
        sameDay: '[آج بوقت] LT',
        nextDay: '[کل بوقت] LT',
        nextWeek: 'dddd [بوقت] LT',
        lastDay: '[گذشتہ روز بوقت] LT',
        lastWeek: '[گذشتہ] dddd [بوقت] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s بعد',
        past: '%s قبل',
        s: 'چند سیکنڈ',
        ss: '%d سیکنڈ',
        m: 'ایک منٹ',
        mm: '%d منٹ',
        h: 'ایک گھنٹہ',
        hh: '%d گھنٹے',
        d: 'ایک دن',
        dd: '%d دن',
        M: 'ایک ماہ',
        MM: '%d ماہ',
        y: 'ایک سال',
        yy: '%d سال',
    },
    preparse: function (string) {
        return string.replace(/،/g, ',');
    },
    postformat: function (string) {
        return string.replace(/,/g, '،');
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Uzbek Latin [uz-latn]
//! author : Rasulbek Mirzayev : github.com/Rasulbeeek

import moment from '../moment';

export default moment.defineLocale('uz-latn', {
    months: 'Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr'.split(
        '_'
    ),
    monthsShort: 'Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek'.split('_'),
    weekdays:
        'Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba'.split(
            '_'
        ),
    weekdaysShort: 'Yak_Dush_Sesh_Chor_Pay_Jum_Shan'.split('_'),
    weekdaysMin: 'Ya_Du_Se_Cho_Pa_Ju_Sha'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'D MMMM YYYY, dddd HH:mm',
    },
    calendar: {
        sameDay: '[Bugun soat] LT [da]',
        nextDay: '[Ertaga] LT [da]',
        nextWeek: 'dddd [kuni soat] LT [da]',
        lastDay: '[Kecha soat] LT [da]',
        lastWeek: "[O'tgan] dddd [kuni soat] LT [da]",
        sameElse: 'L',
    },
    relativeTime: {
        future: 'Yaqin %s ichida',
        past: 'Bir necha %s oldin',
        s: 'soniya',
        ss: '%d soniya',
        m: 'bir daqiqa',
        mm: '%d daqiqa',
        h: 'bir soat',
        hh: '%d soat',
        d: 'bir kun',
        dd: '%d kun',
        M: 'bir oy',
        MM: '%d oy',
        y: 'bir yil',
        yy: '%d yil',
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Uzbek [uz]
//! author : Sardor Muminov : https://github.com/muminoff

import moment from '../moment';

export default moment.defineLocale('uz', {
    months: 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split(
        '_'
    ),
    monthsShort: 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),
    weekdays: 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'),
    weekdaysShort: 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'),
    weekdaysMin: 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'D MMMM YYYY, dddd HH:mm',
    },
    calendar: {
        sameDay: '[Бугун соат] LT [да]',
        nextDay: '[Эртага] LT [да]',
        nextWeek: 'dddd [куни соат] LT [да]',
        lastDay: '[Кеча соат] LT [да]',
        lastWeek: '[Утган] dddd [куни соат] LT [да]',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'Якин %s ичида',
        past: 'Бир неча %s олдин',
        s: 'фурсат',
        ss: '%d фурсат',
        m: 'бир дакика',
        mm: '%d дакика',
        h: 'бир соат',
        hh: '%d соат',
        d: 'бир кун',
        dd: '%d кун',
        M: 'бир ой',
        MM: '%d ой',
        y: 'бир йил',
        yy: '%d йил',
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Vietnamese [vi]
//! author : Bang Nguyen : https://github.com/bangnk
//! author : Chien Kira : https://github.com/chienkira

import moment from '../moment';

export default moment.defineLocale('vi', {
    months: 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split(
        '_'
    ),
    monthsShort:
        'Thg 01_Thg 02_Thg 03_Thg 04_Thg 05_Thg 06_Thg 07_Thg 08_Thg 09_Thg 10_Thg 11_Thg 12'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split(
        '_'
    ),
    weekdaysShort: 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
    weekdaysMin: 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
    weekdaysParseExact: true,
    meridiemParse: /sa|ch/i,
    isPM: function (input) {
        return /^ch$/i.test(input);
    },
    meridiem: function (hours, minutes, isLower) {
        if (hours < 12) {
            return isLower ? 'sa' : 'SA';
        } else {
            return isLower ? 'ch' : 'CH';
        }
    },
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM [năm] YYYY',
        LLL: 'D MMMM [năm] YYYY HH:mm',
        LLLL: 'dddd, D MMMM [năm] YYYY HH:mm',
        l: 'DD/M/YYYY',
        ll: 'D MMM YYYY',
        lll: 'D MMM YYYY HH:mm',
        llll: 'ddd, D MMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Hôm nay lúc] LT',
        nextDay: '[Ngày mai lúc] LT',
        nextWeek: 'dddd [tuần tới lúc] LT',
        lastDay: '[Hôm qua lúc] LT',
        lastWeek: 'dddd [tuần trước lúc] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s tới',
        past: '%s trước',
        s: 'vài giây',
        ss: '%d giây',
        m: 'một phút',
        mm: '%d phút',
        h: 'một giờ',
        hh: '%d giờ',
        d: 'một ngày',
        dd: '%d ngày',
        w: 'một tuần',
        ww: '%d tuần',
        M: 'một tháng',
        MM: '%d tháng',
        y: 'một năm',
        yy: '%d năm',
    },
    dayOfMonthOrdinalParse: /\d{1,2}/,
    ordinal: function (number) {
        return number;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Pseudo [x-pseudo]
//! author : Andrew Hood : https://github.com/andrewhood125

import moment from '../moment';

export default moment.defineLocale('x-pseudo', {
    months: 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split(
        '_'
    ),
    monthsShort:
        'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays:
        'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split(
            '_'
        ),
    weekdaysShort: 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'),
    weekdaysMin: 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[T~ódá~ý át] LT',
        nextDay: '[T~ómó~rró~w át] LT',
        nextWeek: 'dddd [át] LT',
        lastDay: '[Ý~ést~érdá~ý át] LT',
        lastWeek: '[L~ást] dddd [át] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'í~ñ %s',
        past: '%s á~gó',
        s: 'á ~féw ~sécó~ñds',
        ss: '%d s~écóñ~ds',
        m: 'á ~míñ~úté',
        mm: '%d m~íñú~tés',
        h: 'á~ñ hó~úr',
        hh: '%d h~óúrs',
        d: 'á ~dáý',
        dd: '%d d~áýs',
        M: 'á ~móñ~th',
        MM: '%d m~óñt~hs',
        y: 'á ~ýéár',
        yy: '%d ý~éárs',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/,
    ordinal: function (number) {
        var b = number % 10,
            output =
                ~~((number % 100) / 10) === 1
                    ? 'th'
                    : b === 1
                    ? 'st'
                    : b === 2
                    ? 'nd'
                    : b === 3
                    ? 'rd'
                    : 'th';
        return number + output;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Yoruba Nigeria [yo]
//! author : Atolagbe Abisoye : https://github.com/andela-batolagbe

import moment from '../moment';

export default moment.defineLocale('yo', {
    months: 'Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀'.split(
        '_'
    ),
    monthsShort: 'Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀'.split('_'),
    weekdays: 'Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta'.split('_'),
    weekdaysShort: 'Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá'.split('_'),
    weekdaysMin: 'Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb'.split('_'),
    longDateFormat: {
        LT: 'h:mm A',
        LTS: 'h:mm:ss A',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY h:mm A',
        LLLL: 'dddd, D MMMM YYYY h:mm A',
    },
    calendar: {
        sameDay: '[Ònì ni] LT',
        nextDay: '[Ọ̀la ni] LT',
        nextWeek: "dddd [Ọsẹ̀ tón'bọ] [ni] LT",
        lastDay: '[Àna ni] LT',
        lastWeek: 'dddd [Ọsẹ̀ tólọ́] [ni] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'ní %s',
        past: '%s kọjá',
        s: 'ìsẹjú aayá die',
        ss: 'aayá %d',
        m: 'ìsẹjú kan',
        mm: 'ìsẹjú %d',
        h: 'wákati kan',
        hh: 'wákati %d',
        d: 'ọjọ́ kan',
        dd: 'ọjọ́ %d',
        M: 'osù kan',
        MM: 'osù %d',
        y: 'ọdún kan',
        yy: 'ọdún %d',
    },
    dayOfMonthOrdinalParse: /ọjọ́\s\d{1,2}/,
    ordinal: 'ọjọ́ %d',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Chinese (China) [zh-cn]
//! author : suupic : https://github.com/suupic
//! author : Zeno Zeng : https://github.com/zenozeng
//! author : uu109 : https://github.com/uu109

import moment from '../moment';

export default moment.defineLocale('zh-cn', {
    months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(
        '_'
    ),
    monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(
        '_'
    ),
    weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
    weekdaysShort: '周日_周一_周二_周三_周四_周五_周六'.split('_'),
    weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'YYYY/MM/DD',
        LL: 'YYYY年M月D日',
        LLL: 'YYYY年M月D日Ah点mm分',
        LLLL: 'YYYY年M月D日ddddAh点mm分',
        l: 'YYYY/M/D',
        ll: 'YYYY年M月D日',
        lll: 'YYYY年M月D日 HH:mm',
        llll: 'YYYY年M月D日dddd HH:mm',
    },
    meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
            return hour;
        } else if (meridiem === '下午' || meridiem === '晚上') {
            return hour + 12;
        } else {
            // '中午'
            return hour >= 11 ? hour : hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        var hm = hour * 100 + minute;
        if (hm < 600) {
            return '凌晨';
        } else if (hm < 900) {
            return '早上';
        } else if (hm < 1130) {
            return '上午';
        } else if (hm < 1230) {
            return '中午';
        } else if (hm < 1800) {
            return '下午';
        } else {
            return '晚上';
        }
    },
    calendar: {
        sameDay: '[今天]LT',
        nextDay: '[明天]LT',
        nextWeek: function (now) {
            if (now.week() !== this.week()) {
                return '[下]dddLT';
            } else {
                return '[本]dddLT';
            }
        },
        lastDay: '[昨天]LT',
        lastWeek: function (now) {
            if (this.week() !== now.week()) {
                return '[上]dddLT';
            } else {
                return '[本]dddLT';
            }
        },
        sameElse: 'L',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(日|月|周)/,
    ordinal: function (number, period) {
        switch (period) {
            case 'd':
            case 'D':
            case 'DDD':
                return number + '日';
            case 'M':
                return number + '月';
            case 'w':
            case 'W':
                return number + '周';
            default:
                return number;
        }
    },
    relativeTime: {
        future: '%s后',
        past: '%s前',
        s: '几秒',
        ss: '%d 秒',
        m: '1 分钟',
        mm: '%d 分钟',
        h: '1 小时',
        hh: '%d 小时',
        d: '1 天',
        dd: '%d 天',
        w: '1 周',
        ww: '%d 周',
        M: '1 个月',
        MM: '%d 个月',
        y: '1 年',
        yy: '%d 年',
    },
    week: {
        // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Chinese (Hong Kong) [zh-hk]
//! author : Ben : https://github.com/ben-lin
//! author : Chris Lam : https://github.com/hehachris
//! author : Konstantin : https://github.com/skfd
//! author : Anthony : https://github.com/anthonylau

import moment from '../moment';

export default moment.defineLocale('zh-hk', {
    months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(
        '_'
    ),
    monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(
        '_'
    ),
    weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
    weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),
    weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'YYYY/MM/DD',
        LL: 'YYYY年M月D日',
        LLL: 'YYYY年M月D日 HH:mm',
        LLLL: 'YYYY年M月D日dddd HH:mm',
        l: 'YYYY/M/D',
        ll: 'YYYY年M月D日',
        lll: 'YYYY年M月D日 HH:mm',
        llll: 'YYYY年M月D日dddd HH:mm',
    },
    meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
            return hour;
        } else if (meridiem === '中午') {
            return hour >= 11 ? hour : hour + 12;
        } else if (meridiem === '下午' || meridiem === '晚上') {
            return hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        var hm = hour * 100 + minute;
        if (hm < 600) {
            return '凌晨';
        } else if (hm < 900) {
            return '早上';
        } else if (hm < 1200) {
            return '上午';
        } else if (hm === 1200) {
            return '中午';
        } else if (hm < 1800) {
            return '下午';
        } else {
            return '晚上';
        }
    },
    calendar: {
        sameDay: '[今天]LT',
        nextDay: '[明天]LT',
        nextWeek: '[下]ddddLT',
        lastDay: '[昨天]LT',
        lastWeek: '[上]ddddLT',
        sameElse: 'L',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/,
    ordinal: function (number, period) {
        switch (period) {
            case 'd':
            case 'D':
            case 'DDD':
                return number + '日';
            case 'M':
                return number + '月';
            case 'w':
            case 'W':
                return number + '週';
            default:
                return number;
        }
    },
    relativeTime: {
        future: '%s後',
        past: '%s前',
        s: '幾秒',
        ss: '%d 秒',
        m: '1 分鐘',
        mm: '%d 分鐘',
        h: '1 小時',
        hh: '%d 小時',
        d: '1 天',
        dd: '%d 天',
        M: '1 個月',
        MM: '%d 個月',
        y: '1 年',
        yy: '%d 年',
    },
});
//! moment.js locale configuration
//! locale : Chinese (Macau) [zh-mo]
//! author : Ben : https://github.com/ben-lin
//! author : Chris Lam : https://github.com/hehachris
//! author : Tan Yuanhong : https://github.com/le0tan

import moment from '../moment';

export default moment.defineLocale('zh-mo', {
    months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(
        '_'
    ),
    monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(
        '_'
    ),
    weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
    weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),
    weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'YYYY年M月D日',
        LLL: 'YYYY年M月D日 HH:mm',
        LLLL: 'YYYY年M月D日dddd HH:mm',
        l: 'D/M/YYYY',
        ll: 'YYYY年M月D日',
        lll: 'YYYY年M月D日 HH:mm',
        llll: 'YYYY年M月D日dddd HH:mm',
    },
    meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
            return hour;
        } else if (meridiem === '中午') {
            return hour >= 11 ? hour : hour + 12;
        } else if (meridiem === '下午' || meridiem === '晚上') {
            return hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        var hm = hour * 100 + minute;
        if (hm < 600) {
            return '凌晨';
        } else if (hm < 900) {
            return '早上';
        } else if (hm < 1130) {
            return '上午';
        } else if (hm < 1230) {
            return '中午';
        } else if (hm < 1800) {
            return '下午';
        } else {
            return '晚上';
        }
    },
    calendar: {
        sameDay: '[今天] LT',
        nextDay: '[明天] LT',
        nextWeek: '[下]dddd LT',
        lastDay: '[昨天] LT',
        lastWeek: '[上]dddd LT',
        sameElse: 'L',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/,
    ordinal: function (number, period) {
        switch (period) {
            case 'd':
            case 'D':
            case 'DDD':
                return number + '日';
            case 'M':
                return number + '月';
            case 'w':
            case 'W':
                return number + '週';
            default:
                return number;
        }
    },
    relativeTime: {
        future: '%s內',
        past: '%s前',
        s: '幾秒',
        ss: '%d 秒',
        m: '1 分鐘',
        mm: '%d 分鐘',
        h: '1 小時',
        hh: '%d 小時',
        d: '1 天',
        dd: '%d 天',
        M: '1 個月',
        MM: '%d 個月',
        y: '1 年',
        yy: '%d 年',
    },
});
//! moment.js locale configuration
//! locale : Chinese (Taiwan) [zh-tw]
//! author : Ben : https://github.com/ben-lin
//! author : Chris Lam : https://github.com/hehachris

import moment from '../moment';

export default moment.defineLocale('zh-tw', {
    months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(
        '_'
    ),
    monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(
        '_'
    ),
    weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
    weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),
    weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'YYYY/MM/DD',
        LL: 'YYYY年M月D日',
        LLL: 'YYYY年M月D日 HH:mm',
        LLLL: 'YYYY年M月D日dddd HH:mm',
        l: 'YYYY/M/D',
        ll: 'YYYY年M月D日',
        lll: 'YYYY年M月D日 HH:mm',
        llll: 'YYYY年M月D日dddd HH:mm',
    },
    meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
            return hour;
        } else if (meridiem === '中午') {
            return hour >= 11 ? hour : hour + 12;
        } else if (meridiem === '下午' || meridiem === '晚上') {
            return hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        var hm = hour * 100 + minute;
        if (hm < 600) {
            return '凌晨';
        } else if (hm < 900) {
            return '早上';
        } else if (hm < 1130) {
            return '上午';
        } else if (hm < 1230) {
            return '中午';
        } else if (hm < 1800) {
            return '下午';
        } else {
            return '晚上';
        }
    },
    calendar: {
        sameDay: '[今天] LT',
        nextDay: '[明天] LT',
        nextWeek: '[下]dddd LT',
        lastDay: '[昨天] LT',
        lastWeek: '[上]dddd LT',
        sameElse: 'L',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/,
    ordinal: function (number, period) {
        switch (period) {
            case 'd':
            case 'D':
            case 'DDD':
                return number + '日';
            case 'M':
                return number + '月';
            case 'w':
            case 'W':
                return number + '週';
            default:
                return number;
        }
    },
    relativeTime: {
        future: '%s後',
        past: '%s前',
        s: '幾秒',
        ss: '%d 秒',
        m: '1 分鐘',
        mm: '%d 分鐘',
        h: '1 小時',
        hh: '%d 小時',
        d: '1 天',
        dd: '%d 天',
        M: '1 個月',
        MM: '%d 個月',
        y: '1 年',
        yy: '%d 年',
    },
});
export default function absCeil(number) {
    if (number < 0) {
        return Math.floor(number);
    } else {
        return Math.ceil(number);
    }
}
export default function absFloor(number) {
    if (number < 0) {
        // -0 -> 0
        return Math.ceil(number) || 0;
    } else {
        return Math.floor(number);
    }
}
export default function absRound(number) {
    if (number < 0) {
        return Math.round(-1 * number) * -1;
    } else {
        return Math.round(number);
    }
}
import toInt from './to-int';

// compare two arrays, return the number of differences
export default function compareArrays(array1, array2, dontConvert) {
    var len = Math.min(array1.length, array2.length),
        lengthDiff = Math.abs(array1.length - array2.length),
        diffs = 0,
        i;
    for (i = 0; i < len; i++) {
        if (
            (dontConvert && array1[i] !== array2[i]) ||
            (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))
        ) {
            diffs++;
        }
    }
    return diffs + lengthDiff;
}
// Pick the first defined of two or three arguments.
export default function defaults(a, b, c) {
    if (a != null) {
        return a;
    }
    if (b != null) {
        return b;
    }
    return c;
}
import extend from './extend';
import { hooks } from './hooks';
import hasOwnProp from './has-own-prop';

function warn(msg) {
    if (
        hooks.suppressDeprecationWarnings === false &&
        typeof console !== 'undefined' &&
        console.warn
    ) {
        console.warn('Deprecation warning: ' + msg);
    }
}

export function deprecate(msg, fn) {
    var firstTime = true;

    return extend(function () {
        if (hooks.deprecationHandler != null) {
            hooks.deprecationHandler(null, msg);
        }
        if (firstTime) {
            var args = [],
                arg,
                i,
                key,
                argLen = arguments.length;
            for (i = 0; i < argLen; i++) {
                arg = '';
                if (typeof arguments[i] === 'object') {
                    arg += '\n[' + i + '] ';
                    for (key in arguments[0]) {
                        if (hasOwnProp(arguments[0], key)) {
                            arg += key + ': ' + arguments[0][key] + ', ';
                        }
                    }
                    arg = arg.slice(0, -2); // Remove trailing comma and space
                } else {
                    arg = arguments[i];
                }
                args.push(arg);
            }
            warn(
                msg +
                    '\nArguments: ' +
                    Array.prototype.slice.call(args).join('') +
                    '\n' +
                    new Error().stack
            );
            firstTime = false;
        }
        return fn.apply(this, arguments);
    }, fn);
}

var deprecations = {};

export function deprecateSimple(name, msg) {
    if (hooks.deprecationHandler != null) {
        hooks.deprecationHandler(name, msg);
    }
    if (!deprecations[name]) {
        warn(msg);
        deprecations[name] = true;
    }
}

hooks.suppressDeprecationWarnings = false;
hooks.deprecationHandler = null;
import hasOwnProp from './has-own-prop';

export default function extend(a, b) {
    for (var i in b) {
        if (hasOwnProp(b, i)) {
            a[i] = b[i];
        }
    }

    if (hasOwnProp(b, 'toString')) {
        a.toString = b.toString;
    }

    if (hasOwnProp(b, 'valueOf')) {
        a.valueOf = b.valueOf;
    }

    return a;
}
export default function hasOwnProp(a, b) {
    return Object.prototype.hasOwnProperty.call(a, b);
}
export { hooks, setHookCallback };

var hookCallback;

function hooks() {
    return hookCallback.apply(null, arguments);
}

// This is done to register the method called with moment()
// without creating circular dependencies.
function setHookCallback(callback) {
    hookCallback = callback;
}
var indexOf;

if (Array.prototype.indexOf) {
    indexOf = Array.prototype.indexOf;
} else {
    indexOf = function (o) {
        // I know
        var i;
        for (i = 0; i < this.length; ++i) {
            if (this[i] === o) {
                return i;
            }
        }
        return -1;
    };
}

export { indexOf as default };
export default function isArray(input) {
    return (
        input instanceof Array ||
        Object.prototype.toString.call(input) === '[object Array]'
    );
}
import isObjectEmpty from './is-object-empty';
import hasOwnProp from './has-own-prop';
import isObject from './is-object';

export default function isCalendarSpec(input) {
    var objectTest = isObject(input) && !isObjectEmpty(input),
        propertyTest = false,
        properties = [
            'sameDay',
            'nextDay',
            'lastDay',
            'nextWeek',
            'lastWeek',
            'sameElse',
        ],
        i,
        property;

    for (i = 0; i < properties.length; i += 1) {
        property = properties[i];
        propertyTest = propertyTest || hasOwnProp(input, property);
    }

    return objectTest && propertyTest;
}
export default function isDate(input) {
    return (
        input instanceof Date ||
        Object.prototype.toString.call(input) === '[object Date]'
    );
}
export default function isFunction(input) {
    return (
        (typeof Function !== 'undefined' && input instanceof Function) ||
        Object.prototype.toString.call(input) === '[object Function]'
    );
}
export function isLeapYear(year) {
    return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
}
import isObjectEmpty from './is-object-empty';
import hasOwnProp from './has-own-prop';
import isObject from './is-object';
import isDate from './is-date';
import isNumber from './is-number';
import isString from './is-string';
import { isMoment } from '../moment/constructor';
import isArray from './is-array';

// type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined
export function isMomentInput(input) {
    return (
        isMoment(input) ||
        isDate(input) ||
        isString(input) ||
        isNumber(input) ||
        isNumberOrStringArray(input) ||
        isMomentInputObject(input) ||
        input === null ||
        input === undefined
    );
}

export function isMomentInputObject(input) {
    var objectTest = isObject(input) && !isObjectEmpty(input),
        propertyTest = false,
        properties = [
            'years',
            'year',
            'y',
            'months',
            'month',
            'M',
            'days',
            'day',
            'd',
            'dates',
            'date',
            'D',
            'hours',
            'hour',
            'h',
            'minutes',
            'minute',
            'm',
            'seconds',
            'second',
            's',
            'milliseconds',
            'millisecond',
            'ms',
        ],
        i,
        property,
        propertyLen = properties.length;

    for (i = 0; i < propertyLen; i += 1) {
        property = properties[i];
        propertyTest = propertyTest || hasOwnProp(input, property);
    }

    return objectTest && propertyTest;
}

function isNumberOrStringArray(input) {
    var arrayTest = isArray(input),
        dataTypeTest = false;
    if (arrayTest) {
        dataTypeTest =
            input.filter(function (item) {
                return !isNumber(item) && isString(input);
            }).length === 0;
    }
    return arrayTest && dataTypeTest;
}
export default function isNumber(input) {
    return (
        typeof input === 'number' ||
        Object.prototype.toString.call(input) === '[object Number]'
    );
}
import hasOwnProp from './has-own-prop';

export default function isObjectEmpty(obj) {
    if (Object.getOwnPropertyNames) {
        return Object.getOwnPropertyNames(obj).length === 0;
    } else {
        var k;
        for (k in obj) {
            if (hasOwnProp(obj, k)) {
                return false;
            }
        }
        return true;
    }
}
export default function isObject(input) {
    // IE8 will treat undefined and null as object if it wasn't for
    // input != null
    return (
        input != null &&
        Object.prototype.toString.call(input) === '[object Object]'
    );
}
export default function isString(input) {
    return typeof input === 'string' || input instanceof String;
}
export default function isUndefined(input) {
    return input === void 0;
}
import hasOwnProp from './has-own-prop';

var keys;

if (Object.keys) {
    keys = Object.keys;
} else {
    keys = function (obj) {
        var i,
            res = [];
        for (i in obj) {
            if (hasOwnProp(obj, i)) {
                res.push(i);
            }
        }
        return res;
    };
}

export { keys as default };
export default function map(arr, fn) {
    var res = [],
        i,
        arrLen = arr.length;
    for (i = 0; i < arrLen; ++i) {
        res.push(fn(arr[i], i));
    }
    return res;
}
export default function mod(n, x) {
    return ((n % x) + x) % x;
}
var some;
if (Array.prototype.some) {
    some = Array.prototype.some;
} else {
    some = function (fun) {
        var t = Object(this),
            len = t.length >>> 0,
            i;

        for (i = 0; i < len; i++) {
            if (i in t && fun.call(this, t[i], i, t)) {
                return true;
            }
        }

        return false;
    };
}

export { some as default };
import absFloor from './abs-floor';

export default function toInt(argumentForCoercion) {
    var coercedNumber = +argumentForCoercion,
        value = 0;

    if (coercedNumber !== 0 && isFinite(coercedNumber)) {
        value = absFloor(coercedNumber);
    }

    return value;
}
export default function zeroFill(number, targetLength, forceSign) {
    var absNumber = '' + Math.abs(number),
        zerosToFill = targetLength - absNumber.length,
        sign = number >= 0;
    return (
        (sign ? (forceSign ? '+' : '') : '-') +
        Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) +
        absNumber
    );
}
import hasOwnProp from '../utils/has-own-prop';

var aliases = {};

export function addUnitAlias(unit, shorthand) {
    var lowerCase = unit.toLowerCase();
    aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;
}

export function normalizeUnits(units) {
    return typeof units === 'string'
        ? aliases[units] || aliases[units.toLowerCase()]
        : undefined;
}

export function normalizeObjectUnits(inputObject) {
    var normalizedInput = {},
        normalizedProp,
        prop;

    for (prop in inputObject) {
        if (hasOwnProp(inputObject, prop)) {
            normalizedProp = normalizeUnits(prop);
            if (normalizedProp) {
                normalizedInput[normalizedProp] = inputObject[prop];
            }
        }
    }

    return normalizedInput;
}
export var YEAR = 0,
    MONTH = 1,
    DATE = 2,
    HOUR = 3,
    MINUTE = 4,
    SECOND = 5,
    MILLISECOND = 6,
    WEEK = 7,
    WEEKDAY = 8;
import { makeGetSet } from '../moment/get-set';
import { addFormatToken } from '../format/format';
import { addUnitAlias } from './aliases';
import { addUnitPriority } from './priorities';
import { addRegexToken, match1to2, match2 } from '../parse/regex';
import { addParseToken } from '../parse/token';
import { DATE } from './constants';
import toInt from '../utils/to-int';

// FORMATTING

addFormatToken('D', ['DD', 2], 'Do', 'date');

// ALIASES

addUnitAlias('date', 'D');

// PRIORITY
addUnitPriority('date', 9);

// PARSING

addRegexToken('D', match1to2);
addRegexToken('DD', match1to2, match2);
addRegexToken('Do', function (isStrict, locale) {
    // TODO: Remove "ordinalParse" fallback in next major release.
    return isStrict
        ? locale._dayOfMonthOrdinalParse || locale._ordinalParse
        : locale._dayOfMonthOrdinalParseLenient;
});

addParseToken(['D', 'DD'], DATE);
addParseToken('Do', function (input, array) {
    array[DATE] = toInt(input.match(match1to2)[0]);
});

// MOMENTS

export var getSetDayOfMonth = makeGetSet('Date', true);
import { addFormatToken } from '../format/format';
import { addUnitAlias } from './aliases';
import { addUnitPriority } from './priorities';
import {
    addRegexToken,
    match1to2,
    matchWord,
    regexEscape,
} from '../parse/regex';
import { addWeekParseToken } from '../parse/token';
import toInt from '../utils/to-int';
import isArray from '../utils/is-array';
import indexOf from '../utils/index-of';
import hasOwnProp from '../utils/has-own-prop';
import { createUTC } from '../create/utc';
import getParsingFlags from '../create/parsing-flags';

// FORMATTING

addFormatToken('d', 0, 'do', 'day');

addFormatToken('dd', 0, 0, function (format) {
    return this.localeData().weekdaysMin(this, format);
});

addFormatToken('ddd', 0, 0, function (format) {
    return this.localeData().weekdaysShort(this, format);
});

addFormatToken('dddd', 0, 0, function (format) {
    return this.localeData().weekdays(this, format);
});

addFormatToken('e', 0, 0, 'weekday');
addFormatToken('E', 0, 0, 'isoWeekday');

// ALIASES

addUnitAlias('day', 'd');
addUnitAlias('weekday', 'e');
addUnitAlias('isoWeekday', 'E');

// PRIORITY
addUnitPriority('day', 11);
addUnitPriority('weekday', 11);
addUnitPriority('isoWeekday', 11);

// PARSING

addRegexToken('d', match1to2);
addRegexToken('e', match1to2);
addRegexToken('E', match1to2);
addRegexToken('dd', function (isStrict, locale) {
    return locale.weekdaysMinRegex(isStrict);
});
addRegexToken('ddd', function (isStrict, locale) {
    return locale.weekdaysShortRegex(isStrict);
});
addRegexToken('dddd', function (isStrict, locale) {
    return locale.weekdaysRegex(isStrict);
});

addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {
    var weekday = config._locale.weekdaysParse(input, token, config._strict);
    // if we didn't get a weekday name, mark the date as invalid
    if (weekday != null) {
        week.d = weekday;
    } else {
        getParsingFlags(config).invalidWeekday = input;
    }
});

addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
    week[token] = toInt(input);
});

// HELPERS

function parseWeekday(input, locale) {
    if (typeof input !== 'string') {
        return input;
    }

    if (!isNaN(input)) {
        return parseInt(input, 10);
    }

    input = locale.weekdaysParse(input);
    if (typeof input === 'number') {
        return input;
    }

    return null;
}

function parseIsoWeekday(input, locale) {
    if (typeof input === 'string') {
        return locale.weekdaysParse(input) % 7 || 7;
    }
    return isNaN(input) ? null : input;
}

// LOCALES
function shiftWeekdays(ws, n) {
    return ws.slice(n, 7).concat(ws.slice(0, n));
}

var defaultLocaleWeekdays =
        'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
    defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
    defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
    defaultWeekdaysRegex = matchWord,
    defaultWeekdaysShortRegex = matchWord,
    defaultWeekdaysMinRegex = matchWord;

export {
    defaultLocaleWeekdays,
    defaultLocaleWeekdaysShort,
    defaultLocaleWeekdaysMin,
};

export function localeWeekdays(m, format) {
    var weekdays = isArray(this._weekdays)
        ? this._weekdays
        : this._weekdays[
              m && m !== true && this._weekdays.isFormat.test(format)
                  ? 'format'
                  : 'standalone'
          ];
    return m === true
        ? shiftWeekdays(weekdays, this._week.dow)
        : m
        ? weekdays[m.day()]
        : weekdays;
}

export function localeWeekdaysShort(m) {
    return m === true
        ? shiftWeekdays(this._weekdaysShort, this._week.dow)
        : m
        ? this._weekdaysShort[m.day()]
        : this._weekdaysShort;
}

export function localeWeekdaysMin(m) {
    return m === true
        ? shiftWeekdays(this._weekdaysMin, this._week.dow)
        : m
        ? this._weekdaysMin[m.day()]
        : this._weekdaysMin;
}

function handleStrictParse(weekdayName, format, strict) {
    var i,
        ii,
        mom,
        llc = weekdayName.toLocaleLowerCase();
    if (!this._weekdaysParse) {
        this._weekdaysParse = [];
        this._shortWeekdaysParse = [];
        this._minWeekdaysParse = [];

        for (i = 0; i < 7; ++i) {
            mom = createUTC([2000, 1]).day(i);
            this._minWeekdaysParse[i] = this.weekdaysMin(
                mom,
                ''
            ).toLocaleLowerCase();
            this._shortWeekdaysParse[i] = this.weekdaysShort(
                mom,
                ''
            ).toLocaleLowerCase();
            this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();
        }
    }

    if (strict) {
        if (format === 'dddd') {
            ii = indexOf.call(this._weekdaysParse, llc);
            return ii !== -1 ? ii : null;
        } else if (format === 'ddd') {
            ii = indexOf.call(this._shortWeekdaysParse, llc);
            return ii !== -1 ? ii : null;
        } else {
            ii = indexOf.call(this._minWeekdaysParse, llc);
            return ii !== -1 ? ii : null;
        }
    } else {
        if (format === 'dddd') {
            ii = indexOf.call(this._weekdaysParse, llc);
            if (ii !== -1) {
                return ii;
            }
            ii = indexOf.call(this._shortWeekdaysParse, llc);
            if (ii !== -1) {
                return ii;
            }
            ii = indexOf.call(this._minWeekdaysParse, llc);
            return ii !== -1 ? ii : null;
        } else if (format === 'ddd') {
            ii = indexOf.call(this._shortWeekdaysParse, llc);
            if (ii !== -1) {
                return ii;
            }
            ii = indexOf.call(this._weekdaysParse, llc);
            if (ii !== -1) {
                return ii;
            }
            ii = indexOf.call(this._minWeekdaysParse, llc);
            return ii !== -1 ? ii : null;
        } else {
            ii = indexOf.call(this._minWeekdaysParse, llc);
            if (ii !== -1) {
                return ii;
            }
            ii = indexOf.call(this._weekdaysParse, llc);
            if (ii !== -1) {
                return ii;
            }
            ii = indexOf.call(this._shortWeekdaysParse, llc);
            return ii !== -1 ? ii : null;
        }
    }
}

export function localeWeekdaysParse(weekdayName, format, strict) {
    var i, mom, regex;

    if (this._weekdaysParseExact) {
        return handleStrictParse.call(this, weekdayName, format, strict);
    }

    if (!this._weekdaysParse) {
        this._weekdaysParse = [];
        this._minWeekdaysParse = [];
        this._shortWeekdaysParse = [];
        this._fullWeekdaysParse = [];
    }

    for (i = 0; i < 7; i++) {
        // make the regex if we don't have it already

        mom = createUTC([2000, 1]).day(i);
        if (strict && !this._fullWeekdaysParse[i]) {
            this._fullWeekdaysParse[i] = new RegExp(
                '^' + this.weekdays(mom, '').replace('.', '\\.?') + '$',
                'i'
            );
            this._shortWeekdaysParse[i] = new RegExp(
                '^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$',
                'i'
            );
            this._minWeekdaysParse[i] = new RegExp(
                '^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$',
                'i'
            );
        }
        if (!this._weekdaysParse[i]) {
            regex =
                '^' +
                this.weekdays(mom, '') +
                '|^' +
                this.weekdaysShort(mom, '') +
                '|^' +
                this.weekdaysMin(mom, '');
            this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
        }
        // test the regex
        if (
            strict &&
            format === 'dddd' &&
            this._fullWeekdaysParse[i].test(weekdayName)
        ) {
            return i;
        } else if (
            strict &&
            format === 'ddd' &&
            this._shortWeekdaysParse[i].test(weekdayName)
        ) {
            return i;
        } else if (
            strict &&
            format === 'dd' &&
            this._minWeekdaysParse[i].test(weekdayName)
        ) {
            return i;
        } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {
            return i;
        }
    }
}

// MOMENTS

export function getSetDayOfWeek(input) {
    if (!this.isValid()) {
        return input != null ? this : NaN;
    }
    var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
    if (input != null) {
        input = parseWeekday(input, this.localeData());
        return this.add(input - day, 'd');
    } else {
        return day;
    }
}

export function getSetLocaleDayOfWeek(input) {
    if (!this.isValid()) {
        return input != null ? this : NaN;
    }
    var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
    return input == null ? weekday : this.add(input - weekday, 'd');
}

export function getSetISODayOfWeek(input) {
    if (!this.isValid()) {
        return input != null ? this : NaN;
    }

    // behaves the same as moment#day except
    // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
    // as a setter, sunday should belong to the previous week.

    if (input != null) {
        var weekday = parseIsoWeekday(input, this.localeData());
        return this.day(this.day() % 7 ? weekday : weekday - 7);
    } else {
        return this.day() || 7;
    }
}

export function weekdaysRegex(isStrict) {
    if (this._weekdaysParseExact) {
        if (!hasOwnProp(this, '_weekdaysRegex')) {
            computeWeekdaysParse.call(this);
        }
        if (isStrict) {
            return this._weekdaysStrictRegex;
        } else {
            return this._weekdaysRegex;
        }
    } else {
        if (!hasOwnProp(this, '_weekdaysRegex')) {
            this._weekdaysRegex = defaultWeekdaysRegex;
        }
        return this._weekdaysStrictRegex && isStrict
            ? this._weekdaysStrictRegex
            : this._weekdaysRegex;
    }
}

export function weekdaysShortRegex(isStrict) {
    if (this._weekdaysParseExact) {
        if (!hasOwnProp(this, '_weekdaysRegex')) {
            computeWeekdaysParse.call(this);
        }
        if (isStrict) {
            return this._weekdaysShortStrictRegex;
        } else {
            return this._weekdaysShortRegex;
        }
    } else {
        if (!hasOwnProp(this, '_weekdaysShortRegex')) {
            this._weekdaysShortRegex = defaultWeekdaysShortRegex;
        }
        return this._weekdaysShortStrictRegex && isStrict
            ? this._weekdaysShortStrictRegex
            : this._weekdaysShortRegex;
    }
}

export function weekdaysMinRegex(isStrict) {
    if (this._weekdaysParseExact) {
        if (!hasOwnProp(this, '_weekdaysRegex')) {
            computeWeekdaysParse.call(this);
        }
        if (isStrict) {
            return this._weekdaysMinStrictRegex;
        } else {
            return this._weekdaysMinRegex;
        }
    } else {
        if (!hasOwnProp(this, '_weekdaysMinRegex')) {
            this._weekdaysMinRegex = defaultWeekdaysMinRegex;
        }
        return this._weekdaysMinStrictRegex && isStrict
            ? this._weekdaysMinStrictRegex
            : this._weekdaysMinRegex;
    }
}

function computeWeekdaysParse() {
    function cmpLenRev(a, b) {
        return b.length - a.length;
    }

    var minPieces = [],
        shortPieces = [],
        longPieces = [],
        mixedPieces = [],
        i,
        mom,
        minp,
        shortp,
        longp;
    for (i = 0; i < 7; i++) {
        // make the regex if we don't have it already
        mom = createUTC([2000, 1]).day(i);
        minp = regexEscape(this.weekdaysMin(mom, ''));
        shortp = regexEscape(this.weekdaysShort(mom, ''));
        longp = regexEscape(this.weekdays(mom, ''));
        minPieces.push(minp);
        shortPieces.push(shortp);
        longPieces.push(longp);
        mixedPieces.push(minp);
        mixedPieces.push(shortp);
        mixedPieces.push(longp);
    }
    // Sorting makes sure if one weekday (or abbr) is a prefix of another it
    // will match the longer piece.
    minPieces.sort(cmpLenRev);
    shortPieces.sort(cmpLenRev);
    longPieces.sort(cmpLenRev);
    mixedPieces.sort(cmpLenRev);

    this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
    this._weekdaysShortRegex = this._weekdaysRegex;
    this._weekdaysMinRegex = this._weekdaysRegex;

    this._weekdaysStrictRegex = new RegExp(
        '^(' + longPieces.join('|') + ')',
        'i'
    );
    this._weekdaysShortStrictRegex = new RegExp(
        '^(' + shortPieces.join('|') + ')',
        'i'
    );
    this._weekdaysMinStrictRegex = new RegExp(
        '^(' + minPieces.join('|') + ')',
        'i'
    );
}
import { addFormatToken } from '../format/format';
import { addUnitAlias } from './aliases';
import { addUnitPriority } from './priorities';
import { addRegexToken, match3, match1to3 } from '../parse/regex';
import { addParseToken } from '../parse/token';
import toInt from '../utils/to-int';

// FORMATTING

addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');

// ALIASES

addUnitAlias('dayOfYear', 'DDD');

// PRIORITY
addUnitPriority('dayOfYear', 4);

// PARSING

addRegexToken('DDD', match1to3);
addRegexToken('DDDD', match3);
addParseToken(['DDD', 'DDDD'], function (input, array, config) {
    config._dayOfYear = toInt(input);
});

// HELPERS

// MOMENTS

export function getSetDayOfYear(input) {
    var dayOfYear =
        Math.round(
            (this.clone().startOf('day') - this.clone().startOf('year')) / 864e5
        ) + 1;
    return input == null ? dayOfYear : this.add(input - dayOfYear, 'd');
}
import { addFormatToken } from '../format/format';
import { addRegexToken, matchUnsigned, regexEscape } from '../parse/regex';
import { addParseToken } from '../parse/token';
import { YEAR } from './constants';
import { hooks as moment } from '../utils/hooks';
import { getLocale } from '../locale/locales';
import getParsingFlags from '../create/parsing-flags';
import hasOwnProp from '../utils/has-own-prop';

addFormatToken('N', 0, 0, 'eraAbbr');
addFormatToken('NN', 0, 0, 'eraAbbr');
addFormatToken('NNN', 0, 0, 'eraAbbr');
addFormatToken('NNNN', 0, 0, 'eraName');
addFormatToken('NNNNN', 0, 0, 'eraNarrow');

addFormatToken('y', ['y', 1], 'yo', 'eraYear');
addFormatToken('y', ['yy', 2], 0, 'eraYear');
addFormatToken('y', ['yyy', 3], 0, 'eraYear');
addFormatToken('y', ['yyyy', 4], 0, 'eraYear');

addRegexToken('N', matchEraAbbr);
addRegexToken('NN', matchEraAbbr);
addRegexToken('NNN', matchEraAbbr);
addRegexToken('NNNN', matchEraName);
addRegexToken('NNNNN', matchEraNarrow);

addParseToken(
    ['N', 'NN', 'NNN', 'NNNN', 'NNNNN'],
    function (input, array, config, token) {
        var era = config._locale.erasParse(input, token, config._strict);
        if (era) {
            getParsingFlags(config).era = era;
        } else {
            getParsingFlags(config).invalidEra = input;
        }
    }
);

addRegexToken('y', matchUnsigned);
addRegexToken('yy', matchUnsigned);
addRegexToken('yyy', matchUnsigned);
addRegexToken('yyyy', matchUnsigned);
addRegexToken('yo', matchEraYearOrdinal);

addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR);
addParseToken(['yo'], function (input, array, config, token) {
    var match;
    if (config._locale._eraYearOrdinalRegex) {
        match = input.match(config._locale._eraYearOrdinalRegex);
    }

    if (config._locale.eraYearOrdinalParse) {
        array[YEAR] = config._locale.eraYearOrdinalParse(input, match);
    } else {
        array[YEAR] = parseInt(input, 10);
    }
});

export function localeEras(m, format) {
    var i,
        l,
        date,
        eras = this._eras || getLocale('en')._eras;
    for (i = 0, l = eras.length; i < l; ++i) {
        switch (typeof eras[i].since) {
            case 'string':
                // truncate time
                date = moment(eras[i].since).startOf('day');
                eras[i].since = date.valueOf();
                break;
        }

        switch (typeof eras[i].until) {
            case 'undefined':
                eras[i].until = +Infinity;
                break;
            case 'string':
                // truncate time
                date = moment(eras[i].until).startOf('day').valueOf();
                eras[i].until = date.valueOf();
                break;
        }
    }
    return eras;
}

export function localeErasParse(eraName, format, strict) {
    var i,
        l,
        eras = this.eras(),
        name,
        abbr,
        narrow;
    eraName = eraName.toUpperCase();

    for (i = 0, l = eras.length; i < l; ++i) {
        name = eras[i].name.toUpperCase();
        abbr = eras[i].abbr.toUpperCase();
        narrow = eras[i].narrow.toUpperCase();

        if (strict) {
            switch (format) {
                case 'N':
                case 'NN':
                case 'NNN':
                    if (abbr === eraName) {
                        return eras[i];
                    }
                    break;

                case 'NNNN':
                    if (name === eraName) {
                        return eras[i];
                    }
                    break;

                case 'NNNNN':
                    if (narrow === eraName) {
                        return eras[i];
                    }
                    break;
            }
        } else if ([name, abbr, narrow].indexOf(eraName) >= 0) {
            return eras[i];
        }
    }
}

export function localeErasConvertYear(era, year) {
    var dir = era.since <= era.until ? +1 : -1;
    if (year === undefined) {
        return moment(era.since).year();
    } else {
        return moment(era.since).year() + (year - era.offset) * dir;
    }
}

export function getEraName() {
    var i,
        l,
        val,
        eras = this.localeData().eras();
    for (i = 0, l = eras.length; i < l; ++i) {
        // truncate time
        val = this.clone().startOf('day').valueOf();

        if (eras[i].since <= val && val <= eras[i].until) {
            return eras[i].name;
        }
        if (eras[i].until <= val && val <= eras[i].since) {
            return eras[i].name;
        }
    }

    return '';
}

export function getEraNarrow() {
    var i,
        l,
        val,
        eras = this.localeData().eras();
    for (i = 0, l = eras.length; i < l; ++i) {
        // truncate time
        val = this.clone().startOf('day').valueOf();

        if (eras[i].since <= val && val <= eras[i].until) {
            return eras[i].narrow;
        }
        if (eras[i].until <= val && val <= eras[i].since) {
            return eras[i].narrow;
        }
    }

    return '';
}

export function getEraAbbr() {
    var i,
        l,
        val,
        eras = this.localeData().eras();
    for (i = 0, l = eras.length; i < l; ++i) {
        // truncate time
        val = this.clone().startOf('day').valueOf();

        if (eras[i].since <= val && val <= eras[i].until) {
            return eras[i].abbr;
        }
        if (eras[i].until <= val && val <= eras[i].since) {
            return eras[i].abbr;
        }
    }

    return '';
}

export function getEraYear() {
    var i,
        l,
        dir,
        val,
        eras = this.localeData().eras();
    for (i = 0, l = eras.length; i < l; ++i) {
        dir = eras[i].since <= eras[i].until ? +1 : -1;

        // truncate time
        val = this.clone().startOf('day').valueOf();

        if (
            (eras[i].since <= val && val <= eras[i].until) ||
            (eras[i].until <= val && val <= eras[i].since)
        ) {
            return (
                (this.year() - moment(eras[i].since).year()) * dir +
                eras[i].offset
            );
        }
    }

    return this.year();
}

export function erasNameRegex(isStrict) {
    if (!hasOwnProp(this, '_erasNameRegex')) {
        computeErasParse.call(this);
    }
    return isStrict ? this._erasNameRegex : this._erasRegex;
}

export function erasAbbrRegex(isStrict) {
    if (!hasOwnProp(this, '_erasAbbrRegex')) {
        computeErasParse.call(this);
    }
    return isStrict ? this._erasAbbrRegex : this._erasRegex;
}

export function erasNarrowRegex(isStrict) {
    if (!hasOwnProp(this, '_erasNarrowRegex')) {
        computeErasParse.call(this);
    }
    return isStrict ? this._erasNarrowRegex : this._erasRegex;
}

function matchEraAbbr(isStrict, locale) {
    return locale.erasAbbrRegex(isStrict);
}

function matchEraName(isStrict, locale) {
    return locale.erasNameRegex(isStrict);
}

function matchEraNarrow(isStrict, locale) {
    return locale.erasNarrowRegex(isStrict);
}

function matchEraYearOrdinal(isStrict, locale) {
    return locale._eraYearOrdinalRegex || matchUnsigned;
}

function computeErasParse() {
    var abbrPieces = [],
        namePieces = [],
        narrowPieces = [],
        mixedPieces = [],
        i,
        l,
        eras = this.eras();

    for (i = 0, l = eras.length; i < l; ++i) {
        namePieces.push(regexEscape(eras[i].name));
        abbrPieces.push(regexEscape(eras[i].abbr));
        narrowPieces.push(regexEscape(eras[i].narrow));

        mixedPieces.push(regexEscape(eras[i].name));
        mixedPieces.push(regexEscape(eras[i].abbr));
        mixedPieces.push(regexEscape(eras[i].narrow));
    }

    this._erasRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
    this._erasNameRegex = new RegExp('^(' + namePieces.join('|') + ')', 'i');
    this._erasAbbrRegex = new RegExp('^(' + abbrPieces.join('|') + ')', 'i');
    this._erasNarrowRegex = new RegExp(
        '^(' + narrowPieces.join('|') + ')',
        'i'
    );
}
import { makeGetSet } from '../moment/get-set';
import { addFormatToken } from '../format/format';
import { addUnitAlias } from './aliases';
import { addUnitPriority } from './priorities';
import {
    addRegexToken,
    match1to2,
    match2,
    match3to4,
    match5to6,
} from '../parse/regex';
import { addParseToken } from '../parse/token';
import { HOUR, MINUTE, SECOND } from './constants';
import toInt from '../utils/to-int';
import zeroFill from '../utils/zero-fill';
import getParsingFlags from '../create/parsing-flags';

// FORMATTING

function hFormat() {
    return this.hours() % 12 || 12;
}

function kFormat() {
    return this.hours() || 24;
}

addFormatToken('H', ['HH', 2], 0, 'hour');
addFormatToken('h', ['hh', 2], 0, hFormat);
addFormatToken('k', ['kk', 2], 0, kFormat);

addFormatToken('hmm', 0, 0, function () {
    return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);
});

addFormatToken('hmmss', 0, 0, function () {
    return (
        '' +
        hFormat.apply(this) +
        zeroFill(this.minutes(), 2) +
        zeroFill(this.seconds(), 2)
    );
});

addFormatToken('Hmm', 0, 0, function () {
    return '' + this.hours() + zeroFill(this.minutes(), 2);
});

addFormatToken('Hmmss', 0, 0, function () {
    return (
        '' +
        this.hours() +
        zeroFill(this.minutes(), 2) +
        zeroFill(this.seconds(), 2)
    );
});

function meridiem(token, lowercase) {
    addFormatToken(token, 0, 0, function () {
        return this.localeData().meridiem(
            this.hours(),
            this.minutes(),
            lowercase
        );
    });
}

meridiem('a', true);
meridiem('A', false);

// ALIASES

addUnitAlias('hour', 'h');

// PRIORITY
addUnitPriority('hour', 13);

// PARSING

function matchMeridiem(isStrict, locale) {
    return locale._meridiemParse;
}

addRegexToken('a', matchMeridiem);
addRegexToken('A', matchMeridiem);
addRegexToken('H', match1to2);
addRegexToken('h', match1to2);
addRegexToken('k', match1to2);
addRegexToken('HH', match1to2, match2);
addRegexToken('hh', match1to2, match2);
addRegexToken('kk', match1to2, match2);

addRegexToken('hmm', match3to4);
addRegexToken('hmmss', match5to6);
addRegexToken('Hmm', match3to4);
addRegexToken('Hmmss', match5to6);

addParseToken(['H', 'HH'], HOUR);
addParseToken(['k', 'kk'], function (input, array, config) {
    var kInput = toInt(input);
    array[HOUR] = kInput === 24 ? 0 : kInput;
});
addParseToken(['a', 'A'], function (input, array, config) {
    config._isPm = config._locale.isPM(input);
    config._meridiem = input;
});
addParseToken(['h', 'hh'], function (input, array, config) {
    array[HOUR] = toInt(input);
    getParsingFlags(config).bigHour = true;
});
addParseToken('hmm', function (input, array, config) {
    var pos = input.length - 2;
    array[HOUR] = toInt(input.substr(0, pos));
    array[MINUTE] = toInt(input.substr(pos));
    getParsingFlags(config).bigHour = true;
});
addParseToken('hmmss', function (input, array, config) {
    var pos1 = input.length - 4,
        pos2 = input.length - 2;
    array[HOUR] = toInt(input.substr(0, pos1));
    array[MINUTE] = toInt(input.substr(pos1, 2));
    array[SECOND] = toInt(input.substr(pos2));
    getParsingFlags(config).bigHour = true;
});
addParseToken('Hmm', function (input, array, config) {
    var pos = input.length - 2;
    array[HOUR] = toInt(input.substr(0, pos));
    array[MINUTE] = toInt(input.substr(pos));
});
addParseToken('Hmmss', function (input, array, config) {
    var pos1 = input.length - 4,
        pos2 = input.length - 2;
    array[HOUR] = toInt(input.substr(0, pos1));
    array[MINUTE] = toInt(input.substr(pos1, 2));
    array[SECOND] = toInt(input.substr(pos2));
});

// LOCALES

export function localeIsPM(input) {
    // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
    // Using charAt should be more compatible.
    return (input + '').toLowerCase().charAt(0) === 'p';
}

export var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i,
    // Setting the hour should keep the time, because the user explicitly
    // specified which hour they want. So trying to maintain the same hour (in
    // a new timezone) makes sense. Adding/subtracting hours does not follow
    // this rule.
    getSetHour = makeGetSet('Hours', true);

export function localeMeridiem(hours, minutes, isLower) {
    if (hours > 11) {
        return isLower ? 'pm' : 'PM';
    } else {
        return isLower ? 'am' : 'AM';
    }
}
import { makeGetSet } from '../moment/get-set';
import { addFormatToken } from '../format/format';
import { addUnitAlias } from './aliases';
import { addUnitPriority } from './priorities';
import {
    addRegexToken,
    match1,
    match2,
    match3,
    match1to3,
    matchUnsigned,
} from '../parse/regex';
import { addParseToken } from '../parse/token';
import { MILLISECOND } from './constants';
import toInt from '../utils/to-int';

// FORMATTING

addFormatToken('S', 0, 0, function () {
    return ~~(this.millisecond() / 100);
});

addFormatToken(0, ['SS', 2], 0, function () {
    return ~~(this.millisecond() / 10);
});

addFormatToken(0, ['SSS', 3], 0, 'millisecond');
addFormatToken(0, ['SSSS', 4], 0, function () {
    return this.millisecond() * 10;
});
addFormatToken(0, ['SSSSS', 5], 0, function () {
    return this.millisecond() * 100;
});
addFormatToken(0, ['SSSSSS', 6], 0, function () {
    return this.millisecond() * 1000;
});
addFormatToken(0, ['SSSSSSS', 7], 0, function () {
    return this.millisecond() * 10000;
});
addFormatToken(0, ['SSSSSSSS', 8], 0, function () {
    return this.millisecond() * 100000;
});
addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
    return this.millisecond() * 1000000;
});

// ALIASES

addUnitAlias('millisecond', 'ms');

// PRIORITY

addUnitPriority('millisecond', 16);

// PARSING

addRegexToken('S', match1to3, match1);
addRegexToken('SS', match1to3, match2);
addRegexToken('SSS', match1to3, match3);

var token, getSetMillisecond;
for (token = 'SSSS'; token.length <= 9; token += 'S') {
    addRegexToken(token, matchUnsigned);
}

function parseMs(input, array) {
    array[MILLISECOND] = toInt(('0.' + input) * 1000);
}

for (token = 'S'; token.length <= 9; token += 'S') {
    addParseToken(token, parseMs);
}

getSetMillisecond = makeGetSet('Milliseconds', false);

export { getSetMillisecond };
import { makeGetSet } from '../moment/get-set';
import { addFormatToken } from '../format/format';
import { addUnitAlias } from './aliases';
import { addUnitPriority } from './priorities';
import { addRegexToken, match1to2, match2 } from '../parse/regex';
import { addParseToken } from '../parse/token';
import { MINUTE } from './constants';

// FORMATTING

addFormatToken('m', ['mm', 2], 0, 'minute');

// ALIASES

addUnitAlias('minute', 'm');

// PRIORITY

addUnitPriority('minute', 14);

// PARSING

addRegexToken('m', match1to2);
addRegexToken('mm', match1to2, match2);
addParseToken(['m', 'mm'], MINUTE);

// MOMENTS

export var getSetMinute = makeGetSet('Minutes', false);
import { get } from '../moment/get-set';
import hasOwnProp from '../utils/has-own-prop';
import { addFormatToken } from '../format/format';
import { addUnitAlias } from './aliases';
import { addUnitPriority } from './priorities';
import {
    addRegexToken,
    match1to2,
    match2,
    matchWord,
    regexEscape,
} from '../parse/regex';
import { addParseToken } from '../parse/token';
import { hooks } from '../utils/hooks';
import { MONTH } from './constants';
import toInt from '../utils/to-int';
import isArray from '../utils/is-array';
import isNumber from '../utils/is-number';
import mod from '../utils/mod';
import indexOf from '../utils/index-of';
import { createUTC } from '../create/utc';
import getParsingFlags from '../create/parsing-flags';
import { isLeapYear } from '../utils/is-leap-year';

export function daysInMonth(year, month) {
    if (isNaN(year) || isNaN(month)) {
        return NaN;
    }
    var modMonth = mod(month, 12);
    year += (month - modMonth) / 12;
    return modMonth === 1
        ? isLeapYear(year)
            ? 29
            : 28
        : 31 - ((modMonth % 7) % 2);
}

// FORMATTING

addFormatToken('M', ['MM', 2], 'Mo', function () {
    return this.month() + 1;
});

addFormatToken('MMM', 0, 0, function (format) {
    return this.localeData().monthsShort(this, format);
});

addFormatToken('MMMM', 0, 0, function (format) {
    return this.localeData().months(this, format);
});

// ALIASES

addUnitAlias('month', 'M');

// PRIORITY

addUnitPriority('month', 8);

// PARSING

addRegexToken('M', match1to2);
addRegexToken('MM', match1to2, match2);
addRegexToken('MMM', function (isStrict, locale) {
    return locale.monthsShortRegex(isStrict);
});
addRegexToken('MMMM', function (isStrict, locale) {
    return locale.monthsRegex(isStrict);
});

addParseToken(['M', 'MM'], function (input, array) {
    array[MONTH] = toInt(input) - 1;
});

addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {
    var month = config._locale.monthsParse(input, token, config._strict);
    // if we didn't find a month name, mark the date as invalid.
    if (month != null) {
        array[MONTH] = month;
    } else {
        getParsingFlags(config).invalidMonth = input;
    }
});

// LOCALES

var defaultLocaleMonths =
        'January_February_March_April_May_June_July_August_September_October_November_December'.split(
            '_'
        ),
    defaultLocaleMonthsShort =
        'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
    MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,
    defaultMonthsShortRegex = matchWord,
    defaultMonthsRegex = matchWord;

export { defaultLocaleMonths, defaultLocaleMonthsShort };

export function localeMonths(m, format) {
    if (!m) {
        return isArray(this._months)
            ? this._months
            : this._months['standalone'];
    }
    return isArray(this._months)
        ? this._months[m.month()]
        : this._months[
              (this._months.isFormat || MONTHS_IN_FORMAT).test(format)
                  ? 'format'
                  : 'standalone'
          ][m.month()];
}

export function localeMonthsShort(m, format) {
    if (!m) {
        return isArray(this._monthsShort)
            ? this._monthsShort
            : this._monthsShort['standalone'];
    }
    return isArray(this._monthsShort)
        ? this._monthsShort[m.month()]
        : this._monthsShort[
              MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'
          ][m.month()];
}

function handleStrictParse(monthName, format, strict) {
    var i,
        ii,
        mom,
        llc = monthName.toLocaleLowerCase();
    if (!this._monthsParse) {
        // this is not used
        this._monthsParse = [];
        this._longMonthsParse = [];
        this._shortMonthsParse = [];
        for (i = 0; i < 12; ++i) {
            mom = createUTC([2000, i]);
            this._shortMonthsParse[i] = this.monthsShort(
                mom,
                ''
            ).toLocaleLowerCase();
            this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();
        }
    }

    if (strict) {
        if (format === 'MMM') {
            ii = indexOf.call(this._shortMonthsParse, llc);
            return ii !== -1 ? ii : null;
        } else {
            ii = indexOf.call(this._longMonthsParse, llc);
            return ii !== -1 ? ii : null;
        }
    } else {
        if (format === 'MMM') {
            ii = indexOf.call(this._shortMonthsParse, llc);
            if (ii !== -1) {
                return ii;
            }
            ii = indexOf.call(this._longMonthsParse, llc);
            return ii !== -1 ? ii : null;
        } else {
            ii = indexOf.call(this._longMonthsParse, llc);
            if (ii !== -1) {
                return ii;
            }
            ii = indexOf.call(this._shortMonthsParse, llc);
            return ii !== -1 ? ii : null;
        }
    }
}

export function localeMonthsParse(monthName, format, strict) {
    var i, mom, regex;

    if (this._monthsParseExact) {
        return handleStrictParse.call(this, monthName, format, strict);
    }

    if (!this._monthsParse) {
        this._monthsParse = [];
        this._longMonthsParse = [];
        this._shortMonthsParse = [];
    }

    // TODO: add sorting
    // Sorting makes sure if one month (or abbr) is a prefix of another
    // see sorting in computeMonthsParse
    for (i = 0; i < 12; i++) {
        // make the regex if we don't have it already
        mom = createUTC([2000, i]);
        if (strict && !this._longMonthsParse[i]) {
            this._longMonthsParse[i] = new RegExp(
                '^' + this.months(mom, '').replace('.', '') + '$',
                'i'
            );
            this._shortMonthsParse[i] = new RegExp(
                '^' + this.monthsShort(mom, '').replace('.', '') + '$',
                'i'
            );
        }
        if (!strict && !this._monthsParse[i]) {
            regex =
                '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
            this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
        }
        // test the regex
        if (
            strict &&
            format === 'MMMM' &&
            this._longMonthsParse[i].test(monthName)
        ) {
            return i;
        } else if (
            strict &&
            format === 'MMM' &&
            this._shortMonthsParse[i].test(monthName)
        ) {
            return i;
        } else if (!strict && this._monthsParse[i].test(monthName)) {
            return i;
        }
    }
}

// MOMENTS

export function setMonth(mom, value) {
    var dayOfMonth;

    if (!mom.isValid()) {
        // No op
        return mom;
    }

    if (typeof value === 'string') {
        if (/^\d+$/.test(value)) {
            value = toInt(value);
        } else {
            value = mom.localeData().monthsParse(value);
            // TODO: Another silent failure?
            if (!isNumber(value)) {
                return mom;
            }
        }
    }

    dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));
    mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
    return mom;
}

export function getSetMonth(value) {
    if (value != null) {
        setMonth(this, value);
        hooks.updateOffset(this, true);
        return this;
    } else {
        return get(this, 'Month');
    }
}

export function getDaysInMonth() {
    return daysInMonth(this.year(), this.month());
}

export function monthsShortRegex(isStrict) {
    if (this._monthsParseExact) {
        if (!hasOwnProp(this, '_monthsRegex')) {
            computeMonthsParse.call(this);
        }
        if (isStrict) {
            return this._monthsShortStrictRegex;
        } else {
            return this._monthsShortRegex;
        }
    } else {
        if (!hasOwnProp(this, '_monthsShortRegex')) {
            this._monthsShortRegex = defaultMonthsShortRegex;
        }
        return this._monthsShortStrictRegex && isStrict
            ? this._monthsShortStrictRegex
            : this._monthsShortRegex;
    }
}

export function monthsRegex(isStrict) {
    if (this._monthsParseExact) {
        if (!hasOwnProp(this, '_monthsRegex')) {
            computeMonthsParse.call(this);
        }
        if (isStrict) {
            return this._monthsStrictRegex;
        } else {
            return this._monthsRegex;
        }
    } else {
        if (!hasOwnProp(this, '_monthsRegex')) {
            this._monthsRegex = defaultMonthsRegex;
        }
        return this._monthsStrictRegex && isStrict
            ? this._monthsStrictRegex
            : this._monthsRegex;
    }
}

function computeMonthsParse() {
    function cmpLenRev(a, b) {
        return b.length - a.length;
    }

    var shortPieces = [],
        longPieces = [],
        mixedPieces = [],
        i,
        mom;
    for (i = 0; i < 12; i++) {
        // make the regex if we don't have it already
        mom = createUTC([2000, i]);
        shortPieces.push(this.monthsShort(mom, ''));
        longPieces.push(this.months(mom, ''));
        mixedPieces.push(this.months(mom, ''));
        mixedPieces.push(this.monthsShort(mom, ''));
    }
    // Sorting makes sure if one month (or abbr) is a prefix of another it
    // will match the longer piece.
    shortPieces.sort(cmpLenRev);
    longPieces.sort(cmpLenRev);
    mixedPieces.sort(cmpLenRev);
    for (i = 0; i < 12; i++) {
        shortPieces[i] = regexEscape(shortPieces[i]);
        longPieces[i] = regexEscape(longPieces[i]);
    }
    for (i = 0; i < 24; i++) {
        mixedPieces[i] = regexEscape(mixedPieces[i]);
    }

    this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
    this._monthsShortRegex = this._monthsRegex;
    this._monthsStrictRegex = new RegExp(
        '^(' + longPieces.join('|') + ')',
        'i'
    );
    this._monthsShortStrictRegex = new RegExp(
        '^(' + shortPieces.join('|') + ')',
        'i'
    );
}
import zeroFill from '../utils/zero-fill';
import { createDuration } from '../duration/create';
import { addSubtract } from '../moment/add-subtract';
import { isMoment, copyConfig } from '../moment/constructor';
import { addFormatToken } from '../format/format';
import { addRegexToken, matchOffset, matchShortOffset } from '../parse/regex';
import { addParseToken } from '../parse/token';
import { createLocal } from '../create/local';
import { prepareConfig } from '../create/from-anything';
import { createUTC } from '../create/utc';
import isDate from '../utils/is-date';
import toInt from '../utils/to-int';
import isUndefined from '../utils/is-undefined';
import compareArrays from '../utils/compare-arrays';
import { hooks } from '../utils/hooks';

// FORMATTING

function offset(token, separator) {
    addFormatToken(token, 0, 0, function () {
        var offset = this.utcOffset(),
            sign = '+';
        if (offset < 0) {
            offset = -offset;
            sign = '-';
        }
        return (
            sign +
            zeroFill(~~(offset / 60), 2) +
            separator +
            zeroFill(~~offset % 60, 2)
        );
    });
}

offset('Z', ':');
offset('ZZ', '');

// PARSING

addRegexToken('Z', matchShortOffset);
addRegexToken('ZZ', matchShortOffset);
addParseToken(['Z', 'ZZ'], function (input, array, config) {
    config._useUTC = true;
    config._tzm = offsetFromString(matchShortOffset, input);
});

// HELPERS

// timezone chunker
// '+10:00' > ['10',  '00']
// '-1530'  > ['-15', '30']
var chunkOffset = /([\+\-]|\d\d)/gi;

function offsetFromString(matcher, string) {
    var matches = (string || '').match(matcher),
        chunk,
        parts,
        minutes;

    if (matches === null) {
        return null;
    }

    chunk = matches[matches.length - 1] || [];
    parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];
    minutes = +(parts[1] * 60) + toInt(parts[2]);

    return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes;
}

// Return a moment from input, that is local/utc/zone equivalent to model.
export function cloneWithOffset(input, model) {
    var res, diff;
    if (model._isUTC) {
        res = model.clone();
        diff =
            (isMoment(input) || isDate(input)
                ? input.valueOf()
                : createLocal(input).valueOf()) - res.valueOf();
        // Use low-level api, because this fn is low-level api.
        res._d.setTime(res._d.valueOf() + diff);
        hooks.updateOffset(res, false);
        return res;
    } else {
        return createLocal(input).local();
    }
}

function getDateOffset(m) {
    // On Firefox.24 Date#getTimezoneOffset returns a floating point.
    // https://github.com/moment/moment/pull/1871
    return -Math.round(m._d.getTimezoneOffset());
}

// HOOKS

// This function will be called whenever a moment is mutated.
// It is intended to keep the offset in sync with the timezone.
hooks.updateOffset = function () {};

// MOMENTS

// keepLocalTime = true means only change the timezone, without
// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
// +0200, so we adjust the time as needed, to be valid.
//
// Keeping the time actually adds/subtracts (one hour)
// from the actual represented time. That is why we call updateOffset
// a second time. In case it wants us to change the offset again
// _changeInProgress == true case, then we have to adjust, because
// there is no such time in the given timezone.
export function getSetOffset(input, keepLocalTime, keepMinutes) {
    var offset = this._offset || 0,
        localAdjust;
    if (!this.isValid()) {
        return input != null ? this : NaN;
    }
    if (input != null) {
        if (typeof input === 'string') {
            input = offsetFromString(matchShortOffset, input);
            if (input === null) {
                return this;
            }
        } else if (Math.abs(input) < 16 && !keepMinutes) {
            input = input * 60;
        }
        if (!this._isUTC && keepLocalTime) {
            localAdjust = getDateOffset(this);
        }
        this._offset = input;
        this._isUTC = true;
        if (localAdjust != null) {
            this.add(localAdjust, 'm');
        }
        if (offset !== input) {
            if (!keepLocalTime || this._changeInProgress) {
                addSubtract(
                    this,
                    createDuration(input - offset, 'm'),
                    1,
                    false
                );
            } else if (!this._changeInProgress) {
                this._changeInProgress = true;
                hooks.updateOffset(this, true);
                this._changeInProgress = null;
            }
        }
        return this;
    } else {
        return this._isUTC ? offset : getDateOffset(this);
    }
}

export function getSetZone(input, keepLocalTime) {
    if (input != null) {
        if (typeof input !== 'string') {
            input = -input;
        }

        this.utcOffset(input, keepLocalTime);

        return this;
    } else {
        return -this.utcOffset();
    }
}

export function setOffsetToUTC(keepLocalTime) {
    return this.utcOffset(0, keepLocalTime);
}

export function setOffsetToLocal(keepLocalTime) {
    if (this._isUTC) {
        this.utcOffset(0, keepLocalTime);
        this._isUTC = false;

        if (keepLocalTime) {
            this.subtract(getDateOffset(this), 'm');
        }
    }
    return this;
}

export function setOffsetToParsedOffset() {
    if (this._tzm != null) {
        this.utcOffset(this._tzm, false, true);
    } else if (typeof this._i === 'string') {
        var tZone = offsetFromString(matchOffset, this._i);
        if (tZone != null) {
            this.utcOffset(tZone);
        } else {
            this.utcOffset(0, true);
        }
    }
    return this;
}

export function hasAlignedHourOffset(input) {
    if (!this.isValid()) {
        return false;
    }
    input = input ? createLocal(input).utcOffset() : 0;

    return (this.utcOffset() - input) % 60 === 0;
}

export function isDaylightSavingTime() {
    return (
        this.utcOffset() > this.clone().month(0).utcOffset() ||
        this.utcOffset() > this.clone().month(5).utcOffset()
    );
}

export function isDaylightSavingTimeShifted() {
    if (!isUndefined(this._isDSTShifted)) {
        return this._isDSTShifted;
    }

    var c = {},
        other;

    copyConfig(c, this);
    c = prepareConfig(c);

    if (c._a) {
        other = c._isUTC ? createUTC(c._a) : createLocal(c._a);
        this._isDSTShifted =
            this.isValid() && compareArrays(c._a, other.toArray()) > 0;
    } else {
        this._isDSTShifted = false;
    }

    return this._isDSTShifted;
}

export function isLocal() {
    return this.isValid() ? !this._isUTC : false;
}

export function isUtcOffset() {
    return this.isValid() ? this._isUTC : false;
}

export function isUtc() {
    return this.isValid() ? this._isUTC && this._offset === 0 : false;
}
import hasOwnProp from '../utils/has-own-prop';

var priorities = {};

export function addUnitPriority(unit, priority) {
    priorities[unit] = priority;
}

export function getPrioritizedUnits(unitsObj) {
    var units = [],
        u;
    for (u in unitsObj) {
        if (hasOwnProp(unitsObj, u)) {
            units.push({ unit: u, priority: priorities[u] });
        }
    }
    units.sort(function (a, b) {
        return a.priority - b.priority;
    });
    return units;
}
import { addFormatToken } from '../format/format';
import { addUnitAlias } from './aliases';
import { addUnitPriority } from './priorities';
import { addRegexToken, match1 } from '../parse/regex';
import { addParseToken } from '../parse/token';
import { MONTH } from './constants';
import toInt from '../utils/to-int';

// FORMATTING

addFormatToken('Q', 0, 'Qo', 'quarter');

// ALIASES

addUnitAlias('quarter', 'Q');

// PRIORITY

addUnitPriority('quarter', 7);

// PARSING

addRegexToken('Q', match1);
addParseToken('Q', function (input, array) {
    array[MONTH] = (toInt(input) - 1) * 3;
});

// MOMENTS

export function getSetQuarter(input) {
    return input == null
        ? Math.ceil((this.month() + 1) / 3)
        : this.month((input - 1) * 3 + (this.month() % 3));
}
import { makeGetSet } from '../moment/get-set';
import { addFormatToken } from '../format/format';
import { addUnitAlias } from './aliases';
import { addUnitPriority } from './priorities';
import { addRegexToken, match1to2, match2 } from '../parse/regex';
import { addParseToken } from '../parse/token';
import { SECOND } from './constants';

// FORMATTING

addFormatToken('s', ['ss', 2], 0, 'second');

// ALIASES

addUnitAlias('second', 's');

// PRIORITY

addUnitPriority('second', 15);

// PARSING

addRegexToken('s', match1to2);
addRegexToken('ss', match1to2, match2);
addParseToken(['s', 'ss'], SECOND);

// MOMENTS

export var getSetSecond = makeGetSet('Seconds', false);
import { addFormatToken } from '../format/format';
import { addRegexToken, matchTimestamp, matchSigned } from '../parse/regex';
import { addParseToken } from '../parse/token';
import toInt from '../utils/to-int';

// FORMATTING

addFormatToken('X', 0, 0, 'unix');
addFormatToken('x', 0, 0, 'valueOf');

// PARSING

addRegexToken('x', matchSigned);
addRegexToken('X', matchTimestamp);
addParseToken('X', function (input, array, config) {
    config._d = new Date(parseFloat(input) * 1000);
});
addParseToken('x', function (input, array, config) {
    config._d = new Date(toInt(input));
});
import { addFormatToken } from '../format/format';

// FORMATTING

addFormatToken('z', 0, 0, 'zoneAbbr');
addFormatToken('zz', 0, 0, 'zoneName');

// MOMENTS

export function getZoneAbbr() {
    return this._isUTC ? 'UTC' : '';
}

export function getZoneName() {
    return this._isUTC ? 'Coordinated Universal Time' : '';
}
// Side effect imports
import './day-of-month';
import './day-of-week';
import './day-of-year';
import './hour';
import './millisecond';
import './minute';
import './month';
import './offset';
import './quarter';
import './second';
import './timestamp';
import './timezone';
import './week-year';
import './week';
import './year';

import { normalizeUnits } from './aliases';

export { normalizeUnits };
import { daysInYear } from './year';
import { createUTCDate } from '../create/date-from-array';

// start-of-first-week - start-of-year
function firstWeekOffset(year, dow, doy) {
    var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
        fwd = 7 + dow - doy,
        // first-week day local weekday -- which local weekday is fwd
        fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;

    return -fwdlw + fwd - 1;
}

// https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
export function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
    var localWeekday = (7 + weekday - dow) % 7,
        weekOffset = firstWeekOffset(year, dow, doy),
        dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,
        resYear,
        resDayOfYear;

    if (dayOfYear <= 0) {
        resYear = year - 1;
        resDayOfYear = daysInYear(resYear) + dayOfYear;
    } else if (dayOfYear > daysInYear(year)) {
        resYear = year + 1;
        resDayOfYear = dayOfYear - daysInYear(year);
    } else {
        resYear = year;
        resDayOfYear = dayOfYear;
    }

    return {
        year: resYear,
        dayOfYear: resDayOfYear,
    };
}

export function weekOfYear(mom, dow, doy) {
    var weekOffset = firstWeekOffset(mom.year(), dow, doy),
        week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,
        resWeek,
        resYear;

    if (week < 1) {
        resYear = mom.year() - 1;
        resWeek = week + weeksInYear(resYear, dow, doy);
    } else if (week > weeksInYear(mom.year(), dow, doy)) {
        resWeek = week - weeksInYear(mom.year(), dow, doy);
        resYear = mom.year() + 1;
    } else {
        resYear = mom.year();
        resWeek = week;
    }

    return {
        week: resWeek,
        year: resYear,
    };
}

export function weeksInYear(year, dow, doy) {
    var weekOffset = firstWeekOffset(year, dow, doy),
        weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
    return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
}
import { addFormatToken } from '../format/format';
import { addUnitAlias } from './aliases';
import { addUnitPriority } from './priorities';
import {
    addRegexToken,
    match1to2,
    match1to4,
    match1to6,
    match2,
    match4,
    match6,
    matchSigned,
} from '../parse/regex';
import { addWeekParseToken } from '../parse/token';
import {
    weekOfYear,
    weeksInYear,
    dayOfYearFromWeeks,
} from './week-calendar-utils';
import toInt from '../utils/to-int';
import { hooks } from '../utils/hooks';
import { createUTCDate } from '../create/date-from-array';

// FORMATTING

addFormatToken(0, ['gg', 2], 0, function () {
    return this.weekYear() % 100;
});

addFormatToken(0, ['GG', 2], 0, function () {
    return this.isoWeekYear() % 100;
});

function addWeekYearFormatToken(token, getter) {
    addFormatToken(0, [token, token.length], 0, getter);
}

addWeekYearFormatToken('gggg', 'weekYear');
addWeekYearFormatToken('ggggg', 'weekYear');
addWeekYearFormatToken('GGGG', 'isoWeekYear');
addWeekYearFormatToken('GGGGG', 'isoWeekYear');

// ALIASES

addUnitAlias('weekYear', 'gg');
addUnitAlias('isoWeekYear', 'GG');

// PRIORITY

addUnitPriority('weekYear', 1);
addUnitPriority('isoWeekYear', 1);

// PARSING

addRegexToken('G', matchSigned);
addRegexToken('g', matchSigned);
addRegexToken('GG', match1to2, match2);
addRegexToken('gg', match1to2, match2);
addRegexToken('GGGG', match1to4, match4);
addRegexToken('gggg', match1to4, match4);
addRegexToken('GGGGG', match1to6, match6);
addRegexToken('ggggg', match1to6, match6);

addWeekParseToken(
    ['gggg', 'ggggg', 'GGGG', 'GGGGG'],
    function (input, week, config, token) {
        week[token.substr(0, 2)] = toInt(input);
    }
);

addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
    week[token] = hooks.parseTwoDigitYear(input);
});

// MOMENTS

export function getSetWeekYear(input) {
    return getSetWeekYearHelper.call(
        this,
        input,
        this.week(),
        this.weekday(),
        this.localeData()._week.dow,
        this.localeData()._week.doy
    );
}

export function getSetISOWeekYear(input) {
    return getSetWeekYearHelper.call(
        this,
        input,
        this.isoWeek(),
        this.isoWeekday(),
        1,
        4
    );
}

export function getISOWeeksInYear() {
    return weeksInYear(this.year(), 1, 4);
}

export function getISOWeeksInISOWeekYear() {
    return weeksInYear(this.isoWeekYear(), 1, 4);
}

export function getWeeksInYear() {
    var weekInfo = this.localeData()._week;
    return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
}

export function getWeeksInWeekYear() {
    var weekInfo = this.localeData()._week;
    return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy);
}

function getSetWeekYearHelper(input, week, weekday, dow, doy) {
    var weeksTarget;
    if (input == null) {
        return weekOfYear(this, dow, doy).year;
    } else {
        weeksTarget = weeksInYear(input, dow, doy);
        if (week > weeksTarget) {
            week = weeksTarget;
        }
        return setWeekAll.call(this, input, week, weekday, dow, doy);
    }
}

function setWeekAll(weekYear, week, weekday, dow, doy) {
    var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),
        date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);

    this.year(date.getUTCFullYear());
    this.month(date.getUTCMonth());
    this.date(date.getUTCDate());
    return this;
}
import { addFormatToken } from '../format/format';
import { addUnitAlias } from './aliases';
import { addUnitPriority } from './priorities';
import { addRegexToken, match1to2, match2 } from '../parse/regex';
import { addWeekParseToken } from '../parse/token';
import toInt from '../utils/to-int';
import { weekOfYear } from './week-calendar-utils';

// FORMATTING

addFormatToken('w', ['ww', 2], 'wo', 'week');
addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');

// ALIASES

addUnitAlias('week', 'w');
addUnitAlias('isoWeek', 'W');

// PRIORITIES

addUnitPriority('week', 5);
addUnitPriority('isoWeek', 5);

// PARSING

addRegexToken('w', match1to2);
addRegexToken('ww', match1to2, match2);
addRegexToken('W', match1to2);
addRegexToken('WW', match1to2, match2);

addWeekParseToken(
    ['w', 'ww', 'W', 'WW'],
    function (input, week, config, token) {
        week[token.substr(0, 1)] = toInt(input);
    }
);

// HELPERS

// LOCALES

export function localeWeek(mom) {
    return weekOfYear(mom, this._week.dow, this._week.doy).week;
}

export var defaultLocaleWeek = {
    dow: 0, // Sunday is the first day of the week.
    doy: 6, // The week that contains Jan 6th is the first week of the year.
};

export function localeFirstDayOfWeek() {
    return this._week.dow;
}

export function localeFirstDayOfYear() {
    return this._week.doy;
}

// MOMENTS

export function getSetWeek(input) {
    var week = this.localeData().week(this);
    return input == null ? week : this.add((input - week) * 7, 'd');
}

export function getSetISOWeek(input) {
    var week = weekOfYear(this, 1, 4).week;
    return input == null ? week : this.add((input - week) * 7, 'd');
}
import { makeGetSet } from '../moment/get-set';
import { addFormatToken } from '../format/format';
import { addUnitAlias } from './aliases';
import { addUnitPriority } from './priorities';
import {
    addRegexToken,
    match1to2,
    match1to4,
    match1to6,
    match2,
    match4,
    match6,
    matchSigned,
} from '../parse/regex';
import { addParseToken } from '../parse/token';
import { isLeapYear } from '../utils/is-leap-year';
import { hooks } from '../utils/hooks';
import { YEAR } from './constants';
import toInt from '../utils/to-int';
import zeroFill from '../utils/zero-fill';

// FORMATTING

addFormatToken('Y', 0, 0, function () {
    var y = this.year();
    return y <= 9999 ? zeroFill(y, 4) : '+' + y;
});

addFormatToken(0, ['YY', 2], 0, function () {
    return this.year() % 100;
});

addFormatToken(0, ['YYYY', 4], 0, 'year');
addFormatToken(0, ['YYYYY', 5], 0, 'year');
addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');

// ALIASES

addUnitAlias('year', 'y');

// PRIORITIES

addUnitPriority('year', 1);

// PARSING

addRegexToken('Y', matchSigned);
addRegexToken('YY', match1to2, match2);
addRegexToken('YYYY', match1to4, match4);
addRegexToken('YYYYY', match1to6, match6);
addRegexToken('YYYYYY', match1to6, match6);

addParseToken(['YYYYY', 'YYYYYY'], YEAR);
addParseToken('YYYY', function (input, array) {
    array[YEAR] =
        input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);
});
addParseToken('YY', function (input, array) {
    array[YEAR] = hooks.parseTwoDigitYear(input);
});
addParseToken('Y', function (input, array) {
    array[YEAR] = parseInt(input, 10);
});

// HELPERS

export function daysInYear(year) {
    return isLeapYear(year) ? 366 : 365;
}

export { isLeapYear };

// HOOKS

hooks.parseTwoDigitYear = function (input) {
    return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
};

// MOMENTS

export var getSetYear = makeGetSet('FullYear', true);

export function getIsLeapYear() {
    return isLeapYear(this.year());
}
var match1 = /\d/, //       0 - 9
    match2 = /\d\d/, //      00 - 99
    match3 = /\d{3}/, //     000 - 999
    match4 = /\d{4}/, //    0000 - 9999
    match6 = /[+-]?\d{6}/, // -999999 - 999999
    match1to2 = /\d\d?/, //       0 - 99
    match3to4 = /\d\d\d\d?/, //     999 - 9999
    match5to6 = /\d\d\d\d\d\d?/, //   99999 - 999999
    match1to3 = /\d{1,3}/, //       0 - 999
    match1to4 = /\d{1,4}/, //       0 - 9999
    match1to6 = /[+-]?\d{1,6}/, // -999999 - 999999
    matchUnsigned = /\d+/, //       0 - inf
    matchSigned = /[+-]?\d+/, //    -inf - inf
    matchOffset = /Z|[+-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z
    matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi, // +00 -00 +00:00 -00:00 +0000 -0000 or Z
    matchTimestamp = /[+-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123
    // any word (or two) characters or numbers including two/three word month in arabic.
    // includes scottish gaelic two word and hyphenated months
    matchWord =
        /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,
    regexes;

export {
    match1,
    match2,
    match3,
    match4,
    match6,
    match1to2,
    match3to4,
    match5to6,
    match1to3,
    match1to4,
    match1to6,
    matchUnsigned,
    matchSigned,
    matchOffset,
    matchShortOffset,
    matchTimestamp,
    matchWord,
};

import hasOwnProp from '../utils/has-own-prop';
import isFunction from '../utils/is-function';

regexes = {};

export function addRegexToken(token, regex, strictRegex) {
    regexes[token] = isFunction(regex)
        ? regex
        : function (isStrict, localeData) {
              return isStrict && strictRegex ? strictRegex : regex;
          };
}

export function getParseRegexForToken(token, config) {
    if (!hasOwnProp(regexes, token)) {
        return new RegExp(unescapeFormat(token));
    }

    return regexes[token](config._strict, config._locale);
}

// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
function unescapeFormat(s) {
    return regexEscape(
        s
            .replace('\\', '')
            .replace(
                /\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,
                function (matched, p1, p2, p3, p4) {
                    return p1 || p2 || p3 || p4;
                }
            )
    );
}

export function regexEscape(s) {
    return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
}
import hasOwnProp from '../utils/has-own-prop';
import isNumber from '../utils/is-number';
import toInt from '../utils/to-int';

var tokens = {};

export function addParseToken(token, callback) {
    var i,
        func = callback,
        tokenLen;
    if (typeof token === 'string') {
        token = [token];
    }
    if (isNumber(callback)) {
        func = function (input, array) {
            array[callback] = toInt(input);
        };
    }
    tokenLen = token.length;
    for (i = 0; i < tokenLen; i++) {
        tokens[token[i]] = func;
    }
}

export function addWeekParseToken(token, callback) {
    addParseToken(token, function (input, array, config, token) {
        config._w = config._w || {};
        callback(input, config._w, config, token);
    });
}

export function addTimeToArrayFromToken(token, input, config) {
    if (input != null && hasOwnProp(tokens, token)) {
        tokens[token](input, config._a, config, token);
    }
}
import { get, set } from './get-set';
import { setMonth } from '../units/month';
import { createDuration } from '../duration/create';
import { deprecateSimple } from '../utils/deprecate';
import { hooks } from '../utils/hooks';
import absRound from '../utils/abs-round';

// TODO: remove 'name' arg after deprecation is removed
function createAdder(direction, name) {
    return function (val, period) {
        var dur, tmp;
        //invert the arguments, but complain about it
        if (period !== null && !isNaN(+period)) {
            deprecateSimple(
                name,
                'moment().' +
                    name +
                    '(period, number) is deprecated. Please use moment().' +
                    name +
                    '(number, period). ' +
                    'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'
            );
            tmp = val;
            val = period;
            period = tmp;
        }

        dur = createDuration(val, period);
        addSubtract(this, dur, direction);
        return this;
    };
}

export function addSubtract(mom, duration, isAdding, updateOffset) {
    var milliseconds = duration._milliseconds,
        days = absRound(duration._days),
        months = absRound(duration._months);

    if (!mom.isValid()) {
        // No op
        return;
    }

    updateOffset = updateOffset == null ? true : updateOffset;

    if (months) {
        setMonth(mom, get(mom, 'Month') + months * isAdding);
    }
    if (days) {
        set(mom, 'Date', get(mom, 'Date') + days * isAdding);
    }
    if (milliseconds) {
        mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
    }
    if (updateOffset) {
        hooks.updateOffset(mom, days || months);
    }
}

export var add = createAdder(1, 'add'),
    subtract = createAdder(-1, 'subtract');
import { createLocal } from '../create/local';
import { cloneWithOffset } from '../units/offset';
import isFunction from '../utils/is-function';
import { hooks } from '../utils/hooks';
import { isMomentInput } from '../utils/is-moment-input';
import isCalendarSpec from '../utils/is-calendar-spec';

export function getCalendarFormat(myMoment, now) {
    var diff = myMoment.diff(now, 'days', true);
    return diff < -6
        ? 'sameElse'
        : diff < -1
        ? 'lastWeek'
        : diff < 0
        ? 'lastDay'
        : diff < 1
        ? 'sameDay'
        : diff < 2
        ? 'nextDay'
        : diff < 7
        ? 'nextWeek'
        : 'sameElse';
}

export function calendar(time, formats) {
    // Support for single parameter, formats only overload to the calendar function
    if (arguments.length === 1) {
        if (!arguments[0]) {
            time = undefined;
            formats = undefined;
        } else if (isMomentInput(arguments[0])) {
            time = arguments[0];
            formats = undefined;
        } else if (isCalendarSpec(arguments[0])) {
            formats = arguments[0];
            time = undefined;
        }
    }
    // We want to compare the start of today, vs this.
    // Getting start-of-today depends on whether we're local/utc/offset or not.
    var now = time || createLocal(),
        sod = cloneWithOffset(now, this).startOf('day'),
        format = hooks.calendarFormat(this, sod) || 'sameElse',
        output =
            formats &&
            (isFunction(formats[format])
                ? formats[format].call(this, now)
                : formats[format]);

    return this.format(
        output || this.localeData().calendar(format, this, createLocal(now))
    );
}
import { Moment } from './constructor';

export function clone() {
    return new Moment(this);
}
import { isMoment } from './constructor';
import { normalizeUnits } from '../units/aliases';
import { createLocal } from '../create/local';

export function isAfter(input, units) {
    var localInput = isMoment(input) ? input : createLocal(input);
    if (!(this.isValid() && localInput.isValid())) {
        return false;
    }
    units = normalizeUnits(units) || 'millisecond';
    if (units === 'millisecond') {
        return this.valueOf() > localInput.valueOf();
    } else {
        return localInput.valueOf() < this.clone().startOf(units).valueOf();
    }
}

export function isBefore(input, units) {
    var localInput = isMoment(input) ? input : createLocal(input);
    if (!(this.isValid() && localInput.isValid())) {
        return false;
    }
    units = normalizeUnits(units) || 'millisecond';
    if (units === 'millisecond') {
        return this.valueOf() < localInput.valueOf();
    } else {
        return this.clone().endOf(units).valueOf() < localInput.valueOf();
    }
}

export function isBetween(from, to, units, inclusivity) {
    var localFrom = isMoment(from) ? from : createLocal(from),
        localTo = isMoment(to) ? to : createLocal(to);
    if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) {
        return false;
    }
    inclusivity = inclusivity || '()';
    return (
        (inclusivity[0] === '('
            ? this.isAfter(localFrom, units)
            : !this.isBefore(localFrom, units)) &&
        (inclusivity[1] === ')'
            ? this.isBefore(localTo, units)
            : !this.isAfter(localTo, units))
    );
}

export function isSame(input, units) {
    var localInput = isMoment(input) ? input : createLocal(input),
        inputMs;
    if (!(this.isValid() && localInput.isValid())) {
        return false;
    }
    units = normalizeUnits(units) || 'millisecond';
    if (units === 'millisecond') {
        return this.valueOf() === localInput.valueOf();
    } else {
        inputMs = localInput.valueOf();
        return (
            this.clone().startOf(units).valueOf() <= inputMs &&
            inputMs <= this.clone().endOf(units).valueOf()
        );
    }
}

export function isSameOrAfter(input, units) {
    return this.isSame(input, units) || this.isAfter(input, units);
}

export function isSameOrBefore(input, units) {
    return this.isSame(input, units) || this.isBefore(input, units);
}
import { hooks } from '../utils/hooks';
import isUndefined from '../utils/is-undefined';
import getParsingFlags from '../create/parsing-flags';

// Plugins that add properties should also add the key here (null value),
// so we can properly clone ourselves.
var momentProperties = (hooks.momentProperties = []),
    updateInProgress = false;

export function copyConfig(to, from) {
    var i,
        prop,
        val,
        momentPropertiesLen = momentProperties.length;

    if (!isUndefined(from._isAMomentObject)) {
        to._isAMomentObject = from._isAMomentObject;
    }
    if (!isUndefined(from._i)) {
        to._i = from._i;
    }
    if (!isUndefined(from._f)) {
        to._f = from._f;
    }
    if (!isUndefined(from._l)) {
        to._l = from._l;
    }
    if (!isUndefined(from._strict)) {
        to._strict = from._strict;
    }
    if (!isUndefined(from._tzm)) {
        to._tzm = from._tzm;
    }
    if (!isUndefined(from._isUTC)) {
        to._isUTC = from._isUTC;
    }
    if (!isUndefined(from._offset)) {
        to._offset = from._offset;
    }
    if (!isUndefined(from._pf)) {
        to._pf = getParsingFlags(from);
    }
    if (!isUndefined(from._locale)) {
        to._locale = from._locale;
    }

    if (momentPropertiesLen > 0) {
        for (i = 0; i < momentPropertiesLen; i++) {
            prop = momentProperties[i];
            val = from[prop];
            if (!isUndefined(val)) {
                to[prop] = val;
            }
        }
    }

    return to;
}

// Moment prototype object
export function Moment(config) {
    copyConfig(this, config);
    this._d = new Date(config._d != null ? config._d.getTime() : NaN);
    if (!this.isValid()) {
        this._d = new Date(NaN);
    }
    // Prevent infinite loop in case updateOffset creates new moment
    // objects.
    if (updateInProgress === false) {
        updateInProgress = true;
        hooks.updateOffset(this);
        updateInProgress = false;
    }
}

export function isMoment(obj) {
    return (
        obj instanceof Moment || (obj != null && obj._isAMomentObject != null)
    );
}
export function creationData() {
    return {
        input: this._i,
        format: this._f,
        locale: this._locale,
        isUTC: this._isUTC,
        strict: this._strict,
    };
}
import absFloor from '../utils/abs-floor';
import { cloneWithOffset } from '../units/offset';
import { normalizeUnits } from '../units/aliases';

export function diff(input, units, asFloat) {
    var that, zoneDelta, output;

    if (!this.isValid()) {
        return NaN;
    }

    that = cloneWithOffset(input, this);

    if (!that.isValid()) {
        return NaN;
    }

    zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;

    units = normalizeUnits(units);

    switch (units) {
        case 'year':
            output = monthDiff(this, that) / 12;
            break;
        case 'month':
            output = monthDiff(this, that);
            break;
        case 'quarter':
            output = monthDiff(this, that) / 3;
            break;
        case 'second':
            output = (this - that) / 1e3;
            break; // 1000
        case 'minute':
            output = (this - that) / 6e4;
            break; // 1000 * 60
        case 'hour':
            output = (this - that) / 36e5;
            break; // 1000 * 60 * 60
        case 'day':
            output = (this - that - zoneDelta) / 864e5;
            break; // 1000 * 60 * 60 * 24, negate dst
        case 'week':
            output = (this - that - zoneDelta) / 6048e5;
            break; // 1000 * 60 * 60 * 24 * 7, negate dst
        default:
            output = this - that;
    }

    return asFloat ? output : absFloor(output);
}

function monthDiff(a, b) {
    if (a.date() < b.date()) {
        // end-of-month calculations work correct when the start month has more
        // days than the end month.
        return -monthDiff(b, a);
    }
    // difference in months
    var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()),
        // b is in (anchor - 1 month, anchor + 1 month)
        anchor = a.clone().add(wholeMonthDiff, 'months'),
        anchor2,
        adjust;

    if (b - anchor < 0) {
        anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
        // linear across the month
        adjust = (b - anchor) / (anchor - anchor2);
    } else {
        anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
        // linear across the month
        adjust = (b - anchor) / (anchor2 - anchor);
    }

    //check for negative zero, return zero if negative zero
    return -(wholeMonthDiff + adjust) || 0;
}
import { formatMoment } from '../format/format';
import { hooks } from '../utils/hooks';
import isFunction from '../utils/is-function';

hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';

export function toString() {
    return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
}

export function toISOString(keepOffset) {
    if (!this.isValid()) {
        return null;
    }
    var utc = keepOffset !== true,
        m = utc ? this.clone().utc() : this;
    if (m.year() < 0 || m.year() > 9999) {
        return formatMoment(
            m,
            utc
                ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'
                : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'
        );
    }
    if (isFunction(Date.prototype.toISOString)) {
        // native implementation is ~50x faster, use it when we can
        if (utc) {
            return this.toDate().toISOString();
        } else {
            return new Date(this.valueOf() + this.utcOffset() * 60 * 1000)
                .toISOString()
                .replace('Z', formatMoment(m, 'Z'));
        }
    }
    return formatMoment(
        m,
        utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'
    );
}

/**
 * Return a human readable representation of a moment that can
 * also be evaluated to get a new moment which is the same
 *
 * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects
 */
export function inspect() {
    if (!this.isValid()) {
        return 'moment.invalid(/* ' + this._i + ' */)';
    }
    var func = 'moment',
        zone = '',
        prefix,
        year,
        datetime,
        suffix;
    if (!this.isLocal()) {
        func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';
        zone = 'Z';
    }
    prefix = '[' + func + '("]';
    year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY';
    datetime = '-MM-DD[T]HH:mm:ss.SSS';
    suffix = zone + '[")]';

    return this.format(prefix + year + datetime + suffix);
}

export function format(inputString) {
    if (!inputString) {
        inputString = this.isUtc()
            ? hooks.defaultFormatUtc
            : hooks.defaultFormat;
    }
    var output = formatMoment(this, inputString);
    return this.localeData().postformat(output);
}
import { createDuration } from '../duration/create';
import { createLocal } from '../create/local';
import { isMoment } from '../moment/constructor';

export function from(time, withoutSuffix) {
    if (
        this.isValid() &&
        ((isMoment(time) && time.isValid()) || createLocal(time).isValid())
    ) {
        return createDuration({ to: this, from: time })
            .locale(this.locale())
            .humanize(!withoutSuffix);
    } else {
        return this.localeData().invalidDate();
    }
}

export function fromNow(withoutSuffix) {
    return this.from(createLocal(), withoutSuffix);
}
import { normalizeUnits, normalizeObjectUnits } from '../units/aliases';
import { getPrioritizedUnits } from '../units/priorities';
import { hooks } from '../utils/hooks';
import isFunction from '../utils/is-function';
import { daysInMonth } from '../units/month';
import { isLeapYear } from '../utils/is-leap-year';
import toInt from '../utils/to-int';

export function makeGetSet(unit, keepTime) {
    return function (value) {
        if (value != null) {
            set(this, unit, value);
            hooks.updateOffset(this, keepTime);
            return this;
        } else {
            return get(this, unit);
        }
    };
}

export function get(mom, unit) {
    return mom.isValid()
        ? mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]()
        : NaN;
}

export function set(mom, unit, value) {
    if (mom.isValid() && !isNaN(value)) {
        if (
            unit === 'FullYear' &&
            isLeapYear(mom.year()) &&
            mom.month() === 1 &&
            mom.date() === 29
        ) {
            value = toInt(value);
            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](
                value,
                mom.month(),
                daysInMonth(value, mom.month())
            );
        } else {
            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
        }
    }
}

// MOMENTS

export function stringGet(units) {
    units = normalizeUnits(units);
    if (isFunction(this[units])) {
        return this[units]();
    }
    return this;
}

export function stringSet(units, value) {
    if (typeof units === 'object') {
        units = normalizeObjectUnits(units);
        var prioritized = getPrioritizedUnits(units),
            i,
            prioritizedLen = prioritized.length;
        for (i = 0; i < prioritizedLen; i++) {
            this[prioritized[i].unit](units[prioritized[i].unit]);
        }
    } else {
        units = normalizeUnits(units);
        if (isFunction(this[units])) {
            return this[units](value);
        }
    }
    return this;
}
import { getLocale } from '../locale/locales';
import { deprecate } from '../utils/deprecate';

// If passed a locale key, it will set the locale for this
// instance.  Otherwise, it will return the locale configuration
// variables for this instance.
export function locale(key) {
    var newLocaleData;

    if (key === undefined) {
        return this._locale._abbr;
    } else {
        newLocaleData = getLocale(key);
        if (newLocaleData != null) {
            this._locale = newLocaleData;
        }
        return this;
    }
}

export var lang = deprecate(
    'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
    function (key) {
        if (key === undefined) {
            return this.localeData();
        } else {
            return this.locale(key);
        }
    }
);

export function localeData() {
    return this._locale;
}
import { deprecate } from '../utils/deprecate';
import isArray from '../utils/is-array';
import { createLocal } from '../create/local';
import { createInvalid } from '../create/valid';

export var prototypeMin = deprecate(
        'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',
        function () {
            var other = createLocal.apply(null, arguments);
            if (this.isValid() && other.isValid()) {
                return other < this ? this : other;
            } else {
                return createInvalid();
            }
        }
    ),
    prototypeMax = deprecate(
        'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',
        function () {
            var other = createLocal.apply(null, arguments);
            if (this.isValid() && other.isValid()) {
                return other > this ? this : other;
            } else {
                return createInvalid();
            }
        }
    );

// Pick a moment m from moments so that m[fn](other) is true for all
// other. This relies on the function fn to be transitive.
//
// moments should either be an array of moment objects or an array, whose
// first element is an array of moment objects.
function pickBy(fn, moments) {
    var res, i;
    if (moments.length === 1 && isArray(moments[0])) {
        moments = moments[0];
    }
    if (!moments.length) {
        return createLocal();
    }
    res = moments[0];
    for (i = 1; i < moments.length; ++i) {
        if (!moments[i].isValid() || moments[i][fn](res)) {
            res = moments[i];
        }
    }
    return res;
}

// TODO: Use [].sort instead?
export function min() {
    var args = [].slice.call(arguments, 0);

    return pickBy('isBefore', args);
}

export function max() {
    var args = [].slice.call(arguments, 0);

    return pickBy('isAfter', args);
}
import { createLocal } from '../create/local';
import { createUTC } from '../create/utc';
import { createInvalid } from '../create/valid';
import { isMoment } from './constructor';
import { min, max } from './min-max';
import { now } from './now';
import momentPrototype from './prototype';

function createUnix(input) {
    return createLocal(input * 1000);
}

function createInZone() {
    return createLocal.apply(null, arguments).parseZone();
}

export {
    now,
    min,
    max,
    isMoment,
    createUTC,
    createUnix,
    createLocal,
    createInZone,
    createInvalid,
    momentPrototype,
};
export var now = function () {
    return Date.now ? Date.now() : +new Date();
};
import { Moment } from './constructor';

var proto = Moment.prototype;

import { add, subtract } from './add-subtract';
import { calendar } from './calendar';
import { clone } from './clone';
import {
    isBefore,
    isBetween,
    isSame,
    isAfter,
    isSameOrAfter,
    isSameOrBefore,
} from './compare';
import { diff } from './diff';
import { format, toString, toISOString, inspect } from './format';
import { from, fromNow } from './from';
import { to, toNow } from './to';
import { stringGet, stringSet } from './get-set';
import { locale, localeData, lang } from './locale';
import { prototypeMin, prototypeMax } from './min-max';
import { startOf, endOf } from './start-end-of';
import { valueOf, toDate, toArray, toObject, toJSON, unix } from './to-type';
import { isValid, parsingFlags, invalidAt } from './valid';
import { creationData } from './creation-data';

proto.add = add;
proto.calendar = calendar;
proto.clone = clone;
proto.diff = diff;
proto.endOf = endOf;
proto.format = format;
proto.from = from;
proto.fromNow = fromNow;
proto.to = to;
proto.toNow = toNow;
proto.get = stringGet;
proto.invalidAt = invalidAt;
proto.isAfter = isAfter;
proto.isBefore = isBefore;
proto.isBetween = isBetween;
proto.isSame = isSame;
proto.isSameOrAfter = isSameOrAfter;
proto.isSameOrBefore = isSameOrBefore;
proto.isValid = isValid;
proto.lang = lang;
proto.locale = locale;
proto.localeData = localeData;
proto.max = prototypeMax;
proto.min = prototypeMin;
proto.parsingFlags = parsingFlags;
proto.set = stringSet;
proto.startOf = startOf;
proto.subtract = subtract;
proto.toArray = toArray;
proto.toObject = toObject;
proto.toDate = toDate;
proto.toISOString = toISOString;
proto.inspect = inspect;
if (typeof Symbol !== 'undefined' && Symbol.for != null) {
    proto[Symbol.for('nodejs.util.inspect.custom')] = function () {
        return 'Moment<' + this.format() + '>';
    };
}
proto.toJSON = toJSON;
proto.toString = toString;
proto.unix = unix;
proto.valueOf = valueOf;
proto.creationData = creationData;

// Era
import { getEraName, getEraNarrow, getEraAbbr, getEraYear } from '../units/era';
proto.eraName = getEraName;
proto.eraNarrow = getEraNarrow;
proto.eraAbbr = getEraAbbr;
proto.eraYear = getEraYear;

// Year
import { getSetYear, getIsLeapYear } from '../units/year';
proto.year = getSetYear;
proto.isLeapYear = getIsLeapYear;

// Week Year
import {
    getSetWeekYear,
    getSetISOWeekYear,
    getWeeksInYear,
    getWeeksInWeekYear,
    getISOWeeksInYear,
    getISOWeeksInISOWeekYear,
} from '../units/week-year';
proto.weekYear = getSetWeekYear;
proto.isoWeekYear = getSetISOWeekYear;

// Quarter
import { getSetQuarter } from '../units/quarter';
proto.quarter = proto.quarters = getSetQuarter;

// Month
import { getSetMonth, getDaysInMonth } from '../units/month';
proto.month = getSetMonth;
proto.daysInMonth = getDaysInMonth;

// Week
import { getSetWeek, getSetISOWeek } from '../units/week';
proto.week = proto.weeks = getSetWeek;
proto.isoWeek = proto.isoWeeks = getSetISOWeek;
proto.weeksInYear = getWeeksInYear;
proto.weeksInWeekYear = getWeeksInWeekYear;
proto.isoWeeksInYear = getISOWeeksInYear;
proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear;

// Day
import { getSetDayOfMonth } from '../units/day-of-month';
import {
    getSetDayOfWeek,
    getSetISODayOfWeek,
    getSetLocaleDayOfWeek,
} from '../units/day-of-week';
import { getSetDayOfYear } from '../units/day-of-year';
proto.date = getSetDayOfMonth;
proto.day = proto.days = getSetDayOfWeek;
proto.weekday = getSetLocaleDayOfWeek;
proto.isoWeekday = getSetISODayOfWeek;
proto.dayOfYear = getSetDayOfYear;

// Hour
import { getSetHour } from '../units/hour';
proto.hour = proto.hours = getSetHour;

// Minute
import { getSetMinute } from '../units/minute';
proto.minute = proto.minutes = getSetMinute;

// Second
import { getSetSecond } from '../units/second';
proto.second = proto.seconds = getSetSecond;

// Millisecond
import { getSetMillisecond } from '../units/millisecond';
proto.millisecond = proto.milliseconds = getSetMillisecond;

// Offset
import {
    getSetOffset,
    setOffsetToUTC,
    setOffsetToLocal,
    setOffsetToParsedOffset,
    hasAlignedHourOffset,
    isDaylightSavingTime,
    isDaylightSavingTimeShifted,
    getSetZone,
    isLocal,
    isUtcOffset,
    isUtc,
} from '../units/offset';
proto.utcOffset = getSetOffset;
proto.utc = setOffsetToUTC;
proto.local = setOffsetToLocal;
proto.parseZone = setOffsetToParsedOffset;
proto.hasAlignedHourOffset = hasAlignedHourOffset;
proto.isDST = isDaylightSavingTime;
proto.isLocal = isLocal;
proto.isUtcOffset = isUtcOffset;
proto.isUtc = isUtc;
proto.isUTC = isUtc;

// Timezone
import { getZoneAbbr, getZoneName } from '../units/timezone';
proto.zoneAbbr = getZoneAbbr;
proto.zoneName = getZoneName;

// Deprecations
import { deprecate } from '../utils/deprecate';
proto.dates = deprecate(
    'dates accessor is deprecated. Use date instead.',
    getSetDayOfMonth
);
proto.months = deprecate(
    'months accessor is deprecated. Use month instead',
    getSetMonth
);
proto.years = deprecate(
    'years accessor is deprecated. Use year instead',
    getSetYear
);
proto.zone = deprecate(
    'moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/',
    getSetZone
);
proto.isDSTShifted = deprecate(
    'isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information',
    isDaylightSavingTimeShifted
);

export default proto;
import { normalizeUnits } from '../units/aliases';
import { hooks } from '../utils/hooks';

var MS_PER_SECOND = 1000,
    MS_PER_MINUTE = 60 * MS_PER_SECOND,
    MS_PER_HOUR = 60 * MS_PER_MINUTE,
    MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR;

// actual modulo - handles negative numbers (for dates before 1970):
function mod(dividend, divisor) {
    return ((dividend % divisor) + divisor) % divisor;
}

function localStartOfDate(y, m, d) {
    // the date constructor remaps years 0-99 to 1900-1999
    if (y < 100 && y >= 0) {
        // preserve leap years using a full 400 year cycle, then reset
        return new Date(y + 400, m, d) - MS_PER_400_YEARS;
    } else {
        return new Date(y, m, d).valueOf();
    }
}

function utcStartOfDate(y, m, d) {
    // Date.UTC remaps years 0-99 to 1900-1999
    if (y < 100 && y >= 0) {
        // preserve leap years using a full 400 year cycle, then reset
        return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS;
    } else {
        return Date.UTC(y, m, d);
    }
}

export function startOf(units) {
    var time, startOfDate;
    units = normalizeUnits(units);
    if (units === undefined || units === 'millisecond' || !this.isValid()) {
        return this;
    }

    startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;

    switch (units) {
        case 'year':
            time = startOfDate(this.year(), 0, 1);
            break;
        case 'quarter':
            time = startOfDate(
                this.year(),
                this.month() - (this.month() % 3),
                1
            );
            break;
        case 'month':
            time = startOfDate(this.year(), this.month(), 1);
            break;
        case 'week':
            time = startOfDate(
                this.year(),
                this.month(),
                this.date() - this.weekday()
            );
            break;
        case 'isoWeek':
            time = startOfDate(
                this.year(),
                this.month(),
                this.date() - (this.isoWeekday() - 1)
            );
            break;
        case 'day':
        case 'date':
            time = startOfDate(this.year(), this.month(), this.date());
            break;
        case 'hour':
            time = this._d.valueOf();
            time -= mod(
                time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),
                MS_PER_HOUR
            );
            break;
        case 'minute':
            time = this._d.valueOf();
            time -= mod(time, MS_PER_MINUTE);
            break;
        case 'second':
            time = this._d.valueOf();
            time -= mod(time, MS_PER_SECOND);
            break;
    }

    this._d.setTime(time);
    hooks.updateOffset(this, true);
    return this;
}

export function endOf(units) {
    var time, startOfDate;
    units = normalizeUnits(units);
    if (units === undefined || units === 'millisecond' || !this.isValid()) {
        return this;
    }

    startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;

    switch (units) {
        case 'year':
            time = startOfDate(this.year() + 1, 0, 1) - 1;
            break;
        case 'quarter':
            time =
                startOfDate(
                    this.year(),
                    this.month() - (this.month() % 3) + 3,
                    1
                ) - 1;
            break;
        case 'month':
            time = startOfDate(this.year(), this.month() + 1, 1) - 1;
            break;
        case 'week':
            time =
                startOfDate(
                    this.year(),
                    this.month(),
                    this.date() - this.weekday() + 7
                ) - 1;
            break;
        case 'isoWeek':
            time =
                startOfDate(
                    this.year(),
                    this.month(),
                    this.date() - (this.isoWeekday() - 1) + 7
                ) - 1;
            break;
        case 'day':
        case 'date':
            time = startOfDate(this.year(), this.month(), this.date() + 1) - 1;
            break;
        case 'hour':
            time = this._d.valueOf();
            time +=
                MS_PER_HOUR -
                mod(
                    time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),
                    MS_PER_HOUR
                ) -
                1;
            break;
        case 'minute':
            time = this._d.valueOf();
            time += MS_PER_MINUTE - mod(time, MS_PER_MINUTE) - 1;
            break;
        case 'second':
            time = this._d.valueOf();
            time += MS_PER_SECOND - mod(time, MS_PER_SECOND) - 1;
            break;
    }

    this._d.setTime(time);
    hooks.updateOffset(this, true);
    return this;
}
export function valueOf() {
    return this._d.valueOf() - (this._offset || 0) * 60000;
}

export function unix() {
    return Math.floor(this.valueOf() / 1000);
}

export function toDate() {
    return new Date(this.valueOf());
}

export function toArray() {
    var m = this;
    return [
        m.year(),
        m.month(),
        m.date(),
        m.hour(),
        m.minute(),
        m.second(),
        m.millisecond(),
    ];
}

export function toObject() {
    var m = this;
    return {
        years: m.year(),
        months: m.month(),
        date: m.date(),
        hours: m.hours(),
        minutes: m.minutes(),
        seconds: m.seconds(),
        milliseconds: m.milliseconds(),
    };
}

export function toJSON() {
    // new Date(NaN).toJSON() === null
    return this.isValid() ? this.toISOString() : null;
}
import { createDuration } from '../duration/create';
import { createLocal } from '../create/local';
import { isMoment } from '../moment/constructor';

export function to(time, withoutSuffix) {
    if (
        this.isValid() &&
        ((isMoment(time) && time.isValid()) || createLocal(time).isValid())
    ) {
        return createDuration({ from: this, to: time })
            .locale(this.locale())
            .humanize(!withoutSuffix);
    } else {
        return this.localeData().invalidDate();
    }
}

export function toNow(withoutSuffix) {
    return this.to(createLocal(), withoutSuffix);
}
import { isValid as _isValid } from '../create/valid';
import extend from '../utils/extend';
import getParsingFlags from '../create/parsing-flags';

export function isValid() {
    return _isValid(this);
}

export function parsingFlags() {
    return extend({}, getParsingFlags(this));
}

export function invalidAt() {
    return getParsingFlags(this).overflow;
}
import { defaultCalendar } from './calendar';
import { defaultLongDateFormat } from './formats';
import { defaultInvalidDate } from './invalid';
import { defaultOrdinal, defaultDayOfMonthOrdinalParse } from './ordinal';
import { defaultRelativeTime } from './relative';

// months
import { defaultLocaleMonths, defaultLocaleMonthsShort } from '../units/month';

// week
import { defaultLocaleWeek } from '../units/week';

// weekdays
import {
    defaultLocaleWeekdays,
    defaultLocaleWeekdaysMin,
    defaultLocaleWeekdaysShort,
} from '../units/day-of-week';

// meridiem
import { defaultLocaleMeridiemParse } from '../units/hour';

export var baseConfig = {
    calendar: defaultCalendar,
    longDateFormat: defaultLongDateFormat,
    invalidDate: defaultInvalidDate,
    ordinal: defaultOrdinal,
    dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,
    relativeTime: defaultRelativeTime,

    months: defaultLocaleMonths,
    monthsShort: defaultLocaleMonthsShort,

    week: defaultLocaleWeek,

    weekdays: defaultLocaleWeekdays,
    weekdaysMin: defaultLocaleWeekdaysMin,
    weekdaysShort: defaultLocaleWeekdaysShort,

    meridiemParse: defaultLocaleMeridiemParse,
};
export var defaultCalendar = {
    sameDay: '[Today at] LT',
    nextDay: '[Tomorrow at] LT',
    nextWeek: 'dddd [at] LT',
    lastDay: '[Yesterday at] LT',
    lastWeek: '[Last] dddd [at] LT',
    sameElse: 'L',
};

import isFunction from '../utils/is-function';

export function calendar(key, mom, now) {
    var output = this._calendar[key] || this._calendar['sameElse'];
    return isFunction(output) ? output.call(mom, now) : output;
}
export function Locale(config) {
    if (config != null) {
        this.set(config);
    }
}
import './prototype';
import { getSetGlobalLocale } from './locales';
import toInt from '../utils/to-int';

getSetGlobalLocale('en', {
    eras: [
        {
            since: '0001-01-01',
            until: +Infinity,
            offset: 1,
            name: 'Anno Domini',
            narrow: 'AD',
            abbr: 'AD',
        },
        {
            since: '0000-12-31',
            until: -Infinity,
            offset: 1,
            name: 'Before Christ',
            narrow: 'BC',
            abbr: 'BC',
        },
    ],
    dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/,
    ordinal: function (number) {
        var b = number % 10,
            output =
                toInt((number % 100) / 10) === 1
                    ? 'th'
                    : b === 1
                    ? 'st'
                    : b === 2
                    ? 'nd'
                    : b === 3
                    ? 'rd'
                    : 'th';
        return number + output;
    },
});
import { formattingTokens } from '../format/format';

export var defaultLongDateFormat = {
    LTS: 'h:mm:ss A',
    LT: 'h:mm A',
    L: 'MM/DD/YYYY',
    LL: 'MMMM D, YYYY',
    LLL: 'MMMM D, YYYY h:mm A',
    LLLL: 'dddd, MMMM D, YYYY h:mm A',
};

export function longDateFormat(key) {
    var format = this._longDateFormat[key],
        formatUpper = this._longDateFormat[key.toUpperCase()];

    if (format || !formatUpper) {
        return format;
    }

    this._longDateFormat[key] = formatUpper
        .match(formattingTokens)
        .map(function (tok) {
            if (
                tok === 'MMMM' ||
                tok === 'MM' ||
                tok === 'DD' ||
                tok === 'dddd'
            ) {
                return tok.slice(1);
            }
            return tok;
        })
        .join('');

    return this._longDateFormat[key];
}
export var defaultInvalidDate = 'Invalid date';

export function invalidDate() {
    return this._invalidDate;
}
import isNumber from '../utils/is-number';
import { getLocale } from './locales';
import { createUTC } from '../create/utc';

function get(format, index, field, setter) {
    var locale = getLocale(),
        utc = createUTC().set(setter, index);
    return locale[field](utc, format);
}

function listMonthsImpl(format, index, field) {
    if (isNumber(format)) {
        index = format;
        format = undefined;
    }

    format = format || '';

    if (index != null) {
        return get(format, index, field, 'month');
    }

    var i,
        out = [];
    for (i = 0; i < 12; i++) {
        out[i] = get(format, i, field, 'month');
    }
    return out;
}

// ()
// (5)
// (fmt, 5)
// (fmt)
// (true)
// (true, 5)
// (true, fmt, 5)
// (true, fmt)
function listWeekdaysImpl(localeSorted, format, index, field) {
    if (typeof localeSorted === 'boolean') {
        if (isNumber(format)) {
            index = format;
            format = undefined;
        }

        format = format || '';
    } else {
        format = localeSorted;
        index = format;
        localeSorted = false;

        if (isNumber(format)) {
            index = format;
            format = undefined;
        }

        format = format || '';
    }

    var locale = getLocale(),
        shift = localeSorted ? locale._week.dow : 0,
        i,
        out = [];

    if (index != null) {
        return get(format, (index + shift) % 7, field, 'day');
    }

    for (i = 0; i < 7; i++) {
        out[i] = get(format, (i + shift) % 7, field, 'day');
    }
    return out;
}

export function listMonths(format, index) {
    return listMonthsImpl(format, index, 'months');
}

export function listMonthsShort(format, index) {
    return listMonthsImpl(format, index, 'monthsShort');
}

export function listWeekdays(localeSorted, format, index) {
    return listWeekdaysImpl(localeSorted, format, index, 'weekdays');
}

export function listWeekdaysShort(localeSorted, format, index) {
    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');
}

export function listWeekdaysMin(localeSorted, format, index) {
    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');
}
// Side effect imports
import './prototype';

import {
    getSetGlobalLocale,
    defineLocale,
    updateLocale,
    getLocale,
    listLocales,
} from './locales';

import {
    listMonths,
    listMonthsShort,
    listWeekdays,
    listWeekdaysShort,
    listWeekdaysMin,
} from './lists';

export {
    getSetGlobalLocale,
    defineLocale,
    updateLocale,
    getLocale,
    listLocales,
    listMonths,
    listMonthsShort,
    listWeekdays,
    listWeekdaysShort,
    listWeekdaysMin,
};

import { deprecate } from '../utils/deprecate';
import { hooks } from '../utils/hooks';

hooks.lang = deprecate(
    'moment.lang is deprecated. Use moment.locale instead.',
    getSetGlobalLocale
);
hooks.langData = deprecate(
    'moment.langData is deprecated. Use moment.localeData instead.',
    getLocale
);

import './en';
import isArray from '../utils/is-array';
import isUndefined from '../utils/is-undefined';
import { deprecateSimple } from '../utils/deprecate';
import { mergeConfigs } from './set';
import { Locale } from './constructor';
import keys from '../utils/keys';

import { baseConfig } from './base-config';

// internal storage for locale config files
var locales = {},
    localeFamilies = {},
    globalLocale;

function commonPrefix(arr1, arr2) {
    var i,
        minl = Math.min(arr1.length, arr2.length);
    for (i = 0; i < minl; i += 1) {
        if (arr1[i] !== arr2[i]) {
            return i;
        }
    }
    return minl;
}

function normalizeLocale(key) {
    return key ? key.toLowerCase().replace('_', '-') : key;
}

// pick the locale from the array
// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
function chooseLocale(names) {
    var i = 0,
        j,
        next,
        locale,
        split;

    while (i < names.length) {
        split = normalizeLocale(names[i]).split('-');
        j = split.length;
        next = normalizeLocale(names[i + 1]);
        next = next ? next.split('-') : null;
        while (j > 0) {
            locale = loadLocale(split.slice(0, j).join('-'));
            if (locale) {
                return locale;
            }
            if (
                next &&
                next.length >= j &&
                commonPrefix(split, next) >= j - 1
            ) {
                //the next array item is better than a shallower substring of this one
                break;
            }
            j--;
        }
        i++;
    }
    return globalLocale;
}

function isLocaleNameSane(name) {
    // Prevent names that look like filesystem paths, i.e contain '/' or '\'
    return name.match('^[^/\\\\]*$') != null;
}

function loadLocale(name) {
    var oldLocale = null,
        aliasedRequire;
    // TODO: Find a better way to register and load all the locales in Node
    if (
        locales[name] === undefined &&
        typeof module !== 'undefined' &&
        module &&
        module.exports &&
        isLocaleNameSane(name)
    ) {
        try {
            oldLocale = globalLocale._abbr;
            aliasedRequire = require;
            aliasedRequire('./locale/' + name);
            getSetGlobalLocale(oldLocale);
        } catch (e) {
            // mark as not found to avoid repeating expensive file require call causing high CPU
            // when trying to find en-US, en_US, en-us for every format call
            locales[name] = null; // null means not found
        }
    }
    return locales[name];
}

// This function will load locale and then set the global locale.  If
// no arguments are passed in, it will simply return the current global
// locale key.
export function getSetGlobalLocale(key, values) {
    var data;
    if (key) {
        if (isUndefined(values)) {
            data = getLocale(key);
        } else {
            data = defineLocale(key, values);
        }

        if (data) {
            // moment.duration._locale = moment._locale = data;
            globalLocale = data;
        } else {
            if (typeof console !== 'undefined' && console.warn) {
                //warn user if arguments are passed but the locale could not be set
                console.warn(
                    'Locale ' + key + ' not found. Did you forget to load it?'
                );
            }
        }
    }

    return globalLocale._abbr;
}

export function defineLocale(name, config) {
    if (config !== null) {
        var locale,
            parentConfig = baseConfig;
        config.abbr = name;
        if (locales[name] != null) {
            deprecateSimple(
                'defineLocaleOverride',
                'use moment.updateLocale(localeName, config) to change ' +
                    'an existing locale. moment.defineLocale(localeName, ' +
                    'config) should only be used for creating a new locale ' +
                    'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'
            );
            parentConfig = locales[name]._config;
        } else if (config.parentLocale != null) {
            if (locales[config.parentLocale] != null) {
                parentConfig = locales[config.parentLocale]._config;
            } else {
                locale = loadLocale(config.parentLocale);
                if (locale != null) {
                    parentConfig = locale._config;
                } else {
                    if (!localeFamilies[config.parentLocale]) {
                        localeFamilies[config.parentLocale] = [];
                    }
                    localeFamilies[config.parentLocale].push({
                        name: name,
                        config: config,
                    });
                    return null;
                }
            }
        }
        locales[name] = new Locale(mergeConfigs(parentConfig, config));

        if (localeFamilies[name]) {
            localeFamilies[name].forEach(function (x) {
                defineLocale(x.name, x.config);
            });
        }

        // backwards compat for now: also set the locale
        // make sure we set the locale AFTER all child locales have been
        // created, so we won't end up with the child locale set.
        getSetGlobalLocale(name);

        return locales[name];
    } else {
        // useful for testing
        delete locales[name];
        return null;
    }
}

export function updateLocale(name, config) {
    if (config != null) {
        var locale,
            tmpLocale,
            parentConfig = baseConfig;

        if (locales[name] != null && locales[name].parentLocale != null) {
            // Update existing child locale in-place to avoid memory-leaks
            locales[name].set(mergeConfigs(locales[name]._config, config));
        } else {
            // MERGE
            tmpLocale = loadLocale(name);
            if (tmpLocale != null) {
                parentConfig = tmpLocale._config;
            }
            config = mergeConfigs(parentConfig, config);
            if (tmpLocale == null) {
                // updateLocale is called for creating a new locale
                // Set abbr so it will have a name (getters return
                // undefined otherwise).
                config.abbr = name;
            }
            locale = new Locale(config);
            locale.parentLocale = locales[name];
            locales[name] = locale;
        }

        // backwards compat for now: also set the locale
        getSetGlobalLocale(name);
    } else {
        // pass null for config to unupdate, useful for tests
        if (locales[name] != null) {
            if (locales[name].parentLocale != null) {
                locales[name] = locales[name].parentLocale;
                if (name === getSetGlobalLocale()) {
                    getSetGlobalLocale(name);
                }
            } else if (locales[name] != null) {
                delete locales[name];
            }
        }
    }
    return locales[name];
}

// returns locale data
export function getLocale(key) {
    var locale;

    if (key && key._locale && key._locale._abbr) {
        key = key._locale._abbr;
    }

    if (!key) {
        return globalLocale;
    }

    if (!isArray(key)) {
        //short-circuit everything else
        locale = loadLocale(key);
        if (locale) {
            return locale;
        }
        key = [key];
    }

    return chooseLocale(key);
}

export function listLocales() {
    return keys(locales);
}
var defaultOrdinal = '%d',
    defaultDayOfMonthOrdinalParse = /\d{1,2}/;

export { defaultOrdinal, defaultDayOfMonthOrdinalParse };

export function ordinal(number) {
    return this._ordinal.replace('%d', number);
}
export function preParsePostFormat(string) {
    return string;
}
import { Locale } from './constructor';

var proto = Locale.prototype;

import { calendar } from './calendar';
import { longDateFormat } from './formats';
import { invalidDate } from './invalid';
import { ordinal } from './ordinal';
import { preParsePostFormat } from './pre-post-format';
import { relativeTime, pastFuture } from './relative';
import { set } from './set';

proto.calendar = calendar;
proto.longDateFormat = longDateFormat;
proto.invalidDate = invalidDate;
proto.ordinal = ordinal;
proto.preparse = preParsePostFormat;
proto.postformat = preParsePostFormat;
proto.relativeTime = relativeTime;
proto.pastFuture = pastFuture;
proto.set = set;

// Eras
import {
    localeEras,
    localeErasParse,
    localeErasConvertYear,
    erasAbbrRegex,
    erasNameRegex,
    erasNarrowRegex,
} from '../units/era';
proto.eras = localeEras;
proto.erasParse = localeErasParse;
proto.erasConvertYear = localeErasConvertYear;
proto.erasAbbrRegex = erasAbbrRegex;
proto.erasNameRegex = erasNameRegex;
proto.erasNarrowRegex = erasNarrowRegex;

// Month
import {
    localeMonthsParse,
    localeMonths,
    localeMonthsShort,
    monthsRegex,
    monthsShortRegex,
} from '../units/month';

proto.months = localeMonths;
proto.monthsShort = localeMonthsShort;
proto.monthsParse = localeMonthsParse;
proto.monthsRegex = monthsRegex;
proto.monthsShortRegex = monthsShortRegex;

// Week
import {
    localeWeek,
    localeFirstDayOfYear,
    localeFirstDayOfWeek,
} from '../units/week';
proto.week = localeWeek;
proto.firstDayOfYear = localeFirstDayOfYear;
proto.firstDayOfWeek = localeFirstDayOfWeek;

// Day of Week
import {
    localeWeekdaysParse,
    localeWeekdays,
    localeWeekdaysMin,
    localeWeekdaysShort,
    weekdaysRegex,
    weekdaysShortRegex,
    weekdaysMinRegex,
} from '../units/day-of-week';

proto.weekdays = localeWeekdays;
proto.weekdaysMin = localeWeekdaysMin;
proto.weekdaysShort = localeWeekdaysShort;
proto.weekdaysParse = localeWeekdaysParse;

proto.weekdaysRegex = weekdaysRegex;
proto.weekdaysShortRegex = weekdaysShortRegex;
proto.weekdaysMinRegex = weekdaysMinRegex;

// Hours
import { localeIsPM, localeMeridiem } from '../units/hour';

proto.isPM = localeIsPM;
proto.meridiem = localeMeridiem;
export var defaultRelativeTime = {
    future: 'in %s',
    past: '%s ago',
    s: 'a few seconds',
    ss: '%d seconds',
    m: 'a minute',
    mm: '%d minutes',
    h: 'an hour',
    hh: '%d hours',
    d: 'a day',
    dd: '%d days',
    w: 'a week',
    ww: '%d weeks',
    M: 'a month',
    MM: '%d months',
    y: 'a year',
    yy: '%d years',
};

import isFunction from '../utils/is-function';

export function relativeTime(number, withoutSuffix, string, isFuture) {
    var output = this._relativeTime[string];
    return isFunction(output)
        ? output(number, withoutSuffix, string, isFuture)
        : output.replace(/%d/i, number);
}

export function pastFuture(diff, output) {
    var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
    return isFunction(format) ? format(output) : format.replace(/%s/i, output);
}
import isFunction from '../utils/is-function';
import extend from '../utils/extend';
import isObject from '../utils/is-object';
import hasOwnProp from '../utils/has-own-prop';

export function set(config) {
    var prop, i;
    for (i in config) {
        if (hasOwnProp(config, i)) {
            prop = config[i];
            if (isFunction(prop)) {
                this[i] = prop;
            } else {
                this['_' + i] = prop;
            }
        }
    }
    this._config = config;
    // Lenient ordinal parsing accepts just a number in addition to
    // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.
    // TODO: Remove "ordinalParse" fallback in next major release.
    this._dayOfMonthOrdinalParseLenient = new RegExp(
        (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +
            '|' +
            /\d{1,2}/.source
    );
}

export function mergeConfigs(parentConfig, childConfig) {
    var res = extend({}, parentConfig),
        prop;
    for (prop in childConfig) {
        if (hasOwnProp(childConfig, prop)) {
            if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {
                res[prop] = {};
                extend(res[prop], parentConfig[prop]);
                extend(res[prop], childConfig[prop]);
            } else if (childConfig[prop] != null) {
                res[prop] = childConfig[prop];
            } else {
                delete res[prop];
            }
        }
    }
    for (prop in parentConfig) {
        if (
            hasOwnProp(parentConfig, prop) &&
            !hasOwnProp(childConfig, prop) &&
            isObject(parentConfig[prop])
        ) {
            // make sure changes to properties don't modify parent config
            res[prop] = extend({}, res[prop]);
        }
    }
    return res;
}
import zeroFill from '../utils/zero-fill';
import isFunction from '../utils/is-function';

var formattingTokens =
        /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,
    localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,
    formatFunctions = {},
    formatTokenFunctions = {};

export { formattingTokens, formatTokenFunctions };

// token:    'M'
// padded:   ['MM', 2]
// ordinal:  'Mo'
// callback: function () { this.month() + 1 }
export function addFormatToken(token, padded, ordinal, callback) {
    var func = callback;
    if (typeof callback === 'string') {
        func = function () {
            return this[callback]();
        };
    }
    if (token) {
        formatTokenFunctions[token] = func;
    }
    if (padded) {
        formatTokenFunctions[padded[0]] = function () {
            return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
        };
    }
    if (ordinal) {
        formatTokenFunctions[ordinal] = function () {
            return this.localeData().ordinal(
                func.apply(this, arguments),
                token
            );
        };
    }
}

function removeFormattingTokens(input) {
    if (input.match(/\[[\s\S]/)) {
        return input.replace(/^\[|\]$/g, '');
    }
    return input.replace(/\\/g, '');
}

function makeFormatFunction(format) {
    var array = format.match(formattingTokens),
        i,
        length;

    for (i = 0, length = array.length; i < length; i++) {
        if (formatTokenFunctions[array[i]]) {
            array[i] = formatTokenFunctions[array[i]];
        } else {
            array[i] = removeFormattingTokens(array[i]);
        }
    }

    return function (mom) {
        var output = '',
            i;
        for (i = 0; i < length; i++) {
            output += isFunction(array[i])
                ? array[i].call(mom, format)
                : array[i];
        }
        return output;
    };
}

// format date using native date object
export function formatMoment(m, format) {
    if (!m.isValid()) {
        return m.localeData().invalidDate();
    }

    format = expandFormat(format, m.localeData());
    formatFunctions[format] =
        formatFunctions[format] || makeFormatFunction(format);

    return formatFunctions[format](m);
}

export function expandFormat(format, locale) {
    var i = 5;

    function replaceLongDateFormatTokens(input) {
        return locale.longDateFormat(input) || input;
    }

    localFormattingTokens.lastIndex = 0;
    while (i >= 0 && localFormattingTokens.test(format)) {
        format = format.replace(
            localFormattingTokens,
            replaceLongDateFormatTokens
        );
        localFormattingTokens.lastIndex = 0;
        i -= 1;
    }

    return format;
}
var mathAbs = Math.abs;

export function abs() {
    var data = this._data;

    this._milliseconds = mathAbs(this._milliseconds);
    this._days = mathAbs(this._days);
    this._months = mathAbs(this._months);

    data.milliseconds = mathAbs(data.milliseconds);
    data.seconds = mathAbs(data.seconds);
    data.minutes = mathAbs(data.minutes);
    data.hours = mathAbs(data.hours);
    data.months = mathAbs(data.months);
    data.years = mathAbs(data.years);

    return this;
}
import { createDuration } from './create';

function addSubtract(duration, input, value, direction) {
    var other = createDuration(input, value);

    duration._milliseconds += direction * other._milliseconds;
    duration._days += direction * other._days;
    duration._months += direction * other._months;

    return duration._bubble();
}

// supports only 2.0-style add(1, 's') or add(duration)
export function add(input, value) {
    return addSubtract(this, input, value, 1);
}

// supports only 2.0-style subtract(1, 's') or subtract(duration)
export function subtract(input, value) {
    return addSubtract(this, input, value, -1);
}
import { daysToMonths, monthsToDays } from './bubble';
import { normalizeUnits } from '../units/aliases';
import toInt from '../utils/to-int';

export function as(units) {
    if (!this.isValid()) {
        return NaN;
    }
    var days,
        months,
        milliseconds = this._milliseconds;

    units = normalizeUnits(units);

    if (units === 'month' || units === 'quarter' || units === 'year') {
        days = this._days + milliseconds / 864e5;
        months = this._months + daysToMonths(days);
        switch (units) {
            case 'month':
                return months;
            case 'quarter':
                return months / 3;
            case 'year':
                return months / 12;
        }
    } else {
        // handle milliseconds separately because of floating point math errors (issue #1867)
        days = this._days + Math.round(monthsToDays(this._months));
        switch (units) {
            case 'week':
                return days / 7 + milliseconds / 6048e5;
            case 'day':
                return days + milliseconds / 864e5;
            case 'hour':
                return days * 24 + milliseconds / 36e5;
            case 'minute':
                return days * 1440 + milliseconds / 6e4;
            case 'second':
                return days * 86400 + milliseconds / 1000;
            // Math.floor prevents floating point math errors here
            case 'millisecond':
                return Math.floor(days * 864e5) + milliseconds;
            default:
                throw new Error('Unknown unit ' + units);
        }
    }
}

// TODO: Use this.as('ms')?
export function valueOf() {
    if (!this.isValid()) {
        return NaN;
    }
    return (
        this._milliseconds +
        this._days * 864e5 +
        (this._months % 12) * 2592e6 +
        toInt(this._months / 12) * 31536e6
    );
}

function makeAs(alias) {
    return function () {
        return this.as(alias);
    };
}

var asMilliseconds = makeAs('ms'),
    asSeconds = makeAs('s'),
    asMinutes = makeAs('m'),
    asHours = makeAs('h'),
    asDays = makeAs('d'),
    asWeeks = makeAs('w'),
    asMonths = makeAs('M'),
    asQuarters = makeAs('Q'),
    asYears = makeAs('y');

export {
    asMilliseconds,
    asSeconds,
    asMinutes,
    asHours,
    asDays,
    asWeeks,
    asMonths,
    asQuarters,
    asYears,
};
import absFloor from '../utils/abs-floor';
import absCeil from '../utils/abs-ceil';

export function bubble() {
    var milliseconds = this._milliseconds,
        days = this._days,
        months = this._months,
        data = this._data,
        seconds,
        minutes,
        hours,
        years,
        monthsFromDays;

    // if we have a mix of positive and negative values, bubble down first
    // check: https://github.com/moment/moment/issues/2166
    if (
        !(
            (milliseconds >= 0 && days >= 0 && months >= 0) ||
            (milliseconds <= 0 && days <= 0 && months <= 0)
        )
    ) {
        milliseconds += absCeil(monthsToDays(months) + days) * 864e5;
        days = 0;
        months = 0;
    }

    // The following code bubbles up values, see the tests for
    // examples of what that means.
    data.milliseconds = milliseconds % 1000;

    seconds = absFloor(milliseconds / 1000);
    data.seconds = seconds % 60;

    minutes = absFloor(seconds / 60);
    data.minutes = minutes % 60;

    hours = absFloor(minutes / 60);
    data.hours = hours % 24;

    days += absFloor(hours / 24);

    // convert days to months
    monthsFromDays = absFloor(daysToMonths(days));
    months += monthsFromDays;
    days -= absCeil(monthsToDays(monthsFromDays));

    // 12 months -> 1 year
    years = absFloor(months / 12);
    months %= 12;

    data.days = days;
    data.months = months;
    data.years = years;

    return this;
}

export function daysToMonths(days) {
    // 400 years have 146097 days (taking into account leap year rules)
    // 400 years have 12 months === 4800
    return (days * 4800) / 146097;
}

export function monthsToDays(months) {
    // the reverse of daysToMonths
    return (months * 146097) / 4800;
}
import { createDuration } from './create';

export function clone() {
    return createDuration(this);
}
import { normalizeObjectUnits } from '../units/aliases';
import { getLocale } from '../locale/locales';
import isDurationValid from './valid.js';

export function Duration(duration) {
    var normalizedInput = normalizeObjectUnits(duration),
        years = normalizedInput.year || 0,
        quarters = normalizedInput.quarter || 0,
        months = normalizedInput.month || 0,
        weeks = normalizedInput.week || normalizedInput.isoWeek || 0,
        days = normalizedInput.day || 0,
        hours = normalizedInput.hour || 0,
        minutes = normalizedInput.minute || 0,
        seconds = normalizedInput.second || 0,
        milliseconds = normalizedInput.millisecond || 0;

    this._isValid = isDurationValid(normalizedInput);

    // representation for dateAddRemove
    this._milliseconds =
        +milliseconds +
        seconds * 1e3 + // 1000
        minutes * 6e4 + // 1000 * 60
        hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
    // Because of dateAddRemove treats 24 hours as different from a
    // day when working around DST, we need to store them separately
    this._days = +days + weeks * 7;
    // It is impossible to translate months into days without knowing
    // which months you are are talking about, so we have to store
    // it separately.
    this._months = +months + quarters * 3 + years * 12;

    this._data = {};

    this._locale = getLocale();

    this._bubble();
}

export function isDuration(obj) {
    return obj instanceof Duration;
}
import { Duration, isDuration } from './constructor';
import isNumber from '../utils/is-number';
import toInt from '../utils/to-int';
import absRound from '../utils/abs-round';
import hasOwnProp from '../utils/has-own-prop';
import { DATE, HOUR, MINUTE, SECOND, MILLISECOND } from '../units/constants';
import { cloneWithOffset } from '../units/offset';
import { createLocal } from '../create/local';
import { createInvalid as invalid } from './valid';

// ASP.NET json date format regex
var aspNetRegex = /^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,
    // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
    // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
    // and further modified to allow for strings containing both week and day
    isoRegex =
        /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;

export function createDuration(input, key) {
    var duration = input,
        // matching against regexp is expensive, do it on demand
        match = null,
        sign,
        ret,
        diffRes;

    if (isDuration(input)) {
        duration = {
            ms: input._milliseconds,
            d: input._days,
            M: input._months,
        };
    } else if (isNumber(input) || !isNaN(+input)) {
        duration = {};
        if (key) {
            duration[key] = +input;
        } else {
            duration.milliseconds = +input;
        }
    } else if ((match = aspNetRegex.exec(input))) {
        sign = match[1] === '-' ? -1 : 1;
        duration = {
            y: 0,
            d: toInt(match[DATE]) * sign,
            h: toInt(match[HOUR]) * sign,
            m: toInt(match[MINUTE]) * sign,
            s: toInt(match[SECOND]) * sign,
            ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign, // the millisecond decimal point is included in the match
        };
    } else if ((match = isoRegex.exec(input))) {
        sign = match[1] === '-' ? -1 : 1;
        duration = {
            y: parseIso(match[2], sign),
            M: parseIso(match[3], sign),
            w: parseIso(match[4], sign),
            d: parseIso(match[5], sign),
            h: parseIso(match[6], sign),
            m: parseIso(match[7], sign),
            s: parseIso(match[8], sign),
        };
    } else if (duration == null) {
        // checks for null or undefined
        duration = {};
    } else if (
        typeof duration === 'object' &&
        ('from' in duration || 'to' in duration)
    ) {
        diffRes = momentsDifference(
            createLocal(duration.from),
            createLocal(duration.to)
        );

        duration = {};
        duration.ms = diffRes.milliseconds;
        duration.M = diffRes.months;
    }

    ret = new Duration(duration);

    if (isDuration(input) && hasOwnProp(input, '_locale')) {
        ret._locale = input._locale;
    }

    if (isDuration(input) && hasOwnProp(input, '_isValid')) {
        ret._isValid = input._isValid;
    }

    return ret;
}

createDuration.fn = Duration.prototype;
createDuration.invalid = invalid;

function parseIso(inp, sign) {
    // We'd normally use ~~inp for this, but unfortunately it also
    // converts floats to ints.
    // inp may be undefined, so careful calling replace on it.
    var res = inp && parseFloat(inp.replace(',', '.'));
    // apply sign while we're at it
    return (isNaN(res) ? 0 : res) * sign;
}

function positiveMomentsDifference(base, other) {
    var res = {};

    res.months =
        other.month() - base.month() + (other.year() - base.year()) * 12;
    if (base.clone().add(res.months, 'M').isAfter(other)) {
        --res.months;
    }

    res.milliseconds = +other - +base.clone().add(res.months, 'M');

    return res;
}

function momentsDifference(base, other) {
    var res;
    if (!(base.isValid() && other.isValid())) {
        return { milliseconds: 0, months: 0 };
    }

    other = cloneWithOffset(other, base);
    if (base.isBefore(other)) {
        res = positiveMomentsDifference(base, other);
    } else {
        res = positiveMomentsDifference(other, base);
        res.milliseconds = -res.milliseconds;
        res.months = -res.months;
    }

    return res;
}
// Side effect imports
import './prototype';

import { createDuration } from './create';
import { isDuration } from './constructor';
import {
    getSetRelativeTimeRounding,
    getSetRelativeTimeThreshold,
} from './humanize';

export {
    createDuration,
    isDuration,
    getSetRelativeTimeRounding,
    getSetRelativeTimeThreshold,
};
import { normalizeUnits } from '../units/aliases';
import absFloor from '../utils/abs-floor';

export function get(units) {
    units = normalizeUnits(units);
    return this.isValid() ? this[units + 's']() : NaN;
}

function makeGetter(name) {
    return function () {
        return this.isValid() ? this._data[name] : NaN;
    };
}

var milliseconds = makeGetter('milliseconds'),
    seconds = makeGetter('seconds'),
    minutes = makeGetter('minutes'),
    hours = makeGetter('hours'),
    days = makeGetter('days'),
    months = makeGetter('months'),
    years = makeGetter('years');

export { milliseconds, seconds, minutes, hours, days, months, years };

export function weeks() {
    return absFloor(this.days() / 7);
}
import { createDuration } from './create';

var round = Math.round,
    thresholds = {
        ss: 44, // a few seconds to seconds
        s: 45, // seconds to minute
        m: 45, // minutes to hour
        h: 22, // hours to day
        d: 26, // days to month/week
        w: null, // weeks to month
        M: 11, // months to year
    };

// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
    return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
}

function relativeTime(posNegDuration, withoutSuffix, thresholds, locale) {
    var duration = createDuration(posNegDuration).abs(),
        seconds = round(duration.as('s')),
        minutes = round(duration.as('m')),
        hours = round(duration.as('h')),
        days = round(duration.as('d')),
        months = round(duration.as('M')),
        weeks = round(duration.as('w')),
        years = round(duration.as('y')),
        a =
            (seconds <= thresholds.ss && ['s', seconds]) ||
            (seconds < thresholds.s && ['ss', seconds]) ||
            (minutes <= 1 && ['m']) ||
            (minutes < thresholds.m && ['mm', minutes]) ||
            (hours <= 1 && ['h']) ||
            (hours < thresholds.h && ['hh', hours]) ||
            (days <= 1 && ['d']) ||
            (days < thresholds.d && ['dd', days]);

    if (thresholds.w != null) {
        a =
            a ||
            (weeks <= 1 && ['w']) ||
            (weeks < thresholds.w && ['ww', weeks]);
    }
    a = a ||
        (months <= 1 && ['M']) ||
        (months < thresholds.M && ['MM', months]) ||
        (years <= 1 && ['y']) || ['yy', years];

    a[2] = withoutSuffix;
    a[3] = +posNegDuration > 0;
    a[4] = locale;
    return substituteTimeAgo.apply(null, a);
}

// This function allows you to set the rounding function for relative time strings
export function getSetRelativeTimeRounding(roundingFunction) {
    if (roundingFunction === undefined) {
        return round;
    }
    if (typeof roundingFunction === 'function') {
        round = roundingFunction;
        return true;
    }
    return false;
}

// This function allows you to set a threshold for relative time strings
export function getSetRelativeTimeThreshold(threshold, limit) {
    if (thresholds[threshold] === undefined) {
        return false;
    }
    if (limit === undefined) {
        return thresholds[threshold];
    }
    thresholds[threshold] = limit;
    if (threshold === 's') {
        thresholds.ss = limit - 1;
    }
    return true;
}

export function humanize(argWithSuffix, argThresholds) {
    if (!this.isValid()) {
        return this.localeData().invalidDate();
    }

    var withSuffix = false,
        th = thresholds,
        locale,
        output;

    if (typeof argWithSuffix === 'object') {
        argThresholds = argWithSuffix;
        argWithSuffix = false;
    }
    if (typeof argWithSuffix === 'boolean') {
        withSuffix = argWithSuffix;
    }
    if (typeof argThresholds === 'object') {
        th = Object.assign({}, thresholds, argThresholds);
        if (argThresholds.s != null && argThresholds.ss == null) {
            th.ss = argThresholds.s - 1;
        }
    }

    locale = this.localeData();
    output = relativeTime(this, !withSuffix, th, locale);

    if (withSuffix) {
        output = locale.pastFuture(+this, output);
    }

    return locale.postformat(output);
}
import absFloor from '../utils/abs-floor';
var abs = Math.abs;

function sign(x) {
    return (x > 0) - (x < 0) || +x;
}

export function toISOString() {
    // for ISO strings we do not use the normal bubbling rules:
    //  * milliseconds bubble up until they become hours
    //  * days do not bubble at all
    //  * months bubble up until they become years
    // This is because there is no context-free conversion between hours and days
    // (think of clock changes)
    // and also not between days and months (28-31 days per month)
    if (!this.isValid()) {
        return this.localeData().invalidDate();
    }

    var seconds = abs(this._milliseconds) / 1000,
        days = abs(this._days),
        months = abs(this._months),
        minutes,
        hours,
        years,
        s,
        total = this.asSeconds(),
        totalSign,
        ymSign,
        daysSign,
        hmsSign;

    if (!total) {
        // this is the same as C#'s (Noda) and python (isodate)...
        // but not other JS (goog.date)
        return 'P0D';
    }

    // 3600 seconds -> 60 minutes -> 1 hour
    minutes = absFloor(seconds / 60);
    hours = absFloor(minutes / 60);
    seconds %= 60;
    minutes %= 60;

    // 12 months -> 1 year
    years = absFloor(months / 12);
    months %= 12;

    // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
    s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : '';

    totalSign = total < 0 ? '-' : '';
    ymSign = sign(this._months) !== sign(total) ? '-' : '';
    daysSign = sign(this._days) !== sign(total) ? '-' : '';
    hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';

    return (
        totalSign +
        'P' +
        (years ? ymSign + years + 'Y' : '') +
        (months ? ymSign + months + 'M' : '') +
        (days ? daysSign + days + 'D' : '') +
        (hours || minutes || seconds ? 'T' : '') +
        (hours ? hmsSign + hours + 'H' : '') +
        (minutes ? hmsSign + minutes + 'M' : '') +
        (seconds ? hmsSign + s + 'S' : '')
    );
}
import { Duration } from './constructor';

var proto = Duration.prototype;

import { abs } from './abs';
import { add, subtract } from './add-subtract';
import {
    as,
    asMilliseconds,
    asSeconds,
    asMinutes,
    asHours,
    asDays,
    asWeeks,
    asMonths,
    asQuarters,
    asYears,
    valueOf,
} from './as';
import { bubble } from './bubble';
import { clone } from './clone';
import {
    get,
    milliseconds,
    seconds,
    minutes,
    hours,
    days,
    months,
    years,
    weeks,
} from './get';
import { humanize } from './humanize';
import { toISOString } from './iso-string';
import { lang, locale, localeData } from '../moment/locale';
import { isValid } from './valid';

proto.isValid = isValid;
proto.abs = abs;
proto.add = add;
proto.subtract = subtract;
proto.as = as;
proto.asMilliseconds = asMilliseconds;
proto.asSeconds = asSeconds;
proto.asMinutes = asMinutes;
proto.asHours = asHours;
proto.asDays = asDays;
proto.asWeeks = asWeeks;
proto.asMonths = asMonths;
proto.asQuarters = asQuarters;
proto.asYears = asYears;
proto.valueOf = valueOf;
proto._bubble = bubble;
proto.clone = clone;
proto.get = get;
proto.milliseconds = milliseconds;
proto.seconds = seconds;
proto.minutes = minutes;
proto.hours = hours;
proto.days = days;
proto.weeks = weeks;
proto.months = months;
proto.years = years;
proto.humanize = humanize;
proto.toISOString = toISOString;
proto.toString = toISOString;
proto.toJSON = toISOString;
proto.locale = locale;
proto.localeData = localeData;

// Deprecations
import { deprecate } from '../utils/deprecate';

proto.toIsoString = deprecate(
    'toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)',
    toISOString
);
proto.lang = lang;
import hasOwnProp from '../utils/has-own-prop';
import toInt from '../utils/to-int';
import indexOf from '../utils/index-of';
import { createDuration } from './create';

var ordering = [
    'year',
    'quarter',
    'month',
    'week',
    'day',
    'hour',
    'minute',
    'second',
    'millisecond',
];

export default function isDurationValid(m) {
    var key,
        unitHasDecimal = false,
        i,
        orderLen = ordering.length;
    for (key in m) {
        if (
            hasOwnProp(m, key) &&
            !(
                indexOf.call(ordering, key) !== -1 &&
                (m[key] == null || !isNaN(m[key]))
            )
        ) {
            return false;
        }
    }

    for (i = 0; i < orderLen; ++i) {
        if (m[ordering[i]]) {
            if (unitHasDecimal) {
                return false; // only allow non-integers for smallest unit
            }
            if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {
                unitHasDecimal = true;
            }
        }
    }

    return true;
}

export function isValid() {
    return this._isValid;
}

export function createInvalid() {
    return createDuration(NaN);
}
import { daysInMonth } from '../units/month';
import {
    YEAR,
    MONTH,
    DATE,
    HOUR,
    MINUTE,
    SECOND,
    MILLISECOND,
    WEEK,
    WEEKDAY,
} from '../units/constants';
import getParsingFlags from '../create/parsing-flags';

export default function checkOverflow(m) {
    var overflow,
        a = m._a;

    if (a && getParsingFlags(m).overflow === -2) {
        overflow =
            a[MONTH] < 0 || a[MONTH] > 11
                ? MONTH
                : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH])
                ? DATE
                : a[HOUR] < 0 ||
                  a[HOUR] > 24 ||
                  (a[HOUR] === 24 &&
                      (a[MINUTE] !== 0 ||
                          a[SECOND] !== 0 ||
                          a[MILLISECOND] !== 0))
                ? HOUR
                : a[MINUTE] < 0 || a[MINUTE] > 59
                ? MINUTE
                : a[SECOND] < 0 || a[SECOND] > 59
                ? SECOND
                : a[MILLISECOND] < 0 || a[MILLISECOND] > 999
                ? MILLISECOND
                : -1;

        if (
            getParsingFlags(m)._overflowDayOfYear &&
            (overflow < YEAR || overflow > DATE)
        ) {
            overflow = DATE;
        }
        if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
            overflow = WEEK;
        }
        if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
            overflow = WEEKDAY;
        }

        getParsingFlags(m).overflow = overflow;
    }

    return m;
}
export function createDate(y, m, d, h, M, s, ms) {
    // can't just apply() to create a date:
    // https://stackoverflow.com/q/181348
    var date;
    // the date constructor remaps years 0-99 to 1900-1999
    if (y < 100 && y >= 0) {
        // preserve leap years using a full 400 year cycle, then reset
        date = new Date(y + 400, m, d, h, M, s, ms);
        if (isFinite(date.getFullYear())) {
            date.setFullYear(y);
        }
    } else {
        date = new Date(y, m, d, h, M, s, ms);
    }

    return date;
}

export function createUTCDate(y) {
    var date, args;
    // the Date.UTC function remaps years 0-99 to 1900-1999
    if (y < 100 && y >= 0) {
        args = Array.prototype.slice.call(arguments);
        // preserve leap years using a full 400 year cycle, then reset
        args[0] = y + 400;
        date = new Date(Date.UTC.apply(null, args));
        if (isFinite(date.getUTCFullYear())) {
            date.setUTCFullYear(y);
        }
    } else {
        date = new Date(Date.UTC.apply(null, arguments));
    }

    return date;
}
import isArray from '../utils/is-array';
import isObject from '../utils/is-object';
import isObjectEmpty from '../utils/is-object-empty';
import isUndefined from '../utils/is-undefined';
import isNumber from '../utils/is-number';
import isDate from '../utils/is-date';
import map from '../utils/map';
import { createInvalid } from './valid';
import { Moment, isMoment } from '../moment/constructor';
import { getLocale } from '../locale/locales';
import { hooks } from '../utils/hooks';
import checkOverflow from './check-overflow';
import { isValid } from './valid';

import { configFromStringAndArray } from './from-string-and-array';
import { configFromStringAndFormat } from './from-string-and-format';
import { configFromString } from './from-string';
import { configFromArray } from './from-array';
import { configFromObject } from './from-object';

function createFromConfig(config) {
    var res = new Moment(checkOverflow(prepareConfig(config)));
    if (res._nextDay) {
        // Adding is smart enough around DST
        res.add(1, 'd');
        res._nextDay = undefined;
    }

    return res;
}

export function prepareConfig(config) {
    var input = config._i,
        format = config._f;

    config._locale = config._locale || getLocale(config._l);

    if (input === null || (format === undefined && input === '')) {
        return createInvalid({ nullInput: true });
    }

    if (typeof input === 'string') {
        config._i = input = config._locale.preparse(input);
    }

    if (isMoment(input)) {
        return new Moment(checkOverflow(input));
    } else if (isDate(input)) {
        config._d = input;
    } else if (isArray(format)) {
        configFromStringAndArray(config);
    } else if (format) {
        configFromStringAndFormat(config);
    } else {
        configFromInput(config);
    }

    if (!isValid(config)) {
        config._d = null;
    }

    return config;
}

function configFromInput(config) {
    var input = config._i;
    if (isUndefined(input)) {
        config._d = new Date(hooks.now());
    } else if (isDate(input)) {
        config._d = new Date(input.valueOf());
    } else if (typeof input === 'string') {
        configFromString(config);
    } else if (isArray(input)) {
        config._a = map(input.slice(0), function (obj) {
            return parseInt(obj, 10);
        });
        configFromArray(config);
    } else if (isObject(input)) {
        configFromObject(config);
    } else if (isNumber(input)) {
        // from milliseconds
        config._d = new Date(input);
    } else {
        hooks.createFromInputFallback(config);
    }
}

export function createLocalOrUTC(input, format, locale, strict, isUTC) {
    var c = {};

    if (format === true || format === false) {
        strict = format;
        format = undefined;
    }

    if (locale === true || locale === false) {
        strict = locale;
        locale = undefined;
    }

    if (
        (isObject(input) && isObjectEmpty(input)) ||
        (isArray(input) && input.length === 0)
    ) {
        input = undefined;
    }
    // object construction must be done this way.
    // https://github.com/moment/moment/issues/1423
    c._isAMomentObject = true;
    c._useUTC = c._isUTC = isUTC;
    c._l = locale;
    c._i = input;
    c._f = format;
    c._strict = strict;

    return createFromConfig(c);
}
import { hooks } from '../utils/hooks';
import { createDate, createUTCDate } from './date-from-array';
import { daysInYear } from '../units/year';
import {
    weekOfYear,
    weeksInYear,
    dayOfYearFromWeeks,
} from '../units/week-calendar-utils';
import {
    YEAR,
    MONTH,
    DATE,
    HOUR,
    MINUTE,
    SECOND,
    MILLISECOND,
} from '../units/constants';
import { createLocal } from './local';
import defaults from '../utils/defaults';
import getParsingFlags from './parsing-flags';

function currentDateArray(config) {
    // hooks is actually the exported moment object
    var nowValue = new Date(hooks.now());
    if (config._useUTC) {
        return [
            nowValue.getUTCFullYear(),
            nowValue.getUTCMonth(),
            nowValue.getUTCDate(),
        ];
    }
    return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];
}

// convert an array to a date.
// the array should mirror the parameters below
// note: all values past the year are optional and will default to the lowest possible value.
// [year, month, day , hour, minute, second, millisecond]
export function configFromArray(config) {
    var i,
        date,
        input = [],
        currentDate,
        expectedWeekday,
        yearToUse;

    if (config._d) {
        return;
    }

    currentDate = currentDateArray(config);

    //compute day of the year from weeks and weekdays
    if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
        dayOfYearFromWeekInfo(config);
    }

    //if the day of the year is set, figure out what it is
    if (config._dayOfYear != null) {
        yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);

        if (
            config._dayOfYear > daysInYear(yearToUse) ||
            config._dayOfYear === 0
        ) {
            getParsingFlags(config)._overflowDayOfYear = true;
        }

        date = createUTCDate(yearToUse, 0, config._dayOfYear);
        config._a[MONTH] = date.getUTCMonth();
        config._a[DATE] = date.getUTCDate();
    }

    // Default to current date.
    // * if no year, month, day of month are given, default to today
    // * if day of month is given, default month and year
    // * if month is given, default only year
    // * if year is given, don't default anything
    for (i = 0; i < 3 && config._a[i] == null; ++i) {
        config._a[i] = input[i] = currentDate[i];
    }

    // Zero out whatever was not defaulted, including time
    for (; i < 7; i++) {
        config._a[i] = input[i] =
            config._a[i] == null ? (i === 2 ? 1 : 0) : config._a[i];
    }

    // Check for 24:00:00.000
    if (
        config._a[HOUR] === 24 &&
        config._a[MINUTE] === 0 &&
        config._a[SECOND] === 0 &&
        config._a[MILLISECOND] === 0
    ) {
        config._nextDay = true;
        config._a[HOUR] = 0;
    }

    config._d = (config._useUTC ? createUTCDate : createDate).apply(
        null,
        input
    );
    expectedWeekday = config._useUTC
        ? config._d.getUTCDay()
        : config._d.getDay();

    // Apply timezone offset from input. The actual utcOffset can be changed
    // with parseZone.
    if (config._tzm != null) {
        config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
    }

    if (config._nextDay) {
        config._a[HOUR] = 24;
    }

    // check for mismatching day of week
    if (
        config._w &&
        typeof config._w.d !== 'undefined' &&
        config._w.d !== expectedWeekday
    ) {
        getParsingFlags(config).weekdayMismatch = true;
    }
}

function dayOfYearFromWeekInfo(config) {
    var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek;

    w = config._w;
    if (w.GG != null || w.W != null || w.E != null) {
        dow = 1;
        doy = 4;

        // TODO: We need to take the current isoWeekYear, but that depends on
        // how we interpret now (local, utc, fixed offset). So create
        // a now version of current config (take local/utc/offset flags, and
        // create now).
        weekYear = defaults(
            w.GG,
            config._a[YEAR],
            weekOfYear(createLocal(), 1, 4).year
        );
        week = defaults(w.W, 1);
        weekday = defaults(w.E, 1);
        if (weekday < 1 || weekday > 7) {
            weekdayOverflow = true;
        }
    } else {
        dow = config._locale._week.dow;
        doy = config._locale._week.doy;

        curWeek = weekOfYear(createLocal(), dow, doy);

        weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);

        // Default to current week.
        week = defaults(w.w, curWeek.week);

        if (w.d != null) {
            // weekday -- low day numbers are considered next week
            weekday = w.d;
            if (weekday < 0 || weekday > 6) {
                weekdayOverflow = true;
            }
        } else if (w.e != null) {
            // local weekday -- counting starts from beginning of week
            weekday = w.e + dow;
            if (w.e < 0 || w.e > 6) {
                weekdayOverflow = true;
            }
        } else {
            // default to beginning of week
            weekday = dow;
        }
    }
    if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {
        getParsingFlags(config)._overflowWeeks = true;
    } else if (weekdayOverflow != null) {
        getParsingFlags(config)._overflowWeekday = true;
    } else {
        temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);
        config._a[YEAR] = temp.year;
        config._dayOfYear = temp.dayOfYear;
    }
}
import { normalizeObjectUnits } from '../units/aliases';
import { configFromArray } from './from-array';
import map from '../utils/map';

export function configFromObject(config) {
    if (config._d) {
        return;
    }

    var i = normalizeObjectUnits(config._i),
        dayOrDate = i.day === undefined ? i.date : i.day;
    config._a = map(
        [i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond],
        function (obj) {
            return obj && parseInt(obj, 10);
        }
    );

    configFromArray(config);
}
import { copyConfig } from '../moment/constructor';
import { configFromStringAndFormat } from './from-string-and-format';
import getParsingFlags from './parsing-flags';
import { isValid } from './valid';
import extend from '../utils/extend';

// date from string and array of format strings
export function configFromStringAndArray(config) {
    var tempConfig,
        bestMoment,
        scoreToBeat,
        i,
        currentScore,
        validFormatFound,
        bestFormatIsValid = false,
        configfLen = config._f.length;

    if (configfLen === 0) {
        getParsingFlags(config).invalidFormat = true;
        config._d = new Date(NaN);
        return;
    }

    for (i = 0; i < configfLen; i++) {
        currentScore = 0;
        validFormatFound = false;
        tempConfig = copyConfig({}, config);
        if (config._useUTC != null) {
            tempConfig._useUTC = config._useUTC;
        }
        tempConfig._f = config._f[i];
        configFromStringAndFormat(tempConfig);

        if (isValid(tempConfig)) {
            validFormatFound = true;
        }

        // if there is any input that was not parsed add a penalty for that format
        currentScore += getParsingFlags(tempConfig).charsLeftOver;

        //or tokens
        currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;

        getParsingFlags(tempConfig).score = currentScore;

        if (!bestFormatIsValid) {
            if (
                scoreToBeat == null ||
                currentScore < scoreToBeat ||
                validFormatFound
            ) {
                scoreToBeat = currentScore;
                bestMoment = tempConfig;
                if (validFormatFound) {
                    bestFormatIsValid = true;
                }
            }
        } else {
            if (currentScore < scoreToBeat) {
                scoreToBeat = currentScore;
                bestMoment = tempConfig;
            }
        }
    }

    extend(config, bestMoment || tempConfig);
}
import { configFromISO, configFromRFC2822 } from './from-string';
import { configFromArray } from './from-array';
import { getParseRegexForToken } from '../parse/regex';
import { addTimeToArrayFromToken } from '../parse/token';
import {
    expandFormat,
    formatTokenFunctions,
    formattingTokens,
} from '../format/format';
import checkOverflow from './check-overflow';
import { YEAR, HOUR } from '../units/constants';
import { hooks } from '../utils/hooks';
import getParsingFlags from './parsing-flags';

// constant that refers to the ISO standard
hooks.ISO_8601 = function () {};

// constant that refers to the RFC 2822 form
hooks.RFC_2822 = function () {};

// date from string and format string
export function configFromStringAndFormat(config) {
    // TODO: Move this to another part of the creation flow to prevent circular deps
    if (config._f === hooks.ISO_8601) {
        configFromISO(config);
        return;
    }
    if (config._f === hooks.RFC_2822) {
        configFromRFC2822(config);
        return;
    }
    config._a = [];
    getParsingFlags(config).empty = true;

    // This array is used to make a Date, either with `new Date` or `Date.UTC`
    var string = '' + config._i,
        i,
        parsedInput,
        tokens,
        token,
        skipped,
        stringLength = string.length,
        totalParsedInputLength = 0,
        era,
        tokenLen;

    tokens =
        expandFormat(config._f, config._locale).match(formattingTokens) || [];
    tokenLen = tokens.length;
    for (i = 0; i < tokenLen; i++) {
        token = tokens[i];
        parsedInput = (string.match(getParseRegexForToken(token, config)) ||
            [])[0];
        if (parsedInput) {
            skipped = string.substr(0, string.indexOf(parsedInput));
            if (skipped.length > 0) {
                getParsingFlags(config).unusedInput.push(skipped);
            }
            string = string.slice(
                string.indexOf(parsedInput) + parsedInput.length
            );
            totalParsedInputLength += parsedInput.length;
        }
        // don't parse if it's not a known token
        if (formatTokenFunctions[token]) {
            if (parsedInput) {
                getParsingFlags(config).empty = false;
            } else {
                getParsingFlags(config).unusedTokens.push(token);
            }
            addTimeToArrayFromToken(token, parsedInput, config);
        } else if (config._strict && !parsedInput) {
            getParsingFlags(config).unusedTokens.push(token);
        }
    }

    // add remaining unparsed input length to the string
    getParsingFlags(config).charsLeftOver =
        stringLength - totalParsedInputLength;
    if (string.length > 0) {
        getParsingFlags(config).unusedInput.push(string);
    }

    // clear _12h flag if hour is <= 12
    if (
        config._a[HOUR] <= 12 &&
        getParsingFlags(config).bigHour === true &&
        config._a[HOUR] > 0
    ) {
        getParsingFlags(config).bigHour = undefined;
    }

    getParsingFlags(config).parsedDateParts = config._a.slice(0);
    getParsingFlags(config).meridiem = config._meridiem;
    // handle meridiem
    config._a[HOUR] = meridiemFixWrap(
        config._locale,
        config._a[HOUR],
        config._meridiem
    );

    // handle era
    era = getParsingFlags(config).era;
    if (era !== null) {
        config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]);
    }

    configFromArray(config);
    checkOverflow(config);
}

function meridiemFixWrap(locale, hour, meridiem) {
    var isPm;

    if (meridiem == null) {
        // nothing to do
        return hour;
    }
    if (locale.meridiemHour != null) {
        return locale.meridiemHour(hour, meridiem);
    } else if (locale.isPM != null) {
        // Fallback
        isPm = locale.isPM(meridiem);
        if (isPm && hour < 12) {
            hour += 12;
        }
        if (!isPm && hour === 12) {
            hour = 0;
        }
        return hour;
    } else {
        // this is not supposed to happen
        return hour;
    }
}
import { configFromStringAndFormat } from './from-string-and-format';
import { createUTCDate } from './date-from-array';
import { hooks } from '../utils/hooks';
import { deprecate } from '../utils/deprecate';
import getParsingFlags from './parsing-flags';
import { defaultLocaleMonthsShort } from '../units/month';
import { defaultLocaleWeekdaysShort } from '../units/day-of-week';

// iso 8601 regex
// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
var extendedIsoRegex =
        /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
    basicIsoRegex =
        /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
    tzRegex = /Z|[+-]\d\d(?::?\d\d)?/,
    isoDates = [
        ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
        ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/],
        ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/],
        ['GGGG-[W]WW', /\d{4}-W\d\d/, false],
        ['YYYY-DDD', /\d{4}-\d{3}/],
        ['YYYY-MM', /\d{4}-\d\d/, false],
        ['YYYYYYMMDD', /[+-]\d{10}/],
        ['YYYYMMDD', /\d{8}/],
        ['GGGG[W]WWE', /\d{4}W\d{3}/],
        ['GGGG[W]WW', /\d{4}W\d{2}/, false],
        ['YYYYDDD', /\d{7}/],
        ['YYYYMM', /\d{6}/, false],
        ['YYYY', /\d{4}/, false],
    ],
    // iso time formats and regexes
    isoTimes = [
        ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/],
        ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/],
        ['HH:mm:ss', /\d\d:\d\d:\d\d/],
        ['HH:mm', /\d\d:\d\d/],
        ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/],
        ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/],
        ['HHmmss', /\d\d\d\d\d\d/],
        ['HHmm', /\d\d\d\d/],
        ['HH', /\d\d/],
    ],
    aspNetJsonRegex = /^\/?Date\((-?\d+)/i,
    // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3
    rfc2822 =
        /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,
    obsOffsets = {
        UT: 0,
        GMT: 0,
        EDT: -4 * 60,
        EST: -5 * 60,
        CDT: -5 * 60,
        CST: -6 * 60,
        MDT: -6 * 60,
        MST: -7 * 60,
        PDT: -7 * 60,
        PST: -8 * 60,
    };

// date from iso format
export function configFromISO(config) {
    var i,
        l,
        string = config._i,
        match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),
        allowTime,
        dateFormat,
        timeFormat,
        tzFormat,
        isoDatesLen = isoDates.length,
        isoTimesLen = isoTimes.length;

    if (match) {
        getParsingFlags(config).iso = true;
        for (i = 0, l = isoDatesLen; i < l; i++) {
            if (isoDates[i][1].exec(match[1])) {
                dateFormat = isoDates[i][0];
                allowTime = isoDates[i][2] !== false;
                break;
            }
        }
        if (dateFormat == null) {
            config._isValid = false;
            return;
        }
        if (match[3]) {
            for (i = 0, l = isoTimesLen; i < l; i++) {
                if (isoTimes[i][1].exec(match[3])) {
                    // match[2] should be 'T' or space
                    timeFormat = (match[2] || ' ') + isoTimes[i][0];
                    break;
                }
            }
            if (timeFormat == null) {
                config._isValid = false;
                return;
            }
        }
        if (!allowTime && timeFormat != null) {
            config._isValid = false;
            return;
        }
        if (match[4]) {
            if (tzRegex.exec(match[4])) {
                tzFormat = 'Z';
            } else {
                config._isValid = false;
                return;
            }
        }
        config._f = dateFormat + (timeFormat || '') + (tzFormat || '');
        configFromStringAndFormat(config);
    } else {
        config._isValid = false;
    }
}

function extractFromRFC2822Strings(
    yearStr,
    monthStr,
    dayStr,
    hourStr,
    minuteStr,
    secondStr
) {
    var result = [
        untruncateYear(yearStr),
        defaultLocaleMonthsShort.indexOf(monthStr),
        parseInt(dayStr, 10),
        parseInt(hourStr, 10),
        parseInt(minuteStr, 10),
    ];

    if (secondStr) {
        result.push(parseInt(secondStr, 10));
    }

    return result;
}

function untruncateYear(yearStr) {
    var year = parseInt(yearStr, 10);
    if (year <= 49) {
        return 2000 + year;
    } else if (year <= 999) {
        return 1900 + year;
    }
    return year;
}

function preprocessRFC2822(s) {
    // Remove comments and folding whitespace and replace multiple-spaces with a single space
    return s
        .replace(/\([^()]*\)|[\n\t]/g, ' ')
        .replace(/(\s\s+)/g, ' ')
        .replace(/^\s\s*/, '')
        .replace(/\s\s*$/, '');
}

function checkWeekday(weekdayStr, parsedInput, config) {
    if (weekdayStr) {
        // TODO: Replace the vanilla JS Date object with an independent day-of-week check.
        var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),
            weekdayActual = new Date(
                parsedInput[0],
                parsedInput[1],
                parsedInput[2]
            ).getDay();
        if (weekdayProvided !== weekdayActual) {
            getParsingFlags(config).weekdayMismatch = true;
            config._isValid = false;
            return false;
        }
    }
    return true;
}

function calculateOffset(obsOffset, militaryOffset, numOffset) {
    if (obsOffset) {
        return obsOffsets[obsOffset];
    } else if (militaryOffset) {
        // the only allowed military tz is Z
        return 0;
    } else {
        var hm = parseInt(numOffset, 10),
            m = hm % 100,
            h = (hm - m) / 100;
        return h * 60 + m;
    }
}

// date and time from ref 2822 format
export function configFromRFC2822(config) {
    var match = rfc2822.exec(preprocessRFC2822(config._i)),
        parsedArray;
    if (match) {
        parsedArray = extractFromRFC2822Strings(
            match[4],
            match[3],
            match[2],
            match[5],
            match[6],
            match[7]
        );
        if (!checkWeekday(match[1], parsedArray, config)) {
            return;
        }

        config._a = parsedArray;
        config._tzm = calculateOffset(match[8], match[9], match[10]);

        config._d = createUTCDate.apply(null, config._a);
        config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);

        getParsingFlags(config).rfc2822 = true;
    } else {
        config._isValid = false;
    }
}

// date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict
export function configFromString(config) {
    var matched = aspNetJsonRegex.exec(config._i);
    if (matched !== null) {
        config._d = new Date(+matched[1]);
        return;
    }

    configFromISO(config);
    if (config._isValid === false) {
        delete config._isValid;
    } else {
        return;
    }

    configFromRFC2822(config);
    if (config._isValid === false) {
        delete config._isValid;
    } else {
        return;
    }

    if (config._strict) {
        config._isValid = false;
    } else {
        // Final attempt, use Input Fallback
        hooks.createFromInputFallback(config);
    }
}

hooks.createFromInputFallback = deprecate(
    'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +
        'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +
        'discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.',
    function (config) {
        config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
    }
);
import { createLocalOrUTC } from './from-anything';

export function createLocal(input, format, locale, strict) {
    return createLocalOrUTC(input, format, locale, strict, false);
}
function defaultParsingFlags() {
    // We need to deep clone this object.
    return {
        empty: false,
        unusedTokens: [],
        unusedInput: [],
        overflow: -2,
        charsLeftOver: 0,
        nullInput: false,
        invalidEra: null,
        invalidMonth: null,
        invalidFormat: false,
        userInvalidated: false,
        iso: false,
        parsedDateParts: [],
        era: null,
        meridiem: null,
        rfc2822: false,
        weekdayMismatch: false,
    };
}

export default function getParsingFlags(m) {
    if (m._pf == null) {
        m._pf = defaultParsingFlags();
    }
    return m._pf;
}
import { createLocalOrUTC } from './from-anything';

export function createUTC(input, format, locale, strict) {
    return createLocalOrUTC(input, format, locale, strict, true).utc();
}
import extend from '../utils/extend';
import { createUTC } from './utc';
import getParsingFlags from '../create/parsing-flags';
import some from '../utils/some';

export function isValid(m) {
    if (m._isValid == null) {
        var flags = getParsingFlags(m),
            parsedParts = some.call(flags.parsedDateParts, function (i) {
                return i != null;
            }),
            isNowValid =
                !isNaN(m._d.getTime()) &&
                flags.overflow < 0 &&
                !flags.empty &&
                !flags.invalidEra &&
                !flags.invalidMonth &&
                !flags.invalidWeekday &&
                !flags.weekdayMismatch &&
                !flags.nullInput &&
                !flags.invalidFormat &&
                !flags.userInvalidated &&
                (!flags.meridiem || (flags.meridiem && parsedParts));

        if (m._strict) {
            isNowValid =
                isNowValid &&
                flags.charsLeftOver === 0 &&
                flags.unusedTokens.length === 0 &&
                flags.bigHour === undefined;
        }

        if (Object.isFrozen == null || !Object.isFrozen(m)) {
            m._isValid = isNowValid;
        } else {
            return isNowValid;
        }
    }
    return m._isValid;
}

export function createInvalid(flags) {
    var m = createUTC(NaN);
    if (flags != null) {
        extend(getParsingFlags(m), flags);
    } else {
        getParsingFlags(m).userInvalidated = true;
    }

    return m;
}
;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    moment.defineLocale('af', {
        months: 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'),
        weekdays: 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split(
            '_'
        ),
        weekdaysShort: 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'),
        weekdaysMin: 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'),
        meridiemParse: /vm|nm/i,
        isPM: function (input) {
            return /^nm$/i.test(input);
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours < 12) {
                return isLower ? 'vm' : 'VM';
            } else {
                return isLower ? 'nm' : 'NM';
            }
        },
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Vandag om] LT',
            nextDay: '[Môre om] LT',
            nextWeek: 'dddd [om] LT',
            lastDay: '[Gister om] LT',
            lastWeek: '[Laas] dddd [om] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'oor %s',
            past: '%s gelede',
            s: "'n paar sekondes",
            ss: '%d sekondes',
            m: "'n minuut",
            mm: '%d minute',
            h: "'n uur",
            hh: '%d ure',
            d: "'n dag",
            dd: '%d dae',
            M: "'n maand",
            MM: '%d maande',
            y: "'n jaar",
            yy: '%d jaar',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/,
        ordinal: function (number) {
            return (
                number +
                (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')
            ); // Thanks to Joris Röling : https://github.com/jjupiter
        },
        week: {
            dow: 1, // Maandag is die eerste dag van die week.
            doy: 4, // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
        },
    });

    //! moment.js locale configuration

    var pluralForm = function (n) {
            return n === 0
                ? 0
                : n === 1
                ? 1
                : n === 2
                ? 2
                : n % 100 >= 3 && n % 100 <= 10
                ? 3
                : n % 100 >= 11
                ? 4
                : 5;
        },
        plurals = {
            s: [
                'أقل من ثانية',
                'ثانية واحدة',
                ['ثانيتان', 'ثانيتين'],
                '%d ثوان',
                '%d ثانية',
                '%d ثانية',
            ],
            m: [
                'أقل من دقيقة',
                'دقيقة واحدة',
                ['دقيقتان', 'دقيقتين'],
                '%d دقائق',
                '%d دقيقة',
                '%d دقيقة',
            ],
            h: [
                'أقل من ساعة',
                'ساعة واحدة',
                ['ساعتان', 'ساعتين'],
                '%d ساعات',
                '%d ساعة',
                '%d ساعة',
            ],
            d: [
                'أقل من يوم',
                'يوم واحد',
                ['يومان', 'يومين'],
                '%d أيام',
                '%d يومًا',
                '%d يوم',
            ],
            M: [
                'أقل من شهر',
                'شهر واحد',
                ['شهران', 'شهرين'],
                '%d أشهر',
                '%d شهرا',
                '%d شهر',
            ],
            y: [
                'أقل من عام',
                'عام واحد',
                ['عامان', 'عامين'],
                '%d أعوام',
                '%d عامًا',
                '%d عام',
            ],
        },
        pluralize = function (u) {
            return function (number, withoutSuffix, string, isFuture) {
                var f = pluralForm(number),
                    str = plurals[u][pluralForm(number)];
                if (f === 2) {
                    str = str[withoutSuffix ? 0 : 1];
                }
                return str.replace(/%d/i, number);
            };
        },
        months = [
            'جانفي',
            'فيفري',
            'مارس',
            'أفريل',
            'ماي',
            'جوان',
            'جويلية',
            'أوت',
            'سبتمبر',
            'أكتوبر',
            'نوفمبر',
            'ديسمبر',
        ];

    moment.defineLocale('ar-dz', {
        months: months,
        monthsShort: months,
        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'D/\u200FM/\u200FYYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        meridiemParse: /ص|م/,
        isPM: function (input) {
            return 'م' === input;
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'ص';
            } else {
                return 'م';
            }
        },
        calendar: {
            sameDay: '[اليوم عند الساعة] LT',
            nextDay: '[غدًا عند الساعة] LT',
            nextWeek: 'dddd [عند الساعة] LT',
            lastDay: '[أمس عند الساعة] LT',
            lastWeek: 'dddd [عند الساعة] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'بعد %s',
            past: 'منذ %s',
            s: pluralize('s'),
            ss: pluralize('s'),
            m: pluralize('m'),
            mm: pluralize('m'),
            h: pluralize('h'),
            hh: pluralize('h'),
            d: pluralize('d'),
            dd: pluralize('d'),
            M: pluralize('M'),
            MM: pluralize('M'),
            y: pluralize('y'),
            yy: pluralize('y'),
        },
        postformat: function (string) {
            return string.replace(/,/g, '،');
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('ar-kw', {
        months: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(
            '_'
        ),
        monthsShort:
            'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(
                '_'
            ),
        weekdays: 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
        weekdaysShort: 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[اليوم على الساعة] LT',
            nextDay: '[غدا على الساعة] LT',
            nextWeek: 'dddd [على الساعة] LT',
            lastDay: '[أمس على الساعة] LT',
            lastWeek: 'dddd [على الساعة] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'في %s',
            past: 'منذ %s',
            s: 'ثوان',
            ss: '%d ثانية',
            m: 'دقيقة',
            mm: '%d دقائق',
            h: 'ساعة',
            hh: '%d ساعات',
            d: 'يوم',
            dd: '%d أيام',
            M: 'شهر',
            MM: '%d أشهر',
            y: 'سنة',
            yy: '%d سنوات',
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 12, // The week that contains Jan 12th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var symbolMap = {
            1: '1',
            2: '2',
            3: '3',
            4: '4',
            5: '5',
            6: '6',
            7: '7',
            8: '8',
            9: '9',
            0: '0',
        },
        pluralForm$1 = function (n) {
            return n === 0
                ? 0
                : n === 1
                ? 1
                : n === 2
                ? 2
                : n % 100 >= 3 && n % 100 <= 10
                ? 3
                : n % 100 >= 11
                ? 4
                : 5;
        },
        plurals$1 = {
            s: [
                'أقل من ثانية',
                'ثانية واحدة',
                ['ثانيتان', 'ثانيتين'],
                '%d ثوان',
                '%d ثانية',
                '%d ثانية',
            ],
            m: [
                'أقل من دقيقة',
                'دقيقة واحدة',
                ['دقيقتان', 'دقيقتين'],
                '%d دقائق',
                '%d دقيقة',
                '%d دقيقة',
            ],
            h: [
                'أقل من ساعة',
                'ساعة واحدة',
                ['ساعتان', 'ساعتين'],
                '%d ساعات',
                '%d ساعة',
                '%d ساعة',
            ],
            d: [
                'أقل من يوم',
                'يوم واحد',
                ['يومان', 'يومين'],
                '%d أيام',
                '%d يومًا',
                '%d يوم',
            ],
            M: [
                'أقل من شهر',
                'شهر واحد',
                ['شهران', 'شهرين'],
                '%d أشهر',
                '%d شهرا',
                '%d شهر',
            ],
            y: [
                'أقل من عام',
                'عام واحد',
                ['عامان', 'عامين'],
                '%d أعوام',
                '%d عامًا',
                '%d عام',
            ],
        },
        pluralize$1 = function (u) {
            return function (number, withoutSuffix, string, isFuture) {
                var f = pluralForm$1(number),
                    str = plurals$1[u][pluralForm$1(number)];
                if (f === 2) {
                    str = str[withoutSuffix ? 0 : 1];
                }
                return str.replace(/%d/i, number);
            };
        },
        months$1 = [
            'يناير',
            'فبراير',
            'مارس',
            'أبريل',
            'مايو',
            'يونيو',
            'يوليو',
            'أغسطس',
            'سبتمبر',
            'أكتوبر',
            'نوفمبر',
            'ديسمبر',
        ];

    moment.defineLocale('ar-ly', {
        months: months$1,
        monthsShort: months$1,
        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'D/\u200FM/\u200FYYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        meridiemParse: /ص|م/,
        isPM: function (input) {
            return 'م' === input;
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'ص';
            } else {
                return 'م';
            }
        },
        calendar: {
            sameDay: '[اليوم عند الساعة] LT',
            nextDay: '[غدًا عند الساعة] LT',
            nextWeek: 'dddd [عند الساعة] LT',
            lastDay: '[أمس عند الساعة] LT',
            lastWeek: 'dddd [عند الساعة] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'بعد %s',
            past: 'منذ %s',
            s: pluralize$1('s'),
            ss: pluralize$1('s'),
            m: pluralize$1('m'),
            mm: pluralize$1('m'),
            h: pluralize$1('h'),
            hh: pluralize$1('h'),
            d: pluralize$1('d'),
            dd: pluralize$1('d'),
            M: pluralize$1('M'),
            MM: pluralize$1('M'),
            y: pluralize$1('y'),
            yy: pluralize$1('y'),
        },
        preparse: function (string) {
            return string.replace(/،/g, ',');
        },
        postformat: function (string) {
            return string
                .replace(/\d/g, function (match) {
                    return symbolMap[match];
                })
                .replace(/,/g, '،');
        },
        week: {
            dow: 6, // Saturday is the first day of the week.
            doy: 12, // The week that contains Jan 12th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('ar-ma', {
        months: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(
            '_'
        ),
        monthsShort:
            'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(
                '_'
            ),
        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
        weekdaysShort: 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[اليوم على الساعة] LT',
            nextDay: '[غدا على الساعة] LT',
            nextWeek: 'dddd [على الساعة] LT',
            lastDay: '[أمس على الساعة] LT',
            lastWeek: 'dddd [على الساعة] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'في %s',
            past: 'منذ %s',
            s: 'ثوان',
            ss: '%d ثانية',
            m: 'دقيقة',
            mm: '%d دقائق',
            h: 'ساعة',
            hh: '%d ساعات',
            d: 'يوم',
            dd: '%d أيام',
            M: 'شهر',
            MM: '%d أشهر',
            y: 'سنة',
            yy: '%d سنوات',
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var symbolMap$1 = {
            1: '١',
            2: '٢',
            3: '٣',
            4: '٤',
            5: '٥',
            6: '٦',
            7: '٧',
            8: '٨',
            9: '٩',
            0: '٠',
        },
        numberMap = {
            '١': '1',
            '٢': '2',
            '٣': '3',
            '٤': '4',
            '٥': '5',
            '٦': '6',
            '٧': '7',
            '٨': '8',
            '٩': '9',
            '٠': '0',
        };

    moment.defineLocale('ar-sa', {
        months: 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(
            '_'
        ),
        monthsShort:
            'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(
                '_'
            ),
        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        meridiemParse: /ص|م/,
        isPM: function (input) {
            return 'م' === input;
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'ص';
            } else {
                return 'م';
            }
        },
        calendar: {
            sameDay: '[اليوم على الساعة] LT',
            nextDay: '[غدا على الساعة] LT',
            nextWeek: 'dddd [على الساعة] LT',
            lastDay: '[أمس على الساعة] LT',
            lastWeek: 'dddd [على الساعة] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'في %s',
            past: 'منذ %s',
            s: 'ثوان',
            ss: '%d ثانية',
            m: 'دقيقة',
            mm: '%d دقائق',
            h: 'ساعة',
            hh: '%d ساعات',
            d: 'يوم',
            dd: '%d أيام',
            M: 'شهر',
            MM: '%d أشهر',
            y: 'سنة',
            yy: '%d سنوات',
        },
        preparse: function (string) {
            return string
                .replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
                    return numberMap[match];
                })
                .replace(/،/g, ',');
        },
        postformat: function (string) {
            return string
                .replace(/\d/g, function (match) {
                    return symbolMap$1[match];
                })
                .replace(/,/g, '،');
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('ar-tn', {
        months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(
            '_'
        ),
        monthsShort:
            'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(
                '_'
            ),
        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[اليوم على الساعة] LT',
            nextDay: '[غدا على الساعة] LT',
            nextWeek: 'dddd [على الساعة] LT',
            lastDay: '[أمس على الساعة] LT',
            lastWeek: 'dddd [على الساعة] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'في %s',
            past: 'منذ %s',
            s: 'ثوان',
            ss: '%d ثانية',
            m: 'دقيقة',
            mm: '%d دقائق',
            h: 'ساعة',
            hh: '%d ساعات',
            d: 'يوم',
            dd: '%d أيام',
            M: 'شهر',
            MM: '%d أشهر',
            y: 'سنة',
            yy: '%d سنوات',
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var symbolMap$2 = {
            1: '١',
            2: '٢',
            3: '٣',
            4: '٤',
            5: '٥',
            6: '٦',
            7: '٧',
            8: '٨',
            9: '٩',
            0: '٠',
        },
        numberMap$1 = {
            '١': '1',
            '٢': '2',
            '٣': '3',
            '٤': '4',
            '٥': '5',
            '٦': '6',
            '٧': '7',
            '٨': '8',
            '٩': '9',
            '٠': '0',
        },
        pluralForm$2 = function (n) {
            return n === 0
                ? 0
                : n === 1
                ? 1
                : n === 2
                ? 2
                : n % 100 >= 3 && n % 100 <= 10
                ? 3
                : n % 100 >= 11
                ? 4
                : 5;
        },
        plurals$2 = {
            s: [
                'أقل من ثانية',
                'ثانية واحدة',
                ['ثانيتان', 'ثانيتين'],
                '%d ثوان',
                '%d ثانية',
                '%d ثانية',
            ],
            m: [
                'أقل من دقيقة',
                'دقيقة واحدة',
                ['دقيقتان', 'دقيقتين'],
                '%d دقائق',
                '%d دقيقة',
                '%d دقيقة',
            ],
            h: [
                'أقل من ساعة',
                'ساعة واحدة',
                ['ساعتان', 'ساعتين'],
                '%d ساعات',
                '%d ساعة',
                '%d ساعة',
            ],
            d: [
                'أقل من يوم',
                'يوم واحد',
                ['يومان', 'يومين'],
                '%d أيام',
                '%d يومًا',
                '%d يوم',
            ],
            M: [
                'أقل من شهر',
                'شهر واحد',
                ['شهران', 'شهرين'],
                '%d أشهر',
                '%d شهرا',
                '%d شهر',
            ],
            y: [
                'أقل من عام',
                'عام واحد',
                ['عامان', 'عامين'],
                '%d أعوام',
                '%d عامًا',
                '%d عام',
            ],
        },
        pluralize$2 = function (u) {
            return function (number, withoutSuffix, string, isFuture) {
                var f = pluralForm$2(number),
                    str = plurals$2[u][pluralForm$2(number)];
                if (f === 2) {
                    str = str[withoutSuffix ? 0 : 1];
                }
                return str.replace(/%d/i, number);
            };
        },
        months$2 = [
            'يناير',
            'فبراير',
            'مارس',
            'أبريل',
            'مايو',
            'يونيو',
            'يوليو',
            'أغسطس',
            'سبتمبر',
            'أكتوبر',
            'نوفمبر',
            'ديسمبر',
        ];

    moment.defineLocale('ar', {
        months: months$2,
        monthsShort: months$2,
        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'D/\u200FM/\u200FYYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        meridiemParse: /ص|م/,
        isPM: function (input) {
            return 'م' === input;
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'ص';
            } else {
                return 'م';
            }
        },
        calendar: {
            sameDay: '[اليوم عند الساعة] LT',
            nextDay: '[غدًا عند الساعة] LT',
            nextWeek: 'dddd [عند الساعة] LT',
            lastDay: '[أمس عند الساعة] LT',
            lastWeek: 'dddd [عند الساعة] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'بعد %s',
            past: 'منذ %s',
            s: pluralize$2('s'),
            ss: pluralize$2('s'),
            m: pluralize$2('m'),
            mm: pluralize$2('m'),
            h: pluralize$2('h'),
            hh: pluralize$2('h'),
            d: pluralize$2('d'),
            dd: pluralize$2('d'),
            M: pluralize$2('M'),
            MM: pluralize$2('M'),
            y: pluralize$2('y'),
            yy: pluralize$2('y'),
        },
        preparse: function (string) {
            return string
                .replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
                    return numberMap$1[match];
                })
                .replace(/،/g, ',');
        },
        postformat: function (string) {
            return string
                .replace(/\d/g, function (match) {
                    return symbolMap$2[match];
                })
                .replace(/,/g, '،');
        },
        week: {
            dow: 6, // Saturday is the first day of the week.
            doy: 12, // The week that contains Jan 12th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var suffixes = {
        1: '-inci',
        5: '-inci',
        8: '-inci',
        70: '-inci',
        80: '-inci',
        2: '-nci',
        7: '-nci',
        20: '-nci',
        50: '-nci',
        3: '-üncü',
        4: '-üncü',
        100: '-üncü',
        6: '-ncı',
        9: '-uncu',
        10: '-uncu',
        30: '-uncu',
        60: '-ıncı',
        90: '-ıncı',
    };

    moment.defineLocale('az', {
        months: 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split(
            '_'
        ),
        monthsShort: 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'),
        weekdays:
            'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split(
                '_'
            ),
        weekdaysShort: 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'),
        weekdaysMin: 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[bugün saat] LT',
            nextDay: '[sabah saat] LT',
            nextWeek: '[gələn həftə] dddd [saat] LT',
            lastDay: '[dünən] LT',
            lastWeek: '[keçən həftə] dddd [saat] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s sonra',
            past: '%s əvvəl',
            s: 'bir neçə saniyə',
            ss: '%d saniyə',
            m: 'bir dəqiqə',
            mm: '%d dəqiqə',
            h: 'bir saat',
            hh: '%d saat',
            d: 'bir gün',
            dd: '%d gün',
            M: 'bir ay',
            MM: '%d ay',
            y: 'bir il',
            yy: '%d il',
        },
        meridiemParse: /gecə|səhər|gündüz|axşam/,
        isPM: function (input) {
            return /^(gündüz|axşam)$/.test(input);
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'gecə';
            } else if (hour < 12) {
                return 'səhər';
            } else if (hour < 17) {
                return 'gündüz';
            } else {
                return 'axşam';
            }
        },
        dayOfMonthOrdinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,
        ordinal: function (number) {
            if (number === 0) {
                // special case for zero
                return number + '-ıncı';
            }
            var a = number % 10,
                b = (number % 100) - a,
                c = number >= 100 ? 100 : null;
            return number + (suffixes[a] || suffixes[b] || suffixes[c]);
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function plural(word, num) {
        var forms = word.split('_');
        return num % 10 === 1 && num % 100 !== 11
            ? forms[0]
            : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20)
            ? forms[1]
            : forms[2];
    }
    function relativeTimeWithPlural(number, withoutSuffix, key) {
        var format = {
            ss: withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд',
            mm: withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін',
            hh: withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін',
            dd: 'дзень_дні_дзён',
            MM: 'месяц_месяцы_месяцаў',
            yy: 'год_гады_гадоў',
        };
        if (key === 'm') {
            return withoutSuffix ? 'хвіліна' : 'хвіліну';
        } else if (key === 'h') {
            return withoutSuffix ? 'гадзіна' : 'гадзіну';
        } else {
            return number + ' ' + plural(format[key], +number);
        }
    }

    moment.defineLocale('be', {
        months: {
            format: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split(
                '_'
            ),
            standalone:
                'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split(
                    '_'
                ),
        },
        monthsShort:
            'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'),
        weekdays: {
            format: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split(
                '_'
            ),
            standalone:
                'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split(
                    '_'
                ),
            isFormat: /\[ ?[Ууў] ?(?:мінулую|наступную)? ?\] ?dddd/,
        },
        weekdaysShort: 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
        weekdaysMin: 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY г.',
            LLL: 'D MMMM YYYY г., HH:mm',
            LLLL: 'dddd, D MMMM YYYY г., HH:mm',
        },
        calendar: {
            sameDay: '[Сёння ў] LT',
            nextDay: '[Заўтра ў] LT',
            lastDay: '[Учора ў] LT',
            nextWeek: function () {
                return '[У] dddd [ў] LT';
            },
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                    case 3:
                    case 5:
                    case 6:
                        return '[У мінулую] dddd [ў] LT';
                    case 1:
                    case 2:
                    case 4:
                        return '[У мінулы] dddd [ў] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'праз %s',
            past: '%s таму',
            s: 'некалькі секунд',
            m: relativeTimeWithPlural,
            mm: relativeTimeWithPlural,
            h: relativeTimeWithPlural,
            hh: relativeTimeWithPlural,
            d: 'дзень',
            dd: relativeTimeWithPlural,
            M: 'месяц',
            MM: relativeTimeWithPlural,
            y: 'год',
            yy: relativeTimeWithPlural,
        },
        meridiemParse: /ночы|раніцы|дня|вечара/,
        isPM: function (input) {
            return /^(дня|вечара)$/.test(input);
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'ночы';
            } else if (hour < 12) {
                return 'раніцы';
            } else if (hour < 17) {
                return 'дня';
            } else {
                return 'вечара';
            }
        },
        dayOfMonthOrdinalParse: /\d{1,2}-(і|ы|га)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'M':
                case 'd':
                case 'DDD':
                case 'w':
                case 'W':
                    return (number % 10 === 2 || number % 10 === 3) &&
                        number % 100 !== 12 &&
                        number % 100 !== 13
                        ? number + '-і'
                        : number + '-ы';
                case 'D':
                    return number + '-га';
                default:
                    return number;
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('bg', {
        months: 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split(
            '_'
        ),
        monthsShort: 'яну_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'),
        weekdays: 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split(
            '_'
        ),
        weekdaysShort: 'нед_пон_вто_сря_чет_пет_съб'.split('_'),
        weekdaysMin: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'D.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY H:mm',
            LLLL: 'dddd, D MMMM YYYY H:mm',
        },
        calendar: {
            sameDay: '[Днес в] LT',
            nextDay: '[Утре в] LT',
            nextWeek: 'dddd [в] LT',
            lastDay: '[Вчера в] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                    case 3:
                    case 6:
                        return '[Миналата] dddd [в] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[Миналия] dddd [в] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'след %s',
            past: 'преди %s',
            s: 'няколко секунди',
            ss: '%d секунди',
            m: 'минута',
            mm: '%d минути',
            h: 'час',
            hh: '%d часа',
            d: 'ден',
            dd: '%d дена',
            w: 'седмица',
            ww: '%d седмици',
            M: 'месец',
            MM: '%d месеца',
            y: 'година',
            yy: '%d години',
        },
        dayOfMonthOrdinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/,
        ordinal: function (number) {
            var lastDigit = number % 10,
                last2Digits = number % 100;
            if (number === 0) {
                return number + '-ев';
            } else if (last2Digits === 0) {
                return number + '-ен';
            } else if (last2Digits > 10 && last2Digits < 20) {
                return number + '-ти';
            } else if (lastDigit === 1) {
                return number + '-ви';
            } else if (lastDigit === 2) {
                return number + '-ри';
            } else if (lastDigit === 7 || lastDigit === 8) {
                return number + '-ми';
            } else {
                return number + '-ти';
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('bm', {
        months: 'Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_Mɛkalo_Zuwɛnkalo_Zuluyekalo_Utikalo_Sɛtanburukalo_ɔkutɔburukalo_Nowanburukalo_Desanburukalo'.split(
            '_'
        ),
        monthsShort: 'Zan_Few_Mar_Awi_Mɛ_Zuw_Zul_Uti_Sɛt_ɔku_Now_Des'.split('_'),
        weekdays: 'Kari_Ntɛnɛn_Tarata_Araba_Alamisa_Juma_Sibiri'.split('_'),
        weekdaysShort: 'Kar_Ntɛ_Tar_Ara_Ala_Jum_Sib'.split('_'),
        weekdaysMin: 'Ka_Nt_Ta_Ar_Al_Ju_Si'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'MMMM [tile] D [san] YYYY',
            LLL: 'MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm',
            LLLL: 'dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm',
        },
        calendar: {
            sameDay: '[Bi lɛrɛ] LT',
            nextDay: '[Sini lɛrɛ] LT',
            nextWeek: 'dddd [don lɛrɛ] LT',
            lastDay: '[Kunu lɛrɛ] LT',
            lastWeek: 'dddd [tɛmɛnen lɛrɛ] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s kɔnɔ',
            past: 'a bɛ %s bɔ',
            s: 'sanga dama dama',
            ss: 'sekondi %d',
            m: 'miniti kelen',
            mm: 'miniti %d',
            h: 'lɛrɛ kelen',
            hh: 'lɛrɛ %d',
            d: 'tile kelen',
            dd: 'tile %d',
            M: 'kalo kelen',
            MM: 'kalo %d',
            y: 'san kelen',
            yy: 'san %d',
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var symbolMap$3 = {
            1: '১',
            2: '২',
            3: '৩',
            4: '৪',
            5: '৫',
            6: '৬',
            7: '৭',
            8: '৮',
            9: '৯',
            0: '০',
        },
        numberMap$2 = {
            '১': '1',
            '২': '2',
            '৩': '3',
            '৪': '4',
            '৫': '5',
            '৬': '6',
            '৭': '7',
            '৮': '8',
            '৯': '9',
            '০': '0',
        };

    moment.defineLocale('bn-bd', {
        months: 'জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split(
            '_'
        ),
        monthsShort:
            'জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে'.split(
                '_'
            ),
        weekdays: 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split(
            '_'
        ),
        weekdaysShort: 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),
        weekdaysMin: 'রবি_সোম_মঙ্গল_বুধ_বৃহ_শুক্র_শনি'.split('_'),
        longDateFormat: {
            LT: 'A h:mm সময়',
            LTS: 'A h:mm:ss সময়',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm সময়',
            LLLL: 'dddd, D MMMM YYYY, A h:mm সময়',
        },
        calendar: {
            sameDay: '[আজ] LT',
            nextDay: '[আগামীকাল] LT',
            nextWeek: 'dddd, LT',
            lastDay: '[গতকাল] LT',
            lastWeek: '[গত] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s পরে',
            past: '%s আগে',
            s: 'কয়েক সেকেন্ড',
            ss: '%d সেকেন্ড',
            m: 'এক মিনিট',
            mm: '%d মিনিট',
            h: 'এক ঘন্টা',
            hh: '%d ঘন্টা',
            d: 'এক দিন',
            dd: '%d দিন',
            M: 'এক মাস',
            MM: '%d মাস',
            y: 'এক বছর',
            yy: '%d বছর',
        },
        preparse: function (string) {
            return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {
                return numberMap$2[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap$3[match];
            });
        },

        meridiemParse: /রাত|ভোর|সকাল|দুপুর|বিকাল|সন্ধ্যা|রাত/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'রাত') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'ভোর') {
                return hour;
            } else if (meridiem === 'সকাল') {
                return hour;
            } else if (meridiem === 'দুপুর') {
                return hour >= 3 ? hour : hour + 12;
            } else if (meridiem === 'বিকাল') {
                return hour + 12;
            } else if (meridiem === 'সন্ধ্যা') {
                return hour + 12;
            }
        },

        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'রাত';
            } else if (hour < 6) {
                return 'ভোর';
            } else if (hour < 12) {
                return 'সকাল';
            } else if (hour < 15) {
                return 'দুপুর';
            } else if (hour < 18) {
                return 'বিকাল';
            } else if (hour < 20) {
                return 'সন্ধ্যা';
            } else {
                return 'রাত';
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var symbolMap$4 = {
            1: '১',
            2: '২',
            3: '৩',
            4: '৪',
            5: '৫',
            6: '৬',
            7: '৭',
            8: '৮',
            9: '৯',
            0: '০',
        },
        numberMap$3 = {
            '১': '1',
            '২': '2',
            '৩': '3',
            '৪': '4',
            '৫': '5',
            '৬': '6',
            '৭': '7',
            '৮': '8',
            '৯': '9',
            '০': '0',
        };

    moment.defineLocale('bn', {
        months: 'জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split(
            '_'
        ),
        monthsShort:
            'জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে'.split(
                '_'
            ),
        weekdays: 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split(
            '_'
        ),
        weekdaysShort: 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),
        weekdaysMin: 'রবি_সোম_মঙ্গল_বুধ_বৃহ_শুক্র_শনি'.split('_'),
        longDateFormat: {
            LT: 'A h:mm সময়',
            LTS: 'A h:mm:ss সময়',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm সময়',
            LLLL: 'dddd, D MMMM YYYY, A h:mm সময়',
        },
        calendar: {
            sameDay: '[আজ] LT',
            nextDay: '[আগামীকাল] LT',
            nextWeek: 'dddd, LT',
            lastDay: '[গতকাল] LT',
            lastWeek: '[গত] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s পরে',
            past: '%s আগে',
            s: 'কয়েক সেকেন্ড',
            ss: '%d সেকেন্ড',
            m: 'এক মিনিট',
            mm: '%d মিনিট',
            h: 'এক ঘন্টা',
            hh: '%d ঘন্টা',
            d: 'এক দিন',
            dd: '%d দিন',
            M: 'এক মাস',
            MM: '%d মাস',
            y: 'এক বছর',
            yy: '%d বছর',
        },
        preparse: function (string) {
            return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {
                return numberMap$3[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap$4[match];
            });
        },
        meridiemParse: /রাত|সকাল|দুপুর|বিকাল|রাত/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (
                (meridiem === 'রাত' && hour >= 4) ||
                (meridiem === 'দুপুর' && hour < 5) ||
                meridiem === 'বিকাল'
            ) {
                return hour + 12;
            } else {
                return hour;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'রাত';
            } else if (hour < 10) {
                return 'সকাল';
            } else if (hour < 17) {
                return 'দুপুর';
            } else if (hour < 20) {
                return 'বিকাল';
            } else {
                return 'রাত';
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var symbolMap$5 = {
            1: '༡',
            2: '༢',
            3: '༣',
            4: '༤',
            5: '༥',
            6: '༦',
            7: '༧',
            8: '༨',
            9: '༩',
            0: '༠',
        },
        numberMap$4 = {
            '༡': '1',
            '༢': '2',
            '༣': '3',
            '༤': '4',
            '༥': '5',
            '༦': '6',
            '༧': '7',
            '༨': '8',
            '༩': '9',
            '༠': '0',
        };

    moment.defineLocale('bo', {
        months: 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split(
            '_'
        ),
        monthsShort:
            'ཟླ་1_ཟླ་2_ཟླ་3_ཟླ་4_ཟླ་5_ཟླ་6_ཟླ་7_ཟླ་8_ཟླ་9_ཟླ་10_ཟླ་11_ཟླ་12'.split(
                '_'
            ),
        monthsShortRegex: /^(ཟླ་\d{1,2})/,
        monthsParseExact: true,
        weekdays:
            'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split(
                '_'
            ),
        weekdaysShort: 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split(
            '_'
        ),
        weekdaysMin: 'ཉི_ཟླ_མིག_ལྷག_ཕུར_སངས_སྤེན'.split('_'),
        longDateFormat: {
            LT: 'A h:mm',
            LTS: 'A h:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm',
            LLLL: 'dddd, D MMMM YYYY, A h:mm',
        },
        calendar: {
            sameDay: '[དི་རིང] LT',
            nextDay: '[སང་ཉིན] LT',
            nextWeek: '[བདུན་ཕྲག་རྗེས་མ], LT',
            lastDay: '[ཁ་སང] LT',
            lastWeek: '[བདུན་ཕྲག་མཐའ་མ] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s ལ་',
            past: '%s སྔན་ལ',
            s: 'ལམ་སང',
            ss: '%d སྐར་ཆ།',
            m: 'སྐར་མ་གཅིག',
            mm: '%d སྐར་མ',
            h: 'ཆུ་ཚོད་གཅིག',
            hh: '%d ཆུ་ཚོད',
            d: 'ཉིན་གཅིག',
            dd: '%d ཉིན་',
            M: 'ཟླ་བ་གཅིག',
            MM: '%d ཟླ་བ',
            y: 'ལོ་གཅིག',
            yy: '%d ལོ',
        },
        preparse: function (string) {
            return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) {
                return numberMap$4[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap$5[match];
            });
        },
        meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (
                (meridiem === 'མཚན་མོ' && hour >= 4) ||
                (meridiem === 'ཉིན་གུང' && hour < 5) ||
                meridiem === 'དགོང་དག'
            ) {
                return hour + 12;
            } else {
                return hour;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'མཚན་མོ';
            } else if (hour < 10) {
                return 'ཞོགས་ཀས';
            } else if (hour < 17) {
                return 'ཉིན་གུང';
            } else if (hour < 20) {
                return 'དགོང་དག';
            } else {
                return 'མཚན་མོ';
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function relativeTimeWithMutation(number, withoutSuffix, key) {
        var format = {
            mm: 'munutenn',
            MM: 'miz',
            dd: 'devezh',
        };
        return number + ' ' + mutation(format[key], number);
    }
    function specialMutationForYears(number) {
        switch (lastNumber(number)) {
            case 1:
            case 3:
            case 4:
            case 5:
            case 9:
                return number + ' bloaz';
            default:
                return number + ' vloaz';
        }
    }
    function lastNumber(number) {
        if (number > 9) {
            return lastNumber(number % 10);
        }
        return number;
    }
    function mutation(text, number) {
        if (number === 2) {
            return softMutation(text);
        }
        return text;
    }
    function softMutation(text) {
        var mutationTable = {
            m: 'v',
            b: 'v',
            d: 'z',
        };
        if (mutationTable[text.charAt(0)] === undefined) {
            return text;
        }
        return mutationTable[text.charAt(0)] + text.substring(1);
    }

    var monthsParse = [
            /^gen/i,
            /^c[ʼ\']hwe/i,
            /^meu/i,
            /^ebr/i,
            /^mae/i,
            /^(mez|eve)/i,
            /^gou/i,
            /^eos/i,
            /^gwe/i,
            /^her/i,
            /^du/i,
            /^ker/i,
        ],
        monthsRegex =
            /^(genver|c[ʼ\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu|gen|c[ʼ\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,
        monthsStrictRegex =
            /^(genver|c[ʼ\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu)/i,
        monthsShortStrictRegex =
            /^(gen|c[ʼ\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,
        fullWeekdaysParse = [
            /^sul/i,
            /^lun/i,
            /^meurzh/i,
            /^merc[ʼ\']her/i,
            /^yaou/i,
            /^gwener/i,
            /^sadorn/i,
        ],
        shortWeekdaysParse = [
            /^Sul/i,
            /^Lun/i,
            /^Meu/i,
            /^Mer/i,
            /^Yao/i,
            /^Gwe/i,
            /^Sad/i,
        ],
        minWeekdaysParse = [
            /^Su/i,
            /^Lu/i,
            /^Me([^r]|$)/i,
            /^Mer/i,
            /^Ya/i,
            /^Gw/i,
            /^Sa/i,
        ];

    moment.defineLocale('br', {
        months: 'Genver_Cʼhwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split(
            '_'
        ),
        monthsShort: 'Gen_Cʼhwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'),
        weekdays: 'Sul_Lun_Meurzh_Mercʼher_Yaou_Gwener_Sadorn'.split('_'),
        weekdaysShort: 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'),
        weekdaysMin: 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'),
        weekdaysParse: minWeekdaysParse,
        fullWeekdaysParse: fullWeekdaysParse,
        shortWeekdaysParse: shortWeekdaysParse,
        minWeekdaysParse: minWeekdaysParse,

        monthsRegex: monthsRegex,
        monthsShortRegex: monthsRegex,
        monthsStrictRegex: monthsStrictRegex,
        monthsShortStrictRegex: monthsShortStrictRegex,
        monthsParse: monthsParse,
        longMonthsParse: monthsParse,
        shortMonthsParse: monthsParse,

        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D [a viz] MMMM YYYY',
            LLL: 'D [a viz] MMMM YYYY HH:mm',
            LLLL: 'dddd, D [a viz] MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Hiziv da] LT',
            nextDay: '[Warcʼhoazh da] LT',
            nextWeek: 'dddd [da] LT',
            lastDay: '[Decʼh da] LT',
            lastWeek: 'dddd [paset da] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'a-benn %s',
            past: '%s ʼzo',
            s: 'un nebeud segondennoù',
            ss: '%d eilenn',
            m: 'ur vunutenn',
            mm: relativeTimeWithMutation,
            h: 'un eur',
            hh: '%d eur',
            d: 'un devezh',
            dd: relativeTimeWithMutation,
            M: 'ur miz',
            MM: relativeTimeWithMutation,
            y: 'ur bloaz',
            yy: specialMutationForYears,
        },
        dayOfMonthOrdinalParse: /\d{1,2}(añ|vet)/,
        ordinal: function (number) {
            var output = number === 1 ? 'añ' : 'vet';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
        meridiemParse: /a.m.|g.m./, // goude merenn | a-raok merenn
        isPM: function (token) {
            return token === 'g.m.';
        },
        meridiem: function (hour, minute, isLower) {
            return hour < 12 ? 'a.m.' : 'g.m.';
        },
    });

    //! moment.js locale configuration

    function translate(number, withoutSuffix, key) {
        var result = number + ' ';
        switch (key) {
            case 'ss':
                if (number === 1) {
                    result += 'sekunda';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'sekunde';
                } else {
                    result += 'sekundi';
                }
                return result;
            case 'm':
                return withoutSuffix ? 'jedna minuta' : 'jedne minute';
            case 'mm':
                if (number === 1) {
                    result += 'minuta';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'minute';
                } else {
                    result += 'minuta';
                }
                return result;
            case 'h':
                return withoutSuffix ? 'jedan sat' : 'jednog sata';
            case 'hh':
                if (number === 1) {
                    result += 'sat';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'sata';
                } else {
                    result += 'sati';
                }
                return result;
            case 'dd':
                if (number === 1) {
                    result += 'dan';
                } else {
                    result += 'dana';
                }
                return result;
            case 'MM':
                if (number === 1) {
                    result += 'mjesec';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'mjeseca';
                } else {
                    result += 'mjeseci';
                }
                return result;
            case 'yy':
                if (number === 1) {
                    result += 'godina';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'godine';
                } else {
                    result += 'godina';
                }
                return result;
        }
    }

    moment.defineLocale('bs', {
        months: 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split(
            '_'
        ),
        monthsShort:
            'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split(
            '_'
        ),
        weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
        weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY H:mm',
            LLLL: 'dddd, D. MMMM YYYY H:mm',
        },
        calendar: {
            sameDay: '[danas u] LT',
            nextDay: '[sutra u] LT',
            nextWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[u] [nedjelju] [u] LT';
                    case 3:
                        return '[u] [srijedu] [u] LT';
                    case 6:
                        return '[u] [subotu] [u] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[u] dddd [u] LT';
                }
            },
            lastDay: '[jučer u] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                    case 3:
                        return '[prošlu] dddd [u] LT';
                    case 6:
                        return '[prošle] [subote] [u] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[prošli] dddd [u] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'za %s',
            past: 'prije %s',
            s: 'par sekundi',
            ss: translate,
            m: translate,
            mm: translate,
            h: translate,
            hh: translate,
            d: 'dan',
            dd: translate,
            M: 'mjesec',
            MM: translate,
            y: 'godinu',
            yy: translate,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('ca', {
        months: {
            standalone:
                'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split(
                    '_'
                ),
            format: "de gener_de febrer_de març_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split(
                '_'
            ),
            isFormat: /D[oD]?(\s)+MMMM/,
        },
        monthsShort:
            'gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays:
            'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split(
                '_'
            ),
        weekdaysShort: 'dg._dl._dt._dc._dj._dv._ds.'.split('_'),
        weekdaysMin: 'dg_dl_dt_dc_dj_dv_ds'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM [de] YYYY',
            ll: 'D MMM YYYY',
            LLL: 'D MMMM [de] YYYY [a les] H:mm',
            lll: 'D MMM YYYY, H:mm',
            LLLL: 'dddd D MMMM [de] YYYY [a les] H:mm',
            llll: 'ddd D MMM YYYY, H:mm',
        },
        calendar: {
            sameDay: function () {
                return '[avui a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';
            },
            nextDay: function () {
                return '[demà a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';
            },
            nextWeek: function () {
                return 'dddd [a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';
            },
            lastDay: function () {
                return '[ahir a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';
            },
            lastWeek: function () {
                return (
                    '[el] dddd [passat a ' +
                    (this.hours() !== 1 ? 'les' : 'la') +
                    '] LT'
                );
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: "d'aquí %s",
            past: 'fa %s',
            s: 'uns segons',
            ss: '%d segons',
            m: 'un minut',
            mm: '%d minuts',
            h: 'una hora',
            hh: '%d hores',
            d: 'un dia',
            dd: '%d dies',
            M: 'un mes',
            MM: '%d mesos',
            y: 'un any',
            yy: '%d anys',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(r|n|t|è|a)/,
        ordinal: function (number, period) {
            var output =
                number === 1
                    ? 'r'
                    : number === 2
                    ? 'n'
                    : number === 3
                    ? 'r'
                    : number === 4
                    ? 't'
                    : 'è';
            if (period === 'w' || period === 'W') {
                output = 'a';
            }
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var months$3 = {
            format: 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split(
                '_'
            ),
            standalone:
                'ledna_února_března_dubna_května_června_července_srpna_září_října_listopadu_prosince'.split(
                    '_'
                ),
        },
        monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_'),
        monthsParse$1 = [
            /^led/i,
            /^úno/i,
            /^bře/i,
            /^dub/i,
            /^kvě/i,
            /^(čvn|červen$|června)/i,
            /^(čvc|červenec|července)/i,
            /^srp/i,
            /^zář/i,
            /^říj/i,
            /^lis/i,
            /^pro/i,
        ],
        // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched.
        // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'.
        monthsRegex$1 =
            /^(leden|únor|březen|duben|květen|červenec|července|červen|června|srpen|září|říjen|listopad|prosinec|led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i;

    function plural$1(n) {
        return n > 1 && n < 5 && ~~(n / 10) !== 1;
    }
    function translate$1(number, withoutSuffix, key, isFuture) {
        var result = number + ' ';
        switch (key) {
            case 's': // a few seconds / in a few seconds / a few seconds ago
                return withoutSuffix || isFuture ? 'pár sekund' : 'pár sekundami';
            case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago
                if (withoutSuffix || isFuture) {
                    return result + (plural$1(number) ? 'sekundy' : 'sekund');
                } else {
                    return result + 'sekundami';
                }
            case 'm': // a minute / in a minute / a minute ago
                return withoutSuffix ? 'minuta' : isFuture ? 'minutu' : 'minutou';
            case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
                if (withoutSuffix || isFuture) {
                    return result + (plural$1(number) ? 'minuty' : 'minut');
                } else {
                    return result + 'minutami';
                }
            case 'h': // an hour / in an hour / an hour ago
                return withoutSuffix ? 'hodina' : isFuture ? 'hodinu' : 'hodinou';
            case 'hh': // 9 hours / in 9 hours / 9 hours ago
                if (withoutSuffix || isFuture) {
                    return result + (plural$1(number) ? 'hodiny' : 'hodin');
                } else {
                    return result + 'hodinami';
                }
            case 'd': // a day / in a day / a day ago
                return withoutSuffix || isFuture ? 'den' : 'dnem';
            case 'dd': // 9 days / in 9 days / 9 days ago
                if (withoutSuffix || isFuture) {
                    return result + (plural$1(number) ? 'dny' : 'dní');
                } else {
                    return result + 'dny';
                }
            case 'M': // a month / in a month / a month ago
                return withoutSuffix || isFuture ? 'měsíc' : 'měsícem';
            case 'MM': // 9 months / in 9 months / 9 months ago
                if (withoutSuffix || isFuture) {
                    return result + (plural$1(number) ? 'měsíce' : 'měsíců');
                } else {
                    return result + 'měsíci';
                }
            case 'y': // a year / in a year / a year ago
                return withoutSuffix || isFuture ? 'rok' : 'rokem';
            case 'yy': // 9 years / in 9 years / 9 years ago
                if (withoutSuffix || isFuture) {
                    return result + (plural$1(number) ? 'roky' : 'let');
                } else {
                    return result + 'lety';
                }
        }
    }

    moment.defineLocale('cs', {
        months: months$3,
        monthsShort: monthsShort,
        monthsRegex: monthsRegex$1,
        monthsShortRegex: monthsRegex$1,
        // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched.
        // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'.
        monthsStrictRegex:
            /^(leden|ledna|února|únor|březen|března|duben|dubna|květen|května|červenec|července|červen|června|srpen|srpna|září|říjen|října|listopadu|listopad|prosinec|prosince)/i,
        monthsShortStrictRegex:
            /^(led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i,
        monthsParse: monthsParse$1,
        longMonthsParse: monthsParse$1,
        shortMonthsParse: monthsParse$1,
        weekdays: 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'),
        weekdaysShort: 'ne_po_út_st_čt_pá_so'.split('_'),
        weekdaysMin: 'ne_po_út_st_čt_pá_so'.split('_'),
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY H:mm',
            LLLL: 'dddd D. MMMM YYYY H:mm',
            l: 'D. M. YYYY',
        },
        calendar: {
            sameDay: '[dnes v] LT',
            nextDay: '[zítra v] LT',
            nextWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[v neděli v] LT';
                    case 1:
                    case 2:
                        return '[v] dddd [v] LT';
                    case 3:
                        return '[ve středu v] LT';
                    case 4:
                        return '[ve čtvrtek v] LT';
                    case 5:
                        return '[v pátek v] LT';
                    case 6:
                        return '[v sobotu v] LT';
                }
            },
            lastDay: '[včera v] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[minulou neděli v] LT';
                    case 1:
                    case 2:
                        return '[minulé] dddd [v] LT';
                    case 3:
                        return '[minulou středu v] LT';
                    case 4:
                    case 5:
                        return '[minulý] dddd [v] LT';
                    case 6:
                        return '[minulou sobotu v] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'za %s',
            past: 'před %s',
            s: translate$1,
            ss: translate$1,
            m: translate$1,
            mm: translate$1,
            h: translate$1,
            hh: translate$1,
            d: translate$1,
            dd: translate$1,
            M: translate$1,
            MM: translate$1,
            y: translate$1,
            yy: translate$1,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('cv', {
        months: 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split(
            '_'
        ),
        monthsShort: 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'),
        weekdays:
            'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split(
                '_'
            ),
        weekdaysShort: 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'),
        weekdaysMin: 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD-MM-YYYY',
            LL: 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]',
            LLL: 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm',
            LLLL: 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm',
        },
        calendar: {
            sameDay: '[Паян] LT [сехетре]',
            nextDay: '[Ыран] LT [сехетре]',
            lastDay: '[Ӗнер] LT [сехетре]',
            nextWeek: '[Ҫитес] dddd LT [сехетре]',
            lastWeek: '[Иртнӗ] dddd LT [сехетре]',
            sameElse: 'L',
        },
        relativeTime: {
            future: function (output) {
                var affix = /сехет$/i.exec(output)
                    ? 'рен'
                    : /ҫул$/i.exec(output)
                    ? 'тан'
                    : 'ран';
                return output + affix;
            },
            past: '%s каялла',
            s: 'пӗр-ик ҫеккунт',
            ss: '%d ҫеккунт',
            m: 'пӗр минут',
            mm: '%d минут',
            h: 'пӗр сехет',
            hh: '%d сехет',
            d: 'пӗр кун',
            dd: '%d кун',
            M: 'пӗр уйӑх',
            MM: '%d уйӑх',
            y: 'пӗр ҫул',
            yy: '%d ҫул',
        },
        dayOfMonthOrdinalParse: /\d{1,2}-мӗш/,
        ordinal: '%d-мӗш',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('cy', {
        months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split(
            '_'
        ),
        monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split(
            '_'
        ),
        weekdays:
            'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split(
                '_'
            ),
        weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'),
        weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'),
        weekdaysParseExact: true,
        // time formats are the same as en-gb
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Heddiw am] LT',
            nextDay: '[Yfory am] LT',
            nextWeek: 'dddd [am] LT',
            lastDay: '[Ddoe am] LT',
            lastWeek: 'dddd [diwethaf am] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'mewn %s',
            past: '%s yn ôl',
            s: 'ychydig eiliadau',
            ss: '%d eiliad',
            m: 'munud',
            mm: '%d munud',
            h: 'awr',
            hh: '%d awr',
            d: 'diwrnod',
            dd: '%d diwrnod',
            M: 'mis',
            MM: '%d mis',
            y: 'blwyddyn',
            yy: '%d flynedd',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,
        // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh
        ordinal: function (number) {
            var b = number,
                output = '',
                lookup = [
                    '',
                    'af',
                    'il',
                    'ydd',
                    'ydd',
                    'ed',
                    'ed',
                    'ed',
                    'fed',
                    'fed',
                    'fed', // 1af to 10fed
                    'eg',
                    'fed',
                    'eg',
                    'eg',
                    'fed',
                    'eg',
                    'eg',
                    'fed',
                    'eg',
                    'fed', // 11eg to 20fed
                ];
            if (b > 20) {
                if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) {
                    output = 'fed'; // not 30ain, 70ain or 90ain
                } else {
                    output = 'ain';
                }
            } else if (b > 0) {
                output = lookup[b];
            }
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('da', {
        months: 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split(
            '_'
        ),
        monthsShort: 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
        weekdays: 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
        weekdaysShort: 'søn_man_tir_ons_tor_fre_lør'.split('_'),
        weekdaysMin: 'sø_ma_ti_on_to_fr_lø'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY HH:mm',
            LLLL: 'dddd [d.] D. MMMM YYYY [kl.] HH:mm',
        },
        calendar: {
            sameDay: '[i dag kl.] LT',
            nextDay: '[i morgen kl.] LT',
            nextWeek: 'på dddd [kl.] LT',
            lastDay: '[i går kl.] LT',
            lastWeek: '[i] dddd[s kl.] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'om %s',
            past: '%s siden',
            s: 'få sekunder',
            ss: '%d sekunder',
            m: 'et minut',
            mm: '%d minutter',
            h: 'en time',
            hh: '%d timer',
            d: 'en dag',
            dd: '%d dage',
            M: 'en måned',
            MM: '%d måneder',
            y: 'et år',
            yy: '%d år',
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function processRelativeTime(number, withoutSuffix, key, isFuture) {
        var format = {
            m: ['eine Minute', 'einer Minute'],
            h: ['eine Stunde', 'einer Stunde'],
            d: ['ein Tag', 'einem Tag'],
            dd: [number + ' Tage', number + ' Tagen'],
            w: ['eine Woche', 'einer Woche'],
            M: ['ein Monat', 'einem Monat'],
            MM: [number + ' Monate', number + ' Monaten'],
            y: ['ein Jahr', 'einem Jahr'],
            yy: [number + ' Jahre', number + ' Jahren'],
        };
        return withoutSuffix ? format[key][0] : format[key][1];
    }

    moment.defineLocale('de-at', {
        months: 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split(
            '_'
        ),
        monthsShort:
            'Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),
        monthsParseExact: true,
        weekdays:
            'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split(
                '_'
            ),
        weekdaysShort: 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
        weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY HH:mm',
            LLLL: 'dddd, D. MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[heute um] LT [Uhr]',
            sameElse: 'L',
            nextDay: '[morgen um] LT [Uhr]',
            nextWeek: 'dddd [um] LT [Uhr]',
            lastDay: '[gestern um] LT [Uhr]',
            lastWeek: '[letzten] dddd [um] LT [Uhr]',
        },
        relativeTime: {
            future: 'in %s',
            past: 'vor %s',
            s: 'ein paar Sekunden',
            ss: '%d Sekunden',
            m: processRelativeTime,
            mm: '%d Minuten',
            h: processRelativeTime,
            hh: '%d Stunden',
            d: processRelativeTime,
            dd: processRelativeTime,
            w: processRelativeTime,
            ww: '%d Wochen',
            M: processRelativeTime,
            MM: processRelativeTime,
            y: processRelativeTime,
            yy: processRelativeTime,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function processRelativeTime$1(number, withoutSuffix, key, isFuture) {
        var format = {
            m: ['eine Minute', 'einer Minute'],
            h: ['eine Stunde', 'einer Stunde'],
            d: ['ein Tag', 'einem Tag'],
            dd: [number + ' Tage', number + ' Tagen'],
            w: ['eine Woche', 'einer Woche'],
            M: ['ein Monat', 'einem Monat'],
            MM: [number + ' Monate', number + ' Monaten'],
            y: ['ein Jahr', 'einem Jahr'],
            yy: [number + ' Jahre', number + ' Jahren'],
        };
        return withoutSuffix ? format[key][0] : format[key][1];
    }

    moment.defineLocale('de-ch', {
        months: 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split(
            '_'
        ),
        monthsShort:
            'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),
        monthsParseExact: true,
        weekdays:
            'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split(
                '_'
            ),
        weekdaysShort: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
        weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY HH:mm',
            LLLL: 'dddd, D. MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[heute um] LT [Uhr]',
            sameElse: 'L',
            nextDay: '[morgen um] LT [Uhr]',
            nextWeek: 'dddd [um] LT [Uhr]',
            lastDay: '[gestern um] LT [Uhr]',
            lastWeek: '[letzten] dddd [um] LT [Uhr]',
        },
        relativeTime: {
            future: 'in %s',
            past: 'vor %s',
            s: 'ein paar Sekunden',
            ss: '%d Sekunden',
            m: processRelativeTime$1,
            mm: '%d Minuten',
            h: processRelativeTime$1,
            hh: '%d Stunden',
            d: processRelativeTime$1,
            dd: processRelativeTime$1,
            w: processRelativeTime$1,
            ww: '%d Wochen',
            M: processRelativeTime$1,
            MM: processRelativeTime$1,
            y: processRelativeTime$1,
            yy: processRelativeTime$1,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function processRelativeTime$2(number, withoutSuffix, key, isFuture) {
        var format = {
            m: ['eine Minute', 'einer Minute'],
            h: ['eine Stunde', 'einer Stunde'],
            d: ['ein Tag', 'einem Tag'],
            dd: [number + ' Tage', number + ' Tagen'],
            w: ['eine Woche', 'einer Woche'],
            M: ['ein Monat', 'einem Monat'],
            MM: [number + ' Monate', number + ' Monaten'],
            y: ['ein Jahr', 'einem Jahr'],
            yy: [number + ' Jahre', number + ' Jahren'],
        };
        return withoutSuffix ? format[key][0] : format[key][1];
    }

    moment.defineLocale('de', {
        months: 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split(
            '_'
        ),
        monthsShort:
            'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),
        monthsParseExact: true,
        weekdays:
            'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split(
                '_'
            ),
        weekdaysShort: 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
        weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY HH:mm',
            LLLL: 'dddd, D. MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[heute um] LT [Uhr]',
            sameElse: 'L',
            nextDay: '[morgen um] LT [Uhr]',
            nextWeek: 'dddd [um] LT [Uhr]',
            lastDay: '[gestern um] LT [Uhr]',
            lastWeek: '[letzten] dddd [um] LT [Uhr]',
        },
        relativeTime: {
            future: 'in %s',
            past: 'vor %s',
            s: 'ein paar Sekunden',
            ss: '%d Sekunden',
            m: processRelativeTime$2,
            mm: '%d Minuten',
            h: processRelativeTime$2,
            hh: '%d Stunden',
            d: processRelativeTime$2,
            dd: processRelativeTime$2,
            w: processRelativeTime$2,
            ww: '%d Wochen',
            M: processRelativeTime$2,
            MM: processRelativeTime$2,
            y: processRelativeTime$2,
            yy: processRelativeTime$2,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var months$4 = [
            'ޖެނުއަރީ',
            'ފެބްރުއަރީ',
            'މާރިޗު',
            'އޭޕްރީލު',
            'މޭ',
            'ޖޫން',
            'ޖުލައި',
            'އޯގަސްޓު',
            'ސެޕްޓެމްބަރު',
            'އޮކްޓޯބަރު',
            'ނޮވެމްބަރު',
            'ޑިސެމްބަރު',
        ],
        weekdays = [
            'އާދިއްތަ',
            'ހޯމަ',
            'އަންގާރަ',
            'ބުދަ',
            'ބުރާސްފަތި',
            'ހުކުރު',
            'ހޮނިހިރު',
        ];

    moment.defineLocale('dv', {
        months: months$4,
        monthsShort: months$4,
        weekdays: weekdays,
        weekdaysShort: weekdays,
        weekdaysMin: 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'D/M/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        meridiemParse: /މކ|މފ/,
        isPM: function (input) {
            return 'މފ' === input;
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'މކ';
            } else {
                return 'މފ';
            }
        },
        calendar: {
            sameDay: '[މިއަދު] LT',
            nextDay: '[މާދަމާ] LT',
            nextWeek: 'dddd LT',
            lastDay: '[އިއްޔެ] LT',
            lastWeek: '[ފާއިތުވި] dddd LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'ތެރޭގައި %s',
            past: 'ކުރިން %s',
            s: 'ސިކުންތުކޮޅެއް',
            ss: 'd% ސިކުންތު',
            m: 'މިނިޓެއް',
            mm: 'މިނިޓު %d',
            h: 'ގަޑިއިރެއް',
            hh: 'ގަޑިއިރު %d',
            d: 'ދުވަހެއް',
            dd: 'ދުވަސް %d',
            M: 'މަހެއް',
            MM: 'މަސް %d',
            y: 'އަހަރެއް',
            yy: 'އަހަރު %d',
        },
        preparse: function (string) {
            return string.replace(/،/g, ',');
        },
        postformat: function (string) {
            return string.replace(/,/g, '،');
        },
        week: {
            dow: 7, // Sunday is the first day of the week.
            doy: 12, // The week that contains Jan 12th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function isFunction(input) {
        return (
            (typeof Function !== 'undefined' && input instanceof Function) ||
            Object.prototype.toString.call(input) === '[object Function]'
        );
    }

    moment.defineLocale('el', {
        monthsNominativeEl:
            'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split(
                '_'
            ),
        monthsGenitiveEl:
            'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split(
                '_'
            ),
        months: function (momentToFormat, format) {
            if (!momentToFormat) {
                return this._monthsNominativeEl;
            } else if (
                typeof format === 'string' &&
                /D/.test(format.substring(0, format.indexOf('MMMM')))
            ) {
                // if there is a day number before 'MMMM'
                return this._monthsGenitiveEl[momentToFormat.month()];
            } else {
                return this._monthsNominativeEl[momentToFormat.month()];
            }
        },
        monthsShort: 'Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ'.split('_'),
        weekdays: 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split(
            '_'
        ),
        weekdaysShort: 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'),
        weekdaysMin: 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'),
        meridiem: function (hours, minutes, isLower) {
            if (hours > 11) {
                return isLower ? 'μμ' : 'ΜΜ';
            } else {
                return isLower ? 'πμ' : 'ΠΜ';
            }
        },
        isPM: function (input) {
            return (input + '').toLowerCase()[0] === 'μ';
        },
        meridiemParse: /[ΠΜ]\.?Μ?\.?/i,
        longDateFormat: {
            LT: 'h:mm A',
            LTS: 'h:mm:ss A',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY h:mm A',
            LLLL: 'dddd, D MMMM YYYY h:mm A',
        },
        calendarEl: {
            sameDay: '[Σήμερα {}] LT',
            nextDay: '[Αύριο {}] LT',
            nextWeek: 'dddd [{}] LT',
            lastDay: '[Χθες {}] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 6:
                        return '[το προηγούμενο] dddd [{}] LT';
                    default:
                        return '[την προηγούμενη] dddd [{}] LT';
                }
            },
            sameElse: 'L',
        },
        calendar: function (key, mom) {
            var output = this._calendarEl[key],
                hours = mom && mom.hours();
            if (isFunction(output)) {
                output = output.apply(mom);
            }
            return output.replace('{}', hours % 12 === 1 ? 'στη' : 'στις');
        },
        relativeTime: {
            future: 'σε %s',
            past: '%s πριν',
            s: 'λίγα δευτερόλεπτα',
            ss: '%d δευτερόλεπτα',
            m: 'ένα λεπτό',
            mm: '%d λεπτά',
            h: 'μία ώρα',
            hh: '%d ώρες',
            d: 'μία μέρα',
            dd: '%d μέρες',
            M: 'ένας μήνας',
            MM: '%d μήνες',
            y: 'ένας χρόνος',
            yy: '%d χρόνια',
        },
        dayOfMonthOrdinalParse: /\d{1,2}η/,
        ordinal: '%dη',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4st is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('en-au', {
        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
            '_'
        ),
        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
        longDateFormat: {
            LT: 'h:mm A',
            LTS: 'h:mm:ss A',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY h:mm A',
            LLLL: 'dddd, D MMMM YYYY h:mm A',
        },
        calendar: {
            sameDay: '[Today at] LT',
            nextDay: '[Tomorrow at] LT',
            nextWeek: 'dddd [at] LT',
            lastDay: '[Yesterday at] LT',
            lastWeek: '[Last] dddd [at] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'in %s',
            past: '%s ago',
            s: 'a few seconds',
            ss: '%d seconds',
            m: 'a minute',
            mm: '%d minutes',
            h: 'an hour',
            hh: '%d hours',
            d: 'a day',
            dd: '%d days',
            M: 'a month',
            MM: '%d months',
            y: 'a year',
            yy: '%d years',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('en-ca', {
        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
            '_'
        ),
        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
        longDateFormat: {
            LT: 'h:mm A',
            LTS: 'h:mm:ss A',
            L: 'YYYY-MM-DD',
            LL: 'MMMM D, YYYY',
            LLL: 'MMMM D, YYYY h:mm A',
            LLLL: 'dddd, MMMM D, YYYY h:mm A',
        },
        calendar: {
            sameDay: '[Today at] LT',
            nextDay: '[Tomorrow at] LT',
            nextWeek: 'dddd [at] LT',
            lastDay: '[Yesterday at] LT',
            lastWeek: '[Last] dddd [at] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'in %s',
            past: '%s ago',
            s: 'a few seconds',
            ss: '%d seconds',
            m: 'a minute',
            mm: '%d minutes',
            h: 'an hour',
            hh: '%d hours',
            d: 'a day',
            dd: '%d days',
            M: 'a month',
            MM: '%d months',
            y: 'a year',
            yy: '%d years',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('en-gb', {
        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
            '_'
        ),
        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Today at] LT',
            nextDay: '[Tomorrow at] LT',
            nextWeek: 'dddd [at] LT',
            lastDay: '[Yesterday at] LT',
            lastWeek: '[Last] dddd [at] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'in %s',
            past: '%s ago',
            s: 'a few seconds',
            ss: '%d seconds',
            m: 'a minute',
            mm: '%d minutes',
            h: 'an hour',
            hh: '%d hours',
            d: 'a day',
            dd: '%d days',
            M: 'a month',
            MM: '%d months',
            y: 'a year',
            yy: '%d years',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('en-ie', {
        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
            '_'
        ),
        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Today at] LT',
            nextDay: '[Tomorrow at] LT',
            nextWeek: 'dddd [at] LT',
            lastDay: '[Yesterday at] LT',
            lastWeek: '[Last] dddd [at] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'in %s',
            past: '%s ago',
            s: 'a few seconds',
            ss: '%d seconds',
            m: 'a minute',
            mm: '%d minutes',
            h: 'an hour',
            hh: '%d hours',
            d: 'a day',
            dd: '%d days',
            M: 'a month',
            MM: '%d months',
            y: 'a year',
            yy: '%d years',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('en-il', {
        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
            '_'
        ),
        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Today at] LT',
            nextDay: '[Tomorrow at] LT',
            nextWeek: 'dddd [at] LT',
            lastDay: '[Yesterday at] LT',
            lastWeek: '[Last] dddd [at] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'in %s',
            past: '%s ago',
            s: 'a few seconds',
            ss: '%d seconds',
            m: 'a minute',
            mm: '%d minutes',
            h: 'an hour',
            hh: '%d hours',
            d: 'a day',
            dd: '%d days',
            M: 'a month',
            MM: '%d months',
            y: 'a year',
            yy: '%d years',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('en-in', {
        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
            '_'
        ),
        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
        longDateFormat: {
            LT: 'h:mm A',
            LTS: 'h:mm:ss A',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY h:mm A',
            LLLL: 'dddd, D MMMM YYYY h:mm A',
        },
        calendar: {
            sameDay: '[Today at] LT',
            nextDay: '[Tomorrow at] LT',
            nextWeek: 'dddd [at] LT',
            lastDay: '[Yesterday at] LT',
            lastWeek: '[Last] dddd [at] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'in %s',
            past: '%s ago',
            s: 'a few seconds',
            ss: '%d seconds',
            m: 'a minute',
            mm: '%d minutes',
            h: 'an hour',
            hh: '%d hours',
            d: 'a day',
            dd: '%d days',
            M: 'a month',
            MM: '%d months',
            y: 'a year',
            yy: '%d years',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 1st is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('en-nz', {
        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
            '_'
        ),
        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
        longDateFormat: {
            LT: 'h:mm A',
            LTS: 'h:mm:ss A',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY h:mm A',
            LLLL: 'dddd, D MMMM YYYY h:mm A',
        },
        calendar: {
            sameDay: '[Today at] LT',
            nextDay: '[Tomorrow at] LT',
            nextWeek: 'dddd [at] LT',
            lastDay: '[Yesterday at] LT',
            lastWeek: '[Last] dddd [at] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'in %s',
            past: '%s ago',
            s: 'a few seconds',
            ss: '%d seconds',
            m: 'a minute',
            mm: '%d minutes',
            h: 'an hour',
            hh: '%d hours',
            d: 'a day',
            dd: '%d days',
            M: 'a month',
            MM: '%d months',
            y: 'a year',
            yy: '%d years',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('en-sg', {
        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
            '_'
        ),
        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Today at] LT',
            nextDay: '[Tomorrow at] LT',
            nextWeek: 'dddd [at] LT',
            lastDay: '[Yesterday at] LT',
            lastWeek: '[Last] dddd [at] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'in %s',
            past: '%s ago',
            s: 'a few seconds',
            ss: '%d seconds',
            m: 'a minute',
            mm: '%d minutes',
            h: 'an hour',
            hh: '%d hours',
            d: 'a day',
            dd: '%d days',
            M: 'a month',
            MM: '%d months',
            y: 'a year',
            yy: '%d years',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('eo', {
        months: 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split(
            '_'
        ),
        monthsShort: 'jan_feb_mart_apr_maj_jun_jul_aŭg_sept_okt_nov_dec'.split('_'),
        weekdays: 'dimanĉo_lundo_mardo_merkredo_ĵaŭdo_vendredo_sabato'.split('_'),
        weekdaysShort: 'dim_lun_mard_merk_ĵaŭ_ven_sab'.split('_'),
        weekdaysMin: 'di_lu_ma_me_ĵa_ve_sa'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY-MM-DD',
            LL: '[la] D[-an de] MMMM, YYYY',
            LLL: '[la] D[-an de] MMMM, YYYY HH:mm',
            LLLL: 'dddd[n], [la] D[-an de] MMMM, YYYY HH:mm',
            llll: 'ddd, [la] D[-an de] MMM, YYYY HH:mm',
        },
        meridiemParse: /[ap]\.t\.m/i,
        isPM: function (input) {
            return input.charAt(0).toLowerCase() === 'p';
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours > 11) {
                return isLower ? 'p.t.m.' : 'P.T.M.';
            } else {
                return isLower ? 'a.t.m.' : 'A.T.M.';
            }
        },
        calendar: {
            sameDay: '[Hodiaŭ je] LT',
            nextDay: '[Morgaŭ je] LT',
            nextWeek: 'dddd[n je] LT',
            lastDay: '[Hieraŭ je] LT',
            lastWeek: '[pasintan] dddd[n je] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'post %s',
            past: 'antaŭ %s',
            s: 'kelkaj sekundoj',
            ss: '%d sekundoj',
            m: 'unu minuto',
            mm: '%d minutoj',
            h: 'unu horo',
            hh: '%d horoj',
            d: 'unu tago', //ne 'diurno', ĉar estas uzita por proksimumo
            dd: '%d tagoj',
            M: 'unu monato',
            MM: '%d monatoj',
            y: 'unu jaro',
            yy: '%d jaroj',
        },
        dayOfMonthOrdinalParse: /\d{1,2}a/,
        ordinal: '%da',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var monthsShortDot =
            'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(
                '_'
            ),
        monthsShort$1 = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
        monthsParse$2 = [
            /^ene/i,
            /^feb/i,
            /^mar/i,
            /^abr/i,
            /^may/i,
            /^jun/i,
            /^jul/i,
            /^ago/i,
            /^sep/i,
            /^oct/i,
            /^nov/i,
            /^dic/i,
        ],
        monthsRegex$2 =
            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;

    moment.defineLocale('es-do', {
        months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(
            '_'
        ),
        monthsShort: function (m, format) {
            if (!m) {
                return monthsShortDot;
            } else if (/-MMM-/.test(format)) {
                return monthsShort$1[m.month()];
            } else {
                return monthsShortDot[m.month()];
            }
        },
        monthsRegex: monthsRegex$2,
        monthsShortRegex: monthsRegex$2,
        monthsStrictRegex:
            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,
        monthsShortStrictRegex:
            /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,
        monthsParse: monthsParse$2,
        longMonthsParse: monthsParse$2,
        shortMonthsParse: monthsParse$2,
        weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
        weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
        weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'h:mm A',
            LTS: 'h:mm:ss A',
            L: 'DD/MM/YYYY',
            LL: 'D [de] MMMM [de] YYYY',
            LLL: 'D [de] MMMM [de] YYYY h:mm A',
            LLLL: 'dddd, D [de] MMMM [de] YYYY h:mm A',
        },
        calendar: {
            sameDay: function () {
                return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            nextDay: function () {
                return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            nextWeek: function () {
                return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            lastDay: function () {
                return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            lastWeek: function () {
                return (
                    '[el] dddd [pasado a la' +
                    (this.hours() !== 1 ? 's' : '') +
                    '] LT'
                );
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'en %s',
            past: 'hace %s',
            s: 'unos segundos',
            ss: '%d segundos',
            m: 'un minuto',
            mm: '%d minutos',
            h: 'una hora',
            hh: '%d horas',
            d: 'un día',
            dd: '%d días',
            w: 'una semana',
            ww: '%d semanas',
            M: 'un mes',
            MM: '%d meses',
            y: 'un año',
            yy: '%d años',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var monthsShortDot$1 =
            'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(
                '_'
            ),
        monthsShort$2 = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
        monthsParse$3 = [
            /^ene/i,
            /^feb/i,
            /^mar/i,
            /^abr/i,
            /^may/i,
            /^jun/i,
            /^jul/i,
            /^ago/i,
            /^sep/i,
            /^oct/i,
            /^nov/i,
            /^dic/i,
        ],
        monthsRegex$3 =
            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;

    moment.defineLocale('es-mx', {
        months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(
            '_'
        ),
        monthsShort: function (m, format) {
            if (!m) {
                return monthsShortDot$1;
            } else if (/-MMM-/.test(format)) {
                return monthsShort$2[m.month()];
            } else {
                return monthsShortDot$1[m.month()];
            }
        },
        monthsRegex: monthsRegex$3,
        monthsShortRegex: monthsRegex$3,
        monthsStrictRegex:
            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,
        monthsShortStrictRegex:
            /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,
        monthsParse: monthsParse$3,
        longMonthsParse: monthsParse$3,
        shortMonthsParse: monthsParse$3,
        weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
        weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
        weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D [de] MMMM [de] YYYY',
            LLL: 'D [de] MMMM [de] YYYY H:mm',
            LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm',
        },
        calendar: {
            sameDay: function () {
                return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            nextDay: function () {
                return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            nextWeek: function () {
                return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            lastDay: function () {
                return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            lastWeek: function () {
                return (
                    '[el] dddd [pasado a la' +
                    (this.hours() !== 1 ? 's' : '') +
                    '] LT'
                );
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'en %s',
            past: 'hace %s',
            s: 'unos segundos',
            ss: '%d segundos',
            m: 'un minuto',
            mm: '%d minutos',
            h: 'una hora',
            hh: '%d horas',
            d: 'un día',
            dd: '%d días',
            w: 'una semana',
            ww: '%d semanas',
            M: 'un mes',
            MM: '%d meses',
            y: 'un año',
            yy: '%d años',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
        invalidDate: 'Fecha inválida',
    });

    //! moment.js locale configuration

    var monthsShortDot$2 =
            'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(
                '_'
            ),
        monthsShort$3 = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
        monthsParse$4 = [
            /^ene/i,
            /^feb/i,
            /^mar/i,
            /^abr/i,
            /^may/i,
            /^jun/i,
            /^jul/i,
            /^ago/i,
            /^sep/i,
            /^oct/i,
            /^nov/i,
            /^dic/i,
        ],
        monthsRegex$4 =
            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;

    moment.defineLocale('es-us', {
        months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(
            '_'
        ),
        monthsShort: function (m, format) {
            if (!m) {
                return monthsShortDot$2;
            } else if (/-MMM-/.test(format)) {
                return monthsShort$3[m.month()];
            } else {
                return monthsShortDot$2[m.month()];
            }
        },
        monthsRegex: monthsRegex$4,
        monthsShortRegex: monthsRegex$4,
        monthsStrictRegex:
            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,
        monthsShortStrictRegex:
            /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,
        monthsParse: monthsParse$4,
        longMonthsParse: monthsParse$4,
        shortMonthsParse: monthsParse$4,
        weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
        weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
        weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'h:mm A',
            LTS: 'h:mm:ss A',
            L: 'MM/DD/YYYY',
            LL: 'D [de] MMMM [de] YYYY',
            LLL: 'D [de] MMMM [de] YYYY h:mm A',
            LLLL: 'dddd, D [de] MMMM [de] YYYY h:mm A',
        },
        calendar: {
            sameDay: function () {
                return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            nextDay: function () {
                return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            nextWeek: function () {
                return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            lastDay: function () {
                return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            lastWeek: function () {
                return (
                    '[el] dddd [pasado a la' +
                    (this.hours() !== 1 ? 's' : '') +
                    '] LT'
                );
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'en %s',
            past: 'hace %s',
            s: 'unos segundos',
            ss: '%d segundos',
            m: 'un minuto',
            mm: '%d minutos',
            h: 'una hora',
            hh: '%d horas',
            d: 'un día',
            dd: '%d días',
            w: 'una semana',
            ww: '%d semanas',
            M: 'un mes',
            MM: '%d meses',
            y: 'un año',
            yy: '%d años',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var monthsShortDot$3 =
            'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(
                '_'
            ),
        monthsShort$4 = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
        monthsParse$5 = [
            /^ene/i,
            /^feb/i,
            /^mar/i,
            /^abr/i,
            /^may/i,
            /^jun/i,
            /^jul/i,
            /^ago/i,
            /^sep/i,
            /^oct/i,
            /^nov/i,
            /^dic/i,
        ],
        monthsRegex$5 =
            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;

    moment.defineLocale('es', {
        months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(
            '_'
        ),
        monthsShort: function (m, format) {
            if (!m) {
                return monthsShortDot$3;
            } else if (/-MMM-/.test(format)) {
                return monthsShort$4[m.month()];
            } else {
                return monthsShortDot$3[m.month()];
            }
        },
        monthsRegex: monthsRegex$5,
        monthsShortRegex: monthsRegex$5,
        monthsStrictRegex:
            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,
        monthsShortStrictRegex:
            /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,
        monthsParse: monthsParse$5,
        longMonthsParse: monthsParse$5,
        shortMonthsParse: monthsParse$5,
        weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
        weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
        weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D [de] MMMM [de] YYYY',
            LLL: 'D [de] MMMM [de] YYYY H:mm',
            LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm',
        },
        calendar: {
            sameDay: function () {
                return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            nextDay: function () {
                return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            nextWeek: function () {
                return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            lastDay: function () {
                return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            lastWeek: function () {
                return (
                    '[el] dddd [pasado a la' +
                    (this.hours() !== 1 ? 's' : '') +
                    '] LT'
                );
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'en %s',
            past: 'hace %s',
            s: 'unos segundos',
            ss: '%d segundos',
            m: 'un minuto',
            mm: '%d minutos',
            h: 'una hora',
            hh: '%d horas',
            d: 'un día',
            dd: '%d días',
            w: 'una semana',
            ww: '%d semanas',
            M: 'un mes',
            MM: '%d meses',
            y: 'un año',
            yy: '%d años',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
        invalidDate: 'Fecha inválida',
    });

    //! moment.js locale configuration

    function processRelativeTime$3(number, withoutSuffix, key, isFuture) {
        var format = {
            s: ['mõne sekundi', 'mõni sekund', 'paar sekundit'],
            ss: [number + 'sekundi', number + 'sekundit'],
            m: ['ühe minuti', 'üks minut'],
            mm: [number + ' minuti', number + ' minutit'],
            h: ['ühe tunni', 'tund aega', 'üks tund'],
            hh: [number + ' tunni', number + ' tundi'],
            d: ['ühe päeva', 'üks päev'],
            M: ['kuu aja', 'kuu aega', 'üks kuu'],
            MM: [number + ' kuu', number + ' kuud'],
            y: ['ühe aasta', 'aasta', 'üks aasta'],
            yy: [number + ' aasta', number + ' aastat'],
        };
        if (withoutSuffix) {
            return format[key][2] ? format[key][2] : format[key][1];
        }
        return isFuture ? format[key][0] : format[key][1];
    }

    moment.defineLocale('et', {
        months: 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split(
            '_'
        ),
        monthsShort:
            'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'),
        weekdays:
            'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split(
                '_'
            ),
        weekdaysShort: 'P_E_T_K_N_R_L'.split('_'),
        weekdaysMin: 'P_E_T_K_N_R_L'.split('_'),
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY H:mm',
            LLLL: 'dddd, D. MMMM YYYY H:mm',
        },
        calendar: {
            sameDay: '[Täna,] LT',
            nextDay: '[Homme,] LT',
            nextWeek: '[Järgmine] dddd LT',
            lastDay: '[Eile,] LT',
            lastWeek: '[Eelmine] dddd LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s pärast',
            past: '%s tagasi',
            s: processRelativeTime$3,
            ss: processRelativeTime$3,
            m: processRelativeTime$3,
            mm: processRelativeTime$3,
            h: processRelativeTime$3,
            hh: processRelativeTime$3,
            d: processRelativeTime$3,
            dd: '%d päeva',
            M: processRelativeTime$3,
            MM: processRelativeTime$3,
            y: processRelativeTime$3,
            yy: processRelativeTime$3,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('eu', {
        months: 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split(
            '_'
        ),
        monthsShort:
            'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays:
            'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split(
                '_'
            ),
        weekdaysShort: 'ig._al._ar._az._og._ol._lr.'.split('_'),
        weekdaysMin: 'ig_al_ar_az_og_ol_lr'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY-MM-DD',
            LL: 'YYYY[ko] MMMM[ren] D[a]',
            LLL: 'YYYY[ko] MMMM[ren] D[a] HH:mm',
            LLLL: 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm',
            l: 'YYYY-M-D',
            ll: 'YYYY[ko] MMM D[a]',
            lll: 'YYYY[ko] MMM D[a] HH:mm',
            llll: 'ddd, YYYY[ko] MMM D[a] HH:mm',
        },
        calendar: {
            sameDay: '[gaur] LT[etan]',
            nextDay: '[bihar] LT[etan]',
            nextWeek: 'dddd LT[etan]',
            lastDay: '[atzo] LT[etan]',
            lastWeek: '[aurreko] dddd LT[etan]',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s barru',
            past: 'duela %s',
            s: 'segundo batzuk',
            ss: '%d segundo',
            m: 'minutu bat',
            mm: '%d minutu',
            h: 'ordu bat',
            hh: '%d ordu',
            d: 'egun bat',
            dd: '%d egun',
            M: 'hilabete bat',
            MM: '%d hilabete',
            y: 'urte bat',
            yy: '%d urte',
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var symbolMap$6 = {
            1: '۱',
            2: '۲',
            3: '۳',
            4: '۴',
            5: '۵',
            6: '۶',
            7: '۷',
            8: '۸',
            9: '۹',
            0: '۰',
        },
        numberMap$5 = {
            '۱': '1',
            '۲': '2',
            '۳': '3',
            '۴': '4',
            '۵': '5',
            '۶': '6',
            '۷': '7',
            '۸': '8',
            '۹': '9',
            '۰': '0',
        };

    moment.defineLocale('fa', {
        months: 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split(
            '_'
        ),
        monthsShort:
            'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split(
                '_'
            ),
        weekdays:
            'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split(
                '_'
            ),
        weekdaysShort:
            'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split(
                '_'
            ),
        weekdaysMin: 'ی_د_س_چ_پ_ج_ش'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        meridiemParse: /قبل از ظهر|بعد از ظهر/,
        isPM: function (input) {
            return /بعد از ظهر/.test(input);
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'قبل از ظهر';
            } else {
                return 'بعد از ظهر';
            }
        },
        calendar: {
            sameDay: '[امروز ساعت] LT',
            nextDay: '[فردا ساعت] LT',
            nextWeek: 'dddd [ساعت] LT',
            lastDay: '[دیروز ساعت] LT',
            lastWeek: 'dddd [پیش] [ساعت] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'در %s',
            past: '%s پیش',
            s: 'چند ثانیه',
            ss: '%d ثانیه',
            m: 'یک دقیقه',
            mm: '%d دقیقه',
            h: 'یک ساعت',
            hh: '%d ساعت',
            d: 'یک روز',
            dd: '%d روز',
            M: 'یک ماه',
            MM: '%d ماه',
            y: 'یک سال',
            yy: '%d سال',
        },
        preparse: function (string) {
            return string
                .replace(/[۰-۹]/g, function (match) {
                    return numberMap$5[match];
                })
                .replace(/،/g, ',');
        },
        postformat: function (string) {
            return string
                .replace(/\d/g, function (match) {
                    return symbolMap$6[match];
                })
                .replace(/,/g, '،');
        },
        dayOfMonthOrdinalParse: /\d{1,2}م/,
        ordinal: '%dم',
        week: {
            dow: 6, // Saturday is the first day of the week.
            doy: 12, // The week that contains Jan 12th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var numbersPast =
            'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(
                ' '
            ),
        numbersFuture = [
            'nolla',
            'yhden',
            'kahden',
            'kolmen',
            'neljän',
            'viiden',
            'kuuden',
            numbersPast[7],
            numbersPast[8],
            numbersPast[9],
        ];
    function translate$2(number, withoutSuffix, key, isFuture) {
        var result = '';
        switch (key) {
            case 's':
                return isFuture ? 'muutaman sekunnin' : 'muutama sekunti';
            case 'ss':
                result = isFuture ? 'sekunnin' : 'sekuntia';
                break;
            case 'm':
                return isFuture ? 'minuutin' : 'minuutti';
            case 'mm':
                result = isFuture ? 'minuutin' : 'minuuttia';
                break;
            case 'h':
                return isFuture ? 'tunnin' : 'tunti';
            case 'hh':
                result = isFuture ? 'tunnin' : 'tuntia';
                break;
            case 'd':
                return isFuture ? 'päivän' : 'päivä';
            case 'dd':
                result = isFuture ? 'päivän' : 'päivää';
                break;
            case 'M':
                return isFuture ? 'kuukauden' : 'kuukausi';
            case 'MM':
                result = isFuture ? 'kuukauden' : 'kuukautta';
                break;
            case 'y':
                return isFuture ? 'vuoden' : 'vuosi';
            case 'yy':
                result = isFuture ? 'vuoden' : 'vuotta';
                break;
        }
        result = verbalNumber(number, isFuture) + ' ' + result;
        return result;
    }
    function verbalNumber(number, isFuture) {
        return number < 10
            ? isFuture
                ? numbersFuture[number]
                : numbersPast[number]
            : number;
    }

    moment.defineLocale('fi', {
        months: 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split(
            '_'
        ),
        monthsShort:
            'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split(
                '_'
            ),
        weekdays:
            'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split(
                '_'
            ),
        weekdaysShort: 'su_ma_ti_ke_to_pe_la'.split('_'),
        weekdaysMin: 'su_ma_ti_ke_to_pe_la'.split('_'),
        longDateFormat: {
            LT: 'HH.mm',
            LTS: 'HH.mm.ss',
            L: 'DD.MM.YYYY',
            LL: 'Do MMMM[ta] YYYY',
            LLL: 'Do MMMM[ta] YYYY, [klo] HH.mm',
            LLLL: 'dddd, Do MMMM[ta] YYYY, [klo] HH.mm',
            l: 'D.M.YYYY',
            ll: 'Do MMM YYYY',
            lll: 'Do MMM YYYY, [klo] HH.mm',
            llll: 'ddd, Do MMM YYYY, [klo] HH.mm',
        },
        calendar: {
            sameDay: '[tänään] [klo] LT',
            nextDay: '[huomenna] [klo] LT',
            nextWeek: 'dddd [klo] LT',
            lastDay: '[eilen] [klo] LT',
            lastWeek: '[viime] dddd[na] [klo] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s päästä',
            past: '%s sitten',
            s: translate$2,
            ss: translate$2,
            m: translate$2,
            mm: translate$2,
            h: translate$2,
            hh: translate$2,
            d: translate$2,
            dd: translate$2,
            M: translate$2,
            MM: translate$2,
            y: translate$2,
            yy: translate$2,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('fil', {
        months: 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split(
            '_'
        ),
        monthsShort: 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),
        weekdays: 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split(
            '_'
        ),
        weekdaysShort: 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'),
        weekdaysMin: 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'MM/D/YYYY',
            LL: 'MMMM D, YYYY',
            LLL: 'MMMM D, YYYY HH:mm',
            LLLL: 'dddd, MMMM DD, YYYY HH:mm',
        },
        calendar: {
            sameDay: 'LT [ngayong araw]',
            nextDay: '[Bukas ng] LT',
            nextWeek: 'LT [sa susunod na] dddd',
            lastDay: 'LT [kahapon]',
            lastWeek: 'LT [noong nakaraang] dddd',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'sa loob ng %s',
            past: '%s ang nakalipas',
            s: 'ilang segundo',
            ss: '%d segundo',
            m: 'isang minuto',
            mm: '%d minuto',
            h: 'isang oras',
            hh: '%d oras',
            d: 'isang araw',
            dd: '%d araw',
            M: 'isang buwan',
            MM: '%d buwan',
            y: 'isang taon',
            yy: '%d taon',
        },
        dayOfMonthOrdinalParse: /\d{1,2}/,
        ordinal: function (number) {
            return number;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('fo', {
        months: 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split(
            '_'
        ),
        monthsShort: 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
        weekdays:
            'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split(
                '_'
            ),
        weekdaysShort: 'sun_mán_týs_mik_hós_frí_ley'.split('_'),
        weekdaysMin: 'su_má_tý_mi_hó_fr_le'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D. MMMM, YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Í dag kl.] LT',
            nextDay: '[Í morgin kl.] LT',
            nextWeek: 'dddd [kl.] LT',
            lastDay: '[Í gjár kl.] LT',
            lastWeek: '[síðstu] dddd [kl] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'um %s',
            past: '%s síðani',
            s: 'fá sekund',
            ss: '%d sekundir',
            m: 'ein minuttur',
            mm: '%d minuttir',
            h: 'ein tími',
            hh: '%d tímar',
            d: 'ein dagur',
            dd: '%d dagar',
            M: 'ein mánaður',
            MM: '%d mánaðir',
            y: 'eitt ár',
            yy: '%d ár',
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('fr-ca', {
        months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split(
            '_'
        ),
        monthsShort:
            'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
        weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
        weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY-MM-DD',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Aujourd’hui à] LT',
            nextDay: '[Demain à] LT',
            nextWeek: 'dddd [à] LT',
            lastDay: '[Hier à] LT',
            lastWeek: 'dddd [dernier à] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'dans %s',
            past: 'il y a %s',
            s: 'quelques secondes',
            ss: '%d secondes',
            m: 'une minute',
            mm: '%d minutes',
            h: 'une heure',
            hh: '%d heures',
            d: 'un jour',
            dd: '%d jours',
            M: 'un mois',
            MM: '%d mois',
            y: 'un an',
            yy: '%d ans',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(er|e)/,
        ordinal: function (number, period) {
            switch (period) {
                // Words with masculine grammatical gender: mois, trimestre, jour
                default:
                case 'M':
                case 'Q':
                case 'D':
                case 'DDD':
                case 'd':
                    return number + (number === 1 ? 'er' : 'e');

                // Words with feminine grammatical gender: semaine
                case 'w':
                case 'W':
                    return number + (number === 1 ? 're' : 'e');
            }
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('fr-ch', {
        months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split(
            '_'
        ),
        monthsShort:
            'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
        weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
        weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Aujourd’hui à] LT',
            nextDay: '[Demain à] LT',
            nextWeek: 'dddd [à] LT',
            lastDay: '[Hier à] LT',
            lastWeek: 'dddd [dernier à] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'dans %s',
            past: 'il y a %s',
            s: 'quelques secondes',
            ss: '%d secondes',
            m: 'une minute',
            mm: '%d minutes',
            h: 'une heure',
            hh: '%d heures',
            d: 'un jour',
            dd: '%d jours',
            M: 'un mois',
            MM: '%d mois',
            y: 'un an',
            yy: '%d ans',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(er|e)/,
        ordinal: function (number, period) {
            switch (period) {
                // Words with masculine grammatical gender: mois, trimestre, jour
                default:
                case 'M':
                case 'Q':
                case 'D':
                case 'DDD':
                case 'd':
                    return number + (number === 1 ? 'er' : 'e');

                // Words with feminine grammatical gender: semaine
                case 'w':
                case 'W':
                    return number + (number === 1 ? 're' : 'e');
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var monthsStrictRegex$1 =
            /^(janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i,
        monthsShortStrictRegex$1 =
            /(janv\.?|févr\.?|mars|avr\.?|mai|juin|juil\.?|août|sept\.?|oct\.?|nov\.?|déc\.?)/i,
        monthsRegex$6 =
            /(janv\.?|févr\.?|mars|avr\.?|mai|juin|juil\.?|août|sept\.?|oct\.?|nov\.?|déc\.?|janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i,
        monthsParse$6 = [
            /^janv/i,
            /^févr/i,
            /^mars/i,
            /^avr/i,
            /^mai/i,
            /^juin/i,
            /^juil/i,
            /^août/i,
            /^sept/i,
            /^oct/i,
            /^nov/i,
            /^déc/i,
        ];

    moment.defineLocale('fr', {
        months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split(
            '_'
        ),
        monthsShort:
            'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split(
                '_'
            ),
        monthsRegex: monthsRegex$6,
        monthsShortRegex: monthsRegex$6,
        monthsStrictRegex: monthsStrictRegex$1,
        monthsShortStrictRegex: monthsShortStrictRegex$1,
        monthsParse: monthsParse$6,
        longMonthsParse: monthsParse$6,
        shortMonthsParse: monthsParse$6,
        weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
        weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
        weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Aujourd’hui à] LT',
            nextDay: '[Demain à] LT',
            nextWeek: 'dddd [à] LT',
            lastDay: '[Hier à] LT',
            lastWeek: 'dddd [dernier à] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'dans %s',
            past: 'il y a %s',
            s: 'quelques secondes',
            ss: '%d secondes',
            m: 'une minute',
            mm: '%d minutes',
            h: 'une heure',
            hh: '%d heures',
            d: 'un jour',
            dd: '%d jours',
            w: 'une semaine',
            ww: '%d semaines',
            M: 'un mois',
            MM: '%d mois',
            y: 'un an',
            yy: '%d ans',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(er|)/,
        ordinal: function (number, period) {
            switch (period) {
                // TODO: Return 'e' when day of month > 1. Move this case inside
                // block for masculine words below.
                // See https://github.com/moment/moment/issues/3375
                case 'D':
                    return number + (number === 1 ? 'er' : '');

                // Words with masculine grammatical gender: mois, trimestre, jour
                default:
                case 'M':
                case 'Q':
                case 'DDD':
                case 'd':
                    return number + (number === 1 ? 'er' : 'e');

                // Words with feminine grammatical gender: semaine
                case 'w':
                case 'W':
                    return number + (number === 1 ? 're' : 'e');
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var monthsShortWithDots =
            'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'),
        monthsShortWithoutDots =
            'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_');

    moment.defineLocale('fy', {
        months: 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split(
            '_'
        ),
        monthsShort: function (m, format) {
            if (!m) {
                return monthsShortWithDots;
            } else if (/-MMM-/.test(format)) {
                return monthsShortWithoutDots[m.month()];
            } else {
                return monthsShortWithDots[m.month()];
            }
        },
        monthsParseExact: true,
        weekdays: 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split(
            '_'
        ),
        weekdaysShort: 'si._mo._ti._wo._to._fr._so.'.split('_'),
        weekdaysMin: 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD-MM-YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[hjoed om] LT',
            nextDay: '[moarn om] LT',
            nextWeek: 'dddd [om] LT',
            lastDay: '[juster om] LT',
            lastWeek: '[ôfrûne] dddd [om] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'oer %s',
            past: '%s lyn',
            s: 'in pear sekonden',
            ss: '%d sekonden',
            m: 'ien minút',
            mm: '%d minuten',
            h: 'ien oere',
            hh: '%d oeren',
            d: 'ien dei',
            dd: '%d dagen',
            M: 'ien moanne',
            MM: '%d moannen',
            y: 'ien jier',
            yy: '%d jierren',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/,
        ordinal: function (number) {
            return (
                number +
                (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')
            );
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var months$5 = [
            'Eanáir',
            'Feabhra',
            'Márta',
            'Aibreán',
            'Bealtaine',
            'Meitheamh',
            'Iúil',
            'Lúnasa',
            'Meán Fómhair',
            'Deireadh Fómhair',
            'Samhain',
            'Nollaig',
        ],
        monthsShort$5 = [
            'Ean',
            'Feabh',
            'Márt',
            'Aib',
            'Beal',
            'Meith',
            'Iúil',
            'Lún',
            'M.F.',
            'D.F.',
            'Samh',
            'Noll',
        ],
        weekdays$1 = [
            'Dé Domhnaigh',
            'Dé Luain',
            'Dé Máirt',
            'Dé Céadaoin',
            'Déardaoin',
            'Dé hAoine',
            'Dé Sathairn',
        ],
        weekdaysShort = ['Domh', 'Luan', 'Máirt', 'Céad', 'Déar', 'Aoine', 'Sath'],
        weekdaysMin = ['Do', 'Lu', 'Má', 'Cé', 'Dé', 'A', 'Sa'];

    moment.defineLocale('ga', {
        months: months$5,
        monthsShort: monthsShort$5,
        monthsParseExact: true,
        weekdays: weekdays$1,
        weekdaysShort: weekdaysShort,
        weekdaysMin: weekdaysMin,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Inniu ag] LT',
            nextDay: '[Amárach ag] LT',
            nextWeek: 'dddd [ag] LT',
            lastDay: '[Inné ag] LT',
            lastWeek: 'dddd [seo caite] [ag] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'i %s',
            past: '%s ó shin',
            s: 'cúpla soicind',
            ss: '%d soicind',
            m: 'nóiméad',
            mm: '%d nóiméad',
            h: 'uair an chloig',
            hh: '%d uair an chloig',
            d: 'lá',
            dd: '%d lá',
            M: 'mí',
            MM: '%d míonna',
            y: 'bliain',
            yy: '%d bliain',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(d|na|mh)/,
        ordinal: function (number) {
            var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var months$6 = [
            'Am Faoilleach',
            'An Gearran',
            'Am Màrt',
            'An Giblean',
            'An Cèitean',
            'An t-Ògmhios',
            'An t-Iuchar',
            'An Lùnastal',
            'An t-Sultain',
            'An Dàmhair',
            'An t-Samhain',
            'An Dùbhlachd',
        ],
        monthsShort$6 = [
            'Faoi',
            'Gear',
            'Màrt',
            'Gibl',
            'Cèit',
            'Ògmh',
            'Iuch',
            'Lùn',
            'Sult',
            'Dàmh',
            'Samh',
            'Dùbh',
        ],
        weekdays$2 = [
            'Didòmhnaich',
            'Diluain',
            'Dimàirt',
            'Diciadain',
            'Diardaoin',
            'Dihaoine',
            'Disathairne',
        ],
        weekdaysShort$1 = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis'],
        weekdaysMin$1 = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa'];

    moment.defineLocale('gd', {
        months: months$6,
        monthsShort: monthsShort$6,
        monthsParseExact: true,
        weekdays: weekdays$2,
        weekdaysShort: weekdaysShort$1,
        weekdaysMin: weekdaysMin$1,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[An-diugh aig] LT',
            nextDay: '[A-màireach aig] LT',
            nextWeek: 'dddd [aig] LT',
            lastDay: '[An-dè aig] LT',
            lastWeek: 'dddd [seo chaidh] [aig] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'ann an %s',
            past: 'bho chionn %s',
            s: 'beagan diogan',
            ss: '%d diogan',
            m: 'mionaid',
            mm: '%d mionaidean',
            h: 'uair',
            hh: '%d uairean',
            d: 'latha',
            dd: '%d latha',
            M: 'mìos',
            MM: '%d mìosan',
            y: 'bliadhna',
            yy: '%d bliadhna',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(d|na|mh)/,
        ordinal: function (number) {
            var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('gl', {
        months: 'xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro'.split(
            '_'
        ),
        monthsShort:
            'xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'domingo_luns_martes_mércores_xoves_venres_sábado'.split('_'),
        weekdaysShort: 'dom._lun._mar._mér._xov._ven._sáb.'.split('_'),
        weekdaysMin: 'do_lu_ma_mé_xo_ve_sá'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D [de] MMMM [de] YYYY',
            LLL: 'D [de] MMMM [de] YYYY H:mm',
            LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm',
        },
        calendar: {
            sameDay: function () {
                return '[hoxe ' + (this.hours() !== 1 ? 'ás' : 'á') + '] LT';
            },
            nextDay: function () {
                return '[mañá ' + (this.hours() !== 1 ? 'ás' : 'á') + '] LT';
            },
            nextWeek: function () {
                return 'dddd [' + (this.hours() !== 1 ? 'ás' : 'a') + '] LT';
            },
            lastDay: function () {
                return '[onte ' + (this.hours() !== 1 ? 'á' : 'a') + '] LT';
            },
            lastWeek: function () {
                return (
                    '[o] dddd [pasado ' + (this.hours() !== 1 ? 'ás' : 'a') + '] LT'
                );
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: function (str) {
                if (str.indexOf('un') === 0) {
                    return 'n' + str;
                }
                return 'en ' + str;
            },
            past: 'hai %s',
            s: 'uns segundos',
            ss: '%d segundos',
            m: 'un minuto',
            mm: '%d minutos',
            h: 'unha hora',
            hh: '%d horas',
            d: 'un día',
            dd: '%d días',
            M: 'un mes',
            MM: '%d meses',
            y: 'un ano',
            yy: '%d anos',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function processRelativeTime$4(number, withoutSuffix, key, isFuture) {
        var format = {
            s: ['थोडया सॅकंडांनी', 'थोडे सॅकंड'],
            ss: [number + ' सॅकंडांनी', number + ' सॅकंड'],
            m: ['एका मिणटान', 'एक मिनूट'],
            mm: [number + ' मिणटांनी', number + ' मिणटां'],
            h: ['एका वरान', 'एक वर'],
            hh: [number + ' वरांनी', number + ' वरां'],
            d: ['एका दिसान', 'एक दीस'],
            dd: [number + ' दिसांनी', number + ' दीस'],
            M: ['एका म्हयन्यान', 'एक म्हयनो'],
            MM: [number + ' म्हयन्यानी', number + ' म्हयने'],
            y: ['एका वर्सान', 'एक वर्स'],
            yy: [number + ' वर्सांनी', number + ' वर्सां'],
        };
        return isFuture ? format[key][0] : format[key][1];
    }

    moment.defineLocale('gom-deva', {
        months: {
            standalone:
                'जानेवारी_फेब्रुवारी_मार्च_एप्रील_मे_जून_जुलय_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split(
                    '_'
                ),
            format: 'जानेवारीच्या_फेब्रुवारीच्या_मार्चाच्या_एप्रीलाच्या_मेयाच्या_जूनाच्या_जुलयाच्या_ऑगस्टाच्या_सप्टेंबराच्या_ऑक्टोबराच्या_नोव्हेंबराच्या_डिसेंबराच्या'.split(
                '_'
            ),
            isFormat: /MMMM(\s)+D[oD]?/,
        },
        monthsShort:
            'जाने._फेब्रु._मार्च_एप्री._मे_जून_जुल._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'आयतार_सोमार_मंगळार_बुधवार_बिरेस्तार_सुक्रार_शेनवार'.split('_'),
        weekdaysShort: 'आयत._सोम._मंगळ._बुध._ब्रेस्त._सुक्र._शेन.'.split('_'),
        weekdaysMin: 'आ_सो_मं_बु_ब्रे_सु_शे'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'A h:mm [वाजतां]',
            LTS: 'A h:mm:ss [वाजतां]',
            L: 'DD-MM-YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY A h:mm [वाजतां]',
            LLLL: 'dddd, MMMM Do, YYYY, A h:mm [वाजतां]',
            llll: 'ddd, D MMM YYYY, A h:mm [वाजतां]',
        },
        calendar: {
            sameDay: '[आयज] LT',
            nextDay: '[फाल्यां] LT',
            nextWeek: '[फुडलो] dddd[,] LT',
            lastDay: '[काल] LT',
            lastWeek: '[फाटलो] dddd[,] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s',
            past: '%s आदीं',
            s: processRelativeTime$4,
            ss: processRelativeTime$4,
            m: processRelativeTime$4,
            mm: processRelativeTime$4,
            h: processRelativeTime$4,
            hh: processRelativeTime$4,
            d: processRelativeTime$4,
            dd: processRelativeTime$4,
            M: processRelativeTime$4,
            MM: processRelativeTime$4,
            y: processRelativeTime$4,
            yy: processRelativeTime$4,
        },
        dayOfMonthOrdinalParse: /\d{1,2}(वेर)/,
        ordinal: function (number, period) {
            switch (period) {
                // the ordinal 'वेर' only applies to day of the month
                case 'D':
                    return number + 'वेर';
                default:
                case 'M':
                case 'Q':
                case 'DDD':
                case 'd':
                case 'w':
                case 'W':
                    return number;
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week
            doy: 3, // The week that contains Jan 4th is the first week of the year (7 + 0 - 4)
        },
        meridiemParse: /राती|सकाळीं|दनपारां|सांजे/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'राती') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'सकाळीं') {
                return hour;
            } else if (meridiem === 'दनपारां') {
                return hour > 12 ? hour : hour + 12;
            } else if (meridiem === 'सांजे') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'राती';
            } else if (hour < 12) {
                return 'सकाळीं';
            } else if (hour < 16) {
                return 'दनपारां';
            } else if (hour < 20) {
                return 'सांजे';
            } else {
                return 'राती';
            }
        },
    });

    //! moment.js locale configuration

    function processRelativeTime$5(number, withoutSuffix, key, isFuture) {
        var format = {
            s: ['thoddea sekondamni', 'thodde sekond'],
            ss: [number + ' sekondamni', number + ' sekond'],
            m: ['eka mintan', 'ek minut'],
            mm: [number + ' mintamni', number + ' mintam'],
            h: ['eka voran', 'ek vor'],
            hh: [number + ' voramni', number + ' voram'],
            d: ['eka disan', 'ek dis'],
            dd: [number + ' disamni', number + ' dis'],
            M: ['eka mhoinean', 'ek mhoino'],
            MM: [number + ' mhoineamni', number + ' mhoine'],
            y: ['eka vorsan', 'ek voros'],
            yy: [number + ' vorsamni', number + ' vorsam'],
        };
        return isFuture ? format[key][0] : format[key][1];
    }

    moment.defineLocale('gom-latn', {
        months: {
            standalone:
                'Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr'.split(
                    '_'
                ),
            format: 'Janerachea_Febrerachea_Marsachea_Abrilachea_Maiachea_Junachea_Julaiachea_Agostachea_Setembrachea_Otubrachea_Novembrachea_Dezembrachea'.split(
                '_'
            ),
            isFormat: /MMMM(\s)+D[oD]?/,
        },
        monthsShort:
            'Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.'.split('_'),
        monthsParseExact: true,
        weekdays: "Aitar_Somar_Mongllar_Budhvar_Birestar_Sukrar_Son'var".split('_'),
        weekdaysShort: 'Ait._Som._Mon._Bud._Bre._Suk._Son.'.split('_'),
        weekdaysMin: 'Ai_Sm_Mo_Bu_Br_Su_Sn'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'A h:mm [vazta]',
            LTS: 'A h:mm:ss [vazta]',
            L: 'DD-MM-YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY A h:mm [vazta]',
            LLLL: 'dddd, MMMM Do, YYYY, A h:mm [vazta]',
            llll: 'ddd, D MMM YYYY, A h:mm [vazta]',
        },
        calendar: {
            sameDay: '[Aiz] LT',
            nextDay: '[Faleam] LT',
            nextWeek: '[Fuddlo] dddd[,] LT',
            lastDay: '[Kal] LT',
            lastWeek: '[Fattlo] dddd[,] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s',
            past: '%s adim',
            s: processRelativeTime$5,
            ss: processRelativeTime$5,
            m: processRelativeTime$5,
            mm: processRelativeTime$5,
            h: processRelativeTime$5,
            hh: processRelativeTime$5,
            d: processRelativeTime$5,
            dd: processRelativeTime$5,
            M: processRelativeTime$5,
            MM: processRelativeTime$5,
            y: processRelativeTime$5,
            yy: processRelativeTime$5,
        },
        dayOfMonthOrdinalParse: /\d{1,2}(er)/,
        ordinal: function (number, period) {
            switch (period) {
                // the ordinal 'er' only applies to day of the month
                case 'D':
                    return number + 'er';
                default:
                case 'M':
                case 'Q':
                case 'DDD':
                case 'd':
                case 'w':
                case 'W':
                    return number;
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week
            doy: 3, // The week that contains Jan 4th is the first week of the year (7 + 0 - 4)
        },
        meridiemParse: /rati|sokallim|donparam|sanje/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'rati') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'sokallim') {
                return hour;
            } else if (meridiem === 'donparam') {
                return hour > 12 ? hour : hour + 12;
            } else if (meridiem === 'sanje') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'rati';
            } else if (hour < 12) {
                return 'sokallim';
            } else if (hour < 16) {
                return 'donparam';
            } else if (hour < 20) {
                return 'sanje';
            } else {
                return 'rati';
            }
        },
    });

    //! moment.js locale configuration

    var symbolMap$7 = {
            1: '૧',
            2: '૨',
            3: '૩',
            4: '૪',
            5: '૫',
            6: '૬',
            7: '૭',
            8: '૮',
            9: '૯',
            0: '૦',
        },
        numberMap$6 = {
            '૧': '1',
            '૨': '2',
            '૩': '3',
            '૪': '4',
            '૫': '5',
            '૬': '6',
            '૭': '7',
            '૮': '8',
            '૯': '9',
            '૦': '0',
        };

    moment.defineLocale('gu', {
        months: 'જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર'.split(
            '_'
        ),
        monthsShort:
            'જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'રવિવાર_સોમવાર_મંગળવાર_બુધ્વાર_ગુરુવાર_શુક્રવાર_શનિવાર'.split(
            '_'
        ),
        weekdaysShort: 'રવિ_સોમ_મંગળ_બુધ્_ગુરુ_શુક્ર_શનિ'.split('_'),
        weekdaysMin: 'ર_સો_મં_બુ_ગુ_શુ_શ'.split('_'),
        longDateFormat: {
            LT: 'A h:mm વાગ્યે',
            LTS: 'A h:mm:ss વાગ્યે',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm વાગ્યે',
            LLLL: 'dddd, D MMMM YYYY, A h:mm વાગ્યે',
        },
        calendar: {
            sameDay: '[આજ] LT',
            nextDay: '[કાલે] LT',
            nextWeek: 'dddd, LT',
            lastDay: '[ગઇકાલે] LT',
            lastWeek: '[પાછલા] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s મા',
            past: '%s પહેલા',
            s: 'અમુક પળો',
            ss: '%d સેકંડ',
            m: 'એક મિનિટ',
            mm: '%d મિનિટ',
            h: 'એક કલાક',
            hh: '%d કલાક',
            d: 'એક દિવસ',
            dd: '%d દિવસ',
            M: 'એક મહિનો',
            MM: '%d મહિનો',
            y: 'એક વર્ષ',
            yy: '%d વર્ષ',
        },
        preparse: function (string) {
            return string.replace(/[૧૨૩૪૫૬૭૮૯૦]/g, function (match) {
                return numberMap$6[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap$7[match];
            });
        },
        // Gujarati notation for meridiems are quite fuzzy in practice. While there exists
        // a rigid notion of a 'Pahar' it is not used as rigidly in modern Gujarati.
        meridiemParse: /રાત|બપોર|સવાર|સાંજ/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'રાત') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'સવાર') {
                return hour;
            } else if (meridiem === 'બપોર') {
                return hour >= 10 ? hour : hour + 12;
            } else if (meridiem === 'સાંજ') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'રાત';
            } else if (hour < 10) {
                return 'સવાર';
            } else if (hour < 17) {
                return 'બપોર';
            } else if (hour < 20) {
                return 'સાંજ';
            } else {
                return 'રાત';
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('he', {
        months: 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split(
            '_'
        ),
        monthsShort:
            'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'),
        weekdays: 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'),
        weekdaysShort: 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'),
        weekdaysMin: 'א_ב_ג_ד_ה_ו_ש'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D [ב]MMMM YYYY',
            LLL: 'D [ב]MMMM YYYY HH:mm',
            LLLL: 'dddd, D [ב]MMMM YYYY HH:mm',
            l: 'D/M/YYYY',
            ll: 'D MMM YYYY',
            lll: 'D MMM YYYY HH:mm',
            llll: 'ddd, D MMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[היום ב־]LT',
            nextDay: '[מחר ב־]LT',
            nextWeek: 'dddd [בשעה] LT',
            lastDay: '[אתמול ב־]LT',
            lastWeek: '[ביום] dddd [האחרון בשעה] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'בעוד %s',
            past: 'לפני %s',
            s: 'מספר שניות',
            ss: '%d שניות',
            m: 'דקה',
            mm: '%d דקות',
            h: 'שעה',
            hh: function (number) {
                if (number === 2) {
                    return 'שעתיים';
                }
                return number + ' שעות';
            },
            d: 'יום',
            dd: function (number) {
                if (number === 2) {
                    return 'יומיים';
                }
                return number + ' ימים';
            },
            M: 'חודש',
            MM: function (number) {
                if (number === 2) {
                    return 'חודשיים';
                }
                return number + ' חודשים';
            },
            y: 'שנה',
            yy: function (number) {
                if (number === 2) {
                    return 'שנתיים';
                } else if (number % 10 === 0 && number !== 10) {
                    return number + ' שנה';
                }
                return number + ' שנים';
            },
        },
        meridiemParse:
            /אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,
        isPM: function (input) {
            return /^(אחה"צ|אחרי הצהריים|בערב)$/.test(input);
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 5) {
                return 'לפנות בוקר';
            } else if (hour < 10) {
                return 'בבוקר';
            } else if (hour < 12) {
                return isLower ? 'לפנה"צ' : 'לפני הצהריים';
            } else if (hour < 18) {
                return isLower ? 'אחה"צ' : 'אחרי הצהריים';
            } else {
                return 'בערב';
            }
        },
    });

    //! moment.js locale configuration

    var symbolMap$8 = {
            1: '१',
            2: '२',
            3: '३',
            4: '४',
            5: '५',
            6: '६',
            7: '७',
            8: '८',
            9: '९',
            0: '०',
        },
        numberMap$7 = {
            '१': '1',
            '२': '2',
            '३': '3',
            '४': '4',
            '५': '5',
            '६': '6',
            '७': '7',
            '८': '8',
            '९': '9',
            '०': '0',
        },
        monthsParse$7 = [
            /^जन/i,
            /^फ़र|फर/i,
            /^मार्च/i,
            /^अप्रै/i,
            /^मई/i,
            /^जून/i,
            /^जुल/i,
            /^अग/i,
            /^सितं|सित/i,
            /^अक्टू/i,
            /^नव|नवं/i,
            /^दिसं|दिस/i,
        ],
        shortMonthsParse = [
            /^जन/i,
            /^फ़र/i,
            /^मार्च/i,
            /^अप्रै/i,
            /^मई/i,
            /^जून/i,
            /^जुल/i,
            /^अग/i,
            /^सित/i,
            /^अक्टू/i,
            /^नव/i,
            /^दिस/i,
        ];

    moment.defineLocale('hi', {
        months: {
            format: 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split(
                '_'
            ),
            standalone:
                'जनवरी_फरवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितंबर_अक्टूबर_नवंबर_दिसंबर'.split(
                    '_'
                ),
        },
        monthsShort:
            'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'),
        weekdays: 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
        weekdaysShort: 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'),
        weekdaysMin: 'र_सो_मं_बु_गु_शु_श'.split('_'),
        longDateFormat: {
            LT: 'A h:mm बजे',
            LTS: 'A h:mm:ss बजे',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm बजे',
            LLLL: 'dddd, D MMMM YYYY, A h:mm बजे',
        },

        monthsParse: monthsParse$7,
        longMonthsParse: monthsParse$7,
        shortMonthsParse: shortMonthsParse,

        monthsRegex:
            /^(जनवरी|जन\.?|फ़रवरी|फरवरी|फ़र\.?|मार्च?|अप्रैल|अप्रै\.?|मई?|जून?|जुलाई|जुल\.?|अगस्त|अग\.?|सितम्बर|सितंबर|सित\.?|अक्टूबर|अक्टू\.?|नवम्बर|नवंबर|नव\.?|दिसम्बर|दिसंबर|दिस\.?)/i,

        monthsShortRegex:
            /^(जनवरी|जन\.?|फ़रवरी|फरवरी|फ़र\.?|मार्च?|अप्रैल|अप्रै\.?|मई?|जून?|जुलाई|जुल\.?|अगस्त|अग\.?|सितम्बर|सितंबर|सित\.?|अक्टूबर|अक्टू\.?|नवम्बर|नवंबर|नव\.?|दिसम्बर|दिसंबर|दिस\.?)/i,

        monthsStrictRegex:
            /^(जनवरी?|फ़रवरी|फरवरी?|मार्च?|अप्रैल?|मई?|जून?|जुलाई?|अगस्त?|सितम्बर|सितंबर|सित?\.?|अक्टूबर|अक्टू\.?|नवम्बर|नवंबर?|दिसम्बर|दिसंबर?)/i,

        monthsShortStrictRegex:
            /^(जन\.?|फ़र\.?|मार्च?|अप्रै\.?|मई?|जून?|जुल\.?|अग\.?|सित\.?|अक्टू\.?|नव\.?|दिस\.?)/i,

        calendar: {
            sameDay: '[आज] LT',
            nextDay: '[कल] LT',
            nextWeek: 'dddd, LT',
            lastDay: '[कल] LT',
            lastWeek: '[पिछले] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s में',
            past: '%s पहले',
            s: 'कुछ ही क्षण',
            ss: '%d सेकंड',
            m: 'एक मिनट',
            mm: '%d मिनट',
            h: 'एक घंटा',
            hh: '%d घंटे',
            d: 'एक दिन',
            dd: '%d दिन',
            M: 'एक महीने',
            MM: '%d महीने',
            y: 'एक वर्ष',
            yy: '%d वर्ष',
        },
        preparse: function (string) {
            return string.replace(/[१२३४५६७८९०]/g, function (match) {
                return numberMap$7[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap$8[match];
            });
        },
        // Hindi notation for meridiems are quite fuzzy in practice. While there exists
        // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.
        meridiemParse: /रात|सुबह|दोपहर|शाम/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'रात') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'सुबह') {
                return hour;
            } else if (meridiem === 'दोपहर') {
                return hour >= 10 ? hour : hour + 12;
            } else if (meridiem === 'शाम') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'रात';
            } else if (hour < 10) {
                return 'सुबह';
            } else if (hour < 17) {
                return 'दोपहर';
            } else if (hour < 20) {
                return 'शाम';
            } else {
                return 'रात';
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function translate$3(number, withoutSuffix, key) {
        var result = number + ' ';
        switch (key) {
            case 'ss':
                if (number === 1) {
                    result += 'sekunda';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'sekunde';
                } else {
                    result += 'sekundi';
                }
                return result;
            case 'm':
                return withoutSuffix ? 'jedna minuta' : 'jedne minute';
            case 'mm':
                if (number === 1) {
                    result += 'minuta';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'minute';
                } else {
                    result += 'minuta';
                }
                return result;
            case 'h':
                return withoutSuffix ? 'jedan sat' : 'jednog sata';
            case 'hh':
                if (number === 1) {
                    result += 'sat';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'sata';
                } else {
                    result += 'sati';
                }
                return result;
            case 'dd':
                if (number === 1) {
                    result += 'dan';
                } else {
                    result += 'dana';
                }
                return result;
            case 'MM':
                if (number === 1) {
                    result += 'mjesec';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'mjeseca';
                } else {
                    result += 'mjeseci';
                }
                return result;
            case 'yy':
                if (number === 1) {
                    result += 'godina';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'godine';
                } else {
                    result += 'godina';
                }
                return result;
        }
    }

    moment.defineLocale('hr', {
        months: {
            format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split(
                '_'
            ),
            standalone:
                'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split(
                    '_'
                ),
        },
        monthsShort:
            'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split(
            '_'
        ),
        weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
        weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'Do MMMM YYYY',
            LLL: 'Do MMMM YYYY H:mm',
            LLLL: 'dddd, Do MMMM YYYY H:mm',
        },
        calendar: {
            sameDay: '[danas u] LT',
            nextDay: '[sutra u] LT',
            nextWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[u] [nedjelju] [u] LT';
                    case 3:
                        return '[u] [srijedu] [u] LT';
                    case 6:
                        return '[u] [subotu] [u] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[u] dddd [u] LT';
                }
            },
            lastDay: '[jučer u] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[prošlu] [nedjelju] [u] LT';
                    case 3:
                        return '[prošlu] [srijedu] [u] LT';
                    case 6:
                        return '[prošle] [subote] [u] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[prošli] dddd [u] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'za %s',
            past: 'prije %s',
            s: 'par sekundi',
            ss: translate$3,
            m: translate$3,
            mm: translate$3,
            h: translate$3,
            hh: translate$3,
            d: 'dan',
            dd: translate$3,
            M: 'mjesec',
            MM: translate$3,
            y: 'godinu',
            yy: translate$3,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var weekEndings =
        'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');
    function translate$4(number, withoutSuffix, key, isFuture) {
        var num = number;
        switch (key) {
            case 's':
                return isFuture || withoutSuffix
                    ? 'néhány másodperc'
                    : 'néhány másodperce';
            case 'ss':
                return num + (isFuture || withoutSuffix)
                    ? ' másodperc'
                    : ' másodperce';
            case 'm':
                return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce');
            case 'mm':
                return num + (isFuture || withoutSuffix ? ' perc' : ' perce');
            case 'h':
                return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája');
            case 'hh':
                return num + (isFuture || withoutSuffix ? ' óra' : ' órája');
            case 'd':
                return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja');
            case 'dd':
                return num + (isFuture || withoutSuffix ? ' nap' : ' napja');
            case 'M':
                return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
            case 'MM':
                return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
            case 'y':
                return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve');
            case 'yy':
                return num + (isFuture || withoutSuffix ? ' év' : ' éve');
        }
        return '';
    }
    function week(isFuture) {
        return (
            (isFuture ? '' : '[múlt] ') +
            '[' +
            weekEndings[this.day()] +
            '] LT[-kor]'
        );
    }

    moment.defineLocale('hu', {
        months: 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split(
            '_'
        ),
        monthsShort:
            'jan._feb._márc._ápr._máj._jún._júl._aug._szept._okt._nov._dec.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'),
        weekdaysShort: 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'),
        weekdaysMin: 'v_h_k_sze_cs_p_szo'.split('_'),
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'YYYY.MM.DD.',
            LL: 'YYYY. MMMM D.',
            LLL: 'YYYY. MMMM D. H:mm',
            LLLL: 'YYYY. MMMM D., dddd H:mm',
        },
        meridiemParse: /de|du/i,
        isPM: function (input) {
            return input.charAt(1).toLowerCase() === 'u';
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours < 12) {
                return isLower === true ? 'de' : 'DE';
            } else {
                return isLower === true ? 'du' : 'DU';
            }
        },
        calendar: {
            sameDay: '[ma] LT[-kor]',
            nextDay: '[holnap] LT[-kor]',
            nextWeek: function () {
                return week.call(this, true);
            },
            lastDay: '[tegnap] LT[-kor]',
            lastWeek: function () {
                return week.call(this, false);
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s múlva',
            past: '%s',
            s: translate$4,
            ss: translate$4,
            m: translate$4,
            mm: translate$4,
            h: translate$4,
            hh: translate$4,
            d: translate$4,
            dd: translate$4,
            M: translate$4,
            MM: translate$4,
            y: translate$4,
            yy: translate$4,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('hy-am', {
        months: {
            format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split(
                '_'
            ),
            standalone:
                'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split(
                    '_'
                ),
        },
        monthsShort: 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'),
        weekdays:
            'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split(
                '_'
            ),
        weekdaysShort: 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
        weekdaysMin: 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY թ.',
            LLL: 'D MMMM YYYY թ., HH:mm',
            LLLL: 'dddd, D MMMM YYYY թ., HH:mm',
        },
        calendar: {
            sameDay: '[այսօր] LT',
            nextDay: '[վաղը] LT',
            lastDay: '[երեկ] LT',
            nextWeek: function () {
                return 'dddd [օրը ժամը] LT';
            },
            lastWeek: function () {
                return '[անցած] dddd [օրը ժամը] LT';
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s հետո',
            past: '%s առաջ',
            s: 'մի քանի վայրկյան',
            ss: '%d վայրկյան',
            m: 'րոպե',
            mm: '%d րոպե',
            h: 'ժամ',
            hh: '%d ժամ',
            d: 'օր',
            dd: '%d օր',
            M: 'ամիս',
            MM: '%d ամիս',
            y: 'տարի',
            yy: '%d տարի',
        },
        meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/,
        isPM: function (input) {
            return /^(ցերեկվա|երեկոյան)$/.test(input);
        },
        meridiem: function (hour) {
            if (hour < 4) {
                return 'գիշերվա';
            } else if (hour < 12) {
                return 'առավոտվա';
            } else if (hour < 17) {
                return 'ցերեկվա';
            } else {
                return 'երեկոյան';
            }
        },
        dayOfMonthOrdinalParse: /\d{1,2}|\d{1,2}-(ին|րդ)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'DDD':
                case 'w':
                case 'W':
                case 'DDDo':
                    if (number === 1) {
                        return number + '-ին';
                    }
                    return number + '-րդ';
                default:
                    return number;
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('id', {
        months: 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des'.split('_'),
        weekdays: 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'),
        weekdaysShort: 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'),
        weekdaysMin: 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'),
        longDateFormat: {
            LT: 'HH.mm',
            LTS: 'HH.mm.ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY [pukul] HH.mm',
            LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',
        },
        meridiemParse: /pagi|siang|sore|malam/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'pagi') {
                return hour;
            } else if (meridiem === 'siang') {
                return hour >= 11 ? hour : hour + 12;
            } else if (meridiem === 'sore' || meridiem === 'malam') {
                return hour + 12;
            }
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours < 11) {
                return 'pagi';
            } else if (hours < 15) {
                return 'siang';
            } else if (hours < 19) {
                return 'sore';
            } else {
                return 'malam';
            }
        },
        calendar: {
            sameDay: '[Hari ini pukul] LT',
            nextDay: '[Besok pukul] LT',
            nextWeek: 'dddd [pukul] LT',
            lastDay: '[Kemarin pukul] LT',
            lastWeek: 'dddd [lalu pukul] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'dalam %s',
            past: '%s yang lalu',
            s: 'beberapa detik',
            ss: '%d detik',
            m: 'semenit',
            mm: '%d menit',
            h: 'sejam',
            hh: '%d jam',
            d: 'sehari',
            dd: '%d hari',
            M: 'sebulan',
            MM: '%d bulan',
            y: 'setahun',
            yy: '%d tahun',
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function plural$2(n) {
        if (n % 100 === 11) {
            return true;
        } else if (n % 10 === 1) {
            return false;
        }
        return true;
    }
    function translate$5(number, withoutSuffix, key, isFuture) {
        var result = number + ' ';
        switch (key) {
            case 's':
                return withoutSuffix || isFuture
                    ? 'nokkrar sekúndur'
                    : 'nokkrum sekúndum';
            case 'ss':
                if (plural$2(number)) {
                    return (
                        result +
                        (withoutSuffix || isFuture ? 'sekúndur' : 'sekúndum')
                    );
                }
                return result + 'sekúnda';
            case 'm':
                return withoutSuffix ? 'mínúta' : 'mínútu';
            case 'mm':
                if (plural$2(number)) {
                    return (
                        result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum')
                    );
                } else if (withoutSuffix) {
                    return result + 'mínúta';
                }
                return result + 'mínútu';
            case 'hh':
                if (plural$2(number)) {
                    return (
                        result +
                        (withoutSuffix || isFuture
                            ? 'klukkustundir'
                            : 'klukkustundum')
                    );
                }
                return result + 'klukkustund';
            case 'd':
                if (withoutSuffix) {
                    return 'dagur';
                }
                return isFuture ? 'dag' : 'degi';
            case 'dd':
                if (plural$2(number)) {
                    if (withoutSuffix) {
                        return result + 'dagar';
                    }
                    return result + (isFuture ? 'daga' : 'dögum');
                } else if (withoutSuffix) {
                    return result + 'dagur';
                }
                return result + (isFuture ? 'dag' : 'degi');
            case 'M':
                if (withoutSuffix) {
                    return 'mánuður';
                }
                return isFuture ? 'mánuð' : 'mánuði';
            case 'MM':
                if (plural$2(number)) {
                    if (withoutSuffix) {
                        return result + 'mánuðir';
                    }
                    return result + (isFuture ? 'mánuði' : 'mánuðum');
                } else if (withoutSuffix) {
                    return result + 'mánuður';
                }
                return result + (isFuture ? 'mánuð' : 'mánuði');
            case 'y':
                return withoutSuffix || isFuture ? 'ár' : 'ári';
            case 'yy':
                if (plural$2(number)) {
                    return result + (withoutSuffix || isFuture ? 'ár' : 'árum');
                }
                return result + (withoutSuffix || isFuture ? 'ár' : 'ári');
        }
    }

    moment.defineLocale('is', {
        months: 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split(
            '_'
        ),
        monthsShort: 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'),
        weekdays:
            'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split(
                '_'
            ),
        weekdaysShort: 'sun_mán_þri_mið_fim_fös_lau'.split('_'),
        weekdaysMin: 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'),
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY [kl.] H:mm',
            LLLL: 'dddd, D. MMMM YYYY [kl.] H:mm',
        },
        calendar: {
            sameDay: '[í dag kl.] LT',
            nextDay: '[á morgun kl.] LT',
            nextWeek: 'dddd [kl.] LT',
            lastDay: '[í gær kl.] LT',
            lastWeek: '[síðasta] dddd [kl.] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'eftir %s',
            past: 'fyrir %s síðan',
            s: translate$5,
            ss: translate$5,
            m: translate$5,
            mm: translate$5,
            h: 'klukkustund',
            hh: translate$5,
            d: translate$5,
            dd: translate$5,
            M: translate$5,
            MM: translate$5,
            y: translate$5,
            yy: translate$5,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('it-ch', {
        months: 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split(
            '_'
        ),
        monthsShort: 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),
        weekdays: 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split(
            '_'
        ),
        weekdaysShort: 'dom_lun_mar_mer_gio_ven_sab'.split('_'),
        weekdaysMin: 'do_lu_ma_me_gi_ve_sa'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Oggi alle] LT',
            nextDay: '[Domani alle] LT',
            nextWeek: 'dddd [alle] LT',
            lastDay: '[Ieri alle] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[la scorsa] dddd [alle] LT';
                    default:
                        return '[lo scorso] dddd [alle] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: function (s) {
                return (/^[0-9].+$/.test(s) ? 'tra' : 'in') + ' ' + s;
            },
            past: '%s fa',
            s: 'alcuni secondi',
            ss: '%d secondi',
            m: 'un minuto',
            mm: '%d minuti',
            h: "un'ora",
            hh: '%d ore',
            d: 'un giorno',
            dd: '%d giorni',
            M: 'un mese',
            MM: '%d mesi',
            y: 'un anno',
            yy: '%d anni',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('it', {
        months: 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split(
            '_'
        ),
        monthsShort: 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),
        weekdays: 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split(
            '_'
        ),
        weekdaysShort: 'dom_lun_mar_mer_gio_ven_sab'.split('_'),
        weekdaysMin: 'do_lu_ma_me_gi_ve_sa'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: function () {
                return (
                    '[Oggi a' +
                    (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : "ll'") +
                    ']LT'
                );
            },
            nextDay: function () {
                return (
                    '[Domani a' +
                    (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : "ll'") +
                    ']LT'
                );
            },
            nextWeek: function () {
                return (
                    'dddd [a' +
                    (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : "ll'") +
                    ']LT'
                );
            },
            lastDay: function () {
                return (
                    '[Ieri a' +
                    (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : "ll'") +
                    ']LT'
                );
            },
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                        return (
                            '[La scorsa] dddd [a' +
                            (this.hours() > 1
                                ? 'lle '
                                : this.hours() === 0
                                ? ' '
                                : "ll'") +
                            ']LT'
                        );
                    default:
                        return (
                            '[Lo scorso] dddd [a' +
                            (this.hours() > 1
                                ? 'lle '
                                : this.hours() === 0
                                ? ' '
                                : "ll'") +
                            ']LT'
                        );
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'tra %s',
            past: '%s fa',
            s: 'alcuni secondi',
            ss: '%d secondi',
            m: 'un minuto',
            mm: '%d minuti',
            h: "un'ora",
            hh: '%d ore',
            d: 'un giorno',
            dd: '%d giorni',
            w: 'una settimana',
            ww: '%d settimane',
            M: 'un mese',
            MM: '%d mesi',
            y: 'un anno',
            yy: '%d anni',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('ja', {
        eras: [
            {
                since: '2019-05-01',
                offset: 1,
                name: '令和',
                narrow: '㋿',
                abbr: 'R',
            },
            {
                since: '1989-01-08',
                until: '2019-04-30',
                offset: 1,
                name: '平成',
                narrow: '㍻',
                abbr: 'H',
            },
            {
                since: '1926-12-25',
                until: '1989-01-07',
                offset: 1,
                name: '昭和',
                narrow: '㍼',
                abbr: 'S',
            },
            {
                since: '1912-07-30',
                until: '1926-12-24',
                offset: 1,
                name: '大正',
                narrow: '㍽',
                abbr: 'T',
            },
            {
                since: '1873-01-01',
                until: '1912-07-29',
                offset: 6,
                name: '明治',
                narrow: '㍾',
                abbr: 'M',
            },
            {
                since: '0001-01-01',
                until: '1873-12-31',
                offset: 1,
                name: '西暦',
                narrow: 'AD',
                abbr: 'AD',
            },
            {
                since: '0000-12-31',
                until: -Infinity,
                offset: 1,
                name: '紀元前',
                narrow: 'BC',
                abbr: 'BC',
            },
        ],
        eraYearOrdinalRegex: /(元|\d+)年/,
        eraYearOrdinalParse: function (input, match) {
            return match[1] === '元' ? 1 : parseInt(match[1] || input, 10);
        },
        months: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
        monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(
            '_'
        ),
        weekdays: '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'),
        weekdaysShort: '日_月_火_水_木_金_土'.split('_'),
        weekdaysMin: '日_月_火_水_木_金_土'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY/MM/DD',
            LL: 'YYYY年M月D日',
            LLL: 'YYYY年M月D日 HH:mm',
            LLLL: 'YYYY年M月D日 dddd HH:mm',
            l: 'YYYY/MM/DD',
            ll: 'YYYY年M月D日',
            lll: 'YYYY年M月D日 HH:mm',
            llll: 'YYYY年M月D日(ddd) HH:mm',
        },
        meridiemParse: /午前|午後/i,
        isPM: function (input) {
            return input === '午後';
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return '午前';
            } else {
                return '午後';
            }
        },
        calendar: {
            sameDay: '[今日] LT',
            nextDay: '[明日] LT',
            nextWeek: function (now) {
                if (now.week() !== this.week()) {
                    return '[来週]dddd LT';
                } else {
                    return 'dddd LT';
                }
            },
            lastDay: '[昨日] LT',
            lastWeek: function (now) {
                if (this.week() !== now.week()) {
                    return '[先週]dddd LT';
                } else {
                    return 'dddd LT';
                }
            },
            sameElse: 'L',
        },
        dayOfMonthOrdinalParse: /\d{1,2}日/,
        ordinal: function (number, period) {
            switch (period) {
                case 'y':
                    return number === 1 ? '元年' : number + '年';
                case 'd':
                case 'D':
                case 'DDD':
                    return number + '日';
                default:
                    return number;
            }
        },
        relativeTime: {
            future: '%s後',
            past: '%s前',
            s: '数秒',
            ss: '%d秒',
            m: '1分',
            mm: '%d分',
            h: '1時間',
            hh: '%d時間',
            d: '1日',
            dd: '%d日',
            M: '1ヶ月',
            MM: '%dヶ月',
            y: '1年',
            yy: '%d年',
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('jv', {
        months: 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'),
        weekdays: 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'),
        weekdaysShort: 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'),
        weekdaysMin: 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'),
        longDateFormat: {
            LT: 'HH.mm',
            LTS: 'HH.mm.ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY [pukul] HH.mm',
            LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',
        },
        meridiemParse: /enjing|siyang|sonten|ndalu/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'enjing') {
                return hour;
            } else if (meridiem === 'siyang') {
                return hour >= 11 ? hour : hour + 12;
            } else if (meridiem === 'sonten' || meridiem === 'ndalu') {
                return hour + 12;
            }
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours < 11) {
                return 'enjing';
            } else if (hours < 15) {
                return 'siyang';
            } else if (hours < 19) {
                return 'sonten';
            } else {
                return 'ndalu';
            }
        },
        calendar: {
            sameDay: '[Dinten puniko pukul] LT',
            nextDay: '[Mbenjang pukul] LT',
            nextWeek: 'dddd [pukul] LT',
            lastDay: '[Kala wingi pukul] LT',
            lastWeek: 'dddd [kepengker pukul] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'wonten ing %s',
            past: '%s ingkang kepengker',
            s: 'sawetawis detik',
            ss: '%d detik',
            m: 'setunggal menit',
            mm: '%d menit',
            h: 'setunggal jam',
            hh: '%d jam',
            d: 'sedinten',
            dd: '%d dinten',
            M: 'sewulan',
            MM: '%d wulan',
            y: 'setaun',
            yy: '%d taun',
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('ka', {
        months: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split(
            '_'
        ),
        monthsShort: 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'),
        weekdays: {
            standalone:
                'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split(
                    '_'
                ),
            format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split(
                '_'
            ),
            isFormat: /(წინა|შემდეგ)/,
        },
        weekdaysShort: 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'),
        weekdaysMin: 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[დღეს] LT[-ზე]',
            nextDay: '[ხვალ] LT[-ზე]',
            lastDay: '[გუშინ] LT[-ზე]',
            nextWeek: '[შემდეგ] dddd LT[-ზე]',
            lastWeek: '[წინა] dddd LT-ზე',
            sameElse: 'L',
        },
        relativeTime: {
            future: function (s) {
                return s.replace(
                    /(წამ|წუთ|საათ|წელ|დღ|თვ)(ი|ე)/,
                    function ($0, $1, $2) {
                        return $2 === 'ი' ? $1 + 'ში' : $1 + $2 + 'ში';
                    }
                );
            },
            past: function (s) {
                if (/(წამი|წუთი|საათი|დღე|თვე)/.test(s)) {
                    return s.replace(/(ი|ე)$/, 'ის წინ');
                }
                if (/წელი/.test(s)) {
                    return s.replace(/წელი$/, 'წლის წინ');
                }
                return s;
            },
            s: 'რამდენიმე წამი',
            ss: '%d წამი',
            m: 'წუთი',
            mm: '%d წუთი',
            h: 'საათი',
            hh: '%d საათი',
            d: 'დღე',
            dd: '%d დღე',
            M: 'თვე',
            MM: '%d თვე',
            y: 'წელი',
            yy: '%d წელი',
        },
        dayOfMonthOrdinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,
        ordinal: function (number) {
            if (number === 0) {
                return number;
            }
            if (number === 1) {
                return number + '-ლი';
            }
            if (
                number < 20 ||
                (number <= 100 && number % 20 === 0) ||
                number % 100 === 0
            ) {
                return 'მე-' + number;
            }
            return number + '-ე';
        },
        week: {
            dow: 1,
            doy: 7,
        },
    });

    //! moment.js locale configuration

    var suffixes$1 = {
        0: '-ші',
        1: '-ші',
        2: '-ші',
        3: '-ші',
        4: '-ші',
        5: '-ші',
        6: '-шы',
        7: '-ші',
        8: '-ші',
        9: '-шы',
        10: '-шы',
        20: '-шы',
        30: '-шы',
        40: '-шы',
        50: '-ші',
        60: '-шы',
        70: '-ші',
        80: '-ші',
        90: '-шы',
        100: '-ші',
    };

    moment.defineLocale('kk', {
        months: 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split(
            '_'
        ),
        monthsShort: 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'),
        weekdays: 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split(
            '_'
        ),
        weekdaysShort: 'жек_дүй_сей_сәр_бей_жұм_сен'.split('_'),
        weekdaysMin: 'жк_дй_сй_ср_бй_жм_сн'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Бүгін сағат] LT',
            nextDay: '[Ертең сағат] LT',
            nextWeek: 'dddd [сағат] LT',
            lastDay: '[Кеше сағат] LT',
            lastWeek: '[Өткен аптаның] dddd [сағат] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s ішінде',
            past: '%s бұрын',
            s: 'бірнеше секунд',
            ss: '%d секунд',
            m: 'бір минут',
            mm: '%d минут',
            h: 'бір сағат',
            hh: '%d сағат',
            d: 'бір күн',
            dd: '%d күн',
            M: 'бір ай',
            MM: '%d ай',
            y: 'бір жыл',
            yy: '%d жыл',
        },
        dayOfMonthOrdinalParse: /\d{1,2}-(ші|шы)/,
        ordinal: function (number) {
            var a = number % 10,
                b = number >= 100 ? 100 : null;
            return number + (suffixes$1[number] || suffixes$1[a] || suffixes$1[b]);
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var symbolMap$9 = {
            1: '១',
            2: '២',
            3: '៣',
            4: '៤',
            5: '៥',
            6: '៦',
            7: '៧',
            8: '៨',
            9: '៩',
            0: '០',
        },
        numberMap$8 = {
            '១': '1',
            '២': '2',
            '៣': '3',
            '៤': '4',
            '៥': '5',
            '៦': '6',
            '៧': '7',
            '៨': '8',
            '៩': '9',
            '០': '0',
        };

    moment.defineLocale('km', {
        months: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split(
            '_'
        ),
        monthsShort:
            'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split(
                '_'
            ),
        weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
        weekdaysShort: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'),
        weekdaysMin: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        meridiemParse: /ព្រឹក|ល្ងាច/,
        isPM: function (input) {
            return input === 'ល្ងាច';
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'ព្រឹក';
            } else {
                return 'ល្ងាច';
            }
        },
        calendar: {
            sameDay: '[ថ្ងៃនេះ ម៉ោង] LT',
            nextDay: '[ស្អែក ម៉ោង] LT',
            nextWeek: 'dddd [ម៉ោង] LT',
            lastDay: '[ម្សិលមិញ ម៉ោង] LT',
            lastWeek: 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%sទៀត',
            past: '%sមុន',
            s: 'ប៉ុន្មានវិនាទី',
            ss: '%d វិនាទី',
            m: 'មួយនាទី',
            mm: '%d នាទី',
            h: 'មួយម៉ោង',
            hh: '%d ម៉ោង',
            d: 'មួយថ្ងៃ',
            dd: '%d ថ្ងៃ',
            M: 'មួយខែ',
            MM: '%d ខែ',
            y: 'មួយឆ្នាំ',
            yy: '%d ឆ្នាំ',
        },
        dayOfMonthOrdinalParse: /ទី\d{1,2}/,
        ordinal: 'ទី%d',
        preparse: function (string) {
            return string.replace(/[១២៣៤៥៦៧៨៩០]/g, function (match) {
                return numberMap$8[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap$9[match];
            });
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var symbolMap$a = {
            1: '೧',
            2: '೨',
            3: '೩',
            4: '೪',
            5: '೫',
            6: '೬',
            7: '೭',
            8: '೮',
            9: '೯',
            0: '೦',
        },
        numberMap$9 = {
            '೧': '1',
            '೨': '2',
            '೩': '3',
            '೪': '4',
            '೫': '5',
            '೬': '6',
            '೭': '7',
            '೮': '8',
            '೯': '9',
            '೦': '0',
        };

    moment.defineLocale('kn', {
        months: 'ಜನವರಿ_ಫೆಬ್ರವರಿ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬರ್_ಅಕ್ಟೋಬರ್_ನವೆಂಬರ್_ಡಿಸೆಂಬರ್'.split(
            '_'
        ),
        monthsShort:
            'ಜನ_ಫೆಬ್ರ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂ_ಅಕ್ಟೋ_ನವೆಂ_ಡಿಸೆಂ'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'ಭಾನುವಾರ_ಸೋಮವಾರ_ಮಂಗಳವಾರ_ಬುಧವಾರ_ಗುರುವಾರ_ಶುಕ್ರವಾರ_ಶನಿವಾರ'.split(
            '_'
        ),
        weekdaysShort: 'ಭಾನು_ಸೋಮ_ಮಂಗಳ_ಬುಧ_ಗುರು_ಶುಕ್ರ_ಶನಿ'.split('_'),
        weekdaysMin: 'ಭಾ_ಸೋ_ಮಂ_ಬು_ಗು_ಶು_ಶ'.split('_'),
        longDateFormat: {
            LT: 'A h:mm',
            LTS: 'A h:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm',
            LLLL: 'dddd, D MMMM YYYY, A h:mm',
        },
        calendar: {
            sameDay: '[ಇಂದು] LT',
            nextDay: '[ನಾಳೆ] LT',
            nextWeek: 'dddd, LT',
            lastDay: '[ನಿನ್ನೆ] LT',
            lastWeek: '[ಕೊನೆಯ] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s ನಂತರ',
            past: '%s ಹಿಂದೆ',
            s: 'ಕೆಲವು ಕ್ಷಣಗಳು',
            ss: '%d ಸೆಕೆಂಡುಗಳು',
            m: 'ಒಂದು ನಿಮಿಷ',
            mm: '%d ನಿಮಿಷ',
            h: 'ಒಂದು ಗಂಟೆ',
            hh: '%d ಗಂಟೆ',
            d: 'ಒಂದು ದಿನ',
            dd: '%d ದಿನ',
            M: 'ಒಂದು ತಿಂಗಳು',
            MM: '%d ತಿಂಗಳು',
            y: 'ಒಂದು ವರ್ಷ',
            yy: '%d ವರ್ಷ',
        },
        preparse: function (string) {
            return string.replace(/[೧೨೩೪೫೬೭೮೯೦]/g, function (match) {
                return numberMap$9[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap$a[match];
            });
        },
        meridiemParse: /ರಾತ್ರಿ|ಬೆಳಿಗ್ಗೆ|ಮಧ್ಯಾಹ್ನ|ಸಂಜೆ/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'ರಾತ್ರಿ') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'ಬೆಳಿಗ್ಗೆ') {
                return hour;
            } else if (meridiem === 'ಮಧ್ಯಾಹ್ನ') {
                return hour >= 10 ? hour : hour + 12;
            } else if (meridiem === 'ಸಂಜೆ') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'ರಾತ್ರಿ';
            } else if (hour < 10) {
                return 'ಬೆಳಿಗ್ಗೆ';
            } else if (hour < 17) {
                return 'ಮಧ್ಯಾಹ್ನ';
            } else if (hour < 20) {
                return 'ಸಂಜೆ';
            } else {
                return 'ರಾತ್ರಿ';
            }
        },
        dayOfMonthOrdinalParse: /\d{1,2}(ನೇ)/,
        ordinal: function (number) {
            return number + 'ನೇ';
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('ko', {
        months: '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),
        monthsShort: '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split(
            '_'
        ),
        weekdays: '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'),
        weekdaysShort: '일_월_화_수_목_금_토'.split('_'),
        weekdaysMin: '일_월_화_수_목_금_토'.split('_'),
        longDateFormat: {
            LT: 'A h:mm',
            LTS: 'A h:mm:ss',
            L: 'YYYY.MM.DD.',
            LL: 'YYYY년 MMMM D일',
            LLL: 'YYYY년 MMMM D일 A h:mm',
            LLLL: 'YYYY년 MMMM D일 dddd A h:mm',
            l: 'YYYY.MM.DD.',
            ll: 'YYYY년 MMMM D일',
            lll: 'YYYY년 MMMM D일 A h:mm',
            llll: 'YYYY년 MMMM D일 dddd A h:mm',
        },
        calendar: {
            sameDay: '오늘 LT',
            nextDay: '내일 LT',
            nextWeek: 'dddd LT',
            lastDay: '어제 LT',
            lastWeek: '지난주 dddd LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s 후',
            past: '%s 전',
            s: '몇 초',
            ss: '%d초',
            m: '1분',
            mm: '%d분',
            h: '한 시간',
            hh: '%d시간',
            d: '하루',
            dd: '%d일',
            M: '한 달',
            MM: '%d달',
            y: '일 년',
            yy: '%d년',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(일|월|주)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'd':
                case 'D':
                case 'DDD':
                    return number + '일';
                case 'M':
                    return number + '월';
                case 'w':
                case 'W':
                    return number + '주';
                default:
                    return number;
            }
        },
        meridiemParse: /오전|오후/,
        isPM: function (token) {
            return token === '오후';
        },
        meridiem: function (hour, minute, isUpper) {
            return hour < 12 ? '오전' : '오후';
        },
    });

    //! moment.js locale configuration

    var symbolMap$b = {
            1: '١',
            2: '٢',
            3: '٣',
            4: '٤',
            5: '٥',
            6: '٦',
            7: '٧',
            8: '٨',
            9: '٩',
            0: '٠',
        },
        numberMap$a = {
            '١': '1',
            '٢': '2',
            '٣': '3',
            '٤': '4',
            '٥': '5',
            '٦': '6',
            '٧': '7',
            '٨': '8',
            '٩': '9',
            '٠': '0',
        },
        months$7 = [
            'کانونی دووەم',
            'شوبات',
            'ئازار',
            'نیسان',
            'ئایار',
            'حوزەیران',
            'تەمموز',
            'ئاب',
            'ئەیلوول',
            'تشرینی یەكەم',
            'تشرینی دووەم',
            'كانونی یەکەم',
        ];

    moment.defineLocale('ku', {
        months: months$7,
        monthsShort: months$7,
        weekdays:
            'یه‌كشه‌ممه‌_دووشه‌ممه‌_سێشه‌ممه‌_چوارشه‌ممه‌_پێنجشه‌ممه‌_هه‌ینی_شه‌ممه‌'.split(
                '_'
            ),
        weekdaysShort:
            'یه‌كشه‌م_دووشه‌م_سێشه‌م_چوارشه‌م_پێنجشه‌م_هه‌ینی_شه‌ممه‌'.split('_'),
        weekdaysMin: 'ی_د_س_چ_پ_ه_ش'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        meridiemParse: /ئێواره‌|به‌یانی/,
        isPM: function (input) {
            return /ئێواره‌/.test(input);
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'به‌یانی';
            } else {
                return 'ئێواره‌';
            }
        },
        calendar: {
            sameDay: '[ئه‌مرۆ كاتژمێر] LT',
            nextDay: '[به‌یانی كاتژمێر] LT',
            nextWeek: 'dddd [كاتژمێر] LT',
            lastDay: '[دوێنێ كاتژمێر] LT',
            lastWeek: 'dddd [كاتژمێر] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'له‌ %s',
            past: '%s',
            s: 'چه‌ند چركه‌یه‌ك',
            ss: 'چركه‌ %d',
            m: 'یه‌ك خوله‌ك',
            mm: '%d خوله‌ك',
            h: 'یه‌ك كاتژمێر',
            hh: '%d كاتژمێر',
            d: 'یه‌ك ڕۆژ',
            dd: '%d ڕۆژ',
            M: 'یه‌ك مانگ',
            MM: '%d مانگ',
            y: 'یه‌ك ساڵ',
            yy: '%d ساڵ',
        },
        preparse: function (string) {
            return string
                .replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
                    return numberMap$a[match];
                })
                .replace(/،/g, ',');
        },
        postformat: function (string) {
            return string
                .replace(/\d/g, function (match) {
                    return symbolMap$b[match];
                })
                .replace(/,/g, '،');
        },
        week: {
            dow: 6, // Saturday is the first day of the week.
            doy: 12, // The week that contains Jan 12th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var suffixes$2 = {
        0: '-чү',
        1: '-чи',
        2: '-чи',
        3: '-чү',
        4: '-чү',
        5: '-чи',
        6: '-чы',
        7: '-чи',
        8: '-чи',
        9: '-чу',
        10: '-чу',
        20: '-чы',
        30: '-чу',
        40: '-чы',
        50: '-чү',
        60: '-чы',
        70: '-чи',
        80: '-чи',
        90: '-чу',
        100: '-чү',
    };

    moment.defineLocale('ky', {
        months: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split(
            '_'
        ),
        monthsShort: 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split(
            '_'
        ),
        weekdays: 'Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби'.split(
            '_'
        ),
        weekdaysShort: 'Жек_Дүй_Шей_Шар_Бей_Жум_Ише'.split('_'),
        weekdaysMin: 'Жк_Дй_Шй_Шр_Бй_Жм_Иш'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Бүгүн саат] LT',
            nextDay: '[Эртең саат] LT',
            nextWeek: 'dddd [саат] LT',
            lastDay: '[Кечээ саат] LT',
            lastWeek: '[Өткөн аптанын] dddd [күнү] [саат] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s ичинде',
            past: '%s мурун',
            s: 'бирнече секунд',
            ss: '%d секунд',
            m: 'бир мүнөт',
            mm: '%d мүнөт',
            h: 'бир саат',
            hh: '%d саат',
            d: 'бир күн',
            dd: '%d күн',
            M: 'бир ай',
            MM: '%d ай',
            y: 'бир жыл',
            yy: '%d жыл',
        },
        dayOfMonthOrdinalParse: /\d{1,2}-(чи|чы|чү|чу)/,
        ordinal: function (number) {
            var a = number % 10,
                b = number >= 100 ? 100 : null;
            return number + (suffixes$2[number] || suffixes$2[a] || suffixes$2[b]);
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function processRelativeTime$6(number, withoutSuffix, key, isFuture) {
        var format = {
            m: ['eng Minutt', 'enger Minutt'],
            h: ['eng Stonn', 'enger Stonn'],
            d: ['een Dag', 'engem Dag'],
            M: ['ee Mount', 'engem Mount'],
            y: ['ee Joer', 'engem Joer'],
        };
        return withoutSuffix ? format[key][0] : format[key][1];
    }
    function processFutureTime(string) {
        var number = string.substr(0, string.indexOf(' '));
        if (eifelerRegelAppliesToNumber(number)) {
            return 'a ' + string;
        }
        return 'an ' + string;
    }
    function processPastTime(string) {
        var number = string.substr(0, string.indexOf(' '));
        if (eifelerRegelAppliesToNumber(number)) {
            return 'viru ' + string;
        }
        return 'virun ' + string;
    }
    /**
     * Returns true if the word before the given number loses the '-n' ending.
     * e.g. 'an 10 Deeg' but 'a 5 Deeg'
     *
     * @param number {integer}
     * @returns {boolean}
     */
    function eifelerRegelAppliesToNumber(number) {
        number = parseInt(number, 10);
        if (isNaN(number)) {
            return false;
        }
        if (number < 0) {
            // Negative Number --> always true
            return true;
        } else if (number < 10) {
            // Only 1 digit
            if (4 <= number && number <= 7) {
                return true;
            }
            return false;
        } else if (number < 100) {
            // 2 digits
            var lastDigit = number % 10,
                firstDigit = number / 10;
            if (lastDigit === 0) {
                return eifelerRegelAppliesToNumber(firstDigit);
            }
            return eifelerRegelAppliesToNumber(lastDigit);
        } else if (number < 10000) {
            // 3 or 4 digits --> recursively check first digit
            while (number >= 10) {
                number = number / 10;
            }
            return eifelerRegelAppliesToNumber(number);
        } else {
            // Anything larger than 4 digits: recursively check first n-3 digits
            number = number / 1000;
            return eifelerRegelAppliesToNumber(number);
        }
    }

    moment.defineLocale('lb', {
        months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split(
            '_'
        ),
        monthsShort:
            'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays:
            'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split(
                '_'
            ),
        weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'),
        weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm [Auer]',
            LTS: 'H:mm:ss [Auer]',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY H:mm [Auer]',
            LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]',
        },
        calendar: {
            sameDay: '[Haut um] LT',
            sameElse: 'L',
            nextDay: '[Muer um] LT',
            nextWeek: 'dddd [um] LT',
            lastDay: '[Gëschter um] LT',
            lastWeek: function () {
                // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule
                switch (this.day()) {
                    case 2:
                    case 4:
                        return '[Leschten] dddd [um] LT';
                    default:
                        return '[Leschte] dddd [um] LT';
                }
            },
        },
        relativeTime: {
            future: processFutureTime,
            past: processPastTime,
            s: 'e puer Sekonnen',
            ss: '%d Sekonnen',
            m: processRelativeTime$6,
            mm: '%d Minutten',
            h: processRelativeTime$6,
            hh: '%d Stonnen',
            d: processRelativeTime$6,
            dd: '%d Deeg',
            M: processRelativeTime$6,
            MM: '%d Méint',
            y: processRelativeTime$6,
            yy: '%d Joer',
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('lo', {
        months: 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split(
            '_'
        ),
        monthsShort:
            'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split(
                '_'
            ),
        weekdays: 'ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),
        weekdaysShort: 'ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),
        weekdaysMin: 'ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'ວັນdddd D MMMM YYYY HH:mm',
        },
        meridiemParse: /ຕອນເຊົ້າ|ຕອນແລງ/,
        isPM: function (input) {
            return input === 'ຕອນແລງ';
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'ຕອນເຊົ້າ';
            } else {
                return 'ຕອນແລງ';
            }
        },
        calendar: {
            sameDay: '[ມື້ນີ້ເວລາ] LT',
            nextDay: '[ມື້ອື່ນເວລາ] LT',
            nextWeek: '[ວັນ]dddd[ໜ້າເວລາ] LT',
            lastDay: '[ມື້ວານນີ້ເວລາ] LT',
            lastWeek: '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'ອີກ %s',
            past: '%sຜ່ານມາ',
            s: 'ບໍ່ເທົ່າໃດວິນາທີ',
            ss: '%d ວິນາທີ',
            m: '1 ນາທີ',
            mm: '%d ນາທີ',
            h: '1 ຊົ່ວໂມງ',
            hh: '%d ຊົ່ວໂມງ',
            d: '1 ມື້',
            dd: '%d ມື້',
            M: '1 ເດືອນ',
            MM: '%d ເດືອນ',
            y: '1 ປີ',
            yy: '%d ປີ',
        },
        dayOfMonthOrdinalParse: /(ທີ່)\d{1,2}/,
        ordinal: function (number) {
            return 'ທີ່' + number;
        },
    });

    //! moment.js locale configuration

    var units = {
        ss: 'sekundė_sekundžių_sekundes',
        m: 'minutė_minutės_minutę',
        mm: 'minutės_minučių_minutes',
        h: 'valanda_valandos_valandą',
        hh: 'valandos_valandų_valandas',
        d: 'diena_dienos_dieną',
        dd: 'dienos_dienų_dienas',
        M: 'mėnuo_mėnesio_mėnesį',
        MM: 'mėnesiai_mėnesių_mėnesius',
        y: 'metai_metų_metus',
        yy: 'metai_metų_metus',
    };
    function translateSeconds(number, withoutSuffix, key, isFuture) {
        if (withoutSuffix) {
            return 'kelios sekundės';
        } else {
            return isFuture ? 'kelių sekundžių' : 'kelias sekundes';
        }
    }
    function translateSingular(number, withoutSuffix, key, isFuture) {
        return withoutSuffix
            ? forms(key)[0]
            : isFuture
            ? forms(key)[1]
            : forms(key)[2];
    }
    function special(number) {
        return number % 10 === 0 || (number > 10 && number < 20);
    }
    function forms(key) {
        return units[key].split('_');
    }
    function translate$6(number, withoutSuffix, key, isFuture) {
        var result = number + ' ';
        if (number === 1) {
            return (
                result + translateSingular(number, withoutSuffix, key[0], isFuture)
            );
        } else if (withoutSuffix) {
            return result + (special(number) ? forms(key)[1] : forms(key)[0]);
        } else {
            if (isFuture) {
                return result + forms(key)[1];
            } else {
                return result + (special(number) ? forms(key)[1] : forms(key)[2]);
            }
        }
    }
    moment.defineLocale('lt', {
        months: {
            format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split(
                '_'
            ),
            standalone:
                'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split(
                    '_'
                ),
            isFormat: /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/,
        },
        monthsShort: 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'),
        weekdays: {
            format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split(
                '_'
            ),
            standalone:
                'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split(
                    '_'
                ),
            isFormat: /dddd HH:mm/,
        },
        weekdaysShort: 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'),
        weekdaysMin: 'S_P_A_T_K_Pn_Š'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY-MM-DD',
            LL: 'YYYY [m.] MMMM D [d.]',
            LLL: 'YYYY [m.] MMMM D [d.], HH:mm [val.]',
            LLLL: 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]',
            l: 'YYYY-MM-DD',
            ll: 'YYYY [m.] MMMM D [d.]',
            lll: 'YYYY [m.] MMMM D [d.], HH:mm [val.]',
            llll: 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]',
        },
        calendar: {
            sameDay: '[Šiandien] LT',
            nextDay: '[Rytoj] LT',
            nextWeek: 'dddd LT',
            lastDay: '[Vakar] LT',
            lastWeek: '[Praėjusį] dddd LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'po %s',
            past: 'prieš %s',
            s: translateSeconds,
            ss: translate$6,
            m: translateSingular,
            mm: translate$6,
            h: translateSingular,
            hh: translate$6,
            d: translateSingular,
            dd: translate$6,
            M: translateSingular,
            MM: translate$6,
            y: translateSingular,
            yy: translate$6,
        },
        dayOfMonthOrdinalParse: /\d{1,2}-oji/,
        ordinal: function (number) {
            return number + '-oji';
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var units$1 = {
        ss: 'sekundes_sekundēm_sekunde_sekundes'.split('_'),
        m: 'minūtes_minūtēm_minūte_minūtes'.split('_'),
        mm: 'minūtes_minūtēm_minūte_minūtes'.split('_'),
        h: 'stundas_stundām_stunda_stundas'.split('_'),
        hh: 'stundas_stundām_stunda_stundas'.split('_'),
        d: 'dienas_dienām_diena_dienas'.split('_'),
        dd: 'dienas_dienām_diena_dienas'.split('_'),
        M: 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),
        MM: 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),
        y: 'gada_gadiem_gads_gadi'.split('_'),
        yy: 'gada_gadiem_gads_gadi'.split('_'),
    };
    /**
     * @param withoutSuffix boolean true = a length of time; false = before/after a period of time.
     */
    function format(forms, number, withoutSuffix) {
        if (withoutSuffix) {
            // E.g. "21 minūte", "3 minūtes".
            return number % 10 === 1 && number % 100 !== 11 ? forms[2] : forms[3];
        } else {
            // E.g. "21 minūtes" as in "pēc 21 minūtes".
            // E.g. "3 minūtēm" as in "pēc 3 minūtēm".
            return number % 10 === 1 && number % 100 !== 11 ? forms[0] : forms[1];
        }
    }
    function relativeTimeWithPlural$1(number, withoutSuffix, key) {
        return number + ' ' + format(units$1[key], number, withoutSuffix);
    }
    function relativeTimeWithSingular(number, withoutSuffix, key) {
        return format(units$1[key], number, withoutSuffix);
    }
    function relativeSeconds(number, withoutSuffix) {
        return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm';
    }

    moment.defineLocale('lv', {
        months: 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split(
            '_'
        ),
        monthsShort: 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'),
        weekdays:
            'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split(
                '_'
            ),
        weekdaysShort: 'Sv_P_O_T_C_Pk_S'.split('_'),
        weekdaysMin: 'Sv_P_O_T_C_Pk_S'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY.',
            LL: 'YYYY. [gada] D. MMMM',
            LLL: 'YYYY. [gada] D. MMMM, HH:mm',
            LLLL: 'YYYY. [gada] D. MMMM, dddd, HH:mm',
        },
        calendar: {
            sameDay: '[Šodien pulksten] LT',
            nextDay: '[Rīt pulksten] LT',
            nextWeek: 'dddd [pulksten] LT',
            lastDay: '[Vakar pulksten] LT',
            lastWeek: '[Pagājušā] dddd [pulksten] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'pēc %s',
            past: 'pirms %s',
            s: relativeSeconds,
            ss: relativeTimeWithPlural$1,
            m: relativeTimeWithSingular,
            mm: relativeTimeWithPlural$1,
            h: relativeTimeWithSingular,
            hh: relativeTimeWithPlural$1,
            d: relativeTimeWithSingular,
            dd: relativeTimeWithPlural$1,
            M: relativeTimeWithSingular,
            MM: relativeTimeWithPlural$1,
            y: relativeTimeWithSingular,
            yy: relativeTimeWithPlural$1,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var translator = {
        words: {
            //Different grammatical cases
            ss: ['sekund', 'sekunda', 'sekundi'],
            m: ['jedan minut', 'jednog minuta'],
            mm: ['minut', 'minuta', 'minuta'],
            h: ['jedan sat', 'jednog sata'],
            hh: ['sat', 'sata', 'sati'],
            dd: ['dan', 'dana', 'dana'],
            MM: ['mjesec', 'mjeseca', 'mjeseci'],
            yy: ['godina', 'godine', 'godina'],
        },
        correctGrammaticalCase: function (number, wordKey) {
            return number === 1
                ? wordKey[0]
                : number >= 2 && number <= 4
                ? wordKey[1]
                : wordKey[2];
        },
        translate: function (number, withoutSuffix, key) {
            var wordKey = translator.words[key];
            if (key.length === 1) {
                return withoutSuffix ? wordKey[0] : wordKey[1];
            } else {
                return (
                    number +
                    ' ' +
                    translator.correctGrammaticalCase(number, wordKey)
                );
            }
        },
    };

    moment.defineLocale('me', {
        months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split(
            '_'
        ),
        monthsShort:
            'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),
        monthsParseExact: true,
        weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split(
            '_'
        ),
        weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
        weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY H:mm',
            LLLL: 'dddd, D. MMMM YYYY H:mm',
        },
        calendar: {
            sameDay: '[danas u] LT',
            nextDay: '[sjutra u] LT',

            nextWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[u] [nedjelju] [u] LT';
                    case 3:
                        return '[u] [srijedu] [u] LT';
                    case 6:
                        return '[u] [subotu] [u] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[u] dddd [u] LT';
                }
            },
            lastDay: '[juče u] LT',
            lastWeek: function () {
                var lastWeekDays = [
                    '[prošle] [nedjelje] [u] LT',
                    '[prošlog] [ponedjeljka] [u] LT',
                    '[prošlog] [utorka] [u] LT',
                    '[prošle] [srijede] [u] LT',
                    '[prošlog] [četvrtka] [u] LT',
                    '[prošlog] [petka] [u] LT',
                    '[prošle] [subote] [u] LT',
                ];
                return lastWeekDays[this.day()];
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'za %s',
            past: 'prije %s',
            s: 'nekoliko sekundi',
            ss: translator.translate,
            m: translator.translate,
            mm: translator.translate,
            h: translator.translate,
            hh: translator.translate,
            d: 'dan',
            dd: translator.translate,
            M: 'mjesec',
            MM: translator.translate,
            y: 'godinu',
            yy: translator.translate,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('mi', {
        months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split(
            '_'
        ),
        monthsShort:
            'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split(
                '_'
            ),
        monthsRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
        monthsStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
        monthsShortRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
        monthsShortStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,
        weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'),
        weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),
        weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY [i] HH:mm',
            LLLL: 'dddd, D MMMM YYYY [i] HH:mm',
        },
        calendar: {
            sameDay: '[i teie mahana, i] LT',
            nextDay: '[apopo i] LT',
            nextWeek: 'dddd [i] LT',
            lastDay: '[inanahi i] LT',
            lastWeek: 'dddd [whakamutunga i] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'i roto i %s',
            past: '%s i mua',
            s: 'te hēkona ruarua',
            ss: '%d hēkona',
            m: 'he meneti',
            mm: '%d meneti',
            h: 'te haora',
            hh: '%d haora',
            d: 'he ra',
            dd: '%d ra',
            M: 'he marama',
            MM: '%d marama',
            y: 'he tau',
            yy: '%d tau',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('mk', {
        months: 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split(
            '_'
        ),
        monthsShort: 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'),
        weekdays: 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split(
            '_'
        ),
        weekdaysShort: 'нед_пон_вто_сре_чет_пет_саб'.split('_'),
        weekdaysMin: 'нe_пo_вт_ср_че_пе_сa'.split('_'),
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'D.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY H:mm',
            LLLL: 'dddd, D MMMM YYYY H:mm',
        },
        calendar: {
            sameDay: '[Денес во] LT',
            nextDay: '[Утре во] LT',
            nextWeek: '[Во] dddd [во] LT',
            lastDay: '[Вчера во] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                    case 3:
                    case 6:
                        return '[Изминатата] dddd [во] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[Изминатиот] dddd [во] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'за %s',
            past: 'пред %s',
            s: 'неколку секунди',
            ss: '%d секунди',
            m: 'една минута',
            mm: '%d минути',
            h: 'еден час',
            hh: '%d часа',
            d: 'еден ден',
            dd: '%d дена',
            M: 'еден месец',
            MM: '%d месеци',
            y: 'една година',
            yy: '%d години',
        },
        dayOfMonthOrdinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/,
        ordinal: function (number) {
            var lastDigit = number % 10,
                last2Digits = number % 100;
            if (number === 0) {
                return number + '-ев';
            } else if (last2Digits === 0) {
                return number + '-ен';
            } else if (last2Digits > 10 && last2Digits < 20) {
                return number + '-ти';
            } else if (lastDigit === 1) {
                return number + '-ви';
            } else if (lastDigit === 2) {
                return number + '-ри';
            } else if (lastDigit === 7 || lastDigit === 8) {
                return number + '-ми';
            } else {
                return number + '-ти';
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('ml', {
        months: 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split(
            '_'
        ),
        monthsShort:
            'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays:
            'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split(
                '_'
            ),
        weekdaysShort: 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'),
        weekdaysMin: 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'),
        longDateFormat: {
            LT: 'A h:mm -നു',
            LTS: 'A h:mm:ss -നു',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm -നു',
            LLLL: 'dddd, D MMMM YYYY, A h:mm -നു',
        },
        calendar: {
            sameDay: '[ഇന്ന്] LT',
            nextDay: '[നാളെ] LT',
            nextWeek: 'dddd, LT',
            lastDay: '[ഇന്നലെ] LT',
            lastWeek: '[കഴിഞ്ഞ] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s കഴിഞ്ഞ്',
            past: '%s മുൻപ്',
            s: 'അൽപ നിമിഷങ്ങൾ',
            ss: '%d സെക്കൻഡ്',
            m: 'ഒരു മിനിറ്റ്',
            mm: '%d മിനിറ്റ്',
            h: 'ഒരു മണിക്കൂർ',
            hh: '%d മണിക്കൂർ',
            d: 'ഒരു ദിവസം',
            dd: '%d ദിവസം',
            M: 'ഒരു മാസം',
            MM: '%d മാസം',
            y: 'ഒരു വർഷം',
            yy: '%d വർഷം',
        },
        meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (
                (meridiem === 'രാത്രി' && hour >= 4) ||
                meridiem === 'ഉച്ച കഴിഞ്ഞ്' ||
                meridiem === 'വൈകുന്നേരം'
            ) {
                return hour + 12;
            } else {
                return hour;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'രാത്രി';
            } else if (hour < 12) {
                return 'രാവിലെ';
            } else if (hour < 17) {
                return 'ഉച്ച കഴിഞ്ഞ്';
            } else if (hour < 20) {
                return 'വൈകുന്നേരം';
            } else {
                return 'രാത്രി';
            }
        },
    });

    //! moment.js locale configuration

    function translate$7(number, withoutSuffix, key, isFuture) {
        switch (key) {
            case 's':
                return withoutSuffix ? 'хэдхэн секунд' : 'хэдхэн секундын';
            case 'ss':
                return number + (withoutSuffix ? ' секунд' : ' секундын');
            case 'm':
            case 'mm':
                return number + (withoutSuffix ? ' минут' : ' минутын');
            case 'h':
            case 'hh':
                return number + (withoutSuffix ? ' цаг' : ' цагийн');
            case 'd':
            case 'dd':
                return number + (withoutSuffix ? ' өдөр' : ' өдрийн');
            case 'M':
            case 'MM':
                return number + (withoutSuffix ? ' сар' : ' сарын');
            case 'y':
            case 'yy':
                return number + (withoutSuffix ? ' жил' : ' жилийн');
            default:
                return number;
        }
    }

    moment.defineLocale('mn', {
        months: 'Нэгдүгээр сар_Хоёрдугаар сар_Гуравдугаар сар_Дөрөвдүгээр сар_Тавдугаар сар_Зургадугаар сар_Долдугаар сар_Наймдугаар сар_Есдүгээр сар_Аравдугаар сар_Арван нэгдүгээр сар_Арван хоёрдугаар сар'.split(
            '_'
        ),
        monthsShort:
            '1 сар_2 сар_3 сар_4 сар_5 сар_6 сар_7 сар_8 сар_9 сар_10 сар_11 сар_12 сар'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'Ням_Даваа_Мягмар_Лхагва_Пүрэв_Баасан_Бямба'.split('_'),
        weekdaysShort: 'Ням_Дав_Мяг_Лха_Пүр_Баа_Бям'.split('_'),
        weekdaysMin: 'Ня_Да_Мя_Лх_Пү_Ба_Бя'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY-MM-DD',
            LL: 'YYYY оны MMMMын D',
            LLL: 'YYYY оны MMMMын D HH:mm',
            LLLL: 'dddd, YYYY оны MMMMын D HH:mm',
        },
        meridiemParse: /ҮӨ|ҮХ/i,
        isPM: function (input) {
            return input === 'ҮХ';
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'ҮӨ';
            } else {
                return 'ҮХ';
            }
        },
        calendar: {
            sameDay: '[Өнөөдөр] LT',
            nextDay: '[Маргааш] LT',
            nextWeek: '[Ирэх] dddd LT',
            lastDay: '[Өчигдөр] LT',
            lastWeek: '[Өнгөрсөн] dddd LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s дараа',
            past: '%s өмнө',
            s: translate$7,
            ss: translate$7,
            m: translate$7,
            mm: translate$7,
            h: translate$7,
            hh: translate$7,
            d: translate$7,
            dd: translate$7,
            M: translate$7,
            MM: translate$7,
            y: translate$7,
            yy: translate$7,
        },
        dayOfMonthOrdinalParse: /\d{1,2} өдөр/,
        ordinal: function (number, period) {
            switch (period) {
                case 'd':
                case 'D':
                case 'DDD':
                    return number + ' өдөр';
                default:
                    return number;
            }
        },
    });

    //! moment.js locale configuration

    var symbolMap$c = {
            1: '१',
            2: '२',
            3: '३',
            4: '४',
            5: '५',
            6: '६',
            7: '७',
            8: '८',
            9: '९',
            0: '०',
        },
        numberMap$b = {
            '१': '1',
            '२': '2',
            '३': '3',
            '४': '4',
            '५': '5',
            '६': '6',
            '७': '7',
            '८': '8',
            '९': '9',
            '०': '0',
        };

    function relativeTimeMr(number, withoutSuffix, string, isFuture) {
        var output = '';
        if (withoutSuffix) {
            switch (string) {
                case 's':
                    output = 'काही सेकंद';
                    break;
                case 'ss':
                    output = '%d सेकंद';
                    break;
                case 'm':
                    output = 'एक मिनिट';
                    break;
                case 'mm':
                    output = '%d मिनिटे';
                    break;
                case 'h':
                    output = 'एक तास';
                    break;
                case 'hh':
                    output = '%d तास';
                    break;
                case 'd':
                    output = 'एक दिवस';
                    break;
                case 'dd':
                    output = '%d दिवस';
                    break;
                case 'M':
                    output = 'एक महिना';
                    break;
                case 'MM':
                    output = '%d महिने';
                    break;
                case 'y':
                    output = 'एक वर्ष';
                    break;
                case 'yy':
                    output = '%d वर्षे';
                    break;
            }
        } else {
            switch (string) {
                case 's':
                    output = 'काही सेकंदां';
                    break;
                case 'ss':
                    output = '%d सेकंदां';
                    break;
                case 'm':
                    output = 'एका मिनिटा';
                    break;
                case 'mm':
                    output = '%d मिनिटां';
                    break;
                case 'h':
                    output = 'एका तासा';
                    break;
                case 'hh':
                    output = '%d तासां';
                    break;
                case 'd':
                    output = 'एका दिवसा';
                    break;
                case 'dd':
                    output = '%d दिवसां';
                    break;
                case 'M':
                    output = 'एका महिन्या';
                    break;
                case 'MM':
                    output = '%d महिन्यां';
                    break;
                case 'y':
                    output = 'एका वर्षा';
                    break;
                case 'yy':
                    output = '%d वर्षां';
                    break;
            }
        }
        return output.replace(/%d/i, number);
    }

    moment.defineLocale('mr', {
        months: 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split(
            '_'
        ),
        monthsShort:
            'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
        weekdaysShort: 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'),
        weekdaysMin: 'र_सो_मं_बु_गु_शु_श'.split('_'),
        longDateFormat: {
            LT: 'A h:mm वाजता',
            LTS: 'A h:mm:ss वाजता',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm वाजता',
            LLLL: 'dddd, D MMMM YYYY, A h:mm वाजता',
        },
        calendar: {
            sameDay: '[आज] LT',
            nextDay: '[उद्या] LT',
            nextWeek: 'dddd, LT',
            lastDay: '[काल] LT',
            lastWeek: '[मागील] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%sमध्ये',
            past: '%sपूर्वी',
            s: relativeTimeMr,
            ss: relativeTimeMr,
            m: relativeTimeMr,
            mm: relativeTimeMr,
            h: relativeTimeMr,
            hh: relativeTimeMr,
            d: relativeTimeMr,
            dd: relativeTimeMr,
            M: relativeTimeMr,
            MM: relativeTimeMr,
            y: relativeTimeMr,
            yy: relativeTimeMr,
        },
        preparse: function (string) {
            return string.replace(/[१२३४५६७८९०]/g, function (match) {
                return numberMap$b[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap$c[match];
            });
        },
        meridiemParse: /पहाटे|सकाळी|दुपारी|सायंकाळी|रात्री/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'पहाटे' || meridiem === 'सकाळी') {
                return hour;
            } else if (
                meridiem === 'दुपारी' ||
                meridiem === 'सायंकाळी' ||
                meridiem === 'रात्री'
            ) {
                return hour >= 12 ? hour : hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour >= 0 && hour < 6) {
                return 'पहाटे';
            } else if (hour < 12) {
                return 'सकाळी';
            } else if (hour < 17) {
                return 'दुपारी';
            } else if (hour < 20) {
                return 'सायंकाळी';
            } else {
                return 'रात्री';
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('ms-my', {
        months: 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),
        weekdays: 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),
        weekdaysShort: 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),
        weekdaysMin: 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
        longDateFormat: {
            LT: 'HH.mm',
            LTS: 'HH.mm.ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY [pukul] HH.mm',
            LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',
        },
        meridiemParse: /pagi|tengahari|petang|malam/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'pagi') {
                return hour;
            } else if (meridiem === 'tengahari') {
                return hour >= 11 ? hour : hour + 12;
            } else if (meridiem === 'petang' || meridiem === 'malam') {
                return hour + 12;
            }
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours < 11) {
                return 'pagi';
            } else if (hours < 15) {
                return 'tengahari';
            } else if (hours < 19) {
                return 'petang';
            } else {
                return 'malam';
            }
        },
        calendar: {
            sameDay: '[Hari ini pukul] LT',
            nextDay: '[Esok pukul] LT',
            nextWeek: 'dddd [pukul] LT',
            lastDay: '[Kelmarin pukul] LT',
            lastWeek: 'dddd [lepas pukul] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'dalam %s',
            past: '%s yang lepas',
            s: 'beberapa saat',
            ss: '%d saat',
            m: 'seminit',
            mm: '%d minit',
            h: 'sejam',
            hh: '%d jam',
            d: 'sehari',
            dd: '%d hari',
            M: 'sebulan',
            MM: '%d bulan',
            y: 'setahun',
            yy: '%d tahun',
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('ms', {
        months: 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),
        weekdays: 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),
        weekdaysShort: 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),
        weekdaysMin: 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
        longDateFormat: {
            LT: 'HH.mm',
            LTS: 'HH.mm.ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY [pukul] HH.mm',
            LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',
        },
        meridiemParse: /pagi|tengahari|petang|malam/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'pagi') {
                return hour;
            } else if (meridiem === 'tengahari') {
                return hour >= 11 ? hour : hour + 12;
            } else if (meridiem === 'petang' || meridiem === 'malam') {
                return hour + 12;
            }
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours < 11) {
                return 'pagi';
            } else if (hours < 15) {
                return 'tengahari';
            } else if (hours < 19) {
                return 'petang';
            } else {
                return 'malam';
            }
        },
        calendar: {
            sameDay: '[Hari ini pukul] LT',
            nextDay: '[Esok pukul] LT',
            nextWeek: 'dddd [pukul] LT',
            lastDay: '[Kelmarin pukul] LT',
            lastWeek: 'dddd [lepas pukul] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'dalam %s',
            past: '%s yang lepas',
            s: 'beberapa saat',
            ss: '%d saat',
            m: 'seminit',
            mm: '%d minit',
            h: 'sejam',
            hh: '%d jam',
            d: 'sehari',
            dd: '%d hari',
            M: 'sebulan',
            MM: '%d bulan',
            y: 'setahun',
            yy: '%d tahun',
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('mt', {
        months: 'Jannar_Frar_Marzu_April_Mejju_Ġunju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Diċembru'.split(
            '_'
        ),
        monthsShort: 'Jan_Fra_Mar_Apr_Mej_Ġun_Lul_Aww_Set_Ott_Nov_Diċ'.split('_'),
        weekdays:
            'Il-Ħadd_It-Tnejn_It-Tlieta_L-Erbgħa_Il-Ħamis_Il-Ġimgħa_Is-Sibt'.split(
                '_'
            ),
        weekdaysShort: 'Ħad_Tne_Tli_Erb_Ħam_Ġim_Sib'.split('_'),
        weekdaysMin: 'Ħa_Tn_Tl_Er_Ħa_Ġi_Si'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Illum fil-]LT',
            nextDay: '[Għada fil-]LT',
            nextWeek: 'dddd [fil-]LT',
            lastDay: '[Il-bieraħ fil-]LT',
            lastWeek: 'dddd [li għadda] [fil-]LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'f’ %s',
            past: '%s ilu',
            s: 'ftit sekondi',
            ss: '%d sekondi',
            m: 'minuta',
            mm: '%d minuti',
            h: 'siegħa',
            hh: '%d siegħat',
            d: 'ġurnata',
            dd: '%d ġranet',
            M: 'xahar',
            MM: '%d xhur',
            y: 'sena',
            yy: '%d sni',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var symbolMap$d = {
            1: '၁',
            2: '၂',
            3: '၃',
            4: '၄',
            5: '၅',
            6: '၆',
            7: '၇',
            8: '၈',
            9: '၉',
            0: '၀',
        },
        numberMap$c = {
            '၁': '1',
            '၂': '2',
            '၃': '3',
            '၄': '4',
            '၅': '5',
            '၆': '6',
            '၇': '7',
            '၈': '8',
            '၉': '9',
            '၀': '0',
        };

    moment.defineLocale('my', {
        months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split(
            '_'
        ),
        monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'),
        weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split(
            '_'
        ),
        weekdaysShort: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
        weekdaysMin: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),

        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[ယနေ.] LT [မှာ]',
            nextDay: '[မနက်ဖြန်] LT [မှာ]',
            nextWeek: 'dddd LT [မှာ]',
            lastDay: '[မနေ.က] LT [မှာ]',
            lastWeek: '[ပြီးခဲ့သော] dddd LT [မှာ]',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'လာမည့် %s မှာ',
            past: 'လွန်ခဲ့သော %s က',
            s: 'စက္ကန်.အနည်းငယ်',
            ss: '%d စက္ကန့်',
            m: 'တစ်မိနစ်',
            mm: '%d မိနစ်',
            h: 'တစ်နာရီ',
            hh: '%d နာရီ',
            d: 'တစ်ရက်',
            dd: '%d ရက်',
            M: 'တစ်လ',
            MM: '%d လ',
            y: 'တစ်နှစ်',
            yy: '%d နှစ်',
        },
        preparse: function (string) {
            return string.replace(/[၁၂၃၄၅၆၇၈၉၀]/g, function (match) {
                return numberMap$c[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap$d[match];
            });
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('nb', {
        months: 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split(
            '_'
        ),
        monthsShort:
            'jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),
        monthsParseExact: true,
        weekdays: 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
        weekdaysShort: 'sø._ma._ti._on._to._fr._lø.'.split('_'),
        weekdaysMin: 'sø_ma_ti_on_to_fr_lø'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY [kl.] HH:mm',
            LLLL: 'dddd D. MMMM YYYY [kl.] HH:mm',
        },
        calendar: {
            sameDay: '[i dag kl.] LT',
            nextDay: '[i morgen kl.] LT',
            nextWeek: 'dddd [kl.] LT',
            lastDay: '[i går kl.] LT',
            lastWeek: '[forrige] dddd [kl.] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'om %s',
            past: '%s siden',
            s: 'noen sekunder',
            ss: '%d sekunder',
            m: 'ett minutt',
            mm: '%d minutter',
            h: 'en time',
            hh: '%d timer',
            d: 'en dag',
            dd: '%d dager',
            w: 'en uke',
            ww: '%d uker',
            M: 'en måned',
            MM: '%d måneder',
            y: 'ett år',
            yy: '%d år',
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var symbolMap$e = {
            1: '१',
            2: '२',
            3: '३',
            4: '४',
            5: '५',
            6: '६',
            7: '७',
            8: '८',
            9: '९',
            0: '०',
        },
        numberMap$d = {
            '१': '1',
            '२': '2',
            '३': '3',
            '४': '4',
            '५': '5',
            '६': '6',
            '७': '7',
            '८': '8',
            '९': '9',
            '०': '0',
        };

    moment.defineLocale('ne', {
        months: 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split(
            '_'
        ),
        monthsShort:
            'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split(
            '_'
        ),
        weekdaysShort: 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'),
        weekdaysMin: 'आ._सो._मं._बु._बि._शु._श.'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'Aको h:mm बजे',
            LTS: 'Aको h:mm:ss बजे',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, Aको h:mm बजे',
            LLLL: 'dddd, D MMMM YYYY, Aको h:mm बजे',
        },
        preparse: function (string) {
            return string.replace(/[१२३४५६७८९०]/g, function (match) {
                return numberMap$d[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap$e[match];
            });
        },
        meridiemParse: /राति|बिहान|दिउँसो|साँझ/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'राति') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'बिहान') {
                return hour;
            } else if (meridiem === 'दिउँसो') {
                return hour >= 10 ? hour : hour + 12;
            } else if (meridiem === 'साँझ') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 3) {
                return 'राति';
            } else if (hour < 12) {
                return 'बिहान';
            } else if (hour < 16) {
                return 'दिउँसो';
            } else if (hour < 20) {
                return 'साँझ';
            } else {
                return 'राति';
            }
        },
        calendar: {
            sameDay: '[आज] LT',
            nextDay: '[भोलि] LT',
            nextWeek: '[आउँदो] dddd[,] LT',
            lastDay: '[हिजो] LT',
            lastWeek: '[गएको] dddd[,] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%sमा',
            past: '%s अगाडि',
            s: 'केही क्षण',
            ss: '%d सेकेण्ड',
            m: 'एक मिनेट',
            mm: '%d मिनेट',
            h: 'एक घण्टा',
            hh: '%d घण्टा',
            d: 'एक दिन',
            dd: '%d दिन',
            M: 'एक महिना',
            MM: '%d महिना',
            y: 'एक बर्ष',
            yy: '%d बर्ष',
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var monthsShortWithDots$1 =
            'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),
        monthsShortWithoutDots$1 =
            'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'),
        monthsParse$8 = [
            /^jan/i,
            /^feb/i,
            /^maart|mrt.?$/i,
            /^apr/i,
            /^mei$/i,
            /^jun[i.]?$/i,
            /^jul[i.]?$/i,
            /^aug/i,
            /^sep/i,
            /^okt/i,
            /^nov/i,
            /^dec/i,
        ],
        monthsRegex$7 =
            /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;

    moment.defineLocale('nl-be', {
        months: 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split(
            '_'
        ),
        monthsShort: function (m, format) {
            if (!m) {
                return monthsShortWithDots$1;
            } else if (/-MMM-/.test(format)) {
                return monthsShortWithoutDots$1[m.month()];
            } else {
                return monthsShortWithDots$1[m.month()];
            }
        },

        monthsRegex: monthsRegex$7,
        monthsShortRegex: monthsRegex$7,
        monthsStrictRegex:
            /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,
        monthsShortStrictRegex:
            /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,

        monthsParse: monthsParse$8,
        longMonthsParse: monthsParse$8,
        shortMonthsParse: monthsParse$8,

        weekdays:
            'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
        weekdaysShort: 'zo._ma._di._wo._do._vr._za.'.split('_'),
        weekdaysMin: 'zo_ma_di_wo_do_vr_za'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[vandaag om] LT',
            nextDay: '[morgen om] LT',
            nextWeek: 'dddd [om] LT',
            lastDay: '[gisteren om] LT',
            lastWeek: '[afgelopen] dddd [om] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'over %s',
            past: '%s geleden',
            s: 'een paar seconden',
            ss: '%d seconden',
            m: 'één minuut',
            mm: '%d minuten',
            h: 'één uur',
            hh: '%d uur',
            d: 'één dag',
            dd: '%d dagen',
            M: 'één maand',
            MM: '%d maanden',
            y: 'één jaar',
            yy: '%d jaar',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/,
        ordinal: function (number) {
            return (
                number +
                (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')
            );
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var monthsShortWithDots$2 =
            'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),
        monthsShortWithoutDots$2 =
            'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'),
        monthsParse$9 = [
            /^jan/i,
            /^feb/i,
            /^maart|mrt.?$/i,
            /^apr/i,
            /^mei$/i,
            /^jun[i.]?$/i,
            /^jul[i.]?$/i,
            /^aug/i,
            /^sep/i,
            /^okt/i,
            /^nov/i,
            /^dec/i,
        ],
        monthsRegex$8 =
            /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;

    moment.defineLocale('nl', {
        months: 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split(
            '_'
        ),
        monthsShort: function (m, format) {
            if (!m) {
                return monthsShortWithDots$2;
            } else if (/-MMM-/.test(format)) {
                return monthsShortWithoutDots$2[m.month()];
            } else {
                return monthsShortWithDots$2[m.month()];
            }
        },

        monthsRegex: monthsRegex$8,
        monthsShortRegex: monthsRegex$8,
        monthsStrictRegex:
            /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,
        monthsShortStrictRegex:
            /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,

        monthsParse: monthsParse$9,
        longMonthsParse: monthsParse$9,
        shortMonthsParse: monthsParse$9,

        weekdays:
            'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
        weekdaysShort: 'zo._ma._di._wo._do._vr._za.'.split('_'),
        weekdaysMin: 'zo_ma_di_wo_do_vr_za'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD-MM-YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[vandaag om] LT',
            nextDay: '[morgen om] LT',
            nextWeek: 'dddd [om] LT',
            lastDay: '[gisteren om] LT',
            lastWeek: '[afgelopen] dddd [om] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'over %s',
            past: '%s geleden',
            s: 'een paar seconden',
            ss: '%d seconden',
            m: 'één minuut',
            mm: '%d minuten',
            h: 'één uur',
            hh: '%d uur',
            d: 'één dag',
            dd: '%d dagen',
            w: 'één week',
            ww: '%d weken',
            M: 'één maand',
            MM: '%d maanden',
            y: 'één jaar',
            yy: '%d jaar',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/,
        ordinal: function (number) {
            return (
                number +
                (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')
            );
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('nn', {
        months: 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split(
            '_'
        ),
        monthsShort:
            'jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),
        monthsParseExact: true,
        weekdays: 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'),
        weekdaysShort: 'su._må._ty._on._to._fr._lau.'.split('_'),
        weekdaysMin: 'su_må_ty_on_to_fr_la'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY [kl.] H:mm',
            LLLL: 'dddd D. MMMM YYYY [kl.] HH:mm',
        },
        calendar: {
            sameDay: '[I dag klokka] LT',
            nextDay: '[I morgon klokka] LT',
            nextWeek: 'dddd [klokka] LT',
            lastDay: '[I går klokka] LT',
            lastWeek: '[Føregåande] dddd [klokka] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'om %s',
            past: '%s sidan',
            s: 'nokre sekund',
            ss: '%d sekund',
            m: 'eit minutt',
            mm: '%d minutt',
            h: 'ein time',
            hh: '%d timar',
            d: 'ein dag',
            dd: '%d dagar',
            w: 'ei veke',
            ww: '%d veker',
            M: 'ein månad',
            MM: '%d månader',
            y: 'eit år',
            yy: '%d år',
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('oc-lnc', {
        months: {
            standalone:
                'genièr_febrièr_març_abril_mai_junh_julhet_agost_setembre_octòbre_novembre_decembre'.split(
                    '_'
                ),
            format: "de genièr_de febrièr_de març_d'abril_de mai_de junh_de julhet_d'agost_de setembre_d'octòbre_de novembre_de decembre".split(
                '_'
            ),
            isFormat: /D[oD]?(\s)+MMMM/,
        },
        monthsShort:
            'gen._febr._març_abr._mai_junh_julh._ago._set._oct._nov._dec.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'dimenge_diluns_dimars_dimècres_dijòus_divendres_dissabte'.split(
            '_'
        ),
        weekdaysShort: 'dg._dl._dm._dc._dj._dv._ds.'.split('_'),
        weekdaysMin: 'dg_dl_dm_dc_dj_dv_ds'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM [de] YYYY',
            ll: 'D MMM YYYY',
            LLL: 'D MMMM [de] YYYY [a] H:mm',
            lll: 'D MMM YYYY, H:mm',
            LLLL: 'dddd D MMMM [de] YYYY [a] H:mm',
            llll: 'ddd D MMM YYYY, H:mm',
        },
        calendar: {
            sameDay: '[uèi a] LT',
            nextDay: '[deman a] LT',
            nextWeek: 'dddd [a] LT',
            lastDay: '[ièr a] LT',
            lastWeek: 'dddd [passat a] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: "d'aquí %s",
            past: 'fa %s',
            s: 'unas segondas',
            ss: '%d segondas',
            m: 'una minuta',
            mm: '%d minutas',
            h: 'una ora',
            hh: '%d oras',
            d: 'un jorn',
            dd: '%d jorns',
            M: 'un mes',
            MM: '%d meses',
            y: 'un an',
            yy: '%d ans',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(r|n|t|è|a)/,
        ordinal: function (number, period) {
            var output =
                number === 1
                    ? 'r'
                    : number === 2
                    ? 'n'
                    : number === 3
                    ? 'r'
                    : number === 4
                    ? 't'
                    : 'è';
            if (period === 'w' || period === 'W') {
                output = 'a';
            }
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4,
        },
    });

    //! moment.js locale configuration

    var symbolMap$f = {
            1: '੧',
            2: '੨',
            3: '੩',
            4: '੪',
            5: '੫',
            6: '੬',
            7: '੭',
            8: '੮',
            9: '੯',
            0: '੦',
        },
        numberMap$e = {
            '੧': '1',
            '੨': '2',
            '੩': '3',
            '੪': '4',
            '੫': '5',
            '੬': '6',
            '੭': '7',
            '੮': '8',
            '੯': '9',
            '੦': '0',
        };

    moment.defineLocale('pa-in', {
        // There are months name as per Nanakshahi Calendar but they are not used as rigidly in modern Punjabi.
        months: 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split(
            '_'
        ),
        monthsShort:
            'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split(
                '_'
            ),
        weekdays: 'ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ'.split(
            '_'
        ),
        weekdaysShort: 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),
        weekdaysMin: 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),
        longDateFormat: {
            LT: 'A h:mm ਵਜੇ',
            LTS: 'A h:mm:ss ਵਜੇ',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm ਵਜੇ',
            LLLL: 'dddd, D MMMM YYYY, A h:mm ਵਜੇ',
        },
        calendar: {
            sameDay: '[ਅਜ] LT',
            nextDay: '[ਕਲ] LT',
            nextWeek: '[ਅਗਲਾ] dddd, LT',
            lastDay: '[ਕਲ] LT',
            lastWeek: '[ਪਿਛਲੇ] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s ਵਿੱਚ',
            past: '%s ਪਿਛਲੇ',
            s: 'ਕੁਝ ਸਕਿੰਟ',
            ss: '%d ਸਕਿੰਟ',
            m: 'ਇਕ ਮਿੰਟ',
            mm: '%d ਮਿੰਟ',
            h: 'ਇੱਕ ਘੰਟਾ',
            hh: '%d ਘੰਟੇ',
            d: 'ਇੱਕ ਦਿਨ',
            dd: '%d ਦਿਨ',
            M: 'ਇੱਕ ਮਹੀਨਾ',
            MM: '%d ਮਹੀਨੇ',
            y: 'ਇੱਕ ਸਾਲ',
            yy: '%d ਸਾਲ',
        },
        preparse: function (string) {
            return string.replace(/[੧੨੩੪੫੬੭੮੯੦]/g, function (match) {
                return numberMap$e[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap$f[match];
            });
        },
        // Punjabi notation for meridiems are quite fuzzy in practice. While there exists
        // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi.
        meridiemParse: /ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'ਰਾਤ') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'ਸਵੇਰ') {
                return hour;
            } else if (meridiem === 'ਦੁਪਹਿਰ') {
                return hour >= 10 ? hour : hour + 12;
            } else if (meridiem === 'ਸ਼ਾਮ') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'ਰਾਤ';
            } else if (hour < 10) {
                return 'ਸਵੇਰ';
            } else if (hour < 17) {
                return 'ਦੁਪਹਿਰ';
            } else if (hour < 20) {
                return 'ਸ਼ਾਮ';
            } else {
                return 'ਰਾਤ';
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var monthsNominative =
            'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split(
                '_'
            ),
        monthsSubjective =
            'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split(
                '_'
            ),
        monthsParse$a = [
            /^sty/i,
            /^lut/i,
            /^mar/i,
            /^kwi/i,
            /^maj/i,
            /^cze/i,
            /^lip/i,
            /^sie/i,
            /^wrz/i,
            /^paź/i,
            /^lis/i,
            /^gru/i,
        ];
    function plural$3(n) {
        return n % 10 < 5 && n % 10 > 1 && ~~(n / 10) % 10 !== 1;
    }
    function translate$8(number, withoutSuffix, key) {
        var result = number + ' ';
        switch (key) {
            case 'ss':
                return result + (plural$3(number) ? 'sekundy' : 'sekund');
            case 'm':
                return withoutSuffix ? 'minuta' : 'minutę';
            case 'mm':
                return result + (plural$3(number) ? 'minuty' : 'minut');
            case 'h':
                return withoutSuffix ? 'godzina' : 'godzinę';
            case 'hh':
                return result + (plural$3(number) ? 'godziny' : 'godzin');
            case 'ww':
                return result + (plural$3(number) ? 'tygodnie' : 'tygodni');
            case 'MM':
                return result + (plural$3(number) ? 'miesiące' : 'miesięcy');
            case 'yy':
                return result + (plural$3(number) ? 'lata' : 'lat');
        }
    }

    moment.defineLocale('pl', {
        months: function (momentToFormat, format) {
            if (!momentToFormat) {
                return monthsNominative;
            } else if (/D MMMM/.test(format)) {
                return monthsSubjective[momentToFormat.month()];
            } else {
                return monthsNominative[momentToFormat.month()];
            }
        },
        monthsShort: 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'),
        monthsParse: monthsParse$a,
        longMonthsParse: monthsParse$a,
        shortMonthsParse: monthsParse$a,
        weekdays:
            'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'),
        weekdaysShort: 'ndz_pon_wt_śr_czw_pt_sob'.split('_'),
        weekdaysMin: 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Dziś o] LT',
            nextDay: '[Jutro o] LT',
            nextWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[W niedzielę o] LT';

                    case 2:
                        return '[We wtorek o] LT';

                    case 3:
                        return '[W środę o] LT';

                    case 6:
                        return '[W sobotę o] LT';

                    default:
                        return '[W] dddd [o] LT';
                }
            },
            lastDay: '[Wczoraj o] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[W zeszłą niedzielę o] LT';
                    case 3:
                        return '[W zeszłą środę o] LT';
                    case 6:
                        return '[W zeszłą sobotę o] LT';
                    default:
                        return '[W zeszły] dddd [o] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'za %s',
            past: '%s temu',
            s: 'kilka sekund',
            ss: translate$8,
            m: translate$8,
            mm: translate$8,
            h: translate$8,
            hh: translate$8,
            d: '1 dzień',
            dd: '%d dni',
            w: 'tydzień',
            ww: translate$8,
            M: 'miesiąc',
            MM: translate$8,
            y: 'rok',
            yy: translate$8,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('pt-br', {
        months: 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split(
            '_'
        ),
        monthsShort: 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),
        weekdays:
            'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split(
                '_'
            ),
        weekdaysShort: 'dom_seg_ter_qua_qui_sex_sáb'.split('_'),
        weekdaysMin: 'do_2ª_3ª_4ª_5ª_6ª_sá'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D [de] MMMM [de] YYYY',
            LLL: 'D [de] MMMM [de] YYYY [às] HH:mm',
            LLLL: 'dddd, D [de] MMMM [de] YYYY [às] HH:mm',
        },
        calendar: {
            sameDay: '[Hoje às] LT',
            nextDay: '[Amanhã às] LT',
            nextWeek: 'dddd [às] LT',
            lastDay: '[Ontem às] LT',
            lastWeek: function () {
                return this.day() === 0 || this.day() === 6
                    ? '[Último] dddd [às] LT' // Saturday + Sunday
                    : '[Última] dddd [às] LT'; // Monday - Friday
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'em %s',
            past: 'há %s',
            s: 'poucos segundos',
            ss: '%d segundos',
            m: 'um minuto',
            mm: '%d minutos',
            h: 'uma hora',
            hh: '%d horas',
            d: 'um dia',
            dd: '%d dias',
            M: 'um mês',
            MM: '%d meses',
            y: 'um ano',
            yy: '%d anos',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        invalidDate: 'Data inválida',
    });

    //! moment.js locale configuration

    moment.defineLocale('pt', {
        months: 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split(
            '_'
        ),
        monthsShort: 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),
        weekdays:
            'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split(
                '_'
            ),
        weekdaysShort: 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),
        weekdaysMin: 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D [de] MMMM [de] YYYY',
            LLL: 'D [de] MMMM [de] YYYY HH:mm',
            LLLL: 'dddd, D [de] MMMM [de] YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Hoje às] LT',
            nextDay: '[Amanhã às] LT',
            nextWeek: 'dddd [às] LT',
            lastDay: '[Ontem às] LT',
            lastWeek: function () {
                return this.day() === 0 || this.day() === 6
                    ? '[Último] dddd [às] LT' // Saturday + Sunday
                    : '[Última] dddd [às] LT'; // Monday - Friday
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'em %s',
            past: 'há %s',
            s: 'segundos',
            ss: '%d segundos',
            m: 'um minuto',
            mm: '%d minutos',
            h: 'uma hora',
            hh: '%d horas',
            d: 'um dia',
            dd: '%d dias',
            w: 'uma semana',
            ww: '%d semanas',
            M: 'um mês',
            MM: '%d meses',
            y: 'um ano',
            yy: '%d anos',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function relativeTimeWithPlural$2(number, withoutSuffix, key) {
        var format = {
                ss: 'secunde',
                mm: 'minute',
                hh: 'ore',
                dd: 'zile',
                ww: 'săptămâni',
                MM: 'luni',
                yy: 'ani',
            },
            separator = ' ';
        if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) {
            separator = ' de ';
        }
        return number + separator + format[key];
    }

    moment.defineLocale('ro', {
        months: 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split(
            '_'
        ),
        monthsShort:
            'ian._feb._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'),
        weekdaysShort: 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'),
        weekdaysMin: 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'),
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY H:mm',
            LLLL: 'dddd, D MMMM YYYY H:mm',
        },
        calendar: {
            sameDay: '[azi la] LT',
            nextDay: '[mâine la] LT',
            nextWeek: 'dddd [la] LT',
            lastDay: '[ieri la] LT',
            lastWeek: '[fosta] dddd [la] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'peste %s',
            past: '%s în urmă',
            s: 'câteva secunde',
            ss: relativeTimeWithPlural$2,
            m: 'un minut',
            mm: relativeTimeWithPlural$2,
            h: 'o oră',
            hh: relativeTimeWithPlural$2,
            d: 'o zi',
            dd: relativeTimeWithPlural$2,
            w: 'o săptămână',
            ww: relativeTimeWithPlural$2,
            M: 'o lună',
            MM: relativeTimeWithPlural$2,
            y: 'un an',
            yy: relativeTimeWithPlural$2,
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function plural$4(word, num) {
        var forms = word.split('_');
        return num % 10 === 1 && num % 100 !== 11
            ? forms[0]
            : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20)
            ? forms[1]
            : forms[2];
    }
    function relativeTimeWithPlural$3(number, withoutSuffix, key) {
        var format = {
            ss: withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд',
            mm: withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут',
            hh: 'час_часа_часов',
            dd: 'день_дня_дней',
            ww: 'неделя_недели_недель',
            MM: 'месяц_месяца_месяцев',
            yy: 'год_года_лет',
        };
        if (key === 'm') {
            return withoutSuffix ? 'минута' : 'минуту';
        } else {
            return number + ' ' + plural$4(format[key], +number);
        }
    }
    var monthsParse$b = [
        /^янв/i,
        /^фев/i,
        /^мар/i,
        /^апр/i,
        /^ма[йя]/i,
        /^июн/i,
        /^июл/i,
        /^авг/i,
        /^сен/i,
        /^окт/i,
        /^ноя/i,
        /^дек/i,
    ];

    // http://new.gramota.ru/spravka/rules/139-prop : § 103
    // Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637
    // CLDR data:          http://www.unicode.org/cldr/charts/28/summary/ru.html#1753
    moment.defineLocale('ru', {
        months: {
            format: 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split(
                '_'
            ),
            standalone:
                'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split(
                    '_'
                ),
        },
        monthsShort: {
            // по CLDR именно "июл." и "июн.", но какой смысл менять букву на точку?
            format: 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split(
                '_'
            ),
            standalone:
                'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split(
                    '_'
                ),
        },
        weekdays: {
            standalone:
                'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split(
                    '_'
                ),
            format: 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split(
                '_'
            ),
            isFormat: /\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?] ?dddd/,
        },
        weekdaysShort: 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
        weekdaysMin: 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
        monthsParse: monthsParse$b,
        longMonthsParse: monthsParse$b,
        shortMonthsParse: monthsParse$b,

        // полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки
        monthsRegex:
            /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,

        // копия предыдущего
        monthsShortRegex:
            /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,

        // полные названия с падежами
        monthsStrictRegex:
            /^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i,

        // Выражение, которое соответствует только сокращённым формам
        monthsShortStrictRegex:
            /^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY г.',
            LLL: 'D MMMM YYYY г., H:mm',
            LLLL: 'dddd, D MMMM YYYY г., H:mm',
        },
        calendar: {
            sameDay: '[Сегодня, в] LT',
            nextDay: '[Завтра, в] LT',
            lastDay: '[Вчера, в] LT',
            nextWeek: function (now) {
                if (now.week() !== this.week()) {
                    switch (this.day()) {
                        case 0:
                            return '[В следующее] dddd, [в] LT';
                        case 1:
                        case 2:
                        case 4:
                            return '[В следующий] dddd, [в] LT';
                        case 3:
                        case 5:
                        case 6:
                            return '[В следующую] dddd, [в] LT';
                    }
                } else {
                    if (this.day() === 2) {
                        return '[Во] dddd, [в] LT';
                    } else {
                        return '[В] dddd, [в] LT';
                    }
                }
            },
            lastWeek: function (now) {
                if (now.week() !== this.week()) {
                    switch (this.day()) {
                        case 0:
                            return '[В прошлое] dddd, [в] LT';
                        case 1:
                        case 2:
                        case 4:
                            return '[В прошлый] dddd, [в] LT';
                        case 3:
                        case 5:
                        case 6:
                            return '[В прошлую] dddd, [в] LT';
                    }
                } else {
                    if (this.day() === 2) {
                        return '[Во] dddd, [в] LT';
                    } else {
                        return '[В] dddd, [в] LT';
                    }
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'через %s',
            past: '%s назад',
            s: 'несколько секунд',
            ss: relativeTimeWithPlural$3,
            m: relativeTimeWithPlural$3,
            mm: relativeTimeWithPlural$3,
            h: 'час',
            hh: relativeTimeWithPlural$3,
            d: 'день',
            dd: relativeTimeWithPlural$3,
            w: 'неделя',
            ww: relativeTimeWithPlural$3,
            M: 'месяц',
            MM: relativeTimeWithPlural$3,
            y: 'год',
            yy: relativeTimeWithPlural$3,
        },
        meridiemParse: /ночи|утра|дня|вечера/i,
        isPM: function (input) {
            return /^(дня|вечера)$/.test(input);
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'ночи';
            } else if (hour < 12) {
                return 'утра';
            } else if (hour < 17) {
                return 'дня';
            } else {
                return 'вечера';
            }
        },
        dayOfMonthOrdinalParse: /\d{1,2}-(й|го|я)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'M':
                case 'd':
                case 'DDD':
                    return number + '-й';
                case 'D':
                    return number + '-го';
                case 'w':
                case 'W':
                    return number + '-я';
                default:
                    return number;
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var months$8 = [
            'جنوري',
            'فيبروري',
            'مارچ',
            'اپريل',
            'مئي',
            'جون',
            'جولاءِ',
            'آگسٽ',
            'سيپٽمبر',
            'آڪٽوبر',
            'نومبر',
            'ڊسمبر',
        ],
        days = ['آچر', 'سومر', 'اڱارو', 'اربع', 'خميس', 'جمع', 'ڇنڇر'];

    moment.defineLocale('sd', {
        months: months$8,
        monthsShort: months$8,
        weekdays: days,
        weekdaysShort: days,
        weekdaysMin: days,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd، D MMMM YYYY HH:mm',
        },
        meridiemParse: /صبح|شام/,
        isPM: function (input) {
            return 'شام' === input;
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'صبح';
            }
            return 'شام';
        },
        calendar: {
            sameDay: '[اڄ] LT',
            nextDay: '[سڀاڻي] LT',
            nextWeek: 'dddd [اڳين هفتي تي] LT',
            lastDay: '[ڪالهه] LT',
            lastWeek: '[گزريل هفتي] dddd [تي] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s پوء',
            past: '%s اڳ',
            s: 'چند سيڪنڊ',
            ss: '%d سيڪنڊ',
            m: 'هڪ منٽ',
            mm: '%d منٽ',
            h: 'هڪ ڪلاڪ',
            hh: '%d ڪلاڪ',
            d: 'هڪ ڏينهن',
            dd: '%d ڏينهن',
            M: 'هڪ مهينو',
            MM: '%d مهينا',
            y: 'هڪ سال',
            yy: '%d سال',
        },
        preparse: function (string) {
            return string.replace(/،/g, ',');
        },
        postformat: function (string) {
            return string.replace(/,/g, '،');
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('se', {
        months: 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split(
            '_'
        ),
        monthsShort:
            'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'),
        weekdays:
            'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split(
                '_'
            ),
        weekdaysShort: 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'),
        weekdaysMin: 's_v_m_g_d_b_L'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'MMMM D. [b.] YYYY',
            LLL: 'MMMM D. [b.] YYYY [ti.] HH:mm',
            LLLL: 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm',
        },
        calendar: {
            sameDay: '[otne ti] LT',
            nextDay: '[ihttin ti] LT',
            nextWeek: 'dddd [ti] LT',
            lastDay: '[ikte ti] LT',
            lastWeek: '[ovddit] dddd [ti] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s geažes',
            past: 'maŋit %s',
            s: 'moadde sekunddat',
            ss: '%d sekunddat',
            m: 'okta minuhta',
            mm: '%d minuhtat',
            h: 'okta diimmu',
            hh: '%d diimmut',
            d: 'okta beaivi',
            dd: '%d beaivvit',
            M: 'okta mánnu',
            MM: '%d mánut',
            y: 'okta jahki',
            yy: '%d jagit',
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    /*jshint -W100*/
    moment.defineLocale('si', {
        months: 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split(
            '_'
        ),
        monthsShort: 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split(
            '_'
        ),
        weekdays:
            'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split(
                '_'
            ),
        weekdaysShort: 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'),
        weekdaysMin: 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'a h:mm',
            LTS: 'a h:mm:ss',
            L: 'YYYY/MM/DD',
            LL: 'YYYY MMMM D',
            LLL: 'YYYY MMMM D, a h:mm',
            LLLL: 'YYYY MMMM D [වැනි] dddd, a h:mm:ss',
        },
        calendar: {
            sameDay: '[අද] LT[ට]',
            nextDay: '[හෙට] LT[ට]',
            nextWeek: 'dddd LT[ට]',
            lastDay: '[ඊයේ] LT[ට]',
            lastWeek: '[පසුගිය] dddd LT[ට]',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%sකින්',
            past: '%sකට පෙර',
            s: 'තත්පර කිහිපය',
            ss: 'තත්පර %d',
            m: 'මිනිත්තුව',
            mm: 'මිනිත්තු %d',
            h: 'පැය',
            hh: 'පැය %d',
            d: 'දිනය',
            dd: 'දින %d',
            M: 'මාසය',
            MM: 'මාස %d',
            y: 'වසර',
            yy: 'වසර %d',
        },
        dayOfMonthOrdinalParse: /\d{1,2} වැනි/,
        ordinal: function (number) {
            return number + ' වැනි';
        },
        meridiemParse: /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./,
        isPM: function (input) {
            return input === 'ප.ව.' || input === 'පස් වරු';
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours > 11) {
                return isLower ? 'ප.ව.' : 'පස් වරු';
            } else {
                return isLower ? 'පෙ.ව.' : 'පෙර වරු';
            }
        },
    });

    //! moment.js locale configuration

    var months$9 =
            'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split(
                '_'
            ),
        monthsShort$7 = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_');
    function plural$5(n) {
        return n > 1 && n < 5;
    }
    function translate$9(number, withoutSuffix, key, isFuture) {
        var result = number + ' ';
        switch (key) {
            case 's': // a few seconds / in a few seconds / a few seconds ago
                return withoutSuffix || isFuture ? 'pár sekúnd' : 'pár sekundami';
            case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago
                if (withoutSuffix || isFuture) {
                    return result + (plural$5(number) ? 'sekundy' : 'sekúnd');
                } else {
                    return result + 'sekundami';
                }
            case 'm': // a minute / in a minute / a minute ago
                return withoutSuffix ? 'minúta' : isFuture ? 'minútu' : 'minútou';
            case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
                if (withoutSuffix || isFuture) {
                    return result + (plural$5(number) ? 'minúty' : 'minút');
                } else {
                    return result + 'minútami';
                }
            case 'h': // an hour / in an hour / an hour ago
                return withoutSuffix ? 'hodina' : isFuture ? 'hodinu' : 'hodinou';
            case 'hh': // 9 hours / in 9 hours / 9 hours ago
                if (withoutSuffix || isFuture) {
                    return result + (plural$5(number) ? 'hodiny' : 'hodín');
                } else {
                    return result + 'hodinami';
                }
            case 'd': // a day / in a day / a day ago
                return withoutSuffix || isFuture ? 'deň' : 'dňom';
            case 'dd': // 9 days / in 9 days / 9 days ago
                if (withoutSuffix || isFuture) {
                    return result + (plural$5(number) ? 'dni' : 'dní');
                } else {
                    return result + 'dňami';
                }
            case 'M': // a month / in a month / a month ago
                return withoutSuffix || isFuture ? 'mesiac' : 'mesiacom';
            case 'MM': // 9 months / in 9 months / 9 months ago
                if (withoutSuffix || isFuture) {
                    return result + (plural$5(number) ? 'mesiace' : 'mesiacov');
                } else {
                    return result + 'mesiacmi';
                }
            case 'y': // a year / in a year / a year ago
                return withoutSuffix || isFuture ? 'rok' : 'rokom';
            case 'yy': // 9 years / in 9 years / 9 years ago
                if (withoutSuffix || isFuture) {
                    return result + (plural$5(number) ? 'roky' : 'rokov');
                } else {
                    return result + 'rokmi';
                }
        }
    }

    moment.defineLocale('sk', {
        months: months$9,
        monthsShort: monthsShort$7,
        weekdays: 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'),
        weekdaysShort: 'ne_po_ut_st_št_pi_so'.split('_'),
        weekdaysMin: 'ne_po_ut_st_št_pi_so'.split('_'),
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY H:mm',
            LLLL: 'dddd D. MMMM YYYY H:mm',
        },
        calendar: {
            sameDay: '[dnes o] LT',
            nextDay: '[zajtra o] LT',
            nextWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[v nedeľu o] LT';
                    case 1:
                    case 2:
                        return '[v] dddd [o] LT';
                    case 3:
                        return '[v stredu o] LT';
                    case 4:
                        return '[vo štvrtok o] LT';
                    case 5:
                        return '[v piatok o] LT';
                    case 6:
                        return '[v sobotu o] LT';
                }
            },
            lastDay: '[včera o] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[minulú nedeľu o] LT';
                    case 1:
                    case 2:
                        return '[minulý] dddd [o] LT';
                    case 3:
                        return '[minulú stredu o] LT';
                    case 4:
                    case 5:
                        return '[minulý] dddd [o] LT';
                    case 6:
                        return '[minulú sobotu o] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'za %s',
            past: 'pred %s',
            s: translate$9,
            ss: translate$9,
            m: translate$9,
            mm: translate$9,
            h: translate$9,
            hh: translate$9,
            d: translate$9,
            dd: translate$9,
            M: translate$9,
            MM: translate$9,
            y: translate$9,
            yy: translate$9,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function processRelativeTime$7(number, withoutSuffix, key, isFuture) {
        var result = number + ' ';
        switch (key) {
            case 's':
                return withoutSuffix || isFuture
                    ? 'nekaj sekund'
                    : 'nekaj sekundami';
            case 'ss':
                if (number === 1) {
                    result += withoutSuffix ? 'sekundo' : 'sekundi';
                } else if (number === 2) {
                    result += withoutSuffix || isFuture ? 'sekundi' : 'sekundah';
                } else if (number < 5) {
                    result += withoutSuffix || isFuture ? 'sekunde' : 'sekundah';
                } else {
                    result += 'sekund';
                }
                return result;
            case 'm':
                return withoutSuffix ? 'ena minuta' : 'eno minuto';
            case 'mm':
                if (number === 1) {
                    result += withoutSuffix ? 'minuta' : 'minuto';
                } else if (number === 2) {
                    result += withoutSuffix || isFuture ? 'minuti' : 'minutama';
                } else if (number < 5) {
                    result += withoutSuffix || isFuture ? 'minute' : 'minutami';
                } else {
                    result += withoutSuffix || isFuture ? 'minut' : 'minutami';
                }
                return result;
            case 'h':
                return withoutSuffix ? 'ena ura' : 'eno uro';
            case 'hh':
                if (number === 1) {
                    result += withoutSuffix ? 'ura' : 'uro';
                } else if (number === 2) {
                    result += withoutSuffix || isFuture ? 'uri' : 'urama';
                } else if (number < 5) {
                    result += withoutSuffix || isFuture ? 'ure' : 'urami';
                } else {
                    result += withoutSuffix || isFuture ? 'ur' : 'urami';
                }
                return result;
            case 'd':
                return withoutSuffix || isFuture ? 'en dan' : 'enim dnem';
            case 'dd':
                if (number === 1) {
                    result += withoutSuffix || isFuture ? 'dan' : 'dnem';
                } else if (number === 2) {
                    result += withoutSuffix || isFuture ? 'dni' : 'dnevoma';
                } else {
                    result += withoutSuffix || isFuture ? 'dni' : 'dnevi';
                }
                return result;
            case 'M':
                return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem';
            case 'MM':
                if (number === 1) {
                    result += withoutSuffix || isFuture ? 'mesec' : 'mesecem';
                } else if (number === 2) {
                    result += withoutSuffix || isFuture ? 'meseca' : 'mesecema';
                } else if (number < 5) {
                    result += withoutSuffix || isFuture ? 'mesece' : 'meseci';
                } else {
                    result += withoutSuffix || isFuture ? 'mesecev' : 'meseci';
                }
                return result;
            case 'y':
                return withoutSuffix || isFuture ? 'eno leto' : 'enim letom';
            case 'yy':
                if (number === 1) {
                    result += withoutSuffix || isFuture ? 'leto' : 'letom';
                } else if (number === 2) {
                    result += withoutSuffix || isFuture ? 'leti' : 'letoma';
                } else if (number < 5) {
                    result += withoutSuffix || isFuture ? 'leta' : 'leti';
                } else {
                    result += withoutSuffix || isFuture ? 'let' : 'leti';
                }
                return result;
        }
    }

    moment.defineLocale('sl', {
        months: 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split(
            '_'
        ),
        monthsShort:
            'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'),
        weekdaysShort: 'ned._pon._tor._sre._čet._pet._sob.'.split('_'),
        weekdaysMin: 'ne_po_to_sr_če_pe_so'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD. MM. YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY H:mm',
            LLLL: 'dddd, D. MMMM YYYY H:mm',
        },
        calendar: {
            sameDay: '[danes ob] LT',
            nextDay: '[jutri ob] LT',

            nextWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[v] [nedeljo] [ob] LT';
                    case 3:
                        return '[v] [sredo] [ob] LT';
                    case 6:
                        return '[v] [soboto] [ob] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[v] dddd [ob] LT';
                }
            },
            lastDay: '[včeraj ob] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[prejšnjo] [nedeljo] [ob] LT';
                    case 3:
                        return '[prejšnjo] [sredo] [ob] LT';
                    case 6:
                        return '[prejšnjo] [soboto] [ob] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[prejšnji] dddd [ob] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'čez %s',
            past: 'pred %s',
            s: processRelativeTime$7,
            ss: processRelativeTime$7,
            m: processRelativeTime$7,
            mm: processRelativeTime$7,
            h: processRelativeTime$7,
            hh: processRelativeTime$7,
            d: processRelativeTime$7,
            dd: processRelativeTime$7,
            M: processRelativeTime$7,
            MM: processRelativeTime$7,
            y: processRelativeTime$7,
            yy: processRelativeTime$7,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('sq', {
        months: 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split(
            '_'
        ),
        monthsShort: 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'),
        weekdays: 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split(
            '_'
        ),
        weekdaysShort: 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'),
        weekdaysMin: 'D_H_Ma_Më_E_P_Sh'.split('_'),
        weekdaysParseExact: true,
        meridiemParse: /PD|MD/,
        isPM: function (input) {
            return input.charAt(0) === 'M';
        },
        meridiem: function (hours, minutes, isLower) {
            return hours < 12 ? 'PD' : 'MD';
        },
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Sot në] LT',
            nextDay: '[Nesër në] LT',
            nextWeek: 'dddd [në] LT',
            lastDay: '[Dje në] LT',
            lastWeek: 'dddd [e kaluar në] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'në %s',
            past: '%s më parë',
            s: 'disa sekonda',
            ss: '%d sekonda',
            m: 'një minutë',
            mm: '%d minuta',
            h: 'një orë',
            hh: '%d orë',
            d: 'një ditë',
            dd: '%d ditë',
            M: 'një muaj',
            MM: '%d muaj',
            y: 'një vit',
            yy: '%d vite',
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var translator$1 = {
        words: {
            //Different grammatical cases
            ss: ['секунда', 'секунде', 'секунди'],
            m: ['један минут', 'једног минута'],
            mm: ['минут', 'минута', 'минута'],
            h: ['један сат', 'једног сата'],
            hh: ['сат', 'сата', 'сати'],
            d: ['један дан', 'једног дана'],
            dd: ['дан', 'дана', 'дана'],
            M: ['један месец', 'једног месеца'],
            MM: ['месец', 'месеца', 'месеци'],
            y: ['једну годину', 'једне године'],
            yy: ['годину', 'године', 'година'],
        },
        correctGrammaticalCase: function (number, wordKey) {
            if (
                number % 10 >= 1 &&
                number % 10 <= 4 &&
                (number % 100 < 10 || number % 100 >= 20)
            ) {
                return number % 10 === 1 ? wordKey[0] : wordKey[1];
            }
            return wordKey[2];
        },
        translate: function (number, withoutSuffix, key, isFuture) {
            var wordKey = translator$1.words[key],
                word;

            if (key.length === 1) {
                // Nominativ
                if (key === 'y' && withoutSuffix) return 'једна година';
                return isFuture || withoutSuffix ? wordKey[0] : wordKey[1];
            }

            word = translator$1.correctGrammaticalCase(number, wordKey);
            // Nominativ
            if (key === 'yy' && withoutSuffix && word === 'годину') {
                return number + ' година';
            }

            return number + ' ' + word;
        },
    };

    moment.defineLocale('sr-cyrl', {
        months: 'јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар'.split(
            '_'
        ),
        monthsShort:
            'јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.'.split('_'),
        monthsParseExact: true,
        weekdays: 'недеља_понедељак_уторак_среда_четвртак_петак_субота'.split('_'),
        weekdaysShort: 'нед._пон._уто._сре._чет._пет._суб.'.split('_'),
        weekdaysMin: 'не_по_ут_ср_че_пе_су'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'D. M. YYYY.',
            LL: 'D. MMMM YYYY.',
            LLL: 'D. MMMM YYYY. H:mm',
            LLLL: 'dddd, D. MMMM YYYY. H:mm',
        },
        calendar: {
            sameDay: '[данас у] LT',
            nextDay: '[сутра у] LT',
            nextWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[у] [недељу] [у] LT';
                    case 3:
                        return '[у] [среду] [у] LT';
                    case 6:
                        return '[у] [суботу] [у] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[у] dddd [у] LT';
                }
            },
            lastDay: '[јуче у] LT',
            lastWeek: function () {
                var lastWeekDays = [
                    '[прошле] [недеље] [у] LT',
                    '[прошлог] [понедељка] [у] LT',
                    '[прошлог] [уторка] [у] LT',
                    '[прошле] [среде] [у] LT',
                    '[прошлог] [четвртка] [у] LT',
                    '[прошлог] [петка] [у] LT',
                    '[прошле] [суботе] [у] LT',
                ];
                return lastWeekDays[this.day()];
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'за %s',
            past: 'пре %s',
            s: 'неколико секунди',
            ss: translator$1.translate,
            m: translator$1.translate,
            mm: translator$1.translate,
            h: translator$1.translate,
            hh: translator$1.translate,
            d: translator$1.translate,
            dd: translator$1.translate,
            M: translator$1.translate,
            MM: translator$1.translate,
            y: translator$1.translate,
            yy: translator$1.translate,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 1st is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var translator$2 = {
        words: {
            //Different grammatical cases
            ss: ['sekunda', 'sekunde', 'sekundi'],
            m: ['jedan minut', 'jednog minuta'],
            mm: ['minut', 'minuta', 'minuta'],
            h: ['jedan sat', 'jednog sata'],
            hh: ['sat', 'sata', 'sati'],
            d: ['jedan dan', 'jednog dana'],
            dd: ['dan', 'dana', 'dana'],
            M: ['jedan mesec', 'jednog meseca'],
            MM: ['mesec', 'meseca', 'meseci'],
            y: ['jednu godinu', 'jedne godine'],
            yy: ['godinu', 'godine', 'godina'],
        },
        correctGrammaticalCase: function (number, wordKey) {
            if (
                number % 10 >= 1 &&
                number % 10 <= 4 &&
                (number % 100 < 10 || number % 100 >= 20)
            ) {
                return number % 10 === 1 ? wordKey[0] : wordKey[1];
            }
            return wordKey[2];
        },
        translate: function (number, withoutSuffix, key, isFuture) {
            var wordKey = translator$2.words[key],
                word;

            if (key.length === 1) {
                // Nominativ
                if (key === 'y' && withoutSuffix) return 'jedna godina';
                return isFuture || withoutSuffix ? wordKey[0] : wordKey[1];
            }

            word = translator$2.correctGrammaticalCase(number, wordKey);
            // Nominativ
            if (key === 'yy' && withoutSuffix && word === 'godinu') {
                return number + ' godina';
            }

            return number + ' ' + word;
        },
    };

    moment.defineLocale('sr', {
        months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split(
            '_'
        ),
        monthsShort:
            'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),
        monthsParseExact: true,
        weekdays: 'nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota'.split(
            '_'
        ),
        weekdaysShort: 'ned._pon._uto._sre._čet._pet._sub.'.split('_'),
        weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'D. M. YYYY.',
            LL: 'D. MMMM YYYY.',
            LLL: 'D. MMMM YYYY. H:mm',
            LLLL: 'dddd, D. MMMM YYYY. H:mm',
        },
        calendar: {
            sameDay: '[danas u] LT',
            nextDay: '[sutra u] LT',
            nextWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[u] [nedelju] [u] LT';
                    case 3:
                        return '[u] [sredu] [u] LT';
                    case 6:
                        return '[u] [subotu] [u] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[u] dddd [u] LT';
                }
            },
            lastDay: '[juče u] LT',
            lastWeek: function () {
                var lastWeekDays = [
                    '[prošle] [nedelje] [u] LT',
                    '[prošlog] [ponedeljka] [u] LT',
                    '[prošlog] [utorka] [u] LT',
                    '[prošle] [srede] [u] LT',
                    '[prošlog] [četvrtka] [u] LT',
                    '[prošlog] [petka] [u] LT',
                    '[prošle] [subote] [u] LT',
                ];
                return lastWeekDays[this.day()];
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'za %s',
            past: 'pre %s',
            s: 'nekoliko sekundi',
            ss: translator$2.translate,
            m: translator$2.translate,
            mm: translator$2.translate,
            h: translator$2.translate,
            hh: translator$2.translate,
            d: translator$2.translate,
            dd: translator$2.translate,
            M: translator$2.translate,
            MM: translator$2.translate,
            y: translator$2.translate,
            yy: translator$2.translate,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('ss', {
        months: "Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split(
            '_'
        ),
        monthsShort: 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'),
        weekdays:
            'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split(
                '_'
            ),
        weekdaysShort: 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'),
        weekdaysMin: 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'h:mm A',
            LTS: 'h:mm:ss A',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY h:mm A',
            LLLL: 'dddd, D MMMM YYYY h:mm A',
        },
        calendar: {
            sameDay: '[Namuhla nga] LT',
            nextDay: '[Kusasa nga] LT',
            nextWeek: 'dddd [nga] LT',
            lastDay: '[Itolo nga] LT',
            lastWeek: 'dddd [leliphelile] [nga] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'nga %s',
            past: 'wenteka nga %s',
            s: 'emizuzwana lomcane',
            ss: '%d mzuzwana',
            m: 'umzuzu',
            mm: '%d emizuzu',
            h: 'lihora',
            hh: '%d emahora',
            d: 'lilanga',
            dd: '%d emalanga',
            M: 'inyanga',
            MM: '%d tinyanga',
            y: 'umnyaka',
            yy: '%d iminyaka',
        },
        meridiemParse: /ekuseni|emini|entsambama|ebusuku/,
        meridiem: function (hours, minutes, isLower) {
            if (hours < 11) {
                return 'ekuseni';
            } else if (hours < 15) {
                return 'emini';
            } else if (hours < 19) {
                return 'entsambama';
            } else {
                return 'ebusuku';
            }
        },
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'ekuseni') {
                return hour;
            } else if (meridiem === 'emini') {
                return hour >= 11 ? hour : hour + 12;
            } else if (meridiem === 'entsambama' || meridiem === 'ebusuku') {
                if (hour === 0) {
                    return 0;
                }
                return hour + 12;
            }
        },
        dayOfMonthOrdinalParse: /\d{1,2}/,
        ordinal: '%d',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('sv', {
        months: 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split(
            '_'
        ),
        monthsShort: 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
        weekdays: 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'),
        weekdaysShort: 'sön_mån_tis_ons_tor_fre_lör'.split('_'),
        weekdaysMin: 'sö_må_ti_on_to_fr_lö'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY-MM-DD',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY [kl.] HH:mm',
            LLLL: 'dddd D MMMM YYYY [kl.] HH:mm',
            lll: 'D MMM YYYY HH:mm',
            llll: 'ddd D MMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Idag] LT',
            nextDay: '[Imorgon] LT',
            lastDay: '[Igår] LT',
            nextWeek: '[På] dddd LT',
            lastWeek: '[I] dddd[s] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'om %s',
            past: 'för %s sedan',
            s: 'några sekunder',
            ss: '%d sekunder',
            m: 'en minut',
            mm: '%d minuter',
            h: 'en timme',
            hh: '%d timmar',
            d: 'en dag',
            dd: '%d dagar',
            M: 'en månad',
            MM: '%d månader',
            y: 'ett år',
            yy: '%d år',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(\:e|\:a)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? ':e'
                        : b === 1
                        ? ':a'
                        : b === 2
                        ? ':a'
                        : b === 3
                        ? ':e'
                        : ':e';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('sw', {
        months: 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'),
        weekdays:
            'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split(
                '_'
            ),
        weekdaysShort: 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'),
        weekdaysMin: 'J2_J3_J4_J5_Al_Ij_J1'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'hh:mm A',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[leo saa] LT',
            nextDay: '[kesho saa] LT',
            nextWeek: '[wiki ijayo] dddd [saat] LT',
            lastDay: '[jana] LT',
            lastWeek: '[wiki iliyopita] dddd [saat] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s baadaye',
            past: 'tokea %s',
            s: 'hivi punde',
            ss: 'sekunde %d',
            m: 'dakika moja',
            mm: 'dakika %d',
            h: 'saa limoja',
            hh: 'masaa %d',
            d: 'siku moja',
            dd: 'siku %d',
            M: 'mwezi mmoja',
            MM: 'miezi %d',
            y: 'mwaka mmoja',
            yy: 'miaka %d',
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var symbolMap$g = {
            1: '௧',
            2: '௨',
            3: '௩',
            4: '௪',
            5: '௫',
            6: '௬',
            7: '௭',
            8: '௮',
            9: '௯',
            0: '௦',
        },
        numberMap$f = {
            '௧': '1',
            '௨': '2',
            '௩': '3',
            '௪': '4',
            '௫': '5',
            '௬': '6',
            '௭': '7',
            '௮': '8',
            '௯': '9',
            '௦': '0',
        };

    moment.defineLocale('ta', {
        months: 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split(
            '_'
        ),
        monthsShort:
            'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split(
                '_'
            ),
        weekdays:
            'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split(
                '_'
            ),
        weekdaysShort: 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split(
            '_'
        ),
        weekdaysMin: 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, HH:mm',
            LLLL: 'dddd, D MMMM YYYY, HH:mm',
        },
        calendar: {
            sameDay: '[இன்று] LT',
            nextDay: '[நாளை] LT',
            nextWeek: 'dddd, LT',
            lastDay: '[நேற்று] LT',
            lastWeek: '[கடந்த வாரம்] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s இல்',
            past: '%s முன்',
            s: 'ஒரு சில விநாடிகள்',
            ss: '%d விநாடிகள்',
            m: 'ஒரு நிமிடம்',
            mm: '%d நிமிடங்கள்',
            h: 'ஒரு மணி நேரம்',
            hh: '%d மணி நேரம்',
            d: 'ஒரு நாள்',
            dd: '%d நாட்கள்',
            M: 'ஒரு மாதம்',
            MM: '%d மாதங்கள்',
            y: 'ஒரு வருடம்',
            yy: '%d ஆண்டுகள்',
        },
        dayOfMonthOrdinalParse: /\d{1,2}வது/,
        ordinal: function (number) {
            return number + 'வது';
        },
        preparse: function (string) {
            return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) {
                return numberMap$f[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap$g[match];
            });
        },
        // refer http://ta.wikipedia.org/s/1er1
        meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/,
        meridiem: function (hour, minute, isLower) {
            if (hour < 2) {
                return ' யாமம்';
            } else if (hour < 6) {
                return ' வைகறை'; // வைகறை
            } else if (hour < 10) {
                return ' காலை'; // காலை
            } else if (hour < 14) {
                return ' நண்பகல்'; // நண்பகல்
            } else if (hour < 18) {
                return ' எற்பாடு'; // எற்பாடு
            } else if (hour < 22) {
                return ' மாலை'; // மாலை
            } else {
                return ' யாமம்';
            }
        },
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'யாமம்') {
                return hour < 2 ? hour : hour + 12;
            } else if (meridiem === 'வைகறை' || meridiem === 'காலை') {
                return hour;
            } else if (meridiem === 'நண்பகல்') {
                return hour >= 10 ? hour : hour + 12;
            } else {
                return hour + 12;
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('te', {
        months: 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జులై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split(
            '_'
        ),
        monthsShort:
            'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జులై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays:
            'ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం'.split(
                '_'
            ),
        weekdaysShort: 'ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని'.split('_'),
        weekdaysMin: 'ఆ_సో_మం_బు_గు_శు_శ'.split('_'),
        longDateFormat: {
            LT: 'A h:mm',
            LTS: 'A h:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm',
            LLLL: 'dddd, D MMMM YYYY, A h:mm',
        },
        calendar: {
            sameDay: '[నేడు] LT',
            nextDay: '[రేపు] LT',
            nextWeek: 'dddd, LT',
            lastDay: '[నిన్న] LT',
            lastWeek: '[గత] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s లో',
            past: '%s క్రితం',
            s: 'కొన్ని క్షణాలు',
            ss: '%d సెకన్లు',
            m: 'ఒక నిమిషం',
            mm: '%d నిమిషాలు',
            h: 'ఒక గంట',
            hh: '%d గంటలు',
            d: 'ఒక రోజు',
            dd: '%d రోజులు',
            M: 'ఒక నెల',
            MM: '%d నెలలు',
            y: 'ఒక సంవత్సరం',
            yy: '%d సంవత్సరాలు',
        },
        dayOfMonthOrdinalParse: /\d{1,2}వ/,
        ordinal: '%dవ',
        meridiemParse: /రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'రాత్రి') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'ఉదయం') {
                return hour;
            } else if (meridiem === 'మధ్యాహ్నం') {
                return hour >= 10 ? hour : hour + 12;
            } else if (meridiem === 'సాయంత్రం') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'రాత్రి';
            } else if (hour < 10) {
                return 'ఉదయం';
            } else if (hour < 17) {
                return 'మధ్యాహ్నం';
            } else if (hour < 20) {
                return 'సాయంత్రం';
            } else {
                return 'రాత్రి';
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('tet', {
        months: 'Janeiru_Fevereiru_Marsu_Abril_Maiu_Juñu_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru'.split(
            '_'
        ),
        monthsShort: 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),
        weekdays: 'Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu'.split('_'),
        weekdaysShort: 'Dom_Seg_Ters_Kua_Kint_Sest_Sab'.split('_'),
        weekdaysMin: 'Do_Seg_Te_Ku_Ki_Ses_Sa'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Ohin iha] LT',
            nextDay: '[Aban iha] LT',
            nextWeek: 'dddd [iha] LT',
            lastDay: '[Horiseik iha] LT',
            lastWeek: 'dddd [semana kotuk] [iha] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'iha %s',
            past: '%s liuba',
            s: 'segundu balun',
            ss: 'segundu %d',
            m: 'minutu ida',
            mm: 'minutu %d',
            h: 'oras ida',
            hh: 'oras %d',
            d: 'loron ida',
            dd: 'loron %d',
            M: 'fulan ida',
            MM: 'fulan %d',
            y: 'tinan ida',
            yy: 'tinan %d',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var suffixes$3 = {
        0: '-ум',
        1: '-ум',
        2: '-юм',
        3: '-юм',
        4: '-ум',
        5: '-ум',
        6: '-ум',
        7: '-ум',
        8: '-ум',
        9: '-ум',
        10: '-ум',
        12: '-ум',
        13: '-ум',
        20: '-ум',
        30: '-юм',
        40: '-ум',
        50: '-ум',
        60: '-ум',
        70: '-ум',
        80: '-ум',
        90: '-ум',
        100: '-ум',
    };

    moment.defineLocale('tg', {
        months: {
            format: 'январи_феврали_марти_апрели_майи_июни_июли_августи_сентябри_октябри_ноябри_декабри'.split(
                '_'
            ),
            standalone:
                'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split(
                    '_'
                ),
        },
        monthsShort: 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),
        weekdays: 'якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе'.split(
            '_'
        ),
        weekdaysShort: 'яшб_дшб_сшб_чшб_пшб_ҷум_шнб'.split('_'),
        weekdaysMin: 'яш_дш_сш_чш_пш_ҷм_шб'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Имрӯз соати] LT',
            nextDay: '[Фардо соати] LT',
            lastDay: '[Дирӯз соати] LT',
            nextWeek: 'dddd[и] [ҳафтаи оянда соати] LT',
            lastWeek: 'dddd[и] [ҳафтаи гузашта соати] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'баъди %s',
            past: '%s пеш',
            s: 'якчанд сония',
            m: 'як дақиқа',
            mm: '%d дақиқа',
            h: 'як соат',
            hh: '%d соат',
            d: 'як рӯз',
            dd: '%d рӯз',
            M: 'як моҳ',
            MM: '%d моҳ',
            y: 'як сол',
            yy: '%d сол',
        },
        meridiemParse: /шаб|субҳ|рӯз|бегоҳ/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'шаб') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'субҳ') {
                return hour;
            } else if (meridiem === 'рӯз') {
                return hour >= 11 ? hour : hour + 12;
            } else if (meridiem === 'бегоҳ') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'шаб';
            } else if (hour < 11) {
                return 'субҳ';
            } else if (hour < 16) {
                return 'рӯз';
            } else if (hour < 19) {
                return 'бегоҳ';
            } else {
                return 'шаб';
            }
        },
        dayOfMonthOrdinalParse: /\d{1,2}-(ум|юм)/,
        ordinal: function (number) {
            var a = number % 10,
                b = number >= 100 ? 100 : null;
            return number + (suffixes$3[number] || suffixes$3[a] || suffixes$3[b]);
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 1th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('th', {
        months: 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split(
            '_'
        ),
        monthsShort:
            'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'),
        weekdaysShort: 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference
        weekdaysMin: 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY เวลา H:mm',
            LLLL: 'วันddddที่ D MMMM YYYY เวลา H:mm',
        },
        meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/,
        isPM: function (input) {
            return input === 'หลังเที่ยง';
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'ก่อนเที่ยง';
            } else {
                return 'หลังเที่ยง';
            }
        },
        calendar: {
            sameDay: '[วันนี้ เวลา] LT',
            nextDay: '[พรุ่งนี้ เวลา] LT',
            nextWeek: 'dddd[หน้า เวลา] LT',
            lastDay: '[เมื่อวานนี้ เวลา] LT',
            lastWeek: '[วัน]dddd[ที่แล้ว เวลา] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'อีก %s',
            past: '%sที่แล้ว',
            s: 'ไม่กี่วินาที',
            ss: '%d วินาที',
            m: '1 นาที',
            mm: '%d นาที',
            h: '1 ชั่วโมง',
            hh: '%d ชั่วโมง',
            d: '1 วัน',
            dd: '%d วัน',
            w: '1 สัปดาห์',
            ww: '%d สัปดาห์',
            M: '1 เดือน',
            MM: '%d เดือน',
            y: '1 ปี',
            yy: '%d ปี',
        },
    });

    //! moment.js locale configuration

    var suffixes$4 = {
        1: "'inji",
        5: "'inji",
        8: "'inji",
        70: "'inji",
        80: "'inji",
        2: "'nji",
        7: "'nji",
        20: "'nji",
        50: "'nji",
        3: "'ünji",
        4: "'ünji",
        100: "'ünji",
        6: "'njy",
        9: "'unjy",
        10: "'unjy",
        30: "'unjy",
        60: "'ynjy",
        90: "'ynjy",
    };

    moment.defineLocale('tk', {
        months: 'Ýanwar_Fewral_Mart_Aprel_Maý_Iýun_Iýul_Awgust_Sentýabr_Oktýabr_Noýabr_Dekabr'.split(
            '_'
        ),
        monthsShort: 'Ýan_Few_Mar_Apr_Maý_Iýn_Iýl_Awg_Sen_Okt_Noý_Dek'.split('_'),
        weekdays: 'Ýekşenbe_Duşenbe_Sişenbe_Çarşenbe_Penşenbe_Anna_Şenbe'.split(
            '_'
        ),
        weekdaysShort: 'Ýek_Duş_Siş_Çar_Pen_Ann_Şen'.split('_'),
        weekdaysMin: 'Ýk_Dş_Sş_Çr_Pn_An_Şn'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[bugün sagat] LT',
            nextDay: '[ertir sagat] LT',
            nextWeek: '[indiki] dddd [sagat] LT',
            lastDay: '[düýn] LT',
            lastWeek: '[geçen] dddd [sagat] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s soň',
            past: '%s öň',
            s: 'birnäçe sekunt',
            m: 'bir minut',
            mm: '%d minut',
            h: 'bir sagat',
            hh: '%d sagat',
            d: 'bir gün',
            dd: '%d gün',
            M: 'bir aý',
            MM: '%d aý',
            y: 'bir ýyl',
            yy: '%d ýyl',
        },
        ordinal: function (number, period) {
            switch (period) {
                case 'd':
                case 'D':
                case 'Do':
                case 'DD':
                    return number;
                default:
                    if (number === 0) {
                        // special case for zero
                        return number + "'unjy";
                    }
                    var a = number % 10,
                        b = (number % 100) - a,
                        c = number >= 100 ? 100 : null;
                    return number + (suffixes$4[a] || suffixes$4[b] || suffixes$4[c]);
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('tl-ph', {
        months: 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split(
            '_'
        ),
        monthsShort: 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),
        weekdays: 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split(
            '_'
        ),
        weekdaysShort: 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'),
        weekdaysMin: 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'MM/D/YYYY',
            LL: 'MMMM D, YYYY',
            LLL: 'MMMM D, YYYY HH:mm',
            LLLL: 'dddd, MMMM DD, YYYY HH:mm',
        },
        calendar: {
            sameDay: 'LT [ngayong araw]',
            nextDay: '[Bukas ng] LT',
            nextWeek: 'LT [sa susunod na] dddd',
            lastDay: 'LT [kahapon]',
            lastWeek: 'LT [noong nakaraang] dddd',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'sa loob ng %s',
            past: '%s ang nakalipas',
            s: 'ilang segundo',
            ss: '%d segundo',
            m: 'isang minuto',
            mm: '%d minuto',
            h: 'isang oras',
            hh: '%d oras',
            d: 'isang araw',
            dd: '%d araw',
            M: 'isang buwan',
            MM: '%d buwan',
            y: 'isang taon',
            yy: '%d taon',
        },
        dayOfMonthOrdinalParse: /\d{1,2}/,
        ordinal: function (number) {
            return number;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var numbersNouns = 'pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut'.split('_');

    function translateFuture(output) {
        var time = output;
        time =
            output.indexOf('jaj') !== -1
                ? time.slice(0, -3) + 'leS'
                : output.indexOf('jar') !== -1
                ? time.slice(0, -3) + 'waQ'
                : output.indexOf('DIS') !== -1
                ? time.slice(0, -3) + 'nem'
                : time + ' pIq';
        return time;
    }

    function translatePast(output) {
        var time = output;
        time =
            output.indexOf('jaj') !== -1
                ? time.slice(0, -3) + 'Hu’'
                : output.indexOf('jar') !== -1
                ? time.slice(0, -3) + 'wen'
                : output.indexOf('DIS') !== -1
                ? time.slice(0, -3) + 'ben'
                : time + ' ret';
        return time;
    }

    function translate$a(number, withoutSuffix, string, isFuture) {
        var numberNoun = numberAsNoun(number);
        switch (string) {
            case 'ss':
                return numberNoun + ' lup';
            case 'mm':
                return numberNoun + ' tup';
            case 'hh':
                return numberNoun + ' rep';
            case 'dd':
                return numberNoun + ' jaj';
            case 'MM':
                return numberNoun + ' jar';
            case 'yy':
                return numberNoun + ' DIS';
        }
    }

    function numberAsNoun(number) {
        var hundred = Math.floor((number % 1000) / 100),
            ten = Math.floor((number % 100) / 10),
            one = number % 10,
            word = '';
        if (hundred > 0) {
            word += numbersNouns[hundred] + 'vatlh';
        }
        if (ten > 0) {
            word += (word !== '' ? ' ' : '') + numbersNouns[ten] + 'maH';
        }
        if (one > 0) {
            word += (word !== '' ? ' ' : '') + numbersNouns[one];
        }
        return word === '' ? 'pagh' : word;
    }

    moment.defineLocale('tlh', {
        months: 'tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’'.split(
            '_'
        ),
        monthsShort:
            'jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split(
            '_'
        ),
        weekdaysShort:
            'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),
        weekdaysMin:
            'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[DaHjaj] LT',
            nextDay: '[wa’leS] LT',
            nextWeek: 'LLL',
            lastDay: '[wa’Hu’] LT',
            lastWeek: 'LLL',
            sameElse: 'L',
        },
        relativeTime: {
            future: translateFuture,
            past: translatePast,
            s: 'puS lup',
            ss: translate$a,
            m: 'wa’ tup',
            mm: translate$a,
            h: 'wa’ rep',
            hh: translate$a,
            d: 'wa’ jaj',
            dd: translate$a,
            M: 'wa’ jar',
            MM: translate$a,
            y: 'wa’ DIS',
            yy: translate$a,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var suffixes$5 = {
        1: "'inci",
        5: "'inci",
        8: "'inci",
        70: "'inci",
        80: "'inci",
        2: "'nci",
        7: "'nci",
        20: "'nci",
        50: "'nci",
        3: "'üncü",
        4: "'üncü",
        100: "'üncü",
        6: "'ncı",
        9: "'uncu",
        10: "'uncu",
        30: "'uncu",
        60: "'ıncı",
        90: "'ıncı",
    };

    moment.defineLocale('tr', {
        months: 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split(
            '_'
        ),
        monthsShort: 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'),
        weekdays: 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split(
            '_'
        ),
        weekdaysShort: 'Paz_Pzt_Sal_Çar_Per_Cum_Cmt'.split('_'),
        weekdaysMin: 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'),
        meridiem: function (hours, minutes, isLower) {
            if (hours < 12) {
                return isLower ? 'öö' : 'ÖÖ';
            } else {
                return isLower ? 'ös' : 'ÖS';
            }
        },
        meridiemParse: /öö|ÖÖ|ös|ÖS/,
        isPM: function (input) {
            return input === 'ös' || input === 'ÖS';
        },
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[bugün saat] LT',
            nextDay: '[yarın saat] LT',
            nextWeek: '[gelecek] dddd [saat] LT',
            lastDay: '[dün] LT',
            lastWeek: '[geçen] dddd [saat] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s sonra',
            past: '%s önce',
            s: 'birkaç saniye',
            ss: '%d saniye',
            m: 'bir dakika',
            mm: '%d dakika',
            h: 'bir saat',
            hh: '%d saat',
            d: 'bir gün',
            dd: '%d gün',
            w: 'bir hafta',
            ww: '%d hafta',
            M: 'bir ay',
            MM: '%d ay',
            y: 'bir yıl',
            yy: '%d yıl',
        },
        ordinal: function (number, period) {
            switch (period) {
                case 'd':
                case 'D':
                case 'Do':
                case 'DD':
                    return number;
                default:
                    if (number === 0) {
                        // special case for zero
                        return number + "'ıncı";
                    }
                    var a = number % 10,
                        b = (number % 100) - a,
                        c = number >= 100 ? 100 : null;
                    return number + (suffixes$5[a] || suffixes$5[b] || suffixes$5[c]);
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    // After the year there should be a slash and the amount of years since December 26, 1979 in Roman numerals.
    // This is currently too difficult (maybe even impossible) to add.
    moment.defineLocale('tzl', {
        months: 'Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar'.split(
            '_'
        ),
        monthsShort: 'Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec'.split('_'),
        weekdays: 'Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi'.split('_'),
        weekdaysShort: 'Súl_Lún_Mai_Már_Xhú_Vié_Sát'.split('_'),
        weekdaysMin: 'Sú_Lú_Ma_Má_Xh_Vi_Sá'.split('_'),
        longDateFormat: {
            LT: 'HH.mm',
            LTS: 'HH.mm.ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM [dallas] YYYY',
            LLL: 'D. MMMM [dallas] YYYY HH.mm',
            LLLL: 'dddd, [li] D. MMMM [dallas] YYYY HH.mm',
        },
        meridiemParse: /d\'o|d\'a/i,
        isPM: function (input) {
            return "d'o" === input.toLowerCase();
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours > 11) {
                return isLower ? "d'o" : "D'O";
            } else {
                return isLower ? "d'a" : "D'A";
            }
        },
        calendar: {
            sameDay: '[oxhi à] LT',
            nextDay: '[demà à] LT',
            nextWeek: 'dddd [à] LT',
            lastDay: '[ieiri à] LT',
            lastWeek: '[sür el] dddd [lasteu à] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'osprei %s',
            past: 'ja%s',
            s: processRelativeTime$8,
            ss: processRelativeTime$8,
            m: processRelativeTime$8,
            mm: processRelativeTime$8,
            h: processRelativeTime$8,
            hh: processRelativeTime$8,
            d: processRelativeTime$8,
            dd: processRelativeTime$8,
            M: processRelativeTime$8,
            MM: processRelativeTime$8,
            y: processRelativeTime$8,
            yy: processRelativeTime$8,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    function processRelativeTime$8(number, withoutSuffix, key, isFuture) {
        var format = {
            s: ['viensas secunds', "'iensas secunds"],
            ss: [number + ' secunds', '' + number + ' secunds'],
            m: ["'n míut", "'iens míut"],
            mm: [number + ' míuts', '' + number + ' míuts'],
            h: ["'n þora", "'iensa þora"],
            hh: [number + ' þoras', '' + number + ' þoras'],
            d: ["'n ziua", "'iensa ziua"],
            dd: [number + ' ziuas', '' + number + ' ziuas'],
            M: ["'n mes", "'iens mes"],
            MM: [number + ' mesen', '' + number + ' mesen'],
            y: ["'n ar", "'iens ar"],
            yy: [number + ' ars', '' + number + ' ars'],
        };
        return isFuture
            ? format[key][0]
            : withoutSuffix
            ? format[key][0]
            : format[key][1];
    }

    //! moment.js locale configuration

    moment.defineLocale('tzm-latn', {
        months: 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split(
            '_'
        ),
        monthsShort:
            'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split(
                '_'
            ),
        weekdays: 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
        weekdaysShort: 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
        weekdaysMin: 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[asdkh g] LT',
            nextDay: '[aska g] LT',
            nextWeek: 'dddd [g] LT',
            lastDay: '[assant g] LT',
            lastWeek: 'dddd [g] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'dadkh s yan %s',
            past: 'yan %s',
            s: 'imik',
            ss: '%d imik',
            m: 'minuḍ',
            mm: '%d minuḍ',
            h: 'saɛa',
            hh: '%d tassaɛin',
            d: 'ass',
            dd: '%d ossan',
            M: 'ayowr',
            MM: '%d iyyirn',
            y: 'asgas',
            yy: '%d isgasn',
        },
        week: {
            dow: 6, // Saturday is the first day of the week.
            doy: 12, // The week that contains Jan 12th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('tzm', {
        months: 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split(
            '_'
        ),
        monthsShort:
            'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split(
                '_'
            ),
        weekdays: 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
        weekdaysShort: 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
        weekdaysMin: 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[ⴰⵙⴷⵅ ⴴ] LT',
            nextDay: '[ⴰⵙⴽⴰ ⴴ] LT',
            nextWeek: 'dddd [ⴴ] LT',
            lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT',
            lastWeek: 'dddd [ⴴ] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s',
            past: 'ⵢⴰⵏ %s',
            s: 'ⵉⵎⵉⴽ',
            ss: '%d ⵉⵎⵉⴽ',
            m: 'ⵎⵉⵏⵓⴺ',
            mm: '%d ⵎⵉⵏⵓⴺ',
            h: 'ⵙⴰⵄⴰ',
            hh: '%d ⵜⴰⵙⵙⴰⵄⵉⵏ',
            d: 'ⴰⵙⵙ',
            dd: '%d oⵙⵙⴰⵏ',
            M: 'ⴰⵢoⵓⵔ',
            MM: '%d ⵉⵢⵢⵉⵔⵏ',
            y: 'ⴰⵙⴳⴰⵙ',
            yy: '%d ⵉⵙⴳⴰⵙⵏ',
        },
        week: {
            dow: 6, // Saturday is the first day of the week.
            doy: 12, // The week that contains Jan 12th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('ug-cn', {
        months: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split(
            '_'
        ),
        monthsShort:
            'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split(
                '_'
            ),
        weekdays: 'يەكشەنبە_دۈشەنبە_سەيشەنبە_چارشەنبە_پەيشەنبە_جۈمە_شەنبە'.split(
            '_'
        ),
        weekdaysShort: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'),
        weekdaysMin: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY-MM-DD',
            LL: 'YYYY-يىلىM-ئاينىڭD-كۈنى',
            LLL: 'YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm',
            LLLL: 'dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm',
        },
        meridiemParse: /يېرىم كېچە|سەھەر|چۈشتىن بۇرۇن|چۈش|چۈشتىن كېيىن|كەچ/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (
                meridiem === 'يېرىم كېچە' ||
                meridiem === 'سەھەر' ||
                meridiem === 'چۈشتىن بۇرۇن'
            ) {
                return hour;
            } else if (meridiem === 'چۈشتىن كېيىن' || meridiem === 'كەچ') {
                return hour + 12;
            } else {
                return hour >= 11 ? hour : hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            var hm = hour * 100 + minute;
            if (hm < 600) {
                return 'يېرىم كېچە';
            } else if (hm < 900) {
                return 'سەھەر';
            } else if (hm < 1130) {
                return 'چۈشتىن بۇرۇن';
            } else if (hm < 1230) {
                return 'چۈش';
            } else if (hm < 1800) {
                return 'چۈشتىن كېيىن';
            } else {
                return 'كەچ';
            }
        },
        calendar: {
            sameDay: '[بۈگۈن سائەت] LT',
            nextDay: '[ئەتە سائەت] LT',
            nextWeek: '[كېلەركى] dddd [سائەت] LT',
            lastDay: '[تۆنۈگۈن] LT',
            lastWeek: '[ئالدىنقى] dddd [سائەت] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s كېيىن',
            past: '%s بۇرۇن',
            s: 'نەچچە سېكونت',
            ss: '%d سېكونت',
            m: 'بىر مىنۇت',
            mm: '%d مىنۇت',
            h: 'بىر سائەت',
            hh: '%d سائەت',
            d: 'بىر كۈن',
            dd: '%d كۈن',
            M: 'بىر ئاي',
            MM: '%d ئاي',
            y: 'بىر يىل',
            yy: '%d يىل',
        },

        dayOfMonthOrdinalParse: /\d{1,2}(-كۈنى|-ئاي|-ھەپتە)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'd':
                case 'D':
                case 'DDD':
                    return number + '-كۈنى';
                case 'w':
                case 'W':
                    return number + '-ھەپتە';
                default:
                    return number;
            }
        },
        preparse: function (string) {
            return string.replace(/،/g, ',');
        },
        postformat: function (string) {
            return string.replace(/,/g, '،');
        },
        week: {
            // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 1st is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function plural$6(word, num) {
        var forms = word.split('_');
        return num % 10 === 1 && num % 100 !== 11
            ? forms[0]
            : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20)
            ? forms[1]
            : forms[2];
    }
    function relativeTimeWithPlural$4(number, withoutSuffix, key) {
        var format = {
            ss: withoutSuffix ? 'секунда_секунди_секунд' : 'секунду_секунди_секунд',
            mm: withoutSuffix ? 'хвилина_хвилини_хвилин' : 'хвилину_хвилини_хвилин',
            hh: withoutSuffix ? 'година_години_годин' : 'годину_години_годин',
            dd: 'день_дні_днів',
            MM: 'місяць_місяці_місяців',
            yy: 'рік_роки_років',
        };
        if (key === 'm') {
            return withoutSuffix ? 'хвилина' : 'хвилину';
        } else if (key === 'h') {
            return withoutSuffix ? 'година' : 'годину';
        } else {
            return number + ' ' + plural$6(format[key], +number);
        }
    }
    function weekdaysCaseReplace(m, format) {
        var weekdays = {
                nominative:
                    'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split(
                        '_'
                    ),
                accusative:
                    'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split(
                        '_'
                    ),
                genitive:
                    'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split(
                        '_'
                    ),
            },
            nounCase;

        if (m === true) {
            return weekdays['nominative']
                .slice(1, 7)
                .concat(weekdays['nominative'].slice(0, 1));
        }
        if (!m) {
            return weekdays['nominative'];
        }

        nounCase = /(\[[ВвУу]\]) ?dddd/.test(format)
            ? 'accusative'
            : /\[?(?:минулої|наступної)? ?\] ?dddd/.test(format)
            ? 'genitive'
            : 'nominative';
        return weekdays[nounCase][m.day()];
    }
    function processHoursFunction(str) {
        return function () {
            return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT';
        };
    }

    moment.defineLocale('uk', {
        months: {
            format: 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split(
                '_'
            ),
            standalone:
                'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split(
                    '_'
                ),
        },
        monthsShort: 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split(
            '_'
        ),
        weekdays: weekdaysCaseReplace,
        weekdaysShort: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
        weekdaysMin: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY р.',
            LLL: 'D MMMM YYYY р., HH:mm',
            LLLL: 'dddd, D MMMM YYYY р., HH:mm',
        },
        calendar: {
            sameDay: processHoursFunction('[Сьогодні '),
            nextDay: processHoursFunction('[Завтра '),
            lastDay: processHoursFunction('[Вчора '),
            nextWeek: processHoursFunction('[У] dddd ['),
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                    case 3:
                    case 5:
                    case 6:
                        return processHoursFunction('[Минулої] dddd [').call(this);
                    case 1:
                    case 2:
                    case 4:
                        return processHoursFunction('[Минулого] dddd [').call(this);
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'за %s',
            past: '%s тому',
            s: 'декілька секунд',
            ss: relativeTimeWithPlural$4,
            m: relativeTimeWithPlural$4,
            mm: relativeTimeWithPlural$4,
            h: 'годину',
            hh: relativeTimeWithPlural$4,
            d: 'день',
            dd: relativeTimeWithPlural$4,
            M: 'місяць',
            MM: relativeTimeWithPlural$4,
            y: 'рік',
            yy: relativeTimeWithPlural$4,
        },
        // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
        meridiemParse: /ночі|ранку|дня|вечора/,
        isPM: function (input) {
            return /^(дня|вечора)$/.test(input);
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'ночі';
            } else if (hour < 12) {
                return 'ранку';
            } else if (hour < 17) {
                return 'дня';
            } else {
                return 'вечора';
            }
        },
        dayOfMonthOrdinalParse: /\d{1,2}-(й|го)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'M':
                case 'd':
                case 'DDD':
                case 'w':
                case 'W':
                    return number + '-й';
                case 'D':
                    return number + '-го';
                default:
                    return number;
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var months$a = [
            'جنوری',
            'فروری',
            'مارچ',
            'اپریل',
            'مئی',
            'جون',
            'جولائی',
            'اگست',
            'ستمبر',
            'اکتوبر',
            'نومبر',
            'دسمبر',
        ],
        days$1 = ['اتوار', 'پیر', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'ہفتہ'];

    moment.defineLocale('ur', {
        months: months$a,
        monthsShort: months$a,
        weekdays: days$1,
        weekdaysShort: days$1,
        weekdaysMin: days$1,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd، D MMMM YYYY HH:mm',
        },
        meridiemParse: /صبح|شام/,
        isPM: function (input) {
            return 'شام' === input;
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'صبح';
            }
            return 'شام';
        },
        calendar: {
            sameDay: '[آج بوقت] LT',
            nextDay: '[کل بوقت] LT',
            nextWeek: 'dddd [بوقت] LT',
            lastDay: '[گذشتہ روز بوقت] LT',
            lastWeek: '[گذشتہ] dddd [بوقت] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s بعد',
            past: '%s قبل',
            s: 'چند سیکنڈ',
            ss: '%d سیکنڈ',
            m: 'ایک منٹ',
            mm: '%d منٹ',
            h: 'ایک گھنٹہ',
            hh: '%d گھنٹے',
            d: 'ایک دن',
            dd: '%d دن',
            M: 'ایک ماہ',
            MM: '%d ماہ',
            y: 'ایک سال',
            yy: '%d سال',
        },
        preparse: function (string) {
            return string.replace(/،/g, ',');
        },
        postformat: function (string) {
            return string.replace(/,/g, '،');
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('uz-latn', {
        months: 'Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr'.split(
            '_'
        ),
        monthsShort: 'Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek'.split('_'),
        weekdays:
            'Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba'.split(
                '_'
            ),
        weekdaysShort: 'Yak_Dush_Sesh_Chor_Pay_Jum_Shan'.split('_'),
        weekdaysMin: 'Ya_Du_Se_Cho_Pa_Ju_Sha'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'D MMMM YYYY, dddd HH:mm',
        },
        calendar: {
            sameDay: '[Bugun soat] LT [da]',
            nextDay: '[Ertaga] LT [da]',
            nextWeek: 'dddd [kuni soat] LT [da]',
            lastDay: '[Kecha soat] LT [da]',
            lastWeek: "[O'tgan] dddd [kuni soat] LT [da]",
            sameElse: 'L',
        },
        relativeTime: {
            future: 'Yaqin %s ichida',
            past: 'Bir necha %s oldin',
            s: 'soniya',
            ss: '%d soniya',
            m: 'bir daqiqa',
            mm: '%d daqiqa',
            h: 'bir soat',
            hh: '%d soat',
            d: 'bir kun',
            dd: '%d kun',
            M: 'bir oy',
            MM: '%d oy',
            y: 'bir yil',
            yy: '%d yil',
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('uz', {
        months: 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split(
            '_'
        ),
        monthsShort: 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),
        weekdays: 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'),
        weekdaysShort: 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'),
        weekdaysMin: 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'D MMMM YYYY, dddd HH:mm',
        },
        calendar: {
            sameDay: '[Бугун соат] LT [да]',
            nextDay: '[Эртага] LT [да]',
            nextWeek: 'dddd [куни соат] LT [да]',
            lastDay: '[Кеча соат] LT [да]',
            lastWeek: '[Утган] dddd [куни соат] LT [да]',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'Якин %s ичида',
            past: 'Бир неча %s олдин',
            s: 'фурсат',
            ss: '%d фурсат',
            m: 'бир дакика',
            mm: '%d дакика',
            h: 'бир соат',
            hh: '%d соат',
            d: 'бир кун',
            dd: '%d кун',
            M: 'бир ой',
            MM: '%d ой',
            y: 'бир йил',
            yy: '%d йил',
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('vi', {
        months: 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split(
            '_'
        ),
        monthsShort:
            'Thg 01_Thg 02_Thg 03_Thg 04_Thg 05_Thg 06_Thg 07_Thg 08_Thg 09_Thg 10_Thg 11_Thg 12'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split(
            '_'
        ),
        weekdaysShort: 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
        weekdaysMin: 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
        weekdaysParseExact: true,
        meridiemParse: /sa|ch/i,
        isPM: function (input) {
            return /^ch$/i.test(input);
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours < 12) {
                return isLower ? 'sa' : 'SA';
            } else {
                return isLower ? 'ch' : 'CH';
            }
        },
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM [năm] YYYY',
            LLL: 'D MMMM [năm] YYYY HH:mm',
            LLLL: 'dddd, D MMMM [năm] YYYY HH:mm',
            l: 'DD/M/YYYY',
            ll: 'D MMM YYYY',
            lll: 'D MMM YYYY HH:mm',
            llll: 'ddd, D MMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Hôm nay lúc] LT',
            nextDay: '[Ngày mai lúc] LT',
            nextWeek: 'dddd [tuần tới lúc] LT',
            lastDay: '[Hôm qua lúc] LT',
            lastWeek: 'dddd [tuần trước lúc] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s tới',
            past: '%s trước',
            s: 'vài giây',
            ss: '%d giây',
            m: 'một phút',
            mm: '%d phút',
            h: 'một giờ',
            hh: '%d giờ',
            d: 'một ngày',
            dd: '%d ngày',
            w: 'một tuần',
            ww: '%d tuần',
            M: 'một tháng',
            MM: '%d tháng',
            y: 'một năm',
            yy: '%d năm',
        },
        dayOfMonthOrdinalParse: /\d{1,2}/,
        ordinal: function (number) {
            return number;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('x-pseudo', {
        months: 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split(
            '_'
        ),
        monthsShort:
            'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays:
            'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split(
                '_'
            ),
        weekdaysShort: 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'),
        weekdaysMin: 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[T~ódá~ý át] LT',
            nextDay: '[T~ómó~rró~w át] LT',
            nextWeek: 'dddd [át] LT',
            lastDay: '[Ý~ést~érdá~ý át] LT',
            lastWeek: '[L~ást] dddd [át] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'í~ñ %s',
            past: '%s á~gó',
            s: 'á ~féw ~sécó~ñds',
            ss: '%d s~écóñ~ds',
            m: 'á ~míñ~úté',
            mm: '%d m~íñú~tés',
            h: 'á~ñ hó~úr',
            hh: '%d h~óúrs',
            d: 'á ~dáý',
            dd: '%d d~áýs',
            M: 'á ~móñ~th',
            MM: '%d m~óñt~hs',
            y: 'á ~ýéár',
            yy: '%d ý~éárs',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('yo', {
        months: 'Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀'.split(
            '_'
        ),
        monthsShort: 'Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀'.split('_'),
        weekdays: 'Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta'.split('_'),
        weekdaysShort: 'Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá'.split('_'),
        weekdaysMin: 'Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb'.split('_'),
        longDateFormat: {
            LT: 'h:mm A',
            LTS: 'h:mm:ss A',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY h:mm A',
            LLLL: 'dddd, D MMMM YYYY h:mm A',
        },
        calendar: {
            sameDay: '[Ònì ni] LT',
            nextDay: '[Ọ̀la ni] LT',
            nextWeek: "dddd [Ọsẹ̀ tón'bọ] [ni] LT",
            lastDay: '[Àna ni] LT',
            lastWeek: 'dddd [Ọsẹ̀ tólọ́] [ni] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'ní %s',
            past: '%s kọjá',
            s: 'ìsẹjú aayá die',
            ss: 'aayá %d',
            m: 'ìsẹjú kan',
            mm: 'ìsẹjú %d',
            h: 'wákati kan',
            hh: 'wákati %d',
            d: 'ọjọ́ kan',
            dd: 'ọjọ́ %d',
            M: 'osù kan',
            MM: 'osù %d',
            y: 'ọdún kan',
            yy: 'ọdún %d',
        },
        dayOfMonthOrdinalParse: /ọjọ́\s\d{1,2}/,
        ordinal: 'ọjọ́ %d',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('zh-cn', {
        months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(
            '_'
        ),
        monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(
            '_'
        ),
        weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
        weekdaysShort: '周日_周一_周二_周三_周四_周五_周六'.split('_'),
        weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY/MM/DD',
            LL: 'YYYY年M月D日',
            LLL: 'YYYY年M月D日Ah点mm分',
            LLLL: 'YYYY年M月D日ddddAh点mm分',
            l: 'YYYY/M/D',
            ll: 'YYYY年M月D日',
            lll: 'YYYY年M月D日 HH:mm',
            llll: 'YYYY年M月D日dddd HH:mm',
        },
        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
                return hour;
            } else if (meridiem === '下午' || meridiem === '晚上') {
                return hour + 12;
            } else {
                // '中午'
                return hour >= 11 ? hour : hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            var hm = hour * 100 + minute;
            if (hm < 600) {
                return '凌晨';
            } else if (hm < 900) {
                return '早上';
            } else if (hm < 1130) {
                return '上午';
            } else if (hm < 1230) {
                return '中午';
            } else if (hm < 1800) {
                return '下午';
            } else {
                return '晚上';
            }
        },
        calendar: {
            sameDay: '[今天]LT',
            nextDay: '[明天]LT',
            nextWeek: function (now) {
                if (now.week() !== this.week()) {
                    return '[下]dddLT';
                } else {
                    return '[本]dddLT';
                }
            },
            lastDay: '[昨天]LT',
            lastWeek: function (now) {
                if (this.week() !== now.week()) {
                    return '[上]dddLT';
                } else {
                    return '[本]dddLT';
                }
            },
            sameElse: 'L',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(日|月|周)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'd':
                case 'D':
                case 'DDD':
                    return number + '日';
                case 'M':
                    return number + '月';
                case 'w':
                case 'W':
                    return number + '周';
                default:
                    return number;
            }
        },
        relativeTime: {
            future: '%s后',
            past: '%s前',
            s: '几秒',
            ss: '%d 秒',
            m: '1 分钟',
            mm: '%d 分钟',
            h: '1 小时',
            hh: '%d 小时',
            d: '1 天',
            dd: '%d 天',
            w: '1 周',
            ww: '%d 周',
            M: '1 个月',
            MM: '%d 个月',
            y: '1 年',
            yy: '%d 年',
        },
        week: {
            // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('zh-hk', {
        months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(
            '_'
        ),
        monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(
            '_'
        ),
        weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
        weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),
        weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY/MM/DD',
            LL: 'YYYY年M月D日',
            LLL: 'YYYY年M月D日 HH:mm',
            LLLL: 'YYYY年M月D日dddd HH:mm',
            l: 'YYYY/M/D',
            ll: 'YYYY年M月D日',
            lll: 'YYYY年M月D日 HH:mm',
            llll: 'YYYY年M月D日dddd HH:mm',
        },
        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
                return hour;
            } else if (meridiem === '中午') {
                return hour >= 11 ? hour : hour + 12;
            } else if (meridiem === '下午' || meridiem === '晚上') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            var hm = hour * 100 + minute;
            if (hm < 600) {
                return '凌晨';
            } else if (hm < 900) {
                return '早上';
            } else if (hm < 1200) {
                return '上午';
            } else if (hm === 1200) {
                return '中午';
            } else if (hm < 1800) {
                return '下午';
            } else {
                return '晚上';
            }
        },
        calendar: {
            sameDay: '[今天]LT',
            nextDay: '[明天]LT',
            nextWeek: '[下]ddddLT',
            lastDay: '[昨天]LT',
            lastWeek: '[上]ddddLT',
            sameElse: 'L',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'd':
                case 'D':
                case 'DDD':
                    return number + '日';
                case 'M':
                    return number + '月';
                case 'w':
                case 'W':
                    return number + '週';
                default:
                    return number;
            }
        },
        relativeTime: {
            future: '%s後',
            past: '%s前',
            s: '幾秒',
            ss: '%d 秒',
            m: '1 分鐘',
            mm: '%d 分鐘',
            h: '1 小時',
            hh: '%d 小時',
            d: '1 天',
            dd: '%d 天',
            M: '1 個月',
            MM: '%d 個月',
            y: '1 年',
            yy: '%d 年',
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('zh-mo', {
        months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(
            '_'
        ),
        monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(
            '_'
        ),
        weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
        weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),
        weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'YYYY年M月D日',
            LLL: 'YYYY年M月D日 HH:mm',
            LLLL: 'YYYY年M月D日dddd HH:mm',
            l: 'D/M/YYYY',
            ll: 'YYYY年M月D日',
            lll: 'YYYY年M月D日 HH:mm',
            llll: 'YYYY年M月D日dddd HH:mm',
        },
        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
                return hour;
            } else if (meridiem === '中午') {
                return hour >= 11 ? hour : hour + 12;
            } else if (meridiem === '下午' || meridiem === '晚上') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            var hm = hour * 100 + minute;
            if (hm < 600) {
                return '凌晨';
            } else if (hm < 900) {
                return '早上';
            } else if (hm < 1130) {
                return '上午';
            } else if (hm < 1230) {
                return '中午';
            } else if (hm < 1800) {
                return '下午';
            } else {
                return '晚上';
            }
        },
        calendar: {
            sameDay: '[今天] LT',
            nextDay: '[明天] LT',
            nextWeek: '[下]dddd LT',
            lastDay: '[昨天] LT',
            lastWeek: '[上]dddd LT',
            sameElse: 'L',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'd':
                case 'D':
                case 'DDD':
                    return number + '日';
                case 'M':
                    return number + '月';
                case 'w':
                case 'W':
                    return number + '週';
                default:
                    return number;
            }
        },
        relativeTime: {
            future: '%s內',
            past: '%s前',
            s: '幾秒',
            ss: '%d 秒',
            m: '1 分鐘',
            mm: '%d 分鐘',
            h: '1 小時',
            hh: '%d 小時',
            d: '1 天',
            dd: '%d 天',
            M: '1 個月',
            MM: '%d 個月',
            y: '1 年',
            yy: '%d 年',
        },
    });

    //! moment.js locale configuration

    moment.defineLocale('zh-tw', {
        months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(
            '_'
        ),
        monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(
            '_'
        ),
        weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
        weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),
        weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY/MM/DD',
            LL: 'YYYY年M月D日',
            LLL: 'YYYY年M月D日 HH:mm',
            LLLL: 'YYYY年M月D日dddd HH:mm',
            l: 'YYYY/M/D',
            ll: 'YYYY年M月D日',
            lll: 'YYYY年M月D日 HH:mm',
            llll: 'YYYY年M月D日dddd HH:mm',
        },
        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
                return hour;
            } else if (meridiem === '中午') {
                return hour >= 11 ? hour : hour + 12;
            } else if (meridiem === '下午' || meridiem === '晚上') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            var hm = hour * 100 + minute;
            if (hm < 600) {
                return '凌晨';
            } else if (hm < 900) {
                return '早上';
            } else if (hm < 1130) {
                return '上午';
            } else if (hm < 1230) {
                return '中午';
            } else if (hm < 1800) {
                return '下午';
            } else {
                return '晚上';
            }
        },
        calendar: {
            sameDay: '[今天] LT',
            nextDay: '[明天] LT',
            nextWeek: '[下]dddd LT',
            lastDay: '[昨天] LT',
            lastWeek: '[上]dddd LT',
            sameElse: 'L',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'd':
                case 'D':
                case 'DDD':
                    return number + '日';
                case 'M':
                    return number + '月';
                case 'w':
                case 'W':
                    return number + '週';
                default:
                    return number;
            }
        },
        relativeTime: {
            future: '%s後',
            past: '%s前',
            s: '幾秒',
            ss: '%d 秒',
            m: '1 分鐘',
            mm: '%d 分鐘',
            h: '1 小時',
            hh: '%d 小時',
            d: '1 天',
            dd: '%d 天',
            M: '1 個月',
            MM: '%d 個月',
            y: '1 年',
            yy: '%d 年',
        },
    });

    moment.locale('en');

    return moment;

})));
!function(e,a){"object"==typeof exports&&"undefined"!=typeof module&&"function"==typeof require?a(require("../moment")):"function"==typeof define&&define.amd?define(["../moment"],a):a(e.moment)}(this,function(e){"use strict";e.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(e){return/^nm$/i.test(e)},meridiem:function(e,a,_){return e<12?_?"vm":"VM":_?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[M\xf4re om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",ss:"%d sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||20<=e?"ste":"de")},week:{dow:1,doy:4}});function E(e){return 0===e?0:1===e?1:2===e?2:3<=e%100&&e%100<=10?3:11<=e%100?4:5}function a(n){return function(e,a,_,s){var d=E(e),t=J[n][E(e)];return(t=2===d?t[a?0:1]:t).replace(/%d/i,e)}}function F(e){return 0===e?0:1===e?1:2===e?2:3<=e%100&&e%100<=10?3:11<=e%100?4:5}function _(n){return function(e,a,_,s){var d=F(e),t=N[n][F(e)];return(t=2===d?t[a?0:1]:t).replace(/%d/i,e)}}function z(e){return 0===e?0:1===e?1:2===e?2:3<=e%100&&e%100<=10?3:11<=e%100?4:5}function s(n){return function(e,a,_,s){var d=z(e),t=B[n][z(e)];return(t=2===d?t[a?0:1]:t).replace(/%d/i,e)}}var J={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},d=["\u062c\u0627\u0646\u0641\u064a","\u0641\u064a\u0641\u0631\u064a","\u0645\u0627\u0631\u0633","\u0623\u0641\u0631\u064a\u0644","\u0645\u0627\u064a","\u062c\u0648\u0627\u0646","\u062c\u0648\u064a\u0644\u064a\u0629","\u0623\u0648\u062a","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"],I=(e.defineLocale("ar-dz",{months:d,monthsShort:d,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(e){return"\u0645"===e},meridiem:function(e,a,_){return e<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:a("s"),ss:a("s"),m:a("m"),mm:a("m"),h:a("h"),hh:a("h"),d:a("d"),dd:a("d"),M:a("M"),MM:a("M"),y:a("y"),yy:a("y")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:0,doy:4}}),e.defineLocale("ar-kw",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062a\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062a\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:0,doy:12}}),{1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",0:"0"}),N={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},d=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"],R=(e.defineLocale("ar-ly",{months:d,monthsShort:d,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(e){return"\u0645"===e},meridiem:function(e,a,_){return e<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:_("s"),ss:_("s"),m:_("m"),mm:_("m"),h:_("h"),hh:_("h"),d:_("d"),dd:_("d"),M:_("M"),MM:_("M"),y:_("y"),yy:_("y")},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return I[e]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}}),e.defineLocale("ar-ma",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:1,doy:4}}),{1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"}),C={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},K=(e.defineLocale("ar-sa",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(e){return"\u0645"===e},meridiem:function(e,a,_){return e<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},preparse:function(e){return e.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(e){return C[e]}).replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return R[e]}).replace(/,/g,"\u060c")},week:{dow:0,doy:6}}),e.defineLocale("ar-tn",{months:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:1,doy:4}}),{1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"}),G={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},B={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},d=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"],q=(e.defineLocale("ar",{months:d,monthsShort:d,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(e){return"\u0645"===e},meridiem:function(e,a,_){return e<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:s("s"),ss:s("s"),m:s("m"),mm:s("m"),h:s("h"),hh:s("h"),d:s("d"),dd:s("d"),M:s("M"),MM:s("M"),y:s("y"),yy:s("y")},preparse:function(e){return e.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(e){return G[e]}).replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return K[e]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}}),{1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-\xfcnc\xfc",4:"-\xfcnc\xfc",100:"-\xfcnc\xfc",6:"-nc\u0131",9:"-uncu",10:"-uncu",30:"-uncu",60:"-\u0131nc\u0131",90:"-\u0131nc\u0131"});function t(e,a,_){return"m"===_?a?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443":"h"===_?a?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443":e+" "+(e=+e,a=(a={ss:a?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:a?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d",hh:a?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d",dd:"\u0434\u0437\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u0437\u0451\u043d",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u044b_\u043c\u0435\u0441\u044f\u0446\u0430\u045e",yy:"\u0433\u043e\u0434_\u0433\u0430\u0434\u044b_\u0433\u0430\u0434\u043e\u045e"}[_]).split("_"),e%10==1&&e%100!=11?a[0]:2<=e%10&&e%10<=4&&(e%100<10||20<=e%100)?a[1]:a[2])}e.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ert\u0259si_\xc7\u0259r\u015f\u0259nb\u0259 ax\u015fam\u0131_\xc7\u0259r\u015f\u0259nb\u0259_C\xfcm\u0259 ax\u015fam\u0131_C\xfcm\u0259_\u015e\u0259nb\u0259".split("_"),weekdaysShort:"Baz_BzE_\xc7Ax_\xc7\u0259r_CAx_C\xfcm_\u015e\u0259n".split("_"),weekdaysMin:"Bz_BE_\xc7A_\xc7\u0259_CA_C\xfc_\u015e\u0259".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[g\u0259l\u0259n h\u0259ft\u0259] dddd [saat] LT",lastDay:"[d\xfcn\u0259n] LT",lastWeek:"[ke\xe7\u0259n h\u0259ft\u0259] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s \u0259vv\u0259l",s:"bir ne\xe7\u0259 saniy\u0259",ss:"%d saniy\u0259",m:"bir d\u0259qiq\u0259",mm:"%d d\u0259qiq\u0259",h:"bir saat",hh:"%d saat",d:"bir g\xfcn",dd:"%d g\xfcn",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiemParse:/gec\u0259|s\u0259h\u0259r|g\xfcnd\xfcz|ax\u015fam/,isPM:function(e){return/^(g\xfcnd\xfcz|ax\u015fam)$/.test(e)},meridiem:function(e,a,_){return e<4?"gec\u0259":e<12?"s\u0259h\u0259r":e<17?"g\xfcnd\xfcz":"ax\u015fam"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0131nc\u0131|inci|nci|\xfcnc\xfc|nc\u0131|uncu)/,ordinal:function(e){if(0===e)return e+"-\u0131nc\u0131";var a=e%10;return e+(q[a]||q[e%100-a]||q[100<=e?100:null])},week:{dow:1,doy:7}}),e.defineLocale("be",{months:{format:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044f_\u043b\u044e\u0442\u0430\u0433\u0430_\u0441\u0430\u043a\u0430\u0432\u0456\u043a\u0430_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a\u0430_\u0442\u0440\u0430\u045e\u043d\u044f_\u0447\u044d\u0440\u0432\u0435\u043d\u044f_\u043b\u0456\u043f\u0435\u043d\u044f_\u0436\u043d\u0456\u045e\u043d\u044f_\u0432\u0435\u0440\u0430\u0441\u043d\u044f_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a\u0430_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434\u0430_\u0441\u043d\u0435\u0436\u043d\u044f".split("_"),standalone:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044c_\u043b\u044e\u0442\u044b_\u0441\u0430\u043a\u0430\u0432\u0456\u043a_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u044d\u0440\u0432\u0435\u043d\u044c_\u043b\u0456\u043f\u0435\u043d\u044c_\u0436\u043d\u0456\u0432\u0435\u043d\u044c_\u0432\u0435\u0440\u0430\u0441\u0435\u043d\u044c_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434_\u0441\u043d\u0435\u0436\u0430\u043d\u044c".split("_")},monthsShort:"\u0441\u0442\u0443\u0434_\u043b\u044e\u0442_\u0441\u0430\u043a_\u043a\u0440\u0430\u0441_\u0442\u0440\u0430\u0432_\u0447\u044d\u0440\u0432_\u043b\u0456\u043f_\u0436\u043d\u0456\u0432_\u0432\u0435\u0440_\u043a\u0430\u0441\u0442_\u043b\u0456\u0441\u0442_\u0441\u043d\u0435\u0436".split("_"),weekdays:{format:"\u043d\u044f\u0434\u0437\u0435\u043b\u044e_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0443_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0443_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),standalone:"\u043d\u044f\u0434\u0437\u0435\u043b\u044f_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0430_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0430_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),isFormat:/\[ ?[\u0423\u0443\u045e] ?(?:\u043c\u0456\u043d\u0443\u043b\u0443\u044e|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u0443\u044e)? ?\] ?dddd/},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., HH:mm",LLLL:"dddd, D MMMM YYYY \u0433., HH:mm"},calendar:{sameDay:"[\u0421\u0451\u043d\u043d\u044f \u045e] LT",nextDay:"[\u0417\u0430\u045e\u0442\u0440\u0430 \u045e] LT",lastDay:"[\u0423\u0447\u043e\u0440\u0430 \u045e] LT",nextWeek:function(){return"[\u0423] dddd [\u045e] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u0443\u044e] dddd [\u045e] LT";case 1:case 2:case 4:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u044b] dddd [\u045e] LT"}},sameElse:"L"},relativeTime:{future:"\u043f\u0440\u0430\u0437 %s",past:"%s \u0442\u0430\u043c\u0443",s:"\u043d\u0435\u043a\u0430\u043b\u044c\u043a\u0456 \u0441\u0435\u043a\u0443\u043d\u0434",m:t,mm:t,h:t,hh:t,d:"\u0434\u0437\u0435\u043d\u044c",dd:t,M:"\u043c\u0435\u0441\u044f\u0446",MM:t,y:"\u0433\u043e\u0434",yy:t},meridiemParse:/\u043d\u043e\u0447\u044b|\u0440\u0430\u043d\u0456\u0446\u044b|\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430/,isPM:function(e){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430)$/.test(e)},meridiem:function(e,a,_){return e<4?"\u043d\u043e\u0447\u044b":e<12?"\u0440\u0430\u043d\u0456\u0446\u044b":e<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0430\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0456|\u044b|\u0433\u0430)/,ordinal:function(e,a){switch(a){case"M":case"d":case"DDD":case"w":case"W":return e%10!=2&&e%10!=3||e%100==12||e%100==13?e+"-\u044b":e+"-\u0456";case"D":return e+"-\u0433\u0430";default:return e}},week:{dow:1,doy:7}}),e.defineLocale("bg",{months:"\u044f\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u044f\u043d\u0443_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u044f\u0434\u0430_\u0447\u0435\u0442\u0432\u044a\u0440\u0442\u044a\u043a_\u043f\u0435\u0442\u044a\u043a_\u0441\u044a\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u044f_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u044a\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u043d\u0435\u0441 \u0432] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432] LT",nextWeek:"dddd [\u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u041c\u0438\u043d\u0430\u043b\u0430\u0442\u0430] dddd [\u0432] LT";case 1:case 2:case 4:case 5:return"[\u041c\u0438\u043d\u0430\u043b\u0438\u044f] dddd [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0441\u043b\u0435\u0434 %s",past:"\u043f\u0440\u0435\u0434\u0438 %s",s:"\u043d\u044f\u043a\u043e\u043b\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0434\u0435\u043d",dd:"%d \u0434\u0435\u043d\u0430",w:"\u0441\u0435\u0434\u043c\u0438\u0446\u0430",ww:"%d \u0441\u0435\u0434\u043c\u0438\u0446\u0438",M:"\u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0430",y:"\u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(e){var a=e%10,_=e%100;return 0===e?e+"-\u0435\u0432":0==_?e+"-\u0435\u043d":10<_&&_<20?e+"-\u0442\u0438":1==a?e+"-\u0432\u0438":2==a?e+"-\u0440\u0438":7==a||8==a?e+"-\u043c\u0438":e+"-\u0442\u0438"},week:{dow:1,doy:7}}),e.defineLocale("bm",{months:"Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_M\u025bkalo_Zuw\u025bnkalo_Zuluyekalo_Utikalo_S\u025btanburukalo_\u0254kut\u0254burukalo_Nowanburukalo_Desanburukalo".split("_"),monthsShort:"Zan_Few_Mar_Awi_M\u025b_Zuw_Zul_Uti_S\u025bt_\u0254ku_Now_Des".split("_"),weekdays:"Kari_Nt\u025bn\u025bn_Tarata_Araba_Alamisa_Juma_Sibiri".split("_"),weekdaysShort:"Kar_Nt\u025b_Tar_Ara_Ala_Jum_Sib".split("_"),weekdaysMin:"Ka_Nt_Ta_Ar_Al_Ju_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"MMMM [tile] D [san] YYYY",LLL:"MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm",LLLL:"dddd MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm"},calendar:{sameDay:"[Bi l\u025br\u025b] LT",nextDay:"[Sini l\u025br\u025b] LT",nextWeek:"dddd [don l\u025br\u025b] LT",lastDay:"[Kunu l\u025br\u025b] LT",lastWeek:"dddd [t\u025bm\u025bnen l\u025br\u025b] LT",sameElse:"L"},relativeTime:{future:"%s k\u0254n\u0254",past:"a b\u025b %s b\u0254",s:"sanga dama dama",ss:"sekondi %d",m:"miniti kelen",mm:"miniti %d",h:"l\u025br\u025b kelen",hh:"l\u025br\u025b %d",d:"tile kelen",dd:"tile %d",M:"kalo kelen",MM:"kalo %d",y:"san kelen",yy:"san %d"},week:{dow:1,doy:4}});var U={1:"\u09e7",2:"\u09e8",3:"\u09e9",4:"\u09ea",5:"\u09eb",6:"\u09ec",7:"\u09ed",8:"\u09ee",9:"\u09ef",0:"\u09e6"},$={"\u09e7":"1","\u09e8":"2","\u09e9":"3","\u09ea":"4","\u09eb":"5","\u09ec":"6","\u09ed":"7","\u09ee":"8","\u09ef":"9","\u09e6":"0"},Q=(e.defineLocale("bn-bd",{months:"\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09bf_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09bf_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0_\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0_\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0_\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0".split("_"),monthsShort:"\u099c\u09be\u09a8\u09c1_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f_\u0985\u0995\u09cd\u099f\u09cb_\u09a8\u09ad\u09c7_\u09a1\u09bf\u09b8\u09c7".split("_"),weekdays:"\u09b0\u09ac\u09bf\u09ac\u09be\u09b0_\u09b8\u09cb\u09ae\u09ac\u09be\u09b0_\u09ae\u0999\u09cd\u0997\u09b2\u09ac\u09be\u09b0_\u09ac\u09c1\u09a7\u09ac\u09be\u09b0_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf\u09ac\u09be\u09b0_\u09b6\u09c1\u0995\u09cd\u09b0\u09ac\u09be\u09b0_\u09b6\u09a8\u09bf\u09ac\u09be\u09b0".split("_"),weekdaysShort:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),weekdaysMin:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),longDateFormat:{LT:"A h:mm \u09b8\u09ae\u09df",LTS:"A h:mm:ss \u09b8\u09ae\u09df",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u09b8\u09ae\u09df",LLLL:"dddd, D MMMM YYYY, A h:mm \u09b8\u09ae\u09df"},calendar:{sameDay:"[\u0986\u099c] LT",nextDay:"[\u0986\u0997\u09be\u09ae\u09c0\u0995\u09be\u09b2] LT",nextWeek:"dddd, LT",lastDay:"[\u0997\u09a4\u0995\u09be\u09b2] LT",lastWeek:"[\u0997\u09a4] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u09aa\u09b0\u09c7",past:"%s \u0986\u0997\u09c7",s:"\u0995\u09df\u09c7\u0995 \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",ss:"%d \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",m:"\u098f\u0995 \u09ae\u09bf\u09a8\u09bf\u099f",mm:"%d \u09ae\u09bf\u09a8\u09bf\u099f",h:"\u098f\u0995 \u0998\u09a8\u09cd\u099f\u09be",hh:"%d \u0998\u09a8\u09cd\u099f\u09be",d:"\u098f\u0995 \u09a6\u09bf\u09a8",dd:"%d \u09a6\u09bf\u09a8",M:"\u098f\u0995 \u09ae\u09be\u09b8",MM:"%d \u09ae\u09be\u09b8",y:"\u098f\u0995 \u09ac\u099b\u09b0",yy:"%d \u09ac\u099b\u09b0"},preparse:function(e){return e.replace(/[\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u09e6]/g,function(e){return $[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return U[e]})},meridiemParse:/\u09b0\u09be\u09a4|\u09ad\u09cb\u09b0|\u09b8\u0995\u09be\u09b2|\u09a6\u09c1\u09aa\u09c1\u09b0|\u09ac\u09bf\u0995\u09be\u09b2|\u09b8\u09a8\u09cd\u09a7\u09cd\u09af\u09be|\u09b0\u09be\u09a4/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u09b0\u09be\u09a4"===a?e<4?e:e+12:"\u09ad\u09cb\u09b0"===a||"\u09b8\u0995\u09be\u09b2"===a?e:"\u09a6\u09c1\u09aa\u09c1\u09b0"===a?3<=e?e:e+12:"\u09ac\u09bf\u0995\u09be\u09b2"===a||"\u09b8\u09a8\u09cd\u09a7\u09cd\u09af\u09be"===a?e+12:void 0},meridiem:function(e,a,_){return e<4?"\u09b0\u09be\u09a4":e<6?"\u09ad\u09cb\u09b0":e<12?"\u09b8\u0995\u09be\u09b2":e<15?"\u09a6\u09c1\u09aa\u09c1\u09b0":e<18?"\u09ac\u09bf\u0995\u09be\u09b2":e<20?"\u09b8\u09a8\u09cd\u09a7\u09cd\u09af\u09be":"\u09b0\u09be\u09a4"},week:{dow:0,doy:6}}),{1:"\u09e7",2:"\u09e8",3:"\u09e9",4:"\u09ea",5:"\u09eb",6:"\u09ec",7:"\u09ed",8:"\u09ee",9:"\u09ef",0:"\u09e6"}),V={"\u09e7":"1","\u09e8":"2","\u09e9":"3","\u09ea":"4","\u09eb":"5","\u09ec":"6","\u09ed":"7","\u09ee":"8","\u09ef":"9","\u09e6":"0"},Z=(e.defineLocale("bn",{months:"\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09bf_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09bf_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0_\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0_\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0_\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0".split("_"),monthsShort:"\u099c\u09be\u09a8\u09c1_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f_\u0985\u0995\u09cd\u099f\u09cb_\u09a8\u09ad\u09c7_\u09a1\u09bf\u09b8\u09c7".split("_"),weekdays:"\u09b0\u09ac\u09bf\u09ac\u09be\u09b0_\u09b8\u09cb\u09ae\u09ac\u09be\u09b0_\u09ae\u0999\u09cd\u0997\u09b2\u09ac\u09be\u09b0_\u09ac\u09c1\u09a7\u09ac\u09be\u09b0_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf\u09ac\u09be\u09b0_\u09b6\u09c1\u0995\u09cd\u09b0\u09ac\u09be\u09b0_\u09b6\u09a8\u09bf\u09ac\u09be\u09b0".split("_"),weekdaysShort:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),weekdaysMin:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),longDateFormat:{LT:"A h:mm \u09b8\u09ae\u09df",LTS:"A h:mm:ss \u09b8\u09ae\u09df",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u09b8\u09ae\u09df",LLLL:"dddd, D MMMM YYYY, A h:mm \u09b8\u09ae\u09df"},calendar:{sameDay:"[\u0986\u099c] LT",nextDay:"[\u0986\u0997\u09be\u09ae\u09c0\u0995\u09be\u09b2] LT",nextWeek:"dddd, LT",lastDay:"[\u0997\u09a4\u0995\u09be\u09b2] LT",lastWeek:"[\u0997\u09a4] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u09aa\u09b0\u09c7",past:"%s \u0986\u0997\u09c7",s:"\u0995\u09df\u09c7\u0995 \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",ss:"%d \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",m:"\u098f\u0995 \u09ae\u09bf\u09a8\u09bf\u099f",mm:"%d \u09ae\u09bf\u09a8\u09bf\u099f",h:"\u098f\u0995 \u0998\u09a8\u09cd\u099f\u09be",hh:"%d \u0998\u09a8\u09cd\u099f\u09be",d:"\u098f\u0995 \u09a6\u09bf\u09a8",dd:"%d \u09a6\u09bf\u09a8",M:"\u098f\u0995 \u09ae\u09be\u09b8",MM:"%d \u09ae\u09be\u09b8",y:"\u098f\u0995 \u09ac\u099b\u09b0",yy:"%d \u09ac\u099b\u09b0"},preparse:function(e){return e.replace(/[\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u09e6]/g,function(e){return V[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return Q[e]})},meridiemParse:/\u09b0\u09be\u09a4|\u09b8\u0995\u09be\u09b2|\u09a6\u09c1\u09aa\u09c1\u09b0|\u09ac\u09bf\u0995\u09be\u09b2|\u09b0\u09be\u09a4/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u09b0\u09be\u09a4"===a&&4<=e||"\u09a6\u09c1\u09aa\u09c1\u09b0"===a&&e<5||"\u09ac\u09bf\u0995\u09be\u09b2"===a?e+12:e},meridiem:function(e,a,_){return e<4?"\u09b0\u09be\u09a4":e<10?"\u09b8\u0995\u09be\u09b2":e<17?"\u09a6\u09c1\u09aa\u09c1\u09b0":e<20?"\u09ac\u09bf\u0995\u09be\u09b2":"\u09b0\u09be\u09a4"},week:{dow:0,doy:6}}),{1:"\u0f21",2:"\u0f22",3:"\u0f23",4:"\u0f24",5:"\u0f25",6:"\u0f26",7:"\u0f27",8:"\u0f28",9:"\u0f29",0:"\u0f20"}),X={"\u0f21":"1","\u0f22":"2","\u0f23":"3","\u0f24":"4","\u0f25":"5","\u0f26":"6","\u0f27":"7","\u0f28":"8","\u0f29":"9","\u0f20":"0"};function ee(e,a,_){return e+" "+(_={mm:"munutenn",MM:"miz",dd:"devezh"}[_],2!==(e=e)?_:void 0!==(e={m:"v",b:"v",d:"z"})[(_=_).charAt(0)]?e[_.charAt(0)]+_.substring(1):_)}e.defineLocale("bo",{months:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f44\u0f0b\u0f54\u0f7c_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f66\u0f74\u0f58\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f5e\u0f72\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f63\u0f94\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0fb2\u0f74\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f62\u0f92\u0fb1\u0f51\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f42\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f45\u0f72\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54".split("_"),monthsShort:"\u0f5f\u0fb3\u0f0b1_\u0f5f\u0fb3\u0f0b2_\u0f5f\u0fb3\u0f0b3_\u0f5f\u0fb3\u0f0b4_\u0f5f\u0fb3\u0f0b5_\u0f5f\u0fb3\u0f0b6_\u0f5f\u0fb3\u0f0b7_\u0f5f\u0fb3\u0f0b8_\u0f5f\u0fb3\u0f0b9_\u0f5f\u0fb3\u0f0b10_\u0f5f\u0fb3\u0f0b11_\u0f5f\u0fb3\u0f0b12".split("_"),monthsShortRegex:/^(\u0f5f\u0fb3\u0f0b\d{1,2})/,monthsParseExact:!0,weekdays:"\u0f42\u0f5f\u0f60\u0f0b\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f42\u0f5f\u0f60\u0f0b\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysShort:"\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysMin:"\u0f49\u0f72_\u0f5f\u0fb3_\u0f58\u0f72\u0f42_\u0f63\u0fb7\u0f42_\u0f55\u0f74\u0f62_\u0f66\u0f44\u0f66_\u0f66\u0fa4\u0f7a\u0f53".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0f51\u0f72\u0f0b\u0f62\u0f72\u0f44] LT",nextDay:"[\u0f66\u0f44\u0f0b\u0f49\u0f72\u0f53] LT",nextWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f62\u0f97\u0f7a\u0f66\u0f0b\u0f58], LT",lastDay:"[\u0f41\u0f0b\u0f66\u0f44] LT",lastWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f58\u0f50\u0f60\u0f0b\u0f58] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0f63\u0f0b",past:"%s \u0f66\u0f94\u0f53\u0f0b\u0f63",s:"\u0f63\u0f58\u0f0b\u0f66\u0f44",ss:"%d \u0f66\u0f90\u0f62\u0f0b\u0f46\u0f0d",m:"\u0f66\u0f90\u0f62\u0f0b\u0f58\u0f0b\u0f42\u0f45\u0f72\u0f42",mm:"%d \u0f66\u0f90\u0f62\u0f0b\u0f58",h:"\u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51\u0f0b\u0f42\u0f45\u0f72\u0f42",hh:"%d \u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51",d:"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f45\u0f72\u0f42",dd:"%d \u0f49\u0f72\u0f53\u0f0b",M:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f45\u0f72\u0f42",MM:"%d \u0f5f\u0fb3\u0f0b\u0f56",y:"\u0f63\u0f7c\u0f0b\u0f42\u0f45\u0f72\u0f42",yy:"%d \u0f63\u0f7c"},preparse:function(e){return e.replace(/[\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29\u0f20]/g,function(e){return X[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return Z[e]})},meridiemParse:/\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c|\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66|\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44|\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42|\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"===a&&4<=e||"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44"===a&&e<5||"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42"===a?e+12:e},meridiem:function(e,a,_){return e<4?"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c":e<10?"\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66":e<17?"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44":e<20?"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42":"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"},week:{dow:0,doy:6}});var d=[/^gen/i,/^c[\u02bc\']hwe/i,/^meu/i,/^ebr/i,/^mae/i,/^(mez|eve)/i,/^gou/i,/^eos/i,/^gwe/i,/^her/i,/^du/i,/^ker/i],n=/^(genver|c[\u02bc\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu|gen|c[\u02bc\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,r=[/^Su/i,/^Lu/i,/^Me([^r]|$)/i,/^Mer/i,/^Ya/i,/^Gw/i,/^Sa/i];function i(e,a,_){var s=e+" ";switch(_){case"ss":return s+=1===e?"sekunda":2===e||3===e||4===e?"sekunde":"sekundi";case"m":return a?"jedna minuta":"jedne minute";case"mm":return s+=1!==e&&(2===e||3===e||4===e)?"minute":"minuta";case"h":return a?"jedan sat":"jednog sata";case"hh":return s+=1===e?"sat":2===e||3===e||4===e?"sata":"sati";case"dd":return s+=1===e?"dan":"dana";case"MM":return s+=1===e?"mjesec":2===e||3===e||4===e?"mjeseca":"mjeseci";case"yy":return s+=1!==e&&(2===e||3===e||4===e)?"godine":"godina"}}e.defineLocale("br",{months:"Genver_C\u02bchwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C\u02bchwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc\u02bcher_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),weekdaysParse:r,fullWeekdaysParse:[/^sul/i,/^lun/i,/^meurzh/i,/^merc[\u02bc\']her/i,/^yaou/i,/^gwener/i,/^sadorn/i],shortWeekdaysParse:[/^Sul/i,/^Lun/i,/^Meu/i,/^Mer/i,/^Yao/i,/^Gwe/i,/^Sad/i],minWeekdaysParse:r,monthsRegex:n,monthsShortRegex:n,monthsStrictRegex:/^(genver|c[\u02bc\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu)/i,monthsShortStrictRegex:/^(gen|c[\u02bc\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,monthsParse:d,longMonthsParse:d,shortMonthsParse:d,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY HH:mm",LLLL:"dddd, D [a viz] MMMM YYYY HH:mm"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc\u02bchoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec\u02bch da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s \u02bczo",s:"un nebeud segondenno\xf9",ss:"%d eilenn",m:"ur vunutenn",mm:ee,h:"un eur",hh:"%d eur",d:"un devezh",dd:ee,M:"ur miz",MM:ee,y:"ur bloaz",yy:function(e){switch(function e(a){if(9<a)return e(a%10);return a}(e)){case 1:case 3:case 4:case 5:case 9:return e+" bloaz";default:return e+" vloaz"}}},dayOfMonthOrdinalParse:/\d{1,2}(a\xf1|vet)/,ordinal:function(e){return e+(1===e?"a\xf1":"vet")},week:{dow:1,doy:4},meridiemParse:/a.m.|g.m./,isPM:function(e){return"g.m."===e},meridiem:function(e,a,_){return e<12?"a.m.":"g.m."}}),e.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010der u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[pro\u0161lu] dddd [u] LT";case 6:return"[pro\u0161le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[pro\u0161li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:i,m:i,mm:i,h:i,hh:i,d:"dan",dd:i,M:"mjesec",MM:i,y:"godinu",yy:i},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}}),e.defineLocale("ca",{months:{standalone:"gener_febrer_mar\xe7_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),format:"de gener_de febrer_de mar\xe7_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._mar\xe7_abr._maig_juny_jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:!0,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dt_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a les] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a les] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[dem\xe0 a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"d'aqu\xed %s",past:"fa %s",s:"uns segons",ss:"%d segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|\xe8|a)/,ordinal:function(e,a){return e+("w"!==a&&"W"!==a?1===e?"r":2===e?"n":3===e?"r":4===e?"t":"\xe8":"a")},week:{dow:1,doy:4}});var r={format:"leden_\xfanor_b\u0159ezen_duben_kv\u011bten_\u010derven_\u010dervenec_srpen_z\xe1\u0159\xed_\u0159\xedjen_listopad_prosinec".split("_"),standalone:"ledna_\xfanora_b\u0159ezna_dubna_kv\u011btna_\u010dervna_\u010dervence_srpna_z\xe1\u0159\xed_\u0159\xedjna_listopadu_prosince".split("_")},n="led_\xfano_b\u0159e_dub_kv\u011b_\u010dvn_\u010dvc_srp_z\xe1\u0159_\u0159\xedj_lis_pro".split("_"),d=[/^led/i,/^\xfano/i,/^b\u0159e/i,/^dub/i,/^kv\u011b/i,/^(\u010dvn|\u010derven$|\u010dervna)/i,/^(\u010dvc|\u010dervenec|\u010dervence)/i,/^srp/i,/^z\xe1\u0159/i,/^\u0159\xedj/i,/^lis/i,/^pro/i],m=/^(leden|\xfanor|b\u0159ezen|duben|kv\u011bten|\u010dervenec|\u010dervence|\u010derven|\u010dervna|srpen|z\xe1\u0159\xed|\u0159\xedjen|listopad|prosinec|led|\xfano|b\u0159e|dub|kv\u011b|\u010dvn|\u010dvc|srp|z\xe1\u0159|\u0159\xedj|lis|pro)/i;function o(e){return 1<e&&e<5&&1!=~~(e/10)}function u(e,a,_,s){var d=e+" ";switch(_){case"s":return a||s?"p\xe1r sekund":"p\xe1r sekundami";case"ss":return a||s?d+(o(e)?"sekundy":"sekund"):d+"sekundami";case"m":return a?"minuta":s?"minutu":"minutou";case"mm":return a||s?d+(o(e)?"minuty":"minut"):d+"minutami";case"h":return a?"hodina":s?"hodinu":"hodinou";case"hh":return a||s?d+(o(e)?"hodiny":"hodin"):d+"hodinami";case"d":return a||s?"den":"dnem";case"dd":return a||s?d+(o(e)?"dny":"dn\xed"):d+"dny";case"M":return a||s?"m\u011bs\xedc":"m\u011bs\xedcem";case"MM":return a||s?d+(o(e)?"m\u011bs\xedce":"m\u011bs\xedc\u016f"):d+"m\u011bs\xedci";case"y":return a||s?"rok":"rokem";case"yy":return a||s?d+(o(e)?"roky":"let"):d+"lety"}}function l(e,a,_,s){e={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return a?e[_][0]:e[_][1]}function M(e,a,_,s){e={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return a?e[_][0]:e[_][1]}function L(e,a,_,s){e={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return a?e[_][0]:e[_][1]}e.defineLocale("cs",{months:r,monthsShort:n,monthsRegex:m,monthsShortRegex:m,monthsStrictRegex:/^(leden|ledna|\xfanora|\xfanor|b\u0159ezen|b\u0159ezna|duben|dubna|kv\u011bten|kv\u011btna|\u010dervenec|\u010dervence|\u010derven|\u010dervna|srpen|srpna|z\xe1\u0159\xed|\u0159\xedjen|\u0159\xedjna|listopadu|listopad|prosinec|prosince)/i,monthsShortStrictRegex:/^(led|\xfano|b\u0159e|dub|kv\u011b|\u010dvn|\u010dvc|srp|z\xe1\u0159|\u0159\xedj|lis|pro)/i,monthsParse:d,longMonthsParse:d,shortMonthsParse:d,weekdays:"ned\u011ble_pond\u011bl\xed_\xfater\xfd_st\u0159eda_\u010dtvrtek_p\xe1tek_sobota".split("_"),weekdaysShort:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),weekdaysMin:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},calendar:{sameDay:"[dnes v] LT",nextDay:"[z\xedtra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v ned\u011bli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve st\u0159edu v] LT";case 4:return"[ve \u010dtvrtek v] LT";case 5:return"[v p\xe1tek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[v\u010dera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou ned\u011bli v] LT";case 1:case 2:return"[minul\xe9] dddd [v] LT";case 3:return"[minulou st\u0159edu v] LT";case 4:case 5:return"[minul\xfd] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"p\u0159ed %s",s:u,ss:u,m:u,mm:u,h:u,hh:u,d:u,dd:u,M:u,MM:u,y:u,yy:u},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),e.defineLocale("cv",{months:"\u043a\u04d1\u0440\u043b\u0430\u0447_\u043d\u0430\u0440\u04d1\u0441_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440\u0442\u043c\u0435_\u0443\u0442\u04d1_\u04ab\u0443\u0440\u043b\u0430_\u0430\u0432\u04d1\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448\u0442\u0430\u0432".split("_"),monthsShort:"\u043a\u04d1\u0440_\u043d\u0430\u0440_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440_\u0443\u0442\u04d1_\u04ab\u0443\u0440_\u0430\u0432\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448".split("_"),weekdays:"\u0432\u044b\u0440\u0441\u0430\u0440\u043d\u0438\u043a\u0443\u043d_\u0442\u0443\u043d\u0442\u0438\u043a\u0443\u043d_\u044b\u0442\u043b\u0430\u0440\u0438\u043a\u0443\u043d_\u044e\u043d\u043a\u0443\u043d_\u043a\u04d7\u04ab\u043d\u0435\u0440\u043d\u0438\u043a\u0443\u043d_\u044d\u0440\u043d\u0435\u043a\u0443\u043d_\u0448\u04d1\u043c\u0430\u0442\u043a\u0443\u043d".split("_"),weekdaysShort:"\u0432\u044b\u0440_\u0442\u0443\u043d_\u044b\u0442\u043b_\u044e\u043d_\u043a\u04d7\u04ab_\u044d\u0440\u043d_\u0448\u04d1\u043c".split("_"),weekdaysMin:"\u0432\u0440_\u0442\u043d_\u044b\u0442_\u044e\u043d_\u043a\u04ab_\u044d\u0440_\u0448\u043c".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7]",LLL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm",LLLL:"dddd, YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm"},calendar:{sameDay:"[\u041f\u0430\u044f\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextDay:"[\u042b\u0440\u0430\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastDay:"[\u04d6\u043d\u0435\u0440] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextWeek:"[\u04aa\u0438\u0442\u0435\u0441] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastWeek:"[\u0418\u0440\u0442\u043d\u04d7] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",sameElse:"L"},relativeTime:{future:function(e){return e+(/\u0441\u0435\u0445\u0435\u0442$/i.exec(e)?"\u0440\u0435\u043d":/\u04ab\u0443\u043b$/i.exec(e)?"\u0442\u0430\u043d":"\u0440\u0430\u043d")},past:"%s \u043a\u0430\u044f\u043b\u043b\u0430",s:"\u043f\u04d7\u0440-\u0438\u043a \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",ss:"%d \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",m:"\u043f\u04d7\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u043f\u04d7\u0440 \u0441\u0435\u0445\u0435\u0442",hh:"%d \u0441\u0435\u0445\u0435\u0442",d:"\u043f\u04d7\u0440 \u043a\u0443\u043d",dd:"%d \u043a\u0443\u043d",M:"\u043f\u04d7\u0440 \u0443\u0439\u04d1\u0445",MM:"%d \u0443\u0439\u04d1\u0445",y:"\u043f\u04d7\u0440 \u04ab\u0443\u043b",yy:"%d \u04ab\u0443\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-\u043c\u04d7\u0448/,ordinal:"%d-\u043c\u04d7\u0448",week:{dow:1,doy:7}}),e.defineLocale("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn \xf4l",s:"ychydig eiliadau",ss:"%d eiliad",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},dayOfMonthOrdinalParse:/\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,ordinal:function(e){var a="";return 20<e?a=40===e||50===e||60===e||80===e||100===e?"fed":"ain":0<e&&(a=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"][e]),e+a},week:{dow:1,doy:4}}),e.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"s\xf8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xf8rdag".split("_"),weekdaysShort:"s\xf8n_man_tir_ons_tor_fre_l\xf8r".split("_"),weekdaysMin:"s\xf8_ma_ti_on_to_fr_l\xf8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd [d.] D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"p\xe5 dddd [kl.] LT",lastDay:"[i g\xe5r kl.] LT",lastWeek:"[i] dddd[s kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"f\xe5 sekunder",ss:"%d sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en m\xe5ned",MM:"%d m\xe5neder",y:"et \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),e.defineLocale("de-at",{months:"J\xe4nner_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"J\xe4n._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:l,mm:"%d Minuten",h:l,hh:"%d Stunden",d:l,dd:l,w:l,ww:"%d Wochen",M:l,MM:l,y:l,yy:l},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),e.defineLocale("de-ch",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:M,mm:"%d Minuten",h:M,hh:"%d Stunden",d:M,dd:M,w:M,ww:"%d Wochen",M:M,MM:M,y:M,yy:M},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),e.defineLocale("de",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:L,mm:"%d Minuten",h:L,hh:"%d Stunden",d:L,dd:L,w:L,ww:"%d Wochen",M:L,MM:L,y:L,yy:L},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});r=["\u0796\u07ac\u0782\u07aa\u0787\u07a6\u0783\u07a9","\u078a\u07ac\u0784\u07b0\u0783\u07aa\u0787\u07a6\u0783\u07a9","\u0789\u07a7\u0783\u07a8\u0797\u07aa","\u0787\u07ad\u0795\u07b0\u0783\u07a9\u078d\u07aa","\u0789\u07ad","\u0796\u07ab\u0782\u07b0","\u0796\u07aa\u078d\u07a6\u0787\u07a8","\u0787\u07af\u078e\u07a6\u0790\u07b0\u0793\u07aa","\u0790\u07ac\u0795\u07b0\u0793\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0787\u07ae\u0786\u07b0\u0793\u07af\u0784\u07a6\u0783\u07aa","\u0782\u07ae\u0788\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0791\u07a8\u0790\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa"],n=["\u0787\u07a7\u078b\u07a8\u0787\u07b0\u078c\u07a6","\u0780\u07af\u0789\u07a6","\u0787\u07a6\u0782\u07b0\u078e\u07a7\u0783\u07a6","\u0784\u07aa\u078b\u07a6","\u0784\u07aa\u0783\u07a7\u0790\u07b0\u078a\u07a6\u078c\u07a8","\u0780\u07aa\u0786\u07aa\u0783\u07aa","\u0780\u07ae\u0782\u07a8\u0780\u07a8\u0783\u07aa"];e.defineLocale("dv",{months:r,monthsShort:r,weekdays:n,weekdaysShort:n,weekdaysMin:"\u0787\u07a7\u078b\u07a8_\u0780\u07af\u0789\u07a6_\u0787\u07a6\u0782\u07b0_\u0784\u07aa\u078b\u07a6_\u0784\u07aa\u0783\u07a7_\u0780\u07aa\u0786\u07aa_\u0780\u07ae\u0782\u07a8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/M/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0789\u0786|\u0789\u078a/,isPM:function(e){return"\u0789\u078a"===e},meridiem:function(e,a,_){return e<12?"\u0789\u0786":"\u0789\u078a"},calendar:{sameDay:"[\u0789\u07a8\u0787\u07a6\u078b\u07aa] LT",nextDay:"[\u0789\u07a7\u078b\u07a6\u0789\u07a7] LT",nextWeek:"dddd LT",lastDay:"[\u0787\u07a8\u0787\u07b0\u0794\u07ac] LT",lastWeek:"[\u078a\u07a7\u0787\u07a8\u078c\u07aa\u0788\u07a8] dddd LT",sameElse:"L"},relativeTime:{future:"\u078c\u07ac\u0783\u07ad\u078e\u07a6\u0787\u07a8 %s",past:"\u0786\u07aa\u0783\u07a8\u0782\u07b0 %s",s:"\u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa\u0786\u07ae\u0785\u07ac\u0787\u07b0",ss:"d% \u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa",m:"\u0789\u07a8\u0782\u07a8\u0793\u07ac\u0787\u07b0",mm:"\u0789\u07a8\u0782\u07a8\u0793\u07aa %d",h:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07ac\u0787\u07b0",hh:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07aa %d",d:"\u078b\u07aa\u0788\u07a6\u0780\u07ac\u0787\u07b0",dd:"\u078b\u07aa\u0788\u07a6\u0790\u07b0 %d",M:"\u0789\u07a6\u0780\u07ac\u0787\u07b0",MM:"\u0789\u07a6\u0790\u07b0 %d",y:"\u0787\u07a6\u0780\u07a6\u0783\u07ac\u0787\u07b0",yy:"\u0787\u07a6\u0780\u07a6\u0783\u07aa %d"},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:7,doy:12}}),e.defineLocale("el",{monthsNominativeEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2_\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2_\u039c\u03ac\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2_\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2_\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2_\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2".split("_"),monthsGenitiveEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u039c\u03b1\u03c1\u03c4\u03af\u03bf\u03c5_\u0391\u03c0\u03c1\u03b9\u03bb\u03af\u03bf\u03c5_\u039c\u03b1\u0390\u03bf\u03c5_\u0399\u03bf\u03c5\u03bd\u03af\u03bf\u03c5_\u0399\u03bf\u03c5\u03bb\u03af\u03bf\u03c5_\u0391\u03c5\u03b3\u03bf\u03cd\u03c3\u03c4\u03bf\u03c5_\u03a3\u03b5\u03c0\u03c4\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u039f\u03ba\u03c4\u03c9\u03b2\u03c1\u03af\u03bf\u03c5_\u039d\u03bf\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u0394\u03b5\u03ba\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5".split("_"),months:function(e,a){return e?("string"==typeof a&&/D/.test(a.substring(0,a.indexOf("MMMM")))?this._monthsGenitiveEl:this._monthsNominativeEl)[e.month()]:this._monthsNominativeEl},monthsShort:"\u0399\u03b1\u03bd_\u03a6\u03b5\u03b2_\u039c\u03b1\u03c1_\u0391\u03c0\u03c1_\u039c\u03b1\u03ca_\u0399\u03bf\u03c5\u03bd_\u0399\u03bf\u03c5\u03bb_\u0391\u03c5\u03b3_\u03a3\u03b5\u03c0_\u039f\u03ba\u03c4_\u039d\u03bf\u03b5_\u0394\u03b5\u03ba".split("_"),weekdays:"\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae_\u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1_\u03a4\u03c1\u03af\u03c4\u03b7_\u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7_\u03a0\u03ad\u03bc\u03c0\u03c4\u03b7_\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae_\u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf".split("_"),weekdaysShort:"\u039a\u03c5\u03c1_\u0394\u03b5\u03c5_\u03a4\u03c1\u03b9_\u03a4\u03b5\u03c4_\u03a0\u03b5\u03bc_\u03a0\u03b1\u03c1_\u03a3\u03b1\u03b2".split("_"),weekdaysMin:"\u039a\u03c5_\u0394\u03b5_\u03a4\u03c1_\u03a4\u03b5_\u03a0\u03b5_\u03a0\u03b1_\u03a3\u03b1".split("_"),meridiem:function(e,a,_){return 11<e?_?"\u03bc\u03bc":"\u039c\u039c":_?"\u03c0\u03bc":"\u03a0\u039c"},isPM:function(e){return"\u03bc"===(e+"").toLowerCase()[0]},meridiemParse:/[\u03a0\u039c]\.?\u039c?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[\u03a3\u03ae\u03bc\u03b5\u03c1\u03b1 {}] LT",nextDay:"[\u0391\u03cd\u03c1\u03b9\u03bf {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[\u03a7\u03b8\u03b5\u03c2 {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[\u03c4\u03bf \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf] dddd [{}] LT";default:return"[\u03c4\u03b7\u03bd \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7] dddd [{}] LT"}},sameElse:"L"},calendar:function(e,a){var _,e=this._calendarEl[e],s=a&&a.hours();return _=e,(e="undefined"!=typeof Function&&_ instanceof Function||"[object Function]"===Object.prototype.toString.call(_)?e.apply(a):e).replace("{}",s%12==1?"\u03c3\u03c4\u03b7":"\u03c3\u03c4\u03b9\u03c2")},relativeTime:{future:"\u03c3\u03b5 %s",past:"%s \u03c0\u03c1\u03b9\u03bd",s:"\u03bb\u03af\u03b3\u03b1 \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",ss:"%d \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",m:"\u03ad\u03bd\u03b1 \u03bb\u03b5\u03c0\u03c4\u03cc",mm:"%d \u03bb\u03b5\u03c0\u03c4\u03ac",h:"\u03bc\u03af\u03b1 \u03ce\u03c1\u03b1",hh:"%d \u03ce\u03c1\u03b5\u03c2",d:"\u03bc\u03af\u03b1 \u03bc\u03ad\u03c1\u03b1",dd:"%d \u03bc\u03ad\u03c1\u03b5\u03c2",M:"\u03ad\u03bd\u03b1\u03c2 \u03bc\u03ae\u03bd\u03b1\u03c2",MM:"%d \u03bc\u03ae\u03bd\u03b5\u03c2",y:"\u03ad\u03bd\u03b1\u03c2 \u03c7\u03c1\u03cc\u03bd\u03bf\u03c2",yy:"%d \u03c7\u03c1\u03cc\u03bd\u03b9\u03b1"},dayOfMonthOrdinalParse:/\d{1,2}\u03b7/,ordinal:"%d\u03b7",week:{dow:1,doy:4}}),e.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")},week:{dow:0,doy:4}}),e.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")}}),e.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")},week:{dow:1,doy:4}}),e.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")},week:{dow:1,doy:4}}),e.defineLocale("en-il",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")}}),e.defineLocale("en-in",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")},week:{dow:0,doy:6}}),e.defineLocale("en-nz",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")},week:{dow:1,doy:4}}),e.defineLocale("en-sg",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")},week:{dow:1,doy:4}}),e.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_a\u016dgusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mart_apr_maj_jun_jul_a\u016dg_sept_okt_nov_dec".split("_"),weekdays:"diman\u0109o_lundo_mardo_merkredo_\u0135a\u016ddo_vendredo_sabato".split("_"),weekdaysShort:"dim_lun_mard_merk_\u0135a\u016d_ven_sab".split("_"),weekdaysMin:"di_lu_ma_me_\u0135a_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"[la] D[-an de] MMMM, YYYY",LLL:"[la] D[-an de] MMMM, YYYY HH:mm",LLLL:"dddd[n], [la] D[-an de] MMMM, YYYY HH:mm",llll:"ddd, [la] D[-an de] MMM, YYYY HH:mm"},meridiemParse:/[ap]\.t\.m/i,isPM:function(e){return"p"===e.charAt(0).toLowerCase()},meridiem:function(e,a,_){return 11<e?_?"p.t.m.":"P.T.M.":_?"a.t.m.":"A.T.M."},calendar:{sameDay:"[Hodia\u016d je] LT",nextDay:"[Morga\u016d je] LT",nextWeek:"dddd[n je] LT",lastDay:"[Hiera\u016d je] LT",lastWeek:"[pasintan] dddd[n je] LT",sameElse:"L"},relativeTime:{future:"post %s",past:"anta\u016d %s",s:"kelkaj sekundoj",ss:"%d sekundoj",m:"unu minuto",mm:"%d minutoj",h:"unu horo",hh:"%d horoj",d:"unu tago",dd:"%d tagoj",M:"unu monato",MM:"%d monatoj",y:"unu jaro",yy:"%d jaroj"},dayOfMonthOrdinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}});var ae="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),_e="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),m=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],d=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,se=(e.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,a){return e?(/-MMM-/.test(a)?_e:ae)[e.month()]:ae},monthsRegex:d,monthsShortRegex:d,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:m,longMonthsParse:m,shortMonthsParse:m,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}}),"ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_")),de="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),r=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],n=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,te=(e.defineLocale("es-mx",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,a){return e?(/-MMM-/.test(a)?de:se)[e.month()]:se},monthsRegex:n,monthsShortRegex:n,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:r,longMonthsParse:r,shortMonthsParse:r,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:0,doy:4},invalidDate:"Fecha inv\xe1lida"}),"ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_")),ne="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),d=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],m=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,re=(e.defineLocale("es-us",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,a){return e?(/-MMM-/.test(a)?ne:te)[e.month()]:te},monthsRegex:m,monthsShortRegex:m,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:d,longMonthsParse:d,shortMonthsParse:d,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"MM/DD/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:0,doy:6}}),"ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_")),ie="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),n=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],r=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;function Y(e,a,_,s){e={s:["m\xf5ne sekundi","m\xf5ni sekund","paar sekundit"],ss:[e+"sekundi",e+"sekundit"],m:["\xfche minuti","\xfcks minut"],mm:[e+" minuti",e+" minutit"],h:["\xfche tunni","tund aega","\xfcks tund"],hh:[e+" tunni",e+" tundi"],d:["\xfche p\xe4eva","\xfcks p\xe4ev"],M:["kuu aja","kuu aega","\xfcks kuu"],MM:[e+" kuu",e+" kuud"],y:["\xfche aasta","aasta","\xfcks aasta"],yy:[e+" aasta",e+" aastat"]};return a?e[_][2]||e[_][1]:s?e[_][0]:e[_][1]}e.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,a){return e?(/-MMM-/.test(a)?ie:re)[e.month()]:re},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:n,longMonthsParse:n,shortMonthsParse:n,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4},invalidDate:"Fecha inv\xe1lida"}),e.defineLocale("et",{months:"jaanuar_veebruar_m\xe4rts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_m\xe4rts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"p\xfchap\xe4ev_esmasp\xe4ev_teisip\xe4ev_kolmap\xe4ev_neljap\xe4ev_reede_laup\xe4ev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[T\xe4na,] LT",nextDay:"[Homme,] LT",nextWeek:"[J\xe4rgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s p\xe4rast",past:"%s tagasi",s:Y,ss:Y,m:Y,mm:Y,h:Y,hh:Y,d:Y,dd:"%d p\xe4eva",M:Y,MM:Y,y:Y,yy:Y},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),e.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),monthsParseExact:!0,weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] HH:mm",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] HH:mm",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] HH:mm",llll:"ddd, YYYY[ko] MMM D[a] HH:mm"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",ss:"%d segundo",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});var me={1:"\u06f1",2:"\u06f2",3:"\u06f3",4:"\u06f4",5:"\u06f5",6:"\u06f6",7:"\u06f7",8:"\u06f8",9:"\u06f9",0:"\u06f0"},oe={"\u06f1":"1","\u06f2":"2","\u06f3":"3","\u06f4":"4","\u06f5":"5","\u06f6":"6","\u06f7":"7","\u06f8":"8","\u06f9":"9","\u06f0":"0"},ue=(e.defineLocale("fa",{months:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),monthsShort:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),weekdays:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysShort:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysMin:"\u06cc_\u062f_\u0633_\u0686_\u067e_\u062c_\u0634".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631|\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/,isPM:function(e){return/\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/.test(e)},meridiem:function(e,a,_){return e<12?"\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631":"\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631"},calendar:{sameDay:"[\u0627\u0645\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",nextDay:"[\u0641\u0631\u062f\u0627 \u0633\u0627\u0639\u062a] LT",nextWeek:"dddd [\u0633\u0627\u0639\u062a] LT",lastDay:"[\u062f\u06cc\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",lastWeek:"dddd [\u067e\u06cc\u0634] [\u0633\u0627\u0639\u062a] LT",sameElse:"L"},relativeTime:{future:"\u062f\u0631 %s",past:"%s \u067e\u06cc\u0634",s:"\u0686\u0646\u062f \u062b\u0627\u0646\u06cc\u0647",ss:"%d \u062b\u0627\u0646\u06cc\u0647",m:"\u06cc\u06a9 \u062f\u0642\u06cc\u0642\u0647",mm:"%d \u062f\u0642\u06cc\u0642\u0647",h:"\u06cc\u06a9 \u0633\u0627\u0639\u062a",hh:"%d \u0633\u0627\u0639\u062a",d:"\u06cc\u06a9 \u0631\u0648\u0632",dd:"%d \u0631\u0648\u0632",M:"\u06cc\u06a9 \u0645\u0627\u0647",MM:"%d \u0645\u0627\u0647",y:"\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(e){return e.replace(/[\u06f0-\u06f9]/g,function(e){return oe[e]}).replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return me[e]}).replace(/,/g,"\u060c")},dayOfMonthOrdinalParse:/\d{1,2}\u0645/,ordinal:"%d\u0645",week:{dow:6,doy:12}}),"nolla yksi kaksi kolme nelj\xe4 viisi kuusi seitsem\xe4n kahdeksan yhdeks\xe4n".split(" ")),le=["nolla","yhden","kahden","kolmen","nelj\xe4n","viiden","kuuden",ue[7],ue[8],ue[9]];function h(e,a,_,s){var d="";switch(_){case"s":return s?"muutaman sekunnin":"muutama sekunti";case"ss":d=s?"sekunnin":"sekuntia";break;case"m":return s?"minuutin":"minuutti";case"mm":d=s?"minuutin":"minuuttia";break;case"h":return s?"tunnin":"tunti";case"hh":d=s?"tunnin":"tuntia";break;case"d":return s?"p\xe4iv\xe4n":"p\xe4iv\xe4";case"dd":d=s?"p\xe4iv\xe4n":"p\xe4iv\xe4\xe4";break;case"M":return s?"kuukauden":"kuukausi";case"MM":d=s?"kuukauden":"kuukautta";break;case"y":return s?"vuoden":"vuosi";case"yy":d=s?"vuoden":"vuotta";break}return _=s,d=((e=e)<10?(_?le:ue)[e]:e)+" "+d}e.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kes\xe4kuu_hein\xe4kuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kes\xe4_hein\xe4_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[t\xe4n\xe4\xe4n] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s p\xe4\xe4st\xe4",past:"%s sitten",s:h,ss:h,m:h,mm:h,h:h,hh:h,d:h,dd:h,M:h,MM:h,y:h,yy:h},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),e.defineLocale("fil",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(e){return e},week:{dow:1,doy:4}}),e.defineLocale("fo",{months:"januar_februar_mars_apr\xedl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_m\xe1nadagur_t\xfdsdagur_mikudagur_h\xf3sdagur_fr\xedggjadagur_leygardagur".split("_"),weekdaysShort:"sun_m\xe1n_t\xfds_mik_h\xf3s_fr\xed_ley".split("_"),weekdaysMin:"su_m\xe1_t\xfd_mi_h\xf3_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D. MMMM, YYYY HH:mm"},calendar:{sameDay:"[\xcd dag kl.] LT",nextDay:"[\xcd morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xcd gj\xe1r kl.] LT",lastWeek:"[s\xed\xf0stu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s s\xed\xf0ani",s:"f\xe1 sekund",ss:"%d sekundir",m:"ein minuttur",mm:"%d minuttir",h:"ein t\xedmi",hh:"%d t\xedmar",d:"ein dagur",dd:"%d dagar",M:"ein m\xe1na\xf0ur",MM:"%d m\xe1na\xf0ir",y:"eitt \xe1r",yy:"%d \xe1r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),e.defineLocale("fr-ca",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(e,a){switch(a){default:case"M":case"Q":case"D":case"DDD":case"d":return e+(1===e?"er":"e");case"w":case"W":return e+(1===e?"re":"e")}}}),e.defineLocale("fr-ch",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(e,a){switch(a){default:case"M":case"Q":case"D":case"DDD":case"d":return e+(1===e?"er":"e");case"w":case"W":return e+(1===e?"re":"e")}},week:{dow:1,doy:4}});var m=/(janv\.?|f\xe9vr\.?|mars|avr\.?|mai|juin|juil\.?|ao\xfbt|sept\.?|oct\.?|nov\.?|d\xe9c\.?|janvier|f\xe9vrier|mars|avril|mai|juin|juillet|ao\xfbt|septembre|octobre|novembre|d\xe9cembre)/i,d=[/^janv/i,/^f\xe9vr/i,/^mars/i,/^avr/i,/^mai/i,/^juin/i,/^juil/i,/^ao\xfbt/i,/^sept/i,/^oct/i,/^nov/i,/^d\xe9c/i],Me=(e.defineLocale("fr",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsRegex:m,monthsShortRegex:m,monthsStrictRegex:/^(janvier|f\xe9vrier|mars|avril|mai|juin|juillet|ao\xfbt|septembre|octobre|novembre|d\xe9cembre)/i,monthsShortStrictRegex:/(janv\.?|f\xe9vr\.?|mars|avr\.?|mai|juin|juil\.?|ao\xfbt|sept\.?|oct\.?|nov\.?|d\xe9c\.?)/i,monthsParse:d,longMonthsParse:d,shortMonthsParse:d,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",w:"une semaine",ww:"%d semaines",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|)/,ordinal:function(e,a){switch(a){case"D":return e+(1===e?"er":"");default:case"M":case"Q":case"DDD":case"d":return e+(1===e?"er":"e");case"w":case"W":return e+(1===e?"re":"e")}},week:{dow:1,doy:4}}),"jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_")),Le="jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_");e.defineLocale("fy",{months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:function(e,a){return e?(/-MMM-/.test(a)?Le:Me)[e.month()]:Me},monthsParseExact:!0,weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),weekdaysShort:"si._mo._ti._wo._to._fr._so.".split("_"),weekdaysMin:"Si_Mo_Ti_Wo_To_Fr_So".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[hjoed om] LT",nextDay:"[moarn om] LT",nextWeek:"dddd [om] LT",lastDay:"[juster om] LT",lastWeek:"[\xf4fr\xfbne] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oer %s",past:"%s lyn",s:"in pear sekonden",ss:"%d sekonden",m:"ien min\xfat",mm:"%d minuten",h:"ien oere",hh:"%d oeren",d:"ien dei",dd:"%d dagen",M:"ien moanne",MM:"%d moannen",y:"ien jier",yy:"%d jierren"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||20<=e?"ste":"de")},week:{dow:1,doy:4}}),e.defineLocale("ga",{months:["Ean\xe1ir","Feabhra","M\xe1rta","Aibre\xe1n","Bealtaine","Meitheamh","I\xfail","L\xfanasa","Me\xe1n F\xf3mhair","Deireadh F\xf3mhair","Samhain","Nollaig"],monthsShort:["Ean","Feabh","M\xe1rt","Aib","Beal","Meith","I\xfail","L\xfan","M.F.","D.F.","Samh","Noll"],monthsParseExact:!0,weekdays:["D\xe9 Domhnaigh","D\xe9 Luain","D\xe9 M\xe1irt","D\xe9 C\xe9adaoin","D\xe9ardaoin","D\xe9 hAoine","D\xe9 Sathairn"],weekdaysShort:["Domh","Luan","M\xe1irt","C\xe9ad","D\xe9ar","Aoine","Sath"],weekdaysMin:["Do","Lu","M\xe1","C\xe9","D\xe9","A","Sa"],longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Inniu ag] LT",nextDay:"[Am\xe1rach ag] LT",nextWeek:"dddd [ag] LT",lastDay:"[Inn\xe9 ag] LT",lastWeek:"dddd [seo caite] [ag] LT",sameElse:"L"},relativeTime:{future:"i %s",past:"%s \xf3 shin",s:"c\xfapla soicind",ss:"%d soicind",m:"n\xf3im\xe9ad",mm:"%d n\xf3im\xe9ad",h:"uair an chloig",hh:"%d uair an chloig",d:"l\xe1",dd:"%d l\xe1",M:"m\xed",MM:"%d m\xedonna",y:"bliain",yy:"%d bliain"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(e){return e+(1===e?"d":e%10==2?"na":"mh")},week:{dow:1,doy:4}});function y(e,a,_,s){e={s:["\u0925\u094b\u0921\u092f\u093e \u0938\u0945\u0915\u0902\u0921\u093e\u0902\u0928\u0940","\u0925\u094b\u0921\u0947 \u0938\u0945\u0915\u0902\u0921"],ss:[e+" \u0938\u0945\u0915\u0902\u0921\u093e\u0902\u0928\u0940",e+" \u0938\u0945\u0915\u0902\u0921"],m:["\u090f\u0915\u093e \u092e\u093f\u0923\u091f\u093e\u0928","\u090f\u0915 \u092e\u093f\u0928\u0942\u091f"],mm:[e+" \u092e\u093f\u0923\u091f\u093e\u0902\u0928\u0940",e+" \u092e\u093f\u0923\u091f\u093e\u0902"],h:["\u090f\u0915\u093e \u0935\u0930\u093e\u0928","\u090f\u0915 \u0935\u0930"],hh:[e+" \u0935\u0930\u093e\u0902\u0928\u0940",e+" \u0935\u0930\u093e\u0902"],d:["\u090f\u0915\u093e \u0926\u093f\u0938\u093e\u0928","\u090f\u0915 \u0926\u0940\u0938"],dd:[e+" \u0926\u093f\u0938\u093e\u0902\u0928\u0940",e+" \u0926\u0940\u0938"],M:["\u090f\u0915\u093e \u092e\u094d\u0939\u092f\u0928\u094d\u092f\u093e\u0928","\u090f\u0915 \u092e\u094d\u0939\u092f\u0928\u094b"],MM:[e+" \u092e\u094d\u0939\u092f\u0928\u094d\u092f\u093e\u0928\u0940",e+" \u092e\u094d\u0939\u092f\u0928\u0947"],y:["\u090f\u0915\u093e \u0935\u0930\u094d\u0938\u093e\u0928","\u090f\u0915 \u0935\u0930\u094d\u0938"],yy:[e+" \u0935\u0930\u094d\u0938\u093e\u0902\u0928\u0940",e+" \u0935\u0930\u094d\u0938\u093e\u0902"]};return s?e[_][0]:e[_][1]}function c(e,a,_,s){e={s:["thoddea sekondamni","thodde sekond"],ss:[e+" sekondamni",e+" sekond"],m:["eka mintan","ek minut"],mm:[e+" mintamni",e+" mintam"],h:["eka voran","ek vor"],hh:[e+" voramni",e+" voram"],d:["eka disan","ek dis"],dd:[e+" disamni",e+" dis"],M:["eka mhoinean","ek mhoino"],MM:[e+" mhoineamni",e+" mhoine"],y:["eka vorsan","ek voros"],yy:[e+" vorsamni",e+" vorsam"]};return s?e[_][0]:e[_][1]}e.defineLocale("gd",{months:["Am Faoilleach","An Gearran","Am M\xe0rt","An Giblean","An C\xe8itean","An t-\xd2gmhios","An t-Iuchar","An L\xf9nastal","An t-Sultain","An D\xe0mhair","An t-Samhain","An D\xf9bhlachd"],monthsShort:["Faoi","Gear","M\xe0rt","Gibl","C\xe8it","\xd2gmh","Iuch","L\xf9n","Sult","D\xe0mh","Samh","D\xf9bh"],monthsParseExact:!0,weekdays:["Did\xf2mhnaich","Diluain","Dim\xe0irt","Diciadain","Diardaoin","Dihaoine","Disathairne"],weekdaysShort:["Did","Dil","Dim","Dic","Dia","Dih","Dis"],weekdaysMin:["D\xf2","Lu","M\xe0","Ci","Ar","Ha","Sa"],longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[An-diugh aig] LT",nextDay:"[A-m\xe0ireach aig] LT",nextWeek:"dddd [aig] LT",lastDay:"[An-d\xe8 aig] LT",lastWeek:"dddd [seo chaidh] [aig] LT",sameElse:"L"},relativeTime:{future:"ann an %s",past:"bho chionn %s",s:"beagan diogan",ss:"%d diogan",m:"mionaid",mm:"%d mionaidean",h:"uair",hh:"%d uairean",d:"latha",dd:"%d latha",M:"m\xecos",MM:"%d m\xecosan",y:"bliadhna",yy:"%d bliadhna"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(e){return e+(1===e?"d":e%10==2?"na":"mh")},week:{dow:1,doy:4}}),e.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xu\xf1o_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xu\xf1._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_m\xe9rcores_xoves_venres_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._m\xe9r._xov._ven._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_m\xe9_xo_ve_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextDay:function(){return"[ma\xf1\xe1 "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"\xe1s":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"\xe1":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"\xe1s":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(e){return 0===e.indexOf("un")?"n"+e:"en "+e},past:"hai %s",s:"uns segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}}),e.defineLocale("gom-deva",{months:{standalone:"\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u090f\u092a\u094d\u0930\u0940\u0932_\u092e\u0947_\u091c\u0942\u0928_\u091c\u0941\u0932\u092f_\u0911\u0917\u0938\u094d\u091f_\u0938\u092a\u094d\u091f\u0947\u0902\u092c\u0930_\u0911\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930_\u0921\u093f\u0938\u0947\u0902\u092c\u0930".split("_"),format:"\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940\u091a\u094d\u092f\u093e_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940\u091a\u094d\u092f\u093e_\u092e\u093e\u0930\u094d\u091a\u093e\u091a\u094d\u092f\u093e_\u090f\u092a\u094d\u0930\u0940\u0932\u093e\u091a\u094d\u092f\u093e_\u092e\u0947\u092f\u093e\u091a\u094d\u092f\u093e_\u091c\u0942\u0928\u093e\u091a\u094d\u092f\u093e_\u091c\u0941\u0932\u092f\u093e\u091a\u094d\u092f\u093e_\u0911\u0917\u0938\u094d\u091f\u093e\u091a\u094d\u092f\u093e_\u0938\u092a\u094d\u091f\u0947\u0902\u092c\u0930\u093e\u091a\u094d\u092f\u093e_\u0911\u0915\u094d\u091f\u094b\u092c\u0930\u093e\u091a\u094d\u092f\u093e_\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930\u093e\u091a\u094d\u092f\u093e_\u0921\u093f\u0938\u0947\u0902\u092c\u0930\u093e\u091a\u094d\u092f\u093e".split("_"),isFormat:/MMMM(\s)+D[oD]?/},monthsShort:"\u091c\u093e\u0928\u0947._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a_\u090f\u092a\u094d\u0930\u0940._\u092e\u0947_\u091c\u0942\u0928_\u091c\u0941\u0932._\u0911\u0917._\u0938\u092a\u094d\u091f\u0947\u0902._\u0911\u0915\u094d\u091f\u094b._\u0928\u094b\u0935\u094d\u0939\u0947\u0902._\u0921\u093f\u0938\u0947\u0902.".split("_"),monthsParseExact:!0,weekdays:"\u0906\u092f\u0924\u093e\u0930_\u0938\u094b\u092e\u093e\u0930_\u092e\u0902\u0917\u0933\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u092c\u093f\u0930\u0947\u0938\u094d\u0924\u093e\u0930_\u0938\u0941\u0915\u094d\u0930\u093e\u0930_\u0936\u0947\u0928\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0906\u092f\u0924._\u0938\u094b\u092e._\u092e\u0902\u0917\u0933._\u092c\u0941\u0927._\u092c\u094d\u0930\u0947\u0938\u094d\u0924._\u0938\u0941\u0915\u094d\u0930._\u0936\u0947\u0928.".split("_"),weekdaysMin:"\u0906_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u092c\u094d\u0930\u0947_\u0938\u0941_\u0936\u0947".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A h:mm [\u0935\u093e\u091c\u0924\u093e\u0902]",LTS:"A h:mm:ss [\u0935\u093e\u091c\u0924\u093e\u0902]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [\u0935\u093e\u091c\u0924\u093e\u0902]",LLLL:"dddd, MMMM Do, YYYY, A h:mm [\u0935\u093e\u091c\u0924\u093e\u0902]",llll:"ddd, D MMM YYYY, A h:mm [\u0935\u093e\u091c\u0924\u093e\u0902]"},calendar:{sameDay:"[\u0906\u092f\u091c] LT",nextDay:"[\u092b\u093e\u0932\u094d\u092f\u093e\u0902] LT",nextWeek:"[\u092b\u0941\u0921\u0932\u094b] dddd[,] LT",lastDay:"[\u0915\u093e\u0932] LT",lastWeek:"[\u092b\u093e\u091f\u0932\u094b] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s \u0906\u0926\u0940\u0902",s:y,ss:y,m:y,mm:y,h:y,hh:y,d:y,dd:y,M:y,MM:y,y:y,yy:y},dayOfMonthOrdinalParse:/\d{1,2}(\u0935\u0947\u0930)/,ordinal:function(e,a){switch(a){case"D":return e+"\u0935\u0947\u0930";default:case"M":case"Q":case"DDD":case"d":case"w":case"W":return e}},week:{dow:0,doy:3},meridiemParse:/\u0930\u093e\u0924\u0940|\u0938\u0915\u093e\u0933\u0940\u0902|\u0926\u0928\u092a\u093e\u0930\u093e\u0902|\u0938\u093e\u0902\u091c\u0947/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0930\u093e\u0924\u0940"===a?e<4?e:e+12:"\u0938\u0915\u093e\u0933\u0940\u0902"===a?e:"\u0926\u0928\u092a\u093e\u0930\u093e\u0902"===a?12<e?e:e+12:"\u0938\u093e\u0902\u091c\u0947"===a?e+12:void 0},meridiem:function(e,a,_){return e<4?"\u0930\u093e\u0924\u0940":e<12?"\u0938\u0915\u093e\u0933\u0940\u0902":e<16?"\u0926\u0928\u092a\u093e\u0930\u093e\u0902":e<20?"\u0938\u093e\u0902\u091c\u0947":"\u0930\u093e\u0924\u0940"}}),e.defineLocale("gom-latn",{months:{standalone:"Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr".split("_"),format:"Janerachea_Febrerachea_Marsachea_Abrilachea_Maiachea_Junachea_Julaiachea_Agostachea_Setembrachea_Otubrachea_Novembrachea_Dezembrachea".split("_"),isFormat:/MMMM(\s)+D[oD]?/},monthsShort:"Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Aitar_Somar_Mongllar_Budhvar_Birestar_Sukrar_Son'var".split("_"),weekdaysShort:"Ait._Som._Mon._Bud._Bre._Suk._Son.".split("_"),weekdaysMin:"Ai_Sm_Mo_Bu_Br_Su_Sn".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A h:mm [vazta]",LTS:"A h:mm:ss [vazta]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [vazta]",LLLL:"dddd, MMMM Do, YYYY, A h:mm [vazta]",llll:"ddd, D MMM YYYY, A h:mm [vazta]"},calendar:{sameDay:"[Aiz] LT",nextDay:"[Faleam] LT",nextWeek:"[Fuddlo] dddd[,] LT",lastDay:"[Kal] LT",lastWeek:"[Fattlo] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s adim",s:c,ss:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},dayOfMonthOrdinalParse:/\d{1,2}(er)/,ordinal:function(e,a){switch(a){case"D":return e+"er";default:case"M":case"Q":case"DDD":case"d":case"w":case"W":return e}},week:{dow:0,doy:3},meridiemParse:/rati|sokallim|donparam|sanje/,meridiemHour:function(e,a){return 12===e&&(e=0),"rati"===a?e<4?e:e+12:"sokallim"===a?e:"donparam"===a?12<e?e:e+12:"sanje"===a?e+12:void 0},meridiem:function(e,a,_){return e<4?"rati":e<12?"sokallim":e<16?"donparam":e<20?"sanje":"rati"}});var Ye={1:"\u0ae7",2:"\u0ae8",3:"\u0ae9",4:"\u0aea",5:"\u0aeb",6:"\u0aec",7:"\u0aed",8:"\u0aee",9:"\u0aef",0:"\u0ae6"},he={"\u0ae7":"1","\u0ae8":"2","\u0ae9":"3","\u0aea":"4","\u0aeb":"5","\u0aec":"6","\u0aed":"7","\u0aee":"8","\u0aef":"9","\u0ae6":"0"},ye=(e.defineLocale("gu",{months:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1\u0a86\u0ab0\u0ac0_\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1\u0a86\u0ab0\u0ac0_\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf\u0ab2_\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe\u0a88_\u0a91\u0a97\u0ab8\u0acd\u0a9f_\u0ab8\u0aaa\u0acd\u0a9f\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0a91\u0a95\u0acd\u0a9f\u0acd\u0aac\u0ab0_\u0aa8\u0ab5\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0aa1\u0abf\u0ab8\u0ac7\u0aae\u0acd\u0aac\u0ab0".split("_"),monthsShort:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1._\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1._\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf._\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe._\u0a91\u0a97._\u0ab8\u0aaa\u0acd\u0a9f\u0ac7._\u0a91\u0a95\u0acd\u0a9f\u0acd._\u0aa8\u0ab5\u0ac7._\u0aa1\u0abf\u0ab8\u0ac7.".split("_"),monthsParseExact:!0,weekdays:"\u0ab0\u0ab5\u0abf\u0ab5\u0abe\u0ab0_\u0ab8\u0acb\u0aae\u0ab5\u0abe\u0ab0_\u0aae\u0a82\u0a97\u0ab3\u0ab5\u0abe\u0ab0_\u0aac\u0ac1\u0aa7\u0acd\u0ab5\u0abe\u0ab0_\u0a97\u0ac1\u0ab0\u0ac1\u0ab5\u0abe\u0ab0_\u0ab6\u0ac1\u0a95\u0acd\u0ab0\u0ab5\u0abe\u0ab0_\u0ab6\u0aa8\u0abf\u0ab5\u0abe\u0ab0".split("_"),weekdaysShort:"\u0ab0\u0ab5\u0abf_\u0ab8\u0acb\u0aae_\u0aae\u0a82\u0a97\u0ab3_\u0aac\u0ac1\u0aa7\u0acd_\u0a97\u0ac1\u0ab0\u0ac1_\u0ab6\u0ac1\u0a95\u0acd\u0ab0_\u0ab6\u0aa8\u0abf".split("_"),weekdaysMin:"\u0ab0_\u0ab8\u0acb_\u0aae\u0a82_\u0aac\u0ac1_\u0a97\u0ac1_\u0ab6\u0ac1_\u0ab6".split("_"),longDateFormat:{LT:"A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LTS:"A h:mm:ss \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LLLL:"dddd, D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7"},calendar:{sameDay:"[\u0a86\u0a9c] LT",nextDay:"[\u0a95\u0abe\u0ab2\u0ac7] LT",nextWeek:"dddd, LT",lastDay:"[\u0a97\u0a87\u0a95\u0abe\u0ab2\u0ac7] LT",lastWeek:"[\u0aaa\u0abe\u0a9b\u0ab2\u0abe] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0aae\u0abe",past:"%s \u0aaa\u0ab9\u0ac7\u0ab2\u0abe",s:"\u0a85\u0aae\u0ac1\u0a95 \u0aaa\u0ab3\u0acb",ss:"%d \u0ab8\u0ac7\u0a95\u0a82\u0aa1",m:"\u0a8f\u0a95 \u0aae\u0abf\u0aa8\u0abf\u0a9f",mm:"%d \u0aae\u0abf\u0aa8\u0abf\u0a9f",h:"\u0a8f\u0a95 \u0a95\u0ab2\u0abe\u0a95",hh:"%d \u0a95\u0ab2\u0abe\u0a95",d:"\u0a8f\u0a95 \u0aa6\u0abf\u0ab5\u0ab8",dd:"%d \u0aa6\u0abf\u0ab5\u0ab8",M:"\u0a8f\u0a95 \u0aae\u0ab9\u0abf\u0aa8\u0acb",MM:"%d \u0aae\u0ab9\u0abf\u0aa8\u0acb",y:"\u0a8f\u0a95 \u0ab5\u0ab0\u0acd\u0ab7",yy:"%d \u0ab5\u0ab0\u0acd\u0ab7"},preparse:function(e){return e.replace(/[\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u0ae6]/g,function(e){return he[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return Ye[e]})},meridiemParse:/\u0ab0\u0abe\u0aa4|\u0aac\u0aaa\u0acb\u0ab0|\u0ab8\u0ab5\u0abe\u0ab0|\u0ab8\u0abe\u0a82\u0a9c/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0ab0\u0abe\u0aa4"===a?e<4?e:e+12:"\u0ab8\u0ab5\u0abe\u0ab0"===a?e:"\u0aac\u0aaa\u0acb\u0ab0"===a?10<=e?e:e+12:"\u0ab8\u0abe\u0a82\u0a9c"===a?e+12:void 0},meridiem:function(e,a,_){return e<4?"\u0ab0\u0abe\u0aa4":e<10?"\u0ab8\u0ab5\u0abe\u0ab0":e<17?"\u0aac\u0aaa\u0acb\u0ab0":e<20?"\u0ab8\u0abe\u0a82\u0a9c":"\u0ab0\u0abe\u0aa4"},week:{dow:0,doy:6}}),e.defineLocale("he",{months:"\u05d9\u05e0\u05d5\u05d0\u05e8_\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05d9\u05dc_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8_\u05e1\u05e4\u05d8\u05de\u05d1\u05e8_\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8_\u05e0\u05d5\u05d1\u05de\u05d1\u05e8_\u05d3\u05e6\u05de\u05d1\u05e8".split("_"),monthsShort:"\u05d9\u05e0\u05d5\u05f3_\u05e4\u05d1\u05e8\u05f3_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05f3_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05f3_\u05e1\u05e4\u05d8\u05f3_\u05d0\u05d5\u05e7\u05f3_\u05e0\u05d5\u05d1\u05f3_\u05d3\u05e6\u05de\u05f3".split("_"),weekdays:"\u05e8\u05d0\u05e9\u05d5\u05df_\u05e9\u05e0\u05d9_\u05e9\u05dc\u05d9\u05e9\u05d9_\u05e8\u05d1\u05d9\u05e2\u05d9_\u05d7\u05de\u05d9\u05e9\u05d9_\u05e9\u05d9\u05e9\u05d9_\u05e9\u05d1\u05ea".split("_"),weekdaysShort:"\u05d0\u05f3_\u05d1\u05f3_\u05d2\u05f3_\u05d3\u05f3_\u05d4\u05f3_\u05d5\u05f3_\u05e9\u05f3".split("_"),weekdaysMin:"\u05d0_\u05d1_\u05d2_\u05d3_\u05d4_\u05d5_\u05e9".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [\u05d1]MMMM YYYY",LLL:"D [\u05d1]MMMM YYYY HH:mm",LLLL:"dddd, D [\u05d1]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[\u05d4\u05d9\u05d5\u05dd \u05d1\u05be]LT",nextDay:"[\u05de\u05d7\u05e8 \u05d1\u05be]LT",nextWeek:"dddd [\u05d1\u05e9\u05e2\u05d4] LT",lastDay:"[\u05d0\u05ea\u05de\u05d5\u05dc \u05d1\u05be]LT",lastWeek:"[\u05d1\u05d9\u05d5\u05dd] dddd [\u05d4\u05d0\u05d7\u05e8\u05d5\u05df \u05d1\u05e9\u05e2\u05d4] LT",sameElse:"L"},relativeTime:{future:"\u05d1\u05e2\u05d5\u05d3 %s",past:"\u05dc\u05e4\u05e0\u05d9 %s",s:"\u05de\u05e1\u05e4\u05e8 \u05e9\u05e0\u05d9\u05d5\u05ea",ss:"%d \u05e9\u05e0\u05d9\u05d5\u05ea",m:"\u05d3\u05e7\u05d4",mm:"%d \u05d3\u05e7\u05d5\u05ea",h:"\u05e9\u05e2\u05d4",hh:function(e){return 2===e?"\u05e9\u05e2\u05ea\u05d9\u05d9\u05dd":e+" \u05e9\u05e2\u05d5\u05ea"},d:"\u05d9\u05d5\u05dd",dd:function(e){return 2===e?"\u05d9\u05d5\u05de\u05d9\u05d9\u05dd":e+" \u05d9\u05de\u05d9\u05dd"},M:"\u05d7\u05d5\u05d3\u05e9",MM:function(e){return 2===e?"\u05d7\u05d5\u05d3\u05e9\u05d9\u05d9\u05dd":e+" \u05d7\u05d5\u05d3\u05e9\u05d9\u05dd"},y:"\u05e9\u05e0\u05d4",yy:function(e){return 2===e?"\u05e9\u05e0\u05ea\u05d9\u05d9\u05dd":e%10==0&&10!==e?e+" \u05e9\u05e0\u05d4":e+" \u05e9\u05e0\u05d9\u05dd"}},meridiemParse:/\u05d0\u05d7\u05d4"\u05e6|\u05dc\u05e4\u05e0\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8|\u05d1\u05d1\u05d5\u05e7\u05e8|\u05d1\u05e2\u05e8\u05d1/i,isPM:function(e){return/^(\u05d0\u05d7\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05d1\u05e2\u05e8\u05d1)$/.test(e)},meridiem:function(e,a,_){return e<5?"\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8":e<10?"\u05d1\u05d1\u05d5\u05e7\u05e8":e<12?_?'\u05dc\u05e4\u05e0\u05d4"\u05e6':"\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":e<18?_?'\u05d0\u05d7\u05d4"\u05e6':"\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":"\u05d1\u05e2\u05e8\u05d1"}}),{1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"}),ce={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"},r=[/^\u091c\u0928/i,/^\u092b\u093c\u0930|\u092b\u0930/i,/^\u092e\u093e\u0930\u094d\u091a/i,/^\u0905\u092a\u094d\u0930\u0948/i,/^\u092e\u0908/i,/^\u091c\u0942\u0928/i,/^\u091c\u0941\u0932/i,/^\u0905\u0917/i,/^\u0938\u093f\u0924\u0902|\u0938\u093f\u0924/i,/^\u0905\u0915\u094d\u091f\u0942/i,/^\u0928\u0935|\u0928\u0935\u0902/i,/^\u0926\u093f\u0938\u0902|\u0926\u093f\u0938/i];function k(e,a,_){var s=e+" ";switch(_){case"ss":return s+=1===e?"sekunda":2===e||3===e||4===e?"sekunde":"sekundi";case"m":return a?"jedna minuta":"jedne minute";case"mm":return s+=1!==e&&(2===e||3===e||4===e)?"minute":"minuta";case"h":return a?"jedan sat":"jednog sata";case"hh":return s+=1===e?"sat":2===e||3===e||4===e?"sata":"sati";case"dd":return s+=1===e?"dan":"dana";case"MM":return s+=1===e?"mjesec":2===e||3===e||4===e?"mjeseca":"mjeseci";case"yy":return s+=1!==e&&(2===e||3===e||4===e)?"godine":"godina"}}e.defineLocale("hi",{months:{format:"\u091c\u0928\u0935\u0930\u0940_\u092b\u093c\u0930\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948\u0932_\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0938\u094d\u0924_\u0938\u093f\u0924\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u0942\u092c\u0930_\u0928\u0935\u092e\u094d\u092c\u0930_\u0926\u093f\u0938\u092e\u094d\u092c\u0930".split("_"),standalone:"\u091c\u0928\u0935\u0930\u0940_\u092b\u0930\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948\u0932_\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0938\u094d\u0924_\u0938\u093f\u0924\u0902\u092c\u0930_\u0905\u0915\u094d\u091f\u0942\u092c\u0930_\u0928\u0935\u0902\u092c\u0930_\u0926\u093f\u0938\u0902\u092c\u0930".split("_")},monthsShort:"\u091c\u0928._\u092b\u093c\u0930._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948._\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932._\u0905\u0917._\u0938\u093f\u0924._\u0905\u0915\u094d\u091f\u0942._\u0928\u0935._\u0926\u093f\u0938.".split("_"),weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0932\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0932_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u092c\u091c\u0947",LTS:"A h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A h:mm \u092c\u091c\u0947"},monthsParse:r,longMonthsParse:r,shortMonthsParse:[/^\u091c\u0928/i,/^\u092b\u093c\u0930/i,/^\u092e\u093e\u0930\u094d\u091a/i,/^\u0905\u092a\u094d\u0930\u0948/i,/^\u092e\u0908/i,/^\u091c\u0942\u0928/i,/^\u091c\u0941\u0932/i,/^\u0905\u0917/i,/^\u0938\u093f\u0924/i,/^\u0905\u0915\u094d\u091f\u0942/i,/^\u0928\u0935/i,/^\u0926\u093f\u0938/i],monthsRegex:/^(\u091c\u0928\u0935\u0930\u0940|\u091c\u0928\.?|\u092b\u093c\u0930\u0935\u0930\u0940|\u092b\u0930\u0935\u0930\u0940|\u092b\u093c\u0930\.?|\u092e\u093e\u0930\u094d\u091a?|\u0905\u092a\u094d\u0930\u0948\u0932|\u0905\u092a\u094d\u0930\u0948\.?|\u092e\u0908?|\u091c\u0942\u0928?|\u091c\u0941\u0932\u093e\u0908|\u091c\u0941\u0932\.?|\u0905\u0917\u0938\u094d\u0924|\u0905\u0917\.?|\u0938\u093f\u0924\u092e\u094d\u092c\u0930|\u0938\u093f\u0924\u0902\u092c\u0930|\u0938\u093f\u0924\.?|\u0905\u0915\u094d\u091f\u0942\u092c\u0930|\u0905\u0915\u094d\u091f\u0942\.?|\u0928\u0935\u092e\u094d\u092c\u0930|\u0928\u0935\u0902\u092c\u0930|\u0928\u0935\.?|\u0926\u093f\u0938\u092e\u094d\u092c\u0930|\u0926\u093f\u0938\u0902\u092c\u0930|\u0926\u093f\u0938\.?)/i,monthsShortRegex:/^(\u091c\u0928\u0935\u0930\u0940|\u091c\u0928\.?|\u092b\u093c\u0930\u0935\u0930\u0940|\u092b\u0930\u0935\u0930\u0940|\u092b\u093c\u0930\.?|\u092e\u093e\u0930\u094d\u091a?|\u0905\u092a\u094d\u0930\u0948\u0932|\u0905\u092a\u094d\u0930\u0948\.?|\u092e\u0908?|\u091c\u0942\u0928?|\u091c\u0941\u0932\u093e\u0908|\u091c\u0941\u0932\.?|\u0905\u0917\u0938\u094d\u0924|\u0905\u0917\.?|\u0938\u093f\u0924\u092e\u094d\u092c\u0930|\u0938\u093f\u0924\u0902\u092c\u0930|\u0938\u093f\u0924\.?|\u0905\u0915\u094d\u091f\u0942\u092c\u0930|\u0905\u0915\u094d\u091f\u0942\.?|\u0928\u0935\u092e\u094d\u092c\u0930|\u0928\u0935\u0902\u092c\u0930|\u0928\u0935\.?|\u0926\u093f\u0938\u092e\u094d\u092c\u0930|\u0926\u093f\u0938\u0902\u092c\u0930|\u0926\u093f\u0938\.?)/i,monthsStrictRegex:/^(\u091c\u0928\u0935\u0930\u0940?|\u092b\u093c\u0930\u0935\u0930\u0940|\u092b\u0930\u0935\u0930\u0940?|\u092e\u093e\u0930\u094d\u091a?|\u0905\u092a\u094d\u0930\u0948\u0932?|\u092e\u0908?|\u091c\u0942\u0928?|\u091c\u0941\u0932\u093e\u0908?|\u0905\u0917\u0938\u094d\u0924?|\u0938\u093f\u0924\u092e\u094d\u092c\u0930|\u0938\u093f\u0924\u0902\u092c\u0930|\u0938\u093f\u0924?\.?|\u0905\u0915\u094d\u091f\u0942\u092c\u0930|\u0905\u0915\u094d\u091f\u0942\.?|\u0928\u0935\u092e\u094d\u092c\u0930|\u0928\u0935\u0902\u092c\u0930?|\u0926\u093f\u0938\u092e\u094d\u092c\u0930|\u0926\u093f\u0938\u0902\u092c\u0930?)/i,monthsShortStrictRegex:/^(\u091c\u0928\.?|\u092b\u093c\u0930\.?|\u092e\u093e\u0930\u094d\u091a?|\u0905\u092a\u094d\u0930\u0948\.?|\u092e\u0908?|\u091c\u0942\u0928?|\u091c\u0941\u0932\.?|\u0905\u0917\.?|\u0938\u093f\u0924\.?|\u0905\u0915\u094d\u091f\u0942\.?|\u0928\u0935\.?|\u0926\u093f\u0938\.?)/i,calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0915\u0932] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u0932] LT",lastWeek:"[\u092a\u093f\u091b\u0932\u0947] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u092e\u0947\u0902",past:"%s \u092a\u0939\u0932\u0947",s:"\u0915\u0941\u091b \u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0902\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u091f",mm:"%d \u092e\u093f\u0928\u091f",h:"\u090f\u0915 \u0918\u0902\u091f\u093e",hh:"%d \u0918\u0902\u091f\u0947",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u0940\u0928\u0947",MM:"%d \u092e\u0939\u0940\u0928\u0947",y:"\u090f\u0915 \u0935\u0930\u094d\u0937",yy:"%d \u0935\u0930\u094d\u0937"},preparse:function(e){return e.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(e){return ce[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return ye[e]})},meridiemParse:/\u0930\u093e\u0924|\u0938\u0941\u092c\u0939|\u0926\u094b\u092a\u0939\u0930|\u0936\u093e\u092e/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0930\u093e\u0924"===a?e<4?e:e+12:"\u0938\u0941\u092c\u0939"===a?e:"\u0926\u094b\u092a\u0939\u0930"===a?10<=e?e:e+12:"\u0936\u093e\u092e"===a?e+12:void 0},meridiem:function(e,a,_){return e<4?"\u0930\u093e\u0924":e<10?"\u0938\u0941\u092c\u0939":e<17?"\u0926\u094b\u092a\u0939\u0930":e<20?"\u0936\u093e\u092e":"\u0930\u093e\u0924"},week:{dow:0,doy:6}}),e.defineLocale("hr",{months:{format:"sije\u010dnja_velja\u010de_o\u017eujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"sije\u010danj_velja\u010da_o\u017eujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._o\u017eu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"Do MMMM YYYY",LLL:"Do MMMM YYYY H:mm",LLLL:"dddd, Do MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010der u] LT",lastWeek:function(){switch(this.day()){case 0:return"[pro\u0161lu] [nedjelju] [u] LT";case 3:return"[pro\u0161lu] [srijedu] [u] LT";case 6:return"[pro\u0161le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[pro\u0161li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:k,m:k,mm:k,h:k,hh:k,d:"dan",dd:k,M:"mjesec",MM:k,y:"godinu",yy:k},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});var ke="vas\xe1rnap h\xe9tf\u0151n kedden szerd\xe1n cs\xfct\xf6rt\xf6k\xf6n p\xe9nteken szombaton".split(" ");function D(e,a,_,s){var d=e;switch(_){case"s":return s||a?"n\xe9h\xe1ny m\xe1sodperc":"n\xe9h\xe1ny m\xe1sodperce";case"ss":return d+(s||a)?" m\xe1sodperc":" m\xe1sodperce";case"m":return"egy"+(s||a?" perc":" perce");case"mm":return d+(s||a?" perc":" perce");case"h":return"egy"+(s||a?" \xf3ra":" \xf3r\xe1ja");case"hh":return d+(s||a?" \xf3ra":" \xf3r\xe1ja");case"d":return"egy"+(s||a?" nap":" napja");case"dd":return d+(s||a?" nap":" napja");case"M":return"egy"+(s||a?" h\xf3nap":" h\xf3napja");case"MM":return d+(s||a?" h\xf3nap":" h\xf3napja");case"y":return"egy"+(s||a?" \xe9v":" \xe9ve");case"yy":return d+(s||a?" \xe9v":" \xe9ve")}return""}function De(e){return(e?"":"[m\xfalt] ")+"["+ke[this.day()]+"] LT[-kor]"}function p(e){return e%100==11||e%10!=1}function T(e,a,_,s){var d=e+" ";switch(_){case"s":return a||s?"nokkrar sek\xfandur":"nokkrum sek\xfandum";case"ss":return p(e)?d+(a||s?"sek\xfandur":"sek\xfandum"):d+"sek\xfanda";case"m":return a?"m\xedn\xfata":"m\xedn\xfatu";case"mm":return p(e)?d+(a||s?"m\xedn\xfatur":"m\xedn\xfatum"):a?d+"m\xedn\xfata":d+"m\xedn\xfatu";case"hh":return p(e)?d+(a||s?"klukkustundir":"klukkustundum"):d+"klukkustund";case"d":return a?"dagur":s?"dag":"degi";case"dd":return p(e)?a?d+"dagar":d+(s?"daga":"d\xf6gum"):a?d+"dagur":d+(s?"dag":"degi");case"M":return a?"m\xe1nu\xf0ur":s?"m\xe1nu\xf0":"m\xe1nu\xf0i";case"MM":return p(e)?a?d+"m\xe1nu\xf0ir":d+(s?"m\xe1nu\xf0i":"m\xe1nu\xf0um"):a?d+"m\xe1nu\xf0ur":d+(s?"m\xe1nu\xf0":"m\xe1nu\xf0i");case"y":return a||s?"\xe1r":"\xe1ri";case"yy":return p(e)?d+(a||s?"\xe1r":"\xe1rum"):d+(a||s?"\xe1r":"\xe1ri")}}e.defineLocale("hu",{months:"janu\xe1r_febru\xe1r_m\xe1rcius_\xe1prilis_m\xe1jus_j\xfanius_j\xfalius_augusztus_szeptember_okt\xf3ber_november_december".split("_"),monthsShort:"jan._feb._m\xe1rc._\xe1pr._m\xe1j._j\xfan._j\xfal._aug._szept._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"vas\xe1rnap_h\xe9tf\u0151_kedd_szerda_cs\xfct\xf6rt\xf6k_p\xe9ntek_szombat".split("_"),weekdaysShort:"vas_h\xe9t_kedd_sze_cs\xfct_p\xe9n_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"},meridiemParse:/de|du/i,isPM:function(e){return"u"===e.charAt(1).toLowerCase()},meridiem:function(e,a,_){return e<12?!0===_?"de":"DE":!0===_?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return De.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return De.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s m\xfalva",past:"%s",s:D,ss:D,m:D,mm:D,h:D,hh:D,d:D,dd:D,M:D,MM:D,y:D,yy:D},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),e.defineLocale("hy-am",{months:{format:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580\u056b_\u0583\u0565\u057f\u0580\u057e\u0561\u0580\u056b_\u0574\u0561\u0580\u057f\u056b_\u0561\u057a\u0580\u056b\u056c\u056b_\u0574\u0561\u0575\u056b\u057d\u056b_\u0570\u0578\u0582\u0576\u056b\u057d\u056b_\u0570\u0578\u0582\u056c\u056b\u057d\u056b_\u0585\u0563\u0578\u057d\u057f\u0578\u057d\u056b_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580\u056b_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b".split("_"),standalone:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580_\u0583\u0565\u057f\u0580\u057e\u0561\u0580_\u0574\u0561\u0580\u057f_\u0561\u057a\u0580\u056b\u056c_\u0574\u0561\u0575\u056b\u057d_\u0570\u0578\u0582\u0576\u056b\u057d_\u0570\u0578\u0582\u056c\u056b\u057d_\u0585\u0563\u0578\u057d\u057f\u0578\u057d_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580".split("_")},monthsShort:"\u0570\u0576\u057e_\u0583\u057f\u0580_\u0574\u0580\u057f_\u0561\u057a\u0580_\u0574\u0575\u057d_\u0570\u0576\u057d_\u0570\u056c\u057d_\u0585\u0563\u057d_\u057d\u057a\u057f_\u0570\u056f\u057f_\u0576\u0574\u0562_\u0564\u056f\u057f".split("_"),weekdays:"\u056f\u056b\u0580\u0561\u056f\u056b_\u0565\u0580\u056f\u0578\u0582\u0577\u0561\u0562\u0569\u056b_\u0565\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0579\u0578\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0570\u056b\u0576\u0563\u0577\u0561\u0562\u0569\u056b_\u0578\u0582\u0580\u0562\u0561\u0569_\u0577\u0561\u0562\u0561\u0569".split("_"),weekdaysShort:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),weekdaysMin:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0569.",LLL:"D MMMM YYYY \u0569., HH:mm",LLLL:"dddd, D MMMM YYYY \u0569., HH:mm"},calendar:{sameDay:"[\u0561\u0575\u057d\u0585\u0580] LT",nextDay:"[\u057e\u0561\u0572\u0568] LT",lastDay:"[\u0565\u0580\u0565\u056f] LT",nextWeek:function(){return"dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},lastWeek:function(){return"[\u0561\u0576\u0581\u0561\u056e] dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},sameElse:"L"},relativeTime:{future:"%s \u0570\u0565\u057f\u0578",past:"%s \u0561\u057c\u0561\u057b",s:"\u0574\u056b \u0584\u0561\u0576\u056b \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",ss:"%d \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",m:"\u0580\u0578\u057a\u0565",mm:"%d \u0580\u0578\u057a\u0565",h:"\u056a\u0561\u0574",hh:"%d \u056a\u0561\u0574",d:"\u0585\u0580",dd:"%d \u0585\u0580",M:"\u0561\u0574\u056b\u057d",MM:"%d \u0561\u0574\u056b\u057d",y:"\u057f\u0561\u0580\u056b",yy:"%d \u057f\u0561\u0580\u056b"},meridiemParse:/\u0563\u056b\u0577\u0565\u0580\u057e\u0561|\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561|\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576/,isPM:function(e){return/^(\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576)$/.test(e)},meridiem:function(e){return e<4?"\u0563\u056b\u0577\u0565\u0580\u057e\u0561":e<12?"\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561":e<17?"\u0581\u0565\u0580\u0565\u056f\u057e\u0561":"\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576"},dayOfMonthOrdinalParse:/\d{1,2}|\d{1,2}-(\u056b\u0576|\u0580\u0564)/,ordinal:function(e,a){switch(a){case"DDD":case"w":case"W":case"DDDo":return 1===e?e+"-\u056b\u0576":e+"-\u0580\u0564";default:return e}},week:{dow:1,doy:7}}),e.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(e,a){return 12===e&&(e=0),"pagi"===a?e:"siang"===a?11<=e?e:e+12:"sore"===a||"malam"===a?e+12:void 0},meridiem:function(e,a,_){return e<11?"pagi":e<15?"siang":e<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",ss:"%d detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:0,doy:6}}),e.defineLocale("is",{months:"jan\xfaar_febr\xfaar_mars_apr\xedl_ma\xed_j\xfan\xed_j\xfal\xed_\xe1g\xfast_september_okt\xf3ber_n\xf3vember_desember".split("_"),monthsShort:"jan_feb_mar_apr_ma\xed_j\xfan_j\xfal_\xe1g\xfa_sep_okt_n\xf3v_des".split("_"),weekdays:"sunnudagur_m\xe1nudagur_\xferi\xf0judagur_mi\xf0vikudagur_fimmtudagur_f\xf6studagur_laugardagur".split("_"),weekdaysShort:"sun_m\xe1n_\xferi_mi\xf0_fim_f\xf6s_lau".split("_"),weekdaysMin:"Su_M\xe1_\xder_Mi_Fi_F\xf6_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[\xed dag kl.] LT",nextDay:"[\xe1 morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xed g\xe6r kl.] LT",lastWeek:"[s\xed\xf0asta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s s\xed\xf0an",s:T,ss:T,m:T,mm:T,h:"klukkustund",hh:T,d:T,dd:T,M:T,MM:T,y:T,yy:T},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),e.defineLocale("it-ch",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_luned\xec_marted\xec_mercoled\xec_gioved\xec_venerd\xec_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(e){return(/^[0-9].+$/.test(e)?"tra":"in")+" "+e},past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}}),e.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_luned\xec_marted\xec_mercoled\xec_gioved\xec_venerd\xec_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:function(){return"[Oggi a"+(1<this.hours()?"lle ":0===this.hours()?" ":"ll'")+"]LT"},nextDay:function(){return"[Domani a"+(1<this.hours()?"lle ":0===this.hours()?" ":"ll'")+"]LT"},nextWeek:function(){return"dddd [a"+(1<this.hours()?"lle ":0===this.hours()?" ":"ll'")+"]LT"},lastDay:function(){return"[Ieri a"+(1<this.hours()?"lle ":0===this.hours()?" ":"ll'")+"]LT"},lastWeek:function(){switch(this.day()){case 0:return"[La scorsa] dddd [a"+(1<this.hours()?"lle ":0===this.hours()?" ":"ll'")+"]LT";default:return"[Lo scorso] dddd [a"+(1<this.hours()?"lle ":0===this.hours()?" ":"ll'")+"]LT"}},sameElse:"L"},relativeTime:{future:"tra %s",past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",w:"una settimana",ww:"%d settimane",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}}),e.defineLocale("ja",{eras:[{since:"2019-05-01",offset:1,name:"\u4ee4\u548c",narrow:"\u32ff",abbr:"R"},{since:"1989-01-08",until:"2019-04-30",offset:1,name:"\u5e73\u6210",narrow:"\u337b",abbr:"H"},{since:"1926-12-25",until:"1989-01-07",offset:1,name:"\u662d\u548c",narrow:"\u337c",abbr:"S"},{since:"1912-07-30",until:"1926-12-24",offset:1,name:"\u5927\u6b63",narrow:"\u337d",abbr:"T"},{since:"1873-01-01",until:"1912-07-29",offset:6,name:"\u660e\u6cbb",narrow:"\u337e",abbr:"M"},{since:"0001-01-01",until:"1873-12-31",offset:1,name:"\u897f\u66a6",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"\u7d00\u5143\u524d",narrow:"BC",abbr:"BC"}],eraYearOrdinalRegex:/(\u5143|\d+)\u5e74/,eraYearOrdinalParse:function(e,a){return"\u5143"===a[1]?1:parseInt(a[1]||e,10)},months:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u65e5\u66dc\u65e5_\u6708\u66dc\u65e5_\u706b\u66dc\u65e5_\u6c34\u66dc\u65e5_\u6728\u66dc\u65e5_\u91d1\u66dc\u65e5_\u571f\u66dc\u65e5".split("_"),weekdaysShort:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),weekdaysMin:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5 dddd HH:mm",l:"YYYY/MM/DD",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5(ddd) HH:mm"},meridiemParse:/\u5348\u524d|\u5348\u5f8c/i,isPM:function(e){return"\u5348\u5f8c"===e},meridiem:function(e,a,_){return e<12?"\u5348\u524d":"\u5348\u5f8c"},calendar:{sameDay:"[\u4eca\u65e5] LT",nextDay:"[\u660e\u65e5] LT",nextWeek:function(e){return e.week()!==this.week()?"[\u6765\u9031]dddd LT":"dddd LT"},lastDay:"[\u6628\u65e5] LT",lastWeek:function(e){return this.week()!==e.week()?"[\u5148\u9031]dddd LT":"dddd LT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}\u65e5/,ordinal:function(e,a){switch(a){case"y":return 1===e?"\u5143\u5e74":e+"\u5e74";case"d":case"D":case"DDD":return e+"\u65e5";default:return e}},relativeTime:{future:"%s\u5f8c",past:"%s\u524d",s:"\u6570\u79d2",ss:"%d\u79d2",m:"1\u5206",mm:"%d\u5206",h:"1\u6642\u9593",hh:"%d\u6642\u9593",d:"1\u65e5",dd:"%d\u65e5",M:"1\u30f6\u6708",MM:"%d\u30f6\u6708",y:"1\u5e74",yy:"%d\u5e74"}}),e.defineLocale("jv",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des".split("_"),weekdays:"Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu".split("_"),weekdaysShort:"Min_Sen_Sel_Reb_Kem_Jem_Sep".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sp".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/enjing|siyang|sonten|ndalu/,meridiemHour:function(e,a){return 12===e&&(e=0),"enjing"===a?e:"siyang"===a?11<=e?e:e+12:"sonten"===a||"ndalu"===a?e+12:void 0},meridiem:function(e,a,_){return e<11?"enjing":e<15?"siyang":e<19?"sonten":"ndalu"},calendar:{sameDay:"[Dinten puniko pukul] LT",nextDay:"[Mbenjang pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kala wingi pukul] LT",lastWeek:"dddd [kepengker pukul] LT",sameElse:"L"},relativeTime:{future:"wonten ing %s",past:"%s ingkang kepengker",s:"sawetawis detik",ss:"%d detik",m:"setunggal menit",mm:"%d menit",h:"setunggal jam",hh:"%d jam",d:"sedinten",dd:"%d dinten",M:"sewulan",MM:"%d wulan",y:"setaun",yy:"%d taun"},week:{dow:1,doy:7}}),e.defineLocale("ka",{months:"\u10d8\u10d0\u10dc\u10d5\u10d0\u10e0\u10d8_\u10d7\u10d4\u10d1\u10d4\u10e0\u10d5\u10d0\u10da\u10d8_\u10db\u10d0\u10e0\u10e2\u10d8_\u10d0\u10de\u10e0\u10d8\u10da\u10d8_\u10db\u10d0\u10d8\u10e1\u10d8_\u10d8\u10d5\u10dc\u10d8\u10e1\u10d8_\u10d8\u10d5\u10da\u10d8\u10e1\u10d8_\u10d0\u10d2\u10d5\u10d8\u10e1\u10e2\u10dd_\u10e1\u10d4\u10e5\u10e2\u10d4\u10db\u10d1\u10d4\u10e0\u10d8_\u10dd\u10e5\u10e2\u10dd\u10db\u10d1\u10d4\u10e0\u10d8_\u10dc\u10dd\u10d4\u10db\u10d1\u10d4\u10e0\u10d8_\u10d3\u10d4\u10d9\u10d4\u10db\u10d1\u10d4\u10e0\u10d8".split("_"),monthsShort:"\u10d8\u10d0\u10dc_\u10d7\u10d4\u10d1_\u10db\u10d0\u10e0_\u10d0\u10de\u10e0_\u10db\u10d0\u10d8_\u10d8\u10d5\u10dc_\u10d8\u10d5\u10da_\u10d0\u10d2\u10d5_\u10e1\u10d4\u10e5_\u10dd\u10e5\u10e2_\u10dc\u10dd\u10d4_\u10d3\u10d4\u10d9".split("_"),weekdays:{standalone:"\u10d9\u10d5\u10d8\u10e0\u10d0_\u10dd\u10e0\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10e1\u10d0\u10db\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10dd\u10d7\u10ee\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10ee\u10e3\u10d7\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10de\u10d0\u10e0\u10d0\u10e1\u10d9\u10d4\u10d5\u10d8_\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8".split("_"),format:"\u10d9\u10d5\u10d8\u10e0\u10d0\u10e1_\u10dd\u10e0\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10e1\u10d0\u10db\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10dd\u10d7\u10ee\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10ee\u10e3\u10d7\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10de\u10d0\u10e0\u10d0\u10e1\u10d9\u10d4\u10d5\u10e1_\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1".split("_"),isFormat:/(\u10ec\u10d8\u10dc\u10d0|\u10e8\u10d4\u10db\u10d3\u10d4\u10d2)/},weekdaysShort:"\u10d9\u10d5\u10d8_\u10dd\u10e0\u10e8_\u10e1\u10d0\u10db_\u10dd\u10d7\u10ee_\u10ee\u10e3\u10d7_\u10de\u10d0\u10e0_\u10e8\u10d0\u10d1".split("_"),weekdaysMin:"\u10d9\u10d5_\u10dd\u10e0_\u10e1\u10d0_\u10dd\u10d7_\u10ee\u10e3_\u10de\u10d0_\u10e8\u10d0".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u10d3\u10e6\u10d4\u10e1] LT[-\u10d6\u10d4]",nextDay:"[\u10ee\u10d5\u10d0\u10da] LT[-\u10d6\u10d4]",lastDay:"[\u10d2\u10e3\u10e8\u10d8\u10dc] LT[-\u10d6\u10d4]",nextWeek:"[\u10e8\u10d4\u10db\u10d3\u10d4\u10d2] dddd LT[-\u10d6\u10d4]",lastWeek:"[\u10ec\u10d8\u10dc\u10d0] dddd LT-\u10d6\u10d4",sameElse:"L"},relativeTime:{future:function(e){return e.replace(/(\u10ec\u10d0\u10db|\u10ec\u10e3\u10d7|\u10e1\u10d0\u10d0\u10d7|\u10ec\u10d4\u10da|\u10d3\u10e6|\u10d7\u10d5)(\u10d8|\u10d4)/,function(e,a,_){return"\u10d8"===_?a+"\u10e8\u10d8":a+_+"\u10e8\u10d8"})},past:function(e){return/(\u10ec\u10d0\u10db\u10d8|\u10ec\u10e3\u10d7\u10d8|\u10e1\u10d0\u10d0\u10d7\u10d8|\u10d3\u10e6\u10d4|\u10d7\u10d5\u10d4)/.test(e)?e.replace(/(\u10d8|\u10d4)$/,"\u10d8\u10e1 \u10ec\u10d8\u10dc"):/\u10ec\u10d4\u10da\u10d8/.test(e)?e.replace(/\u10ec\u10d4\u10da\u10d8$/,"\u10ec\u10da\u10d8\u10e1 \u10ec\u10d8\u10dc"):e},s:"\u10e0\u10d0\u10db\u10d3\u10d4\u10dc\u10d8\u10db\u10d4 \u10ec\u10d0\u10db\u10d8",ss:"%d \u10ec\u10d0\u10db\u10d8",m:"\u10ec\u10e3\u10d7\u10d8",mm:"%d \u10ec\u10e3\u10d7\u10d8",h:"\u10e1\u10d0\u10d0\u10d7\u10d8",hh:"%d \u10e1\u10d0\u10d0\u10d7\u10d8",d:"\u10d3\u10e6\u10d4",dd:"%d \u10d3\u10e6\u10d4",M:"\u10d7\u10d5\u10d4",MM:"%d \u10d7\u10d5\u10d4",y:"\u10ec\u10d4\u10da\u10d8",yy:"%d \u10ec\u10d4\u10da\u10d8"},dayOfMonthOrdinalParse:/0|1-\u10da\u10d8|\u10db\u10d4-\d{1,2}|\d{1,2}-\u10d4/,ordinal:function(e){return 0===e?e:1===e?e+"-\u10da\u10d8":e<20||e<=100&&e%20==0||e%100==0?"\u10db\u10d4-"+e:e+"-\u10d4"},week:{dow:1,doy:7}});var pe={0:"-\u0448\u0456",1:"-\u0448\u0456",2:"-\u0448\u0456",3:"-\u0448\u0456",4:"-\u0448\u0456",5:"-\u0448\u0456",6:"-\u0448\u044b",7:"-\u0448\u0456",8:"-\u0448\u0456",9:"-\u0448\u044b",10:"-\u0448\u044b",20:"-\u0448\u044b",30:"-\u0448\u044b",40:"-\u0448\u044b",50:"-\u0448\u0456",60:"-\u0448\u044b",70:"-\u0448\u0456",80:"-\u0448\u0456",90:"-\u0448\u044b",100:"-\u0448\u0456"},Te=(e.defineLocale("kk",{months:"\u049b\u0430\u04a3\u0442\u0430\u0440_\u0430\u049b\u043f\u0430\u043d_\u043d\u0430\u0443\u0440\u044b\u0437_\u0441\u04d9\u0443\u0456\u0440_\u043c\u0430\u043c\u044b\u0440_\u043c\u0430\u0443\u0441\u044b\u043c_\u0448\u0456\u043b\u0434\u0435_\u0442\u0430\u043c\u044b\u0437_\u049b\u044b\u0440\u043a\u04af\u0439\u0435\u043a_\u049b\u0430\u0437\u0430\u043d_\u049b\u0430\u0440\u0430\u0448\u0430_\u0436\u0435\u043b\u0442\u043e\u049b\u0441\u0430\u043d".split("_"),monthsShort:"\u049b\u0430\u04a3_\u0430\u049b\u043f_\u043d\u0430\u0443_\u0441\u04d9\u0443_\u043c\u0430\u043c_\u043c\u0430\u0443_\u0448\u0456\u043b_\u0442\u0430\u043c_\u049b\u044b\u0440_\u049b\u0430\u0437_\u049b\u0430\u0440_\u0436\u0435\u043b".split("_"),weekdays:"\u0436\u0435\u043a\u0441\u0435\u043d\u0431\u0456_\u0434\u04af\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u04d9\u0440\u0441\u0435\u043d\u0431\u0456_\u0431\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0436\u04b1\u043c\u0430_\u0441\u0435\u043d\u0431\u0456".split("_"),weekdaysShort:"\u0436\u0435\u043a_\u0434\u04af\u0439_\u0441\u0435\u0439_\u0441\u04d9\u0440_\u0431\u0435\u0439_\u0436\u04b1\u043c_\u0441\u0435\u043d".split("_"),weekdaysMin:"\u0436\u043a_\u0434\u0439_\u0441\u0439_\u0441\u0440_\u0431\u0439_\u0436\u043c_\u0441\u043d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u0456\u043d \u0441\u0430\u0493\u0430\u0442] LT",nextDay:"[\u0415\u0440\u0442\u0435\u04a3 \u0441\u0430\u0493\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0493\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0448\u0435 \u0441\u0430\u0493\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u0435\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u04a3] dddd [\u0441\u0430\u0493\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0456\u0448\u0456\u043d\u0434\u0435",past:"%s \u0431\u04b1\u0440\u044b\u043d",s:"\u0431\u0456\u0440\u043d\u0435\u0448\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0456\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u0431\u0456\u0440 \u0441\u0430\u0493\u0430\u0442",hh:"%d \u0441\u0430\u0493\u0430\u0442",d:"\u0431\u0456\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0456\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0456\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0448\u0456|\u0448\u044b)/,ordinal:function(e){return e+(pe[e]||pe[e%10]||pe[100<=e?100:null])},week:{dow:1,doy:7}}),{1:"\u17e1",2:"\u17e2",3:"\u17e3",4:"\u17e4",5:"\u17e5",6:"\u17e6",7:"\u17e7",8:"\u17e8",9:"\u17e9",0:"\u17e0"}),fe={"\u17e1":"1","\u17e2":"2","\u17e3":"3","\u17e4":"4","\u17e5":"5","\u17e6":"6","\u17e7":"7","\u17e8":"8","\u17e9":"9","\u17e0":"0"},we=(e.defineLocale("km",{months:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),monthsShort:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),weekdays:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),weekdaysShort:"\u17a2\u17b6_\u1785_\u17a2_\u1796_\u1796\u17d2\u179a_\u179f\u17bb_\u179f".split("_"),weekdaysMin:"\u17a2\u17b6_\u1785_\u17a2_\u1796_\u1796\u17d2\u179a_\u179f\u17bb_\u179f".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u1796\u17d2\u179a\u17b9\u1780|\u179b\u17d2\u1784\u17b6\u1785/,isPM:function(e){return"\u179b\u17d2\u1784\u17b6\u1785"===e},meridiem:function(e,a,_){return e<12?"\u1796\u17d2\u179a\u17b9\u1780":"\u179b\u17d2\u1784\u17b6\u1785"},calendar:{sameDay:"[\u1790\u17d2\u1784\u17c3\u1793\u17c1\u17c7 \u1798\u17c9\u17c4\u1784] LT",nextDay:"[\u179f\u17d2\u17a2\u17c2\u1780 \u1798\u17c9\u17c4\u1784] LT",nextWeek:"dddd [\u1798\u17c9\u17c4\u1784] LT",lastDay:"[\u1798\u17d2\u179f\u17b7\u179b\u1798\u17b7\u1789 \u1798\u17c9\u17c4\u1784] LT",lastWeek:"dddd [\u179f\u1794\u17d2\u178f\u17b6\u17a0\u17cd\u1798\u17bb\u1793] [\u1798\u17c9\u17c4\u1784] LT",sameElse:"L"},relativeTime:{future:"%s\u1791\u17c0\u178f",past:"%s\u1798\u17bb\u1793",s:"\u1794\u17c9\u17bb\u1793\u17d2\u1798\u17b6\u1793\u179c\u17b7\u1793\u17b6\u1791\u17b8",ss:"%d \u179c\u17b7\u1793\u17b6\u1791\u17b8",m:"\u1798\u17bd\u1799\u1793\u17b6\u1791\u17b8",mm:"%d \u1793\u17b6\u1791\u17b8",h:"\u1798\u17bd\u1799\u1798\u17c9\u17c4\u1784",hh:"%d \u1798\u17c9\u17c4\u1784",d:"\u1798\u17bd\u1799\u1790\u17d2\u1784\u17c3",dd:"%d \u1790\u17d2\u1784\u17c3",M:"\u1798\u17bd\u1799\u1781\u17c2",MM:"%d \u1781\u17c2",y:"\u1798\u17bd\u1799\u1786\u17d2\u1793\u17b6\u17c6",yy:"%d \u1786\u17d2\u1793\u17b6\u17c6"},dayOfMonthOrdinalParse:/\u1791\u17b8\d{1,2}/,ordinal:"\u1791\u17b8%d",preparse:function(e){return e.replace(/[\u17e1\u17e2\u17e3\u17e4\u17e5\u17e6\u17e7\u17e8\u17e9\u17e0]/g,function(e){return fe[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return Te[e]})},week:{dow:1,doy:4}}),{1:"\u0ce7",2:"\u0ce8",3:"\u0ce9",4:"\u0cea",5:"\u0ceb",6:"\u0cec",7:"\u0ced",8:"\u0cee",9:"\u0cef",0:"\u0ce6"}),ge={"\u0ce7":"1","\u0ce8":"2","\u0ce9":"3","\u0cea":"4","\u0ceb":"5","\u0cec":"6","\u0ced":"7","\u0cee":"8","\u0cef":"9","\u0ce6":"0"},He=(e.defineLocale("kn",{months:"\u0c9c\u0ca8\u0cb5\u0cb0\u0cbf_\u0cab\u0cc6\u0cac\u0ccd\u0cb0\u0cb5\u0cb0\u0cbf_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5\u0cac\u0cb0\u0ccd_\u0ca8\u0cb5\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82\u0cac\u0cb0\u0ccd".split("_"),monthsShort:"\u0c9c\u0ca8_\u0cab\u0cc6\u0cac\u0ccd\u0cb0_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5_\u0ca8\u0cb5\u0cc6\u0c82_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82".split("_"),monthsParseExact:!0,weekdays:"\u0cad\u0cbe\u0ca8\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae\u0cb5\u0cbe\u0cb0_\u0cae\u0c82\u0c97\u0cb3\u0cb5\u0cbe\u0cb0_\u0cac\u0cc1\u0ca7\u0cb5\u0cbe\u0cb0_\u0c97\u0cc1\u0cb0\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0\u0cb5\u0cbe\u0cb0_\u0cb6\u0ca8\u0cbf\u0cb5\u0cbe\u0cb0".split("_"),weekdaysShort:"\u0cad\u0cbe\u0ca8\u0cc1_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae_\u0cae\u0c82\u0c97\u0cb3_\u0cac\u0cc1\u0ca7_\u0c97\u0cc1\u0cb0\u0cc1_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0_\u0cb6\u0ca8\u0cbf".split("_"),weekdaysMin:"\u0cad\u0cbe_\u0cb8\u0cc6\u0cc2\u0cd5_\u0cae\u0c82_\u0cac\u0cc1_\u0c97\u0cc1_\u0cb6\u0cc1_\u0cb6".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c87\u0c82\u0ca6\u0cc1] LT",nextDay:"[\u0ca8\u0cbe\u0cb3\u0cc6] LT",nextWeek:"dddd, LT",lastDay:"[\u0ca8\u0cbf\u0ca8\u0ccd\u0ca8\u0cc6] LT",lastWeek:"[\u0c95\u0cc6\u0cc2\u0ca8\u0cc6\u0caf] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0ca8\u0c82\u0ca4\u0cb0",past:"%s \u0cb9\u0cbf\u0c82\u0ca6\u0cc6",s:"\u0c95\u0cc6\u0cb2\u0cb5\u0cc1 \u0c95\u0ccd\u0cb7\u0ca3\u0c97\u0cb3\u0cc1",ss:"%d \u0cb8\u0cc6\u0c95\u0cc6\u0c82\u0ca1\u0cc1\u0c97\u0cb3\u0cc1",m:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",mm:"%d \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",h:"\u0c92\u0c82\u0ca6\u0cc1 \u0c97\u0c82\u0c9f\u0cc6",hh:"%d \u0c97\u0c82\u0c9f\u0cc6",d:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca6\u0cbf\u0ca8",dd:"%d \u0ca6\u0cbf\u0ca8",M:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",MM:"%d \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",y:"\u0c92\u0c82\u0ca6\u0cc1 \u0cb5\u0cb0\u0ccd\u0cb7",yy:"%d \u0cb5\u0cb0\u0ccd\u0cb7"},preparse:function(e){return e.replace(/[\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0ce6]/g,function(e){return ge[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return we[e]})},meridiemParse:/\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf|\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6|\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8|\u0cb8\u0c82\u0c9c\u0cc6/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"===a?e<4?e:e+12:"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6"===a?e:"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8"===a?10<=e?e:e+12:"\u0cb8\u0c82\u0c9c\u0cc6"===a?e+12:void 0},meridiem:function(e,a,_){return e<4?"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf":e<10?"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6":e<17?"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8":e<20?"\u0cb8\u0c82\u0c9c\u0cc6":"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"},dayOfMonthOrdinalParse:/\d{1,2}(\u0ca8\u0cc6\u0cd5)/,ordinal:function(e){return e+"\u0ca8\u0cc6\u0cd5"},week:{dow:0,doy:6}}),e.defineLocale("ko",{months:"1\uc6d4_2\uc6d4_3\uc6d4_4\uc6d4_5\uc6d4_6\uc6d4_7\uc6d4_8\uc6d4_9\uc6d4_10\uc6d4_11\uc6d4_12\uc6d4".split("_"),monthsShort:"1\uc6d4_2\uc6d4_3\uc6d4_4\uc6d4_5\uc6d4_6\uc6d4_7\uc6d4_8\uc6d4_9\uc6d4_10\uc6d4_11\uc6d4_12\uc6d4".split("_"),weekdays:"\uc77c\uc694\uc77c_\uc6d4\uc694\uc77c_\ud654\uc694\uc77c_\uc218\uc694\uc77c_\ubaa9\uc694\uc77c_\uae08\uc694\uc77c_\ud1a0\uc694\uc77c".split("_"),weekdaysShort:"\uc77c_\uc6d4_\ud654_\uc218_\ubaa9_\uae08_\ud1a0".split("_"),weekdaysMin:"\uc77c_\uc6d4_\ud654_\uc218_\ubaa9_\uae08_\ud1a0".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY\ub144 MMMM D\uc77c",LLL:"YYYY\ub144 MMMM D\uc77c A h:mm",LLLL:"YYYY\ub144 MMMM D\uc77c dddd A h:mm",l:"YYYY.MM.DD.",ll:"YYYY\ub144 MMMM D\uc77c",lll:"YYYY\ub144 MMMM D\uc77c A h:mm",llll:"YYYY\ub144 MMMM D\uc77c dddd A h:mm"},calendar:{sameDay:"\uc624\ub298 LT",nextDay:"\ub0b4\uc77c LT",nextWeek:"dddd LT",lastDay:"\uc5b4\uc81c LT",lastWeek:"\uc9c0\ub09c\uc8fc dddd LT",sameElse:"L"},relativeTime:{future:"%s \ud6c4",past:"%s \uc804",s:"\uba87 \ucd08",ss:"%d\ucd08",m:"1\ubd84",mm:"%d\ubd84",h:"\ud55c \uc2dc\uac04",hh:"%d\uc2dc\uac04",d:"\ud558\ub8e8",dd:"%d\uc77c",M:"\ud55c \ub2ec",MM:"%d\ub2ec",y:"\uc77c \ub144",yy:"%d\ub144"},dayOfMonthOrdinalParse:/\d{1,2}(\uc77c|\uc6d4|\uc8fc)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"\uc77c";case"M":return e+"\uc6d4";case"w":case"W":return e+"\uc8fc";default:return e}},meridiemParse:/\uc624\uc804|\uc624\ud6c4/,isPM:function(e){return"\uc624\ud6c4"===e},meridiem:function(e,a,_){return e<12?"\uc624\uc804":"\uc624\ud6c4"}}),{1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"}),be={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},n=["\u06a9\u0627\u0646\u0648\u0646\u06cc \u062f\u0648\u0648\u06d5\u0645","\u0634\u0648\u0628\u0627\u062a","\u0626\u0627\u0632\u0627\u0631","\u0646\u06cc\u0633\u0627\u0646","\u0626\u0627\u06cc\u0627\u0631","\u062d\u0648\u0632\u06d5\u06cc\u0631\u0627\u0646","\u062a\u06d5\u0645\u0645\u0648\u0632","\u0626\u0627\u0628","\u0626\u06d5\u06cc\u0644\u0648\u0648\u0644","\u062a\u0634\u0631\u06cc\u0646\u06cc \u06cc\u06d5\u0643\u06d5\u0645","\u062a\u0634\u0631\u06cc\u0646\u06cc \u062f\u0648\u0648\u06d5\u0645","\u0643\u0627\u0646\u0648\u0646\u06cc \u06cc\u06d5\u06a9\u06d5\u0645"],Se=(e.defineLocale("ku",{months:n,monthsShort:n,weekdays:"\u06cc\u0647\u200c\u0643\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u062f\u0648\u0648\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u0633\u06ce\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u0686\u0648\u0627\u0631\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u067e\u06ce\u0646\u062c\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u0647\u0647\u200c\u06cc\u0646\u06cc_\u0634\u0647\u200c\u0645\u0645\u0647\u200c".split("_"),weekdaysShort:"\u06cc\u0647\u200c\u0643\u0634\u0647\u200c\u0645_\u062f\u0648\u0648\u0634\u0647\u200c\u0645_\u0633\u06ce\u0634\u0647\u200c\u0645_\u0686\u0648\u0627\u0631\u0634\u0647\u200c\u0645_\u067e\u06ce\u0646\u062c\u0634\u0647\u200c\u0645_\u0647\u0647\u200c\u06cc\u0646\u06cc_\u0634\u0647\u200c\u0645\u0645\u0647\u200c".split("_"),weekdaysMin:"\u06cc_\u062f_\u0633_\u0686_\u067e_\u0647_\u0634".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u0626\u06ce\u0648\u0627\u0631\u0647\u200c|\u0628\u0647\u200c\u06cc\u0627\u0646\u06cc/,isPM:function(e){return/\u0626\u06ce\u0648\u0627\u0631\u0647\u200c/.test(e)},meridiem:function(e,a,_){return e<12?"\u0628\u0647\u200c\u06cc\u0627\u0646\u06cc":"\u0626\u06ce\u0648\u0627\u0631\u0647\u200c"},calendar:{sameDay:"[\u0626\u0647\u200c\u0645\u0631\u06c6 \u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",nextDay:"[\u0628\u0647\u200c\u06cc\u0627\u0646\u06cc \u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",nextWeek:"dddd [\u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",lastDay:"[\u062f\u0648\u06ce\u0646\u06ce \u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",lastWeek:"dddd [\u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",sameElse:"L"},relativeTime:{future:"\u0644\u0647\u200c %s",past:"%s",s:"\u0686\u0647\u200c\u0646\u062f \u0686\u0631\u0643\u0647\u200c\u06cc\u0647\u200c\u0643",ss:"\u0686\u0631\u0643\u0647\u200c %d",m:"\u06cc\u0647\u200c\u0643 \u062e\u0648\u0644\u0647\u200c\u0643",mm:"%d \u062e\u0648\u0644\u0647\u200c\u0643",h:"\u06cc\u0647\u200c\u0643 \u0643\u0627\u062a\u0698\u0645\u06ce\u0631",hh:"%d \u0643\u0627\u062a\u0698\u0645\u06ce\u0631",d:"\u06cc\u0647\u200c\u0643 \u0695\u06c6\u0698",dd:"%d \u0695\u06c6\u0698",M:"\u06cc\u0647\u200c\u0643 \u0645\u0627\u0646\u06af",MM:"%d \u0645\u0627\u0646\u06af",y:"\u06cc\u0647\u200c\u0643 \u0633\u0627\u06b5",yy:"%d \u0633\u0627\u06b5"},preparse:function(e){return e.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(e){return be[e]}).replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return He[e]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}}),{0:"-\u0447\u04af",1:"-\u0447\u0438",2:"-\u0447\u0438",3:"-\u0447\u04af",4:"-\u0447\u04af",5:"-\u0447\u0438",6:"-\u0447\u044b",7:"-\u0447\u0438",8:"-\u0447\u0438",9:"-\u0447\u0443",10:"-\u0447\u0443",20:"-\u0447\u044b",30:"-\u0447\u0443",40:"-\u0447\u044b",50:"-\u0447\u04af",60:"-\u0447\u044b",70:"-\u0447\u0438",80:"-\u0447\u0438",90:"-\u0447\u0443",100:"-\u0447\u04af"});function ve(e,a,_,s){var d={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return a?d[_][0]:d[_][1]}function je(e){if(e=parseInt(e,10),isNaN(e))return!1;if(e<0)return!0;if(e<10)return 4<=e&&e<=7;var a;if(e<100)return je(0==(a=e%10)?e/10:a);if(e<1e4){for(;10<=e;)e/=10;return je(e)}return je(e/=1e3)}e.defineLocale("ky",{months:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u0416\u0435\u043a\u0448\u0435\u043c\u0431\u0438_\u0414\u04af\u0439\u0448\u04e9\u043c\u0431\u04af_\u0428\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0428\u0430\u0440\u0448\u0435\u043c\u0431\u0438_\u0411\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0416\u0443\u043c\u0430_\u0418\u0448\u0435\u043c\u0431\u0438".split("_"),weekdaysShort:"\u0416\u0435\u043a_\u0414\u04af\u0439_\u0428\u0435\u0439_\u0428\u0430\u0440_\u0411\u0435\u0439_\u0416\u0443\u043c_\u0418\u0448\u0435".split("_"),weekdaysMin:"\u0416\u043a_\u0414\u0439_\u0428\u0439_\u0428\u0440_\u0411\u0439_\u0416\u043c_\u0418\u0448".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u04af\u043d \u0441\u0430\u0430\u0442] LT",nextDay:"[\u042d\u0440\u0442\u0435\u04a3 \u0441\u0430\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0447\u044d\u044d \u0441\u0430\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u04e9\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u043d] dddd [\u043a\u04af\u043d\u04af] [\u0441\u0430\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0438\u0447\u0438\u043d\u0434\u0435",past:"%s \u043c\u0443\u0440\u0443\u043d",s:"\u0431\u0438\u0440\u043d\u0435\u0447\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0438\u0440 \u043c\u04af\u043d\u04e9\u0442",mm:"%d \u043c\u04af\u043d\u04e9\u0442",h:"\u0431\u0438\u0440 \u0441\u0430\u0430\u0442",hh:"%d \u0441\u0430\u0430\u0442",d:"\u0431\u0438\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0438\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0438\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0447\u0438|\u0447\u044b|\u0447\u04af|\u0447\u0443)/,ordinal:function(e){return e+(Se[e]||Se[e%10]||Se[100<=e?100:null])},week:{dow:1,doy:7}}),e.defineLocale("lb",{months:"Januar_Februar_M\xe4erz_Abr\xebll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_M\xe9indeg_D\xebnschdeg_M\xebttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._M\xe9._D\xeb._M\xeb._Do._Fr._Sa.".split("_"),weekdaysMin:"So_M\xe9_D\xeb_M\xeb_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[G\xebschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:function(e){return je(e.substr(0,e.indexOf(" ")))?"a "+e:"an "+e},past:function(e){return je(e.substr(0,e.indexOf(" ")))?"viru "+e:"virun "+e},s:"e puer Sekonnen",ss:"%d Sekonnen",m:ve,mm:"%d Minutten",h:ve,hh:"%d Stonnen",d:ve,dd:"%d Deeg",M:ve,MM:"%d M\xe9int",y:ve,yy:"%d Joer"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),e.defineLocale("lo",{months:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),monthsShort:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),weekdays:"\u0ead\u0eb2\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysShort:"\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysMin:"\u0e97_\u0e88_\u0ead\u0e84_\u0e9e_\u0e9e\u0eab_\u0eaa\u0e81_\u0eaa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"\u0ea7\u0eb1\u0e99dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2|\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87/,isPM:function(e){return"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"===e},meridiem:function(e,a,_){return e<12?"\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2":"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"},calendar:{sameDay:"[\u0ea1\u0eb7\u0ec9\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextDay:"[\u0ea1\u0eb7\u0ec9\u0ead\u0eb7\u0ec8\u0e99\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0edc\u0ec9\u0eb2\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastDay:"[\u0ea1\u0eb7\u0ec9\u0ea7\u0eb2\u0e99\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0ec1\u0ea5\u0ec9\u0ea7\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",sameElse:"L"},relativeTime:{future:"\u0ead\u0eb5\u0e81 %s",past:"%s\u0e9c\u0ec8\u0eb2\u0e99\u0ea1\u0eb2",s:"\u0e9a\u0ecd\u0ec8\u0ec0\u0e97\u0ebb\u0ec8\u0eb2\u0ec3\u0e94\u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",ss:"%d \u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",m:"1 \u0e99\u0eb2\u0e97\u0eb5",mm:"%d \u0e99\u0eb2\u0e97\u0eb5",h:"1 \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",hh:"%d \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",d:"1 \u0ea1\u0eb7\u0ec9",dd:"%d \u0ea1\u0eb7\u0ec9",M:"1 \u0ec0\u0e94\u0eb7\u0ead\u0e99",MM:"%d \u0ec0\u0e94\u0eb7\u0ead\u0e99",y:"1 \u0e9b\u0eb5",yy:"%d \u0e9b\u0eb5"},dayOfMonthOrdinalParse:/(\u0e97\u0eb5\u0ec8)\d{1,2}/,ordinal:function(e){return"\u0e97\u0eb5\u0ec8"+e}});var xe={ss:"sekund\u0117_sekund\u017ei\u0173_sekundes",m:"minut\u0117_minut\u0117s_minut\u0119",mm:"minut\u0117s_minu\u010di\u0173_minutes",h:"valanda_valandos_valand\u0105",hh:"valandos_valand\u0173_valandas",d:"diena_dienos_dien\u0105",dd:"dienos_dien\u0173_dienas",M:"m\u0117nuo_m\u0117nesio_m\u0117nes\u012f",MM:"m\u0117nesiai_m\u0117nesi\u0173_m\u0117nesius",y:"metai_met\u0173_metus",yy:"metai_met\u0173_metus"};function Pe(e,a,_,s){return a?f(_)[0]:s?f(_)[1]:f(_)[2]}function We(e){return e%10==0||10<e&&e<20}function f(e){return xe[e].split("_")}function Ae(e,a,_,s){var d=e+" ";return 1===e?d+Pe(0,a,_[0],s):a?d+(We(e)?f(_)[1]:f(_)[0]):s?d+f(_)[1]:d+(We(e)?f(_)[1]:f(_)[2])}e.defineLocale("lt",{months:{format:"sausio_vasario_kovo_baland\u017eio_gegu\u017e\u0117s_bir\u017eelio_liepos_rugpj\u016b\u010dio_rugs\u0117jo_spalio_lapkri\u010dio_gruod\u017eio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegu\u017e\u0117_bir\u017eelis_liepa_rugpj\u016btis_rugs\u0117jis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadien\u012f_pirmadien\u012f_antradien\u012f_tre\u010diadien\u012f_ketvirtadien\u012f_penktadien\u012f_\u0161e\u0161tadien\u012f".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_tre\u010diadienis_ketvirtadienis_penktadienis_\u0161e\u0161tadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_\u0160e\u0161".split("_"),weekdaysMin:"S_P_A_T_K_Pn_\u0160".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[\u0160iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Pra\u0117jus\u012f] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prie\u0161 %s",s:function(e,a,_,s){return a?"kelios sekund\u0117s":s?"keli\u0173 sekund\u017ei\u0173":"kelias sekundes"},ss:Ae,m:Pe,mm:Ae,h:Pe,hh:Ae,d:Pe,dd:Ae,M:Pe,MM:Ae,y:Pe,yy:Ae},dayOfMonthOrdinalParse:/\d{1,2}-oji/,ordinal:function(e){return e+"-oji"},week:{dow:1,doy:4}});var Oe={ss:"sekundes_sekund\u0113m_sekunde_sekundes".split("_"),m:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),mm:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),h:"stundas_stund\u0101m_stunda_stundas".split("_"),hh:"stundas_stund\u0101m_stunda_stundas".split("_"),d:"dienas_dien\u0101m_diena_dienas".split("_"),dd:"dienas_dien\u0101m_diena_dienas".split("_"),M:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),MM:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")};function Ee(e,a,_){return _?a%10==1&&a%100!=11?e[2]:e[3]:a%10==1&&a%100!=11?e[0]:e[1]}function Fe(e,a,_){return e+" "+Ee(Oe[_],e,a)}function ze(e,a,_){return Ee(Oe[_],e,a)}e.defineLocale("lv",{months:"janv\u0101ris_febru\u0101ris_marts_apr\u012blis_maijs_j\u016bnijs_j\u016blijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_j\u016bn_j\u016bl_aug_sep_okt_nov_dec".split("_"),weekdays:"sv\u0113tdiena_pirmdiena_otrdiena_tre\u0161diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[\u0160odien pulksten] LT",nextDay:"[R\u012bt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pag\u0101ju\u0161\u0101] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"p\u0113c %s",past:"pirms %s",s:function(e,a){return a?"da\u017eas sekundes":"da\u017e\u0101m sekund\u0113m"},ss:Fe,m:ze,mm:Fe,h:ze,hh:Fe,d:ze,dd:Fe,M:ze,MM:Fe,y:ze,yy:Fe},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});var w={words:{ss:["sekund","sekunda","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mjesec","mjeseca","mjeseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(e,a){return 1===e?a[0]:2<=e&&e<=4?a[1]:a[2]},translate:function(e,a,_){var s=w.words[_];return 1===_.length?a?s[0]:s[1]:e+" "+w.correctGrammaticalCase(e,s)}};function g(e,a,_,s){switch(_){case"s":return a?"\u0445\u044d\u0434\u0445\u044d\u043d \u0441\u0435\u043a\u0443\u043d\u0434":"\u0445\u044d\u0434\u0445\u044d\u043d \u0441\u0435\u043a\u0443\u043d\u0434\u044b\u043d";case"ss":return e+(a?" \u0441\u0435\u043a\u0443\u043d\u0434":" \u0441\u0435\u043a\u0443\u043d\u0434\u044b\u043d");case"m":case"mm":return e+(a?" \u043c\u0438\u043d\u0443\u0442":" \u043c\u0438\u043d\u0443\u0442\u044b\u043d");case"h":case"hh":return e+(a?" \u0446\u0430\u0433":" \u0446\u0430\u0433\u0438\u0439\u043d");case"d":case"dd":return e+(a?" \u04e9\u0434\u04e9\u0440":" \u04e9\u0434\u0440\u0438\u0439\u043d");case"M":case"MM":return e+(a?" \u0441\u0430\u0440":" \u0441\u0430\u0440\u044b\u043d");case"y":case"yy":return e+(a?" \u0436\u0438\u043b":" \u0436\u0438\u043b\u0438\u0439\u043d");default:return e}}e.defineLocale("me",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sjutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedjelje] [u] LT","[pro\u0161log] [ponedjeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srijede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"nekoliko sekundi",ss:w.translate,m:w.translate,mm:w.translate,h:w.translate,hh:w.translate,d:"dan",dd:w.translate,M:"mjesec",MM:w.translate,y:"godinu",yy:w.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}}),e.defineLocale("mi",{months:"Kohi-t\u0101te_Hui-tanguru_Pout\u016b-te-rangi_Paenga-wh\u0101wh\u0101_Haratua_Pipiri_H\u014dngoingoi_Here-turi-k\u014dk\u0101_Mahuru_Whiringa-\u0101-nuku_Whiringa-\u0101-rangi_Hakihea".split("_"),monthsShort:"Kohi_Hui_Pou_Pae_Hara_Pipi_H\u014dngoi_Here_Mahu_Whi-nu_Whi-ra_Haki".split("_"),monthsRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,weekdays:"R\u0101tapu_Mane_T\u016brei_Wenerei_T\u0101ite_Paraire_H\u0101tarei".split("_"),weekdaysShort:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),weekdaysMin:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [i] HH:mm",LLLL:"dddd, D MMMM YYYY [i] HH:mm"},calendar:{sameDay:"[i teie mahana, i] LT",nextDay:"[apopo i] LT",nextWeek:"dddd [i] LT",lastDay:"[inanahi i] LT",lastWeek:"dddd [whakamutunga i] LT",sameElse:"L"},relativeTime:{future:"i roto i %s",past:"%s i mua",s:"te h\u0113kona ruarua",ss:"%d h\u0113kona",m:"he meneti",mm:"%d meneti",h:"te haora",hh:"%d haora",d:"he ra",dd:"%d ra",M:"he marama",MM:"%d marama",y:"he tau",yy:"%d tau"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}}),e.defineLocale("mk",{months:"\u0458\u0430\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d\u0438_\u0458\u0443\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u0458\u0430\u043d_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u043e\u043a_\u043f\u0435\u0442\u043e\u043a_\u0441\u0430\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u0435_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u0430\u0431".split("_"),weekdaysMin:"\u043de_\u043fo_\u0432\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441a".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u0435\u043d\u0435\u0441 \u0432\u043e] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432\u043e] LT",nextWeek:"[\u0412\u043e] dddd [\u0432\u043e] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432\u043e] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0430\u0442\u0430] dddd [\u0432\u043e] LT";case 1:case 2:case 4:case 5:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0438\u043e\u0442] dddd [\u0432\u043e] LT"}},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"\u043f\u0440\u0435\u0434 %s",s:"\u043d\u0435\u043a\u043e\u043b\u043a\u0443 \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u0435\u0434\u043d\u0430 \u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0435\u0434\u0435\u043d \u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0435\u0434\u0435\u043d \u0434\u0435\u043d",dd:"%d \u0434\u0435\u043d\u0430",M:"\u0435\u0434\u0435\u043d \u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0438",y:"\u0435\u0434\u043d\u0430 \u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(e){var a=e%10,_=e%100;return 0===e?e+"-\u0435\u0432":0==_?e+"-\u0435\u043d":10<_&&_<20?e+"-\u0442\u0438":1==a?e+"-\u0432\u0438":2==a?e+"-\u0440\u0438":7==a||8==a?e+"-\u043c\u0438":e+"-\u0442\u0438"},week:{dow:1,doy:7}}),e.defineLocale("ml",{months:"\u0d1c\u0d28\u0d41\u0d35\u0d30\u0d3f_\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41\u0d35\u0d30\u0d3f_\u0d2e\u0d3e\u0d7c\u0d1a\u0d4d\u0d1a\u0d4d_\u0d0f\u0d2a\u0d4d\u0d30\u0d3f\u0d7d_\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48_\u0d13\u0d17\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4d_\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31\u0d02\u0d2c\u0d7c_\u0d12\u0d15\u0d4d\u0d1f\u0d4b\u0d2c\u0d7c_\u0d28\u0d35\u0d02\u0d2c\u0d7c_\u0d21\u0d3f\u0d38\u0d02\u0d2c\u0d7c".split("_"),monthsShort:"\u0d1c\u0d28\u0d41._\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41._\u0d2e\u0d3e\u0d7c._\u0d0f\u0d2a\u0d4d\u0d30\u0d3f._\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48._\u0d13\u0d17._\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31._\u0d12\u0d15\u0d4d\u0d1f\u0d4b._\u0d28\u0d35\u0d02._\u0d21\u0d3f\u0d38\u0d02.".split("_"),monthsParseExact:!0,weekdays:"\u0d1e\u0d3e\u0d2f\u0d31\u0d3e\u0d34\u0d4d\u0d1a_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d33\u0d3e\u0d34\u0d4d\u0d1a_\u0d1a\u0d4a\u0d35\u0d4d\u0d35\u0d3e\u0d34\u0d4d\u0d1a_\u0d2c\u0d41\u0d27\u0d28\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a_\u0d36\u0d28\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a".split("_"),weekdaysShort:"\u0d1e\u0d3e\u0d2f\u0d7c_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d7e_\u0d1a\u0d4a\u0d35\u0d4d\u0d35_\u0d2c\u0d41\u0d27\u0d7b_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d02_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f_\u0d36\u0d28\u0d3f".split("_"),weekdaysMin:"\u0d1e\u0d3e_\u0d24\u0d3f_\u0d1a\u0d4a_\u0d2c\u0d41_\u0d35\u0d4d\u0d2f\u0d3e_\u0d35\u0d46_\u0d36".split("_"),longDateFormat:{LT:"A h:mm -\u0d28\u0d41",LTS:"A h:mm:ss -\u0d28\u0d41",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm -\u0d28\u0d41",LLLL:"dddd, D MMMM YYYY, A h:mm -\u0d28\u0d41"},calendar:{sameDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d4d] LT",nextDay:"[\u0d28\u0d3e\u0d33\u0d46] LT",nextWeek:"dddd, LT",lastDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d32\u0d46] LT",lastWeek:"[\u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d",past:"%s \u0d2e\u0d41\u0d7b\u0d2a\u0d4d",s:"\u0d05\u0d7d\u0d2a \u0d28\u0d3f\u0d2e\u0d3f\u0d37\u0d19\u0d4d\u0d19\u0d7e",ss:"%d \u0d38\u0d46\u0d15\u0d4d\u0d15\u0d7b\u0d21\u0d4d",m:"\u0d12\u0d30\u0d41 \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",mm:"%d \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",h:"\u0d12\u0d30\u0d41 \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",hh:"%d \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",d:"\u0d12\u0d30\u0d41 \u0d26\u0d3f\u0d35\u0d38\u0d02",dd:"%d \u0d26\u0d3f\u0d35\u0d38\u0d02",M:"\u0d12\u0d30\u0d41 \u0d2e\u0d3e\u0d38\u0d02",MM:"%d \u0d2e\u0d3e\u0d38\u0d02",y:"\u0d12\u0d30\u0d41 \u0d35\u0d7c\u0d37\u0d02",yy:"%d \u0d35\u0d7c\u0d37\u0d02"},meridiemParse:/\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f|\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46|\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d|\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02|\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f/i,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"===a&&4<=e||"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d"===a||"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02"===a?e+12:e},meridiem:function(e,a,_){return e<4?"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f":e<12?"\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46":e<17?"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d":e<20?"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02":"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"}}),e.defineLocale("mn",{months:"\u041d\u044d\u0433\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0425\u043e\u0451\u0440\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0413\u0443\u0440\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0414\u04e9\u0440\u04e9\u0432\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0422\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0417\u0443\u0440\u0433\u0430\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0414\u043e\u043b\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u041d\u0430\u0439\u043c\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0415\u0441\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0410\u0440\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0410\u0440\u0432\u0430\u043d \u043d\u044d\u0433\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0410\u0440\u0432\u0430\u043d \u0445\u043e\u0451\u0440\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440".split("_"),monthsShort:"1 \u0441\u0430\u0440_2 \u0441\u0430\u0440_3 \u0441\u0430\u0440_4 \u0441\u0430\u0440_5 \u0441\u0430\u0440_6 \u0441\u0430\u0440_7 \u0441\u0430\u0440_8 \u0441\u0430\u0440_9 \u0441\u0430\u0440_10 \u0441\u0430\u0440_11 \u0441\u0430\u0440_12 \u0441\u0430\u0440".split("_"),monthsParseExact:!0,weekdays:"\u041d\u044f\u043c_\u0414\u0430\u0432\u0430\u0430_\u041c\u044f\u0433\u043c\u0430\u0440_\u041b\u0445\u0430\u0433\u0432\u0430_\u041f\u04af\u0440\u044d\u0432_\u0411\u0430\u0430\u0441\u0430\u043d_\u0411\u044f\u043c\u0431\u0430".split("_"),weekdaysShort:"\u041d\u044f\u043c_\u0414\u0430\u0432_\u041c\u044f\u0433_\u041b\u0445\u0430_\u041f\u04af\u0440_\u0411\u0430\u0430_\u0411\u044f\u043c".split("_"),weekdaysMin:"\u041d\u044f_\u0414\u0430_\u041c\u044f_\u041b\u0445_\u041f\u04af_\u0411\u0430_\u0411\u044f".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY \u043e\u043d\u044b MMMM\u044b\u043d D",LLL:"YYYY \u043e\u043d\u044b MMMM\u044b\u043d D HH:mm",LLLL:"dddd, YYYY \u043e\u043d\u044b MMMM\u044b\u043d D HH:mm"},meridiemParse:/\u04ae\u04e8|\u04ae\u0425/i,isPM:function(e){return"\u04ae\u0425"===e},meridiem:function(e,a,_){return e<12?"\u04ae\u04e8":"\u04ae\u0425"},calendar:{sameDay:"[\u04e8\u043d\u04e9\u04e9\u0434\u04e9\u0440] LT",nextDay:"[\u041c\u0430\u0440\u0433\u0430\u0430\u0448] LT",nextWeek:"[\u0418\u0440\u044d\u0445] dddd LT",lastDay:"[\u04e8\u0447\u0438\u0433\u0434\u04e9\u0440] LT",lastWeek:"[\u04e8\u043d\u0433\u04e9\u0440\u0441\u04e9\u043d] dddd LT",sameElse:"L"},relativeTime:{future:"%s \u0434\u0430\u0440\u0430\u0430",past:"%s \u04e9\u043c\u043d\u04e9",s:g,ss:g,m:g,mm:g,h:g,hh:g,d:g,dd:g,M:g,MM:g,y:g,yy:g},dayOfMonthOrdinalParse:/\d{1,2} \u04e9\u0434\u04e9\u0440/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+" \u04e9\u0434\u04e9\u0440";default:return e}}});var Je={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},Ie={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};function H(e,a,_,s){var d="";if(a)switch(_){case"s":d="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926";break;case"ss":d="%d \u0938\u0947\u0915\u0902\u0926";break;case"m":d="\u090f\u0915 \u092e\u093f\u0928\u093f\u091f";break;case"mm":d="%d \u092e\u093f\u0928\u093f\u091f\u0947";break;case"h":d="\u090f\u0915 \u0924\u093e\u0938";break;case"hh":d="%d \u0924\u093e\u0938";break;case"d":d="\u090f\u0915 \u0926\u093f\u0935\u0938";break;case"dd":d="%d \u0926\u093f\u0935\u0938";break;case"M":d="\u090f\u0915 \u092e\u0939\u093f\u0928\u093e";break;case"MM":d="%d \u092e\u0939\u093f\u0928\u0947";break;case"y":d="\u090f\u0915 \u0935\u0930\u094d\u0937";break;case"yy":d="%d \u0935\u0930\u094d\u0937\u0947";break}else switch(_){case"s":d="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"ss":d="%d \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"m":d="\u090f\u0915\u093e \u092e\u093f\u0928\u093f\u091f\u093e";break;case"mm":d="%d \u092e\u093f\u0928\u093f\u091f\u093e\u0902";break;case"h":d="\u090f\u0915\u093e \u0924\u093e\u0938\u093e";break;case"hh":d="%d \u0924\u093e\u0938\u093e\u0902";break;case"d":d="\u090f\u0915\u093e \u0926\u093f\u0935\u0938\u093e";break;case"dd":d="%d \u0926\u093f\u0935\u0938\u093e\u0902";break;case"M":d="\u090f\u0915\u093e \u092e\u0939\u093f\u0928\u094d\u092f\u093e";break;case"MM":d="%d \u092e\u0939\u093f\u0928\u094d\u092f\u093e\u0902";break;case"y":d="\u090f\u0915\u093e \u0935\u0930\u094d\u0937\u093e";break;case"yy":d="%d \u0935\u0930\u094d\u0937\u093e\u0902";break}return d.replace(/%d/i,e)}e.defineLocale("mr",{months:"\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u090f\u092a\u094d\u0930\u093f\u0932_\u092e\u0947_\u091c\u0942\u0928_\u091c\u0941\u0932\u0948_\u0911\u0917\u0938\u094d\u091f_\u0938\u092a\u094d\u091f\u0947\u0902\u092c\u0930_\u0911\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930_\u0921\u093f\u0938\u0947\u0902\u092c\u0930".split("_"),monthsShort:"\u091c\u093e\u0928\u0947._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a._\u090f\u092a\u094d\u0930\u093f._\u092e\u0947._\u091c\u0942\u0928._\u091c\u0941\u0932\u0948._\u0911\u0917._\u0938\u092a\u094d\u091f\u0947\u0902._\u0911\u0915\u094d\u091f\u094b._\u0928\u094b\u0935\u094d\u0939\u0947\u0902._\u0921\u093f\u0938\u0947\u0902.".split("_"),monthsParseExact:!0,weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0933\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0933_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u0935\u093e\u091c\u0924\u093e",LTS:"A h:mm:ss \u0935\u093e\u091c\u0924\u093e",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e",LLLL:"dddd, D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0909\u0926\u094d\u092f\u093e] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u093e\u0932] LT",lastWeek:"[\u092e\u093e\u0917\u0940\u0932] dddd, LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u0927\u094d\u092f\u0947",past:"%s\u092a\u0942\u0930\u094d\u0935\u0940",s:H,ss:H,m:H,mm:H,h:H,hh:H,d:H,dd:H,M:H,MM:H,y:H,yy:H},preparse:function(e){return e.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(e){return Ie[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return Je[e]})},meridiemParse:/\u092a\u0939\u093e\u091f\u0947|\u0938\u0915\u093e\u0933\u0940|\u0926\u0941\u092a\u093e\u0930\u0940|\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940|\u0930\u093e\u0924\u094d\u0930\u0940/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u092a\u0939\u093e\u091f\u0947"===a||"\u0938\u0915\u093e\u0933\u0940"===a?e:"\u0926\u0941\u092a\u093e\u0930\u0940"===a||"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940"===a||"\u0930\u093e\u0924\u094d\u0930\u0940"===a?12<=e?e:e+12:void 0},meridiem:function(e,a,_){return 0<=e&&e<6?"\u092a\u0939\u093e\u091f\u0947":e<12?"\u0938\u0915\u093e\u0933\u0940":e<17?"\u0926\u0941\u092a\u093e\u0930\u0940":e<20?"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940":"\u0930\u093e\u0924\u094d\u0930\u0940"},week:{dow:0,doy:6}}),e.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(e,a){return 12===e&&(e=0),"pagi"===a?e:"tengahari"===a?11<=e?e:e+12:"petang"===a||"malam"===a?e+12:void 0},meridiem:function(e,a,_){return e<11?"pagi":e<15?"tengahari":e<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}}),e.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(e,a){return 12===e&&(e=0),"pagi"===a?e:"tengahari"===a?11<=e?e:e+12:"petang"===a||"malam"===a?e+12:void 0},meridiem:function(e,a,_){return e<11?"pagi":e<15?"tengahari":e<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}}),e.defineLocale("mt",{months:"Jannar_Frar_Marzu_April_Mejju_\u0120unju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Di\u010bembru".split("_"),monthsShort:"Jan_Fra_Mar_Apr_Mej_\u0120un_Lul_Aww_Set_Ott_Nov_Di\u010b".split("_"),weekdays:"Il-\u0126add_It-Tnejn_It-Tlieta_L-Erbg\u0127a_Il-\u0126amis_Il-\u0120img\u0127a_Is-Sibt".split("_"),weekdaysShort:"\u0126ad_Tne_Tli_Erb_\u0126am_\u0120im_Sib".split("_"),weekdaysMin:"\u0126a_Tn_Tl_Er_\u0126a_\u0120i_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Illum fil-]LT",nextDay:"[G\u0127ada fil-]LT",nextWeek:"dddd [fil-]LT",lastDay:"[Il-biera\u0127 fil-]LT",lastWeek:"dddd [li g\u0127adda] [fil-]LT",sameElse:"L"},relativeTime:{future:"f\u2019 %s",past:"%s ilu",s:"ftit sekondi",ss:"%d sekondi",m:"minuta",mm:"%d minuti",h:"sieg\u0127a",hh:"%d sieg\u0127at",d:"\u0121urnata",dd:"%d \u0121ranet",M:"xahar",MM:"%d xhur",y:"sena",yy:"%d sni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}});var Ne={1:"\u1041",2:"\u1042",3:"\u1043",4:"\u1044",5:"\u1045",6:"\u1046",7:"\u1047",8:"\u1048",9:"\u1049",0:"\u1040"},Re={"\u1041":"1","\u1042":"2","\u1043":"3","\u1044":"4","\u1045":"5","\u1046":"6","\u1047":"7","\u1048":"8","\u1049":"9","\u1040":"0"},Ce=(e.defineLocale("my",{months:"\u1007\u1014\u103a\u1014\u101d\u102b\u101b\u102e_\u1016\u1031\u1016\u1031\u102c\u103a\u101d\u102b\u101b\u102e_\u1019\u1010\u103a_\u1027\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u1007\u1030\u101c\u102d\u102f\u1004\u103a_\u101e\u103c\u1002\u102f\u1010\u103a_\u1005\u1000\u103a\u1010\u1004\u103a\u1018\u102c_\u1021\u1031\u102c\u1000\u103a\u1010\u102d\u102f\u1018\u102c_\u1014\u102d\u102f\u101d\u1004\u103a\u1018\u102c_\u1012\u102e\u1007\u1004\u103a\u1018\u102c".split("_"),monthsShort:"\u1007\u1014\u103a_\u1016\u1031_\u1019\u1010\u103a_\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u101c\u102d\u102f\u1004\u103a_\u101e\u103c_\u1005\u1000\u103a_\u1021\u1031\u102c\u1000\u103a_\u1014\u102d\u102f_\u1012\u102e".split("_"),weekdays:"\u1010\u1014\u1004\u103a\u1039\u1002\u1014\u103d\u1031_\u1010\u1014\u1004\u103a\u1039\u101c\u102c_\u1021\u1004\u103a\u1039\u1002\u102b_\u1017\u102f\u1012\u1039\u1013\u101f\u1030\u1038_\u1000\u103c\u102c\u101e\u1015\u1010\u1031\u1038_\u101e\u1031\u102c\u1000\u103c\u102c_\u1005\u1014\u1031".split("_"),weekdaysShort:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),weekdaysMin:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u101a\u1014\u1031.] LT [\u1019\u103e\u102c]",nextDay:"[\u1019\u1014\u1000\u103a\u1016\u103c\u1014\u103a] LT [\u1019\u103e\u102c]",nextWeek:"dddd LT [\u1019\u103e\u102c]",lastDay:"[\u1019\u1014\u1031.\u1000] LT [\u1019\u103e\u102c]",lastWeek:"[\u1015\u103c\u102e\u1038\u1001\u1032\u1037\u101e\u1031\u102c] dddd LT [\u1019\u103e\u102c]",sameElse:"L"},relativeTime:{future:"\u101c\u102c\u1019\u100a\u103a\u1037 %s \u1019\u103e\u102c",past:"\u101c\u103d\u1014\u103a\u1001\u1032\u1037\u101e\u1031\u102c %s \u1000",s:"\u1005\u1000\u1039\u1000\u1014\u103a.\u1021\u1014\u100a\u103a\u1038\u1004\u101a\u103a",ss:"%d \u1005\u1000\u1039\u1000\u1014\u1037\u103a",m:"\u1010\u1005\u103a\u1019\u102d\u1014\u1005\u103a",mm:"%d \u1019\u102d\u1014\u1005\u103a",h:"\u1010\u1005\u103a\u1014\u102c\u101b\u102e",hh:"%d \u1014\u102c\u101b\u102e",d:"\u1010\u1005\u103a\u101b\u1000\u103a",dd:"%d \u101b\u1000\u103a",M:"\u1010\u1005\u103a\u101c",MM:"%d \u101c",y:"\u1010\u1005\u103a\u1014\u103e\u1005\u103a",yy:"%d \u1014\u103e\u1005\u103a"},preparse:function(e){return e.replace(/[\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u1040]/g,function(e){return Re[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return Ne[e]})},week:{dow:1,doy:4}}),e.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"s\xf8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xf8rdag".split("_"),weekdaysShort:"s\xf8._ma._ti._on._to._fr._l\xf8.".split("_"),weekdaysMin:"s\xf8_ma_ti_on_to_fr_l\xf8".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i g\xe5r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",ss:"%d sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",w:"en uke",ww:"%d uker",M:"en m\xe5ned",MM:"%d m\xe5neder",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),{1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"}),Ke={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"},Ge=(e.defineLocale("ne",{months:"\u091c\u0928\u0935\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f\u0932_\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0937\u094d\u091f_\u0938\u0947\u092a\u094d\u091f\u0947\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u092d\u0947\u092e\u094d\u092c\u0930_\u0921\u093f\u0938\u0947\u092e\u094d\u092c\u0930".split("_"),monthsShort:"\u091c\u0928._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f._\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908._\u0905\u0917._\u0938\u0947\u092a\u094d\u091f._\u0905\u0915\u094d\u091f\u094b._\u0928\u094b\u092d\u0947._\u0921\u093f\u0938\u0947.".split("_"),monthsParseExact:!0,weekdays:"\u0906\u0907\u0924\u092c\u093e\u0930_\u0938\u094b\u092e\u092c\u093e\u0930_\u092e\u0919\u094d\u0917\u0932\u092c\u093e\u0930_\u092c\u0941\u0927\u092c\u093e\u0930_\u092c\u093f\u0939\u093f\u092c\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u092c\u093e\u0930_\u0936\u0928\u093f\u092c\u093e\u0930".split("_"),weekdaysShort:"\u0906\u0907\u0924._\u0938\u094b\u092e._\u092e\u0919\u094d\u0917\u0932._\u092c\u0941\u0927._\u092c\u093f\u0939\u093f._\u0936\u0941\u0915\u094d\u0930._\u0936\u0928\u093f.".split("_"),weekdaysMin:"\u0906._\u0938\u094b._\u092e\u0902._\u092c\u0941._\u092c\u093f._\u0936\u0941._\u0936.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A\u0915\u094b h:mm \u092c\u091c\u0947",LTS:"A\u0915\u094b h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947"},preparse:function(e){return e.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(e){return Ke[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return Ce[e]})},meridiemParse:/\u0930\u093e\u0924\u093f|\u092c\u093f\u0939\u093e\u0928|\u0926\u093f\u0909\u0901\u0938\u094b|\u0938\u093e\u0901\u091d/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0930\u093e\u0924\u093f"===a?e<4?e:e+12:"\u092c\u093f\u0939\u093e\u0928"===a?e:"\u0926\u093f\u0909\u0901\u0938\u094b"===a?10<=e?e:e+12:"\u0938\u093e\u0901\u091d"===a?e+12:void 0},meridiem:function(e,a,_){return e<3?"\u0930\u093e\u0924\u093f":e<12?"\u092c\u093f\u0939\u093e\u0928":e<16?"\u0926\u093f\u0909\u0901\u0938\u094b":e<20?"\u0938\u093e\u0901\u091d":"\u0930\u093e\u0924\u093f"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u092d\u094b\u0932\u093f] LT",nextWeek:"[\u0906\u0909\u0901\u0926\u094b] dddd[,] LT",lastDay:"[\u0939\u093f\u091c\u094b] LT",lastWeek:"[\u0917\u090f\u0915\u094b] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u093e",past:"%s \u0905\u0917\u093e\u0921\u093f",s:"\u0915\u0947\u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0947\u0923\u094d\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u0947\u091f",mm:"%d \u092e\u093f\u0928\u0947\u091f",h:"\u090f\u0915 \u0918\u0923\u094d\u091f\u093e",hh:"%d \u0918\u0923\u094d\u091f\u093e",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u093f\u0928\u093e",MM:"%d \u092e\u0939\u093f\u0928\u093e",y:"\u090f\u0915 \u092c\u0930\u094d\u0937",yy:"%d \u092c\u0930\u094d\u0937"},week:{dow:0,doy:6}}),"jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_")),Be="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),m=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],d=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,qe=(e.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(e,a){return e?(/-MMM-/.test(a)?Be:Ge)[e.month()]:Ge},monthsRegex:d,monthsShortRegex:d,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:m,longMonthsParse:m,shortMonthsParse:m,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||20<=e?"ste":"de")},week:{dow:1,doy:4}}),"jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_")),Ue="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),r=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],n=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,$e=(e.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(e,a){return e?(/-MMM-/.test(a)?Ue:qe)[e.month()]:qe},monthsRegex:n,monthsShortRegex:n,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:r,longMonthsParse:r,shortMonthsParse:r,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",w:"\xe9\xe9n week",ww:"%d weken",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||20<=e?"ste":"de")},week:{dow:1,doy:4}}),e.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"sundag_m\xe5ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"su._m\xe5._ty._on._to._fr._lau.".split("_"),weekdaysMin:"su_m\xe5_ty_on_to_fr_la".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I g\xe5r klokka] LT",lastWeek:"[F\xf8reg\xe5ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",ss:"%d sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",w:"ei veke",ww:"%d veker",M:"ein m\xe5nad",MM:"%d m\xe5nader",y:"eit \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),e.defineLocale("oc-lnc",{months:{standalone:"geni\xe8r_febri\xe8r_mar\xe7_abril_mai_junh_julhet_agost_setembre_oct\xf2bre_novembre_decembre".split("_"),format:"de geni\xe8r_de febri\xe8r_de mar\xe7_d'abril_de mai_de junh_de julhet_d'agost_de setembre_d'oct\xf2bre_de novembre_de decembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._mar\xe7_abr._mai_junh_julh._ago._set._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"dimenge_diluns_dimars_dim\xe8cres_dij\xf2us_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dm._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dm_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:"[u\xe8i a] LT",nextDay:"[deman a] LT",nextWeek:"dddd [a] LT",lastDay:"[i\xe8r a] LT",lastWeek:"dddd [passat a] LT",sameElse:"L"},relativeTime:{future:"d'aqu\xed %s",past:"fa %s",s:"unas segondas",ss:"%d segondas",m:"una minuta",mm:"%d minutas",h:"una ora",hh:"%d oras",d:"un jorn",dd:"%d jorns",M:"un mes",MM:"%d meses",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|\xe8|a)/,ordinal:function(e,a){return e+("w"!==a&&"W"!==a?1===e?"r":2===e?"n":3===e?"r":4===e?"t":"\xe8":"a")},week:{dow:1,doy:4}}),{1:"\u0a67",2:"\u0a68",3:"\u0a69",4:"\u0a6a",5:"\u0a6b",6:"\u0a6c",7:"\u0a6d",8:"\u0a6e",9:"\u0a6f",0:"\u0a66"}),Qe={"\u0a67":"1","\u0a68":"2","\u0a69":"3","\u0a6a":"4","\u0a6b":"5","\u0a6c":"6","\u0a6d":"7","\u0a6e":"8","\u0a6f":"9","\u0a66":"0"},Ve=(e.defineLocale("pa-in",{months:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),monthsShort:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),weekdays:"\u0a10\u0a24\u0a35\u0a3e\u0a30_\u0a38\u0a4b\u0a2e\u0a35\u0a3e\u0a30_\u0a2e\u0a70\u0a17\u0a32\u0a35\u0a3e\u0a30_\u0a2c\u0a41\u0a27\u0a35\u0a3e\u0a30_\u0a35\u0a40\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a41\u0a71\u0a15\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a28\u0a40\u0a1a\u0a30\u0a35\u0a3e\u0a30".split("_"),weekdaysShort:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),weekdaysMin:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),longDateFormat:{LT:"A h:mm \u0a35\u0a1c\u0a47",LTS:"A h:mm:ss \u0a35\u0a1c\u0a47",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47",LLLL:"dddd, D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47"},calendar:{sameDay:"[\u0a05\u0a1c] LT",nextDay:"[\u0a15\u0a32] LT",nextWeek:"[\u0a05\u0a17\u0a32\u0a3e] dddd, LT",lastDay:"[\u0a15\u0a32] LT",lastWeek:"[\u0a2a\u0a3f\u0a1b\u0a32\u0a47] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0a35\u0a3f\u0a71\u0a1a",past:"%s \u0a2a\u0a3f\u0a1b\u0a32\u0a47",s:"\u0a15\u0a41\u0a1d \u0a38\u0a15\u0a3f\u0a70\u0a1f",ss:"%d \u0a38\u0a15\u0a3f\u0a70\u0a1f",m:"\u0a07\u0a15 \u0a2e\u0a3f\u0a70\u0a1f",mm:"%d \u0a2e\u0a3f\u0a70\u0a1f",h:"\u0a07\u0a71\u0a15 \u0a18\u0a70\u0a1f\u0a3e",hh:"%d \u0a18\u0a70\u0a1f\u0a47",d:"\u0a07\u0a71\u0a15 \u0a26\u0a3f\u0a28",dd:"%d \u0a26\u0a3f\u0a28",M:"\u0a07\u0a71\u0a15 \u0a2e\u0a39\u0a40\u0a28\u0a3e",MM:"%d \u0a2e\u0a39\u0a40\u0a28\u0a47",y:"\u0a07\u0a71\u0a15 \u0a38\u0a3e\u0a32",yy:"%d \u0a38\u0a3e\u0a32"},preparse:function(e){return e.replace(/[\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0a66]/g,function(e){return Qe[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return $e[e]})},meridiemParse:/\u0a30\u0a3e\u0a24|\u0a38\u0a35\u0a47\u0a30|\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30|\u0a38\u0a3c\u0a3e\u0a2e/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0a30\u0a3e\u0a24"===a?e<4?e:e+12:"\u0a38\u0a35\u0a47\u0a30"===a?e:"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30"===a?10<=e?e:e+12:"\u0a38\u0a3c\u0a3e\u0a2e"===a?e+12:void 0},meridiem:function(e,a,_){return e<4?"\u0a30\u0a3e\u0a24":e<10?"\u0a38\u0a35\u0a47\u0a30":e<17?"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30":e<20?"\u0a38\u0a3c\u0a3e\u0a2e":"\u0a30\u0a3e\u0a24"},week:{dow:0,doy:6}}),"stycze\u0144_luty_marzec_kwiecie\u0144_maj_czerwiec_lipiec_sierpie\u0144_wrzesie\u0144_pa\u017adziernik_listopad_grudzie\u0144".split("_")),Ze="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrze\u015bnia_pa\u017adziernika_listopada_grudnia".split("_"),d=[/^sty/i,/^lut/i,/^mar/i,/^kwi/i,/^maj/i,/^cze/i,/^lip/i,/^sie/i,/^wrz/i,/^pa\u017a/i,/^lis/i,/^gru/i];function Xe(e){return e%10<5&&1<e%10&&~~(e/10)%10!=1}function b(e,a,_){var s=e+" ";switch(_){case"ss":return s+(Xe(e)?"sekundy":"sekund");case"m":return a?"minuta":"minut\u0119";case"mm":return s+(Xe(e)?"minuty":"minut");case"h":return a?"godzina":"godzin\u0119";case"hh":return s+(Xe(e)?"godziny":"godzin");case"ww":return s+(Xe(e)?"tygodnie":"tygodni");case"MM":return s+(Xe(e)?"miesi\u0105ce":"miesi\u0119cy");case"yy":return s+(Xe(e)?"lata":"lat")}}function S(e,a,_){return e+(20<=e%100||100<=e&&e%100==0?" de ":" ")+{ss:"secunde",mm:"minute",hh:"ore",dd:"zile",ww:"s\u0103pt\u0103m\xe2ni",MM:"luni",yy:"ani"}[_]}function v(e,a,_){return"m"===_?a?"\u043c\u0438\u043d\u0443\u0442\u0430":"\u043c\u0438\u043d\u0443\u0442\u0443":e+" "+(e=+e,a=(a={ss:a?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:a?"\u043c\u0438\u043d\u0443\u0442\u0430_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442":"\u043c\u0438\u043d\u0443\u0442\u0443_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442",hh:"\u0447\u0430\u0441_\u0447\u0430\u0441\u0430_\u0447\u0430\u0441\u043e\u0432",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u044f_\u0434\u043d\u0435\u0439",ww:"\u043d\u0435\u0434\u0435\u043b\u044f_\u043d\u0435\u0434\u0435\u043b\u0438_\u043d\u0435\u0434\u0435\u043b\u044c",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u0430_\u043c\u0435\u0441\u044f\u0446\u0435\u0432",yy:"\u0433\u043e\u0434_\u0433\u043e\u0434\u0430_\u043b\u0435\u0442"}[_]).split("_"),e%10==1&&e%100!=11?a[0]:2<=e%10&&e%10<=4&&(e%100<10||20<=e%100)?a[1]:a[2])}e.defineLocale("pl",{months:function(e,a){return e?(/D MMMM/.test(a)?Ze:Ve)[e.month()]:Ve},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_pa\u017a_lis_gru".split("_"),monthsParse:d,longMonthsParse:d,shortMonthsParse:d,weekdays:"niedziela_poniedzia\u0142ek_wtorek_\u015broda_czwartek_pi\u0105tek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_\u015br_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_\u015ar_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dzi\u015b o] LT",nextDay:"[Jutro o] LT",nextWeek:function(){switch(this.day()){case 0:return"[W niedziel\u0119 o] LT";case 2:return"[We wtorek o] LT";case 3:return"[W \u015brod\u0119 o] LT";case 6:return"[W sobot\u0119 o] LT";default:return"[W] dddd [o] LT"}},lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zesz\u0142\u0105 niedziel\u0119 o] LT";case 3:return"[W zesz\u0142\u0105 \u015brod\u0119 o] LT";case 6:return"[W zesz\u0142\u0105 sobot\u0119 o] LT";default:return"[W zesz\u0142y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",ss:b,m:b,mm:b,h:b,hh:b,d:"1 dzie\u0144",dd:"%d dni",w:"tydzie\u0144",ww:b,M:"miesi\u0105c",MM:b,y:"rok",yy:b},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),e.defineLocale("pt-br",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_ter\xe7a-feira_quarta-feira_quinta-feira_sexta-feira_s\xe1bado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_s\xe1b".split("_"),weekdaysMin:"do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [\xe0s] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [\xe0s] HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"poucos segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",invalidDate:"Data inv\xe1lida"}),e.defineLocale("pt",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Ter\xe7a-feira_Quarta-feira_Quinta-feira_Sexta-feira_S\xe1bado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_S\xe1b".split("_"),weekdaysMin:"Do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",w:"uma semana",ww:"%d semanas",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}}),e.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._feb._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminic\u0103_luni_mar\u021bi_miercuri_joi_vineri_s\xe2mb\u0103t\u0103".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_S\xe2m".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_S\xe2".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[m\xe2ine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s \xeen urm\u0103",s:"c\xe2teva secunde",ss:S,m:"un minut",mm:S,h:"o or\u0103",hh:S,d:"o zi",dd:S,w:"o s\u0103pt\u0103m\xe2n\u0103",ww:S,M:"o lun\u0103",MM:S,y:"un an",yy:S},week:{dow:1,doy:7}});m=[/^\u044f\u043d\u0432/i,/^\u0444\u0435\u0432/i,/^\u043c\u0430\u0440/i,/^\u0430\u043f\u0440/i,/^\u043c\u0430[\u0439\u044f]/i,/^\u0438\u044e\u043d/i,/^\u0438\u044e\u043b/i,/^\u0430\u0432\u0433/i,/^\u0441\u0435\u043d/i,/^\u043e\u043a\u0442/i,/^\u043d\u043e\u044f/i,/^\u0434\u0435\u043a/i],e.defineLocale("ru",{months:{format:"\u044f\u043d\u0432\u0430\u0440\u044f_\u0444\u0435\u0432\u0440\u0430\u043b\u044f_\u043c\u0430\u0440\u0442\u0430_\u0430\u043f\u0440\u0435\u043b\u044f_\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433\u0443\u0441\u0442\u0430_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f_\u043e\u043a\u0442\u044f\u0431\u0440\u044f_\u043d\u043e\u044f\u0431\u0440\u044f_\u0434\u0435\u043a\u0430\u0431\u0440\u044f".split("_"),standalone:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_")},monthsShort:{format:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_"),standalone:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440\u0442_\u0430\u043f\u0440._\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_")},weekdays:{standalone:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0430_\u0441\u0443\u0431\u0431\u043e\u0442\u0430".split("_"),format:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0443_\u0441\u0443\u0431\u0431\u043e\u0442\u0443".split("_"),isFormat:/\[ ?[\u0412\u0432] ?(?:\u043f\u0440\u043e\u0448\u043b\u0443\u044e|\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e|\u044d\u0442\u0443)? ?] ?dddd/},weekdaysShort:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),monthsParse:m,longMonthsParse:m,shortMonthsParse:m,monthsRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsShortRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsStrictRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044f\u044c]|\u0444\u0435\u0432\u0440\u0430\u043b[\u044f\u044c]|\u043c\u0430\u0440\u0442\u0430?|\u0430\u043f\u0440\u0435\u043b[\u044f\u044c]|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044f\u044c]|\u0438\u044e\u043b[\u044f\u044c]|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043e\u043a\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043d\u043e\u044f\u0431\u0440[\u044f\u044c]|\u0434\u0435\u043a\u0430\u0431\u0440[\u044f\u044c])/i,monthsShortStrictRegex:/^(\u044f\u043d\u0432\.|\u0444\u0435\u0432\u0440?\.|\u043c\u0430\u0440[\u0442.]|\u0430\u043f\u0440\.|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044c\u044f.]|\u0438\u044e\u043b[\u044c\u044f.]|\u0430\u0432\u0433\.|\u0441\u0435\u043d\u0442?\.|\u043e\u043a\u0442\.|\u043d\u043e\u044f\u0431?\.|\u0434\u0435\u043a\.)/i,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., H:mm",LLLL:"dddd, D MMMM YYYY \u0433., H:mm"},calendar:{sameDay:"[\u0421\u0435\u0433\u043e\u0434\u043d\u044f, \u0432] LT",nextDay:"[\u0417\u0430\u0432\u0442\u0440\u0430, \u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430, \u0432] LT",nextWeek:function(e){if(e.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd, [\u0432] LT":"[\u0412] dddd, [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435] dddd, [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439] dddd, [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e] dddd, [\u0432] LT"}},lastWeek:function(e){if(e.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd, [\u0432] LT":"[\u0412] dddd, [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0435] dddd, [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0439] dddd, [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u0443\u044e] dddd, [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0447\u0435\u0440\u0435\u0437 %s",past:"%s \u043d\u0430\u0437\u0430\u0434",s:"\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434",ss:v,m:v,mm:v,h:"\u0447\u0430\u0441",hh:v,d:"\u0434\u0435\u043d\u044c",dd:v,w:"\u043d\u0435\u0434\u0435\u043b\u044f",ww:v,M:"\u043c\u0435\u0441\u044f\u0446",MM:v,y:"\u0433\u043e\u0434",yy:v},meridiemParse:/\u043d\u043e\u0447\u0438|\u0443\u0442\u0440\u0430|\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430/i,isPM:function(e){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430)$/.test(e)},meridiem:function(e,a,_){return e<4?"\u043d\u043e\u0447\u0438":e<12?"\u0443\u0442\u0440\u0430":e<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0435\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e|\u044f)/,ordinal:function(e,a){switch(a){case"M":case"d":case"DDD":return e+"-\u0439";case"D":return e+"-\u0433\u043e";case"w":case"W":return e+"-\u044f";default:return e}},week:{dow:1,doy:4}}),n=["\u062c\u0646\u0648\u0631\u064a","\u0641\u064a\u0628\u0631\u0648\u0631\u064a","\u0645\u0627\u0631\u0686","\u0627\u067e\u0631\u064a\u0644","\u0645\u0626\u064a","\u062c\u0648\u0646","\u062c\u0648\u0644\u0627\u0621\u0650","\u0622\u06af\u0633\u067d","\u0633\u064a\u067e\u067d\u0645\u0628\u0631","\u0622\u06aa\u067d\u0648\u0628\u0631","\u0646\u0648\u0645\u0628\u0631","\u068a\u0633\u0645\u0628\u0631"],r=["\u0622\u0686\u0631","\u0633\u0648\u0645\u0631","\u0627\u06b1\u0627\u0631\u0648","\u0627\u0631\u0628\u0639","\u062e\u0645\u064a\u0633","\u062c\u0645\u0639","\u0687\u0646\u0687\u0631"],e.defineLocale("sd",{months:n,monthsShort:n,weekdays:r,weekdaysShort:r,weekdaysMin:r,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd\u060c D MMMM YYYY HH:mm"},meridiemParse:/\u0635\u0628\u062d|\u0634\u0627\u0645/,isPM:function(e){return"\u0634\u0627\u0645"===e},meridiem:function(e,a,_){return e<12?"\u0635\u0628\u062d":"\u0634\u0627\u0645"},calendar:{sameDay:"[\u0627\u0684] LT",nextDay:"[\u0633\u0680\u0627\u06bb\u064a] LT",nextWeek:"dddd [\u0627\u06b3\u064a\u0646 \u0647\u0641\u062a\u064a \u062a\u064a] LT",lastDay:"[\u06aa\u0627\u0644\u0647\u0647] LT",lastWeek:"[\u06af\u0632\u0631\u064a\u0644 \u0647\u0641\u062a\u064a] dddd [\u062a\u064a] LT",sameElse:"L"},relativeTime:{future:"%s \u067e\u0648\u0621",past:"%s \u0627\u06b3",s:"\u0686\u0646\u062f \u0633\u064a\u06aa\u0646\u068a",ss:"%d \u0633\u064a\u06aa\u0646\u068a",m:"\u0647\u06aa \u0645\u0646\u067d",mm:"%d \u0645\u0646\u067d",h:"\u0647\u06aa \u06aa\u0644\u0627\u06aa",hh:"%d \u06aa\u0644\u0627\u06aa",d:"\u0647\u06aa \u068f\u064a\u0646\u0647\u0646",dd:"%d \u068f\u064a\u0646\u0647\u0646",M:"\u0647\u06aa \u0645\u0647\u064a\u0646\u0648",MM:"%d \u0645\u0647\u064a\u0646\u0627",y:"\u0647\u06aa \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:1,doy:4}}),e.defineLocale("se",{months:"o\u0111\u0111ajagem\xe1nnu_guovvam\xe1nnu_njuk\u010dam\xe1nnu_cuo\u014bom\xe1nnu_miessem\xe1nnu_geassem\xe1nnu_suoidnem\xe1nnu_borgem\xe1nnu_\u010dak\u010dam\xe1nnu_golggotm\xe1nnu_sk\xe1bmam\xe1nnu_juovlam\xe1nnu".split("_"),monthsShort:"o\u0111\u0111j_guov_njuk_cuo_mies_geas_suoi_borg_\u010dak\u010d_golg_sk\xe1b_juov".split("_"),weekdays:"sotnabeaivi_vuoss\xe1rga_ma\u014b\u014beb\xe1rga_gaskavahkku_duorastat_bearjadat_l\xe1vvardat".split("_"),weekdaysShort:"sotn_vuos_ma\u014b_gask_duor_bear_l\xe1v".split("_"),weekdaysMin:"s_v_m_g_d_b_L".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"MMMM D. [b.] YYYY",LLL:"MMMM D. [b.] YYYY [ti.] HH:mm",LLLL:"dddd, MMMM D. [b.] YYYY [ti.] HH:mm"},calendar:{sameDay:"[otne ti] LT",nextDay:"[ihttin ti] LT",nextWeek:"dddd [ti] LT",lastDay:"[ikte ti] LT",lastWeek:"[ovddit] dddd [ti] LT",sameElse:"L"},relativeTime:{future:"%s gea\u017ees",past:"ma\u014bit %s",s:"moadde sekunddat",ss:"%d sekunddat",m:"okta minuhta",mm:"%d minuhtat",h:"okta diimmu",hh:"%d diimmut",d:"okta beaivi",dd:"%d beaivvit",M:"okta m\xe1nnu",MM:"%d m\xe1nut",y:"okta jahki",yy:"%d jagit"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),e.defineLocale("si",{months:"\u0da2\u0db1\u0dc0\u0dcf\u0dbb\u0dd2_\u0db4\u0dd9\u0db6\u0dbb\u0dc0\u0dcf\u0dbb\u0dd2_\u0db8\u0dcf\u0dbb\u0dca\u0dad\u0dd4_\u0d85\u0db4\u0dca\u200d\u0dbb\u0dda\u0dbd\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd\u0dc3\u0dca\u0dad\u0dd4_\u0dc3\u0dd0\u0db4\u0dca\u0dad\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0d94\u0d9a\u0dca\u0dad\u0ddd\u0db6\u0dbb\u0dca_\u0db1\u0ddc\u0dc0\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0daf\u0dd9\u0dc3\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca".split("_"),monthsShort:"\u0da2\u0db1_\u0db4\u0dd9\u0db6_\u0db8\u0dcf\u0dbb\u0dca_\u0d85\u0db4\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd_\u0dc3\u0dd0\u0db4\u0dca_\u0d94\u0d9a\u0dca_\u0db1\u0ddc\u0dc0\u0dd0_\u0daf\u0dd9\u0dc3\u0dd0".split("_"),weekdays:"\u0d89\u0dbb\u0dd2\u0daf\u0dcf_\u0dc3\u0db3\u0dd4\u0daf\u0dcf_\u0d85\u0d9f\u0dc4\u0dbb\u0dd4\u0dc0\u0dcf\u0daf\u0dcf_\u0db6\u0daf\u0dcf\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4\u0dc3\u0dca\u0db4\u0dad\u0dd2\u0db1\u0dca\u0daf\u0dcf_\u0dc3\u0dd2\u0d9a\u0dd4\u0dbb\u0dcf\u0daf\u0dcf_\u0dc3\u0dd9\u0db1\u0dc3\u0dd4\u0dbb\u0dcf\u0daf\u0dcf".split("_"),weekdaysShort:"\u0d89\u0dbb\u0dd2_\u0dc3\u0db3\u0dd4_\u0d85\u0d9f_\u0db6\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4_\u0dc3\u0dd2\u0d9a\u0dd4_\u0dc3\u0dd9\u0db1".split("_"),weekdaysMin:"\u0d89_\u0dc3_\u0d85_\u0db6_\u0db6\u0dca\u200d\u0dbb_\u0dc3\u0dd2_\u0dc3\u0dd9".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"a h:mm",LTS:"a h:mm:ss",L:"YYYY/MM/DD",LL:"YYYY MMMM D",LLL:"YYYY MMMM D, a h:mm",LLLL:"YYYY MMMM D [\u0dc0\u0dd0\u0db1\u0dd2] dddd, a h:mm:ss"},calendar:{sameDay:"[\u0d85\u0daf] LT[\u0da7]",nextDay:"[\u0dc4\u0dd9\u0da7] LT[\u0da7]",nextWeek:"dddd LT[\u0da7]",lastDay:"[\u0d8a\u0dba\u0dda] LT[\u0da7]",lastWeek:"[\u0db4\u0dc3\u0dd4\u0d9c\u0dd2\u0dba] dddd LT[\u0da7]",sameElse:"L"},relativeTime:{future:"%s\u0d9a\u0dd2\u0db1\u0dca",past:"%s\u0d9a\u0da7 \u0db4\u0dd9\u0dbb",s:"\u0dad\u0dad\u0dca\u0db4\u0dbb \u0d9a\u0dd2\u0dc4\u0dd2\u0db4\u0dba",ss:"\u0dad\u0dad\u0dca\u0db4\u0dbb %d",m:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4\u0dc0",mm:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4 %d",h:"\u0db4\u0dd0\u0dba",hh:"\u0db4\u0dd0\u0dba %d",d:"\u0daf\u0dd2\u0db1\u0dba",dd:"\u0daf\u0dd2\u0db1 %d",M:"\u0db8\u0dcf\u0dc3\u0dba",MM:"\u0db8\u0dcf\u0dc3 %d",y:"\u0dc0\u0dc3\u0dbb",yy:"\u0dc0\u0dc3\u0dbb %d"},dayOfMonthOrdinalParse:/\d{1,2} \u0dc0\u0dd0\u0db1\u0dd2/,ordinal:function(e){return e+" \u0dc0\u0dd0\u0db1\u0dd2"},meridiemParse:/\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4|\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4|\u0db4\u0dd9.\u0dc0|\u0db4.\u0dc0./,isPM:function(e){return"\u0db4.\u0dc0."===e||"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4"===e},meridiem:function(e,a,_){return 11<e?_?"\u0db4.\u0dc0.":"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4":_?"\u0db4\u0dd9.\u0dc0.":"\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4"}}),d="janu\xe1r_febru\xe1r_marec_apr\xedl_m\xe1j_j\xfan_j\xfal_august_september_okt\xf3ber_november_december".split("_"),m="jan_feb_mar_apr_m\xe1j_j\xfan_j\xfal_aug_sep_okt_nov_dec".split("_");function ea(e){return 1<e&&e<5}function j(e,a,_,s){var d=e+" ";switch(_){case"s":return a||s?"p\xe1r sek\xfand":"p\xe1r sekundami";case"ss":return a||s?d+(ea(e)?"sekundy":"sek\xfand"):d+"sekundami";case"m":return a?"min\xfata":s?"min\xfatu":"min\xfatou";case"mm":return a||s?d+(ea(e)?"min\xfaty":"min\xfat"):d+"min\xfatami";case"h":return a?"hodina":s?"hodinu":"hodinou";case"hh":return a||s?d+(ea(e)?"hodiny":"hod\xedn"):d+"hodinami";case"d":return a||s?"de\u0148":"d\u0148om";case"dd":return a||s?d+(ea(e)?"dni":"dn\xed"):d+"d\u0148ami";case"M":return a||s?"mesiac":"mesiacom";case"MM":return a||s?d+(ea(e)?"mesiace":"mesiacov"):d+"mesiacmi";case"y":return a||s?"rok":"rokom";case"yy":return a||s?d+(ea(e)?"roky":"rokov"):d+"rokmi"}}function x(e,a,_,s){var d=e+" ";switch(_){case"s":return a||s?"nekaj sekund":"nekaj sekundami";case"ss":return d+=1===e?a?"sekundo":"sekundi":2===e?a||s?"sekundi":"sekundah":e<5?a||s?"sekunde":"sekundah":"sekund";case"m":return a?"ena minuta":"eno minuto";case"mm":return d+=1===e?a?"minuta":"minuto":2===e?a||s?"minuti":"minutama":e<5?a||s?"minute":"minutami":a||s?"minut":"minutami";case"h":return a?"ena ura":"eno uro";case"hh":return d+=1===e?a?"ura":"uro":2===e?a||s?"uri":"urama":e<5?a||s?"ure":"urami":a||s?"ur":"urami";case"d":return a||s?"en dan":"enim dnem";case"dd":return d+=1===e?a||s?"dan":"dnem":2===e?a||s?"dni":"dnevoma":a||s?"dni":"dnevi";case"M":return a||s?"en mesec":"enim mesecem";case"MM":return d+=1===e?a||s?"mesec":"mesecem":2===e?a||s?"meseca":"mesecema":e<5?a||s?"mesece":"meseci":a||s?"mesecev":"meseci";case"y":return a||s?"eno leto":"enim letom";case"yy":return d+=1===e?a||s?"leto":"letom":2===e?a||s?"leti":"letoma":e<5?a||s?"leta":"leti":a||s?"let":"leti"}}e.defineLocale("sk",{months:d,monthsShort:m,weekdays:"nede\u013ea_pondelok_utorok_streda_\u0161tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_\u0161t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_\u0161t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nede\u013eu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo \u0161tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[v\u010dera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minul\xfa nede\u013eu o] LT";case 1:case 2:return"[minul\xfd] dddd [o] LT";case 3:return"[minul\xfa stredu o] LT";case 4:case 5:return"[minul\xfd] dddd [o] LT";case 6:return"[minul\xfa sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:j,ss:j,m:j,mm:j,h:j,hh:j,d:j,dd:j,M:j,MM:j,y:j,yy:j},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),e.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_\u010detrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._\u010det._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_\u010de_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[v\u010deraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prej\u0161njo] [nedeljo] [ob] LT";case 3:return"[prej\u0161njo] [sredo] [ob] LT";case 6:return"[prej\u0161njo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prej\u0161nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"\u010dez %s",past:"pred %s",s:x,ss:x,m:x,mm:x,h:x,hh:x,d:x,dd:x,M:x,MM:x,y:x,yy:x},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}}),e.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_N\xebntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_N\xebn_Dhj".split("_"),weekdays:"E Diel_E H\xebn\xeb_E Mart\xeb_E M\xebrkur\xeb_E Enjte_E Premte_E Shtun\xeb".split("_"),weekdaysShort:"Die_H\xebn_Mar_M\xebr_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_M\xeb_E_P_Sh".split("_"),weekdaysParseExact:!0,meridiemParse:/PD|MD/,isPM:function(e){return"M"===e.charAt(0)},meridiem:function(e,a,_){return e<12?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Sot n\xeb] LT",nextDay:"[Nes\xebr n\xeb] LT",nextWeek:"dddd [n\xeb] LT",lastDay:"[Dje n\xeb] LT",lastWeek:"dddd [e kaluar n\xeb] LT",sameElse:"L"},relativeTime:{future:"n\xeb %s",past:"%s m\xeb par\xeb",s:"disa sekonda",ss:"%d sekonda",m:"nj\xeb minut\xeb",mm:"%d minuta",h:"nj\xeb or\xeb",hh:"%d or\xeb",d:"nj\xeb dit\xeb",dd:"%d dit\xeb",M:"nj\xeb muaj",MM:"%d muaj",y:"nj\xeb vit",yy:"%d vite"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});var P={words:{ss:["\u0441\u0435\u043a\u0443\u043d\u0434\u0430","\u0441\u0435\u043a\u0443\u043d\u0434\u0435","\u0441\u0435\u043a\u0443\u043d\u0434\u0438"],m:["\u0458\u0435\u0434\u0430\u043d \u043c\u0438\u043d\u0443\u0442","\u0458\u0435\u0434\u043d\u043e\u0433 \u043c\u0438\u043d\u0443\u0442\u0430"],mm:["\u043c\u0438\u043d\u0443\u0442","\u043c\u0438\u043d\u0443\u0442\u0430","\u043c\u0438\u043d\u0443\u0442\u0430"],h:["\u0458\u0435\u0434\u0430\u043d \u0441\u0430\u0442","\u0458\u0435\u0434\u043d\u043e\u0433 \u0441\u0430\u0442\u0430"],hh:["\u0441\u0430\u0442","\u0441\u0430\u0442\u0430","\u0441\u0430\u0442\u0438"],d:["\u0458\u0435\u0434\u0430\u043d \u0434\u0430\u043d","\u0458\u0435\u0434\u043d\u043e\u0433 \u0434\u0430\u043d\u0430"],dd:["\u0434\u0430\u043d","\u0434\u0430\u043d\u0430","\u0434\u0430\u043d\u0430"],M:["\u0458\u0435\u0434\u0430\u043d \u043c\u0435\u0441\u0435\u0446","\u0458\u0435\u0434\u043d\u043e\u0433 \u043c\u0435\u0441\u0435\u0446\u0430"],MM:["\u043c\u0435\u0441\u0435\u0446","\u043c\u0435\u0441\u0435\u0446\u0430","\u043c\u0435\u0441\u0435\u0446\u0438"],y:["\u0458\u0435\u0434\u043d\u0443 \u0433\u043e\u0434\u0438\u043d\u0443","\u0458\u0435\u0434\u043d\u0435 \u0433\u043e\u0434\u0438\u043d\u0435"],yy:["\u0433\u043e\u0434\u0438\u043d\u0443","\u0433\u043e\u0434\u0438\u043d\u0435","\u0433\u043e\u0434\u0438\u043d\u0430"]},correctGrammaticalCase:function(e,a){return 1<=e%10&&e%10<=4&&(e%100<10||20<=e%100)?e%10==1?a[0]:a[1]:a[2]},translate:function(e,a,_,s){var d=P.words[_];return 1===_.length?"y"===_&&a?"\u0458\u0435\u0434\u043d\u0430 \u0433\u043e\u0434\u0438\u043d\u0430":s||a?d[0]:d[1]:(s=P.correctGrammaticalCase(e,d),"yy"===_&&a&&"\u0433\u043e\u0434\u0438\u043d\u0443"===s?e+" \u0433\u043e\u0434\u0438\u043d\u0430":e+" "+s)}},W=(e.defineLocale("sr-cyrl",{months:"\u0458\u0430\u043d\u0443\u0430\u0440_\u0444\u0435\u0431\u0440\u0443\u0430\u0440_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440_\u043e\u043a\u0442\u043e\u0431\u0430\u0440_\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440_\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440".split("_"),monthsShort:"\u0458\u0430\u043d._\u0444\u0435\u0431._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433._\u0441\u0435\u043f._\u043e\u043a\u0442._\u043d\u043e\u0432._\u0434\u0435\u0446.".split("_"),monthsParseExact:!0,weekdays:"\u043d\u0435\u0434\u0435\u0459\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a_\u0443\u0442\u043e\u0440\u0430\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a_\u043f\u0435\u0442\u0430\u043a_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434._\u043f\u043e\u043d._\u0443\u0442\u043e._\u0441\u0440\u0435._\u0447\u0435\u0442._\u043f\u0435\u0442._\u0441\u0443\u0431.".split("_"),weekdaysMin:"\u043d\u0435_\u043f\u043e_\u0443\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441\u0443".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D. M. YYYY.",LL:"D. MMMM YYYY.",LLL:"D. MMMM YYYY. H:mm",LLLL:"dddd, D. MMMM YYYY. H:mm"},calendar:{sameDay:"[\u0434\u0430\u043d\u0430\u0441 \u0443] LT",nextDay:"[\u0441\u0443\u0442\u0440\u0430 \u0443] LT",nextWeek:function(){switch(this.day()){case 0:return"[\u0443] [\u043d\u0435\u0434\u0435\u0459\u0443] [\u0443] LT";case 3:return"[\u0443] [\u0441\u0440\u0435\u0434\u0443] [\u0443] LT";case 6:return"[\u0443] [\u0441\u0443\u0431\u043e\u0442\u0443] [\u0443] LT";case 1:case 2:case 4:case 5:return"[\u0443] dddd [\u0443] LT"}},lastDay:"[\u0458\u0443\u0447\u0435 \u0443] LT",lastWeek:function(){return["[\u043f\u0440\u043e\u0448\u043b\u0435] [\u043d\u0435\u0434\u0435\u0459\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0443\u0442\u043e\u0440\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0440\u0435\u0434\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0447\u0435\u0442\u0432\u0440\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u0435\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0443\u0431\u043e\u0442\u0435] [\u0443] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"\u043f\u0440\u0435 %s",s:"\u043d\u0435\u043a\u043e\u043b\u0438\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:P.translate,m:P.translate,mm:P.translate,h:P.translate,hh:P.translate,d:P.translate,dd:P.translate,M:P.translate,MM:P.translate,y:P.translate,yy:P.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}}),{words:{ss:["sekunda","sekunde","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],d:["jedan dan","jednog dana"],dd:["dan","dana","dana"],M:["jedan mesec","jednog meseca"],MM:["mesec","meseca","meseci"],y:["jednu godinu","jedne godine"],yy:["godinu","godine","godina"]},correctGrammaticalCase:function(e,a){return 1<=e%10&&e%10<=4&&(e%100<10||20<=e%100)?e%10==1?a[0]:a[1]:a[2]},translate:function(e,a,_,s){var d=W.words[_];return 1===_.length?"y"===_&&a?"jedna godina":s||a?d[0]:d[1]:(s=W.correctGrammaticalCase(e,d),"yy"===_&&a&&"godinu"===s?e+" godina":e+" "+s)}}),aa=(e.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D. M. YYYY.",LL:"D. MMMM YYYY.",LLL:"D. MMMM YYYY. H:mm",LLLL:"dddd, D. MMMM YYYY. H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedelje] [u] LT","[pro\u0161log] [ponedeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",ss:W.translate,m:W.translate,mm:W.translate,h:W.translate,hh:W.translate,d:W.translate,dd:W.translate,M:W.translate,MM:W.translate,y:W.translate,yy:W.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}}),e.defineLocale("ss",{months:"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split("_"),monthsShort:"Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo".split("_"),weekdays:"Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo".split("_"),weekdaysShort:"Lis_Umb_Lsb_Les_Lsi_Lsh_Umg".split("_"),weekdaysMin:"Li_Us_Lb_Lt_Ls_Lh_Ug".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Namuhla nga] LT",nextDay:"[Kusasa nga] LT",nextWeek:"dddd [nga] LT",lastDay:"[Itolo nga] LT",lastWeek:"dddd [leliphelile] [nga] LT",sameElse:"L"},relativeTime:{future:"nga %s",past:"wenteka nga %s",s:"emizuzwana lomcane",ss:"%d mzuzwana",m:"umzuzu",mm:"%d emizuzu",h:"lihora",hh:"%d emahora",d:"lilanga",dd:"%d emalanga",M:"inyanga",MM:"%d tinyanga",y:"umnyaka",yy:"%d iminyaka"},meridiemParse:/ekuseni|emini|entsambama|ebusuku/,meridiem:function(e,a,_){return e<11?"ekuseni":e<15?"emini":e<19?"entsambama":"ebusuku"},meridiemHour:function(e,a){return 12===e&&(e=0),"ekuseni"===a?e:"emini"===a?11<=e?e:e+12:"entsambama"===a||"ebusuku"===a?0===e?0:e+12:void 0},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:"%d",week:{dow:1,doy:4}}),e.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"s\xf6ndag_m\xe5ndag_tisdag_onsdag_torsdag_fredag_l\xf6rdag".split("_"),weekdaysShort:"s\xf6n_m\xe5n_tis_ons_tor_fre_l\xf6r".split("_"),weekdaysMin:"s\xf6_m\xe5_ti_on_to_fr_l\xf6".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Ig\xe5r] LT",nextWeek:"[P\xe5] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"f\xf6r %s sedan",s:"n\xe5gra sekunder",ss:"%d sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en m\xe5nad",MM:"%d m\xe5nader",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}(\:e|\:a)/,ordinal:function(e){var a=e%10;return e+(1!=~~(e%100/10)&&(1==a||2==a)?":a":":e")},week:{dow:1,doy:4}}),e.defineLocale("sw",{months:"Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des".split("_"),weekdays:"Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi".split("_"),weekdaysShort:"Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos".split("_"),weekdaysMin:"J2_J3_J4_J5_Al_Ij_J1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"hh:mm A",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[leo saa] LT",nextDay:"[kesho saa] LT",nextWeek:"[wiki ijayo] dddd [saat] LT",lastDay:"[jana] LT",lastWeek:"[wiki iliyopita] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s baadaye",past:"tokea %s",s:"hivi punde",ss:"sekunde %d",m:"dakika moja",mm:"dakika %d",h:"saa limoja",hh:"masaa %d",d:"siku moja",dd:"siku %d",M:"mwezi mmoja",MM:"miezi %d",y:"mwaka mmoja",yy:"miaka %d"},week:{dow:1,doy:7}}),{1:"\u0be7",2:"\u0be8",3:"\u0be9",4:"\u0bea",5:"\u0beb",6:"\u0bec",7:"\u0bed",8:"\u0bee",9:"\u0bef",0:"\u0be6"}),_a={"\u0be7":"1","\u0be8":"2","\u0be9":"3","\u0bea":"4","\u0beb":"5","\u0bec":"6","\u0bed":"7","\u0bee":"8","\u0bef":"9","\u0be6":"0"},sa=(e.defineLocale("ta",{months:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),monthsShort:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),weekdays:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bcd\u0bb1\u0bc1\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0b9f\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0ba9\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8".split("_"),weekdaysShort:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bc1_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0bb3\u0bcd_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0ba9\u0bcd_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf_\u0b9a\u0ba9\u0bbf".split("_"),weekdaysMin:"\u0b9e\u0bbe_\u0ba4\u0bbf_\u0b9a\u0bc6_\u0baa\u0bc1_\u0bb5\u0bbf_\u0bb5\u0bc6_\u0b9a".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, HH:mm",LLLL:"dddd, D MMMM YYYY, HH:mm"},calendar:{sameDay:"[\u0b87\u0ba9\u0bcd\u0bb1\u0bc1] LT",nextDay:"[\u0ba8\u0bbe\u0bb3\u0bc8] LT",nextWeek:"dddd, LT",lastDay:"[\u0ba8\u0bc7\u0bb1\u0bcd\u0bb1\u0bc1] LT",lastWeek:"[\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 \u0bb5\u0bbe\u0bb0\u0bae\u0bcd] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0b87\u0bb2\u0bcd",past:"%s \u0bae\u0bc1\u0ba9\u0bcd",s:"\u0b92\u0bb0\u0bc1 \u0b9a\u0bbf\u0bb2 \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",ss:"%d \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",m:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0bae\u0bcd",mm:"%d \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0b99\u0bcd\u0b95\u0bb3\u0bcd",h:"\u0b92\u0bb0\u0bc1 \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",hh:"%d \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",d:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbe\u0bb3\u0bcd",dd:"%d \u0ba8\u0bbe\u0b9f\u0bcd\u0b95\u0bb3\u0bcd",M:"\u0b92\u0bb0\u0bc1 \u0bae\u0bbe\u0ba4\u0bae\u0bcd",MM:"%d \u0bae\u0bbe\u0ba4\u0b99\u0bcd\u0b95\u0bb3\u0bcd",y:"\u0b92\u0bb0\u0bc1 \u0bb5\u0bb0\u0bc1\u0b9f\u0bae\u0bcd",yy:"%d \u0b86\u0ba3\u0bcd\u0b9f\u0bc1\u0b95\u0bb3\u0bcd"},dayOfMonthOrdinalParse:/\d{1,2}\u0bb5\u0ba4\u0bc1/,ordinal:function(e){return e+"\u0bb5\u0ba4\u0bc1"},preparse:function(e){return e.replace(/[\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0be6]/g,function(e){return _a[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return aa[e]})},meridiemParse:/\u0baf\u0bbe\u0bae\u0bae\u0bcd|\u0bb5\u0bc8\u0b95\u0bb1\u0bc8|\u0b95\u0bbe\u0bb2\u0bc8|\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd|\u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1|\u0bae\u0bbe\u0bb2\u0bc8/,meridiem:function(e,a,_){return e<2?" \u0baf\u0bbe\u0bae\u0bae\u0bcd":e<6?" \u0bb5\u0bc8\u0b95\u0bb1\u0bc8":e<10?" \u0b95\u0bbe\u0bb2\u0bc8":e<14?" \u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd":e<18?" \u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1":e<22?" \u0bae\u0bbe\u0bb2\u0bc8":" \u0baf\u0bbe\u0bae\u0bae\u0bcd"},meridiemHour:function(e,a){return 12===e&&(e=0),"\u0baf\u0bbe\u0bae\u0bae\u0bcd"===a?e<2?e:e+12:"\u0bb5\u0bc8\u0b95\u0bb1\u0bc8"===a||"\u0b95\u0bbe\u0bb2\u0bc8"===a||"\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd"===a&&10<=e?e:e+12},week:{dow:0,doy:6}}),e.defineLocale("te",{months:"\u0c1c\u0c28\u0c35\u0c30\u0c3f_\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f_\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d_\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c41\u0c32\u0c48_\u0c06\u0c17\u0c38\u0c4d\u0c1f\u0c41_\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c4d_\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c4d_\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c4d_\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c4d".split("_"),monthsShort:"\u0c1c\u0c28._\u0c2b\u0c3f\u0c2c\u0c4d\u0c30._\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f._\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c41\u0c32\u0c48_\u0c06\u0c17._\u0c38\u0c46\u0c2a\u0c4d._\u0c05\u0c15\u0c4d\u0c1f\u0c4b._\u0c28\u0c35._\u0c21\u0c3f\u0c38\u0c46.".split("_"),monthsParseExact:!0,weekdays:"\u0c06\u0c26\u0c3f\u0c35\u0c3e\u0c30\u0c02_\u0c38\u0c4b\u0c2e\u0c35\u0c3e\u0c30\u0c02_\u0c2e\u0c02\u0c17\u0c33\u0c35\u0c3e\u0c30\u0c02_\u0c2c\u0c41\u0c27\u0c35\u0c3e\u0c30\u0c02_\u0c17\u0c41\u0c30\u0c41\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c41\u0c15\u0c4d\u0c30\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c28\u0c3f\u0c35\u0c3e\u0c30\u0c02".split("_"),weekdaysShort:"\u0c06\u0c26\u0c3f_\u0c38\u0c4b\u0c2e_\u0c2e\u0c02\u0c17\u0c33_\u0c2c\u0c41\u0c27_\u0c17\u0c41\u0c30\u0c41_\u0c36\u0c41\u0c15\u0c4d\u0c30_\u0c36\u0c28\u0c3f".split("_"),weekdaysMin:"\u0c06_\u0c38\u0c4b_\u0c2e\u0c02_\u0c2c\u0c41_\u0c17\u0c41_\u0c36\u0c41_\u0c36".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c28\u0c47\u0c21\u0c41] LT",nextDay:"[\u0c30\u0c47\u0c2a\u0c41] LT",nextWeek:"dddd, LT",lastDay:"[\u0c28\u0c3f\u0c28\u0c4d\u0c28] LT",lastWeek:"[\u0c17\u0c24] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0c32\u0c4b",past:"%s \u0c15\u0c4d\u0c30\u0c3f\u0c24\u0c02",s:"\u0c15\u0c4a\u0c28\u0c4d\u0c28\u0c3f \u0c15\u0c4d\u0c37\u0c23\u0c3e\u0c32\u0c41",ss:"%d \u0c38\u0c46\u0c15\u0c28\u0c4d\u0c32\u0c41",m:"\u0c12\u0c15 \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c02",mm:"%d \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c3e\u0c32\u0c41",h:"\u0c12\u0c15 \u0c17\u0c02\u0c1f",hh:"%d \u0c17\u0c02\u0c1f\u0c32\u0c41",d:"\u0c12\u0c15 \u0c30\u0c4b\u0c1c\u0c41",dd:"%d \u0c30\u0c4b\u0c1c\u0c41\u0c32\u0c41",M:"\u0c12\u0c15 \u0c28\u0c46\u0c32",MM:"%d \u0c28\u0c46\u0c32\u0c32\u0c41",y:"\u0c12\u0c15 \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c02",yy:"%d \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c3e\u0c32\u0c41"},dayOfMonthOrdinalParse:/\d{1,2}\u0c35/,ordinal:"%d\u0c35",meridiemParse:/\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f|\u0c09\u0c26\u0c2f\u0c02|\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02|\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"===a?e<4?e:e+12:"\u0c09\u0c26\u0c2f\u0c02"===a?e:"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02"===a?10<=e?e:e+12:"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02"===a?e+12:void 0},meridiem:function(e,a,_){return e<4?"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f":e<10?"\u0c09\u0c26\u0c2f\u0c02":e<17?"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02":e<20?"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02":"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"},week:{dow:0,doy:6}}),e.defineLocale("tet",{months:"Janeiru_Fevereiru_Marsu_Abril_Maiu_Ju\xf1u_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu".split("_"),weekdaysShort:"Dom_Seg_Ters_Kua_Kint_Sest_Sab".split("_"),weekdaysMin:"Do_Seg_Te_Ku_Ki_Ses_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Ohin iha] LT",nextDay:"[Aban iha] LT",nextWeek:"dddd [iha] LT",lastDay:"[Horiseik iha] LT",lastWeek:"dddd [semana kotuk] [iha] LT",sameElse:"L"},relativeTime:{future:"iha %s",past:"%s liuba",s:"segundu balun",ss:"segundu %d",m:"minutu ida",mm:"minutu %d",h:"oras ida",hh:"oras %d",d:"loron ida",dd:"loron %d",M:"fulan ida",MM:"fulan %d",y:"tinan ida",yy:"tinan %d"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")},week:{dow:1,doy:4}}),{0:"-\u0443\u043c",1:"-\u0443\u043c",2:"-\u044e\u043c",3:"-\u044e\u043c",4:"-\u0443\u043c",5:"-\u0443\u043c",6:"-\u0443\u043c",7:"-\u0443\u043c",8:"-\u0443\u043c",9:"-\u0443\u043c",10:"-\u0443\u043c",12:"-\u0443\u043c",13:"-\u0443\u043c",20:"-\u0443\u043c",30:"-\u044e\u043c",40:"-\u0443\u043c",50:"-\u0443\u043c",60:"-\u0443\u043c",70:"-\u0443\u043c",80:"-\u0443\u043c",90:"-\u0443\u043c",100:"-\u0443\u043c"}),da=(e.defineLocale("tg",{months:{format:"\u044f\u043d\u0432\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0430\u043b\u0438_\u043c\u0430\u0440\u0442\u0438_\u0430\u043f\u0440\u0435\u043b\u0438_\u043c\u0430\u0439\u0438_\u0438\u044e\u043d\u0438_\u0438\u044e\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442\u0438_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u0438_\u043e\u043a\u0442\u044f\u0431\u0440\u0438_\u043d\u043e\u044f\u0431\u0440\u0438_\u0434\u0435\u043a\u0430\u0431\u0440\u0438".split("_"),standalone:"\u044f\u043d\u0432\u0430\u0440_\u0444\u0435\u0432\u0440\u0430\u043b_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440_\u043e\u043a\u0442\u044f\u0431\u0440_\u043d\u043e\u044f\u0431\u0440_\u0434\u0435\u043a\u0430\u0431\u0440".split("_")},monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u044f\u043a\u0448\u0430\u043d\u0431\u0435_\u0434\u0443\u0448\u0430\u043d\u0431\u0435_\u0441\u0435\u0448\u0430\u043d\u0431\u0435_\u0447\u043e\u0440\u0448\u0430\u043d\u0431\u0435_\u043f\u0430\u043d\u04b7\u0448\u0430\u043d\u0431\u0435_\u04b7\u0443\u043c\u044a\u0430_\u0448\u0430\u043d\u0431\u0435".split("_"),weekdaysShort:"\u044f\u0448\u0431_\u0434\u0448\u0431_\u0441\u0448\u0431_\u0447\u0448\u0431_\u043f\u0448\u0431_\u04b7\u0443\u043c_\u0448\u043d\u0431".split("_"),weekdaysMin:"\u044f\u0448_\u0434\u0448_\u0441\u0448_\u0447\u0448_\u043f\u0448_\u04b7\u043c_\u0448\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0418\u043c\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextDay:"[\u0424\u0430\u0440\u0434\u043e \u0441\u043e\u0430\u0442\u0438] LT",lastDay:"[\u0414\u0438\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u043e\u044f\u043d\u0434\u0430 \u0441\u043e\u0430\u0442\u0438] LT",lastWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u0433\u0443\u0437\u0430\u0448\u0442\u0430 \u0441\u043e\u0430\u0442\u0438] LT",sameElse:"L"},relativeTime:{future:"\u0431\u0430\u044a\u0434\u0438 %s",past:"%s \u043f\u0435\u0448",s:"\u044f\u043a\u0447\u0430\u043d\u0434 \u0441\u043e\u043d\u0438\u044f",m:"\u044f\u043a \u0434\u0430\u049b\u0438\u049b\u0430",mm:"%d \u0434\u0430\u049b\u0438\u049b\u0430",h:"\u044f\u043a \u0441\u043e\u0430\u0442",hh:"%d \u0441\u043e\u0430\u0442",d:"\u044f\u043a \u0440\u04ef\u0437",dd:"%d \u0440\u04ef\u0437",M:"\u044f\u043a \u043c\u043e\u04b3",MM:"%d \u043c\u043e\u04b3",y:"\u044f\u043a \u0441\u043e\u043b",yy:"%d \u0441\u043e\u043b"},meridiemParse:/\u0448\u0430\u0431|\u0441\u0443\u0431\u04b3|\u0440\u04ef\u0437|\u0431\u0435\u0433\u043e\u04b3/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0448\u0430\u0431"===a?e<4?e:e+12:"\u0441\u0443\u0431\u04b3"===a?e:"\u0440\u04ef\u0437"===a?11<=e?e:e+12:"\u0431\u0435\u0433\u043e\u04b3"===a?e+12:void 0},meridiem:function(e,a,_){return e<4?"\u0448\u0430\u0431":e<11?"\u0441\u0443\u0431\u04b3":e<16?"\u0440\u04ef\u0437":e<19?"\u0431\u0435\u0433\u043e\u04b3":"\u0448\u0430\u0431"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0443\u043c|\u044e\u043c)/,ordinal:function(e){return e+(sa[e]||sa[e%10]||sa[100<=e?100:null])},week:{dow:1,doy:7}}),e.defineLocale("th",{months:"\u0e21\u0e01\u0e23\u0e32\u0e04\u0e21_\u0e01\u0e38\u0e21\u0e20\u0e32\u0e1e\u0e31\u0e19\u0e18\u0e4c_\u0e21\u0e35\u0e19\u0e32\u0e04\u0e21_\u0e40\u0e21\u0e29\u0e32\u0e22\u0e19_\u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21_\u0e21\u0e34\u0e16\u0e38\u0e19\u0e32\u0e22\u0e19_\u0e01\u0e23\u0e01\u0e0e\u0e32\u0e04\u0e21_\u0e2a\u0e34\u0e07\u0e2b\u0e32\u0e04\u0e21_\u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19_\u0e15\u0e38\u0e25\u0e32\u0e04\u0e21_\u0e1e\u0e24\u0e28\u0e08\u0e34\u0e01\u0e32\u0e22\u0e19_\u0e18\u0e31\u0e19\u0e27\u0e32\u0e04\u0e21".split("_"),monthsShort:"\u0e21.\u0e04._\u0e01.\u0e1e._\u0e21\u0e35.\u0e04._\u0e40\u0e21.\u0e22._\u0e1e.\u0e04._\u0e21\u0e34.\u0e22._\u0e01.\u0e04._\u0e2a.\u0e04._\u0e01.\u0e22._\u0e15.\u0e04._\u0e1e.\u0e22._\u0e18.\u0e04.".split("_"),monthsParseExact:!0,weekdays:"\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c_\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c_\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23_\u0e1e\u0e38\u0e18_\u0e1e\u0e24\u0e2b\u0e31\u0e2a\u0e1a\u0e14\u0e35_\u0e28\u0e38\u0e01\u0e23\u0e4c_\u0e40\u0e2a\u0e32\u0e23\u0e4c".split("_"),weekdaysShort:"\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c_\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c_\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23_\u0e1e\u0e38\u0e18_\u0e1e\u0e24\u0e2b\u0e31\u0e2a_\u0e28\u0e38\u0e01\u0e23\u0e4c_\u0e40\u0e2a\u0e32\u0e23\u0e4c".split("_"),weekdaysMin:"\u0e2d\u0e32._\u0e08._\u0e2d._\u0e1e._\u0e1e\u0e24._\u0e28._\u0e2a.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY \u0e40\u0e27\u0e25\u0e32 H:mm",LLLL:"\u0e27\u0e31\u0e19dddd\u0e17\u0e35\u0e48 D MMMM YYYY \u0e40\u0e27\u0e25\u0e32 H:mm"},meridiemParse:/\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07|\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07/,isPM:function(e){return"\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07"===e},meridiem:function(e,a,_){return e<12?"\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07":"\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07"},calendar:{sameDay:"[\u0e27\u0e31\u0e19\u0e19\u0e35\u0e49 \u0e40\u0e27\u0e25\u0e32] LT",nextDay:"[\u0e1e\u0e23\u0e38\u0e48\u0e07\u0e19\u0e35\u0e49 \u0e40\u0e27\u0e25\u0e32] LT",nextWeek:"dddd[\u0e2b\u0e19\u0e49\u0e32 \u0e40\u0e27\u0e25\u0e32] LT",lastDay:"[\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e27\u0e32\u0e19\u0e19\u0e35\u0e49 \u0e40\u0e27\u0e25\u0e32] LT",lastWeek:"[\u0e27\u0e31\u0e19]dddd[\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27 \u0e40\u0e27\u0e25\u0e32] LT",sameElse:"L"},relativeTime:{future:"\u0e2d\u0e35\u0e01 %s",past:"%s\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27",s:"\u0e44\u0e21\u0e48\u0e01\u0e35\u0e48\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35",ss:"%d \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35",m:"1 \u0e19\u0e32\u0e17\u0e35",mm:"%d \u0e19\u0e32\u0e17\u0e35",h:"1 \u0e0a\u0e31\u0e48\u0e27\u0e42\u0e21\u0e07",hh:"%d \u0e0a\u0e31\u0e48\u0e27\u0e42\u0e21\u0e07",d:"1 \u0e27\u0e31\u0e19",dd:"%d \u0e27\u0e31\u0e19",w:"1 \u0e2a\u0e31\u0e1b\u0e14\u0e32\u0e2b\u0e4c",ww:"%d \u0e2a\u0e31\u0e1b\u0e14\u0e32\u0e2b\u0e4c",M:"1 \u0e40\u0e14\u0e37\u0e2d\u0e19",MM:"%d \u0e40\u0e14\u0e37\u0e2d\u0e19",y:"1 \u0e1b\u0e35",yy:"%d \u0e1b\u0e35"}}),{1:"'inji",5:"'inji",8:"'inji",70:"'inji",80:"'inji",2:"'nji",7:"'nji",20:"'nji",50:"'nji",3:"'\xfcnji",4:"'\xfcnji",100:"'\xfcnji",6:"'njy",9:"'unjy",10:"'unjy",30:"'unjy",60:"'ynjy",90:"'ynjy"}),ta=(e.defineLocale("tk",{months:"\xddanwar_Fewral_Mart_Aprel_Ma\xfd_I\xfdun_I\xfdul_Awgust_Sent\xfdabr_Okt\xfdabr_No\xfdabr_Dekabr".split("_"),monthsShort:"\xddan_Few_Mar_Apr_Ma\xfd_I\xfdn_I\xfdl_Awg_Sen_Okt_No\xfd_Dek".split("_"),weekdays:"\xddek\u015fenbe_Du\u015fenbe_Si\u015fenbe_\xc7ar\u015fenbe_Pen\u015fenbe_Anna_\u015eenbe".split("_"),weekdaysShort:"\xddek_Du\u015f_Si\u015f_\xc7ar_Pen_Ann_\u015een".split("_"),weekdaysMin:"\xddk_D\u015f_S\u015f_\xc7r_Pn_An_\u015en".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn sagat] LT",nextDay:"[ertir sagat] LT",nextWeek:"[indiki] dddd [sagat] LT",lastDay:"[d\xfc\xfdn] LT",lastWeek:"[ge\xe7en] dddd [sagat] LT",sameElse:"L"},relativeTime:{future:"%s so\u0148",past:"%s \xf6\u0148",s:"birn\xe4\xe7e sekunt",m:"bir minut",mm:"%d minut",h:"bir sagat",hh:"%d sagat",d:"bir g\xfcn",dd:"%d g\xfcn",M:"bir a\xfd",MM:"%d a\xfd",y:"bir \xfdyl",yy:"%d \xfdyl"},ordinal:function(e,a){switch(a){case"d":case"D":case"Do":case"DD":return e;default:if(0===e)return e+"'unjy";var _=e%10;return e+(da[_]||da[e%100-_]||da[100<=e?100:null])}},week:{dow:1,doy:7}}),e.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(e){return e},week:{dow:1,doy:4}}),"pagh_wa\u2019_cha\u2019_wej_loS_vagh_jav_Soch_chorgh_Hut".split("_"));function na(e,a,_,s){var d=function(e){var a=Math.floor(e%1e3/100),_=Math.floor(e%100/10),e=e%10,s="";0<a&&(s+=ta[a]+"vatlh");0<_&&(s+=(""!==s?" ":"")+ta[_]+"maH");0<e&&(s+=(""!==s?" ":"")+ta[e]);return""===s?"pagh":s}(e);switch(_){case"ss":return d+" lup";case"mm":return d+" tup";case"hh":return d+" rep";case"dd":return d+" jaj";case"MM":return d+" jar";case"yy":return d+" DIS"}}e.defineLocale("tlh",{months:"tera\u2019 jar wa\u2019_tera\u2019 jar cha\u2019_tera\u2019 jar wej_tera\u2019 jar loS_tera\u2019 jar vagh_tera\u2019 jar jav_tera\u2019 jar Soch_tera\u2019 jar chorgh_tera\u2019 jar Hut_tera\u2019 jar wa\u2019maH_tera\u2019 jar wa\u2019maH wa\u2019_tera\u2019 jar wa\u2019maH cha\u2019".split("_"),monthsShort:"jar wa\u2019_jar cha\u2019_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa\u2019maH_jar wa\u2019maH wa\u2019_jar wa\u2019maH cha\u2019".split("_"),monthsParseExact:!0,weekdays:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysShort:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysMin:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[DaHjaj] LT",nextDay:"[wa\u2019leS] LT",nextWeek:"LLL",lastDay:"[wa\u2019Hu\u2019] LT",lastWeek:"LLL",sameElse:"L"},relativeTime:{future:function(e){var a=e;return a=-1!==e.indexOf("jaj")?a.slice(0,-3)+"leS":-1!==e.indexOf("jar")?a.slice(0,-3)+"waQ":-1!==e.indexOf("DIS")?a.slice(0,-3)+"nem":a+" pIq"},past:function(e){var a=e;return a=-1!==e.indexOf("jaj")?a.slice(0,-3)+"Hu\u2019":-1!==e.indexOf("jar")?a.slice(0,-3)+"wen":-1!==e.indexOf("DIS")?a.slice(0,-3)+"ben":a+" ret"},s:"puS lup",ss:na,m:"wa\u2019 tup",mm:na,h:"wa\u2019 rep",hh:na,d:"wa\u2019 jaj",dd:na,M:"wa\u2019 jar",MM:na,y:"wa\u2019 DIS",yy:na},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});var ra={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'\xfcnc\xfc",4:"'\xfcnc\xfc",100:"'\xfcnc\xfc",6:"'nc\u0131",9:"'uncu",10:"'uncu",30:"'uncu",60:"'\u0131nc\u0131",90:"'\u0131nc\u0131"};function A(e,a,_,s){e={s:["viensas secunds","'iensas secunds"],ss:[e+" secunds",e+" secunds"],m:["'n m\xedut","'iens m\xedut"],mm:[e+" m\xeduts",e+" m\xeduts"],h:["'n \xfeora","'iensa \xfeora"],hh:[e+" \xfeoras",e+" \xfeoras"],d:["'n ziua","'iensa ziua"],dd:[e+" ziuas",e+" ziuas"],M:["'n mes","'iens mes"],MM:[e+" mesen",e+" mesen"],y:["'n ar","'iens ar"],yy:[e+" ars",e+" ars"]};return s||a?e[_][0]:e[_][1]}function O(e,a,_){return"m"===_?a?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443":"h"===_?a?"\u0433\u043e\u0434\u0438\u043d\u0430":"\u0433\u043e\u0434\u0438\u043d\u0443":e+" "+(e=+e,a=(a={ss:a?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434",mm:a?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d",hh:a?"\u0433\u043e\u0434\u0438\u043d\u0430_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d":"\u0433\u043e\u0434\u0438\u043d\u0443_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u043d\u0456\u0432",MM:"\u043c\u0456\u0441\u044f\u0446\u044c_\u043c\u0456\u0441\u044f\u0446\u0456_\u043c\u0456\u0441\u044f\u0446\u0456\u0432",yy:"\u0440\u0456\u043a_\u0440\u043e\u043a\u0438_\u0440\u043e\u043a\u0456\u0432"}[_]).split("_"),e%10==1&&e%100!=11?a[0]:2<=e%10&&e%10<=4&&(e%100<10||20<=e%100)?a[1]:a[2])}function ia(e){return function(){return e+"\u043e"+(11===this.hours()?"\u0431":"")+"] LT"}}e.defineLocale("tr",{months:"Ocak_\u015eubat_Mart_Nisan_May\u0131s_Haziran_Temmuz_A\u011fustos_Eyl\xfcl_Ekim_Kas\u0131m_Aral\u0131k".split("_"),monthsShort:"Oca_\u015eub_Mar_Nis_May_Haz_Tem_A\u011fu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Sal\u0131_\xc7ar\u015famba_Per\u015fembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pzt_Sal_\xc7ar_Per_Cum_Cmt".split("_"),weekdaysMin:"Pz_Pt_Sa_\xc7a_Pe_Cu_Ct".split("_"),meridiem:function(e,a,_){return e<12?_?"\xf6\xf6":"\xd6\xd6":_?"\xf6s":"\xd6S"},meridiemParse:/\xf6\xf6|\xd6\xd6|\xf6s|\xd6S/,isPM:function(e){return"\xf6s"===e||"\xd6S"===e},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn saat] LT",nextDay:"[yar\u0131n saat] LT",nextWeek:"[gelecek] dddd [saat] LT",lastDay:"[d\xfcn] LT",lastWeek:"[ge\xe7en] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s \xf6nce",s:"birka\xe7 saniye",ss:"%d saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir g\xfcn",dd:"%d g\xfcn",w:"bir hafta",ww:"%d hafta",M:"bir ay",MM:"%d ay",y:"bir y\u0131l",yy:"%d y\u0131l"},ordinal:function(e,a){switch(a){case"d":case"D":case"Do":case"DD":return e;default:if(0===e)return e+"'\u0131nc\u0131";var _=e%10;return e+(ra[_]||ra[e%100-_]||ra[100<=e?100:null])}},week:{dow:1,doy:7}}),e.defineLocale("tzl",{months:"Januar_Fevraglh_Mar\xe7_Avr\xefu_Mai_G\xfcn_Julia_Guscht_Setemvar_Listop\xe4ts_Noemvar_Zecemvar".split("_"),monthsShort:"Jan_Fev_Mar_Avr_Mai_G\xfcn_Jul_Gus_Set_Lis_Noe_Zec".split("_"),weekdays:"S\xfaladi_L\xfane\xe7i_Maitzi_M\xe1rcuri_Xh\xfaadi_Vi\xe9ner\xe7i_S\xe1turi".split("_"),weekdaysShort:"S\xfal_L\xfan_Mai_M\xe1r_Xh\xfa_Vi\xe9_S\xe1t".split("_"),weekdaysMin:"S\xfa_L\xfa_Ma_M\xe1_Xh_Vi_S\xe1".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM [dallas] YYYY",LLL:"D. MMMM [dallas] YYYY HH.mm",LLLL:"dddd, [li] D. MMMM [dallas] YYYY HH.mm"},meridiemParse:/d\'o|d\'a/i,isPM:function(e){return"d'o"===e.toLowerCase()},meridiem:function(e,a,_){return 11<e?_?"d'o":"D'O":_?"d'a":"D'A"},calendar:{sameDay:"[oxhi \xe0] LT",nextDay:"[dem\xe0 \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[ieiri \xe0] LT",lastWeek:"[s\xfcr el] dddd [lasteu \xe0] LT",sameElse:"L"},relativeTime:{future:"osprei %s",past:"ja%s",s:A,ss:A,m:A,mm:A,h:A,hh:A,d:A,dd:A,M:A,MM:A,y:A,yy:A},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),e.defineLocale("tzm-latn",{months:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",ss:"%d imik",m:"minu\u1e0d",mm:"%d minu\u1e0d",h:"sa\u025ba",hh:"%d tassa\u025bin",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}}),e.defineLocale("tzm",{months:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),monthsShort:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),weekdays:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysShort:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysMin:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u2d30\u2d59\u2d37\u2d45 \u2d34] LT",nextDay:"[\u2d30\u2d59\u2d3d\u2d30 \u2d34] LT",nextWeek:"dddd [\u2d34] LT",lastDay:"[\u2d30\u2d5a\u2d30\u2d4f\u2d5c \u2d34] LT",lastWeek:"dddd [\u2d34] LT",sameElse:"L"},relativeTime:{future:"\u2d37\u2d30\u2d37\u2d45 \u2d59 \u2d62\u2d30\u2d4f %s",past:"\u2d62\u2d30\u2d4f %s",s:"\u2d49\u2d4e\u2d49\u2d3d",ss:"%d \u2d49\u2d4e\u2d49\u2d3d",m:"\u2d4e\u2d49\u2d4f\u2d53\u2d3a",mm:"%d \u2d4e\u2d49\u2d4f\u2d53\u2d3a",h:"\u2d59\u2d30\u2d44\u2d30",hh:"%d \u2d5c\u2d30\u2d59\u2d59\u2d30\u2d44\u2d49\u2d4f",d:"\u2d30\u2d59\u2d59",dd:"%d o\u2d59\u2d59\u2d30\u2d4f",M:"\u2d30\u2d62o\u2d53\u2d54",MM:"%d \u2d49\u2d62\u2d62\u2d49\u2d54\u2d4f",y:"\u2d30\u2d59\u2d33\u2d30\u2d59",yy:"%d \u2d49\u2d59\u2d33\u2d30\u2d59\u2d4f"},week:{dow:6,doy:12}}),e.defineLocale("ug-cn",{months:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),monthsShort:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),weekdays:"\u064a\u06d5\u0643\u0634\u06d5\u0646\u0628\u06d5_\u062f\u06c8\u0634\u06d5\u0646\u0628\u06d5_\u0633\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u0686\u0627\u0631\u0634\u06d5\u0646\u0628\u06d5_\u067e\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u062c\u06c8\u0645\u06d5_\u0634\u06d5\u0646\u0628\u06d5".split("_"),weekdaysShort:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),weekdaysMin:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649",LLL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm",LLLL:"dddd\u060c YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm"},meridiemParse:/\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5|\u0633\u06d5\u06be\u06d5\u0631|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646|\u0686\u06c8\u0634|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646|\u0643\u06d5\u0686/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5"===a||"\u0633\u06d5\u06be\u06d5\u0631"===a||"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646"===a||"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646"!==a&&"\u0643\u06d5\u0686"!==a&&11<=e?e:e+12},meridiem:function(e,a,_){e=100*e+a;return e<600?"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5":e<900?"\u0633\u06d5\u06be\u06d5\u0631":e<1130?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646":e<1230?"\u0686\u06c8\u0634":e<1800?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646":"\u0643\u06d5\u0686"},calendar:{sameDay:"[\u0628\u06c8\u06af\u06c8\u0646 \u0633\u0627\u0626\u06d5\u062a] LT",nextDay:"[\u0626\u06d5\u062a\u06d5 \u0633\u0627\u0626\u06d5\u062a] LT",nextWeek:"[\u0643\u06d0\u0644\u06d5\u0631\u0643\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",lastDay:"[\u062a\u06c6\u0646\u06c8\u06af\u06c8\u0646] LT",lastWeek:"[\u0626\u0627\u0644\u062f\u0649\u0646\u0642\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0643\u06d0\u064a\u0649\u0646",past:"%s \u0628\u06c7\u0631\u06c7\u0646",s:"\u0646\u06d5\u0686\u0686\u06d5 \u0633\u06d0\u0643\u0648\u0646\u062a",ss:"%d \u0633\u06d0\u0643\u0648\u0646\u062a",m:"\u0628\u0649\u0631 \u0645\u0649\u0646\u06c7\u062a",mm:"%d \u0645\u0649\u0646\u06c7\u062a",h:"\u0628\u0649\u0631 \u0633\u0627\u0626\u06d5\u062a",hh:"%d \u0633\u0627\u0626\u06d5\u062a",d:"\u0628\u0649\u0631 \u0643\u06c8\u0646",dd:"%d \u0643\u06c8\u0646",M:"\u0628\u0649\u0631 \u0626\u0627\u064a",MM:"%d \u0626\u0627\u064a",y:"\u0628\u0649\u0631 \u064a\u0649\u0644",yy:"%d \u064a\u0649\u0644"},dayOfMonthOrdinalParse:/\d{1,2}(-\u0643\u06c8\u0646\u0649|-\u0626\u0627\u064a|-\u06be\u06d5\u067e\u062a\u06d5)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"-\u0643\u06c8\u0646\u0649";case"w":case"W":return e+"-\u06be\u06d5\u067e\u062a\u06d5";default:return e}},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:1,doy:7}}),e.defineLocale("uk",{months:{format:"\u0441\u0456\u0447\u043d\u044f_\u043b\u044e\u0442\u043e\u0433\u043e_\u0431\u0435\u0440\u0435\u0437\u043d\u044f_\u043a\u0432\u0456\u0442\u043d\u044f_\u0442\u0440\u0430\u0432\u043d\u044f_\u0447\u0435\u0440\u0432\u043d\u044f_\u043b\u0438\u043f\u043d\u044f_\u0441\u0435\u0440\u043f\u043d\u044f_\u0432\u0435\u0440\u0435\u0441\u043d\u044f_\u0436\u043e\u0432\u0442\u043d\u044f_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434\u0430_\u0433\u0440\u0443\u0434\u043d\u044f".split("_"),standalone:"\u0441\u0456\u0447\u0435\u043d\u044c_\u043b\u044e\u0442\u0438\u0439_\u0431\u0435\u0440\u0435\u0437\u0435\u043d\u044c_\u043a\u0432\u0456\u0442\u0435\u043d\u044c_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u0435\u0440\u0432\u0435\u043d\u044c_\u043b\u0438\u043f\u0435\u043d\u044c_\u0441\u0435\u0440\u043f\u0435\u043d\u044c_\u0432\u0435\u0440\u0435\u0441\u0435\u043d\u044c_\u0436\u043e\u0432\u0442\u0435\u043d\u044c_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434_\u0433\u0440\u0443\u0434\u0435\u043d\u044c".split("_")},monthsShort:"\u0441\u0456\u0447_\u043b\u044e\u0442_\u0431\u0435\u0440_\u043a\u0432\u0456\u0442_\u0442\u0440\u0430\u0432_\u0447\u0435\u0440\u0432_\u043b\u0438\u043f_\u0441\u0435\u0440\u043f_\u0432\u0435\u0440_\u0436\u043e\u0432\u0442_\u043b\u0438\u0441\u0442_\u0433\u0440\u0443\u0434".split("_"),weekdays:function(e,a){var _={nominative:"\u043d\u0435\u0434\u0456\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044f_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),accusative:"\u043d\u0435\u0434\u0456\u043b\u044e_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044e_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),genitive:"\u043d\u0435\u0434\u0456\u043b\u0456_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043a\u0430_\u0432\u0456\u0432\u0442\u043e\u0440\u043a\u0430_\u0441\u0435\u0440\u0435\u0434\u0438_\u0447\u0435\u0442\u0432\u0435\u0440\u0433\u0430_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u0456_\u0441\u0443\u0431\u043e\u0442\u0438".split("_")};return!0===e?_.nominative.slice(1,7).concat(_.nominative.slice(0,1)):e?_[/(\[[\u0412\u0432\u0423\u0443]\]) ?dddd/.test(a)?"accusative":/\[?(?:\u043c\u0438\u043d\u0443\u043b\u043e\u0457|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u043e\u0457)? ?\] ?dddd/.test(a)?"genitive":"nominative"][e.day()]:_.nominative},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0440.",LLL:"D MMMM YYYY \u0440., HH:mm",LLLL:"dddd, D MMMM YYYY \u0440., HH:mm"},calendar:{sameDay:ia("[\u0421\u044c\u043e\u0433\u043e\u0434\u043d\u0456 "),nextDay:ia("[\u0417\u0430\u0432\u0442\u0440\u0430 "),lastDay:ia("[\u0412\u0447\u043e\u0440\u0430 "),nextWeek:ia("[\u0423] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return ia("[\u041c\u0438\u043d\u0443\u043b\u043e\u0457] dddd [").call(this);case 1:case 2:case 4:return ia("[\u041c\u0438\u043d\u0443\u043b\u043e\u0433\u043e] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"%s \u0442\u043e\u043c\u0443",s:"\u0434\u0435\u043a\u0456\u043b\u044c\u043a\u0430 \u0441\u0435\u043a\u0443\u043d\u0434",ss:O,m:O,mm:O,h:"\u0433\u043e\u0434\u0438\u043d\u0443",hh:O,d:"\u0434\u0435\u043d\u044c",dd:O,M:"\u043c\u0456\u0441\u044f\u0446\u044c",MM:O,y:"\u0440\u0456\u043a",yy:O},meridiemParse:/\u043d\u043e\u0447\u0456|\u0440\u0430\u043d\u043a\u0443|\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430/,isPM:function(e){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430)$/.test(e)},meridiem:function(e,a,_){return e<4?"\u043d\u043e\u0447\u0456":e<12?"\u0440\u0430\u043d\u043a\u0443":e<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u043e\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e)/,ordinal:function(e,a){switch(a){case"M":case"d":case"DDD":case"w":case"W":return e+"-\u0439";case"D":return e+"-\u0433\u043e";default:return e}},week:{dow:1,doy:7}});n=["\u062c\u0646\u0648\u0631\u06cc","\u0641\u0631\u0648\u0631\u06cc","\u0645\u0627\u0631\u0686","\u0627\u067e\u0631\u06cc\u0644","\u0645\u0626\u06cc","\u062c\u0648\u0646","\u062c\u0648\u0644\u0627\u0626\u06cc","\u0627\u06af\u0633\u062a","\u0633\u062a\u0645\u0628\u0631","\u0627\u06a9\u062a\u0648\u0628\u0631","\u0646\u0648\u0645\u0628\u0631","\u062f\u0633\u0645\u0628\u0631"],r=["\u0627\u062a\u0648\u0627\u0631","\u067e\u06cc\u0631","\u0645\u0646\u06af\u0644","\u0628\u062f\u06be","\u062c\u0645\u0639\u0631\u0627\u062a","\u062c\u0645\u0639\u06c1","\u06c1\u0641\u062a\u06c1"];return e.defineLocale("ur",{months:n,monthsShort:n,weekdays:r,weekdaysShort:r,weekdaysMin:r,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd\u060c D MMMM YYYY HH:mm"},meridiemParse:/\u0635\u0628\u062d|\u0634\u0627\u0645/,isPM:function(e){return"\u0634\u0627\u0645"===e},meridiem:function(e,a,_){return e<12?"\u0635\u0628\u062d":"\u0634\u0627\u0645"},calendar:{sameDay:"[\u0622\u062c \u0628\u0648\u0642\u062a] LT",nextDay:"[\u06a9\u0644 \u0628\u0648\u0642\u062a] LT",nextWeek:"dddd [\u0628\u0648\u0642\u062a] LT",lastDay:"[\u06af\u0630\u0634\u062a\u06c1 \u0631\u0648\u0632 \u0628\u0648\u0642\u062a] LT",lastWeek:"[\u06af\u0630\u0634\u062a\u06c1] dddd [\u0628\u0648\u0642\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0628\u0639\u062f",past:"%s \u0642\u0628\u0644",s:"\u0686\u0646\u062f \u0633\u06cc\u06a9\u0646\u0688",ss:"%d \u0633\u06cc\u06a9\u0646\u0688",m:"\u0627\u06cc\u06a9 \u0645\u0646\u0679",mm:"%d \u0645\u0646\u0679",h:"\u0627\u06cc\u06a9 \u06af\u06be\u0646\u0679\u06c1",hh:"%d \u06af\u06be\u0646\u0679\u06d2",d:"\u0627\u06cc\u06a9 \u062f\u0646",dd:"%d \u062f\u0646",M:"\u0627\u06cc\u06a9 \u0645\u0627\u06c1",MM:"%d \u0645\u0627\u06c1",y:"\u0627\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:1,doy:4}}),e.defineLocale("uz-latn",{months:"Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr".split("_"),monthsShort:"Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek".split("_"),weekdays:"Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba".split("_"),weekdaysShort:"Yak_Dush_Sesh_Chor_Pay_Jum_Shan".split("_"),weekdaysMin:"Ya_Du_Se_Cho_Pa_Ju_Sha".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Bugun soat] LT [da]",nextDay:"[Ertaga] LT [da]",nextWeek:"dddd [kuni soat] LT [da]",lastDay:"[Kecha soat] LT [da]",lastWeek:"[O'tgan] dddd [kuni soat] LT [da]",sameElse:"L"},relativeTime:{future:"Yaqin %s ichida",past:"Bir necha %s oldin",s:"soniya",ss:"%d soniya",m:"bir daqiqa",mm:"%d daqiqa",h:"bir soat",hh:"%d soat",d:"bir kun",dd:"%d kun",M:"bir oy",MM:"%d oy",y:"bir yil",yy:"%d yil"},week:{dow:1,doy:7}}),e.defineLocale("uz",{months:"\u044f\u043d\u0432\u0430\u0440_\u0444\u0435\u0432\u0440\u0430\u043b_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440_\u043e\u043a\u0442\u044f\u0431\u0440_\u043d\u043e\u044f\u0431\u0440_\u0434\u0435\u043a\u0430\u0431\u0440".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u042f\u043a\u0448\u0430\u043d\u0431\u0430_\u0414\u0443\u0448\u0430\u043d\u0431\u0430_\u0421\u0435\u0448\u0430\u043d\u0431\u0430_\u0427\u043e\u0440\u0448\u0430\u043d\u0431\u0430_\u041f\u0430\u0439\u0448\u0430\u043d\u0431\u0430_\u0416\u0443\u043c\u0430_\u0428\u0430\u043d\u0431\u0430".split("_"),weekdaysShort:"\u042f\u043a\u0448_\u0414\u0443\u0448_\u0421\u0435\u0448_\u0427\u043e\u0440_\u041f\u0430\u0439_\u0416\u0443\u043c_\u0428\u0430\u043d".split("_"),weekdaysMin:"\u042f\u043a_\u0414\u0443_\u0421\u0435_\u0427\u043e_\u041f\u0430_\u0416\u0443_\u0428\u0430".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[\u0411\u0443\u0433\u0443\u043d \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",nextDay:"[\u042d\u0440\u0442\u0430\u0433\u0430] LT [\u0434\u0430]",nextWeek:"dddd [\u043a\u0443\u043d\u0438 \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",lastDay:"[\u041a\u0435\u0447\u0430 \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",lastWeek:"[\u0423\u0442\u0433\u0430\u043d] dddd [\u043a\u0443\u043d\u0438 \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",sameElse:"L"},relativeTime:{future:"\u042f\u043a\u0438\u043d %s \u0438\u0447\u0438\u0434\u0430",past:"\u0411\u0438\u0440 \u043d\u0435\u0447\u0430 %s \u043e\u043b\u0434\u0438\u043d",s:"\u0444\u0443\u0440\u0441\u0430\u0442",ss:"%d \u0444\u0443\u0440\u0441\u0430\u0442",m:"\u0431\u0438\u0440 \u0434\u0430\u043a\u0438\u043a\u0430",mm:"%d \u0434\u0430\u043a\u0438\u043a\u0430",h:"\u0431\u0438\u0440 \u0441\u043e\u0430\u0442",hh:"%d \u0441\u043e\u0430\u0442",d:"\u0431\u0438\u0440 \u043a\u0443\u043d",dd:"%d \u043a\u0443\u043d",M:"\u0431\u0438\u0440 \u043e\u0439",MM:"%d \u043e\u0439",y:"\u0431\u0438\u0440 \u0439\u0438\u043b",yy:"%d \u0439\u0438\u043b"},week:{dow:1,doy:7}}),e.defineLocale("vi",{months:"th\xe1ng 1_th\xe1ng 2_th\xe1ng 3_th\xe1ng 4_th\xe1ng 5_th\xe1ng 6_th\xe1ng 7_th\xe1ng 8_th\xe1ng 9_th\xe1ng 10_th\xe1ng 11_th\xe1ng 12".split("_"),monthsShort:"Thg 01_Thg 02_Thg 03_Thg 04_Thg 05_Thg 06_Thg 07_Thg 08_Thg 09_Thg 10_Thg 11_Thg 12".split("_"),monthsParseExact:!0,weekdays:"ch\u1ee7 nh\u1eadt_th\u1ee9 hai_th\u1ee9 ba_th\u1ee9 t\u01b0_th\u1ee9 n\u0103m_th\u1ee9 s\xe1u_th\u1ee9 b\u1ea3y".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(e){return/^ch$/i.test(e)},meridiem:function(e,a,_){return e<12?_?"sa":"SA":_?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [n\u0103m] YYYY",LLL:"D MMMM [n\u0103m] YYYY HH:mm",LLLL:"dddd, D MMMM [n\u0103m] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[H\xf4m nay l\xfac] LT",nextDay:"[Ng\xe0y mai l\xfac] LT",nextWeek:"dddd [tu\u1ea7n t\u1edbi l\xfac] LT",lastDay:"[H\xf4m qua l\xfac] LT",lastWeek:"dddd [tu\u1ea7n tr\u01b0\u1edbc l\xfac] LT",sameElse:"L"},relativeTime:{future:"%s t\u1edbi",past:"%s tr\u01b0\u1edbc",s:"v\xe0i gi\xe2y",ss:"%d gi\xe2y",m:"m\u1ed9t ph\xfat",mm:"%d ph\xfat",h:"m\u1ed9t gi\u1edd",hh:"%d gi\u1edd",d:"m\u1ed9t ng\xe0y",dd:"%d ng\xe0y",w:"m\u1ed9t tu\u1ea7n",ww:"%d tu\u1ea7n",M:"m\u1ed9t th\xe1ng",MM:"%d th\xe1ng",y:"m\u1ed9t n\u0103m",yy:"%d n\u0103m"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(e){return e},week:{dow:1,doy:4}}),e.defineLocale("x-pseudo",{months:"J~\xe1\xf1\xfa\xe1~r\xfd_F~\xe9br\xfa~\xe1r\xfd_~M\xe1rc~h_\xc1p~r\xedl_~M\xe1\xfd_~J\xfa\xf1\xe9~_J\xfal~\xfd_\xc1\xfa~g\xfast~_S\xe9p~t\xe9mb~\xe9r_\xd3~ct\xf3b~\xe9r_\xd1~\xf3v\xe9m~b\xe9r_~D\xe9c\xe9~mb\xe9r".split("_"),monthsShort:"J~\xe1\xf1_~F\xe9b_~M\xe1r_~\xc1pr_~M\xe1\xfd_~J\xfa\xf1_~J\xfal_~\xc1\xfag_~S\xe9p_~\xd3ct_~\xd1\xf3v_~D\xe9c".split("_"),monthsParseExact:!0,weekdays:"S~\xfa\xf1d\xe1~\xfd_M\xf3~\xf1d\xe1\xfd~_T\xfa\xe9~sd\xe1\xfd~_W\xe9d~\xf1\xe9sd~\xe1\xfd_T~h\xfars~d\xe1\xfd_~Fr\xedd~\xe1\xfd_S~\xe1t\xfar~d\xe1\xfd".split("_"),weekdaysShort:"S~\xfa\xf1_~M\xf3\xf1_~T\xfa\xe9_~W\xe9d_~Th\xfa_~Fr\xed_~S\xe1t".split("_"),weekdaysMin:"S~\xfa_M\xf3~_T\xfa_~W\xe9_T~h_Fr~_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[T~\xf3d\xe1~\xfd \xe1t] LT",nextDay:"[T~\xf3m\xf3~rr\xf3~w \xe1t] LT",nextWeek:"dddd [\xe1t] LT",lastDay:"[\xdd~\xe9st~\xe9rd\xe1~\xfd \xe1t] LT",lastWeek:"[L~\xe1st] dddd [\xe1t] LT",sameElse:"L"},relativeTime:{future:"\xed~\xf1 %s",past:"%s \xe1~g\xf3",s:"\xe1 ~f\xe9w ~s\xe9c\xf3~\xf1ds",ss:"%d s~\xe9c\xf3\xf1~ds",m:"\xe1 ~m\xed\xf1~\xfat\xe9",mm:"%d m~\xed\xf1\xfa~t\xe9s",h:"\xe1~\xf1 h\xf3~\xfar",hh:"%d h~\xf3\xfars",d:"\xe1 ~d\xe1\xfd",dd:"%d d~\xe1\xfds",M:"\xe1 ~m\xf3\xf1~th",MM:"%d m~\xf3\xf1t~hs",y:"\xe1 ~\xfd\xe9\xe1r",yy:"%d \xfd~\xe9\xe1rs"},dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")},week:{dow:1,doy:4}}),e.defineLocale("yo",{months:"S\u1eb9\u0301r\u1eb9\u0301_E\u0300re\u0300le\u0300_\u1eb8r\u1eb9\u0300na\u0300_I\u0300gbe\u0301_E\u0300bibi_O\u0300ku\u0300du_Ag\u1eb9mo_O\u0300gu\u0301n_Owewe_\u1ecc\u0300wa\u0300ra\u0300_Be\u0301lu\u0301_\u1ecc\u0300p\u1eb9\u0300\u0300".split("_"),monthsShort:"S\u1eb9\u0301r_E\u0300rl_\u1eb8rn_I\u0300gb_E\u0300bi_O\u0300ku\u0300_Ag\u1eb9_O\u0300gu\u0301_Owe_\u1ecc\u0300wa\u0300_Be\u0301l_\u1ecc\u0300p\u1eb9\u0300\u0300".split("_"),weekdays:"A\u0300i\u0300ku\u0301_Aje\u0301_I\u0300s\u1eb9\u0301gun_\u1eccj\u1ecd\u0301ru\u0301_\u1eccj\u1ecd\u0301b\u1ecd_\u1eb8ti\u0300_A\u0300ba\u0301m\u1eb9\u0301ta".split("_"),weekdaysShort:"A\u0300i\u0300k_Aje\u0301_I\u0300s\u1eb9\u0301_\u1eccjr_\u1eccjb_\u1eb8ti\u0300_A\u0300ba\u0301".split("_"),weekdaysMin:"A\u0300i\u0300_Aj_I\u0300s_\u1eccr_\u1eccb_\u1eb8t_A\u0300b".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[O\u0300ni\u0300 ni] LT",nextDay:"[\u1ecc\u0300la ni] LT",nextWeek:"dddd [\u1eccs\u1eb9\u0300 to\u0301n'b\u1ecd] [ni] LT",lastDay:"[A\u0300na ni] LT",lastWeek:"dddd [\u1eccs\u1eb9\u0300 to\u0301l\u1ecd\u0301] [ni] LT",sameElse:"L"},relativeTime:{future:"ni\u0301 %s",past:"%s k\u1ecdja\u0301",s:"i\u0300s\u1eb9ju\u0301 aaya\u0301 die",ss:"aaya\u0301 %d",m:"i\u0300s\u1eb9ju\u0301 kan",mm:"i\u0300s\u1eb9ju\u0301 %d",h:"wa\u0301kati kan",hh:"wa\u0301kati %d",d:"\u1ecdj\u1ecd\u0301 kan",dd:"\u1ecdj\u1ecd\u0301 %d",M:"osu\u0300 kan",MM:"osu\u0300 %d",y:"\u1ecddu\u0301n kan",yy:"\u1ecddu\u0301n %d"},dayOfMonthOrdinalParse:/\u1ecdj\u1ecd\u0301\s\d{1,2}/,ordinal:"\u1ecdj\u1ecd\u0301 %d",week:{dow:1,doy:4}}),e.defineLocale("zh-cn",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u5468\u65e5_\u5468\u4e00_\u5468\u4e8c_\u5468\u4e09_\u5468\u56db_\u5468\u4e94_\u5468\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5Ah\u70b9mm\u5206",LLLL:"YYYY\u5e74M\u6708D\u65e5ddddAh\u70b9mm\u5206",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u51cc\u6668"===a||"\u65e9\u4e0a"===a||"\u4e0a\u5348"===a||"\u4e0b\u5348"!==a&&"\u665a\u4e0a"!==a&&11<=e?e:e+12},meridiem:function(e,a,_){e=100*e+a;return e<600?"\u51cc\u6668":e<900?"\u65e9\u4e0a":e<1130?"\u4e0a\u5348":e<1230?"\u4e2d\u5348":e<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:function(e){return e.week()!==this.week()?"[\u4e0b]dddLT":"[\u672c]dddLT"},lastDay:"[\u6628\u5929]LT",lastWeek:function(e){return this.week()!==e.week()?"[\u4e0a]dddLT":"[\u672c]dddLT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u5468)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"\u65e5";case"M":return e+"\u6708";case"w":case"W":return e+"\u5468";default:return e}},relativeTime:{future:"%s\u540e",past:"%s\u524d",s:"\u51e0\u79d2",ss:"%d \u79d2",m:"1 \u5206\u949f",mm:"%d \u5206\u949f",h:"1 \u5c0f\u65f6",hh:"%d \u5c0f\u65f6",d:"1 \u5929",dd:"%d \u5929",w:"1 \u5468",ww:"%d \u5468",M:"1 \u4e2a\u6708",MM:"%d \u4e2a\u6708",y:"1 \u5e74",yy:"%d \u5e74"},week:{dow:1,doy:4}}),e.defineLocale("zh-hk",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u51cc\u6668"===a||"\u65e9\u4e0a"===a||"\u4e0a\u5348"===a?e:"\u4e2d\u5348"===a?11<=e?e:e+12:"\u4e0b\u5348"===a||"\u665a\u4e0a"===a?e+12:void 0},meridiem:function(e,a,_){e=100*e+a;return e<600?"\u51cc\u6668":e<900?"\u65e9\u4e0a":e<1200?"\u4e0a\u5348":1200===e?"\u4e2d\u5348":e<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"\u65e5";case"M":return e+"\u6708";case"w":case"W":return e+"\u9031";default:return e}},relativeTime:{future:"%s\u5f8c",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}}),e.defineLocale("zh-mo",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"D/M/YYYY",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u51cc\u6668"===a||"\u65e9\u4e0a"===a||"\u4e0a\u5348"===a?e:"\u4e2d\u5348"===a?11<=e?e:e+12:"\u4e0b\u5348"===a||"\u665a\u4e0a"===a?e+12:void 0},meridiem:function(e,a,_){e=100*e+a;return e<600?"\u51cc\u6668":e<900?"\u65e9\u4e0a":e<1130?"\u4e0a\u5348":e<1230?"\u4e2d\u5348":e<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929] LT",nextDay:"[\u660e\u5929] LT",nextWeek:"[\u4e0b]dddd LT",lastDay:"[\u6628\u5929] LT",lastWeek:"[\u4e0a]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"\u65e5";case"M":return e+"\u6708";case"w":case"W":return e+"\u9031";default:return e}},relativeTime:{future:"%s\u5167",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}}),e.defineLocale("zh-tw",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u51cc\u6668"===a||"\u65e9\u4e0a"===a||"\u4e0a\u5348"===a?e:"\u4e2d\u5348"===a?11<=e?e:e+12:"\u4e0b\u5348"===a||"\u665a\u4e0a"===a?e+12:void 0},meridiem:function(e,a,_){e=100*e+a;return e<600?"\u51cc\u6668":e<900?"\u65e9\u4e0a":e<1130?"\u4e0a\u5348":e<1230?"\u4e2d\u5348":e<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929] LT",nextDay:"[\u660e\u5929] LT",nextWeek:"[\u4e0b]dddd LT",lastDay:"[\u6628\u5929] LT",lastWeek:"[\u4e0a]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"\u65e5";case"M":return e+"\u6708";case"w":case"W":return e+"\u9031";default:return e}},relativeTime:{future:"%s\u5f8c",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}}),e.locale("en"),e});
//# sourceMappingURL=locales.min.js.map;(function (global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
    typeof define === 'function' && define.amd ? define(factory) :
    global.moment = factory()
}(this, (function () { 'use strict';

    var hookCallback;

    function hooks() {
        return hookCallback.apply(null, arguments);
    }

    // This is done to register the method called with moment()
    // without creating circular dependencies.
    function setHookCallback(callback) {
        hookCallback = callback;
    }

    function isArray(input) {
        return (
            input instanceof Array ||
            Object.prototype.toString.call(input) === '[object Array]'
        );
    }

    function isObject(input) {
        // IE8 will treat undefined and null as object if it wasn't for
        // input != null
        return (
            input != null &&
            Object.prototype.toString.call(input) === '[object Object]'
        );
    }

    function hasOwnProp(a, b) {
        return Object.prototype.hasOwnProperty.call(a, b);
    }

    function isObjectEmpty(obj) {
        if (Object.getOwnPropertyNames) {
            return Object.getOwnPropertyNames(obj).length === 0;
        } else {
            var k;
            for (k in obj) {
                if (hasOwnProp(obj, k)) {
                    return false;
                }
            }
            return true;
        }
    }

    function isUndefined(input) {
        return input === void 0;
    }

    function isNumber(input) {
        return (
            typeof input === 'number' ||
            Object.prototype.toString.call(input) === '[object Number]'
        );
    }

    function isDate(input) {
        return (
            input instanceof Date ||
            Object.prototype.toString.call(input) === '[object Date]'
        );
    }

    function map(arr, fn) {
        var res = [],
            i,
            arrLen = arr.length;
        for (i = 0; i < arrLen; ++i) {
            res.push(fn(arr[i], i));
        }
        return res;
    }

    function extend(a, b) {
        for (var i in b) {
            if (hasOwnProp(b, i)) {
                a[i] = b[i];
            }
        }

        if (hasOwnProp(b, 'toString')) {
            a.toString = b.toString;
        }

        if (hasOwnProp(b, 'valueOf')) {
            a.valueOf = b.valueOf;
        }

        return a;
    }

    function createUTC(input, format, locale, strict) {
        return createLocalOrUTC(input, format, locale, strict, true).utc();
    }

    function defaultParsingFlags() {
        // We need to deep clone this object.
        return {
            empty: false,
            unusedTokens: [],
            unusedInput: [],
            overflow: -2,
            charsLeftOver: 0,
            nullInput: false,
            invalidEra: null,
            invalidMonth: null,
            invalidFormat: false,
            userInvalidated: false,
            iso: false,
            parsedDateParts: [],
            era: null,
            meridiem: null,
            rfc2822: false,
            weekdayMismatch: false,
        };
    }

    function getParsingFlags(m) {
        if (m._pf == null) {
            m._pf = defaultParsingFlags();
        }
        return m._pf;
    }

    var some;
    if (Array.prototype.some) {
        some = Array.prototype.some;
    } else {
        some = function (fun) {
            var t = Object(this),
                len = t.length >>> 0,
                i;

            for (i = 0; i < len; i++) {
                if (i in t && fun.call(this, t[i], i, t)) {
                    return true;
                }
            }

            return false;
        };
    }

    function isValid(m) {
        if (m._isValid == null) {
            var flags = getParsingFlags(m),
                parsedParts = some.call(flags.parsedDateParts, function (i) {
                    return i != null;
                }),
                isNowValid =
                    !isNaN(m._d.getTime()) &&
                    flags.overflow < 0 &&
                    !flags.empty &&
                    !flags.invalidEra &&
                    !flags.invalidMonth &&
                    !flags.invalidWeekday &&
                    !flags.weekdayMismatch &&
                    !flags.nullInput &&
                    !flags.invalidFormat &&
                    !flags.userInvalidated &&
                    (!flags.meridiem || (flags.meridiem && parsedParts));

            if (m._strict) {
                isNowValid =
                    isNowValid &&
                    flags.charsLeftOver === 0 &&
                    flags.unusedTokens.length === 0 &&
                    flags.bigHour === undefined;
            }

            if (Object.isFrozen == null || !Object.isFrozen(m)) {
                m._isValid = isNowValid;
            } else {
                return isNowValid;
            }
        }
        return m._isValid;
    }

    function createInvalid(flags) {
        var m = createUTC(NaN);
        if (flags != null) {
            extend(getParsingFlags(m), flags);
        } else {
            getParsingFlags(m).userInvalidated = true;
        }

        return m;
    }

    // Plugins that add properties should also add the key here (null value),
    // so we can properly clone ourselves.
    var momentProperties = (hooks.momentProperties = []),
        updateInProgress = false;

    function copyConfig(to, from) {
        var i,
            prop,
            val,
            momentPropertiesLen = momentProperties.length;

        if (!isUndefined(from._isAMomentObject)) {
            to._isAMomentObject = from._isAMomentObject;
        }
        if (!isUndefined(from._i)) {
            to._i = from._i;
        }
        if (!isUndefined(from._f)) {
            to._f = from._f;
        }
        if (!isUndefined(from._l)) {
            to._l = from._l;
        }
        if (!isUndefined(from._strict)) {
            to._strict = from._strict;
        }
        if (!isUndefined(from._tzm)) {
            to._tzm = from._tzm;
        }
        if (!isUndefined(from._isUTC)) {
            to._isUTC = from._isUTC;
        }
        if (!isUndefined(from._offset)) {
            to._offset = from._offset;
        }
        if (!isUndefined(from._pf)) {
            to._pf = getParsingFlags(from);
        }
        if (!isUndefined(from._locale)) {
            to._locale = from._locale;
        }

        if (momentPropertiesLen > 0) {
            for (i = 0; i < momentPropertiesLen; i++) {
                prop = momentProperties[i];
                val = from[prop];
                if (!isUndefined(val)) {
                    to[prop] = val;
                }
            }
        }

        return to;
    }

    // Moment prototype object
    function Moment(config) {
        copyConfig(this, config);
        this._d = new Date(config._d != null ? config._d.getTime() : NaN);
        if (!this.isValid()) {
            this._d = new Date(NaN);
        }
        // Prevent infinite loop in case updateOffset creates new moment
        // objects.
        if (updateInProgress === false) {
            updateInProgress = true;
            hooks.updateOffset(this);
            updateInProgress = false;
        }
    }

    function isMoment(obj) {
        return (
            obj instanceof Moment || (obj != null && obj._isAMomentObject != null)
        );
    }

    function warn(msg) {
        if (
            hooks.suppressDeprecationWarnings === false &&
            typeof console !== 'undefined' &&
            console.warn
        ) {
            console.warn('Deprecation warning: ' + msg);
        }
    }

    function deprecate(msg, fn) {
        var firstTime = true;

        return extend(function () {
            if (hooks.deprecationHandler != null) {
                hooks.deprecationHandler(null, msg);
            }
            if (firstTime) {
                var args = [],
                    arg,
                    i,
                    key,
                    argLen = arguments.length;
                for (i = 0; i < argLen; i++) {
                    arg = '';
                    if (typeof arguments[i] === 'object') {
                        arg += '\n[' + i + '] ';
                        for (key in arguments[0]) {
                            if (hasOwnProp(arguments[0], key)) {
                                arg += key + ': ' + arguments[0][key] + ', ';
                            }
                        }
                        arg = arg.slice(0, -2); // Remove trailing comma and space
                    } else {
                        arg = arguments[i];
                    }
                    args.push(arg);
                }
                warn(
                    msg +
                        '\nArguments: ' +
                        Array.prototype.slice.call(args).join('') +
                        '\n' +
                        new Error().stack
                );
                firstTime = false;
            }
            return fn.apply(this, arguments);
        }, fn);
    }

    var deprecations = {};

    function deprecateSimple(name, msg) {
        if (hooks.deprecationHandler != null) {
            hooks.deprecationHandler(name, msg);
        }
        if (!deprecations[name]) {
            warn(msg);
            deprecations[name] = true;
        }
    }

    hooks.suppressDeprecationWarnings = false;
    hooks.deprecationHandler = null;

    function isFunction(input) {
        return (
            (typeof Function !== 'undefined' && input instanceof Function) ||
            Object.prototype.toString.call(input) === '[object Function]'
        );
    }

    function set(config) {
        var prop, i;
        for (i in config) {
            if (hasOwnProp(config, i)) {
                prop = config[i];
                if (isFunction(prop)) {
                    this[i] = prop;
                } else {
                    this['_' + i] = prop;
                }
            }
        }
        this._config = config;
        // Lenient ordinal parsing accepts just a number in addition to
        // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.
        // TODO: Remove "ordinalParse" fallback in next major release.
        this._dayOfMonthOrdinalParseLenient = new RegExp(
            (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +
                '|' +
                /\d{1,2}/.source
        );
    }

    function mergeConfigs(parentConfig, childConfig) {
        var res = extend({}, parentConfig),
            prop;
        for (prop in childConfig) {
            if (hasOwnProp(childConfig, prop)) {
                if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {
                    res[prop] = {};
                    extend(res[prop], parentConfig[prop]);
                    extend(res[prop], childConfig[prop]);
                } else if (childConfig[prop] != null) {
                    res[prop] = childConfig[prop];
                } else {
                    delete res[prop];
                }
            }
        }
        for (prop in parentConfig) {
            if (
                hasOwnProp(parentConfig, prop) &&
                !hasOwnProp(childConfig, prop) &&
                isObject(parentConfig[prop])
            ) {
                // make sure changes to properties don't modify parent config
                res[prop] = extend({}, res[prop]);
            }
        }
        return res;
    }

    function Locale(config) {
        if (config != null) {
            this.set(config);
        }
    }

    var keys;

    if (Object.keys) {
        keys = Object.keys;
    } else {
        keys = function (obj) {
            var i,
                res = [];
            for (i in obj) {
                if (hasOwnProp(obj, i)) {
                    res.push(i);
                }
            }
            return res;
        };
    }

    var defaultCalendar = {
        sameDay: '[Today at] LT',
        nextDay: '[Tomorrow at] LT',
        nextWeek: 'dddd [at] LT',
        lastDay: '[Yesterday at] LT',
        lastWeek: '[Last] dddd [at] LT',
        sameElse: 'L',
    };

    function calendar(key, mom, now) {
        var output = this._calendar[key] || this._calendar['sameElse'];
        return isFunction(output) ? output.call(mom, now) : output;
    }

    function zeroFill(number, targetLength, forceSign) {
        var absNumber = '' + Math.abs(number),
            zerosToFill = targetLength - absNumber.length,
            sign = number >= 0;
        return (
            (sign ? (forceSign ? '+' : '') : '-') +
            Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) +
            absNumber
        );
    }

    var formattingTokens =
            /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,
        localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,
        formatFunctions = {},
        formatTokenFunctions = {};

    // token:    'M'
    // padded:   ['MM', 2]
    // ordinal:  'Mo'
    // callback: function () { this.month() + 1 }
    function addFormatToken(token, padded, ordinal, callback) {
        var func = callback;
        if (typeof callback === 'string') {
            func = function () {
                return this[callback]();
            };
        }
        if (token) {
            formatTokenFunctions[token] = func;
        }
        if (padded) {
            formatTokenFunctions[padded[0]] = function () {
                return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
            };
        }
        if (ordinal) {
            formatTokenFunctions[ordinal] = function () {
                return this.localeData().ordinal(
                    func.apply(this, arguments),
                    token
                );
            };
        }
    }

    function removeFormattingTokens(input) {
        if (input.match(/\[[\s\S]/)) {
            return input.replace(/^\[|\]$/g, '');
        }
        return input.replace(/\\/g, '');
    }

    function makeFormatFunction(format) {
        var array = format.match(formattingTokens),
            i,
            length;

        for (i = 0, length = array.length; i < length; i++) {
            if (formatTokenFunctions[array[i]]) {
                array[i] = formatTokenFunctions[array[i]];
            } else {
                array[i] = removeFormattingTokens(array[i]);
            }
        }

        return function (mom) {
            var output = '',
                i;
            for (i = 0; i < length; i++) {
                output += isFunction(array[i])
                    ? array[i].call(mom, format)
                    : array[i];
            }
            return output;
        };
    }

    // format date using native date object
    function formatMoment(m, format) {
        if (!m.isValid()) {
            return m.localeData().invalidDate();
        }

        format = expandFormat(format, m.localeData());
        formatFunctions[format] =
            formatFunctions[format] || makeFormatFunction(format);

        return formatFunctions[format](m);
    }

    function expandFormat(format, locale) {
        var i = 5;

        function replaceLongDateFormatTokens(input) {
            return locale.longDateFormat(input) || input;
        }

        localFormattingTokens.lastIndex = 0;
        while (i >= 0 && localFormattingTokens.test(format)) {
            format = format.replace(
                localFormattingTokens,
                replaceLongDateFormatTokens
            );
            localFormattingTokens.lastIndex = 0;
            i -= 1;
        }

        return format;
    }

    var defaultLongDateFormat = {
        LTS: 'h:mm:ss A',
        LT: 'h:mm A',
        L: 'MM/DD/YYYY',
        LL: 'MMMM D, YYYY',
        LLL: 'MMMM D, YYYY h:mm A',
        LLLL: 'dddd, MMMM D, YYYY h:mm A',
    };

    function longDateFormat(key) {
        var format = this._longDateFormat[key],
            formatUpper = this._longDateFormat[key.toUpperCase()];

        if (format || !formatUpper) {
            return format;
        }

        this._longDateFormat[key] = formatUpper
            .match(formattingTokens)
            .map(function (tok) {
                if (
                    tok === 'MMMM' ||
                    tok === 'MM' ||
                    tok === 'DD' ||
                    tok === 'dddd'
                ) {
                    return tok.slice(1);
                }
                return tok;
            })
            .join('');

        return this._longDateFormat[key];
    }

    var defaultInvalidDate = 'Invalid date';

    function invalidDate() {
        return this._invalidDate;
    }

    var defaultOrdinal = '%d',
        defaultDayOfMonthOrdinalParse = /\d{1,2}/;

    function ordinal(number) {
        return this._ordinal.replace('%d', number);
    }

    var defaultRelativeTime = {
        future: 'in %s',
        past: '%s ago',
        s: 'a few seconds',
        ss: '%d seconds',
        m: 'a minute',
        mm: '%d minutes',
        h: 'an hour',
        hh: '%d hours',
        d: 'a day',
        dd: '%d days',
        w: 'a week',
        ww: '%d weeks',
        M: 'a month',
        MM: '%d months',
        y: 'a year',
        yy: '%d years',
    };

    function relativeTime(number, withoutSuffix, string, isFuture) {
        var output = this._relativeTime[string];
        return isFunction(output)
            ? output(number, withoutSuffix, string, isFuture)
            : output.replace(/%d/i, number);
    }

    function pastFuture(diff, output) {
        var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
        return isFunction(format) ? format(output) : format.replace(/%s/i, output);
    }

    var aliases = {};

    function addUnitAlias(unit, shorthand) {
        var lowerCase = unit.toLowerCase();
        aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;
    }

    function normalizeUnits(units) {
        return typeof units === 'string'
            ? aliases[units] || aliases[units.toLowerCase()]
            : undefined;
    }

    function normalizeObjectUnits(inputObject) {
        var normalizedInput = {},
            normalizedProp,
            prop;

        for (prop in inputObject) {
            if (hasOwnProp(inputObject, prop)) {
                normalizedProp = normalizeUnits(prop);
                if (normalizedProp) {
                    normalizedInput[normalizedProp] = inputObject[prop];
                }
            }
        }

        return normalizedInput;
    }

    var priorities = {};

    function addUnitPriority(unit, priority) {
        priorities[unit] = priority;
    }

    function getPrioritizedUnits(unitsObj) {
        var units = [],
            u;
        for (u in unitsObj) {
            if (hasOwnProp(unitsObj, u)) {
                units.push({ unit: u, priority: priorities[u] });
            }
        }
        units.sort(function (a, b) {
            return a.priority - b.priority;
        });
        return units;
    }

    function isLeapYear(year) {
        return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
    }

    function absFloor(number) {
        if (number < 0) {
            // -0 -> 0
            return Math.ceil(number) || 0;
        } else {
            return Math.floor(number);
        }
    }

    function toInt(argumentForCoercion) {
        var coercedNumber = +argumentForCoercion,
            value = 0;

        if (coercedNumber !== 0 && isFinite(coercedNumber)) {
            value = absFloor(coercedNumber);
        }

        return value;
    }

    function makeGetSet(unit, keepTime) {
        return function (value) {
            if (value != null) {
                set$1(this, unit, value);
                hooks.updateOffset(this, keepTime);
                return this;
            } else {
                return get(this, unit);
            }
        };
    }

    function get(mom, unit) {
        return mom.isValid()
            ? mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]()
            : NaN;
    }

    function set$1(mom, unit, value) {
        if (mom.isValid() && !isNaN(value)) {
            if (
                unit === 'FullYear' &&
                isLeapYear(mom.year()) &&
                mom.month() === 1 &&
                mom.date() === 29
            ) {
                value = toInt(value);
                mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](
                    value,
                    mom.month(),
                    daysInMonth(value, mom.month())
                );
            } else {
                mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
            }
        }
    }

    // MOMENTS

    function stringGet(units) {
        units = normalizeUnits(units);
        if (isFunction(this[units])) {
            return this[units]();
        }
        return this;
    }

    function stringSet(units, value) {
        if (typeof units === 'object') {
            units = normalizeObjectUnits(units);
            var prioritized = getPrioritizedUnits(units),
                i,
                prioritizedLen = prioritized.length;
            for (i = 0; i < prioritizedLen; i++) {
                this[prioritized[i].unit](units[prioritized[i].unit]);
            }
        } else {
            units = normalizeUnits(units);
            if (isFunction(this[units])) {
                return this[units](value);
            }
        }
        return this;
    }

    var match1 = /\d/, //       0 - 9
        match2 = /\d\d/, //      00 - 99
        match3 = /\d{3}/, //     000 - 999
        match4 = /\d{4}/, //    0000 - 9999
        match6 = /[+-]?\d{6}/, // -999999 - 999999
        match1to2 = /\d\d?/, //       0 - 99
        match3to4 = /\d\d\d\d?/, //     999 - 9999
        match5to6 = /\d\d\d\d\d\d?/, //   99999 - 999999
        match1to3 = /\d{1,3}/, //       0 - 999
        match1to4 = /\d{1,4}/, //       0 - 9999
        match1to6 = /[+-]?\d{1,6}/, // -999999 - 999999
        matchUnsigned = /\d+/, //       0 - inf
        matchSigned = /[+-]?\d+/, //    -inf - inf
        matchOffset = /Z|[+-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z
        matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi, // +00 -00 +00:00 -00:00 +0000 -0000 or Z
        matchTimestamp = /[+-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123
        // any word (or two) characters or numbers including two/three word month in arabic.
        // includes scottish gaelic two word and hyphenated months
        matchWord =
            /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,
        regexes;

    regexes = {};

    function addRegexToken(token, regex, strictRegex) {
        regexes[token] = isFunction(regex)
            ? regex
            : function (isStrict, localeData) {
                  return isStrict && strictRegex ? strictRegex : regex;
              };
    }

    function getParseRegexForToken(token, config) {
        if (!hasOwnProp(regexes, token)) {
            return new RegExp(unescapeFormat(token));
        }

        return regexes[token](config._strict, config._locale);
    }

    // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
    function unescapeFormat(s) {
        return regexEscape(
            s
                .replace('\\', '')
                .replace(
                    /\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,
                    function (matched, p1, p2, p3, p4) {
                        return p1 || p2 || p3 || p4;
                    }
                )
        );
    }

    function regexEscape(s) {
        return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
    }

    var tokens = {};

    function addParseToken(token, callback) {
        var i,
            func = callback,
            tokenLen;
        if (typeof token === 'string') {
            token = [token];
        }
        if (isNumber(callback)) {
            func = function (input, array) {
                array[callback] = toInt(input);
            };
        }
        tokenLen = token.length;
        for (i = 0; i < tokenLen; i++) {
            tokens[token[i]] = func;
        }
    }

    function addWeekParseToken(token, callback) {
        addParseToken(token, function (input, array, config, token) {
            config._w = config._w || {};
            callback(input, config._w, config, token);
        });
    }

    function addTimeToArrayFromToken(token, input, config) {
        if (input != null && hasOwnProp(tokens, token)) {
            tokens[token](input, config._a, config, token);
        }
    }

    var YEAR = 0,
        MONTH = 1,
        DATE = 2,
        HOUR = 3,
        MINUTE = 4,
        SECOND = 5,
        MILLISECOND = 6,
        WEEK = 7,
        WEEKDAY = 8;

    function mod(n, x) {
        return ((n % x) + x) % x;
    }

    var indexOf;

    if (Array.prototype.indexOf) {
        indexOf = Array.prototype.indexOf;
    } else {
        indexOf = function (o) {
            // I know
            var i;
            for (i = 0; i < this.length; ++i) {
                if (this[i] === o) {
                    return i;
                }
            }
            return -1;
        };
    }

    function daysInMonth(year, month) {
        if (isNaN(year) || isNaN(month)) {
            return NaN;
        }
        var modMonth = mod(month, 12);
        year += (month - modMonth) / 12;
        return modMonth === 1
            ? isLeapYear(year)
                ? 29
                : 28
            : 31 - ((modMonth % 7) % 2);
    }

    // FORMATTING

    addFormatToken('M', ['MM', 2], 'Mo', function () {
        return this.month() + 1;
    });

    addFormatToken('MMM', 0, 0, function (format) {
        return this.localeData().monthsShort(this, format);
    });

    addFormatToken('MMMM', 0, 0, function (format) {
        return this.localeData().months(this, format);
    });

    // ALIASES

    addUnitAlias('month', 'M');

    // PRIORITY

    addUnitPriority('month', 8);

    // PARSING

    addRegexToken('M', match1to2);
    addRegexToken('MM', match1to2, match2);
    addRegexToken('MMM', function (isStrict, locale) {
        return locale.monthsShortRegex(isStrict);
    });
    addRegexToken('MMMM', function (isStrict, locale) {
        return locale.monthsRegex(isStrict);
    });

    addParseToken(['M', 'MM'], function (input, array) {
        array[MONTH] = toInt(input) - 1;
    });

    addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {
        var month = config._locale.monthsParse(input, token, config._strict);
        // if we didn't find a month name, mark the date as invalid.
        if (month != null) {
            array[MONTH] = month;
        } else {
            getParsingFlags(config).invalidMonth = input;
        }
    });

    // LOCALES

    var defaultLocaleMonths =
            'January_February_March_April_May_June_July_August_September_October_November_December'.split(
                '_'
            ),
        defaultLocaleMonthsShort =
            'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
        MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,
        defaultMonthsShortRegex = matchWord,
        defaultMonthsRegex = matchWord;

    function localeMonths(m, format) {
        if (!m) {
            return isArray(this._months)
                ? this._months
                : this._months['standalone'];
        }
        return isArray(this._months)
            ? this._months[m.month()]
            : this._months[
                  (this._months.isFormat || MONTHS_IN_FORMAT).test(format)
                      ? 'format'
                      : 'standalone'
              ][m.month()];
    }

    function localeMonthsShort(m, format) {
        if (!m) {
            return isArray(this._monthsShort)
                ? this._monthsShort
                : this._monthsShort['standalone'];
        }
        return isArray(this._monthsShort)
            ? this._monthsShort[m.month()]
            : this._monthsShort[
                  MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'
              ][m.month()];
    }

    function handleStrictParse(monthName, format, strict) {
        var i,
            ii,
            mom,
            llc = monthName.toLocaleLowerCase();
        if (!this._monthsParse) {
            // this is not used
            this._monthsParse = [];
            this._longMonthsParse = [];
            this._shortMonthsParse = [];
            for (i = 0; i < 12; ++i) {
                mom = createUTC([2000, i]);
                this._shortMonthsParse[i] = this.monthsShort(
                    mom,
                    ''
                ).toLocaleLowerCase();
                this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();
            }
        }

        if (strict) {
            if (format === 'MMM') {
                ii = indexOf.call(this._shortMonthsParse, llc);
                return ii !== -1 ? ii : null;
            } else {
                ii = indexOf.call(this._longMonthsParse, llc);
                return ii !== -1 ? ii : null;
            }
        } else {
            if (format === 'MMM') {
                ii = indexOf.call(this._shortMonthsParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._longMonthsParse, llc);
                return ii !== -1 ? ii : null;
            } else {
                ii = indexOf.call(this._longMonthsParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._shortMonthsParse, llc);
                return ii !== -1 ? ii : null;
            }
        }
    }

    function localeMonthsParse(monthName, format, strict) {
        var i, mom, regex;

        if (this._monthsParseExact) {
            return handleStrictParse.call(this, monthName, format, strict);
        }

        if (!this._monthsParse) {
            this._monthsParse = [];
            this._longMonthsParse = [];
            this._shortMonthsParse = [];
        }

        // TODO: add sorting
        // Sorting makes sure if one month (or abbr) is a prefix of another
        // see sorting in computeMonthsParse
        for (i = 0; i < 12; i++) {
            // make the regex if we don't have it already
            mom = createUTC([2000, i]);
            if (strict && !this._longMonthsParse[i]) {
                this._longMonthsParse[i] = new RegExp(
                    '^' + this.months(mom, '').replace('.', '') + '$',
                    'i'
                );
                this._shortMonthsParse[i] = new RegExp(
                    '^' + this.monthsShort(mom, '').replace('.', '') + '$',
                    'i'
                );
            }
            if (!strict && !this._monthsParse[i]) {
                regex =
                    '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
                this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
            }
            // test the regex
            if (
                strict &&
                format === 'MMMM' &&
                this._longMonthsParse[i].test(monthName)
            ) {
                return i;
            } else if (
                strict &&
                format === 'MMM' &&
                this._shortMonthsParse[i].test(monthName)
            ) {
                return i;
            } else if (!strict && this._monthsParse[i].test(monthName)) {
                return i;
            }
        }
    }

    // MOMENTS

    function setMonth(mom, value) {
        var dayOfMonth;

        if (!mom.isValid()) {
            // No op
            return mom;
        }

        if (typeof value === 'string') {
            if (/^\d+$/.test(value)) {
                value = toInt(value);
            } else {
                value = mom.localeData().monthsParse(value);
                // TODO: Another silent failure?
                if (!isNumber(value)) {
                    return mom;
                }
            }
        }

        dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));
        mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
        return mom;
    }

    function getSetMonth(value) {
        if (value != null) {
            setMonth(this, value);
            hooks.updateOffset(this, true);
            return this;
        } else {
            return get(this, 'Month');
        }
    }

    function getDaysInMonth() {
        return daysInMonth(this.year(), this.month());
    }

    function monthsShortRegex(isStrict) {
        if (this._monthsParseExact) {
            if (!hasOwnProp(this, '_monthsRegex')) {
                computeMonthsParse.call(this);
            }
            if (isStrict) {
                return this._monthsShortStrictRegex;
            } else {
                return this._monthsShortRegex;
            }
        } else {
            if (!hasOwnProp(this, '_monthsShortRegex')) {
                this._monthsShortRegex = defaultMonthsShortRegex;
            }
            return this._monthsShortStrictRegex && isStrict
                ? this._monthsShortStrictRegex
                : this._monthsShortRegex;
        }
    }

    function monthsRegex(isStrict) {
        if (this._monthsParseExact) {
            if (!hasOwnProp(this, '_monthsRegex')) {
                computeMonthsParse.call(this);
            }
            if (isStrict) {
                return this._monthsStrictRegex;
            } else {
                return this._monthsRegex;
            }
        } else {
            if (!hasOwnProp(this, '_monthsRegex')) {
                this._monthsRegex = defaultMonthsRegex;
            }
            return this._monthsStrictRegex && isStrict
                ? this._monthsStrictRegex
                : this._monthsRegex;
        }
    }

    function computeMonthsParse() {
        function cmpLenRev(a, b) {
            return b.length - a.length;
        }

        var shortPieces = [],
            longPieces = [],
            mixedPieces = [],
            i,
            mom;
        for (i = 0; i < 12; i++) {
            // make the regex if we don't have it already
            mom = createUTC([2000, i]);
            shortPieces.push(this.monthsShort(mom, ''));
            longPieces.push(this.months(mom, ''));
            mixedPieces.push(this.months(mom, ''));
            mixedPieces.push(this.monthsShort(mom, ''));
        }
        // Sorting makes sure if one month (or abbr) is a prefix of another it
        // will match the longer piece.
        shortPieces.sort(cmpLenRev);
        longPieces.sort(cmpLenRev);
        mixedPieces.sort(cmpLenRev);
        for (i = 0; i < 12; i++) {
            shortPieces[i] = regexEscape(shortPieces[i]);
            longPieces[i] = regexEscape(longPieces[i]);
        }
        for (i = 0; i < 24; i++) {
            mixedPieces[i] = regexEscape(mixedPieces[i]);
        }

        this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
        this._monthsShortRegex = this._monthsRegex;
        this._monthsStrictRegex = new RegExp(
            '^(' + longPieces.join('|') + ')',
            'i'
        );
        this._monthsShortStrictRegex = new RegExp(
            '^(' + shortPieces.join('|') + ')',
            'i'
        );
    }

    // FORMATTING

    addFormatToken('Y', 0, 0, function () {
        var y = this.year();
        return y <= 9999 ? zeroFill(y, 4) : '+' + y;
    });

    addFormatToken(0, ['YY', 2], 0, function () {
        return this.year() % 100;
    });

    addFormatToken(0, ['YYYY', 4], 0, 'year');
    addFormatToken(0, ['YYYYY', 5], 0, 'year');
    addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');

    // ALIASES

    addUnitAlias('year', 'y');

    // PRIORITIES

    addUnitPriority('year', 1);

    // PARSING

    addRegexToken('Y', matchSigned);
    addRegexToken('YY', match1to2, match2);
    addRegexToken('YYYY', match1to4, match4);
    addRegexToken('YYYYY', match1to6, match6);
    addRegexToken('YYYYYY', match1to6, match6);

    addParseToken(['YYYYY', 'YYYYYY'], YEAR);
    addParseToken('YYYY', function (input, array) {
        array[YEAR] =
            input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);
    });
    addParseToken('YY', function (input, array) {
        array[YEAR] = hooks.parseTwoDigitYear(input);
    });
    addParseToken('Y', function (input, array) {
        array[YEAR] = parseInt(input, 10);
    });

    // HELPERS

    function daysInYear(year) {
        return isLeapYear(year) ? 366 : 365;
    }

    // HOOKS

    hooks.parseTwoDigitYear = function (input) {
        return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
    };

    // MOMENTS

    var getSetYear = makeGetSet('FullYear', true);

    function getIsLeapYear() {
        return isLeapYear(this.year());
    }

    function createDate(y, m, d, h, M, s, ms) {
        // can't just apply() to create a date:
        // https://stackoverflow.com/q/181348
        var date;
        // the date constructor remaps years 0-99 to 1900-1999
        if (y < 100 && y >= 0) {
            // preserve leap years using a full 400 year cycle, then reset
            date = new Date(y + 400, m, d, h, M, s, ms);
            if (isFinite(date.getFullYear())) {
                date.setFullYear(y);
            }
        } else {
            date = new Date(y, m, d, h, M, s, ms);
        }

        return date;
    }

    function createUTCDate(y) {
        var date, args;
        // the Date.UTC function remaps years 0-99 to 1900-1999
        if (y < 100 && y >= 0) {
            args = Array.prototype.slice.call(arguments);
            // preserve leap years using a full 400 year cycle, then reset
            args[0] = y + 400;
            date = new Date(Date.UTC.apply(null, args));
            if (isFinite(date.getUTCFullYear())) {
                date.setUTCFullYear(y);
            }
        } else {
            date = new Date(Date.UTC.apply(null, arguments));
        }

        return date;
    }

    // start-of-first-week - start-of-year
    function firstWeekOffset(year, dow, doy) {
        var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
            fwd = 7 + dow - doy,
            // first-week day local weekday -- which local weekday is fwd
            fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;

        return -fwdlw + fwd - 1;
    }

    // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
    function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
        var localWeekday = (7 + weekday - dow) % 7,
            weekOffset = firstWeekOffset(year, dow, doy),
            dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,
            resYear,
            resDayOfYear;

        if (dayOfYear <= 0) {
            resYear = year - 1;
            resDayOfYear = daysInYear(resYear) + dayOfYear;
        } else if (dayOfYear > daysInYear(year)) {
            resYear = year + 1;
            resDayOfYear = dayOfYear - daysInYear(year);
        } else {
            resYear = year;
            resDayOfYear = dayOfYear;
        }

        return {
            year: resYear,
            dayOfYear: resDayOfYear,
        };
    }

    function weekOfYear(mom, dow, doy) {
        var weekOffset = firstWeekOffset(mom.year(), dow, doy),
            week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,
            resWeek,
            resYear;

        if (week < 1) {
            resYear = mom.year() - 1;
            resWeek = week + weeksInYear(resYear, dow, doy);
        } else if (week > weeksInYear(mom.year(), dow, doy)) {
            resWeek = week - weeksInYear(mom.year(), dow, doy);
            resYear = mom.year() + 1;
        } else {
            resYear = mom.year();
            resWeek = week;
        }

        return {
            week: resWeek,
            year: resYear,
        };
    }

    function weeksInYear(year, dow, doy) {
        var weekOffset = firstWeekOffset(year, dow, doy),
            weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
        return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
    }

    // FORMATTING

    addFormatToken('w', ['ww', 2], 'wo', 'week');
    addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');

    // ALIASES

    addUnitAlias('week', 'w');
    addUnitAlias('isoWeek', 'W');

    // PRIORITIES

    addUnitPriority('week', 5);
    addUnitPriority('isoWeek', 5);

    // PARSING

    addRegexToken('w', match1to2);
    addRegexToken('ww', match1to2, match2);
    addRegexToken('W', match1to2);
    addRegexToken('WW', match1to2, match2);

    addWeekParseToken(
        ['w', 'ww', 'W', 'WW'],
        function (input, week, config, token) {
            week[token.substr(0, 1)] = toInt(input);
        }
    );

    // HELPERS

    // LOCALES

    function localeWeek(mom) {
        return weekOfYear(mom, this._week.dow, this._week.doy).week;
    }

    var defaultLocaleWeek = {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    };

    function localeFirstDayOfWeek() {
        return this._week.dow;
    }

    function localeFirstDayOfYear() {
        return this._week.doy;
    }

    // MOMENTS

    function getSetWeek(input) {
        var week = this.localeData().week(this);
        return input == null ? week : this.add((input - week) * 7, 'd');
    }

    function getSetISOWeek(input) {
        var week = weekOfYear(this, 1, 4).week;
        return input == null ? week : this.add((input - week) * 7, 'd');
    }

    // FORMATTING

    addFormatToken('d', 0, 'do', 'day');

    addFormatToken('dd', 0, 0, function (format) {
        return this.localeData().weekdaysMin(this, format);
    });

    addFormatToken('ddd', 0, 0, function (format) {
        return this.localeData().weekdaysShort(this, format);
    });

    addFormatToken('dddd', 0, 0, function (format) {
        return this.localeData().weekdays(this, format);
    });

    addFormatToken('e', 0, 0, 'weekday');
    addFormatToken('E', 0, 0, 'isoWeekday');

    // ALIASES

    addUnitAlias('day', 'd');
    addUnitAlias('weekday', 'e');
    addUnitAlias('isoWeekday', 'E');

    // PRIORITY
    addUnitPriority('day', 11);
    addUnitPriority('weekday', 11);
    addUnitPriority('isoWeekday', 11);

    // PARSING

    addRegexToken('d', match1to2);
    addRegexToken('e', match1to2);
    addRegexToken('E', match1to2);
    addRegexToken('dd', function (isStrict, locale) {
        return locale.weekdaysMinRegex(isStrict);
    });
    addRegexToken('ddd', function (isStrict, locale) {
        return locale.weekdaysShortRegex(isStrict);
    });
    addRegexToken('dddd', function (isStrict, locale) {
        return locale.weekdaysRegex(isStrict);
    });

    addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {
        var weekday = config._locale.weekdaysParse(input, token, config._strict);
        // if we didn't get a weekday name, mark the date as invalid
        if (weekday != null) {
            week.d = weekday;
        } else {
            getParsingFlags(config).invalidWeekday = input;
        }
    });

    addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
        week[token] = toInt(input);
    });

    // HELPERS

    function parseWeekday(input, locale) {
        if (typeof input !== 'string') {
            return input;
        }

        if (!isNaN(input)) {
            return parseInt(input, 10);
        }

        input = locale.weekdaysParse(input);
        if (typeof input === 'number') {
            return input;
        }

        return null;
    }

    function parseIsoWeekday(input, locale) {
        if (typeof input === 'string') {
            return locale.weekdaysParse(input) % 7 || 7;
        }
        return isNaN(input) ? null : input;
    }

    // LOCALES
    function shiftWeekdays(ws, n) {
        return ws.slice(n, 7).concat(ws.slice(0, n));
    }

    var defaultLocaleWeekdays =
            'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
        defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
        defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
        defaultWeekdaysRegex = matchWord,
        defaultWeekdaysShortRegex = matchWord,
        defaultWeekdaysMinRegex = matchWord;

    function localeWeekdays(m, format) {
        var weekdays = isArray(this._weekdays)
            ? this._weekdays
            : this._weekdays[
                  m && m !== true && this._weekdays.isFormat.test(format)
                      ? 'format'
                      : 'standalone'
              ];
        return m === true
            ? shiftWeekdays(weekdays, this._week.dow)
            : m
            ? weekdays[m.day()]
            : weekdays;
    }

    function localeWeekdaysShort(m) {
        return m === true
            ? shiftWeekdays(this._weekdaysShort, this._week.dow)
            : m
            ? this._weekdaysShort[m.day()]
            : this._weekdaysShort;
    }

    function localeWeekdaysMin(m) {
        return m === true
            ? shiftWeekdays(this._weekdaysMin, this._week.dow)
            : m
            ? this._weekdaysMin[m.day()]
            : this._weekdaysMin;
    }

    function handleStrictParse$1(weekdayName, format, strict) {
        var i,
            ii,
            mom,
            llc = weekdayName.toLocaleLowerCase();
        if (!this._weekdaysParse) {
            this._weekdaysParse = [];
            this._shortWeekdaysParse = [];
            this._minWeekdaysParse = [];

            for (i = 0; i < 7; ++i) {
                mom = createUTC([2000, 1]).day(i);
                this._minWeekdaysParse[i] = this.weekdaysMin(
                    mom,
                    ''
                ).toLocaleLowerCase();
                this._shortWeekdaysParse[i] = this.weekdaysShort(
                    mom,
                    ''
                ).toLocaleLowerCase();
                this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();
            }
        }

        if (strict) {
            if (format === 'dddd') {
                ii = indexOf.call(this._weekdaysParse, llc);
                return ii !== -1 ? ii : null;
            } else if (format === 'ddd') {
                ii = indexOf.call(this._shortWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            } else {
                ii = indexOf.call(this._minWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            }
        } else {
            if (format === 'dddd') {
                ii = indexOf.call(this._weekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._shortWeekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._minWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            } else if (format === 'ddd') {
                ii = indexOf.call(this._shortWeekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._weekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._minWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            } else {
                ii = indexOf.call(this._minWeekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._weekdaysParse, llc);
                if (ii !== -1) {
                    return ii;
                }
                ii = indexOf.call(this._shortWeekdaysParse, llc);
                return ii !== -1 ? ii : null;
            }
        }
    }

    function localeWeekdaysParse(weekdayName, format, strict) {
        var i, mom, regex;

        if (this._weekdaysParseExact) {
            return handleStrictParse$1.call(this, weekdayName, format, strict);
        }

        if (!this._weekdaysParse) {
            this._weekdaysParse = [];
            this._minWeekdaysParse = [];
            this._shortWeekdaysParse = [];
            this._fullWeekdaysParse = [];
        }

        for (i = 0; i < 7; i++) {
            // make the regex if we don't have it already

            mom = createUTC([2000, 1]).day(i);
            if (strict && !this._fullWeekdaysParse[i]) {
                this._fullWeekdaysParse[i] = new RegExp(
                    '^' + this.weekdays(mom, '').replace('.', '\\.?') + '$',
                    'i'
                );
                this._shortWeekdaysParse[i] = new RegExp(
                    '^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$',
                    'i'
                );
                this._minWeekdaysParse[i] = new RegExp(
                    '^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$',
                    'i'
                );
            }
            if (!this._weekdaysParse[i]) {
                regex =
                    '^' +
                    this.weekdays(mom, '') +
                    '|^' +
                    this.weekdaysShort(mom, '') +
                    '|^' +
                    this.weekdaysMin(mom, '');
                this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
            }
            // test the regex
            if (
                strict &&
                format === 'dddd' &&
                this._fullWeekdaysParse[i].test(weekdayName)
            ) {
                return i;
            } else if (
                strict &&
                format === 'ddd' &&
                this._shortWeekdaysParse[i].test(weekdayName)
            ) {
                return i;
            } else if (
                strict &&
                format === 'dd' &&
                this._minWeekdaysParse[i].test(weekdayName)
            ) {
                return i;
            } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {
                return i;
            }
        }
    }

    // MOMENTS

    function getSetDayOfWeek(input) {
        if (!this.isValid()) {
            return input != null ? this : NaN;
        }
        var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
        if (input != null) {
            input = parseWeekday(input, this.localeData());
            return this.add(input - day, 'd');
        } else {
            return day;
        }
    }

    function getSetLocaleDayOfWeek(input) {
        if (!this.isValid()) {
            return input != null ? this : NaN;
        }
        var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
        return input == null ? weekday : this.add(input - weekday, 'd');
    }

    function getSetISODayOfWeek(input) {
        if (!this.isValid()) {
            return input != null ? this : NaN;
        }

        // behaves the same as moment#day except
        // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
        // as a setter, sunday should belong to the previous week.

        if (input != null) {
            var weekday = parseIsoWeekday(input, this.localeData());
            return this.day(this.day() % 7 ? weekday : weekday - 7);
        } else {
            return this.day() || 7;
        }
    }

    function weekdaysRegex(isStrict) {
        if (this._weekdaysParseExact) {
            if (!hasOwnProp(this, '_weekdaysRegex')) {
                computeWeekdaysParse.call(this);
            }
            if (isStrict) {
                return this._weekdaysStrictRegex;
            } else {
                return this._weekdaysRegex;
            }
        } else {
            if (!hasOwnProp(this, '_weekdaysRegex')) {
                this._weekdaysRegex = defaultWeekdaysRegex;
            }
            return this._weekdaysStrictRegex && isStrict
                ? this._weekdaysStrictRegex
                : this._weekdaysRegex;
        }
    }

    function weekdaysShortRegex(isStrict) {
        if (this._weekdaysParseExact) {
            if (!hasOwnProp(this, '_weekdaysRegex')) {
                computeWeekdaysParse.call(this);
            }
            if (isStrict) {
                return this._weekdaysShortStrictRegex;
            } else {
                return this._weekdaysShortRegex;
            }
        } else {
            if (!hasOwnProp(this, '_weekdaysShortRegex')) {
                this._weekdaysShortRegex = defaultWeekdaysShortRegex;
            }
            return this._weekdaysShortStrictRegex && isStrict
                ? this._weekdaysShortStrictRegex
                : this._weekdaysShortRegex;
        }
    }

    function weekdaysMinRegex(isStrict) {
        if (this._weekdaysParseExact) {
            if (!hasOwnProp(this, '_weekdaysRegex')) {
                computeWeekdaysParse.call(this);
            }
            if (isStrict) {
                return this._weekdaysMinStrictRegex;
            } else {
                return this._weekdaysMinRegex;
            }
        } else {
            if (!hasOwnProp(this, '_weekdaysMinRegex')) {
                this._weekdaysMinRegex = defaultWeekdaysMinRegex;
            }
            return this._weekdaysMinStrictRegex && isStrict
                ? this._weekdaysMinStrictRegex
                : this._weekdaysMinRegex;
        }
    }

    function computeWeekdaysParse() {
        function cmpLenRev(a, b) {
            return b.length - a.length;
        }

        var minPieces = [],
            shortPieces = [],
            longPieces = [],
            mixedPieces = [],
            i,
            mom,
            minp,
            shortp,
            longp;
        for (i = 0; i < 7; i++) {
            // make the regex if we don't have it already
            mom = createUTC([2000, 1]).day(i);
            minp = regexEscape(this.weekdaysMin(mom, ''));
            shortp = regexEscape(this.weekdaysShort(mom, ''));
            longp = regexEscape(this.weekdays(mom, ''));
            minPieces.push(minp);
            shortPieces.push(shortp);
            longPieces.push(longp);
            mixedPieces.push(minp);
            mixedPieces.push(shortp);
            mixedPieces.push(longp);
        }
        // Sorting makes sure if one weekday (or abbr) is a prefix of another it
        // will match the longer piece.
        minPieces.sort(cmpLenRev);
        shortPieces.sort(cmpLenRev);
        longPieces.sort(cmpLenRev);
        mixedPieces.sort(cmpLenRev);

        this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
        this._weekdaysShortRegex = this._weekdaysRegex;
        this._weekdaysMinRegex = this._weekdaysRegex;

        this._weekdaysStrictRegex = new RegExp(
            '^(' + longPieces.join('|') + ')',
            'i'
        );
        this._weekdaysShortStrictRegex = new RegExp(
            '^(' + shortPieces.join('|') + ')',
            'i'
        );
        this._weekdaysMinStrictRegex = new RegExp(
            '^(' + minPieces.join('|') + ')',
            'i'
        );
    }

    // FORMATTING

    function hFormat() {
        return this.hours() % 12 || 12;
    }

    function kFormat() {
        return this.hours() || 24;
    }

    addFormatToken('H', ['HH', 2], 0, 'hour');
    addFormatToken('h', ['hh', 2], 0, hFormat);
    addFormatToken('k', ['kk', 2], 0, kFormat);

    addFormatToken('hmm', 0, 0, function () {
        return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);
    });

    addFormatToken('hmmss', 0, 0, function () {
        return (
            '' +
            hFormat.apply(this) +
            zeroFill(this.minutes(), 2) +
            zeroFill(this.seconds(), 2)
        );
    });

    addFormatToken('Hmm', 0, 0, function () {
        return '' + this.hours() + zeroFill(this.minutes(), 2);
    });

    addFormatToken('Hmmss', 0, 0, function () {
        return (
            '' +
            this.hours() +
            zeroFill(this.minutes(), 2) +
            zeroFill(this.seconds(), 2)
        );
    });

    function meridiem(token, lowercase) {
        addFormatToken(token, 0, 0, function () {
            return this.localeData().meridiem(
                this.hours(),
                this.minutes(),
                lowercase
            );
        });
    }

    meridiem('a', true);
    meridiem('A', false);

    // ALIASES

    addUnitAlias('hour', 'h');

    // PRIORITY
    addUnitPriority('hour', 13);

    // PARSING

    function matchMeridiem(isStrict, locale) {
        return locale._meridiemParse;
    }

    addRegexToken('a', matchMeridiem);
    addRegexToken('A', matchMeridiem);
    addRegexToken('H', match1to2);
    addRegexToken('h', match1to2);
    addRegexToken('k', match1to2);
    addRegexToken('HH', match1to2, match2);
    addRegexToken('hh', match1to2, match2);
    addRegexToken('kk', match1to2, match2);

    addRegexToken('hmm', match3to4);
    addRegexToken('hmmss', match5to6);
    addRegexToken('Hmm', match3to4);
    addRegexToken('Hmmss', match5to6);

    addParseToken(['H', 'HH'], HOUR);
    addParseToken(['k', 'kk'], function (input, array, config) {
        var kInput = toInt(input);
        array[HOUR] = kInput === 24 ? 0 : kInput;
    });
    addParseToken(['a', 'A'], function (input, array, config) {
        config._isPm = config._locale.isPM(input);
        config._meridiem = input;
    });
    addParseToken(['h', 'hh'], function (input, array, config) {
        array[HOUR] = toInt(input);
        getParsingFlags(config).bigHour = true;
    });
    addParseToken('hmm', function (input, array, config) {
        var pos = input.length - 2;
        array[HOUR] = toInt(input.substr(0, pos));
        array[MINUTE] = toInt(input.substr(pos));
        getParsingFlags(config).bigHour = true;
    });
    addParseToken('hmmss', function (input, array, config) {
        var pos1 = input.length - 4,
            pos2 = input.length - 2;
        array[HOUR] = toInt(input.substr(0, pos1));
        array[MINUTE] = toInt(input.substr(pos1, 2));
        array[SECOND] = toInt(input.substr(pos2));
        getParsingFlags(config).bigHour = true;
    });
    addParseToken('Hmm', function (input, array, config) {
        var pos = input.length - 2;
        array[HOUR] = toInt(input.substr(0, pos));
        array[MINUTE] = toInt(input.substr(pos));
    });
    addParseToken('Hmmss', function (input, array, config) {
        var pos1 = input.length - 4,
            pos2 = input.length - 2;
        array[HOUR] = toInt(input.substr(0, pos1));
        array[MINUTE] = toInt(input.substr(pos1, 2));
        array[SECOND] = toInt(input.substr(pos2));
    });

    // LOCALES

    function localeIsPM(input) {
        // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
        // Using charAt should be more compatible.
        return (input + '').toLowerCase().charAt(0) === 'p';
    }

    var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i,
        // Setting the hour should keep the time, because the user explicitly
        // specified which hour they want. So trying to maintain the same hour (in
        // a new timezone) makes sense. Adding/subtracting hours does not follow
        // this rule.
        getSetHour = makeGetSet('Hours', true);

    function localeMeridiem(hours, minutes, isLower) {
        if (hours > 11) {
            return isLower ? 'pm' : 'PM';
        } else {
            return isLower ? 'am' : 'AM';
        }
    }

    var baseConfig = {
        calendar: defaultCalendar,
        longDateFormat: defaultLongDateFormat,
        invalidDate: defaultInvalidDate,
        ordinal: defaultOrdinal,
        dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,
        relativeTime: defaultRelativeTime,

        months: defaultLocaleMonths,
        monthsShort: defaultLocaleMonthsShort,

        week: defaultLocaleWeek,

        weekdays: defaultLocaleWeekdays,
        weekdaysMin: defaultLocaleWeekdaysMin,
        weekdaysShort: defaultLocaleWeekdaysShort,

        meridiemParse: defaultLocaleMeridiemParse,
    };

    // internal storage for locale config files
    var locales = {},
        localeFamilies = {},
        globalLocale;

    function commonPrefix(arr1, arr2) {
        var i,
            minl = Math.min(arr1.length, arr2.length);
        for (i = 0; i < minl; i += 1) {
            if (arr1[i] !== arr2[i]) {
                return i;
            }
        }
        return minl;
    }

    function normalizeLocale(key) {
        return key ? key.toLowerCase().replace('_', '-') : key;
    }

    // pick the locale from the array
    // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
    // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
    function chooseLocale(names) {
        var i = 0,
            j,
            next,
            locale,
            split;

        while (i < names.length) {
            split = normalizeLocale(names[i]).split('-');
            j = split.length;
            next = normalizeLocale(names[i + 1]);
            next = next ? next.split('-') : null;
            while (j > 0) {
                locale = loadLocale(split.slice(0, j).join('-'));
                if (locale) {
                    return locale;
                }
                if (
                    next &&
                    next.length >= j &&
                    commonPrefix(split, next) >= j - 1
                ) {
                    //the next array item is better than a shallower substring of this one
                    break;
                }
                j--;
            }
            i++;
        }
        return globalLocale;
    }

    function isLocaleNameSane(name) {
        // Prevent names that look like filesystem paths, i.e contain '/' or '\'
        return name.match('^[^/\\\\]*$') != null;
    }

    function loadLocale(name) {
        var oldLocale = null,
            aliasedRequire;
        // TODO: Find a better way to register and load all the locales in Node
        if (
            locales[name] === undefined &&
            typeof module !== 'undefined' &&
            module &&
            module.exports &&
            isLocaleNameSane(name)
        ) {
            try {
                oldLocale = globalLocale._abbr;
                aliasedRequire = require;
                aliasedRequire('./locale/' + name);
                getSetGlobalLocale(oldLocale);
            } catch (e) {
                // mark as not found to avoid repeating expensive file require call causing high CPU
                // when trying to find en-US, en_US, en-us for every format call
                locales[name] = null; // null means not found
            }
        }
        return locales[name];
    }

    // This function will load locale and then set the global locale.  If
    // no arguments are passed in, it will simply return the current global
    // locale key.
    function getSetGlobalLocale(key, values) {
        var data;
        if (key) {
            if (isUndefined(values)) {
                data = getLocale(key);
            } else {
                data = defineLocale(key, values);
            }

            if (data) {
                // moment.duration._locale = moment._locale = data;
                globalLocale = data;
            } else {
                if (typeof console !== 'undefined' && console.warn) {
                    //warn user if arguments are passed but the locale could not be set
                    console.warn(
                        'Locale ' + key + ' not found. Did you forget to load it?'
                    );
                }
            }
        }

        return globalLocale._abbr;
    }

    function defineLocale(name, config) {
        if (config !== null) {
            var locale,
                parentConfig = baseConfig;
            config.abbr = name;
            if (locales[name] != null) {
                deprecateSimple(
                    'defineLocaleOverride',
                    'use moment.updateLocale(localeName, config) to change ' +
                        'an existing locale. moment.defineLocale(localeName, ' +
                        'config) should only be used for creating a new locale ' +
                        'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'
                );
                parentConfig = locales[name]._config;
            } else if (config.parentLocale != null) {
                if (locales[config.parentLocale] != null) {
                    parentConfig = locales[config.parentLocale]._config;
                } else {
                    locale = loadLocale(config.parentLocale);
                    if (locale != null) {
                        parentConfig = locale._config;
                    } else {
                        if (!localeFamilies[config.parentLocale]) {
                            localeFamilies[config.parentLocale] = [];
                        }
                        localeFamilies[config.parentLocale].push({
                            name: name,
                            config: config,
                        });
                        return null;
                    }
                }
            }
            locales[name] = new Locale(mergeConfigs(parentConfig, config));

            if (localeFamilies[name]) {
                localeFamilies[name].forEach(function (x) {
                    defineLocale(x.name, x.config);
                });
            }

            // backwards compat for now: also set the locale
            // make sure we set the locale AFTER all child locales have been
            // created, so we won't end up with the child locale set.
            getSetGlobalLocale(name);

            return locales[name];
        } else {
            // useful for testing
            delete locales[name];
            return null;
        }
    }

    function updateLocale(name, config) {
        if (config != null) {
            var locale,
                tmpLocale,
                parentConfig = baseConfig;

            if (locales[name] != null && locales[name].parentLocale != null) {
                // Update existing child locale in-place to avoid memory-leaks
                locales[name].set(mergeConfigs(locales[name]._config, config));
            } else {
                // MERGE
                tmpLocale = loadLocale(name);
                if (tmpLocale != null) {
                    parentConfig = tmpLocale._config;
                }
                config = mergeConfigs(parentConfig, config);
                if (tmpLocale == null) {
                    // updateLocale is called for creating a new locale
                    // Set abbr so it will have a name (getters return
                    // undefined otherwise).
                    config.abbr = name;
                }
                locale = new Locale(config);
                locale.parentLocale = locales[name];
                locales[name] = locale;
            }

            // backwards compat for now: also set the locale
            getSetGlobalLocale(name);
        } else {
            // pass null for config to unupdate, useful for tests
            if (locales[name] != null) {
                if (locales[name].parentLocale != null) {
                    locales[name] = locales[name].parentLocale;
                    if (name === getSetGlobalLocale()) {
                        getSetGlobalLocale(name);
                    }
                } else if (locales[name] != null) {
                    delete locales[name];
                }
            }
        }
        return locales[name];
    }

    // returns locale data
    function getLocale(key) {
        var locale;

        if (key && key._locale && key._locale._abbr) {
            key = key._locale._abbr;
        }

        if (!key) {
            return globalLocale;
        }

        if (!isArray(key)) {
            //short-circuit everything else
            locale = loadLocale(key);
            if (locale) {
                return locale;
            }
            key = [key];
        }

        return chooseLocale(key);
    }

    function listLocales() {
        return keys(locales);
    }

    function checkOverflow(m) {
        var overflow,
            a = m._a;

        if (a && getParsingFlags(m).overflow === -2) {
            overflow =
                a[MONTH] < 0 || a[MONTH] > 11
                    ? MONTH
                    : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH])
                    ? DATE
                    : a[HOUR] < 0 ||
                      a[HOUR] > 24 ||
                      (a[HOUR] === 24 &&
                          (a[MINUTE] !== 0 ||
                              a[SECOND] !== 0 ||
                              a[MILLISECOND] !== 0))
                    ? HOUR
                    : a[MINUTE] < 0 || a[MINUTE] > 59
                    ? MINUTE
                    : a[SECOND] < 0 || a[SECOND] > 59
                    ? SECOND
                    : a[MILLISECOND] < 0 || a[MILLISECOND] > 999
                    ? MILLISECOND
                    : -1;

            if (
                getParsingFlags(m)._overflowDayOfYear &&
                (overflow < YEAR || overflow > DATE)
            ) {
                overflow = DATE;
            }
            if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
                overflow = WEEK;
            }
            if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
                overflow = WEEKDAY;
            }

            getParsingFlags(m).overflow = overflow;
        }

        return m;
    }

    // iso 8601 regex
    // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
    var extendedIsoRegex =
            /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
        basicIsoRegex =
            /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
        tzRegex = /Z|[+-]\d\d(?::?\d\d)?/,
        isoDates = [
            ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
            ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/],
            ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/],
            ['GGGG-[W]WW', /\d{4}-W\d\d/, false],
            ['YYYY-DDD', /\d{4}-\d{3}/],
            ['YYYY-MM', /\d{4}-\d\d/, false],
            ['YYYYYYMMDD', /[+-]\d{10}/],
            ['YYYYMMDD', /\d{8}/],
            ['GGGG[W]WWE', /\d{4}W\d{3}/],
            ['GGGG[W]WW', /\d{4}W\d{2}/, false],
            ['YYYYDDD', /\d{7}/],
            ['YYYYMM', /\d{6}/, false],
            ['YYYY', /\d{4}/, false],
        ],
        // iso time formats and regexes
        isoTimes = [
            ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/],
            ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/],
            ['HH:mm:ss', /\d\d:\d\d:\d\d/],
            ['HH:mm', /\d\d:\d\d/],
            ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/],
            ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/],
            ['HHmmss', /\d\d\d\d\d\d/],
            ['HHmm', /\d\d\d\d/],
            ['HH', /\d\d/],
        ],
        aspNetJsonRegex = /^\/?Date\((-?\d+)/i,
        // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3
        rfc2822 =
            /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,
        obsOffsets = {
            UT: 0,
            GMT: 0,
            EDT: -4 * 60,
            EST: -5 * 60,
            CDT: -5 * 60,
            CST: -6 * 60,
            MDT: -6 * 60,
            MST: -7 * 60,
            PDT: -7 * 60,
            PST: -8 * 60,
        };

    // date from iso format
    function configFromISO(config) {
        var i,
            l,
            string = config._i,
            match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),
            allowTime,
            dateFormat,
            timeFormat,
            tzFormat,
            isoDatesLen = isoDates.length,
            isoTimesLen = isoTimes.length;

        if (match) {
            getParsingFlags(config).iso = true;
            for (i = 0, l = isoDatesLen; i < l; i++) {
                if (isoDates[i][1].exec(match[1])) {
                    dateFormat = isoDates[i][0];
                    allowTime = isoDates[i][2] !== false;
                    break;
                }
            }
            if (dateFormat == null) {
                config._isValid = false;
                return;
            }
            if (match[3]) {
                for (i = 0, l = isoTimesLen; i < l; i++) {
                    if (isoTimes[i][1].exec(match[3])) {
                        // match[2] should be 'T' or space
                        timeFormat = (match[2] || ' ') + isoTimes[i][0];
                        break;
                    }
                }
                if (timeFormat == null) {
                    config._isValid = false;
                    return;
                }
            }
            if (!allowTime && timeFormat != null) {
                config._isValid = false;
                return;
            }
            if (match[4]) {
                if (tzRegex.exec(match[4])) {
                    tzFormat = 'Z';
                } else {
                    config._isValid = false;
                    return;
                }
            }
            config._f = dateFormat + (timeFormat || '') + (tzFormat || '');
            configFromStringAndFormat(config);
        } else {
            config._isValid = false;
        }
    }

    function extractFromRFC2822Strings(
        yearStr,
        monthStr,
        dayStr,
        hourStr,
        minuteStr,
        secondStr
    ) {
        var result = [
            untruncateYear(yearStr),
            defaultLocaleMonthsShort.indexOf(monthStr),
            parseInt(dayStr, 10),
            parseInt(hourStr, 10),
            parseInt(minuteStr, 10),
        ];

        if (secondStr) {
            result.push(parseInt(secondStr, 10));
        }

        return result;
    }

    function untruncateYear(yearStr) {
        var year = parseInt(yearStr, 10);
        if (year <= 49) {
            return 2000 + year;
        } else if (year <= 999) {
            return 1900 + year;
        }
        return year;
    }

    function preprocessRFC2822(s) {
        // Remove comments and folding whitespace and replace multiple-spaces with a single space
        return s
            .replace(/\([^()]*\)|[\n\t]/g, ' ')
            .replace(/(\s\s+)/g, ' ')
            .replace(/^\s\s*/, '')
            .replace(/\s\s*$/, '');
    }

    function checkWeekday(weekdayStr, parsedInput, config) {
        if (weekdayStr) {
            // TODO: Replace the vanilla JS Date object with an independent day-of-week check.
            var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),
                weekdayActual = new Date(
                    parsedInput[0],
                    parsedInput[1],
                    parsedInput[2]
                ).getDay();
            if (weekdayProvided !== weekdayActual) {
                getParsingFlags(config).weekdayMismatch = true;
                config._isValid = false;
                return false;
            }
        }
        return true;
    }

    function calculateOffset(obsOffset, militaryOffset, numOffset) {
        if (obsOffset) {
            return obsOffsets[obsOffset];
        } else if (militaryOffset) {
            // the only allowed military tz is Z
            return 0;
        } else {
            var hm = parseInt(numOffset, 10),
                m = hm % 100,
                h = (hm - m) / 100;
            return h * 60 + m;
        }
    }

    // date and time from ref 2822 format
    function configFromRFC2822(config) {
        var match = rfc2822.exec(preprocessRFC2822(config._i)),
            parsedArray;
        if (match) {
            parsedArray = extractFromRFC2822Strings(
                match[4],
                match[3],
                match[2],
                match[5],
                match[6],
                match[7]
            );
            if (!checkWeekday(match[1], parsedArray, config)) {
                return;
            }

            config._a = parsedArray;
            config._tzm = calculateOffset(match[8], match[9], match[10]);

            config._d = createUTCDate.apply(null, config._a);
            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);

            getParsingFlags(config).rfc2822 = true;
        } else {
            config._isValid = false;
        }
    }

    // date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict
    function configFromString(config) {
        var matched = aspNetJsonRegex.exec(config._i);
        if (matched !== null) {
            config._d = new Date(+matched[1]);
            return;
        }

        configFromISO(config);
        if (config._isValid === false) {
            delete config._isValid;
        } else {
            return;
        }

        configFromRFC2822(config);
        if (config._isValid === false) {
            delete config._isValid;
        } else {
            return;
        }

        if (config._strict) {
            config._isValid = false;
        } else {
            // Final attempt, use Input Fallback
            hooks.createFromInputFallback(config);
        }
    }

    hooks.createFromInputFallback = deprecate(
        'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +
            'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +
            'discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.',
        function (config) {
            config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
        }
    );

    // Pick the first defined of two or three arguments.
    function defaults(a, b, c) {
        if (a != null) {
            return a;
        }
        if (b != null) {
            return b;
        }
        return c;
    }

    function currentDateArray(config) {
        // hooks is actually the exported moment object
        var nowValue = new Date(hooks.now());
        if (config._useUTC) {
            return [
                nowValue.getUTCFullYear(),
                nowValue.getUTCMonth(),
                nowValue.getUTCDate(),
            ];
        }
        return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];
    }

    // convert an array to a date.
    // the array should mirror the parameters below
    // note: all values past the year are optional and will default to the lowest possible value.
    // [year, month, day , hour, minute, second, millisecond]
    function configFromArray(config) {
        var i,
            date,
            input = [],
            currentDate,
            expectedWeekday,
            yearToUse;

        if (config._d) {
            return;
        }

        currentDate = currentDateArray(config);

        //compute day of the year from weeks and weekdays
        if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
            dayOfYearFromWeekInfo(config);
        }

        //if the day of the year is set, figure out what it is
        if (config._dayOfYear != null) {
            yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);

            if (
                config._dayOfYear > daysInYear(yearToUse) ||
                config._dayOfYear === 0
            ) {
                getParsingFlags(config)._overflowDayOfYear = true;
            }

            date = createUTCDate(yearToUse, 0, config._dayOfYear);
            config._a[MONTH] = date.getUTCMonth();
            config._a[DATE] = date.getUTCDate();
        }

        // Default to current date.
        // * if no year, month, day of month are given, default to today
        // * if day of month is given, default month and year
        // * if month is given, default only year
        // * if year is given, don't default anything
        for (i = 0; i < 3 && config._a[i] == null; ++i) {
            config._a[i] = input[i] = currentDate[i];
        }

        // Zero out whatever was not defaulted, including time
        for (; i < 7; i++) {
            config._a[i] = input[i] =
                config._a[i] == null ? (i === 2 ? 1 : 0) : config._a[i];
        }

        // Check for 24:00:00.000
        if (
            config._a[HOUR] === 24 &&
            config._a[MINUTE] === 0 &&
            config._a[SECOND] === 0 &&
            config._a[MILLISECOND] === 0
        ) {
            config._nextDay = true;
            config._a[HOUR] = 0;
        }

        config._d = (config._useUTC ? createUTCDate : createDate).apply(
            null,
            input
        );
        expectedWeekday = config._useUTC
            ? config._d.getUTCDay()
            : config._d.getDay();

        // Apply timezone offset from input. The actual utcOffset can be changed
        // with parseZone.
        if (config._tzm != null) {
            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
        }

        if (config._nextDay) {
            config._a[HOUR] = 24;
        }

        // check for mismatching day of week
        if (
            config._w &&
            typeof config._w.d !== 'undefined' &&
            config._w.d !== expectedWeekday
        ) {
            getParsingFlags(config).weekdayMismatch = true;
        }
    }

    function dayOfYearFromWeekInfo(config) {
        var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek;

        w = config._w;
        if (w.GG != null || w.W != null || w.E != null) {
            dow = 1;
            doy = 4;

            // TODO: We need to take the current isoWeekYear, but that depends on
            // how we interpret now (local, utc, fixed offset). So create
            // a now version of current config (take local/utc/offset flags, and
            // create now).
            weekYear = defaults(
                w.GG,
                config._a[YEAR],
                weekOfYear(createLocal(), 1, 4).year
            );
            week = defaults(w.W, 1);
            weekday = defaults(w.E, 1);
            if (weekday < 1 || weekday > 7) {
                weekdayOverflow = true;
            }
        } else {
            dow = config._locale._week.dow;
            doy = config._locale._week.doy;

            curWeek = weekOfYear(createLocal(), dow, doy);

            weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);

            // Default to current week.
            week = defaults(w.w, curWeek.week);

            if (w.d != null) {
                // weekday -- low day numbers are considered next week
                weekday = w.d;
                if (weekday < 0 || weekday > 6) {
                    weekdayOverflow = true;
                }
            } else if (w.e != null) {
                // local weekday -- counting starts from beginning of week
                weekday = w.e + dow;
                if (w.e < 0 || w.e > 6) {
                    weekdayOverflow = true;
                }
            } else {
                // default to beginning of week
                weekday = dow;
            }
        }
        if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {
            getParsingFlags(config)._overflowWeeks = true;
        } else if (weekdayOverflow != null) {
            getParsingFlags(config)._overflowWeekday = true;
        } else {
            temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);
            config._a[YEAR] = temp.year;
            config._dayOfYear = temp.dayOfYear;
        }
    }

    // constant that refers to the ISO standard
    hooks.ISO_8601 = function () {};

    // constant that refers to the RFC 2822 form
    hooks.RFC_2822 = function () {};

    // date from string and format string
    function configFromStringAndFormat(config) {
        // TODO: Move this to another part of the creation flow to prevent circular deps
        if (config._f === hooks.ISO_8601) {
            configFromISO(config);
            return;
        }
        if (config._f === hooks.RFC_2822) {
            configFromRFC2822(config);
            return;
        }
        config._a = [];
        getParsingFlags(config).empty = true;

        // This array is used to make a Date, either with `new Date` or `Date.UTC`
        var string = '' + config._i,
            i,
            parsedInput,
            tokens,
            token,
            skipped,
            stringLength = string.length,
            totalParsedInputLength = 0,
            era,
            tokenLen;

        tokens =
            expandFormat(config._f, config._locale).match(formattingTokens) || [];
        tokenLen = tokens.length;
        for (i = 0; i < tokenLen; i++) {
            token = tokens[i];
            parsedInput = (string.match(getParseRegexForToken(token, config)) ||
                [])[0];
            if (parsedInput) {
                skipped = string.substr(0, string.indexOf(parsedInput));
                if (skipped.length > 0) {
                    getParsingFlags(config).unusedInput.push(skipped);
                }
                string = string.slice(
                    string.indexOf(parsedInput) + parsedInput.length
                );
                totalParsedInputLength += parsedInput.length;
            }
            // don't parse if it's not a known token
            if (formatTokenFunctions[token]) {
                if (parsedInput) {
                    getParsingFlags(config).empty = false;
                } else {
                    getParsingFlags(config).unusedTokens.push(token);
                }
                addTimeToArrayFromToken(token, parsedInput, config);
            } else if (config._strict && !parsedInput) {
                getParsingFlags(config).unusedTokens.push(token);
            }
        }

        // add remaining unparsed input length to the string
        getParsingFlags(config).charsLeftOver =
            stringLength - totalParsedInputLength;
        if (string.length > 0) {
            getParsingFlags(config).unusedInput.push(string);
        }

        // clear _12h flag if hour is <= 12
        if (
            config._a[HOUR] <= 12 &&
            getParsingFlags(config).bigHour === true &&
            config._a[HOUR] > 0
        ) {
            getParsingFlags(config).bigHour = undefined;
        }

        getParsingFlags(config).parsedDateParts = config._a.slice(0);
        getParsingFlags(config).meridiem = config._meridiem;
        // handle meridiem
        config._a[HOUR] = meridiemFixWrap(
            config._locale,
            config._a[HOUR],
            config._meridiem
        );

        // handle era
        era = getParsingFlags(config).era;
        if (era !== null) {
            config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]);
        }

        configFromArray(config);
        checkOverflow(config);
    }

    function meridiemFixWrap(locale, hour, meridiem) {
        var isPm;

        if (meridiem == null) {
            // nothing to do
            return hour;
        }
        if (locale.meridiemHour != null) {
            return locale.meridiemHour(hour, meridiem);
        } else if (locale.isPM != null) {
            // Fallback
            isPm = locale.isPM(meridiem);
            if (isPm && hour < 12) {
                hour += 12;
            }
            if (!isPm && hour === 12) {
                hour = 0;
            }
            return hour;
        } else {
            // this is not supposed to happen
            return hour;
        }
    }

    // date from string and array of format strings
    function configFromStringAndArray(config) {
        var tempConfig,
            bestMoment,
            scoreToBeat,
            i,
            currentScore,
            validFormatFound,
            bestFormatIsValid = false,
            configfLen = config._f.length;

        if (configfLen === 0) {
            getParsingFlags(config).invalidFormat = true;
            config._d = new Date(NaN);
            return;
        }

        for (i = 0; i < configfLen; i++) {
            currentScore = 0;
            validFormatFound = false;
            tempConfig = copyConfig({}, config);
            if (config._useUTC != null) {
                tempConfig._useUTC = config._useUTC;
            }
            tempConfig._f = config._f[i];
            configFromStringAndFormat(tempConfig);

            if (isValid(tempConfig)) {
                validFormatFound = true;
            }

            // if there is any input that was not parsed add a penalty for that format
            currentScore += getParsingFlags(tempConfig).charsLeftOver;

            //or tokens
            currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;

            getParsingFlags(tempConfig).score = currentScore;

            if (!bestFormatIsValid) {
                if (
                    scoreToBeat == null ||
                    currentScore < scoreToBeat ||
                    validFormatFound
                ) {
                    scoreToBeat = currentScore;
                    bestMoment = tempConfig;
                    if (validFormatFound) {
                        bestFormatIsValid = true;
                    }
                }
            } else {
                if (currentScore < scoreToBeat) {
                    scoreToBeat = currentScore;
                    bestMoment = tempConfig;
                }
            }
        }

        extend(config, bestMoment || tempConfig);
    }

    function configFromObject(config) {
        if (config._d) {
            return;
        }

        var i = normalizeObjectUnits(config._i),
            dayOrDate = i.day === undefined ? i.date : i.day;
        config._a = map(
            [i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond],
            function (obj) {
                return obj && parseInt(obj, 10);
            }
        );

        configFromArray(config);
    }

    function createFromConfig(config) {
        var res = new Moment(checkOverflow(prepareConfig(config)));
        if (res._nextDay) {
            // Adding is smart enough around DST
            res.add(1, 'd');
            res._nextDay = undefined;
        }

        return res;
    }

    function prepareConfig(config) {
        var input = config._i,
            format = config._f;

        config._locale = config._locale || getLocale(config._l);

        if (input === null || (format === undefined && input === '')) {
            return createInvalid({ nullInput: true });
        }

        if (typeof input === 'string') {
            config._i = input = config._locale.preparse(input);
        }

        if (isMoment(input)) {
            return new Moment(checkOverflow(input));
        } else if (isDate(input)) {
            config._d = input;
        } else if (isArray(format)) {
            configFromStringAndArray(config);
        } else if (format) {
            configFromStringAndFormat(config);
        } else {
            configFromInput(config);
        }

        if (!isValid(config)) {
            config._d = null;
        }

        return config;
    }

    function configFromInput(config) {
        var input = config._i;
        if (isUndefined(input)) {
            config._d = new Date(hooks.now());
        } else if (isDate(input)) {
            config._d = new Date(input.valueOf());
        } else if (typeof input === 'string') {
            configFromString(config);
        } else if (isArray(input)) {
            config._a = map(input.slice(0), function (obj) {
                return parseInt(obj, 10);
            });
            configFromArray(config);
        } else if (isObject(input)) {
            configFromObject(config);
        } else if (isNumber(input)) {
            // from milliseconds
            config._d = new Date(input);
        } else {
            hooks.createFromInputFallback(config);
        }
    }

    function createLocalOrUTC(input, format, locale, strict, isUTC) {
        var c = {};

        if (format === true || format === false) {
            strict = format;
            format = undefined;
        }

        if (locale === true || locale === false) {
            strict = locale;
            locale = undefined;
        }

        if (
            (isObject(input) && isObjectEmpty(input)) ||
            (isArray(input) && input.length === 0)
        ) {
            input = undefined;
        }
        // object construction must be done this way.
        // https://github.com/moment/moment/issues/1423
        c._isAMomentObject = true;
        c._useUTC = c._isUTC = isUTC;
        c._l = locale;
        c._i = input;
        c._f = format;
        c._strict = strict;

        return createFromConfig(c);
    }

    function createLocal(input, format, locale, strict) {
        return createLocalOrUTC(input, format, locale, strict, false);
    }

    var prototypeMin = deprecate(
            'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',
            function () {
                var other = createLocal.apply(null, arguments);
                if (this.isValid() && other.isValid()) {
                    return other < this ? this : other;
                } else {
                    return createInvalid();
                }
            }
        ),
        prototypeMax = deprecate(
            'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',
            function () {
                var other = createLocal.apply(null, arguments);
                if (this.isValid() && other.isValid()) {
                    return other > this ? this : other;
                } else {
                    return createInvalid();
                }
            }
        );

    // Pick a moment m from moments so that m[fn](other) is true for all
    // other. This relies on the function fn to be transitive.
    //
    // moments should either be an array of moment objects or an array, whose
    // first element is an array of moment objects.
    function pickBy(fn, moments) {
        var res, i;
        if (moments.length === 1 && isArray(moments[0])) {
            moments = moments[0];
        }
        if (!moments.length) {
            return createLocal();
        }
        res = moments[0];
        for (i = 1; i < moments.length; ++i) {
            if (!moments[i].isValid() || moments[i][fn](res)) {
                res = moments[i];
            }
        }
        return res;
    }

    // TODO: Use [].sort instead?
    function min() {
        var args = [].slice.call(arguments, 0);

        return pickBy('isBefore', args);
    }

    function max() {
        var args = [].slice.call(arguments, 0);

        return pickBy('isAfter', args);
    }

    var now = function () {
        return Date.now ? Date.now() : +new Date();
    };

    var ordering = [
        'year',
        'quarter',
        'month',
        'week',
        'day',
        'hour',
        'minute',
        'second',
        'millisecond',
    ];

    function isDurationValid(m) {
        var key,
            unitHasDecimal = false,
            i,
            orderLen = ordering.length;
        for (key in m) {
            if (
                hasOwnProp(m, key) &&
                !(
                    indexOf.call(ordering, key) !== -1 &&
                    (m[key] == null || !isNaN(m[key]))
                )
            ) {
                return false;
            }
        }

        for (i = 0; i < orderLen; ++i) {
            if (m[ordering[i]]) {
                if (unitHasDecimal) {
                    return false; // only allow non-integers for smallest unit
                }
                if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {
                    unitHasDecimal = true;
                }
            }
        }

        return true;
    }

    function isValid$1() {
        return this._isValid;
    }

    function createInvalid$1() {
        return createDuration(NaN);
    }

    function Duration(duration) {
        var normalizedInput = normalizeObjectUnits(duration),
            years = normalizedInput.year || 0,
            quarters = normalizedInput.quarter || 0,
            months = normalizedInput.month || 0,
            weeks = normalizedInput.week || normalizedInput.isoWeek || 0,
            days = normalizedInput.day || 0,
            hours = normalizedInput.hour || 0,
            minutes = normalizedInput.minute || 0,
            seconds = normalizedInput.second || 0,
            milliseconds = normalizedInput.millisecond || 0;

        this._isValid = isDurationValid(normalizedInput);

        // representation for dateAddRemove
        this._milliseconds =
            +milliseconds +
            seconds * 1e3 + // 1000
            minutes * 6e4 + // 1000 * 60
            hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
        // Because of dateAddRemove treats 24 hours as different from a
        // day when working around DST, we need to store them separately
        this._days = +days + weeks * 7;
        // It is impossible to translate months into days without knowing
        // which months you are are talking about, so we have to store
        // it separately.
        this._months = +months + quarters * 3 + years * 12;

        this._data = {};

        this._locale = getLocale();

        this._bubble();
    }

    function isDuration(obj) {
        return obj instanceof Duration;
    }

    function absRound(number) {
        if (number < 0) {
            return Math.round(-1 * number) * -1;
        } else {
            return Math.round(number);
        }
    }

    // compare two arrays, return the number of differences
    function compareArrays(array1, array2, dontConvert) {
        var len = Math.min(array1.length, array2.length),
            lengthDiff = Math.abs(array1.length - array2.length),
            diffs = 0,
            i;
        for (i = 0; i < len; i++) {
            if (
                (dontConvert && array1[i] !== array2[i]) ||
                (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))
            ) {
                diffs++;
            }
        }
        return diffs + lengthDiff;
    }

    // FORMATTING

    function offset(token, separator) {
        addFormatToken(token, 0, 0, function () {
            var offset = this.utcOffset(),
                sign = '+';
            if (offset < 0) {
                offset = -offset;
                sign = '-';
            }
            return (
                sign +
                zeroFill(~~(offset / 60), 2) +
                separator +
                zeroFill(~~offset % 60, 2)
            );
        });
    }

    offset('Z', ':');
    offset('ZZ', '');

    // PARSING

    addRegexToken('Z', matchShortOffset);
    addRegexToken('ZZ', matchShortOffset);
    addParseToken(['Z', 'ZZ'], function (input, array, config) {
        config._useUTC = true;
        config._tzm = offsetFromString(matchShortOffset, input);
    });

    // HELPERS

    // timezone chunker
    // '+10:00' > ['10',  '00']
    // '-1530'  > ['-15', '30']
    var chunkOffset = /([\+\-]|\d\d)/gi;

    function offsetFromString(matcher, string) {
        var matches = (string || '').match(matcher),
            chunk,
            parts,
            minutes;

        if (matches === null) {
            return null;
        }

        chunk = matches[matches.length - 1] || [];
        parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];
        minutes = +(parts[1] * 60) + toInt(parts[2]);

        return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes;
    }

    // Return a moment from input, that is local/utc/zone equivalent to model.
    function cloneWithOffset(input, model) {
        var res, diff;
        if (model._isUTC) {
            res = model.clone();
            diff =
                (isMoment(input) || isDate(input)
                    ? input.valueOf()
                    : createLocal(input).valueOf()) - res.valueOf();
            // Use low-level api, because this fn is low-level api.
            res._d.setTime(res._d.valueOf() + diff);
            hooks.updateOffset(res, false);
            return res;
        } else {
            return createLocal(input).local();
        }
    }

    function getDateOffset(m) {
        // On Firefox.24 Date#getTimezoneOffset returns a floating point.
        // https://github.com/moment/moment/pull/1871
        return -Math.round(m._d.getTimezoneOffset());
    }

    // HOOKS

    // This function will be called whenever a moment is mutated.
    // It is intended to keep the offset in sync with the timezone.
    hooks.updateOffset = function () {};

    // MOMENTS

    // keepLocalTime = true means only change the timezone, without
    // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
    // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
    // +0200, so we adjust the time as needed, to be valid.
    //
    // Keeping the time actually adds/subtracts (one hour)
    // from the actual represented time. That is why we call updateOffset
    // a second time. In case it wants us to change the offset again
    // _changeInProgress == true case, then we have to adjust, because
    // there is no such time in the given timezone.
    function getSetOffset(input, keepLocalTime, keepMinutes) {
        var offset = this._offset || 0,
            localAdjust;
        if (!this.isValid()) {
            return input != null ? this : NaN;
        }
        if (input != null) {
            if (typeof input === 'string') {
                input = offsetFromString(matchShortOffset, input);
                if (input === null) {
                    return this;
                }
            } else if (Math.abs(input) < 16 && !keepMinutes) {
                input = input * 60;
            }
            if (!this._isUTC && keepLocalTime) {
                localAdjust = getDateOffset(this);
            }
            this._offset = input;
            this._isUTC = true;
            if (localAdjust != null) {
                this.add(localAdjust, 'm');
            }
            if (offset !== input) {
                if (!keepLocalTime || this._changeInProgress) {
                    addSubtract(
                        this,
                        createDuration(input - offset, 'm'),
                        1,
                        false
                    );
                } else if (!this._changeInProgress) {
                    this._changeInProgress = true;
                    hooks.updateOffset(this, true);
                    this._changeInProgress = null;
                }
            }
            return this;
        } else {
            return this._isUTC ? offset : getDateOffset(this);
        }
    }

    function getSetZone(input, keepLocalTime) {
        if (input != null) {
            if (typeof input !== 'string') {
                input = -input;
            }

            this.utcOffset(input, keepLocalTime);

            return this;
        } else {
            return -this.utcOffset();
        }
    }

    function setOffsetToUTC(keepLocalTime) {
        return this.utcOffset(0, keepLocalTime);
    }

    function setOffsetToLocal(keepLocalTime) {
        if (this._isUTC) {
            this.utcOffset(0, keepLocalTime);
            this._isUTC = false;

            if (keepLocalTime) {
                this.subtract(getDateOffset(this), 'm');
            }
        }
        return this;
    }

    function setOffsetToParsedOffset() {
        if (this._tzm != null) {
            this.utcOffset(this._tzm, false, true);
        } else if (typeof this._i === 'string') {
            var tZone = offsetFromString(matchOffset, this._i);
            if (tZone != null) {
                this.utcOffset(tZone);
            } else {
                this.utcOffset(0, true);
            }
        }
        return this;
    }

    function hasAlignedHourOffset(input) {
        if (!this.isValid()) {
            return false;
        }
        input = input ? createLocal(input).utcOffset() : 0;

        return (this.utcOffset() - input) % 60 === 0;
    }

    function isDaylightSavingTime() {
        return (
            this.utcOffset() > this.clone().month(0).utcOffset() ||
            this.utcOffset() > this.clone().month(5).utcOffset()
        );
    }

    function isDaylightSavingTimeShifted() {
        if (!isUndefined(this._isDSTShifted)) {
            return this._isDSTShifted;
        }

        var c = {},
            other;

        copyConfig(c, this);
        c = prepareConfig(c);

        if (c._a) {
            other = c._isUTC ? createUTC(c._a) : createLocal(c._a);
            this._isDSTShifted =
                this.isValid() && compareArrays(c._a, other.toArray()) > 0;
        } else {
            this._isDSTShifted = false;
        }

        return this._isDSTShifted;
    }

    function isLocal() {
        return this.isValid() ? !this._isUTC : false;
    }

    function isUtcOffset() {
        return this.isValid() ? this._isUTC : false;
    }

    function isUtc() {
        return this.isValid() ? this._isUTC && this._offset === 0 : false;
    }

    // ASP.NET json date format regex
    var aspNetRegex = /^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,
        // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
        // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
        // and further modified to allow for strings containing both week and day
        isoRegex =
            /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;

    function createDuration(input, key) {
        var duration = input,
            // matching against regexp is expensive, do it on demand
            match = null,
            sign,
            ret,
            diffRes;

        if (isDuration(input)) {
            duration = {
                ms: input._milliseconds,
                d: input._days,
                M: input._months,
            };
        } else if (isNumber(input) || !isNaN(+input)) {
            duration = {};
            if (key) {
                duration[key] = +input;
            } else {
                duration.milliseconds = +input;
            }
        } else if ((match = aspNetRegex.exec(input))) {
            sign = match[1] === '-' ? -1 : 1;
            duration = {
                y: 0,
                d: toInt(match[DATE]) * sign,
                h: toInt(match[HOUR]) * sign,
                m: toInt(match[MINUTE]) * sign,
                s: toInt(match[SECOND]) * sign,
                ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign, // the millisecond decimal point is included in the match
            };
        } else if ((match = isoRegex.exec(input))) {
            sign = match[1] === '-' ? -1 : 1;
            duration = {
                y: parseIso(match[2], sign),
                M: parseIso(match[3], sign),
                w: parseIso(match[4], sign),
                d: parseIso(match[5], sign),
                h: parseIso(match[6], sign),
                m: parseIso(match[7], sign),
                s: parseIso(match[8], sign),
            };
        } else if (duration == null) {
            // checks for null or undefined
            duration = {};
        } else if (
            typeof duration === 'object' &&
            ('from' in duration || 'to' in duration)
        ) {
            diffRes = momentsDifference(
                createLocal(duration.from),
                createLocal(duration.to)
            );

            duration = {};
            duration.ms = diffRes.milliseconds;
            duration.M = diffRes.months;
        }

        ret = new Duration(duration);

        if (isDuration(input) && hasOwnProp(input, '_locale')) {
            ret._locale = input._locale;
        }

        if (isDuration(input) && hasOwnProp(input, '_isValid')) {
            ret._isValid = input._isValid;
        }

        return ret;
    }

    createDuration.fn = Duration.prototype;
    createDuration.invalid = createInvalid$1;

    function parseIso(inp, sign) {
        // We'd normally use ~~inp for this, but unfortunately it also
        // converts floats to ints.
        // inp may be undefined, so careful calling replace on it.
        var res = inp && parseFloat(inp.replace(',', '.'));
        // apply sign while we're at it
        return (isNaN(res) ? 0 : res) * sign;
    }

    function positiveMomentsDifference(base, other) {
        var res = {};

        res.months =
            other.month() - base.month() + (other.year() - base.year()) * 12;
        if (base.clone().add(res.months, 'M').isAfter(other)) {
            --res.months;
        }

        res.milliseconds = +other - +base.clone().add(res.months, 'M');

        return res;
    }

    function momentsDifference(base, other) {
        var res;
        if (!(base.isValid() && other.isValid())) {
            return { milliseconds: 0, months: 0 };
        }

        other = cloneWithOffset(other, base);
        if (base.isBefore(other)) {
            res = positiveMomentsDifference(base, other);
        } else {
            res = positiveMomentsDifference(other, base);
            res.milliseconds = -res.milliseconds;
            res.months = -res.months;
        }

        return res;
    }

    // TODO: remove 'name' arg after deprecation is removed
    function createAdder(direction, name) {
        return function (val, period) {
            var dur, tmp;
            //invert the arguments, but complain about it
            if (period !== null && !isNaN(+period)) {
                deprecateSimple(
                    name,
                    'moment().' +
                        name +
                        '(period, number) is deprecated. Please use moment().' +
                        name +
                        '(number, period). ' +
                        'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'
                );
                tmp = val;
                val = period;
                period = tmp;
            }

            dur = createDuration(val, period);
            addSubtract(this, dur, direction);
            return this;
        };
    }

    function addSubtract(mom, duration, isAdding, updateOffset) {
        var milliseconds = duration._milliseconds,
            days = absRound(duration._days),
            months = absRound(duration._months);

        if (!mom.isValid()) {
            // No op
            return;
        }

        updateOffset = updateOffset == null ? true : updateOffset;

        if (months) {
            setMonth(mom, get(mom, 'Month') + months * isAdding);
        }
        if (days) {
            set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);
        }
        if (milliseconds) {
            mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
        }
        if (updateOffset) {
            hooks.updateOffset(mom, days || months);
        }
    }

    var add = createAdder(1, 'add'),
        subtract = createAdder(-1, 'subtract');

    function isString(input) {
        return typeof input === 'string' || input instanceof String;
    }

    // type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined
    function isMomentInput(input) {
        return (
            isMoment(input) ||
            isDate(input) ||
            isString(input) ||
            isNumber(input) ||
            isNumberOrStringArray(input) ||
            isMomentInputObject(input) ||
            input === null ||
            input === undefined
        );
    }

    function isMomentInputObject(input) {
        var objectTest = isObject(input) && !isObjectEmpty(input),
            propertyTest = false,
            properties = [
                'years',
                'year',
                'y',
                'months',
                'month',
                'M',
                'days',
                'day',
                'd',
                'dates',
                'date',
                'D',
                'hours',
                'hour',
                'h',
                'minutes',
                'minute',
                'm',
                'seconds',
                'second',
                's',
                'milliseconds',
                'millisecond',
                'ms',
            ],
            i,
            property,
            propertyLen = properties.length;

        for (i = 0; i < propertyLen; i += 1) {
            property = properties[i];
            propertyTest = propertyTest || hasOwnProp(input, property);
        }

        return objectTest && propertyTest;
    }

    function isNumberOrStringArray(input) {
        var arrayTest = isArray(input),
            dataTypeTest = false;
        if (arrayTest) {
            dataTypeTest =
                input.filter(function (item) {
                    return !isNumber(item) && isString(input);
                }).length === 0;
        }
        return arrayTest && dataTypeTest;
    }

    function isCalendarSpec(input) {
        var objectTest = isObject(input) && !isObjectEmpty(input),
            propertyTest = false,
            properties = [
                'sameDay',
                'nextDay',
                'lastDay',
                'nextWeek',
                'lastWeek',
                'sameElse',
            ],
            i,
            property;

        for (i = 0; i < properties.length; i += 1) {
            property = properties[i];
            propertyTest = propertyTest || hasOwnProp(input, property);
        }

        return objectTest && propertyTest;
    }

    function getCalendarFormat(myMoment, now) {
        var diff = myMoment.diff(now, 'days', true);
        return diff < -6
            ? 'sameElse'
            : diff < -1
            ? 'lastWeek'
            : diff < 0
            ? 'lastDay'
            : diff < 1
            ? 'sameDay'
            : diff < 2
            ? 'nextDay'
            : diff < 7
            ? 'nextWeek'
            : 'sameElse';
    }

    function calendar$1(time, formats) {
        // Support for single parameter, formats only overload to the calendar function
        if (arguments.length === 1) {
            if (!arguments[0]) {
                time = undefined;
                formats = undefined;
            } else if (isMomentInput(arguments[0])) {
                time = arguments[0];
                formats = undefined;
            } else if (isCalendarSpec(arguments[0])) {
                formats = arguments[0];
                time = undefined;
            }
        }
        // We want to compare the start of today, vs this.
        // Getting start-of-today depends on whether we're local/utc/offset or not.
        var now = time || createLocal(),
            sod = cloneWithOffset(now, this).startOf('day'),
            format = hooks.calendarFormat(this, sod) || 'sameElse',
            output =
                formats &&
                (isFunction(formats[format])
                    ? formats[format].call(this, now)
                    : formats[format]);

        return this.format(
            output || this.localeData().calendar(format, this, createLocal(now))
        );
    }

    function clone() {
        return new Moment(this);
    }

    function isAfter(input, units) {
        var localInput = isMoment(input) ? input : createLocal(input);
        if (!(this.isValid() && localInput.isValid())) {
            return false;
        }
        units = normalizeUnits(units) || 'millisecond';
        if (units === 'millisecond') {
            return this.valueOf() > localInput.valueOf();
        } else {
            return localInput.valueOf() < this.clone().startOf(units).valueOf();
        }
    }

    function isBefore(input, units) {
        var localInput = isMoment(input) ? input : createLocal(input);
        if (!(this.isValid() && localInput.isValid())) {
            return false;
        }
        units = normalizeUnits(units) || 'millisecond';
        if (units === 'millisecond') {
            return this.valueOf() < localInput.valueOf();
        } else {
            return this.clone().endOf(units).valueOf() < localInput.valueOf();
        }
    }

    function isBetween(from, to, units, inclusivity) {
        var localFrom = isMoment(from) ? from : createLocal(from),
            localTo = isMoment(to) ? to : createLocal(to);
        if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) {
            return false;
        }
        inclusivity = inclusivity || '()';
        return (
            (inclusivity[0] === '('
                ? this.isAfter(localFrom, units)
                : !this.isBefore(localFrom, units)) &&
            (inclusivity[1] === ')'
                ? this.isBefore(localTo, units)
                : !this.isAfter(localTo, units))
        );
    }

    function isSame(input, units) {
        var localInput = isMoment(input) ? input : createLocal(input),
            inputMs;
        if (!(this.isValid() && localInput.isValid())) {
            return false;
        }
        units = normalizeUnits(units) || 'millisecond';
        if (units === 'millisecond') {
            return this.valueOf() === localInput.valueOf();
        } else {
            inputMs = localInput.valueOf();
            return (
                this.clone().startOf(units).valueOf() <= inputMs &&
                inputMs <= this.clone().endOf(units).valueOf()
            );
        }
    }

    function isSameOrAfter(input, units) {
        return this.isSame(input, units) || this.isAfter(input, units);
    }

    function isSameOrBefore(input, units) {
        return this.isSame(input, units) || this.isBefore(input, units);
    }

    function diff(input, units, asFloat) {
        var that, zoneDelta, output;

        if (!this.isValid()) {
            return NaN;
        }

        that = cloneWithOffset(input, this);

        if (!that.isValid()) {
            return NaN;
        }

        zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;

        units = normalizeUnits(units);

        switch (units) {
            case 'year':
                output = monthDiff(this, that) / 12;
                break;
            case 'month':
                output = monthDiff(this, that);
                break;
            case 'quarter':
                output = monthDiff(this, that) / 3;
                break;
            case 'second':
                output = (this - that) / 1e3;
                break; // 1000
            case 'minute':
                output = (this - that) / 6e4;
                break; // 1000 * 60
            case 'hour':
                output = (this - that) / 36e5;
                break; // 1000 * 60 * 60
            case 'day':
                output = (this - that - zoneDelta) / 864e5;
                break; // 1000 * 60 * 60 * 24, negate dst
            case 'week':
                output = (this - that - zoneDelta) / 6048e5;
                break; // 1000 * 60 * 60 * 24 * 7, negate dst
            default:
                output = this - that;
        }

        return asFloat ? output : absFloor(output);
    }

    function monthDiff(a, b) {
        if (a.date() < b.date()) {
            // end-of-month calculations work correct when the start month has more
            // days than the end month.
            return -monthDiff(b, a);
        }
        // difference in months
        var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()),
            // b is in (anchor - 1 month, anchor + 1 month)
            anchor = a.clone().add(wholeMonthDiff, 'months'),
            anchor2,
            adjust;

        if (b - anchor < 0) {
            anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
            // linear across the month
            adjust = (b - anchor) / (anchor - anchor2);
        } else {
            anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
            // linear across the month
            adjust = (b - anchor) / (anchor2 - anchor);
        }

        //check for negative zero, return zero if negative zero
        return -(wholeMonthDiff + adjust) || 0;
    }

    hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
    hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';

    function toString() {
        return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
    }

    function toISOString(keepOffset) {
        if (!this.isValid()) {
            return null;
        }
        var utc = keepOffset !== true,
            m = utc ? this.clone().utc() : this;
        if (m.year() < 0 || m.year() > 9999) {
            return formatMoment(
                m,
                utc
                    ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'
                    : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'
            );
        }
        if (isFunction(Date.prototype.toISOString)) {
            // native implementation is ~50x faster, use it when we can
            if (utc) {
                return this.toDate().toISOString();
            } else {
                return new Date(this.valueOf() + this.utcOffset() * 60 * 1000)
                    .toISOString()
                    .replace('Z', formatMoment(m, 'Z'));
            }
        }
        return formatMoment(
            m,
            utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'
        );
    }

    /**
     * Return a human readable representation of a moment that can
     * also be evaluated to get a new moment which is the same
     *
     * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects
     */
    function inspect() {
        if (!this.isValid()) {
            return 'moment.invalid(/* ' + this._i + ' */)';
        }
        var func = 'moment',
            zone = '',
            prefix,
            year,
            datetime,
            suffix;
        if (!this.isLocal()) {
            func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';
            zone = 'Z';
        }
        prefix = '[' + func + '("]';
        year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY';
        datetime = '-MM-DD[T]HH:mm:ss.SSS';
        suffix = zone + '[")]';

        return this.format(prefix + year + datetime + suffix);
    }

    function format(inputString) {
        if (!inputString) {
            inputString = this.isUtc()
                ? hooks.defaultFormatUtc
                : hooks.defaultFormat;
        }
        var output = formatMoment(this, inputString);
        return this.localeData().postformat(output);
    }

    function from(time, withoutSuffix) {
        if (
            this.isValid() &&
            ((isMoment(time) && time.isValid()) || createLocal(time).isValid())
        ) {
            return createDuration({ to: this, from: time })
                .locale(this.locale())
                .humanize(!withoutSuffix);
        } else {
            return this.localeData().invalidDate();
        }
    }

    function fromNow(withoutSuffix) {
        return this.from(createLocal(), withoutSuffix);
    }

    function to(time, withoutSuffix) {
        if (
            this.isValid() &&
            ((isMoment(time) && time.isValid()) || createLocal(time).isValid())
        ) {
            return createDuration({ from: this, to: time })
                .locale(this.locale())
                .humanize(!withoutSuffix);
        } else {
            return this.localeData().invalidDate();
        }
    }

    function toNow(withoutSuffix) {
        return this.to(createLocal(), withoutSuffix);
    }

    // If passed a locale key, it will set the locale for this
    // instance.  Otherwise, it will return the locale configuration
    // variables for this instance.
    function locale(key) {
        var newLocaleData;

        if (key === undefined) {
            return this._locale._abbr;
        } else {
            newLocaleData = getLocale(key);
            if (newLocaleData != null) {
                this._locale = newLocaleData;
            }
            return this;
        }
    }

    var lang = deprecate(
        'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
        function (key) {
            if (key === undefined) {
                return this.localeData();
            } else {
                return this.locale(key);
            }
        }
    );

    function localeData() {
        return this._locale;
    }

    var MS_PER_SECOND = 1000,
        MS_PER_MINUTE = 60 * MS_PER_SECOND,
        MS_PER_HOUR = 60 * MS_PER_MINUTE,
        MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR;

    // actual modulo - handles negative numbers (for dates before 1970):
    function mod$1(dividend, divisor) {
        return ((dividend % divisor) + divisor) % divisor;
    }

    function localStartOfDate(y, m, d) {
        // the date constructor remaps years 0-99 to 1900-1999
        if (y < 100 && y >= 0) {
            // preserve leap years using a full 400 year cycle, then reset
            return new Date(y + 400, m, d) - MS_PER_400_YEARS;
        } else {
            return new Date(y, m, d).valueOf();
        }
    }

    function utcStartOfDate(y, m, d) {
        // Date.UTC remaps years 0-99 to 1900-1999
        if (y < 100 && y >= 0) {
            // preserve leap years using a full 400 year cycle, then reset
            return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS;
        } else {
            return Date.UTC(y, m, d);
        }
    }

    function startOf(units) {
        var time, startOfDate;
        units = normalizeUnits(units);
        if (units === undefined || units === 'millisecond' || !this.isValid()) {
            return this;
        }

        startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;

        switch (units) {
            case 'year':
                time = startOfDate(this.year(), 0, 1);
                break;
            case 'quarter':
                time = startOfDate(
                    this.year(),
                    this.month() - (this.month() % 3),
                    1
                );
                break;
            case 'month':
                time = startOfDate(this.year(), this.month(), 1);
                break;
            case 'week':
                time = startOfDate(
                    this.year(),
                    this.month(),
                    this.date() - this.weekday()
                );
                break;
            case 'isoWeek':
                time = startOfDate(
                    this.year(),
                    this.month(),
                    this.date() - (this.isoWeekday() - 1)
                );
                break;
            case 'day':
            case 'date':
                time = startOfDate(this.year(), this.month(), this.date());
                break;
            case 'hour':
                time = this._d.valueOf();
                time -= mod$1(
                    time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),
                    MS_PER_HOUR
                );
                break;
            case 'minute':
                time = this._d.valueOf();
                time -= mod$1(time, MS_PER_MINUTE);
                break;
            case 'second':
                time = this._d.valueOf();
                time -= mod$1(time, MS_PER_SECOND);
                break;
        }

        this._d.setTime(time);
        hooks.updateOffset(this, true);
        return this;
    }

    function endOf(units) {
        var time, startOfDate;
        units = normalizeUnits(units);
        if (units === undefined || units === 'millisecond' || !this.isValid()) {
            return this;
        }

        startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;

        switch (units) {
            case 'year':
                time = startOfDate(this.year() + 1, 0, 1) - 1;
                break;
            case 'quarter':
                time =
                    startOfDate(
                        this.year(),
                        this.month() - (this.month() % 3) + 3,
                        1
                    ) - 1;
                break;
            case 'month':
                time = startOfDate(this.year(), this.month() + 1, 1) - 1;
                break;
            case 'week':
                time =
                    startOfDate(
                        this.year(),
                        this.month(),
                        this.date() - this.weekday() + 7
                    ) - 1;
                break;
            case 'isoWeek':
                time =
                    startOfDate(
                        this.year(),
                        this.month(),
                        this.date() - (this.isoWeekday() - 1) + 7
                    ) - 1;
                break;
            case 'day':
            case 'date':
                time = startOfDate(this.year(), this.month(), this.date() + 1) - 1;
                break;
            case 'hour':
                time = this._d.valueOf();
                time +=
                    MS_PER_HOUR -
                    mod$1(
                        time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),
                        MS_PER_HOUR
                    ) -
                    1;
                break;
            case 'minute':
                time = this._d.valueOf();
                time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1;
                break;
            case 'second':
                time = this._d.valueOf();
                time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1;
                break;
        }

        this._d.setTime(time);
        hooks.updateOffset(this, true);
        return this;
    }

    function valueOf() {
        return this._d.valueOf() - (this._offset || 0) * 60000;
    }

    function unix() {
        return Math.floor(this.valueOf() / 1000);
    }

    function toDate() {
        return new Date(this.valueOf());
    }

    function toArray() {
        var m = this;
        return [
            m.year(),
            m.month(),
            m.date(),
            m.hour(),
            m.minute(),
            m.second(),
            m.millisecond(),
        ];
    }

    function toObject() {
        var m = this;
        return {
            years: m.year(),
            months: m.month(),
            date: m.date(),
            hours: m.hours(),
            minutes: m.minutes(),
            seconds: m.seconds(),
            milliseconds: m.milliseconds(),
        };
    }

    function toJSON() {
        // new Date(NaN).toJSON() === null
        return this.isValid() ? this.toISOString() : null;
    }

    function isValid$2() {
        return isValid(this);
    }

    function parsingFlags() {
        return extend({}, getParsingFlags(this));
    }

    function invalidAt() {
        return getParsingFlags(this).overflow;
    }

    function creationData() {
        return {
            input: this._i,
            format: this._f,
            locale: this._locale,
            isUTC: this._isUTC,
            strict: this._strict,
        };
    }

    addFormatToken('N', 0, 0, 'eraAbbr');
    addFormatToken('NN', 0, 0, 'eraAbbr');
    addFormatToken('NNN', 0, 0, 'eraAbbr');
    addFormatToken('NNNN', 0, 0, 'eraName');
    addFormatToken('NNNNN', 0, 0, 'eraNarrow');

    addFormatToken('y', ['y', 1], 'yo', 'eraYear');
    addFormatToken('y', ['yy', 2], 0, 'eraYear');
    addFormatToken('y', ['yyy', 3], 0, 'eraYear');
    addFormatToken('y', ['yyyy', 4], 0, 'eraYear');

    addRegexToken('N', matchEraAbbr);
    addRegexToken('NN', matchEraAbbr);
    addRegexToken('NNN', matchEraAbbr);
    addRegexToken('NNNN', matchEraName);
    addRegexToken('NNNNN', matchEraNarrow);

    addParseToken(
        ['N', 'NN', 'NNN', 'NNNN', 'NNNNN'],
        function (input, array, config, token) {
            var era = config._locale.erasParse(input, token, config._strict);
            if (era) {
                getParsingFlags(config).era = era;
            } else {
                getParsingFlags(config).invalidEra = input;
            }
        }
    );

    addRegexToken('y', matchUnsigned);
    addRegexToken('yy', matchUnsigned);
    addRegexToken('yyy', matchUnsigned);
    addRegexToken('yyyy', matchUnsigned);
    addRegexToken('yo', matchEraYearOrdinal);

    addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR);
    addParseToken(['yo'], function (input, array, config, token) {
        var match;
        if (config._locale._eraYearOrdinalRegex) {
            match = input.match(config._locale._eraYearOrdinalRegex);
        }

        if (config._locale.eraYearOrdinalParse) {
            array[YEAR] = config._locale.eraYearOrdinalParse(input, match);
        } else {
            array[YEAR] = parseInt(input, 10);
        }
    });

    function localeEras(m, format) {
        var i,
            l,
            date,
            eras = this._eras || getLocale('en')._eras;
        for (i = 0, l = eras.length; i < l; ++i) {
            switch (typeof eras[i].since) {
                case 'string':
                    // truncate time
                    date = hooks(eras[i].since).startOf('day');
                    eras[i].since = date.valueOf();
                    break;
            }

            switch (typeof eras[i].until) {
                case 'undefined':
                    eras[i].until = +Infinity;
                    break;
                case 'string':
                    // truncate time
                    date = hooks(eras[i].until).startOf('day').valueOf();
                    eras[i].until = date.valueOf();
                    break;
            }
        }
        return eras;
    }

    function localeErasParse(eraName, format, strict) {
        var i,
            l,
            eras = this.eras(),
            name,
            abbr,
            narrow;
        eraName = eraName.toUpperCase();

        for (i = 0, l = eras.length; i < l; ++i) {
            name = eras[i].name.toUpperCase();
            abbr = eras[i].abbr.toUpperCase();
            narrow = eras[i].narrow.toUpperCase();

            if (strict) {
                switch (format) {
                    case 'N':
                    case 'NN':
                    case 'NNN':
                        if (abbr === eraName) {
                            return eras[i];
                        }
                        break;

                    case 'NNNN':
                        if (name === eraName) {
                            return eras[i];
                        }
                        break;

                    case 'NNNNN':
                        if (narrow === eraName) {
                            return eras[i];
                        }
                        break;
                }
            } else if ([name, abbr, narrow].indexOf(eraName) >= 0) {
                return eras[i];
            }
        }
    }

    function localeErasConvertYear(era, year) {
        var dir = era.since <= era.until ? +1 : -1;
        if (year === undefined) {
            return hooks(era.since).year();
        } else {
            return hooks(era.since).year() + (year - era.offset) * dir;
        }
    }

    function getEraName() {
        var i,
            l,
            val,
            eras = this.localeData().eras();
        for (i = 0, l = eras.length; i < l; ++i) {
            // truncate time
            val = this.clone().startOf('day').valueOf();

            if (eras[i].since <= val && val <= eras[i].until) {
                return eras[i].name;
            }
            if (eras[i].until <= val && val <= eras[i].since) {
                return eras[i].name;
            }
        }

        return '';
    }

    function getEraNarrow() {
        var i,
            l,
            val,
            eras = this.localeData().eras();
        for (i = 0, l = eras.length; i < l; ++i) {
            // truncate time
            val = this.clone().startOf('day').valueOf();

            if (eras[i].since <= val && val <= eras[i].until) {
                return eras[i].narrow;
            }
            if (eras[i].until <= val && val <= eras[i].since) {
                return eras[i].narrow;
            }
        }

        return '';
    }

    function getEraAbbr() {
        var i,
            l,
            val,
            eras = this.localeData().eras();
        for (i = 0, l = eras.length; i < l; ++i) {
            // truncate time
            val = this.clone().startOf('day').valueOf();

            if (eras[i].since <= val && val <= eras[i].until) {
                return eras[i].abbr;
            }
            if (eras[i].until <= val && val <= eras[i].since) {
                return eras[i].abbr;
            }
        }

        return '';
    }

    function getEraYear() {
        var i,
            l,
            dir,
            val,
            eras = this.localeData().eras();
        for (i = 0, l = eras.length; i < l; ++i) {
            dir = eras[i].since <= eras[i].until ? +1 : -1;

            // truncate time
            val = this.clone().startOf('day').valueOf();

            if (
                (eras[i].since <= val && val <= eras[i].until) ||
                (eras[i].until <= val && val <= eras[i].since)
            ) {
                return (
                    (this.year() - hooks(eras[i].since).year()) * dir +
                    eras[i].offset
                );
            }
        }

        return this.year();
    }

    function erasNameRegex(isStrict) {
        if (!hasOwnProp(this, '_erasNameRegex')) {
            computeErasParse.call(this);
        }
        return isStrict ? this._erasNameRegex : this._erasRegex;
    }

    function erasAbbrRegex(isStrict) {
        if (!hasOwnProp(this, '_erasAbbrRegex')) {
            computeErasParse.call(this);
        }
        return isStrict ? this._erasAbbrRegex : this._erasRegex;
    }

    function erasNarrowRegex(isStrict) {
        if (!hasOwnProp(this, '_erasNarrowRegex')) {
            computeErasParse.call(this);
        }
        return isStrict ? this._erasNarrowRegex : this._erasRegex;
    }

    function matchEraAbbr(isStrict, locale) {
        return locale.erasAbbrRegex(isStrict);
    }

    function matchEraName(isStrict, locale) {
        return locale.erasNameRegex(isStrict);
    }

    function matchEraNarrow(isStrict, locale) {
        return locale.erasNarrowRegex(isStrict);
    }

    function matchEraYearOrdinal(isStrict, locale) {
        return locale._eraYearOrdinalRegex || matchUnsigned;
    }

    function computeErasParse() {
        var abbrPieces = [],
            namePieces = [],
            narrowPieces = [],
            mixedPieces = [],
            i,
            l,
            eras = this.eras();

        for (i = 0, l = eras.length; i < l; ++i) {
            namePieces.push(regexEscape(eras[i].name));
            abbrPieces.push(regexEscape(eras[i].abbr));
            narrowPieces.push(regexEscape(eras[i].narrow));

            mixedPieces.push(regexEscape(eras[i].name));
            mixedPieces.push(regexEscape(eras[i].abbr));
            mixedPieces.push(regexEscape(eras[i].narrow));
        }

        this._erasRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
        this._erasNameRegex = new RegExp('^(' + namePieces.join('|') + ')', 'i');
        this._erasAbbrRegex = new RegExp('^(' + abbrPieces.join('|') + ')', 'i');
        this._erasNarrowRegex = new RegExp(
            '^(' + narrowPieces.join('|') + ')',
            'i'
        );
    }

    // FORMATTING

    addFormatToken(0, ['gg', 2], 0, function () {
        return this.weekYear() % 100;
    });

    addFormatToken(0, ['GG', 2], 0, function () {
        return this.isoWeekYear() % 100;
    });

    function addWeekYearFormatToken(token, getter) {
        addFormatToken(0, [token, token.length], 0, getter);
    }

    addWeekYearFormatToken('gggg', 'weekYear');
    addWeekYearFormatToken('ggggg', 'weekYear');
    addWeekYearFormatToken('GGGG', 'isoWeekYear');
    addWeekYearFormatToken('GGGGG', 'isoWeekYear');

    // ALIASES

    addUnitAlias('weekYear', 'gg');
    addUnitAlias('isoWeekYear', 'GG');

    // PRIORITY

    addUnitPriority('weekYear', 1);
    addUnitPriority('isoWeekYear', 1);

    // PARSING

    addRegexToken('G', matchSigned);
    addRegexToken('g', matchSigned);
    addRegexToken('GG', match1to2, match2);
    addRegexToken('gg', match1to2, match2);
    addRegexToken('GGGG', match1to4, match4);
    addRegexToken('gggg', match1to4, match4);
    addRegexToken('GGGGG', match1to6, match6);
    addRegexToken('ggggg', match1to6, match6);

    addWeekParseToken(
        ['gggg', 'ggggg', 'GGGG', 'GGGGG'],
        function (input, week, config, token) {
            week[token.substr(0, 2)] = toInt(input);
        }
    );

    addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
        week[token] = hooks.parseTwoDigitYear(input);
    });

    // MOMENTS

    function getSetWeekYear(input) {
        return getSetWeekYearHelper.call(
            this,
            input,
            this.week(),
            this.weekday(),
            this.localeData()._week.dow,
            this.localeData()._week.doy
        );
    }

    function getSetISOWeekYear(input) {
        return getSetWeekYearHelper.call(
            this,
            input,
            this.isoWeek(),
            this.isoWeekday(),
            1,
            4
        );
    }

    function getISOWeeksInYear() {
        return weeksInYear(this.year(), 1, 4);
    }

    function getISOWeeksInISOWeekYear() {
        return weeksInYear(this.isoWeekYear(), 1, 4);
    }

    function getWeeksInYear() {
        var weekInfo = this.localeData()._week;
        return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
    }

    function getWeeksInWeekYear() {
        var weekInfo = this.localeData()._week;
        return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy);
    }

    function getSetWeekYearHelper(input, week, weekday, dow, doy) {
        var weeksTarget;
        if (input == null) {
            return weekOfYear(this, dow, doy).year;
        } else {
            weeksTarget = weeksInYear(input, dow, doy);
            if (week > weeksTarget) {
                week = weeksTarget;
            }
            return setWeekAll.call(this, input, week, weekday, dow, doy);
        }
    }

    function setWeekAll(weekYear, week, weekday, dow, doy) {
        var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),
            date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);

        this.year(date.getUTCFullYear());
        this.month(date.getUTCMonth());
        this.date(date.getUTCDate());
        return this;
    }

    // FORMATTING

    addFormatToken('Q', 0, 'Qo', 'quarter');

    // ALIASES

    addUnitAlias('quarter', 'Q');

    // PRIORITY

    addUnitPriority('quarter', 7);

    // PARSING

    addRegexToken('Q', match1);
    addParseToken('Q', function (input, array) {
        array[MONTH] = (toInt(input) - 1) * 3;
    });

    // MOMENTS

    function getSetQuarter(input) {
        return input == null
            ? Math.ceil((this.month() + 1) / 3)
            : this.month((input - 1) * 3 + (this.month() % 3));
    }

    // FORMATTING

    addFormatToken('D', ['DD', 2], 'Do', 'date');

    // ALIASES

    addUnitAlias('date', 'D');

    // PRIORITY
    addUnitPriority('date', 9);

    // PARSING

    addRegexToken('D', match1to2);
    addRegexToken('DD', match1to2, match2);
    addRegexToken('Do', function (isStrict, locale) {
        // TODO: Remove "ordinalParse" fallback in next major release.
        return isStrict
            ? locale._dayOfMonthOrdinalParse || locale._ordinalParse
            : locale._dayOfMonthOrdinalParseLenient;
    });

    addParseToken(['D', 'DD'], DATE);
    addParseToken('Do', function (input, array) {
        array[DATE] = toInt(input.match(match1to2)[0]);
    });

    // MOMENTS

    var getSetDayOfMonth = makeGetSet('Date', true);

    // FORMATTING

    addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');

    // ALIASES

    addUnitAlias('dayOfYear', 'DDD');

    // PRIORITY
    addUnitPriority('dayOfYear', 4);

    // PARSING

    addRegexToken('DDD', match1to3);
    addRegexToken('DDDD', match3);
    addParseToken(['DDD', 'DDDD'], function (input, array, config) {
        config._dayOfYear = toInt(input);
    });

    // HELPERS

    // MOMENTS

    function getSetDayOfYear(input) {
        var dayOfYear =
            Math.round(
                (this.clone().startOf('day') - this.clone().startOf('year')) / 864e5
            ) + 1;
        return input == null ? dayOfYear : this.add(input - dayOfYear, 'd');
    }

    // FORMATTING

    addFormatToken('m', ['mm', 2], 0, 'minute');

    // ALIASES

    addUnitAlias('minute', 'm');

    // PRIORITY

    addUnitPriority('minute', 14);

    // PARSING

    addRegexToken('m', match1to2);
    addRegexToken('mm', match1to2, match2);
    addParseToken(['m', 'mm'], MINUTE);

    // MOMENTS

    var getSetMinute = makeGetSet('Minutes', false);

    // FORMATTING

    addFormatToken('s', ['ss', 2], 0, 'second');

    // ALIASES

    addUnitAlias('second', 's');

    // PRIORITY

    addUnitPriority('second', 15);

    // PARSING

    addRegexToken('s', match1to2);
    addRegexToken('ss', match1to2, match2);
    addParseToken(['s', 'ss'], SECOND);

    // MOMENTS

    var getSetSecond = makeGetSet('Seconds', false);

    // FORMATTING

    addFormatToken('S', 0, 0, function () {
        return ~~(this.millisecond() / 100);
    });

    addFormatToken(0, ['SS', 2], 0, function () {
        return ~~(this.millisecond() / 10);
    });

    addFormatToken(0, ['SSS', 3], 0, 'millisecond');
    addFormatToken(0, ['SSSS', 4], 0, function () {
        return this.millisecond() * 10;
    });
    addFormatToken(0, ['SSSSS', 5], 0, function () {
        return this.millisecond() * 100;
    });
    addFormatToken(0, ['SSSSSS', 6], 0, function () {
        return this.millisecond() * 1000;
    });
    addFormatToken(0, ['SSSSSSS', 7], 0, function () {
        return this.millisecond() * 10000;
    });
    addFormatToken(0, ['SSSSSSSS', 8], 0, function () {
        return this.millisecond() * 100000;
    });
    addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
        return this.millisecond() * 1000000;
    });

    // ALIASES

    addUnitAlias('millisecond', 'ms');

    // PRIORITY

    addUnitPriority('millisecond', 16);

    // PARSING

    addRegexToken('S', match1to3, match1);
    addRegexToken('SS', match1to3, match2);
    addRegexToken('SSS', match1to3, match3);

    var token, getSetMillisecond;
    for (token = 'SSSS'; token.length <= 9; token += 'S') {
        addRegexToken(token, matchUnsigned);
    }

    function parseMs(input, array) {
        array[MILLISECOND] = toInt(('0.' + input) * 1000);
    }

    for (token = 'S'; token.length <= 9; token += 'S') {
        addParseToken(token, parseMs);
    }

    getSetMillisecond = makeGetSet('Milliseconds', false);

    // FORMATTING

    addFormatToken('z', 0, 0, 'zoneAbbr');
    addFormatToken('zz', 0, 0, 'zoneName');

    // MOMENTS

    function getZoneAbbr() {
        return this._isUTC ? 'UTC' : '';
    }

    function getZoneName() {
        return this._isUTC ? 'Coordinated Universal Time' : '';
    }

    var proto = Moment.prototype;

    proto.add = add;
    proto.calendar = calendar$1;
    proto.clone = clone;
    proto.diff = diff;
    proto.endOf = endOf;
    proto.format = format;
    proto.from = from;
    proto.fromNow = fromNow;
    proto.to = to;
    proto.toNow = toNow;
    proto.get = stringGet;
    proto.invalidAt = invalidAt;
    proto.isAfter = isAfter;
    proto.isBefore = isBefore;
    proto.isBetween = isBetween;
    proto.isSame = isSame;
    proto.isSameOrAfter = isSameOrAfter;
    proto.isSameOrBefore = isSameOrBefore;
    proto.isValid = isValid$2;
    proto.lang = lang;
    proto.locale = locale;
    proto.localeData = localeData;
    proto.max = prototypeMax;
    proto.min = prototypeMin;
    proto.parsingFlags = parsingFlags;
    proto.set = stringSet;
    proto.startOf = startOf;
    proto.subtract = subtract;
    proto.toArray = toArray;
    proto.toObject = toObject;
    proto.toDate = toDate;
    proto.toISOString = toISOString;
    proto.inspect = inspect;
    if (typeof Symbol !== 'undefined' && Symbol.for != null) {
        proto[Symbol.for('nodejs.util.inspect.custom')] = function () {
            return 'Moment<' + this.format() + '>';
        };
    }
    proto.toJSON = toJSON;
    proto.toString = toString;
    proto.unix = unix;
    proto.valueOf = valueOf;
    proto.creationData = creationData;
    proto.eraName = getEraName;
    proto.eraNarrow = getEraNarrow;
    proto.eraAbbr = getEraAbbr;
    proto.eraYear = getEraYear;
    proto.year = getSetYear;
    proto.isLeapYear = getIsLeapYear;
    proto.weekYear = getSetWeekYear;
    proto.isoWeekYear = getSetISOWeekYear;
    proto.quarter = proto.quarters = getSetQuarter;
    proto.month = getSetMonth;
    proto.daysInMonth = getDaysInMonth;
    proto.week = proto.weeks = getSetWeek;
    proto.isoWeek = proto.isoWeeks = getSetISOWeek;
    proto.weeksInYear = getWeeksInYear;
    proto.weeksInWeekYear = getWeeksInWeekYear;
    proto.isoWeeksInYear = getISOWeeksInYear;
    proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear;
    proto.date = getSetDayOfMonth;
    proto.day = proto.days = getSetDayOfWeek;
    proto.weekday = getSetLocaleDayOfWeek;
    proto.isoWeekday = getSetISODayOfWeek;
    proto.dayOfYear = getSetDayOfYear;
    proto.hour = proto.hours = getSetHour;
    proto.minute = proto.minutes = getSetMinute;
    proto.second = proto.seconds = getSetSecond;
    proto.millisecond = proto.milliseconds = getSetMillisecond;
    proto.utcOffset = getSetOffset;
    proto.utc = setOffsetToUTC;
    proto.local = setOffsetToLocal;
    proto.parseZone = setOffsetToParsedOffset;
    proto.hasAlignedHourOffset = hasAlignedHourOffset;
    proto.isDST = isDaylightSavingTime;
    proto.isLocal = isLocal;
    proto.isUtcOffset = isUtcOffset;
    proto.isUtc = isUtc;
    proto.isUTC = isUtc;
    proto.zoneAbbr = getZoneAbbr;
    proto.zoneName = getZoneName;
    proto.dates = deprecate(
        'dates accessor is deprecated. Use date instead.',
        getSetDayOfMonth
    );
    proto.months = deprecate(
        'months accessor is deprecated. Use month instead',
        getSetMonth
    );
    proto.years = deprecate(
        'years accessor is deprecated. Use year instead',
        getSetYear
    );
    proto.zone = deprecate(
        'moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/',
        getSetZone
    );
    proto.isDSTShifted = deprecate(
        'isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information',
        isDaylightSavingTimeShifted
    );

    function createUnix(input) {
        return createLocal(input * 1000);
    }

    function createInZone() {
        return createLocal.apply(null, arguments).parseZone();
    }

    function preParsePostFormat(string) {
        return string;
    }

    var proto$1 = Locale.prototype;

    proto$1.calendar = calendar;
    proto$1.longDateFormat = longDateFormat;
    proto$1.invalidDate = invalidDate;
    proto$1.ordinal = ordinal;
    proto$1.preparse = preParsePostFormat;
    proto$1.postformat = preParsePostFormat;
    proto$1.relativeTime = relativeTime;
    proto$1.pastFuture = pastFuture;
    proto$1.set = set;
    proto$1.eras = localeEras;
    proto$1.erasParse = localeErasParse;
    proto$1.erasConvertYear = localeErasConvertYear;
    proto$1.erasAbbrRegex = erasAbbrRegex;
    proto$1.erasNameRegex = erasNameRegex;
    proto$1.erasNarrowRegex = erasNarrowRegex;

    proto$1.months = localeMonths;
    proto$1.monthsShort = localeMonthsShort;
    proto$1.monthsParse = localeMonthsParse;
    proto$1.monthsRegex = monthsRegex;
    proto$1.monthsShortRegex = monthsShortRegex;
    proto$1.week = localeWeek;
    proto$1.firstDayOfYear = localeFirstDayOfYear;
    proto$1.firstDayOfWeek = localeFirstDayOfWeek;

    proto$1.weekdays = localeWeekdays;
    proto$1.weekdaysMin = localeWeekdaysMin;
    proto$1.weekdaysShort = localeWeekdaysShort;
    proto$1.weekdaysParse = localeWeekdaysParse;

    proto$1.weekdaysRegex = weekdaysRegex;
    proto$1.weekdaysShortRegex = weekdaysShortRegex;
    proto$1.weekdaysMinRegex = weekdaysMinRegex;

    proto$1.isPM = localeIsPM;
    proto$1.meridiem = localeMeridiem;

    function get$1(format, index, field, setter) {
        var locale = getLocale(),
            utc = createUTC().set(setter, index);
        return locale[field](utc, format);
    }

    function listMonthsImpl(format, index, field) {
        if (isNumber(format)) {
            index = format;
            format = undefined;
        }

        format = format || '';

        if (index != null) {
            return get$1(format, index, field, 'month');
        }

        var i,
            out = [];
        for (i = 0; i < 12; i++) {
            out[i] = get$1(format, i, field, 'month');
        }
        return out;
    }

    // ()
    // (5)
    // (fmt, 5)
    // (fmt)
    // (true)
    // (true, 5)
    // (true, fmt, 5)
    // (true, fmt)
    function listWeekdaysImpl(localeSorted, format, index, field) {
        if (typeof localeSorted === 'boolean') {
            if (isNumber(format)) {
                index = format;
                format = undefined;
            }

            format = format || '';
        } else {
            format = localeSorted;
            index = format;
            localeSorted = false;

            if (isNumber(format)) {
                index = format;
                format = undefined;
            }

            format = format || '';
        }

        var locale = getLocale(),
            shift = localeSorted ? locale._week.dow : 0,
            i,
            out = [];

        if (index != null) {
            return get$1(format, (index + shift) % 7, field, 'day');
        }

        for (i = 0; i < 7; i++) {
            out[i] = get$1(format, (i + shift) % 7, field, 'day');
        }
        return out;
    }

    function listMonths(format, index) {
        return listMonthsImpl(format, index, 'months');
    }

    function listMonthsShort(format, index) {
        return listMonthsImpl(format, index, 'monthsShort');
    }

    function listWeekdays(localeSorted, format, index) {
        return listWeekdaysImpl(localeSorted, format, index, 'weekdays');
    }

    function listWeekdaysShort(localeSorted, format, index) {
        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');
    }

    function listWeekdaysMin(localeSorted, format, index) {
        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');
    }

    getSetGlobalLocale('en', {
        eras: [
            {
                since: '0001-01-01',
                until: +Infinity,
                offset: 1,
                name: 'Anno Domini',
                narrow: 'AD',
                abbr: 'AD',
            },
            {
                since: '0000-12-31',
                until: -Infinity,
                offset: 1,
                name: 'Before Christ',
                narrow: 'BC',
                abbr: 'BC',
            },
        ],
        dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    toInt((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
    });

    // Side effect imports

    hooks.lang = deprecate(
        'moment.lang is deprecated. Use moment.locale instead.',
        getSetGlobalLocale
    );
    hooks.langData = deprecate(
        'moment.langData is deprecated. Use moment.localeData instead.',
        getLocale
    );

    var mathAbs = Math.abs;

    function abs() {
        var data = this._data;

        this._milliseconds = mathAbs(this._milliseconds);
        this._days = mathAbs(this._days);
        this._months = mathAbs(this._months);

        data.milliseconds = mathAbs(data.milliseconds);
        data.seconds = mathAbs(data.seconds);
        data.minutes = mathAbs(data.minutes);
        data.hours = mathAbs(data.hours);
        data.months = mathAbs(data.months);
        data.years = mathAbs(data.years);

        return this;
    }

    function addSubtract$1(duration, input, value, direction) {
        var other = createDuration(input, value);

        duration._milliseconds += direction * other._milliseconds;
        duration._days += direction * other._days;
        duration._months += direction * other._months;

        return duration._bubble();
    }

    // supports only 2.0-style add(1, 's') or add(duration)
    function add$1(input, value) {
        return addSubtract$1(this, input, value, 1);
    }

    // supports only 2.0-style subtract(1, 's') or subtract(duration)
    function subtract$1(input, value) {
        return addSubtract$1(this, input, value, -1);
    }

    function absCeil(number) {
        if (number < 0) {
            return Math.floor(number);
        } else {
            return Math.ceil(number);
        }
    }

    function bubble() {
        var milliseconds = this._milliseconds,
            days = this._days,
            months = this._months,
            data = this._data,
            seconds,
            minutes,
            hours,
            years,
            monthsFromDays;

        // if we have a mix of positive and negative values, bubble down first
        // check: https://github.com/moment/moment/issues/2166
        if (
            !(
                (milliseconds >= 0 && days >= 0 && months >= 0) ||
                (milliseconds <= 0 && days <= 0 && months <= 0)
            )
        ) {
            milliseconds += absCeil(monthsToDays(months) + days) * 864e5;
            days = 0;
            months = 0;
        }

        // The following code bubbles up values, see the tests for
        // examples of what that means.
        data.milliseconds = milliseconds % 1000;

        seconds = absFloor(milliseconds / 1000);
        data.seconds = seconds % 60;

        minutes = absFloor(seconds / 60);
        data.minutes = minutes % 60;

        hours = absFloor(minutes / 60);
        data.hours = hours % 24;

        days += absFloor(hours / 24);

        // convert days to months
        monthsFromDays = absFloor(daysToMonths(days));
        months += monthsFromDays;
        days -= absCeil(monthsToDays(monthsFromDays));

        // 12 months -> 1 year
        years = absFloor(months / 12);
        months %= 12;

        data.days = days;
        data.months = months;
        data.years = years;

        return this;
    }

    function daysToMonths(days) {
        // 400 years have 146097 days (taking into account leap year rules)
        // 400 years have 12 months === 4800
        return (days * 4800) / 146097;
    }

    function monthsToDays(months) {
        // the reverse of daysToMonths
        return (months * 146097) / 4800;
    }

    function as(units) {
        if (!this.isValid()) {
            return NaN;
        }
        var days,
            months,
            milliseconds = this._milliseconds;

        units = normalizeUnits(units);

        if (units === 'month' || units === 'quarter' || units === 'year') {
            days = this._days + milliseconds / 864e5;
            months = this._months + daysToMonths(days);
            switch (units) {
                case 'month':
                    return months;
                case 'quarter':
                    return months / 3;
                case 'year':
                    return months / 12;
            }
        } else {
            // handle milliseconds separately because of floating point math errors (issue #1867)
            days = this._days + Math.round(monthsToDays(this._months));
            switch (units) {
                case 'week':
                    return days / 7 + milliseconds / 6048e5;
                case 'day':
                    return days + milliseconds / 864e5;
                case 'hour':
                    return days * 24 + milliseconds / 36e5;
                case 'minute':
                    return days * 1440 + milliseconds / 6e4;
                case 'second':
                    return days * 86400 + milliseconds / 1000;
                // Math.floor prevents floating point math errors here
                case 'millisecond':
                    return Math.floor(days * 864e5) + milliseconds;
                default:
                    throw new Error('Unknown unit ' + units);
            }
        }
    }

    // TODO: Use this.as('ms')?
    function valueOf$1() {
        if (!this.isValid()) {
            return NaN;
        }
        return (
            this._milliseconds +
            this._days * 864e5 +
            (this._months % 12) * 2592e6 +
            toInt(this._months / 12) * 31536e6
        );
    }

    function makeAs(alias) {
        return function () {
            return this.as(alias);
        };
    }

    var asMilliseconds = makeAs('ms'),
        asSeconds = makeAs('s'),
        asMinutes = makeAs('m'),
        asHours = makeAs('h'),
        asDays = makeAs('d'),
        asWeeks = makeAs('w'),
        asMonths = makeAs('M'),
        asQuarters = makeAs('Q'),
        asYears = makeAs('y');

    function clone$1() {
        return createDuration(this);
    }

    function get$2(units) {
        units = normalizeUnits(units);
        return this.isValid() ? this[units + 's']() : NaN;
    }

    function makeGetter(name) {
        return function () {
            return this.isValid() ? this._data[name] : NaN;
        };
    }

    var milliseconds = makeGetter('milliseconds'),
        seconds = makeGetter('seconds'),
        minutes = makeGetter('minutes'),
        hours = makeGetter('hours'),
        days = makeGetter('days'),
        months = makeGetter('months'),
        years = makeGetter('years');

    function weeks() {
        return absFloor(this.days() / 7);
    }

    var round = Math.round,
        thresholds = {
            ss: 44, // a few seconds to seconds
            s: 45, // seconds to minute
            m: 45, // minutes to hour
            h: 22, // hours to day
            d: 26, // days to month/week
            w: null, // weeks to month
            M: 11, // months to year
        };

    // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
    function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
        return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
    }

    function relativeTime$1(posNegDuration, withoutSuffix, thresholds, locale) {
        var duration = createDuration(posNegDuration).abs(),
            seconds = round(duration.as('s')),
            minutes = round(duration.as('m')),
            hours = round(duration.as('h')),
            days = round(duration.as('d')),
            months = round(duration.as('M')),
            weeks = round(duration.as('w')),
            years = round(duration.as('y')),
            a =
                (seconds <= thresholds.ss && ['s', seconds]) ||
                (seconds < thresholds.s && ['ss', seconds]) ||
                (minutes <= 1 && ['m']) ||
                (minutes < thresholds.m && ['mm', minutes]) ||
                (hours <= 1 && ['h']) ||
                (hours < thresholds.h && ['hh', hours]) ||
                (days <= 1 && ['d']) ||
                (days < thresholds.d && ['dd', days]);

        if (thresholds.w != null) {
            a =
                a ||
                (weeks <= 1 && ['w']) ||
                (weeks < thresholds.w && ['ww', weeks]);
        }
        a = a ||
            (months <= 1 && ['M']) ||
            (months < thresholds.M && ['MM', months]) ||
            (years <= 1 && ['y']) || ['yy', years];

        a[2] = withoutSuffix;
        a[3] = +posNegDuration > 0;
        a[4] = locale;
        return substituteTimeAgo.apply(null, a);
    }

    // This function allows you to set the rounding function for relative time strings
    function getSetRelativeTimeRounding(roundingFunction) {
        if (roundingFunction === undefined) {
            return round;
        }
        if (typeof roundingFunction === 'function') {
            round = roundingFunction;
            return true;
        }
        return false;
    }

    // This function allows you to set a threshold for relative time strings
    function getSetRelativeTimeThreshold(threshold, limit) {
        if (thresholds[threshold] === undefined) {
            return false;
        }
        if (limit === undefined) {
            return thresholds[threshold];
        }
        thresholds[threshold] = limit;
        if (threshold === 's') {
            thresholds.ss = limit - 1;
        }
        return true;
    }

    function humanize(argWithSuffix, argThresholds) {
        if (!this.isValid()) {
            return this.localeData().invalidDate();
        }

        var withSuffix = false,
            th = thresholds,
            locale,
            output;

        if (typeof argWithSuffix === 'object') {
            argThresholds = argWithSuffix;
            argWithSuffix = false;
        }
        if (typeof argWithSuffix === 'boolean') {
            withSuffix = argWithSuffix;
        }
        if (typeof argThresholds === 'object') {
            th = Object.assign({}, thresholds, argThresholds);
            if (argThresholds.s != null && argThresholds.ss == null) {
                th.ss = argThresholds.s - 1;
            }
        }

        locale = this.localeData();
        output = relativeTime$1(this, !withSuffix, th, locale);

        if (withSuffix) {
            output = locale.pastFuture(+this, output);
        }

        return locale.postformat(output);
    }

    var abs$1 = Math.abs;

    function sign(x) {
        return (x > 0) - (x < 0) || +x;
    }

    function toISOString$1() {
        // for ISO strings we do not use the normal bubbling rules:
        //  * milliseconds bubble up until they become hours
        //  * days do not bubble at all
        //  * months bubble up until they become years
        // This is because there is no context-free conversion between hours and days
        // (think of clock changes)
        // and also not between days and months (28-31 days per month)
        if (!this.isValid()) {
            return this.localeData().invalidDate();
        }

        var seconds = abs$1(this._milliseconds) / 1000,
            days = abs$1(this._days),
            months = abs$1(this._months),
            minutes,
            hours,
            years,
            s,
            total = this.asSeconds(),
            totalSign,
            ymSign,
            daysSign,
            hmsSign;

        if (!total) {
            // this is the same as C#'s (Noda) and python (isodate)...
            // but not other JS (goog.date)
            return 'P0D';
        }

        // 3600 seconds -> 60 minutes -> 1 hour
        minutes = absFloor(seconds / 60);
        hours = absFloor(minutes / 60);
        seconds %= 60;
        minutes %= 60;

        // 12 months -> 1 year
        years = absFloor(months / 12);
        months %= 12;

        // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
        s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : '';

        totalSign = total < 0 ? '-' : '';
        ymSign = sign(this._months) !== sign(total) ? '-' : '';
        daysSign = sign(this._days) !== sign(total) ? '-' : '';
        hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';

        return (
            totalSign +
            'P' +
            (years ? ymSign + years + 'Y' : '') +
            (months ? ymSign + months + 'M' : '') +
            (days ? daysSign + days + 'D' : '') +
            (hours || minutes || seconds ? 'T' : '') +
            (hours ? hmsSign + hours + 'H' : '') +
            (minutes ? hmsSign + minutes + 'M' : '') +
            (seconds ? hmsSign + s + 'S' : '')
        );
    }

    var proto$2 = Duration.prototype;

    proto$2.isValid = isValid$1;
    proto$2.abs = abs;
    proto$2.add = add$1;
    proto$2.subtract = subtract$1;
    proto$2.as = as;
    proto$2.asMilliseconds = asMilliseconds;
    proto$2.asSeconds = asSeconds;
    proto$2.asMinutes = asMinutes;
    proto$2.asHours = asHours;
    proto$2.asDays = asDays;
    proto$2.asWeeks = asWeeks;
    proto$2.asMonths = asMonths;
    proto$2.asQuarters = asQuarters;
    proto$2.asYears = asYears;
    proto$2.valueOf = valueOf$1;
    proto$2._bubble = bubble;
    proto$2.clone = clone$1;
    proto$2.get = get$2;
    proto$2.milliseconds = milliseconds;
    proto$2.seconds = seconds;
    proto$2.minutes = minutes;
    proto$2.hours = hours;
    proto$2.days = days;
    proto$2.weeks = weeks;
    proto$2.months = months;
    proto$2.years = years;
    proto$2.humanize = humanize;
    proto$2.toISOString = toISOString$1;
    proto$2.toString = toISOString$1;
    proto$2.toJSON = toISOString$1;
    proto$2.locale = locale;
    proto$2.localeData = localeData;

    proto$2.toIsoString = deprecate(
        'toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)',
        toISOString$1
    );
    proto$2.lang = lang;

    // FORMATTING

    addFormatToken('X', 0, 0, 'unix');
    addFormatToken('x', 0, 0, 'valueOf');

    // PARSING

    addRegexToken('x', matchSigned);
    addRegexToken('X', matchTimestamp);
    addParseToken('X', function (input, array, config) {
        config._d = new Date(parseFloat(input) * 1000);
    });
    addParseToken('x', function (input, array, config) {
        config._d = new Date(toInt(input));
    });

    //! moment.js

    hooks.version = '2.29.4';

    setHookCallback(createLocal);

    hooks.fn = proto;
    hooks.min = min;
    hooks.max = max;
    hooks.now = now;
    hooks.utc = createUTC;
    hooks.unix = createUnix;
    hooks.months = listMonths;
    hooks.isDate = isDate;
    hooks.locale = getSetGlobalLocale;
    hooks.invalid = createInvalid;
    hooks.duration = createDuration;
    hooks.isMoment = isMoment;
    hooks.weekdays = listWeekdays;
    hooks.parseZone = createInZone;
    hooks.localeData = getLocale;
    hooks.isDuration = isDuration;
    hooks.monthsShort = listMonthsShort;
    hooks.weekdaysMin = listWeekdaysMin;
    hooks.defineLocale = defineLocale;
    hooks.updateLocale = updateLocale;
    hooks.locales = listLocales;
    hooks.weekdaysShort = listWeekdaysShort;
    hooks.normalizeUnits = normalizeUnits;
    hooks.relativeTimeRounding = getSetRelativeTimeRounding;
    hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;
    hooks.calendarFormat = getCalendarFormat;
    hooks.prototype = proto;

    // currently HTML5 input type only supports 24-hour formats
    hooks.HTML5_FMT = {
        DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // <input type="datetime-local" />
        DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // <input type="datetime-local" step="1" />
        DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // <input type="datetime-local" step="0.001" />
        DATE: 'YYYY-MM-DD', // <input type="date" />
        TIME: 'HH:mm', // <input type="time" />
        TIME_SECONDS: 'HH:mm:ss', // <input type="time" step="1" />
        TIME_MS: 'HH:mm:ss.SSS', // <input type="time" step="0.001" />
        WEEK: 'GGGG-[W]WW', // <input type="week" />
        MONTH: 'YYYY-MM', // <input type="month" />
    };

    //! moment.js locale configuration

    hooks.defineLocale('af', {
        months: 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'),
        weekdays: 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split(
            '_'
        ),
        weekdaysShort: 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'),
        weekdaysMin: 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'),
        meridiemParse: /vm|nm/i,
        isPM: function (input) {
            return /^nm$/i.test(input);
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours < 12) {
                return isLower ? 'vm' : 'VM';
            } else {
                return isLower ? 'nm' : 'NM';
            }
        },
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Vandag om] LT',
            nextDay: '[Môre om] LT',
            nextWeek: 'dddd [om] LT',
            lastDay: '[Gister om] LT',
            lastWeek: '[Laas] dddd [om] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'oor %s',
            past: '%s gelede',
            s: "'n paar sekondes",
            ss: '%d sekondes',
            m: "'n minuut",
            mm: '%d minute',
            h: "'n uur",
            hh: '%d ure',
            d: "'n dag",
            dd: '%d dae',
            M: "'n maand",
            MM: '%d maande',
            y: "'n jaar",
            yy: '%d jaar',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/,
        ordinal: function (number) {
            return (
                number +
                (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')
            ); // Thanks to Joris Röling : https://github.com/jjupiter
        },
        week: {
            dow: 1, // Maandag is die eerste dag van die week.
            doy: 4, // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
        },
    });

    //! moment.js locale configuration

    var pluralForm = function (n) {
            return n === 0
                ? 0
                : n === 1
                ? 1
                : n === 2
                ? 2
                : n % 100 >= 3 && n % 100 <= 10
                ? 3
                : n % 100 >= 11
                ? 4
                : 5;
        },
        plurals = {
            s: [
                'أقل من ثانية',
                'ثانية واحدة',
                ['ثانيتان', 'ثانيتين'],
                '%d ثوان',
                '%d ثانية',
                '%d ثانية',
            ],
            m: [
                'أقل من دقيقة',
                'دقيقة واحدة',
                ['دقيقتان', 'دقيقتين'],
                '%d دقائق',
                '%d دقيقة',
                '%d دقيقة',
            ],
            h: [
                'أقل من ساعة',
                'ساعة واحدة',
                ['ساعتان', 'ساعتين'],
                '%d ساعات',
                '%d ساعة',
                '%d ساعة',
            ],
            d: [
                'أقل من يوم',
                'يوم واحد',
                ['يومان', 'يومين'],
                '%d أيام',
                '%d يومًا',
                '%d يوم',
            ],
            M: [
                'أقل من شهر',
                'شهر واحد',
                ['شهران', 'شهرين'],
                '%d أشهر',
                '%d شهرا',
                '%d شهر',
            ],
            y: [
                'أقل من عام',
                'عام واحد',
                ['عامان', 'عامين'],
                '%d أعوام',
                '%d عامًا',
                '%d عام',
            ],
        },
        pluralize = function (u) {
            return function (number, withoutSuffix, string, isFuture) {
                var f = pluralForm(number),
                    str = plurals[u][pluralForm(number)];
                if (f === 2) {
                    str = str[withoutSuffix ? 0 : 1];
                }
                return str.replace(/%d/i, number);
            };
        },
        months$1 = [
            'جانفي',
            'فيفري',
            'مارس',
            'أفريل',
            'ماي',
            'جوان',
            'جويلية',
            'أوت',
            'سبتمبر',
            'أكتوبر',
            'نوفمبر',
            'ديسمبر',
        ];

    hooks.defineLocale('ar-dz', {
        months: months$1,
        monthsShort: months$1,
        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'D/\u200FM/\u200FYYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        meridiemParse: /ص|م/,
        isPM: function (input) {
            return 'م' === input;
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'ص';
            } else {
                return 'م';
            }
        },
        calendar: {
            sameDay: '[اليوم عند الساعة] LT',
            nextDay: '[غدًا عند الساعة] LT',
            nextWeek: 'dddd [عند الساعة] LT',
            lastDay: '[أمس عند الساعة] LT',
            lastWeek: 'dddd [عند الساعة] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'بعد %s',
            past: 'منذ %s',
            s: pluralize('s'),
            ss: pluralize('s'),
            m: pluralize('m'),
            mm: pluralize('m'),
            h: pluralize('h'),
            hh: pluralize('h'),
            d: pluralize('d'),
            dd: pluralize('d'),
            M: pluralize('M'),
            MM: pluralize('M'),
            y: pluralize('y'),
            yy: pluralize('y'),
        },
        postformat: function (string) {
            return string.replace(/,/g, '،');
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('ar-kw', {
        months: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(
            '_'
        ),
        monthsShort:
            'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(
                '_'
            ),
        weekdays: 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
        weekdaysShort: 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[اليوم على الساعة] LT',
            nextDay: '[غدا على الساعة] LT',
            nextWeek: 'dddd [على الساعة] LT',
            lastDay: '[أمس على الساعة] LT',
            lastWeek: 'dddd [على الساعة] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'في %s',
            past: 'منذ %s',
            s: 'ثوان',
            ss: '%d ثانية',
            m: 'دقيقة',
            mm: '%d دقائق',
            h: 'ساعة',
            hh: '%d ساعات',
            d: 'يوم',
            dd: '%d أيام',
            M: 'شهر',
            MM: '%d أشهر',
            y: 'سنة',
            yy: '%d سنوات',
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 12, // The week that contains Jan 12th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var symbolMap = {
            1: '1',
            2: '2',
            3: '3',
            4: '4',
            5: '5',
            6: '6',
            7: '7',
            8: '8',
            9: '9',
            0: '0',
        },
        pluralForm$1 = function (n) {
            return n === 0
                ? 0
                : n === 1
                ? 1
                : n === 2
                ? 2
                : n % 100 >= 3 && n % 100 <= 10
                ? 3
                : n % 100 >= 11
                ? 4
                : 5;
        },
        plurals$1 = {
            s: [
                'أقل من ثانية',
                'ثانية واحدة',
                ['ثانيتان', 'ثانيتين'],
                '%d ثوان',
                '%d ثانية',
                '%d ثانية',
            ],
            m: [
                'أقل من دقيقة',
                'دقيقة واحدة',
                ['دقيقتان', 'دقيقتين'],
                '%d دقائق',
                '%d دقيقة',
                '%d دقيقة',
            ],
            h: [
                'أقل من ساعة',
                'ساعة واحدة',
                ['ساعتان', 'ساعتين'],
                '%d ساعات',
                '%d ساعة',
                '%d ساعة',
            ],
            d: [
                'أقل من يوم',
                'يوم واحد',
                ['يومان', 'يومين'],
                '%d أيام',
                '%d يومًا',
                '%d يوم',
            ],
            M: [
                'أقل من شهر',
                'شهر واحد',
                ['شهران', 'شهرين'],
                '%d أشهر',
                '%d شهرا',
                '%d شهر',
            ],
            y: [
                'أقل من عام',
                'عام واحد',
                ['عامان', 'عامين'],
                '%d أعوام',
                '%d عامًا',
                '%d عام',
            ],
        },
        pluralize$1 = function (u) {
            return function (number, withoutSuffix, string, isFuture) {
                var f = pluralForm$1(number),
                    str = plurals$1[u][pluralForm$1(number)];
                if (f === 2) {
                    str = str[withoutSuffix ? 0 : 1];
                }
                return str.replace(/%d/i, number);
            };
        },
        months$2 = [
            'يناير',
            'فبراير',
            'مارس',
            'أبريل',
            'مايو',
            'يونيو',
            'يوليو',
            'أغسطس',
            'سبتمبر',
            'أكتوبر',
            'نوفمبر',
            'ديسمبر',
        ];

    hooks.defineLocale('ar-ly', {
        months: months$2,
        monthsShort: months$2,
        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'D/\u200FM/\u200FYYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        meridiemParse: /ص|م/,
        isPM: function (input) {
            return 'م' === input;
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'ص';
            } else {
                return 'م';
            }
        },
        calendar: {
            sameDay: '[اليوم عند الساعة] LT',
            nextDay: '[غدًا عند الساعة] LT',
            nextWeek: 'dddd [عند الساعة] LT',
            lastDay: '[أمس عند الساعة] LT',
            lastWeek: 'dddd [عند الساعة] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'بعد %s',
            past: 'منذ %s',
            s: pluralize$1('s'),
            ss: pluralize$1('s'),
            m: pluralize$1('m'),
            mm: pluralize$1('m'),
            h: pluralize$1('h'),
            hh: pluralize$1('h'),
            d: pluralize$1('d'),
            dd: pluralize$1('d'),
            M: pluralize$1('M'),
            MM: pluralize$1('M'),
            y: pluralize$1('y'),
            yy: pluralize$1('y'),
        },
        preparse: function (string) {
            return string.replace(/،/g, ',');
        },
        postformat: function (string) {
            return string
                .replace(/\d/g, function (match) {
                    return symbolMap[match];
                })
                .replace(/,/g, '،');
        },
        week: {
            dow: 6, // Saturday is the first day of the week.
            doy: 12, // The week that contains Jan 12th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('ar-ma', {
        months: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(
            '_'
        ),
        monthsShort:
            'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(
                '_'
            ),
        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
        weekdaysShort: 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[اليوم على الساعة] LT',
            nextDay: '[غدا على الساعة] LT',
            nextWeek: 'dddd [على الساعة] LT',
            lastDay: '[أمس على الساعة] LT',
            lastWeek: 'dddd [على الساعة] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'في %s',
            past: 'منذ %s',
            s: 'ثوان',
            ss: '%d ثانية',
            m: 'دقيقة',
            mm: '%d دقائق',
            h: 'ساعة',
            hh: '%d ساعات',
            d: 'يوم',
            dd: '%d أيام',
            M: 'شهر',
            MM: '%d أشهر',
            y: 'سنة',
            yy: '%d سنوات',
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var symbolMap$1 = {
            1: '١',
            2: '٢',
            3: '٣',
            4: '٤',
            5: '٥',
            6: '٦',
            7: '٧',
            8: '٨',
            9: '٩',
            0: '٠',
        },
        numberMap = {
            '١': '1',
            '٢': '2',
            '٣': '3',
            '٤': '4',
            '٥': '5',
            '٦': '6',
            '٧': '7',
            '٨': '8',
            '٩': '9',
            '٠': '0',
        };

    hooks.defineLocale('ar-sa', {
        months: 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(
            '_'
        ),
        monthsShort:
            'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(
                '_'
            ),
        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        meridiemParse: /ص|م/,
        isPM: function (input) {
            return 'م' === input;
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'ص';
            } else {
                return 'م';
            }
        },
        calendar: {
            sameDay: '[اليوم على الساعة] LT',
            nextDay: '[غدا على الساعة] LT',
            nextWeek: 'dddd [على الساعة] LT',
            lastDay: '[أمس على الساعة] LT',
            lastWeek: 'dddd [على الساعة] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'في %s',
            past: 'منذ %s',
            s: 'ثوان',
            ss: '%d ثانية',
            m: 'دقيقة',
            mm: '%d دقائق',
            h: 'ساعة',
            hh: '%d ساعات',
            d: 'يوم',
            dd: '%d أيام',
            M: 'شهر',
            MM: '%d أشهر',
            y: 'سنة',
            yy: '%d سنوات',
        },
        preparse: function (string) {
            return string
                .replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
                    return numberMap[match];
                })
                .replace(/،/g, ',');
        },
        postformat: function (string) {
            return string
                .replace(/\d/g, function (match) {
                    return symbolMap$1[match];
                })
                .replace(/,/g, '،');
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('ar-tn', {
        months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(
            '_'
        ),
        monthsShort:
            'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(
                '_'
            ),
        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[اليوم على الساعة] LT',
            nextDay: '[غدا على الساعة] LT',
            nextWeek: 'dddd [على الساعة] LT',
            lastDay: '[أمس على الساعة] LT',
            lastWeek: 'dddd [على الساعة] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'في %s',
            past: 'منذ %s',
            s: 'ثوان',
            ss: '%d ثانية',
            m: 'دقيقة',
            mm: '%d دقائق',
            h: 'ساعة',
            hh: '%d ساعات',
            d: 'يوم',
            dd: '%d أيام',
            M: 'شهر',
            MM: '%d أشهر',
            y: 'سنة',
            yy: '%d سنوات',
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var symbolMap$2 = {
            1: '١',
            2: '٢',
            3: '٣',
            4: '٤',
            5: '٥',
            6: '٦',
            7: '٧',
            8: '٨',
            9: '٩',
            0: '٠',
        },
        numberMap$1 = {
            '١': '1',
            '٢': '2',
            '٣': '3',
            '٤': '4',
            '٥': '5',
            '٦': '6',
            '٧': '7',
            '٨': '8',
            '٩': '9',
            '٠': '0',
        },
        pluralForm$2 = function (n) {
            return n === 0
                ? 0
                : n === 1
                ? 1
                : n === 2
                ? 2
                : n % 100 >= 3 && n % 100 <= 10
                ? 3
                : n % 100 >= 11
                ? 4
                : 5;
        },
        plurals$2 = {
            s: [
                'أقل من ثانية',
                'ثانية واحدة',
                ['ثانيتان', 'ثانيتين'],
                '%d ثوان',
                '%d ثانية',
                '%d ثانية',
            ],
            m: [
                'أقل من دقيقة',
                'دقيقة واحدة',
                ['دقيقتان', 'دقيقتين'],
                '%d دقائق',
                '%d دقيقة',
                '%d دقيقة',
            ],
            h: [
                'أقل من ساعة',
                'ساعة واحدة',
                ['ساعتان', 'ساعتين'],
                '%d ساعات',
                '%d ساعة',
                '%d ساعة',
            ],
            d: [
                'أقل من يوم',
                'يوم واحد',
                ['يومان', 'يومين'],
                '%d أيام',
                '%d يومًا',
                '%d يوم',
            ],
            M: [
                'أقل من شهر',
                'شهر واحد',
                ['شهران', 'شهرين'],
                '%d أشهر',
                '%d شهرا',
                '%d شهر',
            ],
            y: [
                'أقل من عام',
                'عام واحد',
                ['عامان', 'عامين'],
                '%d أعوام',
                '%d عامًا',
                '%d عام',
            ],
        },
        pluralize$2 = function (u) {
            return function (number, withoutSuffix, string, isFuture) {
                var f = pluralForm$2(number),
                    str = plurals$2[u][pluralForm$2(number)];
                if (f === 2) {
                    str = str[withoutSuffix ? 0 : 1];
                }
                return str.replace(/%d/i, number);
            };
        },
        months$3 = [
            'يناير',
            'فبراير',
            'مارس',
            'أبريل',
            'مايو',
            'يونيو',
            'يوليو',
            'أغسطس',
            'سبتمبر',
            'أكتوبر',
            'نوفمبر',
            'ديسمبر',
        ];

    hooks.defineLocale('ar', {
        months: months$3,
        monthsShort: months$3,
        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'D/\u200FM/\u200FYYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        meridiemParse: /ص|م/,
        isPM: function (input) {
            return 'م' === input;
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'ص';
            } else {
                return 'م';
            }
        },
        calendar: {
            sameDay: '[اليوم عند الساعة] LT',
            nextDay: '[غدًا عند الساعة] LT',
            nextWeek: 'dddd [عند الساعة] LT',
            lastDay: '[أمس عند الساعة] LT',
            lastWeek: 'dddd [عند الساعة] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'بعد %s',
            past: 'منذ %s',
            s: pluralize$2('s'),
            ss: pluralize$2('s'),
            m: pluralize$2('m'),
            mm: pluralize$2('m'),
            h: pluralize$2('h'),
            hh: pluralize$2('h'),
            d: pluralize$2('d'),
            dd: pluralize$2('d'),
            M: pluralize$2('M'),
            MM: pluralize$2('M'),
            y: pluralize$2('y'),
            yy: pluralize$2('y'),
        },
        preparse: function (string) {
            return string
                .replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
                    return numberMap$1[match];
                })
                .replace(/،/g, ',');
        },
        postformat: function (string) {
            return string
                .replace(/\d/g, function (match) {
                    return symbolMap$2[match];
                })
                .replace(/,/g, '،');
        },
        week: {
            dow: 6, // Saturday is the first day of the week.
            doy: 12, // The week that contains Jan 12th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var suffixes = {
        1: '-inci',
        5: '-inci',
        8: '-inci',
        70: '-inci',
        80: '-inci',
        2: '-nci',
        7: '-nci',
        20: '-nci',
        50: '-nci',
        3: '-üncü',
        4: '-üncü',
        100: '-üncü',
        6: '-ncı',
        9: '-uncu',
        10: '-uncu',
        30: '-uncu',
        60: '-ıncı',
        90: '-ıncı',
    };

    hooks.defineLocale('az', {
        months: 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split(
            '_'
        ),
        monthsShort: 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'),
        weekdays:
            'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split(
                '_'
            ),
        weekdaysShort: 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'),
        weekdaysMin: 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[bugün saat] LT',
            nextDay: '[sabah saat] LT',
            nextWeek: '[gələn həftə] dddd [saat] LT',
            lastDay: '[dünən] LT',
            lastWeek: '[keçən həftə] dddd [saat] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s sonra',
            past: '%s əvvəl',
            s: 'bir neçə saniyə',
            ss: '%d saniyə',
            m: 'bir dəqiqə',
            mm: '%d dəqiqə',
            h: 'bir saat',
            hh: '%d saat',
            d: 'bir gün',
            dd: '%d gün',
            M: 'bir ay',
            MM: '%d ay',
            y: 'bir il',
            yy: '%d il',
        },
        meridiemParse: /gecə|səhər|gündüz|axşam/,
        isPM: function (input) {
            return /^(gündüz|axşam)$/.test(input);
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'gecə';
            } else if (hour < 12) {
                return 'səhər';
            } else if (hour < 17) {
                return 'gündüz';
            } else {
                return 'axşam';
            }
        },
        dayOfMonthOrdinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,
        ordinal: function (number) {
            if (number === 0) {
                // special case for zero
                return number + '-ıncı';
            }
            var a = number % 10,
                b = (number % 100) - a,
                c = number >= 100 ? 100 : null;
            return number + (suffixes[a] || suffixes[b] || suffixes[c]);
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function plural(word, num) {
        var forms = word.split('_');
        return num % 10 === 1 && num % 100 !== 11
            ? forms[0]
            : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20)
            ? forms[1]
            : forms[2];
    }
    function relativeTimeWithPlural(number, withoutSuffix, key) {
        var format = {
            ss: withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд',
            mm: withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін',
            hh: withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін',
            dd: 'дзень_дні_дзён',
            MM: 'месяц_месяцы_месяцаў',
            yy: 'год_гады_гадоў',
        };
        if (key === 'm') {
            return withoutSuffix ? 'хвіліна' : 'хвіліну';
        } else if (key === 'h') {
            return withoutSuffix ? 'гадзіна' : 'гадзіну';
        } else {
            return number + ' ' + plural(format[key], +number);
        }
    }

    hooks.defineLocale('be', {
        months: {
            format: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split(
                '_'
            ),
            standalone:
                'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split(
                    '_'
                ),
        },
        monthsShort:
            'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'),
        weekdays: {
            format: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split(
                '_'
            ),
            standalone:
                'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split(
                    '_'
                ),
            isFormat: /\[ ?[Ууў] ?(?:мінулую|наступную)? ?\] ?dddd/,
        },
        weekdaysShort: 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
        weekdaysMin: 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY г.',
            LLL: 'D MMMM YYYY г., HH:mm',
            LLLL: 'dddd, D MMMM YYYY г., HH:mm',
        },
        calendar: {
            sameDay: '[Сёння ў] LT',
            nextDay: '[Заўтра ў] LT',
            lastDay: '[Учора ў] LT',
            nextWeek: function () {
                return '[У] dddd [ў] LT';
            },
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                    case 3:
                    case 5:
                    case 6:
                        return '[У мінулую] dddd [ў] LT';
                    case 1:
                    case 2:
                    case 4:
                        return '[У мінулы] dddd [ў] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'праз %s',
            past: '%s таму',
            s: 'некалькі секунд',
            m: relativeTimeWithPlural,
            mm: relativeTimeWithPlural,
            h: relativeTimeWithPlural,
            hh: relativeTimeWithPlural,
            d: 'дзень',
            dd: relativeTimeWithPlural,
            M: 'месяц',
            MM: relativeTimeWithPlural,
            y: 'год',
            yy: relativeTimeWithPlural,
        },
        meridiemParse: /ночы|раніцы|дня|вечара/,
        isPM: function (input) {
            return /^(дня|вечара)$/.test(input);
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'ночы';
            } else if (hour < 12) {
                return 'раніцы';
            } else if (hour < 17) {
                return 'дня';
            } else {
                return 'вечара';
            }
        },
        dayOfMonthOrdinalParse: /\d{1,2}-(і|ы|га)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'M':
                case 'd':
                case 'DDD':
                case 'w':
                case 'W':
                    return (number % 10 === 2 || number % 10 === 3) &&
                        number % 100 !== 12 &&
                        number % 100 !== 13
                        ? number + '-і'
                        : number + '-ы';
                case 'D':
                    return number + '-га';
                default:
                    return number;
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('bg', {
        months: 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split(
            '_'
        ),
        monthsShort: 'яну_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'),
        weekdays: 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split(
            '_'
        ),
        weekdaysShort: 'нед_пон_вто_сря_чет_пет_съб'.split('_'),
        weekdaysMin: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'D.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY H:mm',
            LLLL: 'dddd, D MMMM YYYY H:mm',
        },
        calendar: {
            sameDay: '[Днес в] LT',
            nextDay: '[Утре в] LT',
            nextWeek: 'dddd [в] LT',
            lastDay: '[Вчера в] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                    case 3:
                    case 6:
                        return '[Миналата] dddd [в] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[Миналия] dddd [в] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'след %s',
            past: 'преди %s',
            s: 'няколко секунди',
            ss: '%d секунди',
            m: 'минута',
            mm: '%d минути',
            h: 'час',
            hh: '%d часа',
            d: 'ден',
            dd: '%d дена',
            w: 'седмица',
            ww: '%d седмици',
            M: 'месец',
            MM: '%d месеца',
            y: 'година',
            yy: '%d години',
        },
        dayOfMonthOrdinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/,
        ordinal: function (number) {
            var lastDigit = number % 10,
                last2Digits = number % 100;
            if (number === 0) {
                return number + '-ев';
            } else if (last2Digits === 0) {
                return number + '-ен';
            } else if (last2Digits > 10 && last2Digits < 20) {
                return number + '-ти';
            } else if (lastDigit === 1) {
                return number + '-ви';
            } else if (lastDigit === 2) {
                return number + '-ри';
            } else if (lastDigit === 7 || lastDigit === 8) {
                return number + '-ми';
            } else {
                return number + '-ти';
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('bm', {
        months: 'Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_Mɛkalo_Zuwɛnkalo_Zuluyekalo_Utikalo_Sɛtanburukalo_ɔkutɔburukalo_Nowanburukalo_Desanburukalo'.split(
            '_'
        ),
        monthsShort: 'Zan_Few_Mar_Awi_Mɛ_Zuw_Zul_Uti_Sɛt_ɔku_Now_Des'.split('_'),
        weekdays: 'Kari_Ntɛnɛn_Tarata_Araba_Alamisa_Juma_Sibiri'.split('_'),
        weekdaysShort: 'Kar_Ntɛ_Tar_Ara_Ala_Jum_Sib'.split('_'),
        weekdaysMin: 'Ka_Nt_Ta_Ar_Al_Ju_Si'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'MMMM [tile] D [san] YYYY',
            LLL: 'MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm',
            LLLL: 'dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm',
        },
        calendar: {
            sameDay: '[Bi lɛrɛ] LT',
            nextDay: '[Sini lɛrɛ] LT',
            nextWeek: 'dddd [don lɛrɛ] LT',
            lastDay: '[Kunu lɛrɛ] LT',
            lastWeek: 'dddd [tɛmɛnen lɛrɛ] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s kɔnɔ',
            past: 'a bɛ %s bɔ',
            s: 'sanga dama dama',
            ss: 'sekondi %d',
            m: 'miniti kelen',
            mm: 'miniti %d',
            h: 'lɛrɛ kelen',
            hh: 'lɛrɛ %d',
            d: 'tile kelen',
            dd: 'tile %d',
            M: 'kalo kelen',
            MM: 'kalo %d',
            y: 'san kelen',
            yy: 'san %d',
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var symbolMap$3 = {
            1: '১',
            2: '২',
            3: '৩',
            4: '৪',
            5: '৫',
            6: '৬',
            7: '৭',
            8: '৮',
            9: '৯',
            0: '০',
        },
        numberMap$2 = {
            '১': '1',
            '২': '2',
            '৩': '3',
            '৪': '4',
            '৫': '5',
            '৬': '6',
            '৭': '7',
            '৮': '8',
            '৯': '9',
            '০': '0',
        };

    hooks.defineLocale('bn-bd', {
        months: 'জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split(
            '_'
        ),
        monthsShort:
            'জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে'.split(
                '_'
            ),
        weekdays: 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split(
            '_'
        ),
        weekdaysShort: 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),
        weekdaysMin: 'রবি_সোম_মঙ্গল_বুধ_বৃহ_শুক্র_শনি'.split('_'),
        longDateFormat: {
            LT: 'A h:mm সময়',
            LTS: 'A h:mm:ss সময়',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm সময়',
            LLLL: 'dddd, D MMMM YYYY, A h:mm সময়',
        },
        calendar: {
            sameDay: '[আজ] LT',
            nextDay: '[আগামীকাল] LT',
            nextWeek: 'dddd, LT',
            lastDay: '[গতকাল] LT',
            lastWeek: '[গত] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s পরে',
            past: '%s আগে',
            s: 'কয়েক সেকেন্ড',
            ss: '%d সেকেন্ড',
            m: 'এক মিনিট',
            mm: '%d মিনিট',
            h: 'এক ঘন্টা',
            hh: '%d ঘন্টা',
            d: 'এক দিন',
            dd: '%d দিন',
            M: 'এক মাস',
            MM: '%d মাস',
            y: 'এক বছর',
            yy: '%d বছর',
        },
        preparse: function (string) {
            return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {
                return numberMap$2[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap$3[match];
            });
        },

        meridiemParse: /রাত|ভোর|সকাল|দুপুর|বিকাল|সন্ধ্যা|রাত/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'রাত') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'ভোর') {
                return hour;
            } else if (meridiem === 'সকাল') {
                return hour;
            } else if (meridiem === 'দুপুর') {
                return hour >= 3 ? hour : hour + 12;
            } else if (meridiem === 'বিকাল') {
                return hour + 12;
            } else if (meridiem === 'সন্ধ্যা') {
                return hour + 12;
            }
        },

        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'রাত';
            } else if (hour < 6) {
                return 'ভোর';
            } else if (hour < 12) {
                return 'সকাল';
            } else if (hour < 15) {
                return 'দুপুর';
            } else if (hour < 18) {
                return 'বিকাল';
            } else if (hour < 20) {
                return 'সন্ধ্যা';
            } else {
                return 'রাত';
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var symbolMap$4 = {
            1: '১',
            2: '২',
            3: '৩',
            4: '৪',
            5: '৫',
            6: '৬',
            7: '৭',
            8: '৮',
            9: '৯',
            0: '০',
        },
        numberMap$3 = {
            '১': '1',
            '২': '2',
            '৩': '3',
            '৪': '4',
            '৫': '5',
            '৬': '6',
            '৭': '7',
            '৮': '8',
            '৯': '9',
            '০': '0',
        };

    hooks.defineLocale('bn', {
        months: 'জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split(
            '_'
        ),
        monthsShort:
            'জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে'.split(
                '_'
            ),
        weekdays: 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split(
            '_'
        ),
        weekdaysShort: 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),
        weekdaysMin: 'রবি_সোম_মঙ্গল_বুধ_বৃহ_শুক্র_শনি'.split('_'),
        longDateFormat: {
            LT: 'A h:mm সময়',
            LTS: 'A h:mm:ss সময়',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm সময়',
            LLLL: 'dddd, D MMMM YYYY, A h:mm সময়',
        },
        calendar: {
            sameDay: '[আজ] LT',
            nextDay: '[আগামীকাল] LT',
            nextWeek: 'dddd, LT',
            lastDay: '[গতকাল] LT',
            lastWeek: '[গত] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s পরে',
            past: '%s আগে',
            s: 'কয়েক সেকেন্ড',
            ss: '%d সেকেন্ড',
            m: 'এক মিনিট',
            mm: '%d মিনিট',
            h: 'এক ঘন্টা',
            hh: '%d ঘন্টা',
            d: 'এক দিন',
            dd: '%d দিন',
            M: 'এক মাস',
            MM: '%d মাস',
            y: 'এক বছর',
            yy: '%d বছর',
        },
        preparse: function (string) {
            return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {
                return numberMap$3[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap$4[match];
            });
        },
        meridiemParse: /রাত|সকাল|দুপুর|বিকাল|রাত/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (
                (meridiem === 'রাত' && hour >= 4) ||
                (meridiem === 'দুপুর' && hour < 5) ||
                meridiem === 'বিকাল'
            ) {
                return hour + 12;
            } else {
                return hour;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'রাত';
            } else if (hour < 10) {
                return 'সকাল';
            } else if (hour < 17) {
                return 'দুপুর';
            } else if (hour < 20) {
                return 'বিকাল';
            } else {
                return 'রাত';
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var symbolMap$5 = {
            1: '༡',
            2: '༢',
            3: '༣',
            4: '༤',
            5: '༥',
            6: '༦',
            7: '༧',
            8: '༨',
            9: '༩',
            0: '༠',
        },
        numberMap$4 = {
            '༡': '1',
            '༢': '2',
            '༣': '3',
            '༤': '4',
            '༥': '5',
            '༦': '6',
            '༧': '7',
            '༨': '8',
            '༩': '9',
            '༠': '0',
        };

    hooks.defineLocale('bo', {
        months: 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split(
            '_'
        ),
        monthsShort:
            'ཟླ་1_ཟླ་2_ཟླ་3_ཟླ་4_ཟླ་5_ཟླ་6_ཟླ་7_ཟླ་8_ཟླ་9_ཟླ་10_ཟླ་11_ཟླ་12'.split(
                '_'
            ),
        monthsShortRegex: /^(ཟླ་\d{1,2})/,
        monthsParseExact: true,
        weekdays:
            'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split(
                '_'
            ),
        weekdaysShort: 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split(
            '_'
        ),
        weekdaysMin: 'ཉི_ཟླ_མིག_ལྷག_ཕུར_སངས_སྤེན'.split('_'),
        longDateFormat: {
            LT: 'A h:mm',
            LTS: 'A h:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm',
            LLLL: 'dddd, D MMMM YYYY, A h:mm',
        },
        calendar: {
            sameDay: '[དི་རིང] LT',
            nextDay: '[སང་ཉིན] LT',
            nextWeek: '[བདུན་ཕྲག་རྗེས་མ], LT',
            lastDay: '[ཁ་སང] LT',
            lastWeek: '[བདུན་ཕྲག་མཐའ་མ] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s ལ་',
            past: '%s སྔན་ལ',
            s: 'ལམ་སང',
            ss: '%d སྐར་ཆ།',
            m: 'སྐར་མ་གཅིག',
            mm: '%d སྐར་མ',
            h: 'ཆུ་ཚོད་གཅིག',
            hh: '%d ཆུ་ཚོད',
            d: 'ཉིན་གཅིག',
            dd: '%d ཉིན་',
            M: 'ཟླ་བ་གཅིག',
            MM: '%d ཟླ་བ',
            y: 'ལོ་གཅིག',
            yy: '%d ལོ',
        },
        preparse: function (string) {
            return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) {
                return numberMap$4[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap$5[match];
            });
        },
        meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (
                (meridiem === 'མཚན་མོ' && hour >= 4) ||
                (meridiem === 'ཉིན་གུང' && hour < 5) ||
                meridiem === 'དགོང་དག'
            ) {
                return hour + 12;
            } else {
                return hour;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'མཚན་མོ';
            } else if (hour < 10) {
                return 'ཞོགས་ཀས';
            } else if (hour < 17) {
                return 'ཉིན་གུང';
            } else if (hour < 20) {
                return 'དགོང་དག';
            } else {
                return 'མཚན་མོ';
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function relativeTimeWithMutation(number, withoutSuffix, key) {
        var format = {
            mm: 'munutenn',
            MM: 'miz',
            dd: 'devezh',
        };
        return number + ' ' + mutation(format[key], number);
    }
    function specialMutationForYears(number) {
        switch (lastNumber(number)) {
            case 1:
            case 3:
            case 4:
            case 5:
            case 9:
                return number + ' bloaz';
            default:
                return number + ' vloaz';
        }
    }
    function lastNumber(number) {
        if (number > 9) {
            return lastNumber(number % 10);
        }
        return number;
    }
    function mutation(text, number) {
        if (number === 2) {
            return softMutation(text);
        }
        return text;
    }
    function softMutation(text) {
        var mutationTable = {
            m: 'v',
            b: 'v',
            d: 'z',
        };
        if (mutationTable[text.charAt(0)] === undefined) {
            return text;
        }
        return mutationTable[text.charAt(0)] + text.substring(1);
    }

    var monthsParse = [
            /^gen/i,
            /^c[ʼ\']hwe/i,
            /^meu/i,
            /^ebr/i,
            /^mae/i,
            /^(mez|eve)/i,
            /^gou/i,
            /^eos/i,
            /^gwe/i,
            /^her/i,
            /^du/i,
            /^ker/i,
        ],
        monthsRegex$1 =
            /^(genver|c[ʼ\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu|gen|c[ʼ\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,
        monthsStrictRegex =
            /^(genver|c[ʼ\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu)/i,
        monthsShortStrictRegex =
            /^(gen|c[ʼ\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,
        fullWeekdaysParse = [
            /^sul/i,
            /^lun/i,
            /^meurzh/i,
            /^merc[ʼ\']her/i,
            /^yaou/i,
            /^gwener/i,
            /^sadorn/i,
        ],
        shortWeekdaysParse = [
            /^Sul/i,
            /^Lun/i,
            /^Meu/i,
            /^Mer/i,
            /^Yao/i,
            /^Gwe/i,
            /^Sad/i,
        ],
        minWeekdaysParse = [
            /^Su/i,
            /^Lu/i,
            /^Me([^r]|$)/i,
            /^Mer/i,
            /^Ya/i,
            /^Gw/i,
            /^Sa/i,
        ];

    hooks.defineLocale('br', {
        months: 'Genver_Cʼhwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split(
            '_'
        ),
        monthsShort: 'Gen_Cʼhwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'),
        weekdays: 'Sul_Lun_Meurzh_Mercʼher_Yaou_Gwener_Sadorn'.split('_'),
        weekdaysShort: 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'),
        weekdaysMin: 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'),
        weekdaysParse: minWeekdaysParse,
        fullWeekdaysParse: fullWeekdaysParse,
        shortWeekdaysParse: shortWeekdaysParse,
        minWeekdaysParse: minWeekdaysParse,

        monthsRegex: monthsRegex$1,
        monthsShortRegex: monthsRegex$1,
        monthsStrictRegex: monthsStrictRegex,
        monthsShortStrictRegex: monthsShortStrictRegex,
        monthsParse: monthsParse,
        longMonthsParse: monthsParse,
        shortMonthsParse: monthsParse,

        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D [a viz] MMMM YYYY',
            LLL: 'D [a viz] MMMM YYYY HH:mm',
            LLLL: 'dddd, D [a viz] MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Hiziv da] LT',
            nextDay: '[Warcʼhoazh da] LT',
            nextWeek: 'dddd [da] LT',
            lastDay: '[Decʼh da] LT',
            lastWeek: 'dddd [paset da] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'a-benn %s',
            past: '%s ʼzo',
            s: 'un nebeud segondennoù',
            ss: '%d eilenn',
            m: 'ur vunutenn',
            mm: relativeTimeWithMutation,
            h: 'un eur',
            hh: '%d eur',
            d: 'un devezh',
            dd: relativeTimeWithMutation,
            M: 'ur miz',
            MM: relativeTimeWithMutation,
            y: 'ur bloaz',
            yy: specialMutationForYears,
        },
        dayOfMonthOrdinalParse: /\d{1,2}(añ|vet)/,
        ordinal: function (number) {
            var output = number === 1 ? 'añ' : 'vet';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
        meridiemParse: /a.m.|g.m./, // goude merenn | a-raok merenn
        isPM: function (token) {
            return token === 'g.m.';
        },
        meridiem: function (hour, minute, isLower) {
            return hour < 12 ? 'a.m.' : 'g.m.';
        },
    });

    //! moment.js locale configuration

    function translate(number, withoutSuffix, key) {
        var result = number + ' ';
        switch (key) {
            case 'ss':
                if (number === 1) {
                    result += 'sekunda';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'sekunde';
                } else {
                    result += 'sekundi';
                }
                return result;
            case 'm':
                return withoutSuffix ? 'jedna minuta' : 'jedne minute';
            case 'mm':
                if (number === 1) {
                    result += 'minuta';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'minute';
                } else {
                    result += 'minuta';
                }
                return result;
            case 'h':
                return withoutSuffix ? 'jedan sat' : 'jednog sata';
            case 'hh':
                if (number === 1) {
                    result += 'sat';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'sata';
                } else {
                    result += 'sati';
                }
                return result;
            case 'dd':
                if (number === 1) {
                    result += 'dan';
                } else {
                    result += 'dana';
                }
                return result;
            case 'MM':
                if (number === 1) {
                    result += 'mjesec';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'mjeseca';
                } else {
                    result += 'mjeseci';
                }
                return result;
            case 'yy':
                if (number === 1) {
                    result += 'godina';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'godine';
                } else {
                    result += 'godina';
                }
                return result;
        }
    }

    hooks.defineLocale('bs', {
        months: 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split(
            '_'
        ),
        monthsShort:
            'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split(
            '_'
        ),
        weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
        weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY H:mm',
            LLLL: 'dddd, D. MMMM YYYY H:mm',
        },
        calendar: {
            sameDay: '[danas u] LT',
            nextDay: '[sutra u] LT',
            nextWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[u] [nedjelju] [u] LT';
                    case 3:
                        return '[u] [srijedu] [u] LT';
                    case 6:
                        return '[u] [subotu] [u] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[u] dddd [u] LT';
                }
            },
            lastDay: '[jučer u] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                    case 3:
                        return '[prošlu] dddd [u] LT';
                    case 6:
                        return '[prošle] [subote] [u] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[prošli] dddd [u] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'za %s',
            past: 'prije %s',
            s: 'par sekundi',
            ss: translate,
            m: translate,
            mm: translate,
            h: translate,
            hh: translate,
            d: 'dan',
            dd: translate,
            M: 'mjesec',
            MM: translate,
            y: 'godinu',
            yy: translate,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('ca', {
        months: {
            standalone:
                'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split(
                    '_'
                ),
            format: "de gener_de febrer_de març_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split(
                '_'
            ),
            isFormat: /D[oD]?(\s)+MMMM/,
        },
        monthsShort:
            'gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays:
            'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split(
                '_'
            ),
        weekdaysShort: 'dg._dl._dt._dc._dj._dv._ds.'.split('_'),
        weekdaysMin: 'dg_dl_dt_dc_dj_dv_ds'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM [de] YYYY',
            ll: 'D MMM YYYY',
            LLL: 'D MMMM [de] YYYY [a les] H:mm',
            lll: 'D MMM YYYY, H:mm',
            LLLL: 'dddd D MMMM [de] YYYY [a les] H:mm',
            llll: 'ddd D MMM YYYY, H:mm',
        },
        calendar: {
            sameDay: function () {
                return '[avui a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';
            },
            nextDay: function () {
                return '[demà a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';
            },
            nextWeek: function () {
                return 'dddd [a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';
            },
            lastDay: function () {
                return '[ahir a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';
            },
            lastWeek: function () {
                return (
                    '[el] dddd [passat a ' +
                    (this.hours() !== 1 ? 'les' : 'la') +
                    '] LT'
                );
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: "d'aquí %s",
            past: 'fa %s',
            s: 'uns segons',
            ss: '%d segons',
            m: 'un minut',
            mm: '%d minuts',
            h: 'una hora',
            hh: '%d hores',
            d: 'un dia',
            dd: '%d dies',
            M: 'un mes',
            MM: '%d mesos',
            y: 'un any',
            yy: '%d anys',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(r|n|t|è|a)/,
        ordinal: function (number, period) {
            var output =
                number === 1
                    ? 'r'
                    : number === 2
                    ? 'n'
                    : number === 3
                    ? 'r'
                    : number === 4
                    ? 't'
                    : 'è';
            if (period === 'w' || period === 'W') {
                output = 'a';
            }
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var months$4 = {
            format: 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split(
                '_'
            ),
            standalone:
                'ledna_února_března_dubna_května_června_července_srpna_září_října_listopadu_prosince'.split(
                    '_'
                ),
        },
        monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_'),
        monthsParse$1 = [
            /^led/i,
            /^úno/i,
            /^bře/i,
            /^dub/i,
            /^kvě/i,
            /^(čvn|červen$|června)/i,
            /^(čvc|červenec|července)/i,
            /^srp/i,
            /^zář/i,
            /^říj/i,
            /^lis/i,
            /^pro/i,
        ],
        // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched.
        // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'.
        monthsRegex$2 =
            /^(leden|únor|březen|duben|květen|červenec|července|červen|června|srpen|září|říjen|listopad|prosinec|led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i;

    function plural$1(n) {
        return n > 1 && n < 5 && ~~(n / 10) !== 1;
    }
    function translate$1(number, withoutSuffix, key, isFuture) {
        var result = number + ' ';
        switch (key) {
            case 's': // a few seconds / in a few seconds / a few seconds ago
                return withoutSuffix || isFuture ? 'pár sekund' : 'pár sekundami';
            case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago
                if (withoutSuffix || isFuture) {
                    return result + (plural$1(number) ? 'sekundy' : 'sekund');
                } else {
                    return result + 'sekundami';
                }
            case 'm': // a minute / in a minute / a minute ago
                return withoutSuffix ? 'minuta' : isFuture ? 'minutu' : 'minutou';
            case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
                if (withoutSuffix || isFuture) {
                    return result + (plural$1(number) ? 'minuty' : 'minut');
                } else {
                    return result + 'minutami';
                }
            case 'h': // an hour / in an hour / an hour ago
                return withoutSuffix ? 'hodina' : isFuture ? 'hodinu' : 'hodinou';
            case 'hh': // 9 hours / in 9 hours / 9 hours ago
                if (withoutSuffix || isFuture) {
                    return result + (plural$1(number) ? 'hodiny' : 'hodin');
                } else {
                    return result + 'hodinami';
                }
            case 'd': // a day / in a day / a day ago
                return withoutSuffix || isFuture ? 'den' : 'dnem';
            case 'dd': // 9 days / in 9 days / 9 days ago
                if (withoutSuffix || isFuture) {
                    return result + (plural$1(number) ? 'dny' : 'dní');
                } else {
                    return result + 'dny';
                }
            case 'M': // a month / in a month / a month ago
                return withoutSuffix || isFuture ? 'měsíc' : 'měsícem';
            case 'MM': // 9 months / in 9 months / 9 months ago
                if (withoutSuffix || isFuture) {
                    return result + (plural$1(number) ? 'měsíce' : 'měsíců');
                } else {
                    return result + 'měsíci';
                }
            case 'y': // a year / in a year / a year ago
                return withoutSuffix || isFuture ? 'rok' : 'rokem';
            case 'yy': // 9 years / in 9 years / 9 years ago
                if (withoutSuffix || isFuture) {
                    return result + (plural$1(number) ? 'roky' : 'let');
                } else {
                    return result + 'lety';
                }
        }
    }

    hooks.defineLocale('cs', {
        months: months$4,
        monthsShort: monthsShort,
        monthsRegex: monthsRegex$2,
        monthsShortRegex: monthsRegex$2,
        // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched.
        // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'.
        monthsStrictRegex:
            /^(leden|ledna|února|únor|březen|března|duben|dubna|květen|května|červenec|července|červen|června|srpen|srpna|září|říjen|října|listopadu|listopad|prosinec|prosince)/i,
        monthsShortStrictRegex:
            /^(led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i,
        monthsParse: monthsParse$1,
        longMonthsParse: monthsParse$1,
        shortMonthsParse: monthsParse$1,
        weekdays: 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'),
        weekdaysShort: 'ne_po_út_st_čt_pá_so'.split('_'),
        weekdaysMin: 'ne_po_út_st_čt_pá_so'.split('_'),
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY H:mm',
            LLLL: 'dddd D. MMMM YYYY H:mm',
            l: 'D. M. YYYY',
        },
        calendar: {
            sameDay: '[dnes v] LT',
            nextDay: '[zítra v] LT',
            nextWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[v neděli v] LT';
                    case 1:
                    case 2:
                        return '[v] dddd [v] LT';
                    case 3:
                        return '[ve středu v] LT';
                    case 4:
                        return '[ve čtvrtek v] LT';
                    case 5:
                        return '[v pátek v] LT';
                    case 6:
                        return '[v sobotu v] LT';
                }
            },
            lastDay: '[včera v] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[minulou neděli v] LT';
                    case 1:
                    case 2:
                        return '[minulé] dddd [v] LT';
                    case 3:
                        return '[minulou středu v] LT';
                    case 4:
                    case 5:
                        return '[minulý] dddd [v] LT';
                    case 6:
                        return '[minulou sobotu v] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'za %s',
            past: 'před %s',
            s: translate$1,
            ss: translate$1,
            m: translate$1,
            mm: translate$1,
            h: translate$1,
            hh: translate$1,
            d: translate$1,
            dd: translate$1,
            M: translate$1,
            MM: translate$1,
            y: translate$1,
            yy: translate$1,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('cv', {
        months: 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split(
            '_'
        ),
        monthsShort: 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'),
        weekdays:
            'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split(
                '_'
            ),
        weekdaysShort: 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'),
        weekdaysMin: 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD-MM-YYYY',
            LL: 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]',
            LLL: 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm',
            LLLL: 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm',
        },
        calendar: {
            sameDay: '[Паян] LT [сехетре]',
            nextDay: '[Ыран] LT [сехетре]',
            lastDay: '[Ӗнер] LT [сехетре]',
            nextWeek: '[Ҫитес] dddd LT [сехетре]',
            lastWeek: '[Иртнӗ] dddd LT [сехетре]',
            sameElse: 'L',
        },
        relativeTime: {
            future: function (output) {
                var affix = /сехет$/i.exec(output)
                    ? 'рен'
                    : /ҫул$/i.exec(output)
                    ? 'тан'
                    : 'ран';
                return output + affix;
            },
            past: '%s каялла',
            s: 'пӗр-ик ҫеккунт',
            ss: '%d ҫеккунт',
            m: 'пӗр минут',
            mm: '%d минут',
            h: 'пӗр сехет',
            hh: '%d сехет',
            d: 'пӗр кун',
            dd: '%d кун',
            M: 'пӗр уйӑх',
            MM: '%d уйӑх',
            y: 'пӗр ҫул',
            yy: '%d ҫул',
        },
        dayOfMonthOrdinalParse: /\d{1,2}-мӗш/,
        ordinal: '%d-мӗш',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('cy', {
        months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split(
            '_'
        ),
        monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split(
            '_'
        ),
        weekdays:
            'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split(
                '_'
            ),
        weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'),
        weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'),
        weekdaysParseExact: true,
        // time formats are the same as en-gb
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Heddiw am] LT',
            nextDay: '[Yfory am] LT',
            nextWeek: 'dddd [am] LT',
            lastDay: '[Ddoe am] LT',
            lastWeek: 'dddd [diwethaf am] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'mewn %s',
            past: '%s yn ôl',
            s: 'ychydig eiliadau',
            ss: '%d eiliad',
            m: 'munud',
            mm: '%d munud',
            h: 'awr',
            hh: '%d awr',
            d: 'diwrnod',
            dd: '%d diwrnod',
            M: 'mis',
            MM: '%d mis',
            y: 'blwyddyn',
            yy: '%d flynedd',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,
        // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh
        ordinal: function (number) {
            var b = number,
                output = '',
                lookup = [
                    '',
                    'af',
                    'il',
                    'ydd',
                    'ydd',
                    'ed',
                    'ed',
                    'ed',
                    'fed',
                    'fed',
                    'fed', // 1af to 10fed
                    'eg',
                    'fed',
                    'eg',
                    'eg',
                    'fed',
                    'eg',
                    'eg',
                    'fed',
                    'eg',
                    'fed', // 11eg to 20fed
                ];
            if (b > 20) {
                if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) {
                    output = 'fed'; // not 30ain, 70ain or 90ain
                } else {
                    output = 'ain';
                }
            } else if (b > 0) {
                output = lookup[b];
            }
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('da', {
        months: 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split(
            '_'
        ),
        monthsShort: 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
        weekdays: 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
        weekdaysShort: 'søn_man_tir_ons_tor_fre_lør'.split('_'),
        weekdaysMin: 'sø_ma_ti_on_to_fr_lø'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY HH:mm',
            LLLL: 'dddd [d.] D. MMMM YYYY [kl.] HH:mm',
        },
        calendar: {
            sameDay: '[i dag kl.] LT',
            nextDay: '[i morgen kl.] LT',
            nextWeek: 'på dddd [kl.] LT',
            lastDay: '[i går kl.] LT',
            lastWeek: '[i] dddd[s kl.] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'om %s',
            past: '%s siden',
            s: 'få sekunder',
            ss: '%d sekunder',
            m: 'et minut',
            mm: '%d minutter',
            h: 'en time',
            hh: '%d timer',
            d: 'en dag',
            dd: '%d dage',
            M: 'en måned',
            MM: '%d måneder',
            y: 'et år',
            yy: '%d år',
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function processRelativeTime(number, withoutSuffix, key, isFuture) {
        var format = {
            m: ['eine Minute', 'einer Minute'],
            h: ['eine Stunde', 'einer Stunde'],
            d: ['ein Tag', 'einem Tag'],
            dd: [number + ' Tage', number + ' Tagen'],
            w: ['eine Woche', 'einer Woche'],
            M: ['ein Monat', 'einem Monat'],
            MM: [number + ' Monate', number + ' Monaten'],
            y: ['ein Jahr', 'einem Jahr'],
            yy: [number + ' Jahre', number + ' Jahren'],
        };
        return withoutSuffix ? format[key][0] : format[key][1];
    }

    hooks.defineLocale('de-at', {
        months: 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split(
            '_'
        ),
        monthsShort:
            'Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),
        monthsParseExact: true,
        weekdays:
            'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split(
                '_'
            ),
        weekdaysShort: 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
        weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY HH:mm',
            LLLL: 'dddd, D. MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[heute um] LT [Uhr]',
            sameElse: 'L',
            nextDay: '[morgen um] LT [Uhr]',
            nextWeek: 'dddd [um] LT [Uhr]',
            lastDay: '[gestern um] LT [Uhr]',
            lastWeek: '[letzten] dddd [um] LT [Uhr]',
        },
        relativeTime: {
            future: 'in %s',
            past: 'vor %s',
            s: 'ein paar Sekunden',
            ss: '%d Sekunden',
            m: processRelativeTime,
            mm: '%d Minuten',
            h: processRelativeTime,
            hh: '%d Stunden',
            d: processRelativeTime,
            dd: processRelativeTime,
            w: processRelativeTime,
            ww: '%d Wochen',
            M: processRelativeTime,
            MM: processRelativeTime,
            y: processRelativeTime,
            yy: processRelativeTime,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function processRelativeTime$1(number, withoutSuffix, key, isFuture) {
        var format = {
            m: ['eine Minute', 'einer Minute'],
            h: ['eine Stunde', 'einer Stunde'],
            d: ['ein Tag', 'einem Tag'],
            dd: [number + ' Tage', number + ' Tagen'],
            w: ['eine Woche', 'einer Woche'],
            M: ['ein Monat', 'einem Monat'],
            MM: [number + ' Monate', number + ' Monaten'],
            y: ['ein Jahr', 'einem Jahr'],
            yy: [number + ' Jahre', number + ' Jahren'],
        };
        return withoutSuffix ? format[key][0] : format[key][1];
    }

    hooks.defineLocale('de-ch', {
        months: 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split(
            '_'
        ),
        monthsShort:
            'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),
        monthsParseExact: true,
        weekdays:
            'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split(
                '_'
            ),
        weekdaysShort: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
        weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY HH:mm',
            LLLL: 'dddd, D. MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[heute um] LT [Uhr]',
            sameElse: 'L',
            nextDay: '[morgen um] LT [Uhr]',
            nextWeek: 'dddd [um] LT [Uhr]',
            lastDay: '[gestern um] LT [Uhr]',
            lastWeek: '[letzten] dddd [um] LT [Uhr]',
        },
        relativeTime: {
            future: 'in %s',
            past: 'vor %s',
            s: 'ein paar Sekunden',
            ss: '%d Sekunden',
            m: processRelativeTime$1,
            mm: '%d Minuten',
            h: processRelativeTime$1,
            hh: '%d Stunden',
            d: processRelativeTime$1,
            dd: processRelativeTime$1,
            w: processRelativeTime$1,
            ww: '%d Wochen',
            M: processRelativeTime$1,
            MM: processRelativeTime$1,
            y: processRelativeTime$1,
            yy: processRelativeTime$1,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function processRelativeTime$2(number, withoutSuffix, key, isFuture) {
        var format = {
            m: ['eine Minute', 'einer Minute'],
            h: ['eine Stunde', 'einer Stunde'],
            d: ['ein Tag', 'einem Tag'],
            dd: [number + ' Tage', number + ' Tagen'],
            w: ['eine Woche', 'einer Woche'],
            M: ['ein Monat', 'einem Monat'],
            MM: [number + ' Monate', number + ' Monaten'],
            y: ['ein Jahr', 'einem Jahr'],
            yy: [number + ' Jahre', number + ' Jahren'],
        };
        return withoutSuffix ? format[key][0] : format[key][1];
    }

    hooks.defineLocale('de', {
        months: 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split(
            '_'
        ),
        monthsShort:
            'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),
        monthsParseExact: true,
        weekdays:
            'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split(
                '_'
            ),
        weekdaysShort: 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
        weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY HH:mm',
            LLLL: 'dddd, D. MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[heute um] LT [Uhr]',
            sameElse: 'L',
            nextDay: '[morgen um] LT [Uhr]',
            nextWeek: 'dddd [um] LT [Uhr]',
            lastDay: '[gestern um] LT [Uhr]',
            lastWeek: '[letzten] dddd [um] LT [Uhr]',
        },
        relativeTime: {
            future: 'in %s',
            past: 'vor %s',
            s: 'ein paar Sekunden',
            ss: '%d Sekunden',
            m: processRelativeTime$2,
            mm: '%d Minuten',
            h: processRelativeTime$2,
            hh: '%d Stunden',
            d: processRelativeTime$2,
            dd: processRelativeTime$2,
            w: processRelativeTime$2,
            ww: '%d Wochen',
            M: processRelativeTime$2,
            MM: processRelativeTime$2,
            y: processRelativeTime$2,
            yy: processRelativeTime$2,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var months$5 = [
            'ޖެނުއަރީ',
            'ފެބްރުއަރީ',
            'މާރިޗު',
            'އޭޕްރީލު',
            'މޭ',
            'ޖޫން',
            'ޖުލައި',
            'އޯގަސްޓު',
            'ސެޕްޓެމްބަރު',
            'އޮކްޓޯބަރު',
            'ނޮވެމްބަރު',
            'ޑިސެމްބަރު',
        ],
        weekdays = [
            'އާދިއްތަ',
            'ހޯމަ',
            'އަންގާރަ',
            'ބުދަ',
            'ބުރާސްފަތި',
            'ހުކުރު',
            'ހޮނިހިރު',
        ];

    hooks.defineLocale('dv', {
        months: months$5,
        monthsShort: months$5,
        weekdays: weekdays,
        weekdaysShort: weekdays,
        weekdaysMin: 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'D/M/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        meridiemParse: /މކ|މފ/,
        isPM: function (input) {
            return 'މފ' === input;
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'މކ';
            } else {
                return 'މފ';
            }
        },
        calendar: {
            sameDay: '[މިއަދު] LT',
            nextDay: '[މާދަމާ] LT',
            nextWeek: 'dddd LT',
            lastDay: '[އިއްޔެ] LT',
            lastWeek: '[ފާއިތުވި] dddd LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'ތެރޭގައި %s',
            past: 'ކުރިން %s',
            s: 'ސިކުންތުކޮޅެއް',
            ss: 'd% ސިކުންތު',
            m: 'މިނިޓެއް',
            mm: 'މިނިޓު %d',
            h: 'ގަޑިއިރެއް',
            hh: 'ގަޑިއިރު %d',
            d: 'ދުވަހެއް',
            dd: 'ދުވަސް %d',
            M: 'މަހެއް',
            MM: 'މަސް %d',
            y: 'އަހަރެއް',
            yy: 'އަހަރު %d',
        },
        preparse: function (string) {
            return string.replace(/،/g, ',');
        },
        postformat: function (string) {
            return string.replace(/,/g, '،');
        },
        week: {
            dow: 7, // Sunday is the first day of the week.
            doy: 12, // The week that contains Jan 12th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function isFunction$1(input) {
        return (
            (typeof Function !== 'undefined' && input instanceof Function) ||
            Object.prototype.toString.call(input) === '[object Function]'
        );
    }

    hooks.defineLocale('el', {
        monthsNominativeEl:
            'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split(
                '_'
            ),
        monthsGenitiveEl:
            'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split(
                '_'
            ),
        months: function (momentToFormat, format) {
            if (!momentToFormat) {
                return this._monthsNominativeEl;
            } else if (
                typeof format === 'string' &&
                /D/.test(format.substring(0, format.indexOf('MMMM')))
            ) {
                // if there is a day number before 'MMMM'
                return this._monthsGenitiveEl[momentToFormat.month()];
            } else {
                return this._monthsNominativeEl[momentToFormat.month()];
            }
        },
        monthsShort: 'Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ'.split('_'),
        weekdays: 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split(
            '_'
        ),
        weekdaysShort: 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'),
        weekdaysMin: 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'),
        meridiem: function (hours, minutes, isLower) {
            if (hours > 11) {
                return isLower ? 'μμ' : 'ΜΜ';
            } else {
                return isLower ? 'πμ' : 'ΠΜ';
            }
        },
        isPM: function (input) {
            return (input + '').toLowerCase()[0] === 'μ';
        },
        meridiemParse: /[ΠΜ]\.?Μ?\.?/i,
        longDateFormat: {
            LT: 'h:mm A',
            LTS: 'h:mm:ss A',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY h:mm A',
            LLLL: 'dddd, D MMMM YYYY h:mm A',
        },
        calendarEl: {
            sameDay: '[Σήμερα {}] LT',
            nextDay: '[Αύριο {}] LT',
            nextWeek: 'dddd [{}] LT',
            lastDay: '[Χθες {}] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 6:
                        return '[το προηγούμενο] dddd [{}] LT';
                    default:
                        return '[την προηγούμενη] dddd [{}] LT';
                }
            },
            sameElse: 'L',
        },
        calendar: function (key, mom) {
            var output = this._calendarEl[key],
                hours = mom && mom.hours();
            if (isFunction$1(output)) {
                output = output.apply(mom);
            }
            return output.replace('{}', hours % 12 === 1 ? 'στη' : 'στις');
        },
        relativeTime: {
            future: 'σε %s',
            past: '%s πριν',
            s: 'λίγα δευτερόλεπτα',
            ss: '%d δευτερόλεπτα',
            m: 'ένα λεπτό',
            mm: '%d λεπτά',
            h: 'μία ώρα',
            hh: '%d ώρες',
            d: 'μία μέρα',
            dd: '%d μέρες',
            M: 'ένας μήνας',
            MM: '%d μήνες',
            y: 'ένας χρόνος',
            yy: '%d χρόνια',
        },
        dayOfMonthOrdinalParse: /\d{1,2}η/,
        ordinal: '%dη',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4st is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('en-au', {
        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
            '_'
        ),
        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
        longDateFormat: {
            LT: 'h:mm A',
            LTS: 'h:mm:ss A',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY h:mm A',
            LLLL: 'dddd, D MMMM YYYY h:mm A',
        },
        calendar: {
            sameDay: '[Today at] LT',
            nextDay: '[Tomorrow at] LT',
            nextWeek: 'dddd [at] LT',
            lastDay: '[Yesterday at] LT',
            lastWeek: '[Last] dddd [at] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'in %s',
            past: '%s ago',
            s: 'a few seconds',
            ss: '%d seconds',
            m: 'a minute',
            mm: '%d minutes',
            h: 'an hour',
            hh: '%d hours',
            d: 'a day',
            dd: '%d days',
            M: 'a month',
            MM: '%d months',
            y: 'a year',
            yy: '%d years',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('en-ca', {
        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
            '_'
        ),
        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
        longDateFormat: {
            LT: 'h:mm A',
            LTS: 'h:mm:ss A',
            L: 'YYYY-MM-DD',
            LL: 'MMMM D, YYYY',
            LLL: 'MMMM D, YYYY h:mm A',
            LLLL: 'dddd, MMMM D, YYYY h:mm A',
        },
        calendar: {
            sameDay: '[Today at] LT',
            nextDay: '[Tomorrow at] LT',
            nextWeek: 'dddd [at] LT',
            lastDay: '[Yesterday at] LT',
            lastWeek: '[Last] dddd [at] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'in %s',
            past: '%s ago',
            s: 'a few seconds',
            ss: '%d seconds',
            m: 'a minute',
            mm: '%d minutes',
            h: 'an hour',
            hh: '%d hours',
            d: 'a day',
            dd: '%d days',
            M: 'a month',
            MM: '%d months',
            y: 'a year',
            yy: '%d years',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('en-gb', {
        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
            '_'
        ),
        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Today at] LT',
            nextDay: '[Tomorrow at] LT',
            nextWeek: 'dddd [at] LT',
            lastDay: '[Yesterday at] LT',
            lastWeek: '[Last] dddd [at] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'in %s',
            past: '%s ago',
            s: 'a few seconds',
            ss: '%d seconds',
            m: 'a minute',
            mm: '%d minutes',
            h: 'an hour',
            hh: '%d hours',
            d: 'a day',
            dd: '%d days',
            M: 'a month',
            MM: '%d months',
            y: 'a year',
            yy: '%d years',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('en-ie', {
        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
            '_'
        ),
        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Today at] LT',
            nextDay: '[Tomorrow at] LT',
            nextWeek: 'dddd [at] LT',
            lastDay: '[Yesterday at] LT',
            lastWeek: '[Last] dddd [at] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'in %s',
            past: '%s ago',
            s: 'a few seconds',
            ss: '%d seconds',
            m: 'a minute',
            mm: '%d minutes',
            h: 'an hour',
            hh: '%d hours',
            d: 'a day',
            dd: '%d days',
            M: 'a month',
            MM: '%d months',
            y: 'a year',
            yy: '%d years',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('en-il', {
        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
            '_'
        ),
        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Today at] LT',
            nextDay: '[Tomorrow at] LT',
            nextWeek: 'dddd [at] LT',
            lastDay: '[Yesterday at] LT',
            lastWeek: '[Last] dddd [at] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'in %s',
            past: '%s ago',
            s: 'a few seconds',
            ss: '%d seconds',
            m: 'a minute',
            mm: '%d minutes',
            h: 'an hour',
            hh: '%d hours',
            d: 'a day',
            dd: '%d days',
            M: 'a month',
            MM: '%d months',
            y: 'a year',
            yy: '%d years',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('en-in', {
        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
            '_'
        ),
        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
        longDateFormat: {
            LT: 'h:mm A',
            LTS: 'h:mm:ss A',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY h:mm A',
            LLLL: 'dddd, D MMMM YYYY h:mm A',
        },
        calendar: {
            sameDay: '[Today at] LT',
            nextDay: '[Tomorrow at] LT',
            nextWeek: 'dddd [at] LT',
            lastDay: '[Yesterday at] LT',
            lastWeek: '[Last] dddd [at] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'in %s',
            past: '%s ago',
            s: 'a few seconds',
            ss: '%d seconds',
            m: 'a minute',
            mm: '%d minutes',
            h: 'an hour',
            hh: '%d hours',
            d: 'a day',
            dd: '%d days',
            M: 'a month',
            MM: '%d months',
            y: 'a year',
            yy: '%d years',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 1st is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('en-nz', {
        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
            '_'
        ),
        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
        longDateFormat: {
            LT: 'h:mm A',
            LTS: 'h:mm:ss A',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY h:mm A',
            LLLL: 'dddd, D MMMM YYYY h:mm A',
        },
        calendar: {
            sameDay: '[Today at] LT',
            nextDay: '[Tomorrow at] LT',
            nextWeek: 'dddd [at] LT',
            lastDay: '[Yesterday at] LT',
            lastWeek: '[Last] dddd [at] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'in %s',
            past: '%s ago',
            s: 'a few seconds',
            ss: '%d seconds',
            m: 'a minute',
            mm: '%d minutes',
            h: 'an hour',
            hh: '%d hours',
            d: 'a day',
            dd: '%d days',
            M: 'a month',
            MM: '%d months',
            y: 'a year',
            yy: '%d years',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('en-sg', {
        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
            '_'
        ),
        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Today at] LT',
            nextDay: '[Tomorrow at] LT',
            nextWeek: 'dddd [at] LT',
            lastDay: '[Yesterday at] LT',
            lastWeek: '[Last] dddd [at] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'in %s',
            past: '%s ago',
            s: 'a few seconds',
            ss: '%d seconds',
            m: 'a minute',
            mm: '%d minutes',
            h: 'an hour',
            hh: '%d hours',
            d: 'a day',
            dd: '%d days',
            M: 'a month',
            MM: '%d months',
            y: 'a year',
            yy: '%d years',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('eo', {
        months: 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split(
            '_'
        ),
        monthsShort: 'jan_feb_mart_apr_maj_jun_jul_aŭg_sept_okt_nov_dec'.split('_'),
        weekdays: 'dimanĉo_lundo_mardo_merkredo_ĵaŭdo_vendredo_sabato'.split('_'),
        weekdaysShort: 'dim_lun_mard_merk_ĵaŭ_ven_sab'.split('_'),
        weekdaysMin: 'di_lu_ma_me_ĵa_ve_sa'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY-MM-DD',
            LL: '[la] D[-an de] MMMM, YYYY',
            LLL: '[la] D[-an de] MMMM, YYYY HH:mm',
            LLLL: 'dddd[n], [la] D[-an de] MMMM, YYYY HH:mm',
            llll: 'ddd, [la] D[-an de] MMM, YYYY HH:mm',
        },
        meridiemParse: /[ap]\.t\.m/i,
        isPM: function (input) {
            return input.charAt(0).toLowerCase() === 'p';
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours > 11) {
                return isLower ? 'p.t.m.' : 'P.T.M.';
            } else {
                return isLower ? 'a.t.m.' : 'A.T.M.';
            }
        },
        calendar: {
            sameDay: '[Hodiaŭ je] LT',
            nextDay: '[Morgaŭ je] LT',
            nextWeek: 'dddd[n je] LT',
            lastDay: '[Hieraŭ je] LT',
            lastWeek: '[pasintan] dddd[n je] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'post %s',
            past: 'antaŭ %s',
            s: 'kelkaj sekundoj',
            ss: '%d sekundoj',
            m: 'unu minuto',
            mm: '%d minutoj',
            h: 'unu horo',
            hh: '%d horoj',
            d: 'unu tago', //ne 'diurno', ĉar estas uzita por proksimumo
            dd: '%d tagoj',
            M: 'unu monato',
            MM: '%d monatoj',
            y: 'unu jaro',
            yy: '%d jaroj',
        },
        dayOfMonthOrdinalParse: /\d{1,2}a/,
        ordinal: '%da',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var monthsShortDot =
            'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(
                '_'
            ),
        monthsShort$1 = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
        monthsParse$2 = [
            /^ene/i,
            /^feb/i,
            /^mar/i,
            /^abr/i,
            /^may/i,
            /^jun/i,
            /^jul/i,
            /^ago/i,
            /^sep/i,
            /^oct/i,
            /^nov/i,
            /^dic/i,
        ],
        monthsRegex$3 =
            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;

    hooks.defineLocale('es-do', {
        months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(
            '_'
        ),
        monthsShort: function (m, format) {
            if (!m) {
                return monthsShortDot;
            } else if (/-MMM-/.test(format)) {
                return monthsShort$1[m.month()];
            } else {
                return monthsShortDot[m.month()];
            }
        },
        monthsRegex: monthsRegex$3,
        monthsShortRegex: monthsRegex$3,
        monthsStrictRegex:
            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,
        monthsShortStrictRegex:
            /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,
        monthsParse: monthsParse$2,
        longMonthsParse: monthsParse$2,
        shortMonthsParse: monthsParse$2,
        weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
        weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
        weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'h:mm A',
            LTS: 'h:mm:ss A',
            L: 'DD/MM/YYYY',
            LL: 'D [de] MMMM [de] YYYY',
            LLL: 'D [de] MMMM [de] YYYY h:mm A',
            LLLL: 'dddd, D [de] MMMM [de] YYYY h:mm A',
        },
        calendar: {
            sameDay: function () {
                return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            nextDay: function () {
                return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            nextWeek: function () {
                return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            lastDay: function () {
                return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            lastWeek: function () {
                return (
                    '[el] dddd [pasado a la' +
                    (this.hours() !== 1 ? 's' : '') +
                    '] LT'
                );
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'en %s',
            past: 'hace %s',
            s: 'unos segundos',
            ss: '%d segundos',
            m: 'un minuto',
            mm: '%d minutos',
            h: 'una hora',
            hh: '%d horas',
            d: 'un día',
            dd: '%d días',
            w: 'una semana',
            ww: '%d semanas',
            M: 'un mes',
            MM: '%d meses',
            y: 'un año',
            yy: '%d años',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var monthsShortDot$1 =
            'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(
                '_'
            ),
        monthsShort$2 = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
        monthsParse$3 = [
            /^ene/i,
            /^feb/i,
            /^mar/i,
            /^abr/i,
            /^may/i,
            /^jun/i,
            /^jul/i,
            /^ago/i,
            /^sep/i,
            /^oct/i,
            /^nov/i,
            /^dic/i,
        ],
        monthsRegex$4 =
            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;

    hooks.defineLocale('es-mx', {
        months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(
            '_'
        ),
        monthsShort: function (m, format) {
            if (!m) {
                return monthsShortDot$1;
            } else if (/-MMM-/.test(format)) {
                return monthsShort$2[m.month()];
            } else {
                return monthsShortDot$1[m.month()];
            }
        },
        monthsRegex: monthsRegex$4,
        monthsShortRegex: monthsRegex$4,
        monthsStrictRegex:
            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,
        monthsShortStrictRegex:
            /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,
        monthsParse: monthsParse$3,
        longMonthsParse: monthsParse$3,
        shortMonthsParse: monthsParse$3,
        weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
        weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
        weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D [de] MMMM [de] YYYY',
            LLL: 'D [de] MMMM [de] YYYY H:mm',
            LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm',
        },
        calendar: {
            sameDay: function () {
                return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            nextDay: function () {
                return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            nextWeek: function () {
                return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            lastDay: function () {
                return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            lastWeek: function () {
                return (
                    '[el] dddd [pasado a la' +
                    (this.hours() !== 1 ? 's' : '') +
                    '] LT'
                );
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'en %s',
            past: 'hace %s',
            s: 'unos segundos',
            ss: '%d segundos',
            m: 'un minuto',
            mm: '%d minutos',
            h: 'una hora',
            hh: '%d horas',
            d: 'un día',
            dd: '%d días',
            w: 'una semana',
            ww: '%d semanas',
            M: 'un mes',
            MM: '%d meses',
            y: 'un año',
            yy: '%d años',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
        invalidDate: 'Fecha inválida',
    });

    //! moment.js locale configuration

    var monthsShortDot$2 =
            'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(
                '_'
            ),
        monthsShort$3 = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
        monthsParse$4 = [
            /^ene/i,
            /^feb/i,
            /^mar/i,
            /^abr/i,
            /^may/i,
            /^jun/i,
            /^jul/i,
            /^ago/i,
            /^sep/i,
            /^oct/i,
            /^nov/i,
            /^dic/i,
        ],
        monthsRegex$5 =
            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;

    hooks.defineLocale('es-us', {
        months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(
            '_'
        ),
        monthsShort: function (m, format) {
            if (!m) {
                return monthsShortDot$2;
            } else if (/-MMM-/.test(format)) {
                return monthsShort$3[m.month()];
            } else {
                return monthsShortDot$2[m.month()];
            }
        },
        monthsRegex: monthsRegex$5,
        monthsShortRegex: monthsRegex$5,
        monthsStrictRegex:
            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,
        monthsShortStrictRegex:
            /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,
        monthsParse: monthsParse$4,
        longMonthsParse: monthsParse$4,
        shortMonthsParse: monthsParse$4,
        weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
        weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
        weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'h:mm A',
            LTS: 'h:mm:ss A',
            L: 'MM/DD/YYYY',
            LL: 'D [de] MMMM [de] YYYY',
            LLL: 'D [de] MMMM [de] YYYY h:mm A',
            LLLL: 'dddd, D [de] MMMM [de] YYYY h:mm A',
        },
        calendar: {
            sameDay: function () {
                return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            nextDay: function () {
                return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            nextWeek: function () {
                return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            lastDay: function () {
                return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            lastWeek: function () {
                return (
                    '[el] dddd [pasado a la' +
                    (this.hours() !== 1 ? 's' : '') +
                    '] LT'
                );
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'en %s',
            past: 'hace %s',
            s: 'unos segundos',
            ss: '%d segundos',
            m: 'un minuto',
            mm: '%d minutos',
            h: 'una hora',
            hh: '%d horas',
            d: 'un día',
            dd: '%d días',
            w: 'una semana',
            ww: '%d semanas',
            M: 'un mes',
            MM: '%d meses',
            y: 'un año',
            yy: '%d años',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var monthsShortDot$3 =
            'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(
                '_'
            ),
        monthsShort$4 = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
        monthsParse$5 = [
            /^ene/i,
            /^feb/i,
            /^mar/i,
            /^abr/i,
            /^may/i,
            /^jun/i,
            /^jul/i,
            /^ago/i,
            /^sep/i,
            /^oct/i,
            /^nov/i,
            /^dic/i,
        ],
        monthsRegex$6 =
            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;

    hooks.defineLocale('es', {
        months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(
            '_'
        ),
        monthsShort: function (m, format) {
            if (!m) {
                return monthsShortDot$3;
            } else if (/-MMM-/.test(format)) {
                return monthsShort$4[m.month()];
            } else {
                return monthsShortDot$3[m.month()];
            }
        },
        monthsRegex: monthsRegex$6,
        monthsShortRegex: monthsRegex$6,
        monthsStrictRegex:
            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,
        monthsShortStrictRegex:
            /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,
        monthsParse: monthsParse$5,
        longMonthsParse: monthsParse$5,
        shortMonthsParse: monthsParse$5,
        weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
        weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
        weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D [de] MMMM [de] YYYY',
            LLL: 'D [de] MMMM [de] YYYY H:mm',
            LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm',
        },
        calendar: {
            sameDay: function () {
                return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            nextDay: function () {
                return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            nextWeek: function () {
                return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            lastDay: function () {
                return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            lastWeek: function () {
                return (
                    '[el] dddd [pasado a la' +
                    (this.hours() !== 1 ? 's' : '') +
                    '] LT'
                );
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'en %s',
            past: 'hace %s',
            s: 'unos segundos',
            ss: '%d segundos',
            m: 'un minuto',
            mm: '%d minutos',
            h: 'una hora',
            hh: '%d horas',
            d: 'un día',
            dd: '%d días',
            w: 'una semana',
            ww: '%d semanas',
            M: 'un mes',
            MM: '%d meses',
            y: 'un año',
            yy: '%d años',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
        invalidDate: 'Fecha inválida',
    });

    //! moment.js locale configuration

    function processRelativeTime$3(number, withoutSuffix, key, isFuture) {
        var format = {
            s: ['mõne sekundi', 'mõni sekund', 'paar sekundit'],
            ss: [number + 'sekundi', number + 'sekundit'],
            m: ['ühe minuti', 'üks minut'],
            mm: [number + ' minuti', number + ' minutit'],
            h: ['ühe tunni', 'tund aega', 'üks tund'],
            hh: [number + ' tunni', number + ' tundi'],
            d: ['ühe päeva', 'üks päev'],
            M: ['kuu aja', 'kuu aega', 'üks kuu'],
            MM: [number + ' kuu', number + ' kuud'],
            y: ['ühe aasta', 'aasta', 'üks aasta'],
            yy: [number + ' aasta', number + ' aastat'],
        };
        if (withoutSuffix) {
            return format[key][2] ? format[key][2] : format[key][1];
        }
        return isFuture ? format[key][0] : format[key][1];
    }

    hooks.defineLocale('et', {
        months: 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split(
            '_'
        ),
        monthsShort:
            'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'),
        weekdays:
            'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split(
                '_'
            ),
        weekdaysShort: 'P_E_T_K_N_R_L'.split('_'),
        weekdaysMin: 'P_E_T_K_N_R_L'.split('_'),
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY H:mm',
            LLLL: 'dddd, D. MMMM YYYY H:mm',
        },
        calendar: {
            sameDay: '[Täna,] LT',
            nextDay: '[Homme,] LT',
            nextWeek: '[Järgmine] dddd LT',
            lastDay: '[Eile,] LT',
            lastWeek: '[Eelmine] dddd LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s pärast',
            past: '%s tagasi',
            s: processRelativeTime$3,
            ss: processRelativeTime$3,
            m: processRelativeTime$3,
            mm: processRelativeTime$3,
            h: processRelativeTime$3,
            hh: processRelativeTime$3,
            d: processRelativeTime$3,
            dd: '%d päeva',
            M: processRelativeTime$3,
            MM: processRelativeTime$3,
            y: processRelativeTime$3,
            yy: processRelativeTime$3,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('eu', {
        months: 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split(
            '_'
        ),
        monthsShort:
            'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays:
            'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split(
                '_'
            ),
        weekdaysShort: 'ig._al._ar._az._og._ol._lr.'.split('_'),
        weekdaysMin: 'ig_al_ar_az_og_ol_lr'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY-MM-DD',
            LL: 'YYYY[ko] MMMM[ren] D[a]',
            LLL: 'YYYY[ko] MMMM[ren] D[a] HH:mm',
            LLLL: 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm',
            l: 'YYYY-M-D',
            ll: 'YYYY[ko] MMM D[a]',
            lll: 'YYYY[ko] MMM D[a] HH:mm',
            llll: 'ddd, YYYY[ko] MMM D[a] HH:mm',
        },
        calendar: {
            sameDay: '[gaur] LT[etan]',
            nextDay: '[bihar] LT[etan]',
            nextWeek: 'dddd LT[etan]',
            lastDay: '[atzo] LT[etan]',
            lastWeek: '[aurreko] dddd LT[etan]',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s barru',
            past: 'duela %s',
            s: 'segundo batzuk',
            ss: '%d segundo',
            m: 'minutu bat',
            mm: '%d minutu',
            h: 'ordu bat',
            hh: '%d ordu',
            d: 'egun bat',
            dd: '%d egun',
            M: 'hilabete bat',
            MM: '%d hilabete',
            y: 'urte bat',
            yy: '%d urte',
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var symbolMap$6 = {
            1: '۱',
            2: '۲',
            3: '۳',
            4: '۴',
            5: '۵',
            6: '۶',
            7: '۷',
            8: '۸',
            9: '۹',
            0: '۰',
        },
        numberMap$5 = {
            '۱': '1',
            '۲': '2',
            '۳': '3',
            '۴': '4',
            '۵': '5',
            '۶': '6',
            '۷': '7',
            '۸': '8',
            '۹': '9',
            '۰': '0',
        };

    hooks.defineLocale('fa', {
        months: 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split(
            '_'
        ),
        monthsShort:
            'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split(
                '_'
            ),
        weekdays:
            'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split(
                '_'
            ),
        weekdaysShort:
            'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split(
                '_'
            ),
        weekdaysMin: 'ی_د_س_چ_پ_ج_ش'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        meridiemParse: /قبل از ظهر|بعد از ظهر/,
        isPM: function (input) {
            return /بعد از ظهر/.test(input);
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'قبل از ظهر';
            } else {
                return 'بعد از ظهر';
            }
        },
        calendar: {
            sameDay: '[امروز ساعت] LT',
            nextDay: '[فردا ساعت] LT',
            nextWeek: 'dddd [ساعت] LT',
            lastDay: '[دیروز ساعت] LT',
            lastWeek: 'dddd [پیش] [ساعت] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'در %s',
            past: '%s پیش',
            s: 'چند ثانیه',
            ss: '%d ثانیه',
            m: 'یک دقیقه',
            mm: '%d دقیقه',
            h: 'یک ساعت',
            hh: '%d ساعت',
            d: 'یک روز',
            dd: '%d روز',
            M: 'یک ماه',
            MM: '%d ماه',
            y: 'یک سال',
            yy: '%d سال',
        },
        preparse: function (string) {
            return string
                .replace(/[۰-۹]/g, function (match) {
                    return numberMap$5[match];
                })
                .replace(/،/g, ',');
        },
        postformat: function (string) {
            return string
                .replace(/\d/g, function (match) {
                    return symbolMap$6[match];
                })
                .replace(/,/g, '،');
        },
        dayOfMonthOrdinalParse: /\d{1,2}م/,
        ordinal: '%dم',
        week: {
            dow: 6, // Saturday is the first day of the week.
            doy: 12, // The week that contains Jan 12th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var numbersPast =
            'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(
                ' '
            ),
        numbersFuture = [
            'nolla',
            'yhden',
            'kahden',
            'kolmen',
            'neljän',
            'viiden',
            'kuuden',
            numbersPast[7],
            numbersPast[8],
            numbersPast[9],
        ];
    function translate$2(number, withoutSuffix, key, isFuture) {
        var result = '';
        switch (key) {
            case 's':
                return isFuture ? 'muutaman sekunnin' : 'muutama sekunti';
            case 'ss':
                result = isFuture ? 'sekunnin' : 'sekuntia';
                break;
            case 'm':
                return isFuture ? 'minuutin' : 'minuutti';
            case 'mm':
                result = isFuture ? 'minuutin' : 'minuuttia';
                break;
            case 'h':
                return isFuture ? 'tunnin' : 'tunti';
            case 'hh':
                result = isFuture ? 'tunnin' : 'tuntia';
                break;
            case 'd':
                return isFuture ? 'päivän' : 'päivä';
            case 'dd':
                result = isFuture ? 'päivän' : 'päivää';
                break;
            case 'M':
                return isFuture ? 'kuukauden' : 'kuukausi';
            case 'MM':
                result = isFuture ? 'kuukauden' : 'kuukautta';
                break;
            case 'y':
                return isFuture ? 'vuoden' : 'vuosi';
            case 'yy':
                result = isFuture ? 'vuoden' : 'vuotta';
                break;
        }
        result = verbalNumber(number, isFuture) + ' ' + result;
        return result;
    }
    function verbalNumber(number, isFuture) {
        return number < 10
            ? isFuture
                ? numbersFuture[number]
                : numbersPast[number]
            : number;
    }

    hooks.defineLocale('fi', {
        months: 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split(
            '_'
        ),
        monthsShort:
            'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split(
                '_'
            ),
        weekdays:
            'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split(
                '_'
            ),
        weekdaysShort: 'su_ma_ti_ke_to_pe_la'.split('_'),
        weekdaysMin: 'su_ma_ti_ke_to_pe_la'.split('_'),
        longDateFormat: {
            LT: 'HH.mm',
            LTS: 'HH.mm.ss',
            L: 'DD.MM.YYYY',
            LL: 'Do MMMM[ta] YYYY',
            LLL: 'Do MMMM[ta] YYYY, [klo] HH.mm',
            LLLL: 'dddd, Do MMMM[ta] YYYY, [klo] HH.mm',
            l: 'D.M.YYYY',
            ll: 'Do MMM YYYY',
            lll: 'Do MMM YYYY, [klo] HH.mm',
            llll: 'ddd, Do MMM YYYY, [klo] HH.mm',
        },
        calendar: {
            sameDay: '[tänään] [klo] LT',
            nextDay: '[huomenna] [klo] LT',
            nextWeek: 'dddd [klo] LT',
            lastDay: '[eilen] [klo] LT',
            lastWeek: '[viime] dddd[na] [klo] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s päästä',
            past: '%s sitten',
            s: translate$2,
            ss: translate$2,
            m: translate$2,
            mm: translate$2,
            h: translate$2,
            hh: translate$2,
            d: translate$2,
            dd: translate$2,
            M: translate$2,
            MM: translate$2,
            y: translate$2,
            yy: translate$2,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('fil', {
        months: 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split(
            '_'
        ),
        monthsShort: 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),
        weekdays: 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split(
            '_'
        ),
        weekdaysShort: 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'),
        weekdaysMin: 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'MM/D/YYYY',
            LL: 'MMMM D, YYYY',
            LLL: 'MMMM D, YYYY HH:mm',
            LLLL: 'dddd, MMMM DD, YYYY HH:mm',
        },
        calendar: {
            sameDay: 'LT [ngayong araw]',
            nextDay: '[Bukas ng] LT',
            nextWeek: 'LT [sa susunod na] dddd',
            lastDay: 'LT [kahapon]',
            lastWeek: 'LT [noong nakaraang] dddd',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'sa loob ng %s',
            past: '%s ang nakalipas',
            s: 'ilang segundo',
            ss: '%d segundo',
            m: 'isang minuto',
            mm: '%d minuto',
            h: 'isang oras',
            hh: '%d oras',
            d: 'isang araw',
            dd: '%d araw',
            M: 'isang buwan',
            MM: '%d buwan',
            y: 'isang taon',
            yy: '%d taon',
        },
        dayOfMonthOrdinalParse: /\d{1,2}/,
        ordinal: function (number) {
            return number;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('fo', {
        months: 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split(
            '_'
        ),
        monthsShort: 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
        weekdays:
            'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split(
                '_'
            ),
        weekdaysShort: 'sun_mán_týs_mik_hós_frí_ley'.split('_'),
        weekdaysMin: 'su_má_tý_mi_hó_fr_le'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D. MMMM, YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Í dag kl.] LT',
            nextDay: '[Í morgin kl.] LT',
            nextWeek: 'dddd [kl.] LT',
            lastDay: '[Í gjár kl.] LT',
            lastWeek: '[síðstu] dddd [kl] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'um %s',
            past: '%s síðani',
            s: 'fá sekund',
            ss: '%d sekundir',
            m: 'ein minuttur',
            mm: '%d minuttir',
            h: 'ein tími',
            hh: '%d tímar',
            d: 'ein dagur',
            dd: '%d dagar',
            M: 'ein mánaður',
            MM: '%d mánaðir',
            y: 'eitt ár',
            yy: '%d ár',
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('fr-ca', {
        months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split(
            '_'
        ),
        monthsShort:
            'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
        weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
        weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY-MM-DD',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Aujourd’hui à] LT',
            nextDay: '[Demain à] LT',
            nextWeek: 'dddd [à] LT',
            lastDay: '[Hier à] LT',
            lastWeek: 'dddd [dernier à] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'dans %s',
            past: 'il y a %s',
            s: 'quelques secondes',
            ss: '%d secondes',
            m: 'une minute',
            mm: '%d minutes',
            h: 'une heure',
            hh: '%d heures',
            d: 'un jour',
            dd: '%d jours',
            M: 'un mois',
            MM: '%d mois',
            y: 'un an',
            yy: '%d ans',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(er|e)/,
        ordinal: function (number, period) {
            switch (period) {
                // Words with masculine grammatical gender: mois, trimestre, jour
                default:
                case 'M':
                case 'Q':
                case 'D':
                case 'DDD':
                case 'd':
                    return number + (number === 1 ? 'er' : 'e');

                // Words with feminine grammatical gender: semaine
                case 'w':
                case 'W':
                    return number + (number === 1 ? 're' : 'e');
            }
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('fr-ch', {
        months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split(
            '_'
        ),
        monthsShort:
            'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
        weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
        weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Aujourd’hui à] LT',
            nextDay: '[Demain à] LT',
            nextWeek: 'dddd [à] LT',
            lastDay: '[Hier à] LT',
            lastWeek: 'dddd [dernier à] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'dans %s',
            past: 'il y a %s',
            s: 'quelques secondes',
            ss: '%d secondes',
            m: 'une minute',
            mm: '%d minutes',
            h: 'une heure',
            hh: '%d heures',
            d: 'un jour',
            dd: '%d jours',
            M: 'un mois',
            MM: '%d mois',
            y: 'un an',
            yy: '%d ans',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(er|e)/,
        ordinal: function (number, period) {
            switch (period) {
                // Words with masculine grammatical gender: mois, trimestre, jour
                default:
                case 'M':
                case 'Q':
                case 'D':
                case 'DDD':
                case 'd':
                    return number + (number === 1 ? 'er' : 'e');

                // Words with feminine grammatical gender: semaine
                case 'w':
                case 'W':
                    return number + (number === 1 ? 're' : 'e');
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var monthsStrictRegex$1 =
            /^(janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i,
        monthsShortStrictRegex$1 =
            /(janv\.?|févr\.?|mars|avr\.?|mai|juin|juil\.?|août|sept\.?|oct\.?|nov\.?|déc\.?)/i,
        monthsRegex$7 =
            /(janv\.?|févr\.?|mars|avr\.?|mai|juin|juil\.?|août|sept\.?|oct\.?|nov\.?|déc\.?|janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i,
        monthsParse$6 = [
            /^janv/i,
            /^févr/i,
            /^mars/i,
            /^avr/i,
            /^mai/i,
            /^juin/i,
            /^juil/i,
            /^août/i,
            /^sept/i,
            /^oct/i,
            /^nov/i,
            /^déc/i,
        ];

    hooks.defineLocale('fr', {
        months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split(
            '_'
        ),
        monthsShort:
            'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split(
                '_'
            ),
        monthsRegex: monthsRegex$7,
        monthsShortRegex: monthsRegex$7,
        monthsStrictRegex: monthsStrictRegex$1,
        monthsShortStrictRegex: monthsShortStrictRegex$1,
        monthsParse: monthsParse$6,
        longMonthsParse: monthsParse$6,
        shortMonthsParse: monthsParse$6,
        weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
        weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
        weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Aujourd’hui à] LT',
            nextDay: '[Demain à] LT',
            nextWeek: 'dddd [à] LT',
            lastDay: '[Hier à] LT',
            lastWeek: 'dddd [dernier à] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'dans %s',
            past: 'il y a %s',
            s: 'quelques secondes',
            ss: '%d secondes',
            m: 'une minute',
            mm: '%d minutes',
            h: 'une heure',
            hh: '%d heures',
            d: 'un jour',
            dd: '%d jours',
            w: 'une semaine',
            ww: '%d semaines',
            M: 'un mois',
            MM: '%d mois',
            y: 'un an',
            yy: '%d ans',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(er|)/,
        ordinal: function (number, period) {
            switch (period) {
                // TODO: Return 'e' when day of month > 1. Move this case inside
                // block for masculine words below.
                // See https://github.com/moment/moment/issues/3375
                case 'D':
                    return number + (number === 1 ? 'er' : '');

                // Words with masculine grammatical gender: mois, trimestre, jour
                default:
                case 'M':
                case 'Q':
                case 'DDD':
                case 'd':
                    return number + (number === 1 ? 'er' : 'e');

                // Words with feminine grammatical gender: semaine
                case 'w':
                case 'W':
                    return number + (number === 1 ? 're' : 'e');
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var monthsShortWithDots =
            'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'),
        monthsShortWithoutDots =
            'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_');

    hooks.defineLocale('fy', {
        months: 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split(
            '_'
        ),
        monthsShort: function (m, format) {
            if (!m) {
                return monthsShortWithDots;
            } else if (/-MMM-/.test(format)) {
                return monthsShortWithoutDots[m.month()];
            } else {
                return monthsShortWithDots[m.month()];
            }
        },
        monthsParseExact: true,
        weekdays: 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split(
            '_'
        ),
        weekdaysShort: 'si._mo._ti._wo._to._fr._so.'.split('_'),
        weekdaysMin: 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD-MM-YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[hjoed om] LT',
            nextDay: '[moarn om] LT',
            nextWeek: 'dddd [om] LT',
            lastDay: '[juster om] LT',
            lastWeek: '[ôfrûne] dddd [om] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'oer %s',
            past: '%s lyn',
            s: 'in pear sekonden',
            ss: '%d sekonden',
            m: 'ien minút',
            mm: '%d minuten',
            h: 'ien oere',
            hh: '%d oeren',
            d: 'ien dei',
            dd: '%d dagen',
            M: 'ien moanne',
            MM: '%d moannen',
            y: 'ien jier',
            yy: '%d jierren',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/,
        ordinal: function (number) {
            return (
                number +
                (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')
            );
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var months$6 = [
            'Eanáir',
            'Feabhra',
            'Márta',
            'Aibreán',
            'Bealtaine',
            'Meitheamh',
            'Iúil',
            'Lúnasa',
            'Meán Fómhair',
            'Deireadh Fómhair',
            'Samhain',
            'Nollaig',
        ],
        monthsShort$5 = [
            'Ean',
            'Feabh',
            'Márt',
            'Aib',
            'Beal',
            'Meith',
            'Iúil',
            'Lún',
            'M.F.',
            'D.F.',
            'Samh',
            'Noll',
        ],
        weekdays$1 = [
            'Dé Domhnaigh',
            'Dé Luain',
            'Dé Máirt',
            'Dé Céadaoin',
            'Déardaoin',
            'Dé hAoine',
            'Dé Sathairn',
        ],
        weekdaysShort = ['Domh', 'Luan', 'Máirt', 'Céad', 'Déar', 'Aoine', 'Sath'],
        weekdaysMin = ['Do', 'Lu', 'Má', 'Cé', 'Dé', 'A', 'Sa'];

    hooks.defineLocale('ga', {
        months: months$6,
        monthsShort: monthsShort$5,
        monthsParseExact: true,
        weekdays: weekdays$1,
        weekdaysShort: weekdaysShort,
        weekdaysMin: weekdaysMin,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Inniu ag] LT',
            nextDay: '[Amárach ag] LT',
            nextWeek: 'dddd [ag] LT',
            lastDay: '[Inné ag] LT',
            lastWeek: 'dddd [seo caite] [ag] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'i %s',
            past: '%s ó shin',
            s: 'cúpla soicind',
            ss: '%d soicind',
            m: 'nóiméad',
            mm: '%d nóiméad',
            h: 'uair an chloig',
            hh: '%d uair an chloig',
            d: 'lá',
            dd: '%d lá',
            M: 'mí',
            MM: '%d míonna',
            y: 'bliain',
            yy: '%d bliain',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(d|na|mh)/,
        ordinal: function (number) {
            var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var months$7 = [
            'Am Faoilleach',
            'An Gearran',
            'Am Màrt',
            'An Giblean',
            'An Cèitean',
            'An t-Ògmhios',
            'An t-Iuchar',
            'An Lùnastal',
            'An t-Sultain',
            'An Dàmhair',
            'An t-Samhain',
            'An Dùbhlachd',
        ],
        monthsShort$6 = [
            'Faoi',
            'Gear',
            'Màrt',
            'Gibl',
            'Cèit',
            'Ògmh',
            'Iuch',
            'Lùn',
            'Sult',
            'Dàmh',
            'Samh',
            'Dùbh',
        ],
        weekdays$2 = [
            'Didòmhnaich',
            'Diluain',
            'Dimàirt',
            'Diciadain',
            'Diardaoin',
            'Dihaoine',
            'Disathairne',
        ],
        weekdaysShort$1 = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis'],
        weekdaysMin$1 = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa'];

    hooks.defineLocale('gd', {
        months: months$7,
        monthsShort: monthsShort$6,
        monthsParseExact: true,
        weekdays: weekdays$2,
        weekdaysShort: weekdaysShort$1,
        weekdaysMin: weekdaysMin$1,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[An-diugh aig] LT',
            nextDay: '[A-màireach aig] LT',
            nextWeek: 'dddd [aig] LT',
            lastDay: '[An-dè aig] LT',
            lastWeek: 'dddd [seo chaidh] [aig] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'ann an %s',
            past: 'bho chionn %s',
            s: 'beagan diogan',
            ss: '%d diogan',
            m: 'mionaid',
            mm: '%d mionaidean',
            h: 'uair',
            hh: '%d uairean',
            d: 'latha',
            dd: '%d latha',
            M: 'mìos',
            MM: '%d mìosan',
            y: 'bliadhna',
            yy: '%d bliadhna',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(d|na|mh)/,
        ordinal: function (number) {
            var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('gl', {
        months: 'xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro'.split(
            '_'
        ),
        monthsShort:
            'xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'domingo_luns_martes_mércores_xoves_venres_sábado'.split('_'),
        weekdaysShort: 'dom._lun._mar._mér._xov._ven._sáb.'.split('_'),
        weekdaysMin: 'do_lu_ma_mé_xo_ve_sá'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D [de] MMMM [de] YYYY',
            LLL: 'D [de] MMMM [de] YYYY H:mm',
            LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm',
        },
        calendar: {
            sameDay: function () {
                return '[hoxe ' + (this.hours() !== 1 ? 'ás' : 'á') + '] LT';
            },
            nextDay: function () {
                return '[mañá ' + (this.hours() !== 1 ? 'ás' : 'á') + '] LT';
            },
            nextWeek: function () {
                return 'dddd [' + (this.hours() !== 1 ? 'ás' : 'a') + '] LT';
            },
            lastDay: function () {
                return '[onte ' + (this.hours() !== 1 ? 'á' : 'a') + '] LT';
            },
            lastWeek: function () {
                return (
                    '[o] dddd [pasado ' + (this.hours() !== 1 ? 'ás' : 'a') + '] LT'
                );
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: function (str) {
                if (str.indexOf('un') === 0) {
                    return 'n' + str;
                }
                return 'en ' + str;
            },
            past: 'hai %s',
            s: 'uns segundos',
            ss: '%d segundos',
            m: 'un minuto',
            mm: '%d minutos',
            h: 'unha hora',
            hh: '%d horas',
            d: 'un día',
            dd: '%d días',
            M: 'un mes',
            MM: '%d meses',
            y: 'un ano',
            yy: '%d anos',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function processRelativeTime$4(number, withoutSuffix, key, isFuture) {
        var format = {
            s: ['थोडया सॅकंडांनी', 'थोडे सॅकंड'],
            ss: [number + ' सॅकंडांनी', number + ' सॅकंड'],
            m: ['एका मिणटान', 'एक मिनूट'],
            mm: [number + ' मिणटांनी', number + ' मिणटां'],
            h: ['एका वरान', 'एक वर'],
            hh: [number + ' वरांनी', number + ' वरां'],
            d: ['एका दिसान', 'एक दीस'],
            dd: [number + ' दिसांनी', number + ' दीस'],
            M: ['एका म्हयन्यान', 'एक म्हयनो'],
            MM: [number + ' म्हयन्यानी', number + ' म्हयने'],
            y: ['एका वर्सान', 'एक वर्स'],
            yy: [number + ' वर्सांनी', number + ' वर्सां'],
        };
        return isFuture ? format[key][0] : format[key][1];
    }

    hooks.defineLocale('gom-deva', {
        months: {
            standalone:
                'जानेवारी_फेब्रुवारी_मार्च_एप्रील_मे_जून_जुलय_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split(
                    '_'
                ),
            format: 'जानेवारीच्या_फेब्रुवारीच्या_मार्चाच्या_एप्रीलाच्या_मेयाच्या_जूनाच्या_जुलयाच्या_ऑगस्टाच्या_सप्टेंबराच्या_ऑक्टोबराच्या_नोव्हेंबराच्या_डिसेंबराच्या'.split(
                '_'
            ),
            isFormat: /MMMM(\s)+D[oD]?/,
        },
        monthsShort:
            'जाने._फेब्रु._मार्च_एप्री._मे_जून_जुल._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'आयतार_सोमार_मंगळार_बुधवार_बिरेस्तार_सुक्रार_शेनवार'.split('_'),
        weekdaysShort: 'आयत._सोम._मंगळ._बुध._ब्रेस्त._सुक्र._शेन.'.split('_'),
        weekdaysMin: 'आ_सो_मं_बु_ब्रे_सु_शे'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'A h:mm [वाजतां]',
            LTS: 'A h:mm:ss [वाजतां]',
            L: 'DD-MM-YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY A h:mm [वाजतां]',
            LLLL: 'dddd, MMMM Do, YYYY, A h:mm [वाजतां]',
            llll: 'ddd, D MMM YYYY, A h:mm [वाजतां]',
        },
        calendar: {
            sameDay: '[आयज] LT',
            nextDay: '[फाल्यां] LT',
            nextWeek: '[फुडलो] dddd[,] LT',
            lastDay: '[काल] LT',
            lastWeek: '[फाटलो] dddd[,] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s',
            past: '%s आदीं',
            s: processRelativeTime$4,
            ss: processRelativeTime$4,
            m: processRelativeTime$4,
            mm: processRelativeTime$4,
            h: processRelativeTime$4,
            hh: processRelativeTime$4,
            d: processRelativeTime$4,
            dd: processRelativeTime$4,
            M: processRelativeTime$4,
            MM: processRelativeTime$4,
            y: processRelativeTime$4,
            yy: processRelativeTime$4,
        },
        dayOfMonthOrdinalParse: /\d{1,2}(वेर)/,
        ordinal: function (number, period) {
            switch (period) {
                // the ordinal 'वेर' only applies to day of the month
                case 'D':
                    return number + 'वेर';
                default:
                case 'M':
                case 'Q':
                case 'DDD':
                case 'd':
                case 'w':
                case 'W':
                    return number;
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week
            doy: 3, // The week that contains Jan 4th is the first week of the year (7 + 0 - 4)
        },
        meridiemParse: /राती|सकाळीं|दनपारां|सांजे/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'राती') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'सकाळीं') {
                return hour;
            } else if (meridiem === 'दनपारां') {
                return hour > 12 ? hour : hour + 12;
            } else if (meridiem === 'सांजे') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'राती';
            } else if (hour < 12) {
                return 'सकाळीं';
            } else if (hour < 16) {
                return 'दनपारां';
            } else if (hour < 20) {
                return 'सांजे';
            } else {
                return 'राती';
            }
        },
    });

    //! moment.js locale configuration

    function processRelativeTime$5(number, withoutSuffix, key, isFuture) {
        var format = {
            s: ['thoddea sekondamni', 'thodde sekond'],
            ss: [number + ' sekondamni', number + ' sekond'],
            m: ['eka mintan', 'ek minut'],
            mm: [number + ' mintamni', number + ' mintam'],
            h: ['eka voran', 'ek vor'],
            hh: [number + ' voramni', number + ' voram'],
            d: ['eka disan', 'ek dis'],
            dd: [number + ' disamni', number + ' dis'],
            M: ['eka mhoinean', 'ek mhoino'],
            MM: [number + ' mhoineamni', number + ' mhoine'],
            y: ['eka vorsan', 'ek voros'],
            yy: [number + ' vorsamni', number + ' vorsam'],
        };
        return isFuture ? format[key][0] : format[key][1];
    }

    hooks.defineLocale('gom-latn', {
        months: {
            standalone:
                'Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr'.split(
                    '_'
                ),
            format: 'Janerachea_Febrerachea_Marsachea_Abrilachea_Maiachea_Junachea_Julaiachea_Agostachea_Setembrachea_Otubrachea_Novembrachea_Dezembrachea'.split(
                '_'
            ),
            isFormat: /MMMM(\s)+D[oD]?/,
        },
        monthsShort:
            'Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.'.split('_'),
        monthsParseExact: true,
        weekdays: "Aitar_Somar_Mongllar_Budhvar_Birestar_Sukrar_Son'var".split('_'),
        weekdaysShort: 'Ait._Som._Mon._Bud._Bre._Suk._Son.'.split('_'),
        weekdaysMin: 'Ai_Sm_Mo_Bu_Br_Su_Sn'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'A h:mm [vazta]',
            LTS: 'A h:mm:ss [vazta]',
            L: 'DD-MM-YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY A h:mm [vazta]',
            LLLL: 'dddd, MMMM Do, YYYY, A h:mm [vazta]',
            llll: 'ddd, D MMM YYYY, A h:mm [vazta]',
        },
        calendar: {
            sameDay: '[Aiz] LT',
            nextDay: '[Faleam] LT',
            nextWeek: '[Fuddlo] dddd[,] LT',
            lastDay: '[Kal] LT',
            lastWeek: '[Fattlo] dddd[,] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s',
            past: '%s adim',
            s: processRelativeTime$5,
            ss: processRelativeTime$5,
            m: processRelativeTime$5,
            mm: processRelativeTime$5,
            h: processRelativeTime$5,
            hh: processRelativeTime$5,
            d: processRelativeTime$5,
            dd: processRelativeTime$5,
            M: processRelativeTime$5,
            MM: processRelativeTime$5,
            y: processRelativeTime$5,
            yy: processRelativeTime$5,
        },
        dayOfMonthOrdinalParse: /\d{1,2}(er)/,
        ordinal: function (number, period) {
            switch (period) {
                // the ordinal 'er' only applies to day of the month
                case 'D':
                    return number + 'er';
                default:
                case 'M':
                case 'Q':
                case 'DDD':
                case 'd':
                case 'w':
                case 'W':
                    return number;
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week
            doy: 3, // The week that contains Jan 4th is the first week of the year (7 + 0 - 4)
        },
        meridiemParse: /rati|sokallim|donparam|sanje/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'rati') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'sokallim') {
                return hour;
            } else if (meridiem === 'donparam') {
                return hour > 12 ? hour : hour + 12;
            } else if (meridiem === 'sanje') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'rati';
            } else if (hour < 12) {
                return 'sokallim';
            } else if (hour < 16) {
                return 'donparam';
            } else if (hour < 20) {
                return 'sanje';
            } else {
                return 'rati';
            }
        },
    });

    //! moment.js locale configuration

    var symbolMap$7 = {
            1: '૧',
            2: '૨',
            3: '૩',
            4: '૪',
            5: '૫',
            6: '૬',
            7: '૭',
            8: '૮',
            9: '૯',
            0: '૦',
        },
        numberMap$6 = {
            '૧': '1',
            '૨': '2',
            '૩': '3',
            '૪': '4',
            '૫': '5',
            '૬': '6',
            '૭': '7',
            '૮': '8',
            '૯': '9',
            '૦': '0',
        };

    hooks.defineLocale('gu', {
        months: 'જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર'.split(
            '_'
        ),
        monthsShort:
            'જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'રવિવાર_સોમવાર_મંગળવાર_બુધ્વાર_ગુરુવાર_શુક્રવાર_શનિવાર'.split(
            '_'
        ),
        weekdaysShort: 'રવિ_સોમ_મંગળ_બુધ્_ગુરુ_શુક્ર_શનિ'.split('_'),
        weekdaysMin: 'ર_સો_મં_બુ_ગુ_શુ_શ'.split('_'),
        longDateFormat: {
            LT: 'A h:mm વાગ્યે',
            LTS: 'A h:mm:ss વાગ્યે',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm વાગ્યે',
            LLLL: 'dddd, D MMMM YYYY, A h:mm વાગ્યે',
        },
        calendar: {
            sameDay: '[આજ] LT',
            nextDay: '[કાલે] LT',
            nextWeek: 'dddd, LT',
            lastDay: '[ગઇકાલે] LT',
            lastWeek: '[પાછલા] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s મા',
            past: '%s પહેલા',
            s: 'અમુક પળો',
            ss: '%d સેકંડ',
            m: 'એક મિનિટ',
            mm: '%d મિનિટ',
            h: 'એક કલાક',
            hh: '%d કલાક',
            d: 'એક દિવસ',
            dd: '%d દિવસ',
            M: 'એક મહિનો',
            MM: '%d મહિનો',
            y: 'એક વર્ષ',
            yy: '%d વર્ષ',
        },
        preparse: function (string) {
            return string.replace(/[૧૨૩૪૫૬૭૮૯૦]/g, function (match) {
                return numberMap$6[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap$7[match];
            });
        },
        // Gujarati notation for meridiems are quite fuzzy in practice. While there exists
        // a rigid notion of a 'Pahar' it is not used as rigidly in modern Gujarati.
        meridiemParse: /રાત|બપોર|સવાર|સાંજ/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'રાત') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'સવાર') {
                return hour;
            } else if (meridiem === 'બપોર') {
                return hour >= 10 ? hour : hour + 12;
            } else if (meridiem === 'સાંજ') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'રાત';
            } else if (hour < 10) {
                return 'સવાર';
            } else if (hour < 17) {
                return 'બપોર';
            } else if (hour < 20) {
                return 'સાંજ';
            } else {
                return 'રાત';
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('he', {
        months: 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split(
            '_'
        ),
        monthsShort:
            'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'),
        weekdays: 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'),
        weekdaysShort: 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'),
        weekdaysMin: 'א_ב_ג_ד_ה_ו_ש'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D [ב]MMMM YYYY',
            LLL: 'D [ב]MMMM YYYY HH:mm',
            LLLL: 'dddd, D [ב]MMMM YYYY HH:mm',
            l: 'D/M/YYYY',
            ll: 'D MMM YYYY',
            lll: 'D MMM YYYY HH:mm',
            llll: 'ddd, D MMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[היום ב־]LT',
            nextDay: '[מחר ב־]LT',
            nextWeek: 'dddd [בשעה] LT',
            lastDay: '[אתמול ב־]LT',
            lastWeek: '[ביום] dddd [האחרון בשעה] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'בעוד %s',
            past: 'לפני %s',
            s: 'מספר שניות',
            ss: '%d שניות',
            m: 'דקה',
            mm: '%d דקות',
            h: 'שעה',
            hh: function (number) {
                if (number === 2) {
                    return 'שעתיים';
                }
                return number + ' שעות';
            },
            d: 'יום',
            dd: function (number) {
                if (number === 2) {
                    return 'יומיים';
                }
                return number + ' ימים';
            },
            M: 'חודש',
            MM: function (number) {
                if (number === 2) {
                    return 'חודשיים';
                }
                return number + ' חודשים';
            },
            y: 'שנה',
            yy: function (number) {
                if (number === 2) {
                    return 'שנתיים';
                } else if (number % 10 === 0 && number !== 10) {
                    return number + ' שנה';
                }
                return number + ' שנים';
            },
        },
        meridiemParse:
            /אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,
        isPM: function (input) {
            return /^(אחה"צ|אחרי הצהריים|בערב)$/.test(input);
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 5) {
                return 'לפנות בוקר';
            } else if (hour < 10) {
                return 'בבוקר';
            } else if (hour < 12) {
                return isLower ? 'לפנה"צ' : 'לפני הצהריים';
            } else if (hour < 18) {
                return isLower ? 'אחה"צ' : 'אחרי הצהריים';
            } else {
                return 'בערב';
            }
        },
    });

    //! moment.js locale configuration

    var symbolMap$8 = {
            1: '१',
            2: '२',
            3: '३',
            4: '४',
            5: '५',
            6: '६',
            7: '७',
            8: '८',
            9: '९',
            0: '०',
        },
        numberMap$7 = {
            '१': '1',
            '२': '2',
            '३': '3',
            '४': '4',
            '५': '5',
            '६': '6',
            '७': '7',
            '८': '8',
            '९': '9',
            '०': '0',
        },
        monthsParse$7 = [
            /^जन/i,
            /^फ़र|फर/i,
            /^मार्च/i,
            /^अप्रै/i,
            /^मई/i,
            /^जून/i,
            /^जुल/i,
            /^अग/i,
            /^सितं|सित/i,
            /^अक्टू/i,
            /^नव|नवं/i,
            /^दिसं|दिस/i,
        ],
        shortMonthsParse = [
            /^जन/i,
            /^फ़र/i,
            /^मार्च/i,
            /^अप्रै/i,
            /^मई/i,
            /^जून/i,
            /^जुल/i,
            /^अग/i,
            /^सित/i,
            /^अक्टू/i,
            /^नव/i,
            /^दिस/i,
        ];

    hooks.defineLocale('hi', {
        months: {
            format: 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split(
                '_'
            ),
            standalone:
                'जनवरी_फरवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितंबर_अक्टूबर_नवंबर_दिसंबर'.split(
                    '_'
                ),
        },
        monthsShort:
            'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'),
        weekdays: 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
        weekdaysShort: 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'),
        weekdaysMin: 'र_सो_मं_बु_गु_शु_श'.split('_'),
        longDateFormat: {
            LT: 'A h:mm बजे',
            LTS: 'A h:mm:ss बजे',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm बजे',
            LLLL: 'dddd, D MMMM YYYY, A h:mm बजे',
        },

        monthsParse: monthsParse$7,
        longMonthsParse: monthsParse$7,
        shortMonthsParse: shortMonthsParse,

        monthsRegex:
            /^(जनवरी|जन\.?|फ़रवरी|फरवरी|फ़र\.?|मार्च?|अप्रैल|अप्रै\.?|मई?|जून?|जुलाई|जुल\.?|अगस्त|अग\.?|सितम्बर|सितंबर|सित\.?|अक्टूबर|अक्टू\.?|नवम्बर|नवंबर|नव\.?|दिसम्बर|दिसंबर|दिस\.?)/i,

        monthsShortRegex:
            /^(जनवरी|जन\.?|फ़रवरी|फरवरी|फ़र\.?|मार्च?|अप्रैल|अप्रै\.?|मई?|जून?|जुलाई|जुल\.?|अगस्त|अग\.?|सितम्बर|सितंबर|सित\.?|अक्टूबर|अक्टू\.?|नवम्बर|नवंबर|नव\.?|दिसम्बर|दिसंबर|दिस\.?)/i,

        monthsStrictRegex:
            /^(जनवरी?|फ़रवरी|फरवरी?|मार्च?|अप्रैल?|मई?|जून?|जुलाई?|अगस्त?|सितम्बर|सितंबर|सित?\.?|अक्टूबर|अक्टू\.?|नवम्बर|नवंबर?|दिसम्बर|दिसंबर?)/i,

        monthsShortStrictRegex:
            /^(जन\.?|फ़र\.?|मार्च?|अप्रै\.?|मई?|जून?|जुल\.?|अग\.?|सित\.?|अक्टू\.?|नव\.?|दिस\.?)/i,

        calendar: {
            sameDay: '[आज] LT',
            nextDay: '[कल] LT',
            nextWeek: 'dddd, LT',
            lastDay: '[कल] LT',
            lastWeek: '[पिछले] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s में',
            past: '%s पहले',
            s: 'कुछ ही क्षण',
            ss: '%d सेकंड',
            m: 'एक मिनट',
            mm: '%d मिनट',
            h: 'एक घंटा',
            hh: '%d घंटे',
            d: 'एक दिन',
            dd: '%d दिन',
            M: 'एक महीने',
            MM: '%d महीने',
            y: 'एक वर्ष',
            yy: '%d वर्ष',
        },
        preparse: function (string) {
            return string.replace(/[१२३४५६७८९०]/g, function (match) {
                return numberMap$7[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap$8[match];
            });
        },
        // Hindi notation for meridiems are quite fuzzy in practice. While there exists
        // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.
        meridiemParse: /रात|सुबह|दोपहर|शाम/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'रात') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'सुबह') {
                return hour;
            } else if (meridiem === 'दोपहर') {
                return hour >= 10 ? hour : hour + 12;
            } else if (meridiem === 'शाम') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'रात';
            } else if (hour < 10) {
                return 'सुबह';
            } else if (hour < 17) {
                return 'दोपहर';
            } else if (hour < 20) {
                return 'शाम';
            } else {
                return 'रात';
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function translate$3(number, withoutSuffix, key) {
        var result = number + ' ';
        switch (key) {
            case 'ss':
                if (number === 1) {
                    result += 'sekunda';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'sekunde';
                } else {
                    result += 'sekundi';
                }
                return result;
            case 'm':
                return withoutSuffix ? 'jedna minuta' : 'jedne minute';
            case 'mm':
                if (number === 1) {
                    result += 'minuta';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'minute';
                } else {
                    result += 'minuta';
                }
                return result;
            case 'h':
                return withoutSuffix ? 'jedan sat' : 'jednog sata';
            case 'hh':
                if (number === 1) {
                    result += 'sat';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'sata';
                } else {
                    result += 'sati';
                }
                return result;
            case 'dd':
                if (number === 1) {
                    result += 'dan';
                } else {
                    result += 'dana';
                }
                return result;
            case 'MM':
                if (number === 1) {
                    result += 'mjesec';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'mjeseca';
                } else {
                    result += 'mjeseci';
                }
                return result;
            case 'yy':
                if (number === 1) {
                    result += 'godina';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'godine';
                } else {
                    result += 'godina';
                }
                return result;
        }
    }

    hooks.defineLocale('hr', {
        months: {
            format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split(
                '_'
            ),
            standalone:
                'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split(
                    '_'
                ),
        },
        monthsShort:
            'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split(
            '_'
        ),
        weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
        weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'Do MMMM YYYY',
            LLL: 'Do MMMM YYYY H:mm',
            LLLL: 'dddd, Do MMMM YYYY H:mm',
        },
        calendar: {
            sameDay: '[danas u] LT',
            nextDay: '[sutra u] LT',
            nextWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[u] [nedjelju] [u] LT';
                    case 3:
                        return '[u] [srijedu] [u] LT';
                    case 6:
                        return '[u] [subotu] [u] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[u] dddd [u] LT';
                }
            },
            lastDay: '[jučer u] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[prošlu] [nedjelju] [u] LT';
                    case 3:
                        return '[prošlu] [srijedu] [u] LT';
                    case 6:
                        return '[prošle] [subote] [u] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[prošli] dddd [u] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'za %s',
            past: 'prije %s',
            s: 'par sekundi',
            ss: translate$3,
            m: translate$3,
            mm: translate$3,
            h: translate$3,
            hh: translate$3,
            d: 'dan',
            dd: translate$3,
            M: 'mjesec',
            MM: translate$3,
            y: 'godinu',
            yy: translate$3,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var weekEndings =
        'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');
    function translate$4(number, withoutSuffix, key, isFuture) {
        var num = number;
        switch (key) {
            case 's':
                return isFuture || withoutSuffix
                    ? 'néhány másodperc'
                    : 'néhány másodperce';
            case 'ss':
                return num + (isFuture || withoutSuffix)
                    ? ' másodperc'
                    : ' másodperce';
            case 'm':
                return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce');
            case 'mm':
                return num + (isFuture || withoutSuffix ? ' perc' : ' perce');
            case 'h':
                return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája');
            case 'hh':
                return num + (isFuture || withoutSuffix ? ' óra' : ' órája');
            case 'd':
                return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja');
            case 'dd':
                return num + (isFuture || withoutSuffix ? ' nap' : ' napja');
            case 'M':
                return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
            case 'MM':
                return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
            case 'y':
                return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve');
            case 'yy':
                return num + (isFuture || withoutSuffix ? ' év' : ' éve');
        }
        return '';
    }
    function week(isFuture) {
        return (
            (isFuture ? '' : '[múlt] ') +
            '[' +
            weekEndings[this.day()] +
            '] LT[-kor]'
        );
    }

    hooks.defineLocale('hu', {
        months: 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split(
            '_'
        ),
        monthsShort:
            'jan._feb._márc._ápr._máj._jún._júl._aug._szept._okt._nov._dec.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'),
        weekdaysShort: 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'),
        weekdaysMin: 'v_h_k_sze_cs_p_szo'.split('_'),
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'YYYY.MM.DD.',
            LL: 'YYYY. MMMM D.',
            LLL: 'YYYY. MMMM D. H:mm',
            LLLL: 'YYYY. MMMM D., dddd H:mm',
        },
        meridiemParse: /de|du/i,
        isPM: function (input) {
            return input.charAt(1).toLowerCase() === 'u';
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours < 12) {
                return isLower === true ? 'de' : 'DE';
            } else {
                return isLower === true ? 'du' : 'DU';
            }
        },
        calendar: {
            sameDay: '[ma] LT[-kor]',
            nextDay: '[holnap] LT[-kor]',
            nextWeek: function () {
                return week.call(this, true);
            },
            lastDay: '[tegnap] LT[-kor]',
            lastWeek: function () {
                return week.call(this, false);
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s múlva',
            past: '%s',
            s: translate$4,
            ss: translate$4,
            m: translate$4,
            mm: translate$4,
            h: translate$4,
            hh: translate$4,
            d: translate$4,
            dd: translate$4,
            M: translate$4,
            MM: translate$4,
            y: translate$4,
            yy: translate$4,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('hy-am', {
        months: {
            format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split(
                '_'
            ),
            standalone:
                'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split(
                    '_'
                ),
        },
        monthsShort: 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'),
        weekdays:
            'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split(
                '_'
            ),
        weekdaysShort: 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
        weekdaysMin: 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY թ.',
            LLL: 'D MMMM YYYY թ., HH:mm',
            LLLL: 'dddd, D MMMM YYYY թ., HH:mm',
        },
        calendar: {
            sameDay: '[այսօր] LT',
            nextDay: '[վաղը] LT',
            lastDay: '[երեկ] LT',
            nextWeek: function () {
                return 'dddd [օրը ժամը] LT';
            },
            lastWeek: function () {
                return '[անցած] dddd [օրը ժամը] LT';
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s հետո',
            past: '%s առաջ',
            s: 'մի քանի վայրկյան',
            ss: '%d վայրկյան',
            m: 'րոպե',
            mm: '%d րոպե',
            h: 'ժամ',
            hh: '%d ժամ',
            d: 'օր',
            dd: '%d օր',
            M: 'ամիս',
            MM: '%d ամիս',
            y: 'տարի',
            yy: '%d տարի',
        },
        meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/,
        isPM: function (input) {
            return /^(ցերեկվա|երեկոյան)$/.test(input);
        },
        meridiem: function (hour) {
            if (hour < 4) {
                return 'գիշերվա';
            } else if (hour < 12) {
                return 'առավոտվա';
            } else if (hour < 17) {
                return 'ցերեկվա';
            } else {
                return 'երեկոյան';
            }
        },
        dayOfMonthOrdinalParse: /\d{1,2}|\d{1,2}-(ին|րդ)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'DDD':
                case 'w':
                case 'W':
                case 'DDDo':
                    if (number === 1) {
                        return number + '-ին';
                    }
                    return number + '-րդ';
                default:
                    return number;
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('id', {
        months: 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des'.split('_'),
        weekdays: 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'),
        weekdaysShort: 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'),
        weekdaysMin: 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'),
        longDateFormat: {
            LT: 'HH.mm',
            LTS: 'HH.mm.ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY [pukul] HH.mm',
            LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',
        },
        meridiemParse: /pagi|siang|sore|malam/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'pagi') {
                return hour;
            } else if (meridiem === 'siang') {
                return hour >= 11 ? hour : hour + 12;
            } else if (meridiem === 'sore' || meridiem === 'malam') {
                return hour + 12;
            }
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours < 11) {
                return 'pagi';
            } else if (hours < 15) {
                return 'siang';
            } else if (hours < 19) {
                return 'sore';
            } else {
                return 'malam';
            }
        },
        calendar: {
            sameDay: '[Hari ini pukul] LT',
            nextDay: '[Besok pukul] LT',
            nextWeek: 'dddd [pukul] LT',
            lastDay: '[Kemarin pukul] LT',
            lastWeek: 'dddd [lalu pukul] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'dalam %s',
            past: '%s yang lalu',
            s: 'beberapa detik',
            ss: '%d detik',
            m: 'semenit',
            mm: '%d menit',
            h: 'sejam',
            hh: '%d jam',
            d: 'sehari',
            dd: '%d hari',
            M: 'sebulan',
            MM: '%d bulan',
            y: 'setahun',
            yy: '%d tahun',
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function plural$2(n) {
        if (n % 100 === 11) {
            return true;
        } else if (n % 10 === 1) {
            return false;
        }
        return true;
    }
    function translate$5(number, withoutSuffix, key, isFuture) {
        var result = number + ' ';
        switch (key) {
            case 's':
                return withoutSuffix || isFuture
                    ? 'nokkrar sekúndur'
                    : 'nokkrum sekúndum';
            case 'ss':
                if (plural$2(number)) {
                    return (
                        result +
                        (withoutSuffix || isFuture ? 'sekúndur' : 'sekúndum')
                    );
                }
                return result + 'sekúnda';
            case 'm':
                return withoutSuffix ? 'mínúta' : 'mínútu';
            case 'mm':
                if (plural$2(number)) {
                    return (
                        result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum')
                    );
                } else if (withoutSuffix) {
                    return result + 'mínúta';
                }
                return result + 'mínútu';
            case 'hh':
                if (plural$2(number)) {
                    return (
                        result +
                        (withoutSuffix || isFuture
                            ? 'klukkustundir'
                            : 'klukkustundum')
                    );
                }
                return result + 'klukkustund';
            case 'd':
                if (withoutSuffix) {
                    return 'dagur';
                }
                return isFuture ? 'dag' : 'degi';
            case 'dd':
                if (plural$2(number)) {
                    if (withoutSuffix) {
                        return result + 'dagar';
                    }
                    return result + (isFuture ? 'daga' : 'dögum');
                } else if (withoutSuffix) {
                    return result + 'dagur';
                }
                return result + (isFuture ? 'dag' : 'degi');
            case 'M':
                if (withoutSuffix) {
                    return 'mánuður';
                }
                return isFuture ? 'mánuð' : 'mánuði';
            case 'MM':
                if (plural$2(number)) {
                    if (withoutSuffix) {
                        return result + 'mánuðir';
                    }
                    return result + (isFuture ? 'mánuði' : 'mánuðum');
                } else if (withoutSuffix) {
                    return result + 'mánuður';
                }
                return result + (isFuture ? 'mánuð' : 'mánuði');
            case 'y':
                return withoutSuffix || isFuture ? 'ár' : 'ári';
            case 'yy':
                if (plural$2(number)) {
                    return result + (withoutSuffix || isFuture ? 'ár' : 'árum');
                }
                return result + (withoutSuffix || isFuture ? 'ár' : 'ári');
        }
    }

    hooks.defineLocale('is', {
        months: 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split(
            '_'
        ),
        monthsShort: 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'),
        weekdays:
            'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split(
                '_'
            ),
        weekdaysShort: 'sun_mán_þri_mið_fim_fös_lau'.split('_'),
        weekdaysMin: 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'),
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY [kl.] H:mm',
            LLLL: 'dddd, D. MMMM YYYY [kl.] H:mm',
        },
        calendar: {
            sameDay: '[í dag kl.] LT',
            nextDay: '[á morgun kl.] LT',
            nextWeek: 'dddd [kl.] LT',
            lastDay: '[í gær kl.] LT',
            lastWeek: '[síðasta] dddd [kl.] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'eftir %s',
            past: 'fyrir %s síðan',
            s: translate$5,
            ss: translate$5,
            m: translate$5,
            mm: translate$5,
            h: 'klukkustund',
            hh: translate$5,
            d: translate$5,
            dd: translate$5,
            M: translate$5,
            MM: translate$5,
            y: translate$5,
            yy: translate$5,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('it-ch', {
        months: 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split(
            '_'
        ),
        monthsShort: 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),
        weekdays: 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split(
            '_'
        ),
        weekdaysShort: 'dom_lun_mar_mer_gio_ven_sab'.split('_'),
        weekdaysMin: 'do_lu_ma_me_gi_ve_sa'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Oggi alle] LT',
            nextDay: '[Domani alle] LT',
            nextWeek: 'dddd [alle] LT',
            lastDay: '[Ieri alle] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[la scorsa] dddd [alle] LT';
                    default:
                        return '[lo scorso] dddd [alle] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: function (s) {
                return (/^[0-9].+$/.test(s) ? 'tra' : 'in') + ' ' + s;
            },
            past: '%s fa',
            s: 'alcuni secondi',
            ss: '%d secondi',
            m: 'un minuto',
            mm: '%d minuti',
            h: "un'ora",
            hh: '%d ore',
            d: 'un giorno',
            dd: '%d giorni',
            M: 'un mese',
            MM: '%d mesi',
            y: 'un anno',
            yy: '%d anni',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('it', {
        months: 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split(
            '_'
        ),
        monthsShort: 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),
        weekdays: 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split(
            '_'
        ),
        weekdaysShort: 'dom_lun_mar_mer_gio_ven_sab'.split('_'),
        weekdaysMin: 'do_lu_ma_me_gi_ve_sa'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: function () {
                return (
                    '[Oggi a' +
                    (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : "ll'") +
                    ']LT'
                );
            },
            nextDay: function () {
                return (
                    '[Domani a' +
                    (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : "ll'") +
                    ']LT'
                );
            },
            nextWeek: function () {
                return (
                    'dddd [a' +
                    (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : "ll'") +
                    ']LT'
                );
            },
            lastDay: function () {
                return (
                    '[Ieri a' +
                    (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : "ll'") +
                    ']LT'
                );
            },
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                        return (
                            '[La scorsa] dddd [a' +
                            (this.hours() > 1
                                ? 'lle '
                                : this.hours() === 0
                                ? ' '
                                : "ll'") +
                            ']LT'
                        );
                    default:
                        return (
                            '[Lo scorso] dddd [a' +
                            (this.hours() > 1
                                ? 'lle '
                                : this.hours() === 0
                                ? ' '
                                : "ll'") +
                            ']LT'
                        );
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'tra %s',
            past: '%s fa',
            s: 'alcuni secondi',
            ss: '%d secondi',
            m: 'un minuto',
            mm: '%d minuti',
            h: "un'ora",
            hh: '%d ore',
            d: 'un giorno',
            dd: '%d giorni',
            w: 'una settimana',
            ww: '%d settimane',
            M: 'un mese',
            MM: '%d mesi',
            y: 'un anno',
            yy: '%d anni',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('ja', {
        eras: [
            {
                since: '2019-05-01',
                offset: 1,
                name: '令和',
                narrow: '㋿',
                abbr: 'R',
            },
            {
                since: '1989-01-08',
                until: '2019-04-30',
                offset: 1,
                name: '平成',
                narrow: '㍻',
                abbr: 'H',
            },
            {
                since: '1926-12-25',
                until: '1989-01-07',
                offset: 1,
                name: '昭和',
                narrow: '㍼',
                abbr: 'S',
            },
            {
                since: '1912-07-30',
                until: '1926-12-24',
                offset: 1,
                name: '大正',
                narrow: '㍽',
                abbr: 'T',
            },
            {
                since: '1873-01-01',
                until: '1912-07-29',
                offset: 6,
                name: '明治',
                narrow: '㍾',
                abbr: 'M',
            },
            {
                since: '0001-01-01',
                until: '1873-12-31',
                offset: 1,
                name: '西暦',
                narrow: 'AD',
                abbr: 'AD',
            },
            {
                since: '0000-12-31',
                until: -Infinity,
                offset: 1,
                name: '紀元前',
                narrow: 'BC',
                abbr: 'BC',
            },
        ],
        eraYearOrdinalRegex: /(元|\d+)年/,
        eraYearOrdinalParse: function (input, match) {
            return match[1] === '元' ? 1 : parseInt(match[1] || input, 10);
        },
        months: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
        monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(
            '_'
        ),
        weekdays: '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'),
        weekdaysShort: '日_月_火_水_木_金_土'.split('_'),
        weekdaysMin: '日_月_火_水_木_金_土'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY/MM/DD',
            LL: 'YYYY年M月D日',
            LLL: 'YYYY年M月D日 HH:mm',
            LLLL: 'YYYY年M月D日 dddd HH:mm',
            l: 'YYYY/MM/DD',
            ll: 'YYYY年M月D日',
            lll: 'YYYY年M月D日 HH:mm',
            llll: 'YYYY年M月D日(ddd) HH:mm',
        },
        meridiemParse: /午前|午後/i,
        isPM: function (input) {
            return input === '午後';
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return '午前';
            } else {
                return '午後';
            }
        },
        calendar: {
            sameDay: '[今日] LT',
            nextDay: '[明日] LT',
            nextWeek: function (now) {
                if (now.week() !== this.week()) {
                    return '[来週]dddd LT';
                } else {
                    return 'dddd LT';
                }
            },
            lastDay: '[昨日] LT',
            lastWeek: function (now) {
                if (this.week() !== now.week()) {
                    return '[先週]dddd LT';
                } else {
                    return 'dddd LT';
                }
            },
            sameElse: 'L',
        },
        dayOfMonthOrdinalParse: /\d{1,2}日/,
        ordinal: function (number, period) {
            switch (period) {
                case 'y':
                    return number === 1 ? '元年' : number + '年';
                case 'd':
                case 'D':
                case 'DDD':
                    return number + '日';
                default:
                    return number;
            }
        },
        relativeTime: {
            future: '%s後',
            past: '%s前',
            s: '数秒',
            ss: '%d秒',
            m: '1分',
            mm: '%d分',
            h: '1時間',
            hh: '%d時間',
            d: '1日',
            dd: '%d日',
            M: '1ヶ月',
            MM: '%dヶ月',
            y: '1年',
            yy: '%d年',
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('jv', {
        months: 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'),
        weekdays: 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'),
        weekdaysShort: 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'),
        weekdaysMin: 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'),
        longDateFormat: {
            LT: 'HH.mm',
            LTS: 'HH.mm.ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY [pukul] HH.mm',
            LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',
        },
        meridiemParse: /enjing|siyang|sonten|ndalu/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'enjing') {
                return hour;
            } else if (meridiem === 'siyang') {
                return hour >= 11 ? hour : hour + 12;
            } else if (meridiem === 'sonten' || meridiem === 'ndalu') {
                return hour + 12;
            }
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours < 11) {
                return 'enjing';
            } else if (hours < 15) {
                return 'siyang';
            } else if (hours < 19) {
                return 'sonten';
            } else {
                return 'ndalu';
            }
        },
        calendar: {
            sameDay: '[Dinten puniko pukul] LT',
            nextDay: '[Mbenjang pukul] LT',
            nextWeek: 'dddd [pukul] LT',
            lastDay: '[Kala wingi pukul] LT',
            lastWeek: 'dddd [kepengker pukul] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'wonten ing %s',
            past: '%s ingkang kepengker',
            s: 'sawetawis detik',
            ss: '%d detik',
            m: 'setunggal menit',
            mm: '%d menit',
            h: 'setunggal jam',
            hh: '%d jam',
            d: 'sedinten',
            dd: '%d dinten',
            M: 'sewulan',
            MM: '%d wulan',
            y: 'setaun',
            yy: '%d taun',
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('ka', {
        months: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split(
            '_'
        ),
        monthsShort: 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'),
        weekdays: {
            standalone:
                'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split(
                    '_'
                ),
            format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split(
                '_'
            ),
            isFormat: /(წინა|შემდეგ)/,
        },
        weekdaysShort: 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'),
        weekdaysMin: 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[დღეს] LT[-ზე]',
            nextDay: '[ხვალ] LT[-ზე]',
            lastDay: '[გუშინ] LT[-ზე]',
            nextWeek: '[შემდეგ] dddd LT[-ზე]',
            lastWeek: '[წინა] dddd LT-ზე',
            sameElse: 'L',
        },
        relativeTime: {
            future: function (s) {
                return s.replace(
                    /(წამ|წუთ|საათ|წელ|დღ|თვ)(ი|ე)/,
                    function ($0, $1, $2) {
                        return $2 === 'ი' ? $1 + 'ში' : $1 + $2 + 'ში';
                    }
                );
            },
            past: function (s) {
                if (/(წამი|წუთი|საათი|დღე|თვე)/.test(s)) {
                    return s.replace(/(ი|ე)$/, 'ის წინ');
                }
                if (/წელი/.test(s)) {
                    return s.replace(/წელი$/, 'წლის წინ');
                }
                return s;
            },
            s: 'რამდენიმე წამი',
            ss: '%d წამი',
            m: 'წუთი',
            mm: '%d წუთი',
            h: 'საათი',
            hh: '%d საათი',
            d: 'დღე',
            dd: '%d დღე',
            M: 'თვე',
            MM: '%d თვე',
            y: 'წელი',
            yy: '%d წელი',
        },
        dayOfMonthOrdinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,
        ordinal: function (number) {
            if (number === 0) {
                return number;
            }
            if (number === 1) {
                return number + '-ლი';
            }
            if (
                number < 20 ||
                (number <= 100 && number % 20 === 0) ||
                number % 100 === 0
            ) {
                return 'მე-' + number;
            }
            return number + '-ე';
        },
        week: {
            dow: 1,
            doy: 7,
        },
    });

    //! moment.js locale configuration

    var suffixes$1 = {
        0: '-ші',
        1: '-ші',
        2: '-ші',
        3: '-ші',
        4: '-ші',
        5: '-ші',
        6: '-шы',
        7: '-ші',
        8: '-ші',
        9: '-шы',
        10: '-шы',
        20: '-шы',
        30: '-шы',
        40: '-шы',
        50: '-ші',
        60: '-шы',
        70: '-ші',
        80: '-ші',
        90: '-шы',
        100: '-ші',
    };

    hooks.defineLocale('kk', {
        months: 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split(
            '_'
        ),
        monthsShort: 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'),
        weekdays: 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split(
            '_'
        ),
        weekdaysShort: 'жек_дүй_сей_сәр_бей_жұм_сен'.split('_'),
        weekdaysMin: 'жк_дй_сй_ср_бй_жм_сн'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Бүгін сағат] LT',
            nextDay: '[Ертең сағат] LT',
            nextWeek: 'dddd [сағат] LT',
            lastDay: '[Кеше сағат] LT',
            lastWeek: '[Өткен аптаның] dddd [сағат] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s ішінде',
            past: '%s бұрын',
            s: 'бірнеше секунд',
            ss: '%d секунд',
            m: 'бір минут',
            mm: '%d минут',
            h: 'бір сағат',
            hh: '%d сағат',
            d: 'бір күн',
            dd: '%d күн',
            M: 'бір ай',
            MM: '%d ай',
            y: 'бір жыл',
            yy: '%d жыл',
        },
        dayOfMonthOrdinalParse: /\d{1,2}-(ші|шы)/,
        ordinal: function (number) {
            var a = number % 10,
                b = number >= 100 ? 100 : null;
            return number + (suffixes$1[number] || suffixes$1[a] || suffixes$1[b]);
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var symbolMap$9 = {
            1: '១',
            2: '២',
            3: '៣',
            4: '៤',
            5: '៥',
            6: '៦',
            7: '៧',
            8: '៨',
            9: '៩',
            0: '០',
        },
        numberMap$8 = {
            '១': '1',
            '២': '2',
            '៣': '3',
            '៤': '4',
            '៥': '5',
            '៦': '6',
            '៧': '7',
            '៨': '8',
            '៩': '9',
            '០': '0',
        };

    hooks.defineLocale('km', {
        months: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split(
            '_'
        ),
        monthsShort:
            'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split(
                '_'
            ),
        weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
        weekdaysShort: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'),
        weekdaysMin: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        meridiemParse: /ព្រឹក|ល្ងាច/,
        isPM: function (input) {
            return input === 'ល្ងាច';
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'ព្រឹក';
            } else {
                return 'ល្ងាច';
            }
        },
        calendar: {
            sameDay: '[ថ្ងៃនេះ ម៉ោង] LT',
            nextDay: '[ស្អែក ម៉ោង] LT',
            nextWeek: 'dddd [ម៉ោង] LT',
            lastDay: '[ម្សិលមិញ ម៉ោង] LT',
            lastWeek: 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%sទៀត',
            past: '%sមុន',
            s: 'ប៉ុន្មានវិនាទី',
            ss: '%d វិនាទី',
            m: 'មួយនាទី',
            mm: '%d នាទី',
            h: 'មួយម៉ោង',
            hh: '%d ម៉ោង',
            d: 'មួយថ្ងៃ',
            dd: '%d ថ្ងៃ',
            M: 'មួយខែ',
            MM: '%d ខែ',
            y: 'មួយឆ្នាំ',
            yy: '%d ឆ្នាំ',
        },
        dayOfMonthOrdinalParse: /ទី\d{1,2}/,
        ordinal: 'ទី%d',
        preparse: function (string) {
            return string.replace(/[១២៣៤៥៦៧៨៩០]/g, function (match) {
                return numberMap$8[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap$9[match];
            });
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var symbolMap$a = {
            1: '೧',
            2: '೨',
            3: '೩',
            4: '೪',
            5: '೫',
            6: '೬',
            7: '೭',
            8: '೮',
            9: '೯',
            0: '೦',
        },
        numberMap$9 = {
            '೧': '1',
            '೨': '2',
            '೩': '3',
            '೪': '4',
            '೫': '5',
            '೬': '6',
            '೭': '7',
            '೮': '8',
            '೯': '9',
            '೦': '0',
        };

    hooks.defineLocale('kn', {
        months: 'ಜನವರಿ_ಫೆಬ್ರವರಿ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬರ್_ಅಕ್ಟೋಬರ್_ನವೆಂಬರ್_ಡಿಸೆಂಬರ್'.split(
            '_'
        ),
        monthsShort:
            'ಜನ_ಫೆಬ್ರ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂ_ಅಕ್ಟೋ_ನವೆಂ_ಡಿಸೆಂ'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'ಭಾನುವಾರ_ಸೋಮವಾರ_ಮಂಗಳವಾರ_ಬುಧವಾರ_ಗುರುವಾರ_ಶುಕ್ರವಾರ_ಶನಿವಾರ'.split(
            '_'
        ),
        weekdaysShort: 'ಭಾನು_ಸೋಮ_ಮಂಗಳ_ಬುಧ_ಗುರು_ಶುಕ್ರ_ಶನಿ'.split('_'),
        weekdaysMin: 'ಭಾ_ಸೋ_ಮಂ_ಬು_ಗು_ಶು_ಶ'.split('_'),
        longDateFormat: {
            LT: 'A h:mm',
            LTS: 'A h:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm',
            LLLL: 'dddd, D MMMM YYYY, A h:mm',
        },
        calendar: {
            sameDay: '[ಇಂದು] LT',
            nextDay: '[ನಾಳೆ] LT',
            nextWeek: 'dddd, LT',
            lastDay: '[ನಿನ್ನೆ] LT',
            lastWeek: '[ಕೊನೆಯ] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s ನಂತರ',
            past: '%s ಹಿಂದೆ',
            s: 'ಕೆಲವು ಕ್ಷಣಗಳು',
            ss: '%d ಸೆಕೆಂಡುಗಳು',
            m: 'ಒಂದು ನಿಮಿಷ',
            mm: '%d ನಿಮಿಷ',
            h: 'ಒಂದು ಗಂಟೆ',
            hh: '%d ಗಂಟೆ',
            d: 'ಒಂದು ದಿನ',
            dd: '%d ದಿನ',
            M: 'ಒಂದು ತಿಂಗಳು',
            MM: '%d ತಿಂಗಳು',
            y: 'ಒಂದು ವರ್ಷ',
            yy: '%d ವರ್ಷ',
        },
        preparse: function (string) {
            return string.replace(/[೧೨೩೪೫೬೭೮೯೦]/g, function (match) {
                return numberMap$9[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap$a[match];
            });
        },
        meridiemParse: /ರಾತ್ರಿ|ಬೆಳಿಗ್ಗೆ|ಮಧ್ಯಾಹ್ನ|ಸಂಜೆ/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'ರಾತ್ರಿ') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'ಬೆಳಿಗ್ಗೆ') {
                return hour;
            } else if (meridiem === 'ಮಧ್ಯಾಹ್ನ') {
                return hour >= 10 ? hour : hour + 12;
            } else if (meridiem === 'ಸಂಜೆ') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'ರಾತ್ರಿ';
            } else if (hour < 10) {
                return 'ಬೆಳಿಗ್ಗೆ';
            } else if (hour < 17) {
                return 'ಮಧ್ಯಾಹ್ನ';
            } else if (hour < 20) {
                return 'ಸಂಜೆ';
            } else {
                return 'ರಾತ್ರಿ';
            }
        },
        dayOfMonthOrdinalParse: /\d{1,2}(ನೇ)/,
        ordinal: function (number) {
            return number + 'ನೇ';
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('ko', {
        months: '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),
        monthsShort: '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split(
            '_'
        ),
        weekdays: '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'),
        weekdaysShort: '일_월_화_수_목_금_토'.split('_'),
        weekdaysMin: '일_월_화_수_목_금_토'.split('_'),
        longDateFormat: {
            LT: 'A h:mm',
            LTS: 'A h:mm:ss',
            L: 'YYYY.MM.DD.',
            LL: 'YYYY년 MMMM D일',
            LLL: 'YYYY년 MMMM D일 A h:mm',
            LLLL: 'YYYY년 MMMM D일 dddd A h:mm',
            l: 'YYYY.MM.DD.',
            ll: 'YYYY년 MMMM D일',
            lll: 'YYYY년 MMMM D일 A h:mm',
            llll: 'YYYY년 MMMM D일 dddd A h:mm',
        },
        calendar: {
            sameDay: '오늘 LT',
            nextDay: '내일 LT',
            nextWeek: 'dddd LT',
            lastDay: '어제 LT',
            lastWeek: '지난주 dddd LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s 후',
            past: '%s 전',
            s: '몇 초',
            ss: '%d초',
            m: '1분',
            mm: '%d분',
            h: '한 시간',
            hh: '%d시간',
            d: '하루',
            dd: '%d일',
            M: '한 달',
            MM: '%d달',
            y: '일 년',
            yy: '%d년',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(일|월|주)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'd':
                case 'D':
                case 'DDD':
                    return number + '일';
                case 'M':
                    return number + '월';
                case 'w':
                case 'W':
                    return number + '주';
                default:
                    return number;
            }
        },
        meridiemParse: /오전|오후/,
        isPM: function (token) {
            return token === '오후';
        },
        meridiem: function (hour, minute, isUpper) {
            return hour < 12 ? '오전' : '오후';
        },
    });

    //! moment.js locale configuration

    var symbolMap$b = {
            1: '١',
            2: '٢',
            3: '٣',
            4: '٤',
            5: '٥',
            6: '٦',
            7: '٧',
            8: '٨',
            9: '٩',
            0: '٠',
        },
        numberMap$a = {
            '١': '1',
            '٢': '2',
            '٣': '3',
            '٤': '4',
            '٥': '5',
            '٦': '6',
            '٧': '7',
            '٨': '8',
            '٩': '9',
            '٠': '0',
        },
        months$8 = [
            'کانونی دووەم',
            'شوبات',
            'ئازار',
            'نیسان',
            'ئایار',
            'حوزەیران',
            'تەمموز',
            'ئاب',
            'ئەیلوول',
            'تشرینی یەكەم',
            'تشرینی دووەم',
            'كانونی یەکەم',
        ];

    hooks.defineLocale('ku', {
        months: months$8,
        monthsShort: months$8,
        weekdays:
            'یه‌كشه‌ممه‌_دووشه‌ممه‌_سێشه‌ممه‌_چوارشه‌ممه‌_پێنجشه‌ممه‌_هه‌ینی_شه‌ممه‌'.split(
                '_'
            ),
        weekdaysShort:
            'یه‌كشه‌م_دووشه‌م_سێشه‌م_چوارشه‌م_پێنجشه‌م_هه‌ینی_شه‌ممه‌'.split('_'),
        weekdaysMin: 'ی_د_س_چ_پ_ه_ش'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        meridiemParse: /ئێواره‌|به‌یانی/,
        isPM: function (input) {
            return /ئێواره‌/.test(input);
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'به‌یانی';
            } else {
                return 'ئێواره‌';
            }
        },
        calendar: {
            sameDay: '[ئه‌مرۆ كاتژمێر] LT',
            nextDay: '[به‌یانی كاتژمێر] LT',
            nextWeek: 'dddd [كاتژمێر] LT',
            lastDay: '[دوێنێ كاتژمێر] LT',
            lastWeek: 'dddd [كاتژمێر] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'له‌ %s',
            past: '%s',
            s: 'چه‌ند چركه‌یه‌ك',
            ss: 'چركه‌ %d',
            m: 'یه‌ك خوله‌ك',
            mm: '%d خوله‌ك',
            h: 'یه‌ك كاتژمێر',
            hh: '%d كاتژمێر',
            d: 'یه‌ك ڕۆژ',
            dd: '%d ڕۆژ',
            M: 'یه‌ك مانگ',
            MM: '%d مانگ',
            y: 'یه‌ك ساڵ',
            yy: '%d ساڵ',
        },
        preparse: function (string) {
            return string
                .replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
                    return numberMap$a[match];
                })
                .replace(/،/g, ',');
        },
        postformat: function (string) {
            return string
                .replace(/\d/g, function (match) {
                    return symbolMap$b[match];
                })
                .replace(/,/g, '،');
        },
        week: {
            dow: 6, // Saturday is the first day of the week.
            doy: 12, // The week that contains Jan 12th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var suffixes$2 = {
        0: '-чү',
        1: '-чи',
        2: '-чи',
        3: '-чү',
        4: '-чү',
        5: '-чи',
        6: '-чы',
        7: '-чи',
        8: '-чи',
        9: '-чу',
        10: '-чу',
        20: '-чы',
        30: '-чу',
        40: '-чы',
        50: '-чү',
        60: '-чы',
        70: '-чи',
        80: '-чи',
        90: '-чу',
        100: '-чү',
    };

    hooks.defineLocale('ky', {
        months: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split(
            '_'
        ),
        monthsShort: 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split(
            '_'
        ),
        weekdays: 'Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби'.split(
            '_'
        ),
        weekdaysShort: 'Жек_Дүй_Шей_Шар_Бей_Жум_Ише'.split('_'),
        weekdaysMin: 'Жк_Дй_Шй_Шр_Бй_Жм_Иш'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Бүгүн саат] LT',
            nextDay: '[Эртең саат] LT',
            nextWeek: 'dddd [саат] LT',
            lastDay: '[Кечээ саат] LT',
            lastWeek: '[Өткөн аптанын] dddd [күнү] [саат] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s ичинде',
            past: '%s мурун',
            s: 'бирнече секунд',
            ss: '%d секунд',
            m: 'бир мүнөт',
            mm: '%d мүнөт',
            h: 'бир саат',
            hh: '%d саат',
            d: 'бир күн',
            dd: '%d күн',
            M: 'бир ай',
            MM: '%d ай',
            y: 'бир жыл',
            yy: '%d жыл',
        },
        dayOfMonthOrdinalParse: /\d{1,2}-(чи|чы|чү|чу)/,
        ordinal: function (number) {
            var a = number % 10,
                b = number >= 100 ? 100 : null;
            return number + (suffixes$2[number] || suffixes$2[a] || suffixes$2[b]);
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function processRelativeTime$6(number, withoutSuffix, key, isFuture) {
        var format = {
            m: ['eng Minutt', 'enger Minutt'],
            h: ['eng Stonn', 'enger Stonn'],
            d: ['een Dag', 'engem Dag'],
            M: ['ee Mount', 'engem Mount'],
            y: ['ee Joer', 'engem Joer'],
        };
        return withoutSuffix ? format[key][0] : format[key][1];
    }
    function processFutureTime(string) {
        var number = string.substr(0, string.indexOf(' '));
        if (eifelerRegelAppliesToNumber(number)) {
            return 'a ' + string;
        }
        return 'an ' + string;
    }
    function processPastTime(string) {
        var number = string.substr(0, string.indexOf(' '));
        if (eifelerRegelAppliesToNumber(number)) {
            return 'viru ' + string;
        }
        return 'virun ' + string;
    }
    /**
     * Returns true if the word before the given number loses the '-n' ending.
     * e.g. 'an 10 Deeg' but 'a 5 Deeg'
     *
     * @param number {integer}
     * @returns {boolean}
     */
    function eifelerRegelAppliesToNumber(number) {
        number = parseInt(number, 10);
        if (isNaN(number)) {
            return false;
        }
        if (number < 0) {
            // Negative Number --> always true
            return true;
        } else if (number < 10) {
            // Only 1 digit
            if (4 <= number && number <= 7) {
                return true;
            }
            return false;
        } else if (number < 100) {
            // 2 digits
            var lastDigit = number % 10,
                firstDigit = number / 10;
            if (lastDigit === 0) {
                return eifelerRegelAppliesToNumber(firstDigit);
            }
            return eifelerRegelAppliesToNumber(lastDigit);
        } else if (number < 10000) {
            // 3 or 4 digits --> recursively check first digit
            while (number >= 10) {
                number = number / 10;
            }
            return eifelerRegelAppliesToNumber(number);
        } else {
            // Anything larger than 4 digits: recursively check first n-3 digits
            number = number / 1000;
            return eifelerRegelAppliesToNumber(number);
        }
    }

    hooks.defineLocale('lb', {
        months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split(
            '_'
        ),
        monthsShort:
            'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays:
            'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split(
                '_'
            ),
        weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'),
        weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm [Auer]',
            LTS: 'H:mm:ss [Auer]',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY H:mm [Auer]',
            LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]',
        },
        calendar: {
            sameDay: '[Haut um] LT',
            sameElse: 'L',
            nextDay: '[Muer um] LT',
            nextWeek: 'dddd [um] LT',
            lastDay: '[Gëschter um] LT',
            lastWeek: function () {
                // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule
                switch (this.day()) {
                    case 2:
                    case 4:
                        return '[Leschten] dddd [um] LT';
                    default:
                        return '[Leschte] dddd [um] LT';
                }
            },
        },
        relativeTime: {
            future: processFutureTime,
            past: processPastTime,
            s: 'e puer Sekonnen',
            ss: '%d Sekonnen',
            m: processRelativeTime$6,
            mm: '%d Minutten',
            h: processRelativeTime$6,
            hh: '%d Stonnen',
            d: processRelativeTime$6,
            dd: '%d Deeg',
            M: processRelativeTime$6,
            MM: '%d Méint',
            y: processRelativeTime$6,
            yy: '%d Joer',
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('lo', {
        months: 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split(
            '_'
        ),
        monthsShort:
            'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split(
                '_'
            ),
        weekdays: 'ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),
        weekdaysShort: 'ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),
        weekdaysMin: 'ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'ວັນdddd D MMMM YYYY HH:mm',
        },
        meridiemParse: /ຕອນເຊົ້າ|ຕອນແລງ/,
        isPM: function (input) {
            return input === 'ຕອນແລງ';
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'ຕອນເຊົ້າ';
            } else {
                return 'ຕອນແລງ';
            }
        },
        calendar: {
            sameDay: '[ມື້ນີ້ເວລາ] LT',
            nextDay: '[ມື້ອື່ນເວລາ] LT',
            nextWeek: '[ວັນ]dddd[ໜ້າເວລາ] LT',
            lastDay: '[ມື້ວານນີ້ເວລາ] LT',
            lastWeek: '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'ອີກ %s',
            past: '%sຜ່ານມາ',
            s: 'ບໍ່ເທົ່າໃດວິນາທີ',
            ss: '%d ວິນາທີ',
            m: '1 ນາທີ',
            mm: '%d ນາທີ',
            h: '1 ຊົ່ວໂມງ',
            hh: '%d ຊົ່ວໂມງ',
            d: '1 ມື້',
            dd: '%d ມື້',
            M: '1 ເດືອນ',
            MM: '%d ເດືອນ',
            y: '1 ປີ',
            yy: '%d ປີ',
        },
        dayOfMonthOrdinalParse: /(ທີ່)\d{1,2}/,
        ordinal: function (number) {
            return 'ທີ່' + number;
        },
    });

    //! moment.js locale configuration

    var units = {
        ss: 'sekundė_sekundžių_sekundes',
        m: 'minutė_minutės_minutę',
        mm: 'minutės_minučių_minutes',
        h: 'valanda_valandos_valandą',
        hh: 'valandos_valandų_valandas',
        d: 'diena_dienos_dieną',
        dd: 'dienos_dienų_dienas',
        M: 'mėnuo_mėnesio_mėnesį',
        MM: 'mėnesiai_mėnesių_mėnesius',
        y: 'metai_metų_metus',
        yy: 'metai_metų_metus',
    };
    function translateSeconds(number, withoutSuffix, key, isFuture) {
        if (withoutSuffix) {
            return 'kelios sekundės';
        } else {
            return isFuture ? 'kelių sekundžių' : 'kelias sekundes';
        }
    }
    function translateSingular(number, withoutSuffix, key, isFuture) {
        return withoutSuffix
            ? forms(key)[0]
            : isFuture
            ? forms(key)[1]
            : forms(key)[2];
    }
    function special(number) {
        return number % 10 === 0 || (number > 10 && number < 20);
    }
    function forms(key) {
        return units[key].split('_');
    }
    function translate$6(number, withoutSuffix, key, isFuture) {
        var result = number + ' ';
        if (number === 1) {
            return (
                result + translateSingular(number, withoutSuffix, key[0], isFuture)
            );
        } else if (withoutSuffix) {
            return result + (special(number) ? forms(key)[1] : forms(key)[0]);
        } else {
            if (isFuture) {
                return result + forms(key)[1];
            } else {
                return result + (special(number) ? forms(key)[1] : forms(key)[2]);
            }
        }
    }
    hooks.defineLocale('lt', {
        months: {
            format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split(
                '_'
            ),
            standalone:
                'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split(
                    '_'
                ),
            isFormat: /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/,
        },
        monthsShort: 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'),
        weekdays: {
            format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split(
                '_'
            ),
            standalone:
                'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split(
                    '_'
                ),
            isFormat: /dddd HH:mm/,
        },
        weekdaysShort: 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'),
        weekdaysMin: 'S_P_A_T_K_Pn_Š'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY-MM-DD',
            LL: 'YYYY [m.] MMMM D [d.]',
            LLL: 'YYYY [m.] MMMM D [d.], HH:mm [val.]',
            LLLL: 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]',
            l: 'YYYY-MM-DD',
            ll: 'YYYY [m.] MMMM D [d.]',
            lll: 'YYYY [m.] MMMM D [d.], HH:mm [val.]',
            llll: 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]',
        },
        calendar: {
            sameDay: '[Šiandien] LT',
            nextDay: '[Rytoj] LT',
            nextWeek: 'dddd LT',
            lastDay: '[Vakar] LT',
            lastWeek: '[Praėjusį] dddd LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'po %s',
            past: 'prieš %s',
            s: translateSeconds,
            ss: translate$6,
            m: translateSingular,
            mm: translate$6,
            h: translateSingular,
            hh: translate$6,
            d: translateSingular,
            dd: translate$6,
            M: translateSingular,
            MM: translate$6,
            y: translateSingular,
            yy: translate$6,
        },
        dayOfMonthOrdinalParse: /\d{1,2}-oji/,
        ordinal: function (number) {
            return number + '-oji';
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var units$1 = {
        ss: 'sekundes_sekundēm_sekunde_sekundes'.split('_'),
        m: 'minūtes_minūtēm_minūte_minūtes'.split('_'),
        mm: 'minūtes_minūtēm_minūte_minūtes'.split('_'),
        h: 'stundas_stundām_stunda_stundas'.split('_'),
        hh: 'stundas_stundām_stunda_stundas'.split('_'),
        d: 'dienas_dienām_diena_dienas'.split('_'),
        dd: 'dienas_dienām_diena_dienas'.split('_'),
        M: 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),
        MM: 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),
        y: 'gada_gadiem_gads_gadi'.split('_'),
        yy: 'gada_gadiem_gads_gadi'.split('_'),
    };
    /**
     * @param withoutSuffix boolean true = a length of time; false = before/after a period of time.
     */
    function format$1(forms, number, withoutSuffix) {
        if (withoutSuffix) {
            // E.g. "21 minūte", "3 minūtes".
            return number % 10 === 1 && number % 100 !== 11 ? forms[2] : forms[3];
        } else {
            // E.g. "21 minūtes" as in "pēc 21 minūtes".
            // E.g. "3 minūtēm" as in "pēc 3 minūtēm".
            return number % 10 === 1 && number % 100 !== 11 ? forms[0] : forms[1];
        }
    }
    function relativeTimeWithPlural$1(number, withoutSuffix, key) {
        return number + ' ' + format$1(units$1[key], number, withoutSuffix);
    }
    function relativeTimeWithSingular(number, withoutSuffix, key) {
        return format$1(units$1[key], number, withoutSuffix);
    }
    function relativeSeconds(number, withoutSuffix) {
        return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm';
    }

    hooks.defineLocale('lv', {
        months: 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split(
            '_'
        ),
        monthsShort: 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'),
        weekdays:
            'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split(
                '_'
            ),
        weekdaysShort: 'Sv_P_O_T_C_Pk_S'.split('_'),
        weekdaysMin: 'Sv_P_O_T_C_Pk_S'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY.',
            LL: 'YYYY. [gada] D. MMMM',
            LLL: 'YYYY. [gada] D. MMMM, HH:mm',
            LLLL: 'YYYY. [gada] D. MMMM, dddd, HH:mm',
        },
        calendar: {
            sameDay: '[Šodien pulksten] LT',
            nextDay: '[Rīt pulksten] LT',
            nextWeek: 'dddd [pulksten] LT',
            lastDay: '[Vakar pulksten] LT',
            lastWeek: '[Pagājušā] dddd [pulksten] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'pēc %s',
            past: 'pirms %s',
            s: relativeSeconds,
            ss: relativeTimeWithPlural$1,
            m: relativeTimeWithSingular,
            mm: relativeTimeWithPlural$1,
            h: relativeTimeWithSingular,
            hh: relativeTimeWithPlural$1,
            d: relativeTimeWithSingular,
            dd: relativeTimeWithPlural$1,
            M: relativeTimeWithSingular,
            MM: relativeTimeWithPlural$1,
            y: relativeTimeWithSingular,
            yy: relativeTimeWithPlural$1,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var translator = {
        words: {
            //Different grammatical cases
            ss: ['sekund', 'sekunda', 'sekundi'],
            m: ['jedan minut', 'jednog minuta'],
            mm: ['minut', 'minuta', 'minuta'],
            h: ['jedan sat', 'jednog sata'],
            hh: ['sat', 'sata', 'sati'],
            dd: ['dan', 'dana', 'dana'],
            MM: ['mjesec', 'mjeseca', 'mjeseci'],
            yy: ['godina', 'godine', 'godina'],
        },
        correctGrammaticalCase: function (number, wordKey) {
            return number === 1
                ? wordKey[0]
                : number >= 2 && number <= 4
                ? wordKey[1]
                : wordKey[2];
        },
        translate: function (number, withoutSuffix, key) {
            var wordKey = translator.words[key];
            if (key.length === 1) {
                return withoutSuffix ? wordKey[0] : wordKey[1];
            } else {
                return (
                    number +
                    ' ' +
                    translator.correctGrammaticalCase(number, wordKey)
                );
            }
        },
    };

    hooks.defineLocale('me', {
        months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split(
            '_'
        ),
        monthsShort:
            'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),
        monthsParseExact: true,
        weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split(
            '_'
        ),
        weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
        weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY H:mm',
            LLLL: 'dddd, D. MMMM YYYY H:mm',
        },
        calendar: {
            sameDay: '[danas u] LT',
            nextDay: '[sjutra u] LT',

            nextWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[u] [nedjelju] [u] LT';
                    case 3:
                        return '[u] [srijedu] [u] LT';
                    case 6:
                        return '[u] [subotu] [u] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[u] dddd [u] LT';
                }
            },
            lastDay: '[juče u] LT',
            lastWeek: function () {
                var lastWeekDays = [
                    '[prošle] [nedjelje] [u] LT',
                    '[prošlog] [ponedjeljka] [u] LT',
                    '[prošlog] [utorka] [u] LT',
                    '[prošle] [srijede] [u] LT',
                    '[prošlog] [četvrtka] [u] LT',
                    '[prošlog] [petka] [u] LT',
                    '[prošle] [subote] [u] LT',
                ];
                return lastWeekDays[this.day()];
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'za %s',
            past: 'prije %s',
            s: 'nekoliko sekundi',
            ss: translator.translate,
            m: translator.translate,
            mm: translator.translate,
            h: translator.translate,
            hh: translator.translate,
            d: 'dan',
            dd: translator.translate,
            M: 'mjesec',
            MM: translator.translate,
            y: 'godinu',
            yy: translator.translate,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('mi', {
        months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split(
            '_'
        ),
        monthsShort:
            'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split(
                '_'
            ),
        monthsRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
        monthsStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
        monthsShortRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
        monthsShortStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,
        weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'),
        weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),
        weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY [i] HH:mm',
            LLLL: 'dddd, D MMMM YYYY [i] HH:mm',
        },
        calendar: {
            sameDay: '[i teie mahana, i] LT',
            nextDay: '[apopo i] LT',
            nextWeek: 'dddd [i] LT',
            lastDay: '[inanahi i] LT',
            lastWeek: 'dddd [whakamutunga i] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'i roto i %s',
            past: '%s i mua',
            s: 'te hēkona ruarua',
            ss: '%d hēkona',
            m: 'he meneti',
            mm: '%d meneti',
            h: 'te haora',
            hh: '%d haora',
            d: 'he ra',
            dd: '%d ra',
            M: 'he marama',
            MM: '%d marama',
            y: 'he tau',
            yy: '%d tau',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('mk', {
        months: 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split(
            '_'
        ),
        monthsShort: 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'),
        weekdays: 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split(
            '_'
        ),
        weekdaysShort: 'нед_пон_вто_сре_чет_пет_саб'.split('_'),
        weekdaysMin: 'нe_пo_вт_ср_че_пе_сa'.split('_'),
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'D.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY H:mm',
            LLLL: 'dddd, D MMMM YYYY H:mm',
        },
        calendar: {
            sameDay: '[Денес во] LT',
            nextDay: '[Утре во] LT',
            nextWeek: '[Во] dddd [во] LT',
            lastDay: '[Вчера во] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                    case 3:
                    case 6:
                        return '[Изминатата] dddd [во] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[Изминатиот] dddd [во] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'за %s',
            past: 'пред %s',
            s: 'неколку секунди',
            ss: '%d секунди',
            m: 'една минута',
            mm: '%d минути',
            h: 'еден час',
            hh: '%d часа',
            d: 'еден ден',
            dd: '%d дена',
            M: 'еден месец',
            MM: '%d месеци',
            y: 'една година',
            yy: '%d години',
        },
        dayOfMonthOrdinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/,
        ordinal: function (number) {
            var lastDigit = number % 10,
                last2Digits = number % 100;
            if (number === 0) {
                return number + '-ев';
            } else if (last2Digits === 0) {
                return number + '-ен';
            } else if (last2Digits > 10 && last2Digits < 20) {
                return number + '-ти';
            } else if (lastDigit === 1) {
                return number + '-ви';
            } else if (lastDigit === 2) {
                return number + '-ри';
            } else if (lastDigit === 7 || lastDigit === 8) {
                return number + '-ми';
            } else {
                return number + '-ти';
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('ml', {
        months: 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split(
            '_'
        ),
        monthsShort:
            'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays:
            'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split(
                '_'
            ),
        weekdaysShort: 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'),
        weekdaysMin: 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'),
        longDateFormat: {
            LT: 'A h:mm -നു',
            LTS: 'A h:mm:ss -നു',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm -നു',
            LLLL: 'dddd, D MMMM YYYY, A h:mm -നു',
        },
        calendar: {
            sameDay: '[ഇന്ന്] LT',
            nextDay: '[നാളെ] LT',
            nextWeek: 'dddd, LT',
            lastDay: '[ഇന്നലെ] LT',
            lastWeek: '[കഴിഞ്ഞ] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s കഴിഞ്ഞ്',
            past: '%s മുൻപ്',
            s: 'അൽപ നിമിഷങ്ങൾ',
            ss: '%d സെക്കൻഡ്',
            m: 'ഒരു മിനിറ്റ്',
            mm: '%d മിനിറ്റ്',
            h: 'ഒരു മണിക്കൂർ',
            hh: '%d മണിക്കൂർ',
            d: 'ഒരു ദിവസം',
            dd: '%d ദിവസം',
            M: 'ഒരു മാസം',
            MM: '%d മാസം',
            y: 'ഒരു വർഷം',
            yy: '%d വർഷം',
        },
        meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (
                (meridiem === 'രാത്രി' && hour >= 4) ||
                meridiem === 'ഉച്ച കഴിഞ്ഞ്' ||
                meridiem === 'വൈകുന്നേരം'
            ) {
                return hour + 12;
            } else {
                return hour;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'രാത്രി';
            } else if (hour < 12) {
                return 'രാവിലെ';
            } else if (hour < 17) {
                return 'ഉച്ച കഴിഞ്ഞ്';
            } else if (hour < 20) {
                return 'വൈകുന്നേരം';
            } else {
                return 'രാത്രി';
            }
        },
    });

    //! moment.js locale configuration

    function translate$7(number, withoutSuffix, key, isFuture) {
        switch (key) {
            case 's':
                return withoutSuffix ? 'хэдхэн секунд' : 'хэдхэн секундын';
            case 'ss':
                return number + (withoutSuffix ? ' секунд' : ' секундын');
            case 'm':
            case 'mm':
                return number + (withoutSuffix ? ' минут' : ' минутын');
            case 'h':
            case 'hh':
                return number + (withoutSuffix ? ' цаг' : ' цагийн');
            case 'd':
            case 'dd':
                return number + (withoutSuffix ? ' өдөр' : ' өдрийн');
            case 'M':
            case 'MM':
                return number + (withoutSuffix ? ' сар' : ' сарын');
            case 'y':
            case 'yy':
                return number + (withoutSuffix ? ' жил' : ' жилийн');
            default:
                return number;
        }
    }

    hooks.defineLocale('mn', {
        months: 'Нэгдүгээр сар_Хоёрдугаар сар_Гуравдугаар сар_Дөрөвдүгээр сар_Тавдугаар сар_Зургадугаар сар_Долдугаар сар_Наймдугаар сар_Есдүгээр сар_Аравдугаар сар_Арван нэгдүгээр сар_Арван хоёрдугаар сар'.split(
            '_'
        ),
        monthsShort:
            '1 сар_2 сар_3 сар_4 сар_5 сар_6 сар_7 сар_8 сар_9 сар_10 сар_11 сар_12 сар'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'Ням_Даваа_Мягмар_Лхагва_Пүрэв_Баасан_Бямба'.split('_'),
        weekdaysShort: 'Ням_Дав_Мяг_Лха_Пүр_Баа_Бям'.split('_'),
        weekdaysMin: 'Ня_Да_Мя_Лх_Пү_Ба_Бя'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY-MM-DD',
            LL: 'YYYY оны MMMMын D',
            LLL: 'YYYY оны MMMMын D HH:mm',
            LLLL: 'dddd, YYYY оны MMMMын D HH:mm',
        },
        meridiemParse: /ҮӨ|ҮХ/i,
        isPM: function (input) {
            return input === 'ҮХ';
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'ҮӨ';
            } else {
                return 'ҮХ';
            }
        },
        calendar: {
            sameDay: '[Өнөөдөр] LT',
            nextDay: '[Маргааш] LT',
            nextWeek: '[Ирэх] dddd LT',
            lastDay: '[Өчигдөр] LT',
            lastWeek: '[Өнгөрсөн] dddd LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s дараа',
            past: '%s өмнө',
            s: translate$7,
            ss: translate$7,
            m: translate$7,
            mm: translate$7,
            h: translate$7,
            hh: translate$7,
            d: translate$7,
            dd: translate$7,
            M: translate$7,
            MM: translate$7,
            y: translate$7,
            yy: translate$7,
        },
        dayOfMonthOrdinalParse: /\d{1,2} өдөр/,
        ordinal: function (number, period) {
            switch (period) {
                case 'd':
                case 'D':
                case 'DDD':
                    return number + ' өдөр';
                default:
                    return number;
            }
        },
    });

    //! moment.js locale configuration

    var symbolMap$c = {
            1: '१',
            2: '२',
            3: '३',
            4: '४',
            5: '५',
            6: '६',
            7: '७',
            8: '८',
            9: '९',
            0: '०',
        },
        numberMap$b = {
            '१': '1',
            '२': '2',
            '३': '3',
            '४': '4',
            '५': '5',
            '६': '6',
            '७': '7',
            '८': '8',
            '९': '9',
            '०': '0',
        };

    function relativeTimeMr(number, withoutSuffix, string, isFuture) {
        var output = '';
        if (withoutSuffix) {
            switch (string) {
                case 's':
                    output = 'काही सेकंद';
                    break;
                case 'ss':
                    output = '%d सेकंद';
                    break;
                case 'm':
                    output = 'एक मिनिट';
                    break;
                case 'mm':
                    output = '%d मिनिटे';
                    break;
                case 'h':
                    output = 'एक तास';
                    break;
                case 'hh':
                    output = '%d तास';
                    break;
                case 'd':
                    output = 'एक दिवस';
                    break;
                case 'dd':
                    output = '%d दिवस';
                    break;
                case 'M':
                    output = 'एक महिना';
                    break;
                case 'MM':
                    output = '%d महिने';
                    break;
                case 'y':
                    output = 'एक वर्ष';
                    break;
                case 'yy':
                    output = '%d वर्षे';
                    break;
            }
        } else {
            switch (string) {
                case 's':
                    output = 'काही सेकंदां';
                    break;
                case 'ss':
                    output = '%d सेकंदां';
                    break;
                case 'm':
                    output = 'एका मिनिटा';
                    break;
                case 'mm':
                    output = '%d मिनिटां';
                    break;
                case 'h':
                    output = 'एका तासा';
                    break;
                case 'hh':
                    output = '%d तासां';
                    break;
                case 'd':
                    output = 'एका दिवसा';
                    break;
                case 'dd':
                    output = '%d दिवसां';
                    break;
                case 'M':
                    output = 'एका महिन्या';
                    break;
                case 'MM':
                    output = '%d महिन्यां';
                    break;
                case 'y':
                    output = 'एका वर्षा';
                    break;
                case 'yy':
                    output = '%d वर्षां';
                    break;
            }
        }
        return output.replace(/%d/i, number);
    }

    hooks.defineLocale('mr', {
        months: 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split(
            '_'
        ),
        monthsShort:
            'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
        weekdaysShort: 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'),
        weekdaysMin: 'र_सो_मं_बु_गु_शु_श'.split('_'),
        longDateFormat: {
            LT: 'A h:mm वाजता',
            LTS: 'A h:mm:ss वाजता',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm वाजता',
            LLLL: 'dddd, D MMMM YYYY, A h:mm वाजता',
        },
        calendar: {
            sameDay: '[आज] LT',
            nextDay: '[उद्या] LT',
            nextWeek: 'dddd, LT',
            lastDay: '[काल] LT',
            lastWeek: '[मागील] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%sमध्ये',
            past: '%sपूर्वी',
            s: relativeTimeMr,
            ss: relativeTimeMr,
            m: relativeTimeMr,
            mm: relativeTimeMr,
            h: relativeTimeMr,
            hh: relativeTimeMr,
            d: relativeTimeMr,
            dd: relativeTimeMr,
            M: relativeTimeMr,
            MM: relativeTimeMr,
            y: relativeTimeMr,
            yy: relativeTimeMr,
        },
        preparse: function (string) {
            return string.replace(/[१२३४५६७८९०]/g, function (match) {
                return numberMap$b[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap$c[match];
            });
        },
        meridiemParse: /पहाटे|सकाळी|दुपारी|सायंकाळी|रात्री/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'पहाटे' || meridiem === 'सकाळी') {
                return hour;
            } else if (
                meridiem === 'दुपारी' ||
                meridiem === 'सायंकाळी' ||
                meridiem === 'रात्री'
            ) {
                return hour >= 12 ? hour : hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour >= 0 && hour < 6) {
                return 'पहाटे';
            } else if (hour < 12) {
                return 'सकाळी';
            } else if (hour < 17) {
                return 'दुपारी';
            } else if (hour < 20) {
                return 'सायंकाळी';
            } else {
                return 'रात्री';
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('ms-my', {
        months: 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),
        weekdays: 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),
        weekdaysShort: 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),
        weekdaysMin: 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
        longDateFormat: {
            LT: 'HH.mm',
            LTS: 'HH.mm.ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY [pukul] HH.mm',
            LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',
        },
        meridiemParse: /pagi|tengahari|petang|malam/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'pagi') {
                return hour;
            } else if (meridiem === 'tengahari') {
                return hour >= 11 ? hour : hour + 12;
            } else if (meridiem === 'petang' || meridiem === 'malam') {
                return hour + 12;
            }
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours < 11) {
                return 'pagi';
            } else if (hours < 15) {
                return 'tengahari';
            } else if (hours < 19) {
                return 'petang';
            } else {
                return 'malam';
            }
        },
        calendar: {
            sameDay: '[Hari ini pukul] LT',
            nextDay: '[Esok pukul] LT',
            nextWeek: 'dddd [pukul] LT',
            lastDay: '[Kelmarin pukul] LT',
            lastWeek: 'dddd [lepas pukul] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'dalam %s',
            past: '%s yang lepas',
            s: 'beberapa saat',
            ss: '%d saat',
            m: 'seminit',
            mm: '%d minit',
            h: 'sejam',
            hh: '%d jam',
            d: 'sehari',
            dd: '%d hari',
            M: 'sebulan',
            MM: '%d bulan',
            y: 'setahun',
            yy: '%d tahun',
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('ms', {
        months: 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),
        weekdays: 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),
        weekdaysShort: 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),
        weekdaysMin: 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
        longDateFormat: {
            LT: 'HH.mm',
            LTS: 'HH.mm.ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY [pukul] HH.mm',
            LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',
        },
        meridiemParse: /pagi|tengahari|petang|malam/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'pagi') {
                return hour;
            } else if (meridiem === 'tengahari') {
                return hour >= 11 ? hour : hour + 12;
            } else if (meridiem === 'petang' || meridiem === 'malam') {
                return hour + 12;
            }
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours < 11) {
                return 'pagi';
            } else if (hours < 15) {
                return 'tengahari';
            } else if (hours < 19) {
                return 'petang';
            } else {
                return 'malam';
            }
        },
        calendar: {
            sameDay: '[Hari ini pukul] LT',
            nextDay: '[Esok pukul] LT',
            nextWeek: 'dddd [pukul] LT',
            lastDay: '[Kelmarin pukul] LT',
            lastWeek: 'dddd [lepas pukul] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'dalam %s',
            past: '%s yang lepas',
            s: 'beberapa saat',
            ss: '%d saat',
            m: 'seminit',
            mm: '%d minit',
            h: 'sejam',
            hh: '%d jam',
            d: 'sehari',
            dd: '%d hari',
            M: 'sebulan',
            MM: '%d bulan',
            y: 'setahun',
            yy: '%d tahun',
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('mt', {
        months: 'Jannar_Frar_Marzu_April_Mejju_Ġunju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Diċembru'.split(
            '_'
        ),
        monthsShort: 'Jan_Fra_Mar_Apr_Mej_Ġun_Lul_Aww_Set_Ott_Nov_Diċ'.split('_'),
        weekdays:
            'Il-Ħadd_It-Tnejn_It-Tlieta_L-Erbgħa_Il-Ħamis_Il-Ġimgħa_Is-Sibt'.split(
                '_'
            ),
        weekdaysShort: 'Ħad_Tne_Tli_Erb_Ħam_Ġim_Sib'.split('_'),
        weekdaysMin: 'Ħa_Tn_Tl_Er_Ħa_Ġi_Si'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Illum fil-]LT',
            nextDay: '[Għada fil-]LT',
            nextWeek: 'dddd [fil-]LT',
            lastDay: '[Il-bieraħ fil-]LT',
            lastWeek: 'dddd [li għadda] [fil-]LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'f’ %s',
            past: '%s ilu',
            s: 'ftit sekondi',
            ss: '%d sekondi',
            m: 'minuta',
            mm: '%d minuti',
            h: 'siegħa',
            hh: '%d siegħat',
            d: 'ġurnata',
            dd: '%d ġranet',
            M: 'xahar',
            MM: '%d xhur',
            y: 'sena',
            yy: '%d sni',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var symbolMap$d = {
            1: '၁',
            2: '၂',
            3: '၃',
            4: '၄',
            5: '၅',
            6: '၆',
            7: '၇',
            8: '၈',
            9: '၉',
            0: '၀',
        },
        numberMap$c = {
            '၁': '1',
            '၂': '2',
            '၃': '3',
            '၄': '4',
            '၅': '5',
            '၆': '6',
            '၇': '7',
            '၈': '8',
            '၉': '9',
            '၀': '0',
        };

    hooks.defineLocale('my', {
        months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split(
            '_'
        ),
        monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'),
        weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split(
            '_'
        ),
        weekdaysShort: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
        weekdaysMin: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),

        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[ယနေ.] LT [မှာ]',
            nextDay: '[မနက်ဖြန်] LT [မှာ]',
            nextWeek: 'dddd LT [မှာ]',
            lastDay: '[မနေ.က] LT [မှာ]',
            lastWeek: '[ပြီးခဲ့သော] dddd LT [မှာ]',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'လာမည့် %s မှာ',
            past: 'လွန်ခဲ့သော %s က',
            s: 'စက္ကန်.အနည်းငယ်',
            ss: '%d စက္ကန့်',
            m: 'တစ်မိနစ်',
            mm: '%d မိနစ်',
            h: 'တစ်နာရီ',
            hh: '%d နာရီ',
            d: 'တစ်ရက်',
            dd: '%d ရက်',
            M: 'တစ်လ',
            MM: '%d လ',
            y: 'တစ်နှစ်',
            yy: '%d နှစ်',
        },
        preparse: function (string) {
            return string.replace(/[၁၂၃၄၅၆၇၈၉၀]/g, function (match) {
                return numberMap$c[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap$d[match];
            });
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('nb', {
        months: 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split(
            '_'
        ),
        monthsShort:
            'jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),
        monthsParseExact: true,
        weekdays: 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
        weekdaysShort: 'sø._ma._ti._on._to._fr._lø.'.split('_'),
        weekdaysMin: 'sø_ma_ti_on_to_fr_lø'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY [kl.] HH:mm',
            LLLL: 'dddd D. MMMM YYYY [kl.] HH:mm',
        },
        calendar: {
            sameDay: '[i dag kl.] LT',
            nextDay: '[i morgen kl.] LT',
            nextWeek: 'dddd [kl.] LT',
            lastDay: '[i går kl.] LT',
            lastWeek: '[forrige] dddd [kl.] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'om %s',
            past: '%s siden',
            s: 'noen sekunder',
            ss: '%d sekunder',
            m: 'ett minutt',
            mm: '%d minutter',
            h: 'en time',
            hh: '%d timer',
            d: 'en dag',
            dd: '%d dager',
            w: 'en uke',
            ww: '%d uker',
            M: 'en måned',
            MM: '%d måneder',
            y: 'ett år',
            yy: '%d år',
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var symbolMap$e = {
            1: '१',
            2: '२',
            3: '३',
            4: '४',
            5: '५',
            6: '६',
            7: '७',
            8: '८',
            9: '९',
            0: '०',
        },
        numberMap$d = {
            '१': '1',
            '२': '2',
            '३': '3',
            '४': '4',
            '५': '5',
            '६': '6',
            '७': '7',
            '८': '8',
            '९': '9',
            '०': '0',
        };

    hooks.defineLocale('ne', {
        months: 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split(
            '_'
        ),
        monthsShort:
            'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split(
            '_'
        ),
        weekdaysShort: 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'),
        weekdaysMin: 'आ._सो._मं._बु._बि._शु._श.'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'Aको h:mm बजे',
            LTS: 'Aको h:mm:ss बजे',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, Aको h:mm बजे',
            LLLL: 'dddd, D MMMM YYYY, Aको h:mm बजे',
        },
        preparse: function (string) {
            return string.replace(/[१२३४५६७८९०]/g, function (match) {
                return numberMap$d[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap$e[match];
            });
        },
        meridiemParse: /राति|बिहान|दिउँसो|साँझ/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'राति') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'बिहान') {
                return hour;
            } else if (meridiem === 'दिउँसो') {
                return hour >= 10 ? hour : hour + 12;
            } else if (meridiem === 'साँझ') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 3) {
                return 'राति';
            } else if (hour < 12) {
                return 'बिहान';
            } else if (hour < 16) {
                return 'दिउँसो';
            } else if (hour < 20) {
                return 'साँझ';
            } else {
                return 'राति';
            }
        },
        calendar: {
            sameDay: '[आज] LT',
            nextDay: '[भोलि] LT',
            nextWeek: '[आउँदो] dddd[,] LT',
            lastDay: '[हिजो] LT',
            lastWeek: '[गएको] dddd[,] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%sमा',
            past: '%s अगाडि',
            s: 'केही क्षण',
            ss: '%d सेकेण्ड',
            m: 'एक मिनेट',
            mm: '%d मिनेट',
            h: 'एक घण्टा',
            hh: '%d घण्टा',
            d: 'एक दिन',
            dd: '%d दिन',
            M: 'एक महिना',
            MM: '%d महिना',
            y: 'एक बर्ष',
            yy: '%d बर्ष',
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var monthsShortWithDots$1 =
            'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),
        monthsShortWithoutDots$1 =
            'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'),
        monthsParse$8 = [
            /^jan/i,
            /^feb/i,
            /^maart|mrt.?$/i,
            /^apr/i,
            /^mei$/i,
            /^jun[i.]?$/i,
            /^jul[i.]?$/i,
            /^aug/i,
            /^sep/i,
            /^okt/i,
            /^nov/i,
            /^dec/i,
        ],
        monthsRegex$8 =
            /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;

    hooks.defineLocale('nl-be', {
        months: 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split(
            '_'
        ),
        monthsShort: function (m, format) {
            if (!m) {
                return monthsShortWithDots$1;
            } else if (/-MMM-/.test(format)) {
                return monthsShortWithoutDots$1[m.month()];
            } else {
                return monthsShortWithDots$1[m.month()];
            }
        },

        monthsRegex: monthsRegex$8,
        monthsShortRegex: monthsRegex$8,
        monthsStrictRegex:
            /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,
        monthsShortStrictRegex:
            /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,

        monthsParse: monthsParse$8,
        longMonthsParse: monthsParse$8,
        shortMonthsParse: monthsParse$8,

        weekdays:
            'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
        weekdaysShort: 'zo._ma._di._wo._do._vr._za.'.split('_'),
        weekdaysMin: 'zo_ma_di_wo_do_vr_za'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[vandaag om] LT',
            nextDay: '[morgen om] LT',
            nextWeek: 'dddd [om] LT',
            lastDay: '[gisteren om] LT',
            lastWeek: '[afgelopen] dddd [om] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'over %s',
            past: '%s geleden',
            s: 'een paar seconden',
            ss: '%d seconden',
            m: 'één minuut',
            mm: '%d minuten',
            h: 'één uur',
            hh: '%d uur',
            d: 'één dag',
            dd: '%d dagen',
            M: 'één maand',
            MM: '%d maanden',
            y: 'één jaar',
            yy: '%d jaar',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/,
        ordinal: function (number) {
            return (
                number +
                (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')
            );
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var monthsShortWithDots$2 =
            'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),
        monthsShortWithoutDots$2 =
            'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'),
        monthsParse$9 = [
            /^jan/i,
            /^feb/i,
            /^maart|mrt.?$/i,
            /^apr/i,
            /^mei$/i,
            /^jun[i.]?$/i,
            /^jul[i.]?$/i,
            /^aug/i,
            /^sep/i,
            /^okt/i,
            /^nov/i,
            /^dec/i,
        ],
        monthsRegex$9 =
            /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;

    hooks.defineLocale('nl', {
        months: 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split(
            '_'
        ),
        monthsShort: function (m, format) {
            if (!m) {
                return monthsShortWithDots$2;
            } else if (/-MMM-/.test(format)) {
                return monthsShortWithoutDots$2[m.month()];
            } else {
                return monthsShortWithDots$2[m.month()];
            }
        },

        monthsRegex: monthsRegex$9,
        monthsShortRegex: monthsRegex$9,
        monthsStrictRegex:
            /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,
        monthsShortStrictRegex:
            /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,

        monthsParse: monthsParse$9,
        longMonthsParse: monthsParse$9,
        shortMonthsParse: monthsParse$9,

        weekdays:
            'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
        weekdaysShort: 'zo._ma._di._wo._do._vr._za.'.split('_'),
        weekdaysMin: 'zo_ma_di_wo_do_vr_za'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD-MM-YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[vandaag om] LT',
            nextDay: '[morgen om] LT',
            nextWeek: 'dddd [om] LT',
            lastDay: '[gisteren om] LT',
            lastWeek: '[afgelopen] dddd [om] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'over %s',
            past: '%s geleden',
            s: 'een paar seconden',
            ss: '%d seconden',
            m: 'één minuut',
            mm: '%d minuten',
            h: 'één uur',
            hh: '%d uur',
            d: 'één dag',
            dd: '%d dagen',
            w: 'één week',
            ww: '%d weken',
            M: 'één maand',
            MM: '%d maanden',
            y: 'één jaar',
            yy: '%d jaar',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/,
        ordinal: function (number) {
            return (
                number +
                (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')
            );
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('nn', {
        months: 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split(
            '_'
        ),
        monthsShort:
            'jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),
        monthsParseExact: true,
        weekdays: 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'),
        weekdaysShort: 'su._må._ty._on._to._fr._lau.'.split('_'),
        weekdaysMin: 'su_må_ty_on_to_fr_la'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY [kl.] H:mm',
            LLLL: 'dddd D. MMMM YYYY [kl.] HH:mm',
        },
        calendar: {
            sameDay: '[I dag klokka] LT',
            nextDay: '[I morgon klokka] LT',
            nextWeek: 'dddd [klokka] LT',
            lastDay: '[I går klokka] LT',
            lastWeek: '[Føregåande] dddd [klokka] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'om %s',
            past: '%s sidan',
            s: 'nokre sekund',
            ss: '%d sekund',
            m: 'eit minutt',
            mm: '%d minutt',
            h: 'ein time',
            hh: '%d timar',
            d: 'ein dag',
            dd: '%d dagar',
            w: 'ei veke',
            ww: '%d veker',
            M: 'ein månad',
            MM: '%d månader',
            y: 'eit år',
            yy: '%d år',
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('oc-lnc', {
        months: {
            standalone:
                'genièr_febrièr_març_abril_mai_junh_julhet_agost_setembre_octòbre_novembre_decembre'.split(
                    '_'
                ),
            format: "de genièr_de febrièr_de març_d'abril_de mai_de junh_de julhet_d'agost_de setembre_d'octòbre_de novembre_de decembre".split(
                '_'
            ),
            isFormat: /D[oD]?(\s)+MMMM/,
        },
        monthsShort:
            'gen._febr._març_abr._mai_junh_julh._ago._set._oct._nov._dec.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'dimenge_diluns_dimars_dimècres_dijòus_divendres_dissabte'.split(
            '_'
        ),
        weekdaysShort: 'dg._dl._dm._dc._dj._dv._ds.'.split('_'),
        weekdaysMin: 'dg_dl_dm_dc_dj_dv_ds'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM [de] YYYY',
            ll: 'D MMM YYYY',
            LLL: 'D MMMM [de] YYYY [a] H:mm',
            lll: 'D MMM YYYY, H:mm',
            LLLL: 'dddd D MMMM [de] YYYY [a] H:mm',
            llll: 'ddd D MMM YYYY, H:mm',
        },
        calendar: {
            sameDay: '[uèi a] LT',
            nextDay: '[deman a] LT',
            nextWeek: 'dddd [a] LT',
            lastDay: '[ièr a] LT',
            lastWeek: 'dddd [passat a] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: "d'aquí %s",
            past: 'fa %s',
            s: 'unas segondas',
            ss: '%d segondas',
            m: 'una minuta',
            mm: '%d minutas',
            h: 'una ora',
            hh: '%d oras',
            d: 'un jorn',
            dd: '%d jorns',
            M: 'un mes',
            MM: '%d meses',
            y: 'un an',
            yy: '%d ans',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(r|n|t|è|a)/,
        ordinal: function (number, period) {
            var output =
                number === 1
                    ? 'r'
                    : number === 2
                    ? 'n'
                    : number === 3
                    ? 'r'
                    : number === 4
                    ? 't'
                    : 'è';
            if (period === 'w' || period === 'W') {
                output = 'a';
            }
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4,
        },
    });

    //! moment.js locale configuration

    var symbolMap$f = {
            1: '੧',
            2: '੨',
            3: '੩',
            4: '੪',
            5: '੫',
            6: '੬',
            7: '੭',
            8: '੮',
            9: '੯',
            0: '੦',
        },
        numberMap$e = {
            '੧': '1',
            '੨': '2',
            '੩': '3',
            '੪': '4',
            '੫': '5',
            '੬': '6',
            '੭': '7',
            '੮': '8',
            '੯': '9',
            '੦': '0',
        };

    hooks.defineLocale('pa-in', {
        // There are months name as per Nanakshahi Calendar but they are not used as rigidly in modern Punjabi.
        months: 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split(
            '_'
        ),
        monthsShort:
            'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split(
                '_'
            ),
        weekdays: 'ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ'.split(
            '_'
        ),
        weekdaysShort: 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),
        weekdaysMin: 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),
        longDateFormat: {
            LT: 'A h:mm ਵਜੇ',
            LTS: 'A h:mm:ss ਵਜੇ',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm ਵਜੇ',
            LLLL: 'dddd, D MMMM YYYY, A h:mm ਵਜੇ',
        },
        calendar: {
            sameDay: '[ਅਜ] LT',
            nextDay: '[ਕਲ] LT',
            nextWeek: '[ਅਗਲਾ] dddd, LT',
            lastDay: '[ਕਲ] LT',
            lastWeek: '[ਪਿਛਲੇ] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s ਵਿੱਚ',
            past: '%s ਪਿਛਲੇ',
            s: 'ਕੁਝ ਸਕਿੰਟ',
            ss: '%d ਸਕਿੰਟ',
            m: 'ਇਕ ਮਿੰਟ',
            mm: '%d ਮਿੰਟ',
            h: 'ਇੱਕ ਘੰਟਾ',
            hh: '%d ਘੰਟੇ',
            d: 'ਇੱਕ ਦਿਨ',
            dd: '%d ਦਿਨ',
            M: 'ਇੱਕ ਮਹੀਨਾ',
            MM: '%d ਮਹੀਨੇ',
            y: 'ਇੱਕ ਸਾਲ',
            yy: '%d ਸਾਲ',
        },
        preparse: function (string) {
            return string.replace(/[੧੨੩੪੫੬੭੮੯੦]/g, function (match) {
                return numberMap$e[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap$f[match];
            });
        },
        // Punjabi notation for meridiems are quite fuzzy in practice. While there exists
        // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi.
        meridiemParse: /ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'ਰਾਤ') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'ਸਵੇਰ') {
                return hour;
            } else if (meridiem === 'ਦੁਪਹਿਰ') {
                return hour >= 10 ? hour : hour + 12;
            } else if (meridiem === 'ਸ਼ਾਮ') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'ਰਾਤ';
            } else if (hour < 10) {
                return 'ਸਵੇਰ';
            } else if (hour < 17) {
                return 'ਦੁਪਹਿਰ';
            } else if (hour < 20) {
                return 'ਸ਼ਾਮ';
            } else {
                return 'ਰਾਤ';
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var monthsNominative =
            'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split(
                '_'
            ),
        monthsSubjective =
            'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split(
                '_'
            ),
        monthsParse$a = [
            /^sty/i,
            /^lut/i,
            /^mar/i,
            /^kwi/i,
            /^maj/i,
            /^cze/i,
            /^lip/i,
            /^sie/i,
            /^wrz/i,
            /^paź/i,
            /^lis/i,
            /^gru/i,
        ];
    function plural$3(n) {
        return n % 10 < 5 && n % 10 > 1 && ~~(n / 10) % 10 !== 1;
    }
    function translate$8(number, withoutSuffix, key) {
        var result = number + ' ';
        switch (key) {
            case 'ss':
                return result + (plural$3(number) ? 'sekundy' : 'sekund');
            case 'm':
                return withoutSuffix ? 'minuta' : 'minutę';
            case 'mm':
                return result + (plural$3(number) ? 'minuty' : 'minut');
            case 'h':
                return withoutSuffix ? 'godzina' : 'godzinę';
            case 'hh':
                return result + (plural$3(number) ? 'godziny' : 'godzin');
            case 'ww':
                return result + (plural$3(number) ? 'tygodnie' : 'tygodni');
            case 'MM':
                return result + (plural$3(number) ? 'miesiące' : 'miesięcy');
            case 'yy':
                return result + (plural$3(number) ? 'lata' : 'lat');
        }
    }

    hooks.defineLocale('pl', {
        months: function (momentToFormat, format) {
            if (!momentToFormat) {
                return monthsNominative;
            } else if (/D MMMM/.test(format)) {
                return monthsSubjective[momentToFormat.month()];
            } else {
                return monthsNominative[momentToFormat.month()];
            }
        },
        monthsShort: 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'),
        monthsParse: monthsParse$a,
        longMonthsParse: monthsParse$a,
        shortMonthsParse: monthsParse$a,
        weekdays:
            'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'),
        weekdaysShort: 'ndz_pon_wt_śr_czw_pt_sob'.split('_'),
        weekdaysMin: 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Dziś o] LT',
            nextDay: '[Jutro o] LT',
            nextWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[W niedzielę o] LT';

                    case 2:
                        return '[We wtorek o] LT';

                    case 3:
                        return '[W środę o] LT';

                    case 6:
                        return '[W sobotę o] LT';

                    default:
                        return '[W] dddd [o] LT';
                }
            },
            lastDay: '[Wczoraj o] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[W zeszłą niedzielę o] LT';
                    case 3:
                        return '[W zeszłą środę o] LT';
                    case 6:
                        return '[W zeszłą sobotę o] LT';
                    default:
                        return '[W zeszły] dddd [o] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'za %s',
            past: '%s temu',
            s: 'kilka sekund',
            ss: translate$8,
            m: translate$8,
            mm: translate$8,
            h: translate$8,
            hh: translate$8,
            d: '1 dzień',
            dd: '%d dni',
            w: 'tydzień',
            ww: translate$8,
            M: 'miesiąc',
            MM: translate$8,
            y: 'rok',
            yy: translate$8,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('pt-br', {
        months: 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split(
            '_'
        ),
        monthsShort: 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),
        weekdays:
            'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split(
                '_'
            ),
        weekdaysShort: 'dom_seg_ter_qua_qui_sex_sáb'.split('_'),
        weekdaysMin: 'do_2ª_3ª_4ª_5ª_6ª_sá'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D [de] MMMM [de] YYYY',
            LLL: 'D [de] MMMM [de] YYYY [às] HH:mm',
            LLLL: 'dddd, D [de] MMMM [de] YYYY [às] HH:mm',
        },
        calendar: {
            sameDay: '[Hoje às] LT',
            nextDay: '[Amanhã às] LT',
            nextWeek: 'dddd [às] LT',
            lastDay: '[Ontem às] LT',
            lastWeek: function () {
                return this.day() === 0 || this.day() === 6
                    ? '[Último] dddd [às] LT' // Saturday + Sunday
                    : '[Última] dddd [às] LT'; // Monday - Friday
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'em %s',
            past: 'há %s',
            s: 'poucos segundos',
            ss: '%d segundos',
            m: 'um minuto',
            mm: '%d minutos',
            h: 'uma hora',
            hh: '%d horas',
            d: 'um dia',
            dd: '%d dias',
            M: 'um mês',
            MM: '%d meses',
            y: 'um ano',
            yy: '%d anos',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        invalidDate: 'Data inválida',
    });

    //! moment.js locale configuration

    hooks.defineLocale('pt', {
        months: 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split(
            '_'
        ),
        monthsShort: 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),
        weekdays:
            'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split(
                '_'
            ),
        weekdaysShort: 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),
        weekdaysMin: 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D [de] MMMM [de] YYYY',
            LLL: 'D [de] MMMM [de] YYYY HH:mm',
            LLLL: 'dddd, D [de] MMMM [de] YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Hoje às] LT',
            nextDay: '[Amanhã às] LT',
            nextWeek: 'dddd [às] LT',
            lastDay: '[Ontem às] LT',
            lastWeek: function () {
                return this.day() === 0 || this.day() === 6
                    ? '[Último] dddd [às] LT' // Saturday + Sunday
                    : '[Última] dddd [às] LT'; // Monday - Friday
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'em %s',
            past: 'há %s',
            s: 'segundos',
            ss: '%d segundos',
            m: 'um minuto',
            mm: '%d minutos',
            h: 'uma hora',
            hh: '%d horas',
            d: 'um dia',
            dd: '%d dias',
            w: 'uma semana',
            ww: '%d semanas',
            M: 'um mês',
            MM: '%d meses',
            y: 'um ano',
            yy: '%d anos',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function relativeTimeWithPlural$2(number, withoutSuffix, key) {
        var format = {
                ss: 'secunde',
                mm: 'minute',
                hh: 'ore',
                dd: 'zile',
                ww: 'săptămâni',
                MM: 'luni',
                yy: 'ani',
            },
            separator = ' ';
        if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) {
            separator = ' de ';
        }
        return number + separator + format[key];
    }

    hooks.defineLocale('ro', {
        months: 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split(
            '_'
        ),
        monthsShort:
            'ian._feb._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'),
        weekdaysShort: 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'),
        weekdaysMin: 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'),
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY H:mm',
            LLLL: 'dddd, D MMMM YYYY H:mm',
        },
        calendar: {
            sameDay: '[azi la] LT',
            nextDay: '[mâine la] LT',
            nextWeek: 'dddd [la] LT',
            lastDay: '[ieri la] LT',
            lastWeek: '[fosta] dddd [la] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'peste %s',
            past: '%s în urmă',
            s: 'câteva secunde',
            ss: relativeTimeWithPlural$2,
            m: 'un minut',
            mm: relativeTimeWithPlural$2,
            h: 'o oră',
            hh: relativeTimeWithPlural$2,
            d: 'o zi',
            dd: relativeTimeWithPlural$2,
            w: 'o săptămână',
            ww: relativeTimeWithPlural$2,
            M: 'o lună',
            MM: relativeTimeWithPlural$2,
            y: 'un an',
            yy: relativeTimeWithPlural$2,
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function plural$4(word, num) {
        var forms = word.split('_');
        return num % 10 === 1 && num % 100 !== 11
            ? forms[0]
            : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20)
            ? forms[1]
            : forms[2];
    }
    function relativeTimeWithPlural$3(number, withoutSuffix, key) {
        var format = {
            ss: withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд',
            mm: withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут',
            hh: 'час_часа_часов',
            dd: 'день_дня_дней',
            ww: 'неделя_недели_недель',
            MM: 'месяц_месяца_месяцев',
            yy: 'год_года_лет',
        };
        if (key === 'm') {
            return withoutSuffix ? 'минута' : 'минуту';
        } else {
            return number + ' ' + plural$4(format[key], +number);
        }
    }
    var monthsParse$b = [
        /^янв/i,
        /^фев/i,
        /^мар/i,
        /^апр/i,
        /^ма[йя]/i,
        /^июн/i,
        /^июл/i,
        /^авг/i,
        /^сен/i,
        /^окт/i,
        /^ноя/i,
        /^дек/i,
    ];

    // http://new.gramota.ru/spravka/rules/139-prop : § 103
    // Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637
    // CLDR data:          http://www.unicode.org/cldr/charts/28/summary/ru.html#1753
    hooks.defineLocale('ru', {
        months: {
            format: 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split(
                '_'
            ),
            standalone:
                'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split(
                    '_'
                ),
        },
        monthsShort: {
            // по CLDR именно "июл." и "июн.", но какой смысл менять букву на точку?
            format: 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split(
                '_'
            ),
            standalone:
                'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split(
                    '_'
                ),
        },
        weekdays: {
            standalone:
                'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split(
                    '_'
                ),
            format: 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split(
                '_'
            ),
            isFormat: /\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?] ?dddd/,
        },
        weekdaysShort: 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
        weekdaysMin: 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
        monthsParse: monthsParse$b,
        longMonthsParse: monthsParse$b,
        shortMonthsParse: monthsParse$b,

        // полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки
        monthsRegex:
            /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,

        // копия предыдущего
        monthsShortRegex:
            /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,

        // полные названия с падежами
        monthsStrictRegex:
            /^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i,

        // Выражение, которое соответствует только сокращённым формам
        monthsShortStrictRegex:
            /^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY г.',
            LLL: 'D MMMM YYYY г., H:mm',
            LLLL: 'dddd, D MMMM YYYY г., H:mm',
        },
        calendar: {
            sameDay: '[Сегодня, в] LT',
            nextDay: '[Завтра, в] LT',
            lastDay: '[Вчера, в] LT',
            nextWeek: function (now) {
                if (now.week() !== this.week()) {
                    switch (this.day()) {
                        case 0:
                            return '[В следующее] dddd, [в] LT';
                        case 1:
                        case 2:
                        case 4:
                            return '[В следующий] dddd, [в] LT';
                        case 3:
                        case 5:
                        case 6:
                            return '[В следующую] dddd, [в] LT';
                    }
                } else {
                    if (this.day() === 2) {
                        return '[Во] dddd, [в] LT';
                    } else {
                        return '[В] dddd, [в] LT';
                    }
                }
            },
            lastWeek: function (now) {
                if (now.week() !== this.week()) {
                    switch (this.day()) {
                        case 0:
                            return '[В прошлое] dddd, [в] LT';
                        case 1:
                        case 2:
                        case 4:
                            return '[В прошлый] dddd, [в] LT';
                        case 3:
                        case 5:
                        case 6:
                            return '[В прошлую] dddd, [в] LT';
                    }
                } else {
                    if (this.day() === 2) {
                        return '[Во] dddd, [в] LT';
                    } else {
                        return '[В] dddd, [в] LT';
                    }
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'через %s',
            past: '%s назад',
            s: 'несколько секунд',
            ss: relativeTimeWithPlural$3,
            m: relativeTimeWithPlural$3,
            mm: relativeTimeWithPlural$3,
            h: 'час',
            hh: relativeTimeWithPlural$3,
            d: 'день',
            dd: relativeTimeWithPlural$3,
            w: 'неделя',
            ww: relativeTimeWithPlural$3,
            M: 'месяц',
            MM: relativeTimeWithPlural$3,
            y: 'год',
            yy: relativeTimeWithPlural$3,
        },
        meridiemParse: /ночи|утра|дня|вечера/i,
        isPM: function (input) {
            return /^(дня|вечера)$/.test(input);
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'ночи';
            } else if (hour < 12) {
                return 'утра';
            } else if (hour < 17) {
                return 'дня';
            } else {
                return 'вечера';
            }
        },
        dayOfMonthOrdinalParse: /\d{1,2}-(й|го|я)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'M':
                case 'd':
                case 'DDD':
                    return number + '-й';
                case 'D':
                    return number + '-го';
                case 'w':
                case 'W':
                    return number + '-я';
                default:
                    return number;
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var months$9 = [
            'جنوري',
            'فيبروري',
            'مارچ',
            'اپريل',
            'مئي',
            'جون',
            'جولاءِ',
            'آگسٽ',
            'سيپٽمبر',
            'آڪٽوبر',
            'نومبر',
            'ڊسمبر',
        ],
        days$1 = ['آچر', 'سومر', 'اڱارو', 'اربع', 'خميس', 'جمع', 'ڇنڇر'];

    hooks.defineLocale('sd', {
        months: months$9,
        monthsShort: months$9,
        weekdays: days$1,
        weekdaysShort: days$1,
        weekdaysMin: days$1,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd، D MMMM YYYY HH:mm',
        },
        meridiemParse: /صبح|شام/,
        isPM: function (input) {
            return 'شام' === input;
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'صبح';
            }
            return 'شام';
        },
        calendar: {
            sameDay: '[اڄ] LT',
            nextDay: '[سڀاڻي] LT',
            nextWeek: 'dddd [اڳين هفتي تي] LT',
            lastDay: '[ڪالهه] LT',
            lastWeek: '[گزريل هفتي] dddd [تي] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s پوء',
            past: '%s اڳ',
            s: 'چند سيڪنڊ',
            ss: '%d سيڪنڊ',
            m: 'هڪ منٽ',
            mm: '%d منٽ',
            h: 'هڪ ڪلاڪ',
            hh: '%d ڪلاڪ',
            d: 'هڪ ڏينهن',
            dd: '%d ڏينهن',
            M: 'هڪ مهينو',
            MM: '%d مهينا',
            y: 'هڪ سال',
            yy: '%d سال',
        },
        preparse: function (string) {
            return string.replace(/،/g, ',');
        },
        postformat: function (string) {
            return string.replace(/,/g, '،');
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('se', {
        months: 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split(
            '_'
        ),
        monthsShort:
            'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'),
        weekdays:
            'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split(
                '_'
            ),
        weekdaysShort: 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'),
        weekdaysMin: 's_v_m_g_d_b_L'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'MMMM D. [b.] YYYY',
            LLL: 'MMMM D. [b.] YYYY [ti.] HH:mm',
            LLLL: 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm',
        },
        calendar: {
            sameDay: '[otne ti] LT',
            nextDay: '[ihttin ti] LT',
            nextWeek: 'dddd [ti] LT',
            lastDay: '[ikte ti] LT',
            lastWeek: '[ovddit] dddd [ti] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s geažes',
            past: 'maŋit %s',
            s: 'moadde sekunddat',
            ss: '%d sekunddat',
            m: 'okta minuhta',
            mm: '%d minuhtat',
            h: 'okta diimmu',
            hh: '%d diimmut',
            d: 'okta beaivi',
            dd: '%d beaivvit',
            M: 'okta mánnu',
            MM: '%d mánut',
            y: 'okta jahki',
            yy: '%d jagit',
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    /*jshint -W100*/
    hooks.defineLocale('si', {
        months: 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split(
            '_'
        ),
        monthsShort: 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split(
            '_'
        ),
        weekdays:
            'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split(
                '_'
            ),
        weekdaysShort: 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'),
        weekdaysMin: 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'a h:mm',
            LTS: 'a h:mm:ss',
            L: 'YYYY/MM/DD',
            LL: 'YYYY MMMM D',
            LLL: 'YYYY MMMM D, a h:mm',
            LLLL: 'YYYY MMMM D [වැනි] dddd, a h:mm:ss',
        },
        calendar: {
            sameDay: '[අද] LT[ට]',
            nextDay: '[හෙට] LT[ට]',
            nextWeek: 'dddd LT[ට]',
            lastDay: '[ඊයේ] LT[ට]',
            lastWeek: '[පසුගිය] dddd LT[ට]',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%sකින්',
            past: '%sකට පෙර',
            s: 'තත්පර කිහිපය',
            ss: 'තත්පර %d',
            m: 'මිනිත්තුව',
            mm: 'මිනිත්තු %d',
            h: 'පැය',
            hh: 'පැය %d',
            d: 'දිනය',
            dd: 'දින %d',
            M: 'මාසය',
            MM: 'මාස %d',
            y: 'වසර',
            yy: 'වසර %d',
        },
        dayOfMonthOrdinalParse: /\d{1,2} වැනි/,
        ordinal: function (number) {
            return number + ' වැනි';
        },
        meridiemParse: /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./,
        isPM: function (input) {
            return input === 'ප.ව.' || input === 'පස් වරු';
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours > 11) {
                return isLower ? 'ප.ව.' : 'පස් වරු';
            } else {
                return isLower ? 'පෙ.ව.' : 'පෙර වරු';
            }
        },
    });

    //! moment.js locale configuration

    var months$a =
            'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split(
                '_'
            ),
        monthsShort$7 = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_');
    function plural$5(n) {
        return n > 1 && n < 5;
    }
    function translate$9(number, withoutSuffix, key, isFuture) {
        var result = number + ' ';
        switch (key) {
            case 's': // a few seconds / in a few seconds / a few seconds ago
                return withoutSuffix || isFuture ? 'pár sekúnd' : 'pár sekundami';
            case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago
                if (withoutSuffix || isFuture) {
                    return result + (plural$5(number) ? 'sekundy' : 'sekúnd');
                } else {
                    return result + 'sekundami';
                }
            case 'm': // a minute / in a minute / a minute ago
                return withoutSuffix ? 'minúta' : isFuture ? 'minútu' : 'minútou';
            case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
                if (withoutSuffix || isFuture) {
                    return result + (plural$5(number) ? 'minúty' : 'minút');
                } else {
                    return result + 'minútami';
                }
            case 'h': // an hour / in an hour / an hour ago
                return withoutSuffix ? 'hodina' : isFuture ? 'hodinu' : 'hodinou';
            case 'hh': // 9 hours / in 9 hours / 9 hours ago
                if (withoutSuffix || isFuture) {
                    return result + (plural$5(number) ? 'hodiny' : 'hodín');
                } else {
                    return result + 'hodinami';
                }
            case 'd': // a day / in a day / a day ago
                return withoutSuffix || isFuture ? 'deň' : 'dňom';
            case 'dd': // 9 days / in 9 days / 9 days ago
                if (withoutSuffix || isFuture) {
                    return result + (plural$5(number) ? 'dni' : 'dní');
                } else {
                    return result + 'dňami';
                }
            case 'M': // a month / in a month / a month ago
                return withoutSuffix || isFuture ? 'mesiac' : 'mesiacom';
            case 'MM': // 9 months / in 9 months / 9 months ago
                if (withoutSuffix || isFuture) {
                    return result + (plural$5(number) ? 'mesiace' : 'mesiacov');
                } else {
                    return result + 'mesiacmi';
                }
            case 'y': // a year / in a year / a year ago
                return withoutSuffix || isFuture ? 'rok' : 'rokom';
            case 'yy': // 9 years / in 9 years / 9 years ago
                if (withoutSuffix || isFuture) {
                    return result + (plural$5(number) ? 'roky' : 'rokov');
                } else {
                    return result + 'rokmi';
                }
        }
    }

    hooks.defineLocale('sk', {
        months: months$a,
        monthsShort: monthsShort$7,
        weekdays: 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'),
        weekdaysShort: 'ne_po_ut_st_št_pi_so'.split('_'),
        weekdaysMin: 'ne_po_ut_st_št_pi_so'.split('_'),
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY H:mm',
            LLLL: 'dddd D. MMMM YYYY H:mm',
        },
        calendar: {
            sameDay: '[dnes o] LT',
            nextDay: '[zajtra o] LT',
            nextWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[v nedeľu o] LT';
                    case 1:
                    case 2:
                        return '[v] dddd [o] LT';
                    case 3:
                        return '[v stredu o] LT';
                    case 4:
                        return '[vo štvrtok o] LT';
                    case 5:
                        return '[v piatok o] LT';
                    case 6:
                        return '[v sobotu o] LT';
                }
            },
            lastDay: '[včera o] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[minulú nedeľu o] LT';
                    case 1:
                    case 2:
                        return '[minulý] dddd [o] LT';
                    case 3:
                        return '[minulú stredu o] LT';
                    case 4:
                    case 5:
                        return '[minulý] dddd [o] LT';
                    case 6:
                        return '[minulú sobotu o] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'za %s',
            past: 'pred %s',
            s: translate$9,
            ss: translate$9,
            m: translate$9,
            mm: translate$9,
            h: translate$9,
            hh: translate$9,
            d: translate$9,
            dd: translate$9,
            M: translate$9,
            MM: translate$9,
            y: translate$9,
            yy: translate$9,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function processRelativeTime$7(number, withoutSuffix, key, isFuture) {
        var result = number + ' ';
        switch (key) {
            case 's':
                return withoutSuffix || isFuture
                    ? 'nekaj sekund'
                    : 'nekaj sekundami';
            case 'ss':
                if (number === 1) {
                    result += withoutSuffix ? 'sekundo' : 'sekundi';
                } else if (number === 2) {
                    result += withoutSuffix || isFuture ? 'sekundi' : 'sekundah';
                } else if (number < 5) {
                    result += withoutSuffix || isFuture ? 'sekunde' : 'sekundah';
                } else {
                    result += 'sekund';
                }
                return result;
            case 'm':
                return withoutSuffix ? 'ena minuta' : 'eno minuto';
            case 'mm':
                if (number === 1) {
                    result += withoutSuffix ? 'minuta' : 'minuto';
                } else if (number === 2) {
                    result += withoutSuffix || isFuture ? 'minuti' : 'minutama';
                } else if (number < 5) {
                    result += withoutSuffix || isFuture ? 'minute' : 'minutami';
                } else {
                    result += withoutSuffix || isFuture ? 'minut' : 'minutami';
                }
                return result;
            case 'h':
                return withoutSuffix ? 'ena ura' : 'eno uro';
            case 'hh':
                if (number === 1) {
                    result += withoutSuffix ? 'ura' : 'uro';
                } else if (number === 2) {
                    result += withoutSuffix || isFuture ? 'uri' : 'urama';
                } else if (number < 5) {
                    result += withoutSuffix || isFuture ? 'ure' : 'urami';
                } else {
                    result += withoutSuffix || isFuture ? 'ur' : 'urami';
                }
                return result;
            case 'd':
                return withoutSuffix || isFuture ? 'en dan' : 'enim dnem';
            case 'dd':
                if (number === 1) {
                    result += withoutSuffix || isFuture ? 'dan' : 'dnem';
                } else if (number === 2) {
                    result += withoutSuffix || isFuture ? 'dni' : 'dnevoma';
                } else {
                    result += withoutSuffix || isFuture ? 'dni' : 'dnevi';
                }
                return result;
            case 'M':
                return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem';
            case 'MM':
                if (number === 1) {
                    result += withoutSuffix || isFuture ? 'mesec' : 'mesecem';
                } else if (number === 2) {
                    result += withoutSuffix || isFuture ? 'meseca' : 'mesecema';
                } else if (number < 5) {
                    result += withoutSuffix || isFuture ? 'mesece' : 'meseci';
                } else {
                    result += withoutSuffix || isFuture ? 'mesecev' : 'meseci';
                }
                return result;
            case 'y':
                return withoutSuffix || isFuture ? 'eno leto' : 'enim letom';
            case 'yy':
                if (number === 1) {
                    result += withoutSuffix || isFuture ? 'leto' : 'letom';
                } else if (number === 2) {
                    result += withoutSuffix || isFuture ? 'leti' : 'letoma';
                } else if (number < 5) {
                    result += withoutSuffix || isFuture ? 'leta' : 'leti';
                } else {
                    result += withoutSuffix || isFuture ? 'let' : 'leti';
                }
                return result;
        }
    }

    hooks.defineLocale('sl', {
        months: 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split(
            '_'
        ),
        monthsShort:
            'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'),
        weekdaysShort: 'ned._pon._tor._sre._čet._pet._sob.'.split('_'),
        weekdaysMin: 'ne_po_to_sr_če_pe_so'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD. MM. YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY H:mm',
            LLLL: 'dddd, D. MMMM YYYY H:mm',
        },
        calendar: {
            sameDay: '[danes ob] LT',
            nextDay: '[jutri ob] LT',

            nextWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[v] [nedeljo] [ob] LT';
                    case 3:
                        return '[v] [sredo] [ob] LT';
                    case 6:
                        return '[v] [soboto] [ob] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[v] dddd [ob] LT';
                }
            },
            lastDay: '[včeraj ob] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[prejšnjo] [nedeljo] [ob] LT';
                    case 3:
                        return '[prejšnjo] [sredo] [ob] LT';
                    case 6:
                        return '[prejšnjo] [soboto] [ob] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[prejšnji] dddd [ob] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'čez %s',
            past: 'pred %s',
            s: processRelativeTime$7,
            ss: processRelativeTime$7,
            m: processRelativeTime$7,
            mm: processRelativeTime$7,
            h: processRelativeTime$7,
            hh: processRelativeTime$7,
            d: processRelativeTime$7,
            dd: processRelativeTime$7,
            M: processRelativeTime$7,
            MM: processRelativeTime$7,
            y: processRelativeTime$7,
            yy: processRelativeTime$7,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('sq', {
        months: 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split(
            '_'
        ),
        monthsShort: 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'),
        weekdays: 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split(
            '_'
        ),
        weekdaysShort: 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'),
        weekdaysMin: 'D_H_Ma_Më_E_P_Sh'.split('_'),
        weekdaysParseExact: true,
        meridiemParse: /PD|MD/,
        isPM: function (input) {
            return input.charAt(0) === 'M';
        },
        meridiem: function (hours, minutes, isLower) {
            return hours < 12 ? 'PD' : 'MD';
        },
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Sot në] LT',
            nextDay: '[Nesër në] LT',
            nextWeek: 'dddd [në] LT',
            lastDay: '[Dje në] LT',
            lastWeek: 'dddd [e kaluar në] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'në %s',
            past: '%s më parë',
            s: 'disa sekonda',
            ss: '%d sekonda',
            m: 'një minutë',
            mm: '%d minuta',
            h: 'një orë',
            hh: '%d orë',
            d: 'një ditë',
            dd: '%d ditë',
            M: 'një muaj',
            MM: '%d muaj',
            y: 'një vit',
            yy: '%d vite',
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var translator$1 = {
        words: {
            //Different grammatical cases
            ss: ['секунда', 'секунде', 'секунди'],
            m: ['један минут', 'једног минута'],
            mm: ['минут', 'минута', 'минута'],
            h: ['један сат', 'једног сата'],
            hh: ['сат', 'сата', 'сати'],
            d: ['један дан', 'једног дана'],
            dd: ['дан', 'дана', 'дана'],
            M: ['један месец', 'једног месеца'],
            MM: ['месец', 'месеца', 'месеци'],
            y: ['једну годину', 'једне године'],
            yy: ['годину', 'године', 'година'],
        },
        correctGrammaticalCase: function (number, wordKey) {
            if (
                number % 10 >= 1 &&
                number % 10 <= 4 &&
                (number % 100 < 10 || number % 100 >= 20)
            ) {
                return number % 10 === 1 ? wordKey[0] : wordKey[1];
            }
            return wordKey[2];
        },
        translate: function (number, withoutSuffix, key, isFuture) {
            var wordKey = translator$1.words[key],
                word;

            if (key.length === 1) {
                // Nominativ
                if (key === 'y' && withoutSuffix) return 'једна година';
                return isFuture || withoutSuffix ? wordKey[0] : wordKey[1];
            }

            word = translator$1.correctGrammaticalCase(number, wordKey);
            // Nominativ
            if (key === 'yy' && withoutSuffix && word === 'годину') {
                return number + ' година';
            }

            return number + ' ' + word;
        },
    };

    hooks.defineLocale('sr-cyrl', {
        months: 'јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар'.split(
            '_'
        ),
        monthsShort:
            'јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.'.split('_'),
        monthsParseExact: true,
        weekdays: 'недеља_понедељак_уторак_среда_четвртак_петак_субота'.split('_'),
        weekdaysShort: 'нед._пон._уто._сре._чет._пет._суб.'.split('_'),
        weekdaysMin: 'не_по_ут_ср_че_пе_су'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'D. M. YYYY.',
            LL: 'D. MMMM YYYY.',
            LLL: 'D. MMMM YYYY. H:mm',
            LLLL: 'dddd, D. MMMM YYYY. H:mm',
        },
        calendar: {
            sameDay: '[данас у] LT',
            nextDay: '[сутра у] LT',
            nextWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[у] [недељу] [у] LT';
                    case 3:
                        return '[у] [среду] [у] LT';
                    case 6:
                        return '[у] [суботу] [у] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[у] dddd [у] LT';
                }
            },
            lastDay: '[јуче у] LT',
            lastWeek: function () {
                var lastWeekDays = [
                    '[прошле] [недеље] [у] LT',
                    '[прошлог] [понедељка] [у] LT',
                    '[прошлог] [уторка] [у] LT',
                    '[прошле] [среде] [у] LT',
                    '[прошлог] [четвртка] [у] LT',
                    '[прошлог] [петка] [у] LT',
                    '[прошле] [суботе] [у] LT',
                ];
                return lastWeekDays[this.day()];
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'за %s',
            past: 'пре %s',
            s: 'неколико секунди',
            ss: translator$1.translate,
            m: translator$1.translate,
            mm: translator$1.translate,
            h: translator$1.translate,
            hh: translator$1.translate,
            d: translator$1.translate,
            dd: translator$1.translate,
            M: translator$1.translate,
            MM: translator$1.translate,
            y: translator$1.translate,
            yy: translator$1.translate,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 1st is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var translator$2 = {
        words: {
            //Different grammatical cases
            ss: ['sekunda', 'sekunde', 'sekundi'],
            m: ['jedan minut', 'jednog minuta'],
            mm: ['minut', 'minuta', 'minuta'],
            h: ['jedan sat', 'jednog sata'],
            hh: ['sat', 'sata', 'sati'],
            d: ['jedan dan', 'jednog dana'],
            dd: ['dan', 'dana', 'dana'],
            M: ['jedan mesec', 'jednog meseca'],
            MM: ['mesec', 'meseca', 'meseci'],
            y: ['jednu godinu', 'jedne godine'],
            yy: ['godinu', 'godine', 'godina'],
        },
        correctGrammaticalCase: function (number, wordKey) {
            if (
                number % 10 >= 1 &&
                number % 10 <= 4 &&
                (number % 100 < 10 || number % 100 >= 20)
            ) {
                return number % 10 === 1 ? wordKey[0] : wordKey[1];
            }
            return wordKey[2];
        },
        translate: function (number, withoutSuffix, key, isFuture) {
            var wordKey = translator$2.words[key],
                word;

            if (key.length === 1) {
                // Nominativ
                if (key === 'y' && withoutSuffix) return 'jedna godina';
                return isFuture || withoutSuffix ? wordKey[0] : wordKey[1];
            }

            word = translator$2.correctGrammaticalCase(number, wordKey);
            // Nominativ
            if (key === 'yy' && withoutSuffix && word === 'godinu') {
                return number + ' godina';
            }

            return number + ' ' + word;
        },
    };

    hooks.defineLocale('sr', {
        months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split(
            '_'
        ),
        monthsShort:
            'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),
        monthsParseExact: true,
        weekdays: 'nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota'.split(
            '_'
        ),
        weekdaysShort: 'ned._pon._uto._sre._čet._pet._sub.'.split('_'),
        weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'D. M. YYYY.',
            LL: 'D. MMMM YYYY.',
            LLL: 'D. MMMM YYYY. H:mm',
            LLLL: 'dddd, D. MMMM YYYY. H:mm',
        },
        calendar: {
            sameDay: '[danas u] LT',
            nextDay: '[sutra u] LT',
            nextWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[u] [nedelju] [u] LT';
                    case 3:
                        return '[u] [sredu] [u] LT';
                    case 6:
                        return '[u] [subotu] [u] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[u] dddd [u] LT';
                }
            },
            lastDay: '[juče u] LT',
            lastWeek: function () {
                var lastWeekDays = [
                    '[prošle] [nedelje] [u] LT',
                    '[prošlog] [ponedeljka] [u] LT',
                    '[prošlog] [utorka] [u] LT',
                    '[prošle] [srede] [u] LT',
                    '[prošlog] [četvrtka] [u] LT',
                    '[prošlog] [petka] [u] LT',
                    '[prošle] [subote] [u] LT',
                ];
                return lastWeekDays[this.day()];
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'za %s',
            past: 'pre %s',
            s: 'nekoliko sekundi',
            ss: translator$2.translate,
            m: translator$2.translate,
            mm: translator$2.translate,
            h: translator$2.translate,
            hh: translator$2.translate,
            d: translator$2.translate,
            dd: translator$2.translate,
            M: translator$2.translate,
            MM: translator$2.translate,
            y: translator$2.translate,
            yy: translator$2.translate,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('ss', {
        months: "Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split(
            '_'
        ),
        monthsShort: 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'),
        weekdays:
            'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split(
                '_'
            ),
        weekdaysShort: 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'),
        weekdaysMin: 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'h:mm A',
            LTS: 'h:mm:ss A',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY h:mm A',
            LLLL: 'dddd, D MMMM YYYY h:mm A',
        },
        calendar: {
            sameDay: '[Namuhla nga] LT',
            nextDay: '[Kusasa nga] LT',
            nextWeek: 'dddd [nga] LT',
            lastDay: '[Itolo nga] LT',
            lastWeek: 'dddd [leliphelile] [nga] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'nga %s',
            past: 'wenteka nga %s',
            s: 'emizuzwana lomcane',
            ss: '%d mzuzwana',
            m: 'umzuzu',
            mm: '%d emizuzu',
            h: 'lihora',
            hh: '%d emahora',
            d: 'lilanga',
            dd: '%d emalanga',
            M: 'inyanga',
            MM: '%d tinyanga',
            y: 'umnyaka',
            yy: '%d iminyaka',
        },
        meridiemParse: /ekuseni|emini|entsambama|ebusuku/,
        meridiem: function (hours, minutes, isLower) {
            if (hours < 11) {
                return 'ekuseni';
            } else if (hours < 15) {
                return 'emini';
            } else if (hours < 19) {
                return 'entsambama';
            } else {
                return 'ebusuku';
            }
        },
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'ekuseni') {
                return hour;
            } else if (meridiem === 'emini') {
                return hour >= 11 ? hour : hour + 12;
            } else if (meridiem === 'entsambama' || meridiem === 'ebusuku') {
                if (hour === 0) {
                    return 0;
                }
                return hour + 12;
            }
        },
        dayOfMonthOrdinalParse: /\d{1,2}/,
        ordinal: '%d',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('sv', {
        months: 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split(
            '_'
        ),
        monthsShort: 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
        weekdays: 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'),
        weekdaysShort: 'sön_mån_tis_ons_tor_fre_lör'.split('_'),
        weekdaysMin: 'sö_må_ti_on_to_fr_lö'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY-MM-DD',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY [kl.] HH:mm',
            LLLL: 'dddd D MMMM YYYY [kl.] HH:mm',
            lll: 'D MMM YYYY HH:mm',
            llll: 'ddd D MMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Idag] LT',
            nextDay: '[Imorgon] LT',
            lastDay: '[Igår] LT',
            nextWeek: '[På] dddd LT',
            lastWeek: '[I] dddd[s] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'om %s',
            past: 'för %s sedan',
            s: 'några sekunder',
            ss: '%d sekunder',
            m: 'en minut',
            mm: '%d minuter',
            h: 'en timme',
            hh: '%d timmar',
            d: 'en dag',
            dd: '%d dagar',
            M: 'en månad',
            MM: '%d månader',
            y: 'ett år',
            yy: '%d år',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(\:e|\:a)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? ':e'
                        : b === 1
                        ? ':a'
                        : b === 2
                        ? ':a'
                        : b === 3
                        ? ':e'
                        : ':e';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('sw', {
        months: 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'),
        weekdays:
            'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split(
                '_'
            ),
        weekdaysShort: 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'),
        weekdaysMin: 'J2_J3_J4_J5_Al_Ij_J1'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'hh:mm A',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[leo saa] LT',
            nextDay: '[kesho saa] LT',
            nextWeek: '[wiki ijayo] dddd [saat] LT',
            lastDay: '[jana] LT',
            lastWeek: '[wiki iliyopita] dddd [saat] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s baadaye',
            past: 'tokea %s',
            s: 'hivi punde',
            ss: 'sekunde %d',
            m: 'dakika moja',
            mm: 'dakika %d',
            h: 'saa limoja',
            hh: 'masaa %d',
            d: 'siku moja',
            dd: 'siku %d',
            M: 'mwezi mmoja',
            MM: 'miezi %d',
            y: 'mwaka mmoja',
            yy: 'miaka %d',
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var symbolMap$g = {
            1: '௧',
            2: '௨',
            3: '௩',
            4: '௪',
            5: '௫',
            6: '௬',
            7: '௭',
            8: '௮',
            9: '௯',
            0: '௦',
        },
        numberMap$f = {
            '௧': '1',
            '௨': '2',
            '௩': '3',
            '௪': '4',
            '௫': '5',
            '௬': '6',
            '௭': '7',
            '௮': '8',
            '௯': '9',
            '௦': '0',
        };

    hooks.defineLocale('ta', {
        months: 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split(
            '_'
        ),
        monthsShort:
            'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split(
                '_'
            ),
        weekdays:
            'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split(
                '_'
            ),
        weekdaysShort: 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split(
            '_'
        ),
        weekdaysMin: 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, HH:mm',
            LLLL: 'dddd, D MMMM YYYY, HH:mm',
        },
        calendar: {
            sameDay: '[இன்று] LT',
            nextDay: '[நாளை] LT',
            nextWeek: 'dddd, LT',
            lastDay: '[நேற்று] LT',
            lastWeek: '[கடந்த வாரம்] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s இல்',
            past: '%s முன்',
            s: 'ஒரு சில விநாடிகள்',
            ss: '%d விநாடிகள்',
            m: 'ஒரு நிமிடம்',
            mm: '%d நிமிடங்கள்',
            h: 'ஒரு மணி நேரம்',
            hh: '%d மணி நேரம்',
            d: 'ஒரு நாள்',
            dd: '%d நாட்கள்',
            M: 'ஒரு மாதம்',
            MM: '%d மாதங்கள்',
            y: 'ஒரு வருடம்',
            yy: '%d ஆண்டுகள்',
        },
        dayOfMonthOrdinalParse: /\d{1,2}வது/,
        ordinal: function (number) {
            return number + 'வது';
        },
        preparse: function (string) {
            return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) {
                return numberMap$f[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap$g[match];
            });
        },
        // refer http://ta.wikipedia.org/s/1er1
        meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/,
        meridiem: function (hour, minute, isLower) {
            if (hour < 2) {
                return ' யாமம்';
            } else if (hour < 6) {
                return ' வைகறை'; // வைகறை
            } else if (hour < 10) {
                return ' காலை'; // காலை
            } else if (hour < 14) {
                return ' நண்பகல்'; // நண்பகல்
            } else if (hour < 18) {
                return ' எற்பாடு'; // எற்பாடு
            } else if (hour < 22) {
                return ' மாலை'; // மாலை
            } else {
                return ' யாமம்';
            }
        },
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'யாமம்') {
                return hour < 2 ? hour : hour + 12;
            } else if (meridiem === 'வைகறை' || meridiem === 'காலை') {
                return hour;
            } else if (meridiem === 'நண்பகல்') {
                return hour >= 10 ? hour : hour + 12;
            } else {
                return hour + 12;
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('te', {
        months: 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జులై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split(
            '_'
        ),
        monthsShort:
            'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జులై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays:
            'ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం'.split(
                '_'
            ),
        weekdaysShort: 'ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని'.split('_'),
        weekdaysMin: 'ఆ_సో_మం_బు_గు_శు_శ'.split('_'),
        longDateFormat: {
            LT: 'A h:mm',
            LTS: 'A h:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm',
            LLLL: 'dddd, D MMMM YYYY, A h:mm',
        },
        calendar: {
            sameDay: '[నేడు] LT',
            nextDay: '[రేపు] LT',
            nextWeek: 'dddd, LT',
            lastDay: '[నిన్న] LT',
            lastWeek: '[గత] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s లో',
            past: '%s క్రితం',
            s: 'కొన్ని క్షణాలు',
            ss: '%d సెకన్లు',
            m: 'ఒక నిమిషం',
            mm: '%d నిమిషాలు',
            h: 'ఒక గంట',
            hh: '%d గంటలు',
            d: 'ఒక రోజు',
            dd: '%d రోజులు',
            M: 'ఒక నెల',
            MM: '%d నెలలు',
            y: 'ఒక సంవత్సరం',
            yy: '%d సంవత్సరాలు',
        },
        dayOfMonthOrdinalParse: /\d{1,2}వ/,
        ordinal: '%dవ',
        meridiemParse: /రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'రాత్రి') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'ఉదయం') {
                return hour;
            } else if (meridiem === 'మధ్యాహ్నం') {
                return hour >= 10 ? hour : hour + 12;
            } else if (meridiem === 'సాయంత్రం') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'రాత్రి';
            } else if (hour < 10) {
                return 'ఉదయం';
            } else if (hour < 17) {
                return 'మధ్యాహ్నం';
            } else if (hour < 20) {
                return 'సాయంత్రం';
            } else {
                return 'రాత్రి';
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('tet', {
        months: 'Janeiru_Fevereiru_Marsu_Abril_Maiu_Juñu_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru'.split(
            '_'
        ),
        monthsShort: 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),
        weekdays: 'Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu'.split('_'),
        weekdaysShort: 'Dom_Seg_Ters_Kua_Kint_Sest_Sab'.split('_'),
        weekdaysMin: 'Do_Seg_Te_Ku_Ki_Ses_Sa'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Ohin iha] LT',
            nextDay: '[Aban iha] LT',
            nextWeek: 'dddd [iha] LT',
            lastDay: '[Horiseik iha] LT',
            lastWeek: 'dddd [semana kotuk] [iha] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'iha %s',
            past: '%s liuba',
            s: 'segundu balun',
            ss: 'segundu %d',
            m: 'minutu ida',
            mm: 'minutu %d',
            h: 'oras ida',
            hh: 'oras %d',
            d: 'loron ida',
            dd: 'loron %d',
            M: 'fulan ida',
            MM: 'fulan %d',
            y: 'tinan ida',
            yy: 'tinan %d',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var suffixes$3 = {
        0: '-ум',
        1: '-ум',
        2: '-юм',
        3: '-юм',
        4: '-ум',
        5: '-ум',
        6: '-ум',
        7: '-ум',
        8: '-ум',
        9: '-ум',
        10: '-ум',
        12: '-ум',
        13: '-ум',
        20: '-ум',
        30: '-юм',
        40: '-ум',
        50: '-ум',
        60: '-ум',
        70: '-ум',
        80: '-ум',
        90: '-ум',
        100: '-ум',
    };

    hooks.defineLocale('tg', {
        months: {
            format: 'январи_феврали_марти_апрели_майи_июни_июли_августи_сентябри_октябри_ноябри_декабри'.split(
                '_'
            ),
            standalone:
                'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split(
                    '_'
                ),
        },
        monthsShort: 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),
        weekdays: 'якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе'.split(
            '_'
        ),
        weekdaysShort: 'яшб_дшб_сшб_чшб_пшб_ҷум_шнб'.split('_'),
        weekdaysMin: 'яш_дш_сш_чш_пш_ҷм_шб'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Имрӯз соати] LT',
            nextDay: '[Фардо соати] LT',
            lastDay: '[Дирӯз соати] LT',
            nextWeek: 'dddd[и] [ҳафтаи оянда соати] LT',
            lastWeek: 'dddd[и] [ҳафтаи гузашта соати] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'баъди %s',
            past: '%s пеш',
            s: 'якчанд сония',
            m: 'як дақиқа',
            mm: '%d дақиқа',
            h: 'як соат',
            hh: '%d соат',
            d: 'як рӯз',
            dd: '%d рӯз',
            M: 'як моҳ',
            MM: '%d моҳ',
            y: 'як сол',
            yy: '%d сол',
        },
        meridiemParse: /шаб|субҳ|рӯз|бегоҳ/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'шаб') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'субҳ') {
                return hour;
            } else if (meridiem === 'рӯз') {
                return hour >= 11 ? hour : hour + 12;
            } else if (meridiem === 'бегоҳ') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'шаб';
            } else if (hour < 11) {
                return 'субҳ';
            } else if (hour < 16) {
                return 'рӯз';
            } else if (hour < 19) {
                return 'бегоҳ';
            } else {
                return 'шаб';
            }
        },
        dayOfMonthOrdinalParse: /\d{1,2}-(ум|юм)/,
        ordinal: function (number) {
            var a = number % 10,
                b = number >= 100 ? 100 : null;
            return number + (suffixes$3[number] || suffixes$3[a] || suffixes$3[b]);
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 1th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('th', {
        months: 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split(
            '_'
        ),
        monthsShort:
            'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'),
        weekdaysShort: 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference
        weekdaysMin: 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY เวลา H:mm',
            LLLL: 'วันddddที่ D MMMM YYYY เวลา H:mm',
        },
        meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/,
        isPM: function (input) {
            return input === 'หลังเที่ยง';
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'ก่อนเที่ยง';
            } else {
                return 'หลังเที่ยง';
            }
        },
        calendar: {
            sameDay: '[วันนี้ เวลา] LT',
            nextDay: '[พรุ่งนี้ เวลา] LT',
            nextWeek: 'dddd[หน้า เวลา] LT',
            lastDay: '[เมื่อวานนี้ เวลา] LT',
            lastWeek: '[วัน]dddd[ที่แล้ว เวลา] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'อีก %s',
            past: '%sที่แล้ว',
            s: 'ไม่กี่วินาที',
            ss: '%d วินาที',
            m: '1 นาที',
            mm: '%d นาที',
            h: '1 ชั่วโมง',
            hh: '%d ชั่วโมง',
            d: '1 วัน',
            dd: '%d วัน',
            w: '1 สัปดาห์',
            ww: '%d สัปดาห์',
            M: '1 เดือน',
            MM: '%d เดือน',
            y: '1 ปี',
            yy: '%d ปี',
        },
    });

    //! moment.js locale configuration

    var suffixes$4 = {
        1: "'inji",
        5: "'inji",
        8: "'inji",
        70: "'inji",
        80: "'inji",
        2: "'nji",
        7: "'nji",
        20: "'nji",
        50: "'nji",
        3: "'ünji",
        4: "'ünji",
        100: "'ünji",
        6: "'njy",
        9: "'unjy",
        10: "'unjy",
        30: "'unjy",
        60: "'ynjy",
        90: "'ynjy",
    };

    hooks.defineLocale('tk', {
        months: 'Ýanwar_Fewral_Mart_Aprel_Maý_Iýun_Iýul_Awgust_Sentýabr_Oktýabr_Noýabr_Dekabr'.split(
            '_'
        ),
        monthsShort: 'Ýan_Few_Mar_Apr_Maý_Iýn_Iýl_Awg_Sen_Okt_Noý_Dek'.split('_'),
        weekdays: 'Ýekşenbe_Duşenbe_Sişenbe_Çarşenbe_Penşenbe_Anna_Şenbe'.split(
            '_'
        ),
        weekdaysShort: 'Ýek_Duş_Siş_Çar_Pen_Ann_Şen'.split('_'),
        weekdaysMin: 'Ýk_Dş_Sş_Çr_Pn_An_Şn'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[bugün sagat] LT',
            nextDay: '[ertir sagat] LT',
            nextWeek: '[indiki] dddd [sagat] LT',
            lastDay: '[düýn] LT',
            lastWeek: '[geçen] dddd [sagat] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s soň',
            past: '%s öň',
            s: 'birnäçe sekunt',
            m: 'bir minut',
            mm: '%d minut',
            h: 'bir sagat',
            hh: '%d sagat',
            d: 'bir gün',
            dd: '%d gün',
            M: 'bir aý',
            MM: '%d aý',
            y: 'bir ýyl',
            yy: '%d ýyl',
        },
        ordinal: function (number, period) {
            switch (period) {
                case 'd':
                case 'D':
                case 'Do':
                case 'DD':
                    return number;
                default:
                    if (number === 0) {
                        // special case for zero
                        return number + "'unjy";
                    }
                    var a = number % 10,
                        b = (number % 100) - a,
                        c = number >= 100 ? 100 : null;
                    return number + (suffixes$4[a] || suffixes$4[b] || suffixes$4[c]);
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('tl-ph', {
        months: 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split(
            '_'
        ),
        monthsShort: 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),
        weekdays: 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split(
            '_'
        ),
        weekdaysShort: 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'),
        weekdaysMin: 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'MM/D/YYYY',
            LL: 'MMMM D, YYYY',
            LLL: 'MMMM D, YYYY HH:mm',
            LLLL: 'dddd, MMMM DD, YYYY HH:mm',
        },
        calendar: {
            sameDay: 'LT [ngayong araw]',
            nextDay: '[Bukas ng] LT',
            nextWeek: 'LT [sa susunod na] dddd',
            lastDay: 'LT [kahapon]',
            lastWeek: 'LT [noong nakaraang] dddd',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'sa loob ng %s',
            past: '%s ang nakalipas',
            s: 'ilang segundo',
            ss: '%d segundo',
            m: 'isang minuto',
            mm: '%d minuto',
            h: 'isang oras',
            hh: '%d oras',
            d: 'isang araw',
            dd: '%d araw',
            M: 'isang buwan',
            MM: '%d buwan',
            y: 'isang taon',
            yy: '%d taon',
        },
        dayOfMonthOrdinalParse: /\d{1,2}/,
        ordinal: function (number) {
            return number;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var numbersNouns = 'pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut'.split('_');

    function translateFuture(output) {
        var time = output;
        time =
            output.indexOf('jaj') !== -1
                ? time.slice(0, -3) + 'leS'
                : output.indexOf('jar') !== -1
                ? time.slice(0, -3) + 'waQ'
                : output.indexOf('DIS') !== -1
                ? time.slice(0, -3) + 'nem'
                : time + ' pIq';
        return time;
    }

    function translatePast(output) {
        var time = output;
        time =
            output.indexOf('jaj') !== -1
                ? time.slice(0, -3) + 'Hu’'
                : output.indexOf('jar') !== -1
                ? time.slice(0, -3) + 'wen'
                : output.indexOf('DIS') !== -1
                ? time.slice(0, -3) + 'ben'
                : time + ' ret';
        return time;
    }

    function translate$a(number, withoutSuffix, string, isFuture) {
        var numberNoun = numberAsNoun(number);
        switch (string) {
            case 'ss':
                return numberNoun + ' lup';
            case 'mm':
                return numberNoun + ' tup';
            case 'hh':
                return numberNoun + ' rep';
            case 'dd':
                return numberNoun + ' jaj';
            case 'MM':
                return numberNoun + ' jar';
            case 'yy':
                return numberNoun + ' DIS';
        }
    }

    function numberAsNoun(number) {
        var hundred = Math.floor((number % 1000) / 100),
            ten = Math.floor((number % 100) / 10),
            one = number % 10,
            word = '';
        if (hundred > 0) {
            word += numbersNouns[hundred] + 'vatlh';
        }
        if (ten > 0) {
            word += (word !== '' ? ' ' : '') + numbersNouns[ten] + 'maH';
        }
        if (one > 0) {
            word += (word !== '' ? ' ' : '') + numbersNouns[one];
        }
        return word === '' ? 'pagh' : word;
    }

    hooks.defineLocale('tlh', {
        months: 'tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’'.split(
            '_'
        ),
        monthsShort:
            'jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split(
            '_'
        ),
        weekdaysShort:
            'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),
        weekdaysMin:
            'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[DaHjaj] LT',
            nextDay: '[wa’leS] LT',
            nextWeek: 'LLL',
            lastDay: '[wa’Hu’] LT',
            lastWeek: 'LLL',
            sameElse: 'L',
        },
        relativeTime: {
            future: translateFuture,
            past: translatePast,
            s: 'puS lup',
            ss: translate$a,
            m: 'wa’ tup',
            mm: translate$a,
            h: 'wa’ rep',
            hh: translate$a,
            d: 'wa’ jaj',
            dd: translate$a,
            M: 'wa’ jar',
            MM: translate$a,
            y: 'wa’ DIS',
            yy: translate$a,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var suffixes$5 = {
        1: "'inci",
        5: "'inci",
        8: "'inci",
        70: "'inci",
        80: "'inci",
        2: "'nci",
        7: "'nci",
        20: "'nci",
        50: "'nci",
        3: "'üncü",
        4: "'üncü",
        100: "'üncü",
        6: "'ncı",
        9: "'uncu",
        10: "'uncu",
        30: "'uncu",
        60: "'ıncı",
        90: "'ıncı",
    };

    hooks.defineLocale('tr', {
        months: 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split(
            '_'
        ),
        monthsShort: 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'),
        weekdays: 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split(
            '_'
        ),
        weekdaysShort: 'Paz_Pzt_Sal_Çar_Per_Cum_Cmt'.split('_'),
        weekdaysMin: 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'),
        meridiem: function (hours, minutes, isLower) {
            if (hours < 12) {
                return isLower ? 'öö' : 'ÖÖ';
            } else {
                return isLower ? 'ös' : 'ÖS';
            }
        },
        meridiemParse: /öö|ÖÖ|ös|ÖS/,
        isPM: function (input) {
            return input === 'ös' || input === 'ÖS';
        },
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[bugün saat] LT',
            nextDay: '[yarın saat] LT',
            nextWeek: '[gelecek] dddd [saat] LT',
            lastDay: '[dün] LT',
            lastWeek: '[geçen] dddd [saat] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s sonra',
            past: '%s önce',
            s: 'birkaç saniye',
            ss: '%d saniye',
            m: 'bir dakika',
            mm: '%d dakika',
            h: 'bir saat',
            hh: '%d saat',
            d: 'bir gün',
            dd: '%d gün',
            w: 'bir hafta',
            ww: '%d hafta',
            M: 'bir ay',
            MM: '%d ay',
            y: 'bir yıl',
            yy: '%d yıl',
        },
        ordinal: function (number, period) {
            switch (period) {
                case 'd':
                case 'D':
                case 'Do':
                case 'DD':
                    return number;
                default:
                    if (number === 0) {
                        // special case for zero
                        return number + "'ıncı";
                    }
                    var a = number % 10,
                        b = (number % 100) - a,
                        c = number >= 100 ? 100 : null;
                    return number + (suffixes$5[a] || suffixes$5[b] || suffixes$5[c]);
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    // After the year there should be a slash and the amount of years since December 26, 1979 in Roman numerals.
    // This is currently too difficult (maybe even impossible) to add.
    hooks.defineLocale('tzl', {
        months: 'Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar'.split(
            '_'
        ),
        monthsShort: 'Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec'.split('_'),
        weekdays: 'Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi'.split('_'),
        weekdaysShort: 'Súl_Lún_Mai_Már_Xhú_Vié_Sát'.split('_'),
        weekdaysMin: 'Sú_Lú_Ma_Má_Xh_Vi_Sá'.split('_'),
        longDateFormat: {
            LT: 'HH.mm',
            LTS: 'HH.mm.ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM [dallas] YYYY',
            LLL: 'D. MMMM [dallas] YYYY HH.mm',
            LLLL: 'dddd, [li] D. MMMM [dallas] YYYY HH.mm',
        },
        meridiemParse: /d\'o|d\'a/i,
        isPM: function (input) {
            return "d'o" === input.toLowerCase();
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours > 11) {
                return isLower ? "d'o" : "D'O";
            } else {
                return isLower ? "d'a" : "D'A";
            }
        },
        calendar: {
            sameDay: '[oxhi à] LT',
            nextDay: '[demà à] LT',
            nextWeek: 'dddd [à] LT',
            lastDay: '[ieiri à] LT',
            lastWeek: '[sür el] dddd [lasteu à] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'osprei %s',
            past: 'ja%s',
            s: processRelativeTime$8,
            ss: processRelativeTime$8,
            m: processRelativeTime$8,
            mm: processRelativeTime$8,
            h: processRelativeTime$8,
            hh: processRelativeTime$8,
            d: processRelativeTime$8,
            dd: processRelativeTime$8,
            M: processRelativeTime$8,
            MM: processRelativeTime$8,
            y: processRelativeTime$8,
            yy: processRelativeTime$8,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    function processRelativeTime$8(number, withoutSuffix, key, isFuture) {
        var format = {
            s: ['viensas secunds', "'iensas secunds"],
            ss: [number + ' secunds', '' + number + ' secunds'],
            m: ["'n míut", "'iens míut"],
            mm: [number + ' míuts', '' + number + ' míuts'],
            h: ["'n þora", "'iensa þora"],
            hh: [number + ' þoras', '' + number + ' þoras'],
            d: ["'n ziua", "'iensa ziua"],
            dd: [number + ' ziuas', '' + number + ' ziuas'],
            M: ["'n mes", "'iens mes"],
            MM: [number + ' mesen', '' + number + ' mesen'],
            y: ["'n ar", "'iens ar"],
            yy: [number + ' ars', '' + number + ' ars'],
        };
        return isFuture
            ? format[key][0]
            : withoutSuffix
            ? format[key][0]
            : format[key][1];
    }

    //! moment.js locale configuration

    hooks.defineLocale('tzm-latn', {
        months: 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split(
            '_'
        ),
        monthsShort:
            'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split(
                '_'
            ),
        weekdays: 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
        weekdaysShort: 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
        weekdaysMin: 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[asdkh g] LT',
            nextDay: '[aska g] LT',
            nextWeek: 'dddd [g] LT',
            lastDay: '[assant g] LT',
            lastWeek: 'dddd [g] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'dadkh s yan %s',
            past: 'yan %s',
            s: 'imik',
            ss: '%d imik',
            m: 'minuḍ',
            mm: '%d minuḍ',
            h: 'saɛa',
            hh: '%d tassaɛin',
            d: 'ass',
            dd: '%d ossan',
            M: 'ayowr',
            MM: '%d iyyirn',
            y: 'asgas',
            yy: '%d isgasn',
        },
        week: {
            dow: 6, // Saturday is the first day of the week.
            doy: 12, // The week that contains Jan 12th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('tzm', {
        months: 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split(
            '_'
        ),
        monthsShort:
            'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split(
                '_'
            ),
        weekdays: 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
        weekdaysShort: 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
        weekdaysMin: 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[ⴰⵙⴷⵅ ⴴ] LT',
            nextDay: '[ⴰⵙⴽⴰ ⴴ] LT',
            nextWeek: 'dddd [ⴴ] LT',
            lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT',
            lastWeek: 'dddd [ⴴ] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s',
            past: 'ⵢⴰⵏ %s',
            s: 'ⵉⵎⵉⴽ',
            ss: '%d ⵉⵎⵉⴽ',
            m: 'ⵎⵉⵏⵓⴺ',
            mm: '%d ⵎⵉⵏⵓⴺ',
            h: 'ⵙⴰⵄⴰ',
            hh: '%d ⵜⴰⵙⵙⴰⵄⵉⵏ',
            d: 'ⴰⵙⵙ',
            dd: '%d oⵙⵙⴰⵏ',
            M: 'ⴰⵢoⵓⵔ',
            MM: '%d ⵉⵢⵢⵉⵔⵏ',
            y: 'ⴰⵙⴳⴰⵙ',
            yy: '%d ⵉⵙⴳⴰⵙⵏ',
        },
        week: {
            dow: 6, // Saturday is the first day of the week.
            doy: 12, // The week that contains Jan 12th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('ug-cn', {
        months: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split(
            '_'
        ),
        monthsShort:
            'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split(
                '_'
            ),
        weekdays: 'يەكشەنبە_دۈشەنبە_سەيشەنبە_چارشەنبە_پەيشەنبە_جۈمە_شەنبە'.split(
            '_'
        ),
        weekdaysShort: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'),
        weekdaysMin: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY-MM-DD',
            LL: 'YYYY-يىلىM-ئاينىڭD-كۈنى',
            LLL: 'YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm',
            LLLL: 'dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm',
        },
        meridiemParse: /يېرىم كېچە|سەھەر|چۈشتىن بۇرۇن|چۈش|چۈشتىن كېيىن|كەچ/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (
                meridiem === 'يېرىم كېچە' ||
                meridiem === 'سەھەر' ||
                meridiem === 'چۈشتىن بۇرۇن'
            ) {
                return hour;
            } else if (meridiem === 'چۈشتىن كېيىن' || meridiem === 'كەچ') {
                return hour + 12;
            } else {
                return hour >= 11 ? hour : hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            var hm = hour * 100 + minute;
            if (hm < 600) {
                return 'يېرىم كېچە';
            } else if (hm < 900) {
                return 'سەھەر';
            } else if (hm < 1130) {
                return 'چۈشتىن بۇرۇن';
            } else if (hm < 1230) {
                return 'چۈش';
            } else if (hm < 1800) {
                return 'چۈشتىن كېيىن';
            } else {
                return 'كەچ';
            }
        },
        calendar: {
            sameDay: '[بۈگۈن سائەت] LT',
            nextDay: '[ئەتە سائەت] LT',
            nextWeek: '[كېلەركى] dddd [سائەت] LT',
            lastDay: '[تۆنۈگۈن] LT',
            lastWeek: '[ئالدىنقى] dddd [سائەت] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s كېيىن',
            past: '%s بۇرۇن',
            s: 'نەچچە سېكونت',
            ss: '%d سېكونت',
            m: 'بىر مىنۇت',
            mm: '%d مىنۇت',
            h: 'بىر سائەت',
            hh: '%d سائەت',
            d: 'بىر كۈن',
            dd: '%d كۈن',
            M: 'بىر ئاي',
            MM: '%d ئاي',
            y: 'بىر يىل',
            yy: '%d يىل',
        },

        dayOfMonthOrdinalParse: /\d{1,2}(-كۈنى|-ئاي|-ھەپتە)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'd':
                case 'D':
                case 'DDD':
                    return number + '-كۈنى';
                case 'w':
                case 'W':
                    return number + '-ھەپتە';
                default:
                    return number;
            }
        },
        preparse: function (string) {
            return string.replace(/،/g, ',');
        },
        postformat: function (string) {
            return string.replace(/,/g, '،');
        },
        week: {
            // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 1st is the first week of the year.
        },
    });

    //! moment.js locale configuration

    function plural$6(word, num) {
        var forms = word.split('_');
        return num % 10 === 1 && num % 100 !== 11
            ? forms[0]
            : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20)
            ? forms[1]
            : forms[2];
    }
    function relativeTimeWithPlural$4(number, withoutSuffix, key) {
        var format = {
            ss: withoutSuffix ? 'секунда_секунди_секунд' : 'секунду_секунди_секунд',
            mm: withoutSuffix ? 'хвилина_хвилини_хвилин' : 'хвилину_хвилини_хвилин',
            hh: withoutSuffix ? 'година_години_годин' : 'годину_години_годин',
            dd: 'день_дні_днів',
            MM: 'місяць_місяці_місяців',
            yy: 'рік_роки_років',
        };
        if (key === 'm') {
            return withoutSuffix ? 'хвилина' : 'хвилину';
        } else if (key === 'h') {
            return withoutSuffix ? 'година' : 'годину';
        } else {
            return number + ' ' + plural$6(format[key], +number);
        }
    }
    function weekdaysCaseReplace(m, format) {
        var weekdays = {
                nominative:
                    'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split(
                        '_'
                    ),
                accusative:
                    'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split(
                        '_'
                    ),
                genitive:
                    'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split(
                        '_'
                    ),
            },
            nounCase;

        if (m === true) {
            return weekdays['nominative']
                .slice(1, 7)
                .concat(weekdays['nominative'].slice(0, 1));
        }
        if (!m) {
            return weekdays['nominative'];
        }

        nounCase = /(\[[ВвУу]\]) ?dddd/.test(format)
            ? 'accusative'
            : /\[?(?:минулої|наступної)? ?\] ?dddd/.test(format)
            ? 'genitive'
            : 'nominative';
        return weekdays[nounCase][m.day()];
    }
    function processHoursFunction(str) {
        return function () {
            return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT';
        };
    }

    hooks.defineLocale('uk', {
        months: {
            format: 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split(
                '_'
            ),
            standalone:
                'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split(
                    '_'
                ),
        },
        monthsShort: 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split(
            '_'
        ),
        weekdays: weekdaysCaseReplace,
        weekdaysShort: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
        weekdaysMin: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY р.',
            LLL: 'D MMMM YYYY р., HH:mm',
            LLLL: 'dddd, D MMMM YYYY р., HH:mm',
        },
        calendar: {
            sameDay: processHoursFunction('[Сьогодні '),
            nextDay: processHoursFunction('[Завтра '),
            lastDay: processHoursFunction('[Вчора '),
            nextWeek: processHoursFunction('[У] dddd ['),
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                    case 3:
                    case 5:
                    case 6:
                        return processHoursFunction('[Минулої] dddd [').call(this);
                    case 1:
                    case 2:
                    case 4:
                        return processHoursFunction('[Минулого] dddd [').call(this);
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'за %s',
            past: '%s тому',
            s: 'декілька секунд',
            ss: relativeTimeWithPlural$4,
            m: relativeTimeWithPlural$4,
            mm: relativeTimeWithPlural$4,
            h: 'годину',
            hh: relativeTimeWithPlural$4,
            d: 'день',
            dd: relativeTimeWithPlural$4,
            M: 'місяць',
            MM: relativeTimeWithPlural$4,
            y: 'рік',
            yy: relativeTimeWithPlural$4,
        },
        // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
        meridiemParse: /ночі|ранку|дня|вечора/,
        isPM: function (input) {
            return /^(дня|вечора)$/.test(input);
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'ночі';
            } else if (hour < 12) {
                return 'ранку';
            } else if (hour < 17) {
                return 'дня';
            } else {
                return 'вечора';
            }
        },
        dayOfMonthOrdinalParse: /\d{1,2}-(й|го)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'M':
                case 'd':
                case 'DDD':
                case 'w':
                case 'W':
                    return number + '-й';
                case 'D':
                    return number + '-го';
                default:
                    return number;
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    var months$b = [
            'جنوری',
            'فروری',
            'مارچ',
            'اپریل',
            'مئی',
            'جون',
            'جولائی',
            'اگست',
            'ستمبر',
            'اکتوبر',
            'نومبر',
            'دسمبر',
        ],
        days$2 = ['اتوار', 'پیر', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'ہفتہ'];

    hooks.defineLocale('ur', {
        months: months$b,
        monthsShort: months$b,
        weekdays: days$2,
        weekdaysShort: days$2,
        weekdaysMin: days$2,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd، D MMMM YYYY HH:mm',
        },
        meridiemParse: /صبح|شام/,
        isPM: function (input) {
            return 'شام' === input;
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'صبح';
            }
            return 'شام';
        },
        calendar: {
            sameDay: '[آج بوقت] LT',
            nextDay: '[کل بوقت] LT',
            nextWeek: 'dddd [بوقت] LT',
            lastDay: '[گذشتہ روز بوقت] LT',
            lastWeek: '[گذشتہ] dddd [بوقت] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s بعد',
            past: '%s قبل',
            s: 'چند سیکنڈ',
            ss: '%d سیکنڈ',
            m: 'ایک منٹ',
            mm: '%d منٹ',
            h: 'ایک گھنٹہ',
            hh: '%d گھنٹے',
            d: 'ایک دن',
            dd: '%d دن',
            M: 'ایک ماہ',
            MM: '%d ماہ',
            y: 'ایک سال',
            yy: '%d سال',
        },
        preparse: function (string) {
            return string.replace(/،/g, ',');
        },
        postformat: function (string) {
            return string.replace(/,/g, '،');
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('uz-latn', {
        months: 'Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr'.split(
            '_'
        ),
        monthsShort: 'Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek'.split('_'),
        weekdays:
            'Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba'.split(
                '_'
            ),
        weekdaysShort: 'Yak_Dush_Sesh_Chor_Pay_Jum_Shan'.split('_'),
        weekdaysMin: 'Ya_Du_Se_Cho_Pa_Ju_Sha'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'D MMMM YYYY, dddd HH:mm',
        },
        calendar: {
            sameDay: '[Bugun soat] LT [da]',
            nextDay: '[Ertaga] LT [da]',
            nextWeek: 'dddd [kuni soat] LT [da]',
            lastDay: '[Kecha soat] LT [da]',
            lastWeek: "[O'tgan] dddd [kuni soat] LT [da]",
            sameElse: 'L',
        },
        relativeTime: {
            future: 'Yaqin %s ichida',
            past: 'Bir necha %s oldin',
            s: 'soniya',
            ss: '%d soniya',
            m: 'bir daqiqa',
            mm: '%d daqiqa',
            h: 'bir soat',
            hh: '%d soat',
            d: 'bir kun',
            dd: '%d kun',
            M: 'bir oy',
            MM: '%d oy',
            y: 'bir yil',
            yy: '%d yil',
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('uz', {
        months: 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split(
            '_'
        ),
        monthsShort: 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),
        weekdays: 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'),
        weekdaysShort: 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'),
        weekdaysMin: 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'D MMMM YYYY, dddd HH:mm',
        },
        calendar: {
            sameDay: '[Бугун соат] LT [да]',
            nextDay: '[Эртага] LT [да]',
            nextWeek: 'dddd [куни соат] LT [да]',
            lastDay: '[Кеча соат] LT [да]',
            lastWeek: '[Утган] dddd [куни соат] LT [да]',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'Якин %s ичида',
            past: 'Бир неча %s олдин',
            s: 'фурсат',
            ss: '%d фурсат',
            m: 'бир дакика',
            mm: '%d дакика',
            h: 'бир соат',
            hh: '%d соат',
            d: 'бир кун',
            dd: '%d кун',
            M: 'бир ой',
            MM: '%d ой',
            y: 'бир йил',
            yy: '%d йил',
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('vi', {
        months: 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split(
            '_'
        ),
        monthsShort:
            'Thg 01_Thg 02_Thg 03_Thg 04_Thg 05_Thg 06_Thg 07_Thg 08_Thg 09_Thg 10_Thg 11_Thg 12'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split(
            '_'
        ),
        weekdaysShort: 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
        weekdaysMin: 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
        weekdaysParseExact: true,
        meridiemParse: /sa|ch/i,
        isPM: function (input) {
            return /^ch$/i.test(input);
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours < 12) {
                return isLower ? 'sa' : 'SA';
            } else {
                return isLower ? 'ch' : 'CH';
            }
        },
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM [năm] YYYY',
            LLL: 'D MMMM [năm] YYYY HH:mm',
            LLLL: 'dddd, D MMMM [năm] YYYY HH:mm',
            l: 'DD/M/YYYY',
            ll: 'D MMM YYYY',
            lll: 'D MMM YYYY HH:mm',
            llll: 'ddd, D MMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Hôm nay lúc] LT',
            nextDay: '[Ngày mai lúc] LT',
            nextWeek: 'dddd [tuần tới lúc] LT',
            lastDay: '[Hôm qua lúc] LT',
            lastWeek: 'dddd [tuần trước lúc] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s tới',
            past: '%s trước',
            s: 'vài giây',
            ss: '%d giây',
            m: 'một phút',
            mm: '%d phút',
            h: 'một giờ',
            hh: '%d giờ',
            d: 'một ngày',
            dd: '%d ngày',
            w: 'một tuần',
            ww: '%d tuần',
            M: 'một tháng',
            MM: '%d tháng',
            y: 'một năm',
            yy: '%d năm',
        },
        dayOfMonthOrdinalParse: /\d{1,2}/,
        ordinal: function (number) {
            return number;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('x-pseudo', {
        months: 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split(
            '_'
        ),
        monthsShort:
            'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays:
            'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split(
                '_'
            ),
        weekdaysShort: 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'),
        weekdaysMin: 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[T~ódá~ý át] LT',
            nextDay: '[T~ómó~rró~w át] LT',
            nextWeek: 'dddd [át] LT',
            lastDay: '[Ý~ést~érdá~ý át] LT',
            lastWeek: '[L~ást] dddd [át] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'í~ñ %s',
            past: '%s á~gó',
            s: 'á ~féw ~sécó~ñds',
            ss: '%d s~écóñ~ds',
            m: 'á ~míñ~úté',
            mm: '%d m~íñú~tés',
            h: 'á~ñ hó~úr',
            hh: '%d h~óúrs',
            d: 'á ~dáý',
            dd: '%d d~áýs',
            M: 'á ~móñ~th',
            MM: '%d m~óñt~hs',
            y: 'á ~ýéár',
            yy: '%d ý~éárs',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('yo', {
        months: 'Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀'.split(
            '_'
        ),
        monthsShort: 'Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀'.split('_'),
        weekdays: 'Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta'.split('_'),
        weekdaysShort: 'Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá'.split('_'),
        weekdaysMin: 'Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb'.split('_'),
        longDateFormat: {
            LT: 'h:mm A',
            LTS: 'h:mm:ss A',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY h:mm A',
            LLLL: 'dddd, D MMMM YYYY h:mm A',
        },
        calendar: {
            sameDay: '[Ònì ni] LT',
            nextDay: '[Ọ̀la ni] LT',
            nextWeek: "dddd [Ọsẹ̀ tón'bọ] [ni] LT",
            lastDay: '[Àna ni] LT',
            lastWeek: 'dddd [Ọsẹ̀ tólọ́] [ni] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'ní %s',
            past: '%s kọjá',
            s: 'ìsẹjú aayá die',
            ss: 'aayá %d',
            m: 'ìsẹjú kan',
            mm: 'ìsẹjú %d',
            h: 'wákati kan',
            hh: 'wákati %d',
            d: 'ọjọ́ kan',
            dd: 'ọjọ́ %d',
            M: 'osù kan',
            MM: 'osù %d',
            y: 'ọdún kan',
            yy: 'ọdún %d',
        },
        dayOfMonthOrdinalParse: /ọjọ́\s\d{1,2}/,
        ordinal: 'ọjọ́ %d',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('zh-cn', {
        months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(
            '_'
        ),
        monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(
            '_'
        ),
        weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
        weekdaysShort: '周日_周一_周二_周三_周四_周五_周六'.split('_'),
        weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY/MM/DD',
            LL: 'YYYY年M月D日',
            LLL: 'YYYY年M月D日Ah点mm分',
            LLLL: 'YYYY年M月D日ddddAh点mm分',
            l: 'YYYY/M/D',
            ll: 'YYYY年M月D日',
            lll: 'YYYY年M月D日 HH:mm',
            llll: 'YYYY年M月D日dddd HH:mm',
        },
        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
                return hour;
            } else if (meridiem === '下午' || meridiem === '晚上') {
                return hour + 12;
            } else {
                // '中午'
                return hour >= 11 ? hour : hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            var hm = hour * 100 + minute;
            if (hm < 600) {
                return '凌晨';
            } else if (hm < 900) {
                return '早上';
            } else if (hm < 1130) {
                return '上午';
            } else if (hm < 1230) {
                return '中午';
            } else if (hm < 1800) {
                return '下午';
            } else {
                return '晚上';
            }
        },
        calendar: {
            sameDay: '[今天]LT',
            nextDay: '[明天]LT',
            nextWeek: function (now) {
                if (now.week() !== this.week()) {
                    return '[下]dddLT';
                } else {
                    return '[本]dddLT';
                }
            },
            lastDay: '[昨天]LT',
            lastWeek: function (now) {
                if (this.week() !== now.week()) {
                    return '[上]dddLT';
                } else {
                    return '[本]dddLT';
                }
            },
            sameElse: 'L',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(日|月|周)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'd':
                case 'D':
                case 'DDD':
                    return number + '日';
                case 'M':
                    return number + '月';
                case 'w':
                case 'W':
                    return number + '周';
                default:
                    return number;
            }
        },
        relativeTime: {
            future: '%s后',
            past: '%s前',
            s: '几秒',
            ss: '%d 秒',
            m: '1 分钟',
            mm: '%d 分钟',
            h: '1 小时',
            hh: '%d 小时',
            d: '1 天',
            dd: '%d 天',
            w: '1 周',
            ww: '%d 周',
            M: '1 个月',
            MM: '%d 个月',
            y: '1 年',
            yy: '%d 年',
        },
        week: {
            // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('zh-hk', {
        months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(
            '_'
        ),
        monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(
            '_'
        ),
        weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
        weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),
        weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY/MM/DD',
            LL: 'YYYY年M月D日',
            LLL: 'YYYY年M月D日 HH:mm',
            LLLL: 'YYYY年M月D日dddd HH:mm',
            l: 'YYYY/M/D',
            ll: 'YYYY年M月D日',
            lll: 'YYYY年M月D日 HH:mm',
            llll: 'YYYY年M月D日dddd HH:mm',
        },
        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
                return hour;
            } else if (meridiem === '中午') {
                return hour >= 11 ? hour : hour + 12;
            } else if (meridiem === '下午' || meridiem === '晚上') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            var hm = hour * 100 + minute;
            if (hm < 600) {
                return '凌晨';
            } else if (hm < 900) {
                return '早上';
            } else if (hm < 1200) {
                return '上午';
            } else if (hm === 1200) {
                return '中午';
            } else if (hm < 1800) {
                return '下午';
            } else {
                return '晚上';
            }
        },
        calendar: {
            sameDay: '[今天]LT',
            nextDay: '[明天]LT',
            nextWeek: '[下]ddddLT',
            lastDay: '[昨天]LT',
            lastWeek: '[上]ddddLT',
            sameElse: 'L',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'd':
                case 'D':
                case 'DDD':
                    return number + '日';
                case 'M':
                    return number + '月';
                case 'w':
                case 'W':
                    return number + '週';
                default:
                    return number;
            }
        },
        relativeTime: {
            future: '%s後',
            past: '%s前',
            s: '幾秒',
            ss: '%d 秒',
            m: '1 分鐘',
            mm: '%d 分鐘',
            h: '1 小時',
            hh: '%d 小時',
            d: '1 天',
            dd: '%d 天',
            M: '1 個月',
            MM: '%d 個月',
            y: '1 年',
            yy: '%d 年',
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('zh-mo', {
        months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(
            '_'
        ),
        monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(
            '_'
        ),
        weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
        weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),
        weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'YYYY年M月D日',
            LLL: 'YYYY年M月D日 HH:mm',
            LLLL: 'YYYY年M月D日dddd HH:mm',
            l: 'D/M/YYYY',
            ll: 'YYYY年M月D日',
            lll: 'YYYY年M月D日 HH:mm',
            llll: 'YYYY年M月D日dddd HH:mm',
        },
        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
                return hour;
            } else if (meridiem === '中午') {
                return hour >= 11 ? hour : hour + 12;
            } else if (meridiem === '下午' || meridiem === '晚上') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            var hm = hour * 100 + minute;
            if (hm < 600) {
                return '凌晨';
            } else if (hm < 900) {
                return '早上';
            } else if (hm < 1130) {
                return '上午';
            } else if (hm < 1230) {
                return '中午';
            } else if (hm < 1800) {
                return '下午';
            } else {
                return '晚上';
            }
        },
        calendar: {
            sameDay: '[今天] LT',
            nextDay: '[明天] LT',
            nextWeek: '[下]dddd LT',
            lastDay: '[昨天] LT',
            lastWeek: '[上]dddd LT',
            sameElse: 'L',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'd':
                case 'D':
                case 'DDD':
                    return number + '日';
                case 'M':
                    return number + '月';
                case 'w':
                case 'W':
                    return number + '週';
                default:
                    return number;
            }
        },
        relativeTime: {
            future: '%s內',
            past: '%s前',
            s: '幾秒',
            ss: '%d 秒',
            m: '1 分鐘',
            mm: '%d 分鐘',
            h: '1 小時',
            hh: '%d 小時',
            d: '1 天',
            dd: '%d 天',
            M: '1 個月',
            MM: '%d 個月',
            y: '1 年',
            yy: '%d 年',
        },
    });

    //! moment.js locale configuration

    hooks.defineLocale('zh-tw', {
        months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(
            '_'
        ),
        monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(
            '_'
        ),
        weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
        weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),
        weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY/MM/DD',
            LL: 'YYYY年M月D日',
            LLL: 'YYYY年M月D日 HH:mm',
            LLLL: 'YYYY年M月D日dddd HH:mm',
            l: 'YYYY/M/D',
            ll: 'YYYY年M月D日',
            lll: 'YYYY年M月D日 HH:mm',
            llll: 'YYYY年M月D日dddd HH:mm',
        },
        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
                return hour;
            } else if (meridiem === '中午') {
                return hour >= 11 ? hour : hour + 12;
            } else if (meridiem === '下午' || meridiem === '晚上') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            var hm = hour * 100 + minute;
            if (hm < 600) {
                return '凌晨';
            } else if (hm < 900) {
                return '早上';
            } else if (hm < 1130) {
                return '上午';
            } else if (hm < 1230) {
                return '中午';
            } else if (hm < 1800) {
                return '下午';
            } else {
                return '晚上';
            }
        },
        calendar: {
            sameDay: '[今天] LT',
            nextDay: '[明天] LT',
            nextWeek: '[下]dddd LT',
            lastDay: '[昨天] LT',
            lastWeek: '[上]dddd LT',
            sameElse: 'L',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'd':
                case 'D':
                case 'DDD':
                    return number + '日';
                case 'M':
                    return number + '月';
                case 'w':
                case 'W':
                    return number + '週';
                default:
                    return number;
            }
        },
        relativeTime: {
            future: '%s後',
            past: '%s前',
            s: '幾秒',
            ss: '%d 秒',
            m: '1 分鐘',
            mm: '%d 分鐘',
            h: '1 小時',
            hh: '%d 小時',
            d: '1 天',
            dd: '%d 天',
            M: '1 個月',
            MM: '%d 個月',
            y: '1 年',
            yy: '%d 年',
        },
    });

    hooks.locale('en');

    return hooks;

})));
!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a():"function"==typeof define&&define.amd?define(a):e.moment=a()}(this,function(){"use strict";var E;function M(){return E.apply(null,arguments)}function F(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function z(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function l(e,a){return Object.prototype.hasOwnProperty.call(e,a)}function N(e){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(e).length;for(var a in e)if(l(e,a))return;return 1}function d(e){return void 0===e}function J(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function R(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function C(e,a){for(var t=[],s=e.length,n=0;n<s;++n)t.push(a(e[n],n));return t}function I(e,a){for(var t in a)l(a,t)&&(e[t]=a[t]);return l(a,"toString")&&(e.toString=a.toString),l(a,"valueOf")&&(e.valueOf=a.valueOf),e}function U(e,a,t,s){return Fa(e,a,t,s,!0).utc()}function h(e){return null==e._pf&&(e._pf={empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidEra:null,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],era:null,meridiem:null,rfc2822:!1,weekdayMismatch:!1}),e._pf}function G(e){if(null==e._isValid){var a=h(e),t=B.call(a.parsedDateParts,function(e){return null!=e}),t=!isNaN(e._d.getTime())&&a.overflow<0&&!a.empty&&!a.invalidEra&&!a.invalidMonth&&!a.invalidWeekday&&!a.weekdayMismatch&&!a.nullInput&&!a.invalidFormat&&!a.userInvalidated&&(!a.meridiem||a.meridiem&&t);if(e._strict&&(t=t&&0===a.charsLeftOver&&0===a.unusedTokens.length&&void 0===a.bigHour),null!=Object.isFrozen&&Object.isFrozen(e))return t;e._isValid=t}return e._isValid}function V(e){var a=U(NaN);return null!=e?I(h(a),e):h(a).userInvalidated=!0,a}var B=Array.prototype.some||function(e){for(var a=Object(this),t=a.length>>>0,s=0;s<t;s++)if(s in a&&e.call(this,a[s],s,a))return!0;return!1},K=M.momentProperties=[],q=!1;function Z(e,a){var t,s,n,r=K.length;if(d(a._isAMomentObject)||(e._isAMomentObject=a._isAMomentObject),d(a._i)||(e._i=a._i),d(a._f)||(e._f=a._f),d(a._l)||(e._l=a._l),d(a._strict)||(e._strict=a._strict),d(a._tzm)||(e._tzm=a._tzm),d(a._isUTC)||(e._isUTC=a._isUTC),d(a._offset)||(e._offset=a._offset),d(a._pf)||(e._pf=h(a)),d(a._locale)||(e._locale=a._locale),0<r)for(t=0;t<r;t++)d(n=a[s=K[t]])||(e[s]=n);return e}function $(e){Z(this,e),this._d=new Date(null!=e._d?e._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===q&&(q=!0,M.updateOffset(this),q=!1)}function Q(e){return e instanceof $||null!=e&&null!=e._isAMomentObject}function X(e){!1===M.suppressDeprecationWarnings&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+e)}function e(r,d){var i=!0;return I(function(){if(null!=M.deprecationHandler&&M.deprecationHandler(null,r),i){for(var e,a,t=[],s=arguments.length,n=0;n<s;n++){if(e="","object"==typeof arguments[n]){for(a in e+="\n["+n+"] ",arguments[0])l(arguments[0],a)&&(e+=a+": "+arguments[0][a]+", ");e=e.slice(0,-2)}else e=arguments[n];t.push(e)}X(r+"\nArguments: "+Array.prototype.slice.call(t).join("")+"\n"+(new Error).stack),i=!1}return d.apply(this,arguments)},d)}var ee={};function ae(e,a){null!=M.deprecationHandler&&M.deprecationHandler(e,a),ee[e]||(X(a),ee[e]=!0)}function te(e){return"undefined"!=typeof Function&&e instanceof Function||"[object Function]"===Object.prototype.toString.call(e)}function se(e,a){var t,s=I({},e);for(t in a)l(a,t)&&(z(e[t])&&z(a[t])?(s[t]={},I(s[t],e[t]),I(s[t],a[t])):null!=a[t]?s[t]=a[t]:delete s[t]);for(t in e)l(e,t)&&!l(a,t)&&z(e[t])&&(s[t]=I({},s[t]));return s}function ne(e){null!=e&&this.set(e)}M.suppressDeprecationWarnings=!1,M.deprecationHandler=null;var re=Object.keys||function(e){var a,t=[];for(a in e)l(e,a)&&t.push(a);return t};function de(e,a,t){var s=""+Math.abs(e);return(0<=e?t?"+":"":"-")+Math.pow(10,Math.max(0,a-s.length)).toString().substr(1)+s}var ie=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,_e=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,oe={},me={};function s(e,a,t,s){var n="string"==typeof s?function(){return this[s]()}:s;e&&(me[e]=n),a&&(me[a[0]]=function(){return de(n.apply(this,arguments),a[1],a[2])}),t&&(me[t]=function(){return this.localeData().ordinal(n.apply(this,arguments),e)})}function ue(e,a){return e.isValid()?(a=le(a,e.localeData()),oe[a]=oe[a]||function(s){for(var e,n=s.match(ie),a=0,r=n.length;a<r;a++)me[n[a]]?n[a]=me[n[a]]:n[a]=(e=n[a]).match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"");return function(e){for(var a="",t=0;t<r;t++)a+=te(n[t])?n[t].call(e,s):n[t];return a}}(a),oe[a](e)):e.localeData().invalidDate()}function le(e,a){var t=5;function s(e){return a.longDateFormat(e)||e}for(_e.lastIndex=0;0<=t&&_e.test(e);)e=e.replace(_e,s),_e.lastIndex=0,--t;return e}var Me={};function a(e,a){var t=e.toLowerCase();Me[t]=Me[t+"s"]=Me[a]=e}function i(e){return"string"==typeof e?Me[e]||Me[e.toLowerCase()]:void 0}function he(e){var a,t,s={};for(t in e)l(e,t)&&(a=i(t))&&(s[a]=e[t]);return s}var ce={};function t(e,a){ce[e]=a}function Le(e){return e%4==0&&e%100!=0||e%400==0}function u(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function m(e){var e=+e,a=0;return a=0!=e&&isFinite(e)?u(e):a}function Ye(a,t){return function(e){return null!=e?(fe(this,a,e),M.updateOffset(this,t),this):ye(this,a)}}function ye(e,a){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+a]():NaN}function fe(e,a,t){e.isValid()&&!isNaN(t)&&("FullYear"===a&&Le(e.year())&&1===e.month()&&29===e.date()?(t=m(t),e._d["set"+(e._isUTC?"UTC":"")+a](t,e.month(),ze(t,e.month()))):e._d["set"+(e._isUTC?"UTC":"")+a](t))}var n=/\d/,r=/\d\d/,pe=/\d{3}/,ke=/\d{4}/,_=/[+-]?\d{6}/,o=/\d\d?/,c=/\d\d\d\d?/,L=/\d\d\d\d\d\d?/,De=/\d{1,3}/,Y=/\d{1,4}/,y=/[+-]?\d{1,6}/,Te=/\d+/,ge=/[+-]?\d+/,we=/Z|[+-]\d\d:?\d\d/gi,be=/Z|[+-]\d\d(?::?\d\d)?/gi,f=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i;function p(e,t,s){He[e]=te(t)?t:function(e,a){return e&&s?s:t}}function Se(e,a){return l(He,e)?He[e](a._strict,a._locale):new RegExp(k(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(e,a,t,s,n){return a||t||s||n})))}function k(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var He={},ve={};function D(e,t){var a,s,n=t;for("string"==typeof e&&(e=[e]),J(t)&&(n=function(e,a){a[t]=m(e)}),s=e.length,a=0;a<s;a++)ve[e[a]]=n}function je(e,n){D(e,function(e,a,t,s){t._w=t._w||{},n(e,t._w,t,s)})}var T,g=0,xe=1,Pe=2,w=3,Oe=4,We=5,Ae=6,Ee=7,Fe=8;function ze(e,a){if(isNaN(e)||isNaN(a))return NaN;var t=(a%(t=12)+t)%t;return e+=(a-t)/12,1==t?Le(e)?29:28:31-t%7%2}T=Array.prototype.indexOf||function(e){for(var a=0;a<this.length;++a)if(this[a]===e)return a;return-1},s("M",["MM",2],"Mo",function(){return this.month()+1}),s("MMM",0,0,function(e){return this.localeData().monthsShort(this,e)}),s("MMMM",0,0,function(e){return this.localeData().months(this,e)}),a("month","M"),t("month",8),p("M",o),p("MM",o,r),p("MMM",function(e,a){return a.monthsShortRegex(e)}),p("MMMM",function(e,a){return a.monthsRegex(e)}),D(["M","MM"],function(e,a){a[xe]=m(e)-1}),D(["MMM","MMMM"],function(e,a,t,s){s=t._locale.monthsParse(e,s,t._strict);null!=s?a[xe]=s:h(t).invalidMonth=e});var Ne="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),Je="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),Re=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,Ce=f,Ie=f;function Ue(e,a){var t;if(e.isValid()){if("string"==typeof a)if(/^\d+$/.test(a))a=m(a);else if(!J(a=e.localeData().monthsParse(a)))return;t=Math.min(e.date(),ze(e.year(),a)),e._d["set"+(e._isUTC?"UTC":"")+"Month"](a,t)}}function Ge(e){return null!=e?(Ue(this,e),M.updateOffset(this,!0),this):ye(this,"Month")}function Ve(){function e(e,a){return a.length-e.length}for(var a,t=[],s=[],n=[],r=0;r<12;r++)a=U([2e3,r]),t.push(this.monthsShort(a,"")),s.push(this.months(a,"")),n.push(this.months(a,"")),n.push(this.monthsShort(a,""));for(t.sort(e),s.sort(e),n.sort(e),r=0;r<12;r++)t[r]=k(t[r]),s[r]=k(s[r]);for(r=0;r<24;r++)n[r]=k(n[r]);this._monthsRegex=new RegExp("^("+n.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+t.join("|")+")","i")}function Be(e){return Le(e)?366:365}s("Y",0,0,function(){var e=this.year();return e<=9999?de(e,4):"+"+e}),s(0,["YY",2],0,function(){return this.year()%100}),s(0,["YYYY",4],0,"year"),s(0,["YYYYY",5],0,"year"),s(0,["YYYYYY",6,!0],0,"year"),a("year","y"),t("year",1),p("Y",ge),p("YY",o,r),p("YYYY",Y,ke),p("YYYYY",y,_),p("YYYYYY",y,_),D(["YYYYY","YYYYYY"],g),D("YYYY",function(e,a){a[g]=2===e.length?M.parseTwoDigitYear(e):m(e)}),D("YY",function(e,a){a[g]=M.parseTwoDigitYear(e)}),D("Y",function(e,a){a[g]=parseInt(e,10)}),M.parseTwoDigitYear=function(e){return m(e)+(68<m(e)?1900:2e3)};var Ke=Ye("FullYear",!0);function qe(e,a,t,s,n,r,d){var i;return e<100&&0<=e?(i=new Date(e+400,a,t,s,n,r,d),isFinite(i.getFullYear())&&i.setFullYear(e)):i=new Date(e,a,t,s,n,r,d),i}function Ze(e){var a;return e<100&&0<=e?((a=Array.prototype.slice.call(arguments))[0]=e+400,a=new Date(Date.UTC.apply(null,a)),isFinite(a.getUTCFullYear())&&a.setUTCFullYear(e)):a=new Date(Date.UTC.apply(null,arguments)),a}function $e(e,a,t){t=7+a-t;return t-(7+Ze(e,0,t).getUTCDay()-a)%7-1}function Qe(e,a,t,s,n){var r,a=1+7*(a-1)+(7+t-s)%7+$e(e,s,n),t=a<=0?Be(r=e-1)+a:a>Be(e)?(r=e+1,a-Be(e)):(r=e,a);return{year:r,dayOfYear:t}}function Xe(e,a,t){var s,n,r=$e(e.year(),a,t),r=Math.floor((e.dayOfYear()-r-1)/7)+1;return r<1?s=r+ea(n=e.year()-1,a,t):r>ea(e.year(),a,t)?(s=r-ea(e.year(),a,t),n=e.year()+1):(n=e.year(),s=r),{week:s,year:n}}function ea(e,a,t){var s=$e(e,a,t),a=$e(e+1,a,t);return(Be(e)-s+a)/7}s("w",["ww",2],"wo","week"),s("W",["WW",2],"Wo","isoWeek"),a("week","w"),a("isoWeek","W"),t("week",5),t("isoWeek",5),p("w",o),p("ww",o,r),p("W",o),p("WW",o,r),je(["w","ww","W","WW"],function(e,a,t,s){a[s.substr(0,1)]=m(e)});function aa(e,a){return e.slice(a,7).concat(e.slice(0,a))}s("d",0,"do","day"),s("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),s("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),s("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),s("e",0,0,"weekday"),s("E",0,0,"isoWeekday"),a("day","d"),a("weekday","e"),a("isoWeekday","E"),t("day",11),t("weekday",11),t("isoWeekday",11),p("d",o),p("e",o),p("E",o),p("dd",function(e,a){return a.weekdaysMinRegex(e)}),p("ddd",function(e,a){return a.weekdaysShortRegex(e)}),p("dddd",function(e,a){return a.weekdaysRegex(e)}),je(["dd","ddd","dddd"],function(e,a,t,s){s=t._locale.weekdaysParse(e,s,t._strict);null!=s?a.d=s:h(t).invalidWeekday=e}),je(["d","e","E"],function(e,a,t,s){a[s]=m(e)});var ta="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),sa="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),na="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),ra=f,da=f,ia=f;function _a(){function e(e,a){return a.length-e.length}for(var a,t,s,n=[],r=[],d=[],i=[],_=0;_<7;_++)s=U([2e3,1]).day(_),a=k(this.weekdaysMin(s,"")),t=k(this.weekdaysShort(s,"")),s=k(this.weekdays(s,"")),n.push(a),r.push(t),d.push(s),i.push(a),i.push(t),i.push(s);n.sort(e),r.sort(e),d.sort(e),i.sort(e),this._weekdaysRegex=new RegExp("^("+i.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+d.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+r.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+n.join("|")+")","i")}function oa(){return this.hours()%12||12}function ma(e,a){s(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),a)})}function ua(e,a){return a._meridiemParse}s("H",["HH",2],0,"hour"),s("h",["hh",2],0,oa),s("k",["kk",2],0,function(){return this.hours()||24}),s("hmm",0,0,function(){return""+oa.apply(this)+de(this.minutes(),2)}),s("hmmss",0,0,function(){return""+oa.apply(this)+de(this.minutes(),2)+de(this.seconds(),2)}),s("Hmm",0,0,function(){return""+this.hours()+de(this.minutes(),2)}),s("Hmmss",0,0,function(){return""+this.hours()+de(this.minutes(),2)+de(this.seconds(),2)}),ma("a",!0),ma("A",!1),a("hour","h"),t("hour",13),p("a",ua),p("A",ua),p("H",o),p("h",o),p("k",o),p("HH",o,r),p("hh",o,r),p("kk",o,r),p("hmm",c),p("hmmss",L),p("Hmm",c),p("Hmmss",L),D(["H","HH"],w),D(["k","kk"],function(e,a,t){e=m(e);a[w]=24===e?0:e}),D(["a","A"],function(e,a,t){t._isPm=t._locale.isPM(e),t._meridiem=e}),D(["h","hh"],function(e,a,t){a[w]=m(e),h(t).bigHour=!0}),D("hmm",function(e,a,t){var s=e.length-2;a[w]=m(e.substr(0,s)),a[Oe]=m(e.substr(s)),h(t).bigHour=!0}),D("hmmss",function(e,a,t){var s=e.length-4,n=e.length-2;a[w]=m(e.substr(0,s)),a[Oe]=m(e.substr(s,2)),a[We]=m(e.substr(n)),h(t).bigHour=!0}),D("Hmm",function(e,a,t){var s=e.length-2;a[w]=m(e.substr(0,s)),a[Oe]=m(e.substr(s))}),D("Hmmss",function(e,a,t){var s=e.length-4,n=e.length-2;a[w]=m(e.substr(0,s)),a[Oe]=m(e.substr(s,2)),a[We]=m(e.substr(n))});f=Ye("Hours",!0);var la,Ma={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Ne,monthsShort:Je,week:{dow:0,doy:6},weekdays:ta,weekdaysMin:na,weekdaysShort:sa,meridiemParse:/[ap]\.?m?\.?/i},b={},ha={};function ca(e){return e&&e.toLowerCase().replace("_","-")}function La(e){for(var a,t,s,n,r=0;r<e.length;){for(a=(n=ca(e[r]).split("-")).length,t=(t=ca(e[r+1]))?t.split("-"):null;0<a;){if(s=Ya(n.slice(0,a).join("-")))return s;if(t&&t.length>=a&&function(e,a){for(var t=Math.min(e.length,a.length),s=0;s<t;s+=1)if(e[s]!==a[s])return s;return t}(n,t)>=a-1)break;a--}r++}return la}function Ya(a){var e;if(void 0===b[a]&&"undefined"!=typeof module&&module&&module.exports&&null!=a.match("^[^/\\\\]*$"))try{e=la._abbr,require("./locale/"+a),ya(e)}catch(e){b[a]=null}return b[a]}function ya(e,a){return e&&((a=d(a)?pa(e):fa(e,a))?la=a:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),la._abbr}function fa(e,a){if(null===a)return delete b[e],null;var t,s=Ma;if(a.abbr=e,null!=b[e])ae("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),s=b[e]._config;else if(null!=a.parentLocale)if(null!=b[a.parentLocale])s=b[a.parentLocale]._config;else{if(null==(t=Ya(a.parentLocale)))return ha[a.parentLocale]||(ha[a.parentLocale]=[]),ha[a.parentLocale].push({name:e,config:a}),null;s=t._config}return b[e]=new ne(se(s,a)),ha[e]&&ha[e].forEach(function(e){fa(e.name,e.config)}),ya(e),b[e]}function pa(e){var a;if(!(e=e&&e._locale&&e._locale._abbr?e._locale._abbr:e))return la;if(!F(e)){if(a=Ya(e))return a;e=[e]}return La(e)}function ka(e){var a=e._a;return a&&-2===h(e).overflow&&(a=a[xe]<0||11<a[xe]?xe:a[Pe]<1||a[Pe]>ze(a[g],a[xe])?Pe:a[w]<0||24<a[w]||24===a[w]&&(0!==a[Oe]||0!==a[We]||0!==a[Ae])?w:a[Oe]<0||59<a[Oe]?Oe:a[We]<0||59<a[We]?We:a[Ae]<0||999<a[Ae]?Ae:-1,h(e)._overflowDayOfYear&&(a<g||Pe<a)&&(a=Pe),h(e)._overflowWeeks&&-1===a&&(a=Ee),h(e)._overflowWeekday&&-1===a&&(a=Fe),h(e).overflow=a),e}var Da=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Ta=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ga=/Z|[+-]\d\d(?::?\d\d)?/,wa=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],ba=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Sa=/^\/?Date\((-?\d+)/i,Ha=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,va={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function ja(e){var a,t,s,n,r,d,i=e._i,_=Da.exec(i)||Ta.exec(i),i=wa.length,o=ba.length;if(_){for(h(e).iso=!0,a=0,t=i;a<t;a++)if(wa[a][1].exec(_[1])){n=wa[a][0],s=!1!==wa[a][2];break}if(null==n)e._isValid=!1;else{if(_[3]){for(a=0,t=o;a<t;a++)if(ba[a][1].exec(_[3])){r=(_[2]||" ")+ba[a][0];break}if(null==r)return void(e._isValid=!1)}if(s||null==r){if(_[4]){if(!ga.exec(_[4]))return void(e._isValid=!1);d="Z"}e._f=n+(r||"")+(d||""),Aa(e)}else e._isValid=!1}}else e._isValid=!1}function xa(e,a,t,s,n,r){e=[function(e){e=parseInt(e,10);{if(e<=49)return 2e3+e;if(e<=999)return 1900+e}return e}(e),Je.indexOf(a),parseInt(t,10),parseInt(s,10),parseInt(n,10)];return r&&e.push(parseInt(r,10)),e}function Pa(e){var a,t,s,n,r=Ha.exec(e._i.replace(/\([^()]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").replace(/^\s\s*/,"").replace(/\s\s*$/,""));r?(a=xa(r[4],r[3],r[2],r[5],r[6],r[7]),t=r[1],s=a,n=e,t&&sa.indexOf(t)!==new Date(s[0],s[1],s[2]).getDay()?(h(n).weekdayMismatch=!0,n._isValid=!1):(e._a=a,e._tzm=(t=r[8],s=r[9],n=r[10],t?va[t]:s?0:60*(((t=parseInt(n,10))-(s=t%100))/100)+s),e._d=Ze.apply(null,e._a),e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),h(e).rfc2822=!0)):e._isValid=!1}function Oa(e,a,t){return null!=e?e:null!=a?a:t}function Wa(e){var a,t,s,n,r,d,i,_,o,m,u,l=[];if(!e._d){for(s=e,n=new Date(M.now()),t=s._useUTC?[n.getUTCFullYear(),n.getUTCMonth(),n.getUTCDate()]:[n.getFullYear(),n.getMonth(),n.getDate()],e._w&&null==e._a[Pe]&&null==e._a[xe]&&(null!=(n=(s=e)._w).GG||null!=n.W||null!=n.E?(_=1,o=4,r=Oa(n.GG,s._a[g],Xe(S(),1,4).year),d=Oa(n.W,1),((i=Oa(n.E,1))<1||7<i)&&(m=!0)):(_=s._locale._week.dow,o=s._locale._week.doy,u=Xe(S(),_,o),r=Oa(n.gg,s._a[g],u.year),d=Oa(n.w,u.week),null!=n.d?((i=n.d)<0||6<i)&&(m=!0):null!=n.e?(i=n.e+_,(n.e<0||6<n.e)&&(m=!0)):i=_),d<1||d>ea(r,_,o)?h(s)._overflowWeeks=!0:null!=m?h(s)._overflowWeekday=!0:(u=Qe(r,d,i,_,o),s._a[g]=u.year,s._dayOfYear=u.dayOfYear)),null!=e._dayOfYear&&(n=Oa(e._a[g],t[g]),(e._dayOfYear>Be(n)||0===e._dayOfYear)&&(h(e)._overflowDayOfYear=!0),m=Ze(n,0,e._dayOfYear),e._a[xe]=m.getUTCMonth(),e._a[Pe]=m.getUTCDate()),a=0;a<3&&null==e._a[a];++a)e._a[a]=l[a]=t[a];for(;a<7;a++)e._a[a]=l[a]=null==e._a[a]?2===a?1:0:e._a[a];24===e._a[w]&&0===e._a[Oe]&&0===e._a[We]&&0===e._a[Ae]&&(e._nextDay=!0,e._a[w]=0),e._d=(e._useUTC?Ze:qe).apply(null,l),r=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[w]=24),e._w&&void 0!==e._w.d&&e._w.d!==r&&(h(e).weekdayMismatch=!0)}}function Aa(e){if(e._f===M.ISO_8601)ja(e);else if(e._f===M.RFC_2822)Pa(e);else{e._a=[],h(e).empty=!0;for(var a,t,s,n,r,d=""+e._i,i=d.length,_=0,o=le(e._f,e._locale).match(ie)||[],m=o.length,u=0;u<m;u++)t=o[u],(a=(d.match(Se(t,e))||[])[0])&&(0<(s=d.substr(0,d.indexOf(a))).length&&h(e).unusedInput.push(s),d=d.slice(d.indexOf(a)+a.length),_+=a.length),me[t]?(a?h(e).empty=!1:h(e).unusedTokens.push(t),s=t,r=e,null!=(n=a)&&l(ve,s)&&ve[s](n,r._a,r,s)):e._strict&&!a&&h(e).unusedTokens.push(t);h(e).charsLeftOver=i-_,0<d.length&&h(e).unusedInput.push(d),e._a[w]<=12&&!0===h(e).bigHour&&0<e._a[w]&&(h(e).bigHour=void 0),h(e).parsedDateParts=e._a.slice(0),h(e).meridiem=e._meridiem,e._a[w]=function(e,a,t){if(null==t)return a;return null!=e.meridiemHour?e.meridiemHour(a,t):null!=e.isPM?((e=e.isPM(t))&&a<12&&(a+=12),a=e||12!==a?a:0):a}(e._locale,e._a[w],e._meridiem),null!==(i=h(e).era)&&(e._a[g]=e._locale.erasConvertYear(i,e._a[g])),Wa(e),ka(e)}}function Ea(e){var a,t,s,n=e._i,r=e._f;if(e._locale=e._locale||pa(e._l),null===n||void 0===r&&""===n)return V({nullInput:!0});if("string"==typeof n&&(e._i=n=e._locale.preparse(n)),Q(n))return new $(ka(n));if(R(n))e._d=n;else if(F(r))!function(e){var a,t,s,n,r,d,i=!1,_=e._f.length;if(0===_)return h(e).invalidFormat=!0,e._d=new Date(NaN);for(n=0;n<_;n++)r=0,d=!1,a=Z({},e),null!=e._useUTC&&(a._useUTC=e._useUTC),a._f=e._f[n],Aa(a),G(a)&&(d=!0),r=(r+=h(a).charsLeftOver)+10*h(a).unusedTokens.length,h(a).score=r,i?r<s&&(s=r,t=a):(null==s||r<s||d)&&(s=r,t=a,d&&(i=!0));I(e,t||a)}(e);else if(r)Aa(e);else if(d(r=(n=e)._i))n._d=new Date(M.now());else R(r)?n._d=new Date(r.valueOf()):"string"==typeof r?(t=n,null!==(a=Sa.exec(t._i))?t._d=new Date(+a[1]):(ja(t),!1===t._isValid&&(delete t._isValid,Pa(t),!1===t._isValid&&(delete t._isValid,t._strict?t._isValid=!1:M.createFromInputFallback(t))))):F(r)?(n._a=C(r.slice(0),function(e){return parseInt(e,10)}),Wa(n)):z(r)?(a=n)._d||(s=void 0===(t=he(a._i)).day?t.date:t.day,a._a=C([t.year,t.month,s,t.hour,t.minute,t.second,t.millisecond],function(e){return e&&parseInt(e,10)}),Wa(a)):J(r)?n._d=new Date(r):M.createFromInputFallback(n);return G(e)||(e._d=null),e}function Fa(e,a,t,s,n){var r={};return!0!==a&&!1!==a||(s=a,a=void 0),!0!==t&&!1!==t||(s=t,t=void 0),(z(e)&&N(e)||F(e)&&0===e.length)&&(e=void 0),r._isAMomentObject=!0,r._useUTC=r._isUTC=n,r._l=t,r._i=e,r._f=a,r._strict=s,(n=new $(ka(Ea(n=r))))._nextDay&&(n.add(1,"d"),n._nextDay=void 0),n}function S(e,a,t,s){return Fa(e,a,t,s,!1)}M.createFromInputFallback=e("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(e){e._d=new Date(e._i+(e._useUTC?" UTC":""))}),M.ISO_8601=function(){},M.RFC_2822=function(){};c=e("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var e=S.apply(null,arguments);return this.isValid()&&e.isValid()?e<this?this:e:V()}),L=e("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var e=S.apply(null,arguments);return this.isValid()&&e.isValid()?this<e?this:e:V()});function za(e,a){var t,s;if(!(a=1===a.length&&F(a[0])?a[0]:a).length)return S();for(t=a[0],s=1;s<a.length;++s)a[s].isValid()&&!a[s][e](t)||(t=a[s]);return t}var Na=["year","quarter","month","week","day","hour","minute","second","millisecond"];function Ja(e){var e=he(e),a=e.year||0,t=e.quarter||0,s=e.month||0,n=e.week||e.isoWeek||0,r=e.day||0,d=e.hour||0,i=e.minute||0,_=e.second||0,o=e.millisecond||0;this._isValid=function(e){var a,t,s=!1,n=Na.length;for(a in e)if(l(e,a)&&(-1===T.call(Na,a)||null!=e[a]&&isNaN(e[a])))return!1;for(t=0;t<n;++t)if(e[Na[t]]){if(s)return!1;parseFloat(e[Na[t]])!==m(e[Na[t]])&&(s=!0)}return!0}(e),this._milliseconds=+o+1e3*_+6e4*i+1e3*d*60*60,this._days=+r+7*n,this._months=+s+3*t+12*a,this._data={},this._locale=pa(),this._bubble()}function Ra(e){return e instanceof Ja}function Ca(e){return e<0?-1*Math.round(-1*e):Math.round(e)}function Ia(e,t){s(e,0,0,function(){var e=this.utcOffset(),a="+";return e<0&&(e=-e,a="-"),a+de(~~(e/60),2)+t+de(~~e%60,2)})}Ia("Z",":"),Ia("ZZ",""),p("Z",be),p("ZZ",be),D(["Z","ZZ"],function(e,a,t){t._useUTC=!0,t._tzm=Ga(be,e)});var Ua=/([\+\-]|\d\d)/gi;function Ga(e,a){var a=(a||"").match(e);return null===a?null:0===(a=60*(e=((a[a.length-1]||[])+"").match(Ua)||["-",0,0])[1]+m(e[2]))?0:"+"===e[0]?a:-a}function Va(e,a){var t;return a._isUTC?(a=a.clone(),t=(Q(e)||R(e)?e:S(e)).valueOf()-a.valueOf(),a._d.setTime(a._d.valueOf()+t),M.updateOffset(a,!1),a):S(e).local()}function Ba(e){return-Math.round(e._d.getTimezoneOffset())}function Ka(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}M.updateOffset=function(){};var qa=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,Za=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function $a(e,a){var t,s=e,n=null;return Ra(e)?s={ms:e._milliseconds,d:e._days,M:e._months}:J(e)||!isNaN(+e)?(s={},a?s[a]=+e:s.milliseconds=+e):(n=qa.exec(e))?(t="-"===n[1]?-1:1,s={y:0,d:m(n[Pe])*t,h:m(n[w])*t,m:m(n[Oe])*t,s:m(n[We])*t,ms:m(Ca(1e3*n[Ae]))*t}):(n=Za.exec(e))?(t="-"===n[1]?-1:1,s={y:Qa(n[2],t),M:Qa(n[3],t),w:Qa(n[4],t),d:Qa(n[5],t),h:Qa(n[6],t),m:Qa(n[7],t),s:Qa(n[8],t)}):null==s?s={}:"object"==typeof s&&("from"in s||"to"in s)&&(a=function(e,a){var t;if(!e.isValid()||!a.isValid())return{milliseconds:0,months:0};a=Va(a,e),e.isBefore(a)?t=Xa(e,a):((t=Xa(a,e)).milliseconds=-t.milliseconds,t.months=-t.months);return t}(S(s.from),S(s.to)),(s={}).ms=a.milliseconds,s.M=a.months),n=new Ja(s),Ra(e)&&l(e,"_locale")&&(n._locale=e._locale),Ra(e)&&l(e,"_isValid")&&(n._isValid=e._isValid),n}function Qa(e,a){e=e&&parseFloat(e.replace(",","."));return(isNaN(e)?0:e)*a}function Xa(e,a){var t={};return t.months=a.month()-e.month()+12*(a.year()-e.year()),e.clone().add(t.months,"M").isAfter(a)&&--t.months,t.milliseconds=+a-+e.clone().add(t.months,"M"),t}function et(s,n){return function(e,a){var t;return null===a||isNaN(+a)||(ae(n,"moment()."+n+"(period, number) is deprecated. Please use moment()."+n+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),t=e,e=a,a=t),at(this,$a(e,a),s),this}}function at(e,a,t,s){var n=a._milliseconds,r=Ca(a._days),a=Ca(a._months);e.isValid()&&(s=null==s||s,a&&Ue(e,ye(e,"Month")+a*t),r&&fe(e,"Date",ye(e,"Date")+r*t),n&&e._d.setTime(e._d.valueOf()+n*t),s&&M.updateOffset(e,r||a))}$a.fn=Ja.prototype,$a.invalid=function(){return $a(NaN)};Ne=et(1,"add"),ta=et(-1,"subtract");function tt(e){return"string"==typeof e||e instanceof String}function st(e){return Q(e)||R(e)||tt(e)||J(e)||function(a){var e=F(a),t=!1;e&&(t=0===a.filter(function(e){return!J(e)&&tt(a)}).length);return e&&t}(e)||function(e){var a,t,s=z(e)&&!N(e),n=!1,r=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],d=r.length;for(a=0;a<d;a+=1)t=r[a],n=n||l(e,t);return s&&n}(e)||null==e}function nt(e,a){if(e.date()<a.date())return-nt(a,e);var t=12*(a.year()-e.year())+(a.month()-e.month()),s=e.clone().add(t,"months"),a=a-s<0?(a-s)/(s-e.clone().add(t-1,"months")):(a-s)/(e.clone().add(1+t,"months")-s);return-(t+a)||0}function rt(e){return void 0===e?this._locale._abbr:(null!=(e=pa(e))&&(this._locale=e),this)}M.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",M.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";na=e("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){return void 0===e?this.localeData():this.locale(e)});function dt(){return this._locale}var it=126227808e5;function _t(e,a){return(e%a+a)%a}function ot(e,a,t){return e<100&&0<=e?new Date(e+400,a,t)-it:new Date(e,a,t).valueOf()}function mt(e,a,t){return e<100&&0<=e?Date.UTC(e+400,a,t)-it:Date.UTC(e,a,t)}function ut(e,a){return a.erasAbbrRegex(e)}function lt(){for(var e=[],a=[],t=[],s=[],n=this.eras(),r=0,d=n.length;r<d;++r)a.push(k(n[r].name)),e.push(k(n[r].abbr)),t.push(k(n[r].narrow)),s.push(k(n[r].name)),s.push(k(n[r].abbr)),s.push(k(n[r].narrow));this._erasRegex=new RegExp("^("+s.join("|")+")","i"),this._erasNameRegex=new RegExp("^("+a.join("|")+")","i"),this._erasAbbrRegex=new RegExp("^("+e.join("|")+")","i"),this._erasNarrowRegex=new RegExp("^("+t.join("|")+")","i")}function Mt(e,a){s(0,[e,e.length],0,a)}function ht(e,a,t,s,n){var r;return null==e?Xe(this,s,n).year:(r=ea(e,s,n),function(e,a,t,s,n){e=Qe(e,a,t,s,n),a=Ze(e.year,0,e.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}.call(this,e,a=r<a?r:a,t,s,n))}s("N",0,0,"eraAbbr"),s("NN",0,0,"eraAbbr"),s("NNN",0,0,"eraAbbr"),s("NNNN",0,0,"eraName"),s("NNNNN",0,0,"eraNarrow"),s("y",["y",1],"yo","eraYear"),s("y",["yy",2],0,"eraYear"),s("y",["yyy",3],0,"eraYear"),s("y",["yyyy",4],0,"eraYear"),p("N",ut),p("NN",ut),p("NNN",ut),p("NNNN",function(e,a){return a.erasNameRegex(e)}),p("NNNNN",function(e,a){return a.erasNarrowRegex(e)}),D(["N","NN","NNN","NNNN","NNNNN"],function(e,a,t,s){s=t._locale.erasParse(e,s,t._strict);s?h(t).era=s:h(t).invalidEra=e}),p("y",Te),p("yy",Te),p("yyy",Te),p("yyyy",Te),p("yo",function(e,a){return a._eraYearOrdinalRegex||Te}),D(["y","yy","yyy","yyyy"],g),D(["yo"],function(e,a,t,s){var n;t._locale._eraYearOrdinalRegex&&(n=e.match(t._locale._eraYearOrdinalRegex)),t._locale.eraYearOrdinalParse?a[g]=t._locale.eraYearOrdinalParse(e,n):a[g]=parseInt(e,10)}),s(0,["gg",2],0,function(){return this.weekYear()%100}),s(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Mt("gggg","weekYear"),Mt("ggggg","weekYear"),Mt("GGGG","isoWeekYear"),Mt("GGGGG","isoWeekYear"),a("weekYear","gg"),a("isoWeekYear","GG"),t("weekYear",1),t("isoWeekYear",1),p("G",ge),p("g",ge),p("GG",o,r),p("gg",o,r),p("GGGG",Y,ke),p("gggg",Y,ke),p("GGGGG",y,_),p("ggggg",y,_),je(["gggg","ggggg","GGGG","GGGGG"],function(e,a,t,s){a[s.substr(0,2)]=m(e)}),je(["gg","GG"],function(e,a,t,s){a[s]=M.parseTwoDigitYear(e)}),s("Q",0,"Qo","quarter"),a("quarter","Q"),t("quarter",7),p("Q",n),D("Q",function(e,a){a[xe]=3*(m(e)-1)}),s("D",["DD",2],"Do","date"),a("date","D"),t("date",9),p("D",o),p("DD",o,r),p("Do",function(e,a){return e?a._dayOfMonthOrdinalParse||a._ordinalParse:a._dayOfMonthOrdinalParseLenient}),D(["D","DD"],Pe),D("Do",function(e,a){a[Pe]=m(e.match(o)[0])});Y=Ye("Date",!0);s("DDD",["DDDD",3],"DDDo","dayOfYear"),a("dayOfYear","DDD"),t("dayOfYear",4),p("DDD",De),p("DDDD",pe),D(["DDD","DDDD"],function(e,a,t){t._dayOfYear=m(e)}),s("m",["mm",2],0,"minute"),a("minute","m"),t("minute",14),p("m",o),p("mm",o,r),D(["m","mm"],Oe);var ct,ke=Ye("Minutes",!1),y=(s("s",["ss",2],0,"second"),a("second","s"),t("second",15),p("s",o),p("ss",o,r),D(["s","ss"],We),Ye("Seconds",!1));for(s("S",0,0,function(){return~~(this.millisecond()/100)}),s(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),s(0,["SSS",3],0,"millisecond"),s(0,["SSSS",4],0,function(){return 10*this.millisecond()}),s(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),s(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),s(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),s(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),s(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),a("millisecond","ms"),t("millisecond",16),p("S",De,n),p("SS",De,r),p("SSS",De,pe),ct="SSSS";ct.length<=9;ct+="S")p(ct,Te);function Lt(e,a){a[Ae]=m(1e3*("0."+e))}for(ct="S";ct.length<=9;ct+="S")D(ct,Lt);_=Ye("Milliseconds",!1),s("z",0,0,"zoneAbbr"),s("zz",0,0,"zoneName");n=$.prototype;function Yt(e){return e}n.add=Ne,n.calendar=function(e,a){1===arguments.length&&(arguments[0]?st(arguments[0])?(e=arguments[0],a=void 0):function(e){for(var a=z(e)&&!N(e),t=!1,s=["sameDay","nextDay","lastDay","nextWeek","lastWeek","sameElse"],n=0;n<s.length;n+=1)t=t||l(e,s[n]);return a&&t}(arguments[0])&&(a=arguments[0],e=void 0):a=e=void 0);var e=e||S(),t=Va(e,this).startOf("day"),t=M.calendarFormat(this,t)||"sameElse",a=a&&(te(a[t])?a[t].call(this,e):a[t]);return this.format(a||this.localeData().calendar(t,this,S(e)))},n.clone=function(){return new $(this)},n.diff=function(e,a,t){var s,n,r;if(!this.isValid())return NaN;if(!(s=Va(e,this)).isValid())return NaN;switch(n=6e4*(s.utcOffset()-this.utcOffset()),a=i(a)){case"year":r=nt(this,s)/12;break;case"month":r=nt(this,s);break;case"quarter":r=nt(this,s)/3;break;case"second":r=(this-s)/1e3;break;case"minute":r=(this-s)/6e4;break;case"hour":r=(this-s)/36e5;break;case"day":r=(this-s-n)/864e5;break;case"week":r=(this-s-n)/6048e5;break;default:r=this-s}return t?r:u(r)},n.endOf=function(e){var a,t;if(void 0===(e=i(e))||"millisecond"===e||!this.isValid())return this;switch(t=this._isUTC?mt:ot,e){case"year":a=t(this.year()+1,0,1)-1;break;case"quarter":a=t(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":a=t(this.year(),this.month()+1,1)-1;break;case"week":a=t(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":a=t(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":a=t(this.year(),this.month(),this.date()+1)-1;break;case"hour":a=this._d.valueOf(),a+=36e5-_t(a+(this._isUTC?0:6e4*this.utcOffset()),36e5)-1;break;case"minute":a=this._d.valueOf(),a+=6e4-_t(a,6e4)-1;break;case"second":a=this._d.valueOf(),a+=1e3-_t(a,1e3)-1;break}return this._d.setTime(a),M.updateOffset(this,!0),this},n.format=function(e){return e=e||(this.isUtc()?M.defaultFormatUtc:M.defaultFormat),e=ue(this,e),this.localeData().postformat(e)},n.from=function(e,a){return this.isValid()&&(Q(e)&&e.isValid()||S(e).isValid())?$a({to:this,from:e}).locale(this.locale()).humanize(!a):this.localeData().invalidDate()},n.fromNow=function(e){return this.from(S(),e)},n.to=function(e,a){return this.isValid()&&(Q(e)&&e.isValid()||S(e).isValid())?$a({from:this,to:e}).locale(this.locale()).humanize(!a):this.localeData().invalidDate()},n.toNow=function(e){return this.to(S(),e)},n.get=function(e){return te(this[e=i(e)])?this[e]():this},n.invalidAt=function(){return h(this).overflow},n.isAfter=function(e,a){return e=Q(e)?e:S(e),!(!this.isValid()||!e.isValid())&&("millisecond"===(a=i(a)||"millisecond")?this.valueOf()>e.valueOf():e.valueOf()<this.clone().startOf(a).valueOf())},n.isBefore=function(e,a){return e=Q(e)?e:S(e),!(!this.isValid()||!e.isValid())&&("millisecond"===(a=i(a)||"millisecond")?this.valueOf()<e.valueOf():this.clone().endOf(a).valueOf()<e.valueOf())},n.isBetween=function(e,a,t,s){return e=Q(e)?e:S(e),a=Q(a)?a:S(a),!!(this.isValid()&&e.isValid()&&a.isValid())&&(("("===(s=s||"()")[0]?this.isAfter(e,t):!this.isBefore(e,t))&&(")"===s[1]?this.isBefore(a,t):!this.isAfter(a,t)))},n.isSame=function(e,a){var e=Q(e)?e:S(e);return!(!this.isValid()||!e.isValid())&&("millisecond"===(a=i(a)||"millisecond")?this.valueOf()===e.valueOf():(e=e.valueOf(),this.clone().startOf(a).valueOf()<=e&&e<=this.clone().endOf(a).valueOf()))},n.isSameOrAfter=function(e,a){return this.isSame(e,a)||this.isAfter(e,a)},n.isSameOrBefore=function(e,a){return this.isSame(e,a)||this.isBefore(e,a)},n.isValid=function(){return G(this)},n.lang=na,n.locale=rt,n.localeData=dt,n.max=L,n.min=c,n.parsingFlags=function(){return I({},h(this))},n.set=function(e,a){if("object"==typeof e)for(var t=function(e){var a,t=[];for(a in e)l(e,a)&&t.push({unit:a,priority:ce[a]});return t.sort(function(e,a){return e.priority-a.priority}),t}(e=he(e)),s=t.length,n=0;n<s;n++)this[t[n].unit](e[t[n].unit]);else if(te(this[e=i(e)]))return this[e](a);return this},n.startOf=function(e){var a,t;if(void 0===(e=i(e))||"millisecond"===e||!this.isValid())return this;switch(t=this._isUTC?mt:ot,e){case"year":a=t(this.year(),0,1);break;case"quarter":a=t(this.year(),this.month()-this.month()%3,1);break;case"month":a=t(this.year(),this.month(),1);break;case"week":a=t(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":a=t(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":a=t(this.year(),this.month(),this.date());break;case"hour":a=this._d.valueOf(),a-=_t(a+(this._isUTC?0:6e4*this.utcOffset()),36e5);break;case"minute":a=this._d.valueOf(),a-=_t(a,6e4);break;case"second":a=this._d.valueOf(),a-=_t(a,1e3);break}return this._d.setTime(a),M.updateOffset(this,!0),this},n.subtract=ta,n.toArray=function(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]},n.toObject=function(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}},n.toDate=function(){return new Date(this.valueOf())},n.toISOString=function(e){if(!this.isValid())return null;var a=(e=!0!==e)?this.clone().utc():this;return a.year()<0||9999<a.year()?ue(a,e?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):te(Date.prototype.toISOString)?e?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",ue(a,"Z")):ue(a,e?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},n.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e,a="moment",t="";return this.isLocal()||(a=0===this.utcOffset()?"moment.utc":"moment.parseZone",t="Z"),a="["+a+'("]',e=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",this.format(a+e+"-MM-DD[T]HH:mm:ss.SSS"+(t+'[")]'))},"undefined"!=typeof Symbol&&null!=Symbol.for&&(n[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"}),n.toJSON=function(){return this.isValid()?this.toISOString():null},n.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},n.unix=function(){return Math.floor(this.valueOf()/1e3)},n.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},n.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},n.eraName=function(){for(var e,a=this.localeData().eras(),t=0,s=a.length;t<s;++t){if(e=this.clone().startOf("day").valueOf(),a[t].since<=e&&e<=a[t].until)return a[t].name;if(a[t].until<=e&&e<=a[t].since)return a[t].name}return""},n.eraNarrow=function(){for(var e,a=this.localeData().eras(),t=0,s=a.length;t<s;++t){if(e=this.clone().startOf("day").valueOf(),a[t].since<=e&&e<=a[t].until)return a[t].narrow;if(a[t].until<=e&&e<=a[t].since)return a[t].narrow}return""},n.eraAbbr=function(){for(var e,a=this.localeData().eras(),t=0,s=a.length;t<s;++t){if(e=this.clone().startOf("day").valueOf(),a[t].since<=e&&e<=a[t].until)return a[t].abbr;if(a[t].until<=e&&e<=a[t].since)return a[t].abbr}return""},n.eraYear=function(){for(var e,a,t=this.localeData().eras(),s=0,n=t.length;s<n;++s)if(e=t[s].since<=t[s].until?1:-1,a=this.clone().startOf("day").valueOf(),t[s].since<=a&&a<=t[s].until||t[s].until<=a&&a<=t[s].since)return(this.year()-M(t[s].since).year())*e+t[s].offset;return this.year()},n.year=Ke,n.isLeapYear=function(){return Le(this.year())},n.weekYear=function(e){return ht.call(this,e,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},n.isoWeekYear=function(e){return ht.call(this,e,this.isoWeek(),this.isoWeekday(),1,4)},n.quarter=n.quarters=function(e){return null==e?Math.ceil((this.month()+1)/3):this.month(3*(e-1)+this.month()%3)},n.month=Ge,n.daysInMonth=function(){return ze(this.year(),this.month())},n.week=n.weeks=function(e){var a=this.localeData().week(this);return null==e?a:this.add(7*(e-a),"d")},n.isoWeek=n.isoWeeks=function(e){var a=Xe(this,1,4).week;return null==e?a:this.add(7*(e-a),"d")},n.weeksInYear=function(){var e=this.localeData()._week;return ea(this.year(),e.dow,e.doy)},n.weeksInWeekYear=function(){var e=this.localeData()._week;return ea(this.weekYear(),e.dow,e.doy)},n.isoWeeksInYear=function(){return ea(this.year(),1,4)},n.isoWeeksInISOWeekYear=function(){return ea(this.isoWeekYear(),1,4)},n.date=Y,n.day=n.days=function(e){if(!this.isValid())return null!=e?this:NaN;var a,t,s=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=e?(a=e,t=this.localeData(),e="string"!=typeof a?a:isNaN(a)?"number"==typeof(a=t.weekdaysParse(a))?a:null:parseInt(a,10),this.add(e-s,"d")):s},n.weekday=function(e){if(!this.isValid())return null!=e?this:NaN;var a=(this.day()+7-this.localeData()._week.dow)%7;return null==e?a:this.add(e-a,"d")},n.isoWeekday=function(e){return this.isValid()?null!=e?(a=e,t=this.localeData(),t="string"==typeof a?t.weekdaysParse(a)%7||7:isNaN(a)?null:a,this.day(this.day()%7?t:t-7)):this.day()||7:null!=e?this:NaN;var a,t},n.dayOfYear=function(e){var a=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==e?a:this.add(e-a,"d")},n.hour=n.hours=f,n.minute=n.minutes=ke,n.second=n.seconds=y,n.millisecond=n.milliseconds=_,n.utcOffset=function(e,a,t){var s,n=this._offset||0;if(!this.isValid())return null!=e?this:NaN;if(null==e)return this._isUTC?n:Ba(this);if("string"==typeof e){if(null===(e=Ga(be,e)))return this}else Math.abs(e)<16&&!t&&(e*=60);return!this._isUTC&&a&&(s=Ba(this)),this._offset=e,this._isUTC=!0,null!=s&&this.add(s,"m"),n!==e&&(!a||this._changeInProgress?at(this,$a(e-n,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,M.updateOffset(this,!0),this._changeInProgress=null)),this},n.utc=function(e){return this.utcOffset(0,e)},n.local=function(e){return this._isUTC&&(this.utcOffset(0,e),this._isUTC=!1,e&&this.subtract(Ba(this),"m")),this},n.parseZone=function(){var e;return null!=this._tzm?this.utcOffset(this._tzm,!1,!0):"string"==typeof this._i&&(null!=(e=Ga(we,this._i))?this.utcOffset(e):this.utcOffset(0,!0)),this},n.hasAlignedHourOffset=function(e){return!!this.isValid()&&(e=e?S(e).utcOffset():0,(this.utcOffset()-e)%60==0)},n.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},n.isLocal=function(){return!!this.isValid()&&!this._isUTC},n.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},n.isUtc=Ka,n.isUTC=Ka,n.zoneAbbr=function(){return this._isUTC?"UTC":""},n.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},n.dates=e("dates accessor is deprecated. Use date instead.",Y),n.months=e("months accessor is deprecated. Use month instead",Ge),n.years=e("years accessor is deprecated. Use year instead",Ke),n.zone=e("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,a){return null!=e?(this.utcOffset(e="string"!=typeof e?-e:e,a),this):-this.utcOffset()}),n.isDSTShifted=e("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!d(this._isDSTShifted))return this._isDSTShifted;var e,a={};return Z(a,this),(a=Ea(a))._a?(e=(a._isUTC?U:S)(a._a),this._isDSTShifted=this.isValid()&&0<function(e,a,t){for(var s=Math.min(e.length,a.length),n=Math.abs(e.length-a.length),r=0,d=0;d<s;d++)(t&&e[d]!==a[d]||!t&&m(e[d])!==m(a[d]))&&r++;return r+n}(a._a,e.toArray())):this._isDSTShifted=!1,this._isDSTShifted});r=ne.prototype;function yt(e,a,t,s){var n=pa(),s=U().set(s,a);return n[t](s,e)}function ft(e,a,t){if(J(e)&&(a=e,e=void 0),e=e||"",null!=a)return yt(e,a,t,"month");for(var s=[],n=0;n<12;n++)s[n]=yt(e,n,t,"month");return s}function pt(e,a,t,s){a=("boolean"==typeof e?J(a)&&(t=a,a=void 0):(a=e,e=!1,J(t=a)&&(t=a,a=void 0)),a||"");var n,r=pa(),d=e?r._week.dow:0,i=[];if(null!=t)return yt(a,(t+d)%7,s,"day");for(n=0;n<7;n++)i[n]=yt(a,(n+d)%7,s,"day");return i}r.calendar=function(e,a,t){return te(e=this._calendar[e]||this._calendar.sameElse)?e.call(a,t):e},r.longDateFormat=function(e){var a=this._longDateFormat[e],t=this._longDateFormat[e.toUpperCase()];return a||!t?a:(this._longDateFormat[e]=t.match(ie).map(function(e){return"MMMM"===e||"MM"===e||"DD"===e||"dddd"===e?e.slice(1):e}).join(""),this._longDateFormat[e])},r.invalidDate=function(){return this._invalidDate},r.ordinal=function(e){return this._ordinal.replace("%d",e)},r.preparse=Yt,r.postformat=Yt,r.relativeTime=function(e,a,t,s){var n=this._relativeTime[t];return te(n)?n(e,a,t,s):n.replace(/%d/i,e)},r.pastFuture=function(e,a){return te(e=this._relativeTime[0<e?"future":"past"])?e(a):e.replace(/%s/i,a)},r.set=function(e){var a,t;for(t in e)l(e,t)&&(te(a=e[t])?this[t]=a:this["_"+t]=a);this._config=e,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},r.eras=function(e,a){for(var t,s=this._eras||pa("en")._eras,n=0,r=s.length;n<r;++n){switch(typeof s[n].since){case"string":t=M(s[n].since).startOf("day"),s[n].since=t.valueOf();break}switch(typeof s[n].until){case"undefined":s[n].until=1/0;break;case"string":t=M(s[n].until).startOf("day").valueOf(),s[n].until=t.valueOf();break}}return s},r.erasParse=function(e,a,t){var s,n,r,d,i,_=this.eras();for(e=e.toUpperCase(),s=0,n=_.length;s<n;++s)if(r=_[s].name.toUpperCase(),d=_[s].abbr.toUpperCase(),i=_[s].narrow.toUpperCase(),t)switch(a){case"N":case"NN":case"NNN":if(d===e)return _[s];break;case"NNNN":if(r===e)return _[s];break;case"NNNNN":if(i===e)return _[s];break}else if(0<=[r,d,i].indexOf(e))return _[s]},r.erasConvertYear=function(e,a){var t=e.since<=e.until?1:-1;return void 0===a?M(e.since).year():M(e.since).year()+(a-e.offset)*t},r.erasAbbrRegex=function(e){return l(this,"_erasAbbrRegex")||lt.call(this),e?this._erasAbbrRegex:this._erasRegex},r.erasNameRegex=function(e){return l(this,"_erasNameRegex")||lt.call(this),e?this._erasNameRegex:this._erasRegex},r.erasNarrowRegex=function(e){return l(this,"_erasNarrowRegex")||lt.call(this),e?this._erasNarrowRegex:this._erasRegex},r.months=function(e,a){return e?(F(this._months)?this._months:this._months[(this._months.isFormat||Re).test(a)?"format":"standalone"])[e.month()]:F(this._months)?this._months:this._months.standalone},r.monthsShort=function(e,a){return e?(F(this._monthsShort)?this._monthsShort:this._monthsShort[Re.test(a)?"format":"standalone"])[e.month()]:F(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},r.monthsParse=function(e,a,t){var s,n;if(this._monthsParseExact)return function(e,a,t){var s,n,r,e=e.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],s=0;s<12;++s)r=U([2e3,s]),this._shortMonthsParse[s]=this.monthsShort(r,"").toLocaleLowerCase(),this._longMonthsParse[s]=this.months(r,"").toLocaleLowerCase();return t?"MMM"===a?-1!==(n=T.call(this._shortMonthsParse,e))?n:null:-1!==(n=T.call(this._longMonthsParse,e))?n:null:"MMM"===a?-1!==(n=T.call(this._shortMonthsParse,e))||-1!==(n=T.call(this._longMonthsParse,e))?n:null:-1!==(n=T.call(this._longMonthsParse,e))||-1!==(n=T.call(this._shortMonthsParse,e))?n:null}.call(this,e,a,t);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),s=0;s<12;s++){if(n=U([2e3,s]),t&&!this._longMonthsParse[s]&&(this._longMonthsParse[s]=new RegExp("^"+this.months(n,"").replace(".","")+"$","i"),this._shortMonthsParse[s]=new RegExp("^"+this.monthsShort(n,"").replace(".","")+"$","i")),t||this._monthsParse[s]||(n="^"+this.months(n,"")+"|^"+this.monthsShort(n,""),this._monthsParse[s]=new RegExp(n.replace(".",""),"i")),t&&"MMMM"===a&&this._longMonthsParse[s].test(e))return s;if(t&&"MMM"===a&&this._shortMonthsParse[s].test(e))return s;if(!t&&this._monthsParse[s].test(e))return s}},r.monthsRegex=function(e){return this._monthsParseExact?(l(this,"_monthsRegex")||Ve.call(this),e?this._monthsStrictRegex:this._monthsRegex):(l(this,"_monthsRegex")||(this._monthsRegex=Ie),this._monthsStrictRegex&&e?this._monthsStrictRegex:this._monthsRegex)},r.monthsShortRegex=function(e){return this._monthsParseExact?(l(this,"_monthsRegex")||Ve.call(this),e?this._monthsShortStrictRegex:this._monthsShortRegex):(l(this,"_monthsShortRegex")||(this._monthsShortRegex=Ce),this._monthsShortStrictRegex&&e?this._monthsShortStrictRegex:this._monthsShortRegex)},r.week=function(e){return Xe(e,this._week.dow,this._week.doy).week},r.firstDayOfYear=function(){return this._week.doy},r.firstDayOfWeek=function(){return this._week.dow},r.weekdays=function(e,a){return a=F(this._weekdays)?this._weekdays:this._weekdays[e&&!0!==e&&this._weekdays.isFormat.test(a)?"format":"standalone"],!0===e?aa(a,this._week.dow):e?a[e.day()]:a},r.weekdaysMin=function(e){return!0===e?aa(this._weekdaysMin,this._week.dow):e?this._weekdaysMin[e.day()]:this._weekdaysMin},r.weekdaysShort=function(e){return!0===e?aa(this._weekdaysShort,this._week.dow):e?this._weekdaysShort[e.day()]:this._weekdaysShort},r.weekdaysParse=function(e,a,t){var s,n;if(this._weekdaysParseExact)return function(e,a,t){var s,n,r,e=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],s=0;s<7;++s)r=U([2e3,1]).day(s),this._minWeekdaysParse[s]=this.weekdaysMin(r,"").toLocaleLowerCase(),this._shortWeekdaysParse[s]=this.weekdaysShort(r,"").toLocaleLowerCase(),this._weekdaysParse[s]=this.weekdays(r,"").toLocaleLowerCase();return t?"dddd"===a?-1!==(n=T.call(this._weekdaysParse,e))?n:null:"ddd"===a?-1!==(n=T.call(this._shortWeekdaysParse,e))?n:null:-1!==(n=T.call(this._minWeekdaysParse,e))?n:null:"dddd"===a?-1!==(n=T.call(this._weekdaysParse,e))||-1!==(n=T.call(this._shortWeekdaysParse,e))||-1!==(n=T.call(this._minWeekdaysParse,e))?n:null:"ddd"===a?-1!==(n=T.call(this._shortWeekdaysParse,e))||-1!==(n=T.call(this._weekdaysParse,e))||-1!==(n=T.call(this._minWeekdaysParse,e))?n:null:-1!==(n=T.call(this._minWeekdaysParse,e))||-1!==(n=T.call(this._weekdaysParse,e))||-1!==(n=T.call(this._shortWeekdaysParse,e))?n:null}.call(this,e,a,t);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),s=0;s<7;s++){if(n=U([2e3,1]).day(s),t&&!this._fullWeekdaysParse[s]&&(this._fullWeekdaysParse[s]=new RegExp("^"+this.weekdays(n,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[s]=new RegExp("^"+this.weekdaysShort(n,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[s]=new RegExp("^"+this.weekdaysMin(n,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[s]||(n="^"+this.weekdays(n,"")+"|^"+this.weekdaysShort(n,"")+"|^"+this.weekdaysMin(n,""),this._weekdaysParse[s]=new RegExp(n.replace(".",""),"i")),t&&"dddd"===a&&this._fullWeekdaysParse[s].test(e))return s;if(t&&"ddd"===a&&this._shortWeekdaysParse[s].test(e))return s;if(t&&"dd"===a&&this._minWeekdaysParse[s].test(e))return s;if(!t&&this._weekdaysParse[s].test(e))return s}},r.weekdaysRegex=function(e){return this._weekdaysParseExact?(l(this,"_weekdaysRegex")||_a.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(l(this,"_weekdaysRegex")||(this._weekdaysRegex=ra),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)},r.weekdaysShortRegex=function(e){return this._weekdaysParseExact?(l(this,"_weekdaysRegex")||_a.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(l(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=da),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},r.weekdaysMinRegex=function(e){return this._weekdaysParseExact?(l(this,"_weekdaysRegex")||_a.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(l(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=ia),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},r.isPM=function(e){return"p"===(e+"").toLowerCase().charAt(0)},r.meridiem=function(e,a,t){return 11<e?t?"pm":"PM":t?"am":"AM"},ya("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var a=e%10;return e+(1===m(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")}}),M.lang=e("moment.lang is deprecated. Use moment.locale instead.",ya),M.langData=e("moment.langData is deprecated. Use moment.localeData instead.",pa);var kt=Math.abs;function Dt(e,a,t,s){a=$a(a,t);return e._milliseconds+=s*a._milliseconds,e._days+=s*a._days,e._months+=s*a._months,e._bubble()}function Tt(e){return e<0?Math.floor(e):Math.ceil(e)}function gt(e){return 4800*e/146097}function wt(e){return 146097*e/4800}function bt(e){return function(){return this.as(e)}}De=bt("ms"),pe=bt("s"),Ne=bt("m"),L=bt("h"),c=bt("d"),ta=bt("w"),f=bt("M"),ke=bt("Q"),y=bt("y");function St(e){return function(){return this.isValid()?this._data[e]:NaN}}var _=St("milliseconds"),Y=St("seconds"),Ke=St("minutes"),r=St("hours"),Ht=St("days"),vt=St("months"),jt=St("years");var xt=Math.round,Pt={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function Ot(e,a,t,s){var n=$a(e).abs(),r=xt(n.as("s")),d=xt(n.as("m")),i=xt(n.as("h")),_=xt(n.as("d")),o=xt(n.as("M")),m=xt(n.as("w")),n=xt(n.as("y")),r=(r<=t.ss?["s",r]:r<t.s&&["ss",r])||d<=1&&["m"]||d<t.m&&["mm",d]||i<=1&&["h"]||i<t.h&&["hh",i]||_<=1&&["d"]||_<t.d&&["dd",_];return(r=(r=null!=t.w?r||m<=1&&["w"]||m<t.w&&["ww",m]:r)||o<=1&&["M"]||o<t.M&&["MM",o]||n<=1&&["y"]||["yy",n])[2]=a,r[3]=0<+e,r[4]=s,function(e,a,t,s,n){return n.relativeTime(a||1,!!t,e,s)}.apply(null,r)}var Wt=Math.abs;function At(e){return(0<e)-(e<0)||+e}function Et(){if(!this.isValid())return this.localeData().invalidDate();var e,a,t,s,n,r,d,i=Wt(this._milliseconds)/1e3,_=Wt(this._days),o=Wt(this._months),m=this.asSeconds();return m?(e=u(i/60),a=u(e/60),i%=60,e%=60,t=u(o/12),o%=12,s=i?i.toFixed(3).replace(/\.?0+$/,""):"",n=At(this._months)!==At(m)?"-":"",r=At(this._days)!==At(m)?"-":"",d=At(this._milliseconds)!==At(m)?"-":"",(m<0?"-":"")+"P"+(t?n+t+"Y":"")+(o?n+o+"M":"")+(_?r+_+"D":"")+(a||e||i?"T":"")+(a?d+a+"H":"")+(e?d+e+"M":"")+(i?d+s+"S":"")):"P0D"}function Ft(e){return 0===e?0:1===e?1:2===e?2:3<=e%100&&e%100<=10?3:11<=e%100?4:5}function H(d){return function(e,a,t,s){var n=Ft(e),r=Jt[d][Ft(e)];return(r=2===n?r[a?0:1]:r).replace(/%d/i,e)}}function zt(e){return 0===e?0:1===e?1:2===e?2:3<=e%100&&e%100<=10?3:11<=e%100?4:5}function v(d){return function(e,a,t,s){var n=zt(e),r=Ct[d][zt(e)];return(r=2===n?r[a?0:1]:r).replace(/%d/i,e)}}function Nt(e){return 0===e?0:1===e?1:2===e?2:3<=e%100&&e%100<=10?3:11<=e%100?4:5}function j(d){return function(e,a,t,s){var n=Nt(e),r=Bt[d][Nt(e)];return(r=2===n?r[a?0:1]:r).replace(/%d/i,e)}}var x=Ja.prototype,Jt=(x.isValid=function(){return this._isValid},x.abs=function(){var e=this._data;return this._milliseconds=kt(this._milliseconds),this._days=kt(this._days),this._months=kt(this._months),e.milliseconds=kt(e.milliseconds),e.seconds=kt(e.seconds),e.minutes=kt(e.minutes),e.hours=kt(e.hours),e.months=kt(e.months),e.years=kt(e.years),this},x.add=function(e,a){return Dt(this,e,a,1)},x.subtract=function(e,a){return Dt(this,e,a,-1)},x.as=function(e){if(!this.isValid())return NaN;var a,t,s=this._milliseconds;if("month"===(e=i(e))||"quarter"===e||"year"===e)switch(a=this._days+s/864e5,t=this._months+gt(a),e){case"month":return t;case"quarter":return t/3;case"year":return t/12}else switch(a=this._days+Math.round(wt(this._months)),e){case"week":return a/7+s/6048e5;case"day":return a+s/864e5;case"hour":return 24*a+s/36e5;case"minute":return 1440*a+s/6e4;case"second":return 86400*a+s/1e3;case"millisecond":return Math.floor(864e5*a)+s;default:throw new Error("Unknown unit "+e)}},x.asMilliseconds=De,x.asSeconds=pe,x.asMinutes=Ne,x.asHours=L,x.asDays=c,x.asWeeks=ta,x.asMonths=f,x.asQuarters=ke,x.asYears=y,x.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*m(this._months/12):NaN},x._bubble=function(){var e=this._milliseconds,a=this._days,t=this._months,s=this._data;return 0<=e&&0<=a&&0<=t||e<=0&&a<=0&&t<=0||(e+=864e5*Tt(wt(t)+a),t=a=0),s.milliseconds=e%1e3,e=u(e/1e3),s.seconds=e%60,e=u(e/60),s.minutes=e%60,e=u(e/60),s.hours=e%24,a+=u(e/24),t+=e=u(gt(a)),a-=Tt(wt(e)),e=u(t/12),t%=12,s.days=a,s.months=t,s.years=e,this},x.clone=function(){return $a(this)},x.get=function(e){return e=i(e),this.isValid()?this[e+"s"]():NaN},x.milliseconds=_,x.seconds=Y,x.minutes=Ke,x.hours=r,x.days=Ht,x.weeks=function(){return u(this.days()/7)},x.months=vt,x.years=jt,x.humanize=function(e,a){if(!this.isValid())return this.localeData().invalidDate();var t=!1,s=Pt;return"object"==typeof e&&(a=e,e=!1),"boolean"==typeof e&&(t=e),"object"==typeof a&&(s=Object.assign({},Pt,a),null!=a.s&&null==a.ss&&(s.ss=a.s-1)),e=this.localeData(),a=Ot(this,!t,s,e),t&&(a=e.pastFuture(+this,a)),e.postformat(a)},x.toISOString=Et,x.toString=Et,x.toJSON=Et,x.locale=rt,x.localeData=dt,x.toIsoString=e("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Et),x.lang=na,s("X",0,0,"unix"),s("x",0,0,"valueOf"),p("x",ge),p("X",/[+-]?\d+(\.\d{1,3})?/),D("X",function(e,a,t){t._d=new Date(1e3*parseFloat(e))}),D("x",function(e,a,t){t._d=new Date(m(e))}),M.version="2.29.4",E=S,M.fn=n,M.min=function(){return za("isBefore",[].slice.call(arguments,0))},M.max=function(){return za("isAfter",[].slice.call(arguments,0))},M.now=function(){return Date.now?Date.now():+new Date},M.utc=U,M.unix=function(e){return S(1e3*e)},M.months=function(e,a){return ft(e,a,"months")},M.isDate=R,M.locale=ya,M.invalid=V,M.duration=$a,M.isMoment=Q,M.weekdays=function(e,a,t){return pt(e,a,t,"weekdays")},M.parseZone=function(){return S.apply(null,arguments).parseZone()},M.localeData=pa,M.isDuration=Ra,M.monthsShort=function(e,a){return ft(e,a,"monthsShort")},M.weekdaysMin=function(e,a,t){return pt(e,a,t,"weekdaysMin")},M.defineLocale=fa,M.updateLocale=function(e,a){var t,s;return null!=a?(s=Ma,null!=b[e]&&null!=b[e].parentLocale?b[e].set(se(b[e]._config,a)):(a=se(s=null!=(t=Ya(e))?t._config:s,a),null==t&&(a.abbr=e),(s=new ne(a)).parentLocale=b[e],b[e]=s),ya(e)):null!=b[e]&&(null!=b[e].parentLocale?(b[e]=b[e].parentLocale,e===ya()&&ya(e)):null!=b[e]&&delete b[e]),b[e]},M.locales=function(){return re(b)},M.weekdaysShort=function(e,a,t){return pt(e,a,t,"weekdaysShort")},M.normalizeUnits=i,M.relativeTimeRounding=function(e){return void 0===e?xt:"function"==typeof e&&(xt=e,!0)},M.relativeTimeThreshold=function(e,a){return void 0!==Pt[e]&&(void 0===a?Pt[e]:(Pt[e]=a,"s"===e&&(Pt.ss=a-1),!0))},M.calendarFormat=function(e,a){return(e=e.diff(a,"days",!0))<-6?"sameElse":e<-1?"lastWeek":e<0?"lastDay":e<1?"sameDay":e<2?"nextDay":e<7?"nextWeek":"sameElse"},M.prototype=n,M.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},M.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(e){return/^nm$/i.test(e)},meridiem:function(e,a,t){return e<12?t?"vm":"VM":t?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[M\xf4re om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",ss:"%d sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||20<=e?"ste":"de")},week:{dow:1,doy:4}}),{s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]}),De=["\u062c\u0627\u0646\u0641\u064a","\u0641\u064a\u0641\u0631\u064a","\u0645\u0627\u0631\u0633","\u0623\u0641\u0631\u064a\u0644","\u0645\u0627\u064a","\u062c\u0648\u0627\u0646","\u062c\u0648\u064a\u0644\u064a\u0629","\u0623\u0648\u062a","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"],Rt=(M.defineLocale("ar-dz",{months:De,monthsShort:De,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(e){return"\u0645"===e},meridiem:function(e,a,t){return e<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:H("s"),ss:H("s"),m:H("m"),mm:H("m"),h:H("h"),hh:H("h"),d:H("d"),dd:H("d"),M:H("M"),MM:H("M"),y:H("y"),yy:H("y")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:0,doy:4}}),M.defineLocale("ar-kw",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062a\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062a\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:0,doy:12}}),{1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",0:"0"}),Ct={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},pe=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"],It=(M.defineLocale("ar-ly",{months:pe,monthsShort:pe,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(e){return"\u0645"===e},meridiem:function(e,a,t){return e<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:v("s"),ss:v("s"),m:v("m"),mm:v("m"),h:v("h"),hh:v("h"),d:v("d"),dd:v("d"),M:v("M"),MM:v("M"),y:v("y"),yy:v("y")},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return Rt[e]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}}),M.defineLocale("ar-ma",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:1,doy:4}}),{1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"}),Ut={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},Gt=(M.defineLocale("ar-sa",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(e){return"\u0645"===e},meridiem:function(e,a,t){return e<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},preparse:function(e){return e.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(e){return Ut[e]}).replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return It[e]}).replace(/,/g,"\u060c")},week:{dow:0,doy:6}}),M.defineLocale("ar-tn",{months:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:1,doy:4}}),{1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"}),Vt={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},Bt={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},Ne=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"],Kt=(M.defineLocale("ar",{months:Ne,monthsShort:Ne,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(e){return"\u0645"===e},meridiem:function(e,a,t){return e<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:j("s"),ss:j("s"),m:j("m"),mm:j("m"),h:j("h"),hh:j("h"),d:j("d"),dd:j("d"),M:j("M"),MM:j("M"),y:j("y"),yy:j("y")},preparse:function(e){return e.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(e){return Vt[e]}).replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return Gt[e]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}}),{1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-\xfcnc\xfc",4:"-\xfcnc\xfc",100:"-\xfcnc\xfc",6:"-nc\u0131",9:"-uncu",10:"-uncu",30:"-uncu",60:"-\u0131nc\u0131",90:"-\u0131nc\u0131"});function qt(e,a,t){return"m"===t?a?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443":"h"===t?a?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443":e+" "+(e=+e,a=(a={ss:a?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:a?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d",hh:a?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d",dd:"\u0434\u0437\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u0437\u0451\u043d",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u044b_\u043c\u0435\u0441\u044f\u0446\u0430\u045e",yy:"\u0433\u043e\u0434_\u0433\u0430\u0434\u044b_\u0433\u0430\u0434\u043e\u045e"}[t]).split("_"),e%10==1&&e%100!=11?a[0]:2<=e%10&&e%10<=4&&(e%100<10||20<=e%100)?a[1]:a[2])}M.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ert\u0259si_\xc7\u0259r\u015f\u0259nb\u0259 ax\u015fam\u0131_\xc7\u0259r\u015f\u0259nb\u0259_C\xfcm\u0259 ax\u015fam\u0131_C\xfcm\u0259_\u015e\u0259nb\u0259".split("_"),weekdaysShort:"Baz_BzE_\xc7Ax_\xc7\u0259r_CAx_C\xfcm_\u015e\u0259n".split("_"),weekdaysMin:"Bz_BE_\xc7A_\xc7\u0259_CA_C\xfc_\u015e\u0259".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[g\u0259l\u0259n h\u0259ft\u0259] dddd [saat] LT",lastDay:"[d\xfcn\u0259n] LT",lastWeek:"[ke\xe7\u0259n h\u0259ft\u0259] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s \u0259vv\u0259l",s:"bir ne\xe7\u0259 saniy\u0259",ss:"%d saniy\u0259",m:"bir d\u0259qiq\u0259",mm:"%d d\u0259qiq\u0259",h:"bir saat",hh:"%d saat",d:"bir g\xfcn",dd:"%d g\xfcn",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiemParse:/gec\u0259|s\u0259h\u0259r|g\xfcnd\xfcz|ax\u015fam/,isPM:function(e){return/^(g\xfcnd\xfcz|ax\u015fam)$/.test(e)},meridiem:function(e,a,t){return e<4?"gec\u0259":e<12?"s\u0259h\u0259r":e<17?"g\xfcnd\xfcz":"ax\u015fam"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0131nc\u0131|inci|nci|\xfcnc\xfc|nc\u0131|uncu)/,ordinal:function(e){if(0===e)return e+"-\u0131nc\u0131";var a=e%10;return e+(Kt[a]||Kt[e%100-a]||Kt[100<=e?100:null])},week:{dow:1,doy:7}}),M.defineLocale("be",{months:{format:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044f_\u043b\u044e\u0442\u0430\u0433\u0430_\u0441\u0430\u043a\u0430\u0432\u0456\u043a\u0430_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a\u0430_\u0442\u0440\u0430\u045e\u043d\u044f_\u0447\u044d\u0440\u0432\u0435\u043d\u044f_\u043b\u0456\u043f\u0435\u043d\u044f_\u0436\u043d\u0456\u045e\u043d\u044f_\u0432\u0435\u0440\u0430\u0441\u043d\u044f_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a\u0430_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434\u0430_\u0441\u043d\u0435\u0436\u043d\u044f".split("_"),standalone:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044c_\u043b\u044e\u0442\u044b_\u0441\u0430\u043a\u0430\u0432\u0456\u043a_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u044d\u0440\u0432\u0435\u043d\u044c_\u043b\u0456\u043f\u0435\u043d\u044c_\u0436\u043d\u0456\u0432\u0435\u043d\u044c_\u0432\u0435\u0440\u0430\u0441\u0435\u043d\u044c_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434_\u0441\u043d\u0435\u0436\u0430\u043d\u044c".split("_")},monthsShort:"\u0441\u0442\u0443\u0434_\u043b\u044e\u0442_\u0441\u0430\u043a_\u043a\u0440\u0430\u0441_\u0442\u0440\u0430\u0432_\u0447\u044d\u0440\u0432_\u043b\u0456\u043f_\u0436\u043d\u0456\u0432_\u0432\u0435\u0440_\u043a\u0430\u0441\u0442_\u043b\u0456\u0441\u0442_\u0441\u043d\u0435\u0436".split("_"),weekdays:{format:"\u043d\u044f\u0434\u0437\u0435\u043b\u044e_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0443_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0443_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),standalone:"\u043d\u044f\u0434\u0437\u0435\u043b\u044f_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0430_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0430_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),isFormat:/\[ ?[\u0423\u0443\u045e] ?(?:\u043c\u0456\u043d\u0443\u043b\u0443\u044e|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u0443\u044e)? ?\] ?dddd/},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., HH:mm",LLLL:"dddd, D MMMM YYYY \u0433., HH:mm"},calendar:{sameDay:"[\u0421\u0451\u043d\u043d\u044f \u045e] LT",nextDay:"[\u0417\u0430\u045e\u0442\u0440\u0430 \u045e] LT",lastDay:"[\u0423\u0447\u043e\u0440\u0430 \u045e] LT",nextWeek:function(){return"[\u0423] dddd [\u045e] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u0443\u044e] dddd [\u045e] LT";case 1:case 2:case 4:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u044b] dddd [\u045e] LT"}},sameElse:"L"},relativeTime:{future:"\u043f\u0440\u0430\u0437 %s",past:"%s \u0442\u0430\u043c\u0443",s:"\u043d\u0435\u043a\u0430\u043b\u044c\u043a\u0456 \u0441\u0435\u043a\u0443\u043d\u0434",m:qt,mm:qt,h:qt,hh:qt,d:"\u0434\u0437\u0435\u043d\u044c",dd:qt,M:"\u043c\u0435\u0441\u044f\u0446",MM:qt,y:"\u0433\u043e\u0434",yy:qt},meridiemParse:/\u043d\u043e\u0447\u044b|\u0440\u0430\u043d\u0456\u0446\u044b|\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430/,isPM:function(e){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430)$/.test(e)},meridiem:function(e,a,t){return e<4?"\u043d\u043e\u0447\u044b":e<12?"\u0440\u0430\u043d\u0456\u0446\u044b":e<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0430\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0456|\u044b|\u0433\u0430)/,ordinal:function(e,a){switch(a){case"M":case"d":case"DDD":case"w":case"W":return e%10!=2&&e%10!=3||e%100==12||e%100==13?e+"-\u044b":e+"-\u0456";case"D":return e+"-\u0433\u0430";default:return e}},week:{dow:1,doy:7}}),M.defineLocale("bg",{months:"\u044f\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u044f\u043d\u0443_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u044f\u0434\u0430_\u0447\u0435\u0442\u0432\u044a\u0440\u0442\u044a\u043a_\u043f\u0435\u0442\u044a\u043a_\u0441\u044a\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u044f_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u044a\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u043d\u0435\u0441 \u0432] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432] LT",nextWeek:"dddd [\u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u041c\u0438\u043d\u0430\u043b\u0430\u0442\u0430] dddd [\u0432] LT";case 1:case 2:case 4:case 5:return"[\u041c\u0438\u043d\u0430\u043b\u0438\u044f] dddd [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0441\u043b\u0435\u0434 %s",past:"\u043f\u0440\u0435\u0434\u0438 %s",s:"\u043d\u044f\u043a\u043e\u043b\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0434\u0435\u043d",dd:"%d \u0434\u0435\u043d\u0430",w:"\u0441\u0435\u0434\u043c\u0438\u0446\u0430",ww:"%d \u0441\u0435\u0434\u043c\u0438\u0446\u0438",M:"\u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0430",y:"\u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(e){var a=e%10,t=e%100;return 0===e?e+"-\u0435\u0432":0==t?e+"-\u0435\u043d":10<t&&t<20?e+"-\u0442\u0438":1==a?e+"-\u0432\u0438":2==a?e+"-\u0440\u0438":7==a||8==a?e+"-\u043c\u0438":e+"-\u0442\u0438"},week:{dow:1,doy:7}}),M.defineLocale("bm",{months:"Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_M\u025bkalo_Zuw\u025bnkalo_Zuluyekalo_Utikalo_S\u025btanburukalo_\u0254kut\u0254burukalo_Nowanburukalo_Desanburukalo".split("_"),monthsShort:"Zan_Few_Mar_Awi_M\u025b_Zuw_Zul_Uti_S\u025bt_\u0254ku_Now_Des".split("_"),weekdays:"Kari_Nt\u025bn\u025bn_Tarata_Araba_Alamisa_Juma_Sibiri".split("_"),weekdaysShort:"Kar_Nt\u025b_Tar_Ara_Ala_Jum_Sib".split("_"),weekdaysMin:"Ka_Nt_Ta_Ar_Al_Ju_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"MMMM [tile] D [san] YYYY",LLL:"MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm",LLLL:"dddd MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm"},calendar:{sameDay:"[Bi l\u025br\u025b] LT",nextDay:"[Sini l\u025br\u025b] LT",nextWeek:"dddd [don l\u025br\u025b] LT",lastDay:"[Kunu l\u025br\u025b] LT",lastWeek:"dddd [t\u025bm\u025bnen l\u025br\u025b] LT",sameElse:"L"},relativeTime:{future:"%s k\u0254n\u0254",past:"a b\u025b %s b\u0254",s:"sanga dama dama",ss:"sekondi %d",m:"miniti kelen",mm:"miniti %d",h:"l\u025br\u025b kelen",hh:"l\u025br\u025b %d",d:"tile kelen",dd:"tile %d",M:"kalo kelen",MM:"kalo %d",y:"san kelen",yy:"san %d"},week:{dow:1,doy:4}});var Zt={1:"\u09e7",2:"\u09e8",3:"\u09e9",4:"\u09ea",5:"\u09eb",6:"\u09ec",7:"\u09ed",8:"\u09ee",9:"\u09ef",0:"\u09e6"},$t={"\u09e7":"1","\u09e8":"2","\u09e9":"3","\u09ea":"4","\u09eb":"5","\u09ec":"6","\u09ed":"7","\u09ee":"8","\u09ef":"9","\u09e6":"0"},Qt=(M.defineLocale("bn-bd",{months:"\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09bf_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09bf_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0_\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0_\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0_\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0".split("_"),monthsShort:"\u099c\u09be\u09a8\u09c1_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f_\u0985\u0995\u09cd\u099f\u09cb_\u09a8\u09ad\u09c7_\u09a1\u09bf\u09b8\u09c7".split("_"),weekdays:"\u09b0\u09ac\u09bf\u09ac\u09be\u09b0_\u09b8\u09cb\u09ae\u09ac\u09be\u09b0_\u09ae\u0999\u09cd\u0997\u09b2\u09ac\u09be\u09b0_\u09ac\u09c1\u09a7\u09ac\u09be\u09b0_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf\u09ac\u09be\u09b0_\u09b6\u09c1\u0995\u09cd\u09b0\u09ac\u09be\u09b0_\u09b6\u09a8\u09bf\u09ac\u09be\u09b0".split("_"),weekdaysShort:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),weekdaysMin:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),longDateFormat:{LT:"A h:mm \u09b8\u09ae\u09df",LTS:"A h:mm:ss \u09b8\u09ae\u09df",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u09b8\u09ae\u09df",LLLL:"dddd, D MMMM YYYY, A h:mm \u09b8\u09ae\u09df"},calendar:{sameDay:"[\u0986\u099c] LT",nextDay:"[\u0986\u0997\u09be\u09ae\u09c0\u0995\u09be\u09b2] LT",nextWeek:"dddd, LT",lastDay:"[\u0997\u09a4\u0995\u09be\u09b2] LT",lastWeek:"[\u0997\u09a4] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u09aa\u09b0\u09c7",past:"%s \u0986\u0997\u09c7",s:"\u0995\u09df\u09c7\u0995 \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",ss:"%d \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",m:"\u098f\u0995 \u09ae\u09bf\u09a8\u09bf\u099f",mm:"%d \u09ae\u09bf\u09a8\u09bf\u099f",h:"\u098f\u0995 \u0998\u09a8\u09cd\u099f\u09be",hh:"%d \u0998\u09a8\u09cd\u099f\u09be",d:"\u098f\u0995 \u09a6\u09bf\u09a8",dd:"%d \u09a6\u09bf\u09a8",M:"\u098f\u0995 \u09ae\u09be\u09b8",MM:"%d \u09ae\u09be\u09b8",y:"\u098f\u0995 \u09ac\u099b\u09b0",yy:"%d \u09ac\u099b\u09b0"},preparse:function(e){return e.replace(/[\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u09e6]/g,function(e){return $t[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return Zt[e]})},meridiemParse:/\u09b0\u09be\u09a4|\u09ad\u09cb\u09b0|\u09b8\u0995\u09be\u09b2|\u09a6\u09c1\u09aa\u09c1\u09b0|\u09ac\u09bf\u0995\u09be\u09b2|\u09b8\u09a8\u09cd\u09a7\u09cd\u09af\u09be|\u09b0\u09be\u09a4/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u09b0\u09be\u09a4"===a?e<4?e:e+12:"\u09ad\u09cb\u09b0"===a||"\u09b8\u0995\u09be\u09b2"===a?e:"\u09a6\u09c1\u09aa\u09c1\u09b0"===a?3<=e?e:e+12:"\u09ac\u09bf\u0995\u09be\u09b2"===a||"\u09b8\u09a8\u09cd\u09a7\u09cd\u09af\u09be"===a?e+12:void 0},meridiem:function(e,a,t){return e<4?"\u09b0\u09be\u09a4":e<6?"\u09ad\u09cb\u09b0":e<12?"\u09b8\u0995\u09be\u09b2":e<15?"\u09a6\u09c1\u09aa\u09c1\u09b0":e<18?"\u09ac\u09bf\u0995\u09be\u09b2":e<20?"\u09b8\u09a8\u09cd\u09a7\u09cd\u09af\u09be":"\u09b0\u09be\u09a4"},week:{dow:0,doy:6}}),{1:"\u09e7",2:"\u09e8",3:"\u09e9",4:"\u09ea",5:"\u09eb",6:"\u09ec",7:"\u09ed",8:"\u09ee",9:"\u09ef",0:"\u09e6"}),Xt={"\u09e7":"1","\u09e8":"2","\u09e9":"3","\u09ea":"4","\u09eb":"5","\u09ec":"6","\u09ed":"7","\u09ee":"8","\u09ef":"9","\u09e6":"0"},es=(M.defineLocale("bn",{months:"\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09bf_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09bf_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0_\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0_\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0_\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0".split("_"),monthsShort:"\u099c\u09be\u09a8\u09c1_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f_\u0985\u0995\u09cd\u099f\u09cb_\u09a8\u09ad\u09c7_\u09a1\u09bf\u09b8\u09c7".split("_"),weekdays:"\u09b0\u09ac\u09bf\u09ac\u09be\u09b0_\u09b8\u09cb\u09ae\u09ac\u09be\u09b0_\u09ae\u0999\u09cd\u0997\u09b2\u09ac\u09be\u09b0_\u09ac\u09c1\u09a7\u09ac\u09be\u09b0_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf\u09ac\u09be\u09b0_\u09b6\u09c1\u0995\u09cd\u09b0\u09ac\u09be\u09b0_\u09b6\u09a8\u09bf\u09ac\u09be\u09b0".split("_"),weekdaysShort:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),weekdaysMin:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),longDateFormat:{LT:"A h:mm \u09b8\u09ae\u09df",LTS:"A h:mm:ss \u09b8\u09ae\u09df",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u09b8\u09ae\u09df",LLLL:"dddd, D MMMM YYYY, A h:mm \u09b8\u09ae\u09df"},calendar:{sameDay:"[\u0986\u099c] LT",nextDay:"[\u0986\u0997\u09be\u09ae\u09c0\u0995\u09be\u09b2] LT",nextWeek:"dddd, LT",lastDay:"[\u0997\u09a4\u0995\u09be\u09b2] LT",lastWeek:"[\u0997\u09a4] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u09aa\u09b0\u09c7",past:"%s \u0986\u0997\u09c7",s:"\u0995\u09df\u09c7\u0995 \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",ss:"%d \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",m:"\u098f\u0995 \u09ae\u09bf\u09a8\u09bf\u099f",mm:"%d \u09ae\u09bf\u09a8\u09bf\u099f",h:"\u098f\u0995 \u0998\u09a8\u09cd\u099f\u09be",hh:"%d \u0998\u09a8\u09cd\u099f\u09be",d:"\u098f\u0995 \u09a6\u09bf\u09a8",dd:"%d \u09a6\u09bf\u09a8",M:"\u098f\u0995 \u09ae\u09be\u09b8",MM:"%d \u09ae\u09be\u09b8",y:"\u098f\u0995 \u09ac\u099b\u09b0",yy:"%d \u09ac\u099b\u09b0"},preparse:function(e){return e.replace(/[\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u09e6]/g,function(e){return Xt[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return Qt[e]})},meridiemParse:/\u09b0\u09be\u09a4|\u09b8\u0995\u09be\u09b2|\u09a6\u09c1\u09aa\u09c1\u09b0|\u09ac\u09bf\u0995\u09be\u09b2|\u09b0\u09be\u09a4/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u09b0\u09be\u09a4"===a&&4<=e||"\u09a6\u09c1\u09aa\u09c1\u09b0"===a&&e<5||"\u09ac\u09bf\u0995\u09be\u09b2"===a?e+12:e},meridiem:function(e,a,t){return e<4?"\u09b0\u09be\u09a4":e<10?"\u09b8\u0995\u09be\u09b2":e<17?"\u09a6\u09c1\u09aa\u09c1\u09b0":e<20?"\u09ac\u09bf\u0995\u09be\u09b2":"\u09b0\u09be\u09a4"},week:{dow:0,doy:6}}),{1:"\u0f21",2:"\u0f22",3:"\u0f23",4:"\u0f24",5:"\u0f25",6:"\u0f26",7:"\u0f27",8:"\u0f28",9:"\u0f29",0:"\u0f20"}),as={"\u0f21":"1","\u0f22":"2","\u0f23":"3","\u0f24":"4","\u0f25":"5","\u0f26":"6","\u0f27":"7","\u0f28":"8","\u0f29":"9","\u0f20":"0"};function ts(e,a,t){return e+" "+(t={mm:"munutenn",MM:"miz",dd:"devezh"}[t],2!==(e=e)?t:void 0!==(e={m:"v",b:"v",d:"z"})[(t=t).charAt(0)]?e[t.charAt(0)]+t.substring(1):t)}M.defineLocale("bo",{months:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f44\u0f0b\u0f54\u0f7c_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f66\u0f74\u0f58\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f5e\u0f72\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f63\u0f94\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0fb2\u0f74\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f62\u0f92\u0fb1\u0f51\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f42\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f45\u0f72\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54".split("_"),monthsShort:"\u0f5f\u0fb3\u0f0b1_\u0f5f\u0fb3\u0f0b2_\u0f5f\u0fb3\u0f0b3_\u0f5f\u0fb3\u0f0b4_\u0f5f\u0fb3\u0f0b5_\u0f5f\u0fb3\u0f0b6_\u0f5f\u0fb3\u0f0b7_\u0f5f\u0fb3\u0f0b8_\u0f5f\u0fb3\u0f0b9_\u0f5f\u0fb3\u0f0b10_\u0f5f\u0fb3\u0f0b11_\u0f5f\u0fb3\u0f0b12".split("_"),monthsShortRegex:/^(\u0f5f\u0fb3\u0f0b\d{1,2})/,monthsParseExact:!0,weekdays:"\u0f42\u0f5f\u0f60\u0f0b\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f42\u0f5f\u0f60\u0f0b\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysShort:"\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysMin:"\u0f49\u0f72_\u0f5f\u0fb3_\u0f58\u0f72\u0f42_\u0f63\u0fb7\u0f42_\u0f55\u0f74\u0f62_\u0f66\u0f44\u0f66_\u0f66\u0fa4\u0f7a\u0f53".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0f51\u0f72\u0f0b\u0f62\u0f72\u0f44] LT",nextDay:"[\u0f66\u0f44\u0f0b\u0f49\u0f72\u0f53] LT",nextWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f62\u0f97\u0f7a\u0f66\u0f0b\u0f58], LT",lastDay:"[\u0f41\u0f0b\u0f66\u0f44] LT",lastWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f58\u0f50\u0f60\u0f0b\u0f58] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0f63\u0f0b",past:"%s \u0f66\u0f94\u0f53\u0f0b\u0f63",s:"\u0f63\u0f58\u0f0b\u0f66\u0f44",ss:"%d \u0f66\u0f90\u0f62\u0f0b\u0f46\u0f0d",m:"\u0f66\u0f90\u0f62\u0f0b\u0f58\u0f0b\u0f42\u0f45\u0f72\u0f42",mm:"%d \u0f66\u0f90\u0f62\u0f0b\u0f58",h:"\u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51\u0f0b\u0f42\u0f45\u0f72\u0f42",hh:"%d \u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51",d:"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f45\u0f72\u0f42",dd:"%d \u0f49\u0f72\u0f53\u0f0b",M:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f45\u0f72\u0f42",MM:"%d \u0f5f\u0fb3\u0f0b\u0f56",y:"\u0f63\u0f7c\u0f0b\u0f42\u0f45\u0f72\u0f42",yy:"%d \u0f63\u0f7c"},preparse:function(e){return e.replace(/[\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29\u0f20]/g,function(e){return as[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return es[e]})},meridiemParse:/\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c|\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66|\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44|\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42|\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"===a&&4<=e||"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44"===a&&e<5||"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42"===a?e+12:e},meridiem:function(e,a,t){return e<4?"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c":e<10?"\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66":e<17?"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44":e<20?"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42":"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"},week:{dow:0,doy:6}});L=[/^gen/i,/^c[\u02bc\']hwe/i,/^meu/i,/^ebr/i,/^mae/i,/^(mez|eve)/i,/^gou/i,/^eos/i,/^gwe/i,/^her/i,/^du/i,/^ker/i],c=/^(genver|c[\u02bc\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu|gen|c[\u02bc\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,ta=[/^Su/i,/^Lu/i,/^Me([^r]|$)/i,/^Mer/i,/^Ya/i,/^Gw/i,/^Sa/i];function ss(e,a,t){var s=e+" ";switch(t){case"ss":return s+=1===e?"sekunda":2===e||3===e||4===e?"sekunde":"sekundi";case"m":return a?"jedna minuta":"jedne minute";case"mm":return s+=1!==e&&(2===e||3===e||4===e)?"minute":"minuta";case"h":return a?"jedan sat":"jednog sata";case"hh":return s+=1===e?"sat":2===e||3===e||4===e?"sata":"sati";case"dd":return s+=1===e?"dan":"dana";case"MM":return s+=1===e?"mjesec":2===e||3===e||4===e?"mjeseca":"mjeseci";case"yy":return s+=1!==e&&(2===e||3===e||4===e)?"godine":"godina"}}M.defineLocale("br",{months:"Genver_C\u02bchwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C\u02bchwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc\u02bcher_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),weekdaysParse:ta,fullWeekdaysParse:[/^sul/i,/^lun/i,/^meurzh/i,/^merc[\u02bc\']her/i,/^yaou/i,/^gwener/i,/^sadorn/i],shortWeekdaysParse:[/^Sul/i,/^Lun/i,/^Meu/i,/^Mer/i,/^Yao/i,/^Gwe/i,/^Sad/i],minWeekdaysParse:ta,monthsRegex:c,monthsShortRegex:c,monthsStrictRegex:/^(genver|c[\u02bc\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu)/i,monthsShortStrictRegex:/^(gen|c[\u02bc\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,monthsParse:L,longMonthsParse:L,shortMonthsParse:L,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY HH:mm",LLLL:"dddd, D [a viz] MMMM YYYY HH:mm"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc\u02bchoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec\u02bch da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s \u02bczo",s:"un nebeud segondenno\xf9",ss:"%d eilenn",m:"ur vunutenn",mm:ts,h:"un eur",hh:"%d eur",d:"un devezh",dd:ts,M:"ur miz",MM:ts,y:"ur bloaz",yy:function(e){switch(function e(a){if(9<a)return e(a%10);return a}(e)){case 1:case 3:case 4:case 5:case 9:return e+" bloaz";default:return e+" vloaz"}}},dayOfMonthOrdinalParse:/\d{1,2}(a\xf1|vet)/,ordinal:function(e){return e+(1===e?"a\xf1":"vet")},week:{dow:1,doy:4},meridiemParse:/a.m.|g.m./,isPM:function(e){return"g.m."===e},meridiem:function(e,a,t){return e<12?"a.m.":"g.m."}}),M.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010der u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[pro\u0161lu] dddd [u] LT";case 6:return"[pro\u0161le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[pro\u0161li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:ss,m:ss,mm:ss,h:ss,hh:ss,d:"dan",dd:ss,M:"mjesec",MM:ss,y:"godinu",yy:ss},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}}),M.defineLocale("ca",{months:{standalone:"gener_febrer_mar\xe7_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),format:"de gener_de febrer_de mar\xe7_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._mar\xe7_abr._maig_juny_jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:!0,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dt_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a les] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a les] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[dem\xe0 a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"d'aqu\xed %s",past:"fa %s",s:"uns segons",ss:"%d segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|\xe8|a)/,ordinal:function(e,a){return e+("w"!==a&&"W"!==a?1===e?"r":2===e?"n":3===e?"r":4===e?"t":"\xe8":"a")},week:{dow:1,doy:4}});f={format:"leden_\xfanor_b\u0159ezen_duben_kv\u011bten_\u010derven_\u010dervenec_srpen_z\xe1\u0159\xed_\u0159\xedjen_listopad_prosinec".split("_"),standalone:"ledna_\xfanora_b\u0159ezna_dubna_kv\u011btna_\u010dervna_\u010dervence_srpna_z\xe1\u0159\xed_\u0159\xedjna_listopadu_prosince".split("_")},ke="led_\xfano_b\u0159e_dub_kv\u011b_\u010dvn_\u010dvc_srp_z\xe1\u0159_\u0159\xedj_lis_pro".split("_"),y=[/^led/i,/^\xfano/i,/^b\u0159e/i,/^dub/i,/^kv\u011b/i,/^(\u010dvn|\u010derven$|\u010dervna)/i,/^(\u010dvc|\u010dervenec|\u010dervence)/i,/^srp/i,/^z\xe1\u0159/i,/^\u0159\xedj/i,/^lis/i,/^pro/i],_=/^(leden|\xfanor|b\u0159ezen|duben|kv\u011bten|\u010dervenec|\u010dervence|\u010derven|\u010dervna|srpen|z\xe1\u0159\xed|\u0159\xedjen|listopad|prosinec|led|\xfano|b\u0159e|dub|kv\u011b|\u010dvn|\u010dvc|srp|z\xe1\u0159|\u0159\xedj|lis|pro)/i;function ns(e){return 1<e&&e<5&&1!=~~(e/10)}function P(e,a,t,s){var n=e+" ";switch(t){case"s":return a||s?"p\xe1r sekund":"p\xe1r sekundami";case"ss":return a||s?n+(ns(e)?"sekundy":"sekund"):n+"sekundami";case"m":return a?"minuta":s?"minutu":"minutou";case"mm":return a||s?n+(ns(e)?"minuty":"minut"):n+"minutami";case"h":return a?"hodina":s?"hodinu":"hodinou";case"hh":return a||s?n+(ns(e)?"hodiny":"hodin"):n+"hodinami";case"d":return a||s?"den":"dnem";case"dd":return a||s?n+(ns(e)?"dny":"dn\xed"):n+"dny";case"M":return a||s?"m\u011bs\xedc":"m\u011bs\xedcem";case"MM":return a||s?n+(ns(e)?"m\u011bs\xedce":"m\u011bs\xedc\u016f"):n+"m\u011bs\xedci";case"y":return a||s?"rok":"rokem";case"yy":return a||s?n+(ns(e)?"roky":"let"):n+"lety"}}function rs(e,a,t,s){e={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return a?e[t][0]:e[t][1]}function ds(e,a,t,s){e={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return a?e[t][0]:e[t][1]}function is(e,a,t,s){e={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],w:["eine Woche","einer Woche"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return a?e[t][0]:e[t][1]}M.defineLocale("cs",{months:f,monthsShort:ke,monthsRegex:_,monthsShortRegex:_,monthsStrictRegex:/^(leden|ledna|\xfanora|\xfanor|b\u0159ezen|b\u0159ezna|duben|dubna|kv\u011bten|kv\u011btna|\u010dervenec|\u010dervence|\u010derven|\u010dervna|srpen|srpna|z\xe1\u0159\xed|\u0159\xedjen|\u0159\xedjna|listopadu|listopad|prosinec|prosince)/i,monthsShortStrictRegex:/^(led|\xfano|b\u0159e|dub|kv\u011b|\u010dvn|\u010dvc|srp|z\xe1\u0159|\u0159\xedj|lis|pro)/i,monthsParse:y,longMonthsParse:y,shortMonthsParse:y,weekdays:"ned\u011ble_pond\u011bl\xed_\xfater\xfd_st\u0159eda_\u010dtvrtek_p\xe1tek_sobota".split("_"),weekdaysShort:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),weekdaysMin:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},calendar:{sameDay:"[dnes v] LT",nextDay:"[z\xedtra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v ned\u011bli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve st\u0159edu v] LT";case 4:return"[ve \u010dtvrtek v] LT";case 5:return"[v p\xe1tek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[v\u010dera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou ned\u011bli v] LT";case 1:case 2:return"[minul\xe9] dddd [v] LT";case 3:return"[minulou st\u0159edu v] LT";case 4:case 5:return"[minul\xfd] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"p\u0159ed %s",s:P,ss:P,m:P,mm:P,h:P,hh:P,d:P,dd:P,M:P,MM:P,y:P,yy:P},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("cv",{months:"\u043a\u04d1\u0440\u043b\u0430\u0447_\u043d\u0430\u0440\u04d1\u0441_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440\u0442\u043c\u0435_\u0443\u0442\u04d1_\u04ab\u0443\u0440\u043b\u0430_\u0430\u0432\u04d1\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448\u0442\u0430\u0432".split("_"),monthsShort:"\u043a\u04d1\u0440_\u043d\u0430\u0440_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440_\u0443\u0442\u04d1_\u04ab\u0443\u0440_\u0430\u0432\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448".split("_"),weekdays:"\u0432\u044b\u0440\u0441\u0430\u0440\u043d\u0438\u043a\u0443\u043d_\u0442\u0443\u043d\u0442\u0438\u043a\u0443\u043d_\u044b\u0442\u043b\u0430\u0440\u0438\u043a\u0443\u043d_\u044e\u043d\u043a\u0443\u043d_\u043a\u04d7\u04ab\u043d\u0435\u0440\u043d\u0438\u043a\u0443\u043d_\u044d\u0440\u043d\u0435\u043a\u0443\u043d_\u0448\u04d1\u043c\u0430\u0442\u043a\u0443\u043d".split("_"),weekdaysShort:"\u0432\u044b\u0440_\u0442\u0443\u043d_\u044b\u0442\u043b_\u044e\u043d_\u043a\u04d7\u04ab_\u044d\u0440\u043d_\u0448\u04d1\u043c".split("_"),weekdaysMin:"\u0432\u0440_\u0442\u043d_\u044b\u0442_\u044e\u043d_\u043a\u04ab_\u044d\u0440_\u0448\u043c".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7]",LLL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm",LLLL:"dddd, YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm"},calendar:{sameDay:"[\u041f\u0430\u044f\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextDay:"[\u042b\u0440\u0430\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastDay:"[\u04d6\u043d\u0435\u0440] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextWeek:"[\u04aa\u0438\u0442\u0435\u0441] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastWeek:"[\u0418\u0440\u0442\u043d\u04d7] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",sameElse:"L"},relativeTime:{future:function(e){return e+(/\u0441\u0435\u0445\u0435\u0442$/i.exec(e)?"\u0440\u0435\u043d":/\u04ab\u0443\u043b$/i.exec(e)?"\u0442\u0430\u043d":"\u0440\u0430\u043d")},past:"%s \u043a\u0430\u044f\u043b\u043b\u0430",s:"\u043f\u04d7\u0440-\u0438\u043a \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",ss:"%d \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",m:"\u043f\u04d7\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u043f\u04d7\u0440 \u0441\u0435\u0445\u0435\u0442",hh:"%d \u0441\u0435\u0445\u0435\u0442",d:"\u043f\u04d7\u0440 \u043a\u0443\u043d",dd:"%d \u043a\u0443\u043d",M:"\u043f\u04d7\u0440 \u0443\u0439\u04d1\u0445",MM:"%d \u0443\u0439\u04d1\u0445",y:"\u043f\u04d7\u0440 \u04ab\u0443\u043b",yy:"%d \u04ab\u0443\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-\u043c\u04d7\u0448/,ordinal:"%d-\u043c\u04d7\u0448",week:{dow:1,doy:7}}),M.defineLocale("cy",{months:"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),monthsShort:"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),weekdays:"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),weekdaysShort:"Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),weekdaysMin:"Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Heddiw am] LT",nextDay:"[Yfory am] LT",nextWeek:"dddd [am] LT",lastDay:"[Ddoe am] LT",lastWeek:"dddd [diwethaf am] LT",sameElse:"L"},relativeTime:{future:"mewn %s",past:"%s yn \xf4l",s:"ychydig eiliadau",ss:"%d eiliad",m:"munud",mm:"%d munud",h:"awr",hh:"%d awr",d:"diwrnod",dd:"%d diwrnod",M:"mis",MM:"%d mis",y:"blwyddyn",yy:"%d flynedd"},dayOfMonthOrdinalParse:/\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,ordinal:function(e){var a="";return 20<e?a=40===e||50===e||60===e||80===e||100===e?"fed":"ain":0<e&&(a=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"][e]),e+a},week:{dow:1,doy:4}}),M.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"s\xf8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xf8rdag".split("_"),weekdaysShort:"s\xf8n_man_tir_ons_tor_fre_l\xf8r".split("_"),weekdaysMin:"s\xf8_ma_ti_on_to_fr_l\xf8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd [d.] D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"p\xe5 dddd [kl.] LT",lastDay:"[i g\xe5r kl.] LT",lastWeek:"[i] dddd[s kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"f\xe5 sekunder",ss:"%d sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en m\xe5ned",MM:"%d m\xe5neder",y:"et \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("de-at",{months:"J\xe4nner_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"J\xe4n._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:rs,mm:"%d Minuten",h:rs,hh:"%d Stunden",d:rs,dd:rs,w:rs,ww:"%d Wochen",M:rs,MM:rs,y:rs,yy:rs},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("de-ch",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:ds,mm:"%d Minuten",h:ds,hh:"%d Stunden",d:ds,dd:ds,w:ds,ww:"%d Wochen",M:ds,MM:ds,y:ds,yy:ds},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("de",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:is,mm:"%d Minuten",h:is,hh:"%d Stunden",d:is,dd:is,w:is,ww:"%d Wochen",M:is,MM:is,y:is,yy:is},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});Y=["\u0796\u07ac\u0782\u07aa\u0787\u07a6\u0783\u07a9","\u078a\u07ac\u0784\u07b0\u0783\u07aa\u0787\u07a6\u0783\u07a9","\u0789\u07a7\u0783\u07a8\u0797\u07aa","\u0787\u07ad\u0795\u07b0\u0783\u07a9\u078d\u07aa","\u0789\u07ad","\u0796\u07ab\u0782\u07b0","\u0796\u07aa\u078d\u07a6\u0787\u07a8","\u0787\u07af\u078e\u07a6\u0790\u07b0\u0793\u07aa","\u0790\u07ac\u0795\u07b0\u0793\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0787\u07ae\u0786\u07b0\u0793\u07af\u0784\u07a6\u0783\u07aa","\u0782\u07ae\u0788\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0791\u07a8\u0790\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa"],Ke=["\u0787\u07a7\u078b\u07a8\u0787\u07b0\u078c\u07a6","\u0780\u07af\u0789\u07a6","\u0787\u07a6\u0782\u07b0\u078e\u07a7\u0783\u07a6","\u0784\u07aa\u078b\u07a6","\u0784\u07aa\u0783\u07a7\u0790\u07b0\u078a\u07a6\u078c\u07a8","\u0780\u07aa\u0786\u07aa\u0783\u07aa","\u0780\u07ae\u0782\u07a8\u0780\u07a8\u0783\u07aa"];M.defineLocale("dv",{months:Y,monthsShort:Y,weekdays:Ke,weekdaysShort:Ke,weekdaysMin:"\u0787\u07a7\u078b\u07a8_\u0780\u07af\u0789\u07a6_\u0787\u07a6\u0782\u07b0_\u0784\u07aa\u078b\u07a6_\u0784\u07aa\u0783\u07a7_\u0780\u07aa\u0786\u07aa_\u0780\u07ae\u0782\u07a8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/M/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0789\u0786|\u0789\u078a/,isPM:function(e){return"\u0789\u078a"===e},meridiem:function(e,a,t){return e<12?"\u0789\u0786":"\u0789\u078a"},calendar:{sameDay:"[\u0789\u07a8\u0787\u07a6\u078b\u07aa] LT",nextDay:"[\u0789\u07a7\u078b\u07a6\u0789\u07a7] LT",nextWeek:"dddd LT",lastDay:"[\u0787\u07a8\u0787\u07b0\u0794\u07ac] LT",lastWeek:"[\u078a\u07a7\u0787\u07a8\u078c\u07aa\u0788\u07a8] dddd LT",sameElse:"L"},relativeTime:{future:"\u078c\u07ac\u0783\u07ad\u078e\u07a6\u0787\u07a8 %s",past:"\u0786\u07aa\u0783\u07a8\u0782\u07b0 %s",s:"\u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa\u0786\u07ae\u0785\u07ac\u0787\u07b0",ss:"d% \u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa",m:"\u0789\u07a8\u0782\u07a8\u0793\u07ac\u0787\u07b0",mm:"\u0789\u07a8\u0782\u07a8\u0793\u07aa %d",h:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07ac\u0787\u07b0",hh:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07aa %d",d:"\u078b\u07aa\u0788\u07a6\u0780\u07ac\u0787\u07b0",dd:"\u078b\u07aa\u0788\u07a6\u0790\u07b0 %d",M:"\u0789\u07a6\u0780\u07ac\u0787\u07b0",MM:"\u0789\u07a6\u0790\u07b0 %d",y:"\u0787\u07a6\u0780\u07a6\u0783\u07ac\u0787\u07b0",yy:"\u0787\u07a6\u0780\u07a6\u0783\u07aa %d"},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:7,doy:12}}),M.defineLocale("el",{monthsNominativeEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2_\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2_\u039c\u03ac\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2_\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2_\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2_\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2".split("_"),monthsGenitiveEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u039c\u03b1\u03c1\u03c4\u03af\u03bf\u03c5_\u0391\u03c0\u03c1\u03b9\u03bb\u03af\u03bf\u03c5_\u039c\u03b1\u0390\u03bf\u03c5_\u0399\u03bf\u03c5\u03bd\u03af\u03bf\u03c5_\u0399\u03bf\u03c5\u03bb\u03af\u03bf\u03c5_\u0391\u03c5\u03b3\u03bf\u03cd\u03c3\u03c4\u03bf\u03c5_\u03a3\u03b5\u03c0\u03c4\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u039f\u03ba\u03c4\u03c9\u03b2\u03c1\u03af\u03bf\u03c5_\u039d\u03bf\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u0394\u03b5\u03ba\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5".split("_"),months:function(e,a){return e?("string"==typeof a&&/D/.test(a.substring(0,a.indexOf("MMMM")))?this._monthsGenitiveEl:this._monthsNominativeEl)[e.month()]:this._monthsNominativeEl},monthsShort:"\u0399\u03b1\u03bd_\u03a6\u03b5\u03b2_\u039c\u03b1\u03c1_\u0391\u03c0\u03c1_\u039c\u03b1\u03ca_\u0399\u03bf\u03c5\u03bd_\u0399\u03bf\u03c5\u03bb_\u0391\u03c5\u03b3_\u03a3\u03b5\u03c0_\u039f\u03ba\u03c4_\u039d\u03bf\u03b5_\u0394\u03b5\u03ba".split("_"),weekdays:"\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae_\u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1_\u03a4\u03c1\u03af\u03c4\u03b7_\u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7_\u03a0\u03ad\u03bc\u03c0\u03c4\u03b7_\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae_\u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf".split("_"),weekdaysShort:"\u039a\u03c5\u03c1_\u0394\u03b5\u03c5_\u03a4\u03c1\u03b9_\u03a4\u03b5\u03c4_\u03a0\u03b5\u03bc_\u03a0\u03b1\u03c1_\u03a3\u03b1\u03b2".split("_"),weekdaysMin:"\u039a\u03c5_\u0394\u03b5_\u03a4\u03c1_\u03a4\u03b5_\u03a0\u03b5_\u03a0\u03b1_\u03a3\u03b1".split("_"),meridiem:function(e,a,t){return 11<e?t?"\u03bc\u03bc":"\u039c\u039c":t?"\u03c0\u03bc":"\u03a0\u039c"},isPM:function(e){return"\u03bc"===(e+"").toLowerCase()[0]},meridiemParse:/[\u03a0\u039c]\.?\u039c?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[\u03a3\u03ae\u03bc\u03b5\u03c1\u03b1 {}] LT",nextDay:"[\u0391\u03cd\u03c1\u03b9\u03bf {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[\u03a7\u03b8\u03b5\u03c2 {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[\u03c4\u03bf \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf] dddd [{}] LT";default:return"[\u03c4\u03b7\u03bd \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7] dddd [{}] LT"}},sameElse:"L"},calendar:function(e,a){var t,e=this._calendarEl[e],s=a&&a.hours();return t=e,(e="undefined"!=typeof Function&&t instanceof Function||"[object Function]"===Object.prototype.toString.call(t)?e.apply(a):e).replace("{}",s%12==1?"\u03c3\u03c4\u03b7":"\u03c3\u03c4\u03b9\u03c2")},relativeTime:{future:"\u03c3\u03b5 %s",past:"%s \u03c0\u03c1\u03b9\u03bd",s:"\u03bb\u03af\u03b3\u03b1 \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",ss:"%d \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",m:"\u03ad\u03bd\u03b1 \u03bb\u03b5\u03c0\u03c4\u03cc",mm:"%d \u03bb\u03b5\u03c0\u03c4\u03ac",h:"\u03bc\u03af\u03b1 \u03ce\u03c1\u03b1",hh:"%d \u03ce\u03c1\u03b5\u03c2",d:"\u03bc\u03af\u03b1 \u03bc\u03ad\u03c1\u03b1",dd:"%d \u03bc\u03ad\u03c1\u03b5\u03c2",M:"\u03ad\u03bd\u03b1\u03c2 \u03bc\u03ae\u03bd\u03b1\u03c2",MM:"%d \u03bc\u03ae\u03bd\u03b5\u03c2",y:"\u03ad\u03bd\u03b1\u03c2 \u03c7\u03c1\u03cc\u03bd\u03bf\u03c2",yy:"%d \u03c7\u03c1\u03cc\u03bd\u03b9\u03b1"},dayOfMonthOrdinalParse:/\d{1,2}\u03b7/,ordinal:"%d\u03b7",week:{dow:1,doy:4}}),M.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")},week:{dow:0,doy:4}}),M.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")}}),M.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")},week:{dow:1,doy:4}}),M.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")},week:{dow:1,doy:4}}),M.defineLocale("en-il",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")}}),M.defineLocale("en-in",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")},week:{dow:0,doy:6}}),M.defineLocale("en-nz",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")},week:{dow:1,doy:4}}),M.defineLocale("en-sg",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")},week:{dow:1,doy:4}}),M.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_a\u016dgusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mart_apr_maj_jun_jul_a\u016dg_sept_okt_nov_dec".split("_"),weekdays:"diman\u0109o_lundo_mardo_merkredo_\u0135a\u016ddo_vendredo_sabato".split("_"),weekdaysShort:"dim_lun_mard_merk_\u0135a\u016d_ven_sab".split("_"),weekdaysMin:"di_lu_ma_me_\u0135a_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"[la] D[-an de] MMMM, YYYY",LLL:"[la] D[-an de] MMMM, YYYY HH:mm",LLLL:"dddd[n], [la] D[-an de] MMMM, YYYY HH:mm",llll:"ddd, [la] D[-an de] MMM, YYYY HH:mm"},meridiemParse:/[ap]\.t\.m/i,isPM:function(e){return"p"===e.charAt(0).toLowerCase()},meridiem:function(e,a,t){return 11<e?t?"p.t.m.":"P.T.M.":t?"a.t.m.":"A.T.M."},calendar:{sameDay:"[Hodia\u016d je] LT",nextDay:"[Morga\u016d je] LT",nextWeek:"dddd[n je] LT",lastDay:"[Hiera\u016d je] LT",lastWeek:"[pasintan] dddd[n je] LT",sameElse:"L"},relativeTime:{future:"post %s",past:"anta\u016d %s",s:"kelkaj sekundoj",ss:"%d sekundoj",m:"unu minuto",mm:"%d minutoj",h:"unu horo",hh:"%d horoj",d:"unu tago",dd:"%d tagoj",M:"unu monato",MM:"%d monatoj",y:"unu jaro",yy:"%d jaroj"},dayOfMonthOrdinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}});var _s="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),os="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),r=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],Ht=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,ms=(M.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,a){return e?(/-MMM-/.test(a)?os:_s)[e.month()]:_s},monthsRegex:Ht,monthsShortRegex:Ht,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:r,longMonthsParse:r,shortMonthsParse:r,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}}),"ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_")),us="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),vt=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],jt=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,ls=(M.defineLocale("es-mx",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,a){return e?(/-MMM-/.test(a)?us:ms)[e.month()]:ms},monthsRegex:jt,monthsShortRegex:jt,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:vt,longMonthsParse:vt,shortMonthsParse:vt,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:0,doy:4},invalidDate:"Fecha inv\xe1lida"}),"ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_")),Ms="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),x=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],na=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,hs=(M.defineLocale("es-us",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,a){return e?(/-MMM-/.test(a)?Ms:ls)[e.month()]:ls},monthsRegex:na,monthsShortRegex:na,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:x,longMonthsParse:x,shortMonthsParse:x,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"MM/DD/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:0,doy:6}}),"ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_")),cs="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),ge=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],n=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;function Ls(e,a,t,s){e={s:["m\xf5ne sekundi","m\xf5ni sekund","paar sekundit"],ss:[e+"sekundi",e+"sekundit"],m:["\xfche minuti","\xfcks minut"],mm:[e+" minuti",e+" minutit"],h:["\xfche tunni","tund aega","\xfcks tund"],hh:[e+" tunni",e+" tundi"],d:["\xfche p\xe4eva","\xfcks p\xe4ev"],M:["kuu aja","kuu aega","\xfcks kuu"],MM:[e+" kuu",e+" kuud"],y:["\xfche aasta","aasta","\xfcks aasta"],yy:[e+" aasta",e+" aastat"]};return a?e[t][2]||e[t][1]:s?e[t][0]:e[t][1]}M.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,a){return e?(/-MMM-/.test(a)?cs:hs)[e.month()]:hs},monthsRegex:n,monthsShortRegex:n,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:ge,longMonthsParse:ge,shortMonthsParse:ge,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",w:"una semana",ww:"%d semanas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4},invalidDate:"Fecha inv\xe1lida"}),M.defineLocale("et",{months:"jaanuar_veebruar_m\xe4rts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_m\xe4rts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"p\xfchap\xe4ev_esmasp\xe4ev_teisip\xe4ev_kolmap\xe4ev_neljap\xe4ev_reede_laup\xe4ev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[T\xe4na,] LT",nextDay:"[Homme,] LT",nextWeek:"[J\xe4rgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s p\xe4rast",past:"%s tagasi",s:Ls,ss:Ls,m:Ls,mm:Ls,h:Ls,hh:Ls,d:Ls,dd:"%d p\xe4eva",M:Ls,MM:Ls,y:Ls,yy:Ls},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),monthsParseExact:!0,weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] HH:mm",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] HH:mm",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] HH:mm",llll:"ddd, YYYY[ko] MMM D[a] HH:mm"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",ss:"%d segundo",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});var Ys={1:"\u06f1",2:"\u06f2",3:"\u06f3",4:"\u06f4",5:"\u06f5",6:"\u06f6",7:"\u06f7",8:"\u06f8",9:"\u06f9",0:"\u06f0"},ys={"\u06f1":"1","\u06f2":"2","\u06f3":"3","\u06f4":"4","\u06f5":"5","\u06f6":"6","\u06f7":"7","\u06f8":"8","\u06f9":"9","\u06f0":"0"},fs=(M.defineLocale("fa",{months:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),monthsShort:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),weekdays:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysShort:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysMin:"\u06cc_\u062f_\u0633_\u0686_\u067e_\u062c_\u0634".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631|\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/,isPM:function(e){return/\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/.test(e)},meridiem:function(e,a,t){return e<12?"\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631":"\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631"},calendar:{sameDay:"[\u0627\u0645\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",nextDay:"[\u0641\u0631\u062f\u0627 \u0633\u0627\u0639\u062a] LT",nextWeek:"dddd [\u0633\u0627\u0639\u062a] LT",lastDay:"[\u062f\u06cc\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",lastWeek:"dddd [\u067e\u06cc\u0634] [\u0633\u0627\u0639\u062a] LT",sameElse:"L"},relativeTime:{future:"\u062f\u0631 %s",past:"%s \u067e\u06cc\u0634",s:"\u0686\u0646\u062f \u062b\u0627\u0646\u06cc\u0647",ss:"%d \u062b\u0627\u0646\u06cc\u0647",m:"\u06cc\u06a9 \u062f\u0642\u06cc\u0642\u0647",mm:"%d \u062f\u0642\u06cc\u0642\u0647",h:"\u06cc\u06a9 \u0633\u0627\u0639\u062a",hh:"%d \u0633\u0627\u0639\u062a",d:"\u06cc\u06a9 \u0631\u0648\u0632",dd:"%d \u0631\u0648\u0632",M:"\u06cc\u06a9 \u0645\u0627\u0647",MM:"%d \u0645\u0627\u0647",y:"\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(e){return e.replace(/[\u06f0-\u06f9]/g,function(e){return ys[e]}).replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return Ys[e]}).replace(/,/g,"\u060c")},dayOfMonthOrdinalParse:/\d{1,2}\u0645/,ordinal:"%d\u0645",week:{dow:6,doy:12}}),"nolla yksi kaksi kolme nelj\xe4 viisi kuusi seitsem\xe4n kahdeksan yhdeks\xe4n".split(" ")),ps=["nolla","yhden","kahden","kolmen","nelj\xe4n","viiden","kuuden",fs[7],fs[8],fs[9]];function O(e,a,t,s){var n="";switch(t){case"s":return s?"muutaman sekunnin":"muutama sekunti";case"ss":n=s?"sekunnin":"sekuntia";break;case"m":return s?"minuutin":"minuutti";case"mm":n=s?"minuutin":"minuuttia";break;case"h":return s?"tunnin":"tunti";case"hh":n=s?"tunnin":"tuntia";break;case"d":return s?"p\xe4iv\xe4n":"p\xe4iv\xe4";case"dd":n=s?"p\xe4iv\xe4n":"p\xe4iv\xe4\xe4";break;case"M":return s?"kuukauden":"kuukausi";case"MM":n=s?"kuukauden":"kuukautta";break;case"y":return s?"vuoden":"vuosi";case"yy":n=s?"vuoden":"vuotta";break}return t=s,n=((e=e)<10?(t?ps:fs)[e]:e)+" "+n}M.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kes\xe4kuu_hein\xe4kuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kes\xe4_hein\xe4_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[t\xe4n\xe4\xe4n] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s p\xe4\xe4st\xe4",past:"%s sitten",s:O,ss:O,m:O,mm:O,h:O,hh:O,d:O,dd:O,M:O,MM:O,y:O,yy:O},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("fil",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(e){return e},week:{dow:1,doy:4}}),M.defineLocale("fo",{months:"januar_februar_mars_apr\xedl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_m\xe1nadagur_t\xfdsdagur_mikudagur_h\xf3sdagur_fr\xedggjadagur_leygardagur".split("_"),weekdaysShort:"sun_m\xe1n_t\xfds_mik_h\xf3s_fr\xed_ley".split("_"),weekdaysMin:"su_m\xe1_t\xfd_mi_h\xf3_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D. MMMM, YYYY HH:mm"},calendar:{sameDay:"[\xcd dag kl.] LT",nextDay:"[\xcd morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xcd gj\xe1r kl.] LT",lastWeek:"[s\xed\xf0stu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s s\xed\xf0ani",s:"f\xe1 sekund",ss:"%d sekundir",m:"ein minuttur",mm:"%d minuttir",h:"ein t\xedmi",hh:"%d t\xedmar",d:"ein dagur",dd:"%d dagar",M:"ein m\xe1na\xf0ur",MM:"%d m\xe1na\xf0ir",y:"eitt \xe1r",yy:"%d \xe1r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("fr-ca",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(e,a){switch(a){default:case"M":case"Q":case"D":case"DDD":case"d":return e+(1===e?"er":"e");case"w":case"W":return e+(1===e?"re":"e")}}}),M.defineLocale("fr-ch",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(e,a){switch(a){default:case"M":case"Q":case"D":case"DDD":case"d":return e+(1===e?"er":"e");case"w":case"W":return e+(1===e?"re":"e")}},week:{dow:1,doy:4}});var De=/(janv\.?|f\xe9vr\.?|mars|avr\.?|mai|juin|juil\.?|ao\xfbt|sept\.?|oct\.?|nov\.?|d\xe9c\.?|janvier|f\xe9vrier|mars|avril|mai|juin|juillet|ao\xfbt|septembre|octobre|novembre|d\xe9cembre)/i,pe=[/^janv/i,/^f\xe9vr/i,/^mars/i,/^avr/i,/^mai/i,/^juin/i,/^juil/i,/^ao\xfbt/i,/^sept/i,/^oct/i,/^nov/i,/^d\xe9c/i],ks=(M.defineLocale("fr",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsRegex:De,monthsShortRegex:De,monthsStrictRegex:/^(janvier|f\xe9vrier|mars|avril|mai|juin|juillet|ao\xfbt|septembre|octobre|novembre|d\xe9cembre)/i,monthsShortStrictRegex:/(janv\.?|f\xe9vr\.?|mars|avr\.?|mai|juin|juil\.?|ao\xfbt|sept\.?|oct\.?|nov\.?|d\xe9c\.?)/i,monthsParse:pe,longMonthsParse:pe,shortMonthsParse:pe,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",w:"une semaine",ww:"%d semaines",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|)/,ordinal:function(e,a){switch(a){case"D":return e+(1===e?"er":"");default:case"M":case"Q":case"DDD":case"d":return e+(1===e?"er":"e");case"w":case"W":return e+(1===e?"re":"e")}},week:{dow:1,doy:4}}),"jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.".split("_")),Ds="jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_");M.defineLocale("fy",{months:"jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber".split("_"),monthsShort:function(e,a){return e?(/-MMM-/.test(a)?Ds:ks)[e.month()]:ks},monthsParseExact:!0,weekdays:"snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon".split("_"),weekdaysShort:"si._mo._ti._wo._to._fr._so.".split("_"),weekdaysMin:"Si_Mo_Ti_Wo_To_Fr_So".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[hjoed om] LT",nextDay:"[moarn om] LT",nextWeek:"dddd [om] LT",lastDay:"[juster om] LT",lastWeek:"[\xf4fr\xfbne] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oer %s",past:"%s lyn",s:"in pear sekonden",ss:"%d sekonden",m:"ien min\xfat",mm:"%d minuten",h:"ien oere",hh:"%d oeren",d:"ien dei",dd:"%d dagen",M:"ien moanne",MM:"%d moannen",y:"ien jier",yy:"%d jierren"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||20<=e?"ste":"de")},week:{dow:1,doy:4}}),M.defineLocale("ga",{months:["Ean\xe1ir","Feabhra","M\xe1rta","Aibre\xe1n","Bealtaine","Meitheamh","I\xfail","L\xfanasa","Me\xe1n F\xf3mhair","Deireadh F\xf3mhair","Samhain","Nollaig"],monthsShort:["Ean","Feabh","M\xe1rt","Aib","Beal","Meith","I\xfail","L\xfan","M.F.","D.F.","Samh","Noll"],monthsParseExact:!0,weekdays:["D\xe9 Domhnaigh","D\xe9 Luain","D\xe9 M\xe1irt","D\xe9 C\xe9adaoin","D\xe9ardaoin","D\xe9 hAoine","D\xe9 Sathairn"],weekdaysShort:["Domh","Luan","M\xe1irt","C\xe9ad","D\xe9ar","Aoine","Sath"],weekdaysMin:["Do","Lu","M\xe1","C\xe9","D\xe9","A","Sa"],longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Inniu ag] LT",nextDay:"[Am\xe1rach ag] LT",nextWeek:"dddd [ag] LT",lastDay:"[Inn\xe9 ag] LT",lastWeek:"dddd [seo caite] [ag] LT",sameElse:"L"},relativeTime:{future:"i %s",past:"%s \xf3 shin",s:"c\xfapla soicind",ss:"%d soicind",m:"n\xf3im\xe9ad",mm:"%d n\xf3im\xe9ad",h:"uair an chloig",hh:"%d uair an chloig",d:"l\xe1",dd:"%d l\xe1",M:"m\xed",MM:"%d m\xedonna",y:"bliain",yy:"%d bliain"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(e){return e+(1===e?"d":e%10==2?"na":"mh")},week:{dow:1,doy:4}});function Ts(e,a,t,s){e={s:["\u0925\u094b\u0921\u092f\u093e \u0938\u0945\u0915\u0902\u0921\u093e\u0902\u0928\u0940","\u0925\u094b\u0921\u0947 \u0938\u0945\u0915\u0902\u0921"],ss:[e+" \u0938\u0945\u0915\u0902\u0921\u093e\u0902\u0928\u0940",e+" \u0938\u0945\u0915\u0902\u0921"],m:["\u090f\u0915\u093e \u092e\u093f\u0923\u091f\u093e\u0928","\u090f\u0915 \u092e\u093f\u0928\u0942\u091f"],mm:[e+" \u092e\u093f\u0923\u091f\u093e\u0902\u0928\u0940",e+" \u092e\u093f\u0923\u091f\u093e\u0902"],h:["\u090f\u0915\u093e \u0935\u0930\u093e\u0928","\u090f\u0915 \u0935\u0930"],hh:[e+" \u0935\u0930\u093e\u0902\u0928\u0940",e+" \u0935\u0930\u093e\u0902"],d:["\u090f\u0915\u093e \u0926\u093f\u0938\u093e\u0928","\u090f\u0915 \u0926\u0940\u0938"],dd:[e+" \u0926\u093f\u0938\u093e\u0902\u0928\u0940",e+" \u0926\u0940\u0938"],M:["\u090f\u0915\u093e \u092e\u094d\u0939\u092f\u0928\u094d\u092f\u093e\u0928","\u090f\u0915 \u092e\u094d\u0939\u092f\u0928\u094b"],MM:[e+" \u092e\u094d\u0939\u092f\u0928\u094d\u092f\u093e\u0928\u0940",e+" \u092e\u094d\u0939\u092f\u0928\u0947"],y:["\u090f\u0915\u093e \u0935\u0930\u094d\u0938\u093e\u0928","\u090f\u0915 \u0935\u0930\u094d\u0938"],yy:[e+" \u0935\u0930\u094d\u0938\u093e\u0902\u0928\u0940",e+" \u0935\u0930\u094d\u0938\u093e\u0902"]};return s?e[t][0]:e[t][1]}function gs(e,a,t,s){e={s:["thoddea sekondamni","thodde sekond"],ss:[e+" sekondamni",e+" sekond"],m:["eka mintan","ek minut"],mm:[e+" mintamni",e+" mintam"],h:["eka voran","ek vor"],hh:[e+" voramni",e+" voram"],d:["eka disan","ek dis"],dd:[e+" disamni",e+" dis"],M:["eka mhoinean","ek mhoino"],MM:[e+" mhoineamni",e+" mhoine"],y:["eka vorsan","ek voros"],yy:[e+" vorsamni",e+" vorsam"]};return s?e[t][0]:e[t][1]}M.defineLocale("gd",{months:["Am Faoilleach","An Gearran","Am M\xe0rt","An Giblean","An C\xe8itean","An t-\xd2gmhios","An t-Iuchar","An L\xf9nastal","An t-Sultain","An D\xe0mhair","An t-Samhain","An D\xf9bhlachd"],monthsShort:["Faoi","Gear","M\xe0rt","Gibl","C\xe8it","\xd2gmh","Iuch","L\xf9n","Sult","D\xe0mh","Samh","D\xf9bh"],monthsParseExact:!0,weekdays:["Did\xf2mhnaich","Diluain","Dim\xe0irt","Diciadain","Diardaoin","Dihaoine","Disathairne"],weekdaysShort:["Did","Dil","Dim","Dic","Dia","Dih","Dis"],weekdaysMin:["D\xf2","Lu","M\xe0","Ci","Ar","Ha","Sa"],longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[An-diugh aig] LT",nextDay:"[A-m\xe0ireach aig] LT",nextWeek:"dddd [aig] LT",lastDay:"[An-d\xe8 aig] LT",lastWeek:"dddd [seo chaidh] [aig] LT",sameElse:"L"},relativeTime:{future:"ann an %s",past:"bho chionn %s",s:"beagan diogan",ss:"%d diogan",m:"mionaid",mm:"%d mionaidean",h:"uair",hh:"%d uairean",d:"latha",dd:"%d latha",M:"m\xecos",MM:"%d m\xecosan",y:"bliadhna",yy:"%d bliadhna"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(e){return e+(1===e?"d":e%10==2?"na":"mh")},week:{dow:1,doy:4}}),M.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xu\xf1o_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xu\xf1._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_m\xe9rcores_xoves_venres_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._m\xe9r._xov._ven._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_m\xe9_xo_ve_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextDay:function(){return"[ma\xf1\xe1 "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"\xe1s":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"\xe1":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"\xe1s":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(e){return 0===e.indexOf("un")?"n"+e:"en "+e},past:"hai %s",s:"uns segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}}),M.defineLocale("gom-deva",{months:{standalone:"\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u090f\u092a\u094d\u0930\u0940\u0932_\u092e\u0947_\u091c\u0942\u0928_\u091c\u0941\u0932\u092f_\u0911\u0917\u0938\u094d\u091f_\u0938\u092a\u094d\u091f\u0947\u0902\u092c\u0930_\u0911\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930_\u0921\u093f\u0938\u0947\u0902\u092c\u0930".split("_"),format:"\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940\u091a\u094d\u092f\u093e_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940\u091a\u094d\u092f\u093e_\u092e\u093e\u0930\u094d\u091a\u093e\u091a\u094d\u092f\u093e_\u090f\u092a\u094d\u0930\u0940\u0932\u093e\u091a\u094d\u092f\u093e_\u092e\u0947\u092f\u093e\u091a\u094d\u092f\u093e_\u091c\u0942\u0928\u093e\u091a\u094d\u092f\u093e_\u091c\u0941\u0932\u092f\u093e\u091a\u094d\u092f\u093e_\u0911\u0917\u0938\u094d\u091f\u093e\u091a\u094d\u092f\u093e_\u0938\u092a\u094d\u091f\u0947\u0902\u092c\u0930\u093e\u091a\u094d\u092f\u093e_\u0911\u0915\u094d\u091f\u094b\u092c\u0930\u093e\u091a\u094d\u092f\u093e_\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930\u093e\u091a\u094d\u092f\u093e_\u0921\u093f\u0938\u0947\u0902\u092c\u0930\u093e\u091a\u094d\u092f\u093e".split("_"),isFormat:/MMMM(\s)+D[oD]?/},monthsShort:"\u091c\u093e\u0928\u0947._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a_\u090f\u092a\u094d\u0930\u0940._\u092e\u0947_\u091c\u0942\u0928_\u091c\u0941\u0932._\u0911\u0917._\u0938\u092a\u094d\u091f\u0947\u0902._\u0911\u0915\u094d\u091f\u094b._\u0928\u094b\u0935\u094d\u0939\u0947\u0902._\u0921\u093f\u0938\u0947\u0902.".split("_"),monthsParseExact:!0,weekdays:"\u0906\u092f\u0924\u093e\u0930_\u0938\u094b\u092e\u093e\u0930_\u092e\u0902\u0917\u0933\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u092c\u093f\u0930\u0947\u0938\u094d\u0924\u093e\u0930_\u0938\u0941\u0915\u094d\u0930\u093e\u0930_\u0936\u0947\u0928\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0906\u092f\u0924._\u0938\u094b\u092e._\u092e\u0902\u0917\u0933._\u092c\u0941\u0927._\u092c\u094d\u0930\u0947\u0938\u094d\u0924._\u0938\u0941\u0915\u094d\u0930._\u0936\u0947\u0928.".split("_"),weekdaysMin:"\u0906_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u092c\u094d\u0930\u0947_\u0938\u0941_\u0936\u0947".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A h:mm [\u0935\u093e\u091c\u0924\u093e\u0902]",LTS:"A h:mm:ss [\u0935\u093e\u091c\u0924\u093e\u0902]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [\u0935\u093e\u091c\u0924\u093e\u0902]",LLLL:"dddd, MMMM Do, YYYY, A h:mm [\u0935\u093e\u091c\u0924\u093e\u0902]",llll:"ddd, D MMM YYYY, A h:mm [\u0935\u093e\u091c\u0924\u093e\u0902]"},calendar:{sameDay:"[\u0906\u092f\u091c] LT",nextDay:"[\u092b\u093e\u0932\u094d\u092f\u093e\u0902] LT",nextWeek:"[\u092b\u0941\u0921\u0932\u094b] dddd[,] LT",lastDay:"[\u0915\u093e\u0932] LT",lastWeek:"[\u092b\u093e\u091f\u0932\u094b] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s \u0906\u0926\u0940\u0902",s:Ts,ss:Ts,m:Ts,mm:Ts,h:Ts,hh:Ts,d:Ts,dd:Ts,M:Ts,MM:Ts,y:Ts,yy:Ts},dayOfMonthOrdinalParse:/\d{1,2}(\u0935\u0947\u0930)/,ordinal:function(e,a){switch(a){case"D":return e+"\u0935\u0947\u0930";default:case"M":case"Q":case"DDD":case"d":case"w":case"W":return e}},week:{dow:0,doy:3},meridiemParse:/\u0930\u093e\u0924\u0940|\u0938\u0915\u093e\u0933\u0940\u0902|\u0926\u0928\u092a\u093e\u0930\u093e\u0902|\u0938\u093e\u0902\u091c\u0947/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0930\u093e\u0924\u0940"===a?e<4?e:e+12:"\u0938\u0915\u093e\u0933\u0940\u0902"===a?e:"\u0926\u0928\u092a\u093e\u0930\u093e\u0902"===a?12<e?e:e+12:"\u0938\u093e\u0902\u091c\u0947"===a?e+12:void 0},meridiem:function(e,a,t){return e<4?"\u0930\u093e\u0924\u0940":e<12?"\u0938\u0915\u093e\u0933\u0940\u0902":e<16?"\u0926\u0928\u092a\u093e\u0930\u093e\u0902":e<20?"\u0938\u093e\u0902\u091c\u0947":"\u0930\u093e\u0924\u0940"}}),M.defineLocale("gom-latn",{months:{standalone:"Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr".split("_"),format:"Janerachea_Febrerachea_Marsachea_Abrilachea_Maiachea_Junachea_Julaiachea_Agostachea_Setembrachea_Otubrachea_Novembrachea_Dezembrachea".split("_"),isFormat:/MMMM(\s)+D[oD]?/},monthsShort:"Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Aitar_Somar_Mongllar_Budhvar_Birestar_Sukrar_Son'var".split("_"),weekdaysShort:"Ait._Som._Mon._Bud._Bre._Suk._Son.".split("_"),weekdaysMin:"Ai_Sm_Mo_Bu_Br_Su_Sn".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A h:mm [vazta]",LTS:"A h:mm:ss [vazta]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [vazta]",LLLL:"dddd, MMMM Do, YYYY, A h:mm [vazta]",llll:"ddd, D MMM YYYY, A h:mm [vazta]"},calendar:{sameDay:"[Aiz] LT",nextDay:"[Faleam] LT",nextWeek:"[Fuddlo] dddd[,] LT",lastDay:"[Kal] LT",lastWeek:"[Fattlo] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s adim",s:gs,ss:gs,m:gs,mm:gs,h:gs,hh:gs,d:gs,dd:gs,M:gs,MM:gs,y:gs,yy:gs},dayOfMonthOrdinalParse:/\d{1,2}(er)/,ordinal:function(e,a){switch(a){case"D":return e+"er";default:case"M":case"Q":case"DDD":case"d":case"w":case"W":return e}},week:{dow:0,doy:3},meridiemParse:/rati|sokallim|donparam|sanje/,meridiemHour:function(e,a){return 12===e&&(e=0),"rati"===a?e<4?e:e+12:"sokallim"===a?e:"donparam"===a?12<e?e:e+12:"sanje"===a?e+12:void 0},meridiem:function(e,a,t){return e<4?"rati":e<12?"sokallim":e<16?"donparam":e<20?"sanje":"rati"}});var ws={1:"\u0ae7",2:"\u0ae8",3:"\u0ae9",4:"\u0aea",5:"\u0aeb",6:"\u0aec",7:"\u0aed",8:"\u0aee",9:"\u0aef",0:"\u0ae6"},bs={"\u0ae7":"1","\u0ae8":"2","\u0ae9":"3","\u0aea":"4","\u0aeb":"5","\u0aec":"6","\u0aed":"7","\u0aee":"8","\u0aef":"9","\u0ae6":"0"},Ss=(M.defineLocale("gu",{months:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1\u0a86\u0ab0\u0ac0_\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1\u0a86\u0ab0\u0ac0_\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf\u0ab2_\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe\u0a88_\u0a91\u0a97\u0ab8\u0acd\u0a9f_\u0ab8\u0aaa\u0acd\u0a9f\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0a91\u0a95\u0acd\u0a9f\u0acd\u0aac\u0ab0_\u0aa8\u0ab5\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0aa1\u0abf\u0ab8\u0ac7\u0aae\u0acd\u0aac\u0ab0".split("_"),monthsShort:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1._\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1._\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf._\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe._\u0a91\u0a97._\u0ab8\u0aaa\u0acd\u0a9f\u0ac7._\u0a91\u0a95\u0acd\u0a9f\u0acd._\u0aa8\u0ab5\u0ac7._\u0aa1\u0abf\u0ab8\u0ac7.".split("_"),monthsParseExact:!0,weekdays:"\u0ab0\u0ab5\u0abf\u0ab5\u0abe\u0ab0_\u0ab8\u0acb\u0aae\u0ab5\u0abe\u0ab0_\u0aae\u0a82\u0a97\u0ab3\u0ab5\u0abe\u0ab0_\u0aac\u0ac1\u0aa7\u0acd\u0ab5\u0abe\u0ab0_\u0a97\u0ac1\u0ab0\u0ac1\u0ab5\u0abe\u0ab0_\u0ab6\u0ac1\u0a95\u0acd\u0ab0\u0ab5\u0abe\u0ab0_\u0ab6\u0aa8\u0abf\u0ab5\u0abe\u0ab0".split("_"),weekdaysShort:"\u0ab0\u0ab5\u0abf_\u0ab8\u0acb\u0aae_\u0aae\u0a82\u0a97\u0ab3_\u0aac\u0ac1\u0aa7\u0acd_\u0a97\u0ac1\u0ab0\u0ac1_\u0ab6\u0ac1\u0a95\u0acd\u0ab0_\u0ab6\u0aa8\u0abf".split("_"),weekdaysMin:"\u0ab0_\u0ab8\u0acb_\u0aae\u0a82_\u0aac\u0ac1_\u0a97\u0ac1_\u0ab6\u0ac1_\u0ab6".split("_"),longDateFormat:{LT:"A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LTS:"A h:mm:ss \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LLLL:"dddd, D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7"},calendar:{sameDay:"[\u0a86\u0a9c] LT",nextDay:"[\u0a95\u0abe\u0ab2\u0ac7] LT",nextWeek:"dddd, LT",lastDay:"[\u0a97\u0a87\u0a95\u0abe\u0ab2\u0ac7] LT",lastWeek:"[\u0aaa\u0abe\u0a9b\u0ab2\u0abe] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0aae\u0abe",past:"%s \u0aaa\u0ab9\u0ac7\u0ab2\u0abe",s:"\u0a85\u0aae\u0ac1\u0a95 \u0aaa\u0ab3\u0acb",ss:"%d \u0ab8\u0ac7\u0a95\u0a82\u0aa1",m:"\u0a8f\u0a95 \u0aae\u0abf\u0aa8\u0abf\u0a9f",mm:"%d \u0aae\u0abf\u0aa8\u0abf\u0a9f",h:"\u0a8f\u0a95 \u0a95\u0ab2\u0abe\u0a95",hh:"%d \u0a95\u0ab2\u0abe\u0a95",d:"\u0a8f\u0a95 \u0aa6\u0abf\u0ab5\u0ab8",dd:"%d \u0aa6\u0abf\u0ab5\u0ab8",M:"\u0a8f\u0a95 \u0aae\u0ab9\u0abf\u0aa8\u0acb",MM:"%d \u0aae\u0ab9\u0abf\u0aa8\u0acb",y:"\u0a8f\u0a95 \u0ab5\u0ab0\u0acd\u0ab7",yy:"%d \u0ab5\u0ab0\u0acd\u0ab7"},preparse:function(e){return e.replace(/[\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u0ae6]/g,function(e){return bs[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return ws[e]})},meridiemParse:/\u0ab0\u0abe\u0aa4|\u0aac\u0aaa\u0acb\u0ab0|\u0ab8\u0ab5\u0abe\u0ab0|\u0ab8\u0abe\u0a82\u0a9c/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0ab0\u0abe\u0aa4"===a?e<4?e:e+12:"\u0ab8\u0ab5\u0abe\u0ab0"===a?e:"\u0aac\u0aaa\u0acb\u0ab0"===a?10<=e?e:e+12:"\u0ab8\u0abe\u0a82\u0a9c"===a?e+12:void 0},meridiem:function(e,a,t){return e<4?"\u0ab0\u0abe\u0aa4":e<10?"\u0ab8\u0ab5\u0abe\u0ab0":e<17?"\u0aac\u0aaa\u0acb\u0ab0":e<20?"\u0ab8\u0abe\u0a82\u0a9c":"\u0ab0\u0abe\u0aa4"},week:{dow:0,doy:6}}),M.defineLocale("he",{months:"\u05d9\u05e0\u05d5\u05d0\u05e8_\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05d9\u05dc_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8_\u05e1\u05e4\u05d8\u05de\u05d1\u05e8_\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8_\u05e0\u05d5\u05d1\u05de\u05d1\u05e8_\u05d3\u05e6\u05de\u05d1\u05e8".split("_"),monthsShort:"\u05d9\u05e0\u05d5\u05f3_\u05e4\u05d1\u05e8\u05f3_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05f3_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05f3_\u05e1\u05e4\u05d8\u05f3_\u05d0\u05d5\u05e7\u05f3_\u05e0\u05d5\u05d1\u05f3_\u05d3\u05e6\u05de\u05f3".split("_"),weekdays:"\u05e8\u05d0\u05e9\u05d5\u05df_\u05e9\u05e0\u05d9_\u05e9\u05dc\u05d9\u05e9\u05d9_\u05e8\u05d1\u05d9\u05e2\u05d9_\u05d7\u05de\u05d9\u05e9\u05d9_\u05e9\u05d9\u05e9\u05d9_\u05e9\u05d1\u05ea".split("_"),weekdaysShort:"\u05d0\u05f3_\u05d1\u05f3_\u05d2\u05f3_\u05d3\u05f3_\u05d4\u05f3_\u05d5\u05f3_\u05e9\u05f3".split("_"),weekdaysMin:"\u05d0_\u05d1_\u05d2_\u05d3_\u05d4_\u05d5_\u05e9".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [\u05d1]MMMM YYYY",LLL:"D [\u05d1]MMMM YYYY HH:mm",LLLL:"dddd, D [\u05d1]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[\u05d4\u05d9\u05d5\u05dd \u05d1\u05be]LT",nextDay:"[\u05de\u05d7\u05e8 \u05d1\u05be]LT",nextWeek:"dddd [\u05d1\u05e9\u05e2\u05d4] LT",lastDay:"[\u05d0\u05ea\u05de\u05d5\u05dc \u05d1\u05be]LT",lastWeek:"[\u05d1\u05d9\u05d5\u05dd] dddd [\u05d4\u05d0\u05d7\u05e8\u05d5\u05df \u05d1\u05e9\u05e2\u05d4] LT",sameElse:"L"},relativeTime:{future:"\u05d1\u05e2\u05d5\u05d3 %s",past:"\u05dc\u05e4\u05e0\u05d9 %s",s:"\u05de\u05e1\u05e4\u05e8 \u05e9\u05e0\u05d9\u05d5\u05ea",ss:"%d \u05e9\u05e0\u05d9\u05d5\u05ea",m:"\u05d3\u05e7\u05d4",mm:"%d \u05d3\u05e7\u05d5\u05ea",h:"\u05e9\u05e2\u05d4",hh:function(e){return 2===e?"\u05e9\u05e2\u05ea\u05d9\u05d9\u05dd":e+" \u05e9\u05e2\u05d5\u05ea"},d:"\u05d9\u05d5\u05dd",dd:function(e){return 2===e?"\u05d9\u05d5\u05de\u05d9\u05d9\u05dd":e+" \u05d9\u05de\u05d9\u05dd"},M:"\u05d7\u05d5\u05d3\u05e9",MM:function(e){return 2===e?"\u05d7\u05d5\u05d3\u05e9\u05d9\u05d9\u05dd":e+" \u05d7\u05d5\u05d3\u05e9\u05d9\u05dd"},y:"\u05e9\u05e0\u05d4",yy:function(e){return 2===e?"\u05e9\u05e0\u05ea\u05d9\u05d9\u05dd":e%10==0&&10!==e?e+" \u05e9\u05e0\u05d4":e+" \u05e9\u05e0\u05d9\u05dd"}},meridiemParse:/\u05d0\u05d7\u05d4"\u05e6|\u05dc\u05e4\u05e0\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8|\u05d1\u05d1\u05d5\u05e7\u05e8|\u05d1\u05e2\u05e8\u05d1/i,isPM:function(e){return/^(\u05d0\u05d7\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05d1\u05e2\u05e8\u05d1)$/.test(e)},meridiem:function(e,a,t){return e<5?"\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8":e<10?"\u05d1\u05d1\u05d5\u05e7\u05e8":e<12?t?'\u05dc\u05e4\u05e0\u05d4"\u05e6':"\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":e<18?t?'\u05d0\u05d7\u05d4"\u05e6':"\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":"\u05d1\u05e2\u05e8\u05d1"}}),{1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"}),Hs={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"},Ne=[/^\u091c\u0928/i,/^\u092b\u093c\u0930|\u092b\u0930/i,/^\u092e\u093e\u0930\u094d\u091a/i,/^\u0905\u092a\u094d\u0930\u0948/i,/^\u092e\u0908/i,/^\u091c\u0942\u0928/i,/^\u091c\u0941\u0932/i,/^\u0905\u0917/i,/^\u0938\u093f\u0924\u0902|\u0938\u093f\u0924/i,/^\u0905\u0915\u094d\u091f\u0942/i,/^\u0928\u0935|\u0928\u0935\u0902/i,/^\u0926\u093f\u0938\u0902|\u0926\u093f\u0938/i];function vs(e,a,t){var s=e+" ";switch(t){case"ss":return s+=1===e?"sekunda":2===e||3===e||4===e?"sekunde":"sekundi";case"m":return a?"jedna minuta":"jedne minute";case"mm":return s+=1!==e&&(2===e||3===e||4===e)?"minute":"minuta";case"h":return a?"jedan sat":"jednog sata";case"hh":return s+=1===e?"sat":2===e||3===e||4===e?"sata":"sati";case"dd":return s+=1===e?"dan":"dana";case"MM":return s+=1===e?"mjesec":2===e||3===e||4===e?"mjeseca":"mjeseci";case"yy":return s+=1!==e&&(2===e||3===e||4===e)?"godine":"godina"}}M.defineLocale("hi",{months:{format:"\u091c\u0928\u0935\u0930\u0940_\u092b\u093c\u0930\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948\u0932_\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0938\u094d\u0924_\u0938\u093f\u0924\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u0942\u092c\u0930_\u0928\u0935\u092e\u094d\u092c\u0930_\u0926\u093f\u0938\u092e\u094d\u092c\u0930".split("_"),standalone:"\u091c\u0928\u0935\u0930\u0940_\u092b\u0930\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948\u0932_\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0938\u094d\u0924_\u0938\u093f\u0924\u0902\u092c\u0930_\u0905\u0915\u094d\u091f\u0942\u092c\u0930_\u0928\u0935\u0902\u092c\u0930_\u0926\u093f\u0938\u0902\u092c\u0930".split("_")},monthsShort:"\u091c\u0928._\u092b\u093c\u0930._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948._\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932._\u0905\u0917._\u0938\u093f\u0924._\u0905\u0915\u094d\u091f\u0942._\u0928\u0935._\u0926\u093f\u0938.".split("_"),weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0932\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0932_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u092c\u091c\u0947",LTS:"A h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A h:mm \u092c\u091c\u0947"},monthsParse:Ne,longMonthsParse:Ne,shortMonthsParse:[/^\u091c\u0928/i,/^\u092b\u093c\u0930/i,/^\u092e\u093e\u0930\u094d\u091a/i,/^\u0905\u092a\u094d\u0930\u0948/i,/^\u092e\u0908/i,/^\u091c\u0942\u0928/i,/^\u091c\u0941\u0932/i,/^\u0905\u0917/i,/^\u0938\u093f\u0924/i,/^\u0905\u0915\u094d\u091f\u0942/i,/^\u0928\u0935/i,/^\u0926\u093f\u0938/i],monthsRegex:/^(\u091c\u0928\u0935\u0930\u0940|\u091c\u0928\.?|\u092b\u093c\u0930\u0935\u0930\u0940|\u092b\u0930\u0935\u0930\u0940|\u092b\u093c\u0930\.?|\u092e\u093e\u0930\u094d\u091a?|\u0905\u092a\u094d\u0930\u0948\u0932|\u0905\u092a\u094d\u0930\u0948\.?|\u092e\u0908?|\u091c\u0942\u0928?|\u091c\u0941\u0932\u093e\u0908|\u091c\u0941\u0932\.?|\u0905\u0917\u0938\u094d\u0924|\u0905\u0917\.?|\u0938\u093f\u0924\u092e\u094d\u092c\u0930|\u0938\u093f\u0924\u0902\u092c\u0930|\u0938\u093f\u0924\.?|\u0905\u0915\u094d\u091f\u0942\u092c\u0930|\u0905\u0915\u094d\u091f\u0942\.?|\u0928\u0935\u092e\u094d\u092c\u0930|\u0928\u0935\u0902\u092c\u0930|\u0928\u0935\.?|\u0926\u093f\u0938\u092e\u094d\u092c\u0930|\u0926\u093f\u0938\u0902\u092c\u0930|\u0926\u093f\u0938\.?)/i,monthsShortRegex:/^(\u091c\u0928\u0935\u0930\u0940|\u091c\u0928\.?|\u092b\u093c\u0930\u0935\u0930\u0940|\u092b\u0930\u0935\u0930\u0940|\u092b\u093c\u0930\.?|\u092e\u093e\u0930\u094d\u091a?|\u0905\u092a\u094d\u0930\u0948\u0932|\u0905\u092a\u094d\u0930\u0948\.?|\u092e\u0908?|\u091c\u0942\u0928?|\u091c\u0941\u0932\u093e\u0908|\u091c\u0941\u0932\.?|\u0905\u0917\u0938\u094d\u0924|\u0905\u0917\.?|\u0938\u093f\u0924\u092e\u094d\u092c\u0930|\u0938\u093f\u0924\u0902\u092c\u0930|\u0938\u093f\u0924\.?|\u0905\u0915\u094d\u091f\u0942\u092c\u0930|\u0905\u0915\u094d\u091f\u0942\.?|\u0928\u0935\u092e\u094d\u092c\u0930|\u0928\u0935\u0902\u092c\u0930|\u0928\u0935\.?|\u0926\u093f\u0938\u092e\u094d\u092c\u0930|\u0926\u093f\u0938\u0902\u092c\u0930|\u0926\u093f\u0938\.?)/i,monthsStrictRegex:/^(\u091c\u0928\u0935\u0930\u0940?|\u092b\u093c\u0930\u0935\u0930\u0940|\u092b\u0930\u0935\u0930\u0940?|\u092e\u093e\u0930\u094d\u091a?|\u0905\u092a\u094d\u0930\u0948\u0932?|\u092e\u0908?|\u091c\u0942\u0928?|\u091c\u0941\u0932\u093e\u0908?|\u0905\u0917\u0938\u094d\u0924?|\u0938\u093f\u0924\u092e\u094d\u092c\u0930|\u0938\u093f\u0924\u0902\u092c\u0930|\u0938\u093f\u0924?\.?|\u0905\u0915\u094d\u091f\u0942\u092c\u0930|\u0905\u0915\u094d\u091f\u0942\.?|\u0928\u0935\u092e\u094d\u092c\u0930|\u0928\u0935\u0902\u092c\u0930?|\u0926\u093f\u0938\u092e\u094d\u092c\u0930|\u0926\u093f\u0938\u0902\u092c\u0930?)/i,monthsShortStrictRegex:/^(\u091c\u0928\.?|\u092b\u093c\u0930\.?|\u092e\u093e\u0930\u094d\u091a?|\u0905\u092a\u094d\u0930\u0948\.?|\u092e\u0908?|\u091c\u0942\u0928?|\u091c\u0941\u0932\.?|\u0905\u0917\.?|\u0938\u093f\u0924\.?|\u0905\u0915\u094d\u091f\u0942\.?|\u0928\u0935\.?|\u0926\u093f\u0938\.?)/i,calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0915\u0932] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u0932] LT",lastWeek:"[\u092a\u093f\u091b\u0932\u0947] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u092e\u0947\u0902",past:"%s \u092a\u0939\u0932\u0947",s:"\u0915\u0941\u091b \u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0902\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u091f",mm:"%d \u092e\u093f\u0928\u091f",h:"\u090f\u0915 \u0918\u0902\u091f\u093e",hh:"%d \u0918\u0902\u091f\u0947",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u0940\u0928\u0947",MM:"%d \u092e\u0939\u0940\u0928\u0947",y:"\u090f\u0915 \u0935\u0930\u094d\u0937",yy:"%d \u0935\u0930\u094d\u0937"},preparse:function(e){return e.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(e){return Hs[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return Ss[e]})},meridiemParse:/\u0930\u093e\u0924|\u0938\u0941\u092c\u0939|\u0926\u094b\u092a\u0939\u0930|\u0936\u093e\u092e/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0930\u093e\u0924"===a?e<4?e:e+12:"\u0938\u0941\u092c\u0939"===a?e:"\u0926\u094b\u092a\u0939\u0930"===a?10<=e?e:e+12:"\u0936\u093e\u092e"===a?e+12:void 0},meridiem:function(e,a,t){return e<4?"\u0930\u093e\u0924":e<10?"\u0938\u0941\u092c\u0939":e<17?"\u0926\u094b\u092a\u0939\u0930":e<20?"\u0936\u093e\u092e":"\u0930\u093e\u0924"},week:{dow:0,doy:6}}),M.defineLocale("hr",{months:{format:"sije\u010dnja_velja\u010de_o\u017eujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"sije\u010danj_velja\u010da_o\u017eujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._o\u017eu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"Do MMMM YYYY",LLL:"Do MMMM YYYY H:mm",LLLL:"dddd, Do MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010der u] LT",lastWeek:function(){switch(this.day()){case 0:return"[pro\u0161lu] [nedjelju] [u] LT";case 3:return"[pro\u0161lu] [srijedu] [u] LT";case 6:return"[pro\u0161le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[pro\u0161li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:vs,m:vs,mm:vs,h:vs,hh:vs,d:"dan",dd:vs,M:"mjesec",MM:vs,y:"godinu",yy:vs},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});var js="vas\xe1rnap h\xe9tf\u0151n kedden szerd\xe1n cs\xfct\xf6rt\xf6k\xf6n p\xe9nteken szombaton".split(" ");function xs(e,a,t,s){var n=e;switch(t){case"s":return s||a?"n\xe9h\xe1ny m\xe1sodperc":"n\xe9h\xe1ny m\xe1sodperce";case"ss":return n+(s||a)?" m\xe1sodperc":" m\xe1sodperce";case"m":return"egy"+(s||a?" perc":" perce");case"mm":return n+(s||a?" perc":" perce");case"h":return"egy"+(s||a?" \xf3ra":" \xf3r\xe1ja");case"hh":return n+(s||a?" \xf3ra":" \xf3r\xe1ja");case"d":return"egy"+(s||a?" nap":" napja");case"dd":return n+(s||a?" nap":" napja");case"M":return"egy"+(s||a?" h\xf3nap":" h\xf3napja");case"MM":return n+(s||a?" h\xf3nap":" h\xf3napja");case"y":return"egy"+(s||a?" \xe9v":" \xe9ve");case"yy":return n+(s||a?" \xe9v":" \xe9ve")}return""}function Ps(e){return(e?"":"[m\xfalt] ")+"["+js[this.day()]+"] LT[-kor]"}function Os(e){return e%100==11||e%10!=1}function Ws(e,a,t,s){var n=e+" ";switch(t){case"s":return a||s?"nokkrar sek\xfandur":"nokkrum sek\xfandum";case"ss":return Os(e)?n+(a||s?"sek\xfandur":"sek\xfandum"):n+"sek\xfanda";case"m":return a?"m\xedn\xfata":"m\xedn\xfatu";case"mm":return Os(e)?n+(a||s?"m\xedn\xfatur":"m\xedn\xfatum"):a?n+"m\xedn\xfata":n+"m\xedn\xfatu";case"hh":return Os(e)?n+(a||s?"klukkustundir":"klukkustundum"):n+"klukkustund";case"d":return a?"dagur":s?"dag":"degi";case"dd":return Os(e)?a?n+"dagar":n+(s?"daga":"d\xf6gum"):a?n+"dagur":n+(s?"dag":"degi");case"M":return a?"m\xe1nu\xf0ur":s?"m\xe1nu\xf0":"m\xe1nu\xf0i";case"MM":return Os(e)?a?n+"m\xe1nu\xf0ir":n+(s?"m\xe1nu\xf0i":"m\xe1nu\xf0um"):a?n+"m\xe1nu\xf0ur":n+(s?"m\xe1nu\xf0":"m\xe1nu\xf0i");case"y":return a||s?"\xe1r":"\xe1ri";case"yy":return Os(e)?n+(a||s?"\xe1r":"\xe1rum"):n+(a||s?"\xe1r":"\xe1ri")}}M.defineLocale("hu",{months:"janu\xe1r_febru\xe1r_m\xe1rcius_\xe1prilis_m\xe1jus_j\xfanius_j\xfalius_augusztus_szeptember_okt\xf3ber_november_december".split("_"),monthsShort:"jan._feb._m\xe1rc._\xe1pr._m\xe1j._j\xfan._j\xfal._aug._szept._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"vas\xe1rnap_h\xe9tf\u0151_kedd_szerda_cs\xfct\xf6rt\xf6k_p\xe9ntek_szombat".split("_"),weekdaysShort:"vas_h\xe9t_kedd_sze_cs\xfct_p\xe9n_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"},meridiemParse:/de|du/i,isPM:function(e){return"u"===e.charAt(1).toLowerCase()},meridiem:function(e,a,t){return e<12?!0===t?"de":"DE":!0===t?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return Ps.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return Ps.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s m\xfalva",past:"%s",s:xs,ss:xs,m:xs,mm:xs,h:xs,hh:xs,d:xs,dd:xs,M:xs,MM:xs,y:xs,yy:xs},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("hy-am",{months:{format:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580\u056b_\u0583\u0565\u057f\u0580\u057e\u0561\u0580\u056b_\u0574\u0561\u0580\u057f\u056b_\u0561\u057a\u0580\u056b\u056c\u056b_\u0574\u0561\u0575\u056b\u057d\u056b_\u0570\u0578\u0582\u0576\u056b\u057d\u056b_\u0570\u0578\u0582\u056c\u056b\u057d\u056b_\u0585\u0563\u0578\u057d\u057f\u0578\u057d\u056b_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580\u056b_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b".split("_"),standalone:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580_\u0583\u0565\u057f\u0580\u057e\u0561\u0580_\u0574\u0561\u0580\u057f_\u0561\u057a\u0580\u056b\u056c_\u0574\u0561\u0575\u056b\u057d_\u0570\u0578\u0582\u0576\u056b\u057d_\u0570\u0578\u0582\u056c\u056b\u057d_\u0585\u0563\u0578\u057d\u057f\u0578\u057d_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580".split("_")},monthsShort:"\u0570\u0576\u057e_\u0583\u057f\u0580_\u0574\u0580\u057f_\u0561\u057a\u0580_\u0574\u0575\u057d_\u0570\u0576\u057d_\u0570\u056c\u057d_\u0585\u0563\u057d_\u057d\u057a\u057f_\u0570\u056f\u057f_\u0576\u0574\u0562_\u0564\u056f\u057f".split("_"),weekdays:"\u056f\u056b\u0580\u0561\u056f\u056b_\u0565\u0580\u056f\u0578\u0582\u0577\u0561\u0562\u0569\u056b_\u0565\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0579\u0578\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0570\u056b\u0576\u0563\u0577\u0561\u0562\u0569\u056b_\u0578\u0582\u0580\u0562\u0561\u0569_\u0577\u0561\u0562\u0561\u0569".split("_"),weekdaysShort:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),weekdaysMin:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0569.",LLL:"D MMMM YYYY \u0569., HH:mm",LLLL:"dddd, D MMMM YYYY \u0569., HH:mm"},calendar:{sameDay:"[\u0561\u0575\u057d\u0585\u0580] LT",nextDay:"[\u057e\u0561\u0572\u0568] LT",lastDay:"[\u0565\u0580\u0565\u056f] LT",nextWeek:function(){return"dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},lastWeek:function(){return"[\u0561\u0576\u0581\u0561\u056e] dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},sameElse:"L"},relativeTime:{future:"%s \u0570\u0565\u057f\u0578",past:"%s \u0561\u057c\u0561\u057b",s:"\u0574\u056b \u0584\u0561\u0576\u056b \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",ss:"%d \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",m:"\u0580\u0578\u057a\u0565",mm:"%d \u0580\u0578\u057a\u0565",h:"\u056a\u0561\u0574",hh:"%d \u056a\u0561\u0574",d:"\u0585\u0580",dd:"%d \u0585\u0580",M:"\u0561\u0574\u056b\u057d",MM:"%d \u0561\u0574\u056b\u057d",y:"\u057f\u0561\u0580\u056b",yy:"%d \u057f\u0561\u0580\u056b"},meridiemParse:/\u0563\u056b\u0577\u0565\u0580\u057e\u0561|\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561|\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576/,isPM:function(e){return/^(\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576)$/.test(e)},meridiem:function(e){return e<4?"\u0563\u056b\u0577\u0565\u0580\u057e\u0561":e<12?"\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561":e<17?"\u0581\u0565\u0580\u0565\u056f\u057e\u0561":"\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576"},dayOfMonthOrdinalParse:/\d{1,2}|\d{1,2}-(\u056b\u0576|\u0580\u0564)/,ordinal:function(e,a){switch(a){case"DDD":case"w":case"W":case"DDDo":return 1===e?e+"-\u056b\u0576":e+"-\u0580\u0564";default:return e}},week:{dow:1,doy:7}}),M.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(e,a){return 12===e&&(e=0),"pagi"===a?e:"siang"===a?11<=e?e:e+12:"sore"===a||"malam"===a?e+12:void 0},meridiem:function(e,a,t){return e<11?"pagi":e<15?"siang":e<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",ss:"%d detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:0,doy:6}}),M.defineLocale("is",{months:"jan\xfaar_febr\xfaar_mars_apr\xedl_ma\xed_j\xfan\xed_j\xfal\xed_\xe1g\xfast_september_okt\xf3ber_n\xf3vember_desember".split("_"),monthsShort:"jan_feb_mar_apr_ma\xed_j\xfan_j\xfal_\xe1g\xfa_sep_okt_n\xf3v_des".split("_"),weekdays:"sunnudagur_m\xe1nudagur_\xferi\xf0judagur_mi\xf0vikudagur_fimmtudagur_f\xf6studagur_laugardagur".split("_"),weekdaysShort:"sun_m\xe1n_\xferi_mi\xf0_fim_f\xf6s_lau".split("_"),weekdaysMin:"Su_M\xe1_\xder_Mi_Fi_F\xf6_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[\xed dag kl.] LT",nextDay:"[\xe1 morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xed g\xe6r kl.] LT",lastWeek:"[s\xed\xf0asta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s s\xed\xf0an",s:Ws,ss:Ws,m:Ws,mm:Ws,h:"klukkustund",hh:Ws,d:Ws,dd:Ws,M:Ws,MM:Ws,y:Ws,yy:Ws},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("it-ch",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_luned\xec_marted\xec_mercoled\xec_gioved\xec_venerd\xec_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(e){return(/^[0-9].+$/.test(e)?"tra":"in")+" "+e},past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}}),M.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_luned\xec_marted\xec_mercoled\xec_gioved\xec_venerd\xec_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:function(){return"[Oggi a"+(1<this.hours()?"lle ":0===this.hours()?" ":"ll'")+"]LT"},nextDay:function(){return"[Domani a"+(1<this.hours()?"lle ":0===this.hours()?" ":"ll'")+"]LT"},nextWeek:function(){return"dddd [a"+(1<this.hours()?"lle ":0===this.hours()?" ":"ll'")+"]LT"},lastDay:function(){return"[Ieri a"+(1<this.hours()?"lle ":0===this.hours()?" ":"ll'")+"]LT"},lastWeek:function(){switch(this.day()){case 0:return"[La scorsa] dddd [a"+(1<this.hours()?"lle ":0===this.hours()?" ":"ll'")+"]LT";default:return"[Lo scorso] dddd [a"+(1<this.hours()?"lle ":0===this.hours()?" ":"ll'")+"]LT"}},sameElse:"L"},relativeTime:{future:"tra %s",past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",w:"una settimana",ww:"%d settimane",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}}),M.defineLocale("ja",{eras:[{since:"2019-05-01",offset:1,name:"\u4ee4\u548c",narrow:"\u32ff",abbr:"R"},{since:"1989-01-08",until:"2019-04-30",offset:1,name:"\u5e73\u6210",narrow:"\u337b",abbr:"H"},{since:"1926-12-25",until:"1989-01-07",offset:1,name:"\u662d\u548c",narrow:"\u337c",abbr:"S"},{since:"1912-07-30",until:"1926-12-24",offset:1,name:"\u5927\u6b63",narrow:"\u337d",abbr:"T"},{since:"1873-01-01",until:"1912-07-29",offset:6,name:"\u660e\u6cbb",narrow:"\u337e",abbr:"M"},{since:"0001-01-01",until:"1873-12-31",offset:1,name:"\u897f\u66a6",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"\u7d00\u5143\u524d",narrow:"BC",abbr:"BC"}],eraYearOrdinalRegex:/(\u5143|\d+)\u5e74/,eraYearOrdinalParse:function(e,a){return"\u5143"===a[1]?1:parseInt(a[1]||e,10)},months:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u65e5\u66dc\u65e5_\u6708\u66dc\u65e5_\u706b\u66dc\u65e5_\u6c34\u66dc\u65e5_\u6728\u66dc\u65e5_\u91d1\u66dc\u65e5_\u571f\u66dc\u65e5".split("_"),weekdaysShort:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),weekdaysMin:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5 dddd HH:mm",l:"YYYY/MM/DD",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5(ddd) HH:mm"},meridiemParse:/\u5348\u524d|\u5348\u5f8c/i,isPM:function(e){return"\u5348\u5f8c"===e},meridiem:function(e,a,t){return e<12?"\u5348\u524d":"\u5348\u5f8c"},calendar:{sameDay:"[\u4eca\u65e5] LT",nextDay:"[\u660e\u65e5] LT",nextWeek:function(e){return e.week()!==this.week()?"[\u6765\u9031]dddd LT":"dddd LT"},lastDay:"[\u6628\u65e5] LT",lastWeek:function(e){return this.week()!==e.week()?"[\u5148\u9031]dddd LT":"dddd LT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}\u65e5/,ordinal:function(e,a){switch(a){case"y":return 1===e?"\u5143\u5e74":e+"\u5e74";case"d":case"D":case"DDD":return e+"\u65e5";default:return e}},relativeTime:{future:"%s\u5f8c",past:"%s\u524d",s:"\u6570\u79d2",ss:"%d\u79d2",m:"1\u5206",mm:"%d\u5206",h:"1\u6642\u9593",hh:"%d\u6642\u9593",d:"1\u65e5",dd:"%d\u65e5",M:"1\u30f6\u6708",MM:"%d\u30f6\u6708",y:"1\u5e74",yy:"%d\u5e74"}}),M.defineLocale("jv",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des".split("_"),weekdays:"Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu".split("_"),weekdaysShort:"Min_Sen_Sel_Reb_Kem_Jem_Sep".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sp".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/enjing|siyang|sonten|ndalu/,meridiemHour:function(e,a){return 12===e&&(e=0),"enjing"===a?e:"siyang"===a?11<=e?e:e+12:"sonten"===a||"ndalu"===a?e+12:void 0},meridiem:function(e,a,t){return e<11?"enjing":e<15?"siyang":e<19?"sonten":"ndalu"},calendar:{sameDay:"[Dinten puniko pukul] LT",nextDay:"[Mbenjang pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kala wingi pukul] LT",lastWeek:"dddd [kepengker pukul] LT",sameElse:"L"},relativeTime:{future:"wonten ing %s",past:"%s ingkang kepengker",s:"sawetawis detik",ss:"%d detik",m:"setunggal menit",mm:"%d menit",h:"setunggal jam",hh:"%d jam",d:"sedinten",dd:"%d dinten",M:"sewulan",MM:"%d wulan",y:"setaun",yy:"%d taun"},week:{dow:1,doy:7}}),M.defineLocale("ka",{months:"\u10d8\u10d0\u10dc\u10d5\u10d0\u10e0\u10d8_\u10d7\u10d4\u10d1\u10d4\u10e0\u10d5\u10d0\u10da\u10d8_\u10db\u10d0\u10e0\u10e2\u10d8_\u10d0\u10de\u10e0\u10d8\u10da\u10d8_\u10db\u10d0\u10d8\u10e1\u10d8_\u10d8\u10d5\u10dc\u10d8\u10e1\u10d8_\u10d8\u10d5\u10da\u10d8\u10e1\u10d8_\u10d0\u10d2\u10d5\u10d8\u10e1\u10e2\u10dd_\u10e1\u10d4\u10e5\u10e2\u10d4\u10db\u10d1\u10d4\u10e0\u10d8_\u10dd\u10e5\u10e2\u10dd\u10db\u10d1\u10d4\u10e0\u10d8_\u10dc\u10dd\u10d4\u10db\u10d1\u10d4\u10e0\u10d8_\u10d3\u10d4\u10d9\u10d4\u10db\u10d1\u10d4\u10e0\u10d8".split("_"),monthsShort:"\u10d8\u10d0\u10dc_\u10d7\u10d4\u10d1_\u10db\u10d0\u10e0_\u10d0\u10de\u10e0_\u10db\u10d0\u10d8_\u10d8\u10d5\u10dc_\u10d8\u10d5\u10da_\u10d0\u10d2\u10d5_\u10e1\u10d4\u10e5_\u10dd\u10e5\u10e2_\u10dc\u10dd\u10d4_\u10d3\u10d4\u10d9".split("_"),weekdays:{standalone:"\u10d9\u10d5\u10d8\u10e0\u10d0_\u10dd\u10e0\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10e1\u10d0\u10db\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10dd\u10d7\u10ee\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10ee\u10e3\u10d7\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10de\u10d0\u10e0\u10d0\u10e1\u10d9\u10d4\u10d5\u10d8_\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8".split("_"),format:"\u10d9\u10d5\u10d8\u10e0\u10d0\u10e1_\u10dd\u10e0\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10e1\u10d0\u10db\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10dd\u10d7\u10ee\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10ee\u10e3\u10d7\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10de\u10d0\u10e0\u10d0\u10e1\u10d9\u10d4\u10d5\u10e1_\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1".split("_"),isFormat:/(\u10ec\u10d8\u10dc\u10d0|\u10e8\u10d4\u10db\u10d3\u10d4\u10d2)/},weekdaysShort:"\u10d9\u10d5\u10d8_\u10dd\u10e0\u10e8_\u10e1\u10d0\u10db_\u10dd\u10d7\u10ee_\u10ee\u10e3\u10d7_\u10de\u10d0\u10e0_\u10e8\u10d0\u10d1".split("_"),weekdaysMin:"\u10d9\u10d5_\u10dd\u10e0_\u10e1\u10d0_\u10dd\u10d7_\u10ee\u10e3_\u10de\u10d0_\u10e8\u10d0".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u10d3\u10e6\u10d4\u10e1] LT[-\u10d6\u10d4]",nextDay:"[\u10ee\u10d5\u10d0\u10da] LT[-\u10d6\u10d4]",lastDay:"[\u10d2\u10e3\u10e8\u10d8\u10dc] LT[-\u10d6\u10d4]",nextWeek:"[\u10e8\u10d4\u10db\u10d3\u10d4\u10d2] dddd LT[-\u10d6\u10d4]",lastWeek:"[\u10ec\u10d8\u10dc\u10d0] dddd LT-\u10d6\u10d4",sameElse:"L"},relativeTime:{future:function(e){return e.replace(/(\u10ec\u10d0\u10db|\u10ec\u10e3\u10d7|\u10e1\u10d0\u10d0\u10d7|\u10ec\u10d4\u10da|\u10d3\u10e6|\u10d7\u10d5)(\u10d8|\u10d4)/,function(e,a,t){return"\u10d8"===t?a+"\u10e8\u10d8":a+t+"\u10e8\u10d8"})},past:function(e){return/(\u10ec\u10d0\u10db\u10d8|\u10ec\u10e3\u10d7\u10d8|\u10e1\u10d0\u10d0\u10d7\u10d8|\u10d3\u10e6\u10d4|\u10d7\u10d5\u10d4)/.test(e)?e.replace(/(\u10d8|\u10d4)$/,"\u10d8\u10e1 \u10ec\u10d8\u10dc"):/\u10ec\u10d4\u10da\u10d8/.test(e)?e.replace(/\u10ec\u10d4\u10da\u10d8$/,"\u10ec\u10da\u10d8\u10e1 \u10ec\u10d8\u10dc"):e},s:"\u10e0\u10d0\u10db\u10d3\u10d4\u10dc\u10d8\u10db\u10d4 \u10ec\u10d0\u10db\u10d8",ss:"%d \u10ec\u10d0\u10db\u10d8",m:"\u10ec\u10e3\u10d7\u10d8",mm:"%d \u10ec\u10e3\u10d7\u10d8",h:"\u10e1\u10d0\u10d0\u10d7\u10d8",hh:"%d \u10e1\u10d0\u10d0\u10d7\u10d8",d:"\u10d3\u10e6\u10d4",dd:"%d \u10d3\u10e6\u10d4",M:"\u10d7\u10d5\u10d4",MM:"%d \u10d7\u10d5\u10d4",y:"\u10ec\u10d4\u10da\u10d8",yy:"%d \u10ec\u10d4\u10da\u10d8"},dayOfMonthOrdinalParse:/0|1-\u10da\u10d8|\u10db\u10d4-\d{1,2}|\d{1,2}-\u10d4/,ordinal:function(e){return 0===e?e:1===e?e+"-\u10da\u10d8":e<20||e<=100&&e%20==0||e%100==0?"\u10db\u10d4-"+e:e+"-\u10d4"},week:{dow:1,doy:7}});var As={0:"-\u0448\u0456",1:"-\u0448\u0456",2:"-\u0448\u0456",3:"-\u0448\u0456",4:"-\u0448\u0456",5:"-\u0448\u0456",6:"-\u0448\u044b",7:"-\u0448\u0456",8:"-\u0448\u0456",9:"-\u0448\u044b",10:"-\u0448\u044b",20:"-\u0448\u044b",30:"-\u0448\u044b",40:"-\u0448\u044b",50:"-\u0448\u0456",60:"-\u0448\u044b",70:"-\u0448\u0456",80:"-\u0448\u0456",90:"-\u0448\u044b",100:"-\u0448\u0456"},Es=(M.defineLocale("kk",{months:"\u049b\u0430\u04a3\u0442\u0430\u0440_\u0430\u049b\u043f\u0430\u043d_\u043d\u0430\u0443\u0440\u044b\u0437_\u0441\u04d9\u0443\u0456\u0440_\u043c\u0430\u043c\u044b\u0440_\u043c\u0430\u0443\u0441\u044b\u043c_\u0448\u0456\u043b\u0434\u0435_\u0442\u0430\u043c\u044b\u0437_\u049b\u044b\u0440\u043a\u04af\u0439\u0435\u043a_\u049b\u0430\u0437\u0430\u043d_\u049b\u0430\u0440\u0430\u0448\u0430_\u0436\u0435\u043b\u0442\u043e\u049b\u0441\u0430\u043d".split("_"),monthsShort:"\u049b\u0430\u04a3_\u0430\u049b\u043f_\u043d\u0430\u0443_\u0441\u04d9\u0443_\u043c\u0430\u043c_\u043c\u0430\u0443_\u0448\u0456\u043b_\u0442\u0430\u043c_\u049b\u044b\u0440_\u049b\u0430\u0437_\u049b\u0430\u0440_\u0436\u0435\u043b".split("_"),weekdays:"\u0436\u0435\u043a\u0441\u0435\u043d\u0431\u0456_\u0434\u04af\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u04d9\u0440\u0441\u0435\u043d\u0431\u0456_\u0431\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0436\u04b1\u043c\u0430_\u0441\u0435\u043d\u0431\u0456".split("_"),weekdaysShort:"\u0436\u0435\u043a_\u0434\u04af\u0439_\u0441\u0435\u0439_\u0441\u04d9\u0440_\u0431\u0435\u0439_\u0436\u04b1\u043c_\u0441\u0435\u043d".split("_"),weekdaysMin:"\u0436\u043a_\u0434\u0439_\u0441\u0439_\u0441\u0440_\u0431\u0439_\u0436\u043c_\u0441\u043d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u0456\u043d \u0441\u0430\u0493\u0430\u0442] LT",nextDay:"[\u0415\u0440\u0442\u0435\u04a3 \u0441\u0430\u0493\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0493\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0448\u0435 \u0441\u0430\u0493\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u0435\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u04a3] dddd [\u0441\u0430\u0493\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0456\u0448\u0456\u043d\u0434\u0435",past:"%s \u0431\u04b1\u0440\u044b\u043d",s:"\u0431\u0456\u0440\u043d\u0435\u0448\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0456\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u0431\u0456\u0440 \u0441\u0430\u0493\u0430\u0442",hh:"%d \u0441\u0430\u0493\u0430\u0442",d:"\u0431\u0456\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0456\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0456\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0448\u0456|\u0448\u044b)/,ordinal:function(e){return e+(As[e]||As[e%10]||As[100<=e?100:null])},week:{dow:1,doy:7}}),{1:"\u17e1",2:"\u17e2",3:"\u17e3",4:"\u17e4",5:"\u17e5",6:"\u17e6",7:"\u17e7",8:"\u17e8",9:"\u17e9",0:"\u17e0"}),Fs={"\u17e1":"1","\u17e2":"2","\u17e3":"3","\u17e4":"4","\u17e5":"5","\u17e6":"6","\u17e7":"7","\u17e8":"8","\u17e9":"9","\u17e0":"0"},zs=(M.defineLocale("km",{months:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),monthsShort:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),weekdays:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),weekdaysShort:"\u17a2\u17b6_\u1785_\u17a2_\u1796_\u1796\u17d2\u179a_\u179f\u17bb_\u179f".split("_"),weekdaysMin:"\u17a2\u17b6_\u1785_\u17a2_\u1796_\u1796\u17d2\u179a_\u179f\u17bb_\u179f".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u1796\u17d2\u179a\u17b9\u1780|\u179b\u17d2\u1784\u17b6\u1785/,isPM:function(e){return"\u179b\u17d2\u1784\u17b6\u1785"===e},meridiem:function(e,a,t){return e<12?"\u1796\u17d2\u179a\u17b9\u1780":"\u179b\u17d2\u1784\u17b6\u1785"},calendar:{sameDay:"[\u1790\u17d2\u1784\u17c3\u1793\u17c1\u17c7 \u1798\u17c9\u17c4\u1784] LT",nextDay:"[\u179f\u17d2\u17a2\u17c2\u1780 \u1798\u17c9\u17c4\u1784] LT",nextWeek:"dddd [\u1798\u17c9\u17c4\u1784] LT",lastDay:"[\u1798\u17d2\u179f\u17b7\u179b\u1798\u17b7\u1789 \u1798\u17c9\u17c4\u1784] LT",lastWeek:"dddd [\u179f\u1794\u17d2\u178f\u17b6\u17a0\u17cd\u1798\u17bb\u1793] [\u1798\u17c9\u17c4\u1784] LT",sameElse:"L"},relativeTime:{future:"%s\u1791\u17c0\u178f",past:"%s\u1798\u17bb\u1793",s:"\u1794\u17c9\u17bb\u1793\u17d2\u1798\u17b6\u1793\u179c\u17b7\u1793\u17b6\u1791\u17b8",ss:"%d \u179c\u17b7\u1793\u17b6\u1791\u17b8",m:"\u1798\u17bd\u1799\u1793\u17b6\u1791\u17b8",mm:"%d \u1793\u17b6\u1791\u17b8",h:"\u1798\u17bd\u1799\u1798\u17c9\u17c4\u1784",hh:"%d \u1798\u17c9\u17c4\u1784",d:"\u1798\u17bd\u1799\u1790\u17d2\u1784\u17c3",dd:"%d \u1790\u17d2\u1784\u17c3",M:"\u1798\u17bd\u1799\u1781\u17c2",MM:"%d \u1781\u17c2",y:"\u1798\u17bd\u1799\u1786\u17d2\u1793\u17b6\u17c6",yy:"%d \u1786\u17d2\u1793\u17b6\u17c6"},dayOfMonthOrdinalParse:/\u1791\u17b8\d{1,2}/,ordinal:"\u1791\u17b8%d",preparse:function(e){return e.replace(/[\u17e1\u17e2\u17e3\u17e4\u17e5\u17e6\u17e7\u17e8\u17e9\u17e0]/g,function(e){return Fs[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return Es[e]})},week:{dow:1,doy:4}}),{1:"\u0ce7",2:"\u0ce8",3:"\u0ce9",4:"\u0cea",5:"\u0ceb",6:"\u0cec",7:"\u0ced",8:"\u0cee",9:"\u0cef",0:"\u0ce6"}),Ns={"\u0ce7":"1","\u0ce8":"2","\u0ce9":"3","\u0cea":"4","\u0ceb":"5","\u0cec":"6","\u0ced":"7","\u0cee":"8","\u0cef":"9","\u0ce6":"0"},Js=(M.defineLocale("kn",{months:"\u0c9c\u0ca8\u0cb5\u0cb0\u0cbf_\u0cab\u0cc6\u0cac\u0ccd\u0cb0\u0cb5\u0cb0\u0cbf_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5\u0cac\u0cb0\u0ccd_\u0ca8\u0cb5\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82\u0cac\u0cb0\u0ccd".split("_"),monthsShort:"\u0c9c\u0ca8_\u0cab\u0cc6\u0cac\u0ccd\u0cb0_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5_\u0ca8\u0cb5\u0cc6\u0c82_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82".split("_"),monthsParseExact:!0,weekdays:"\u0cad\u0cbe\u0ca8\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae\u0cb5\u0cbe\u0cb0_\u0cae\u0c82\u0c97\u0cb3\u0cb5\u0cbe\u0cb0_\u0cac\u0cc1\u0ca7\u0cb5\u0cbe\u0cb0_\u0c97\u0cc1\u0cb0\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0\u0cb5\u0cbe\u0cb0_\u0cb6\u0ca8\u0cbf\u0cb5\u0cbe\u0cb0".split("_"),weekdaysShort:"\u0cad\u0cbe\u0ca8\u0cc1_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae_\u0cae\u0c82\u0c97\u0cb3_\u0cac\u0cc1\u0ca7_\u0c97\u0cc1\u0cb0\u0cc1_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0_\u0cb6\u0ca8\u0cbf".split("_"),weekdaysMin:"\u0cad\u0cbe_\u0cb8\u0cc6\u0cc2\u0cd5_\u0cae\u0c82_\u0cac\u0cc1_\u0c97\u0cc1_\u0cb6\u0cc1_\u0cb6".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c87\u0c82\u0ca6\u0cc1] LT",nextDay:"[\u0ca8\u0cbe\u0cb3\u0cc6] LT",nextWeek:"dddd, LT",lastDay:"[\u0ca8\u0cbf\u0ca8\u0ccd\u0ca8\u0cc6] LT",lastWeek:"[\u0c95\u0cc6\u0cc2\u0ca8\u0cc6\u0caf] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0ca8\u0c82\u0ca4\u0cb0",past:"%s \u0cb9\u0cbf\u0c82\u0ca6\u0cc6",s:"\u0c95\u0cc6\u0cb2\u0cb5\u0cc1 \u0c95\u0ccd\u0cb7\u0ca3\u0c97\u0cb3\u0cc1",ss:"%d \u0cb8\u0cc6\u0c95\u0cc6\u0c82\u0ca1\u0cc1\u0c97\u0cb3\u0cc1",m:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",mm:"%d \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",h:"\u0c92\u0c82\u0ca6\u0cc1 \u0c97\u0c82\u0c9f\u0cc6",hh:"%d \u0c97\u0c82\u0c9f\u0cc6",d:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca6\u0cbf\u0ca8",dd:"%d \u0ca6\u0cbf\u0ca8",M:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",MM:"%d \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",y:"\u0c92\u0c82\u0ca6\u0cc1 \u0cb5\u0cb0\u0ccd\u0cb7",yy:"%d \u0cb5\u0cb0\u0ccd\u0cb7"},preparse:function(e){return e.replace(/[\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0ce6]/g,function(e){return Ns[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return zs[e]})},meridiemParse:/\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf|\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6|\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8|\u0cb8\u0c82\u0c9c\u0cc6/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"===a?e<4?e:e+12:"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6"===a?e:"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8"===a?10<=e?e:e+12:"\u0cb8\u0c82\u0c9c\u0cc6"===a?e+12:void 0},meridiem:function(e,a,t){return e<4?"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf":e<10?"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6":e<17?"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8":e<20?"\u0cb8\u0c82\u0c9c\u0cc6":"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"},dayOfMonthOrdinalParse:/\d{1,2}(\u0ca8\u0cc6\u0cd5)/,ordinal:function(e){return e+"\u0ca8\u0cc6\u0cd5"},week:{dow:0,doy:6}}),M.defineLocale("ko",{months:"1\uc6d4_2\uc6d4_3\uc6d4_4\uc6d4_5\uc6d4_6\uc6d4_7\uc6d4_8\uc6d4_9\uc6d4_10\uc6d4_11\uc6d4_12\uc6d4".split("_"),monthsShort:"1\uc6d4_2\uc6d4_3\uc6d4_4\uc6d4_5\uc6d4_6\uc6d4_7\uc6d4_8\uc6d4_9\uc6d4_10\uc6d4_11\uc6d4_12\uc6d4".split("_"),weekdays:"\uc77c\uc694\uc77c_\uc6d4\uc694\uc77c_\ud654\uc694\uc77c_\uc218\uc694\uc77c_\ubaa9\uc694\uc77c_\uae08\uc694\uc77c_\ud1a0\uc694\uc77c".split("_"),weekdaysShort:"\uc77c_\uc6d4_\ud654_\uc218_\ubaa9_\uae08_\ud1a0".split("_"),weekdaysMin:"\uc77c_\uc6d4_\ud654_\uc218_\ubaa9_\uae08_\ud1a0".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY\ub144 MMMM D\uc77c",LLL:"YYYY\ub144 MMMM D\uc77c A h:mm",LLLL:"YYYY\ub144 MMMM D\uc77c dddd A h:mm",l:"YYYY.MM.DD.",ll:"YYYY\ub144 MMMM D\uc77c",lll:"YYYY\ub144 MMMM D\uc77c A h:mm",llll:"YYYY\ub144 MMMM D\uc77c dddd A h:mm"},calendar:{sameDay:"\uc624\ub298 LT",nextDay:"\ub0b4\uc77c LT",nextWeek:"dddd LT",lastDay:"\uc5b4\uc81c LT",lastWeek:"\uc9c0\ub09c\uc8fc dddd LT",sameElse:"L"},relativeTime:{future:"%s \ud6c4",past:"%s \uc804",s:"\uba87 \ucd08",ss:"%d\ucd08",m:"1\ubd84",mm:"%d\ubd84",h:"\ud55c \uc2dc\uac04",hh:"%d\uc2dc\uac04",d:"\ud558\ub8e8",dd:"%d\uc77c",M:"\ud55c \ub2ec",MM:"%d\ub2ec",y:"\uc77c \ub144",yy:"%d\ub144"},dayOfMonthOrdinalParse:/\d{1,2}(\uc77c|\uc6d4|\uc8fc)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"\uc77c";case"M":return e+"\uc6d4";case"w":case"W":return e+"\uc8fc";default:return e}},meridiemParse:/\uc624\uc804|\uc624\ud6c4/,isPM:function(e){return"\uc624\ud6c4"===e},meridiem:function(e,a,t){return e<12?"\uc624\uc804":"\uc624\ud6c4"}}),{1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"}),Rs={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},ta=["\u06a9\u0627\u0646\u0648\u0646\u06cc \u062f\u0648\u0648\u06d5\u0645","\u0634\u0648\u0628\u0627\u062a","\u0626\u0627\u0632\u0627\u0631","\u0646\u06cc\u0633\u0627\u0646","\u0626\u0627\u06cc\u0627\u0631","\u062d\u0648\u0632\u06d5\u06cc\u0631\u0627\u0646","\u062a\u06d5\u0645\u0645\u0648\u0632","\u0626\u0627\u0628","\u0626\u06d5\u06cc\u0644\u0648\u0648\u0644","\u062a\u0634\u0631\u06cc\u0646\u06cc \u06cc\u06d5\u0643\u06d5\u0645","\u062a\u0634\u0631\u06cc\u0646\u06cc \u062f\u0648\u0648\u06d5\u0645","\u0643\u0627\u0646\u0648\u0646\u06cc \u06cc\u06d5\u06a9\u06d5\u0645"],Cs=(M.defineLocale("ku",{months:ta,monthsShort:ta,weekdays:"\u06cc\u0647\u200c\u0643\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u062f\u0648\u0648\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u0633\u06ce\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u0686\u0648\u0627\u0631\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u067e\u06ce\u0646\u062c\u0634\u0647\u200c\u0645\u0645\u0647\u200c_\u0647\u0647\u200c\u06cc\u0646\u06cc_\u0634\u0647\u200c\u0645\u0645\u0647\u200c".split("_"),weekdaysShort:"\u06cc\u0647\u200c\u0643\u0634\u0647\u200c\u0645_\u062f\u0648\u0648\u0634\u0647\u200c\u0645_\u0633\u06ce\u0634\u0647\u200c\u0645_\u0686\u0648\u0627\u0631\u0634\u0647\u200c\u0645_\u067e\u06ce\u0646\u062c\u0634\u0647\u200c\u0645_\u0647\u0647\u200c\u06cc\u0646\u06cc_\u0634\u0647\u200c\u0645\u0645\u0647\u200c".split("_"),weekdaysMin:"\u06cc_\u062f_\u0633_\u0686_\u067e_\u0647_\u0634".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u0626\u06ce\u0648\u0627\u0631\u0647\u200c|\u0628\u0647\u200c\u06cc\u0627\u0646\u06cc/,isPM:function(e){return/\u0626\u06ce\u0648\u0627\u0631\u0647\u200c/.test(e)},meridiem:function(e,a,t){return e<12?"\u0628\u0647\u200c\u06cc\u0627\u0646\u06cc":"\u0626\u06ce\u0648\u0627\u0631\u0647\u200c"},calendar:{sameDay:"[\u0626\u0647\u200c\u0645\u0631\u06c6 \u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",nextDay:"[\u0628\u0647\u200c\u06cc\u0627\u0646\u06cc \u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",nextWeek:"dddd [\u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",lastDay:"[\u062f\u0648\u06ce\u0646\u06ce \u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",lastWeek:"dddd [\u0643\u0627\u062a\u0698\u0645\u06ce\u0631] LT",sameElse:"L"},relativeTime:{future:"\u0644\u0647\u200c %s",past:"%s",s:"\u0686\u0647\u200c\u0646\u062f \u0686\u0631\u0643\u0647\u200c\u06cc\u0647\u200c\u0643",ss:"\u0686\u0631\u0643\u0647\u200c %d",m:"\u06cc\u0647\u200c\u0643 \u062e\u0648\u0644\u0647\u200c\u0643",mm:"%d \u062e\u0648\u0644\u0647\u200c\u0643",h:"\u06cc\u0647\u200c\u0643 \u0643\u0627\u062a\u0698\u0645\u06ce\u0631",hh:"%d \u0643\u0627\u062a\u0698\u0645\u06ce\u0631",d:"\u06cc\u0647\u200c\u0643 \u0695\u06c6\u0698",dd:"%d \u0695\u06c6\u0698",M:"\u06cc\u0647\u200c\u0643 \u0645\u0627\u0646\u06af",MM:"%d \u0645\u0627\u0646\u06af",y:"\u06cc\u0647\u200c\u0643 \u0633\u0627\u06b5",yy:"%d \u0633\u0627\u06b5"},preparse:function(e){return e.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(e){return Rs[e]}).replace(/\u060c/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return Js[e]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}}),{0:"-\u0447\u04af",1:"-\u0447\u0438",2:"-\u0447\u0438",3:"-\u0447\u04af",4:"-\u0447\u04af",5:"-\u0447\u0438",6:"-\u0447\u044b",7:"-\u0447\u0438",8:"-\u0447\u0438",9:"-\u0447\u0443",10:"-\u0447\u0443",20:"-\u0447\u044b",30:"-\u0447\u0443",40:"-\u0447\u044b",50:"-\u0447\u04af",60:"-\u0447\u044b",70:"-\u0447\u0438",80:"-\u0447\u0438",90:"-\u0447\u0443",100:"-\u0447\u04af"});function Is(e,a,t,s){var n={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return a?n[t][0]:n[t][1]}function Us(e){if(e=parseInt(e,10),isNaN(e))return!1;if(e<0)return!0;if(e<10)return 4<=e&&e<=7;var a;if(e<100)return Us(0==(a=e%10)?e/10:a);if(e<1e4){for(;10<=e;)e/=10;return Us(e)}return Us(e/=1e3)}M.defineLocale("ky",{months:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u0416\u0435\u043a\u0448\u0435\u043c\u0431\u0438_\u0414\u04af\u0439\u0448\u04e9\u043c\u0431\u04af_\u0428\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0428\u0430\u0440\u0448\u0435\u043c\u0431\u0438_\u0411\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0416\u0443\u043c\u0430_\u0418\u0448\u0435\u043c\u0431\u0438".split("_"),weekdaysShort:"\u0416\u0435\u043a_\u0414\u04af\u0439_\u0428\u0435\u0439_\u0428\u0430\u0440_\u0411\u0435\u0439_\u0416\u0443\u043c_\u0418\u0448\u0435".split("_"),weekdaysMin:"\u0416\u043a_\u0414\u0439_\u0428\u0439_\u0428\u0440_\u0411\u0439_\u0416\u043c_\u0418\u0448".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u04af\u043d \u0441\u0430\u0430\u0442] LT",nextDay:"[\u042d\u0440\u0442\u0435\u04a3 \u0441\u0430\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0447\u044d\u044d \u0441\u0430\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u04e9\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u043d] dddd [\u043a\u04af\u043d\u04af] [\u0441\u0430\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0438\u0447\u0438\u043d\u0434\u0435",past:"%s \u043c\u0443\u0440\u0443\u043d",s:"\u0431\u0438\u0440\u043d\u0435\u0447\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0438\u0440 \u043c\u04af\u043d\u04e9\u0442",mm:"%d \u043c\u04af\u043d\u04e9\u0442",h:"\u0431\u0438\u0440 \u0441\u0430\u0430\u0442",hh:"%d \u0441\u0430\u0430\u0442",d:"\u0431\u0438\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0438\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0438\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0447\u0438|\u0447\u044b|\u0447\u04af|\u0447\u0443)/,ordinal:function(e){return e+(Cs[e]||Cs[e%10]||Cs[100<=e?100:null])},week:{dow:1,doy:7}}),M.defineLocale("lb",{months:"Januar_Februar_M\xe4erz_Abr\xebll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_M\xe9indeg_D\xebnschdeg_M\xebttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._M\xe9._D\xeb._M\xeb._Do._Fr._Sa.".split("_"),weekdaysMin:"So_M\xe9_D\xeb_M\xeb_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[G\xebschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:function(e){return Us(e.substr(0,e.indexOf(" ")))?"a "+e:"an "+e},past:function(e){return Us(e.substr(0,e.indexOf(" ")))?"viru "+e:"virun "+e},s:"e puer Sekonnen",ss:"%d Sekonnen",m:Is,mm:"%d Minutten",h:Is,hh:"%d Stonnen",d:Is,dd:"%d Deeg",M:Is,MM:"%d M\xe9int",y:Is,yy:"%d Joer"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("lo",{months:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),monthsShort:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),weekdays:"\u0ead\u0eb2\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysShort:"\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysMin:"\u0e97_\u0e88_\u0ead\u0e84_\u0e9e_\u0e9e\u0eab_\u0eaa\u0e81_\u0eaa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"\u0ea7\u0eb1\u0e99dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2|\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87/,isPM:function(e){return"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"===e},meridiem:function(e,a,t){return e<12?"\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2":"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"},calendar:{sameDay:"[\u0ea1\u0eb7\u0ec9\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextDay:"[\u0ea1\u0eb7\u0ec9\u0ead\u0eb7\u0ec8\u0e99\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0edc\u0ec9\u0eb2\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastDay:"[\u0ea1\u0eb7\u0ec9\u0ea7\u0eb2\u0e99\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0ec1\u0ea5\u0ec9\u0ea7\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",sameElse:"L"},relativeTime:{future:"\u0ead\u0eb5\u0e81 %s",past:"%s\u0e9c\u0ec8\u0eb2\u0e99\u0ea1\u0eb2",s:"\u0e9a\u0ecd\u0ec8\u0ec0\u0e97\u0ebb\u0ec8\u0eb2\u0ec3\u0e94\u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",ss:"%d \u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",m:"1 \u0e99\u0eb2\u0e97\u0eb5",mm:"%d \u0e99\u0eb2\u0e97\u0eb5",h:"1 \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",hh:"%d \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",d:"1 \u0ea1\u0eb7\u0ec9",dd:"%d \u0ea1\u0eb7\u0ec9",M:"1 \u0ec0\u0e94\u0eb7\u0ead\u0e99",MM:"%d \u0ec0\u0e94\u0eb7\u0ead\u0e99",y:"1 \u0e9b\u0eb5",yy:"%d \u0e9b\u0eb5"},dayOfMonthOrdinalParse:/(\u0e97\u0eb5\u0ec8)\d{1,2}/,ordinal:function(e){return"\u0e97\u0eb5\u0ec8"+e}});var Gs={ss:"sekund\u0117_sekund\u017ei\u0173_sekundes",m:"minut\u0117_minut\u0117s_minut\u0119",mm:"minut\u0117s_minu\u010di\u0173_minutes",h:"valanda_valandos_valand\u0105",hh:"valandos_valand\u0173_valandas",d:"diena_dienos_dien\u0105",dd:"dienos_dien\u0173_dienas",M:"m\u0117nuo_m\u0117nesio_m\u0117nes\u012f",MM:"m\u0117nesiai_m\u0117nesi\u0173_m\u0117nesius",y:"metai_met\u0173_metus",yy:"metai_met\u0173_metus"};function Vs(e,a,t,s){return a?Ks(t)[0]:s?Ks(t)[1]:Ks(t)[2]}function Bs(e){return e%10==0||10<e&&e<20}function Ks(e){return Gs[e].split("_")}function qs(e,a,t,s){var n=e+" ";return 1===e?n+Vs(0,a,t[0],s):a?n+(Bs(e)?Ks(t)[1]:Ks(t)[0]):s?n+Ks(t)[1]:n+(Bs(e)?Ks(t)[1]:Ks(t)[2])}M.defineLocale("lt",{months:{format:"sausio_vasario_kovo_baland\u017eio_gegu\u017e\u0117s_bir\u017eelio_liepos_rugpj\u016b\u010dio_rugs\u0117jo_spalio_lapkri\u010dio_gruod\u017eio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegu\u017e\u0117_bir\u017eelis_liepa_rugpj\u016btis_rugs\u0117jis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadien\u012f_pirmadien\u012f_antradien\u012f_tre\u010diadien\u012f_ketvirtadien\u012f_penktadien\u012f_\u0161e\u0161tadien\u012f".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_tre\u010diadienis_ketvirtadienis_penktadienis_\u0161e\u0161tadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_\u0160e\u0161".split("_"),weekdaysMin:"S_P_A_T_K_Pn_\u0160".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[\u0160iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Pra\u0117jus\u012f] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prie\u0161 %s",s:function(e,a,t,s){return a?"kelios sekund\u0117s":s?"keli\u0173 sekund\u017ei\u0173":"kelias sekundes"},ss:qs,m:Vs,mm:qs,h:Vs,hh:qs,d:Vs,dd:qs,M:Vs,MM:qs,y:Vs,yy:qs},dayOfMonthOrdinalParse:/\d{1,2}-oji/,ordinal:function(e){return e+"-oji"},week:{dow:1,doy:4}});var Zs={ss:"sekundes_sekund\u0113m_sekunde_sekundes".split("_"),m:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),mm:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),h:"stundas_stund\u0101m_stunda_stundas".split("_"),hh:"stundas_stund\u0101m_stunda_stundas".split("_"),d:"dienas_dien\u0101m_diena_dienas".split("_"),dd:"dienas_dien\u0101m_diena_dienas".split("_"),M:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),MM:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")};function $s(e,a,t){return t?a%10==1&&a%100!=11?e[2]:e[3]:a%10==1&&a%100!=11?e[0]:e[1]}function Qs(e,a,t){return e+" "+$s(Zs[t],e,a)}function Xs(e,a,t){return $s(Zs[t],e,a)}M.defineLocale("lv",{months:"janv\u0101ris_febru\u0101ris_marts_apr\u012blis_maijs_j\u016bnijs_j\u016blijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_j\u016bn_j\u016bl_aug_sep_okt_nov_dec".split("_"),weekdays:"sv\u0113tdiena_pirmdiena_otrdiena_tre\u0161diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[\u0160odien pulksten] LT",nextDay:"[R\u012bt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pag\u0101ju\u0161\u0101] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"p\u0113c %s",past:"pirms %s",s:function(e,a){return a?"da\u017eas sekundes":"da\u017e\u0101m sekund\u0113m"},ss:Qs,m:Xs,mm:Qs,h:Xs,hh:Qs,d:Xs,dd:Qs,M:Xs,MM:Qs,y:Xs,yy:Qs},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});var en={words:{ss:["sekund","sekunda","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mjesec","mjeseca","mjeseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(e,a){return 1===e?a[0]:2<=e&&e<=4?a[1]:a[2]},translate:function(e,a,t){var s=en.words[t];return 1===t.length?a?s[0]:s[1]:e+" "+en.correctGrammaticalCase(e,s)}};function an(e,a,t,s){switch(t){case"s":return a?"\u0445\u044d\u0434\u0445\u044d\u043d \u0441\u0435\u043a\u0443\u043d\u0434":"\u0445\u044d\u0434\u0445\u044d\u043d \u0441\u0435\u043a\u0443\u043d\u0434\u044b\u043d";case"ss":return e+(a?" \u0441\u0435\u043a\u0443\u043d\u0434":" \u0441\u0435\u043a\u0443\u043d\u0434\u044b\u043d");case"m":case"mm":return e+(a?" \u043c\u0438\u043d\u0443\u0442":" \u043c\u0438\u043d\u0443\u0442\u044b\u043d");case"h":case"hh":return e+(a?" \u0446\u0430\u0433":" \u0446\u0430\u0433\u0438\u0439\u043d");case"d":case"dd":return e+(a?" \u04e9\u0434\u04e9\u0440":" \u04e9\u0434\u0440\u0438\u0439\u043d");case"M":case"MM":return e+(a?" \u0441\u0430\u0440":" \u0441\u0430\u0440\u044b\u043d");case"y":case"yy":return e+(a?" \u0436\u0438\u043b":" \u0436\u0438\u043b\u0438\u0439\u043d");default:return e}}M.defineLocale("me",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sjutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedjelje] [u] LT","[pro\u0161log] [ponedjeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srijede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"nekoliko sekundi",ss:en.translate,m:en.translate,mm:en.translate,h:en.translate,hh:en.translate,d:"dan",dd:en.translate,M:"mjesec",MM:en.translate,y:"godinu",yy:en.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}}),M.defineLocale("mi",{months:"Kohi-t\u0101te_Hui-tanguru_Pout\u016b-te-rangi_Paenga-wh\u0101wh\u0101_Haratua_Pipiri_H\u014dngoingoi_Here-turi-k\u014dk\u0101_Mahuru_Whiringa-\u0101-nuku_Whiringa-\u0101-rangi_Hakihea".split("_"),monthsShort:"Kohi_Hui_Pou_Pae_Hara_Pipi_H\u014dngoi_Here_Mahu_Whi-nu_Whi-ra_Haki".split("_"),monthsRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,weekdays:"R\u0101tapu_Mane_T\u016brei_Wenerei_T\u0101ite_Paraire_H\u0101tarei".split("_"),weekdaysShort:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),weekdaysMin:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [i] HH:mm",LLLL:"dddd, D MMMM YYYY [i] HH:mm"},calendar:{sameDay:"[i teie mahana, i] LT",nextDay:"[apopo i] LT",nextWeek:"dddd [i] LT",lastDay:"[inanahi i] LT",lastWeek:"dddd [whakamutunga i] LT",sameElse:"L"},relativeTime:{future:"i roto i %s",past:"%s i mua",s:"te h\u0113kona ruarua",ss:"%d h\u0113kona",m:"he meneti",mm:"%d meneti",h:"te haora",hh:"%d haora",d:"he ra",dd:"%d ra",M:"he marama",MM:"%d marama",y:"he tau",yy:"%d tau"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}}),M.defineLocale("mk",{months:"\u0458\u0430\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d\u0438_\u0458\u0443\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u0458\u0430\u043d_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u043e\u043a_\u043f\u0435\u0442\u043e\u043a_\u0441\u0430\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u0435_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u0430\u0431".split("_"),weekdaysMin:"\u043de_\u043fo_\u0432\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441a".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u0435\u043d\u0435\u0441 \u0432\u043e] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432\u043e] LT",nextWeek:"[\u0412\u043e] dddd [\u0432\u043e] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432\u043e] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0430\u0442\u0430] dddd [\u0432\u043e] LT";case 1:case 2:case 4:case 5:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0438\u043e\u0442] dddd [\u0432\u043e] LT"}},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"\u043f\u0440\u0435\u0434 %s",s:"\u043d\u0435\u043a\u043e\u043b\u043a\u0443 \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u0435\u0434\u043d\u0430 \u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0435\u0434\u0435\u043d \u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0435\u0434\u0435\u043d \u0434\u0435\u043d",dd:"%d \u0434\u0435\u043d\u0430",M:"\u0435\u0434\u0435\u043d \u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0438",y:"\u0435\u0434\u043d\u0430 \u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(e){var a=e%10,t=e%100;return 0===e?e+"-\u0435\u0432":0==t?e+"-\u0435\u043d":10<t&&t<20?e+"-\u0442\u0438":1==a?e+"-\u0432\u0438":2==a?e+"-\u0440\u0438":7==a||8==a?e+"-\u043c\u0438":e+"-\u0442\u0438"},week:{dow:1,doy:7}}),M.defineLocale("ml",{months:"\u0d1c\u0d28\u0d41\u0d35\u0d30\u0d3f_\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41\u0d35\u0d30\u0d3f_\u0d2e\u0d3e\u0d7c\u0d1a\u0d4d\u0d1a\u0d4d_\u0d0f\u0d2a\u0d4d\u0d30\u0d3f\u0d7d_\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48_\u0d13\u0d17\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4d_\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31\u0d02\u0d2c\u0d7c_\u0d12\u0d15\u0d4d\u0d1f\u0d4b\u0d2c\u0d7c_\u0d28\u0d35\u0d02\u0d2c\u0d7c_\u0d21\u0d3f\u0d38\u0d02\u0d2c\u0d7c".split("_"),monthsShort:"\u0d1c\u0d28\u0d41._\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41._\u0d2e\u0d3e\u0d7c._\u0d0f\u0d2a\u0d4d\u0d30\u0d3f._\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48._\u0d13\u0d17._\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31._\u0d12\u0d15\u0d4d\u0d1f\u0d4b._\u0d28\u0d35\u0d02._\u0d21\u0d3f\u0d38\u0d02.".split("_"),monthsParseExact:!0,weekdays:"\u0d1e\u0d3e\u0d2f\u0d31\u0d3e\u0d34\u0d4d\u0d1a_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d33\u0d3e\u0d34\u0d4d\u0d1a_\u0d1a\u0d4a\u0d35\u0d4d\u0d35\u0d3e\u0d34\u0d4d\u0d1a_\u0d2c\u0d41\u0d27\u0d28\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a_\u0d36\u0d28\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a".split("_"),weekdaysShort:"\u0d1e\u0d3e\u0d2f\u0d7c_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d7e_\u0d1a\u0d4a\u0d35\u0d4d\u0d35_\u0d2c\u0d41\u0d27\u0d7b_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d02_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f_\u0d36\u0d28\u0d3f".split("_"),weekdaysMin:"\u0d1e\u0d3e_\u0d24\u0d3f_\u0d1a\u0d4a_\u0d2c\u0d41_\u0d35\u0d4d\u0d2f\u0d3e_\u0d35\u0d46_\u0d36".split("_"),longDateFormat:{LT:"A h:mm -\u0d28\u0d41",LTS:"A h:mm:ss -\u0d28\u0d41",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm -\u0d28\u0d41",LLLL:"dddd, D MMMM YYYY, A h:mm -\u0d28\u0d41"},calendar:{sameDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d4d] LT",nextDay:"[\u0d28\u0d3e\u0d33\u0d46] LT",nextWeek:"dddd, LT",lastDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d32\u0d46] LT",lastWeek:"[\u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d",past:"%s \u0d2e\u0d41\u0d7b\u0d2a\u0d4d",s:"\u0d05\u0d7d\u0d2a \u0d28\u0d3f\u0d2e\u0d3f\u0d37\u0d19\u0d4d\u0d19\u0d7e",ss:"%d \u0d38\u0d46\u0d15\u0d4d\u0d15\u0d7b\u0d21\u0d4d",m:"\u0d12\u0d30\u0d41 \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",mm:"%d \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",h:"\u0d12\u0d30\u0d41 \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",hh:"%d \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",d:"\u0d12\u0d30\u0d41 \u0d26\u0d3f\u0d35\u0d38\u0d02",dd:"%d \u0d26\u0d3f\u0d35\u0d38\u0d02",M:"\u0d12\u0d30\u0d41 \u0d2e\u0d3e\u0d38\u0d02",MM:"%d \u0d2e\u0d3e\u0d38\u0d02",y:"\u0d12\u0d30\u0d41 \u0d35\u0d7c\u0d37\u0d02",yy:"%d \u0d35\u0d7c\u0d37\u0d02"},meridiemParse:/\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f|\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46|\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d|\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02|\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f/i,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"===a&&4<=e||"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d"===a||"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02"===a?e+12:e},meridiem:function(e,a,t){return e<4?"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f":e<12?"\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46":e<17?"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d":e<20?"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02":"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"}}),M.defineLocale("mn",{months:"\u041d\u044d\u0433\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0425\u043e\u0451\u0440\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0413\u0443\u0440\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0414\u04e9\u0440\u04e9\u0432\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0422\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0417\u0443\u0440\u0433\u0430\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0414\u043e\u043b\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u041d\u0430\u0439\u043c\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0415\u0441\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0410\u0440\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0410\u0440\u0432\u0430\u043d \u043d\u044d\u0433\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0410\u0440\u0432\u0430\u043d \u0445\u043e\u0451\u0440\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440".split("_"),monthsShort:"1 \u0441\u0430\u0440_2 \u0441\u0430\u0440_3 \u0441\u0430\u0440_4 \u0441\u0430\u0440_5 \u0441\u0430\u0440_6 \u0441\u0430\u0440_7 \u0441\u0430\u0440_8 \u0441\u0430\u0440_9 \u0441\u0430\u0440_10 \u0441\u0430\u0440_11 \u0441\u0430\u0440_12 \u0441\u0430\u0440".split("_"),monthsParseExact:!0,weekdays:"\u041d\u044f\u043c_\u0414\u0430\u0432\u0430\u0430_\u041c\u044f\u0433\u043c\u0430\u0440_\u041b\u0445\u0430\u0433\u0432\u0430_\u041f\u04af\u0440\u044d\u0432_\u0411\u0430\u0430\u0441\u0430\u043d_\u0411\u044f\u043c\u0431\u0430".split("_"),weekdaysShort:"\u041d\u044f\u043c_\u0414\u0430\u0432_\u041c\u044f\u0433_\u041b\u0445\u0430_\u041f\u04af\u0440_\u0411\u0430\u0430_\u0411\u044f\u043c".split("_"),weekdaysMin:"\u041d\u044f_\u0414\u0430_\u041c\u044f_\u041b\u0445_\u041f\u04af_\u0411\u0430_\u0411\u044f".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY \u043e\u043d\u044b MMMM\u044b\u043d D",LLL:"YYYY \u043e\u043d\u044b MMMM\u044b\u043d D HH:mm",LLLL:"dddd, YYYY \u043e\u043d\u044b MMMM\u044b\u043d D HH:mm"},meridiemParse:/\u04ae\u04e8|\u04ae\u0425/i,isPM:function(e){return"\u04ae\u0425"===e},meridiem:function(e,a,t){return e<12?"\u04ae\u04e8":"\u04ae\u0425"},calendar:{sameDay:"[\u04e8\u043d\u04e9\u04e9\u0434\u04e9\u0440] LT",nextDay:"[\u041c\u0430\u0440\u0433\u0430\u0430\u0448] LT",nextWeek:"[\u0418\u0440\u044d\u0445] dddd LT",lastDay:"[\u04e8\u0447\u0438\u0433\u0434\u04e9\u0440] LT",lastWeek:"[\u04e8\u043d\u0433\u04e9\u0440\u0441\u04e9\u043d] dddd LT",sameElse:"L"},relativeTime:{future:"%s \u0434\u0430\u0440\u0430\u0430",past:"%s \u04e9\u043c\u043d\u04e9",s:an,ss:an,m:an,mm:an,h:an,hh:an,d:an,dd:an,M:an,MM:an,y:an,yy:an},dayOfMonthOrdinalParse:/\d{1,2} \u04e9\u0434\u04e9\u0440/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+" \u04e9\u0434\u04e9\u0440";default:return e}}});var tn={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},sn={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};function nn(e,a,t,s){var n="";if(a)switch(t){case"s":n="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926";break;case"ss":n="%d \u0938\u0947\u0915\u0902\u0926";break;case"m":n="\u090f\u0915 \u092e\u093f\u0928\u093f\u091f";break;case"mm":n="%d \u092e\u093f\u0928\u093f\u091f\u0947";break;case"h":n="\u090f\u0915 \u0924\u093e\u0938";break;case"hh":n="%d \u0924\u093e\u0938";break;case"d":n="\u090f\u0915 \u0926\u093f\u0935\u0938";break;case"dd":n="%d \u0926\u093f\u0935\u0938";break;case"M":n="\u090f\u0915 \u092e\u0939\u093f\u0928\u093e";break;case"MM":n="%d \u092e\u0939\u093f\u0928\u0947";break;case"y":n="\u090f\u0915 \u0935\u0930\u094d\u0937";break;case"yy":n="%d \u0935\u0930\u094d\u0937\u0947";break}else switch(t){case"s":n="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"ss":n="%d \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"m":n="\u090f\u0915\u093e \u092e\u093f\u0928\u093f\u091f\u093e";break;case"mm":n="%d \u092e\u093f\u0928\u093f\u091f\u093e\u0902";break;case"h":n="\u090f\u0915\u093e \u0924\u093e\u0938\u093e";break;case"hh":n="%d \u0924\u093e\u0938\u093e\u0902";break;case"d":n="\u090f\u0915\u093e \u0926\u093f\u0935\u0938\u093e";break;case"dd":n="%d \u0926\u093f\u0935\u0938\u093e\u0902";break;case"M":n="\u090f\u0915\u093e \u092e\u0939\u093f\u0928\u094d\u092f\u093e";break;case"MM":n="%d \u092e\u0939\u093f\u0928\u094d\u092f\u093e\u0902";break;case"y":n="\u090f\u0915\u093e \u0935\u0930\u094d\u0937\u093e";break;case"yy":n="%d \u0935\u0930\u094d\u0937\u093e\u0902";break}return n.replace(/%d/i,e)}M.defineLocale("mr",{months:"\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u090f\u092a\u094d\u0930\u093f\u0932_\u092e\u0947_\u091c\u0942\u0928_\u091c\u0941\u0932\u0948_\u0911\u0917\u0938\u094d\u091f_\u0938\u092a\u094d\u091f\u0947\u0902\u092c\u0930_\u0911\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930_\u0921\u093f\u0938\u0947\u0902\u092c\u0930".split("_"),monthsShort:"\u091c\u093e\u0928\u0947._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a._\u090f\u092a\u094d\u0930\u093f._\u092e\u0947._\u091c\u0942\u0928._\u091c\u0941\u0932\u0948._\u0911\u0917._\u0938\u092a\u094d\u091f\u0947\u0902._\u0911\u0915\u094d\u091f\u094b._\u0928\u094b\u0935\u094d\u0939\u0947\u0902._\u0921\u093f\u0938\u0947\u0902.".split("_"),monthsParseExact:!0,weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0933\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0933_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u0935\u093e\u091c\u0924\u093e",LTS:"A h:mm:ss \u0935\u093e\u091c\u0924\u093e",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e",LLLL:"dddd, D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0909\u0926\u094d\u092f\u093e] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u093e\u0932] LT",lastWeek:"[\u092e\u093e\u0917\u0940\u0932] dddd, LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u0927\u094d\u092f\u0947",past:"%s\u092a\u0942\u0930\u094d\u0935\u0940",s:nn,ss:nn,m:nn,mm:nn,h:nn,hh:nn,d:nn,dd:nn,M:nn,MM:nn,y:nn,yy:nn},preparse:function(e){return e.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(e){return sn[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return tn[e]})},meridiemParse:/\u092a\u0939\u093e\u091f\u0947|\u0938\u0915\u093e\u0933\u0940|\u0926\u0941\u092a\u093e\u0930\u0940|\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940|\u0930\u093e\u0924\u094d\u0930\u0940/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u092a\u0939\u093e\u091f\u0947"===a||"\u0938\u0915\u093e\u0933\u0940"===a?e:"\u0926\u0941\u092a\u093e\u0930\u0940"===a||"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940"===a||"\u0930\u093e\u0924\u094d\u0930\u0940"===a?12<=e?e:e+12:void 0},meridiem:function(e,a,t){return 0<=e&&e<6?"\u092a\u0939\u093e\u091f\u0947":e<12?"\u0938\u0915\u093e\u0933\u0940":e<17?"\u0926\u0941\u092a\u093e\u0930\u0940":e<20?"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940":"\u0930\u093e\u0924\u094d\u0930\u0940"},week:{dow:0,doy:6}}),M.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(e,a){return 12===e&&(e=0),"pagi"===a?e:"tengahari"===a?11<=e?e:e+12:"petang"===a||"malam"===a?e+12:void 0},meridiem:function(e,a,t){return e<11?"pagi":e<15?"tengahari":e<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}}),M.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(e,a){return 12===e&&(e=0),"pagi"===a?e:"tengahari"===a?11<=e?e:e+12:"petang"===a||"malam"===a?e+12:void 0},meridiem:function(e,a,t){return e<11?"pagi":e<15?"tengahari":e<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}}),M.defineLocale("mt",{months:"Jannar_Frar_Marzu_April_Mejju_\u0120unju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Di\u010bembru".split("_"),monthsShort:"Jan_Fra_Mar_Apr_Mej_\u0120un_Lul_Aww_Set_Ott_Nov_Di\u010b".split("_"),weekdays:"Il-\u0126add_It-Tnejn_It-Tlieta_L-Erbg\u0127a_Il-\u0126amis_Il-\u0120img\u0127a_Is-Sibt".split("_"),weekdaysShort:"\u0126ad_Tne_Tli_Erb_\u0126am_\u0120im_Sib".split("_"),weekdaysMin:"\u0126a_Tn_Tl_Er_\u0126a_\u0120i_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Illum fil-]LT",nextDay:"[G\u0127ada fil-]LT",nextWeek:"dddd [fil-]LT",lastDay:"[Il-biera\u0127 fil-]LT",lastWeek:"dddd [li g\u0127adda] [fil-]LT",sameElse:"L"},relativeTime:{future:"f\u2019 %s",past:"%s ilu",s:"ftit sekondi",ss:"%d sekondi",m:"minuta",mm:"%d minuti",h:"sieg\u0127a",hh:"%d sieg\u0127at",d:"\u0121urnata",dd:"%d \u0121ranet",M:"xahar",MM:"%d xhur",y:"sena",yy:"%d sni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}});var rn={1:"\u1041",2:"\u1042",3:"\u1043",4:"\u1044",5:"\u1045",6:"\u1046",7:"\u1047",8:"\u1048",9:"\u1049",0:"\u1040"},dn={"\u1041":"1","\u1042":"2","\u1043":"3","\u1044":"4","\u1045":"5","\u1046":"6","\u1047":"7","\u1048":"8","\u1049":"9","\u1040":"0"},_n=(M.defineLocale("my",{months:"\u1007\u1014\u103a\u1014\u101d\u102b\u101b\u102e_\u1016\u1031\u1016\u1031\u102c\u103a\u101d\u102b\u101b\u102e_\u1019\u1010\u103a_\u1027\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u1007\u1030\u101c\u102d\u102f\u1004\u103a_\u101e\u103c\u1002\u102f\u1010\u103a_\u1005\u1000\u103a\u1010\u1004\u103a\u1018\u102c_\u1021\u1031\u102c\u1000\u103a\u1010\u102d\u102f\u1018\u102c_\u1014\u102d\u102f\u101d\u1004\u103a\u1018\u102c_\u1012\u102e\u1007\u1004\u103a\u1018\u102c".split("_"),monthsShort:"\u1007\u1014\u103a_\u1016\u1031_\u1019\u1010\u103a_\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u101c\u102d\u102f\u1004\u103a_\u101e\u103c_\u1005\u1000\u103a_\u1021\u1031\u102c\u1000\u103a_\u1014\u102d\u102f_\u1012\u102e".split("_"),weekdays:"\u1010\u1014\u1004\u103a\u1039\u1002\u1014\u103d\u1031_\u1010\u1014\u1004\u103a\u1039\u101c\u102c_\u1021\u1004\u103a\u1039\u1002\u102b_\u1017\u102f\u1012\u1039\u1013\u101f\u1030\u1038_\u1000\u103c\u102c\u101e\u1015\u1010\u1031\u1038_\u101e\u1031\u102c\u1000\u103c\u102c_\u1005\u1014\u1031".split("_"),weekdaysShort:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),weekdaysMin:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u101a\u1014\u1031.] LT [\u1019\u103e\u102c]",nextDay:"[\u1019\u1014\u1000\u103a\u1016\u103c\u1014\u103a] LT [\u1019\u103e\u102c]",nextWeek:"dddd LT [\u1019\u103e\u102c]",lastDay:"[\u1019\u1014\u1031.\u1000] LT [\u1019\u103e\u102c]",lastWeek:"[\u1015\u103c\u102e\u1038\u1001\u1032\u1037\u101e\u1031\u102c] dddd LT [\u1019\u103e\u102c]",sameElse:"L"},relativeTime:{future:"\u101c\u102c\u1019\u100a\u103a\u1037 %s \u1019\u103e\u102c",past:"\u101c\u103d\u1014\u103a\u1001\u1032\u1037\u101e\u1031\u102c %s \u1000",s:"\u1005\u1000\u1039\u1000\u1014\u103a.\u1021\u1014\u100a\u103a\u1038\u1004\u101a\u103a",ss:"%d \u1005\u1000\u1039\u1000\u1014\u1037\u103a",m:"\u1010\u1005\u103a\u1019\u102d\u1014\u1005\u103a",mm:"%d \u1019\u102d\u1014\u1005\u103a",h:"\u1010\u1005\u103a\u1014\u102c\u101b\u102e",hh:"%d \u1014\u102c\u101b\u102e",d:"\u1010\u1005\u103a\u101b\u1000\u103a",dd:"%d \u101b\u1000\u103a",M:"\u1010\u1005\u103a\u101c",MM:"%d \u101c",y:"\u1010\u1005\u103a\u1014\u103e\u1005\u103a",yy:"%d \u1014\u103e\u1005\u103a"},preparse:function(e){return e.replace(/[\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u1040]/g,function(e){return dn[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return rn[e]})},week:{dow:1,doy:4}}),M.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"s\xf8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xf8rdag".split("_"),weekdaysShort:"s\xf8._ma._ti._on._to._fr._l\xf8.".split("_"),weekdaysMin:"s\xf8_ma_ti_on_to_fr_l\xf8".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i g\xe5r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",ss:"%d sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",w:"en uke",ww:"%d uker",M:"en m\xe5ned",MM:"%d m\xe5neder",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),{1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"}),on={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"},mn=(M.defineLocale("ne",{months:"\u091c\u0928\u0935\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f\u0932_\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0937\u094d\u091f_\u0938\u0947\u092a\u094d\u091f\u0947\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u092d\u0947\u092e\u094d\u092c\u0930_\u0921\u093f\u0938\u0947\u092e\u094d\u092c\u0930".split("_"),monthsShort:"\u091c\u0928._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f._\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908._\u0905\u0917._\u0938\u0947\u092a\u094d\u091f._\u0905\u0915\u094d\u091f\u094b._\u0928\u094b\u092d\u0947._\u0921\u093f\u0938\u0947.".split("_"),monthsParseExact:!0,weekdays:"\u0906\u0907\u0924\u092c\u093e\u0930_\u0938\u094b\u092e\u092c\u093e\u0930_\u092e\u0919\u094d\u0917\u0932\u092c\u093e\u0930_\u092c\u0941\u0927\u092c\u093e\u0930_\u092c\u093f\u0939\u093f\u092c\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u092c\u093e\u0930_\u0936\u0928\u093f\u092c\u093e\u0930".split("_"),weekdaysShort:"\u0906\u0907\u0924._\u0938\u094b\u092e._\u092e\u0919\u094d\u0917\u0932._\u092c\u0941\u0927._\u092c\u093f\u0939\u093f._\u0936\u0941\u0915\u094d\u0930._\u0936\u0928\u093f.".split("_"),weekdaysMin:"\u0906._\u0938\u094b._\u092e\u0902._\u092c\u0941._\u092c\u093f._\u0936\u0941._\u0936.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A\u0915\u094b h:mm \u092c\u091c\u0947",LTS:"A\u0915\u094b h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947"},preparse:function(e){return e.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(e){return on[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return _n[e]})},meridiemParse:/\u0930\u093e\u0924\u093f|\u092c\u093f\u0939\u093e\u0928|\u0926\u093f\u0909\u0901\u0938\u094b|\u0938\u093e\u0901\u091d/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0930\u093e\u0924\u093f"===a?e<4?e:e+12:"\u092c\u093f\u0939\u093e\u0928"===a?e:"\u0926\u093f\u0909\u0901\u0938\u094b"===a?10<=e?e:e+12:"\u0938\u093e\u0901\u091d"===a?e+12:void 0},meridiem:function(e,a,t){return e<3?"\u0930\u093e\u0924\u093f":e<12?"\u092c\u093f\u0939\u093e\u0928":e<16?"\u0926\u093f\u0909\u0901\u0938\u094b":e<20?"\u0938\u093e\u0901\u091d":"\u0930\u093e\u0924\u093f"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u092d\u094b\u0932\u093f] LT",nextWeek:"[\u0906\u0909\u0901\u0926\u094b] dddd[,] LT",lastDay:"[\u0939\u093f\u091c\u094b] LT",lastWeek:"[\u0917\u090f\u0915\u094b] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u093e",past:"%s \u0905\u0917\u093e\u0921\u093f",s:"\u0915\u0947\u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0947\u0923\u094d\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u0947\u091f",mm:"%d \u092e\u093f\u0928\u0947\u091f",h:"\u090f\u0915 \u0918\u0923\u094d\u091f\u093e",hh:"%d \u0918\u0923\u094d\u091f\u093e",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u093f\u0928\u093e",MM:"%d \u092e\u0939\u093f\u0928\u093e",y:"\u090f\u0915 \u092c\u0930\u094d\u0937",yy:"%d \u092c\u0930\u094d\u0937"},week:{dow:0,doy:6}}),"jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_")),un="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),c=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],L=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,ln=(M.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(e,a){return e?(/-MMM-/.test(a)?un:mn)[e.month()]:mn},monthsRegex:L,monthsShortRegex:L,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:c,longMonthsParse:c,shortMonthsParse:c,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||20<=e?"ste":"de")},week:{dow:1,doy:4}}),"jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_")),Mn="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),f=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],ke=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,hn=(M.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(e,a){return e?(/-MMM-/.test(a)?Mn:ln)[e.month()]:ln},monthsRegex:ke,monthsShortRegex:ke,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:f,longMonthsParse:f,shortMonthsParse:f,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",w:"\xe9\xe9n week",ww:"%d weken",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||20<=e?"ste":"de")},week:{dow:1,doy:4}}),M.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"sundag_m\xe5ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"su._m\xe5._ty._on._to._fr._lau.".split("_"),weekdaysMin:"su_m\xe5_ty_on_to_fr_la".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I g\xe5r klokka] LT",lastWeek:"[F\xf8reg\xe5ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",ss:"%d sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",w:"ei veke",ww:"%d veker",M:"ein m\xe5nad",MM:"%d m\xe5nader",y:"eit \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("oc-lnc",{months:{standalone:"geni\xe8r_febri\xe8r_mar\xe7_abril_mai_junh_julhet_agost_setembre_oct\xf2bre_novembre_decembre".split("_"),format:"de geni\xe8r_de febri\xe8r_de mar\xe7_d'abril_de mai_de junh_de julhet_d'agost_de setembre_d'oct\xf2bre_de novembre_de decembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._mar\xe7_abr._mai_junh_julh._ago._set._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"dimenge_diluns_dimars_dim\xe8cres_dij\xf2us_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dm._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dm_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:"[u\xe8i a] LT",nextDay:"[deman a] LT",nextWeek:"dddd [a] LT",lastDay:"[i\xe8r a] LT",lastWeek:"dddd [passat a] LT",sameElse:"L"},relativeTime:{future:"d'aqu\xed %s",past:"fa %s",s:"unas segondas",ss:"%d segondas",m:"una minuta",mm:"%d minutas",h:"una ora",hh:"%d oras",d:"un jorn",dd:"%d jorns",M:"un mes",MM:"%d meses",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|\xe8|a)/,ordinal:function(e,a){return e+("w"!==a&&"W"!==a?1===e?"r":2===e?"n":3===e?"r":4===e?"t":"\xe8":"a")},week:{dow:1,doy:4}}),{1:"\u0a67",2:"\u0a68",3:"\u0a69",4:"\u0a6a",5:"\u0a6b",6:"\u0a6c",7:"\u0a6d",8:"\u0a6e",9:"\u0a6f",0:"\u0a66"}),cn={"\u0a67":"1","\u0a68":"2","\u0a69":"3","\u0a6a":"4","\u0a6b":"5","\u0a6c":"6","\u0a6d":"7","\u0a6e":"8","\u0a6f":"9","\u0a66":"0"},Ln=(M.defineLocale("pa-in",{months:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),monthsShort:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),weekdays:"\u0a10\u0a24\u0a35\u0a3e\u0a30_\u0a38\u0a4b\u0a2e\u0a35\u0a3e\u0a30_\u0a2e\u0a70\u0a17\u0a32\u0a35\u0a3e\u0a30_\u0a2c\u0a41\u0a27\u0a35\u0a3e\u0a30_\u0a35\u0a40\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a41\u0a71\u0a15\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a28\u0a40\u0a1a\u0a30\u0a35\u0a3e\u0a30".split("_"),weekdaysShort:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),weekdaysMin:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),longDateFormat:{LT:"A h:mm \u0a35\u0a1c\u0a47",LTS:"A h:mm:ss \u0a35\u0a1c\u0a47",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47",LLLL:"dddd, D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47"},calendar:{sameDay:"[\u0a05\u0a1c] LT",nextDay:"[\u0a15\u0a32] LT",nextWeek:"[\u0a05\u0a17\u0a32\u0a3e] dddd, LT",lastDay:"[\u0a15\u0a32] LT",lastWeek:"[\u0a2a\u0a3f\u0a1b\u0a32\u0a47] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0a35\u0a3f\u0a71\u0a1a",past:"%s \u0a2a\u0a3f\u0a1b\u0a32\u0a47",s:"\u0a15\u0a41\u0a1d \u0a38\u0a15\u0a3f\u0a70\u0a1f",ss:"%d \u0a38\u0a15\u0a3f\u0a70\u0a1f",m:"\u0a07\u0a15 \u0a2e\u0a3f\u0a70\u0a1f",mm:"%d \u0a2e\u0a3f\u0a70\u0a1f",h:"\u0a07\u0a71\u0a15 \u0a18\u0a70\u0a1f\u0a3e",hh:"%d \u0a18\u0a70\u0a1f\u0a47",d:"\u0a07\u0a71\u0a15 \u0a26\u0a3f\u0a28",dd:"%d \u0a26\u0a3f\u0a28",M:"\u0a07\u0a71\u0a15 \u0a2e\u0a39\u0a40\u0a28\u0a3e",MM:"%d \u0a2e\u0a39\u0a40\u0a28\u0a47",y:"\u0a07\u0a71\u0a15 \u0a38\u0a3e\u0a32",yy:"%d \u0a38\u0a3e\u0a32"},preparse:function(e){return e.replace(/[\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0a66]/g,function(e){return cn[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return hn[e]})},meridiemParse:/\u0a30\u0a3e\u0a24|\u0a38\u0a35\u0a47\u0a30|\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30|\u0a38\u0a3c\u0a3e\u0a2e/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0a30\u0a3e\u0a24"===a?e<4?e:e+12:"\u0a38\u0a35\u0a47\u0a30"===a?e:"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30"===a?10<=e?e:e+12:"\u0a38\u0a3c\u0a3e\u0a2e"===a?e+12:void 0},meridiem:function(e,a,t){return e<4?"\u0a30\u0a3e\u0a24":e<10?"\u0a38\u0a35\u0a47\u0a30":e<17?"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30":e<20?"\u0a38\u0a3c\u0a3e\u0a2e":"\u0a30\u0a3e\u0a24"},week:{dow:0,doy:6}}),"stycze\u0144_luty_marzec_kwiecie\u0144_maj_czerwiec_lipiec_sierpie\u0144_wrzesie\u0144_pa\u017adziernik_listopad_grudzie\u0144".split("_")),Yn="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrze\u015bnia_pa\u017adziernika_listopada_grudnia".split("_"),_=[/^sty/i,/^lut/i,/^mar/i,/^kwi/i,/^maj/i,/^cze/i,/^lip/i,/^sie/i,/^wrz/i,/^pa\u017a/i,/^lis/i,/^gru/i];function yn(e){return e%10<5&&1<e%10&&~~(e/10)%10!=1}function fn(e,a,t){var s=e+" ";switch(t){case"ss":return s+(yn(e)?"sekundy":"sekund");case"m":return a?"minuta":"minut\u0119";case"mm":return s+(yn(e)?"minuty":"minut");case"h":return a?"godzina":"godzin\u0119";case"hh":return s+(yn(e)?"godziny":"godzin");case"ww":return s+(yn(e)?"tygodnie":"tygodni");case"MM":return s+(yn(e)?"miesi\u0105ce":"miesi\u0119cy");case"yy":return s+(yn(e)?"lata":"lat")}}function pn(e,a,t){return e+(20<=e%100||100<=e&&e%100==0?" de ":" ")+{ss:"secunde",mm:"minute",hh:"ore",dd:"zile",ww:"s\u0103pt\u0103m\xe2ni",MM:"luni",yy:"ani"}[t]}function kn(e,a,t){return"m"===t?a?"\u043c\u0438\u043d\u0443\u0442\u0430":"\u043c\u0438\u043d\u0443\u0442\u0443":e+" "+(e=+e,a=(a={ss:a?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:a?"\u043c\u0438\u043d\u0443\u0442\u0430_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442":"\u043c\u0438\u043d\u0443\u0442\u0443_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442",hh:"\u0447\u0430\u0441_\u0447\u0430\u0441\u0430_\u0447\u0430\u0441\u043e\u0432",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u044f_\u0434\u043d\u0435\u0439",ww:"\u043d\u0435\u0434\u0435\u043b\u044f_\u043d\u0435\u0434\u0435\u043b\u0438_\u043d\u0435\u0434\u0435\u043b\u044c",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u0430_\u043c\u0435\u0441\u044f\u0446\u0435\u0432",yy:"\u0433\u043e\u0434_\u0433\u043e\u0434\u0430_\u043b\u0435\u0442"}[t]).split("_"),e%10==1&&e%100!=11?a[0]:2<=e%10&&e%10<=4&&(e%100<10||20<=e%100)?a[1]:a[2])}M.defineLocale("pl",{months:function(e,a){return e?(/D MMMM/.test(a)?Yn:Ln)[e.month()]:Ln},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_pa\u017a_lis_gru".split("_"),monthsParse:_,longMonthsParse:_,shortMonthsParse:_,weekdays:"niedziela_poniedzia\u0142ek_wtorek_\u015broda_czwartek_pi\u0105tek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_\u015br_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_\u015ar_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dzi\u015b o] LT",nextDay:"[Jutro o] LT",nextWeek:function(){switch(this.day()){case 0:return"[W niedziel\u0119 o] LT";case 2:return"[We wtorek o] LT";case 3:return"[W \u015brod\u0119 o] LT";case 6:return"[W sobot\u0119 o] LT";default:return"[W] dddd [o] LT"}},lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zesz\u0142\u0105 niedziel\u0119 o] LT";case 3:return"[W zesz\u0142\u0105 \u015brod\u0119 o] LT";case 6:return"[W zesz\u0142\u0105 sobot\u0119 o] LT";default:return"[W zesz\u0142y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",ss:fn,m:fn,mm:fn,h:fn,hh:fn,d:"1 dzie\u0144",dd:"%d dni",w:"tydzie\u0144",ww:fn,M:"miesi\u0105c",MM:fn,y:"rok",yy:fn},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("pt-br",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_ter\xe7a-feira_quarta-feira_quinta-feira_sexta-feira_s\xe1bado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_s\xe1b".split("_"),weekdaysMin:"do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [\xe0s] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [\xe0s] HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"poucos segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",invalidDate:"Data inv\xe1lida"}),M.defineLocale("pt",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Ter\xe7a-feira_Quarta-feira_Quinta-feira_Sexta-feira_S\xe1bado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_S\xe1b".split("_"),weekdaysMin:"Do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",w:"uma semana",ww:"%d semanas",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}}),M.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._feb._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminic\u0103_luni_mar\u021bi_miercuri_joi_vineri_s\xe2mb\u0103t\u0103".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_S\xe2m".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_S\xe2".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[m\xe2ine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s \xeen urm\u0103",s:"c\xe2teva secunde",ss:pn,m:"un minut",mm:pn,h:"o or\u0103",hh:pn,d:"o zi",dd:pn,w:"o s\u0103pt\u0103m\xe2n\u0103",ww:pn,M:"o lun\u0103",MM:pn,y:"un an",yy:pn},week:{dow:1,doy:7}});y=[/^\u044f\u043d\u0432/i,/^\u0444\u0435\u0432/i,/^\u043c\u0430\u0440/i,/^\u0430\u043f\u0440/i,/^\u043c\u0430[\u0439\u044f]/i,/^\u0438\u044e\u043d/i,/^\u0438\u044e\u043b/i,/^\u0430\u0432\u0433/i,/^\u0441\u0435\u043d/i,/^\u043e\u043a\u0442/i,/^\u043d\u043e\u044f/i,/^\u0434\u0435\u043a/i],M.defineLocale("ru",{months:{format:"\u044f\u043d\u0432\u0430\u0440\u044f_\u0444\u0435\u0432\u0440\u0430\u043b\u044f_\u043c\u0430\u0440\u0442\u0430_\u0430\u043f\u0440\u0435\u043b\u044f_\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433\u0443\u0441\u0442\u0430_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f_\u043e\u043a\u0442\u044f\u0431\u0440\u044f_\u043d\u043e\u044f\u0431\u0440\u044f_\u0434\u0435\u043a\u0430\u0431\u0440\u044f".split("_"),standalone:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_")},monthsShort:{format:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_"),standalone:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440\u0442_\u0430\u043f\u0440._\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_")},weekdays:{standalone:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0430_\u0441\u0443\u0431\u0431\u043e\u0442\u0430".split("_"),format:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0443_\u0441\u0443\u0431\u0431\u043e\u0442\u0443".split("_"),isFormat:/\[ ?[\u0412\u0432] ?(?:\u043f\u0440\u043e\u0448\u043b\u0443\u044e|\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e|\u044d\u0442\u0443)? ?] ?dddd/},weekdaysShort:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),monthsParse:y,longMonthsParse:y,shortMonthsParse:y,monthsRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsShortRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsStrictRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044f\u044c]|\u0444\u0435\u0432\u0440\u0430\u043b[\u044f\u044c]|\u043c\u0430\u0440\u0442\u0430?|\u0430\u043f\u0440\u0435\u043b[\u044f\u044c]|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044f\u044c]|\u0438\u044e\u043b[\u044f\u044c]|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043e\u043a\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043d\u043e\u044f\u0431\u0440[\u044f\u044c]|\u0434\u0435\u043a\u0430\u0431\u0440[\u044f\u044c])/i,monthsShortStrictRegex:/^(\u044f\u043d\u0432\.|\u0444\u0435\u0432\u0440?\.|\u043c\u0430\u0440[\u0442.]|\u0430\u043f\u0440\.|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044c\u044f.]|\u0438\u044e\u043b[\u044c\u044f.]|\u0430\u0432\u0433\.|\u0441\u0435\u043d\u0442?\.|\u043e\u043a\u0442\.|\u043d\u043e\u044f\u0431?\.|\u0434\u0435\u043a\.)/i,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., H:mm",LLLL:"dddd, D MMMM YYYY \u0433., H:mm"},calendar:{sameDay:"[\u0421\u0435\u0433\u043e\u0434\u043d\u044f, \u0432] LT",nextDay:"[\u0417\u0430\u0432\u0442\u0440\u0430, \u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430, \u0432] LT",nextWeek:function(e){if(e.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd, [\u0432] LT":"[\u0412] dddd, [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435] dddd, [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439] dddd, [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e] dddd, [\u0432] LT"}},lastWeek:function(e){if(e.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd, [\u0432] LT":"[\u0412] dddd, [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0435] dddd, [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0439] dddd, [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u0443\u044e] dddd, [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0447\u0435\u0440\u0435\u0437 %s",past:"%s \u043d\u0430\u0437\u0430\u0434",s:"\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434",ss:kn,m:kn,mm:kn,h:"\u0447\u0430\u0441",hh:kn,d:"\u0434\u0435\u043d\u044c",dd:kn,w:"\u043d\u0435\u0434\u0435\u043b\u044f",ww:kn,M:"\u043c\u0435\u0441\u044f\u0446",MM:kn,y:"\u0433\u043e\u0434",yy:kn},meridiemParse:/\u043d\u043e\u0447\u0438|\u0443\u0442\u0440\u0430|\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430/i,isPM:function(e){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430)$/.test(e)},meridiem:function(e,a,t){return e<4?"\u043d\u043e\u0447\u0438":e<12?"\u0443\u0442\u0440\u0430":e<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0435\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e|\u044f)/,ordinal:function(e,a){switch(a){case"M":case"d":case"DDD":return e+"-\u0439";case"D":return e+"-\u0433\u043e";case"w":case"W":return e+"-\u044f";default:return e}},week:{dow:1,doy:4}}),Y=["\u062c\u0646\u0648\u0631\u064a","\u0641\u064a\u0628\u0631\u0648\u0631\u064a","\u0645\u0627\u0631\u0686","\u0627\u067e\u0631\u064a\u0644","\u0645\u0626\u064a","\u062c\u0648\u0646","\u062c\u0648\u0644\u0627\u0621\u0650","\u0622\u06af\u0633\u067d","\u0633\u064a\u067e\u067d\u0645\u0628\u0631","\u0622\u06aa\u067d\u0648\u0628\u0631","\u0646\u0648\u0645\u0628\u0631","\u068a\u0633\u0645\u0628\u0631"],Ke=["\u0622\u0686\u0631","\u0633\u0648\u0645\u0631","\u0627\u06b1\u0627\u0631\u0648","\u0627\u0631\u0628\u0639","\u062e\u0645\u064a\u0633","\u062c\u0645\u0639","\u0687\u0646\u0687\u0631"],M.defineLocale("sd",{months:Y,monthsShort:Y,weekdays:Ke,weekdaysShort:Ke,weekdaysMin:Ke,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd\u060c D MMMM YYYY HH:mm"},meridiemParse:/\u0635\u0628\u062d|\u0634\u0627\u0645/,isPM:function(e){return"\u0634\u0627\u0645"===e},meridiem:function(e,a,t){return e<12?"\u0635\u0628\u062d":"\u0634\u0627\u0645"},calendar:{sameDay:"[\u0627\u0684] LT",nextDay:"[\u0633\u0680\u0627\u06bb\u064a] LT",nextWeek:"dddd [\u0627\u06b3\u064a\u0646 \u0647\u0641\u062a\u064a \u062a\u064a] LT",lastDay:"[\u06aa\u0627\u0644\u0647\u0647] LT",lastWeek:"[\u06af\u0632\u0631\u064a\u0644 \u0647\u0641\u062a\u064a] dddd [\u062a\u064a] LT",sameElse:"L"},relativeTime:{future:"%s \u067e\u0648\u0621",past:"%s \u0627\u06b3",s:"\u0686\u0646\u062f \u0633\u064a\u06aa\u0646\u068a",ss:"%d \u0633\u064a\u06aa\u0646\u068a",m:"\u0647\u06aa \u0645\u0646\u067d",mm:"%d \u0645\u0646\u067d",h:"\u0647\u06aa \u06aa\u0644\u0627\u06aa",hh:"%d \u06aa\u0644\u0627\u06aa",d:"\u0647\u06aa \u068f\u064a\u0646\u0647\u0646",dd:"%d \u068f\u064a\u0646\u0647\u0646",M:"\u0647\u06aa \u0645\u0647\u064a\u0646\u0648",MM:"%d \u0645\u0647\u064a\u0646\u0627",y:"\u0647\u06aa \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:1,doy:4}}),M.defineLocale("se",{months:"o\u0111\u0111ajagem\xe1nnu_guovvam\xe1nnu_njuk\u010dam\xe1nnu_cuo\u014bom\xe1nnu_miessem\xe1nnu_geassem\xe1nnu_suoidnem\xe1nnu_borgem\xe1nnu_\u010dak\u010dam\xe1nnu_golggotm\xe1nnu_sk\xe1bmam\xe1nnu_juovlam\xe1nnu".split("_"),monthsShort:"o\u0111\u0111j_guov_njuk_cuo_mies_geas_suoi_borg_\u010dak\u010d_golg_sk\xe1b_juov".split("_"),weekdays:"sotnabeaivi_vuoss\xe1rga_ma\u014b\u014beb\xe1rga_gaskavahkku_duorastat_bearjadat_l\xe1vvardat".split("_"),weekdaysShort:"sotn_vuos_ma\u014b_gask_duor_bear_l\xe1v".split("_"),weekdaysMin:"s_v_m_g_d_b_L".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"MMMM D. [b.] YYYY",LLL:"MMMM D. [b.] YYYY [ti.] HH:mm",LLLL:"dddd, MMMM D. [b.] YYYY [ti.] HH:mm"},calendar:{sameDay:"[otne ti] LT",nextDay:"[ihttin ti] LT",nextWeek:"dddd [ti] LT",lastDay:"[ikte ti] LT",lastWeek:"[ovddit] dddd [ti] LT",sameElse:"L"},relativeTime:{future:"%s gea\u017ees",past:"ma\u014bit %s",s:"moadde sekunddat",ss:"%d sekunddat",m:"okta minuhta",mm:"%d minuhtat",h:"okta diimmu",hh:"%d diimmut",d:"okta beaivi",dd:"%d beaivvit",M:"okta m\xe1nnu",MM:"%d m\xe1nut",y:"okta jahki",yy:"%d jagit"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("si",{months:"\u0da2\u0db1\u0dc0\u0dcf\u0dbb\u0dd2_\u0db4\u0dd9\u0db6\u0dbb\u0dc0\u0dcf\u0dbb\u0dd2_\u0db8\u0dcf\u0dbb\u0dca\u0dad\u0dd4_\u0d85\u0db4\u0dca\u200d\u0dbb\u0dda\u0dbd\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd\u0dc3\u0dca\u0dad\u0dd4_\u0dc3\u0dd0\u0db4\u0dca\u0dad\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0d94\u0d9a\u0dca\u0dad\u0ddd\u0db6\u0dbb\u0dca_\u0db1\u0ddc\u0dc0\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0daf\u0dd9\u0dc3\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca".split("_"),monthsShort:"\u0da2\u0db1_\u0db4\u0dd9\u0db6_\u0db8\u0dcf\u0dbb\u0dca_\u0d85\u0db4\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd_\u0dc3\u0dd0\u0db4\u0dca_\u0d94\u0d9a\u0dca_\u0db1\u0ddc\u0dc0\u0dd0_\u0daf\u0dd9\u0dc3\u0dd0".split("_"),weekdays:"\u0d89\u0dbb\u0dd2\u0daf\u0dcf_\u0dc3\u0db3\u0dd4\u0daf\u0dcf_\u0d85\u0d9f\u0dc4\u0dbb\u0dd4\u0dc0\u0dcf\u0daf\u0dcf_\u0db6\u0daf\u0dcf\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4\u0dc3\u0dca\u0db4\u0dad\u0dd2\u0db1\u0dca\u0daf\u0dcf_\u0dc3\u0dd2\u0d9a\u0dd4\u0dbb\u0dcf\u0daf\u0dcf_\u0dc3\u0dd9\u0db1\u0dc3\u0dd4\u0dbb\u0dcf\u0daf\u0dcf".split("_"),weekdaysShort:"\u0d89\u0dbb\u0dd2_\u0dc3\u0db3\u0dd4_\u0d85\u0d9f_\u0db6\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4_\u0dc3\u0dd2\u0d9a\u0dd4_\u0dc3\u0dd9\u0db1".split("_"),weekdaysMin:"\u0d89_\u0dc3_\u0d85_\u0db6_\u0db6\u0dca\u200d\u0dbb_\u0dc3\u0dd2_\u0dc3\u0dd9".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"a h:mm",LTS:"a h:mm:ss",L:"YYYY/MM/DD",LL:"YYYY MMMM D",LLL:"YYYY MMMM D, a h:mm",LLLL:"YYYY MMMM D [\u0dc0\u0dd0\u0db1\u0dd2] dddd, a h:mm:ss"},calendar:{sameDay:"[\u0d85\u0daf] LT[\u0da7]",nextDay:"[\u0dc4\u0dd9\u0da7] LT[\u0da7]",nextWeek:"dddd LT[\u0da7]",lastDay:"[\u0d8a\u0dba\u0dda] LT[\u0da7]",lastWeek:"[\u0db4\u0dc3\u0dd4\u0d9c\u0dd2\u0dba] dddd LT[\u0da7]",sameElse:"L"},relativeTime:{future:"%s\u0d9a\u0dd2\u0db1\u0dca",past:"%s\u0d9a\u0da7 \u0db4\u0dd9\u0dbb",s:"\u0dad\u0dad\u0dca\u0db4\u0dbb \u0d9a\u0dd2\u0dc4\u0dd2\u0db4\u0dba",ss:"\u0dad\u0dad\u0dca\u0db4\u0dbb %d",m:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4\u0dc0",mm:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4 %d",h:"\u0db4\u0dd0\u0dba",hh:"\u0db4\u0dd0\u0dba %d",d:"\u0daf\u0dd2\u0db1\u0dba",dd:"\u0daf\u0dd2\u0db1 %d",M:"\u0db8\u0dcf\u0dc3\u0dba",MM:"\u0db8\u0dcf\u0dc3 %d",y:"\u0dc0\u0dc3\u0dbb",yy:"\u0dc0\u0dc3\u0dbb %d"},dayOfMonthOrdinalParse:/\d{1,2} \u0dc0\u0dd0\u0db1\u0dd2/,ordinal:function(e){return e+" \u0dc0\u0dd0\u0db1\u0dd2"},meridiemParse:/\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4|\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4|\u0db4\u0dd9.\u0dc0|\u0db4.\u0dc0./,isPM:function(e){return"\u0db4.\u0dc0."===e||"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4"===e},meridiem:function(e,a,t){return 11<e?t?"\u0db4.\u0dc0.":"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4":t?"\u0db4\u0dd9.\u0dc0.":"\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4"}}),Ht="janu\xe1r_febru\xe1r_marec_apr\xedl_m\xe1j_j\xfan_j\xfal_august_september_okt\xf3ber_november_december".split("_"),r="jan_feb_mar_apr_m\xe1j_j\xfan_j\xfal_aug_sep_okt_nov_dec".split("_");function Dn(e){return 1<e&&e<5}function Tn(e,a,t,s){var n=e+" ";switch(t){case"s":return a||s?"p\xe1r sek\xfand":"p\xe1r sekundami";case"ss":return a||s?n+(Dn(e)?"sekundy":"sek\xfand"):n+"sekundami";case"m":return a?"min\xfata":s?"min\xfatu":"min\xfatou";case"mm":return a||s?n+(Dn(e)?"min\xfaty":"min\xfat"):n+"min\xfatami";case"h":return a?"hodina":s?"hodinu":"hodinou";case"hh":return a||s?n+(Dn(e)?"hodiny":"hod\xedn"):n+"hodinami";case"d":return a||s?"de\u0148":"d\u0148om";case"dd":return a||s?n+(Dn(e)?"dni":"dn\xed"):n+"d\u0148ami";case"M":return a||s?"mesiac":"mesiacom";case"MM":return a||s?n+(Dn(e)?"mesiace":"mesiacov"):n+"mesiacmi";case"y":return a||s?"rok":"rokom";case"yy":return a||s?n+(Dn(e)?"roky":"rokov"):n+"rokmi"}}function gn(e,a,t,s){var n=e+" ";switch(t){case"s":return a||s?"nekaj sekund":"nekaj sekundami";case"ss":return n+=1===e?a?"sekundo":"sekundi":2===e?a||s?"sekundi":"sekundah":e<5?a||s?"sekunde":"sekundah":"sekund";case"m":return a?"ena minuta":"eno minuto";case"mm":return n+=1===e?a?"minuta":"minuto":2===e?a||s?"minuti":"minutama":e<5?a||s?"minute":"minutami":a||s?"minut":"minutami";case"h":return a?"ena ura":"eno uro";case"hh":return n+=1===e?a?"ura":"uro":2===e?a||s?"uri":"urama":e<5?a||s?"ure":"urami":a||s?"ur":"urami";case"d":return a||s?"en dan":"enim dnem";case"dd":return n+=1===e?a||s?"dan":"dnem":2===e?a||s?"dni":"dnevoma":a||s?"dni":"dnevi";case"M":return a||s?"en mesec":"enim mesecem";case"MM":return n+=1===e?a||s?"mesec":"mesecem":2===e?a||s?"meseca":"mesecema":e<5?a||s?"mesece":"meseci":a||s?"mesecev":"meseci";case"y":return a||s?"eno leto":"enim letom";case"yy":return n+=1===e?a||s?"leto":"letom":2===e?a||s?"leti":"letoma":e<5?a||s?"leta":"leti":a||s?"let":"leti"}}M.defineLocale("sk",{months:Ht,monthsShort:r,weekdays:"nede\u013ea_pondelok_utorok_streda_\u0161tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_\u0161t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_\u0161t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nede\u013eu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo \u0161tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[v\u010dera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minul\xfa nede\u013eu o] LT";case 1:case 2:return"[minul\xfd] dddd [o] LT";case 3:return"[minul\xfa stredu o] LT";case 4:case 5:return"[minul\xfd] dddd [o] LT";case 6:return"[minul\xfa sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:Tn,ss:Tn,m:Tn,mm:Tn,h:Tn,hh:Tn,d:Tn,dd:Tn,M:Tn,MM:Tn,y:Tn,yy:Tn},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_\u010detrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._\u010det._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_\u010de_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[v\u010deraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prej\u0161njo] [nedeljo] [ob] LT";case 3:return"[prej\u0161njo] [sredo] [ob] LT";case 6:return"[prej\u0161njo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prej\u0161nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"\u010dez %s",past:"pred %s",s:gn,ss:gn,m:gn,mm:gn,h:gn,hh:gn,d:gn,dd:gn,M:gn,MM:gn,y:gn,yy:gn},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}}),M.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_N\xebntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_N\xebn_Dhj".split("_"),weekdays:"E Diel_E H\xebn\xeb_E Mart\xeb_E M\xebrkur\xeb_E Enjte_E Premte_E Shtun\xeb".split("_"),weekdaysShort:"Die_H\xebn_Mar_M\xebr_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_M\xeb_E_P_Sh".split("_"),weekdaysParseExact:!0,meridiemParse:/PD|MD/,isPM:function(e){return"M"===e.charAt(0)},meridiem:function(e,a,t){return e<12?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Sot n\xeb] LT",nextDay:"[Nes\xebr n\xeb] LT",nextWeek:"dddd [n\xeb] LT",lastDay:"[Dje n\xeb] LT",lastWeek:"dddd [e kaluar n\xeb] LT",sameElse:"L"},relativeTime:{future:"n\xeb %s",past:"%s m\xeb par\xeb",s:"disa sekonda",ss:"%d sekonda",m:"nj\xeb minut\xeb",mm:"%d minuta",h:"nj\xeb or\xeb",hh:"%d or\xeb",d:"nj\xeb dit\xeb",dd:"%d dit\xeb",M:"nj\xeb muaj",MM:"%d muaj",y:"nj\xeb vit",yy:"%d vite"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});var W={words:{ss:["\u0441\u0435\u043a\u0443\u043d\u0434\u0430","\u0441\u0435\u043a\u0443\u043d\u0434\u0435","\u0441\u0435\u043a\u0443\u043d\u0434\u0438"],m:["\u0458\u0435\u0434\u0430\u043d \u043c\u0438\u043d\u0443\u0442","\u0458\u0435\u0434\u043d\u043e\u0433 \u043c\u0438\u043d\u0443\u0442\u0430"],mm:["\u043c\u0438\u043d\u0443\u0442","\u043c\u0438\u043d\u0443\u0442\u0430","\u043c\u0438\u043d\u0443\u0442\u0430"],h:["\u0458\u0435\u0434\u0430\u043d \u0441\u0430\u0442","\u0458\u0435\u0434\u043d\u043e\u0433 \u0441\u0430\u0442\u0430"],hh:["\u0441\u0430\u0442","\u0441\u0430\u0442\u0430","\u0441\u0430\u0442\u0438"],d:["\u0458\u0435\u0434\u0430\u043d \u0434\u0430\u043d","\u0458\u0435\u0434\u043d\u043e\u0433 \u0434\u0430\u043d\u0430"],dd:["\u0434\u0430\u043d","\u0434\u0430\u043d\u0430","\u0434\u0430\u043d\u0430"],M:["\u0458\u0435\u0434\u0430\u043d \u043c\u0435\u0441\u0435\u0446","\u0458\u0435\u0434\u043d\u043e\u0433 \u043c\u0435\u0441\u0435\u0446\u0430"],MM:["\u043c\u0435\u0441\u0435\u0446","\u043c\u0435\u0441\u0435\u0446\u0430","\u043c\u0435\u0441\u0435\u0446\u0438"],y:["\u0458\u0435\u0434\u043d\u0443 \u0433\u043e\u0434\u0438\u043d\u0443","\u0458\u0435\u0434\u043d\u0435 \u0433\u043e\u0434\u0438\u043d\u0435"],yy:["\u0433\u043e\u0434\u0438\u043d\u0443","\u0433\u043e\u0434\u0438\u043d\u0435","\u0433\u043e\u0434\u0438\u043d\u0430"]},correctGrammaticalCase:function(e,a){return 1<=e%10&&e%10<=4&&(e%100<10||20<=e%100)?e%10==1?a[0]:a[1]:a[2]},translate:function(e,a,t,s){var n=W.words[t];return 1===t.length?"y"===t&&a?"\u0458\u0435\u0434\u043d\u0430 \u0433\u043e\u0434\u0438\u043d\u0430":s||a?n[0]:n[1]:(s=W.correctGrammaticalCase(e,n),"yy"===t&&a&&"\u0433\u043e\u0434\u0438\u043d\u0443"===s?e+" \u0433\u043e\u0434\u0438\u043d\u0430":e+" "+s)}},A=(M.defineLocale("sr-cyrl",{months:"\u0458\u0430\u043d\u0443\u0430\u0440_\u0444\u0435\u0431\u0440\u0443\u0430\u0440_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440_\u043e\u043a\u0442\u043e\u0431\u0430\u0440_\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440_\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440".split("_"),monthsShort:"\u0458\u0430\u043d._\u0444\u0435\u0431._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433._\u0441\u0435\u043f._\u043e\u043a\u0442._\u043d\u043e\u0432._\u0434\u0435\u0446.".split("_"),monthsParseExact:!0,weekdays:"\u043d\u0435\u0434\u0435\u0459\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a_\u0443\u0442\u043e\u0440\u0430\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a_\u043f\u0435\u0442\u0430\u043a_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434._\u043f\u043e\u043d._\u0443\u0442\u043e._\u0441\u0440\u0435._\u0447\u0435\u0442._\u043f\u0435\u0442._\u0441\u0443\u0431.".split("_"),weekdaysMin:"\u043d\u0435_\u043f\u043e_\u0443\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441\u0443".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D. M. YYYY.",LL:"D. MMMM YYYY.",LLL:"D. MMMM YYYY. H:mm",LLLL:"dddd, D. MMMM YYYY. H:mm"},calendar:{sameDay:"[\u0434\u0430\u043d\u0430\u0441 \u0443] LT",nextDay:"[\u0441\u0443\u0442\u0440\u0430 \u0443] LT",nextWeek:function(){switch(this.day()){case 0:return"[\u0443] [\u043d\u0435\u0434\u0435\u0459\u0443] [\u0443] LT";case 3:return"[\u0443] [\u0441\u0440\u0435\u0434\u0443] [\u0443] LT";case 6:return"[\u0443] [\u0441\u0443\u0431\u043e\u0442\u0443] [\u0443] LT";case 1:case 2:case 4:case 5:return"[\u0443] dddd [\u0443] LT"}},lastDay:"[\u0458\u0443\u0447\u0435 \u0443] LT",lastWeek:function(){return["[\u043f\u0440\u043e\u0448\u043b\u0435] [\u043d\u0435\u0434\u0435\u0459\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0443\u0442\u043e\u0440\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0440\u0435\u0434\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0447\u0435\u0442\u0432\u0440\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u0435\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0443\u0431\u043e\u0442\u0435] [\u0443] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"\u043f\u0440\u0435 %s",s:"\u043d\u0435\u043a\u043e\u043b\u0438\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:W.translate,m:W.translate,mm:W.translate,h:W.translate,hh:W.translate,d:W.translate,dd:W.translate,M:W.translate,MM:W.translate,y:W.translate,yy:W.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}}),{words:{ss:["sekunda","sekunde","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],d:["jedan dan","jednog dana"],dd:["dan","dana","dana"],M:["jedan mesec","jednog meseca"],MM:["mesec","meseca","meseci"],y:["jednu godinu","jedne godine"],yy:["godinu","godine","godina"]},correctGrammaticalCase:function(e,a){return 1<=e%10&&e%10<=4&&(e%100<10||20<=e%100)?e%10==1?a[0]:a[1]:a[2]},translate:function(e,a,t,s){var n=A.words[t];return 1===t.length?"y"===t&&a?"jedna godina":s||a?n[0]:n[1]:(s=A.correctGrammaticalCase(e,n),"yy"===t&&a&&"godinu"===s?e+" godina":e+" "+s)}}),wn=(M.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D. M. YYYY.",LL:"D. MMMM YYYY.",LLL:"D. MMMM YYYY. H:mm",LLLL:"dddd, D. MMMM YYYY. H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedelje] [u] LT","[pro\u0161log] [ponedeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",ss:A.translate,m:A.translate,mm:A.translate,h:A.translate,hh:A.translate,d:A.translate,dd:A.translate,M:A.translate,MM:A.translate,y:A.translate,yy:A.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}}),M.defineLocale("ss",{months:"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split("_"),monthsShort:"Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo".split("_"),weekdays:"Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo".split("_"),weekdaysShort:"Lis_Umb_Lsb_Les_Lsi_Lsh_Umg".split("_"),weekdaysMin:"Li_Us_Lb_Lt_Ls_Lh_Ug".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Namuhla nga] LT",nextDay:"[Kusasa nga] LT",nextWeek:"dddd [nga] LT",lastDay:"[Itolo nga] LT",lastWeek:"dddd [leliphelile] [nga] LT",sameElse:"L"},relativeTime:{future:"nga %s",past:"wenteka nga %s",s:"emizuzwana lomcane",ss:"%d mzuzwana",m:"umzuzu",mm:"%d emizuzu",h:"lihora",hh:"%d emahora",d:"lilanga",dd:"%d emalanga",M:"inyanga",MM:"%d tinyanga",y:"umnyaka",yy:"%d iminyaka"},meridiemParse:/ekuseni|emini|entsambama|ebusuku/,meridiem:function(e,a,t){return e<11?"ekuseni":e<15?"emini":e<19?"entsambama":"ebusuku"},meridiemHour:function(e,a){return 12===e&&(e=0),"ekuseni"===a?e:"emini"===a?11<=e?e:e+12:"entsambama"===a||"ebusuku"===a?0===e?0:e+12:void 0},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:"%d",week:{dow:1,doy:4}}),M.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"s\xf6ndag_m\xe5ndag_tisdag_onsdag_torsdag_fredag_l\xf6rdag".split("_"),weekdaysShort:"s\xf6n_m\xe5n_tis_ons_tor_fre_l\xf6r".split("_"),weekdaysMin:"s\xf6_m\xe5_ti_on_to_fr_l\xf6".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Ig\xe5r] LT",nextWeek:"[P\xe5] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"f\xf6r %s sedan",s:"n\xe5gra sekunder",ss:"%d sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en m\xe5nad",MM:"%d m\xe5nader",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}(\:e|\:a)/,ordinal:function(e){var a=e%10;return e+(1!=~~(e%100/10)&&(1==a||2==a)?":a":":e")},week:{dow:1,doy:4}}),M.defineLocale("sw",{months:"Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des".split("_"),weekdays:"Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi".split("_"),weekdaysShort:"Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos".split("_"),weekdaysMin:"J2_J3_J4_J5_Al_Ij_J1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"hh:mm A",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[leo saa] LT",nextDay:"[kesho saa] LT",nextWeek:"[wiki ijayo] dddd [saat] LT",lastDay:"[jana] LT",lastWeek:"[wiki iliyopita] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s baadaye",past:"tokea %s",s:"hivi punde",ss:"sekunde %d",m:"dakika moja",mm:"dakika %d",h:"saa limoja",hh:"masaa %d",d:"siku moja",dd:"siku %d",M:"mwezi mmoja",MM:"miezi %d",y:"mwaka mmoja",yy:"miaka %d"},week:{dow:1,doy:7}}),{1:"\u0be7",2:"\u0be8",3:"\u0be9",4:"\u0bea",5:"\u0beb",6:"\u0bec",7:"\u0bed",8:"\u0bee",9:"\u0bef",0:"\u0be6"}),bn={"\u0be7":"1","\u0be8":"2","\u0be9":"3","\u0bea":"4","\u0beb":"5","\u0bec":"6","\u0bed":"7","\u0bee":"8","\u0bef":"9","\u0be6":"0"},Sn=(M.defineLocale("ta",{months:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),monthsShort:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),weekdays:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bcd\u0bb1\u0bc1\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0b9f\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0ba9\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8".split("_"),weekdaysShort:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bc1_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0bb3\u0bcd_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0ba9\u0bcd_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf_\u0b9a\u0ba9\u0bbf".split("_"),weekdaysMin:"\u0b9e\u0bbe_\u0ba4\u0bbf_\u0b9a\u0bc6_\u0baa\u0bc1_\u0bb5\u0bbf_\u0bb5\u0bc6_\u0b9a".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, HH:mm",LLLL:"dddd, D MMMM YYYY, HH:mm"},calendar:{sameDay:"[\u0b87\u0ba9\u0bcd\u0bb1\u0bc1] LT",nextDay:"[\u0ba8\u0bbe\u0bb3\u0bc8] LT",nextWeek:"dddd, LT",lastDay:"[\u0ba8\u0bc7\u0bb1\u0bcd\u0bb1\u0bc1] LT",lastWeek:"[\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 \u0bb5\u0bbe\u0bb0\u0bae\u0bcd] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0b87\u0bb2\u0bcd",past:"%s \u0bae\u0bc1\u0ba9\u0bcd",s:"\u0b92\u0bb0\u0bc1 \u0b9a\u0bbf\u0bb2 \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",ss:"%d \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",m:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0bae\u0bcd",mm:"%d \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0b99\u0bcd\u0b95\u0bb3\u0bcd",h:"\u0b92\u0bb0\u0bc1 \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",hh:"%d \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",d:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbe\u0bb3\u0bcd",dd:"%d \u0ba8\u0bbe\u0b9f\u0bcd\u0b95\u0bb3\u0bcd",M:"\u0b92\u0bb0\u0bc1 \u0bae\u0bbe\u0ba4\u0bae\u0bcd",MM:"%d \u0bae\u0bbe\u0ba4\u0b99\u0bcd\u0b95\u0bb3\u0bcd",y:"\u0b92\u0bb0\u0bc1 \u0bb5\u0bb0\u0bc1\u0b9f\u0bae\u0bcd",yy:"%d \u0b86\u0ba3\u0bcd\u0b9f\u0bc1\u0b95\u0bb3\u0bcd"},dayOfMonthOrdinalParse:/\d{1,2}\u0bb5\u0ba4\u0bc1/,ordinal:function(e){return e+"\u0bb5\u0ba4\u0bc1"},preparse:function(e){return e.replace(/[\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0be6]/g,function(e){return bn[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return wn[e]})},meridiemParse:/\u0baf\u0bbe\u0bae\u0bae\u0bcd|\u0bb5\u0bc8\u0b95\u0bb1\u0bc8|\u0b95\u0bbe\u0bb2\u0bc8|\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd|\u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1|\u0bae\u0bbe\u0bb2\u0bc8/,meridiem:function(e,a,t){return e<2?" \u0baf\u0bbe\u0bae\u0bae\u0bcd":e<6?" \u0bb5\u0bc8\u0b95\u0bb1\u0bc8":e<10?" \u0b95\u0bbe\u0bb2\u0bc8":e<14?" \u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd":e<18?" \u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1":e<22?" \u0bae\u0bbe\u0bb2\u0bc8":" \u0baf\u0bbe\u0bae\u0bae\u0bcd"},meridiemHour:function(e,a){return 12===e&&(e=0),"\u0baf\u0bbe\u0bae\u0bae\u0bcd"===a?e<2?e:e+12:"\u0bb5\u0bc8\u0b95\u0bb1\u0bc8"===a||"\u0b95\u0bbe\u0bb2\u0bc8"===a||"\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd"===a&&10<=e?e:e+12},week:{dow:0,doy:6}}),M.defineLocale("te",{months:"\u0c1c\u0c28\u0c35\u0c30\u0c3f_\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f_\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d_\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c41\u0c32\u0c48_\u0c06\u0c17\u0c38\u0c4d\u0c1f\u0c41_\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c4d_\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c4d_\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c4d_\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c4d".split("_"),monthsShort:"\u0c1c\u0c28._\u0c2b\u0c3f\u0c2c\u0c4d\u0c30._\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f._\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c41\u0c32\u0c48_\u0c06\u0c17._\u0c38\u0c46\u0c2a\u0c4d._\u0c05\u0c15\u0c4d\u0c1f\u0c4b._\u0c28\u0c35._\u0c21\u0c3f\u0c38\u0c46.".split("_"),monthsParseExact:!0,weekdays:"\u0c06\u0c26\u0c3f\u0c35\u0c3e\u0c30\u0c02_\u0c38\u0c4b\u0c2e\u0c35\u0c3e\u0c30\u0c02_\u0c2e\u0c02\u0c17\u0c33\u0c35\u0c3e\u0c30\u0c02_\u0c2c\u0c41\u0c27\u0c35\u0c3e\u0c30\u0c02_\u0c17\u0c41\u0c30\u0c41\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c41\u0c15\u0c4d\u0c30\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c28\u0c3f\u0c35\u0c3e\u0c30\u0c02".split("_"),weekdaysShort:"\u0c06\u0c26\u0c3f_\u0c38\u0c4b\u0c2e_\u0c2e\u0c02\u0c17\u0c33_\u0c2c\u0c41\u0c27_\u0c17\u0c41\u0c30\u0c41_\u0c36\u0c41\u0c15\u0c4d\u0c30_\u0c36\u0c28\u0c3f".split("_"),weekdaysMin:"\u0c06_\u0c38\u0c4b_\u0c2e\u0c02_\u0c2c\u0c41_\u0c17\u0c41_\u0c36\u0c41_\u0c36".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c28\u0c47\u0c21\u0c41] LT",nextDay:"[\u0c30\u0c47\u0c2a\u0c41] LT",nextWeek:"dddd, LT",lastDay:"[\u0c28\u0c3f\u0c28\u0c4d\u0c28] LT",lastWeek:"[\u0c17\u0c24] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0c32\u0c4b",past:"%s \u0c15\u0c4d\u0c30\u0c3f\u0c24\u0c02",s:"\u0c15\u0c4a\u0c28\u0c4d\u0c28\u0c3f \u0c15\u0c4d\u0c37\u0c23\u0c3e\u0c32\u0c41",ss:"%d \u0c38\u0c46\u0c15\u0c28\u0c4d\u0c32\u0c41",m:"\u0c12\u0c15 \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c02",mm:"%d \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c3e\u0c32\u0c41",h:"\u0c12\u0c15 \u0c17\u0c02\u0c1f",hh:"%d \u0c17\u0c02\u0c1f\u0c32\u0c41",d:"\u0c12\u0c15 \u0c30\u0c4b\u0c1c\u0c41",dd:"%d \u0c30\u0c4b\u0c1c\u0c41\u0c32\u0c41",M:"\u0c12\u0c15 \u0c28\u0c46\u0c32",MM:"%d \u0c28\u0c46\u0c32\u0c32\u0c41",y:"\u0c12\u0c15 \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c02",yy:"%d \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c3e\u0c32\u0c41"},dayOfMonthOrdinalParse:/\d{1,2}\u0c35/,ordinal:"%d\u0c35",meridiemParse:/\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f|\u0c09\u0c26\u0c2f\u0c02|\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02|\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"===a?e<4?e:e+12:"\u0c09\u0c26\u0c2f\u0c02"===a?e:"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02"===a?10<=e?e:e+12:"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02"===a?e+12:void 0},meridiem:function(e,a,t){return e<4?"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f":e<10?"\u0c09\u0c26\u0c2f\u0c02":e<17?"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02":e<20?"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02":"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"},week:{dow:0,doy:6}}),M.defineLocale("tet",{months:"Janeiru_Fevereiru_Marsu_Abril_Maiu_Ju\xf1u_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu".split("_"),weekdaysShort:"Dom_Seg_Ters_Kua_Kint_Sest_Sab".split("_"),weekdaysMin:"Do_Seg_Te_Ku_Ki_Ses_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Ohin iha] LT",nextDay:"[Aban iha] LT",nextWeek:"dddd [iha] LT",lastDay:"[Horiseik iha] LT",lastWeek:"dddd [semana kotuk] [iha] LT",sameElse:"L"},relativeTime:{future:"iha %s",past:"%s liuba",s:"segundu balun",ss:"segundu %d",m:"minutu ida",mm:"minutu %d",h:"oras ida",hh:"oras %d",d:"loron ida",dd:"loron %d",M:"fulan ida",MM:"fulan %d",y:"tinan ida",yy:"tinan %d"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")},week:{dow:1,doy:4}}),{0:"-\u0443\u043c",1:"-\u0443\u043c",2:"-\u044e\u043c",3:"-\u044e\u043c",4:"-\u0443\u043c",5:"-\u0443\u043c",6:"-\u0443\u043c",7:"-\u0443\u043c",8:"-\u0443\u043c",9:"-\u0443\u043c",10:"-\u0443\u043c",12:"-\u0443\u043c",13:"-\u0443\u043c",20:"-\u0443\u043c",30:"-\u044e\u043c",40:"-\u0443\u043c",50:"-\u0443\u043c",60:"-\u0443\u043c",70:"-\u0443\u043c",80:"-\u0443\u043c",90:"-\u0443\u043c",100:"-\u0443\u043c"}),Hn=(M.defineLocale("tg",{months:{format:"\u044f\u043d\u0432\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0430\u043b\u0438_\u043c\u0430\u0440\u0442\u0438_\u0430\u043f\u0440\u0435\u043b\u0438_\u043c\u0430\u0439\u0438_\u0438\u044e\u043d\u0438_\u0438\u044e\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442\u0438_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u0438_\u043e\u043a\u0442\u044f\u0431\u0440\u0438_\u043d\u043e\u044f\u0431\u0440\u0438_\u0434\u0435\u043a\u0430\u0431\u0440\u0438".split("_"),standalone:"\u044f\u043d\u0432\u0430\u0440_\u0444\u0435\u0432\u0440\u0430\u043b_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440_\u043e\u043a\u0442\u044f\u0431\u0440_\u043d\u043e\u044f\u0431\u0440_\u0434\u0435\u043a\u0430\u0431\u0440".split("_")},monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u044f\u043a\u0448\u0430\u043d\u0431\u0435_\u0434\u0443\u0448\u0430\u043d\u0431\u0435_\u0441\u0435\u0448\u0430\u043d\u0431\u0435_\u0447\u043e\u0440\u0448\u0430\u043d\u0431\u0435_\u043f\u0430\u043d\u04b7\u0448\u0430\u043d\u0431\u0435_\u04b7\u0443\u043c\u044a\u0430_\u0448\u0430\u043d\u0431\u0435".split("_"),weekdaysShort:"\u044f\u0448\u0431_\u0434\u0448\u0431_\u0441\u0448\u0431_\u0447\u0448\u0431_\u043f\u0448\u0431_\u04b7\u0443\u043c_\u0448\u043d\u0431".split("_"),weekdaysMin:"\u044f\u0448_\u0434\u0448_\u0441\u0448_\u0447\u0448_\u043f\u0448_\u04b7\u043c_\u0448\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0418\u043c\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextDay:"[\u0424\u0430\u0440\u0434\u043e \u0441\u043e\u0430\u0442\u0438] LT",lastDay:"[\u0414\u0438\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u043e\u044f\u043d\u0434\u0430 \u0441\u043e\u0430\u0442\u0438] LT",lastWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u0433\u0443\u0437\u0430\u0448\u0442\u0430 \u0441\u043e\u0430\u0442\u0438] LT",sameElse:"L"},relativeTime:{future:"\u0431\u0430\u044a\u0434\u0438 %s",past:"%s \u043f\u0435\u0448",s:"\u044f\u043a\u0447\u0430\u043d\u0434 \u0441\u043e\u043d\u0438\u044f",m:"\u044f\u043a \u0434\u0430\u049b\u0438\u049b\u0430",mm:"%d \u0434\u0430\u049b\u0438\u049b\u0430",h:"\u044f\u043a \u0441\u043e\u0430\u0442",hh:"%d \u0441\u043e\u0430\u0442",d:"\u044f\u043a \u0440\u04ef\u0437",dd:"%d \u0440\u04ef\u0437",M:"\u044f\u043a \u043c\u043e\u04b3",MM:"%d \u043c\u043e\u04b3",y:"\u044f\u043a \u0441\u043e\u043b",yy:"%d \u0441\u043e\u043b"},meridiemParse:/\u0448\u0430\u0431|\u0441\u0443\u0431\u04b3|\u0440\u04ef\u0437|\u0431\u0435\u0433\u043e\u04b3/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u0448\u0430\u0431"===a?e<4?e:e+12:"\u0441\u0443\u0431\u04b3"===a?e:"\u0440\u04ef\u0437"===a?11<=e?e:e+12:"\u0431\u0435\u0433\u043e\u04b3"===a?e+12:void 0},meridiem:function(e,a,t){return e<4?"\u0448\u0430\u0431":e<11?"\u0441\u0443\u0431\u04b3":e<16?"\u0440\u04ef\u0437":e<19?"\u0431\u0435\u0433\u043e\u04b3":"\u0448\u0430\u0431"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0443\u043c|\u044e\u043c)/,ordinal:function(e){return e+(Sn[e]||Sn[e%10]||Sn[100<=e?100:null])},week:{dow:1,doy:7}}),M.defineLocale("th",{months:"\u0e21\u0e01\u0e23\u0e32\u0e04\u0e21_\u0e01\u0e38\u0e21\u0e20\u0e32\u0e1e\u0e31\u0e19\u0e18\u0e4c_\u0e21\u0e35\u0e19\u0e32\u0e04\u0e21_\u0e40\u0e21\u0e29\u0e32\u0e22\u0e19_\u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21_\u0e21\u0e34\u0e16\u0e38\u0e19\u0e32\u0e22\u0e19_\u0e01\u0e23\u0e01\u0e0e\u0e32\u0e04\u0e21_\u0e2a\u0e34\u0e07\u0e2b\u0e32\u0e04\u0e21_\u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19_\u0e15\u0e38\u0e25\u0e32\u0e04\u0e21_\u0e1e\u0e24\u0e28\u0e08\u0e34\u0e01\u0e32\u0e22\u0e19_\u0e18\u0e31\u0e19\u0e27\u0e32\u0e04\u0e21".split("_"),monthsShort:"\u0e21.\u0e04._\u0e01.\u0e1e._\u0e21\u0e35.\u0e04._\u0e40\u0e21.\u0e22._\u0e1e.\u0e04._\u0e21\u0e34.\u0e22._\u0e01.\u0e04._\u0e2a.\u0e04._\u0e01.\u0e22._\u0e15.\u0e04._\u0e1e.\u0e22._\u0e18.\u0e04.".split("_"),monthsParseExact:!0,weekdays:"\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c_\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c_\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23_\u0e1e\u0e38\u0e18_\u0e1e\u0e24\u0e2b\u0e31\u0e2a\u0e1a\u0e14\u0e35_\u0e28\u0e38\u0e01\u0e23\u0e4c_\u0e40\u0e2a\u0e32\u0e23\u0e4c".split("_"),weekdaysShort:"\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c_\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c_\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23_\u0e1e\u0e38\u0e18_\u0e1e\u0e24\u0e2b\u0e31\u0e2a_\u0e28\u0e38\u0e01\u0e23\u0e4c_\u0e40\u0e2a\u0e32\u0e23\u0e4c".split("_"),weekdaysMin:"\u0e2d\u0e32._\u0e08._\u0e2d._\u0e1e._\u0e1e\u0e24._\u0e28._\u0e2a.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY \u0e40\u0e27\u0e25\u0e32 H:mm",LLLL:"\u0e27\u0e31\u0e19dddd\u0e17\u0e35\u0e48 D MMMM YYYY \u0e40\u0e27\u0e25\u0e32 H:mm"},meridiemParse:/\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07|\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07/,isPM:function(e){return"\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07"===e},meridiem:function(e,a,t){return e<12?"\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07":"\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07"},calendar:{sameDay:"[\u0e27\u0e31\u0e19\u0e19\u0e35\u0e49 \u0e40\u0e27\u0e25\u0e32] LT",nextDay:"[\u0e1e\u0e23\u0e38\u0e48\u0e07\u0e19\u0e35\u0e49 \u0e40\u0e27\u0e25\u0e32] LT",nextWeek:"dddd[\u0e2b\u0e19\u0e49\u0e32 \u0e40\u0e27\u0e25\u0e32] LT",lastDay:"[\u0e40\u0e21\u0e37\u0e48\u0e2d\u0e27\u0e32\u0e19\u0e19\u0e35\u0e49 \u0e40\u0e27\u0e25\u0e32] LT",lastWeek:"[\u0e27\u0e31\u0e19]dddd[\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27 \u0e40\u0e27\u0e25\u0e32] LT",sameElse:"L"},relativeTime:{future:"\u0e2d\u0e35\u0e01 %s",past:"%s\u0e17\u0e35\u0e48\u0e41\u0e25\u0e49\u0e27",s:"\u0e44\u0e21\u0e48\u0e01\u0e35\u0e48\u0e27\u0e34\u0e19\u0e32\u0e17\u0e35",ss:"%d \u0e27\u0e34\u0e19\u0e32\u0e17\u0e35",m:"1 \u0e19\u0e32\u0e17\u0e35",mm:"%d \u0e19\u0e32\u0e17\u0e35",h:"1 \u0e0a\u0e31\u0e48\u0e27\u0e42\u0e21\u0e07",hh:"%d \u0e0a\u0e31\u0e48\u0e27\u0e42\u0e21\u0e07",d:"1 \u0e27\u0e31\u0e19",dd:"%d \u0e27\u0e31\u0e19",w:"1 \u0e2a\u0e31\u0e1b\u0e14\u0e32\u0e2b\u0e4c",ww:"%d \u0e2a\u0e31\u0e1b\u0e14\u0e32\u0e2b\u0e4c",M:"1 \u0e40\u0e14\u0e37\u0e2d\u0e19",MM:"%d \u0e40\u0e14\u0e37\u0e2d\u0e19",y:"1 \u0e1b\u0e35",yy:"%d \u0e1b\u0e35"}}),{1:"'inji",5:"'inji",8:"'inji",70:"'inji",80:"'inji",2:"'nji",7:"'nji",20:"'nji",50:"'nji",3:"'\xfcnji",4:"'\xfcnji",100:"'\xfcnji",6:"'njy",9:"'unjy",10:"'unjy",30:"'unjy",60:"'ynjy",90:"'ynjy"}),vn=(M.defineLocale("tk",{months:"\xddanwar_Fewral_Mart_Aprel_Ma\xfd_I\xfdun_I\xfdul_Awgust_Sent\xfdabr_Okt\xfdabr_No\xfdabr_Dekabr".split("_"),monthsShort:"\xddan_Few_Mar_Apr_Ma\xfd_I\xfdn_I\xfdl_Awg_Sen_Okt_No\xfd_Dek".split("_"),weekdays:"\xddek\u015fenbe_Du\u015fenbe_Si\u015fenbe_\xc7ar\u015fenbe_Pen\u015fenbe_Anna_\u015eenbe".split("_"),weekdaysShort:"\xddek_Du\u015f_Si\u015f_\xc7ar_Pen_Ann_\u015een".split("_"),weekdaysMin:"\xddk_D\u015f_S\u015f_\xc7r_Pn_An_\u015en".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn sagat] LT",nextDay:"[ertir sagat] LT",nextWeek:"[indiki] dddd [sagat] LT",lastDay:"[d\xfc\xfdn] LT",lastWeek:"[ge\xe7en] dddd [sagat] LT",sameElse:"L"},relativeTime:{future:"%s so\u0148",past:"%s \xf6\u0148",s:"birn\xe4\xe7e sekunt",m:"bir minut",mm:"%d minut",h:"bir sagat",hh:"%d sagat",d:"bir g\xfcn",dd:"%d g\xfcn",M:"bir a\xfd",MM:"%d a\xfd",y:"bir \xfdyl",yy:"%d \xfdyl"},ordinal:function(e,a){switch(a){case"d":case"D":case"Do":case"DD":return e;default:if(0===e)return e+"'unjy";var t=e%10;return e+(Hn[t]||Hn[e%100-t]||Hn[100<=e?100:null])}},week:{dow:1,doy:7}}),M.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(e){return e},week:{dow:1,doy:4}}),"pagh_wa\u2019_cha\u2019_wej_loS_vagh_jav_Soch_chorgh_Hut".split("_"));function jn(e,a,t,s){var n=function(e){var a=Math.floor(e%1e3/100),t=Math.floor(e%100/10),e=e%10,s="";0<a&&(s+=vn[a]+"vatlh");0<t&&(s+=(""!==s?" ":"")+vn[t]+"maH");0<e&&(s+=(""!==s?" ":"")+vn[e]);return""===s?"pagh":s}(e);switch(t){case"ss":return n+" lup";case"mm":return n+" tup";case"hh":return n+" rep";case"dd":return n+" jaj";case"MM":return n+" jar";case"yy":return n+" DIS"}}M.defineLocale("tlh",{months:"tera\u2019 jar wa\u2019_tera\u2019 jar cha\u2019_tera\u2019 jar wej_tera\u2019 jar loS_tera\u2019 jar vagh_tera\u2019 jar jav_tera\u2019 jar Soch_tera\u2019 jar chorgh_tera\u2019 jar Hut_tera\u2019 jar wa\u2019maH_tera\u2019 jar wa\u2019maH wa\u2019_tera\u2019 jar wa\u2019maH cha\u2019".split("_"),monthsShort:"jar wa\u2019_jar cha\u2019_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa\u2019maH_jar wa\u2019maH wa\u2019_jar wa\u2019maH cha\u2019".split("_"),monthsParseExact:!0,weekdays:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysShort:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysMin:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[DaHjaj] LT",nextDay:"[wa\u2019leS] LT",nextWeek:"LLL",lastDay:"[wa\u2019Hu\u2019] LT",lastWeek:"LLL",sameElse:"L"},relativeTime:{future:function(e){var a=e;return a=-1!==e.indexOf("jaj")?a.slice(0,-3)+"leS":-1!==e.indexOf("jar")?a.slice(0,-3)+"waQ":-1!==e.indexOf("DIS")?a.slice(0,-3)+"nem":a+" pIq"},past:function(e){var a=e;return a=-1!==e.indexOf("jaj")?a.slice(0,-3)+"Hu\u2019":-1!==e.indexOf("jar")?a.slice(0,-3)+"wen":-1!==e.indexOf("DIS")?a.slice(0,-3)+"ben":a+" ret"},s:"puS lup",ss:jn,m:"wa\u2019 tup",mm:jn,h:"wa\u2019 rep",hh:jn,d:"wa\u2019 jaj",dd:jn,M:"wa\u2019 jar",MM:jn,y:"wa\u2019 DIS",yy:jn},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});var xn={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'\xfcnc\xfc",4:"'\xfcnc\xfc",100:"'\xfcnc\xfc",6:"'nc\u0131",9:"'uncu",10:"'uncu",30:"'uncu",60:"'\u0131nc\u0131",90:"'\u0131nc\u0131"};function Pn(e,a,t,s){e={s:["viensas secunds","'iensas secunds"],ss:[e+" secunds",e+" secunds"],m:["'n m\xedut","'iens m\xedut"],mm:[e+" m\xeduts",e+" m\xeduts"],h:["'n \xfeora","'iensa \xfeora"],hh:[e+" \xfeoras",e+" \xfeoras"],d:["'n ziua","'iensa ziua"],dd:[e+" ziuas",e+" ziuas"],M:["'n mes","'iens mes"],MM:[e+" mesen",e+" mesen"],y:["'n ar","'iens ar"],yy:[e+" ars",e+" ars"]};return s||a?e[t][0]:e[t][1]}function On(e,a,t){return"m"===t?a?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443":"h"===t?a?"\u0433\u043e\u0434\u0438\u043d\u0430":"\u0433\u043e\u0434\u0438\u043d\u0443":e+" "+(e=+e,a=(a={ss:a?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434",mm:a?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d",hh:a?"\u0433\u043e\u0434\u0438\u043d\u0430_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d":"\u0433\u043e\u0434\u0438\u043d\u0443_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u043d\u0456\u0432",MM:"\u043c\u0456\u0441\u044f\u0446\u044c_\u043c\u0456\u0441\u044f\u0446\u0456_\u043c\u0456\u0441\u044f\u0446\u0456\u0432",yy:"\u0440\u0456\u043a_\u0440\u043e\u043a\u0438_\u0440\u043e\u043a\u0456\u0432"}[t]).split("_"),e%10==1&&e%100!=11?a[0]:2<=e%10&&e%10<=4&&(e%100<10||20<=e%100)?a[1]:a[2])}function Wn(e){return function(){return e+"\u043e"+(11===this.hours()?"\u0431":"")+"] LT"}}M.defineLocale("tr",{months:"Ocak_\u015eubat_Mart_Nisan_May\u0131s_Haziran_Temmuz_A\u011fustos_Eyl\xfcl_Ekim_Kas\u0131m_Aral\u0131k".split("_"),monthsShort:"Oca_\u015eub_Mar_Nis_May_Haz_Tem_A\u011fu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Sal\u0131_\xc7ar\u015famba_Per\u015fembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pzt_Sal_\xc7ar_Per_Cum_Cmt".split("_"),weekdaysMin:"Pz_Pt_Sa_\xc7a_Pe_Cu_Ct".split("_"),meridiem:function(e,a,t){return e<12?t?"\xf6\xf6":"\xd6\xd6":t?"\xf6s":"\xd6S"},meridiemParse:/\xf6\xf6|\xd6\xd6|\xf6s|\xd6S/,isPM:function(e){return"\xf6s"===e||"\xd6S"===e},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn saat] LT",nextDay:"[yar\u0131n saat] LT",nextWeek:"[gelecek] dddd [saat] LT",lastDay:"[d\xfcn] LT",lastWeek:"[ge\xe7en] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s \xf6nce",s:"birka\xe7 saniye",ss:"%d saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir g\xfcn",dd:"%d g\xfcn",w:"bir hafta",ww:"%d hafta",M:"bir ay",MM:"%d ay",y:"bir y\u0131l",yy:"%d y\u0131l"},ordinal:function(e,a){switch(a){case"d":case"D":case"Do":case"DD":return e;default:if(0===e)return e+"'\u0131nc\u0131";var t=e%10;return e+(xn[t]||xn[e%100-t]||xn[100<=e?100:null])}},week:{dow:1,doy:7}}),M.defineLocale("tzl",{months:"Januar_Fevraglh_Mar\xe7_Avr\xefu_Mai_G\xfcn_Julia_Guscht_Setemvar_Listop\xe4ts_Noemvar_Zecemvar".split("_"),monthsShort:"Jan_Fev_Mar_Avr_Mai_G\xfcn_Jul_Gus_Set_Lis_Noe_Zec".split("_"),weekdays:"S\xfaladi_L\xfane\xe7i_Maitzi_M\xe1rcuri_Xh\xfaadi_Vi\xe9ner\xe7i_S\xe1turi".split("_"),weekdaysShort:"S\xfal_L\xfan_Mai_M\xe1r_Xh\xfa_Vi\xe9_S\xe1t".split("_"),weekdaysMin:"S\xfa_L\xfa_Ma_M\xe1_Xh_Vi_S\xe1".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM [dallas] YYYY",LLL:"D. MMMM [dallas] YYYY HH.mm",LLLL:"dddd, [li] D. MMMM [dallas] YYYY HH.mm"},meridiemParse:/d\'o|d\'a/i,isPM:function(e){return"d'o"===e.toLowerCase()},meridiem:function(e,a,t){return 11<e?t?"d'o":"D'O":t?"d'a":"D'A"},calendar:{sameDay:"[oxhi \xe0] LT",nextDay:"[dem\xe0 \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[ieiri \xe0] LT",lastWeek:"[s\xfcr el] dddd [lasteu \xe0] LT",sameElse:"L"},relativeTime:{future:"osprei %s",past:"ja%s",s:Pn,ss:Pn,m:Pn,mm:Pn,h:Pn,hh:Pn,d:Pn,dd:Pn,M:Pn,MM:Pn,y:Pn,yy:Pn},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),M.defineLocale("tzm-latn",{months:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",ss:"%d imik",m:"minu\u1e0d",mm:"%d minu\u1e0d",h:"sa\u025ba",hh:"%d tassa\u025bin",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}}),M.defineLocale("tzm",{months:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),monthsShort:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),weekdays:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysShort:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysMin:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u2d30\u2d59\u2d37\u2d45 \u2d34] LT",nextDay:"[\u2d30\u2d59\u2d3d\u2d30 \u2d34] LT",nextWeek:"dddd [\u2d34] LT",lastDay:"[\u2d30\u2d5a\u2d30\u2d4f\u2d5c \u2d34] LT",lastWeek:"dddd [\u2d34] LT",sameElse:"L"},relativeTime:{future:"\u2d37\u2d30\u2d37\u2d45 \u2d59 \u2d62\u2d30\u2d4f %s",past:"\u2d62\u2d30\u2d4f %s",s:"\u2d49\u2d4e\u2d49\u2d3d",ss:"%d \u2d49\u2d4e\u2d49\u2d3d",m:"\u2d4e\u2d49\u2d4f\u2d53\u2d3a",mm:"%d \u2d4e\u2d49\u2d4f\u2d53\u2d3a",h:"\u2d59\u2d30\u2d44\u2d30",hh:"%d \u2d5c\u2d30\u2d59\u2d59\u2d30\u2d44\u2d49\u2d4f",d:"\u2d30\u2d59\u2d59",dd:"%d o\u2d59\u2d59\u2d30\u2d4f",M:"\u2d30\u2d62o\u2d53\u2d54",MM:"%d \u2d49\u2d62\u2d62\u2d49\u2d54\u2d4f",y:"\u2d30\u2d59\u2d33\u2d30\u2d59",yy:"%d \u2d49\u2d59\u2d33\u2d30\u2d59\u2d4f"},week:{dow:6,doy:12}}),M.defineLocale("ug-cn",{months:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),monthsShort:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),weekdays:"\u064a\u06d5\u0643\u0634\u06d5\u0646\u0628\u06d5_\u062f\u06c8\u0634\u06d5\u0646\u0628\u06d5_\u0633\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u0686\u0627\u0631\u0634\u06d5\u0646\u0628\u06d5_\u067e\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u062c\u06c8\u0645\u06d5_\u0634\u06d5\u0646\u0628\u06d5".split("_"),weekdaysShort:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),weekdaysMin:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649",LLL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm",LLLL:"dddd\u060c YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm"},meridiemParse:/\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5|\u0633\u06d5\u06be\u06d5\u0631|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646|\u0686\u06c8\u0634|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646|\u0643\u06d5\u0686/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5"===a||"\u0633\u06d5\u06be\u06d5\u0631"===a||"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646"===a||"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646"!==a&&"\u0643\u06d5\u0686"!==a&&11<=e?e:e+12},meridiem:function(e,a,t){e=100*e+a;return e<600?"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5":e<900?"\u0633\u06d5\u06be\u06d5\u0631":e<1130?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646":e<1230?"\u0686\u06c8\u0634":e<1800?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646":"\u0643\u06d5\u0686"},calendar:{sameDay:"[\u0628\u06c8\u06af\u06c8\u0646 \u0633\u0627\u0626\u06d5\u062a] LT",nextDay:"[\u0626\u06d5\u062a\u06d5 \u0633\u0627\u0626\u06d5\u062a] LT",nextWeek:"[\u0643\u06d0\u0644\u06d5\u0631\u0643\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",lastDay:"[\u062a\u06c6\u0646\u06c8\u06af\u06c8\u0646] LT",lastWeek:"[\u0626\u0627\u0644\u062f\u0649\u0646\u0642\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0643\u06d0\u064a\u0649\u0646",past:"%s \u0628\u06c7\u0631\u06c7\u0646",s:"\u0646\u06d5\u0686\u0686\u06d5 \u0633\u06d0\u0643\u0648\u0646\u062a",ss:"%d \u0633\u06d0\u0643\u0648\u0646\u062a",m:"\u0628\u0649\u0631 \u0645\u0649\u0646\u06c7\u062a",mm:"%d \u0645\u0649\u0646\u06c7\u062a",h:"\u0628\u0649\u0631 \u0633\u0627\u0626\u06d5\u062a",hh:"%d \u0633\u0627\u0626\u06d5\u062a",d:"\u0628\u0649\u0631 \u0643\u06c8\u0646",dd:"%d \u0643\u06c8\u0646",M:"\u0628\u0649\u0631 \u0626\u0627\u064a",MM:"%d \u0626\u0627\u064a",y:"\u0628\u0649\u0631 \u064a\u0649\u0644",yy:"%d \u064a\u0649\u0644"},dayOfMonthOrdinalParse:/\d{1,2}(-\u0643\u06c8\u0646\u0649|-\u0626\u0627\u064a|-\u06be\u06d5\u067e\u062a\u06d5)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"-\u0643\u06c8\u0646\u0649";case"w":case"W":return e+"-\u06be\u06d5\u067e\u062a\u06d5";default:return e}},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:1,doy:7}}),M.defineLocale("uk",{months:{format:"\u0441\u0456\u0447\u043d\u044f_\u043b\u044e\u0442\u043e\u0433\u043e_\u0431\u0435\u0440\u0435\u0437\u043d\u044f_\u043a\u0432\u0456\u0442\u043d\u044f_\u0442\u0440\u0430\u0432\u043d\u044f_\u0447\u0435\u0440\u0432\u043d\u044f_\u043b\u0438\u043f\u043d\u044f_\u0441\u0435\u0440\u043f\u043d\u044f_\u0432\u0435\u0440\u0435\u0441\u043d\u044f_\u0436\u043e\u0432\u0442\u043d\u044f_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434\u0430_\u0433\u0440\u0443\u0434\u043d\u044f".split("_"),standalone:"\u0441\u0456\u0447\u0435\u043d\u044c_\u043b\u044e\u0442\u0438\u0439_\u0431\u0435\u0440\u0435\u0437\u0435\u043d\u044c_\u043a\u0432\u0456\u0442\u0435\u043d\u044c_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u0435\u0440\u0432\u0435\u043d\u044c_\u043b\u0438\u043f\u0435\u043d\u044c_\u0441\u0435\u0440\u043f\u0435\u043d\u044c_\u0432\u0435\u0440\u0435\u0441\u0435\u043d\u044c_\u0436\u043e\u0432\u0442\u0435\u043d\u044c_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434_\u0433\u0440\u0443\u0434\u0435\u043d\u044c".split("_")},monthsShort:"\u0441\u0456\u0447_\u043b\u044e\u0442_\u0431\u0435\u0440_\u043a\u0432\u0456\u0442_\u0442\u0440\u0430\u0432_\u0447\u0435\u0440\u0432_\u043b\u0438\u043f_\u0441\u0435\u0440\u043f_\u0432\u0435\u0440_\u0436\u043e\u0432\u0442_\u043b\u0438\u0441\u0442_\u0433\u0440\u0443\u0434".split("_"),weekdays:function(e,a){var t={nominative:"\u043d\u0435\u0434\u0456\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044f_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),accusative:"\u043d\u0435\u0434\u0456\u043b\u044e_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044e_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),genitive:"\u043d\u0435\u0434\u0456\u043b\u0456_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043a\u0430_\u0432\u0456\u0432\u0442\u043e\u0440\u043a\u0430_\u0441\u0435\u0440\u0435\u0434\u0438_\u0447\u0435\u0442\u0432\u0435\u0440\u0433\u0430_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u0456_\u0441\u0443\u0431\u043e\u0442\u0438".split("_")};return!0===e?t.nominative.slice(1,7).concat(t.nominative.slice(0,1)):e?t[/(\[[\u0412\u0432\u0423\u0443]\]) ?dddd/.test(a)?"accusative":/\[?(?:\u043c\u0438\u043d\u0443\u043b\u043e\u0457|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u043e\u0457)? ?\] ?dddd/.test(a)?"genitive":"nominative"][e.day()]:t.nominative},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0440.",LLL:"D MMMM YYYY \u0440., HH:mm",LLLL:"dddd, D MMMM YYYY \u0440., HH:mm"},calendar:{sameDay:Wn("[\u0421\u044c\u043e\u0433\u043e\u0434\u043d\u0456 "),nextDay:Wn("[\u0417\u0430\u0432\u0442\u0440\u0430 "),lastDay:Wn("[\u0412\u0447\u043e\u0440\u0430 "),nextWeek:Wn("[\u0423] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return Wn("[\u041c\u0438\u043d\u0443\u043b\u043e\u0457] dddd [").call(this);case 1:case 2:case 4:return Wn("[\u041c\u0438\u043d\u0443\u043b\u043e\u0433\u043e] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"%s \u0442\u043e\u043c\u0443",s:"\u0434\u0435\u043a\u0456\u043b\u044c\u043a\u0430 \u0441\u0435\u043a\u0443\u043d\u0434",ss:On,m:On,mm:On,h:"\u0433\u043e\u0434\u0438\u043d\u0443",hh:On,d:"\u0434\u0435\u043d\u044c",dd:On,M:"\u043c\u0456\u0441\u044f\u0446\u044c",MM:On,y:"\u0440\u0456\u043a",yy:On},meridiemParse:/\u043d\u043e\u0447\u0456|\u0440\u0430\u043d\u043a\u0443|\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430/,isPM:function(e){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430)$/.test(e)},meridiem:function(e,a,t){return e<4?"\u043d\u043e\u0447\u0456":e<12?"\u0440\u0430\u043d\u043a\u0443":e<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u043e\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e)/,ordinal:function(e,a){switch(a){case"M":case"d":case"DDD":case"w":case"W":return e+"-\u0439";case"D":return e+"-\u0433\u043e";default:return e}},week:{dow:1,doy:7}});jt=["\u062c\u0646\u0648\u0631\u06cc","\u0641\u0631\u0648\u0631\u06cc","\u0645\u0627\u0631\u0686","\u0627\u067e\u0631\u06cc\u0644","\u0645\u0626\u06cc","\u062c\u0648\u0646","\u062c\u0648\u0644\u0627\u0626\u06cc","\u0627\u06af\u0633\u062a","\u0633\u062a\u0645\u0628\u0631","\u0627\u06a9\u062a\u0648\u0628\u0631","\u0646\u0648\u0645\u0628\u0631","\u062f\u0633\u0645\u0628\u0631"],vt=["\u0627\u062a\u0648\u0627\u0631","\u067e\u06cc\u0631","\u0645\u0646\u06af\u0644","\u0628\u062f\u06be","\u062c\u0645\u0639\u0631\u0627\u062a","\u062c\u0645\u0639\u06c1","\u06c1\u0641\u062a\u06c1"];return M.defineLocale("ur",{months:jt,monthsShort:jt,weekdays:vt,weekdaysShort:vt,weekdaysMin:vt,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd\u060c D MMMM YYYY HH:mm"},meridiemParse:/\u0635\u0628\u062d|\u0634\u0627\u0645/,isPM:function(e){return"\u0634\u0627\u0645"===e},meridiem:function(e,a,t){return e<12?"\u0635\u0628\u062d":"\u0634\u0627\u0645"},calendar:{sameDay:"[\u0622\u062c \u0628\u0648\u0642\u062a] LT",nextDay:"[\u06a9\u0644 \u0628\u0648\u0642\u062a] LT",nextWeek:"dddd [\u0628\u0648\u0642\u062a] LT",lastDay:"[\u06af\u0630\u0634\u062a\u06c1 \u0631\u0648\u0632 \u0628\u0648\u0642\u062a] LT",lastWeek:"[\u06af\u0630\u0634\u062a\u06c1] dddd [\u0628\u0648\u0642\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0628\u0639\u062f",past:"%s \u0642\u0628\u0644",s:"\u0686\u0646\u062f \u0633\u06cc\u06a9\u0646\u0688",ss:"%d \u0633\u06cc\u06a9\u0646\u0688",m:"\u0627\u06cc\u06a9 \u0645\u0646\u0679",mm:"%d \u0645\u0646\u0679",h:"\u0627\u06cc\u06a9 \u06af\u06be\u0646\u0679\u06c1",hh:"%d \u06af\u06be\u0646\u0679\u06d2",d:"\u0627\u06cc\u06a9 \u062f\u0646",dd:"%d \u062f\u0646",M:"\u0627\u06cc\u06a9 \u0645\u0627\u06c1",MM:"%d \u0645\u0627\u06c1",y:"\u0627\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(e){return e.replace(/\u060c/g,",")},postformat:function(e){return e.replace(/,/g,"\u060c")},week:{dow:1,doy:4}}),M.defineLocale("uz-latn",{months:"Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr".split("_"),monthsShort:"Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek".split("_"),weekdays:"Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba".split("_"),weekdaysShort:"Yak_Dush_Sesh_Chor_Pay_Jum_Shan".split("_"),weekdaysMin:"Ya_Du_Se_Cho_Pa_Ju_Sha".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Bugun soat] LT [da]",nextDay:"[Ertaga] LT [da]",nextWeek:"dddd [kuni soat] LT [da]",lastDay:"[Kecha soat] LT [da]",lastWeek:"[O'tgan] dddd [kuni soat] LT [da]",sameElse:"L"},relativeTime:{future:"Yaqin %s ichida",past:"Bir necha %s oldin",s:"soniya",ss:"%d soniya",m:"bir daqiqa",mm:"%d daqiqa",h:"bir soat",hh:"%d soat",d:"bir kun",dd:"%d kun",M:"bir oy",MM:"%d oy",y:"bir yil",yy:"%d yil"},week:{dow:1,doy:7}}),M.defineLocale("uz",{months:"\u044f\u043d\u0432\u0430\u0440_\u0444\u0435\u0432\u0440\u0430\u043b_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440_\u043e\u043a\u0442\u044f\u0431\u0440_\u043d\u043e\u044f\u0431\u0440_\u0434\u0435\u043a\u0430\u0431\u0440".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u042f\u043a\u0448\u0430\u043d\u0431\u0430_\u0414\u0443\u0448\u0430\u043d\u0431\u0430_\u0421\u0435\u0448\u0430\u043d\u0431\u0430_\u0427\u043e\u0440\u0448\u0430\u043d\u0431\u0430_\u041f\u0430\u0439\u0448\u0430\u043d\u0431\u0430_\u0416\u0443\u043c\u0430_\u0428\u0430\u043d\u0431\u0430".split("_"),weekdaysShort:"\u042f\u043a\u0448_\u0414\u0443\u0448_\u0421\u0435\u0448_\u0427\u043e\u0440_\u041f\u0430\u0439_\u0416\u0443\u043c_\u0428\u0430\u043d".split("_"),weekdaysMin:"\u042f\u043a_\u0414\u0443_\u0421\u0435_\u0427\u043e_\u041f\u0430_\u0416\u0443_\u0428\u0430".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[\u0411\u0443\u0433\u0443\u043d \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",nextDay:"[\u042d\u0440\u0442\u0430\u0433\u0430] LT [\u0434\u0430]",nextWeek:"dddd [\u043a\u0443\u043d\u0438 \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",lastDay:"[\u041a\u0435\u0447\u0430 \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",lastWeek:"[\u0423\u0442\u0433\u0430\u043d] dddd [\u043a\u0443\u043d\u0438 \u0441\u043e\u0430\u0442] LT [\u0434\u0430]",sameElse:"L"},relativeTime:{future:"\u042f\u043a\u0438\u043d %s \u0438\u0447\u0438\u0434\u0430",past:"\u0411\u0438\u0440 \u043d\u0435\u0447\u0430 %s \u043e\u043b\u0434\u0438\u043d",s:"\u0444\u0443\u0440\u0441\u0430\u0442",ss:"%d \u0444\u0443\u0440\u0441\u0430\u0442",m:"\u0431\u0438\u0440 \u0434\u0430\u043a\u0438\u043a\u0430",mm:"%d \u0434\u0430\u043a\u0438\u043a\u0430",h:"\u0431\u0438\u0440 \u0441\u043e\u0430\u0442",hh:"%d \u0441\u043e\u0430\u0442",d:"\u0431\u0438\u0440 \u043a\u0443\u043d",dd:"%d \u043a\u0443\u043d",M:"\u0431\u0438\u0440 \u043e\u0439",MM:"%d \u043e\u0439",y:"\u0431\u0438\u0440 \u0439\u0438\u043b",yy:"%d \u0439\u0438\u043b"},week:{dow:1,doy:7}}),M.defineLocale("vi",{months:"th\xe1ng 1_th\xe1ng 2_th\xe1ng 3_th\xe1ng 4_th\xe1ng 5_th\xe1ng 6_th\xe1ng 7_th\xe1ng 8_th\xe1ng 9_th\xe1ng 10_th\xe1ng 11_th\xe1ng 12".split("_"),monthsShort:"Thg 01_Thg 02_Thg 03_Thg 04_Thg 05_Thg 06_Thg 07_Thg 08_Thg 09_Thg 10_Thg 11_Thg 12".split("_"),monthsParseExact:!0,weekdays:"ch\u1ee7 nh\u1eadt_th\u1ee9 hai_th\u1ee9 ba_th\u1ee9 t\u01b0_th\u1ee9 n\u0103m_th\u1ee9 s\xe1u_th\u1ee9 b\u1ea3y".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(e){return/^ch$/i.test(e)},meridiem:function(e,a,t){return e<12?t?"sa":"SA":t?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [n\u0103m] YYYY",LLL:"D MMMM [n\u0103m] YYYY HH:mm",LLLL:"dddd, D MMMM [n\u0103m] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[H\xf4m nay l\xfac] LT",nextDay:"[Ng\xe0y mai l\xfac] LT",nextWeek:"dddd [tu\u1ea7n t\u1edbi l\xfac] LT",lastDay:"[H\xf4m qua l\xfac] LT",lastWeek:"dddd [tu\u1ea7n tr\u01b0\u1edbc l\xfac] LT",sameElse:"L"},relativeTime:{future:"%s t\u1edbi",past:"%s tr\u01b0\u1edbc",s:"v\xe0i gi\xe2y",ss:"%d gi\xe2y",m:"m\u1ed9t ph\xfat",mm:"%d ph\xfat",h:"m\u1ed9t gi\u1edd",hh:"%d gi\u1edd",d:"m\u1ed9t ng\xe0y",dd:"%d ng\xe0y",w:"m\u1ed9t tu\u1ea7n",ww:"%d tu\u1ea7n",M:"m\u1ed9t th\xe1ng",MM:"%d th\xe1ng",y:"m\u1ed9t n\u0103m",yy:"%d n\u0103m"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(e){return e},week:{dow:1,doy:4}}),M.defineLocale("x-pseudo",{months:"J~\xe1\xf1\xfa\xe1~r\xfd_F~\xe9br\xfa~\xe1r\xfd_~M\xe1rc~h_\xc1p~r\xedl_~M\xe1\xfd_~J\xfa\xf1\xe9~_J\xfal~\xfd_\xc1\xfa~g\xfast~_S\xe9p~t\xe9mb~\xe9r_\xd3~ct\xf3b~\xe9r_\xd1~\xf3v\xe9m~b\xe9r_~D\xe9c\xe9~mb\xe9r".split("_"),monthsShort:"J~\xe1\xf1_~F\xe9b_~M\xe1r_~\xc1pr_~M\xe1\xfd_~J\xfa\xf1_~J\xfal_~\xc1\xfag_~S\xe9p_~\xd3ct_~\xd1\xf3v_~D\xe9c".split("_"),monthsParseExact:!0,weekdays:"S~\xfa\xf1d\xe1~\xfd_M\xf3~\xf1d\xe1\xfd~_T\xfa\xe9~sd\xe1\xfd~_W\xe9d~\xf1\xe9sd~\xe1\xfd_T~h\xfars~d\xe1\xfd_~Fr\xedd~\xe1\xfd_S~\xe1t\xfar~d\xe1\xfd".split("_"),weekdaysShort:"S~\xfa\xf1_~M\xf3\xf1_~T\xfa\xe9_~W\xe9d_~Th\xfa_~Fr\xed_~S\xe1t".split("_"),weekdaysMin:"S~\xfa_M\xf3~_T\xfa_~W\xe9_T~h_Fr~_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[T~\xf3d\xe1~\xfd \xe1t] LT",nextDay:"[T~\xf3m\xf3~rr\xf3~w \xe1t] LT",nextWeek:"dddd [\xe1t] LT",lastDay:"[\xdd~\xe9st~\xe9rd\xe1~\xfd \xe1t] LT",lastWeek:"[L~\xe1st] dddd [\xe1t] LT",sameElse:"L"},relativeTime:{future:"\xed~\xf1 %s",past:"%s \xe1~g\xf3",s:"\xe1 ~f\xe9w ~s\xe9c\xf3~\xf1ds",ss:"%d s~\xe9c\xf3\xf1~ds",m:"\xe1 ~m\xed\xf1~\xfat\xe9",mm:"%d m~\xed\xf1\xfa~t\xe9s",h:"\xe1~\xf1 h\xf3~\xfar",hh:"%d h~\xf3\xfars",d:"\xe1 ~d\xe1\xfd",dd:"%d d~\xe1\xfds",M:"\xe1 ~m\xf3\xf1~th",MM:"%d m~\xf3\xf1t~hs",y:"\xe1 ~\xfd\xe9\xe1r",yy:"%d \xfd~\xe9\xe1rs"},dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1==a?"st":2==a?"nd":3==a?"rd":"th")},week:{dow:1,doy:4}}),M.defineLocale("yo",{months:"S\u1eb9\u0301r\u1eb9\u0301_E\u0300re\u0300le\u0300_\u1eb8r\u1eb9\u0300na\u0300_I\u0300gbe\u0301_E\u0300bibi_O\u0300ku\u0300du_Ag\u1eb9mo_O\u0300gu\u0301n_Owewe_\u1ecc\u0300wa\u0300ra\u0300_Be\u0301lu\u0301_\u1ecc\u0300p\u1eb9\u0300\u0300".split("_"),monthsShort:"S\u1eb9\u0301r_E\u0300rl_\u1eb8rn_I\u0300gb_E\u0300bi_O\u0300ku\u0300_Ag\u1eb9_O\u0300gu\u0301_Owe_\u1ecc\u0300wa\u0300_Be\u0301l_\u1ecc\u0300p\u1eb9\u0300\u0300".split("_"),weekdays:"A\u0300i\u0300ku\u0301_Aje\u0301_I\u0300s\u1eb9\u0301gun_\u1eccj\u1ecd\u0301ru\u0301_\u1eccj\u1ecd\u0301b\u1ecd_\u1eb8ti\u0300_A\u0300ba\u0301m\u1eb9\u0301ta".split("_"),weekdaysShort:"A\u0300i\u0300k_Aje\u0301_I\u0300s\u1eb9\u0301_\u1eccjr_\u1eccjb_\u1eb8ti\u0300_A\u0300ba\u0301".split("_"),weekdaysMin:"A\u0300i\u0300_Aj_I\u0300s_\u1eccr_\u1eccb_\u1eb8t_A\u0300b".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[O\u0300ni\u0300 ni] LT",nextDay:"[\u1ecc\u0300la ni] LT",nextWeek:"dddd [\u1eccs\u1eb9\u0300 to\u0301n'b\u1ecd] [ni] LT",lastDay:"[A\u0300na ni] LT",lastWeek:"dddd [\u1eccs\u1eb9\u0300 to\u0301l\u1ecd\u0301] [ni] LT",sameElse:"L"},relativeTime:{future:"ni\u0301 %s",past:"%s k\u1ecdja\u0301",s:"i\u0300s\u1eb9ju\u0301 aaya\u0301 die",ss:"aaya\u0301 %d",m:"i\u0300s\u1eb9ju\u0301 kan",mm:"i\u0300s\u1eb9ju\u0301 %d",h:"wa\u0301kati kan",hh:"wa\u0301kati %d",d:"\u1ecdj\u1ecd\u0301 kan",dd:"\u1ecdj\u1ecd\u0301 %d",M:"osu\u0300 kan",MM:"osu\u0300 %d",y:"\u1ecddu\u0301n kan",yy:"\u1ecddu\u0301n %d"},dayOfMonthOrdinalParse:/\u1ecdj\u1ecd\u0301\s\d{1,2}/,ordinal:"\u1ecdj\u1ecd\u0301 %d",week:{dow:1,doy:4}}),M.defineLocale("zh-cn",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u5468\u65e5_\u5468\u4e00_\u5468\u4e8c_\u5468\u4e09_\u5468\u56db_\u5468\u4e94_\u5468\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5Ah\u70b9mm\u5206",LLLL:"YYYY\u5e74M\u6708D\u65e5ddddAh\u70b9mm\u5206",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u51cc\u6668"===a||"\u65e9\u4e0a"===a||"\u4e0a\u5348"===a||"\u4e0b\u5348"!==a&&"\u665a\u4e0a"!==a&&11<=e?e:e+12},meridiem:function(e,a,t){e=100*e+a;return e<600?"\u51cc\u6668":e<900?"\u65e9\u4e0a":e<1130?"\u4e0a\u5348":e<1230?"\u4e2d\u5348":e<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:function(e){return e.week()!==this.week()?"[\u4e0b]dddLT":"[\u672c]dddLT"},lastDay:"[\u6628\u5929]LT",lastWeek:function(e){return this.week()!==e.week()?"[\u4e0a]dddLT":"[\u672c]dddLT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u5468)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"\u65e5";case"M":return e+"\u6708";case"w":case"W":return e+"\u5468";default:return e}},relativeTime:{future:"%s\u540e",past:"%s\u524d",s:"\u51e0\u79d2",ss:"%d \u79d2",m:"1 \u5206\u949f",mm:"%d \u5206\u949f",h:"1 \u5c0f\u65f6",hh:"%d \u5c0f\u65f6",d:"1 \u5929",dd:"%d \u5929",w:"1 \u5468",ww:"%d \u5468",M:"1 \u4e2a\u6708",MM:"%d \u4e2a\u6708",y:"1 \u5e74",yy:"%d \u5e74"},week:{dow:1,doy:4}}),M.defineLocale("zh-hk",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u51cc\u6668"===a||"\u65e9\u4e0a"===a||"\u4e0a\u5348"===a?e:"\u4e2d\u5348"===a?11<=e?e:e+12:"\u4e0b\u5348"===a||"\u665a\u4e0a"===a?e+12:void 0},meridiem:function(e,a,t){e=100*e+a;return e<600?"\u51cc\u6668":e<900?"\u65e9\u4e0a":e<1200?"\u4e0a\u5348":1200===e?"\u4e2d\u5348":e<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"\u65e5";case"M":return e+"\u6708";case"w":case"W":return e+"\u9031";default:return e}},relativeTime:{future:"%s\u5f8c",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}}),M.defineLocale("zh-mo",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"D/M/YYYY",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u51cc\u6668"===a||"\u65e9\u4e0a"===a||"\u4e0a\u5348"===a?e:"\u4e2d\u5348"===a?11<=e?e:e+12:"\u4e0b\u5348"===a||"\u665a\u4e0a"===a?e+12:void 0},meridiem:function(e,a,t){e=100*e+a;return e<600?"\u51cc\u6668":e<900?"\u65e9\u4e0a":e<1130?"\u4e0a\u5348":e<1230?"\u4e2d\u5348":e<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929] LT",nextDay:"[\u660e\u5929] LT",nextWeek:"[\u4e0b]dddd LT",lastDay:"[\u6628\u5929] LT",lastWeek:"[\u4e0a]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"\u65e5";case"M":return e+"\u6708";case"w":case"W":return e+"\u9031";default:return e}},relativeTime:{future:"%s\u5167",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}}),M.defineLocale("zh-tw",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(e,a){return 12===e&&(e=0),"\u51cc\u6668"===a||"\u65e9\u4e0a"===a||"\u4e0a\u5348"===a?e:"\u4e2d\u5348"===a?11<=e?e:e+12:"\u4e0b\u5348"===a||"\u665a\u4e0a"===a?e+12:void 0},meridiem:function(e,a,t){e=100*e+a;return e<600?"\u51cc\u6668":e<900?"\u65e9\u4e0a":e<1130?"\u4e0a\u5348":e<1230?"\u4e2d\u5348":e<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929] LT",nextDay:"[\u660e\u5929] LT",nextWeek:"[\u4e0b]dddd LT",lastDay:"[\u6628\u5929] LT",lastWeek:"[\u4e0a]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"\u65e5";case"M":return e+"\u6708";case"w":case"W":return e+"\u9031";default:return e}},relativeTime:{future:"%s\u5f8c",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}}),M.locale("en"),M});
//# sourceMappingURL=moment-with-locales.min.js.map!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.moment=t()}(this,function(){"use strict";var H;function f(){return H.apply(null,arguments)}function a(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function F(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function c(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function L(e){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(e).length;for(var t in e)if(c(e,t))return;return 1}function o(e){return void 0===e}function u(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function V(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function G(e,t){for(var n=[],s=e.length,i=0;i<s;++i)n.push(t(e[i],i));return n}function E(e,t){for(var n in t)c(t,n)&&(e[n]=t[n]);return c(t,"toString")&&(e.toString=t.toString),c(t,"valueOf")&&(e.valueOf=t.valueOf),e}function l(e,t,n,s){return Pt(e,t,n,s,!0).utc()}function m(e){return null==e._pf&&(e._pf={empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidEra:null,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],era:null,meridiem:null,rfc2822:!1,weekdayMismatch:!1}),e._pf}function A(e){if(null==e._isValid){var t=m(e),n=j.call(t.parsedDateParts,function(e){return null!=e}),n=!isNaN(e._d.getTime())&&t.overflow<0&&!t.empty&&!t.invalidEra&&!t.invalidMonth&&!t.invalidWeekday&&!t.weekdayMismatch&&!t.nullInput&&!t.invalidFormat&&!t.userInvalidated&&(!t.meridiem||t.meridiem&&n);if(e._strict&&(n=n&&0===t.charsLeftOver&&0===t.unusedTokens.length&&void 0===t.bigHour),null!=Object.isFrozen&&Object.isFrozen(e))return n;e._isValid=n}return e._isValid}function I(e){var t=l(NaN);return null!=e?E(m(t),e):m(t).userInvalidated=!0,t}var j=Array.prototype.some||function(e){for(var t=Object(this),n=t.length>>>0,s=0;s<n;s++)if(s in t&&e.call(this,t[s],s,t))return!0;return!1},Z=f.momentProperties=[],z=!1;function $(e,t){var n,s,i,r=Z.length;if(o(t._isAMomentObject)||(e._isAMomentObject=t._isAMomentObject),o(t._i)||(e._i=t._i),o(t._f)||(e._f=t._f),o(t._l)||(e._l=t._l),o(t._strict)||(e._strict=t._strict),o(t._tzm)||(e._tzm=t._tzm),o(t._isUTC)||(e._isUTC=t._isUTC),o(t._offset)||(e._offset=t._offset),o(t._pf)||(e._pf=m(t)),o(t._locale)||(e._locale=t._locale),0<r)for(n=0;n<r;n++)o(i=t[s=Z[n]])||(e[s]=i);return e}function q(e){$(this,e),this._d=new Date(null!=e._d?e._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===z&&(z=!0,f.updateOffset(this),z=!1)}function h(e){return e instanceof q||null!=e&&null!=e._isAMomentObject}function B(e){!1===f.suppressDeprecationWarnings&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+e)}function e(r,a){var o=!0;return E(function(){if(null!=f.deprecationHandler&&f.deprecationHandler(null,r),o){for(var e,t,n=[],s=arguments.length,i=0;i<s;i++){if(e="","object"==typeof arguments[i]){for(t in e+="\n["+i+"] ",arguments[0])c(arguments[0],t)&&(e+=t+": "+arguments[0][t]+", ");e=e.slice(0,-2)}else e=arguments[i];n.push(e)}B(r+"\nArguments: "+Array.prototype.slice.call(n).join("")+"\n"+(new Error).stack),o=!1}return a.apply(this,arguments)},a)}var J={};function Q(e,t){null!=f.deprecationHandler&&f.deprecationHandler(e,t),J[e]||(B(t),J[e]=!0)}function d(e){return"undefined"!=typeof Function&&e instanceof Function||"[object Function]"===Object.prototype.toString.call(e)}function X(e,t){var n,s=E({},e);for(n in t)c(t,n)&&(F(e[n])&&F(t[n])?(s[n]={},E(s[n],e[n]),E(s[n],t[n])):null!=t[n]?s[n]=t[n]:delete s[n]);for(n in e)c(e,n)&&!c(t,n)&&F(e[n])&&(s[n]=E({},s[n]));return s}function K(e){null!=e&&this.set(e)}f.suppressDeprecationWarnings=!1,f.deprecationHandler=null;var ee=Object.keys||function(e){var t,n=[];for(t in e)c(e,t)&&n.push(t);return n};function r(e,t,n){var s=""+Math.abs(e);return(0<=e?n?"+":"":"-")+Math.pow(10,Math.max(0,t-s.length)).toString().substr(1)+s}var te=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,ne=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,se={},ie={};function s(e,t,n,s){var i="string"==typeof s?function(){return this[s]()}:s;e&&(ie[e]=i),t&&(ie[t[0]]=function(){return r(i.apply(this,arguments),t[1],t[2])}),n&&(ie[n]=function(){return this.localeData().ordinal(i.apply(this,arguments),e)})}function re(e,t){return e.isValid()?(t=ae(t,e.localeData()),se[t]=se[t]||function(s){for(var e,i=s.match(te),t=0,r=i.length;t<r;t++)ie[i[t]]?i[t]=ie[i[t]]:i[t]=(e=i[t]).match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"");return function(e){for(var t="",n=0;n<r;n++)t+=d(i[n])?i[n].call(e,s):i[n];return t}}(t),se[t](e)):e.localeData().invalidDate()}function ae(e,t){var n=5;function s(e){return t.longDateFormat(e)||e}for(ne.lastIndex=0;0<=n&&ne.test(e);)e=e.replace(ne,s),ne.lastIndex=0,--n;return e}var oe={};function t(e,t){var n=e.toLowerCase();oe[n]=oe[n+"s"]=oe[t]=e}function _(e){return"string"==typeof e?oe[e]||oe[e.toLowerCase()]:void 0}function ue(e){var t,n,s={};for(n in e)c(e,n)&&(t=_(n))&&(s[t]=e[n]);return s}var le={};function n(e,t){le[e]=t}function he(e){return e%4==0&&e%100!=0||e%400==0}function y(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function g(e){var e=+e,t=0;return t=0!=e&&isFinite(e)?y(e):t}function de(t,n){return function(e){return null!=e?(fe(this,t,e),f.updateOffset(this,n),this):ce(this,t)}}function ce(e,t){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+t]():NaN}function fe(e,t,n){e.isValid()&&!isNaN(n)&&("FullYear"===t&&he(e.year())&&1===e.month()&&29===e.date()?(n=g(n),e._d["set"+(e._isUTC?"UTC":"")+t](n,e.month(),We(n,e.month()))):e._d["set"+(e._isUTC?"UTC":"")+t](n))}var i=/\d/,w=/\d\d/,me=/\d{3}/,_e=/\d{4}/,ye=/[+-]?\d{6}/,p=/\d\d?/,ge=/\d\d\d\d?/,we=/\d\d\d\d\d\d?/,pe=/\d{1,3}/,ke=/\d{1,4}/,ve=/[+-]?\d{1,6}/,Me=/\d+/,De=/[+-]?\d+/,Se=/Z|[+-]\d\d:?\d\d/gi,Ye=/Z|[+-]\d\d(?::?\d\d)?/gi,k=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i;function v(e,n,s){be[e]=d(n)?n:function(e,t){return e&&s?s:n}}function Oe(e,t){return c(be,e)?be[e](t._strict,t._locale):new RegExp(M(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(e,t,n,s,i){return t||n||s||i})))}function M(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var be={},xe={};function D(e,n){var t,s,i=n;for("string"==typeof e&&(e=[e]),u(n)&&(i=function(e,t){t[n]=g(e)}),s=e.length,t=0;t<s;t++)xe[e[t]]=i}function Te(e,i){D(e,function(e,t,n,s){n._w=n._w||{},i(e,n._w,n,s)})}var S,Y=0,O=1,b=2,x=3,T=4,N=5,Ne=6,Pe=7,Re=8;function We(e,t){if(isNaN(e)||isNaN(t))return NaN;var n=(t%(n=12)+n)%n;return e+=(t-n)/12,1==n?he(e)?29:28:31-n%7%2}S=Array.prototype.indexOf||function(e){for(var t=0;t<this.length;++t)if(this[t]===e)return t;return-1},s("M",["MM",2],"Mo",function(){return this.month()+1}),s("MMM",0,0,function(e){return this.localeData().monthsShort(this,e)}),s("MMMM",0,0,function(e){return this.localeData().months(this,e)}),t("month","M"),n("month",8),v("M",p),v("MM",p,w),v("MMM",function(e,t){return t.monthsShortRegex(e)}),v("MMMM",function(e,t){return t.monthsRegex(e)}),D(["M","MM"],function(e,t){t[O]=g(e)-1}),D(["MMM","MMMM"],function(e,t,n,s){s=n._locale.monthsParse(e,s,n._strict);null!=s?t[O]=s:m(n).invalidMonth=e});var Ce="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),Ue="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),He=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,Fe=k,Le=k;function Ve(e,t){var n;if(e.isValid()){if("string"==typeof t)if(/^\d+$/.test(t))t=g(t);else if(!u(t=e.localeData().monthsParse(t)))return;n=Math.min(e.date(),We(e.year(),t)),e._d["set"+(e._isUTC?"UTC":"")+"Month"](t,n)}}function Ge(e){return null!=e?(Ve(this,e),f.updateOffset(this,!0),this):ce(this,"Month")}function Ee(){function e(e,t){return t.length-e.length}for(var t,n=[],s=[],i=[],r=0;r<12;r++)t=l([2e3,r]),n.push(this.monthsShort(t,"")),s.push(this.months(t,"")),i.push(this.months(t,"")),i.push(this.monthsShort(t,""));for(n.sort(e),s.sort(e),i.sort(e),r=0;r<12;r++)n[r]=M(n[r]),s[r]=M(s[r]);for(r=0;r<24;r++)i[r]=M(i[r]);this._monthsRegex=new RegExp("^("+i.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+n.join("|")+")","i")}function Ae(e){return he(e)?366:365}s("Y",0,0,function(){var e=this.year();return e<=9999?r(e,4):"+"+e}),s(0,["YY",2],0,function(){return this.year()%100}),s(0,["YYYY",4],0,"year"),s(0,["YYYYY",5],0,"year"),s(0,["YYYYYY",6,!0],0,"year"),t("year","y"),n("year",1),v("Y",De),v("YY",p,w),v("YYYY",ke,_e),v("YYYYY",ve,ye),v("YYYYYY",ve,ye),D(["YYYYY","YYYYYY"],Y),D("YYYY",function(e,t){t[Y]=2===e.length?f.parseTwoDigitYear(e):g(e)}),D("YY",function(e,t){t[Y]=f.parseTwoDigitYear(e)}),D("Y",function(e,t){t[Y]=parseInt(e,10)}),f.parseTwoDigitYear=function(e){return g(e)+(68<g(e)?1900:2e3)};var Ie=de("FullYear",!0);function je(e,t,n,s,i,r,a){var o;return e<100&&0<=e?(o=new Date(e+400,t,n,s,i,r,a),isFinite(o.getFullYear())&&o.setFullYear(e)):o=new Date(e,t,n,s,i,r,a),o}function Ze(e){var t;return e<100&&0<=e?((t=Array.prototype.slice.call(arguments))[0]=e+400,t=new Date(Date.UTC.apply(null,t)),isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e)):t=new Date(Date.UTC.apply(null,arguments)),t}function ze(e,t,n){n=7+t-n;return n-(7+Ze(e,0,n).getUTCDay()-t)%7-1}function $e(e,t,n,s,i){var r,t=1+7*(t-1)+(7+n-s)%7+ze(e,s,i),n=t<=0?Ae(r=e-1)+t:t>Ae(e)?(r=e+1,t-Ae(e)):(r=e,t);return{year:r,dayOfYear:n}}function qe(e,t,n){var s,i,r=ze(e.year(),t,n),r=Math.floor((e.dayOfYear()-r-1)/7)+1;return r<1?s=r+P(i=e.year()-1,t,n):r>P(e.year(),t,n)?(s=r-P(e.year(),t,n),i=e.year()+1):(i=e.year(),s=r),{week:s,year:i}}function P(e,t,n){var s=ze(e,t,n),t=ze(e+1,t,n);return(Ae(e)-s+t)/7}s("w",["ww",2],"wo","week"),s("W",["WW",2],"Wo","isoWeek"),t("week","w"),t("isoWeek","W"),n("week",5),n("isoWeek",5),v("w",p),v("ww",p,w),v("W",p),v("WW",p,w),Te(["w","ww","W","WW"],function(e,t,n,s){t[s.substr(0,1)]=g(e)});function Be(e,t){return e.slice(t,7).concat(e.slice(0,t))}s("d",0,"do","day"),s("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),s("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),s("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),s("e",0,0,"weekday"),s("E",0,0,"isoWeekday"),t("day","d"),t("weekday","e"),t("isoWeekday","E"),n("day",11),n("weekday",11),n("isoWeekday",11),v("d",p),v("e",p),v("E",p),v("dd",function(e,t){return t.weekdaysMinRegex(e)}),v("ddd",function(e,t){return t.weekdaysShortRegex(e)}),v("dddd",function(e,t){return t.weekdaysRegex(e)}),Te(["dd","ddd","dddd"],function(e,t,n,s){s=n._locale.weekdaysParse(e,s,n._strict);null!=s?t.d=s:m(n).invalidWeekday=e}),Te(["d","e","E"],function(e,t,n,s){t[s]=g(e)});var Je="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Qe="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Xe="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),Ke=k,et=k,tt=k;function nt(){function e(e,t){return t.length-e.length}for(var t,n,s,i=[],r=[],a=[],o=[],u=0;u<7;u++)s=l([2e3,1]).day(u),t=M(this.weekdaysMin(s,"")),n=M(this.weekdaysShort(s,"")),s=M(this.weekdays(s,"")),i.push(t),r.push(n),a.push(s),o.push(t),o.push(n),o.push(s);i.sort(e),r.sort(e),a.sort(e),o.sort(e),this._weekdaysRegex=new RegExp("^("+o.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+r.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+i.join("|")+")","i")}function st(){return this.hours()%12||12}function it(e,t){s(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function rt(e,t){return t._meridiemParse}s("H",["HH",2],0,"hour"),s("h",["hh",2],0,st),s("k",["kk",2],0,function(){return this.hours()||24}),s("hmm",0,0,function(){return""+st.apply(this)+r(this.minutes(),2)}),s("hmmss",0,0,function(){return""+st.apply(this)+r(this.minutes(),2)+r(this.seconds(),2)}),s("Hmm",0,0,function(){return""+this.hours()+r(this.minutes(),2)}),s("Hmmss",0,0,function(){return""+this.hours()+r(this.minutes(),2)+r(this.seconds(),2)}),it("a",!0),it("A",!1),t("hour","h"),n("hour",13),v("a",rt),v("A",rt),v("H",p),v("h",p),v("k",p),v("HH",p,w),v("hh",p,w),v("kk",p,w),v("hmm",ge),v("hmmss",we),v("Hmm",ge),v("Hmmss",we),D(["H","HH"],x),D(["k","kk"],function(e,t,n){e=g(e);t[x]=24===e?0:e}),D(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),D(["h","hh"],function(e,t,n){t[x]=g(e),m(n).bigHour=!0}),D("hmm",function(e,t,n){var s=e.length-2;t[x]=g(e.substr(0,s)),t[T]=g(e.substr(s)),m(n).bigHour=!0}),D("hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[x]=g(e.substr(0,s)),t[T]=g(e.substr(s,2)),t[N]=g(e.substr(i)),m(n).bigHour=!0}),D("Hmm",function(e,t,n){var s=e.length-2;t[x]=g(e.substr(0,s)),t[T]=g(e.substr(s))}),D("Hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[x]=g(e.substr(0,s)),t[T]=g(e.substr(s,2)),t[N]=g(e.substr(i))});k=de("Hours",!0);var at,ot={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Ce,monthsShort:Ue,week:{dow:0,doy:6},weekdays:Je,weekdaysMin:Xe,weekdaysShort:Qe,meridiemParse:/[ap]\.?m?\.?/i},R={},ut={};function lt(e){return e&&e.toLowerCase().replace("_","-")}function ht(e){for(var t,n,s,i,r=0;r<e.length;){for(t=(i=lt(e[r]).split("-")).length,n=(n=lt(e[r+1]))?n.split("-"):null;0<t;){if(s=dt(i.slice(0,t).join("-")))return s;if(n&&n.length>=t&&function(e,t){for(var n=Math.min(e.length,t.length),s=0;s<n;s+=1)if(e[s]!==t[s])return s;return n}(i,n)>=t-1)break;t--}r++}return at}function dt(t){var e;if(void 0===R[t]&&"undefined"!=typeof module&&module&&module.exports&&null!=t.match("^[^/\\\\]*$"))try{e=at._abbr,require("./locale/"+t),ct(e)}catch(e){R[t]=null}return R[t]}function ct(e,t){return e&&((t=o(t)?mt(e):ft(e,t))?at=t:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),at._abbr}function ft(e,t){if(null===t)return delete R[e],null;var n,s=ot;if(t.abbr=e,null!=R[e])Q("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),s=R[e]._config;else if(null!=t.parentLocale)if(null!=R[t.parentLocale])s=R[t.parentLocale]._config;else{if(null==(n=dt(t.parentLocale)))return ut[t.parentLocale]||(ut[t.parentLocale]=[]),ut[t.parentLocale].push({name:e,config:t}),null;s=n._config}return R[e]=new K(X(s,t)),ut[e]&&ut[e].forEach(function(e){ft(e.name,e.config)}),ct(e),R[e]}function mt(e){var t;if(!(e=e&&e._locale&&e._locale._abbr?e._locale._abbr:e))return at;if(!a(e)){if(t=dt(e))return t;e=[e]}return ht(e)}function _t(e){var t=e._a;return t&&-2===m(e).overflow&&(t=t[O]<0||11<t[O]?O:t[b]<1||t[b]>We(t[Y],t[O])?b:t[x]<0||24<t[x]||24===t[x]&&(0!==t[T]||0!==t[N]||0!==t[Ne])?x:t[T]<0||59<t[T]?T:t[N]<0||59<t[N]?N:t[Ne]<0||999<t[Ne]?Ne:-1,m(e)._overflowDayOfYear&&(t<Y||b<t)&&(t=b),m(e)._overflowWeeks&&-1===t&&(t=Pe),m(e)._overflowWeekday&&-1===t&&(t=Re),m(e).overflow=t),e}var yt=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,gt=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,wt=/Z|[+-]\d\d(?::?\d\d)?/,pt=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],kt=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],vt=/^\/?Date\((-?\d+)/i,Mt=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,Dt={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function St(e){var t,n,s,i,r,a,o=e._i,u=yt.exec(o)||gt.exec(o),o=pt.length,l=kt.length;if(u){for(m(e).iso=!0,t=0,n=o;t<n;t++)if(pt[t][1].exec(u[1])){i=pt[t][0],s=!1!==pt[t][2];break}if(null==i)e._isValid=!1;else{if(u[3]){for(t=0,n=l;t<n;t++)if(kt[t][1].exec(u[3])){r=(u[2]||" ")+kt[t][0];break}if(null==r)return void(e._isValid=!1)}if(s||null==r){if(u[4]){if(!wt.exec(u[4]))return void(e._isValid=!1);a="Z"}e._f=i+(r||"")+(a||""),Tt(e)}else e._isValid=!1}}else e._isValid=!1}function Yt(e,t,n,s,i,r){e=[function(e){e=parseInt(e,10);{if(e<=49)return 2e3+e;if(e<=999)return 1900+e}return e}(e),Ue.indexOf(t),parseInt(n,10),parseInt(s,10),parseInt(i,10)];return r&&e.push(parseInt(r,10)),e}function Ot(e){var t,n,s,i,r=Mt.exec(e._i.replace(/\([^()]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").replace(/^\s\s*/,"").replace(/\s\s*$/,""));r?(t=Yt(r[4],r[3],r[2],r[5],r[6],r[7]),n=r[1],s=t,i=e,n&&Qe.indexOf(n)!==new Date(s[0],s[1],s[2]).getDay()?(m(i).weekdayMismatch=!0,i._isValid=!1):(e._a=t,e._tzm=(n=r[8],s=r[9],i=r[10],n?Dt[n]:s?0:60*(((n=parseInt(i,10))-(s=n%100))/100)+s),e._d=Ze.apply(null,e._a),e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),m(e).rfc2822=!0)):e._isValid=!1}function bt(e,t,n){return null!=e?e:null!=t?t:n}function xt(e){var t,n,s,i,r,a,o,u,l,h,d,c=[];if(!e._d){for(s=e,i=new Date(f.now()),n=s._useUTC?[i.getUTCFullYear(),i.getUTCMonth(),i.getUTCDate()]:[i.getFullYear(),i.getMonth(),i.getDate()],e._w&&null==e._a[b]&&null==e._a[O]&&(null!=(i=(s=e)._w).GG||null!=i.W||null!=i.E?(u=1,l=4,r=bt(i.GG,s._a[Y],qe(W(),1,4).year),a=bt(i.W,1),((o=bt(i.E,1))<1||7<o)&&(h=!0)):(u=s._locale._week.dow,l=s._locale._week.doy,d=qe(W(),u,l),r=bt(i.gg,s._a[Y],d.year),a=bt(i.w,d.week),null!=i.d?((o=i.d)<0||6<o)&&(h=!0):null!=i.e?(o=i.e+u,(i.e<0||6<i.e)&&(h=!0)):o=u),a<1||a>P(r,u,l)?m(s)._overflowWeeks=!0:null!=h?m(s)._overflowWeekday=!0:(d=$e(r,a,o,u,l),s._a[Y]=d.year,s._dayOfYear=d.dayOfYear)),null!=e._dayOfYear&&(i=bt(e._a[Y],n[Y]),(e._dayOfYear>Ae(i)||0===e._dayOfYear)&&(m(e)._overflowDayOfYear=!0),h=Ze(i,0,e._dayOfYear),e._a[O]=h.getUTCMonth(),e._a[b]=h.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=c[t]=n[t];for(;t<7;t++)e._a[t]=c[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[x]&&0===e._a[T]&&0===e._a[N]&&0===e._a[Ne]&&(e._nextDay=!0,e._a[x]=0),e._d=(e._useUTC?Ze:je).apply(null,c),r=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[x]=24),e._w&&void 0!==e._w.d&&e._w.d!==r&&(m(e).weekdayMismatch=!0)}}function Tt(e){if(e._f===f.ISO_8601)St(e);else if(e._f===f.RFC_2822)Ot(e);else{e._a=[],m(e).empty=!0;for(var t,n,s,i,r,a=""+e._i,o=a.length,u=0,l=ae(e._f,e._locale).match(te)||[],h=l.length,d=0;d<h;d++)n=l[d],(t=(a.match(Oe(n,e))||[])[0])&&(0<(s=a.substr(0,a.indexOf(t))).length&&m(e).unusedInput.push(s),a=a.slice(a.indexOf(t)+t.length),u+=t.length),ie[n]?(t?m(e).empty=!1:m(e).unusedTokens.push(n),s=n,r=e,null!=(i=t)&&c(xe,s)&&xe[s](i,r._a,r,s)):e._strict&&!t&&m(e).unusedTokens.push(n);m(e).charsLeftOver=o-u,0<a.length&&m(e).unusedInput.push(a),e._a[x]<=12&&!0===m(e).bigHour&&0<e._a[x]&&(m(e).bigHour=void 0),m(e).parsedDateParts=e._a.slice(0),m(e).meridiem=e._meridiem,e._a[x]=function(e,t,n){if(null==n)return t;return null!=e.meridiemHour?e.meridiemHour(t,n):null!=e.isPM?((e=e.isPM(n))&&t<12&&(t+=12),t=e||12!==t?t:0):t}(e._locale,e._a[x],e._meridiem),null!==(o=m(e).era)&&(e._a[Y]=e._locale.erasConvertYear(o,e._a[Y])),xt(e),_t(e)}}function Nt(e){var t,n,s,i=e._i,r=e._f;if(e._locale=e._locale||mt(e._l),null===i||void 0===r&&""===i)return I({nullInput:!0});if("string"==typeof i&&(e._i=i=e._locale.preparse(i)),h(i))return new q(_t(i));if(V(i))e._d=i;else if(a(r))!function(e){var t,n,s,i,r,a,o=!1,u=e._f.length;if(0===u)return m(e).invalidFormat=!0,e._d=new Date(NaN);for(i=0;i<u;i++)r=0,a=!1,t=$({},e),null!=e._useUTC&&(t._useUTC=e._useUTC),t._f=e._f[i],Tt(t),A(t)&&(a=!0),r=(r+=m(t).charsLeftOver)+10*m(t).unusedTokens.length,m(t).score=r,o?r<s&&(s=r,n=t):(null==s||r<s||a)&&(s=r,n=t,a&&(o=!0));E(e,n||t)}(e);else if(r)Tt(e);else if(o(r=(i=e)._i))i._d=new Date(f.now());else V(r)?i._d=new Date(r.valueOf()):"string"==typeof r?(n=i,null!==(t=vt.exec(n._i))?n._d=new Date(+t[1]):(St(n),!1===n._isValid&&(delete n._isValid,Ot(n),!1===n._isValid&&(delete n._isValid,n._strict?n._isValid=!1:f.createFromInputFallback(n))))):a(r)?(i._a=G(r.slice(0),function(e){return parseInt(e,10)}),xt(i)):F(r)?(t=i)._d||(s=void 0===(n=ue(t._i)).day?n.date:n.day,t._a=G([n.year,n.month,s,n.hour,n.minute,n.second,n.millisecond],function(e){return e&&parseInt(e,10)}),xt(t)):u(r)?i._d=new Date(r):f.createFromInputFallback(i);return A(e)||(e._d=null),e}function Pt(e,t,n,s,i){var r={};return!0!==t&&!1!==t||(s=t,t=void 0),!0!==n&&!1!==n||(s=n,n=void 0),(F(e)&&L(e)||a(e)&&0===e.length)&&(e=void 0),r._isAMomentObject=!0,r._useUTC=r._isUTC=i,r._l=n,r._i=e,r._f=t,r._strict=s,(i=new q(_t(Nt(i=r))))._nextDay&&(i.add(1,"d"),i._nextDay=void 0),i}function W(e,t,n,s){return Pt(e,t,n,s,!1)}f.createFromInputFallback=e("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(e){e._d=new Date(e._i+(e._useUTC?" UTC":""))}),f.ISO_8601=function(){},f.RFC_2822=function(){};ge=e("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var e=W.apply(null,arguments);return this.isValid()&&e.isValid()?e<this?this:e:I()}),we=e("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var e=W.apply(null,arguments);return this.isValid()&&e.isValid()?this<e?this:e:I()});function Rt(e,t){var n,s;if(!(t=1===t.length&&a(t[0])?t[0]:t).length)return W();for(n=t[0],s=1;s<t.length;++s)t[s].isValid()&&!t[s][e](n)||(n=t[s]);return n}var Wt=["year","quarter","month","week","day","hour","minute","second","millisecond"];function Ct(e){var e=ue(e),t=e.year||0,n=e.quarter||0,s=e.month||0,i=e.week||e.isoWeek||0,r=e.day||0,a=e.hour||0,o=e.minute||0,u=e.second||0,l=e.millisecond||0;this._isValid=function(e){var t,n,s=!1,i=Wt.length;for(t in e)if(c(e,t)&&(-1===S.call(Wt,t)||null!=e[t]&&isNaN(e[t])))return!1;for(n=0;n<i;++n)if(e[Wt[n]]){if(s)return!1;parseFloat(e[Wt[n]])!==g(e[Wt[n]])&&(s=!0)}return!0}(e),this._milliseconds=+l+1e3*u+6e4*o+1e3*a*60*60,this._days=+r+7*i,this._months=+s+3*n+12*t,this._data={},this._locale=mt(),this._bubble()}function Ut(e){return e instanceof Ct}function Ht(e){return e<0?-1*Math.round(-1*e):Math.round(e)}function Ft(e,n){s(e,0,0,function(){var e=this.utcOffset(),t="+";return e<0&&(e=-e,t="-"),t+r(~~(e/60),2)+n+r(~~e%60,2)})}Ft("Z",":"),Ft("ZZ",""),v("Z",Ye),v("ZZ",Ye),D(["Z","ZZ"],function(e,t,n){n._useUTC=!0,n._tzm=Vt(Ye,e)});var Lt=/([\+\-]|\d\d)/gi;function Vt(e,t){var t=(t||"").match(e);return null===t?null:0===(t=60*(e=((t[t.length-1]||[])+"").match(Lt)||["-",0,0])[1]+g(e[2]))?0:"+"===e[0]?t:-t}function Gt(e,t){var n;return t._isUTC?(t=t.clone(),n=(h(e)||V(e)?e:W(e)).valueOf()-t.valueOf(),t._d.setTime(t._d.valueOf()+n),f.updateOffset(t,!1),t):W(e).local()}function Et(e){return-Math.round(e._d.getTimezoneOffset())}function At(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}f.updateOffset=function(){};var It=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,jt=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function C(e,t){var n,s=e,i=null;return Ut(e)?s={ms:e._milliseconds,d:e._days,M:e._months}:u(e)||!isNaN(+e)?(s={},t?s[t]=+e:s.milliseconds=+e):(i=It.exec(e))?(n="-"===i[1]?-1:1,s={y:0,d:g(i[b])*n,h:g(i[x])*n,m:g(i[T])*n,s:g(i[N])*n,ms:g(Ht(1e3*i[Ne]))*n}):(i=jt.exec(e))?(n="-"===i[1]?-1:1,s={y:Zt(i[2],n),M:Zt(i[3],n),w:Zt(i[4],n),d:Zt(i[5],n),h:Zt(i[6],n),m:Zt(i[7],n),s:Zt(i[8],n)}):null==s?s={}:"object"==typeof s&&("from"in s||"to"in s)&&(t=function(e,t){var n;if(!e.isValid()||!t.isValid())return{milliseconds:0,months:0};t=Gt(t,e),e.isBefore(t)?n=zt(e,t):((n=zt(t,e)).milliseconds=-n.milliseconds,n.months=-n.months);return n}(W(s.from),W(s.to)),(s={}).ms=t.milliseconds,s.M=t.months),i=new Ct(s),Ut(e)&&c(e,"_locale")&&(i._locale=e._locale),Ut(e)&&c(e,"_isValid")&&(i._isValid=e._isValid),i}function Zt(e,t){e=e&&parseFloat(e.replace(",","."));return(isNaN(e)?0:e)*t}function zt(e,t){var n={};return n.months=t.month()-e.month()+12*(t.year()-e.year()),e.clone().add(n.months,"M").isAfter(t)&&--n.months,n.milliseconds=+t-+e.clone().add(n.months,"M"),n}function $t(s,i){return function(e,t){var n;return null===t||isNaN(+t)||(Q(i,"moment()."+i+"(period, number) is deprecated. Please use moment()."+i+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),n=e,e=t,t=n),qt(this,C(e,t),s),this}}function qt(e,t,n,s){var i=t._milliseconds,r=Ht(t._days),t=Ht(t._months);e.isValid()&&(s=null==s||s,t&&Ve(e,ce(e,"Month")+t*n),r&&fe(e,"Date",ce(e,"Date")+r*n),i&&e._d.setTime(e._d.valueOf()+i*n),s&&f.updateOffset(e,r||t))}C.fn=Ct.prototype,C.invalid=function(){return C(NaN)};Ce=$t(1,"add"),Je=$t(-1,"subtract");function Bt(e){return"string"==typeof e||e instanceof String}function Jt(e){return h(e)||V(e)||Bt(e)||u(e)||function(t){var e=a(t),n=!1;e&&(n=0===t.filter(function(e){return!u(e)&&Bt(t)}).length);return e&&n}(e)||function(e){var t,n,s=F(e)&&!L(e),i=!1,r=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],a=r.length;for(t=0;t<a;t+=1)n=r[t],i=i||c(e,n);return s&&i}(e)||null==e}function Qt(e,t){if(e.date()<t.date())return-Qt(t,e);var n=12*(t.year()-e.year())+(t.month()-e.month()),s=e.clone().add(n,"months"),t=t-s<0?(t-s)/(s-e.clone().add(n-1,"months")):(t-s)/(e.clone().add(1+n,"months")-s);return-(n+t)||0}function Xt(e){return void 0===e?this._locale._abbr:(null!=(e=mt(e))&&(this._locale=e),this)}f.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",f.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";Xe=e("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){return void 0===e?this.localeData():this.locale(e)});function Kt(){return this._locale}var en=126227808e5;function tn(e,t){return(e%t+t)%t}function nn(e,t,n){return e<100&&0<=e?new Date(e+400,t,n)-en:new Date(e,t,n).valueOf()}function sn(e,t,n){return e<100&&0<=e?Date.UTC(e+400,t,n)-en:Date.UTC(e,t,n)}function rn(e,t){return t.erasAbbrRegex(e)}function an(){for(var e=[],t=[],n=[],s=[],i=this.eras(),r=0,a=i.length;r<a;++r)t.push(M(i[r].name)),e.push(M(i[r].abbr)),n.push(M(i[r].narrow)),s.push(M(i[r].name)),s.push(M(i[r].abbr)),s.push(M(i[r].narrow));this._erasRegex=new RegExp("^("+s.join("|")+")","i"),this._erasNameRegex=new RegExp("^("+t.join("|")+")","i"),this._erasAbbrRegex=new RegExp("^("+e.join("|")+")","i"),this._erasNarrowRegex=new RegExp("^("+n.join("|")+")","i")}function on(e,t){s(0,[e,e.length],0,t)}function un(e,t,n,s,i){var r;return null==e?qe(this,s,i).year:(r=P(e,s,i),function(e,t,n,s,i){e=$e(e,t,n,s,i),t=Ze(e.year,0,e.dayOfYear);return this.year(t.getUTCFullYear()),this.month(t.getUTCMonth()),this.date(t.getUTCDate()),this}.call(this,e,t=r<t?r:t,n,s,i))}s("N",0,0,"eraAbbr"),s("NN",0,0,"eraAbbr"),s("NNN",0,0,"eraAbbr"),s("NNNN",0,0,"eraName"),s("NNNNN",0,0,"eraNarrow"),s("y",["y",1],"yo","eraYear"),s("y",["yy",2],0,"eraYear"),s("y",["yyy",3],0,"eraYear"),s("y",["yyyy",4],0,"eraYear"),v("N",rn),v("NN",rn),v("NNN",rn),v("NNNN",function(e,t){return t.erasNameRegex(e)}),v("NNNNN",function(e,t){return t.erasNarrowRegex(e)}),D(["N","NN","NNN","NNNN","NNNNN"],function(e,t,n,s){s=n._locale.erasParse(e,s,n._strict);s?m(n).era=s:m(n).invalidEra=e}),v("y",Me),v("yy",Me),v("yyy",Me),v("yyyy",Me),v("yo",function(e,t){return t._eraYearOrdinalRegex||Me}),D(["y","yy","yyy","yyyy"],Y),D(["yo"],function(e,t,n,s){var i;n._locale._eraYearOrdinalRegex&&(i=e.match(n._locale._eraYearOrdinalRegex)),n._locale.eraYearOrdinalParse?t[Y]=n._locale.eraYearOrdinalParse(e,i):t[Y]=parseInt(e,10)}),s(0,["gg",2],0,function(){return this.weekYear()%100}),s(0,["GG",2],0,function(){return this.isoWeekYear()%100}),on("gggg","weekYear"),on("ggggg","weekYear"),on("GGGG","isoWeekYear"),on("GGGGG","isoWeekYear"),t("weekYear","gg"),t("isoWeekYear","GG"),n("weekYear",1),n("isoWeekYear",1),v("G",De),v("g",De),v("GG",p,w),v("gg",p,w),v("GGGG",ke,_e),v("gggg",ke,_e),v("GGGGG",ve,ye),v("ggggg",ve,ye),Te(["gggg","ggggg","GGGG","GGGGG"],function(e,t,n,s){t[s.substr(0,2)]=g(e)}),Te(["gg","GG"],function(e,t,n,s){t[s]=f.parseTwoDigitYear(e)}),s("Q",0,"Qo","quarter"),t("quarter","Q"),n("quarter",7),v("Q",i),D("Q",function(e,t){t[O]=3*(g(e)-1)}),s("D",["DD",2],"Do","date"),t("date","D"),n("date",9),v("D",p),v("DD",p,w),v("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient}),D(["D","DD"],b),D("Do",function(e,t){t[b]=g(e.match(p)[0])});ke=de("Date",!0);s("DDD",["DDDD",3],"DDDo","dayOfYear"),t("dayOfYear","DDD"),n("dayOfYear",4),v("DDD",pe),v("DDDD",me),D(["DDD","DDDD"],function(e,t,n){n._dayOfYear=g(e)}),s("m",["mm",2],0,"minute"),t("minute","m"),n("minute",14),v("m",p),v("mm",p,w),D(["m","mm"],T);var ln,_e=de("Minutes",!1),ve=(s("s",["ss",2],0,"second"),t("second","s"),n("second",15),v("s",p),v("ss",p,w),D(["s","ss"],N),de("Seconds",!1));for(s("S",0,0,function(){return~~(this.millisecond()/100)}),s(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),s(0,["SSS",3],0,"millisecond"),s(0,["SSSS",4],0,function(){return 10*this.millisecond()}),s(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),s(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),s(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),s(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),s(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),t("millisecond","ms"),n("millisecond",16),v("S",pe,i),v("SS",pe,w),v("SSS",pe,me),ln="SSSS";ln.length<=9;ln+="S")v(ln,Me);function hn(e,t){t[Ne]=g(1e3*("0."+e))}for(ln="S";ln.length<=9;ln+="S")D(ln,hn);ye=de("Milliseconds",!1),s("z",0,0,"zoneAbbr"),s("zz",0,0,"zoneName");i=q.prototype;function dn(e){return e}i.add=Ce,i.calendar=function(e,t){1===arguments.length&&(arguments[0]?Jt(arguments[0])?(e=arguments[0],t=void 0):function(e){for(var t=F(e)&&!L(e),n=!1,s=["sameDay","nextDay","lastDay","nextWeek","lastWeek","sameElse"],i=0;i<s.length;i+=1)n=n||c(e,s[i]);return t&&n}(arguments[0])&&(t=arguments[0],e=void 0):t=e=void 0);var e=e||W(),n=Gt(e,this).startOf("day"),n=f.calendarFormat(this,n)||"sameElse",t=t&&(d(t[n])?t[n].call(this,e):t[n]);return this.format(t||this.localeData().calendar(n,this,W(e)))},i.clone=function(){return new q(this)},i.diff=function(e,t,n){var s,i,r;if(!this.isValid())return NaN;if(!(s=Gt(e,this)).isValid())return NaN;switch(i=6e4*(s.utcOffset()-this.utcOffset()),t=_(t)){case"year":r=Qt(this,s)/12;break;case"month":r=Qt(this,s);break;case"quarter":r=Qt(this,s)/3;break;case"second":r=(this-s)/1e3;break;case"minute":r=(this-s)/6e4;break;case"hour":r=(this-s)/36e5;break;case"day":r=(this-s-i)/864e5;break;case"week":r=(this-s-i)/6048e5;break;default:r=this-s}return n?r:y(r)},i.endOf=function(e){var t,n;if(void 0===(e=_(e))||"millisecond"===e||!this.isValid())return this;switch(n=this._isUTC?sn:nn,e){case"year":t=n(this.year()+1,0,1)-1;break;case"quarter":t=n(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":t=n(this.year(),this.month()+1,1)-1;break;case"week":t=n(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":t=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":t=n(this.year(),this.month(),this.date()+1)-1;break;case"hour":t=this._d.valueOf(),t+=36e5-tn(t+(this._isUTC?0:6e4*this.utcOffset()),36e5)-1;break;case"minute":t=this._d.valueOf(),t+=6e4-tn(t,6e4)-1;break;case"second":t=this._d.valueOf(),t+=1e3-tn(t,1e3)-1;break}return this._d.setTime(t),f.updateOffset(this,!0),this},i.format=function(e){return e=e||(this.isUtc()?f.defaultFormatUtc:f.defaultFormat),e=re(this,e),this.localeData().postformat(e)},i.from=function(e,t){return this.isValid()&&(h(e)&&e.isValid()||W(e).isValid())?C({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},i.fromNow=function(e){return this.from(W(),e)},i.to=function(e,t){return this.isValid()&&(h(e)&&e.isValid()||W(e).isValid())?C({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},i.toNow=function(e){return this.to(W(),e)},i.get=function(e){return d(this[e=_(e)])?this[e]():this},i.invalidAt=function(){return m(this).overflow},i.isAfter=function(e,t){return e=h(e)?e:W(e),!(!this.isValid()||!e.isValid())&&("millisecond"===(t=_(t)||"millisecond")?this.valueOf()>e.valueOf():e.valueOf()<this.clone().startOf(t).valueOf())},i.isBefore=function(e,t){return e=h(e)?e:W(e),!(!this.isValid()||!e.isValid())&&("millisecond"===(t=_(t)||"millisecond")?this.valueOf()<e.valueOf():this.clone().endOf(t).valueOf()<e.valueOf())},i.isBetween=function(e,t,n,s){return e=h(e)?e:W(e),t=h(t)?t:W(t),!!(this.isValid()&&e.isValid()&&t.isValid())&&(("("===(s=s||"()")[0]?this.isAfter(e,n):!this.isBefore(e,n))&&(")"===s[1]?this.isBefore(t,n):!this.isAfter(t,n)))},i.isSame=function(e,t){var e=h(e)?e:W(e);return!(!this.isValid()||!e.isValid())&&("millisecond"===(t=_(t)||"millisecond")?this.valueOf()===e.valueOf():(e=e.valueOf(),this.clone().startOf(t).valueOf()<=e&&e<=this.clone().endOf(t).valueOf()))},i.isSameOrAfter=function(e,t){return this.isSame(e,t)||this.isAfter(e,t)},i.isSameOrBefore=function(e,t){return this.isSame(e,t)||this.isBefore(e,t)},i.isValid=function(){return A(this)},i.lang=Xe,i.locale=Xt,i.localeData=Kt,i.max=we,i.min=ge,i.parsingFlags=function(){return E({},m(this))},i.set=function(e,t){if("object"==typeof e)for(var n=function(e){var t,n=[];for(t in e)c(e,t)&&n.push({unit:t,priority:le[t]});return n.sort(function(e,t){return e.priority-t.priority}),n}(e=ue(e)),s=n.length,i=0;i<s;i++)this[n[i].unit](e[n[i].unit]);else if(d(this[e=_(e)]))return this[e](t);return this},i.startOf=function(e){var t,n;if(void 0===(e=_(e))||"millisecond"===e||!this.isValid())return this;switch(n=this._isUTC?sn:nn,e){case"year":t=n(this.year(),0,1);break;case"quarter":t=n(this.year(),this.month()-this.month()%3,1);break;case"month":t=n(this.year(),this.month(),1);break;case"week":t=n(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":t=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":t=n(this.year(),this.month(),this.date());break;case"hour":t=this._d.valueOf(),t-=tn(t+(this._isUTC?0:6e4*this.utcOffset()),36e5);break;case"minute":t=this._d.valueOf(),t-=tn(t,6e4);break;case"second":t=this._d.valueOf(),t-=tn(t,1e3);break}return this._d.setTime(t),f.updateOffset(this,!0),this},i.subtract=Je,i.toArray=function(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]},i.toObject=function(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}},i.toDate=function(){return new Date(this.valueOf())},i.toISOString=function(e){if(!this.isValid())return null;var t=(e=!0!==e)?this.clone().utc():this;return t.year()<0||9999<t.year()?re(t,e?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):d(Date.prototype.toISOString)?e?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",re(t,"Z")):re(t,e?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},i.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e,t="moment",n="";return this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",n="Z"),t="["+t+'("]',e=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",this.format(t+e+"-MM-DD[T]HH:mm:ss.SSS"+(n+'[")]'))},"undefined"!=typeof Symbol&&null!=Symbol.for&&(i[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"}),i.toJSON=function(){return this.isValid()?this.toISOString():null},i.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},i.unix=function(){return Math.floor(this.valueOf()/1e3)},i.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},i.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},i.eraName=function(){for(var e,t=this.localeData().eras(),n=0,s=t.length;n<s;++n){if(e=this.clone().startOf("day").valueOf(),t[n].since<=e&&e<=t[n].until)return t[n].name;if(t[n].until<=e&&e<=t[n].since)return t[n].name}return""},i.eraNarrow=function(){for(var e,t=this.localeData().eras(),n=0,s=t.length;n<s;++n){if(e=this.clone().startOf("day").valueOf(),t[n].since<=e&&e<=t[n].until)return t[n].narrow;if(t[n].until<=e&&e<=t[n].since)return t[n].narrow}return""},i.eraAbbr=function(){for(var e,t=this.localeData().eras(),n=0,s=t.length;n<s;++n){if(e=this.clone().startOf("day").valueOf(),t[n].since<=e&&e<=t[n].until)return t[n].abbr;if(t[n].until<=e&&e<=t[n].since)return t[n].abbr}return""},i.eraYear=function(){for(var e,t,n=this.localeData().eras(),s=0,i=n.length;s<i;++s)if(e=n[s].since<=n[s].until?1:-1,t=this.clone().startOf("day").valueOf(),n[s].since<=t&&t<=n[s].until||n[s].until<=t&&t<=n[s].since)return(this.year()-f(n[s].since).year())*e+n[s].offset;return this.year()},i.year=Ie,i.isLeapYear=function(){return he(this.year())},i.weekYear=function(e){return un.call(this,e,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},i.isoWeekYear=function(e){return un.call(this,e,this.isoWeek(),this.isoWeekday(),1,4)},i.quarter=i.quarters=function(e){return null==e?Math.ceil((this.month()+1)/3):this.month(3*(e-1)+this.month()%3)},i.month=Ge,i.daysInMonth=function(){return We(this.year(),this.month())},i.week=i.weeks=function(e){var t=this.localeData().week(this);return null==e?t:this.add(7*(e-t),"d")},i.isoWeek=i.isoWeeks=function(e){var t=qe(this,1,4).week;return null==e?t:this.add(7*(e-t),"d")},i.weeksInYear=function(){var e=this.localeData()._week;return P(this.year(),e.dow,e.doy)},i.weeksInWeekYear=function(){var e=this.localeData()._week;return P(this.weekYear(),e.dow,e.doy)},i.isoWeeksInYear=function(){return P(this.year(),1,4)},i.isoWeeksInISOWeekYear=function(){return P(this.isoWeekYear(),1,4)},i.date=ke,i.day=i.days=function(e){if(!this.isValid())return null!=e?this:NaN;var t,n,s=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=e?(t=e,n=this.localeData(),e="string"!=typeof t?t:isNaN(t)?"number"==typeof(t=n.weekdaysParse(t))?t:null:parseInt(t,10),this.add(e-s,"d")):s},i.weekday=function(e){if(!this.isValid())return null!=e?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return null==e?t:this.add(e-t,"d")},i.isoWeekday=function(e){return this.isValid()?null!=e?(t=e,n=this.localeData(),n="string"==typeof t?n.weekdaysParse(t)%7||7:isNaN(t)?null:t,this.day(this.day()%7?n:n-7)):this.day()||7:null!=e?this:NaN;var t,n},i.dayOfYear=function(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==e?t:this.add(e-t,"d")},i.hour=i.hours=k,i.minute=i.minutes=_e,i.second=i.seconds=ve,i.millisecond=i.milliseconds=ye,i.utcOffset=function(e,t,n){var s,i=this._offset||0;if(!this.isValid())return null!=e?this:NaN;if(null==e)return this._isUTC?i:Et(this);if("string"==typeof e){if(null===(e=Vt(Ye,e)))return this}else Math.abs(e)<16&&!n&&(e*=60);return!this._isUTC&&t&&(s=Et(this)),this._offset=e,this._isUTC=!0,null!=s&&this.add(s,"m"),i!==e&&(!t||this._changeInProgress?qt(this,C(e-i,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,f.updateOffset(this,!0),this._changeInProgress=null)),this},i.utc=function(e){return this.utcOffset(0,e)},i.local=function(e){return this._isUTC&&(this.utcOffset(0,e),this._isUTC=!1,e&&this.subtract(Et(this),"m")),this},i.parseZone=function(){var e;return null!=this._tzm?this.utcOffset(this._tzm,!1,!0):"string"==typeof this._i&&(null!=(e=Vt(Se,this._i))?this.utcOffset(e):this.utcOffset(0,!0)),this},i.hasAlignedHourOffset=function(e){return!!this.isValid()&&(e=e?W(e).utcOffset():0,(this.utcOffset()-e)%60==0)},i.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},i.isLocal=function(){return!!this.isValid()&&!this._isUTC},i.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},i.isUtc=At,i.isUTC=At,i.zoneAbbr=function(){return this._isUTC?"UTC":""},i.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},i.dates=e("dates accessor is deprecated. Use date instead.",ke),i.months=e("months accessor is deprecated. Use month instead",Ge),i.years=e("years accessor is deprecated. Use year instead",Ie),i.zone=e("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){return null!=e?(this.utcOffset(e="string"!=typeof e?-e:e,t),this):-this.utcOffset()}),i.isDSTShifted=e("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!o(this._isDSTShifted))return this._isDSTShifted;var e,t={};return $(t,this),(t=Nt(t))._a?(e=(t._isUTC?l:W)(t._a),this._isDSTShifted=this.isValid()&&0<function(e,t,n){for(var s=Math.min(e.length,t.length),i=Math.abs(e.length-t.length),r=0,a=0;a<s;a++)(n&&e[a]!==t[a]||!n&&g(e[a])!==g(t[a]))&&r++;return r+i}(t._a,e.toArray())):this._isDSTShifted=!1,this._isDSTShifted});w=K.prototype;function cn(e,t,n,s){var i=mt(),s=l().set(s,t);return i[n](s,e)}function fn(e,t,n){if(u(e)&&(t=e,e=void 0),e=e||"",null!=t)return cn(e,t,n,"month");for(var s=[],i=0;i<12;i++)s[i]=cn(e,i,n,"month");return s}function mn(e,t,n,s){t=("boolean"==typeof e?u(t)&&(n=t,t=void 0):(t=e,e=!1,u(n=t)&&(n=t,t=void 0)),t||"");var i,r=mt(),a=e?r._week.dow:0,o=[];if(null!=n)return cn(t,(n+a)%7,s,"day");for(i=0;i<7;i++)o[i]=cn(t,(i+a)%7,s,"day");return o}w.calendar=function(e,t,n){return d(e=this._calendar[e]||this._calendar.sameElse)?e.call(t,n):e},w.longDateFormat=function(e){var t=this._longDateFormat[e],n=this._longDateFormat[e.toUpperCase()];return t||!n?t:(this._longDateFormat[e]=n.match(te).map(function(e){return"MMMM"===e||"MM"===e||"DD"===e||"dddd"===e?e.slice(1):e}).join(""),this._longDateFormat[e])},w.invalidDate=function(){return this._invalidDate},w.ordinal=function(e){return this._ordinal.replace("%d",e)},w.preparse=dn,w.postformat=dn,w.relativeTime=function(e,t,n,s){var i=this._relativeTime[n];return d(i)?i(e,t,n,s):i.replace(/%d/i,e)},w.pastFuture=function(e,t){return d(e=this._relativeTime[0<e?"future":"past"])?e(t):e.replace(/%s/i,t)},w.set=function(e){var t,n;for(n in e)c(e,n)&&(d(t=e[n])?this[n]=t:this["_"+n]=t);this._config=e,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},w.eras=function(e,t){for(var n,s=this._eras||mt("en")._eras,i=0,r=s.length;i<r;++i){switch(typeof s[i].since){case"string":n=f(s[i].since).startOf("day"),s[i].since=n.valueOf();break}switch(typeof s[i].until){case"undefined":s[i].until=1/0;break;case"string":n=f(s[i].until).startOf("day").valueOf(),s[i].until=n.valueOf();break}}return s},w.erasParse=function(e,t,n){var s,i,r,a,o,u=this.eras();for(e=e.toUpperCase(),s=0,i=u.length;s<i;++s)if(r=u[s].name.toUpperCase(),a=u[s].abbr.toUpperCase(),o=u[s].narrow.toUpperCase(),n)switch(t){case"N":case"NN":case"NNN":if(a===e)return u[s];break;case"NNNN":if(r===e)return u[s];break;case"NNNNN":if(o===e)return u[s];break}else if(0<=[r,a,o].indexOf(e))return u[s]},w.erasConvertYear=function(e,t){var n=e.since<=e.until?1:-1;return void 0===t?f(e.since).year():f(e.since).year()+(t-e.offset)*n},w.erasAbbrRegex=function(e){return c(this,"_erasAbbrRegex")||an.call(this),e?this._erasAbbrRegex:this._erasRegex},w.erasNameRegex=function(e){return c(this,"_erasNameRegex")||an.call(this),e?this._erasNameRegex:this._erasRegex},w.erasNarrowRegex=function(e){return c(this,"_erasNarrowRegex")||an.call(this),e?this._erasNarrowRegex:this._erasRegex},w.months=function(e,t){return e?(a(this._months)?this._months:this._months[(this._months.isFormat||He).test(t)?"format":"standalone"])[e.month()]:a(this._months)?this._months:this._months.standalone},w.monthsShort=function(e,t){return e?(a(this._monthsShort)?this._monthsShort:this._monthsShort[He.test(t)?"format":"standalone"])[e.month()]:a(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},w.monthsParse=function(e,t,n){var s,i;if(this._monthsParseExact)return function(e,t,n){var s,i,r,e=e.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],s=0;s<12;++s)r=l([2e3,s]),this._shortMonthsParse[s]=this.monthsShort(r,"").toLocaleLowerCase(),this._longMonthsParse[s]=this.months(r,"").toLocaleLowerCase();return n?"MMM"===t?-1!==(i=S.call(this._shortMonthsParse,e))?i:null:-1!==(i=S.call(this._longMonthsParse,e))?i:null:"MMM"===t?-1!==(i=S.call(this._shortMonthsParse,e))||-1!==(i=S.call(this._longMonthsParse,e))?i:null:-1!==(i=S.call(this._longMonthsParse,e))||-1!==(i=S.call(this._shortMonthsParse,e))?i:null}.call(this,e,t,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),s=0;s<12;s++){if(i=l([2e3,s]),n&&!this._longMonthsParse[s]&&(this._longMonthsParse[s]=new RegExp("^"+this.months(i,"").replace(".","")+"$","i"),this._shortMonthsParse[s]=new RegExp("^"+this.monthsShort(i,"").replace(".","")+"$","i")),n||this._monthsParse[s]||(i="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[s]=new RegExp(i.replace(".",""),"i")),n&&"MMMM"===t&&this._longMonthsParse[s].test(e))return s;if(n&&"MMM"===t&&this._shortMonthsParse[s].test(e))return s;if(!n&&this._monthsParse[s].test(e))return s}},w.monthsRegex=function(e){return this._monthsParseExact?(c(this,"_monthsRegex")||Ee.call(this),e?this._monthsStrictRegex:this._monthsRegex):(c(this,"_monthsRegex")||(this._monthsRegex=Le),this._monthsStrictRegex&&e?this._monthsStrictRegex:this._monthsRegex)},w.monthsShortRegex=function(e){return this._monthsParseExact?(c(this,"_monthsRegex")||Ee.call(this),e?this._monthsShortStrictRegex:this._monthsShortRegex):(c(this,"_monthsShortRegex")||(this._monthsShortRegex=Fe),this._monthsShortStrictRegex&&e?this._monthsShortStrictRegex:this._monthsShortRegex)},w.week=function(e){return qe(e,this._week.dow,this._week.doy).week},w.firstDayOfYear=function(){return this._week.doy},w.firstDayOfWeek=function(){return this._week.dow},w.weekdays=function(e,t){return t=a(this._weekdays)?this._weekdays:this._weekdays[e&&!0!==e&&this._weekdays.isFormat.test(t)?"format":"standalone"],!0===e?Be(t,this._week.dow):e?t[e.day()]:t},w.weekdaysMin=function(e){return!0===e?Be(this._weekdaysMin,this._week.dow):e?this._weekdaysMin[e.day()]:this._weekdaysMin},w.weekdaysShort=function(e){return!0===e?Be(this._weekdaysShort,this._week.dow):e?this._weekdaysShort[e.day()]:this._weekdaysShort},w.weekdaysParse=function(e,t,n){var s,i;if(this._weekdaysParseExact)return function(e,t,n){var s,i,r,e=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],s=0;s<7;++s)r=l([2e3,1]).day(s),this._minWeekdaysParse[s]=this.weekdaysMin(r,"").toLocaleLowerCase(),this._shortWeekdaysParse[s]=this.weekdaysShort(r,"").toLocaleLowerCase(),this._weekdaysParse[s]=this.weekdays(r,"").toLocaleLowerCase();return n?"dddd"===t?-1!==(i=S.call(this._weekdaysParse,e))?i:null:"ddd"===t?-1!==(i=S.call(this._shortWeekdaysParse,e))?i:null:-1!==(i=S.call(this._minWeekdaysParse,e))?i:null:"dddd"===t?-1!==(i=S.call(this._weekdaysParse,e))||-1!==(i=S.call(this._shortWeekdaysParse,e))||-1!==(i=S.call(this._minWeekdaysParse,e))?i:null:"ddd"===t?-1!==(i=S.call(this._shortWeekdaysParse,e))||-1!==(i=S.call(this._weekdaysParse,e))||-1!==(i=S.call(this._minWeekdaysParse,e))?i:null:-1!==(i=S.call(this._minWeekdaysParse,e))||-1!==(i=S.call(this._weekdaysParse,e))||-1!==(i=S.call(this._shortWeekdaysParse,e))?i:null}.call(this,e,t,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),s=0;s<7;s++){if(i=l([2e3,1]).day(s),n&&!this._fullWeekdaysParse[s]&&(this._fullWeekdaysParse[s]=new RegExp("^"+this.weekdays(i,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[s]=new RegExp("^"+this.weekdaysShort(i,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[s]=new RegExp("^"+this.weekdaysMin(i,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[s]||(i="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[s]=new RegExp(i.replace(".",""),"i")),n&&"dddd"===t&&this._fullWeekdaysParse[s].test(e))return s;if(n&&"ddd"===t&&this._shortWeekdaysParse[s].test(e))return s;if(n&&"dd"===t&&this._minWeekdaysParse[s].test(e))return s;if(!n&&this._weekdaysParse[s].test(e))return s}},w.weekdaysRegex=function(e){return this._weekdaysParseExact?(c(this,"_weekdaysRegex")||nt.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(c(this,"_weekdaysRegex")||(this._weekdaysRegex=Ke),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)},w.weekdaysShortRegex=function(e){return this._weekdaysParseExact?(c(this,"_weekdaysRegex")||nt.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(c(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=et),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},w.weekdaysMinRegex=function(e){return this._weekdaysParseExact?(c(this,"_weekdaysRegex")||nt.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(c(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=tt),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},w.isPM=function(e){return"p"===(e+"").toLowerCase().charAt(0)},w.meridiem=function(e,t,n){return 11<e?n?"pm":"PM":n?"am":"AM"},ct("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10;return e+(1===g(e%100/10)?"th":1==t?"st":2==t?"nd":3==t?"rd":"th")}}),f.lang=e("moment.lang is deprecated. Use moment.locale instead.",ct),f.langData=e("moment.langData is deprecated. Use moment.localeData instead.",mt);var _n=Math.abs;function yn(e,t,n,s){t=C(t,n);return e._milliseconds+=s*t._milliseconds,e._days+=s*t._days,e._months+=s*t._months,e._bubble()}function gn(e){return e<0?Math.floor(e):Math.ceil(e)}function wn(e){return 4800*e/146097}function pn(e){return 146097*e/4800}function kn(e){return function(){return this.as(e)}}pe=kn("ms"),me=kn("s"),Ce=kn("m"),we=kn("h"),ge=kn("d"),Je=kn("w"),k=kn("M"),_e=kn("Q"),ve=kn("y");function vn(e){return function(){return this.isValid()?this._data[e]:NaN}}var ye=vn("milliseconds"),ke=vn("seconds"),Ie=vn("minutes"),w=vn("hours"),Mn=vn("days"),Dn=vn("months"),Sn=vn("years");var Yn=Math.round,On={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function bn(e,t,n,s){var i=C(e).abs(),r=Yn(i.as("s")),a=Yn(i.as("m")),o=Yn(i.as("h")),u=Yn(i.as("d")),l=Yn(i.as("M")),h=Yn(i.as("w")),i=Yn(i.as("y")),r=(r<=n.ss?["s",r]:r<n.s&&["ss",r])||a<=1&&["m"]||a<n.m&&["mm",a]||o<=1&&["h"]||o<n.h&&["hh",o]||u<=1&&["d"]||u<n.d&&["dd",u];return(r=(r=null!=n.w?r||h<=1&&["w"]||h<n.w&&["ww",h]:r)||l<=1&&["M"]||l<n.M&&["MM",l]||i<=1&&["y"]||["yy",i])[2]=t,r[3]=0<+e,r[4]=s,function(e,t,n,s,i){return i.relativeTime(t||1,!!n,e,s)}.apply(null,r)}var xn=Math.abs;function Tn(e){return(0<e)-(e<0)||+e}function Nn(){if(!this.isValid())return this.localeData().invalidDate();var e,t,n,s,i,r,a,o=xn(this._milliseconds)/1e3,u=xn(this._days),l=xn(this._months),h=this.asSeconds();return h?(e=y(o/60),t=y(e/60),o%=60,e%=60,n=y(l/12),l%=12,s=o?o.toFixed(3).replace(/\.?0+$/,""):"",i=Tn(this._months)!==Tn(h)?"-":"",r=Tn(this._days)!==Tn(h)?"-":"",a=Tn(this._milliseconds)!==Tn(h)?"-":"",(h<0?"-":"")+"P"+(n?i+n+"Y":"")+(l?i+l+"M":"")+(u?r+u+"D":"")+(t||e||o?"T":"")+(t?a+t+"H":"")+(e?a+e+"M":"")+(o?a+s+"S":"")):"P0D"}var U=Ct.prototype;return U.isValid=function(){return this._isValid},U.abs=function(){var e=this._data;return this._milliseconds=_n(this._milliseconds),this._days=_n(this._days),this._months=_n(this._months),e.milliseconds=_n(e.milliseconds),e.seconds=_n(e.seconds),e.minutes=_n(e.minutes),e.hours=_n(e.hours),e.months=_n(e.months),e.years=_n(e.years),this},U.add=function(e,t){return yn(this,e,t,1)},U.subtract=function(e,t){return yn(this,e,t,-1)},U.as=function(e){if(!this.isValid())return NaN;var t,n,s=this._milliseconds;if("month"===(e=_(e))||"quarter"===e||"year"===e)switch(t=this._days+s/864e5,n=this._months+wn(t),e){case"month":return n;case"quarter":return n/3;case"year":return n/12}else switch(t=this._days+Math.round(pn(this._months)),e){case"week":return t/7+s/6048e5;case"day":return t+s/864e5;case"hour":return 24*t+s/36e5;case"minute":return 1440*t+s/6e4;case"second":return 86400*t+s/1e3;case"millisecond":return Math.floor(864e5*t)+s;default:throw new Error("Unknown unit "+e)}},U.asMilliseconds=pe,U.asSeconds=me,U.asMinutes=Ce,U.asHours=we,U.asDays=ge,U.asWeeks=Je,U.asMonths=k,U.asQuarters=_e,U.asYears=ve,U.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*g(this._months/12):NaN},U._bubble=function(){var e=this._milliseconds,t=this._days,n=this._months,s=this._data;return 0<=e&&0<=t&&0<=n||e<=0&&t<=0&&n<=0||(e+=864e5*gn(pn(n)+t),n=t=0),s.milliseconds=e%1e3,e=y(e/1e3),s.seconds=e%60,e=y(e/60),s.minutes=e%60,e=y(e/60),s.hours=e%24,t+=y(e/24),n+=e=y(wn(t)),t-=gn(pn(e)),e=y(n/12),n%=12,s.days=t,s.months=n,s.years=e,this},U.clone=function(){return C(this)},U.get=function(e){return e=_(e),this.isValid()?this[e+"s"]():NaN},U.milliseconds=ye,U.seconds=ke,U.minutes=Ie,U.hours=w,U.days=Mn,U.weeks=function(){return y(this.days()/7)},U.months=Dn,U.years=Sn,U.humanize=function(e,t){if(!this.isValid())return this.localeData().invalidDate();var n=!1,s=On;return"object"==typeof e&&(t=e,e=!1),"boolean"==typeof e&&(n=e),"object"==typeof t&&(s=Object.assign({},On,t),null!=t.s&&null==t.ss&&(s.ss=t.s-1)),e=this.localeData(),t=bn(this,!n,s,e),n&&(t=e.pastFuture(+this,t)),e.postformat(t)},U.toISOString=Nn,U.toString=Nn,U.toJSON=Nn,U.locale=Xt,U.localeData=Kt,U.toIsoString=e("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Nn),U.lang=Xe,s("X",0,0,"unix"),s("x",0,0,"valueOf"),v("x",De),v("X",/[+-]?\d+(\.\d{1,3})?/),D("X",function(e,t,n){n._d=new Date(1e3*parseFloat(e))}),D("x",function(e,t,n){n._d=new Date(g(e))}),f.version="2.29.4",H=W,f.fn=i,f.min=function(){return Rt("isBefore",[].slice.call(arguments,0))},f.max=function(){return Rt("isAfter",[].slice.call(arguments,0))},f.now=function(){return Date.now?Date.now():+new Date},f.utc=l,f.unix=function(e){return W(1e3*e)},f.months=function(e,t){return fn(e,t,"months")},f.isDate=V,f.locale=ct,f.invalid=I,f.duration=C,f.isMoment=h,f.weekdays=function(e,t,n){return mn(e,t,n,"weekdays")},f.parseZone=function(){return W.apply(null,arguments).parseZone()},f.localeData=mt,f.isDuration=Ut,f.monthsShort=function(e,t){return fn(e,t,"monthsShort")},f.weekdaysMin=function(e,t,n){return mn(e,t,n,"weekdaysMin")},f.defineLocale=ft,f.updateLocale=function(e,t){var n,s;return null!=t?(s=ot,null!=R[e]&&null!=R[e].parentLocale?R[e].set(X(R[e]._config,t)):(t=X(s=null!=(n=dt(e))?n._config:s,t),null==n&&(t.abbr=e),(s=new K(t)).parentLocale=R[e],R[e]=s),ct(e)):null!=R[e]&&(null!=R[e].parentLocale?(R[e]=R[e].parentLocale,e===ct()&&ct(e)):null!=R[e]&&delete R[e]),R[e]},f.locales=function(){return ee(R)},f.weekdaysShort=function(e,t,n){return mn(e,t,n,"weekdaysShort")},f.normalizeUnits=_,f.relativeTimeRounding=function(e){return void 0===e?Yn:"function"==typeof e&&(Yn=e,!0)},f.relativeTimeThreshold=function(e,t){return void 0!==On[e]&&(void 0===t?On[e]:(On[e]=t,"s"===e&&(On.ss=t-1),!0))},f.calendarFormat=function(e,t){return(e=e.diff(t,"days",!0))<-6?"sameElse":e<-1?"lastWeek":e<0?"lastDay":e<1?"sameDay":e<2?"nextDay":e<7?"nextWeek":"sameElse"},f.prototype=i,f.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},f});
//# sourceMappingURL=moment.min.js.map//! moment.js locale configuration
//! locale : Afrikaans [af]
//! author : Werner Mollentze : https://github.com/wernerm

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var af = moment.defineLocale('af', {
        months: 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'),
        weekdays: 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split(
            '_'
        ),
        weekdaysShort: 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'),
        weekdaysMin: 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'),
        meridiemParse: /vm|nm/i,
        isPM: function (input) {
            return /^nm$/i.test(input);
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours < 12) {
                return isLower ? 'vm' : 'VM';
            } else {
                return isLower ? 'nm' : 'NM';
            }
        },
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Vandag om] LT',
            nextDay: '[Môre om] LT',
            nextWeek: 'dddd [om] LT',
            lastDay: '[Gister om] LT',
            lastWeek: '[Laas] dddd [om] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'oor %s',
            past: '%s gelede',
            s: "'n paar sekondes",
            ss: '%d sekondes',
            m: "'n minuut",
            mm: '%d minute',
            h: "'n uur",
            hh: '%d ure',
            d: "'n dag",
            dd: '%d dae',
            M: "'n maand",
            MM: '%d maande',
            y: "'n jaar",
            yy: '%d jaar',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/,
        ordinal: function (number) {
            return (
                number +
                (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')
            ); // Thanks to Joris Röling : https://github.com/jjupiter
        },
        week: {
            dow: 1, // Maandag is die eerste dag van die week.
            doy: 4, // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
        },
    });

    return af;

})));
//! moment.js locale configuration
//! locale : Arabic (Algeria) [ar-dz]
//! author : Amine Roukh: https://github.com/Amine27
//! author : Abdel Said: https://github.com/abdelsaid
//! author : Ahmed Elkhatib
//! author : forabi https://github.com/forabi
//! author : Noureddine LOUAHEDJ : https://github.com/noureddinem

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var pluralForm = function (n) {
            return n === 0
                ? 0
                : n === 1
                ? 1
                : n === 2
                ? 2
                : n % 100 >= 3 && n % 100 <= 10
                ? 3
                : n % 100 >= 11
                ? 4
                : 5;
        },
        plurals = {
            s: [
                'أقل من ثانية',
                'ثانية واحدة',
                ['ثانيتان', 'ثانيتين'],
                '%d ثوان',
                '%d ثانية',
                '%d ثانية',
            ],
            m: [
                'أقل من دقيقة',
                'دقيقة واحدة',
                ['دقيقتان', 'دقيقتين'],
                '%d دقائق',
                '%d دقيقة',
                '%d دقيقة',
            ],
            h: [
                'أقل من ساعة',
                'ساعة واحدة',
                ['ساعتان', 'ساعتين'],
                '%d ساعات',
                '%d ساعة',
                '%d ساعة',
            ],
            d: [
                'أقل من يوم',
                'يوم واحد',
                ['يومان', 'يومين'],
                '%d أيام',
                '%d يومًا',
                '%d يوم',
            ],
            M: [
                'أقل من شهر',
                'شهر واحد',
                ['شهران', 'شهرين'],
                '%d أشهر',
                '%d شهرا',
                '%d شهر',
            ],
            y: [
                'أقل من عام',
                'عام واحد',
                ['عامان', 'عامين'],
                '%d أعوام',
                '%d عامًا',
                '%d عام',
            ],
        },
        pluralize = function (u) {
            return function (number, withoutSuffix, string, isFuture) {
                var f = pluralForm(number),
                    str = plurals[u][pluralForm(number)];
                if (f === 2) {
                    str = str[withoutSuffix ? 0 : 1];
                }
                return str.replace(/%d/i, number);
            };
        },
        months = [
            'جانفي',
            'فيفري',
            'مارس',
            'أفريل',
            'ماي',
            'جوان',
            'جويلية',
            'أوت',
            'سبتمبر',
            'أكتوبر',
            'نوفمبر',
            'ديسمبر',
        ];

    var arDz = moment.defineLocale('ar-dz', {
        months: months,
        monthsShort: months,
        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'D/\u200FM/\u200FYYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        meridiemParse: /ص|م/,
        isPM: function (input) {
            return 'م' === input;
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'ص';
            } else {
                return 'م';
            }
        },
        calendar: {
            sameDay: '[اليوم عند الساعة] LT',
            nextDay: '[غدًا عند الساعة] LT',
            nextWeek: 'dddd [عند الساعة] LT',
            lastDay: '[أمس عند الساعة] LT',
            lastWeek: 'dddd [عند الساعة] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'بعد %s',
            past: 'منذ %s',
            s: pluralize('s'),
            ss: pluralize('s'),
            m: pluralize('m'),
            mm: pluralize('m'),
            h: pluralize('h'),
            hh: pluralize('h'),
            d: pluralize('d'),
            dd: pluralize('d'),
            M: pluralize('M'),
            MM: pluralize('M'),
            y: pluralize('y'),
            yy: pluralize('y'),
        },
        postformat: function (string) {
            return string.replace(/,/g, '،');
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return arDz;

})));
//! moment.js locale configuration
//! locale : Arabic (Kuwait) [ar-kw]
//! author : Nusret Parlak: https://github.com/nusretparlak

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var arKw = moment.defineLocale('ar-kw', {
        months: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(
            '_'
        ),
        monthsShort:
            'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(
                '_'
            ),
        weekdays: 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
        weekdaysShort: 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[اليوم على الساعة] LT',
            nextDay: '[غدا على الساعة] LT',
            nextWeek: 'dddd [على الساعة] LT',
            lastDay: '[أمس على الساعة] LT',
            lastWeek: 'dddd [على الساعة] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'في %s',
            past: 'منذ %s',
            s: 'ثوان',
            ss: '%d ثانية',
            m: 'دقيقة',
            mm: '%d دقائق',
            h: 'ساعة',
            hh: '%d ساعات',
            d: 'يوم',
            dd: '%d أيام',
            M: 'شهر',
            MM: '%d أشهر',
            y: 'سنة',
            yy: '%d سنوات',
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 12, // The week that contains Jan 12th is the first week of the year.
        },
    });

    return arKw;

})));
//! moment.js locale configuration
//! locale : Arabic (Libya) [ar-ly]
//! author : Ali Hmer: https://github.com/kikoanis

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var symbolMap = {
            1: '1',
            2: '2',
            3: '3',
            4: '4',
            5: '5',
            6: '6',
            7: '7',
            8: '8',
            9: '9',
            0: '0',
        },
        pluralForm = function (n) {
            return n === 0
                ? 0
                : n === 1
                ? 1
                : n === 2
                ? 2
                : n % 100 >= 3 && n % 100 <= 10
                ? 3
                : n % 100 >= 11
                ? 4
                : 5;
        },
        plurals = {
            s: [
                'أقل من ثانية',
                'ثانية واحدة',
                ['ثانيتان', 'ثانيتين'],
                '%d ثوان',
                '%d ثانية',
                '%d ثانية',
            ],
            m: [
                'أقل من دقيقة',
                'دقيقة واحدة',
                ['دقيقتان', 'دقيقتين'],
                '%d دقائق',
                '%d دقيقة',
                '%d دقيقة',
            ],
            h: [
                'أقل من ساعة',
                'ساعة واحدة',
                ['ساعتان', 'ساعتين'],
                '%d ساعات',
                '%d ساعة',
                '%d ساعة',
            ],
            d: [
                'أقل من يوم',
                'يوم واحد',
                ['يومان', 'يومين'],
                '%d أيام',
                '%d يومًا',
                '%d يوم',
            ],
            M: [
                'أقل من شهر',
                'شهر واحد',
                ['شهران', 'شهرين'],
                '%d أشهر',
                '%d شهرا',
                '%d شهر',
            ],
            y: [
                'أقل من عام',
                'عام واحد',
                ['عامان', 'عامين'],
                '%d أعوام',
                '%d عامًا',
                '%d عام',
            ],
        },
        pluralize = function (u) {
            return function (number, withoutSuffix, string, isFuture) {
                var f = pluralForm(number),
                    str = plurals[u][pluralForm(number)];
                if (f === 2) {
                    str = str[withoutSuffix ? 0 : 1];
                }
                return str.replace(/%d/i, number);
            };
        },
        months = [
            'يناير',
            'فبراير',
            'مارس',
            'أبريل',
            'مايو',
            'يونيو',
            'يوليو',
            'أغسطس',
            'سبتمبر',
            'أكتوبر',
            'نوفمبر',
            'ديسمبر',
        ];

    var arLy = moment.defineLocale('ar-ly', {
        months: months,
        monthsShort: months,
        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'D/\u200FM/\u200FYYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        meridiemParse: /ص|م/,
        isPM: function (input) {
            return 'م' === input;
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'ص';
            } else {
                return 'م';
            }
        },
        calendar: {
            sameDay: '[اليوم عند الساعة] LT',
            nextDay: '[غدًا عند الساعة] LT',
            nextWeek: 'dddd [عند الساعة] LT',
            lastDay: '[أمس عند الساعة] LT',
            lastWeek: 'dddd [عند الساعة] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'بعد %s',
            past: 'منذ %s',
            s: pluralize('s'),
            ss: pluralize('s'),
            m: pluralize('m'),
            mm: pluralize('m'),
            h: pluralize('h'),
            hh: pluralize('h'),
            d: pluralize('d'),
            dd: pluralize('d'),
            M: pluralize('M'),
            MM: pluralize('M'),
            y: pluralize('y'),
            yy: pluralize('y'),
        },
        preparse: function (string) {
            return string.replace(/،/g, ',');
        },
        postformat: function (string) {
            return string
                .replace(/\d/g, function (match) {
                    return symbolMap[match];
                })
                .replace(/,/g, '،');
        },
        week: {
            dow: 6, // Saturday is the first day of the week.
            doy: 12, // The week that contains Jan 12th is the first week of the year.
        },
    });

    return arLy;

})));
//! moment.js locale configuration
//! locale : Arabic (Morocco) [ar-ma]
//! author : ElFadili Yassine : https://github.com/ElFadiliY
//! author : Abdel Said : https://github.com/abdelsaid

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var arMa = moment.defineLocale('ar-ma', {
        months: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(
            '_'
        ),
        monthsShort:
            'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(
                '_'
            ),
        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
        weekdaysShort: 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[اليوم على الساعة] LT',
            nextDay: '[غدا على الساعة] LT',
            nextWeek: 'dddd [على الساعة] LT',
            lastDay: '[أمس على الساعة] LT',
            lastWeek: 'dddd [على الساعة] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'في %s',
            past: 'منذ %s',
            s: 'ثوان',
            ss: '%d ثانية',
            m: 'دقيقة',
            mm: '%d دقائق',
            h: 'ساعة',
            hh: '%d ساعات',
            d: 'يوم',
            dd: '%d أيام',
            M: 'شهر',
            MM: '%d أشهر',
            y: 'سنة',
            yy: '%d سنوات',
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return arMa;

})));
//! moment.js locale configuration
//! locale : Arabic (Saudi Arabia) [ar-sa]
//! author : Suhail Alkowaileet : https://github.com/xsoh

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var symbolMap = {
            1: '١',
            2: '٢',
            3: '٣',
            4: '٤',
            5: '٥',
            6: '٦',
            7: '٧',
            8: '٨',
            9: '٩',
            0: '٠',
        },
        numberMap = {
            '١': '1',
            '٢': '2',
            '٣': '3',
            '٤': '4',
            '٥': '5',
            '٦': '6',
            '٧': '7',
            '٨': '8',
            '٩': '9',
            '٠': '0',
        };

    var arSa = moment.defineLocale('ar-sa', {
        months: 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(
            '_'
        ),
        monthsShort:
            'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(
                '_'
            ),
        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        meridiemParse: /ص|م/,
        isPM: function (input) {
            return 'م' === input;
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'ص';
            } else {
                return 'م';
            }
        },
        calendar: {
            sameDay: '[اليوم على الساعة] LT',
            nextDay: '[غدا على الساعة] LT',
            nextWeek: 'dddd [على الساعة] LT',
            lastDay: '[أمس على الساعة] LT',
            lastWeek: 'dddd [على الساعة] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'في %s',
            past: 'منذ %s',
            s: 'ثوان',
            ss: '%d ثانية',
            m: 'دقيقة',
            mm: '%d دقائق',
            h: 'ساعة',
            hh: '%d ساعات',
            d: 'يوم',
            dd: '%d أيام',
            M: 'شهر',
            MM: '%d أشهر',
            y: 'سنة',
            yy: '%d سنوات',
        },
        preparse: function (string) {
            return string
                .replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
                    return numberMap[match];
                })
                .replace(/،/g, ',');
        },
        postformat: function (string) {
            return string
                .replace(/\d/g, function (match) {
                    return symbolMap[match];
                })
                .replace(/,/g, '،');
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    return arSa;

})));
//! moment.js locale configuration
//! locale  :  Arabic (Tunisia) [ar-tn]
//! author : Nader Toukabri : https://github.com/naderio

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var arTn = moment.defineLocale('ar-tn', {
        months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(
            '_'
        ),
        monthsShort:
            'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(
                '_'
            ),
        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[اليوم على الساعة] LT',
            nextDay: '[غدا على الساعة] LT',
            nextWeek: 'dddd [على الساعة] LT',
            lastDay: '[أمس على الساعة] LT',
            lastWeek: 'dddd [على الساعة] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'في %s',
            past: 'منذ %s',
            s: 'ثوان',
            ss: '%d ثانية',
            m: 'دقيقة',
            mm: '%d دقائق',
            h: 'ساعة',
            hh: '%d ساعات',
            d: 'يوم',
            dd: '%d أيام',
            M: 'شهر',
            MM: '%d أشهر',
            y: 'سنة',
            yy: '%d سنوات',
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return arTn;

})));
//! moment.js locale configuration
//! locale : Arabic [ar]
//! author : Abdel Said: https://github.com/abdelsaid
//! author : Ahmed Elkhatib
//! author : forabi https://github.com/forabi

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var symbolMap = {
            1: '١',
            2: '٢',
            3: '٣',
            4: '٤',
            5: '٥',
            6: '٦',
            7: '٧',
            8: '٨',
            9: '٩',
            0: '٠',
        },
        numberMap = {
            '١': '1',
            '٢': '2',
            '٣': '3',
            '٤': '4',
            '٥': '5',
            '٦': '6',
            '٧': '7',
            '٨': '8',
            '٩': '9',
            '٠': '0',
        },
        pluralForm = function (n) {
            return n === 0
                ? 0
                : n === 1
                ? 1
                : n === 2
                ? 2
                : n % 100 >= 3 && n % 100 <= 10
                ? 3
                : n % 100 >= 11
                ? 4
                : 5;
        },
        plurals = {
            s: [
                'أقل من ثانية',
                'ثانية واحدة',
                ['ثانيتان', 'ثانيتين'],
                '%d ثوان',
                '%d ثانية',
                '%d ثانية',
            ],
            m: [
                'أقل من دقيقة',
                'دقيقة واحدة',
                ['دقيقتان', 'دقيقتين'],
                '%d دقائق',
                '%d دقيقة',
                '%d دقيقة',
            ],
            h: [
                'أقل من ساعة',
                'ساعة واحدة',
                ['ساعتان', 'ساعتين'],
                '%d ساعات',
                '%d ساعة',
                '%d ساعة',
            ],
            d: [
                'أقل من يوم',
                'يوم واحد',
                ['يومان', 'يومين'],
                '%d أيام',
                '%d يومًا',
                '%d يوم',
            ],
            M: [
                'أقل من شهر',
                'شهر واحد',
                ['شهران', 'شهرين'],
                '%d أشهر',
                '%d شهرا',
                '%d شهر',
            ],
            y: [
                'أقل من عام',
                'عام واحد',
                ['عامان', 'عامين'],
                '%d أعوام',
                '%d عامًا',
                '%d عام',
            ],
        },
        pluralize = function (u) {
            return function (number, withoutSuffix, string, isFuture) {
                var f = pluralForm(number),
                    str = plurals[u][pluralForm(number)];
                if (f === 2) {
                    str = str[withoutSuffix ? 0 : 1];
                }
                return str.replace(/%d/i, number);
            };
        },
        months = [
            'يناير',
            'فبراير',
            'مارس',
            'أبريل',
            'مايو',
            'يونيو',
            'يوليو',
            'أغسطس',
            'سبتمبر',
            'أكتوبر',
            'نوفمبر',
            'ديسمبر',
        ];

    var ar = moment.defineLocale('ar', {
        months: months,
        monthsShort: months,
        weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
        weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
        weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'D/\u200FM/\u200FYYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        meridiemParse: /ص|م/,
        isPM: function (input) {
            return 'م' === input;
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'ص';
            } else {
                return 'م';
            }
        },
        calendar: {
            sameDay: '[اليوم عند الساعة] LT',
            nextDay: '[غدًا عند الساعة] LT',
            nextWeek: 'dddd [عند الساعة] LT',
            lastDay: '[أمس عند الساعة] LT',
            lastWeek: 'dddd [عند الساعة] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'بعد %s',
            past: 'منذ %s',
            s: pluralize('s'),
            ss: pluralize('s'),
            m: pluralize('m'),
            mm: pluralize('m'),
            h: pluralize('h'),
            hh: pluralize('h'),
            d: pluralize('d'),
            dd: pluralize('d'),
            M: pluralize('M'),
            MM: pluralize('M'),
            y: pluralize('y'),
            yy: pluralize('y'),
        },
        preparse: function (string) {
            return string
                .replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
                    return numberMap[match];
                })
                .replace(/،/g, ',');
        },
        postformat: function (string) {
            return string
                .replace(/\d/g, function (match) {
                    return symbolMap[match];
                })
                .replace(/,/g, '،');
        },
        week: {
            dow: 6, // Saturday is the first day of the week.
            doy: 12, // The week that contains Jan 12th is the first week of the year.
        },
    });

    return ar;

})));
//! moment.js locale configuration
//! locale : Azerbaijani [az]
//! author : topchiyev : https://github.com/topchiyev

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var suffixes = {
        1: '-inci',
        5: '-inci',
        8: '-inci',
        70: '-inci',
        80: '-inci',
        2: '-nci',
        7: '-nci',
        20: '-nci',
        50: '-nci',
        3: '-üncü',
        4: '-üncü',
        100: '-üncü',
        6: '-ncı',
        9: '-uncu',
        10: '-uncu',
        30: '-uncu',
        60: '-ıncı',
        90: '-ıncı',
    };

    var az = moment.defineLocale('az', {
        months: 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split(
            '_'
        ),
        monthsShort: 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'),
        weekdays:
            'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split(
                '_'
            ),
        weekdaysShort: 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'),
        weekdaysMin: 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[bugün saat] LT',
            nextDay: '[sabah saat] LT',
            nextWeek: '[gələn həftə] dddd [saat] LT',
            lastDay: '[dünən] LT',
            lastWeek: '[keçən həftə] dddd [saat] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s sonra',
            past: '%s əvvəl',
            s: 'bir neçə saniyə',
            ss: '%d saniyə',
            m: 'bir dəqiqə',
            mm: '%d dəqiqə',
            h: 'bir saat',
            hh: '%d saat',
            d: 'bir gün',
            dd: '%d gün',
            M: 'bir ay',
            MM: '%d ay',
            y: 'bir il',
            yy: '%d il',
        },
        meridiemParse: /gecə|səhər|gündüz|axşam/,
        isPM: function (input) {
            return /^(gündüz|axşam)$/.test(input);
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'gecə';
            } else if (hour < 12) {
                return 'səhər';
            } else if (hour < 17) {
                return 'gündüz';
            } else {
                return 'axşam';
            }
        },
        dayOfMonthOrdinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,
        ordinal: function (number) {
            if (number === 0) {
                // special case for zero
                return number + '-ıncı';
            }
            var a = number % 10,
                b = (number % 100) - a,
                c = number >= 100 ? 100 : null;
            return number + (suffixes[a] || suffixes[b] || suffixes[c]);
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    return az;

})));
//! moment.js locale configuration
//! locale : Belarusian [be]
//! author : Dmitry Demidov : https://github.com/demidov91
//! author: Praleska: http://praleska.pro/
//! Author : Menelion Elensúle : https://github.com/Oire

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    function plural(word, num) {
        var forms = word.split('_');
        return num % 10 === 1 && num % 100 !== 11
            ? forms[0]
            : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20)
            ? forms[1]
            : forms[2];
    }
    function relativeTimeWithPlural(number, withoutSuffix, key) {
        var format = {
            ss: withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд',
            mm: withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін',
            hh: withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін',
            dd: 'дзень_дні_дзён',
            MM: 'месяц_месяцы_месяцаў',
            yy: 'год_гады_гадоў',
        };
        if (key === 'm') {
            return withoutSuffix ? 'хвіліна' : 'хвіліну';
        } else if (key === 'h') {
            return withoutSuffix ? 'гадзіна' : 'гадзіну';
        } else {
            return number + ' ' + plural(format[key], +number);
        }
    }

    var be = moment.defineLocale('be', {
        months: {
            format: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split(
                '_'
            ),
            standalone:
                'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split(
                    '_'
                ),
        },
        monthsShort:
            'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'),
        weekdays: {
            format: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split(
                '_'
            ),
            standalone:
                'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split(
                    '_'
                ),
            isFormat: /\[ ?[Ууў] ?(?:мінулую|наступную)? ?\] ?dddd/,
        },
        weekdaysShort: 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
        weekdaysMin: 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY г.',
            LLL: 'D MMMM YYYY г., HH:mm',
            LLLL: 'dddd, D MMMM YYYY г., HH:mm',
        },
        calendar: {
            sameDay: '[Сёння ў] LT',
            nextDay: '[Заўтра ў] LT',
            lastDay: '[Учора ў] LT',
            nextWeek: function () {
                return '[У] dddd [ў] LT';
            },
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                    case 3:
                    case 5:
                    case 6:
                        return '[У мінулую] dddd [ў] LT';
                    case 1:
                    case 2:
                    case 4:
                        return '[У мінулы] dddd [ў] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'праз %s',
            past: '%s таму',
            s: 'некалькі секунд',
            m: relativeTimeWithPlural,
            mm: relativeTimeWithPlural,
            h: relativeTimeWithPlural,
            hh: relativeTimeWithPlural,
            d: 'дзень',
            dd: relativeTimeWithPlural,
            M: 'месяц',
            MM: relativeTimeWithPlural,
            y: 'год',
            yy: relativeTimeWithPlural,
        },
        meridiemParse: /ночы|раніцы|дня|вечара/,
        isPM: function (input) {
            return /^(дня|вечара)$/.test(input);
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'ночы';
            } else if (hour < 12) {
                return 'раніцы';
            } else if (hour < 17) {
                return 'дня';
            } else {
                return 'вечара';
            }
        },
        dayOfMonthOrdinalParse: /\d{1,2}-(і|ы|га)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'M':
                case 'd':
                case 'DDD':
                case 'w':
                case 'W':
                    return (number % 10 === 2 || number % 10 === 3) &&
                        number % 100 !== 12 &&
                        number % 100 !== 13
                        ? number + '-і'
                        : number + '-ы';
                case 'D':
                    return number + '-га';
                default:
                    return number;
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    return be;

})));
//! moment.js locale configuration
//! locale : Bulgarian [bg]
//! author : Krasen Borisov : https://github.com/kraz

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var bg = moment.defineLocale('bg', {
        months: 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split(
            '_'
        ),
        monthsShort: 'яну_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'),
        weekdays: 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split(
            '_'
        ),
        weekdaysShort: 'нед_пон_вто_сря_чет_пет_съб'.split('_'),
        weekdaysMin: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'D.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY H:mm',
            LLLL: 'dddd, D MMMM YYYY H:mm',
        },
        calendar: {
            sameDay: '[Днес в] LT',
            nextDay: '[Утре в] LT',
            nextWeek: 'dddd [в] LT',
            lastDay: '[Вчера в] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                    case 3:
                    case 6:
                        return '[Миналата] dddd [в] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[Миналия] dddd [в] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'след %s',
            past: 'преди %s',
            s: 'няколко секунди',
            ss: '%d секунди',
            m: 'минута',
            mm: '%d минути',
            h: 'час',
            hh: '%d часа',
            d: 'ден',
            dd: '%d дена',
            w: 'седмица',
            ww: '%d седмици',
            M: 'месец',
            MM: '%d месеца',
            y: 'година',
            yy: '%d години',
        },
        dayOfMonthOrdinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/,
        ordinal: function (number) {
            var lastDigit = number % 10,
                last2Digits = number % 100;
            if (number === 0) {
                return number + '-ев';
            } else if (last2Digits === 0) {
                return number + '-ен';
            } else if (last2Digits > 10 && last2Digits < 20) {
                return number + '-ти';
            } else if (lastDigit === 1) {
                return number + '-ви';
            } else if (lastDigit === 2) {
                return number + '-ри';
            } else if (lastDigit === 7 || lastDigit === 8) {
                return number + '-ми';
            } else {
                return number + '-ти';
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    return bg;

})));
//! moment.js locale configuration
//! locale : Bambara [bm]
//! author : Estelle Comment : https://github.com/estellecomment

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var bm = moment.defineLocale('bm', {
        months: 'Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_Mɛkalo_Zuwɛnkalo_Zuluyekalo_Utikalo_Sɛtanburukalo_ɔkutɔburukalo_Nowanburukalo_Desanburukalo'.split(
            '_'
        ),
        monthsShort: 'Zan_Few_Mar_Awi_Mɛ_Zuw_Zul_Uti_Sɛt_ɔku_Now_Des'.split('_'),
        weekdays: 'Kari_Ntɛnɛn_Tarata_Araba_Alamisa_Juma_Sibiri'.split('_'),
        weekdaysShort: 'Kar_Ntɛ_Tar_Ara_Ala_Jum_Sib'.split('_'),
        weekdaysMin: 'Ka_Nt_Ta_Ar_Al_Ju_Si'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'MMMM [tile] D [san] YYYY',
            LLL: 'MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm',
            LLLL: 'dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm',
        },
        calendar: {
            sameDay: '[Bi lɛrɛ] LT',
            nextDay: '[Sini lɛrɛ] LT',
            nextWeek: 'dddd [don lɛrɛ] LT',
            lastDay: '[Kunu lɛrɛ] LT',
            lastWeek: 'dddd [tɛmɛnen lɛrɛ] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s kɔnɔ',
            past: 'a bɛ %s bɔ',
            s: 'sanga dama dama',
            ss: 'sekondi %d',
            m: 'miniti kelen',
            mm: 'miniti %d',
            h: 'lɛrɛ kelen',
            hh: 'lɛrɛ %d',
            d: 'tile kelen',
            dd: 'tile %d',
            M: 'kalo kelen',
            MM: 'kalo %d',
            y: 'san kelen',
            yy: 'san %d',
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return bm;

})));
//! moment.js locale configuration
//! locale : Bengali (Bangladesh) [bn-bd]
//! author : Asraf Hossain Patoary : https://github.com/ashwoolford

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var symbolMap = {
            1: '১',
            2: '২',
            3: '৩',
            4: '৪',
            5: '৫',
            6: '৬',
            7: '৭',
            8: '৮',
            9: '৯',
            0: '০',
        },
        numberMap = {
            '১': '1',
            '২': '2',
            '৩': '3',
            '৪': '4',
            '৫': '5',
            '৬': '6',
            '৭': '7',
            '৮': '8',
            '৯': '9',
            '০': '0',
        };

    var bnBd = moment.defineLocale('bn-bd', {
        months: 'জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split(
            '_'
        ),
        monthsShort:
            'জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে'.split(
                '_'
            ),
        weekdays: 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split(
            '_'
        ),
        weekdaysShort: 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),
        weekdaysMin: 'রবি_সোম_মঙ্গল_বুধ_বৃহ_শুক্র_শনি'.split('_'),
        longDateFormat: {
            LT: 'A h:mm সময়',
            LTS: 'A h:mm:ss সময়',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm সময়',
            LLLL: 'dddd, D MMMM YYYY, A h:mm সময়',
        },
        calendar: {
            sameDay: '[আজ] LT',
            nextDay: '[আগামীকাল] LT',
            nextWeek: 'dddd, LT',
            lastDay: '[গতকাল] LT',
            lastWeek: '[গত] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s পরে',
            past: '%s আগে',
            s: 'কয়েক সেকেন্ড',
            ss: '%d সেকেন্ড',
            m: 'এক মিনিট',
            mm: '%d মিনিট',
            h: 'এক ঘন্টা',
            hh: '%d ঘন্টা',
            d: 'এক দিন',
            dd: '%d দিন',
            M: 'এক মাস',
            MM: '%d মাস',
            y: 'এক বছর',
            yy: '%d বছর',
        },
        preparse: function (string) {
            return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {
                return numberMap[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap[match];
            });
        },

        meridiemParse: /রাত|ভোর|সকাল|দুপুর|বিকাল|সন্ধ্যা|রাত/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'রাত') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'ভোর') {
                return hour;
            } else if (meridiem === 'সকাল') {
                return hour;
            } else if (meridiem === 'দুপুর') {
                return hour >= 3 ? hour : hour + 12;
            } else if (meridiem === 'বিকাল') {
                return hour + 12;
            } else if (meridiem === 'সন্ধ্যা') {
                return hour + 12;
            }
        },

        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'রাত';
            } else if (hour < 6) {
                return 'ভোর';
            } else if (hour < 12) {
                return 'সকাল';
            } else if (hour < 15) {
                return 'দুপুর';
            } else if (hour < 18) {
                return 'বিকাল';
            } else if (hour < 20) {
                return 'সন্ধ্যা';
            } else {
                return 'রাত';
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    return bnBd;

})));
//! moment.js locale configuration
//! locale : Bengali [bn]
//! author : Kaushik Gandhi : https://github.com/kaushikgandhi

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var symbolMap = {
            1: '১',
            2: '২',
            3: '৩',
            4: '৪',
            5: '৫',
            6: '৬',
            7: '৭',
            8: '৮',
            9: '৯',
            0: '০',
        },
        numberMap = {
            '১': '1',
            '২': '2',
            '৩': '3',
            '৪': '4',
            '৫': '5',
            '৬': '6',
            '৭': '7',
            '৮': '8',
            '৯': '9',
            '০': '0',
        };

    var bn = moment.defineLocale('bn', {
        months: 'জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split(
            '_'
        ),
        monthsShort:
            'জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে'.split(
                '_'
            ),
        weekdays: 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split(
            '_'
        ),
        weekdaysShort: 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),
        weekdaysMin: 'রবি_সোম_মঙ্গল_বুধ_বৃহ_শুক্র_শনি'.split('_'),
        longDateFormat: {
            LT: 'A h:mm সময়',
            LTS: 'A h:mm:ss সময়',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm সময়',
            LLLL: 'dddd, D MMMM YYYY, A h:mm সময়',
        },
        calendar: {
            sameDay: '[আজ] LT',
            nextDay: '[আগামীকাল] LT',
            nextWeek: 'dddd, LT',
            lastDay: '[গতকাল] LT',
            lastWeek: '[গত] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s পরে',
            past: '%s আগে',
            s: 'কয়েক সেকেন্ড',
            ss: '%d সেকেন্ড',
            m: 'এক মিনিট',
            mm: '%d মিনিট',
            h: 'এক ঘন্টা',
            hh: '%d ঘন্টা',
            d: 'এক দিন',
            dd: '%d দিন',
            M: 'এক মাস',
            MM: '%d মাস',
            y: 'এক বছর',
            yy: '%d বছর',
        },
        preparse: function (string) {
            return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {
                return numberMap[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap[match];
            });
        },
        meridiemParse: /রাত|সকাল|দুপুর|বিকাল|রাত/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (
                (meridiem === 'রাত' && hour >= 4) ||
                (meridiem === 'দুপুর' && hour < 5) ||
                meridiem === 'বিকাল'
            ) {
                return hour + 12;
            } else {
                return hour;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'রাত';
            } else if (hour < 10) {
                return 'সকাল';
            } else if (hour < 17) {
                return 'দুপুর';
            } else if (hour < 20) {
                return 'বিকাল';
            } else {
                return 'রাত';
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    return bn;

})));
//! moment.js locale configuration
//! locale : Tibetan [bo]
//! author : Thupten N. Chakrishar : https://github.com/vajradog

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var symbolMap = {
            1: '༡',
            2: '༢',
            3: '༣',
            4: '༤',
            5: '༥',
            6: '༦',
            7: '༧',
            8: '༨',
            9: '༩',
            0: '༠',
        },
        numberMap = {
            '༡': '1',
            '༢': '2',
            '༣': '3',
            '༤': '4',
            '༥': '5',
            '༦': '6',
            '༧': '7',
            '༨': '8',
            '༩': '9',
            '༠': '0',
        };

    var bo = moment.defineLocale('bo', {
        months: 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split(
            '_'
        ),
        monthsShort:
            'ཟླ་1_ཟླ་2_ཟླ་3_ཟླ་4_ཟླ་5_ཟླ་6_ཟླ་7_ཟླ་8_ཟླ་9_ཟླ་10_ཟླ་11_ཟླ་12'.split(
                '_'
            ),
        monthsShortRegex: /^(ཟླ་\d{1,2})/,
        monthsParseExact: true,
        weekdays:
            'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split(
                '_'
            ),
        weekdaysShort: 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split(
            '_'
        ),
        weekdaysMin: 'ཉི_ཟླ_མིག_ལྷག_ཕུར_སངས_སྤེན'.split('_'),
        longDateFormat: {
            LT: 'A h:mm',
            LTS: 'A h:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm',
            LLLL: 'dddd, D MMMM YYYY, A h:mm',
        },
        calendar: {
            sameDay: '[དི་རིང] LT',
            nextDay: '[སང་ཉིན] LT',
            nextWeek: '[བདུན་ཕྲག་རྗེས་མ], LT',
            lastDay: '[ཁ་སང] LT',
            lastWeek: '[བདུན་ཕྲག་མཐའ་མ] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s ལ་',
            past: '%s སྔན་ལ',
            s: 'ལམ་སང',
            ss: '%d སྐར་ཆ།',
            m: 'སྐར་མ་གཅིག',
            mm: '%d སྐར་མ',
            h: 'ཆུ་ཚོད་གཅིག',
            hh: '%d ཆུ་ཚོད',
            d: 'ཉིན་གཅིག',
            dd: '%d ཉིན་',
            M: 'ཟླ་བ་གཅིག',
            MM: '%d ཟླ་བ',
            y: 'ལོ་གཅིག',
            yy: '%d ལོ',
        },
        preparse: function (string) {
            return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) {
                return numberMap[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap[match];
            });
        },
        meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (
                (meridiem === 'མཚན་མོ' && hour >= 4) ||
                (meridiem === 'ཉིན་གུང' && hour < 5) ||
                meridiem === 'དགོང་དག'
            ) {
                return hour + 12;
            } else {
                return hour;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'མཚན་མོ';
            } else if (hour < 10) {
                return 'ཞོགས་ཀས';
            } else if (hour < 17) {
                return 'ཉིན་གུང';
            } else if (hour < 20) {
                return 'དགོང་དག';
            } else {
                return 'མཚན་མོ';
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    return bo;

})));
//! moment.js locale configuration
//! locale : Breton [br]
//! author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    function relativeTimeWithMutation(number, withoutSuffix, key) {
        var format = {
            mm: 'munutenn',
            MM: 'miz',
            dd: 'devezh',
        };
        return number + ' ' + mutation(format[key], number);
    }
    function specialMutationForYears(number) {
        switch (lastNumber(number)) {
            case 1:
            case 3:
            case 4:
            case 5:
            case 9:
                return number + ' bloaz';
            default:
                return number + ' vloaz';
        }
    }
    function lastNumber(number) {
        if (number > 9) {
            return lastNumber(number % 10);
        }
        return number;
    }
    function mutation(text, number) {
        if (number === 2) {
            return softMutation(text);
        }
        return text;
    }
    function softMutation(text) {
        var mutationTable = {
            m: 'v',
            b: 'v',
            d: 'z',
        };
        if (mutationTable[text.charAt(0)] === undefined) {
            return text;
        }
        return mutationTable[text.charAt(0)] + text.substring(1);
    }

    var monthsParse = [
            /^gen/i,
            /^c[ʼ\']hwe/i,
            /^meu/i,
            /^ebr/i,
            /^mae/i,
            /^(mez|eve)/i,
            /^gou/i,
            /^eos/i,
            /^gwe/i,
            /^her/i,
            /^du/i,
            /^ker/i,
        ],
        monthsRegex =
            /^(genver|c[ʼ\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu|gen|c[ʼ\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,
        monthsStrictRegex =
            /^(genver|c[ʼ\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu)/i,
        monthsShortStrictRegex =
            /^(gen|c[ʼ\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,
        fullWeekdaysParse = [
            /^sul/i,
            /^lun/i,
            /^meurzh/i,
            /^merc[ʼ\']her/i,
            /^yaou/i,
            /^gwener/i,
            /^sadorn/i,
        ],
        shortWeekdaysParse = [
            /^Sul/i,
            /^Lun/i,
            /^Meu/i,
            /^Mer/i,
            /^Yao/i,
            /^Gwe/i,
            /^Sad/i,
        ],
        minWeekdaysParse = [
            /^Su/i,
            /^Lu/i,
            /^Me([^r]|$)/i,
            /^Mer/i,
            /^Ya/i,
            /^Gw/i,
            /^Sa/i,
        ];

    var br = moment.defineLocale('br', {
        months: 'Genver_Cʼhwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split(
            '_'
        ),
        monthsShort: 'Gen_Cʼhwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'),
        weekdays: 'Sul_Lun_Meurzh_Mercʼher_Yaou_Gwener_Sadorn'.split('_'),
        weekdaysShort: 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'),
        weekdaysMin: 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'),
        weekdaysParse: minWeekdaysParse,
        fullWeekdaysParse: fullWeekdaysParse,
        shortWeekdaysParse: shortWeekdaysParse,
        minWeekdaysParse: minWeekdaysParse,

        monthsRegex: monthsRegex,
        monthsShortRegex: monthsRegex,
        monthsStrictRegex: monthsStrictRegex,
        monthsShortStrictRegex: monthsShortStrictRegex,
        monthsParse: monthsParse,
        longMonthsParse: monthsParse,
        shortMonthsParse: monthsParse,

        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D [a viz] MMMM YYYY',
            LLL: 'D [a viz] MMMM YYYY HH:mm',
            LLLL: 'dddd, D [a viz] MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Hiziv da] LT',
            nextDay: '[Warcʼhoazh da] LT',
            nextWeek: 'dddd [da] LT',
            lastDay: '[Decʼh da] LT',
            lastWeek: 'dddd [paset da] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'a-benn %s',
            past: '%s ʼzo',
            s: 'un nebeud segondennoù',
            ss: '%d eilenn',
            m: 'ur vunutenn',
            mm: relativeTimeWithMutation,
            h: 'un eur',
            hh: '%d eur',
            d: 'un devezh',
            dd: relativeTimeWithMutation,
            M: 'ur miz',
            MM: relativeTimeWithMutation,
            y: 'ur bloaz',
            yy: specialMutationForYears,
        },
        dayOfMonthOrdinalParse: /\d{1,2}(añ|vet)/,
        ordinal: function (number) {
            var output = number === 1 ? 'añ' : 'vet';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
        meridiemParse: /a.m.|g.m./, // goude merenn | a-raok merenn
        isPM: function (token) {
            return token === 'g.m.';
        },
        meridiem: function (hour, minute, isLower) {
            return hour < 12 ? 'a.m.' : 'g.m.';
        },
    });

    return br;

})));
//! moment.js locale configuration
//! locale : Bosnian [bs]
//! author : Nedim Cholich : https://github.com/frontyard
//! based on (hr) translation by Bojan Marković

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    function translate(number, withoutSuffix, key) {
        var result = number + ' ';
        switch (key) {
            case 'ss':
                if (number === 1) {
                    result += 'sekunda';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'sekunde';
                } else {
                    result += 'sekundi';
                }
                return result;
            case 'm':
                return withoutSuffix ? 'jedna minuta' : 'jedne minute';
            case 'mm':
                if (number === 1) {
                    result += 'minuta';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'minute';
                } else {
                    result += 'minuta';
                }
                return result;
            case 'h':
                return withoutSuffix ? 'jedan sat' : 'jednog sata';
            case 'hh':
                if (number === 1) {
                    result += 'sat';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'sata';
                } else {
                    result += 'sati';
                }
                return result;
            case 'dd':
                if (number === 1) {
                    result += 'dan';
                } else {
                    result += 'dana';
                }
                return result;
            case 'MM':
                if (number === 1) {
                    result += 'mjesec';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'mjeseca';
                } else {
                    result += 'mjeseci';
                }
                return result;
            case 'yy':
                if (number === 1) {
                    result += 'godina';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'godine';
                } else {
                    result += 'godina';
                }
                return result;
        }
    }

    var bs = moment.defineLocale('bs', {
        months: 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split(
            '_'
        ),
        monthsShort:
            'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split(
            '_'
        ),
        weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
        weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY H:mm',
            LLLL: 'dddd, D. MMMM YYYY H:mm',
        },
        calendar: {
            sameDay: '[danas u] LT',
            nextDay: '[sutra u] LT',
            nextWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[u] [nedjelju] [u] LT';
                    case 3:
                        return '[u] [srijedu] [u] LT';
                    case 6:
                        return '[u] [subotu] [u] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[u] dddd [u] LT';
                }
            },
            lastDay: '[jučer u] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                    case 3:
                        return '[prošlu] dddd [u] LT';
                    case 6:
                        return '[prošle] [subote] [u] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[prošli] dddd [u] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'za %s',
            past: 'prije %s',
            s: 'par sekundi',
            ss: translate,
            m: translate,
            mm: translate,
            h: translate,
            hh: translate,
            d: 'dan',
            dd: translate,
            M: 'mjesec',
            MM: translate,
            y: 'godinu',
            yy: translate,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    return bs;

})));
//! moment.js locale configuration
//! locale : Catalan [ca]
//! author : Juan G. Hurtado : https://github.com/juanghurtado

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var ca = moment.defineLocale('ca', {
        months: {
            standalone:
                'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split(
                    '_'
                ),
            format: "de gener_de febrer_de març_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split(
                '_'
            ),
            isFormat: /D[oD]?(\s)+MMMM/,
        },
        monthsShort:
            'gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays:
            'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split(
                '_'
            ),
        weekdaysShort: 'dg._dl._dt._dc._dj._dv._ds.'.split('_'),
        weekdaysMin: 'dg_dl_dt_dc_dj_dv_ds'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM [de] YYYY',
            ll: 'D MMM YYYY',
            LLL: 'D MMMM [de] YYYY [a les] H:mm',
            lll: 'D MMM YYYY, H:mm',
            LLLL: 'dddd D MMMM [de] YYYY [a les] H:mm',
            llll: 'ddd D MMM YYYY, H:mm',
        },
        calendar: {
            sameDay: function () {
                return '[avui a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';
            },
            nextDay: function () {
                return '[demà a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';
            },
            nextWeek: function () {
                return 'dddd [a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';
            },
            lastDay: function () {
                return '[ahir a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';
            },
            lastWeek: function () {
                return (
                    '[el] dddd [passat a ' +
                    (this.hours() !== 1 ? 'les' : 'la') +
                    '] LT'
                );
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: "d'aquí %s",
            past: 'fa %s',
            s: 'uns segons',
            ss: '%d segons',
            m: 'un minut',
            mm: '%d minuts',
            h: 'una hora',
            hh: '%d hores',
            d: 'un dia',
            dd: '%d dies',
            M: 'un mes',
            MM: '%d mesos',
            y: 'un any',
            yy: '%d anys',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(r|n|t|è|a)/,
        ordinal: function (number, period) {
            var output =
                number === 1
                    ? 'r'
                    : number === 2
                    ? 'n'
                    : number === 3
                    ? 'r'
                    : number === 4
                    ? 't'
                    : 'è';
            if (period === 'w' || period === 'W') {
                output = 'a';
            }
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return ca;

})));
//! moment.js locale configuration
//! locale : Czech [cs]
//! author : petrbela : https://github.com/petrbela

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var months = {
            format: 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split(
                '_'
            ),
            standalone:
                'ledna_února_března_dubna_května_června_července_srpna_září_října_listopadu_prosince'.split(
                    '_'
                ),
        },
        monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_'),
        monthsParse = [
            /^led/i,
            /^úno/i,
            /^bře/i,
            /^dub/i,
            /^kvě/i,
            /^(čvn|červen$|června)/i,
            /^(čvc|červenec|července)/i,
            /^srp/i,
            /^zář/i,
            /^říj/i,
            /^lis/i,
            /^pro/i,
        ],
        // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched.
        // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'.
        monthsRegex =
            /^(leden|únor|březen|duben|květen|červenec|července|červen|června|srpen|září|říjen|listopad|prosinec|led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i;

    function plural(n) {
        return n > 1 && n < 5 && ~~(n / 10) !== 1;
    }
    function translate(number, withoutSuffix, key, isFuture) {
        var result = number + ' ';
        switch (key) {
            case 's': // a few seconds / in a few seconds / a few seconds ago
                return withoutSuffix || isFuture ? 'pár sekund' : 'pár sekundami';
            case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago
                if (withoutSuffix || isFuture) {
                    return result + (plural(number) ? 'sekundy' : 'sekund');
                } else {
                    return result + 'sekundami';
                }
            case 'm': // a minute / in a minute / a minute ago
                return withoutSuffix ? 'minuta' : isFuture ? 'minutu' : 'minutou';
            case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
                if (withoutSuffix || isFuture) {
                    return result + (plural(number) ? 'minuty' : 'minut');
                } else {
                    return result + 'minutami';
                }
            case 'h': // an hour / in an hour / an hour ago
                return withoutSuffix ? 'hodina' : isFuture ? 'hodinu' : 'hodinou';
            case 'hh': // 9 hours / in 9 hours / 9 hours ago
                if (withoutSuffix || isFuture) {
                    return result + (plural(number) ? 'hodiny' : 'hodin');
                } else {
                    return result + 'hodinami';
                }
            case 'd': // a day / in a day / a day ago
                return withoutSuffix || isFuture ? 'den' : 'dnem';
            case 'dd': // 9 days / in 9 days / 9 days ago
                if (withoutSuffix || isFuture) {
                    return result + (plural(number) ? 'dny' : 'dní');
                } else {
                    return result + 'dny';
                }
            case 'M': // a month / in a month / a month ago
                return withoutSuffix || isFuture ? 'měsíc' : 'měsícem';
            case 'MM': // 9 months / in 9 months / 9 months ago
                if (withoutSuffix || isFuture) {
                    return result + (plural(number) ? 'měsíce' : 'měsíců');
                } else {
                    return result + 'měsíci';
                }
            case 'y': // a year / in a year / a year ago
                return withoutSuffix || isFuture ? 'rok' : 'rokem';
            case 'yy': // 9 years / in 9 years / 9 years ago
                if (withoutSuffix || isFuture) {
                    return result + (plural(number) ? 'roky' : 'let');
                } else {
                    return result + 'lety';
                }
        }
    }

    var cs = moment.defineLocale('cs', {
        months: months,
        monthsShort: monthsShort,
        monthsRegex: monthsRegex,
        monthsShortRegex: monthsRegex,
        // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched.
        // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'.
        monthsStrictRegex:
            /^(leden|ledna|února|únor|březen|března|duben|dubna|květen|května|červenec|července|červen|června|srpen|srpna|září|říjen|října|listopadu|listopad|prosinec|prosince)/i,
        monthsShortStrictRegex:
            /^(led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i,
        monthsParse: monthsParse,
        longMonthsParse: monthsParse,
        shortMonthsParse: monthsParse,
        weekdays: 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'),
        weekdaysShort: 'ne_po_út_st_čt_pá_so'.split('_'),
        weekdaysMin: 'ne_po_út_st_čt_pá_so'.split('_'),
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY H:mm',
            LLLL: 'dddd D. MMMM YYYY H:mm',
            l: 'D. M. YYYY',
        },
        calendar: {
            sameDay: '[dnes v] LT',
            nextDay: '[zítra v] LT',
            nextWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[v neděli v] LT';
                    case 1:
                    case 2:
                        return '[v] dddd [v] LT';
                    case 3:
                        return '[ve středu v] LT';
                    case 4:
                        return '[ve čtvrtek v] LT';
                    case 5:
                        return '[v pátek v] LT';
                    case 6:
                        return '[v sobotu v] LT';
                }
            },
            lastDay: '[včera v] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[minulou neděli v] LT';
                    case 1:
                    case 2:
                        return '[minulé] dddd [v] LT';
                    case 3:
                        return '[minulou středu v] LT';
                    case 4:
                    case 5:
                        return '[minulý] dddd [v] LT';
                    case 6:
                        return '[minulou sobotu v] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'za %s',
            past: 'před %s',
            s: translate,
            ss: translate,
            m: translate,
            mm: translate,
            h: translate,
            hh: translate,
            d: translate,
            dd: translate,
            M: translate,
            MM: translate,
            y: translate,
            yy: translate,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return cs;

})));
//! moment.js locale configuration
//! locale : Chuvash [cv]
//! author : Anatoly Mironov : https://github.com/mirontoli

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var cv = moment.defineLocale('cv', {
        months: 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split(
            '_'
        ),
        monthsShort: 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'),
        weekdays:
            'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split(
                '_'
            ),
        weekdaysShort: 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'),
        weekdaysMin: 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD-MM-YYYY',
            LL: 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]',
            LLL: 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm',
            LLLL: 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm',
        },
        calendar: {
            sameDay: '[Паян] LT [сехетре]',
            nextDay: '[Ыран] LT [сехетре]',
            lastDay: '[Ӗнер] LT [сехетре]',
            nextWeek: '[Ҫитес] dddd LT [сехетре]',
            lastWeek: '[Иртнӗ] dddd LT [сехетре]',
            sameElse: 'L',
        },
        relativeTime: {
            future: function (output) {
                var affix = /сехет$/i.exec(output)
                    ? 'рен'
                    : /ҫул$/i.exec(output)
                    ? 'тан'
                    : 'ран';
                return output + affix;
            },
            past: '%s каялла',
            s: 'пӗр-ик ҫеккунт',
            ss: '%d ҫеккунт',
            m: 'пӗр минут',
            mm: '%d минут',
            h: 'пӗр сехет',
            hh: '%d сехет',
            d: 'пӗр кун',
            dd: '%d кун',
            M: 'пӗр уйӑх',
            MM: '%d уйӑх',
            y: 'пӗр ҫул',
            yy: '%d ҫул',
        },
        dayOfMonthOrdinalParse: /\d{1,2}-мӗш/,
        ordinal: '%d-мӗш',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    return cv;

})));
//! moment.js locale configuration
//! locale : Welsh [cy]
//! author : Robert Allen : https://github.com/robgallen
//! author : https://github.com/ryangreaves

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var cy = moment.defineLocale('cy', {
        months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split(
            '_'
        ),
        monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split(
            '_'
        ),
        weekdays:
            'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split(
                '_'
            ),
        weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'),
        weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'),
        weekdaysParseExact: true,
        // time formats are the same as en-gb
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Heddiw am] LT',
            nextDay: '[Yfory am] LT',
            nextWeek: 'dddd [am] LT',
            lastDay: '[Ddoe am] LT',
            lastWeek: 'dddd [diwethaf am] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'mewn %s',
            past: '%s yn ôl',
            s: 'ychydig eiliadau',
            ss: '%d eiliad',
            m: 'munud',
            mm: '%d munud',
            h: 'awr',
            hh: '%d awr',
            d: 'diwrnod',
            dd: '%d diwrnod',
            M: 'mis',
            MM: '%d mis',
            y: 'blwyddyn',
            yy: '%d flynedd',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,
        // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh
        ordinal: function (number) {
            var b = number,
                output = '',
                lookup = [
                    '',
                    'af',
                    'il',
                    'ydd',
                    'ydd',
                    'ed',
                    'ed',
                    'ed',
                    'fed',
                    'fed',
                    'fed', // 1af to 10fed
                    'eg',
                    'fed',
                    'eg',
                    'eg',
                    'fed',
                    'eg',
                    'eg',
                    'fed',
                    'eg',
                    'fed', // 11eg to 20fed
                ];
            if (b > 20) {
                if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) {
                    output = 'fed'; // not 30ain, 70ain or 90ain
                } else {
                    output = 'ain';
                }
            } else if (b > 0) {
                output = lookup[b];
            }
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return cy;

})));
//! moment.js locale configuration
//! locale : Danish [da]
//! author : Ulrik Nielsen : https://github.com/mrbase

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var da = moment.defineLocale('da', {
        months: 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split(
            '_'
        ),
        monthsShort: 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
        weekdays: 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
        weekdaysShort: 'søn_man_tir_ons_tor_fre_lør'.split('_'),
        weekdaysMin: 'sø_ma_ti_on_to_fr_lø'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY HH:mm',
            LLLL: 'dddd [d.] D. MMMM YYYY [kl.] HH:mm',
        },
        calendar: {
            sameDay: '[i dag kl.] LT',
            nextDay: '[i morgen kl.] LT',
            nextWeek: 'på dddd [kl.] LT',
            lastDay: '[i går kl.] LT',
            lastWeek: '[i] dddd[s kl.] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'om %s',
            past: '%s siden',
            s: 'få sekunder',
            ss: '%d sekunder',
            m: 'et minut',
            mm: '%d minutter',
            h: 'en time',
            hh: '%d timer',
            d: 'en dag',
            dd: '%d dage',
            M: 'en måned',
            MM: '%d måneder',
            y: 'et år',
            yy: '%d år',
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return da;

})));
//! moment.js locale configuration
//! locale : German (Austria) [de-at]
//! author : lluchs : https://github.com/lluchs
//! author: Menelion Elensúle: https://github.com/Oire
//! author : Martin Groller : https://github.com/MadMG
//! author : Mikolaj Dadela : https://github.com/mik01aj

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    function processRelativeTime(number, withoutSuffix, key, isFuture) {
        var format = {
            m: ['eine Minute', 'einer Minute'],
            h: ['eine Stunde', 'einer Stunde'],
            d: ['ein Tag', 'einem Tag'],
            dd: [number + ' Tage', number + ' Tagen'],
            w: ['eine Woche', 'einer Woche'],
            M: ['ein Monat', 'einem Monat'],
            MM: [number + ' Monate', number + ' Monaten'],
            y: ['ein Jahr', 'einem Jahr'],
            yy: [number + ' Jahre', number + ' Jahren'],
        };
        return withoutSuffix ? format[key][0] : format[key][1];
    }

    var deAt = moment.defineLocale('de-at', {
        months: 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split(
            '_'
        ),
        monthsShort:
            'Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),
        monthsParseExact: true,
        weekdays:
            'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split(
                '_'
            ),
        weekdaysShort: 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
        weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY HH:mm',
            LLLL: 'dddd, D. MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[heute um] LT [Uhr]',
            sameElse: 'L',
            nextDay: '[morgen um] LT [Uhr]',
            nextWeek: 'dddd [um] LT [Uhr]',
            lastDay: '[gestern um] LT [Uhr]',
            lastWeek: '[letzten] dddd [um] LT [Uhr]',
        },
        relativeTime: {
            future: 'in %s',
            past: 'vor %s',
            s: 'ein paar Sekunden',
            ss: '%d Sekunden',
            m: processRelativeTime,
            mm: '%d Minuten',
            h: processRelativeTime,
            hh: '%d Stunden',
            d: processRelativeTime,
            dd: processRelativeTime,
            w: processRelativeTime,
            ww: '%d Wochen',
            M: processRelativeTime,
            MM: processRelativeTime,
            y: processRelativeTime,
            yy: processRelativeTime,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return deAt;

})));
//! moment.js locale configuration
//! locale : German (Switzerland) [de-ch]
//! author : sschueller : https://github.com/sschueller

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    function processRelativeTime(number, withoutSuffix, key, isFuture) {
        var format = {
            m: ['eine Minute', 'einer Minute'],
            h: ['eine Stunde', 'einer Stunde'],
            d: ['ein Tag', 'einem Tag'],
            dd: [number + ' Tage', number + ' Tagen'],
            w: ['eine Woche', 'einer Woche'],
            M: ['ein Monat', 'einem Monat'],
            MM: [number + ' Monate', number + ' Monaten'],
            y: ['ein Jahr', 'einem Jahr'],
            yy: [number + ' Jahre', number + ' Jahren'],
        };
        return withoutSuffix ? format[key][0] : format[key][1];
    }

    var deCh = moment.defineLocale('de-ch', {
        months: 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split(
            '_'
        ),
        monthsShort:
            'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),
        monthsParseExact: true,
        weekdays:
            'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split(
                '_'
            ),
        weekdaysShort: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
        weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY HH:mm',
            LLLL: 'dddd, D. MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[heute um] LT [Uhr]',
            sameElse: 'L',
            nextDay: '[morgen um] LT [Uhr]',
            nextWeek: 'dddd [um] LT [Uhr]',
            lastDay: '[gestern um] LT [Uhr]',
            lastWeek: '[letzten] dddd [um] LT [Uhr]',
        },
        relativeTime: {
            future: 'in %s',
            past: 'vor %s',
            s: 'ein paar Sekunden',
            ss: '%d Sekunden',
            m: processRelativeTime,
            mm: '%d Minuten',
            h: processRelativeTime,
            hh: '%d Stunden',
            d: processRelativeTime,
            dd: processRelativeTime,
            w: processRelativeTime,
            ww: '%d Wochen',
            M: processRelativeTime,
            MM: processRelativeTime,
            y: processRelativeTime,
            yy: processRelativeTime,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return deCh;

})));
//! moment.js locale configuration
//! locale : German [de]
//! author : lluchs : https://github.com/lluchs
//! author: Menelion Elensúle: https://github.com/Oire
//! author : Mikolaj Dadela : https://github.com/mik01aj

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    function processRelativeTime(number, withoutSuffix, key, isFuture) {
        var format = {
            m: ['eine Minute', 'einer Minute'],
            h: ['eine Stunde', 'einer Stunde'],
            d: ['ein Tag', 'einem Tag'],
            dd: [number + ' Tage', number + ' Tagen'],
            w: ['eine Woche', 'einer Woche'],
            M: ['ein Monat', 'einem Monat'],
            MM: [number + ' Monate', number + ' Monaten'],
            y: ['ein Jahr', 'einem Jahr'],
            yy: [number + ' Jahre', number + ' Jahren'],
        };
        return withoutSuffix ? format[key][0] : format[key][1];
    }

    var de = moment.defineLocale('de', {
        months: 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split(
            '_'
        ),
        monthsShort:
            'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),
        monthsParseExact: true,
        weekdays:
            'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split(
                '_'
            ),
        weekdaysShort: 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
        weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY HH:mm',
            LLLL: 'dddd, D. MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[heute um] LT [Uhr]',
            sameElse: 'L',
            nextDay: '[morgen um] LT [Uhr]',
            nextWeek: 'dddd [um] LT [Uhr]',
            lastDay: '[gestern um] LT [Uhr]',
            lastWeek: '[letzten] dddd [um] LT [Uhr]',
        },
        relativeTime: {
            future: 'in %s',
            past: 'vor %s',
            s: 'ein paar Sekunden',
            ss: '%d Sekunden',
            m: processRelativeTime,
            mm: '%d Minuten',
            h: processRelativeTime,
            hh: '%d Stunden',
            d: processRelativeTime,
            dd: processRelativeTime,
            w: processRelativeTime,
            ww: '%d Wochen',
            M: processRelativeTime,
            MM: processRelativeTime,
            y: processRelativeTime,
            yy: processRelativeTime,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return de;

})));
//! moment.js locale configuration
//! locale : Maldivian [dv]
//! author : Jawish Hameed : https://github.com/jawish

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var months = [
            'ޖެނުއަރީ',
            'ފެބްރުއަރީ',
            'މާރިޗު',
            'އޭޕްރީލު',
            'މޭ',
            'ޖޫން',
            'ޖުލައި',
            'އޯގަސްޓު',
            'ސެޕްޓެމްބަރު',
            'އޮކްޓޯބަރު',
            'ނޮވެމްބަރު',
            'ޑިސެމްބަރު',
        ],
        weekdays = [
            'އާދިއްތަ',
            'ހޯމަ',
            'އަންގާރަ',
            'ބުދަ',
            'ބުރާސްފަތި',
            'ހުކުރު',
            'ހޮނިހިރު',
        ];

    var dv = moment.defineLocale('dv', {
        months: months,
        monthsShort: months,
        weekdays: weekdays,
        weekdaysShort: weekdays,
        weekdaysMin: 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'D/M/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        meridiemParse: /މކ|މފ/,
        isPM: function (input) {
            return 'މފ' === input;
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'މކ';
            } else {
                return 'މފ';
            }
        },
        calendar: {
            sameDay: '[މިއަދު] LT',
            nextDay: '[މާދަމާ] LT',
            nextWeek: 'dddd LT',
            lastDay: '[އިއްޔެ] LT',
            lastWeek: '[ފާއިތުވި] dddd LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'ތެރޭގައި %s',
            past: 'ކުރިން %s',
            s: 'ސިކުންތުކޮޅެއް',
            ss: 'd% ސިކުންތު',
            m: 'މިނިޓެއް',
            mm: 'މިނިޓު %d',
            h: 'ގަޑިއިރެއް',
            hh: 'ގަޑިއިރު %d',
            d: 'ދުވަހެއް',
            dd: 'ދުވަސް %d',
            M: 'މަހެއް',
            MM: 'މަސް %d',
            y: 'އަހަރެއް',
            yy: 'އަހަރު %d',
        },
        preparse: function (string) {
            return string.replace(/،/g, ',');
        },
        postformat: function (string) {
            return string.replace(/,/g, '،');
        },
        week: {
            dow: 7, // Sunday is the first day of the week.
            doy: 12, // The week that contains Jan 12th is the first week of the year.
        },
    });

    return dv;

})));
//! moment.js locale configuration
//! locale : Greek [el]
//! author : Aggelos Karalias : https://github.com/mehiel

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    function isFunction(input) {
        return (
            (typeof Function !== 'undefined' && input instanceof Function) ||
            Object.prototype.toString.call(input) === '[object Function]'
        );
    }

    var el = moment.defineLocale('el', {
        monthsNominativeEl:
            'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split(
                '_'
            ),
        monthsGenitiveEl:
            'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split(
                '_'
            ),
        months: function (momentToFormat, format) {
            if (!momentToFormat) {
                return this._monthsNominativeEl;
            } else if (
                typeof format === 'string' &&
                /D/.test(format.substring(0, format.indexOf('MMMM')))
            ) {
                // if there is a day number before 'MMMM'
                return this._monthsGenitiveEl[momentToFormat.month()];
            } else {
                return this._monthsNominativeEl[momentToFormat.month()];
            }
        },
        monthsShort: 'Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ'.split('_'),
        weekdays: 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split(
            '_'
        ),
        weekdaysShort: 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'),
        weekdaysMin: 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'),
        meridiem: function (hours, minutes, isLower) {
            if (hours > 11) {
                return isLower ? 'μμ' : 'ΜΜ';
            } else {
                return isLower ? 'πμ' : 'ΠΜ';
            }
        },
        isPM: function (input) {
            return (input + '').toLowerCase()[0] === 'μ';
        },
        meridiemParse: /[ΠΜ]\.?Μ?\.?/i,
        longDateFormat: {
            LT: 'h:mm A',
            LTS: 'h:mm:ss A',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY h:mm A',
            LLLL: 'dddd, D MMMM YYYY h:mm A',
        },
        calendarEl: {
            sameDay: '[Σήμερα {}] LT',
            nextDay: '[Αύριο {}] LT',
            nextWeek: 'dddd [{}] LT',
            lastDay: '[Χθες {}] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 6:
                        return '[το προηγούμενο] dddd [{}] LT';
                    default:
                        return '[την προηγούμενη] dddd [{}] LT';
                }
            },
            sameElse: 'L',
        },
        calendar: function (key, mom) {
            var output = this._calendarEl[key],
                hours = mom && mom.hours();
            if (isFunction(output)) {
                output = output.apply(mom);
            }
            return output.replace('{}', hours % 12 === 1 ? 'στη' : 'στις');
        },
        relativeTime: {
            future: 'σε %s',
            past: '%s πριν',
            s: 'λίγα δευτερόλεπτα',
            ss: '%d δευτερόλεπτα',
            m: 'ένα λεπτό',
            mm: '%d λεπτά',
            h: 'μία ώρα',
            hh: '%d ώρες',
            d: 'μία μέρα',
            dd: '%d μέρες',
            M: 'ένας μήνας',
            MM: '%d μήνες',
            y: 'ένας χρόνος',
            yy: '%d χρόνια',
        },
        dayOfMonthOrdinalParse: /\d{1,2}η/,
        ordinal: '%dη',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4st is the first week of the year.
        },
    });

    return el;

})));
//! moment.js locale configuration
//! locale : English (Australia) [en-au]
//! author : Jared Morse : https://github.com/jarcoal

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var enAu = moment.defineLocale('en-au', {
        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
            '_'
        ),
        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
        longDateFormat: {
            LT: 'h:mm A',
            LTS: 'h:mm:ss A',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY h:mm A',
            LLLL: 'dddd, D MMMM YYYY h:mm A',
        },
        calendar: {
            sameDay: '[Today at] LT',
            nextDay: '[Tomorrow at] LT',
            nextWeek: 'dddd [at] LT',
            lastDay: '[Yesterday at] LT',
            lastWeek: '[Last] dddd [at] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'in %s',
            past: '%s ago',
            s: 'a few seconds',
            ss: '%d seconds',
            m: 'a minute',
            mm: '%d minutes',
            h: 'an hour',
            hh: '%d hours',
            d: 'a day',
            dd: '%d days',
            M: 'a month',
            MM: '%d months',
            y: 'a year',
            yy: '%d years',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return enAu;

})));
//! moment.js locale configuration
//! locale : English (Canada) [en-ca]
//! author : Jonathan Abourbih : https://github.com/jonbca

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var enCa = moment.defineLocale('en-ca', {
        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
            '_'
        ),
        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
        longDateFormat: {
            LT: 'h:mm A',
            LTS: 'h:mm:ss A',
            L: 'YYYY-MM-DD',
            LL: 'MMMM D, YYYY',
            LLL: 'MMMM D, YYYY h:mm A',
            LLLL: 'dddd, MMMM D, YYYY h:mm A',
        },
        calendar: {
            sameDay: '[Today at] LT',
            nextDay: '[Tomorrow at] LT',
            nextWeek: 'dddd [at] LT',
            lastDay: '[Yesterday at] LT',
            lastWeek: '[Last] dddd [at] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'in %s',
            past: '%s ago',
            s: 'a few seconds',
            ss: '%d seconds',
            m: 'a minute',
            mm: '%d minutes',
            h: 'an hour',
            hh: '%d hours',
            d: 'a day',
            dd: '%d days',
            M: 'a month',
            MM: '%d months',
            y: 'a year',
            yy: '%d years',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
    });

    return enCa;

})));
//! moment.js locale configuration
//! locale : English (United Kingdom) [en-gb]
//! author : Chris Gedrim : https://github.com/chrisgedrim

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var enGb = moment.defineLocale('en-gb', {
        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
            '_'
        ),
        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Today at] LT',
            nextDay: '[Tomorrow at] LT',
            nextWeek: 'dddd [at] LT',
            lastDay: '[Yesterday at] LT',
            lastWeek: '[Last] dddd [at] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'in %s',
            past: '%s ago',
            s: 'a few seconds',
            ss: '%d seconds',
            m: 'a minute',
            mm: '%d minutes',
            h: 'an hour',
            hh: '%d hours',
            d: 'a day',
            dd: '%d days',
            M: 'a month',
            MM: '%d months',
            y: 'a year',
            yy: '%d years',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return enGb;

})));
//! moment.js locale configuration
//! locale : English (Ireland) [en-ie]
//! author : Chris Cartlidge : https://github.com/chriscartlidge

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var enIe = moment.defineLocale('en-ie', {
        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
            '_'
        ),
        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Today at] LT',
            nextDay: '[Tomorrow at] LT',
            nextWeek: 'dddd [at] LT',
            lastDay: '[Yesterday at] LT',
            lastWeek: '[Last] dddd [at] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'in %s',
            past: '%s ago',
            s: 'a few seconds',
            ss: '%d seconds',
            m: 'a minute',
            mm: '%d minutes',
            h: 'an hour',
            hh: '%d hours',
            d: 'a day',
            dd: '%d days',
            M: 'a month',
            MM: '%d months',
            y: 'a year',
            yy: '%d years',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return enIe;

})));
//! moment.js locale configuration
//! locale : English (Israel) [en-il]
//! author : Chris Gedrim : https://github.com/chrisgedrim

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var enIl = moment.defineLocale('en-il', {
        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
            '_'
        ),
        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Today at] LT',
            nextDay: '[Tomorrow at] LT',
            nextWeek: 'dddd [at] LT',
            lastDay: '[Yesterday at] LT',
            lastWeek: '[Last] dddd [at] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'in %s',
            past: '%s ago',
            s: 'a few seconds',
            ss: '%d seconds',
            m: 'a minute',
            mm: '%d minutes',
            h: 'an hour',
            hh: '%d hours',
            d: 'a day',
            dd: '%d days',
            M: 'a month',
            MM: '%d months',
            y: 'a year',
            yy: '%d years',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
    });

    return enIl;

})));
//! moment.js locale configuration
//! locale : English (India) [en-in]
//! author : Jatin Agrawal : https://github.com/jatinag22

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var enIn = moment.defineLocale('en-in', {
        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
            '_'
        ),
        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
        longDateFormat: {
            LT: 'h:mm A',
            LTS: 'h:mm:ss A',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY h:mm A',
            LLLL: 'dddd, D MMMM YYYY h:mm A',
        },
        calendar: {
            sameDay: '[Today at] LT',
            nextDay: '[Tomorrow at] LT',
            nextWeek: 'dddd [at] LT',
            lastDay: '[Yesterday at] LT',
            lastWeek: '[Last] dddd [at] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'in %s',
            past: '%s ago',
            s: 'a few seconds',
            ss: '%d seconds',
            m: 'a minute',
            mm: '%d minutes',
            h: 'an hour',
            hh: '%d hours',
            d: 'a day',
            dd: '%d days',
            M: 'a month',
            MM: '%d months',
            y: 'a year',
            yy: '%d years',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 1st is the first week of the year.
        },
    });

    return enIn;

})));
//! moment.js locale configuration
//! locale : English (New Zealand) [en-nz]
//! author : Luke McGregor : https://github.com/lukemcgregor

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var enNz = moment.defineLocale('en-nz', {
        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
            '_'
        ),
        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
        longDateFormat: {
            LT: 'h:mm A',
            LTS: 'h:mm:ss A',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY h:mm A',
            LLLL: 'dddd, D MMMM YYYY h:mm A',
        },
        calendar: {
            sameDay: '[Today at] LT',
            nextDay: '[Tomorrow at] LT',
            nextWeek: 'dddd [at] LT',
            lastDay: '[Yesterday at] LT',
            lastWeek: '[Last] dddd [at] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'in %s',
            past: '%s ago',
            s: 'a few seconds',
            ss: '%d seconds',
            m: 'a minute',
            mm: '%d minutes',
            h: 'an hour',
            hh: '%d hours',
            d: 'a day',
            dd: '%d days',
            M: 'a month',
            MM: '%d months',
            y: 'a year',
            yy: '%d years',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return enNz;

})));
//! moment.js locale configuration
//! locale : English (Singapore) [en-sg]
//! author : Matthew Castrillon-Madrigal : https://github.com/techdimension

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var enSg = moment.defineLocale('en-sg', {
        months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
        weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
            '_'
        ),
        weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
        weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Today at] LT',
            nextDay: '[Tomorrow at] LT',
            nextWeek: 'dddd [at] LT',
            lastDay: '[Yesterday at] LT',
            lastWeek: '[Last] dddd [at] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'in %s',
            past: '%s ago',
            s: 'a few seconds',
            ss: '%d seconds',
            m: 'a minute',
            mm: '%d minutes',
            h: 'an hour',
            hh: '%d hours',
            d: 'a day',
            dd: '%d days',
            M: 'a month',
            MM: '%d months',
            y: 'a year',
            yy: '%d years',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return enSg;

})));
//! moment.js locale configuration
//! locale : Esperanto [eo]
//! author : Colin Dean : https://github.com/colindean
//! author : Mia Nordentoft Imperatori : https://github.com/miestasmia
//! comment : miestasmia corrected the translation by colindean
//! comment : Vivakvo corrected the translation by colindean and miestasmia

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var eo = moment.defineLocale('eo', {
        months: 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split(
            '_'
        ),
        monthsShort: 'jan_feb_mart_apr_maj_jun_jul_aŭg_sept_okt_nov_dec'.split('_'),
        weekdays: 'dimanĉo_lundo_mardo_merkredo_ĵaŭdo_vendredo_sabato'.split('_'),
        weekdaysShort: 'dim_lun_mard_merk_ĵaŭ_ven_sab'.split('_'),
        weekdaysMin: 'di_lu_ma_me_ĵa_ve_sa'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY-MM-DD',
            LL: '[la] D[-an de] MMMM, YYYY',
            LLL: '[la] D[-an de] MMMM, YYYY HH:mm',
            LLLL: 'dddd[n], [la] D[-an de] MMMM, YYYY HH:mm',
            llll: 'ddd, [la] D[-an de] MMM, YYYY HH:mm',
        },
        meridiemParse: /[ap]\.t\.m/i,
        isPM: function (input) {
            return input.charAt(0).toLowerCase() === 'p';
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours > 11) {
                return isLower ? 'p.t.m.' : 'P.T.M.';
            } else {
                return isLower ? 'a.t.m.' : 'A.T.M.';
            }
        },
        calendar: {
            sameDay: '[Hodiaŭ je] LT',
            nextDay: '[Morgaŭ je] LT',
            nextWeek: 'dddd[n je] LT',
            lastDay: '[Hieraŭ je] LT',
            lastWeek: '[pasintan] dddd[n je] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'post %s',
            past: 'antaŭ %s',
            s: 'kelkaj sekundoj',
            ss: '%d sekundoj',
            m: 'unu minuto',
            mm: '%d minutoj',
            h: 'unu horo',
            hh: '%d horoj',
            d: 'unu tago', //ne 'diurno', ĉar estas uzita por proksimumo
            dd: '%d tagoj',
            M: 'unu monato',
            MM: '%d monatoj',
            y: 'unu jaro',
            yy: '%d jaroj',
        },
        dayOfMonthOrdinalParse: /\d{1,2}a/,
        ordinal: '%da',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    return eo;

})));
//! moment.js locale configuration
//! locale : Spanish (Dominican Republic) [es-do]

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var monthsShortDot =
            'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(
                '_'
            ),
        monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
        monthsParse = [
            /^ene/i,
            /^feb/i,
            /^mar/i,
            /^abr/i,
            /^may/i,
            /^jun/i,
            /^jul/i,
            /^ago/i,
            /^sep/i,
            /^oct/i,
            /^nov/i,
            /^dic/i,
        ],
        monthsRegex =
            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;

    var esDo = moment.defineLocale('es-do', {
        months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(
            '_'
        ),
        monthsShort: function (m, format) {
            if (!m) {
                return monthsShortDot;
            } else if (/-MMM-/.test(format)) {
                return monthsShort[m.month()];
            } else {
                return monthsShortDot[m.month()];
            }
        },
        monthsRegex: monthsRegex,
        monthsShortRegex: monthsRegex,
        monthsStrictRegex:
            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,
        monthsShortStrictRegex:
            /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,
        monthsParse: monthsParse,
        longMonthsParse: monthsParse,
        shortMonthsParse: monthsParse,
        weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
        weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
        weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'h:mm A',
            LTS: 'h:mm:ss A',
            L: 'DD/MM/YYYY',
            LL: 'D [de] MMMM [de] YYYY',
            LLL: 'D [de] MMMM [de] YYYY h:mm A',
            LLLL: 'dddd, D [de] MMMM [de] YYYY h:mm A',
        },
        calendar: {
            sameDay: function () {
                return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            nextDay: function () {
                return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            nextWeek: function () {
                return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            lastDay: function () {
                return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            lastWeek: function () {
                return (
                    '[el] dddd [pasado a la' +
                    (this.hours() !== 1 ? 's' : '') +
                    '] LT'
                );
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'en %s',
            past: 'hace %s',
            s: 'unos segundos',
            ss: '%d segundos',
            m: 'un minuto',
            mm: '%d minutos',
            h: 'una hora',
            hh: '%d horas',
            d: 'un día',
            dd: '%d días',
            w: 'una semana',
            ww: '%d semanas',
            M: 'un mes',
            MM: '%d meses',
            y: 'un año',
            yy: '%d años',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return esDo;

})));
//! moment.js locale configuration
//! locale : Spanish (Mexico) [es-mx]
//! author : JC Franco : https://github.com/jcfranco

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var monthsShortDot =
            'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(
                '_'
            ),
        monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
        monthsParse = [
            /^ene/i,
            /^feb/i,
            /^mar/i,
            /^abr/i,
            /^may/i,
            /^jun/i,
            /^jul/i,
            /^ago/i,
            /^sep/i,
            /^oct/i,
            /^nov/i,
            /^dic/i,
        ],
        monthsRegex =
            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;

    var esMx = moment.defineLocale('es-mx', {
        months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(
            '_'
        ),
        monthsShort: function (m, format) {
            if (!m) {
                return monthsShortDot;
            } else if (/-MMM-/.test(format)) {
                return monthsShort[m.month()];
            } else {
                return monthsShortDot[m.month()];
            }
        },
        monthsRegex: monthsRegex,
        monthsShortRegex: monthsRegex,
        monthsStrictRegex:
            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,
        monthsShortStrictRegex:
            /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,
        monthsParse: monthsParse,
        longMonthsParse: monthsParse,
        shortMonthsParse: monthsParse,
        weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
        weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
        weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D [de] MMMM [de] YYYY',
            LLL: 'D [de] MMMM [de] YYYY H:mm',
            LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm',
        },
        calendar: {
            sameDay: function () {
                return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            nextDay: function () {
                return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            nextWeek: function () {
                return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            lastDay: function () {
                return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            lastWeek: function () {
                return (
                    '[el] dddd [pasado a la' +
                    (this.hours() !== 1 ? 's' : '') +
                    '] LT'
                );
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'en %s',
            past: 'hace %s',
            s: 'unos segundos',
            ss: '%d segundos',
            m: 'un minuto',
            mm: '%d minutos',
            h: 'una hora',
            hh: '%d horas',
            d: 'un día',
            dd: '%d días',
            w: 'una semana',
            ww: '%d semanas',
            M: 'un mes',
            MM: '%d meses',
            y: 'un año',
            yy: '%d años',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
        invalidDate: 'Fecha inválida',
    });

    return esMx;

})));
//! moment.js locale configuration
//! locale : Spanish (United States) [es-us]
//! author : bustta : https://github.com/bustta
//! author : chrisrodz : https://github.com/chrisrodz

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var monthsShortDot =
            'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(
                '_'
            ),
        monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
        monthsParse = [
            /^ene/i,
            /^feb/i,
            /^mar/i,
            /^abr/i,
            /^may/i,
            /^jun/i,
            /^jul/i,
            /^ago/i,
            /^sep/i,
            /^oct/i,
            /^nov/i,
            /^dic/i,
        ],
        monthsRegex =
            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;

    var esUs = moment.defineLocale('es-us', {
        months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(
            '_'
        ),
        monthsShort: function (m, format) {
            if (!m) {
                return monthsShortDot;
            } else if (/-MMM-/.test(format)) {
                return monthsShort[m.month()];
            } else {
                return monthsShortDot[m.month()];
            }
        },
        monthsRegex: monthsRegex,
        monthsShortRegex: monthsRegex,
        monthsStrictRegex:
            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,
        monthsShortStrictRegex:
            /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,
        monthsParse: monthsParse,
        longMonthsParse: monthsParse,
        shortMonthsParse: monthsParse,
        weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
        weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
        weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'h:mm A',
            LTS: 'h:mm:ss A',
            L: 'MM/DD/YYYY',
            LL: 'D [de] MMMM [de] YYYY',
            LLL: 'D [de] MMMM [de] YYYY h:mm A',
            LLLL: 'dddd, D [de] MMMM [de] YYYY h:mm A',
        },
        calendar: {
            sameDay: function () {
                return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            nextDay: function () {
                return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            nextWeek: function () {
                return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            lastDay: function () {
                return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            lastWeek: function () {
                return (
                    '[el] dddd [pasado a la' +
                    (this.hours() !== 1 ? 's' : '') +
                    '] LT'
                );
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'en %s',
            past: 'hace %s',
            s: 'unos segundos',
            ss: '%d segundos',
            m: 'un minuto',
            mm: '%d minutos',
            h: 'una hora',
            hh: '%d horas',
            d: 'un día',
            dd: '%d días',
            w: 'una semana',
            ww: '%d semanas',
            M: 'un mes',
            MM: '%d meses',
            y: 'un año',
            yy: '%d años',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    return esUs;

})));
//! moment.js locale configuration
//! locale : Spanish [es]
//! author : Julio Napurí : https://github.com/julionc

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var monthsShortDot =
            'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(
                '_'
            ),
        monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
        monthsParse = [
            /^ene/i,
            /^feb/i,
            /^mar/i,
            /^abr/i,
            /^may/i,
            /^jun/i,
            /^jul/i,
            /^ago/i,
            /^sep/i,
            /^oct/i,
            /^nov/i,
            /^dic/i,
        ],
        monthsRegex =
            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;

    var es = moment.defineLocale('es', {
        months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(
            '_'
        ),
        monthsShort: function (m, format) {
            if (!m) {
                return monthsShortDot;
            } else if (/-MMM-/.test(format)) {
                return monthsShort[m.month()];
            } else {
                return monthsShortDot[m.month()];
            }
        },
        monthsRegex: monthsRegex,
        monthsShortRegex: monthsRegex,
        monthsStrictRegex:
            /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,
        monthsShortStrictRegex:
            /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,
        monthsParse: monthsParse,
        longMonthsParse: monthsParse,
        shortMonthsParse: monthsParse,
        weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
        weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
        weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D [de] MMMM [de] YYYY',
            LLL: 'D [de] MMMM [de] YYYY H:mm',
            LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm',
        },
        calendar: {
            sameDay: function () {
                return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            nextDay: function () {
                return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            nextWeek: function () {
                return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            lastDay: function () {
                return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
            },
            lastWeek: function () {
                return (
                    '[el] dddd [pasado a la' +
                    (this.hours() !== 1 ? 's' : '') +
                    '] LT'
                );
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'en %s',
            past: 'hace %s',
            s: 'unos segundos',
            ss: '%d segundos',
            m: 'un minuto',
            mm: '%d minutos',
            h: 'una hora',
            hh: '%d horas',
            d: 'un día',
            dd: '%d días',
            w: 'una semana',
            ww: '%d semanas',
            M: 'un mes',
            MM: '%d meses',
            y: 'un año',
            yy: '%d años',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
        invalidDate: 'Fecha inválida',
    });

    return es;

})));
//! moment.js locale configuration
//! locale : Estonian [et]
//! author : Henry Kehlmann : https://github.com/madhenry
//! improvements : Illimar Tambek : https://github.com/ragulka

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    function processRelativeTime(number, withoutSuffix, key, isFuture) {
        var format = {
            s: ['mõne sekundi', 'mõni sekund', 'paar sekundit'],
            ss: [number + 'sekundi', number + 'sekundit'],
            m: ['ühe minuti', 'üks minut'],
            mm: [number + ' minuti', number + ' minutit'],
            h: ['ühe tunni', 'tund aega', 'üks tund'],
            hh: [number + ' tunni', number + ' tundi'],
            d: ['ühe päeva', 'üks päev'],
            M: ['kuu aja', 'kuu aega', 'üks kuu'],
            MM: [number + ' kuu', number + ' kuud'],
            y: ['ühe aasta', 'aasta', 'üks aasta'],
            yy: [number + ' aasta', number + ' aastat'],
        };
        if (withoutSuffix) {
            return format[key][2] ? format[key][2] : format[key][1];
        }
        return isFuture ? format[key][0] : format[key][1];
    }

    var et = moment.defineLocale('et', {
        months: 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split(
            '_'
        ),
        monthsShort:
            'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'),
        weekdays:
            'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split(
                '_'
            ),
        weekdaysShort: 'P_E_T_K_N_R_L'.split('_'),
        weekdaysMin: 'P_E_T_K_N_R_L'.split('_'),
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY H:mm',
            LLLL: 'dddd, D. MMMM YYYY H:mm',
        },
        calendar: {
            sameDay: '[Täna,] LT',
            nextDay: '[Homme,] LT',
            nextWeek: '[Järgmine] dddd LT',
            lastDay: '[Eile,] LT',
            lastWeek: '[Eelmine] dddd LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s pärast',
            past: '%s tagasi',
            s: processRelativeTime,
            ss: processRelativeTime,
            m: processRelativeTime,
            mm: processRelativeTime,
            h: processRelativeTime,
            hh: processRelativeTime,
            d: processRelativeTime,
            dd: '%d päeva',
            M: processRelativeTime,
            MM: processRelativeTime,
            y: processRelativeTime,
            yy: processRelativeTime,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return et;

})));
//! moment.js locale configuration
//! locale : Basque [eu]
//! author : Eneko Illarramendi : https://github.com/eillarra

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var eu = moment.defineLocale('eu', {
        months: 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split(
            '_'
        ),
        monthsShort:
            'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays:
            'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split(
                '_'
            ),
        weekdaysShort: 'ig._al._ar._az._og._ol._lr.'.split('_'),
        weekdaysMin: 'ig_al_ar_az_og_ol_lr'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY-MM-DD',
            LL: 'YYYY[ko] MMMM[ren] D[a]',
            LLL: 'YYYY[ko] MMMM[ren] D[a] HH:mm',
            LLLL: 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm',
            l: 'YYYY-M-D',
            ll: 'YYYY[ko] MMM D[a]',
            lll: 'YYYY[ko] MMM D[a] HH:mm',
            llll: 'ddd, YYYY[ko] MMM D[a] HH:mm',
        },
        calendar: {
            sameDay: '[gaur] LT[etan]',
            nextDay: '[bihar] LT[etan]',
            nextWeek: 'dddd LT[etan]',
            lastDay: '[atzo] LT[etan]',
            lastWeek: '[aurreko] dddd LT[etan]',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s barru',
            past: 'duela %s',
            s: 'segundo batzuk',
            ss: '%d segundo',
            m: 'minutu bat',
            mm: '%d minutu',
            h: 'ordu bat',
            hh: '%d ordu',
            d: 'egun bat',
            dd: '%d egun',
            M: 'hilabete bat',
            MM: '%d hilabete',
            y: 'urte bat',
            yy: '%d urte',
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    return eu;

})));
//! moment.js locale configuration
//! locale : Persian [fa]
//! author : Ebrahim Byagowi : https://github.com/ebraminio

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var symbolMap = {
            1: '۱',
            2: '۲',
            3: '۳',
            4: '۴',
            5: '۵',
            6: '۶',
            7: '۷',
            8: '۸',
            9: '۹',
            0: '۰',
        },
        numberMap = {
            '۱': '1',
            '۲': '2',
            '۳': '3',
            '۴': '4',
            '۵': '5',
            '۶': '6',
            '۷': '7',
            '۸': '8',
            '۹': '9',
            '۰': '0',
        };

    var fa = moment.defineLocale('fa', {
        months: 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split(
            '_'
        ),
        monthsShort:
            'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split(
                '_'
            ),
        weekdays:
            'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split(
                '_'
            ),
        weekdaysShort:
            'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split(
                '_'
            ),
        weekdaysMin: 'ی_د_س_چ_پ_ج_ش'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        meridiemParse: /قبل از ظهر|بعد از ظهر/,
        isPM: function (input) {
            return /بعد از ظهر/.test(input);
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'قبل از ظهر';
            } else {
                return 'بعد از ظهر';
            }
        },
        calendar: {
            sameDay: '[امروز ساعت] LT',
            nextDay: '[فردا ساعت] LT',
            nextWeek: 'dddd [ساعت] LT',
            lastDay: '[دیروز ساعت] LT',
            lastWeek: 'dddd [پیش] [ساعت] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'در %s',
            past: '%s پیش',
            s: 'چند ثانیه',
            ss: '%d ثانیه',
            m: 'یک دقیقه',
            mm: '%d دقیقه',
            h: 'یک ساعت',
            hh: '%d ساعت',
            d: 'یک روز',
            dd: '%d روز',
            M: 'یک ماه',
            MM: '%d ماه',
            y: 'یک سال',
            yy: '%d سال',
        },
        preparse: function (string) {
            return string
                .replace(/[۰-۹]/g, function (match) {
                    return numberMap[match];
                })
                .replace(/،/g, ',');
        },
        postformat: function (string) {
            return string
                .replace(/\d/g, function (match) {
                    return symbolMap[match];
                })
                .replace(/,/g, '،');
        },
        dayOfMonthOrdinalParse: /\d{1,2}م/,
        ordinal: '%dم',
        week: {
            dow: 6, // Saturday is the first day of the week.
            doy: 12, // The week that contains Jan 12th is the first week of the year.
        },
    });

    return fa;

})));
//! moment.js locale configuration
//! locale : Finnish [fi]
//! author : Tarmo Aidantausta : https://github.com/bleadof

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var numbersPast =
            'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(
                ' '
            ),
        numbersFuture = [
            'nolla',
            'yhden',
            'kahden',
            'kolmen',
            'neljän',
            'viiden',
            'kuuden',
            numbersPast[7],
            numbersPast[8],
            numbersPast[9],
        ];
    function translate(number, withoutSuffix, key, isFuture) {
        var result = '';
        switch (key) {
            case 's':
                return isFuture ? 'muutaman sekunnin' : 'muutama sekunti';
            case 'ss':
                result = isFuture ? 'sekunnin' : 'sekuntia';
                break;
            case 'm':
                return isFuture ? 'minuutin' : 'minuutti';
            case 'mm':
                result = isFuture ? 'minuutin' : 'minuuttia';
                break;
            case 'h':
                return isFuture ? 'tunnin' : 'tunti';
            case 'hh':
                result = isFuture ? 'tunnin' : 'tuntia';
                break;
            case 'd':
                return isFuture ? 'päivän' : 'päivä';
            case 'dd':
                result = isFuture ? 'päivän' : 'päivää';
                break;
            case 'M':
                return isFuture ? 'kuukauden' : 'kuukausi';
            case 'MM':
                result = isFuture ? 'kuukauden' : 'kuukautta';
                break;
            case 'y':
                return isFuture ? 'vuoden' : 'vuosi';
            case 'yy':
                result = isFuture ? 'vuoden' : 'vuotta';
                break;
        }
        result = verbalNumber(number, isFuture) + ' ' + result;
        return result;
    }
    function verbalNumber(number, isFuture) {
        return number < 10
            ? isFuture
                ? numbersFuture[number]
                : numbersPast[number]
            : number;
    }

    var fi = moment.defineLocale('fi', {
        months: 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split(
            '_'
        ),
        monthsShort:
            'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split(
                '_'
            ),
        weekdays:
            'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split(
                '_'
            ),
        weekdaysShort: 'su_ma_ti_ke_to_pe_la'.split('_'),
        weekdaysMin: 'su_ma_ti_ke_to_pe_la'.split('_'),
        longDateFormat: {
            LT: 'HH.mm',
            LTS: 'HH.mm.ss',
            L: 'DD.MM.YYYY',
            LL: 'Do MMMM[ta] YYYY',
            LLL: 'Do MMMM[ta] YYYY, [klo] HH.mm',
            LLLL: 'dddd, Do MMMM[ta] YYYY, [klo] HH.mm',
            l: 'D.M.YYYY',
            ll: 'Do MMM YYYY',
            lll: 'Do MMM YYYY, [klo] HH.mm',
            llll: 'ddd, Do MMM YYYY, [klo] HH.mm',
        },
        calendar: {
            sameDay: '[tänään] [klo] LT',
            nextDay: '[huomenna] [klo] LT',
            nextWeek: 'dddd [klo] LT',
            lastDay: '[eilen] [klo] LT',
            lastWeek: '[viime] dddd[na] [klo] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s päästä',
            past: '%s sitten',
            s: translate,
            ss: translate,
            m: translate,
            mm: translate,
            h: translate,
            hh: translate,
            d: translate,
            dd: translate,
            M: translate,
            MM: translate,
            y: translate,
            yy: translate,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return fi;

})));
//! moment.js locale configuration
//! locale : Filipino [fil]
//! author : Dan Hagman : https://github.com/hagmandan
//! author : Matthew Co : https://github.com/matthewdeeco

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var fil = moment.defineLocale('fil', {
        months: 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split(
            '_'
        ),
        monthsShort: 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),
        weekdays: 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split(
            '_'
        ),
        weekdaysShort: 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'),
        weekdaysMin: 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'MM/D/YYYY',
            LL: 'MMMM D, YYYY',
            LLL: 'MMMM D, YYYY HH:mm',
            LLLL: 'dddd, MMMM DD, YYYY HH:mm',
        },
        calendar: {
            sameDay: 'LT [ngayong araw]',
            nextDay: '[Bukas ng] LT',
            nextWeek: 'LT [sa susunod na] dddd',
            lastDay: 'LT [kahapon]',
            lastWeek: 'LT [noong nakaraang] dddd',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'sa loob ng %s',
            past: '%s ang nakalipas',
            s: 'ilang segundo',
            ss: '%d segundo',
            m: 'isang minuto',
            mm: '%d minuto',
            h: 'isang oras',
            hh: '%d oras',
            d: 'isang araw',
            dd: '%d araw',
            M: 'isang buwan',
            MM: '%d buwan',
            y: 'isang taon',
            yy: '%d taon',
        },
        dayOfMonthOrdinalParse: /\d{1,2}/,
        ordinal: function (number) {
            return number;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return fil;

})));
//! moment.js locale configuration
//! locale : Faroese [fo]
//! author : Ragnar Johannesen : https://github.com/ragnar123
//! author : Kristian Sakarisson : https://github.com/sakarisson

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var fo = moment.defineLocale('fo', {
        months: 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split(
            '_'
        ),
        monthsShort: 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
        weekdays:
            'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split(
                '_'
            ),
        weekdaysShort: 'sun_mán_týs_mik_hós_frí_ley'.split('_'),
        weekdaysMin: 'su_má_tý_mi_hó_fr_le'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D. MMMM, YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Í dag kl.] LT',
            nextDay: '[Í morgin kl.] LT',
            nextWeek: 'dddd [kl.] LT',
            lastDay: '[Í gjár kl.] LT',
            lastWeek: '[síðstu] dddd [kl] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'um %s',
            past: '%s síðani',
            s: 'fá sekund',
            ss: '%d sekundir',
            m: 'ein minuttur',
            mm: '%d minuttir',
            h: 'ein tími',
            hh: '%d tímar',
            d: 'ein dagur',
            dd: '%d dagar',
            M: 'ein mánaður',
            MM: '%d mánaðir',
            y: 'eitt ár',
            yy: '%d ár',
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return fo;

})));
//! moment.js locale configuration
//! locale : French (Canada) [fr-ca]
//! author : Jonathan Abourbih : https://github.com/jonbca

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var frCa = moment.defineLocale('fr-ca', {
        months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split(
            '_'
        ),
        monthsShort:
            'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
        weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
        weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY-MM-DD',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Aujourd’hui à] LT',
            nextDay: '[Demain à] LT',
            nextWeek: 'dddd [à] LT',
            lastDay: '[Hier à] LT',
            lastWeek: 'dddd [dernier à] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'dans %s',
            past: 'il y a %s',
            s: 'quelques secondes',
            ss: '%d secondes',
            m: 'une minute',
            mm: '%d minutes',
            h: 'une heure',
            hh: '%d heures',
            d: 'un jour',
            dd: '%d jours',
            M: 'un mois',
            MM: '%d mois',
            y: 'un an',
            yy: '%d ans',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(er|e)/,
        ordinal: function (number, period) {
            switch (period) {
                // Words with masculine grammatical gender: mois, trimestre, jour
                default:
                case 'M':
                case 'Q':
                case 'D':
                case 'DDD':
                case 'd':
                    return number + (number === 1 ? 'er' : 'e');

                // Words with feminine grammatical gender: semaine
                case 'w':
                case 'W':
                    return number + (number === 1 ? 're' : 'e');
            }
        },
    });

    return frCa;

})));
//! moment.js locale configuration
//! locale : French (Switzerland) [fr-ch]
//! author : Gaspard Bucher : https://github.com/gaspard

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var frCh = moment.defineLocale('fr-ch', {
        months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split(
            '_'
        ),
        monthsShort:
            'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
        weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
        weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Aujourd’hui à] LT',
            nextDay: '[Demain à] LT',
            nextWeek: 'dddd [à] LT',
            lastDay: '[Hier à] LT',
            lastWeek: 'dddd [dernier à] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'dans %s',
            past: 'il y a %s',
            s: 'quelques secondes',
            ss: '%d secondes',
            m: 'une minute',
            mm: '%d minutes',
            h: 'une heure',
            hh: '%d heures',
            d: 'un jour',
            dd: '%d jours',
            M: 'un mois',
            MM: '%d mois',
            y: 'un an',
            yy: '%d ans',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(er|e)/,
        ordinal: function (number, period) {
            switch (period) {
                // Words with masculine grammatical gender: mois, trimestre, jour
                default:
                case 'M':
                case 'Q':
                case 'D':
                case 'DDD':
                case 'd':
                    return number + (number === 1 ? 'er' : 'e');

                // Words with feminine grammatical gender: semaine
                case 'w':
                case 'W':
                    return number + (number === 1 ? 're' : 'e');
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return frCh;

})));
//! moment.js locale configuration
//! locale : French [fr]
//! author : John Fischer : https://github.com/jfroffice

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var monthsStrictRegex =
            /^(janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i,
        monthsShortStrictRegex =
            /(janv\.?|févr\.?|mars|avr\.?|mai|juin|juil\.?|août|sept\.?|oct\.?|nov\.?|déc\.?)/i,
        monthsRegex =
            /(janv\.?|févr\.?|mars|avr\.?|mai|juin|juil\.?|août|sept\.?|oct\.?|nov\.?|déc\.?|janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i,
        monthsParse = [
            /^janv/i,
            /^févr/i,
            /^mars/i,
            /^avr/i,
            /^mai/i,
            /^juin/i,
            /^juil/i,
            /^août/i,
            /^sept/i,
            /^oct/i,
            /^nov/i,
            /^déc/i,
        ];

    var fr = moment.defineLocale('fr', {
        months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split(
            '_'
        ),
        monthsShort:
            'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split(
                '_'
            ),
        monthsRegex: monthsRegex,
        monthsShortRegex: monthsRegex,
        monthsStrictRegex: monthsStrictRegex,
        monthsShortStrictRegex: monthsShortStrictRegex,
        monthsParse: monthsParse,
        longMonthsParse: monthsParse,
        shortMonthsParse: monthsParse,
        weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
        weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
        weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Aujourd’hui à] LT',
            nextDay: '[Demain à] LT',
            nextWeek: 'dddd [à] LT',
            lastDay: '[Hier à] LT',
            lastWeek: 'dddd [dernier à] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'dans %s',
            past: 'il y a %s',
            s: 'quelques secondes',
            ss: '%d secondes',
            m: 'une minute',
            mm: '%d minutes',
            h: 'une heure',
            hh: '%d heures',
            d: 'un jour',
            dd: '%d jours',
            w: 'une semaine',
            ww: '%d semaines',
            M: 'un mois',
            MM: '%d mois',
            y: 'un an',
            yy: '%d ans',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(er|)/,
        ordinal: function (number, period) {
            switch (period) {
                // TODO: Return 'e' when day of month > 1. Move this case inside
                // block for masculine words below.
                // See https://github.com/moment/moment/issues/3375
                case 'D':
                    return number + (number === 1 ? 'er' : '');

                // Words with masculine grammatical gender: mois, trimestre, jour
                default:
                case 'M':
                case 'Q':
                case 'DDD':
                case 'd':
                    return number + (number === 1 ? 'er' : 'e');

                // Words with feminine grammatical gender: semaine
                case 'w':
                case 'W':
                    return number + (number === 1 ? 're' : 'e');
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return fr;

})));
//! moment.js locale configuration
//! locale : Frisian [fy]
//! author : Robin van der Vliet : https://github.com/robin0van0der0v

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var monthsShortWithDots =
            'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'),
        monthsShortWithoutDots =
            'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_');

    var fy = moment.defineLocale('fy', {
        months: 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split(
            '_'
        ),
        monthsShort: function (m, format) {
            if (!m) {
                return monthsShortWithDots;
            } else if (/-MMM-/.test(format)) {
                return monthsShortWithoutDots[m.month()];
            } else {
                return monthsShortWithDots[m.month()];
            }
        },
        monthsParseExact: true,
        weekdays: 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split(
            '_'
        ),
        weekdaysShort: 'si._mo._ti._wo._to._fr._so.'.split('_'),
        weekdaysMin: 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD-MM-YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[hjoed om] LT',
            nextDay: '[moarn om] LT',
            nextWeek: 'dddd [om] LT',
            lastDay: '[juster om] LT',
            lastWeek: '[ôfrûne] dddd [om] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'oer %s',
            past: '%s lyn',
            s: 'in pear sekonden',
            ss: '%d sekonden',
            m: 'ien minút',
            mm: '%d minuten',
            h: 'ien oere',
            hh: '%d oeren',
            d: 'ien dei',
            dd: '%d dagen',
            M: 'ien moanne',
            MM: '%d moannen',
            y: 'ien jier',
            yy: '%d jierren',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/,
        ordinal: function (number) {
            return (
                number +
                (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')
            );
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return fy;

})));
//! moment.js locale configuration
//! locale : Irish or Irish Gaelic [ga]
//! author : André Silva : https://github.com/askpt

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var months = [
            'Eanáir',
            'Feabhra',
            'Márta',
            'Aibreán',
            'Bealtaine',
            'Meitheamh',
            'Iúil',
            'Lúnasa',
            'Meán Fómhair',
            'Deireadh Fómhair',
            'Samhain',
            'Nollaig',
        ],
        monthsShort = [
            'Ean',
            'Feabh',
            'Márt',
            'Aib',
            'Beal',
            'Meith',
            'Iúil',
            'Lún',
            'M.F.',
            'D.F.',
            'Samh',
            'Noll',
        ],
        weekdays = [
            'Dé Domhnaigh',
            'Dé Luain',
            'Dé Máirt',
            'Dé Céadaoin',
            'Déardaoin',
            'Dé hAoine',
            'Dé Sathairn',
        ],
        weekdaysShort = ['Domh', 'Luan', 'Máirt', 'Céad', 'Déar', 'Aoine', 'Sath'],
        weekdaysMin = ['Do', 'Lu', 'Má', 'Cé', 'Dé', 'A', 'Sa'];

    var ga = moment.defineLocale('ga', {
        months: months,
        monthsShort: monthsShort,
        monthsParseExact: true,
        weekdays: weekdays,
        weekdaysShort: weekdaysShort,
        weekdaysMin: weekdaysMin,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Inniu ag] LT',
            nextDay: '[Amárach ag] LT',
            nextWeek: 'dddd [ag] LT',
            lastDay: '[Inné ag] LT',
            lastWeek: 'dddd [seo caite] [ag] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'i %s',
            past: '%s ó shin',
            s: 'cúpla soicind',
            ss: '%d soicind',
            m: 'nóiméad',
            mm: '%d nóiméad',
            h: 'uair an chloig',
            hh: '%d uair an chloig',
            d: 'lá',
            dd: '%d lá',
            M: 'mí',
            MM: '%d míonna',
            y: 'bliain',
            yy: '%d bliain',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(d|na|mh)/,
        ordinal: function (number) {
            var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return ga;

})));
//! moment.js locale configuration
//! locale : Scottish Gaelic [gd]
//! author : Jon Ashdown : https://github.com/jonashdown

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var months = [
            'Am Faoilleach',
            'An Gearran',
            'Am Màrt',
            'An Giblean',
            'An Cèitean',
            'An t-Ògmhios',
            'An t-Iuchar',
            'An Lùnastal',
            'An t-Sultain',
            'An Dàmhair',
            'An t-Samhain',
            'An Dùbhlachd',
        ],
        monthsShort = [
            'Faoi',
            'Gear',
            'Màrt',
            'Gibl',
            'Cèit',
            'Ògmh',
            'Iuch',
            'Lùn',
            'Sult',
            'Dàmh',
            'Samh',
            'Dùbh',
        ],
        weekdays = [
            'Didòmhnaich',
            'Diluain',
            'Dimàirt',
            'Diciadain',
            'Diardaoin',
            'Dihaoine',
            'Disathairne',
        ],
        weekdaysShort = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis'],
        weekdaysMin = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa'];

    var gd = moment.defineLocale('gd', {
        months: months,
        monthsShort: monthsShort,
        monthsParseExact: true,
        weekdays: weekdays,
        weekdaysShort: weekdaysShort,
        weekdaysMin: weekdaysMin,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[An-diugh aig] LT',
            nextDay: '[A-màireach aig] LT',
            nextWeek: 'dddd [aig] LT',
            lastDay: '[An-dè aig] LT',
            lastWeek: 'dddd [seo chaidh] [aig] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'ann an %s',
            past: 'bho chionn %s',
            s: 'beagan diogan',
            ss: '%d diogan',
            m: 'mionaid',
            mm: '%d mionaidean',
            h: 'uair',
            hh: '%d uairean',
            d: 'latha',
            dd: '%d latha',
            M: 'mìos',
            MM: '%d mìosan',
            y: 'bliadhna',
            yy: '%d bliadhna',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(d|na|mh)/,
        ordinal: function (number) {
            var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return gd;

})));
//! moment.js locale configuration
//! locale : Galician [gl]
//! author : Juan G. Hurtado : https://github.com/juanghurtado

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var gl = moment.defineLocale('gl', {
        months: 'xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro'.split(
            '_'
        ),
        monthsShort:
            'xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'domingo_luns_martes_mércores_xoves_venres_sábado'.split('_'),
        weekdaysShort: 'dom._lun._mar._mér._xov._ven._sáb.'.split('_'),
        weekdaysMin: 'do_lu_ma_mé_xo_ve_sá'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D [de] MMMM [de] YYYY',
            LLL: 'D [de] MMMM [de] YYYY H:mm',
            LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm',
        },
        calendar: {
            sameDay: function () {
                return '[hoxe ' + (this.hours() !== 1 ? 'ás' : 'á') + '] LT';
            },
            nextDay: function () {
                return '[mañá ' + (this.hours() !== 1 ? 'ás' : 'á') + '] LT';
            },
            nextWeek: function () {
                return 'dddd [' + (this.hours() !== 1 ? 'ás' : 'a') + '] LT';
            },
            lastDay: function () {
                return '[onte ' + (this.hours() !== 1 ? 'á' : 'a') + '] LT';
            },
            lastWeek: function () {
                return (
                    '[o] dddd [pasado ' + (this.hours() !== 1 ? 'ás' : 'a') + '] LT'
                );
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: function (str) {
                if (str.indexOf('un') === 0) {
                    return 'n' + str;
                }
                return 'en ' + str;
            },
            past: 'hai %s',
            s: 'uns segundos',
            ss: '%d segundos',
            m: 'un minuto',
            mm: '%d minutos',
            h: 'unha hora',
            hh: '%d horas',
            d: 'un día',
            dd: '%d días',
            M: 'un mes',
            MM: '%d meses',
            y: 'un ano',
            yy: '%d anos',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return gl;

})));
//! moment.js locale configuration
//! locale : Konkani Devanagari script [gom-deva]
//! author : The Discoverer : https://github.com/WikiDiscoverer

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    function processRelativeTime(number, withoutSuffix, key, isFuture) {
        var format = {
            s: ['थोडया सॅकंडांनी', 'थोडे सॅकंड'],
            ss: [number + ' सॅकंडांनी', number + ' सॅकंड'],
            m: ['एका मिणटान', 'एक मिनूट'],
            mm: [number + ' मिणटांनी', number + ' मिणटां'],
            h: ['एका वरान', 'एक वर'],
            hh: [number + ' वरांनी', number + ' वरां'],
            d: ['एका दिसान', 'एक दीस'],
            dd: [number + ' दिसांनी', number + ' दीस'],
            M: ['एका म्हयन्यान', 'एक म्हयनो'],
            MM: [number + ' म्हयन्यानी', number + ' म्हयने'],
            y: ['एका वर्सान', 'एक वर्स'],
            yy: [number + ' वर्सांनी', number + ' वर्सां'],
        };
        return isFuture ? format[key][0] : format[key][1];
    }

    var gomDeva = moment.defineLocale('gom-deva', {
        months: {
            standalone:
                'जानेवारी_फेब्रुवारी_मार्च_एप्रील_मे_जून_जुलय_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split(
                    '_'
                ),
            format: 'जानेवारीच्या_फेब्रुवारीच्या_मार्चाच्या_एप्रीलाच्या_मेयाच्या_जूनाच्या_जुलयाच्या_ऑगस्टाच्या_सप्टेंबराच्या_ऑक्टोबराच्या_नोव्हेंबराच्या_डिसेंबराच्या'.split(
                '_'
            ),
            isFormat: /MMMM(\s)+D[oD]?/,
        },
        monthsShort:
            'जाने._फेब्रु._मार्च_एप्री._मे_जून_जुल._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'आयतार_सोमार_मंगळार_बुधवार_बिरेस्तार_सुक्रार_शेनवार'.split('_'),
        weekdaysShort: 'आयत._सोम._मंगळ._बुध._ब्रेस्त._सुक्र._शेन.'.split('_'),
        weekdaysMin: 'आ_सो_मं_बु_ब्रे_सु_शे'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'A h:mm [वाजतां]',
            LTS: 'A h:mm:ss [वाजतां]',
            L: 'DD-MM-YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY A h:mm [वाजतां]',
            LLLL: 'dddd, MMMM Do, YYYY, A h:mm [वाजतां]',
            llll: 'ddd, D MMM YYYY, A h:mm [वाजतां]',
        },
        calendar: {
            sameDay: '[आयज] LT',
            nextDay: '[फाल्यां] LT',
            nextWeek: '[फुडलो] dddd[,] LT',
            lastDay: '[काल] LT',
            lastWeek: '[फाटलो] dddd[,] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s',
            past: '%s आदीं',
            s: processRelativeTime,
            ss: processRelativeTime,
            m: processRelativeTime,
            mm: processRelativeTime,
            h: processRelativeTime,
            hh: processRelativeTime,
            d: processRelativeTime,
            dd: processRelativeTime,
            M: processRelativeTime,
            MM: processRelativeTime,
            y: processRelativeTime,
            yy: processRelativeTime,
        },
        dayOfMonthOrdinalParse: /\d{1,2}(वेर)/,
        ordinal: function (number, period) {
            switch (period) {
                // the ordinal 'वेर' only applies to day of the month
                case 'D':
                    return number + 'वेर';
                default:
                case 'M':
                case 'Q':
                case 'DDD':
                case 'd':
                case 'w':
                case 'W':
                    return number;
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week
            doy: 3, // The week that contains Jan 4th is the first week of the year (7 + 0 - 4)
        },
        meridiemParse: /राती|सकाळीं|दनपारां|सांजे/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'राती') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'सकाळीं') {
                return hour;
            } else if (meridiem === 'दनपारां') {
                return hour > 12 ? hour : hour + 12;
            } else if (meridiem === 'सांजे') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'राती';
            } else if (hour < 12) {
                return 'सकाळीं';
            } else if (hour < 16) {
                return 'दनपारां';
            } else if (hour < 20) {
                return 'सांजे';
            } else {
                return 'राती';
            }
        },
    });

    return gomDeva;

})));
//! moment.js locale configuration
//! locale : Konkani Latin script [gom-latn]
//! author : The Discoverer : https://github.com/WikiDiscoverer

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    function processRelativeTime(number, withoutSuffix, key, isFuture) {
        var format = {
            s: ['thoddea sekondamni', 'thodde sekond'],
            ss: [number + ' sekondamni', number + ' sekond'],
            m: ['eka mintan', 'ek minut'],
            mm: [number + ' mintamni', number + ' mintam'],
            h: ['eka voran', 'ek vor'],
            hh: [number + ' voramni', number + ' voram'],
            d: ['eka disan', 'ek dis'],
            dd: [number + ' disamni', number + ' dis'],
            M: ['eka mhoinean', 'ek mhoino'],
            MM: [number + ' mhoineamni', number + ' mhoine'],
            y: ['eka vorsan', 'ek voros'],
            yy: [number + ' vorsamni', number + ' vorsam'],
        };
        return isFuture ? format[key][0] : format[key][1];
    }

    var gomLatn = moment.defineLocale('gom-latn', {
        months: {
            standalone:
                'Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr'.split(
                    '_'
                ),
            format: 'Janerachea_Febrerachea_Marsachea_Abrilachea_Maiachea_Junachea_Julaiachea_Agostachea_Setembrachea_Otubrachea_Novembrachea_Dezembrachea'.split(
                '_'
            ),
            isFormat: /MMMM(\s)+D[oD]?/,
        },
        monthsShort:
            'Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.'.split('_'),
        monthsParseExact: true,
        weekdays: "Aitar_Somar_Mongllar_Budhvar_Birestar_Sukrar_Son'var".split('_'),
        weekdaysShort: 'Ait._Som._Mon._Bud._Bre._Suk._Son.'.split('_'),
        weekdaysMin: 'Ai_Sm_Mo_Bu_Br_Su_Sn'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'A h:mm [vazta]',
            LTS: 'A h:mm:ss [vazta]',
            L: 'DD-MM-YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY A h:mm [vazta]',
            LLLL: 'dddd, MMMM Do, YYYY, A h:mm [vazta]',
            llll: 'ddd, D MMM YYYY, A h:mm [vazta]',
        },
        calendar: {
            sameDay: '[Aiz] LT',
            nextDay: '[Faleam] LT',
            nextWeek: '[Fuddlo] dddd[,] LT',
            lastDay: '[Kal] LT',
            lastWeek: '[Fattlo] dddd[,] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s',
            past: '%s adim',
            s: processRelativeTime,
            ss: processRelativeTime,
            m: processRelativeTime,
            mm: processRelativeTime,
            h: processRelativeTime,
            hh: processRelativeTime,
            d: processRelativeTime,
            dd: processRelativeTime,
            M: processRelativeTime,
            MM: processRelativeTime,
            y: processRelativeTime,
            yy: processRelativeTime,
        },
        dayOfMonthOrdinalParse: /\d{1,2}(er)/,
        ordinal: function (number, period) {
            switch (period) {
                // the ordinal 'er' only applies to day of the month
                case 'D':
                    return number + 'er';
                default:
                case 'M':
                case 'Q':
                case 'DDD':
                case 'd':
                case 'w':
                case 'W':
                    return number;
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week
            doy: 3, // The week that contains Jan 4th is the first week of the year (7 + 0 - 4)
        },
        meridiemParse: /rati|sokallim|donparam|sanje/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'rati') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'sokallim') {
                return hour;
            } else if (meridiem === 'donparam') {
                return hour > 12 ? hour : hour + 12;
            } else if (meridiem === 'sanje') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'rati';
            } else if (hour < 12) {
                return 'sokallim';
            } else if (hour < 16) {
                return 'donparam';
            } else if (hour < 20) {
                return 'sanje';
            } else {
                return 'rati';
            }
        },
    });

    return gomLatn;

})));
//! moment.js locale configuration
//! locale : Gujarati [gu]
//! author : Kaushik Thanki : https://github.com/Kaushik1987

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var symbolMap = {
            1: '૧',
            2: '૨',
            3: '૩',
            4: '૪',
            5: '૫',
            6: '૬',
            7: '૭',
            8: '૮',
            9: '૯',
            0: '૦',
        },
        numberMap = {
            '૧': '1',
            '૨': '2',
            '૩': '3',
            '૪': '4',
            '૫': '5',
            '૬': '6',
            '૭': '7',
            '૮': '8',
            '૯': '9',
            '૦': '0',
        };

    var gu = moment.defineLocale('gu', {
        months: 'જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર'.split(
            '_'
        ),
        monthsShort:
            'જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'રવિવાર_સોમવાર_મંગળવાર_બુધ્વાર_ગુરુવાર_શુક્રવાર_શનિવાર'.split(
            '_'
        ),
        weekdaysShort: 'રવિ_સોમ_મંગળ_બુધ્_ગુરુ_શુક્ર_શનિ'.split('_'),
        weekdaysMin: 'ર_સો_મં_બુ_ગુ_શુ_શ'.split('_'),
        longDateFormat: {
            LT: 'A h:mm વાગ્યે',
            LTS: 'A h:mm:ss વાગ્યે',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm વાગ્યે',
            LLLL: 'dddd, D MMMM YYYY, A h:mm વાગ્યે',
        },
        calendar: {
            sameDay: '[આજ] LT',
            nextDay: '[કાલે] LT',
            nextWeek: 'dddd, LT',
            lastDay: '[ગઇકાલે] LT',
            lastWeek: '[પાછલા] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s મા',
            past: '%s પહેલા',
            s: 'અમુક પળો',
            ss: '%d સેકંડ',
            m: 'એક મિનિટ',
            mm: '%d મિનિટ',
            h: 'એક કલાક',
            hh: '%d કલાક',
            d: 'એક દિવસ',
            dd: '%d દિવસ',
            M: 'એક મહિનો',
            MM: '%d મહિનો',
            y: 'એક વર્ષ',
            yy: '%d વર્ષ',
        },
        preparse: function (string) {
            return string.replace(/[૧૨૩૪૫૬૭૮૯૦]/g, function (match) {
                return numberMap[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap[match];
            });
        },
        // Gujarati notation for meridiems are quite fuzzy in practice. While there exists
        // a rigid notion of a 'Pahar' it is not used as rigidly in modern Gujarati.
        meridiemParse: /રાત|બપોર|સવાર|સાંજ/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'રાત') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'સવાર') {
                return hour;
            } else if (meridiem === 'બપોર') {
                return hour >= 10 ? hour : hour + 12;
            } else if (meridiem === 'સાંજ') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'રાત';
            } else if (hour < 10) {
                return 'સવાર';
            } else if (hour < 17) {
                return 'બપોર';
            } else if (hour < 20) {
                return 'સાંજ';
            } else {
                return 'રાત';
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    return gu;

})));
//! moment.js locale configuration
//! locale : Hebrew [he]
//! author : Tomer Cohen : https://github.com/tomer
//! author : Moshe Simantov : https://github.com/DevelopmentIL
//! author : Tal Ater : https://github.com/TalAter

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var he = moment.defineLocale('he', {
        months: 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split(
            '_'
        ),
        monthsShort:
            'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'),
        weekdays: 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'),
        weekdaysShort: 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'),
        weekdaysMin: 'א_ב_ג_ד_ה_ו_ש'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D [ב]MMMM YYYY',
            LLL: 'D [ב]MMMM YYYY HH:mm',
            LLLL: 'dddd, D [ב]MMMM YYYY HH:mm',
            l: 'D/M/YYYY',
            ll: 'D MMM YYYY',
            lll: 'D MMM YYYY HH:mm',
            llll: 'ddd, D MMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[היום ב־]LT',
            nextDay: '[מחר ב־]LT',
            nextWeek: 'dddd [בשעה] LT',
            lastDay: '[אתמול ב־]LT',
            lastWeek: '[ביום] dddd [האחרון בשעה] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'בעוד %s',
            past: 'לפני %s',
            s: 'מספר שניות',
            ss: '%d שניות',
            m: 'דקה',
            mm: '%d דקות',
            h: 'שעה',
            hh: function (number) {
                if (number === 2) {
                    return 'שעתיים';
                }
                return number + ' שעות';
            },
            d: 'יום',
            dd: function (number) {
                if (number === 2) {
                    return 'יומיים';
                }
                return number + ' ימים';
            },
            M: 'חודש',
            MM: function (number) {
                if (number === 2) {
                    return 'חודשיים';
                }
                return number + ' חודשים';
            },
            y: 'שנה',
            yy: function (number) {
                if (number === 2) {
                    return 'שנתיים';
                } else if (number % 10 === 0 && number !== 10) {
                    return number + ' שנה';
                }
                return number + ' שנים';
            },
        },
        meridiemParse:
            /אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,
        isPM: function (input) {
            return /^(אחה"צ|אחרי הצהריים|בערב)$/.test(input);
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 5) {
                return 'לפנות בוקר';
            } else if (hour < 10) {
                return 'בבוקר';
            } else if (hour < 12) {
                return isLower ? 'לפנה"צ' : 'לפני הצהריים';
            } else if (hour < 18) {
                return isLower ? 'אחה"צ' : 'אחרי הצהריים';
            } else {
                return 'בערב';
            }
        },
    });

    return he;

})));
//! moment.js locale configuration
//! locale : Hindi [hi]
//! author : Mayank Singhal : https://github.com/mayanksinghal

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var symbolMap = {
            1: '१',
            2: '२',
            3: '३',
            4: '४',
            5: '५',
            6: '६',
            7: '७',
            8: '८',
            9: '९',
            0: '०',
        },
        numberMap = {
            '१': '1',
            '२': '2',
            '३': '3',
            '४': '4',
            '५': '5',
            '६': '6',
            '७': '7',
            '८': '8',
            '९': '9',
            '०': '0',
        },
        monthsParse = [
            /^जन/i,
            /^फ़र|फर/i,
            /^मार्च/i,
            /^अप्रै/i,
            /^मई/i,
            /^जून/i,
            /^जुल/i,
            /^अग/i,
            /^सितं|सित/i,
            /^अक्टू/i,
            /^नव|नवं/i,
            /^दिसं|दिस/i,
        ],
        shortMonthsParse = [
            /^जन/i,
            /^फ़र/i,
            /^मार्च/i,
            /^अप्रै/i,
            /^मई/i,
            /^जून/i,
            /^जुल/i,
            /^अग/i,
            /^सित/i,
            /^अक्टू/i,
            /^नव/i,
            /^दिस/i,
        ];

    var hi = moment.defineLocale('hi', {
        months: {
            format: 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split(
                '_'
            ),
            standalone:
                'जनवरी_फरवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितंबर_अक्टूबर_नवंबर_दिसंबर'.split(
                    '_'
                ),
        },
        monthsShort:
            'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'),
        weekdays: 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
        weekdaysShort: 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'),
        weekdaysMin: 'र_सो_मं_बु_गु_शु_श'.split('_'),
        longDateFormat: {
            LT: 'A h:mm बजे',
            LTS: 'A h:mm:ss बजे',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm बजे',
            LLLL: 'dddd, D MMMM YYYY, A h:mm बजे',
        },

        monthsParse: monthsParse,
        longMonthsParse: monthsParse,
        shortMonthsParse: shortMonthsParse,

        monthsRegex:
            /^(जनवरी|जन\.?|फ़रवरी|फरवरी|फ़र\.?|मार्च?|अप्रैल|अप्रै\.?|मई?|जून?|जुलाई|जुल\.?|अगस्त|अग\.?|सितम्बर|सितंबर|सित\.?|अक्टूबर|अक्टू\.?|नवम्बर|नवंबर|नव\.?|दिसम्बर|दिसंबर|दिस\.?)/i,

        monthsShortRegex:
            /^(जनवरी|जन\.?|फ़रवरी|फरवरी|फ़र\.?|मार्च?|अप्रैल|अप्रै\.?|मई?|जून?|जुलाई|जुल\.?|अगस्त|अग\.?|सितम्बर|सितंबर|सित\.?|अक्टूबर|अक्टू\.?|नवम्बर|नवंबर|नव\.?|दिसम्बर|दिसंबर|दिस\.?)/i,

        monthsStrictRegex:
            /^(जनवरी?|फ़रवरी|फरवरी?|मार्च?|अप्रैल?|मई?|जून?|जुलाई?|अगस्त?|सितम्बर|सितंबर|सित?\.?|अक्टूबर|अक्टू\.?|नवम्बर|नवंबर?|दिसम्बर|दिसंबर?)/i,

        monthsShortStrictRegex:
            /^(जन\.?|फ़र\.?|मार्च?|अप्रै\.?|मई?|जून?|जुल\.?|अग\.?|सित\.?|अक्टू\.?|नव\.?|दिस\.?)/i,

        calendar: {
            sameDay: '[आज] LT',
            nextDay: '[कल] LT',
            nextWeek: 'dddd, LT',
            lastDay: '[कल] LT',
            lastWeek: '[पिछले] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s में',
            past: '%s पहले',
            s: 'कुछ ही क्षण',
            ss: '%d सेकंड',
            m: 'एक मिनट',
            mm: '%d मिनट',
            h: 'एक घंटा',
            hh: '%d घंटे',
            d: 'एक दिन',
            dd: '%d दिन',
            M: 'एक महीने',
            MM: '%d महीने',
            y: 'एक वर्ष',
            yy: '%d वर्ष',
        },
        preparse: function (string) {
            return string.replace(/[१२३४५६७८९०]/g, function (match) {
                return numberMap[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap[match];
            });
        },
        // Hindi notation for meridiems are quite fuzzy in practice. While there exists
        // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.
        meridiemParse: /रात|सुबह|दोपहर|शाम/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'रात') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'सुबह') {
                return hour;
            } else if (meridiem === 'दोपहर') {
                return hour >= 10 ? hour : hour + 12;
            } else if (meridiem === 'शाम') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'रात';
            } else if (hour < 10) {
                return 'सुबह';
            } else if (hour < 17) {
                return 'दोपहर';
            } else if (hour < 20) {
                return 'शाम';
            } else {
                return 'रात';
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    return hi;

})));
//! moment.js locale configuration
//! locale : Croatian [hr]
//! author : Bojan Marković : https://github.com/bmarkovic

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    function translate(number, withoutSuffix, key) {
        var result = number + ' ';
        switch (key) {
            case 'ss':
                if (number === 1) {
                    result += 'sekunda';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'sekunde';
                } else {
                    result += 'sekundi';
                }
                return result;
            case 'm':
                return withoutSuffix ? 'jedna minuta' : 'jedne minute';
            case 'mm':
                if (number === 1) {
                    result += 'minuta';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'minute';
                } else {
                    result += 'minuta';
                }
                return result;
            case 'h':
                return withoutSuffix ? 'jedan sat' : 'jednog sata';
            case 'hh':
                if (number === 1) {
                    result += 'sat';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'sata';
                } else {
                    result += 'sati';
                }
                return result;
            case 'dd':
                if (number === 1) {
                    result += 'dan';
                } else {
                    result += 'dana';
                }
                return result;
            case 'MM':
                if (number === 1) {
                    result += 'mjesec';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'mjeseca';
                } else {
                    result += 'mjeseci';
                }
                return result;
            case 'yy':
                if (number === 1) {
                    result += 'godina';
                } else if (number === 2 || number === 3 || number === 4) {
                    result += 'godine';
                } else {
                    result += 'godina';
                }
                return result;
        }
    }

    var hr = moment.defineLocale('hr', {
        months: {
            format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split(
                '_'
            ),
            standalone:
                'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split(
                    '_'
                ),
        },
        monthsShort:
            'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split(
            '_'
        ),
        weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
        weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'Do MMMM YYYY',
            LLL: 'Do MMMM YYYY H:mm',
            LLLL: 'dddd, Do MMMM YYYY H:mm',
        },
        calendar: {
            sameDay: '[danas u] LT',
            nextDay: '[sutra u] LT',
            nextWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[u] [nedjelju] [u] LT';
                    case 3:
                        return '[u] [srijedu] [u] LT';
                    case 6:
                        return '[u] [subotu] [u] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[u] dddd [u] LT';
                }
            },
            lastDay: '[jučer u] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[prošlu] [nedjelju] [u] LT';
                    case 3:
                        return '[prošlu] [srijedu] [u] LT';
                    case 6:
                        return '[prošle] [subote] [u] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[prošli] dddd [u] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'za %s',
            past: 'prije %s',
            s: 'par sekundi',
            ss: translate,
            m: translate,
            mm: translate,
            h: translate,
            hh: translate,
            d: 'dan',
            dd: translate,
            M: 'mjesec',
            MM: translate,
            y: 'godinu',
            yy: translate,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    return hr;

})));
//! moment.js locale configuration
//! locale : Hungarian [hu]
//! author : Adam Brunner : https://github.com/adambrunner
//! author : Peter Viszt  : https://github.com/passatgt

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var weekEndings =
        'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');
    function translate(number, withoutSuffix, key, isFuture) {
        var num = number;
        switch (key) {
            case 's':
                return isFuture || withoutSuffix
                    ? 'néhány másodperc'
                    : 'néhány másodperce';
            case 'ss':
                return num + (isFuture || withoutSuffix)
                    ? ' másodperc'
                    : ' másodperce';
            case 'm':
                return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce');
            case 'mm':
                return num + (isFuture || withoutSuffix ? ' perc' : ' perce');
            case 'h':
                return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája');
            case 'hh':
                return num + (isFuture || withoutSuffix ? ' óra' : ' órája');
            case 'd':
                return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja');
            case 'dd':
                return num + (isFuture || withoutSuffix ? ' nap' : ' napja');
            case 'M':
                return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
            case 'MM':
                return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
            case 'y':
                return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve');
            case 'yy':
                return num + (isFuture || withoutSuffix ? ' év' : ' éve');
        }
        return '';
    }
    function week(isFuture) {
        return (
            (isFuture ? '' : '[múlt] ') +
            '[' +
            weekEndings[this.day()] +
            '] LT[-kor]'
        );
    }

    var hu = moment.defineLocale('hu', {
        months: 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split(
            '_'
        ),
        monthsShort:
            'jan._feb._márc._ápr._máj._jún._júl._aug._szept._okt._nov._dec.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'),
        weekdaysShort: 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'),
        weekdaysMin: 'v_h_k_sze_cs_p_szo'.split('_'),
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'YYYY.MM.DD.',
            LL: 'YYYY. MMMM D.',
            LLL: 'YYYY. MMMM D. H:mm',
            LLLL: 'YYYY. MMMM D., dddd H:mm',
        },
        meridiemParse: /de|du/i,
        isPM: function (input) {
            return input.charAt(1).toLowerCase() === 'u';
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours < 12) {
                return isLower === true ? 'de' : 'DE';
            } else {
                return isLower === true ? 'du' : 'DU';
            }
        },
        calendar: {
            sameDay: '[ma] LT[-kor]',
            nextDay: '[holnap] LT[-kor]',
            nextWeek: function () {
                return week.call(this, true);
            },
            lastDay: '[tegnap] LT[-kor]',
            lastWeek: function () {
                return week.call(this, false);
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s múlva',
            past: '%s',
            s: translate,
            ss: translate,
            m: translate,
            mm: translate,
            h: translate,
            hh: translate,
            d: translate,
            dd: translate,
            M: translate,
            MM: translate,
            y: translate,
            yy: translate,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return hu;

})));
//! moment.js locale configuration
//! locale : Armenian [hy-am]
//! author : Armendarabyan : https://github.com/armendarabyan

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var hyAm = moment.defineLocale('hy-am', {
        months: {
            format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split(
                '_'
            ),
            standalone:
                'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split(
                    '_'
                ),
        },
        monthsShort: 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'),
        weekdays:
            'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split(
                '_'
            ),
        weekdaysShort: 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
        weekdaysMin: 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY թ.',
            LLL: 'D MMMM YYYY թ., HH:mm',
            LLLL: 'dddd, D MMMM YYYY թ., HH:mm',
        },
        calendar: {
            sameDay: '[այսօր] LT',
            nextDay: '[վաղը] LT',
            lastDay: '[երեկ] LT',
            nextWeek: function () {
                return 'dddd [օրը ժամը] LT';
            },
            lastWeek: function () {
                return '[անցած] dddd [օրը ժամը] LT';
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s հետո',
            past: '%s առաջ',
            s: 'մի քանի վայրկյան',
            ss: '%d վայրկյան',
            m: 'րոպե',
            mm: '%d րոպե',
            h: 'ժամ',
            hh: '%d ժամ',
            d: 'օր',
            dd: '%d օր',
            M: 'ամիս',
            MM: '%d ամիս',
            y: 'տարի',
            yy: '%d տարի',
        },
        meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/,
        isPM: function (input) {
            return /^(ցերեկվա|երեկոյան)$/.test(input);
        },
        meridiem: function (hour) {
            if (hour < 4) {
                return 'գիշերվա';
            } else if (hour < 12) {
                return 'առավոտվա';
            } else if (hour < 17) {
                return 'ցերեկվա';
            } else {
                return 'երեկոյան';
            }
        },
        dayOfMonthOrdinalParse: /\d{1,2}|\d{1,2}-(ին|րդ)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'DDD':
                case 'w':
                case 'W':
                case 'DDDo':
                    if (number === 1) {
                        return number + '-ին';
                    }
                    return number + '-րդ';
                default:
                    return number;
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    return hyAm;

})));
//! moment.js locale configuration
//! locale : Indonesian [id]
//! author : Mohammad Satrio Utomo : https://github.com/tyok
//! reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var id = moment.defineLocale('id', {
        months: 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des'.split('_'),
        weekdays: 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'),
        weekdaysShort: 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'),
        weekdaysMin: 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'),
        longDateFormat: {
            LT: 'HH.mm',
            LTS: 'HH.mm.ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY [pukul] HH.mm',
            LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',
        },
        meridiemParse: /pagi|siang|sore|malam/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'pagi') {
                return hour;
            } else if (meridiem === 'siang') {
                return hour >= 11 ? hour : hour + 12;
            } else if (meridiem === 'sore' || meridiem === 'malam') {
                return hour + 12;
            }
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours < 11) {
                return 'pagi';
            } else if (hours < 15) {
                return 'siang';
            } else if (hours < 19) {
                return 'sore';
            } else {
                return 'malam';
            }
        },
        calendar: {
            sameDay: '[Hari ini pukul] LT',
            nextDay: '[Besok pukul] LT',
            nextWeek: 'dddd [pukul] LT',
            lastDay: '[Kemarin pukul] LT',
            lastWeek: 'dddd [lalu pukul] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'dalam %s',
            past: '%s yang lalu',
            s: 'beberapa detik',
            ss: '%d detik',
            m: 'semenit',
            mm: '%d menit',
            h: 'sejam',
            hh: '%d jam',
            d: 'sehari',
            dd: '%d hari',
            M: 'sebulan',
            MM: '%d bulan',
            y: 'setahun',
            yy: '%d tahun',
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    return id;

})));
//! moment.js locale configuration
//! locale : Icelandic [is]
//! author : Hinrik Örn Sigurðsson : https://github.com/hinrik

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    function plural(n) {
        if (n % 100 === 11) {
            return true;
        } else if (n % 10 === 1) {
            return false;
        }
        return true;
    }
    function translate(number, withoutSuffix, key, isFuture) {
        var result = number + ' ';
        switch (key) {
            case 's':
                return withoutSuffix || isFuture
                    ? 'nokkrar sekúndur'
                    : 'nokkrum sekúndum';
            case 'ss':
                if (plural(number)) {
                    return (
                        result +
                        (withoutSuffix || isFuture ? 'sekúndur' : 'sekúndum')
                    );
                }
                return result + 'sekúnda';
            case 'm':
                return withoutSuffix ? 'mínúta' : 'mínútu';
            case 'mm':
                if (plural(number)) {
                    return (
                        result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum')
                    );
                } else if (withoutSuffix) {
                    return result + 'mínúta';
                }
                return result + 'mínútu';
            case 'hh':
                if (plural(number)) {
                    return (
                        result +
                        (withoutSuffix || isFuture
                            ? 'klukkustundir'
                            : 'klukkustundum')
                    );
                }
                return result + 'klukkustund';
            case 'd':
                if (withoutSuffix) {
                    return 'dagur';
                }
                return isFuture ? 'dag' : 'degi';
            case 'dd':
                if (plural(number)) {
                    if (withoutSuffix) {
                        return result + 'dagar';
                    }
                    return result + (isFuture ? 'daga' : 'dögum');
                } else if (withoutSuffix) {
                    return result + 'dagur';
                }
                return result + (isFuture ? 'dag' : 'degi');
            case 'M':
                if (withoutSuffix) {
                    return 'mánuður';
                }
                return isFuture ? 'mánuð' : 'mánuði';
            case 'MM':
                if (plural(number)) {
                    if (withoutSuffix) {
                        return result + 'mánuðir';
                    }
                    return result + (isFuture ? 'mánuði' : 'mánuðum');
                } else if (withoutSuffix) {
                    return result + 'mánuður';
                }
                return result + (isFuture ? 'mánuð' : 'mánuði');
            case 'y':
                return withoutSuffix || isFuture ? 'ár' : 'ári';
            case 'yy':
                if (plural(number)) {
                    return result + (withoutSuffix || isFuture ? 'ár' : 'árum');
                }
                return result + (withoutSuffix || isFuture ? 'ár' : 'ári');
        }
    }

    var is = moment.defineLocale('is', {
        months: 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split(
            '_'
        ),
        monthsShort: 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'),
        weekdays:
            'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split(
                '_'
            ),
        weekdaysShort: 'sun_mán_þri_mið_fim_fös_lau'.split('_'),
        weekdaysMin: 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'),
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY [kl.] H:mm',
            LLLL: 'dddd, D. MMMM YYYY [kl.] H:mm',
        },
        calendar: {
            sameDay: '[í dag kl.] LT',
            nextDay: '[á morgun kl.] LT',
            nextWeek: 'dddd [kl.] LT',
            lastDay: '[í gær kl.] LT',
            lastWeek: '[síðasta] dddd [kl.] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'eftir %s',
            past: 'fyrir %s síðan',
            s: translate,
            ss: translate,
            m: translate,
            mm: translate,
            h: 'klukkustund',
            hh: translate,
            d: translate,
            dd: translate,
            M: translate,
            MM: translate,
            y: translate,
            yy: translate,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return is;

})));
//! moment.js locale configuration
//! locale : Italian (Switzerland) [it-ch]
//! author : xfh : https://github.com/xfh

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var itCh = moment.defineLocale('it-ch', {
        months: 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split(
            '_'
        ),
        monthsShort: 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),
        weekdays: 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split(
            '_'
        ),
        weekdaysShort: 'dom_lun_mar_mer_gio_ven_sab'.split('_'),
        weekdaysMin: 'do_lu_ma_me_gi_ve_sa'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Oggi alle] LT',
            nextDay: '[Domani alle] LT',
            nextWeek: 'dddd [alle] LT',
            lastDay: '[Ieri alle] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[la scorsa] dddd [alle] LT';
                    default:
                        return '[lo scorso] dddd [alle] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: function (s) {
                return (/^[0-9].+$/.test(s) ? 'tra' : 'in') + ' ' + s;
            },
            past: '%s fa',
            s: 'alcuni secondi',
            ss: '%d secondi',
            m: 'un minuto',
            mm: '%d minuti',
            h: "un'ora",
            hh: '%d ore',
            d: 'un giorno',
            dd: '%d giorni',
            M: 'un mese',
            MM: '%d mesi',
            y: 'un anno',
            yy: '%d anni',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return itCh;

})));
//! moment.js locale configuration
//! locale : Italian [it]
//! author : Lorenzo : https://github.com/aliem
//! author: Mattia Larentis: https://github.com/nostalgiaz
//! author: Marco : https://github.com/Manfre98

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var it = moment.defineLocale('it', {
        months: 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split(
            '_'
        ),
        monthsShort: 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),
        weekdays: 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split(
            '_'
        ),
        weekdaysShort: 'dom_lun_mar_mer_gio_ven_sab'.split('_'),
        weekdaysMin: 'do_lu_ma_me_gi_ve_sa'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: function () {
                return (
                    '[Oggi a' +
                    (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : "ll'") +
                    ']LT'
                );
            },
            nextDay: function () {
                return (
                    '[Domani a' +
                    (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : "ll'") +
                    ']LT'
                );
            },
            nextWeek: function () {
                return (
                    'dddd [a' +
                    (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : "ll'") +
                    ']LT'
                );
            },
            lastDay: function () {
                return (
                    '[Ieri a' +
                    (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : "ll'") +
                    ']LT'
                );
            },
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                        return (
                            '[La scorsa] dddd [a' +
                            (this.hours() > 1
                                ? 'lle '
                                : this.hours() === 0
                                ? ' '
                                : "ll'") +
                            ']LT'
                        );
                    default:
                        return (
                            '[Lo scorso] dddd [a' +
                            (this.hours() > 1
                                ? 'lle '
                                : this.hours() === 0
                                ? ' '
                                : "ll'") +
                            ']LT'
                        );
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'tra %s',
            past: '%s fa',
            s: 'alcuni secondi',
            ss: '%d secondi',
            m: 'un minuto',
            mm: '%d minuti',
            h: "un'ora",
            hh: '%d ore',
            d: 'un giorno',
            dd: '%d giorni',
            w: 'una settimana',
            ww: '%d settimane',
            M: 'un mese',
            MM: '%d mesi',
            y: 'un anno',
            yy: '%d anni',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return it;

})));
//! moment.js locale configuration
//! locale : Japanese [ja]
//! author : LI Long : https://github.com/baryon

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var ja = moment.defineLocale('ja', {
        eras: [
            {
                since: '2019-05-01',
                offset: 1,
                name: '令和',
                narrow: '㋿',
                abbr: 'R',
            },
            {
                since: '1989-01-08',
                until: '2019-04-30',
                offset: 1,
                name: '平成',
                narrow: '㍻',
                abbr: 'H',
            },
            {
                since: '1926-12-25',
                until: '1989-01-07',
                offset: 1,
                name: '昭和',
                narrow: '㍼',
                abbr: 'S',
            },
            {
                since: '1912-07-30',
                until: '1926-12-24',
                offset: 1,
                name: '大正',
                narrow: '㍽',
                abbr: 'T',
            },
            {
                since: '1873-01-01',
                until: '1912-07-29',
                offset: 6,
                name: '明治',
                narrow: '㍾',
                abbr: 'M',
            },
            {
                since: '0001-01-01',
                until: '1873-12-31',
                offset: 1,
                name: '西暦',
                narrow: 'AD',
                abbr: 'AD',
            },
            {
                since: '0000-12-31',
                until: -Infinity,
                offset: 1,
                name: '紀元前',
                narrow: 'BC',
                abbr: 'BC',
            },
        ],
        eraYearOrdinalRegex: /(元|\d+)年/,
        eraYearOrdinalParse: function (input, match) {
            return match[1] === '元' ? 1 : parseInt(match[1] || input, 10);
        },
        months: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
        monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(
            '_'
        ),
        weekdays: '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'),
        weekdaysShort: '日_月_火_水_木_金_土'.split('_'),
        weekdaysMin: '日_月_火_水_木_金_土'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY/MM/DD',
            LL: 'YYYY年M月D日',
            LLL: 'YYYY年M月D日 HH:mm',
            LLLL: 'YYYY年M月D日 dddd HH:mm',
            l: 'YYYY/MM/DD',
            ll: 'YYYY年M月D日',
            lll: 'YYYY年M月D日 HH:mm',
            llll: 'YYYY年M月D日(ddd) HH:mm',
        },
        meridiemParse: /午前|午後/i,
        isPM: function (input) {
            return input === '午後';
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return '午前';
            } else {
                return '午後';
            }
        },
        calendar: {
            sameDay: '[今日] LT',
            nextDay: '[明日] LT',
            nextWeek: function (now) {
                if (now.week() !== this.week()) {
                    return '[来週]dddd LT';
                } else {
                    return 'dddd LT';
                }
            },
            lastDay: '[昨日] LT',
            lastWeek: function (now) {
                if (this.week() !== now.week()) {
                    return '[先週]dddd LT';
                } else {
                    return 'dddd LT';
                }
            },
            sameElse: 'L',
        },
        dayOfMonthOrdinalParse: /\d{1,2}日/,
        ordinal: function (number, period) {
            switch (period) {
                case 'y':
                    return number === 1 ? '元年' : number + '年';
                case 'd':
                case 'D':
                case 'DDD':
                    return number + '日';
                default:
                    return number;
            }
        },
        relativeTime: {
            future: '%s後',
            past: '%s前',
            s: '数秒',
            ss: '%d秒',
            m: '1分',
            mm: '%d分',
            h: '1時間',
            hh: '%d時間',
            d: '1日',
            dd: '%d日',
            M: '1ヶ月',
            MM: '%dヶ月',
            y: '1年',
            yy: '%d年',
        },
    });

    return ja;

})));
//! moment.js locale configuration
//! locale : Javanese [jv]
//! author : Rony Lantip : https://github.com/lantip
//! reference: http://jv.wikipedia.org/wiki/Basa_Jawa

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var jv = moment.defineLocale('jv', {
        months: 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'),
        weekdays: 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'),
        weekdaysShort: 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'),
        weekdaysMin: 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'),
        longDateFormat: {
            LT: 'HH.mm',
            LTS: 'HH.mm.ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY [pukul] HH.mm',
            LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',
        },
        meridiemParse: /enjing|siyang|sonten|ndalu/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'enjing') {
                return hour;
            } else if (meridiem === 'siyang') {
                return hour >= 11 ? hour : hour + 12;
            } else if (meridiem === 'sonten' || meridiem === 'ndalu') {
                return hour + 12;
            }
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours < 11) {
                return 'enjing';
            } else if (hours < 15) {
                return 'siyang';
            } else if (hours < 19) {
                return 'sonten';
            } else {
                return 'ndalu';
            }
        },
        calendar: {
            sameDay: '[Dinten puniko pukul] LT',
            nextDay: '[Mbenjang pukul] LT',
            nextWeek: 'dddd [pukul] LT',
            lastDay: '[Kala wingi pukul] LT',
            lastWeek: 'dddd [kepengker pukul] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'wonten ing %s',
            past: '%s ingkang kepengker',
            s: 'sawetawis detik',
            ss: '%d detik',
            m: 'setunggal menit',
            mm: '%d menit',
            h: 'setunggal jam',
            hh: '%d jam',
            d: 'sedinten',
            dd: '%d dinten',
            M: 'sewulan',
            MM: '%d wulan',
            y: 'setaun',
            yy: '%d taun',
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    return jv;

})));
//! moment.js locale configuration
//! locale : Georgian [ka]
//! author : Irakli Janiashvili : https://github.com/IrakliJani

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var ka = moment.defineLocale('ka', {
        months: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split(
            '_'
        ),
        monthsShort: 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'),
        weekdays: {
            standalone:
                'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split(
                    '_'
                ),
            format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split(
                '_'
            ),
            isFormat: /(წინა|შემდეგ)/,
        },
        weekdaysShort: 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'),
        weekdaysMin: 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[დღეს] LT[-ზე]',
            nextDay: '[ხვალ] LT[-ზე]',
            lastDay: '[გუშინ] LT[-ზე]',
            nextWeek: '[შემდეგ] dddd LT[-ზე]',
            lastWeek: '[წინა] dddd LT-ზე',
            sameElse: 'L',
        },
        relativeTime: {
            future: function (s) {
                return s.replace(
                    /(წამ|წუთ|საათ|წელ|დღ|თვ)(ი|ე)/,
                    function ($0, $1, $2) {
                        return $2 === 'ი' ? $1 + 'ში' : $1 + $2 + 'ში';
                    }
                );
            },
            past: function (s) {
                if (/(წამი|წუთი|საათი|დღე|თვე)/.test(s)) {
                    return s.replace(/(ი|ე)$/, 'ის წინ');
                }
                if (/წელი/.test(s)) {
                    return s.replace(/წელი$/, 'წლის წინ');
                }
                return s;
            },
            s: 'რამდენიმე წამი',
            ss: '%d წამი',
            m: 'წუთი',
            mm: '%d წუთი',
            h: 'საათი',
            hh: '%d საათი',
            d: 'დღე',
            dd: '%d დღე',
            M: 'თვე',
            MM: '%d თვე',
            y: 'წელი',
            yy: '%d წელი',
        },
        dayOfMonthOrdinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,
        ordinal: function (number) {
            if (number === 0) {
                return number;
            }
            if (number === 1) {
                return number + '-ლი';
            }
            if (
                number < 20 ||
                (number <= 100 && number % 20 === 0) ||
                number % 100 === 0
            ) {
                return 'მე-' + number;
            }
            return number + '-ე';
        },
        week: {
            dow: 1,
            doy: 7,
        },
    });

    return ka;

})));
//! moment.js locale configuration
//! locale : Kazakh [kk]
//! authors : Nurlan Rakhimzhanov : https://github.com/nurlan

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var suffixes = {
        0: '-ші',
        1: '-ші',
        2: '-ші',
        3: '-ші',
        4: '-ші',
        5: '-ші',
        6: '-шы',
        7: '-ші',
        8: '-ші',
        9: '-шы',
        10: '-шы',
        20: '-шы',
        30: '-шы',
        40: '-шы',
        50: '-ші',
        60: '-шы',
        70: '-ші',
        80: '-ші',
        90: '-шы',
        100: '-ші',
    };

    var kk = moment.defineLocale('kk', {
        months: 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split(
            '_'
        ),
        monthsShort: 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'),
        weekdays: 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split(
            '_'
        ),
        weekdaysShort: 'жек_дүй_сей_сәр_бей_жұм_сен'.split('_'),
        weekdaysMin: 'жк_дй_сй_ср_бй_жм_сн'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Бүгін сағат] LT',
            nextDay: '[Ертең сағат] LT',
            nextWeek: 'dddd [сағат] LT',
            lastDay: '[Кеше сағат] LT',
            lastWeek: '[Өткен аптаның] dddd [сағат] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s ішінде',
            past: '%s бұрын',
            s: 'бірнеше секунд',
            ss: '%d секунд',
            m: 'бір минут',
            mm: '%d минут',
            h: 'бір сағат',
            hh: '%d сағат',
            d: 'бір күн',
            dd: '%d күн',
            M: 'бір ай',
            MM: '%d ай',
            y: 'бір жыл',
            yy: '%d жыл',
        },
        dayOfMonthOrdinalParse: /\d{1,2}-(ші|шы)/,
        ordinal: function (number) {
            var a = number % 10,
                b = number >= 100 ? 100 : null;
            return number + (suffixes[number] || suffixes[a] || suffixes[b]);
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    return kk;

})));
//! moment.js locale configuration
//! locale : Cambodian [km]
//! author : Kruy Vanna : https://github.com/kruyvanna

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var symbolMap = {
            1: '១',
            2: '២',
            3: '៣',
            4: '៤',
            5: '៥',
            6: '៦',
            7: '៧',
            8: '៨',
            9: '៩',
            0: '០',
        },
        numberMap = {
            '១': '1',
            '២': '2',
            '៣': '3',
            '៤': '4',
            '៥': '5',
            '៦': '6',
            '៧': '7',
            '៨': '8',
            '៩': '9',
            '០': '0',
        };

    var km = moment.defineLocale('km', {
        months: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split(
            '_'
        ),
        monthsShort:
            'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split(
                '_'
            ),
        weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
        weekdaysShort: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'),
        weekdaysMin: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        meridiemParse: /ព្រឹក|ល្ងាច/,
        isPM: function (input) {
            return input === 'ល្ងាច';
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'ព្រឹក';
            } else {
                return 'ល្ងាច';
            }
        },
        calendar: {
            sameDay: '[ថ្ងៃនេះ ម៉ោង] LT',
            nextDay: '[ស្អែក ម៉ោង] LT',
            nextWeek: 'dddd [ម៉ោង] LT',
            lastDay: '[ម្សិលមិញ ម៉ោង] LT',
            lastWeek: 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%sទៀត',
            past: '%sមុន',
            s: 'ប៉ុន្មានវិនាទី',
            ss: '%d វិនាទី',
            m: 'មួយនាទី',
            mm: '%d នាទី',
            h: 'មួយម៉ោង',
            hh: '%d ម៉ោង',
            d: 'មួយថ្ងៃ',
            dd: '%d ថ្ងៃ',
            M: 'មួយខែ',
            MM: '%d ខែ',
            y: 'មួយឆ្នាំ',
            yy: '%d ឆ្នាំ',
        },
        dayOfMonthOrdinalParse: /ទី\d{1,2}/,
        ordinal: 'ទី%d',
        preparse: function (string) {
            return string.replace(/[១២៣៤៥៦៧៨៩០]/g, function (match) {
                return numberMap[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap[match];
            });
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return km;

})));
//! moment.js locale configuration
//! locale : Kannada [kn]
//! author : Rajeev Naik : https://github.com/rajeevnaikte

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var symbolMap = {
            1: '೧',
            2: '೨',
            3: '೩',
            4: '೪',
            5: '೫',
            6: '೬',
            7: '೭',
            8: '೮',
            9: '೯',
            0: '೦',
        },
        numberMap = {
            '೧': '1',
            '೨': '2',
            '೩': '3',
            '೪': '4',
            '೫': '5',
            '೬': '6',
            '೭': '7',
            '೮': '8',
            '೯': '9',
            '೦': '0',
        };

    var kn = moment.defineLocale('kn', {
        months: 'ಜನವರಿ_ಫೆಬ್ರವರಿ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬರ್_ಅಕ್ಟೋಬರ್_ನವೆಂಬರ್_ಡಿಸೆಂಬರ್'.split(
            '_'
        ),
        monthsShort:
            'ಜನ_ಫೆಬ್ರ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂ_ಅಕ್ಟೋ_ನವೆಂ_ಡಿಸೆಂ'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'ಭಾನುವಾರ_ಸೋಮವಾರ_ಮಂಗಳವಾರ_ಬುಧವಾರ_ಗುರುವಾರ_ಶುಕ್ರವಾರ_ಶನಿವಾರ'.split(
            '_'
        ),
        weekdaysShort: 'ಭಾನು_ಸೋಮ_ಮಂಗಳ_ಬುಧ_ಗುರು_ಶುಕ್ರ_ಶನಿ'.split('_'),
        weekdaysMin: 'ಭಾ_ಸೋ_ಮಂ_ಬು_ಗು_ಶು_ಶ'.split('_'),
        longDateFormat: {
            LT: 'A h:mm',
            LTS: 'A h:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm',
            LLLL: 'dddd, D MMMM YYYY, A h:mm',
        },
        calendar: {
            sameDay: '[ಇಂದು] LT',
            nextDay: '[ನಾಳೆ] LT',
            nextWeek: 'dddd, LT',
            lastDay: '[ನಿನ್ನೆ] LT',
            lastWeek: '[ಕೊನೆಯ] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s ನಂತರ',
            past: '%s ಹಿಂದೆ',
            s: 'ಕೆಲವು ಕ್ಷಣಗಳು',
            ss: '%d ಸೆಕೆಂಡುಗಳು',
            m: 'ಒಂದು ನಿಮಿಷ',
            mm: '%d ನಿಮಿಷ',
            h: 'ಒಂದು ಗಂಟೆ',
            hh: '%d ಗಂಟೆ',
            d: 'ಒಂದು ದಿನ',
            dd: '%d ದಿನ',
            M: 'ಒಂದು ತಿಂಗಳು',
            MM: '%d ತಿಂಗಳು',
            y: 'ಒಂದು ವರ್ಷ',
            yy: '%d ವರ್ಷ',
        },
        preparse: function (string) {
            return string.replace(/[೧೨೩೪೫೬೭೮೯೦]/g, function (match) {
                return numberMap[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap[match];
            });
        },
        meridiemParse: /ರಾತ್ರಿ|ಬೆಳಿಗ್ಗೆ|ಮಧ್ಯಾಹ್ನ|ಸಂಜೆ/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'ರಾತ್ರಿ') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'ಬೆಳಿಗ್ಗೆ') {
                return hour;
            } else if (meridiem === 'ಮಧ್ಯಾಹ್ನ') {
                return hour >= 10 ? hour : hour + 12;
            } else if (meridiem === 'ಸಂಜೆ') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'ರಾತ್ರಿ';
            } else if (hour < 10) {
                return 'ಬೆಳಿಗ್ಗೆ';
            } else if (hour < 17) {
                return 'ಮಧ್ಯಾಹ್ನ';
            } else if (hour < 20) {
                return 'ಸಂಜೆ';
            } else {
                return 'ರಾತ್ರಿ';
            }
        },
        dayOfMonthOrdinalParse: /\d{1,2}(ನೇ)/,
        ordinal: function (number) {
            return number + 'ನೇ';
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    return kn;

})));
//! moment.js locale configuration
//! locale : Korean [ko]
//! author : Kyungwook, Park : https://github.com/kyungw00k
//! author : Jeeeyul Lee <jeeeyul@gmail.com>

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var ko = moment.defineLocale('ko', {
        months: '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),
        monthsShort: '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split(
            '_'
        ),
        weekdays: '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'),
        weekdaysShort: '일_월_화_수_목_금_토'.split('_'),
        weekdaysMin: '일_월_화_수_목_금_토'.split('_'),
        longDateFormat: {
            LT: 'A h:mm',
            LTS: 'A h:mm:ss',
            L: 'YYYY.MM.DD.',
            LL: 'YYYY년 MMMM D일',
            LLL: 'YYYY년 MMMM D일 A h:mm',
            LLLL: 'YYYY년 MMMM D일 dddd A h:mm',
            l: 'YYYY.MM.DD.',
            ll: 'YYYY년 MMMM D일',
            lll: 'YYYY년 MMMM D일 A h:mm',
            llll: 'YYYY년 MMMM D일 dddd A h:mm',
        },
        calendar: {
            sameDay: '오늘 LT',
            nextDay: '내일 LT',
            nextWeek: 'dddd LT',
            lastDay: '어제 LT',
            lastWeek: '지난주 dddd LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s 후',
            past: '%s 전',
            s: '몇 초',
            ss: '%d초',
            m: '1분',
            mm: '%d분',
            h: '한 시간',
            hh: '%d시간',
            d: '하루',
            dd: '%d일',
            M: '한 달',
            MM: '%d달',
            y: '일 년',
            yy: '%d년',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(일|월|주)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'd':
                case 'D':
                case 'DDD':
                    return number + '일';
                case 'M':
                    return number + '월';
                case 'w':
                case 'W':
                    return number + '주';
                default:
                    return number;
            }
        },
        meridiemParse: /오전|오후/,
        isPM: function (token) {
            return token === '오후';
        },
        meridiem: function (hour, minute, isUpper) {
            return hour < 12 ? '오전' : '오후';
        },
    });

    return ko;

})));
//! moment.js locale configuration
//! locale : Kurdish [ku]
//! author : Shahram Mebashar : https://github.com/ShahramMebashar

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var symbolMap = {
            1: '١',
            2: '٢',
            3: '٣',
            4: '٤',
            5: '٥',
            6: '٦',
            7: '٧',
            8: '٨',
            9: '٩',
            0: '٠',
        },
        numberMap = {
            '١': '1',
            '٢': '2',
            '٣': '3',
            '٤': '4',
            '٥': '5',
            '٦': '6',
            '٧': '7',
            '٨': '8',
            '٩': '9',
            '٠': '0',
        },
        months = [
            'کانونی دووەم',
            'شوبات',
            'ئازار',
            'نیسان',
            'ئایار',
            'حوزەیران',
            'تەمموز',
            'ئاب',
            'ئەیلوول',
            'تشرینی یەكەم',
            'تشرینی دووەم',
            'كانونی یەکەم',
        ];

    var ku = moment.defineLocale('ku', {
        months: months,
        monthsShort: months,
        weekdays:
            'یه‌كشه‌ممه‌_دووشه‌ممه‌_سێشه‌ممه‌_چوارشه‌ممه‌_پێنجشه‌ممه‌_هه‌ینی_شه‌ممه‌'.split(
                '_'
            ),
        weekdaysShort:
            'یه‌كشه‌م_دووشه‌م_سێشه‌م_چوارشه‌م_پێنجشه‌م_هه‌ینی_شه‌ممه‌'.split('_'),
        weekdaysMin: 'ی_د_س_چ_پ_ه_ش'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        meridiemParse: /ئێواره‌|به‌یانی/,
        isPM: function (input) {
            return /ئێواره‌/.test(input);
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'به‌یانی';
            } else {
                return 'ئێواره‌';
            }
        },
        calendar: {
            sameDay: '[ئه‌مرۆ كاتژمێر] LT',
            nextDay: '[به‌یانی كاتژمێر] LT',
            nextWeek: 'dddd [كاتژمێر] LT',
            lastDay: '[دوێنێ كاتژمێر] LT',
            lastWeek: 'dddd [كاتژمێر] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'له‌ %s',
            past: '%s',
            s: 'چه‌ند چركه‌یه‌ك',
            ss: 'چركه‌ %d',
            m: 'یه‌ك خوله‌ك',
            mm: '%d خوله‌ك',
            h: 'یه‌ك كاتژمێر',
            hh: '%d كاتژمێر',
            d: 'یه‌ك ڕۆژ',
            dd: '%d ڕۆژ',
            M: 'یه‌ك مانگ',
            MM: '%d مانگ',
            y: 'یه‌ك ساڵ',
            yy: '%d ساڵ',
        },
        preparse: function (string) {
            return string
                .replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
                    return numberMap[match];
                })
                .replace(/،/g, ',');
        },
        postformat: function (string) {
            return string
                .replace(/\d/g, function (match) {
                    return symbolMap[match];
                })
                .replace(/,/g, '،');
        },
        week: {
            dow: 6, // Saturday is the first day of the week.
            doy: 12, // The week that contains Jan 12th is the first week of the year.
        },
    });

    return ku;

})));
//! moment.js locale configuration
//! locale : Kyrgyz [ky]
//! author : Chyngyz Arystan uulu : https://github.com/chyngyz

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var suffixes = {
        0: '-чү',
        1: '-чи',
        2: '-чи',
        3: '-чү',
        4: '-чү',
        5: '-чи',
        6: '-чы',
        7: '-чи',
        8: '-чи',
        9: '-чу',
        10: '-чу',
        20: '-чы',
        30: '-чу',
        40: '-чы',
        50: '-чү',
        60: '-чы',
        70: '-чи',
        80: '-чи',
        90: '-чу',
        100: '-чү',
    };

    var ky = moment.defineLocale('ky', {
        months: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split(
            '_'
        ),
        monthsShort: 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split(
            '_'
        ),
        weekdays: 'Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби'.split(
            '_'
        ),
        weekdaysShort: 'Жек_Дүй_Шей_Шар_Бей_Жум_Ише'.split('_'),
        weekdaysMin: 'Жк_Дй_Шй_Шр_Бй_Жм_Иш'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Бүгүн саат] LT',
            nextDay: '[Эртең саат] LT',
            nextWeek: 'dddd [саат] LT',
            lastDay: '[Кечээ саат] LT',
            lastWeek: '[Өткөн аптанын] dddd [күнү] [саат] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s ичинде',
            past: '%s мурун',
            s: 'бирнече секунд',
            ss: '%d секунд',
            m: 'бир мүнөт',
            mm: '%d мүнөт',
            h: 'бир саат',
            hh: '%d саат',
            d: 'бир күн',
            dd: '%d күн',
            M: 'бир ай',
            MM: '%d ай',
            y: 'бир жыл',
            yy: '%d жыл',
        },
        dayOfMonthOrdinalParse: /\d{1,2}-(чи|чы|чү|чу)/,
        ordinal: function (number) {
            var a = number % 10,
                b = number >= 100 ? 100 : null;
            return number + (suffixes[number] || suffixes[a] || suffixes[b]);
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    return ky;

})));
//! moment.js locale configuration
//! locale : Luxembourgish [lb]
//! author : mweimerskirch : https://github.com/mweimerskirch
//! author : David Raison : https://github.com/kwisatz

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    function processRelativeTime(number, withoutSuffix, key, isFuture) {
        var format = {
            m: ['eng Minutt', 'enger Minutt'],
            h: ['eng Stonn', 'enger Stonn'],
            d: ['een Dag', 'engem Dag'],
            M: ['ee Mount', 'engem Mount'],
            y: ['ee Joer', 'engem Joer'],
        };
        return withoutSuffix ? format[key][0] : format[key][1];
    }
    function processFutureTime(string) {
        var number = string.substr(0, string.indexOf(' '));
        if (eifelerRegelAppliesToNumber(number)) {
            return 'a ' + string;
        }
        return 'an ' + string;
    }
    function processPastTime(string) {
        var number = string.substr(0, string.indexOf(' '));
        if (eifelerRegelAppliesToNumber(number)) {
            return 'viru ' + string;
        }
        return 'virun ' + string;
    }
    /**
     * Returns true if the word before the given number loses the '-n' ending.
     * e.g. 'an 10 Deeg' but 'a 5 Deeg'
     *
     * @param number {integer}
     * @returns {boolean}
     */
    function eifelerRegelAppliesToNumber(number) {
        number = parseInt(number, 10);
        if (isNaN(number)) {
            return false;
        }
        if (number < 0) {
            // Negative Number --> always true
            return true;
        } else if (number < 10) {
            // Only 1 digit
            if (4 <= number && number <= 7) {
                return true;
            }
            return false;
        } else if (number < 100) {
            // 2 digits
            var lastDigit = number % 10,
                firstDigit = number / 10;
            if (lastDigit === 0) {
                return eifelerRegelAppliesToNumber(firstDigit);
            }
            return eifelerRegelAppliesToNumber(lastDigit);
        } else if (number < 10000) {
            // 3 or 4 digits --> recursively check first digit
            while (number >= 10) {
                number = number / 10;
            }
            return eifelerRegelAppliesToNumber(number);
        } else {
            // Anything larger than 4 digits: recursively check first n-3 digits
            number = number / 1000;
            return eifelerRegelAppliesToNumber(number);
        }
    }

    var lb = moment.defineLocale('lb', {
        months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split(
            '_'
        ),
        monthsShort:
            'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays:
            'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split(
                '_'
            ),
        weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'),
        weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm [Auer]',
            LTS: 'H:mm:ss [Auer]',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY H:mm [Auer]',
            LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]',
        },
        calendar: {
            sameDay: '[Haut um] LT',
            sameElse: 'L',
            nextDay: '[Muer um] LT',
            nextWeek: 'dddd [um] LT',
            lastDay: '[Gëschter um] LT',
            lastWeek: function () {
                // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule
                switch (this.day()) {
                    case 2:
                    case 4:
                        return '[Leschten] dddd [um] LT';
                    default:
                        return '[Leschte] dddd [um] LT';
                }
            },
        },
        relativeTime: {
            future: processFutureTime,
            past: processPastTime,
            s: 'e puer Sekonnen',
            ss: '%d Sekonnen',
            m: processRelativeTime,
            mm: '%d Minutten',
            h: processRelativeTime,
            hh: '%d Stonnen',
            d: processRelativeTime,
            dd: '%d Deeg',
            M: processRelativeTime,
            MM: '%d Méint',
            y: processRelativeTime,
            yy: '%d Joer',
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return lb;

})));
//! moment.js locale configuration
//! locale : Lao [lo]
//! author : Ryan Hart : https://github.com/ryanhart2

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var lo = moment.defineLocale('lo', {
        months: 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split(
            '_'
        ),
        monthsShort:
            'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split(
                '_'
            ),
        weekdays: 'ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),
        weekdaysShort: 'ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),
        weekdaysMin: 'ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'ວັນdddd D MMMM YYYY HH:mm',
        },
        meridiemParse: /ຕອນເຊົ້າ|ຕອນແລງ/,
        isPM: function (input) {
            return input === 'ຕອນແລງ';
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'ຕອນເຊົ້າ';
            } else {
                return 'ຕອນແລງ';
            }
        },
        calendar: {
            sameDay: '[ມື້ນີ້ເວລາ] LT',
            nextDay: '[ມື້ອື່ນເວລາ] LT',
            nextWeek: '[ວັນ]dddd[ໜ້າເວລາ] LT',
            lastDay: '[ມື້ວານນີ້ເວລາ] LT',
            lastWeek: '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'ອີກ %s',
            past: '%sຜ່ານມາ',
            s: 'ບໍ່ເທົ່າໃດວິນາທີ',
            ss: '%d ວິນາທີ',
            m: '1 ນາທີ',
            mm: '%d ນາທີ',
            h: '1 ຊົ່ວໂມງ',
            hh: '%d ຊົ່ວໂມງ',
            d: '1 ມື້',
            dd: '%d ມື້',
            M: '1 ເດືອນ',
            MM: '%d ເດືອນ',
            y: '1 ປີ',
            yy: '%d ປີ',
        },
        dayOfMonthOrdinalParse: /(ທີ່)\d{1,2}/,
        ordinal: function (number) {
            return 'ທີ່' + number;
        },
    });

    return lo;

})));
//! moment.js locale configuration
//! locale : Lithuanian [lt]
//! author : Mindaugas Mozūras : https://github.com/mmozuras

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var units = {
        ss: 'sekundė_sekundžių_sekundes',
        m: 'minutė_minutės_minutę',
        mm: 'minutės_minučių_minutes',
        h: 'valanda_valandos_valandą',
        hh: 'valandos_valandų_valandas',
        d: 'diena_dienos_dieną',
        dd: 'dienos_dienų_dienas',
        M: 'mėnuo_mėnesio_mėnesį',
        MM: 'mėnesiai_mėnesių_mėnesius',
        y: 'metai_metų_metus',
        yy: 'metai_metų_metus',
    };
    function translateSeconds(number, withoutSuffix, key, isFuture) {
        if (withoutSuffix) {
            return 'kelios sekundės';
        } else {
            return isFuture ? 'kelių sekundžių' : 'kelias sekundes';
        }
    }
    function translateSingular(number, withoutSuffix, key, isFuture) {
        return withoutSuffix
            ? forms(key)[0]
            : isFuture
            ? forms(key)[1]
            : forms(key)[2];
    }
    function special(number) {
        return number % 10 === 0 || (number > 10 && number < 20);
    }
    function forms(key) {
        return units[key].split('_');
    }
    function translate(number, withoutSuffix, key, isFuture) {
        var result = number + ' ';
        if (number === 1) {
            return (
                result + translateSingular(number, withoutSuffix, key[0], isFuture)
            );
        } else if (withoutSuffix) {
            return result + (special(number) ? forms(key)[1] : forms(key)[0]);
        } else {
            if (isFuture) {
                return result + forms(key)[1];
            } else {
                return result + (special(number) ? forms(key)[1] : forms(key)[2]);
            }
        }
    }
    var lt = moment.defineLocale('lt', {
        months: {
            format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split(
                '_'
            ),
            standalone:
                'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split(
                    '_'
                ),
            isFormat: /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/,
        },
        monthsShort: 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'),
        weekdays: {
            format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split(
                '_'
            ),
            standalone:
                'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split(
                    '_'
                ),
            isFormat: /dddd HH:mm/,
        },
        weekdaysShort: 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'),
        weekdaysMin: 'S_P_A_T_K_Pn_Š'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY-MM-DD',
            LL: 'YYYY [m.] MMMM D [d.]',
            LLL: 'YYYY [m.] MMMM D [d.], HH:mm [val.]',
            LLLL: 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]',
            l: 'YYYY-MM-DD',
            ll: 'YYYY [m.] MMMM D [d.]',
            lll: 'YYYY [m.] MMMM D [d.], HH:mm [val.]',
            llll: 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]',
        },
        calendar: {
            sameDay: '[Šiandien] LT',
            nextDay: '[Rytoj] LT',
            nextWeek: 'dddd LT',
            lastDay: '[Vakar] LT',
            lastWeek: '[Praėjusį] dddd LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'po %s',
            past: 'prieš %s',
            s: translateSeconds,
            ss: translate,
            m: translateSingular,
            mm: translate,
            h: translateSingular,
            hh: translate,
            d: translateSingular,
            dd: translate,
            M: translateSingular,
            MM: translate,
            y: translateSingular,
            yy: translate,
        },
        dayOfMonthOrdinalParse: /\d{1,2}-oji/,
        ordinal: function (number) {
            return number + '-oji';
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return lt;

})));
//! moment.js locale configuration
//! locale : Latvian [lv]
//! author : Kristaps Karlsons : https://github.com/skakri
//! author : Jānis Elmeris : https://github.com/JanisE

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var units = {
        ss: 'sekundes_sekundēm_sekunde_sekundes'.split('_'),
        m: 'minūtes_minūtēm_minūte_minūtes'.split('_'),
        mm: 'minūtes_minūtēm_minūte_minūtes'.split('_'),
        h: 'stundas_stundām_stunda_stundas'.split('_'),
        hh: 'stundas_stundām_stunda_stundas'.split('_'),
        d: 'dienas_dienām_diena_dienas'.split('_'),
        dd: 'dienas_dienām_diena_dienas'.split('_'),
        M: 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),
        MM: 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),
        y: 'gada_gadiem_gads_gadi'.split('_'),
        yy: 'gada_gadiem_gads_gadi'.split('_'),
    };
    /**
     * @param withoutSuffix boolean true = a length of time; false = before/after a period of time.
     */
    function format(forms, number, withoutSuffix) {
        if (withoutSuffix) {
            // E.g. "21 minūte", "3 minūtes".
            return number % 10 === 1 && number % 100 !== 11 ? forms[2] : forms[3];
        } else {
            // E.g. "21 minūtes" as in "pēc 21 minūtes".
            // E.g. "3 minūtēm" as in "pēc 3 minūtēm".
            return number % 10 === 1 && number % 100 !== 11 ? forms[0] : forms[1];
        }
    }
    function relativeTimeWithPlural(number, withoutSuffix, key) {
        return number + ' ' + format(units[key], number, withoutSuffix);
    }
    function relativeTimeWithSingular(number, withoutSuffix, key) {
        return format(units[key], number, withoutSuffix);
    }
    function relativeSeconds(number, withoutSuffix) {
        return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm';
    }

    var lv = moment.defineLocale('lv', {
        months: 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split(
            '_'
        ),
        monthsShort: 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'),
        weekdays:
            'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split(
                '_'
            ),
        weekdaysShort: 'Sv_P_O_T_C_Pk_S'.split('_'),
        weekdaysMin: 'Sv_P_O_T_C_Pk_S'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY.',
            LL: 'YYYY. [gada] D. MMMM',
            LLL: 'YYYY. [gada] D. MMMM, HH:mm',
            LLLL: 'YYYY. [gada] D. MMMM, dddd, HH:mm',
        },
        calendar: {
            sameDay: '[Šodien pulksten] LT',
            nextDay: '[Rīt pulksten] LT',
            nextWeek: 'dddd [pulksten] LT',
            lastDay: '[Vakar pulksten] LT',
            lastWeek: '[Pagājušā] dddd [pulksten] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'pēc %s',
            past: 'pirms %s',
            s: relativeSeconds,
            ss: relativeTimeWithPlural,
            m: relativeTimeWithSingular,
            mm: relativeTimeWithPlural,
            h: relativeTimeWithSingular,
            hh: relativeTimeWithPlural,
            d: relativeTimeWithSingular,
            dd: relativeTimeWithPlural,
            M: relativeTimeWithSingular,
            MM: relativeTimeWithPlural,
            y: relativeTimeWithSingular,
            yy: relativeTimeWithPlural,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return lv;

})));
//! moment.js locale configuration
//! locale : Montenegrin [me]
//! author : Miodrag Nikač <miodrag@restartit.me> : https://github.com/miodragnikac

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var translator = {
        words: {
            //Different grammatical cases
            ss: ['sekund', 'sekunda', 'sekundi'],
            m: ['jedan minut', 'jednog minuta'],
            mm: ['minut', 'minuta', 'minuta'],
            h: ['jedan sat', 'jednog sata'],
            hh: ['sat', 'sata', 'sati'],
            dd: ['dan', 'dana', 'dana'],
            MM: ['mjesec', 'mjeseca', 'mjeseci'],
            yy: ['godina', 'godine', 'godina'],
        },
        correctGrammaticalCase: function (number, wordKey) {
            return number === 1
                ? wordKey[0]
                : number >= 2 && number <= 4
                ? wordKey[1]
                : wordKey[2];
        },
        translate: function (number, withoutSuffix, key) {
            var wordKey = translator.words[key];
            if (key.length === 1) {
                return withoutSuffix ? wordKey[0] : wordKey[1];
            } else {
                return (
                    number +
                    ' ' +
                    translator.correctGrammaticalCase(number, wordKey)
                );
            }
        },
    };

    var me = moment.defineLocale('me', {
        months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split(
            '_'
        ),
        monthsShort:
            'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),
        monthsParseExact: true,
        weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split(
            '_'
        ),
        weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
        weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY H:mm',
            LLLL: 'dddd, D. MMMM YYYY H:mm',
        },
        calendar: {
            sameDay: '[danas u] LT',
            nextDay: '[sjutra u] LT',

            nextWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[u] [nedjelju] [u] LT';
                    case 3:
                        return '[u] [srijedu] [u] LT';
                    case 6:
                        return '[u] [subotu] [u] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[u] dddd [u] LT';
                }
            },
            lastDay: '[juče u] LT',
            lastWeek: function () {
                var lastWeekDays = [
                    '[prošle] [nedjelje] [u] LT',
                    '[prošlog] [ponedjeljka] [u] LT',
                    '[prošlog] [utorka] [u] LT',
                    '[prošle] [srijede] [u] LT',
                    '[prošlog] [četvrtka] [u] LT',
                    '[prošlog] [petka] [u] LT',
                    '[prošle] [subote] [u] LT',
                ];
                return lastWeekDays[this.day()];
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'za %s',
            past: 'prije %s',
            s: 'nekoliko sekundi',
            ss: translator.translate,
            m: translator.translate,
            mm: translator.translate,
            h: translator.translate,
            hh: translator.translate,
            d: 'dan',
            dd: translator.translate,
            M: 'mjesec',
            MM: translator.translate,
            y: 'godinu',
            yy: translator.translate,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    return me;

})));
//! moment.js locale configuration
//! locale : Maori [mi]
//! author : John Corrigan <robbiecloset@gmail.com> : https://github.com/johnideal

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var mi = moment.defineLocale('mi', {
        months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split(
            '_'
        ),
        monthsShort:
            'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split(
                '_'
            ),
        monthsRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
        monthsStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
        monthsShortRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
        monthsShortStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,
        weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'),
        weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),
        weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY [i] HH:mm',
            LLLL: 'dddd, D MMMM YYYY [i] HH:mm',
        },
        calendar: {
            sameDay: '[i teie mahana, i] LT',
            nextDay: '[apopo i] LT',
            nextWeek: 'dddd [i] LT',
            lastDay: '[inanahi i] LT',
            lastWeek: 'dddd [whakamutunga i] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'i roto i %s',
            past: '%s i mua',
            s: 'te hēkona ruarua',
            ss: '%d hēkona',
            m: 'he meneti',
            mm: '%d meneti',
            h: 'te haora',
            hh: '%d haora',
            d: 'he ra',
            dd: '%d ra',
            M: 'he marama',
            MM: '%d marama',
            y: 'he tau',
            yy: '%d tau',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return mi;

})));
//! moment.js locale configuration
//! locale : Macedonian [mk]
//! author : Borislav Mickov : https://github.com/B0k0
//! author : Sashko Todorov : https://github.com/bkyceh

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var mk = moment.defineLocale('mk', {
        months: 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split(
            '_'
        ),
        monthsShort: 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'),
        weekdays: 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split(
            '_'
        ),
        weekdaysShort: 'нед_пон_вто_сре_чет_пет_саб'.split('_'),
        weekdaysMin: 'нe_пo_вт_ср_че_пе_сa'.split('_'),
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'D.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY H:mm',
            LLLL: 'dddd, D MMMM YYYY H:mm',
        },
        calendar: {
            sameDay: '[Денес во] LT',
            nextDay: '[Утре во] LT',
            nextWeek: '[Во] dddd [во] LT',
            lastDay: '[Вчера во] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                    case 3:
                    case 6:
                        return '[Изминатата] dddd [во] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[Изминатиот] dddd [во] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'за %s',
            past: 'пред %s',
            s: 'неколку секунди',
            ss: '%d секунди',
            m: 'една минута',
            mm: '%d минути',
            h: 'еден час',
            hh: '%d часа',
            d: 'еден ден',
            dd: '%d дена',
            M: 'еден месец',
            MM: '%d месеци',
            y: 'една година',
            yy: '%d години',
        },
        dayOfMonthOrdinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/,
        ordinal: function (number) {
            var lastDigit = number % 10,
                last2Digits = number % 100;
            if (number === 0) {
                return number + '-ев';
            } else if (last2Digits === 0) {
                return number + '-ен';
            } else if (last2Digits > 10 && last2Digits < 20) {
                return number + '-ти';
            } else if (lastDigit === 1) {
                return number + '-ви';
            } else if (lastDigit === 2) {
                return number + '-ри';
            } else if (lastDigit === 7 || lastDigit === 8) {
                return number + '-ми';
            } else {
                return number + '-ти';
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    return mk;

})));
//! moment.js locale configuration
//! locale : Malayalam [ml]
//! author : Floyd Pink : https://github.com/floydpink

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var ml = moment.defineLocale('ml', {
        months: 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split(
            '_'
        ),
        monthsShort:
            'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays:
            'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split(
                '_'
            ),
        weekdaysShort: 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'),
        weekdaysMin: 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'),
        longDateFormat: {
            LT: 'A h:mm -നു',
            LTS: 'A h:mm:ss -നു',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm -നു',
            LLLL: 'dddd, D MMMM YYYY, A h:mm -നു',
        },
        calendar: {
            sameDay: '[ഇന്ന്] LT',
            nextDay: '[നാളെ] LT',
            nextWeek: 'dddd, LT',
            lastDay: '[ഇന്നലെ] LT',
            lastWeek: '[കഴിഞ്ഞ] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s കഴിഞ്ഞ്',
            past: '%s മുൻപ്',
            s: 'അൽപ നിമിഷങ്ങൾ',
            ss: '%d സെക്കൻഡ്',
            m: 'ഒരു മിനിറ്റ്',
            mm: '%d മിനിറ്റ്',
            h: 'ഒരു മണിക്കൂർ',
            hh: '%d മണിക്കൂർ',
            d: 'ഒരു ദിവസം',
            dd: '%d ദിവസം',
            M: 'ഒരു മാസം',
            MM: '%d മാസം',
            y: 'ഒരു വർഷം',
            yy: '%d വർഷം',
        },
        meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (
                (meridiem === 'രാത്രി' && hour >= 4) ||
                meridiem === 'ഉച്ച കഴിഞ്ഞ്' ||
                meridiem === 'വൈകുന്നേരം'
            ) {
                return hour + 12;
            } else {
                return hour;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'രാത്രി';
            } else if (hour < 12) {
                return 'രാവിലെ';
            } else if (hour < 17) {
                return 'ഉച്ച കഴിഞ്ഞ്';
            } else if (hour < 20) {
                return 'വൈകുന്നേരം';
            } else {
                return 'രാത്രി';
            }
        },
    });

    return ml;

})));
//! moment.js locale configuration
//! locale : Mongolian [mn]
//! author : Javkhlantugs Nyamdorj : https://github.com/javkhaanj7

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    function translate(number, withoutSuffix, key, isFuture) {
        switch (key) {
            case 's':
                return withoutSuffix ? 'хэдхэн секунд' : 'хэдхэн секундын';
            case 'ss':
                return number + (withoutSuffix ? ' секунд' : ' секундын');
            case 'm':
            case 'mm':
                return number + (withoutSuffix ? ' минут' : ' минутын');
            case 'h':
            case 'hh':
                return number + (withoutSuffix ? ' цаг' : ' цагийн');
            case 'd':
            case 'dd':
                return number + (withoutSuffix ? ' өдөр' : ' өдрийн');
            case 'M':
            case 'MM':
                return number + (withoutSuffix ? ' сар' : ' сарын');
            case 'y':
            case 'yy':
                return number + (withoutSuffix ? ' жил' : ' жилийн');
            default:
                return number;
        }
    }

    var mn = moment.defineLocale('mn', {
        months: 'Нэгдүгээр сар_Хоёрдугаар сар_Гуравдугаар сар_Дөрөвдүгээр сар_Тавдугаар сар_Зургадугаар сар_Долдугаар сар_Наймдугаар сар_Есдүгээр сар_Аравдугаар сар_Арван нэгдүгээр сар_Арван хоёрдугаар сар'.split(
            '_'
        ),
        monthsShort:
            '1 сар_2 сар_3 сар_4 сар_5 сар_6 сар_7 сар_8 сар_9 сар_10 сар_11 сар_12 сар'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'Ням_Даваа_Мягмар_Лхагва_Пүрэв_Баасан_Бямба'.split('_'),
        weekdaysShort: 'Ням_Дав_Мяг_Лха_Пүр_Баа_Бям'.split('_'),
        weekdaysMin: 'Ня_Да_Мя_Лх_Пү_Ба_Бя'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY-MM-DD',
            LL: 'YYYY оны MMMMын D',
            LLL: 'YYYY оны MMMMын D HH:mm',
            LLLL: 'dddd, YYYY оны MMMMын D HH:mm',
        },
        meridiemParse: /ҮӨ|ҮХ/i,
        isPM: function (input) {
            return input === 'ҮХ';
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'ҮӨ';
            } else {
                return 'ҮХ';
            }
        },
        calendar: {
            sameDay: '[Өнөөдөр] LT',
            nextDay: '[Маргааш] LT',
            nextWeek: '[Ирэх] dddd LT',
            lastDay: '[Өчигдөр] LT',
            lastWeek: '[Өнгөрсөн] dddd LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s дараа',
            past: '%s өмнө',
            s: translate,
            ss: translate,
            m: translate,
            mm: translate,
            h: translate,
            hh: translate,
            d: translate,
            dd: translate,
            M: translate,
            MM: translate,
            y: translate,
            yy: translate,
        },
        dayOfMonthOrdinalParse: /\d{1,2} өдөр/,
        ordinal: function (number, period) {
            switch (period) {
                case 'd':
                case 'D':
                case 'DDD':
                    return number + ' өдөр';
                default:
                    return number;
            }
        },
    });

    return mn;

})));
//! moment.js locale configuration
//! locale : Marathi [mr]
//! author : Harshad Kale : https://github.com/kalehv
//! author : Vivek Athalye : https://github.com/vnathalye

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var symbolMap = {
            1: '१',
            2: '२',
            3: '३',
            4: '४',
            5: '५',
            6: '६',
            7: '७',
            8: '८',
            9: '९',
            0: '०',
        },
        numberMap = {
            '१': '1',
            '२': '2',
            '३': '3',
            '४': '4',
            '५': '5',
            '६': '6',
            '७': '7',
            '८': '8',
            '९': '9',
            '०': '0',
        };

    function relativeTimeMr(number, withoutSuffix, string, isFuture) {
        var output = '';
        if (withoutSuffix) {
            switch (string) {
                case 's':
                    output = 'काही सेकंद';
                    break;
                case 'ss':
                    output = '%d सेकंद';
                    break;
                case 'm':
                    output = 'एक मिनिट';
                    break;
                case 'mm':
                    output = '%d मिनिटे';
                    break;
                case 'h':
                    output = 'एक तास';
                    break;
                case 'hh':
                    output = '%d तास';
                    break;
                case 'd':
                    output = 'एक दिवस';
                    break;
                case 'dd':
                    output = '%d दिवस';
                    break;
                case 'M':
                    output = 'एक महिना';
                    break;
                case 'MM':
                    output = '%d महिने';
                    break;
                case 'y':
                    output = 'एक वर्ष';
                    break;
                case 'yy':
                    output = '%d वर्षे';
                    break;
            }
        } else {
            switch (string) {
                case 's':
                    output = 'काही सेकंदां';
                    break;
                case 'ss':
                    output = '%d सेकंदां';
                    break;
                case 'm':
                    output = 'एका मिनिटा';
                    break;
                case 'mm':
                    output = '%d मिनिटां';
                    break;
                case 'h':
                    output = 'एका तासा';
                    break;
                case 'hh':
                    output = '%d तासां';
                    break;
                case 'd':
                    output = 'एका दिवसा';
                    break;
                case 'dd':
                    output = '%d दिवसां';
                    break;
                case 'M':
                    output = 'एका महिन्या';
                    break;
                case 'MM':
                    output = '%d महिन्यां';
                    break;
                case 'y':
                    output = 'एका वर्षा';
                    break;
                case 'yy':
                    output = '%d वर्षां';
                    break;
            }
        }
        return output.replace(/%d/i, number);
    }

    var mr = moment.defineLocale('mr', {
        months: 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split(
            '_'
        ),
        monthsShort:
            'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
        weekdaysShort: 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'),
        weekdaysMin: 'र_सो_मं_बु_गु_शु_श'.split('_'),
        longDateFormat: {
            LT: 'A h:mm वाजता',
            LTS: 'A h:mm:ss वाजता',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm वाजता',
            LLLL: 'dddd, D MMMM YYYY, A h:mm वाजता',
        },
        calendar: {
            sameDay: '[आज] LT',
            nextDay: '[उद्या] LT',
            nextWeek: 'dddd, LT',
            lastDay: '[काल] LT',
            lastWeek: '[मागील] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%sमध्ये',
            past: '%sपूर्वी',
            s: relativeTimeMr,
            ss: relativeTimeMr,
            m: relativeTimeMr,
            mm: relativeTimeMr,
            h: relativeTimeMr,
            hh: relativeTimeMr,
            d: relativeTimeMr,
            dd: relativeTimeMr,
            M: relativeTimeMr,
            MM: relativeTimeMr,
            y: relativeTimeMr,
            yy: relativeTimeMr,
        },
        preparse: function (string) {
            return string.replace(/[१२३४५६७८९०]/g, function (match) {
                return numberMap[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap[match];
            });
        },
        meridiemParse: /पहाटे|सकाळी|दुपारी|सायंकाळी|रात्री/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'पहाटे' || meridiem === 'सकाळी') {
                return hour;
            } else if (
                meridiem === 'दुपारी' ||
                meridiem === 'सायंकाळी' ||
                meridiem === 'रात्री'
            ) {
                return hour >= 12 ? hour : hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour >= 0 && hour < 6) {
                return 'पहाटे';
            } else if (hour < 12) {
                return 'सकाळी';
            } else if (hour < 17) {
                return 'दुपारी';
            } else if (hour < 20) {
                return 'सायंकाळी';
            } else {
                return 'रात्री';
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    return mr;

})));
//! moment.js locale configuration
//! locale : Malay [ms-my]
//! note : DEPRECATED, the correct one is [ms]
//! author : Weldan Jamili : https://github.com/weldan

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var msMy = moment.defineLocale('ms-my', {
        months: 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),
        weekdays: 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),
        weekdaysShort: 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),
        weekdaysMin: 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
        longDateFormat: {
            LT: 'HH.mm',
            LTS: 'HH.mm.ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY [pukul] HH.mm',
            LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',
        },
        meridiemParse: /pagi|tengahari|petang|malam/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'pagi') {
                return hour;
            } else if (meridiem === 'tengahari') {
                return hour >= 11 ? hour : hour + 12;
            } else if (meridiem === 'petang' || meridiem === 'malam') {
                return hour + 12;
            }
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours < 11) {
                return 'pagi';
            } else if (hours < 15) {
                return 'tengahari';
            } else if (hours < 19) {
                return 'petang';
            } else {
                return 'malam';
            }
        },
        calendar: {
            sameDay: '[Hari ini pukul] LT',
            nextDay: '[Esok pukul] LT',
            nextWeek: 'dddd [pukul] LT',
            lastDay: '[Kelmarin pukul] LT',
            lastWeek: 'dddd [lepas pukul] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'dalam %s',
            past: '%s yang lepas',
            s: 'beberapa saat',
            ss: '%d saat',
            m: 'seminit',
            mm: '%d minit',
            h: 'sejam',
            hh: '%d jam',
            d: 'sehari',
            dd: '%d hari',
            M: 'sebulan',
            MM: '%d bulan',
            y: 'setahun',
            yy: '%d tahun',
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    return msMy;

})));
//! moment.js locale configuration
//! locale : Malay [ms]
//! author : Weldan Jamili : https://github.com/weldan

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var ms = moment.defineLocale('ms', {
        months: 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),
        weekdays: 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),
        weekdaysShort: 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),
        weekdaysMin: 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
        longDateFormat: {
            LT: 'HH.mm',
            LTS: 'HH.mm.ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY [pukul] HH.mm',
            LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',
        },
        meridiemParse: /pagi|tengahari|petang|malam/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'pagi') {
                return hour;
            } else if (meridiem === 'tengahari') {
                return hour >= 11 ? hour : hour + 12;
            } else if (meridiem === 'petang' || meridiem === 'malam') {
                return hour + 12;
            }
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours < 11) {
                return 'pagi';
            } else if (hours < 15) {
                return 'tengahari';
            } else if (hours < 19) {
                return 'petang';
            } else {
                return 'malam';
            }
        },
        calendar: {
            sameDay: '[Hari ini pukul] LT',
            nextDay: '[Esok pukul] LT',
            nextWeek: 'dddd [pukul] LT',
            lastDay: '[Kelmarin pukul] LT',
            lastWeek: 'dddd [lepas pukul] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'dalam %s',
            past: '%s yang lepas',
            s: 'beberapa saat',
            ss: '%d saat',
            m: 'seminit',
            mm: '%d minit',
            h: 'sejam',
            hh: '%d jam',
            d: 'sehari',
            dd: '%d hari',
            M: 'sebulan',
            MM: '%d bulan',
            y: 'setahun',
            yy: '%d tahun',
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    return ms;

})));
//! moment.js locale configuration
//! locale : Maltese (Malta) [mt]
//! author : Alessandro Maruccia : https://github.com/alesma

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var mt = moment.defineLocale('mt', {
        months: 'Jannar_Frar_Marzu_April_Mejju_Ġunju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Diċembru'.split(
            '_'
        ),
        monthsShort: 'Jan_Fra_Mar_Apr_Mej_Ġun_Lul_Aww_Set_Ott_Nov_Diċ'.split('_'),
        weekdays:
            'Il-Ħadd_It-Tnejn_It-Tlieta_L-Erbgħa_Il-Ħamis_Il-Ġimgħa_Is-Sibt'.split(
                '_'
            ),
        weekdaysShort: 'Ħad_Tne_Tli_Erb_Ħam_Ġim_Sib'.split('_'),
        weekdaysMin: 'Ħa_Tn_Tl_Er_Ħa_Ġi_Si'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Illum fil-]LT',
            nextDay: '[Għada fil-]LT',
            nextWeek: 'dddd [fil-]LT',
            lastDay: '[Il-bieraħ fil-]LT',
            lastWeek: 'dddd [li għadda] [fil-]LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'f’ %s',
            past: '%s ilu',
            s: 'ftit sekondi',
            ss: '%d sekondi',
            m: 'minuta',
            mm: '%d minuti',
            h: 'siegħa',
            hh: '%d siegħat',
            d: 'ġurnata',
            dd: '%d ġranet',
            M: 'xahar',
            MM: '%d xhur',
            y: 'sena',
            yy: '%d sni',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return mt;

})));
//! moment.js locale configuration
//! locale : Burmese [my]
//! author : Squar team, mysquar.com
//! author : David Rossellat : https://github.com/gholadr
//! author : Tin Aung Lin : https://github.com/thanyawzinmin

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var symbolMap = {
            1: '၁',
            2: '၂',
            3: '၃',
            4: '၄',
            5: '၅',
            6: '၆',
            7: '၇',
            8: '၈',
            9: '၉',
            0: '၀',
        },
        numberMap = {
            '၁': '1',
            '၂': '2',
            '၃': '3',
            '၄': '4',
            '၅': '5',
            '၆': '6',
            '၇': '7',
            '၈': '8',
            '၉': '9',
            '၀': '0',
        };

    var my = moment.defineLocale('my', {
        months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split(
            '_'
        ),
        monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'),
        weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split(
            '_'
        ),
        weekdaysShort: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
        weekdaysMin: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),

        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[ယနေ.] LT [မှာ]',
            nextDay: '[မနက်ဖြန်] LT [မှာ]',
            nextWeek: 'dddd LT [မှာ]',
            lastDay: '[မနေ.က] LT [မှာ]',
            lastWeek: '[ပြီးခဲ့သော] dddd LT [မှာ]',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'လာမည့် %s မှာ',
            past: 'လွန်ခဲ့သော %s က',
            s: 'စက္ကန်.အနည်းငယ်',
            ss: '%d စက္ကန့်',
            m: 'တစ်မိနစ်',
            mm: '%d မိနစ်',
            h: 'တစ်နာရီ',
            hh: '%d နာရီ',
            d: 'တစ်ရက်',
            dd: '%d ရက်',
            M: 'တစ်လ',
            MM: '%d လ',
            y: 'တစ်နှစ်',
            yy: '%d နှစ်',
        },
        preparse: function (string) {
            return string.replace(/[၁၂၃၄၅၆၇၈၉၀]/g, function (match) {
                return numberMap[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap[match];
            });
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return my;

})));
//! moment.js locale configuration
//! locale : Norwegian Bokmål [nb]
//! authors : Espen Hovlandsdal : https://github.com/rexxars
//!           Sigurd Gartmann : https://github.com/sigurdga
//!           Stephen Ramthun : https://github.com/stephenramthun

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var nb = moment.defineLocale('nb', {
        months: 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split(
            '_'
        ),
        monthsShort:
            'jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),
        monthsParseExact: true,
        weekdays: 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
        weekdaysShort: 'sø._ma._ti._on._to._fr._lø.'.split('_'),
        weekdaysMin: 'sø_ma_ti_on_to_fr_lø'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY [kl.] HH:mm',
            LLLL: 'dddd D. MMMM YYYY [kl.] HH:mm',
        },
        calendar: {
            sameDay: '[i dag kl.] LT',
            nextDay: '[i morgen kl.] LT',
            nextWeek: 'dddd [kl.] LT',
            lastDay: '[i går kl.] LT',
            lastWeek: '[forrige] dddd [kl.] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'om %s',
            past: '%s siden',
            s: 'noen sekunder',
            ss: '%d sekunder',
            m: 'ett minutt',
            mm: '%d minutter',
            h: 'en time',
            hh: '%d timer',
            d: 'en dag',
            dd: '%d dager',
            w: 'en uke',
            ww: '%d uker',
            M: 'en måned',
            MM: '%d måneder',
            y: 'ett år',
            yy: '%d år',
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return nb;

})));
//! moment.js locale configuration
//! locale : Nepalese [ne]
//! author : suvash : https://github.com/suvash

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var symbolMap = {
            1: '१',
            2: '२',
            3: '३',
            4: '४',
            5: '५',
            6: '६',
            7: '७',
            8: '८',
            9: '९',
            0: '०',
        },
        numberMap = {
            '१': '1',
            '२': '2',
            '३': '3',
            '४': '4',
            '५': '5',
            '६': '6',
            '७': '7',
            '८': '8',
            '९': '9',
            '०': '0',
        };

    var ne = moment.defineLocale('ne', {
        months: 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split(
            '_'
        ),
        monthsShort:
            'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split(
            '_'
        ),
        weekdaysShort: 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'),
        weekdaysMin: 'आ._सो._मं._बु._बि._शु._श.'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'Aको h:mm बजे',
            LTS: 'Aको h:mm:ss बजे',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, Aको h:mm बजे',
            LLLL: 'dddd, D MMMM YYYY, Aको h:mm बजे',
        },
        preparse: function (string) {
            return string.replace(/[१२३४५६७८९०]/g, function (match) {
                return numberMap[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap[match];
            });
        },
        meridiemParse: /राति|बिहान|दिउँसो|साँझ/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'राति') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'बिहान') {
                return hour;
            } else if (meridiem === 'दिउँसो') {
                return hour >= 10 ? hour : hour + 12;
            } else if (meridiem === 'साँझ') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 3) {
                return 'राति';
            } else if (hour < 12) {
                return 'बिहान';
            } else if (hour < 16) {
                return 'दिउँसो';
            } else if (hour < 20) {
                return 'साँझ';
            } else {
                return 'राति';
            }
        },
        calendar: {
            sameDay: '[आज] LT',
            nextDay: '[भोलि] LT',
            nextWeek: '[आउँदो] dddd[,] LT',
            lastDay: '[हिजो] LT',
            lastWeek: '[गएको] dddd[,] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%sमा',
            past: '%s अगाडि',
            s: 'केही क्षण',
            ss: '%d सेकेण्ड',
            m: 'एक मिनेट',
            mm: '%d मिनेट',
            h: 'एक घण्टा',
            hh: '%d घण्टा',
            d: 'एक दिन',
            dd: '%d दिन',
            M: 'एक महिना',
            MM: '%d महिना',
            y: 'एक बर्ष',
            yy: '%d बर्ष',
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    return ne;

})));
//! moment.js locale configuration
//! locale : Dutch (Belgium) [nl-be]
//! author : Joris Röling : https://github.com/jorisroling
//! author : Jacob Middag : https://github.com/middagj

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var monthsShortWithDots =
            'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),
        monthsShortWithoutDots =
            'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'),
        monthsParse = [
            /^jan/i,
            /^feb/i,
            /^maart|mrt.?$/i,
            /^apr/i,
            /^mei$/i,
            /^jun[i.]?$/i,
            /^jul[i.]?$/i,
            /^aug/i,
            /^sep/i,
            /^okt/i,
            /^nov/i,
            /^dec/i,
        ],
        monthsRegex =
            /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;

    var nlBe = moment.defineLocale('nl-be', {
        months: 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split(
            '_'
        ),
        monthsShort: function (m, format) {
            if (!m) {
                return monthsShortWithDots;
            } else if (/-MMM-/.test(format)) {
                return monthsShortWithoutDots[m.month()];
            } else {
                return monthsShortWithDots[m.month()];
            }
        },

        monthsRegex: monthsRegex,
        monthsShortRegex: monthsRegex,
        monthsStrictRegex:
            /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,
        monthsShortStrictRegex:
            /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,

        monthsParse: monthsParse,
        longMonthsParse: monthsParse,
        shortMonthsParse: monthsParse,

        weekdays:
            'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
        weekdaysShort: 'zo._ma._di._wo._do._vr._za.'.split('_'),
        weekdaysMin: 'zo_ma_di_wo_do_vr_za'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[vandaag om] LT',
            nextDay: '[morgen om] LT',
            nextWeek: 'dddd [om] LT',
            lastDay: '[gisteren om] LT',
            lastWeek: '[afgelopen] dddd [om] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'over %s',
            past: '%s geleden',
            s: 'een paar seconden',
            ss: '%d seconden',
            m: 'één minuut',
            mm: '%d minuten',
            h: 'één uur',
            hh: '%d uur',
            d: 'één dag',
            dd: '%d dagen',
            M: 'één maand',
            MM: '%d maanden',
            y: 'één jaar',
            yy: '%d jaar',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/,
        ordinal: function (number) {
            return (
                number +
                (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')
            );
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return nlBe;

})));
//! moment.js locale configuration
//! locale : Dutch [nl]
//! author : Joris Röling : https://github.com/jorisroling
//! author : Jacob Middag : https://github.com/middagj

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var monthsShortWithDots =
            'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),
        monthsShortWithoutDots =
            'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'),
        monthsParse = [
            /^jan/i,
            /^feb/i,
            /^maart|mrt.?$/i,
            /^apr/i,
            /^mei$/i,
            /^jun[i.]?$/i,
            /^jul[i.]?$/i,
            /^aug/i,
            /^sep/i,
            /^okt/i,
            /^nov/i,
            /^dec/i,
        ],
        monthsRegex =
            /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;

    var nl = moment.defineLocale('nl', {
        months: 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split(
            '_'
        ),
        monthsShort: function (m, format) {
            if (!m) {
                return monthsShortWithDots;
            } else if (/-MMM-/.test(format)) {
                return monthsShortWithoutDots[m.month()];
            } else {
                return monthsShortWithDots[m.month()];
            }
        },

        monthsRegex: monthsRegex,
        monthsShortRegex: monthsRegex,
        monthsStrictRegex:
            /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,
        monthsShortStrictRegex:
            /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,

        monthsParse: monthsParse,
        longMonthsParse: monthsParse,
        shortMonthsParse: monthsParse,

        weekdays:
            'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
        weekdaysShort: 'zo._ma._di._wo._do._vr._za.'.split('_'),
        weekdaysMin: 'zo_ma_di_wo_do_vr_za'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD-MM-YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[vandaag om] LT',
            nextDay: '[morgen om] LT',
            nextWeek: 'dddd [om] LT',
            lastDay: '[gisteren om] LT',
            lastWeek: '[afgelopen] dddd [om] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'over %s',
            past: '%s geleden',
            s: 'een paar seconden',
            ss: '%d seconden',
            m: 'één minuut',
            mm: '%d minuten',
            h: 'één uur',
            hh: '%d uur',
            d: 'één dag',
            dd: '%d dagen',
            w: 'één week',
            ww: '%d weken',
            M: 'één maand',
            MM: '%d maanden',
            y: 'één jaar',
            yy: '%d jaar',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/,
        ordinal: function (number) {
            return (
                number +
                (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')
            );
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return nl;

})));
//! moment.js locale configuration
//! locale : Nynorsk [nn]
//! authors : https://github.com/mechuwind
//!           Stephen Ramthun : https://github.com/stephenramthun

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var nn = moment.defineLocale('nn', {
        months: 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split(
            '_'
        ),
        monthsShort:
            'jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),
        monthsParseExact: true,
        weekdays: 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'),
        weekdaysShort: 'su._må._ty._on._to._fr._lau.'.split('_'),
        weekdaysMin: 'su_må_ty_on_to_fr_la'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY [kl.] H:mm',
            LLLL: 'dddd D. MMMM YYYY [kl.] HH:mm',
        },
        calendar: {
            sameDay: '[I dag klokka] LT',
            nextDay: '[I morgon klokka] LT',
            nextWeek: 'dddd [klokka] LT',
            lastDay: '[I går klokka] LT',
            lastWeek: '[Føregåande] dddd [klokka] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'om %s',
            past: '%s sidan',
            s: 'nokre sekund',
            ss: '%d sekund',
            m: 'eit minutt',
            mm: '%d minutt',
            h: 'ein time',
            hh: '%d timar',
            d: 'ein dag',
            dd: '%d dagar',
            w: 'ei veke',
            ww: '%d veker',
            M: 'ein månad',
            MM: '%d månader',
            y: 'eit år',
            yy: '%d år',
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return nn;

})));
//! moment.js locale configuration
//! locale : Occitan, lengadocian dialecte [oc-lnc]
//! author : Quentin PAGÈS : https://github.com/Quenty31

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var ocLnc = moment.defineLocale('oc-lnc', {
        months: {
            standalone:
                'genièr_febrièr_març_abril_mai_junh_julhet_agost_setembre_octòbre_novembre_decembre'.split(
                    '_'
                ),
            format: "de genièr_de febrièr_de març_d'abril_de mai_de junh_de julhet_d'agost_de setembre_d'octòbre_de novembre_de decembre".split(
                '_'
            ),
            isFormat: /D[oD]?(\s)+MMMM/,
        },
        monthsShort:
            'gen._febr._març_abr._mai_junh_julh._ago._set._oct._nov._dec.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'dimenge_diluns_dimars_dimècres_dijòus_divendres_dissabte'.split(
            '_'
        ),
        weekdaysShort: 'dg._dl._dm._dc._dj._dv._ds.'.split('_'),
        weekdaysMin: 'dg_dl_dm_dc_dj_dv_ds'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM [de] YYYY',
            ll: 'D MMM YYYY',
            LLL: 'D MMMM [de] YYYY [a] H:mm',
            lll: 'D MMM YYYY, H:mm',
            LLLL: 'dddd D MMMM [de] YYYY [a] H:mm',
            llll: 'ddd D MMM YYYY, H:mm',
        },
        calendar: {
            sameDay: '[uèi a] LT',
            nextDay: '[deman a] LT',
            nextWeek: 'dddd [a] LT',
            lastDay: '[ièr a] LT',
            lastWeek: 'dddd [passat a] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: "d'aquí %s",
            past: 'fa %s',
            s: 'unas segondas',
            ss: '%d segondas',
            m: 'una minuta',
            mm: '%d minutas',
            h: 'una ora',
            hh: '%d oras',
            d: 'un jorn',
            dd: '%d jorns',
            M: 'un mes',
            MM: '%d meses',
            y: 'un an',
            yy: '%d ans',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(r|n|t|è|a)/,
        ordinal: function (number, period) {
            var output =
                number === 1
                    ? 'r'
                    : number === 2
                    ? 'n'
                    : number === 3
                    ? 'r'
                    : number === 4
                    ? 't'
                    : 'è';
            if (period === 'w' || period === 'W') {
                output = 'a';
            }
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4,
        },
    });

    return ocLnc;

})));
//! moment.js locale configuration
//! locale : Punjabi (India) [pa-in]
//! author : Harpreet Singh : https://github.com/harpreetkhalsagtbit

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var symbolMap = {
            1: '੧',
            2: '੨',
            3: '੩',
            4: '੪',
            5: '੫',
            6: '੬',
            7: '੭',
            8: '੮',
            9: '੯',
            0: '੦',
        },
        numberMap = {
            '੧': '1',
            '੨': '2',
            '੩': '3',
            '੪': '4',
            '੫': '5',
            '੬': '6',
            '੭': '7',
            '੮': '8',
            '੯': '9',
            '੦': '0',
        };

    var paIn = moment.defineLocale('pa-in', {
        // There are months name as per Nanakshahi Calendar but they are not used as rigidly in modern Punjabi.
        months: 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split(
            '_'
        ),
        monthsShort:
            'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split(
                '_'
            ),
        weekdays: 'ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ'.split(
            '_'
        ),
        weekdaysShort: 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),
        weekdaysMin: 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),
        longDateFormat: {
            LT: 'A h:mm ਵਜੇ',
            LTS: 'A h:mm:ss ਵਜੇ',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm ਵਜੇ',
            LLLL: 'dddd, D MMMM YYYY, A h:mm ਵਜੇ',
        },
        calendar: {
            sameDay: '[ਅਜ] LT',
            nextDay: '[ਕਲ] LT',
            nextWeek: '[ਅਗਲਾ] dddd, LT',
            lastDay: '[ਕਲ] LT',
            lastWeek: '[ਪਿਛਲੇ] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s ਵਿੱਚ',
            past: '%s ਪਿਛਲੇ',
            s: 'ਕੁਝ ਸਕਿੰਟ',
            ss: '%d ਸਕਿੰਟ',
            m: 'ਇਕ ਮਿੰਟ',
            mm: '%d ਮਿੰਟ',
            h: 'ਇੱਕ ਘੰਟਾ',
            hh: '%d ਘੰਟੇ',
            d: 'ਇੱਕ ਦਿਨ',
            dd: '%d ਦਿਨ',
            M: 'ਇੱਕ ਮਹੀਨਾ',
            MM: '%d ਮਹੀਨੇ',
            y: 'ਇੱਕ ਸਾਲ',
            yy: '%d ਸਾਲ',
        },
        preparse: function (string) {
            return string.replace(/[੧੨੩੪੫੬੭੮੯੦]/g, function (match) {
                return numberMap[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap[match];
            });
        },
        // Punjabi notation for meridiems are quite fuzzy in practice. While there exists
        // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi.
        meridiemParse: /ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'ਰਾਤ') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'ਸਵੇਰ') {
                return hour;
            } else if (meridiem === 'ਦੁਪਹਿਰ') {
                return hour >= 10 ? hour : hour + 12;
            } else if (meridiem === 'ਸ਼ਾਮ') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'ਰਾਤ';
            } else if (hour < 10) {
                return 'ਸਵੇਰ';
            } else if (hour < 17) {
                return 'ਦੁਪਹਿਰ';
            } else if (hour < 20) {
                return 'ਸ਼ਾਮ';
            } else {
                return 'ਰਾਤ';
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    return paIn;

})));
//! moment.js locale configuration
//! locale : Polish [pl]
//! author : Rafal Hirsz : https://github.com/evoL

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var monthsNominative =
            'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split(
                '_'
            ),
        monthsSubjective =
            'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split(
                '_'
            ),
        monthsParse = [
            /^sty/i,
            /^lut/i,
            /^mar/i,
            /^kwi/i,
            /^maj/i,
            /^cze/i,
            /^lip/i,
            /^sie/i,
            /^wrz/i,
            /^paź/i,
            /^lis/i,
            /^gru/i,
        ];
    function plural(n) {
        return n % 10 < 5 && n % 10 > 1 && ~~(n / 10) % 10 !== 1;
    }
    function translate(number, withoutSuffix, key) {
        var result = number + ' ';
        switch (key) {
            case 'ss':
                return result + (plural(number) ? 'sekundy' : 'sekund');
            case 'm':
                return withoutSuffix ? 'minuta' : 'minutę';
            case 'mm':
                return result + (plural(number) ? 'minuty' : 'minut');
            case 'h':
                return withoutSuffix ? 'godzina' : 'godzinę';
            case 'hh':
                return result + (plural(number) ? 'godziny' : 'godzin');
            case 'ww':
                return result + (plural(number) ? 'tygodnie' : 'tygodni');
            case 'MM':
                return result + (plural(number) ? 'miesiące' : 'miesięcy');
            case 'yy':
                return result + (plural(number) ? 'lata' : 'lat');
        }
    }

    var pl = moment.defineLocale('pl', {
        months: function (momentToFormat, format) {
            if (!momentToFormat) {
                return monthsNominative;
            } else if (/D MMMM/.test(format)) {
                return monthsSubjective[momentToFormat.month()];
            } else {
                return monthsNominative[momentToFormat.month()];
            }
        },
        monthsShort: 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'),
        monthsParse: monthsParse,
        longMonthsParse: monthsParse,
        shortMonthsParse: monthsParse,
        weekdays:
            'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'),
        weekdaysShort: 'ndz_pon_wt_śr_czw_pt_sob'.split('_'),
        weekdaysMin: 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Dziś o] LT',
            nextDay: '[Jutro o] LT',
            nextWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[W niedzielę o] LT';

                    case 2:
                        return '[We wtorek o] LT';

                    case 3:
                        return '[W środę o] LT';

                    case 6:
                        return '[W sobotę o] LT';

                    default:
                        return '[W] dddd [o] LT';
                }
            },
            lastDay: '[Wczoraj o] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[W zeszłą niedzielę o] LT';
                    case 3:
                        return '[W zeszłą środę o] LT';
                    case 6:
                        return '[W zeszłą sobotę o] LT';
                    default:
                        return '[W zeszły] dddd [o] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'za %s',
            past: '%s temu',
            s: 'kilka sekund',
            ss: translate,
            m: translate,
            mm: translate,
            h: translate,
            hh: translate,
            d: '1 dzień',
            dd: '%d dni',
            w: 'tydzień',
            ww: translate,
            M: 'miesiąc',
            MM: translate,
            y: 'rok',
            yy: translate,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return pl;

})));
//! moment.js locale configuration
//! locale : Portuguese (Brazil) [pt-br]
//! author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var ptBr = moment.defineLocale('pt-br', {
        months: 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split(
            '_'
        ),
        monthsShort: 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),
        weekdays:
            'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split(
                '_'
            ),
        weekdaysShort: 'dom_seg_ter_qua_qui_sex_sáb'.split('_'),
        weekdaysMin: 'do_2ª_3ª_4ª_5ª_6ª_sá'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D [de] MMMM [de] YYYY',
            LLL: 'D [de] MMMM [de] YYYY [às] HH:mm',
            LLLL: 'dddd, D [de] MMMM [de] YYYY [às] HH:mm',
        },
        calendar: {
            sameDay: '[Hoje às] LT',
            nextDay: '[Amanhã às] LT',
            nextWeek: 'dddd [às] LT',
            lastDay: '[Ontem às] LT',
            lastWeek: function () {
                return this.day() === 0 || this.day() === 6
                    ? '[Último] dddd [às] LT' // Saturday + Sunday
                    : '[Última] dddd [às] LT'; // Monday - Friday
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'em %s',
            past: 'há %s',
            s: 'poucos segundos',
            ss: '%d segundos',
            m: 'um minuto',
            mm: '%d minutos',
            h: 'uma hora',
            hh: '%d horas',
            d: 'um dia',
            dd: '%d dias',
            M: 'um mês',
            MM: '%d meses',
            y: 'um ano',
            yy: '%d anos',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        invalidDate: 'Data inválida',
    });

    return ptBr;

})));
//! moment.js locale configuration
//! locale : Portuguese [pt]
//! author : Jefferson : https://github.com/jalex79

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var pt = moment.defineLocale('pt', {
        months: 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split(
            '_'
        ),
        monthsShort: 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),
        weekdays:
            'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split(
                '_'
            ),
        weekdaysShort: 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),
        weekdaysMin: 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D [de] MMMM [de] YYYY',
            LLL: 'D [de] MMMM [de] YYYY HH:mm',
            LLLL: 'dddd, D [de] MMMM [de] YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Hoje às] LT',
            nextDay: '[Amanhã às] LT',
            nextWeek: 'dddd [às] LT',
            lastDay: '[Ontem às] LT',
            lastWeek: function () {
                return this.day() === 0 || this.day() === 6
                    ? '[Último] dddd [às] LT' // Saturday + Sunday
                    : '[Última] dddd [às] LT'; // Monday - Friday
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'em %s',
            past: 'há %s',
            s: 'segundos',
            ss: '%d segundos',
            m: 'um minuto',
            mm: '%d minutos',
            h: 'uma hora',
            hh: '%d horas',
            d: 'um dia',
            dd: '%d dias',
            w: 'uma semana',
            ww: '%d semanas',
            M: 'um mês',
            MM: '%d meses',
            y: 'um ano',
            yy: '%d anos',
        },
        dayOfMonthOrdinalParse: /\d{1,2}º/,
        ordinal: '%dº',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return pt;

})));
//! moment.js locale configuration
//! locale : Romanian [ro]
//! author : Vlad Gurdiga : https://github.com/gurdiga
//! author : Valentin Agachi : https://github.com/avaly
//! author : Emanuel Cepoi : https://github.com/cepem

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    function relativeTimeWithPlural(number, withoutSuffix, key) {
        var format = {
                ss: 'secunde',
                mm: 'minute',
                hh: 'ore',
                dd: 'zile',
                ww: 'săptămâni',
                MM: 'luni',
                yy: 'ani',
            },
            separator = ' ';
        if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) {
            separator = ' de ';
        }
        return number + separator + format[key];
    }

    var ro = moment.defineLocale('ro', {
        months: 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split(
            '_'
        ),
        monthsShort:
            'ian._feb._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'),
        weekdaysShort: 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'),
        weekdaysMin: 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'),
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY H:mm',
            LLLL: 'dddd, D MMMM YYYY H:mm',
        },
        calendar: {
            sameDay: '[azi la] LT',
            nextDay: '[mâine la] LT',
            nextWeek: 'dddd [la] LT',
            lastDay: '[ieri la] LT',
            lastWeek: '[fosta] dddd [la] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'peste %s',
            past: '%s în urmă',
            s: 'câteva secunde',
            ss: relativeTimeWithPlural,
            m: 'un minut',
            mm: relativeTimeWithPlural,
            h: 'o oră',
            hh: relativeTimeWithPlural,
            d: 'o zi',
            dd: relativeTimeWithPlural,
            w: 'o săptămână',
            ww: relativeTimeWithPlural,
            M: 'o lună',
            MM: relativeTimeWithPlural,
            y: 'un an',
            yy: relativeTimeWithPlural,
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    return ro;

})));
//! moment.js locale configuration
//! locale : Russian [ru]
//! author : Viktorminator : https://github.com/Viktorminator
//! author : Menelion Elensúle : https://github.com/Oire
//! author : Коренберг Марк : https://github.com/socketpair

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    function plural(word, num) {
        var forms = word.split('_');
        return num % 10 === 1 && num % 100 !== 11
            ? forms[0]
            : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20)
            ? forms[1]
            : forms[2];
    }
    function relativeTimeWithPlural(number, withoutSuffix, key) {
        var format = {
            ss: withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд',
            mm: withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут',
            hh: 'час_часа_часов',
            dd: 'день_дня_дней',
            ww: 'неделя_недели_недель',
            MM: 'месяц_месяца_месяцев',
            yy: 'год_года_лет',
        };
        if (key === 'm') {
            return withoutSuffix ? 'минута' : 'минуту';
        } else {
            return number + ' ' + plural(format[key], +number);
        }
    }
    var monthsParse = [
        /^янв/i,
        /^фев/i,
        /^мар/i,
        /^апр/i,
        /^ма[йя]/i,
        /^июн/i,
        /^июл/i,
        /^авг/i,
        /^сен/i,
        /^окт/i,
        /^ноя/i,
        /^дек/i,
    ];

    // http://new.gramota.ru/spravka/rules/139-prop : § 103
    // Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637
    // CLDR data:          http://www.unicode.org/cldr/charts/28/summary/ru.html#1753
    var ru = moment.defineLocale('ru', {
        months: {
            format: 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split(
                '_'
            ),
            standalone:
                'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split(
                    '_'
                ),
        },
        monthsShort: {
            // по CLDR именно "июл." и "июн.", но какой смысл менять букву на точку?
            format: 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split(
                '_'
            ),
            standalone:
                'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split(
                    '_'
                ),
        },
        weekdays: {
            standalone:
                'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split(
                    '_'
                ),
            format: 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split(
                '_'
            ),
            isFormat: /\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?] ?dddd/,
        },
        weekdaysShort: 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
        weekdaysMin: 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
        monthsParse: monthsParse,
        longMonthsParse: monthsParse,
        shortMonthsParse: monthsParse,

        // полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки
        monthsRegex:
            /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,

        // копия предыдущего
        monthsShortRegex:
            /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,

        // полные названия с падежами
        monthsStrictRegex:
            /^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i,

        // Выражение, которое соответствует только сокращённым формам
        monthsShortStrictRegex:
            /^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY г.',
            LLL: 'D MMMM YYYY г., H:mm',
            LLLL: 'dddd, D MMMM YYYY г., H:mm',
        },
        calendar: {
            sameDay: '[Сегодня, в] LT',
            nextDay: '[Завтра, в] LT',
            lastDay: '[Вчера, в] LT',
            nextWeek: function (now) {
                if (now.week() !== this.week()) {
                    switch (this.day()) {
                        case 0:
                            return '[В следующее] dddd, [в] LT';
                        case 1:
                        case 2:
                        case 4:
                            return '[В следующий] dddd, [в] LT';
                        case 3:
                        case 5:
                        case 6:
                            return '[В следующую] dddd, [в] LT';
                    }
                } else {
                    if (this.day() === 2) {
                        return '[Во] dddd, [в] LT';
                    } else {
                        return '[В] dddd, [в] LT';
                    }
                }
            },
            lastWeek: function (now) {
                if (now.week() !== this.week()) {
                    switch (this.day()) {
                        case 0:
                            return '[В прошлое] dddd, [в] LT';
                        case 1:
                        case 2:
                        case 4:
                            return '[В прошлый] dddd, [в] LT';
                        case 3:
                        case 5:
                        case 6:
                            return '[В прошлую] dddd, [в] LT';
                    }
                } else {
                    if (this.day() === 2) {
                        return '[Во] dddd, [в] LT';
                    } else {
                        return '[В] dddd, [в] LT';
                    }
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'через %s',
            past: '%s назад',
            s: 'несколько секунд',
            ss: relativeTimeWithPlural,
            m: relativeTimeWithPlural,
            mm: relativeTimeWithPlural,
            h: 'час',
            hh: relativeTimeWithPlural,
            d: 'день',
            dd: relativeTimeWithPlural,
            w: 'неделя',
            ww: relativeTimeWithPlural,
            M: 'месяц',
            MM: relativeTimeWithPlural,
            y: 'год',
            yy: relativeTimeWithPlural,
        },
        meridiemParse: /ночи|утра|дня|вечера/i,
        isPM: function (input) {
            return /^(дня|вечера)$/.test(input);
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'ночи';
            } else if (hour < 12) {
                return 'утра';
            } else if (hour < 17) {
                return 'дня';
            } else {
                return 'вечера';
            }
        },
        dayOfMonthOrdinalParse: /\d{1,2}-(й|го|я)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'M':
                case 'd':
                case 'DDD':
                    return number + '-й';
                case 'D':
                    return number + '-го';
                case 'w':
                case 'W':
                    return number + '-я';
                default:
                    return number;
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return ru;

})));
//! moment.js locale configuration
//! locale : Sindhi [sd]
//! author : Narain Sagar : https://github.com/narainsagar

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var months = [
            'جنوري',
            'فيبروري',
            'مارچ',
            'اپريل',
            'مئي',
            'جون',
            'جولاءِ',
            'آگسٽ',
            'سيپٽمبر',
            'آڪٽوبر',
            'نومبر',
            'ڊسمبر',
        ],
        days = ['آچر', 'سومر', 'اڱارو', 'اربع', 'خميس', 'جمع', 'ڇنڇر'];

    var sd = moment.defineLocale('sd', {
        months: months,
        monthsShort: months,
        weekdays: days,
        weekdaysShort: days,
        weekdaysMin: days,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd، D MMMM YYYY HH:mm',
        },
        meridiemParse: /صبح|شام/,
        isPM: function (input) {
            return 'شام' === input;
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'صبح';
            }
            return 'شام';
        },
        calendar: {
            sameDay: '[اڄ] LT',
            nextDay: '[سڀاڻي] LT',
            nextWeek: 'dddd [اڳين هفتي تي] LT',
            lastDay: '[ڪالهه] LT',
            lastWeek: '[گزريل هفتي] dddd [تي] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s پوء',
            past: '%s اڳ',
            s: 'چند سيڪنڊ',
            ss: '%d سيڪنڊ',
            m: 'هڪ منٽ',
            mm: '%d منٽ',
            h: 'هڪ ڪلاڪ',
            hh: '%d ڪلاڪ',
            d: 'هڪ ڏينهن',
            dd: '%d ڏينهن',
            M: 'هڪ مهينو',
            MM: '%d مهينا',
            y: 'هڪ سال',
            yy: '%d سال',
        },
        preparse: function (string) {
            return string.replace(/،/g, ',');
        },
        postformat: function (string) {
            return string.replace(/,/g, '،');
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return sd;

})));
//! moment.js locale configuration
//! locale : Northern Sami [se]
//! authors : Bård Rolstad Henriksen : https://github.com/karamell

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var se = moment.defineLocale('se', {
        months: 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split(
            '_'
        ),
        monthsShort:
            'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'),
        weekdays:
            'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split(
                '_'
            ),
        weekdaysShort: 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'),
        weekdaysMin: 's_v_m_g_d_b_L'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'MMMM D. [b.] YYYY',
            LLL: 'MMMM D. [b.] YYYY [ti.] HH:mm',
            LLLL: 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm',
        },
        calendar: {
            sameDay: '[otne ti] LT',
            nextDay: '[ihttin ti] LT',
            nextWeek: 'dddd [ti] LT',
            lastDay: '[ikte ti] LT',
            lastWeek: '[ovddit] dddd [ti] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s geažes',
            past: 'maŋit %s',
            s: 'moadde sekunddat',
            ss: '%d sekunddat',
            m: 'okta minuhta',
            mm: '%d minuhtat',
            h: 'okta diimmu',
            hh: '%d diimmut',
            d: 'okta beaivi',
            dd: '%d beaivvit',
            M: 'okta mánnu',
            MM: '%d mánut',
            y: 'okta jahki',
            yy: '%d jagit',
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return se;

})));
//! moment.js locale configuration
//! locale : Sinhalese [si]
//! author : Sampath Sitinamaluwa : https://github.com/sampathsris

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    /*jshint -W100*/
    var si = moment.defineLocale('si', {
        months: 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split(
            '_'
        ),
        monthsShort: 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split(
            '_'
        ),
        weekdays:
            'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split(
                '_'
            ),
        weekdaysShort: 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'),
        weekdaysMin: 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'a h:mm',
            LTS: 'a h:mm:ss',
            L: 'YYYY/MM/DD',
            LL: 'YYYY MMMM D',
            LLL: 'YYYY MMMM D, a h:mm',
            LLLL: 'YYYY MMMM D [වැනි] dddd, a h:mm:ss',
        },
        calendar: {
            sameDay: '[අද] LT[ට]',
            nextDay: '[හෙට] LT[ට]',
            nextWeek: 'dddd LT[ට]',
            lastDay: '[ඊයේ] LT[ට]',
            lastWeek: '[පසුගිය] dddd LT[ට]',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%sකින්',
            past: '%sකට පෙර',
            s: 'තත්පර කිහිපය',
            ss: 'තත්පර %d',
            m: 'මිනිත්තුව',
            mm: 'මිනිත්තු %d',
            h: 'පැය',
            hh: 'පැය %d',
            d: 'දිනය',
            dd: 'දින %d',
            M: 'මාසය',
            MM: 'මාස %d',
            y: 'වසර',
            yy: 'වසර %d',
        },
        dayOfMonthOrdinalParse: /\d{1,2} වැනි/,
        ordinal: function (number) {
            return number + ' වැනි';
        },
        meridiemParse: /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./,
        isPM: function (input) {
            return input === 'ප.ව.' || input === 'පස් වරු';
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours > 11) {
                return isLower ? 'ප.ව.' : 'පස් වරු';
            } else {
                return isLower ? 'පෙ.ව.' : 'පෙර වරු';
            }
        },
    });

    return si;

})));
//! moment.js locale configuration
//! locale : Slovak [sk]
//! author : Martin Minka : https://github.com/k2s
//! based on work of petrbela : https://github.com/petrbela

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var months =
            'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split(
                '_'
            ),
        monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_');
    function plural(n) {
        return n > 1 && n < 5;
    }
    function translate(number, withoutSuffix, key, isFuture) {
        var result = number + ' ';
        switch (key) {
            case 's': // a few seconds / in a few seconds / a few seconds ago
                return withoutSuffix || isFuture ? 'pár sekúnd' : 'pár sekundami';
            case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago
                if (withoutSuffix || isFuture) {
                    return result + (plural(number) ? 'sekundy' : 'sekúnd');
                } else {
                    return result + 'sekundami';
                }
            case 'm': // a minute / in a minute / a minute ago
                return withoutSuffix ? 'minúta' : isFuture ? 'minútu' : 'minútou';
            case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
                if (withoutSuffix || isFuture) {
                    return result + (plural(number) ? 'minúty' : 'minút');
                } else {
                    return result + 'minútami';
                }
            case 'h': // an hour / in an hour / an hour ago
                return withoutSuffix ? 'hodina' : isFuture ? 'hodinu' : 'hodinou';
            case 'hh': // 9 hours / in 9 hours / 9 hours ago
                if (withoutSuffix || isFuture) {
                    return result + (plural(number) ? 'hodiny' : 'hodín');
                } else {
                    return result + 'hodinami';
                }
            case 'd': // a day / in a day / a day ago
                return withoutSuffix || isFuture ? 'deň' : 'dňom';
            case 'dd': // 9 days / in 9 days / 9 days ago
                if (withoutSuffix || isFuture) {
                    return result + (plural(number) ? 'dni' : 'dní');
                } else {
                    return result + 'dňami';
                }
            case 'M': // a month / in a month / a month ago
                return withoutSuffix || isFuture ? 'mesiac' : 'mesiacom';
            case 'MM': // 9 months / in 9 months / 9 months ago
                if (withoutSuffix || isFuture) {
                    return result + (plural(number) ? 'mesiace' : 'mesiacov');
                } else {
                    return result + 'mesiacmi';
                }
            case 'y': // a year / in a year / a year ago
                return withoutSuffix || isFuture ? 'rok' : 'rokom';
            case 'yy': // 9 years / in 9 years / 9 years ago
                if (withoutSuffix || isFuture) {
                    return result + (plural(number) ? 'roky' : 'rokov');
                } else {
                    return result + 'rokmi';
                }
        }
    }

    var sk = moment.defineLocale('sk', {
        months: months,
        monthsShort: monthsShort,
        weekdays: 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'),
        weekdaysShort: 'ne_po_ut_st_št_pi_so'.split('_'),
        weekdaysMin: 'ne_po_ut_st_št_pi_so'.split('_'),
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY H:mm',
            LLLL: 'dddd D. MMMM YYYY H:mm',
        },
        calendar: {
            sameDay: '[dnes o] LT',
            nextDay: '[zajtra o] LT',
            nextWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[v nedeľu o] LT';
                    case 1:
                    case 2:
                        return '[v] dddd [o] LT';
                    case 3:
                        return '[v stredu o] LT';
                    case 4:
                        return '[vo štvrtok o] LT';
                    case 5:
                        return '[v piatok o] LT';
                    case 6:
                        return '[v sobotu o] LT';
                }
            },
            lastDay: '[včera o] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[minulú nedeľu o] LT';
                    case 1:
                    case 2:
                        return '[minulý] dddd [o] LT';
                    case 3:
                        return '[minulú stredu o] LT';
                    case 4:
                    case 5:
                        return '[minulý] dddd [o] LT';
                    case 6:
                        return '[minulú sobotu o] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'za %s',
            past: 'pred %s',
            s: translate,
            ss: translate,
            m: translate,
            mm: translate,
            h: translate,
            hh: translate,
            d: translate,
            dd: translate,
            M: translate,
            MM: translate,
            y: translate,
            yy: translate,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return sk;

})));
//! moment.js locale configuration
//! locale : Slovenian [sl]
//! author : Robert Sedovšek : https://github.com/sedovsek

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    function processRelativeTime(number, withoutSuffix, key, isFuture) {
        var result = number + ' ';
        switch (key) {
            case 's':
                return withoutSuffix || isFuture
                    ? 'nekaj sekund'
                    : 'nekaj sekundami';
            case 'ss':
                if (number === 1) {
                    result += withoutSuffix ? 'sekundo' : 'sekundi';
                } else if (number === 2) {
                    result += withoutSuffix || isFuture ? 'sekundi' : 'sekundah';
                } else if (number < 5) {
                    result += withoutSuffix || isFuture ? 'sekunde' : 'sekundah';
                } else {
                    result += 'sekund';
                }
                return result;
            case 'm':
                return withoutSuffix ? 'ena minuta' : 'eno minuto';
            case 'mm':
                if (number === 1) {
                    result += withoutSuffix ? 'minuta' : 'minuto';
                } else if (number === 2) {
                    result += withoutSuffix || isFuture ? 'minuti' : 'minutama';
                } else if (number < 5) {
                    result += withoutSuffix || isFuture ? 'minute' : 'minutami';
                } else {
                    result += withoutSuffix || isFuture ? 'minut' : 'minutami';
                }
                return result;
            case 'h':
                return withoutSuffix ? 'ena ura' : 'eno uro';
            case 'hh':
                if (number === 1) {
                    result += withoutSuffix ? 'ura' : 'uro';
                } else if (number === 2) {
                    result += withoutSuffix || isFuture ? 'uri' : 'urama';
                } else if (number < 5) {
                    result += withoutSuffix || isFuture ? 'ure' : 'urami';
                } else {
                    result += withoutSuffix || isFuture ? 'ur' : 'urami';
                }
                return result;
            case 'd':
                return withoutSuffix || isFuture ? 'en dan' : 'enim dnem';
            case 'dd':
                if (number === 1) {
                    result += withoutSuffix || isFuture ? 'dan' : 'dnem';
                } else if (number === 2) {
                    result += withoutSuffix || isFuture ? 'dni' : 'dnevoma';
                } else {
                    result += withoutSuffix || isFuture ? 'dni' : 'dnevi';
                }
                return result;
            case 'M':
                return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem';
            case 'MM':
                if (number === 1) {
                    result += withoutSuffix || isFuture ? 'mesec' : 'mesecem';
                } else if (number === 2) {
                    result += withoutSuffix || isFuture ? 'meseca' : 'mesecema';
                } else if (number < 5) {
                    result += withoutSuffix || isFuture ? 'mesece' : 'meseci';
                } else {
                    result += withoutSuffix || isFuture ? 'mesecev' : 'meseci';
                }
                return result;
            case 'y':
                return withoutSuffix || isFuture ? 'eno leto' : 'enim letom';
            case 'yy':
                if (number === 1) {
                    result += withoutSuffix || isFuture ? 'leto' : 'letom';
                } else if (number === 2) {
                    result += withoutSuffix || isFuture ? 'leti' : 'letoma';
                } else if (number < 5) {
                    result += withoutSuffix || isFuture ? 'leta' : 'leti';
                } else {
                    result += withoutSuffix || isFuture ? 'let' : 'leti';
                }
                return result;
        }
    }

    var sl = moment.defineLocale('sl', {
        months: 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split(
            '_'
        ),
        monthsShort:
            'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'),
        weekdaysShort: 'ned._pon._tor._sre._čet._pet._sob.'.split('_'),
        weekdaysMin: 'ne_po_to_sr_če_pe_so'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD. MM. YYYY',
            LL: 'D. MMMM YYYY',
            LLL: 'D. MMMM YYYY H:mm',
            LLLL: 'dddd, D. MMMM YYYY H:mm',
        },
        calendar: {
            sameDay: '[danes ob] LT',
            nextDay: '[jutri ob] LT',

            nextWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[v] [nedeljo] [ob] LT';
                    case 3:
                        return '[v] [sredo] [ob] LT';
                    case 6:
                        return '[v] [soboto] [ob] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[v] dddd [ob] LT';
                }
            },
            lastDay: '[včeraj ob] LT',
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[prejšnjo] [nedeljo] [ob] LT';
                    case 3:
                        return '[prejšnjo] [sredo] [ob] LT';
                    case 6:
                        return '[prejšnjo] [soboto] [ob] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[prejšnji] dddd [ob] LT';
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'čez %s',
            past: 'pred %s',
            s: processRelativeTime,
            ss: processRelativeTime,
            m: processRelativeTime,
            mm: processRelativeTime,
            h: processRelativeTime,
            hh: processRelativeTime,
            d: processRelativeTime,
            dd: processRelativeTime,
            M: processRelativeTime,
            MM: processRelativeTime,
            y: processRelativeTime,
            yy: processRelativeTime,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    return sl;

})));
//! moment.js locale configuration
//! locale : Albanian [sq]
//! author : Flakërim Ismani : https://github.com/flakerimi
//! author : Menelion Elensúle : https://github.com/Oire
//! author : Oerd Cukalla : https://github.com/oerd

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var sq = moment.defineLocale('sq', {
        months: 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split(
            '_'
        ),
        monthsShort: 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'),
        weekdays: 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split(
            '_'
        ),
        weekdaysShort: 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'),
        weekdaysMin: 'D_H_Ma_Më_E_P_Sh'.split('_'),
        weekdaysParseExact: true,
        meridiemParse: /PD|MD/,
        isPM: function (input) {
            return input.charAt(0) === 'M';
        },
        meridiem: function (hours, minutes, isLower) {
            return hours < 12 ? 'PD' : 'MD';
        },
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Sot në] LT',
            nextDay: '[Nesër në] LT',
            nextWeek: 'dddd [në] LT',
            lastDay: '[Dje në] LT',
            lastWeek: 'dddd [e kaluar në] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'në %s',
            past: '%s më parë',
            s: 'disa sekonda',
            ss: '%d sekonda',
            m: 'një minutë',
            mm: '%d minuta',
            h: 'një orë',
            hh: '%d orë',
            d: 'një ditë',
            dd: '%d ditë',
            M: 'një muaj',
            MM: '%d muaj',
            y: 'një vit',
            yy: '%d vite',
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return sq;

})));
//! moment.js locale configuration
//! locale : Serbian Cyrillic [sr-cyrl]
//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
//! author : Stefan Crnjaković <stefan@hotmail.rs> : https://github.com/crnjakovic

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var translator = {
        words: {
            //Different grammatical cases
            ss: ['секунда', 'секунде', 'секунди'],
            m: ['један минут', 'једног минута'],
            mm: ['минут', 'минута', 'минута'],
            h: ['један сат', 'једног сата'],
            hh: ['сат', 'сата', 'сати'],
            d: ['један дан', 'једног дана'],
            dd: ['дан', 'дана', 'дана'],
            M: ['један месец', 'једног месеца'],
            MM: ['месец', 'месеца', 'месеци'],
            y: ['једну годину', 'једне године'],
            yy: ['годину', 'године', 'година'],
        },
        correctGrammaticalCase: function (number, wordKey) {
            if (
                number % 10 >= 1 &&
                number % 10 <= 4 &&
                (number % 100 < 10 || number % 100 >= 20)
            ) {
                return number % 10 === 1 ? wordKey[0] : wordKey[1];
            }
            return wordKey[2];
        },
        translate: function (number, withoutSuffix, key, isFuture) {
            var wordKey = translator.words[key],
                word;

            if (key.length === 1) {
                // Nominativ
                if (key === 'y' && withoutSuffix) return 'једна година';
                return isFuture || withoutSuffix ? wordKey[0] : wordKey[1];
            }

            word = translator.correctGrammaticalCase(number, wordKey);
            // Nominativ
            if (key === 'yy' && withoutSuffix && word === 'годину') {
                return number + ' година';
            }

            return number + ' ' + word;
        },
    };

    var srCyrl = moment.defineLocale('sr-cyrl', {
        months: 'јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар'.split(
            '_'
        ),
        monthsShort:
            'јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.'.split('_'),
        monthsParseExact: true,
        weekdays: 'недеља_понедељак_уторак_среда_четвртак_петак_субота'.split('_'),
        weekdaysShort: 'нед._пон._уто._сре._чет._пет._суб.'.split('_'),
        weekdaysMin: 'не_по_ут_ср_че_пе_су'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'D. M. YYYY.',
            LL: 'D. MMMM YYYY.',
            LLL: 'D. MMMM YYYY. H:mm',
            LLLL: 'dddd, D. MMMM YYYY. H:mm',
        },
        calendar: {
            sameDay: '[данас у] LT',
            nextDay: '[сутра у] LT',
            nextWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[у] [недељу] [у] LT';
                    case 3:
                        return '[у] [среду] [у] LT';
                    case 6:
                        return '[у] [суботу] [у] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[у] dddd [у] LT';
                }
            },
            lastDay: '[јуче у] LT',
            lastWeek: function () {
                var lastWeekDays = [
                    '[прошле] [недеље] [у] LT',
                    '[прошлог] [понедељка] [у] LT',
                    '[прошлог] [уторка] [у] LT',
                    '[прошле] [среде] [у] LT',
                    '[прошлог] [четвртка] [у] LT',
                    '[прошлог] [петка] [у] LT',
                    '[прошле] [суботе] [у] LT',
                ];
                return lastWeekDays[this.day()];
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'за %s',
            past: 'пре %s',
            s: 'неколико секунди',
            ss: translator.translate,
            m: translator.translate,
            mm: translator.translate,
            h: translator.translate,
            hh: translator.translate,
            d: translator.translate,
            dd: translator.translate,
            M: translator.translate,
            MM: translator.translate,
            y: translator.translate,
            yy: translator.translate,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 1st is the first week of the year.
        },
    });

    return srCyrl;

})));
//! moment.js locale configuration
//! locale : Serbian [sr]
//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
//! author : Stefan Crnjaković <stefan@hotmail.rs> : https://github.com/crnjakovic

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var translator = {
        words: {
            //Different grammatical cases
            ss: ['sekunda', 'sekunde', 'sekundi'],
            m: ['jedan minut', 'jednog minuta'],
            mm: ['minut', 'minuta', 'minuta'],
            h: ['jedan sat', 'jednog sata'],
            hh: ['sat', 'sata', 'sati'],
            d: ['jedan dan', 'jednog dana'],
            dd: ['dan', 'dana', 'dana'],
            M: ['jedan mesec', 'jednog meseca'],
            MM: ['mesec', 'meseca', 'meseci'],
            y: ['jednu godinu', 'jedne godine'],
            yy: ['godinu', 'godine', 'godina'],
        },
        correctGrammaticalCase: function (number, wordKey) {
            if (
                number % 10 >= 1 &&
                number % 10 <= 4 &&
                (number % 100 < 10 || number % 100 >= 20)
            ) {
                return number % 10 === 1 ? wordKey[0] : wordKey[1];
            }
            return wordKey[2];
        },
        translate: function (number, withoutSuffix, key, isFuture) {
            var wordKey = translator.words[key],
                word;

            if (key.length === 1) {
                // Nominativ
                if (key === 'y' && withoutSuffix) return 'jedna godina';
                return isFuture || withoutSuffix ? wordKey[0] : wordKey[1];
            }

            word = translator.correctGrammaticalCase(number, wordKey);
            // Nominativ
            if (key === 'yy' && withoutSuffix && word === 'godinu') {
                return number + ' godina';
            }

            return number + ' ' + word;
        },
    };

    var sr = moment.defineLocale('sr', {
        months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split(
            '_'
        ),
        monthsShort:
            'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),
        monthsParseExact: true,
        weekdays: 'nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota'.split(
            '_'
        ),
        weekdaysShort: 'ned._pon._uto._sre._čet._pet._sub.'.split('_'),
        weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'D. M. YYYY.',
            LL: 'D. MMMM YYYY.',
            LLL: 'D. MMMM YYYY. H:mm',
            LLLL: 'dddd, D. MMMM YYYY. H:mm',
        },
        calendar: {
            sameDay: '[danas u] LT',
            nextDay: '[sutra u] LT',
            nextWeek: function () {
                switch (this.day()) {
                    case 0:
                        return '[u] [nedelju] [u] LT';
                    case 3:
                        return '[u] [sredu] [u] LT';
                    case 6:
                        return '[u] [subotu] [u] LT';
                    case 1:
                    case 2:
                    case 4:
                    case 5:
                        return '[u] dddd [u] LT';
                }
            },
            lastDay: '[juče u] LT',
            lastWeek: function () {
                var lastWeekDays = [
                    '[prošle] [nedelje] [u] LT',
                    '[prošlog] [ponedeljka] [u] LT',
                    '[prošlog] [utorka] [u] LT',
                    '[prošle] [srede] [u] LT',
                    '[prošlog] [četvrtka] [u] LT',
                    '[prošlog] [petka] [u] LT',
                    '[prošle] [subote] [u] LT',
                ];
                return lastWeekDays[this.day()];
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'za %s',
            past: 'pre %s',
            s: 'nekoliko sekundi',
            ss: translator.translate,
            m: translator.translate,
            mm: translator.translate,
            h: translator.translate,
            hh: translator.translate,
            d: translator.translate,
            dd: translator.translate,
            M: translator.translate,
            MM: translator.translate,
            y: translator.translate,
            yy: translator.translate,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    return sr;

})));
//! moment.js locale configuration
//! locale : siSwati [ss]
//! author : Nicolai Davies<mail@nicolai.io> : https://github.com/nicolaidavies

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var ss = moment.defineLocale('ss', {
        months: "Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split(
            '_'
        ),
        monthsShort: 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'),
        weekdays:
            'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split(
                '_'
            ),
        weekdaysShort: 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'),
        weekdaysMin: 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'h:mm A',
            LTS: 'h:mm:ss A',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY h:mm A',
            LLLL: 'dddd, D MMMM YYYY h:mm A',
        },
        calendar: {
            sameDay: '[Namuhla nga] LT',
            nextDay: '[Kusasa nga] LT',
            nextWeek: 'dddd [nga] LT',
            lastDay: '[Itolo nga] LT',
            lastWeek: 'dddd [leliphelile] [nga] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'nga %s',
            past: 'wenteka nga %s',
            s: 'emizuzwana lomcane',
            ss: '%d mzuzwana',
            m: 'umzuzu',
            mm: '%d emizuzu',
            h: 'lihora',
            hh: '%d emahora',
            d: 'lilanga',
            dd: '%d emalanga',
            M: 'inyanga',
            MM: '%d tinyanga',
            y: 'umnyaka',
            yy: '%d iminyaka',
        },
        meridiemParse: /ekuseni|emini|entsambama|ebusuku/,
        meridiem: function (hours, minutes, isLower) {
            if (hours < 11) {
                return 'ekuseni';
            } else if (hours < 15) {
                return 'emini';
            } else if (hours < 19) {
                return 'entsambama';
            } else {
                return 'ebusuku';
            }
        },
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'ekuseni') {
                return hour;
            } else if (meridiem === 'emini') {
                return hour >= 11 ? hour : hour + 12;
            } else if (meridiem === 'entsambama' || meridiem === 'ebusuku') {
                if (hour === 0) {
                    return 0;
                }
                return hour + 12;
            }
        },
        dayOfMonthOrdinalParse: /\d{1,2}/,
        ordinal: '%d',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return ss;

})));
//! moment.js locale configuration
//! locale : Swedish [sv]
//! author : Jens Alm : https://github.com/ulmus

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var sv = moment.defineLocale('sv', {
        months: 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split(
            '_'
        ),
        monthsShort: 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
        weekdays: 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'),
        weekdaysShort: 'sön_mån_tis_ons_tor_fre_lör'.split('_'),
        weekdaysMin: 'sö_må_ti_on_to_fr_lö'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY-MM-DD',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY [kl.] HH:mm',
            LLLL: 'dddd D MMMM YYYY [kl.] HH:mm',
            lll: 'D MMM YYYY HH:mm',
            llll: 'ddd D MMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Idag] LT',
            nextDay: '[Imorgon] LT',
            lastDay: '[Igår] LT',
            nextWeek: '[På] dddd LT',
            lastWeek: '[I] dddd[s] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'om %s',
            past: 'för %s sedan',
            s: 'några sekunder',
            ss: '%d sekunder',
            m: 'en minut',
            mm: '%d minuter',
            h: 'en timme',
            hh: '%d timmar',
            d: 'en dag',
            dd: '%d dagar',
            M: 'en månad',
            MM: '%d månader',
            y: 'ett år',
            yy: '%d år',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(\:e|\:a)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? ':e'
                        : b === 1
                        ? ':a'
                        : b === 2
                        ? ':a'
                        : b === 3
                        ? ':e'
                        : ':e';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return sv;

})));
//! moment.js locale configuration
//! locale : Swahili [sw]
//! author : Fahad Kassim : https://github.com/fadsel

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var sw = moment.defineLocale('sw', {
        months: 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split(
            '_'
        ),
        monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'),
        weekdays:
            'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split(
                '_'
            ),
        weekdaysShort: 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'),
        weekdaysMin: 'J2_J3_J4_J5_Al_Ij_J1'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'hh:mm A',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[leo saa] LT',
            nextDay: '[kesho saa] LT',
            nextWeek: '[wiki ijayo] dddd [saat] LT',
            lastDay: '[jana] LT',
            lastWeek: '[wiki iliyopita] dddd [saat] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s baadaye',
            past: 'tokea %s',
            s: 'hivi punde',
            ss: 'sekunde %d',
            m: 'dakika moja',
            mm: 'dakika %d',
            h: 'saa limoja',
            hh: 'masaa %d',
            d: 'siku moja',
            dd: 'siku %d',
            M: 'mwezi mmoja',
            MM: 'miezi %d',
            y: 'mwaka mmoja',
            yy: 'miaka %d',
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    return sw;

})));
//! moment.js locale configuration
//! locale : Tamil [ta]
//! author : Arjunkumar Krishnamoorthy : https://github.com/tk120404

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var symbolMap = {
            1: '௧',
            2: '௨',
            3: '௩',
            4: '௪',
            5: '௫',
            6: '௬',
            7: '௭',
            8: '௮',
            9: '௯',
            0: '௦',
        },
        numberMap = {
            '௧': '1',
            '௨': '2',
            '௩': '3',
            '௪': '4',
            '௫': '5',
            '௬': '6',
            '௭': '7',
            '௮': '8',
            '௯': '9',
            '௦': '0',
        };

    var ta = moment.defineLocale('ta', {
        months: 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split(
            '_'
        ),
        monthsShort:
            'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split(
                '_'
            ),
        weekdays:
            'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split(
                '_'
            ),
        weekdaysShort: 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split(
            '_'
        ),
        weekdaysMin: 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, HH:mm',
            LLLL: 'dddd, D MMMM YYYY, HH:mm',
        },
        calendar: {
            sameDay: '[இன்று] LT',
            nextDay: '[நாளை] LT',
            nextWeek: 'dddd, LT',
            lastDay: '[நேற்று] LT',
            lastWeek: '[கடந்த வாரம்] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s இல்',
            past: '%s முன்',
            s: 'ஒரு சில விநாடிகள்',
            ss: '%d விநாடிகள்',
            m: 'ஒரு நிமிடம்',
            mm: '%d நிமிடங்கள்',
            h: 'ஒரு மணி நேரம்',
            hh: '%d மணி நேரம்',
            d: 'ஒரு நாள்',
            dd: '%d நாட்கள்',
            M: 'ஒரு மாதம்',
            MM: '%d மாதங்கள்',
            y: 'ஒரு வருடம்',
            yy: '%d ஆண்டுகள்',
        },
        dayOfMonthOrdinalParse: /\d{1,2}வது/,
        ordinal: function (number) {
            return number + 'வது';
        },
        preparse: function (string) {
            return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) {
                return numberMap[match];
            });
        },
        postformat: function (string) {
            return string.replace(/\d/g, function (match) {
                return symbolMap[match];
            });
        },
        // refer http://ta.wikipedia.org/s/1er1
        meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/,
        meridiem: function (hour, minute, isLower) {
            if (hour < 2) {
                return ' யாமம்';
            } else if (hour < 6) {
                return ' வைகறை'; // வைகறை
            } else if (hour < 10) {
                return ' காலை'; // காலை
            } else if (hour < 14) {
                return ' நண்பகல்'; // நண்பகல்
            } else if (hour < 18) {
                return ' எற்பாடு'; // எற்பாடு
            } else if (hour < 22) {
                return ' மாலை'; // மாலை
            } else {
                return ' யாமம்';
            }
        },
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'யாமம்') {
                return hour < 2 ? hour : hour + 12;
            } else if (meridiem === 'வைகறை' || meridiem === 'காலை') {
                return hour;
            } else if (meridiem === 'நண்பகல்') {
                return hour >= 10 ? hour : hour + 12;
            } else {
                return hour + 12;
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    return ta;

})));
//! moment.js locale configuration
//! locale : Telugu [te]
//! author : Krishna Chaitanya Thota : https://github.com/kcthota

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var te = moment.defineLocale('te', {
        months: 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జులై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split(
            '_'
        ),
        monthsShort:
            'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జులై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays:
            'ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం'.split(
                '_'
            ),
        weekdaysShort: 'ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని'.split('_'),
        weekdaysMin: 'ఆ_సో_మం_బు_గు_శు_శ'.split('_'),
        longDateFormat: {
            LT: 'A h:mm',
            LTS: 'A h:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY, A h:mm',
            LLLL: 'dddd, D MMMM YYYY, A h:mm',
        },
        calendar: {
            sameDay: '[నేడు] LT',
            nextDay: '[రేపు] LT',
            nextWeek: 'dddd, LT',
            lastDay: '[నిన్న] LT',
            lastWeek: '[గత] dddd, LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s లో',
            past: '%s క్రితం',
            s: 'కొన్ని క్షణాలు',
            ss: '%d సెకన్లు',
            m: 'ఒక నిమిషం',
            mm: '%d నిమిషాలు',
            h: 'ఒక గంట',
            hh: '%d గంటలు',
            d: 'ఒక రోజు',
            dd: '%d రోజులు',
            M: 'ఒక నెల',
            MM: '%d నెలలు',
            y: 'ఒక సంవత్సరం',
            yy: '%d సంవత్సరాలు',
        },
        dayOfMonthOrdinalParse: /\d{1,2}వ/,
        ordinal: '%dవ',
        meridiemParse: /రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'రాత్రి') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'ఉదయం') {
                return hour;
            } else if (meridiem === 'మధ్యాహ్నం') {
                return hour >= 10 ? hour : hour + 12;
            } else if (meridiem === 'సాయంత్రం') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'రాత్రి';
            } else if (hour < 10) {
                return 'ఉదయం';
            } else if (hour < 17) {
                return 'మధ్యాహ్నం';
            } else if (hour < 20) {
                return 'సాయంత్రం';
            } else {
                return 'రాత్రి';
            }
        },
        week: {
            dow: 0, // Sunday is the first day of the week.
            doy: 6, // The week that contains Jan 6th is the first week of the year.
        },
    });

    return te;

})));
//! moment.js locale configuration
//! locale : Tetun Dili (East Timor) [tet]
//! author : Joshua Brooks : https://github.com/joshbrooks
//! author : Onorio De J. Afonso : https://github.com/marobo
//! author : Sonia Simoes : https://github.com/soniasimoes

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var tet = moment.defineLocale('tet', {
        months: 'Janeiru_Fevereiru_Marsu_Abril_Maiu_Juñu_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru'.split(
            '_'
        ),
        monthsShort: 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),
        weekdays: 'Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu'.split('_'),
        weekdaysShort: 'Dom_Seg_Ters_Kua_Kint_Sest_Sab'.split('_'),
        weekdaysMin: 'Do_Seg_Te_Ku_Ki_Ses_Sa'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Ohin iha] LT',
            nextDay: '[Aban iha] LT',
            nextWeek: 'dddd [iha] LT',
            lastDay: '[Horiseik iha] LT',
            lastWeek: 'dddd [semana kotuk] [iha] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'iha %s',
            past: '%s liuba',
            s: 'segundu balun',
            ss: 'segundu %d',
            m: 'minutu ida',
            mm: 'minutu %d',
            h: 'oras ida',
            hh: 'oras %d',
            d: 'loron ida',
            dd: 'loron %d',
            M: 'fulan ida',
            MM: 'fulan %d',
            y: 'tinan ida',
            yy: 'tinan %d',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return tet;

})));
//! moment.js locale configuration
//! locale : Tajik [tg]
//! author : Orif N. Jr. : https://github.com/orif-jr

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var suffixes = {
        0: '-ум',
        1: '-ум',
        2: '-юм',
        3: '-юм',
        4: '-ум',
        5: '-ум',
        6: '-ум',
        7: '-ум',
        8: '-ум',
        9: '-ум',
        10: '-ум',
        12: '-ум',
        13: '-ум',
        20: '-ум',
        30: '-юм',
        40: '-ум',
        50: '-ум',
        60: '-ум',
        70: '-ум',
        80: '-ум',
        90: '-ум',
        100: '-ум',
    };

    var tg = moment.defineLocale('tg', {
        months: {
            format: 'январи_феврали_марти_апрели_майи_июни_июли_августи_сентябри_октябри_ноябри_декабри'.split(
                '_'
            ),
            standalone:
                'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split(
                    '_'
                ),
        },
        monthsShort: 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),
        weekdays: 'якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе'.split(
            '_'
        ),
        weekdaysShort: 'яшб_дшб_сшб_чшб_пшб_ҷум_шнб'.split('_'),
        weekdaysMin: 'яш_дш_сш_чш_пш_ҷм_шб'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Имрӯз соати] LT',
            nextDay: '[Фардо соати] LT',
            lastDay: '[Дирӯз соати] LT',
            nextWeek: 'dddd[и] [ҳафтаи оянда соати] LT',
            lastWeek: 'dddd[и] [ҳафтаи гузашта соати] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'баъди %s',
            past: '%s пеш',
            s: 'якчанд сония',
            m: 'як дақиқа',
            mm: '%d дақиқа',
            h: 'як соат',
            hh: '%d соат',
            d: 'як рӯз',
            dd: '%d рӯз',
            M: 'як моҳ',
            MM: '%d моҳ',
            y: 'як сол',
            yy: '%d сол',
        },
        meridiemParse: /шаб|субҳ|рӯз|бегоҳ/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === 'шаб') {
                return hour < 4 ? hour : hour + 12;
            } else if (meridiem === 'субҳ') {
                return hour;
            } else if (meridiem === 'рӯз') {
                return hour >= 11 ? hour : hour + 12;
            } else if (meridiem === 'бегоҳ') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'шаб';
            } else if (hour < 11) {
                return 'субҳ';
            } else if (hour < 16) {
                return 'рӯз';
            } else if (hour < 19) {
                return 'бегоҳ';
            } else {
                return 'шаб';
            }
        },
        dayOfMonthOrdinalParse: /\d{1,2}-(ум|юм)/,
        ordinal: function (number) {
            var a = number % 10,
                b = number >= 100 ? 100 : null;
            return number + (suffixes[number] || suffixes[a] || suffixes[b]);
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 1th is the first week of the year.
        },
    });

    return tg;

})));
//! moment.js locale configuration
//! locale : Thai [th]
//! author : Kridsada Thanabulpong : https://github.com/sirn

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var th = moment.defineLocale('th', {
        months: 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split(
            '_'
        ),
        monthsShort:
            'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'),
        weekdaysShort: 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference
        weekdaysMin: 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'H:mm',
            LTS: 'H:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY เวลา H:mm',
            LLLL: 'วันddddที่ D MMMM YYYY เวลา H:mm',
        },
        meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/,
        isPM: function (input) {
            return input === 'หลังเที่ยง';
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'ก่อนเที่ยง';
            } else {
                return 'หลังเที่ยง';
            }
        },
        calendar: {
            sameDay: '[วันนี้ เวลา] LT',
            nextDay: '[พรุ่งนี้ เวลา] LT',
            nextWeek: 'dddd[หน้า เวลา] LT',
            lastDay: '[เมื่อวานนี้ เวลา] LT',
            lastWeek: '[วัน]dddd[ที่แล้ว เวลา] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'อีก %s',
            past: '%sที่แล้ว',
            s: 'ไม่กี่วินาที',
            ss: '%d วินาที',
            m: '1 นาที',
            mm: '%d นาที',
            h: '1 ชั่วโมง',
            hh: '%d ชั่วโมง',
            d: '1 วัน',
            dd: '%d วัน',
            w: '1 สัปดาห์',
            ww: '%d สัปดาห์',
            M: '1 เดือน',
            MM: '%d เดือน',
            y: '1 ปี',
            yy: '%d ปี',
        },
    });

    return th;

})));
//! moment.js locale configuration
//! locale : Turkmen [tk]
//! author : Atamyrat Abdyrahmanov : https://github.com/atamyratabdy

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var suffixes = {
        1: "'inji",
        5: "'inji",
        8: "'inji",
        70: "'inji",
        80: "'inji",
        2: "'nji",
        7: "'nji",
        20: "'nji",
        50: "'nji",
        3: "'ünji",
        4: "'ünji",
        100: "'ünji",
        6: "'njy",
        9: "'unjy",
        10: "'unjy",
        30: "'unjy",
        60: "'ynjy",
        90: "'ynjy",
    };

    var tk = moment.defineLocale('tk', {
        months: 'Ýanwar_Fewral_Mart_Aprel_Maý_Iýun_Iýul_Awgust_Sentýabr_Oktýabr_Noýabr_Dekabr'.split(
            '_'
        ),
        monthsShort: 'Ýan_Few_Mar_Apr_Maý_Iýn_Iýl_Awg_Sen_Okt_Noý_Dek'.split('_'),
        weekdays: 'Ýekşenbe_Duşenbe_Sişenbe_Çarşenbe_Penşenbe_Anna_Şenbe'.split(
            '_'
        ),
        weekdaysShort: 'Ýek_Duş_Siş_Çar_Pen_Ann_Şen'.split('_'),
        weekdaysMin: 'Ýk_Dş_Sş_Çr_Pn_An_Şn'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[bugün sagat] LT',
            nextDay: '[ertir sagat] LT',
            nextWeek: '[indiki] dddd [sagat] LT',
            lastDay: '[düýn] LT',
            lastWeek: '[geçen] dddd [sagat] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s soň',
            past: '%s öň',
            s: 'birnäçe sekunt',
            m: 'bir minut',
            mm: '%d minut',
            h: 'bir sagat',
            hh: '%d sagat',
            d: 'bir gün',
            dd: '%d gün',
            M: 'bir aý',
            MM: '%d aý',
            y: 'bir ýyl',
            yy: '%d ýyl',
        },
        ordinal: function (number, period) {
            switch (period) {
                case 'd':
                case 'D':
                case 'Do':
                case 'DD':
                    return number;
                default:
                    if (number === 0) {
                        // special case for zero
                        return number + "'unjy";
                    }
                    var a = number % 10,
                        b = (number % 100) - a,
                        c = number >= 100 ? 100 : null;
                    return number + (suffixes[a] || suffixes[b] || suffixes[c]);
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    return tk;

})));
//! moment.js locale configuration
//! locale : Tagalog (Philippines) [tl-ph]
//! author : Dan Hagman : https://github.com/hagmandan

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var tlPh = moment.defineLocale('tl-ph', {
        months: 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split(
            '_'
        ),
        monthsShort: 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),
        weekdays: 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split(
            '_'
        ),
        weekdaysShort: 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'),
        weekdaysMin: 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'MM/D/YYYY',
            LL: 'MMMM D, YYYY',
            LLL: 'MMMM D, YYYY HH:mm',
            LLLL: 'dddd, MMMM DD, YYYY HH:mm',
        },
        calendar: {
            sameDay: 'LT [ngayong araw]',
            nextDay: '[Bukas ng] LT',
            nextWeek: 'LT [sa susunod na] dddd',
            lastDay: 'LT [kahapon]',
            lastWeek: 'LT [noong nakaraang] dddd',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'sa loob ng %s',
            past: '%s ang nakalipas',
            s: 'ilang segundo',
            ss: '%d segundo',
            m: 'isang minuto',
            mm: '%d minuto',
            h: 'isang oras',
            hh: '%d oras',
            d: 'isang araw',
            dd: '%d araw',
            M: 'isang buwan',
            MM: '%d buwan',
            y: 'isang taon',
            yy: '%d taon',
        },
        dayOfMonthOrdinalParse: /\d{1,2}/,
        ordinal: function (number) {
            return number;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return tlPh;

})));
//! moment.js locale configuration
//! locale : Klingon [tlh]
//! author : Dominika Kruk : https://github.com/amaranthrose

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var numbersNouns = 'pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut'.split('_');

    function translateFuture(output) {
        var time = output;
        time =
            output.indexOf('jaj') !== -1
                ? time.slice(0, -3) + 'leS'
                : output.indexOf('jar') !== -1
                ? time.slice(0, -3) + 'waQ'
                : output.indexOf('DIS') !== -1
                ? time.slice(0, -3) + 'nem'
                : time + ' pIq';
        return time;
    }

    function translatePast(output) {
        var time = output;
        time =
            output.indexOf('jaj') !== -1
                ? time.slice(0, -3) + 'Hu’'
                : output.indexOf('jar') !== -1
                ? time.slice(0, -3) + 'wen'
                : output.indexOf('DIS') !== -1
                ? time.slice(0, -3) + 'ben'
                : time + ' ret';
        return time;
    }

    function translate(number, withoutSuffix, string, isFuture) {
        var numberNoun = numberAsNoun(number);
        switch (string) {
            case 'ss':
                return numberNoun + ' lup';
            case 'mm':
                return numberNoun + ' tup';
            case 'hh':
                return numberNoun + ' rep';
            case 'dd':
                return numberNoun + ' jaj';
            case 'MM':
                return numberNoun + ' jar';
            case 'yy':
                return numberNoun + ' DIS';
        }
    }

    function numberAsNoun(number) {
        var hundred = Math.floor((number % 1000) / 100),
            ten = Math.floor((number % 100) / 10),
            one = number % 10,
            word = '';
        if (hundred > 0) {
            word += numbersNouns[hundred] + 'vatlh';
        }
        if (ten > 0) {
            word += (word !== '' ? ' ' : '') + numbersNouns[ten] + 'maH';
        }
        if (one > 0) {
            word += (word !== '' ? ' ' : '') + numbersNouns[one];
        }
        return word === '' ? 'pagh' : word;
    }

    var tlh = moment.defineLocale('tlh', {
        months: 'tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’'.split(
            '_'
        ),
        monthsShort:
            'jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split(
            '_'
        ),
        weekdaysShort:
            'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),
        weekdaysMin:
            'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[DaHjaj] LT',
            nextDay: '[wa’leS] LT',
            nextWeek: 'LLL',
            lastDay: '[wa’Hu’] LT',
            lastWeek: 'LLL',
            sameElse: 'L',
        },
        relativeTime: {
            future: translateFuture,
            past: translatePast,
            s: 'puS lup',
            ss: translate,
            m: 'wa’ tup',
            mm: translate,
            h: 'wa’ rep',
            hh: translate,
            d: 'wa’ jaj',
            dd: translate,
            M: 'wa’ jar',
            MM: translate,
            y: 'wa’ DIS',
            yy: translate,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return tlh;

})));
//! moment.js locale configuration
//! locale : Turkish [tr]
//! authors : Erhan Gundogan : https://github.com/erhangundogan,
//!           Burak Yiğit Kaya: https://github.com/BYK

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var suffixes = {
        1: "'inci",
        5: "'inci",
        8: "'inci",
        70: "'inci",
        80: "'inci",
        2: "'nci",
        7: "'nci",
        20: "'nci",
        50: "'nci",
        3: "'üncü",
        4: "'üncü",
        100: "'üncü",
        6: "'ncı",
        9: "'uncu",
        10: "'uncu",
        30: "'uncu",
        60: "'ıncı",
        90: "'ıncı",
    };

    var tr = moment.defineLocale('tr', {
        months: 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split(
            '_'
        ),
        monthsShort: 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'),
        weekdays: 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split(
            '_'
        ),
        weekdaysShort: 'Paz_Pzt_Sal_Çar_Per_Cum_Cmt'.split('_'),
        weekdaysMin: 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'),
        meridiem: function (hours, minutes, isLower) {
            if (hours < 12) {
                return isLower ? 'öö' : 'ÖÖ';
            } else {
                return isLower ? 'ös' : 'ÖS';
            }
        },
        meridiemParse: /öö|ÖÖ|ös|ÖS/,
        isPM: function (input) {
            return input === 'ös' || input === 'ÖS';
        },
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[bugün saat] LT',
            nextDay: '[yarın saat] LT',
            nextWeek: '[gelecek] dddd [saat] LT',
            lastDay: '[dün] LT',
            lastWeek: '[geçen] dddd [saat] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s sonra',
            past: '%s önce',
            s: 'birkaç saniye',
            ss: '%d saniye',
            m: 'bir dakika',
            mm: '%d dakika',
            h: 'bir saat',
            hh: '%d saat',
            d: 'bir gün',
            dd: '%d gün',
            w: 'bir hafta',
            ww: '%d hafta',
            M: 'bir ay',
            MM: '%d ay',
            y: 'bir yıl',
            yy: '%d yıl',
        },
        ordinal: function (number, period) {
            switch (period) {
                case 'd':
                case 'D':
                case 'Do':
                case 'DD':
                    return number;
                default:
                    if (number === 0) {
                        // special case for zero
                        return number + "'ıncı";
                    }
                    var a = number % 10,
                        b = (number % 100) - a,
                        c = number >= 100 ? 100 : null;
                    return number + (suffixes[a] || suffixes[b] || suffixes[c]);
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    return tr;

})));
//! moment.js locale configuration
//! locale : Talossan [tzl]
//! author : Robin van der Vliet : https://github.com/robin0van0der0v
//! author : Iustì Canun

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    // After the year there should be a slash and the amount of years since December 26, 1979 in Roman numerals.
    // This is currently too difficult (maybe even impossible) to add.
    var tzl = moment.defineLocale('tzl', {
        months: 'Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar'.split(
            '_'
        ),
        monthsShort: 'Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec'.split('_'),
        weekdays: 'Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi'.split('_'),
        weekdaysShort: 'Súl_Lún_Mai_Már_Xhú_Vié_Sát'.split('_'),
        weekdaysMin: 'Sú_Lú_Ma_Má_Xh_Vi_Sá'.split('_'),
        longDateFormat: {
            LT: 'HH.mm',
            LTS: 'HH.mm.ss',
            L: 'DD.MM.YYYY',
            LL: 'D. MMMM [dallas] YYYY',
            LLL: 'D. MMMM [dallas] YYYY HH.mm',
            LLLL: 'dddd, [li] D. MMMM [dallas] YYYY HH.mm',
        },
        meridiemParse: /d\'o|d\'a/i,
        isPM: function (input) {
            return "d'o" === input.toLowerCase();
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours > 11) {
                return isLower ? "d'o" : "D'O";
            } else {
                return isLower ? "d'a" : "D'A";
            }
        },
        calendar: {
            sameDay: '[oxhi à] LT',
            nextDay: '[demà à] LT',
            nextWeek: 'dddd [à] LT',
            lastDay: '[ieiri à] LT',
            lastWeek: '[sür el] dddd [lasteu à] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'osprei %s',
            past: 'ja%s',
            s: processRelativeTime,
            ss: processRelativeTime,
            m: processRelativeTime,
            mm: processRelativeTime,
            h: processRelativeTime,
            hh: processRelativeTime,
            d: processRelativeTime,
            dd: processRelativeTime,
            M: processRelativeTime,
            MM: processRelativeTime,
            y: processRelativeTime,
            yy: processRelativeTime,
        },
        dayOfMonthOrdinalParse: /\d{1,2}\./,
        ordinal: '%d.',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    function processRelativeTime(number, withoutSuffix, key, isFuture) {
        var format = {
            s: ['viensas secunds', "'iensas secunds"],
            ss: [number + ' secunds', '' + number + ' secunds'],
            m: ["'n míut", "'iens míut"],
            mm: [number + ' míuts', '' + number + ' míuts'],
            h: ["'n þora", "'iensa þora"],
            hh: [number + ' þoras', '' + number + ' þoras'],
            d: ["'n ziua", "'iensa ziua"],
            dd: [number + ' ziuas', '' + number + ' ziuas'],
            M: ["'n mes", "'iens mes"],
            MM: [number + ' mesen', '' + number + ' mesen'],
            y: ["'n ar", "'iens ar"],
            yy: [number + ' ars', '' + number + ' ars'],
        };
        return isFuture
            ? format[key][0]
            : withoutSuffix
            ? format[key][0]
            : format[key][1];
    }

    return tzl;

})));
//! moment.js locale configuration
//! locale : Central Atlas Tamazight Latin [tzm-latn]
//! author : Abdel Said : https://github.com/abdelsaid

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var tzmLatn = moment.defineLocale('tzm-latn', {
        months: 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split(
            '_'
        ),
        monthsShort:
            'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split(
                '_'
            ),
        weekdays: 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
        weekdaysShort: 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
        weekdaysMin: 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[asdkh g] LT',
            nextDay: '[aska g] LT',
            nextWeek: 'dddd [g] LT',
            lastDay: '[assant g] LT',
            lastWeek: 'dddd [g] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'dadkh s yan %s',
            past: 'yan %s',
            s: 'imik',
            ss: '%d imik',
            m: 'minuḍ',
            mm: '%d minuḍ',
            h: 'saɛa',
            hh: '%d tassaɛin',
            d: 'ass',
            dd: '%d ossan',
            M: 'ayowr',
            MM: '%d iyyirn',
            y: 'asgas',
            yy: '%d isgasn',
        },
        week: {
            dow: 6, // Saturday is the first day of the week.
            doy: 12, // The week that contains Jan 12th is the first week of the year.
        },
    });

    return tzmLatn;

})));
//! moment.js locale configuration
//! locale : Central Atlas Tamazight [tzm]
//! author : Abdel Said : https://github.com/abdelsaid

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var tzm = moment.defineLocale('tzm', {
        months: 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split(
            '_'
        ),
        monthsShort:
            'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split(
                '_'
            ),
        weekdays: 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
        weekdaysShort: 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
        weekdaysMin: 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[ⴰⵙⴷⵅ ⴴ] LT',
            nextDay: '[ⴰⵙⴽⴰ ⴴ] LT',
            nextWeek: 'dddd [ⴴ] LT',
            lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT',
            lastWeek: 'dddd [ⴴ] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s',
            past: 'ⵢⴰⵏ %s',
            s: 'ⵉⵎⵉⴽ',
            ss: '%d ⵉⵎⵉⴽ',
            m: 'ⵎⵉⵏⵓⴺ',
            mm: '%d ⵎⵉⵏⵓⴺ',
            h: 'ⵙⴰⵄⴰ',
            hh: '%d ⵜⴰⵙⵙⴰⵄⵉⵏ',
            d: 'ⴰⵙⵙ',
            dd: '%d oⵙⵙⴰⵏ',
            M: 'ⴰⵢoⵓⵔ',
            MM: '%d ⵉⵢⵢⵉⵔⵏ',
            y: 'ⴰⵙⴳⴰⵙ',
            yy: '%d ⵉⵙⴳⴰⵙⵏ',
        },
        week: {
            dow: 6, // Saturday is the first day of the week.
            doy: 12, // The week that contains Jan 12th is the first week of the year.
        },
    });

    return tzm;

})));
//! moment.js locale configuration
//! locale : Uyghur (China) [ug-cn]
//! author: boyaq : https://github.com/boyaq

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var ugCn = moment.defineLocale('ug-cn', {
        months: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split(
            '_'
        ),
        monthsShort:
            'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split(
                '_'
            ),
        weekdays: 'يەكشەنبە_دۈشەنبە_سەيشەنبە_چارشەنبە_پەيشەنبە_جۈمە_شەنبە'.split(
            '_'
        ),
        weekdaysShort: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'),
        weekdaysMin: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY-MM-DD',
            LL: 'YYYY-يىلىM-ئاينىڭD-كۈنى',
            LLL: 'YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm',
            LLLL: 'dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm',
        },
        meridiemParse: /يېرىم كېچە|سەھەر|چۈشتىن بۇرۇن|چۈش|چۈشتىن كېيىن|كەچ/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (
                meridiem === 'يېرىم كېچە' ||
                meridiem === 'سەھەر' ||
                meridiem === 'چۈشتىن بۇرۇن'
            ) {
                return hour;
            } else if (meridiem === 'چۈشتىن كېيىن' || meridiem === 'كەچ') {
                return hour + 12;
            } else {
                return hour >= 11 ? hour : hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            var hm = hour * 100 + minute;
            if (hm < 600) {
                return 'يېرىم كېچە';
            } else if (hm < 900) {
                return 'سەھەر';
            } else if (hm < 1130) {
                return 'چۈشتىن بۇرۇن';
            } else if (hm < 1230) {
                return 'چۈش';
            } else if (hm < 1800) {
                return 'چۈشتىن كېيىن';
            } else {
                return 'كەچ';
            }
        },
        calendar: {
            sameDay: '[بۈگۈن سائەت] LT',
            nextDay: '[ئەتە سائەت] LT',
            nextWeek: '[كېلەركى] dddd [سائەت] LT',
            lastDay: '[تۆنۈگۈن] LT',
            lastWeek: '[ئالدىنقى] dddd [سائەت] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s كېيىن',
            past: '%s بۇرۇن',
            s: 'نەچچە سېكونت',
            ss: '%d سېكونت',
            m: 'بىر مىنۇت',
            mm: '%d مىنۇت',
            h: 'بىر سائەت',
            hh: '%d سائەت',
            d: 'بىر كۈن',
            dd: '%d كۈن',
            M: 'بىر ئاي',
            MM: '%d ئاي',
            y: 'بىر يىل',
            yy: '%d يىل',
        },

        dayOfMonthOrdinalParse: /\d{1,2}(-كۈنى|-ئاي|-ھەپتە)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'd':
                case 'D':
                case 'DDD':
                    return number + '-كۈنى';
                case 'w':
                case 'W':
                    return number + '-ھەپتە';
                default:
                    return number;
            }
        },
        preparse: function (string) {
            return string.replace(/،/g, ',');
        },
        postformat: function (string) {
            return string.replace(/,/g, '،');
        },
        week: {
            // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 1st is the first week of the year.
        },
    });

    return ugCn;

})));
//! moment.js locale configuration
//! locale : Ukrainian [uk]
//! author : zemlanin : https://github.com/zemlanin
//! Author : Menelion Elensúle : https://github.com/Oire

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    function plural(word, num) {
        var forms = word.split('_');
        return num % 10 === 1 && num % 100 !== 11
            ? forms[0]
            : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20)
            ? forms[1]
            : forms[2];
    }
    function relativeTimeWithPlural(number, withoutSuffix, key) {
        var format = {
            ss: withoutSuffix ? 'секунда_секунди_секунд' : 'секунду_секунди_секунд',
            mm: withoutSuffix ? 'хвилина_хвилини_хвилин' : 'хвилину_хвилини_хвилин',
            hh: withoutSuffix ? 'година_години_годин' : 'годину_години_годин',
            dd: 'день_дні_днів',
            MM: 'місяць_місяці_місяців',
            yy: 'рік_роки_років',
        };
        if (key === 'm') {
            return withoutSuffix ? 'хвилина' : 'хвилину';
        } else if (key === 'h') {
            return withoutSuffix ? 'година' : 'годину';
        } else {
            return number + ' ' + plural(format[key], +number);
        }
    }
    function weekdaysCaseReplace(m, format) {
        var weekdays = {
                nominative:
                    'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split(
                        '_'
                    ),
                accusative:
                    'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split(
                        '_'
                    ),
                genitive:
                    'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split(
                        '_'
                    ),
            },
            nounCase;

        if (m === true) {
            return weekdays['nominative']
                .slice(1, 7)
                .concat(weekdays['nominative'].slice(0, 1));
        }
        if (!m) {
            return weekdays['nominative'];
        }

        nounCase = /(\[[ВвУу]\]) ?dddd/.test(format)
            ? 'accusative'
            : /\[?(?:минулої|наступної)? ?\] ?dddd/.test(format)
            ? 'genitive'
            : 'nominative';
        return weekdays[nounCase][m.day()];
    }
    function processHoursFunction(str) {
        return function () {
            return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT';
        };
    }

    var uk = moment.defineLocale('uk', {
        months: {
            format: 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split(
                '_'
            ),
            standalone:
                'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split(
                    '_'
                ),
        },
        monthsShort: 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split(
            '_'
        ),
        weekdays: weekdaysCaseReplace,
        weekdaysShort: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
        weekdaysMin: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD.MM.YYYY',
            LL: 'D MMMM YYYY р.',
            LLL: 'D MMMM YYYY р., HH:mm',
            LLLL: 'dddd, D MMMM YYYY р., HH:mm',
        },
        calendar: {
            sameDay: processHoursFunction('[Сьогодні '),
            nextDay: processHoursFunction('[Завтра '),
            lastDay: processHoursFunction('[Вчора '),
            nextWeek: processHoursFunction('[У] dddd ['),
            lastWeek: function () {
                switch (this.day()) {
                    case 0:
                    case 3:
                    case 5:
                    case 6:
                        return processHoursFunction('[Минулої] dddd [').call(this);
                    case 1:
                    case 2:
                    case 4:
                        return processHoursFunction('[Минулого] dddd [').call(this);
                }
            },
            sameElse: 'L',
        },
        relativeTime: {
            future: 'за %s',
            past: '%s тому',
            s: 'декілька секунд',
            ss: relativeTimeWithPlural,
            m: relativeTimeWithPlural,
            mm: relativeTimeWithPlural,
            h: 'годину',
            hh: relativeTimeWithPlural,
            d: 'день',
            dd: relativeTimeWithPlural,
            M: 'місяць',
            MM: relativeTimeWithPlural,
            y: 'рік',
            yy: relativeTimeWithPlural,
        },
        // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
        meridiemParse: /ночі|ранку|дня|вечора/,
        isPM: function (input) {
            return /^(дня|вечора)$/.test(input);
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 4) {
                return 'ночі';
            } else if (hour < 12) {
                return 'ранку';
            } else if (hour < 17) {
                return 'дня';
            } else {
                return 'вечора';
            }
        },
        dayOfMonthOrdinalParse: /\d{1,2}-(й|го)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'M':
                case 'd':
                case 'DDD':
                case 'w':
                case 'W':
                    return number + '-й';
                case 'D':
                    return number + '-го';
                default:
                    return number;
            }
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    return uk;

})));
//! moment.js locale configuration
//! locale : Urdu [ur]
//! author : Sawood Alam : https://github.com/ibnesayeed
//! author : Zack : https://github.com/ZackVision

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var months = [
            'جنوری',
            'فروری',
            'مارچ',
            'اپریل',
            'مئی',
            'جون',
            'جولائی',
            'اگست',
            'ستمبر',
            'اکتوبر',
            'نومبر',
            'دسمبر',
        ],
        days = ['اتوار', 'پیر', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'ہفتہ'];

    var ur = moment.defineLocale('ur', {
        months: months,
        monthsShort: months,
        weekdays: days,
        weekdaysShort: days,
        weekdaysMin: days,
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd، D MMMM YYYY HH:mm',
        },
        meridiemParse: /صبح|شام/,
        isPM: function (input) {
            return 'شام' === input;
        },
        meridiem: function (hour, minute, isLower) {
            if (hour < 12) {
                return 'صبح';
            }
            return 'شام';
        },
        calendar: {
            sameDay: '[آج بوقت] LT',
            nextDay: '[کل بوقت] LT',
            nextWeek: 'dddd [بوقت] LT',
            lastDay: '[گذشتہ روز بوقت] LT',
            lastWeek: '[گذشتہ] dddd [بوقت] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s بعد',
            past: '%s قبل',
            s: 'چند سیکنڈ',
            ss: '%d سیکنڈ',
            m: 'ایک منٹ',
            mm: '%d منٹ',
            h: 'ایک گھنٹہ',
            hh: '%d گھنٹے',
            d: 'ایک دن',
            dd: '%d دن',
            M: 'ایک ماہ',
            MM: '%d ماہ',
            y: 'ایک سال',
            yy: '%d سال',
        },
        preparse: function (string) {
            return string.replace(/،/g, ',');
        },
        postformat: function (string) {
            return string.replace(/,/g, '،');
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return ur;

})));
//! moment.js locale configuration
//! locale : Uzbek Latin [uz-latn]
//! author : Rasulbek Mirzayev : github.com/Rasulbeeek

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var uzLatn = moment.defineLocale('uz-latn', {
        months: 'Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr'.split(
            '_'
        ),
        monthsShort: 'Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek'.split('_'),
        weekdays:
            'Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba'.split(
                '_'
            ),
        weekdaysShort: 'Yak_Dush_Sesh_Chor_Pay_Jum_Shan'.split('_'),
        weekdaysMin: 'Ya_Du_Se_Cho_Pa_Ju_Sha'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'D MMMM YYYY, dddd HH:mm',
        },
        calendar: {
            sameDay: '[Bugun soat] LT [da]',
            nextDay: '[Ertaga] LT [da]',
            nextWeek: 'dddd [kuni soat] LT [da]',
            lastDay: '[Kecha soat] LT [da]',
            lastWeek: "[O'tgan] dddd [kuni soat] LT [da]",
            sameElse: 'L',
        },
        relativeTime: {
            future: 'Yaqin %s ichida',
            past: 'Bir necha %s oldin',
            s: 'soniya',
            ss: '%d soniya',
            m: 'bir daqiqa',
            mm: '%d daqiqa',
            h: 'bir soat',
            hh: '%d soat',
            d: 'bir kun',
            dd: '%d kun',
            M: 'bir oy',
            MM: '%d oy',
            y: 'bir yil',
            yy: '%d yil',
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 7th is the first week of the year.
        },
    });

    return uzLatn;

})));
//! moment.js locale configuration
//! locale : Uzbek [uz]
//! author : Sardor Muminov : https://github.com/muminoff

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var uz = moment.defineLocale('uz', {
        months: 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split(
            '_'
        ),
        monthsShort: 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),
        weekdays: 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'),
        weekdaysShort: 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'),
        weekdaysMin: 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'D MMMM YYYY, dddd HH:mm',
        },
        calendar: {
            sameDay: '[Бугун соат] LT [да]',
            nextDay: '[Эртага] LT [да]',
            nextWeek: 'dddd [куни соат] LT [да]',
            lastDay: '[Кеча соат] LT [да]',
            lastWeek: '[Утган] dddd [куни соат] LT [да]',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'Якин %s ичида',
            past: 'Бир неча %s олдин',
            s: 'фурсат',
            ss: '%d фурсат',
            m: 'бир дакика',
            mm: '%d дакика',
            h: 'бир соат',
            hh: '%d соат',
            d: 'бир кун',
            dd: '%d кун',
            M: 'бир ой',
            MM: '%d ой',
            y: 'бир йил',
            yy: '%d йил',
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 7, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return uz;

})));
//! moment.js locale configuration
//! locale : Vietnamese [vi]
//! author : Bang Nguyen : https://github.com/bangnk
//! author : Chien Kira : https://github.com/chienkira

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var vi = moment.defineLocale('vi', {
        months: 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split(
            '_'
        ),
        monthsShort:
            'Thg 01_Thg 02_Thg 03_Thg 04_Thg 05_Thg 06_Thg 07_Thg 08_Thg 09_Thg 10_Thg 11_Thg 12'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays: 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split(
            '_'
        ),
        weekdaysShort: 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
        weekdaysMin: 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
        weekdaysParseExact: true,
        meridiemParse: /sa|ch/i,
        isPM: function (input) {
            return /^ch$/i.test(input);
        },
        meridiem: function (hours, minutes, isLower) {
            if (hours < 12) {
                return isLower ? 'sa' : 'SA';
            } else {
                return isLower ? 'ch' : 'CH';
            }
        },
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM [năm] YYYY',
            LLL: 'D MMMM [năm] YYYY HH:mm',
            LLLL: 'dddd, D MMMM [năm] YYYY HH:mm',
            l: 'DD/M/YYYY',
            ll: 'D MMM YYYY',
            lll: 'D MMM YYYY HH:mm',
            llll: 'ddd, D MMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[Hôm nay lúc] LT',
            nextDay: '[Ngày mai lúc] LT',
            nextWeek: 'dddd [tuần tới lúc] LT',
            lastDay: '[Hôm qua lúc] LT',
            lastWeek: 'dddd [tuần trước lúc] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: '%s tới',
            past: '%s trước',
            s: 'vài giây',
            ss: '%d giây',
            m: 'một phút',
            mm: '%d phút',
            h: 'một giờ',
            hh: '%d giờ',
            d: 'một ngày',
            dd: '%d ngày',
            w: 'một tuần',
            ww: '%d tuần',
            M: 'một tháng',
            MM: '%d tháng',
            y: 'một năm',
            yy: '%d năm',
        },
        dayOfMonthOrdinalParse: /\d{1,2}/,
        ordinal: function (number) {
            return number;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return vi;

})));
//! moment.js locale configuration
//! locale : Pseudo [x-pseudo]
//! author : Andrew Hood : https://github.com/andrewhood125

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var xPseudo = moment.defineLocale('x-pseudo', {
        months: 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split(
            '_'
        ),
        monthsShort:
            'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split(
                '_'
            ),
        monthsParseExact: true,
        weekdays:
            'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split(
                '_'
            ),
        weekdaysShort: 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'),
        weekdaysMin: 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'),
        weekdaysParseExact: true,
        longDateFormat: {
            LT: 'HH:mm',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY HH:mm',
            LLLL: 'dddd, D MMMM YYYY HH:mm',
        },
        calendar: {
            sameDay: '[T~ódá~ý át] LT',
            nextDay: '[T~ómó~rró~w át] LT',
            nextWeek: 'dddd [át] LT',
            lastDay: '[Ý~ést~érdá~ý át] LT',
            lastWeek: '[L~ást] dddd [át] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'í~ñ %s',
            past: '%s á~gó',
            s: 'á ~féw ~sécó~ñds',
            ss: '%d s~écóñ~ds',
            m: 'á ~míñ~úté',
            mm: '%d m~íñú~tés',
            h: 'á~ñ hó~úr',
            hh: '%d h~óúrs',
            d: 'á ~dáý',
            dd: '%d d~áýs',
            M: 'á ~móñ~th',
            MM: '%d m~óñt~hs',
            y: 'á ~ýéár',
            yy: '%d ý~éárs',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/,
        ordinal: function (number) {
            var b = number % 10,
                output =
                    ~~((number % 100) / 10) === 1
                        ? 'th'
                        : b === 1
                        ? 'st'
                        : b === 2
                        ? 'nd'
                        : b === 3
                        ? 'rd'
                        : 'th';
            return number + output;
        },
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return xPseudo;

})));
//! moment.js locale configuration
//! locale : Yoruba Nigeria [yo]
//! author : Atolagbe Abisoye : https://github.com/andela-batolagbe

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var yo = moment.defineLocale('yo', {
        months: 'Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀'.split(
            '_'
        ),
        monthsShort: 'Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀'.split('_'),
        weekdays: 'Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta'.split('_'),
        weekdaysShort: 'Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá'.split('_'),
        weekdaysMin: 'Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb'.split('_'),
        longDateFormat: {
            LT: 'h:mm A',
            LTS: 'h:mm:ss A',
            L: 'DD/MM/YYYY',
            LL: 'D MMMM YYYY',
            LLL: 'D MMMM YYYY h:mm A',
            LLLL: 'dddd, D MMMM YYYY h:mm A',
        },
        calendar: {
            sameDay: '[Ònì ni] LT',
            nextDay: '[Ọ̀la ni] LT',
            nextWeek: "dddd [Ọsẹ̀ tón'bọ] [ni] LT",
            lastDay: '[Àna ni] LT',
            lastWeek: 'dddd [Ọsẹ̀ tólọ́] [ni] LT',
            sameElse: 'L',
        },
        relativeTime: {
            future: 'ní %s',
            past: '%s kọjá',
            s: 'ìsẹjú aayá die',
            ss: 'aayá %d',
            m: 'ìsẹjú kan',
            mm: 'ìsẹjú %d',
            h: 'wákati kan',
            hh: 'wákati %d',
            d: 'ọjọ́ kan',
            dd: 'ọjọ́ %d',
            M: 'osù kan',
            MM: 'osù %d',
            y: 'ọdún kan',
            yy: 'ọdún %d',
        },
        dayOfMonthOrdinalParse: /ọjọ́\s\d{1,2}/,
        ordinal: 'ọjọ́ %d',
        week: {
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return yo;

})));
//! moment.js locale configuration
//! locale : Chinese (China) [zh-cn]
//! author : suupic : https://github.com/suupic
//! author : Zeno Zeng : https://github.com/zenozeng
//! author : uu109 : https://github.com/uu109

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var zhCn = moment.defineLocale('zh-cn', {
        months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(
            '_'
        ),
        monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(
            '_'
        ),
        weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
        weekdaysShort: '周日_周一_周二_周三_周四_周五_周六'.split('_'),
        weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY/MM/DD',
            LL: 'YYYY年M月D日',
            LLL: 'YYYY年M月D日Ah点mm分',
            LLLL: 'YYYY年M月D日ddddAh点mm分',
            l: 'YYYY/M/D',
            ll: 'YYYY年M月D日',
            lll: 'YYYY年M月D日 HH:mm',
            llll: 'YYYY年M月D日dddd HH:mm',
        },
        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
                return hour;
            } else if (meridiem === '下午' || meridiem === '晚上') {
                return hour + 12;
            } else {
                // '中午'
                return hour >= 11 ? hour : hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            var hm = hour * 100 + minute;
            if (hm < 600) {
                return '凌晨';
            } else if (hm < 900) {
                return '早上';
            } else if (hm < 1130) {
                return '上午';
            } else if (hm < 1230) {
                return '中午';
            } else if (hm < 1800) {
                return '下午';
            } else {
                return '晚上';
            }
        },
        calendar: {
            sameDay: '[今天]LT',
            nextDay: '[明天]LT',
            nextWeek: function (now) {
                if (now.week() !== this.week()) {
                    return '[下]dddLT';
                } else {
                    return '[本]dddLT';
                }
            },
            lastDay: '[昨天]LT',
            lastWeek: function (now) {
                if (this.week() !== now.week()) {
                    return '[上]dddLT';
                } else {
                    return '[本]dddLT';
                }
            },
            sameElse: 'L',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(日|月|周)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'd':
                case 'D':
                case 'DDD':
                    return number + '日';
                case 'M':
                    return number + '月';
                case 'w':
                case 'W':
                    return number + '周';
                default:
                    return number;
            }
        },
        relativeTime: {
            future: '%s后',
            past: '%s前',
            s: '几秒',
            ss: '%d 秒',
            m: '1 分钟',
            mm: '%d 分钟',
            h: '1 小时',
            hh: '%d 小时',
            d: '1 天',
            dd: '%d 天',
            w: '1 周',
            ww: '%d 周',
            M: '1 个月',
            MM: '%d 个月',
            y: '1 年',
            yy: '%d 年',
        },
        week: {
            // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
            dow: 1, // Monday is the first day of the week.
            doy: 4, // The week that contains Jan 4th is the first week of the year.
        },
    });

    return zhCn;

})));
//! moment.js locale configuration
//! locale : Chinese (Hong Kong) [zh-hk]
//! author : Ben : https://github.com/ben-lin
//! author : Chris Lam : https://github.com/hehachris
//! author : Konstantin : https://github.com/skfd
//! author : Anthony : https://github.com/anthonylau

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var zhHk = moment.defineLocale('zh-hk', {
        months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(
            '_'
        ),
        monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(
            '_'
        ),
        weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
        weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),
        weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY/MM/DD',
            LL: 'YYYY年M月D日',
            LLL: 'YYYY年M月D日 HH:mm',
            LLLL: 'YYYY年M月D日dddd HH:mm',
            l: 'YYYY/M/D',
            ll: 'YYYY年M月D日',
            lll: 'YYYY年M月D日 HH:mm',
            llll: 'YYYY年M月D日dddd HH:mm',
        },
        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
                return hour;
            } else if (meridiem === '中午') {
                return hour >= 11 ? hour : hour + 12;
            } else if (meridiem === '下午' || meridiem === '晚上') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            var hm = hour * 100 + minute;
            if (hm < 600) {
                return '凌晨';
            } else if (hm < 900) {
                return '早上';
            } else if (hm < 1200) {
                return '上午';
            } else if (hm === 1200) {
                return '中午';
            } else if (hm < 1800) {
                return '下午';
            } else {
                return '晚上';
            }
        },
        calendar: {
            sameDay: '[今天]LT',
            nextDay: '[明天]LT',
            nextWeek: '[下]ddddLT',
            lastDay: '[昨天]LT',
            lastWeek: '[上]ddddLT',
            sameElse: 'L',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'd':
                case 'D':
                case 'DDD':
                    return number + '日';
                case 'M':
                    return number + '月';
                case 'w':
                case 'W':
                    return number + '週';
                default:
                    return number;
            }
        },
        relativeTime: {
            future: '%s後',
            past: '%s前',
            s: '幾秒',
            ss: '%d 秒',
            m: '1 分鐘',
            mm: '%d 分鐘',
            h: '1 小時',
            hh: '%d 小時',
            d: '1 天',
            dd: '%d 天',
            M: '1 個月',
            MM: '%d 個月',
            y: '1 年',
            yy: '%d 年',
        },
    });

    return zhHk;

})));
//! moment.js locale configuration
//! locale : Chinese (Macau) [zh-mo]
//! author : Ben : https://github.com/ben-lin
//! author : Chris Lam : https://github.com/hehachris
//! author : Tan Yuanhong : https://github.com/le0tan

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var zhMo = moment.defineLocale('zh-mo', {
        months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(
            '_'
        ),
        monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(
            '_'
        ),
        weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
        weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),
        weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'DD/MM/YYYY',
            LL: 'YYYY年M月D日',
            LLL: 'YYYY年M月D日 HH:mm',
            LLLL: 'YYYY年M月D日dddd HH:mm',
            l: 'D/M/YYYY',
            ll: 'YYYY年M月D日',
            lll: 'YYYY年M月D日 HH:mm',
            llll: 'YYYY年M月D日dddd HH:mm',
        },
        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
                return hour;
            } else if (meridiem === '中午') {
                return hour >= 11 ? hour : hour + 12;
            } else if (meridiem === '下午' || meridiem === '晚上') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            var hm = hour * 100 + minute;
            if (hm < 600) {
                return '凌晨';
            } else if (hm < 900) {
                return '早上';
            } else if (hm < 1130) {
                return '上午';
            } else if (hm < 1230) {
                return '中午';
            } else if (hm < 1800) {
                return '下午';
            } else {
                return '晚上';
            }
        },
        calendar: {
            sameDay: '[今天] LT',
            nextDay: '[明天] LT',
            nextWeek: '[下]dddd LT',
            lastDay: '[昨天] LT',
            lastWeek: '[上]dddd LT',
            sameElse: 'L',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'd':
                case 'D':
                case 'DDD':
                    return number + '日';
                case 'M':
                    return number + '月';
                case 'w':
                case 'W':
                    return number + '週';
                default:
                    return number;
            }
        },
        relativeTime: {
            future: '%s內',
            past: '%s前',
            s: '幾秒',
            ss: '%d 秒',
            m: '1 分鐘',
            mm: '%d 分鐘',
            h: '1 小時',
            hh: '%d 小時',
            d: '1 天',
            dd: '%d 天',
            M: '1 個月',
            MM: '%d 個月',
            y: '1 年',
            yy: '%d 年',
        },
    });

    return zhMo;

})));
//! moment.js locale configuration
//! locale : Chinese (Taiwan) [zh-tw]
//! author : Ben : https://github.com/ben-lin
//! author : Chris Lam : https://github.com/hehachris

;(function (global, factory) {
   typeof exports === 'object' && typeof module !== 'undefined'
       && typeof require === 'function' ? factory(require('../moment')) :
   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
   factory(global.moment)
}(this, (function (moment) { 'use strict';

    //! moment.js locale configuration

    var zhTw = moment.defineLocale('zh-tw', {
        months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(
            '_'
        ),
        monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(
            '_'
        ),
        weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
        weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),
        weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
        longDateFormat: {
            LT: 'HH:mm',
            LTS: 'HH:mm:ss',
            L: 'YYYY/MM/DD',
            LL: 'YYYY年M月D日',
            LLL: 'YYYY年M月D日 HH:mm',
            LLLL: 'YYYY年M月D日dddd HH:mm',
            l: 'YYYY/M/D',
            ll: 'YYYY年M月D日',
            lll: 'YYYY年M月D日 HH:mm',
            llll: 'YYYY年M月D日dddd HH:mm',
        },
        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
        meridiemHour: function (hour, meridiem) {
            if (hour === 12) {
                hour = 0;
            }
            if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
                return hour;
            } else if (meridiem === '中午') {
                return hour >= 11 ? hour : hour + 12;
            } else if (meridiem === '下午' || meridiem === '晚上') {
                return hour + 12;
            }
        },
        meridiem: function (hour, minute, isLower) {
            var hm = hour * 100 + minute;
            if (hm < 600) {
                return '凌晨';
            } else if (hm < 900) {
                return '早上';
            } else if (hm < 1130) {
                return '上午';
            } else if (hm < 1230) {
                return '中午';
            } else if (hm < 1800) {
                return '下午';
            } else {
                return '晚上';
            }
        },
        calendar: {
            sameDay: '[今天] LT',
            nextDay: '[明天] LT',
            nextWeek: '[下]dddd LT',
            lastDay: '[昨天] LT',
            lastWeek: '[上]dddd LT',
            sameElse: 'L',
        },
        dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/,
        ordinal: function (number, period) {
            switch (period) {
                case 'd':
                case 'D':
                case 'DDD':
                    return number + '日';
                case 'M':
                    return number + '月';
                case 'w':
                case 'W':
                    return number + '週';
                default:
                    return number;
            }
        },
        relativeTime: {
            future: '%s後',
            past: '%s前',
            s: '幾秒',
            ss: '%d 秒',
            m: '1 分鐘',
            mm: '%d 分鐘',
            h: '1 小時',
            hh: '%d 小時',
            d: '1 天',
            dd: '%d 天',
            M: '1 個月',
            MM: '%d 個月',
            y: '1 年',
            yy: '%d 年',
        },
    });

    return zhTw;

})));
//! moment.js
//! version : 2.29.4
//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
//! license : MIT
//! momentjs.com

var hookCallback;

function hooks() {
    return hookCallback.apply(null, arguments);
}

// This is done to register the method called with moment()
// without creating circular dependencies.
function setHookCallback(callback) {
    hookCallback = callback;
}

function isArray(input) {
    return (
        input instanceof Array ||
        Object.prototype.toString.call(input) === '[object Array]'
    );
}

function isObject(input) {
    // IE8 will treat undefined and null as object if it wasn't for
    // input != null
    return (
        input != null &&
        Object.prototype.toString.call(input) === '[object Object]'
    );
}

function hasOwnProp(a, b) {
    return Object.prototype.hasOwnProperty.call(a, b);
}

function isObjectEmpty(obj) {
    if (Object.getOwnPropertyNames) {
        return Object.getOwnPropertyNames(obj).length === 0;
    } else {
        var k;
        for (k in obj) {
            if (hasOwnProp(obj, k)) {
                return false;
            }
        }
        return true;
    }
}

function isUndefined(input) {
    return input === void 0;
}

function isNumber(input) {
    return (
        typeof input === 'number' ||
        Object.prototype.toString.call(input) === '[object Number]'
    );
}

function isDate(input) {
    return (
        input instanceof Date ||
        Object.prototype.toString.call(input) === '[object Date]'
    );
}

function map(arr, fn) {
    var res = [],
        i,
        arrLen = arr.length;
    for (i = 0; i < arrLen; ++i) {
        res.push(fn(arr[i], i));
    }
    return res;
}

function extend(a, b) {
    for (var i in b) {
        if (hasOwnProp(b, i)) {
            a[i] = b[i];
        }
    }

    if (hasOwnProp(b, 'toString')) {
        a.toString = b.toString;
    }

    if (hasOwnProp(b, 'valueOf')) {
        a.valueOf = b.valueOf;
    }

    return a;
}

function createUTC(input, format, locale, strict) {
    return createLocalOrUTC(input, format, locale, strict, true).utc();
}

function defaultParsingFlags() {
    // We need to deep clone this object.
    return {
        empty: false,
        unusedTokens: [],
        unusedInput: [],
        overflow: -2,
        charsLeftOver: 0,
        nullInput: false,
        invalidEra: null,
        invalidMonth: null,
        invalidFormat: false,
        userInvalidated: false,
        iso: false,
        parsedDateParts: [],
        era: null,
        meridiem: null,
        rfc2822: false,
        weekdayMismatch: false,
    };
}

function getParsingFlags(m) {
    if (m._pf == null) {
        m._pf = defaultParsingFlags();
    }
    return m._pf;
}

var some;
if (Array.prototype.some) {
    some = Array.prototype.some;
} else {
    some = function (fun) {
        var t = Object(this),
            len = t.length >>> 0,
            i;

        for (i = 0; i < len; i++) {
            if (i in t && fun.call(this, t[i], i, t)) {
                return true;
            }
        }

        return false;
    };
}

function isValid(m) {
    if (m._isValid == null) {
        var flags = getParsingFlags(m),
            parsedParts = some.call(flags.parsedDateParts, function (i) {
                return i != null;
            }),
            isNowValid =
                !isNaN(m._d.getTime()) &&
                flags.overflow < 0 &&
                !flags.empty &&
                !flags.invalidEra &&
                !flags.invalidMonth &&
                !flags.invalidWeekday &&
                !flags.weekdayMismatch &&
                !flags.nullInput &&
                !flags.invalidFormat &&
                !flags.userInvalidated &&
                (!flags.meridiem || (flags.meridiem && parsedParts));

        if (m._strict) {
            isNowValid =
                isNowValid &&
                flags.charsLeftOver === 0 &&
                flags.unusedTokens.length === 0 &&
                flags.bigHour === undefined;
        }

        if (Object.isFrozen == null || !Object.isFrozen(m)) {
            m._isValid = isNowValid;
        } else {
            return isNowValid;
        }
    }
    return m._isValid;
}

function createInvalid(flags) {
    var m = createUTC(NaN);
    if (flags != null) {
        extend(getParsingFlags(m), flags);
    } else {
        getParsingFlags(m).userInvalidated = true;
    }

    return m;
}

// Plugins that add properties should also add the key here (null value),
// so we can properly clone ourselves.
var momentProperties = (hooks.momentProperties = []),
    updateInProgress = false;

function copyConfig(to, from) {
    var i,
        prop,
        val,
        momentPropertiesLen = momentProperties.length;

    if (!isUndefined(from._isAMomentObject)) {
        to._isAMomentObject = from._isAMomentObject;
    }
    if (!isUndefined(from._i)) {
        to._i = from._i;
    }
    if (!isUndefined(from._f)) {
        to._f = from._f;
    }
    if (!isUndefined(from._l)) {
        to._l = from._l;
    }
    if (!isUndefined(from._strict)) {
        to._strict = from._strict;
    }
    if (!isUndefined(from._tzm)) {
        to._tzm = from._tzm;
    }
    if (!isUndefined(from._isUTC)) {
        to._isUTC = from._isUTC;
    }
    if (!isUndefined(from._offset)) {
        to._offset = from._offset;
    }
    if (!isUndefined(from._pf)) {
        to._pf = getParsingFlags(from);
    }
    if (!isUndefined(from._locale)) {
        to._locale = from._locale;
    }

    if (momentPropertiesLen > 0) {
        for (i = 0; i < momentPropertiesLen; i++) {
            prop = momentProperties[i];
            val = from[prop];
            if (!isUndefined(val)) {
                to[prop] = val;
            }
        }
    }

    return to;
}

// Moment prototype object
function Moment(config) {
    copyConfig(this, config);
    this._d = new Date(config._d != null ? config._d.getTime() : NaN);
    if (!this.isValid()) {
        this._d = new Date(NaN);
    }
    // Prevent infinite loop in case updateOffset creates new moment
    // objects.
    if (updateInProgress === false) {
        updateInProgress = true;
        hooks.updateOffset(this);
        updateInProgress = false;
    }
}

function isMoment(obj) {
    return (
        obj instanceof Moment || (obj != null && obj._isAMomentObject != null)
    );
}

function warn(msg) {
    if (
        hooks.suppressDeprecationWarnings === false &&
        typeof console !== 'undefined' &&
        console.warn
    ) {
        console.warn('Deprecation warning: ' + msg);
    }
}

function deprecate(msg, fn) {
    var firstTime = true;

    return extend(function () {
        if (hooks.deprecationHandler != null) {
            hooks.deprecationHandler(null, msg);
        }
        if (firstTime) {
            var args = [],
                arg,
                i,
                key,
                argLen = arguments.length;
            for (i = 0; i < argLen; i++) {
                arg = '';
                if (typeof arguments[i] === 'object') {
                    arg += '\n[' + i + '] ';
                    for (key in arguments[0]) {
                        if (hasOwnProp(arguments[0], key)) {
                            arg += key + ': ' + arguments[0][key] + ', ';
                        }
                    }
                    arg = arg.slice(0, -2); // Remove trailing comma and space
                } else {
                    arg = arguments[i];
                }
                args.push(arg);
            }
            warn(
                msg +
                    '\nArguments: ' +
                    Array.prototype.slice.call(args).join('') +
                    '\n' +
                    new Error().stack
            );
            firstTime = false;
        }
        return fn.apply(this, arguments);
    }, fn);
}

var deprecations = {};

function deprecateSimple(name, msg) {
    if (hooks.deprecationHandler != null) {
        hooks.deprecationHandler(name, msg);
    }
    if (!deprecations[name]) {
        warn(msg);
        deprecations[name] = true;
    }
}

hooks.suppressDeprecationWarnings = false;
hooks.deprecationHandler = null;

function isFunction(input) {
    return (
        (typeof Function !== 'undefined' && input instanceof Function) ||
        Object.prototype.toString.call(input) === '[object Function]'
    );
}

function set(config) {
    var prop, i;
    for (i in config) {
        if (hasOwnProp(config, i)) {
            prop = config[i];
            if (isFunction(prop)) {
                this[i] = prop;
            } else {
                this['_' + i] = prop;
            }
        }
    }
    this._config = config;
    // Lenient ordinal parsing accepts just a number in addition to
    // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.
    // TODO: Remove "ordinalParse" fallback in next major release.
    this._dayOfMonthOrdinalParseLenient = new RegExp(
        (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +
            '|' +
            /\d{1,2}/.source
    );
}

function mergeConfigs(parentConfig, childConfig) {
    var res = extend({}, parentConfig),
        prop;
    for (prop in childConfig) {
        if (hasOwnProp(childConfig, prop)) {
            if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {
                res[prop] = {};
                extend(res[prop], parentConfig[prop]);
                extend(res[prop], childConfig[prop]);
            } else if (childConfig[prop] != null) {
                res[prop] = childConfig[prop];
            } else {
                delete res[prop];
            }
        }
    }
    for (prop in parentConfig) {
        if (
            hasOwnProp(parentConfig, prop) &&
            !hasOwnProp(childConfig, prop) &&
            isObject(parentConfig[prop])
        ) {
            // make sure changes to properties don't modify parent config
            res[prop] = extend({}, res[prop]);
        }
    }
    return res;
}

function Locale(config) {
    if (config != null) {
        this.set(config);
    }
}

var keys;

if (Object.keys) {
    keys = Object.keys;
} else {
    keys = function (obj) {
        var i,
            res = [];
        for (i in obj) {
            if (hasOwnProp(obj, i)) {
                res.push(i);
            }
        }
        return res;
    };
}

var defaultCalendar = {
    sameDay: '[Today at] LT',
    nextDay: '[Tomorrow at] LT',
    nextWeek: 'dddd [at] LT',
    lastDay: '[Yesterday at] LT',
    lastWeek: '[Last] dddd [at] LT',
    sameElse: 'L',
};

function calendar(key, mom, now) {
    var output = this._calendar[key] || this._calendar['sameElse'];
    return isFunction(output) ? output.call(mom, now) : output;
}

function zeroFill(number, targetLength, forceSign) {
    var absNumber = '' + Math.abs(number),
        zerosToFill = targetLength - absNumber.length,
        sign = number >= 0;
    return (
        (sign ? (forceSign ? '+' : '') : '-') +
        Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) +
        absNumber
    );
}

var formattingTokens =
        /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,
    localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,
    formatFunctions = {},
    formatTokenFunctions = {};

// token:    'M'
// padded:   ['MM', 2]
// ordinal:  'Mo'
// callback: function () { this.month() + 1 }
function addFormatToken(token, padded, ordinal, callback) {
    var func = callback;
    if (typeof callback === 'string') {
        func = function () {
            return this[callback]();
        };
    }
    if (token) {
        formatTokenFunctions[token] = func;
    }
    if (padded) {
        formatTokenFunctions[padded[0]] = function () {
            return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
        };
    }
    if (ordinal) {
        formatTokenFunctions[ordinal] = function () {
            return this.localeData().ordinal(
                func.apply(this, arguments),
                token
            );
        };
    }
}

function removeFormattingTokens(input) {
    if (input.match(/\[[\s\S]/)) {
        return input.replace(/^\[|\]$/g, '');
    }
    return input.replace(/\\/g, '');
}

function makeFormatFunction(format) {
    var array = format.match(formattingTokens),
        i,
        length;

    for (i = 0, length = array.length; i < length; i++) {
        if (formatTokenFunctions[array[i]]) {
            array[i] = formatTokenFunctions[array[i]];
        } else {
            array[i] = removeFormattingTokens(array[i]);
        }
    }

    return function (mom) {
        var output = '',
            i;
        for (i = 0; i < length; i++) {
            output += isFunction(array[i])
                ? array[i].call(mom, format)
                : array[i];
        }
        return output;
    };
}

// format date using native date object
function formatMoment(m, format) {
    if (!m.isValid()) {
        return m.localeData().invalidDate();
    }

    format = expandFormat(format, m.localeData());
    formatFunctions[format] =
        formatFunctions[format] || makeFormatFunction(format);

    return formatFunctions[format](m);
}

function expandFormat(format, locale) {
    var i = 5;

    function replaceLongDateFormatTokens(input) {
        return locale.longDateFormat(input) || input;
    }

    localFormattingTokens.lastIndex = 0;
    while (i >= 0 && localFormattingTokens.test(format)) {
        format = format.replace(
            localFormattingTokens,
            replaceLongDateFormatTokens
        );
        localFormattingTokens.lastIndex = 0;
        i -= 1;
    }

    return format;
}

var defaultLongDateFormat = {
    LTS: 'h:mm:ss A',
    LT: 'h:mm A',
    L: 'MM/DD/YYYY',
    LL: 'MMMM D, YYYY',
    LLL: 'MMMM D, YYYY h:mm A',
    LLLL: 'dddd, MMMM D, YYYY h:mm A',
};

function longDateFormat(key) {
    var format = this._longDateFormat[key],
        formatUpper = this._longDateFormat[key.toUpperCase()];

    if (format || !formatUpper) {
        return format;
    }

    this._longDateFormat[key] = formatUpper
        .match(formattingTokens)
        .map(function (tok) {
            if (
                tok === 'MMMM' ||
                tok === 'MM' ||
                tok === 'DD' ||
                tok === 'dddd'
            ) {
                return tok.slice(1);
            }
            return tok;
        })
        .join('');

    return this._longDateFormat[key];
}

var defaultInvalidDate = 'Invalid date';

function invalidDate() {
    return this._invalidDate;
}

var defaultOrdinal = '%d',
    defaultDayOfMonthOrdinalParse = /\d{1,2}/;

function ordinal(number) {
    return this._ordinal.replace('%d', number);
}

var defaultRelativeTime = {
    future: 'in %s',
    past: '%s ago',
    s: 'a few seconds',
    ss: '%d seconds',
    m: 'a minute',
    mm: '%d minutes',
    h: 'an hour',
    hh: '%d hours',
    d: 'a day',
    dd: '%d days',
    w: 'a week',
    ww: '%d weeks',
    M: 'a month',
    MM: '%d months',
    y: 'a year',
    yy: '%d years',
};

function relativeTime(number, withoutSuffix, string, isFuture) {
    var output = this._relativeTime[string];
    return isFunction(output)
        ? output(number, withoutSuffix, string, isFuture)
        : output.replace(/%d/i, number);
}

function pastFuture(diff, output) {
    var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
    return isFunction(format) ? format(output) : format.replace(/%s/i, output);
}

var aliases = {};

function addUnitAlias(unit, shorthand) {
    var lowerCase = unit.toLowerCase();
    aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;
}

function normalizeUnits(units) {
    return typeof units === 'string'
        ? aliases[units] || aliases[units.toLowerCase()]
        : undefined;
}

function normalizeObjectUnits(inputObject) {
    var normalizedInput = {},
        normalizedProp,
        prop;

    for (prop in inputObject) {
        if (hasOwnProp(inputObject, prop)) {
            normalizedProp = normalizeUnits(prop);
            if (normalizedProp) {
                normalizedInput[normalizedProp] = inputObject[prop];
            }
        }
    }

    return normalizedInput;
}

var priorities = {};

function addUnitPriority(unit, priority) {
    priorities[unit] = priority;
}

function getPrioritizedUnits(unitsObj) {
    var units = [],
        u;
    for (u in unitsObj) {
        if (hasOwnProp(unitsObj, u)) {
            units.push({ unit: u, priority: priorities[u] });
        }
    }
    units.sort(function (a, b) {
        return a.priority - b.priority;
    });
    return units;
}

function isLeapYear(year) {
    return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
}

function absFloor(number) {
    if (number < 0) {
        // -0 -> 0
        return Math.ceil(number) || 0;
    } else {
        return Math.floor(number);
    }
}

function toInt(argumentForCoercion) {
    var coercedNumber = +argumentForCoercion,
        value = 0;

    if (coercedNumber !== 0 && isFinite(coercedNumber)) {
        value = absFloor(coercedNumber);
    }

    return value;
}

function makeGetSet(unit, keepTime) {
    return function (value) {
        if (value != null) {
            set$1(this, unit, value);
            hooks.updateOffset(this, keepTime);
            return this;
        } else {
            return get(this, unit);
        }
    };
}

function get(mom, unit) {
    return mom.isValid()
        ? mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]()
        : NaN;
}

function set$1(mom, unit, value) {
    if (mom.isValid() && !isNaN(value)) {
        if (
            unit === 'FullYear' &&
            isLeapYear(mom.year()) &&
            mom.month() === 1 &&
            mom.date() === 29
        ) {
            value = toInt(value);
            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](
                value,
                mom.month(),
                daysInMonth(value, mom.month())
            );
        } else {
            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
        }
    }
}

// MOMENTS

function stringGet(units) {
    units = normalizeUnits(units);
    if (isFunction(this[units])) {
        return this[units]();
    }
    return this;
}

function stringSet(units, value) {
    if (typeof units === 'object') {
        units = normalizeObjectUnits(units);
        var prioritized = getPrioritizedUnits(units),
            i,
            prioritizedLen = prioritized.length;
        for (i = 0; i < prioritizedLen; i++) {
            this[prioritized[i].unit](units[prioritized[i].unit]);
        }
    } else {
        units = normalizeUnits(units);
        if (isFunction(this[units])) {
            return this[units](value);
        }
    }
    return this;
}

var match1 = /\d/, //       0 - 9
    match2 = /\d\d/, //      00 - 99
    match3 = /\d{3}/, //     000 - 999
    match4 = /\d{4}/, //    0000 - 9999
    match6 = /[+-]?\d{6}/, // -999999 - 999999
    match1to2 = /\d\d?/, //       0 - 99
    match3to4 = /\d\d\d\d?/, //     999 - 9999
    match5to6 = /\d\d\d\d\d\d?/, //   99999 - 999999
    match1to3 = /\d{1,3}/, //       0 - 999
    match1to4 = /\d{1,4}/, //       0 - 9999
    match1to6 = /[+-]?\d{1,6}/, // -999999 - 999999
    matchUnsigned = /\d+/, //       0 - inf
    matchSigned = /[+-]?\d+/, //    -inf - inf
    matchOffset = /Z|[+-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z
    matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi, // +00 -00 +00:00 -00:00 +0000 -0000 or Z
    matchTimestamp = /[+-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123
    // any word (or two) characters or numbers including two/three word month in arabic.
    // includes scottish gaelic two word and hyphenated months
    matchWord =
        /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,
    regexes;

regexes = {};

function addRegexToken(token, regex, strictRegex) {
    regexes[token] = isFunction(regex)
        ? regex
        : function (isStrict, localeData) {
              return isStrict && strictRegex ? strictRegex : regex;
          };
}

function getParseRegexForToken(token, config) {
    if (!hasOwnProp(regexes, token)) {
        return new RegExp(unescapeFormat(token));
    }

    return regexes[token](config._strict, config._locale);
}

// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
function unescapeFormat(s) {
    return regexEscape(
        s
            .replace('\\', '')
            .replace(
                /\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,
                function (matched, p1, p2, p3, p4) {
                    return p1 || p2 || p3 || p4;
                }
            )
    );
}

function regexEscape(s) {
    return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
}

var tokens = {};

function addParseToken(token, callback) {
    var i,
        func = callback,
        tokenLen;
    if (typeof token === 'string') {
        token = [token];
    }
    if (isNumber(callback)) {
        func = function (input, array) {
            array[callback] = toInt(input);
        };
    }
    tokenLen = token.length;
    for (i = 0; i < tokenLen; i++) {
        tokens[token[i]] = func;
    }
}

function addWeekParseToken(token, callback) {
    addParseToken(token, function (input, array, config, token) {
        config._w = config._w || {};
        callback(input, config._w, config, token);
    });
}

function addTimeToArrayFromToken(token, input, config) {
    if (input != null && hasOwnProp(tokens, token)) {
        tokens[token](input, config._a, config, token);
    }
}

var YEAR = 0,
    MONTH = 1,
    DATE = 2,
    HOUR = 3,
    MINUTE = 4,
    SECOND = 5,
    MILLISECOND = 6,
    WEEK = 7,
    WEEKDAY = 8;

function mod(n, x) {
    return ((n % x) + x) % x;
}

var indexOf;

if (Array.prototype.indexOf) {
    indexOf = Array.prototype.indexOf;
} else {
    indexOf = function (o) {
        // I know
        var i;
        for (i = 0; i < this.length; ++i) {
            if (this[i] === o) {
                return i;
            }
        }
        return -1;
    };
}

function daysInMonth(year, month) {
    if (isNaN(year) || isNaN(month)) {
        return NaN;
    }
    var modMonth = mod(month, 12);
    year += (month - modMonth) / 12;
    return modMonth === 1
        ? isLeapYear(year)
            ? 29
            : 28
        : 31 - ((modMonth % 7) % 2);
}

// FORMATTING

addFormatToken('M', ['MM', 2], 'Mo', function () {
    return this.month() + 1;
});

addFormatToken('MMM', 0, 0, function (format) {
    return this.localeData().monthsShort(this, format);
});

addFormatToken('MMMM', 0, 0, function (format) {
    return this.localeData().months(this, format);
});

// ALIASES

addUnitAlias('month', 'M');

// PRIORITY

addUnitPriority('month', 8);

// PARSING

addRegexToken('M', match1to2);
addRegexToken('MM', match1to2, match2);
addRegexToken('MMM', function (isStrict, locale) {
    return locale.monthsShortRegex(isStrict);
});
addRegexToken('MMMM', function (isStrict, locale) {
    return locale.monthsRegex(isStrict);
});

addParseToken(['M', 'MM'], function (input, array) {
    array[MONTH] = toInt(input) - 1;
});

addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {
    var month = config._locale.monthsParse(input, token, config._strict);
    // if we didn't find a month name, mark the date as invalid.
    if (month != null) {
        array[MONTH] = month;
    } else {
        getParsingFlags(config).invalidMonth = input;
    }
});

// LOCALES

var defaultLocaleMonths =
        'January_February_March_April_May_June_July_August_September_October_November_December'.split(
            '_'
        ),
    defaultLocaleMonthsShort =
        'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
    MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,
    defaultMonthsShortRegex = matchWord,
    defaultMonthsRegex = matchWord;

function localeMonths(m, format) {
    if (!m) {
        return isArray(this._months)
            ? this._months
            : this._months['standalone'];
    }
    return isArray(this._months)
        ? this._months[m.month()]
        : this._months[
              (this._months.isFormat || MONTHS_IN_FORMAT).test(format)
                  ? 'format'
                  : 'standalone'
          ][m.month()];
}

function localeMonthsShort(m, format) {
    if (!m) {
        return isArray(this._monthsShort)
            ? this._monthsShort
            : this._monthsShort['standalone'];
    }
    return isArray(this._monthsShort)
        ? this._monthsShort[m.month()]
        : this._monthsShort[
              MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'
          ][m.month()];
}

function handleStrictParse(monthName, format, strict) {
    var i,
        ii,
        mom,
        llc = monthName.toLocaleLowerCase();
    if (!this._monthsParse) {
        // this is not used
        this._monthsParse = [];
        this._longMonthsParse = [];
        this._shortMonthsParse = [];
        for (i = 0; i < 12; ++i) {
            mom = createUTC([2000, i]);
            this._shortMonthsParse[i] = this.monthsShort(
                mom,
                ''
            ).toLocaleLowerCase();
            this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();
        }
    }

    if (strict) {
        if (format === 'MMM') {
            ii = indexOf.call(this._shortMonthsParse, llc);
            return ii !== -1 ? ii : null;
        } else {
            ii = indexOf.call(this._longMonthsParse, llc);
            return ii !== -1 ? ii : null;
        }
    } else {
        if (format === 'MMM') {
            ii = indexOf.call(this._shortMonthsParse, llc);
            if (ii !== -1) {
                return ii;
            }
            ii = indexOf.call(this._longMonthsParse, llc);
            return ii !== -1 ? ii : null;
        } else {
            ii = indexOf.call(this._longMonthsParse, llc);
            if (ii !== -1) {
                return ii;
            }
            ii = indexOf.call(this._shortMonthsParse, llc);
            return ii !== -1 ? ii : null;
        }
    }
}

function localeMonthsParse(monthName, format, strict) {
    var i, mom, regex;

    if (this._monthsParseExact) {
        return handleStrictParse.call(this, monthName, format, strict);
    }

    if (!this._monthsParse) {
        this._monthsParse = [];
        this._longMonthsParse = [];
        this._shortMonthsParse = [];
    }

    // TODO: add sorting
    // Sorting makes sure if one month (or abbr) is a prefix of another
    // see sorting in computeMonthsParse
    for (i = 0; i < 12; i++) {
        // make the regex if we don't have it already
        mom = createUTC([2000, i]);
        if (strict && !this._longMonthsParse[i]) {
            this._longMonthsParse[i] = new RegExp(
                '^' + this.months(mom, '').replace('.', '') + '$',
                'i'
            );
            this._shortMonthsParse[i] = new RegExp(
                '^' + this.monthsShort(mom, '').replace('.', '') + '$',
                'i'
            );
        }
        if (!strict && !this._monthsParse[i]) {
            regex =
                '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
            this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
        }
        // test the regex
        if (
            strict &&
            format === 'MMMM' &&
            this._longMonthsParse[i].test(monthName)
        ) {
            return i;
        } else if (
            strict &&
            format === 'MMM' &&
            this._shortMonthsParse[i].test(monthName)
        ) {
            return i;
        } else if (!strict && this._monthsParse[i].test(monthName)) {
            return i;
        }
    }
}

// MOMENTS

function setMonth(mom, value) {
    var dayOfMonth;

    if (!mom.isValid()) {
        // No op
        return mom;
    }

    if (typeof value === 'string') {
        if (/^\d+$/.test(value)) {
            value = toInt(value);
        } else {
            value = mom.localeData().monthsParse(value);
            // TODO: Another silent failure?
            if (!isNumber(value)) {
                return mom;
            }
        }
    }

    dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));
    mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
    return mom;
}

function getSetMonth(value) {
    if (value != null) {
        setMonth(this, value);
        hooks.updateOffset(this, true);
        return this;
    } else {
        return get(this, 'Month');
    }
}

function getDaysInMonth() {
    return daysInMonth(this.year(), this.month());
}

function monthsShortRegex(isStrict) {
    if (this._monthsParseExact) {
        if (!hasOwnProp(this, '_monthsRegex')) {
            computeMonthsParse.call(this);
        }
        if (isStrict) {
            return this._monthsShortStrictRegex;
        } else {
            return this._monthsShortRegex;
        }
    } else {
        if (!hasOwnProp(this, '_monthsShortRegex')) {
            this._monthsShortRegex = defaultMonthsShortRegex;
        }
        return this._monthsShortStrictRegex && isStrict
            ? this._monthsShortStrictRegex
            : this._monthsShortRegex;
    }
}

function monthsRegex(isStrict) {
    if (this._monthsParseExact) {
        if (!hasOwnProp(this, '_monthsRegex')) {
            computeMonthsParse.call(this);
        }
        if (isStrict) {
            return this._monthsStrictRegex;
        } else {
            return this._monthsRegex;
        }
    } else {
        if (!hasOwnProp(this, '_monthsRegex')) {
            this._monthsRegex = defaultMonthsRegex;
        }
        return this._monthsStrictRegex && isStrict
            ? this._monthsStrictRegex
            : this._monthsRegex;
    }
}

function computeMonthsParse() {
    function cmpLenRev(a, b) {
        return b.length - a.length;
    }

    var shortPieces = [],
        longPieces = [],
        mixedPieces = [],
        i,
        mom;
    for (i = 0; i < 12; i++) {
        // make the regex if we don't have it already
        mom = createUTC([2000, i]);
        shortPieces.push(this.monthsShort(mom, ''));
        longPieces.push(this.months(mom, ''));
        mixedPieces.push(this.months(mom, ''));
        mixedPieces.push(this.monthsShort(mom, ''));
    }
    // Sorting makes sure if one month (or abbr) is a prefix of another it
    // will match the longer piece.
    shortPieces.sort(cmpLenRev);
    longPieces.sort(cmpLenRev);
    mixedPieces.sort(cmpLenRev);
    for (i = 0; i < 12; i++) {
        shortPieces[i] = regexEscape(shortPieces[i]);
        longPieces[i] = regexEscape(longPieces[i]);
    }
    for (i = 0; i < 24; i++) {
        mixedPieces[i] = regexEscape(mixedPieces[i]);
    }

    this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
    this._monthsShortRegex = this._monthsRegex;
    this._monthsStrictRegex = new RegExp(
        '^(' + longPieces.join('|') + ')',
        'i'
    );
    this._monthsShortStrictRegex = new RegExp(
        '^(' + shortPieces.join('|') + ')',
        'i'
    );
}

// FORMATTING

addFormatToken('Y', 0, 0, function () {
    var y = this.year();
    return y <= 9999 ? zeroFill(y, 4) : '+' + y;
});

addFormatToken(0, ['YY', 2], 0, function () {
    return this.year() % 100;
});

addFormatToken(0, ['YYYY', 4], 0, 'year');
addFormatToken(0, ['YYYYY', 5], 0, 'year');
addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');

// ALIASES

addUnitAlias('year', 'y');

// PRIORITIES

addUnitPriority('year', 1);

// PARSING

addRegexToken('Y', matchSigned);
addRegexToken('YY', match1to2, match2);
addRegexToken('YYYY', match1to4, match4);
addRegexToken('YYYYY', match1to6, match6);
addRegexToken('YYYYYY', match1to6, match6);

addParseToken(['YYYYY', 'YYYYYY'], YEAR);
addParseToken('YYYY', function (input, array) {
    array[YEAR] =
        input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);
});
addParseToken('YY', function (input, array) {
    array[YEAR] = hooks.parseTwoDigitYear(input);
});
addParseToken('Y', function (input, array) {
    array[YEAR] = parseInt(input, 10);
});

// HELPERS

function daysInYear(year) {
    return isLeapYear(year) ? 366 : 365;
}

// HOOKS

hooks.parseTwoDigitYear = function (input) {
    return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
};

// MOMENTS

var getSetYear = makeGetSet('FullYear', true);

function getIsLeapYear() {
    return isLeapYear(this.year());
}

function createDate(y, m, d, h, M, s, ms) {
    // can't just apply() to create a date:
    // https://stackoverflow.com/q/181348
    var date;
    // the date constructor remaps years 0-99 to 1900-1999
    if (y < 100 && y >= 0) {
        // preserve leap years using a full 400 year cycle, then reset
        date = new Date(y + 400, m, d, h, M, s, ms);
        if (isFinite(date.getFullYear())) {
            date.setFullYear(y);
        }
    } else {
        date = new Date(y, m, d, h, M, s, ms);
    }

    return date;
}

function createUTCDate(y) {
    var date, args;
    // the Date.UTC function remaps years 0-99 to 1900-1999
    if (y < 100 && y >= 0) {
        args = Array.prototype.slice.call(arguments);
        // preserve leap years using a full 400 year cycle, then reset
        args[0] = y + 400;
        date = new Date(Date.UTC.apply(null, args));
        if (isFinite(date.getUTCFullYear())) {
            date.setUTCFullYear(y);
        }
    } else {
        date = new Date(Date.UTC.apply(null, arguments));
    }

    return date;
}

// start-of-first-week - start-of-year
function firstWeekOffset(year, dow, doy) {
    var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
        fwd = 7 + dow - doy,
        // first-week day local weekday -- which local weekday is fwd
        fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;

    return -fwdlw + fwd - 1;
}

// https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
    var localWeekday = (7 + weekday - dow) % 7,
        weekOffset = firstWeekOffset(year, dow, doy),
        dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,
        resYear,
        resDayOfYear;

    if (dayOfYear <= 0) {
        resYear = year - 1;
        resDayOfYear = daysInYear(resYear) + dayOfYear;
    } else if (dayOfYear > daysInYear(year)) {
        resYear = year + 1;
        resDayOfYear = dayOfYear - daysInYear(year);
    } else {
        resYear = year;
        resDayOfYear = dayOfYear;
    }

    return {
        year: resYear,
        dayOfYear: resDayOfYear,
    };
}

function weekOfYear(mom, dow, doy) {
    var weekOffset = firstWeekOffset(mom.year(), dow, doy),
        week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,
        resWeek,
        resYear;

    if (week < 1) {
        resYear = mom.year() - 1;
        resWeek = week + weeksInYear(resYear, dow, doy);
    } else if (week > weeksInYear(mom.year(), dow, doy)) {
        resWeek = week - weeksInYear(mom.year(), dow, doy);
        resYear = mom.year() + 1;
    } else {
        resYear = mom.year();
        resWeek = week;
    }

    return {
        week: resWeek,
        year: resYear,
    };
}

function weeksInYear(year, dow, doy) {
    var weekOffset = firstWeekOffset(year, dow, doy),
        weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
    return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
}

// FORMATTING

addFormatToken('w', ['ww', 2], 'wo', 'week');
addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');

// ALIASES

addUnitAlias('week', 'w');
addUnitAlias('isoWeek', 'W');

// PRIORITIES

addUnitPriority('week', 5);
addUnitPriority('isoWeek', 5);

// PARSING

addRegexToken('w', match1to2);
addRegexToken('ww', match1to2, match2);
addRegexToken('W', match1to2);
addRegexToken('WW', match1to2, match2);

addWeekParseToken(
    ['w', 'ww', 'W', 'WW'],
    function (input, week, config, token) {
        week[token.substr(0, 1)] = toInt(input);
    }
);

// HELPERS

// LOCALES

function localeWeek(mom) {
    return weekOfYear(mom, this._week.dow, this._week.doy).week;
}

var defaultLocaleWeek = {
    dow: 0, // Sunday is the first day of the week.
    doy: 6, // The week that contains Jan 6th is the first week of the year.
};

function localeFirstDayOfWeek() {
    return this._week.dow;
}

function localeFirstDayOfYear() {
    return this._week.doy;
}

// MOMENTS

function getSetWeek(input) {
    var week = this.localeData().week(this);
    return input == null ? week : this.add((input - week) * 7, 'd');
}

function getSetISOWeek(input) {
    var week = weekOfYear(this, 1, 4).week;
    return input == null ? week : this.add((input - week) * 7, 'd');
}

// FORMATTING

addFormatToken('d', 0, 'do', 'day');

addFormatToken('dd', 0, 0, function (format) {
    return this.localeData().weekdaysMin(this, format);
});

addFormatToken('ddd', 0, 0, function (format) {
    return this.localeData().weekdaysShort(this, format);
});

addFormatToken('dddd', 0, 0, function (format) {
    return this.localeData().weekdays(this, format);
});

addFormatToken('e', 0, 0, 'weekday');
addFormatToken('E', 0, 0, 'isoWeekday');

// ALIASES

addUnitAlias('day', 'd');
addUnitAlias('weekday', 'e');
addUnitAlias('isoWeekday', 'E');

// PRIORITY
addUnitPriority('day', 11);
addUnitPriority('weekday', 11);
addUnitPriority('isoWeekday', 11);

// PARSING

addRegexToken('d', match1to2);
addRegexToken('e', match1to2);
addRegexToken('E', match1to2);
addRegexToken('dd', function (isStrict, locale) {
    return locale.weekdaysMinRegex(isStrict);
});
addRegexToken('ddd', function (isStrict, locale) {
    return locale.weekdaysShortRegex(isStrict);
});
addRegexToken('dddd', function (isStrict, locale) {
    return locale.weekdaysRegex(isStrict);
});

addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {
    var weekday = config._locale.weekdaysParse(input, token, config._strict);
    // if we didn't get a weekday name, mark the date as invalid
    if (weekday != null) {
        week.d = weekday;
    } else {
        getParsingFlags(config).invalidWeekday = input;
    }
});

addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
    week[token] = toInt(input);
});

// HELPERS

function parseWeekday(input, locale) {
    if (typeof input !== 'string') {
        return input;
    }

    if (!isNaN(input)) {
        return parseInt(input, 10);
    }

    input = locale.weekdaysParse(input);
    if (typeof input === 'number') {
        return input;
    }

    return null;
}

function parseIsoWeekday(input, locale) {
    if (typeof input === 'string') {
        return locale.weekdaysParse(input) % 7 || 7;
    }
    return isNaN(input) ? null : input;
}

// LOCALES
function shiftWeekdays(ws, n) {
    return ws.slice(n, 7).concat(ws.slice(0, n));
}

var defaultLocaleWeekdays =
        'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
    defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
    defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
    defaultWeekdaysRegex = matchWord,
    defaultWeekdaysShortRegex = matchWord,
    defaultWeekdaysMinRegex = matchWord;

function localeWeekdays(m, format) {
    var weekdays = isArray(this._weekdays)
        ? this._weekdays
        : this._weekdays[
              m && m !== true && this._weekdays.isFormat.test(format)
                  ? 'format'
                  : 'standalone'
          ];
    return m === true
        ? shiftWeekdays(weekdays, this._week.dow)
        : m
        ? weekdays[m.day()]
        : weekdays;
}

function localeWeekdaysShort(m) {
    return m === true
        ? shiftWeekdays(this._weekdaysShort, this._week.dow)
        : m
        ? this._weekdaysShort[m.day()]
        : this._weekdaysShort;
}

function localeWeekdaysMin(m) {
    return m === true
        ? shiftWeekdays(this._weekdaysMin, this._week.dow)
        : m
        ? this._weekdaysMin[m.day()]
        : this._weekdaysMin;
}

function handleStrictParse$1(weekdayName, format, strict) {
    var i,
        ii,
        mom,
        llc = weekdayName.toLocaleLowerCase();
    if (!this._weekdaysParse) {
        this._weekdaysParse = [];
        this._shortWeekdaysParse = [];
        this._minWeekdaysParse = [];

        for (i = 0; i < 7; ++i) {
            mom = createUTC([2000, 1]).day(i);
            this._minWeekdaysParse[i] = this.weekdaysMin(
                mom,
                ''
            ).toLocaleLowerCase();
            this._shortWeekdaysParse[i] = this.weekdaysShort(
                mom,
                ''
            ).toLocaleLowerCase();
            this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();
        }
    }

    if (strict) {
        if (format === 'dddd') {
            ii = indexOf.call(this._weekdaysParse, llc);
            return ii !== -1 ? ii : null;
        } else if (format === 'ddd') {
            ii = indexOf.call(this._shortWeekdaysParse, llc);
            return ii !== -1 ? ii : null;
        } else {
            ii = indexOf.call(this._minWeekdaysParse, llc);
            return ii !== -1 ? ii : null;
        }
    } else {
        if (format === 'dddd') {
            ii = indexOf.call(this._weekdaysParse, llc);
            if (ii !== -1) {
                return ii;
            }
            ii = indexOf.call(this._shortWeekdaysParse, llc);
            if (ii !== -1) {
                return ii;
            }
            ii = indexOf.call(this._minWeekdaysParse, llc);
            return ii !== -1 ? ii : null;
        } else if (format === 'ddd') {
            ii = indexOf.call(this._shortWeekdaysParse, llc);
            if (ii !== -1) {
                return ii;
            }
            ii = indexOf.call(this._weekdaysParse, llc);
            if (ii !== -1) {
                return ii;
            }
            ii = indexOf.call(this._minWeekdaysParse, llc);
            return ii !== -1 ? ii : null;
        } else {
            ii = indexOf.call(this._minWeekdaysParse, llc);
            if (ii !== -1) {
                return ii;
            }
            ii = indexOf.call(this._weekdaysParse, llc);
            if (ii !== -1) {
                return ii;
            }
            ii = indexOf.call(this._shortWeekdaysParse, llc);
            return ii !== -1 ? ii : null;
        }
    }
}

function localeWeekdaysParse(weekdayName, format, strict) {
    var i, mom, regex;

    if (this._weekdaysParseExact) {
        return handleStrictParse$1.call(this, weekdayName, format, strict);
    }

    if (!this._weekdaysParse) {
        this._weekdaysParse = [];
        this._minWeekdaysParse = [];
        this._shortWeekdaysParse = [];
        this._fullWeekdaysParse = [];
    }

    for (i = 0; i < 7; i++) {
        // make the regex if we don't have it already

        mom = createUTC([2000, 1]).day(i);
        if (strict && !this._fullWeekdaysParse[i]) {
            this._fullWeekdaysParse[i] = new RegExp(
                '^' + this.weekdays(mom, '').replace('.', '\\.?') + '$',
                'i'
            );
            this._shortWeekdaysParse[i] = new RegExp(
                '^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$',
                'i'
            );
            this._minWeekdaysParse[i] = new RegExp(
                '^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$',
                'i'
            );
        }
        if (!this._weekdaysParse[i]) {
            regex =
                '^' +
                this.weekdays(mom, '') +
                '|^' +
                this.weekdaysShort(mom, '') +
                '|^' +
                this.weekdaysMin(mom, '');
            this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
        }
        // test the regex
        if (
            strict &&
            format === 'dddd' &&
            this._fullWeekdaysParse[i].test(weekdayName)
        ) {
            return i;
        } else if (
            strict &&
            format === 'ddd' &&
            this._shortWeekdaysParse[i].test(weekdayName)
        ) {
            return i;
        } else if (
            strict &&
            format === 'dd' &&
            this._minWeekdaysParse[i].test(weekdayName)
        ) {
            return i;
        } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {
            return i;
        }
    }
}

// MOMENTS

function getSetDayOfWeek(input) {
    if (!this.isValid()) {
        return input != null ? this : NaN;
    }
    var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
    if (input != null) {
        input = parseWeekday(input, this.localeData());
        return this.add(input - day, 'd');
    } else {
        return day;
    }
}

function getSetLocaleDayOfWeek(input) {
    if (!this.isValid()) {
        return input != null ? this : NaN;
    }
    var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
    return input == null ? weekday : this.add(input - weekday, 'd');
}

function getSetISODayOfWeek(input) {
    if (!this.isValid()) {
        return input != null ? this : NaN;
    }

    // behaves the same as moment#day except
    // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
    // as a setter, sunday should belong to the previous week.

    if (input != null) {
        var weekday = parseIsoWeekday(input, this.localeData());
        return this.day(this.day() % 7 ? weekday : weekday - 7);
    } else {
        return this.day() || 7;
    }
}

function weekdaysRegex(isStrict) {
    if (this._weekdaysParseExact) {
        if (!hasOwnProp(this, '_weekdaysRegex')) {
            computeWeekdaysParse.call(this);
        }
        if (isStrict) {
            return this._weekdaysStrictRegex;
        } else {
            return this._weekdaysRegex;
        }
    } else {
        if (!hasOwnProp(this, '_weekdaysRegex')) {
            this._weekdaysRegex = defaultWeekdaysRegex;
        }
        return this._weekdaysStrictRegex && isStrict
            ? this._weekdaysStrictRegex
            : this._weekdaysRegex;
    }
}

function weekdaysShortRegex(isStrict) {
    if (this._weekdaysParseExact) {
        if (!hasOwnProp(this, '_weekdaysRegex')) {
            computeWeekdaysParse.call(this);
        }
        if (isStrict) {
            return this._weekdaysShortStrictRegex;
        } else {
            return this._weekdaysShortRegex;
        }
    } else {
        if (!hasOwnProp(this, '_weekdaysShortRegex')) {
            this._weekdaysShortRegex = defaultWeekdaysShortRegex;
        }
        return this._weekdaysShortStrictRegex && isStrict
            ? this._weekdaysShortStrictRegex
            : this._weekdaysShortRegex;
    }
}

function weekdaysMinRegex(isStrict) {
    if (this._weekdaysParseExact) {
        if (!hasOwnProp(this, '_weekdaysRegex')) {
            computeWeekdaysParse.call(this);
        }
        if (isStrict) {
            return this._weekdaysMinStrictRegex;
        } else {
            return this._weekdaysMinRegex;
        }
    } else {
        if (!hasOwnProp(this, '_weekdaysMinRegex')) {
            this._weekdaysMinRegex = defaultWeekdaysMinRegex;
        }
        return this._weekdaysMinStrictRegex && isStrict
            ? this._weekdaysMinStrictRegex
            : this._weekdaysMinRegex;
    }
}

function computeWeekdaysParse() {
    function cmpLenRev(a, b) {
        return b.length - a.length;
    }

    var minPieces = [],
        shortPieces = [],
        longPieces = [],
        mixedPieces = [],
        i,
        mom,
        minp,
        shortp,
        longp;
    for (i = 0; i < 7; i++) {
        // make the regex if we don't have it already
        mom = createUTC([2000, 1]).day(i);
        minp = regexEscape(this.weekdaysMin(mom, ''));
        shortp = regexEscape(this.weekdaysShort(mom, ''));
        longp = regexEscape(this.weekdays(mom, ''));
        minPieces.push(minp);
        shortPieces.push(shortp);
        longPieces.push(longp);
        mixedPieces.push(minp);
        mixedPieces.push(shortp);
        mixedPieces.push(longp);
    }
    // Sorting makes sure if one weekday (or abbr) is a prefix of another it
    // will match the longer piece.
    minPieces.sort(cmpLenRev);
    shortPieces.sort(cmpLenRev);
    longPieces.sort(cmpLenRev);
    mixedPieces.sort(cmpLenRev);

    this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
    this._weekdaysShortRegex = this._weekdaysRegex;
    this._weekdaysMinRegex = this._weekdaysRegex;

    this._weekdaysStrictRegex = new RegExp(
        '^(' + longPieces.join('|') + ')',
        'i'
    );
    this._weekdaysShortStrictRegex = new RegExp(
        '^(' + shortPieces.join('|') + ')',
        'i'
    );
    this._weekdaysMinStrictRegex = new RegExp(
        '^(' + minPieces.join('|') + ')',
        'i'
    );
}

// FORMATTING

function hFormat() {
    return this.hours() % 12 || 12;
}

function kFormat() {
    return this.hours() || 24;
}

addFormatToken('H', ['HH', 2], 0, 'hour');
addFormatToken('h', ['hh', 2], 0, hFormat);
addFormatToken('k', ['kk', 2], 0, kFormat);

addFormatToken('hmm', 0, 0, function () {
    return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);
});

addFormatToken('hmmss', 0, 0, function () {
    return (
        '' +
        hFormat.apply(this) +
        zeroFill(this.minutes(), 2) +
        zeroFill(this.seconds(), 2)
    );
});

addFormatToken('Hmm', 0, 0, function () {
    return '' + this.hours() + zeroFill(this.minutes(), 2);
});

addFormatToken('Hmmss', 0, 0, function () {
    return (
        '' +
        this.hours() +
        zeroFill(this.minutes(), 2) +
        zeroFill(this.seconds(), 2)
    );
});

function meridiem(token, lowercase) {
    addFormatToken(token, 0, 0, function () {
        return this.localeData().meridiem(
            this.hours(),
            this.minutes(),
            lowercase
        );
    });
}

meridiem('a', true);
meridiem('A', false);

// ALIASES

addUnitAlias('hour', 'h');

// PRIORITY
addUnitPriority('hour', 13);

// PARSING

function matchMeridiem(isStrict, locale) {
    return locale._meridiemParse;
}

addRegexToken('a', matchMeridiem);
addRegexToken('A', matchMeridiem);
addRegexToken('H', match1to2);
addRegexToken('h', match1to2);
addRegexToken('k', match1to2);
addRegexToken('HH', match1to2, match2);
addRegexToken('hh', match1to2, match2);
addRegexToken('kk', match1to2, match2);

addRegexToken('hmm', match3to4);
addRegexToken('hmmss', match5to6);
addRegexToken('Hmm', match3to4);
addRegexToken('Hmmss', match5to6);

addParseToken(['H', 'HH'], HOUR);
addParseToken(['k', 'kk'], function (input, array, config) {
    var kInput = toInt(input);
    array[HOUR] = kInput === 24 ? 0 : kInput;
});
addParseToken(['a', 'A'], function (input, array, config) {
    config._isPm = config._locale.isPM(input);
    config._meridiem = input;
});
addParseToken(['h', 'hh'], function (input, array, config) {
    array[HOUR] = toInt(input);
    getParsingFlags(config).bigHour = true;
});
addParseToken('hmm', function (input, array, config) {
    var pos = input.length - 2;
    array[HOUR] = toInt(input.substr(0, pos));
    array[MINUTE] = toInt(input.substr(pos));
    getParsingFlags(config).bigHour = true;
});
addParseToken('hmmss', function (input, array, config) {
    var pos1 = input.length - 4,
        pos2 = input.length - 2;
    array[HOUR] = toInt(input.substr(0, pos1));
    array[MINUTE] = toInt(input.substr(pos1, 2));
    array[SECOND] = toInt(input.substr(pos2));
    getParsingFlags(config).bigHour = true;
});
addParseToken('Hmm', function (input, array, config) {
    var pos = input.length - 2;
    array[HOUR] = toInt(input.substr(0, pos));
    array[MINUTE] = toInt(input.substr(pos));
});
addParseToken('Hmmss', function (input, array, config) {
    var pos1 = input.length - 4,
        pos2 = input.length - 2;
    array[HOUR] = toInt(input.substr(0, pos1));
    array[MINUTE] = toInt(input.substr(pos1, 2));
    array[SECOND] = toInt(input.substr(pos2));
});

// LOCALES

function localeIsPM(input) {
    // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
    // Using charAt should be more compatible.
    return (input + '').toLowerCase().charAt(0) === 'p';
}

var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i,
    // Setting the hour should keep the time, because the user explicitly
    // specified which hour they want. So trying to maintain the same hour (in
    // a new timezone) makes sense. Adding/subtracting hours does not follow
    // this rule.
    getSetHour = makeGetSet('Hours', true);

function localeMeridiem(hours, minutes, isLower) {
    if (hours > 11) {
        return isLower ? 'pm' : 'PM';
    } else {
        return isLower ? 'am' : 'AM';
    }
}

var baseConfig = {
    calendar: defaultCalendar,
    longDateFormat: defaultLongDateFormat,
    invalidDate: defaultInvalidDate,
    ordinal: defaultOrdinal,
    dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,
    relativeTime: defaultRelativeTime,

    months: defaultLocaleMonths,
    monthsShort: defaultLocaleMonthsShort,

    week: defaultLocaleWeek,

    weekdays: defaultLocaleWeekdays,
    weekdaysMin: defaultLocaleWeekdaysMin,
    weekdaysShort: defaultLocaleWeekdaysShort,

    meridiemParse: defaultLocaleMeridiemParse,
};

// internal storage for locale config files
var locales = {},
    localeFamilies = {},
    globalLocale;

function commonPrefix(arr1, arr2) {
    var i,
        minl = Math.min(arr1.length, arr2.length);
    for (i = 0; i < minl; i += 1) {
        if (arr1[i] !== arr2[i]) {
            return i;
        }
    }
    return minl;
}

function normalizeLocale(key) {
    return key ? key.toLowerCase().replace('_', '-') : key;
}

// pick the locale from the array
// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
function chooseLocale(names) {
    var i = 0,
        j,
        next,
        locale,
        split;

    while (i < names.length) {
        split = normalizeLocale(names[i]).split('-');
        j = split.length;
        next = normalizeLocale(names[i + 1]);
        next = next ? next.split('-') : null;
        while (j > 0) {
            locale = loadLocale(split.slice(0, j).join('-'));
            if (locale) {
                return locale;
            }
            if (
                next &&
                next.length >= j &&
                commonPrefix(split, next) >= j - 1
            ) {
                //the next array item is better than a shallower substring of this one
                break;
            }
            j--;
        }
        i++;
    }
    return globalLocale;
}

function isLocaleNameSane(name) {
    // Prevent names that look like filesystem paths, i.e contain '/' or '\'
    return name.match('^[^/\\\\]*$') != null;
}

function loadLocale(name) {
    var oldLocale = null,
        aliasedRequire;
    // TODO: Find a better way to register and load all the locales in Node
    if (
        locales[name] === undefined &&
        typeof module !== 'undefined' &&
        module &&
        module.exports &&
        isLocaleNameSane(name)
    ) {
        try {
            oldLocale = globalLocale._abbr;
            aliasedRequire = require;
            aliasedRequire('./locale/' + name);
            getSetGlobalLocale(oldLocale);
        } catch (e) {
            // mark as not found to avoid repeating expensive file require call causing high CPU
            // when trying to find en-US, en_US, en-us for every format call
            locales[name] = null; // null means not found
        }
    }
    return locales[name];
}

// This function will load locale and then set the global locale.  If
// no arguments are passed in, it will simply return the current global
// locale key.
function getSetGlobalLocale(key, values) {
    var data;
    if (key) {
        if (isUndefined(values)) {
            data = getLocale(key);
        } else {
            data = defineLocale(key, values);
        }

        if (data) {
            // moment.duration._locale = moment._locale = data;
            globalLocale = data;
        } else {
            if (typeof console !== 'undefined' && console.warn) {
                //warn user if arguments are passed but the locale could not be set
                console.warn(
                    'Locale ' + key + ' not found. Did you forget to load it?'
                );
            }
        }
    }

    return globalLocale._abbr;
}

function defineLocale(name, config) {
    if (config !== null) {
        var locale,
            parentConfig = baseConfig;
        config.abbr = name;
        if (locales[name] != null) {
            deprecateSimple(
                'defineLocaleOverride',
                'use moment.updateLocale(localeName, config) to change ' +
                    'an existing locale. moment.defineLocale(localeName, ' +
                    'config) should only be used for creating a new locale ' +
                    'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'
            );
            parentConfig = locales[name]._config;
        } else if (config.parentLocale != null) {
            if (locales[config.parentLocale] != null) {
                parentConfig = locales[config.parentLocale]._config;
            } else {
                locale = loadLocale(config.parentLocale);
                if (locale != null) {
                    parentConfig = locale._config;
                } else {
                    if (!localeFamilies[config.parentLocale]) {
                        localeFamilies[config.parentLocale] = [];
                    }
                    localeFamilies[config.parentLocale].push({
                        name: name,
                        config: config,
                    });
                    return null;
                }
            }
        }
        locales[name] = new Locale(mergeConfigs(parentConfig, config));

        if (localeFamilies[name]) {
            localeFamilies[name].forEach(function (x) {
                defineLocale(x.name, x.config);
            });
        }

        // backwards compat for now: also set the locale
        // make sure we set the locale AFTER all child locales have been
        // created, so we won't end up with the child locale set.
        getSetGlobalLocale(name);

        return locales[name];
    } else {
        // useful for testing
        delete locales[name];
        return null;
    }
}

function updateLocale(name, config) {
    if (config != null) {
        var locale,
            tmpLocale,
            parentConfig = baseConfig;

        if (locales[name] != null && locales[name].parentLocale != null) {
            // Update existing child locale in-place to avoid memory-leaks
            locales[name].set(mergeConfigs(locales[name]._config, config));
        } else {
            // MERGE
            tmpLocale = loadLocale(name);
            if (tmpLocale != null) {
                parentConfig = tmpLocale._config;
            }
            config = mergeConfigs(parentConfig, config);
            if (tmpLocale == null) {
                // updateLocale is called for creating a new locale
                // Set abbr so it will have a name (getters return
                // undefined otherwise).
                config.abbr = name;
            }
            locale = new Locale(config);
            locale.parentLocale = locales[name];
            locales[name] = locale;
        }

        // backwards compat for now: also set the locale
        getSetGlobalLocale(name);
    } else {
        // pass null for config to unupdate, useful for tests
        if (locales[name] != null) {
            if (locales[name].parentLocale != null) {
                locales[name] = locales[name].parentLocale;
                if (name === getSetGlobalLocale()) {
                    getSetGlobalLocale(name);
                }
            } else if (locales[name] != null) {
                delete locales[name];
            }
        }
    }
    return locales[name];
}

// returns locale data
function getLocale(key) {
    var locale;

    if (key && key._locale && key._locale._abbr) {
        key = key._locale._abbr;
    }

    if (!key) {
        return globalLocale;
    }

    if (!isArray(key)) {
        //short-circuit everything else
        locale = loadLocale(key);
        if (locale) {
            return locale;
        }
        key = [key];
    }

    return chooseLocale(key);
}

function listLocales() {
    return keys(locales);
}

function checkOverflow(m) {
    var overflow,
        a = m._a;

    if (a && getParsingFlags(m).overflow === -2) {
        overflow =
            a[MONTH] < 0 || a[MONTH] > 11
                ? MONTH
                : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH])
                ? DATE
                : a[HOUR] < 0 ||
                  a[HOUR] > 24 ||
                  (a[HOUR] === 24 &&
                      (a[MINUTE] !== 0 ||
                          a[SECOND] !== 0 ||
                          a[MILLISECOND] !== 0))
                ? HOUR
                : a[MINUTE] < 0 || a[MINUTE] > 59
                ? MINUTE
                : a[SECOND] < 0 || a[SECOND] > 59
                ? SECOND
                : a[MILLISECOND] < 0 || a[MILLISECOND] > 999
                ? MILLISECOND
                : -1;

        if (
            getParsingFlags(m)._overflowDayOfYear &&
            (overflow < YEAR || overflow > DATE)
        ) {
            overflow = DATE;
        }
        if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
            overflow = WEEK;
        }
        if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
            overflow = WEEKDAY;
        }

        getParsingFlags(m).overflow = overflow;
    }

    return m;
}

// iso 8601 regex
// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
var extendedIsoRegex =
        /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
    basicIsoRegex =
        /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
    tzRegex = /Z|[+-]\d\d(?::?\d\d)?/,
    isoDates = [
        ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
        ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/],
        ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/],
        ['GGGG-[W]WW', /\d{4}-W\d\d/, false],
        ['YYYY-DDD', /\d{4}-\d{3}/],
        ['YYYY-MM', /\d{4}-\d\d/, false],
        ['YYYYYYMMDD', /[+-]\d{10}/],
        ['YYYYMMDD', /\d{8}/],
        ['GGGG[W]WWE', /\d{4}W\d{3}/],
        ['GGGG[W]WW', /\d{4}W\d{2}/, false],
        ['YYYYDDD', /\d{7}/],
        ['YYYYMM', /\d{6}/, false],
        ['YYYY', /\d{4}/, false],
    ],
    // iso time formats and regexes
    isoTimes = [
        ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/],
        ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/],
        ['HH:mm:ss', /\d\d:\d\d:\d\d/],
        ['HH:mm', /\d\d:\d\d/],
        ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/],
        ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/],
        ['HHmmss', /\d\d\d\d\d\d/],
        ['HHmm', /\d\d\d\d/],
        ['HH', /\d\d/],
    ],
    aspNetJsonRegex = /^\/?Date\((-?\d+)/i,
    // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3
    rfc2822 =
        /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,
    obsOffsets = {
        UT: 0,
        GMT: 0,
        EDT: -4 * 60,
        EST: -5 * 60,
        CDT: -5 * 60,
        CST: -6 * 60,
        MDT: -6 * 60,
        MST: -7 * 60,
        PDT: -7 * 60,
        PST: -8 * 60,
    };

// date from iso format
function configFromISO(config) {
    var i,
        l,
        string = config._i,
        match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),
        allowTime,
        dateFormat,
        timeFormat,
        tzFormat,
        isoDatesLen = isoDates.length,
        isoTimesLen = isoTimes.length;

    if (match) {
        getParsingFlags(config).iso = true;
        for (i = 0, l = isoDatesLen; i < l; i++) {
            if (isoDates[i][1].exec(match[1])) {
                dateFormat = isoDates[i][0];
                allowTime = isoDates[i][2] !== false;
                break;
            }
        }
        if (dateFormat == null) {
            config._isValid = false;
            return;
        }
        if (match[3]) {
            for (i = 0, l = isoTimesLen; i < l; i++) {
                if (isoTimes[i][1].exec(match[3])) {
                    // match[2] should be 'T' or space
                    timeFormat = (match[2] || ' ') + isoTimes[i][0];
                    break;
                }
            }
            if (timeFormat == null) {
                config._isValid = false;
                return;
            }
        }
        if (!allowTime && timeFormat != null) {
            config._isValid = false;
            return;
        }
        if (match[4]) {
            if (tzRegex.exec(match[4])) {
                tzFormat = 'Z';
            } else {
                config._isValid = false;
                return;
            }
        }
        config._f = dateFormat + (timeFormat || '') + (tzFormat || '');
        configFromStringAndFormat(config);
    } else {
        config._isValid = false;
    }
}

function extractFromRFC2822Strings(
    yearStr,
    monthStr,
    dayStr,
    hourStr,
    minuteStr,
    secondStr
) {
    var result = [
        untruncateYear(yearStr),
        defaultLocaleMonthsShort.indexOf(monthStr),
        parseInt(dayStr, 10),
        parseInt(hourStr, 10),
        parseInt(minuteStr, 10),
    ];

    if (secondStr) {
        result.push(parseInt(secondStr, 10));
    }

    return result;
}

function untruncateYear(yearStr) {
    var year = parseInt(yearStr, 10);
    if (year <= 49) {
        return 2000 + year;
    } else if (year <= 999) {
        return 1900 + year;
    }
    return year;
}

function preprocessRFC2822(s) {
    // Remove comments and folding whitespace and replace multiple-spaces with a single space
    return s
        .replace(/\([^()]*\)|[\n\t]/g, ' ')
        .replace(/(\s\s+)/g, ' ')
        .replace(/^\s\s*/, '')
        .replace(/\s\s*$/, '');
}

function checkWeekday(weekdayStr, parsedInput, config) {
    if (weekdayStr) {
        // TODO: Replace the vanilla JS Date object with an independent day-of-week check.
        var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),
            weekdayActual = new Date(
                parsedInput[0],
                parsedInput[1],
                parsedInput[2]
            ).getDay();
        if (weekdayProvided !== weekdayActual) {
            getParsingFlags(config).weekdayMismatch = true;
            config._isValid = false;
            return false;
        }
    }
    return true;
}

function calculateOffset(obsOffset, militaryOffset, numOffset) {
    if (obsOffset) {
        return obsOffsets[obsOffset];
    } else if (militaryOffset) {
        // the only allowed military tz is Z
        return 0;
    } else {
        var hm = parseInt(numOffset, 10),
            m = hm % 100,
            h = (hm - m) / 100;
        return h * 60 + m;
    }
}

// date and time from ref 2822 format
function configFromRFC2822(config) {
    var match = rfc2822.exec(preprocessRFC2822(config._i)),
        parsedArray;
    if (match) {
        parsedArray = extractFromRFC2822Strings(
            match[4],
            match[3],
            match[2],
            match[5],
            match[6],
            match[7]
        );
        if (!checkWeekday(match[1], parsedArray, config)) {
            return;
        }

        config._a = parsedArray;
        config._tzm = calculateOffset(match[8], match[9], match[10]);

        config._d = createUTCDate.apply(null, config._a);
        config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);

        getParsingFlags(config).rfc2822 = true;
    } else {
        config._isValid = false;
    }
}

// date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict
function configFromString(config) {
    var matched = aspNetJsonRegex.exec(config._i);
    if (matched !== null) {
        config._d = new Date(+matched[1]);
        return;
    }

    configFromISO(config);
    if (config._isValid === false) {
        delete config._isValid;
    } else {
        return;
    }

    configFromRFC2822(config);
    if (config._isValid === false) {
        delete config._isValid;
    } else {
        return;
    }

    if (config._strict) {
        config._isValid = false;
    } else {
        // Final attempt, use Input Fallback
        hooks.createFromInputFallback(config);
    }
}

hooks.createFromInputFallback = deprecate(
    'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +
        'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +
        'discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.',
    function (config) {
        config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
    }
);

// Pick the first defined of two or three arguments.
function defaults(a, b, c) {
    if (a != null) {
        return a;
    }
    if (b != null) {
        return b;
    }
    return c;
}

function currentDateArray(config) {
    // hooks is actually the exported moment object
    var nowValue = new Date(hooks.now());
    if (config._useUTC) {
        return [
            nowValue.getUTCFullYear(),
            nowValue.getUTCMonth(),
            nowValue.getUTCDate(),
        ];
    }
    return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];
}

// convert an array to a date.
// the array should mirror the parameters below
// note: all values past the year are optional and will default to the lowest possible value.
// [year, month, day , hour, minute, second, millisecond]
function configFromArray(config) {
    var i,
        date,
        input = [],
        currentDate,
        expectedWeekday,
        yearToUse;

    if (config._d) {
        return;
    }

    currentDate = currentDateArray(config);

    //compute day of the year from weeks and weekdays
    if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
        dayOfYearFromWeekInfo(config);
    }

    //if the day of the year is set, figure out what it is
    if (config._dayOfYear != null) {
        yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);

        if (
            config._dayOfYear > daysInYear(yearToUse) ||
            config._dayOfYear === 0
        ) {
            getParsingFlags(config)._overflowDayOfYear = true;
        }

        date = createUTCDate(yearToUse, 0, config._dayOfYear);
        config._a[MONTH] = date.getUTCMonth();
        config._a[DATE] = date.getUTCDate();
    }

    // Default to current date.
    // * if no year, month, day of month are given, default to today
    // * if day of month is given, default month and year
    // * if month is given, default only year
    // * if year is given, don't default anything
    for (i = 0; i < 3 && config._a[i] == null; ++i) {
        config._a[i] = input[i] = currentDate[i];
    }

    // Zero out whatever was not defaulted, including time
    for (; i < 7; i++) {
        config._a[i] = input[i] =
            config._a[i] == null ? (i === 2 ? 1 : 0) : config._a[i];
    }

    // Check for 24:00:00.000
    if (
        config._a[HOUR] === 24 &&
        config._a[MINUTE] === 0 &&
        config._a[SECOND] === 0 &&
        config._a[MILLISECOND] === 0
    ) {
        config._nextDay = true;
        config._a[HOUR] = 0;
    }

    config._d = (config._useUTC ? createUTCDate : createDate).apply(
        null,
        input
    );
    expectedWeekday = config._useUTC
        ? config._d.getUTCDay()
        : config._d.getDay();

    // Apply timezone offset from input. The actual utcOffset can be changed
    // with parseZone.
    if (config._tzm != null) {
        config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
    }

    if (config._nextDay) {
        config._a[HOUR] = 24;
    }

    // check for mismatching day of week
    if (
        config._w &&
        typeof config._w.d !== 'undefined' &&
        config._w.d !== expectedWeekday
    ) {
        getParsingFlags(config).weekdayMismatch = true;
    }
}

function dayOfYearFromWeekInfo(config) {
    var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek;

    w = config._w;
    if (w.GG != null || w.W != null || w.E != null) {
        dow = 1;
        doy = 4;

        // TODO: We need to take the current isoWeekYear, but that depends on
        // how we interpret now (local, utc, fixed offset). So create
        // a now version of current config (take local/utc/offset flags, and
        // create now).
        weekYear = defaults(
            w.GG,
            config._a[YEAR],
            weekOfYear(createLocal(), 1, 4).year
        );
        week = defaults(w.W, 1);
        weekday = defaults(w.E, 1);
        if (weekday < 1 || weekday > 7) {
            weekdayOverflow = true;
        }
    } else {
        dow = config._locale._week.dow;
        doy = config._locale._week.doy;

        curWeek = weekOfYear(createLocal(), dow, doy);

        weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);

        // Default to current week.
        week = defaults(w.w, curWeek.week);

        if (w.d != null) {
            // weekday -- low day numbers are considered next week
            weekday = w.d;
            if (weekday < 0 || weekday > 6) {
                weekdayOverflow = true;
            }
        } else if (w.e != null) {
            // local weekday -- counting starts from beginning of week
            weekday = w.e + dow;
            if (w.e < 0 || w.e > 6) {
                weekdayOverflow = true;
            }
        } else {
            // default to beginning of week
            weekday = dow;
        }
    }
    if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {
        getParsingFlags(config)._overflowWeeks = true;
    } else if (weekdayOverflow != null) {
        getParsingFlags(config)._overflowWeekday = true;
    } else {
        temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);
        config._a[YEAR] = temp.year;
        config._dayOfYear = temp.dayOfYear;
    }
}

// constant that refers to the ISO standard
hooks.ISO_8601 = function () {};

// constant that refers to the RFC 2822 form
hooks.RFC_2822 = function () {};

// date from string and format string
function configFromStringAndFormat(config) {
    // TODO: Move this to another part of the creation flow to prevent circular deps
    if (config._f === hooks.ISO_8601) {
        configFromISO(config);
        return;
    }
    if (config._f === hooks.RFC_2822) {
        configFromRFC2822(config);
        return;
    }
    config._a = [];
    getParsingFlags(config).empty = true;

    // This array is used to make a Date, either with `new Date` or `Date.UTC`
    var string = '' + config._i,
        i,
        parsedInput,
        tokens,
        token,
        skipped,
        stringLength = string.length,
        totalParsedInputLength = 0,
        era,
        tokenLen;

    tokens =
        expandFormat(config._f, config._locale).match(formattingTokens) || [];
    tokenLen = tokens.length;
    for (i = 0; i < tokenLen; i++) {
        token = tokens[i];
        parsedInput = (string.match(getParseRegexForToken(token, config)) ||
            [])[0];
        if (parsedInput) {
            skipped = string.substr(0, string.indexOf(parsedInput));
            if (skipped.length > 0) {
                getParsingFlags(config).unusedInput.push(skipped);
            }
            string = string.slice(
                string.indexOf(parsedInput) + parsedInput.length
            );
            totalParsedInputLength += parsedInput.length;
        }
        // don't parse if it's not a known token
        if (formatTokenFunctions[token]) {
            if (parsedInput) {
                getParsingFlags(config).empty = false;
            } else {
                getParsingFlags(config).unusedTokens.push(token);
            }
            addTimeToArrayFromToken(token, parsedInput, config);
        } else if (config._strict && !parsedInput) {
            getParsingFlags(config).unusedTokens.push(token);
        }
    }

    // add remaining unparsed input length to the string
    getParsingFlags(config).charsLeftOver =
        stringLength - totalParsedInputLength;
    if (string.length > 0) {
        getParsingFlags(config).unusedInput.push(string);
    }

    // clear _12h flag if hour is <= 12
    if (
        config._a[HOUR] <= 12 &&
        getParsingFlags(config).bigHour === true &&
        config._a[HOUR] > 0
    ) {
        getParsingFlags(config).bigHour = undefined;
    }

    getParsingFlags(config).parsedDateParts = config._a.slice(0);
    getParsingFlags(config).meridiem = config._meridiem;
    // handle meridiem
    config._a[HOUR] = meridiemFixWrap(
        config._locale,
        config._a[HOUR],
        config._meridiem
    );

    // handle era
    era = getParsingFlags(config).era;
    if (era !== null) {
        config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]);
    }

    configFromArray(config);
    checkOverflow(config);
}

function meridiemFixWrap(locale, hour, meridiem) {
    var isPm;

    if (meridiem == null) {
        // nothing to do
        return hour;
    }
    if (locale.meridiemHour != null) {
        return locale.meridiemHour(hour, meridiem);
    } else if (locale.isPM != null) {
        // Fallback
        isPm = locale.isPM(meridiem);
        if (isPm && hour < 12) {
            hour += 12;
        }
        if (!isPm && hour === 12) {
            hour = 0;
        }
        return hour;
    } else {
        // this is not supposed to happen
        return hour;
    }
}

// date from string and array of format strings
function configFromStringAndArray(config) {
    var tempConfig,
        bestMoment,
        scoreToBeat,
        i,
        currentScore,
        validFormatFound,
        bestFormatIsValid = false,
        configfLen = config._f.length;

    if (configfLen === 0) {
        getParsingFlags(config).invalidFormat = true;
        config._d = new Date(NaN);
        return;
    }

    for (i = 0; i < configfLen; i++) {
        currentScore = 0;
        validFormatFound = false;
        tempConfig = copyConfig({}, config);
        if (config._useUTC != null) {
            tempConfig._useUTC = config._useUTC;
        }
        tempConfig._f = config._f[i];
        configFromStringAndFormat(tempConfig);

        if (isValid(tempConfig)) {
            validFormatFound = true;
        }

        // if there is any input that was not parsed add a penalty for that format
        currentScore += getParsingFlags(tempConfig).charsLeftOver;

        //or tokens
        currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;

        getParsingFlags(tempConfig).score = currentScore;

        if (!bestFormatIsValid) {
            if (
                scoreToBeat == null ||
                currentScore < scoreToBeat ||
                validFormatFound
            ) {
                scoreToBeat = currentScore;
                bestMoment = tempConfig;
                if (validFormatFound) {
                    bestFormatIsValid = true;
                }
            }
        } else {
            if (currentScore < scoreToBeat) {
                scoreToBeat = currentScore;
                bestMoment = tempConfig;
            }
        }
    }

    extend(config, bestMoment || tempConfig);
}

function configFromObject(config) {
    if (config._d) {
        return;
    }

    var i = normalizeObjectUnits(config._i),
        dayOrDate = i.day === undefined ? i.date : i.day;
    config._a = map(
        [i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond],
        function (obj) {
            return obj && parseInt(obj, 10);
        }
    );

    configFromArray(config);
}

function createFromConfig(config) {
    var res = new Moment(checkOverflow(prepareConfig(config)));
    if (res._nextDay) {
        // Adding is smart enough around DST
        res.add(1, 'd');
        res._nextDay = undefined;
    }

    return res;
}

function prepareConfig(config) {
    var input = config._i,
        format = config._f;

    config._locale = config._locale || getLocale(config._l);

    if (input === null || (format === undefined && input === '')) {
        return createInvalid({ nullInput: true });
    }

    if (typeof input === 'string') {
        config._i = input = config._locale.preparse(input);
    }

    if (isMoment(input)) {
        return new Moment(checkOverflow(input));
    } else if (isDate(input)) {
        config._d = input;
    } else if (isArray(format)) {
        configFromStringAndArray(config);
    } else if (format) {
        configFromStringAndFormat(config);
    } else {
        configFromInput(config);
    }

    if (!isValid(config)) {
        config._d = null;
    }

    return config;
}

function configFromInput(config) {
    var input = config._i;
    if (isUndefined(input)) {
        config._d = new Date(hooks.now());
    } else if (isDate(input)) {
        config._d = new Date(input.valueOf());
    } else if (typeof input === 'string') {
        configFromString(config);
    } else if (isArray(input)) {
        config._a = map(input.slice(0), function (obj) {
            return parseInt(obj, 10);
        });
        configFromArray(config);
    } else if (isObject(input)) {
        configFromObject(config);
    } else if (isNumber(input)) {
        // from milliseconds
        config._d = new Date(input);
    } else {
        hooks.createFromInputFallback(config);
    }
}

function createLocalOrUTC(input, format, locale, strict, isUTC) {
    var c = {};

    if (format === true || format === false) {
        strict = format;
        format = undefined;
    }

    if (locale === true || locale === false) {
        strict = locale;
        locale = undefined;
    }

    if (
        (isObject(input) && isObjectEmpty(input)) ||
        (isArray(input) && input.length === 0)
    ) {
        input = undefined;
    }
    // object construction must be done this way.
    // https://github.com/moment/moment/issues/1423
    c._isAMomentObject = true;
    c._useUTC = c._isUTC = isUTC;
    c._l = locale;
    c._i = input;
    c._f = format;
    c._strict = strict;

    return createFromConfig(c);
}

function createLocal(input, format, locale, strict) {
    return createLocalOrUTC(input, format, locale, strict, false);
}

var prototypeMin = deprecate(
        'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',
        function () {
            var other = createLocal.apply(null, arguments);
            if (this.isValid() && other.isValid()) {
                return other < this ? this : other;
            } else {
                return createInvalid();
            }
        }
    ),
    prototypeMax = deprecate(
        'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',
        function () {
            var other = createLocal.apply(null, arguments);
            if (this.isValid() && other.isValid()) {
                return other > this ? this : other;
            } else {
                return createInvalid();
            }
        }
    );

// Pick a moment m from moments so that m[fn](other) is true for all
// other. This relies on the function fn to be transitive.
//
// moments should either be an array of moment objects or an array, whose
// first element is an array of moment objects.
function pickBy(fn, moments) {
    var res, i;
    if (moments.length === 1 && isArray(moments[0])) {
        moments = moments[0];
    }
    if (!moments.length) {
        return createLocal();
    }
    res = moments[0];
    for (i = 1; i < moments.length; ++i) {
        if (!moments[i].isValid() || moments[i][fn](res)) {
            res = moments[i];
        }
    }
    return res;
}

// TODO: Use [].sort instead?
function min() {
    var args = [].slice.call(arguments, 0);

    return pickBy('isBefore', args);
}

function max() {
    var args = [].slice.call(arguments, 0);

    return pickBy('isAfter', args);
}

var now = function () {
    return Date.now ? Date.now() : +new Date();
};

var ordering = [
    'year',
    'quarter',
    'month',
    'week',
    'day',
    'hour',
    'minute',
    'second',
    'millisecond',
];

function isDurationValid(m) {
    var key,
        unitHasDecimal = false,
        i,
        orderLen = ordering.length;
    for (key in m) {
        if (
            hasOwnProp(m, key) &&
            !(
                indexOf.call(ordering, key) !== -1 &&
                (m[key] == null || !isNaN(m[key]))
            )
        ) {
            return false;
        }
    }

    for (i = 0; i < orderLen; ++i) {
        if (m[ordering[i]]) {
            if (unitHasDecimal) {
                return false; // only allow non-integers for smallest unit
            }
            if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {
                unitHasDecimal = true;
            }
        }
    }

    return true;
}

function isValid$1() {
    return this._isValid;
}

function createInvalid$1() {
    return createDuration(NaN);
}

function Duration(duration) {
    var normalizedInput = normalizeObjectUnits(duration),
        years = normalizedInput.year || 0,
        quarters = normalizedInput.quarter || 0,
        months = normalizedInput.month || 0,
        weeks = normalizedInput.week || normalizedInput.isoWeek || 0,
        days = normalizedInput.day || 0,
        hours = normalizedInput.hour || 0,
        minutes = normalizedInput.minute || 0,
        seconds = normalizedInput.second || 0,
        milliseconds = normalizedInput.millisecond || 0;

    this._isValid = isDurationValid(normalizedInput);

    // representation for dateAddRemove
    this._milliseconds =
        +milliseconds +
        seconds * 1e3 + // 1000
        minutes * 6e4 + // 1000 * 60
        hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
    // Because of dateAddRemove treats 24 hours as different from a
    // day when working around DST, we need to store them separately
    this._days = +days + weeks * 7;
    // It is impossible to translate months into days without knowing
    // which months you are are talking about, so we have to store
    // it separately.
    this._months = +months + quarters * 3 + years * 12;

    this._data = {};

    this._locale = getLocale();

    this._bubble();
}

function isDuration(obj) {
    return obj instanceof Duration;
}

function absRound(number) {
    if (number < 0) {
        return Math.round(-1 * number) * -1;
    } else {
        return Math.round(number);
    }
}

// compare two arrays, return the number of differences
function compareArrays(array1, array2, dontConvert) {
    var len = Math.min(array1.length, array2.length),
        lengthDiff = Math.abs(array1.length - array2.length),
        diffs = 0,
        i;
    for (i = 0; i < len; i++) {
        if (
            (dontConvert && array1[i] !== array2[i]) ||
            (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))
        ) {
            diffs++;
        }
    }
    return diffs + lengthDiff;
}

// FORMATTING

function offset(token, separator) {
    addFormatToken(token, 0, 0, function () {
        var offset = this.utcOffset(),
            sign = '+';
        if (offset < 0) {
            offset = -offset;
            sign = '-';
        }
        return (
            sign +
            zeroFill(~~(offset / 60), 2) +
            separator +
            zeroFill(~~offset % 60, 2)
        );
    });
}

offset('Z', ':');
offset('ZZ', '');

// PARSING

addRegexToken('Z', matchShortOffset);
addRegexToken('ZZ', matchShortOffset);
addParseToken(['Z', 'ZZ'], function (input, array, config) {
    config._useUTC = true;
    config._tzm = offsetFromString(matchShortOffset, input);
});

// HELPERS

// timezone chunker
// '+10:00' > ['10',  '00']
// '-1530'  > ['-15', '30']
var chunkOffset = /([\+\-]|\d\d)/gi;

function offsetFromString(matcher, string) {
    var matches = (string || '').match(matcher),
        chunk,
        parts,
        minutes;

    if (matches === null) {
        return null;
    }

    chunk = matches[matches.length - 1] || [];
    parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];
    minutes = +(parts[1] * 60) + toInt(parts[2]);

    return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes;
}

// Return a moment from input, that is local/utc/zone equivalent to model.
function cloneWithOffset(input, model) {
    var res, diff;
    if (model._isUTC) {
        res = model.clone();
        diff =
            (isMoment(input) || isDate(input)
                ? input.valueOf()
                : createLocal(input).valueOf()) - res.valueOf();
        // Use low-level api, because this fn is low-level api.
        res._d.setTime(res._d.valueOf() + diff);
        hooks.updateOffset(res, false);
        return res;
    } else {
        return createLocal(input).local();
    }
}

function getDateOffset(m) {
    // On Firefox.24 Date#getTimezoneOffset returns a floating point.
    // https://github.com/moment/moment/pull/1871
    return -Math.round(m._d.getTimezoneOffset());
}

// HOOKS

// This function will be called whenever a moment is mutated.
// It is intended to keep the offset in sync with the timezone.
hooks.updateOffset = function () {};

// MOMENTS

// keepLocalTime = true means only change the timezone, without
// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
// +0200, so we adjust the time as needed, to be valid.
//
// Keeping the time actually adds/subtracts (one hour)
// from the actual represented time. That is why we call updateOffset
// a second time. In case it wants us to change the offset again
// _changeInProgress == true case, then we have to adjust, because
// there is no such time in the given timezone.
function getSetOffset(input, keepLocalTime, keepMinutes) {
    var offset = this._offset || 0,
        localAdjust;
    if (!this.isValid()) {
        return input != null ? this : NaN;
    }
    if (input != null) {
        if (typeof input === 'string') {
            input = offsetFromString(matchShortOffset, input);
            if (input === null) {
                return this;
            }
        } else if (Math.abs(input) < 16 && !keepMinutes) {
            input = input * 60;
        }
        if (!this._isUTC && keepLocalTime) {
            localAdjust = getDateOffset(this);
        }
        this._offset = input;
        this._isUTC = true;
        if (localAdjust != null) {
            this.add(localAdjust, 'm');
        }
        if (offset !== input) {
            if (!keepLocalTime || this._changeInProgress) {
                addSubtract(
                    this,
                    createDuration(input - offset, 'm'),
                    1,
                    false
                );
            } else if (!this._changeInProgress) {
                this._changeInProgress = true;
                hooks.updateOffset(this, true);
                this._changeInProgress = null;
            }
        }
        return this;
    } else {
        return this._isUTC ? offset : getDateOffset(this);
    }
}

function getSetZone(input, keepLocalTime) {
    if (input != null) {
        if (typeof input !== 'string') {
            input = -input;
        }

        this.utcOffset(input, keepLocalTime);

        return this;
    } else {
        return -this.utcOffset();
    }
}

function setOffsetToUTC(keepLocalTime) {
    return this.utcOffset(0, keepLocalTime);
}

function setOffsetToLocal(keepLocalTime) {
    if (this._isUTC) {
        this.utcOffset(0, keepLocalTime);
        this._isUTC = false;

        if (keepLocalTime) {
            this.subtract(getDateOffset(this), 'm');
        }
    }
    return this;
}

function setOffsetToParsedOffset() {
    if (this._tzm != null) {
        this.utcOffset(this._tzm, false, true);
    } else if (typeof this._i === 'string') {
        var tZone = offsetFromString(matchOffset, this._i);
        if (tZone != null) {
            this.utcOffset(tZone);
        } else {
            this.utcOffset(0, true);
        }
    }
    return this;
}

function hasAlignedHourOffset(input) {
    if (!this.isValid()) {
        return false;
    }
    input = input ? createLocal(input).utcOffset() : 0;

    return (this.utcOffset() - input) % 60 === 0;
}

function isDaylightSavingTime() {
    return (
        this.utcOffset() > this.clone().month(0).utcOffset() ||
        this.utcOffset() > this.clone().month(5).utcOffset()
    );
}

function isDaylightSavingTimeShifted() {
    if (!isUndefined(this._isDSTShifted)) {
        return this._isDSTShifted;
    }

    var c = {},
        other;

    copyConfig(c, this);
    c = prepareConfig(c);

    if (c._a) {
        other = c._isUTC ? createUTC(c._a) : createLocal(c._a);
        this._isDSTShifted =
            this.isValid() && compareArrays(c._a, other.toArray()) > 0;
    } else {
        this._isDSTShifted = false;
    }

    return this._isDSTShifted;
}

function isLocal() {
    return this.isValid() ? !this._isUTC : false;
}

function isUtcOffset() {
    return this.isValid() ? this._isUTC : false;
}

function isUtc() {
    return this.isValid() ? this._isUTC && this._offset === 0 : false;
}

// ASP.NET json date format regex
var aspNetRegex = /^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,
    // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
    // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
    // and further modified to allow for strings containing both week and day
    isoRegex =
        /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;

function createDuration(input, key) {
    var duration = input,
        // matching against regexp is expensive, do it on demand
        match = null,
        sign,
        ret,
        diffRes;

    if (isDuration(input)) {
        duration = {
            ms: input._milliseconds,
            d: input._days,
            M: input._months,
        };
    } else if (isNumber(input) || !isNaN(+input)) {
        duration = {};
        if (key) {
            duration[key] = +input;
        } else {
            duration.milliseconds = +input;
        }
    } else if ((match = aspNetRegex.exec(input))) {
        sign = match[1] === '-' ? -1 : 1;
        duration = {
            y: 0,
            d: toInt(match[DATE]) * sign,
            h: toInt(match[HOUR]) * sign,
            m: toInt(match[MINUTE]) * sign,
            s: toInt(match[SECOND]) * sign,
            ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign, // the millisecond decimal point is included in the match
        };
    } else if ((match = isoRegex.exec(input))) {
        sign = match[1] === '-' ? -1 : 1;
        duration = {
            y: parseIso(match[2], sign),
            M: parseIso(match[3], sign),
            w: parseIso(match[4], sign),
            d: parseIso(match[5], sign),
            h: parseIso(match[6], sign),
            m: parseIso(match[7], sign),
            s: parseIso(match[8], sign),
        };
    } else if (duration == null) {
        // checks for null or undefined
        duration = {};
    } else if (
        typeof duration === 'object' &&
        ('from' in duration || 'to' in duration)
    ) {
        diffRes = momentsDifference(
            createLocal(duration.from),
            createLocal(duration.to)
        );

        duration = {};
        duration.ms = diffRes.milliseconds;
        duration.M = diffRes.months;
    }

    ret = new Duration(duration);

    if (isDuration(input) && hasOwnProp(input, '_locale')) {
        ret._locale = input._locale;
    }

    if (isDuration(input) && hasOwnProp(input, '_isValid')) {
        ret._isValid = input._isValid;
    }

    return ret;
}

createDuration.fn = Duration.prototype;
createDuration.invalid = createInvalid$1;

function parseIso(inp, sign) {
    // We'd normally use ~~inp for this, but unfortunately it also
    // converts floats to ints.
    // inp may be undefined, so careful calling replace on it.
    var res = inp && parseFloat(inp.replace(',', '.'));
    // apply sign while we're at it
    return (isNaN(res) ? 0 : res) * sign;
}

function positiveMomentsDifference(base, other) {
    var res = {};

    res.months =
        other.month() - base.month() + (other.year() - base.year()) * 12;
    if (base.clone().add(res.months, 'M').isAfter(other)) {
        --res.months;
    }

    res.milliseconds = +other - +base.clone().add(res.months, 'M');

    return res;
}

function momentsDifference(base, other) {
    var res;
    if (!(base.isValid() && other.isValid())) {
        return { milliseconds: 0, months: 0 };
    }

    other = cloneWithOffset(other, base);
    if (base.isBefore(other)) {
        res = positiveMomentsDifference(base, other);
    } else {
        res = positiveMomentsDifference(other, base);
        res.milliseconds = -res.milliseconds;
        res.months = -res.months;
    }

    return res;
}

// TODO: remove 'name' arg after deprecation is removed
function createAdder(direction, name) {
    return function (val, period) {
        var dur, tmp;
        //invert the arguments, but complain about it
        if (period !== null && !isNaN(+period)) {
            deprecateSimple(
                name,
                'moment().' +
                    name +
                    '(period, number) is deprecated. Please use moment().' +
                    name +
                    '(number, period). ' +
                    'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'
            );
            tmp = val;
            val = period;
            period = tmp;
        }

        dur = createDuration(val, period);
        addSubtract(this, dur, direction);
        return this;
    };
}

function addSubtract(mom, duration, isAdding, updateOffset) {
    var milliseconds = duration._milliseconds,
        days = absRound(duration._days),
        months = absRound(duration._months);

    if (!mom.isValid()) {
        // No op
        return;
    }

    updateOffset = updateOffset == null ? true : updateOffset;

    if (months) {
        setMonth(mom, get(mom, 'Month') + months * isAdding);
    }
    if (days) {
        set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);
    }
    if (milliseconds) {
        mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
    }
    if (updateOffset) {
        hooks.updateOffset(mom, days || months);
    }
}

var add = createAdder(1, 'add'),
    subtract = createAdder(-1, 'subtract');

function isString(input) {
    return typeof input === 'string' || input instanceof String;
}

// type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined
function isMomentInput(input) {
    return (
        isMoment(input) ||
        isDate(input) ||
        isString(input) ||
        isNumber(input) ||
        isNumberOrStringArray(input) ||
        isMomentInputObject(input) ||
        input === null ||
        input === undefined
    );
}

function isMomentInputObject(input) {
    var objectTest = isObject(input) && !isObjectEmpty(input),
        propertyTest = false,
        properties = [
            'years',
            'year',
            'y',
            'months',
            'month',
            'M',
            'days',
            'day',
            'd',
            'dates',
            'date',
            'D',
            'hours',
            'hour',
            'h',
            'minutes',
            'minute',
            'm',
            'seconds',
            'second',
            's',
            'milliseconds',
            'millisecond',
            'ms',
        ],
        i,
        property,
        propertyLen = properties.length;

    for (i = 0; i < propertyLen; i += 1) {
        property = properties[i];
        propertyTest = propertyTest || hasOwnProp(input, property);
    }

    return objectTest && propertyTest;
}

function isNumberOrStringArray(input) {
    var arrayTest = isArray(input),
        dataTypeTest = false;
    if (arrayTest) {
        dataTypeTest =
            input.filter(function (item) {
                return !isNumber(item) && isString(input);
            }).length === 0;
    }
    return arrayTest && dataTypeTest;
}

function isCalendarSpec(input) {
    var objectTest = isObject(input) && !isObjectEmpty(input),
        propertyTest = false,
        properties = [
            'sameDay',
            'nextDay',
            'lastDay',
            'nextWeek',
            'lastWeek',
            'sameElse',
        ],
        i,
        property;

    for (i = 0; i < properties.length; i += 1) {
        property = properties[i];
        propertyTest = propertyTest || hasOwnProp(input, property);
    }

    return objectTest && propertyTest;
}

function getCalendarFormat(myMoment, now) {
    var diff = myMoment.diff(now, 'days', true);
    return diff < -6
        ? 'sameElse'
        : diff < -1
        ? 'lastWeek'
        : diff < 0
        ? 'lastDay'
        : diff < 1
        ? 'sameDay'
        : diff < 2
        ? 'nextDay'
        : diff < 7
        ? 'nextWeek'
        : 'sameElse';
}

function calendar$1(time, formats) {
    // Support for single parameter, formats only overload to the calendar function
    if (arguments.length === 1) {
        if (!arguments[0]) {
            time = undefined;
            formats = undefined;
        } else if (isMomentInput(arguments[0])) {
            time = arguments[0];
            formats = undefined;
        } else if (isCalendarSpec(arguments[0])) {
            formats = arguments[0];
            time = undefined;
        }
    }
    // We want to compare the start of today, vs this.
    // Getting start-of-today depends on whether we're local/utc/offset or not.
    var now = time || createLocal(),
        sod = cloneWithOffset(now, this).startOf('day'),
        format = hooks.calendarFormat(this, sod) || 'sameElse',
        output =
            formats &&
            (isFunction(formats[format])
                ? formats[format].call(this, now)
                : formats[format]);

    return this.format(
        output || this.localeData().calendar(format, this, createLocal(now))
    );
}

function clone() {
    return new Moment(this);
}

function isAfter(input, units) {
    var localInput = isMoment(input) ? input : createLocal(input);
    if (!(this.isValid() && localInput.isValid())) {
        return false;
    }
    units = normalizeUnits(units) || 'millisecond';
    if (units === 'millisecond') {
        return this.valueOf() > localInput.valueOf();
    } else {
        return localInput.valueOf() < this.clone().startOf(units).valueOf();
    }
}

function isBefore(input, units) {
    var localInput = isMoment(input) ? input : createLocal(input);
    if (!(this.isValid() && localInput.isValid())) {
        return false;
    }
    units = normalizeUnits(units) || 'millisecond';
    if (units === 'millisecond') {
        return this.valueOf() < localInput.valueOf();
    } else {
        return this.clone().endOf(units).valueOf() < localInput.valueOf();
    }
}

function isBetween(from, to, units, inclusivity) {
    var localFrom = isMoment(from) ? from : createLocal(from),
        localTo = isMoment(to) ? to : createLocal(to);
    if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) {
        return false;
    }
    inclusivity = inclusivity || '()';
    return (
        (inclusivity[0] === '('
            ? this.isAfter(localFrom, units)
            : !this.isBefore(localFrom, units)) &&
        (inclusivity[1] === ')'
            ? this.isBefore(localTo, units)
            : !this.isAfter(localTo, units))
    );
}

function isSame(input, units) {
    var localInput = isMoment(input) ? input : createLocal(input),
        inputMs;
    if (!(this.isValid() && localInput.isValid())) {
        return false;
    }
    units = normalizeUnits(units) || 'millisecond';
    if (units === 'millisecond') {
        return this.valueOf() === localInput.valueOf();
    } else {
        inputMs = localInput.valueOf();
        return (
            this.clone().startOf(units).valueOf() <= inputMs &&
            inputMs <= this.clone().endOf(units).valueOf()
        );
    }
}

function isSameOrAfter(input, units) {
    return this.isSame(input, units) || this.isAfter(input, units);
}

function isSameOrBefore(input, units) {
    return this.isSame(input, units) || this.isBefore(input, units);
}

function diff(input, units, asFloat) {
    var that, zoneDelta, output;

    if (!this.isValid()) {
        return NaN;
    }

    that = cloneWithOffset(input, this);

    if (!that.isValid()) {
        return NaN;
    }

    zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;

    units = normalizeUnits(units);

    switch (units) {
        case 'year':
            output = monthDiff(this, that) / 12;
            break;
        case 'month':
            output = monthDiff(this, that);
            break;
        case 'quarter':
            output = monthDiff(this, that) / 3;
            break;
        case 'second':
            output = (this - that) / 1e3;
            break; // 1000
        case 'minute':
            output = (this - that) / 6e4;
            break; // 1000 * 60
        case 'hour':
            output = (this - that) / 36e5;
            break; // 1000 * 60 * 60
        case 'day':
            output = (this - that - zoneDelta) / 864e5;
            break; // 1000 * 60 * 60 * 24, negate dst
        case 'week':
            output = (this - that - zoneDelta) / 6048e5;
            break; // 1000 * 60 * 60 * 24 * 7, negate dst
        default:
            output = this - that;
    }

    return asFloat ? output : absFloor(output);
}

function monthDiff(a, b) {
    if (a.date() < b.date()) {
        // end-of-month calculations work correct when the start month has more
        // days than the end month.
        return -monthDiff(b, a);
    }
    // difference in months
    var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()),
        // b is in (anchor - 1 month, anchor + 1 month)
        anchor = a.clone().add(wholeMonthDiff, 'months'),
        anchor2,
        adjust;

    if (b - anchor < 0) {
        anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
        // linear across the month
        adjust = (b - anchor) / (anchor - anchor2);
    } else {
        anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
        // linear across the month
        adjust = (b - anchor) / (anchor2 - anchor);
    }

    //check for negative zero, return zero if negative zero
    return -(wholeMonthDiff + adjust) || 0;
}

hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';

function toString() {
    return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
}

function toISOString(keepOffset) {
    if (!this.isValid()) {
        return null;
    }
    var utc = keepOffset !== true,
        m = utc ? this.clone().utc() : this;
    if (m.year() < 0 || m.year() > 9999) {
        return formatMoment(
            m,
            utc
                ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'
                : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'
        );
    }
    if (isFunction(Date.prototype.toISOString)) {
        // native implementation is ~50x faster, use it when we can
        if (utc) {
            return this.toDate().toISOString();
        } else {
            return new Date(this.valueOf() + this.utcOffset() * 60 * 1000)
                .toISOString()
                .replace('Z', formatMoment(m, 'Z'));
        }
    }
    return formatMoment(
        m,
        utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'
    );
}

/**
 * Return a human readable representation of a moment that can
 * also be evaluated to get a new moment which is the same
 *
 * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects
 */
function inspect() {
    if (!this.isValid()) {
        return 'moment.invalid(/* ' + this._i + ' */)';
    }
    var func = 'moment',
        zone = '',
        prefix,
        year,
        datetime,
        suffix;
    if (!this.isLocal()) {
        func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';
        zone = 'Z';
    }
    prefix = '[' + func + '("]';
    year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY';
    datetime = '-MM-DD[T]HH:mm:ss.SSS';
    suffix = zone + '[")]';

    return this.format(prefix + year + datetime + suffix);
}

function format(inputString) {
    if (!inputString) {
        inputString = this.isUtc()
            ? hooks.defaultFormatUtc
            : hooks.defaultFormat;
    }
    var output = formatMoment(this, inputString);
    return this.localeData().postformat(output);
}

function from(time, withoutSuffix) {
    if (
        this.isValid() &&
        ((isMoment(time) && time.isValid()) || createLocal(time).isValid())
    ) {
        return createDuration({ to: this, from: time })
            .locale(this.locale())
            .humanize(!withoutSuffix);
    } else {
        return this.localeData().invalidDate();
    }
}

function fromNow(withoutSuffix) {
    return this.from(createLocal(), withoutSuffix);
}

function to(time, withoutSuffix) {
    if (
        this.isValid() &&
        ((isMoment(time) && time.isValid()) || createLocal(time).isValid())
    ) {
        return createDuration({ from: this, to: time })
            .locale(this.locale())
            .humanize(!withoutSuffix);
    } else {
        return this.localeData().invalidDate();
    }
}

function toNow(withoutSuffix) {
    return this.to(createLocal(), withoutSuffix);
}

// If passed a locale key, it will set the locale for this
// instance.  Otherwise, it will return the locale configuration
// variables for this instance.
function locale(key) {
    var newLocaleData;

    if (key === undefined) {
        return this._locale._abbr;
    } else {
        newLocaleData = getLocale(key);
        if (newLocaleData != null) {
            this._locale = newLocaleData;
        }
        return this;
    }
}

var lang = deprecate(
    'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
    function (key) {
        if (key === undefined) {
            return this.localeData();
        } else {
            return this.locale(key);
        }
    }
);

function localeData() {
    return this._locale;
}

var MS_PER_SECOND = 1000,
    MS_PER_MINUTE = 60 * MS_PER_SECOND,
    MS_PER_HOUR = 60 * MS_PER_MINUTE,
    MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR;

// actual modulo - handles negative numbers (for dates before 1970):
function mod$1(dividend, divisor) {
    return ((dividend % divisor) + divisor) % divisor;
}

function localStartOfDate(y, m, d) {
    // the date constructor remaps years 0-99 to 1900-1999
    if (y < 100 && y >= 0) {
        // preserve leap years using a full 400 year cycle, then reset
        return new Date(y + 400, m, d) - MS_PER_400_YEARS;
    } else {
        return new Date(y, m, d).valueOf();
    }
}

function utcStartOfDate(y, m, d) {
    // Date.UTC remaps years 0-99 to 1900-1999
    if (y < 100 && y >= 0) {
        // preserve leap years using a full 400 year cycle, then reset
        return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS;
    } else {
        return Date.UTC(y, m, d);
    }
}

function startOf(units) {
    var time, startOfDate;
    units = normalizeUnits(units);
    if (units === undefined || units === 'millisecond' || !this.isValid()) {
        return this;
    }

    startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;

    switch (units) {
        case 'year':
            time = startOfDate(this.year(), 0, 1);
            break;
        case 'quarter':
            time = startOfDate(
                this.year(),
                this.month() - (this.month() % 3),
                1
            );
            break;
        case 'month':
            time = startOfDate(this.year(), this.month(), 1);
            break;
        case 'week':
            time = startOfDate(
                this.year(),
                this.month(),
                this.date() - this.weekday()
            );
            break;
        case 'isoWeek':
            time = startOfDate(
                this.year(),
                this.month(),
                this.date() - (this.isoWeekday() - 1)
            );
            break;
        case 'day':
        case 'date':
            time = startOfDate(this.year(), this.month(), this.date());
            break;
        case 'hour':
            time = this._d.valueOf();
            time -= mod$1(
                time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),
                MS_PER_HOUR
            );
            break;
        case 'minute':
            time = this._d.valueOf();
            time -= mod$1(time, MS_PER_MINUTE);
            break;
        case 'second':
            time = this._d.valueOf();
            time -= mod$1(time, MS_PER_SECOND);
            break;
    }

    this._d.setTime(time);
    hooks.updateOffset(this, true);
    return this;
}

function endOf(units) {
    var time, startOfDate;
    units = normalizeUnits(units);
    if (units === undefined || units === 'millisecond' || !this.isValid()) {
        return this;
    }

    startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;

    switch (units) {
        case 'year':
            time = startOfDate(this.year() + 1, 0, 1) - 1;
            break;
        case 'quarter':
            time =
                startOfDate(
                    this.year(),
                    this.month() - (this.month() % 3) + 3,
                    1
                ) - 1;
            break;
        case 'month':
            time = startOfDate(this.year(), this.month() + 1, 1) - 1;
            break;
        case 'week':
            time =
                startOfDate(
                    this.year(),
                    this.month(),
                    this.date() - this.weekday() + 7
                ) - 1;
            break;
        case 'isoWeek':
            time =
                startOfDate(
                    this.year(),
                    this.month(),
                    this.date() - (this.isoWeekday() - 1) + 7
                ) - 1;
            break;
        case 'day':
        case 'date':
            time = startOfDate(this.year(), this.month(), this.date() + 1) - 1;
            break;
        case 'hour':
            time = this._d.valueOf();
            time +=
                MS_PER_HOUR -
                mod$1(
                    time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),
                    MS_PER_HOUR
                ) -
                1;
            break;
        case 'minute':
            time = this._d.valueOf();
            time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1;
            break;
        case 'second':
            time = this._d.valueOf();
            time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1;
            break;
    }

    this._d.setTime(time);
    hooks.updateOffset(this, true);
    return this;
}

function valueOf() {
    return this._d.valueOf() - (this._offset || 0) * 60000;
}

function unix() {
    return Math.floor(this.valueOf() / 1000);
}

function toDate() {
    return new Date(this.valueOf());
}

function toArray() {
    var m = this;
    return [
        m.year(),
        m.month(),
        m.date(),
        m.hour(),
        m.minute(),
        m.second(),
        m.millisecond(),
    ];
}

function toObject() {
    var m = this;
    return {
        years: m.year(),
        months: m.month(),
        date: m.date(),
        hours: m.hours(),
        minutes: m.minutes(),
        seconds: m.seconds(),
        milliseconds: m.milliseconds(),
    };
}

function toJSON() {
    // new Date(NaN).toJSON() === null
    return this.isValid() ? this.toISOString() : null;
}

function isValid$2() {
    return isValid(this);
}

function parsingFlags() {
    return extend({}, getParsingFlags(this));
}

function invalidAt() {
    return getParsingFlags(this).overflow;
}

function creationData() {
    return {
        input: this._i,
        format: this._f,
        locale: this._locale,
        isUTC: this._isUTC,
        strict: this._strict,
    };
}

addFormatToken('N', 0, 0, 'eraAbbr');
addFormatToken('NN', 0, 0, 'eraAbbr');
addFormatToken('NNN', 0, 0, 'eraAbbr');
addFormatToken('NNNN', 0, 0, 'eraName');
addFormatToken('NNNNN', 0, 0, 'eraNarrow');

addFormatToken('y', ['y', 1], 'yo', 'eraYear');
addFormatToken('y', ['yy', 2], 0, 'eraYear');
addFormatToken('y', ['yyy', 3], 0, 'eraYear');
addFormatToken('y', ['yyyy', 4], 0, 'eraYear');

addRegexToken('N', matchEraAbbr);
addRegexToken('NN', matchEraAbbr);
addRegexToken('NNN', matchEraAbbr);
addRegexToken('NNNN', matchEraName);
addRegexToken('NNNNN', matchEraNarrow);

addParseToken(
    ['N', 'NN', 'NNN', 'NNNN', 'NNNNN'],
    function (input, array, config, token) {
        var era = config._locale.erasParse(input, token, config._strict);
        if (era) {
            getParsingFlags(config).era = era;
        } else {
            getParsingFlags(config).invalidEra = input;
        }
    }
);

addRegexToken('y', matchUnsigned);
addRegexToken('yy', matchUnsigned);
addRegexToken('yyy', matchUnsigned);
addRegexToken('yyyy', matchUnsigned);
addRegexToken('yo', matchEraYearOrdinal);

addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR);
addParseToken(['yo'], function (input, array, config, token) {
    var match;
    if (config._locale._eraYearOrdinalRegex) {
        match = input.match(config._locale._eraYearOrdinalRegex);
    }

    if (config._locale.eraYearOrdinalParse) {
        array[YEAR] = config._locale.eraYearOrdinalParse(input, match);
    } else {
        array[YEAR] = parseInt(input, 10);
    }
});

function localeEras(m, format) {
    var i,
        l,
        date,
        eras = this._eras || getLocale('en')._eras;
    for (i = 0, l = eras.length; i < l; ++i) {
        switch (typeof eras[i].since) {
            case 'string':
                // truncate time
                date = hooks(eras[i].since).startOf('day');
                eras[i].since = date.valueOf();
                break;
        }

        switch (typeof eras[i].until) {
            case 'undefined':
                eras[i].until = +Infinity;
                break;
            case 'string':
                // truncate time
                date = hooks(eras[i].until).startOf('day').valueOf();
                eras[i].until = date.valueOf();
                break;
        }
    }
    return eras;
}

function localeErasParse(eraName, format, strict) {
    var i,
        l,
        eras = this.eras(),
        name,
        abbr,
        narrow;
    eraName = eraName.toUpperCase();

    for (i = 0, l = eras.length; i < l; ++i) {
        name = eras[i].name.toUpperCase();
        abbr = eras[i].abbr.toUpperCase();
        narrow = eras[i].narrow.toUpperCase();

        if (strict) {
            switch (format) {
                case 'N':
                case 'NN':
                case 'NNN':
                    if (abbr === eraName) {
                        return eras[i];
                    }
                    break;

                case 'NNNN':
                    if (name === eraName) {
                        return eras[i];
                    }
                    break;

                case 'NNNNN':
                    if (narrow === eraName) {
                        return eras[i];
                    }
                    break;
            }
        } else if ([name, abbr, narrow].indexOf(eraName) >= 0) {
            return eras[i];
        }
    }
}

function localeErasConvertYear(era, year) {
    var dir = era.since <= era.until ? +1 : -1;
    if (year === undefined) {
        return hooks(era.since).year();
    } else {
        return hooks(era.since).year() + (year - era.offset) * dir;
    }
}

function getEraName() {
    var i,
        l,
        val,
        eras = this.localeData().eras();
    for (i = 0, l = eras.length; i < l; ++i) {
        // truncate time
        val = this.clone().startOf('day').valueOf();

        if (eras[i].since <= val && val <= eras[i].until) {
            return eras[i].name;
        }
        if (eras[i].until <= val && val <= eras[i].since) {
            return eras[i].name;
        }
    }

    return '';
}

function getEraNarrow() {
    var i,
        l,
        val,
        eras = this.localeData().eras();
    for (i = 0, l = eras.length; i < l; ++i) {
        // truncate time
        val = this.clone().startOf('day').valueOf();

        if (eras[i].since <= val && val <= eras[i].until) {
            return eras[i].narrow;
        }
        if (eras[i].until <= val && val <= eras[i].since) {
            return eras[i].narrow;
        }
    }

    return '';
}

function getEraAbbr() {
    var i,
        l,
        val,
        eras = this.localeData().eras();
    for (i = 0, l = eras.length; i < l; ++i) {
        // truncate time
        val = this.clone().startOf('day').valueOf();

        if (eras[i].since <= val && val <= eras[i].until) {
            return eras[i].abbr;
        }
        if (eras[i].until <= val && val <= eras[i].since) {
            return eras[i].abbr;
        }
    }

    return '';
}

function getEraYear() {
    var i,
        l,
        dir,
        val,
        eras = this.localeData().eras();
    for (i = 0, l = eras.length; i < l; ++i) {
        dir = eras[i].since <= eras[i].until ? +1 : -1;

        // truncate time
        val = this.clone().startOf('day').valueOf();

        if (
            (eras[i].since <= val && val <= eras[i].until) ||
            (eras[i].until <= val && val <= eras[i].since)
        ) {
            return (
                (this.year() - hooks(eras[i].since).year()) * dir +
                eras[i].offset
            );
        }
    }

    return this.year();
}

function erasNameRegex(isStrict) {
    if (!hasOwnProp(this, '_erasNameRegex')) {
        computeErasParse.call(this);
    }
    return isStrict ? this._erasNameRegex : this._erasRegex;
}

function erasAbbrRegex(isStrict) {
    if (!hasOwnProp(this, '_erasAbbrRegex')) {
        computeErasParse.call(this);
    }
    return isStrict ? this._erasAbbrRegex : this._erasRegex;
}

function erasNarrowRegex(isStrict) {
    if (!hasOwnProp(this, '_erasNarrowRegex')) {
        computeErasParse.call(this);
    }
    return isStrict ? this._erasNarrowRegex : this._erasRegex;
}

function matchEraAbbr(isStrict, locale) {
    return locale.erasAbbrRegex(isStrict);
}

function matchEraName(isStrict, locale) {
    return locale.erasNameRegex(isStrict);
}

function matchEraNarrow(isStrict, locale) {
    return locale.erasNarrowRegex(isStrict);
}

function matchEraYearOrdinal(isStrict, locale) {
    return locale._eraYearOrdinalRegex || matchUnsigned;
}

function computeErasParse() {
    var abbrPieces = [],
        namePieces = [],
        narrowPieces = [],
        mixedPieces = [],
        i,
        l,
        eras = this.eras();

    for (i = 0, l = eras.length; i < l; ++i) {
        namePieces.push(regexEscape(eras[i].name));
        abbrPieces.push(regexEscape(eras[i].abbr));
        narrowPieces.push(regexEscape(eras[i].narrow));

        mixedPieces.push(regexEscape(eras[i].name));
        mixedPieces.push(regexEscape(eras[i].abbr));
        mixedPieces.push(regexEscape(eras[i].narrow));
    }

    this._erasRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
    this._erasNameRegex = new RegExp('^(' + namePieces.join('|') + ')', 'i');
    this._erasAbbrRegex = new RegExp('^(' + abbrPieces.join('|') + ')', 'i');
    this._erasNarrowRegex = new RegExp(
        '^(' + narrowPieces.join('|') + ')',
        'i'
    );
}

// FORMATTING

addFormatToken(0, ['gg', 2], 0, function () {
    return this.weekYear() % 100;
});

addFormatToken(0, ['GG', 2], 0, function () {
    return this.isoWeekYear() % 100;
});

function addWeekYearFormatToken(token, getter) {
    addFormatToken(0, [token, token.length], 0, getter);
}

addWeekYearFormatToken('gggg', 'weekYear');
addWeekYearFormatToken('ggggg', 'weekYear');
addWeekYearFormatToken('GGGG', 'isoWeekYear');
addWeekYearFormatToken('GGGGG', 'isoWeekYear');

// ALIASES

addUnitAlias('weekYear', 'gg');
addUnitAlias('isoWeekYear', 'GG');

// PRIORITY

addUnitPriority('weekYear', 1);
addUnitPriority('isoWeekYear', 1);

// PARSING

addRegexToken('G', matchSigned);
addRegexToken('g', matchSigned);
addRegexToken('GG', match1to2, match2);
addRegexToken('gg', match1to2, match2);
addRegexToken('GGGG', match1to4, match4);
addRegexToken('gggg', match1to4, match4);
addRegexToken('GGGGG', match1to6, match6);
addRegexToken('ggggg', match1to6, match6);

addWeekParseToken(
    ['gggg', 'ggggg', 'GGGG', 'GGGGG'],
    function (input, week, config, token) {
        week[token.substr(0, 2)] = toInt(input);
    }
);

addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
    week[token] = hooks.parseTwoDigitYear(input);
});

// MOMENTS

function getSetWeekYear(input) {
    return getSetWeekYearHelper.call(
        this,
        input,
        this.week(),
        this.weekday(),
        this.localeData()._week.dow,
        this.localeData()._week.doy
    );
}

function getSetISOWeekYear(input) {
    return getSetWeekYearHelper.call(
        this,
        input,
        this.isoWeek(),
        this.isoWeekday(),
        1,
        4
    );
}

function getISOWeeksInYear() {
    return weeksInYear(this.year(), 1, 4);
}

function getISOWeeksInISOWeekYear() {
    return weeksInYear(this.isoWeekYear(), 1, 4);
}

function getWeeksInYear() {
    var weekInfo = this.localeData()._week;
    return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
}

function getWeeksInWeekYear() {
    var weekInfo = this.localeData()._week;
    return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy);
}

function getSetWeekYearHelper(input, week, weekday, dow, doy) {
    var weeksTarget;
    if (input == null) {
        return weekOfYear(this, dow, doy).year;
    } else {
        weeksTarget = weeksInYear(input, dow, doy);
        if (week > weeksTarget) {
            week = weeksTarget;
        }
        return setWeekAll.call(this, input, week, weekday, dow, doy);
    }
}

function setWeekAll(weekYear, week, weekday, dow, doy) {
    var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),
        date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);

    this.year(date.getUTCFullYear());
    this.month(date.getUTCMonth());
    this.date(date.getUTCDate());
    return this;
}

// FORMATTING

addFormatToken('Q', 0, 'Qo', 'quarter');

// ALIASES

addUnitAlias('quarter', 'Q');

// PRIORITY

addUnitPriority('quarter', 7);

// PARSING

addRegexToken('Q', match1);
addParseToken('Q', function (input, array) {
    array[MONTH] = (toInt(input) - 1) * 3;
});

// MOMENTS

function getSetQuarter(input) {
    return input == null
        ? Math.ceil((this.month() + 1) / 3)
        : this.month((input - 1) * 3 + (this.month() % 3));
}

// FORMATTING

addFormatToken('D', ['DD', 2], 'Do', 'date');

// ALIASES

addUnitAlias('date', 'D');

// PRIORITY
addUnitPriority('date', 9);

// PARSING

addRegexToken('D', match1to2);
addRegexToken('DD', match1to2, match2);
addRegexToken('Do', function (isStrict, locale) {
    // TODO: Remove "ordinalParse" fallback in next major release.
    return isStrict
        ? locale._dayOfMonthOrdinalParse || locale._ordinalParse
        : locale._dayOfMonthOrdinalParseLenient;
});

addParseToken(['D', 'DD'], DATE);
addParseToken('Do', function (input, array) {
    array[DATE] = toInt(input.match(match1to2)[0]);
});

// MOMENTS

var getSetDayOfMonth = makeGetSet('Date', true);

// FORMATTING

addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');

// ALIASES

addUnitAlias('dayOfYear', 'DDD');

// PRIORITY
addUnitPriority('dayOfYear', 4);

// PARSING

addRegexToken('DDD', match1to3);
addRegexToken('DDDD', match3);
addParseToken(['DDD', 'DDDD'], function (input, array, config) {
    config._dayOfYear = toInt(input);
});

// HELPERS

// MOMENTS

function getSetDayOfYear(input) {
    var dayOfYear =
        Math.round(
            (this.clone().startOf('day') - this.clone().startOf('year')) / 864e5
        ) + 1;
    return input == null ? dayOfYear : this.add(input - dayOfYear, 'd');
}

// FORMATTING

addFormatToken('m', ['mm', 2], 0, 'minute');

// ALIASES

addUnitAlias('minute', 'm');

// PRIORITY

addUnitPriority('minute', 14);

// PARSING

addRegexToken('m', match1to2);
addRegexToken('mm', match1to2, match2);
addParseToken(['m', 'mm'], MINUTE);

// MOMENTS

var getSetMinute = makeGetSet('Minutes', false);

// FORMATTING

addFormatToken('s', ['ss', 2], 0, 'second');

// ALIASES

addUnitAlias('second', 's');

// PRIORITY

addUnitPriority('second', 15);

// PARSING

addRegexToken('s', match1to2);
addRegexToken('ss', match1to2, match2);
addParseToken(['s', 'ss'], SECOND);

// MOMENTS

var getSetSecond = makeGetSet('Seconds', false);

// FORMATTING

addFormatToken('S', 0, 0, function () {
    return ~~(this.millisecond() / 100);
});

addFormatToken(0, ['SS', 2], 0, function () {
    return ~~(this.millisecond() / 10);
});

addFormatToken(0, ['SSS', 3], 0, 'millisecond');
addFormatToken(0, ['SSSS', 4], 0, function () {
    return this.millisecond() * 10;
});
addFormatToken(0, ['SSSSS', 5], 0, function () {
    return this.millisecond() * 100;
});
addFormatToken(0, ['SSSSSS', 6], 0, function () {
    return this.millisecond() * 1000;
});
addFormatToken(0, ['SSSSSSS', 7], 0, function () {
    return this.millisecond() * 10000;
});
addFormatToken(0, ['SSSSSSSS', 8], 0, function () {
    return this.millisecond() * 100000;
});
addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
    return this.millisecond() * 1000000;
});

// ALIASES

addUnitAlias('millisecond', 'ms');

// PRIORITY

addUnitPriority('millisecond', 16);

// PARSING

addRegexToken('S', match1to3, match1);
addRegexToken('SS', match1to3, match2);
addRegexToken('SSS', match1to3, match3);

var token, getSetMillisecond;
for (token = 'SSSS'; token.length <= 9; token += 'S') {
    addRegexToken(token, matchUnsigned);
}

function parseMs(input, array) {
    array[MILLISECOND] = toInt(('0.' + input) * 1000);
}

for (token = 'S'; token.length <= 9; token += 'S') {
    addParseToken(token, parseMs);
}

getSetMillisecond = makeGetSet('Milliseconds', false);

// FORMATTING

addFormatToken('z', 0, 0, 'zoneAbbr');
addFormatToken('zz', 0, 0, 'zoneName');

// MOMENTS

function getZoneAbbr() {
    return this._isUTC ? 'UTC' : '';
}

function getZoneName() {
    return this._isUTC ? 'Coordinated Universal Time' : '';
}

var proto = Moment.prototype;

proto.add = add;
proto.calendar = calendar$1;
proto.clone = clone;
proto.diff = diff;
proto.endOf = endOf;
proto.format = format;
proto.from = from;
proto.fromNow = fromNow;
proto.to = to;
proto.toNow = toNow;
proto.get = stringGet;
proto.invalidAt = invalidAt;
proto.isAfter = isAfter;
proto.isBefore = isBefore;
proto.isBetween = isBetween;
proto.isSame = isSame;
proto.isSameOrAfter = isSameOrAfter;
proto.isSameOrBefore = isSameOrBefore;
proto.isValid = isValid$2;
proto.lang = lang;
proto.locale = locale;
proto.localeData = localeData;
proto.max = prototypeMax;
proto.min = prototypeMin;
proto.parsingFlags = parsingFlags;
proto.set = stringSet;
proto.startOf = startOf;
proto.subtract = subtract;
proto.toArray = toArray;
proto.toObject = toObject;
proto.toDate = toDate;
proto.toISOString = toISOString;
proto.inspect = inspect;
if (typeof Symbol !== 'undefined' && Symbol.for != null) {
    proto[Symbol.for('nodejs.util.inspect.custom')] = function () {
        return 'Moment<' + this.format() + '>';
    };
}
proto.toJSON = toJSON;
proto.toString = toString;
proto.unix = unix;
proto.valueOf = valueOf;
proto.creationData = creationData;
proto.eraName = getEraName;
proto.eraNarrow = getEraNarrow;
proto.eraAbbr = getEraAbbr;
proto.eraYear = getEraYear;
proto.year = getSetYear;
proto.isLeapYear = getIsLeapYear;
proto.weekYear = getSetWeekYear;
proto.isoWeekYear = getSetISOWeekYear;
proto.quarter = proto.quarters = getSetQuarter;
proto.month = getSetMonth;
proto.daysInMonth = getDaysInMonth;
proto.week = proto.weeks = getSetWeek;
proto.isoWeek = proto.isoWeeks = getSetISOWeek;
proto.weeksInYear = getWeeksInYear;
proto.weeksInWeekYear = getWeeksInWeekYear;
proto.isoWeeksInYear = getISOWeeksInYear;
proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear;
proto.date = getSetDayOfMonth;
proto.day = proto.days = getSetDayOfWeek;
proto.weekday = getSetLocaleDayOfWeek;
proto.isoWeekday = getSetISODayOfWeek;
proto.dayOfYear = getSetDayOfYear;
proto.hour = proto.hours = getSetHour;
proto.minute = proto.minutes = getSetMinute;
proto.second = proto.seconds = getSetSecond;
proto.millisecond = proto.milliseconds = getSetMillisecond;
proto.utcOffset = getSetOffset;
proto.utc = setOffsetToUTC;
proto.local = setOffsetToLocal;
proto.parseZone = setOffsetToParsedOffset;
proto.hasAlignedHourOffset = hasAlignedHourOffset;
proto.isDST = isDaylightSavingTime;
proto.isLocal = isLocal;
proto.isUtcOffset = isUtcOffset;
proto.isUtc = isUtc;
proto.isUTC = isUtc;
proto.zoneAbbr = getZoneAbbr;
proto.zoneName = getZoneName;
proto.dates = deprecate(
    'dates accessor is deprecated. Use date instead.',
    getSetDayOfMonth
);
proto.months = deprecate(
    'months accessor is deprecated. Use month instead',
    getSetMonth
);
proto.years = deprecate(
    'years accessor is deprecated. Use year instead',
    getSetYear
);
proto.zone = deprecate(
    'moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/',
    getSetZone
);
proto.isDSTShifted = deprecate(
    'isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information',
    isDaylightSavingTimeShifted
);

function createUnix(input) {
    return createLocal(input * 1000);
}

function createInZone() {
    return createLocal.apply(null, arguments).parseZone();
}

function preParsePostFormat(string) {
    return string;
}

var proto$1 = Locale.prototype;

proto$1.calendar = calendar;
proto$1.longDateFormat = longDateFormat;
proto$1.invalidDate = invalidDate;
proto$1.ordinal = ordinal;
proto$1.preparse = preParsePostFormat;
proto$1.postformat = preParsePostFormat;
proto$1.relativeTime = relativeTime;
proto$1.pastFuture = pastFuture;
proto$1.set = set;
proto$1.eras = localeEras;
proto$1.erasParse = localeErasParse;
proto$1.erasConvertYear = localeErasConvertYear;
proto$1.erasAbbrRegex = erasAbbrRegex;
proto$1.erasNameRegex = erasNameRegex;
proto$1.erasNarrowRegex = erasNarrowRegex;

proto$1.months = localeMonths;
proto$1.monthsShort = localeMonthsShort;
proto$1.monthsParse = localeMonthsParse;
proto$1.monthsRegex = monthsRegex;
proto$1.monthsShortRegex = monthsShortRegex;
proto$1.week = localeWeek;
proto$1.firstDayOfYear = localeFirstDayOfYear;
proto$1.firstDayOfWeek = localeFirstDayOfWeek;

proto$1.weekdays = localeWeekdays;
proto$1.weekdaysMin = localeWeekdaysMin;
proto$1.weekdaysShort = localeWeekdaysShort;
proto$1.weekdaysParse = localeWeekdaysParse;

proto$1.weekdaysRegex = weekdaysRegex;
proto$1.weekdaysShortRegex = weekdaysShortRegex;
proto$1.weekdaysMinRegex = weekdaysMinRegex;

proto$1.isPM = localeIsPM;
proto$1.meridiem = localeMeridiem;

function get$1(format, index, field, setter) {
    var locale = getLocale(),
        utc = createUTC().set(setter, index);
    return locale[field](utc, format);
}

function listMonthsImpl(format, index, field) {
    if (isNumber(format)) {
        index = format;
        format = undefined;
    }

    format = format || '';

    if (index != null) {
        return get$1(format, index, field, 'month');
    }

    var i,
        out = [];
    for (i = 0; i < 12; i++) {
        out[i] = get$1(format, i, field, 'month');
    }
    return out;
}

// ()
// (5)
// (fmt, 5)
// (fmt)
// (true)
// (true, 5)
// (true, fmt, 5)
// (true, fmt)
function listWeekdaysImpl(localeSorted, format, index, field) {
    if (typeof localeSorted === 'boolean') {
        if (isNumber(format)) {
            index = format;
            format = undefined;
        }

        format = format || '';
    } else {
        format = localeSorted;
        index = format;
        localeSorted = false;

        if (isNumber(format)) {
            index = format;
            format = undefined;
        }

        format = format || '';
    }

    var locale = getLocale(),
        shift = localeSorted ? locale._week.dow : 0,
        i,
        out = [];

    if (index != null) {
        return get$1(format, (index + shift) % 7, field, 'day');
    }

    for (i = 0; i < 7; i++) {
        out[i] = get$1(format, (i + shift) % 7, field, 'day');
    }
    return out;
}

function listMonths(format, index) {
    return listMonthsImpl(format, index, 'months');
}

function listMonthsShort(format, index) {
    return listMonthsImpl(format, index, 'monthsShort');
}

function listWeekdays(localeSorted, format, index) {
    return listWeekdaysImpl(localeSorted, format, index, 'weekdays');
}

function listWeekdaysShort(localeSorted, format, index) {
    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');
}

function listWeekdaysMin(localeSorted, format, index) {
    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');
}

getSetGlobalLocale('en', {
    eras: [
        {
            since: '0001-01-01',
            until: +Infinity,
            offset: 1,
            name: 'Anno Domini',
            narrow: 'AD',
            abbr: 'AD',
        },
        {
            since: '0000-12-31',
            until: -Infinity,
            offset: 1,
            name: 'Before Christ',
            narrow: 'BC',
            abbr: 'BC',
        },
    ],
    dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/,
    ordinal: function (number) {
        var b = number % 10,
            output =
                toInt((number % 100) / 10) === 1
                    ? 'th'
                    : b === 1
                    ? 'st'
                    : b === 2
                    ? 'nd'
                    : b === 3
                    ? 'rd'
                    : 'th';
        return number + output;
    },
});

// Side effect imports

hooks.lang = deprecate(
    'moment.lang is deprecated. Use moment.locale instead.',
    getSetGlobalLocale
);
hooks.langData = deprecate(
    'moment.langData is deprecated. Use moment.localeData instead.',
    getLocale
);

var mathAbs = Math.abs;

function abs() {
    var data = this._data;

    this._milliseconds = mathAbs(this._milliseconds);
    this._days = mathAbs(this._days);
    this._months = mathAbs(this._months);

    data.milliseconds = mathAbs(data.milliseconds);
    data.seconds = mathAbs(data.seconds);
    data.minutes = mathAbs(data.minutes);
    data.hours = mathAbs(data.hours);
    data.months = mathAbs(data.months);
    data.years = mathAbs(data.years);

    return this;
}

function addSubtract$1(duration, input, value, direction) {
    var other = createDuration(input, value);

    duration._milliseconds += direction * other._milliseconds;
    duration._days += direction * other._days;
    duration._months += direction * other._months;

    return duration._bubble();
}

// supports only 2.0-style add(1, 's') or add(duration)
function add$1(input, value) {
    return addSubtract$1(this, input, value, 1);
}

// supports only 2.0-style subtract(1, 's') or subtract(duration)
function subtract$1(input, value) {
    return addSubtract$1(this, input, value, -1);
}

function absCeil(number) {
    if (number < 0) {
        return Math.floor(number);
    } else {
        return Math.ceil(number);
    }
}

function bubble() {
    var milliseconds = this._milliseconds,
        days = this._days,
        months = this._months,
        data = this._data,
        seconds,
        minutes,
        hours,
        years,
        monthsFromDays;

    // if we have a mix of positive and negative values, bubble down first
    // check: https://github.com/moment/moment/issues/2166
    if (
        !(
            (milliseconds >= 0 && days >= 0 && months >= 0) ||
            (milliseconds <= 0 && days <= 0 && months <= 0)
        )
    ) {
        milliseconds += absCeil(monthsToDays(months) + days) * 864e5;
        days = 0;
        months = 0;
    }

    // The following code bubbles up values, see the tests for
    // examples of what that means.
    data.milliseconds = milliseconds % 1000;

    seconds = absFloor(milliseconds / 1000);
    data.seconds = seconds % 60;

    minutes = absFloor(seconds / 60);
    data.minutes = minutes % 60;

    hours = absFloor(minutes / 60);
    data.hours = hours % 24;

    days += absFloor(hours / 24);

    // convert days to months
    monthsFromDays = absFloor(daysToMonths(days));
    months += monthsFromDays;
    days -= absCeil(monthsToDays(monthsFromDays));

    // 12 months -> 1 year
    years = absFloor(months / 12);
    months %= 12;

    data.days = days;
    data.months = months;
    data.years = years;

    return this;
}

function daysToMonths(days) {
    // 400 years have 146097 days (taking into account leap year rules)
    // 400 years have 12 months === 4800
    return (days * 4800) / 146097;
}

function monthsToDays(months) {
    // the reverse of daysToMonths
    return (months * 146097) / 4800;
}

function as(units) {
    if (!this.isValid()) {
        return NaN;
    }
    var days,
        months,
        milliseconds = this._milliseconds;

    units = normalizeUnits(units);

    if (units === 'month' || units === 'quarter' || units === 'year') {
        days = this._days + milliseconds / 864e5;
        months = this._months + daysToMonths(days);
        switch (units) {
            case 'month':
                return months;
            case 'quarter':
                return months / 3;
            case 'year':
                return months / 12;
        }
    } else {
        // handle milliseconds separately because of floating point math errors (issue #1867)
        days = this._days + Math.round(monthsToDays(this._months));
        switch (units) {
            case 'week':
                return days / 7 + milliseconds / 6048e5;
            case 'day':
                return days + milliseconds / 864e5;
            case 'hour':
                return days * 24 + milliseconds / 36e5;
            case 'minute':
                return days * 1440 + milliseconds / 6e4;
            case 'second':
                return days * 86400 + milliseconds / 1000;
            // Math.floor prevents floating point math errors here
            case 'millisecond':
                return Math.floor(days * 864e5) + milliseconds;
            default:
                throw new Error('Unknown unit ' + units);
        }
    }
}

// TODO: Use this.as('ms')?
function valueOf$1() {
    if (!this.isValid()) {
        return NaN;
    }
    return (
        this._milliseconds +
        this._days * 864e5 +
        (this._months % 12) * 2592e6 +
        toInt(this._months / 12) * 31536e6
    );
}

function makeAs(alias) {
    return function () {
        return this.as(alias);
    };
}

var asMilliseconds = makeAs('ms'),
    asSeconds = makeAs('s'),
    asMinutes = makeAs('m'),
    asHours = makeAs('h'),
    asDays = makeAs('d'),
    asWeeks = makeAs('w'),
    asMonths = makeAs('M'),
    asQuarters = makeAs('Q'),
    asYears = makeAs('y');

function clone$1() {
    return createDuration(this);
}

function get$2(units) {
    units = normalizeUnits(units);
    return this.isValid() ? this[units + 's']() : NaN;
}

function makeGetter(name) {
    return function () {
        return this.isValid() ? this._data[name] : NaN;
    };
}

var milliseconds = makeGetter('milliseconds'),
    seconds = makeGetter('seconds'),
    minutes = makeGetter('minutes'),
    hours = makeGetter('hours'),
    days = makeGetter('days'),
    months = makeGetter('months'),
    years = makeGetter('years');

function weeks() {
    return absFloor(this.days() / 7);
}

var round = Math.round,
    thresholds = {
        ss: 44, // a few seconds to seconds
        s: 45, // seconds to minute
        m: 45, // minutes to hour
        h: 22, // hours to day
        d: 26, // days to month/week
        w: null, // weeks to month
        M: 11, // months to year
    };

// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
    return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
}

function relativeTime$1(posNegDuration, withoutSuffix, thresholds, locale) {
    var duration = createDuration(posNegDuration).abs(),
        seconds = round(duration.as('s')),
        minutes = round(duration.as('m')),
        hours = round(duration.as('h')),
        days = round(duration.as('d')),
        months = round(duration.as('M')),
        weeks = round(duration.as('w')),
        years = round(duration.as('y')),
        a =
            (seconds <= thresholds.ss && ['s', seconds]) ||
            (seconds < thresholds.s && ['ss', seconds]) ||
            (minutes <= 1 && ['m']) ||
            (minutes < thresholds.m && ['mm', minutes]) ||
            (hours <= 1 && ['h']) ||
            (hours < thresholds.h && ['hh', hours]) ||
            (days <= 1 && ['d']) ||
            (days < thresholds.d && ['dd', days]);

    if (thresholds.w != null) {
        a =
            a ||
            (weeks <= 1 && ['w']) ||
            (weeks < thresholds.w && ['ww', weeks]);
    }
    a = a ||
        (months <= 1 && ['M']) ||
        (months < thresholds.M && ['MM', months]) ||
        (years <= 1 && ['y']) || ['yy', years];

    a[2] = withoutSuffix;
    a[3] = +posNegDuration > 0;
    a[4] = locale;
    return substituteTimeAgo.apply(null, a);
}

// This function allows you to set the rounding function for relative time strings
function getSetRelativeTimeRounding(roundingFunction) {
    if (roundingFunction === undefined) {
        return round;
    }
    if (typeof roundingFunction === 'function') {
        round = roundingFunction;
        return true;
    }
    return false;
}

// This function allows you to set a threshold for relative time strings
function getSetRelativeTimeThreshold(threshold, limit) {
    if (thresholds[threshold] === undefined) {
        return false;
    }
    if (limit === undefined) {
        return thresholds[threshold];
    }
    thresholds[threshold] = limit;
    if (threshold === 's') {
        thresholds.ss = limit - 1;
    }
    return true;
}

function humanize(argWithSuffix, argThresholds) {
    if (!this.isValid()) {
        return this.localeData().invalidDate();
    }

    var withSuffix = false,
        th = thresholds,
        locale,
        output;

    if (typeof argWithSuffix === 'object') {
        argThresholds = argWithSuffix;
        argWithSuffix = false;
    }
    if (typeof argWithSuffix === 'boolean') {
        withSuffix = argWithSuffix;
    }
    if (typeof argThresholds === 'object') {
        th = Object.assign({}, thresholds, argThresholds);
        if (argThresholds.s != null && argThresholds.ss == null) {
            th.ss = argThresholds.s - 1;
        }
    }

    locale = this.localeData();
    output = relativeTime$1(this, !withSuffix, th, locale);

    if (withSuffix) {
        output = locale.pastFuture(+this, output);
    }

    return locale.postformat(output);
}

var abs$1 = Math.abs;

function sign(x) {
    return (x > 0) - (x < 0) || +x;
}

function toISOString$1() {
    // for ISO strings we do not use the normal bubbling rules:
    //  * milliseconds bubble up until they become hours
    //  * days do not bubble at all
    //  * months bubble up until they become years
    // This is because there is no context-free conversion between hours and days
    // (think of clock changes)
    // and also not between days and months (28-31 days per month)
    if (!this.isValid()) {
        return this.localeData().invalidDate();
    }

    var seconds = abs$1(this._milliseconds) / 1000,
        days = abs$1(this._days),
        months = abs$1(this._months),
        minutes,
        hours,
        years,
        s,
        total = this.asSeconds(),
        totalSign,
        ymSign,
        daysSign,
        hmsSign;

    if (!total) {
        // this is the same as C#'s (Noda) and python (isodate)...
        // but not other JS (goog.date)
        return 'P0D';
    }

    // 3600 seconds -> 60 minutes -> 1 hour
    minutes = absFloor(seconds / 60);
    hours = absFloor(minutes / 60);
    seconds %= 60;
    minutes %= 60;

    // 12 months -> 1 year
    years = absFloor(months / 12);
    months %= 12;

    // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
    s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : '';

    totalSign = total < 0 ? '-' : '';
    ymSign = sign(this._months) !== sign(total) ? '-' : '';
    daysSign = sign(this._days) !== sign(total) ? '-' : '';
    hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';

    return (
        totalSign +
        'P' +
        (years ? ymSign + years + 'Y' : '') +
        (months ? ymSign + months + 'M' : '') +
        (days ? daysSign + days + 'D' : '') +
        (hours || minutes || seconds ? 'T' : '') +
        (hours ? hmsSign + hours + 'H' : '') +
        (minutes ? hmsSign + minutes + 'M' : '') +
        (seconds ? hmsSign + s + 'S' : '')
    );
}

var proto$2 = Duration.prototype;

proto$2.isValid = isValid$1;
proto$2.abs = abs;
proto$2.add = add$1;
proto$2.subtract = subtract$1;
proto$2.as = as;
proto$2.asMilliseconds = asMilliseconds;
proto$2.asSeconds = asSeconds;
proto$2.asMinutes = asMinutes;
proto$2.asHours = asHours;
proto$2.asDays = asDays;
proto$2.asWeeks = asWeeks;
proto$2.asMonths = asMonths;
proto$2.asQuarters = asQuarters;
proto$2.asYears = asYears;
proto$2.valueOf = valueOf$1;
proto$2._bubble = bubble;
proto$2.clone = clone$1;
proto$2.get = get$2;
proto$2.milliseconds = milliseconds;
proto$2.seconds = seconds;
proto$2.minutes = minutes;
proto$2.hours = hours;
proto$2.days = days;
proto$2.weeks = weeks;
proto$2.months = months;
proto$2.years = years;
proto$2.humanize = humanize;
proto$2.toISOString = toISOString$1;
proto$2.toString = toISOString$1;
proto$2.toJSON = toISOString$1;
proto$2.locale = locale;
proto$2.localeData = localeData;

proto$2.toIsoString = deprecate(
    'toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)',
    toISOString$1
);
proto$2.lang = lang;

// FORMATTING

addFormatToken('X', 0, 0, 'unix');
addFormatToken('x', 0, 0, 'valueOf');

// PARSING

addRegexToken('x', matchSigned);
addRegexToken('X', matchTimestamp);
addParseToken('X', function (input, array, config) {
    config._d = new Date(parseFloat(input) * 1000);
});
addParseToken('x', function (input, array, config) {
    config._d = new Date(toInt(input));
});

//! moment.js

hooks.version = '2.29.4';

setHookCallback(createLocal);

hooks.fn = proto;
hooks.min = min;
hooks.max = max;
hooks.now = now;
hooks.utc = createUTC;
hooks.unix = createUnix;
hooks.months = listMonths;
hooks.isDate = isDate;
hooks.locale = getSetGlobalLocale;
hooks.invalid = createInvalid;
hooks.duration = createDuration;
hooks.isMoment = isMoment;
hooks.weekdays = listWeekdays;
hooks.parseZone = createInZone;
hooks.localeData = getLocale;
hooks.isDuration = isDuration;
hooks.monthsShort = listMonthsShort;
hooks.weekdaysMin = listWeekdaysMin;
hooks.defineLocale = defineLocale;
hooks.updateLocale = updateLocale;
hooks.locales = listLocales;
hooks.weekdaysShort = listWeekdaysShort;
hooks.normalizeUnits = normalizeUnits;
hooks.relativeTimeRounding = getSetRelativeTimeRounding;
hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;
hooks.calendarFormat = getCalendarFormat;
hooks.prototype = proto;

// currently HTML5 input type only supports 24-hour formats
hooks.HTML5_FMT = {
    DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // <input type="datetime-local" />
    DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // <input type="datetime-local" step="1" />
    DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // <input type="datetime-local" step="0.001" />
    DATE: 'YYYY-MM-DD', // <input type="date" />
    TIME: 'HH:mm', // <input type="time" />
    TIME_SECONDS: 'HH:mm:ss', // <input type="time" step="1" />
    TIME_MS: 'HH:mm:ss.SSS', // <input type="time" step="0.001" />
    WEEK: 'GGGG-[W]WW', // <input type="week" />
    MONTH: 'YYYY-MM', // <input type="month" />
};

export default hooks;
//! moment.js locale configuration
//! locale : Afrikaans [af]
//! author : Werner Mollentze : https://github.com/wernerm

import moment from '../moment';

export default moment.defineLocale('af', {
    months: 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'),
    weekdays: 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split(
        '_'
    ),
    weekdaysShort: 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'),
    weekdaysMin: 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'),
    meridiemParse: /vm|nm/i,
    isPM: function (input) {
        return /^nm$/i.test(input);
    },
    meridiem: function (hours, minutes, isLower) {
        if (hours < 12) {
            return isLower ? 'vm' : 'VM';
        } else {
            return isLower ? 'nm' : 'NM';
        }
    },
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Vandag om] LT',
        nextDay: '[Môre om] LT',
        nextWeek: 'dddd [om] LT',
        lastDay: '[Gister om] LT',
        lastWeek: '[Laas] dddd [om] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'oor %s',
        past: '%s gelede',
        s: "'n paar sekondes",
        ss: '%d sekondes',
        m: "'n minuut",
        mm: '%d minute',
        h: "'n uur",
        hh: '%d ure',
        d: "'n dag",
        dd: '%d dae',
        M: "'n maand",
        MM: '%d maande',
        y: "'n jaar",
        yy: '%d jaar',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/,
    ordinal: function (number) {
        return (
            number +
            (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')
        ); // Thanks to Joris Röling : https://github.com/jjupiter
    },
    week: {
        dow: 1, // Maandag is die eerste dag van die week.
        doy: 4, // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
    },
});
//! moment.js locale configuration
//! locale : Arabic (Algeria) [ar-dz]
//! author : Amine Roukh: https://github.com/Amine27
//! author : Abdel Said: https://github.com/abdelsaid
//! author : Ahmed Elkhatib
//! author : forabi https://github.com/forabi
//! author : Noureddine LOUAHEDJ : https://github.com/noureddinem

import moment from '../moment';

var pluralForm = function (n) {
        return n === 0
            ? 0
            : n === 1
            ? 1
            : n === 2
            ? 2
            : n % 100 >= 3 && n % 100 <= 10
            ? 3
            : n % 100 >= 11
            ? 4
            : 5;
    },
    plurals = {
        s: [
            'أقل من ثانية',
            'ثانية واحدة',
            ['ثانيتان', 'ثانيتين'],
            '%d ثوان',
            '%d ثانية',
            '%d ثانية',
        ],
        m: [
            'أقل من دقيقة',
            'دقيقة واحدة',
            ['دقيقتان', 'دقيقتين'],
            '%d دقائق',
            '%d دقيقة',
            '%d دقيقة',
        ],
        h: [
            'أقل من ساعة',
            'ساعة واحدة',
            ['ساعتان', 'ساعتين'],
            '%d ساعات',
            '%d ساعة',
            '%d ساعة',
        ],
        d: [
            'أقل من يوم',
            'يوم واحد',
            ['يومان', 'يومين'],
            '%d أيام',
            '%d يومًا',
            '%d يوم',
        ],
        M: [
            'أقل من شهر',
            'شهر واحد',
            ['شهران', 'شهرين'],
            '%d أشهر',
            '%d شهرا',
            '%d شهر',
        ],
        y: [
            'أقل من عام',
            'عام واحد',
            ['عامان', 'عامين'],
            '%d أعوام',
            '%d عامًا',
            '%d عام',
        ],
    },
    pluralize = function (u) {
        return function (number, withoutSuffix, string, isFuture) {
            var f = pluralForm(number),
                str = plurals[u][pluralForm(number)];
            if (f === 2) {
                str = str[withoutSuffix ? 0 : 1];
            }
            return str.replace(/%d/i, number);
        };
    },
    months = [
        'جانفي',
        'فيفري',
        'مارس',
        'أفريل',
        'ماي',
        'جوان',
        'جويلية',
        'أوت',
        'سبتمبر',
        'أكتوبر',
        'نوفمبر',
        'ديسمبر',
    ];

export default moment.defineLocale('ar-dz', {
    months: months,
    monthsShort: months,
    weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
    weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'D/\u200FM/\u200FYYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    meridiemParse: /ص|م/,
    isPM: function (input) {
        return 'م' === input;
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return 'ص';
        } else {
            return 'م';
        }
    },
    calendar: {
        sameDay: '[اليوم عند الساعة] LT',
        nextDay: '[غدًا عند الساعة] LT',
        nextWeek: 'dddd [عند الساعة] LT',
        lastDay: '[أمس عند الساعة] LT',
        lastWeek: 'dddd [عند الساعة] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'بعد %s',
        past: 'منذ %s',
        s: pluralize('s'),
        ss: pluralize('s'),
        m: pluralize('m'),
        mm: pluralize('m'),
        h: pluralize('h'),
        hh: pluralize('h'),
        d: pluralize('d'),
        dd: pluralize('d'),
        M: pluralize('M'),
        MM: pluralize('M'),
        y: pluralize('y'),
        yy: pluralize('y'),
    },
    postformat: function (string) {
        return string.replace(/,/g, '،');
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Arabic (Kuwait) [ar-kw]
//! author : Nusret Parlak: https://github.com/nusretparlak

import moment from '../moment';

export default moment.defineLocale('ar-kw', {
    months: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(
        '_'
    ),
    monthsShort:
        'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(
            '_'
        ),
    weekdays: 'الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
    weekdaysShort: 'احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[اليوم على الساعة] LT',
        nextDay: '[غدا على الساعة] LT',
        nextWeek: 'dddd [على الساعة] LT',
        lastDay: '[أمس على الساعة] LT',
        lastWeek: 'dddd [على الساعة] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'في %s',
        past: 'منذ %s',
        s: 'ثوان',
        ss: '%d ثانية',
        m: 'دقيقة',
        mm: '%d دقائق',
        h: 'ساعة',
        hh: '%d ساعات',
        d: 'يوم',
        dd: '%d أيام',
        M: 'شهر',
        MM: '%d أشهر',
        y: 'سنة',
        yy: '%d سنوات',
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 12, // The week that contains Jan 12th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Arabic (Libya) [ar-ly]
//! author : Ali Hmer: https://github.com/kikoanis

import moment from '../moment';

var symbolMap = {
        1: '1',
        2: '2',
        3: '3',
        4: '4',
        5: '5',
        6: '6',
        7: '7',
        8: '8',
        9: '9',
        0: '0',
    },
    pluralForm = function (n) {
        return n === 0
            ? 0
            : n === 1
            ? 1
            : n === 2
            ? 2
            : n % 100 >= 3 && n % 100 <= 10
            ? 3
            : n % 100 >= 11
            ? 4
            : 5;
    },
    plurals = {
        s: [
            'أقل من ثانية',
            'ثانية واحدة',
            ['ثانيتان', 'ثانيتين'],
            '%d ثوان',
            '%d ثانية',
            '%d ثانية',
        ],
        m: [
            'أقل من دقيقة',
            'دقيقة واحدة',
            ['دقيقتان', 'دقيقتين'],
            '%d دقائق',
            '%d دقيقة',
            '%d دقيقة',
        ],
        h: [
            'أقل من ساعة',
            'ساعة واحدة',
            ['ساعتان', 'ساعتين'],
            '%d ساعات',
            '%d ساعة',
            '%d ساعة',
        ],
        d: [
            'أقل من يوم',
            'يوم واحد',
            ['يومان', 'يومين'],
            '%d أيام',
            '%d يومًا',
            '%d يوم',
        ],
        M: [
            'أقل من شهر',
            'شهر واحد',
            ['شهران', 'شهرين'],
            '%d أشهر',
            '%d شهرا',
            '%d شهر',
        ],
        y: [
            'أقل من عام',
            'عام واحد',
            ['عامان', 'عامين'],
            '%d أعوام',
            '%d عامًا',
            '%d عام',
        ],
    },
    pluralize = function (u) {
        return function (number, withoutSuffix, string, isFuture) {
            var f = pluralForm(number),
                str = plurals[u][pluralForm(number)];
            if (f === 2) {
                str = str[withoutSuffix ? 0 : 1];
            }
            return str.replace(/%d/i, number);
        };
    },
    months = [
        'يناير',
        'فبراير',
        'مارس',
        'أبريل',
        'مايو',
        'يونيو',
        'يوليو',
        'أغسطس',
        'سبتمبر',
        'أكتوبر',
        'نوفمبر',
        'ديسمبر',
    ];

export default moment.defineLocale('ar-ly', {
    months: months,
    monthsShort: months,
    weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
    weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'D/\u200FM/\u200FYYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    meridiemParse: /ص|م/,
    isPM: function (input) {
        return 'م' === input;
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return 'ص';
        } else {
            return 'م';
        }
    },
    calendar: {
        sameDay: '[اليوم عند الساعة] LT',
        nextDay: '[غدًا عند الساعة] LT',
        nextWeek: 'dddd [عند الساعة] LT',
        lastDay: '[أمس عند الساعة] LT',
        lastWeek: 'dddd [عند الساعة] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'بعد %s',
        past: 'منذ %s',
        s: pluralize('s'),
        ss: pluralize('s'),
        m: pluralize('m'),
        mm: pluralize('m'),
        h: pluralize('h'),
        hh: pluralize('h'),
        d: pluralize('d'),
        dd: pluralize('d'),
        M: pluralize('M'),
        MM: pluralize('M'),
        y: pluralize('y'),
        yy: pluralize('y'),
    },
    preparse: function (string) {
        return string.replace(/،/g, ',');
    },
    postformat: function (string) {
        return string
            .replace(/\d/g, function (match) {
                return symbolMap[match];
            })
            .replace(/,/g, '،');
    },
    week: {
        dow: 6, // Saturday is the first day of the week.
        doy: 12, // The week that contains Jan 12th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Arabic (Morocco) [ar-ma]
//! author : ElFadili Yassine : https://github.com/ElFadiliY
//! author : Abdel Said : https://github.com/abdelsaid

import moment from '../moment';

export default moment.defineLocale('ar-ma', {
    months: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(
        '_'
    ),
    monthsShort:
        'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split(
            '_'
        ),
    weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
    weekdaysShort: 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[اليوم على الساعة] LT',
        nextDay: '[غدا على الساعة] LT',
        nextWeek: 'dddd [على الساعة] LT',
        lastDay: '[أمس على الساعة] LT',
        lastWeek: 'dddd [على الساعة] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'في %s',
        past: 'منذ %s',
        s: 'ثوان',
        ss: '%d ثانية',
        m: 'دقيقة',
        mm: '%d دقائق',
        h: 'ساعة',
        hh: '%d ساعات',
        d: 'يوم',
        dd: '%d أيام',
        M: 'شهر',
        MM: '%d أشهر',
        y: 'سنة',
        yy: '%d سنوات',
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Arabic (Saudi Arabia) [ar-sa]
//! author : Suhail Alkowaileet : https://github.com/xsoh

import moment from '../moment';

var symbolMap = {
        1: '١',
        2: '٢',
        3: '٣',
        4: '٤',
        5: '٥',
        6: '٦',
        7: '٧',
        8: '٨',
        9: '٩',
        0: '٠',
    },
    numberMap = {
        '١': '1',
        '٢': '2',
        '٣': '3',
        '٤': '4',
        '٥': '5',
        '٦': '6',
        '٧': '7',
        '٨': '8',
        '٩': '9',
        '٠': '0',
    };

export default moment.defineLocale('ar-sa', {
    months: 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(
        '_'
    ),
    monthsShort:
        'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(
            '_'
        ),
    weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
    weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    meridiemParse: /ص|م/,
    isPM: function (input) {
        return 'م' === input;
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return 'ص';
        } else {
            return 'م';
        }
    },
    calendar: {
        sameDay: '[اليوم على الساعة] LT',
        nextDay: '[غدا على الساعة] LT',
        nextWeek: 'dddd [على الساعة] LT',
        lastDay: '[أمس على الساعة] LT',
        lastWeek: 'dddd [على الساعة] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'في %s',
        past: 'منذ %s',
        s: 'ثوان',
        ss: '%d ثانية',
        m: 'دقيقة',
        mm: '%d دقائق',
        h: 'ساعة',
        hh: '%d ساعات',
        d: 'يوم',
        dd: '%d أيام',
        M: 'شهر',
        MM: '%d أشهر',
        y: 'سنة',
        yy: '%d سنوات',
    },
    preparse: function (string) {
        return string
            .replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
                return numberMap[match];
            })
            .replace(/،/g, ',');
    },
    postformat: function (string) {
        return string
            .replace(/\d/g, function (match) {
                return symbolMap[match];
            })
            .replace(/,/g, '،');
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale  :  Arabic (Tunisia) [ar-tn]
//! author : Nader Toukabri : https://github.com/naderio

import moment from '../moment';

export default moment.defineLocale('ar-tn', {
    months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(
        '_'
    ),
    monthsShort:
        'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split(
            '_'
        ),
    weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
    weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[اليوم على الساعة] LT',
        nextDay: '[غدا على الساعة] LT',
        nextWeek: 'dddd [على الساعة] LT',
        lastDay: '[أمس على الساعة] LT',
        lastWeek: 'dddd [على الساعة] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'في %s',
        past: 'منذ %s',
        s: 'ثوان',
        ss: '%d ثانية',
        m: 'دقيقة',
        mm: '%d دقائق',
        h: 'ساعة',
        hh: '%d ساعات',
        d: 'يوم',
        dd: '%d أيام',
        M: 'شهر',
        MM: '%d أشهر',
        y: 'سنة',
        yy: '%d سنوات',
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Arabic [ar]
//! author : Abdel Said: https://github.com/abdelsaid
//! author : Ahmed Elkhatib
//! author : forabi https://github.com/forabi

import moment from '../moment';

var symbolMap = {
        1: '١',
        2: '٢',
        3: '٣',
        4: '٤',
        5: '٥',
        6: '٦',
        7: '٧',
        8: '٨',
        9: '٩',
        0: '٠',
    },
    numberMap = {
        '١': '1',
        '٢': '2',
        '٣': '3',
        '٤': '4',
        '٥': '5',
        '٦': '6',
        '٧': '7',
        '٨': '8',
        '٩': '9',
        '٠': '0',
    },
    pluralForm = function (n) {
        return n === 0
            ? 0
            : n === 1
            ? 1
            : n === 2
            ? 2
            : n % 100 >= 3 && n % 100 <= 10
            ? 3
            : n % 100 >= 11
            ? 4
            : 5;
    },
    plurals = {
        s: [
            'أقل من ثانية',
            'ثانية واحدة',
            ['ثانيتان', 'ثانيتين'],
            '%d ثوان',
            '%d ثانية',
            '%d ثانية',
        ],
        m: [
            'أقل من دقيقة',
            'دقيقة واحدة',
            ['دقيقتان', 'دقيقتين'],
            '%d دقائق',
            '%d دقيقة',
            '%d دقيقة',
        ],
        h: [
            'أقل من ساعة',
            'ساعة واحدة',
            ['ساعتان', 'ساعتين'],
            '%d ساعات',
            '%d ساعة',
            '%d ساعة',
        ],
        d: [
            'أقل من يوم',
            'يوم واحد',
            ['يومان', 'يومين'],
            '%d أيام',
            '%d يومًا',
            '%d يوم',
        ],
        M: [
            'أقل من شهر',
            'شهر واحد',
            ['شهران', 'شهرين'],
            '%d أشهر',
            '%d شهرا',
            '%d شهر',
        ],
        y: [
            'أقل من عام',
            'عام واحد',
            ['عامان', 'عامين'],
            '%d أعوام',
            '%d عامًا',
            '%d عام',
        ],
    },
    pluralize = function (u) {
        return function (number, withoutSuffix, string, isFuture) {
            var f = pluralForm(number),
                str = plurals[u][pluralForm(number)];
            if (f === 2) {
                str = str[withoutSuffix ? 0 : 1];
            }
            return str.replace(/%d/i, number);
        };
    },
    months = [
        'يناير',
        'فبراير',
        'مارس',
        'أبريل',
        'مايو',
        'يونيو',
        'يوليو',
        'أغسطس',
        'سبتمبر',
        'أكتوبر',
        'نوفمبر',
        'ديسمبر',
    ];

export default moment.defineLocale('ar', {
    months: months,
    monthsShort: months,
    weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
    weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
    weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'D/\u200FM/\u200FYYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    meridiemParse: /ص|م/,
    isPM: function (input) {
        return 'م' === input;
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return 'ص';
        } else {
            return 'م';
        }
    },
    calendar: {
        sameDay: '[اليوم عند الساعة] LT',
        nextDay: '[غدًا عند الساعة] LT',
        nextWeek: 'dddd [عند الساعة] LT',
        lastDay: '[أمس عند الساعة] LT',
        lastWeek: 'dddd [عند الساعة] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'بعد %s',
        past: 'منذ %s',
        s: pluralize('s'),
        ss: pluralize('s'),
        m: pluralize('m'),
        mm: pluralize('m'),
        h: pluralize('h'),
        hh: pluralize('h'),
        d: pluralize('d'),
        dd: pluralize('d'),
        M: pluralize('M'),
        MM: pluralize('M'),
        y: pluralize('y'),
        yy: pluralize('y'),
    },
    preparse: function (string) {
        return string
            .replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
                return numberMap[match];
            })
            .replace(/،/g, ',');
    },
    postformat: function (string) {
        return string
            .replace(/\d/g, function (match) {
                return symbolMap[match];
            })
            .replace(/,/g, '،');
    },
    week: {
        dow: 6, // Saturday is the first day of the week.
        doy: 12, // The week that contains Jan 12th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Azerbaijani [az]
//! author : topchiyev : https://github.com/topchiyev

import moment from '../moment';

var suffixes = {
    1: '-inci',
    5: '-inci',
    8: '-inci',
    70: '-inci',
    80: '-inci',
    2: '-nci',
    7: '-nci',
    20: '-nci',
    50: '-nci',
    3: '-üncü',
    4: '-üncü',
    100: '-üncü',
    6: '-ncı',
    9: '-uncu',
    10: '-uncu',
    30: '-uncu',
    60: '-ıncı',
    90: '-ıncı',
};

export default moment.defineLocale('az', {
    months: 'yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr'.split(
        '_'
    ),
    monthsShort: 'yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek'.split('_'),
    weekdays:
        'Bazar_Bazar ertəsi_Çərşənbə axşamı_Çərşənbə_Cümə axşamı_Cümə_Şənbə'.split(
            '_'
        ),
    weekdaysShort: 'Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən'.split('_'),
    weekdaysMin: 'Bz_BE_ÇA_Çə_CA_Cü_Şə'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[bugün saat] LT',
        nextDay: '[sabah saat] LT',
        nextWeek: '[gələn həftə] dddd [saat] LT',
        lastDay: '[dünən] LT',
        lastWeek: '[keçən həftə] dddd [saat] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s sonra',
        past: '%s əvvəl',
        s: 'bir neçə saniyə',
        ss: '%d saniyə',
        m: 'bir dəqiqə',
        mm: '%d dəqiqə',
        h: 'bir saat',
        hh: '%d saat',
        d: 'bir gün',
        dd: '%d gün',
        M: 'bir ay',
        MM: '%d ay',
        y: 'bir il',
        yy: '%d il',
    },
    meridiemParse: /gecə|səhər|gündüz|axşam/,
    isPM: function (input) {
        return /^(gündüz|axşam)$/.test(input);
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'gecə';
        } else if (hour < 12) {
            return 'səhər';
        } else if (hour < 17) {
            return 'gündüz';
        } else {
            return 'axşam';
        }
    },
    dayOfMonthOrdinalParse: /\d{1,2}-(ıncı|inci|nci|üncü|ncı|uncu)/,
    ordinal: function (number) {
        if (number === 0) {
            // special case for zero
            return number + '-ıncı';
        }
        var a = number % 10,
            b = (number % 100) - a,
            c = number >= 100 ? 100 : null;
        return number + (suffixes[a] || suffixes[b] || suffixes[c]);
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Belarusian [be]
//! author : Dmitry Demidov : https://github.com/demidov91
//! author: Praleska: http://praleska.pro/
//! Author : Menelion Elensúle : https://github.com/Oire

import moment from '../moment';

function plural(word, num) {
    var forms = word.split('_');
    return num % 10 === 1 && num % 100 !== 11
        ? forms[0]
        : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20)
        ? forms[1]
        : forms[2];
}
function relativeTimeWithPlural(number, withoutSuffix, key) {
    var format = {
        ss: withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд',
        mm: withoutSuffix ? 'хвіліна_хвіліны_хвілін' : 'хвіліну_хвіліны_хвілін',
        hh: withoutSuffix ? 'гадзіна_гадзіны_гадзін' : 'гадзіну_гадзіны_гадзін',
        dd: 'дзень_дні_дзён',
        MM: 'месяц_месяцы_месяцаў',
        yy: 'год_гады_гадоў',
    };
    if (key === 'm') {
        return withoutSuffix ? 'хвіліна' : 'хвіліну';
    } else if (key === 'h') {
        return withoutSuffix ? 'гадзіна' : 'гадзіну';
    } else {
        return number + ' ' + plural(format[key], +number);
    }
}

export default moment.defineLocale('be', {
    months: {
        format: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split(
            '_'
        ),
        standalone:
            'студзень_люты_сакавік_красавік_травень_чэрвень_ліпень_жнівень_верасень_кастрычнік_лістапад_снежань'.split(
                '_'
            ),
    },
    monthsShort:
        'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'),
    weekdays: {
        format: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split(
            '_'
        ),
        standalone:
            'нядзеля_панядзелак_аўторак_серада_чацвер_пятніца_субота'.split(
                '_'
            ),
        isFormat: /\[ ?[Ууў] ?(?:мінулую|наступную)? ?\] ?dddd/,
    },
    weekdaysShort: 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
    weekdaysMin: 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY г.',
        LLL: 'D MMMM YYYY г., HH:mm',
        LLLL: 'dddd, D MMMM YYYY г., HH:mm',
    },
    calendar: {
        sameDay: '[Сёння ў] LT',
        nextDay: '[Заўтра ў] LT',
        lastDay: '[Учора ў] LT',
        nextWeek: function () {
            return '[У] dddd [ў] LT';
        },
        lastWeek: function () {
            switch (this.day()) {
                case 0:
                case 3:
                case 5:
                case 6:
                    return '[У мінулую] dddd [ў] LT';
                case 1:
                case 2:
                case 4:
                    return '[У мінулы] dddd [ў] LT';
            }
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'праз %s',
        past: '%s таму',
        s: 'некалькі секунд',
        m: relativeTimeWithPlural,
        mm: relativeTimeWithPlural,
        h: relativeTimeWithPlural,
        hh: relativeTimeWithPlural,
        d: 'дзень',
        dd: relativeTimeWithPlural,
        M: 'месяц',
        MM: relativeTimeWithPlural,
        y: 'год',
        yy: relativeTimeWithPlural,
    },
    meridiemParse: /ночы|раніцы|дня|вечара/,
    isPM: function (input) {
        return /^(дня|вечара)$/.test(input);
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'ночы';
        } else if (hour < 12) {
            return 'раніцы';
        } else if (hour < 17) {
            return 'дня';
        } else {
            return 'вечара';
        }
    },
    dayOfMonthOrdinalParse: /\d{1,2}-(і|ы|га)/,
    ordinal: function (number, period) {
        switch (period) {
            case 'M':
            case 'd':
            case 'DDD':
            case 'w':
            case 'W':
                return (number % 10 === 2 || number % 10 === 3) &&
                    number % 100 !== 12 &&
                    number % 100 !== 13
                    ? number + '-і'
                    : number + '-ы';
            case 'D':
                return number + '-га';
            default:
                return number;
        }
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Bulgarian [bg]
//! author : Krasen Borisov : https://github.com/kraz

import moment from '../moment';

export default moment.defineLocale('bg', {
    months: 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split(
        '_'
    ),
    monthsShort: 'яну_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'),
    weekdays: 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split(
        '_'
    ),
    weekdaysShort: 'нед_пон_вто_сря_чет_пет_съб'.split('_'),
    weekdaysMin: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'D.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY H:mm',
        LLLL: 'dddd, D MMMM YYYY H:mm',
    },
    calendar: {
        sameDay: '[Днес в] LT',
        nextDay: '[Утре в] LT',
        nextWeek: 'dddd [в] LT',
        lastDay: '[Вчера в] LT',
        lastWeek: function () {
            switch (this.day()) {
                case 0:
                case 3:
                case 6:
                    return '[Миналата] dddd [в] LT';
                case 1:
                case 2:
                case 4:
                case 5:
                    return '[Миналия] dddd [в] LT';
            }
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'след %s',
        past: 'преди %s',
        s: 'няколко секунди',
        ss: '%d секунди',
        m: 'минута',
        mm: '%d минути',
        h: 'час',
        hh: '%d часа',
        d: 'ден',
        dd: '%d дена',
        w: 'седмица',
        ww: '%d седмици',
        M: 'месец',
        MM: '%d месеца',
        y: 'година',
        yy: '%d години',
    },
    dayOfMonthOrdinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/,
    ordinal: function (number) {
        var lastDigit = number % 10,
            last2Digits = number % 100;
        if (number === 0) {
            return number + '-ев';
        } else if (last2Digits === 0) {
            return number + '-ен';
        } else if (last2Digits > 10 && last2Digits < 20) {
            return number + '-ти';
        } else if (lastDigit === 1) {
            return number + '-ви';
        } else if (lastDigit === 2) {
            return number + '-ри';
        } else if (lastDigit === 7 || lastDigit === 8) {
            return number + '-ми';
        } else {
            return number + '-ти';
        }
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Bambara [bm]
//! author : Estelle Comment : https://github.com/estellecomment
// Language contact person : Abdoufata Kane : https://github.com/abdoufata

import moment from '../moment';

export default moment.defineLocale('bm', {
    months: 'Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_Mɛkalo_Zuwɛnkalo_Zuluyekalo_Utikalo_Sɛtanburukalo_ɔkutɔburukalo_Nowanburukalo_Desanburukalo'.split(
        '_'
    ),
    monthsShort: 'Zan_Few_Mar_Awi_Mɛ_Zuw_Zul_Uti_Sɛt_ɔku_Now_Des'.split('_'),
    weekdays: 'Kari_Ntɛnɛn_Tarata_Araba_Alamisa_Juma_Sibiri'.split('_'),
    weekdaysShort: 'Kar_Ntɛ_Tar_Ara_Ala_Jum_Sib'.split('_'),
    weekdaysMin: 'Ka_Nt_Ta_Ar_Al_Ju_Si'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'MMMM [tile] D [san] YYYY',
        LLL: 'MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm',
        LLLL: 'dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm',
    },
    calendar: {
        sameDay: '[Bi lɛrɛ] LT',
        nextDay: '[Sini lɛrɛ] LT',
        nextWeek: 'dddd [don lɛrɛ] LT',
        lastDay: '[Kunu lɛrɛ] LT',
        lastWeek: 'dddd [tɛmɛnen lɛrɛ] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s kɔnɔ',
        past: 'a bɛ %s bɔ',
        s: 'sanga dama dama',
        ss: 'sekondi %d',
        m: 'miniti kelen',
        mm: 'miniti %d',
        h: 'lɛrɛ kelen',
        hh: 'lɛrɛ %d',
        d: 'tile kelen',
        dd: 'tile %d',
        M: 'kalo kelen',
        MM: 'kalo %d',
        y: 'san kelen',
        yy: 'san %d',
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Bengali (Bangladesh) [bn-bd]
//! author : Asraf Hossain Patoary : https://github.com/ashwoolford

import moment from '../moment';

var symbolMap = {
        1: '১',
        2: '২',
        3: '৩',
        4: '৪',
        5: '৫',
        6: '৬',
        7: '৭',
        8: '৮',
        9: '৯',
        0: '০',
    },
    numberMap = {
        '১': '1',
        '২': '2',
        '৩': '3',
        '৪': '4',
        '৫': '5',
        '৬': '6',
        '৭': '7',
        '৮': '8',
        '৯': '9',
        '০': '0',
    };

export default moment.defineLocale('bn-bd', {
    months: 'জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split(
        '_'
    ),
    monthsShort:
        'জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে'.split(
            '_'
        ),
    weekdays: 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split(
        '_'
    ),
    weekdaysShort: 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),
    weekdaysMin: 'রবি_সোম_মঙ্গল_বুধ_বৃহ_শুক্র_শনি'.split('_'),
    longDateFormat: {
        LT: 'A h:mm সময়',
        LTS: 'A h:mm:ss সময়',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY, A h:mm সময়',
        LLLL: 'dddd, D MMMM YYYY, A h:mm সময়',
    },
    calendar: {
        sameDay: '[আজ] LT',
        nextDay: '[আগামীকাল] LT',
        nextWeek: 'dddd, LT',
        lastDay: '[গতকাল] LT',
        lastWeek: '[গত] dddd, LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s পরে',
        past: '%s আগে',
        s: 'কয়েক সেকেন্ড',
        ss: '%d সেকেন্ড',
        m: 'এক মিনিট',
        mm: '%d মিনিট',
        h: 'এক ঘন্টা',
        hh: '%d ঘন্টা',
        d: 'এক দিন',
        dd: '%d দিন',
        M: 'এক মাস',
        MM: '%d মাস',
        y: 'এক বছর',
        yy: '%d বছর',
    },
    preparse: function (string) {
        return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {
            return numberMap[match];
        });
    },
    postformat: function (string) {
        return string.replace(/\d/g, function (match) {
            return symbolMap[match];
        });
    },

    meridiemParse: /রাত|ভোর|সকাল|দুপুর|বিকাল|সন্ধ্যা|রাত/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'রাত') {
            return hour < 4 ? hour : hour + 12;
        } else if (meridiem === 'ভোর') {
            return hour;
        } else if (meridiem === 'সকাল') {
            return hour;
        } else if (meridiem === 'দুপুর') {
            return hour >= 3 ? hour : hour + 12;
        } else if (meridiem === 'বিকাল') {
            return hour + 12;
        } else if (meridiem === 'সন্ধ্যা') {
            return hour + 12;
        }
    },

    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'রাত';
        } else if (hour < 6) {
            return 'ভোর';
        } else if (hour < 12) {
            return 'সকাল';
        } else if (hour < 15) {
            return 'দুপুর';
        } else if (hour < 18) {
            return 'বিকাল';
        } else if (hour < 20) {
            return 'সন্ধ্যা';
        } else {
            return 'রাত';
        }
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Bengali [bn]
//! author : Kaushik Gandhi : https://github.com/kaushikgandhi

import moment from '../moment';

var symbolMap = {
        1: '১',
        2: '২',
        3: '৩',
        4: '৪',
        5: '৫',
        6: '৬',
        7: '৭',
        8: '৮',
        9: '৯',
        0: '০',
    },
    numberMap = {
        '১': '1',
        '২': '2',
        '৩': '3',
        '৪': '4',
        '৫': '5',
        '৬': '6',
        '৭': '7',
        '৮': '8',
        '৯': '9',
        '০': '0',
    };

export default moment.defineLocale('bn', {
    months: 'জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split(
        '_'
    ),
    monthsShort:
        'জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে'.split(
            '_'
        ),
    weekdays: 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split(
        '_'
    ),
    weekdaysShort: 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),
    weekdaysMin: 'রবি_সোম_মঙ্গল_বুধ_বৃহ_শুক্র_শনি'.split('_'),
    longDateFormat: {
        LT: 'A h:mm সময়',
        LTS: 'A h:mm:ss সময়',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY, A h:mm সময়',
        LLLL: 'dddd, D MMMM YYYY, A h:mm সময়',
    },
    calendar: {
        sameDay: '[আজ] LT',
        nextDay: '[আগামীকাল] LT',
        nextWeek: 'dddd, LT',
        lastDay: '[গতকাল] LT',
        lastWeek: '[গত] dddd, LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s পরে',
        past: '%s আগে',
        s: 'কয়েক সেকেন্ড',
        ss: '%d সেকেন্ড',
        m: 'এক মিনিট',
        mm: '%d মিনিট',
        h: 'এক ঘন্টা',
        hh: '%d ঘন্টা',
        d: 'এক দিন',
        dd: '%d দিন',
        M: 'এক মাস',
        MM: '%d মাস',
        y: 'এক বছর',
        yy: '%d বছর',
    },
    preparse: function (string) {
        return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {
            return numberMap[match];
        });
    },
    postformat: function (string) {
        return string.replace(/\d/g, function (match) {
            return symbolMap[match];
        });
    },
    meridiemParse: /রাত|সকাল|দুপুর|বিকাল|রাত/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (
            (meridiem === 'রাত' && hour >= 4) ||
            (meridiem === 'দুপুর' && hour < 5) ||
            meridiem === 'বিকাল'
        ) {
            return hour + 12;
        } else {
            return hour;
        }
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'রাত';
        } else if (hour < 10) {
            return 'সকাল';
        } else if (hour < 17) {
            return 'দুপুর';
        } else if (hour < 20) {
            return 'বিকাল';
        } else {
            return 'রাত';
        }
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Tibetan [bo]
//! author : Thupten N. Chakrishar : https://github.com/vajradog

import moment from '../moment';

var symbolMap = {
        1: '༡',
        2: '༢',
        3: '༣',
        4: '༤',
        5: '༥',
        6: '༦',
        7: '༧',
        8: '༨',
        9: '༩',
        0: '༠',
    },
    numberMap = {
        '༡': '1',
        '༢': '2',
        '༣': '3',
        '༤': '4',
        '༥': '5',
        '༦': '6',
        '༧': '7',
        '༨': '8',
        '༩': '9',
        '༠': '0',
    };

export default moment.defineLocale('bo', {
    months: 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split(
        '_'
    ),
    monthsShort:
        'ཟླ་1_ཟླ་2_ཟླ་3_ཟླ་4_ཟླ་5_ཟླ་6_ཟླ་7_ཟླ་8_ཟླ་9_ཟླ་10_ཟླ་11_ཟླ་12'.split(
            '_'
        ),
    monthsShortRegex: /^(ཟླ་\d{1,2})/,
    monthsParseExact: true,
    weekdays:
        'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split(
            '_'
        ),
    weekdaysShort: 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split(
        '_'
    ),
    weekdaysMin: 'ཉི_ཟླ_མིག_ལྷག_ཕུར_སངས_སྤེན'.split('_'),
    longDateFormat: {
        LT: 'A h:mm',
        LTS: 'A h:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY, A h:mm',
        LLLL: 'dddd, D MMMM YYYY, A h:mm',
    },
    calendar: {
        sameDay: '[དི་རིང] LT',
        nextDay: '[སང་ཉིན] LT',
        nextWeek: '[བདུན་ཕྲག་རྗེས་མ], LT',
        lastDay: '[ཁ་སང] LT',
        lastWeek: '[བདུན་ཕྲག་མཐའ་མ] dddd, LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s ལ་',
        past: '%s སྔན་ལ',
        s: 'ལམ་སང',
        ss: '%d སྐར་ཆ།',
        m: 'སྐར་མ་གཅིག',
        mm: '%d སྐར་མ',
        h: 'ཆུ་ཚོད་གཅིག',
        hh: '%d ཆུ་ཚོད',
        d: 'ཉིན་གཅིག',
        dd: '%d ཉིན་',
        M: 'ཟླ་བ་གཅིག',
        MM: '%d ཟླ་བ',
        y: 'ལོ་གཅིག',
        yy: '%d ལོ',
    },
    preparse: function (string) {
        return string.replace(/[༡༢༣༤༥༦༧༨༩༠]/g, function (match) {
            return numberMap[match];
        });
    },
    postformat: function (string) {
        return string.replace(/\d/g, function (match) {
            return symbolMap[match];
        });
    },
    meridiemParse: /མཚན་མོ|ཞོགས་ཀས|ཉིན་གུང|དགོང་དག|མཚན་མོ/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (
            (meridiem === 'མཚན་མོ' && hour >= 4) ||
            (meridiem === 'ཉིན་གུང' && hour < 5) ||
            meridiem === 'དགོང་དག'
        ) {
            return hour + 12;
        } else {
            return hour;
        }
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'མཚན་མོ';
        } else if (hour < 10) {
            return 'ཞོགས་ཀས';
        } else if (hour < 17) {
            return 'ཉིན་གུང';
        } else if (hour < 20) {
            return 'དགོང་དག';
        } else {
            return 'མཚན་མོ';
        }
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Breton [br]
//! author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou

import moment from '../moment';

function relativeTimeWithMutation(number, withoutSuffix, key) {
    var format = {
        mm: 'munutenn',
        MM: 'miz',
        dd: 'devezh',
    };
    return number + ' ' + mutation(format[key], number);
}
function specialMutationForYears(number) {
    switch (lastNumber(number)) {
        case 1:
        case 3:
        case 4:
        case 5:
        case 9:
            return number + ' bloaz';
        default:
            return number + ' vloaz';
    }
}
function lastNumber(number) {
    if (number > 9) {
        return lastNumber(number % 10);
    }
    return number;
}
function mutation(text, number) {
    if (number === 2) {
        return softMutation(text);
    }
    return text;
}
function softMutation(text) {
    var mutationTable = {
        m: 'v',
        b: 'v',
        d: 'z',
    };
    if (mutationTable[text.charAt(0)] === undefined) {
        return text;
    }
    return mutationTable[text.charAt(0)] + text.substring(1);
}

var monthsParse = [
        /^gen/i,
        /^c[ʼ\']hwe/i,
        /^meu/i,
        /^ebr/i,
        /^mae/i,
        /^(mez|eve)/i,
        /^gou/i,
        /^eos/i,
        /^gwe/i,
        /^her/i,
        /^du/i,
        /^ker/i,
    ],
    monthsRegex =
        /^(genver|c[ʼ\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu|gen|c[ʼ\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,
    monthsStrictRegex =
        /^(genver|c[ʼ\']hwevrer|meurzh|ebrel|mae|mezheven|gouere|eost|gwengolo|here|du|kerzu)/i,
    monthsShortStrictRegex =
        /^(gen|c[ʼ\']hwe|meu|ebr|mae|eve|gou|eos|gwe|her|du|ker)/i,
    fullWeekdaysParse = [
        /^sul/i,
        /^lun/i,
        /^meurzh/i,
        /^merc[ʼ\']her/i,
        /^yaou/i,
        /^gwener/i,
        /^sadorn/i,
    ],
    shortWeekdaysParse = [
        /^Sul/i,
        /^Lun/i,
        /^Meu/i,
        /^Mer/i,
        /^Yao/i,
        /^Gwe/i,
        /^Sad/i,
    ],
    minWeekdaysParse = [
        /^Su/i,
        /^Lu/i,
        /^Me([^r]|$)/i,
        /^Mer/i,
        /^Ya/i,
        /^Gw/i,
        /^Sa/i,
    ];

export default moment.defineLocale('br', {
    months: 'Genver_Cʼhwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split(
        '_'
    ),
    monthsShort: 'Gen_Cʼhwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'),
    weekdays: 'Sul_Lun_Meurzh_Mercʼher_Yaou_Gwener_Sadorn'.split('_'),
    weekdaysShort: 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'),
    weekdaysMin: 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'),
    weekdaysParse: minWeekdaysParse,
    fullWeekdaysParse: fullWeekdaysParse,
    shortWeekdaysParse: shortWeekdaysParse,
    minWeekdaysParse: minWeekdaysParse,

    monthsRegex: monthsRegex,
    monthsShortRegex: monthsRegex,
    monthsStrictRegex: monthsStrictRegex,
    monthsShortStrictRegex: monthsShortStrictRegex,
    monthsParse: monthsParse,
    longMonthsParse: monthsParse,
    shortMonthsParse: monthsParse,

    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D [a viz] MMMM YYYY',
        LLL: 'D [a viz] MMMM YYYY HH:mm',
        LLLL: 'dddd, D [a viz] MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Hiziv da] LT',
        nextDay: '[Warcʼhoazh da] LT',
        nextWeek: 'dddd [da] LT',
        lastDay: '[Decʼh da] LT',
        lastWeek: 'dddd [paset da] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'a-benn %s',
        past: '%s ʼzo',
        s: 'un nebeud segondennoù',
        ss: '%d eilenn',
        m: 'ur vunutenn',
        mm: relativeTimeWithMutation,
        h: 'un eur',
        hh: '%d eur',
        d: 'un devezh',
        dd: relativeTimeWithMutation,
        M: 'ur miz',
        MM: relativeTimeWithMutation,
        y: 'ur bloaz',
        yy: specialMutationForYears,
    },
    dayOfMonthOrdinalParse: /\d{1,2}(añ|vet)/,
    ordinal: function (number) {
        var output = number === 1 ? 'añ' : 'vet';
        return number + output;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
    meridiemParse: /a.m.|g.m./, // goude merenn | a-raok merenn
    isPM: function (token) {
        return token === 'g.m.';
    },
    meridiem: function (hour, minute, isLower) {
        return hour < 12 ? 'a.m.' : 'g.m.';
    },
});
//! moment.js locale configuration
//! locale : Bosnian [bs]
//! author : Nedim Cholich : https://github.com/frontyard
//! based on (hr) translation by Bojan Marković

import moment from '../moment';

function translate(number, withoutSuffix, key) {
    var result = number + ' ';
    switch (key) {
        case 'ss':
            if (number === 1) {
                result += 'sekunda';
            } else if (number === 2 || number === 3 || number === 4) {
                result += 'sekunde';
            } else {
                result += 'sekundi';
            }
            return result;
        case 'm':
            return withoutSuffix ? 'jedna minuta' : 'jedne minute';
        case 'mm':
            if (number === 1) {
                result += 'minuta';
            } else if (number === 2 || number === 3 || number === 4) {
                result += 'minute';
            } else {
                result += 'minuta';
            }
            return result;
        case 'h':
            return withoutSuffix ? 'jedan sat' : 'jednog sata';
        case 'hh':
            if (number === 1) {
                result += 'sat';
            } else if (number === 2 || number === 3 || number === 4) {
                result += 'sata';
            } else {
                result += 'sati';
            }
            return result;
        case 'dd':
            if (number === 1) {
                result += 'dan';
            } else {
                result += 'dana';
            }
            return result;
        case 'MM':
            if (number === 1) {
                result += 'mjesec';
            } else if (number === 2 || number === 3 || number === 4) {
                result += 'mjeseca';
            } else {
                result += 'mjeseci';
            }
            return result;
        case 'yy':
            if (number === 1) {
                result += 'godina';
            } else if (number === 2 || number === 3 || number === 4) {
                result += 'godine';
            } else {
                result += 'godina';
            }
            return result;
    }
}

export default moment.defineLocale('bs', {
    months: 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split(
        '_'
    ),
    monthsShort:
        'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split(
        '_'
    ),
    weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
    weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY H:mm',
        LLLL: 'dddd, D. MMMM YYYY H:mm',
    },
    calendar: {
        sameDay: '[danas u] LT',
        nextDay: '[sutra u] LT',
        nextWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[u] [nedjelju] [u] LT';
                case 3:
                    return '[u] [srijedu] [u] LT';
                case 6:
                    return '[u] [subotu] [u] LT';
                case 1:
                case 2:
                case 4:
                case 5:
                    return '[u] dddd [u] LT';
            }
        },
        lastDay: '[jučer u] LT',
        lastWeek: function () {
            switch (this.day()) {
                case 0:
                case 3:
                    return '[prošlu] dddd [u] LT';
                case 6:
                    return '[prošle] [subote] [u] LT';
                case 1:
                case 2:
                case 4:
                case 5:
                    return '[prošli] dddd [u] LT';
            }
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'za %s',
        past: 'prije %s',
        s: 'par sekundi',
        ss: translate,
        m: translate,
        mm: translate,
        h: translate,
        hh: translate,
        d: 'dan',
        dd: translate,
        M: 'mjesec',
        MM: translate,
        y: 'godinu',
        yy: translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Catalan [ca]
//! author : Juan G. Hurtado : https://github.com/juanghurtado

import moment from '../moment';

export default moment.defineLocale('ca', {
    months: {
        standalone:
            'gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre'.split(
                '_'
            ),
        format: "de gener_de febrer_de març_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split(
            '_'
        ),
        isFormat: /D[oD]?(\s)+MMMM/,
    },
    monthsShort:
        'gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays:
        'diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte'.split(
            '_'
        ),
    weekdaysShort: 'dg._dl._dt._dc._dj._dv._ds.'.split('_'),
    weekdaysMin: 'dg_dl_dt_dc_dj_dv_ds'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM [de] YYYY',
        ll: 'D MMM YYYY',
        LLL: 'D MMMM [de] YYYY [a les] H:mm',
        lll: 'D MMM YYYY, H:mm',
        LLLL: 'dddd D MMMM [de] YYYY [a les] H:mm',
        llll: 'ddd D MMM YYYY, H:mm',
    },
    calendar: {
        sameDay: function () {
            return '[avui a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';
        },
        nextDay: function () {
            return '[demà a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';
        },
        nextWeek: function () {
            return 'dddd [a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';
        },
        lastDay: function () {
            return '[ahir a ' + (this.hours() !== 1 ? 'les' : 'la') + '] LT';
        },
        lastWeek: function () {
            return (
                '[el] dddd [passat a ' +
                (this.hours() !== 1 ? 'les' : 'la') +
                '] LT'
            );
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: "d'aquí %s",
        past: 'fa %s',
        s: 'uns segons',
        ss: '%d segons',
        m: 'un minut',
        mm: '%d minuts',
        h: 'una hora',
        hh: '%d hores',
        d: 'un dia',
        dd: '%d dies',
        M: 'un mes',
        MM: '%d mesos',
        y: 'un any',
        yy: '%d anys',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(r|n|t|è|a)/,
    ordinal: function (number, period) {
        var output =
            number === 1
                ? 'r'
                : number === 2
                ? 'n'
                : number === 3
                ? 'r'
                : number === 4
                ? 't'
                : 'è';
        if (period === 'w' || period === 'W') {
            output = 'a';
        }
        return number + output;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Czech [cs]
//! author : petrbela : https://github.com/petrbela

import moment from '../moment';

var months = {
        format: 'leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec'.split(
            '_'
        ),
        standalone:
            'ledna_února_března_dubna_května_června_července_srpna_září_října_listopadu_prosince'.split(
                '_'
            ),
    },
    monthsShort = 'led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro'.split('_'),
    monthsParse = [
        /^led/i,
        /^úno/i,
        /^bře/i,
        /^dub/i,
        /^kvě/i,
        /^(čvn|červen$|června)/i,
        /^(čvc|červenec|července)/i,
        /^srp/i,
        /^zář/i,
        /^říj/i,
        /^lis/i,
        /^pro/i,
    ],
    // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched.
    // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'.
    monthsRegex =
        /^(leden|únor|březen|duben|květen|červenec|července|červen|června|srpen|září|říjen|listopad|prosinec|led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i;

function plural(n) {
    return n > 1 && n < 5 && ~~(n / 10) !== 1;
}
function translate(number, withoutSuffix, key, isFuture) {
    var result = number + ' ';
    switch (key) {
        case 's': // a few seconds / in a few seconds / a few seconds ago
            return withoutSuffix || isFuture ? 'pár sekund' : 'pár sekundami';
        case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago
            if (withoutSuffix || isFuture) {
                return result + (plural(number) ? 'sekundy' : 'sekund');
            } else {
                return result + 'sekundami';
            }
        case 'm': // a minute / in a minute / a minute ago
            return withoutSuffix ? 'minuta' : isFuture ? 'minutu' : 'minutou';
        case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
            if (withoutSuffix || isFuture) {
                return result + (plural(number) ? 'minuty' : 'minut');
            } else {
                return result + 'minutami';
            }
        case 'h': // an hour / in an hour / an hour ago
            return withoutSuffix ? 'hodina' : isFuture ? 'hodinu' : 'hodinou';
        case 'hh': // 9 hours / in 9 hours / 9 hours ago
            if (withoutSuffix || isFuture) {
                return result + (plural(number) ? 'hodiny' : 'hodin');
            } else {
                return result + 'hodinami';
            }
        case 'd': // a day / in a day / a day ago
            return withoutSuffix || isFuture ? 'den' : 'dnem';
        case 'dd': // 9 days / in 9 days / 9 days ago
            if (withoutSuffix || isFuture) {
                return result + (plural(number) ? 'dny' : 'dní');
            } else {
                return result + 'dny';
            }
        case 'M': // a month / in a month / a month ago
            return withoutSuffix || isFuture ? 'měsíc' : 'měsícem';
        case 'MM': // 9 months / in 9 months / 9 months ago
            if (withoutSuffix || isFuture) {
                return result + (plural(number) ? 'měsíce' : 'měsíců');
            } else {
                return result + 'měsíci';
            }
        case 'y': // a year / in a year / a year ago
            return withoutSuffix || isFuture ? 'rok' : 'rokem';
        case 'yy': // 9 years / in 9 years / 9 years ago
            if (withoutSuffix || isFuture) {
                return result + (plural(number) ? 'roky' : 'let');
            } else {
                return result + 'lety';
            }
    }
}

export default moment.defineLocale('cs', {
    months: months,
    monthsShort: monthsShort,
    monthsRegex: monthsRegex,
    monthsShortRegex: monthsRegex,
    // NOTE: 'červen' is substring of 'červenec'; therefore 'červenec' must precede 'červen' in the regex to be fully matched.
    // Otherwise parser matches '1. červenec' as '1. červen' + 'ec'.
    monthsStrictRegex:
        /^(leden|ledna|února|únor|březen|března|duben|dubna|květen|května|červenec|července|červen|června|srpen|srpna|září|říjen|října|listopadu|listopad|prosinec|prosince)/i,
    monthsShortStrictRegex:
        /^(led|úno|bře|dub|kvě|čvn|čvc|srp|zář|říj|lis|pro)/i,
    monthsParse: monthsParse,
    longMonthsParse: monthsParse,
    shortMonthsParse: monthsParse,
    weekdays: 'neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota'.split('_'),
    weekdaysShort: 'ne_po_út_st_čt_pá_so'.split('_'),
    weekdaysMin: 'ne_po_út_st_čt_pá_so'.split('_'),
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY H:mm',
        LLLL: 'dddd D. MMMM YYYY H:mm',
        l: 'D. M. YYYY',
    },
    calendar: {
        sameDay: '[dnes v] LT',
        nextDay: '[zítra v] LT',
        nextWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[v neděli v] LT';
                case 1:
                case 2:
                    return '[v] dddd [v] LT';
                case 3:
                    return '[ve středu v] LT';
                case 4:
                    return '[ve čtvrtek v] LT';
                case 5:
                    return '[v pátek v] LT';
                case 6:
                    return '[v sobotu v] LT';
            }
        },
        lastDay: '[včera v] LT',
        lastWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[minulou neděli v] LT';
                case 1:
                case 2:
                    return '[minulé] dddd [v] LT';
                case 3:
                    return '[minulou středu v] LT';
                case 4:
                case 5:
                    return '[minulý] dddd [v] LT';
                case 6:
                    return '[minulou sobotu v] LT';
            }
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'za %s',
        past: 'před %s',
        s: translate,
        ss: translate,
        m: translate,
        mm: translate,
        h: translate,
        hh: translate,
        d: translate,
        dd: translate,
        M: translate,
        MM: translate,
        y: translate,
        yy: translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Chuvash [cv]
//! author : Anatoly Mironov : https://github.com/mirontoli

import moment from '../moment';

export default moment.defineLocale('cv', {
    months: 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split(
        '_'
    ),
    monthsShort: 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'),
    weekdays:
        'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split(
            '_'
        ),
    weekdaysShort: 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'),
    weekdaysMin: 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD-MM-YYYY',
        LL: 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]',
        LLL: 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm',
        LLLL: 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm',
    },
    calendar: {
        sameDay: '[Паян] LT [сехетре]',
        nextDay: '[Ыран] LT [сехетре]',
        lastDay: '[Ӗнер] LT [сехетре]',
        nextWeek: '[Ҫитес] dddd LT [сехетре]',
        lastWeek: '[Иртнӗ] dddd LT [сехетре]',
        sameElse: 'L',
    },
    relativeTime: {
        future: function (output) {
            var affix = /сехет$/i.exec(output)
                ? 'рен'
                : /ҫул$/i.exec(output)
                ? 'тан'
                : 'ран';
            return output + affix;
        },
        past: '%s каялла',
        s: 'пӗр-ик ҫеккунт',
        ss: '%d ҫеккунт',
        m: 'пӗр минут',
        mm: '%d минут',
        h: 'пӗр сехет',
        hh: '%d сехет',
        d: 'пӗр кун',
        dd: '%d кун',
        M: 'пӗр уйӑх',
        MM: '%d уйӑх',
        y: 'пӗр ҫул',
        yy: '%d ҫул',
    },
    dayOfMonthOrdinalParse: /\d{1,2}-мӗш/,
    ordinal: '%d-мӗш',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Welsh [cy]
//! author : Robert Allen : https://github.com/robgallen
//! author : https://github.com/ryangreaves

import moment from '../moment';

export default moment.defineLocale('cy', {
    months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split(
        '_'
    ),
    monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split(
        '_'
    ),
    weekdays:
        'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split(
            '_'
        ),
    weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'),
    weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'),
    weekdaysParseExact: true,
    // time formats are the same as en-gb
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Heddiw am] LT',
        nextDay: '[Yfory am] LT',
        nextWeek: 'dddd [am] LT',
        lastDay: '[Ddoe am] LT',
        lastWeek: 'dddd [diwethaf am] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'mewn %s',
        past: '%s yn ôl',
        s: 'ychydig eiliadau',
        ss: '%d eiliad',
        m: 'munud',
        mm: '%d munud',
        h: 'awr',
        hh: '%d awr',
        d: 'diwrnod',
        dd: '%d diwrnod',
        M: 'mis',
        MM: '%d mis',
        y: 'blwyddyn',
        yy: '%d flynedd',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(fed|ain|af|il|ydd|ed|eg)/,
    // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh
    ordinal: function (number) {
        var b = number,
            output = '',
            lookup = [
                '',
                'af',
                'il',
                'ydd',
                'ydd',
                'ed',
                'ed',
                'ed',
                'fed',
                'fed',
                'fed', // 1af to 10fed
                'eg',
                'fed',
                'eg',
                'eg',
                'fed',
                'eg',
                'eg',
                'fed',
                'eg',
                'fed', // 11eg to 20fed
            ];
        if (b > 20) {
            if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) {
                output = 'fed'; // not 30ain, 70ain or 90ain
            } else {
                output = 'ain';
            }
        } else if (b > 0) {
            output = lookup[b];
        }
        return number + output;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Danish [da]
//! author : Ulrik Nielsen : https://github.com/mrbase

import moment from '../moment';

export default moment.defineLocale('da', {
    months: 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split(
        '_'
    ),
    monthsShort: 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
    weekdays: 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
    weekdaysShort: 'søn_man_tir_ons_tor_fre_lør'.split('_'),
    weekdaysMin: 'sø_ma_ti_on_to_fr_lø'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY HH:mm',
        LLLL: 'dddd [d.] D. MMMM YYYY [kl.] HH:mm',
    },
    calendar: {
        sameDay: '[i dag kl.] LT',
        nextDay: '[i morgen kl.] LT',
        nextWeek: 'på dddd [kl.] LT',
        lastDay: '[i går kl.] LT',
        lastWeek: '[i] dddd[s kl.] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'om %s',
        past: '%s siden',
        s: 'få sekunder',
        ss: '%d sekunder',
        m: 'et minut',
        mm: '%d minutter',
        h: 'en time',
        hh: '%d timer',
        d: 'en dag',
        dd: '%d dage',
        M: 'en måned',
        MM: '%d måneder',
        y: 'et år',
        yy: '%d år',
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : German (Austria) [de-at]
//! author : lluchs : https://github.com/lluchs
//! author: Menelion Elensúle: https://github.com/Oire
//! author : Martin Groller : https://github.com/MadMG
//! author : Mikolaj Dadela : https://github.com/mik01aj

import moment from '../moment';

function processRelativeTime(number, withoutSuffix, key, isFuture) {
    var format = {
        m: ['eine Minute', 'einer Minute'],
        h: ['eine Stunde', 'einer Stunde'],
        d: ['ein Tag', 'einem Tag'],
        dd: [number + ' Tage', number + ' Tagen'],
        w: ['eine Woche', 'einer Woche'],
        M: ['ein Monat', 'einem Monat'],
        MM: [number + ' Monate', number + ' Monaten'],
        y: ['ein Jahr', 'einem Jahr'],
        yy: [number + ' Jahre', number + ' Jahren'],
    };
    return withoutSuffix ? format[key][0] : format[key][1];
}

export default moment.defineLocale('de-at', {
    months: 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split(
        '_'
    ),
    monthsShort:
        'Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),
    monthsParseExact: true,
    weekdays:
        'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split(
            '_'
        ),
    weekdaysShort: 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
    weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY HH:mm',
        LLLL: 'dddd, D. MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[heute um] LT [Uhr]',
        sameElse: 'L',
        nextDay: '[morgen um] LT [Uhr]',
        nextWeek: 'dddd [um] LT [Uhr]',
        lastDay: '[gestern um] LT [Uhr]',
        lastWeek: '[letzten] dddd [um] LT [Uhr]',
    },
    relativeTime: {
        future: 'in %s',
        past: 'vor %s',
        s: 'ein paar Sekunden',
        ss: '%d Sekunden',
        m: processRelativeTime,
        mm: '%d Minuten',
        h: processRelativeTime,
        hh: '%d Stunden',
        d: processRelativeTime,
        dd: processRelativeTime,
        w: processRelativeTime,
        ww: '%d Wochen',
        M: processRelativeTime,
        MM: processRelativeTime,
        y: processRelativeTime,
        yy: processRelativeTime,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : German (Switzerland) [de-ch]
//! author : sschueller : https://github.com/sschueller

// based on: https://www.bk.admin.ch/dokumentation/sprachen/04915/05016/index.html?lang=de#

import moment from '../moment';

function processRelativeTime(number, withoutSuffix, key, isFuture) {
    var format = {
        m: ['eine Minute', 'einer Minute'],
        h: ['eine Stunde', 'einer Stunde'],
        d: ['ein Tag', 'einem Tag'],
        dd: [number + ' Tage', number + ' Tagen'],
        w: ['eine Woche', 'einer Woche'],
        M: ['ein Monat', 'einem Monat'],
        MM: [number + ' Monate', number + ' Monaten'],
        y: ['ein Jahr', 'einem Jahr'],
        yy: [number + ' Jahre', number + ' Jahren'],
    };
    return withoutSuffix ? format[key][0] : format[key][1];
}

export default moment.defineLocale('de-ch', {
    months: 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split(
        '_'
    ),
    monthsShort:
        'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),
    monthsParseExact: true,
    weekdays:
        'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split(
            '_'
        ),
    weekdaysShort: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
    weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY HH:mm',
        LLLL: 'dddd, D. MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[heute um] LT [Uhr]',
        sameElse: 'L',
        nextDay: '[morgen um] LT [Uhr]',
        nextWeek: 'dddd [um] LT [Uhr]',
        lastDay: '[gestern um] LT [Uhr]',
        lastWeek: '[letzten] dddd [um] LT [Uhr]',
    },
    relativeTime: {
        future: 'in %s',
        past: 'vor %s',
        s: 'ein paar Sekunden',
        ss: '%d Sekunden',
        m: processRelativeTime,
        mm: '%d Minuten',
        h: processRelativeTime,
        hh: '%d Stunden',
        d: processRelativeTime,
        dd: processRelativeTime,
        w: processRelativeTime,
        ww: '%d Wochen',
        M: processRelativeTime,
        MM: processRelativeTime,
        y: processRelativeTime,
        yy: processRelativeTime,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : German [de]
//! author : lluchs : https://github.com/lluchs
//! author: Menelion Elensúle: https://github.com/Oire
//! author : Mikolaj Dadela : https://github.com/mik01aj

import moment from '../moment';

function processRelativeTime(number, withoutSuffix, key, isFuture) {
    var format = {
        m: ['eine Minute', 'einer Minute'],
        h: ['eine Stunde', 'einer Stunde'],
        d: ['ein Tag', 'einem Tag'],
        dd: [number + ' Tage', number + ' Tagen'],
        w: ['eine Woche', 'einer Woche'],
        M: ['ein Monat', 'einem Monat'],
        MM: [number + ' Monate', number + ' Monaten'],
        y: ['ein Jahr', 'einem Jahr'],
        yy: [number + ' Jahre', number + ' Jahren'],
    };
    return withoutSuffix ? format[key][0] : format[key][1];
}

export default moment.defineLocale('de', {
    months: 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split(
        '_'
    ),
    monthsShort:
        'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),
    monthsParseExact: true,
    weekdays:
        'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split(
            '_'
        ),
    weekdaysShort: 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),
    weekdaysMin: 'So_Mo_Di_Mi_Do_Fr_Sa'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY HH:mm',
        LLLL: 'dddd, D. MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[heute um] LT [Uhr]',
        sameElse: 'L',
        nextDay: '[morgen um] LT [Uhr]',
        nextWeek: 'dddd [um] LT [Uhr]',
        lastDay: '[gestern um] LT [Uhr]',
        lastWeek: '[letzten] dddd [um] LT [Uhr]',
    },
    relativeTime: {
        future: 'in %s',
        past: 'vor %s',
        s: 'ein paar Sekunden',
        ss: '%d Sekunden',
        m: processRelativeTime,
        mm: '%d Minuten',
        h: processRelativeTime,
        hh: '%d Stunden',
        d: processRelativeTime,
        dd: processRelativeTime,
        w: processRelativeTime,
        ww: '%d Wochen',
        M: processRelativeTime,
        MM: processRelativeTime,
        y: processRelativeTime,
        yy: processRelativeTime,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Maldivian [dv]
//! author : Jawish Hameed : https://github.com/jawish

import moment from '../moment';

var months = [
        'ޖެނުއަރީ',
        'ފެބްރުއަރީ',
        'މާރިޗު',
        'އޭޕްރީލު',
        'މޭ',
        'ޖޫން',
        'ޖުލައި',
        'އޯގަސްޓު',
        'ސެޕްޓެމްބަރު',
        'އޮކްޓޯބަރު',
        'ނޮވެމްބަރު',
        'ޑިސެމްބަރު',
    ],
    weekdays = [
        'އާދިއްތަ',
        'ހޯމަ',
        'އަންގާރަ',
        'ބުދަ',
        'ބުރާސްފަތި',
        'ހުކުރު',
        'ހޮނިހިރު',
    ];

export default moment.defineLocale('dv', {
    months: months,
    monthsShort: months,
    weekdays: weekdays,
    weekdaysShort: weekdays,
    weekdaysMin: 'އާދި_ހޯމަ_އަން_ބުދަ_ބުރާ_ހުކު_ހޮނި'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'D/M/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    meridiemParse: /މކ|މފ/,
    isPM: function (input) {
        return 'މފ' === input;
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return 'މކ';
        } else {
            return 'މފ';
        }
    },
    calendar: {
        sameDay: '[މިއަދު] LT',
        nextDay: '[މާދަމާ] LT',
        nextWeek: 'dddd LT',
        lastDay: '[އިއްޔެ] LT',
        lastWeek: '[ފާއިތުވި] dddd LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'ތެރޭގައި %s',
        past: 'ކުރިން %s',
        s: 'ސިކުންތުކޮޅެއް',
        ss: 'd% ސިކުންތު',
        m: 'މިނިޓެއް',
        mm: 'މިނިޓު %d',
        h: 'ގަޑިއިރެއް',
        hh: 'ގަޑިއިރު %d',
        d: 'ދުވަހެއް',
        dd: 'ދުވަސް %d',
        M: 'މަހެއް',
        MM: 'މަސް %d',
        y: 'އަހަރެއް',
        yy: 'އަހަރު %d',
    },
    preparse: function (string) {
        return string.replace(/،/g, ',');
    },
    postformat: function (string) {
        return string.replace(/,/g, '،');
    },
    week: {
        dow: 7, // Sunday is the first day of the week.
        doy: 12, // The week that contains Jan 12th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Greek [el]
//! author : Aggelos Karalias : https://github.com/mehiel

import moment from '../moment';

function isFunction(input) {
    return (
        (typeof Function !== 'undefined' && input instanceof Function) ||
        Object.prototype.toString.call(input) === '[object Function]'
    );
}

export default moment.defineLocale('el', {
    monthsNominativeEl:
        'Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος'.split(
            '_'
        ),
    monthsGenitiveEl:
        'Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου'.split(
            '_'
        ),
    months: function (momentToFormat, format) {
        if (!momentToFormat) {
            return this._monthsNominativeEl;
        } else if (
            typeof format === 'string' &&
            /D/.test(format.substring(0, format.indexOf('MMMM')))
        ) {
            // if there is a day number before 'MMMM'
            return this._monthsGenitiveEl[momentToFormat.month()];
        } else {
            return this._monthsNominativeEl[momentToFormat.month()];
        }
    },
    monthsShort: 'Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ'.split('_'),
    weekdays: 'Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο'.split(
        '_'
    ),
    weekdaysShort: 'Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ'.split('_'),
    weekdaysMin: 'Κυ_Δε_Τρ_Τε_Πε_Πα_Σα'.split('_'),
    meridiem: function (hours, minutes, isLower) {
        if (hours > 11) {
            return isLower ? 'μμ' : 'ΜΜ';
        } else {
            return isLower ? 'πμ' : 'ΠΜ';
        }
    },
    isPM: function (input) {
        return (input + '').toLowerCase()[0] === 'μ';
    },
    meridiemParse: /[ΠΜ]\.?Μ?\.?/i,
    longDateFormat: {
        LT: 'h:mm A',
        LTS: 'h:mm:ss A',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY h:mm A',
        LLLL: 'dddd, D MMMM YYYY h:mm A',
    },
    calendarEl: {
        sameDay: '[Σήμερα {}] LT',
        nextDay: '[Αύριο {}] LT',
        nextWeek: 'dddd [{}] LT',
        lastDay: '[Χθες {}] LT',
        lastWeek: function () {
            switch (this.day()) {
                case 6:
                    return '[το προηγούμενο] dddd [{}] LT';
                default:
                    return '[την προηγούμενη] dddd [{}] LT';
            }
        },
        sameElse: 'L',
    },
    calendar: function (key, mom) {
        var output = this._calendarEl[key],
            hours = mom && mom.hours();
        if (isFunction(output)) {
            output = output.apply(mom);
        }
        return output.replace('{}', hours % 12 === 1 ? 'στη' : 'στις');
    },
    relativeTime: {
        future: 'σε %s',
        past: '%s πριν',
        s: 'λίγα δευτερόλεπτα',
        ss: '%d δευτερόλεπτα',
        m: 'ένα λεπτό',
        mm: '%d λεπτά',
        h: 'μία ώρα',
        hh: '%d ώρες',
        d: 'μία μέρα',
        dd: '%d μέρες',
        M: 'ένας μήνας',
        MM: '%d μήνες',
        y: 'ένας χρόνος',
        yy: '%d χρόνια',
    },
    dayOfMonthOrdinalParse: /\d{1,2}η/,
    ordinal: '%dη',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4st is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : English (Australia) [en-au]
//! author : Jared Morse : https://github.com/jarcoal

import moment from '../moment';

export default moment.defineLocale('en-au', {
    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
        '_'
    ),
    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
    longDateFormat: {
        LT: 'h:mm A',
        LTS: 'h:mm:ss A',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY h:mm A',
        LLLL: 'dddd, D MMMM YYYY h:mm A',
    },
    calendar: {
        sameDay: '[Today at] LT',
        nextDay: '[Tomorrow at] LT',
        nextWeek: 'dddd [at] LT',
        lastDay: '[Yesterday at] LT',
        lastWeek: '[Last] dddd [at] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'in %s',
        past: '%s ago',
        s: 'a few seconds',
        ss: '%d seconds',
        m: 'a minute',
        mm: '%d minutes',
        h: 'an hour',
        hh: '%d hours',
        d: 'a day',
        dd: '%d days',
        M: 'a month',
        MM: '%d months',
        y: 'a year',
        yy: '%d years',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
    ordinal: function (number) {
        var b = number % 10,
            output =
                ~~((number % 100) / 10) === 1
                    ? 'th'
                    : b === 1
                    ? 'st'
                    : b === 2
                    ? 'nd'
                    : b === 3
                    ? 'rd'
                    : 'th';
        return number + output;
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : English (Canada) [en-ca]
//! author : Jonathan Abourbih : https://github.com/jonbca

import moment from '../moment';

export default moment.defineLocale('en-ca', {
    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
        '_'
    ),
    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
    longDateFormat: {
        LT: 'h:mm A',
        LTS: 'h:mm:ss A',
        L: 'YYYY-MM-DD',
        LL: 'MMMM D, YYYY',
        LLL: 'MMMM D, YYYY h:mm A',
        LLLL: 'dddd, MMMM D, YYYY h:mm A',
    },
    calendar: {
        sameDay: '[Today at] LT',
        nextDay: '[Tomorrow at] LT',
        nextWeek: 'dddd [at] LT',
        lastDay: '[Yesterday at] LT',
        lastWeek: '[Last] dddd [at] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'in %s',
        past: '%s ago',
        s: 'a few seconds',
        ss: '%d seconds',
        m: 'a minute',
        mm: '%d minutes',
        h: 'an hour',
        hh: '%d hours',
        d: 'a day',
        dd: '%d days',
        M: 'a month',
        MM: '%d months',
        y: 'a year',
        yy: '%d years',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
    ordinal: function (number) {
        var b = number % 10,
            output =
                ~~((number % 100) / 10) === 1
                    ? 'th'
                    : b === 1
                    ? 'st'
                    : b === 2
                    ? 'nd'
                    : b === 3
                    ? 'rd'
                    : 'th';
        return number + output;
    },
});
//! moment.js locale configuration
//! locale : English (United Kingdom) [en-gb]
//! author : Chris Gedrim : https://github.com/chrisgedrim

import moment from '../moment';

export default moment.defineLocale('en-gb', {
    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
        '_'
    ),
    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Today at] LT',
        nextDay: '[Tomorrow at] LT',
        nextWeek: 'dddd [at] LT',
        lastDay: '[Yesterday at] LT',
        lastWeek: '[Last] dddd [at] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'in %s',
        past: '%s ago',
        s: 'a few seconds',
        ss: '%d seconds',
        m: 'a minute',
        mm: '%d minutes',
        h: 'an hour',
        hh: '%d hours',
        d: 'a day',
        dd: '%d days',
        M: 'a month',
        MM: '%d months',
        y: 'a year',
        yy: '%d years',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
    ordinal: function (number) {
        var b = number % 10,
            output =
                ~~((number % 100) / 10) === 1
                    ? 'th'
                    : b === 1
                    ? 'st'
                    : b === 2
                    ? 'nd'
                    : b === 3
                    ? 'rd'
                    : 'th';
        return number + output;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : English (Ireland) [en-ie]
//! author : Chris Cartlidge : https://github.com/chriscartlidge

import moment from '../moment';

export default moment.defineLocale('en-ie', {
    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
        '_'
    ),
    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Today at] LT',
        nextDay: '[Tomorrow at] LT',
        nextWeek: 'dddd [at] LT',
        lastDay: '[Yesterday at] LT',
        lastWeek: '[Last] dddd [at] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'in %s',
        past: '%s ago',
        s: 'a few seconds',
        ss: '%d seconds',
        m: 'a minute',
        mm: '%d minutes',
        h: 'an hour',
        hh: '%d hours',
        d: 'a day',
        dd: '%d days',
        M: 'a month',
        MM: '%d months',
        y: 'a year',
        yy: '%d years',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
    ordinal: function (number) {
        var b = number % 10,
            output =
                ~~((number % 100) / 10) === 1
                    ? 'th'
                    : b === 1
                    ? 'st'
                    : b === 2
                    ? 'nd'
                    : b === 3
                    ? 'rd'
                    : 'th';
        return number + output;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : English (Israel) [en-il]
//! author : Chris Gedrim : https://github.com/chrisgedrim

import moment from '../moment';

export default moment.defineLocale('en-il', {
    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
        '_'
    ),
    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Today at] LT',
        nextDay: '[Tomorrow at] LT',
        nextWeek: 'dddd [at] LT',
        lastDay: '[Yesterday at] LT',
        lastWeek: '[Last] dddd [at] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'in %s',
        past: '%s ago',
        s: 'a few seconds',
        ss: '%d seconds',
        m: 'a minute',
        mm: '%d minutes',
        h: 'an hour',
        hh: '%d hours',
        d: 'a day',
        dd: '%d days',
        M: 'a month',
        MM: '%d months',
        y: 'a year',
        yy: '%d years',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
    ordinal: function (number) {
        var b = number % 10,
            output =
                ~~((number % 100) / 10) === 1
                    ? 'th'
                    : b === 1
                    ? 'st'
                    : b === 2
                    ? 'nd'
                    : b === 3
                    ? 'rd'
                    : 'th';
        return number + output;
    },
});
//! moment.js locale configuration
//! locale : English (India) [en-in]
//! author : Jatin Agrawal : https://github.com/jatinag22

import moment from '../moment';

export default moment.defineLocale('en-in', {
    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
        '_'
    ),
    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
    longDateFormat: {
        LT: 'h:mm A',
        LTS: 'h:mm:ss A',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY h:mm A',
        LLLL: 'dddd, D MMMM YYYY h:mm A',
    },
    calendar: {
        sameDay: '[Today at] LT',
        nextDay: '[Tomorrow at] LT',
        nextWeek: 'dddd [at] LT',
        lastDay: '[Yesterday at] LT',
        lastWeek: '[Last] dddd [at] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'in %s',
        past: '%s ago',
        s: 'a few seconds',
        ss: '%d seconds',
        m: 'a minute',
        mm: '%d minutes',
        h: 'an hour',
        hh: '%d hours',
        d: 'a day',
        dd: '%d days',
        M: 'a month',
        MM: '%d months',
        y: 'a year',
        yy: '%d years',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
    ordinal: function (number) {
        var b = number % 10,
            output =
                ~~((number % 100) / 10) === 1
                    ? 'th'
                    : b === 1
                    ? 'st'
                    : b === 2
                    ? 'nd'
                    : b === 3
                    ? 'rd'
                    : 'th';
        return number + output;
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 1st is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : English (New Zealand) [en-nz]
//! author : Luke McGregor : https://github.com/lukemcgregor

import moment from '../moment';

export default moment.defineLocale('en-nz', {
    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
        '_'
    ),
    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
    longDateFormat: {
        LT: 'h:mm A',
        LTS: 'h:mm:ss A',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY h:mm A',
        LLLL: 'dddd, D MMMM YYYY h:mm A',
    },
    calendar: {
        sameDay: '[Today at] LT',
        nextDay: '[Tomorrow at] LT',
        nextWeek: 'dddd [at] LT',
        lastDay: '[Yesterday at] LT',
        lastWeek: '[Last] dddd [at] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'in %s',
        past: '%s ago',
        s: 'a few seconds',
        ss: '%d seconds',
        m: 'a minute',
        mm: '%d minutes',
        h: 'an hour',
        hh: '%d hours',
        d: 'a day',
        dd: '%d days',
        M: 'a month',
        MM: '%d months',
        y: 'a year',
        yy: '%d years',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
    ordinal: function (number) {
        var b = number % 10,
            output =
                ~~((number % 100) / 10) === 1
                    ? 'th'
                    : b === 1
                    ? 'st'
                    : b === 2
                    ? 'nd'
                    : b === 3
                    ? 'rd'
                    : 'th';
        return number + output;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : English (Singapore) [en-sg]
//! author : Matthew Castrillon-Madrigal : https://github.com/techdimension

import moment from '../moment';

export default moment.defineLocale('en-sg', {
    months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
    weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split(
        '_'
    ),
    weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
    weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Today at] LT',
        nextDay: '[Tomorrow at] LT',
        nextWeek: 'dddd [at] LT',
        lastDay: '[Yesterday at] LT',
        lastWeek: '[Last] dddd [at] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'in %s',
        past: '%s ago',
        s: 'a few seconds',
        ss: '%d seconds',
        m: 'a minute',
        mm: '%d minutes',
        h: 'an hour',
        hh: '%d hours',
        d: 'a day',
        dd: '%d days',
        M: 'a month',
        MM: '%d months',
        y: 'a year',
        yy: '%d years',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
    ordinal: function (number) {
        var b = number % 10,
            output =
                ~~((number % 100) / 10) === 1
                    ? 'th'
                    : b === 1
                    ? 'st'
                    : b === 2
                    ? 'nd'
                    : b === 3
                    ? 'rd'
                    : 'th';
        return number + output;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Esperanto [eo]
//! author : Colin Dean : https://github.com/colindean
//! author : Mia Nordentoft Imperatori : https://github.com/miestasmia
//! comment : miestasmia corrected the translation by colindean
//! comment : Vivakvo corrected the translation by colindean and miestasmia

import moment from '../moment';

export default moment.defineLocale('eo', {
    months: 'januaro_februaro_marto_aprilo_majo_junio_julio_aŭgusto_septembro_oktobro_novembro_decembro'.split(
        '_'
    ),
    monthsShort: 'jan_feb_mart_apr_maj_jun_jul_aŭg_sept_okt_nov_dec'.split('_'),
    weekdays: 'dimanĉo_lundo_mardo_merkredo_ĵaŭdo_vendredo_sabato'.split('_'),
    weekdaysShort: 'dim_lun_mard_merk_ĵaŭ_ven_sab'.split('_'),
    weekdaysMin: 'di_lu_ma_me_ĵa_ve_sa'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'YYYY-MM-DD',
        LL: '[la] D[-an de] MMMM, YYYY',
        LLL: '[la] D[-an de] MMMM, YYYY HH:mm',
        LLLL: 'dddd[n], [la] D[-an de] MMMM, YYYY HH:mm',
        llll: 'ddd, [la] D[-an de] MMM, YYYY HH:mm',
    },
    meridiemParse: /[ap]\.t\.m/i,
    isPM: function (input) {
        return input.charAt(0).toLowerCase() === 'p';
    },
    meridiem: function (hours, minutes, isLower) {
        if (hours > 11) {
            return isLower ? 'p.t.m.' : 'P.T.M.';
        } else {
            return isLower ? 'a.t.m.' : 'A.T.M.';
        }
    },
    calendar: {
        sameDay: '[Hodiaŭ je] LT',
        nextDay: '[Morgaŭ je] LT',
        nextWeek: 'dddd[n je] LT',
        lastDay: '[Hieraŭ je] LT',
        lastWeek: '[pasintan] dddd[n je] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'post %s',
        past: 'antaŭ %s',
        s: 'kelkaj sekundoj',
        ss: '%d sekundoj',
        m: 'unu minuto',
        mm: '%d minutoj',
        h: 'unu horo',
        hh: '%d horoj',
        d: 'unu tago', //ne 'diurno', ĉar estas uzita por proksimumo
        dd: '%d tagoj',
        M: 'unu monato',
        MM: '%d monatoj',
        y: 'unu jaro',
        yy: '%d jaroj',
    },
    dayOfMonthOrdinalParse: /\d{1,2}a/,
    ordinal: '%da',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Spanish (Dominican Republic) [es-do]

import moment from '../moment';

var monthsShortDot =
        'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(
            '_'
        ),
    monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
    monthsParse = [
        /^ene/i,
        /^feb/i,
        /^mar/i,
        /^abr/i,
        /^may/i,
        /^jun/i,
        /^jul/i,
        /^ago/i,
        /^sep/i,
        /^oct/i,
        /^nov/i,
        /^dic/i,
    ],
    monthsRegex =
        /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;

export default moment.defineLocale('es-do', {
    months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(
        '_'
    ),
    monthsShort: function (m, format) {
        if (!m) {
            return monthsShortDot;
        } else if (/-MMM-/.test(format)) {
            return monthsShort[m.month()];
        } else {
            return monthsShortDot[m.month()];
        }
    },
    monthsRegex: monthsRegex,
    monthsShortRegex: monthsRegex,
    monthsStrictRegex:
        /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,
    monthsShortStrictRegex:
        /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,
    monthsParse: monthsParse,
    longMonthsParse: monthsParse,
    shortMonthsParse: monthsParse,
    weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
    weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
    weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'h:mm A',
        LTS: 'h:mm:ss A',
        L: 'DD/MM/YYYY',
        LL: 'D [de] MMMM [de] YYYY',
        LLL: 'D [de] MMMM [de] YYYY h:mm A',
        LLLL: 'dddd, D [de] MMMM [de] YYYY h:mm A',
    },
    calendar: {
        sameDay: function () {
            return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        nextDay: function () {
            return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        nextWeek: function () {
            return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        lastDay: function () {
            return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        lastWeek: function () {
            return (
                '[el] dddd [pasado a la' +
                (this.hours() !== 1 ? 's' : '') +
                '] LT'
            );
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'en %s',
        past: 'hace %s',
        s: 'unos segundos',
        ss: '%d segundos',
        m: 'un minuto',
        mm: '%d minutos',
        h: 'una hora',
        hh: '%d horas',
        d: 'un día',
        dd: '%d días',
        w: 'una semana',
        ww: '%d semanas',
        M: 'un mes',
        MM: '%d meses',
        y: 'un año',
        yy: '%d años',
    },
    dayOfMonthOrdinalParse: /\d{1,2}º/,
    ordinal: '%dº',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Spanish (Mexico) [es-mx]
//! author : JC Franco : https://github.com/jcfranco

import moment from '../moment';

var monthsShortDot =
        'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(
            '_'
        ),
    monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
    monthsParse = [
        /^ene/i,
        /^feb/i,
        /^mar/i,
        /^abr/i,
        /^may/i,
        /^jun/i,
        /^jul/i,
        /^ago/i,
        /^sep/i,
        /^oct/i,
        /^nov/i,
        /^dic/i,
    ],
    monthsRegex =
        /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;

export default moment.defineLocale('es-mx', {
    months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(
        '_'
    ),
    monthsShort: function (m, format) {
        if (!m) {
            return monthsShortDot;
        } else if (/-MMM-/.test(format)) {
            return monthsShort[m.month()];
        } else {
            return monthsShortDot[m.month()];
        }
    },
    monthsRegex: monthsRegex,
    monthsShortRegex: monthsRegex,
    monthsStrictRegex:
        /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,
    monthsShortStrictRegex:
        /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,
    monthsParse: monthsParse,
    longMonthsParse: monthsParse,
    shortMonthsParse: monthsParse,
    weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
    weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
    weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D [de] MMMM [de] YYYY',
        LLL: 'D [de] MMMM [de] YYYY H:mm',
        LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm',
    },
    calendar: {
        sameDay: function () {
            return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        nextDay: function () {
            return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        nextWeek: function () {
            return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        lastDay: function () {
            return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        lastWeek: function () {
            return (
                '[el] dddd [pasado a la' +
                (this.hours() !== 1 ? 's' : '') +
                '] LT'
            );
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'en %s',
        past: 'hace %s',
        s: 'unos segundos',
        ss: '%d segundos',
        m: 'un minuto',
        mm: '%d minutos',
        h: 'una hora',
        hh: '%d horas',
        d: 'un día',
        dd: '%d días',
        w: 'una semana',
        ww: '%d semanas',
        M: 'un mes',
        MM: '%d meses',
        y: 'un año',
        yy: '%d años',
    },
    dayOfMonthOrdinalParse: /\d{1,2}º/,
    ordinal: '%dº',
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
    invalidDate: 'Fecha inválida',
});
//! moment.js locale configuration
//! locale : Spanish (United States) [es-us]
//! author : bustta : https://github.com/bustta
//! author : chrisrodz : https://github.com/chrisrodz

import moment from '../moment';

var monthsShortDot =
        'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(
            '_'
        ),
    monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
    monthsParse = [
        /^ene/i,
        /^feb/i,
        /^mar/i,
        /^abr/i,
        /^may/i,
        /^jun/i,
        /^jul/i,
        /^ago/i,
        /^sep/i,
        /^oct/i,
        /^nov/i,
        /^dic/i,
    ],
    monthsRegex =
        /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;

export default moment.defineLocale('es-us', {
    months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(
        '_'
    ),
    monthsShort: function (m, format) {
        if (!m) {
            return monthsShortDot;
        } else if (/-MMM-/.test(format)) {
            return monthsShort[m.month()];
        } else {
            return monthsShortDot[m.month()];
        }
    },
    monthsRegex: monthsRegex,
    monthsShortRegex: monthsRegex,
    monthsStrictRegex:
        /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,
    monthsShortStrictRegex:
        /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,
    monthsParse: monthsParse,
    longMonthsParse: monthsParse,
    shortMonthsParse: monthsParse,
    weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
    weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
    weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'h:mm A',
        LTS: 'h:mm:ss A',
        L: 'MM/DD/YYYY',
        LL: 'D [de] MMMM [de] YYYY',
        LLL: 'D [de] MMMM [de] YYYY h:mm A',
        LLLL: 'dddd, D [de] MMMM [de] YYYY h:mm A',
    },
    calendar: {
        sameDay: function () {
            return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        nextDay: function () {
            return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        nextWeek: function () {
            return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        lastDay: function () {
            return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        lastWeek: function () {
            return (
                '[el] dddd [pasado a la' +
                (this.hours() !== 1 ? 's' : '') +
                '] LT'
            );
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'en %s',
        past: 'hace %s',
        s: 'unos segundos',
        ss: '%d segundos',
        m: 'un minuto',
        mm: '%d minutos',
        h: 'una hora',
        hh: '%d horas',
        d: 'un día',
        dd: '%d días',
        w: 'una semana',
        ww: '%d semanas',
        M: 'un mes',
        MM: '%d meses',
        y: 'un año',
        yy: '%d años',
    },
    dayOfMonthOrdinalParse: /\d{1,2}º/,
    ordinal: '%dº',
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Spanish [es]
//! author : Julio Napurí : https://github.com/julionc

import moment from '../moment';

var monthsShortDot =
        'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split(
            '_'
        ),
    monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_'),
    monthsParse = [
        /^ene/i,
        /^feb/i,
        /^mar/i,
        /^abr/i,
        /^may/i,
        /^jun/i,
        /^jul/i,
        /^ago/i,
        /^sep/i,
        /^oct/i,
        /^nov/i,
        /^dic/i,
    ],
    monthsRegex =
        /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;

export default moment.defineLocale('es', {
    months: 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split(
        '_'
    ),
    monthsShort: function (m, format) {
        if (!m) {
            return monthsShortDot;
        } else if (/-MMM-/.test(format)) {
            return monthsShort[m.month()];
        } else {
            return monthsShortDot[m.month()];
        }
    },
    monthsRegex: monthsRegex,
    monthsShortRegex: monthsRegex,
    monthsStrictRegex:
        /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,
    monthsShortStrictRegex:
        /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,
    monthsParse: monthsParse,
    longMonthsParse: monthsParse,
    shortMonthsParse: monthsParse,
    weekdays: 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
    weekdaysShort: 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
    weekdaysMin: 'do_lu_ma_mi_ju_vi_sá'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D [de] MMMM [de] YYYY',
        LLL: 'D [de] MMMM [de] YYYY H:mm',
        LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm',
    },
    calendar: {
        sameDay: function () {
            return '[hoy a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        nextDay: function () {
            return '[mañana a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        nextWeek: function () {
            return 'dddd [a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        lastDay: function () {
            return '[ayer a la' + (this.hours() !== 1 ? 's' : '') + '] LT';
        },
        lastWeek: function () {
            return (
                '[el] dddd [pasado a la' +
                (this.hours() !== 1 ? 's' : '') +
                '] LT'
            );
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'en %s',
        past: 'hace %s',
        s: 'unos segundos',
        ss: '%d segundos',
        m: 'un minuto',
        mm: '%d minutos',
        h: 'una hora',
        hh: '%d horas',
        d: 'un día',
        dd: '%d días',
        w: 'una semana',
        ww: '%d semanas',
        M: 'un mes',
        MM: '%d meses',
        y: 'un año',
        yy: '%d años',
    },
    dayOfMonthOrdinalParse: /\d{1,2}º/,
    ordinal: '%dº',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
    invalidDate: 'Fecha inválida',
});
//! moment.js locale configuration
//! locale : Estonian [et]
//! author : Henry Kehlmann : https://github.com/madhenry
//! improvements : Illimar Tambek : https://github.com/ragulka

import moment from '../moment';

function processRelativeTime(number, withoutSuffix, key, isFuture) {
    var format = {
        s: ['mõne sekundi', 'mõni sekund', 'paar sekundit'],
        ss: [number + 'sekundi', number + 'sekundit'],
        m: ['ühe minuti', 'üks minut'],
        mm: [number + ' minuti', number + ' minutit'],
        h: ['ühe tunni', 'tund aega', 'üks tund'],
        hh: [number + ' tunni', number + ' tundi'],
        d: ['ühe päeva', 'üks päev'],
        M: ['kuu aja', 'kuu aega', 'üks kuu'],
        MM: [number + ' kuu', number + ' kuud'],
        y: ['ühe aasta', 'aasta', 'üks aasta'],
        yy: [number + ' aasta', number + ' aastat'],
    };
    if (withoutSuffix) {
        return format[key][2] ? format[key][2] : format[key][1];
    }
    return isFuture ? format[key][0] : format[key][1];
}

export default moment.defineLocale('et', {
    months: 'jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember'.split(
        '_'
    ),
    monthsShort:
        'jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets'.split('_'),
    weekdays:
        'pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev'.split(
            '_'
        ),
    weekdaysShort: 'P_E_T_K_N_R_L'.split('_'),
    weekdaysMin: 'P_E_T_K_N_R_L'.split('_'),
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY H:mm',
        LLLL: 'dddd, D. MMMM YYYY H:mm',
    },
    calendar: {
        sameDay: '[Täna,] LT',
        nextDay: '[Homme,] LT',
        nextWeek: '[Järgmine] dddd LT',
        lastDay: '[Eile,] LT',
        lastWeek: '[Eelmine] dddd LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s pärast',
        past: '%s tagasi',
        s: processRelativeTime,
        ss: processRelativeTime,
        m: processRelativeTime,
        mm: processRelativeTime,
        h: processRelativeTime,
        hh: processRelativeTime,
        d: processRelativeTime,
        dd: '%d päeva',
        M: processRelativeTime,
        MM: processRelativeTime,
        y: processRelativeTime,
        yy: processRelativeTime,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Basque [eu]
//! author : Eneko Illarramendi : https://github.com/eillarra

import moment from '../moment';

export default moment.defineLocale('eu', {
    months: 'urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua'.split(
        '_'
    ),
    monthsShort:
        'urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays:
        'igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata'.split(
            '_'
        ),
    weekdaysShort: 'ig._al._ar._az._og._ol._lr.'.split('_'),
    weekdaysMin: 'ig_al_ar_az_og_ol_lr'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'YYYY-MM-DD',
        LL: 'YYYY[ko] MMMM[ren] D[a]',
        LLL: 'YYYY[ko] MMMM[ren] D[a] HH:mm',
        LLLL: 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm',
        l: 'YYYY-M-D',
        ll: 'YYYY[ko] MMM D[a]',
        lll: 'YYYY[ko] MMM D[a] HH:mm',
        llll: 'ddd, YYYY[ko] MMM D[a] HH:mm',
    },
    calendar: {
        sameDay: '[gaur] LT[etan]',
        nextDay: '[bihar] LT[etan]',
        nextWeek: 'dddd LT[etan]',
        lastDay: '[atzo] LT[etan]',
        lastWeek: '[aurreko] dddd LT[etan]',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s barru',
        past: 'duela %s',
        s: 'segundo batzuk',
        ss: '%d segundo',
        m: 'minutu bat',
        mm: '%d minutu',
        h: 'ordu bat',
        hh: '%d ordu',
        d: 'egun bat',
        dd: '%d egun',
        M: 'hilabete bat',
        MM: '%d hilabete',
        y: 'urte bat',
        yy: '%d urte',
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Persian [fa]
//! author : Ebrahim Byagowi : https://github.com/ebraminio

import moment from '../moment';

var symbolMap = {
        1: '۱',
        2: '۲',
        3: '۳',
        4: '۴',
        5: '۵',
        6: '۶',
        7: '۷',
        8: '۸',
        9: '۹',
        0: '۰',
    },
    numberMap = {
        '۱': '1',
        '۲': '2',
        '۳': '3',
        '۴': '4',
        '۵': '5',
        '۶': '6',
        '۷': '7',
        '۸': '8',
        '۹': '9',
        '۰': '0',
    };

export default moment.defineLocale('fa', {
    months: 'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split(
        '_'
    ),
    monthsShort:
        'ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split(
            '_'
        ),
    weekdays:
        'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split(
            '_'
        ),
    weekdaysShort:
        'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split(
            '_'
        ),
    weekdaysMin: 'ی_د_س_چ_پ_ج_ش'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    meridiemParse: /قبل از ظهر|بعد از ظهر/,
    isPM: function (input) {
        return /بعد از ظهر/.test(input);
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return 'قبل از ظهر';
        } else {
            return 'بعد از ظهر';
        }
    },
    calendar: {
        sameDay: '[امروز ساعت] LT',
        nextDay: '[فردا ساعت] LT',
        nextWeek: 'dddd [ساعت] LT',
        lastDay: '[دیروز ساعت] LT',
        lastWeek: 'dddd [پیش] [ساعت] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'در %s',
        past: '%s پیش',
        s: 'چند ثانیه',
        ss: '%d ثانیه',
        m: 'یک دقیقه',
        mm: '%d دقیقه',
        h: 'یک ساعت',
        hh: '%d ساعت',
        d: 'یک روز',
        dd: '%d روز',
        M: 'یک ماه',
        MM: '%d ماه',
        y: 'یک سال',
        yy: '%d سال',
    },
    preparse: function (string) {
        return string
            .replace(/[۰-۹]/g, function (match) {
                return numberMap[match];
            })
            .replace(/،/g, ',');
    },
    postformat: function (string) {
        return string
            .replace(/\d/g, function (match) {
                return symbolMap[match];
            })
            .replace(/,/g, '،');
    },
    dayOfMonthOrdinalParse: /\d{1,2}م/,
    ordinal: '%dم',
    week: {
        dow: 6, // Saturday is the first day of the week.
        doy: 12, // The week that contains Jan 12th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Finnish [fi]
//! author : Tarmo Aidantausta : https://github.com/bleadof

import moment from '../moment';

var numbersPast =
        'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(
            ' '
        ),
    numbersFuture = [
        'nolla',
        'yhden',
        'kahden',
        'kolmen',
        'neljän',
        'viiden',
        'kuuden',
        numbersPast[7],
        numbersPast[8],
        numbersPast[9],
    ];
function translate(number, withoutSuffix, key, isFuture) {
    var result = '';
    switch (key) {
        case 's':
            return isFuture ? 'muutaman sekunnin' : 'muutama sekunti';
        case 'ss':
            result = isFuture ? 'sekunnin' : 'sekuntia';
            break;
        case 'm':
            return isFuture ? 'minuutin' : 'minuutti';
        case 'mm':
            result = isFuture ? 'minuutin' : 'minuuttia';
            break;
        case 'h':
            return isFuture ? 'tunnin' : 'tunti';
        case 'hh':
            result = isFuture ? 'tunnin' : 'tuntia';
            break;
        case 'd':
            return isFuture ? 'päivän' : 'päivä';
        case 'dd':
            result = isFuture ? 'päivän' : 'päivää';
            break;
        case 'M':
            return isFuture ? 'kuukauden' : 'kuukausi';
        case 'MM':
            result = isFuture ? 'kuukauden' : 'kuukautta';
            break;
        case 'y':
            return isFuture ? 'vuoden' : 'vuosi';
        case 'yy':
            result = isFuture ? 'vuoden' : 'vuotta';
            break;
    }
    result = verbalNumber(number, isFuture) + ' ' + result;
    return result;
}
function verbalNumber(number, isFuture) {
    return number < 10
        ? isFuture
            ? numbersFuture[number]
            : numbersPast[number]
        : number;
}

export default moment.defineLocale('fi', {
    months: 'tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu'.split(
        '_'
    ),
    monthsShort:
        'tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu'.split(
            '_'
        ),
    weekdays:
        'sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai'.split(
            '_'
        ),
    weekdaysShort: 'su_ma_ti_ke_to_pe_la'.split('_'),
    weekdaysMin: 'su_ma_ti_ke_to_pe_la'.split('_'),
    longDateFormat: {
        LT: 'HH.mm',
        LTS: 'HH.mm.ss',
        L: 'DD.MM.YYYY',
        LL: 'Do MMMM[ta] YYYY',
        LLL: 'Do MMMM[ta] YYYY, [klo] HH.mm',
        LLLL: 'dddd, Do MMMM[ta] YYYY, [klo] HH.mm',
        l: 'D.M.YYYY',
        ll: 'Do MMM YYYY',
        lll: 'Do MMM YYYY, [klo] HH.mm',
        llll: 'ddd, Do MMM YYYY, [klo] HH.mm',
    },
    calendar: {
        sameDay: '[tänään] [klo] LT',
        nextDay: '[huomenna] [klo] LT',
        nextWeek: 'dddd [klo] LT',
        lastDay: '[eilen] [klo] LT',
        lastWeek: '[viime] dddd[na] [klo] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s päästä',
        past: '%s sitten',
        s: translate,
        ss: translate,
        m: translate,
        mm: translate,
        h: translate,
        hh: translate,
        d: translate,
        dd: translate,
        M: translate,
        MM: translate,
        y: translate,
        yy: translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Filipino [fil]
//! author : Dan Hagman : https://github.com/hagmandan
//! author : Matthew Co : https://github.com/matthewdeeco

import moment from '../moment';

export default moment.defineLocale('fil', {
    months: 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split(
        '_'
    ),
    monthsShort: 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),
    weekdays: 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split(
        '_'
    ),
    weekdaysShort: 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'),
    weekdaysMin: 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'MM/D/YYYY',
        LL: 'MMMM D, YYYY',
        LLL: 'MMMM D, YYYY HH:mm',
        LLLL: 'dddd, MMMM DD, YYYY HH:mm',
    },
    calendar: {
        sameDay: 'LT [ngayong araw]',
        nextDay: '[Bukas ng] LT',
        nextWeek: 'LT [sa susunod na] dddd',
        lastDay: 'LT [kahapon]',
        lastWeek: 'LT [noong nakaraang] dddd',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'sa loob ng %s',
        past: '%s ang nakalipas',
        s: 'ilang segundo',
        ss: '%d segundo',
        m: 'isang minuto',
        mm: '%d minuto',
        h: 'isang oras',
        hh: '%d oras',
        d: 'isang araw',
        dd: '%d araw',
        M: 'isang buwan',
        MM: '%d buwan',
        y: 'isang taon',
        yy: '%d taon',
    },
    dayOfMonthOrdinalParse: /\d{1,2}/,
    ordinal: function (number) {
        return number;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Faroese [fo]
//! author : Ragnar Johannesen : https://github.com/ragnar123
//! author : Kristian Sakarisson : https://github.com/sakarisson

import moment from '../moment';

export default moment.defineLocale('fo', {
    months: 'januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember'.split(
        '_'
    ),
    monthsShort: 'jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_'),
    weekdays:
        'sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur'.split(
            '_'
        ),
    weekdaysShort: 'sun_mán_týs_mik_hós_frí_ley'.split('_'),
    weekdaysMin: 'su_má_tý_mi_hó_fr_le'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D. MMMM, YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Í dag kl.] LT',
        nextDay: '[Í morgin kl.] LT',
        nextWeek: 'dddd [kl.] LT',
        lastDay: '[Í gjár kl.] LT',
        lastWeek: '[síðstu] dddd [kl] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'um %s',
        past: '%s síðani',
        s: 'fá sekund',
        ss: '%d sekundir',
        m: 'ein minuttur',
        mm: '%d minuttir',
        h: 'ein tími',
        hh: '%d tímar',
        d: 'ein dagur',
        dd: '%d dagar',
        M: 'ein mánaður',
        MM: '%d mánaðir',
        y: 'eitt ár',
        yy: '%d ár',
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : French (Canada) [fr-ca]
//! author : Jonathan Abourbih : https://github.com/jonbca

import moment from '../moment';

export default moment.defineLocale('fr-ca', {
    months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split(
        '_'
    ),
    monthsShort:
        'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
    weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
    weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'YYYY-MM-DD',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Aujourd’hui à] LT',
        nextDay: '[Demain à] LT',
        nextWeek: 'dddd [à] LT',
        lastDay: '[Hier à] LT',
        lastWeek: 'dddd [dernier à] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'dans %s',
        past: 'il y a %s',
        s: 'quelques secondes',
        ss: '%d secondes',
        m: 'une minute',
        mm: '%d minutes',
        h: 'une heure',
        hh: '%d heures',
        d: 'un jour',
        dd: '%d jours',
        M: 'un mois',
        MM: '%d mois',
        y: 'un an',
        yy: '%d ans',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(er|e)/,
    ordinal: function (number, period) {
        switch (period) {
            // Words with masculine grammatical gender: mois, trimestre, jour
            default:
            case 'M':
            case 'Q':
            case 'D':
            case 'DDD':
            case 'd':
                return number + (number === 1 ? 'er' : 'e');

            // Words with feminine grammatical gender: semaine
            case 'w':
            case 'W':
                return number + (number === 1 ? 're' : 'e');
        }
    },
});
//! moment.js locale configuration
//! locale : French (Switzerland) [fr-ch]
//! author : Gaspard Bucher : https://github.com/gaspard

import moment from '../moment';

export default moment.defineLocale('fr-ch', {
    months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split(
        '_'
    ),
    monthsShort:
        'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
    weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
    weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Aujourd’hui à] LT',
        nextDay: '[Demain à] LT',
        nextWeek: 'dddd [à] LT',
        lastDay: '[Hier à] LT',
        lastWeek: 'dddd [dernier à] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'dans %s',
        past: 'il y a %s',
        s: 'quelques secondes',
        ss: '%d secondes',
        m: 'une minute',
        mm: '%d minutes',
        h: 'une heure',
        hh: '%d heures',
        d: 'un jour',
        dd: '%d jours',
        M: 'un mois',
        MM: '%d mois',
        y: 'un an',
        yy: '%d ans',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(er|e)/,
    ordinal: function (number, period) {
        switch (period) {
            // Words with masculine grammatical gender: mois, trimestre, jour
            default:
            case 'M':
            case 'Q':
            case 'D':
            case 'DDD':
            case 'd':
                return number + (number === 1 ? 'er' : 'e');

            // Words with feminine grammatical gender: semaine
            case 'w':
            case 'W':
                return number + (number === 1 ? 're' : 'e');
        }
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : French [fr]
//! author : John Fischer : https://github.com/jfroffice

import moment from '../moment';

var monthsStrictRegex =
        /^(janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i,
    monthsShortStrictRegex =
        /(janv\.?|févr\.?|mars|avr\.?|mai|juin|juil\.?|août|sept\.?|oct\.?|nov\.?|déc\.?)/i,
    monthsRegex =
        /(janv\.?|févr\.?|mars|avr\.?|mai|juin|juil\.?|août|sept\.?|oct\.?|nov\.?|déc\.?|janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i,
    monthsParse = [
        /^janv/i,
        /^févr/i,
        /^mars/i,
        /^avr/i,
        /^mai/i,
        /^juin/i,
        /^juil/i,
        /^août/i,
        /^sept/i,
        /^oct/i,
        /^nov/i,
        /^déc/i,
    ];

export default moment.defineLocale('fr', {
    months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split(
        '_'
    ),
    monthsShort:
        'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split(
            '_'
        ),
    monthsRegex: monthsRegex,
    monthsShortRegex: monthsRegex,
    monthsStrictRegex: monthsStrictRegex,
    monthsShortStrictRegex: monthsShortStrictRegex,
    monthsParse: monthsParse,
    longMonthsParse: monthsParse,
    shortMonthsParse: monthsParse,
    weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
    weekdaysShort: 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
    weekdaysMin: 'di_lu_ma_me_je_ve_sa'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Aujourd’hui à] LT',
        nextDay: '[Demain à] LT',
        nextWeek: 'dddd [à] LT',
        lastDay: '[Hier à] LT',
        lastWeek: 'dddd [dernier à] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'dans %s',
        past: 'il y a %s',
        s: 'quelques secondes',
        ss: '%d secondes',
        m: 'une minute',
        mm: '%d minutes',
        h: 'une heure',
        hh: '%d heures',
        d: 'un jour',
        dd: '%d jours',
        w: 'une semaine',
        ww: '%d semaines',
        M: 'un mois',
        MM: '%d mois',
        y: 'un an',
        yy: '%d ans',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(er|)/,
    ordinal: function (number, period) {
        switch (period) {
            // TODO: Return 'e' when day of month > 1. Move this case inside
            // block for masculine words below.
            // See https://github.com/moment/moment/issues/3375
            case 'D':
                return number + (number === 1 ? 'er' : '');

            // Words with masculine grammatical gender: mois, trimestre, jour
            default:
            case 'M':
            case 'Q':
            case 'DDD':
            case 'd':
                return number + (number === 1 ? 'er' : 'e');

            // Words with feminine grammatical gender: semaine
            case 'w':
            case 'W':
                return number + (number === 1 ? 're' : 'e');
        }
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Frisian [fy]
//! author : Robin van der Vliet : https://github.com/robin0van0der0v

import moment from '../moment';

var monthsShortWithDots =
        'jan._feb._mrt._apr._mai_jun._jul._aug._sep._okt._nov._des.'.split('_'),
    monthsShortWithoutDots =
        'jan_feb_mrt_apr_mai_jun_jul_aug_sep_okt_nov_des'.split('_');

export default moment.defineLocale('fy', {
    months: 'jannewaris_febrewaris_maart_april_maaie_juny_july_augustus_septimber_oktober_novimber_desimber'.split(
        '_'
    ),
    monthsShort: function (m, format) {
        if (!m) {
            return monthsShortWithDots;
        } else if (/-MMM-/.test(format)) {
            return monthsShortWithoutDots[m.month()];
        } else {
            return monthsShortWithDots[m.month()];
        }
    },
    monthsParseExact: true,
    weekdays: 'snein_moandei_tiisdei_woansdei_tongersdei_freed_sneon'.split(
        '_'
    ),
    weekdaysShort: 'si._mo._ti._wo._to._fr._so.'.split('_'),
    weekdaysMin: 'Si_Mo_Ti_Wo_To_Fr_So'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD-MM-YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[hjoed om] LT',
        nextDay: '[moarn om] LT',
        nextWeek: 'dddd [om] LT',
        lastDay: '[juster om] LT',
        lastWeek: '[ôfrûne] dddd [om] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'oer %s',
        past: '%s lyn',
        s: 'in pear sekonden',
        ss: '%d sekonden',
        m: 'ien minút',
        mm: '%d minuten',
        h: 'ien oere',
        hh: '%d oeren',
        d: 'ien dei',
        dd: '%d dagen',
        M: 'ien moanne',
        MM: '%d moannen',
        y: 'ien jier',
        yy: '%d jierren',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/,
    ordinal: function (number) {
        return (
            number +
            (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')
        );
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Irish or Irish Gaelic [ga]
//! author : André Silva : https://github.com/askpt

import moment from '../moment';

var months = [
        'Eanáir',
        'Feabhra',
        'Márta',
        'Aibreán',
        'Bealtaine',
        'Meitheamh',
        'Iúil',
        'Lúnasa',
        'Meán Fómhair',
        'Deireadh Fómhair',
        'Samhain',
        'Nollaig',
    ],
    monthsShort = [
        'Ean',
        'Feabh',
        'Márt',
        'Aib',
        'Beal',
        'Meith',
        'Iúil',
        'Lún',
        'M.F.',
        'D.F.',
        'Samh',
        'Noll',
    ],
    weekdays = [
        'Dé Domhnaigh',
        'Dé Luain',
        'Dé Máirt',
        'Dé Céadaoin',
        'Déardaoin',
        'Dé hAoine',
        'Dé Sathairn',
    ],
    weekdaysShort = ['Domh', 'Luan', 'Máirt', 'Céad', 'Déar', 'Aoine', 'Sath'],
    weekdaysMin = ['Do', 'Lu', 'Má', 'Cé', 'Dé', 'A', 'Sa'];

export default moment.defineLocale('ga', {
    months: months,
    monthsShort: monthsShort,
    monthsParseExact: true,
    weekdays: weekdays,
    weekdaysShort: weekdaysShort,
    weekdaysMin: weekdaysMin,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Inniu ag] LT',
        nextDay: '[Amárach ag] LT',
        nextWeek: 'dddd [ag] LT',
        lastDay: '[Inné ag] LT',
        lastWeek: 'dddd [seo caite] [ag] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'i %s',
        past: '%s ó shin',
        s: 'cúpla soicind',
        ss: '%d soicind',
        m: 'nóiméad',
        mm: '%d nóiméad',
        h: 'uair an chloig',
        hh: '%d uair an chloig',
        d: 'lá',
        dd: '%d lá',
        M: 'mí',
        MM: '%d míonna',
        y: 'bliain',
        yy: '%d bliain',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(d|na|mh)/,
    ordinal: function (number) {
        var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh';
        return number + output;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Scottish Gaelic [gd]
//! author : Jon Ashdown : https://github.com/jonashdown

import moment from '../moment';

var months = [
        'Am Faoilleach',
        'An Gearran',
        'Am Màrt',
        'An Giblean',
        'An Cèitean',
        'An t-Ògmhios',
        'An t-Iuchar',
        'An Lùnastal',
        'An t-Sultain',
        'An Dàmhair',
        'An t-Samhain',
        'An Dùbhlachd',
    ],
    monthsShort = [
        'Faoi',
        'Gear',
        'Màrt',
        'Gibl',
        'Cèit',
        'Ògmh',
        'Iuch',
        'Lùn',
        'Sult',
        'Dàmh',
        'Samh',
        'Dùbh',
    ],
    weekdays = [
        'Didòmhnaich',
        'Diluain',
        'Dimàirt',
        'Diciadain',
        'Diardaoin',
        'Dihaoine',
        'Disathairne',
    ],
    weekdaysShort = ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis'],
    weekdaysMin = ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa'];

export default moment.defineLocale('gd', {
    months: months,
    monthsShort: monthsShort,
    monthsParseExact: true,
    weekdays: weekdays,
    weekdaysShort: weekdaysShort,
    weekdaysMin: weekdaysMin,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[An-diugh aig] LT',
        nextDay: '[A-màireach aig] LT',
        nextWeek: 'dddd [aig] LT',
        lastDay: '[An-dè aig] LT',
        lastWeek: 'dddd [seo chaidh] [aig] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'ann an %s',
        past: 'bho chionn %s',
        s: 'beagan diogan',
        ss: '%d diogan',
        m: 'mionaid',
        mm: '%d mionaidean',
        h: 'uair',
        hh: '%d uairean',
        d: 'latha',
        dd: '%d latha',
        M: 'mìos',
        MM: '%d mìosan',
        y: 'bliadhna',
        yy: '%d bliadhna',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(d|na|mh)/,
    ordinal: function (number) {
        var output = number === 1 ? 'd' : number % 10 === 2 ? 'na' : 'mh';
        return number + output;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Galician [gl]
//! author : Juan G. Hurtado : https://github.com/juanghurtado

import moment from '../moment';

export default moment.defineLocale('gl', {
    months: 'xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro'.split(
        '_'
    ),
    monthsShort:
        'xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'domingo_luns_martes_mércores_xoves_venres_sábado'.split('_'),
    weekdaysShort: 'dom._lun._mar._mér._xov._ven._sáb.'.split('_'),
    weekdaysMin: 'do_lu_ma_mé_xo_ve_sá'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D [de] MMMM [de] YYYY',
        LLL: 'D [de] MMMM [de] YYYY H:mm',
        LLLL: 'dddd, D [de] MMMM [de] YYYY H:mm',
    },
    calendar: {
        sameDay: function () {
            return '[hoxe ' + (this.hours() !== 1 ? 'ás' : 'á') + '] LT';
        },
        nextDay: function () {
            return '[mañá ' + (this.hours() !== 1 ? 'ás' : 'á') + '] LT';
        },
        nextWeek: function () {
            return 'dddd [' + (this.hours() !== 1 ? 'ás' : 'a') + '] LT';
        },
        lastDay: function () {
            return '[onte ' + (this.hours() !== 1 ? 'á' : 'a') + '] LT';
        },
        lastWeek: function () {
            return (
                '[o] dddd [pasado ' + (this.hours() !== 1 ? 'ás' : 'a') + '] LT'
            );
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: function (str) {
            if (str.indexOf('un') === 0) {
                return 'n' + str;
            }
            return 'en ' + str;
        },
        past: 'hai %s',
        s: 'uns segundos',
        ss: '%d segundos',
        m: 'un minuto',
        mm: '%d minutos',
        h: 'unha hora',
        hh: '%d horas',
        d: 'un día',
        dd: '%d días',
        M: 'un mes',
        MM: '%d meses',
        y: 'un ano',
        yy: '%d anos',
    },
    dayOfMonthOrdinalParse: /\d{1,2}º/,
    ordinal: '%dº',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Konkani Devanagari script [gom-deva]
//! author : The Discoverer : https://github.com/WikiDiscoverer

import moment from '../moment';

function processRelativeTime(number, withoutSuffix, key, isFuture) {
    var format = {
        s: ['थोडया सॅकंडांनी', 'थोडे सॅकंड'],
        ss: [number + ' सॅकंडांनी', number + ' सॅकंड'],
        m: ['एका मिणटान', 'एक मिनूट'],
        mm: [number + ' मिणटांनी', number + ' मिणटां'],
        h: ['एका वरान', 'एक वर'],
        hh: [number + ' वरांनी', number + ' वरां'],
        d: ['एका दिसान', 'एक दीस'],
        dd: [number + ' दिसांनी', number + ' दीस'],
        M: ['एका म्हयन्यान', 'एक म्हयनो'],
        MM: [number + ' म्हयन्यानी', number + ' म्हयने'],
        y: ['एका वर्सान', 'एक वर्स'],
        yy: [number + ' वर्सांनी', number + ' वर्सां'],
    };
    return isFuture ? format[key][0] : format[key][1];
}

export default moment.defineLocale('gom-deva', {
    months: {
        standalone:
            'जानेवारी_फेब्रुवारी_मार्च_एप्रील_मे_जून_जुलय_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split(
                '_'
            ),
        format: 'जानेवारीच्या_फेब्रुवारीच्या_मार्चाच्या_एप्रीलाच्या_मेयाच्या_जूनाच्या_जुलयाच्या_ऑगस्टाच्या_सप्टेंबराच्या_ऑक्टोबराच्या_नोव्हेंबराच्या_डिसेंबराच्या'.split(
            '_'
        ),
        isFormat: /MMMM(\s)+D[oD]?/,
    },
    monthsShort:
        'जाने._फेब्रु._मार्च_एप्री._मे_जून_जुल._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'आयतार_सोमार_मंगळार_बुधवार_बिरेस्तार_सुक्रार_शेनवार'.split('_'),
    weekdaysShort: 'आयत._सोम._मंगळ._बुध._ब्रेस्त._सुक्र._शेन.'.split('_'),
    weekdaysMin: 'आ_सो_मं_बु_ब्रे_सु_शे'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'A h:mm [वाजतां]',
        LTS: 'A h:mm:ss [वाजतां]',
        L: 'DD-MM-YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY A h:mm [वाजतां]',
        LLLL: 'dddd, MMMM Do, YYYY, A h:mm [वाजतां]',
        llll: 'ddd, D MMM YYYY, A h:mm [वाजतां]',
    },
    calendar: {
        sameDay: '[आयज] LT',
        nextDay: '[फाल्यां] LT',
        nextWeek: '[फुडलो] dddd[,] LT',
        lastDay: '[काल] LT',
        lastWeek: '[फाटलो] dddd[,] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s',
        past: '%s आदीं',
        s: processRelativeTime,
        ss: processRelativeTime,
        m: processRelativeTime,
        mm: processRelativeTime,
        h: processRelativeTime,
        hh: processRelativeTime,
        d: processRelativeTime,
        dd: processRelativeTime,
        M: processRelativeTime,
        MM: processRelativeTime,
        y: processRelativeTime,
        yy: processRelativeTime,
    },
    dayOfMonthOrdinalParse: /\d{1,2}(वेर)/,
    ordinal: function (number, period) {
        switch (period) {
            // the ordinal 'वेर' only applies to day of the month
            case 'D':
                return number + 'वेर';
            default:
            case 'M':
            case 'Q':
            case 'DDD':
            case 'd':
            case 'w':
            case 'W':
                return number;
        }
    },
    week: {
        dow: 0, // Sunday is the first day of the week
        doy: 3, // The week that contains Jan 4th is the first week of the year (7 + 0 - 4)
    },
    meridiemParse: /राती|सकाळीं|दनपारां|सांजे/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'राती') {
            return hour < 4 ? hour : hour + 12;
        } else if (meridiem === 'सकाळीं') {
            return hour;
        } else if (meridiem === 'दनपारां') {
            return hour > 12 ? hour : hour + 12;
        } else if (meridiem === 'सांजे') {
            return hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'राती';
        } else if (hour < 12) {
            return 'सकाळीं';
        } else if (hour < 16) {
            return 'दनपारां';
        } else if (hour < 20) {
            return 'सांजे';
        } else {
            return 'राती';
        }
    },
});
//! moment.js locale configuration
//! locale : Konkani Latin script [gom-latn]
//! author : The Discoverer : https://github.com/WikiDiscoverer

import moment from '../moment';

function processRelativeTime(number, withoutSuffix, key, isFuture) {
    var format = {
        s: ['thoddea sekondamni', 'thodde sekond'],
        ss: [number + ' sekondamni', number + ' sekond'],
        m: ['eka mintan', 'ek minut'],
        mm: [number + ' mintamni', number + ' mintam'],
        h: ['eka voran', 'ek vor'],
        hh: [number + ' voramni', number + ' voram'],
        d: ['eka disan', 'ek dis'],
        dd: [number + ' disamni', number + ' dis'],
        M: ['eka mhoinean', 'ek mhoino'],
        MM: [number + ' mhoineamni', number + ' mhoine'],
        y: ['eka vorsan', 'ek voros'],
        yy: [number + ' vorsamni', number + ' vorsam'],
    };
    return isFuture ? format[key][0] : format[key][1];
}

export default moment.defineLocale('gom-latn', {
    months: {
        standalone:
            'Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr'.split(
                '_'
            ),
        format: 'Janerachea_Febrerachea_Marsachea_Abrilachea_Maiachea_Junachea_Julaiachea_Agostachea_Setembrachea_Otubrachea_Novembrachea_Dezembrachea'.split(
            '_'
        ),
        isFormat: /MMMM(\s)+D[oD]?/,
    },
    monthsShort:
        'Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.'.split('_'),
    monthsParseExact: true,
    weekdays: "Aitar_Somar_Mongllar_Budhvar_Birestar_Sukrar_Son'var".split('_'),
    weekdaysShort: 'Ait._Som._Mon._Bud._Bre._Suk._Son.'.split('_'),
    weekdaysMin: 'Ai_Sm_Mo_Bu_Br_Su_Sn'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'A h:mm [vazta]',
        LTS: 'A h:mm:ss [vazta]',
        L: 'DD-MM-YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY A h:mm [vazta]',
        LLLL: 'dddd, MMMM Do, YYYY, A h:mm [vazta]',
        llll: 'ddd, D MMM YYYY, A h:mm [vazta]',
    },
    calendar: {
        sameDay: '[Aiz] LT',
        nextDay: '[Faleam] LT',
        nextWeek: '[Fuddlo] dddd[,] LT',
        lastDay: '[Kal] LT',
        lastWeek: '[Fattlo] dddd[,] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s',
        past: '%s adim',
        s: processRelativeTime,
        ss: processRelativeTime,
        m: processRelativeTime,
        mm: processRelativeTime,
        h: processRelativeTime,
        hh: processRelativeTime,
        d: processRelativeTime,
        dd: processRelativeTime,
        M: processRelativeTime,
        MM: processRelativeTime,
        y: processRelativeTime,
        yy: processRelativeTime,
    },
    dayOfMonthOrdinalParse: /\d{1,2}(er)/,
    ordinal: function (number, period) {
        switch (period) {
            // the ordinal 'er' only applies to day of the month
            case 'D':
                return number + 'er';
            default:
            case 'M':
            case 'Q':
            case 'DDD':
            case 'd':
            case 'w':
            case 'W':
                return number;
        }
    },
    week: {
        dow: 0, // Sunday is the first day of the week
        doy: 3, // The week that contains Jan 4th is the first week of the year (7 + 0 - 4)
    },
    meridiemParse: /rati|sokallim|donparam|sanje/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'rati') {
            return hour < 4 ? hour : hour + 12;
        } else if (meridiem === 'sokallim') {
            return hour;
        } else if (meridiem === 'donparam') {
            return hour > 12 ? hour : hour + 12;
        } else if (meridiem === 'sanje') {
            return hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'rati';
        } else if (hour < 12) {
            return 'sokallim';
        } else if (hour < 16) {
            return 'donparam';
        } else if (hour < 20) {
            return 'sanje';
        } else {
            return 'rati';
        }
    },
});
//! moment.js locale configuration
//! locale : Gujarati [gu]
//! author : Kaushik Thanki : https://github.com/Kaushik1987

import moment from '../moment';

var symbolMap = {
        1: '૧',
        2: '૨',
        3: '૩',
        4: '૪',
        5: '૫',
        6: '૬',
        7: '૭',
        8: '૮',
        9: '૯',
        0: '૦',
    },
    numberMap = {
        '૧': '1',
        '૨': '2',
        '૩': '3',
        '૪': '4',
        '૫': '5',
        '૬': '6',
        '૭': '7',
        '૮': '8',
        '૯': '9',
        '૦': '0',
    };

export default moment.defineLocale('gu', {
    months: 'જાન્યુઆરી_ફેબ્રુઆરી_માર્ચ_એપ્રિલ_મે_જૂન_જુલાઈ_ઑગસ્ટ_સપ્ટેમ્બર_ઑક્ટ્બર_નવેમ્બર_ડિસેમ્બર'.split(
        '_'
    ),
    monthsShort:
        'જાન્યુ._ફેબ્રુ._માર્ચ_એપ્રિ._મે_જૂન_જુલા._ઑગ._સપ્ટે._ઑક્ટ્._નવે._ડિસે.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'રવિવાર_સોમવાર_મંગળવાર_બુધ્વાર_ગુરુવાર_શુક્રવાર_શનિવાર'.split(
        '_'
    ),
    weekdaysShort: 'રવિ_સોમ_મંગળ_બુધ્_ગુરુ_શુક્ર_શનિ'.split('_'),
    weekdaysMin: 'ર_સો_મં_બુ_ગુ_શુ_શ'.split('_'),
    longDateFormat: {
        LT: 'A h:mm વાગ્યે',
        LTS: 'A h:mm:ss વાગ્યે',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY, A h:mm વાગ્યે',
        LLLL: 'dddd, D MMMM YYYY, A h:mm વાગ્યે',
    },
    calendar: {
        sameDay: '[આજ] LT',
        nextDay: '[કાલે] LT',
        nextWeek: 'dddd, LT',
        lastDay: '[ગઇકાલે] LT',
        lastWeek: '[પાછલા] dddd, LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s મા',
        past: '%s પહેલા',
        s: 'અમુક પળો',
        ss: '%d સેકંડ',
        m: 'એક મિનિટ',
        mm: '%d મિનિટ',
        h: 'એક કલાક',
        hh: '%d કલાક',
        d: 'એક દિવસ',
        dd: '%d દિવસ',
        M: 'એક મહિનો',
        MM: '%d મહિનો',
        y: 'એક વર્ષ',
        yy: '%d વર્ષ',
    },
    preparse: function (string) {
        return string.replace(/[૧૨૩૪૫૬૭૮૯૦]/g, function (match) {
            return numberMap[match];
        });
    },
    postformat: function (string) {
        return string.replace(/\d/g, function (match) {
            return symbolMap[match];
        });
    },
    // Gujarati notation for meridiems are quite fuzzy in practice. While there exists
    // a rigid notion of a 'Pahar' it is not used as rigidly in modern Gujarati.
    meridiemParse: /રાત|બપોર|સવાર|સાંજ/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'રાત') {
            return hour < 4 ? hour : hour + 12;
        } else if (meridiem === 'સવાર') {
            return hour;
        } else if (meridiem === 'બપોર') {
            return hour >= 10 ? hour : hour + 12;
        } else if (meridiem === 'સાંજ') {
            return hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'રાત';
        } else if (hour < 10) {
            return 'સવાર';
        } else if (hour < 17) {
            return 'બપોર';
        } else if (hour < 20) {
            return 'સાંજ';
        } else {
            return 'રાત';
        }
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Hebrew [he]
//! author : Tomer Cohen : https://github.com/tomer
//! author : Moshe Simantov : https://github.com/DevelopmentIL
//! author : Tal Ater : https://github.com/TalAter

import moment from '../moment';

export default moment.defineLocale('he', {
    months: 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split(
        '_'
    ),
    monthsShort:
        'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳'.split('_'),
    weekdays: 'ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת'.split('_'),
    weekdaysShort: 'א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳'.split('_'),
    weekdaysMin: 'א_ב_ג_ד_ה_ו_ש'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D [ב]MMMM YYYY',
        LLL: 'D [ב]MMMM YYYY HH:mm',
        LLLL: 'dddd, D [ב]MMMM YYYY HH:mm',
        l: 'D/M/YYYY',
        ll: 'D MMM YYYY',
        lll: 'D MMM YYYY HH:mm',
        llll: 'ddd, D MMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[היום ב־]LT',
        nextDay: '[מחר ב־]LT',
        nextWeek: 'dddd [בשעה] LT',
        lastDay: '[אתמול ב־]LT',
        lastWeek: '[ביום] dddd [האחרון בשעה] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'בעוד %s',
        past: 'לפני %s',
        s: 'מספר שניות',
        ss: '%d שניות',
        m: 'דקה',
        mm: '%d דקות',
        h: 'שעה',
        hh: function (number) {
            if (number === 2) {
                return 'שעתיים';
            }
            return number + ' שעות';
        },
        d: 'יום',
        dd: function (number) {
            if (number === 2) {
                return 'יומיים';
            }
            return number + ' ימים';
        },
        M: 'חודש',
        MM: function (number) {
            if (number === 2) {
                return 'חודשיים';
            }
            return number + ' חודשים';
        },
        y: 'שנה',
        yy: function (number) {
            if (number === 2) {
                return 'שנתיים';
            } else if (number % 10 === 0 && number !== 10) {
                return number + ' שנה';
            }
            return number + ' שנים';
        },
    },
    meridiemParse:
        /אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,
    isPM: function (input) {
        return /^(אחה"צ|אחרי הצהריים|בערב)$/.test(input);
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 5) {
            return 'לפנות בוקר';
        } else if (hour < 10) {
            return 'בבוקר';
        } else if (hour < 12) {
            return isLower ? 'לפנה"צ' : 'לפני הצהריים';
        } else if (hour < 18) {
            return isLower ? 'אחה"צ' : 'אחרי הצהריים';
        } else {
            return 'בערב';
        }
    },
});
//! moment.js locale configuration
//! locale : Hindi [hi]
//! author : Mayank Singhal : https://github.com/mayanksinghal

import moment from '../moment';

var symbolMap = {
        1: '१',
        2: '२',
        3: '३',
        4: '४',
        5: '५',
        6: '६',
        7: '७',
        8: '८',
        9: '९',
        0: '०',
    },
    numberMap = {
        '१': '1',
        '२': '2',
        '३': '3',
        '४': '4',
        '५': '5',
        '६': '6',
        '७': '7',
        '८': '8',
        '९': '9',
        '०': '0',
    },
    monthsParse = [
        /^जन/i,
        /^फ़र|फर/i,
        /^मार्च/i,
        /^अप्रै/i,
        /^मई/i,
        /^जून/i,
        /^जुल/i,
        /^अग/i,
        /^सितं|सित/i,
        /^अक्टू/i,
        /^नव|नवं/i,
        /^दिसं|दिस/i,
    ],
    shortMonthsParse = [
        /^जन/i,
        /^फ़र/i,
        /^मार्च/i,
        /^अप्रै/i,
        /^मई/i,
        /^जून/i,
        /^जुल/i,
        /^अग/i,
        /^सित/i,
        /^अक्टू/i,
        /^नव/i,
        /^दिस/i,
    ];

export default moment.defineLocale('hi', {
    months: {
        format: 'जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर'.split(
            '_'
        ),
        standalone:
            'जनवरी_फरवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितंबर_अक्टूबर_नवंबर_दिसंबर'.split(
                '_'
            ),
    },
    monthsShort:
        'जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.'.split('_'),
    weekdays: 'रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
    weekdaysShort: 'रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि'.split('_'),
    weekdaysMin: 'र_सो_मं_बु_गु_शु_श'.split('_'),
    longDateFormat: {
        LT: 'A h:mm बजे',
        LTS: 'A h:mm:ss बजे',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY, A h:mm बजे',
        LLLL: 'dddd, D MMMM YYYY, A h:mm बजे',
    },

    monthsParse: monthsParse,
    longMonthsParse: monthsParse,
    shortMonthsParse: shortMonthsParse,

    monthsRegex:
        /^(जनवरी|जन\.?|फ़रवरी|फरवरी|फ़र\.?|मार्च?|अप्रैल|अप्रै\.?|मई?|जून?|जुलाई|जुल\.?|अगस्त|अग\.?|सितम्बर|सितंबर|सित\.?|अक्टूबर|अक्टू\.?|नवम्बर|नवंबर|नव\.?|दिसम्बर|दिसंबर|दिस\.?)/i,

    monthsShortRegex:
        /^(जनवरी|जन\.?|फ़रवरी|फरवरी|फ़र\.?|मार्च?|अप्रैल|अप्रै\.?|मई?|जून?|जुलाई|जुल\.?|अगस्त|अग\.?|सितम्बर|सितंबर|सित\.?|अक्टूबर|अक्टू\.?|नवम्बर|नवंबर|नव\.?|दिसम्बर|दिसंबर|दिस\.?)/i,

    monthsStrictRegex:
        /^(जनवरी?|फ़रवरी|फरवरी?|मार्च?|अप्रैल?|मई?|जून?|जुलाई?|अगस्त?|सितम्बर|सितंबर|सित?\.?|अक्टूबर|अक्टू\.?|नवम्बर|नवंबर?|दिसम्बर|दिसंबर?)/i,

    monthsShortStrictRegex:
        /^(जन\.?|फ़र\.?|मार्च?|अप्रै\.?|मई?|जून?|जुल\.?|अग\.?|सित\.?|अक्टू\.?|नव\.?|दिस\.?)/i,

    calendar: {
        sameDay: '[आज] LT',
        nextDay: '[कल] LT',
        nextWeek: 'dddd, LT',
        lastDay: '[कल] LT',
        lastWeek: '[पिछले] dddd, LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s में',
        past: '%s पहले',
        s: 'कुछ ही क्षण',
        ss: '%d सेकंड',
        m: 'एक मिनट',
        mm: '%d मिनट',
        h: 'एक घंटा',
        hh: '%d घंटे',
        d: 'एक दिन',
        dd: '%d दिन',
        M: 'एक महीने',
        MM: '%d महीने',
        y: 'एक वर्ष',
        yy: '%d वर्ष',
    },
    preparse: function (string) {
        return string.replace(/[१२३४५६७८९०]/g, function (match) {
            return numberMap[match];
        });
    },
    postformat: function (string) {
        return string.replace(/\d/g, function (match) {
            return symbolMap[match];
        });
    },
    // Hindi notation for meridiems are quite fuzzy in practice. While there exists
    // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.
    meridiemParse: /रात|सुबह|दोपहर|शाम/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'रात') {
            return hour < 4 ? hour : hour + 12;
        } else if (meridiem === 'सुबह') {
            return hour;
        } else if (meridiem === 'दोपहर') {
            return hour >= 10 ? hour : hour + 12;
        } else if (meridiem === 'शाम') {
            return hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'रात';
        } else if (hour < 10) {
            return 'सुबह';
        } else if (hour < 17) {
            return 'दोपहर';
        } else if (hour < 20) {
            return 'शाम';
        } else {
            return 'रात';
        }
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Croatian [hr]
//! author : Bojan Marković : https://github.com/bmarkovic

import moment from '../moment';

function translate(number, withoutSuffix, key) {
    var result = number + ' ';
    switch (key) {
        case 'ss':
            if (number === 1) {
                result += 'sekunda';
            } else if (number === 2 || number === 3 || number === 4) {
                result += 'sekunde';
            } else {
                result += 'sekundi';
            }
            return result;
        case 'm':
            return withoutSuffix ? 'jedna minuta' : 'jedne minute';
        case 'mm':
            if (number === 1) {
                result += 'minuta';
            } else if (number === 2 || number === 3 || number === 4) {
                result += 'minute';
            } else {
                result += 'minuta';
            }
            return result;
        case 'h':
            return withoutSuffix ? 'jedan sat' : 'jednog sata';
        case 'hh':
            if (number === 1) {
                result += 'sat';
            } else if (number === 2 || number === 3 || number === 4) {
                result += 'sata';
            } else {
                result += 'sati';
            }
            return result;
        case 'dd':
            if (number === 1) {
                result += 'dan';
            } else {
                result += 'dana';
            }
            return result;
        case 'MM':
            if (number === 1) {
                result += 'mjesec';
            } else if (number === 2 || number === 3 || number === 4) {
                result += 'mjeseca';
            } else {
                result += 'mjeseci';
            }
            return result;
        case 'yy':
            if (number === 1) {
                result += 'godina';
            } else if (number === 2 || number === 3 || number === 4) {
                result += 'godine';
            } else {
                result += 'godina';
            }
            return result;
    }
}

export default moment.defineLocale('hr', {
    months: {
        format: 'siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca'.split(
            '_'
        ),
        standalone:
            'siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac'.split(
                '_'
            ),
    },
    monthsShort:
        'sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split(
        '_'
    ),
    weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
    weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'Do MMMM YYYY',
        LLL: 'Do MMMM YYYY H:mm',
        LLLL: 'dddd, Do MMMM YYYY H:mm',
    },
    calendar: {
        sameDay: '[danas u] LT',
        nextDay: '[sutra u] LT',
        nextWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[u] [nedjelju] [u] LT';
                case 3:
                    return '[u] [srijedu] [u] LT';
                case 6:
                    return '[u] [subotu] [u] LT';
                case 1:
                case 2:
                case 4:
                case 5:
                    return '[u] dddd [u] LT';
            }
        },
        lastDay: '[jučer u] LT',
        lastWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[prošlu] [nedjelju] [u] LT';
                case 3:
                    return '[prošlu] [srijedu] [u] LT';
                case 6:
                    return '[prošle] [subote] [u] LT';
                case 1:
                case 2:
                case 4:
                case 5:
                    return '[prošli] dddd [u] LT';
            }
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'za %s',
        past: 'prije %s',
        s: 'par sekundi',
        ss: translate,
        m: translate,
        mm: translate,
        h: translate,
        hh: translate,
        d: 'dan',
        dd: translate,
        M: 'mjesec',
        MM: translate,
        y: 'godinu',
        yy: translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Hungarian [hu]
//! author : Adam Brunner : https://github.com/adambrunner
//! author : Peter Viszt  : https://github.com/passatgt

import moment from '../moment';

var weekEndings =
    'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');
function translate(number, withoutSuffix, key, isFuture) {
    var num = number;
    switch (key) {
        case 's':
            return isFuture || withoutSuffix
                ? 'néhány másodperc'
                : 'néhány másodperce';
        case 'ss':
            return num + (isFuture || withoutSuffix)
                ? ' másodperc'
                : ' másodperce';
        case 'm':
            return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce');
        case 'mm':
            return num + (isFuture || withoutSuffix ? ' perc' : ' perce');
        case 'h':
            return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája');
        case 'hh':
            return num + (isFuture || withoutSuffix ? ' óra' : ' órája');
        case 'd':
            return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja');
        case 'dd':
            return num + (isFuture || withoutSuffix ? ' nap' : ' napja');
        case 'M':
            return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
        case 'MM':
            return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
        case 'y':
            return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve');
        case 'yy':
            return num + (isFuture || withoutSuffix ? ' év' : ' éve');
    }
    return '';
}
function week(isFuture) {
    return (
        (isFuture ? '' : '[múlt] ') +
        '[' +
        weekEndings[this.day()] +
        '] LT[-kor]'
    );
}

export default moment.defineLocale('hu', {
    months: 'január_február_március_április_május_június_július_augusztus_szeptember_október_november_december'.split(
        '_'
    ),
    monthsShort:
        'jan._feb._márc._ápr._máj._jún._júl._aug._szept._okt._nov._dec.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat'.split('_'),
    weekdaysShort: 'vas_hét_kedd_sze_csüt_pén_szo'.split('_'),
    weekdaysMin: 'v_h_k_sze_cs_p_szo'.split('_'),
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'YYYY.MM.DD.',
        LL: 'YYYY. MMMM D.',
        LLL: 'YYYY. MMMM D. H:mm',
        LLLL: 'YYYY. MMMM D., dddd H:mm',
    },
    meridiemParse: /de|du/i,
    isPM: function (input) {
        return input.charAt(1).toLowerCase() === 'u';
    },
    meridiem: function (hours, minutes, isLower) {
        if (hours < 12) {
            return isLower === true ? 'de' : 'DE';
        } else {
            return isLower === true ? 'du' : 'DU';
        }
    },
    calendar: {
        sameDay: '[ma] LT[-kor]',
        nextDay: '[holnap] LT[-kor]',
        nextWeek: function () {
            return week.call(this, true);
        },
        lastDay: '[tegnap] LT[-kor]',
        lastWeek: function () {
            return week.call(this, false);
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s múlva',
        past: '%s',
        s: translate,
        ss: translate,
        m: translate,
        mm: translate,
        h: translate,
        hh: translate,
        d: translate,
        dd: translate,
        M: translate,
        MM: translate,
        y: translate,
        yy: translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Armenian [hy-am]
//! author : Armendarabyan : https://github.com/armendarabyan

import moment from '../moment';

export default moment.defineLocale('hy-am', {
    months: {
        format: 'հունվարի_փետրվարի_մարտի_ապրիլի_մայիսի_հունիսի_հուլիսի_օգոստոսի_սեպտեմբերի_հոկտեմբերի_նոյեմբերի_դեկտեմբերի'.split(
            '_'
        ),
        standalone:
            'հունվար_փետրվար_մարտ_ապրիլ_մայիս_հունիս_հուլիս_օգոստոս_սեպտեմբեր_հոկտեմբեր_նոյեմբեր_դեկտեմբեր'.split(
                '_'
            ),
    },
    monthsShort: 'հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ'.split('_'),
    weekdays:
        'կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի_ուրբաթ_շաբաթ'.split(
            '_'
        ),
    weekdaysShort: 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
    weekdaysMin: 'կրկ_երկ_երք_չրք_հնգ_ուրբ_շբթ'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY թ.',
        LLL: 'D MMMM YYYY թ., HH:mm',
        LLLL: 'dddd, D MMMM YYYY թ., HH:mm',
    },
    calendar: {
        sameDay: '[այսօր] LT',
        nextDay: '[վաղը] LT',
        lastDay: '[երեկ] LT',
        nextWeek: function () {
            return 'dddd [օրը ժամը] LT';
        },
        lastWeek: function () {
            return '[անցած] dddd [օրը ժամը] LT';
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s հետո',
        past: '%s առաջ',
        s: 'մի քանի վայրկյան',
        ss: '%d վայրկյան',
        m: 'րոպե',
        mm: '%d րոպե',
        h: 'ժամ',
        hh: '%d ժամ',
        d: 'օր',
        dd: '%d օր',
        M: 'ամիս',
        MM: '%d ամիս',
        y: 'տարի',
        yy: '%d տարի',
    },
    meridiemParse: /գիշերվա|առավոտվա|ցերեկվա|երեկոյան/,
    isPM: function (input) {
        return /^(ցերեկվա|երեկոյան)$/.test(input);
    },
    meridiem: function (hour) {
        if (hour < 4) {
            return 'գիշերվա';
        } else if (hour < 12) {
            return 'առավոտվա';
        } else if (hour < 17) {
            return 'ցերեկվա';
        } else {
            return 'երեկոյան';
        }
    },
    dayOfMonthOrdinalParse: /\d{1,2}|\d{1,2}-(ին|րդ)/,
    ordinal: function (number, period) {
        switch (period) {
            case 'DDD':
            case 'w':
            case 'W':
            case 'DDDo':
                if (number === 1) {
                    return number + '-ին';
                }
                return number + '-րդ';
            default:
                return number;
        }
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Indonesian [id]
//! author : Mohammad Satrio Utomo : https://github.com/tyok
//! reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan

import moment from '../moment';

export default moment.defineLocale('id', {
    months: 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des'.split('_'),
    weekdays: 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'),
    weekdaysShort: 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'),
    weekdaysMin: 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'),
    longDateFormat: {
        LT: 'HH.mm',
        LTS: 'HH.mm.ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY [pukul] HH.mm',
        LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',
    },
    meridiemParse: /pagi|siang|sore|malam/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'pagi') {
            return hour;
        } else if (meridiem === 'siang') {
            return hour >= 11 ? hour : hour + 12;
        } else if (meridiem === 'sore' || meridiem === 'malam') {
            return hour + 12;
        }
    },
    meridiem: function (hours, minutes, isLower) {
        if (hours < 11) {
            return 'pagi';
        } else if (hours < 15) {
            return 'siang';
        } else if (hours < 19) {
            return 'sore';
        } else {
            return 'malam';
        }
    },
    calendar: {
        sameDay: '[Hari ini pukul] LT',
        nextDay: '[Besok pukul] LT',
        nextWeek: 'dddd [pukul] LT',
        lastDay: '[Kemarin pukul] LT',
        lastWeek: 'dddd [lalu pukul] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'dalam %s',
        past: '%s yang lalu',
        s: 'beberapa detik',
        ss: '%d detik',
        m: 'semenit',
        mm: '%d menit',
        h: 'sejam',
        hh: '%d jam',
        d: 'sehari',
        dd: '%d hari',
        M: 'sebulan',
        MM: '%d bulan',
        y: 'setahun',
        yy: '%d tahun',
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Icelandic [is]
//! author : Hinrik Örn Sigurðsson : https://github.com/hinrik

import moment from '../moment';

function plural(n) {
    if (n % 100 === 11) {
        return true;
    } else if (n % 10 === 1) {
        return false;
    }
    return true;
}
function translate(number, withoutSuffix, key, isFuture) {
    var result = number + ' ';
    switch (key) {
        case 's':
            return withoutSuffix || isFuture
                ? 'nokkrar sekúndur'
                : 'nokkrum sekúndum';
        case 'ss':
            if (plural(number)) {
                return (
                    result +
                    (withoutSuffix || isFuture ? 'sekúndur' : 'sekúndum')
                );
            }
            return result + 'sekúnda';
        case 'm':
            return withoutSuffix ? 'mínúta' : 'mínútu';
        case 'mm':
            if (plural(number)) {
                return (
                    result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum')
                );
            } else if (withoutSuffix) {
                return result + 'mínúta';
            }
            return result + 'mínútu';
        case 'hh':
            if (plural(number)) {
                return (
                    result +
                    (withoutSuffix || isFuture
                        ? 'klukkustundir'
                        : 'klukkustundum')
                );
            }
            return result + 'klukkustund';
        case 'd':
            if (withoutSuffix) {
                return 'dagur';
            }
            return isFuture ? 'dag' : 'degi';
        case 'dd':
            if (plural(number)) {
                if (withoutSuffix) {
                    return result + 'dagar';
                }
                return result + (isFuture ? 'daga' : 'dögum');
            } else if (withoutSuffix) {
                return result + 'dagur';
            }
            return result + (isFuture ? 'dag' : 'degi');
        case 'M':
            if (withoutSuffix) {
                return 'mánuður';
            }
            return isFuture ? 'mánuð' : 'mánuði';
        case 'MM':
            if (plural(number)) {
                if (withoutSuffix) {
                    return result + 'mánuðir';
                }
                return result + (isFuture ? 'mánuði' : 'mánuðum');
            } else if (withoutSuffix) {
                return result + 'mánuður';
            }
            return result + (isFuture ? 'mánuð' : 'mánuði');
        case 'y':
            return withoutSuffix || isFuture ? 'ár' : 'ári';
        case 'yy':
            if (plural(number)) {
                return result + (withoutSuffix || isFuture ? 'ár' : 'árum');
            }
            return result + (withoutSuffix || isFuture ? 'ár' : 'ári');
    }
}

export default moment.defineLocale('is', {
    months: 'janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember'.split(
        '_'
    ),
    monthsShort: 'jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des'.split('_'),
    weekdays:
        'sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur'.split(
            '_'
        ),
    weekdaysShort: 'sun_mán_þri_mið_fim_fös_lau'.split('_'),
    weekdaysMin: 'Su_Má_Þr_Mi_Fi_Fö_La'.split('_'),
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY [kl.] H:mm',
        LLLL: 'dddd, D. MMMM YYYY [kl.] H:mm',
    },
    calendar: {
        sameDay: '[í dag kl.] LT',
        nextDay: '[á morgun kl.] LT',
        nextWeek: 'dddd [kl.] LT',
        lastDay: '[í gær kl.] LT',
        lastWeek: '[síðasta] dddd [kl.] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'eftir %s',
        past: 'fyrir %s síðan',
        s: translate,
        ss: translate,
        m: translate,
        mm: translate,
        h: 'klukkustund',
        hh: translate,
        d: translate,
        dd: translate,
        M: translate,
        MM: translate,
        y: translate,
        yy: translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Italian (Switzerland) [it-ch]
//! author : xfh : https://github.com/xfh

import moment from '../moment';

export default moment.defineLocale('it-ch', {
    months: 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split(
        '_'
    ),
    monthsShort: 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),
    weekdays: 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split(
        '_'
    ),
    weekdaysShort: 'dom_lun_mar_mer_gio_ven_sab'.split('_'),
    weekdaysMin: 'do_lu_ma_me_gi_ve_sa'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Oggi alle] LT',
        nextDay: '[Domani alle] LT',
        nextWeek: 'dddd [alle] LT',
        lastDay: '[Ieri alle] LT',
        lastWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[la scorsa] dddd [alle] LT';
                default:
                    return '[lo scorso] dddd [alle] LT';
            }
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: function (s) {
            return (/^[0-9].+$/.test(s) ? 'tra' : 'in') + ' ' + s;
        },
        past: '%s fa',
        s: 'alcuni secondi',
        ss: '%d secondi',
        m: 'un minuto',
        mm: '%d minuti',
        h: "un'ora",
        hh: '%d ore',
        d: 'un giorno',
        dd: '%d giorni',
        M: 'un mese',
        MM: '%d mesi',
        y: 'un anno',
        yy: '%d anni',
    },
    dayOfMonthOrdinalParse: /\d{1,2}º/,
    ordinal: '%dº',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Italian [it]
//! author : Lorenzo : https://github.com/aliem
//! author: Mattia Larentis: https://github.com/nostalgiaz
//! author: Marco : https://github.com/Manfre98

import moment from '../moment';

export default moment.defineLocale('it', {
    months: 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split(
        '_'
    ),
    monthsShort: 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),
    weekdays: 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split(
        '_'
    ),
    weekdaysShort: 'dom_lun_mar_mer_gio_ven_sab'.split('_'),
    weekdaysMin: 'do_lu_ma_me_gi_ve_sa'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: function () {
            return (
                '[Oggi a' +
                (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : "ll'") +
                ']LT'
            );
        },
        nextDay: function () {
            return (
                '[Domani a' +
                (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : "ll'") +
                ']LT'
            );
        },
        nextWeek: function () {
            return (
                'dddd [a' +
                (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : "ll'") +
                ']LT'
            );
        },
        lastDay: function () {
            return (
                '[Ieri a' +
                (this.hours() > 1 ? 'lle ' : this.hours() === 0 ? ' ' : "ll'") +
                ']LT'
            );
        },
        lastWeek: function () {
            switch (this.day()) {
                case 0:
                    return (
                        '[La scorsa] dddd [a' +
                        (this.hours() > 1
                            ? 'lle '
                            : this.hours() === 0
                            ? ' '
                            : "ll'") +
                        ']LT'
                    );
                default:
                    return (
                        '[Lo scorso] dddd [a' +
                        (this.hours() > 1
                            ? 'lle '
                            : this.hours() === 0
                            ? ' '
                            : "ll'") +
                        ']LT'
                    );
            }
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'tra %s',
        past: '%s fa',
        s: 'alcuni secondi',
        ss: '%d secondi',
        m: 'un minuto',
        mm: '%d minuti',
        h: "un'ora",
        hh: '%d ore',
        d: 'un giorno',
        dd: '%d giorni',
        w: 'una settimana',
        ww: '%d settimane',
        M: 'un mese',
        MM: '%d mesi',
        y: 'un anno',
        yy: '%d anni',
    },
    dayOfMonthOrdinalParse: /\d{1,2}º/,
    ordinal: '%dº',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Japanese [ja]
//! author : LI Long : https://github.com/baryon

import moment from '../moment';

export default moment.defineLocale('ja', {
    eras: [
        {
            since: '2019-05-01',
            offset: 1,
            name: '令和',
            narrow: '㋿',
            abbr: 'R',
        },
        {
            since: '1989-01-08',
            until: '2019-04-30',
            offset: 1,
            name: '平成',
            narrow: '㍻',
            abbr: 'H',
        },
        {
            since: '1926-12-25',
            until: '1989-01-07',
            offset: 1,
            name: '昭和',
            narrow: '㍼',
            abbr: 'S',
        },
        {
            since: '1912-07-30',
            until: '1926-12-24',
            offset: 1,
            name: '大正',
            narrow: '㍽',
            abbr: 'T',
        },
        {
            since: '1873-01-01',
            until: '1912-07-29',
            offset: 6,
            name: '明治',
            narrow: '㍾',
            abbr: 'M',
        },
        {
            since: '0001-01-01',
            until: '1873-12-31',
            offset: 1,
            name: '西暦',
            narrow: 'AD',
            abbr: 'AD',
        },
        {
            since: '0000-12-31',
            until: -Infinity,
            offset: 1,
            name: '紀元前',
            narrow: 'BC',
            abbr: 'BC',
        },
    ],
    eraYearOrdinalRegex: /(元|\d+)年/,
    eraYearOrdinalParse: function (input, match) {
        return match[1] === '元' ? 1 : parseInt(match[1] || input, 10);
    },
    months: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
    monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(
        '_'
    ),
    weekdays: '日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日'.split('_'),
    weekdaysShort: '日_月_火_水_木_金_土'.split('_'),
    weekdaysMin: '日_月_火_水_木_金_土'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'YYYY/MM/DD',
        LL: 'YYYY年M月D日',
        LLL: 'YYYY年M月D日 HH:mm',
        LLLL: 'YYYY年M月D日 dddd HH:mm',
        l: 'YYYY/MM/DD',
        ll: 'YYYY年M月D日',
        lll: 'YYYY年M月D日 HH:mm',
        llll: 'YYYY年M月D日(ddd) HH:mm',
    },
    meridiemParse: /午前|午後/i,
    isPM: function (input) {
        return input === '午後';
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return '午前';
        } else {
            return '午後';
        }
    },
    calendar: {
        sameDay: '[今日] LT',
        nextDay: '[明日] LT',
        nextWeek: function (now) {
            if (now.week() !== this.week()) {
                return '[来週]dddd LT';
            } else {
                return 'dddd LT';
            }
        },
        lastDay: '[昨日] LT',
        lastWeek: function (now) {
            if (this.week() !== now.week()) {
                return '[先週]dddd LT';
            } else {
                return 'dddd LT';
            }
        },
        sameElse: 'L',
    },
    dayOfMonthOrdinalParse: /\d{1,2}日/,
    ordinal: function (number, period) {
        switch (period) {
            case 'y':
                return number === 1 ? '元年' : number + '年';
            case 'd':
            case 'D':
            case 'DDD':
                return number + '日';
            default:
                return number;
        }
    },
    relativeTime: {
        future: '%s後',
        past: '%s前',
        s: '数秒',
        ss: '%d秒',
        m: '1分',
        mm: '%d分',
        h: '1時間',
        hh: '%d時間',
        d: '1日',
        dd: '%d日',
        M: '1ヶ月',
        MM: '%dヶ月',
        y: '1年',
        yy: '%d年',
    },
});
//! moment.js locale configuration
//! locale : Javanese [jv]
//! author : Rony Lantip : https://github.com/lantip
//! reference: http://jv.wikipedia.org/wiki/Basa_Jawa

import moment from '../moment';

export default moment.defineLocale('jv', {
    months: 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des'.split('_'),
    weekdays: 'Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu'.split('_'),
    weekdaysShort: 'Min_Sen_Sel_Reb_Kem_Jem_Sep'.split('_'),
    weekdaysMin: 'Mg_Sn_Sl_Rb_Km_Jm_Sp'.split('_'),
    longDateFormat: {
        LT: 'HH.mm',
        LTS: 'HH.mm.ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY [pukul] HH.mm',
        LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',
    },
    meridiemParse: /enjing|siyang|sonten|ndalu/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'enjing') {
            return hour;
        } else if (meridiem === 'siyang') {
            return hour >= 11 ? hour : hour + 12;
        } else if (meridiem === 'sonten' || meridiem === 'ndalu') {
            return hour + 12;
        }
    },
    meridiem: function (hours, minutes, isLower) {
        if (hours < 11) {
            return 'enjing';
        } else if (hours < 15) {
            return 'siyang';
        } else if (hours < 19) {
            return 'sonten';
        } else {
            return 'ndalu';
        }
    },
    calendar: {
        sameDay: '[Dinten puniko pukul] LT',
        nextDay: '[Mbenjang pukul] LT',
        nextWeek: 'dddd [pukul] LT',
        lastDay: '[Kala wingi pukul] LT',
        lastWeek: 'dddd [kepengker pukul] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'wonten ing %s',
        past: '%s ingkang kepengker',
        s: 'sawetawis detik',
        ss: '%d detik',
        m: 'setunggal menit',
        mm: '%d menit',
        h: 'setunggal jam',
        hh: '%d jam',
        d: 'sedinten',
        dd: '%d dinten',
        M: 'sewulan',
        MM: '%d wulan',
        y: 'setaun',
        yy: '%d taun',
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Georgian [ka]
//! author : Irakli Janiashvili : https://github.com/IrakliJani

import moment from '../moment';

export default moment.defineLocale('ka', {
    months: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split(
        '_'
    ),
    monthsShort: 'იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ'.split('_'),
    weekdays: {
        standalone:
            'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split(
                '_'
            ),
        format: 'კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს'.split(
            '_'
        ),
        isFormat: /(წინა|შემდეგ)/,
    },
    weekdaysShort: 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'),
    weekdaysMin: 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[დღეს] LT[-ზე]',
        nextDay: '[ხვალ] LT[-ზე]',
        lastDay: '[გუშინ] LT[-ზე]',
        nextWeek: '[შემდეგ] dddd LT[-ზე]',
        lastWeek: '[წინა] dddd LT-ზე',
        sameElse: 'L',
    },
    relativeTime: {
        future: function (s) {
            return s.replace(
                /(წამ|წუთ|საათ|წელ|დღ|თვ)(ი|ე)/,
                function ($0, $1, $2) {
                    return $2 === 'ი' ? $1 + 'ში' : $1 + $2 + 'ში';
                }
            );
        },
        past: function (s) {
            if (/(წამი|წუთი|საათი|დღე|თვე)/.test(s)) {
                return s.replace(/(ი|ე)$/, 'ის წინ');
            }
            if (/წელი/.test(s)) {
                return s.replace(/წელი$/, 'წლის წინ');
            }
            return s;
        },
        s: 'რამდენიმე წამი',
        ss: '%d წამი',
        m: 'წუთი',
        mm: '%d წუთი',
        h: 'საათი',
        hh: '%d საათი',
        d: 'დღე',
        dd: '%d დღე',
        M: 'თვე',
        MM: '%d თვე',
        y: 'წელი',
        yy: '%d წელი',
    },
    dayOfMonthOrdinalParse: /0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,
    ordinal: function (number) {
        if (number === 0) {
            return number;
        }
        if (number === 1) {
            return number + '-ლი';
        }
        if (
            number < 20 ||
            (number <= 100 && number % 20 === 0) ||
            number % 100 === 0
        ) {
            return 'მე-' + number;
        }
        return number + '-ე';
    },
    week: {
        dow: 1,
        doy: 7,
    },
});
//! moment.js locale configuration
//! locale : Kazakh [kk]
//! authors : Nurlan Rakhimzhanov : https://github.com/nurlan

import moment from '../moment';

var suffixes = {
    0: '-ші',
    1: '-ші',
    2: '-ші',
    3: '-ші',
    4: '-ші',
    5: '-ші',
    6: '-шы',
    7: '-ші',
    8: '-ші',
    9: '-шы',
    10: '-шы',
    20: '-шы',
    30: '-шы',
    40: '-шы',
    50: '-ші',
    60: '-шы',
    70: '-ші',
    80: '-ші',
    90: '-шы',
    100: '-ші',
};

export default moment.defineLocale('kk', {
    months: 'қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан'.split(
        '_'
    ),
    monthsShort: 'қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел'.split('_'),
    weekdays: 'жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі'.split(
        '_'
    ),
    weekdaysShort: 'жек_дүй_сей_сәр_бей_жұм_сен'.split('_'),
    weekdaysMin: 'жк_дй_сй_ср_бй_жм_сн'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Бүгін сағат] LT',
        nextDay: '[Ертең сағат] LT',
        nextWeek: 'dddd [сағат] LT',
        lastDay: '[Кеше сағат] LT',
        lastWeek: '[Өткен аптаның] dddd [сағат] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s ішінде',
        past: '%s бұрын',
        s: 'бірнеше секунд',
        ss: '%d секунд',
        m: 'бір минут',
        mm: '%d минут',
        h: 'бір сағат',
        hh: '%d сағат',
        d: 'бір күн',
        dd: '%d күн',
        M: 'бір ай',
        MM: '%d ай',
        y: 'бір жыл',
        yy: '%d жыл',
    },
    dayOfMonthOrdinalParse: /\d{1,2}-(ші|шы)/,
    ordinal: function (number) {
        var a = number % 10,
            b = number >= 100 ? 100 : null;
        return number + (suffixes[number] || suffixes[a] || suffixes[b]);
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Cambodian [km]
//! author : Kruy Vanna : https://github.com/kruyvanna

import moment from '../moment';

var symbolMap = {
        1: '១',
        2: '២',
        3: '៣',
        4: '៤',
        5: '៥',
        6: '៦',
        7: '៧',
        8: '៨',
        9: '៩',
        0: '០',
    },
    numberMap = {
        '១': '1',
        '២': '2',
        '៣': '3',
        '៤': '4',
        '៥': '5',
        '៦': '6',
        '៧': '7',
        '៨': '8',
        '៩': '9',
        '០': '0',
    };

export default moment.defineLocale('km', {
    months: 'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split(
        '_'
    ),
    monthsShort:
        'មករា_កុម្ភៈ_មីនា_មេសា_ឧសភា_មិថុនា_កក្កដា_សីហា_កញ្ញា_តុលា_វិច្ឆិកា_ធ្នូ'.split(
            '_'
        ),
    weekdays: 'អាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍'.split('_'),
    weekdaysShort: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'),
    weekdaysMin: 'អា_ច_អ_ព_ព្រ_សុ_ស'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    meridiemParse: /ព្រឹក|ល្ងាច/,
    isPM: function (input) {
        return input === 'ល្ងាច';
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return 'ព្រឹក';
        } else {
            return 'ល្ងាច';
        }
    },
    calendar: {
        sameDay: '[ថ្ងៃនេះ ម៉ោង] LT',
        nextDay: '[ស្អែក ម៉ោង] LT',
        nextWeek: 'dddd [ម៉ោង] LT',
        lastDay: '[ម្សិលមិញ ម៉ោង] LT',
        lastWeek: 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%sទៀត',
        past: '%sមុន',
        s: 'ប៉ុន្មានវិនាទី',
        ss: '%d វិនាទី',
        m: 'មួយនាទី',
        mm: '%d នាទី',
        h: 'មួយម៉ោង',
        hh: '%d ម៉ោង',
        d: 'មួយថ្ងៃ',
        dd: '%d ថ្ងៃ',
        M: 'មួយខែ',
        MM: '%d ខែ',
        y: 'មួយឆ្នាំ',
        yy: '%d ឆ្នាំ',
    },
    dayOfMonthOrdinalParse: /ទី\d{1,2}/,
    ordinal: 'ទី%d',
    preparse: function (string) {
        return string.replace(/[១២៣៤៥៦៧៨៩០]/g, function (match) {
            return numberMap[match];
        });
    },
    postformat: function (string) {
        return string.replace(/\d/g, function (match) {
            return symbolMap[match];
        });
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Kannada [kn]
//! author : Rajeev Naik : https://github.com/rajeevnaikte

import moment from '../moment';

var symbolMap = {
        1: '೧',
        2: '೨',
        3: '೩',
        4: '೪',
        5: '೫',
        6: '೬',
        7: '೭',
        8: '೮',
        9: '೯',
        0: '೦',
    },
    numberMap = {
        '೧': '1',
        '೨': '2',
        '೩': '3',
        '೪': '4',
        '೫': '5',
        '೬': '6',
        '೭': '7',
        '೮': '8',
        '೯': '9',
        '೦': '0',
    };

export default moment.defineLocale('kn', {
    months: 'ಜನವರಿ_ಫೆಬ್ರವರಿ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂಬರ್_ಅಕ್ಟೋಬರ್_ನವೆಂಬರ್_ಡಿಸೆಂಬರ್'.split(
        '_'
    ),
    monthsShort:
        'ಜನ_ಫೆಬ್ರ_ಮಾರ್ಚ್_ಏಪ್ರಿಲ್_ಮೇ_ಜೂನ್_ಜುಲೈ_ಆಗಸ್ಟ್_ಸೆಪ್ಟೆಂ_ಅಕ್ಟೋ_ನವೆಂ_ಡಿಸೆಂ'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'ಭಾನುವಾರ_ಸೋಮವಾರ_ಮಂಗಳವಾರ_ಬುಧವಾರ_ಗುರುವಾರ_ಶುಕ್ರವಾರ_ಶನಿವಾರ'.split(
        '_'
    ),
    weekdaysShort: 'ಭಾನು_ಸೋಮ_ಮಂಗಳ_ಬುಧ_ಗುರು_ಶುಕ್ರ_ಶನಿ'.split('_'),
    weekdaysMin: 'ಭಾ_ಸೋ_ಮಂ_ಬು_ಗು_ಶು_ಶ'.split('_'),
    longDateFormat: {
        LT: 'A h:mm',
        LTS: 'A h:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY, A h:mm',
        LLLL: 'dddd, D MMMM YYYY, A h:mm',
    },
    calendar: {
        sameDay: '[ಇಂದು] LT',
        nextDay: '[ನಾಳೆ] LT',
        nextWeek: 'dddd, LT',
        lastDay: '[ನಿನ್ನೆ] LT',
        lastWeek: '[ಕೊನೆಯ] dddd, LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s ನಂತರ',
        past: '%s ಹಿಂದೆ',
        s: 'ಕೆಲವು ಕ್ಷಣಗಳು',
        ss: '%d ಸೆಕೆಂಡುಗಳು',
        m: 'ಒಂದು ನಿಮಿಷ',
        mm: '%d ನಿಮಿಷ',
        h: 'ಒಂದು ಗಂಟೆ',
        hh: '%d ಗಂಟೆ',
        d: 'ಒಂದು ದಿನ',
        dd: '%d ದಿನ',
        M: 'ಒಂದು ತಿಂಗಳು',
        MM: '%d ತಿಂಗಳು',
        y: 'ಒಂದು ವರ್ಷ',
        yy: '%d ವರ್ಷ',
    },
    preparse: function (string) {
        return string.replace(/[೧೨೩೪೫೬೭೮೯೦]/g, function (match) {
            return numberMap[match];
        });
    },
    postformat: function (string) {
        return string.replace(/\d/g, function (match) {
            return symbolMap[match];
        });
    },
    meridiemParse: /ರಾತ್ರಿ|ಬೆಳಿಗ್ಗೆ|ಮಧ್ಯಾಹ್ನ|ಸಂಜೆ/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'ರಾತ್ರಿ') {
            return hour < 4 ? hour : hour + 12;
        } else if (meridiem === 'ಬೆಳಿಗ್ಗೆ') {
            return hour;
        } else if (meridiem === 'ಮಧ್ಯಾಹ್ನ') {
            return hour >= 10 ? hour : hour + 12;
        } else if (meridiem === 'ಸಂಜೆ') {
            return hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'ರಾತ್ರಿ';
        } else if (hour < 10) {
            return 'ಬೆಳಿಗ್ಗೆ';
        } else if (hour < 17) {
            return 'ಮಧ್ಯಾಹ್ನ';
        } else if (hour < 20) {
            return 'ಸಂಜೆ';
        } else {
            return 'ರಾತ್ರಿ';
        }
    },
    dayOfMonthOrdinalParse: /\d{1,2}(ನೇ)/,
    ordinal: function (number) {
        return number + 'ನೇ';
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Korean [ko]
//! author : Kyungwook, Park : https://github.com/kyungw00k
//! author : Jeeeyul Lee <jeeeyul@gmail.com>

import moment from '../moment';

export default moment.defineLocale('ko', {
    months: '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split('_'),
    monthsShort: '1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월'.split(
        '_'
    ),
    weekdays: '일요일_월요일_화요일_수요일_목요일_금요일_토요일'.split('_'),
    weekdaysShort: '일_월_화_수_목_금_토'.split('_'),
    weekdaysMin: '일_월_화_수_목_금_토'.split('_'),
    longDateFormat: {
        LT: 'A h:mm',
        LTS: 'A h:mm:ss',
        L: 'YYYY.MM.DD.',
        LL: 'YYYY년 MMMM D일',
        LLL: 'YYYY년 MMMM D일 A h:mm',
        LLLL: 'YYYY년 MMMM D일 dddd A h:mm',
        l: 'YYYY.MM.DD.',
        ll: 'YYYY년 MMMM D일',
        lll: 'YYYY년 MMMM D일 A h:mm',
        llll: 'YYYY년 MMMM D일 dddd A h:mm',
    },
    calendar: {
        sameDay: '오늘 LT',
        nextDay: '내일 LT',
        nextWeek: 'dddd LT',
        lastDay: '어제 LT',
        lastWeek: '지난주 dddd LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s 후',
        past: '%s 전',
        s: '몇 초',
        ss: '%d초',
        m: '1분',
        mm: '%d분',
        h: '한 시간',
        hh: '%d시간',
        d: '하루',
        dd: '%d일',
        M: '한 달',
        MM: '%d달',
        y: '일 년',
        yy: '%d년',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(일|월|주)/,
    ordinal: function (number, period) {
        switch (period) {
            case 'd':
            case 'D':
            case 'DDD':
                return number + '일';
            case 'M':
                return number + '월';
            case 'w':
            case 'W':
                return number + '주';
            default:
                return number;
        }
    },
    meridiemParse: /오전|오후/,
    isPM: function (token) {
        return token === '오후';
    },
    meridiem: function (hour, minute, isUpper) {
        return hour < 12 ? '오전' : '오후';
    },
});
//! moment.js locale configuration
//! locale : Kurdish [ku]
//! author : Shahram Mebashar : https://github.com/ShahramMebashar

import moment from '../moment';

var symbolMap = {
        1: '١',
        2: '٢',
        3: '٣',
        4: '٤',
        5: '٥',
        6: '٦',
        7: '٧',
        8: '٨',
        9: '٩',
        0: '٠',
    },
    numberMap = {
        '١': '1',
        '٢': '2',
        '٣': '3',
        '٤': '4',
        '٥': '5',
        '٦': '6',
        '٧': '7',
        '٨': '8',
        '٩': '9',
        '٠': '0',
    },
    months = [
        'کانونی دووەم',
        'شوبات',
        'ئازار',
        'نیسان',
        'ئایار',
        'حوزەیران',
        'تەمموز',
        'ئاب',
        'ئەیلوول',
        'تشرینی یەكەم',
        'تشرینی دووەم',
        'كانونی یەکەم',
    ];

export default moment.defineLocale('ku', {
    months: months,
    monthsShort: months,
    weekdays:
        'یه‌كشه‌ممه‌_دووشه‌ممه‌_سێشه‌ممه‌_چوارشه‌ممه‌_پێنجشه‌ممه‌_هه‌ینی_شه‌ممه‌'.split(
            '_'
        ),
    weekdaysShort:
        'یه‌كشه‌م_دووشه‌م_سێشه‌م_چوارشه‌م_پێنجشه‌م_هه‌ینی_شه‌ممه‌'.split('_'),
    weekdaysMin: 'ی_د_س_چ_پ_ه_ش'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    meridiemParse: /ئێواره‌|به‌یانی/,
    isPM: function (input) {
        return /ئێواره‌/.test(input);
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return 'به‌یانی';
        } else {
            return 'ئێواره‌';
        }
    },
    calendar: {
        sameDay: '[ئه‌مرۆ كاتژمێر] LT',
        nextDay: '[به‌یانی كاتژمێر] LT',
        nextWeek: 'dddd [كاتژمێر] LT',
        lastDay: '[دوێنێ كاتژمێر] LT',
        lastWeek: 'dddd [كاتژمێر] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'له‌ %s',
        past: '%s',
        s: 'چه‌ند چركه‌یه‌ك',
        ss: 'چركه‌ %d',
        m: 'یه‌ك خوله‌ك',
        mm: '%d خوله‌ك',
        h: 'یه‌ك كاتژمێر',
        hh: '%d كاتژمێر',
        d: 'یه‌ك ڕۆژ',
        dd: '%d ڕۆژ',
        M: 'یه‌ك مانگ',
        MM: '%d مانگ',
        y: 'یه‌ك ساڵ',
        yy: '%d ساڵ',
    },
    preparse: function (string) {
        return string
            .replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
                return numberMap[match];
            })
            .replace(/،/g, ',');
    },
    postformat: function (string) {
        return string
            .replace(/\d/g, function (match) {
                return symbolMap[match];
            })
            .replace(/,/g, '،');
    },
    week: {
        dow: 6, // Saturday is the first day of the week.
        doy: 12, // The week that contains Jan 12th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Kyrgyz [ky]
//! author : Chyngyz Arystan uulu : https://github.com/chyngyz

import moment from '../moment';

var suffixes = {
    0: '-чү',
    1: '-чи',
    2: '-чи',
    3: '-чү',
    4: '-чү',
    5: '-чи',
    6: '-чы',
    7: '-чи',
    8: '-чи',
    9: '-чу',
    10: '-чу',
    20: '-чы',
    30: '-чу',
    40: '-чы',
    50: '-чү',
    60: '-чы',
    70: '-чи',
    80: '-чи',
    90: '-чу',
    100: '-чү',
};

export default moment.defineLocale('ky', {
    months: 'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split(
        '_'
    ),
    monthsShort: 'янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек'.split(
        '_'
    ),
    weekdays: 'Жекшемби_Дүйшөмбү_Шейшемби_Шаршемби_Бейшемби_Жума_Ишемби'.split(
        '_'
    ),
    weekdaysShort: 'Жек_Дүй_Шей_Шар_Бей_Жум_Ише'.split('_'),
    weekdaysMin: 'Жк_Дй_Шй_Шр_Бй_Жм_Иш'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Бүгүн саат] LT',
        nextDay: '[Эртең саат] LT',
        nextWeek: 'dddd [саат] LT',
        lastDay: '[Кечээ саат] LT',
        lastWeek: '[Өткөн аптанын] dddd [күнү] [саат] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s ичинде',
        past: '%s мурун',
        s: 'бирнече секунд',
        ss: '%d секунд',
        m: 'бир мүнөт',
        mm: '%d мүнөт',
        h: 'бир саат',
        hh: '%d саат',
        d: 'бир күн',
        dd: '%d күн',
        M: 'бир ай',
        MM: '%d ай',
        y: 'бир жыл',
        yy: '%d жыл',
    },
    dayOfMonthOrdinalParse: /\d{1,2}-(чи|чы|чү|чу)/,
    ordinal: function (number) {
        var a = number % 10,
            b = number >= 100 ? 100 : null;
        return number + (suffixes[number] || suffixes[a] || suffixes[b]);
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Luxembourgish [lb]
//! author : mweimerskirch : https://github.com/mweimerskirch
//! author : David Raison : https://github.com/kwisatz

import moment from '../moment';

function processRelativeTime(number, withoutSuffix, key, isFuture) {
    var format = {
        m: ['eng Minutt', 'enger Minutt'],
        h: ['eng Stonn', 'enger Stonn'],
        d: ['een Dag', 'engem Dag'],
        M: ['ee Mount', 'engem Mount'],
        y: ['ee Joer', 'engem Joer'],
    };
    return withoutSuffix ? format[key][0] : format[key][1];
}
function processFutureTime(string) {
    var number = string.substr(0, string.indexOf(' '));
    if (eifelerRegelAppliesToNumber(number)) {
        return 'a ' + string;
    }
    return 'an ' + string;
}
function processPastTime(string) {
    var number = string.substr(0, string.indexOf(' '));
    if (eifelerRegelAppliesToNumber(number)) {
        return 'viru ' + string;
    }
    return 'virun ' + string;
}
/**
 * Returns true if the word before the given number loses the '-n' ending.
 * e.g. 'an 10 Deeg' but 'a 5 Deeg'
 *
 * @param number {integer}
 * @returns {boolean}
 */
function eifelerRegelAppliesToNumber(number) {
    number = parseInt(number, 10);
    if (isNaN(number)) {
        return false;
    }
    if (number < 0) {
        // Negative Number --> always true
        return true;
    } else if (number < 10) {
        // Only 1 digit
        if (4 <= number && number <= 7) {
            return true;
        }
        return false;
    } else if (number < 100) {
        // 2 digits
        var lastDigit = number % 10,
            firstDigit = number / 10;
        if (lastDigit === 0) {
            return eifelerRegelAppliesToNumber(firstDigit);
        }
        return eifelerRegelAppliesToNumber(lastDigit);
    } else if (number < 10000) {
        // 3 or 4 digits --> recursively check first digit
        while (number >= 10) {
            number = number / 10;
        }
        return eifelerRegelAppliesToNumber(number);
    } else {
        // Anything larger than 4 digits: recursively check first n-3 digits
        number = number / 1000;
        return eifelerRegelAppliesToNumber(number);
    }
}

export default moment.defineLocale('lb', {
    months: 'Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember'.split(
        '_'
    ),
    monthsShort:
        'Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays:
        'Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg'.split(
            '_'
        ),
    weekdaysShort: 'So._Mé._Dë._Më._Do._Fr._Sa.'.split('_'),
    weekdaysMin: 'So_Mé_Dë_Më_Do_Fr_Sa'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'H:mm [Auer]',
        LTS: 'H:mm:ss [Auer]',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY H:mm [Auer]',
        LLLL: 'dddd, D. MMMM YYYY H:mm [Auer]',
    },
    calendar: {
        sameDay: '[Haut um] LT',
        sameElse: 'L',
        nextDay: '[Muer um] LT',
        nextWeek: 'dddd [um] LT',
        lastDay: '[Gëschter um] LT',
        lastWeek: function () {
            // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule
            switch (this.day()) {
                case 2:
                case 4:
                    return '[Leschten] dddd [um] LT';
                default:
                    return '[Leschte] dddd [um] LT';
            }
        },
    },
    relativeTime: {
        future: processFutureTime,
        past: processPastTime,
        s: 'e puer Sekonnen',
        ss: '%d Sekonnen',
        m: processRelativeTime,
        mm: '%d Minutten',
        h: processRelativeTime,
        hh: '%d Stonnen',
        d: processRelativeTime,
        dd: '%d Deeg',
        M: processRelativeTime,
        MM: '%d Méint',
        y: processRelativeTime,
        yy: '%d Joer',
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Lao [lo]
//! author : Ryan Hart : https://github.com/ryanhart2

import moment from '../moment';

export default moment.defineLocale('lo', {
    months: 'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split(
        '_'
    ),
    monthsShort:
        'ມັງກອນ_ກຸມພາ_ມີນາ_ເມສາ_ພຶດສະພາ_ມິຖຸນາ_ກໍລະກົດ_ສິງຫາ_ກັນຍາ_ຕຸລາ_ພະຈິກ_ທັນວາ'.split(
            '_'
        ),
    weekdays: 'ອາທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),
    weekdaysShort: 'ທິດ_ຈັນ_ອັງຄານ_ພຸດ_ພະຫັດ_ສຸກ_ເສົາ'.split('_'),
    weekdaysMin: 'ທ_ຈ_ອຄ_ພ_ພຫ_ສກ_ສ'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'ວັນdddd D MMMM YYYY HH:mm',
    },
    meridiemParse: /ຕອນເຊົ້າ|ຕອນແລງ/,
    isPM: function (input) {
        return input === 'ຕອນແລງ';
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return 'ຕອນເຊົ້າ';
        } else {
            return 'ຕອນແລງ';
        }
    },
    calendar: {
        sameDay: '[ມື້ນີ້ເວລາ] LT',
        nextDay: '[ມື້ອື່ນເວລາ] LT',
        nextWeek: '[ວັນ]dddd[ໜ້າເວລາ] LT',
        lastDay: '[ມື້ວານນີ້ເວລາ] LT',
        lastWeek: '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'ອີກ %s',
        past: '%sຜ່ານມາ',
        s: 'ບໍ່ເທົ່າໃດວິນາທີ',
        ss: '%d ວິນາທີ',
        m: '1 ນາທີ',
        mm: '%d ນາທີ',
        h: '1 ຊົ່ວໂມງ',
        hh: '%d ຊົ່ວໂມງ',
        d: '1 ມື້',
        dd: '%d ມື້',
        M: '1 ເດືອນ',
        MM: '%d ເດືອນ',
        y: '1 ປີ',
        yy: '%d ປີ',
    },
    dayOfMonthOrdinalParse: /(ທີ່)\d{1,2}/,
    ordinal: function (number) {
        return 'ທີ່' + number;
    },
});
//! moment.js locale configuration
//! locale : Lithuanian [lt]
//! author : Mindaugas Mozūras : https://github.com/mmozuras

import moment from '../moment';

var units = {
    ss: 'sekundė_sekundžių_sekundes',
    m: 'minutė_minutės_minutę',
    mm: 'minutės_minučių_minutes',
    h: 'valanda_valandos_valandą',
    hh: 'valandos_valandų_valandas',
    d: 'diena_dienos_dieną',
    dd: 'dienos_dienų_dienas',
    M: 'mėnuo_mėnesio_mėnesį',
    MM: 'mėnesiai_mėnesių_mėnesius',
    y: 'metai_metų_metus',
    yy: 'metai_metų_metus',
};
function translateSeconds(number, withoutSuffix, key, isFuture) {
    if (withoutSuffix) {
        return 'kelios sekundės';
    } else {
        return isFuture ? 'kelių sekundžių' : 'kelias sekundes';
    }
}
function translateSingular(number, withoutSuffix, key, isFuture) {
    return withoutSuffix
        ? forms(key)[0]
        : isFuture
        ? forms(key)[1]
        : forms(key)[2];
}
function special(number) {
    return number % 10 === 0 || (number > 10 && number < 20);
}
function forms(key) {
    return units[key].split('_');
}
function translate(number, withoutSuffix, key, isFuture) {
    var result = number + ' ';
    if (number === 1) {
        return (
            result + translateSingular(number, withoutSuffix, key[0], isFuture)
        );
    } else if (withoutSuffix) {
        return result + (special(number) ? forms(key)[1] : forms(key)[0]);
    } else {
        if (isFuture) {
            return result + forms(key)[1];
        } else {
            return result + (special(number) ? forms(key)[1] : forms(key)[2]);
        }
    }
}
export default moment.defineLocale('lt', {
    months: {
        format: 'sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio'.split(
            '_'
        ),
        standalone:
            'sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis'.split(
                '_'
            ),
        isFormat: /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/,
    },
    monthsShort: 'sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd'.split('_'),
    weekdays: {
        format: 'sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį'.split(
            '_'
        ),
        standalone:
            'sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis'.split(
                '_'
            ),
        isFormat: /dddd HH:mm/,
    },
    weekdaysShort: 'Sek_Pir_Ant_Tre_Ket_Pen_Šeš'.split('_'),
    weekdaysMin: 'S_P_A_T_K_Pn_Š'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'YYYY-MM-DD',
        LL: 'YYYY [m.] MMMM D [d.]',
        LLL: 'YYYY [m.] MMMM D [d.], HH:mm [val.]',
        LLLL: 'YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]',
        l: 'YYYY-MM-DD',
        ll: 'YYYY [m.] MMMM D [d.]',
        lll: 'YYYY [m.] MMMM D [d.], HH:mm [val.]',
        llll: 'YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]',
    },
    calendar: {
        sameDay: '[Šiandien] LT',
        nextDay: '[Rytoj] LT',
        nextWeek: 'dddd LT',
        lastDay: '[Vakar] LT',
        lastWeek: '[Praėjusį] dddd LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'po %s',
        past: 'prieš %s',
        s: translateSeconds,
        ss: translate,
        m: translateSingular,
        mm: translate,
        h: translateSingular,
        hh: translate,
        d: translateSingular,
        dd: translate,
        M: translateSingular,
        MM: translate,
        y: translateSingular,
        yy: translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2}-oji/,
    ordinal: function (number) {
        return number + '-oji';
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Latvian [lv]
//! author : Kristaps Karlsons : https://github.com/skakri
//! author : Jānis Elmeris : https://github.com/JanisE

import moment from '../moment';

var units = {
    ss: 'sekundes_sekundēm_sekunde_sekundes'.split('_'),
    m: 'minūtes_minūtēm_minūte_minūtes'.split('_'),
    mm: 'minūtes_minūtēm_minūte_minūtes'.split('_'),
    h: 'stundas_stundām_stunda_stundas'.split('_'),
    hh: 'stundas_stundām_stunda_stundas'.split('_'),
    d: 'dienas_dienām_diena_dienas'.split('_'),
    dd: 'dienas_dienām_diena_dienas'.split('_'),
    M: 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),
    MM: 'mēneša_mēnešiem_mēnesis_mēneši'.split('_'),
    y: 'gada_gadiem_gads_gadi'.split('_'),
    yy: 'gada_gadiem_gads_gadi'.split('_'),
};
/**
 * @param withoutSuffix boolean true = a length of time; false = before/after a period of time.
 */
function format(forms, number, withoutSuffix) {
    if (withoutSuffix) {
        // E.g. "21 minūte", "3 minūtes".
        return number % 10 === 1 && number % 100 !== 11 ? forms[2] : forms[3];
    } else {
        // E.g. "21 minūtes" as in "pēc 21 minūtes".
        // E.g. "3 minūtēm" as in "pēc 3 minūtēm".
        return number % 10 === 1 && number % 100 !== 11 ? forms[0] : forms[1];
    }
}
function relativeTimeWithPlural(number, withoutSuffix, key) {
    return number + ' ' + format(units[key], number, withoutSuffix);
}
function relativeTimeWithSingular(number, withoutSuffix, key) {
    return format(units[key], number, withoutSuffix);
}
function relativeSeconds(number, withoutSuffix) {
    return withoutSuffix ? 'dažas sekundes' : 'dažām sekundēm';
}

export default moment.defineLocale('lv', {
    months: 'janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris'.split(
        '_'
    ),
    monthsShort: 'jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec'.split('_'),
    weekdays:
        'svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena'.split(
            '_'
        ),
    weekdaysShort: 'Sv_P_O_T_C_Pk_S'.split('_'),
    weekdaysMin: 'Sv_P_O_T_C_Pk_S'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY.',
        LL: 'YYYY. [gada] D. MMMM',
        LLL: 'YYYY. [gada] D. MMMM, HH:mm',
        LLLL: 'YYYY. [gada] D. MMMM, dddd, HH:mm',
    },
    calendar: {
        sameDay: '[Šodien pulksten] LT',
        nextDay: '[Rīt pulksten] LT',
        nextWeek: 'dddd [pulksten] LT',
        lastDay: '[Vakar pulksten] LT',
        lastWeek: '[Pagājušā] dddd [pulksten] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'pēc %s',
        past: 'pirms %s',
        s: relativeSeconds,
        ss: relativeTimeWithPlural,
        m: relativeTimeWithSingular,
        mm: relativeTimeWithPlural,
        h: relativeTimeWithSingular,
        hh: relativeTimeWithPlural,
        d: relativeTimeWithSingular,
        dd: relativeTimeWithPlural,
        M: relativeTimeWithSingular,
        MM: relativeTimeWithPlural,
        y: relativeTimeWithSingular,
        yy: relativeTimeWithPlural,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Montenegrin [me]
//! author : Miodrag Nikač <miodrag@restartit.me> : https://github.com/miodragnikac

import moment from '../moment';

var translator = {
    words: {
        //Different grammatical cases
        ss: ['sekund', 'sekunda', 'sekundi'],
        m: ['jedan minut', 'jednog minuta'],
        mm: ['minut', 'minuta', 'minuta'],
        h: ['jedan sat', 'jednog sata'],
        hh: ['sat', 'sata', 'sati'],
        dd: ['dan', 'dana', 'dana'],
        MM: ['mjesec', 'mjeseca', 'mjeseci'],
        yy: ['godina', 'godine', 'godina'],
    },
    correctGrammaticalCase: function (number, wordKey) {
        return number === 1
            ? wordKey[0]
            : number >= 2 && number <= 4
            ? wordKey[1]
            : wordKey[2];
    },
    translate: function (number, withoutSuffix, key) {
        var wordKey = translator.words[key];
        if (key.length === 1) {
            return withoutSuffix ? wordKey[0] : wordKey[1];
        } else {
            return (
                number +
                ' ' +
                translator.correctGrammaticalCase(number, wordKey)
            );
        }
    },
};

export default moment.defineLocale('me', {
    months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split(
        '_'
    ),
    monthsShort:
        'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),
    monthsParseExact: true,
    weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split(
        '_'
    ),
    weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
    weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY H:mm',
        LLLL: 'dddd, D. MMMM YYYY H:mm',
    },
    calendar: {
        sameDay: '[danas u] LT',
        nextDay: '[sjutra u] LT',

        nextWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[u] [nedjelju] [u] LT';
                case 3:
                    return '[u] [srijedu] [u] LT';
                case 6:
                    return '[u] [subotu] [u] LT';
                case 1:
                case 2:
                case 4:
                case 5:
                    return '[u] dddd [u] LT';
            }
        },
        lastDay: '[juče u] LT',
        lastWeek: function () {
            var lastWeekDays = [
                '[prošle] [nedjelje] [u] LT',
                '[prošlog] [ponedjeljka] [u] LT',
                '[prošlog] [utorka] [u] LT',
                '[prošle] [srijede] [u] LT',
                '[prošlog] [četvrtka] [u] LT',
                '[prošlog] [petka] [u] LT',
                '[prošle] [subote] [u] LT',
            ];
            return lastWeekDays[this.day()];
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'za %s',
        past: 'prije %s',
        s: 'nekoliko sekundi',
        ss: translator.translate,
        m: translator.translate,
        mm: translator.translate,
        h: translator.translate,
        hh: translator.translate,
        d: 'dan',
        dd: translator.translate,
        M: 'mjesec',
        MM: translator.translate,
        y: 'godinu',
        yy: translator.translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Maori [mi]
//! author : John Corrigan <robbiecloset@gmail.com> : https://github.com/johnideal

import moment from '../moment';

export default moment.defineLocale('mi', {
    months: 'Kohi-tāte_Hui-tanguru_Poutū-te-rangi_Paenga-whāwhā_Haratua_Pipiri_Hōngoingoi_Here-turi-kōkā_Mahuru_Whiringa-ā-nuku_Whiringa-ā-rangi_Hakihea'.split(
        '_'
    ),
    monthsShort:
        'Kohi_Hui_Pou_Pae_Hara_Pipi_Hōngoi_Here_Mahu_Whi-nu_Whi-ra_Haki'.split(
            '_'
        ),
    monthsRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
    monthsStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
    monthsShortRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,
    monthsShortStrictRegex: /(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,
    weekdays: 'Rātapu_Mane_Tūrei_Wenerei_Tāite_Paraire_Hātarei'.split('_'),
    weekdaysShort: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),
    weekdaysMin: 'Ta_Ma_Tū_We_Tāi_Pa_Hā'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY [i] HH:mm',
        LLLL: 'dddd, D MMMM YYYY [i] HH:mm',
    },
    calendar: {
        sameDay: '[i teie mahana, i] LT',
        nextDay: '[apopo i] LT',
        nextWeek: 'dddd [i] LT',
        lastDay: '[inanahi i] LT',
        lastWeek: 'dddd [whakamutunga i] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'i roto i %s',
        past: '%s i mua',
        s: 'te hēkona ruarua',
        ss: '%d hēkona',
        m: 'he meneti',
        mm: '%d meneti',
        h: 'te haora',
        hh: '%d haora',
        d: 'he ra',
        dd: '%d ra',
        M: 'he marama',
        MM: '%d marama',
        y: 'he tau',
        yy: '%d tau',
    },
    dayOfMonthOrdinalParse: /\d{1,2}º/,
    ordinal: '%dº',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Macedonian [mk]
//! author : Borislav Mickov : https://github.com/B0k0
//! author : Sashko Todorov : https://github.com/bkyceh
import moment from '../moment';

export default moment.defineLocale('mk', {
    months: 'јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември'.split(
        '_'
    ),
    monthsShort: 'јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек'.split('_'),
    weekdays: 'недела_понеделник_вторник_среда_четврток_петок_сабота'.split(
        '_'
    ),
    weekdaysShort: 'нед_пон_вто_сре_чет_пет_саб'.split('_'),
    weekdaysMin: 'нe_пo_вт_ср_че_пе_сa'.split('_'),
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'D.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY H:mm',
        LLLL: 'dddd, D MMMM YYYY H:mm',
    },
    calendar: {
        sameDay: '[Денес во] LT',
        nextDay: '[Утре во] LT',
        nextWeek: '[Во] dddd [во] LT',
        lastDay: '[Вчера во] LT',
        lastWeek: function () {
            switch (this.day()) {
                case 0:
                case 3:
                case 6:
                    return '[Изминатата] dddd [во] LT';
                case 1:
                case 2:
                case 4:
                case 5:
                    return '[Изминатиот] dddd [во] LT';
            }
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'за %s',
        past: 'пред %s',
        s: 'неколку секунди',
        ss: '%d секунди',
        m: 'една минута',
        mm: '%d минути',
        h: 'еден час',
        hh: '%d часа',
        d: 'еден ден',
        dd: '%d дена',
        M: 'еден месец',
        MM: '%d месеци',
        y: 'една година',
        yy: '%d години',
    },
    dayOfMonthOrdinalParse: /\d{1,2}-(ев|ен|ти|ви|ри|ми)/,
    ordinal: function (number) {
        var lastDigit = number % 10,
            last2Digits = number % 100;
        if (number === 0) {
            return number + '-ев';
        } else if (last2Digits === 0) {
            return number + '-ен';
        } else if (last2Digits > 10 && last2Digits < 20) {
            return number + '-ти';
        } else if (lastDigit === 1) {
            return number + '-ви';
        } else if (lastDigit === 2) {
            return number + '-ри';
        } else if (lastDigit === 7 || lastDigit === 8) {
            return number + '-ми';
        } else {
            return number + '-ти';
        }
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Malayalam [ml]
//! author : Floyd Pink : https://github.com/floydpink

import moment from '../moment';

export default moment.defineLocale('ml', {
    months: 'ജനുവരി_ഫെബ്രുവരി_മാർച്ച്_ഏപ്രിൽ_മേയ്_ജൂൺ_ജൂലൈ_ഓഗസ്റ്റ്_സെപ്റ്റംബർ_ഒക്ടോബർ_നവംബർ_ഡിസംബർ'.split(
        '_'
    ),
    monthsShort:
        'ജനു._ഫെബ്രു._മാർ._ഏപ്രി._മേയ്_ജൂൺ_ജൂലൈ._ഓഗ._സെപ്റ്റ._ഒക്ടോ._നവം._ഡിസം.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays:
        'ഞായറാഴ്ച_തിങ്കളാഴ്ച_ചൊവ്വാഴ്ച_ബുധനാഴ്ച_വ്യാഴാഴ്ച_വെള്ളിയാഴ്ച_ശനിയാഴ്ച'.split(
            '_'
        ),
    weekdaysShort: 'ഞായർ_തിങ്കൾ_ചൊവ്വ_ബുധൻ_വ്യാഴം_വെള്ളി_ശനി'.split('_'),
    weekdaysMin: 'ഞാ_തി_ചൊ_ബു_വ്യാ_വെ_ശ'.split('_'),
    longDateFormat: {
        LT: 'A h:mm -നു',
        LTS: 'A h:mm:ss -നു',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY, A h:mm -നു',
        LLLL: 'dddd, D MMMM YYYY, A h:mm -നു',
    },
    calendar: {
        sameDay: '[ഇന്ന്] LT',
        nextDay: '[നാളെ] LT',
        nextWeek: 'dddd, LT',
        lastDay: '[ഇന്നലെ] LT',
        lastWeek: '[കഴിഞ്ഞ] dddd, LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s കഴിഞ്ഞ്',
        past: '%s മുൻപ്',
        s: 'അൽപ നിമിഷങ്ങൾ',
        ss: '%d സെക്കൻഡ്',
        m: 'ഒരു മിനിറ്റ്',
        mm: '%d മിനിറ്റ്',
        h: 'ഒരു മണിക്കൂർ',
        hh: '%d മണിക്കൂർ',
        d: 'ഒരു ദിവസം',
        dd: '%d ദിവസം',
        M: 'ഒരു മാസം',
        MM: '%d മാസം',
        y: 'ഒരു വർഷം',
        yy: '%d വർഷം',
    },
    meridiemParse: /രാത്രി|രാവിലെ|ഉച്ച കഴിഞ്ഞ്|വൈകുന്നേരം|രാത്രി/i,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (
            (meridiem === 'രാത്രി' && hour >= 4) ||
            meridiem === 'ഉച്ച കഴിഞ്ഞ്' ||
            meridiem === 'വൈകുന്നേരം'
        ) {
            return hour + 12;
        } else {
            return hour;
        }
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'രാത്രി';
        } else if (hour < 12) {
            return 'രാവിലെ';
        } else if (hour < 17) {
            return 'ഉച്ച കഴിഞ്ഞ്';
        } else if (hour < 20) {
            return 'വൈകുന്നേരം';
        } else {
            return 'രാത്രി';
        }
    },
});
//! moment.js locale configuration
//! locale : Mongolian [mn]
//! author : Javkhlantugs Nyamdorj : https://github.com/javkhaanj7

import moment from '../moment';

function translate(number, withoutSuffix, key, isFuture) {
    switch (key) {
        case 's':
            return withoutSuffix ? 'хэдхэн секунд' : 'хэдхэн секундын';
        case 'ss':
            return number + (withoutSuffix ? ' секунд' : ' секундын');
        case 'm':
        case 'mm':
            return number + (withoutSuffix ? ' минут' : ' минутын');
        case 'h':
        case 'hh':
            return number + (withoutSuffix ? ' цаг' : ' цагийн');
        case 'd':
        case 'dd':
            return number + (withoutSuffix ? ' өдөр' : ' өдрийн');
        case 'M':
        case 'MM':
            return number + (withoutSuffix ? ' сар' : ' сарын');
        case 'y':
        case 'yy':
            return number + (withoutSuffix ? ' жил' : ' жилийн');
        default:
            return number;
    }
}

export default moment.defineLocale('mn', {
    months: 'Нэгдүгээр сар_Хоёрдугаар сар_Гуравдугаар сар_Дөрөвдүгээр сар_Тавдугаар сар_Зургадугаар сар_Долдугаар сар_Наймдугаар сар_Есдүгээр сар_Аравдугаар сар_Арван нэгдүгээр сар_Арван хоёрдугаар сар'.split(
        '_'
    ),
    monthsShort:
        '1 сар_2 сар_3 сар_4 сар_5 сар_6 сар_7 сар_8 сар_9 сар_10 сар_11 сар_12 сар'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'Ням_Даваа_Мягмар_Лхагва_Пүрэв_Баасан_Бямба'.split('_'),
    weekdaysShort: 'Ням_Дав_Мяг_Лха_Пүр_Баа_Бям'.split('_'),
    weekdaysMin: 'Ня_Да_Мя_Лх_Пү_Ба_Бя'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'YYYY-MM-DD',
        LL: 'YYYY оны MMMMын D',
        LLL: 'YYYY оны MMMMын D HH:mm',
        LLLL: 'dddd, YYYY оны MMMMын D HH:mm',
    },
    meridiemParse: /ҮӨ|ҮХ/i,
    isPM: function (input) {
        return input === 'ҮХ';
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return 'ҮӨ';
        } else {
            return 'ҮХ';
        }
    },
    calendar: {
        sameDay: '[Өнөөдөр] LT',
        nextDay: '[Маргааш] LT',
        nextWeek: '[Ирэх] dddd LT',
        lastDay: '[Өчигдөр] LT',
        lastWeek: '[Өнгөрсөн] dddd LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s дараа',
        past: '%s өмнө',
        s: translate,
        ss: translate,
        m: translate,
        mm: translate,
        h: translate,
        hh: translate,
        d: translate,
        dd: translate,
        M: translate,
        MM: translate,
        y: translate,
        yy: translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2} өдөр/,
    ordinal: function (number, period) {
        switch (period) {
            case 'd':
            case 'D':
            case 'DDD':
                return number + ' өдөр';
            default:
                return number;
        }
    },
});
//! moment.js locale configuration
//! locale : Marathi [mr]
//! author : Harshad Kale : https://github.com/kalehv
//! author : Vivek Athalye : https://github.com/vnathalye

import moment from '../moment';

var symbolMap = {
        1: '१',
        2: '२',
        3: '३',
        4: '४',
        5: '५',
        6: '६',
        7: '७',
        8: '८',
        9: '९',
        0: '०',
    },
    numberMap = {
        '१': '1',
        '२': '2',
        '३': '3',
        '४': '4',
        '५': '5',
        '६': '6',
        '७': '7',
        '८': '8',
        '९': '9',
        '०': '0',
    };

function relativeTimeMr(number, withoutSuffix, string, isFuture) {
    var output = '';
    if (withoutSuffix) {
        switch (string) {
            case 's':
                output = 'काही सेकंद';
                break;
            case 'ss':
                output = '%d सेकंद';
                break;
            case 'm':
                output = 'एक मिनिट';
                break;
            case 'mm':
                output = '%d मिनिटे';
                break;
            case 'h':
                output = 'एक तास';
                break;
            case 'hh':
                output = '%d तास';
                break;
            case 'd':
                output = 'एक दिवस';
                break;
            case 'dd':
                output = '%d दिवस';
                break;
            case 'M':
                output = 'एक महिना';
                break;
            case 'MM':
                output = '%d महिने';
                break;
            case 'y':
                output = 'एक वर्ष';
                break;
            case 'yy':
                output = '%d वर्षे';
                break;
        }
    } else {
        switch (string) {
            case 's':
                output = 'काही सेकंदां';
                break;
            case 'ss':
                output = '%d सेकंदां';
                break;
            case 'm':
                output = 'एका मिनिटा';
                break;
            case 'mm':
                output = '%d मिनिटां';
                break;
            case 'h':
                output = 'एका तासा';
                break;
            case 'hh':
                output = '%d तासां';
                break;
            case 'd':
                output = 'एका दिवसा';
                break;
            case 'dd':
                output = '%d दिवसां';
                break;
            case 'M':
                output = 'एका महिन्या';
                break;
            case 'MM':
                output = '%d महिन्यां';
                break;
            case 'y':
                output = 'एका वर्षा';
                break;
            case 'yy':
                output = '%d वर्षां';
                break;
        }
    }
    return output.replace(/%d/i, number);
}

export default moment.defineLocale('mr', {
    months: 'जानेवारी_फेब्रुवारी_मार्च_एप्रिल_मे_जून_जुलै_ऑगस्ट_सप्टेंबर_ऑक्टोबर_नोव्हेंबर_डिसेंबर'.split(
        '_'
    ),
    monthsShort:
        'जाने._फेब्रु._मार्च._एप्रि._मे._जून._जुलै._ऑग._सप्टें._ऑक्टो._नोव्हें._डिसें.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'रविवार_सोमवार_मंगळवार_बुधवार_गुरूवार_शुक्रवार_शनिवार'.split('_'),
    weekdaysShort: 'रवि_सोम_मंगळ_बुध_गुरू_शुक्र_शनि'.split('_'),
    weekdaysMin: 'र_सो_मं_बु_गु_शु_श'.split('_'),
    longDateFormat: {
        LT: 'A h:mm वाजता',
        LTS: 'A h:mm:ss वाजता',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY, A h:mm वाजता',
        LLLL: 'dddd, D MMMM YYYY, A h:mm वाजता',
    },
    calendar: {
        sameDay: '[आज] LT',
        nextDay: '[उद्या] LT',
        nextWeek: 'dddd, LT',
        lastDay: '[काल] LT',
        lastWeek: '[मागील] dddd, LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%sमध्ये',
        past: '%sपूर्वी',
        s: relativeTimeMr,
        ss: relativeTimeMr,
        m: relativeTimeMr,
        mm: relativeTimeMr,
        h: relativeTimeMr,
        hh: relativeTimeMr,
        d: relativeTimeMr,
        dd: relativeTimeMr,
        M: relativeTimeMr,
        MM: relativeTimeMr,
        y: relativeTimeMr,
        yy: relativeTimeMr,
    },
    preparse: function (string) {
        return string.replace(/[१२३४५६७८९०]/g, function (match) {
            return numberMap[match];
        });
    },
    postformat: function (string) {
        return string.replace(/\d/g, function (match) {
            return symbolMap[match];
        });
    },
    meridiemParse: /पहाटे|सकाळी|दुपारी|सायंकाळी|रात्री/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'पहाटे' || meridiem === 'सकाळी') {
            return hour;
        } else if (
            meridiem === 'दुपारी' ||
            meridiem === 'सायंकाळी' ||
            meridiem === 'रात्री'
        ) {
            return hour >= 12 ? hour : hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        if (hour >= 0 && hour < 6) {
            return 'पहाटे';
        } else if (hour < 12) {
            return 'सकाळी';
        } else if (hour < 17) {
            return 'दुपारी';
        } else if (hour < 20) {
            return 'सायंकाळी';
        } else {
            return 'रात्री';
        }
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Malay [ms-my]
//! note : DEPRECATED, the correct one is [ms]
//! author : Weldan Jamili : https://github.com/weldan

import moment from '../moment';

export default moment.defineLocale('ms-my', {
    months: 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),
    weekdays: 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),
    weekdaysShort: 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),
    weekdaysMin: 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
    longDateFormat: {
        LT: 'HH.mm',
        LTS: 'HH.mm.ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY [pukul] HH.mm',
        LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',
    },
    meridiemParse: /pagi|tengahari|petang|malam/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'pagi') {
            return hour;
        } else if (meridiem === 'tengahari') {
            return hour >= 11 ? hour : hour + 12;
        } else if (meridiem === 'petang' || meridiem === 'malam') {
            return hour + 12;
        }
    },
    meridiem: function (hours, minutes, isLower) {
        if (hours < 11) {
            return 'pagi';
        } else if (hours < 15) {
            return 'tengahari';
        } else if (hours < 19) {
            return 'petang';
        } else {
            return 'malam';
        }
    },
    calendar: {
        sameDay: '[Hari ini pukul] LT',
        nextDay: '[Esok pukul] LT',
        nextWeek: 'dddd [pukul] LT',
        lastDay: '[Kelmarin pukul] LT',
        lastWeek: 'dddd [lepas pukul] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'dalam %s',
        past: '%s yang lepas',
        s: 'beberapa saat',
        ss: '%d saat',
        m: 'seminit',
        mm: '%d minit',
        h: 'sejam',
        hh: '%d jam',
        d: 'sehari',
        dd: '%d hari',
        M: 'sebulan',
        MM: '%d bulan',
        y: 'setahun',
        yy: '%d tahun',
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Malay [ms]
//! author : Weldan Jamili : https://github.com/weldan

import moment from '../moment';

export default moment.defineLocale('ms', {
    months: 'Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis'.split('_'),
    weekdays: 'Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu'.split('_'),
    weekdaysShort: 'Ahd_Isn_Sel_Rab_Kha_Jum_Sab'.split('_'),
    weekdaysMin: 'Ah_Is_Sl_Rb_Km_Jm_Sb'.split('_'),
    longDateFormat: {
        LT: 'HH.mm',
        LTS: 'HH.mm.ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY [pukul] HH.mm',
        LLLL: 'dddd, D MMMM YYYY [pukul] HH.mm',
    },
    meridiemParse: /pagi|tengahari|petang|malam/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'pagi') {
            return hour;
        } else if (meridiem === 'tengahari') {
            return hour >= 11 ? hour : hour + 12;
        } else if (meridiem === 'petang' || meridiem === 'malam') {
            return hour + 12;
        }
    },
    meridiem: function (hours, minutes, isLower) {
        if (hours < 11) {
            return 'pagi';
        } else if (hours < 15) {
            return 'tengahari';
        } else if (hours < 19) {
            return 'petang';
        } else {
            return 'malam';
        }
    },
    calendar: {
        sameDay: '[Hari ini pukul] LT',
        nextDay: '[Esok pukul] LT',
        nextWeek: 'dddd [pukul] LT',
        lastDay: '[Kelmarin pukul] LT',
        lastWeek: 'dddd [lepas pukul] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'dalam %s',
        past: '%s yang lepas',
        s: 'beberapa saat',
        ss: '%d saat',
        m: 'seminit',
        mm: '%d minit',
        h: 'sejam',
        hh: '%d jam',
        d: 'sehari',
        dd: '%d hari',
        M: 'sebulan',
        MM: '%d bulan',
        y: 'setahun',
        yy: '%d tahun',
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Maltese (Malta) [mt]
//! author : Alessandro Maruccia : https://github.com/alesma

import moment from '../moment';

export default moment.defineLocale('mt', {
    months: 'Jannar_Frar_Marzu_April_Mejju_Ġunju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Diċembru'.split(
        '_'
    ),
    monthsShort: 'Jan_Fra_Mar_Apr_Mej_Ġun_Lul_Aww_Set_Ott_Nov_Diċ'.split('_'),
    weekdays:
        'Il-Ħadd_It-Tnejn_It-Tlieta_L-Erbgħa_Il-Ħamis_Il-Ġimgħa_Is-Sibt'.split(
            '_'
        ),
    weekdaysShort: 'Ħad_Tne_Tli_Erb_Ħam_Ġim_Sib'.split('_'),
    weekdaysMin: 'Ħa_Tn_Tl_Er_Ħa_Ġi_Si'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Illum fil-]LT',
        nextDay: '[Għada fil-]LT',
        nextWeek: 'dddd [fil-]LT',
        lastDay: '[Il-bieraħ fil-]LT',
        lastWeek: 'dddd [li għadda] [fil-]LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'f’ %s',
        past: '%s ilu',
        s: 'ftit sekondi',
        ss: '%d sekondi',
        m: 'minuta',
        mm: '%d minuti',
        h: 'siegħa',
        hh: '%d siegħat',
        d: 'ġurnata',
        dd: '%d ġranet',
        M: 'xahar',
        MM: '%d xhur',
        y: 'sena',
        yy: '%d sni',
    },
    dayOfMonthOrdinalParse: /\d{1,2}º/,
    ordinal: '%dº',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Burmese [my]
//! author : Squar team, mysquar.com
//! author : David Rossellat : https://github.com/gholadr
//! author : Tin Aung Lin : https://github.com/thanyawzinmin

import moment from '../moment';

var symbolMap = {
        1: '၁',
        2: '၂',
        3: '၃',
        4: '၄',
        5: '၅',
        6: '၆',
        7: '၇',
        8: '၈',
        9: '၉',
        0: '၀',
    },
    numberMap = {
        '၁': '1',
        '၂': '2',
        '၃': '3',
        '၄': '4',
        '၅': '5',
        '၆': '6',
        '၇': '7',
        '၈': '8',
        '၉': '9',
        '၀': '0',
    };

export default moment.defineLocale('my', {
    months: 'ဇန်နဝါရီ_ဖေဖော်ဝါရီ_မတ်_ဧပြီ_မေ_ဇွန်_ဇူလိုင်_သြဂုတ်_စက်တင်ဘာ_အောက်တိုဘာ_နိုဝင်ဘာ_ဒီဇင်ဘာ'.split(
        '_'
    ),
    monthsShort: 'ဇန်_ဖေ_မတ်_ပြီ_မေ_ဇွန်_လိုင်_သြ_စက်_အောက်_နို_ဒီ'.split('_'),
    weekdays: 'တနင်္ဂနွေ_တနင်္လာ_အင်္ဂါ_ဗုဒ္ဓဟူး_ကြာသပတေး_သောကြာ_စနေ'.split(
        '_'
    ),
    weekdaysShort: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),
    weekdaysMin: 'နွေ_လာ_ဂါ_ဟူး_ကြာ_သော_နေ'.split('_'),

    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[ယနေ.] LT [မှာ]',
        nextDay: '[မနက်ဖြန်] LT [မှာ]',
        nextWeek: 'dddd LT [မှာ]',
        lastDay: '[မနေ.က] LT [မှာ]',
        lastWeek: '[ပြီးခဲ့သော] dddd LT [မှာ]',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'လာမည့် %s မှာ',
        past: 'လွန်ခဲ့သော %s က',
        s: 'စက္ကန်.အနည်းငယ်',
        ss: '%d စက္ကန့်',
        m: 'တစ်မိနစ်',
        mm: '%d မိနစ်',
        h: 'တစ်နာရီ',
        hh: '%d နာရီ',
        d: 'တစ်ရက်',
        dd: '%d ရက်',
        M: 'တစ်လ',
        MM: '%d လ',
        y: 'တစ်နှစ်',
        yy: '%d နှစ်',
    },
    preparse: function (string) {
        return string.replace(/[၁၂၃၄၅၆၇၈၉၀]/g, function (match) {
            return numberMap[match];
        });
    },
    postformat: function (string) {
        return string.replace(/\d/g, function (match) {
            return symbolMap[match];
        });
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Norwegian Bokmål [nb]
//! authors : Espen Hovlandsdal : https://github.com/rexxars
//!           Sigurd Gartmann : https://github.com/sigurdga
//!           Stephen Ramthun : https://github.com/stephenramthun

import moment from '../moment';

export default moment.defineLocale('nb', {
    months: 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split(
        '_'
    ),
    monthsShort:
        'jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),
    monthsParseExact: true,
    weekdays: 'søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag'.split('_'),
    weekdaysShort: 'sø._ma._ti._on._to._fr._lø.'.split('_'),
    weekdaysMin: 'sø_ma_ti_on_to_fr_lø'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY [kl.] HH:mm',
        LLLL: 'dddd D. MMMM YYYY [kl.] HH:mm',
    },
    calendar: {
        sameDay: '[i dag kl.] LT',
        nextDay: '[i morgen kl.] LT',
        nextWeek: 'dddd [kl.] LT',
        lastDay: '[i går kl.] LT',
        lastWeek: '[forrige] dddd [kl.] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'om %s',
        past: '%s siden',
        s: 'noen sekunder',
        ss: '%d sekunder',
        m: 'ett minutt',
        mm: '%d minutter',
        h: 'en time',
        hh: '%d timer',
        d: 'en dag',
        dd: '%d dager',
        w: 'en uke',
        ww: '%d uker',
        M: 'en måned',
        MM: '%d måneder',
        y: 'ett år',
        yy: '%d år',
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Nepalese [ne]
//! author : suvash : https://github.com/suvash

import moment from '../moment';

var symbolMap = {
        1: '१',
        2: '२',
        3: '३',
        4: '४',
        5: '५',
        6: '६',
        7: '७',
        8: '८',
        9: '९',
        0: '०',
    },
    numberMap = {
        '१': '1',
        '२': '2',
        '३': '3',
        '४': '4',
        '५': '5',
        '६': '6',
        '७': '7',
        '८': '8',
        '९': '9',
        '०': '0',
    };

export default moment.defineLocale('ne', {
    months: 'जनवरी_फेब्रुवरी_मार्च_अप्रिल_मई_जुन_जुलाई_अगष्ट_सेप्टेम्बर_अक्टोबर_नोभेम्बर_डिसेम्बर'.split(
        '_'
    ),
    monthsShort:
        'जन._फेब्रु._मार्च_अप्रि._मई_जुन_जुलाई._अग._सेप्ट._अक्टो._नोभे._डिसे.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'आइतबार_सोमबार_मङ्गलबार_बुधबार_बिहिबार_शुक्रबार_शनिबार'.split(
        '_'
    ),
    weekdaysShort: 'आइत._सोम._मङ्गल._बुध._बिहि._शुक्र._शनि.'.split('_'),
    weekdaysMin: 'आ._सो._मं._बु._बि._शु._श.'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'Aको h:mm बजे',
        LTS: 'Aको h:mm:ss बजे',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY, Aको h:mm बजे',
        LLLL: 'dddd, D MMMM YYYY, Aको h:mm बजे',
    },
    preparse: function (string) {
        return string.replace(/[१२३४५६७८९०]/g, function (match) {
            return numberMap[match];
        });
    },
    postformat: function (string) {
        return string.replace(/\d/g, function (match) {
            return symbolMap[match];
        });
    },
    meridiemParse: /राति|बिहान|दिउँसो|साँझ/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'राति') {
            return hour < 4 ? hour : hour + 12;
        } else if (meridiem === 'बिहान') {
            return hour;
        } else if (meridiem === 'दिउँसो') {
            return hour >= 10 ? hour : hour + 12;
        } else if (meridiem === 'साँझ') {
            return hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 3) {
            return 'राति';
        } else if (hour < 12) {
            return 'बिहान';
        } else if (hour < 16) {
            return 'दिउँसो';
        } else if (hour < 20) {
            return 'साँझ';
        } else {
            return 'राति';
        }
    },
    calendar: {
        sameDay: '[आज] LT',
        nextDay: '[भोलि] LT',
        nextWeek: '[आउँदो] dddd[,] LT',
        lastDay: '[हिजो] LT',
        lastWeek: '[गएको] dddd[,] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%sमा',
        past: '%s अगाडि',
        s: 'केही क्षण',
        ss: '%d सेकेण्ड',
        m: 'एक मिनेट',
        mm: '%d मिनेट',
        h: 'एक घण्टा',
        hh: '%d घण्टा',
        d: 'एक दिन',
        dd: '%d दिन',
        M: 'एक महिना',
        MM: '%d महिना',
        y: 'एक बर्ष',
        yy: '%d बर्ष',
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Dutch (Belgium) [nl-be]
//! author : Joris Röling : https://github.com/jorisroling
//! author : Jacob Middag : https://github.com/middagj

import moment from '../moment';

var monthsShortWithDots =
        'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),
    monthsShortWithoutDots =
        'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'),
    monthsParse = [
        /^jan/i,
        /^feb/i,
        /^maart|mrt.?$/i,
        /^apr/i,
        /^mei$/i,
        /^jun[i.]?$/i,
        /^jul[i.]?$/i,
        /^aug/i,
        /^sep/i,
        /^okt/i,
        /^nov/i,
        /^dec/i,
    ],
    monthsRegex =
        /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;

export default moment.defineLocale('nl-be', {
    months: 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split(
        '_'
    ),
    monthsShort: function (m, format) {
        if (!m) {
            return monthsShortWithDots;
        } else if (/-MMM-/.test(format)) {
            return monthsShortWithoutDots[m.month()];
        } else {
            return monthsShortWithDots[m.month()];
        }
    },

    monthsRegex: monthsRegex,
    monthsShortRegex: monthsRegex,
    monthsStrictRegex:
        /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,
    monthsShortStrictRegex:
        /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,

    monthsParse: monthsParse,
    longMonthsParse: monthsParse,
    shortMonthsParse: monthsParse,

    weekdays:
        'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
    weekdaysShort: 'zo._ma._di._wo._do._vr._za.'.split('_'),
    weekdaysMin: 'zo_ma_di_wo_do_vr_za'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[vandaag om] LT',
        nextDay: '[morgen om] LT',
        nextWeek: 'dddd [om] LT',
        lastDay: '[gisteren om] LT',
        lastWeek: '[afgelopen] dddd [om] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'over %s',
        past: '%s geleden',
        s: 'een paar seconden',
        ss: '%d seconden',
        m: 'één minuut',
        mm: '%d minuten',
        h: 'één uur',
        hh: '%d uur',
        d: 'één dag',
        dd: '%d dagen',
        M: 'één maand',
        MM: '%d maanden',
        y: 'één jaar',
        yy: '%d jaar',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/,
    ordinal: function (number) {
        return (
            number +
            (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')
        );
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Dutch [nl]
//! author : Joris Röling : https://github.com/jorisroling
//! author : Jacob Middag : https://github.com/middagj

import moment from '../moment';

var monthsShortWithDots =
        'jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.'.split('_'),
    monthsShortWithoutDots =
        'jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec'.split('_'),
    monthsParse = [
        /^jan/i,
        /^feb/i,
        /^maart|mrt.?$/i,
        /^apr/i,
        /^mei$/i,
        /^jun[i.]?$/i,
        /^jul[i.]?$/i,
        /^aug/i,
        /^sep/i,
        /^okt/i,
        /^nov/i,
        /^dec/i,
    ],
    monthsRegex =
        /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;

export default moment.defineLocale('nl', {
    months: 'januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december'.split(
        '_'
    ),
    monthsShort: function (m, format) {
        if (!m) {
            return monthsShortWithDots;
        } else if (/-MMM-/.test(format)) {
            return monthsShortWithoutDots[m.month()];
        } else {
            return monthsShortWithDots[m.month()];
        }
    },

    monthsRegex: monthsRegex,
    monthsShortRegex: monthsRegex,
    monthsStrictRegex:
        /^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,
    monthsShortStrictRegex:
        /^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,

    monthsParse: monthsParse,
    longMonthsParse: monthsParse,
    shortMonthsParse: monthsParse,

    weekdays:
        'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
    weekdaysShort: 'zo._ma._di._wo._do._vr._za.'.split('_'),
    weekdaysMin: 'zo_ma_di_wo_do_vr_za'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD-MM-YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[vandaag om] LT',
        nextDay: '[morgen om] LT',
        nextWeek: 'dddd [om] LT',
        lastDay: '[gisteren om] LT',
        lastWeek: '[afgelopen] dddd [om] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'over %s',
        past: '%s geleden',
        s: 'een paar seconden',
        ss: '%d seconden',
        m: 'één minuut',
        mm: '%d minuten',
        h: 'één uur',
        hh: '%d uur',
        d: 'één dag',
        dd: '%d dagen',
        w: 'één week',
        ww: '%d weken',
        M: 'één maand',
        MM: '%d maanden',
        y: 'één jaar',
        yy: '%d jaar',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(ste|de)/,
    ordinal: function (number) {
        return (
            number +
            (number === 1 || number === 8 || number >= 20 ? 'ste' : 'de')
        );
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Nynorsk [nn]
//! authors : https://github.com/mechuwind
//!           Stephen Ramthun : https://github.com/stephenramthun

import moment from '../moment';

export default moment.defineLocale('nn', {
    months: 'januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember'.split(
        '_'
    ),
    monthsShort:
        'jan._feb._mars_apr._mai_juni_juli_aug._sep._okt._nov._des.'.split('_'),
    monthsParseExact: true,
    weekdays: 'sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag'.split('_'),
    weekdaysShort: 'su._må._ty._on._to._fr._lau.'.split('_'),
    weekdaysMin: 'su_må_ty_on_to_fr_la'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY [kl.] H:mm',
        LLLL: 'dddd D. MMMM YYYY [kl.] HH:mm',
    },
    calendar: {
        sameDay: '[I dag klokka] LT',
        nextDay: '[I morgon klokka] LT',
        nextWeek: 'dddd [klokka] LT',
        lastDay: '[I går klokka] LT',
        lastWeek: '[Føregåande] dddd [klokka] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'om %s',
        past: '%s sidan',
        s: 'nokre sekund',
        ss: '%d sekund',
        m: 'eit minutt',
        mm: '%d minutt',
        h: 'ein time',
        hh: '%d timar',
        d: 'ein dag',
        dd: '%d dagar',
        w: 'ei veke',
        ww: '%d veker',
        M: 'ein månad',
        MM: '%d månader',
        y: 'eit år',
        yy: '%d år',
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Occitan, lengadocian dialecte [oc-lnc]
//! author : Quentin PAGÈS : https://github.com/Quenty31

import moment from '../moment';

export default moment.defineLocale('oc-lnc', {
    months: {
        standalone:
            'genièr_febrièr_març_abril_mai_junh_julhet_agost_setembre_octòbre_novembre_decembre'.split(
                '_'
            ),
        format: "de genièr_de febrièr_de març_d'abril_de mai_de junh_de julhet_d'agost_de setembre_d'octòbre_de novembre_de decembre".split(
            '_'
        ),
        isFormat: /D[oD]?(\s)+MMMM/,
    },
    monthsShort:
        'gen._febr._març_abr._mai_junh_julh._ago._set._oct._nov._dec.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'dimenge_diluns_dimars_dimècres_dijòus_divendres_dissabte'.split(
        '_'
    ),
    weekdaysShort: 'dg._dl._dm._dc._dj._dv._ds.'.split('_'),
    weekdaysMin: 'dg_dl_dm_dc_dj_dv_ds'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM [de] YYYY',
        ll: 'D MMM YYYY',
        LLL: 'D MMMM [de] YYYY [a] H:mm',
        lll: 'D MMM YYYY, H:mm',
        LLLL: 'dddd D MMMM [de] YYYY [a] H:mm',
        llll: 'ddd D MMM YYYY, H:mm',
    },
    calendar: {
        sameDay: '[uèi a] LT',
        nextDay: '[deman a] LT',
        nextWeek: 'dddd [a] LT',
        lastDay: '[ièr a] LT',
        lastWeek: 'dddd [passat a] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: "d'aquí %s",
        past: 'fa %s',
        s: 'unas segondas',
        ss: '%d segondas',
        m: 'una minuta',
        mm: '%d minutas',
        h: 'una ora',
        hh: '%d oras',
        d: 'un jorn',
        dd: '%d jorns',
        M: 'un mes',
        MM: '%d meses',
        y: 'un an',
        yy: '%d ans',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(r|n|t|è|a)/,
    ordinal: function (number, period) {
        var output =
            number === 1
                ? 'r'
                : number === 2
                ? 'n'
                : number === 3
                ? 'r'
                : number === 4
                ? 't'
                : 'è';
        if (period === 'w' || period === 'W') {
            output = 'a';
        }
        return number + output;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4,
    },
});
//! moment.js locale configuration
//! locale : Punjabi (India) [pa-in]
//! author : Harpreet Singh : https://github.com/harpreetkhalsagtbit

import moment from '../moment';

var symbolMap = {
        1: '੧',
        2: '੨',
        3: '੩',
        4: '੪',
        5: '੫',
        6: '੬',
        7: '੭',
        8: '੮',
        9: '੯',
        0: '੦',
    },
    numberMap = {
        '੧': '1',
        '੨': '2',
        '੩': '3',
        '੪': '4',
        '੫': '5',
        '੬': '6',
        '੭': '7',
        '੮': '8',
        '੯': '9',
        '੦': '0',
    };

export default moment.defineLocale('pa-in', {
    // There are months name as per Nanakshahi Calendar but they are not used as rigidly in modern Punjabi.
    months: 'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split(
        '_'
    ),
    monthsShort:
        'ਜਨਵਰੀ_ਫ਼ਰਵਰੀ_ਮਾਰਚ_ਅਪ੍ਰੈਲ_ਮਈ_ਜੂਨ_ਜੁਲਾਈ_ਅਗਸਤ_ਸਤੰਬਰ_ਅਕਤੂਬਰ_ਨਵੰਬਰ_ਦਸੰਬਰ'.split(
            '_'
        ),
    weekdays: 'ਐਤਵਾਰ_ਸੋਮਵਾਰ_ਮੰਗਲਵਾਰ_ਬੁਧਵਾਰ_ਵੀਰਵਾਰ_ਸ਼ੁੱਕਰਵਾਰ_ਸ਼ਨੀਚਰਵਾਰ'.split(
        '_'
    ),
    weekdaysShort: 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),
    weekdaysMin: 'ਐਤ_ਸੋਮ_ਮੰਗਲ_ਬੁਧ_ਵੀਰ_ਸ਼ੁਕਰ_ਸ਼ਨੀ'.split('_'),
    longDateFormat: {
        LT: 'A h:mm ਵਜੇ',
        LTS: 'A h:mm:ss ਵਜੇ',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY, A h:mm ਵਜੇ',
        LLLL: 'dddd, D MMMM YYYY, A h:mm ਵਜੇ',
    },
    calendar: {
        sameDay: '[ਅਜ] LT',
        nextDay: '[ਕਲ] LT',
        nextWeek: '[ਅਗਲਾ] dddd, LT',
        lastDay: '[ਕਲ] LT',
        lastWeek: '[ਪਿਛਲੇ] dddd, LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s ਵਿੱਚ',
        past: '%s ਪਿਛਲੇ',
        s: 'ਕੁਝ ਸਕਿੰਟ',
        ss: '%d ਸਕਿੰਟ',
        m: 'ਇਕ ਮਿੰਟ',
        mm: '%d ਮਿੰਟ',
        h: 'ਇੱਕ ਘੰਟਾ',
        hh: '%d ਘੰਟੇ',
        d: 'ਇੱਕ ਦਿਨ',
        dd: '%d ਦਿਨ',
        M: 'ਇੱਕ ਮਹੀਨਾ',
        MM: '%d ਮਹੀਨੇ',
        y: 'ਇੱਕ ਸਾਲ',
        yy: '%d ਸਾਲ',
    },
    preparse: function (string) {
        return string.replace(/[੧੨੩੪੫੬੭੮੯੦]/g, function (match) {
            return numberMap[match];
        });
    },
    postformat: function (string) {
        return string.replace(/\d/g, function (match) {
            return symbolMap[match];
        });
    },
    // Punjabi notation for meridiems are quite fuzzy in practice. While there exists
    // a rigid notion of a 'Pahar' it is not used as rigidly in modern Punjabi.
    meridiemParse: /ਰਾਤ|ਸਵੇਰ|ਦੁਪਹਿਰ|ਸ਼ਾਮ/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'ਰਾਤ') {
            return hour < 4 ? hour : hour + 12;
        } else if (meridiem === 'ਸਵੇਰ') {
            return hour;
        } else if (meridiem === 'ਦੁਪਹਿਰ') {
            return hour >= 10 ? hour : hour + 12;
        } else if (meridiem === 'ਸ਼ਾਮ') {
            return hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'ਰਾਤ';
        } else if (hour < 10) {
            return 'ਸਵੇਰ';
        } else if (hour < 17) {
            return 'ਦੁਪਹਿਰ';
        } else if (hour < 20) {
            return 'ਸ਼ਾਮ';
        } else {
            return 'ਰਾਤ';
        }
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Polish [pl]
//! author : Rafal Hirsz : https://github.com/evoL

import moment from '../moment';

var monthsNominative =
        'styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień'.split(
            '_'
        ),
    monthsSubjective =
        'stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia'.split(
            '_'
        ),
    monthsParse = [
        /^sty/i,
        /^lut/i,
        /^mar/i,
        /^kwi/i,
        /^maj/i,
        /^cze/i,
        /^lip/i,
        /^sie/i,
        /^wrz/i,
        /^paź/i,
        /^lis/i,
        /^gru/i,
    ];
function plural(n) {
    return n % 10 < 5 && n % 10 > 1 && ~~(n / 10) % 10 !== 1;
}
function translate(number, withoutSuffix, key) {
    var result = number + ' ';
    switch (key) {
        case 'ss':
            return result + (plural(number) ? 'sekundy' : 'sekund');
        case 'm':
            return withoutSuffix ? 'minuta' : 'minutę';
        case 'mm':
            return result + (plural(number) ? 'minuty' : 'minut');
        case 'h':
            return withoutSuffix ? 'godzina' : 'godzinę';
        case 'hh':
            return result + (plural(number) ? 'godziny' : 'godzin');
        case 'ww':
            return result + (plural(number) ? 'tygodnie' : 'tygodni');
        case 'MM':
            return result + (plural(number) ? 'miesiące' : 'miesięcy');
        case 'yy':
            return result + (plural(number) ? 'lata' : 'lat');
    }
}

export default moment.defineLocale('pl', {
    months: function (momentToFormat, format) {
        if (!momentToFormat) {
            return monthsNominative;
        } else if (/D MMMM/.test(format)) {
            return monthsSubjective[momentToFormat.month()];
        } else {
            return monthsNominative[momentToFormat.month()];
        }
    },
    monthsShort: 'sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru'.split('_'),
    monthsParse: monthsParse,
    longMonthsParse: monthsParse,
    shortMonthsParse: monthsParse,
    weekdays:
        'niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota'.split('_'),
    weekdaysShort: 'ndz_pon_wt_śr_czw_pt_sob'.split('_'),
    weekdaysMin: 'Nd_Pn_Wt_Śr_Cz_Pt_So'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Dziś o] LT',
        nextDay: '[Jutro o] LT',
        nextWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[W niedzielę o] LT';

                case 2:
                    return '[We wtorek o] LT';

                case 3:
                    return '[W środę o] LT';

                case 6:
                    return '[W sobotę o] LT';

                default:
                    return '[W] dddd [o] LT';
            }
        },
        lastDay: '[Wczoraj o] LT',
        lastWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[W zeszłą niedzielę o] LT';
                case 3:
                    return '[W zeszłą środę o] LT';
                case 6:
                    return '[W zeszłą sobotę o] LT';
                default:
                    return '[W zeszły] dddd [o] LT';
            }
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'za %s',
        past: '%s temu',
        s: 'kilka sekund',
        ss: translate,
        m: translate,
        mm: translate,
        h: translate,
        hh: translate,
        d: '1 dzień',
        dd: '%d dni',
        w: 'tydzień',
        ww: translate,
        M: 'miesiąc',
        MM: translate,
        y: 'rok',
        yy: translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Portuguese (Brazil) [pt-br]
//! author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira

import moment from '../moment';

export default moment.defineLocale('pt-br', {
    months: 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split(
        '_'
    ),
    monthsShort: 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),
    weekdays:
        'domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado'.split(
            '_'
        ),
    weekdaysShort: 'dom_seg_ter_qua_qui_sex_sáb'.split('_'),
    weekdaysMin: 'do_2ª_3ª_4ª_5ª_6ª_sá'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D [de] MMMM [de] YYYY',
        LLL: 'D [de] MMMM [de] YYYY [às] HH:mm',
        LLLL: 'dddd, D [de] MMMM [de] YYYY [às] HH:mm',
    },
    calendar: {
        sameDay: '[Hoje às] LT',
        nextDay: '[Amanhã às] LT',
        nextWeek: 'dddd [às] LT',
        lastDay: '[Ontem às] LT',
        lastWeek: function () {
            return this.day() === 0 || this.day() === 6
                ? '[Último] dddd [às] LT' // Saturday + Sunday
                : '[Última] dddd [às] LT'; // Monday - Friday
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'em %s',
        past: 'há %s',
        s: 'poucos segundos',
        ss: '%d segundos',
        m: 'um minuto',
        mm: '%d minutos',
        h: 'uma hora',
        hh: '%d horas',
        d: 'um dia',
        dd: '%d dias',
        M: 'um mês',
        MM: '%d meses',
        y: 'um ano',
        yy: '%d anos',
    },
    dayOfMonthOrdinalParse: /\d{1,2}º/,
    ordinal: '%dº',
    invalidDate: 'Data inválida',
});
//! moment.js locale configuration
//! locale : Portuguese [pt]
//! author : Jefferson : https://github.com/jalex79

import moment from '../moment';

export default moment.defineLocale('pt', {
    months: 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split(
        '_'
    ),
    monthsShort: 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),
    weekdays:
        'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split(
            '_'
        ),
    weekdaysShort: 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),
    weekdaysMin: 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D [de] MMMM [de] YYYY',
        LLL: 'D [de] MMMM [de] YYYY HH:mm',
        LLLL: 'dddd, D [de] MMMM [de] YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Hoje às] LT',
        nextDay: '[Amanhã às] LT',
        nextWeek: 'dddd [às] LT',
        lastDay: '[Ontem às] LT',
        lastWeek: function () {
            return this.day() === 0 || this.day() === 6
                ? '[Último] dddd [às] LT' // Saturday + Sunday
                : '[Última] dddd [às] LT'; // Monday - Friday
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'em %s',
        past: 'há %s',
        s: 'segundos',
        ss: '%d segundos',
        m: 'um minuto',
        mm: '%d minutos',
        h: 'uma hora',
        hh: '%d horas',
        d: 'um dia',
        dd: '%d dias',
        w: 'uma semana',
        ww: '%d semanas',
        M: 'um mês',
        MM: '%d meses',
        y: 'um ano',
        yy: '%d anos',
    },
    dayOfMonthOrdinalParse: /\d{1,2}º/,
    ordinal: '%dº',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Romanian [ro]
//! author : Vlad Gurdiga : https://github.com/gurdiga
//! author : Valentin Agachi : https://github.com/avaly
//! author : Emanuel Cepoi : https://github.com/cepem

import moment from '../moment';

function relativeTimeWithPlural(number, withoutSuffix, key) {
    var format = {
            ss: 'secunde',
            mm: 'minute',
            hh: 'ore',
            dd: 'zile',
            ww: 'săptămâni',
            MM: 'luni',
            yy: 'ani',
        },
        separator = ' ';
    if (number % 100 >= 20 || (number >= 100 && number % 100 === 0)) {
        separator = ' de ';
    }
    return number + separator + format[key];
}

export default moment.defineLocale('ro', {
    months: 'ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie'.split(
        '_'
    ),
    monthsShort:
        'ian._feb._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'duminică_luni_marți_miercuri_joi_vineri_sâmbătă'.split('_'),
    weekdaysShort: 'Dum_Lun_Mar_Mie_Joi_Vin_Sâm'.split('_'),
    weekdaysMin: 'Du_Lu_Ma_Mi_Jo_Vi_Sâ'.split('_'),
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY H:mm',
        LLLL: 'dddd, D MMMM YYYY H:mm',
    },
    calendar: {
        sameDay: '[azi la] LT',
        nextDay: '[mâine la] LT',
        nextWeek: 'dddd [la] LT',
        lastDay: '[ieri la] LT',
        lastWeek: '[fosta] dddd [la] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'peste %s',
        past: '%s în urmă',
        s: 'câteva secunde',
        ss: relativeTimeWithPlural,
        m: 'un minut',
        mm: relativeTimeWithPlural,
        h: 'o oră',
        hh: relativeTimeWithPlural,
        d: 'o zi',
        dd: relativeTimeWithPlural,
        w: 'o săptămână',
        ww: relativeTimeWithPlural,
        M: 'o lună',
        MM: relativeTimeWithPlural,
        y: 'un an',
        yy: relativeTimeWithPlural,
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Russian [ru]
//! author : Viktorminator : https://github.com/Viktorminator
//! author : Menelion Elensúle : https://github.com/Oire
//! author : Коренберг Марк : https://github.com/socketpair

import moment from '../moment';

function plural(word, num) {
    var forms = word.split('_');
    return num % 10 === 1 && num % 100 !== 11
        ? forms[0]
        : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20)
        ? forms[1]
        : forms[2];
}
function relativeTimeWithPlural(number, withoutSuffix, key) {
    var format = {
        ss: withoutSuffix ? 'секунда_секунды_секунд' : 'секунду_секунды_секунд',
        mm: withoutSuffix ? 'минута_минуты_минут' : 'минуту_минуты_минут',
        hh: 'час_часа_часов',
        dd: 'день_дня_дней',
        ww: 'неделя_недели_недель',
        MM: 'месяц_месяца_месяцев',
        yy: 'год_года_лет',
    };
    if (key === 'm') {
        return withoutSuffix ? 'минута' : 'минуту';
    } else {
        return number + ' ' + plural(format[key], +number);
    }
}
var monthsParse = [
    /^янв/i,
    /^фев/i,
    /^мар/i,
    /^апр/i,
    /^ма[йя]/i,
    /^июн/i,
    /^июл/i,
    /^авг/i,
    /^сен/i,
    /^окт/i,
    /^ноя/i,
    /^дек/i,
];

// http://new.gramota.ru/spravka/rules/139-prop : § 103
// Сокращения месяцев: http://new.gramota.ru/spravka/buro/search-answer?s=242637
// CLDR data:          http://www.unicode.org/cldr/charts/28/summary/ru.html#1753
export default moment.defineLocale('ru', {
    months: {
        format: 'января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря'.split(
            '_'
        ),
        standalone:
            'январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь'.split(
                '_'
            ),
    },
    monthsShort: {
        // по CLDR именно "июл." и "июн.", но какой смысл менять букву на точку?
        format: 'янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.'.split(
            '_'
        ),
        standalone:
            'янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.'.split(
                '_'
            ),
    },
    weekdays: {
        standalone:
            'воскресенье_понедельник_вторник_среда_четверг_пятница_суббота'.split(
                '_'
            ),
        format: 'воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу'.split(
            '_'
        ),
        isFormat: /\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?] ?dddd/,
    },
    weekdaysShort: 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
    weekdaysMin: 'вс_пн_вт_ср_чт_пт_сб'.split('_'),
    monthsParse: monthsParse,
    longMonthsParse: monthsParse,
    shortMonthsParse: monthsParse,

    // полные названия с падежами, по три буквы, для некоторых, по 4 буквы, сокращения с точкой и без точки
    monthsRegex:
        /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,

    // копия предыдущего
    monthsShortRegex:
        /^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,

    // полные названия с падежами
    monthsStrictRegex:
        /^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i,

    // Выражение, которое соответствует только сокращённым формам
    monthsShortStrictRegex:
        /^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i,
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY г.',
        LLL: 'D MMMM YYYY г., H:mm',
        LLLL: 'dddd, D MMMM YYYY г., H:mm',
    },
    calendar: {
        sameDay: '[Сегодня, в] LT',
        nextDay: '[Завтра, в] LT',
        lastDay: '[Вчера, в] LT',
        nextWeek: function (now) {
            if (now.week() !== this.week()) {
                switch (this.day()) {
                    case 0:
                        return '[В следующее] dddd, [в] LT';
                    case 1:
                    case 2:
                    case 4:
                        return '[В следующий] dddd, [в] LT';
                    case 3:
                    case 5:
                    case 6:
                        return '[В следующую] dddd, [в] LT';
                }
            } else {
                if (this.day() === 2) {
                    return '[Во] dddd, [в] LT';
                } else {
                    return '[В] dddd, [в] LT';
                }
            }
        },
        lastWeek: function (now) {
            if (now.week() !== this.week()) {
                switch (this.day()) {
                    case 0:
                        return '[В прошлое] dddd, [в] LT';
                    case 1:
                    case 2:
                    case 4:
                        return '[В прошлый] dddd, [в] LT';
                    case 3:
                    case 5:
                    case 6:
                        return '[В прошлую] dddd, [в] LT';
                }
            } else {
                if (this.day() === 2) {
                    return '[Во] dddd, [в] LT';
                } else {
                    return '[В] dddd, [в] LT';
                }
            }
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'через %s',
        past: '%s назад',
        s: 'несколько секунд',
        ss: relativeTimeWithPlural,
        m: relativeTimeWithPlural,
        mm: relativeTimeWithPlural,
        h: 'час',
        hh: relativeTimeWithPlural,
        d: 'день',
        dd: relativeTimeWithPlural,
        w: 'неделя',
        ww: relativeTimeWithPlural,
        M: 'месяц',
        MM: relativeTimeWithPlural,
        y: 'год',
        yy: relativeTimeWithPlural,
    },
    meridiemParse: /ночи|утра|дня|вечера/i,
    isPM: function (input) {
        return /^(дня|вечера)$/.test(input);
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'ночи';
        } else if (hour < 12) {
            return 'утра';
        } else if (hour < 17) {
            return 'дня';
        } else {
            return 'вечера';
        }
    },
    dayOfMonthOrdinalParse: /\d{1,2}-(й|го|я)/,
    ordinal: function (number, period) {
        switch (period) {
            case 'M':
            case 'd':
            case 'DDD':
                return number + '-й';
            case 'D':
                return number + '-го';
            case 'w':
            case 'W':
                return number + '-я';
            default:
                return number;
        }
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Sindhi [sd]
//! author : Narain Sagar : https://github.com/narainsagar

import moment from '../moment';

var months = [
        'جنوري',
        'فيبروري',
        'مارچ',
        'اپريل',
        'مئي',
        'جون',
        'جولاءِ',
        'آگسٽ',
        'سيپٽمبر',
        'آڪٽوبر',
        'نومبر',
        'ڊسمبر',
    ],
    days = ['آچر', 'سومر', 'اڱارو', 'اربع', 'خميس', 'جمع', 'ڇنڇر'];

export default moment.defineLocale('sd', {
    months: months,
    monthsShort: months,
    weekdays: days,
    weekdaysShort: days,
    weekdaysMin: days,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd، D MMMM YYYY HH:mm',
    },
    meridiemParse: /صبح|شام/,
    isPM: function (input) {
        return 'شام' === input;
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return 'صبح';
        }
        return 'شام';
    },
    calendar: {
        sameDay: '[اڄ] LT',
        nextDay: '[سڀاڻي] LT',
        nextWeek: 'dddd [اڳين هفتي تي] LT',
        lastDay: '[ڪالهه] LT',
        lastWeek: '[گزريل هفتي] dddd [تي] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s پوء',
        past: '%s اڳ',
        s: 'چند سيڪنڊ',
        ss: '%d سيڪنڊ',
        m: 'هڪ منٽ',
        mm: '%d منٽ',
        h: 'هڪ ڪلاڪ',
        hh: '%d ڪلاڪ',
        d: 'هڪ ڏينهن',
        dd: '%d ڏينهن',
        M: 'هڪ مهينو',
        MM: '%d مهينا',
        y: 'هڪ سال',
        yy: '%d سال',
    },
    preparse: function (string) {
        return string.replace(/،/g, ',');
    },
    postformat: function (string) {
        return string.replace(/,/g, '،');
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Northern Sami [se]
//! authors : Bård Rolstad Henriksen : https://github.com/karamell

import moment from '../moment';

export default moment.defineLocale('se', {
    months: 'ođđajagemánnu_guovvamánnu_njukčamánnu_cuoŋománnu_miessemánnu_geassemánnu_suoidnemánnu_borgemánnu_čakčamánnu_golggotmánnu_skábmamánnu_juovlamánnu'.split(
        '_'
    ),
    monthsShort:
        'ođđj_guov_njuk_cuo_mies_geas_suoi_borg_čakč_golg_skáb_juov'.split('_'),
    weekdays:
        'sotnabeaivi_vuossárga_maŋŋebárga_gaskavahkku_duorastat_bearjadat_lávvardat'.split(
            '_'
        ),
    weekdaysShort: 'sotn_vuos_maŋ_gask_duor_bear_láv'.split('_'),
    weekdaysMin: 's_v_m_g_d_b_L'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'MMMM D. [b.] YYYY',
        LLL: 'MMMM D. [b.] YYYY [ti.] HH:mm',
        LLLL: 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm',
    },
    calendar: {
        sameDay: '[otne ti] LT',
        nextDay: '[ihttin ti] LT',
        nextWeek: 'dddd [ti] LT',
        lastDay: '[ikte ti] LT',
        lastWeek: '[ovddit] dddd [ti] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s geažes',
        past: 'maŋit %s',
        s: 'moadde sekunddat',
        ss: '%d sekunddat',
        m: 'okta minuhta',
        mm: '%d minuhtat',
        h: 'okta diimmu',
        hh: '%d diimmut',
        d: 'okta beaivi',
        dd: '%d beaivvit',
        M: 'okta mánnu',
        MM: '%d mánut',
        y: 'okta jahki',
        yy: '%d jagit',
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Sinhalese [si]
//! author : Sampath Sitinamaluwa : https://github.com/sampathsris

import moment from '../moment';

/*jshint -W100*/
export default moment.defineLocale('si', {
    months: 'ජනවාරි_පෙබරවාරි_මාර්තු_අප්‍රේල්_මැයි_ජූනි_ජූලි_අගෝස්තු_සැප්තැම්බර්_ඔක්තෝබර්_නොවැම්බර්_දෙසැම්බර්'.split(
        '_'
    ),
    monthsShort: 'ජන_පෙබ_මාර්_අප්_මැයි_ජූනි_ජූලි_අගෝ_සැප්_ඔක්_නොවැ_දෙසැ'.split(
        '_'
    ),
    weekdays:
        'ඉරිදා_සඳුදා_අඟහරුවාදා_බදාදා_බ්‍රහස්පතින්දා_සිකුරාදා_සෙනසුරාදා'.split(
            '_'
        ),
    weekdaysShort: 'ඉරි_සඳු_අඟ_බදා_බ්‍රහ_සිකු_සෙන'.split('_'),
    weekdaysMin: 'ඉ_ස_අ_බ_බ්‍ර_සි_සෙ'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'a h:mm',
        LTS: 'a h:mm:ss',
        L: 'YYYY/MM/DD',
        LL: 'YYYY MMMM D',
        LLL: 'YYYY MMMM D, a h:mm',
        LLLL: 'YYYY MMMM D [වැනි] dddd, a h:mm:ss',
    },
    calendar: {
        sameDay: '[අද] LT[ට]',
        nextDay: '[හෙට] LT[ට]',
        nextWeek: 'dddd LT[ට]',
        lastDay: '[ඊයේ] LT[ට]',
        lastWeek: '[පසුගිය] dddd LT[ට]',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%sකින්',
        past: '%sකට පෙර',
        s: 'තත්පර කිහිපය',
        ss: 'තත්පර %d',
        m: 'මිනිත්තුව',
        mm: 'මිනිත්තු %d',
        h: 'පැය',
        hh: 'පැය %d',
        d: 'දිනය',
        dd: 'දින %d',
        M: 'මාසය',
        MM: 'මාස %d',
        y: 'වසර',
        yy: 'වසර %d',
    },
    dayOfMonthOrdinalParse: /\d{1,2} වැනි/,
    ordinal: function (number) {
        return number + ' වැනි';
    },
    meridiemParse: /පෙර වරු|පස් වරු|පෙ.ව|ප.ව./,
    isPM: function (input) {
        return input === 'ප.ව.' || input === 'පස් වරු';
    },
    meridiem: function (hours, minutes, isLower) {
        if (hours > 11) {
            return isLower ? 'ප.ව.' : 'පස් වරු';
        } else {
            return isLower ? 'පෙ.ව.' : 'පෙර වරු';
        }
    },
});
//! moment.js locale configuration
//! locale : Slovak [sk]
//! author : Martin Minka : https://github.com/k2s
//! based on work of petrbela : https://github.com/petrbela

import moment from '../moment';

var months =
        'január_február_marec_apríl_máj_jún_júl_august_september_október_november_december'.split(
            '_'
        ),
    monthsShort = 'jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec'.split('_');
function plural(n) {
    return n > 1 && n < 5;
}
function translate(number, withoutSuffix, key, isFuture) {
    var result = number + ' ';
    switch (key) {
        case 's': // a few seconds / in a few seconds / a few seconds ago
            return withoutSuffix || isFuture ? 'pár sekúnd' : 'pár sekundami';
        case 'ss': // 9 seconds / in 9 seconds / 9 seconds ago
            if (withoutSuffix || isFuture) {
                return result + (plural(number) ? 'sekundy' : 'sekúnd');
            } else {
                return result + 'sekundami';
            }
        case 'm': // a minute / in a minute / a minute ago
            return withoutSuffix ? 'minúta' : isFuture ? 'minútu' : 'minútou';
        case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
            if (withoutSuffix || isFuture) {
                return result + (plural(number) ? 'minúty' : 'minút');
            } else {
                return result + 'minútami';
            }
        case 'h': // an hour / in an hour / an hour ago
            return withoutSuffix ? 'hodina' : isFuture ? 'hodinu' : 'hodinou';
        case 'hh': // 9 hours / in 9 hours / 9 hours ago
            if (withoutSuffix || isFuture) {
                return result + (plural(number) ? 'hodiny' : 'hodín');
            } else {
                return result + 'hodinami';
            }
        case 'd': // a day / in a day / a day ago
            return withoutSuffix || isFuture ? 'deň' : 'dňom';
        case 'dd': // 9 days / in 9 days / 9 days ago
            if (withoutSuffix || isFuture) {
                return result + (plural(number) ? 'dni' : 'dní');
            } else {
                return result + 'dňami';
            }
        case 'M': // a month / in a month / a month ago
            return withoutSuffix || isFuture ? 'mesiac' : 'mesiacom';
        case 'MM': // 9 months / in 9 months / 9 months ago
            if (withoutSuffix || isFuture) {
                return result + (plural(number) ? 'mesiace' : 'mesiacov');
            } else {
                return result + 'mesiacmi';
            }
        case 'y': // a year / in a year / a year ago
            return withoutSuffix || isFuture ? 'rok' : 'rokom';
        case 'yy': // 9 years / in 9 years / 9 years ago
            if (withoutSuffix || isFuture) {
                return result + (plural(number) ? 'roky' : 'rokov');
            } else {
                return result + 'rokmi';
            }
    }
}

export default moment.defineLocale('sk', {
    months: months,
    monthsShort: monthsShort,
    weekdays: 'nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota'.split('_'),
    weekdaysShort: 'ne_po_ut_st_št_pi_so'.split('_'),
    weekdaysMin: 'ne_po_ut_st_št_pi_so'.split('_'),
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY H:mm',
        LLLL: 'dddd D. MMMM YYYY H:mm',
    },
    calendar: {
        sameDay: '[dnes o] LT',
        nextDay: '[zajtra o] LT',
        nextWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[v nedeľu o] LT';
                case 1:
                case 2:
                    return '[v] dddd [o] LT';
                case 3:
                    return '[v stredu o] LT';
                case 4:
                    return '[vo štvrtok o] LT';
                case 5:
                    return '[v piatok o] LT';
                case 6:
                    return '[v sobotu o] LT';
            }
        },
        lastDay: '[včera o] LT',
        lastWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[minulú nedeľu o] LT';
                case 1:
                case 2:
                    return '[minulý] dddd [o] LT';
                case 3:
                    return '[minulú stredu o] LT';
                case 4:
                case 5:
                    return '[minulý] dddd [o] LT';
                case 6:
                    return '[minulú sobotu o] LT';
            }
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'za %s',
        past: 'pred %s',
        s: translate,
        ss: translate,
        m: translate,
        mm: translate,
        h: translate,
        hh: translate,
        d: translate,
        dd: translate,
        M: translate,
        MM: translate,
        y: translate,
        yy: translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Slovenian [sl]
//! author : Robert Sedovšek : https://github.com/sedovsek

import moment from '../moment';

function processRelativeTime(number, withoutSuffix, key, isFuture) {
    var result = number + ' ';
    switch (key) {
        case 's':
            return withoutSuffix || isFuture
                ? 'nekaj sekund'
                : 'nekaj sekundami';
        case 'ss':
            if (number === 1) {
                result += withoutSuffix ? 'sekundo' : 'sekundi';
            } else if (number === 2) {
                result += withoutSuffix || isFuture ? 'sekundi' : 'sekundah';
            } else if (number < 5) {
                result += withoutSuffix || isFuture ? 'sekunde' : 'sekundah';
            } else {
                result += 'sekund';
            }
            return result;
        case 'm':
            return withoutSuffix ? 'ena minuta' : 'eno minuto';
        case 'mm':
            if (number === 1) {
                result += withoutSuffix ? 'minuta' : 'minuto';
            } else if (number === 2) {
                result += withoutSuffix || isFuture ? 'minuti' : 'minutama';
            } else if (number < 5) {
                result += withoutSuffix || isFuture ? 'minute' : 'minutami';
            } else {
                result += withoutSuffix || isFuture ? 'minut' : 'minutami';
            }
            return result;
        case 'h':
            return withoutSuffix ? 'ena ura' : 'eno uro';
        case 'hh':
            if (number === 1) {
                result += withoutSuffix ? 'ura' : 'uro';
            } else if (number === 2) {
                result += withoutSuffix || isFuture ? 'uri' : 'urama';
            } else if (number < 5) {
                result += withoutSuffix || isFuture ? 'ure' : 'urami';
            } else {
                result += withoutSuffix || isFuture ? 'ur' : 'urami';
            }
            return result;
        case 'd':
            return withoutSuffix || isFuture ? 'en dan' : 'enim dnem';
        case 'dd':
            if (number === 1) {
                result += withoutSuffix || isFuture ? 'dan' : 'dnem';
            } else if (number === 2) {
                result += withoutSuffix || isFuture ? 'dni' : 'dnevoma';
            } else {
                result += withoutSuffix || isFuture ? 'dni' : 'dnevi';
            }
            return result;
        case 'M':
            return withoutSuffix || isFuture ? 'en mesec' : 'enim mesecem';
        case 'MM':
            if (number === 1) {
                result += withoutSuffix || isFuture ? 'mesec' : 'mesecem';
            } else if (number === 2) {
                result += withoutSuffix || isFuture ? 'meseca' : 'mesecema';
            } else if (number < 5) {
                result += withoutSuffix || isFuture ? 'mesece' : 'meseci';
            } else {
                result += withoutSuffix || isFuture ? 'mesecev' : 'meseci';
            }
            return result;
        case 'y':
            return withoutSuffix || isFuture ? 'eno leto' : 'enim letom';
        case 'yy':
            if (number === 1) {
                result += withoutSuffix || isFuture ? 'leto' : 'letom';
            } else if (number === 2) {
                result += withoutSuffix || isFuture ? 'leti' : 'letoma';
            } else if (number < 5) {
                result += withoutSuffix || isFuture ? 'leta' : 'leti';
            } else {
                result += withoutSuffix || isFuture ? 'let' : 'leti';
            }
            return result;
    }
}

export default moment.defineLocale('sl', {
    months: 'januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december'.split(
        '_'
    ),
    monthsShort:
        'jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota'.split('_'),
    weekdaysShort: 'ned._pon._tor._sre._čet._pet._sob.'.split('_'),
    weekdaysMin: 'ne_po_to_sr_če_pe_so'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD. MM. YYYY',
        LL: 'D. MMMM YYYY',
        LLL: 'D. MMMM YYYY H:mm',
        LLLL: 'dddd, D. MMMM YYYY H:mm',
    },
    calendar: {
        sameDay: '[danes ob] LT',
        nextDay: '[jutri ob] LT',

        nextWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[v] [nedeljo] [ob] LT';
                case 3:
                    return '[v] [sredo] [ob] LT';
                case 6:
                    return '[v] [soboto] [ob] LT';
                case 1:
                case 2:
                case 4:
                case 5:
                    return '[v] dddd [ob] LT';
            }
        },
        lastDay: '[včeraj ob] LT',
        lastWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[prejšnjo] [nedeljo] [ob] LT';
                case 3:
                    return '[prejšnjo] [sredo] [ob] LT';
                case 6:
                    return '[prejšnjo] [soboto] [ob] LT';
                case 1:
                case 2:
                case 4:
                case 5:
                    return '[prejšnji] dddd [ob] LT';
            }
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'čez %s',
        past: 'pred %s',
        s: processRelativeTime,
        ss: processRelativeTime,
        m: processRelativeTime,
        mm: processRelativeTime,
        h: processRelativeTime,
        hh: processRelativeTime,
        d: processRelativeTime,
        dd: processRelativeTime,
        M: processRelativeTime,
        MM: processRelativeTime,
        y: processRelativeTime,
        yy: processRelativeTime,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Albanian [sq]
//! author : Flakërim Ismani : https://github.com/flakerimi
//! author : Menelion Elensúle : https://github.com/Oire
//! author : Oerd Cukalla : https://github.com/oerd

import moment from '../moment';

export default moment.defineLocale('sq', {
    months: 'Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor'.split(
        '_'
    ),
    monthsShort: 'Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj'.split('_'),
    weekdays: 'E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë'.split(
        '_'
    ),
    weekdaysShort: 'Die_Hën_Mar_Mër_Enj_Pre_Sht'.split('_'),
    weekdaysMin: 'D_H_Ma_Më_E_P_Sh'.split('_'),
    weekdaysParseExact: true,
    meridiemParse: /PD|MD/,
    isPM: function (input) {
        return input.charAt(0) === 'M';
    },
    meridiem: function (hours, minutes, isLower) {
        return hours < 12 ? 'PD' : 'MD';
    },
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Sot në] LT',
        nextDay: '[Nesër në] LT',
        nextWeek: 'dddd [në] LT',
        lastDay: '[Dje në] LT',
        lastWeek: 'dddd [e kaluar në] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'në %s',
        past: '%s më parë',
        s: 'disa sekonda',
        ss: '%d sekonda',
        m: 'një minutë',
        mm: '%d minuta',
        h: 'një orë',
        hh: '%d orë',
        d: 'një ditë',
        dd: '%d ditë',
        M: 'një muaj',
        MM: '%d muaj',
        y: 'një vit',
        yy: '%d vite',
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Serbian Cyrillic [sr-cyrl]
//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
//! author : Stefan Crnjaković <stefan@hotmail.rs> : https://github.com/crnjakovic

import moment from '../moment';

var translator = {
    words: {
        //Different grammatical cases
        ss: ['секунда', 'секунде', 'секунди'],
        m: ['један минут', 'једног минута'],
        mm: ['минут', 'минута', 'минута'],
        h: ['један сат', 'једног сата'],
        hh: ['сат', 'сата', 'сати'],
        d: ['један дан', 'једног дана'],
        dd: ['дан', 'дана', 'дана'],
        M: ['један месец', 'једног месеца'],
        MM: ['месец', 'месеца', 'месеци'],
        y: ['једну годину', 'једне године'],
        yy: ['годину', 'године', 'година'],
    },
    correctGrammaticalCase: function (number, wordKey) {
        if (
            number % 10 >= 1 &&
            number % 10 <= 4 &&
            (number % 100 < 10 || number % 100 >= 20)
        ) {
            return number % 10 === 1 ? wordKey[0] : wordKey[1];
        }
        return wordKey[2];
    },
    translate: function (number, withoutSuffix, key, isFuture) {
        var wordKey = translator.words[key],
            word;

        if (key.length === 1) {
            // Nominativ
            if (key === 'y' && withoutSuffix) return 'једна година';
            return isFuture || withoutSuffix ? wordKey[0] : wordKey[1];
        }

        word = translator.correctGrammaticalCase(number, wordKey);
        // Nominativ
        if (key === 'yy' && withoutSuffix && word === 'годину') {
            return number + ' година';
        }

        return number + ' ' + word;
    },
};

export default moment.defineLocale('sr-cyrl', {
    months: 'јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар'.split(
        '_'
    ),
    monthsShort:
        'јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.'.split('_'),
    monthsParseExact: true,
    weekdays: 'недеља_понедељак_уторак_среда_четвртак_петак_субота'.split('_'),
    weekdaysShort: 'нед._пон._уто._сре._чет._пет._суб.'.split('_'),
    weekdaysMin: 'не_по_ут_ср_че_пе_су'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'D. M. YYYY.',
        LL: 'D. MMMM YYYY.',
        LLL: 'D. MMMM YYYY. H:mm',
        LLLL: 'dddd, D. MMMM YYYY. H:mm',
    },
    calendar: {
        sameDay: '[данас у] LT',
        nextDay: '[сутра у] LT',
        nextWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[у] [недељу] [у] LT';
                case 3:
                    return '[у] [среду] [у] LT';
                case 6:
                    return '[у] [суботу] [у] LT';
                case 1:
                case 2:
                case 4:
                case 5:
                    return '[у] dddd [у] LT';
            }
        },
        lastDay: '[јуче у] LT',
        lastWeek: function () {
            var lastWeekDays = [
                '[прошле] [недеље] [у] LT',
                '[прошлог] [понедељка] [у] LT',
                '[прошлог] [уторка] [у] LT',
                '[прошле] [среде] [у] LT',
                '[прошлог] [четвртка] [у] LT',
                '[прошлог] [петка] [у] LT',
                '[прошле] [суботе] [у] LT',
            ];
            return lastWeekDays[this.day()];
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'за %s',
        past: 'пре %s',
        s: 'неколико секунди',
        ss: translator.translate,
        m: translator.translate,
        mm: translator.translate,
        h: translator.translate,
        hh: translator.translate,
        d: translator.translate,
        dd: translator.translate,
        M: translator.translate,
        MM: translator.translate,
        y: translator.translate,
        yy: translator.translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 1st is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Serbian [sr]
//! author : Milan Janačković<milanjanackovic@gmail.com> : https://github.com/milan-j
//! author : Stefan Crnjaković <stefan@hotmail.rs> : https://github.com/crnjakovic

import moment from '../moment';

var translator = {
    words: {
        //Different grammatical cases
        ss: ['sekunda', 'sekunde', 'sekundi'],
        m: ['jedan minut', 'jednog minuta'],
        mm: ['minut', 'minuta', 'minuta'],
        h: ['jedan sat', 'jednog sata'],
        hh: ['sat', 'sata', 'sati'],
        d: ['jedan dan', 'jednog dana'],
        dd: ['dan', 'dana', 'dana'],
        M: ['jedan mesec', 'jednog meseca'],
        MM: ['mesec', 'meseca', 'meseci'],
        y: ['jednu godinu', 'jedne godine'],
        yy: ['godinu', 'godine', 'godina'],
    },
    correctGrammaticalCase: function (number, wordKey) {
        if (
            number % 10 >= 1 &&
            number % 10 <= 4 &&
            (number % 100 < 10 || number % 100 >= 20)
        ) {
            return number % 10 === 1 ? wordKey[0] : wordKey[1];
        }
        return wordKey[2];
    },
    translate: function (number, withoutSuffix, key, isFuture) {
        var wordKey = translator.words[key],
            word;

        if (key.length === 1) {
            // Nominativ
            if (key === 'y' && withoutSuffix) return 'jedna godina';
            return isFuture || withoutSuffix ? wordKey[0] : wordKey[1];
        }

        word = translator.correctGrammaticalCase(number, wordKey);
        // Nominativ
        if (key === 'yy' && withoutSuffix && word === 'godinu') {
            return number + ' godina';
        }

        return number + ' ' + word;
    },
};

export default moment.defineLocale('sr', {
    months: 'januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar'.split(
        '_'
    ),
    monthsShort:
        'jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.'.split('_'),
    monthsParseExact: true,
    weekdays: 'nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota'.split(
        '_'
    ),
    weekdaysShort: 'ned._pon._uto._sre._čet._pet._sub.'.split('_'),
    weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'D. M. YYYY.',
        LL: 'D. MMMM YYYY.',
        LLL: 'D. MMMM YYYY. H:mm',
        LLLL: 'dddd, D. MMMM YYYY. H:mm',
    },
    calendar: {
        sameDay: '[danas u] LT',
        nextDay: '[sutra u] LT',
        nextWeek: function () {
            switch (this.day()) {
                case 0:
                    return '[u] [nedelju] [u] LT';
                case 3:
                    return '[u] [sredu] [u] LT';
                case 6:
                    return '[u] [subotu] [u] LT';
                case 1:
                case 2:
                case 4:
                case 5:
                    return '[u] dddd [u] LT';
            }
        },
        lastDay: '[juče u] LT',
        lastWeek: function () {
            var lastWeekDays = [
                '[prošle] [nedelje] [u] LT',
                '[prošlog] [ponedeljka] [u] LT',
                '[prošlog] [utorka] [u] LT',
                '[prošle] [srede] [u] LT',
                '[prošlog] [četvrtka] [u] LT',
                '[prošlog] [petka] [u] LT',
                '[prošle] [subote] [u] LT',
            ];
            return lastWeekDays[this.day()];
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'za %s',
        past: 'pre %s',
        s: 'nekoliko sekundi',
        ss: translator.translate,
        m: translator.translate,
        mm: translator.translate,
        h: translator.translate,
        hh: translator.translate,
        d: translator.translate,
        dd: translator.translate,
        M: translator.translate,
        MM: translator.translate,
        y: translator.translate,
        yy: translator.translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : siSwati [ss]
//! author : Nicolai Davies<mail@nicolai.io> : https://github.com/nicolaidavies

import moment from '../moment';

export default moment.defineLocale('ss', {
    months: "Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split(
        '_'
    ),
    monthsShort: 'Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo'.split('_'),
    weekdays:
        'Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo'.split(
            '_'
        ),
    weekdaysShort: 'Lis_Umb_Lsb_Les_Lsi_Lsh_Umg'.split('_'),
    weekdaysMin: 'Li_Us_Lb_Lt_Ls_Lh_Ug'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'h:mm A',
        LTS: 'h:mm:ss A',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY h:mm A',
        LLLL: 'dddd, D MMMM YYYY h:mm A',
    },
    calendar: {
        sameDay: '[Namuhla nga] LT',
        nextDay: '[Kusasa nga] LT',
        nextWeek: 'dddd [nga] LT',
        lastDay: '[Itolo nga] LT',
        lastWeek: 'dddd [leliphelile] [nga] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'nga %s',
        past: 'wenteka nga %s',
        s: 'emizuzwana lomcane',
        ss: '%d mzuzwana',
        m: 'umzuzu',
        mm: '%d emizuzu',
        h: 'lihora',
        hh: '%d emahora',
        d: 'lilanga',
        dd: '%d emalanga',
        M: 'inyanga',
        MM: '%d tinyanga',
        y: 'umnyaka',
        yy: '%d iminyaka',
    },
    meridiemParse: /ekuseni|emini|entsambama|ebusuku/,
    meridiem: function (hours, minutes, isLower) {
        if (hours < 11) {
            return 'ekuseni';
        } else if (hours < 15) {
            return 'emini';
        } else if (hours < 19) {
            return 'entsambama';
        } else {
            return 'ebusuku';
        }
    },
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'ekuseni') {
            return hour;
        } else if (meridiem === 'emini') {
            return hour >= 11 ? hour : hour + 12;
        } else if (meridiem === 'entsambama' || meridiem === 'ebusuku') {
            if (hour === 0) {
                return 0;
            }
            return hour + 12;
        }
    },
    dayOfMonthOrdinalParse: /\d{1,2}/,
    ordinal: '%d',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Swedish [sv]
//! author : Jens Alm : https://github.com/ulmus

import moment from '../moment';

export default moment.defineLocale('sv', {
    months: 'januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december'.split(
        '_'
    ),
    monthsShort: 'jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec'.split('_'),
    weekdays: 'söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag'.split('_'),
    weekdaysShort: 'sön_mån_tis_ons_tor_fre_lör'.split('_'),
    weekdaysMin: 'sö_må_ti_on_to_fr_lö'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'YYYY-MM-DD',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY [kl.] HH:mm',
        LLLL: 'dddd D MMMM YYYY [kl.] HH:mm',
        lll: 'D MMM YYYY HH:mm',
        llll: 'ddd D MMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Idag] LT',
        nextDay: '[Imorgon] LT',
        lastDay: '[Igår] LT',
        nextWeek: '[På] dddd LT',
        lastWeek: '[I] dddd[s] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'om %s',
        past: 'för %s sedan',
        s: 'några sekunder',
        ss: '%d sekunder',
        m: 'en minut',
        mm: '%d minuter',
        h: 'en timme',
        hh: '%d timmar',
        d: 'en dag',
        dd: '%d dagar',
        M: 'en månad',
        MM: '%d månader',
        y: 'ett år',
        yy: '%d år',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(\:e|\:a)/,
    ordinal: function (number) {
        var b = number % 10,
            output =
                ~~((number % 100) / 10) === 1
                    ? ':e'
                    : b === 1
                    ? ':a'
                    : b === 2
                    ? ':a'
                    : b === 3
                    ? ':e'
                    : ':e';
        return number + output;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Swahili [sw]
//! author : Fahad Kassim : https://github.com/fadsel

import moment from '../moment';

export default moment.defineLocale('sw', {
    months: 'Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba'.split(
        '_'
    ),
    monthsShort: 'Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des'.split('_'),
    weekdays:
        'Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi'.split(
            '_'
        ),
    weekdaysShort: 'Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos'.split('_'),
    weekdaysMin: 'J2_J3_J4_J5_Al_Ij_J1'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'hh:mm A',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[leo saa] LT',
        nextDay: '[kesho saa] LT',
        nextWeek: '[wiki ijayo] dddd [saat] LT',
        lastDay: '[jana] LT',
        lastWeek: '[wiki iliyopita] dddd [saat] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s baadaye',
        past: 'tokea %s',
        s: 'hivi punde',
        ss: 'sekunde %d',
        m: 'dakika moja',
        mm: 'dakika %d',
        h: 'saa limoja',
        hh: 'masaa %d',
        d: 'siku moja',
        dd: 'siku %d',
        M: 'mwezi mmoja',
        MM: 'miezi %d',
        y: 'mwaka mmoja',
        yy: 'miaka %d',
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Tamil [ta]
//! author : Arjunkumar Krishnamoorthy : https://github.com/tk120404

import moment from '../moment';

var symbolMap = {
        1: '௧',
        2: '௨',
        3: '௩',
        4: '௪',
        5: '௫',
        6: '௬',
        7: '௭',
        8: '௮',
        9: '௯',
        0: '௦',
    },
    numberMap = {
        '௧': '1',
        '௨': '2',
        '௩': '3',
        '௪': '4',
        '௫': '5',
        '௬': '6',
        '௭': '7',
        '௮': '8',
        '௯': '9',
        '௦': '0',
    };

export default moment.defineLocale('ta', {
    months: 'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split(
        '_'
    ),
    monthsShort:
        'ஜனவரி_பிப்ரவரி_மார்ச்_ஏப்ரல்_மே_ஜூன்_ஜூலை_ஆகஸ்ட்_செப்டெம்பர்_அக்டோபர்_நவம்பர்_டிசம்பர்'.split(
            '_'
        ),
    weekdays:
        'ஞாயிற்றுக்கிழமை_திங்கட்கிழமை_செவ்வாய்கிழமை_புதன்கிழமை_வியாழக்கிழமை_வெள்ளிக்கிழமை_சனிக்கிழமை'.split(
            '_'
        ),
    weekdaysShort: 'ஞாயிறு_திங்கள்_செவ்வாய்_புதன்_வியாழன்_வெள்ளி_சனி'.split(
        '_'
    ),
    weekdaysMin: 'ஞா_தி_செ_பு_வி_வெ_ச'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY, HH:mm',
        LLLL: 'dddd, D MMMM YYYY, HH:mm',
    },
    calendar: {
        sameDay: '[இன்று] LT',
        nextDay: '[நாளை] LT',
        nextWeek: 'dddd, LT',
        lastDay: '[நேற்று] LT',
        lastWeek: '[கடந்த வாரம்] dddd, LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s இல்',
        past: '%s முன்',
        s: 'ஒரு சில விநாடிகள்',
        ss: '%d விநாடிகள்',
        m: 'ஒரு நிமிடம்',
        mm: '%d நிமிடங்கள்',
        h: 'ஒரு மணி நேரம்',
        hh: '%d மணி நேரம்',
        d: 'ஒரு நாள்',
        dd: '%d நாட்கள்',
        M: 'ஒரு மாதம்',
        MM: '%d மாதங்கள்',
        y: 'ஒரு வருடம்',
        yy: '%d ஆண்டுகள்',
    },
    dayOfMonthOrdinalParse: /\d{1,2}வது/,
    ordinal: function (number) {
        return number + 'வது';
    },
    preparse: function (string) {
        return string.replace(/[௧௨௩௪௫௬௭௮௯௦]/g, function (match) {
            return numberMap[match];
        });
    },
    postformat: function (string) {
        return string.replace(/\d/g, function (match) {
            return symbolMap[match];
        });
    },
    // refer http://ta.wikipedia.org/s/1er1
    meridiemParse: /யாமம்|வைகறை|காலை|நண்பகல்|எற்பாடு|மாலை/,
    meridiem: function (hour, minute, isLower) {
        if (hour < 2) {
            return ' யாமம்';
        } else if (hour < 6) {
            return ' வைகறை'; // வைகறை
        } else if (hour < 10) {
            return ' காலை'; // காலை
        } else if (hour < 14) {
            return ' நண்பகல்'; // நண்பகல்
        } else if (hour < 18) {
            return ' எற்பாடு'; // எற்பாடு
        } else if (hour < 22) {
            return ' மாலை'; // மாலை
        } else {
            return ' யாமம்';
        }
    },
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'யாமம்') {
            return hour < 2 ? hour : hour + 12;
        } else if (meridiem === 'வைகறை' || meridiem === 'காலை') {
            return hour;
        } else if (meridiem === 'நண்பகல்') {
            return hour >= 10 ? hour : hour + 12;
        } else {
            return hour + 12;
        }
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Telugu [te]
//! author : Krishna Chaitanya Thota : https://github.com/kcthota

import moment from '../moment';

export default moment.defineLocale('te', {
    months: 'జనవరి_ఫిబ్రవరి_మార్చి_ఏప్రిల్_మే_జూన్_జులై_ఆగస్టు_సెప్టెంబర్_అక్టోబర్_నవంబర్_డిసెంబర్'.split(
        '_'
    ),
    monthsShort:
        'జన._ఫిబ్ర._మార్చి_ఏప్రి._మే_జూన్_జులై_ఆగ._సెప్._అక్టో._నవ._డిసె.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays:
        'ఆదివారం_సోమవారం_మంగళవారం_బుధవారం_గురువారం_శుక్రవారం_శనివారం'.split(
            '_'
        ),
    weekdaysShort: 'ఆది_సోమ_మంగళ_బుధ_గురు_శుక్ర_శని'.split('_'),
    weekdaysMin: 'ఆ_సో_మం_బు_గు_శు_శ'.split('_'),
    longDateFormat: {
        LT: 'A h:mm',
        LTS: 'A h:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY, A h:mm',
        LLLL: 'dddd, D MMMM YYYY, A h:mm',
    },
    calendar: {
        sameDay: '[నేడు] LT',
        nextDay: '[రేపు] LT',
        nextWeek: 'dddd, LT',
        lastDay: '[నిన్న] LT',
        lastWeek: '[గత] dddd, LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s లో',
        past: '%s క్రితం',
        s: 'కొన్ని క్షణాలు',
        ss: '%d సెకన్లు',
        m: 'ఒక నిమిషం',
        mm: '%d నిమిషాలు',
        h: 'ఒక గంట',
        hh: '%d గంటలు',
        d: 'ఒక రోజు',
        dd: '%d రోజులు',
        M: 'ఒక నెల',
        MM: '%d నెలలు',
        y: 'ఒక సంవత్సరం',
        yy: '%d సంవత్సరాలు',
    },
    dayOfMonthOrdinalParse: /\d{1,2}వ/,
    ordinal: '%dవ',
    meridiemParse: /రాత్రి|ఉదయం|మధ్యాహ్నం|సాయంత్రం/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'రాత్రి') {
            return hour < 4 ? hour : hour + 12;
        } else if (meridiem === 'ఉదయం') {
            return hour;
        } else if (meridiem === 'మధ్యాహ్నం') {
            return hour >= 10 ? hour : hour + 12;
        } else if (meridiem === 'సాయంత్రం') {
            return hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'రాత్రి';
        } else if (hour < 10) {
            return 'ఉదయం';
        } else if (hour < 17) {
            return 'మధ్యాహ్నం';
        } else if (hour < 20) {
            return 'సాయంత్రం';
        } else {
            return 'రాత్రి';
        }
    },
    week: {
        dow: 0, // Sunday is the first day of the week.
        doy: 6, // The week that contains Jan 6th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Tetun Dili (East Timor) [tet]
//! author : Joshua Brooks : https://github.com/joshbrooks
//! author : Onorio De J. Afonso : https://github.com/marobo
//! author : Sonia Simoes : https://github.com/soniasimoes

import moment from '../moment';

export default moment.defineLocale('tet', {
    months: 'Janeiru_Fevereiru_Marsu_Abril_Maiu_Juñu_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru'.split(
        '_'
    ),
    monthsShort: 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),
    weekdays: 'Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu'.split('_'),
    weekdaysShort: 'Dom_Seg_Ters_Kua_Kint_Sest_Sab'.split('_'),
    weekdaysMin: 'Do_Seg_Te_Ku_Ki_Ses_Sa'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Ohin iha] LT',
        nextDay: '[Aban iha] LT',
        nextWeek: 'dddd [iha] LT',
        lastDay: '[Horiseik iha] LT',
        lastWeek: 'dddd [semana kotuk] [iha] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'iha %s',
        past: '%s liuba',
        s: 'segundu balun',
        ss: 'segundu %d',
        m: 'minutu ida',
        mm: 'minutu %d',
        h: 'oras ida',
        hh: 'oras %d',
        d: 'loron ida',
        dd: 'loron %d',
        M: 'fulan ida',
        MM: 'fulan %d',
        y: 'tinan ida',
        yy: 'tinan %d',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(st|nd|rd|th)/,
    ordinal: function (number) {
        var b = number % 10,
            output =
                ~~((number % 100) / 10) === 1
                    ? 'th'
                    : b === 1
                    ? 'st'
                    : b === 2
                    ? 'nd'
                    : b === 3
                    ? 'rd'
                    : 'th';
        return number + output;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Tajik [tg]
//! author : Orif N. Jr. : https://github.com/orif-jr

import moment from '../moment';

var suffixes = {
    0: '-ум',
    1: '-ум',
    2: '-юм',
    3: '-юм',
    4: '-ум',
    5: '-ум',
    6: '-ум',
    7: '-ум',
    8: '-ум',
    9: '-ум',
    10: '-ум',
    12: '-ум',
    13: '-ум',
    20: '-ум',
    30: '-юм',
    40: '-ум',
    50: '-ум',
    60: '-ум',
    70: '-ум',
    80: '-ум',
    90: '-ум',
    100: '-ум',
};

export default moment.defineLocale('tg', {
    months: {
        format: 'январи_феврали_марти_апрели_майи_июни_июли_августи_сентябри_октябри_ноябри_декабри'.split(
            '_'
        ),
        standalone:
            'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split(
                '_'
            ),
    },
    monthsShort: 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),
    weekdays: 'якшанбе_душанбе_сешанбе_чоршанбе_панҷшанбе_ҷумъа_шанбе'.split(
        '_'
    ),
    weekdaysShort: 'яшб_дшб_сшб_чшб_пшб_ҷум_шнб'.split('_'),
    weekdaysMin: 'яш_дш_сш_чш_пш_ҷм_шб'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Имрӯз соати] LT',
        nextDay: '[Фардо соати] LT',
        lastDay: '[Дирӯз соати] LT',
        nextWeek: 'dddd[и] [ҳафтаи оянда соати] LT',
        lastWeek: 'dddd[и] [ҳафтаи гузашта соати] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'баъди %s',
        past: '%s пеш',
        s: 'якчанд сония',
        m: 'як дақиқа',
        mm: '%d дақиқа',
        h: 'як соат',
        hh: '%d соат',
        d: 'як рӯз',
        dd: '%d рӯз',
        M: 'як моҳ',
        MM: '%d моҳ',
        y: 'як сол',
        yy: '%d сол',
    },
    meridiemParse: /шаб|субҳ|рӯз|бегоҳ/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === 'шаб') {
            return hour < 4 ? hour : hour + 12;
        } else if (meridiem === 'субҳ') {
            return hour;
        } else if (meridiem === 'рӯз') {
            return hour >= 11 ? hour : hour + 12;
        } else if (meridiem === 'бегоҳ') {
            return hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'шаб';
        } else if (hour < 11) {
            return 'субҳ';
        } else if (hour < 16) {
            return 'рӯз';
        } else if (hour < 19) {
            return 'бегоҳ';
        } else {
            return 'шаб';
        }
    },
    dayOfMonthOrdinalParse: /\d{1,2}-(ум|юм)/,
    ordinal: function (number) {
        var a = number % 10,
            b = number >= 100 ? 100 : null;
        return number + (suffixes[number] || suffixes[a] || suffixes[b]);
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 1th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Thai [th]
//! author : Kridsada Thanabulpong : https://github.com/sirn

import moment from '../moment';

export default moment.defineLocale('th', {
    months: 'มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม'.split(
        '_'
    ),
    monthsShort:
        'ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์'.split('_'),
    weekdaysShort: 'อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์'.split('_'), // yes, three characters difference
    weekdaysMin: 'อา._จ._อ._พ._พฤ._ศ._ส.'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'H:mm',
        LTS: 'H:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY เวลา H:mm',
        LLLL: 'วันddddที่ D MMMM YYYY เวลา H:mm',
    },
    meridiemParse: /ก่อนเที่ยง|หลังเที่ยง/,
    isPM: function (input) {
        return input === 'หลังเที่ยง';
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return 'ก่อนเที่ยง';
        } else {
            return 'หลังเที่ยง';
        }
    },
    calendar: {
        sameDay: '[วันนี้ เวลา] LT',
        nextDay: '[พรุ่งนี้ เวลา] LT',
        nextWeek: 'dddd[หน้า เวลา] LT',
        lastDay: '[เมื่อวานนี้ เวลา] LT',
        lastWeek: '[วัน]dddd[ที่แล้ว เวลา] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'อีก %s',
        past: '%sที่แล้ว',
        s: 'ไม่กี่วินาที',
        ss: '%d วินาที',
        m: '1 นาที',
        mm: '%d นาที',
        h: '1 ชั่วโมง',
        hh: '%d ชั่วโมง',
        d: '1 วัน',
        dd: '%d วัน',
        w: '1 สัปดาห์',
        ww: '%d สัปดาห์',
        M: '1 เดือน',
        MM: '%d เดือน',
        y: '1 ปี',
        yy: '%d ปี',
    },
});
//! moment.js locale configuration
//! locale : Turkmen [tk]
//! author : Atamyrat Abdyrahmanov : https://github.com/atamyratabdy

import moment from '../moment';

var suffixes = {
    1: "'inji",
    5: "'inji",
    8: "'inji",
    70: "'inji",
    80: "'inji",
    2: "'nji",
    7: "'nji",
    20: "'nji",
    50: "'nji",
    3: "'ünji",
    4: "'ünji",
    100: "'ünji",
    6: "'njy",
    9: "'unjy",
    10: "'unjy",
    30: "'unjy",
    60: "'ynjy",
    90: "'ynjy",
};

export default moment.defineLocale('tk', {
    months: 'Ýanwar_Fewral_Mart_Aprel_Maý_Iýun_Iýul_Awgust_Sentýabr_Oktýabr_Noýabr_Dekabr'.split(
        '_'
    ),
    monthsShort: 'Ýan_Few_Mar_Apr_Maý_Iýn_Iýl_Awg_Sen_Okt_Noý_Dek'.split('_'),
    weekdays: 'Ýekşenbe_Duşenbe_Sişenbe_Çarşenbe_Penşenbe_Anna_Şenbe'.split(
        '_'
    ),
    weekdaysShort: 'Ýek_Duş_Siş_Çar_Pen_Ann_Şen'.split('_'),
    weekdaysMin: 'Ýk_Dş_Sş_Çr_Pn_An_Şn'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[bugün sagat] LT',
        nextDay: '[ertir sagat] LT',
        nextWeek: '[indiki] dddd [sagat] LT',
        lastDay: '[düýn] LT',
        lastWeek: '[geçen] dddd [sagat] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s soň',
        past: '%s öň',
        s: 'birnäçe sekunt',
        m: 'bir minut',
        mm: '%d minut',
        h: 'bir sagat',
        hh: '%d sagat',
        d: 'bir gün',
        dd: '%d gün',
        M: 'bir aý',
        MM: '%d aý',
        y: 'bir ýyl',
        yy: '%d ýyl',
    },
    ordinal: function (number, period) {
        switch (period) {
            case 'd':
            case 'D':
            case 'Do':
            case 'DD':
                return number;
            default:
                if (number === 0) {
                    // special case for zero
                    return number + "'unjy";
                }
                var a = number % 10,
                    b = (number % 100) - a,
                    c = number >= 100 ? 100 : null;
                return number + (suffixes[a] || suffixes[b] || suffixes[c]);
        }
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Tagalog (Philippines) [tl-ph]
//! author : Dan Hagman : https://github.com/hagmandan

import moment from '../moment';

export default moment.defineLocale('tl-ph', {
    months: 'Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre'.split(
        '_'
    ),
    monthsShort: 'Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis'.split('_'),
    weekdays: 'Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado'.split(
        '_'
    ),
    weekdaysShort: 'Lin_Lun_Mar_Miy_Huw_Biy_Sab'.split('_'),
    weekdaysMin: 'Li_Lu_Ma_Mi_Hu_Bi_Sab'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'MM/D/YYYY',
        LL: 'MMMM D, YYYY',
        LLL: 'MMMM D, YYYY HH:mm',
        LLLL: 'dddd, MMMM DD, YYYY HH:mm',
    },
    calendar: {
        sameDay: 'LT [ngayong araw]',
        nextDay: '[Bukas ng] LT',
        nextWeek: 'LT [sa susunod na] dddd',
        lastDay: 'LT [kahapon]',
        lastWeek: 'LT [noong nakaraang] dddd',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'sa loob ng %s',
        past: '%s ang nakalipas',
        s: 'ilang segundo',
        ss: '%d segundo',
        m: 'isang minuto',
        mm: '%d minuto',
        h: 'isang oras',
        hh: '%d oras',
        d: 'isang araw',
        dd: '%d araw',
        M: 'isang buwan',
        MM: '%d buwan',
        y: 'isang taon',
        yy: '%d taon',
    },
    dayOfMonthOrdinalParse: /\d{1,2}/,
    ordinal: function (number) {
        return number;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Klingon [tlh]
//! author : Dominika Kruk : https://github.com/amaranthrose

import moment from '../moment';

var numbersNouns = 'pagh_wa’_cha’_wej_loS_vagh_jav_Soch_chorgh_Hut'.split('_');

function translateFuture(output) {
    var time = output;
    time =
        output.indexOf('jaj') !== -1
            ? time.slice(0, -3) + 'leS'
            : output.indexOf('jar') !== -1
            ? time.slice(0, -3) + 'waQ'
            : output.indexOf('DIS') !== -1
            ? time.slice(0, -3) + 'nem'
            : time + ' pIq';
    return time;
}

function translatePast(output) {
    var time = output;
    time =
        output.indexOf('jaj') !== -1
            ? time.slice(0, -3) + 'Hu’'
            : output.indexOf('jar') !== -1
            ? time.slice(0, -3) + 'wen'
            : output.indexOf('DIS') !== -1
            ? time.slice(0, -3) + 'ben'
            : time + ' ret';
    return time;
}

function translate(number, withoutSuffix, string, isFuture) {
    var numberNoun = numberAsNoun(number);
    switch (string) {
        case 'ss':
            return numberNoun + ' lup';
        case 'mm':
            return numberNoun + ' tup';
        case 'hh':
            return numberNoun + ' rep';
        case 'dd':
            return numberNoun + ' jaj';
        case 'MM':
            return numberNoun + ' jar';
        case 'yy':
            return numberNoun + ' DIS';
    }
}

function numberAsNoun(number) {
    var hundred = Math.floor((number % 1000) / 100),
        ten = Math.floor((number % 100) / 10),
        one = number % 10,
        word = '';
    if (hundred > 0) {
        word += numbersNouns[hundred] + 'vatlh';
    }
    if (ten > 0) {
        word += (word !== '' ? ' ' : '') + numbersNouns[ten] + 'maH';
    }
    if (one > 0) {
        word += (word !== '' ? ' ' : '') + numbersNouns[one];
    }
    return word === '' ? 'pagh' : word;
}

export default moment.defineLocale('tlh', {
    months: 'tera’ jar wa’_tera’ jar cha’_tera’ jar wej_tera’ jar loS_tera’ jar vagh_tera’ jar jav_tera’ jar Soch_tera’ jar chorgh_tera’ jar Hut_tera’ jar wa’maH_tera’ jar wa’maH wa’_tera’ jar wa’maH cha’'.split(
        '_'
    ),
    monthsShort:
        'jar wa’_jar cha’_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa’maH_jar wa’maH wa’_jar wa’maH cha’'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split(
        '_'
    ),
    weekdaysShort:
        'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),
    weekdaysMin:
        'lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[DaHjaj] LT',
        nextDay: '[wa’leS] LT',
        nextWeek: 'LLL',
        lastDay: '[wa’Hu’] LT',
        lastWeek: 'LLL',
        sameElse: 'L',
    },
    relativeTime: {
        future: translateFuture,
        past: translatePast,
        s: 'puS lup',
        ss: translate,
        m: 'wa’ tup',
        mm: translate,
        h: 'wa’ rep',
        hh: translate,
        d: 'wa’ jaj',
        dd: translate,
        M: 'wa’ jar',
        MM: translate,
        y: 'wa’ DIS',
        yy: translate,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Turkish [tr]
//! authors : Erhan Gundogan : https://github.com/erhangundogan,
//!           Burak Yiğit Kaya: https://github.com/BYK

import moment from '../moment';

var suffixes = {
    1: "'inci",
    5: "'inci",
    8: "'inci",
    70: "'inci",
    80: "'inci",
    2: "'nci",
    7: "'nci",
    20: "'nci",
    50: "'nci",
    3: "'üncü",
    4: "'üncü",
    100: "'üncü",
    6: "'ncı",
    9: "'uncu",
    10: "'uncu",
    30: "'uncu",
    60: "'ıncı",
    90: "'ıncı",
};

export default moment.defineLocale('tr', {
    months: 'Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık'.split(
        '_'
    ),
    monthsShort: 'Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara'.split('_'),
    weekdays: 'Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi'.split(
        '_'
    ),
    weekdaysShort: 'Paz_Pzt_Sal_Çar_Per_Cum_Cmt'.split('_'),
    weekdaysMin: 'Pz_Pt_Sa_Ça_Pe_Cu_Ct'.split('_'),
    meridiem: function (hours, minutes, isLower) {
        if (hours < 12) {
            return isLower ? 'öö' : 'ÖÖ';
        } else {
            return isLower ? 'ös' : 'ÖS';
        }
    },
    meridiemParse: /öö|ÖÖ|ös|ÖS/,
    isPM: function (input) {
        return input === 'ös' || input === 'ÖS';
    },
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[bugün saat] LT',
        nextDay: '[yarın saat] LT',
        nextWeek: '[gelecek] dddd [saat] LT',
        lastDay: '[dün] LT',
        lastWeek: '[geçen] dddd [saat] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s sonra',
        past: '%s önce',
        s: 'birkaç saniye',
        ss: '%d saniye',
        m: 'bir dakika',
        mm: '%d dakika',
        h: 'bir saat',
        hh: '%d saat',
        d: 'bir gün',
        dd: '%d gün',
        w: 'bir hafta',
        ww: '%d hafta',
        M: 'bir ay',
        MM: '%d ay',
        y: 'bir yıl',
        yy: '%d yıl',
    },
    ordinal: function (number, period) {
        switch (period) {
            case 'd':
            case 'D':
            case 'Do':
            case 'DD':
                return number;
            default:
                if (number === 0) {
                    // special case for zero
                    return number + "'ıncı";
                }
                var a = number % 10,
                    b = (number % 100) - a,
                    c = number >= 100 ? 100 : null;
                return number + (suffixes[a] || suffixes[b] || suffixes[c]);
        }
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Talossan [tzl]
//! author : Robin van der Vliet : https://github.com/robin0van0der0v
//! author : Iustì Canun

import moment from '../moment';

// After the year there should be a slash and the amount of years since December 26, 1979 in Roman numerals.
// This is currently too difficult (maybe even impossible) to add.
export default moment.defineLocale('tzl', {
    months: 'Januar_Fevraglh_Març_Avrïu_Mai_Gün_Julia_Guscht_Setemvar_Listopäts_Noemvar_Zecemvar'.split(
        '_'
    ),
    monthsShort: 'Jan_Fev_Mar_Avr_Mai_Gün_Jul_Gus_Set_Lis_Noe_Zec'.split('_'),
    weekdays: 'Súladi_Lúneçi_Maitzi_Márcuri_Xhúadi_Viénerçi_Sáturi'.split('_'),
    weekdaysShort: 'Súl_Lún_Mai_Már_Xhú_Vié_Sát'.split('_'),
    weekdaysMin: 'Sú_Lú_Ma_Má_Xh_Vi_Sá'.split('_'),
    longDateFormat: {
        LT: 'HH.mm',
        LTS: 'HH.mm.ss',
        L: 'DD.MM.YYYY',
        LL: 'D. MMMM [dallas] YYYY',
        LLL: 'D. MMMM [dallas] YYYY HH.mm',
        LLLL: 'dddd, [li] D. MMMM [dallas] YYYY HH.mm',
    },
    meridiemParse: /d\'o|d\'a/i,
    isPM: function (input) {
        return "d'o" === input.toLowerCase();
    },
    meridiem: function (hours, minutes, isLower) {
        if (hours > 11) {
            return isLower ? "d'o" : "D'O";
        } else {
            return isLower ? "d'a" : "D'A";
        }
    },
    calendar: {
        sameDay: '[oxhi à] LT',
        nextDay: '[demà à] LT',
        nextWeek: 'dddd [à] LT',
        lastDay: '[ieiri à] LT',
        lastWeek: '[sür el] dddd [lasteu à] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'osprei %s',
        past: 'ja%s',
        s: processRelativeTime,
        ss: processRelativeTime,
        m: processRelativeTime,
        mm: processRelativeTime,
        h: processRelativeTime,
        hh: processRelativeTime,
        d: processRelativeTime,
        dd: processRelativeTime,
        M: processRelativeTime,
        MM: processRelativeTime,
        y: processRelativeTime,
        yy: processRelativeTime,
    },
    dayOfMonthOrdinalParse: /\d{1,2}\./,
    ordinal: '%d.',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});

function processRelativeTime(number, withoutSuffix, key, isFuture) {
    var format = {
        s: ['viensas secunds', "'iensas secunds"],
        ss: [number + ' secunds', '' + number + ' secunds'],
        m: ["'n míut", "'iens míut"],
        mm: [number + ' míuts', '' + number + ' míuts'],
        h: ["'n þora", "'iensa þora"],
        hh: [number + ' þoras', '' + number + ' þoras'],
        d: ["'n ziua", "'iensa ziua"],
        dd: [number + ' ziuas', '' + number + ' ziuas'],
        M: ["'n mes", "'iens mes"],
        MM: [number + ' mesen', '' + number + ' mesen'],
        y: ["'n ar", "'iens ar"],
        yy: [number + ' ars', '' + number + ' ars'],
    };
    return isFuture
        ? format[key][0]
        : withoutSuffix
        ? format[key][0]
        : format[key][1];
}
//! moment.js locale configuration
//! locale : Central Atlas Tamazight Latin [tzm-latn]
//! author : Abdel Said : https://github.com/abdelsaid

import moment from '../moment';

export default moment.defineLocale('tzm-latn', {
    months: 'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split(
        '_'
    ),
    monthsShort:
        'innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir'.split(
            '_'
        ),
    weekdays: 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
    weekdaysShort: 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
    weekdaysMin: 'asamas_aynas_asinas_akras_akwas_asimwas_asiḍyas'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[asdkh g] LT',
        nextDay: '[aska g] LT',
        nextWeek: 'dddd [g] LT',
        lastDay: '[assant g] LT',
        lastWeek: 'dddd [g] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'dadkh s yan %s',
        past: 'yan %s',
        s: 'imik',
        ss: '%d imik',
        m: 'minuḍ',
        mm: '%d minuḍ',
        h: 'saɛa',
        hh: '%d tassaɛin',
        d: 'ass',
        dd: '%d ossan',
        M: 'ayowr',
        MM: '%d iyyirn',
        y: 'asgas',
        yy: '%d isgasn',
    },
    week: {
        dow: 6, // Saturday is the first day of the week.
        doy: 12, // The week that contains Jan 12th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Central Atlas Tamazight [tzm]
//! author : Abdel Said : https://github.com/abdelsaid

import moment from '../moment';

export default moment.defineLocale('tzm', {
    months: 'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split(
        '_'
    ),
    monthsShort:
        'ⵉⵏⵏⴰⵢⵔ_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓⵏⵢⵓ_ⵢⵓⵍⵢⵓⵣ_ⵖⵓⵛⵜ_ⵛⵓⵜⴰⵏⴱⵉⵔ_ⴽⵟⵓⴱⵕ_ⵏⵓⵡⴰⵏⴱⵉⵔ_ⴷⵓⵊⵏⴱⵉⵔ'.split(
            '_'
        ),
    weekdays: 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
    weekdaysShort: 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
    weekdaysMin: 'ⴰⵙⴰⵎⴰⵙ_ⴰⵢⵏⴰⵙ_ⴰⵙⵉⵏⴰⵙ_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[ⴰⵙⴷⵅ ⴴ] LT',
        nextDay: '[ⴰⵙⴽⴰ ⴴ] LT',
        nextWeek: 'dddd [ⴴ] LT',
        lastDay: '[ⴰⵚⴰⵏⵜ ⴴ] LT',
        lastWeek: 'dddd [ⴴ] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ %s',
        past: 'ⵢⴰⵏ %s',
        s: 'ⵉⵎⵉⴽ',
        ss: '%d ⵉⵎⵉⴽ',
        m: 'ⵎⵉⵏⵓⴺ',
        mm: '%d ⵎⵉⵏⵓⴺ',
        h: 'ⵙⴰⵄⴰ',
        hh: '%d ⵜⴰⵙⵙⴰⵄⵉⵏ',
        d: 'ⴰⵙⵙ',
        dd: '%d oⵙⵙⴰⵏ',
        M: 'ⴰⵢoⵓⵔ',
        MM: '%d ⵉⵢⵢⵉⵔⵏ',
        y: 'ⴰⵙⴳⴰⵙ',
        yy: '%d ⵉⵙⴳⴰⵙⵏ',
    },
    week: {
        dow: 6, // Saturday is the first day of the week.
        doy: 12, // The week that contains Jan 12th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Uyghur (China) [ug-cn]
//! author: boyaq : https://github.com/boyaq

import moment from '../moment';

export default moment.defineLocale('ug-cn', {
    months: 'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split(
        '_'
    ),
    monthsShort:
        'يانۋار_فېۋرال_مارت_ئاپرېل_ماي_ئىيۇن_ئىيۇل_ئاۋغۇست_سېنتەبىر_ئۆكتەبىر_نويابىر_دېكابىر'.split(
            '_'
        ),
    weekdays: 'يەكشەنبە_دۈشەنبە_سەيشەنبە_چارشەنبە_پەيشەنبە_جۈمە_شەنبە'.split(
        '_'
    ),
    weekdaysShort: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'),
    weekdaysMin: 'يە_دۈ_سە_چا_پە_جۈ_شە'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'YYYY-MM-DD',
        LL: 'YYYY-يىلىM-ئاينىڭD-كۈنى',
        LLL: 'YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm',
        LLLL: 'dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm',
    },
    meridiemParse: /يېرىم كېچە|سەھەر|چۈشتىن بۇرۇن|چۈش|چۈشتىن كېيىن|كەچ/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (
            meridiem === 'يېرىم كېچە' ||
            meridiem === 'سەھەر' ||
            meridiem === 'چۈشتىن بۇرۇن'
        ) {
            return hour;
        } else if (meridiem === 'چۈشتىن كېيىن' || meridiem === 'كەچ') {
            return hour + 12;
        } else {
            return hour >= 11 ? hour : hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        var hm = hour * 100 + minute;
        if (hm < 600) {
            return 'يېرىم كېچە';
        } else if (hm < 900) {
            return 'سەھەر';
        } else if (hm < 1130) {
            return 'چۈشتىن بۇرۇن';
        } else if (hm < 1230) {
            return 'چۈش';
        } else if (hm < 1800) {
            return 'چۈشتىن كېيىن';
        } else {
            return 'كەچ';
        }
    },
    calendar: {
        sameDay: '[بۈگۈن سائەت] LT',
        nextDay: '[ئەتە سائەت] LT',
        nextWeek: '[كېلەركى] dddd [سائەت] LT',
        lastDay: '[تۆنۈگۈن] LT',
        lastWeek: '[ئالدىنقى] dddd [سائەت] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s كېيىن',
        past: '%s بۇرۇن',
        s: 'نەچچە سېكونت',
        ss: '%d سېكونت',
        m: 'بىر مىنۇت',
        mm: '%d مىنۇت',
        h: 'بىر سائەت',
        hh: '%d سائەت',
        d: 'بىر كۈن',
        dd: '%d كۈن',
        M: 'بىر ئاي',
        MM: '%d ئاي',
        y: 'بىر يىل',
        yy: '%d يىل',
    },

    dayOfMonthOrdinalParse: /\d{1,2}(-كۈنى|-ئاي|-ھەپتە)/,
    ordinal: function (number, period) {
        switch (period) {
            case 'd':
            case 'D':
            case 'DDD':
                return number + '-كۈنى';
            case 'w':
            case 'W':
                return number + '-ھەپتە';
            default:
                return number;
        }
    },
    preparse: function (string) {
        return string.replace(/،/g, ',');
    },
    postformat: function (string) {
        return string.replace(/,/g, '،');
    },
    week: {
        // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 1st is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Ukrainian [uk]
//! author : zemlanin : https://github.com/zemlanin
//! Author : Menelion Elensúle : https://github.com/Oire

import moment from '../moment';

function plural(word, num) {
    var forms = word.split('_');
    return num % 10 === 1 && num % 100 !== 11
        ? forms[0]
        : num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20)
        ? forms[1]
        : forms[2];
}
function relativeTimeWithPlural(number, withoutSuffix, key) {
    var format = {
        ss: withoutSuffix ? 'секунда_секунди_секунд' : 'секунду_секунди_секунд',
        mm: withoutSuffix ? 'хвилина_хвилини_хвилин' : 'хвилину_хвилини_хвилин',
        hh: withoutSuffix ? 'година_години_годин' : 'годину_години_годин',
        dd: 'день_дні_днів',
        MM: 'місяць_місяці_місяців',
        yy: 'рік_роки_років',
    };
    if (key === 'm') {
        return withoutSuffix ? 'хвилина' : 'хвилину';
    } else if (key === 'h') {
        return withoutSuffix ? 'година' : 'годину';
    } else {
        return number + ' ' + plural(format[key], +number);
    }
}
function weekdaysCaseReplace(m, format) {
    var weekdays = {
            nominative:
                'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split(
                    '_'
                ),
            accusative:
                'неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу'.split(
                    '_'
                ),
            genitive:
                'неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи'.split(
                    '_'
                ),
        },
        nounCase;

    if (m === true) {
        return weekdays['nominative']
            .slice(1, 7)
            .concat(weekdays['nominative'].slice(0, 1));
    }
    if (!m) {
        return weekdays['nominative'];
    }

    nounCase = /(\[[ВвУу]\]) ?dddd/.test(format)
        ? 'accusative'
        : /\[?(?:минулої|наступної)? ?\] ?dddd/.test(format)
        ? 'genitive'
        : 'nominative';
    return weekdays[nounCase][m.day()];
}
function processHoursFunction(str) {
    return function () {
        return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT';
    };
}

export default moment.defineLocale('uk', {
    months: {
        format: 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split(
            '_'
        ),
        standalone:
            'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split(
                '_'
            ),
    },
    monthsShort: 'січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд'.split(
        '_'
    ),
    weekdays: weekdaysCaseReplace,
    weekdaysShort: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
    weekdaysMin: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD.MM.YYYY',
        LL: 'D MMMM YYYY р.',
        LLL: 'D MMMM YYYY р., HH:mm',
        LLLL: 'dddd, D MMMM YYYY р., HH:mm',
    },
    calendar: {
        sameDay: processHoursFunction('[Сьогодні '),
        nextDay: processHoursFunction('[Завтра '),
        lastDay: processHoursFunction('[Вчора '),
        nextWeek: processHoursFunction('[У] dddd ['),
        lastWeek: function () {
            switch (this.day()) {
                case 0:
                case 3:
                case 5:
                case 6:
                    return processHoursFunction('[Минулої] dddd [').call(this);
                case 1:
                case 2:
                case 4:
                    return processHoursFunction('[Минулого] dddd [').call(this);
            }
        },
        sameElse: 'L',
    },
    relativeTime: {
        future: 'за %s',
        past: '%s тому',
        s: 'декілька секунд',
        ss: relativeTimeWithPlural,
        m: relativeTimeWithPlural,
        mm: relativeTimeWithPlural,
        h: 'годину',
        hh: relativeTimeWithPlural,
        d: 'день',
        dd: relativeTimeWithPlural,
        M: 'місяць',
        MM: relativeTimeWithPlural,
        y: 'рік',
        yy: relativeTimeWithPlural,
    },
    // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
    meridiemParse: /ночі|ранку|дня|вечора/,
    isPM: function (input) {
        return /^(дня|вечора)$/.test(input);
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 4) {
            return 'ночі';
        } else if (hour < 12) {
            return 'ранку';
        } else if (hour < 17) {
            return 'дня';
        } else {
            return 'вечора';
        }
    },
    dayOfMonthOrdinalParse: /\d{1,2}-(й|го)/,
    ordinal: function (number, period) {
        switch (period) {
            case 'M':
            case 'd':
            case 'DDD':
            case 'w':
            case 'W':
                return number + '-й';
            case 'D':
                return number + '-го';
            default:
                return number;
        }
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Urdu [ur]
//! author : Sawood Alam : https://github.com/ibnesayeed
//! author : Zack : https://github.com/ZackVision

import moment from '../moment';

var months = [
        'جنوری',
        'فروری',
        'مارچ',
        'اپریل',
        'مئی',
        'جون',
        'جولائی',
        'اگست',
        'ستمبر',
        'اکتوبر',
        'نومبر',
        'دسمبر',
    ],
    days = ['اتوار', 'پیر', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'ہفتہ'];

export default moment.defineLocale('ur', {
    months: months,
    monthsShort: months,
    weekdays: days,
    weekdaysShort: days,
    weekdaysMin: days,
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd، D MMMM YYYY HH:mm',
    },
    meridiemParse: /صبح|شام/,
    isPM: function (input) {
        return 'شام' === input;
    },
    meridiem: function (hour, minute, isLower) {
        if (hour < 12) {
            return 'صبح';
        }
        return 'شام';
    },
    calendar: {
        sameDay: '[آج بوقت] LT',
        nextDay: '[کل بوقت] LT',
        nextWeek: 'dddd [بوقت] LT',
        lastDay: '[گذشتہ روز بوقت] LT',
        lastWeek: '[گذشتہ] dddd [بوقت] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s بعد',
        past: '%s قبل',
        s: 'چند سیکنڈ',
        ss: '%d سیکنڈ',
        m: 'ایک منٹ',
        mm: '%d منٹ',
        h: 'ایک گھنٹہ',
        hh: '%d گھنٹے',
        d: 'ایک دن',
        dd: '%d دن',
        M: 'ایک ماہ',
        MM: '%d ماہ',
        y: 'ایک سال',
        yy: '%d سال',
    },
    preparse: function (string) {
        return string.replace(/،/g, ',');
    },
    postformat: function (string) {
        return string.replace(/,/g, '،');
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Uzbek Latin [uz-latn]
//! author : Rasulbek Mirzayev : github.com/Rasulbeeek

import moment from '../moment';

export default moment.defineLocale('uz-latn', {
    months: 'Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr'.split(
        '_'
    ),
    monthsShort: 'Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek'.split('_'),
    weekdays:
        'Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba'.split(
            '_'
        ),
    weekdaysShort: 'Yak_Dush_Sesh_Chor_Pay_Jum_Shan'.split('_'),
    weekdaysMin: 'Ya_Du_Se_Cho_Pa_Ju_Sha'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'D MMMM YYYY, dddd HH:mm',
    },
    calendar: {
        sameDay: '[Bugun soat] LT [da]',
        nextDay: '[Ertaga] LT [da]',
        nextWeek: 'dddd [kuni soat] LT [da]',
        lastDay: '[Kecha soat] LT [da]',
        lastWeek: "[O'tgan] dddd [kuni soat] LT [da]",
        sameElse: 'L',
    },
    relativeTime: {
        future: 'Yaqin %s ichida',
        past: 'Bir necha %s oldin',
        s: 'soniya',
        ss: '%d soniya',
        m: 'bir daqiqa',
        mm: '%d daqiqa',
        h: 'bir soat',
        hh: '%d soat',
        d: 'bir kun',
        dd: '%d kun',
        M: 'bir oy',
        MM: '%d oy',
        y: 'bir yil',
        yy: '%d yil',
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 7th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Uzbek [uz]
//! author : Sardor Muminov : https://github.com/muminoff

import moment from '../moment';

export default moment.defineLocale('uz', {
    months: 'январ_феврал_март_апрел_май_июн_июл_август_сентябр_октябр_ноябр_декабр'.split(
        '_'
    ),
    monthsShort: 'янв_фев_мар_апр_май_июн_июл_авг_сен_окт_ноя_дек'.split('_'),
    weekdays: 'Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба'.split('_'),
    weekdaysShort: 'Якш_Душ_Сеш_Чор_Пай_Жум_Шан'.split('_'),
    weekdaysMin: 'Як_Ду_Се_Чо_Па_Жу_Ша'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'D MMMM YYYY, dddd HH:mm',
    },
    calendar: {
        sameDay: '[Бугун соат] LT [да]',
        nextDay: '[Эртага] LT [да]',
        nextWeek: 'dddd [куни соат] LT [да]',
        lastDay: '[Кеча соат] LT [да]',
        lastWeek: '[Утган] dddd [куни соат] LT [да]',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'Якин %s ичида',
        past: 'Бир неча %s олдин',
        s: 'фурсат',
        ss: '%d фурсат',
        m: 'бир дакика',
        mm: '%d дакика',
        h: 'бир соат',
        hh: '%d соат',
        d: 'бир кун',
        dd: '%d кун',
        M: 'бир ой',
        MM: '%d ой',
        y: 'бир йил',
        yy: '%d йил',
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 7, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Vietnamese [vi]
//! author : Bang Nguyen : https://github.com/bangnk
//! author : Chien Kira : https://github.com/chienkira

import moment from '../moment';

export default moment.defineLocale('vi', {
    months: 'tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12'.split(
        '_'
    ),
    monthsShort:
        'Thg 01_Thg 02_Thg 03_Thg 04_Thg 05_Thg 06_Thg 07_Thg 08_Thg 09_Thg 10_Thg 11_Thg 12'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays: 'chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy'.split(
        '_'
    ),
    weekdaysShort: 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
    weekdaysMin: 'CN_T2_T3_T4_T5_T6_T7'.split('_'),
    weekdaysParseExact: true,
    meridiemParse: /sa|ch/i,
    isPM: function (input) {
        return /^ch$/i.test(input);
    },
    meridiem: function (hours, minutes, isLower) {
        if (hours < 12) {
            return isLower ? 'sa' : 'SA';
        } else {
            return isLower ? 'ch' : 'CH';
        }
    },
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM [năm] YYYY',
        LLL: 'D MMMM [năm] YYYY HH:mm',
        LLLL: 'dddd, D MMMM [năm] YYYY HH:mm',
        l: 'DD/M/YYYY',
        ll: 'D MMM YYYY',
        lll: 'D MMM YYYY HH:mm',
        llll: 'ddd, D MMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[Hôm nay lúc] LT',
        nextDay: '[Ngày mai lúc] LT',
        nextWeek: 'dddd [tuần tới lúc] LT',
        lastDay: '[Hôm qua lúc] LT',
        lastWeek: 'dddd [tuần trước lúc] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: '%s tới',
        past: '%s trước',
        s: 'vài giây',
        ss: '%d giây',
        m: 'một phút',
        mm: '%d phút',
        h: 'một giờ',
        hh: '%d giờ',
        d: 'một ngày',
        dd: '%d ngày',
        w: 'một tuần',
        ww: '%d tuần',
        M: 'một tháng',
        MM: '%d tháng',
        y: 'một năm',
        yy: '%d năm',
    },
    dayOfMonthOrdinalParse: /\d{1,2}/,
    ordinal: function (number) {
        return number;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Pseudo [x-pseudo]
//! author : Andrew Hood : https://github.com/andrewhood125

import moment from '../moment';

export default moment.defineLocale('x-pseudo', {
    months: 'J~áñúá~rý_F~ébrú~árý_~Márc~h_Áp~ríl_~Máý_~Júñé~_Júl~ý_Áú~gúst~_Sép~témb~ér_Ó~ctób~ér_Ñ~óvém~bér_~Décé~mbér'.split(
        '_'
    ),
    monthsShort:
        'J~áñ_~Féb_~Már_~Ápr_~Máý_~Júñ_~Júl_~Áúg_~Sép_~Óct_~Ñóv_~Déc'.split(
            '_'
        ),
    monthsParseExact: true,
    weekdays:
        'S~úñdá~ý_Mó~ñdáý~_Túé~sdáý~_Wéd~ñésd~áý_T~húrs~dáý_~Fríd~áý_S~átúr~dáý'.split(
            '_'
        ),
    weekdaysShort: 'S~úñ_~Móñ_~Túé_~Wéd_~Thú_~Frí_~Sát'.split('_'),
    weekdaysMin: 'S~ú_Mó~_Tú_~Wé_T~h_Fr~_Sá'.split('_'),
    weekdaysParseExact: true,
    longDateFormat: {
        LT: 'HH:mm',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY HH:mm',
        LLLL: 'dddd, D MMMM YYYY HH:mm',
    },
    calendar: {
        sameDay: '[T~ódá~ý át] LT',
        nextDay: '[T~ómó~rró~w át] LT',
        nextWeek: 'dddd [át] LT',
        lastDay: '[Ý~ést~érdá~ý át] LT',
        lastWeek: '[L~ást] dddd [át] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'í~ñ %s',
        past: '%s á~gó',
        s: 'á ~féw ~sécó~ñds',
        ss: '%d s~écóñ~ds',
        m: 'á ~míñ~úté',
        mm: '%d m~íñú~tés',
        h: 'á~ñ hó~úr',
        hh: '%d h~óúrs',
        d: 'á ~dáý',
        dd: '%d d~áýs',
        M: 'á ~móñ~th',
        MM: '%d m~óñt~hs',
        y: 'á ~ýéár',
        yy: '%d ý~éárs',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/,
    ordinal: function (number) {
        var b = number % 10,
            output =
                ~~((number % 100) / 10) === 1
                    ? 'th'
                    : b === 1
                    ? 'st'
                    : b === 2
                    ? 'nd'
                    : b === 3
                    ? 'rd'
                    : 'th';
        return number + output;
    },
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Yoruba Nigeria [yo]
//! author : Atolagbe Abisoye : https://github.com/andela-batolagbe

import moment from '../moment';

export default moment.defineLocale('yo', {
    months: 'Sẹ́rẹ́_Èrèlè_Ẹrẹ̀nà_Ìgbé_Èbibi_Òkùdu_Agẹmo_Ògún_Owewe_Ọ̀wàrà_Bélú_Ọ̀pẹ̀̀'.split(
        '_'
    ),
    monthsShort: 'Sẹ́r_Èrl_Ẹrn_Ìgb_Èbi_Òkù_Agẹ_Ògú_Owe_Ọ̀wà_Bél_Ọ̀pẹ̀̀'.split('_'),
    weekdays: 'Àìkú_Ajé_Ìsẹ́gun_Ọjọ́rú_Ọjọ́bọ_Ẹtì_Àbámẹ́ta'.split('_'),
    weekdaysShort: 'Àìk_Ajé_Ìsẹ́_Ọjr_Ọjb_Ẹtì_Àbá'.split('_'),
    weekdaysMin: 'Àì_Aj_Ìs_Ọr_Ọb_Ẹt_Àb'.split('_'),
    longDateFormat: {
        LT: 'h:mm A',
        LTS: 'h:mm:ss A',
        L: 'DD/MM/YYYY',
        LL: 'D MMMM YYYY',
        LLL: 'D MMMM YYYY h:mm A',
        LLLL: 'dddd, D MMMM YYYY h:mm A',
    },
    calendar: {
        sameDay: '[Ònì ni] LT',
        nextDay: '[Ọ̀la ni] LT',
        nextWeek: "dddd [Ọsẹ̀ tón'bọ] [ni] LT",
        lastDay: '[Àna ni] LT',
        lastWeek: 'dddd [Ọsẹ̀ tólọ́] [ni] LT',
        sameElse: 'L',
    },
    relativeTime: {
        future: 'ní %s',
        past: '%s kọjá',
        s: 'ìsẹjú aayá die',
        ss: 'aayá %d',
        m: 'ìsẹjú kan',
        mm: 'ìsẹjú %d',
        h: 'wákati kan',
        hh: 'wákati %d',
        d: 'ọjọ́ kan',
        dd: 'ọjọ́ %d',
        M: 'osù kan',
        MM: 'osù %d',
        y: 'ọdún kan',
        yy: 'ọdún %d',
    },
    dayOfMonthOrdinalParse: /ọjọ́\s\d{1,2}/,
    ordinal: 'ọjọ́ %d',
    week: {
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Chinese (China) [zh-cn]
//! author : suupic : https://github.com/suupic
//! author : Zeno Zeng : https://github.com/zenozeng
//! author : uu109 : https://github.com/uu109

import moment from '../moment';

export default moment.defineLocale('zh-cn', {
    months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(
        '_'
    ),
    monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(
        '_'
    ),
    weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
    weekdaysShort: '周日_周一_周二_周三_周四_周五_周六'.split('_'),
    weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'YYYY/MM/DD',
        LL: 'YYYY年M月D日',
        LLL: 'YYYY年M月D日Ah点mm分',
        LLLL: 'YYYY年M月D日ddddAh点mm分',
        l: 'YYYY/M/D',
        ll: 'YYYY年M月D日',
        lll: 'YYYY年M月D日 HH:mm',
        llll: 'YYYY年M月D日dddd HH:mm',
    },
    meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
            return hour;
        } else if (meridiem === '下午' || meridiem === '晚上') {
            return hour + 12;
        } else {
            // '中午'
            return hour >= 11 ? hour : hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        var hm = hour * 100 + minute;
        if (hm < 600) {
            return '凌晨';
        } else if (hm < 900) {
            return '早上';
        } else if (hm < 1130) {
            return '上午';
        } else if (hm < 1230) {
            return '中午';
        } else if (hm < 1800) {
            return '下午';
        } else {
            return '晚上';
        }
    },
    calendar: {
        sameDay: '[今天]LT',
        nextDay: '[明天]LT',
        nextWeek: function (now) {
            if (now.week() !== this.week()) {
                return '[下]dddLT';
            } else {
                return '[本]dddLT';
            }
        },
        lastDay: '[昨天]LT',
        lastWeek: function (now) {
            if (this.week() !== now.week()) {
                return '[上]dddLT';
            } else {
                return '[本]dddLT';
            }
        },
        sameElse: 'L',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(日|月|周)/,
    ordinal: function (number, period) {
        switch (period) {
            case 'd':
            case 'D':
            case 'DDD':
                return number + '日';
            case 'M':
                return number + '月';
            case 'w':
            case 'W':
                return number + '周';
            default:
                return number;
        }
    },
    relativeTime: {
        future: '%s后',
        past: '%s前',
        s: '几秒',
        ss: '%d 秒',
        m: '1 分钟',
        mm: '%d 分钟',
        h: '1 小时',
        hh: '%d 小时',
        d: '1 天',
        dd: '%d 天',
        w: '1 周',
        ww: '%d 周',
        M: '1 个月',
        MM: '%d 个月',
        y: '1 年',
        yy: '%d 年',
    },
    week: {
        // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
        dow: 1, // Monday is the first day of the week.
        doy: 4, // The week that contains Jan 4th is the first week of the year.
    },
});
//! moment.js locale configuration
//! locale : Chinese (Hong Kong) [zh-hk]
//! author : Ben : https://github.com/ben-lin
//! author : Chris Lam : https://github.com/hehachris
//! author : Konstantin : https://github.com/skfd
//! author : Anthony : https://github.com/anthonylau

import moment from '../moment';

export default moment.defineLocale('zh-hk', {
    months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(
        '_'
    ),
    monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(
        '_'
    ),
    weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
    weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),
    weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'YYYY/MM/DD',
        LL: 'YYYY年M月D日',
        LLL: 'YYYY年M月D日 HH:mm',
        LLLL: 'YYYY年M月D日dddd HH:mm',
        l: 'YYYY/M/D',
        ll: 'YYYY年M月D日',
        lll: 'YYYY年M月D日 HH:mm',
        llll: 'YYYY年M月D日dddd HH:mm',
    },
    meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
            return hour;
        } else if (meridiem === '中午') {
            return hour >= 11 ? hour : hour + 12;
        } else if (meridiem === '下午' || meridiem === '晚上') {
            return hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        var hm = hour * 100 + minute;
        if (hm < 600) {
            return '凌晨';
        } else if (hm < 900) {
            return '早上';
        } else if (hm < 1200) {
            return '上午';
        } else if (hm === 1200) {
            return '中午';
        } else if (hm < 1800) {
            return '下午';
        } else {
            return '晚上';
        }
    },
    calendar: {
        sameDay: '[今天]LT',
        nextDay: '[明天]LT',
        nextWeek: '[下]ddddLT',
        lastDay: '[昨天]LT',
        lastWeek: '[上]ddddLT',
        sameElse: 'L',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/,
    ordinal: function (number, period) {
        switch (period) {
            case 'd':
            case 'D':
            case 'DDD':
                return number + '日';
            case 'M':
                return number + '月';
            case 'w':
            case 'W':
                return number + '週';
            default:
                return number;
        }
    },
    relativeTime: {
        future: '%s後',
        past: '%s前',
        s: '幾秒',
        ss: '%d 秒',
        m: '1 分鐘',
        mm: '%d 分鐘',
        h: '1 小時',
        hh: '%d 小時',
        d: '1 天',
        dd: '%d 天',
        M: '1 個月',
        MM: '%d 個月',
        y: '1 年',
        yy: '%d 年',
    },
});
//! moment.js locale configuration
//! locale : Chinese (Macau) [zh-mo]
//! author : Ben : https://github.com/ben-lin
//! author : Chris Lam : https://github.com/hehachris
//! author : Tan Yuanhong : https://github.com/le0tan

import moment from '../moment';

export default moment.defineLocale('zh-mo', {
    months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(
        '_'
    ),
    monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(
        '_'
    ),
    weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
    weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),
    weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'DD/MM/YYYY',
        LL: 'YYYY年M月D日',
        LLL: 'YYYY年M月D日 HH:mm',
        LLLL: 'YYYY年M月D日dddd HH:mm',
        l: 'D/M/YYYY',
        ll: 'YYYY年M月D日',
        lll: 'YYYY年M月D日 HH:mm',
        llll: 'YYYY年M月D日dddd HH:mm',
    },
    meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
            return hour;
        } else if (meridiem === '中午') {
            return hour >= 11 ? hour : hour + 12;
        } else if (meridiem === '下午' || meridiem === '晚上') {
            return hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        var hm = hour * 100 + minute;
        if (hm < 600) {
            return '凌晨';
        } else if (hm < 900) {
            return '早上';
        } else if (hm < 1130) {
            return '上午';
        } else if (hm < 1230) {
            return '中午';
        } else if (hm < 1800) {
            return '下午';
        } else {
            return '晚上';
        }
    },
    calendar: {
        sameDay: '[今天] LT',
        nextDay: '[明天] LT',
        nextWeek: '[下]dddd LT',
        lastDay: '[昨天] LT',
        lastWeek: '[上]dddd LT',
        sameElse: 'L',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/,
    ordinal: function (number, period) {
        switch (period) {
            case 'd':
            case 'D':
            case 'DDD':
                return number + '日';
            case 'M':
                return number + '月';
            case 'w':
            case 'W':
                return number + '週';
            default:
                return number;
        }
    },
    relativeTime: {
        future: '%s內',
        past: '%s前',
        s: '幾秒',
        ss: '%d 秒',
        m: '1 分鐘',
        mm: '%d 分鐘',
        h: '1 小時',
        hh: '%d 小時',
        d: '1 天',
        dd: '%d 天',
        M: '1 個月',
        MM: '%d 個月',
        y: '1 年',
        yy: '%d 年',
    },
});
//! moment.js locale configuration
//! locale : Chinese (Taiwan) [zh-tw]
//! author : Ben : https://github.com/ben-lin
//! author : Chris Lam : https://github.com/hehachris

import moment from '../moment';

export default moment.defineLocale('zh-tw', {
    months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split(
        '_'
    ),
    monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split(
        '_'
    ),
    weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
    weekdaysShort: '週日_週一_週二_週三_週四_週五_週六'.split('_'),
    weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
    longDateFormat: {
        LT: 'HH:mm',
        LTS: 'HH:mm:ss',
        L: 'YYYY/MM/DD',
        LL: 'YYYY年M月D日',
        LLL: 'YYYY年M月D日 HH:mm',
        LLLL: 'YYYY年M月D日dddd HH:mm',
        l: 'YYYY/M/D',
        ll: 'YYYY年M月D日',
        lll: 'YYYY年M月D日 HH:mm',
        llll: 'YYYY年M月D日dddd HH:mm',
    },
    meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
    meridiemHour: function (hour, meridiem) {
        if (hour === 12) {
            hour = 0;
        }
        if (meridiem === '凌晨' || meridiem === '早上' || meridiem === '上午') {
            return hour;
        } else if (meridiem === '中午') {
            return hour >= 11 ? hour : hour + 12;
        } else if (meridiem === '下午' || meridiem === '晚上') {
            return hour + 12;
        }
    },
    meridiem: function (hour, minute, isLower) {
        var hm = hour * 100 + minute;
        if (hm < 600) {
            return '凌晨';
        } else if (hm < 900) {
            return '早上';
        } else if (hm < 1130) {
            return '上午';
        } else if (hm < 1230) {
            return '中午';
        } else if (hm < 1800) {
            return '下午';
        } else {
            return '晚上';
        }
    },
    calendar: {
        sameDay: '[今天] LT',
        nextDay: '[明天] LT',
        nextWeek: '[下]dddd LT',
        lastDay: '[昨天] LT',
        lastWeek: '[上]dddd LT',
        sameElse: 'L',
    },
    dayOfMonthOrdinalParse: /\d{1,2}(日|月|週)/,
    ordinal: function (number, period) {
        switch (period) {
            case 'd':
            case 'D':
            case 'DDD':
                return number + '日';
            case 'M':
                return number + '月';
            case 'w':
            case 'W':
                return number + '週';
            default:
                return number;
        }
    },
    relativeTime: {
        future: '%s後',
        past: '%s前',
        s: '幾秒',
        ss: '%d 秒',
        m: '1 分鐘',
        mm: '%d 分鐘',
        h: '1 小時',
        hh: '%d 小時',
        d: '1 天',
        dd: '%d 天',
        M: '1 個月',
        MM: '%d 個月',
        y: '1 年',
        yy: '%d 年',
    },
});
The MIT License (MIT)

Copyright (c) JS Foundation and other contributors

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

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

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.{
  "name": "moment/moment-timezone",
  "description": "Parse and display dates in any timezone",
  "version": "0.5.34",
  "keywords": [
    "moment",
    "date",
    "time",
    "timezone",
    "olson",
    "iana",
    "zone",
    "tz"
  ],
  "homepage": "http://momentjs.com/timezone/",
  "license": "MIT",
  "support": {
    "issues": "https://github.com/moment/moment-timezone/issues",
    "source": "https://github.com/moment/moment-timezone"
  },
  "authors": [
    {
      "name": "Tim Wood",
      "email": "washwithcare@gmail.com",
      "homepage": "http://timwoodcreates.com/"
    }
  ],
  "type": "component",
  "require": {
    "robloach/component-installer": "*",
    "moment/moment": ">=2.9.0"
  },
  "extra": {
    "component": {
      "scripts": [
        "moment-timezone.js"
      ],
      "files": [
        "builds/*.js"
      ]
    }
  }
}
var moment = module.exports = require("./moment-timezone");
moment.tz.load(require('./data/packed/latest.json'));
//! moment-timezone-utils.js
//! version : 0.5.34
//! Copyright (c) JS Foundation and other contributors
//! license : MIT
//! github.com/moment/moment-timezone

(function (root, factory) {
	"use strict";

	/*global define*/
    if (typeof module === 'object' && module.exports) {
        module.exports = factory(require('./'));     // Node
    } else if (typeof define === 'function' && define.amd) {
		define(['moment'], factory);                 // AMD
	} else {
		factory(root.moment);                        // Browser
	}
}(this, function (moment) {
	"use strict";

	if (!moment.tz) {
		throw new Error("moment-timezone-utils.js must be loaded after moment-timezone.js");
	}

	/************************************
		Pack Base 60
	************************************/

	var BASE60 = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX',
		EPSILON = 0.000001; // Used to fix floating point rounding errors

	function packBase60Fraction(fraction, precision) {
		var buffer = '.',
			output = '',
			current;

		while (precision > 0) {
			precision  -= 1;
			fraction   *= 60;
			current     = Math.floor(fraction + EPSILON);
			buffer     += BASE60[current];
			fraction   -= current;

			// Only add buffer to output once we have a non-zero value.
			// This makes '.000' output '', and '.100' output '.1'
			if (current) {
				output += buffer;
				buffer  = '';
			}
		}

		return output;
	}

	function packBase60(number, precision) {
		var output = '',
			absolute = Math.abs(number),
			whole = Math.floor(absolute),
			fraction = packBase60Fraction(absolute - whole, Math.min(~~precision, 10));

		while (whole > 0) {
			output = BASE60[whole % 60] + output;
			whole = Math.floor(whole / 60);
		}

		if (number < 0) {
			output = '-' + output;
		}

		if (output && fraction) {
			return output + fraction;
		}

		if (!fraction && output === '-') {
			return '0';
		}

		return output || fraction || '0';
	}

	/************************************
		Pack
	************************************/

	function packUntils(untils) {
		var out = [],
			last = 0,
			i;

		for (i = 0; i < untils.length - 1; i++) {
			out[i] = packBase60(Math.round((untils[i] - last) / 1000) / 60, 1);
			last = untils[i];
		}

		return out.join(' ');
	}

	function packAbbrsAndOffsets(source) {
		var index = 0,
			abbrs = [],
			offsets = [],
			indices = [],
			map = {},
			i, key;

		for (i = 0; i < source.abbrs.length; i++) {
			key = source.abbrs[i] + '|' + source.offsets[i];
			if (map[key] === undefined) {
				map[key] = index;
				abbrs[index] = source.abbrs[i];
				offsets[index] = packBase60(Math.round(source.offsets[i] * 60) / 60, 1);
				index++;
			}
			indices[i] = packBase60(map[key], 0);
		}

		return abbrs.join(' ') + '|' + offsets.join(' ') + '|' + indices.join('');
	}

	function packPopulation (number) {
		if (!number) {
			return '';
		}
		if (number < 1000) {
			return number;
		}
		var exponent = String(number | 0).length - 2;
		var precision = Math.round(number / Math.pow(10, exponent));
		return precision + 'e' + exponent;
	}

	function packCountries (countries) {
		if (!countries) {
			return '';
		}
		return countries.join(' ');
	}

	function validatePackData (source) {
		if (!source.name)    { throw new Error("Missing name"); }
		if (!source.abbrs)   { throw new Error("Missing abbrs"); }
		if (!source.untils)  { throw new Error("Missing untils"); }
		if (!source.offsets) { throw new Error("Missing offsets"); }
		if (
			source.offsets.length !== source.untils.length ||
			source.offsets.length !== source.abbrs.length
		) {
			throw new Error("Mismatched array lengths");
		}
	}

	function pack (source) {
		validatePackData(source);
		return [
			source.name, // 0 - timezone name
			packAbbrsAndOffsets(source), // 1 - abbrs, 2 - offsets, 3 - indices
			packUntils(source.untils), // 4 - untils
			packPopulation(source.population) // 5 - population
		].join('|');
	}

	function packCountry (source) {
		return [
			source.name,
			source.zones.join(' '),
		].join('|');
	}

	/************************************
		Create Links
	************************************/

	function arraysAreEqual(a, b) {
		var i;

		if (a.length !== b.length) { return false; }

		for (i = 0; i < a.length; i++) {
			if (a[i] !== b[i]) {
				return false;
			}
		}
		return true;
	}

	function zonesAreEqual(a, b) {
		return arraysAreEqual(a.offsets, b.offsets) && arraysAreEqual(a.abbrs, b.abbrs) && arraysAreEqual(a.untils, b.untils);
	}

	function findAndCreateLinks (input, output, links, groupLeaders) {
		var i, j, a, b, group, foundGroup, groups = [];

		for (i = 0; i < input.length; i++) {
			foundGroup = false;
			a = input[i];

			for (j = 0; j < groups.length; j++) {
				group = groups[j];
				b = group[0];
				if (zonesAreEqual(a, b)) {
					if (a.population > b.population) {
						group.unshift(a);
					} else if (a.population === b.population && groupLeaders && groupLeaders[a.name]) {
                        group.unshift(a);
                    } else {
						group.push(a);
					}
					foundGroup = true;
				}
			}

			if (!foundGroup) {
				groups.push([a]);
			}
		}

		for (i = 0; i < groups.length; i++) {
			group = groups[i];
			output.push(group[0]);
			for (j = 1; j < group.length; j++) {
				links.push(group[0].name + '|' + group[j].name);
			}
		}
	}

	function createLinks (source, groupLeaders) {
		var zones = [],
			links = [];

		if (source.links) {
			links = source.links.slice();
		}

		findAndCreateLinks(source.zones, zones, links, groupLeaders);

		return {
			version 	: source.version,
			zones   	: zones,
			links   	: links.sort()
		};
	}

	/************************************
		Filter Years
	************************************/

	function findStartAndEndIndex (untils, start, end) {
		var startI = 0,
			endI = untils.length + 1,
			untilYear,
			i;

		if (!end) {
			end = start;
		}

		if (start > end) {
			i = start;
			start = end;
			end = i;
		}

		for (i = 0; i < untils.length; i++) {
			if (untils[i] == null) {
				continue;
			}
			untilYear = new Date(untils[i]).getUTCFullYear();
			if (untilYear < start) {
				startI = i + 1;
			}
			if (untilYear > end) {
				endI = Math.min(endI, i + 1);
			}
		}

		return [startI, endI];
	}

	function filterYears (source, start, end) {
		var slice     = Array.prototype.slice,
			indices   = findStartAndEndIndex(source.untils, start, end),
			untils    = slice.apply(source.untils, indices);

		untils[untils.length - 1] = null;

		return {
			name       : source.name,
			abbrs      : slice.apply(source.abbrs, indices),
			untils     : untils,
			offsets    : slice.apply(source.offsets, indices),
			population : source.population,
			countries  : source.countries
		};
	}

	/************************************
		Filter, Link, and Pack
	************************************/

	function filterLinkPack (input, start, end, groupLeaders) {
		var i,
			inputZones = input.zones,
			outputZones = [],
			output;

		for (i = 0; i < inputZones.length; i++) {
			outputZones[i] = filterYears(inputZones[i], start, end);
		}

		output = createLinks({
			zones : outputZones,
			links : input.links.slice(),
			version : input.version
		}, groupLeaders);

		for (i = 0; i < output.zones.length; i++) {
			output.zones[i] = pack(output.zones[i]);
		}

		output.countries = input.countries ? input.countries.map(function (unpacked) {
			return packCountry(unpacked);
		}) : [];

		return output;
	}

	/************************************
		Exports
	************************************/

	moment.tz.pack           = pack;
	moment.tz.packBase60     = packBase60;
	moment.tz.createLinks    = createLinks;
	moment.tz.filterYears    = filterYears;
	moment.tz.filterLinkPack = filterLinkPack;
	moment.tz.packCountry	 = packCountry;

	return moment;
}));
//! moment-timezone.js
//! version : 0.5.34
//! Copyright (c) JS Foundation and other contributors
//! license : MIT
//! github.com/moment/moment-timezone

(function (root, factory) {
	"use strict";

	/*global define*/
	if (typeof module === 'object' && module.exports) {
		module.exports = factory(require('moment')); // Node
	} else if (typeof define === 'function' && define.amd) {
		define(['moment'], factory);                 // AMD
	} else {
		factory(root.moment);                        // Browser
	}
}(this, function (moment) {
	"use strict";

	// Resolves es6 module loading issue
	if (moment.version === undefined && moment.default) {
		moment = moment.default;
	}

	// Do not load moment-timezone a second time.
	// if (moment.tz !== undefined) {
	// 	logError('Moment Timezone ' + moment.tz.version + ' was already loaded ' + (moment.tz.dataVersion ? 'with data from ' : 'without any data') + moment.tz.dataVersion);
	// 	return moment;
	// }

	var VERSION = "0.5.34",
		zones = {},
		links = {},
		countries = {},
		names = {},
		guesses = {},
		cachedGuess;

	if (!moment || typeof moment.version !== 'string') {
		logError('Moment Timezone requires Moment.js. See https://momentjs.com/timezone/docs/#/use-it/browser/');
	}

	var momentVersion = moment.version.split('.'),
		major = +momentVersion[0],
		minor = +momentVersion[1];

	// Moment.js version check
	if (major < 2 || (major === 2 && minor < 6)) {
		logError('Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js ' + moment.version + '. See momentjs.com');
	}

	/************************************
		Unpacking
	************************************/

	function charCodeToInt(charCode) {
		if (charCode > 96) {
			return charCode - 87;
		} else if (charCode > 64) {
			return charCode - 29;
		}
		return charCode - 48;
	}

	function unpackBase60(string) {
		var i = 0,
			parts = string.split('.'),
			whole = parts[0],
			fractional = parts[1] || '',
			multiplier = 1,
			num,
			out = 0,
			sign = 1;

		// handle negative numbers
		if (string.charCodeAt(0) === 45) {
			i = 1;
			sign = -1;
		}

		// handle digits before the decimal
		for (i; i < whole.length; i++) {
			num = charCodeToInt(whole.charCodeAt(i));
			out = 60 * out + num;
		}

		// handle digits after the decimal
		for (i = 0; i < fractional.length; i++) {
			multiplier = multiplier / 60;
			num = charCodeToInt(fractional.charCodeAt(i));
			out += num * multiplier;
		}

		return out * sign;
	}

	function arrayToInt (array) {
		for (var i = 0; i < array.length; i++) {
			array[i] = unpackBase60(array[i]);
		}
	}

	function intToUntil (array, length) {
		for (var i = 0; i < length; i++) {
			array[i] = Math.round((array[i - 1] || 0) + (array[i] * 60000)); // minutes to milliseconds
		}

		array[length - 1] = Infinity;
	}

	function mapIndices (source, indices) {
		var out = [], i;

		for (i = 0; i < indices.length; i++) {
			out[i] = source[indices[i]];
		}

		return out;
	}

	function unpack (string) {
		var data = string.split('|'),
			offsets = data[2].split(' '),
			indices = data[3].split(''),
			untils  = data[4].split(' ');

		arrayToInt(offsets);
		arrayToInt(indices);
		arrayToInt(untils);

		intToUntil(untils, indices.length);

		return {
			name       : data[0],
			abbrs      : mapIndices(data[1].split(' '), indices),
			offsets    : mapIndices(offsets, indices),
			untils     : untils,
			population : data[5] | 0
		};
	}

	/************************************
		Zone object
	************************************/

	function Zone (packedString) {
		if (packedString) {
			this._set(unpack(packedString));
		}
	}

	Zone.prototype = {
		_set : function (unpacked) {
			this.name       = unpacked.name;
			this.abbrs      = unpacked.abbrs;
			this.untils     = unpacked.untils;
			this.offsets    = unpacked.offsets;
			this.population = unpacked.population;
		},

		_index : function (timestamp) {
			var target = +timestamp,
				untils = this.untils,
				i;

			for (i = 0; i < untils.length; i++) {
				if (target < untils[i]) {
					return i;
				}
			}
		},

		countries : function () {
			var zone_name = this.name;
			return Object.keys(countries).filter(function (country_code) {
				return countries[country_code].zones.indexOf(zone_name) !== -1;
			});
		},

		parse : function (timestamp) {
			var target  = +timestamp,
				offsets = this.offsets,
				untils  = this.untils,
				max     = untils.length - 1,
				offset, offsetNext, offsetPrev, i;

			for (i = 0; i < max; i++) {
				offset     = offsets[i];
				offsetNext = offsets[i + 1];
				offsetPrev = offsets[i ? i - 1 : i];

				if (offset < offsetNext && tz.moveAmbiguousForward) {
					offset = offsetNext;
				} else if (offset > offsetPrev && tz.moveInvalidForward) {
					offset = offsetPrev;
				}

				if (target < untils[i] - (offset * 60000)) {
					return offsets[i];
				}
			}

			return offsets[max];
		},

		abbr : function (mom) {
			return this.abbrs[this._index(mom)];
		},

		offset : function (mom) {
			logError("zone.offset has been deprecated in favor of zone.utcOffset");
			return this.offsets[this._index(mom)];
		},

		utcOffset : function (mom) {
			return this.offsets[this._index(mom)];
		}
	};

	/************************************
		Country object
	************************************/

	function Country (country_name, zone_names) {
		this.name = country_name;
		this.zones = zone_names;
	}

	/************************************
		Current Timezone
	************************************/

	function OffsetAt(at) {
		var timeString = at.toTimeString();
		var abbr = timeString.match(/\([a-z ]+\)/i);
		if (abbr && abbr[0]) {
			// 17:56:31 GMT-0600 (CST)
			// 17:56:31 GMT-0600 (Central Standard Time)
			abbr = abbr[0].match(/[A-Z]/g);
			abbr = abbr ? abbr.join('') : undefined;
		} else {
			// 17:56:31 CST
			// 17:56:31 GMT+0800 (台北標準時間)
			abbr = timeString.match(/[A-Z]{3,5}/g);
			abbr = abbr ? abbr[0] : undefined;
		}

		if (abbr === 'GMT') {
			abbr = undefined;
		}

		this.at = +at;
		this.abbr = abbr;
		this.offset = at.getTimezoneOffset();
	}

	function ZoneScore(zone) {
		this.zone = zone;
		this.offsetScore = 0;
		this.abbrScore = 0;
	}

	ZoneScore.prototype.scoreOffsetAt = function (offsetAt) {
		this.offsetScore += Math.abs(this.zone.utcOffset(offsetAt.at) - offsetAt.offset);
		if (this.zone.abbr(offsetAt.at).replace(/[^A-Z]/g, '') !== offsetAt.abbr) {
			this.abbrScore++;
		}
	};

	function findChange(low, high) {
		var mid, diff;

		while ((diff = ((high.at - low.at) / 12e4 | 0) * 6e4)) {
			mid = new OffsetAt(new Date(low.at + diff));
			if (mid.offset === low.offset) {
				low = mid;
			} else {
				high = mid;
			}
		}

		return low;
	}

	function userOffsets() {
		var startYear = new Date().getFullYear() - 2,
			last = new OffsetAt(new Date(startYear, 0, 1)),
			offsets = [last],
			change, next, i;

		for (i = 1; i < 48; i++) {
			next = new OffsetAt(new Date(startYear, i, 1));
			if (next.offset !== last.offset) {
				change = findChange(last, next);
				offsets.push(change);
				offsets.push(new OffsetAt(new Date(change.at + 6e4)));
			}
			last = next;
		}

		for (i = 0; i < 4; i++) {
			offsets.push(new OffsetAt(new Date(startYear + i, 0, 1)));
			offsets.push(new OffsetAt(new Date(startYear + i, 6, 1)));
		}

		return offsets;
	}

	function sortZoneScores (a, b) {
		if (a.offsetScore !== b.offsetScore) {
			return a.offsetScore - b.offsetScore;
		}
		if (a.abbrScore !== b.abbrScore) {
			return a.abbrScore - b.abbrScore;
		}
		if (a.zone.population !== b.zone.population) {
			return b.zone.population - a.zone.population;
		}
		return b.zone.name.localeCompare(a.zone.name);
	}

	function addToGuesses (name, offsets) {
		var i, offset;
		arrayToInt(offsets);
		for (i = 0; i < offsets.length; i++) {
			offset = offsets[i];
			guesses[offset] = guesses[offset] || {};
			guesses[offset][name] = true;
		}
	}

	function guessesForUserOffsets (offsets) {
		var offsetsLength = offsets.length,
			filteredGuesses = {},
			out = [],
			i, j, guessesOffset;

		for (i = 0; i < offsetsLength; i++) {
			guessesOffset = guesses[offsets[i].offset] || {};
			for (j in guessesOffset) {
				if (guessesOffset.hasOwnProperty(j)) {
					filteredGuesses[j] = true;
				}
			}
		}

		for (i in filteredGuesses) {
			if (filteredGuesses.hasOwnProperty(i)) {
				out.push(names[i]);
			}
		}

		return out;
	}

	function rebuildGuess () {

		// use Intl API when available and returning valid time zone
		try {
			var intlName = Intl.DateTimeFormat().resolvedOptions().timeZone;
			if (intlName && intlName.length > 3) {
				var name = names[normalizeName(intlName)];
				if (name) {
					return name;
				}
				logError("Moment Timezone found " + intlName + " from the Intl api, but did not have that data loaded.");
			}
		} catch (e) {
			// Intl unavailable, fall back to manual guessing.
		}

		var offsets = userOffsets(),
			offsetsLength = offsets.length,
			guesses = guessesForUserOffsets(offsets),
			zoneScores = [],
			zoneScore, i, j;

		for (i = 0; i < guesses.length; i++) {
			zoneScore = new ZoneScore(getZone(guesses[i]), offsetsLength);
			for (j = 0; j < offsetsLength; j++) {
				zoneScore.scoreOffsetAt(offsets[j]);
			}
			zoneScores.push(zoneScore);
		}

		zoneScores.sort(sortZoneScores);

		return zoneScores.length > 0 ? zoneScores[0].zone.name : undefined;
	}

	function guess (ignoreCache) {
		if (!cachedGuess || ignoreCache) {
			cachedGuess = rebuildGuess();
		}
		return cachedGuess;
	}

	/************************************
		Global Methods
	************************************/

	function normalizeName (name) {
		return (name || '').toLowerCase().replace(/\//g, '_');
	}

	function addZone (packed) {
		var i, name, split, normalized;

		if (typeof packed === "string") {
			packed = [packed];
		}

		for (i = 0; i < packed.length; i++) {
			split = packed[i].split('|');
			name = split[0];
			normalized = normalizeName(name);
			zones[normalized] = packed[i];
			names[normalized] = name;
			addToGuesses(normalized, split[2].split(' '));
		}
	}

	function getZone (name, caller) {

		name = normalizeName(name);

		var zone = zones[name];
		var link;

		if (zone instanceof Zone) {
			return zone;
		}

		if (typeof zone === 'string') {
			zone = new Zone(zone);
			zones[name] = zone;
			return zone;
		}

		// Pass getZone to prevent recursion more than 1 level deep
		if (links[name] && caller !== getZone && (link = getZone(links[name], getZone))) {
			zone = zones[name] = new Zone();
			zone._set(link);
			zone.name = names[name];
			return zone;
		}

		return null;
	}

	function getNames () {
		var i, out = [];

		for (i in names) {
			if (names.hasOwnProperty(i) && (zones[i] || zones[links[i]]) && names[i]) {
				out.push(names[i]);
			}
		}

		return out.sort();
	}

	function getCountryNames () {
		return Object.keys(countries);
	}

	function addLink (aliases) {
		var i, alias, normal0, normal1;

		if (typeof aliases === "string") {
			aliases = [aliases];
		}

		for (i = 0; i < aliases.length; i++) {
			alias = aliases[i].split('|');

			normal0 = normalizeName(alias[0]);
			normal1 = normalizeName(alias[1]);

			links[normal0] = normal1;
			names[normal0] = alias[0];

			links[normal1] = normal0;
			names[normal1] = alias[1];
		}
	}

	function addCountries (data) {
		var i, country_code, country_zones, split;
		if (!data || !data.length) return;
		for (i = 0; i < data.length; i++) {
			split = data[i].split('|');
			country_code = split[0].toUpperCase();
			country_zones = split[1].split(' ');
			countries[country_code] = new Country(
				country_code,
				country_zones
			);
		}
	}

	function getCountry (name) {
		name = name.toUpperCase();
		return countries[name] || null;
	}

	function zonesForCountry(country, with_offset) {
		country = getCountry(country);

		if (!country) return null;

		var zones = country.zones.sort();

		if (with_offset) {
			return zones.map(function (zone_name) {
				var zone = getZone(zone_name);
				return {
					name: zone_name,
					offset: zone.utcOffset(new Date())
				};
			});
		}

		return zones;
	}

	function loadData (data) {
		addZone(data.zones);
		addLink(data.links);
		addCountries(data.countries);
		tz.dataVersion = data.version;
	}

	function zoneExists (name) {
		if (!zoneExists.didShowError) {
			zoneExists.didShowError = true;
				logError("moment.tz.zoneExists('" + name + "') has been deprecated in favor of !moment.tz.zone('" + name + "')");
		}
		return !!getZone(name);
	}

	function needsOffset (m) {
		var isUnixTimestamp = (m._f === 'X' || m._f === 'x');
		return !!(m._a && (m._tzm === undefined) && !isUnixTimestamp);
	}

	function logError (message) {
		if (typeof console !== 'undefined' && typeof console.error === 'function') {
			console.error(message);
		}
	}

	/************************************
		moment.tz namespace
	************************************/

	function tz (input) {
		var args = Array.prototype.slice.call(arguments, 0, -1),
			name = arguments[arguments.length - 1],
			zone = getZone(name),
			out  = moment.utc.apply(null, args);

		if (zone && !moment.isMoment(input) && needsOffset(out)) {
			out.add(zone.parse(out), 'minutes');
		}

		out.tz(name);

		return out;
	}

	tz.version      = VERSION;
	tz.dataVersion  = '';
	tz._zones       = zones;
	tz._links       = links;
	tz._names       = names;
	tz._countries	= countries;
	tz.add          = addZone;
	tz.link         = addLink;
	tz.load         = loadData;
	tz.zone         = getZone;
	tz.zoneExists   = zoneExists; // deprecated in 0.1.0
	tz.guess        = guess;
	tz.names        = getNames;
	tz.Zone         = Zone;
	tz.unpack       = unpack;
	tz.unpackBase60 = unpackBase60;
	tz.needsOffset  = needsOffset;
	tz.moveInvalidForward   = true;
	tz.moveAmbiguousForward = false;
	tz.countries    = getCountryNames;
	tz.zonesForCountry = zonesForCountry;

	/************************************
		Interface with Moment.js
	************************************/

	var fn = moment.fn;

	moment.tz = tz;

	moment.defaultZone = null;

	moment.updateOffset = function (mom, keepTime) {
		var zone = moment.defaultZone,
			offset;

		if (mom._z === undefined) {
			if (zone && needsOffset(mom) && !mom._isUTC) {
				mom._d = moment.utc(mom._a)._d;
				mom.utc().add(zone.parse(mom), 'minutes');
			}
			mom._z = zone;
		}
		if (mom._z) {
			offset = mom._z.utcOffset(mom);
			if (Math.abs(offset) < 16) {
				offset = offset / 60;
			}
			if (mom.utcOffset !== undefined) {
				var z = mom._z;
				mom.utcOffset(-offset, keepTime);
				mom._z = z;
			} else {
				mom.zone(offset, keepTime);
			}
		}
	};

	fn.tz = function (name, keepTime) {
		if (name) {
			if (typeof name !== 'string') {
				throw new Error('Time zone name must be a string, got ' + name + ' [' + typeof name + ']');
			}
			this._z = getZone(name);
			if (this._z) {
				moment.updateOffset(this, keepTime);
			} else {
				logError("Moment Timezone has no data for " + name + ". See http://momentjs.com/timezone/docs/#/data-loading/.");
			}
			return this;
		}
		if (this._z) { return this._z.name; }
	};

	function abbrWrap (old) {
		return function () {
			if (this._z) { return this._z.abbr(this); }
			return old.call(this);
		};
	}

	function resetZoneWrap (old) {
		return function () {
			this._z = null;
			return old.apply(this, arguments);
		};
	}

	function resetZoneWrap2 (old) {
		return function () {
			if (arguments.length > 0) this._z = null;
			return old.apply(this, arguments);
		};
	}

	fn.zoneName  = abbrWrap(fn.zoneName);
	fn.zoneAbbr  = abbrWrap(fn.zoneAbbr);
	fn.utc       = resetZoneWrap(fn.utc);
	fn.local     = resetZoneWrap(fn.local);
	fn.utcOffset = resetZoneWrap2(fn.utcOffset);

	moment.tz.setDefault = function(name) {
		if (major < 2 || (major === 2 && minor < 9)) {
			logError('Moment Timezone setDefault() requires Moment.js >= 2.9.0. You are using Moment.js ' + moment.version + '.');
		}
		moment.defaultZone = name ? getZone(name) : null;
		return moment;
	};

	// Cloning a moment should include the _z property.
	var momentProperties = moment.momentProperties;
	if (Object.prototype.toString.call(momentProperties) === '[object Array]') {
		// moment 2.8.1+
		momentProperties.push('_z');
		momentProperties.push('_a');
	} else if (momentProperties) {
		// moment 2.7.0
		momentProperties._z = null;
	}

	// INJECT DATA

	return moment;
}));
{
  "name": "moment-timezone",
  "version": "0.5.34",
  "description": "Parse and display moments in any timezone.",
  "homepage": "http://momentjs.com/timezone/",
  "author": "Tim Wood <washwithcare@gmail.com> (http://timwoodcreates.com/)",
  "main": "./index.js",
  "typings": "./index.d.ts",
  "engines": {
    "node": "*"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/moment/moment-timezone.git"
  },
  "license": "MIT",
  "dependencies": {
    "moment": ">= 2.9.0"
  },
  "devDependencies": {
    "grunt": "1.0.4",
    "grunt-contrib-clean": "^2.0.0",
    "grunt-contrib-jshint": "^2.1.0",
    "grunt-contrib-nodeunit": "^2.0.0",
    "grunt-contrib-uglify": "^4.0.1",
    "grunt-exec": "^3.0.0",
    "typescript": "^3.5.1"
  }
}{
	"version": "2021e",
	"zones": [
		"Africa/Abidjan|LMT GMT|g.8 0|01|-2ldXH.Q|48e5",
		"Africa/Nairobi|LMT +0230 EAT +0245|-2r.g -2u -30 -2J|012132|-2ua2r.g N6nV.g 3Fbu h1cu dzbJ|47e5",
		"Africa/Algiers|PMT WET WEST CET CEST|-9.l 0 -10 -10 -20|0121212121212121343431312123431213|-2nco9.l cNb9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 DA0 Imo0 rd0 De0 9Xz0 1fb0 1ap0 16K0 2yo0 mEp0 hwL0 jxA0 11A0 dDd0 17b0 11B0 1cN0 2Dy0 1cN0 1fB0 1cL0|26e5",
		"Africa/Lagos|LMT GMT +0030 WAT|-d.z 0 -u -10|01023|-2B40d.z 7iod.z dnXK.p dLzH.z|17e6",
		"Africa/Bissau|LMT -01 GMT|12.k 10 0|012|-2ldX0 2xoo0|39e4",
		"Africa/Maputo|LMT CAT|-2a.k -20|01|-2GJea.k|26e5",
		"Africa/Cairo|EET EEST|-20 -30|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1bIO0 vb0 1ip0 11z0 1iN0 1nz0 12p0 1pz0 10N0 1pz0 16p0 1jz0 s3d0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1WL0 rd0 1Rz0 wp0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1qL0 Xd0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1ny0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 WL0 1qN0 Rb0 1wp0 On0 1zd0 Lz0 1EN0 Fb0 c10 8n0 8Nd0 gL0 e10 mn0|15e6",
		"Africa/Casablanca|LMT +00 +01|u.k 0 -10|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-2gMnt.E 130Lt.E rb0 Dd0 dVb0 b6p0 TX0 EoB0 LL0 gnd0 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4mn0 SyN0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0 2600 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0|32e5",
		"Africa/Ceuta|WET WEST CET CEST|0 -10 -10 -20|010101010101010101010232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-25KN0 11z0 drd0 18p0 3HX0 17d0 1fz0 1a10 1io0 1a00 1y7o0 LL0 gnd0 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4VB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|85e3",
		"Africa/El_Aaiun|LMT -01 +00 +01|Q.M 10 0 -10|012323232323232323232323232323232323232323232323232323232323232323232323232323232323|-1rDz7.c 1GVA7.c 6L0 AL0 1Nd0 XX0 1Cp0 pz0 1cBB0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0 2600 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0|20e4",
		"Africa/Johannesburg|SAST SAST SAST|-1u -20 -30|012121|-2GJdu 1Ajdu 1cL0 1cN0 1cL0|84e5",
		"Africa/Juba|LMT CAT CAST EAT|-26.s -20 -30 -30|012121212121212121212121212121212131|-1yW26.s 1zK06.s 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0 PeX0|",
		"Africa/Khartoum|LMT CAT CAST EAT|-2a.8 -20 -30 -30|012121212121212121212121212121212131|-1yW2a.8 1zK0a.8 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0 HjL0|51e5",
		"Africa/Monrovia|MMT MMT GMT|H.8 I.u 0|012|-23Lzg.Q 28G01.m|11e5",
		"Africa/Ndjamena|LMT WAT WAST|-10.c -10 -20|0121|-2le10.c 2J3c0.c Wn0|13e5",
		"Africa/Sao_Tome|LMT GMT WAT|A.J 0 -10|0121|-2le00 4i6N0 2q00|",
		"Africa/Tripoli|LMT CET CEST EET|-Q.I -10 -20 -20|012121213121212121212121213123123|-21JcQ.I 1hnBQ.I vx0 4iP0 xx0 4eN0 Bb0 7ip0 U0n0 A10 1db0 1cN0 1db0 1dd0 1db0 1eN0 1bb0 1e10 1cL0 1c10 1db0 1dd0 1db0 1cN0 1db0 1q10 fAn0 1ep0 1db0 AKq0 TA0 1o00|11e5",
		"Africa/Tunis|PMT CET CEST|-9.l -10 -20|0121212121212121212121212121212121|-2nco9.l 18pa9.l 1qM0 DA0 3Tc0 11B0 1ze0 WM0 7z0 3d0 14L0 1cN0 1f90 1ar0 16J0 1gXB0 WM0 1rA0 11c0 nwo0 Ko0 1cM0 1cM0 1rA0 10M0 zuM0 10N0 1aN0 1qM0 WM0 1qM0 11A0 1o00|20e5",
		"Africa/Windhoek|+0130 SAST SAST CAT WAT|-1u -20 -30 -20 -10|01213434343434343434343434343434343434343434343434343|-2GJdu 1Ajdu 1cL0 1SqL0 9Io0 16P0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0|32e4",
		"America/Adak|NST NWT NPT BST BDT AHST HST HDT|b0 a0 a0 b0 a0 a0 a0 90|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17SX0 8wW0 iB0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|326",
		"America/Anchorage|AST AWT APT AHST AHDT YST AKST AKDT|a0 90 90 a0 90 90 90 80|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17T00 8wX0 iA0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|30e4",
		"America/Puerto_Rico|AST AWT APT|40 30 30|0120|-17lU0 7XT0 iu0|24e5",
		"America/Araguaina|LMT -03 -02|3c.M 30 20|0121212121212121212121212121212121212121212121212121|-2glwL.c HdKL.c 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 ny10 Lz0|14e4",
		"America/Argentina/Buenos_Aires|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 A4p0 uL0 1qN0 WL0|",
		"America/Argentina/Catamarca|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323132321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 7B0 8zb0 uL0|",
		"America/Argentina/Cordoba|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323132323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0 1qN0 WL0|",
		"America/Argentina/Jujuy|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323121323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1ze0 TX0 1ld0 WK0 1wp0 TX0 A4p0 uL0|",
		"America/Argentina/La_Rioja|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0|",
		"America/Argentina/Mendoza|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232312121321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1u20 SL0 1vd0 Tb0 1wp0 TW0 ri10 Op0 7TX0 uL0|",
		"America/Argentina/Rio_Gallegos|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0|",
		"America/Argentina/Salta|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0|",
		"America/Argentina/San_Juan|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rld0 m10 8lb0 uL0|",
		"America/Argentina/San_Luis|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323121212321212|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 XX0 1q20 SL0 AN0 vDb0 m10 8lb0 8L0 jd0 1qN0 WL0 1qN0|",
		"America/Argentina/Tucuman|CMT -04 -03 -02|4g.M 40 30 20|0121212121212121212121212121212121212121212323232313232123232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 4N0 8BX0 uL0 1qN0 WL0|",
		"America/Argentina/Ushuaia|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rkN0 8p0 8zb0 uL0|",
		"America/Asuncion|AMT -04 -03|3O.E 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-1x589.k 1DKM9.k 3CL0 3Dd0 10L0 1pB0 10n0 1pB0 10n0 1pB0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1lB0 14n0 1dd0 1cL0 1fd0 WL0 1rd0 1aL0 1dB0 Xz0 1qp0 Xb0 1qN0 10L0 1rB0 TX0 1tB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 WN0 1qL0 11B0 1nX0 1ip0 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 TX0 1tB0 19X0 1a10 1fz0 1a10 1fz0 1cN0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0|28e5",
		"America/Panama|CMT EST|5j.A 50|01|-2uduE.o|15e5",
		"America/Bahia_Banderas|LMT MST CST PST MDT CDT|71 70 60 80 60 50|0121212131414141414141414141414141414152525252525252525252525252525252525252525252525252525252|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nW0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|84e3",
		"America/Bahia|LMT -03 -02|2y.4 30 20|01212121212121212121212121212121212121212121212121212121212121|-2glxp.U HdLp.U 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 l5B0 Rb0|27e5",
		"America/Barbados|LMT AST ADT -0330|3W.t 40 30 3u|0121213121212121|-2m4k1.v 1eAN1.v RB0 1Bz0 Op0 1rb0 11d0 1jJc0 IL0 1ip0 17b0 1ip0 17b0 1ld0 13b0|28e4",
		"America/Belem|LMT -03 -02|3d.U 30 20|012121212121212121212121212121|-2glwK.4 HdKK.4 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0|20e5",
		"America/Belize|LMT CST -0530 CWT CPT CDT|5Q.M 60 5u 50 50 50|012121212121212121212121212121212121212121212121213412121212121212121212121212121212121212121215151|-2kBu7.c fPA7.c Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu Rcu 7Bt0 Ni0 4nd0 Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu e9Au qn0 lxB0 mn0|57e3",
		"America/Boa_Vista|LMT -04 -03|42.E 40 30|0121212121212121212121212121212121|-2glvV.k HdKV.k 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 smp0 WL0 1tB0 2L0|62e2",
		"America/Bogota|BMT -05 -04|4U.g 50 40|0121|-2eb73.I 38yo3.I 2en0|90e5",
		"America/Boise|PST PDT MST MWT MPT MDT|80 70 70 60 60 60|0101023425252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-261q0 1nX0 11B0 1nX0 8C10 JCL0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 Dd0 1Kn0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e4",
		"America/Cambridge_Bay|-00 MST MWT MPT MDDT MDT CST CDT EST|0 70 60 60 50 60 60 50 50|0123141515151515151515151515151515151515151515678651515151515151515151515151515151515151515151515151515151515151515151515151|-21Jc0 RO90 8x20 ix0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11A0 1nX0 2K0 WQ0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e2",
		"America/Campo_Grande|LMT -04 -03|3C.s 40 30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glwl.w HdLl.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|77e4",
		"America/Cancun|LMT CST EST EDT CDT|5L.4 60 50 40 50|0123232341414141414141414141414141414141412|-1UQG0 2q2o0 yLB0 1lb0 14p0 1lb0 14p0 Lz0 xB0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 Dd0|63e4",
		"America/Caracas|CMT -0430 -04|4r.E 4u 40|01212|-2kV7w.k 28KM2.k 1IwOu kqo0|29e5",
		"America/Cayenne|LMT -04 -03|3t.k 40 30|012|-2mrwu.E 2gWou.E|58e3",
		"America/Chicago|CST CDT EST CWT CPT|60 50 50 50 50|01010101010101010101010101010101010102010101010103401010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 1wp0 TX0 WN0 1qL0 1cN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 11B0 1Hz0 14p0 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|92e5",
		"America/Chihuahua|LMT MST CST CDT MDT|74.k 70 60 50 60|0121212323241414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 2zQN0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|81e4",
		"America/Costa_Rica|SJMT CST CDT|5A.d 60 50|0121212121|-1Xd6n.L 2lu0n.L Db0 1Kp0 Db0 pRB0 15b0 1kp0 mL0|12e5",
		"America/Phoenix|MST MDT MWT|70 60 60|01010202010|-261r0 1nX0 11B0 1nX0 SgN0 4Al1 Ap0 1db0 SWqX 1cL0|42e5",
		"America/Cuiaba|LMT -04 -03|3I.k 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glwf.E HdLf.E 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 4a10 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|54e4",
		"America/Danmarkshavn|LMT -03 -02 GMT|1e.E 30 20 0|01212121212121212121212121212121213|-2a5WJ.k 2z5fJ.k 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 DC0|8",
		"America/Dawson_Creek|PST PDT PWT PPT MST|80 70 70 70 70|0102301010101010101010101010101010101010101010101010101014|-25TO0 1in0 UGp0 8x10 iy0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 ML0|12e3",
		"America/Dawson|YST YDT YWT YPT YDDT PST PDT MST|90 80 80 80 70 80 70 70|010102304056565656565656565656565656565656565656565656565656565656565656565656565656565656567|-25TN0 1in0 1o10 13V0 Ser0 8x00 iz0 LCL0 1fA0 jrA0 fNd0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1z90|13e2",
		"America/Denver|MST MDT MWT MPT|70 60 60 60|01010101023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261r0 1nX0 11B0 1nX0 11B0 1qL0 WN0 mn0 Ord0 8x20 ix0 LCN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e5",
		"America/Detroit|LMT CST EST EWT EPT EDT|5w.b 60 50 40 40 40|0123425252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-2Cgir.N peqr.N 156L0 8x40 iv0 6fd0 11z0 JxX1 SMX 1cN0 1cL0 aW10 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e5",
		"America/Edmonton|LMT MST MDT MWT MPT|7x.Q 70 60 60 60|0121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2yd4q.8 shdq.8 1in0 17d0 hz0 2dB0 1fz0 1a10 11z0 1qN0 WL0 1qN0 11z0 IGN0 8x20 ix0 3NB0 11z0 XQp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|10e5",
		"America/Eirunepe|LMT -05 -04|4D.s 50 40|0121212121212121212121212121212121|-2glvk.w HdLk.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0 yTd0 d5X0|31e3",
		"America/El_Salvador|LMT CST CDT|5U.M 60 50|012121|-1XiG3.c 2Fvc3.c WL0 1qN0 WL0|11e5",
		"America/Tijuana|LMT MST PST PDT PWT PPT|7M.4 70 80 70 70 70|012123245232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UQE0 4PX0 8mM0 8lc0 SN0 1cL0 pHB0 83r0 zI0 5O10 1Rz0 cOO0 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 BUp0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|20e5",
		"America/Fort_Nelson|PST PDT PWT PPT MST|80 70 70 70 70|01023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010104|-25TO0 1in0 UGp0 8x10 iy0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0|39e2",
		"America/Fort_Wayne|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|010101023010101010101010101040454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 QI10 Db0 RB0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 5Tz0 1o10 qLb0 1cL0 1cN0 1cL0 1qhd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
		"America/Fortaleza|LMT -03 -02|2y 30 20|0121212121212121212121212121212121212121|-2glxq HdLq 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 5z0 2mN0 On0|34e5",
		"America/Glace_Bay|LMT AST ADT AWT APT|3X.M 40 30 30 30|012134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsI0.c CwO0.c 1in0 UGp0 8x50 iu0 iq10 11z0 Jg10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3",
		"America/Godthab|LMT -03 -02|3q.U 30 20|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a5Ux.4 2z5dx.4 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e3",
		"America/Goose_Bay|NST NDT NST NDT NWT NPT AST ADT ADDT|3u.Q 2u.Q 3u 2u 2u 2u 40 30 20|010232323232323245232323232323232323232323232323232323232326767676767676767676767676767676767676767676768676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-25TSt.8 1in0 DXb0 2HbX.8 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 WL0 1qN0 WL0 1qN0 7UHu itu 1tB0 WL0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1tB0 WL0 1ld0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 S10 g0u 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|76e2",
		"America/Grand_Turk|KMT EST EDT AST|57.a 50 40 40|0121212121212121212121212121212121212121212121212121212121212121212121212132121212121212121212121212121212121212121|-2l1uQ.O 2HHBQ.O 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 7jA0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e2",
		"America/Guatemala|LMT CST CDT|62.4 60 50|0121212121|-24KhV.U 2efXV.U An0 mtd0 Nz0 ifB0 17b0 zDB0 11z0|13e5",
		"America/Guayaquil|QMT -05 -04|5e 50 40|0121|-1yVSK 2uILK rz0|27e5",
		"America/Guyana|LMT -04 -0345 -03|3Q.D 40 3J 30|01231|-2mf87.l 8Hc7.l 2r7bJ Ey0f|80e4",
		"America/Halifax|LMT AST ADT AWT APT|4e.o 40 30 30 30|0121212121212121212121212121212121212121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsHJ.A xzzJ.A 1db0 3I30 1in0 3HX0 IL0 1E10 ML0 1yN0 Pb0 1Bd0 Mn0 1Bd0 Rz0 1w10 Xb0 1w10 LX0 1w10 Xb0 1w10 Lz0 1C10 Jz0 1E10 OL0 1yN0 Un0 1qp0 Xb0 1qp0 11X0 1w10 Lz0 1HB0 LX0 1C10 FX0 1w10 Xb0 1qp0 Xb0 1BB0 LX0 1td0 Xb0 1qp0 Xb0 Rf0 8x50 iu0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 3Qp0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 3Qp0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 6i10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|39e4",
		"America/Havana|HMT CST CDT|5t.A 50 40|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1Meuu.o 72zu.o ML0 sld0 An0 1Nd0 Db0 1Nd0 An0 6Ep0 An0 1Nd0 An0 JDd0 Mn0 1Ap0 On0 1fd0 11X0 1qN0 WL0 1wp0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 14n0 1ld0 14L0 1kN0 15b0 1kp0 1cL0 1cN0 1fz0 1a10 1fz0 1fB0 11z0 14p0 1nX0 11B0 1nX0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 1a10 1in0 1a10 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 17c0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 11A0 6i00 Rc0 1wo0 U00 1tA0 Rc0 1wo0 U00 1wo0 U00 1zc0 U00 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0|21e5",
		"America/Hermosillo|LMT MST CST PST MDT|7n.Q 70 60 80 60|0121212131414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0|64e4",
		"America/Indiana/Knox|CST CDT CWT CPT EST|60 50 50 50 50|0101023010101010101010101010101010101040101010101010101010101010101010101010101010101010141010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 11z0 1o10 11z0 1o10 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 3Cn0 8wp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 z8o0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
		"America/Indiana/Marengo|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101023010101010101010104545454545414545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 dyN0 11z0 6fd0 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 jrz0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1e6p0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
		"America/Indiana/Petersburg|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010104010101010101010101010141014545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 njX0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 3Fb0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 19co0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
		"America/Indiana/Tell_City|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010401054541010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 njX0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 8wn0 1cN0 1cL0 1cN0 1cK0 1cN0 1cL0 1qhd0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
		"America/Indiana/Vevay|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|010102304545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 kPB0 Awn0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1lnd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
		"America/Indiana/Vincennes|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010101010454541014545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 g0p0 11z0 1o10 11z0 1qL0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 caL0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
		"America/Indiana/Winamac|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010101010101010454541054545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 jrz0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1za0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
		"America/Inuvik|-00 PST PDDT MST MDT|0 80 60 70 60|0121343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-FnA0 tWU0 1fA0 wPe0 2pz0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|35e2",
		"America/Iqaluit|-00 EWT EPT EST EDDT EDT CST CDT|0 40 40 50 30 40 60 50|01234353535353535353535353535353535353535353567353535353535353535353535353535353535353535353535353535353535353535353535353|-16K00 7nX0 iv0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|67e2",
		"America/Jamaica|KMT EST EDT|57.a 50 40|0121212121212121212121|-2l1uQ.O 2uM1Q.O 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0|94e4",
		"America/Juneau|PST PWT PPT PDT YDT YST AKST AKDT|80 70 70 70 80 90 90 80|01203030303030303030303030403030356767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cM0 1cM0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|33e3",
		"America/Kentucky/Louisville|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101010102301010101010101010101010101454545454545414545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 3Fd0 Nb0 LPd0 11z0 RB0 8x30 iw0 1nX1 e0X 9vd0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 xz0 gso0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
		"America/Kentucky/Monticello|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101023010101010101010101010101010101010101010101010101010101010101010101454545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 SWp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
		"America/La_Paz|CMT BST -04|4w.A 3w.A 40|012|-1x37r.o 13b0|19e5",
		"America/Lima|LMT -05 -04|58.A 50 40|0121212121212121|-2tyGP.o 1bDzP.o zX0 1aN0 1cL0 1cN0 1cL0 1PrB0 zX0 1O10 zX0 6Gp0 zX0 98p0 zX0|11e6",
		"America/Los_Angeles|PST PDT PWT PPT|80 70 70 70|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261q0 1nX0 11B0 1nX0 SgN0 8x10 iy0 5Wp1 1VaX 3dA0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e6",
		"America/Maceio|LMT -03 -02|2m.Q 30 20|012121212121212121212121212121212121212121|-2glxB.8 HdLB.8 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 8Q10 WL0 1tB0 5z0 2mN0 On0|93e4",
		"America/Managua|MMT CST EST CDT|5J.c 60 50 50|0121313121213131|-1quie.M 1yAMe.M 4mn0 9Up0 Dz0 1K10 Dz0 s3F0 1KH0 DB0 9In0 k8p0 19X0 1o30 11y0|22e5",
		"America/Manaus|LMT -04 -03|40.4 40 30|01212121212121212121212121212121|-2glvX.U HdKX.U 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0|19e5",
		"America/Martinique|FFMT AST ADT|44.k 40 30|0121|-2mPTT.E 2LPbT.E 19X0|39e4",
		"America/Matamoros|LMT CST CDT|6E 60 50|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1UQG0 2FjC0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|45e4",
		"America/Mazatlan|LMT MST CST PST MDT|75.E 70 60 80 60|0121212131414141414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|44e4",
		"America/Menominee|CST CDT CWT CPT EST|60 50 50 50 50|01010230101041010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 LCN0 1fz0 6410 9Jb0 1cM0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|85e2",
		"America/Merida|LMT CST EST CDT|5W.s 60 50 50|0121313131313131313131313131313131313131313131313131313131313131313131313131313131313131|-1UQG0 2q2o0 2hz0 wu30 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|11e5",
		"America/Metlakatla|PST PWT PPT PDT AKST AKDT|80 70 70 70 90 80|01203030303030303030303030303030304545450454545454545454545454545454545454545454|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1hU10 Rd0 1zb0 Op0 1zb0 Op0 1zb0 uM0 jB0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2",
		"America/Mexico_City|LMT MST CST CDT CWT|6A.A 70 60 50 50|012121232324232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 gEn0 TX0 3xd0 Jb0 6zB0 SL0 e5d0 17b0 1Pff0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|20e6",
		"America/Miquelon|LMT AST -03 -02|3I.E 40 30 20|012323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2mKkf.k 2LTAf.k gQ10 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|61e2",
		"America/Moncton|EST AST ADT AWT APT|50 40 30 30 30|012121212121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsH0 CwN0 1in0 zAo0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1K10 Lz0 1zB0 NX0 1u10 Wn0 S20 8x50 iu0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14n1 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 ReX 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|64e3",
		"America/Monterrey|LMT CST CDT|6F.g 60 50|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1UQG0 2FjC0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|41e5",
		"America/Montevideo|LMT MMT -04 -03 -0330 -0230 -02 -0130|3I.P 3I.P 40 30 3u 2u 20 1u|012343434343434343434343435353636353636375363636363636363636363636363636363636363636363|-2tRUf.9 sVc0 8jcf.9 1db0 1dcu 1cLu 1dcu 1cLu ircu 11zu 1o0u 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 1qMu WLu 1fAu 1cLu 1o0u 11zu NAu 3jXu zXu Dq0u 19Xu pcu jz0 cm10 19X0 6tB0 1fbu 3o0u jX0 4vB0 xz0 3Cp0 mmu 1a10 IMu Db0 4c10 uL0 1Nd0 An0 1SN0 uL0 mp0 28L0 iPB0 un0 1SN0 xz0 1zd0 Lz0 1zd0 Rb0 1zd0 On0 1wp0 Rb0 s8p0 1fB0 1ip0 11z0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 11z0|17e5",
		"America/Toronto|EST EDT EWT EPT|50 40 40 40|01010101010101010101010101010101010101010101012301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TR0 1in0 11Wu 1nzu 1fD0 WJ0 1wr0 Nb0 1Ap0 On0 1zd0 On0 1wp0 TX0 1tB0 TX0 1tB0 TX0 1tB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 4kM0 8x40 iv0 1o10 11z0 1nX0 11z0 1o10 11z0 1o10 1qL0 11D0 1nX0 11B0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e5",
		"America/New_York|EST EDT EWT EPT|50 40 40 40|01010101010101010101010101010101010101010101010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261t0 1nX0 11B0 1nX0 11B0 1qL0 1a10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x40 iv0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e6",
		"America/Nipigon|EST EDT EWT EPT|50 40 40 40|010123010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TR0 1in0 Rnb0 3je0 8x40 iv0 19yN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|16e2",
		"America/Nome|NST NWT NPT BST BDT YST AKST AKDT|b0 a0 a0 b0 a0 90 90 80|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17SX0 8wW0 iB0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cl0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|38e2",
		"America/Noronha|LMT -02 -01|29.E 20 10|0121212121212121212121212121212121212121|-2glxO.k HdKO.k 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|30e2",
		"America/North_Dakota/Beulah|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101014545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
		"America/North_Dakota/Center|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101014545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
		"America/North_Dakota/New_Salem|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101454545454545454545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
		"America/Ojinaga|LMT MST CST CDT MDT|6V.E 70 60 50 60|0121212323241414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 2zQN0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e3",
		"America/Pangnirtung|-00 AST AWT APT ADDT ADT EDT EST CST CDT|0 40 30 30 20 30 40 50 60 50|012314151515151515151515151515151515167676767689767676767676767676767676767676767676767676767676767676767676767676767676767|-1XiM0 PnG0 8x50 iu0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1o00 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2",
		"America/Paramaribo|LMT PMT PMT -0330 -03|3E.E 3E.Q 3E.A 3u 30|01234|-2nDUj.k Wqo0.c qanX.I 1yVXN.o|24e4",
		"America/Port-au-Prince|PPMT EST EDT|4N 50 40|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-28RHb 2FnMb 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14q0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 i6n0 1nX0 11B0 1nX0 d430 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 3iN0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5",
		"America/Rio_Branco|LMT -05 -04|4v.c 50 40|01212121212121212121212121212121|-2glvs.M HdLs.M 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 NBd0 d5X0|31e4",
		"America/Porto_Velho|LMT -04 -03|4f.A 40 30|012121212121212121212121212121|-2glvI.o HdKI.o 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0|37e4",
		"America/Punta_Arenas|SMT -05 -04 -03|4G.K 50 40 30|0102021212121212121232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-2q2jh.e fJAh.e 5knG.K 1Vzh.e jRAG.K 1pbh.e 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 nHX0 op0 blz0 ko0 Qeo0 WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|",
		"America/Rainy_River|CST CDT CWT CPT|60 50 50 50|010123010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TQ0 1in0 Rnb0 3je0 8x30 iw0 19yN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|842",
		"America/Rankin_Inlet|-00 CST CDDT CDT EST|0 60 40 50 50|012131313131313131313131313131313131313131313431313131313131313131313131313131313131313131313131313131313131313131313131|-vDc0 keu0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e2",
		"America/Recife|LMT -03 -02|2j.A 30 20|0121212121212121212121212121212121212121|-2glxE.o HdLE.o 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|33e5",
		"America/Regina|LMT MST MDT MWT MPT CST|6W.A 70 60 60 60 60|012121212121212121212121341212121212121212121212121215|-2AD51.o uHe1.o 1in0 s2L0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 66N0 1cL0 1cN0 19X0 1fB0 1cL0 1fB0 1cL0 1cN0 1cL0 M30 8x20 ix0 1ip0 1cL0 1ip0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 3NB0 1cL0 1cN0|19e4",
		"America/Resolute|-00 CST CDDT CDT EST|0 60 40 50 50|012131313131313131313131313131313131313131313431313131313431313131313131313131313131313131313131313131313131313131313131|-SnA0 GWS0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|229",
		"America/Santarem|LMT -04 -03|3C.M 40 30|0121212121212121212121212121212|-2glwl.c HdLl.c 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 NBd0|21e4",
		"America/Santiago|SMT -05 -04 -03|4G.K 50 40 30|010202121212121212321232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-2q2jh.e fJAh.e 5knG.K 1Vzh.e jRAG.K 1pbh.e 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 nHX0 op0 9Bz0 jb0 1oN0 ko0 Qeo0 WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0|62e5",
		"America/Santo_Domingo|SDMT EST EDT -0430 AST|4E 50 40 4u 40|01213131313131414|-1ttjk 1lJMk Mn0 6sp0 Lbu 1Cou yLu 1RAu wLu 1QMu xzu 1Q0u xXu 1PAu 13jB0 e00|29e5",
		"America/Sao_Paulo|LMT -03 -02|36.s 30 20|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glwR.w HdKR.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 pTd0 PX0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|20e6",
		"America/Scoresbysund|LMT -02 -01 +00|1r.Q 20 10 0|0121323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2a5Ww.8 2z5ew.8 1a00 1cK0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|452",
		"America/Sitka|PST PWT PPT PDT YST AKST AKDT|80 70 70 70 90 90 80|01203030303030303030303030303030345656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|90e2",
		"America/St_Johns|NST NDT NST NDT NWT NPT NDDT|3u.Q 2u.Q 3u 2u 2u 2u 1u|01010101010101010101010101010101010102323232323232324523232323232323232323232323232323232323232323232323232323232323232323232323232323232326232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-28oit.8 14L0 1nB0 1in0 1gm0 Dz0 1JB0 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 1cL0 1fB0 19X0 1fB0 19X0 10O0 eKX.8 19X0 1iq0 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 WL0 1qN0 WL0 1qN0 7UHu itu 1tB0 WL0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1tB0 WL0 1ld0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4",
		"America/Swift_Current|LMT MST MDT MWT MPT CST|7b.k 70 60 60 60 60|012134121212121212121215|-2AD4M.E uHdM.E 1in0 UGp0 8x20 ix0 1o10 17b0 1ip0 11z0 1o10 11z0 1o10 11z0 isN0 1cL0 3Cp0 1cL0 1cN0 11z0 1qN0 WL0 pMp0|16e3",
		"America/Tegucigalpa|LMT CST CDT|5M.Q 60 50|01212121|-1WGGb.8 2ETcb.8 WL0 1qN0 WL0 GRd0 AL0|11e5",
		"America/Thule|LMT AST ADT|4z.8 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a5To.Q 31NBo.Q 1cL0 1cN0 1cL0 1fB0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|656",
		"America/Thunder_Bay|CST EST EWT EPT EDT|60 50 40 40 40|0123141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141|-2q5S0 1iaN0 8x40 iv0 XNB0 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4",
		"America/Vancouver|PST PDT PWT PPT|80 70 70 70|0102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TO0 1in0 UGp0 8x10 iy0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5",
		"America/Whitehorse|YST YDT YWT YPT YDDT PST PDT MST|90 80 80 80 70 80 70 70|010102304056565656565656565656565656565656565656565656565656565656565656565656565656565656567|-25TN0 1in0 1o10 13V0 Ser0 8x00 iz0 LCL0 1fA0 3NA0 vrd0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1z90|23e3",
		"America/Winnipeg|CST CDT CWT CPT|60 50 50 50|010101023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aIi0 WL0 3ND0 1in0 Jap0 Rb0 aCN0 8x30 iw0 1tB0 11z0 1ip0 11z0 1o10 11z0 1o10 11z0 1rd0 10L0 1op0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 1cL0 1cN0 11z0 6i10 WL0 6i10 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|66e4",
		"America/Yakutat|YST YWT YPT YDT AKST AKDT|90 80 80 80 90 80|01203030303030303030303030303030304545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-17T10 8x00 iz0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cn0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|642",
		"America/Yellowknife|-00 MST MWT MPT MDDT MDT|0 70 60 60 50 60|012314151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151|-1pdA0 hix0 8x20 ix0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3",
		"Antarctica/Casey|-00 +08 +11|0 -80 -b0|0121212121212|-2q00 1DjS0 T90 40P0 KL0 blz0 3m10 1o30 14k0 1kr0 12l0 1o01|10",
		"Antarctica/Davis|-00 +07 +05|0 -70 -50|01012121|-vyo0 iXt0 alj0 1D7v0 VB0 3Wn0 KN0|70",
		"Pacific/Port_Moresby|+10|-a0|0||25e4",
		"Antarctica/Macquarie|AEST AEDT -00|-a0 -b0 0|010201010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-29E80 1a00 4SK0 1ayy0 Lvs0 1cM0 1o00 Rc0 1wo0 Rc0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 3Co0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|1",
		"Antarctica/Mawson|-00 +06 +05|0 -60 -50|012|-CEo0 2fyk0|60",
		"Pacific/Auckland|NZMT NZST NZST NZDT|-bu -cu -c0 -d0|01020202020202020202020202023232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-1GCVu Lz0 1tB0 11zu 1o0u 11zu 1o0u 11zu 1o0u 14nu 1lcu 14nu 1lcu 1lbu 11Au 1nXu 11Au 1nXu 11Au 1nXu 11Au 1nXu 11Au 1qLu WMu 1qLu 11Au 1n1bu IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00|14e5",
		"Antarctica/Palmer|-00 -03 -04 -02|0 30 40 20|0121212121213121212121212121212121212121212121212121212121212121212121212121212121|-cao0 nD0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 jsN0 14N0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|40",
		"Antarctica/Rothera|-00 -03|0 30|01|gOo0|130",
		"Asia/Riyadh|LMT +03|-36.Q -30|01|-TvD6.Q|57e5",
		"Antarctica/Troll|-00 +00 +02|0 0 -20|01212121212121212121212121212121212121212121212121212121212121212121|1puo0 hd0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|40",
		"Antarctica/Vostok|-00 +06|0 -60|01|-tjA0|25",
		"Europe/Oslo|CET CEST|-10 -20|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2awM0 Qm0 W6o0 5pf0 WM0 1fA0 1cM0 1cM0 1cM0 1cM0 wJc0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1qM0 WM0 zpc0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|62e4",
		"Asia/Almaty|LMT +05 +06 +07|-57.M -50 -60 -70|012323232323232323232321232323232323232323232323232|-1Pc57.M eUo7.M 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|15e5",
		"Asia/Amman|LMT EET EEST|-2n.I -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1yW2n.I 1HiMn.I KL0 1oN0 11b0 1oN0 11b0 1pd0 1dz0 1cp0 11b0 1op0 11b0 fO10 1db0 1e10 1cL0 1cN0 1cL0 1cN0 1fz0 1pd0 10n0 1ld0 14n0 1hB0 15b0 1ip0 19X0 1cN0 1cL0 1cN0 17b0 1ld0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1So0 y00 1fc0 1dc0 1co0 1dc0 1cM0 1cM0 1cM0 1o00 11A0 1lc0 17c0 1cM0 1cM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 4bX0 Dd0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 LA0 1C00 LA0 1C00 Oo0 1zc0 Oo0 1C00 LA0 1C00 LA0 1C00 LA0 1C00 LA0 1C00 Oo0 1zc0 Oo0 1C00 LA0 1C00 LA0 1C00 LA0 1C00 LA0 1C00 Oo0 1C00 LA0 1C00|25e5",
		"Asia/Anadyr|LMT +12 +13 +14 +11|-bN.U -c0 -d0 -e0 -b0|01232121212121212121214121212121212121212121212121212121212141|-1PcbN.U eUnN.U 23CL0 1db0 2q10 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|13e3",
		"Asia/Aqtau|LMT +04 +05 +06|-3l.4 -40 -50 -60|012323232323232323232123232312121212121212121212|-1Pc3l.4 eUnl.4 24PX0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|15e4",
		"Asia/Aqtobe|LMT +04 +05 +06|-3M.E -40 -50 -60|0123232323232323232321232323232323232323232323232|-1Pc3M.E eUnM.E 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|27e4",
		"Asia/Ashgabat|LMT +04 +05 +06|-3R.w -40 -50 -60|0123232323232323232323212|-1Pc3R.w eUnR.w 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0|41e4",
		"Asia/Atyrau|LMT +03 +05 +06 +04|-3r.I -30 -50 -60 -40|01232323232323232323242323232323232324242424242|-1Pc3r.I eUor.I 24PW0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 2sp0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|",
		"Asia/Baghdad|BMT +03 +04|-2V.A -30 -40|012121212121212121212121212121212121212121212121212121|-26BeV.A 2ACnV.A 11b0 1cp0 1dz0 1dd0 1db0 1cN0 1cp0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1de0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0|66e5",
		"Asia/Qatar|LMT +04 +03|-3q.8 -40 -30|012|-21Jfq.8 27BXq.8|96e4",
		"Asia/Baku|LMT +03 +04 +05|-3j.o -30 -40 -50|01232323232323232323232123232323232323232323232323232323232323232|-1Pc3j.o 1jUoj.o WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 9Je0 1o00 11z0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|27e5",
		"Asia/Bangkok|BMT +07|-6G.4 -70|01|-218SG.4|15e6",
		"Asia/Barnaul|LMT +06 +07 +08|-5z -60 -70 -80|0123232323232323232323212323232321212121212121212121212121212121212|-21S5z pCnz 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 p90 LE0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|",
		"Asia/Beirut|EET EEST|-20 -30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-21aq0 1on0 1410 1db0 19B0 1in0 1ip0 WL0 1lQp0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 q6N0 En0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1op0 11b0 dA10 17b0 1iN0 17b0 1iN0 17b0 1iN0 17b0 1vB0 SL0 1mp0 13z0 1iN0 17b0 1iN0 17b0 1jd0 12n0 1a10 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0|22e5",
		"Asia/Bishkek|LMT +05 +06 +07|-4W.o -50 -60 -70|012323232323232323232321212121212121212121212121212|-1Pc4W.o eUnW.o 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2e00 1tX0 17b0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1cPu 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0|87e4",
		"Asia/Brunei|LMT +0730 +08|-7D.E -7u -80|012|-1KITD.E gDc9.E|42e4",
		"Asia/Kolkata|MMT IST +0630|-5l.a -5u -6u|012121|-2zOtl.a 1r2LP.a 1un0 HB0 7zX0|15e6",
		"Asia/Chita|LMT +08 +09 +10|-7x.Q -80 -90 -a0|012323232323232323232321232323232323232323232323232323232323232312|-21Q7x.Q pAnx.Q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3re0|33e4",
		"Asia/Choibalsan|LMT +07 +08 +10 +09|-7C -70 -80 -a0 -90|0123434343434343434343434343434343434343434343424242|-2APHC 2UkoC cKn0 1da0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 3Db0 h1f0 1cJ0 1cP0 1cJ0|38e3",
		"Asia/Shanghai|CST CDT|-80 -90|01010101010101010101010101010|-23uw0 18n0 OjB0 Rz0 11d0 1wL0 A10 8HX0 1G10 Tz0 1ip0 1jX0 1cN0 11b0 1oN0 aL0 1tU30 Rb0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0|23e6",
		"Asia/Colombo|MMT +0530 +06 +0630|-5j.w -5u -60 -6u|01231321|-2zOtj.w 1rFbN.w 1zzu 7Apu 23dz0 11zu n3cu|22e5",
		"Asia/Dhaka|HMT +0630 +0530 +06 +07|-5R.k -6u -5u -60 -70|0121343|-18LFR.k 1unn.k HB0 m6n0 2kxbu 1i00|16e6",
		"Asia/Damascus|LMT EET EEST|-2p.c -20 -30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-21Jep.c Hep.c 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1xRB0 11X0 1oN0 10L0 1pB0 11b0 1oN0 10L0 1mp0 13X0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 Nb0 1AN0 Nb0 bcp0 19X0 1gp0 19X0 3ld0 1xX0 Vd0 1Bz0 Sp0 1vX0 10p0 1dz0 1cN0 1cL0 1db0 1db0 1g10 1an0 1ap0 1db0 1fd0 1db0 1cN0 1db0 1dd0 1db0 1cp0 1dz0 1c10 1dX0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 19z0 1fB0 1qL0 11B0 1on0 Wp0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0|26e5",
		"Asia/Dili|LMT +08 +09|-8m.k -80 -90|01212|-2le8m.k 1dnXm.k 1nfA0 Xld0|19e4",
		"Asia/Dubai|LMT +04|-3F.c -40|01|-21JfF.c|39e5",
		"Asia/Dushanbe|LMT +05 +06 +07|-4z.c -50 -60 -70|012323232323232323232321|-1Pc4z.c eUnz.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2hB0|76e4",
		"Asia/Famagusta|LMT EET EEST +03|-2f.M -20 -30 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212312121212121212121212121212121212121212121|-1Vc2f.M 2a3cf.M 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 15U0 2Ks0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|",
		"Asia/Gaza|EET EEST IST IDT|-20 -30 -20 -30|010101010101010101010101010101010123232323232323232323232323232320101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1c2o0 MM0 iM0 4JA0 10o0 1pA0 10M0 1pA0 16o0 1jA0 16o0 1jA0 pBa0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 dW0 hfB0 Db0 1fB0 Rb0 bXB0 gM0 8Q00 IM0 1wo0 TX0 1HB0 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18N0 1bz0 19z0 1gp0 1610 1iL0 11z0 1o10 14o0 1lA1 SKX 1xd1 MKX 1AN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nA0 1210 1qL0 WN0 1qL0 WN0 1qL0 11c0 1on0 11B0 1o00 11A0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1nA0 1200 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1nA0 1200 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1qo0 Xc0 1qo0|18e5",
		"Asia/Hebron|EET EEST IST IDT|-20 -30 -20 -30|01010101010101010101010101010101012323232323232323232323232323232010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1c2o0 MM0 iM0 4JA0 10o0 1pA0 10M0 1pA0 16o0 1jA0 16o0 1jA0 pBa0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 dW0 hfB0 Db0 1fB0 Rb0 bXB0 gM0 8Q00 IM0 1wo0 TX0 1HB0 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18N0 1bz0 19z0 1gp0 1610 1iL0 12L0 1mN0 14o0 1lc0 Tb0 1xd1 MKX bB0 cn0 1cN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nA0 1210 1qL0 WN0 1qL0 WN0 1qL0 11c0 1on0 11B0 1o00 11A0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1nA0 1200 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1nA0 1200 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1qo0 Xc0 1qo0|25e4",
		"Asia/Ho_Chi_Minh|LMT PLMT +07 +08 +09|-76.E -76.u -70 -80 -90|0123423232|-2yC76.E bK00.a 1h7b6.u 5lz0 18o0 3Oq0 k5b0 aW00 BAM0|90e5",
		"Asia/Hong_Kong|LMT HKT HKST HKWT JST|-7A.G -80 -90 -8u -90|0123412121212121212121212121212121212121212121212121212121212121212121|-2CFH0 1taO0 Hc0 xUu 9tBu 11z0 1tDu Rc0 1wo0 11A0 1cM0 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1nX0 U10 1tz0 U10 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 Rd0 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 17d0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1cL0 6fd0 14n0|73e5",
		"Asia/Hovd|LMT +06 +07 +08|-66.A -60 -70 -80|012323232323232323232323232323232323232323232323232|-2APG6.A 2Uko6.A cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|81e3",
		"Asia/Irkutsk|IMT +07 +08 +09|-6V.5 -70 -80 -90|01232323232323232323232123232323232323232323232323232323232323232|-21zGV.5 pjXV.5 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4",
		"Europe/Istanbul|IMT EET EEST +03 +04|-1U.U -20 -30 -30 -40|0121212121212121212121212121212121212121212121234312121212121212121212121212121212121212121212121212121212121212123|-2ogNU.U dzzU.U 11b0 8tB0 1on0 1410 1db0 19B0 1in0 3Rd0 Un0 1oN0 11b0 zSN0 CL0 mp0 1Vz0 1gN0 8yn0 1yp0 ML0 1kp0 17b0 1ip0 17b0 1fB0 19X0 1ip0 19X0 1ip0 17b0 qdB0 38L0 1jd0 Tz0 l6O0 11A0 WN0 1qL0 TB0 1tX0 U10 1tz0 11B0 1in0 17d0 z90 cne0 pb0 2Cp0 1800 14o0 1dc0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1a00 1fA0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WO0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 Xc0 1qo0 WM0 1qM0 11A0 1o00 1200 1nA0 11A0 1tA0 U00 15w0|13e6",
		"Asia/Jakarta|BMT +0720 +0730 +09 +08 WIB|-77.c -7k -7u -90 -80 -70|01232425|-1Q0Tk luM0 mPzO 8vWu 6kpu 4PXu xhcu|31e6",
		"Asia/Jayapura|LMT +09 +0930 WIT|-9m.M -90 -9u -90|0123|-1uu9m.M sMMm.M L4nu|26e4",
		"Asia/Jerusalem|JMT IST IDT IDDT|-2k.E -20 -30 -40|01212121212121321212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-26Bek.E SyOk.E MM0 iM0 4JA0 10o0 1pA0 10M0 1pA0 16o0 1jA0 16o0 1jA0 3LA0 Eo0 oo0 1co0 1dA0 16o0 10M0 1jc0 1tA0 14o0 1cM0 1a00 11A0 1Nc0 Ao0 1Nc0 Ao0 1Ko0 LA0 1o00 WM0 EQK0 Db0 1fB0 Rb0 bXB0 gM0 8Q00 IM0 1wo0 TX0 1HB0 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 1hB0 1dX0 1ep0 1aL0 1eN0 17X0 1nf0 11z0 1tB0 19W0 1e10 17b0 1ep0 1gL0 18N0 1fz0 1eN0 17b0 1gq0 1gn0 19d0 1dz0 1c10 17X0 1hB0 1gn0 19d0 1dz0 1c10 17X0 1kp0 1dz0 1c10 1aL0 1eN0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0|81e4",
		"Asia/Kabul|+04 +0430|-40 -4u|01|-10Qs0|46e5",
		"Asia/Kamchatka|LMT +11 +12 +13|-ay.A -b0 -c0 -d0|012323232323232323232321232323232323232323232323232323232323212|-1SLKy.A ivXy.A 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|18e4",
		"Asia/Karachi|LMT +0530 +0630 +05 PKT PKST|-4s.c -5u -6u -50 -50 -60|012134545454|-2xoss.c 1qOKW.c 7zX0 eup0 LqMu 1fy00 1cL0 dK10 11b0 1610 1jX0|24e6",
		"Asia/Urumqi|LMT +06|-5O.k -60|01|-1GgtO.k|32e5",
		"Asia/Kathmandu|LMT +0530 +0545|-5F.g -5u -5J|012|-21JhF.g 2EGMb.g|12e5",
		"Asia/Khandyga|LMT +08 +09 +10 +11|-92.d -80 -90 -a0 -b0|0123232323232323232323212323232323232323232323232343434343434343432|-21Q92.d pAp2.d 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 qK0 yN0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|66e2",
		"Asia/Krasnoyarsk|LMT +06 +07 +08|-6b.q -60 -70 -80|01232323232323232323232123232323232323232323232323232323232323232|-21Hib.q prAb.q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|10e5",
		"Asia/Kuala_Lumpur|SMT +07 +0720 +0730 +09 +08|-6T.p -70 -7k -7u -90 -80|0123435|-2Bg6T.p 17anT.p l5XE 17bO 8Fyu 1so1u|71e5",
		"Asia/Kuching|LMT +0730 +08 +0820 +09|-7l.k -7u -80 -8k -90|0123232323232323242|-1KITl.k gDbP.k 6ynu AnE 1O0k AnE 1NAk AnE 1NAk AnE 1NAk AnE 1O0k AnE 1NAk AnE pAk 8Fz0|13e4",
		"Asia/Macau|LMT CST +09 +10 CDT|-7y.a -80 -90 -a0 -90|012323214141414141414141414141414141414141414141414141414141414141414141|-2CFHy.a 1uqKy.a PX0 1kn0 15B0 11b0 4Qq0 1oM0 11c0 1ko0 1u00 11A0 1cM0 11c0 1o00 11A0 1o00 11A0 1oo0 1400 1o00 11A0 1o00 U00 1tA0 U00 1wo0 Rc0 1wru U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 Rd0 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 17d0 1cK0 1cO0 1cK0 1cO0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1cL0 6fd0 14n0|57e4",
		"Asia/Magadan|LMT +10 +11 +12|-a3.c -a0 -b0 -c0|012323232323232323232321232323232323232323232323232323232323232312|-1Pca3.c eUo3.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Cq0|95e3",
		"Asia/Makassar|LMT MMT +08 +09 WITA|-7V.A -7V.A -80 -90 -80|01234|-21JjV.A vfc0 myLV.A 8ML0|15e5",
		"Asia/Manila|PST PDT JST|-80 -90 -90|010201010|-1kJI0 AL0 cK10 65X0 mXB0 vX0 VK10 1db0|24e6",
		"Asia/Nicosia|LMT EET EEST|-2d.s -20 -30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1Vc2d.s 2a3cd.s 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|32e4",
		"Asia/Novokuznetsk|LMT +06 +07 +08|-5M.M -60 -70 -80|012323232323232323232321232323232323232323232323232323232323212|-1PctM.M eULM.M 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|55e4",
		"Asia/Novosibirsk|LMT +06 +07 +08|-5v.E -60 -70 -80|0123232323232323232323212323212121212121212121212121212121212121212|-21Qnv.E pAFv.E 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 ml0 Os0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 4eN0|15e5",
		"Asia/Omsk|LMT +05 +06 +07|-4R.u -50 -60 -70|01232323232323232323232123232323232323232323232323232323232323232|-224sR.u pMLR.u 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|12e5",
		"Asia/Oral|LMT +03 +05 +06 +04|-3p.o -30 -50 -60 -40|01232323232323232424242424242424242424242424242|-1Pc3p.o eUop.o 23CK0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 1cM0 IM0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|27e4",
		"Asia/Pontianak|LMT PMT +0730 +09 +08 WITA WIB|-7h.k -7h.k -7u -90 -80 -80 -70|012324256|-2ua7h.k XE00 munL.k 8Rau 6kpu 4PXu xhcu Wqnu|23e4",
		"Asia/Pyongyang|LMT KST JST KST|-8n -8u -90 -90|012313|-2um8n 97XR 1lTzu 2Onc0 6BA0|29e5",
		"Asia/Qostanay|LMT +04 +05 +06|-4e.s -40 -50 -60|012323232323232323232123232323232323232323232323|-1Pc4e.s eUoe.s 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|",
		"Asia/Qyzylorda|LMT +04 +05 +06|-4l.Q -40 -50 -60|01232323232323232323232323232323232323232323232|-1Pc4l.Q eUol.Q 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 3ao0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 zQl0|73e4",
		"Asia/Rangoon|RMT +0630 +09|-6o.L -6u -90|0121|-21Jio.L SmnS.L 7j9u|48e5",
		"Asia/Sakhalin|LMT +09 +11 +12 +10|-9u.M -90 -b0 -c0 -a0|01232323232323232323232423232323232424242424242424242424242424242|-2AGVu.M 1BoMu.M 1qFa0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 2pB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|58e4",
		"Asia/Samarkand|LMT +04 +05 +06|-4r.R -40 -50 -60|01232323232323232323232|-1Pc4r.R eUor.R 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|36e4",
		"Asia/Seoul|LMT KST JST KST KDT KDT|-8r.Q -8u -90 -90 -a0 -9u|012343434343151515151515134343|-2um8r.Q 97XV.Q 1m1zu 6CM0 Fz0 1kN0 14n0 1kN0 14L0 1zd0 On0 69B0 2I0u OL0 1FB0 Rb0 1qN0 TX0 1tB0 TX0 1tB0 TX0 1tB0 TX0 2ap0 12FBu 11A0 1o00 11A0|23e6",
		"Asia/Srednekolymsk|LMT +10 +11 +12|-ae.Q -a0 -b0 -c0|01232323232323232323232123232323232323232323232323232323232323232|-1Pcae.Q eUoe.Q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|35e2",
		"Asia/Taipei|CST JST CDT|-80 -90 -90|01020202020202020202020202020202020202020|-1iw80 joM0 1yo0 Tz0 1ip0 1jX0 1cN0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 10N0 1BX0 10p0 1pz0 10p0 1pz0 10p0 1db0 1dd0 1db0 1cN0 1db0 1cN0 1db0 1cN0 1db0 1BB0 ML0 1Bd0 ML0 uq10 1db0 1cN0 1db0 97B0 AL0|74e5",
		"Asia/Tashkent|LMT +05 +06 +07|-4B.b -50 -60 -70|012323232323232323232321|-1Pc4B.b eUnB.b 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0|23e5",
		"Asia/Tbilisi|TBMT +03 +04 +05|-2X.b -30 -40 -50|0123232323232323232323212121232323232323232323212|-1Pc2X.b 1jUnX.b WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cK0 1cL0 1cN0 1cL0 1cN0 2pz0 1cL0 1fB0 3Nz0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 An0 Os0 WM0|11e5",
		"Asia/Tehran|LMT TMT +0330 +04 +05 +0430|-3p.I -3p.I -3u -40 -50 -4u|01234325252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-2btDp.I 1d3c0 1huLT.I TXu 1pz0 sN0 vAu 1cL0 1dB0 1en0 pNB0 UL0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 64p0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0|14e6",
		"Asia/Thimphu|LMT +0530 +06|-5W.A -5u -60|012|-Su5W.A 1BGMs.A|79e3",
		"Asia/Tokyo|JST JDT|-90 -a0|010101010|-QJJ0 Rc0 1lc0 14o0 1zc0 Oo0 1zc0 Oo0|38e6",
		"Asia/Tomsk|LMT +06 +07 +08|-5D.P -60 -70 -80|0123232323232323232323212323232323232323232323212121212121212121212|-21NhD.P pxzD.P 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 co0 1bB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Qp0|10e5",
		"Asia/Ulaanbaatar|LMT +07 +08 +09|-77.w -70 -80 -90|012323232323232323232323232323232323232323232323232|-2APH7.w 2Uko7.w cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|12e5",
		"Asia/Ust-Nera|LMT +08 +09 +12 +11 +10|-9w.S -80 -90 -c0 -b0 -a0|012343434343434343434345434343434343434343434343434343434343434345|-21Q9w.S pApw.S 23CL0 1d90 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|65e2",
		"Asia/Vladivostok|LMT +09 +10 +11|-8L.v -90 -a0 -b0|01232323232323232323232123232323232323232323232323232323232323232|-1SJIL.v itXL.v 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4",
		"Asia/Yakutsk|LMT +08 +09 +10|-8C.W -80 -90 -a0|01232323232323232323232123232323232323232323232323232323232323232|-21Q8C.W pAoC.W 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|28e4",
		"Asia/Yekaterinburg|LMT PMT +04 +05 +06|-42.x -3J.5 -40 -50 -60|012343434343434343434343234343434343434343434343434343434343434343|-2ag42.x 7mQh.s qBvJ.5 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|14e5",
		"Asia/Yerevan|LMT +03 +04 +05|-2W -30 -40 -50|0123232323232323232323212121212323232323232323232323232323232|-1Pc2W 1jUnW WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 4RX0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|13e5",
		"Atlantic/Azores|HMT -02 -01 +00 WET|1S.w 20 10 0 0|0121212121212121212121212121212121212121212123212321232123212121212121212121212121212121212121212121232323232323232323232323232323234323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2ldW0 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 qIl0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|25e4",
		"Atlantic/Bermuda|BMT BST AST ADT|4j.i 3j.i 40 30|010102323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-28p7E.G 1bb0 1i10 11X0 ru30 thbE.G 1PX0 11B0 1tz0 Rd0 1zb0 Op0 1zb0 3I10 Lz0 1EN0 FX0 1HB0 FX0 1Kp0 Db0 1Kp0 Db0 1Kp0 FX0 93d0 11z0 GAp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e3",
		"Atlantic/Canary|LMT -01 WET WEST|11.A 10 0 -10|01232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UtaW.o XPAW.o 1lAK0 1a10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4",
		"Atlantic/Cape_Verde|LMT -02 -01|1y.4 20 10|01212|-2ldW0 1eEo0 7zX0 1djf0|50e4",
		"Atlantic/Faroe|LMT WET WEST|r.4 0 -10|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2uSnw.U 2Wgow.U 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|49e3",
		"Atlantic/Madeira|FMT -01 +00 +01 WET WEST|17.A 10 0 -10 0 -10|0121212121212121212121212121212121212121212123212321232123212121212121212121212121212121212121212121454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-2ldX0 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 qIl0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|27e4",
		"Atlantic/Reykjavik|LMT -01 +00 GMT|1s 10 0 0|012121212121212121212121212121212121212121212121212121212121212121213|-2uWmw mfaw 1Bd0 ML0 1LB0 Cn0 1LB0 3fX0 C10 HrX0 1cO0 LB0 1EL0 LA0 1C00 Oo0 1wo0 Rc0 1wo0 Rc0 1wo0 Rc0 1zc0 Oo0 1zc0 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0|12e4",
		"Atlantic/South_Georgia|-02|20|0||30",
		"Atlantic/Stanley|SMT -04 -03 -02|3P.o 40 30 20|012121212121212323212121212121212121212121212121212121212121212121212|-2kJw8.A 12bA8.A 19X0 1fB0 19X0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 Cn0 1Cc10 WL0 1qL0 U10 1tz0 2mN0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 U10 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qN0 U10 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 U10 1tz0 U10 1tz0 U10|21e2",
		"Australia/Sydney|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293k0 xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00 17c00 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|40e5",
		"Australia/Adelaide|ACST ACDT|-9u -au|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293ju xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00 17c00 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 WM0 1qM0 Rc0 1zc0 U00 1tA0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|11e5",
		"Australia/Brisbane|AEST AEDT|-a0 -b0|01010101010101010|-293k0 xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00 17c00 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0|20e5",
		"Australia/Broken_Hill|ACST ACDT|-9u -au|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293ju xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00 17c00 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|18e3",
		"Australia/Hobart|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-29E80 1a00 1qM0 Oo0 1zc0 Oo0 TAo0 yM0 1cM0 1cM0 1fA0 1a00 VfA0 1cM0 1o00 Rc0 1wo0 Rc0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|21e4",
		"Australia/Darwin|ACST ACDT|-9u -au|010101010|-293ju xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00|12e4",
		"Australia/Eucla|+0845 +0945|-8J -9J|0101010101010101010|-293iJ xc0 10jc0 yM0 1cM0 1cM0 1gSo0 Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|368",
		"Australia/Lord_Howe|AEST +1030 +1130 +11|-a0 -au -bu -b0|0121212121313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313|raC0 1zdu Rb0 1zd0 On0 1zd0 On0 1zd0 On0 1zd0 TXu 1qMu WLu 1tAu WLu 1tAu TXu 1tAu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu 11zu 1o0u 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 11Au 1nXu 1qMu 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 1qMu 11zu 1o0u WLu 1qMu 14nu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu|347",
		"Australia/Lindeman|AEST AEDT|-a0 -b0|010101010101010101010|-293k0 xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00 17c00 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0|10",
		"Australia/Melbourne|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293k0 xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00 17c00 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1qM0 11A0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|39e5",
		"Australia/Perth|AWST AWDT|-80 -90|0101010101010101010|-293i0 xc0 10jc0 yM0 1cM0 1cM0 1gSo0 Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|18e5",
		"CET|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|",
		"Pacific/Easter|EMT -07 -06 -05|7h.s 70 60 50|012121212121212121212121212123232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-1uSgG.w 1s4IG.w WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 2pA0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0|30e2",
		"CST6CDT|CST CDT CWT CPT|60 50 50 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
		"EET|EET EEST|-20 -30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|",
		"Europe/Dublin|DMT IST GMT BST IST|p.l -y.D 0 -10 -10|01232323232324242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242|-2ax9y.D Rc0 1fzy.D 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 g600 14o0 1wo0 17c0 1io0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1a00 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1tA0 IM0 90o0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
		"EST|EST|50|0||",
		"EST5EDT|EST EDT EWT EPT|50 40 40 40|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261t0 1nX0 11B0 1nX0 SgN0 8x40 iv0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
		"Etc/GMT-0|GMT|0|0||",
		"Etc/GMT-1|+01|-10|0||",
		"Etc/GMT-11|+11|-b0|0||",
		"Pacific/Tarawa|+12|-c0|0||29e3",
		"Etc/GMT-13|+13|-d0|0||",
		"Etc/GMT-14|+14|-e0|0||",
		"Etc/GMT-2|+02|-20|0||",
		"Etc/GMT-3|+03|-30|0||",
		"Etc/GMT-4|+04|-40|0||",
		"Etc/GMT-5|+05|-50|0||",
		"Etc/GMT-6|+06|-60|0||",
		"Indian/Christmas|+07|-70|0||21e2",
		"Etc/GMT-8|+08|-80|0||",
		"Pacific/Palau|+09|-90|0||21e3",
		"Etc/GMT+1|-01|10|0||",
		"Etc/GMT+10|-10|a0|0||",
		"Etc/GMT+11|-11|b0|0||",
		"Etc/GMT+12|-12|c0|0||",
		"Etc/GMT+3|-03|30|0||",
		"Etc/GMT+4|-04|40|0||",
		"Etc/GMT+5|-05|50|0||",
		"Etc/GMT+6|-06|60|0||",
		"Etc/GMT+7|-07|70|0||",
		"Etc/GMT+8|-08|80|0||",
		"Etc/GMT+9|-09|90|0||",
		"Etc/UTC|UTC|0|0||",
		"Europe/Amsterdam|AMT NST +0120 +0020 CEST CET|-j.w -1j.w -1k -k -20 -10|010101010101010101010101010101010101010101012323234545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545|-2aFcj.w 11b0 1iP0 11A0 1io0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1co0 1io0 1yo0 Pc0 1a00 1fA0 1Bc0 Mo0 1tc0 Uo0 1tA0 U00 1uo0 W00 1s00 VA0 1so0 Vc0 1sM0 UM0 1wo0 Rc0 1u00 Wo0 1rA0 W00 1s00 VA0 1sM0 UM0 1w00 fV0 BCX.w 1tA0 U00 1u00 Wo0 1sm0 601k WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|16e5",
		"Europe/Andorra|WET CET CEST|0 -10 -20|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-UBA0 1xIN0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|79e3",
		"Europe/Astrakhan|LMT +03 +04 +05|-3c.c -30 -40 -50|012323232323232323212121212121212121212121212121212121212121212|-1Pcrc.c eUMc.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|10e5",
		"Europe/Athens|AMT EET EEST CEST CET|-1y.Q -20 -30 -20 -10|012123434121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a61x.Q CNbx.Q mn0 kU10 9b0 3Es0 Xa0 1fb0 1dd0 k3X0 Nz0 SCp0 1vc0 SO0 1cM0 1a00 1ao0 1fc0 1a10 1fG0 1cg0 1dX0 1bX0 1cQ0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|35e5",
		"Europe/London|GMT BST BDST|0 -10 -20|0101010101010101010101010101010101010101010101010121212121210101210101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2axa0 Rc0 1fA0 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 2Rz0 Dc0 1zc0 Oo0 1zc0 Rc0 1wo0 17c0 1iM0 FA0 xB0 1fA0 1a00 14o0 bb0 LA0 xB0 Rc0 1wo0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1a00 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1tA0 IM0 90o0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|10e6",
		"Europe/Belgrade|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-19RC0 3IP0 WM0 1fA0 1cM0 1cM0 1rc0 Qo0 1vmo0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
		"Europe/Berlin|CET CEST CEMT|-10 -20 -30|01010101010101210101210101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 kL0 Nc0 m10 WM0 1ao0 1cp0 dX0 jz0 Dd0 1io0 17c0 1fA0 1a00 1ehA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|41e5",
		"Europe/Prague|CET CEST GMT|-10 -20 0|01010101010101010201010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 1cM0 1qM0 11c0 mp0 xA0 mn0 17c0 1io0 17c0 1fc0 1ao0 1bNc0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|13e5",
		"Europe/Brussels|WET CET CEST WEST|0 -10 -20 -10|0121212103030303030303030303030303030303030303030303212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2ehc0 3zX0 11c0 1iO0 11A0 1o00 11A0 my0 Ic0 1qM0 Rc0 1EM0 UM0 1u00 10o0 1io0 1io0 17c0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a30 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 y00 5Wn0 WM0 1fA0 1cM0 16M0 1iM0 16M0 1C00 Uo0 1eeo0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|21e5",
		"Europe/Bucharest|BMT EET EEST|-1I.o -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1xApI.o 20LI.o RA0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Axc0 On0 1fA0 1a10 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|19e5",
		"Europe/Budapest|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 1oo0 11c0 1lc0 17c0 O1V0 3Nf0 WM0 1fA0 1cM0 1cM0 1oJ0 1dd0 1020 1fX0 1cp0 1cM0 1cM0 1cM0 1fA0 1a00 bhy0 Rb0 1wr0 Rc0 1C00 LA0 1C00 LA0 SNW0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cO0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e5",
		"Europe/Zurich|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-19Lc0 11A0 1o00 11A0 1xG10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|38e4",
		"Europe/Chisinau|CMT BMT EET EEST CEST CET MSK MSD|-1T -1I.o -20 -30 -20 -10 -30 -40|012323232323232323234545467676767676767676767323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-26jdT wGMa.A 20LI.o RA0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 27A0 2en0 39g0 WM0 1fA0 1cM0 V90 1t7z0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 gL0 WO0 1cM0 1cM0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11D0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|67e4",
		"Europe/Copenhagen|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2azC0 Tz0 VuO0 60q0 WM0 1fA0 1cM0 1cM0 1cM0 S00 1HA0 Nc0 1C00 Dc0 1Nc0 Ao0 1h5A0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
		"Europe/Gibraltar|GMT BST BDST CET CEST|0 -10 -20 -10 -20|010101010101010101010101010101010101010101010101012121212121010121010101010101010101034343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-2axa0 Rc0 1fA0 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 2Rz0 Dc0 1zc0 Oo0 1zc0 Rc0 1wo0 17c0 1iM0 FA0 xB0 1fA0 1a00 14o0 bb0 LA0 xB0 Rc0 1wo0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 10Jz0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|30e3",
		"Europe/Helsinki|HMT EET EEST|-1D.N -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1WuND.N OULD.N 1dA0 1xGq0 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
		"Europe/Kaliningrad|CET CEST EET EEST MSK MSD +03|-10 -20 -20 -30 -30 -40 -30|01010101010101232454545454545454543232323232323232323232323232323232323232323262|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 390 7A0 1en0 12N0 1pbb0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|44e4",
		"Europe/Kiev|KMT EET MSK CEST CET MSD EEST|-22.4 -20 -30 -20 -10 -40 -30|0123434252525252525252525256161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161|-1Pc22.4 eUo2.4 rnz0 2Hg0 WM0 1fA0 da0 1v4m0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 Db0 3220 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|34e5",
		"Europe/Kirov|LMT +03 +04 +05|-3i.M -30 -40 -50|01232323232323232321212121212121212121212121212121212121212121|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|48e4",
		"Europe/Lisbon|LMT WET WEST WEMT CET CEST|A.J 0 -10 -20 -10 -20|01212121212121212121212121212121212121212121232123212321232121212121212121212121212121212121212121214121212121212121212121212121212124545454212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2le00 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 pvy0 1cM0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|27e5",
		"Europe/Luxembourg|LMT CET CEST WET WEST WEST WET|-o.A -10 -20 0 -10 -20 -10|0121212134343434343434343434343434343434343434343434565651212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2DG0o.A t6mo.A TB0 1nX0 Up0 1o20 11A0 rW0 CM0 1qP0 R90 1EO0 UK0 1u20 10m0 1ip0 1in0 17e0 19W0 1fB0 1db0 1cp0 1in0 17d0 1fz0 1a10 1in0 1a10 1in0 17f0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 vA0 60L0 WM0 1fA0 1cM0 17c0 1io0 16M0 1C00 Uo0 1eeo0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4",
		"Europe/Madrid|WET WEST WEMT CET CEST|0 -10 -20 -10 -20|010101010101010101210343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-25Td0 19B0 1cL0 1dd0 b1z0 18p0 3HX0 17d0 1fz0 1a10 1io0 1a00 1in0 17d0 iIn0 Hd0 1cL0 bb0 1200 2s20 14n0 5aL0 Mp0 1vz0 17d0 1in0 17d0 1in0 17d0 1in0 17d0 6hX0 11B0 XHX0 1a10 1fz0 1a10 19X0 1cN0 1fz0 1a10 1fC0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|62e5",
		"Europe/Malta|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2arB0 Lz0 1cN0 1db0 1410 1on0 Wp0 1qL0 17d0 1cL0 M3B0 5M20 WM0 1fA0 1co0 17c0 1iM0 16m0 1de0 1lc0 14m0 1lc0 WO0 1qM0 GTW0 On0 1C10 LA0 1C00 LA0 1EM0 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1co0 1cM0 1lA0 Xc0 1qq0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1iN0 19z0 1fB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|42e4",
		"Europe/Minsk|MMT EET MSK CEST CET MSD EEST +03|-1O -20 -30 -20 -10 -40 -30 -30|01234343252525252525252525261616161616161616161616161616161616161617|-1Pc1O eUnO qNX0 3gQ0 WM0 1fA0 1cM0 Al0 1tsn0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 3Fc0 1cN0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0|19e5",
		"Europe/Monaco|PMT WET WEST WEMT CET CEST|-9.l 0 -10 -20 -10 -20|01212121212121212121212121212121212121212121212121232323232345454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-2n5c9.l cFX9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 1u00 10o0 1io0 1wo0 Rc0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Df0 2RV0 11z0 11B0 1ze0 WM0 1fA0 1cM0 1fa0 1aq0 16M0 1ekn0 1cL0 1fC0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|38e3",
		"Europe/Moscow|MMT MMT MST MDST MSD MSK +05 EET EEST MSK|-2u.h -2v.j -3v.j -4v.j -40 -30 -50 -20 -30 -40|012132345464575454545454545454545458754545454545454545454545454545454545454595|-2ag2u.h 2pyW.W 1bA0 11X0 GN0 1Hb0 c4v.j ik0 3DA0 dz0 15A0 c10 2q10 iM10 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|16e6",
		"Europe/Paris|PMT WET WEST CEST CET WEMT|-9.l 0 -10 -20 -10 -20|0121212121212121212121212121212121212121212121212123434352543434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434|-2nco9.l cNb9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 1u00 10o0 1io0 1wo0 Rc0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Df0 Ik0 5M30 WM0 1fA0 1cM0 Vx0 hB0 1aq0 16M0 1ekn0 1cL0 1fC0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|11e6",
		"Europe/Riga|RMT LST EET MSK CEST CET MSD EEST|-1A.y -2A.y -20 -30 -20 -10 -40 -30|010102345454536363636363636363727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272|-25TzA.y 11A0 1iM0 ko0 gWm0 yDXA.y 2bX0 3fE0 WM0 1fA0 1cM0 1cM0 4m0 1sLy0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 1o00 11A0 1o00 11A0 1qM0 3oo0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|64e4",
		"Europe/Rome|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2arB0 Lz0 1cN0 1db0 1410 1on0 Wp0 1qL0 17d0 1cL0 M3B0 5M20 WM0 1fA0 1cM0 16M0 1iM0 16m0 1de0 1lc0 14m0 1lc0 WO0 1qM0 GTW0 On0 1C10 LA0 1C00 LA0 1EM0 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1C00 LA0 1zc0 Oo0 1C00 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1zc0 Oo0 1fC0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|39e5",
		"Europe/Samara|LMT +03 +04 +05|-3k.k -30 -40 -50|0123232323232323232121232323232323232323232323232323232323212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2y10 14m0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|12e5",
		"Europe/Saratov|LMT +03 +04 +05|-34.i -30 -40 -50|012323232323232321212121212121212121212121212121212121212121212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 5810|",
		"Europe/Simferopol|SMT EET MSK CEST CET MSD EEST MSK|-2g -20 -30 -20 -10 -40 -30 -40|012343432525252525252525252161616525252616161616161616161616161616161616172|-1Pc2g eUog rEn0 2qs0 WM0 1fA0 1cM0 3V0 1u0L0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 4eL0 1cL0 1cN0 1cL0 1cN0 dX0 WL0 1cN0 1cL0 1fB0 1o30 11B0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11z0 1nW0|33e4",
		"Europe/Sofia|EET CET CEST EEST|-20 -10 -20 -30|01212103030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030|-168L0 WM0 1fA0 1cM0 1cM0 1cN0 1mKH0 1dd0 1fb0 1ap0 1fb0 1a20 1fy0 1a30 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
		"Europe/Stockholm|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2azC0 TB0 2yDe0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|15e5",
		"Europe/Tallinn|TMT CET CEST EET MSK MSD EEST|-1D -10 -20 -20 -30 -40 -30|012103421212454545454545454546363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363|-26oND teD 11A0 1Ta0 4rXl KSLD 2FX0 2Jg0 WM0 1fA0 1cM0 18J0 1sTX0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o10 11A0 1qM0 5QM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|41e4",
		"Europe/Tirane|LMT CET CEST|-1j.k -10 -20|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glBj.k 14pcj.k 5LC0 WM0 4M0 1fCK0 10n0 1op0 11z0 1pd0 11z0 1qN0 WL0 1qp0 Xb0 1qp0 Xb0 1qp0 11z0 1lB0 11z0 1qN0 11z0 1iN0 16n0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|42e4",
		"Europe/Ulyanovsk|LMT +03 +04 +05 +02|-3d.A -30 -40 -50 -20|01232323232323232321214121212121212121212121212121212121212121212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|13e5",
		"Europe/Uzhgorod|CET CEST MSK MSD EET EEST|-10 -20 -30 -40 -20 -30|010101023232323232323232320454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-1cqL0 6i00 WM0 1fA0 1cM0 1ml0 1Cp0 1r3W0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 1Nf0 2pw0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|11e4",
		"Europe/Vienna|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 3KM0 14o0 LA00 6i00 WM0 1fA0 1cM0 1cM0 1cM0 400 2qM0 1ao0 1co0 1cM0 1io0 17c0 1gHa0 19X0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|18e5",
		"Europe/Vilnius|WMT KMT CET EET MSK CEST MSD EEST|-1o -1z.A -10 -20 -30 -20 -40 -30|012324525254646464646464646473737373737373737352537373737373737373737373737373737373737373737373737373737373737373737373|-293do 6ILM.o 1Ooz.A zz0 Mfd0 29W0 3is0 WM0 1fA0 1cM0 LV0 1tgL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11B0 1o00 11A0 1qM0 8io0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4",
		"Europe/Volgograd|LMT +03 +04 +05|-2V.E -30 -40 -50|0123232323232323212121212121212121212121212121212121212121212121|-21IqV.E psLV.E 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 9Jd0 5gn0|10e5",
		"Europe/Warsaw|WMT CET CEST EET EEST|-1o -10 -20 -20 -30|012121234312121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2ctdo 1LXo 11d0 1iO0 11A0 1o00 11A0 1on0 11A0 6zy0 HWP0 5IM0 WM0 1fA0 1cM0 1dz0 1mL0 1en0 15B0 1aq0 1nA0 11A0 1io0 17c0 1fA0 1a00 iDX0 LA0 1cM0 1cM0 1C00 Oo0 1cM0 1cM0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1C00 LA0 uso0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e5",
		"Europe/Zaporozhye|+0220 EET MSK CEST CET MSD EEST|-2k -20 -30 -20 -10 -40 -30|01234342525252525252525252526161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161|-1Pc2k eUok rdb0 2RE0 WM0 1fA0 8m0 1v9a0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cK0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|77e4",
		"HST|HST|a0|0||",
		"Indian/Chagos|LMT +05 +06|-4N.E -50 -60|012|-2xosN.E 3AGLN.E|30e2",
		"Indian/Cocos|+0630|-6u|0||596",
		"Indian/Kerguelen|-00 +05|0 -50|01|-MG00|130",
		"Indian/Mahe|LMT +04|-3F.M -40|01|-2xorF.M|79e3",
		"Indian/Maldives|MMT +05|-4S -50|01|-olgS|35e4",
		"Indian/Mauritius|LMT +04 +05|-3O -40 -50|012121|-2xorO 34unO 14L0 12kr0 11z0|15e4",
		"Indian/Reunion|LMT +04|-3F.Q -40|01|-2mDDF.Q|84e4",
		"Pacific/Kwajalein|+11 +10 +09 -12 +12|-b0 -a0 -90 c0 -c0|012034|-1kln0 akp0 6Up0 12ry0 Wan0|14e3",
		"MET|MET MEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|",
		"MST|MST|70|0||",
		"MST7MDT|MST MDT MWT MPT|70 60 60 60|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
		"Pacific/Chatham|+1215 +1245 +1345|-cf -cJ -dJ|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-WqAf 1adef IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00|600",
		"Pacific/Apia|LMT -1130 -11 -10 +14 +13|bq.U bu b0 a0 -e0 -d0|01232345454545454545454545|-2nDMx.4 1yW03.4 2rRbu 1ff0 1a00 CI0 AQ0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0|37e3",
		"Pacific/Bougainville|+10 +09 +11|-a0 -90 -b0|0102|-16Wy0 7CN0 2MQp0|18e4",
		"Pacific/Chuuk|+10 +09|-a0 -90|01010|-2ewy0 axB0 RVX0 axd0|49e3",
		"Pacific/Efate|LMT +11 +12|-bd.g -b0 -c0|012121212121212121212121|-2l9nd.g 2uNXd.g Dc0 n610 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 Lz0 1Nd0 An0|66e3",
		"Pacific/Enderbury|-00 -12 -11 +13|0 c0 b0 -d0|0123|-1iIo0 1GsA0 B7X0|1",
		"Pacific/Fakaofo|-11 +13|b0 -d0|01|1Gfn0|483",
		"Pacific/Fiji|LMT +12 +13|-bT.I -c0 -d0|01212121212121212121212121212121212121212121212121212121212121|-2bUzT.I 3m8NT.I LA0 1EM0 IM0 nJc0 LA0 1o00 Rc0 1wo0 Ao0 1Nc0 Ao0 1Q00 xz0 1SN0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 20o0 pc0 2hc0 bc0 4q00 pc0 20o0 pc0 20o0 pc0 20o0 s00 1VA0 s00 20o0 pc0 20o0 pc0 20o0 pc0 20o0 pc0 20o0 s00 20o0 pc0 20o0 pc0 20o0 pc0 20o0 pc0 20o0 s00 1VA0 s00|88e4",
		"Pacific/Galapagos|LMT -05 -06|5W.o 50 60|01212|-1yVS1.A 2dTz1.A gNd0 rz0|25e3",
		"Pacific/Gambier|LMT -09|8X.M 90|01|-2jof0.c|125",
		"Pacific/Guadalcanal|LMT +11|-aD.M -b0|01|-2joyD.M|11e4",
		"Pacific/Guam|GST +09 GDT ChST|-a0 -90 -b0 -a0|01020202020202020203|-18jK0 6pB0 AhB0 3QL0 g2p0 3p91 WOX rX0 1zd0 Rb0 1wp0 Rb0 5xd0 rX0 5sN0 zb1 1C0X On0 ULb0|17e4",
		"Pacific/Honolulu|HST HDT HWT HPT HST|au 9u 9u 9u a0|0102304|-1thLu 8x0 lef0 8wWu iAu 46p0|37e4",
		"Pacific/Kiritimati|-1040 -10 +14|aE a0 -e0|012|nIaE B7Xk|51e2",
		"Pacific/Kosrae|+11 +09 +10 +12|-b0 -90 -a0 -c0|01021030|-2ewz0 axC0 HBy0 akp0 axd0 WOK0 1bdz0|66e2",
		"Pacific/Majuro|+11 +09 +10 +12|-b0 -90 -a0 -c0|0102103|-2ewz0 axC0 HBy0 akp0 6RB0 12um0|28e3",
		"Pacific/Marquesas|LMT -0930|9i 9u|01|-2joeG|86e2",
		"Pacific/Pago_Pago|LMT SST|bm.M b0|01|-2nDMB.c|37e2",
		"Pacific/Nauru|LMT +1130 +09 +12|-b7.E -bu -90 -c0|01213|-1Xdn7.E QCnB.E 7mqu 1lnbu|10e3",
		"Pacific/Niue|LMT -1120 -11|bj.E bk b0|012|-FScE.k suo0.k|12e2",
		"Pacific/Norfolk|+1112 +1130 +1230 +11 +12|-bc -bu -cu -b0 -c0|012134343434343434343434343434343434343434|-Kgbc W01G Oo0 1COo0 9Jcu 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|25e4",
		"Pacific/Noumea|LMT +11 +12|-b5.M -b0 -c0|01212121|-2l9n5.M 2EqM5.M xX0 1PB0 yn0 HeP0 Ao0|98e3",
		"Pacific/Pitcairn|-0830 -08|8u 80|01|18Vku|56",
		"Pacific/Pohnpei|+11 +09 +10|-b0 -90 -a0|010210|-2ewz0 axC0 HBy0 akp0 axd0|34e3",
		"Pacific/Rarotonga|LMT -1030 -0930 -10|aD.4 au 9u a0|0123232323232323232323232323|-FSdk.U 13tbO.U IL0 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu|13e3",
		"Pacific/Tahiti|LMT -10|9W.g a0|01|-2joe1.I|18e4",
		"Pacific/Tongatapu|LMT +1220 +13 +14|-cj.c -ck -d0 -e0|01232323232|-XbMj.c BgLX.c 1yndk 15A0 1wo0 xz0 1Q10 xz0 zWN0 s00|75e3",
		"PST8PDT|PST PDT PWT PPT|80 70 70 70|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261q0 1nX0 11B0 1nX0 SgN0 8x10 iy0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
		"WET|WET WEST|0 -10|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|"
	],
	"links": [
		"Africa/Abidjan|Africa/Accra",
		"Africa/Abidjan|Africa/Bamako",
		"Africa/Abidjan|Africa/Banjul",
		"Africa/Abidjan|Africa/Conakry",
		"Africa/Abidjan|Africa/Dakar",
		"Africa/Abidjan|Africa/Freetown",
		"Africa/Abidjan|Africa/Lome",
		"Africa/Abidjan|Africa/Nouakchott",
		"Africa/Abidjan|Africa/Ouagadougou",
		"Africa/Abidjan|Africa/Timbuktu",
		"Africa/Abidjan|Atlantic/St_Helena",
		"Africa/Cairo|Egypt",
		"Africa/Johannesburg|Africa/Maseru",
		"Africa/Johannesburg|Africa/Mbabane",
		"Africa/Lagos|Africa/Bangui",
		"Africa/Lagos|Africa/Brazzaville",
		"Africa/Lagos|Africa/Douala",
		"Africa/Lagos|Africa/Kinshasa",
		"Africa/Lagos|Africa/Libreville",
		"Africa/Lagos|Africa/Luanda",
		"Africa/Lagos|Africa/Malabo",
		"Africa/Lagos|Africa/Niamey",
		"Africa/Lagos|Africa/Porto-Novo",
		"Africa/Maputo|Africa/Blantyre",
		"Africa/Maputo|Africa/Bujumbura",
		"Africa/Maputo|Africa/Gaborone",
		"Africa/Maputo|Africa/Harare",
		"Africa/Maputo|Africa/Kigali",
		"Africa/Maputo|Africa/Lubumbashi",
		"Africa/Maputo|Africa/Lusaka",
		"Africa/Nairobi|Africa/Addis_Ababa",
		"Africa/Nairobi|Africa/Asmara",
		"Africa/Nairobi|Africa/Asmera",
		"Africa/Nairobi|Africa/Dar_es_Salaam",
		"Africa/Nairobi|Africa/Djibouti",
		"Africa/Nairobi|Africa/Kampala",
		"Africa/Nairobi|Africa/Mogadishu",
		"Africa/Nairobi|Indian/Antananarivo",
		"Africa/Nairobi|Indian/Comoro",
		"Africa/Nairobi|Indian/Mayotte",
		"Africa/Tripoli|Libya",
		"America/Adak|America/Atka",
		"America/Adak|US/Aleutian",
		"America/Anchorage|US/Alaska",
		"America/Argentina/Buenos_Aires|America/Buenos_Aires",
		"America/Argentina/Catamarca|America/Argentina/ComodRivadavia",
		"America/Argentina/Catamarca|America/Catamarca",
		"America/Argentina/Cordoba|America/Cordoba",
		"America/Argentina/Cordoba|America/Rosario",
		"America/Argentina/Jujuy|America/Jujuy",
		"America/Argentina/Mendoza|America/Mendoza",
		"America/Chicago|US/Central",
		"America/Denver|America/Shiprock",
		"America/Denver|Navajo",
		"America/Denver|US/Mountain",
		"America/Detroit|US/Michigan",
		"America/Edmonton|Canada/Mountain",
		"America/Fort_Wayne|America/Indiana/Indianapolis",
		"America/Fort_Wayne|America/Indianapolis",
		"America/Fort_Wayne|US/East-Indiana",
		"America/Godthab|America/Nuuk",
		"America/Halifax|Canada/Atlantic",
		"America/Havana|Cuba",
		"America/Indiana/Knox|America/Knox_IN",
		"America/Indiana/Knox|US/Indiana-Starke",
		"America/Jamaica|Jamaica",
		"America/Kentucky/Louisville|America/Louisville",
		"America/Los_Angeles|US/Pacific",
		"America/Manaus|Brazil/West",
		"America/Mazatlan|Mexico/BajaSur",
		"America/Mexico_City|Mexico/General",
		"America/New_York|US/Eastern",
		"America/Noronha|Brazil/DeNoronha",
		"America/Panama|America/Atikokan",
		"America/Panama|America/Cayman",
		"America/Panama|America/Coral_Harbour",
		"America/Phoenix|America/Creston",
		"America/Phoenix|US/Arizona",
		"America/Puerto_Rico|America/Anguilla",
		"America/Puerto_Rico|America/Antigua",
		"America/Puerto_Rico|America/Aruba",
		"America/Puerto_Rico|America/Blanc-Sablon",
		"America/Puerto_Rico|America/Curacao",
		"America/Puerto_Rico|America/Dominica",
		"America/Puerto_Rico|America/Grenada",
		"America/Puerto_Rico|America/Guadeloupe",
		"America/Puerto_Rico|America/Kralendijk",
		"America/Puerto_Rico|America/Lower_Princes",
		"America/Puerto_Rico|America/Marigot",
		"America/Puerto_Rico|America/Montserrat",
		"America/Puerto_Rico|America/Port_of_Spain",
		"America/Puerto_Rico|America/St_Barthelemy",
		"America/Puerto_Rico|America/St_Kitts",
		"America/Puerto_Rico|America/St_Lucia",
		"America/Puerto_Rico|America/St_Thomas",
		"America/Puerto_Rico|America/St_Vincent",
		"America/Puerto_Rico|America/Tortola",
		"America/Puerto_Rico|America/Virgin",
		"America/Regina|Canada/Saskatchewan",
		"America/Rio_Branco|America/Porto_Acre",
		"America/Rio_Branco|Brazil/Acre",
		"America/Santiago|Chile/Continental",
		"America/Sao_Paulo|Brazil/East",
		"America/St_Johns|Canada/Newfoundland",
		"America/Tijuana|America/Ensenada",
		"America/Tijuana|America/Santa_Isabel",
		"America/Tijuana|Mexico/BajaNorte",
		"America/Toronto|America/Montreal",
		"America/Toronto|America/Nassau",
		"America/Toronto|Canada/Eastern",
		"America/Vancouver|Canada/Pacific",
		"America/Whitehorse|Canada/Yukon",
		"America/Winnipeg|Canada/Central",
		"Asia/Ashgabat|Asia/Ashkhabad",
		"Asia/Bangkok|Asia/Phnom_Penh",
		"Asia/Bangkok|Asia/Vientiane",
		"Asia/Dhaka|Asia/Dacca",
		"Asia/Dubai|Asia/Muscat",
		"Asia/Ho_Chi_Minh|Asia/Saigon",
		"Asia/Hong_Kong|Hongkong",
		"Asia/Jerusalem|Asia/Tel_Aviv",
		"Asia/Jerusalem|Israel",
		"Asia/Kathmandu|Asia/Katmandu",
		"Asia/Kolkata|Asia/Calcutta",
		"Asia/Kuala_Lumpur|Asia/Singapore",
		"Asia/Kuala_Lumpur|Singapore",
		"Asia/Macau|Asia/Macao",
		"Asia/Makassar|Asia/Ujung_Pandang",
		"Asia/Nicosia|Europe/Nicosia",
		"Asia/Qatar|Asia/Bahrain",
		"Asia/Rangoon|Asia/Yangon",
		"Asia/Riyadh|Antarctica/Syowa",
		"Asia/Riyadh|Asia/Aden",
		"Asia/Riyadh|Asia/Kuwait",
		"Asia/Seoul|ROK",
		"Asia/Shanghai|Asia/Chongqing",
		"Asia/Shanghai|Asia/Chungking",
		"Asia/Shanghai|Asia/Harbin",
		"Asia/Shanghai|PRC",
		"Asia/Taipei|ROC",
		"Asia/Tehran|Iran",
		"Asia/Thimphu|Asia/Thimbu",
		"Asia/Tokyo|Japan",
		"Asia/Ulaanbaatar|Asia/Ulan_Bator",
		"Asia/Urumqi|Asia/Kashgar",
		"Atlantic/Faroe|Atlantic/Faeroe",
		"Atlantic/Reykjavik|Iceland",
		"Atlantic/South_Georgia|Etc/GMT+2",
		"Australia/Adelaide|Australia/South",
		"Australia/Brisbane|Australia/Queensland",
		"Australia/Broken_Hill|Australia/Yancowinna",
		"Australia/Darwin|Australia/North",
		"Australia/Hobart|Australia/Currie",
		"Australia/Hobart|Australia/Tasmania",
		"Australia/Lord_Howe|Australia/LHI",
		"Australia/Melbourne|Australia/Victoria",
		"Australia/Perth|Australia/West",
		"Australia/Sydney|Australia/ACT",
		"Australia/Sydney|Australia/Canberra",
		"Australia/Sydney|Australia/NSW",
		"Etc/GMT-0|Etc/GMT",
		"Etc/GMT-0|Etc/GMT+0",
		"Etc/GMT-0|Etc/GMT0",
		"Etc/GMT-0|Etc/Greenwich",
		"Etc/GMT-0|GMT",
		"Etc/GMT-0|GMT+0",
		"Etc/GMT-0|GMT-0",
		"Etc/GMT-0|GMT0",
		"Etc/GMT-0|Greenwich",
		"Etc/UTC|Etc/UCT",
		"Etc/UTC|Etc/Universal",
		"Etc/UTC|Etc/Zulu",
		"Etc/UTC|UCT",
		"Etc/UTC|UTC",
		"Etc/UTC|Universal",
		"Etc/UTC|Zulu",
		"Europe/Belgrade|Europe/Ljubljana",
		"Europe/Belgrade|Europe/Podgorica",
		"Europe/Belgrade|Europe/Sarajevo",
		"Europe/Belgrade|Europe/Skopje",
		"Europe/Belgrade|Europe/Zagreb",
		"Europe/Chisinau|Europe/Tiraspol",
		"Europe/Dublin|Eire",
		"Europe/Helsinki|Europe/Mariehamn",
		"Europe/Istanbul|Asia/Istanbul",
		"Europe/Istanbul|Turkey",
		"Europe/Lisbon|Portugal",
		"Europe/London|Europe/Belfast",
		"Europe/London|Europe/Guernsey",
		"Europe/London|Europe/Isle_of_Man",
		"Europe/London|Europe/Jersey",
		"Europe/London|GB",
		"Europe/London|GB-Eire",
		"Europe/Moscow|W-SU",
		"Europe/Oslo|Arctic/Longyearbyen",
		"Europe/Oslo|Atlantic/Jan_Mayen",
		"Europe/Prague|Europe/Bratislava",
		"Europe/Rome|Europe/San_Marino",
		"Europe/Rome|Europe/Vatican",
		"Europe/Warsaw|Poland",
		"Europe/Zurich|Europe/Busingen",
		"Europe/Zurich|Europe/Vaduz",
		"Indian/Christmas|Etc/GMT-7",
		"Pacific/Auckland|Antarctica/McMurdo",
		"Pacific/Auckland|Antarctica/South_Pole",
		"Pacific/Auckland|NZ",
		"Pacific/Chatham|NZ-CHAT",
		"Pacific/Chuuk|Pacific/Truk",
		"Pacific/Chuuk|Pacific/Yap",
		"Pacific/Easter|Chile/EasterIsland",
		"Pacific/Enderbury|Pacific/Kanton",
		"Pacific/Guam|Pacific/Saipan",
		"Pacific/Honolulu|Pacific/Johnston",
		"Pacific/Honolulu|US/Hawaii",
		"Pacific/Kwajalein|Kwajalein",
		"Pacific/Pago_Pago|Pacific/Midway",
		"Pacific/Pago_Pago|Pacific/Samoa",
		"Pacific/Pago_Pago|US/Samoa",
		"Pacific/Palau|Etc/GMT-9",
		"Pacific/Pohnpei|Pacific/Ponape",
		"Pacific/Port_Moresby|Antarctica/DumontDUrville",
		"Pacific/Port_Moresby|Etc/GMT-10",
		"Pacific/Tarawa|Etc/GMT-12",
		"Pacific/Tarawa|Pacific/Funafuti",
		"Pacific/Tarawa|Pacific/Wake",
		"Pacific/Tarawa|Pacific/Wallis"
	],
	"countries": [
		"AD|Europe/Andorra",
		"AE|Asia/Dubai",
		"AF|Asia/Kabul",
		"AG|America/Port_of_Spain America/Antigua",
		"AI|America/Port_of_Spain America/Anguilla",
		"AL|Europe/Tirane",
		"AM|Asia/Yerevan",
		"AO|Africa/Lagos Africa/Luanda",
		"AQ|Antarctica/Casey Antarctica/Davis Antarctica/DumontDUrville Antarctica/Mawson Antarctica/Palmer Antarctica/Rothera Antarctica/Syowa Antarctica/Troll Antarctica/Vostok Pacific/Auckland Antarctica/McMurdo",
		"AR|America/Argentina/Buenos_Aires America/Argentina/Cordoba America/Argentina/Salta America/Argentina/Jujuy America/Argentina/Tucuman America/Argentina/Catamarca America/Argentina/La_Rioja America/Argentina/San_Juan America/Argentina/Mendoza America/Argentina/San_Luis America/Argentina/Rio_Gallegos America/Argentina/Ushuaia",
		"AS|Pacific/Pago_Pago",
		"AT|Europe/Vienna",
		"AU|Australia/Lord_Howe Antarctica/Macquarie Australia/Hobart Australia/Melbourne Australia/Sydney Australia/Broken_Hill Australia/Brisbane Australia/Lindeman Australia/Adelaide Australia/Darwin Australia/Perth Australia/Eucla",
		"AW|America/Curacao America/Aruba",
		"AX|Europe/Helsinki Europe/Mariehamn",
		"AZ|Asia/Baku",
		"BA|Europe/Belgrade Europe/Sarajevo",
		"BB|America/Barbados",
		"BD|Asia/Dhaka",
		"BE|Europe/Brussels",
		"BF|Africa/Abidjan Africa/Ouagadougou",
		"BG|Europe/Sofia",
		"BH|Asia/Qatar Asia/Bahrain",
		"BI|Africa/Maputo Africa/Bujumbura",
		"BJ|Africa/Lagos Africa/Porto-Novo",
		"BL|America/Port_of_Spain America/St_Barthelemy",
		"BM|Atlantic/Bermuda",
		"BN|Asia/Brunei",
		"BO|America/La_Paz",
		"BQ|America/Curacao America/Kralendijk",
		"BR|America/Noronha America/Belem America/Fortaleza America/Recife America/Araguaina America/Maceio America/Bahia America/Sao_Paulo America/Campo_Grande America/Cuiaba America/Santarem America/Porto_Velho America/Boa_Vista America/Manaus America/Eirunepe America/Rio_Branco",
		"BS|America/Nassau",
		"BT|Asia/Thimphu",
		"BW|Africa/Maputo Africa/Gaborone",
		"BY|Europe/Minsk",
		"BZ|America/Belize",
		"CA|America/St_Johns America/Halifax America/Glace_Bay America/Moncton America/Goose_Bay America/Blanc-Sablon America/Toronto America/Nipigon America/Thunder_Bay America/Iqaluit America/Pangnirtung America/Atikokan America/Winnipeg America/Rainy_River America/Resolute America/Rankin_Inlet America/Regina America/Swift_Current America/Edmonton America/Cambridge_Bay America/Yellowknife America/Inuvik America/Creston America/Dawson_Creek America/Fort_Nelson America/Whitehorse America/Dawson America/Vancouver",
		"CC|Indian/Cocos",
		"CD|Africa/Maputo Africa/Lagos Africa/Kinshasa Africa/Lubumbashi",
		"CF|Africa/Lagos Africa/Bangui",
		"CG|Africa/Lagos Africa/Brazzaville",
		"CH|Europe/Zurich",
		"CI|Africa/Abidjan",
		"CK|Pacific/Rarotonga",
		"CL|America/Santiago America/Punta_Arenas Pacific/Easter",
		"CM|Africa/Lagos Africa/Douala",
		"CN|Asia/Shanghai Asia/Urumqi",
		"CO|America/Bogota",
		"CR|America/Costa_Rica",
		"CU|America/Havana",
		"CV|Atlantic/Cape_Verde",
		"CW|America/Curacao",
		"CX|Indian/Christmas",
		"CY|Asia/Nicosia Asia/Famagusta",
		"CZ|Europe/Prague",
		"DE|Europe/Zurich Europe/Berlin Europe/Busingen",
		"DJ|Africa/Nairobi Africa/Djibouti",
		"DK|Europe/Copenhagen",
		"DM|America/Port_of_Spain America/Dominica",
		"DO|America/Santo_Domingo",
		"DZ|Africa/Algiers",
		"EC|America/Guayaquil Pacific/Galapagos",
		"EE|Europe/Tallinn",
		"EG|Africa/Cairo",
		"EH|Africa/El_Aaiun",
		"ER|Africa/Nairobi Africa/Asmara",
		"ES|Europe/Madrid Africa/Ceuta Atlantic/Canary",
		"ET|Africa/Nairobi Africa/Addis_Ababa",
		"FI|Europe/Helsinki",
		"FJ|Pacific/Fiji",
		"FK|Atlantic/Stanley",
		"FM|Pacific/Chuuk Pacific/Pohnpei Pacific/Kosrae",
		"FO|Atlantic/Faroe",
		"FR|Europe/Paris",
		"GA|Africa/Lagos Africa/Libreville",
		"GB|Europe/London",
		"GD|America/Port_of_Spain America/Grenada",
		"GE|Asia/Tbilisi",
		"GF|America/Cayenne",
		"GG|Europe/London Europe/Guernsey",
		"GH|Africa/Accra",
		"GI|Europe/Gibraltar",
		"GL|America/Nuuk America/Danmarkshavn America/Scoresbysund America/Thule",
		"GM|Africa/Abidjan Africa/Banjul",
		"GN|Africa/Abidjan Africa/Conakry",
		"GP|America/Port_of_Spain America/Guadeloupe",
		"GQ|Africa/Lagos Africa/Malabo",
		"GR|Europe/Athens",
		"GS|Atlantic/South_Georgia",
		"GT|America/Guatemala",
		"GU|Pacific/Guam",
		"GW|Africa/Bissau",
		"GY|America/Guyana",
		"HK|Asia/Hong_Kong",
		"HN|America/Tegucigalpa",
		"HR|Europe/Belgrade Europe/Zagreb",
		"HT|America/Port-au-Prince",
		"HU|Europe/Budapest",
		"ID|Asia/Jakarta Asia/Pontianak Asia/Makassar Asia/Jayapura",
		"IE|Europe/Dublin",
		"IL|Asia/Jerusalem",
		"IM|Europe/London Europe/Isle_of_Man",
		"IN|Asia/Kolkata",
		"IO|Indian/Chagos",
		"IQ|Asia/Baghdad",
		"IR|Asia/Tehran",
		"IS|Atlantic/Reykjavik",
		"IT|Europe/Rome",
		"JE|Europe/London Europe/Jersey",
		"JM|America/Jamaica",
		"JO|Asia/Amman",
		"JP|Asia/Tokyo",
		"KE|Africa/Nairobi",
		"KG|Asia/Bishkek",
		"KH|Asia/Bangkok Asia/Phnom_Penh",
		"KI|Pacific/Tarawa Pacific/Enderbury Pacific/Kiritimati",
		"KM|Africa/Nairobi Indian/Comoro",
		"KN|America/Port_of_Spain America/St_Kitts",
		"KP|Asia/Pyongyang",
		"KR|Asia/Seoul",
		"KW|Asia/Riyadh Asia/Kuwait",
		"KY|America/Panama America/Cayman",
		"KZ|Asia/Almaty Asia/Qyzylorda Asia/Qostanay Asia/Aqtobe Asia/Aqtau Asia/Atyrau Asia/Oral",
		"LA|Asia/Bangkok Asia/Vientiane",
		"LB|Asia/Beirut",
		"LC|America/Port_of_Spain America/St_Lucia",
		"LI|Europe/Zurich Europe/Vaduz",
		"LK|Asia/Colombo",
		"LR|Africa/Monrovia",
		"LS|Africa/Johannesburg Africa/Maseru",
		"LT|Europe/Vilnius",
		"LU|Europe/Luxembourg",
		"LV|Europe/Riga",
		"LY|Africa/Tripoli",
		"MA|Africa/Casablanca",
		"MC|Europe/Monaco",
		"MD|Europe/Chisinau",
		"ME|Europe/Belgrade Europe/Podgorica",
		"MF|America/Port_of_Spain America/Marigot",
		"MG|Africa/Nairobi Indian/Antananarivo",
		"MH|Pacific/Majuro Pacific/Kwajalein",
		"MK|Europe/Belgrade Europe/Skopje",
		"ML|Africa/Abidjan Africa/Bamako",
		"MM|Asia/Yangon",
		"MN|Asia/Ulaanbaatar Asia/Hovd Asia/Choibalsan",
		"MO|Asia/Macau",
		"MP|Pacific/Guam Pacific/Saipan",
		"MQ|America/Martinique",
		"MR|Africa/Abidjan Africa/Nouakchott",
		"MS|America/Port_of_Spain America/Montserrat",
		"MT|Europe/Malta",
		"MU|Indian/Mauritius",
		"MV|Indian/Maldives",
		"MW|Africa/Maputo Africa/Blantyre",
		"MX|America/Mexico_City America/Cancun America/Merida America/Monterrey America/Matamoros America/Mazatlan America/Chihuahua America/Ojinaga America/Hermosillo America/Tijuana America/Bahia_Banderas",
		"MY|Asia/Kuala_Lumpur Asia/Kuching",
		"MZ|Africa/Maputo",
		"NA|Africa/Windhoek",
		"NC|Pacific/Noumea",
		"NE|Africa/Lagos Africa/Niamey",
		"NF|Pacific/Norfolk",
		"NG|Africa/Lagos",
		"NI|America/Managua",
		"NL|Europe/Amsterdam",
		"NO|Europe/Oslo",
		"NP|Asia/Kathmandu",
		"NR|Pacific/Nauru",
		"NU|Pacific/Niue",
		"NZ|Pacific/Auckland Pacific/Chatham",
		"OM|Asia/Dubai Asia/Muscat",
		"PA|America/Panama",
		"PE|America/Lima",
		"PF|Pacific/Tahiti Pacific/Marquesas Pacific/Gambier",
		"PG|Pacific/Port_Moresby Pacific/Bougainville",
		"PH|Asia/Manila",
		"PK|Asia/Karachi",
		"PL|Europe/Warsaw",
		"PM|America/Miquelon",
		"PN|Pacific/Pitcairn",
		"PR|America/Puerto_Rico",
		"PS|Asia/Gaza Asia/Hebron",
		"PT|Europe/Lisbon Atlantic/Madeira Atlantic/Azores",
		"PW|Pacific/Palau",
		"PY|America/Asuncion",
		"QA|Asia/Qatar",
		"RE|Indian/Reunion",
		"RO|Europe/Bucharest",
		"RS|Europe/Belgrade",
		"RU|Europe/Kaliningrad Europe/Moscow Europe/Simferopol Europe/Kirov Europe/Volgograd Europe/Astrakhan Europe/Saratov Europe/Ulyanovsk Europe/Samara Asia/Yekaterinburg Asia/Omsk Asia/Novosibirsk Asia/Barnaul Asia/Tomsk Asia/Novokuznetsk Asia/Krasnoyarsk Asia/Irkutsk Asia/Chita Asia/Yakutsk Asia/Khandyga Asia/Vladivostok Asia/Ust-Nera Asia/Magadan Asia/Sakhalin Asia/Srednekolymsk Asia/Kamchatka Asia/Anadyr",
		"RW|Africa/Maputo Africa/Kigali",
		"SA|Asia/Riyadh",
		"SB|Pacific/Guadalcanal",
		"SC|Indian/Mahe",
		"SD|Africa/Khartoum",
		"SE|Europe/Stockholm",
		"SG|Asia/Singapore",
		"SH|Africa/Abidjan Atlantic/St_Helena",
		"SI|Europe/Belgrade Europe/Ljubljana",
		"SJ|Europe/Oslo Arctic/Longyearbyen",
		"SK|Europe/Prague Europe/Bratislava",
		"SL|Africa/Abidjan Africa/Freetown",
		"SM|Europe/Rome Europe/San_Marino",
		"SN|Africa/Abidjan Africa/Dakar",
		"SO|Africa/Nairobi Africa/Mogadishu",
		"SR|America/Paramaribo",
		"SS|Africa/Juba",
		"ST|Africa/Sao_Tome",
		"SV|America/El_Salvador",
		"SX|America/Curacao America/Lower_Princes",
		"SY|Asia/Damascus",
		"SZ|Africa/Johannesburg Africa/Mbabane",
		"TC|America/Grand_Turk",
		"TD|Africa/Ndjamena",
		"TF|Indian/Reunion Indian/Kerguelen",
		"TG|Africa/Abidjan Africa/Lome",
		"TH|Asia/Bangkok",
		"TJ|Asia/Dushanbe",
		"TK|Pacific/Fakaofo",
		"TL|Asia/Dili",
		"TM|Asia/Ashgabat",
		"TN|Africa/Tunis",
		"TO|Pacific/Tongatapu",
		"TR|Europe/Istanbul",
		"TT|America/Port_of_Spain",
		"TV|Pacific/Funafuti",
		"TW|Asia/Taipei",
		"TZ|Africa/Nairobi Africa/Dar_es_Salaam",
		"UA|Europe/Simferopol Europe/Kiev Europe/Uzhgorod Europe/Zaporozhye",
		"UG|Africa/Nairobi Africa/Kampala",
		"UM|Pacific/Pago_Pago Pacific/Wake Pacific/Honolulu Pacific/Midway",
		"US|America/New_York America/Detroit America/Kentucky/Louisville America/Kentucky/Monticello America/Indiana/Indianapolis America/Indiana/Vincennes America/Indiana/Winamac America/Indiana/Marengo America/Indiana/Petersburg America/Indiana/Vevay America/Chicago America/Indiana/Tell_City America/Indiana/Knox America/Menominee America/North_Dakota/Center America/North_Dakota/New_Salem America/North_Dakota/Beulah America/Denver America/Boise America/Phoenix America/Los_Angeles America/Anchorage America/Juneau America/Sitka America/Metlakatla America/Yakutat America/Nome America/Adak Pacific/Honolulu",
		"UY|America/Montevideo",
		"UZ|Asia/Samarkand Asia/Tashkent",
		"VA|Europe/Rome Europe/Vatican",
		"VC|America/Port_of_Spain America/St_Vincent",
		"VE|America/Caracas",
		"VG|America/Port_of_Spain America/Tortola",
		"VI|America/Port_of_Spain America/St_Thomas",
		"VN|Asia/Bangkok Asia/Ho_Chi_Minh",
		"VU|Pacific/Efate",
		"WF|Pacific/Wallis",
		"WS|Pacific/Apia",
		"YE|Asia/Riyadh Asia/Aden",
		"YT|Africa/Nairobi Indian/Mayotte",
		"ZA|Africa/Johannesburg",
		"ZM|Africa/Maputo Africa/Lusaka",
		"ZW|Africa/Maputo Africa/Harare"
	]
}{
	"countries": {
		"AD": {
			"name": "Andorra",
			"abbr": "AD",
			"zones": [
				"Europe/Andorra"
			]
		},
		"AE": {
			"name": "United Arab Emirates",
			"abbr": "AE",
			"zones": [
				"Asia/Dubai"
			]
		},
		"AF": {
			"name": "Afghanistan",
			"abbr": "AF",
			"zones": [
				"Asia/Kabul"
			]
		},
		"AG": {
			"name": "Antigua & Barbuda",
			"abbr": "AG",
			"zones": [
				"America/Puerto_Rico",
				"America/Antigua"
			]
		},
		"AI": {
			"name": "Anguilla",
			"abbr": "AI",
			"zones": [
				"America/Puerto_Rico",
				"America/Anguilla"
			]
		},
		"AL": {
			"name": "Albania",
			"abbr": "AL",
			"zones": [
				"Europe/Tirane"
			]
		},
		"AM": {
			"name": "Armenia",
			"abbr": "AM",
			"zones": [
				"Asia/Yerevan"
			]
		},
		"AO": {
			"name": "Angola",
			"abbr": "AO",
			"zones": [
				"Africa/Lagos",
				"Africa/Luanda"
			]
		},
		"AQ": {
			"name": "Antarctica",
			"abbr": "AQ",
			"zones": [
				"Antarctica/Casey",
				"Antarctica/Davis",
				"Antarctica/Mawson",
				"Antarctica/Palmer",
				"Antarctica/Rothera",
				"Antarctica/Troll",
				"Antarctica/Vostok",
				"Pacific/Auckland",
				"Pacific/Port_Moresby",
				"Asia/Riyadh",
				"Antarctica/McMurdo",
				"Antarctica/DumontDUrville",
				"Antarctica/Syowa"
			]
		},
		"AR": {
			"name": "Argentina",
			"abbr": "AR",
			"zones": [
				"America/Argentina/Buenos_Aires",
				"America/Argentina/Cordoba",
				"America/Argentina/Salta",
				"America/Argentina/Jujuy",
				"America/Argentina/Tucuman",
				"America/Argentina/Catamarca",
				"America/Argentina/La_Rioja",
				"America/Argentina/San_Juan",
				"America/Argentina/Mendoza",
				"America/Argentina/San_Luis",
				"America/Argentina/Rio_Gallegos",
				"America/Argentina/Ushuaia"
			]
		},
		"AS": {
			"name": "Samoa (American)",
			"abbr": "AS",
			"zones": [
				"Pacific/Pago_Pago"
			]
		},
		"AT": {
			"name": "Austria",
			"abbr": "AT",
			"zones": [
				"Europe/Vienna"
			]
		},
		"AU": {
			"name": "Australia",
			"abbr": "AU",
			"zones": [
				"Australia/Lord_Howe",
				"Antarctica/Macquarie",
				"Australia/Hobart",
				"Australia/Melbourne",
				"Australia/Sydney",
				"Australia/Broken_Hill",
				"Australia/Brisbane",
				"Australia/Lindeman",
				"Australia/Adelaide",
				"Australia/Darwin",
				"Australia/Perth",
				"Australia/Eucla"
			]
		},
		"AW": {
			"name": "Aruba",
			"abbr": "AW",
			"zones": [
				"America/Puerto_Rico",
				"America/Aruba"
			]
		},
		"AX": {
			"name": "Åland Islands",
			"abbr": "AX",
			"zones": [
				"Europe/Helsinki",
				"Europe/Mariehamn"
			]
		},
		"AZ": {
			"name": "Azerbaijan",
			"abbr": "AZ",
			"zones": [
				"Asia/Baku"
			]
		},
		"BA": {
			"name": "Bosnia & Herzegovina",
			"abbr": "BA",
			"zones": [
				"Europe/Belgrade",
				"Europe/Sarajevo"
			]
		},
		"BB": {
			"name": "Barbados",
			"abbr": "BB",
			"zones": [
				"America/Barbados"
			]
		},
		"BD": {
			"name": "Bangladesh",
			"abbr": "BD",
			"zones": [
				"Asia/Dhaka"
			]
		},
		"BE": {
			"name": "Belgium",
			"abbr": "BE",
			"zones": [
				"Europe/Brussels"
			]
		},
		"BF": {
			"name": "Burkina Faso",
			"abbr": "BF",
			"zones": [
				"Africa/Abidjan",
				"Africa/Ouagadougou"
			]
		},
		"BG": {
			"name": "Bulgaria",
			"abbr": "BG",
			"zones": [
				"Europe/Sofia"
			]
		},
		"BH": {
			"name": "Bahrain",
			"abbr": "BH",
			"zones": [
				"Asia/Qatar",
				"Asia/Bahrain"
			]
		},
		"BI": {
			"name": "Burundi",
			"abbr": "BI",
			"zones": [
				"Africa/Maputo",
				"Africa/Bujumbura"
			]
		},
		"BJ": {
			"name": "Benin",
			"abbr": "BJ",
			"zones": [
				"Africa/Lagos",
				"Africa/Porto-Novo"
			]
		},
		"BL": {
			"name": "St Barthelemy",
			"abbr": "BL",
			"zones": [
				"America/Puerto_Rico",
				"America/St_Barthelemy"
			]
		},
		"BM": {
			"name": "Bermuda",
			"abbr": "BM",
			"zones": [
				"Atlantic/Bermuda"
			]
		},
		"BN": {
			"name": "Brunei",
			"abbr": "BN",
			"zones": [
				"Asia/Brunei"
			]
		},
		"BO": {
			"name": "Bolivia",
			"abbr": "BO",
			"zones": [
				"America/La_Paz"
			]
		},
		"BQ": {
			"name": "Caribbean NL",
			"abbr": "BQ",
			"zones": [
				"America/Puerto_Rico",
				"America/Kralendijk"
			]
		},
		"BR": {
			"name": "Brazil",
			"abbr": "BR",
			"zones": [
				"America/Noronha",
				"America/Belem",
				"America/Fortaleza",
				"America/Recife",
				"America/Araguaina",
				"America/Maceio",
				"America/Bahia",
				"America/Sao_Paulo",
				"America/Campo_Grande",
				"America/Cuiaba",
				"America/Santarem",
				"America/Porto_Velho",
				"America/Boa_Vista",
				"America/Manaus",
				"America/Eirunepe",
				"America/Rio_Branco"
			]
		},
		"BS": {
			"name": "Bahamas",
			"abbr": "BS",
			"zones": [
				"America/Toronto",
				"America/Nassau"
			]
		},
		"BT": {
			"name": "Bhutan",
			"abbr": "BT",
			"zones": [
				"Asia/Thimphu"
			]
		},
		"BW": {
			"name": "Botswana",
			"abbr": "BW",
			"zones": [
				"Africa/Maputo",
				"Africa/Gaborone"
			]
		},
		"BY": {
			"name": "Belarus",
			"abbr": "BY",
			"zones": [
				"Europe/Minsk"
			]
		},
		"BZ": {
			"name": "Belize",
			"abbr": "BZ",
			"zones": [
				"America/Belize"
			]
		},
		"CA": {
			"name": "Canada",
			"abbr": "CA",
			"zones": [
				"America/St_Johns",
				"America/Halifax",
				"America/Glace_Bay",
				"America/Moncton",
				"America/Goose_Bay",
				"America/Toronto",
				"America/Nipigon",
				"America/Thunder_Bay",
				"America/Iqaluit",
				"America/Pangnirtung",
				"America/Winnipeg",
				"America/Rainy_River",
				"America/Resolute",
				"America/Rankin_Inlet",
				"America/Regina",
				"America/Swift_Current",
				"America/Edmonton",
				"America/Cambridge_Bay",
				"America/Yellowknife",
				"America/Inuvik",
				"America/Dawson_Creek",
				"America/Fort_Nelson",
				"America/Whitehorse",
				"America/Dawson",
				"America/Vancouver",
				"America/Panama",
				"America/Puerto_Rico",
				"America/Phoenix",
				"America/Blanc-Sablon",
				"America/Atikokan",
				"America/Creston"
			]
		},
		"CC": {
			"name": "Cocos (Keeling) Islands",
			"abbr": "CC",
			"zones": [
				"Indian/Cocos"
			]
		},
		"CD": {
			"name": "Congo (Dem. Rep.)",
			"abbr": "CD",
			"zones": [
				"Africa/Maputo",
				"Africa/Lagos",
				"Africa/Kinshasa",
				"Africa/Lubumbashi"
			]
		},
		"CF": {
			"name": "Central African Rep.",
			"abbr": "CF",
			"zones": [
				"Africa/Lagos",
				"Africa/Bangui"
			]
		},
		"CG": {
			"name": "Congo (Rep.)",
			"abbr": "CG",
			"zones": [
				"Africa/Lagos",
				"Africa/Brazzaville"
			]
		},
		"CH": {
			"name": "Switzerland",
			"abbr": "CH",
			"zones": [
				"Europe/Zurich"
			]
		},
		"CI": {
			"name": "Côte d'Ivoire",
			"abbr": "CI",
			"zones": [
				"Africa/Abidjan"
			]
		},
		"CK": {
			"name": "Cook Islands",
			"abbr": "CK",
			"zones": [
				"Pacific/Rarotonga"
			]
		},
		"CL": {
			"name": "Chile",
			"abbr": "CL",
			"zones": [
				"America/Santiago",
				"America/Punta_Arenas",
				"Pacific/Easter"
			]
		},
		"CM": {
			"name": "Cameroon",
			"abbr": "CM",
			"zones": [
				"Africa/Lagos",
				"Africa/Douala"
			]
		},
		"CN": {
			"name": "China",
			"abbr": "CN",
			"zones": [
				"Asia/Shanghai",
				"Asia/Urumqi"
			]
		},
		"CO": {
			"name": "Colombia",
			"abbr": "CO",
			"zones": [
				"America/Bogota"
			]
		},
		"CR": {
			"name": "Costa Rica",
			"abbr": "CR",
			"zones": [
				"America/Costa_Rica"
			]
		},
		"CU": {
			"name": "Cuba",
			"abbr": "CU",
			"zones": [
				"America/Havana"
			]
		},
		"CV": {
			"name": "Cape Verde",
			"abbr": "CV",
			"zones": [
				"Atlantic/Cape_Verde"
			]
		},
		"CW": {
			"name": "Curaçao",
			"abbr": "CW",
			"zones": [
				"America/Puerto_Rico",
				"America/Curacao"
			]
		},
		"CX": {
			"name": "Christmas Island",
			"abbr": "CX",
			"zones": [
				"Indian/Christmas"
			]
		},
		"CY": {
			"name": "Cyprus",
			"abbr": "CY",
			"zones": [
				"Asia/Nicosia",
				"Asia/Famagusta"
			]
		},
		"CZ": {
			"name": "Czech Republic",
			"abbr": "CZ",
			"zones": [
				"Europe/Prague"
			]
		},
		"DE": {
			"name": "Germany",
			"abbr": "DE",
			"zones": [
				"Europe/Zurich",
				"Europe/Berlin",
				"Europe/Busingen"
			]
		},
		"DJ": {
			"name": "Djibouti",
			"abbr": "DJ",
			"zones": [
				"Africa/Nairobi",
				"Africa/Djibouti"
			]
		},
		"DK": {
			"name": "Denmark",
			"abbr": "DK",
			"zones": [
				"Europe/Copenhagen"
			]
		},
		"DM": {
			"name": "Dominica",
			"abbr": "DM",
			"zones": [
				"America/Puerto_Rico",
				"America/Dominica"
			]
		},
		"DO": {
			"name": "Dominican Republic",
			"abbr": "DO",
			"zones": [
				"America/Santo_Domingo"
			]
		},
		"DZ": {
			"name": "Algeria",
			"abbr": "DZ",
			"zones": [
				"Africa/Algiers"
			]
		},
		"EC": {
			"name": "Ecuador",
			"abbr": "EC",
			"zones": [
				"America/Guayaquil",
				"Pacific/Galapagos"
			]
		},
		"EE": {
			"name": "Estonia",
			"abbr": "EE",
			"zones": [
				"Europe/Tallinn"
			]
		},
		"EG": {
			"name": "Egypt",
			"abbr": "EG",
			"zones": [
				"Africa/Cairo"
			]
		},
		"EH": {
			"name": "Western Sahara",
			"abbr": "EH",
			"zones": [
				"Africa/El_Aaiun"
			]
		},
		"ER": {
			"name": "Eritrea",
			"abbr": "ER",
			"zones": [
				"Africa/Nairobi",
				"Africa/Asmara"
			]
		},
		"ES": {
			"name": "Spain",
			"abbr": "ES",
			"zones": [
				"Europe/Madrid",
				"Africa/Ceuta",
				"Atlantic/Canary"
			]
		},
		"ET": {
			"name": "Ethiopia",
			"abbr": "ET",
			"zones": [
				"Africa/Nairobi",
				"Africa/Addis_Ababa"
			]
		},
		"FI": {
			"name": "Finland",
			"abbr": "FI",
			"zones": [
				"Europe/Helsinki"
			]
		},
		"FJ": {
			"name": "Fiji",
			"abbr": "FJ",
			"zones": [
				"Pacific/Fiji"
			]
		},
		"FK": {
			"name": "Falkland Islands",
			"abbr": "FK",
			"zones": [
				"Atlantic/Stanley"
			]
		},
		"FM": {
			"name": "Micronesia",
			"abbr": "FM",
			"zones": [
				"Pacific/Chuuk",
				"Pacific/Pohnpei",
				"Pacific/Kosrae"
			]
		},
		"FO": {
			"name": "Faroe Islands",
			"abbr": "FO",
			"zones": [
				"Atlantic/Faroe"
			]
		},
		"FR": {
			"name": "France",
			"abbr": "FR",
			"zones": [
				"Europe/Paris"
			]
		},
		"GA": {
			"name": "Gabon",
			"abbr": "GA",
			"zones": [
				"Africa/Lagos",
				"Africa/Libreville"
			]
		},
		"GB": {
			"name": "Britain (UK)",
			"abbr": "GB",
			"zones": [
				"Europe/London"
			]
		},
		"GD": {
			"name": "Grenada",
			"abbr": "GD",
			"zones": [
				"America/Puerto_Rico",
				"America/Grenada"
			]
		},
		"GE": {
			"name": "Georgia",
			"abbr": "GE",
			"zones": [
				"Asia/Tbilisi"
			]
		},
		"GF": {
			"name": "French Guiana",
			"abbr": "GF",
			"zones": [
				"America/Cayenne"
			]
		},
		"GG": {
			"name": "Guernsey",
			"abbr": "GG",
			"zones": [
				"Europe/London",
				"Europe/Guernsey"
			]
		},
		"GH": {
			"name": "Ghana",
			"abbr": "GH",
			"zones": [
				"Africa/Abidjan",
				"Africa/Accra"
			]
		},
		"GI": {
			"name": "Gibraltar",
			"abbr": "GI",
			"zones": [
				"Europe/Gibraltar"
			]
		},
		"GL": {
			"name": "Greenland",
			"abbr": "GL",
			"zones": [
				"America/Nuuk",
				"America/Danmarkshavn",
				"America/Scoresbysund",
				"America/Thule"
			]
		},
		"GM": {
			"name": "Gambia",
			"abbr": "GM",
			"zones": [
				"Africa/Abidjan",
				"Africa/Banjul"
			]
		},
		"GN": {
			"name": "Guinea",
			"abbr": "GN",
			"zones": [
				"Africa/Abidjan",
				"Africa/Conakry"
			]
		},
		"GP": {
			"name": "Guadeloupe",
			"abbr": "GP",
			"zones": [
				"America/Puerto_Rico",
				"America/Guadeloupe"
			]
		},
		"GQ": {
			"name": "Equatorial Guinea",
			"abbr": "GQ",
			"zones": [
				"Africa/Lagos",
				"Africa/Malabo"
			]
		},
		"GR": {
			"name": "Greece",
			"abbr": "GR",
			"zones": [
				"Europe/Athens"
			]
		},
		"GS": {
			"name": "South Georgia & the South Sandwich Islands",
			"abbr": "GS",
			"zones": [
				"Atlantic/South_Georgia"
			]
		},
		"GT": {
			"name": "Guatemala",
			"abbr": "GT",
			"zones": [
				"America/Guatemala"
			]
		},
		"GU": {
			"name": "Guam",
			"abbr": "GU",
			"zones": [
				"Pacific/Guam"
			]
		},
		"GW": {
			"name": "Guinea-Bissau",
			"abbr": "GW",
			"zones": [
				"Africa/Bissau"
			]
		},
		"GY": {
			"name": "Guyana",
			"abbr": "GY",
			"zones": [
				"America/Guyana"
			]
		},
		"HK": {
			"name": "Hong Kong",
			"abbr": "HK",
			"zones": [
				"Asia/Hong_Kong"
			]
		},
		"HN": {
			"name": "Honduras",
			"abbr": "HN",
			"zones": [
				"America/Tegucigalpa"
			]
		},
		"HR": {
			"name": "Croatia",
			"abbr": "HR",
			"zones": [
				"Europe/Belgrade",
				"Europe/Zagreb"
			]
		},
		"HT": {
			"name": "Haiti",
			"abbr": "HT",
			"zones": [
				"America/Port-au-Prince"
			]
		},
		"HU": {
			"name": "Hungary",
			"abbr": "HU",
			"zones": [
				"Europe/Budapest"
			]
		},
		"ID": {
			"name": "Indonesia",
			"abbr": "ID",
			"zones": [
				"Asia/Jakarta",
				"Asia/Pontianak",
				"Asia/Makassar",
				"Asia/Jayapura"
			]
		},
		"IE": {
			"name": "Ireland",
			"abbr": "IE",
			"zones": [
				"Europe/Dublin"
			]
		},
		"IL": {
			"name": "Israel",
			"abbr": "IL",
			"zones": [
				"Asia/Jerusalem"
			]
		},
		"IM": {
			"name": "Isle of Man",
			"abbr": "IM",
			"zones": [
				"Europe/London",
				"Europe/Isle_of_Man"
			]
		},
		"IN": {
			"name": "India",
			"abbr": "IN",
			"zones": [
				"Asia/Kolkata"
			]
		},
		"IO": {
			"name": "British Indian Ocean Territory",
			"abbr": "IO",
			"zones": [
				"Indian/Chagos"
			]
		},
		"IQ": {
			"name": "Iraq",
			"abbr": "IQ",
			"zones": [
				"Asia/Baghdad"
			]
		},
		"IR": {
			"name": "Iran",
			"abbr": "IR",
			"zones": [
				"Asia/Tehran"
			]
		},
		"IS": {
			"name": "Iceland",
			"abbr": "IS",
			"zones": [
				"Atlantic/Reykjavik"
			]
		},
		"IT": {
			"name": "Italy",
			"abbr": "IT",
			"zones": [
				"Europe/Rome"
			]
		},
		"JE": {
			"name": "Jersey",
			"abbr": "JE",
			"zones": [
				"Europe/London",
				"Europe/Jersey"
			]
		},
		"JM": {
			"name": "Jamaica",
			"abbr": "JM",
			"zones": [
				"America/Jamaica"
			]
		},
		"JO": {
			"name": "Jordan",
			"abbr": "JO",
			"zones": [
				"Asia/Amman"
			]
		},
		"JP": {
			"name": "Japan",
			"abbr": "JP",
			"zones": [
				"Asia/Tokyo"
			]
		},
		"KE": {
			"name": "Kenya",
			"abbr": "KE",
			"zones": [
				"Africa/Nairobi"
			]
		},
		"KG": {
			"name": "Kyrgyzstan",
			"abbr": "KG",
			"zones": [
				"Asia/Bishkek"
			]
		},
		"KH": {
			"name": "Cambodia",
			"abbr": "KH",
			"zones": [
				"Asia/Bangkok",
				"Asia/Phnom_Penh"
			]
		},
		"KI": {
			"name": "Kiribati",
			"abbr": "KI",
			"zones": [
				"Pacific/Tarawa",
				"Pacific/Kanton",
				"Pacific/Kiritimati"
			]
		},
		"KM": {
			"name": "Comoros",
			"abbr": "KM",
			"zones": [
				"Africa/Nairobi",
				"Indian/Comoro"
			]
		},
		"KN": {
			"name": "St Kitts & Nevis",
			"abbr": "KN",
			"zones": [
				"America/Puerto_Rico",
				"America/St_Kitts"
			]
		},
		"KP": {
			"name": "Korea (North)",
			"abbr": "KP",
			"zones": [
				"Asia/Pyongyang"
			]
		},
		"KR": {
			"name": "Korea (South)",
			"abbr": "KR",
			"zones": [
				"Asia/Seoul"
			]
		},
		"KW": {
			"name": "Kuwait",
			"abbr": "KW",
			"zones": [
				"Asia/Riyadh",
				"Asia/Kuwait"
			]
		},
		"KY": {
			"name": "Cayman Islands",
			"abbr": "KY",
			"zones": [
				"America/Panama",
				"America/Cayman"
			]
		},
		"KZ": {
			"name": "Kazakhstan",
			"abbr": "KZ",
			"zones": [
				"Asia/Almaty",
				"Asia/Qyzylorda",
				"Asia/Qostanay",
				"Asia/Aqtobe",
				"Asia/Aqtau",
				"Asia/Atyrau",
				"Asia/Oral"
			]
		},
		"LA": {
			"name": "Laos",
			"abbr": "LA",
			"zones": [
				"Asia/Bangkok",
				"Asia/Vientiane"
			]
		},
		"LB": {
			"name": "Lebanon",
			"abbr": "LB",
			"zones": [
				"Asia/Beirut"
			]
		},
		"LC": {
			"name": "St Lucia",
			"abbr": "LC",
			"zones": [
				"America/Puerto_Rico",
				"America/St_Lucia"
			]
		},
		"LI": {
			"name": "Liechtenstein",
			"abbr": "LI",
			"zones": [
				"Europe/Zurich",
				"Europe/Vaduz"
			]
		},
		"LK": {
			"name": "Sri Lanka",
			"abbr": "LK",
			"zones": [
				"Asia/Colombo"
			]
		},
		"LR": {
			"name": "Liberia",
			"abbr": "LR",
			"zones": [
				"Africa/Monrovia"
			]
		},
		"LS": {
			"name": "Lesotho",
			"abbr": "LS",
			"zones": [
				"Africa/Johannesburg",
				"Africa/Maseru"
			]
		},
		"LT": {
			"name": "Lithuania",
			"abbr": "LT",
			"zones": [
				"Europe/Vilnius"
			]
		},
		"LU": {
			"name": "Luxembourg",
			"abbr": "LU",
			"zones": [
				"Europe/Luxembourg"
			]
		},
		"LV": {
			"name": "Latvia",
			"abbr": "LV",
			"zones": [
				"Europe/Riga"
			]
		},
		"LY": {
			"name": "Libya",
			"abbr": "LY",
			"zones": [
				"Africa/Tripoli"
			]
		},
		"MA": {
			"name": "Morocco",
			"abbr": "MA",
			"zones": [
				"Africa/Casablanca"
			]
		},
		"MC": {
			"name": "Monaco",
			"abbr": "MC",
			"zones": [
				"Europe/Monaco"
			]
		},
		"MD": {
			"name": "Moldova",
			"abbr": "MD",
			"zones": [
				"Europe/Chisinau"
			]
		},
		"ME": {
			"name": "Montenegro",
			"abbr": "ME",
			"zones": [
				"Europe/Belgrade",
				"Europe/Podgorica"
			]
		},
		"MF": {
			"name": "St Martin (French)",
			"abbr": "MF",
			"zones": [
				"America/Puerto_Rico",
				"America/Marigot"
			]
		},
		"MG": {
			"name": "Madagascar",
			"abbr": "MG",
			"zones": [
				"Africa/Nairobi",
				"Indian/Antananarivo"
			]
		},
		"MH": {
			"name": "Marshall Islands",
			"abbr": "MH",
			"zones": [
				"Pacific/Majuro",
				"Pacific/Kwajalein"
			]
		},
		"MK": {
			"name": "North Macedonia",
			"abbr": "MK",
			"zones": [
				"Europe/Belgrade",
				"Europe/Skopje"
			]
		},
		"ML": {
			"name": "Mali",
			"abbr": "ML",
			"zones": [
				"Africa/Abidjan",
				"Africa/Bamako"
			]
		},
		"MM": {
			"name": "Myanmar (Burma)",
			"abbr": "MM",
			"zones": [
				"Asia/Yangon"
			]
		},
		"MN": {
			"name": "Mongolia",
			"abbr": "MN",
			"zones": [
				"Asia/Ulaanbaatar",
				"Asia/Hovd",
				"Asia/Choibalsan"
			]
		},
		"MO": {
			"name": "Macau",
			"abbr": "MO",
			"zones": [
				"Asia/Macau"
			]
		},
		"MP": {
			"name": "Northern Mariana Islands",
			"abbr": "MP",
			"zones": [
				"Pacific/Guam",
				"Pacific/Saipan"
			]
		},
		"MQ": {
			"name": "Martinique",
			"abbr": "MQ",
			"zones": [
				"America/Martinique"
			]
		},
		"MR": {
			"name": "Mauritania",
			"abbr": "MR",
			"zones": [
				"Africa/Abidjan",
				"Africa/Nouakchott"
			]
		},
		"MS": {
			"name": "Montserrat",
			"abbr": "MS",
			"zones": [
				"America/Puerto_Rico",
				"America/Montserrat"
			]
		},
		"MT": {
			"name": "Malta",
			"abbr": "MT",
			"zones": [
				"Europe/Malta"
			]
		},
		"MU": {
			"name": "Mauritius",
			"abbr": "MU",
			"zones": [
				"Indian/Mauritius"
			]
		},
		"MV": {
			"name": "Maldives",
			"abbr": "MV",
			"zones": [
				"Indian/Maldives"
			]
		},
		"MW": {
			"name": "Malawi",
			"abbr": "MW",
			"zones": [
				"Africa/Maputo",
				"Africa/Blantyre"
			]
		},
		"MX": {
			"name": "Mexico",
			"abbr": "MX",
			"zones": [
				"America/Mexico_City",
				"America/Cancun",
				"America/Merida",
				"America/Monterrey",
				"America/Matamoros",
				"America/Mazatlan",
				"America/Chihuahua",
				"America/Ojinaga",
				"America/Hermosillo",
				"America/Tijuana",
				"America/Bahia_Banderas"
			]
		},
		"MY": {
			"name": "Malaysia",
			"abbr": "MY",
			"zones": [
				"Asia/Kuala_Lumpur",
				"Asia/Kuching",
				"Asia/Singapore"
			]
		},
		"MZ": {
			"name": "Mozambique",
			"abbr": "MZ",
			"zones": [
				"Africa/Maputo"
			]
		},
		"NA": {
			"name": "Namibia",
			"abbr": "NA",
			"zones": [
				"Africa/Windhoek"
			]
		},
		"NC": {
			"name": "New Caledonia",
			"abbr": "NC",
			"zones": [
				"Pacific/Noumea"
			]
		},
		"NE": {
			"name": "Niger",
			"abbr": "NE",
			"zones": [
				"Africa/Lagos",
				"Africa/Niamey"
			]
		},
		"NF": {
			"name": "Norfolk Island",
			"abbr": "NF",
			"zones": [
				"Pacific/Norfolk"
			]
		},
		"NG": {
			"name": "Nigeria",
			"abbr": "NG",
			"zones": [
				"Africa/Lagos"
			]
		},
		"NI": {
			"name": "Nicaragua",
			"abbr": "NI",
			"zones": [
				"America/Managua"
			]
		},
		"NL": {
			"name": "Netherlands",
			"abbr": "NL",
			"zones": [
				"Europe/Amsterdam"
			]
		},
		"NO": {
			"name": "Norway",
			"abbr": "NO",
			"zones": [
				"Europe/Oslo"
			]
		},
		"NP": {
			"name": "Nepal",
			"abbr": "NP",
			"zones": [
				"Asia/Kathmandu"
			]
		},
		"NR": {
			"name": "Nauru",
			"abbr": "NR",
			"zones": [
				"Pacific/Nauru"
			]
		},
		"NU": {
			"name": "Niue",
			"abbr": "NU",
			"zones": [
				"Pacific/Niue"
			]
		},
		"NZ": {
			"name": "New Zealand",
			"abbr": "NZ",
			"zones": [
				"Pacific/Auckland",
				"Pacific/Chatham"
			]
		},
		"OM": {
			"name": "Oman",
			"abbr": "OM",
			"zones": [
				"Asia/Dubai",
				"Asia/Muscat"
			]
		},
		"PA": {
			"name": "Panama",
			"abbr": "PA",
			"zones": [
				"America/Panama"
			]
		},
		"PE": {
			"name": "Peru",
			"abbr": "PE",
			"zones": [
				"America/Lima"
			]
		},
		"PF": {
			"name": "French Polynesia",
			"abbr": "PF",
			"zones": [
				"Pacific/Tahiti",
				"Pacific/Marquesas",
				"Pacific/Gambier"
			]
		},
		"PG": {
			"name": "Papua New Guinea",
			"abbr": "PG",
			"zones": [
				"Pacific/Port_Moresby",
				"Pacific/Bougainville"
			]
		},
		"PH": {
			"name": "Philippines",
			"abbr": "PH",
			"zones": [
				"Asia/Manila"
			]
		},
		"PK": {
			"name": "Pakistan",
			"abbr": "PK",
			"zones": [
				"Asia/Karachi"
			]
		},
		"PL": {
			"name": "Poland",
			"abbr": "PL",
			"zones": [
				"Europe/Warsaw"
			]
		},
		"PM": {
			"name": "St Pierre & Miquelon",
			"abbr": "PM",
			"zones": [
				"America/Miquelon"
			]
		},
		"PN": {
			"name": "Pitcairn",
			"abbr": "PN",
			"zones": [
				"Pacific/Pitcairn"
			]
		},
		"PR": {
			"name": "Puerto Rico",
			"abbr": "PR",
			"zones": [
				"America/Puerto_Rico"
			]
		},
		"PS": {
			"name": "Palestine",
			"abbr": "PS",
			"zones": [
				"Asia/Gaza",
				"Asia/Hebron"
			]
		},
		"PT": {
			"name": "Portugal",
			"abbr": "PT",
			"zones": [
				"Europe/Lisbon",
				"Atlantic/Madeira",
				"Atlantic/Azores"
			]
		},
		"PW": {
			"name": "Palau",
			"abbr": "PW",
			"zones": [
				"Pacific/Palau"
			]
		},
		"PY": {
			"name": "Paraguay",
			"abbr": "PY",
			"zones": [
				"America/Asuncion"
			]
		},
		"QA": {
			"name": "Qatar",
			"abbr": "QA",
			"zones": [
				"Asia/Qatar"
			]
		},
		"RE": {
			"name": "Réunion",
			"abbr": "RE",
			"zones": [
				"Indian/Reunion"
			]
		},
		"RO": {
			"name": "Romania",
			"abbr": "RO",
			"zones": [
				"Europe/Bucharest"
			]
		},
		"RS": {
			"name": "Serbia",
			"abbr": "RS",
			"zones": [
				"Europe/Belgrade"
			]
		},
		"RU": {
			"name": "Russia",
			"abbr": "RU",
			"zones": [
				"Europe/Kaliningrad",
				"Europe/Moscow",
				"Europe/Simferopol",
				"Europe/Kirov",
				"Europe/Volgograd",
				"Europe/Astrakhan",
				"Europe/Saratov",
				"Europe/Ulyanovsk",
				"Europe/Samara",
				"Asia/Yekaterinburg",
				"Asia/Omsk",
				"Asia/Novosibirsk",
				"Asia/Barnaul",
				"Asia/Tomsk",
				"Asia/Novokuznetsk",
				"Asia/Krasnoyarsk",
				"Asia/Irkutsk",
				"Asia/Chita",
				"Asia/Yakutsk",
				"Asia/Khandyga",
				"Asia/Vladivostok",
				"Asia/Ust-Nera",
				"Asia/Magadan",
				"Asia/Sakhalin",
				"Asia/Srednekolymsk",
				"Asia/Kamchatka",
				"Asia/Anadyr"
			]
		},
		"RW": {
			"name": "Rwanda",
			"abbr": "RW",
			"zones": [
				"Africa/Maputo",
				"Africa/Kigali"
			]
		},
		"SA": {
			"name": "Saudi Arabia",
			"abbr": "SA",
			"zones": [
				"Asia/Riyadh"
			]
		},
		"SB": {
			"name": "Solomon Islands",
			"abbr": "SB",
			"zones": [
				"Pacific/Guadalcanal"
			]
		},
		"SC": {
			"name": "Seychelles",
			"abbr": "SC",
			"zones": [
				"Indian/Mahe"
			]
		},
		"SD": {
			"name": "Sudan",
			"abbr": "SD",
			"zones": [
				"Africa/Khartoum"
			]
		},
		"SE": {
			"name": "Sweden",
			"abbr": "SE",
			"zones": [
				"Europe/Stockholm"
			]
		},
		"SG": {
			"name": "Singapore",
			"abbr": "SG",
			"zones": [
				"Asia/Singapore"
			]
		},
		"SH": {
			"name": "St Helena",
			"abbr": "SH",
			"zones": [
				"Africa/Abidjan",
				"Atlantic/St_Helena"
			]
		},
		"SI": {
			"name": "Slovenia",
			"abbr": "SI",
			"zones": [
				"Europe/Belgrade",
				"Europe/Ljubljana"
			]
		},
		"SJ": {
			"name": "Svalbard & Jan Mayen",
			"abbr": "SJ",
			"zones": [
				"Europe/Oslo",
				"Arctic/Longyearbyen"
			]
		},
		"SK": {
			"name": "Slovakia",
			"abbr": "SK",
			"zones": [
				"Europe/Prague",
				"Europe/Bratislava"
			]
		},
		"SL": {
			"name": "Sierra Leone",
			"abbr": "SL",
			"zones": [
				"Africa/Abidjan",
				"Africa/Freetown"
			]
		},
		"SM": {
			"name": "San Marino",
			"abbr": "SM",
			"zones": [
				"Europe/Rome",
				"Europe/San_Marino"
			]
		},
		"SN": {
			"name": "Senegal",
			"abbr": "SN",
			"zones": [
				"Africa/Abidjan",
				"Africa/Dakar"
			]
		},
		"SO": {
			"name": "Somalia",
			"abbr": "SO",
			"zones": [
				"Africa/Nairobi",
				"Africa/Mogadishu"
			]
		},
		"SR": {
			"name": "Suriname",
			"abbr": "SR",
			"zones": [
				"America/Paramaribo"
			]
		},
		"SS": {
			"name": "South Sudan",
			"abbr": "SS",
			"zones": [
				"Africa/Juba"
			]
		},
		"ST": {
			"name": "Sao Tome & Principe",
			"abbr": "ST",
			"zones": [
				"Africa/Sao_Tome"
			]
		},
		"SV": {
			"name": "El Salvador",
			"abbr": "SV",
			"zones": [
				"America/El_Salvador"
			]
		},
		"SX": {
			"name": "St Maarten (Dutch)",
			"abbr": "SX",
			"zones": [
				"America/Puerto_Rico",
				"America/Lower_Princes"
			]
		},
		"SY": {
			"name": "Syria",
			"abbr": "SY",
			"zones": [
				"Asia/Damascus"
			]
		},
		"SZ": {
			"name": "Eswatini (Swaziland)",
			"abbr": "SZ",
			"zones": [
				"Africa/Johannesburg",
				"Africa/Mbabane"
			]
		},
		"TC": {
			"name": "Turks & Caicos Is",
			"abbr": "TC",
			"zones": [
				"America/Grand_Turk"
			]
		},
		"TD": {
			"name": "Chad",
			"abbr": "TD",
			"zones": [
				"Africa/Ndjamena"
			]
		},
		"TF": {
			"name": "French Southern & Antarctic Lands",
			"abbr": "TF",
			"zones": [
				"Indian/Reunion",
				"Indian/Kerguelen"
			]
		},
		"TG": {
			"name": "Togo",
			"abbr": "TG",
			"zones": [
				"Africa/Abidjan",
				"Africa/Lome"
			]
		},
		"TH": {
			"name": "Thailand",
			"abbr": "TH",
			"zones": [
				"Asia/Bangkok"
			]
		},
		"TJ": {
			"name": "Tajikistan",
			"abbr": "TJ",
			"zones": [
				"Asia/Dushanbe"
			]
		},
		"TK": {
			"name": "Tokelau",
			"abbr": "TK",
			"zones": [
				"Pacific/Fakaofo"
			]
		},
		"TL": {
			"name": "East Timor",
			"abbr": "TL",
			"zones": [
				"Asia/Dili"
			]
		},
		"TM": {
			"name": "Turkmenistan",
			"abbr": "TM",
			"zones": [
				"Asia/Ashgabat"
			]
		},
		"TN": {
			"name": "Tunisia",
			"abbr": "TN",
			"zones": [
				"Africa/Tunis"
			]
		},
		"TO": {
			"name": "Tonga",
			"abbr": "TO",
			"zones": [
				"Pacific/Tongatapu"
			]
		},
		"TR": {
			"name": "Turkey",
			"abbr": "TR",
			"zones": [
				"Europe/Istanbul"
			]
		},
		"TT": {
			"name": "Trinidad & Tobago",
			"abbr": "TT",
			"zones": [
				"America/Puerto_Rico",
				"America/Port_of_Spain"
			]
		},
		"TV": {
			"name": "Tuvalu",
			"abbr": "TV",
			"zones": [
				"Pacific/Funafuti"
			]
		},
		"TW": {
			"name": "Taiwan",
			"abbr": "TW",
			"zones": [
				"Asia/Taipei"
			]
		},
		"TZ": {
			"name": "Tanzania",
			"abbr": "TZ",
			"zones": [
				"Africa/Nairobi",
				"Africa/Dar_es_Salaam"
			]
		},
		"UA": {
			"name": "Ukraine",
			"abbr": "UA",
			"zones": [
				"Europe/Simferopol",
				"Europe/Kiev",
				"Europe/Uzhgorod",
				"Europe/Zaporozhye"
			]
		},
		"UG": {
			"name": "Uganda",
			"abbr": "UG",
			"zones": [
				"Africa/Nairobi",
				"Africa/Kampala"
			]
		},
		"UM": {
			"name": "US minor outlying islands",
			"abbr": "UM",
			"zones": [
				"Pacific/Pago_Pago",
				"Pacific/Wake",
				"Pacific/Honolulu",
				"Pacific/Midway"
			]
		},
		"US": {
			"name": "United States",
			"abbr": "US",
			"zones": [
				"America/New_York",
				"America/Detroit",
				"America/Kentucky/Louisville",
				"America/Kentucky/Monticello",
				"America/Indiana/Indianapolis",
				"America/Indiana/Vincennes",
				"America/Indiana/Winamac",
				"America/Indiana/Marengo",
				"America/Indiana/Petersburg",
				"America/Indiana/Vevay",
				"America/Chicago",
				"America/Indiana/Tell_City",
				"America/Indiana/Knox",
				"America/Menominee",
				"America/North_Dakota/Center",
				"America/North_Dakota/New_Salem",
				"America/North_Dakota/Beulah",
				"America/Denver",
				"America/Boise",
				"America/Phoenix",
				"America/Los_Angeles",
				"America/Anchorage",
				"America/Juneau",
				"America/Sitka",
				"America/Metlakatla",
				"America/Yakutat",
				"America/Nome",
				"America/Adak",
				"Pacific/Honolulu"
			]
		},
		"UY": {
			"name": "Uruguay",
			"abbr": "UY",
			"zones": [
				"America/Montevideo"
			]
		},
		"UZ": {
			"name": "Uzbekistan",
			"abbr": "UZ",
			"zones": [
				"Asia/Samarkand",
				"Asia/Tashkent"
			]
		},
		"VA": {
			"name": "Vatican City",
			"abbr": "VA",
			"zones": [
				"Europe/Rome",
				"Europe/Vatican"
			]
		},
		"VC": {
			"name": "St Vincent",
			"abbr": "VC",
			"zones": [
				"America/Puerto_Rico",
				"America/St_Vincent"
			]
		},
		"VE": {
			"name": "Venezuela",
			"abbr": "VE",
			"zones": [
				"America/Caracas"
			]
		},
		"VG": {
			"name": "Virgin Islands (UK)",
			"abbr": "VG",
			"zones": [
				"America/Puerto_Rico",
				"America/Tortola"
			]
		},
		"VI": {
			"name": "Virgin Islands (US)",
			"abbr": "VI",
			"zones": [
				"America/Puerto_Rico",
				"America/St_Thomas"
			]
		},
		"VN": {
			"name": "Vietnam",
			"abbr": "VN",
			"zones": [
				"Asia/Bangkok",
				"Asia/Ho_Chi_Minh"
			]
		},
		"VU": {
			"name": "Vanuatu",
			"abbr": "VU",
			"zones": [
				"Pacific/Efate"
			]
		},
		"WF": {
			"name": "Wallis & Futuna",
			"abbr": "WF",
			"zones": [
				"Pacific/Wallis"
			]
		},
		"WS": {
			"name": "Samoa (western)",
			"abbr": "WS",
			"zones": [
				"Pacific/Apia"
			]
		},
		"YE": {
			"name": "Yemen",
			"abbr": "YE",
			"zones": [
				"Asia/Riyadh",
				"Asia/Aden"
			]
		},
		"YT": {
			"name": "Mayotte",
			"abbr": "YT",
			"zones": [
				"Africa/Nairobi",
				"Indian/Mayotte"
			]
		},
		"ZA": {
			"name": "South Africa",
			"abbr": "ZA",
			"zones": [
				"Africa/Johannesburg"
			]
		},
		"ZM": {
			"name": "Zambia",
			"abbr": "ZM",
			"zones": [
				"Africa/Maputo",
				"Africa/Lusaka"
			]
		},
		"ZW": {
			"name": "Zimbabwe",
			"abbr": "ZW",
			"zones": [
				"Africa/Maputo",
				"Africa/Harare"
			]
		}
	},
	"zones": {
		"Europe/Andorra": {
			"name": "Europe/Andorra",
			"lat": 42.5,
			"long": 1.5167,
			"countries": [
				"AD"
			],
			"comments": ""
		},
		"Asia/Dubai": {
			"name": "Asia/Dubai",
			"lat": 25.3,
			"long": 55.3,
			"countries": [
				"AE",
				"OM"
			],
			"comments": ""
		},
		"Asia/Kabul": {
			"name": "Asia/Kabul",
			"lat": 34.5167,
			"long": 69.2,
			"countries": [
				"AF"
			],
			"comments": ""
		},
		"Europe/Tirane": {
			"name": "Europe/Tirane",
			"lat": 41.3333,
			"long": 19.8333,
			"countries": [
				"AL"
			],
			"comments": ""
		},
		"Asia/Yerevan": {
			"name": "Asia/Yerevan",
			"lat": 40.1833,
			"long": 44.5,
			"countries": [
				"AM"
			],
			"comments": ""
		},
		"Antarctica/Casey": {
			"name": "Antarctica/Casey",
			"lat": -65.7167,
			"long": 110.5167,
			"countries": [
				"AQ"
			],
			"comments": "Casey"
		},
		"Antarctica/Davis": {
			"name": "Antarctica/Davis",
			"lat": -67.4167,
			"long": 77.9667,
			"countries": [
				"AQ"
			],
			"comments": "Davis"
		},
		"Antarctica/Mawson": {
			"name": "Antarctica/Mawson",
			"lat": -66.4,
			"long": 62.8833,
			"countries": [
				"AQ"
			],
			"comments": "Mawson"
		},
		"Antarctica/Palmer": {
			"name": "Antarctica/Palmer",
			"lat": -63.2,
			"long": -63.9,
			"countries": [
				"AQ"
			],
			"comments": "Palmer"
		},
		"Antarctica/Rothera": {
			"name": "Antarctica/Rothera",
			"lat": -66.4333,
			"long": -67.8667,
			"countries": [
				"AQ"
			],
			"comments": "Rothera"
		},
		"Antarctica/Troll": {
			"name": "Antarctica/Troll",
			"lat": -71.9886,
			"long": 2.535,
			"countries": [
				"AQ"
			],
			"comments": "Troll"
		},
		"Antarctica/Vostok": {
			"name": "Antarctica/Vostok",
			"lat": -77.6,
			"long": 106.9,
			"countries": [
				"AQ"
			],
			"comments": "Vostok"
		},
		"America/Argentina/Buenos_Aires": {
			"name": "America/Argentina/Buenos_Aires",
			"lat": -33.4,
			"long": -57.55,
			"countries": [
				"AR"
			],
			"comments": "Buenos Aires (BA, CF)"
		},
		"America/Argentina/Cordoba": {
			"name": "America/Argentina/Cordoba",
			"lat": -30.6,
			"long": -63.8167,
			"countries": [
				"AR"
			],
			"comments": "Argentina (most areas: CB, CC, CN, ER, FM, MN, SE, SF)"
		},
		"America/Argentina/Salta": {
			"name": "America/Argentina/Salta",
			"lat": -23.2167,
			"long": -64.5833,
			"countries": [
				"AR"
			],
			"comments": "Salta (SA, LP, NQ, RN)"
		},
		"America/Argentina/Jujuy": {
			"name": "America/Argentina/Jujuy",
			"lat": -23.8167,
			"long": -64.7,
			"countries": [
				"AR"
			],
			"comments": "Jujuy (JY)"
		},
		"America/Argentina/Tucuman": {
			"name": "America/Argentina/Tucuman",
			"lat": -25.1833,
			"long": -64.7833,
			"countries": [
				"AR"
			],
			"comments": "Tucumán (TM)"
		},
		"America/Argentina/Catamarca": {
			"name": "America/Argentina/Catamarca",
			"lat": -27.5333,
			"long": -64.2167,
			"countries": [
				"AR"
			],
			"comments": "Catamarca (CT); Chubut (CH)"
		},
		"America/Argentina/La_Rioja": {
			"name": "America/Argentina/La_Rioja",
			"lat": -28.5667,
			"long": -65.15,
			"countries": [
				"AR"
			],
			"comments": "La Rioja (LR)"
		},
		"America/Argentina/San_Juan": {
			"name": "America/Argentina/San_Juan",
			"lat": -30.4667,
			"long": -67.4833,
			"countries": [
				"AR"
			],
			"comments": "San Juan (SJ)"
		},
		"America/Argentina/Mendoza": {
			"name": "America/Argentina/Mendoza",
			"lat": -31.1167,
			"long": -67.1833,
			"countries": [
				"AR"
			],
			"comments": "Mendoza (MZ)"
		},
		"America/Argentina/San_Luis": {
			"name": "America/Argentina/San_Luis",
			"lat": -32.6833,
			"long": -65.65,
			"countries": [
				"AR"
			],
			"comments": "San Luis (SL)"
		},
		"America/Argentina/Rio_Gallegos": {
			"name": "America/Argentina/Rio_Gallegos",
			"lat": -50.3667,
			"long": -68.7833,
			"countries": [
				"AR"
			],
			"comments": "Santa Cruz (SC)"
		},
		"America/Argentina/Ushuaia": {
			"name": "America/Argentina/Ushuaia",
			"lat": -53.2,
			"long": -67.7,
			"countries": [
				"AR"
			],
			"comments": "Tierra del Fuego (TF)"
		},
		"Pacific/Pago_Pago": {
			"name": "Pacific/Pago_Pago",
			"lat": -13.7333,
			"long": -169.3,
			"countries": [
				"AS",
				"UM"
			],
			"comments": "Samoa, Midway"
		},
		"Europe/Vienna": {
			"name": "Europe/Vienna",
			"lat": 48.2167,
			"long": 16.3333,
			"countries": [
				"AT"
			],
			"comments": ""
		},
		"Australia/Lord_Howe": {
			"name": "Australia/Lord_Howe",
			"lat": -30.45,
			"long": 159.0833,
			"countries": [
				"AU"
			],
			"comments": "Lord Howe Island"
		},
		"Antarctica/Macquarie": {
			"name": "Antarctica/Macquarie",
			"lat": -53.5,
			"long": 158.95,
			"countries": [
				"AU"
			],
			"comments": "Macquarie Island"
		},
		"Australia/Hobart": {
			"name": "Australia/Hobart",
			"lat": -41.1167,
			"long": 147.3167,
			"countries": [
				"AU"
			],
			"comments": "Tasmania"
		},
		"Australia/Melbourne": {
			"name": "Australia/Melbourne",
			"lat": -36.1833,
			"long": 144.9667,
			"countries": [
				"AU"
			],
			"comments": "Victoria"
		},
		"Australia/Sydney": {
			"name": "Australia/Sydney",
			"lat": -32.1333,
			"long": 151.2167,
			"countries": [
				"AU"
			],
			"comments": "New South Wales (most areas)"
		},
		"Australia/Broken_Hill": {
			"name": "Australia/Broken_Hill",
			"lat": -30.05,
			"long": 141.45,
			"countries": [
				"AU"
			],
			"comments": "New South Wales (Yancowinna)"
		},
		"Australia/Brisbane": {
			"name": "Australia/Brisbane",
			"lat": -26.5333,
			"long": 153.0333,
			"countries": [
				"AU"
			],
			"comments": "Queensland (most areas)"
		},
		"Australia/Lindeman": {
			"name": "Australia/Lindeman",
			"lat": -19.7333,
			"long": 149,
			"countries": [
				"AU"
			],
			"comments": "Queensland (Whitsunday Islands)"
		},
		"Australia/Adelaide": {
			"name": "Australia/Adelaide",
			"lat": -33.0833,
			"long": 138.5833,
			"countries": [
				"AU"
			],
			"comments": "South Australia"
		},
		"Australia/Darwin": {
			"name": "Australia/Darwin",
			"lat": -11.5333,
			"long": 130.8333,
			"countries": [
				"AU"
			],
			"comments": "Northern Territory"
		},
		"Australia/Perth": {
			"name": "Australia/Perth",
			"lat": -30.05,
			"long": 115.85,
			"countries": [
				"AU"
			],
			"comments": "Western Australia (most areas)"
		},
		"Australia/Eucla": {
			"name": "Australia/Eucla",
			"lat": -30.2833,
			"long": 128.8667,
			"countries": [
				"AU"
			],
			"comments": "Western Australia (Eucla)"
		},
		"Asia/Baku": {
			"name": "Asia/Baku",
			"lat": 40.3833,
			"long": 49.85,
			"countries": [
				"AZ"
			],
			"comments": ""
		},
		"America/Barbados": {
			"name": "America/Barbados",
			"lat": 13.1,
			"long": -58.3833,
			"countries": [
				"BB"
			],
			"comments": ""
		},
		"Asia/Dhaka": {
			"name": "Asia/Dhaka",
			"lat": 23.7167,
			"long": 90.4167,
			"countries": [
				"BD"
			],
			"comments": ""
		},
		"Europe/Brussels": {
			"name": "Europe/Brussels",
			"lat": 50.8333,
			"long": 4.3333,
			"countries": [
				"BE"
			],
			"comments": ""
		},
		"Europe/Sofia": {
			"name": "Europe/Sofia",
			"lat": 42.6833,
			"long": 23.3167,
			"countries": [
				"BG"
			],
			"comments": ""
		},
		"Atlantic/Bermuda": {
			"name": "Atlantic/Bermuda",
			"lat": 32.2833,
			"long": -63.2333,
			"countries": [
				"BM"
			],
			"comments": ""
		},
		"Asia/Brunei": {
			"name": "Asia/Brunei",
			"lat": 4.9333,
			"long": 114.9167,
			"countries": [
				"BN"
			],
			"comments": ""
		},
		"America/La_Paz": {
			"name": "America/La_Paz",
			"lat": -15.5,
			"long": -67.85,
			"countries": [
				"BO"
			],
			"comments": ""
		},
		"America/Noronha": {
			"name": "America/Noronha",
			"lat": -2.15,
			"long": -31.5833,
			"countries": [
				"BR"
			],
			"comments": "Atlantic islands"
		},
		"America/Belem": {
			"name": "America/Belem",
			"lat": -0.55,
			"long": -47.5167,
			"countries": [
				"BR"
			],
			"comments": "Pará (east); Amapá"
		},
		"America/Fortaleza": {
			"name": "America/Fortaleza",
			"lat": -2.2833,
			"long": -37.5,
			"countries": [
				"BR"
			],
			"comments": "Brazil (northeast: MA, PI, CE, RN, PB)"
		},
		"America/Recife": {
			"name": "America/Recife",
			"lat": -7.95,
			"long": -33.1,
			"countries": [
				"BR"
			],
			"comments": "Pernambuco"
		},
		"America/Araguaina": {
			"name": "America/Araguaina",
			"lat": -6.8,
			"long": -47.8,
			"countries": [
				"BR"
			],
			"comments": "Tocantins"
		},
		"America/Maceio": {
			"name": "America/Maceio",
			"lat": -8.3333,
			"long": -34.2833,
			"countries": [
				"BR"
			],
			"comments": "Alagoas, Sergipe"
		},
		"America/Bahia": {
			"name": "America/Bahia",
			"lat": -11.0167,
			"long": -37.4833,
			"countries": [
				"BR"
			],
			"comments": "Bahia"
		},
		"America/Sao_Paulo": {
			"name": "America/Sao_Paulo",
			"lat": -22.4667,
			"long": -45.3833,
			"countries": [
				"BR"
			],
			"comments": "Brazil (southeast: GO, DF, MG, ES, RJ, SP, PR, SC, RS)"
		},
		"America/Campo_Grande": {
			"name": "America/Campo_Grande",
			"lat": -19.55,
			"long": -53.3833,
			"countries": [
				"BR"
			],
			"comments": "Mato Grosso do Sul"
		},
		"America/Cuiaba": {
			"name": "America/Cuiaba",
			"lat": -14.4167,
			"long": -55.9167,
			"countries": [
				"BR"
			],
			"comments": "Mato Grosso"
		},
		"America/Santarem": {
			"name": "America/Santarem",
			"lat": -1.5667,
			"long": -53.1333,
			"countries": [
				"BR"
			],
			"comments": "Pará (west)"
		},
		"America/Porto_Velho": {
			"name": "America/Porto_Velho",
			"lat": -7.2333,
			"long": -62.1,
			"countries": [
				"BR"
			],
			"comments": "Rondônia"
		},
		"America/Boa_Vista": {
			"name": "America/Boa_Vista",
			"lat": 2.8167,
			"long": -59.3333,
			"countries": [
				"BR"
			],
			"comments": "Roraima"
		},
		"America/Manaus": {
			"name": "America/Manaus",
			"lat": -2.8667,
			"long": -59.9833,
			"countries": [
				"BR"
			],
			"comments": "Amazonas (east)"
		},
		"America/Eirunepe": {
			"name": "America/Eirunepe",
			"lat": -5.3333,
			"long": -68.1333,
			"countries": [
				"BR"
			],
			"comments": "Amazonas (west)"
		},
		"America/Rio_Branco": {
			"name": "America/Rio_Branco",
			"lat": -8.0333,
			"long": -66.2,
			"countries": [
				"BR"
			],
			"comments": "Acre"
		},
		"Asia/Thimphu": {
			"name": "Asia/Thimphu",
			"lat": 27.4667,
			"long": 89.65,
			"countries": [
				"BT"
			],
			"comments": ""
		},
		"Europe/Minsk": {
			"name": "Europe/Minsk",
			"lat": 53.9,
			"long": 27.5667,
			"countries": [
				"BY"
			],
			"comments": ""
		},
		"America/Belize": {
			"name": "America/Belize",
			"lat": 17.5,
			"long": -87.8,
			"countries": [
				"BZ"
			],
			"comments": ""
		},
		"America/St_Johns": {
			"name": "America/St_Johns",
			"lat": 47.5667,
			"long": -51.2833,
			"countries": [
				"CA"
			],
			"comments": "Newfoundland; Labrador (southeast)"
		},
		"America/Halifax": {
			"name": "America/Halifax",
			"lat": 44.65,
			"long": -62.4,
			"countries": [
				"CA"
			],
			"comments": "Atlantic - NS (most areas); PE"
		},
		"America/Glace_Bay": {
			"name": "America/Glace_Bay",
			"lat": 46.2,
			"long": -58.05,
			"countries": [
				"CA"
			],
			"comments": "Atlantic - NS (Cape Breton)"
		},
		"America/Moncton": {
			"name": "America/Moncton",
			"lat": 46.1,
			"long": -63.2167,
			"countries": [
				"CA"
			],
			"comments": "Atlantic - New Brunswick"
		},
		"America/Goose_Bay": {
			"name": "America/Goose_Bay",
			"lat": 53.3333,
			"long": -59.5833,
			"countries": [
				"CA"
			],
			"comments": "Atlantic - Labrador (most areas)"
		},
		"America/Toronto": {
			"name": "America/Toronto",
			"lat": 43.65,
			"long": -78.6167,
			"countries": [
				"CA",
				"BS"
			],
			"comments": "Eastern - ON, QC (most areas), Bahamas"
		},
		"America/Nipigon": {
			"name": "America/Nipigon",
			"lat": 49.0167,
			"long": -87.7333,
			"countries": [
				"CA"
			],
			"comments": "Eastern - ON, QC (no DST 1967-73)"
		},
		"America/Thunder_Bay": {
			"name": "America/Thunder_Bay",
			"lat": 48.3833,
			"long": -88.75,
			"countries": [
				"CA"
			],
			"comments": "Eastern - ON (Thunder Bay)"
		},
		"America/Iqaluit": {
			"name": "America/Iqaluit",
			"lat": 63.7333,
			"long": -67.5333,
			"countries": [
				"CA"
			],
			"comments": "Eastern - NU (most east areas)"
		},
		"America/Pangnirtung": {
			"name": "America/Pangnirtung",
			"lat": 66.1333,
			"long": -64.2667,
			"countries": [
				"CA"
			],
			"comments": "Eastern - NU (Pangnirtung)"
		},
		"America/Winnipeg": {
			"name": "America/Winnipeg",
			"lat": 49.8833,
			"long": -96.85,
			"countries": [
				"CA"
			],
			"comments": "Central - ON (west); Manitoba"
		},
		"America/Rainy_River": {
			"name": "America/Rainy_River",
			"lat": 48.7167,
			"long": -93.4333,
			"countries": [
				"CA"
			],
			"comments": "Central - ON (Rainy R, Ft Frances)"
		},
		"America/Resolute": {
			"name": "America/Resolute",
			"lat": 74.6956,
			"long": -93.1708,
			"countries": [
				"CA"
			],
			"comments": "Central - NU (Resolute)"
		},
		"America/Rankin_Inlet": {
			"name": "America/Rankin_Inlet",
			"lat": 62.8167,
			"long": -91.9169,
			"countries": [
				"CA"
			],
			"comments": "Central - NU (central)"
		},
		"America/Regina": {
			"name": "America/Regina",
			"lat": 50.4,
			"long": -103.35,
			"countries": [
				"CA"
			],
			"comments": "CST - SK (most areas)"
		},
		"America/Swift_Current": {
			"name": "America/Swift_Current",
			"lat": 50.2833,
			"long": -106.1667,
			"countries": [
				"CA"
			],
			"comments": "CST - SK (midwest)"
		},
		"America/Edmonton": {
			"name": "America/Edmonton",
			"lat": 53.55,
			"long": -112.5333,
			"countries": [
				"CA"
			],
			"comments": "Mountain - AB; BC (E); SK (W)"
		},
		"America/Cambridge_Bay": {
			"name": "America/Cambridge_Bay",
			"lat": 69.1139,
			"long": -104.9472,
			"countries": [
				"CA"
			],
			"comments": "Mountain - NU (west)"
		},
		"America/Yellowknife": {
			"name": "America/Yellowknife",
			"lat": 62.45,
			"long": -113.65,
			"countries": [
				"CA"
			],
			"comments": "Mountain - NT (central)"
		},
		"America/Inuvik": {
			"name": "America/Inuvik",
			"lat": 68.3497,
			"long": -132.2833,
			"countries": [
				"CA"
			],
			"comments": "Mountain - NT (west)"
		},
		"America/Dawson_Creek": {
			"name": "America/Dawson_Creek",
			"lat": 59.7667,
			"long": -119.7667,
			"countries": [
				"CA"
			],
			"comments": "MST - BC (Dawson Cr, Ft St John)"
		},
		"America/Fort_Nelson": {
			"name": "America/Fort_Nelson",
			"lat": 58.8,
			"long": -121.3,
			"countries": [
				"CA"
			],
			"comments": "MST - BC (Ft Nelson)"
		},
		"America/Whitehorse": {
			"name": "America/Whitehorse",
			"lat": 60.7167,
			"long": -134.95,
			"countries": [
				"CA"
			],
			"comments": "MST - Yukon (east)"
		},
		"America/Dawson": {
			"name": "America/Dawson",
			"lat": 64.0667,
			"long": -138.5833,
			"countries": [
				"CA"
			],
			"comments": "MST - Yukon (west)"
		},
		"America/Vancouver": {
			"name": "America/Vancouver",
			"lat": 49.2667,
			"long": -122.8833,
			"countries": [
				"CA"
			],
			"comments": "Pacific - BC (most areas)"
		},
		"Indian/Cocos": {
			"name": "Indian/Cocos",
			"lat": -11.8333,
			"long": 96.9167,
			"countries": [
				"CC"
			],
			"comments": ""
		},
		"Europe/Zurich": {
			"name": "Europe/Zurich",
			"lat": 47.3833,
			"long": 8.5333,
			"countries": [
				"CH",
				"DE",
				"LI"
			],
			"comments": "Swiss time"
		},
		"Africa/Abidjan": {
			"name": "Africa/Abidjan",
			"lat": 5.3167,
			"long": -3.9667,
			"countries": [
				"CI",
				"BF",
				"GH",
				"GM",
				"GN",
				"ML",
				"MR",
				"SH",
				"SL",
				"SN",
				"TG"
			],
			"comments": ""
		},
		"Pacific/Rarotonga": {
			"name": "Pacific/Rarotonga",
			"lat": -20.7667,
			"long": -158.2333,
			"countries": [
				"CK"
			],
			"comments": ""
		},
		"America/Santiago": {
			"name": "America/Santiago",
			"lat": -32.55,
			"long": -69.3333,
			"countries": [
				"CL"
			],
			"comments": "Chile (most areas)"
		},
		"America/Punta_Arenas": {
			"name": "America/Punta_Arenas",
			"lat": -52.85,
			"long": -69.0833,
			"countries": [
				"CL"
			],
			"comments": "Region of Magallanes"
		},
		"Pacific/Easter": {
			"name": "Pacific/Easter",
			"lat": -26.85,
			"long": -108.5667,
			"countries": [
				"CL"
			],
			"comments": "Easter Island"
		},
		"Asia/Shanghai": {
			"name": "Asia/Shanghai",
			"lat": 31.2333,
			"long": 121.4667,
			"countries": [
				"CN"
			],
			"comments": "Beijing Time"
		},
		"Asia/Urumqi": {
			"name": "Asia/Urumqi",
			"lat": 43.8,
			"long": 87.5833,
			"countries": [
				"CN"
			],
			"comments": "Xinjiang Time"
		},
		"America/Bogota": {
			"name": "America/Bogota",
			"lat": 4.6,
			"long": -73.9167,
			"countries": [
				"CO"
			],
			"comments": ""
		},
		"America/Costa_Rica": {
			"name": "America/Costa_Rica",
			"lat": 9.9333,
			"long": -83.9167,
			"countries": [
				"CR"
			],
			"comments": ""
		},
		"America/Havana": {
			"name": "America/Havana",
			"lat": 23.1333,
			"long": -81.6333,
			"countries": [
				"CU"
			],
			"comments": ""
		},
		"Atlantic/Cape_Verde": {
			"name": "Atlantic/Cape_Verde",
			"lat": 14.9167,
			"long": -22.4833,
			"countries": [
				"CV"
			],
			"comments": ""
		},
		"Indian/Christmas": {
			"name": "Indian/Christmas",
			"lat": -9.5833,
			"long": 105.7167,
			"countries": [
				"CX"
			],
			"comments": ""
		},
		"Asia/Nicosia": {
			"name": "Asia/Nicosia",
			"lat": 35.1667,
			"long": 33.3667,
			"countries": [
				"CY"
			],
			"comments": "Cyprus (most areas)"
		},
		"Asia/Famagusta": {
			"name": "Asia/Famagusta",
			"lat": 35.1167,
			"long": 33.95,
			"countries": [
				"CY"
			],
			"comments": "Northern Cyprus"
		},
		"Europe/Prague": {
			"name": "Europe/Prague",
			"lat": 50.0833,
			"long": 14.4333,
			"countries": [
				"CZ",
				"SK"
			],
			"comments": ""
		},
		"Europe/Berlin": {
			"name": "Europe/Berlin",
			"lat": 52.5,
			"long": 13.3667,
			"countries": [
				"DE"
			],
			"comments": "Germany (most areas)"
		},
		"Europe/Copenhagen": {
			"name": "Europe/Copenhagen",
			"lat": 55.6667,
			"long": 12.5833,
			"countries": [
				"DK"
			],
			"comments": ""
		},
		"America/Santo_Domingo": {
			"name": "America/Santo_Domingo",
			"lat": 18.4667,
			"long": -68.1,
			"countries": [
				"DO"
			],
			"comments": ""
		},
		"Africa/Algiers": {
			"name": "Africa/Algiers",
			"lat": 36.7833,
			"long": 3.05,
			"countries": [
				"DZ"
			],
			"comments": ""
		},
		"America/Guayaquil": {
			"name": "America/Guayaquil",
			"lat": -1.8333,
			"long": -78.1667,
			"countries": [
				"EC"
			],
			"comments": "Ecuador (mainland)"
		},
		"Pacific/Galapagos": {
			"name": "Pacific/Galapagos",
			"lat": 0.9,
			"long": -88.4,
			"countries": [
				"EC"
			],
			"comments": "Galápagos Islands"
		},
		"Europe/Tallinn": {
			"name": "Europe/Tallinn",
			"lat": 59.4167,
			"long": 24.75,
			"countries": [
				"EE"
			],
			"comments": ""
		},
		"Africa/Cairo": {
			"name": "Africa/Cairo",
			"lat": 30.05,
			"long": 31.25,
			"countries": [
				"EG"
			],
			"comments": ""
		},
		"Africa/El_Aaiun": {
			"name": "Africa/El_Aaiun",
			"lat": 27.15,
			"long": -12.8,
			"countries": [
				"EH"
			],
			"comments": ""
		},
		"Europe/Madrid": {
			"name": "Europe/Madrid",
			"lat": 40.4,
			"long": -2.3167,
			"countries": [
				"ES"
			],
			"comments": "Spain (mainland)"
		},
		"Africa/Ceuta": {
			"name": "Africa/Ceuta",
			"lat": 35.8833,
			"long": -4.6833,
			"countries": [
				"ES"
			],
			"comments": "Ceuta, Melilla"
		},
		"Atlantic/Canary": {
			"name": "Atlantic/Canary",
			"lat": 28.1,
			"long": -14.6,
			"countries": [
				"ES"
			],
			"comments": "Canary Islands"
		},
		"Europe/Helsinki": {
			"name": "Europe/Helsinki",
			"lat": 60.1667,
			"long": 24.9667,
			"countries": [
				"FI",
				"AX"
			],
			"comments": ""
		},
		"Pacific/Fiji": {
			"name": "Pacific/Fiji",
			"lat": -17.8667,
			"long": 178.4167,
			"countries": [
				"FJ"
			],
			"comments": ""
		},
		"Atlantic/Stanley": {
			"name": "Atlantic/Stanley",
			"lat": -50.3,
			"long": -56.15,
			"countries": [
				"FK"
			],
			"comments": ""
		},
		"Pacific/Chuuk": {
			"name": "Pacific/Chuuk",
			"lat": 7.4167,
			"long": 151.7833,
			"countries": [
				"FM"
			],
			"comments": "Chuuk/Truk, Yap"
		},
		"Pacific/Pohnpei": {
			"name": "Pacific/Pohnpei",
			"lat": 6.9667,
			"long": 158.2167,
			"countries": [
				"FM"
			],
			"comments": "Pohnpei/Ponape"
		},
		"Pacific/Kosrae": {
			"name": "Pacific/Kosrae",
			"lat": 5.3167,
			"long": 162.9833,
			"countries": [
				"FM"
			],
			"comments": "Kosrae"
		},
		"Atlantic/Faroe": {
			"name": "Atlantic/Faroe",
			"lat": 62.0167,
			"long": -5.2333,
			"countries": [
				"FO"
			],
			"comments": ""
		},
		"Europe/Paris": {
			"name": "Europe/Paris",
			"lat": 48.8667,
			"long": 2.3333,
			"countries": [
				"FR"
			],
			"comments": ""
		},
		"Europe/London": {
			"name": "Europe/London",
			"lat": 51.5083,
			"long": 0.1253,
			"countries": [
				"GB",
				"GG",
				"IM",
				"JE"
			],
			"comments": ""
		},
		"Asia/Tbilisi": {
			"name": "Asia/Tbilisi",
			"lat": 41.7167,
			"long": 44.8167,
			"countries": [
				"GE"
			],
			"comments": ""
		},
		"America/Cayenne": {
			"name": "America/Cayenne",
			"lat": 4.9333,
			"long": -51.6667,
			"countries": [
				"GF"
			],
			"comments": ""
		},
		"Europe/Gibraltar": {
			"name": "Europe/Gibraltar",
			"lat": 36.1333,
			"long": -4.65,
			"countries": [
				"GI"
			],
			"comments": ""
		},
		"America/Nuuk": {
			"name": "America/Nuuk",
			"lat": 64.1833,
			"long": -50.2667,
			"countries": [
				"GL"
			],
			"comments": "Greenland (most areas)"
		},
		"America/Danmarkshavn": {
			"name": "America/Danmarkshavn",
			"lat": 76.7667,
			"long": -17.3333,
			"countries": [
				"GL"
			],
			"comments": "National Park (east coast)"
		},
		"America/Scoresbysund": {
			"name": "America/Scoresbysund",
			"lat": 70.4833,
			"long": -20.0333,
			"countries": [
				"GL"
			],
			"comments": "Scoresbysund/Ittoqqortoormiit"
		},
		"America/Thule": {
			"name": "America/Thule",
			"lat": 76.5667,
			"long": -67.2167,
			"countries": [
				"GL"
			],
			"comments": "Thule/Pituffik"
		},
		"Europe/Athens": {
			"name": "Europe/Athens",
			"lat": 37.9667,
			"long": 23.7167,
			"countries": [
				"GR"
			],
			"comments": ""
		},
		"Atlantic/South_Georgia": {
			"name": "Atlantic/South_Georgia",
			"lat": -53.7333,
			"long": -35.4667,
			"countries": [
				"GS"
			],
			"comments": ""
		},
		"America/Guatemala": {
			"name": "America/Guatemala",
			"lat": 14.6333,
			"long": -89.4833,
			"countries": [
				"GT"
			],
			"comments": ""
		},
		"Pacific/Guam": {
			"name": "Pacific/Guam",
			"lat": 13.4667,
			"long": 144.75,
			"countries": [
				"GU",
				"MP"
			],
			"comments": ""
		},
		"Africa/Bissau": {
			"name": "Africa/Bissau",
			"lat": 11.85,
			"long": -14.4167,
			"countries": [
				"GW"
			],
			"comments": ""
		},
		"America/Guyana": {
			"name": "America/Guyana",
			"lat": 6.8,
			"long": -57.8333,
			"countries": [
				"GY"
			],
			"comments": ""
		},
		"Asia/Hong_Kong": {
			"name": "Asia/Hong_Kong",
			"lat": 22.2833,
			"long": 114.15,
			"countries": [
				"HK"
			],
			"comments": ""
		},
		"America/Tegucigalpa": {
			"name": "America/Tegucigalpa",
			"lat": 14.1,
			"long": -86.7833,
			"countries": [
				"HN"
			],
			"comments": ""
		},
		"America/Port-au-Prince": {
			"name": "America/Port-au-Prince",
			"lat": 18.5333,
			"long": -71.6667,
			"countries": [
				"HT"
			],
			"comments": ""
		},
		"Europe/Budapest": {
			"name": "Europe/Budapest",
			"lat": 47.5,
			"long": 19.0833,
			"countries": [
				"HU"
			],
			"comments": ""
		},
		"Asia/Jakarta": {
			"name": "Asia/Jakarta",
			"lat": -5.8333,
			"long": 106.8,
			"countries": [
				"ID"
			],
			"comments": "Java, Sumatra"
		},
		"Asia/Pontianak": {
			"name": "Asia/Pontianak",
			"lat": 0.0333,
			"long": 109.3333,
			"countries": [
				"ID"
			],
			"comments": "Borneo (west, central)"
		},
		"Asia/Makassar": {
			"name": "Asia/Makassar",
			"lat": -4.8833,
			"long": 119.4,
			"countries": [
				"ID"
			],
			"comments": "Borneo (east, south); Sulawesi/Celebes, Bali, Nusa Tengarra; Timor (west)"
		},
		"Asia/Jayapura": {
			"name": "Asia/Jayapura",
			"lat": -1.4667,
			"long": 140.7,
			"countries": [
				"ID"
			],
			"comments": "New Guinea (West Papua / Irian Jaya); Malukus/Moluccas"
		},
		"Europe/Dublin": {
			"name": "Europe/Dublin",
			"lat": 53.3333,
			"long": -5.75,
			"countries": [
				"IE"
			],
			"comments": ""
		},
		"Asia/Jerusalem": {
			"name": "Asia/Jerusalem",
			"lat": 31.7806,
			"long": 35.2239,
			"countries": [
				"IL"
			],
			"comments": ""
		},
		"Asia/Kolkata": {
			"name": "Asia/Kolkata",
			"lat": 22.5333,
			"long": 88.3667,
			"countries": [
				"IN"
			],
			"comments": ""
		},
		"Indian/Chagos": {
			"name": "Indian/Chagos",
			"lat": -6.6667,
			"long": 72.4167,
			"countries": [
				"IO"
			],
			"comments": ""
		},
		"Asia/Baghdad": {
			"name": "Asia/Baghdad",
			"lat": 33.35,
			"long": 44.4167,
			"countries": [
				"IQ"
			],
			"comments": ""
		},
		"Asia/Tehran": {
			"name": "Asia/Tehran",
			"lat": 35.6667,
			"long": 51.4333,
			"countries": [
				"IR"
			],
			"comments": ""
		},
		"Atlantic/Reykjavik": {
			"name": "Atlantic/Reykjavik",
			"lat": 64.15,
			"long": -20.15,
			"countries": [
				"IS"
			],
			"comments": ""
		},
		"Europe/Rome": {
			"name": "Europe/Rome",
			"lat": 41.9,
			"long": 12.4833,
			"countries": [
				"IT",
				"SM",
				"VA"
			],
			"comments": ""
		},
		"America/Jamaica": {
			"name": "America/Jamaica",
			"lat": 17.9681,
			"long": -75.2067,
			"countries": [
				"JM"
			],
			"comments": ""
		},
		"Asia/Amman": {
			"name": "Asia/Amman",
			"lat": 31.95,
			"long": 35.9333,
			"countries": [
				"JO"
			],
			"comments": ""
		},
		"Asia/Tokyo": {
			"name": "Asia/Tokyo",
			"lat": 35.6544,
			"long": 139.7447,
			"countries": [
				"JP"
			],
			"comments": ""
		},
		"Africa/Nairobi": {
			"name": "Africa/Nairobi",
			"lat": -0.7167,
			"long": 36.8167,
			"countries": [
				"KE",
				"DJ",
				"ER",
				"ET",
				"KM",
				"MG",
				"SO",
				"TZ",
				"UG",
				"YT"
			],
			"comments": ""
		},
		"Asia/Bishkek": {
			"name": "Asia/Bishkek",
			"lat": 42.9,
			"long": 74.6,
			"countries": [
				"KG"
			],
			"comments": ""
		},
		"Pacific/Tarawa": {
			"name": "Pacific/Tarawa",
			"lat": 1.4167,
			"long": 173,
			"countries": [
				"KI"
			],
			"comments": "Gilbert Islands"
		},
		"Pacific/Kanton": {
			"name": "Pacific/Kanton",
			"lat": -1.2167,
			"long": -170.2833,
			"countries": [
				"KI"
			],
			"comments": "Phoenix Islands"
		},
		"Pacific/Kiritimati": {
			"name": "Pacific/Kiritimati",
			"lat": 1.8667,
			"long": -156.6667,
			"countries": [
				"KI"
			],
			"comments": "Line Islands"
		},
		"Asia/Pyongyang": {
			"name": "Asia/Pyongyang",
			"lat": 39.0167,
			"long": 125.75,
			"countries": [
				"KP"
			],
			"comments": ""
		},
		"Asia/Seoul": {
			"name": "Asia/Seoul",
			"lat": 37.55,
			"long": 126.9667,
			"countries": [
				"KR"
			],
			"comments": ""
		},
		"Asia/Almaty": {
			"name": "Asia/Almaty",
			"lat": 43.25,
			"long": 76.95,
			"countries": [
				"KZ"
			],
			"comments": "Kazakhstan (most areas)"
		},
		"Asia/Qyzylorda": {
			"name": "Asia/Qyzylorda",
			"lat": 44.8,
			"long": 65.4667,
			"countries": [
				"KZ"
			],
			"comments": "Qyzylorda/Kyzylorda/Kzyl-Orda"
		},
		"Asia/Qostanay": {
			"name": "Asia/Qostanay",
			"lat": 53.2,
			"long": 63.6167,
			"countries": [
				"KZ"
			],
			"comments": "Qostanay/Kostanay/Kustanay"
		},
		"Asia/Aqtobe": {
			"name": "Asia/Aqtobe",
			"lat": 50.2833,
			"long": 57.1667,
			"countries": [
				"KZ"
			],
			"comments": "Aqtöbe/Aktobe"
		},
		"Asia/Aqtau": {
			"name": "Asia/Aqtau",
			"lat": 44.5167,
			"long": 50.2667,
			"countries": [
				"KZ"
			],
			"comments": "Mangghystaū/Mankistau"
		},
		"Asia/Atyrau": {
			"name": "Asia/Atyrau",
			"lat": 47.1167,
			"long": 51.9333,
			"countries": [
				"KZ"
			],
			"comments": "Atyraū/Atirau/Gur'yev"
		},
		"Asia/Oral": {
			"name": "Asia/Oral",
			"lat": 51.2167,
			"long": 51.35,
			"countries": [
				"KZ"
			],
			"comments": "West Kazakhstan"
		},
		"Asia/Beirut": {
			"name": "Asia/Beirut",
			"lat": 33.8833,
			"long": 35.5,
			"countries": [
				"LB"
			],
			"comments": ""
		},
		"Asia/Colombo": {
			"name": "Asia/Colombo",
			"lat": 6.9333,
			"long": 79.85,
			"countries": [
				"LK"
			],
			"comments": ""
		},
		"Africa/Monrovia": {
			"name": "Africa/Monrovia",
			"lat": 6.3,
			"long": -9.2167,
			"countries": [
				"LR"
			],
			"comments": ""
		},
		"Europe/Vilnius": {
			"name": "Europe/Vilnius",
			"lat": 54.6833,
			"long": 25.3167,
			"countries": [
				"LT"
			],
			"comments": ""
		},
		"Europe/Luxembourg": {
			"name": "Europe/Luxembourg",
			"lat": 49.6,
			"long": 6.15,
			"countries": [
				"LU"
			],
			"comments": ""
		},
		"Europe/Riga": {
			"name": "Europe/Riga",
			"lat": 56.95,
			"long": 24.1,
			"countries": [
				"LV"
			],
			"comments": ""
		},
		"Africa/Tripoli": {
			"name": "Africa/Tripoli",
			"lat": 32.9,
			"long": 13.1833,
			"countries": [
				"LY"
			],
			"comments": ""
		},
		"Africa/Casablanca": {
			"name": "Africa/Casablanca",
			"lat": 33.65,
			"long": -6.4167,
			"countries": [
				"MA"
			],
			"comments": ""
		},
		"Europe/Monaco": {
			"name": "Europe/Monaco",
			"lat": 43.7,
			"long": 7.3833,
			"countries": [
				"MC"
			],
			"comments": ""
		},
		"Europe/Chisinau": {
			"name": "Europe/Chisinau",
			"lat": 47,
			"long": 28.8333,
			"countries": [
				"MD"
			],
			"comments": ""
		},
		"Pacific/Majuro": {
			"name": "Pacific/Majuro",
			"lat": 7.15,
			"long": 171.2,
			"countries": [
				"MH"
			],
			"comments": "Marshall Islands (most areas)"
		},
		"Pacific/Kwajalein": {
			"name": "Pacific/Kwajalein",
			"lat": 9.0833,
			"long": 167.3333,
			"countries": [
				"MH"
			],
			"comments": "Kwajalein"
		},
		"Asia/Yangon": {
			"name": "Asia/Yangon",
			"lat": 16.7833,
			"long": 96.1667,
			"countries": [
				"MM"
			],
			"comments": ""
		},
		"Asia/Ulaanbaatar": {
			"name": "Asia/Ulaanbaatar",
			"lat": 47.9167,
			"long": 106.8833,
			"countries": [
				"MN"
			],
			"comments": "Mongolia (most areas)"
		},
		"Asia/Hovd": {
			"name": "Asia/Hovd",
			"lat": 48.0167,
			"long": 91.65,
			"countries": [
				"MN"
			],
			"comments": "Bayan-Ölgii, Govi-Altai, Hovd, Uvs, Zavkhan"
		},
		"Asia/Choibalsan": {
			"name": "Asia/Choibalsan",
			"lat": 48.0667,
			"long": 114.5,
			"countries": [
				"MN"
			],
			"comments": "Dornod, Sükhbaatar"
		},
		"Asia/Macau": {
			"name": "Asia/Macau",
			"lat": 22.1972,
			"long": 113.5417,
			"countries": [
				"MO"
			],
			"comments": ""
		},
		"America/Martinique": {
			"name": "America/Martinique",
			"lat": 14.6,
			"long": -60.9167,
			"countries": [
				"MQ"
			],
			"comments": ""
		},
		"Europe/Malta": {
			"name": "Europe/Malta",
			"lat": 35.9,
			"long": 14.5167,
			"countries": [
				"MT"
			],
			"comments": ""
		},
		"Indian/Mauritius": {
			"name": "Indian/Mauritius",
			"lat": -19.8333,
			"long": 57.5,
			"countries": [
				"MU"
			],
			"comments": ""
		},
		"Indian/Maldives": {
			"name": "Indian/Maldives",
			"lat": 4.1667,
			"long": 73.5,
			"countries": [
				"MV"
			],
			"comments": ""
		},
		"America/Mexico_City": {
			"name": "America/Mexico_City",
			"lat": 19.4,
			"long": -98.85,
			"countries": [
				"MX"
			],
			"comments": "Central Time"
		},
		"America/Cancun": {
			"name": "America/Cancun",
			"lat": 21.0833,
			"long": -85.2333,
			"countries": [
				"MX"
			],
			"comments": "Eastern Standard Time - Quintana Roo"
		},
		"America/Merida": {
			"name": "America/Merida",
			"lat": 20.9667,
			"long": -88.3833,
			"countries": [
				"MX"
			],
			"comments": "Central Time - Campeche, Yucatán"
		},
		"America/Monterrey": {
			"name": "America/Monterrey",
			"lat": 25.6667,
			"long": -99.6833,
			"countries": [
				"MX"
			],
			"comments": "Central Time - Durango; Coahuila, Nuevo León, Tamaulipas (most areas)"
		},
		"America/Matamoros": {
			"name": "America/Matamoros",
			"lat": 25.8333,
			"long": -96.5,
			"countries": [
				"MX"
			],
			"comments": "Central Time US - Coahuila, Nuevo León, Tamaulipas (US border)"
		},
		"America/Mazatlan": {
			"name": "America/Mazatlan",
			"lat": 23.2167,
			"long": -105.5833,
			"countries": [
				"MX"
			],
			"comments": "Mountain Time - Baja California Sur, Nayarit, Sinaloa"
		},
		"America/Chihuahua": {
			"name": "America/Chihuahua",
			"lat": 28.6333,
			"long": -105.9167,
			"countries": [
				"MX"
			],
			"comments": "Mountain Time - Chihuahua (most areas)"
		},
		"America/Ojinaga": {
			"name": "America/Ojinaga",
			"lat": 29.5667,
			"long": -103.5833,
			"countries": [
				"MX"
			],
			"comments": "Mountain Time US - Chihuahua (US border)"
		},
		"America/Hermosillo": {
			"name": "America/Hermosillo",
			"lat": 29.0667,
			"long": -109.0333,
			"countries": [
				"MX"
			],
			"comments": "Mountain Standard Time - Sonora"
		},
		"America/Tijuana": {
			"name": "America/Tijuana",
			"lat": 32.5333,
			"long": -116.9833,
			"countries": [
				"MX"
			],
			"comments": "Pacific Time US - Baja California"
		},
		"America/Bahia_Banderas": {
			"name": "America/Bahia_Banderas",
			"lat": 20.8,
			"long": -104.75,
			"countries": [
				"MX"
			],
			"comments": "Central Time - Bahía de Banderas"
		},
		"Asia/Kuala_Lumpur": {
			"name": "Asia/Kuala_Lumpur",
			"lat": 3.1667,
			"long": 101.7,
			"countries": [
				"MY"
			],
			"comments": "Malaysia (peninsula)"
		},
		"Asia/Kuching": {
			"name": "Asia/Kuching",
			"lat": 1.55,
			"long": 110.3333,
			"countries": [
				"MY"
			],
			"comments": "Sabah, Sarawak"
		},
		"Africa/Maputo": {
			"name": "Africa/Maputo",
			"lat": -24.0333,
			"long": 32.5833,
			"countries": [
				"MZ",
				"BI",
				"BW",
				"CD",
				"MW",
				"RW",
				"ZM",
				"ZW"
			],
			"comments": "Central Africa Time"
		},
		"Africa/Windhoek": {
			"name": "Africa/Windhoek",
			"lat": -21.4333,
			"long": 17.1,
			"countries": [
				"NA"
			],
			"comments": ""
		},
		"Pacific/Noumea": {
			"name": "Pacific/Noumea",
			"lat": -21.7333,
			"long": 166.45,
			"countries": [
				"NC"
			],
			"comments": ""
		},
		"Pacific/Norfolk": {
			"name": "Pacific/Norfolk",
			"lat": -28.95,
			"long": 167.9667,
			"countries": [
				"NF"
			],
			"comments": ""
		},
		"Africa/Lagos": {
			"name": "Africa/Lagos",
			"lat": 6.45,
			"long": 3.4,
			"countries": [
				"NG",
				"AO",
				"BJ",
				"CD",
				"CF",
				"CG",
				"CM",
				"GA",
				"GQ",
				"NE"
			],
			"comments": "West Africa Time"
		},
		"America/Managua": {
			"name": "America/Managua",
			"lat": 12.15,
			"long": -85.7167,
			"countries": [
				"NI"
			],
			"comments": ""
		},
		"Europe/Amsterdam": {
			"name": "Europe/Amsterdam",
			"lat": 52.3667,
			"long": 4.9,
			"countries": [
				"NL"
			],
			"comments": ""
		},
		"Europe/Oslo": {
			"name": "Europe/Oslo",
			"lat": 59.9167,
			"long": 10.75,
			"countries": [
				"NO",
				"SJ"
			],
			"comments": ""
		},
		"Asia/Kathmandu": {
			"name": "Asia/Kathmandu",
			"lat": 27.7167,
			"long": 85.3167,
			"countries": [
				"NP"
			],
			"comments": ""
		},
		"Pacific/Nauru": {
			"name": "Pacific/Nauru",
			"lat": 0.5167,
			"long": 166.9167,
			"countries": [
				"NR"
			],
			"comments": ""
		},
		"Pacific/Niue": {
			"name": "Pacific/Niue",
			"lat": -18.9833,
			"long": -168.0833,
			"countries": [
				"NU"
			],
			"comments": ""
		},
		"Pacific/Auckland": {
			"name": "Pacific/Auckland",
			"lat": -35.1333,
			"long": 174.7667,
			"countries": [
				"NZ",
				"AQ"
			],
			"comments": "New Zealand time"
		},
		"Pacific/Chatham": {
			"name": "Pacific/Chatham",
			"lat": -42.05,
			"long": -175.45,
			"countries": [
				"NZ"
			],
			"comments": "Chatham Islands"
		},
		"America/Panama": {
			"name": "America/Panama",
			"lat": 8.9667,
			"long": -78.4667,
			"countries": [
				"PA",
				"CA",
				"KY"
			],
			"comments": "EST - Panama, Cayman, ON (Atikokan), NU (Coral H)"
		},
		"America/Lima": {
			"name": "America/Lima",
			"lat": -11.95,
			"long": -76.95,
			"countries": [
				"PE"
			],
			"comments": ""
		},
		"Pacific/Tahiti": {
			"name": "Pacific/Tahiti",
			"lat": -16.4667,
			"long": -148.4333,
			"countries": [
				"PF"
			],
			"comments": "Society Islands"
		},
		"Pacific/Marquesas": {
			"name": "Pacific/Marquesas",
			"lat": -9,
			"long": -138.5,
			"countries": [
				"PF"
			],
			"comments": "Marquesas Islands"
		},
		"Pacific/Gambier": {
			"name": "Pacific/Gambier",
			"lat": -22.8667,
			"long": -133.05,
			"countries": [
				"PF"
			],
			"comments": "Gambier Islands"
		},
		"Pacific/Port_Moresby": {
			"name": "Pacific/Port_Moresby",
			"lat": -8.5,
			"long": 147.1667,
			"countries": [
				"PG",
				"AQ"
			],
			"comments": "Papua New Guinea (most areas), Dumont d'Urville"
		},
		"Pacific/Bougainville": {
			"name": "Pacific/Bougainville",
			"lat": -5.7833,
			"long": 155.5667,
			"countries": [
				"PG"
			],
			"comments": "Bougainville"
		},
		"Asia/Manila": {
			"name": "Asia/Manila",
			"lat": 14.5833,
			"long": 121,
			"countries": [
				"PH"
			],
			"comments": ""
		},
		"Asia/Karachi": {
			"name": "Asia/Karachi",
			"lat": 24.8667,
			"long": 67.05,
			"countries": [
				"PK"
			],
			"comments": ""
		},
		"Europe/Warsaw": {
			"name": "Europe/Warsaw",
			"lat": 52.25,
			"long": 21,
			"countries": [
				"PL"
			],
			"comments": ""
		},
		"America/Miquelon": {
			"name": "America/Miquelon",
			"lat": 47.05,
			"long": -55.6667,
			"countries": [
				"PM"
			],
			"comments": ""
		},
		"Pacific/Pitcairn": {
			"name": "Pacific/Pitcairn",
			"lat": -24.9333,
			"long": -129.9167,
			"countries": [
				"PN"
			],
			"comments": ""
		},
		"America/Puerto_Rico": {
			"name": "America/Puerto_Rico",
			"lat": 18.4683,
			"long": -65.8939,
			"countries": [
				"PR",
				"AG",
				"CA",
				"AI",
				"AW",
				"BL",
				"BQ",
				"CW",
				"DM",
				"GD",
				"GP",
				"KN",
				"LC",
				"MF",
				"MS",
				"SX",
				"TT",
				"VC",
				"VG",
				"VI"
			],
			"comments": "AST"
		},
		"Asia/Gaza": {
			"name": "Asia/Gaza",
			"lat": 31.5,
			"long": 34.4667,
			"countries": [
				"PS"
			],
			"comments": "Gaza Strip"
		},
		"Asia/Hebron": {
			"name": "Asia/Hebron",
			"lat": 31.5333,
			"long": 35.095,
			"countries": [
				"PS"
			],
			"comments": "West Bank"
		},
		"Europe/Lisbon": {
			"name": "Europe/Lisbon",
			"lat": 38.7167,
			"long": -8.8667,
			"countries": [
				"PT"
			],
			"comments": "Portugal (mainland)"
		},
		"Atlantic/Madeira": {
			"name": "Atlantic/Madeira",
			"lat": 32.6333,
			"long": -15.1,
			"countries": [
				"PT"
			],
			"comments": "Madeira Islands"
		},
		"Atlantic/Azores": {
			"name": "Atlantic/Azores",
			"lat": 37.7333,
			"long": -24.3333,
			"countries": [
				"PT"
			],
			"comments": "Azores"
		},
		"Pacific/Palau": {
			"name": "Pacific/Palau",
			"lat": 7.3333,
			"long": 134.4833,
			"countries": [
				"PW"
			],
			"comments": ""
		},
		"America/Asuncion": {
			"name": "America/Asuncion",
			"lat": -24.7333,
			"long": -56.3333,
			"countries": [
				"PY"
			],
			"comments": ""
		},
		"Asia/Qatar": {
			"name": "Asia/Qatar",
			"lat": 25.2833,
			"long": 51.5333,
			"countries": [
				"QA",
				"BH"
			],
			"comments": ""
		},
		"Indian/Reunion": {
			"name": "Indian/Reunion",
			"lat": -19.1333,
			"long": 55.4667,
			"countries": [
				"RE",
				"TF"
			],
			"comments": "Réunion, Crozet, Scattered Islands"
		},
		"Europe/Bucharest": {
			"name": "Europe/Bucharest",
			"lat": 44.4333,
			"long": 26.1,
			"countries": [
				"RO"
			],
			"comments": ""
		},
		"Europe/Belgrade": {
			"name": "Europe/Belgrade",
			"lat": 44.8333,
			"long": 20.5,
			"countries": [
				"RS",
				"BA",
				"HR",
				"ME",
				"MK",
				"SI"
			],
			"comments": ""
		},
		"Europe/Kaliningrad": {
			"name": "Europe/Kaliningrad",
			"lat": 54.7167,
			"long": 20.5,
			"countries": [
				"RU"
			],
			"comments": "MSK-01 - Kaliningrad"
		},
		"Europe/Moscow": {
			"name": "Europe/Moscow",
			"lat": 55.7558,
			"long": 37.6178,
			"countries": [
				"RU"
			],
			"comments": "MSK+00 - Moscow area"
		},
		"Europe/Simferopol": {
			"name": "Europe/Simferopol",
			"lat": 44.95,
			"long": 34.1,
			"countries": [
				"RU",
				"UA"
			],
			"comments": "Crimea"
		},
		"Europe/Kirov": {
			"name": "Europe/Kirov",
			"lat": 58.6,
			"long": 49.65,
			"countries": [
				"RU"
			],
			"comments": "MSK+00 - Kirov"
		},
		"Europe/Volgograd": {
			"name": "Europe/Volgograd",
			"lat": 48.7333,
			"long": 44.4167,
			"countries": [
				"RU"
			],
			"comments": "MSK+00 - Volgograd"
		},
		"Europe/Astrakhan": {
			"name": "Europe/Astrakhan",
			"lat": 46.35,
			"long": 48.05,
			"countries": [
				"RU"
			],
			"comments": "MSK+01 - Astrakhan"
		},
		"Europe/Saratov": {
			"name": "Europe/Saratov",
			"lat": 51.5667,
			"long": 46.0333,
			"countries": [
				"RU"
			],
			"comments": "MSK+01 - Saratov"
		},
		"Europe/Ulyanovsk": {
			"name": "Europe/Ulyanovsk",
			"lat": 54.3333,
			"long": 48.4,
			"countries": [
				"RU"
			],
			"comments": "MSK+01 - Ulyanovsk"
		},
		"Europe/Samara": {
			"name": "Europe/Samara",
			"lat": 53.2,
			"long": 50.15,
			"countries": [
				"RU"
			],
			"comments": "MSK+01 - Samara, Udmurtia"
		},
		"Asia/Yekaterinburg": {
			"name": "Asia/Yekaterinburg",
			"lat": 56.85,
			"long": 60.6,
			"countries": [
				"RU"
			],
			"comments": "MSK+02 - Urals"
		},
		"Asia/Omsk": {
			"name": "Asia/Omsk",
			"lat": 55,
			"long": 73.4,
			"countries": [
				"RU"
			],
			"comments": "MSK+03 - Omsk"
		},
		"Asia/Novosibirsk": {
			"name": "Asia/Novosibirsk",
			"lat": 55.0333,
			"long": 82.9167,
			"countries": [
				"RU"
			],
			"comments": "MSK+04 - Novosibirsk"
		},
		"Asia/Barnaul": {
			"name": "Asia/Barnaul",
			"lat": 53.3667,
			"long": 83.75,
			"countries": [
				"RU"
			],
			"comments": "MSK+04 - Altai"
		},
		"Asia/Tomsk": {
			"name": "Asia/Tomsk",
			"lat": 56.5,
			"long": 84.9667,
			"countries": [
				"RU"
			],
			"comments": "MSK+04 - Tomsk"
		},
		"Asia/Novokuznetsk": {
			"name": "Asia/Novokuznetsk",
			"lat": 53.75,
			"long": 87.1167,
			"countries": [
				"RU"
			],
			"comments": "MSK+04 - Kemerovo"
		},
		"Asia/Krasnoyarsk": {
			"name": "Asia/Krasnoyarsk",
			"lat": 56.0167,
			"long": 92.8333,
			"countries": [
				"RU"
			],
			"comments": "MSK+04 - Krasnoyarsk area"
		},
		"Asia/Irkutsk": {
			"name": "Asia/Irkutsk",
			"lat": 52.2667,
			"long": 104.3333,
			"countries": [
				"RU"
			],
			"comments": "MSK+05 - Irkutsk, Buryatia"
		},
		"Asia/Chita": {
			"name": "Asia/Chita",
			"lat": 52.05,
			"long": 113.4667,
			"countries": [
				"RU"
			],
			"comments": "MSK+06 - Zabaykalsky"
		},
		"Asia/Yakutsk": {
			"name": "Asia/Yakutsk",
			"lat": 62,
			"long": 129.6667,
			"countries": [
				"RU"
			],
			"comments": "MSK+06 - Lena River"
		},
		"Asia/Khandyga": {
			"name": "Asia/Khandyga",
			"lat": 62.6564,
			"long": 135.5539,
			"countries": [
				"RU"
			],
			"comments": "MSK+06 - Tomponsky, Ust-Maysky"
		},
		"Asia/Vladivostok": {
			"name": "Asia/Vladivostok",
			"lat": 43.1667,
			"long": 131.9333,
			"countries": [
				"RU"
			],
			"comments": "MSK+07 - Amur River"
		},
		"Asia/Ust-Nera": {
			"name": "Asia/Ust-Nera",
			"lat": 64.5603,
			"long": 143.2267,
			"countries": [
				"RU"
			],
			"comments": "MSK+07 - Oymyakonsky"
		},
		"Asia/Magadan": {
			"name": "Asia/Magadan",
			"lat": 59.5667,
			"long": 150.8,
			"countries": [
				"RU"
			],
			"comments": "MSK+08 - Magadan"
		},
		"Asia/Sakhalin": {
			"name": "Asia/Sakhalin",
			"lat": 46.9667,
			"long": 142.7,
			"countries": [
				"RU"
			],
			"comments": "MSK+08 - Sakhalin Island"
		},
		"Asia/Srednekolymsk": {
			"name": "Asia/Srednekolymsk",
			"lat": 67.4667,
			"long": 153.7167,
			"countries": [
				"RU"
			],
			"comments": "MSK+08 - Sakha (E); North Kuril Is"
		},
		"Asia/Kamchatka": {
			"name": "Asia/Kamchatka",
			"lat": 53.0167,
			"long": 158.65,
			"countries": [
				"RU"
			],
			"comments": "MSK+09 - Kamchatka"
		},
		"Asia/Anadyr": {
			"name": "Asia/Anadyr",
			"lat": 64.75,
			"long": 177.4833,
			"countries": [
				"RU"
			],
			"comments": "MSK+09 - Bering Sea"
		},
		"Asia/Riyadh": {
			"name": "Asia/Riyadh",
			"lat": 24.6333,
			"long": 46.7167,
			"countries": [
				"SA",
				"AQ",
				"KW",
				"YE"
			],
			"comments": "Arabia, Syowa"
		},
		"Pacific/Guadalcanal": {
			"name": "Pacific/Guadalcanal",
			"lat": -8.4667,
			"long": 160.2,
			"countries": [
				"SB"
			],
			"comments": ""
		},
		"Indian/Mahe": {
			"name": "Indian/Mahe",
			"lat": -3.3333,
			"long": 55.4667,
			"countries": [
				"SC"
			],
			"comments": ""
		},
		"Africa/Khartoum": {
			"name": "Africa/Khartoum",
			"lat": 15.6,
			"long": 32.5333,
			"countries": [
				"SD"
			],
			"comments": ""
		},
		"Europe/Stockholm": {
			"name": "Europe/Stockholm",
			"lat": 59.3333,
			"long": 18.05,
			"countries": [
				"SE"
			],
			"comments": ""
		},
		"Asia/Singapore": {
			"name": "Asia/Singapore",
			"lat": 1.2833,
			"long": 103.85,
			"countries": [
				"SG",
				"MY"
			],
			"comments": "Singapore, peninsular Malaysia"
		},
		"America/Paramaribo": {
			"name": "America/Paramaribo",
			"lat": 5.8333,
			"long": -54.8333,
			"countries": [
				"SR"
			],
			"comments": ""
		},
		"Africa/Juba": {
			"name": "Africa/Juba",
			"lat": 4.85,
			"long": 31.6167,
			"countries": [
				"SS"
			],
			"comments": ""
		},
		"Africa/Sao_Tome": {
			"name": "Africa/Sao_Tome",
			"lat": 0.3333,
			"long": 6.7333,
			"countries": [
				"ST"
			],
			"comments": ""
		},
		"America/El_Salvador": {
			"name": "America/El_Salvador",
			"lat": 13.7,
			"long": -88.8,
			"countries": [
				"SV"
			],
			"comments": ""
		},
		"Asia/Damascus": {
			"name": "Asia/Damascus",
			"lat": 33.5,
			"long": 36.3,
			"countries": [
				"SY"
			],
			"comments": ""
		},
		"America/Grand_Turk": {
			"name": "America/Grand_Turk",
			"lat": 21.4667,
			"long": -70.8667,
			"countries": [
				"TC"
			],
			"comments": ""
		},
		"Africa/Ndjamena": {
			"name": "Africa/Ndjamena",
			"lat": 12.1167,
			"long": 15.05,
			"countries": [
				"TD"
			],
			"comments": ""
		},
		"Indian/Kerguelen": {
			"name": "Indian/Kerguelen",
			"lat": -48.6472,
			"long": 70.2175,
			"countries": [
				"TF"
			],
			"comments": "Kerguelen, St Paul Island, Amsterdam Island"
		},
		"Asia/Bangkok": {
			"name": "Asia/Bangkok",
			"lat": 13.75,
			"long": 100.5167,
			"countries": [
				"TH",
				"KH",
				"LA",
				"VN"
			],
			"comments": "Indochina (most areas)"
		},
		"Asia/Dushanbe": {
			"name": "Asia/Dushanbe",
			"lat": 38.5833,
			"long": 68.8,
			"countries": [
				"TJ"
			],
			"comments": ""
		},
		"Pacific/Fakaofo": {
			"name": "Pacific/Fakaofo",
			"lat": -8.6333,
			"long": -170.7667,
			"countries": [
				"TK"
			],
			"comments": ""
		},
		"Asia/Dili": {
			"name": "Asia/Dili",
			"lat": -7.45,
			"long": 125.5833,
			"countries": [
				"TL"
			],
			"comments": ""
		},
		"Asia/Ashgabat": {
			"name": "Asia/Ashgabat",
			"lat": 37.95,
			"long": 58.3833,
			"countries": [
				"TM"
			],
			"comments": ""
		},
		"Africa/Tunis": {
			"name": "Africa/Tunis",
			"lat": 36.8,
			"long": 10.1833,
			"countries": [
				"TN"
			],
			"comments": ""
		},
		"Pacific/Tongatapu": {
			"name": "Pacific/Tongatapu",
			"lat": -20.8667,
			"long": -174.8,
			"countries": [
				"TO"
			],
			"comments": ""
		},
		"Europe/Istanbul": {
			"name": "Europe/Istanbul",
			"lat": 41.0167,
			"long": 28.9667,
			"countries": [
				"TR"
			],
			"comments": ""
		},
		"Pacific/Funafuti": {
			"name": "Pacific/Funafuti",
			"lat": -7.4833,
			"long": 179.2167,
			"countries": [
				"TV"
			],
			"comments": ""
		},
		"Asia/Taipei": {
			"name": "Asia/Taipei",
			"lat": 25.05,
			"long": 121.5,
			"countries": [
				"TW"
			],
			"comments": ""
		},
		"Europe/Kiev": {
			"name": "Europe/Kiev",
			"lat": 50.4333,
			"long": 30.5167,
			"countries": [
				"UA"
			],
			"comments": "Ukraine (most areas)"
		},
		"Europe/Uzhgorod": {
			"name": "Europe/Uzhgorod",
			"lat": 48.6167,
			"long": 22.3,
			"countries": [
				"UA"
			],
			"comments": "Transcarpathia"
		},
		"Europe/Zaporozhye": {
			"name": "Europe/Zaporozhye",
			"lat": 47.8333,
			"long": 35.1667,
			"countries": [
				"UA"
			],
			"comments": "Zaporozhye and east Lugansk"
		},
		"Pacific/Wake": {
			"name": "Pacific/Wake",
			"lat": 19.2833,
			"long": 166.6167,
			"countries": [
				"UM"
			],
			"comments": "Wake Island"
		},
		"America/New_York": {
			"name": "America/New_York",
			"lat": 40.7142,
			"long": -73.9936,
			"countries": [
				"US"
			],
			"comments": "Eastern (most areas)"
		},
		"America/Detroit": {
			"name": "America/Detroit",
			"lat": 42.3314,
			"long": -82.9542,
			"countries": [
				"US"
			],
			"comments": "Eastern - MI (most areas)"
		},
		"America/Kentucky/Louisville": {
			"name": "America/Kentucky/Louisville",
			"lat": 38.2542,
			"long": -84.2406,
			"countries": [
				"US"
			],
			"comments": "Eastern - KY (Louisville area)"
		},
		"America/Kentucky/Monticello": {
			"name": "America/Kentucky/Monticello",
			"lat": 36.8297,
			"long": -83.1508,
			"countries": [
				"US"
			],
			"comments": "Eastern - KY (Wayne)"
		},
		"America/Indiana/Indianapolis": {
			"name": "America/Indiana/Indianapolis",
			"lat": 39.7683,
			"long": -85.8419,
			"countries": [
				"US"
			],
			"comments": "Eastern - IN (most areas)"
		},
		"America/Indiana/Vincennes": {
			"name": "America/Indiana/Vincennes",
			"lat": 38.6772,
			"long": -86.4714,
			"countries": [
				"US"
			],
			"comments": "Eastern - IN (Da, Du, K, Mn)"
		},
		"America/Indiana/Winamac": {
			"name": "America/Indiana/Winamac",
			"lat": 41.0514,
			"long": -85.3969,
			"countries": [
				"US"
			],
			"comments": "Eastern - IN (Pulaski)"
		},
		"America/Indiana/Marengo": {
			"name": "America/Indiana/Marengo",
			"lat": 38.3756,
			"long": -85.6553,
			"countries": [
				"US"
			],
			"comments": "Eastern - IN (Crawford)"
		},
		"America/Indiana/Petersburg": {
			"name": "America/Indiana/Petersburg",
			"lat": 38.4919,
			"long": -86.7214,
			"countries": [
				"US"
			],
			"comments": "Eastern - IN (Pike)"
		},
		"America/Indiana/Vevay": {
			"name": "America/Indiana/Vevay",
			"lat": 38.7478,
			"long": -84.9328,
			"countries": [
				"US"
			],
			"comments": "Eastern - IN (Switzerland)"
		},
		"America/Chicago": {
			"name": "America/Chicago",
			"lat": 41.85,
			"long": -86.35,
			"countries": [
				"US"
			],
			"comments": "Central (most areas)"
		},
		"America/Indiana/Tell_City": {
			"name": "America/Indiana/Tell_City",
			"lat": 37.9531,
			"long": -85.2386,
			"countries": [
				"US"
			],
			"comments": "Central - IN (Perry)"
		},
		"America/Indiana/Knox": {
			"name": "America/Indiana/Knox",
			"lat": 41.2958,
			"long": -85.375,
			"countries": [
				"US"
			],
			"comments": "Central - IN (Starke)"
		},
		"America/Menominee": {
			"name": "America/Menominee",
			"lat": 45.1078,
			"long": -86.3858,
			"countries": [
				"US"
			],
			"comments": "Central - MI (Wisconsin border)"
		},
		"America/North_Dakota/Center": {
			"name": "America/North_Dakota/Center",
			"lat": 47.1164,
			"long": -100.7008,
			"countries": [
				"US"
			],
			"comments": "Central - ND (Oliver)"
		},
		"America/North_Dakota/New_Salem": {
			"name": "America/North_Dakota/New_Salem",
			"lat": 46.845,
			"long": -100.5892,
			"countries": [
				"US"
			],
			"comments": "Central - ND (Morton rural)"
		},
		"America/North_Dakota/Beulah": {
			"name": "America/North_Dakota/Beulah",
			"lat": 47.2642,
			"long": -100.2222,
			"countries": [
				"US"
			],
			"comments": "Central - ND (Mercer)"
		},
		"America/Denver": {
			"name": "America/Denver",
			"lat": 39.7392,
			"long": -103.0158,
			"countries": [
				"US"
			],
			"comments": "Mountain (most areas)"
		},
		"America/Boise": {
			"name": "America/Boise",
			"lat": 43.6136,
			"long": -115.7975,
			"countries": [
				"US"
			],
			"comments": "Mountain - ID (south); OR (east)"
		},
		"America/Phoenix": {
			"name": "America/Phoenix",
			"lat": 33.4483,
			"long": -111.9267,
			"countries": [
				"US",
				"CA"
			],
			"comments": "MST - Arizona (except Navajo), Creston BC"
		},
		"America/Los_Angeles": {
			"name": "America/Los_Angeles",
			"lat": 34.0522,
			"long": -117.7572,
			"countries": [
				"US"
			],
			"comments": "Pacific"
		},
		"America/Anchorage": {
			"name": "America/Anchorage",
			"lat": 61.2181,
			"long": -148.0997,
			"countries": [
				"US"
			],
			"comments": "Alaska (most areas)"
		},
		"America/Juneau": {
			"name": "America/Juneau",
			"lat": 58.3019,
			"long": -133.5803,
			"countries": [
				"US"
			],
			"comments": "Alaska - Juneau area"
		},
		"America/Sitka": {
			"name": "America/Sitka",
			"lat": 57.1764,
			"long": -134.6981,
			"countries": [
				"US"
			],
			"comments": "Alaska - Sitka area"
		},
		"America/Metlakatla": {
			"name": "America/Metlakatla",
			"lat": 55.1269,
			"long": -130.4236,
			"countries": [
				"US"
			],
			"comments": "Alaska - Annette Island"
		},
		"America/Yakutat": {
			"name": "America/Yakutat",
			"lat": 59.5469,
			"long": -138.2728,
			"countries": [
				"US"
			],
			"comments": "Alaska - Yakutat"
		},
		"America/Nome": {
			"name": "America/Nome",
			"lat": 64.5011,
			"long": -164.5936,
			"countries": [
				"US"
			],
			"comments": "Alaska (west)"
		},
		"America/Adak": {
			"name": "America/Adak",
			"lat": 51.88,
			"long": -175.3419,
			"countries": [
				"US"
			],
			"comments": "Aleutian Islands"
		},
		"Pacific/Honolulu": {
			"name": "Pacific/Honolulu",
			"lat": 21.3069,
			"long": -156.1417,
			"countries": [
				"US",
				"UM"
			],
			"comments": "Hawaii"
		},
		"America/Montevideo": {
			"name": "America/Montevideo",
			"lat": -33.0908,
			"long": -55.7875,
			"countries": [
				"UY"
			],
			"comments": ""
		},
		"Asia/Samarkand": {
			"name": "Asia/Samarkand",
			"lat": 39.6667,
			"long": 66.8,
			"countries": [
				"UZ"
			],
			"comments": "Uzbekistan (west)"
		},
		"Asia/Tashkent": {
			"name": "Asia/Tashkent",
			"lat": 41.3333,
			"long": 69.3,
			"countries": [
				"UZ"
			],
			"comments": "Uzbekistan (east)"
		},
		"America/Caracas": {
			"name": "America/Caracas",
			"lat": 10.5,
			"long": -65.0667,
			"countries": [
				"VE"
			],
			"comments": ""
		},
		"Asia/Ho_Chi_Minh": {
			"name": "Asia/Ho_Chi_Minh",
			"lat": 10.75,
			"long": 106.6667,
			"countries": [
				"VN"
			],
			"comments": "Vietnam (south)"
		},
		"Pacific/Efate": {
			"name": "Pacific/Efate",
			"lat": -16.3333,
			"long": 168.4167,
			"countries": [
				"VU"
			],
			"comments": ""
		},
		"Pacific/Wallis": {
			"name": "Pacific/Wallis",
			"lat": -12.7,
			"long": -175.8333,
			"countries": [
				"WF"
			],
			"comments": ""
		},
		"Pacific/Apia": {
			"name": "Pacific/Apia",
			"lat": -12.1667,
			"long": -170.2667,
			"countries": [
				"WS"
			],
			"comments": ""
		},
		"Africa/Johannesburg": {
			"name": "Africa/Johannesburg",
			"lat": -25.75,
			"long": 28,
			"countries": [
				"ZA",
				"LS",
				"SZ"
			],
			"comments": ""
		},
		"America/Antigua": {
			"name": "America/Antigua",
			"lat": 17.05,
			"long": -60.2,
			"countries": [
				"AG"
			],
			"comments": ""
		},
		"America/Anguilla": {
			"name": "America/Anguilla",
			"lat": 18.2,
			"long": -62.9333,
			"countries": [
				"AI"
			],
			"comments": ""
		},
		"Africa/Luanda": {
			"name": "Africa/Luanda",
			"lat": -7.2,
			"long": 13.2333,
			"countries": [
				"AO"
			],
			"comments": ""
		},
		"Antarctica/McMurdo": {
			"name": "Antarctica/McMurdo",
			"lat": -76.1667,
			"long": 166.6,
			"countries": [
				"AQ"
			],
			"comments": "New Zealand time - McMurdo, South Pole"
		},
		"Antarctica/DumontDUrville": {
			"name": "Antarctica/DumontDUrville",
			"lat": -65.3333,
			"long": 140.0167,
			"countries": [
				"AQ"
			],
			"comments": "Dumont-d'Urville"
		},
		"Antarctica/Syowa": {
			"name": "Antarctica/Syowa",
			"lat": -68.9939,
			"long": 39.59,
			"countries": [
				"AQ"
			],
			"comments": "Syowa"
		},
		"America/Aruba": {
			"name": "America/Aruba",
			"lat": 12.5,
			"long": -68.0333,
			"countries": [
				"AW"
			],
			"comments": ""
		},
		"Europe/Mariehamn": {
			"name": "Europe/Mariehamn",
			"lat": 60.1,
			"long": 19.95,
			"countries": [
				"AX"
			],
			"comments": ""
		},
		"Europe/Sarajevo": {
			"name": "Europe/Sarajevo",
			"lat": 43.8667,
			"long": 18.4167,
			"countries": [
				"BA"
			],
			"comments": ""
		},
		"Africa/Ouagadougou": {
			"name": "Africa/Ouagadougou",
			"lat": 12.3667,
			"long": -0.4833,
			"countries": [
				"BF"
			],
			"comments": ""
		},
		"Asia/Bahrain": {
			"name": "Asia/Bahrain",
			"lat": 26.3833,
			"long": 50.5833,
			"countries": [
				"BH"
			],
			"comments": ""
		},
		"Africa/Bujumbura": {
			"name": "Africa/Bujumbura",
			"lat": -2.6167,
			"long": 29.3667,
			"countries": [
				"BI"
			],
			"comments": ""
		},
		"Africa/Porto-Novo": {
			"name": "Africa/Porto-Novo",
			"lat": 6.4833,
			"long": 2.6167,
			"countries": [
				"BJ"
			],
			"comments": ""
		},
		"America/St_Barthelemy": {
			"name": "America/St_Barthelemy",
			"lat": 17.8833,
			"long": -61.15,
			"countries": [
				"BL"
			],
			"comments": ""
		},
		"America/Kralendijk": {
			"name": "America/Kralendijk",
			"lat": 12.1508,
			"long": -67.7233,
			"countries": [
				"BQ"
			],
			"comments": ""
		},
		"America/Nassau": {
			"name": "America/Nassau",
			"lat": 25.0833,
			"long": -76.65,
			"countries": [
				"BS"
			],
			"comments": ""
		},
		"Africa/Gaborone": {
			"name": "Africa/Gaborone",
			"lat": -23.35,
			"long": 25.9167,
			"countries": [
				"BW"
			],
			"comments": ""
		},
		"America/Blanc-Sablon": {
			"name": "America/Blanc-Sablon",
			"lat": 51.4167,
			"long": -56.8833,
			"countries": [
				"CA"
			],
			"comments": "AST - QC (Lower North Shore)"
		},
		"America/Atikokan": {
			"name": "America/Atikokan",
			"lat": 48.7586,
			"long": -90.3783,
			"countries": [
				"CA"
			],
			"comments": "EST - ON (Atikokan); NU (Coral H)"
		},
		"America/Creston": {
			"name": "America/Creston",
			"lat": 49.1,
			"long": -115.4833,
			"countries": [
				"CA"
			],
			"comments": "MST - BC (Creston)"
		},
		"Africa/Kinshasa": {
			"name": "Africa/Kinshasa",
			"lat": -3.7,
			"long": 15.3,
			"countries": [
				"CD"
			],
			"comments": "Dem. Rep. of Congo (west)"
		},
		"Africa/Lubumbashi": {
			"name": "Africa/Lubumbashi",
			"lat": -10.3333,
			"long": 27.4667,
			"countries": [
				"CD"
			],
			"comments": "Dem. Rep. of Congo (east)"
		},
		"Africa/Bangui": {
			"name": "Africa/Bangui",
			"lat": 4.3667,
			"long": 18.5833,
			"countries": [
				"CF"
			],
			"comments": ""
		},
		"Africa/Brazzaville": {
			"name": "Africa/Brazzaville",
			"lat": -3.7333,
			"long": 15.2833,
			"countries": [
				"CG"
			],
			"comments": ""
		},
		"Africa/Douala": {
			"name": "Africa/Douala",
			"lat": 4.05,
			"long": 9.7,
			"countries": [
				"CM"
			],
			"comments": ""
		},
		"America/Curacao": {
			"name": "America/Curacao",
			"lat": 12.1833,
			"long": -69,
			"countries": [
				"CW"
			],
			"comments": ""
		},
		"Europe/Busingen": {
			"name": "Europe/Busingen",
			"lat": 47.7,
			"long": 8.6833,
			"countries": [
				"DE"
			],
			"comments": "Busingen"
		},
		"Africa/Djibouti": {
			"name": "Africa/Djibouti",
			"lat": 11.6,
			"long": 43.15,
			"countries": [
				"DJ"
			],
			"comments": ""
		},
		"America/Dominica": {
			"name": "America/Dominica",
			"lat": 15.3,
			"long": -60.6,
			"countries": [
				"DM"
			],
			"comments": ""
		},
		"Africa/Asmara": {
			"name": "Africa/Asmara",
			"lat": 15.3333,
			"long": 38.8833,
			"countries": [
				"ER"
			],
			"comments": ""
		},
		"Africa/Addis_Ababa": {
			"name": "Africa/Addis_Ababa",
			"lat": 9.0333,
			"long": 38.7,
			"countries": [
				"ET"
			],
			"comments": ""
		},
		"Africa/Libreville": {
			"name": "Africa/Libreville",
			"lat": 0.3833,
			"long": 9.45,
			"countries": [
				"GA"
			],
			"comments": ""
		},
		"America/Grenada": {
			"name": "America/Grenada",
			"lat": 12.05,
			"long": -60.25,
			"countries": [
				"GD"
			],
			"comments": ""
		},
		"Europe/Guernsey": {
			"name": "Europe/Guernsey",
			"lat": 49.4547,
			"long": -1.4639,
			"countries": [
				"GG"
			],
			"comments": ""
		},
		"Africa/Accra": {
			"name": "Africa/Accra",
			"lat": 5.55,
			"long": 0.2167,
			"countries": [
				"GH"
			],
			"comments": ""
		},
		"Africa/Banjul": {
			"name": "Africa/Banjul",
			"lat": 13.4667,
			"long": -15.35,
			"countries": [
				"GM"
			],
			"comments": ""
		},
		"Africa/Conakry": {
			"name": "Africa/Conakry",
			"lat": 9.5167,
			"long": -12.2833,
			"countries": [
				"GN"
			],
			"comments": ""
		},
		"America/Guadeloupe": {
			"name": "America/Guadeloupe",
			"lat": 16.2333,
			"long": -60.4667,
			"countries": [
				"GP"
			],
			"comments": ""
		},
		"Africa/Malabo": {
			"name": "Africa/Malabo",
			"lat": 3.75,
			"long": 8.7833,
			"countries": [
				"GQ"
			],
			"comments": ""
		},
		"Europe/Zagreb": {
			"name": "Europe/Zagreb",
			"lat": 45.8,
			"long": 15.9667,
			"countries": [
				"HR"
			],
			"comments": ""
		},
		"Europe/Isle_of_Man": {
			"name": "Europe/Isle_of_Man",
			"lat": 54.15,
			"long": -3.5333,
			"countries": [
				"IM"
			],
			"comments": ""
		},
		"Europe/Jersey": {
			"name": "Europe/Jersey",
			"lat": 49.1836,
			"long": -1.8933,
			"countries": [
				"JE"
			],
			"comments": ""
		},
		"Asia/Phnom_Penh": {
			"name": "Asia/Phnom_Penh",
			"lat": 11.55,
			"long": 104.9167,
			"countries": [
				"KH"
			],
			"comments": ""
		},
		"Indian/Comoro": {
			"name": "Indian/Comoro",
			"lat": -10.3167,
			"long": 43.2667,
			"countries": [
				"KM"
			],
			"comments": ""
		},
		"America/St_Kitts": {
			"name": "America/St_Kitts",
			"lat": 17.3,
			"long": -61.2833,
			"countries": [
				"KN"
			],
			"comments": ""
		},
		"Asia/Kuwait": {
			"name": "Asia/Kuwait",
			"lat": 29.3333,
			"long": 47.9833,
			"countries": [
				"KW"
			],
			"comments": ""
		},
		"America/Cayman": {
			"name": "America/Cayman",
			"lat": 19.3,
			"long": -80.6167,
			"countries": [
				"KY"
			],
			"comments": ""
		},
		"Asia/Vientiane": {
			"name": "Asia/Vientiane",
			"lat": 17.9667,
			"long": 102.6,
			"countries": [
				"LA"
			],
			"comments": ""
		},
		"America/St_Lucia": {
			"name": "America/St_Lucia",
			"lat": 14.0167,
			"long": -61,
			"countries": [
				"LC"
			],
			"comments": ""
		},
		"Europe/Vaduz": {
			"name": "Europe/Vaduz",
			"lat": 47.15,
			"long": 9.5167,
			"countries": [
				"LI"
			],
			"comments": ""
		},
		"Africa/Maseru": {
			"name": "Africa/Maseru",
			"lat": -28.5333,
			"long": 27.5,
			"countries": [
				"LS"
			],
			"comments": ""
		},
		"Europe/Podgorica": {
			"name": "Europe/Podgorica",
			"lat": 42.4333,
			"long": 19.2667,
			"countries": [
				"ME"
			],
			"comments": ""
		},
		"America/Marigot": {
			"name": "America/Marigot",
			"lat": 18.0667,
			"long": -62.9167,
			"countries": [
				"MF"
			],
			"comments": ""
		},
		"Indian/Antananarivo": {
			"name": "Indian/Antananarivo",
			"lat": -17.0833,
			"long": 47.5167,
			"countries": [
				"MG"
			],
			"comments": ""
		},
		"Europe/Skopje": {
			"name": "Europe/Skopje",
			"lat": 41.9833,
			"long": 21.4333,
			"countries": [
				"MK"
			],
			"comments": ""
		},
		"Africa/Bamako": {
			"name": "Africa/Bamako",
			"lat": 12.65,
			"long": -8,
			"countries": [
				"ML"
			],
			"comments": ""
		},
		"Pacific/Saipan": {
			"name": "Pacific/Saipan",
			"lat": 15.2,
			"long": 145.75,
			"countries": [
				"MP"
			],
			"comments": ""
		},
		"Africa/Nouakchott": {
			"name": "Africa/Nouakchott",
			"lat": 18.1,
			"long": -14.05,
			"countries": [
				"MR"
			],
			"comments": ""
		},
		"America/Montserrat": {
			"name": "America/Montserrat",
			"lat": 16.7167,
			"long": -61.7833,
			"countries": [
				"MS"
			],
			"comments": ""
		},
		"Africa/Blantyre": {
			"name": "Africa/Blantyre",
			"lat": -14.2167,
			"long": 35,
			"countries": [
				"MW"
			],
			"comments": ""
		},
		"Africa/Niamey": {
			"name": "Africa/Niamey",
			"lat": 13.5167,
			"long": 2.1167,
			"countries": [
				"NE"
			],
			"comments": ""
		},
		"Asia/Muscat": {
			"name": "Asia/Muscat",
			"lat": 23.6,
			"long": 58.5833,
			"countries": [
				"OM"
			],
			"comments": ""
		},
		"Africa/Kigali": {
			"name": "Africa/Kigali",
			"lat": -0.05,
			"long": 30.0667,
			"countries": [
				"RW"
			],
			"comments": ""
		},
		"Atlantic/St_Helena": {
			"name": "Atlantic/St_Helena",
			"lat": -14.0833,
			"long": -4.3,
			"countries": [
				"SH"
			],
			"comments": ""
		},
		"Europe/Ljubljana": {
			"name": "Europe/Ljubljana",
			"lat": 46.05,
			"long": 14.5167,
			"countries": [
				"SI"
			],
			"comments": ""
		},
		"Arctic/Longyearbyen": {
			"name": "Arctic/Longyearbyen",
			"lat": 78,
			"long": 16,
			"countries": [
				"SJ"
			],
			"comments": ""
		},
		"Europe/Bratislava": {
			"name": "Europe/Bratislava",
			"lat": 48.15,
			"long": 17.1167,
			"countries": [
				"SK"
			],
			"comments": ""
		},
		"Africa/Freetown": {
			"name": "Africa/Freetown",
			"lat": 8.5,
			"long": -12.75,
			"countries": [
				"SL"
			],
			"comments": ""
		},
		"Europe/San_Marino": {
			"name": "Europe/San_Marino",
			"lat": 43.9167,
			"long": 12.4667,
			"countries": [
				"SM"
			],
			"comments": ""
		},
		"Africa/Dakar": {
			"name": "Africa/Dakar",
			"lat": 14.6667,
			"long": -16.5667,
			"countries": [
				"SN"
			],
			"comments": ""
		},
		"Africa/Mogadishu": {
			"name": "Africa/Mogadishu",
			"lat": 2.0667,
			"long": 45.3667,
			"countries": [
				"SO"
			],
			"comments": ""
		},
		"America/Lower_Princes": {
			"name": "America/Lower_Princes",
			"lat": 18.0514,
			"long": -62.9528,
			"countries": [
				"SX"
			],
			"comments": ""
		},
		"Africa/Mbabane": {
			"name": "Africa/Mbabane",
			"lat": -25.7,
			"long": 31.1,
			"countries": [
				"SZ"
			],
			"comments": ""
		},
		"Africa/Lome": {
			"name": "Africa/Lome",
			"lat": 6.1333,
			"long": 1.2167,
			"countries": [
				"TG"
			],
			"comments": ""
		},
		"America/Port_of_Spain": {
			"name": "America/Port_of_Spain",
			"lat": 10.65,
			"long": -60.4833,
			"countries": [
				"TT"
			],
			"comments": ""
		},
		"Africa/Dar_es_Salaam": {
			"name": "Africa/Dar_es_Salaam",
			"lat": -5.2,
			"long": 39.2833,
			"countries": [
				"TZ"
			],
			"comments": ""
		},
		"Africa/Kampala": {
			"name": "Africa/Kampala",
			"lat": 0.3167,
			"long": 32.4167,
			"countries": [
				"UG"
			],
			"comments": ""
		},
		"Pacific/Midway": {
			"name": "Pacific/Midway",
			"lat": 28.2167,
			"long": -176.6333,
			"countries": [
				"UM"
			],
			"comments": "Midway Islands"
		},
		"Europe/Vatican": {
			"name": "Europe/Vatican",
			"lat": 41.9022,
			"long": 12.4531,
			"countries": [
				"VA"
			],
			"comments": ""
		},
		"America/St_Vincent": {
			"name": "America/St_Vincent",
			"lat": 13.15,
			"long": -60.7667,
			"countries": [
				"VC"
			],
			"comments": ""
		},
		"America/Tortola": {
			"name": "America/Tortola",
			"lat": 18.45,
			"long": -63.3833,
			"countries": [
				"VG"
			],
			"comments": ""
		},
		"America/St_Thomas": {
			"name": "America/St_Thomas",
			"lat": 18.35,
			"long": -63.0667,
			"countries": [
				"VI"
			],
			"comments": ""
		},
		"Asia/Aden": {
			"name": "Asia/Aden",
			"lat": 12.75,
			"long": 45.2,
			"countries": [
				"YE"
			],
			"comments": ""
		},
		"Indian/Mayotte": {
			"name": "Indian/Mayotte",
			"lat": -11.2167,
			"long": 45.2333,
			"countries": [
				"YT"
			],
			"comments": ""
		},
		"Africa/Lusaka": {
			"name": "Africa/Lusaka",
			"lat": -14.5833,
			"long": 28.2833,
			"countries": [
				"ZM"
			],
			"comments": ""
		},
		"Africa/Harare": {
			"name": "Africa/Harare",
			"lat": -16.1667,
			"long": 31.05,
			"countries": [
				"ZW"
			],
			"comments": ""
		}
	}
}//! moment-timezone.js
//! version : 0.5.34
//! Copyright (c) JS Foundation and other contributors
//! license : MIT
//! github.com/moment/moment-timezone

(function (root, factory) {
	"use strict";

	/*global define*/
	if (typeof module === 'object' && module.exports) {
		module.exports = factory(require('moment')); // Node
	} else if (typeof define === 'function' && define.amd) {
		define(['moment'], factory);                 // AMD
	} else {
		factory(root.moment);                        // Browser
	}
}(this, function (moment) {
	"use strict";

	// Resolves es6 module loading issue
	if (moment.version === undefined && moment.default) {
		moment = moment.default;
	}

	// Do not load moment-timezone a second time.
	// if (moment.tz !== undefined) {
	// 	logError('Moment Timezone ' + moment.tz.version + ' was already loaded ' + (moment.tz.dataVersion ? 'with data from ' : 'without any data') + moment.tz.dataVersion);
	// 	return moment;
	// }

	var VERSION = "0.5.34",
		zones = {},
		links = {},
		countries = {},
		names = {},
		guesses = {},
		cachedGuess;

	if (!moment || typeof moment.version !== 'string') {
		logError('Moment Timezone requires Moment.js. See https://momentjs.com/timezone/docs/#/use-it/browser/');
	}

	var momentVersion = moment.version.split('.'),
		major = +momentVersion[0],
		minor = +momentVersion[1];

	// Moment.js version check
	if (major < 2 || (major === 2 && minor < 6)) {
		logError('Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js ' + moment.version + '. See momentjs.com');
	}

	/************************************
		Unpacking
	************************************/

	function charCodeToInt(charCode) {
		if (charCode > 96) {
			return charCode - 87;
		} else if (charCode > 64) {
			return charCode - 29;
		}
		return charCode - 48;
	}

	function unpackBase60(string) {
		var i = 0,
			parts = string.split('.'),
			whole = parts[0],
			fractional = parts[1] || '',
			multiplier = 1,
			num,
			out = 0,
			sign = 1;

		// handle negative numbers
		if (string.charCodeAt(0) === 45) {
			i = 1;
			sign = -1;
		}

		// handle digits before the decimal
		for (i; i < whole.length; i++) {
			num = charCodeToInt(whole.charCodeAt(i));
			out = 60 * out + num;
		}

		// handle digits after the decimal
		for (i = 0; i < fractional.length; i++) {
			multiplier = multiplier / 60;
			num = charCodeToInt(fractional.charCodeAt(i));
			out += num * multiplier;
		}

		return out * sign;
	}

	function arrayToInt (array) {
		for (var i = 0; i < array.length; i++) {
			array[i] = unpackBase60(array[i]);
		}
	}

	function intToUntil (array, length) {
		for (var i = 0; i < length; i++) {
			array[i] = Math.round((array[i - 1] || 0) + (array[i] * 60000)); // minutes to milliseconds
		}

		array[length - 1] = Infinity;
	}

	function mapIndices (source, indices) {
		var out = [], i;

		for (i = 0; i < indices.length; i++) {
			out[i] = source[indices[i]];
		}

		return out;
	}

	function unpack (string) {
		var data = string.split('|'),
			offsets = data[2].split(' '),
			indices = data[3].split(''),
			untils  = data[4].split(' ');

		arrayToInt(offsets);
		arrayToInt(indices);
		arrayToInt(untils);

		intToUntil(untils, indices.length);

		return {
			name       : data[0],
			abbrs      : mapIndices(data[1].split(' '), indices),
			offsets    : mapIndices(offsets, indices),
			untils     : untils,
			population : data[5] | 0
		};
	}

	/************************************
		Zone object
	************************************/

	function Zone (packedString) {
		if (packedString) {
			this._set(unpack(packedString));
		}
	}

	Zone.prototype = {
		_set : function (unpacked) {
			this.name       = unpacked.name;
			this.abbrs      = unpacked.abbrs;
			this.untils     = unpacked.untils;
			this.offsets    = unpacked.offsets;
			this.population = unpacked.population;
		},

		_index : function (timestamp) {
			var target = +timestamp,
				untils = this.untils,
				i;

			for (i = 0; i < untils.length; i++) {
				if (target < untils[i]) {
					return i;
				}
			}
		},

		countries : function () {
			var zone_name = this.name;
			return Object.keys(countries).filter(function (country_code) {
				return countries[country_code].zones.indexOf(zone_name) !== -1;
			});
		},

		parse : function (timestamp) {
			var target  = +timestamp,
				offsets = this.offsets,
				untils  = this.untils,
				max     = untils.length - 1,
				offset, offsetNext, offsetPrev, i;

			for (i = 0; i < max; i++) {
				offset     = offsets[i];
				offsetNext = offsets[i + 1];
				offsetPrev = offsets[i ? i - 1 : i];

				if (offset < offsetNext && tz.moveAmbiguousForward) {
					offset = offsetNext;
				} else if (offset > offsetPrev && tz.moveInvalidForward) {
					offset = offsetPrev;
				}

				if (target < untils[i] - (offset * 60000)) {
					return offsets[i];
				}
			}

			return offsets[max];
		},

		abbr : function (mom) {
			return this.abbrs[this._index(mom)];
		},

		offset : function (mom) {
			logError("zone.offset has been deprecated in favor of zone.utcOffset");
			return this.offsets[this._index(mom)];
		},

		utcOffset : function (mom) {
			return this.offsets[this._index(mom)];
		}
	};

	/************************************
		Country object
	************************************/

	function Country (country_name, zone_names) {
		this.name = country_name;
		this.zones = zone_names;
	}

	/************************************
		Current Timezone
	************************************/

	function OffsetAt(at) {
		var timeString = at.toTimeString();
		var abbr = timeString.match(/\([a-z ]+\)/i);
		if (abbr && abbr[0]) {
			// 17:56:31 GMT-0600 (CST)
			// 17:56:31 GMT-0600 (Central Standard Time)
			abbr = abbr[0].match(/[A-Z]/g);
			abbr = abbr ? abbr.join('') : undefined;
		} else {
			// 17:56:31 CST
			// 17:56:31 GMT+0800 (台北標準時間)
			abbr = timeString.match(/[A-Z]{3,5}/g);
			abbr = abbr ? abbr[0] : undefined;
		}

		if (abbr === 'GMT') {
			abbr = undefined;
		}

		this.at = +at;
		this.abbr = abbr;
		this.offset = at.getTimezoneOffset();
	}

	function ZoneScore(zone) {
		this.zone = zone;
		this.offsetScore = 0;
		this.abbrScore = 0;
	}

	ZoneScore.prototype.scoreOffsetAt = function (offsetAt) {
		this.offsetScore += Math.abs(this.zone.utcOffset(offsetAt.at) - offsetAt.offset);
		if (this.zone.abbr(offsetAt.at).replace(/[^A-Z]/g, '') !== offsetAt.abbr) {
			this.abbrScore++;
		}
	};

	function findChange(low, high) {
		var mid, diff;

		while ((diff = ((high.at - low.at) / 12e4 | 0) * 6e4)) {
			mid = new OffsetAt(new Date(low.at + diff));
			if (mid.offset === low.offset) {
				low = mid;
			} else {
				high = mid;
			}
		}

		return low;
	}

	function userOffsets() {
		var startYear = new Date().getFullYear() - 2,
			last = new OffsetAt(new Date(startYear, 0, 1)),
			offsets = [last],
			change, next, i;

		for (i = 1; i < 48; i++) {
			next = new OffsetAt(new Date(startYear, i, 1));
			if (next.offset !== last.offset) {
				change = findChange(last, next);
				offsets.push(change);
				offsets.push(new OffsetAt(new Date(change.at + 6e4)));
			}
			last = next;
		}

		for (i = 0; i < 4; i++) {
			offsets.push(new OffsetAt(new Date(startYear + i, 0, 1)));
			offsets.push(new OffsetAt(new Date(startYear + i, 6, 1)));
		}

		return offsets;
	}

	function sortZoneScores (a, b) {
		if (a.offsetScore !== b.offsetScore) {
			return a.offsetScore - b.offsetScore;
		}
		if (a.abbrScore !== b.abbrScore) {
			return a.abbrScore - b.abbrScore;
		}
		if (a.zone.population !== b.zone.population) {
			return b.zone.population - a.zone.population;
		}
		return b.zone.name.localeCompare(a.zone.name);
	}

	function addToGuesses (name, offsets) {
		var i, offset;
		arrayToInt(offsets);
		for (i = 0; i < offsets.length; i++) {
			offset = offsets[i];
			guesses[offset] = guesses[offset] || {};
			guesses[offset][name] = true;
		}
	}

	function guessesForUserOffsets (offsets) {
		var offsetsLength = offsets.length,
			filteredGuesses = {},
			out = [],
			i, j, guessesOffset;

		for (i = 0; i < offsetsLength; i++) {
			guessesOffset = guesses[offsets[i].offset] || {};
			for (j in guessesOffset) {
				if (guessesOffset.hasOwnProperty(j)) {
					filteredGuesses[j] = true;
				}
			}
		}

		for (i in filteredGuesses) {
			if (filteredGuesses.hasOwnProperty(i)) {
				out.push(names[i]);
			}
		}

		return out;
	}

	function rebuildGuess () {

		// use Intl API when available and returning valid time zone
		try {
			var intlName = Intl.DateTimeFormat().resolvedOptions().timeZone;
			if (intlName && intlName.length > 3) {
				var name = names[normalizeName(intlName)];
				if (name) {
					return name;
				}
				logError("Moment Timezone found " + intlName + " from the Intl api, but did not have that data loaded.");
			}
		} catch (e) {
			// Intl unavailable, fall back to manual guessing.
		}

		var offsets = userOffsets(),
			offsetsLength = offsets.length,
			guesses = guessesForUserOffsets(offsets),
			zoneScores = [],
			zoneScore, i, j;

		for (i = 0; i < guesses.length; i++) {
			zoneScore = new ZoneScore(getZone(guesses[i]), offsetsLength);
			for (j = 0; j < offsetsLength; j++) {
				zoneScore.scoreOffsetAt(offsets[j]);
			}
			zoneScores.push(zoneScore);
		}

		zoneScores.sort(sortZoneScores);

		return zoneScores.length > 0 ? zoneScores[0].zone.name : undefined;
	}

	function guess (ignoreCache) {
		if (!cachedGuess || ignoreCache) {
			cachedGuess = rebuildGuess();
		}
		return cachedGuess;
	}

	/************************************
		Global Methods
	************************************/

	function normalizeName (name) {
		return (name || '').toLowerCase().replace(/\//g, '_');
	}

	function addZone (packed) {
		var i, name, split, normalized;

		if (typeof packed === "string") {
			packed = [packed];
		}

		for (i = 0; i < packed.length; i++) {
			split = packed[i].split('|');
			name = split[0];
			normalized = normalizeName(name);
			zones[normalized] = packed[i];
			names[normalized] = name;
			addToGuesses(normalized, split[2].split(' '));
		}
	}

	function getZone (name, caller) {

		name = normalizeName(name);

		var zone = zones[name];
		var link;

		if (zone instanceof Zone) {
			return zone;
		}

		if (typeof zone === 'string') {
			zone = new Zone(zone);
			zones[name] = zone;
			return zone;
		}

		// Pass getZone to prevent recursion more than 1 level deep
		if (links[name] && caller !== getZone && (link = getZone(links[name], getZone))) {
			zone = zones[name] = new Zone();
			zone._set(link);
			zone.name = names[name];
			return zone;
		}

		return null;
	}

	function getNames () {
		var i, out = [];

		for (i in names) {
			if (names.hasOwnProperty(i) && (zones[i] || zones[links[i]]) && names[i]) {
				out.push(names[i]);
			}
		}

		return out.sort();
	}

	function getCountryNames () {
		return Object.keys(countries);
	}

	function addLink (aliases) {
		var i, alias, normal0, normal1;

		if (typeof aliases === "string") {
			aliases = [aliases];
		}

		for (i = 0; i < aliases.length; i++) {
			alias = aliases[i].split('|');

			normal0 = normalizeName(alias[0]);
			normal1 = normalizeName(alias[1]);

			links[normal0] = normal1;
			names[normal0] = alias[0];

			links[normal1] = normal0;
			names[normal1] = alias[1];
		}
	}

	function addCountries (data) {
		var i, country_code, country_zones, split;
		if (!data || !data.length) return;
		for (i = 0; i < data.length; i++) {
			split = data[i].split('|');
			country_code = split[0].toUpperCase();
			country_zones = split[1].split(' ');
			countries[country_code] = new Country(
				country_code,
				country_zones
			);
		}
	}

	function getCountry (name) {
		name = name.toUpperCase();
		return countries[name] || null;
	}

	function zonesForCountry(country, with_offset) {
		country = getCountry(country);

		if (!country) return null;

		var zones = country.zones.sort();

		if (with_offset) {
			return zones.map(function (zone_name) {
				var zone = getZone(zone_name);
				return {
					name: zone_name,
					offset: zone.utcOffset(new Date())
				};
			});
		}

		return zones;
	}

	function loadData (data) {
		addZone(data.zones);
		addLink(data.links);
		addCountries(data.countries);
		tz.dataVersion = data.version;
	}

	function zoneExists (name) {
		if (!zoneExists.didShowError) {
			zoneExists.didShowError = true;
				logError("moment.tz.zoneExists('" + name + "') has been deprecated in favor of !moment.tz.zone('" + name + "')");
		}
		return !!getZone(name);
	}

	function needsOffset (m) {
		var isUnixTimestamp = (m._f === 'X' || m._f === 'x');
		return !!(m._a && (m._tzm === undefined) && !isUnixTimestamp);
	}

	function logError (message) {
		if (typeof console !== 'undefined' && typeof console.error === 'function') {
			console.error(message);
		}
	}

	/************************************
		moment.tz namespace
	************************************/

	function tz (input) {
		var args = Array.prototype.slice.call(arguments, 0, -1),
			name = arguments[arguments.length - 1],
			zone = getZone(name),
			out  = moment.utc.apply(null, args);

		if (zone && !moment.isMoment(input) && needsOffset(out)) {
			out.add(zone.parse(out), 'minutes');
		}

		out.tz(name);

		return out;
	}

	tz.version      = VERSION;
	tz.dataVersion  = '';
	tz._zones       = zones;
	tz._links       = links;
	tz._names       = names;
	tz._countries	= countries;
	tz.add          = addZone;
	tz.link         = addLink;
	tz.load         = loadData;
	tz.zone         = getZone;
	tz.zoneExists   = zoneExists; // deprecated in 0.1.0
	tz.guess        = guess;
	tz.names        = getNames;
	tz.Zone         = Zone;
	tz.unpack       = unpack;
	tz.unpackBase60 = unpackBase60;
	tz.needsOffset  = needsOffset;
	tz.moveInvalidForward   = true;
	tz.moveAmbiguousForward = false;
	tz.countries    = getCountryNames;
	tz.zonesForCountry = zonesForCountry;

	/************************************
		Interface with Moment.js
	************************************/

	var fn = moment.fn;

	moment.tz = tz;

	moment.defaultZone = null;

	moment.updateOffset = function (mom, keepTime) {
		var zone = moment.defaultZone,
			offset;

		if (mom._z === undefined) {
			if (zone && needsOffset(mom) && !mom._isUTC) {
				mom._d = moment.utc(mom._a)._d;
				mom.utc().add(zone.parse(mom), 'minutes');
			}
			mom._z = zone;
		}
		if (mom._z) {
			offset = mom._z.utcOffset(mom);
			if (Math.abs(offset) < 16) {
				offset = offset / 60;
			}
			if (mom.utcOffset !== undefined) {
				var z = mom._z;
				mom.utcOffset(-offset, keepTime);
				mom._z = z;
			} else {
				mom.zone(offset, keepTime);
			}
		}
	};

	fn.tz = function (name, keepTime) {
		if (name) {
			if (typeof name !== 'string') {
				throw new Error('Time zone name must be a string, got ' + name + ' [' + typeof name + ']');
			}
			this._z = getZone(name);
			if (this._z) {
				moment.updateOffset(this, keepTime);
			} else {
				logError("Moment Timezone has no data for " + name + ". See http://momentjs.com/timezone/docs/#/data-loading/.");
			}
			return this;
		}
		if (this._z) { return this._z.name; }
	};

	function abbrWrap (old) {
		return function () {
			if (this._z) { return this._z.abbr(this); }
			return old.call(this);
		};
	}

	function resetZoneWrap (old) {
		return function () {
			this._z = null;
			return old.apply(this, arguments);
		};
	}

	function resetZoneWrap2 (old) {
		return function () {
			if (arguments.length > 0) this._z = null;
			return old.apply(this, arguments);
		};
	}

	fn.zoneName  = abbrWrap(fn.zoneName);
	fn.zoneAbbr  = abbrWrap(fn.zoneAbbr);
	fn.utc       = resetZoneWrap(fn.utc);
	fn.local     = resetZoneWrap(fn.local);
	fn.utcOffset = resetZoneWrap2(fn.utcOffset);

	moment.tz.setDefault = function(name) {
		if (major < 2 || (major === 2 && minor < 9)) {
			logError('Moment Timezone setDefault() requires Moment.js >= 2.9.0. You are using Moment.js ' + moment.version + '.');
		}
		moment.defaultZone = name ? getZone(name) : null;
		return moment;
	};

	// Cloning a moment should include the _z property.
	var momentProperties = moment.momentProperties;
	if (Object.prototype.toString.call(momentProperties) === '[object Array]') {
		// moment 2.8.1+
		momentProperties.push('_z');
		momentProperties.push('_a');
	} else if (momentProperties) {
		// moment 2.7.0
		momentProperties._z = null;
	}

	loadData({
		"version": "2021e",
		"zones": [
			"Africa/Abidjan|GMT|0|0||48e5",
			"Africa/Nairobi|EAT|-30|0||47e5",
			"Africa/Algiers|CET|-10|0||26e5",
			"Africa/Lagos|WAT|-10|0||17e6",
			"Africa/Maputo|CAT|-20|0||26e5",
			"Africa/Cairo|EET|-20|0||15e6",
			"Africa/Casablanca|+00 +01|0 -10|0101010101010101010101010101|1QyO0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0 2600 e00|32e5",
			"Europe/Paris|CET CEST|-10 -20|01010101010101010101010|1QyN0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|11e6",
			"Africa/Johannesburg|SAST|-20|0||84e5",
			"Africa/Juba|EAT CAT|-30 -20|01|24nx0|",
			"Africa/Khartoum|EAT CAT|-30 -20|01|1Usl0|51e5",
			"Africa/Sao_Tome|GMT WAT|0 -10|010|1UQN0 2q00|",
			"Africa/Windhoek|CAT WAT|-20 -10|01010|1QBA0 11B0 1nX0 11B0|32e4",
			"America/Adak|HST HDT|a0 90|01010101010101010101010|1Qto0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|326",
			"America/Anchorage|AKST AKDT|90 80|01010101010101010101010|1Qtn0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|30e4",
			"America/Santo_Domingo|AST|40|0||29e5",
			"America/Fortaleza|-03|30|0||34e5",
			"America/Asuncion|-03 -04|30 40|01010101010101010101010|1QyP0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0|28e5",
			"America/Panama|EST|50|0||15e5",
			"America/Mexico_City|CST CDT|60 50|01010101010101010101010|1QBI0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0|20e6",
			"America/Managua|CST|60|0||22e5",
			"America/La_Paz|-04|40|0||19e5",
			"America/Lima|-05|50|0||11e6",
			"America/Denver|MST MDT|70 60|01010101010101010101010|1Qtl0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e5",
			"America/Campo_Grande|-03 -04|30 40|01010101|1QkP0 1zd0 On0 1zd0 On0 1HB0 FX0|77e4",
			"America/Caracas|-0430 -04|4u 40|01|1QMT0|29e5",
			"America/Chicago|CST CDT|60 50|01010101010101010101010|1Qtk0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|92e5",
			"America/Chihuahua|MST MDT|70 60|01010101010101010101010|1QBJ0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0|81e4",
			"America/Phoenix|MST|70|0||42e5",
			"America/Whitehorse|PST PDT MST|80 70 70|01010101012|1Qtm0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1z90|23e3",
			"America/New_York|EST EDT|50 40|01010101010101010101010|1Qtj0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e6",
			"America/Los_Angeles|PST PDT|80 70|01010101010101010101010|1Qtm0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e6",
			"America/Halifax|AST ADT|40 30|01010101010101010101010|1Qti0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|39e4",
			"America/Godthab|-03 -02|30 20|01010101010101010101010|1QyN0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|17e3",
			"America/Grand_Turk|AST EDT EST|40 40 50|0121212121212121212|1Vkv0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e2",
			"America/Havana|CST CDT|50 40|01010101010101010101010|1Qth0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0|21e5",
			"America/Metlakatla|AKST AKDT PST|90 80 80|010101201010101010101010|1Qtn0 1zb0 Op0 1zb0 Op0 1zb0 uM0 jB0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2",
			"America/Miquelon|-03 -02|30 20|01010101010101010101010|1Qth0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|61e2",
			"America/Noronha|-02|20|0||30e2",
			"America/Port-au-Prince|EST EDT|50 40|010101010101010101010|1SST0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5",
			"Antarctica/Palmer|-03 -04|30 40|010|1QSr0 Ap0|40",
			"America/Santiago|-03 -04|30 40|01010101010101010101010|1QSr0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0|62e5",
			"America/Sao_Paulo|-02 -03|20 30|01010101|1QkO0 1zd0 On0 1zd0 On0 1HB0 FX0|20e6",
			"Atlantic/Azores|-01 +00|10 0|01010101010101010101010|1QyN0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|25e4",
			"America/St_Johns|NST NDT|3u 2u|01010101010101010101010|1Qthu 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4",
			"Antarctica/Casey|+08 +11|-80 -b0|01010101|1RWg0 3m10 1o30 14k0 1kr0 12l0 1o01|10",
			"Asia/Bangkok|+07|-70|0||15e6",
			"Asia/Vladivostok|+10|-a0|0||60e4",
			"Australia/Sydney|AEDT AEST|-b0 -a0|01010101010101010101010|1QBs0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0|40e5",
			"Asia/Tashkent|+05|-50|0||23e5",
			"Pacific/Auckland|NZDT NZST|-d0 -c0|01010101010101010101010|1QBq0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00|14e5",
			"Asia/Baghdad|+03|-30|0||66e5",
			"Antarctica/Troll|+00 +02|0 -20|01010101010101010101010|1QyN0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|40",
			"Asia/Dhaka|+06|-60|0||16e6",
			"Asia/Amman|EET EEST|-20 -30|01010101010101010101010|1QAK0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 LA0 1C00 LA0 1C00 Oo0 1zc0 Oo0 1C00 LA0 1C00|25e5",
			"Asia/Kamchatka|+12|-c0|0||18e4",
			"Asia/Dubai|+04|-40|0||39e5",
			"Asia/Barnaul|+06 +07|-60 -70|01|1QyI0|",
			"Asia/Beirut|EET EEST|-20 -30|01010101010101010101010|1QyK0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0|22e5",
			"Asia/Kuala_Lumpur|+08|-80|0||71e5",
			"Asia/Kolkata|IST|-5u|0||15e6",
			"Asia/Chita|+08 +09|-80 -90|01|1QyG0|33e4",
			"Asia/Ulaanbaatar|+08 +09|-80 -90|010|1Qyi0 1cJ0|12e5",
			"Asia/Shanghai|CST|-80|0||23e6",
			"Asia/Colombo|+0530|-5u|0||22e5",
			"Asia/Damascus|EET EEST|-20 -30|01010101010101010101010|1QxW0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0|26e5",
			"Asia/Yakutsk|+09|-90|0||28e4",
			"Asia/Famagusta|EET EEST +03|-20 -30 -30|0120101010101010101010|1QyN0 15U0 2Ks0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|",
			"Asia/Gaza|EET EEST|-20 -30|01010101010101010101010|1Qyn0 1qL0 WN0 1qL0 WN0 1qL0 11c0 1on0 11B0 1o00 11A0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1nA0 1200 1qo0 Xc0 1qo0|18e5",
			"Asia/Hong_Kong|HKT|-80|0||73e5",
			"Asia/Hovd|+07 +08|-70 -80|010|1Qyj0 1cJ0|81e3",
			"Europe/Istanbul|EET EEST +03|-20 -30 -30|012|1QyN0 15w0|13e6",
			"Asia/Jakarta|WIB|-70|0||31e6",
			"Asia/Jayapura|WIT|-90|0||26e4",
			"Asia/Jerusalem|IST IDT|-20 -30|01010101010101010101010|1Qy00 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0|81e4",
			"Asia/Kabul|+0430|-4u|0||46e5",
			"Asia/Karachi|PKT|-50|0||24e6",
			"Asia/Kathmandu|+0545|-5J|0||12e5",
			"Asia/Magadan|+10 +11|-a0 -b0|01|1QJQ0|95e3",
			"Asia/Makassar|WITA|-80|0||15e5",
			"Asia/Manila|PST|-80|0||24e6",
			"Europe/Athens|EET EEST|-20 -30|01010101010101010101010|1QyN0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|35e5",
			"Asia/Novosibirsk|+06 +07|-60 -70|01|1Rmk0|15e5",
			"Asia/Pyongyang|KST KST|-8u -90|01|1VGf0|29e5",
			"Asia/Qyzylorda|+06 +05|-60 -50|01|1Xei0|73e4",
			"Asia/Rangoon|+0630|-6u|0||48e5",
			"Asia/Sakhalin|+10 +11|-a0 -b0|01|1QyE0|58e4",
			"Asia/Seoul|KST|-90|0||23e6",
			"Pacific/Bougainville|+11|-b0|0||18e4",
			"Asia/Tehran|+0330 +0430|-3u -4u|01010101010101010101010|1Qwku 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0|14e6",
			"Asia/Tokyo|JST|-90|0||38e6",
			"Asia/Tomsk|+06 +07|-60 -70|01|1QXU0|10e5",
			"Europe/Lisbon|WET WEST|0 -10|01010101010101010101010|1QyN0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|27e5",
			"Atlantic/Cape_Verde|-01|10|0||50e4",
			"Australia/Adelaide|ACDT ACST|-au -9u|01010101010101010101010|1QBsu 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0|11e5",
			"Australia/Brisbane|AEST|-a0|0||20e5",
			"Australia/Darwin|ACST|-9u|0||12e4",
			"Australia/Eucla|+0845|-8J|0||368",
			"Australia/Lord_Howe|+11 +1030|-b0 -au|01010101010101010101010|1QBr0 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu|347",
			"Australia/Perth|AWST|-80|0||18e5",
			"Pacific/Easter|-05 -06|50 60|01010101010101010101010|1QSr0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0|30e2",
			"Europe/Dublin|GMT IST|0 -10|01010101010101010101010|1QyN0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|12e5",
			"Etc/GMT-1|+01|-10|0||",
			"Pacific/Fakaofo|+13|-d0|0||483",
			"Pacific/Kiritimati|+14|-e0|0||51e2",
			"Etc/GMT-2|+02|-20|0||",
			"Pacific/Tahiti|-10|a0|0||18e4",
			"Pacific/Niue|-11|b0|0||12e2",
			"Etc/GMT+12|-12|c0|0||",
			"Pacific/Galapagos|-06|60|0||25e3",
			"Etc/GMT+7|-07|70|0||",
			"Pacific/Pitcairn|-08|80|0||56",
			"Pacific/Gambier|-09|90|0||125",
			"Etc/UTC|UTC|0|0||",
			"Europe/Ulyanovsk|+03 +04|-30 -40|01|1QyL0|13e5",
			"Europe/London|GMT BST|0 -10|01010101010101010101010|1QyN0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|10e6",
			"Europe/Chisinau|EET EEST|-20 -30|01010101010101010101010|1QyM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|67e4",
			"Europe/Moscow|MSK|-30|0||16e6",
			"Europe/Saratov|+03 +04|-30 -40|01|1Sfz0|",
			"Europe/Volgograd|+03 +04|-30 -40|010|1WQL0 5gn0|10e5",
			"Pacific/Honolulu|HST|a0|0||37e4",
			"MET|MET MEST|-10 -20|01010101010101010101010|1QyN0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|",
			"Pacific/Chatham|+1345 +1245|-dJ -cJ|01010101010101010101010|1QBq0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00|600",
			"Pacific/Apia|+14 +13|-e0 -d0|010101010101|1QBq0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0|37e3",
			"Pacific/Fiji|+13 +12|-d0 -c0|010101010101010101010|1Q6C0 1VA0 s00 1VA0 s00 1VA0 s00 20o0 pc0 2hc0 bc0 4q00 pc0 20o0 pc0 20o0 pc0 20o0 s00 1VA0|88e4",
			"Pacific/Guam|ChST|-a0|0||17e4",
			"Pacific/Marquesas|-0930|9u|0||86e2",
			"Pacific/Pago_Pago|SST|b0|0||37e2",
			"Pacific/Norfolk|+11 +12|-b0 -c0|0101010101010101|219P0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0|25e4",
			"Pacific/Tongatapu|+13 +14|-d0 -e0|010|1S4d0 s00|75e3"
		],
		"links": [
			"Africa/Abidjan|Africa/Accra",
			"Africa/Abidjan|Africa/Bamako",
			"Africa/Abidjan|Africa/Banjul",
			"Africa/Abidjan|Africa/Bissau",
			"Africa/Abidjan|Africa/Conakry",
			"Africa/Abidjan|Africa/Dakar",
			"Africa/Abidjan|Africa/Freetown",
			"Africa/Abidjan|Africa/Lome",
			"Africa/Abidjan|Africa/Monrovia",
			"Africa/Abidjan|Africa/Nouakchott",
			"Africa/Abidjan|Africa/Ouagadougou",
			"Africa/Abidjan|Africa/Timbuktu",
			"Africa/Abidjan|America/Danmarkshavn",
			"Africa/Abidjan|Atlantic/Reykjavik",
			"Africa/Abidjan|Atlantic/St_Helena",
			"Africa/Abidjan|Etc/GMT",
			"Africa/Abidjan|Etc/GMT+0",
			"Africa/Abidjan|Etc/GMT-0",
			"Africa/Abidjan|Etc/GMT0",
			"Africa/Abidjan|Etc/Greenwich",
			"Africa/Abidjan|GMT",
			"Africa/Abidjan|GMT+0",
			"Africa/Abidjan|GMT-0",
			"Africa/Abidjan|GMT0",
			"Africa/Abidjan|Greenwich",
			"Africa/Abidjan|Iceland",
			"Africa/Algiers|Africa/Tunis",
			"Africa/Cairo|Africa/Tripoli",
			"Africa/Cairo|Egypt",
			"Africa/Cairo|Europe/Kaliningrad",
			"Africa/Cairo|Libya",
			"Africa/Casablanca|Africa/El_Aaiun",
			"Africa/Johannesburg|Africa/Maseru",
			"Africa/Johannesburg|Africa/Mbabane",
			"Africa/Lagos|Africa/Bangui",
			"Africa/Lagos|Africa/Brazzaville",
			"Africa/Lagos|Africa/Douala",
			"Africa/Lagos|Africa/Kinshasa",
			"Africa/Lagos|Africa/Libreville",
			"Africa/Lagos|Africa/Luanda",
			"Africa/Lagos|Africa/Malabo",
			"Africa/Lagos|Africa/Ndjamena",
			"Africa/Lagos|Africa/Niamey",
			"Africa/Lagos|Africa/Porto-Novo",
			"Africa/Maputo|Africa/Blantyre",
			"Africa/Maputo|Africa/Bujumbura",
			"Africa/Maputo|Africa/Gaborone",
			"Africa/Maputo|Africa/Harare",
			"Africa/Maputo|Africa/Kigali",
			"Africa/Maputo|Africa/Lubumbashi",
			"Africa/Maputo|Africa/Lusaka",
			"Africa/Nairobi|Africa/Addis_Ababa",
			"Africa/Nairobi|Africa/Asmara",
			"Africa/Nairobi|Africa/Asmera",
			"Africa/Nairobi|Africa/Dar_es_Salaam",
			"Africa/Nairobi|Africa/Djibouti",
			"Africa/Nairobi|Africa/Kampala",
			"Africa/Nairobi|Africa/Mogadishu",
			"Africa/Nairobi|Indian/Antananarivo",
			"Africa/Nairobi|Indian/Comoro",
			"Africa/Nairobi|Indian/Mayotte",
			"America/Adak|America/Atka",
			"America/Adak|US/Aleutian",
			"America/Anchorage|America/Juneau",
			"America/Anchorage|America/Nome",
			"America/Anchorage|America/Sitka",
			"America/Anchorage|America/Yakutat",
			"America/Anchorage|US/Alaska",
			"America/Campo_Grande|America/Cuiaba",
			"America/Chicago|America/Indiana/Knox",
			"America/Chicago|America/Indiana/Tell_City",
			"America/Chicago|America/Knox_IN",
			"America/Chicago|America/Matamoros",
			"America/Chicago|America/Menominee",
			"America/Chicago|America/North_Dakota/Beulah",
			"America/Chicago|America/North_Dakota/Center",
			"America/Chicago|America/North_Dakota/New_Salem",
			"America/Chicago|America/Rainy_River",
			"America/Chicago|America/Rankin_Inlet",
			"America/Chicago|America/Resolute",
			"America/Chicago|America/Winnipeg",
			"America/Chicago|CST6CDT",
			"America/Chicago|Canada/Central",
			"America/Chicago|US/Central",
			"America/Chicago|US/Indiana-Starke",
			"America/Chihuahua|America/Mazatlan",
			"America/Chihuahua|Mexico/BajaSur",
			"America/Denver|America/Boise",
			"America/Denver|America/Cambridge_Bay",
			"America/Denver|America/Edmonton",
			"America/Denver|America/Inuvik",
			"America/Denver|America/Ojinaga",
			"America/Denver|America/Shiprock",
			"America/Denver|America/Yellowknife",
			"America/Denver|Canada/Mountain",
			"America/Denver|MST7MDT",
			"America/Denver|Navajo",
			"America/Denver|US/Mountain",
			"America/Fortaleza|America/Araguaina",
			"America/Fortaleza|America/Argentina/Buenos_Aires",
			"America/Fortaleza|America/Argentina/Catamarca",
			"America/Fortaleza|America/Argentina/ComodRivadavia",
			"America/Fortaleza|America/Argentina/Cordoba",
			"America/Fortaleza|America/Argentina/Jujuy",
			"America/Fortaleza|America/Argentina/La_Rioja",
			"America/Fortaleza|America/Argentina/Mendoza",
			"America/Fortaleza|America/Argentina/Rio_Gallegos",
			"America/Fortaleza|America/Argentina/Salta",
			"America/Fortaleza|America/Argentina/San_Juan",
			"America/Fortaleza|America/Argentina/San_Luis",
			"America/Fortaleza|America/Argentina/Tucuman",
			"America/Fortaleza|America/Argentina/Ushuaia",
			"America/Fortaleza|America/Bahia",
			"America/Fortaleza|America/Belem",
			"America/Fortaleza|America/Buenos_Aires",
			"America/Fortaleza|America/Catamarca",
			"America/Fortaleza|America/Cayenne",
			"America/Fortaleza|America/Cordoba",
			"America/Fortaleza|America/Jujuy",
			"America/Fortaleza|America/Maceio",
			"America/Fortaleza|America/Mendoza",
			"America/Fortaleza|America/Montevideo",
			"America/Fortaleza|America/Paramaribo",
			"America/Fortaleza|America/Recife",
			"America/Fortaleza|America/Rosario",
			"America/Fortaleza|America/Santarem",
			"America/Fortaleza|Antarctica/Rothera",
			"America/Fortaleza|Atlantic/Stanley",
			"America/Fortaleza|Etc/GMT+3",
			"America/Godthab|America/Nuuk",
			"America/Halifax|America/Glace_Bay",
			"America/Halifax|America/Goose_Bay",
			"America/Halifax|America/Moncton",
			"America/Halifax|America/Thule",
			"America/Halifax|Atlantic/Bermuda",
			"America/Halifax|Canada/Atlantic",
			"America/Havana|Cuba",
			"America/La_Paz|America/Boa_Vista",
			"America/La_Paz|America/Guyana",
			"America/La_Paz|America/Manaus",
			"America/La_Paz|America/Porto_Velho",
			"America/La_Paz|Brazil/West",
			"America/La_Paz|Etc/GMT+4",
			"America/Lima|America/Bogota",
			"America/Lima|America/Eirunepe",
			"America/Lima|America/Guayaquil",
			"America/Lima|America/Porto_Acre",
			"America/Lima|America/Rio_Branco",
			"America/Lima|Brazil/Acre",
			"America/Lima|Etc/GMT+5",
			"America/Los_Angeles|America/Ensenada",
			"America/Los_Angeles|America/Santa_Isabel",
			"America/Los_Angeles|America/Tijuana",
			"America/Los_Angeles|America/Vancouver",
			"America/Los_Angeles|Canada/Pacific",
			"America/Los_Angeles|Mexico/BajaNorte",
			"America/Los_Angeles|PST8PDT",
			"America/Los_Angeles|US/Pacific",
			"America/Managua|America/Belize",
			"America/Managua|America/Costa_Rica",
			"America/Managua|America/El_Salvador",
			"America/Managua|America/Guatemala",
			"America/Managua|America/Regina",
			"America/Managua|America/Swift_Current",
			"America/Managua|America/Tegucigalpa",
			"America/Managua|Canada/Saskatchewan",
			"America/Mexico_City|America/Bahia_Banderas",
			"America/Mexico_City|America/Merida",
			"America/Mexico_City|America/Monterrey",
			"America/Mexico_City|Mexico/General",
			"America/New_York|America/Detroit",
			"America/New_York|America/Fort_Wayne",
			"America/New_York|America/Indiana/Indianapolis",
			"America/New_York|America/Indiana/Marengo",
			"America/New_York|America/Indiana/Petersburg",
			"America/New_York|America/Indiana/Vevay",
			"America/New_York|America/Indiana/Vincennes",
			"America/New_York|America/Indiana/Winamac",
			"America/New_York|America/Indianapolis",
			"America/New_York|America/Iqaluit",
			"America/New_York|America/Kentucky/Louisville",
			"America/New_York|America/Kentucky/Monticello",
			"America/New_York|America/Louisville",
			"America/New_York|America/Montreal",
			"America/New_York|America/Nassau",
			"America/New_York|America/Nipigon",
			"America/New_York|America/Pangnirtung",
			"America/New_York|America/Thunder_Bay",
			"America/New_York|America/Toronto",
			"America/New_York|Canada/Eastern",
			"America/New_York|EST5EDT",
			"America/New_York|US/East-Indiana",
			"America/New_York|US/Eastern",
			"America/New_York|US/Michigan",
			"America/Noronha|Atlantic/South_Georgia",
			"America/Noronha|Brazil/DeNoronha",
			"America/Noronha|Etc/GMT+2",
			"America/Panama|America/Atikokan",
			"America/Panama|America/Cancun",
			"America/Panama|America/Cayman",
			"America/Panama|America/Coral_Harbour",
			"America/Panama|America/Jamaica",
			"America/Panama|EST",
			"America/Panama|Jamaica",
			"America/Phoenix|America/Creston",
			"America/Phoenix|America/Dawson_Creek",
			"America/Phoenix|America/Fort_Nelson",
			"America/Phoenix|America/Hermosillo",
			"America/Phoenix|MST",
			"America/Phoenix|US/Arizona",
			"America/Santiago|Chile/Continental",
			"America/Santo_Domingo|America/Anguilla",
			"America/Santo_Domingo|America/Antigua",
			"America/Santo_Domingo|America/Aruba",
			"America/Santo_Domingo|America/Barbados",
			"America/Santo_Domingo|America/Blanc-Sablon",
			"America/Santo_Domingo|America/Curacao",
			"America/Santo_Domingo|America/Dominica",
			"America/Santo_Domingo|America/Grenada",
			"America/Santo_Domingo|America/Guadeloupe",
			"America/Santo_Domingo|America/Kralendijk",
			"America/Santo_Domingo|America/Lower_Princes",
			"America/Santo_Domingo|America/Marigot",
			"America/Santo_Domingo|America/Martinique",
			"America/Santo_Domingo|America/Montserrat",
			"America/Santo_Domingo|America/Port_of_Spain",
			"America/Santo_Domingo|America/Puerto_Rico",
			"America/Santo_Domingo|America/St_Barthelemy",
			"America/Santo_Domingo|America/St_Kitts",
			"America/Santo_Domingo|America/St_Lucia",
			"America/Santo_Domingo|America/St_Thomas",
			"America/Santo_Domingo|America/St_Vincent",
			"America/Santo_Domingo|America/Tortola",
			"America/Santo_Domingo|America/Virgin",
			"America/Sao_Paulo|Brazil/East",
			"America/St_Johns|Canada/Newfoundland",
			"America/Whitehorse|America/Dawson",
			"America/Whitehorse|Canada/Yukon",
			"Antarctica/Palmer|America/Punta_Arenas",
			"Asia/Baghdad|Antarctica/Syowa",
			"Asia/Baghdad|Asia/Aden",
			"Asia/Baghdad|Asia/Bahrain",
			"Asia/Baghdad|Asia/Kuwait",
			"Asia/Baghdad|Asia/Qatar",
			"Asia/Baghdad|Asia/Riyadh",
			"Asia/Baghdad|Etc/GMT-3",
			"Asia/Baghdad|Europe/Kirov",
			"Asia/Baghdad|Europe/Minsk",
			"Asia/Bangkok|Antarctica/Davis",
			"Asia/Bangkok|Asia/Ho_Chi_Minh",
			"Asia/Bangkok|Asia/Krasnoyarsk",
			"Asia/Bangkok|Asia/Novokuznetsk",
			"Asia/Bangkok|Asia/Phnom_Penh",
			"Asia/Bangkok|Asia/Saigon",
			"Asia/Bangkok|Asia/Vientiane",
			"Asia/Bangkok|Etc/GMT-7",
			"Asia/Bangkok|Indian/Christmas",
			"Asia/Dhaka|Antarctica/Vostok",
			"Asia/Dhaka|Asia/Almaty",
			"Asia/Dhaka|Asia/Bishkek",
			"Asia/Dhaka|Asia/Dacca",
			"Asia/Dhaka|Asia/Kashgar",
			"Asia/Dhaka|Asia/Omsk",
			"Asia/Dhaka|Asia/Qostanay",
			"Asia/Dhaka|Asia/Thimbu",
			"Asia/Dhaka|Asia/Thimphu",
			"Asia/Dhaka|Asia/Urumqi",
			"Asia/Dhaka|Etc/GMT-6",
			"Asia/Dhaka|Indian/Chagos",
			"Asia/Dubai|Asia/Baku",
			"Asia/Dubai|Asia/Muscat",
			"Asia/Dubai|Asia/Tbilisi",
			"Asia/Dubai|Asia/Yerevan",
			"Asia/Dubai|Etc/GMT-4",
			"Asia/Dubai|Europe/Samara",
			"Asia/Dubai|Indian/Mahe",
			"Asia/Dubai|Indian/Mauritius",
			"Asia/Dubai|Indian/Reunion",
			"Asia/Gaza|Asia/Hebron",
			"Asia/Hong_Kong|Hongkong",
			"Asia/Jakarta|Asia/Pontianak",
			"Asia/Jerusalem|Asia/Tel_Aviv",
			"Asia/Jerusalem|Israel",
			"Asia/Kamchatka|Asia/Anadyr",
			"Asia/Kamchatka|Etc/GMT-12",
			"Asia/Kamchatka|Kwajalein",
			"Asia/Kamchatka|Pacific/Funafuti",
			"Asia/Kamchatka|Pacific/Kwajalein",
			"Asia/Kamchatka|Pacific/Majuro",
			"Asia/Kamchatka|Pacific/Nauru",
			"Asia/Kamchatka|Pacific/Tarawa",
			"Asia/Kamchatka|Pacific/Wake",
			"Asia/Kamchatka|Pacific/Wallis",
			"Asia/Kathmandu|Asia/Katmandu",
			"Asia/Kolkata|Asia/Calcutta",
			"Asia/Kuala_Lumpur|Asia/Brunei",
			"Asia/Kuala_Lumpur|Asia/Irkutsk",
			"Asia/Kuala_Lumpur|Asia/Kuching",
			"Asia/Kuala_Lumpur|Asia/Singapore",
			"Asia/Kuala_Lumpur|Etc/GMT-8",
			"Asia/Kuala_Lumpur|Singapore",
			"Asia/Makassar|Asia/Ujung_Pandang",
			"Asia/Rangoon|Asia/Yangon",
			"Asia/Rangoon|Indian/Cocos",
			"Asia/Seoul|ROK",
			"Asia/Shanghai|Asia/Chongqing",
			"Asia/Shanghai|Asia/Chungking",
			"Asia/Shanghai|Asia/Harbin",
			"Asia/Shanghai|Asia/Macao",
			"Asia/Shanghai|Asia/Macau",
			"Asia/Shanghai|Asia/Taipei",
			"Asia/Shanghai|PRC",
			"Asia/Shanghai|ROC",
			"Asia/Tashkent|Antarctica/Mawson",
			"Asia/Tashkent|Asia/Aqtau",
			"Asia/Tashkent|Asia/Aqtobe",
			"Asia/Tashkent|Asia/Ashgabat",
			"Asia/Tashkent|Asia/Ashkhabad",
			"Asia/Tashkent|Asia/Atyrau",
			"Asia/Tashkent|Asia/Dushanbe",
			"Asia/Tashkent|Asia/Oral",
			"Asia/Tashkent|Asia/Samarkand",
			"Asia/Tashkent|Asia/Yekaterinburg",
			"Asia/Tashkent|Etc/GMT-5",
			"Asia/Tashkent|Indian/Kerguelen",
			"Asia/Tashkent|Indian/Maldives",
			"Asia/Tehran|Iran",
			"Asia/Tokyo|Japan",
			"Asia/Ulaanbaatar|Asia/Choibalsan",
			"Asia/Ulaanbaatar|Asia/Ulan_Bator",
			"Asia/Vladivostok|Antarctica/DumontDUrville",
			"Asia/Vladivostok|Asia/Ust-Nera",
			"Asia/Vladivostok|Etc/GMT-10",
			"Asia/Vladivostok|Pacific/Chuuk",
			"Asia/Vladivostok|Pacific/Port_Moresby",
			"Asia/Vladivostok|Pacific/Truk",
			"Asia/Vladivostok|Pacific/Yap",
			"Asia/Yakutsk|Asia/Dili",
			"Asia/Yakutsk|Asia/Khandyga",
			"Asia/Yakutsk|Etc/GMT-9",
			"Asia/Yakutsk|Pacific/Palau",
			"Atlantic/Azores|America/Scoresbysund",
			"Atlantic/Cape_Verde|Etc/GMT+1",
			"Australia/Adelaide|Australia/Broken_Hill",
			"Australia/Adelaide|Australia/South",
			"Australia/Adelaide|Australia/Yancowinna",
			"Australia/Brisbane|Australia/Lindeman",
			"Australia/Brisbane|Australia/Queensland",
			"Australia/Darwin|Australia/North",
			"Australia/Lord_Howe|Australia/LHI",
			"Australia/Perth|Australia/West",
			"Australia/Sydney|Antarctica/Macquarie",
			"Australia/Sydney|Australia/ACT",
			"Australia/Sydney|Australia/Canberra",
			"Australia/Sydney|Australia/Currie",
			"Australia/Sydney|Australia/Hobart",
			"Australia/Sydney|Australia/Melbourne",
			"Australia/Sydney|Australia/NSW",
			"Australia/Sydney|Australia/Tasmania",
			"Australia/Sydney|Australia/Victoria",
			"Etc/UTC|Etc/UCT",
			"Etc/UTC|Etc/Universal",
			"Etc/UTC|Etc/Zulu",
			"Etc/UTC|UCT",
			"Etc/UTC|UTC",
			"Etc/UTC|Universal",
			"Etc/UTC|Zulu",
			"Europe/Athens|Asia/Nicosia",
			"Europe/Athens|EET",
			"Europe/Athens|Europe/Bucharest",
			"Europe/Athens|Europe/Helsinki",
			"Europe/Athens|Europe/Kiev",
			"Europe/Athens|Europe/Mariehamn",
			"Europe/Athens|Europe/Nicosia",
			"Europe/Athens|Europe/Riga",
			"Europe/Athens|Europe/Sofia",
			"Europe/Athens|Europe/Tallinn",
			"Europe/Athens|Europe/Uzhgorod",
			"Europe/Athens|Europe/Vilnius",
			"Europe/Athens|Europe/Zaporozhye",
			"Europe/Chisinau|Europe/Tiraspol",
			"Europe/Dublin|Eire",
			"Europe/Istanbul|Asia/Istanbul",
			"Europe/Istanbul|Turkey",
			"Europe/Lisbon|Atlantic/Canary",
			"Europe/Lisbon|Atlantic/Faeroe",
			"Europe/Lisbon|Atlantic/Faroe",
			"Europe/Lisbon|Atlantic/Madeira",
			"Europe/Lisbon|Portugal",
			"Europe/Lisbon|WET",
			"Europe/London|Europe/Belfast",
			"Europe/London|Europe/Guernsey",
			"Europe/London|Europe/Isle_of_Man",
			"Europe/London|Europe/Jersey",
			"Europe/London|GB",
			"Europe/London|GB-Eire",
			"Europe/Moscow|Europe/Simferopol",
			"Europe/Moscow|W-SU",
			"Europe/Paris|Africa/Ceuta",
			"Europe/Paris|Arctic/Longyearbyen",
			"Europe/Paris|Atlantic/Jan_Mayen",
			"Europe/Paris|CET",
			"Europe/Paris|Europe/Amsterdam",
			"Europe/Paris|Europe/Andorra",
			"Europe/Paris|Europe/Belgrade",
			"Europe/Paris|Europe/Berlin",
			"Europe/Paris|Europe/Bratislava",
			"Europe/Paris|Europe/Brussels",
			"Europe/Paris|Europe/Budapest",
			"Europe/Paris|Europe/Busingen",
			"Europe/Paris|Europe/Copenhagen",
			"Europe/Paris|Europe/Gibraltar",
			"Europe/Paris|Europe/Ljubljana",
			"Europe/Paris|Europe/Luxembourg",
			"Europe/Paris|Europe/Madrid",
			"Europe/Paris|Europe/Malta",
			"Europe/Paris|Europe/Monaco",
			"Europe/Paris|Europe/Oslo",
			"Europe/Paris|Europe/Podgorica",
			"Europe/Paris|Europe/Prague",
			"Europe/Paris|Europe/Rome",
			"Europe/Paris|Europe/San_Marino",
			"Europe/Paris|Europe/Sarajevo",
			"Europe/Paris|Europe/Skopje",
			"Europe/Paris|Europe/Stockholm",
			"Europe/Paris|Europe/Tirane",
			"Europe/Paris|Europe/Vaduz",
			"Europe/Paris|Europe/Vatican",
			"Europe/Paris|Europe/Vienna",
			"Europe/Paris|Europe/Warsaw",
			"Europe/Paris|Europe/Zagreb",
			"Europe/Paris|Europe/Zurich",
			"Europe/Paris|Poland",
			"Europe/Ulyanovsk|Europe/Astrakhan",
			"Pacific/Auckland|Antarctica/McMurdo",
			"Pacific/Auckland|Antarctica/South_Pole",
			"Pacific/Auckland|NZ",
			"Pacific/Bougainville|Asia/Srednekolymsk",
			"Pacific/Bougainville|Etc/GMT-11",
			"Pacific/Bougainville|Pacific/Efate",
			"Pacific/Bougainville|Pacific/Guadalcanal",
			"Pacific/Bougainville|Pacific/Kosrae",
			"Pacific/Bougainville|Pacific/Noumea",
			"Pacific/Bougainville|Pacific/Pohnpei",
			"Pacific/Bougainville|Pacific/Ponape",
			"Pacific/Chatham|NZ-CHAT",
			"Pacific/Easter|Chile/EasterIsland",
			"Pacific/Fakaofo|Etc/GMT-13",
			"Pacific/Fakaofo|Pacific/Enderbury",
			"Pacific/Fakaofo|Pacific/Kanton",
			"Pacific/Galapagos|Etc/GMT+6",
			"Pacific/Gambier|Etc/GMT+9",
			"Pacific/Guam|Pacific/Saipan",
			"Pacific/Honolulu|HST",
			"Pacific/Honolulu|Pacific/Johnston",
			"Pacific/Honolulu|US/Hawaii",
			"Pacific/Kiritimati|Etc/GMT-14",
			"Pacific/Niue|Etc/GMT+11",
			"Pacific/Pago_Pago|Pacific/Midway",
			"Pacific/Pago_Pago|Pacific/Samoa",
			"Pacific/Pago_Pago|US/Samoa",
			"Pacific/Pitcairn|Etc/GMT+8",
			"Pacific/Tahiti|Etc/GMT+10",
			"Pacific/Tahiti|Pacific/Rarotonga"
		],
		"countries": [
			"AD|Europe/Andorra",
			"AE|Asia/Dubai",
			"AF|Asia/Kabul",
			"AG|America/Port_of_Spain America/Antigua",
			"AI|America/Port_of_Spain America/Anguilla",
			"AL|Europe/Tirane",
			"AM|Asia/Yerevan",
			"AO|Africa/Lagos Africa/Luanda",
			"AQ|Antarctica/Casey Antarctica/Davis Antarctica/DumontDUrville Antarctica/Mawson Antarctica/Palmer Antarctica/Rothera Antarctica/Syowa Antarctica/Troll Antarctica/Vostok Pacific/Auckland Antarctica/McMurdo",
			"AR|America/Argentina/Buenos_Aires America/Argentina/Cordoba America/Argentina/Salta America/Argentina/Jujuy America/Argentina/Tucuman America/Argentina/Catamarca America/Argentina/La_Rioja America/Argentina/San_Juan America/Argentina/Mendoza America/Argentina/San_Luis America/Argentina/Rio_Gallegos America/Argentina/Ushuaia",
			"AS|Pacific/Pago_Pago",
			"AT|Europe/Vienna",
			"AU|Australia/Lord_Howe Antarctica/Macquarie Australia/Hobart Australia/Melbourne Australia/Sydney Australia/Broken_Hill Australia/Brisbane Australia/Lindeman Australia/Adelaide Australia/Darwin Australia/Perth Australia/Eucla",
			"AW|America/Curacao America/Aruba",
			"AX|Europe/Helsinki Europe/Mariehamn",
			"AZ|Asia/Baku",
			"BA|Europe/Belgrade Europe/Sarajevo",
			"BB|America/Barbados",
			"BD|Asia/Dhaka",
			"BE|Europe/Brussels",
			"BF|Africa/Abidjan Africa/Ouagadougou",
			"BG|Europe/Sofia",
			"BH|Asia/Qatar Asia/Bahrain",
			"BI|Africa/Maputo Africa/Bujumbura",
			"BJ|Africa/Lagos Africa/Porto-Novo",
			"BL|America/Port_of_Spain America/St_Barthelemy",
			"BM|Atlantic/Bermuda",
			"BN|Asia/Brunei",
			"BO|America/La_Paz",
			"BQ|America/Curacao America/Kralendijk",
			"BR|America/Noronha America/Belem America/Fortaleza America/Recife America/Araguaina America/Maceio America/Bahia America/Sao_Paulo America/Campo_Grande America/Cuiaba America/Santarem America/Porto_Velho America/Boa_Vista America/Manaus America/Eirunepe America/Rio_Branco",
			"BS|America/Nassau",
			"BT|Asia/Thimphu",
			"BW|Africa/Maputo Africa/Gaborone",
			"BY|Europe/Minsk",
			"BZ|America/Belize",
			"CA|America/St_Johns America/Halifax America/Glace_Bay America/Moncton America/Goose_Bay America/Blanc-Sablon America/Toronto America/Nipigon America/Thunder_Bay America/Iqaluit America/Pangnirtung America/Atikokan America/Winnipeg America/Rainy_River America/Resolute America/Rankin_Inlet America/Regina America/Swift_Current America/Edmonton America/Cambridge_Bay America/Yellowknife America/Inuvik America/Creston America/Dawson_Creek America/Fort_Nelson America/Whitehorse America/Dawson America/Vancouver",
			"CC|Indian/Cocos",
			"CD|Africa/Maputo Africa/Lagos Africa/Kinshasa Africa/Lubumbashi",
			"CF|Africa/Lagos Africa/Bangui",
			"CG|Africa/Lagos Africa/Brazzaville",
			"CH|Europe/Zurich",
			"CI|Africa/Abidjan",
			"CK|Pacific/Rarotonga",
			"CL|America/Santiago America/Punta_Arenas Pacific/Easter",
			"CM|Africa/Lagos Africa/Douala",
			"CN|Asia/Shanghai Asia/Urumqi",
			"CO|America/Bogota",
			"CR|America/Costa_Rica",
			"CU|America/Havana",
			"CV|Atlantic/Cape_Verde",
			"CW|America/Curacao",
			"CX|Indian/Christmas",
			"CY|Asia/Nicosia Asia/Famagusta",
			"CZ|Europe/Prague",
			"DE|Europe/Zurich Europe/Berlin Europe/Busingen",
			"DJ|Africa/Nairobi Africa/Djibouti",
			"DK|Europe/Copenhagen",
			"DM|America/Port_of_Spain America/Dominica",
			"DO|America/Santo_Domingo",
			"DZ|Africa/Algiers",
			"EC|America/Guayaquil Pacific/Galapagos",
			"EE|Europe/Tallinn",
			"EG|Africa/Cairo",
			"EH|Africa/El_Aaiun",
			"ER|Africa/Nairobi Africa/Asmara",
			"ES|Europe/Madrid Africa/Ceuta Atlantic/Canary",
			"ET|Africa/Nairobi Africa/Addis_Ababa",
			"FI|Europe/Helsinki",
			"FJ|Pacific/Fiji",
			"FK|Atlantic/Stanley",
			"FM|Pacific/Chuuk Pacific/Pohnpei Pacific/Kosrae",
			"FO|Atlantic/Faroe",
			"FR|Europe/Paris",
			"GA|Africa/Lagos Africa/Libreville",
			"GB|Europe/London",
			"GD|America/Port_of_Spain America/Grenada",
			"GE|Asia/Tbilisi",
			"GF|America/Cayenne",
			"GG|Europe/London Europe/Guernsey",
			"GH|Africa/Accra",
			"GI|Europe/Gibraltar",
			"GL|America/Nuuk America/Danmarkshavn America/Scoresbysund America/Thule",
			"GM|Africa/Abidjan Africa/Banjul",
			"GN|Africa/Abidjan Africa/Conakry",
			"GP|America/Port_of_Spain America/Guadeloupe",
			"GQ|Africa/Lagos Africa/Malabo",
			"GR|Europe/Athens",
			"GS|Atlantic/South_Georgia",
			"GT|America/Guatemala",
			"GU|Pacific/Guam",
			"GW|Africa/Bissau",
			"GY|America/Guyana",
			"HK|Asia/Hong_Kong",
			"HN|America/Tegucigalpa",
			"HR|Europe/Belgrade Europe/Zagreb",
			"HT|America/Port-au-Prince",
			"HU|Europe/Budapest",
			"ID|Asia/Jakarta Asia/Pontianak Asia/Makassar Asia/Jayapura",
			"IE|Europe/Dublin",
			"IL|Asia/Jerusalem",
			"IM|Europe/London Europe/Isle_of_Man",
			"IN|Asia/Kolkata",
			"IO|Indian/Chagos",
			"IQ|Asia/Baghdad",
			"IR|Asia/Tehran",
			"IS|Atlantic/Reykjavik",
			"IT|Europe/Rome",
			"JE|Europe/London Europe/Jersey",
			"JM|America/Jamaica",
			"JO|Asia/Amman",
			"JP|Asia/Tokyo",
			"KE|Africa/Nairobi",
			"KG|Asia/Bishkek",
			"KH|Asia/Bangkok Asia/Phnom_Penh",
			"KI|Pacific/Tarawa Pacific/Enderbury Pacific/Kiritimati",
			"KM|Africa/Nairobi Indian/Comoro",
			"KN|America/Port_of_Spain America/St_Kitts",
			"KP|Asia/Pyongyang",
			"KR|Asia/Seoul",
			"KW|Asia/Riyadh Asia/Kuwait",
			"KY|America/Panama America/Cayman",
			"KZ|Asia/Almaty Asia/Qyzylorda Asia/Qostanay Asia/Aqtobe Asia/Aqtau Asia/Atyrau Asia/Oral",
			"LA|Asia/Bangkok Asia/Vientiane",
			"LB|Asia/Beirut",
			"LC|America/Port_of_Spain America/St_Lucia",
			"LI|Europe/Zurich Europe/Vaduz",
			"LK|Asia/Colombo",
			"LR|Africa/Monrovia",
			"LS|Africa/Johannesburg Africa/Maseru",
			"LT|Europe/Vilnius",
			"LU|Europe/Luxembourg",
			"LV|Europe/Riga",
			"LY|Africa/Tripoli",
			"MA|Africa/Casablanca",
			"MC|Europe/Monaco",
			"MD|Europe/Chisinau",
			"ME|Europe/Belgrade Europe/Podgorica",
			"MF|America/Port_of_Spain America/Marigot",
			"MG|Africa/Nairobi Indian/Antananarivo",
			"MH|Pacific/Majuro Pacific/Kwajalein",
			"MK|Europe/Belgrade Europe/Skopje",
			"ML|Africa/Abidjan Africa/Bamako",
			"MM|Asia/Yangon",
			"MN|Asia/Ulaanbaatar Asia/Hovd Asia/Choibalsan",
			"MO|Asia/Macau",
			"MP|Pacific/Guam Pacific/Saipan",
			"MQ|America/Martinique",
			"MR|Africa/Abidjan Africa/Nouakchott",
			"MS|America/Port_of_Spain America/Montserrat",
			"MT|Europe/Malta",
			"MU|Indian/Mauritius",
			"MV|Indian/Maldives",
			"MW|Africa/Maputo Africa/Blantyre",
			"MX|America/Mexico_City America/Cancun America/Merida America/Monterrey America/Matamoros America/Mazatlan America/Chihuahua America/Ojinaga America/Hermosillo America/Tijuana America/Bahia_Banderas",
			"MY|Asia/Kuala_Lumpur Asia/Kuching",
			"MZ|Africa/Maputo",
			"NA|Africa/Windhoek",
			"NC|Pacific/Noumea",
			"NE|Africa/Lagos Africa/Niamey",
			"NF|Pacific/Norfolk",
			"NG|Africa/Lagos",
			"NI|America/Managua",
			"NL|Europe/Amsterdam",
			"NO|Europe/Oslo",
			"NP|Asia/Kathmandu",
			"NR|Pacific/Nauru",
			"NU|Pacific/Niue",
			"NZ|Pacific/Auckland Pacific/Chatham",
			"OM|Asia/Dubai Asia/Muscat",
			"PA|America/Panama",
			"PE|America/Lima",
			"PF|Pacific/Tahiti Pacific/Marquesas Pacific/Gambier",
			"PG|Pacific/Port_Moresby Pacific/Bougainville",
			"PH|Asia/Manila",
			"PK|Asia/Karachi",
			"PL|Europe/Warsaw",
			"PM|America/Miquelon",
			"PN|Pacific/Pitcairn",
			"PR|America/Puerto_Rico",
			"PS|Asia/Gaza Asia/Hebron",
			"PT|Europe/Lisbon Atlantic/Madeira Atlantic/Azores",
			"PW|Pacific/Palau",
			"PY|America/Asuncion",
			"QA|Asia/Qatar",
			"RE|Indian/Reunion",
			"RO|Europe/Bucharest",
			"RS|Europe/Belgrade",
			"RU|Europe/Kaliningrad Europe/Moscow Europe/Simferopol Europe/Kirov Europe/Volgograd Europe/Astrakhan Europe/Saratov Europe/Ulyanovsk Europe/Samara Asia/Yekaterinburg Asia/Omsk Asia/Novosibirsk Asia/Barnaul Asia/Tomsk Asia/Novokuznetsk Asia/Krasnoyarsk Asia/Irkutsk Asia/Chita Asia/Yakutsk Asia/Khandyga Asia/Vladivostok Asia/Ust-Nera Asia/Magadan Asia/Sakhalin Asia/Srednekolymsk Asia/Kamchatka Asia/Anadyr",
			"RW|Africa/Maputo Africa/Kigali",
			"SA|Asia/Riyadh",
			"SB|Pacific/Guadalcanal",
			"SC|Indian/Mahe",
			"SD|Africa/Khartoum",
			"SE|Europe/Stockholm",
			"SG|Asia/Singapore",
			"SH|Africa/Abidjan Atlantic/St_Helena",
			"SI|Europe/Belgrade Europe/Ljubljana",
			"SJ|Europe/Oslo Arctic/Longyearbyen",
			"SK|Europe/Prague Europe/Bratislava",
			"SL|Africa/Abidjan Africa/Freetown",
			"SM|Europe/Rome Europe/San_Marino",
			"SN|Africa/Abidjan Africa/Dakar",
			"SO|Africa/Nairobi Africa/Mogadishu",
			"SR|America/Paramaribo",
			"SS|Africa/Juba",
			"ST|Africa/Sao_Tome",
			"SV|America/El_Salvador",
			"SX|America/Curacao America/Lower_Princes",
			"SY|Asia/Damascus",
			"SZ|Africa/Johannesburg Africa/Mbabane",
			"TC|America/Grand_Turk",
			"TD|Africa/Ndjamena",
			"TF|Indian/Reunion Indian/Kerguelen",
			"TG|Africa/Abidjan Africa/Lome",
			"TH|Asia/Bangkok",
			"TJ|Asia/Dushanbe",
			"TK|Pacific/Fakaofo",
			"TL|Asia/Dili",
			"TM|Asia/Ashgabat",
			"TN|Africa/Tunis",
			"TO|Pacific/Tongatapu",
			"TR|Europe/Istanbul",
			"TT|America/Port_of_Spain",
			"TV|Pacific/Funafuti",
			"TW|Asia/Taipei",
			"TZ|Africa/Nairobi Africa/Dar_es_Salaam",
			"UA|Europe/Simferopol Europe/Kiev Europe/Uzhgorod Europe/Zaporozhye",
			"UG|Africa/Nairobi Africa/Kampala",
			"UM|Pacific/Pago_Pago Pacific/Wake Pacific/Honolulu Pacific/Midway",
			"US|America/New_York America/Detroit America/Kentucky/Louisville America/Kentucky/Monticello America/Indiana/Indianapolis America/Indiana/Vincennes America/Indiana/Winamac America/Indiana/Marengo America/Indiana/Petersburg America/Indiana/Vevay America/Chicago America/Indiana/Tell_City America/Indiana/Knox America/Menominee America/North_Dakota/Center America/North_Dakota/New_Salem America/North_Dakota/Beulah America/Denver America/Boise America/Phoenix America/Los_Angeles America/Anchorage America/Juneau America/Sitka America/Metlakatla America/Yakutat America/Nome America/Adak Pacific/Honolulu",
			"UY|America/Montevideo",
			"UZ|Asia/Samarkand Asia/Tashkent",
			"VA|Europe/Rome Europe/Vatican",
			"VC|America/Port_of_Spain America/St_Vincent",
			"VE|America/Caracas",
			"VG|America/Port_of_Spain America/Tortola",
			"VI|America/Port_of_Spain America/St_Thomas",
			"VN|Asia/Bangkok Asia/Ho_Chi_Minh",
			"VU|Pacific/Efate",
			"WF|Pacific/Wallis",
			"WS|Pacific/Apia",
			"YE|Asia/Riyadh Asia/Aden",
			"YT|Africa/Nairobi Indian/Mayotte",
			"ZA|Africa/Johannesburg",
			"ZM|Africa/Maputo Africa/Lusaka",
			"ZW|Africa/Maputo Africa/Harare"
		]
	});


	return moment;
}));
!function(a,i){"use strict";"object"==typeof module&&module.exports?module.exports=i(require("moment")):"function"==typeof define&&define.amd?define(["moment"],i):i(a.moment)}(this,function(c){"use strict";void 0===c.version&&c.default&&(c=c.default);var i,A={},n={},t={},s={},u={};c&&"string"==typeof c.version||y("Moment Timezone requires Moment.js. See https://momentjs.com/timezone/docs/#/use-it/browser/");var a=c.version.split("."),e=+a[0],r=+a[1];function m(a){return 96<a?a-87:64<a?a-29:a-48}function o(a){var i=0,e=a.split("."),r=e[0],o=e[1]||"",c=1,A=0,n=1;for(45===a.charCodeAt(0)&&(n=-(i=1));i<r.length;i++)A=60*A+m(r.charCodeAt(i));for(i=0;i<o.length;i++)c/=60,A+=m(o.charCodeAt(i))*c;return A*n}function f(a){for(var i=0;i<a.length;i++)a[i]=o(a[i])}function l(a,i){var e,r=[];for(e=0;e<i.length;e++)r[e]=a[i[e]];return r}function p(a){var i=a.split("|"),e=i[2].split(" "),r=i[3].split(""),o=i[4].split(" ");return f(e),f(r),f(o),function(a,i){for(var e=0;e<i;e++)a[e]=Math.round((a[e-1]||0)+6e4*a[e]);a[i-1]=1/0}(o,r.length),{name:i[0],abbrs:l(i[1].split(" "),r),offsets:l(e,r),untils:o,population:0|i[5]}}function M(a){a&&this._set(p(a))}function b(a,i){this.name=a,this.zones=i}function d(a){var i=a.toTimeString(),e=i.match(/\([a-z ]+\)/i);"GMT"===(e=e&&e[0]?(e=e[0].match(/[A-Z]/g))?e.join(""):void 0:(e=i.match(/[A-Z]{3,5}/g))?e[0]:void 0)&&(e=void 0),this.at=+a,this.abbr=e,this.offset=a.getTimezoneOffset()}function h(a){this.zone=a,this.offsetScore=0,this.abbrScore=0}function g(a,i){for(var e,r;r=6e4*((i.at-a.at)/12e4|0);)(e=new d(new Date(a.at+r))).offset===a.offset?a=e:i=e;return a}function E(a,i){return a.offsetScore!==i.offsetScore?a.offsetScore-i.offsetScore:a.abbrScore!==i.abbrScore?a.abbrScore-i.abbrScore:a.zone.population!==i.zone.population?i.zone.population-a.zone.population:i.zone.name.localeCompare(a.zone.name)}function z(a,i){var e,r;for(f(i),e=0;e<i.length;e++)r=i[e],u[r]=u[r]||{},u[r][a]=!0}function P(){try{var a=Intl.DateTimeFormat().resolvedOptions().timeZone;if(a&&3<a.length){var i=s[S(a)];if(i)return i;y("Moment Timezone found "+a+" from the Intl api, but did not have that data loaded.")}}catch(a){}var e,r,o,c=function(){var a,i,e,r=(new Date).getFullYear()-2,o=new d(new Date(r,0,1)),c=[o];for(e=1;e<48;e++)(i=new d(new Date(r,e,1))).offset!==o.offset&&(a=g(o,i),c.push(a),c.push(new d(new Date(a.at+6e4)))),o=i;for(e=0;e<4;e++)c.push(new d(new Date(r+e,0,1))),c.push(new d(new Date(r+e,6,1)));return c}(),A=c.length,n=function(a){var i,e,r,o=a.length,c={},A=[];for(i=0;i<o;i++)for(e in r=u[a[i].offset]||{})r.hasOwnProperty(e)&&(c[e]=!0);for(i in c)c.hasOwnProperty(i)&&A.push(s[i]);return A}(c),t=[];for(r=0;r<n.length;r++){for(e=new h(_(n[r]),A),o=0;o<A;o++)e.scoreOffsetAt(c[o]);t.push(e)}return t.sort(E),0<t.length?t[0].zone.name:void 0}function S(a){return(a||"").toLowerCase().replace(/\//g,"_")}function T(a){var i,e,r,o;for("string"==typeof a&&(a=[a]),i=0;i<a.length;i++)o=S(e=(r=a[i].split("|"))[0]),A[o]=a[i],s[o]=e,z(o,r[2].split(" "))}function _(a,i){a=S(a);var e,r=A[a];return r instanceof M?r:"string"==typeof r?(r=new M(r),A[a]=r):n[a]&&i!==_&&(e=_(n[a],_))?((r=A[a]=new M)._set(e),r.name=s[a],r):null}function k(a){var i,e,r,o;for("string"==typeof a&&(a=[a]),i=0;i<a.length;i++)r=S((e=a[i].split("|"))[0]),o=S(e[1]),n[r]=o,s[r]=e[0],n[o]=r,s[o]=e[1]}function B(a){T(a.zones),k(a.links),function(a){var i,e,r,o;if(a&&a.length)for(i=0;i<a.length;i++)e=(o=a[i].split("|"))[0].toUpperCase(),r=o[1].split(" "),t[e]=new b(e,r)}(a.countries),O.dataVersion=a.version}function C(a){var i="X"===a._f||"x"===a._f;return!(!a._a||void 0!==a._tzm||i)}function y(a){"undefined"!=typeof console&&"function"==typeof console.error&&console.error(a)}function O(a){var i=Array.prototype.slice.call(arguments,0,-1),e=arguments[arguments.length-1],r=_(e),o=c.utc.apply(null,i);return r&&!c.isMoment(a)&&C(o)&&o.add(r.parse(o),"minutes"),o.tz(e),o}(e<2||2==e&&r<6)&&y("Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js "+c.version+". See momentjs.com"),M.prototype={_set:function(a){this.name=a.name,this.abbrs=a.abbrs,this.untils=a.untils,this.offsets=a.offsets,this.population=a.population},_index:function(a){var i,e=+a,r=this.untils;for(i=0;i<r.length;i++)if(e<r[i])return i},countries:function(){var i=this.name;return Object.keys(t).filter(function(a){return-1!==t[a].zones.indexOf(i)})},parse:function(a){var i,e,r,o,c=+a,A=this.offsets,n=this.untils,t=n.length-1;for(o=0;o<t;o++)if(i=A[o],e=A[o+1],r=A[o?o-1:o],i<e&&O.moveAmbiguousForward?i=e:r<i&&O.moveInvalidForward&&(i=r),c<n[o]-6e4*i)return A[o];return A[t]},abbr:function(a){return this.abbrs[this._index(a)]},offset:function(a){return y("zone.offset has been deprecated in favor of zone.utcOffset"),this.offsets[this._index(a)]},utcOffset:function(a){return this.offsets[this._index(a)]}},h.prototype.scoreOffsetAt=function(a){this.offsetScore+=Math.abs(this.zone.utcOffset(a.at)-a.offset),this.zone.abbr(a.at).replace(/[^A-Z]/g,"")!==a.abbr&&this.abbrScore++},O.version="0.5.34",O.dataVersion="",O._zones=A,O._links=n,O._names=s,O._countries=t,O.add=T,O.link=k,O.load=B,O.zone=_,O.zoneExists=function a(i){return a.didShowError||(a.didShowError=!0,y("moment.tz.zoneExists('"+i+"') has been deprecated in favor of !moment.tz.zone('"+i+"')")),!!_(i)},O.guess=function(a){return i&&!a||(i=P()),i},O.names=function(){var a,i=[];for(a in s)s.hasOwnProperty(a)&&(A[a]||A[n[a]])&&s[a]&&i.push(s[a]);return i.sort()},O.Zone=M,O.unpack=p,O.unpackBase60=o,O.needsOffset=C,O.moveInvalidForward=!0,O.moveAmbiguousForward=!1,O.countries=function(){return Object.keys(t)},O.zonesForCountry=function(a,i){if(!(a=function(a){return a=a.toUpperCase(),t[a]||null}(a)))return null;var e=a.zones.sort();return i?e.map(function(a){return{name:a,offset:_(a).utcOffset(new Date)}}):e};var L,N=c.fn;function D(a){return function(){return this._z?this._z.abbr(this):a.call(this)}}function v(a){return function(){return this._z=null,a.apply(this,arguments)}}c.tz=O,c.defaultZone=null,c.updateOffset=function(a,i){var e,r=c.defaultZone;if(void 0===a._z&&(r&&C(a)&&!a._isUTC&&(a._d=c.utc(a._a)._d,a.utc().add(r.parse(a),"minutes")),a._z=r),a._z)if(e=a._z.utcOffset(a),Math.abs(e)<16&&(e/=60),void 0!==a.utcOffset){var o=a._z;a.utcOffset(-e,i),a._z=o}else a.zone(e,i)},N.tz=function(a,i){if(a){if("string"!=typeof a)throw new Error("Time zone name must be a string, got "+a+" ["+typeof a+"]");return this._z=_(a),this._z?c.updateOffset(this,i):y("Moment Timezone has no data for "+a+". See http://momentjs.com/timezone/docs/#/data-loading/."),this}if(this._z)return this._z.name},N.zoneName=D(N.zoneName),N.zoneAbbr=D(N.zoneAbbr),N.utc=v(N.utc),N.local=v(N.local),N.utcOffset=(L=N.utcOffset,function(){return 0<arguments.length&&(this._z=null),L.apply(this,arguments)}),c.tz.setDefault=function(a){return(e<2||2==e&&r<9)&&y("Moment Timezone setDefault() requires Moment.js >= 2.9.0. You are using Moment.js "+c.version+"."),c.defaultZone=a?_(a):null,c};var G=c.momentProperties;return"[object Array]"===Object.prototype.toString.call(G)?(G.push("_z"),G.push("_a")):G&&(G._z=null),B({version:"2021e",zones:["Africa/Abidjan|GMT|0|0||48e5","Africa/Nairobi|EAT|-30|0||47e5","Africa/Algiers|CET|-10|0||26e5","Africa/Lagos|WAT|-10|0||17e6","Africa/Maputo|CAT|-20|0||26e5","Africa/Cairo|EET|-20|0||15e6","Africa/Casablanca|+00 +01|0 -10|0101010101010101010101010101|1QyO0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0 2600 e00|32e5","Europe/Paris|CET CEST|-10 -20|01010101010101010101010|1QyN0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|11e6","Africa/Johannesburg|SAST|-20|0||84e5","Africa/Juba|EAT CAT|-30 -20|01|24nx0|","Africa/Khartoum|EAT CAT|-30 -20|01|1Usl0|51e5","Africa/Sao_Tome|GMT WAT|0 -10|010|1UQN0 2q00|","Africa/Windhoek|CAT WAT|-20 -10|01010|1QBA0 11B0 1nX0 11B0|32e4","America/Adak|HST HDT|a0 90|01010101010101010101010|1Qto0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|326","America/Anchorage|AKST AKDT|90 80|01010101010101010101010|1Qtn0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|30e4","America/Santo_Domingo|AST|40|0||29e5","America/Fortaleza|-03|30|0||34e5","America/Asuncion|-03 -04|30 40|01010101010101010101010|1QyP0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0|28e5","America/Panama|EST|50|0||15e5","America/Mexico_City|CST CDT|60 50|01010101010101010101010|1QBI0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0|20e6","America/Managua|CST|60|0||22e5","America/La_Paz|-04|40|0||19e5","America/Lima|-05|50|0||11e6","America/Denver|MST MDT|70 60|01010101010101010101010|1Qtl0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e5","America/Campo_Grande|-03 -04|30 40|01010101|1QkP0 1zd0 On0 1zd0 On0 1HB0 FX0|77e4","America/Caracas|-0430 -04|4u 40|01|1QMT0|29e5","America/Chicago|CST CDT|60 50|01010101010101010101010|1Qtk0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|92e5","America/Chihuahua|MST MDT|70 60|01010101010101010101010|1QBJ0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0|81e4","America/Phoenix|MST|70|0||42e5","America/Whitehorse|PST PDT MST|80 70 70|01010101012|1Qtm0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1z90|23e3","America/New_York|EST EDT|50 40|01010101010101010101010|1Qtj0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e6","America/Los_Angeles|PST PDT|80 70|01010101010101010101010|1Qtm0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e6","America/Halifax|AST ADT|40 30|01010101010101010101010|1Qti0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|39e4","America/Godthab|-03 -02|30 20|01010101010101010101010|1QyN0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|17e3","America/Grand_Turk|AST EDT EST|40 40 50|0121212121212121212|1Vkv0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e2","America/Havana|CST CDT|50 40|01010101010101010101010|1Qth0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0|21e5","America/Metlakatla|AKST AKDT PST|90 80 80|010101201010101010101010|1Qtn0 1zb0 Op0 1zb0 Op0 1zb0 uM0 jB0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2","America/Miquelon|-03 -02|30 20|01010101010101010101010|1Qth0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|61e2","America/Noronha|-02|20|0||30e2","America/Port-au-Prince|EST EDT|50 40|010101010101010101010|1SST0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5","Antarctica/Palmer|-03 -04|30 40|010|1QSr0 Ap0|40","America/Santiago|-03 -04|30 40|01010101010101010101010|1QSr0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0|62e5","America/Sao_Paulo|-02 -03|20 30|01010101|1QkO0 1zd0 On0 1zd0 On0 1HB0 FX0|20e6","Atlantic/Azores|-01 +00|10 0|01010101010101010101010|1QyN0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|25e4","America/St_Johns|NST NDT|3u 2u|01010101010101010101010|1Qthu 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4","Antarctica/Casey|+08 +11|-80 -b0|01010101|1RWg0 3m10 1o30 14k0 1kr0 12l0 1o01|10","Asia/Bangkok|+07|-70|0||15e6","Asia/Vladivostok|+10|-a0|0||60e4","Australia/Sydney|AEDT AEST|-b0 -a0|01010101010101010101010|1QBs0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0|40e5","Asia/Tashkent|+05|-50|0||23e5","Pacific/Auckland|NZDT NZST|-d0 -c0|01010101010101010101010|1QBq0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00|14e5","Asia/Baghdad|+03|-30|0||66e5","Antarctica/Troll|+00 +02|0 -20|01010101010101010101010|1QyN0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|40","Asia/Dhaka|+06|-60|0||16e6","Asia/Amman|EET EEST|-20 -30|01010101010101010101010|1QAK0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 LA0 1C00 LA0 1C00 Oo0 1zc0 Oo0 1C00 LA0 1C00|25e5","Asia/Kamchatka|+12|-c0|0||18e4","Asia/Dubai|+04|-40|0||39e5","Asia/Barnaul|+06 +07|-60 -70|01|1QyI0|","Asia/Beirut|EET EEST|-20 -30|01010101010101010101010|1QyK0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0|22e5","Asia/Kuala_Lumpur|+08|-80|0||71e5","Asia/Kolkata|IST|-5u|0||15e6","Asia/Chita|+08 +09|-80 -90|01|1QyG0|33e4","Asia/Ulaanbaatar|+08 +09|-80 -90|010|1Qyi0 1cJ0|12e5","Asia/Shanghai|CST|-80|0||23e6","Asia/Colombo|+0530|-5u|0||22e5","Asia/Damascus|EET EEST|-20 -30|01010101010101010101010|1QxW0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0|26e5","Asia/Yakutsk|+09|-90|0||28e4","Asia/Famagusta|EET EEST +03|-20 -30 -30|0120101010101010101010|1QyN0 15U0 2Ks0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|","Asia/Gaza|EET EEST|-20 -30|01010101010101010101010|1Qyn0 1qL0 WN0 1qL0 WN0 1qL0 11c0 1on0 11B0 1o00 11A0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1nA0 1200 1qo0 Xc0 1qo0|18e5","Asia/Hong_Kong|HKT|-80|0||73e5","Asia/Hovd|+07 +08|-70 -80|010|1Qyj0 1cJ0|81e3","Europe/Istanbul|EET EEST +03|-20 -30 -30|012|1QyN0 15w0|13e6","Asia/Jakarta|WIB|-70|0||31e6","Asia/Jayapura|WIT|-90|0||26e4","Asia/Jerusalem|IST IDT|-20 -30|01010101010101010101010|1Qy00 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0|81e4","Asia/Kabul|+0430|-4u|0||46e5","Asia/Karachi|PKT|-50|0||24e6","Asia/Kathmandu|+0545|-5J|0||12e5","Asia/Magadan|+10 +11|-a0 -b0|01|1QJQ0|95e3","Asia/Makassar|WITA|-80|0||15e5","Asia/Manila|PST|-80|0||24e6","Europe/Athens|EET EEST|-20 -30|01010101010101010101010|1QyN0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|35e5","Asia/Novosibirsk|+06 +07|-60 -70|01|1Rmk0|15e5","Asia/Pyongyang|KST KST|-8u -90|01|1VGf0|29e5","Asia/Qyzylorda|+06 +05|-60 -50|01|1Xei0|73e4","Asia/Rangoon|+0630|-6u|0||48e5","Asia/Sakhalin|+10 +11|-a0 -b0|01|1QyE0|58e4","Asia/Seoul|KST|-90|0||23e6","Pacific/Bougainville|+11|-b0|0||18e4","Asia/Tehran|+0330 +0430|-3u -4u|01010101010101010101010|1Qwku 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0|14e6","Asia/Tokyo|JST|-90|0||38e6","Asia/Tomsk|+06 +07|-60 -70|01|1QXU0|10e5","Europe/Lisbon|WET WEST|0 -10|01010101010101010101010|1QyN0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|27e5","Atlantic/Cape_Verde|-01|10|0||50e4","Australia/Adelaide|ACDT ACST|-au -9u|01010101010101010101010|1QBsu 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0|11e5","Australia/Brisbane|AEST|-a0|0||20e5","Australia/Darwin|ACST|-9u|0||12e4","Australia/Eucla|+0845|-8J|0||368","Australia/Lord_Howe|+11 +1030|-b0 -au|01010101010101010101010|1QBr0 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu|347","Australia/Perth|AWST|-80|0||18e5","Pacific/Easter|-05 -06|50 60|01010101010101010101010|1QSr0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0|30e2","Europe/Dublin|GMT IST|0 -10|01010101010101010101010|1QyN0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|12e5","Etc/GMT-1|+01|-10|0||","Pacific/Fakaofo|+13|-d0|0||483","Pacific/Kiritimati|+14|-e0|0||51e2","Etc/GMT-2|+02|-20|0||","Pacific/Tahiti|-10|a0|0||18e4","Pacific/Niue|-11|b0|0||12e2","Etc/GMT+12|-12|c0|0||","Pacific/Galapagos|-06|60|0||25e3","Etc/GMT+7|-07|70|0||","Pacific/Pitcairn|-08|80|0||56","Pacific/Gambier|-09|90|0||125","Etc/UTC|UTC|0|0||","Europe/Ulyanovsk|+03 +04|-30 -40|01|1QyL0|13e5","Europe/London|GMT BST|0 -10|01010101010101010101010|1QyN0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|10e6","Europe/Chisinau|EET EEST|-20 -30|01010101010101010101010|1QyM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|67e4","Europe/Moscow|MSK|-30|0||16e6","Europe/Saratov|+03 +04|-30 -40|01|1Sfz0|","Europe/Volgograd|+03 +04|-30 -40|010|1WQL0 5gn0|10e5","Pacific/Honolulu|HST|a0|0||37e4","MET|MET MEST|-10 -20|01010101010101010101010|1QyN0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|","Pacific/Chatham|+1345 +1245|-dJ -cJ|01010101010101010101010|1QBq0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00|600","Pacific/Apia|+14 +13|-e0 -d0|010101010101|1QBq0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0|37e3","Pacific/Fiji|+13 +12|-d0 -c0|010101010101010101010|1Q6C0 1VA0 s00 1VA0 s00 1VA0 s00 20o0 pc0 2hc0 bc0 4q00 pc0 20o0 pc0 20o0 pc0 20o0 s00 1VA0|88e4","Pacific/Guam|ChST|-a0|0||17e4","Pacific/Marquesas|-0930|9u|0||86e2","Pacific/Pago_Pago|SST|b0|0||37e2","Pacific/Norfolk|+11 +12|-b0 -c0|0101010101010101|219P0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0|25e4","Pacific/Tongatapu|+13 +14|-d0 -e0|010|1S4d0 s00|75e3"],links:["Africa/Abidjan|Africa/Accra","Africa/Abidjan|Africa/Bamako","Africa/Abidjan|Africa/Banjul","Africa/Abidjan|Africa/Bissau","Africa/Abidjan|Africa/Conakry","Africa/Abidjan|Africa/Dakar","Africa/Abidjan|Africa/Freetown","Africa/Abidjan|Africa/Lome","Africa/Abidjan|Africa/Monrovia","Africa/Abidjan|Africa/Nouakchott","Africa/Abidjan|Africa/Ouagadougou","Africa/Abidjan|Africa/Timbuktu","Africa/Abidjan|America/Danmarkshavn","Africa/Abidjan|Atlantic/Reykjavik","Africa/Abidjan|Atlantic/St_Helena","Africa/Abidjan|Etc/GMT","Africa/Abidjan|Etc/GMT+0","Africa/Abidjan|Etc/GMT-0","Africa/Abidjan|Etc/GMT0","Africa/Abidjan|Etc/Greenwich","Africa/Abidjan|GMT","Africa/Abidjan|GMT+0","Africa/Abidjan|GMT-0","Africa/Abidjan|GMT0","Africa/Abidjan|Greenwich","Africa/Abidjan|Iceland","Africa/Algiers|Africa/Tunis","Africa/Cairo|Africa/Tripoli","Africa/Cairo|Egypt","Africa/Cairo|Europe/Kaliningrad","Africa/Cairo|Libya","Africa/Casablanca|Africa/El_Aaiun","Africa/Johannesburg|Africa/Maseru","Africa/Johannesburg|Africa/Mbabane","Africa/Lagos|Africa/Bangui","Africa/Lagos|Africa/Brazzaville","Africa/Lagos|Africa/Douala","Africa/Lagos|Africa/Kinshasa","Africa/Lagos|Africa/Libreville","Africa/Lagos|Africa/Luanda","Africa/Lagos|Africa/Malabo","Africa/Lagos|Africa/Ndjamena","Africa/Lagos|Africa/Niamey","Africa/Lagos|Africa/Porto-Novo","Africa/Maputo|Africa/Blantyre","Africa/Maputo|Africa/Bujumbura","Africa/Maputo|Africa/Gaborone","Africa/Maputo|Africa/Harare","Africa/Maputo|Africa/Kigali","Africa/Maputo|Africa/Lubumbashi","Africa/Maputo|Africa/Lusaka","Africa/Nairobi|Africa/Addis_Ababa","Africa/Nairobi|Africa/Asmara","Africa/Nairobi|Africa/Asmera","Africa/Nairobi|Africa/Dar_es_Salaam","Africa/Nairobi|Africa/Djibouti","Africa/Nairobi|Africa/Kampala","Africa/Nairobi|Africa/Mogadishu","Africa/Nairobi|Indian/Antananarivo","Africa/Nairobi|Indian/Comoro","Africa/Nairobi|Indian/Mayotte","America/Adak|America/Atka","America/Adak|US/Aleutian","America/Anchorage|America/Juneau","America/Anchorage|America/Nome","America/Anchorage|America/Sitka","America/Anchorage|America/Yakutat","America/Anchorage|US/Alaska","America/Campo_Grande|America/Cuiaba","America/Chicago|America/Indiana/Knox","America/Chicago|America/Indiana/Tell_City","America/Chicago|America/Knox_IN","America/Chicago|America/Matamoros","America/Chicago|America/Menominee","America/Chicago|America/North_Dakota/Beulah","America/Chicago|America/North_Dakota/Center","America/Chicago|America/North_Dakota/New_Salem","America/Chicago|America/Rainy_River","America/Chicago|America/Rankin_Inlet","America/Chicago|America/Resolute","America/Chicago|America/Winnipeg","America/Chicago|CST6CDT","America/Chicago|Canada/Central","America/Chicago|US/Central","America/Chicago|US/Indiana-Starke","America/Chihuahua|America/Mazatlan","America/Chihuahua|Mexico/BajaSur","America/Denver|America/Boise","America/Denver|America/Cambridge_Bay","America/Denver|America/Edmonton","America/Denver|America/Inuvik","America/Denver|America/Ojinaga","America/Denver|America/Shiprock","America/Denver|America/Yellowknife","America/Denver|Canada/Mountain","America/Denver|MST7MDT","America/Denver|Navajo","America/Denver|US/Mountain","America/Fortaleza|America/Araguaina","America/Fortaleza|America/Argentina/Buenos_Aires","America/Fortaleza|America/Argentina/Catamarca","America/Fortaleza|America/Argentina/ComodRivadavia","America/Fortaleza|America/Argentina/Cordoba","America/Fortaleza|America/Argentina/Jujuy","America/Fortaleza|America/Argentina/La_Rioja","America/Fortaleza|America/Argentina/Mendoza","America/Fortaleza|America/Argentina/Rio_Gallegos","America/Fortaleza|America/Argentina/Salta","America/Fortaleza|America/Argentina/San_Juan","America/Fortaleza|America/Argentina/San_Luis","America/Fortaleza|America/Argentina/Tucuman","America/Fortaleza|America/Argentina/Ushuaia","America/Fortaleza|America/Bahia","America/Fortaleza|America/Belem","America/Fortaleza|America/Buenos_Aires","America/Fortaleza|America/Catamarca","America/Fortaleza|America/Cayenne","America/Fortaleza|America/Cordoba","America/Fortaleza|America/Jujuy","America/Fortaleza|America/Maceio","America/Fortaleza|America/Mendoza","America/Fortaleza|America/Montevideo","America/Fortaleza|America/Paramaribo","America/Fortaleza|America/Recife","America/Fortaleza|America/Rosario","America/Fortaleza|America/Santarem","America/Fortaleza|Antarctica/Rothera","America/Fortaleza|Atlantic/Stanley","America/Fortaleza|Etc/GMT+3","America/Godthab|America/Nuuk","America/Halifax|America/Glace_Bay","America/Halifax|America/Goose_Bay","America/Halifax|America/Moncton","America/Halifax|America/Thule","America/Halifax|Atlantic/Bermuda","America/Halifax|Canada/Atlantic","America/Havana|Cuba","America/La_Paz|America/Boa_Vista","America/La_Paz|America/Guyana","America/La_Paz|America/Manaus","America/La_Paz|America/Porto_Velho","America/La_Paz|Brazil/West","America/La_Paz|Etc/GMT+4","America/Lima|America/Bogota","America/Lima|America/Eirunepe","America/Lima|America/Guayaquil","America/Lima|America/Porto_Acre","America/Lima|America/Rio_Branco","America/Lima|Brazil/Acre","America/Lima|Etc/GMT+5","America/Los_Angeles|America/Ensenada","America/Los_Angeles|America/Santa_Isabel","America/Los_Angeles|America/Tijuana","America/Los_Angeles|America/Vancouver","America/Los_Angeles|Canada/Pacific","America/Los_Angeles|Mexico/BajaNorte","America/Los_Angeles|PST8PDT","America/Los_Angeles|US/Pacific","America/Managua|America/Belize","America/Managua|America/Costa_Rica","America/Managua|America/El_Salvador","America/Managua|America/Guatemala","America/Managua|America/Regina","America/Managua|America/Swift_Current","America/Managua|America/Tegucigalpa","America/Managua|Canada/Saskatchewan","America/Mexico_City|America/Bahia_Banderas","America/Mexico_City|America/Merida","America/Mexico_City|America/Monterrey","America/Mexico_City|Mexico/General","America/New_York|America/Detroit","America/New_York|America/Fort_Wayne","America/New_York|America/Indiana/Indianapolis","America/New_York|America/Indiana/Marengo","America/New_York|America/Indiana/Petersburg","America/New_York|America/Indiana/Vevay","America/New_York|America/Indiana/Vincennes","America/New_York|America/Indiana/Winamac","America/New_York|America/Indianapolis","America/New_York|America/Iqaluit","America/New_York|America/Kentucky/Louisville","America/New_York|America/Kentucky/Monticello","America/New_York|America/Louisville","America/New_York|America/Montreal","America/New_York|America/Nassau","America/New_York|America/Nipigon","America/New_York|America/Pangnirtung","America/New_York|America/Thunder_Bay","America/New_York|America/Toronto","America/New_York|Canada/Eastern","America/New_York|EST5EDT","America/New_York|US/East-Indiana","America/New_York|US/Eastern","America/New_York|US/Michigan","America/Noronha|Atlantic/South_Georgia","America/Noronha|Brazil/DeNoronha","America/Noronha|Etc/GMT+2","America/Panama|America/Atikokan","America/Panama|America/Cancun","America/Panama|America/Cayman","America/Panama|America/Coral_Harbour","America/Panama|America/Jamaica","America/Panama|EST","America/Panama|Jamaica","America/Phoenix|America/Creston","America/Phoenix|America/Dawson_Creek","America/Phoenix|America/Fort_Nelson","America/Phoenix|America/Hermosillo","America/Phoenix|MST","America/Phoenix|US/Arizona","America/Santiago|Chile/Continental","America/Santo_Domingo|America/Anguilla","America/Santo_Domingo|America/Antigua","America/Santo_Domingo|America/Aruba","America/Santo_Domingo|America/Barbados","America/Santo_Domingo|America/Blanc-Sablon","America/Santo_Domingo|America/Curacao","America/Santo_Domingo|America/Dominica","America/Santo_Domingo|America/Grenada","America/Santo_Domingo|America/Guadeloupe","America/Santo_Domingo|America/Kralendijk","America/Santo_Domingo|America/Lower_Princes","America/Santo_Domingo|America/Marigot","America/Santo_Domingo|America/Martinique","America/Santo_Domingo|America/Montserrat","America/Santo_Domingo|America/Port_of_Spain","America/Santo_Domingo|America/Puerto_Rico","America/Santo_Domingo|America/St_Barthelemy","America/Santo_Domingo|America/St_Kitts","America/Santo_Domingo|America/St_Lucia","America/Santo_Domingo|America/St_Thomas","America/Santo_Domingo|America/St_Vincent","America/Santo_Domingo|America/Tortola","America/Santo_Domingo|America/Virgin","America/Sao_Paulo|Brazil/East","America/St_Johns|Canada/Newfoundland","America/Whitehorse|America/Dawson","America/Whitehorse|Canada/Yukon","Antarctica/Palmer|America/Punta_Arenas","Asia/Baghdad|Antarctica/Syowa","Asia/Baghdad|Asia/Aden","Asia/Baghdad|Asia/Bahrain","Asia/Baghdad|Asia/Kuwait","Asia/Baghdad|Asia/Qatar","Asia/Baghdad|Asia/Riyadh","Asia/Baghdad|Etc/GMT-3","Asia/Baghdad|Europe/Kirov","Asia/Baghdad|Europe/Minsk","Asia/Bangkok|Antarctica/Davis","Asia/Bangkok|Asia/Ho_Chi_Minh","Asia/Bangkok|Asia/Krasnoyarsk","Asia/Bangkok|Asia/Novokuznetsk","Asia/Bangkok|Asia/Phnom_Penh","Asia/Bangkok|Asia/Saigon","Asia/Bangkok|Asia/Vientiane","Asia/Bangkok|Etc/GMT-7","Asia/Bangkok|Indian/Christmas","Asia/Dhaka|Antarctica/Vostok","Asia/Dhaka|Asia/Almaty","Asia/Dhaka|Asia/Bishkek","Asia/Dhaka|Asia/Dacca","Asia/Dhaka|Asia/Kashgar","Asia/Dhaka|Asia/Omsk","Asia/Dhaka|Asia/Qostanay","Asia/Dhaka|Asia/Thimbu","Asia/Dhaka|Asia/Thimphu","Asia/Dhaka|Asia/Urumqi","Asia/Dhaka|Etc/GMT-6","Asia/Dhaka|Indian/Chagos","Asia/Dubai|Asia/Baku","Asia/Dubai|Asia/Muscat","Asia/Dubai|Asia/Tbilisi","Asia/Dubai|Asia/Yerevan","Asia/Dubai|Etc/GMT-4","Asia/Dubai|Europe/Samara","Asia/Dubai|Indian/Mahe","Asia/Dubai|Indian/Mauritius","Asia/Dubai|Indian/Reunion","Asia/Gaza|Asia/Hebron","Asia/Hong_Kong|Hongkong","Asia/Jakarta|Asia/Pontianak","Asia/Jerusalem|Asia/Tel_Aviv","Asia/Jerusalem|Israel","Asia/Kamchatka|Asia/Anadyr","Asia/Kamchatka|Etc/GMT-12","Asia/Kamchatka|Kwajalein","Asia/Kamchatka|Pacific/Funafuti","Asia/Kamchatka|Pacific/Kwajalein","Asia/Kamchatka|Pacific/Majuro","Asia/Kamchatka|Pacific/Nauru","Asia/Kamchatka|Pacific/Tarawa","Asia/Kamchatka|Pacific/Wake","Asia/Kamchatka|Pacific/Wallis","Asia/Kathmandu|Asia/Katmandu","Asia/Kolkata|Asia/Calcutta","Asia/Kuala_Lumpur|Asia/Brunei","Asia/Kuala_Lumpur|Asia/Irkutsk","Asia/Kuala_Lumpur|Asia/Kuching","Asia/Kuala_Lumpur|Asia/Singapore","Asia/Kuala_Lumpur|Etc/GMT-8","Asia/Kuala_Lumpur|Singapore","Asia/Makassar|Asia/Ujung_Pandang","Asia/Rangoon|Asia/Yangon","Asia/Rangoon|Indian/Cocos","Asia/Seoul|ROK","Asia/Shanghai|Asia/Chongqing","Asia/Shanghai|Asia/Chungking","Asia/Shanghai|Asia/Harbin","Asia/Shanghai|Asia/Macao","Asia/Shanghai|Asia/Macau","Asia/Shanghai|Asia/Taipei","Asia/Shanghai|PRC","Asia/Shanghai|ROC","Asia/Tashkent|Antarctica/Mawson","Asia/Tashkent|Asia/Aqtau","Asia/Tashkent|Asia/Aqtobe","Asia/Tashkent|Asia/Ashgabat","Asia/Tashkent|Asia/Ashkhabad","Asia/Tashkent|Asia/Atyrau","Asia/Tashkent|Asia/Dushanbe","Asia/Tashkent|Asia/Oral","Asia/Tashkent|Asia/Samarkand","Asia/Tashkent|Asia/Yekaterinburg","Asia/Tashkent|Etc/GMT-5","Asia/Tashkent|Indian/Kerguelen","Asia/Tashkent|Indian/Maldives","Asia/Tehran|Iran","Asia/Tokyo|Japan","Asia/Ulaanbaatar|Asia/Choibalsan","Asia/Ulaanbaatar|Asia/Ulan_Bator","Asia/Vladivostok|Antarctica/DumontDUrville","Asia/Vladivostok|Asia/Ust-Nera","Asia/Vladivostok|Etc/GMT-10","Asia/Vladivostok|Pacific/Chuuk","Asia/Vladivostok|Pacific/Port_Moresby","Asia/Vladivostok|Pacific/Truk","Asia/Vladivostok|Pacific/Yap","Asia/Yakutsk|Asia/Dili","Asia/Yakutsk|Asia/Khandyga","Asia/Yakutsk|Etc/GMT-9","Asia/Yakutsk|Pacific/Palau","Atlantic/Azores|America/Scoresbysund","Atlantic/Cape_Verde|Etc/GMT+1","Australia/Adelaide|Australia/Broken_Hill","Australia/Adelaide|Australia/South","Australia/Adelaide|Australia/Yancowinna","Australia/Brisbane|Australia/Lindeman","Australia/Brisbane|Australia/Queensland","Australia/Darwin|Australia/North","Australia/Lord_Howe|Australia/LHI","Australia/Perth|Australia/West","Australia/Sydney|Antarctica/Macquarie","Australia/Sydney|Australia/ACT","Australia/Sydney|Australia/Canberra","Australia/Sydney|Australia/Currie","Australia/Sydney|Australia/Hobart","Australia/Sydney|Australia/Melbourne","Australia/Sydney|Australia/NSW","Australia/Sydney|Australia/Tasmania","Australia/Sydney|Australia/Victoria","Etc/UTC|Etc/UCT","Etc/UTC|Etc/Universal","Etc/UTC|Etc/Zulu","Etc/UTC|UCT","Etc/UTC|UTC","Etc/UTC|Universal","Etc/UTC|Zulu","Europe/Athens|Asia/Nicosia","Europe/Athens|EET","Europe/Athens|Europe/Bucharest","Europe/Athens|Europe/Helsinki","Europe/Athens|Europe/Kiev","Europe/Athens|Europe/Mariehamn","Europe/Athens|Europe/Nicosia","Europe/Athens|Europe/Riga","Europe/Athens|Europe/Sofia","Europe/Athens|Europe/Tallinn","Europe/Athens|Europe/Uzhgorod","Europe/Athens|Europe/Vilnius","Europe/Athens|Europe/Zaporozhye","Europe/Chisinau|Europe/Tiraspol","Europe/Dublin|Eire","Europe/Istanbul|Asia/Istanbul","Europe/Istanbul|Turkey","Europe/Lisbon|Atlantic/Canary","Europe/Lisbon|Atlantic/Faeroe","Europe/Lisbon|Atlantic/Faroe","Europe/Lisbon|Atlantic/Madeira","Europe/Lisbon|Portugal","Europe/Lisbon|WET","Europe/London|Europe/Belfast","Europe/London|Europe/Guernsey","Europe/London|Europe/Isle_of_Man","Europe/London|Europe/Jersey","Europe/London|GB","Europe/London|GB-Eire","Europe/Moscow|Europe/Simferopol","Europe/Moscow|W-SU","Europe/Paris|Africa/Ceuta","Europe/Paris|Arctic/Longyearbyen","Europe/Paris|Atlantic/Jan_Mayen","Europe/Paris|CET","Europe/Paris|Europe/Amsterdam","Europe/Paris|Europe/Andorra","Europe/Paris|Europe/Belgrade","Europe/Paris|Europe/Berlin","Europe/Paris|Europe/Bratislava","Europe/Paris|Europe/Brussels","Europe/Paris|Europe/Budapest","Europe/Paris|Europe/Busingen","Europe/Paris|Europe/Copenhagen","Europe/Paris|Europe/Gibraltar","Europe/Paris|Europe/Ljubljana","Europe/Paris|Europe/Luxembourg","Europe/Paris|Europe/Madrid","Europe/Paris|Europe/Malta","Europe/Paris|Europe/Monaco","Europe/Paris|Europe/Oslo","Europe/Paris|Europe/Podgorica","Europe/Paris|Europe/Prague","Europe/Paris|Europe/Rome","Europe/Paris|Europe/San_Marino","Europe/Paris|Europe/Sarajevo","Europe/Paris|Europe/Skopje","Europe/Paris|Europe/Stockholm","Europe/Paris|Europe/Tirane","Europe/Paris|Europe/Vaduz","Europe/Paris|Europe/Vatican","Europe/Paris|Europe/Vienna","Europe/Paris|Europe/Warsaw","Europe/Paris|Europe/Zagreb","Europe/Paris|Europe/Zurich","Europe/Paris|Poland","Europe/Ulyanovsk|Europe/Astrakhan","Pacific/Auckland|Antarctica/McMurdo","Pacific/Auckland|Antarctica/South_Pole","Pacific/Auckland|NZ","Pacific/Bougainville|Asia/Srednekolymsk","Pacific/Bougainville|Etc/GMT-11","Pacific/Bougainville|Pacific/Efate","Pacific/Bougainville|Pacific/Guadalcanal","Pacific/Bougainville|Pacific/Kosrae","Pacific/Bougainville|Pacific/Noumea","Pacific/Bougainville|Pacific/Pohnpei","Pacific/Bougainville|Pacific/Ponape","Pacific/Chatham|NZ-CHAT","Pacific/Easter|Chile/EasterIsland","Pacific/Fakaofo|Etc/GMT-13","Pacific/Fakaofo|Pacific/Enderbury","Pacific/Fakaofo|Pacific/Kanton","Pacific/Galapagos|Etc/GMT+6","Pacific/Gambier|Etc/GMT+9","Pacific/Guam|Pacific/Saipan","Pacific/Honolulu|HST","Pacific/Honolulu|Pacific/Johnston","Pacific/Honolulu|US/Hawaii","Pacific/Kiritimati|Etc/GMT-14","Pacific/Niue|Etc/GMT+11","Pacific/Pago_Pago|Pacific/Midway","Pacific/Pago_Pago|Pacific/Samoa","Pacific/Pago_Pago|US/Samoa","Pacific/Pitcairn|Etc/GMT+8","Pacific/Tahiti|Etc/GMT+10","Pacific/Tahiti|Pacific/Rarotonga"],countries:["AD|Europe/Andorra","AE|Asia/Dubai","AF|Asia/Kabul","AG|America/Port_of_Spain America/Antigua","AI|America/Port_of_Spain America/Anguilla","AL|Europe/Tirane","AM|Asia/Yerevan","AO|Africa/Lagos Africa/Luanda","AQ|Antarctica/Casey Antarctica/Davis Antarctica/DumontDUrville Antarctica/Mawson Antarctica/Palmer Antarctica/Rothera Antarctica/Syowa Antarctica/Troll Antarctica/Vostok Pacific/Auckland Antarctica/McMurdo","AR|America/Argentina/Buenos_Aires America/Argentina/Cordoba America/Argentina/Salta America/Argentina/Jujuy America/Argentina/Tucuman America/Argentina/Catamarca America/Argentina/La_Rioja America/Argentina/San_Juan America/Argentina/Mendoza America/Argentina/San_Luis America/Argentina/Rio_Gallegos America/Argentina/Ushuaia","AS|Pacific/Pago_Pago","AT|Europe/Vienna","AU|Australia/Lord_Howe Antarctica/Macquarie Australia/Hobart Australia/Melbourne Australia/Sydney Australia/Broken_Hill Australia/Brisbane Australia/Lindeman Australia/Adelaide Australia/Darwin Australia/Perth Australia/Eucla","AW|America/Curacao America/Aruba","AX|Europe/Helsinki Europe/Mariehamn","AZ|Asia/Baku","BA|Europe/Belgrade Europe/Sarajevo","BB|America/Barbados","BD|Asia/Dhaka","BE|Europe/Brussels","BF|Africa/Abidjan Africa/Ouagadougou","BG|Europe/Sofia","BH|Asia/Qatar Asia/Bahrain","BI|Africa/Maputo Africa/Bujumbura","BJ|Africa/Lagos Africa/Porto-Novo","BL|America/Port_of_Spain America/St_Barthelemy","BM|Atlantic/Bermuda","BN|Asia/Brunei","BO|America/La_Paz","BQ|America/Curacao America/Kralendijk","BR|America/Noronha America/Belem America/Fortaleza America/Recife America/Araguaina America/Maceio America/Bahia America/Sao_Paulo America/Campo_Grande America/Cuiaba America/Santarem America/Porto_Velho America/Boa_Vista America/Manaus America/Eirunepe America/Rio_Branco","BS|America/Nassau","BT|Asia/Thimphu","BW|Africa/Maputo Africa/Gaborone","BY|Europe/Minsk","BZ|America/Belize","CA|America/St_Johns America/Halifax America/Glace_Bay America/Moncton America/Goose_Bay America/Blanc-Sablon America/Toronto America/Nipigon America/Thunder_Bay America/Iqaluit America/Pangnirtung America/Atikokan America/Winnipeg America/Rainy_River America/Resolute America/Rankin_Inlet America/Regina America/Swift_Current America/Edmonton America/Cambridge_Bay America/Yellowknife America/Inuvik America/Creston America/Dawson_Creek America/Fort_Nelson America/Whitehorse America/Dawson America/Vancouver","CC|Indian/Cocos","CD|Africa/Maputo Africa/Lagos Africa/Kinshasa Africa/Lubumbashi","CF|Africa/Lagos Africa/Bangui","CG|Africa/Lagos Africa/Brazzaville","CH|Europe/Zurich","CI|Africa/Abidjan","CK|Pacific/Rarotonga","CL|America/Santiago America/Punta_Arenas Pacific/Easter","CM|Africa/Lagos Africa/Douala","CN|Asia/Shanghai Asia/Urumqi","CO|America/Bogota","CR|America/Costa_Rica","CU|America/Havana","CV|Atlantic/Cape_Verde","CW|America/Curacao","CX|Indian/Christmas","CY|Asia/Nicosia Asia/Famagusta","CZ|Europe/Prague","DE|Europe/Zurich Europe/Berlin Europe/Busingen","DJ|Africa/Nairobi Africa/Djibouti","DK|Europe/Copenhagen","DM|America/Port_of_Spain America/Dominica","DO|America/Santo_Domingo","DZ|Africa/Algiers","EC|America/Guayaquil Pacific/Galapagos","EE|Europe/Tallinn","EG|Africa/Cairo","EH|Africa/El_Aaiun","ER|Africa/Nairobi Africa/Asmara","ES|Europe/Madrid Africa/Ceuta Atlantic/Canary","ET|Africa/Nairobi Africa/Addis_Ababa","FI|Europe/Helsinki","FJ|Pacific/Fiji","FK|Atlantic/Stanley","FM|Pacific/Chuuk Pacific/Pohnpei Pacific/Kosrae","FO|Atlantic/Faroe","FR|Europe/Paris","GA|Africa/Lagos Africa/Libreville","GB|Europe/London","GD|America/Port_of_Spain America/Grenada","GE|Asia/Tbilisi","GF|America/Cayenne","GG|Europe/London Europe/Guernsey","GH|Africa/Accra","GI|Europe/Gibraltar","GL|America/Nuuk America/Danmarkshavn America/Scoresbysund America/Thule","GM|Africa/Abidjan Africa/Banjul","GN|Africa/Abidjan Africa/Conakry","GP|America/Port_of_Spain America/Guadeloupe","GQ|Africa/Lagos Africa/Malabo","GR|Europe/Athens","GS|Atlantic/South_Georgia","GT|America/Guatemala","GU|Pacific/Guam","GW|Africa/Bissau","GY|America/Guyana","HK|Asia/Hong_Kong","HN|America/Tegucigalpa","HR|Europe/Belgrade Europe/Zagreb","HT|America/Port-au-Prince","HU|Europe/Budapest","ID|Asia/Jakarta Asia/Pontianak Asia/Makassar Asia/Jayapura","IE|Europe/Dublin","IL|Asia/Jerusalem","IM|Europe/London Europe/Isle_of_Man","IN|Asia/Kolkata","IO|Indian/Chagos","IQ|Asia/Baghdad","IR|Asia/Tehran","IS|Atlantic/Reykjavik","IT|Europe/Rome","JE|Europe/London Europe/Jersey","JM|America/Jamaica","JO|Asia/Amman","JP|Asia/Tokyo","KE|Africa/Nairobi","KG|Asia/Bishkek","KH|Asia/Bangkok Asia/Phnom_Penh","KI|Pacific/Tarawa Pacific/Enderbury Pacific/Kiritimati","KM|Africa/Nairobi Indian/Comoro","KN|America/Port_of_Spain America/St_Kitts","KP|Asia/Pyongyang","KR|Asia/Seoul","KW|Asia/Riyadh Asia/Kuwait","KY|America/Panama America/Cayman","KZ|Asia/Almaty Asia/Qyzylorda Asia/Qostanay Asia/Aqtobe Asia/Aqtau Asia/Atyrau Asia/Oral","LA|Asia/Bangkok Asia/Vientiane","LB|Asia/Beirut","LC|America/Port_of_Spain America/St_Lucia","LI|Europe/Zurich Europe/Vaduz","LK|Asia/Colombo","LR|Africa/Monrovia","LS|Africa/Johannesburg Africa/Maseru","LT|Europe/Vilnius","LU|Europe/Luxembourg","LV|Europe/Riga","LY|Africa/Tripoli","MA|Africa/Casablanca","MC|Europe/Monaco","MD|Europe/Chisinau","ME|Europe/Belgrade Europe/Podgorica","MF|America/Port_of_Spain America/Marigot","MG|Africa/Nairobi Indian/Antananarivo","MH|Pacific/Majuro Pacific/Kwajalein","MK|Europe/Belgrade Europe/Skopje","ML|Africa/Abidjan Africa/Bamako","MM|Asia/Yangon","MN|Asia/Ulaanbaatar Asia/Hovd Asia/Choibalsan","MO|Asia/Macau","MP|Pacific/Guam Pacific/Saipan","MQ|America/Martinique","MR|Africa/Abidjan Africa/Nouakchott","MS|America/Port_of_Spain America/Montserrat","MT|Europe/Malta","MU|Indian/Mauritius","MV|Indian/Maldives","MW|Africa/Maputo Africa/Blantyre","MX|America/Mexico_City America/Cancun America/Merida America/Monterrey America/Matamoros America/Mazatlan America/Chihuahua America/Ojinaga America/Hermosillo America/Tijuana America/Bahia_Banderas","MY|Asia/Kuala_Lumpur Asia/Kuching","MZ|Africa/Maputo","NA|Africa/Windhoek","NC|Pacific/Noumea","NE|Africa/Lagos Africa/Niamey","NF|Pacific/Norfolk","NG|Africa/Lagos","NI|America/Managua","NL|Europe/Amsterdam","NO|Europe/Oslo","NP|Asia/Kathmandu","NR|Pacific/Nauru","NU|Pacific/Niue","NZ|Pacific/Auckland Pacific/Chatham","OM|Asia/Dubai Asia/Muscat","PA|America/Panama","PE|America/Lima","PF|Pacific/Tahiti Pacific/Marquesas Pacific/Gambier","PG|Pacific/Port_Moresby Pacific/Bougainville","PH|Asia/Manila","PK|Asia/Karachi","PL|Europe/Warsaw","PM|America/Miquelon","PN|Pacific/Pitcairn","PR|America/Puerto_Rico","PS|Asia/Gaza Asia/Hebron","PT|Europe/Lisbon Atlantic/Madeira Atlantic/Azores","PW|Pacific/Palau","PY|America/Asuncion","QA|Asia/Qatar","RE|Indian/Reunion","RO|Europe/Bucharest","RS|Europe/Belgrade","RU|Europe/Kaliningrad Europe/Moscow Europe/Simferopol Europe/Kirov Europe/Volgograd Europe/Astrakhan Europe/Saratov Europe/Ulyanovsk Europe/Samara Asia/Yekaterinburg Asia/Omsk Asia/Novosibirsk Asia/Barnaul Asia/Tomsk Asia/Novokuznetsk Asia/Krasnoyarsk Asia/Irkutsk Asia/Chita Asia/Yakutsk Asia/Khandyga Asia/Vladivostok Asia/Ust-Nera Asia/Magadan Asia/Sakhalin Asia/Srednekolymsk Asia/Kamchatka Asia/Anadyr","RW|Africa/Maputo Africa/Kigali","SA|Asia/Riyadh","SB|Pacific/Guadalcanal","SC|Indian/Mahe","SD|Africa/Khartoum","SE|Europe/Stockholm","SG|Asia/Singapore","SH|Africa/Abidjan Atlantic/St_Helena","SI|Europe/Belgrade Europe/Ljubljana","SJ|Europe/Oslo Arctic/Longyearbyen","SK|Europe/Prague Europe/Bratislava","SL|Africa/Abidjan Africa/Freetown","SM|Europe/Rome Europe/San_Marino","SN|Africa/Abidjan Africa/Dakar","SO|Africa/Nairobi Africa/Mogadishu","SR|America/Paramaribo","SS|Africa/Juba","ST|Africa/Sao_Tome","SV|America/El_Salvador","SX|America/Curacao America/Lower_Princes","SY|Asia/Damascus","SZ|Africa/Johannesburg Africa/Mbabane","TC|America/Grand_Turk","TD|Africa/Ndjamena","TF|Indian/Reunion Indian/Kerguelen","TG|Africa/Abidjan Africa/Lome","TH|Asia/Bangkok","TJ|Asia/Dushanbe","TK|Pacific/Fakaofo","TL|Asia/Dili","TM|Asia/Ashgabat","TN|Africa/Tunis","TO|Pacific/Tongatapu","TR|Europe/Istanbul","TT|America/Port_of_Spain","TV|Pacific/Funafuti","TW|Asia/Taipei","TZ|Africa/Nairobi Africa/Dar_es_Salaam","UA|Europe/Simferopol Europe/Kiev Europe/Uzhgorod Europe/Zaporozhye","UG|Africa/Nairobi Africa/Kampala","UM|Pacific/Pago_Pago Pacific/Wake Pacific/Honolulu Pacific/Midway","US|America/New_York America/Detroit America/Kentucky/Louisville America/Kentucky/Monticello America/Indiana/Indianapolis America/Indiana/Vincennes America/Indiana/Winamac America/Indiana/Marengo America/Indiana/Petersburg America/Indiana/Vevay America/Chicago America/Indiana/Tell_City America/Indiana/Knox America/Menominee America/North_Dakota/Center America/North_Dakota/New_Salem America/North_Dakota/Beulah America/Denver America/Boise America/Phoenix America/Los_Angeles America/Anchorage America/Juneau America/Sitka America/Metlakatla America/Yakutat America/Nome America/Adak Pacific/Honolulu","UY|America/Montevideo","UZ|Asia/Samarkand Asia/Tashkent","VA|Europe/Rome Europe/Vatican","VC|America/Port_of_Spain America/St_Vincent","VE|America/Caracas","VG|America/Port_of_Spain America/Tortola","VI|America/Port_of_Spain America/St_Thomas","VN|Asia/Bangkok Asia/Ho_Chi_Minh","VU|Pacific/Efate","WF|Pacific/Wallis","WS|Pacific/Apia","YE|Asia/Riyadh Asia/Aden","YT|Africa/Nairobi Indian/Mayotte","ZA|Africa/Johannesburg","ZM|Africa/Maputo Africa/Lusaka","ZW|Africa/Maputo Africa/Harare"]}),c});//! moment-timezone.js
//! version : 0.5.34
//! Copyright (c) JS Foundation and other contributors
//! license : MIT
//! github.com/moment/moment-timezone

(function (root, factory) {
	"use strict";

	/*global define*/
	if (typeof module === 'object' && module.exports) {
		module.exports = factory(require('moment')); // Node
	} else if (typeof define === 'function' && define.amd) {
		define(['moment'], factory);                 // AMD
	} else {
		factory(root.moment);                        // Browser
	}
}(this, function (moment) {
	"use strict";

	// Resolves es6 module loading issue
	if (moment.version === undefined && moment.default) {
		moment = moment.default;
	}

	// Do not load moment-timezone a second time.
	// if (moment.tz !== undefined) {
	// 	logError('Moment Timezone ' + moment.tz.version + ' was already loaded ' + (moment.tz.dataVersion ? 'with data from ' : 'without any data') + moment.tz.dataVersion);
	// 	return moment;
	// }

	var VERSION = "0.5.34",
		zones = {},
		links = {},
		countries = {},
		names = {},
		guesses = {},
		cachedGuess;

	if (!moment || typeof moment.version !== 'string') {
		logError('Moment Timezone requires Moment.js. See https://momentjs.com/timezone/docs/#/use-it/browser/');
	}

	var momentVersion = moment.version.split('.'),
		major = +momentVersion[0],
		minor = +momentVersion[1];

	// Moment.js version check
	if (major < 2 || (major === 2 && minor < 6)) {
		logError('Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js ' + moment.version + '. See momentjs.com');
	}

	/************************************
		Unpacking
	************************************/

	function charCodeToInt(charCode) {
		if (charCode > 96) {
			return charCode - 87;
		} else if (charCode > 64) {
			return charCode - 29;
		}
		return charCode - 48;
	}

	function unpackBase60(string) {
		var i = 0,
			parts = string.split('.'),
			whole = parts[0],
			fractional = parts[1] || '',
			multiplier = 1,
			num,
			out = 0,
			sign = 1;

		// handle negative numbers
		if (string.charCodeAt(0) === 45) {
			i = 1;
			sign = -1;
		}

		// handle digits before the decimal
		for (i; i < whole.length; i++) {
			num = charCodeToInt(whole.charCodeAt(i));
			out = 60 * out + num;
		}

		// handle digits after the decimal
		for (i = 0; i < fractional.length; i++) {
			multiplier = multiplier / 60;
			num = charCodeToInt(fractional.charCodeAt(i));
			out += num * multiplier;
		}

		return out * sign;
	}

	function arrayToInt (array) {
		for (var i = 0; i < array.length; i++) {
			array[i] = unpackBase60(array[i]);
		}
	}

	function intToUntil (array, length) {
		for (var i = 0; i < length; i++) {
			array[i] = Math.round((array[i - 1] || 0) + (array[i] * 60000)); // minutes to milliseconds
		}

		array[length - 1] = Infinity;
	}

	function mapIndices (source, indices) {
		var out = [], i;

		for (i = 0; i < indices.length; i++) {
			out[i] = source[indices[i]];
		}

		return out;
	}

	function unpack (string) {
		var data = string.split('|'),
			offsets = data[2].split(' '),
			indices = data[3].split(''),
			untils  = data[4].split(' ');

		arrayToInt(offsets);
		arrayToInt(indices);
		arrayToInt(untils);

		intToUntil(untils, indices.length);

		return {
			name       : data[0],
			abbrs      : mapIndices(data[1].split(' '), indices),
			offsets    : mapIndices(offsets, indices),
			untils     : untils,
			population : data[5] | 0
		};
	}

	/************************************
		Zone object
	************************************/

	function Zone (packedString) {
		if (packedString) {
			this._set(unpack(packedString));
		}
	}

	Zone.prototype = {
		_set : function (unpacked) {
			this.name       = unpacked.name;
			this.abbrs      = unpacked.abbrs;
			this.untils     = unpacked.untils;
			this.offsets    = unpacked.offsets;
			this.population = unpacked.population;
		},

		_index : function (timestamp) {
			var target = +timestamp,
				untils = this.untils,
				i;

			for (i = 0; i < untils.length; i++) {
				if (target < untils[i]) {
					return i;
				}
			}
		},

		countries : function () {
			var zone_name = this.name;
			return Object.keys(countries).filter(function (country_code) {
				return countries[country_code].zones.indexOf(zone_name) !== -1;
			});
		},

		parse : function (timestamp) {
			var target  = +timestamp,
				offsets = this.offsets,
				untils  = this.untils,
				max     = untils.length - 1,
				offset, offsetNext, offsetPrev, i;

			for (i = 0; i < max; i++) {
				offset     = offsets[i];
				offsetNext = offsets[i + 1];
				offsetPrev = offsets[i ? i - 1 : i];

				if (offset < offsetNext && tz.moveAmbiguousForward) {
					offset = offsetNext;
				} else if (offset > offsetPrev && tz.moveInvalidForward) {
					offset = offsetPrev;
				}

				if (target < untils[i] - (offset * 60000)) {
					return offsets[i];
				}
			}

			return offsets[max];
		},

		abbr : function (mom) {
			return this.abbrs[this._index(mom)];
		},

		offset : function (mom) {
			logError("zone.offset has been deprecated in favor of zone.utcOffset");
			return this.offsets[this._index(mom)];
		},

		utcOffset : function (mom) {
			return this.offsets[this._index(mom)];
		}
	};

	/************************************
		Country object
	************************************/

	function Country (country_name, zone_names) {
		this.name = country_name;
		this.zones = zone_names;
	}

	/************************************
		Current Timezone
	************************************/

	function OffsetAt(at) {
		var timeString = at.toTimeString();
		var abbr = timeString.match(/\([a-z ]+\)/i);
		if (abbr && abbr[0]) {
			// 17:56:31 GMT-0600 (CST)
			// 17:56:31 GMT-0600 (Central Standard Time)
			abbr = abbr[0].match(/[A-Z]/g);
			abbr = abbr ? abbr.join('') : undefined;
		} else {
			// 17:56:31 CST
			// 17:56:31 GMT+0800 (台北標準時間)
			abbr = timeString.match(/[A-Z]{3,5}/g);
			abbr = abbr ? abbr[0] : undefined;
		}

		if (abbr === 'GMT') {
			abbr = undefined;
		}

		this.at = +at;
		this.abbr = abbr;
		this.offset = at.getTimezoneOffset();
	}

	function ZoneScore(zone) {
		this.zone = zone;
		this.offsetScore = 0;
		this.abbrScore = 0;
	}

	ZoneScore.prototype.scoreOffsetAt = function (offsetAt) {
		this.offsetScore += Math.abs(this.zone.utcOffset(offsetAt.at) - offsetAt.offset);
		if (this.zone.abbr(offsetAt.at).replace(/[^A-Z]/g, '') !== offsetAt.abbr) {
			this.abbrScore++;
		}
	};

	function findChange(low, high) {
		var mid, diff;

		while ((diff = ((high.at - low.at) / 12e4 | 0) * 6e4)) {
			mid = new OffsetAt(new Date(low.at + diff));
			if (mid.offset === low.offset) {
				low = mid;
			} else {
				high = mid;
			}
		}

		return low;
	}

	function userOffsets() {
		var startYear = new Date().getFullYear() - 2,
			last = new OffsetAt(new Date(startYear, 0, 1)),
			offsets = [last],
			change, next, i;

		for (i = 1; i < 48; i++) {
			next = new OffsetAt(new Date(startYear, i, 1));
			if (next.offset !== last.offset) {
				change = findChange(last, next);
				offsets.push(change);
				offsets.push(new OffsetAt(new Date(change.at + 6e4)));
			}
			last = next;
		}

		for (i = 0; i < 4; i++) {
			offsets.push(new OffsetAt(new Date(startYear + i, 0, 1)));
			offsets.push(new OffsetAt(new Date(startYear + i, 6, 1)));
		}

		return offsets;
	}

	function sortZoneScores (a, b) {
		if (a.offsetScore !== b.offsetScore) {
			return a.offsetScore - b.offsetScore;
		}
		if (a.abbrScore !== b.abbrScore) {
			return a.abbrScore - b.abbrScore;
		}
		if (a.zone.population !== b.zone.population) {
			return b.zone.population - a.zone.population;
		}
		return b.zone.name.localeCompare(a.zone.name);
	}

	function addToGuesses (name, offsets) {
		var i, offset;
		arrayToInt(offsets);
		for (i = 0; i < offsets.length; i++) {
			offset = offsets[i];
			guesses[offset] = guesses[offset] || {};
			guesses[offset][name] = true;
		}
	}

	function guessesForUserOffsets (offsets) {
		var offsetsLength = offsets.length,
			filteredGuesses = {},
			out = [],
			i, j, guessesOffset;

		for (i = 0; i < offsetsLength; i++) {
			guessesOffset = guesses[offsets[i].offset] || {};
			for (j in guessesOffset) {
				if (guessesOffset.hasOwnProperty(j)) {
					filteredGuesses[j] = true;
				}
			}
		}

		for (i in filteredGuesses) {
			if (filteredGuesses.hasOwnProperty(i)) {
				out.push(names[i]);
			}
		}

		return out;
	}

	function rebuildGuess () {

		// use Intl API when available and returning valid time zone
		try {
			var intlName = Intl.DateTimeFormat().resolvedOptions().timeZone;
			if (intlName && intlName.length > 3) {
				var name = names[normalizeName(intlName)];
				if (name) {
					return name;
				}
				logError("Moment Timezone found " + intlName + " from the Intl api, but did not have that data loaded.");
			}
		} catch (e) {
			// Intl unavailable, fall back to manual guessing.
		}

		var offsets = userOffsets(),
			offsetsLength = offsets.length,
			guesses = guessesForUserOffsets(offsets),
			zoneScores = [],
			zoneScore, i, j;

		for (i = 0; i < guesses.length; i++) {
			zoneScore = new ZoneScore(getZone(guesses[i]), offsetsLength);
			for (j = 0; j < offsetsLength; j++) {
				zoneScore.scoreOffsetAt(offsets[j]);
			}
			zoneScores.push(zoneScore);
		}

		zoneScores.sort(sortZoneScores);

		return zoneScores.length > 0 ? zoneScores[0].zone.name : undefined;
	}

	function guess (ignoreCache) {
		if (!cachedGuess || ignoreCache) {
			cachedGuess = rebuildGuess();
		}
		return cachedGuess;
	}

	/************************************
		Global Methods
	************************************/

	function normalizeName (name) {
		return (name || '').toLowerCase().replace(/\//g, '_');
	}

	function addZone (packed) {
		var i, name, split, normalized;

		if (typeof packed === "string") {
			packed = [packed];
		}

		for (i = 0; i < packed.length; i++) {
			split = packed[i].split('|');
			name = split[0];
			normalized = normalizeName(name);
			zones[normalized] = packed[i];
			names[normalized] = name;
			addToGuesses(normalized, split[2].split(' '));
		}
	}

	function getZone (name, caller) {

		name = normalizeName(name);

		var zone = zones[name];
		var link;

		if (zone instanceof Zone) {
			return zone;
		}

		if (typeof zone === 'string') {
			zone = new Zone(zone);
			zones[name] = zone;
			return zone;
		}

		// Pass getZone to prevent recursion more than 1 level deep
		if (links[name] && caller !== getZone && (link = getZone(links[name], getZone))) {
			zone = zones[name] = new Zone();
			zone._set(link);
			zone.name = names[name];
			return zone;
		}

		return null;
	}

	function getNames () {
		var i, out = [];

		for (i in names) {
			if (names.hasOwnProperty(i) && (zones[i] || zones[links[i]]) && names[i]) {
				out.push(names[i]);
			}
		}

		return out.sort();
	}

	function getCountryNames () {
		return Object.keys(countries);
	}

	function addLink (aliases) {
		var i, alias, normal0, normal1;

		if (typeof aliases === "string") {
			aliases = [aliases];
		}

		for (i = 0; i < aliases.length; i++) {
			alias = aliases[i].split('|');

			normal0 = normalizeName(alias[0]);
			normal1 = normalizeName(alias[1]);

			links[normal0] = normal1;
			names[normal0] = alias[0];

			links[normal1] = normal0;
			names[normal1] = alias[1];
		}
	}

	function addCountries (data) {
		var i, country_code, country_zones, split;
		if (!data || !data.length) return;
		for (i = 0; i < data.length; i++) {
			split = data[i].split('|');
			country_code = split[0].toUpperCase();
			country_zones = split[1].split(' ');
			countries[country_code] = new Country(
				country_code,
				country_zones
			);
		}
	}

	function getCountry (name) {
		name = name.toUpperCase();
		return countries[name] || null;
	}

	function zonesForCountry(country, with_offset) {
		country = getCountry(country);

		if (!country) return null;

		var zones = country.zones.sort();

		if (with_offset) {
			return zones.map(function (zone_name) {
				var zone = getZone(zone_name);
				return {
					name: zone_name,
					offset: zone.utcOffset(new Date())
				};
			});
		}

		return zones;
	}

	function loadData (data) {
		addZone(data.zones);
		addLink(data.links);
		addCountries(data.countries);
		tz.dataVersion = data.version;
	}

	function zoneExists (name) {
		if (!zoneExists.didShowError) {
			zoneExists.didShowError = true;
				logError("moment.tz.zoneExists('" + name + "') has been deprecated in favor of !moment.tz.zone('" + name + "')");
		}
		return !!getZone(name);
	}

	function needsOffset (m) {
		var isUnixTimestamp = (m._f === 'X' || m._f === 'x');
		return !!(m._a && (m._tzm === undefined) && !isUnixTimestamp);
	}

	function logError (message) {
		if (typeof console !== 'undefined' && typeof console.error === 'function') {
			console.error(message);
		}
	}

	/************************************
		moment.tz namespace
	************************************/

	function tz (input) {
		var args = Array.prototype.slice.call(arguments, 0, -1),
			name = arguments[arguments.length - 1],
			zone = getZone(name),
			out  = moment.utc.apply(null, args);

		if (zone && !moment.isMoment(input) && needsOffset(out)) {
			out.add(zone.parse(out), 'minutes');
		}

		out.tz(name);

		return out;
	}

	tz.version      = VERSION;
	tz.dataVersion  = '';
	tz._zones       = zones;
	tz._links       = links;
	tz._names       = names;
	tz._countries	= countries;
	tz.add          = addZone;
	tz.link         = addLink;
	tz.load         = loadData;
	tz.zone         = getZone;
	tz.zoneExists   = zoneExists; // deprecated in 0.1.0
	tz.guess        = guess;
	tz.names        = getNames;
	tz.Zone         = Zone;
	tz.unpack       = unpack;
	tz.unpackBase60 = unpackBase60;
	tz.needsOffset  = needsOffset;
	tz.moveInvalidForward   = true;
	tz.moveAmbiguousForward = false;
	tz.countries    = getCountryNames;
	tz.zonesForCountry = zonesForCountry;

	/************************************
		Interface with Moment.js
	************************************/

	var fn = moment.fn;

	moment.tz = tz;

	moment.defaultZone = null;

	moment.updateOffset = function (mom, keepTime) {
		var zone = moment.defaultZone,
			offset;

		if (mom._z === undefined) {
			if (zone && needsOffset(mom) && !mom._isUTC) {
				mom._d = moment.utc(mom._a)._d;
				mom.utc().add(zone.parse(mom), 'minutes');
			}
			mom._z = zone;
		}
		if (mom._z) {
			offset = mom._z.utcOffset(mom);
			if (Math.abs(offset) < 16) {
				offset = offset / 60;
			}
			if (mom.utcOffset !== undefined) {
				var z = mom._z;
				mom.utcOffset(-offset, keepTime);
				mom._z = z;
			} else {
				mom.zone(offset, keepTime);
			}
		}
	};

	fn.tz = function (name, keepTime) {
		if (name) {
			if (typeof name !== 'string') {
				throw new Error('Time zone name must be a string, got ' + name + ' [' + typeof name + ']');
			}
			this._z = getZone(name);
			if (this._z) {
				moment.updateOffset(this, keepTime);
			} else {
				logError("Moment Timezone has no data for " + name + ". See http://momentjs.com/timezone/docs/#/data-loading/.");
			}
			return this;
		}
		if (this._z) { return this._z.name; }
	};

	function abbrWrap (old) {
		return function () {
			if (this._z) { return this._z.abbr(this); }
			return old.call(this);
		};
	}

	function resetZoneWrap (old) {
		return function () {
			this._z = null;
			return old.apply(this, arguments);
		};
	}

	function resetZoneWrap2 (old) {
		return function () {
			if (arguments.length > 0) this._z = null;
			return old.apply(this, arguments);
		};
	}

	fn.zoneName  = abbrWrap(fn.zoneName);
	fn.zoneAbbr  = abbrWrap(fn.zoneAbbr);
	fn.utc       = resetZoneWrap(fn.utc);
	fn.local     = resetZoneWrap(fn.local);
	fn.utcOffset = resetZoneWrap2(fn.utcOffset);

	moment.tz.setDefault = function(name) {
		if (major < 2 || (major === 2 && minor < 9)) {
			logError('Moment Timezone setDefault() requires Moment.js >= 2.9.0. You are using Moment.js ' + moment.version + '.');
		}
		moment.defaultZone = name ? getZone(name) : null;
		return moment;
	};

	// Cloning a moment should include the _z property.
	var momentProperties = moment.momentProperties;
	if (Object.prototype.toString.call(momentProperties) === '[object Array]') {
		// moment 2.8.1+
		momentProperties.push('_z');
		momentProperties.push('_a');
	} else if (momentProperties) {
		// moment 2.7.0
		momentProperties._z = null;
	}

	loadData({
		"version": "2021e",
		"zones": [
			"Africa/Abidjan|GMT|0|0||48e5",
			"Africa/Nairobi|EAT|-30|0||47e5",
			"Africa/Algiers|WET WEST CET CEST|0 -10 -10 -20|01012320102|3bX0 11A0 dDd0 17b0 11B0 1cN0 2Dy0 1cN0 1fB0 1cL0|26e5",
			"Africa/Lagos|WAT|-10|0||17e6",
			"Africa/Bissau|-01 GMT|10 0|01|cap0|39e4",
			"Africa/Maputo|CAT|-20|0||26e5",
			"Africa/Cairo|EET EEST|-20 -30|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|LX0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1WL0 rd0 1Rz0 wp0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1qL0 Xd0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1ny0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 WL0 1qN0 Rb0 1wp0 On0 1zd0 Lz0 1EN0 Fb0 c10 8n0 8Nd0 gL0 e10 mn0|15e6",
			"Africa/Casablanca|+00 +01|0 -10|01010101010101010101010101010101010101010101010101010101010101010101010|aS00 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4mn0 SyN0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0 2600 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600|32e5",
			"Africa/Ceuta|WET WEST CET CEST|0 -10 -10 -20|0101010102323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|aS00 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4VB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|85e3",
			"Africa/El_Aaiun|-01 +00 +01|10 0 -10|01212121212121212121212121212121212121212121212121212121212121212121|fi10 6L0 AL0 1Nd0 XX0 1Cp0 pz0 1cBB0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0 2600 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600|20e4",
			"Africa/Johannesburg|SAST|-20|0||84e5",
			"Africa/Juba|CAT CAST EAT|-20 -30 -30|01010101010101010101010101010101020|LW0 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0 PeX0|",
			"Africa/Khartoum|CAT CAST EAT|-20 -30 -30|01010101010101010101010101010101020|LW0 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0 HjL0|51e5",
			"Africa/Monrovia|MMT GMT|I.u 0|01|4SoI.u|11e5",
			"Africa/Ndjamena|WAT WAST|-10 -20|010|nNb0 Wn0|13e5",
			"Africa/Sao_Tome|GMT WAT|0 -10|010|1UQN0 2q00|",
			"Africa/Tripoli|EET CET CEST|-20 -10 -20|0121212121212121210120120|tda0 A10 1db0 1cN0 1db0 1dd0 1db0 1eN0 1bb0 1e10 1cL0 1c10 1db0 1dd0 1db0 1cN0 1db0 1q10 fAn0 1ep0 1db0 AKq0 TA0 1o00|11e5",
			"Africa/Tunis|CET CEST|-10 -20|0101010101010101010|hOn0 WM0 1rA0 11c0 nwo0 Ko0 1cM0 1cM0 1rA0 10M0 zuM0 10N0 1aN0 1qM0 WM0 1qM0 11A0 1o00|20e5",
			"Africa/Windhoek|SAST CAT WAT|-20 -20 -10|01212121212121212121212121212121212121212121212121|Ndy0 9Io0 16P0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0|32e4",
			"America/Adak|BST BDT AHST HST HDT|b0 a0 a0 a0 90|0101010101010101010101010101234343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|Kd0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|326",
			"America/Anchorage|AHST AHDT YST AKST AKDT|a0 90 90 90 80|0101010101010101010101010101234343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|Kc0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|30e4",
			"America/Puerto_Rico|AST|40|0||24e5",
			"America/Araguaina|-03 -02|30 20|01010101010101010101010101010|CxD0 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 ny10 Lz0|14e4",
			"America/Argentina/Buenos_Aires|-03 -02|30 20|01010101010101010|9Rf0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 A4p0 uL0 1qN0 WL0|",
			"America/Argentina/Catamarca|-03 -02 -04|30 20 40|01010101210102010|9Rf0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 7B0 8zb0 uL0|",
			"America/Argentina/Cordoba|-03 -02 -04|30 20 40|01010101210101010|9Rf0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0 1qN0 WL0|",
			"America/Argentina/Jujuy|-03 -02 -04|30 20 40|010101202101010|9Rf0 Db0 zvd0 Bz0 1tB0 TX0 1ze0 TX0 1ld0 WK0 1wp0 TX0 A4p0 uL0|",
			"America/Argentina/La_Rioja|-03 -02 -04|30 20 40|010101012010102010|9Rf0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0|",
			"America/Argentina/Mendoza|-03 -02 -04|30 20 40|01010120202102010|9Rf0 Db0 zvd0 Bz0 1tB0 TX0 1u20 SL0 1vd0 Tb0 1wp0 TW0 ri10 Op0 7TX0 uL0|",
			"America/Argentina/Rio_Gallegos|-03 -02 -04|30 20 40|01010101010102010|9Rf0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0|",
			"America/Argentina/Salta|-03 -02 -04|30 20 40|010101012101010|9Rf0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0|",
			"America/Argentina/San_Juan|-03 -02 -04|30 20 40|010101012010102010|9Rf0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rld0 m10 8lb0 uL0|",
			"America/Argentina/San_Luis|-03 -02 -04|30 20 40|010101202020102020|9Rf0 Db0 zvd0 Bz0 1tB0 XX0 1q20 SL0 AN0 vDb0 m10 8lb0 8L0 jd0 1qN0 WL0 1qN0|",
			"America/Argentina/Tucuman|-03 -02 -04|30 20 40|0101010121010201010|9Rf0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 4N0 8BX0 uL0 1qN0 WL0|",
			"America/Argentina/Ushuaia|-03 -02 -04|30 20 40|01010101010102010|9Rf0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rkN0 8p0 8zb0 uL0|",
			"America/Asuncion|-04 -03|40 30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|6FE0 3CL0 3Dd0 10L0 1pB0 10n0 1pB0 10n0 1pB0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1lB0 14n0 1dd0 1cL0 1fd0 WL0 1rd0 1aL0 1dB0 Xz0 1qp0 Xb0 1qN0 10L0 1rB0 TX0 1tB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 WN0 1qL0 11B0 1nX0 1ip0 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 TX0 1tB0 19X0 1a10 1fz0 1a10 1fz0 1cN0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0|28e5",
			"America/Panama|EST|50|0||15e5",
			"America/Bahia_Banderas|PST MST MDT CDT CST|80 70 60 50 60|012121212121212121212121212121343434343434343434343434343434343434343434|80 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nW0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0|84e3",
			"America/Bahia|-03 -02|30 20|010101010101010101010101010101010101010|CxD0 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 l5B0 Rb0|27e5",
			"America/Barbados|AST ADT|40 30|010101010|i7G0 IL0 1ip0 17b0 1ip0 17b0 1ld0 13b0|28e4",
			"America/Belem|-03 -02|30 20|0101010|CxD0 Rb0 1tB0 IL0 1Fd0 FX0|20e5",
			"America/Belize|CST CDT|60 50|01010|9xG0 qn0 lxB0 mn0|57e3",
			"America/Boa_Vista|-04 -03|40 30|01010101010|CxE0 Rb0 1tB0 IL0 1Fd0 FX0 smp0 WL0 1tB0 2L0|62e2",
			"America/Bogota|-05 -04|50 40|010|Snh0 2en0|90e5",
			"America/Boise|MST MDT|70 60|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|K90 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 Dd0 1Kn0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e4",
			"America/Cambridge_Bay|MST MDT CST CDT EST|70 60 60 50 50|01010101010101010101010101010101010101012342101010101010101010101010101010101010101010101010101010101010|p7J0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11A0 1nX0 2K0 WQ0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e2",
			"America/Campo_Grande|-04 -03|40 30|010101010101010101010101010101010101010101010101010101010101010101010|CxE0 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|77e4",
			"America/Cancun|CST EST EDT CDT|60 50 40 50|012121230303030303030303030303030303030301|t9G0 yLB0 1lb0 14p0 1lb0 14p0 Lz0 xB0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 Dd0|63e4",
			"America/Caracas|-04 -0430|40 4u|010|1wmv0 kqo0|29e5",
			"America/Cayenne|-03|30|0||58e3",
			"America/Chicago|CST CDT|60 50|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|K80 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|92e5",
			"America/Chihuahua|CST CDT MDT MST|60 50 60 70|01010232323232323232323232323232323232323232323232323232323232323232323|13Vk0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0|81e4",
			"America/Costa_Rica|CST CDT|60 50|010101010|mgS0 Db0 1Kp0 Db0 pRB0 15b0 1kp0 mL0|12e5",
			"America/Phoenix|MST|70|0||42e5",
			"America/Cuiaba|-04 -03|40 30|0101010101010101010101010101010101010101010101010101010101010101010|CxE0 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 4a10 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|54e4",
			"America/Danmarkshavn|-03 -02 GMT|30 20 0|0101010101010101010101010101010102|oXh0 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 DC0|8",
			"America/Dawson_Creek|PST PDT MST|80 70 70|0101012|Ka0 1cL0 1cN0 1fz0 1cN0 ML0|12e3",
			"America/Dawson|YST PST PDT MST|90 80 70 70|012121212121212121212121212121212121212121212121212121212121212121212121212121212123|9ix0 fNd0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1z90|13e2",
			"America/Denver|MST MDT|70 60|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|K90 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e5",
			"America/Detroit|EST EDT|50 40|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|85H0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e5",
			"America/Edmonton|MST MDT|70 60|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|5E90 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|10e5",
			"America/Eirunepe|-05 -04|50 40|01010101010|CxF0 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0 yTd0 d5X0|31e3",
			"America/El_Salvador|CST CDT|60 50|01010|Gcu0 WL0 1qN0 WL0|11e5",
			"America/Tijuana|PST PDT|80 70|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|fmy0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|20e5",
			"America/Fort_Nelson|PST PDT MST|80 70 70|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010102|Ka0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0|39e2",
			"America/Fort_Wayne|EST EDT|50 40|01010101010101010101010101010101010101010101010101010|K70 1cL0 1qhd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"America/Fortaleza|-03 -02|30 20|01010101010101010|CxD0 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 5z0 2mN0 On0|34e5",
			"America/Glace_Bay|AST ADT|40 30|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|5E60 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3",
			"America/Godthab|-03 -02|30 20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|oXh0 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|17e3",
			"America/Goose_Bay|AST ADT ADDT|40 30 20|010101010101010101010101010101010101020101010101010101010101010101010101010101010101010101010101010101010101010101010101010|K60 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|76e2",
			"America/Grand_Turk|EST EDT AST|50 40 40|0101010101010101010101010101010101010101010101010101010101010101010101010210101010101010101010101010|mG70 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 7jA0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e2",
			"America/Guatemala|CST CDT|60 50|010101010|9tG0 An0 mtd0 Nz0 ifB0 17b0 zDB0 11z0|13e5",
			"America/Guayaquil|-05 -04|50 40|010|TKR0 rz0|27e5",
			"America/Guyana|-0345 -03 -04|3J 30 40|012|dzfJ Ey0f|80e4",
			"America/Halifax|AST ADT|40 30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|K60 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|39e4",
			"America/Havana|CST CDT|50 40|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|K50 1cL0 1cN0 1fz0 1cN0 14n0 1ld0 14L0 1kN0 15b0 1kp0 1cL0 1cN0 1fz0 1a10 1fz0 1fB0 11z0 14p0 1nX0 11B0 1nX0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 1a10 1in0 1a10 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 17c0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 11A0 6i00 Rc0 1wo0 U00 1tA0 Rc0 1wo0 U00 1wo0 U00 1zc0 U00 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0|21e5",
			"America/Hermosillo|PST MST MDT|80 70 60|01212121|80 13Vd0 1lb0 14p0 1lb0 14p0 1lb0|64e4",
			"America/Indiana/Knox|CST CDT EST|60 50 50|01010101010101010101010101010101010101010101210101010101010101010101010101010101010101010101010|K80 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 z8o0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"America/Indiana/Marengo|EST EDT CDT|50 40 50|010101010201010101010101010101010101010101010101010101010101010|K70 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1e6p0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"America/Indiana/Petersburg|CST CDT EST EDT|60 50 50 40|0101010101010101210123232323232323232323232323232323232323232323232|K80 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 19co0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"America/Indiana/Tell_City|EST EDT CDT CST|50 40 50 60|01023232323232323232323232323232323232323232323232323|K70 1cL0 1qhd0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"America/Indiana/Vevay|EST EDT|50 40|010101010101010101010101010101010101010101010101010101010|K70 1cL0 1cN0 1fz0 1cN0 1cL0 1lnd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"America/Indiana/Vincennes|EST EDT CDT CST|50 40 50 60|01023201010101010101010101010101010101010101010101010|K70 1cL0 1qhd0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"America/Indiana/Winamac|EST EDT CDT CST|50 40 50 60|01023101010101010101010101010101010101010101010101010|K70 1cL0 1qhd0 1o00 Rd0 1za0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"America/Inuvik|PST MST MDT|80 70 60|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|mGa0 2pz0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|35e2",
			"America/Iqaluit|EST EDT CST CDT|50 40 60 50|0101010101010101010101010101010101010101230101010101010101010101010101010101010101010101010101010101010|p7H0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|67e2",
			"America/Jamaica|EST EDT|50 40|010101010101010101010|9Kv0 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0|94e4",
			"America/Juneau|PST PDT YDT YST AKST AKDT|80 70 80 90 90 80|0101010101010101010102010101345454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|Ka0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cM0 1cM0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|33e3",
			"America/Kentucky/Louisville|EST EDT CDT|50 40 50|010101010201010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|K70 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"America/Kentucky/Monticello|CST CDT EST EDT|60 50 50 40|010101010101010101010101010101010101010101010101010101010101012323232323232323232323232323232323232323232323232323232323232|K80 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"America/La_Paz|-04|40|0||19e5",
			"America/Lima|-05 -04|50 40|010101010|CVF0 zX0 1O10 zX0 6Gp0 zX0 98p0 zX0|11e6",
			"America/Los_Angeles|PST PDT|80 70|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|Ka0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e6",
			"America/Maceio|-03 -02|30 20|0101010101010101010|CxD0 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 8Q10 WL0 1tB0 5z0 2mN0 On0|93e4",
			"America/Managua|CST EST CDT|60 50 50|010202010102020|86u0 4mn0 9Up0 Dz0 1K10 Dz0 s3F0 1KH0 DB0 9In0 k8p0 19X0 1o30 11y0|22e5",
			"America/Manaus|-04 -03|40 30|010101010|CxE0 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0|19e5",
			"America/Martinique|AST ADT|40 30|010|oXg0 19X0|39e4",
			"America/Matamoros|CST CDT|60 50|0101010101010101010101010101010101010101010101010101010101010101010101010|IqU0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|45e4",
			"America/Mazatlan|PST MST MDT|80 70 60|012121212121212121212121212121212121212121212121212121212121212121212121|80 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0|44e4",
			"America/Menominee|EST CDT CST|50 50 60|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|85H0 1cM0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|85e2",
			"America/Merida|CST EST CDT|60 50 50|0102020202020202020202020202020202020202020202020202020202020202020202020|t9G0 2hz0 wu30 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0|11e5",
			"America/Metlakatla|PST PDT AKST AKDT|80 70 90 80|0101010101010101010101010101023232302323232323232323232323232|Ka0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1hU10 Rd0 1zb0 Op0 1zb0 Op0 1zb0 uM0 jB0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2",
			"America/Mexico_City|CST CDT|60 50|01010101010101010101010101010101010101010101010101010101010101010101010|13Vk0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0|20e6",
			"America/Miquelon|AST -03 -02|40 30 20|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|p9g0 gQ10 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|61e2",
			"America/Moncton|AST ADT|40 30|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|K60 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14n1 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 ReX 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|64e3",
			"America/Monterrey|CST CDT|60 50|0101010101010101010101010101010101010101010101010101010101010101010101010|IqU0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0|41e5",
			"America/Montevideo|-03 -02 -0130 -0230|30 20 1u 2u|0101023010101010101010101010101010101010101010101010|JD0 jX0 4vB0 xz0 3Cp0 mmu 1a10 IMu Db0 4c10 uL0 1Nd0 An0 1SN0 uL0 mp0 28L0 iPB0 un0 1SN0 xz0 1zd0 Lz0 1zd0 Rb0 1zd0 On0 1wp0 Rb0 s8p0 1fB0 1ip0 11z0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 11z0|17e5",
			"America/Toronto|EST EDT|50 40|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|K70 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e5",
			"America/New_York|EST EDT|50 40|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|K70 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e6",
			"America/Nipigon|EST EDT|50 40|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|avj0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|16e2",
			"America/Nome|BST BDT YST AKST AKDT|b0 a0 90 90 80|0101010101010101010101010101234343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|Kd0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cl0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|38e2",
			"America/Noronha|-02 -01|20 10|01010101010101010|CxC0 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|30e2",
			"America/North_Dakota/Beulah|MST MDT CST CDT|70 60 60 50|010101010101010101010101010101010101010101010101010101010101010101010101010101010123232323232323232323232323232323232323232|K90 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"America/North_Dakota/Center|MST MDT CST CDT|70 60 60 50|010101010101010101010101010101010101010101010123232323232323232323232323232323232323232323232323232323232323232323232323232|K90 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"America/North_Dakota/New_Salem|MST MDT CST CDT|70 60 60 50|010101010101010101010101010101010101010101010101010101010101010101012323232323232323232323232323232323232323232323232323232|K90 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"America/Ojinaga|CST CDT MDT MST|60 50 60 70|01010232323232323232323232323232323232323232323232323232323232323232323|13Vk0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e3",
			"America/Pangnirtung|AST ADT EDT EST CST CDT|40 30 40 50 60 50|0101010101010101010101010101010232323232453232323232323232323232323232323232323232323232323232323232323|p7G0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1o00 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2",
			"America/Paramaribo|-0330 -03|3u 30|01|zSPu|24e4",
			"America/Port-au-Prince|EST EDT|50 40|01010101010101010101010101010101010101010101010101010101010101010101010|wu50 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14q0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 i6n0 1nX0 11B0 1nX0 d430 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 3iN0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5",
			"America/Rio_Branco|-05 -04|50 40|010101010|CxF0 Rb0 1tB0 IL0 1Fd0 FX0 NBd0 d5X0|31e4",
			"America/Porto_Velho|-04 -03|40 30|0101010|CxE0 Rb0 1tB0 IL0 1Fd0 FX0|37e4",
			"America/Punta_Arenas|-03 -04|30 40|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|yP0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|",
			"America/Rainy_River|CST CDT|60 50|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|avk0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|842",
			"America/Rankin_Inlet|CST CDT EST|60 50 50|0101010101010101010101010101010101010101012101010101010101010101010101010101010101010101010101010101010|p7I0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e2",
			"America/Recife|-03 -02|30 20|01010101010101010|CxD0 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|33e5",
			"America/Regina|CST|60|0||19e4",
			"America/Resolute|CST CDT EST|60 50 50|0101010101010101010101010101010101010101012101010101012101010101010101010101010101010101010101010101010|p7I0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|229",
			"America/Santarem|-04 -03|40 30|01010101|CxE0 Rb0 1tB0 IL0 1Fd0 FX0 NBd0|21e4",
			"America/Santiago|-03 -04|30 40|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|yP0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0|62e5",
			"America/Santo_Domingo|-0430 EST AST|4u 50 40|0101010101212|ksu 1Cou yLu 1RAu wLu 1QMu xzu 1Q0u xXu 1PAu 13jB0 e00|29e5",
			"America/Sao_Paulo|-03 -02|30 20|010101010101010101010101010101010101010101010101010101010101010101010|CxD0 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|20e6",
			"America/Scoresbysund|-02 -01 +00|20 10 0|0102121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|oXg0 1a00 1cK0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|452",
			"America/Sitka|PST PDT YST AKST AKDT|80 70 90 90 80|0101010101010101010101010101234343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|Ka0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|90e2",
			"America/St_Johns|NST NDT NDDT|3u 2u 1u|010101010101010101010101010101010101020101010101010101010101010101010101010101010101010101010101010101010101010101010101010|K5u 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4",
			"America/Swift_Current|MST CST|70 60|01|5E90|16e3",
			"America/Tegucigalpa|CST CDT|60 50|0101010|Gcu0 WL0 1qN0 WL0 GRd0 AL0|11e5",
			"America/Thule|AST ADT|40 30|010101010101010101010101010101010101010101010101010101010101010101010101010101010|PHG0 1cL0 1cN0 1cL0 1fB0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|656",
			"America/Thunder_Bay|EST EDT|50 40|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|K70 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4",
			"America/Vancouver|PST PDT|80 70|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|Ka0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5",
			"America/Whitehorse|PST PDT MST|80 70 70|01010101010101010101010101010101010101010101010101010101010101010101010101010101012|p7K0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1z90|23e3",
			"America/Winnipeg|CST CDT|60 50|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|K80 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|66e4",
			"America/Yakutat|YST YDT AKST AKDT|90 80 90 80|0101010101010101010101010101023232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|Kb0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cn0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|642",
			"America/Yellowknife|MST MDT|70 60|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|p7J0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3",
			"Antarctica/Casey|+08 +11|-80 -b0|010101010101|1ARS0 T90 40P0 KL0 blz0 3m10 1o30 14k0 1kr0 12l0 1o01|10",
			"Antarctica/Davis|+07 +05|-70 -50|01010|1ART0 VB0 3Wn0 KN0|70",
			"Pacific/Port_Moresby|+10|-a0|0||25e4",
			"Antarctica/Macquarie|AEDT AEST|-b0 -a0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|qg0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 3Co0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|1",
			"Antarctica/Mawson|+06 +05|-60 -50|01|1ARU0|60",
			"Pacific/Auckland|NZST NZDT|-c0 -d0|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|bKC0 IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00|14e5",
			"Antarctica/Palmer|-03 -02 -04|30 20 40|01020202020202020202020202020202020202020202020202020202020202020202020|9Rf0 Db0 jsN0 14N0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|40",
			"Antarctica/Rothera|-00 -03|0 30|01|gOo0|130",
			"Asia/Riyadh|+03|-30|0||57e5",
			"Antarctica/Troll|-00 +00 +02|0 0 -20|012121212121212121212121212121212121212121212121212121|1puo0 hd0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|40",
			"Asia/Urumqi|+06|-60|0||32e5",
			"Europe/Berlin|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|oXd0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|41e5",
			"Asia/Almaty|+06 +07 +05|-60 -70 -50|0101010101010101010102010101010101010101010101010|rn60 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|15e5",
			"Asia/Amman|EET EEST|-20 -30|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|8kK0 KL0 1oN0 11b0 1oN0 11b0 1pd0 1dz0 1cp0 11b0 1op0 11b0 fO10 1db0 1e10 1cL0 1cN0 1cL0 1cN0 1fz0 1pd0 10n0 1ld0 14n0 1hB0 15b0 1ip0 19X0 1cN0 1cL0 1cN0 17b0 1ld0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1So0 y00 1fc0 1dc0 1co0 1dc0 1cM0 1cM0 1cM0 1o00 11A0 1lc0 17c0 1cM0 1cM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 4bX0 Dd0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 LA0 1C00 LA0 1C00 Oo0 1zc0 Oo0 1C00 LA0 1C00 LA0 1C00 LA0 1C00 LA0 1C00 Oo0 1zc0|25e5",
			"Asia/Anadyr|+13 +14 +12 +11|-d0 -e0 -c0 -b0|010202020202020202023202020202020202020202020202020202020232|rmX0 1db0 2q10 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|13e3",
			"Asia/Aqtau|+05 +06 +04|-50 -60 -40|0101010101010101010201010120202020202020202020|sAj0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|15e4",
			"Asia/Aqtobe|+05 +06 +04|-50 -60 -40|01010101010101010102010101010101010101010101010|rn70 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|27e4",
			"Asia/Ashgabat|+05 +06 +04|-50 -60 -40|01010101010101010101020|rn70 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0|41e4",
			"Asia/Atyrau|+05 +06 +04|-50 -60 -40|010101010101010101020101010101010102020202020|sAj0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 2sp0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|",
			"Asia/Baghdad|+03 +04|-30 -40|01010101010101010101010101010101010101010101010101010|u190 11b0 1cp0 1dz0 1dd0 1db0 1cN0 1cp0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1de0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0|66e5",
			"Asia/Qatar|+04 +03|-40 -30|01|5QI0|96e4",
			"Asia/Baku|+04 +05 +03|-40 -50 -30|010101010101010101010201010101010101010101010101010101010101010|rn80 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 9Je0 1o00 11z0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|27e5",
			"Asia/Bangkok|+07|-70|0||15e6",
			"Asia/Barnaul|+07 +08 +06|-70 -80 -60|01010101010101010101020101010102020202020202020202020202020202020|rn50 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 p90 LE0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|",
			"Asia/Beirut|EET EEST|-20 -30|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|61a0 En0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1op0 11b0 dA10 17b0 1iN0 17b0 1iN0 17b0 1iN0 17b0 1vB0 SL0 1mp0 13z0 1iN0 17b0 1iN0 17b0 1jd0 12n0 1a10 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0|22e5",
			"Asia/Bishkek|+06 +07 +05|-60 -70 -50|0101010101010101010102020202020202020202020202020|rn60 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2e00 1tX0 17b0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1cPu 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0|87e4",
			"Asia/Brunei|+08|-80|0||42e4",
			"Asia/Kolkata|IST|-5u|0||15e6",
			"Asia/Chita|+09 +10 +08|-90 -a0 -80|0101010101010101010102010101010101010101010101010101010101010120|rn30 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3re0|33e4",
			"Asia/Choibalsan|+07 +08 +10 +09|-70 -80 -a0 -90|012323232323232323232323232323232323232323232313131|jsF0 cKn0 1da0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 3Db0 h1f0 1cJ0 1cP0 1cJ0|38e3",
			"Asia/Shanghai|CST CDT|-80 -90|0101010101010|DKG0 Rb0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0|23e6",
			"Asia/Colombo|+0530 +0630 +06|-5u -6u -60|0120|14giu 11zu n3cu|22e5",
			"Asia/Dhaka|+06 +07|-60 -70|010|1A5R0 1i00|16e6",
			"Asia/Damascus|EET EEST|-20 -30|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|M00 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 Nb0 1AN0 Nb0 bcp0 19X0 1gp0 19X0 3ld0 1xX0 Vd0 1Bz0 Sp0 1vX0 10p0 1dz0 1cN0 1cL0 1db0 1db0 1g10 1an0 1ap0 1db0 1fd0 1db0 1cN0 1db0 1dd0 1db0 1cp0 1dz0 1c10 1dX0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 19z0 1fB0 1qL0 11B0 1on0 Wp0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0|26e5",
			"Asia/Dili|+09 +08|-90 -80|010|fpr0 Xld0|19e4",
			"Asia/Dubai|+04|-40|0||39e5",
			"Asia/Dushanbe|+06 +07 +05|-60 -70 -50|0101010101010101010102|rn60 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2hB0|76e4",
			"Asia/Famagusta|EET EEST +03|-20 -30 -30|0101010101010101010101010101010101010101010101010101010101010101010101010101010101012010101010101010101010101010|cPa0 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 15U0 2Ks0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|",
			"Asia/Gaza|IST IDT EET EEST|-20 -30 -20 -30|010101010101010101010101010101023232323232323232323232323232323232323232323232323232323232323232323232|aXa0 Db0 1fB0 Rb0 bXB0 gM0 8Q00 IM0 1wo0 TX0 1HB0 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18N0 1bz0 19z0 1gp0 1610 1iL0 11z0 1o10 14o0 1lA1 SKX 1xd1 MKX 1AN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nA0 1210 1qL0 WN0 1qL0 WN0 1qL0 11c0 1on0 11B0 1o00 11A0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1nA0 1200 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1nA0|18e5",
			"Asia/Hebron|IST IDT EET EEST|-20 -30 -20 -30|01010101010101010101010101010102323232323232323232323232323232323232323232323232323232323232323232323232|aXa0 Db0 1fB0 Rb0 bXB0 gM0 8Q00 IM0 1wo0 TX0 1HB0 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18N0 1bz0 19z0 1gp0 1610 1iL0 12L0 1mN0 14o0 1lc0 Tb0 1xd1 MKX bB0 cn0 1cN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nA0 1210 1qL0 WN0 1qL0 WN0 1qL0 11c0 1on0 11B0 1o00 11A0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1nA0 1200 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1nA0|25e4",
			"Asia/Ho_Chi_Minh|+08 +07|-80 -70|01|dfs0|90e5",
			"Asia/Hong_Kong|HKT HKST|-80 -90|01010101010101010|H7u 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1cL0 6fd0 14n0|73e5",
			"Asia/Hovd|+06 +07 +08|-60 -70 -80|01212121212121212121212121212121212121212121212121|jsG0 cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|81e3",
			"Asia/Irkutsk|+08 +09 +07|-80 -90 -70|010101010101010101010201010101010101010101010101010101010101010|rn40 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4",
			"Europe/Istanbul|EET EEST +03 +04|-20 -30 -30 -40|01010101010123201010101010101010101010101010101010101010101010101010101010101012|8jz0 11A0 WN0 1qL0 TB0 1tX0 U10 1tz0 11B0 1in0 17d0 z90 cne0 pb0 2Cp0 1800 14o0 1dc0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1a00 1fA0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WO0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 Xc0 1qo0 WM0 1qM0 11A0 1o00 1200 1nA0 11A0 1tA0 U00 15w0|13e6",
			"Asia/Jakarta|WIB|-70|0||31e6",
			"Asia/Jayapura|WIT|-90|0||26e4",
			"Asia/Jerusalem|IST IDT|-20 -30|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|aXa0 Db0 1fB0 Rb0 bXB0 gM0 8Q00 IM0 1wo0 TX0 1HB0 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 1hB0 1dX0 1ep0 1aL0 1eN0 17X0 1nf0 11z0 1tB0 19W0 1e10 17b0 1ep0 1gL0 18N0 1fz0 1eN0 17b0 1gq0 1gn0 19d0 1dz0 1c10 17X0 1hB0 1gn0 19d0 1dz0 1c10 17X0 1kp0 1dz0 1c10 1aL0 1eN0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0|81e4",
			"Asia/Kabul|+0430|-4u|0||46e5",
			"Asia/Kamchatka|+12 +13 +11|-c0 -d0 -b0|0101010101010101010102010101010101010101010101010101010101020|rn00 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|18e4",
			"Asia/Karachi|+05 PKT PKST|-50 -50 -60|01212121|2Xv0 1fy00 1cL0 dK10 11b0 1610 1jX0|24e6",
			"Asia/Kathmandu|+0530 +0545|-5u -5J|01|CVuu|12e5",
			"Asia/Khandyga|+09 +10 +08 +11|-90 -a0 -80 -b0|01010101010101010101020101010101010101010101010131313131313131310|rn30 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 qK0 yN0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|66e2",
			"Asia/Krasnoyarsk|+07 +08 +06|-70 -80 -60|010101010101010101010201010101010101010101010101010101010101010|rn50 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|10e5",
			"Asia/Kuala_Lumpur|+0730 +08|-7u -80|01|td4u|71e5",
			"Asia/Macau|CST CDT|-80 -90|01010101010101010|H7u 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1cL0 6fd0 14n0|57e4",
			"Asia/Magadan|+11 +12 +10|-b0 -c0 -a0|0101010101010101010102010101010101010101010101010101010101010120|rn10 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Cq0|95e3",
			"Asia/Makassar|WITA|-80|0||15e5",
			"Asia/Manila|PST PDT|-80 -90|010|k0E0 1db0|24e6",
			"Asia/Nicosia|EET EEST|-20 -30|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|cPa0 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|32e4",
			"Asia/Novokuznetsk|+07 +08 +06|-70 -80 -60|0101010101010101010102010101010101010101010101010101010101020|rn50 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|55e4",
			"Asia/Novosibirsk|+07 +08 +06|-70 -80 -60|01010101010101010101020101020202020202020202020202020202020202020|rn50 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 ml0 Os0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 4eN0|15e5",
			"Asia/Omsk|+06 +07 +05|-60 -70 -50|010101010101010101010201010101010101010101010101010101010101010|rn60 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|12e5",
			"Asia/Oral|+05 +06 +04|-50 -60 -40|010101010101010202020202020202020202020202020|rn70 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 1cM0 IM0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|27e4",
			"Asia/Pontianak|WITA WIB|-80 -70|01|HNs0|23e4",
			"Asia/Pyongyang|KST KST|-90 -8u|010|1P4D0 6BA0|29e5",
			"Asia/Qostanay|+05 +06 +04|-50 -60 -40|0101010101010101010201010101010101010101010101|rn70 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|",
			"Asia/Qyzylorda|+05 +06|-50 -60|010101010101010101010101010101010101010101010|rn70 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 3ao0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 zQl0|73e4",
			"Asia/Rangoon|+0630|-6u|0||48e5",
			"Asia/Sakhalin|+11 +12 +10|-b0 -c0 -a0|010101010101010101010201010101010202020202020202020202020202020|rn10 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 2pB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|58e4",
			"Asia/Samarkand|+05 +06|-50 -60|010101010101010101010|rn70 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|36e4",
			"Asia/Seoul|KST KDT|-90 -a0|01010|Gf50 11A0 1o00 11A0|23e6",
			"Asia/Srednekolymsk|+11 +12 +10|-b0 -c0 -a0|010101010101010101010201010101010101010101010101010101010101010|rn10 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|35e2",
			"Asia/Taipei|CST CDT|-80 -90|0101010|akg0 1db0 1cN0 1db0 97B0 AL0|74e5",
			"Asia/Tashkent|+06 +07 +05|-60 -70 -50|0101010101010101010102|rn60 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0|23e5",
			"Asia/Tbilisi|+04 +05 +03|-40 -50 -30|01010101010101010101020202010101010101010101020|rn80 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cK0 1cL0 1cN0 1cL0 1cN0 2pz0 1cL0 1fB0 3Nz0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 An0 Os0 WM0|11e5",
			"Asia/Tehran|+0330 +04 +05 +0430|-3u -40 -50 -4u|0121030303030303030303030303030303030303030303030303030303030303030303030303030303030|j4ku TXu 1pz0 sN0 vAu 1cL0 1dB0 1en0 pNB0 UL0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 64p0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0|14e6",
			"Asia/Thimphu|+0530 +06|-5u -60|01|HcGu|79e3",
			"Asia/Tokyo|JST|-90|0||38e6",
			"Asia/Tomsk|+07 +08 +06|-70 -80 -60|01010101010101010101020101010101010101010101020202020202020202020|rn50 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 co0 1bB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Qp0|10e5",
			"Asia/Ulaanbaatar|+07 +08 +09|-70 -80 -90|01212121212121212121212121212121212121212121212121|jsF0 cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|12e5",
			"Asia/Ust-Nera|+09 +12 +11 +10|-90 -c0 -b0 -a0|0121212121212121212123212121212121212121212121212121212121212123|rn30 1d90 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|65e2",
			"Asia/Vladivostok|+10 +11 +09|-a0 -b0 -90|010101010101010101010201010101010101010101010101010101010101010|rn20 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4",
			"Asia/Yakutsk|+09 +10 +08|-90 -a0 -80|010101010101010101010201010101010101010101010101010101010101010|rn30 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|28e4",
			"Asia/Yekaterinburg|+05 +06 +04|-50 -60 -40|010101010101010101010201010101010101010101010101010101010101010|rn70 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|14e5",
			"Asia/Yerevan|+04 +05 +03|-40 -50 -30|01010101010101010101020202020101010101010101010101010101010|rn80 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 4RX0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|13e5",
			"Atlantic/Azores|-01 +00 WET|10 0 0|0101010101010101010101010101010121010101010101010101010101010101010101010101010101010101010101010101010101010|hAN0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|25e4",
			"Atlantic/Bermuda|AST ADT|40 30|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|avi0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e3",
			"Atlantic/Canary|WET WEST|0 -10|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|oXc0 1a10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|54e4",
			"Atlantic/Cape_Verde|-02 -01|20 10|01|elE0|50e4",
			"Atlantic/Faroe|WET WEST|0 -10|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|rm10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|49e3",
			"Atlantic/Madeira|WET WEST|0 -10|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hAM0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|27e4",
			"Atlantic/South_Georgia|-02|20|0||30",
			"Atlantic/Stanley|-04 -03 -02|40 30 20|01212101010101010101010101010101010101010101010101010101|wrg0 WL0 1qL0 U10 1tz0 2mN0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 U10 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qN0 U10 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 U10 1tz0 U10 1tz0 U10|21e2",
			"Australia/Sydney|AEST AEDT|-a0 -b0|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|4r40 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|40e5",
			"Australia/Adelaide|ACST ACDT|-9u -au|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|4r4u LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 WM0 1qM0 Rc0 1zc0 U00 1tA0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|11e5",
			"Australia/Brisbane|AEST AEDT|-a0 -b0|010101010|4r40 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0|20e5",
			"Australia/Broken_Hill|ACST ACDT|-9u -au|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|4r4u LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|18e3",
			"Australia/Hobart|AEDT AEST|-b0 -a0|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|qg0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|21e4",
			"Australia/Darwin|ACST|-9u|0||12e4",
			"Australia/Eucla|+0845 +0945|-8J -9J|0101010101010|bHRf Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|368",
			"Australia/Lord_Howe|AEST +1030 +1130 +11|-a0 -au -bu -b0|01212121213131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313|raC0 1zdu Rb0 1zd0 On0 1zd0 On0 1zd0 On0 1zd0 TXu 1qMu WLu 1tAu WLu 1tAu TXu 1tAu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu 11zu 1o0u 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 11Au 1nXu 1qMu 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 1qMu 11zu 1o0u WLu 1qMu 14nu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu|347",
			"Australia/Lindeman|AEST AEDT|-a0 -b0|0101010101010|4r40 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0|10",
			"Australia/Melbourne|AEST AEDT|-a0 -b0|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|4r40 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1qM0 11A0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|39e5",
			"Australia/Perth|AWST AWDT|-80 -90|0101010101010|bHS0 Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|18e5",
			"Europe/Brussels|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|21e5",
			"Pacific/Easter|-06 -07 -05|60 70 50|010101010101010101010101020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202|yP0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 2pA0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0|30e2",
			"EET|EET EEST|-20 -30|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|",
			"Europe/Dublin|IST GMT|-10 0|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|4re0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|12e5",
			"Etc/GMT-1|+01|-10|0||",
			"Pacific/Guadalcanal|+11|-b0|0||11e4",
			"Pacific/Tarawa|+12|-c0|0||29e3",
			"Etc/GMT-13|+13|-d0|0||",
			"Etc/GMT-14|+14|-e0|0||",
			"Etc/GMT-2|+02|-20|0||",
			"Indian/Maldives|+05|-50|0||35e4",
			"Pacific/Palau|+09|-90|0||21e3",
			"Etc/GMT+1|-01|10|0||",
			"Pacific/Tahiti|-10|a0|0||18e4",
			"Pacific/Niue|-11|b0|0||12e2",
			"Etc/GMT+12|-12|c0|0||",
			"Etc/GMT+5|-05|50|0||",
			"Etc/GMT+6|-06|60|0||",
			"Etc/GMT+7|-07|70|0||",
			"Etc/GMT+8|-08|80|0||",
			"Pacific/Gambier|-09|90|0||125",
			"Etc/UTC|UTC|0|0||",
			"Europe/Andorra|CET CEST|-10 -20|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|B7d0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|79e3",
			"Europe/Astrakhan|+04 +05 +03|-40 -50 -30|0101010101010101020202020202020202020202020202020202020202020|rn80 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|10e5",
			"Europe/Athens|EET EEST|-20 -30|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|cOK0 1vc0 SO0 1cM0 1a00 1ao0 1fc0 1a10 1fG0 1cg0 1dX0 1bX0 1cQ0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|35e5",
			"Europe/London|BST GMT|-10 0|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|4re0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|10e6",
			"Europe/Belgrade|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|wdd0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|12e5",
			"Europe/Prague|CET CEST|-10 -20|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|muN0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|13e5",
			"Europe/Bucharest|EET EEST|-20 -30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|mRa0 On0 1fA0 1a10 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|19e5",
			"Europe/Budapest|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|oXb0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cO0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|17e5",
			"Europe/Zurich|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|rm10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|38e4",
			"Europe/Chisinau|MSK MSD EEST EET|-30 -40 -30 -20|010101010101010101012323232323232323232323232323232323232323232323232323232323232323232323232323232323|rn90 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 gL0 WO0 1cM0 1cM0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11D0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|67e4",
			"Europe/Gibraltar|CET CEST|-10 -20|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|tLB0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|30e3",
			"Europe/Helsinki|EET EEST|-20 -30|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|rm00 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|12e5",
			"Europe/Kaliningrad|MSK MSD EEST EET +03|-30 -40 -30 -20 -30|010101010101010102323232323232323232323232323232323232323232343|rn90 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|44e4",
			"Europe/Kiev|MSK MSD EEST EET|-30 -40 -30 -20|0101010101010101010123232323232323232323232323232323232323232323232323232323232323232323232323232323|rn90 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 Db0 3220 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|34e5",
			"Europe/Kirov|+04 +05 +03|-40 -50 -30|010101010101010102020202020202020202020202020202020202020202|rn80 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|48e4",
			"Europe/Lisbon|CET WET WEST CEST|-10 0 -10 -20|01212121212121212121212121212121203030302121212121212121212121212121212121212121212121212121212121212121212121|go00 1cM0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|27e5",
			"Europe/Madrid|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|apy0 1a10 1fz0 1a10 19X0 1cN0 1fz0 1a10 1fC0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|62e5",
			"Europe/Malta|CET CEST|-10 -20|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|XX0 LA0 1zc0 Oo0 1C00 Oo0 1co0 1cM0 1lA0 Xc0 1qq0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1iN0 19z0 1fB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|42e4",
			"Europe/Minsk|MSK MSD EEST EET +03|-30 -40 -30 -20 -30|010101010101010101023232323232323232323232323232323232323234|rn90 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 3Fc0 1cN0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0|19e5",
			"Europe/Paris|CET CEST|-10 -20|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|fbc0 1cL0 1fC0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|11e6",
			"Europe/Moscow|MSK MSD EEST EET MSK|-30 -40 -30 -20 -40|0101010101010101010102301010101010101010101010101010101010101040|rn90 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|16e6",
			"Europe/Riga|MSK MSD EEST EET|-30 -40 -30 -20|010101010101010102323232323232323232323232323232323232323232323232323232323232323232323232323232323|rn90 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 1o00 11A0 1o00 11A0 1qM0 3oo0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|64e4",
			"Europe/Rome|CET CEST|-10 -20|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|XX0 LA0 1zc0 Oo0 1C00 Oo0 1C00 LA0 1zc0 Oo0 1C00 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1zc0 Oo0 1fC0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|39e5",
			"Europe/Samara|+04 +05 +03|-40 -50 -30|01010101010101010202010101010101010101010101010101010101020|rn80 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2y10 14m0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|12e5",
			"Europe/Saratov|+04 +05 +03|-40 -50 -30|0101010101010102020202020202020202020202020202020202020202020|rn80 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 5810|",
			"Europe/Simferopol|MSK MSD EET EEST MSK|-30 -40 -20 -30 -40|0101010101010101010232323101010323232323232323232323232323232323240|rn90 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 4eL0 1cL0 1cN0 1cL0 1cN0 dX0 WL0 1cN0 1cL0 1fB0 1o30 11B0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11z0 1nW0|33e4",
			"Europe/Sofia|EET EEST|-20 -30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|muJ0 1dd0 1fb0 1ap0 1fb0 1a20 1fy0 1a30 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|12e5",
			"Europe/Tallinn|MSK MSD EEST EET|-30 -40 -30 -20|0101010101010101023232323232323232323232323232323232323232323232323232323232323232323232323232323|rn90 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o10 11A0 1qM0 5QM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|41e4",
			"Europe/Tirane|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|axz0 10n0 1op0 11z0 1pd0 11z0 1qN0 WL0 1qp0 Xb0 1qp0 Xb0 1qp0 11z0 1lB0 11z0 1qN0 11z0 1iN0 16n0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|42e4",
			"Europe/Ulyanovsk|+04 +05 +03 +02|-40 -50 -30 -20|010101010101010102023202020202020202020202020202020202020202020|rn80 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|13e5",
			"Europe/Uzhgorod|MSK MSD CET EET EEST|-30 -40 -10 -20 -30|010101010101010101023434343434343434343434343434343434343434343434343434343434343434343434343434343|rn90 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 1Nf0 2pw0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|11e4",
			"Europe/Vienna|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|oXb0 19X0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|18e5",
			"Europe/Vilnius|MSK MSD EEST EET CEST CET|-30 -40 -30 -20 -20 -10|01010101010101010232323232323232323454323232323232323232323232323232323232323232323232323232323|rn90 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11B0 1o00 11A0 1qM0 8io0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|54e4",
			"Europe/Volgograd|+04 +05 +03|-40 -50 -30|01010101010101020202020202020202020202020202020202020202020202|rn80 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 9Jd0 5gn0|10e5",
			"Europe/Warsaw|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDA0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|17e5",
			"Europe/Zaporozhye|MSK MSD EEST EET|-30 -40 -30 -20|01010101010101010101023232323232323232323232323232323232323232323232323232323232323232323232323232323|rn90 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cK0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|77e4",
			"Pacific/Honolulu|HST|a0|0||37e4",
			"Indian/Chagos|+05 +06|-50 -60|01|13ij0|30e2",
			"Indian/Mauritius|+04 +05|-40 -50|01010|v5U0 14L0 12kr0 11z0|15e4",
			"Pacific/Kwajalein|-12 +12|c0 -c0|01|Vxo0|14e3",
			"MET|MET MEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|",
			"Pacific/Chatham|+1245 +1345|-cJ -dJ|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|bKC0 IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00|600",
			"Pacific/Apia|-11 -10 +14 +13|b0 a0 -e0 -d0|010123232323232323232323|1Dbn0 1ff0 1a00 CI0 AQ0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0|37e3",
			"Pacific/Bougainville|+10 +11|-a0 -b0|01|1NwE0|18e4",
			"Pacific/Efate|+11 +12|-b0 -c0|01010101010101010101010|9EA0 Dc0 n610 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 Lz0 1Nd0 An0|66e3",
			"Pacific/Enderbury|-12 -11 +13|c0 b0 -d0|012|nIc0 B7X0|1",
			"Pacific/Fakaofo|-11 +13|b0 -d0|01|1Gfn0|483",
			"Pacific/Fiji|+12 +13|-c0 -d0|0101010101010101010101010101010101010101010101|1ace0 LA0 1EM0 IM0 nJc0 LA0 1o00 Rc0 1wo0 Ao0 1Nc0 Ao0 1Q00 xz0 1SN0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 20o0 pc0 2hc0 bc0 4q00 pc0 20o0 pc0 20o0 pc0 20o0 s00 1VA0 s00 20o0 pc0 20o0 pc0 20o0 pc0 20o0|88e4",
			"Pacific/Galapagos|-05 -06|50 60|0101|CVF0 gNd0 rz0|25e3",
			"Pacific/Guam|GST GDT ChST|-a0 -b0 -a0|010101010102|JQ0 Rb0 1wp0 Rb0 5xd0 rX0 5sN0 zb1 1C0X On0 ULb0|17e4",
			"Pacific/Kiritimati|-1040 -10 +14|aE a0 -e0|012|nIaE B7Xk|51e2",
			"Pacific/Kosrae|+12 +11|-c0 -b0|01|1aAA0|66e2",
			"Pacific/Marquesas|-0930|9u|0||86e2",
			"Pacific/Pago_Pago|SST|b0|0||37e2",
			"Pacific/Nauru|+1130 +12|-bu -c0|01|maCu|10e3",
			"Pacific/Norfolk|+1130 +1230 +11 +12|-bu -cu -b0 -c0|010232323232323232323232323|bHOu Oo0 1COo0 9Jcu 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|25e4",
			"Pacific/Noumea|+11 +12|-b0 -c0|0101010|jhp0 xX0 1PB0 yn0 HeP0 Ao0|98e3",
			"Pacific/Pitcairn|-0830 -08|8u 80|01|18Vku|56",
			"Pacific/Rarotonga|-1030 -0930 -10|au 9u a0|012121212121212121212121212|lyWu IL0 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu|13e3",
			"Pacific/Tongatapu|+13 +14|-d0 -e0|010101010|1csd0 15A0 1wo0 xz0 1Q10 xz0 zWN0 s00|75e3",
			"WET|WET WEST|0 -10|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|"
		],
		"links": [
			"Africa/Abidjan|Africa/Accra",
			"Africa/Abidjan|Africa/Bamako",
			"Africa/Abidjan|Africa/Banjul",
			"Africa/Abidjan|Africa/Conakry",
			"Africa/Abidjan|Africa/Dakar",
			"Africa/Abidjan|Africa/Freetown",
			"Africa/Abidjan|Africa/Lome",
			"Africa/Abidjan|Africa/Nouakchott",
			"Africa/Abidjan|Africa/Ouagadougou",
			"Africa/Abidjan|Africa/Timbuktu",
			"Africa/Abidjan|Atlantic/Reykjavik",
			"Africa/Abidjan|Atlantic/St_Helena",
			"Africa/Abidjan|Etc/GMT",
			"Africa/Abidjan|Etc/GMT+0",
			"Africa/Abidjan|Etc/GMT-0",
			"Africa/Abidjan|Etc/GMT0",
			"Africa/Abidjan|Etc/Greenwich",
			"Africa/Abidjan|GMT",
			"Africa/Abidjan|GMT+0",
			"Africa/Abidjan|GMT-0",
			"Africa/Abidjan|GMT0",
			"Africa/Abidjan|Greenwich",
			"Africa/Abidjan|Iceland",
			"Africa/Cairo|Egypt",
			"Africa/Johannesburg|Africa/Maseru",
			"Africa/Johannesburg|Africa/Mbabane",
			"Africa/Lagos|Africa/Bangui",
			"Africa/Lagos|Africa/Brazzaville",
			"Africa/Lagos|Africa/Douala",
			"Africa/Lagos|Africa/Kinshasa",
			"Africa/Lagos|Africa/Libreville",
			"Africa/Lagos|Africa/Luanda",
			"Africa/Lagos|Africa/Malabo",
			"Africa/Lagos|Africa/Niamey",
			"Africa/Lagos|Africa/Porto-Novo",
			"Africa/Maputo|Africa/Blantyre",
			"Africa/Maputo|Africa/Bujumbura",
			"Africa/Maputo|Africa/Gaborone",
			"Africa/Maputo|Africa/Harare",
			"Africa/Maputo|Africa/Kigali",
			"Africa/Maputo|Africa/Lubumbashi",
			"Africa/Maputo|Africa/Lusaka",
			"Africa/Nairobi|Africa/Addis_Ababa",
			"Africa/Nairobi|Africa/Asmara",
			"Africa/Nairobi|Africa/Asmera",
			"Africa/Nairobi|Africa/Dar_es_Salaam",
			"Africa/Nairobi|Africa/Djibouti",
			"Africa/Nairobi|Africa/Kampala",
			"Africa/Nairobi|Africa/Mogadishu",
			"Africa/Nairobi|Indian/Antananarivo",
			"Africa/Nairobi|Indian/Comoro",
			"Africa/Nairobi|Indian/Mayotte",
			"Africa/Tripoli|Libya",
			"America/Adak|America/Atka",
			"America/Adak|US/Aleutian",
			"America/Anchorage|US/Alaska",
			"America/Argentina/Buenos_Aires|America/Buenos_Aires",
			"America/Argentina/Catamarca|America/Argentina/ComodRivadavia",
			"America/Argentina/Catamarca|America/Catamarca",
			"America/Argentina/Cordoba|America/Cordoba",
			"America/Argentina/Cordoba|America/Rosario",
			"America/Argentina/Jujuy|America/Jujuy",
			"America/Argentina/Mendoza|America/Mendoza",
			"America/Cayenne|Etc/GMT+3",
			"America/Chicago|CST6CDT",
			"America/Chicago|US/Central",
			"America/Denver|America/Shiprock",
			"America/Denver|MST7MDT",
			"America/Denver|Navajo",
			"America/Denver|US/Mountain",
			"America/Detroit|US/Michigan",
			"America/Edmonton|Canada/Mountain",
			"America/Fort_Wayne|America/Indiana/Indianapolis",
			"America/Fort_Wayne|America/Indianapolis",
			"America/Fort_Wayne|US/East-Indiana",
			"America/Godthab|America/Nuuk",
			"America/Halifax|Canada/Atlantic",
			"America/Havana|Cuba",
			"America/Indiana/Knox|America/Knox_IN",
			"America/Indiana/Knox|US/Indiana-Starke",
			"America/Jamaica|Jamaica",
			"America/Kentucky/Louisville|America/Louisville",
			"America/La_Paz|Etc/GMT+4",
			"America/Los_Angeles|PST8PDT",
			"America/Los_Angeles|US/Pacific",
			"America/Manaus|Brazil/West",
			"America/Mazatlan|Mexico/BajaSur",
			"America/Mexico_City|Mexico/General",
			"America/New_York|EST5EDT",
			"America/New_York|US/Eastern",
			"America/Noronha|Brazil/DeNoronha",
			"America/Panama|America/Atikokan",
			"America/Panama|America/Cayman",
			"America/Panama|America/Coral_Harbour",
			"America/Panama|EST",
			"America/Phoenix|America/Creston",
			"America/Phoenix|MST",
			"America/Phoenix|US/Arizona",
			"America/Puerto_Rico|America/Anguilla",
			"America/Puerto_Rico|America/Antigua",
			"America/Puerto_Rico|America/Aruba",
			"America/Puerto_Rico|America/Blanc-Sablon",
			"America/Puerto_Rico|America/Curacao",
			"America/Puerto_Rico|America/Dominica",
			"America/Puerto_Rico|America/Grenada",
			"America/Puerto_Rico|America/Guadeloupe",
			"America/Puerto_Rico|America/Kralendijk",
			"America/Puerto_Rico|America/Lower_Princes",
			"America/Puerto_Rico|America/Marigot",
			"America/Puerto_Rico|America/Montserrat",
			"America/Puerto_Rico|America/Port_of_Spain",
			"America/Puerto_Rico|America/St_Barthelemy",
			"America/Puerto_Rico|America/St_Kitts",
			"America/Puerto_Rico|America/St_Lucia",
			"America/Puerto_Rico|America/St_Thomas",
			"America/Puerto_Rico|America/St_Vincent",
			"America/Puerto_Rico|America/Tortola",
			"America/Puerto_Rico|America/Virgin",
			"America/Regina|Canada/Saskatchewan",
			"America/Rio_Branco|America/Porto_Acre",
			"America/Rio_Branco|Brazil/Acre",
			"America/Santiago|Chile/Continental",
			"America/Sao_Paulo|Brazil/East",
			"America/St_Johns|Canada/Newfoundland",
			"America/Tijuana|America/Ensenada",
			"America/Tijuana|America/Santa_Isabel",
			"America/Tijuana|Mexico/BajaNorte",
			"America/Toronto|America/Montreal",
			"America/Toronto|America/Nassau",
			"America/Toronto|Canada/Eastern",
			"America/Vancouver|Canada/Pacific",
			"America/Whitehorse|Canada/Yukon",
			"America/Winnipeg|Canada/Central",
			"Asia/Ashgabat|Asia/Ashkhabad",
			"Asia/Bangkok|Asia/Phnom_Penh",
			"Asia/Bangkok|Asia/Vientiane",
			"Asia/Bangkok|Etc/GMT-7",
			"Asia/Bangkok|Indian/Christmas",
			"Asia/Brunei|Asia/Kuching",
			"Asia/Brunei|Etc/GMT-8",
			"Asia/Dhaka|Asia/Dacca",
			"Asia/Dubai|Asia/Muscat",
			"Asia/Dubai|Etc/GMT-4",
			"Asia/Dubai|Indian/Mahe",
			"Asia/Dubai|Indian/Reunion",
			"Asia/Ho_Chi_Minh|Asia/Saigon",
			"Asia/Hong_Kong|Hongkong",
			"Asia/Jerusalem|Asia/Tel_Aviv",
			"Asia/Jerusalem|Israel",
			"Asia/Kathmandu|Asia/Katmandu",
			"Asia/Kolkata|Asia/Calcutta",
			"Asia/Kuala_Lumpur|Asia/Singapore",
			"Asia/Kuala_Lumpur|Singapore",
			"Asia/Macau|Asia/Macao",
			"Asia/Makassar|Asia/Ujung_Pandang",
			"Asia/Nicosia|Europe/Nicosia",
			"Asia/Qatar|Asia/Bahrain",
			"Asia/Rangoon|Asia/Yangon",
			"Asia/Rangoon|Indian/Cocos",
			"Asia/Riyadh|Antarctica/Syowa",
			"Asia/Riyadh|Asia/Aden",
			"Asia/Riyadh|Asia/Kuwait",
			"Asia/Riyadh|Etc/GMT-3",
			"Asia/Seoul|ROK",
			"Asia/Shanghai|Asia/Chongqing",
			"Asia/Shanghai|Asia/Chungking",
			"Asia/Shanghai|Asia/Harbin",
			"Asia/Shanghai|PRC",
			"Asia/Taipei|ROC",
			"Asia/Tehran|Iran",
			"Asia/Thimphu|Asia/Thimbu",
			"Asia/Tokyo|Japan",
			"Asia/Ulaanbaatar|Asia/Ulan_Bator",
			"Asia/Urumqi|Antarctica/Vostok",
			"Asia/Urumqi|Asia/Kashgar",
			"Asia/Urumqi|Etc/GMT-6",
			"Atlantic/Faroe|Atlantic/Faeroe",
			"Atlantic/South_Georgia|Etc/GMT+2",
			"Australia/Adelaide|Australia/South",
			"Australia/Brisbane|Australia/Queensland",
			"Australia/Broken_Hill|Australia/Yancowinna",
			"Australia/Darwin|Australia/North",
			"Australia/Hobart|Australia/Currie",
			"Australia/Hobart|Australia/Tasmania",
			"Australia/Lord_Howe|Australia/LHI",
			"Australia/Melbourne|Australia/Victoria",
			"Australia/Perth|Australia/West",
			"Australia/Sydney|Australia/ACT",
			"Australia/Sydney|Australia/Canberra",
			"Australia/Sydney|Australia/NSW",
			"Etc/UTC|Etc/UCT",
			"Etc/UTC|Etc/Universal",
			"Etc/UTC|Etc/Zulu",
			"Etc/UTC|UCT",
			"Etc/UTC|UTC",
			"Etc/UTC|Universal",
			"Etc/UTC|Zulu",
			"Europe/Belgrade|Europe/Ljubljana",
			"Europe/Belgrade|Europe/Podgorica",
			"Europe/Belgrade|Europe/Sarajevo",
			"Europe/Belgrade|Europe/Skopje",
			"Europe/Belgrade|Europe/Zagreb",
			"Europe/Berlin|Arctic/Longyearbyen",
			"Europe/Berlin|Atlantic/Jan_Mayen",
			"Europe/Berlin|Europe/Copenhagen",
			"Europe/Berlin|Europe/Oslo",
			"Europe/Berlin|Europe/Stockholm",
			"Europe/Brussels|CET",
			"Europe/Brussels|Europe/Amsterdam",
			"Europe/Brussels|Europe/Luxembourg",
			"Europe/Chisinau|Europe/Tiraspol",
			"Europe/Dublin|Eire",
			"Europe/Helsinki|Europe/Mariehamn",
			"Europe/Istanbul|Asia/Istanbul",
			"Europe/Istanbul|Turkey",
			"Europe/Lisbon|Portugal",
			"Europe/London|Europe/Belfast",
			"Europe/London|Europe/Guernsey",
			"Europe/London|Europe/Isle_of_Man",
			"Europe/London|Europe/Jersey",
			"Europe/London|GB",
			"Europe/London|GB-Eire",
			"Europe/Moscow|W-SU",
			"Europe/Paris|Europe/Monaco",
			"Europe/Prague|Europe/Bratislava",
			"Europe/Rome|Europe/San_Marino",
			"Europe/Rome|Europe/Vatican",
			"Europe/Warsaw|Poland",
			"Europe/Zurich|Europe/Busingen",
			"Europe/Zurich|Europe/Vaduz",
			"Indian/Maldives|Etc/GMT-5",
			"Indian/Maldives|Indian/Kerguelen",
			"Pacific/Auckland|Antarctica/McMurdo",
			"Pacific/Auckland|Antarctica/South_Pole",
			"Pacific/Auckland|NZ",
			"Pacific/Chatham|NZ-CHAT",
			"Pacific/Easter|Chile/EasterIsland",
			"Pacific/Enderbury|Pacific/Kanton",
			"Pacific/Gambier|Etc/GMT+9",
			"Pacific/Guadalcanal|Etc/GMT-11",
			"Pacific/Guadalcanal|Pacific/Pohnpei",
			"Pacific/Guadalcanal|Pacific/Ponape",
			"Pacific/Guam|Pacific/Saipan",
			"Pacific/Honolulu|HST",
			"Pacific/Honolulu|Pacific/Johnston",
			"Pacific/Honolulu|US/Hawaii",
			"Pacific/Kwajalein|Kwajalein",
			"Pacific/Niue|Etc/GMT+11",
			"Pacific/Pago_Pago|Pacific/Midway",
			"Pacific/Pago_Pago|Pacific/Samoa",
			"Pacific/Pago_Pago|US/Samoa",
			"Pacific/Palau|Etc/GMT-9",
			"Pacific/Port_Moresby|Antarctica/DumontDUrville",
			"Pacific/Port_Moresby|Etc/GMT-10",
			"Pacific/Port_Moresby|Pacific/Chuuk",
			"Pacific/Port_Moresby|Pacific/Truk",
			"Pacific/Port_Moresby|Pacific/Yap",
			"Pacific/Tahiti|Etc/GMT+10",
			"Pacific/Tarawa|Etc/GMT-12",
			"Pacific/Tarawa|Pacific/Funafuti",
			"Pacific/Tarawa|Pacific/Majuro",
			"Pacific/Tarawa|Pacific/Wake",
			"Pacific/Tarawa|Pacific/Wallis"
		],
		"countries": [
			"AD|Europe/Andorra",
			"AE|Asia/Dubai",
			"AF|Asia/Kabul",
			"AG|America/Port_of_Spain America/Antigua",
			"AI|America/Port_of_Spain America/Anguilla",
			"AL|Europe/Tirane",
			"AM|Asia/Yerevan",
			"AO|Africa/Lagos Africa/Luanda",
			"AQ|Antarctica/Casey Antarctica/Davis Antarctica/DumontDUrville Antarctica/Mawson Antarctica/Palmer Antarctica/Rothera Antarctica/Syowa Antarctica/Troll Antarctica/Vostok Pacific/Auckland Antarctica/McMurdo",
			"AR|America/Argentina/Buenos_Aires America/Argentina/Cordoba America/Argentina/Salta America/Argentina/Jujuy America/Argentina/Tucuman America/Argentina/Catamarca America/Argentina/La_Rioja America/Argentina/San_Juan America/Argentina/Mendoza America/Argentina/San_Luis America/Argentina/Rio_Gallegos America/Argentina/Ushuaia",
			"AS|Pacific/Pago_Pago",
			"AT|Europe/Vienna",
			"AU|Australia/Lord_Howe Antarctica/Macquarie Australia/Hobart Australia/Melbourne Australia/Sydney Australia/Broken_Hill Australia/Brisbane Australia/Lindeman Australia/Adelaide Australia/Darwin Australia/Perth Australia/Eucla",
			"AW|America/Curacao America/Aruba",
			"AX|Europe/Helsinki Europe/Mariehamn",
			"AZ|Asia/Baku",
			"BA|Europe/Belgrade Europe/Sarajevo",
			"BB|America/Barbados",
			"BD|Asia/Dhaka",
			"BE|Europe/Brussels",
			"BF|Africa/Abidjan Africa/Ouagadougou",
			"BG|Europe/Sofia",
			"BH|Asia/Qatar Asia/Bahrain",
			"BI|Africa/Maputo Africa/Bujumbura",
			"BJ|Africa/Lagos Africa/Porto-Novo",
			"BL|America/Port_of_Spain America/St_Barthelemy",
			"BM|Atlantic/Bermuda",
			"BN|Asia/Brunei",
			"BO|America/La_Paz",
			"BQ|America/Curacao America/Kralendijk",
			"BR|America/Noronha America/Belem America/Fortaleza America/Recife America/Araguaina America/Maceio America/Bahia America/Sao_Paulo America/Campo_Grande America/Cuiaba America/Santarem America/Porto_Velho America/Boa_Vista America/Manaus America/Eirunepe America/Rio_Branco",
			"BS|America/Nassau",
			"BT|Asia/Thimphu",
			"BW|Africa/Maputo Africa/Gaborone",
			"BY|Europe/Minsk",
			"BZ|America/Belize",
			"CA|America/St_Johns America/Halifax America/Glace_Bay America/Moncton America/Goose_Bay America/Blanc-Sablon America/Toronto America/Nipigon America/Thunder_Bay America/Iqaluit America/Pangnirtung America/Atikokan America/Winnipeg America/Rainy_River America/Resolute America/Rankin_Inlet America/Regina America/Swift_Current America/Edmonton America/Cambridge_Bay America/Yellowknife America/Inuvik America/Creston America/Dawson_Creek America/Fort_Nelson America/Whitehorse America/Dawson America/Vancouver",
			"CC|Indian/Cocos",
			"CD|Africa/Maputo Africa/Lagos Africa/Kinshasa Africa/Lubumbashi",
			"CF|Africa/Lagos Africa/Bangui",
			"CG|Africa/Lagos Africa/Brazzaville",
			"CH|Europe/Zurich",
			"CI|Africa/Abidjan",
			"CK|Pacific/Rarotonga",
			"CL|America/Santiago America/Punta_Arenas Pacific/Easter",
			"CM|Africa/Lagos Africa/Douala",
			"CN|Asia/Shanghai Asia/Urumqi",
			"CO|America/Bogota",
			"CR|America/Costa_Rica",
			"CU|America/Havana",
			"CV|Atlantic/Cape_Verde",
			"CW|America/Curacao",
			"CX|Indian/Christmas",
			"CY|Asia/Nicosia Asia/Famagusta",
			"CZ|Europe/Prague",
			"DE|Europe/Zurich Europe/Berlin Europe/Busingen",
			"DJ|Africa/Nairobi Africa/Djibouti",
			"DK|Europe/Copenhagen",
			"DM|America/Port_of_Spain America/Dominica",
			"DO|America/Santo_Domingo",
			"DZ|Africa/Algiers",
			"EC|America/Guayaquil Pacific/Galapagos",
			"EE|Europe/Tallinn",
			"EG|Africa/Cairo",
			"EH|Africa/El_Aaiun",
			"ER|Africa/Nairobi Africa/Asmara",
			"ES|Europe/Madrid Africa/Ceuta Atlantic/Canary",
			"ET|Africa/Nairobi Africa/Addis_Ababa",
			"FI|Europe/Helsinki",
			"FJ|Pacific/Fiji",
			"FK|Atlantic/Stanley",
			"FM|Pacific/Chuuk Pacific/Pohnpei Pacific/Kosrae",
			"FO|Atlantic/Faroe",
			"FR|Europe/Paris",
			"GA|Africa/Lagos Africa/Libreville",
			"GB|Europe/London",
			"GD|America/Port_of_Spain America/Grenada",
			"GE|Asia/Tbilisi",
			"GF|America/Cayenne",
			"GG|Europe/London Europe/Guernsey",
			"GH|Africa/Accra",
			"GI|Europe/Gibraltar",
			"GL|America/Nuuk America/Danmarkshavn America/Scoresbysund America/Thule",
			"GM|Africa/Abidjan Africa/Banjul",
			"GN|Africa/Abidjan Africa/Conakry",
			"GP|America/Port_of_Spain America/Guadeloupe",
			"GQ|Africa/Lagos Africa/Malabo",
			"GR|Europe/Athens",
			"GS|Atlantic/South_Georgia",
			"GT|America/Guatemala",
			"GU|Pacific/Guam",
			"GW|Africa/Bissau",
			"GY|America/Guyana",
			"HK|Asia/Hong_Kong",
			"HN|America/Tegucigalpa",
			"HR|Europe/Belgrade Europe/Zagreb",
			"HT|America/Port-au-Prince",
			"HU|Europe/Budapest",
			"ID|Asia/Jakarta Asia/Pontianak Asia/Makassar Asia/Jayapura",
			"IE|Europe/Dublin",
			"IL|Asia/Jerusalem",
			"IM|Europe/London Europe/Isle_of_Man",
			"IN|Asia/Kolkata",
			"IO|Indian/Chagos",
			"IQ|Asia/Baghdad",
			"IR|Asia/Tehran",
			"IS|Atlantic/Reykjavik",
			"IT|Europe/Rome",
			"JE|Europe/London Europe/Jersey",
			"JM|America/Jamaica",
			"JO|Asia/Amman",
			"JP|Asia/Tokyo",
			"KE|Africa/Nairobi",
			"KG|Asia/Bishkek",
			"KH|Asia/Bangkok Asia/Phnom_Penh",
			"KI|Pacific/Tarawa Pacific/Enderbury Pacific/Kiritimati",
			"KM|Africa/Nairobi Indian/Comoro",
			"KN|America/Port_of_Spain America/St_Kitts",
			"KP|Asia/Pyongyang",
			"KR|Asia/Seoul",
			"KW|Asia/Riyadh Asia/Kuwait",
			"KY|America/Panama America/Cayman",
			"KZ|Asia/Almaty Asia/Qyzylorda Asia/Qostanay Asia/Aqtobe Asia/Aqtau Asia/Atyrau Asia/Oral",
			"LA|Asia/Bangkok Asia/Vientiane",
			"LB|Asia/Beirut",
			"LC|America/Port_of_Spain America/St_Lucia",
			"LI|Europe/Zurich Europe/Vaduz",
			"LK|Asia/Colombo",
			"LR|Africa/Monrovia",
			"LS|Africa/Johannesburg Africa/Maseru",
			"LT|Europe/Vilnius",
			"LU|Europe/Luxembourg",
			"LV|Europe/Riga",
			"LY|Africa/Tripoli",
			"MA|Africa/Casablanca",
			"MC|Europe/Monaco",
			"MD|Europe/Chisinau",
			"ME|Europe/Belgrade Europe/Podgorica",
			"MF|America/Port_of_Spain America/Marigot",
			"MG|Africa/Nairobi Indian/Antananarivo",
			"MH|Pacific/Majuro Pacific/Kwajalein",
			"MK|Europe/Belgrade Europe/Skopje",
			"ML|Africa/Abidjan Africa/Bamako",
			"MM|Asia/Yangon",
			"MN|Asia/Ulaanbaatar Asia/Hovd Asia/Choibalsan",
			"MO|Asia/Macau",
			"MP|Pacific/Guam Pacific/Saipan",
			"MQ|America/Martinique",
			"MR|Africa/Abidjan Africa/Nouakchott",
			"MS|America/Port_of_Spain America/Montserrat",
			"MT|Europe/Malta",
			"MU|Indian/Mauritius",
			"MV|Indian/Maldives",
			"MW|Africa/Maputo Africa/Blantyre",
			"MX|America/Mexico_City America/Cancun America/Merida America/Monterrey America/Matamoros America/Mazatlan America/Chihuahua America/Ojinaga America/Hermosillo America/Tijuana America/Bahia_Banderas",
			"MY|Asia/Kuala_Lumpur Asia/Kuching",
			"MZ|Africa/Maputo",
			"NA|Africa/Windhoek",
			"NC|Pacific/Noumea",
			"NE|Africa/Lagos Africa/Niamey",
			"NF|Pacific/Norfolk",
			"NG|Africa/Lagos",
			"NI|America/Managua",
			"NL|Europe/Amsterdam",
			"NO|Europe/Oslo",
			"NP|Asia/Kathmandu",
			"NR|Pacific/Nauru",
			"NU|Pacific/Niue",
			"NZ|Pacific/Auckland Pacific/Chatham",
			"OM|Asia/Dubai Asia/Muscat",
			"PA|America/Panama",
			"PE|America/Lima",
			"PF|Pacific/Tahiti Pacific/Marquesas Pacific/Gambier",
			"PG|Pacific/Port_Moresby Pacific/Bougainville",
			"PH|Asia/Manila",
			"PK|Asia/Karachi",
			"PL|Europe/Warsaw",
			"PM|America/Miquelon",
			"PN|Pacific/Pitcairn",
			"PR|America/Puerto_Rico",
			"PS|Asia/Gaza Asia/Hebron",
			"PT|Europe/Lisbon Atlantic/Madeira Atlantic/Azores",
			"PW|Pacific/Palau",
			"PY|America/Asuncion",
			"QA|Asia/Qatar",
			"RE|Indian/Reunion",
			"RO|Europe/Bucharest",
			"RS|Europe/Belgrade",
			"RU|Europe/Kaliningrad Europe/Moscow Europe/Simferopol Europe/Kirov Europe/Volgograd Europe/Astrakhan Europe/Saratov Europe/Ulyanovsk Europe/Samara Asia/Yekaterinburg Asia/Omsk Asia/Novosibirsk Asia/Barnaul Asia/Tomsk Asia/Novokuznetsk Asia/Krasnoyarsk Asia/Irkutsk Asia/Chita Asia/Yakutsk Asia/Khandyga Asia/Vladivostok Asia/Ust-Nera Asia/Magadan Asia/Sakhalin Asia/Srednekolymsk Asia/Kamchatka Asia/Anadyr",
			"RW|Africa/Maputo Africa/Kigali",
			"SA|Asia/Riyadh",
			"SB|Pacific/Guadalcanal",
			"SC|Indian/Mahe",
			"SD|Africa/Khartoum",
			"SE|Europe/Stockholm",
			"SG|Asia/Singapore",
			"SH|Africa/Abidjan Atlantic/St_Helena",
			"SI|Europe/Belgrade Europe/Ljubljana",
			"SJ|Europe/Oslo Arctic/Longyearbyen",
			"SK|Europe/Prague Europe/Bratislava",
			"SL|Africa/Abidjan Africa/Freetown",
			"SM|Europe/Rome Europe/San_Marino",
			"SN|Africa/Abidjan Africa/Dakar",
			"SO|Africa/Nairobi Africa/Mogadishu",
			"SR|America/Paramaribo",
			"SS|Africa/Juba",
			"ST|Africa/Sao_Tome",
			"SV|America/El_Salvador",
			"SX|America/Curacao America/Lower_Princes",
			"SY|Asia/Damascus",
			"SZ|Africa/Johannesburg Africa/Mbabane",
			"TC|America/Grand_Turk",
			"TD|Africa/Ndjamena",
			"TF|Indian/Reunion Indian/Kerguelen",
			"TG|Africa/Abidjan Africa/Lome",
			"TH|Asia/Bangkok",
			"TJ|Asia/Dushanbe",
			"TK|Pacific/Fakaofo",
			"TL|Asia/Dili",
			"TM|Asia/Ashgabat",
			"TN|Africa/Tunis",
			"TO|Pacific/Tongatapu",
			"TR|Europe/Istanbul",
			"TT|America/Port_of_Spain",
			"TV|Pacific/Funafuti",
			"TW|Asia/Taipei",
			"TZ|Africa/Nairobi Africa/Dar_es_Salaam",
			"UA|Europe/Simferopol Europe/Kiev Europe/Uzhgorod Europe/Zaporozhye",
			"UG|Africa/Nairobi Africa/Kampala",
			"UM|Pacific/Pago_Pago Pacific/Wake Pacific/Honolulu Pacific/Midway",
			"US|America/New_York America/Detroit America/Kentucky/Louisville America/Kentucky/Monticello America/Indiana/Indianapolis America/Indiana/Vincennes America/Indiana/Winamac America/Indiana/Marengo America/Indiana/Petersburg America/Indiana/Vevay America/Chicago America/Indiana/Tell_City America/Indiana/Knox America/Menominee America/North_Dakota/Center America/North_Dakota/New_Salem America/North_Dakota/Beulah America/Denver America/Boise America/Phoenix America/Los_Angeles America/Anchorage America/Juneau America/Sitka America/Metlakatla America/Yakutat America/Nome America/Adak Pacific/Honolulu",
			"UY|America/Montevideo",
			"UZ|Asia/Samarkand Asia/Tashkent",
			"VA|Europe/Rome Europe/Vatican",
			"VC|America/Port_of_Spain America/St_Vincent",
			"VE|America/Caracas",
			"VG|America/Port_of_Spain America/Tortola",
			"VI|America/Port_of_Spain America/St_Thomas",
			"VN|Asia/Bangkok Asia/Ho_Chi_Minh",
			"VU|Pacific/Efate",
			"WF|Pacific/Wallis",
			"WS|Pacific/Apia",
			"YE|Asia/Riyadh Asia/Aden",
			"YT|Africa/Nairobi Indian/Mayotte",
			"ZA|Africa/Johannesburg",
			"ZM|Africa/Maputo Africa/Lusaka",
			"ZW|Africa/Maputo Africa/Harare"
		]
	});


	return moment;
}));
!function(c,M){"use strict";"object"==typeof module&&module.exports?module.exports=M(require("moment")):"function"==typeof define&&define.amd?define(["moment"],M):M(c.moment)}(this,function(b){"use strict";void 0===b.version&&b.default&&(b=b.default);var M,p={},n={},i={},z={},e={};b&&"string"==typeof b.version||S("Moment Timezone requires Moment.js. See https://momentjs.com/timezone/docs/#/use-it/browser/");var c=b.version.split("."),a=+c[0],A=+c[1];function r(c){return 96<c?c-87:64<c?c-29:c-48}function o(c){var M=0,a=c.split("."),A=a[0],o=a[1]||"",b=1,p=0,n=1;for(45===c.charCodeAt(0)&&(n=-(M=1));M<A.length;M++)p=60*p+r(A.charCodeAt(M));for(M=0;M<o.length;M++)b/=60,p+=r(o.charCodeAt(M))*b;return p*n}function q(c){for(var M=0;M<c.length;M++)c[M]=o(c[M])}function O(c,M){var a,A=[];for(a=0;a<M.length;a++)A[a]=c[M[a]];return A}function d(c){var M=c.split("|"),a=M[2].split(" "),A=M[3].split(""),o=M[4].split(" ");return q(a),q(A),q(o),function(c,M){for(var a=0;a<M;a++)c[a]=Math.round((c[a-1]||0)+6e4*c[a]);c[M-1]=1/0}(o,A.length),{name:M[0],abbrs:O(M[1].split(" "),A),offsets:O(a,A),untils:o,population:0|M[5]}}function f(c){c&&this._set(d(c))}function N(c,M){this.name=c,this.zones=M}function t(c){var M=c.toTimeString(),a=M.match(/\([a-z ]+\)/i);"GMT"===(a=a&&a[0]?(a=a[0].match(/[A-Z]/g))?a.join(""):void 0:(a=M.match(/[A-Z]{3,5}/g))?a[0]:void 0)&&(a=void 0),this.at=+c,this.abbr=a,this.offset=c.getTimezoneOffset()}function l(c){this.zone=c,this.offsetScore=0,this.abbrScore=0}function L(c,M){for(var a,A;A=6e4*((M.at-c.at)/12e4|0);)(a=new t(new Date(c.at+A))).offset===c.offset?c=a:M=a;return c}function u(c,M){return c.offsetScore!==M.offsetScore?c.offsetScore-M.offsetScore:c.abbrScore!==M.abbrScore?c.abbrScore-M.abbrScore:c.zone.population!==M.zone.population?M.zone.population-c.zone.population:M.zone.name.localeCompare(c.zone.name)}function W(c,M){var a,A;for(q(M),a=0;a<M.length;a++)A=M[a],e[A]=e[A]||{},e[A][c]=!0}function B(){try{var c=Intl.DateTimeFormat().resolvedOptions().timeZone;if(c&&3<c.length){var M=z[X(c)];if(M)return M;S("Moment Timezone found "+c+" from the Intl api, but did not have that data loaded.")}}catch(c){}var a,A,o,b=function(){var c,M,a,A=(new Date).getFullYear()-2,o=new t(new Date(A,0,1)),b=[o];for(a=1;a<48;a++)(M=new t(new Date(A,a,1))).offset!==o.offset&&(c=L(o,M),b.push(c),b.push(new t(new Date(c.at+6e4)))),o=M;for(a=0;a<4;a++)b.push(new t(new Date(A+a,0,1))),b.push(new t(new Date(A+a,6,1)));return b}(),p=b.length,n=function(c){var M,a,A,o=c.length,b={},p=[];for(M=0;M<o;M++)for(a in A=e[c[M].offset]||{})A.hasOwnProperty(a)&&(b[a]=!0);for(M in b)b.hasOwnProperty(M)&&p.push(z[M]);return p}(b),i=[];for(A=0;A<n.length;A++){for(a=new l(m(n[A]),p),o=0;o<p;o++)a.scoreOffsetAt(b[o]);i.push(a)}return i.sort(u),0<i.length?i[0].zone.name:void 0}function X(c){return(c||"").toLowerCase().replace(/\//g,"_")}function s(c){var M,a,A,o;for("string"==typeof c&&(c=[c]),M=0;M<c.length;M++)o=X(a=(A=c[M].split("|"))[0]),p[o]=c[M],z[o]=a,W(o,A[2].split(" "))}function m(c,M){c=X(c);var a,A=p[c];return A instanceof f?A:"string"==typeof A?(A=new f(A),p[c]=A):n[c]&&M!==m&&(a=m(n[c],m))?((A=p[c]=new f)._set(a),A.name=z[c],A):null}function T(c){var M,a,A,o;for("string"==typeof c&&(c=[c]),M=0;M<c.length;M++)A=X((a=c[M].split("|"))[0]),o=X(a[1]),n[A]=o,z[A]=a[0],n[o]=A,z[o]=a[1]}function E(c){s(c.zones),T(c.links),function(c){var M,a,A,o;if(c&&c.length)for(M=0;M<c.length;M++)a=(o=c[M].split("|"))[0].toUpperCase(),A=o[1].split(" "),i[a]=new N(a,A)}(c.countries),C.dataVersion=c.version}function R(c){var M="X"===c._f||"x"===c._f;return!(!c._a||void 0!==c._tzm||M)}function S(c){"undefined"!=typeof console&&"function"==typeof console.error&&console.error(c)}function C(c){var M=Array.prototype.slice.call(arguments,0,-1),a=arguments[arguments.length-1],A=m(a),o=b.utc.apply(null,M);return A&&!b.isMoment(c)&&R(o)&&o.add(A.parse(o),"minutes"),o.tz(a),o}(a<2||2==a&&A<6)&&S("Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js "+b.version+". See momentjs.com"),f.prototype={_set:function(c){this.name=c.name,this.abbrs=c.abbrs,this.untils=c.untils,this.offsets=c.offsets,this.population=c.population},_index:function(c){var M,a=+c,A=this.untils;for(M=0;M<A.length;M++)if(a<A[M])return M},countries:function(){var M=this.name;return Object.keys(i).filter(function(c){return-1!==i[c].zones.indexOf(M)})},parse:function(c){var M,a,A,o,b=+c,p=this.offsets,n=this.untils,i=n.length-1;for(o=0;o<i;o++)if(M=p[o],a=p[o+1],A=p[o?o-1:o],M<a&&C.moveAmbiguousForward?M=a:A<M&&C.moveInvalidForward&&(M=A),b<n[o]-6e4*M)return p[o];return p[i]},abbr:function(c){return this.abbrs[this._index(c)]},offset:function(c){return S("zone.offset has been deprecated in favor of zone.utcOffset"),this.offsets[this._index(c)]},utcOffset:function(c){return this.offsets[this._index(c)]}},l.prototype.scoreOffsetAt=function(c){this.offsetScore+=Math.abs(this.zone.utcOffset(c.at)-c.offset),this.zone.abbr(c.at).replace(/[^A-Z]/g,"")!==c.abbr&&this.abbrScore++},C.version="0.5.34",C.dataVersion="",C._zones=p,C._links=n,C._names=z,C._countries=i,C.add=s,C.link=T,C.load=E,C.zone=m,C.zoneExists=function c(M){return c.didShowError||(c.didShowError=!0,S("moment.tz.zoneExists('"+M+"') has been deprecated in favor of !moment.tz.zone('"+M+"')")),!!m(M)},C.guess=function(c){return M&&!c||(M=B()),M},C.names=function(){var c,M=[];for(c in z)z.hasOwnProperty(c)&&(p[c]||p[n[c]])&&z[c]&&M.push(z[c]);return M.sort()},C.Zone=f,C.unpack=d,C.unpackBase60=o,C.needsOffset=R,C.moveInvalidForward=!0,C.moveAmbiguousForward=!1,C.countries=function(){return Object.keys(i)},C.zonesForCountry=function(c,M){if(!(c=function(c){return c=c.toUpperCase(),i[c]||null}(c)))return null;var a=c.zones.sort();return M?a.map(function(c){return{name:c,offset:m(c).utcOffset(new Date)}}):a};var h,g=b.fn;function P(c){return function(){return this._z?this._z.abbr(this):c.call(this)}}function D(c){return function(){return this._z=null,c.apply(this,arguments)}}b.tz=C,b.defaultZone=null,b.updateOffset=function(c,M){var a,A=b.defaultZone;if(void 0===c._z&&(A&&R(c)&&!c._isUTC&&(c._d=b.utc(c._a)._d,c.utc().add(A.parse(c),"minutes")),c._z=A),c._z)if(a=c._z.utcOffset(c),Math.abs(a)<16&&(a/=60),void 0!==c.utcOffset){var o=c._z;c.utcOffset(-a,M),c._z=o}else c.zone(a,M)},g.tz=function(c,M){if(c){if("string"!=typeof c)throw new Error("Time zone name must be a string, got "+c+" ["+typeof c+"]");return this._z=m(c),this._z?b.updateOffset(this,M):S("Moment Timezone has no data for "+c+". See http://momentjs.com/timezone/docs/#/data-loading/."),this}if(this._z)return this._z.name},g.zoneName=P(g.zoneName),g.zoneAbbr=P(g.zoneAbbr),g.utc=D(g.utc),g.local=D(g.local),g.utcOffset=(h=g.utcOffset,function(){return 0<arguments.length&&(this._z=null),h.apply(this,arguments)}),b.tz.setDefault=function(c){return(a<2||2==a&&A<9)&&S("Moment Timezone setDefault() requires Moment.js >= 2.9.0. You are using Moment.js "+b.version+"."),b.defaultZone=c?m(c):null,b};var _=b.momentProperties;return"[object Array]"===Object.prototype.toString.call(_)?(_.push("_z"),_.push("_a")):_&&(_._z=null),E({version:"2021e",zones:["Africa/Abidjan|GMT|0|0||48e5","Africa/Nairobi|EAT|-30|0||47e5","Africa/Algiers|WET WEST CET CEST|0 -10 -10 -20|01012320102|3bX0 11A0 dDd0 17b0 11B0 1cN0 2Dy0 1cN0 1fB0 1cL0|26e5","Africa/Lagos|WAT|-10|0||17e6","Africa/Bissau|-01 GMT|10 0|01|cap0|39e4","Africa/Maputo|CAT|-20|0||26e5","Africa/Cairo|EET EEST|-20 -30|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|LX0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1WL0 rd0 1Rz0 wp0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1qL0 Xd0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1ny0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 WL0 1qN0 Rb0 1wp0 On0 1zd0 Lz0 1EN0 Fb0 c10 8n0 8Nd0 gL0 e10 mn0|15e6","Africa/Casablanca|+00 +01|0 -10|01010101010101010101010101010101010101010101010101010101010101010101010|aS00 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4mn0 SyN0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0 2600 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600|32e5","Africa/Ceuta|WET WEST CET CEST|0 -10 -10 -20|0101010102323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|aS00 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4VB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|85e3","Africa/El_Aaiun|-01 +00 +01|10 0 -10|01212121212121212121212121212121212121212121212121212121212121212121|fi10 6L0 AL0 1Nd0 XX0 1Cp0 pz0 1cBB0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0 2600 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600|20e4","Africa/Johannesburg|SAST|-20|0||84e5","Africa/Juba|CAT CAST EAT|-20 -30 -30|01010101010101010101010101010101020|LW0 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0 PeX0|","Africa/Khartoum|CAT CAST EAT|-20 -30 -30|01010101010101010101010101010101020|LW0 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0 HjL0|51e5","Africa/Monrovia|MMT GMT|I.u 0|01|4SoI.u|11e5","Africa/Ndjamena|WAT WAST|-10 -20|010|nNb0 Wn0|13e5","Africa/Sao_Tome|GMT WAT|0 -10|010|1UQN0 2q00|","Africa/Tripoli|EET CET CEST|-20 -10 -20|0121212121212121210120120|tda0 A10 1db0 1cN0 1db0 1dd0 1db0 1eN0 1bb0 1e10 1cL0 1c10 1db0 1dd0 1db0 1cN0 1db0 1q10 fAn0 1ep0 1db0 AKq0 TA0 1o00|11e5","Africa/Tunis|CET CEST|-10 -20|0101010101010101010|hOn0 WM0 1rA0 11c0 nwo0 Ko0 1cM0 1cM0 1rA0 10M0 zuM0 10N0 1aN0 1qM0 WM0 1qM0 11A0 1o00|20e5","Africa/Windhoek|SAST CAT WAT|-20 -20 -10|01212121212121212121212121212121212121212121212121|Ndy0 9Io0 16P0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0|32e4","America/Adak|BST BDT AHST HST HDT|b0 a0 a0 a0 90|0101010101010101010101010101234343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|Kd0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|326","America/Anchorage|AHST AHDT YST AKST AKDT|a0 90 90 90 80|0101010101010101010101010101234343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|Kc0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|30e4","America/Puerto_Rico|AST|40|0||24e5","America/Araguaina|-03 -02|30 20|01010101010101010101010101010|CxD0 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 ny10 Lz0|14e4","America/Argentina/Buenos_Aires|-03 -02|30 20|01010101010101010|9Rf0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 A4p0 uL0 1qN0 WL0|","America/Argentina/Catamarca|-03 -02 -04|30 20 40|01010101210102010|9Rf0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 7B0 8zb0 uL0|","America/Argentina/Cordoba|-03 -02 -04|30 20 40|01010101210101010|9Rf0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0 1qN0 WL0|","America/Argentina/Jujuy|-03 -02 -04|30 20 40|010101202101010|9Rf0 Db0 zvd0 Bz0 1tB0 TX0 1ze0 TX0 1ld0 WK0 1wp0 TX0 A4p0 uL0|","America/Argentina/La_Rioja|-03 -02 -04|30 20 40|010101012010102010|9Rf0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0|","America/Argentina/Mendoza|-03 -02 -04|30 20 40|01010120202102010|9Rf0 Db0 zvd0 Bz0 1tB0 TX0 1u20 SL0 1vd0 Tb0 1wp0 TW0 ri10 Op0 7TX0 uL0|","America/Argentina/Rio_Gallegos|-03 -02 -04|30 20 40|01010101010102010|9Rf0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0|","America/Argentina/Salta|-03 -02 -04|30 20 40|010101012101010|9Rf0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0|","America/Argentina/San_Juan|-03 -02 -04|30 20 40|010101012010102010|9Rf0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rld0 m10 8lb0 uL0|","America/Argentina/San_Luis|-03 -02 -04|30 20 40|010101202020102020|9Rf0 Db0 zvd0 Bz0 1tB0 XX0 1q20 SL0 AN0 vDb0 m10 8lb0 8L0 jd0 1qN0 WL0 1qN0|","America/Argentina/Tucuman|-03 -02 -04|30 20 40|0101010121010201010|9Rf0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 4N0 8BX0 uL0 1qN0 WL0|","America/Argentina/Ushuaia|-03 -02 -04|30 20 40|01010101010102010|9Rf0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rkN0 8p0 8zb0 uL0|","America/Asuncion|-04 -03|40 30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|6FE0 3CL0 3Dd0 10L0 1pB0 10n0 1pB0 10n0 1pB0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1lB0 14n0 1dd0 1cL0 1fd0 WL0 1rd0 1aL0 1dB0 Xz0 1qp0 Xb0 1qN0 10L0 1rB0 TX0 1tB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 WN0 1qL0 11B0 1nX0 1ip0 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 TX0 1tB0 19X0 1a10 1fz0 1a10 1fz0 1cN0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0|28e5","America/Panama|EST|50|0||15e5","America/Bahia_Banderas|PST MST MDT CDT CST|80 70 60 50 60|012121212121212121212121212121343434343434343434343434343434343434343434|80 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nW0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0|84e3","America/Bahia|-03 -02|30 20|010101010101010101010101010101010101010|CxD0 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 l5B0 Rb0|27e5","America/Barbados|AST ADT|40 30|010101010|i7G0 IL0 1ip0 17b0 1ip0 17b0 1ld0 13b0|28e4","America/Belem|-03 -02|30 20|0101010|CxD0 Rb0 1tB0 IL0 1Fd0 FX0|20e5","America/Belize|CST CDT|60 50|01010|9xG0 qn0 lxB0 mn0|57e3","America/Boa_Vista|-04 -03|40 30|01010101010|CxE0 Rb0 1tB0 IL0 1Fd0 FX0 smp0 WL0 1tB0 2L0|62e2","America/Bogota|-05 -04|50 40|010|Snh0 2en0|90e5","America/Boise|MST MDT|70 60|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|K90 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 Dd0 1Kn0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e4","America/Cambridge_Bay|MST MDT CST CDT EST|70 60 60 50 50|01010101010101010101010101010101010101012342101010101010101010101010101010101010101010101010101010101010|p7J0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11A0 1nX0 2K0 WQ0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e2","America/Campo_Grande|-04 -03|40 30|010101010101010101010101010101010101010101010101010101010101010101010|CxE0 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|77e4","America/Cancun|CST EST EDT CDT|60 50 40 50|012121230303030303030303030303030303030301|t9G0 yLB0 1lb0 14p0 1lb0 14p0 Lz0 xB0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 Dd0|63e4","America/Caracas|-04 -0430|40 4u|010|1wmv0 kqo0|29e5","America/Cayenne|-03|30|0||58e3","America/Chicago|CST CDT|60 50|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|K80 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|92e5","America/Chihuahua|CST CDT MDT MST|60 50 60 70|01010232323232323232323232323232323232323232323232323232323232323232323|13Vk0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0|81e4","America/Costa_Rica|CST CDT|60 50|010101010|mgS0 Db0 1Kp0 Db0 pRB0 15b0 1kp0 mL0|12e5","America/Phoenix|MST|70|0||42e5","America/Cuiaba|-04 -03|40 30|0101010101010101010101010101010101010101010101010101010101010101010|CxE0 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 4a10 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|54e4","America/Danmarkshavn|-03 -02 GMT|30 20 0|0101010101010101010101010101010102|oXh0 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 DC0|8","America/Dawson_Creek|PST PDT MST|80 70 70|0101012|Ka0 1cL0 1cN0 1fz0 1cN0 ML0|12e3","America/Dawson|YST PST PDT MST|90 80 70 70|012121212121212121212121212121212121212121212121212121212121212121212121212121212123|9ix0 fNd0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1z90|13e2","America/Denver|MST MDT|70 60|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|K90 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e5","America/Detroit|EST EDT|50 40|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|85H0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e5","America/Edmonton|MST MDT|70 60|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|5E90 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|10e5","America/Eirunepe|-05 -04|50 40|01010101010|CxF0 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0 yTd0 d5X0|31e3","America/El_Salvador|CST CDT|60 50|01010|Gcu0 WL0 1qN0 WL0|11e5","America/Tijuana|PST PDT|80 70|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|fmy0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|20e5","America/Fort_Nelson|PST PDT MST|80 70 70|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010102|Ka0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0|39e2","America/Fort_Wayne|EST EDT|50 40|01010101010101010101010101010101010101010101010101010|K70 1cL0 1qhd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","America/Fortaleza|-03 -02|30 20|01010101010101010|CxD0 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 5z0 2mN0 On0|34e5","America/Glace_Bay|AST ADT|40 30|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|5E60 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3","America/Godthab|-03 -02|30 20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|oXh0 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|17e3","America/Goose_Bay|AST ADT ADDT|40 30 20|010101010101010101010101010101010101020101010101010101010101010101010101010101010101010101010101010101010101010101010101010|K60 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|76e2","America/Grand_Turk|EST EDT AST|50 40 40|0101010101010101010101010101010101010101010101010101010101010101010101010210101010101010101010101010|mG70 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 7jA0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e2","America/Guatemala|CST CDT|60 50|010101010|9tG0 An0 mtd0 Nz0 ifB0 17b0 zDB0 11z0|13e5","America/Guayaquil|-05 -04|50 40|010|TKR0 rz0|27e5","America/Guyana|-0345 -03 -04|3J 30 40|012|dzfJ Ey0f|80e4","America/Halifax|AST ADT|40 30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|K60 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|39e4","America/Havana|CST CDT|50 40|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|K50 1cL0 1cN0 1fz0 1cN0 14n0 1ld0 14L0 1kN0 15b0 1kp0 1cL0 1cN0 1fz0 1a10 1fz0 1fB0 11z0 14p0 1nX0 11B0 1nX0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 1a10 1in0 1a10 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 17c0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 11A0 6i00 Rc0 1wo0 U00 1tA0 Rc0 1wo0 U00 1wo0 U00 1zc0 U00 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0|21e5","America/Hermosillo|PST MST MDT|80 70 60|01212121|80 13Vd0 1lb0 14p0 1lb0 14p0 1lb0|64e4","America/Indiana/Knox|CST CDT EST|60 50 50|01010101010101010101010101010101010101010101210101010101010101010101010101010101010101010101010|K80 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 z8o0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","America/Indiana/Marengo|EST EDT CDT|50 40 50|010101010201010101010101010101010101010101010101010101010101010|K70 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1e6p0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","America/Indiana/Petersburg|CST CDT EST EDT|60 50 50 40|0101010101010101210123232323232323232323232323232323232323232323232|K80 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 19co0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","America/Indiana/Tell_City|EST EDT CDT CST|50 40 50 60|01023232323232323232323232323232323232323232323232323|K70 1cL0 1qhd0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","America/Indiana/Vevay|EST EDT|50 40|010101010101010101010101010101010101010101010101010101010|K70 1cL0 1cN0 1fz0 1cN0 1cL0 1lnd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","America/Indiana/Vincennes|EST EDT CDT CST|50 40 50 60|01023201010101010101010101010101010101010101010101010|K70 1cL0 1qhd0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","America/Indiana/Winamac|EST EDT CDT CST|50 40 50 60|01023101010101010101010101010101010101010101010101010|K70 1cL0 1qhd0 1o00 Rd0 1za0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","America/Inuvik|PST MST MDT|80 70 60|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|mGa0 2pz0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|35e2","America/Iqaluit|EST EDT CST CDT|50 40 60 50|0101010101010101010101010101010101010101230101010101010101010101010101010101010101010101010101010101010|p7H0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|67e2","America/Jamaica|EST EDT|50 40|010101010101010101010|9Kv0 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0|94e4","America/Juneau|PST PDT YDT YST AKST AKDT|80 70 80 90 90 80|0101010101010101010102010101345454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|Ka0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cM0 1cM0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|33e3","America/Kentucky/Louisville|EST EDT CDT|50 40 50|010101010201010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|K70 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","America/Kentucky/Monticello|CST CDT EST EDT|60 50 50 40|010101010101010101010101010101010101010101010101010101010101012323232323232323232323232323232323232323232323232323232323232|K80 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","America/La_Paz|-04|40|0||19e5","America/Lima|-05 -04|50 40|010101010|CVF0 zX0 1O10 zX0 6Gp0 zX0 98p0 zX0|11e6","America/Los_Angeles|PST PDT|80 70|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|Ka0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e6","America/Maceio|-03 -02|30 20|0101010101010101010|CxD0 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 8Q10 WL0 1tB0 5z0 2mN0 On0|93e4","America/Managua|CST EST CDT|60 50 50|010202010102020|86u0 4mn0 9Up0 Dz0 1K10 Dz0 s3F0 1KH0 DB0 9In0 k8p0 19X0 1o30 11y0|22e5","America/Manaus|-04 -03|40 30|010101010|CxE0 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0|19e5","America/Martinique|AST ADT|40 30|010|oXg0 19X0|39e4","America/Matamoros|CST CDT|60 50|0101010101010101010101010101010101010101010101010101010101010101010101010|IqU0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|45e4","America/Mazatlan|PST MST MDT|80 70 60|012121212121212121212121212121212121212121212121212121212121212121212121|80 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0|44e4","America/Menominee|EST CDT CST|50 50 60|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|85H0 1cM0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|85e2","America/Merida|CST EST CDT|60 50 50|0102020202020202020202020202020202020202020202020202020202020202020202020|t9G0 2hz0 wu30 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0|11e5","America/Metlakatla|PST PDT AKST AKDT|80 70 90 80|0101010101010101010101010101023232302323232323232323232323232|Ka0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1hU10 Rd0 1zb0 Op0 1zb0 Op0 1zb0 uM0 jB0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2","America/Mexico_City|CST CDT|60 50|01010101010101010101010101010101010101010101010101010101010101010101010|13Vk0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0|20e6","America/Miquelon|AST -03 -02|40 30 20|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|p9g0 gQ10 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|61e2","America/Moncton|AST ADT|40 30|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|K60 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14n1 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 ReX 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|64e3","America/Monterrey|CST CDT|60 50|0101010101010101010101010101010101010101010101010101010101010101010101010|IqU0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0|41e5","America/Montevideo|-03 -02 -0130 -0230|30 20 1u 2u|0101023010101010101010101010101010101010101010101010|JD0 jX0 4vB0 xz0 3Cp0 mmu 1a10 IMu Db0 4c10 uL0 1Nd0 An0 1SN0 uL0 mp0 28L0 iPB0 un0 1SN0 xz0 1zd0 Lz0 1zd0 Rb0 1zd0 On0 1wp0 Rb0 s8p0 1fB0 1ip0 11z0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 11z0|17e5","America/Toronto|EST EDT|50 40|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|K70 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e5","America/New_York|EST EDT|50 40|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|K70 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e6","America/Nipigon|EST EDT|50 40|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|avj0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|16e2","America/Nome|BST BDT YST AKST AKDT|b0 a0 90 90 80|0101010101010101010101010101234343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|Kd0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cl0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|38e2","America/Noronha|-02 -01|20 10|01010101010101010|CxC0 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|30e2","America/North_Dakota/Beulah|MST MDT CST CDT|70 60 60 50|010101010101010101010101010101010101010101010101010101010101010101010101010101010123232323232323232323232323232323232323232|K90 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","America/North_Dakota/Center|MST MDT CST CDT|70 60 60 50|010101010101010101010101010101010101010101010123232323232323232323232323232323232323232323232323232323232323232323232323232|K90 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","America/North_Dakota/New_Salem|MST MDT CST CDT|70 60 60 50|010101010101010101010101010101010101010101010101010101010101010101012323232323232323232323232323232323232323232323232323232|K90 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","America/Ojinaga|CST CDT MDT MST|60 50 60 70|01010232323232323232323232323232323232323232323232323232323232323232323|13Vk0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e3","America/Pangnirtung|AST ADT EDT EST CST CDT|40 30 40 50 60 50|0101010101010101010101010101010232323232453232323232323232323232323232323232323232323232323232323232323|p7G0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1o00 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2","America/Paramaribo|-0330 -03|3u 30|01|zSPu|24e4","America/Port-au-Prince|EST EDT|50 40|01010101010101010101010101010101010101010101010101010101010101010101010|wu50 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14q0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 i6n0 1nX0 11B0 1nX0 d430 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 3iN0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5","America/Rio_Branco|-05 -04|50 40|010101010|CxF0 Rb0 1tB0 IL0 1Fd0 FX0 NBd0 d5X0|31e4","America/Porto_Velho|-04 -03|40 30|0101010|CxE0 Rb0 1tB0 IL0 1Fd0 FX0|37e4","America/Punta_Arenas|-03 -04|30 40|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|yP0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|","America/Rainy_River|CST CDT|60 50|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|avk0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|842","America/Rankin_Inlet|CST CDT EST|60 50 50|0101010101010101010101010101010101010101012101010101010101010101010101010101010101010101010101010101010|p7I0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e2","America/Recife|-03 -02|30 20|01010101010101010|CxD0 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|33e5","America/Regina|CST|60|0||19e4","America/Resolute|CST CDT EST|60 50 50|0101010101010101010101010101010101010101012101010101012101010101010101010101010101010101010101010101010|p7I0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|229","America/Santarem|-04 -03|40 30|01010101|CxE0 Rb0 1tB0 IL0 1Fd0 FX0 NBd0|21e4","America/Santiago|-03 -04|30 40|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|yP0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0|62e5","America/Santo_Domingo|-0430 EST AST|4u 50 40|0101010101212|ksu 1Cou yLu 1RAu wLu 1QMu xzu 1Q0u xXu 1PAu 13jB0 e00|29e5","America/Sao_Paulo|-03 -02|30 20|010101010101010101010101010101010101010101010101010101010101010101010|CxD0 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|20e6","America/Scoresbysund|-02 -01 +00|20 10 0|0102121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|oXg0 1a00 1cK0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|452","America/Sitka|PST PDT YST AKST AKDT|80 70 90 90 80|0101010101010101010101010101234343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|Ka0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|90e2","America/St_Johns|NST NDT NDDT|3u 2u 1u|010101010101010101010101010101010101020101010101010101010101010101010101010101010101010101010101010101010101010101010101010|K5u 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4","America/Swift_Current|MST CST|70 60|01|5E90|16e3","America/Tegucigalpa|CST CDT|60 50|0101010|Gcu0 WL0 1qN0 WL0 GRd0 AL0|11e5","America/Thule|AST ADT|40 30|010101010101010101010101010101010101010101010101010101010101010101010101010101010|PHG0 1cL0 1cN0 1cL0 1fB0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|656","America/Thunder_Bay|EST EDT|50 40|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|K70 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4","America/Vancouver|PST PDT|80 70|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|Ka0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5","America/Whitehorse|PST PDT MST|80 70 70|01010101010101010101010101010101010101010101010101010101010101010101010101010101012|p7K0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1z90|23e3","America/Winnipeg|CST CDT|60 50|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|K80 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|66e4","America/Yakutat|YST YDT AKST AKDT|90 80 90 80|0101010101010101010101010101023232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|Kb0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cn0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|642","America/Yellowknife|MST MDT|70 60|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|p7J0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3","Antarctica/Casey|+08 +11|-80 -b0|010101010101|1ARS0 T90 40P0 KL0 blz0 3m10 1o30 14k0 1kr0 12l0 1o01|10","Antarctica/Davis|+07 +05|-70 -50|01010|1ART0 VB0 3Wn0 KN0|70","Pacific/Port_Moresby|+10|-a0|0||25e4","Antarctica/Macquarie|AEDT AEST|-b0 -a0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|qg0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 3Co0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|1","Antarctica/Mawson|+06 +05|-60 -50|01|1ARU0|60","Pacific/Auckland|NZST NZDT|-c0 -d0|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|bKC0 IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00|14e5","Antarctica/Palmer|-03 -02 -04|30 20 40|01020202020202020202020202020202020202020202020202020202020202020202020|9Rf0 Db0 jsN0 14N0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|40","Antarctica/Rothera|-00 -03|0 30|01|gOo0|130","Asia/Riyadh|+03|-30|0||57e5","Antarctica/Troll|-00 +00 +02|0 0 -20|012121212121212121212121212121212121212121212121212121|1puo0 hd0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|40","Asia/Urumqi|+06|-60|0||32e5","Europe/Berlin|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|oXd0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|41e5","Asia/Almaty|+06 +07 +05|-60 -70 -50|0101010101010101010102010101010101010101010101010|rn60 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|15e5","Asia/Amman|EET EEST|-20 -30|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|8kK0 KL0 1oN0 11b0 1oN0 11b0 1pd0 1dz0 1cp0 11b0 1op0 11b0 fO10 1db0 1e10 1cL0 1cN0 1cL0 1cN0 1fz0 1pd0 10n0 1ld0 14n0 1hB0 15b0 1ip0 19X0 1cN0 1cL0 1cN0 17b0 1ld0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1So0 y00 1fc0 1dc0 1co0 1dc0 1cM0 1cM0 1cM0 1o00 11A0 1lc0 17c0 1cM0 1cM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 4bX0 Dd0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 LA0 1C00 LA0 1C00 Oo0 1zc0 Oo0 1C00 LA0 1C00 LA0 1C00 LA0 1C00 LA0 1C00 Oo0 1zc0|25e5","Asia/Anadyr|+13 +14 +12 +11|-d0 -e0 -c0 -b0|010202020202020202023202020202020202020202020202020202020232|rmX0 1db0 2q10 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|13e3","Asia/Aqtau|+05 +06 +04|-50 -60 -40|0101010101010101010201010120202020202020202020|sAj0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|15e4","Asia/Aqtobe|+05 +06 +04|-50 -60 -40|01010101010101010102010101010101010101010101010|rn70 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|27e4","Asia/Ashgabat|+05 +06 +04|-50 -60 -40|01010101010101010101020|rn70 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0|41e4","Asia/Atyrau|+05 +06 +04|-50 -60 -40|010101010101010101020101010101010102020202020|sAj0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 2sp0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|","Asia/Baghdad|+03 +04|-30 -40|01010101010101010101010101010101010101010101010101010|u190 11b0 1cp0 1dz0 1dd0 1db0 1cN0 1cp0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1de0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0|66e5","Asia/Qatar|+04 +03|-40 -30|01|5QI0|96e4","Asia/Baku|+04 +05 +03|-40 -50 -30|010101010101010101010201010101010101010101010101010101010101010|rn80 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 9Je0 1o00 11z0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|27e5","Asia/Bangkok|+07|-70|0||15e6","Asia/Barnaul|+07 +08 +06|-70 -80 -60|01010101010101010101020101010102020202020202020202020202020202020|rn50 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 p90 LE0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|","Asia/Beirut|EET EEST|-20 -30|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|61a0 En0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1op0 11b0 dA10 17b0 1iN0 17b0 1iN0 17b0 1iN0 17b0 1vB0 SL0 1mp0 13z0 1iN0 17b0 1iN0 17b0 1jd0 12n0 1a10 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0|22e5","Asia/Bishkek|+06 +07 +05|-60 -70 -50|0101010101010101010102020202020202020202020202020|rn60 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2e00 1tX0 17b0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1cPu 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0|87e4","Asia/Brunei|+08|-80|0||42e4","Asia/Kolkata|IST|-5u|0||15e6","Asia/Chita|+09 +10 +08|-90 -a0 -80|0101010101010101010102010101010101010101010101010101010101010120|rn30 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3re0|33e4","Asia/Choibalsan|+07 +08 +10 +09|-70 -80 -a0 -90|012323232323232323232323232323232323232323232313131|jsF0 cKn0 1da0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 3Db0 h1f0 1cJ0 1cP0 1cJ0|38e3","Asia/Shanghai|CST CDT|-80 -90|0101010101010|DKG0 Rb0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0|23e6","Asia/Colombo|+0530 +0630 +06|-5u -6u -60|0120|14giu 11zu n3cu|22e5","Asia/Dhaka|+06 +07|-60 -70|010|1A5R0 1i00|16e6","Asia/Damascus|EET EEST|-20 -30|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|M00 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 Nb0 1AN0 Nb0 bcp0 19X0 1gp0 19X0 3ld0 1xX0 Vd0 1Bz0 Sp0 1vX0 10p0 1dz0 1cN0 1cL0 1db0 1db0 1g10 1an0 1ap0 1db0 1fd0 1db0 1cN0 1db0 1dd0 1db0 1cp0 1dz0 1c10 1dX0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 19z0 1fB0 1qL0 11B0 1on0 Wp0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0|26e5","Asia/Dili|+09 +08|-90 -80|010|fpr0 Xld0|19e4","Asia/Dubai|+04|-40|0||39e5","Asia/Dushanbe|+06 +07 +05|-60 -70 -50|0101010101010101010102|rn60 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2hB0|76e4","Asia/Famagusta|EET EEST +03|-20 -30 -30|0101010101010101010101010101010101010101010101010101010101010101010101010101010101012010101010101010101010101010|cPa0 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 15U0 2Ks0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|","Asia/Gaza|IST IDT EET EEST|-20 -30 -20 -30|010101010101010101010101010101023232323232323232323232323232323232323232323232323232323232323232323232|aXa0 Db0 1fB0 Rb0 bXB0 gM0 8Q00 IM0 1wo0 TX0 1HB0 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18N0 1bz0 19z0 1gp0 1610 1iL0 11z0 1o10 14o0 1lA1 SKX 1xd1 MKX 1AN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nA0 1210 1qL0 WN0 1qL0 WN0 1qL0 11c0 1on0 11B0 1o00 11A0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1nA0 1200 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1nA0|18e5","Asia/Hebron|IST IDT EET EEST|-20 -30 -20 -30|01010101010101010101010101010102323232323232323232323232323232323232323232323232323232323232323232323232|aXa0 Db0 1fB0 Rb0 bXB0 gM0 8Q00 IM0 1wo0 TX0 1HB0 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18N0 1bz0 19z0 1gp0 1610 1iL0 12L0 1mN0 14o0 1lc0 Tb0 1xd1 MKX bB0 cn0 1cN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nA0 1210 1qL0 WN0 1qL0 WN0 1qL0 11c0 1on0 11B0 1o00 11A0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1nA0 1200 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1nA0|25e4","Asia/Ho_Chi_Minh|+08 +07|-80 -70|01|dfs0|90e5","Asia/Hong_Kong|HKT HKST|-80 -90|01010101010101010|H7u 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1cL0 6fd0 14n0|73e5","Asia/Hovd|+06 +07 +08|-60 -70 -80|01212121212121212121212121212121212121212121212121|jsG0 cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|81e3","Asia/Irkutsk|+08 +09 +07|-80 -90 -70|010101010101010101010201010101010101010101010101010101010101010|rn40 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4","Europe/Istanbul|EET EEST +03 +04|-20 -30 -30 -40|01010101010123201010101010101010101010101010101010101010101010101010101010101012|8jz0 11A0 WN0 1qL0 TB0 1tX0 U10 1tz0 11B0 1in0 17d0 z90 cne0 pb0 2Cp0 1800 14o0 1dc0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1a00 1fA0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WO0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 Xc0 1qo0 WM0 1qM0 11A0 1o00 1200 1nA0 11A0 1tA0 U00 15w0|13e6","Asia/Jakarta|WIB|-70|0||31e6","Asia/Jayapura|WIT|-90|0||26e4","Asia/Jerusalem|IST IDT|-20 -30|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|aXa0 Db0 1fB0 Rb0 bXB0 gM0 8Q00 IM0 1wo0 TX0 1HB0 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 1hB0 1dX0 1ep0 1aL0 1eN0 17X0 1nf0 11z0 1tB0 19W0 1e10 17b0 1ep0 1gL0 18N0 1fz0 1eN0 17b0 1gq0 1gn0 19d0 1dz0 1c10 17X0 1hB0 1gn0 19d0 1dz0 1c10 17X0 1kp0 1dz0 1c10 1aL0 1eN0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0|81e4","Asia/Kabul|+0430|-4u|0||46e5","Asia/Kamchatka|+12 +13 +11|-c0 -d0 -b0|0101010101010101010102010101010101010101010101010101010101020|rn00 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|18e4","Asia/Karachi|+05 PKT PKST|-50 -50 -60|01212121|2Xv0 1fy00 1cL0 dK10 11b0 1610 1jX0|24e6","Asia/Kathmandu|+0530 +0545|-5u -5J|01|CVuu|12e5","Asia/Khandyga|+09 +10 +08 +11|-90 -a0 -80 -b0|01010101010101010101020101010101010101010101010131313131313131310|rn30 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 qK0 yN0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|66e2","Asia/Krasnoyarsk|+07 +08 +06|-70 -80 -60|010101010101010101010201010101010101010101010101010101010101010|rn50 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|10e5","Asia/Kuala_Lumpur|+0730 +08|-7u -80|01|td4u|71e5","Asia/Macau|CST CDT|-80 -90|01010101010101010|H7u 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1cL0 6fd0 14n0|57e4","Asia/Magadan|+11 +12 +10|-b0 -c0 -a0|0101010101010101010102010101010101010101010101010101010101010120|rn10 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Cq0|95e3","Asia/Makassar|WITA|-80|0||15e5","Asia/Manila|PST PDT|-80 -90|010|k0E0 1db0|24e6","Asia/Nicosia|EET EEST|-20 -30|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|cPa0 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|32e4","Asia/Novokuznetsk|+07 +08 +06|-70 -80 -60|0101010101010101010102010101010101010101010101010101010101020|rn50 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|55e4","Asia/Novosibirsk|+07 +08 +06|-70 -80 -60|01010101010101010101020101020202020202020202020202020202020202020|rn50 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 ml0 Os0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 4eN0|15e5","Asia/Omsk|+06 +07 +05|-60 -70 -50|010101010101010101010201010101010101010101010101010101010101010|rn60 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|12e5","Asia/Oral|+05 +06 +04|-50 -60 -40|010101010101010202020202020202020202020202020|rn70 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 1cM0 IM0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|27e4","Asia/Pontianak|WITA WIB|-80 -70|01|HNs0|23e4","Asia/Pyongyang|KST KST|-90 -8u|010|1P4D0 6BA0|29e5","Asia/Qostanay|+05 +06 +04|-50 -60 -40|0101010101010101010201010101010101010101010101|rn70 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|","Asia/Qyzylorda|+05 +06|-50 -60|010101010101010101010101010101010101010101010|rn70 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 3ao0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 zQl0|73e4","Asia/Rangoon|+0630|-6u|0||48e5","Asia/Sakhalin|+11 +12 +10|-b0 -c0 -a0|010101010101010101010201010101010202020202020202020202020202020|rn10 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 2pB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|58e4","Asia/Samarkand|+05 +06|-50 -60|010101010101010101010|rn70 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|36e4","Asia/Seoul|KST KDT|-90 -a0|01010|Gf50 11A0 1o00 11A0|23e6","Asia/Srednekolymsk|+11 +12 +10|-b0 -c0 -a0|010101010101010101010201010101010101010101010101010101010101010|rn10 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|35e2","Asia/Taipei|CST CDT|-80 -90|0101010|akg0 1db0 1cN0 1db0 97B0 AL0|74e5","Asia/Tashkent|+06 +07 +05|-60 -70 -50|0101010101010101010102|rn60 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0|23e5","Asia/Tbilisi|+04 +05 +03|-40 -50 -30|01010101010101010101020202010101010101010101020|rn80 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cK0 1cL0 1cN0 1cL0 1cN0 2pz0 1cL0 1fB0 3Nz0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 An0 Os0 WM0|11e5","Asia/Tehran|+0330 +04 +05 +0430|-3u -40 -50 -4u|0121030303030303030303030303030303030303030303030303030303030303030303030303030303030|j4ku TXu 1pz0 sN0 vAu 1cL0 1dB0 1en0 pNB0 UL0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 64p0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0|14e6","Asia/Thimphu|+0530 +06|-5u -60|01|HcGu|79e3","Asia/Tokyo|JST|-90|0||38e6","Asia/Tomsk|+07 +08 +06|-70 -80 -60|01010101010101010101020101010101010101010101020202020202020202020|rn50 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 co0 1bB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Qp0|10e5","Asia/Ulaanbaatar|+07 +08 +09|-70 -80 -90|01212121212121212121212121212121212121212121212121|jsF0 cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|12e5","Asia/Ust-Nera|+09 +12 +11 +10|-90 -c0 -b0 -a0|0121212121212121212123212121212121212121212121212121212121212123|rn30 1d90 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|65e2","Asia/Vladivostok|+10 +11 +09|-a0 -b0 -90|010101010101010101010201010101010101010101010101010101010101010|rn20 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4","Asia/Yakutsk|+09 +10 +08|-90 -a0 -80|010101010101010101010201010101010101010101010101010101010101010|rn30 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|28e4","Asia/Yekaterinburg|+05 +06 +04|-50 -60 -40|010101010101010101010201010101010101010101010101010101010101010|rn70 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|14e5","Asia/Yerevan|+04 +05 +03|-40 -50 -30|01010101010101010101020202020101010101010101010101010101010|rn80 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 4RX0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|13e5","Atlantic/Azores|-01 +00 WET|10 0 0|0101010101010101010101010101010121010101010101010101010101010101010101010101010101010101010101010101010101010|hAN0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|25e4","Atlantic/Bermuda|AST ADT|40 30|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|avi0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e3","Atlantic/Canary|WET WEST|0 -10|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|oXc0 1a10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|54e4","Atlantic/Cape_Verde|-02 -01|20 10|01|elE0|50e4","Atlantic/Faroe|WET WEST|0 -10|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|rm10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|49e3","Atlantic/Madeira|WET WEST|0 -10|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hAM0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|27e4","Atlantic/South_Georgia|-02|20|0||30","Atlantic/Stanley|-04 -03 -02|40 30 20|01212101010101010101010101010101010101010101010101010101|wrg0 WL0 1qL0 U10 1tz0 2mN0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 U10 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qN0 U10 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 U10 1tz0 U10 1tz0 U10|21e2","Australia/Sydney|AEST AEDT|-a0 -b0|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|4r40 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|40e5","Australia/Adelaide|ACST ACDT|-9u -au|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|4r4u LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 WM0 1qM0 Rc0 1zc0 U00 1tA0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|11e5","Australia/Brisbane|AEST AEDT|-a0 -b0|010101010|4r40 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0|20e5","Australia/Broken_Hill|ACST ACDT|-9u -au|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|4r4u LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|18e3","Australia/Hobart|AEDT AEST|-b0 -a0|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|qg0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|21e4","Australia/Darwin|ACST|-9u|0||12e4","Australia/Eucla|+0845 +0945|-8J -9J|0101010101010|bHRf Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|368","Australia/Lord_Howe|AEST +1030 +1130 +11|-a0 -au -bu -b0|01212121213131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313|raC0 1zdu Rb0 1zd0 On0 1zd0 On0 1zd0 On0 1zd0 TXu 1qMu WLu 1tAu WLu 1tAu TXu 1tAu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu 11zu 1o0u 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 11Au 1nXu 1qMu 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 1qMu 11zu 1o0u WLu 1qMu 14nu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu|347","Australia/Lindeman|AEST AEDT|-a0 -b0|0101010101010|4r40 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0|10","Australia/Melbourne|AEST AEDT|-a0 -b0|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|4r40 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1qM0 11A0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|39e5","Australia/Perth|AWST AWDT|-80 -90|0101010101010|bHS0 Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|18e5","Europe/Brussels|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|21e5","Pacific/Easter|-06 -07 -05|60 70 50|010101010101010101010101020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202|yP0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 2pA0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0|30e2","EET|EET EEST|-20 -30|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|","Europe/Dublin|IST GMT|-10 0|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|4re0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|12e5","Etc/GMT-1|+01|-10|0||","Pacific/Guadalcanal|+11|-b0|0||11e4","Pacific/Tarawa|+12|-c0|0||29e3","Etc/GMT-13|+13|-d0|0||","Etc/GMT-14|+14|-e0|0||","Etc/GMT-2|+02|-20|0||","Indian/Maldives|+05|-50|0||35e4","Pacific/Palau|+09|-90|0||21e3","Etc/GMT+1|-01|10|0||","Pacific/Tahiti|-10|a0|0||18e4","Pacific/Niue|-11|b0|0||12e2","Etc/GMT+12|-12|c0|0||","Etc/GMT+5|-05|50|0||","Etc/GMT+6|-06|60|0||","Etc/GMT+7|-07|70|0||","Etc/GMT+8|-08|80|0||","Pacific/Gambier|-09|90|0||125","Etc/UTC|UTC|0|0||","Europe/Andorra|CET CEST|-10 -20|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|B7d0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|79e3","Europe/Astrakhan|+04 +05 +03|-40 -50 -30|0101010101010101020202020202020202020202020202020202020202020|rn80 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|10e5","Europe/Athens|EET EEST|-20 -30|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|cOK0 1vc0 SO0 1cM0 1a00 1ao0 1fc0 1a10 1fG0 1cg0 1dX0 1bX0 1cQ0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|35e5","Europe/London|BST GMT|-10 0|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|4re0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|10e6","Europe/Belgrade|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|wdd0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|12e5","Europe/Prague|CET CEST|-10 -20|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|muN0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|13e5","Europe/Bucharest|EET EEST|-20 -30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|mRa0 On0 1fA0 1a10 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|19e5","Europe/Budapest|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|oXb0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cO0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|17e5","Europe/Zurich|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|rm10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|38e4","Europe/Chisinau|MSK MSD EEST EET|-30 -40 -30 -20|010101010101010101012323232323232323232323232323232323232323232323232323232323232323232323232323232323|rn90 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 gL0 WO0 1cM0 1cM0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11D0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|67e4","Europe/Gibraltar|CET CEST|-10 -20|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|tLB0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|30e3","Europe/Helsinki|EET EEST|-20 -30|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|rm00 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|12e5","Europe/Kaliningrad|MSK MSD EEST EET +03|-30 -40 -30 -20 -30|010101010101010102323232323232323232323232323232323232323232343|rn90 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|44e4","Europe/Kiev|MSK MSD EEST EET|-30 -40 -30 -20|0101010101010101010123232323232323232323232323232323232323232323232323232323232323232323232323232323|rn90 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 Db0 3220 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|34e5","Europe/Kirov|+04 +05 +03|-40 -50 -30|010101010101010102020202020202020202020202020202020202020202|rn80 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|48e4","Europe/Lisbon|CET WET WEST CEST|-10 0 -10 -20|01212121212121212121212121212121203030302121212121212121212121212121212121212121212121212121212121212121212121|go00 1cM0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|27e5","Europe/Madrid|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|apy0 1a10 1fz0 1a10 19X0 1cN0 1fz0 1a10 1fC0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|62e5","Europe/Malta|CET CEST|-10 -20|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|XX0 LA0 1zc0 Oo0 1C00 Oo0 1co0 1cM0 1lA0 Xc0 1qq0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1iN0 19z0 1fB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|42e4","Europe/Minsk|MSK MSD EEST EET +03|-30 -40 -30 -20 -30|010101010101010101023232323232323232323232323232323232323234|rn90 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 3Fc0 1cN0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0|19e5","Europe/Paris|CET CEST|-10 -20|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|fbc0 1cL0 1fC0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|11e6","Europe/Moscow|MSK MSD EEST EET MSK|-30 -40 -30 -20 -40|0101010101010101010102301010101010101010101010101010101010101040|rn90 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|16e6","Europe/Riga|MSK MSD EEST EET|-30 -40 -30 -20|010101010101010102323232323232323232323232323232323232323232323232323232323232323232323232323232323|rn90 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 1o00 11A0 1o00 11A0 1qM0 3oo0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|64e4","Europe/Rome|CET CEST|-10 -20|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|XX0 LA0 1zc0 Oo0 1C00 Oo0 1C00 LA0 1zc0 Oo0 1C00 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1zc0 Oo0 1fC0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|39e5","Europe/Samara|+04 +05 +03|-40 -50 -30|01010101010101010202010101010101010101010101010101010101020|rn80 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2y10 14m0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|12e5","Europe/Saratov|+04 +05 +03|-40 -50 -30|0101010101010102020202020202020202020202020202020202020202020|rn80 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 5810|","Europe/Simferopol|MSK MSD EET EEST MSK|-30 -40 -20 -30 -40|0101010101010101010232323101010323232323232323232323232323232323240|rn90 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 4eL0 1cL0 1cN0 1cL0 1cN0 dX0 WL0 1cN0 1cL0 1fB0 1o30 11B0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11z0 1nW0|33e4","Europe/Sofia|EET EEST|-20 -30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|muJ0 1dd0 1fb0 1ap0 1fb0 1a20 1fy0 1a30 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|12e5","Europe/Tallinn|MSK MSD EEST EET|-30 -40 -30 -20|0101010101010101023232323232323232323232323232323232323232323232323232323232323232323232323232323|rn90 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o10 11A0 1qM0 5QM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|41e4","Europe/Tirane|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|axz0 10n0 1op0 11z0 1pd0 11z0 1qN0 WL0 1qp0 Xb0 1qp0 Xb0 1qp0 11z0 1lB0 11z0 1qN0 11z0 1iN0 16n0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|42e4","Europe/Ulyanovsk|+04 +05 +03 +02|-40 -50 -30 -20|010101010101010102023202020202020202020202020202020202020202020|rn80 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|13e5","Europe/Uzhgorod|MSK MSD CET EET EEST|-30 -40 -10 -20 -30|010101010101010101023434343434343434343434343434343434343434343434343434343434343434343434343434343|rn90 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 1Nf0 2pw0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|11e4","Europe/Vienna|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|oXb0 19X0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|18e5","Europe/Vilnius|MSK MSD EEST EET CEST CET|-30 -40 -30 -20 -20 -10|01010101010101010232323232323232323454323232323232323232323232323232323232323232323232323232323|rn90 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11B0 1o00 11A0 1qM0 8io0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|54e4","Europe/Volgograd|+04 +05 +03|-40 -50 -30|01010101010101020202020202020202020202020202020202020202020202|rn80 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 9Jd0 5gn0|10e5","Europe/Warsaw|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDA0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|17e5","Europe/Zaporozhye|MSK MSD EEST EET|-30 -40 -30 -20|01010101010101010101023232323232323232323232323232323232323232323232323232323232323232323232323232323|rn90 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cK0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|77e4","Pacific/Honolulu|HST|a0|0||37e4","Indian/Chagos|+05 +06|-50 -60|01|13ij0|30e2","Indian/Mauritius|+04 +05|-40 -50|01010|v5U0 14L0 12kr0 11z0|15e4","Pacific/Kwajalein|-12 +12|c0 -c0|01|Vxo0|14e3","MET|MET MEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|","Pacific/Chatham|+1245 +1345|-cJ -dJ|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|bKC0 IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00|600","Pacific/Apia|-11 -10 +14 +13|b0 a0 -e0 -d0|010123232323232323232323|1Dbn0 1ff0 1a00 CI0 AQ0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0|37e3","Pacific/Bougainville|+10 +11|-a0 -b0|01|1NwE0|18e4","Pacific/Efate|+11 +12|-b0 -c0|01010101010101010101010|9EA0 Dc0 n610 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 Lz0 1Nd0 An0|66e3","Pacific/Enderbury|-12 -11 +13|c0 b0 -d0|012|nIc0 B7X0|1","Pacific/Fakaofo|-11 +13|b0 -d0|01|1Gfn0|483","Pacific/Fiji|+12 +13|-c0 -d0|0101010101010101010101010101010101010101010101|1ace0 LA0 1EM0 IM0 nJc0 LA0 1o00 Rc0 1wo0 Ao0 1Nc0 Ao0 1Q00 xz0 1SN0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 20o0 pc0 2hc0 bc0 4q00 pc0 20o0 pc0 20o0 pc0 20o0 s00 1VA0 s00 20o0 pc0 20o0 pc0 20o0 pc0 20o0|88e4","Pacific/Galapagos|-05 -06|50 60|0101|CVF0 gNd0 rz0|25e3","Pacific/Guam|GST GDT ChST|-a0 -b0 -a0|010101010102|JQ0 Rb0 1wp0 Rb0 5xd0 rX0 5sN0 zb1 1C0X On0 ULb0|17e4","Pacific/Kiritimati|-1040 -10 +14|aE a0 -e0|012|nIaE B7Xk|51e2","Pacific/Kosrae|+12 +11|-c0 -b0|01|1aAA0|66e2","Pacific/Marquesas|-0930|9u|0||86e2","Pacific/Pago_Pago|SST|b0|0||37e2","Pacific/Nauru|+1130 +12|-bu -c0|01|maCu|10e3","Pacific/Norfolk|+1130 +1230 +11 +12|-bu -cu -b0 -c0|010232323232323232323232323|bHOu Oo0 1COo0 9Jcu 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|25e4","Pacific/Noumea|+11 +12|-b0 -c0|0101010|jhp0 xX0 1PB0 yn0 HeP0 Ao0|98e3","Pacific/Pitcairn|-0830 -08|8u 80|01|18Vku|56","Pacific/Rarotonga|-1030 -0930 -10|au 9u a0|012121212121212121212121212|lyWu IL0 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu|13e3","Pacific/Tongatapu|+13 +14|-d0 -e0|010101010|1csd0 15A0 1wo0 xz0 1Q10 xz0 zWN0 s00|75e3","WET|WET WEST|0 -10|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00|"],links:["Africa/Abidjan|Africa/Accra","Africa/Abidjan|Africa/Bamako","Africa/Abidjan|Africa/Banjul","Africa/Abidjan|Africa/Conakry","Africa/Abidjan|Africa/Dakar","Africa/Abidjan|Africa/Freetown","Africa/Abidjan|Africa/Lome","Africa/Abidjan|Africa/Nouakchott","Africa/Abidjan|Africa/Ouagadougou","Africa/Abidjan|Africa/Timbuktu","Africa/Abidjan|Atlantic/Reykjavik","Africa/Abidjan|Atlantic/St_Helena","Africa/Abidjan|Etc/GMT","Africa/Abidjan|Etc/GMT+0","Africa/Abidjan|Etc/GMT-0","Africa/Abidjan|Etc/GMT0","Africa/Abidjan|Etc/Greenwich","Africa/Abidjan|GMT","Africa/Abidjan|GMT+0","Africa/Abidjan|GMT-0","Africa/Abidjan|GMT0","Africa/Abidjan|Greenwich","Africa/Abidjan|Iceland","Africa/Cairo|Egypt","Africa/Johannesburg|Africa/Maseru","Africa/Johannesburg|Africa/Mbabane","Africa/Lagos|Africa/Bangui","Africa/Lagos|Africa/Brazzaville","Africa/Lagos|Africa/Douala","Africa/Lagos|Africa/Kinshasa","Africa/Lagos|Africa/Libreville","Africa/Lagos|Africa/Luanda","Africa/Lagos|Africa/Malabo","Africa/Lagos|Africa/Niamey","Africa/Lagos|Africa/Porto-Novo","Africa/Maputo|Africa/Blantyre","Africa/Maputo|Africa/Bujumbura","Africa/Maputo|Africa/Gaborone","Africa/Maputo|Africa/Harare","Africa/Maputo|Africa/Kigali","Africa/Maputo|Africa/Lubumbashi","Africa/Maputo|Africa/Lusaka","Africa/Nairobi|Africa/Addis_Ababa","Africa/Nairobi|Africa/Asmara","Africa/Nairobi|Africa/Asmera","Africa/Nairobi|Africa/Dar_es_Salaam","Africa/Nairobi|Africa/Djibouti","Africa/Nairobi|Africa/Kampala","Africa/Nairobi|Africa/Mogadishu","Africa/Nairobi|Indian/Antananarivo","Africa/Nairobi|Indian/Comoro","Africa/Nairobi|Indian/Mayotte","Africa/Tripoli|Libya","America/Adak|America/Atka","America/Adak|US/Aleutian","America/Anchorage|US/Alaska","America/Argentina/Buenos_Aires|America/Buenos_Aires","America/Argentina/Catamarca|America/Argentina/ComodRivadavia","America/Argentina/Catamarca|America/Catamarca","America/Argentina/Cordoba|America/Cordoba","America/Argentina/Cordoba|America/Rosario","America/Argentina/Jujuy|America/Jujuy","America/Argentina/Mendoza|America/Mendoza","America/Cayenne|Etc/GMT+3","America/Chicago|CST6CDT","America/Chicago|US/Central","America/Denver|America/Shiprock","America/Denver|MST7MDT","America/Denver|Navajo","America/Denver|US/Mountain","America/Detroit|US/Michigan","America/Edmonton|Canada/Mountain","America/Fort_Wayne|America/Indiana/Indianapolis","America/Fort_Wayne|America/Indianapolis","America/Fort_Wayne|US/East-Indiana","America/Godthab|America/Nuuk","America/Halifax|Canada/Atlantic","America/Havana|Cuba","America/Indiana/Knox|America/Knox_IN","America/Indiana/Knox|US/Indiana-Starke","America/Jamaica|Jamaica","America/Kentucky/Louisville|America/Louisville","America/La_Paz|Etc/GMT+4","America/Los_Angeles|PST8PDT","America/Los_Angeles|US/Pacific","America/Manaus|Brazil/West","America/Mazatlan|Mexico/BajaSur","America/Mexico_City|Mexico/General","America/New_York|EST5EDT","America/New_York|US/Eastern","America/Noronha|Brazil/DeNoronha","America/Panama|America/Atikokan","America/Panama|America/Cayman","America/Panama|America/Coral_Harbour","America/Panama|EST","America/Phoenix|America/Creston","America/Phoenix|MST","America/Phoenix|US/Arizona","America/Puerto_Rico|America/Anguilla","America/Puerto_Rico|America/Antigua","America/Puerto_Rico|America/Aruba","America/Puerto_Rico|America/Blanc-Sablon","America/Puerto_Rico|America/Curacao","America/Puerto_Rico|America/Dominica","America/Puerto_Rico|America/Grenada","America/Puerto_Rico|America/Guadeloupe","America/Puerto_Rico|America/Kralendijk","America/Puerto_Rico|America/Lower_Princes","America/Puerto_Rico|America/Marigot","America/Puerto_Rico|America/Montserrat","America/Puerto_Rico|America/Port_of_Spain","America/Puerto_Rico|America/St_Barthelemy","America/Puerto_Rico|America/St_Kitts","America/Puerto_Rico|America/St_Lucia","America/Puerto_Rico|America/St_Thomas","America/Puerto_Rico|America/St_Vincent","America/Puerto_Rico|America/Tortola","America/Puerto_Rico|America/Virgin","America/Regina|Canada/Saskatchewan","America/Rio_Branco|America/Porto_Acre","America/Rio_Branco|Brazil/Acre","America/Santiago|Chile/Continental","America/Sao_Paulo|Brazil/East","America/St_Johns|Canada/Newfoundland","America/Tijuana|America/Ensenada","America/Tijuana|America/Santa_Isabel","America/Tijuana|Mexico/BajaNorte","America/Toronto|America/Montreal","America/Toronto|America/Nassau","America/Toronto|Canada/Eastern","America/Vancouver|Canada/Pacific","America/Whitehorse|Canada/Yukon","America/Winnipeg|Canada/Central","Asia/Ashgabat|Asia/Ashkhabad","Asia/Bangkok|Asia/Phnom_Penh","Asia/Bangkok|Asia/Vientiane","Asia/Bangkok|Etc/GMT-7","Asia/Bangkok|Indian/Christmas","Asia/Brunei|Asia/Kuching","Asia/Brunei|Etc/GMT-8","Asia/Dhaka|Asia/Dacca","Asia/Dubai|Asia/Muscat","Asia/Dubai|Etc/GMT-4","Asia/Dubai|Indian/Mahe","Asia/Dubai|Indian/Reunion","Asia/Ho_Chi_Minh|Asia/Saigon","Asia/Hong_Kong|Hongkong","Asia/Jerusalem|Asia/Tel_Aviv","Asia/Jerusalem|Israel","Asia/Kathmandu|Asia/Katmandu","Asia/Kolkata|Asia/Calcutta","Asia/Kuala_Lumpur|Asia/Singapore","Asia/Kuala_Lumpur|Singapore","Asia/Macau|Asia/Macao","Asia/Makassar|Asia/Ujung_Pandang","Asia/Nicosia|Europe/Nicosia","Asia/Qatar|Asia/Bahrain","Asia/Rangoon|Asia/Yangon","Asia/Rangoon|Indian/Cocos","Asia/Riyadh|Antarctica/Syowa","Asia/Riyadh|Asia/Aden","Asia/Riyadh|Asia/Kuwait","Asia/Riyadh|Etc/GMT-3","Asia/Seoul|ROK","Asia/Shanghai|Asia/Chongqing","Asia/Shanghai|Asia/Chungking","Asia/Shanghai|Asia/Harbin","Asia/Shanghai|PRC","Asia/Taipei|ROC","Asia/Tehran|Iran","Asia/Thimphu|Asia/Thimbu","Asia/Tokyo|Japan","Asia/Ulaanbaatar|Asia/Ulan_Bator","Asia/Urumqi|Antarctica/Vostok","Asia/Urumqi|Asia/Kashgar","Asia/Urumqi|Etc/GMT-6","Atlantic/Faroe|Atlantic/Faeroe","Atlantic/South_Georgia|Etc/GMT+2","Australia/Adelaide|Australia/South","Australia/Brisbane|Australia/Queensland","Australia/Broken_Hill|Australia/Yancowinna","Australia/Darwin|Australia/North","Australia/Hobart|Australia/Currie","Australia/Hobart|Australia/Tasmania","Australia/Lord_Howe|Australia/LHI","Australia/Melbourne|Australia/Victoria","Australia/Perth|Australia/West","Australia/Sydney|Australia/ACT","Australia/Sydney|Australia/Canberra","Australia/Sydney|Australia/NSW","Etc/UTC|Etc/UCT","Etc/UTC|Etc/Universal","Etc/UTC|Etc/Zulu","Etc/UTC|UCT","Etc/UTC|UTC","Etc/UTC|Universal","Etc/UTC|Zulu","Europe/Belgrade|Europe/Ljubljana","Europe/Belgrade|Europe/Podgorica","Europe/Belgrade|Europe/Sarajevo","Europe/Belgrade|Europe/Skopje","Europe/Belgrade|Europe/Zagreb","Europe/Berlin|Arctic/Longyearbyen","Europe/Berlin|Atlantic/Jan_Mayen","Europe/Berlin|Europe/Copenhagen","Europe/Berlin|Europe/Oslo","Europe/Berlin|Europe/Stockholm","Europe/Brussels|CET","Europe/Brussels|Europe/Amsterdam","Europe/Brussels|Europe/Luxembourg","Europe/Chisinau|Europe/Tiraspol","Europe/Dublin|Eire","Europe/Helsinki|Europe/Mariehamn","Europe/Istanbul|Asia/Istanbul","Europe/Istanbul|Turkey","Europe/Lisbon|Portugal","Europe/London|Europe/Belfast","Europe/London|Europe/Guernsey","Europe/London|Europe/Isle_of_Man","Europe/London|Europe/Jersey","Europe/London|GB","Europe/London|GB-Eire","Europe/Moscow|W-SU","Europe/Paris|Europe/Monaco","Europe/Prague|Europe/Bratislava","Europe/Rome|Europe/San_Marino","Europe/Rome|Europe/Vatican","Europe/Warsaw|Poland","Europe/Zurich|Europe/Busingen","Europe/Zurich|Europe/Vaduz","Indian/Maldives|Etc/GMT-5","Indian/Maldives|Indian/Kerguelen","Pacific/Auckland|Antarctica/McMurdo","Pacific/Auckland|Antarctica/South_Pole","Pacific/Auckland|NZ","Pacific/Chatham|NZ-CHAT","Pacific/Easter|Chile/EasterIsland","Pacific/Enderbury|Pacific/Kanton","Pacific/Gambier|Etc/GMT+9","Pacific/Guadalcanal|Etc/GMT-11","Pacific/Guadalcanal|Pacific/Pohnpei","Pacific/Guadalcanal|Pacific/Ponape","Pacific/Guam|Pacific/Saipan","Pacific/Honolulu|HST","Pacific/Honolulu|Pacific/Johnston","Pacific/Honolulu|US/Hawaii","Pacific/Kwajalein|Kwajalein","Pacific/Niue|Etc/GMT+11","Pacific/Pago_Pago|Pacific/Midway","Pacific/Pago_Pago|Pacific/Samoa","Pacific/Pago_Pago|US/Samoa","Pacific/Palau|Etc/GMT-9","Pacific/Port_Moresby|Antarctica/DumontDUrville","Pacific/Port_Moresby|Etc/GMT-10","Pacific/Port_Moresby|Pacific/Chuuk","Pacific/Port_Moresby|Pacific/Truk","Pacific/Port_Moresby|Pacific/Yap","Pacific/Tahiti|Etc/GMT+10","Pacific/Tarawa|Etc/GMT-12","Pacific/Tarawa|Pacific/Funafuti","Pacific/Tarawa|Pacific/Majuro","Pacific/Tarawa|Pacific/Wake","Pacific/Tarawa|Pacific/Wallis"],countries:["AD|Europe/Andorra","AE|Asia/Dubai","AF|Asia/Kabul","AG|America/Port_of_Spain America/Antigua","AI|America/Port_of_Spain America/Anguilla","AL|Europe/Tirane","AM|Asia/Yerevan","AO|Africa/Lagos Africa/Luanda","AQ|Antarctica/Casey Antarctica/Davis Antarctica/DumontDUrville Antarctica/Mawson Antarctica/Palmer Antarctica/Rothera Antarctica/Syowa Antarctica/Troll Antarctica/Vostok Pacific/Auckland Antarctica/McMurdo","AR|America/Argentina/Buenos_Aires America/Argentina/Cordoba America/Argentina/Salta America/Argentina/Jujuy America/Argentina/Tucuman America/Argentina/Catamarca America/Argentina/La_Rioja America/Argentina/San_Juan America/Argentina/Mendoza America/Argentina/San_Luis America/Argentina/Rio_Gallegos America/Argentina/Ushuaia","AS|Pacific/Pago_Pago","AT|Europe/Vienna","AU|Australia/Lord_Howe Antarctica/Macquarie Australia/Hobart Australia/Melbourne Australia/Sydney Australia/Broken_Hill Australia/Brisbane Australia/Lindeman Australia/Adelaide Australia/Darwin Australia/Perth Australia/Eucla","AW|America/Curacao America/Aruba","AX|Europe/Helsinki Europe/Mariehamn","AZ|Asia/Baku","BA|Europe/Belgrade Europe/Sarajevo","BB|America/Barbados","BD|Asia/Dhaka","BE|Europe/Brussels","BF|Africa/Abidjan Africa/Ouagadougou","BG|Europe/Sofia","BH|Asia/Qatar Asia/Bahrain","BI|Africa/Maputo Africa/Bujumbura","BJ|Africa/Lagos Africa/Porto-Novo","BL|America/Port_of_Spain America/St_Barthelemy","BM|Atlantic/Bermuda","BN|Asia/Brunei","BO|America/La_Paz","BQ|America/Curacao America/Kralendijk","BR|America/Noronha America/Belem America/Fortaleza America/Recife America/Araguaina America/Maceio America/Bahia America/Sao_Paulo America/Campo_Grande America/Cuiaba America/Santarem America/Porto_Velho America/Boa_Vista America/Manaus America/Eirunepe America/Rio_Branco","BS|America/Nassau","BT|Asia/Thimphu","BW|Africa/Maputo Africa/Gaborone","BY|Europe/Minsk","BZ|America/Belize","CA|America/St_Johns America/Halifax America/Glace_Bay America/Moncton America/Goose_Bay America/Blanc-Sablon America/Toronto America/Nipigon America/Thunder_Bay America/Iqaluit America/Pangnirtung America/Atikokan America/Winnipeg America/Rainy_River America/Resolute America/Rankin_Inlet America/Regina America/Swift_Current America/Edmonton America/Cambridge_Bay America/Yellowknife America/Inuvik America/Creston America/Dawson_Creek America/Fort_Nelson America/Whitehorse America/Dawson America/Vancouver","CC|Indian/Cocos","CD|Africa/Maputo Africa/Lagos Africa/Kinshasa Africa/Lubumbashi","CF|Africa/Lagos Africa/Bangui","CG|Africa/Lagos Africa/Brazzaville","CH|Europe/Zurich","CI|Africa/Abidjan","CK|Pacific/Rarotonga","CL|America/Santiago America/Punta_Arenas Pacific/Easter","CM|Africa/Lagos Africa/Douala","CN|Asia/Shanghai Asia/Urumqi","CO|America/Bogota","CR|America/Costa_Rica","CU|America/Havana","CV|Atlantic/Cape_Verde","CW|America/Curacao","CX|Indian/Christmas","CY|Asia/Nicosia Asia/Famagusta","CZ|Europe/Prague","DE|Europe/Zurich Europe/Berlin Europe/Busingen","DJ|Africa/Nairobi Africa/Djibouti","DK|Europe/Copenhagen","DM|America/Port_of_Spain America/Dominica","DO|America/Santo_Domingo","DZ|Africa/Algiers","EC|America/Guayaquil Pacific/Galapagos","EE|Europe/Tallinn","EG|Africa/Cairo","EH|Africa/El_Aaiun","ER|Africa/Nairobi Africa/Asmara","ES|Europe/Madrid Africa/Ceuta Atlantic/Canary","ET|Africa/Nairobi Africa/Addis_Ababa","FI|Europe/Helsinki","FJ|Pacific/Fiji","FK|Atlantic/Stanley","FM|Pacific/Chuuk Pacific/Pohnpei Pacific/Kosrae","FO|Atlantic/Faroe","FR|Europe/Paris","GA|Africa/Lagos Africa/Libreville","GB|Europe/London","GD|America/Port_of_Spain America/Grenada","GE|Asia/Tbilisi","GF|America/Cayenne","GG|Europe/London Europe/Guernsey","GH|Africa/Accra","GI|Europe/Gibraltar","GL|America/Nuuk America/Danmarkshavn America/Scoresbysund America/Thule","GM|Africa/Abidjan Africa/Banjul","GN|Africa/Abidjan Africa/Conakry","GP|America/Port_of_Spain America/Guadeloupe","GQ|Africa/Lagos Africa/Malabo","GR|Europe/Athens","GS|Atlantic/South_Georgia","GT|America/Guatemala","GU|Pacific/Guam","GW|Africa/Bissau","GY|America/Guyana","HK|Asia/Hong_Kong","HN|America/Tegucigalpa","HR|Europe/Belgrade Europe/Zagreb","HT|America/Port-au-Prince","HU|Europe/Budapest","ID|Asia/Jakarta Asia/Pontianak Asia/Makassar Asia/Jayapura","IE|Europe/Dublin","IL|Asia/Jerusalem","IM|Europe/London Europe/Isle_of_Man","IN|Asia/Kolkata","IO|Indian/Chagos","IQ|Asia/Baghdad","IR|Asia/Tehran","IS|Atlantic/Reykjavik","IT|Europe/Rome","JE|Europe/London Europe/Jersey","JM|America/Jamaica","JO|Asia/Amman","JP|Asia/Tokyo","KE|Africa/Nairobi","KG|Asia/Bishkek","KH|Asia/Bangkok Asia/Phnom_Penh","KI|Pacific/Tarawa Pacific/Enderbury Pacific/Kiritimati","KM|Africa/Nairobi Indian/Comoro","KN|America/Port_of_Spain America/St_Kitts","KP|Asia/Pyongyang","KR|Asia/Seoul","KW|Asia/Riyadh Asia/Kuwait","KY|America/Panama America/Cayman","KZ|Asia/Almaty Asia/Qyzylorda Asia/Qostanay Asia/Aqtobe Asia/Aqtau Asia/Atyrau Asia/Oral","LA|Asia/Bangkok Asia/Vientiane","LB|Asia/Beirut","LC|America/Port_of_Spain America/St_Lucia","LI|Europe/Zurich Europe/Vaduz","LK|Asia/Colombo","LR|Africa/Monrovia","LS|Africa/Johannesburg Africa/Maseru","LT|Europe/Vilnius","LU|Europe/Luxembourg","LV|Europe/Riga","LY|Africa/Tripoli","MA|Africa/Casablanca","MC|Europe/Monaco","MD|Europe/Chisinau","ME|Europe/Belgrade Europe/Podgorica","MF|America/Port_of_Spain America/Marigot","MG|Africa/Nairobi Indian/Antananarivo","MH|Pacific/Majuro Pacific/Kwajalein","MK|Europe/Belgrade Europe/Skopje","ML|Africa/Abidjan Africa/Bamako","MM|Asia/Yangon","MN|Asia/Ulaanbaatar Asia/Hovd Asia/Choibalsan","MO|Asia/Macau","MP|Pacific/Guam Pacific/Saipan","MQ|America/Martinique","MR|Africa/Abidjan Africa/Nouakchott","MS|America/Port_of_Spain America/Montserrat","MT|Europe/Malta","MU|Indian/Mauritius","MV|Indian/Maldives","MW|Africa/Maputo Africa/Blantyre","MX|America/Mexico_City America/Cancun America/Merida America/Monterrey America/Matamoros America/Mazatlan America/Chihuahua America/Ojinaga America/Hermosillo America/Tijuana America/Bahia_Banderas","MY|Asia/Kuala_Lumpur Asia/Kuching","MZ|Africa/Maputo","NA|Africa/Windhoek","NC|Pacific/Noumea","NE|Africa/Lagos Africa/Niamey","NF|Pacific/Norfolk","NG|Africa/Lagos","NI|America/Managua","NL|Europe/Amsterdam","NO|Europe/Oslo","NP|Asia/Kathmandu","NR|Pacific/Nauru","NU|Pacific/Niue","NZ|Pacific/Auckland Pacific/Chatham","OM|Asia/Dubai Asia/Muscat","PA|America/Panama","PE|America/Lima","PF|Pacific/Tahiti Pacific/Marquesas Pacific/Gambier","PG|Pacific/Port_Moresby Pacific/Bougainville","PH|Asia/Manila","PK|Asia/Karachi","PL|Europe/Warsaw","PM|America/Miquelon","PN|Pacific/Pitcairn","PR|America/Puerto_Rico","PS|Asia/Gaza Asia/Hebron","PT|Europe/Lisbon Atlantic/Madeira Atlantic/Azores","PW|Pacific/Palau","PY|America/Asuncion","QA|Asia/Qatar","RE|Indian/Reunion","RO|Europe/Bucharest","RS|Europe/Belgrade","RU|Europe/Kaliningrad Europe/Moscow Europe/Simferopol Europe/Kirov Europe/Volgograd Europe/Astrakhan Europe/Saratov Europe/Ulyanovsk Europe/Samara Asia/Yekaterinburg Asia/Omsk Asia/Novosibirsk Asia/Barnaul Asia/Tomsk Asia/Novokuznetsk Asia/Krasnoyarsk Asia/Irkutsk Asia/Chita Asia/Yakutsk Asia/Khandyga Asia/Vladivostok Asia/Ust-Nera Asia/Magadan Asia/Sakhalin Asia/Srednekolymsk Asia/Kamchatka Asia/Anadyr","RW|Africa/Maputo Africa/Kigali","SA|Asia/Riyadh","SB|Pacific/Guadalcanal","SC|Indian/Mahe","SD|Africa/Khartoum","SE|Europe/Stockholm","SG|Asia/Singapore","SH|Africa/Abidjan Atlantic/St_Helena","SI|Europe/Belgrade Europe/Ljubljana","SJ|Europe/Oslo Arctic/Longyearbyen","SK|Europe/Prague Europe/Bratislava","SL|Africa/Abidjan Africa/Freetown","SM|Europe/Rome Europe/San_Marino","SN|Africa/Abidjan Africa/Dakar","SO|Africa/Nairobi Africa/Mogadishu","SR|America/Paramaribo","SS|Africa/Juba","ST|Africa/Sao_Tome","SV|America/El_Salvador","SX|America/Curacao America/Lower_Princes","SY|Asia/Damascus","SZ|Africa/Johannesburg Africa/Mbabane","TC|America/Grand_Turk","TD|Africa/Ndjamena","TF|Indian/Reunion Indian/Kerguelen","TG|Africa/Abidjan Africa/Lome","TH|Asia/Bangkok","TJ|Asia/Dushanbe","TK|Pacific/Fakaofo","TL|Asia/Dili","TM|Asia/Ashgabat","TN|Africa/Tunis","TO|Pacific/Tongatapu","TR|Europe/Istanbul","TT|America/Port_of_Spain","TV|Pacific/Funafuti","TW|Asia/Taipei","TZ|Africa/Nairobi Africa/Dar_es_Salaam","UA|Europe/Simferopol Europe/Kiev Europe/Uzhgorod Europe/Zaporozhye","UG|Africa/Nairobi Africa/Kampala","UM|Pacific/Pago_Pago Pacific/Wake Pacific/Honolulu Pacific/Midway","US|America/New_York America/Detroit America/Kentucky/Louisville America/Kentucky/Monticello America/Indiana/Indianapolis America/Indiana/Vincennes America/Indiana/Winamac America/Indiana/Marengo America/Indiana/Petersburg America/Indiana/Vevay America/Chicago America/Indiana/Tell_City America/Indiana/Knox America/Menominee America/North_Dakota/Center America/North_Dakota/New_Salem America/North_Dakota/Beulah America/Denver America/Boise America/Phoenix America/Los_Angeles America/Anchorage America/Juneau America/Sitka America/Metlakatla America/Yakutat America/Nome America/Adak Pacific/Honolulu","UY|America/Montevideo","UZ|Asia/Samarkand Asia/Tashkent","VA|Europe/Rome Europe/Vatican","VC|America/Port_of_Spain America/St_Vincent","VE|America/Caracas","VG|America/Port_of_Spain America/Tortola","VI|America/Port_of_Spain America/St_Thomas","VN|Asia/Bangkok Asia/Ho_Chi_Minh","VU|Pacific/Efate","WF|Pacific/Wallis","WS|Pacific/Apia","YE|Asia/Riyadh Asia/Aden","YT|Africa/Nairobi Indian/Mayotte","ZA|Africa/Johannesburg","ZM|Africa/Maputo Africa/Lusaka","ZW|Africa/Maputo Africa/Harare"]}),b});//! moment-timezone.js
//! version : 0.5.34
//! Copyright (c) JS Foundation and other contributors
//! license : MIT
//! github.com/moment/moment-timezone

(function (root, factory) {
	"use strict";

	/*global define*/
	if (typeof module === 'object' && module.exports) {
		module.exports = factory(require('moment')); // Node
	} else if (typeof define === 'function' && define.amd) {
		define(['moment'], factory);                 // AMD
	} else {
		factory(root.moment);                        // Browser
	}
}(this, function (moment) {
	"use strict";

	// Resolves es6 module loading issue
	if (moment.version === undefined && moment.default) {
		moment = moment.default;
	}

	// Do not load moment-timezone a second time.
	// if (moment.tz !== undefined) {
	// 	logError('Moment Timezone ' + moment.tz.version + ' was already loaded ' + (moment.tz.dataVersion ? 'with data from ' : 'without any data') + moment.tz.dataVersion);
	// 	return moment;
	// }

	var VERSION = "0.5.34",
		zones = {},
		links = {},
		countries = {},
		names = {},
		guesses = {},
		cachedGuess;

	if (!moment || typeof moment.version !== 'string') {
		logError('Moment Timezone requires Moment.js. See https://momentjs.com/timezone/docs/#/use-it/browser/');
	}

	var momentVersion = moment.version.split('.'),
		major = +momentVersion[0],
		minor = +momentVersion[1];

	// Moment.js version check
	if (major < 2 || (major === 2 && minor < 6)) {
		logError('Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js ' + moment.version + '. See momentjs.com');
	}

	/************************************
		Unpacking
	************************************/

	function charCodeToInt(charCode) {
		if (charCode > 96) {
			return charCode - 87;
		} else if (charCode > 64) {
			return charCode - 29;
		}
		return charCode - 48;
	}

	function unpackBase60(string) {
		var i = 0,
			parts = string.split('.'),
			whole = parts[0],
			fractional = parts[1] || '',
			multiplier = 1,
			num,
			out = 0,
			sign = 1;

		// handle negative numbers
		if (string.charCodeAt(0) === 45) {
			i = 1;
			sign = -1;
		}

		// handle digits before the decimal
		for (i; i < whole.length; i++) {
			num = charCodeToInt(whole.charCodeAt(i));
			out = 60 * out + num;
		}

		// handle digits after the decimal
		for (i = 0; i < fractional.length; i++) {
			multiplier = multiplier / 60;
			num = charCodeToInt(fractional.charCodeAt(i));
			out += num * multiplier;
		}

		return out * sign;
	}

	function arrayToInt (array) {
		for (var i = 0; i < array.length; i++) {
			array[i] = unpackBase60(array[i]);
		}
	}

	function intToUntil (array, length) {
		for (var i = 0; i < length; i++) {
			array[i] = Math.round((array[i - 1] || 0) + (array[i] * 60000)); // minutes to milliseconds
		}

		array[length - 1] = Infinity;
	}

	function mapIndices (source, indices) {
		var out = [], i;

		for (i = 0; i < indices.length; i++) {
			out[i] = source[indices[i]];
		}

		return out;
	}

	function unpack (string) {
		var data = string.split('|'),
			offsets = data[2].split(' '),
			indices = data[3].split(''),
			untils  = data[4].split(' ');

		arrayToInt(offsets);
		arrayToInt(indices);
		arrayToInt(untils);

		intToUntil(untils, indices.length);

		return {
			name       : data[0],
			abbrs      : mapIndices(data[1].split(' '), indices),
			offsets    : mapIndices(offsets, indices),
			untils     : untils,
			population : data[5] | 0
		};
	}

	/************************************
		Zone object
	************************************/

	function Zone (packedString) {
		if (packedString) {
			this._set(unpack(packedString));
		}
	}

	Zone.prototype = {
		_set : function (unpacked) {
			this.name       = unpacked.name;
			this.abbrs      = unpacked.abbrs;
			this.untils     = unpacked.untils;
			this.offsets    = unpacked.offsets;
			this.population = unpacked.population;
		},

		_index : function (timestamp) {
			var target = +timestamp,
				untils = this.untils,
				i;

			for (i = 0; i < untils.length; i++) {
				if (target < untils[i]) {
					return i;
				}
			}
		},

		countries : function () {
			var zone_name = this.name;
			return Object.keys(countries).filter(function (country_code) {
				return countries[country_code].zones.indexOf(zone_name) !== -1;
			});
		},

		parse : function (timestamp) {
			var target  = +timestamp,
				offsets = this.offsets,
				untils  = this.untils,
				max     = untils.length - 1,
				offset, offsetNext, offsetPrev, i;

			for (i = 0; i < max; i++) {
				offset     = offsets[i];
				offsetNext = offsets[i + 1];
				offsetPrev = offsets[i ? i - 1 : i];

				if (offset < offsetNext && tz.moveAmbiguousForward) {
					offset = offsetNext;
				} else if (offset > offsetPrev && tz.moveInvalidForward) {
					offset = offsetPrev;
				}

				if (target < untils[i] - (offset * 60000)) {
					return offsets[i];
				}
			}

			return offsets[max];
		},

		abbr : function (mom) {
			return this.abbrs[this._index(mom)];
		},

		offset : function (mom) {
			logError("zone.offset has been deprecated in favor of zone.utcOffset");
			return this.offsets[this._index(mom)];
		},

		utcOffset : function (mom) {
			return this.offsets[this._index(mom)];
		}
	};

	/************************************
		Country object
	************************************/

	function Country (country_name, zone_names) {
		this.name = country_name;
		this.zones = zone_names;
	}

	/************************************
		Current Timezone
	************************************/

	function OffsetAt(at) {
		var timeString = at.toTimeString();
		var abbr = timeString.match(/\([a-z ]+\)/i);
		if (abbr && abbr[0]) {
			// 17:56:31 GMT-0600 (CST)
			// 17:56:31 GMT-0600 (Central Standard Time)
			abbr = abbr[0].match(/[A-Z]/g);
			abbr = abbr ? abbr.join('') : undefined;
		} else {
			// 17:56:31 CST
			// 17:56:31 GMT+0800 (台北標準時間)
			abbr = timeString.match(/[A-Z]{3,5}/g);
			abbr = abbr ? abbr[0] : undefined;
		}

		if (abbr === 'GMT') {
			abbr = undefined;
		}

		this.at = +at;
		this.abbr = abbr;
		this.offset = at.getTimezoneOffset();
	}

	function ZoneScore(zone) {
		this.zone = zone;
		this.offsetScore = 0;
		this.abbrScore = 0;
	}

	ZoneScore.prototype.scoreOffsetAt = function (offsetAt) {
		this.offsetScore += Math.abs(this.zone.utcOffset(offsetAt.at) - offsetAt.offset);
		if (this.zone.abbr(offsetAt.at).replace(/[^A-Z]/g, '') !== offsetAt.abbr) {
			this.abbrScore++;
		}
	};

	function findChange(low, high) {
		var mid, diff;

		while ((diff = ((high.at - low.at) / 12e4 | 0) * 6e4)) {
			mid = new OffsetAt(new Date(low.at + diff));
			if (mid.offset === low.offset) {
				low = mid;
			} else {
				high = mid;
			}
		}

		return low;
	}

	function userOffsets() {
		var startYear = new Date().getFullYear() - 2,
			last = new OffsetAt(new Date(startYear, 0, 1)),
			offsets = [last],
			change, next, i;

		for (i = 1; i < 48; i++) {
			next = new OffsetAt(new Date(startYear, i, 1));
			if (next.offset !== last.offset) {
				change = findChange(last, next);
				offsets.push(change);
				offsets.push(new OffsetAt(new Date(change.at + 6e4)));
			}
			last = next;
		}

		for (i = 0; i < 4; i++) {
			offsets.push(new OffsetAt(new Date(startYear + i, 0, 1)));
			offsets.push(new OffsetAt(new Date(startYear + i, 6, 1)));
		}

		return offsets;
	}

	function sortZoneScores (a, b) {
		if (a.offsetScore !== b.offsetScore) {
			return a.offsetScore - b.offsetScore;
		}
		if (a.abbrScore !== b.abbrScore) {
			return a.abbrScore - b.abbrScore;
		}
		if (a.zone.population !== b.zone.population) {
			return b.zone.population - a.zone.population;
		}
		return b.zone.name.localeCompare(a.zone.name);
	}

	function addToGuesses (name, offsets) {
		var i, offset;
		arrayToInt(offsets);
		for (i = 0; i < offsets.length; i++) {
			offset = offsets[i];
			guesses[offset] = guesses[offset] || {};
			guesses[offset][name] = true;
		}
	}

	function guessesForUserOffsets (offsets) {
		var offsetsLength = offsets.length,
			filteredGuesses = {},
			out = [],
			i, j, guessesOffset;

		for (i = 0; i < offsetsLength; i++) {
			guessesOffset = guesses[offsets[i].offset] || {};
			for (j in guessesOffset) {
				if (guessesOffset.hasOwnProperty(j)) {
					filteredGuesses[j] = true;
				}
			}
		}

		for (i in filteredGuesses) {
			if (filteredGuesses.hasOwnProperty(i)) {
				out.push(names[i]);
			}
		}

		return out;
	}

	function rebuildGuess () {

		// use Intl API when available and returning valid time zone
		try {
			var intlName = Intl.DateTimeFormat().resolvedOptions().timeZone;
			if (intlName && intlName.length > 3) {
				var name = names[normalizeName(intlName)];
				if (name) {
					return name;
				}
				logError("Moment Timezone found " + intlName + " from the Intl api, but did not have that data loaded.");
			}
		} catch (e) {
			// Intl unavailable, fall back to manual guessing.
		}

		var offsets = userOffsets(),
			offsetsLength = offsets.length,
			guesses = guessesForUserOffsets(offsets),
			zoneScores = [],
			zoneScore, i, j;

		for (i = 0; i < guesses.length; i++) {
			zoneScore = new ZoneScore(getZone(guesses[i]), offsetsLength);
			for (j = 0; j < offsetsLength; j++) {
				zoneScore.scoreOffsetAt(offsets[j]);
			}
			zoneScores.push(zoneScore);
		}

		zoneScores.sort(sortZoneScores);

		return zoneScores.length > 0 ? zoneScores[0].zone.name : undefined;
	}

	function guess (ignoreCache) {
		if (!cachedGuess || ignoreCache) {
			cachedGuess = rebuildGuess();
		}
		return cachedGuess;
	}

	/************************************
		Global Methods
	************************************/

	function normalizeName (name) {
		return (name || '').toLowerCase().replace(/\//g, '_');
	}

	function addZone (packed) {
		var i, name, split, normalized;

		if (typeof packed === "string") {
			packed = [packed];
		}

		for (i = 0; i < packed.length; i++) {
			split = packed[i].split('|');
			name = split[0];
			normalized = normalizeName(name);
			zones[normalized] = packed[i];
			names[normalized] = name;
			addToGuesses(normalized, split[2].split(' '));
		}
	}

	function getZone (name, caller) {

		name = normalizeName(name);

		var zone = zones[name];
		var link;

		if (zone instanceof Zone) {
			return zone;
		}

		if (typeof zone === 'string') {
			zone = new Zone(zone);
			zones[name] = zone;
			return zone;
		}

		// Pass getZone to prevent recursion more than 1 level deep
		if (links[name] && caller !== getZone && (link = getZone(links[name], getZone))) {
			zone = zones[name] = new Zone();
			zone._set(link);
			zone.name = names[name];
			return zone;
		}

		return null;
	}

	function getNames () {
		var i, out = [];

		for (i in names) {
			if (names.hasOwnProperty(i) && (zones[i] || zones[links[i]]) && names[i]) {
				out.push(names[i]);
			}
		}

		return out.sort();
	}

	function getCountryNames () {
		return Object.keys(countries);
	}

	function addLink (aliases) {
		var i, alias, normal0, normal1;

		if (typeof aliases === "string") {
			aliases = [aliases];
		}

		for (i = 0; i < aliases.length; i++) {
			alias = aliases[i].split('|');

			normal0 = normalizeName(alias[0]);
			normal1 = normalizeName(alias[1]);

			links[normal0] = normal1;
			names[normal0] = alias[0];

			links[normal1] = normal0;
			names[normal1] = alias[1];
		}
	}

	function addCountries (data) {
		var i, country_code, country_zones, split;
		if (!data || !data.length) return;
		for (i = 0; i < data.length; i++) {
			split = data[i].split('|');
			country_code = split[0].toUpperCase();
			country_zones = split[1].split(' ');
			countries[country_code] = new Country(
				country_code,
				country_zones
			);
		}
	}

	function getCountry (name) {
		name = name.toUpperCase();
		return countries[name] || null;
	}

	function zonesForCountry(country, with_offset) {
		country = getCountry(country);

		if (!country) return null;

		var zones = country.zones.sort();

		if (with_offset) {
			return zones.map(function (zone_name) {
				var zone = getZone(zone_name);
				return {
					name: zone_name,
					offset: zone.utcOffset(new Date())
				};
			});
		}

		return zones;
	}

	function loadData (data) {
		addZone(data.zones);
		addLink(data.links);
		addCountries(data.countries);
		tz.dataVersion = data.version;
	}

	function zoneExists (name) {
		if (!zoneExists.didShowError) {
			zoneExists.didShowError = true;
				logError("moment.tz.zoneExists('" + name + "') has been deprecated in favor of !moment.tz.zone('" + name + "')");
		}
		return !!getZone(name);
	}

	function needsOffset (m) {
		var isUnixTimestamp = (m._f === 'X' || m._f === 'x');
		return !!(m._a && (m._tzm === undefined) && !isUnixTimestamp);
	}

	function logError (message) {
		if (typeof console !== 'undefined' && typeof console.error === 'function') {
			console.error(message);
		}
	}

	/************************************
		moment.tz namespace
	************************************/

	function tz (input) {
		var args = Array.prototype.slice.call(arguments, 0, -1),
			name = arguments[arguments.length - 1],
			zone = getZone(name),
			out  = moment.utc.apply(null, args);

		if (zone && !moment.isMoment(input) && needsOffset(out)) {
			out.add(zone.parse(out), 'minutes');
		}

		out.tz(name);

		return out;
	}

	tz.version      = VERSION;
	tz.dataVersion  = '';
	tz._zones       = zones;
	tz._links       = links;
	tz._names       = names;
	tz._countries	= countries;
	tz.add          = addZone;
	tz.link         = addLink;
	tz.load         = loadData;
	tz.zone         = getZone;
	tz.zoneExists   = zoneExists; // deprecated in 0.1.0
	tz.guess        = guess;
	tz.names        = getNames;
	tz.Zone         = Zone;
	tz.unpack       = unpack;
	tz.unpackBase60 = unpackBase60;
	tz.needsOffset  = needsOffset;
	tz.moveInvalidForward   = true;
	tz.moveAmbiguousForward = false;
	tz.countries    = getCountryNames;
	tz.zonesForCountry = zonesForCountry;

	/************************************
		Interface with Moment.js
	************************************/

	var fn = moment.fn;

	moment.tz = tz;

	moment.defaultZone = null;

	moment.updateOffset = function (mom, keepTime) {
		var zone = moment.defaultZone,
			offset;

		if (mom._z === undefined) {
			if (zone && needsOffset(mom) && !mom._isUTC) {
				mom._d = moment.utc(mom._a)._d;
				mom.utc().add(zone.parse(mom), 'minutes');
			}
			mom._z = zone;
		}
		if (mom._z) {
			offset = mom._z.utcOffset(mom);
			if (Math.abs(offset) < 16) {
				offset = offset / 60;
			}
			if (mom.utcOffset !== undefined) {
				var z = mom._z;
				mom.utcOffset(-offset, keepTime);
				mom._z = z;
			} else {
				mom.zone(offset, keepTime);
			}
		}
	};

	fn.tz = function (name, keepTime) {
		if (name) {
			if (typeof name !== 'string') {
				throw new Error('Time zone name must be a string, got ' + name + ' [' + typeof name + ']');
			}
			this._z = getZone(name);
			if (this._z) {
				moment.updateOffset(this, keepTime);
			} else {
				logError("Moment Timezone has no data for " + name + ". See http://momentjs.com/timezone/docs/#/data-loading/.");
			}
			return this;
		}
		if (this._z) { return this._z.name; }
	};

	function abbrWrap (old) {
		return function () {
			if (this._z) { return this._z.abbr(this); }
			return old.call(this);
		};
	}

	function resetZoneWrap (old) {
		return function () {
			this._z = null;
			return old.apply(this, arguments);
		};
	}

	function resetZoneWrap2 (old) {
		return function () {
			if (arguments.length > 0) this._z = null;
			return old.apply(this, arguments);
		};
	}

	fn.zoneName  = abbrWrap(fn.zoneName);
	fn.zoneAbbr  = abbrWrap(fn.zoneAbbr);
	fn.utc       = resetZoneWrap(fn.utc);
	fn.local     = resetZoneWrap(fn.local);
	fn.utcOffset = resetZoneWrap2(fn.utcOffset);

	moment.tz.setDefault = function(name) {
		if (major < 2 || (major === 2 && minor < 9)) {
			logError('Moment Timezone setDefault() requires Moment.js >= 2.9.0. You are using Moment.js ' + moment.version + '.');
		}
		moment.defaultZone = name ? getZone(name) : null;
		return moment;
	};

	// Cloning a moment should include the _z property.
	var momentProperties = moment.momentProperties;
	if (Object.prototype.toString.call(momentProperties) === '[object Array]') {
		// moment 2.8.1+
		momentProperties.push('_z');
		momentProperties.push('_a');
	} else if (momentProperties) {
		// moment 2.7.0
		momentProperties._z = null;
	}

	loadData({
		"version": "2021e",
		"zones": [
			"Africa/Abidjan|GMT|0|0||48e5",
			"Africa/Nairobi|EAT|-30|0||47e5",
			"Africa/Algiers|CET|-10|0||26e5",
			"Africa/Lagos|WAT|-10|0||17e6",
			"Africa/Maputo|CAT|-20|0||26e5",
			"Africa/Cairo|EET EEST|-20 -30|01010|1M2m0 gL0 e10 mn0|15e6",
			"Africa/Casablanca|+00 +01|0 -10|010101010101010101010101010101010101|1H3C0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0|32e5",
			"Europe/Paris|CET CEST|-10 -20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|11e6",
			"Africa/Johannesburg|SAST|-20|0||84e5",
			"Africa/Juba|EAT CAT|-30 -20|01|24nx0|",
			"Africa/Khartoum|EAT CAT|-30 -20|01|1Usl0|51e5",
			"Africa/Sao_Tome|GMT WAT|0 -10|010|1UQN0 2q00|",
			"Africa/Tripoli|EET CET CEST|-20 -10 -20|0120|1IlA0 TA0 1o00|11e5",
			"Africa/Windhoek|CAT WAT|-20 -10|0101010101010|1GQo0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0|32e4",
			"America/Adak|HST HDT|a0 90|01010101010101010101010|1GIc0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|326",
			"America/Anchorage|AKST AKDT|90 80|01010101010101010101010|1GIb0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|30e4",
			"America/Santo_Domingo|AST|40|0||29e5",
			"America/Araguaina|-03 -02|30 20|010|1IdD0 Lz0|14e4",
			"America/Fortaleza|-03|30|0||34e5",
			"America/Asuncion|-03 -04|30 40|01010101010101010101010|1GTf0 1cN0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0|28e5",
			"America/Panama|EST|50|0||15e5",
			"America/Mexico_City|CST CDT|60 50|01010101010101010101010|1GQw0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0|20e6",
			"America/Bahia|-02 -03|20 30|01|1GCq0|27e5",
			"America/Managua|CST|60|0||22e5",
			"America/La_Paz|-04|40|0||19e5",
			"America/Lima|-05|50|0||11e6",
			"America/Denver|MST MDT|70 60|01010101010101010101010|1GI90 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|26e5",
			"America/Campo_Grande|-03 -04|30 40|0101010101010101|1GCr0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|77e4",
			"America/Cancun|CST CDT EST|60 50 50|01010102|1GQw0 1nX0 14p0 1lb0 14p0 1lb0 Dd0|63e4",
			"America/Caracas|-0430 -04|4u 40|01|1QMT0|29e5",
			"America/Chicago|CST CDT|60 50|01010101010101010101010|1GI80 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|92e5",
			"America/Chihuahua|MST MDT|70 60|01010101010101010101010|1GQx0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0|81e4",
			"America/Phoenix|MST|70|0||42e5",
			"America/Whitehorse|PST PDT MST|80 70 70|0101010101010101012|1GIa0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1z90|23e3",
			"America/New_York|EST EDT|50 40|01010101010101010101010|1GI70 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|21e6",
			"America/Rio_Branco|-04 -05|40 50|01|1KLE0|31e4",
			"America/Los_Angeles|PST PDT|80 70|01010101010101010101010|1GIa0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|15e6",
			"America/Fort_Nelson|PST PDT MST|80 70 70|01010102|1GIa0 1zb0 Op0 1zb0 Op0 1zb0 Op0|39e2",
			"America/Halifax|AST ADT|40 30|01010101010101010101010|1GI60 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|39e4",
			"America/Godthab|-03 -02|30 20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|17e3",
			"America/Grand_Turk|EST EDT AST|50 40 40|010101021010101010|1GI70 1zb0 Op0 1zb0 Op0 1zb0 Op0 7jA0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|37e2",
			"America/Havana|CST CDT|50 40|01010101010101010101010|1GQt0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0|21e5",
			"America/Metlakatla|PST AKST AKDT|80 90 80|01212120121212121|1PAa0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 uM0 jB0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|14e2",
			"America/Miquelon|-03 -02|30 20|01010101010101010101010|1GI50 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|61e2",
			"America/Montevideo|-02 -03|20 30|01010101|1GI40 1o10 11z0 1o10 11z0 1o10 11z0|17e5",
			"America/Noronha|-02|20|0||30e2",
			"America/Port-au-Prince|EST EDT|50 40|010101010101010101010|1GI70 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 3iN0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|23e5",
			"Antarctica/Palmer|-03 -04|30 40|010101010|1H3D0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|40",
			"America/Santiago|-03 -04|30 40|010101010101010101010|1H3D0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0|62e5",
			"America/Sao_Paulo|-02 -03|20 30|0101010101010101|1GCq0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|20e6",
			"Atlantic/Azores|-01 +00|10 0|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|25e4",
			"America/St_Johns|NST NDT|3u 2u|01010101010101010101010|1GI5u 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|11e4",
			"Antarctica/Casey|+11 +08|-b0 -80|010101010|1GAF0 blz0 3m10 1o30 14k0 1kr0 12l0 1o01|10",
			"Antarctica/Davis|+05 +07|-50 -70|01|1GAI0|70",
			"Pacific/Port_Moresby|+10|-a0|0||25e4",
			"Australia/Sydney|AEDT AEST|-b0 -a0|01010101010101010101010|1GQg0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|40e5",
			"Asia/Tashkent|+05|-50|0||23e5",
			"Pacific/Auckland|NZDT NZST|-d0 -c0|01010101010101010101010|1GQe0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00|14e5",
			"Asia/Baghdad|+03|-30|0||66e5",
			"Antarctica/Troll|+00 +02|0 -20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|40",
			"Asia/Dhaka|+06|-60|0||16e6",
			"Asia/Amman|EET EEST|-20 -30|010101010101010101010|1GPy0 4bX0 Dd0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 LA0 1C00|25e5",
			"Asia/Kamchatka|+12|-c0|0||18e4",
			"Asia/Baku|+04 +05|-40 -50|010101010|1GNA0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|27e5",
			"Asia/Bangkok|+07|-70|0||15e6",
			"Asia/Barnaul|+07 +06|-70 -60|010|1N7v0 3rd0|",
			"Asia/Beirut|EET EEST|-20 -30|01010101010101010101010|1GNy0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0|22e5",
			"Asia/Kuala_Lumpur|+08|-80|0||71e5",
			"Asia/Kolkata|IST|-5u|0||15e6",
			"Asia/Chita|+10 +08 +09|-a0 -80 -90|012|1N7s0 3re0|33e4",
			"Asia/Ulaanbaatar|+08 +09|-80 -90|01010|1O8G0 1cJ0 1cP0 1cJ0|12e5",
			"Asia/Shanghai|CST|-80|0||23e6",
			"Asia/Colombo|+0530|-5u|0||22e5",
			"Asia/Damascus|EET EEST|-20 -30|01010101010101010101010|1GPy0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0|26e5",
			"Asia/Dili|+09|-90|0||19e4",
			"Asia/Dubai|+04|-40|0||39e5",
			"Asia/Famagusta|EET EEST +03|-20 -30 -30|0101010101201010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 15U0 2Ks0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|",
			"Asia/Gaza|EET EEST|-20 -30|01010101010101010101010|1GPy0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nA0 1210 1qL0 WN0 1qL0 WN0 1qL0 11c0 1on0 11B0 1o00 11A0 1qo0 Xc0 1qo0|18e5",
			"Asia/Hong_Kong|HKT|-80|0||73e5",
			"Asia/Hovd|+07 +08|-70 -80|01010|1O8H0 1cJ0 1cP0 1cJ0|81e3",
			"Asia/Irkutsk|+09 +08|-90 -80|01|1N7t0|60e4",
			"Europe/Istanbul|EET EEST +03|-20 -30 -30|01010101012|1GNB0 1qM0 11A0 1o00 1200 1nA0 11A0 1tA0 U00 15w0|13e6",
			"Asia/Jakarta|WIB|-70|0||31e6",
			"Asia/Jayapura|WIT|-90|0||26e4",
			"Asia/Jerusalem|IST IDT|-20 -30|01010101010101010101010|1GPA0 1aL0 1eN0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0|81e4",
			"Asia/Kabul|+0430|-4u|0||46e5",
			"Asia/Karachi|PKT|-50|0||24e6",
			"Asia/Kathmandu|+0545|-5J|0||12e5",
			"Asia/Yakutsk|+10 +09|-a0 -90|01|1N7s0|28e4",
			"Asia/Krasnoyarsk|+08 +07|-80 -70|01|1N7u0|10e5",
			"Asia/Magadan|+12 +10 +11|-c0 -a0 -b0|012|1N7q0 3Cq0|95e3",
			"Asia/Makassar|WITA|-80|0||15e5",
			"Asia/Manila|PST|-80|0||24e6",
			"Europe/Athens|EET EEST|-20 -30|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|35e5",
			"Asia/Novosibirsk|+07 +06|-70 -60|010|1N7v0 4eN0|15e5",
			"Asia/Omsk|+07 +06|-70 -60|01|1N7v0|12e5",
			"Asia/Pyongyang|KST KST|-90 -8u|010|1P4D0 6BA0|29e5",
			"Asia/Qyzylorda|+06 +05|-60 -50|01|1Xei0|73e4",
			"Asia/Rangoon|+0630|-6u|0||48e5",
			"Asia/Sakhalin|+11 +10|-b0 -a0|010|1N7r0 3rd0|58e4",
			"Asia/Seoul|KST|-90|0||23e6",
			"Asia/Srednekolymsk|+12 +11|-c0 -b0|01|1N7q0|35e2",
			"Asia/Tehran|+0330 +0430|-3u -4u|01010101010101010101010|1GLUu 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0|14e6",
			"Asia/Tokyo|JST|-90|0||38e6",
			"Asia/Tomsk|+07 +06|-70 -60|010|1N7v0 3Qp0|10e5",
			"Asia/Vladivostok|+11 +10|-b0 -a0|01|1N7r0|60e4",
			"Asia/Yekaterinburg|+06 +05|-60 -50|01|1N7w0|14e5",
			"Europe/Lisbon|WET WEST|0 -10|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|27e5",
			"Atlantic/Cape_Verde|-01|10|0||50e4",
			"Australia/Adelaide|ACDT ACST|-au -9u|01010101010101010101010|1GQgu 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|11e5",
			"Australia/Brisbane|AEST|-a0|0||20e5",
			"Australia/Darwin|ACST|-9u|0||12e4",
			"Australia/Eucla|+0845|-8J|0||368",
			"Australia/Lord_Howe|+11 +1030|-b0 -au|01010101010101010101010|1GQf0 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu|347",
			"Australia/Perth|AWST|-80|0||18e5",
			"Pacific/Easter|-05 -06|50 60|010101010101010101010|1H3D0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0|30e2",
			"Europe/Dublin|GMT IST|0 -10|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|12e5",
			"Etc/GMT-1|+01|-10|0||",
			"Pacific/Guadalcanal|+11|-b0|0||11e4",
			"Pacific/Fakaofo|+13|-d0|0||483",
			"Pacific/Kiritimati|+14|-e0|0||51e2",
			"Etc/GMT-2|+02|-20|0||",
			"Pacific/Tahiti|-10|a0|0||18e4",
			"Pacific/Niue|-11|b0|0||12e2",
			"Etc/GMT+12|-12|c0|0||",
			"Pacific/Galapagos|-06|60|0||25e3",
			"Etc/GMT+7|-07|70|0||",
			"Pacific/Pitcairn|-08|80|0||56",
			"Pacific/Gambier|-09|90|0||125",
			"Etc/UTC|UTC|0|0||",
			"Europe/Ulyanovsk|+04 +03|-40 -30|010|1N7y0 3rd0|13e5",
			"Europe/London|GMT BST|0 -10|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|10e6",
			"Europe/Chisinau|EET EEST|-20 -30|01010101010101010101010|1GNA0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|67e4",
			"Europe/Kaliningrad|+03 EET|-30 -20|01|1N7z0|44e4",
			"Europe/Kirov|+04 +03|-40 -30|01|1N7y0|48e4",
			"Europe/Moscow|MSK MSK|-40 -30|01|1N7y0|16e6",
			"Europe/Saratov|+04 +03|-40 -30|010|1N7y0 5810|",
			"Europe/Simferopol|EET EEST MSK MSK|-20 -30 -40 -30|0101023|1GNB0 1qM0 11A0 1o00 11z0 1nW0|33e4",
			"Europe/Volgograd|+04 +03|-40 -30|0101|1N7y0 9Jd0 5gn0|10e5",
			"Pacific/Honolulu|HST|a0|0||37e4",
			"MET|MET MEST|-10 -20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|",
			"Pacific/Chatham|+1345 +1245|-dJ -cJ|01010101010101010101010|1GQe0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00|600",
			"Pacific/Apia|+14 +13|-e0 -d0|01010101010101010101|1GQe0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0|37e3",
			"Pacific/Bougainville|+10 +11|-a0 -b0|01|1NwE0|18e4",
			"Pacific/Fiji|+13 +12|-d0 -c0|010101010101010101010|1Goe0 1Nc0 Ao0 1Q00 xz0 1SN0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 20o0 pc0 2hc0 bc0 4q00|88e4",
			"Pacific/Guam|ChST|-a0|0||17e4",
			"Pacific/Marquesas|-0930|9u|0||86e2",
			"Pacific/Pago_Pago|SST|b0|0||37e2",
			"Pacific/Norfolk|+1130 +11 +12|-bu -b0 -c0|012121212|1PoCu 9Jcu 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|25e4",
			"Pacific/Tongatapu|+13 +14|-d0 -e0|010|1S4d0 s00|75e3"
		],
		"links": [
			"Africa/Abidjan|Africa/Accra",
			"Africa/Abidjan|Africa/Bamako",
			"Africa/Abidjan|Africa/Banjul",
			"Africa/Abidjan|Africa/Bissau",
			"Africa/Abidjan|Africa/Conakry",
			"Africa/Abidjan|Africa/Dakar",
			"Africa/Abidjan|Africa/Freetown",
			"Africa/Abidjan|Africa/Lome",
			"Africa/Abidjan|Africa/Monrovia",
			"Africa/Abidjan|Africa/Nouakchott",
			"Africa/Abidjan|Africa/Ouagadougou",
			"Africa/Abidjan|Africa/Timbuktu",
			"Africa/Abidjan|America/Danmarkshavn",
			"Africa/Abidjan|Atlantic/Reykjavik",
			"Africa/Abidjan|Atlantic/St_Helena",
			"Africa/Abidjan|Etc/GMT",
			"Africa/Abidjan|Etc/GMT+0",
			"Africa/Abidjan|Etc/GMT-0",
			"Africa/Abidjan|Etc/GMT0",
			"Africa/Abidjan|Etc/Greenwich",
			"Africa/Abidjan|GMT",
			"Africa/Abidjan|GMT+0",
			"Africa/Abidjan|GMT-0",
			"Africa/Abidjan|GMT0",
			"Africa/Abidjan|Greenwich",
			"Africa/Abidjan|Iceland",
			"Africa/Algiers|Africa/Tunis",
			"Africa/Cairo|Egypt",
			"Africa/Casablanca|Africa/El_Aaiun",
			"Africa/Johannesburg|Africa/Maseru",
			"Africa/Johannesburg|Africa/Mbabane",
			"Africa/Lagos|Africa/Bangui",
			"Africa/Lagos|Africa/Brazzaville",
			"Africa/Lagos|Africa/Douala",
			"Africa/Lagos|Africa/Kinshasa",
			"Africa/Lagos|Africa/Libreville",
			"Africa/Lagos|Africa/Luanda",
			"Africa/Lagos|Africa/Malabo",
			"Africa/Lagos|Africa/Ndjamena",
			"Africa/Lagos|Africa/Niamey",
			"Africa/Lagos|Africa/Porto-Novo",
			"Africa/Maputo|Africa/Blantyre",
			"Africa/Maputo|Africa/Bujumbura",
			"Africa/Maputo|Africa/Gaborone",
			"Africa/Maputo|Africa/Harare",
			"Africa/Maputo|Africa/Kigali",
			"Africa/Maputo|Africa/Lubumbashi",
			"Africa/Maputo|Africa/Lusaka",
			"Africa/Nairobi|Africa/Addis_Ababa",
			"Africa/Nairobi|Africa/Asmara",
			"Africa/Nairobi|Africa/Asmera",
			"Africa/Nairobi|Africa/Dar_es_Salaam",
			"Africa/Nairobi|Africa/Djibouti",
			"Africa/Nairobi|Africa/Kampala",
			"Africa/Nairobi|Africa/Mogadishu",
			"Africa/Nairobi|Indian/Antananarivo",
			"Africa/Nairobi|Indian/Comoro",
			"Africa/Nairobi|Indian/Mayotte",
			"Africa/Tripoli|Libya",
			"America/Adak|America/Atka",
			"America/Adak|US/Aleutian",
			"America/Anchorage|America/Juneau",
			"America/Anchorage|America/Nome",
			"America/Anchorage|America/Sitka",
			"America/Anchorage|America/Yakutat",
			"America/Anchorage|US/Alaska",
			"America/Campo_Grande|America/Cuiaba",
			"America/Chicago|America/Indiana/Knox",
			"America/Chicago|America/Indiana/Tell_City",
			"America/Chicago|America/Knox_IN",
			"America/Chicago|America/Matamoros",
			"America/Chicago|America/Menominee",
			"America/Chicago|America/North_Dakota/Beulah",
			"America/Chicago|America/North_Dakota/Center",
			"America/Chicago|America/North_Dakota/New_Salem",
			"America/Chicago|America/Rainy_River",
			"America/Chicago|America/Rankin_Inlet",
			"America/Chicago|America/Resolute",
			"America/Chicago|America/Winnipeg",
			"America/Chicago|CST6CDT",
			"America/Chicago|Canada/Central",
			"America/Chicago|US/Central",
			"America/Chicago|US/Indiana-Starke",
			"America/Chihuahua|America/Mazatlan",
			"America/Chihuahua|Mexico/BajaSur",
			"America/Denver|America/Boise",
			"America/Denver|America/Cambridge_Bay",
			"America/Denver|America/Edmonton",
			"America/Denver|America/Inuvik",
			"America/Denver|America/Ojinaga",
			"America/Denver|America/Shiprock",
			"America/Denver|America/Yellowknife",
			"America/Denver|Canada/Mountain",
			"America/Denver|MST7MDT",
			"America/Denver|Navajo",
			"America/Denver|US/Mountain",
			"America/Fortaleza|America/Argentina/Buenos_Aires",
			"America/Fortaleza|America/Argentina/Catamarca",
			"America/Fortaleza|America/Argentina/ComodRivadavia",
			"America/Fortaleza|America/Argentina/Cordoba",
			"America/Fortaleza|America/Argentina/Jujuy",
			"America/Fortaleza|America/Argentina/La_Rioja",
			"America/Fortaleza|America/Argentina/Mendoza",
			"America/Fortaleza|America/Argentina/Rio_Gallegos",
			"America/Fortaleza|America/Argentina/Salta",
			"America/Fortaleza|America/Argentina/San_Juan",
			"America/Fortaleza|America/Argentina/San_Luis",
			"America/Fortaleza|America/Argentina/Tucuman",
			"America/Fortaleza|America/Argentina/Ushuaia",
			"America/Fortaleza|America/Belem",
			"America/Fortaleza|America/Buenos_Aires",
			"America/Fortaleza|America/Catamarca",
			"America/Fortaleza|America/Cayenne",
			"America/Fortaleza|America/Cordoba",
			"America/Fortaleza|America/Jujuy",
			"America/Fortaleza|America/Maceio",
			"America/Fortaleza|America/Mendoza",
			"America/Fortaleza|America/Paramaribo",
			"America/Fortaleza|America/Recife",
			"America/Fortaleza|America/Rosario",
			"America/Fortaleza|America/Santarem",
			"America/Fortaleza|Antarctica/Rothera",
			"America/Fortaleza|Atlantic/Stanley",
			"America/Fortaleza|Etc/GMT+3",
			"America/Godthab|America/Nuuk",
			"America/Halifax|America/Glace_Bay",
			"America/Halifax|America/Goose_Bay",
			"America/Halifax|America/Moncton",
			"America/Halifax|America/Thule",
			"America/Halifax|Atlantic/Bermuda",
			"America/Halifax|Canada/Atlantic",
			"America/Havana|Cuba",
			"America/La_Paz|America/Boa_Vista",
			"America/La_Paz|America/Guyana",
			"America/La_Paz|America/Manaus",
			"America/La_Paz|America/Porto_Velho",
			"America/La_Paz|Brazil/West",
			"America/La_Paz|Etc/GMT+4",
			"America/Lima|America/Bogota",
			"America/Lima|America/Guayaquil",
			"America/Lima|Etc/GMT+5",
			"America/Los_Angeles|America/Ensenada",
			"America/Los_Angeles|America/Santa_Isabel",
			"America/Los_Angeles|America/Tijuana",
			"America/Los_Angeles|America/Vancouver",
			"America/Los_Angeles|Canada/Pacific",
			"America/Los_Angeles|Mexico/BajaNorte",
			"America/Los_Angeles|PST8PDT",
			"America/Los_Angeles|US/Pacific",
			"America/Managua|America/Belize",
			"America/Managua|America/Costa_Rica",
			"America/Managua|America/El_Salvador",
			"America/Managua|America/Guatemala",
			"America/Managua|America/Regina",
			"America/Managua|America/Swift_Current",
			"America/Managua|America/Tegucigalpa",
			"America/Managua|Canada/Saskatchewan",
			"America/Mexico_City|America/Bahia_Banderas",
			"America/Mexico_City|America/Merida",
			"America/Mexico_City|America/Monterrey",
			"America/Mexico_City|Mexico/General",
			"America/New_York|America/Detroit",
			"America/New_York|America/Fort_Wayne",
			"America/New_York|America/Indiana/Indianapolis",
			"America/New_York|America/Indiana/Marengo",
			"America/New_York|America/Indiana/Petersburg",
			"America/New_York|America/Indiana/Vevay",
			"America/New_York|America/Indiana/Vincennes",
			"America/New_York|America/Indiana/Winamac",
			"America/New_York|America/Indianapolis",
			"America/New_York|America/Iqaluit",
			"America/New_York|America/Kentucky/Louisville",
			"America/New_York|America/Kentucky/Monticello",
			"America/New_York|America/Louisville",
			"America/New_York|America/Montreal",
			"America/New_York|America/Nassau",
			"America/New_York|America/Nipigon",
			"America/New_York|America/Pangnirtung",
			"America/New_York|America/Thunder_Bay",
			"America/New_York|America/Toronto",
			"America/New_York|Canada/Eastern",
			"America/New_York|EST5EDT",
			"America/New_York|US/East-Indiana",
			"America/New_York|US/Eastern",
			"America/New_York|US/Michigan",
			"America/Noronha|Atlantic/South_Georgia",
			"America/Noronha|Brazil/DeNoronha",
			"America/Noronha|Etc/GMT+2",
			"America/Panama|America/Atikokan",
			"America/Panama|America/Cayman",
			"America/Panama|America/Coral_Harbour",
			"America/Panama|America/Jamaica",
			"America/Panama|EST",
			"America/Panama|Jamaica",
			"America/Phoenix|America/Creston",
			"America/Phoenix|America/Dawson_Creek",
			"America/Phoenix|America/Hermosillo",
			"America/Phoenix|MST",
			"America/Phoenix|US/Arizona",
			"America/Rio_Branco|America/Eirunepe",
			"America/Rio_Branco|America/Porto_Acre",
			"America/Rio_Branco|Brazil/Acre",
			"America/Santiago|Chile/Continental",
			"America/Santo_Domingo|America/Anguilla",
			"America/Santo_Domingo|America/Antigua",
			"America/Santo_Domingo|America/Aruba",
			"America/Santo_Domingo|America/Barbados",
			"America/Santo_Domingo|America/Blanc-Sablon",
			"America/Santo_Domingo|America/Curacao",
			"America/Santo_Domingo|America/Dominica",
			"America/Santo_Domingo|America/Grenada",
			"America/Santo_Domingo|America/Guadeloupe",
			"America/Santo_Domingo|America/Kralendijk",
			"America/Santo_Domingo|America/Lower_Princes",
			"America/Santo_Domingo|America/Marigot",
			"America/Santo_Domingo|America/Martinique",
			"America/Santo_Domingo|America/Montserrat",
			"America/Santo_Domingo|America/Port_of_Spain",
			"America/Santo_Domingo|America/Puerto_Rico",
			"America/Santo_Domingo|America/St_Barthelemy",
			"America/Santo_Domingo|America/St_Kitts",
			"America/Santo_Domingo|America/St_Lucia",
			"America/Santo_Domingo|America/St_Thomas",
			"America/Santo_Domingo|America/St_Vincent",
			"America/Santo_Domingo|America/Tortola",
			"America/Santo_Domingo|America/Virgin",
			"America/Sao_Paulo|Brazil/East",
			"America/St_Johns|Canada/Newfoundland",
			"America/Whitehorse|America/Dawson",
			"America/Whitehorse|Canada/Yukon",
			"Antarctica/Palmer|America/Punta_Arenas",
			"Asia/Baghdad|Antarctica/Syowa",
			"Asia/Baghdad|Asia/Aden",
			"Asia/Baghdad|Asia/Bahrain",
			"Asia/Baghdad|Asia/Kuwait",
			"Asia/Baghdad|Asia/Qatar",
			"Asia/Baghdad|Asia/Riyadh",
			"Asia/Baghdad|Etc/GMT-3",
			"Asia/Baghdad|Europe/Minsk",
			"Asia/Bangkok|Asia/Ho_Chi_Minh",
			"Asia/Bangkok|Asia/Novokuznetsk",
			"Asia/Bangkok|Asia/Phnom_Penh",
			"Asia/Bangkok|Asia/Saigon",
			"Asia/Bangkok|Asia/Vientiane",
			"Asia/Bangkok|Etc/GMT-7",
			"Asia/Bangkok|Indian/Christmas",
			"Asia/Dhaka|Antarctica/Vostok",
			"Asia/Dhaka|Asia/Almaty",
			"Asia/Dhaka|Asia/Bishkek",
			"Asia/Dhaka|Asia/Dacca",
			"Asia/Dhaka|Asia/Kashgar",
			"Asia/Dhaka|Asia/Qostanay",
			"Asia/Dhaka|Asia/Thimbu",
			"Asia/Dhaka|Asia/Thimphu",
			"Asia/Dhaka|Asia/Urumqi",
			"Asia/Dhaka|Etc/GMT-6",
			"Asia/Dhaka|Indian/Chagos",
			"Asia/Dili|Etc/GMT-9",
			"Asia/Dili|Pacific/Palau",
			"Asia/Dubai|Asia/Muscat",
			"Asia/Dubai|Asia/Tbilisi",
			"Asia/Dubai|Asia/Yerevan",
			"Asia/Dubai|Etc/GMT-4",
			"Asia/Dubai|Europe/Samara",
			"Asia/Dubai|Indian/Mahe",
			"Asia/Dubai|Indian/Mauritius",
			"Asia/Dubai|Indian/Reunion",
			"Asia/Gaza|Asia/Hebron",
			"Asia/Hong_Kong|Hongkong",
			"Asia/Jakarta|Asia/Pontianak",
			"Asia/Jerusalem|Asia/Tel_Aviv",
			"Asia/Jerusalem|Israel",
			"Asia/Kamchatka|Asia/Anadyr",
			"Asia/Kamchatka|Etc/GMT-12",
			"Asia/Kamchatka|Kwajalein",
			"Asia/Kamchatka|Pacific/Funafuti",
			"Asia/Kamchatka|Pacific/Kwajalein",
			"Asia/Kamchatka|Pacific/Majuro",
			"Asia/Kamchatka|Pacific/Nauru",
			"Asia/Kamchatka|Pacific/Tarawa",
			"Asia/Kamchatka|Pacific/Wake",
			"Asia/Kamchatka|Pacific/Wallis",
			"Asia/Kathmandu|Asia/Katmandu",
			"Asia/Kolkata|Asia/Calcutta",
			"Asia/Kuala_Lumpur|Asia/Brunei",
			"Asia/Kuala_Lumpur|Asia/Kuching",
			"Asia/Kuala_Lumpur|Asia/Singapore",
			"Asia/Kuala_Lumpur|Etc/GMT-8",
			"Asia/Kuala_Lumpur|Singapore",
			"Asia/Makassar|Asia/Ujung_Pandang",
			"Asia/Rangoon|Asia/Yangon",
			"Asia/Rangoon|Indian/Cocos",
			"Asia/Seoul|ROK",
			"Asia/Shanghai|Asia/Chongqing",
			"Asia/Shanghai|Asia/Chungking",
			"Asia/Shanghai|Asia/Harbin",
			"Asia/Shanghai|Asia/Macao",
			"Asia/Shanghai|Asia/Macau",
			"Asia/Shanghai|Asia/Taipei",
			"Asia/Shanghai|PRC",
			"Asia/Shanghai|ROC",
			"Asia/Tashkent|Antarctica/Mawson",
			"Asia/Tashkent|Asia/Aqtau",
			"Asia/Tashkent|Asia/Aqtobe",
			"Asia/Tashkent|Asia/Ashgabat",
			"Asia/Tashkent|Asia/Ashkhabad",
			"Asia/Tashkent|Asia/Atyrau",
			"Asia/Tashkent|Asia/Dushanbe",
			"Asia/Tashkent|Asia/Oral",
			"Asia/Tashkent|Asia/Samarkand",
			"Asia/Tashkent|Etc/GMT-5",
			"Asia/Tashkent|Indian/Kerguelen",
			"Asia/Tashkent|Indian/Maldives",
			"Asia/Tehran|Iran",
			"Asia/Tokyo|Japan",
			"Asia/Ulaanbaatar|Asia/Choibalsan",
			"Asia/Ulaanbaatar|Asia/Ulan_Bator",
			"Asia/Vladivostok|Asia/Ust-Nera",
			"Asia/Yakutsk|Asia/Khandyga",
			"Atlantic/Azores|America/Scoresbysund",
			"Atlantic/Cape_Verde|Etc/GMT+1",
			"Australia/Adelaide|Australia/Broken_Hill",
			"Australia/Adelaide|Australia/South",
			"Australia/Adelaide|Australia/Yancowinna",
			"Australia/Brisbane|Australia/Lindeman",
			"Australia/Brisbane|Australia/Queensland",
			"Australia/Darwin|Australia/North",
			"Australia/Lord_Howe|Australia/LHI",
			"Australia/Perth|Australia/West",
			"Australia/Sydney|Antarctica/Macquarie",
			"Australia/Sydney|Australia/ACT",
			"Australia/Sydney|Australia/Canberra",
			"Australia/Sydney|Australia/Currie",
			"Australia/Sydney|Australia/Hobart",
			"Australia/Sydney|Australia/Melbourne",
			"Australia/Sydney|Australia/NSW",
			"Australia/Sydney|Australia/Tasmania",
			"Australia/Sydney|Australia/Victoria",
			"Etc/UTC|Etc/UCT",
			"Etc/UTC|Etc/Universal",
			"Etc/UTC|Etc/Zulu",
			"Etc/UTC|UCT",
			"Etc/UTC|UTC",
			"Etc/UTC|Universal",
			"Etc/UTC|Zulu",
			"Europe/Athens|Asia/Nicosia",
			"Europe/Athens|EET",
			"Europe/Athens|Europe/Bucharest",
			"Europe/Athens|Europe/Helsinki",
			"Europe/Athens|Europe/Kiev",
			"Europe/Athens|Europe/Mariehamn",
			"Europe/Athens|Europe/Nicosia",
			"Europe/Athens|Europe/Riga",
			"Europe/Athens|Europe/Sofia",
			"Europe/Athens|Europe/Tallinn",
			"Europe/Athens|Europe/Uzhgorod",
			"Europe/Athens|Europe/Vilnius",
			"Europe/Athens|Europe/Zaporozhye",
			"Europe/Chisinau|Europe/Tiraspol",
			"Europe/Dublin|Eire",
			"Europe/Istanbul|Asia/Istanbul",
			"Europe/Istanbul|Turkey",
			"Europe/Lisbon|Atlantic/Canary",
			"Europe/Lisbon|Atlantic/Faeroe",
			"Europe/Lisbon|Atlantic/Faroe",
			"Europe/Lisbon|Atlantic/Madeira",
			"Europe/Lisbon|Portugal",
			"Europe/Lisbon|WET",
			"Europe/London|Europe/Belfast",
			"Europe/London|Europe/Guernsey",
			"Europe/London|Europe/Isle_of_Man",
			"Europe/London|Europe/Jersey",
			"Europe/London|GB",
			"Europe/London|GB-Eire",
			"Europe/Moscow|W-SU",
			"Europe/Paris|Africa/Ceuta",
			"Europe/Paris|Arctic/Longyearbyen",
			"Europe/Paris|Atlantic/Jan_Mayen",
			"Europe/Paris|CET",
			"Europe/Paris|Europe/Amsterdam",
			"Europe/Paris|Europe/Andorra",
			"Europe/Paris|Europe/Belgrade",
			"Europe/Paris|Europe/Berlin",
			"Europe/Paris|Europe/Bratislava",
			"Europe/Paris|Europe/Brussels",
			"Europe/Paris|Europe/Budapest",
			"Europe/Paris|Europe/Busingen",
			"Europe/Paris|Europe/Copenhagen",
			"Europe/Paris|Europe/Gibraltar",
			"Europe/Paris|Europe/Ljubljana",
			"Europe/Paris|Europe/Luxembourg",
			"Europe/Paris|Europe/Madrid",
			"Europe/Paris|Europe/Malta",
			"Europe/Paris|Europe/Monaco",
			"Europe/Paris|Europe/Oslo",
			"Europe/Paris|Europe/Podgorica",
			"Europe/Paris|Europe/Prague",
			"Europe/Paris|Europe/Rome",
			"Europe/Paris|Europe/San_Marino",
			"Europe/Paris|Europe/Sarajevo",
			"Europe/Paris|Europe/Skopje",
			"Europe/Paris|Europe/Stockholm",
			"Europe/Paris|Europe/Tirane",
			"Europe/Paris|Europe/Vaduz",
			"Europe/Paris|Europe/Vatican",
			"Europe/Paris|Europe/Vienna",
			"Europe/Paris|Europe/Warsaw",
			"Europe/Paris|Europe/Zagreb",
			"Europe/Paris|Europe/Zurich",
			"Europe/Paris|Poland",
			"Europe/Ulyanovsk|Europe/Astrakhan",
			"Pacific/Auckland|Antarctica/McMurdo",
			"Pacific/Auckland|Antarctica/South_Pole",
			"Pacific/Auckland|NZ",
			"Pacific/Chatham|NZ-CHAT",
			"Pacific/Easter|Chile/EasterIsland",
			"Pacific/Fakaofo|Etc/GMT-13",
			"Pacific/Fakaofo|Pacific/Enderbury",
			"Pacific/Fakaofo|Pacific/Kanton",
			"Pacific/Galapagos|Etc/GMT+6",
			"Pacific/Gambier|Etc/GMT+9",
			"Pacific/Guadalcanal|Etc/GMT-11",
			"Pacific/Guadalcanal|Pacific/Efate",
			"Pacific/Guadalcanal|Pacific/Kosrae",
			"Pacific/Guadalcanal|Pacific/Noumea",
			"Pacific/Guadalcanal|Pacific/Pohnpei",
			"Pacific/Guadalcanal|Pacific/Ponape",
			"Pacific/Guam|Pacific/Saipan",
			"Pacific/Honolulu|HST",
			"Pacific/Honolulu|Pacific/Johnston",
			"Pacific/Honolulu|US/Hawaii",
			"Pacific/Kiritimati|Etc/GMT-14",
			"Pacific/Niue|Etc/GMT+11",
			"Pacific/Pago_Pago|Pacific/Midway",
			"Pacific/Pago_Pago|Pacific/Samoa",
			"Pacific/Pago_Pago|US/Samoa",
			"Pacific/Pitcairn|Etc/GMT+8",
			"Pacific/Port_Moresby|Antarctica/DumontDUrville",
			"Pacific/Port_Moresby|Etc/GMT-10",
			"Pacific/Port_Moresby|Pacific/Chuuk",
			"Pacific/Port_Moresby|Pacific/Truk",
			"Pacific/Port_Moresby|Pacific/Yap",
			"Pacific/Tahiti|Etc/GMT+10",
			"Pacific/Tahiti|Pacific/Rarotonga"
		],
		"countries": [
			"AD|Europe/Andorra",
			"AE|Asia/Dubai",
			"AF|Asia/Kabul",
			"AG|America/Port_of_Spain America/Antigua",
			"AI|America/Port_of_Spain America/Anguilla",
			"AL|Europe/Tirane",
			"AM|Asia/Yerevan",
			"AO|Africa/Lagos Africa/Luanda",
			"AQ|Antarctica/Casey Antarctica/Davis Antarctica/DumontDUrville Antarctica/Mawson Antarctica/Palmer Antarctica/Rothera Antarctica/Syowa Antarctica/Troll Antarctica/Vostok Pacific/Auckland Antarctica/McMurdo",
			"AR|America/Argentina/Buenos_Aires America/Argentina/Cordoba America/Argentina/Salta America/Argentina/Jujuy America/Argentina/Tucuman America/Argentina/Catamarca America/Argentina/La_Rioja America/Argentina/San_Juan America/Argentina/Mendoza America/Argentina/San_Luis America/Argentina/Rio_Gallegos America/Argentina/Ushuaia",
			"AS|Pacific/Pago_Pago",
			"AT|Europe/Vienna",
			"AU|Australia/Lord_Howe Antarctica/Macquarie Australia/Hobart Australia/Melbourne Australia/Sydney Australia/Broken_Hill Australia/Brisbane Australia/Lindeman Australia/Adelaide Australia/Darwin Australia/Perth Australia/Eucla",
			"AW|America/Curacao America/Aruba",
			"AX|Europe/Helsinki Europe/Mariehamn",
			"AZ|Asia/Baku",
			"BA|Europe/Belgrade Europe/Sarajevo",
			"BB|America/Barbados",
			"BD|Asia/Dhaka",
			"BE|Europe/Brussels",
			"BF|Africa/Abidjan Africa/Ouagadougou",
			"BG|Europe/Sofia",
			"BH|Asia/Qatar Asia/Bahrain",
			"BI|Africa/Maputo Africa/Bujumbura",
			"BJ|Africa/Lagos Africa/Porto-Novo",
			"BL|America/Port_of_Spain America/St_Barthelemy",
			"BM|Atlantic/Bermuda",
			"BN|Asia/Brunei",
			"BO|America/La_Paz",
			"BQ|America/Curacao America/Kralendijk",
			"BR|America/Noronha America/Belem America/Fortaleza America/Recife America/Araguaina America/Maceio America/Bahia America/Sao_Paulo America/Campo_Grande America/Cuiaba America/Santarem America/Porto_Velho America/Boa_Vista America/Manaus America/Eirunepe America/Rio_Branco",
			"BS|America/Nassau",
			"BT|Asia/Thimphu",
			"BW|Africa/Maputo Africa/Gaborone",
			"BY|Europe/Minsk",
			"BZ|America/Belize",
			"CA|America/St_Johns America/Halifax America/Glace_Bay America/Moncton America/Goose_Bay America/Blanc-Sablon America/Toronto America/Nipigon America/Thunder_Bay America/Iqaluit America/Pangnirtung America/Atikokan America/Winnipeg America/Rainy_River America/Resolute America/Rankin_Inlet America/Regina America/Swift_Current America/Edmonton America/Cambridge_Bay America/Yellowknife America/Inuvik America/Creston America/Dawson_Creek America/Fort_Nelson America/Whitehorse America/Dawson America/Vancouver",
			"CC|Indian/Cocos",
			"CD|Africa/Maputo Africa/Lagos Africa/Kinshasa Africa/Lubumbashi",
			"CF|Africa/Lagos Africa/Bangui",
			"CG|Africa/Lagos Africa/Brazzaville",
			"CH|Europe/Zurich",
			"CI|Africa/Abidjan",
			"CK|Pacific/Rarotonga",
			"CL|America/Santiago America/Punta_Arenas Pacific/Easter",
			"CM|Africa/Lagos Africa/Douala",
			"CN|Asia/Shanghai Asia/Urumqi",
			"CO|America/Bogota",
			"CR|America/Costa_Rica",
			"CU|America/Havana",
			"CV|Atlantic/Cape_Verde",
			"CW|America/Curacao",
			"CX|Indian/Christmas",
			"CY|Asia/Nicosia Asia/Famagusta",
			"CZ|Europe/Prague",
			"DE|Europe/Zurich Europe/Berlin Europe/Busingen",
			"DJ|Africa/Nairobi Africa/Djibouti",
			"DK|Europe/Copenhagen",
			"DM|America/Port_of_Spain America/Dominica",
			"DO|America/Santo_Domingo",
			"DZ|Africa/Algiers",
			"EC|America/Guayaquil Pacific/Galapagos",
			"EE|Europe/Tallinn",
			"EG|Africa/Cairo",
			"EH|Africa/El_Aaiun",
			"ER|Africa/Nairobi Africa/Asmara",
			"ES|Europe/Madrid Africa/Ceuta Atlantic/Canary",
			"ET|Africa/Nairobi Africa/Addis_Ababa",
			"FI|Europe/Helsinki",
			"FJ|Pacific/Fiji",
			"FK|Atlantic/Stanley",
			"FM|Pacific/Chuuk Pacific/Pohnpei Pacific/Kosrae",
			"FO|Atlantic/Faroe",
			"FR|Europe/Paris",
			"GA|Africa/Lagos Africa/Libreville",
			"GB|Europe/London",
			"GD|America/Port_of_Spain America/Grenada",
			"GE|Asia/Tbilisi",
			"GF|America/Cayenne",
			"GG|Europe/London Europe/Guernsey",
			"GH|Africa/Accra",
			"GI|Europe/Gibraltar",
			"GL|America/Nuuk America/Danmarkshavn America/Scoresbysund America/Thule",
			"GM|Africa/Abidjan Africa/Banjul",
			"GN|Africa/Abidjan Africa/Conakry",
			"GP|America/Port_of_Spain America/Guadeloupe",
			"GQ|Africa/Lagos Africa/Malabo",
			"GR|Europe/Athens",
			"GS|Atlantic/South_Georgia",
			"GT|America/Guatemala",
			"GU|Pacific/Guam",
			"GW|Africa/Bissau",
			"GY|America/Guyana",
			"HK|Asia/Hong_Kong",
			"HN|America/Tegucigalpa",
			"HR|Europe/Belgrade Europe/Zagreb",
			"HT|America/Port-au-Prince",
			"HU|Europe/Budapest",
			"ID|Asia/Jakarta Asia/Pontianak Asia/Makassar Asia/Jayapura",
			"IE|Europe/Dublin",
			"IL|Asia/Jerusalem",
			"IM|Europe/London Europe/Isle_of_Man",
			"IN|Asia/Kolkata",
			"IO|Indian/Chagos",
			"IQ|Asia/Baghdad",
			"IR|Asia/Tehran",
			"IS|Atlantic/Reykjavik",
			"IT|Europe/Rome",
			"JE|Europe/London Europe/Jersey",
			"JM|America/Jamaica",
			"JO|Asia/Amman",
			"JP|Asia/Tokyo",
			"KE|Africa/Nairobi",
			"KG|Asia/Bishkek",
			"KH|Asia/Bangkok Asia/Phnom_Penh",
			"KI|Pacific/Tarawa Pacific/Enderbury Pacific/Kiritimati",
			"KM|Africa/Nairobi Indian/Comoro",
			"KN|America/Port_of_Spain America/St_Kitts",
			"KP|Asia/Pyongyang",
			"KR|Asia/Seoul",
			"KW|Asia/Riyadh Asia/Kuwait",
			"KY|America/Panama America/Cayman",
			"KZ|Asia/Almaty Asia/Qyzylorda Asia/Qostanay Asia/Aqtobe Asia/Aqtau Asia/Atyrau Asia/Oral",
			"LA|Asia/Bangkok Asia/Vientiane",
			"LB|Asia/Beirut",
			"LC|America/Port_of_Spain America/St_Lucia",
			"LI|Europe/Zurich Europe/Vaduz",
			"LK|Asia/Colombo",
			"LR|Africa/Monrovia",
			"LS|Africa/Johannesburg Africa/Maseru",
			"LT|Europe/Vilnius",
			"LU|Europe/Luxembourg",
			"LV|Europe/Riga",
			"LY|Africa/Tripoli",
			"MA|Africa/Casablanca",
			"MC|Europe/Monaco",
			"MD|Europe/Chisinau",
			"ME|Europe/Belgrade Europe/Podgorica",
			"MF|America/Port_of_Spain America/Marigot",
			"MG|Africa/Nairobi Indian/Antananarivo",
			"MH|Pacific/Majuro Pacific/Kwajalein",
			"MK|Europe/Belgrade Europe/Skopje",
			"ML|Africa/Abidjan Africa/Bamako",
			"MM|Asia/Yangon",
			"MN|Asia/Ulaanbaatar Asia/Hovd Asia/Choibalsan",
			"MO|Asia/Macau",
			"MP|Pacific/Guam Pacific/Saipan",
			"MQ|America/Martinique",
			"MR|Africa/Abidjan Africa/Nouakchott",
			"MS|America/Port_of_Spain America/Montserrat",
			"MT|Europe/Malta",
			"MU|Indian/Mauritius",
			"MV|Indian/Maldives",
			"MW|Africa/Maputo Africa/Blantyre",
			"MX|America/Mexico_City America/Cancun America/Merida America/Monterrey America/Matamoros America/Mazatlan America/Chihuahua America/Ojinaga America/Hermosillo America/Tijuana America/Bahia_Banderas",
			"MY|Asia/Kuala_Lumpur Asia/Kuching",
			"MZ|Africa/Maputo",
			"NA|Africa/Windhoek",
			"NC|Pacific/Noumea",
			"NE|Africa/Lagos Africa/Niamey",
			"NF|Pacific/Norfolk",
			"NG|Africa/Lagos",
			"NI|America/Managua",
			"NL|Europe/Amsterdam",
			"NO|Europe/Oslo",
			"NP|Asia/Kathmandu",
			"NR|Pacific/Nauru",
			"NU|Pacific/Niue",
			"NZ|Pacific/Auckland Pacific/Chatham",
			"OM|Asia/Dubai Asia/Muscat",
			"PA|America/Panama",
			"PE|America/Lima",
			"PF|Pacific/Tahiti Pacific/Marquesas Pacific/Gambier",
			"PG|Pacific/Port_Moresby Pacific/Bougainville",
			"PH|Asia/Manila",
			"PK|Asia/Karachi",
			"PL|Europe/Warsaw",
			"PM|America/Miquelon",
			"PN|Pacific/Pitcairn",
			"PR|America/Puerto_Rico",
			"PS|Asia/Gaza Asia/Hebron",
			"PT|Europe/Lisbon Atlantic/Madeira Atlantic/Azores",
			"PW|Pacific/Palau",
			"PY|America/Asuncion",
			"QA|Asia/Qatar",
			"RE|Indian/Reunion",
			"RO|Europe/Bucharest",
			"RS|Europe/Belgrade",
			"RU|Europe/Kaliningrad Europe/Moscow Europe/Simferopol Europe/Kirov Europe/Volgograd Europe/Astrakhan Europe/Saratov Europe/Ulyanovsk Europe/Samara Asia/Yekaterinburg Asia/Omsk Asia/Novosibirsk Asia/Barnaul Asia/Tomsk Asia/Novokuznetsk Asia/Krasnoyarsk Asia/Irkutsk Asia/Chita Asia/Yakutsk Asia/Khandyga Asia/Vladivostok Asia/Ust-Nera Asia/Magadan Asia/Sakhalin Asia/Srednekolymsk Asia/Kamchatka Asia/Anadyr",
			"RW|Africa/Maputo Africa/Kigali",
			"SA|Asia/Riyadh",
			"SB|Pacific/Guadalcanal",
			"SC|Indian/Mahe",
			"SD|Africa/Khartoum",
			"SE|Europe/Stockholm",
			"SG|Asia/Singapore",
			"SH|Africa/Abidjan Atlantic/St_Helena",
			"SI|Europe/Belgrade Europe/Ljubljana",
			"SJ|Europe/Oslo Arctic/Longyearbyen",
			"SK|Europe/Prague Europe/Bratislava",
			"SL|Africa/Abidjan Africa/Freetown",
			"SM|Europe/Rome Europe/San_Marino",
			"SN|Africa/Abidjan Africa/Dakar",
			"SO|Africa/Nairobi Africa/Mogadishu",
			"SR|America/Paramaribo",
			"SS|Africa/Juba",
			"ST|Africa/Sao_Tome",
			"SV|America/El_Salvador",
			"SX|America/Curacao America/Lower_Princes",
			"SY|Asia/Damascus",
			"SZ|Africa/Johannesburg Africa/Mbabane",
			"TC|America/Grand_Turk",
			"TD|Africa/Ndjamena",
			"TF|Indian/Reunion Indian/Kerguelen",
			"TG|Africa/Abidjan Africa/Lome",
			"TH|Asia/Bangkok",
			"TJ|Asia/Dushanbe",
			"TK|Pacific/Fakaofo",
			"TL|Asia/Dili",
			"TM|Asia/Ashgabat",
			"TN|Africa/Tunis",
			"TO|Pacific/Tongatapu",
			"TR|Europe/Istanbul",
			"TT|America/Port_of_Spain",
			"TV|Pacific/Funafuti",
			"TW|Asia/Taipei",
			"TZ|Africa/Nairobi Africa/Dar_es_Salaam",
			"UA|Europe/Simferopol Europe/Kiev Europe/Uzhgorod Europe/Zaporozhye",
			"UG|Africa/Nairobi Africa/Kampala",
			"UM|Pacific/Pago_Pago Pacific/Wake Pacific/Honolulu Pacific/Midway",
			"US|America/New_York America/Detroit America/Kentucky/Louisville America/Kentucky/Monticello America/Indiana/Indianapolis America/Indiana/Vincennes America/Indiana/Winamac America/Indiana/Marengo America/Indiana/Petersburg America/Indiana/Vevay America/Chicago America/Indiana/Tell_City America/Indiana/Knox America/Menominee America/North_Dakota/Center America/North_Dakota/New_Salem America/North_Dakota/Beulah America/Denver America/Boise America/Phoenix America/Los_Angeles America/Anchorage America/Juneau America/Sitka America/Metlakatla America/Yakutat America/Nome America/Adak Pacific/Honolulu",
			"UY|America/Montevideo",
			"UZ|Asia/Samarkand Asia/Tashkent",
			"VA|Europe/Rome Europe/Vatican",
			"VC|America/Port_of_Spain America/St_Vincent",
			"VE|America/Caracas",
			"VG|America/Port_of_Spain America/Tortola",
			"VI|America/Port_of_Spain America/St_Thomas",
			"VN|Asia/Bangkok Asia/Ho_Chi_Minh",
			"VU|Pacific/Efate",
			"WF|Pacific/Wallis",
			"WS|Pacific/Apia",
			"YE|Asia/Riyadh Asia/Aden",
			"YT|Africa/Nairobi Indian/Mayotte",
			"ZA|Africa/Johannesburg",
			"ZM|Africa/Maputo Africa/Lusaka",
			"ZW|Africa/Maputo Africa/Harare"
		]
	});


	return moment;
}));
!function(a,i){"use strict";"object"==typeof module&&module.exports?module.exports=i(require("moment")):"function"==typeof define&&define.amd?define(["moment"],i):i(a.moment)}(this,function(c){"use strict";void 0===c.version&&c.default&&(c=c.default);var i,A={},n={},t={},s={},u={};c&&"string"==typeof c.version||N("Moment Timezone requires Moment.js. See https://momentjs.com/timezone/docs/#/use-it/browser/");var a=c.version.split("."),e=+a[0],r=+a[1];function m(a){return 96<a?a-87:64<a?a-29:a-48}function o(a){var i=0,e=a.split("."),r=e[0],o=e[1]||"",c=1,A=0,n=1;for(45===a.charCodeAt(0)&&(n=-(i=1));i<r.length;i++)A=60*A+m(r.charCodeAt(i));for(i=0;i<o.length;i++)c/=60,A+=m(o.charCodeAt(i))*c;return A*n}function f(a){for(var i=0;i<a.length;i++)a[i]=o(a[i])}function l(a,i){var e,r=[];for(e=0;e<i.length;e++)r[e]=a[i[e]];return r}function p(a){var i=a.split("|"),e=i[2].split(" "),r=i[3].split(""),o=i[4].split(" ");return f(e),f(r),f(o),function(a,i){for(var e=0;e<i;e++)a[e]=Math.round((a[e-1]||0)+6e4*a[e]);a[i-1]=1/0}(o,r.length),{name:i[0],abbrs:l(i[1].split(" "),r),offsets:l(e,r),untils:o,population:0|i[5]}}function M(a){a&&this._set(p(a))}function d(a,i){this.name=a,this.zones=i}function b(a){var i=a.toTimeString(),e=i.match(/\([a-z ]+\)/i);"GMT"===(e=e&&e[0]?(e=e[0].match(/[A-Z]/g))?e.join(""):void 0:(e=i.match(/[A-Z]{3,5}/g))?e[0]:void 0)&&(e=void 0),this.at=+a,this.abbr=e,this.offset=a.getTimezoneOffset()}function h(a){this.zone=a,this.offsetScore=0,this.abbrScore=0}function E(a,i){for(var e,r;r=6e4*((i.at-a.at)/12e4|0);)(e=new b(new Date(a.at+r))).offset===a.offset?a=e:i=e;return a}function g(a,i){return a.offsetScore!==i.offsetScore?a.offsetScore-i.offsetScore:a.abbrScore!==i.abbrScore?a.abbrScore-i.abbrScore:a.zone.population!==i.zone.population?i.zone.population-a.zone.population:i.zone.name.localeCompare(a.zone.name)}function z(a,i){var e,r;for(f(i),e=0;e<i.length;e++)r=i[e],u[r]=u[r]||{},u[r][a]=!0}function P(){try{var a=Intl.DateTimeFormat().resolvedOptions().timeZone;if(a&&3<a.length){var i=s[T(a)];if(i)return i;N("Moment Timezone found "+a+" from the Intl api, but did not have that data loaded.")}}catch(a){}var e,r,o,c=function(){var a,i,e,r=(new Date).getFullYear()-2,o=new b(new Date(r,0,1)),c=[o];for(e=1;e<48;e++)(i=new b(new Date(r,e,1))).offset!==o.offset&&(a=E(o,i),c.push(a),c.push(new b(new Date(a.at+6e4)))),o=i;for(e=0;e<4;e++)c.push(new b(new Date(r+e,0,1))),c.push(new b(new Date(r+e,6,1)));return c}(),A=c.length,n=function(a){var i,e,r,o=a.length,c={},A=[];for(i=0;i<o;i++)for(e in r=u[a[i].offset]||{})r.hasOwnProperty(e)&&(c[e]=!0);for(i in c)c.hasOwnProperty(i)&&A.push(s[i]);return A}(c),t=[];for(r=0;r<n.length;r++){for(e=new h(_(n[r]),A),o=0;o<A;o++)e.scoreOffsetAt(c[o]);t.push(e)}return t.sort(g),0<t.length?t[0].zone.name:void 0}function T(a){return(a||"").toLowerCase().replace(/\//g,"_")}function S(a){var i,e,r,o;for("string"==typeof a&&(a=[a]),i=0;i<a.length;i++)o=T(e=(r=a[i].split("|"))[0]),A[o]=a[i],s[o]=e,z(o,r[2].split(" "))}function _(a,i){a=T(a);var e,r=A[a];return r instanceof M?r:"string"==typeof r?(r=new M(r),A[a]=r):n[a]&&i!==_&&(e=_(n[a],_))?((r=A[a]=new M)._set(e),r.name=s[a],r):null}function k(a){var i,e,r,o;for("string"==typeof a&&(a=[a]),i=0;i<a.length;i++)r=T((e=a[i].split("|"))[0]),o=T(e[1]),n[r]=o,s[r]=e[0],n[o]=r,s[o]=e[1]}function C(a){S(a.zones),k(a.links),function(a){var i,e,r,o;if(a&&a.length)for(i=0;i<a.length;i++)e=(o=a[i].split("|"))[0].toUpperCase(),r=o[1].split(" "),t[e]=new d(e,r)}(a.countries),G.dataVersion=a.version}function B(a){var i="X"===a._f||"x"===a._f;return!(!a._a||void 0!==a._tzm||i)}function N(a){"undefined"!=typeof console&&"function"==typeof console.error&&console.error(a)}function G(a){var i=Array.prototype.slice.call(arguments,0,-1),e=arguments[arguments.length-1],r=_(e),o=c.utc.apply(null,i);return r&&!c.isMoment(a)&&B(o)&&o.add(r.parse(o),"minutes"),o.tz(e),o}(e<2||2==e&&r<6)&&N("Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js "+c.version+". See momentjs.com"),M.prototype={_set:function(a){this.name=a.name,this.abbrs=a.abbrs,this.untils=a.untils,this.offsets=a.offsets,this.population=a.population},_index:function(a){var i,e=+a,r=this.untils;for(i=0;i<r.length;i++)if(e<r[i])return i},countries:function(){var i=this.name;return Object.keys(t).filter(function(a){return-1!==t[a].zones.indexOf(i)})},parse:function(a){var i,e,r,o,c=+a,A=this.offsets,n=this.untils,t=n.length-1;for(o=0;o<t;o++)if(i=A[o],e=A[o+1],r=A[o?o-1:o],i<e&&G.moveAmbiguousForward?i=e:r<i&&G.moveInvalidForward&&(i=r),c<n[o]-6e4*i)return A[o];return A[t]},abbr:function(a){return this.abbrs[this._index(a)]},offset:function(a){return N("zone.offset has been deprecated in favor of zone.utcOffset"),this.offsets[this._index(a)]},utcOffset:function(a){return this.offsets[this._index(a)]}},h.prototype.scoreOffsetAt=function(a){this.offsetScore+=Math.abs(this.zone.utcOffset(a.at)-a.offset),this.zone.abbr(a.at).replace(/[^A-Z]/g,"")!==a.abbr&&this.abbrScore++},G.version="0.5.34",G.dataVersion="",G._zones=A,G._links=n,G._names=s,G._countries=t,G.add=S,G.link=k,G.load=C,G.zone=_,G.zoneExists=function a(i){return a.didShowError||(a.didShowError=!0,N("moment.tz.zoneExists('"+i+"') has been deprecated in favor of !moment.tz.zone('"+i+"')")),!!_(i)},G.guess=function(a){return i&&!a||(i=P()),i},G.names=function(){var a,i=[];for(a in s)s.hasOwnProperty(a)&&(A[a]||A[n[a]])&&s[a]&&i.push(s[a]);return i.sort()},G.Zone=M,G.unpack=p,G.unpackBase60=o,G.needsOffset=B,G.moveInvalidForward=!0,G.moveAmbiguousForward=!1,G.countries=function(){return Object.keys(t)},G.zonesForCountry=function(a,i){if(!(a=function(a){return a=a.toUpperCase(),t[a]||null}(a)))return null;var e=a.zones.sort();return i?e.map(function(a){return{name:a,offset:_(a).utcOffset(new Date)}}):e};var y,L=c.fn;function O(a){return function(){return this._z?this._z.abbr(this):a.call(this)}}function D(a){return function(){return this._z=null,a.apply(this,arguments)}}c.tz=G,c.defaultZone=null,c.updateOffset=function(a,i){var e,r=c.defaultZone;if(void 0===a._z&&(r&&B(a)&&!a._isUTC&&(a._d=c.utc(a._a)._d,a.utc().add(r.parse(a),"minutes")),a._z=r),a._z)if(e=a._z.utcOffset(a),Math.abs(e)<16&&(e/=60),void 0!==a.utcOffset){var o=a._z;a.utcOffset(-e,i),a._z=o}else a.zone(e,i)},L.tz=function(a,i){if(a){if("string"!=typeof a)throw new Error("Time zone name must be a string, got "+a+" ["+typeof a+"]");return this._z=_(a),this._z?c.updateOffset(this,i):N("Moment Timezone has no data for "+a+". See http://momentjs.com/timezone/docs/#/data-loading/."),this}if(this._z)return this._z.name},L.zoneName=O(L.zoneName),L.zoneAbbr=O(L.zoneAbbr),L.utc=D(L.utc),L.local=D(L.local),L.utcOffset=(y=L.utcOffset,function(){return 0<arguments.length&&(this._z=null),y.apply(this,arguments)}),c.tz.setDefault=function(a){return(e<2||2==e&&r<9)&&N("Moment Timezone setDefault() requires Moment.js >= 2.9.0. You are using Moment.js "+c.version+"."),c.defaultZone=a?_(a):null,c};var v=c.momentProperties;return"[object Array]"===Object.prototype.toString.call(v)?(v.push("_z"),v.push("_a")):v&&(v._z=null),C({version:"2021e",zones:["Africa/Abidjan|GMT|0|0||48e5","Africa/Nairobi|EAT|-30|0||47e5","Africa/Algiers|CET|-10|0||26e5","Africa/Lagos|WAT|-10|0||17e6","Africa/Maputo|CAT|-20|0||26e5","Africa/Cairo|EET EEST|-20 -30|01010|1M2m0 gL0 e10 mn0|15e6","Africa/Casablanca|+00 +01|0 -10|010101010101010101010101010101010101|1H3C0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0|32e5","Europe/Paris|CET CEST|-10 -20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|11e6","Africa/Johannesburg|SAST|-20|0||84e5","Africa/Juba|EAT CAT|-30 -20|01|24nx0|","Africa/Khartoum|EAT CAT|-30 -20|01|1Usl0|51e5","Africa/Sao_Tome|GMT WAT|0 -10|010|1UQN0 2q00|","Africa/Tripoli|EET CET CEST|-20 -10 -20|0120|1IlA0 TA0 1o00|11e5","Africa/Windhoek|CAT WAT|-20 -10|0101010101010|1GQo0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0|32e4","America/Adak|HST HDT|a0 90|01010101010101010101010|1GIc0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|326","America/Anchorage|AKST AKDT|90 80|01010101010101010101010|1GIb0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|30e4","America/Santo_Domingo|AST|40|0||29e5","America/Araguaina|-03 -02|30 20|010|1IdD0 Lz0|14e4","America/Fortaleza|-03|30|0||34e5","America/Asuncion|-03 -04|30 40|01010101010101010101010|1GTf0 1cN0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0|28e5","America/Panama|EST|50|0||15e5","America/Mexico_City|CST CDT|60 50|01010101010101010101010|1GQw0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0|20e6","America/Bahia|-02 -03|20 30|01|1GCq0|27e5","America/Managua|CST|60|0||22e5","America/La_Paz|-04|40|0||19e5","America/Lima|-05|50|0||11e6","America/Denver|MST MDT|70 60|01010101010101010101010|1GI90 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|26e5","America/Campo_Grande|-03 -04|30 40|0101010101010101|1GCr0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|77e4","America/Cancun|CST CDT EST|60 50 50|01010102|1GQw0 1nX0 14p0 1lb0 14p0 1lb0 Dd0|63e4","America/Caracas|-0430 -04|4u 40|01|1QMT0|29e5","America/Chicago|CST CDT|60 50|01010101010101010101010|1GI80 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|92e5","America/Chihuahua|MST MDT|70 60|01010101010101010101010|1GQx0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0|81e4","America/Phoenix|MST|70|0||42e5","America/Whitehorse|PST PDT MST|80 70 70|0101010101010101012|1GIa0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1z90|23e3","America/New_York|EST EDT|50 40|01010101010101010101010|1GI70 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|21e6","America/Rio_Branco|-04 -05|40 50|01|1KLE0|31e4","America/Los_Angeles|PST PDT|80 70|01010101010101010101010|1GIa0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|15e6","America/Fort_Nelson|PST PDT MST|80 70 70|01010102|1GIa0 1zb0 Op0 1zb0 Op0 1zb0 Op0|39e2","America/Halifax|AST ADT|40 30|01010101010101010101010|1GI60 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|39e4","America/Godthab|-03 -02|30 20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|17e3","America/Grand_Turk|EST EDT AST|50 40 40|010101021010101010|1GI70 1zb0 Op0 1zb0 Op0 1zb0 Op0 7jA0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|37e2","America/Havana|CST CDT|50 40|01010101010101010101010|1GQt0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0|21e5","America/Metlakatla|PST AKST AKDT|80 90 80|01212120121212121|1PAa0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 uM0 jB0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|14e2","America/Miquelon|-03 -02|30 20|01010101010101010101010|1GI50 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|61e2","America/Montevideo|-02 -03|20 30|01010101|1GI40 1o10 11z0 1o10 11z0 1o10 11z0|17e5","America/Noronha|-02|20|0||30e2","America/Port-au-Prince|EST EDT|50 40|010101010101010101010|1GI70 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 3iN0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|23e5","Antarctica/Palmer|-03 -04|30 40|010101010|1H3D0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|40","America/Santiago|-03 -04|30 40|010101010101010101010|1H3D0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0|62e5","America/Sao_Paulo|-02 -03|20 30|0101010101010101|1GCq0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|20e6","Atlantic/Azores|-01 +00|10 0|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|25e4","America/St_Johns|NST NDT|3u 2u|01010101010101010101010|1GI5u 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|11e4","Antarctica/Casey|+11 +08|-b0 -80|010101010|1GAF0 blz0 3m10 1o30 14k0 1kr0 12l0 1o01|10","Antarctica/Davis|+05 +07|-50 -70|01|1GAI0|70","Pacific/Port_Moresby|+10|-a0|0||25e4","Australia/Sydney|AEDT AEST|-b0 -a0|01010101010101010101010|1GQg0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|40e5","Asia/Tashkent|+05|-50|0||23e5","Pacific/Auckland|NZDT NZST|-d0 -c0|01010101010101010101010|1GQe0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00|14e5","Asia/Baghdad|+03|-30|0||66e5","Antarctica/Troll|+00 +02|0 -20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|40","Asia/Dhaka|+06|-60|0||16e6","Asia/Amman|EET EEST|-20 -30|010101010101010101010|1GPy0 4bX0 Dd0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 LA0 1C00|25e5","Asia/Kamchatka|+12|-c0|0||18e4","Asia/Baku|+04 +05|-40 -50|010101010|1GNA0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|27e5","Asia/Bangkok|+07|-70|0||15e6","Asia/Barnaul|+07 +06|-70 -60|010|1N7v0 3rd0|","Asia/Beirut|EET EEST|-20 -30|01010101010101010101010|1GNy0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0|22e5","Asia/Kuala_Lumpur|+08|-80|0||71e5","Asia/Kolkata|IST|-5u|0||15e6","Asia/Chita|+10 +08 +09|-a0 -80 -90|012|1N7s0 3re0|33e4","Asia/Ulaanbaatar|+08 +09|-80 -90|01010|1O8G0 1cJ0 1cP0 1cJ0|12e5","Asia/Shanghai|CST|-80|0||23e6","Asia/Colombo|+0530|-5u|0||22e5","Asia/Damascus|EET EEST|-20 -30|01010101010101010101010|1GPy0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0|26e5","Asia/Dili|+09|-90|0||19e4","Asia/Dubai|+04|-40|0||39e5","Asia/Famagusta|EET EEST +03|-20 -30 -30|0101010101201010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 15U0 2Ks0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|","Asia/Gaza|EET EEST|-20 -30|01010101010101010101010|1GPy0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nA0 1210 1qL0 WN0 1qL0 WN0 1qL0 11c0 1on0 11B0 1o00 11A0 1qo0 Xc0 1qo0|18e5","Asia/Hong_Kong|HKT|-80|0||73e5","Asia/Hovd|+07 +08|-70 -80|01010|1O8H0 1cJ0 1cP0 1cJ0|81e3","Asia/Irkutsk|+09 +08|-90 -80|01|1N7t0|60e4","Europe/Istanbul|EET EEST +03|-20 -30 -30|01010101012|1GNB0 1qM0 11A0 1o00 1200 1nA0 11A0 1tA0 U00 15w0|13e6","Asia/Jakarta|WIB|-70|0||31e6","Asia/Jayapura|WIT|-90|0||26e4","Asia/Jerusalem|IST IDT|-20 -30|01010101010101010101010|1GPA0 1aL0 1eN0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0|81e4","Asia/Kabul|+0430|-4u|0||46e5","Asia/Karachi|PKT|-50|0||24e6","Asia/Kathmandu|+0545|-5J|0||12e5","Asia/Yakutsk|+10 +09|-a0 -90|01|1N7s0|28e4","Asia/Krasnoyarsk|+08 +07|-80 -70|01|1N7u0|10e5","Asia/Magadan|+12 +10 +11|-c0 -a0 -b0|012|1N7q0 3Cq0|95e3","Asia/Makassar|WITA|-80|0||15e5","Asia/Manila|PST|-80|0||24e6","Europe/Athens|EET EEST|-20 -30|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|35e5","Asia/Novosibirsk|+07 +06|-70 -60|010|1N7v0 4eN0|15e5","Asia/Omsk|+07 +06|-70 -60|01|1N7v0|12e5","Asia/Pyongyang|KST KST|-90 -8u|010|1P4D0 6BA0|29e5","Asia/Qyzylorda|+06 +05|-60 -50|01|1Xei0|73e4","Asia/Rangoon|+0630|-6u|0||48e5","Asia/Sakhalin|+11 +10|-b0 -a0|010|1N7r0 3rd0|58e4","Asia/Seoul|KST|-90|0||23e6","Asia/Srednekolymsk|+12 +11|-c0 -b0|01|1N7q0|35e2","Asia/Tehran|+0330 +0430|-3u -4u|01010101010101010101010|1GLUu 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0|14e6","Asia/Tokyo|JST|-90|0||38e6","Asia/Tomsk|+07 +06|-70 -60|010|1N7v0 3Qp0|10e5","Asia/Vladivostok|+11 +10|-b0 -a0|01|1N7r0|60e4","Asia/Yekaterinburg|+06 +05|-60 -50|01|1N7w0|14e5","Europe/Lisbon|WET WEST|0 -10|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|27e5","Atlantic/Cape_Verde|-01|10|0||50e4","Australia/Adelaide|ACDT ACST|-au -9u|01010101010101010101010|1GQgu 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|11e5","Australia/Brisbane|AEST|-a0|0||20e5","Australia/Darwin|ACST|-9u|0||12e4","Australia/Eucla|+0845|-8J|0||368","Australia/Lord_Howe|+11 +1030|-b0 -au|01010101010101010101010|1GQf0 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu|347","Australia/Perth|AWST|-80|0||18e5","Pacific/Easter|-05 -06|50 60|010101010101010101010|1H3D0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0|30e2","Europe/Dublin|GMT IST|0 -10|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|12e5","Etc/GMT-1|+01|-10|0||","Pacific/Guadalcanal|+11|-b0|0||11e4","Pacific/Fakaofo|+13|-d0|0||483","Pacific/Kiritimati|+14|-e0|0||51e2","Etc/GMT-2|+02|-20|0||","Pacific/Tahiti|-10|a0|0||18e4","Pacific/Niue|-11|b0|0||12e2","Etc/GMT+12|-12|c0|0||","Pacific/Galapagos|-06|60|0||25e3","Etc/GMT+7|-07|70|0||","Pacific/Pitcairn|-08|80|0||56","Pacific/Gambier|-09|90|0||125","Etc/UTC|UTC|0|0||","Europe/Ulyanovsk|+04 +03|-40 -30|010|1N7y0 3rd0|13e5","Europe/London|GMT BST|0 -10|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|10e6","Europe/Chisinau|EET EEST|-20 -30|01010101010101010101010|1GNA0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|67e4","Europe/Kaliningrad|+03 EET|-30 -20|01|1N7z0|44e4","Europe/Kirov|+04 +03|-40 -30|01|1N7y0|48e4","Europe/Moscow|MSK MSK|-40 -30|01|1N7y0|16e6","Europe/Saratov|+04 +03|-40 -30|010|1N7y0 5810|","Europe/Simferopol|EET EEST MSK MSK|-20 -30 -40 -30|0101023|1GNB0 1qM0 11A0 1o00 11z0 1nW0|33e4","Europe/Volgograd|+04 +03|-40 -30|0101|1N7y0 9Jd0 5gn0|10e5","Pacific/Honolulu|HST|a0|0||37e4","MET|MET MEST|-10 -20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|","Pacific/Chatham|+1345 +1245|-dJ -cJ|01010101010101010101010|1GQe0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00|600","Pacific/Apia|+14 +13|-e0 -d0|01010101010101010101|1GQe0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0|37e3","Pacific/Bougainville|+10 +11|-a0 -b0|01|1NwE0|18e4","Pacific/Fiji|+13 +12|-d0 -c0|010101010101010101010|1Goe0 1Nc0 Ao0 1Q00 xz0 1SN0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 20o0 pc0 2hc0 bc0 4q00|88e4","Pacific/Guam|ChST|-a0|0||17e4","Pacific/Marquesas|-0930|9u|0||86e2","Pacific/Pago_Pago|SST|b0|0||37e2","Pacific/Norfolk|+1130 +11 +12|-bu -b0 -c0|012121212|1PoCu 9Jcu 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|25e4","Pacific/Tongatapu|+13 +14|-d0 -e0|010|1S4d0 s00|75e3"],links:["Africa/Abidjan|Africa/Accra","Africa/Abidjan|Africa/Bamako","Africa/Abidjan|Africa/Banjul","Africa/Abidjan|Africa/Bissau","Africa/Abidjan|Africa/Conakry","Africa/Abidjan|Africa/Dakar","Africa/Abidjan|Africa/Freetown","Africa/Abidjan|Africa/Lome","Africa/Abidjan|Africa/Monrovia","Africa/Abidjan|Africa/Nouakchott","Africa/Abidjan|Africa/Ouagadougou","Africa/Abidjan|Africa/Timbuktu","Africa/Abidjan|America/Danmarkshavn","Africa/Abidjan|Atlantic/Reykjavik","Africa/Abidjan|Atlantic/St_Helena","Africa/Abidjan|Etc/GMT","Africa/Abidjan|Etc/GMT+0","Africa/Abidjan|Etc/GMT-0","Africa/Abidjan|Etc/GMT0","Africa/Abidjan|Etc/Greenwich","Africa/Abidjan|GMT","Africa/Abidjan|GMT+0","Africa/Abidjan|GMT-0","Africa/Abidjan|GMT0","Africa/Abidjan|Greenwich","Africa/Abidjan|Iceland","Africa/Algiers|Africa/Tunis","Africa/Cairo|Egypt","Africa/Casablanca|Africa/El_Aaiun","Africa/Johannesburg|Africa/Maseru","Africa/Johannesburg|Africa/Mbabane","Africa/Lagos|Africa/Bangui","Africa/Lagos|Africa/Brazzaville","Africa/Lagos|Africa/Douala","Africa/Lagos|Africa/Kinshasa","Africa/Lagos|Africa/Libreville","Africa/Lagos|Africa/Luanda","Africa/Lagos|Africa/Malabo","Africa/Lagos|Africa/Ndjamena","Africa/Lagos|Africa/Niamey","Africa/Lagos|Africa/Porto-Novo","Africa/Maputo|Africa/Blantyre","Africa/Maputo|Africa/Bujumbura","Africa/Maputo|Africa/Gaborone","Africa/Maputo|Africa/Harare","Africa/Maputo|Africa/Kigali","Africa/Maputo|Africa/Lubumbashi","Africa/Maputo|Africa/Lusaka","Africa/Nairobi|Africa/Addis_Ababa","Africa/Nairobi|Africa/Asmara","Africa/Nairobi|Africa/Asmera","Africa/Nairobi|Africa/Dar_es_Salaam","Africa/Nairobi|Africa/Djibouti","Africa/Nairobi|Africa/Kampala","Africa/Nairobi|Africa/Mogadishu","Africa/Nairobi|Indian/Antananarivo","Africa/Nairobi|Indian/Comoro","Africa/Nairobi|Indian/Mayotte","Africa/Tripoli|Libya","America/Adak|America/Atka","America/Adak|US/Aleutian","America/Anchorage|America/Juneau","America/Anchorage|America/Nome","America/Anchorage|America/Sitka","America/Anchorage|America/Yakutat","America/Anchorage|US/Alaska","America/Campo_Grande|America/Cuiaba","America/Chicago|America/Indiana/Knox","America/Chicago|America/Indiana/Tell_City","America/Chicago|America/Knox_IN","America/Chicago|America/Matamoros","America/Chicago|America/Menominee","America/Chicago|America/North_Dakota/Beulah","America/Chicago|America/North_Dakota/Center","America/Chicago|America/North_Dakota/New_Salem","America/Chicago|America/Rainy_River","America/Chicago|America/Rankin_Inlet","America/Chicago|America/Resolute","America/Chicago|America/Winnipeg","America/Chicago|CST6CDT","America/Chicago|Canada/Central","America/Chicago|US/Central","America/Chicago|US/Indiana-Starke","America/Chihuahua|America/Mazatlan","America/Chihuahua|Mexico/BajaSur","America/Denver|America/Boise","America/Denver|America/Cambridge_Bay","America/Denver|America/Edmonton","America/Denver|America/Inuvik","America/Denver|America/Ojinaga","America/Denver|America/Shiprock","America/Denver|America/Yellowknife","America/Denver|Canada/Mountain","America/Denver|MST7MDT","America/Denver|Navajo","America/Denver|US/Mountain","America/Fortaleza|America/Argentina/Buenos_Aires","America/Fortaleza|America/Argentina/Catamarca","America/Fortaleza|America/Argentina/ComodRivadavia","America/Fortaleza|America/Argentina/Cordoba","America/Fortaleza|America/Argentina/Jujuy","America/Fortaleza|America/Argentina/La_Rioja","America/Fortaleza|America/Argentina/Mendoza","America/Fortaleza|America/Argentina/Rio_Gallegos","America/Fortaleza|America/Argentina/Salta","America/Fortaleza|America/Argentina/San_Juan","America/Fortaleza|America/Argentina/San_Luis","America/Fortaleza|America/Argentina/Tucuman","America/Fortaleza|America/Argentina/Ushuaia","America/Fortaleza|America/Belem","America/Fortaleza|America/Buenos_Aires","America/Fortaleza|America/Catamarca","America/Fortaleza|America/Cayenne","America/Fortaleza|America/Cordoba","America/Fortaleza|America/Jujuy","America/Fortaleza|America/Maceio","America/Fortaleza|America/Mendoza","America/Fortaleza|America/Paramaribo","America/Fortaleza|America/Recife","America/Fortaleza|America/Rosario","America/Fortaleza|America/Santarem","America/Fortaleza|Antarctica/Rothera","America/Fortaleza|Atlantic/Stanley","America/Fortaleza|Etc/GMT+3","America/Godthab|America/Nuuk","America/Halifax|America/Glace_Bay","America/Halifax|America/Goose_Bay","America/Halifax|America/Moncton","America/Halifax|America/Thule","America/Halifax|Atlantic/Bermuda","America/Halifax|Canada/Atlantic","America/Havana|Cuba","America/La_Paz|America/Boa_Vista","America/La_Paz|America/Guyana","America/La_Paz|America/Manaus","America/La_Paz|America/Porto_Velho","America/La_Paz|Brazil/West","America/La_Paz|Etc/GMT+4","America/Lima|America/Bogota","America/Lima|America/Guayaquil","America/Lima|Etc/GMT+5","America/Los_Angeles|America/Ensenada","America/Los_Angeles|America/Santa_Isabel","America/Los_Angeles|America/Tijuana","America/Los_Angeles|America/Vancouver","America/Los_Angeles|Canada/Pacific","America/Los_Angeles|Mexico/BajaNorte","America/Los_Angeles|PST8PDT","America/Los_Angeles|US/Pacific","America/Managua|America/Belize","America/Managua|America/Costa_Rica","America/Managua|America/El_Salvador","America/Managua|America/Guatemala","America/Managua|America/Regina","America/Managua|America/Swift_Current","America/Managua|America/Tegucigalpa","America/Managua|Canada/Saskatchewan","America/Mexico_City|America/Bahia_Banderas","America/Mexico_City|America/Merida","America/Mexico_City|America/Monterrey","America/Mexico_City|Mexico/General","America/New_York|America/Detroit","America/New_York|America/Fort_Wayne","America/New_York|America/Indiana/Indianapolis","America/New_York|America/Indiana/Marengo","America/New_York|America/Indiana/Petersburg","America/New_York|America/Indiana/Vevay","America/New_York|America/Indiana/Vincennes","America/New_York|America/Indiana/Winamac","America/New_York|America/Indianapolis","America/New_York|America/Iqaluit","America/New_York|America/Kentucky/Louisville","America/New_York|America/Kentucky/Monticello","America/New_York|America/Louisville","America/New_York|America/Montreal","America/New_York|America/Nassau","America/New_York|America/Nipigon","America/New_York|America/Pangnirtung","America/New_York|America/Thunder_Bay","America/New_York|America/Toronto","America/New_York|Canada/Eastern","America/New_York|EST5EDT","America/New_York|US/East-Indiana","America/New_York|US/Eastern","America/New_York|US/Michigan","America/Noronha|Atlantic/South_Georgia","America/Noronha|Brazil/DeNoronha","America/Noronha|Etc/GMT+2","America/Panama|America/Atikokan","America/Panama|America/Cayman","America/Panama|America/Coral_Harbour","America/Panama|America/Jamaica","America/Panama|EST","America/Panama|Jamaica","America/Phoenix|America/Creston","America/Phoenix|America/Dawson_Creek","America/Phoenix|America/Hermosillo","America/Phoenix|MST","America/Phoenix|US/Arizona","America/Rio_Branco|America/Eirunepe","America/Rio_Branco|America/Porto_Acre","America/Rio_Branco|Brazil/Acre","America/Santiago|Chile/Continental","America/Santo_Domingo|America/Anguilla","America/Santo_Domingo|America/Antigua","America/Santo_Domingo|America/Aruba","America/Santo_Domingo|America/Barbados","America/Santo_Domingo|America/Blanc-Sablon","America/Santo_Domingo|America/Curacao","America/Santo_Domingo|America/Dominica","America/Santo_Domingo|America/Grenada","America/Santo_Domingo|America/Guadeloupe","America/Santo_Domingo|America/Kralendijk","America/Santo_Domingo|America/Lower_Princes","America/Santo_Domingo|America/Marigot","America/Santo_Domingo|America/Martinique","America/Santo_Domingo|America/Montserrat","America/Santo_Domingo|America/Port_of_Spain","America/Santo_Domingo|America/Puerto_Rico","America/Santo_Domingo|America/St_Barthelemy","America/Santo_Domingo|America/St_Kitts","America/Santo_Domingo|America/St_Lucia","America/Santo_Domingo|America/St_Thomas","America/Santo_Domingo|America/St_Vincent","America/Santo_Domingo|America/Tortola","America/Santo_Domingo|America/Virgin","America/Sao_Paulo|Brazil/East","America/St_Johns|Canada/Newfoundland","America/Whitehorse|America/Dawson","America/Whitehorse|Canada/Yukon","Antarctica/Palmer|America/Punta_Arenas","Asia/Baghdad|Antarctica/Syowa","Asia/Baghdad|Asia/Aden","Asia/Baghdad|Asia/Bahrain","Asia/Baghdad|Asia/Kuwait","Asia/Baghdad|Asia/Qatar","Asia/Baghdad|Asia/Riyadh","Asia/Baghdad|Etc/GMT-3","Asia/Baghdad|Europe/Minsk","Asia/Bangkok|Asia/Ho_Chi_Minh","Asia/Bangkok|Asia/Novokuznetsk","Asia/Bangkok|Asia/Phnom_Penh","Asia/Bangkok|Asia/Saigon","Asia/Bangkok|Asia/Vientiane","Asia/Bangkok|Etc/GMT-7","Asia/Bangkok|Indian/Christmas","Asia/Dhaka|Antarctica/Vostok","Asia/Dhaka|Asia/Almaty","Asia/Dhaka|Asia/Bishkek","Asia/Dhaka|Asia/Dacca","Asia/Dhaka|Asia/Kashgar","Asia/Dhaka|Asia/Qostanay","Asia/Dhaka|Asia/Thimbu","Asia/Dhaka|Asia/Thimphu","Asia/Dhaka|Asia/Urumqi","Asia/Dhaka|Etc/GMT-6","Asia/Dhaka|Indian/Chagos","Asia/Dili|Etc/GMT-9","Asia/Dili|Pacific/Palau","Asia/Dubai|Asia/Muscat","Asia/Dubai|Asia/Tbilisi","Asia/Dubai|Asia/Yerevan","Asia/Dubai|Etc/GMT-4","Asia/Dubai|Europe/Samara","Asia/Dubai|Indian/Mahe","Asia/Dubai|Indian/Mauritius","Asia/Dubai|Indian/Reunion","Asia/Gaza|Asia/Hebron","Asia/Hong_Kong|Hongkong","Asia/Jakarta|Asia/Pontianak","Asia/Jerusalem|Asia/Tel_Aviv","Asia/Jerusalem|Israel","Asia/Kamchatka|Asia/Anadyr","Asia/Kamchatka|Etc/GMT-12","Asia/Kamchatka|Kwajalein","Asia/Kamchatka|Pacific/Funafuti","Asia/Kamchatka|Pacific/Kwajalein","Asia/Kamchatka|Pacific/Majuro","Asia/Kamchatka|Pacific/Nauru","Asia/Kamchatka|Pacific/Tarawa","Asia/Kamchatka|Pacific/Wake","Asia/Kamchatka|Pacific/Wallis","Asia/Kathmandu|Asia/Katmandu","Asia/Kolkata|Asia/Calcutta","Asia/Kuala_Lumpur|Asia/Brunei","Asia/Kuala_Lumpur|Asia/Kuching","Asia/Kuala_Lumpur|Asia/Singapore","Asia/Kuala_Lumpur|Etc/GMT-8","Asia/Kuala_Lumpur|Singapore","Asia/Makassar|Asia/Ujung_Pandang","Asia/Rangoon|Asia/Yangon","Asia/Rangoon|Indian/Cocos","Asia/Seoul|ROK","Asia/Shanghai|Asia/Chongqing","Asia/Shanghai|Asia/Chungking","Asia/Shanghai|Asia/Harbin","Asia/Shanghai|Asia/Macao","Asia/Shanghai|Asia/Macau","Asia/Shanghai|Asia/Taipei","Asia/Shanghai|PRC","Asia/Shanghai|ROC","Asia/Tashkent|Antarctica/Mawson","Asia/Tashkent|Asia/Aqtau","Asia/Tashkent|Asia/Aqtobe","Asia/Tashkent|Asia/Ashgabat","Asia/Tashkent|Asia/Ashkhabad","Asia/Tashkent|Asia/Atyrau","Asia/Tashkent|Asia/Dushanbe","Asia/Tashkent|Asia/Oral","Asia/Tashkent|Asia/Samarkand","Asia/Tashkent|Etc/GMT-5","Asia/Tashkent|Indian/Kerguelen","Asia/Tashkent|Indian/Maldives","Asia/Tehran|Iran","Asia/Tokyo|Japan","Asia/Ulaanbaatar|Asia/Choibalsan","Asia/Ulaanbaatar|Asia/Ulan_Bator","Asia/Vladivostok|Asia/Ust-Nera","Asia/Yakutsk|Asia/Khandyga","Atlantic/Azores|America/Scoresbysund","Atlantic/Cape_Verde|Etc/GMT+1","Australia/Adelaide|Australia/Broken_Hill","Australia/Adelaide|Australia/South","Australia/Adelaide|Australia/Yancowinna","Australia/Brisbane|Australia/Lindeman","Australia/Brisbane|Australia/Queensland","Australia/Darwin|Australia/North","Australia/Lord_Howe|Australia/LHI","Australia/Perth|Australia/West","Australia/Sydney|Antarctica/Macquarie","Australia/Sydney|Australia/ACT","Australia/Sydney|Australia/Canberra","Australia/Sydney|Australia/Currie","Australia/Sydney|Australia/Hobart","Australia/Sydney|Australia/Melbourne","Australia/Sydney|Australia/NSW","Australia/Sydney|Australia/Tasmania","Australia/Sydney|Australia/Victoria","Etc/UTC|Etc/UCT","Etc/UTC|Etc/Universal","Etc/UTC|Etc/Zulu","Etc/UTC|UCT","Etc/UTC|UTC","Etc/UTC|Universal","Etc/UTC|Zulu","Europe/Athens|Asia/Nicosia","Europe/Athens|EET","Europe/Athens|Europe/Bucharest","Europe/Athens|Europe/Helsinki","Europe/Athens|Europe/Kiev","Europe/Athens|Europe/Mariehamn","Europe/Athens|Europe/Nicosia","Europe/Athens|Europe/Riga","Europe/Athens|Europe/Sofia","Europe/Athens|Europe/Tallinn","Europe/Athens|Europe/Uzhgorod","Europe/Athens|Europe/Vilnius","Europe/Athens|Europe/Zaporozhye","Europe/Chisinau|Europe/Tiraspol","Europe/Dublin|Eire","Europe/Istanbul|Asia/Istanbul","Europe/Istanbul|Turkey","Europe/Lisbon|Atlantic/Canary","Europe/Lisbon|Atlantic/Faeroe","Europe/Lisbon|Atlantic/Faroe","Europe/Lisbon|Atlantic/Madeira","Europe/Lisbon|Portugal","Europe/Lisbon|WET","Europe/London|Europe/Belfast","Europe/London|Europe/Guernsey","Europe/London|Europe/Isle_of_Man","Europe/London|Europe/Jersey","Europe/London|GB","Europe/London|GB-Eire","Europe/Moscow|W-SU","Europe/Paris|Africa/Ceuta","Europe/Paris|Arctic/Longyearbyen","Europe/Paris|Atlantic/Jan_Mayen","Europe/Paris|CET","Europe/Paris|Europe/Amsterdam","Europe/Paris|Europe/Andorra","Europe/Paris|Europe/Belgrade","Europe/Paris|Europe/Berlin","Europe/Paris|Europe/Bratislava","Europe/Paris|Europe/Brussels","Europe/Paris|Europe/Budapest","Europe/Paris|Europe/Busingen","Europe/Paris|Europe/Copenhagen","Europe/Paris|Europe/Gibraltar","Europe/Paris|Europe/Ljubljana","Europe/Paris|Europe/Luxembourg","Europe/Paris|Europe/Madrid","Europe/Paris|Europe/Malta","Europe/Paris|Europe/Monaco","Europe/Paris|Europe/Oslo","Europe/Paris|Europe/Podgorica","Europe/Paris|Europe/Prague","Europe/Paris|Europe/Rome","Europe/Paris|Europe/San_Marino","Europe/Paris|Europe/Sarajevo","Europe/Paris|Europe/Skopje","Europe/Paris|Europe/Stockholm","Europe/Paris|Europe/Tirane","Europe/Paris|Europe/Vaduz","Europe/Paris|Europe/Vatican","Europe/Paris|Europe/Vienna","Europe/Paris|Europe/Warsaw","Europe/Paris|Europe/Zagreb","Europe/Paris|Europe/Zurich","Europe/Paris|Poland","Europe/Ulyanovsk|Europe/Astrakhan","Pacific/Auckland|Antarctica/McMurdo","Pacific/Auckland|Antarctica/South_Pole","Pacific/Auckland|NZ","Pacific/Chatham|NZ-CHAT","Pacific/Easter|Chile/EasterIsland","Pacific/Fakaofo|Etc/GMT-13","Pacific/Fakaofo|Pacific/Enderbury","Pacific/Fakaofo|Pacific/Kanton","Pacific/Galapagos|Etc/GMT+6","Pacific/Gambier|Etc/GMT+9","Pacific/Guadalcanal|Etc/GMT-11","Pacific/Guadalcanal|Pacific/Efate","Pacific/Guadalcanal|Pacific/Kosrae","Pacific/Guadalcanal|Pacific/Noumea","Pacific/Guadalcanal|Pacific/Pohnpei","Pacific/Guadalcanal|Pacific/Ponape","Pacific/Guam|Pacific/Saipan","Pacific/Honolulu|HST","Pacific/Honolulu|Pacific/Johnston","Pacific/Honolulu|US/Hawaii","Pacific/Kiritimati|Etc/GMT-14","Pacific/Niue|Etc/GMT+11","Pacific/Pago_Pago|Pacific/Midway","Pacific/Pago_Pago|Pacific/Samoa","Pacific/Pago_Pago|US/Samoa","Pacific/Pitcairn|Etc/GMT+8","Pacific/Port_Moresby|Antarctica/DumontDUrville","Pacific/Port_Moresby|Etc/GMT-10","Pacific/Port_Moresby|Pacific/Chuuk","Pacific/Port_Moresby|Pacific/Truk","Pacific/Port_Moresby|Pacific/Yap","Pacific/Tahiti|Etc/GMT+10","Pacific/Tahiti|Pacific/Rarotonga"],countries:["AD|Europe/Andorra","AE|Asia/Dubai","AF|Asia/Kabul","AG|America/Port_of_Spain America/Antigua","AI|America/Port_of_Spain America/Anguilla","AL|Europe/Tirane","AM|Asia/Yerevan","AO|Africa/Lagos Africa/Luanda","AQ|Antarctica/Casey Antarctica/Davis Antarctica/DumontDUrville Antarctica/Mawson Antarctica/Palmer Antarctica/Rothera Antarctica/Syowa Antarctica/Troll Antarctica/Vostok Pacific/Auckland Antarctica/McMurdo","AR|America/Argentina/Buenos_Aires America/Argentina/Cordoba America/Argentina/Salta America/Argentina/Jujuy America/Argentina/Tucuman America/Argentina/Catamarca America/Argentina/La_Rioja America/Argentina/San_Juan America/Argentina/Mendoza America/Argentina/San_Luis America/Argentina/Rio_Gallegos America/Argentina/Ushuaia","AS|Pacific/Pago_Pago","AT|Europe/Vienna","AU|Australia/Lord_Howe Antarctica/Macquarie Australia/Hobart Australia/Melbourne Australia/Sydney Australia/Broken_Hill Australia/Brisbane Australia/Lindeman Australia/Adelaide Australia/Darwin Australia/Perth Australia/Eucla","AW|America/Curacao America/Aruba","AX|Europe/Helsinki Europe/Mariehamn","AZ|Asia/Baku","BA|Europe/Belgrade Europe/Sarajevo","BB|America/Barbados","BD|Asia/Dhaka","BE|Europe/Brussels","BF|Africa/Abidjan Africa/Ouagadougou","BG|Europe/Sofia","BH|Asia/Qatar Asia/Bahrain","BI|Africa/Maputo Africa/Bujumbura","BJ|Africa/Lagos Africa/Porto-Novo","BL|America/Port_of_Spain America/St_Barthelemy","BM|Atlantic/Bermuda","BN|Asia/Brunei","BO|America/La_Paz","BQ|America/Curacao America/Kralendijk","BR|America/Noronha America/Belem America/Fortaleza America/Recife America/Araguaina America/Maceio America/Bahia America/Sao_Paulo America/Campo_Grande America/Cuiaba America/Santarem America/Porto_Velho America/Boa_Vista America/Manaus America/Eirunepe America/Rio_Branco","BS|America/Nassau","BT|Asia/Thimphu","BW|Africa/Maputo Africa/Gaborone","BY|Europe/Minsk","BZ|America/Belize","CA|America/St_Johns America/Halifax America/Glace_Bay America/Moncton America/Goose_Bay America/Blanc-Sablon America/Toronto America/Nipigon America/Thunder_Bay America/Iqaluit America/Pangnirtung America/Atikokan America/Winnipeg America/Rainy_River America/Resolute America/Rankin_Inlet America/Regina America/Swift_Current America/Edmonton America/Cambridge_Bay America/Yellowknife America/Inuvik America/Creston America/Dawson_Creek America/Fort_Nelson America/Whitehorse America/Dawson America/Vancouver","CC|Indian/Cocos","CD|Africa/Maputo Africa/Lagos Africa/Kinshasa Africa/Lubumbashi","CF|Africa/Lagos Africa/Bangui","CG|Africa/Lagos Africa/Brazzaville","CH|Europe/Zurich","CI|Africa/Abidjan","CK|Pacific/Rarotonga","CL|America/Santiago America/Punta_Arenas Pacific/Easter","CM|Africa/Lagos Africa/Douala","CN|Asia/Shanghai Asia/Urumqi","CO|America/Bogota","CR|America/Costa_Rica","CU|America/Havana","CV|Atlantic/Cape_Verde","CW|America/Curacao","CX|Indian/Christmas","CY|Asia/Nicosia Asia/Famagusta","CZ|Europe/Prague","DE|Europe/Zurich Europe/Berlin Europe/Busingen","DJ|Africa/Nairobi Africa/Djibouti","DK|Europe/Copenhagen","DM|America/Port_of_Spain America/Dominica","DO|America/Santo_Domingo","DZ|Africa/Algiers","EC|America/Guayaquil Pacific/Galapagos","EE|Europe/Tallinn","EG|Africa/Cairo","EH|Africa/El_Aaiun","ER|Africa/Nairobi Africa/Asmara","ES|Europe/Madrid Africa/Ceuta Atlantic/Canary","ET|Africa/Nairobi Africa/Addis_Ababa","FI|Europe/Helsinki","FJ|Pacific/Fiji","FK|Atlantic/Stanley","FM|Pacific/Chuuk Pacific/Pohnpei Pacific/Kosrae","FO|Atlantic/Faroe","FR|Europe/Paris","GA|Africa/Lagos Africa/Libreville","GB|Europe/London","GD|America/Port_of_Spain America/Grenada","GE|Asia/Tbilisi","GF|America/Cayenne","GG|Europe/London Europe/Guernsey","GH|Africa/Accra","GI|Europe/Gibraltar","GL|America/Nuuk America/Danmarkshavn America/Scoresbysund America/Thule","GM|Africa/Abidjan Africa/Banjul","GN|Africa/Abidjan Africa/Conakry","GP|America/Port_of_Spain America/Guadeloupe","GQ|Africa/Lagos Africa/Malabo","GR|Europe/Athens","GS|Atlantic/South_Georgia","GT|America/Guatemala","GU|Pacific/Guam","GW|Africa/Bissau","GY|America/Guyana","HK|Asia/Hong_Kong","HN|America/Tegucigalpa","HR|Europe/Belgrade Europe/Zagreb","HT|America/Port-au-Prince","HU|Europe/Budapest","ID|Asia/Jakarta Asia/Pontianak Asia/Makassar Asia/Jayapura","IE|Europe/Dublin","IL|Asia/Jerusalem","IM|Europe/London Europe/Isle_of_Man","IN|Asia/Kolkata","IO|Indian/Chagos","IQ|Asia/Baghdad","IR|Asia/Tehran","IS|Atlantic/Reykjavik","IT|Europe/Rome","JE|Europe/London Europe/Jersey","JM|America/Jamaica","JO|Asia/Amman","JP|Asia/Tokyo","KE|Africa/Nairobi","KG|Asia/Bishkek","KH|Asia/Bangkok Asia/Phnom_Penh","KI|Pacific/Tarawa Pacific/Enderbury Pacific/Kiritimati","KM|Africa/Nairobi Indian/Comoro","KN|America/Port_of_Spain America/St_Kitts","KP|Asia/Pyongyang","KR|Asia/Seoul","KW|Asia/Riyadh Asia/Kuwait","KY|America/Panama America/Cayman","KZ|Asia/Almaty Asia/Qyzylorda Asia/Qostanay Asia/Aqtobe Asia/Aqtau Asia/Atyrau Asia/Oral","LA|Asia/Bangkok Asia/Vientiane","LB|Asia/Beirut","LC|America/Port_of_Spain America/St_Lucia","LI|Europe/Zurich Europe/Vaduz","LK|Asia/Colombo","LR|Africa/Monrovia","LS|Africa/Johannesburg Africa/Maseru","LT|Europe/Vilnius","LU|Europe/Luxembourg","LV|Europe/Riga","LY|Africa/Tripoli","MA|Africa/Casablanca","MC|Europe/Monaco","MD|Europe/Chisinau","ME|Europe/Belgrade Europe/Podgorica","MF|America/Port_of_Spain America/Marigot","MG|Africa/Nairobi Indian/Antananarivo","MH|Pacific/Majuro Pacific/Kwajalein","MK|Europe/Belgrade Europe/Skopje","ML|Africa/Abidjan Africa/Bamako","MM|Asia/Yangon","MN|Asia/Ulaanbaatar Asia/Hovd Asia/Choibalsan","MO|Asia/Macau","MP|Pacific/Guam Pacific/Saipan","MQ|America/Martinique","MR|Africa/Abidjan Africa/Nouakchott","MS|America/Port_of_Spain America/Montserrat","MT|Europe/Malta","MU|Indian/Mauritius","MV|Indian/Maldives","MW|Africa/Maputo Africa/Blantyre","MX|America/Mexico_City America/Cancun America/Merida America/Monterrey America/Matamoros America/Mazatlan America/Chihuahua America/Ojinaga America/Hermosillo America/Tijuana America/Bahia_Banderas","MY|Asia/Kuala_Lumpur Asia/Kuching","MZ|Africa/Maputo","NA|Africa/Windhoek","NC|Pacific/Noumea","NE|Africa/Lagos Africa/Niamey","NF|Pacific/Norfolk","NG|Africa/Lagos","NI|America/Managua","NL|Europe/Amsterdam","NO|Europe/Oslo","NP|Asia/Kathmandu","NR|Pacific/Nauru","NU|Pacific/Niue","NZ|Pacific/Auckland Pacific/Chatham","OM|Asia/Dubai Asia/Muscat","PA|America/Panama","PE|America/Lima","PF|Pacific/Tahiti Pacific/Marquesas Pacific/Gambier","PG|Pacific/Port_Moresby Pacific/Bougainville","PH|Asia/Manila","PK|Asia/Karachi","PL|Europe/Warsaw","PM|America/Miquelon","PN|Pacific/Pitcairn","PR|America/Puerto_Rico","PS|Asia/Gaza Asia/Hebron","PT|Europe/Lisbon Atlantic/Madeira Atlantic/Azores","PW|Pacific/Palau","PY|America/Asuncion","QA|Asia/Qatar","RE|Indian/Reunion","RO|Europe/Bucharest","RS|Europe/Belgrade","RU|Europe/Kaliningrad Europe/Moscow Europe/Simferopol Europe/Kirov Europe/Volgograd Europe/Astrakhan Europe/Saratov Europe/Ulyanovsk Europe/Samara Asia/Yekaterinburg Asia/Omsk Asia/Novosibirsk Asia/Barnaul Asia/Tomsk Asia/Novokuznetsk Asia/Krasnoyarsk Asia/Irkutsk Asia/Chita Asia/Yakutsk Asia/Khandyga Asia/Vladivostok Asia/Ust-Nera Asia/Magadan Asia/Sakhalin Asia/Srednekolymsk Asia/Kamchatka Asia/Anadyr","RW|Africa/Maputo Africa/Kigali","SA|Asia/Riyadh","SB|Pacific/Guadalcanal","SC|Indian/Mahe","SD|Africa/Khartoum","SE|Europe/Stockholm","SG|Asia/Singapore","SH|Africa/Abidjan Atlantic/St_Helena","SI|Europe/Belgrade Europe/Ljubljana","SJ|Europe/Oslo Arctic/Longyearbyen","SK|Europe/Prague Europe/Bratislava","SL|Africa/Abidjan Africa/Freetown","SM|Europe/Rome Europe/San_Marino","SN|Africa/Abidjan Africa/Dakar","SO|Africa/Nairobi Africa/Mogadishu","SR|America/Paramaribo","SS|Africa/Juba","ST|Africa/Sao_Tome","SV|America/El_Salvador","SX|America/Curacao America/Lower_Princes","SY|Asia/Damascus","SZ|Africa/Johannesburg Africa/Mbabane","TC|America/Grand_Turk","TD|Africa/Ndjamena","TF|Indian/Reunion Indian/Kerguelen","TG|Africa/Abidjan Africa/Lome","TH|Asia/Bangkok","TJ|Asia/Dushanbe","TK|Pacific/Fakaofo","TL|Asia/Dili","TM|Asia/Ashgabat","TN|Africa/Tunis","TO|Pacific/Tongatapu","TR|Europe/Istanbul","TT|America/Port_of_Spain","TV|Pacific/Funafuti","TW|Asia/Taipei","TZ|Africa/Nairobi Africa/Dar_es_Salaam","UA|Europe/Simferopol Europe/Kiev Europe/Uzhgorod Europe/Zaporozhye","UG|Africa/Nairobi Africa/Kampala","UM|Pacific/Pago_Pago Pacific/Wake Pacific/Honolulu Pacific/Midway","US|America/New_York America/Detroit America/Kentucky/Louisville America/Kentucky/Monticello America/Indiana/Indianapolis America/Indiana/Vincennes America/Indiana/Winamac America/Indiana/Marengo America/Indiana/Petersburg America/Indiana/Vevay America/Chicago America/Indiana/Tell_City America/Indiana/Knox America/Menominee America/North_Dakota/Center America/North_Dakota/New_Salem America/North_Dakota/Beulah America/Denver America/Boise America/Phoenix America/Los_Angeles America/Anchorage America/Juneau America/Sitka America/Metlakatla America/Yakutat America/Nome America/Adak Pacific/Honolulu","UY|America/Montevideo","UZ|Asia/Samarkand Asia/Tashkent","VA|Europe/Rome Europe/Vatican","VC|America/Port_of_Spain America/St_Vincent","VE|America/Caracas","VG|America/Port_of_Spain America/Tortola","VI|America/Port_of_Spain America/St_Thomas","VN|Asia/Bangkok Asia/Ho_Chi_Minh","VU|Pacific/Efate","WF|Pacific/Wallis","WS|Pacific/Apia","YE|Asia/Riyadh Asia/Aden","YT|Africa/Nairobi Indian/Mayotte","ZA|Africa/Johannesburg","ZM|Africa/Maputo Africa/Lusaka","ZW|Africa/Maputo Africa/Harare"]}),c});//! moment-timezone.js
//! version : 0.5.34
//! Copyright (c) JS Foundation and other contributors
//! license : MIT
//! github.com/moment/moment-timezone

(function (root, factory) {
	"use strict";

	/*global define*/
	if (typeof module === 'object' && module.exports) {
		module.exports = factory(require('moment')); // Node
	} else if (typeof define === 'function' && define.amd) {
		define(['moment'], factory);                 // AMD
	} else {
		factory(root.moment);                        // Browser
	}
}(this, function (moment) {
	"use strict";

	// Resolves es6 module loading issue
	if (moment.version === undefined && moment.default) {
		moment = moment.default;
	}

	// Do not load moment-timezone a second time.
	// if (moment.tz !== undefined) {
	// 	logError('Moment Timezone ' + moment.tz.version + ' was already loaded ' + (moment.tz.dataVersion ? 'with data from ' : 'without any data') + moment.tz.dataVersion);
	// 	return moment;
	// }

	var VERSION = "0.5.34",
		zones = {},
		links = {},
		countries = {},
		names = {},
		guesses = {},
		cachedGuess;

	if (!moment || typeof moment.version !== 'string') {
		logError('Moment Timezone requires Moment.js. See https://momentjs.com/timezone/docs/#/use-it/browser/');
	}

	var momentVersion = moment.version.split('.'),
		major = +momentVersion[0],
		minor = +momentVersion[1];

	// Moment.js version check
	if (major < 2 || (major === 2 && minor < 6)) {
		logError('Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js ' + moment.version + '. See momentjs.com');
	}

	/************************************
		Unpacking
	************************************/

	function charCodeToInt(charCode) {
		if (charCode > 96) {
			return charCode - 87;
		} else if (charCode > 64) {
			return charCode - 29;
		}
		return charCode - 48;
	}

	function unpackBase60(string) {
		var i = 0,
			parts = string.split('.'),
			whole = parts[0],
			fractional = parts[1] || '',
			multiplier = 1,
			num,
			out = 0,
			sign = 1;

		// handle negative numbers
		if (string.charCodeAt(0) === 45) {
			i = 1;
			sign = -1;
		}

		// handle digits before the decimal
		for (i; i < whole.length; i++) {
			num = charCodeToInt(whole.charCodeAt(i));
			out = 60 * out + num;
		}

		// handle digits after the decimal
		for (i = 0; i < fractional.length; i++) {
			multiplier = multiplier / 60;
			num = charCodeToInt(fractional.charCodeAt(i));
			out += num * multiplier;
		}

		return out * sign;
	}

	function arrayToInt (array) {
		for (var i = 0; i < array.length; i++) {
			array[i] = unpackBase60(array[i]);
		}
	}

	function intToUntil (array, length) {
		for (var i = 0; i < length; i++) {
			array[i] = Math.round((array[i - 1] || 0) + (array[i] * 60000)); // minutes to milliseconds
		}

		array[length - 1] = Infinity;
	}

	function mapIndices (source, indices) {
		var out = [], i;

		for (i = 0; i < indices.length; i++) {
			out[i] = source[indices[i]];
		}

		return out;
	}

	function unpack (string) {
		var data = string.split('|'),
			offsets = data[2].split(' '),
			indices = data[3].split(''),
			untils  = data[4].split(' ');

		arrayToInt(offsets);
		arrayToInt(indices);
		arrayToInt(untils);

		intToUntil(untils, indices.length);

		return {
			name       : data[0],
			abbrs      : mapIndices(data[1].split(' '), indices),
			offsets    : mapIndices(offsets, indices),
			untils     : untils,
			population : data[5] | 0
		};
	}

	/************************************
		Zone object
	************************************/

	function Zone (packedString) {
		if (packedString) {
			this._set(unpack(packedString));
		}
	}

	Zone.prototype = {
		_set : function (unpacked) {
			this.name       = unpacked.name;
			this.abbrs      = unpacked.abbrs;
			this.untils     = unpacked.untils;
			this.offsets    = unpacked.offsets;
			this.population = unpacked.population;
		},

		_index : function (timestamp) {
			var target = +timestamp,
				untils = this.untils,
				i;

			for (i = 0; i < untils.length; i++) {
				if (target < untils[i]) {
					return i;
				}
			}
		},

		countries : function () {
			var zone_name = this.name;
			return Object.keys(countries).filter(function (country_code) {
				return countries[country_code].zones.indexOf(zone_name) !== -1;
			});
		},

		parse : function (timestamp) {
			var target  = +timestamp,
				offsets = this.offsets,
				untils  = this.untils,
				max     = untils.length - 1,
				offset, offsetNext, offsetPrev, i;

			for (i = 0; i < max; i++) {
				offset     = offsets[i];
				offsetNext = offsets[i + 1];
				offsetPrev = offsets[i ? i - 1 : i];

				if (offset < offsetNext && tz.moveAmbiguousForward) {
					offset = offsetNext;
				} else if (offset > offsetPrev && tz.moveInvalidForward) {
					offset = offsetPrev;
				}

				if (target < untils[i] - (offset * 60000)) {
					return offsets[i];
				}
			}

			return offsets[max];
		},

		abbr : function (mom) {
			return this.abbrs[this._index(mom)];
		},

		offset : function (mom) {
			logError("zone.offset has been deprecated in favor of zone.utcOffset");
			return this.offsets[this._index(mom)];
		},

		utcOffset : function (mom) {
			return this.offsets[this._index(mom)];
		}
	};

	/************************************
		Country object
	************************************/

	function Country (country_name, zone_names) {
		this.name = country_name;
		this.zones = zone_names;
	}

	/************************************
		Current Timezone
	************************************/

	function OffsetAt(at) {
		var timeString = at.toTimeString();
		var abbr = timeString.match(/\([a-z ]+\)/i);
		if (abbr && abbr[0]) {
			// 17:56:31 GMT-0600 (CST)
			// 17:56:31 GMT-0600 (Central Standard Time)
			abbr = abbr[0].match(/[A-Z]/g);
			abbr = abbr ? abbr.join('') : undefined;
		} else {
			// 17:56:31 CST
			// 17:56:31 GMT+0800 (台北標準時間)
			abbr = timeString.match(/[A-Z]{3,5}/g);
			abbr = abbr ? abbr[0] : undefined;
		}

		if (abbr === 'GMT') {
			abbr = undefined;
		}

		this.at = +at;
		this.abbr = abbr;
		this.offset = at.getTimezoneOffset();
	}

	function ZoneScore(zone) {
		this.zone = zone;
		this.offsetScore = 0;
		this.abbrScore = 0;
	}

	ZoneScore.prototype.scoreOffsetAt = function (offsetAt) {
		this.offsetScore += Math.abs(this.zone.utcOffset(offsetAt.at) - offsetAt.offset);
		if (this.zone.abbr(offsetAt.at).replace(/[^A-Z]/g, '') !== offsetAt.abbr) {
			this.abbrScore++;
		}
	};

	function findChange(low, high) {
		var mid, diff;

		while ((diff = ((high.at - low.at) / 12e4 | 0) * 6e4)) {
			mid = new OffsetAt(new Date(low.at + diff));
			if (mid.offset === low.offset) {
				low = mid;
			} else {
				high = mid;
			}
		}

		return low;
	}

	function userOffsets() {
		var startYear = new Date().getFullYear() - 2,
			last = new OffsetAt(new Date(startYear, 0, 1)),
			offsets = [last],
			change, next, i;

		for (i = 1; i < 48; i++) {
			next = new OffsetAt(new Date(startYear, i, 1));
			if (next.offset !== last.offset) {
				change = findChange(last, next);
				offsets.push(change);
				offsets.push(new OffsetAt(new Date(change.at + 6e4)));
			}
			last = next;
		}

		for (i = 0; i < 4; i++) {
			offsets.push(new OffsetAt(new Date(startYear + i, 0, 1)));
			offsets.push(new OffsetAt(new Date(startYear + i, 6, 1)));
		}

		return offsets;
	}

	function sortZoneScores (a, b) {
		if (a.offsetScore !== b.offsetScore) {
			return a.offsetScore - b.offsetScore;
		}
		if (a.abbrScore !== b.abbrScore) {
			return a.abbrScore - b.abbrScore;
		}
		if (a.zone.population !== b.zone.population) {
			return b.zone.population - a.zone.population;
		}
		return b.zone.name.localeCompare(a.zone.name);
	}

	function addToGuesses (name, offsets) {
		var i, offset;
		arrayToInt(offsets);
		for (i = 0; i < offsets.length; i++) {
			offset = offsets[i];
			guesses[offset] = guesses[offset] || {};
			guesses[offset][name] = true;
		}
	}

	function guessesForUserOffsets (offsets) {
		var offsetsLength = offsets.length,
			filteredGuesses = {},
			out = [],
			i, j, guessesOffset;

		for (i = 0; i < offsetsLength; i++) {
			guessesOffset = guesses[offsets[i].offset] || {};
			for (j in guessesOffset) {
				if (guessesOffset.hasOwnProperty(j)) {
					filteredGuesses[j] = true;
				}
			}
		}

		for (i in filteredGuesses) {
			if (filteredGuesses.hasOwnProperty(i)) {
				out.push(names[i]);
			}
		}

		return out;
	}

	function rebuildGuess () {

		// use Intl API when available and returning valid time zone
		try {
			var intlName = Intl.DateTimeFormat().resolvedOptions().timeZone;
			if (intlName && intlName.length > 3) {
				var name = names[normalizeName(intlName)];
				if (name) {
					return name;
				}
				logError("Moment Timezone found " + intlName + " from the Intl api, but did not have that data loaded.");
			}
		} catch (e) {
			// Intl unavailable, fall back to manual guessing.
		}

		var offsets = userOffsets(),
			offsetsLength = offsets.length,
			guesses = guessesForUserOffsets(offsets),
			zoneScores = [],
			zoneScore, i, j;

		for (i = 0; i < guesses.length; i++) {
			zoneScore = new ZoneScore(getZone(guesses[i]), offsetsLength);
			for (j = 0; j < offsetsLength; j++) {
				zoneScore.scoreOffsetAt(offsets[j]);
			}
			zoneScores.push(zoneScore);
		}

		zoneScores.sort(sortZoneScores);

		return zoneScores.length > 0 ? zoneScores[0].zone.name : undefined;
	}

	function guess (ignoreCache) {
		if (!cachedGuess || ignoreCache) {
			cachedGuess = rebuildGuess();
		}
		return cachedGuess;
	}

	/************************************
		Global Methods
	************************************/

	function normalizeName (name) {
		return (name || '').toLowerCase().replace(/\//g, '_');
	}

	function addZone (packed) {
		var i, name, split, normalized;

		if (typeof packed === "string") {
			packed = [packed];
		}

		for (i = 0; i < packed.length; i++) {
			split = packed[i].split('|');
			name = split[0];
			normalized = normalizeName(name);
			zones[normalized] = packed[i];
			names[normalized] = name;
			addToGuesses(normalized, split[2].split(' '));
		}
	}

	function getZone (name, caller) {

		name = normalizeName(name);

		var zone = zones[name];
		var link;

		if (zone instanceof Zone) {
			return zone;
		}

		if (typeof zone === 'string') {
			zone = new Zone(zone);
			zones[name] = zone;
			return zone;
		}

		// Pass getZone to prevent recursion more than 1 level deep
		if (links[name] && caller !== getZone && (link = getZone(links[name], getZone))) {
			zone = zones[name] = new Zone();
			zone._set(link);
			zone.name = names[name];
			return zone;
		}

		return null;
	}

	function getNames () {
		var i, out = [];

		for (i in names) {
			if (names.hasOwnProperty(i) && (zones[i] || zones[links[i]]) && names[i]) {
				out.push(names[i]);
			}
		}

		return out.sort();
	}

	function getCountryNames () {
		return Object.keys(countries);
	}

	function addLink (aliases) {
		var i, alias, normal0, normal1;

		if (typeof aliases === "string") {
			aliases = [aliases];
		}

		for (i = 0; i < aliases.length; i++) {
			alias = aliases[i].split('|');

			normal0 = normalizeName(alias[0]);
			normal1 = normalizeName(alias[1]);

			links[normal0] = normal1;
			names[normal0] = alias[0];

			links[normal1] = normal0;
			names[normal1] = alias[1];
		}
	}

	function addCountries (data) {
		var i, country_code, country_zones, split;
		if (!data || !data.length) return;
		for (i = 0; i < data.length; i++) {
			split = data[i].split('|');
			country_code = split[0].toUpperCase();
			country_zones = split[1].split(' ');
			countries[country_code] = new Country(
				country_code,
				country_zones
			);
		}
	}

	function getCountry (name) {
		name = name.toUpperCase();
		return countries[name] || null;
	}

	function zonesForCountry(country, with_offset) {
		country = getCountry(country);

		if (!country) return null;

		var zones = country.zones.sort();

		if (with_offset) {
			return zones.map(function (zone_name) {
				var zone = getZone(zone_name);
				return {
					name: zone_name,
					offset: zone.utcOffset(new Date())
				};
			});
		}

		return zones;
	}

	function loadData (data) {
		addZone(data.zones);
		addLink(data.links);
		addCountries(data.countries);
		tz.dataVersion = data.version;
	}

	function zoneExists (name) {
		if (!zoneExists.didShowError) {
			zoneExists.didShowError = true;
				logError("moment.tz.zoneExists('" + name + "') has been deprecated in favor of !moment.tz.zone('" + name + "')");
		}
		return !!getZone(name);
	}

	function needsOffset (m) {
		var isUnixTimestamp = (m._f === 'X' || m._f === 'x');
		return !!(m._a && (m._tzm === undefined) && !isUnixTimestamp);
	}

	function logError (message) {
		if (typeof console !== 'undefined' && typeof console.error === 'function') {
			console.error(message);
		}
	}

	/************************************
		moment.tz namespace
	************************************/

	function tz (input) {
		var args = Array.prototype.slice.call(arguments, 0, -1),
			name = arguments[arguments.length - 1],
			zone = getZone(name),
			out  = moment.utc.apply(null, args);

		if (zone && !moment.isMoment(input) && needsOffset(out)) {
			out.add(zone.parse(out), 'minutes');
		}

		out.tz(name);

		return out;
	}

	tz.version      = VERSION;
	tz.dataVersion  = '';
	tz._zones       = zones;
	tz._links       = links;
	tz._names       = names;
	tz._countries	= countries;
	tz.add          = addZone;
	tz.link         = addLink;
	tz.load         = loadData;
	tz.zone         = getZone;
	tz.zoneExists   = zoneExists; // deprecated in 0.1.0
	tz.guess        = guess;
	tz.names        = getNames;
	tz.Zone         = Zone;
	tz.unpack       = unpack;
	tz.unpackBase60 = unpackBase60;
	tz.needsOffset  = needsOffset;
	tz.moveInvalidForward   = true;
	tz.moveAmbiguousForward = false;
	tz.countries    = getCountryNames;
	tz.zonesForCountry = zonesForCountry;

	/************************************
		Interface with Moment.js
	************************************/

	var fn = moment.fn;

	moment.tz = tz;

	moment.defaultZone = null;

	moment.updateOffset = function (mom, keepTime) {
		var zone = moment.defaultZone,
			offset;

		if (mom._z === undefined) {
			if (zone && needsOffset(mom) && !mom._isUTC) {
				mom._d = moment.utc(mom._a)._d;
				mom.utc().add(zone.parse(mom), 'minutes');
			}
			mom._z = zone;
		}
		if (mom._z) {
			offset = mom._z.utcOffset(mom);
			if (Math.abs(offset) < 16) {
				offset = offset / 60;
			}
			if (mom.utcOffset !== undefined) {
				var z = mom._z;
				mom.utcOffset(-offset, keepTime);
				mom._z = z;
			} else {
				mom.zone(offset, keepTime);
			}
		}
	};

	fn.tz = function (name, keepTime) {
		if (name) {
			if (typeof name !== 'string') {
				throw new Error('Time zone name must be a string, got ' + name + ' [' + typeof name + ']');
			}
			this._z = getZone(name);
			if (this._z) {
				moment.updateOffset(this, keepTime);
			} else {
				logError("Moment Timezone has no data for " + name + ". See http://momentjs.com/timezone/docs/#/data-loading/.");
			}
			return this;
		}
		if (this._z) { return this._z.name; }
	};

	function abbrWrap (old) {
		return function () {
			if (this._z) { return this._z.abbr(this); }
			return old.call(this);
		};
	}

	function resetZoneWrap (old) {
		return function () {
			this._z = null;
			return old.apply(this, arguments);
		};
	}

	function resetZoneWrap2 (old) {
		return function () {
			if (arguments.length > 0) this._z = null;
			return old.apply(this, arguments);
		};
	}

	fn.zoneName  = abbrWrap(fn.zoneName);
	fn.zoneAbbr  = abbrWrap(fn.zoneAbbr);
	fn.utc       = resetZoneWrap(fn.utc);
	fn.local     = resetZoneWrap(fn.local);
	fn.utcOffset = resetZoneWrap2(fn.utcOffset);

	moment.tz.setDefault = function(name) {
		if (major < 2 || (major === 2 && minor < 9)) {
			logError('Moment Timezone setDefault() requires Moment.js >= 2.9.0. You are using Moment.js ' + moment.version + '.');
		}
		moment.defaultZone = name ? getZone(name) : null;
		return moment;
	};

	// Cloning a moment should include the _z property.
	var momentProperties = moment.momentProperties;
	if (Object.prototype.toString.call(momentProperties) === '[object Array]') {
		// moment 2.8.1+
		momentProperties.push('_z');
		momentProperties.push('_a');
	} else if (momentProperties) {
		// moment 2.7.0
		momentProperties._z = null;
	}

	loadData({
		"version": "2021e",
		"zones": [
			"Africa/Abidjan|LMT GMT|g.8 0|01|-2ldXH.Q|48e5",
			"Africa/Nairobi|LMT +0230 EAT +0245|-2r.g -2u -30 -2J|012132|-2ua2r.g N6nV.g 3Fbu h1cu dzbJ|47e5",
			"Africa/Algiers|PMT WET WEST CET CEST|-9.l 0 -10 -10 -20|0121212121212121343431312123431213|-2nco9.l cNb9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 DA0 Imo0 rd0 De0 9Xz0 1fb0 1ap0 16K0 2yo0 mEp0 hwL0 jxA0 11A0 dDd0 17b0 11B0 1cN0 2Dy0 1cN0 1fB0 1cL0|26e5",
			"Africa/Lagos|LMT GMT +0030 WAT|-d.z 0 -u -10|01023|-2B40d.z 7iod.z dnXK.p dLzH.z|17e6",
			"Africa/Bissau|LMT -01 GMT|12.k 10 0|012|-2ldX0 2xoo0|39e4",
			"Africa/Maputo|LMT CAT|-2a.k -20|01|-2GJea.k|26e5",
			"Africa/Cairo|EET EEST|-20 -30|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1bIO0 vb0 1ip0 11z0 1iN0 1nz0 12p0 1pz0 10N0 1pz0 16p0 1jz0 s3d0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1WL0 rd0 1Rz0 wp0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1qL0 Xd0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1ny0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 WL0 1qN0 Rb0 1wp0 On0 1zd0 Lz0 1EN0 Fb0 c10 8n0 8Nd0 gL0 e10 mn0|15e6",
			"Africa/Casablanca|LMT +00 +01|u.k 0 -10|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-2gMnt.E 130Lt.E rb0 Dd0 dVb0 b6p0 TX0 EoB0 LL0 gnd0 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4mn0 SyN0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0 2600 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0|32e5",
			"Africa/Ceuta|WET WEST CET CEST|0 -10 -10 -20|010101010101010101010232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-25KN0 11z0 drd0 18p0 3HX0 17d0 1fz0 1a10 1io0 1a00 1y7o0 LL0 gnd0 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4VB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|85e3",
			"Africa/El_Aaiun|LMT -01 +00 +01|Q.M 10 0 -10|012323232323232323232323232323232323232323232323232323232323232323232323232323232323|-1rDz7.c 1GVA7.c 6L0 AL0 1Nd0 XX0 1Cp0 pz0 1cBB0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0 2600 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0|20e4",
			"Africa/Johannesburg|SAST SAST SAST|-1u -20 -30|012121|-2GJdu 1Ajdu 1cL0 1cN0 1cL0|84e5",
			"Africa/Juba|LMT CAT CAST EAT|-26.s -20 -30 -30|012121212121212121212121212121212131|-1yW26.s 1zK06.s 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0 PeX0|",
			"Africa/Khartoum|LMT CAT CAST EAT|-2a.8 -20 -30 -30|012121212121212121212121212121212131|-1yW2a.8 1zK0a.8 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0 HjL0|51e5",
			"Africa/Monrovia|MMT MMT GMT|H.8 I.u 0|012|-23Lzg.Q 28G01.m|11e5",
			"Africa/Ndjamena|LMT WAT WAST|-10.c -10 -20|0121|-2le10.c 2J3c0.c Wn0|13e5",
			"Africa/Sao_Tome|LMT GMT WAT|A.J 0 -10|0121|-2le00 4i6N0 2q00|",
			"Africa/Tripoli|LMT CET CEST EET|-Q.I -10 -20 -20|012121213121212121212121213123123|-21JcQ.I 1hnBQ.I vx0 4iP0 xx0 4eN0 Bb0 7ip0 U0n0 A10 1db0 1cN0 1db0 1dd0 1db0 1eN0 1bb0 1e10 1cL0 1c10 1db0 1dd0 1db0 1cN0 1db0 1q10 fAn0 1ep0 1db0 AKq0 TA0 1o00|11e5",
			"Africa/Tunis|PMT CET CEST|-9.l -10 -20|0121212121212121212121212121212121|-2nco9.l 18pa9.l 1qM0 DA0 3Tc0 11B0 1ze0 WM0 7z0 3d0 14L0 1cN0 1f90 1ar0 16J0 1gXB0 WM0 1rA0 11c0 nwo0 Ko0 1cM0 1cM0 1rA0 10M0 zuM0 10N0 1aN0 1qM0 WM0 1qM0 11A0 1o00|20e5",
			"Africa/Windhoek|+0130 SAST SAST CAT WAT|-1u -20 -30 -20 -10|01213434343434343434343434343434343434343434343434343|-2GJdu 1Ajdu 1cL0 1SqL0 9Io0 16P0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0|32e4",
			"America/Adak|NST NWT NPT BST BDT AHST HST HDT|b0 a0 a0 b0 a0 a0 a0 90|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17SX0 8wW0 iB0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|326",
			"America/Anchorage|AST AWT APT AHST AHDT YST AKST AKDT|a0 90 90 a0 90 90 90 80|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17T00 8wX0 iA0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|30e4",
			"America/Puerto_Rico|AST AWT APT|40 30 30|0120|-17lU0 7XT0 iu0|24e5",
			"America/Araguaina|LMT -03 -02|3c.M 30 20|0121212121212121212121212121212121212121212121212121|-2glwL.c HdKL.c 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 ny10 Lz0|14e4",
			"America/Argentina/Buenos_Aires|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 A4p0 uL0 1qN0 WL0|",
			"America/Argentina/Catamarca|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323132321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 7B0 8zb0 uL0|",
			"America/Argentina/Cordoba|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323132323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0 1qN0 WL0|",
			"America/Argentina/Jujuy|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323121323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1ze0 TX0 1ld0 WK0 1wp0 TX0 A4p0 uL0|",
			"America/Argentina/La_Rioja|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0|",
			"America/Argentina/Mendoza|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232312121321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1u20 SL0 1vd0 Tb0 1wp0 TW0 ri10 Op0 7TX0 uL0|",
			"America/Argentina/Rio_Gallegos|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0|",
			"America/Argentina/Salta|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0|",
			"America/Argentina/San_Juan|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rld0 m10 8lb0 uL0|",
			"America/Argentina/San_Luis|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323121212321212|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 XX0 1q20 SL0 AN0 vDb0 m10 8lb0 8L0 jd0 1qN0 WL0 1qN0|",
			"America/Argentina/Tucuman|CMT -04 -03 -02|4g.M 40 30 20|0121212121212121212121212121212121212121212323232313232123232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 4N0 8BX0 uL0 1qN0 WL0|",
			"America/Argentina/Ushuaia|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rkN0 8p0 8zb0 uL0|",
			"America/Asuncion|AMT -04 -03|3O.E 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-1x589.k 1DKM9.k 3CL0 3Dd0 10L0 1pB0 10n0 1pB0 10n0 1pB0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1lB0 14n0 1dd0 1cL0 1fd0 WL0 1rd0 1aL0 1dB0 Xz0 1qp0 Xb0 1qN0 10L0 1rB0 TX0 1tB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 WN0 1qL0 11B0 1nX0 1ip0 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 TX0 1tB0 19X0 1a10 1fz0 1a10 1fz0 1cN0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0|28e5",
			"America/Panama|CMT EST|5j.A 50|01|-2uduE.o|15e5",
			"America/Bahia_Banderas|LMT MST CST PST MDT CDT|71 70 60 80 60 50|0121212131414141414141414141414141414152525252525252525252525252525252525252525252525252525252|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nW0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|84e3",
			"America/Bahia|LMT -03 -02|2y.4 30 20|01212121212121212121212121212121212121212121212121212121212121|-2glxp.U HdLp.U 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 l5B0 Rb0|27e5",
			"America/Barbados|LMT AST ADT -0330|3W.t 40 30 3u|0121213121212121|-2m4k1.v 1eAN1.v RB0 1Bz0 Op0 1rb0 11d0 1jJc0 IL0 1ip0 17b0 1ip0 17b0 1ld0 13b0|28e4",
			"America/Belem|LMT -03 -02|3d.U 30 20|012121212121212121212121212121|-2glwK.4 HdKK.4 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0|20e5",
			"America/Belize|LMT CST -0530 CWT CPT CDT|5Q.M 60 5u 50 50 50|012121212121212121212121212121212121212121212121213412121212121212121212121212121212121212121215151|-2kBu7.c fPA7.c Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu Rcu 7Bt0 Ni0 4nd0 Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu e9Au qn0 lxB0 mn0|57e3",
			"America/Boa_Vista|LMT -04 -03|42.E 40 30|0121212121212121212121212121212121|-2glvV.k HdKV.k 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 smp0 WL0 1tB0 2L0|62e2",
			"America/Bogota|BMT -05 -04|4U.g 50 40|0121|-2eb73.I 38yo3.I 2en0|90e5",
			"America/Boise|PST PDT MST MWT MPT MDT|80 70 70 60 60 60|0101023425252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-261q0 1nX0 11B0 1nX0 8C10 JCL0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 Dd0 1Kn0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e4",
			"America/Cambridge_Bay|-00 MST MWT MPT MDDT MDT CST CDT EST|0 70 60 60 50 60 60 50 50|0123141515151515151515151515151515151515151515678651515151515151515151515151515151515151515151515151515151515151515151515151|-21Jc0 RO90 8x20 ix0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11A0 1nX0 2K0 WQ0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e2",
			"America/Campo_Grande|LMT -04 -03|3C.s 40 30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glwl.w HdLl.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|77e4",
			"America/Cancun|LMT CST EST EDT CDT|5L.4 60 50 40 50|0123232341414141414141414141414141414141412|-1UQG0 2q2o0 yLB0 1lb0 14p0 1lb0 14p0 Lz0 xB0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 Dd0|63e4",
			"America/Caracas|CMT -0430 -04|4r.E 4u 40|01212|-2kV7w.k 28KM2.k 1IwOu kqo0|29e5",
			"America/Cayenne|LMT -04 -03|3t.k 40 30|012|-2mrwu.E 2gWou.E|58e3",
			"America/Chicago|CST CDT EST CWT CPT|60 50 50 50 50|01010101010101010101010101010101010102010101010103401010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 1wp0 TX0 WN0 1qL0 1cN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 11B0 1Hz0 14p0 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|92e5",
			"America/Chihuahua|LMT MST CST CDT MDT|74.k 70 60 50 60|0121212323241414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 2zQN0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|81e4",
			"America/Costa_Rica|SJMT CST CDT|5A.d 60 50|0121212121|-1Xd6n.L 2lu0n.L Db0 1Kp0 Db0 pRB0 15b0 1kp0 mL0|12e5",
			"America/Phoenix|MST MDT MWT|70 60 60|01010202010|-261r0 1nX0 11B0 1nX0 SgN0 4Al1 Ap0 1db0 SWqX 1cL0|42e5",
			"America/Cuiaba|LMT -04 -03|3I.k 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glwf.E HdLf.E 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 4a10 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|54e4",
			"America/Danmarkshavn|LMT -03 -02 GMT|1e.E 30 20 0|01212121212121212121212121212121213|-2a5WJ.k 2z5fJ.k 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 DC0|8",
			"America/Dawson_Creek|PST PDT PWT PPT MST|80 70 70 70 70|0102301010101010101010101010101010101010101010101010101014|-25TO0 1in0 UGp0 8x10 iy0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 ML0|12e3",
			"America/Dawson|YST YDT YWT YPT YDDT PST PDT MST|90 80 80 80 70 80 70 70|010102304056565656565656565656565656565656565656565656565656565656565656565656565656565656567|-25TN0 1in0 1o10 13V0 Ser0 8x00 iz0 LCL0 1fA0 jrA0 fNd0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1z90|13e2",
			"America/Denver|MST MDT MWT MPT|70 60 60 60|01010101023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261r0 1nX0 11B0 1nX0 11B0 1qL0 WN0 mn0 Ord0 8x20 ix0 LCN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e5",
			"America/Detroit|LMT CST EST EWT EPT EDT|5w.b 60 50 40 40 40|0123425252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-2Cgir.N peqr.N 156L0 8x40 iv0 6fd0 11z0 JxX1 SMX 1cN0 1cL0 aW10 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e5",
			"America/Edmonton|LMT MST MDT MWT MPT|7x.Q 70 60 60 60|0121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2yd4q.8 shdq.8 1in0 17d0 hz0 2dB0 1fz0 1a10 11z0 1qN0 WL0 1qN0 11z0 IGN0 8x20 ix0 3NB0 11z0 XQp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|10e5",
			"America/Eirunepe|LMT -05 -04|4D.s 50 40|0121212121212121212121212121212121|-2glvk.w HdLk.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0 yTd0 d5X0|31e3",
			"America/El_Salvador|LMT CST CDT|5U.M 60 50|012121|-1XiG3.c 2Fvc3.c WL0 1qN0 WL0|11e5",
			"America/Tijuana|LMT MST PST PDT PWT PPT|7M.4 70 80 70 70 70|012123245232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UQE0 4PX0 8mM0 8lc0 SN0 1cL0 pHB0 83r0 zI0 5O10 1Rz0 cOO0 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 BUp0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|20e5",
			"America/Fort_Nelson|PST PDT PWT PPT MST|80 70 70 70 70|01023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010104|-25TO0 1in0 UGp0 8x10 iy0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0|39e2",
			"America/Fort_Wayne|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|010101023010101010101010101040454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 QI10 Db0 RB0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 5Tz0 1o10 qLb0 1cL0 1cN0 1cL0 1qhd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"America/Fortaleza|LMT -03 -02|2y 30 20|0121212121212121212121212121212121212121|-2glxq HdLq 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 5z0 2mN0 On0|34e5",
			"America/Glace_Bay|LMT AST ADT AWT APT|3X.M 40 30 30 30|012134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsI0.c CwO0.c 1in0 UGp0 8x50 iu0 iq10 11z0 Jg10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3",
			"America/Godthab|LMT -03 -02|3q.U 30 20|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a5Ux.4 2z5dx.4 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e3",
			"America/Goose_Bay|NST NDT NST NDT NWT NPT AST ADT ADDT|3u.Q 2u.Q 3u 2u 2u 2u 40 30 20|010232323232323245232323232323232323232323232323232323232326767676767676767676767676767676767676767676768676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-25TSt.8 1in0 DXb0 2HbX.8 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 WL0 1qN0 WL0 1qN0 7UHu itu 1tB0 WL0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1tB0 WL0 1ld0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 S10 g0u 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|76e2",
			"America/Grand_Turk|KMT EST EDT AST|57.a 50 40 40|0121212121212121212121212121212121212121212121212121212121212121212121212132121212121212121212121212121212121212121|-2l1uQ.O 2HHBQ.O 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 7jA0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e2",
			"America/Guatemala|LMT CST CDT|62.4 60 50|0121212121|-24KhV.U 2efXV.U An0 mtd0 Nz0 ifB0 17b0 zDB0 11z0|13e5",
			"America/Guayaquil|QMT -05 -04|5e 50 40|0121|-1yVSK 2uILK rz0|27e5",
			"America/Guyana|LMT -04 -0345 -03|3Q.D 40 3J 30|01231|-2mf87.l 8Hc7.l 2r7bJ Ey0f|80e4",
			"America/Halifax|LMT AST ADT AWT APT|4e.o 40 30 30 30|0121212121212121212121212121212121212121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsHJ.A xzzJ.A 1db0 3I30 1in0 3HX0 IL0 1E10 ML0 1yN0 Pb0 1Bd0 Mn0 1Bd0 Rz0 1w10 Xb0 1w10 LX0 1w10 Xb0 1w10 Lz0 1C10 Jz0 1E10 OL0 1yN0 Un0 1qp0 Xb0 1qp0 11X0 1w10 Lz0 1HB0 LX0 1C10 FX0 1w10 Xb0 1qp0 Xb0 1BB0 LX0 1td0 Xb0 1qp0 Xb0 Rf0 8x50 iu0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 3Qp0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 3Qp0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 6i10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|39e4",
			"America/Havana|HMT CST CDT|5t.A 50 40|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1Meuu.o 72zu.o ML0 sld0 An0 1Nd0 Db0 1Nd0 An0 6Ep0 An0 1Nd0 An0 JDd0 Mn0 1Ap0 On0 1fd0 11X0 1qN0 WL0 1wp0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 14n0 1ld0 14L0 1kN0 15b0 1kp0 1cL0 1cN0 1fz0 1a10 1fz0 1fB0 11z0 14p0 1nX0 11B0 1nX0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 1a10 1in0 1a10 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 17c0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 11A0 6i00 Rc0 1wo0 U00 1tA0 Rc0 1wo0 U00 1wo0 U00 1zc0 U00 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0|21e5",
			"America/Hermosillo|LMT MST CST PST MDT|7n.Q 70 60 80 60|0121212131414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0|64e4",
			"America/Indiana/Knox|CST CDT CWT CPT EST|60 50 50 50 50|0101023010101010101010101010101010101040101010101010101010101010101010101010101010101010141010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 11z0 1o10 11z0 1o10 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 3Cn0 8wp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 z8o0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"America/Indiana/Marengo|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101023010101010101010104545454545414545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 dyN0 11z0 6fd0 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 jrz0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1e6p0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"America/Indiana/Petersburg|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010104010101010101010101010141014545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 njX0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 3Fb0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 19co0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"America/Indiana/Tell_City|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010401054541010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 njX0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 8wn0 1cN0 1cL0 1cN0 1cK0 1cN0 1cL0 1qhd0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"America/Indiana/Vevay|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|010102304545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 kPB0 Awn0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1lnd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"America/Indiana/Vincennes|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010101010454541014545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 g0p0 11z0 1o10 11z0 1qL0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 caL0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"America/Indiana/Winamac|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010101010101010454541054545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 jrz0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1za0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"America/Inuvik|-00 PST PDDT MST MDT|0 80 60 70 60|0121343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-FnA0 tWU0 1fA0 wPe0 2pz0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|35e2",
			"America/Iqaluit|-00 EWT EPT EST EDDT EDT CST CDT|0 40 40 50 30 40 60 50|01234353535353535353535353535353535353535353567353535353535353535353535353535353535353535353535353535353535353535353535353|-16K00 7nX0 iv0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|67e2",
			"America/Jamaica|KMT EST EDT|57.a 50 40|0121212121212121212121|-2l1uQ.O 2uM1Q.O 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0|94e4",
			"America/Juneau|PST PWT PPT PDT YDT YST AKST AKDT|80 70 70 70 80 90 90 80|01203030303030303030303030403030356767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cM0 1cM0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|33e3",
			"America/Kentucky/Louisville|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101010102301010101010101010101010101454545454545414545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 3Fd0 Nb0 LPd0 11z0 RB0 8x30 iw0 1nX1 e0X 9vd0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 xz0 gso0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"America/Kentucky/Monticello|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101023010101010101010101010101010101010101010101010101010101010101010101454545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 SWp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"America/La_Paz|CMT BST -04|4w.A 3w.A 40|012|-1x37r.o 13b0|19e5",
			"America/Lima|LMT -05 -04|58.A 50 40|0121212121212121|-2tyGP.o 1bDzP.o zX0 1aN0 1cL0 1cN0 1cL0 1PrB0 zX0 1O10 zX0 6Gp0 zX0 98p0 zX0|11e6",
			"America/Los_Angeles|PST PDT PWT PPT|80 70 70 70|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261q0 1nX0 11B0 1nX0 SgN0 8x10 iy0 5Wp1 1VaX 3dA0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e6",
			"America/Maceio|LMT -03 -02|2m.Q 30 20|012121212121212121212121212121212121212121|-2glxB.8 HdLB.8 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 8Q10 WL0 1tB0 5z0 2mN0 On0|93e4",
			"America/Managua|MMT CST EST CDT|5J.c 60 50 50|0121313121213131|-1quie.M 1yAMe.M 4mn0 9Up0 Dz0 1K10 Dz0 s3F0 1KH0 DB0 9In0 k8p0 19X0 1o30 11y0|22e5",
			"America/Manaus|LMT -04 -03|40.4 40 30|01212121212121212121212121212121|-2glvX.U HdKX.U 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0|19e5",
			"America/Martinique|FFMT AST ADT|44.k 40 30|0121|-2mPTT.E 2LPbT.E 19X0|39e4",
			"America/Matamoros|LMT CST CDT|6E 60 50|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1UQG0 2FjC0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|45e4",
			"America/Mazatlan|LMT MST CST PST MDT|75.E 70 60 80 60|0121212131414141414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|44e4",
			"America/Menominee|CST CDT CWT CPT EST|60 50 50 50 50|01010230101041010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 LCN0 1fz0 6410 9Jb0 1cM0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|85e2",
			"America/Merida|LMT CST EST CDT|5W.s 60 50 50|0121313131313131313131313131313131313131313131313131313131313131313131313131313131313131|-1UQG0 2q2o0 2hz0 wu30 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|11e5",
			"America/Metlakatla|PST PWT PPT PDT AKST AKDT|80 70 70 70 90 80|01203030303030303030303030303030304545450454545454545454545454545454545454545454|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1hU10 Rd0 1zb0 Op0 1zb0 Op0 1zb0 uM0 jB0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2",
			"America/Mexico_City|LMT MST CST CDT CWT|6A.A 70 60 50 50|012121232324232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 gEn0 TX0 3xd0 Jb0 6zB0 SL0 e5d0 17b0 1Pff0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|20e6",
			"America/Miquelon|LMT AST -03 -02|3I.E 40 30 20|012323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2mKkf.k 2LTAf.k gQ10 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|61e2",
			"America/Moncton|EST AST ADT AWT APT|50 40 30 30 30|012121212121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsH0 CwN0 1in0 zAo0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1K10 Lz0 1zB0 NX0 1u10 Wn0 S20 8x50 iu0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14n1 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 ReX 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|64e3",
			"America/Monterrey|LMT CST CDT|6F.g 60 50|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1UQG0 2FjC0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|41e5",
			"America/Montevideo|LMT MMT -04 -03 -0330 -0230 -02 -0130|3I.P 3I.P 40 30 3u 2u 20 1u|012343434343434343434343435353636353636375363636363636363636363636363636363636363636363|-2tRUf.9 sVc0 8jcf.9 1db0 1dcu 1cLu 1dcu 1cLu ircu 11zu 1o0u 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 1qMu WLu 1fAu 1cLu 1o0u 11zu NAu 3jXu zXu Dq0u 19Xu pcu jz0 cm10 19X0 6tB0 1fbu 3o0u jX0 4vB0 xz0 3Cp0 mmu 1a10 IMu Db0 4c10 uL0 1Nd0 An0 1SN0 uL0 mp0 28L0 iPB0 un0 1SN0 xz0 1zd0 Lz0 1zd0 Rb0 1zd0 On0 1wp0 Rb0 s8p0 1fB0 1ip0 11z0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 11z0|17e5",
			"America/Toronto|EST EDT EWT EPT|50 40 40 40|01010101010101010101010101010101010101010101012301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TR0 1in0 11Wu 1nzu 1fD0 WJ0 1wr0 Nb0 1Ap0 On0 1zd0 On0 1wp0 TX0 1tB0 TX0 1tB0 TX0 1tB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 4kM0 8x40 iv0 1o10 11z0 1nX0 11z0 1o10 11z0 1o10 1qL0 11D0 1nX0 11B0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e5",
			"America/New_York|EST EDT EWT EPT|50 40 40 40|01010101010101010101010101010101010101010101010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261t0 1nX0 11B0 1nX0 11B0 1qL0 1a10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x40 iv0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e6",
			"America/Nipigon|EST EDT EWT EPT|50 40 40 40|010123010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TR0 1in0 Rnb0 3je0 8x40 iv0 19yN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|16e2",
			"America/Nome|NST NWT NPT BST BDT YST AKST AKDT|b0 a0 a0 b0 a0 90 90 80|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17SX0 8wW0 iB0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cl0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|38e2",
			"America/Noronha|LMT -02 -01|29.E 20 10|0121212121212121212121212121212121212121|-2glxO.k HdKO.k 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|30e2",
			"America/North_Dakota/Beulah|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101014545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"America/North_Dakota/Center|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101014545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"America/North_Dakota/New_Salem|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101454545454545454545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"America/Ojinaga|LMT MST CST CDT MDT|6V.E 70 60 50 60|0121212323241414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 2zQN0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e3",
			"America/Pangnirtung|-00 AST AWT APT ADDT ADT EDT EST CST CDT|0 40 30 30 20 30 40 50 60 50|012314151515151515151515151515151515167676767689767676767676767676767676767676767676767676767676767676767676767676767676767|-1XiM0 PnG0 8x50 iu0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1o00 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2",
			"America/Paramaribo|LMT PMT PMT -0330 -03|3E.E 3E.Q 3E.A 3u 30|01234|-2nDUj.k Wqo0.c qanX.I 1yVXN.o|24e4",
			"America/Port-au-Prince|PPMT EST EDT|4N 50 40|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-28RHb 2FnMb 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14q0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 i6n0 1nX0 11B0 1nX0 d430 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 3iN0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5",
			"America/Rio_Branco|LMT -05 -04|4v.c 50 40|01212121212121212121212121212121|-2glvs.M HdLs.M 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 NBd0 d5X0|31e4",
			"America/Porto_Velho|LMT -04 -03|4f.A 40 30|012121212121212121212121212121|-2glvI.o HdKI.o 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0|37e4",
			"America/Punta_Arenas|SMT -05 -04 -03|4G.K 50 40 30|0102021212121212121232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-2q2jh.e fJAh.e 5knG.K 1Vzh.e jRAG.K 1pbh.e 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 nHX0 op0 blz0 ko0 Qeo0 WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|",
			"America/Rainy_River|CST CDT CWT CPT|60 50 50 50|010123010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TQ0 1in0 Rnb0 3je0 8x30 iw0 19yN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|842",
			"America/Rankin_Inlet|-00 CST CDDT CDT EST|0 60 40 50 50|012131313131313131313131313131313131313131313431313131313131313131313131313131313131313131313131313131313131313131313131|-vDc0 keu0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e2",
			"America/Recife|LMT -03 -02|2j.A 30 20|0121212121212121212121212121212121212121|-2glxE.o HdLE.o 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|33e5",
			"America/Regina|LMT MST MDT MWT MPT CST|6W.A 70 60 60 60 60|012121212121212121212121341212121212121212121212121215|-2AD51.o uHe1.o 1in0 s2L0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 66N0 1cL0 1cN0 19X0 1fB0 1cL0 1fB0 1cL0 1cN0 1cL0 M30 8x20 ix0 1ip0 1cL0 1ip0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 3NB0 1cL0 1cN0|19e4",
			"America/Resolute|-00 CST CDDT CDT EST|0 60 40 50 50|012131313131313131313131313131313131313131313431313131313431313131313131313131313131313131313131313131313131313131313131|-SnA0 GWS0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|229",
			"America/Santarem|LMT -04 -03|3C.M 40 30|0121212121212121212121212121212|-2glwl.c HdLl.c 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 NBd0|21e4",
			"America/Santiago|SMT -05 -04 -03|4G.K 50 40 30|010202121212121212321232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-2q2jh.e fJAh.e 5knG.K 1Vzh.e jRAG.K 1pbh.e 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 nHX0 op0 9Bz0 jb0 1oN0 ko0 Qeo0 WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0|62e5",
			"America/Santo_Domingo|SDMT EST EDT -0430 AST|4E 50 40 4u 40|01213131313131414|-1ttjk 1lJMk Mn0 6sp0 Lbu 1Cou yLu 1RAu wLu 1QMu xzu 1Q0u xXu 1PAu 13jB0 e00|29e5",
			"America/Sao_Paulo|LMT -03 -02|36.s 30 20|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glwR.w HdKR.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 pTd0 PX0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|20e6",
			"America/Scoresbysund|LMT -02 -01 +00|1r.Q 20 10 0|0121323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2a5Ww.8 2z5ew.8 1a00 1cK0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|452",
			"America/Sitka|PST PWT PPT PDT YST AKST AKDT|80 70 70 70 90 90 80|01203030303030303030303030303030345656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|90e2",
			"America/St_Johns|NST NDT NST NDT NWT NPT NDDT|3u.Q 2u.Q 3u 2u 2u 2u 1u|01010101010101010101010101010101010102323232323232324523232323232323232323232323232323232323232323232323232323232323232323232323232323232326232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-28oit.8 14L0 1nB0 1in0 1gm0 Dz0 1JB0 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 1cL0 1fB0 19X0 1fB0 19X0 10O0 eKX.8 19X0 1iq0 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 WL0 1qN0 WL0 1qN0 7UHu itu 1tB0 WL0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1tB0 WL0 1ld0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4",
			"America/Swift_Current|LMT MST MDT MWT MPT CST|7b.k 70 60 60 60 60|012134121212121212121215|-2AD4M.E uHdM.E 1in0 UGp0 8x20 ix0 1o10 17b0 1ip0 11z0 1o10 11z0 1o10 11z0 isN0 1cL0 3Cp0 1cL0 1cN0 11z0 1qN0 WL0 pMp0|16e3",
			"America/Tegucigalpa|LMT CST CDT|5M.Q 60 50|01212121|-1WGGb.8 2ETcb.8 WL0 1qN0 WL0 GRd0 AL0|11e5",
			"America/Thule|LMT AST ADT|4z.8 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a5To.Q 31NBo.Q 1cL0 1cN0 1cL0 1fB0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|656",
			"America/Thunder_Bay|CST EST EWT EPT EDT|60 50 40 40 40|0123141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141|-2q5S0 1iaN0 8x40 iv0 XNB0 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4",
			"America/Vancouver|PST PDT PWT PPT|80 70 70 70|0102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TO0 1in0 UGp0 8x10 iy0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5",
			"America/Whitehorse|YST YDT YWT YPT YDDT PST PDT MST|90 80 80 80 70 80 70 70|010102304056565656565656565656565656565656565656565656565656565656565656565656565656565656567|-25TN0 1in0 1o10 13V0 Ser0 8x00 iz0 LCL0 1fA0 3NA0 vrd0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1z90|23e3",
			"America/Winnipeg|CST CDT CWT CPT|60 50 50 50|010101023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aIi0 WL0 3ND0 1in0 Jap0 Rb0 aCN0 8x30 iw0 1tB0 11z0 1ip0 11z0 1o10 11z0 1o10 11z0 1rd0 10L0 1op0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 1cL0 1cN0 11z0 6i10 WL0 6i10 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|66e4",
			"America/Yakutat|YST YWT YPT YDT AKST AKDT|90 80 80 80 90 80|01203030303030303030303030303030304545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-17T10 8x00 iz0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cn0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|642",
			"America/Yellowknife|-00 MST MWT MPT MDDT MDT|0 70 60 60 50 60|012314151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151|-1pdA0 hix0 8x20 ix0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3",
			"Antarctica/Casey|-00 +08 +11|0 -80 -b0|0121212121212|-2q00 1DjS0 T90 40P0 KL0 blz0 3m10 1o30 14k0 1kr0 12l0 1o01|10",
			"Antarctica/Davis|-00 +07 +05|0 -70 -50|01012121|-vyo0 iXt0 alj0 1D7v0 VB0 3Wn0 KN0|70",
			"Pacific/Port_Moresby|+10|-a0|0||25e4",
			"Antarctica/Macquarie|AEST AEDT -00|-a0 -b0 0|010201010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-29E80 1a00 4SK0 1ayy0 Lvs0 1cM0 1o00 Rc0 1wo0 Rc0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 3Co0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|1",
			"Antarctica/Mawson|-00 +06 +05|0 -60 -50|012|-CEo0 2fyk0|60",
			"Pacific/Auckland|NZMT NZST NZST NZDT|-bu -cu -c0 -d0|01020202020202020202020202023232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-1GCVu Lz0 1tB0 11zu 1o0u 11zu 1o0u 11zu 1o0u 14nu 1lcu 14nu 1lcu 1lbu 11Au 1nXu 11Au 1nXu 11Au 1nXu 11Au 1nXu 11Au 1qLu WMu 1qLu 11Au 1n1bu IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00|14e5",
			"Antarctica/Palmer|-00 -03 -04 -02|0 30 40 20|0121212121213121212121212121212121212121212121212121212121212121212121212121212121|-cao0 nD0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 jsN0 14N0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|40",
			"Antarctica/Rothera|-00 -03|0 30|01|gOo0|130",
			"Asia/Riyadh|LMT +03|-36.Q -30|01|-TvD6.Q|57e5",
			"Antarctica/Troll|-00 +00 +02|0 0 -20|01212121212121212121212121212121212121212121212121212121212121212121|1puo0 hd0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|40",
			"Antarctica/Vostok|-00 +06|0 -60|01|-tjA0|25",
			"Europe/Oslo|CET CEST|-10 -20|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2awM0 Qm0 W6o0 5pf0 WM0 1fA0 1cM0 1cM0 1cM0 1cM0 wJc0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1qM0 WM0 zpc0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|62e4",
			"Asia/Almaty|LMT +05 +06 +07|-57.M -50 -60 -70|012323232323232323232321232323232323232323232323232|-1Pc57.M eUo7.M 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|15e5",
			"Asia/Amman|LMT EET EEST|-2n.I -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1yW2n.I 1HiMn.I KL0 1oN0 11b0 1oN0 11b0 1pd0 1dz0 1cp0 11b0 1op0 11b0 fO10 1db0 1e10 1cL0 1cN0 1cL0 1cN0 1fz0 1pd0 10n0 1ld0 14n0 1hB0 15b0 1ip0 19X0 1cN0 1cL0 1cN0 17b0 1ld0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1So0 y00 1fc0 1dc0 1co0 1dc0 1cM0 1cM0 1cM0 1o00 11A0 1lc0 17c0 1cM0 1cM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 4bX0 Dd0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 LA0 1C00 LA0 1C00 Oo0 1zc0 Oo0 1C00 LA0 1C00 LA0 1C00 LA0 1C00 LA0 1C00 Oo0 1zc0 Oo0 1C00 LA0 1C00 LA0 1C00 LA0 1C00 LA0 1C00 Oo0 1C00 LA0 1C00|25e5",
			"Asia/Anadyr|LMT +12 +13 +14 +11|-bN.U -c0 -d0 -e0 -b0|01232121212121212121214121212121212121212121212121212121212141|-1PcbN.U eUnN.U 23CL0 1db0 2q10 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|13e3",
			"Asia/Aqtau|LMT +04 +05 +06|-3l.4 -40 -50 -60|012323232323232323232123232312121212121212121212|-1Pc3l.4 eUnl.4 24PX0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|15e4",
			"Asia/Aqtobe|LMT +04 +05 +06|-3M.E -40 -50 -60|0123232323232323232321232323232323232323232323232|-1Pc3M.E eUnM.E 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|27e4",
			"Asia/Ashgabat|LMT +04 +05 +06|-3R.w -40 -50 -60|0123232323232323232323212|-1Pc3R.w eUnR.w 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0|41e4",
			"Asia/Atyrau|LMT +03 +05 +06 +04|-3r.I -30 -50 -60 -40|01232323232323232323242323232323232324242424242|-1Pc3r.I eUor.I 24PW0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 2sp0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|",
			"Asia/Baghdad|BMT +03 +04|-2V.A -30 -40|012121212121212121212121212121212121212121212121212121|-26BeV.A 2ACnV.A 11b0 1cp0 1dz0 1dd0 1db0 1cN0 1cp0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1de0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0|66e5",
			"Asia/Qatar|LMT +04 +03|-3q.8 -40 -30|012|-21Jfq.8 27BXq.8|96e4",
			"Asia/Baku|LMT +03 +04 +05|-3j.o -30 -40 -50|01232323232323232323232123232323232323232323232323232323232323232|-1Pc3j.o 1jUoj.o WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 9Je0 1o00 11z0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|27e5",
			"Asia/Bangkok|BMT +07|-6G.4 -70|01|-218SG.4|15e6",
			"Asia/Barnaul|LMT +06 +07 +08|-5z -60 -70 -80|0123232323232323232323212323232321212121212121212121212121212121212|-21S5z pCnz 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 p90 LE0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|",
			"Asia/Beirut|EET EEST|-20 -30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-21aq0 1on0 1410 1db0 19B0 1in0 1ip0 WL0 1lQp0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 q6N0 En0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1op0 11b0 dA10 17b0 1iN0 17b0 1iN0 17b0 1iN0 17b0 1vB0 SL0 1mp0 13z0 1iN0 17b0 1iN0 17b0 1jd0 12n0 1a10 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0|22e5",
			"Asia/Bishkek|LMT +05 +06 +07|-4W.o -50 -60 -70|012323232323232323232321212121212121212121212121212|-1Pc4W.o eUnW.o 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2e00 1tX0 17b0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1cPu 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0|87e4",
			"Asia/Brunei|LMT +0730 +08|-7D.E -7u -80|012|-1KITD.E gDc9.E|42e4",
			"Asia/Kolkata|MMT IST +0630|-5l.a -5u -6u|012121|-2zOtl.a 1r2LP.a 1un0 HB0 7zX0|15e6",
			"Asia/Chita|LMT +08 +09 +10|-7x.Q -80 -90 -a0|012323232323232323232321232323232323232323232323232323232323232312|-21Q7x.Q pAnx.Q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3re0|33e4",
			"Asia/Choibalsan|LMT +07 +08 +10 +09|-7C -70 -80 -a0 -90|0123434343434343434343434343434343434343434343424242|-2APHC 2UkoC cKn0 1da0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 3Db0 h1f0 1cJ0 1cP0 1cJ0|38e3",
			"Asia/Shanghai|CST CDT|-80 -90|01010101010101010101010101010|-23uw0 18n0 OjB0 Rz0 11d0 1wL0 A10 8HX0 1G10 Tz0 1ip0 1jX0 1cN0 11b0 1oN0 aL0 1tU30 Rb0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0|23e6",
			"Asia/Colombo|MMT +0530 +06 +0630|-5j.w -5u -60 -6u|01231321|-2zOtj.w 1rFbN.w 1zzu 7Apu 23dz0 11zu n3cu|22e5",
			"Asia/Dhaka|HMT +0630 +0530 +06 +07|-5R.k -6u -5u -60 -70|0121343|-18LFR.k 1unn.k HB0 m6n0 2kxbu 1i00|16e6",
			"Asia/Damascus|LMT EET EEST|-2p.c -20 -30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-21Jep.c Hep.c 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1xRB0 11X0 1oN0 10L0 1pB0 11b0 1oN0 10L0 1mp0 13X0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 Nb0 1AN0 Nb0 bcp0 19X0 1gp0 19X0 3ld0 1xX0 Vd0 1Bz0 Sp0 1vX0 10p0 1dz0 1cN0 1cL0 1db0 1db0 1g10 1an0 1ap0 1db0 1fd0 1db0 1cN0 1db0 1dd0 1db0 1cp0 1dz0 1c10 1dX0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 19z0 1fB0 1qL0 11B0 1on0 Wp0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0|26e5",
			"Asia/Dili|LMT +08 +09|-8m.k -80 -90|01212|-2le8m.k 1dnXm.k 1nfA0 Xld0|19e4",
			"Asia/Dubai|LMT +04|-3F.c -40|01|-21JfF.c|39e5",
			"Asia/Dushanbe|LMT +05 +06 +07|-4z.c -50 -60 -70|012323232323232323232321|-1Pc4z.c eUnz.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2hB0|76e4",
			"Asia/Famagusta|LMT EET EEST +03|-2f.M -20 -30 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212312121212121212121212121212121212121212121|-1Vc2f.M 2a3cf.M 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 15U0 2Ks0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|",
			"Asia/Gaza|EET EEST IST IDT|-20 -30 -20 -30|010101010101010101010101010101010123232323232323232323232323232320101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1c2o0 MM0 iM0 4JA0 10o0 1pA0 10M0 1pA0 16o0 1jA0 16o0 1jA0 pBa0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 dW0 hfB0 Db0 1fB0 Rb0 bXB0 gM0 8Q00 IM0 1wo0 TX0 1HB0 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18N0 1bz0 19z0 1gp0 1610 1iL0 11z0 1o10 14o0 1lA1 SKX 1xd1 MKX 1AN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nA0 1210 1qL0 WN0 1qL0 WN0 1qL0 11c0 1on0 11B0 1o00 11A0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1nA0 1200 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1nA0 1200 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1qo0 Xc0 1qo0|18e5",
			"Asia/Hebron|EET EEST IST IDT|-20 -30 -20 -30|01010101010101010101010101010101012323232323232323232323232323232010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1c2o0 MM0 iM0 4JA0 10o0 1pA0 10M0 1pA0 16o0 1jA0 16o0 1jA0 pBa0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 dW0 hfB0 Db0 1fB0 Rb0 bXB0 gM0 8Q00 IM0 1wo0 TX0 1HB0 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18N0 1bz0 19z0 1gp0 1610 1iL0 12L0 1mN0 14o0 1lc0 Tb0 1xd1 MKX bB0 cn0 1cN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nA0 1210 1qL0 WN0 1qL0 WN0 1qL0 11c0 1on0 11B0 1o00 11A0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1nA0 1200 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1nA0 1200 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1qo0 Xc0 1qo0|25e4",
			"Asia/Ho_Chi_Minh|LMT PLMT +07 +08 +09|-76.E -76.u -70 -80 -90|0123423232|-2yC76.E bK00.a 1h7b6.u 5lz0 18o0 3Oq0 k5b0 aW00 BAM0|90e5",
			"Asia/Hong_Kong|LMT HKT HKST HKWT JST|-7A.G -80 -90 -8u -90|0123412121212121212121212121212121212121212121212121212121212121212121|-2CFH0 1taO0 Hc0 xUu 9tBu 11z0 1tDu Rc0 1wo0 11A0 1cM0 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1nX0 U10 1tz0 U10 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 Rd0 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 17d0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1cL0 6fd0 14n0|73e5",
			"Asia/Hovd|LMT +06 +07 +08|-66.A -60 -70 -80|012323232323232323232323232323232323232323232323232|-2APG6.A 2Uko6.A cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|81e3",
			"Asia/Irkutsk|IMT +07 +08 +09|-6V.5 -70 -80 -90|01232323232323232323232123232323232323232323232323232323232323232|-21zGV.5 pjXV.5 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4",
			"Europe/Istanbul|IMT EET EEST +03 +04|-1U.U -20 -30 -30 -40|0121212121212121212121212121212121212121212121234312121212121212121212121212121212121212121212121212121212121212123|-2ogNU.U dzzU.U 11b0 8tB0 1on0 1410 1db0 19B0 1in0 3Rd0 Un0 1oN0 11b0 zSN0 CL0 mp0 1Vz0 1gN0 8yn0 1yp0 ML0 1kp0 17b0 1ip0 17b0 1fB0 19X0 1ip0 19X0 1ip0 17b0 qdB0 38L0 1jd0 Tz0 l6O0 11A0 WN0 1qL0 TB0 1tX0 U10 1tz0 11B0 1in0 17d0 z90 cne0 pb0 2Cp0 1800 14o0 1dc0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1a00 1fA0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WO0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 Xc0 1qo0 WM0 1qM0 11A0 1o00 1200 1nA0 11A0 1tA0 U00 15w0|13e6",
			"Asia/Jakarta|BMT +0720 +0730 +09 +08 WIB|-77.c -7k -7u -90 -80 -70|01232425|-1Q0Tk luM0 mPzO 8vWu 6kpu 4PXu xhcu|31e6",
			"Asia/Jayapura|LMT +09 +0930 WIT|-9m.M -90 -9u -90|0123|-1uu9m.M sMMm.M L4nu|26e4",
			"Asia/Jerusalem|JMT IST IDT IDDT|-2k.E -20 -30 -40|01212121212121321212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-26Bek.E SyOk.E MM0 iM0 4JA0 10o0 1pA0 10M0 1pA0 16o0 1jA0 16o0 1jA0 3LA0 Eo0 oo0 1co0 1dA0 16o0 10M0 1jc0 1tA0 14o0 1cM0 1a00 11A0 1Nc0 Ao0 1Nc0 Ao0 1Ko0 LA0 1o00 WM0 EQK0 Db0 1fB0 Rb0 bXB0 gM0 8Q00 IM0 1wo0 TX0 1HB0 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 1hB0 1dX0 1ep0 1aL0 1eN0 17X0 1nf0 11z0 1tB0 19W0 1e10 17b0 1ep0 1gL0 18N0 1fz0 1eN0 17b0 1gq0 1gn0 19d0 1dz0 1c10 17X0 1hB0 1gn0 19d0 1dz0 1c10 17X0 1kp0 1dz0 1c10 1aL0 1eN0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0|81e4",
			"Asia/Kabul|+04 +0430|-40 -4u|01|-10Qs0|46e5",
			"Asia/Kamchatka|LMT +11 +12 +13|-ay.A -b0 -c0 -d0|012323232323232323232321232323232323232323232323232323232323212|-1SLKy.A ivXy.A 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|18e4",
			"Asia/Karachi|LMT +0530 +0630 +05 PKT PKST|-4s.c -5u -6u -50 -50 -60|012134545454|-2xoss.c 1qOKW.c 7zX0 eup0 LqMu 1fy00 1cL0 dK10 11b0 1610 1jX0|24e6",
			"Asia/Urumqi|LMT +06|-5O.k -60|01|-1GgtO.k|32e5",
			"Asia/Kathmandu|LMT +0530 +0545|-5F.g -5u -5J|012|-21JhF.g 2EGMb.g|12e5",
			"Asia/Khandyga|LMT +08 +09 +10 +11|-92.d -80 -90 -a0 -b0|0123232323232323232323212323232323232323232323232343434343434343432|-21Q92.d pAp2.d 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 qK0 yN0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|66e2",
			"Asia/Krasnoyarsk|LMT +06 +07 +08|-6b.q -60 -70 -80|01232323232323232323232123232323232323232323232323232323232323232|-21Hib.q prAb.q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|10e5",
			"Asia/Kuala_Lumpur|SMT +07 +0720 +0730 +09 +08|-6T.p -70 -7k -7u -90 -80|0123435|-2Bg6T.p 17anT.p l5XE 17bO 8Fyu 1so1u|71e5",
			"Asia/Kuching|LMT +0730 +08 +0820 +09|-7l.k -7u -80 -8k -90|0123232323232323242|-1KITl.k gDbP.k 6ynu AnE 1O0k AnE 1NAk AnE 1NAk AnE 1NAk AnE 1O0k AnE 1NAk AnE pAk 8Fz0|13e4",
			"Asia/Macau|LMT CST +09 +10 CDT|-7y.a -80 -90 -a0 -90|012323214141414141414141414141414141414141414141414141414141414141414141|-2CFHy.a 1uqKy.a PX0 1kn0 15B0 11b0 4Qq0 1oM0 11c0 1ko0 1u00 11A0 1cM0 11c0 1o00 11A0 1o00 11A0 1oo0 1400 1o00 11A0 1o00 U00 1tA0 U00 1wo0 Rc0 1wru U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 Rd0 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 17d0 1cK0 1cO0 1cK0 1cO0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1cL0 6fd0 14n0|57e4",
			"Asia/Magadan|LMT +10 +11 +12|-a3.c -a0 -b0 -c0|012323232323232323232321232323232323232323232323232323232323232312|-1Pca3.c eUo3.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Cq0|95e3",
			"Asia/Makassar|LMT MMT +08 +09 WITA|-7V.A -7V.A -80 -90 -80|01234|-21JjV.A vfc0 myLV.A 8ML0|15e5",
			"Asia/Manila|PST PDT JST|-80 -90 -90|010201010|-1kJI0 AL0 cK10 65X0 mXB0 vX0 VK10 1db0|24e6",
			"Asia/Nicosia|LMT EET EEST|-2d.s -20 -30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1Vc2d.s 2a3cd.s 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|32e4",
			"Asia/Novokuznetsk|LMT +06 +07 +08|-5M.M -60 -70 -80|012323232323232323232321232323232323232323232323232323232323212|-1PctM.M eULM.M 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|55e4",
			"Asia/Novosibirsk|LMT +06 +07 +08|-5v.E -60 -70 -80|0123232323232323232323212323212121212121212121212121212121212121212|-21Qnv.E pAFv.E 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 ml0 Os0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 4eN0|15e5",
			"Asia/Omsk|LMT +05 +06 +07|-4R.u -50 -60 -70|01232323232323232323232123232323232323232323232323232323232323232|-224sR.u pMLR.u 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|12e5",
			"Asia/Oral|LMT +03 +05 +06 +04|-3p.o -30 -50 -60 -40|01232323232323232424242424242424242424242424242|-1Pc3p.o eUop.o 23CK0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 1cM0 IM0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|27e4",
			"Asia/Pontianak|LMT PMT +0730 +09 +08 WITA WIB|-7h.k -7h.k -7u -90 -80 -80 -70|012324256|-2ua7h.k XE00 munL.k 8Rau 6kpu 4PXu xhcu Wqnu|23e4",
			"Asia/Pyongyang|LMT KST JST KST|-8n -8u -90 -90|012313|-2um8n 97XR 1lTzu 2Onc0 6BA0|29e5",
			"Asia/Qostanay|LMT +04 +05 +06|-4e.s -40 -50 -60|012323232323232323232123232323232323232323232323|-1Pc4e.s eUoe.s 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|",
			"Asia/Qyzylorda|LMT +04 +05 +06|-4l.Q -40 -50 -60|01232323232323232323232323232323232323232323232|-1Pc4l.Q eUol.Q 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 3ao0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 zQl0|73e4",
			"Asia/Rangoon|RMT +0630 +09|-6o.L -6u -90|0121|-21Jio.L SmnS.L 7j9u|48e5",
			"Asia/Sakhalin|LMT +09 +11 +12 +10|-9u.M -90 -b0 -c0 -a0|01232323232323232323232423232323232424242424242424242424242424242|-2AGVu.M 1BoMu.M 1qFa0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 2pB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|58e4",
			"Asia/Samarkand|LMT +04 +05 +06|-4r.R -40 -50 -60|01232323232323232323232|-1Pc4r.R eUor.R 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|36e4",
			"Asia/Seoul|LMT KST JST KST KDT KDT|-8r.Q -8u -90 -90 -a0 -9u|012343434343151515151515134343|-2um8r.Q 97XV.Q 1m1zu 6CM0 Fz0 1kN0 14n0 1kN0 14L0 1zd0 On0 69B0 2I0u OL0 1FB0 Rb0 1qN0 TX0 1tB0 TX0 1tB0 TX0 1tB0 TX0 2ap0 12FBu 11A0 1o00 11A0|23e6",
			"Asia/Srednekolymsk|LMT +10 +11 +12|-ae.Q -a0 -b0 -c0|01232323232323232323232123232323232323232323232323232323232323232|-1Pcae.Q eUoe.Q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|35e2",
			"Asia/Taipei|CST JST CDT|-80 -90 -90|01020202020202020202020202020202020202020|-1iw80 joM0 1yo0 Tz0 1ip0 1jX0 1cN0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 10N0 1BX0 10p0 1pz0 10p0 1pz0 10p0 1db0 1dd0 1db0 1cN0 1db0 1cN0 1db0 1cN0 1db0 1BB0 ML0 1Bd0 ML0 uq10 1db0 1cN0 1db0 97B0 AL0|74e5",
			"Asia/Tashkent|LMT +05 +06 +07|-4B.b -50 -60 -70|012323232323232323232321|-1Pc4B.b eUnB.b 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0|23e5",
			"Asia/Tbilisi|TBMT +03 +04 +05|-2X.b -30 -40 -50|0123232323232323232323212121232323232323232323212|-1Pc2X.b 1jUnX.b WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cK0 1cL0 1cN0 1cL0 1cN0 2pz0 1cL0 1fB0 3Nz0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 An0 Os0 WM0|11e5",
			"Asia/Tehran|LMT TMT +0330 +04 +05 +0430|-3p.I -3p.I -3u -40 -50 -4u|01234325252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-2btDp.I 1d3c0 1huLT.I TXu 1pz0 sN0 vAu 1cL0 1dB0 1en0 pNB0 UL0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 64p0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0|14e6",
			"Asia/Thimphu|LMT +0530 +06|-5W.A -5u -60|012|-Su5W.A 1BGMs.A|79e3",
			"Asia/Tokyo|JST JDT|-90 -a0|010101010|-QJJ0 Rc0 1lc0 14o0 1zc0 Oo0 1zc0 Oo0|38e6",
			"Asia/Tomsk|LMT +06 +07 +08|-5D.P -60 -70 -80|0123232323232323232323212323232323232323232323212121212121212121212|-21NhD.P pxzD.P 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 co0 1bB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Qp0|10e5",
			"Asia/Ulaanbaatar|LMT +07 +08 +09|-77.w -70 -80 -90|012323232323232323232323232323232323232323232323232|-2APH7.w 2Uko7.w cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|12e5",
			"Asia/Ust-Nera|LMT +08 +09 +12 +11 +10|-9w.S -80 -90 -c0 -b0 -a0|012343434343434343434345434343434343434343434343434343434343434345|-21Q9w.S pApw.S 23CL0 1d90 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|65e2",
			"Asia/Vladivostok|LMT +09 +10 +11|-8L.v -90 -a0 -b0|01232323232323232323232123232323232323232323232323232323232323232|-1SJIL.v itXL.v 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4",
			"Asia/Yakutsk|LMT +08 +09 +10|-8C.W -80 -90 -a0|01232323232323232323232123232323232323232323232323232323232323232|-21Q8C.W pAoC.W 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|28e4",
			"Asia/Yekaterinburg|LMT PMT +04 +05 +06|-42.x -3J.5 -40 -50 -60|012343434343434343434343234343434343434343434343434343434343434343|-2ag42.x 7mQh.s qBvJ.5 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|14e5",
			"Asia/Yerevan|LMT +03 +04 +05|-2W -30 -40 -50|0123232323232323232323212121212323232323232323232323232323232|-1Pc2W 1jUnW WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 4RX0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|13e5",
			"Atlantic/Azores|HMT -02 -01 +00 WET|1S.w 20 10 0 0|0121212121212121212121212121212121212121212123212321232123212121212121212121212121212121212121212121232323232323232323232323232323234323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2ldW0 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 qIl0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|25e4",
			"Atlantic/Bermuda|BMT BST AST ADT|4j.i 3j.i 40 30|010102323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-28p7E.G 1bb0 1i10 11X0 ru30 thbE.G 1PX0 11B0 1tz0 Rd0 1zb0 Op0 1zb0 3I10 Lz0 1EN0 FX0 1HB0 FX0 1Kp0 Db0 1Kp0 Db0 1Kp0 FX0 93d0 11z0 GAp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e3",
			"Atlantic/Canary|LMT -01 WET WEST|11.A 10 0 -10|01232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UtaW.o XPAW.o 1lAK0 1a10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4",
			"Atlantic/Cape_Verde|LMT -02 -01|1y.4 20 10|01212|-2ldW0 1eEo0 7zX0 1djf0|50e4",
			"Atlantic/Faroe|LMT WET WEST|r.4 0 -10|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2uSnw.U 2Wgow.U 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|49e3",
			"Atlantic/Madeira|FMT -01 +00 +01 WET WEST|17.A 10 0 -10 0 -10|0121212121212121212121212121212121212121212123212321232123212121212121212121212121212121212121212121454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-2ldX0 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 qIl0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|27e4",
			"Atlantic/Reykjavik|LMT -01 +00 GMT|1s 10 0 0|012121212121212121212121212121212121212121212121212121212121212121213|-2uWmw mfaw 1Bd0 ML0 1LB0 Cn0 1LB0 3fX0 C10 HrX0 1cO0 LB0 1EL0 LA0 1C00 Oo0 1wo0 Rc0 1wo0 Rc0 1wo0 Rc0 1zc0 Oo0 1zc0 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0|12e4",
			"Atlantic/South_Georgia|-02|20|0||30",
			"Atlantic/Stanley|SMT -04 -03 -02|3P.o 40 30 20|012121212121212323212121212121212121212121212121212121212121212121212|-2kJw8.A 12bA8.A 19X0 1fB0 19X0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 Cn0 1Cc10 WL0 1qL0 U10 1tz0 2mN0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 U10 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qN0 U10 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 U10 1tz0 U10 1tz0 U10|21e2",
			"Australia/Sydney|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293k0 xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00 17c00 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|40e5",
			"Australia/Adelaide|ACST ACDT|-9u -au|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293ju xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00 17c00 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 WM0 1qM0 Rc0 1zc0 U00 1tA0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|11e5",
			"Australia/Brisbane|AEST AEDT|-a0 -b0|01010101010101010|-293k0 xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00 17c00 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0|20e5",
			"Australia/Broken_Hill|ACST ACDT|-9u -au|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293ju xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00 17c00 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|18e3",
			"Australia/Hobart|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-29E80 1a00 1qM0 Oo0 1zc0 Oo0 TAo0 yM0 1cM0 1cM0 1fA0 1a00 VfA0 1cM0 1o00 Rc0 1wo0 Rc0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|21e4",
			"Australia/Darwin|ACST ACDT|-9u -au|010101010|-293ju xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00|12e4",
			"Australia/Eucla|+0845 +0945|-8J -9J|0101010101010101010|-293iJ xc0 10jc0 yM0 1cM0 1cM0 1gSo0 Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|368",
			"Australia/Lord_Howe|AEST +1030 +1130 +11|-a0 -au -bu -b0|0121212121313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313|raC0 1zdu Rb0 1zd0 On0 1zd0 On0 1zd0 On0 1zd0 TXu 1qMu WLu 1tAu WLu 1tAu TXu 1tAu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu 11zu 1o0u 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 11Au 1nXu 1qMu 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 1qMu 11zu 1o0u WLu 1qMu 14nu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu|347",
			"Australia/Lindeman|AEST AEDT|-a0 -b0|010101010101010101010|-293k0 xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00 17c00 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0|10",
			"Australia/Melbourne|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293k0 xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00 17c00 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1qM0 11A0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|39e5",
			"Australia/Perth|AWST AWDT|-80 -90|0101010101010101010|-293i0 xc0 10jc0 yM0 1cM0 1cM0 1gSo0 Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|18e5",
			"CET|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|",
			"Pacific/Easter|EMT -07 -06 -05|7h.s 70 60 50|012121212121212121212121212123232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-1uSgG.w 1s4IG.w WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 2pA0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0|30e2",
			"CST6CDT|CST CDT CWT CPT|60 50 50 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"EET|EET EEST|-20 -30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|",
			"Europe/Dublin|DMT IST GMT BST IST|p.l -y.D 0 -10 -10|01232323232324242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242|-2ax9y.D Rc0 1fzy.D 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 g600 14o0 1wo0 17c0 1io0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1a00 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1tA0 IM0 90o0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
			"EST|EST|50|0||",
			"EST5EDT|EST EDT EWT EPT|50 40 40 40|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261t0 1nX0 11B0 1nX0 SgN0 8x40 iv0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"Etc/GMT-0|GMT|0|0||",
			"Etc/GMT-1|+01|-10|0||",
			"Etc/GMT-11|+11|-b0|0||",
			"Pacific/Tarawa|+12|-c0|0||29e3",
			"Etc/GMT-13|+13|-d0|0||",
			"Etc/GMT-14|+14|-e0|0||",
			"Etc/GMT-2|+02|-20|0||",
			"Etc/GMT-3|+03|-30|0||",
			"Etc/GMT-4|+04|-40|0||",
			"Etc/GMT-5|+05|-50|0||",
			"Etc/GMT-6|+06|-60|0||",
			"Indian/Christmas|+07|-70|0||21e2",
			"Etc/GMT-8|+08|-80|0||",
			"Pacific/Palau|+09|-90|0||21e3",
			"Etc/GMT+1|-01|10|0||",
			"Etc/GMT+10|-10|a0|0||",
			"Etc/GMT+11|-11|b0|0||",
			"Etc/GMT+12|-12|c0|0||",
			"Etc/GMT+3|-03|30|0||",
			"Etc/GMT+4|-04|40|0||",
			"Etc/GMT+5|-05|50|0||",
			"Etc/GMT+6|-06|60|0||",
			"Etc/GMT+7|-07|70|0||",
			"Etc/GMT+8|-08|80|0||",
			"Etc/GMT+9|-09|90|0||",
			"Etc/UTC|UTC|0|0||",
			"Europe/Amsterdam|AMT NST +0120 +0020 CEST CET|-j.w -1j.w -1k -k -20 -10|010101010101010101010101010101010101010101012323234545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545|-2aFcj.w 11b0 1iP0 11A0 1io0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1co0 1io0 1yo0 Pc0 1a00 1fA0 1Bc0 Mo0 1tc0 Uo0 1tA0 U00 1uo0 W00 1s00 VA0 1so0 Vc0 1sM0 UM0 1wo0 Rc0 1u00 Wo0 1rA0 W00 1s00 VA0 1sM0 UM0 1w00 fV0 BCX.w 1tA0 U00 1u00 Wo0 1sm0 601k WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|16e5",
			"Europe/Andorra|WET CET CEST|0 -10 -20|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-UBA0 1xIN0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|79e3",
			"Europe/Astrakhan|LMT +03 +04 +05|-3c.c -30 -40 -50|012323232323232323212121212121212121212121212121212121212121212|-1Pcrc.c eUMc.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|10e5",
			"Europe/Athens|AMT EET EEST CEST CET|-1y.Q -20 -30 -20 -10|012123434121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a61x.Q CNbx.Q mn0 kU10 9b0 3Es0 Xa0 1fb0 1dd0 k3X0 Nz0 SCp0 1vc0 SO0 1cM0 1a00 1ao0 1fc0 1a10 1fG0 1cg0 1dX0 1bX0 1cQ0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|35e5",
			"Europe/London|GMT BST BDST|0 -10 -20|0101010101010101010101010101010101010101010101010121212121210101210101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2axa0 Rc0 1fA0 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 2Rz0 Dc0 1zc0 Oo0 1zc0 Rc0 1wo0 17c0 1iM0 FA0 xB0 1fA0 1a00 14o0 bb0 LA0 xB0 Rc0 1wo0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1a00 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1tA0 IM0 90o0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|10e6",
			"Europe/Belgrade|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-19RC0 3IP0 WM0 1fA0 1cM0 1cM0 1rc0 Qo0 1vmo0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
			"Europe/Berlin|CET CEST CEMT|-10 -20 -30|01010101010101210101210101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 kL0 Nc0 m10 WM0 1ao0 1cp0 dX0 jz0 Dd0 1io0 17c0 1fA0 1a00 1ehA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|41e5",
			"Europe/Prague|CET CEST GMT|-10 -20 0|01010101010101010201010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 1cM0 1qM0 11c0 mp0 xA0 mn0 17c0 1io0 17c0 1fc0 1ao0 1bNc0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|13e5",
			"Europe/Brussels|WET CET CEST WEST|0 -10 -20 -10|0121212103030303030303030303030303030303030303030303212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2ehc0 3zX0 11c0 1iO0 11A0 1o00 11A0 my0 Ic0 1qM0 Rc0 1EM0 UM0 1u00 10o0 1io0 1io0 17c0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a30 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 y00 5Wn0 WM0 1fA0 1cM0 16M0 1iM0 16M0 1C00 Uo0 1eeo0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|21e5",
			"Europe/Bucharest|BMT EET EEST|-1I.o -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1xApI.o 20LI.o RA0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Axc0 On0 1fA0 1a10 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|19e5",
			"Europe/Budapest|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 1oo0 11c0 1lc0 17c0 O1V0 3Nf0 WM0 1fA0 1cM0 1cM0 1oJ0 1dd0 1020 1fX0 1cp0 1cM0 1cM0 1cM0 1fA0 1a00 bhy0 Rb0 1wr0 Rc0 1C00 LA0 1C00 LA0 SNW0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cO0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e5",
			"Europe/Zurich|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-19Lc0 11A0 1o00 11A0 1xG10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|38e4",
			"Europe/Chisinau|CMT BMT EET EEST CEST CET MSK MSD|-1T -1I.o -20 -30 -20 -10 -30 -40|012323232323232323234545467676767676767676767323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-26jdT wGMa.A 20LI.o RA0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 27A0 2en0 39g0 WM0 1fA0 1cM0 V90 1t7z0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 gL0 WO0 1cM0 1cM0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11D0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|67e4",
			"Europe/Copenhagen|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2azC0 Tz0 VuO0 60q0 WM0 1fA0 1cM0 1cM0 1cM0 S00 1HA0 Nc0 1C00 Dc0 1Nc0 Ao0 1h5A0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
			"Europe/Gibraltar|GMT BST BDST CET CEST|0 -10 -20 -10 -20|010101010101010101010101010101010101010101010101012121212121010121010101010101010101034343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-2axa0 Rc0 1fA0 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 2Rz0 Dc0 1zc0 Oo0 1zc0 Rc0 1wo0 17c0 1iM0 FA0 xB0 1fA0 1a00 14o0 bb0 LA0 xB0 Rc0 1wo0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 10Jz0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|30e3",
			"Europe/Helsinki|HMT EET EEST|-1D.N -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1WuND.N OULD.N 1dA0 1xGq0 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
			"Europe/Kaliningrad|CET CEST EET EEST MSK MSD +03|-10 -20 -20 -30 -30 -40 -30|01010101010101232454545454545454543232323232323232323232323232323232323232323262|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 390 7A0 1en0 12N0 1pbb0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|44e4",
			"Europe/Kiev|KMT EET MSK CEST CET MSD EEST|-22.4 -20 -30 -20 -10 -40 -30|0123434252525252525252525256161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161|-1Pc22.4 eUo2.4 rnz0 2Hg0 WM0 1fA0 da0 1v4m0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 Db0 3220 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|34e5",
			"Europe/Kirov|LMT +03 +04 +05|-3i.M -30 -40 -50|01232323232323232321212121212121212121212121212121212121212121|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|48e4",
			"Europe/Lisbon|LMT WET WEST WEMT CET CEST|A.J 0 -10 -20 -10 -20|01212121212121212121212121212121212121212121232123212321232121212121212121212121212121212121212121214121212121212121212121212121212124545454212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2le00 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 pvy0 1cM0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|27e5",
			"Europe/Luxembourg|LMT CET CEST WET WEST WEST WET|-o.A -10 -20 0 -10 -20 -10|0121212134343434343434343434343434343434343434343434565651212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2DG0o.A t6mo.A TB0 1nX0 Up0 1o20 11A0 rW0 CM0 1qP0 R90 1EO0 UK0 1u20 10m0 1ip0 1in0 17e0 19W0 1fB0 1db0 1cp0 1in0 17d0 1fz0 1a10 1in0 1a10 1in0 17f0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 vA0 60L0 WM0 1fA0 1cM0 17c0 1io0 16M0 1C00 Uo0 1eeo0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4",
			"Europe/Madrid|WET WEST WEMT CET CEST|0 -10 -20 -10 -20|010101010101010101210343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-25Td0 19B0 1cL0 1dd0 b1z0 18p0 3HX0 17d0 1fz0 1a10 1io0 1a00 1in0 17d0 iIn0 Hd0 1cL0 bb0 1200 2s20 14n0 5aL0 Mp0 1vz0 17d0 1in0 17d0 1in0 17d0 1in0 17d0 6hX0 11B0 XHX0 1a10 1fz0 1a10 19X0 1cN0 1fz0 1a10 1fC0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|62e5",
			"Europe/Malta|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2arB0 Lz0 1cN0 1db0 1410 1on0 Wp0 1qL0 17d0 1cL0 M3B0 5M20 WM0 1fA0 1co0 17c0 1iM0 16m0 1de0 1lc0 14m0 1lc0 WO0 1qM0 GTW0 On0 1C10 LA0 1C00 LA0 1EM0 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1co0 1cM0 1lA0 Xc0 1qq0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1iN0 19z0 1fB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|42e4",
			"Europe/Minsk|MMT EET MSK CEST CET MSD EEST +03|-1O -20 -30 -20 -10 -40 -30 -30|01234343252525252525252525261616161616161616161616161616161616161617|-1Pc1O eUnO qNX0 3gQ0 WM0 1fA0 1cM0 Al0 1tsn0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 3Fc0 1cN0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0|19e5",
			"Europe/Monaco|PMT WET WEST WEMT CET CEST|-9.l 0 -10 -20 -10 -20|01212121212121212121212121212121212121212121212121232323232345454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-2n5c9.l cFX9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 1u00 10o0 1io0 1wo0 Rc0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Df0 2RV0 11z0 11B0 1ze0 WM0 1fA0 1cM0 1fa0 1aq0 16M0 1ekn0 1cL0 1fC0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|38e3",
			"Europe/Moscow|MMT MMT MST MDST MSD MSK +05 EET EEST MSK|-2u.h -2v.j -3v.j -4v.j -40 -30 -50 -20 -30 -40|012132345464575454545454545454545458754545454545454545454545454545454545454595|-2ag2u.h 2pyW.W 1bA0 11X0 GN0 1Hb0 c4v.j ik0 3DA0 dz0 15A0 c10 2q10 iM10 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|16e6",
			"Europe/Paris|PMT WET WEST CEST CET WEMT|-9.l 0 -10 -20 -10 -20|0121212121212121212121212121212121212121212121212123434352543434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434|-2nco9.l cNb9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 1u00 10o0 1io0 1wo0 Rc0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Df0 Ik0 5M30 WM0 1fA0 1cM0 Vx0 hB0 1aq0 16M0 1ekn0 1cL0 1fC0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|11e6",
			"Europe/Riga|RMT LST EET MSK CEST CET MSD EEST|-1A.y -2A.y -20 -30 -20 -10 -40 -30|010102345454536363636363636363727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272|-25TzA.y 11A0 1iM0 ko0 gWm0 yDXA.y 2bX0 3fE0 WM0 1fA0 1cM0 1cM0 4m0 1sLy0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 1o00 11A0 1o00 11A0 1qM0 3oo0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|64e4",
			"Europe/Rome|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2arB0 Lz0 1cN0 1db0 1410 1on0 Wp0 1qL0 17d0 1cL0 M3B0 5M20 WM0 1fA0 1cM0 16M0 1iM0 16m0 1de0 1lc0 14m0 1lc0 WO0 1qM0 GTW0 On0 1C10 LA0 1C00 LA0 1EM0 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1C00 LA0 1zc0 Oo0 1C00 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1zc0 Oo0 1fC0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|39e5",
			"Europe/Samara|LMT +03 +04 +05|-3k.k -30 -40 -50|0123232323232323232121232323232323232323232323232323232323212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2y10 14m0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|12e5",
			"Europe/Saratov|LMT +03 +04 +05|-34.i -30 -40 -50|012323232323232321212121212121212121212121212121212121212121212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 5810|",
			"Europe/Simferopol|SMT EET MSK CEST CET MSD EEST MSK|-2g -20 -30 -20 -10 -40 -30 -40|012343432525252525252525252161616525252616161616161616161616161616161616172|-1Pc2g eUog rEn0 2qs0 WM0 1fA0 1cM0 3V0 1u0L0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 4eL0 1cL0 1cN0 1cL0 1cN0 dX0 WL0 1cN0 1cL0 1fB0 1o30 11B0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11z0 1nW0|33e4",
			"Europe/Sofia|EET CET CEST EEST|-20 -10 -20 -30|01212103030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030|-168L0 WM0 1fA0 1cM0 1cM0 1cN0 1mKH0 1dd0 1fb0 1ap0 1fb0 1a20 1fy0 1a30 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5",
			"Europe/Stockholm|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2azC0 TB0 2yDe0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|15e5",
			"Europe/Tallinn|TMT CET CEST EET MSK MSD EEST|-1D -10 -20 -20 -30 -40 -30|012103421212454545454545454546363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363|-26oND teD 11A0 1Ta0 4rXl KSLD 2FX0 2Jg0 WM0 1fA0 1cM0 18J0 1sTX0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o10 11A0 1qM0 5QM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|41e4",
			"Europe/Tirane|LMT CET CEST|-1j.k -10 -20|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glBj.k 14pcj.k 5LC0 WM0 4M0 1fCK0 10n0 1op0 11z0 1pd0 11z0 1qN0 WL0 1qp0 Xb0 1qp0 Xb0 1qp0 11z0 1lB0 11z0 1qN0 11z0 1iN0 16n0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|42e4",
			"Europe/Ulyanovsk|LMT +03 +04 +05 +02|-3d.A -30 -40 -50 -20|01232323232323232321214121212121212121212121212121212121212121212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|13e5",
			"Europe/Uzhgorod|CET CEST MSK MSD EET EEST|-10 -20 -30 -40 -20 -30|010101023232323232323232320454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-1cqL0 6i00 WM0 1fA0 1cM0 1ml0 1Cp0 1r3W0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 1Nf0 2pw0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|11e4",
			"Europe/Vienna|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 3KM0 14o0 LA00 6i00 WM0 1fA0 1cM0 1cM0 1cM0 400 2qM0 1ao0 1co0 1cM0 1io0 17c0 1gHa0 19X0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|18e5",
			"Europe/Vilnius|WMT KMT CET EET MSK CEST MSD EEST|-1o -1z.A -10 -20 -30 -20 -40 -30|012324525254646464646464646473737373737373737352537373737373737373737373737373737373737373737373737373737373737373737373|-293do 6ILM.o 1Ooz.A zz0 Mfd0 29W0 3is0 WM0 1fA0 1cM0 LV0 1tgL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11B0 1o00 11A0 1qM0 8io0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4",
			"Europe/Volgograd|LMT +03 +04 +05|-2V.E -30 -40 -50|0123232323232323212121212121212121212121212121212121212121212121|-21IqV.E psLV.E 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 9Jd0 5gn0|10e5",
			"Europe/Warsaw|WMT CET CEST EET EEST|-1o -10 -20 -20 -30|012121234312121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2ctdo 1LXo 11d0 1iO0 11A0 1o00 11A0 1on0 11A0 6zy0 HWP0 5IM0 WM0 1fA0 1cM0 1dz0 1mL0 1en0 15B0 1aq0 1nA0 11A0 1io0 17c0 1fA0 1a00 iDX0 LA0 1cM0 1cM0 1C00 Oo0 1cM0 1cM0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1C00 LA0 uso0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e5",
			"Europe/Zaporozhye|+0220 EET MSK CEST CET MSD EEST|-2k -20 -30 -20 -10 -40 -30|01234342525252525252525252526161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161|-1Pc2k eUok rdb0 2RE0 WM0 1fA0 8m0 1v9a0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cK0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|77e4",
			"HST|HST|a0|0||",
			"Indian/Chagos|LMT +05 +06|-4N.E -50 -60|012|-2xosN.E 3AGLN.E|30e2",
			"Indian/Cocos|+0630|-6u|0||596",
			"Indian/Kerguelen|-00 +05|0 -50|01|-MG00|130",
			"Indian/Mahe|LMT +04|-3F.M -40|01|-2xorF.M|79e3",
			"Indian/Maldives|MMT +05|-4S -50|01|-olgS|35e4",
			"Indian/Mauritius|LMT +04 +05|-3O -40 -50|012121|-2xorO 34unO 14L0 12kr0 11z0|15e4",
			"Indian/Reunion|LMT +04|-3F.Q -40|01|-2mDDF.Q|84e4",
			"Pacific/Kwajalein|+11 +10 +09 -12 +12|-b0 -a0 -90 c0 -c0|012034|-1kln0 akp0 6Up0 12ry0 Wan0|14e3",
			"MET|MET MEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|",
			"MST|MST|70|0||",
			"MST7MDT|MST MDT MWT MPT|70 60 60 60|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"Pacific/Chatham|+1215 +1245 +1345|-cf -cJ -dJ|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-WqAf 1adef IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00|600",
			"Pacific/Apia|LMT -1130 -11 -10 +14 +13|bq.U bu b0 a0 -e0 -d0|01232345454545454545454545|-2nDMx.4 1yW03.4 2rRbu 1ff0 1a00 CI0 AQ0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0|37e3",
			"Pacific/Bougainville|+10 +09 +11|-a0 -90 -b0|0102|-16Wy0 7CN0 2MQp0|18e4",
			"Pacific/Chuuk|+10 +09|-a0 -90|01010|-2ewy0 axB0 RVX0 axd0|49e3",
			"Pacific/Efate|LMT +11 +12|-bd.g -b0 -c0|012121212121212121212121|-2l9nd.g 2uNXd.g Dc0 n610 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 Lz0 1Nd0 An0|66e3",
			"Pacific/Enderbury|-00 -12 -11 +13|0 c0 b0 -d0|0123|-1iIo0 1GsA0 B7X0|1",
			"Pacific/Fakaofo|-11 +13|b0 -d0|01|1Gfn0|483",
			"Pacific/Fiji|LMT +12 +13|-bT.I -c0 -d0|01212121212121212121212121212121212121212121212121212121212121|-2bUzT.I 3m8NT.I LA0 1EM0 IM0 nJc0 LA0 1o00 Rc0 1wo0 Ao0 1Nc0 Ao0 1Q00 xz0 1SN0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 20o0 pc0 2hc0 bc0 4q00 pc0 20o0 pc0 20o0 pc0 20o0 s00 1VA0 s00 20o0 pc0 20o0 pc0 20o0 pc0 20o0 pc0 20o0 s00 20o0 pc0 20o0 pc0 20o0 pc0 20o0 pc0 20o0 s00 1VA0 s00|88e4",
			"Pacific/Galapagos|LMT -05 -06|5W.o 50 60|01212|-1yVS1.A 2dTz1.A gNd0 rz0|25e3",
			"Pacific/Gambier|LMT -09|8X.M 90|01|-2jof0.c|125",
			"Pacific/Guadalcanal|LMT +11|-aD.M -b0|01|-2joyD.M|11e4",
			"Pacific/Guam|GST +09 GDT ChST|-a0 -90 -b0 -a0|01020202020202020203|-18jK0 6pB0 AhB0 3QL0 g2p0 3p91 WOX rX0 1zd0 Rb0 1wp0 Rb0 5xd0 rX0 5sN0 zb1 1C0X On0 ULb0|17e4",
			"Pacific/Honolulu|HST HDT HWT HPT HST|au 9u 9u 9u a0|0102304|-1thLu 8x0 lef0 8wWu iAu 46p0|37e4",
			"Pacific/Kiritimati|-1040 -10 +14|aE a0 -e0|012|nIaE B7Xk|51e2",
			"Pacific/Kosrae|+11 +09 +10 +12|-b0 -90 -a0 -c0|01021030|-2ewz0 axC0 HBy0 akp0 axd0 WOK0 1bdz0|66e2",
			"Pacific/Majuro|+11 +09 +10 +12|-b0 -90 -a0 -c0|0102103|-2ewz0 axC0 HBy0 akp0 6RB0 12um0|28e3",
			"Pacific/Marquesas|LMT -0930|9i 9u|01|-2joeG|86e2",
			"Pacific/Pago_Pago|LMT SST|bm.M b0|01|-2nDMB.c|37e2",
			"Pacific/Nauru|LMT +1130 +09 +12|-b7.E -bu -90 -c0|01213|-1Xdn7.E QCnB.E 7mqu 1lnbu|10e3",
			"Pacific/Niue|LMT -1120 -11|bj.E bk b0|012|-FScE.k suo0.k|12e2",
			"Pacific/Norfolk|+1112 +1130 +1230 +11 +12|-bc -bu -cu -b0 -c0|012134343434343434343434343434343434343434|-Kgbc W01G Oo0 1COo0 9Jcu 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|25e4",
			"Pacific/Noumea|LMT +11 +12|-b5.M -b0 -c0|01212121|-2l9n5.M 2EqM5.M xX0 1PB0 yn0 HeP0 Ao0|98e3",
			"Pacific/Pitcairn|-0830 -08|8u 80|01|18Vku|56",
			"Pacific/Pohnpei|+11 +09 +10|-b0 -90 -a0|010210|-2ewz0 axC0 HBy0 akp0 axd0|34e3",
			"Pacific/Rarotonga|LMT -1030 -0930 -10|aD.4 au 9u a0|0123232323232323232323232323|-FSdk.U 13tbO.U IL0 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu|13e3",
			"Pacific/Tahiti|LMT -10|9W.g a0|01|-2joe1.I|18e4",
			"Pacific/Tongatapu|LMT +1220 +13 +14|-cj.c -ck -d0 -e0|01232323232|-XbMj.c BgLX.c 1yndk 15A0 1wo0 xz0 1Q10 xz0 zWN0 s00|75e3",
			"PST8PDT|PST PDT PWT PPT|80 70 70 70|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261q0 1nX0 11B0 1nX0 SgN0 8x10 iy0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|",
			"WET|WET WEST|0 -10|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|"
		],
		"links": [
			"Africa/Abidjan|Africa/Accra",
			"Africa/Abidjan|Africa/Bamako",
			"Africa/Abidjan|Africa/Banjul",
			"Africa/Abidjan|Africa/Conakry",
			"Africa/Abidjan|Africa/Dakar",
			"Africa/Abidjan|Africa/Freetown",
			"Africa/Abidjan|Africa/Lome",
			"Africa/Abidjan|Africa/Nouakchott",
			"Africa/Abidjan|Africa/Ouagadougou",
			"Africa/Abidjan|Africa/Timbuktu",
			"Africa/Abidjan|Atlantic/St_Helena",
			"Africa/Cairo|Egypt",
			"Africa/Johannesburg|Africa/Maseru",
			"Africa/Johannesburg|Africa/Mbabane",
			"Africa/Lagos|Africa/Bangui",
			"Africa/Lagos|Africa/Brazzaville",
			"Africa/Lagos|Africa/Douala",
			"Africa/Lagos|Africa/Kinshasa",
			"Africa/Lagos|Africa/Libreville",
			"Africa/Lagos|Africa/Luanda",
			"Africa/Lagos|Africa/Malabo",
			"Africa/Lagos|Africa/Niamey",
			"Africa/Lagos|Africa/Porto-Novo",
			"Africa/Maputo|Africa/Blantyre",
			"Africa/Maputo|Africa/Bujumbura",
			"Africa/Maputo|Africa/Gaborone",
			"Africa/Maputo|Africa/Harare",
			"Africa/Maputo|Africa/Kigali",
			"Africa/Maputo|Africa/Lubumbashi",
			"Africa/Maputo|Africa/Lusaka",
			"Africa/Nairobi|Africa/Addis_Ababa",
			"Africa/Nairobi|Africa/Asmara",
			"Africa/Nairobi|Africa/Asmera",
			"Africa/Nairobi|Africa/Dar_es_Salaam",
			"Africa/Nairobi|Africa/Djibouti",
			"Africa/Nairobi|Africa/Kampala",
			"Africa/Nairobi|Africa/Mogadishu",
			"Africa/Nairobi|Indian/Antananarivo",
			"Africa/Nairobi|Indian/Comoro",
			"Africa/Nairobi|Indian/Mayotte",
			"Africa/Tripoli|Libya",
			"America/Adak|America/Atka",
			"America/Adak|US/Aleutian",
			"America/Anchorage|US/Alaska",
			"America/Argentina/Buenos_Aires|America/Buenos_Aires",
			"America/Argentina/Catamarca|America/Argentina/ComodRivadavia",
			"America/Argentina/Catamarca|America/Catamarca",
			"America/Argentina/Cordoba|America/Cordoba",
			"America/Argentina/Cordoba|America/Rosario",
			"America/Argentina/Jujuy|America/Jujuy",
			"America/Argentina/Mendoza|America/Mendoza",
			"America/Chicago|US/Central",
			"America/Denver|America/Shiprock",
			"America/Denver|Navajo",
			"America/Denver|US/Mountain",
			"America/Detroit|US/Michigan",
			"America/Edmonton|Canada/Mountain",
			"America/Fort_Wayne|America/Indiana/Indianapolis",
			"America/Fort_Wayne|America/Indianapolis",
			"America/Fort_Wayne|US/East-Indiana",
			"America/Godthab|America/Nuuk",
			"America/Halifax|Canada/Atlantic",
			"America/Havana|Cuba",
			"America/Indiana/Knox|America/Knox_IN",
			"America/Indiana/Knox|US/Indiana-Starke",
			"America/Jamaica|Jamaica",
			"America/Kentucky/Louisville|America/Louisville",
			"America/Los_Angeles|US/Pacific",
			"America/Manaus|Brazil/West",
			"America/Mazatlan|Mexico/BajaSur",
			"America/Mexico_City|Mexico/General",
			"America/New_York|US/Eastern",
			"America/Noronha|Brazil/DeNoronha",
			"America/Panama|America/Atikokan",
			"America/Panama|America/Cayman",
			"America/Panama|America/Coral_Harbour",
			"America/Phoenix|America/Creston",
			"America/Phoenix|US/Arizona",
			"America/Puerto_Rico|America/Anguilla",
			"America/Puerto_Rico|America/Antigua",
			"America/Puerto_Rico|America/Aruba",
			"America/Puerto_Rico|America/Blanc-Sablon",
			"America/Puerto_Rico|America/Curacao",
			"America/Puerto_Rico|America/Dominica",
			"America/Puerto_Rico|America/Grenada",
			"America/Puerto_Rico|America/Guadeloupe",
			"America/Puerto_Rico|America/Kralendijk",
			"America/Puerto_Rico|America/Lower_Princes",
			"America/Puerto_Rico|America/Marigot",
			"America/Puerto_Rico|America/Montserrat",
			"America/Puerto_Rico|America/Port_of_Spain",
			"America/Puerto_Rico|America/St_Barthelemy",
			"America/Puerto_Rico|America/St_Kitts",
			"America/Puerto_Rico|America/St_Lucia",
			"America/Puerto_Rico|America/St_Thomas",
			"America/Puerto_Rico|America/St_Vincent",
			"America/Puerto_Rico|America/Tortola",
			"America/Puerto_Rico|America/Virgin",
			"America/Regina|Canada/Saskatchewan",
			"America/Rio_Branco|America/Porto_Acre",
			"America/Rio_Branco|Brazil/Acre",
			"America/Santiago|Chile/Continental",
			"America/Sao_Paulo|Brazil/East",
			"America/St_Johns|Canada/Newfoundland",
			"America/Tijuana|America/Ensenada",
			"America/Tijuana|America/Santa_Isabel",
			"America/Tijuana|Mexico/BajaNorte",
			"America/Toronto|America/Montreal",
			"America/Toronto|America/Nassau",
			"America/Toronto|Canada/Eastern",
			"America/Vancouver|Canada/Pacific",
			"America/Whitehorse|Canada/Yukon",
			"America/Winnipeg|Canada/Central",
			"Asia/Ashgabat|Asia/Ashkhabad",
			"Asia/Bangkok|Asia/Phnom_Penh",
			"Asia/Bangkok|Asia/Vientiane",
			"Asia/Dhaka|Asia/Dacca",
			"Asia/Dubai|Asia/Muscat",
			"Asia/Ho_Chi_Minh|Asia/Saigon",
			"Asia/Hong_Kong|Hongkong",
			"Asia/Jerusalem|Asia/Tel_Aviv",
			"Asia/Jerusalem|Israel",
			"Asia/Kathmandu|Asia/Katmandu",
			"Asia/Kolkata|Asia/Calcutta",
			"Asia/Kuala_Lumpur|Asia/Singapore",
			"Asia/Kuala_Lumpur|Singapore",
			"Asia/Macau|Asia/Macao",
			"Asia/Makassar|Asia/Ujung_Pandang",
			"Asia/Nicosia|Europe/Nicosia",
			"Asia/Qatar|Asia/Bahrain",
			"Asia/Rangoon|Asia/Yangon",
			"Asia/Riyadh|Antarctica/Syowa",
			"Asia/Riyadh|Asia/Aden",
			"Asia/Riyadh|Asia/Kuwait",
			"Asia/Seoul|ROK",
			"Asia/Shanghai|Asia/Chongqing",
			"Asia/Shanghai|Asia/Chungking",
			"Asia/Shanghai|Asia/Harbin",
			"Asia/Shanghai|PRC",
			"Asia/Taipei|ROC",
			"Asia/Tehran|Iran",
			"Asia/Thimphu|Asia/Thimbu",
			"Asia/Tokyo|Japan",
			"Asia/Ulaanbaatar|Asia/Ulan_Bator",
			"Asia/Urumqi|Asia/Kashgar",
			"Atlantic/Faroe|Atlantic/Faeroe",
			"Atlantic/Reykjavik|Iceland",
			"Atlantic/South_Georgia|Etc/GMT+2",
			"Australia/Adelaide|Australia/South",
			"Australia/Brisbane|Australia/Queensland",
			"Australia/Broken_Hill|Australia/Yancowinna",
			"Australia/Darwin|Australia/North",
			"Australia/Hobart|Australia/Currie",
			"Australia/Hobart|Australia/Tasmania",
			"Australia/Lord_Howe|Australia/LHI",
			"Australia/Melbourne|Australia/Victoria",
			"Australia/Perth|Australia/West",
			"Australia/Sydney|Australia/ACT",
			"Australia/Sydney|Australia/Canberra",
			"Australia/Sydney|Australia/NSW",
			"Etc/GMT-0|Etc/GMT",
			"Etc/GMT-0|Etc/GMT+0",
			"Etc/GMT-0|Etc/GMT0",
			"Etc/GMT-0|Etc/Greenwich",
			"Etc/GMT-0|GMT",
			"Etc/GMT-0|GMT+0",
			"Etc/GMT-0|GMT-0",
			"Etc/GMT-0|GMT0",
			"Etc/GMT-0|Greenwich",
			"Etc/UTC|Etc/UCT",
			"Etc/UTC|Etc/Universal",
			"Etc/UTC|Etc/Zulu",
			"Etc/UTC|UCT",
			"Etc/UTC|UTC",
			"Etc/UTC|Universal",
			"Etc/UTC|Zulu",
			"Europe/Belgrade|Europe/Ljubljana",
			"Europe/Belgrade|Europe/Podgorica",
			"Europe/Belgrade|Europe/Sarajevo",
			"Europe/Belgrade|Europe/Skopje",
			"Europe/Belgrade|Europe/Zagreb",
			"Europe/Chisinau|Europe/Tiraspol",
			"Europe/Dublin|Eire",
			"Europe/Helsinki|Europe/Mariehamn",
			"Europe/Istanbul|Asia/Istanbul",
			"Europe/Istanbul|Turkey",
			"Europe/Lisbon|Portugal",
			"Europe/London|Europe/Belfast",
			"Europe/London|Europe/Guernsey",
			"Europe/London|Europe/Isle_of_Man",
			"Europe/London|Europe/Jersey",
			"Europe/London|GB",
			"Europe/London|GB-Eire",
			"Europe/Moscow|W-SU",
			"Europe/Oslo|Arctic/Longyearbyen",
			"Europe/Oslo|Atlantic/Jan_Mayen",
			"Europe/Prague|Europe/Bratislava",
			"Europe/Rome|Europe/San_Marino",
			"Europe/Rome|Europe/Vatican",
			"Europe/Warsaw|Poland",
			"Europe/Zurich|Europe/Busingen",
			"Europe/Zurich|Europe/Vaduz",
			"Indian/Christmas|Etc/GMT-7",
			"Pacific/Auckland|Antarctica/McMurdo",
			"Pacific/Auckland|Antarctica/South_Pole",
			"Pacific/Auckland|NZ",
			"Pacific/Chatham|NZ-CHAT",
			"Pacific/Chuuk|Pacific/Truk",
			"Pacific/Chuuk|Pacific/Yap",
			"Pacific/Easter|Chile/EasterIsland",
			"Pacific/Enderbury|Pacific/Kanton",
			"Pacific/Guam|Pacific/Saipan",
			"Pacific/Honolulu|Pacific/Johnston",
			"Pacific/Honolulu|US/Hawaii",
			"Pacific/Kwajalein|Kwajalein",
			"Pacific/Pago_Pago|Pacific/Midway",
			"Pacific/Pago_Pago|Pacific/Samoa",
			"Pacific/Pago_Pago|US/Samoa",
			"Pacific/Palau|Etc/GMT-9",
			"Pacific/Pohnpei|Pacific/Ponape",
			"Pacific/Port_Moresby|Antarctica/DumontDUrville",
			"Pacific/Port_Moresby|Etc/GMT-10",
			"Pacific/Tarawa|Etc/GMT-12",
			"Pacific/Tarawa|Pacific/Funafuti",
			"Pacific/Tarawa|Pacific/Wake",
			"Pacific/Tarawa|Pacific/Wallis"
		],
		"countries": [
			"AD|Europe/Andorra",
			"AE|Asia/Dubai",
			"AF|Asia/Kabul",
			"AG|America/Port_of_Spain America/Antigua",
			"AI|America/Port_of_Spain America/Anguilla",
			"AL|Europe/Tirane",
			"AM|Asia/Yerevan",
			"AO|Africa/Lagos Africa/Luanda",
			"AQ|Antarctica/Casey Antarctica/Davis Antarctica/DumontDUrville Antarctica/Mawson Antarctica/Palmer Antarctica/Rothera Antarctica/Syowa Antarctica/Troll Antarctica/Vostok Pacific/Auckland Antarctica/McMurdo",
			"AR|America/Argentina/Buenos_Aires America/Argentina/Cordoba America/Argentina/Salta America/Argentina/Jujuy America/Argentina/Tucuman America/Argentina/Catamarca America/Argentina/La_Rioja America/Argentina/San_Juan America/Argentina/Mendoza America/Argentina/San_Luis America/Argentina/Rio_Gallegos America/Argentina/Ushuaia",
			"AS|Pacific/Pago_Pago",
			"AT|Europe/Vienna",
			"AU|Australia/Lord_Howe Antarctica/Macquarie Australia/Hobart Australia/Melbourne Australia/Sydney Australia/Broken_Hill Australia/Brisbane Australia/Lindeman Australia/Adelaide Australia/Darwin Australia/Perth Australia/Eucla",
			"AW|America/Curacao America/Aruba",
			"AX|Europe/Helsinki Europe/Mariehamn",
			"AZ|Asia/Baku",
			"BA|Europe/Belgrade Europe/Sarajevo",
			"BB|America/Barbados",
			"BD|Asia/Dhaka",
			"BE|Europe/Brussels",
			"BF|Africa/Abidjan Africa/Ouagadougou",
			"BG|Europe/Sofia",
			"BH|Asia/Qatar Asia/Bahrain",
			"BI|Africa/Maputo Africa/Bujumbura",
			"BJ|Africa/Lagos Africa/Porto-Novo",
			"BL|America/Port_of_Spain America/St_Barthelemy",
			"BM|Atlantic/Bermuda",
			"BN|Asia/Brunei",
			"BO|America/La_Paz",
			"BQ|America/Curacao America/Kralendijk",
			"BR|America/Noronha America/Belem America/Fortaleza America/Recife America/Araguaina America/Maceio America/Bahia America/Sao_Paulo America/Campo_Grande America/Cuiaba America/Santarem America/Porto_Velho America/Boa_Vista America/Manaus America/Eirunepe America/Rio_Branco",
			"BS|America/Nassau",
			"BT|Asia/Thimphu",
			"BW|Africa/Maputo Africa/Gaborone",
			"BY|Europe/Minsk",
			"BZ|America/Belize",
			"CA|America/St_Johns America/Halifax America/Glace_Bay America/Moncton America/Goose_Bay America/Blanc-Sablon America/Toronto America/Nipigon America/Thunder_Bay America/Iqaluit America/Pangnirtung America/Atikokan America/Winnipeg America/Rainy_River America/Resolute America/Rankin_Inlet America/Regina America/Swift_Current America/Edmonton America/Cambridge_Bay America/Yellowknife America/Inuvik America/Creston America/Dawson_Creek America/Fort_Nelson America/Whitehorse America/Dawson America/Vancouver",
			"CC|Indian/Cocos",
			"CD|Africa/Maputo Africa/Lagos Africa/Kinshasa Africa/Lubumbashi",
			"CF|Africa/Lagos Africa/Bangui",
			"CG|Africa/Lagos Africa/Brazzaville",
			"CH|Europe/Zurich",
			"CI|Africa/Abidjan",
			"CK|Pacific/Rarotonga",
			"CL|America/Santiago America/Punta_Arenas Pacific/Easter",
			"CM|Africa/Lagos Africa/Douala",
			"CN|Asia/Shanghai Asia/Urumqi",
			"CO|America/Bogota",
			"CR|America/Costa_Rica",
			"CU|America/Havana",
			"CV|Atlantic/Cape_Verde",
			"CW|America/Curacao",
			"CX|Indian/Christmas",
			"CY|Asia/Nicosia Asia/Famagusta",
			"CZ|Europe/Prague",
			"DE|Europe/Zurich Europe/Berlin Europe/Busingen",
			"DJ|Africa/Nairobi Africa/Djibouti",
			"DK|Europe/Copenhagen",
			"DM|America/Port_of_Spain America/Dominica",
			"DO|America/Santo_Domingo",
			"DZ|Africa/Algiers",
			"EC|America/Guayaquil Pacific/Galapagos",
			"EE|Europe/Tallinn",
			"EG|Africa/Cairo",
			"EH|Africa/El_Aaiun",
			"ER|Africa/Nairobi Africa/Asmara",
			"ES|Europe/Madrid Africa/Ceuta Atlantic/Canary",
			"ET|Africa/Nairobi Africa/Addis_Ababa",
			"FI|Europe/Helsinki",
			"FJ|Pacific/Fiji",
			"FK|Atlantic/Stanley",
			"FM|Pacific/Chuuk Pacific/Pohnpei Pacific/Kosrae",
			"FO|Atlantic/Faroe",
			"FR|Europe/Paris",
			"GA|Africa/Lagos Africa/Libreville",
			"GB|Europe/London",
			"GD|America/Port_of_Spain America/Grenada",
			"GE|Asia/Tbilisi",
			"GF|America/Cayenne",
			"GG|Europe/London Europe/Guernsey",
			"GH|Africa/Accra",
			"GI|Europe/Gibraltar",
			"GL|America/Nuuk America/Danmarkshavn America/Scoresbysund America/Thule",
			"GM|Africa/Abidjan Africa/Banjul",
			"GN|Africa/Abidjan Africa/Conakry",
			"GP|America/Port_of_Spain America/Guadeloupe",
			"GQ|Africa/Lagos Africa/Malabo",
			"GR|Europe/Athens",
			"GS|Atlantic/South_Georgia",
			"GT|America/Guatemala",
			"GU|Pacific/Guam",
			"GW|Africa/Bissau",
			"GY|America/Guyana",
			"HK|Asia/Hong_Kong",
			"HN|America/Tegucigalpa",
			"HR|Europe/Belgrade Europe/Zagreb",
			"HT|America/Port-au-Prince",
			"HU|Europe/Budapest",
			"ID|Asia/Jakarta Asia/Pontianak Asia/Makassar Asia/Jayapura",
			"IE|Europe/Dublin",
			"IL|Asia/Jerusalem",
			"IM|Europe/London Europe/Isle_of_Man",
			"IN|Asia/Kolkata",
			"IO|Indian/Chagos",
			"IQ|Asia/Baghdad",
			"IR|Asia/Tehran",
			"IS|Atlantic/Reykjavik",
			"IT|Europe/Rome",
			"JE|Europe/London Europe/Jersey",
			"JM|America/Jamaica",
			"JO|Asia/Amman",
			"JP|Asia/Tokyo",
			"KE|Africa/Nairobi",
			"KG|Asia/Bishkek",
			"KH|Asia/Bangkok Asia/Phnom_Penh",
			"KI|Pacific/Tarawa Pacific/Enderbury Pacific/Kiritimati",
			"KM|Africa/Nairobi Indian/Comoro",
			"KN|America/Port_of_Spain America/St_Kitts",
			"KP|Asia/Pyongyang",
			"KR|Asia/Seoul",
			"KW|Asia/Riyadh Asia/Kuwait",
			"KY|America/Panama America/Cayman",
			"KZ|Asia/Almaty Asia/Qyzylorda Asia/Qostanay Asia/Aqtobe Asia/Aqtau Asia/Atyrau Asia/Oral",
			"LA|Asia/Bangkok Asia/Vientiane",
			"LB|Asia/Beirut",
			"LC|America/Port_of_Spain America/St_Lucia",
			"LI|Europe/Zurich Europe/Vaduz",
			"LK|Asia/Colombo",
			"LR|Africa/Monrovia",
			"LS|Africa/Johannesburg Africa/Maseru",
			"LT|Europe/Vilnius",
			"LU|Europe/Luxembourg",
			"LV|Europe/Riga",
			"LY|Africa/Tripoli",
			"MA|Africa/Casablanca",
			"MC|Europe/Monaco",
			"MD|Europe/Chisinau",
			"ME|Europe/Belgrade Europe/Podgorica",
			"MF|America/Port_of_Spain America/Marigot",
			"MG|Africa/Nairobi Indian/Antananarivo",
			"MH|Pacific/Majuro Pacific/Kwajalein",
			"MK|Europe/Belgrade Europe/Skopje",
			"ML|Africa/Abidjan Africa/Bamako",
			"MM|Asia/Yangon",
			"MN|Asia/Ulaanbaatar Asia/Hovd Asia/Choibalsan",
			"MO|Asia/Macau",
			"MP|Pacific/Guam Pacific/Saipan",
			"MQ|America/Martinique",
			"MR|Africa/Abidjan Africa/Nouakchott",
			"MS|America/Port_of_Spain America/Montserrat",
			"MT|Europe/Malta",
			"MU|Indian/Mauritius",
			"MV|Indian/Maldives",
			"MW|Africa/Maputo Africa/Blantyre",
			"MX|America/Mexico_City America/Cancun America/Merida America/Monterrey America/Matamoros America/Mazatlan America/Chihuahua America/Ojinaga America/Hermosillo America/Tijuana America/Bahia_Banderas",
			"MY|Asia/Kuala_Lumpur Asia/Kuching",
			"MZ|Africa/Maputo",
			"NA|Africa/Windhoek",
			"NC|Pacific/Noumea",
			"NE|Africa/Lagos Africa/Niamey",
			"NF|Pacific/Norfolk",
			"NG|Africa/Lagos",
			"NI|America/Managua",
			"NL|Europe/Amsterdam",
			"NO|Europe/Oslo",
			"NP|Asia/Kathmandu",
			"NR|Pacific/Nauru",
			"NU|Pacific/Niue",
			"NZ|Pacific/Auckland Pacific/Chatham",
			"OM|Asia/Dubai Asia/Muscat",
			"PA|America/Panama",
			"PE|America/Lima",
			"PF|Pacific/Tahiti Pacific/Marquesas Pacific/Gambier",
			"PG|Pacific/Port_Moresby Pacific/Bougainville",
			"PH|Asia/Manila",
			"PK|Asia/Karachi",
			"PL|Europe/Warsaw",
			"PM|America/Miquelon",
			"PN|Pacific/Pitcairn",
			"PR|America/Puerto_Rico",
			"PS|Asia/Gaza Asia/Hebron",
			"PT|Europe/Lisbon Atlantic/Madeira Atlantic/Azores",
			"PW|Pacific/Palau",
			"PY|America/Asuncion",
			"QA|Asia/Qatar",
			"RE|Indian/Reunion",
			"RO|Europe/Bucharest",
			"RS|Europe/Belgrade",
			"RU|Europe/Kaliningrad Europe/Moscow Europe/Simferopol Europe/Kirov Europe/Volgograd Europe/Astrakhan Europe/Saratov Europe/Ulyanovsk Europe/Samara Asia/Yekaterinburg Asia/Omsk Asia/Novosibirsk Asia/Barnaul Asia/Tomsk Asia/Novokuznetsk Asia/Krasnoyarsk Asia/Irkutsk Asia/Chita Asia/Yakutsk Asia/Khandyga Asia/Vladivostok Asia/Ust-Nera Asia/Magadan Asia/Sakhalin Asia/Srednekolymsk Asia/Kamchatka Asia/Anadyr",
			"RW|Africa/Maputo Africa/Kigali",
			"SA|Asia/Riyadh",
			"SB|Pacific/Guadalcanal",
			"SC|Indian/Mahe",
			"SD|Africa/Khartoum",
			"SE|Europe/Stockholm",
			"SG|Asia/Singapore",
			"SH|Africa/Abidjan Atlantic/St_Helena",
			"SI|Europe/Belgrade Europe/Ljubljana",
			"SJ|Europe/Oslo Arctic/Longyearbyen",
			"SK|Europe/Prague Europe/Bratislava",
			"SL|Africa/Abidjan Africa/Freetown",
			"SM|Europe/Rome Europe/San_Marino",
			"SN|Africa/Abidjan Africa/Dakar",
			"SO|Africa/Nairobi Africa/Mogadishu",
			"SR|America/Paramaribo",
			"SS|Africa/Juba",
			"ST|Africa/Sao_Tome",
			"SV|America/El_Salvador",
			"SX|America/Curacao America/Lower_Princes",
			"SY|Asia/Damascus",
			"SZ|Africa/Johannesburg Africa/Mbabane",
			"TC|America/Grand_Turk",
			"TD|Africa/Ndjamena",
			"TF|Indian/Reunion Indian/Kerguelen",
			"TG|Africa/Abidjan Africa/Lome",
			"TH|Asia/Bangkok",
			"TJ|Asia/Dushanbe",
			"TK|Pacific/Fakaofo",
			"TL|Asia/Dili",
			"TM|Asia/Ashgabat",
			"TN|Africa/Tunis",
			"TO|Pacific/Tongatapu",
			"TR|Europe/Istanbul",
			"TT|America/Port_of_Spain",
			"TV|Pacific/Funafuti",
			"TW|Asia/Taipei",
			"TZ|Africa/Nairobi Africa/Dar_es_Salaam",
			"UA|Europe/Simferopol Europe/Kiev Europe/Uzhgorod Europe/Zaporozhye",
			"UG|Africa/Nairobi Africa/Kampala",
			"UM|Pacific/Pago_Pago Pacific/Wake Pacific/Honolulu Pacific/Midway",
			"US|America/New_York America/Detroit America/Kentucky/Louisville America/Kentucky/Monticello America/Indiana/Indianapolis America/Indiana/Vincennes America/Indiana/Winamac America/Indiana/Marengo America/Indiana/Petersburg America/Indiana/Vevay America/Chicago America/Indiana/Tell_City America/Indiana/Knox America/Menominee America/North_Dakota/Center America/North_Dakota/New_Salem America/North_Dakota/Beulah America/Denver America/Boise America/Phoenix America/Los_Angeles America/Anchorage America/Juneau America/Sitka America/Metlakatla America/Yakutat America/Nome America/Adak Pacific/Honolulu",
			"UY|America/Montevideo",
			"UZ|Asia/Samarkand Asia/Tashkent",
			"VA|Europe/Rome Europe/Vatican",
			"VC|America/Port_of_Spain America/St_Vincent",
			"VE|America/Caracas",
			"VG|America/Port_of_Spain America/Tortola",
			"VI|America/Port_of_Spain America/St_Thomas",
			"VN|Asia/Bangkok Asia/Ho_Chi_Minh",
			"VU|Pacific/Efate",
			"WF|Pacific/Wallis",
			"WS|Pacific/Apia",
			"YE|Asia/Riyadh Asia/Aden",
			"YT|Africa/Nairobi Indian/Mayotte",
			"ZA|Africa/Johannesburg",
			"ZM|Africa/Maputo Africa/Lusaka",
			"ZW|Africa/Maputo Africa/Harare"
		]
	});


	return moment;
}));
!function(c,M){"use strict";"object"==typeof module&&module.exports?module.exports=M(require("moment")):"function"==typeof define&&define.amd?define(["moment"],M):M(c.moment)}(this,function(b){"use strict";void 0===b.version&&b.default&&(b=b.default);var M,a={},p={},n={},i={},e={};b&&"string"==typeof b.version||R("Moment Timezone requires Moment.js. See https://momentjs.com/timezone/docs/#/use-it/browser/");var c=b.version.split("."),A=+c[0],o=+c[1];function q(c){return 96<c?c-87:64<c?c-29:c-48}function z(c){var M=0,A=c.split("."),o=A[0],z=A[1]||"",b=1,a=0,p=1;for(45===c.charCodeAt(0)&&(p=-(M=1));M<o.length;M++)a=60*a+q(o.charCodeAt(M));for(M=0;M<z.length;M++)b/=60,a+=q(z.charCodeAt(M))*b;return a*p}function L(c){for(var M=0;M<c.length;M++)c[M]=z(c[M])}function O(c,M){var A,o=[];for(A=0;A<M.length;A++)o[A]=c[M[A]];return o}function r(c){var M=c.split("|"),A=M[2].split(" "),o=M[3].split(""),z=M[4].split(" ");return L(A),L(o),L(z),function(c,M){for(var A=0;A<M;A++)c[A]=Math.round((c[A-1]||0)+6e4*c[A]);c[M-1]=1/0}(z,o.length),{name:M[0],abbrs:O(M[1].split(" "),o),offsets:O(A,o),untils:z,population:0|M[5]}}function N(c){c&&this._set(r(c))}function d(c,M){this.name=c,this.zones=M}function W(c){var M=c.toTimeString(),A=M.match(/\([a-z ]+\)/i);"GMT"===(A=A&&A[0]?(A=A[0].match(/[A-Z]/g))?A.join(""):void 0:(A=M.match(/[A-Z]{3,5}/g))?A[0]:void 0)&&(A=void 0),this.at=+c,this.abbr=A,this.offset=c.getTimezoneOffset()}function f(c){this.zone=c,this.offsetScore=0,this.abbrScore=0}function X(c,M){for(var A,o;o=6e4*((M.at-c.at)/12e4|0);)(A=new W(new Date(c.at+o))).offset===c.offset?c=A:M=A;return c}function u(c,M){return c.offsetScore!==M.offsetScore?c.offsetScore-M.offsetScore:c.abbrScore!==M.abbrScore?c.abbrScore-M.abbrScore:c.zone.population!==M.zone.population?M.zone.population-c.zone.population:M.zone.name.localeCompare(c.zone.name)}function B(c,M){var A,o;for(L(M),A=0;A<M.length;A++)o=M[A],e[o]=e[o]||{},e[o][c]=!0}function l(){try{var c=Intl.DateTimeFormat().resolvedOptions().timeZone;if(c&&3<c.length){var M=i[T(c)];if(M)return M;R("Moment Timezone found "+c+" from the Intl api, but did not have that data loaded.")}}catch(c){}var A,o,z,b=function(){var c,M,A,o=(new Date).getFullYear()-2,z=new W(new Date(o,0,1)),b=[z];for(A=1;A<48;A++)(M=new W(new Date(o,A,1))).offset!==z.offset&&(c=X(z,M),b.push(c),b.push(new W(new Date(c.at+6e4)))),z=M;for(A=0;A<4;A++)b.push(new W(new Date(o+A,0,1))),b.push(new W(new Date(o+A,6,1)));return b}(),a=b.length,p=function(c){var M,A,o,z=c.length,b={},a=[];for(M=0;M<z;M++)for(A in o=e[c[M].offset]||{})o.hasOwnProperty(A)&&(b[A]=!0);for(M in b)b.hasOwnProperty(M)&&a.push(i[M]);return a}(b),n=[];for(o=0;o<p.length;o++){for(A=new f(s(p[o]),a),z=0;z<a;z++)A.scoreOffsetAt(b[z]);n.push(A)}return n.sort(u),0<n.length?n[0].zone.name:void 0}function T(c){return(c||"").toLowerCase().replace(/\//g,"_")}function t(c){var M,A,o,z;for("string"==typeof c&&(c=[c]),M=0;M<c.length;M++)z=T(A=(o=c[M].split("|"))[0]),a[z]=c[M],i[z]=A,B(z,o[2].split(" "))}function s(c,M){c=T(c);var A,o=a[c];return o instanceof N?o:"string"==typeof o?(o=new N(o),a[c]=o):p[c]&&M!==s&&(A=s(p[c],s))?((o=a[c]=new N)._set(A),o.name=i[c],o):null}function m(c){var M,A,o,z;for("string"==typeof c&&(c=[c]),M=0;M<c.length;M++)o=T((A=c[M].split("|"))[0]),z=T(A[1]),p[o]=z,i[o]=A[0],p[z]=o,i[z]=A[1]}function C(c){t(c.zones),m(c.links),function(c){var M,A,o,z;if(c&&c.length)for(M=0;M<c.length;M++)A=(z=c[M].split("|"))[0].toUpperCase(),o=z[1].split(" "),n[A]=new d(A,o)}(c.countries),S.dataVersion=c.version}function E(c){var M="X"===c._f||"x"===c._f;return!(!c._a||void 0!==c._tzm||M)}function R(c){"undefined"!=typeof console&&"function"==typeof console.error&&console.error(c)}function S(c){var M=Array.prototype.slice.call(arguments,0,-1),A=arguments[arguments.length-1],o=s(A),z=b.utc.apply(null,M);return o&&!b.isMoment(c)&&E(z)&&z.add(o.parse(z),"minutes"),z.tz(A),z}(A<2||2==A&&o<6)&&R("Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js "+b.version+". See momentjs.com"),N.prototype={_set:function(c){this.name=c.name,this.abbrs=c.abbrs,this.untils=c.untils,this.offsets=c.offsets,this.population=c.population},_index:function(c){var M,A=+c,o=this.untils;for(M=0;M<o.length;M++)if(A<o[M])return M},countries:function(){var M=this.name;return Object.keys(n).filter(function(c){return-1!==n[c].zones.indexOf(M)})},parse:function(c){var M,A,o,z,b=+c,a=this.offsets,p=this.untils,n=p.length-1;for(z=0;z<n;z++)if(M=a[z],A=a[z+1],o=a[z?z-1:z],M<A&&S.moveAmbiguousForward?M=A:o<M&&S.moveInvalidForward&&(M=o),b<p[z]-6e4*M)return a[z];return a[n]},abbr:function(c){return this.abbrs[this._index(c)]},offset:function(c){return R("zone.offset has been deprecated in favor of zone.utcOffset"),this.offsets[this._index(c)]},utcOffset:function(c){return this.offsets[this._index(c)]}},f.prototype.scoreOffsetAt=function(c){this.offsetScore+=Math.abs(this.zone.utcOffset(c.at)-c.offset),this.zone.abbr(c.at).replace(/[^A-Z]/g,"")!==c.abbr&&this.abbrScore++},S.version="0.5.34",S.dataVersion="",S._zones=a,S._links=p,S._names=i,S._countries=n,S.add=t,S.link=m,S.load=C,S.zone=s,S.zoneExists=function c(M){return c.didShowError||(c.didShowError=!0,R("moment.tz.zoneExists('"+M+"') has been deprecated in favor of !moment.tz.zone('"+M+"')")),!!s(M)},S.guess=function(c){return M&&!c||(M=l()),M},S.names=function(){var c,M=[];for(c in i)i.hasOwnProperty(c)&&(a[c]||a[p[c]])&&i[c]&&M.push(i[c]);return M.sort()},S.Zone=N,S.unpack=r,S.unpackBase60=z,S.needsOffset=E,S.moveInvalidForward=!0,S.moveAmbiguousForward=!1,S.countries=function(){return Object.keys(n)},S.zonesForCountry=function(c,M){if(!(c=function(c){return c=c.toUpperCase(),n[c]||null}(c)))return null;var A=c.zones.sort();return M?A.map(function(c){return{name:c,offset:s(c).utcOffset(new Date)}}):A};var P,g=b.fn;function D(c){return function(){return this._z?this._z.abbr(this):c.call(this)}}function h(c){return function(){return this._z=null,c.apply(this,arguments)}}b.tz=S,b.defaultZone=null,b.updateOffset=function(c,M){var A,o=b.defaultZone;if(void 0===c._z&&(o&&E(c)&&!c._isUTC&&(c._d=b.utc(c._a)._d,c.utc().add(o.parse(c),"minutes")),c._z=o),c._z)if(A=c._z.utcOffset(c),Math.abs(A)<16&&(A/=60),void 0!==c.utcOffset){var z=c._z;c.utcOffset(-A,M),c._z=z}else c.zone(A,M)},g.tz=function(c,M){if(c){if("string"!=typeof c)throw new Error("Time zone name must be a string, got "+c+" ["+typeof c+"]");return this._z=s(c),this._z?b.updateOffset(this,M):R("Moment Timezone has no data for "+c+". See http://momentjs.com/timezone/docs/#/data-loading/."),this}if(this._z)return this._z.name},g.zoneName=D(g.zoneName),g.zoneAbbr=D(g.zoneAbbr),g.utc=h(g.utc),g.local=h(g.local),g.utcOffset=(P=g.utcOffset,function(){return 0<arguments.length&&(this._z=null),P.apply(this,arguments)}),b.tz.setDefault=function(c){return(A<2||2==A&&o<9)&&R("Moment Timezone setDefault() requires Moment.js >= 2.9.0. You are using Moment.js "+b.version+"."),b.defaultZone=c?s(c):null,b};var k=b.momentProperties;return"[object Array]"===Object.prototype.toString.call(k)?(k.push("_z"),k.push("_a")):k&&(k._z=null),C({version:"2021e",zones:["Africa/Abidjan|LMT GMT|g.8 0|01|-2ldXH.Q|48e5","Africa/Nairobi|LMT +0230 EAT +0245|-2r.g -2u -30 -2J|012132|-2ua2r.g N6nV.g 3Fbu h1cu dzbJ|47e5","Africa/Algiers|PMT WET WEST CET CEST|-9.l 0 -10 -10 -20|0121212121212121343431312123431213|-2nco9.l cNb9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 DA0 Imo0 rd0 De0 9Xz0 1fb0 1ap0 16K0 2yo0 mEp0 hwL0 jxA0 11A0 dDd0 17b0 11B0 1cN0 2Dy0 1cN0 1fB0 1cL0|26e5","Africa/Lagos|LMT GMT +0030 WAT|-d.z 0 -u -10|01023|-2B40d.z 7iod.z dnXK.p dLzH.z|17e6","Africa/Bissau|LMT -01 GMT|12.k 10 0|012|-2ldX0 2xoo0|39e4","Africa/Maputo|LMT CAT|-2a.k -20|01|-2GJea.k|26e5","Africa/Cairo|EET EEST|-20 -30|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1bIO0 vb0 1ip0 11z0 1iN0 1nz0 12p0 1pz0 10N0 1pz0 16p0 1jz0 s3d0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1WL0 rd0 1Rz0 wp0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1qL0 Xd0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1ny0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 WL0 1qN0 Rb0 1wp0 On0 1zd0 Lz0 1EN0 Fb0 c10 8n0 8Nd0 gL0 e10 mn0|15e6","Africa/Casablanca|LMT +00 +01|u.k 0 -10|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-2gMnt.E 130Lt.E rb0 Dd0 dVb0 b6p0 TX0 EoB0 LL0 gnd0 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4mn0 SyN0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0 2600 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0|32e5","Africa/Ceuta|WET WEST CET CEST|0 -10 -10 -20|010101010101010101010232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-25KN0 11z0 drd0 18p0 3HX0 17d0 1fz0 1a10 1io0 1a00 1y7o0 LL0 gnd0 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4VB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|85e3","Africa/El_Aaiun|LMT -01 +00 +01|Q.M 10 0 -10|012323232323232323232323232323232323232323232323232323232323232323232323232323232323|-1rDz7.c 1GVA7.c 6L0 AL0 1Nd0 XX0 1Cp0 pz0 1cBB0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0 2600 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0|20e4","Africa/Johannesburg|SAST SAST SAST|-1u -20 -30|012121|-2GJdu 1Ajdu 1cL0 1cN0 1cL0|84e5","Africa/Juba|LMT CAT CAST EAT|-26.s -20 -30 -30|012121212121212121212121212121212131|-1yW26.s 1zK06.s 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0 PeX0|","Africa/Khartoum|LMT CAT CAST EAT|-2a.8 -20 -30 -30|012121212121212121212121212121212131|-1yW2a.8 1zK0a.8 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0 HjL0|51e5","Africa/Monrovia|MMT MMT GMT|H.8 I.u 0|012|-23Lzg.Q 28G01.m|11e5","Africa/Ndjamena|LMT WAT WAST|-10.c -10 -20|0121|-2le10.c 2J3c0.c Wn0|13e5","Africa/Sao_Tome|LMT GMT WAT|A.J 0 -10|0121|-2le00 4i6N0 2q00|","Africa/Tripoli|LMT CET CEST EET|-Q.I -10 -20 -20|012121213121212121212121213123123|-21JcQ.I 1hnBQ.I vx0 4iP0 xx0 4eN0 Bb0 7ip0 U0n0 A10 1db0 1cN0 1db0 1dd0 1db0 1eN0 1bb0 1e10 1cL0 1c10 1db0 1dd0 1db0 1cN0 1db0 1q10 fAn0 1ep0 1db0 AKq0 TA0 1o00|11e5","Africa/Tunis|PMT CET CEST|-9.l -10 -20|0121212121212121212121212121212121|-2nco9.l 18pa9.l 1qM0 DA0 3Tc0 11B0 1ze0 WM0 7z0 3d0 14L0 1cN0 1f90 1ar0 16J0 1gXB0 WM0 1rA0 11c0 nwo0 Ko0 1cM0 1cM0 1rA0 10M0 zuM0 10N0 1aN0 1qM0 WM0 1qM0 11A0 1o00|20e5","Africa/Windhoek|+0130 SAST SAST CAT WAT|-1u -20 -30 -20 -10|01213434343434343434343434343434343434343434343434343|-2GJdu 1Ajdu 1cL0 1SqL0 9Io0 16P0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0|32e4","America/Adak|NST NWT NPT BST BDT AHST HST HDT|b0 a0 a0 b0 a0 a0 a0 90|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17SX0 8wW0 iB0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|326","America/Anchorage|AST AWT APT AHST AHDT YST AKST AKDT|a0 90 90 a0 90 90 90 80|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17T00 8wX0 iA0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|30e4","America/Puerto_Rico|AST AWT APT|40 30 30|0120|-17lU0 7XT0 iu0|24e5","America/Araguaina|LMT -03 -02|3c.M 30 20|0121212121212121212121212121212121212121212121212121|-2glwL.c HdKL.c 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 ny10 Lz0|14e4","America/Argentina/Buenos_Aires|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 A4p0 uL0 1qN0 WL0|","America/Argentina/Catamarca|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323132321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 7B0 8zb0 uL0|","America/Argentina/Cordoba|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323132323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0 1qN0 WL0|","America/Argentina/Jujuy|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323121323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1ze0 TX0 1ld0 WK0 1wp0 TX0 A4p0 uL0|","America/Argentina/La_Rioja|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0|","America/Argentina/Mendoza|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232312121321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1u20 SL0 1vd0 Tb0 1wp0 TW0 ri10 Op0 7TX0 uL0|","America/Argentina/Rio_Gallegos|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0|","America/Argentina/Salta|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0|","America/Argentina/San_Juan|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rld0 m10 8lb0 uL0|","America/Argentina/San_Luis|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323121212321212|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 XX0 1q20 SL0 AN0 vDb0 m10 8lb0 8L0 jd0 1qN0 WL0 1qN0|","America/Argentina/Tucuman|CMT -04 -03 -02|4g.M 40 30 20|0121212121212121212121212121212121212121212323232313232123232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 4N0 8BX0 uL0 1qN0 WL0|","America/Argentina/Ushuaia|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rkN0 8p0 8zb0 uL0|","America/Asuncion|AMT -04 -03|3O.E 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-1x589.k 1DKM9.k 3CL0 3Dd0 10L0 1pB0 10n0 1pB0 10n0 1pB0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1lB0 14n0 1dd0 1cL0 1fd0 WL0 1rd0 1aL0 1dB0 Xz0 1qp0 Xb0 1qN0 10L0 1rB0 TX0 1tB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 WN0 1qL0 11B0 1nX0 1ip0 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 TX0 1tB0 19X0 1a10 1fz0 1a10 1fz0 1cN0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0|28e5","America/Panama|CMT EST|5j.A 50|01|-2uduE.o|15e5","America/Bahia_Banderas|LMT MST CST PST MDT CDT|71 70 60 80 60 50|0121212131414141414141414141414141414152525252525252525252525252525252525252525252525252525252|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nW0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|84e3","America/Bahia|LMT -03 -02|2y.4 30 20|01212121212121212121212121212121212121212121212121212121212121|-2glxp.U HdLp.U 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 l5B0 Rb0|27e5","America/Barbados|LMT AST ADT -0330|3W.t 40 30 3u|0121213121212121|-2m4k1.v 1eAN1.v RB0 1Bz0 Op0 1rb0 11d0 1jJc0 IL0 1ip0 17b0 1ip0 17b0 1ld0 13b0|28e4","America/Belem|LMT -03 -02|3d.U 30 20|012121212121212121212121212121|-2glwK.4 HdKK.4 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0|20e5","America/Belize|LMT CST -0530 CWT CPT CDT|5Q.M 60 5u 50 50 50|012121212121212121212121212121212121212121212121213412121212121212121212121212121212121212121215151|-2kBu7.c fPA7.c Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu Rcu 7Bt0 Ni0 4nd0 Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu e9Au qn0 lxB0 mn0|57e3","America/Boa_Vista|LMT -04 -03|42.E 40 30|0121212121212121212121212121212121|-2glvV.k HdKV.k 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 smp0 WL0 1tB0 2L0|62e2","America/Bogota|BMT -05 -04|4U.g 50 40|0121|-2eb73.I 38yo3.I 2en0|90e5","America/Boise|PST PDT MST MWT MPT MDT|80 70 70 60 60 60|0101023425252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-261q0 1nX0 11B0 1nX0 8C10 JCL0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 Dd0 1Kn0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e4","America/Cambridge_Bay|-00 MST MWT MPT MDDT MDT CST CDT EST|0 70 60 60 50 60 60 50 50|0123141515151515151515151515151515151515151515678651515151515151515151515151515151515151515151515151515151515151515151515151|-21Jc0 RO90 8x20 ix0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11A0 1nX0 2K0 WQ0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e2","America/Campo_Grande|LMT -04 -03|3C.s 40 30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glwl.w HdLl.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|77e4","America/Cancun|LMT CST EST EDT CDT|5L.4 60 50 40 50|0123232341414141414141414141414141414141412|-1UQG0 2q2o0 yLB0 1lb0 14p0 1lb0 14p0 Lz0 xB0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 Dd0|63e4","America/Caracas|CMT -0430 -04|4r.E 4u 40|01212|-2kV7w.k 28KM2.k 1IwOu kqo0|29e5","America/Cayenne|LMT -04 -03|3t.k 40 30|012|-2mrwu.E 2gWou.E|58e3","America/Chicago|CST CDT EST CWT CPT|60 50 50 50 50|01010101010101010101010101010101010102010101010103401010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 1wp0 TX0 WN0 1qL0 1cN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 11B0 1Hz0 14p0 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|92e5","America/Chihuahua|LMT MST CST CDT MDT|74.k 70 60 50 60|0121212323241414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 2zQN0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|81e4","America/Costa_Rica|SJMT CST CDT|5A.d 60 50|0121212121|-1Xd6n.L 2lu0n.L Db0 1Kp0 Db0 pRB0 15b0 1kp0 mL0|12e5","America/Phoenix|MST MDT MWT|70 60 60|01010202010|-261r0 1nX0 11B0 1nX0 SgN0 4Al1 Ap0 1db0 SWqX 1cL0|42e5","America/Cuiaba|LMT -04 -03|3I.k 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glwf.E HdLf.E 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 4a10 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|54e4","America/Danmarkshavn|LMT -03 -02 GMT|1e.E 30 20 0|01212121212121212121212121212121213|-2a5WJ.k 2z5fJ.k 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 DC0|8","America/Dawson_Creek|PST PDT PWT PPT MST|80 70 70 70 70|0102301010101010101010101010101010101010101010101010101014|-25TO0 1in0 UGp0 8x10 iy0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 ML0|12e3","America/Dawson|YST YDT YWT YPT YDDT PST PDT MST|90 80 80 80 70 80 70 70|010102304056565656565656565656565656565656565656565656565656565656565656565656565656565656567|-25TN0 1in0 1o10 13V0 Ser0 8x00 iz0 LCL0 1fA0 jrA0 fNd0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1z90|13e2","America/Denver|MST MDT MWT MPT|70 60 60 60|01010101023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261r0 1nX0 11B0 1nX0 11B0 1qL0 WN0 mn0 Ord0 8x20 ix0 LCN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e5","America/Detroit|LMT CST EST EWT EPT EDT|5w.b 60 50 40 40 40|0123425252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-2Cgir.N peqr.N 156L0 8x40 iv0 6fd0 11z0 JxX1 SMX 1cN0 1cL0 aW10 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e5","America/Edmonton|LMT MST MDT MWT MPT|7x.Q 70 60 60 60|0121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2yd4q.8 shdq.8 1in0 17d0 hz0 2dB0 1fz0 1a10 11z0 1qN0 WL0 1qN0 11z0 IGN0 8x20 ix0 3NB0 11z0 XQp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|10e5","America/Eirunepe|LMT -05 -04|4D.s 50 40|0121212121212121212121212121212121|-2glvk.w HdLk.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0 yTd0 d5X0|31e3","America/El_Salvador|LMT CST CDT|5U.M 60 50|012121|-1XiG3.c 2Fvc3.c WL0 1qN0 WL0|11e5","America/Tijuana|LMT MST PST PDT PWT PPT|7M.4 70 80 70 70 70|012123245232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UQE0 4PX0 8mM0 8lc0 SN0 1cL0 pHB0 83r0 zI0 5O10 1Rz0 cOO0 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 BUp0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|20e5","America/Fort_Nelson|PST PDT PWT PPT MST|80 70 70 70 70|01023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010104|-25TO0 1in0 UGp0 8x10 iy0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0|39e2","America/Fort_Wayne|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|010101023010101010101010101040454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 QI10 Db0 RB0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 5Tz0 1o10 qLb0 1cL0 1cN0 1cL0 1qhd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","America/Fortaleza|LMT -03 -02|2y 30 20|0121212121212121212121212121212121212121|-2glxq HdLq 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 5z0 2mN0 On0|34e5","America/Glace_Bay|LMT AST ADT AWT APT|3X.M 40 30 30 30|012134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsI0.c CwO0.c 1in0 UGp0 8x50 iu0 iq10 11z0 Jg10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3","America/Godthab|LMT -03 -02|3q.U 30 20|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a5Ux.4 2z5dx.4 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e3","America/Goose_Bay|NST NDT NST NDT NWT NPT AST ADT ADDT|3u.Q 2u.Q 3u 2u 2u 2u 40 30 20|010232323232323245232323232323232323232323232323232323232326767676767676767676767676767676767676767676768676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-25TSt.8 1in0 DXb0 2HbX.8 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 WL0 1qN0 WL0 1qN0 7UHu itu 1tB0 WL0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1tB0 WL0 1ld0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 S10 g0u 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|76e2","America/Grand_Turk|KMT EST EDT AST|57.a 50 40 40|0121212121212121212121212121212121212121212121212121212121212121212121212132121212121212121212121212121212121212121|-2l1uQ.O 2HHBQ.O 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 7jA0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e2","America/Guatemala|LMT CST CDT|62.4 60 50|0121212121|-24KhV.U 2efXV.U An0 mtd0 Nz0 ifB0 17b0 zDB0 11z0|13e5","America/Guayaquil|QMT -05 -04|5e 50 40|0121|-1yVSK 2uILK rz0|27e5","America/Guyana|LMT -04 -0345 -03|3Q.D 40 3J 30|01231|-2mf87.l 8Hc7.l 2r7bJ Ey0f|80e4","America/Halifax|LMT AST ADT AWT APT|4e.o 40 30 30 30|0121212121212121212121212121212121212121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsHJ.A xzzJ.A 1db0 3I30 1in0 3HX0 IL0 1E10 ML0 1yN0 Pb0 1Bd0 Mn0 1Bd0 Rz0 1w10 Xb0 1w10 LX0 1w10 Xb0 1w10 Lz0 1C10 Jz0 1E10 OL0 1yN0 Un0 1qp0 Xb0 1qp0 11X0 1w10 Lz0 1HB0 LX0 1C10 FX0 1w10 Xb0 1qp0 Xb0 1BB0 LX0 1td0 Xb0 1qp0 Xb0 Rf0 8x50 iu0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 3Qp0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 3Qp0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 6i10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|39e4","America/Havana|HMT CST CDT|5t.A 50 40|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1Meuu.o 72zu.o ML0 sld0 An0 1Nd0 Db0 1Nd0 An0 6Ep0 An0 1Nd0 An0 JDd0 Mn0 1Ap0 On0 1fd0 11X0 1qN0 WL0 1wp0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 14n0 1ld0 14L0 1kN0 15b0 1kp0 1cL0 1cN0 1fz0 1a10 1fz0 1fB0 11z0 14p0 1nX0 11B0 1nX0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 1a10 1in0 1a10 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 17c0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 11A0 6i00 Rc0 1wo0 U00 1tA0 Rc0 1wo0 U00 1wo0 U00 1zc0 U00 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0|21e5","America/Hermosillo|LMT MST CST PST MDT|7n.Q 70 60 80 60|0121212131414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0|64e4","America/Indiana/Knox|CST CDT CWT CPT EST|60 50 50 50 50|0101023010101010101010101010101010101040101010101010101010101010101010101010101010101010141010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 11z0 1o10 11z0 1o10 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 3Cn0 8wp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 z8o0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","America/Indiana/Marengo|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101023010101010101010104545454545414545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 dyN0 11z0 6fd0 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 jrz0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1e6p0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","America/Indiana/Petersburg|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010104010101010101010101010141014545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 njX0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 3Fb0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 19co0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","America/Indiana/Tell_City|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010401054541010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 njX0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 8wn0 1cN0 1cL0 1cN0 1cK0 1cN0 1cL0 1qhd0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","America/Indiana/Vevay|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|010102304545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 kPB0 Awn0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1lnd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","America/Indiana/Vincennes|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010101010454541014545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 g0p0 11z0 1o10 11z0 1qL0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 caL0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","America/Indiana/Winamac|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010101010101010454541054545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 jrz0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1za0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","America/Inuvik|-00 PST PDDT MST MDT|0 80 60 70 60|0121343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-FnA0 tWU0 1fA0 wPe0 2pz0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|35e2","America/Iqaluit|-00 EWT EPT EST EDDT EDT CST CDT|0 40 40 50 30 40 60 50|01234353535353535353535353535353535353535353567353535353535353535353535353535353535353535353535353535353535353535353535353|-16K00 7nX0 iv0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|67e2","America/Jamaica|KMT EST EDT|57.a 50 40|0121212121212121212121|-2l1uQ.O 2uM1Q.O 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0|94e4","America/Juneau|PST PWT PPT PDT YDT YST AKST AKDT|80 70 70 70 80 90 90 80|01203030303030303030303030403030356767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cM0 1cM0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|33e3","America/Kentucky/Louisville|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101010102301010101010101010101010101454545454545414545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 3Fd0 Nb0 LPd0 11z0 RB0 8x30 iw0 1nX1 e0X 9vd0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 xz0 gso0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","America/Kentucky/Monticello|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101023010101010101010101010101010101010101010101010101010101010101010101454545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 SWp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","America/La_Paz|CMT BST -04|4w.A 3w.A 40|012|-1x37r.o 13b0|19e5","America/Lima|LMT -05 -04|58.A 50 40|0121212121212121|-2tyGP.o 1bDzP.o zX0 1aN0 1cL0 1cN0 1cL0 1PrB0 zX0 1O10 zX0 6Gp0 zX0 98p0 zX0|11e6","America/Los_Angeles|PST PDT PWT PPT|80 70 70 70|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261q0 1nX0 11B0 1nX0 SgN0 8x10 iy0 5Wp1 1VaX 3dA0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e6","America/Maceio|LMT -03 -02|2m.Q 30 20|012121212121212121212121212121212121212121|-2glxB.8 HdLB.8 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 8Q10 WL0 1tB0 5z0 2mN0 On0|93e4","America/Managua|MMT CST EST CDT|5J.c 60 50 50|0121313121213131|-1quie.M 1yAMe.M 4mn0 9Up0 Dz0 1K10 Dz0 s3F0 1KH0 DB0 9In0 k8p0 19X0 1o30 11y0|22e5","America/Manaus|LMT -04 -03|40.4 40 30|01212121212121212121212121212121|-2glvX.U HdKX.U 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0|19e5","America/Martinique|FFMT AST ADT|44.k 40 30|0121|-2mPTT.E 2LPbT.E 19X0|39e4","America/Matamoros|LMT CST CDT|6E 60 50|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1UQG0 2FjC0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|45e4","America/Mazatlan|LMT MST CST PST MDT|75.E 70 60 80 60|0121212131414141414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|44e4","America/Menominee|CST CDT CWT CPT EST|60 50 50 50 50|01010230101041010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 LCN0 1fz0 6410 9Jb0 1cM0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|85e2","America/Merida|LMT CST EST CDT|5W.s 60 50 50|0121313131313131313131313131313131313131313131313131313131313131313131313131313131313131|-1UQG0 2q2o0 2hz0 wu30 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|11e5","America/Metlakatla|PST PWT PPT PDT AKST AKDT|80 70 70 70 90 80|01203030303030303030303030303030304545450454545454545454545454545454545454545454|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1hU10 Rd0 1zb0 Op0 1zb0 Op0 1zb0 uM0 jB0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2","America/Mexico_City|LMT MST CST CDT CWT|6A.A 70 60 50 50|012121232324232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 gEn0 TX0 3xd0 Jb0 6zB0 SL0 e5d0 17b0 1Pff0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|20e6","America/Miquelon|LMT AST -03 -02|3I.E 40 30 20|012323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2mKkf.k 2LTAf.k gQ10 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|61e2","America/Moncton|EST AST ADT AWT APT|50 40 30 30 30|012121212121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsH0 CwN0 1in0 zAo0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1K10 Lz0 1zB0 NX0 1u10 Wn0 S20 8x50 iu0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14n1 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 ReX 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|64e3","America/Monterrey|LMT CST CDT|6F.g 60 50|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1UQG0 2FjC0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|41e5","America/Montevideo|LMT MMT -04 -03 -0330 -0230 -02 -0130|3I.P 3I.P 40 30 3u 2u 20 1u|012343434343434343434343435353636353636375363636363636363636363636363636363636363636363|-2tRUf.9 sVc0 8jcf.9 1db0 1dcu 1cLu 1dcu 1cLu ircu 11zu 1o0u 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 1qMu WLu 1fAu 1cLu 1o0u 11zu NAu 3jXu zXu Dq0u 19Xu pcu jz0 cm10 19X0 6tB0 1fbu 3o0u jX0 4vB0 xz0 3Cp0 mmu 1a10 IMu Db0 4c10 uL0 1Nd0 An0 1SN0 uL0 mp0 28L0 iPB0 un0 1SN0 xz0 1zd0 Lz0 1zd0 Rb0 1zd0 On0 1wp0 Rb0 s8p0 1fB0 1ip0 11z0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 11z0|17e5","America/Toronto|EST EDT EWT EPT|50 40 40 40|01010101010101010101010101010101010101010101012301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TR0 1in0 11Wu 1nzu 1fD0 WJ0 1wr0 Nb0 1Ap0 On0 1zd0 On0 1wp0 TX0 1tB0 TX0 1tB0 TX0 1tB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 4kM0 8x40 iv0 1o10 11z0 1nX0 11z0 1o10 11z0 1o10 1qL0 11D0 1nX0 11B0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e5","America/New_York|EST EDT EWT EPT|50 40 40 40|01010101010101010101010101010101010101010101010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261t0 1nX0 11B0 1nX0 11B0 1qL0 1a10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x40 iv0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e6","America/Nipigon|EST EDT EWT EPT|50 40 40 40|010123010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TR0 1in0 Rnb0 3je0 8x40 iv0 19yN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|16e2","America/Nome|NST NWT NPT BST BDT YST AKST AKDT|b0 a0 a0 b0 a0 90 90 80|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17SX0 8wW0 iB0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cl0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|38e2","America/Noronha|LMT -02 -01|29.E 20 10|0121212121212121212121212121212121212121|-2glxO.k HdKO.k 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|30e2","America/North_Dakota/Beulah|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101014545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","America/North_Dakota/Center|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101014545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","America/North_Dakota/New_Salem|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101454545454545454545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","America/Ojinaga|LMT MST CST CDT MDT|6V.E 70 60 50 60|0121212323241414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 2zQN0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e3","America/Pangnirtung|-00 AST AWT APT ADDT ADT EDT EST CST CDT|0 40 30 30 20 30 40 50 60 50|012314151515151515151515151515151515167676767689767676767676767676767676767676767676767676767676767676767676767676767676767|-1XiM0 PnG0 8x50 iu0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1o00 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2","America/Paramaribo|LMT PMT PMT -0330 -03|3E.E 3E.Q 3E.A 3u 30|01234|-2nDUj.k Wqo0.c qanX.I 1yVXN.o|24e4","America/Port-au-Prince|PPMT EST EDT|4N 50 40|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-28RHb 2FnMb 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14q0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 i6n0 1nX0 11B0 1nX0 d430 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 3iN0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5","America/Rio_Branco|LMT -05 -04|4v.c 50 40|01212121212121212121212121212121|-2glvs.M HdLs.M 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 NBd0 d5X0|31e4","America/Porto_Velho|LMT -04 -03|4f.A 40 30|012121212121212121212121212121|-2glvI.o HdKI.o 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0|37e4","America/Punta_Arenas|SMT -05 -04 -03|4G.K 50 40 30|0102021212121212121232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-2q2jh.e fJAh.e 5knG.K 1Vzh.e jRAG.K 1pbh.e 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 nHX0 op0 blz0 ko0 Qeo0 WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|","America/Rainy_River|CST CDT CWT CPT|60 50 50 50|010123010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TQ0 1in0 Rnb0 3je0 8x30 iw0 19yN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|842","America/Rankin_Inlet|-00 CST CDDT CDT EST|0 60 40 50 50|012131313131313131313131313131313131313131313431313131313131313131313131313131313131313131313131313131313131313131313131|-vDc0 keu0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e2","America/Recife|LMT -03 -02|2j.A 30 20|0121212121212121212121212121212121212121|-2glxE.o HdLE.o 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|33e5","America/Regina|LMT MST MDT MWT MPT CST|6W.A 70 60 60 60 60|012121212121212121212121341212121212121212121212121215|-2AD51.o uHe1.o 1in0 s2L0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 66N0 1cL0 1cN0 19X0 1fB0 1cL0 1fB0 1cL0 1cN0 1cL0 M30 8x20 ix0 1ip0 1cL0 1ip0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 3NB0 1cL0 1cN0|19e4","America/Resolute|-00 CST CDDT CDT EST|0 60 40 50 50|012131313131313131313131313131313131313131313431313131313431313131313131313131313131313131313131313131313131313131313131|-SnA0 GWS0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|229","America/Santarem|LMT -04 -03|3C.M 40 30|0121212121212121212121212121212|-2glwl.c HdLl.c 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 NBd0|21e4","America/Santiago|SMT -05 -04 -03|4G.K 50 40 30|010202121212121212321232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-2q2jh.e fJAh.e 5knG.K 1Vzh.e jRAG.K 1pbh.e 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 nHX0 op0 9Bz0 jb0 1oN0 ko0 Qeo0 WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0|62e5","America/Santo_Domingo|SDMT EST EDT -0430 AST|4E 50 40 4u 40|01213131313131414|-1ttjk 1lJMk Mn0 6sp0 Lbu 1Cou yLu 1RAu wLu 1QMu xzu 1Q0u xXu 1PAu 13jB0 e00|29e5","America/Sao_Paulo|LMT -03 -02|36.s 30 20|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glwR.w HdKR.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 pTd0 PX0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|20e6","America/Scoresbysund|LMT -02 -01 +00|1r.Q 20 10 0|0121323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2a5Ww.8 2z5ew.8 1a00 1cK0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|452","America/Sitka|PST PWT PPT PDT YST AKST AKDT|80 70 70 70 90 90 80|01203030303030303030303030303030345656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|90e2","America/St_Johns|NST NDT NST NDT NWT NPT NDDT|3u.Q 2u.Q 3u 2u 2u 2u 1u|01010101010101010101010101010101010102323232323232324523232323232323232323232323232323232323232323232323232323232323232323232323232323232326232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-28oit.8 14L0 1nB0 1in0 1gm0 Dz0 1JB0 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 1cL0 1fB0 19X0 1fB0 19X0 10O0 eKX.8 19X0 1iq0 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 WL0 1qN0 WL0 1qN0 7UHu itu 1tB0 WL0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1tB0 WL0 1ld0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4","America/Swift_Current|LMT MST MDT MWT MPT CST|7b.k 70 60 60 60 60|012134121212121212121215|-2AD4M.E uHdM.E 1in0 UGp0 8x20 ix0 1o10 17b0 1ip0 11z0 1o10 11z0 1o10 11z0 isN0 1cL0 3Cp0 1cL0 1cN0 11z0 1qN0 WL0 pMp0|16e3","America/Tegucigalpa|LMT CST CDT|5M.Q 60 50|01212121|-1WGGb.8 2ETcb.8 WL0 1qN0 WL0 GRd0 AL0|11e5","America/Thule|LMT AST ADT|4z.8 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a5To.Q 31NBo.Q 1cL0 1cN0 1cL0 1fB0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|656","America/Thunder_Bay|CST EST EWT EPT EDT|60 50 40 40 40|0123141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141|-2q5S0 1iaN0 8x40 iv0 XNB0 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4","America/Vancouver|PST PDT PWT PPT|80 70 70 70|0102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TO0 1in0 UGp0 8x10 iy0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5","America/Whitehorse|YST YDT YWT YPT YDDT PST PDT MST|90 80 80 80 70 80 70 70|010102304056565656565656565656565656565656565656565656565656565656565656565656565656565656567|-25TN0 1in0 1o10 13V0 Ser0 8x00 iz0 LCL0 1fA0 3NA0 vrd0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1z90|23e3","America/Winnipeg|CST CDT CWT CPT|60 50 50 50|010101023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aIi0 WL0 3ND0 1in0 Jap0 Rb0 aCN0 8x30 iw0 1tB0 11z0 1ip0 11z0 1o10 11z0 1o10 11z0 1rd0 10L0 1op0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 1cL0 1cN0 11z0 6i10 WL0 6i10 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|66e4","America/Yakutat|YST YWT YPT YDT AKST AKDT|90 80 80 80 90 80|01203030303030303030303030303030304545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-17T10 8x00 iz0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cn0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|642","America/Yellowknife|-00 MST MWT MPT MDDT MDT|0 70 60 60 50 60|012314151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151|-1pdA0 hix0 8x20 ix0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3","Antarctica/Casey|-00 +08 +11|0 -80 -b0|0121212121212|-2q00 1DjS0 T90 40P0 KL0 blz0 3m10 1o30 14k0 1kr0 12l0 1o01|10","Antarctica/Davis|-00 +07 +05|0 -70 -50|01012121|-vyo0 iXt0 alj0 1D7v0 VB0 3Wn0 KN0|70","Pacific/Port_Moresby|+10|-a0|0||25e4","Antarctica/Macquarie|AEST AEDT -00|-a0 -b0 0|010201010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-29E80 1a00 4SK0 1ayy0 Lvs0 1cM0 1o00 Rc0 1wo0 Rc0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 3Co0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|1","Antarctica/Mawson|-00 +06 +05|0 -60 -50|012|-CEo0 2fyk0|60","Pacific/Auckland|NZMT NZST NZST NZDT|-bu -cu -c0 -d0|01020202020202020202020202023232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-1GCVu Lz0 1tB0 11zu 1o0u 11zu 1o0u 11zu 1o0u 14nu 1lcu 14nu 1lcu 1lbu 11Au 1nXu 11Au 1nXu 11Au 1nXu 11Au 1nXu 11Au 1qLu WMu 1qLu 11Au 1n1bu IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00|14e5","Antarctica/Palmer|-00 -03 -04 -02|0 30 40 20|0121212121213121212121212121212121212121212121212121212121212121212121212121212121|-cao0 nD0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 jsN0 14N0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|40","Antarctica/Rothera|-00 -03|0 30|01|gOo0|130","Asia/Riyadh|LMT +03|-36.Q -30|01|-TvD6.Q|57e5","Antarctica/Troll|-00 +00 +02|0 0 -20|01212121212121212121212121212121212121212121212121212121212121212121|1puo0 hd0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|40","Antarctica/Vostok|-00 +06|0 -60|01|-tjA0|25","Europe/Oslo|CET CEST|-10 -20|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2awM0 Qm0 W6o0 5pf0 WM0 1fA0 1cM0 1cM0 1cM0 1cM0 wJc0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1qM0 WM0 zpc0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|62e4","Asia/Almaty|LMT +05 +06 +07|-57.M -50 -60 -70|012323232323232323232321232323232323232323232323232|-1Pc57.M eUo7.M 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|15e5","Asia/Amman|LMT EET EEST|-2n.I -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1yW2n.I 1HiMn.I KL0 1oN0 11b0 1oN0 11b0 1pd0 1dz0 1cp0 11b0 1op0 11b0 fO10 1db0 1e10 1cL0 1cN0 1cL0 1cN0 1fz0 1pd0 10n0 1ld0 14n0 1hB0 15b0 1ip0 19X0 1cN0 1cL0 1cN0 17b0 1ld0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1So0 y00 1fc0 1dc0 1co0 1dc0 1cM0 1cM0 1cM0 1o00 11A0 1lc0 17c0 1cM0 1cM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 4bX0 Dd0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 LA0 1C00 LA0 1C00 Oo0 1zc0 Oo0 1C00 LA0 1C00 LA0 1C00 LA0 1C00 LA0 1C00 Oo0 1zc0 Oo0 1C00 LA0 1C00 LA0 1C00 LA0 1C00 LA0 1C00 Oo0 1C00 LA0 1C00|25e5","Asia/Anadyr|LMT +12 +13 +14 +11|-bN.U -c0 -d0 -e0 -b0|01232121212121212121214121212121212121212121212121212121212141|-1PcbN.U eUnN.U 23CL0 1db0 2q10 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|13e3","Asia/Aqtau|LMT +04 +05 +06|-3l.4 -40 -50 -60|012323232323232323232123232312121212121212121212|-1Pc3l.4 eUnl.4 24PX0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|15e4","Asia/Aqtobe|LMT +04 +05 +06|-3M.E -40 -50 -60|0123232323232323232321232323232323232323232323232|-1Pc3M.E eUnM.E 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|27e4","Asia/Ashgabat|LMT +04 +05 +06|-3R.w -40 -50 -60|0123232323232323232323212|-1Pc3R.w eUnR.w 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0|41e4","Asia/Atyrau|LMT +03 +05 +06 +04|-3r.I -30 -50 -60 -40|01232323232323232323242323232323232324242424242|-1Pc3r.I eUor.I 24PW0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 2sp0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|","Asia/Baghdad|BMT +03 +04|-2V.A -30 -40|012121212121212121212121212121212121212121212121212121|-26BeV.A 2ACnV.A 11b0 1cp0 1dz0 1dd0 1db0 1cN0 1cp0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1de0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0|66e5","Asia/Qatar|LMT +04 +03|-3q.8 -40 -30|012|-21Jfq.8 27BXq.8|96e4","Asia/Baku|LMT +03 +04 +05|-3j.o -30 -40 -50|01232323232323232323232123232323232323232323232323232323232323232|-1Pc3j.o 1jUoj.o WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 9Je0 1o00 11z0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|27e5","Asia/Bangkok|BMT +07|-6G.4 -70|01|-218SG.4|15e6","Asia/Barnaul|LMT +06 +07 +08|-5z -60 -70 -80|0123232323232323232323212323232321212121212121212121212121212121212|-21S5z pCnz 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 p90 LE0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|","Asia/Beirut|EET EEST|-20 -30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-21aq0 1on0 1410 1db0 19B0 1in0 1ip0 WL0 1lQp0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 q6N0 En0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1op0 11b0 dA10 17b0 1iN0 17b0 1iN0 17b0 1iN0 17b0 1vB0 SL0 1mp0 13z0 1iN0 17b0 1iN0 17b0 1jd0 12n0 1a10 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0|22e5","Asia/Bishkek|LMT +05 +06 +07|-4W.o -50 -60 -70|012323232323232323232321212121212121212121212121212|-1Pc4W.o eUnW.o 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2e00 1tX0 17b0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1cPu 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0|87e4","Asia/Brunei|LMT +0730 +08|-7D.E -7u -80|012|-1KITD.E gDc9.E|42e4","Asia/Kolkata|MMT IST +0630|-5l.a -5u -6u|012121|-2zOtl.a 1r2LP.a 1un0 HB0 7zX0|15e6","Asia/Chita|LMT +08 +09 +10|-7x.Q -80 -90 -a0|012323232323232323232321232323232323232323232323232323232323232312|-21Q7x.Q pAnx.Q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3re0|33e4","Asia/Choibalsan|LMT +07 +08 +10 +09|-7C -70 -80 -a0 -90|0123434343434343434343434343434343434343434343424242|-2APHC 2UkoC cKn0 1da0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 3Db0 h1f0 1cJ0 1cP0 1cJ0|38e3","Asia/Shanghai|CST CDT|-80 -90|01010101010101010101010101010|-23uw0 18n0 OjB0 Rz0 11d0 1wL0 A10 8HX0 1G10 Tz0 1ip0 1jX0 1cN0 11b0 1oN0 aL0 1tU30 Rb0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0|23e6","Asia/Colombo|MMT +0530 +06 +0630|-5j.w -5u -60 -6u|01231321|-2zOtj.w 1rFbN.w 1zzu 7Apu 23dz0 11zu n3cu|22e5","Asia/Dhaka|HMT +0630 +0530 +06 +07|-5R.k -6u -5u -60 -70|0121343|-18LFR.k 1unn.k HB0 m6n0 2kxbu 1i00|16e6","Asia/Damascus|LMT EET EEST|-2p.c -20 -30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-21Jep.c Hep.c 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1xRB0 11X0 1oN0 10L0 1pB0 11b0 1oN0 10L0 1mp0 13X0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 Nb0 1AN0 Nb0 bcp0 19X0 1gp0 19X0 3ld0 1xX0 Vd0 1Bz0 Sp0 1vX0 10p0 1dz0 1cN0 1cL0 1db0 1db0 1g10 1an0 1ap0 1db0 1fd0 1db0 1cN0 1db0 1dd0 1db0 1cp0 1dz0 1c10 1dX0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 19z0 1fB0 1qL0 11B0 1on0 Wp0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0|26e5","Asia/Dili|LMT +08 +09|-8m.k -80 -90|01212|-2le8m.k 1dnXm.k 1nfA0 Xld0|19e4","Asia/Dubai|LMT +04|-3F.c -40|01|-21JfF.c|39e5","Asia/Dushanbe|LMT +05 +06 +07|-4z.c -50 -60 -70|012323232323232323232321|-1Pc4z.c eUnz.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2hB0|76e4","Asia/Famagusta|LMT EET EEST +03|-2f.M -20 -30 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212312121212121212121212121212121212121212121|-1Vc2f.M 2a3cf.M 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 15U0 2Ks0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|","Asia/Gaza|EET EEST IST IDT|-20 -30 -20 -30|010101010101010101010101010101010123232323232323232323232323232320101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1c2o0 MM0 iM0 4JA0 10o0 1pA0 10M0 1pA0 16o0 1jA0 16o0 1jA0 pBa0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 dW0 hfB0 Db0 1fB0 Rb0 bXB0 gM0 8Q00 IM0 1wo0 TX0 1HB0 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18N0 1bz0 19z0 1gp0 1610 1iL0 11z0 1o10 14o0 1lA1 SKX 1xd1 MKX 1AN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nA0 1210 1qL0 WN0 1qL0 WN0 1qL0 11c0 1on0 11B0 1o00 11A0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1nA0 1200 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1nA0 1200 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1qo0 Xc0 1qo0|18e5","Asia/Hebron|EET EEST IST IDT|-20 -30 -20 -30|01010101010101010101010101010101012323232323232323232323232323232010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1c2o0 MM0 iM0 4JA0 10o0 1pA0 10M0 1pA0 16o0 1jA0 16o0 1jA0 pBa0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 dW0 hfB0 Db0 1fB0 Rb0 bXB0 gM0 8Q00 IM0 1wo0 TX0 1HB0 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18N0 1bz0 19z0 1gp0 1610 1iL0 12L0 1mN0 14o0 1lc0 Tb0 1xd1 MKX bB0 cn0 1cN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nA0 1210 1qL0 WN0 1qL0 WN0 1qL0 11c0 1on0 11B0 1o00 11A0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1nA0 1200 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1nA0 1200 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 Xc0 1qo0 1200 1qo0 Xc0 1qo0|25e4","Asia/Ho_Chi_Minh|LMT PLMT +07 +08 +09|-76.E -76.u -70 -80 -90|0123423232|-2yC76.E bK00.a 1h7b6.u 5lz0 18o0 3Oq0 k5b0 aW00 BAM0|90e5","Asia/Hong_Kong|LMT HKT HKST HKWT JST|-7A.G -80 -90 -8u -90|0123412121212121212121212121212121212121212121212121212121212121212121|-2CFH0 1taO0 Hc0 xUu 9tBu 11z0 1tDu Rc0 1wo0 11A0 1cM0 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1nX0 U10 1tz0 U10 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 Rd0 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 17d0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1cL0 6fd0 14n0|73e5","Asia/Hovd|LMT +06 +07 +08|-66.A -60 -70 -80|012323232323232323232323232323232323232323232323232|-2APG6.A 2Uko6.A cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|81e3","Asia/Irkutsk|IMT +07 +08 +09|-6V.5 -70 -80 -90|01232323232323232323232123232323232323232323232323232323232323232|-21zGV.5 pjXV.5 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4","Europe/Istanbul|IMT EET EEST +03 +04|-1U.U -20 -30 -30 -40|0121212121212121212121212121212121212121212121234312121212121212121212121212121212121212121212121212121212121212123|-2ogNU.U dzzU.U 11b0 8tB0 1on0 1410 1db0 19B0 1in0 3Rd0 Un0 1oN0 11b0 zSN0 CL0 mp0 1Vz0 1gN0 8yn0 1yp0 ML0 1kp0 17b0 1ip0 17b0 1fB0 19X0 1ip0 19X0 1ip0 17b0 qdB0 38L0 1jd0 Tz0 l6O0 11A0 WN0 1qL0 TB0 1tX0 U10 1tz0 11B0 1in0 17d0 z90 cne0 pb0 2Cp0 1800 14o0 1dc0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1a00 1fA0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WO0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 Xc0 1qo0 WM0 1qM0 11A0 1o00 1200 1nA0 11A0 1tA0 U00 15w0|13e6","Asia/Jakarta|BMT +0720 +0730 +09 +08 WIB|-77.c -7k -7u -90 -80 -70|01232425|-1Q0Tk luM0 mPzO 8vWu 6kpu 4PXu xhcu|31e6","Asia/Jayapura|LMT +09 +0930 WIT|-9m.M -90 -9u -90|0123|-1uu9m.M sMMm.M L4nu|26e4","Asia/Jerusalem|JMT IST IDT IDDT|-2k.E -20 -30 -40|01212121212121321212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-26Bek.E SyOk.E MM0 iM0 4JA0 10o0 1pA0 10M0 1pA0 16o0 1jA0 16o0 1jA0 3LA0 Eo0 oo0 1co0 1dA0 16o0 10M0 1jc0 1tA0 14o0 1cM0 1a00 11A0 1Nc0 Ao0 1Nc0 Ao0 1Ko0 LA0 1o00 WM0 EQK0 Db0 1fB0 Rb0 bXB0 gM0 8Q00 IM0 1wo0 TX0 1HB0 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 1hB0 1dX0 1ep0 1aL0 1eN0 17X0 1nf0 11z0 1tB0 19W0 1e10 17b0 1ep0 1gL0 18N0 1fz0 1eN0 17b0 1gq0 1gn0 19d0 1dz0 1c10 17X0 1hB0 1gn0 19d0 1dz0 1c10 17X0 1kp0 1dz0 1c10 1aL0 1eN0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0|81e4","Asia/Kabul|+04 +0430|-40 -4u|01|-10Qs0|46e5","Asia/Kamchatka|LMT +11 +12 +13|-ay.A -b0 -c0 -d0|012323232323232323232321232323232323232323232323232323232323212|-1SLKy.A ivXy.A 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|18e4","Asia/Karachi|LMT +0530 +0630 +05 PKT PKST|-4s.c -5u -6u -50 -50 -60|012134545454|-2xoss.c 1qOKW.c 7zX0 eup0 LqMu 1fy00 1cL0 dK10 11b0 1610 1jX0|24e6","Asia/Urumqi|LMT +06|-5O.k -60|01|-1GgtO.k|32e5","Asia/Kathmandu|LMT +0530 +0545|-5F.g -5u -5J|012|-21JhF.g 2EGMb.g|12e5","Asia/Khandyga|LMT +08 +09 +10 +11|-92.d -80 -90 -a0 -b0|0123232323232323232323212323232323232323232323232343434343434343432|-21Q92.d pAp2.d 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 qK0 yN0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|66e2","Asia/Krasnoyarsk|LMT +06 +07 +08|-6b.q -60 -70 -80|01232323232323232323232123232323232323232323232323232323232323232|-21Hib.q prAb.q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|10e5","Asia/Kuala_Lumpur|SMT +07 +0720 +0730 +09 +08|-6T.p -70 -7k -7u -90 -80|0123435|-2Bg6T.p 17anT.p l5XE 17bO 8Fyu 1so1u|71e5","Asia/Kuching|LMT +0730 +08 +0820 +09|-7l.k -7u -80 -8k -90|0123232323232323242|-1KITl.k gDbP.k 6ynu AnE 1O0k AnE 1NAk AnE 1NAk AnE 1NAk AnE 1O0k AnE 1NAk AnE pAk 8Fz0|13e4","Asia/Macau|LMT CST +09 +10 CDT|-7y.a -80 -90 -a0 -90|012323214141414141414141414141414141414141414141414141414141414141414141|-2CFHy.a 1uqKy.a PX0 1kn0 15B0 11b0 4Qq0 1oM0 11c0 1ko0 1u00 11A0 1cM0 11c0 1o00 11A0 1o00 11A0 1oo0 1400 1o00 11A0 1o00 U00 1tA0 U00 1wo0 Rc0 1wru U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 Rd0 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 17d0 1cK0 1cO0 1cK0 1cO0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1cL0 6fd0 14n0|57e4","Asia/Magadan|LMT +10 +11 +12|-a3.c -a0 -b0 -c0|012323232323232323232321232323232323232323232323232323232323232312|-1Pca3.c eUo3.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Cq0|95e3","Asia/Makassar|LMT MMT +08 +09 WITA|-7V.A -7V.A -80 -90 -80|01234|-21JjV.A vfc0 myLV.A 8ML0|15e5","Asia/Manila|PST PDT JST|-80 -90 -90|010201010|-1kJI0 AL0 cK10 65X0 mXB0 vX0 VK10 1db0|24e6","Asia/Nicosia|LMT EET EEST|-2d.s -20 -30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1Vc2d.s 2a3cd.s 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|32e4","Asia/Novokuznetsk|LMT +06 +07 +08|-5M.M -60 -70 -80|012323232323232323232321232323232323232323232323232323232323212|-1PctM.M eULM.M 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|55e4","Asia/Novosibirsk|LMT +06 +07 +08|-5v.E -60 -70 -80|0123232323232323232323212323212121212121212121212121212121212121212|-21Qnv.E pAFv.E 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 ml0 Os0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 4eN0|15e5","Asia/Omsk|LMT +05 +06 +07|-4R.u -50 -60 -70|01232323232323232323232123232323232323232323232323232323232323232|-224sR.u pMLR.u 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|12e5","Asia/Oral|LMT +03 +05 +06 +04|-3p.o -30 -50 -60 -40|01232323232323232424242424242424242424242424242|-1Pc3p.o eUop.o 23CK0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 1cM0 IM0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|27e4","Asia/Pontianak|LMT PMT +0730 +09 +08 WITA WIB|-7h.k -7h.k -7u -90 -80 -80 -70|012324256|-2ua7h.k XE00 munL.k 8Rau 6kpu 4PXu xhcu Wqnu|23e4","Asia/Pyongyang|LMT KST JST KST|-8n -8u -90 -90|012313|-2um8n 97XR 1lTzu 2Onc0 6BA0|29e5","Asia/Qostanay|LMT +04 +05 +06|-4e.s -40 -50 -60|012323232323232323232123232323232323232323232323|-1Pc4e.s eUoe.s 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|","Asia/Qyzylorda|LMT +04 +05 +06|-4l.Q -40 -50 -60|01232323232323232323232323232323232323232323232|-1Pc4l.Q eUol.Q 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 3ao0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 zQl0|73e4","Asia/Rangoon|RMT +0630 +09|-6o.L -6u -90|0121|-21Jio.L SmnS.L 7j9u|48e5","Asia/Sakhalin|LMT +09 +11 +12 +10|-9u.M -90 -b0 -c0 -a0|01232323232323232323232423232323232424242424242424242424242424242|-2AGVu.M 1BoMu.M 1qFa0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 2pB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|58e4","Asia/Samarkand|LMT +04 +05 +06|-4r.R -40 -50 -60|01232323232323232323232|-1Pc4r.R eUor.R 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|36e4","Asia/Seoul|LMT KST JST KST KDT KDT|-8r.Q -8u -90 -90 -a0 -9u|012343434343151515151515134343|-2um8r.Q 97XV.Q 1m1zu 6CM0 Fz0 1kN0 14n0 1kN0 14L0 1zd0 On0 69B0 2I0u OL0 1FB0 Rb0 1qN0 TX0 1tB0 TX0 1tB0 TX0 1tB0 TX0 2ap0 12FBu 11A0 1o00 11A0|23e6","Asia/Srednekolymsk|LMT +10 +11 +12|-ae.Q -a0 -b0 -c0|01232323232323232323232123232323232323232323232323232323232323232|-1Pcae.Q eUoe.Q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|35e2","Asia/Taipei|CST JST CDT|-80 -90 -90|01020202020202020202020202020202020202020|-1iw80 joM0 1yo0 Tz0 1ip0 1jX0 1cN0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 10N0 1BX0 10p0 1pz0 10p0 1pz0 10p0 1db0 1dd0 1db0 1cN0 1db0 1cN0 1db0 1cN0 1db0 1BB0 ML0 1Bd0 ML0 uq10 1db0 1cN0 1db0 97B0 AL0|74e5","Asia/Tashkent|LMT +05 +06 +07|-4B.b -50 -60 -70|012323232323232323232321|-1Pc4B.b eUnB.b 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0|23e5","Asia/Tbilisi|TBMT +03 +04 +05|-2X.b -30 -40 -50|0123232323232323232323212121232323232323232323212|-1Pc2X.b 1jUnX.b WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cK0 1cL0 1cN0 1cL0 1cN0 2pz0 1cL0 1fB0 3Nz0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 An0 Os0 WM0|11e5","Asia/Tehran|LMT TMT +0330 +04 +05 +0430|-3p.I -3p.I -3u -40 -50 -4u|01234325252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-2btDp.I 1d3c0 1huLT.I TXu 1pz0 sN0 vAu 1cL0 1dB0 1en0 pNB0 UL0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 64p0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0|14e6","Asia/Thimphu|LMT +0530 +06|-5W.A -5u -60|012|-Su5W.A 1BGMs.A|79e3","Asia/Tokyo|JST JDT|-90 -a0|010101010|-QJJ0 Rc0 1lc0 14o0 1zc0 Oo0 1zc0 Oo0|38e6","Asia/Tomsk|LMT +06 +07 +08|-5D.P -60 -70 -80|0123232323232323232323212323232323232323232323212121212121212121212|-21NhD.P pxzD.P 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 co0 1bB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Qp0|10e5","Asia/Ulaanbaatar|LMT +07 +08 +09|-77.w -70 -80 -90|012323232323232323232323232323232323232323232323232|-2APH7.w 2Uko7.w cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|12e5","Asia/Ust-Nera|LMT +08 +09 +12 +11 +10|-9w.S -80 -90 -c0 -b0 -a0|012343434343434343434345434343434343434343434343434343434343434345|-21Q9w.S pApw.S 23CL0 1d90 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|65e2","Asia/Vladivostok|LMT +09 +10 +11|-8L.v -90 -a0 -b0|01232323232323232323232123232323232323232323232323232323232323232|-1SJIL.v itXL.v 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4","Asia/Yakutsk|LMT +08 +09 +10|-8C.W -80 -90 -a0|01232323232323232323232123232323232323232323232323232323232323232|-21Q8C.W pAoC.W 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|28e4","Asia/Yekaterinburg|LMT PMT +04 +05 +06|-42.x -3J.5 -40 -50 -60|012343434343434343434343234343434343434343434343434343434343434343|-2ag42.x 7mQh.s qBvJ.5 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|14e5","Asia/Yerevan|LMT +03 +04 +05|-2W -30 -40 -50|0123232323232323232323212121212323232323232323232323232323232|-1Pc2W 1jUnW WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 4RX0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|13e5","Atlantic/Azores|HMT -02 -01 +00 WET|1S.w 20 10 0 0|0121212121212121212121212121212121212121212123212321232123212121212121212121212121212121212121212121232323232323232323232323232323234323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2ldW0 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 qIl0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|25e4","Atlantic/Bermuda|BMT BST AST ADT|4j.i 3j.i 40 30|010102323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-28p7E.G 1bb0 1i10 11X0 ru30 thbE.G 1PX0 11B0 1tz0 Rd0 1zb0 Op0 1zb0 3I10 Lz0 1EN0 FX0 1HB0 FX0 1Kp0 Db0 1Kp0 Db0 1Kp0 FX0 93d0 11z0 GAp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e3","Atlantic/Canary|LMT -01 WET WEST|11.A 10 0 -10|01232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UtaW.o XPAW.o 1lAK0 1a10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4","Atlantic/Cape_Verde|LMT -02 -01|1y.4 20 10|01212|-2ldW0 1eEo0 7zX0 1djf0|50e4","Atlantic/Faroe|LMT WET WEST|r.4 0 -10|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2uSnw.U 2Wgow.U 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|49e3","Atlantic/Madeira|FMT -01 +00 +01 WET WEST|17.A 10 0 -10 0 -10|0121212121212121212121212121212121212121212123212321232123212121212121212121212121212121212121212121454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-2ldX0 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 qIl0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|27e4","Atlantic/Reykjavik|LMT -01 +00 GMT|1s 10 0 0|012121212121212121212121212121212121212121212121212121212121212121213|-2uWmw mfaw 1Bd0 ML0 1LB0 Cn0 1LB0 3fX0 C10 HrX0 1cO0 LB0 1EL0 LA0 1C00 Oo0 1wo0 Rc0 1wo0 Rc0 1wo0 Rc0 1zc0 Oo0 1zc0 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0|12e4","Atlantic/South_Georgia|-02|20|0||30","Atlantic/Stanley|SMT -04 -03 -02|3P.o 40 30 20|012121212121212323212121212121212121212121212121212121212121212121212|-2kJw8.A 12bA8.A 19X0 1fB0 19X0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 Cn0 1Cc10 WL0 1qL0 U10 1tz0 2mN0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 U10 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qN0 U10 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 U10 1tz0 U10 1tz0 U10|21e2","Australia/Sydney|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293k0 xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00 17c00 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|40e5","Australia/Adelaide|ACST ACDT|-9u -au|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293ju xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00 17c00 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 WM0 1qM0 Rc0 1zc0 U00 1tA0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|11e5","Australia/Brisbane|AEST AEDT|-a0 -b0|01010101010101010|-293k0 xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00 17c00 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0|20e5","Australia/Broken_Hill|ACST ACDT|-9u -au|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293ju xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00 17c00 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|18e3","Australia/Hobart|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-29E80 1a00 1qM0 Oo0 1zc0 Oo0 TAo0 yM0 1cM0 1cM0 1fA0 1a00 VfA0 1cM0 1o00 Rc0 1wo0 Rc0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|21e4","Australia/Darwin|ACST ACDT|-9u -au|010101010|-293ju xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00|12e4","Australia/Eucla|+0845 +0945|-8J -9J|0101010101010101010|-293iJ xc0 10jc0 yM0 1cM0 1cM0 1gSo0 Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|368","Australia/Lord_Howe|AEST +1030 +1130 +11|-a0 -au -bu -b0|0121212121313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313|raC0 1zdu Rb0 1zd0 On0 1zd0 On0 1zd0 On0 1zd0 TXu 1qMu WLu 1tAu WLu 1tAu TXu 1tAu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu 11zu 1o0u 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 11Au 1nXu 1qMu 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 1qMu 11zu 1o0u WLu 1qMu 14nu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu|347","Australia/Lindeman|AEST AEDT|-a0 -b0|010101010101010101010|-293k0 xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00 17c00 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0|10","Australia/Melbourne|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293k0 xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00 17c00 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1qM0 11A0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|39e5","Australia/Perth|AWST AWDT|-80 -90|0101010101010101010|-293i0 xc0 10jc0 yM0 1cM0 1cM0 1gSo0 Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|18e5","CET|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|","Pacific/Easter|EMT -07 -06 -05|7h.s 70 60 50|012121212121212121212121212123232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-1uSgG.w 1s4IG.w WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 2pA0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0|30e2","CST6CDT|CST CDT CWT CPT|60 50 50 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","EET|EET EEST|-20 -30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|","Europe/Dublin|DMT IST GMT BST IST|p.l -y.D 0 -10 -10|01232323232324242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242|-2ax9y.D Rc0 1fzy.D 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 g600 14o0 1wo0 17c0 1io0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1a00 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1tA0 IM0 90o0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5","EST|EST|50|0||","EST5EDT|EST EDT EWT EPT|50 40 40 40|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261t0 1nX0 11B0 1nX0 SgN0 8x40 iv0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","Etc/GMT-0|GMT|0|0||","Etc/GMT-1|+01|-10|0||","Etc/GMT-11|+11|-b0|0||","Pacific/Tarawa|+12|-c0|0||29e3","Etc/GMT-13|+13|-d0|0||","Etc/GMT-14|+14|-e0|0||","Etc/GMT-2|+02|-20|0||","Etc/GMT-3|+03|-30|0||","Etc/GMT-4|+04|-40|0||","Etc/GMT-5|+05|-50|0||","Etc/GMT-6|+06|-60|0||","Indian/Christmas|+07|-70|0||21e2","Etc/GMT-8|+08|-80|0||","Pacific/Palau|+09|-90|0||21e3","Etc/GMT+1|-01|10|0||","Etc/GMT+10|-10|a0|0||","Etc/GMT+11|-11|b0|0||","Etc/GMT+12|-12|c0|0||","Etc/GMT+3|-03|30|0||","Etc/GMT+4|-04|40|0||","Etc/GMT+5|-05|50|0||","Etc/GMT+6|-06|60|0||","Etc/GMT+7|-07|70|0||","Etc/GMT+8|-08|80|0||","Etc/GMT+9|-09|90|0||","Etc/UTC|UTC|0|0||","Europe/Amsterdam|AMT NST +0120 +0020 CEST CET|-j.w -1j.w -1k -k -20 -10|010101010101010101010101010101010101010101012323234545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545|-2aFcj.w 11b0 1iP0 11A0 1io0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1co0 1io0 1yo0 Pc0 1a00 1fA0 1Bc0 Mo0 1tc0 Uo0 1tA0 U00 1uo0 W00 1s00 VA0 1so0 Vc0 1sM0 UM0 1wo0 Rc0 1u00 Wo0 1rA0 W00 1s00 VA0 1sM0 UM0 1w00 fV0 BCX.w 1tA0 U00 1u00 Wo0 1sm0 601k WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|16e5","Europe/Andorra|WET CET CEST|0 -10 -20|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-UBA0 1xIN0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|79e3","Europe/Astrakhan|LMT +03 +04 +05|-3c.c -30 -40 -50|012323232323232323212121212121212121212121212121212121212121212|-1Pcrc.c eUMc.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|10e5","Europe/Athens|AMT EET EEST CEST CET|-1y.Q -20 -30 -20 -10|012123434121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a61x.Q CNbx.Q mn0 kU10 9b0 3Es0 Xa0 1fb0 1dd0 k3X0 Nz0 SCp0 1vc0 SO0 1cM0 1a00 1ao0 1fc0 1a10 1fG0 1cg0 1dX0 1bX0 1cQ0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|35e5","Europe/London|GMT BST BDST|0 -10 -20|0101010101010101010101010101010101010101010101010121212121210101210101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2axa0 Rc0 1fA0 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 2Rz0 Dc0 1zc0 Oo0 1zc0 Rc0 1wo0 17c0 1iM0 FA0 xB0 1fA0 1a00 14o0 bb0 LA0 xB0 Rc0 1wo0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1a00 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1tA0 IM0 90o0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|10e6","Europe/Belgrade|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-19RC0 3IP0 WM0 1fA0 1cM0 1cM0 1rc0 Qo0 1vmo0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5","Europe/Berlin|CET CEST CEMT|-10 -20 -30|01010101010101210101210101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 kL0 Nc0 m10 WM0 1ao0 1cp0 dX0 jz0 Dd0 1io0 17c0 1fA0 1a00 1ehA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|41e5","Europe/Prague|CET CEST GMT|-10 -20 0|01010101010101010201010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 1cM0 1qM0 11c0 mp0 xA0 mn0 17c0 1io0 17c0 1fc0 1ao0 1bNc0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|13e5","Europe/Brussels|WET CET CEST WEST|0 -10 -20 -10|0121212103030303030303030303030303030303030303030303212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2ehc0 3zX0 11c0 1iO0 11A0 1o00 11A0 my0 Ic0 1qM0 Rc0 1EM0 UM0 1u00 10o0 1io0 1io0 17c0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a30 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 y00 5Wn0 WM0 1fA0 1cM0 16M0 1iM0 16M0 1C00 Uo0 1eeo0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|21e5","Europe/Bucharest|BMT EET EEST|-1I.o -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1xApI.o 20LI.o RA0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Axc0 On0 1fA0 1a10 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|19e5","Europe/Budapest|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 1oo0 11c0 1lc0 17c0 O1V0 3Nf0 WM0 1fA0 1cM0 1cM0 1oJ0 1dd0 1020 1fX0 1cp0 1cM0 1cM0 1cM0 1fA0 1a00 bhy0 Rb0 1wr0 Rc0 1C00 LA0 1C00 LA0 SNW0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cO0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e5","Europe/Zurich|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-19Lc0 11A0 1o00 11A0 1xG10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|38e4","Europe/Chisinau|CMT BMT EET EEST CEST CET MSK MSD|-1T -1I.o -20 -30 -20 -10 -30 -40|012323232323232323234545467676767676767676767323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-26jdT wGMa.A 20LI.o RA0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 27A0 2en0 39g0 WM0 1fA0 1cM0 V90 1t7z0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 gL0 WO0 1cM0 1cM0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11D0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|67e4","Europe/Copenhagen|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2azC0 Tz0 VuO0 60q0 WM0 1fA0 1cM0 1cM0 1cM0 S00 1HA0 Nc0 1C00 Dc0 1Nc0 Ao0 1h5A0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5","Europe/Gibraltar|GMT BST BDST CET CEST|0 -10 -20 -10 -20|010101010101010101010101010101010101010101010101012121212121010121010101010101010101034343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-2axa0 Rc0 1fA0 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 2Rz0 Dc0 1zc0 Oo0 1zc0 Rc0 1wo0 17c0 1iM0 FA0 xB0 1fA0 1a00 14o0 bb0 LA0 xB0 Rc0 1wo0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 10Jz0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|30e3","Europe/Helsinki|HMT EET EEST|-1D.N -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1WuND.N OULD.N 1dA0 1xGq0 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5","Europe/Kaliningrad|CET CEST EET EEST MSK MSD +03|-10 -20 -20 -30 -30 -40 -30|01010101010101232454545454545454543232323232323232323232323232323232323232323262|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 390 7A0 1en0 12N0 1pbb0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|44e4","Europe/Kiev|KMT EET MSK CEST CET MSD EEST|-22.4 -20 -30 -20 -10 -40 -30|0123434252525252525252525256161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161|-1Pc22.4 eUo2.4 rnz0 2Hg0 WM0 1fA0 da0 1v4m0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 Db0 3220 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|34e5","Europe/Kirov|LMT +03 +04 +05|-3i.M -30 -40 -50|01232323232323232321212121212121212121212121212121212121212121|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|48e4","Europe/Lisbon|LMT WET WEST WEMT CET CEST|A.J 0 -10 -20 -10 -20|01212121212121212121212121212121212121212121232123212321232121212121212121212121212121212121212121214121212121212121212121212121212124545454212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2le00 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 pvy0 1cM0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|27e5","Europe/Luxembourg|LMT CET CEST WET WEST WEST WET|-o.A -10 -20 0 -10 -20 -10|0121212134343434343434343434343434343434343434343434565651212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2DG0o.A t6mo.A TB0 1nX0 Up0 1o20 11A0 rW0 CM0 1qP0 R90 1EO0 UK0 1u20 10m0 1ip0 1in0 17e0 19W0 1fB0 1db0 1cp0 1in0 17d0 1fz0 1a10 1in0 1a10 1in0 17f0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 vA0 60L0 WM0 1fA0 1cM0 17c0 1io0 16M0 1C00 Uo0 1eeo0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4","Europe/Madrid|WET WEST WEMT CET CEST|0 -10 -20 -10 -20|010101010101010101210343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-25Td0 19B0 1cL0 1dd0 b1z0 18p0 3HX0 17d0 1fz0 1a10 1io0 1a00 1in0 17d0 iIn0 Hd0 1cL0 bb0 1200 2s20 14n0 5aL0 Mp0 1vz0 17d0 1in0 17d0 1in0 17d0 1in0 17d0 6hX0 11B0 XHX0 1a10 1fz0 1a10 19X0 1cN0 1fz0 1a10 1fC0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|62e5","Europe/Malta|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2arB0 Lz0 1cN0 1db0 1410 1on0 Wp0 1qL0 17d0 1cL0 M3B0 5M20 WM0 1fA0 1co0 17c0 1iM0 16m0 1de0 1lc0 14m0 1lc0 WO0 1qM0 GTW0 On0 1C10 LA0 1C00 LA0 1EM0 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1co0 1cM0 1lA0 Xc0 1qq0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1iN0 19z0 1fB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|42e4","Europe/Minsk|MMT EET MSK CEST CET MSD EEST +03|-1O -20 -30 -20 -10 -40 -30 -30|01234343252525252525252525261616161616161616161616161616161616161617|-1Pc1O eUnO qNX0 3gQ0 WM0 1fA0 1cM0 Al0 1tsn0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 3Fc0 1cN0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0|19e5","Europe/Monaco|PMT WET WEST WEMT CET CEST|-9.l 0 -10 -20 -10 -20|01212121212121212121212121212121212121212121212121232323232345454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-2n5c9.l cFX9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 1u00 10o0 1io0 1wo0 Rc0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Df0 2RV0 11z0 11B0 1ze0 WM0 1fA0 1cM0 1fa0 1aq0 16M0 1ekn0 1cL0 1fC0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|38e3","Europe/Moscow|MMT MMT MST MDST MSD MSK +05 EET EEST MSK|-2u.h -2v.j -3v.j -4v.j -40 -30 -50 -20 -30 -40|012132345464575454545454545454545458754545454545454545454545454545454545454595|-2ag2u.h 2pyW.W 1bA0 11X0 GN0 1Hb0 c4v.j ik0 3DA0 dz0 15A0 c10 2q10 iM10 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|16e6","Europe/Paris|PMT WET WEST CEST CET WEMT|-9.l 0 -10 -20 -10 -20|0121212121212121212121212121212121212121212121212123434352543434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434|-2nco9.l cNb9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 1u00 10o0 1io0 1wo0 Rc0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Df0 Ik0 5M30 WM0 1fA0 1cM0 Vx0 hB0 1aq0 16M0 1ekn0 1cL0 1fC0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|11e6","Europe/Riga|RMT LST EET MSK CEST CET MSD EEST|-1A.y -2A.y -20 -30 -20 -10 -40 -30|010102345454536363636363636363727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272|-25TzA.y 11A0 1iM0 ko0 gWm0 yDXA.y 2bX0 3fE0 WM0 1fA0 1cM0 1cM0 4m0 1sLy0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 1o00 11A0 1o00 11A0 1qM0 3oo0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|64e4","Europe/Rome|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2arB0 Lz0 1cN0 1db0 1410 1on0 Wp0 1qL0 17d0 1cL0 M3B0 5M20 WM0 1fA0 1cM0 16M0 1iM0 16m0 1de0 1lc0 14m0 1lc0 WO0 1qM0 GTW0 On0 1C10 LA0 1C00 LA0 1EM0 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1C00 LA0 1zc0 Oo0 1C00 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1zc0 Oo0 1fC0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|39e5","Europe/Samara|LMT +03 +04 +05|-3k.k -30 -40 -50|0123232323232323232121232323232323232323232323232323232323212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2y10 14m0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|12e5","Europe/Saratov|LMT +03 +04 +05|-34.i -30 -40 -50|012323232323232321212121212121212121212121212121212121212121212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 5810|","Europe/Simferopol|SMT EET MSK CEST CET MSD EEST MSK|-2g -20 -30 -20 -10 -40 -30 -40|012343432525252525252525252161616525252616161616161616161616161616161616172|-1Pc2g eUog rEn0 2qs0 WM0 1fA0 1cM0 3V0 1u0L0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 4eL0 1cL0 1cN0 1cL0 1cN0 dX0 WL0 1cN0 1cL0 1fB0 1o30 11B0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11z0 1nW0|33e4","Europe/Sofia|EET CET CEST EEST|-20 -10 -20 -30|01212103030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030|-168L0 WM0 1fA0 1cM0 1cM0 1cN0 1mKH0 1dd0 1fb0 1ap0 1fb0 1a20 1fy0 1a30 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5","Europe/Stockholm|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2azC0 TB0 2yDe0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|15e5","Europe/Tallinn|TMT CET CEST EET MSK MSD EEST|-1D -10 -20 -20 -30 -40 -30|012103421212454545454545454546363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363|-26oND teD 11A0 1Ta0 4rXl KSLD 2FX0 2Jg0 WM0 1fA0 1cM0 18J0 1sTX0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o10 11A0 1qM0 5QM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|41e4","Europe/Tirane|LMT CET CEST|-1j.k -10 -20|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glBj.k 14pcj.k 5LC0 WM0 4M0 1fCK0 10n0 1op0 11z0 1pd0 11z0 1qN0 WL0 1qp0 Xb0 1qp0 Xb0 1qp0 11z0 1lB0 11z0 1qN0 11z0 1iN0 16n0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|42e4","Europe/Ulyanovsk|LMT +03 +04 +05 +02|-3d.A -30 -40 -50 -20|01232323232323232321214121212121212121212121212121212121212121212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|13e5","Europe/Uzhgorod|CET CEST MSK MSD EET EEST|-10 -20 -30 -40 -20 -30|010101023232323232323232320454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-1cqL0 6i00 WM0 1fA0 1cM0 1ml0 1Cp0 1r3W0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 1Nf0 2pw0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|11e4","Europe/Vienna|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 3KM0 14o0 LA00 6i00 WM0 1fA0 1cM0 1cM0 1cM0 400 2qM0 1ao0 1co0 1cM0 1io0 17c0 1gHa0 19X0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|18e5","Europe/Vilnius|WMT KMT CET EET MSK CEST MSD EEST|-1o -1z.A -10 -20 -30 -20 -40 -30|012324525254646464646464646473737373737373737352537373737373737373737373737373737373737373737373737373737373737373737373|-293do 6ILM.o 1Ooz.A zz0 Mfd0 29W0 3is0 WM0 1fA0 1cM0 LV0 1tgL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11B0 1o00 11A0 1qM0 8io0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4","Europe/Volgograd|LMT +03 +04 +05|-2V.E -30 -40 -50|0123232323232323212121212121212121212121212121212121212121212121|-21IqV.E psLV.E 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 9Jd0 5gn0|10e5","Europe/Warsaw|WMT CET CEST EET EEST|-1o -10 -20 -20 -30|012121234312121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2ctdo 1LXo 11d0 1iO0 11A0 1o00 11A0 1on0 11A0 6zy0 HWP0 5IM0 WM0 1fA0 1cM0 1dz0 1mL0 1en0 15B0 1aq0 1nA0 11A0 1io0 17c0 1fA0 1a00 iDX0 LA0 1cM0 1cM0 1C00 Oo0 1cM0 1cM0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1C00 LA0 uso0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e5","Europe/Zaporozhye|+0220 EET MSK CEST CET MSD EEST|-2k -20 -30 -20 -10 -40 -30|01234342525252525252525252526161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161|-1Pc2k eUok rdb0 2RE0 WM0 1fA0 8m0 1v9a0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cK0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|77e4","HST|HST|a0|0||","Indian/Chagos|LMT +05 +06|-4N.E -50 -60|012|-2xosN.E 3AGLN.E|30e2","Indian/Cocos|+0630|-6u|0||596","Indian/Kerguelen|-00 +05|0 -50|01|-MG00|130","Indian/Mahe|LMT +04|-3F.M -40|01|-2xorF.M|79e3","Indian/Maldives|MMT +05|-4S -50|01|-olgS|35e4","Indian/Mauritius|LMT +04 +05|-3O -40 -50|012121|-2xorO 34unO 14L0 12kr0 11z0|15e4","Indian/Reunion|LMT +04|-3F.Q -40|01|-2mDDF.Q|84e4","Pacific/Kwajalein|+11 +10 +09 -12 +12|-b0 -a0 -90 c0 -c0|012034|-1kln0 akp0 6Up0 12ry0 Wan0|14e3","MET|MET MEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|","MST|MST|70|0||","MST7MDT|MST MDT MWT MPT|70 60 60 60|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","Pacific/Chatham|+1215 +1245 +1345|-cf -cJ -dJ|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-WqAf 1adef IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00|600","Pacific/Apia|LMT -1130 -11 -10 +14 +13|bq.U bu b0 a0 -e0 -d0|01232345454545454545454545|-2nDMx.4 1yW03.4 2rRbu 1ff0 1a00 CI0 AQ0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0|37e3","Pacific/Bougainville|+10 +09 +11|-a0 -90 -b0|0102|-16Wy0 7CN0 2MQp0|18e4","Pacific/Chuuk|+10 +09|-a0 -90|01010|-2ewy0 axB0 RVX0 axd0|49e3","Pacific/Efate|LMT +11 +12|-bd.g -b0 -c0|012121212121212121212121|-2l9nd.g 2uNXd.g Dc0 n610 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 Lz0 1Nd0 An0|66e3","Pacific/Enderbury|-00 -12 -11 +13|0 c0 b0 -d0|0123|-1iIo0 1GsA0 B7X0|1","Pacific/Fakaofo|-11 +13|b0 -d0|01|1Gfn0|483","Pacific/Fiji|LMT +12 +13|-bT.I -c0 -d0|01212121212121212121212121212121212121212121212121212121212121|-2bUzT.I 3m8NT.I LA0 1EM0 IM0 nJc0 LA0 1o00 Rc0 1wo0 Ao0 1Nc0 Ao0 1Q00 xz0 1SN0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 20o0 pc0 2hc0 bc0 4q00 pc0 20o0 pc0 20o0 pc0 20o0 s00 1VA0 s00 20o0 pc0 20o0 pc0 20o0 pc0 20o0 pc0 20o0 s00 20o0 pc0 20o0 pc0 20o0 pc0 20o0 pc0 20o0 s00 1VA0 s00|88e4","Pacific/Galapagos|LMT -05 -06|5W.o 50 60|01212|-1yVS1.A 2dTz1.A gNd0 rz0|25e3","Pacific/Gambier|LMT -09|8X.M 90|01|-2jof0.c|125","Pacific/Guadalcanal|LMT +11|-aD.M -b0|01|-2joyD.M|11e4","Pacific/Guam|GST +09 GDT ChST|-a0 -90 -b0 -a0|01020202020202020203|-18jK0 6pB0 AhB0 3QL0 g2p0 3p91 WOX rX0 1zd0 Rb0 1wp0 Rb0 5xd0 rX0 5sN0 zb1 1C0X On0 ULb0|17e4","Pacific/Honolulu|HST HDT HWT HPT HST|au 9u 9u 9u a0|0102304|-1thLu 8x0 lef0 8wWu iAu 46p0|37e4","Pacific/Kiritimati|-1040 -10 +14|aE a0 -e0|012|nIaE B7Xk|51e2","Pacific/Kosrae|+11 +09 +10 +12|-b0 -90 -a0 -c0|01021030|-2ewz0 axC0 HBy0 akp0 axd0 WOK0 1bdz0|66e2","Pacific/Majuro|+11 +09 +10 +12|-b0 -90 -a0 -c0|0102103|-2ewz0 axC0 HBy0 akp0 6RB0 12um0|28e3","Pacific/Marquesas|LMT -0930|9i 9u|01|-2joeG|86e2","Pacific/Pago_Pago|LMT SST|bm.M b0|01|-2nDMB.c|37e2","Pacific/Nauru|LMT +1130 +09 +12|-b7.E -bu -90 -c0|01213|-1Xdn7.E QCnB.E 7mqu 1lnbu|10e3","Pacific/Niue|LMT -1120 -11|bj.E bk b0|012|-FScE.k suo0.k|12e2","Pacific/Norfolk|+1112 +1130 +1230 +11 +12|-bc -bu -cu -b0 -c0|012134343434343434343434343434343434343434|-Kgbc W01G Oo0 1COo0 9Jcu 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|25e4","Pacific/Noumea|LMT +11 +12|-b5.M -b0 -c0|01212121|-2l9n5.M 2EqM5.M xX0 1PB0 yn0 HeP0 Ao0|98e3","Pacific/Pitcairn|-0830 -08|8u 80|01|18Vku|56","Pacific/Pohnpei|+11 +09 +10|-b0 -90 -a0|010210|-2ewz0 axC0 HBy0 akp0 axd0|34e3","Pacific/Rarotonga|LMT -1030 -0930 -10|aD.4 au 9u a0|0123232323232323232323232323|-FSdk.U 13tbO.U IL0 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu|13e3","Pacific/Tahiti|LMT -10|9W.g a0|01|-2joe1.I|18e4","Pacific/Tongatapu|LMT +1220 +13 +14|-cj.c -ck -d0 -e0|01232323232|-XbMj.c BgLX.c 1yndk 15A0 1wo0 xz0 1Q10 xz0 zWN0 s00|75e3","PST8PDT|PST PDT PWT PPT|80 70 70 70|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261q0 1nX0 11B0 1nX0 SgN0 8x10 iy0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|","WET|WET WEST|0 -10|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|"],links:["Africa/Abidjan|Africa/Accra","Africa/Abidjan|Africa/Bamako","Africa/Abidjan|Africa/Banjul","Africa/Abidjan|Africa/Conakry","Africa/Abidjan|Africa/Dakar","Africa/Abidjan|Africa/Freetown","Africa/Abidjan|Africa/Lome","Africa/Abidjan|Africa/Nouakchott","Africa/Abidjan|Africa/Ouagadougou","Africa/Abidjan|Africa/Timbuktu","Africa/Abidjan|Atlantic/St_Helena","Africa/Cairo|Egypt","Africa/Johannesburg|Africa/Maseru","Africa/Johannesburg|Africa/Mbabane","Africa/Lagos|Africa/Bangui","Africa/Lagos|Africa/Brazzaville","Africa/Lagos|Africa/Douala","Africa/Lagos|Africa/Kinshasa","Africa/Lagos|Africa/Libreville","Africa/Lagos|Africa/Luanda","Africa/Lagos|Africa/Malabo","Africa/Lagos|Africa/Niamey","Africa/Lagos|Africa/Porto-Novo","Africa/Maputo|Africa/Blantyre","Africa/Maputo|Africa/Bujumbura","Africa/Maputo|Africa/Gaborone","Africa/Maputo|Africa/Harare","Africa/Maputo|Africa/Kigali","Africa/Maputo|Africa/Lubumbashi","Africa/Maputo|Africa/Lusaka","Africa/Nairobi|Africa/Addis_Ababa","Africa/Nairobi|Africa/Asmara","Africa/Nairobi|Africa/Asmera","Africa/Nairobi|Africa/Dar_es_Salaam","Africa/Nairobi|Africa/Djibouti","Africa/Nairobi|Africa/Kampala","Africa/Nairobi|Africa/Mogadishu","Africa/Nairobi|Indian/Antananarivo","Africa/Nairobi|Indian/Comoro","Africa/Nairobi|Indian/Mayotte","Africa/Tripoli|Libya","America/Adak|America/Atka","America/Adak|US/Aleutian","America/Anchorage|US/Alaska","America/Argentina/Buenos_Aires|America/Buenos_Aires","America/Argentina/Catamarca|America/Argentina/ComodRivadavia","America/Argentina/Catamarca|America/Catamarca","America/Argentina/Cordoba|America/Cordoba","America/Argentina/Cordoba|America/Rosario","America/Argentina/Jujuy|America/Jujuy","America/Argentina/Mendoza|America/Mendoza","America/Chicago|US/Central","America/Denver|America/Shiprock","America/Denver|Navajo","America/Denver|US/Mountain","America/Detroit|US/Michigan","America/Edmonton|Canada/Mountain","America/Fort_Wayne|America/Indiana/Indianapolis","America/Fort_Wayne|America/Indianapolis","America/Fort_Wayne|US/East-Indiana","America/Godthab|America/Nuuk","America/Halifax|Canada/Atlantic","America/Havana|Cuba","America/Indiana/Knox|America/Knox_IN","America/Indiana/Knox|US/Indiana-Starke","America/Jamaica|Jamaica","America/Kentucky/Louisville|America/Louisville","America/Los_Angeles|US/Pacific","America/Manaus|Brazil/West","America/Mazatlan|Mexico/BajaSur","America/Mexico_City|Mexico/General","America/New_York|US/Eastern","America/Noronha|Brazil/DeNoronha","America/Panama|America/Atikokan","America/Panama|America/Cayman","America/Panama|America/Coral_Harbour","America/Phoenix|America/Creston","America/Phoenix|US/Arizona","America/Puerto_Rico|America/Anguilla","America/Puerto_Rico|America/Antigua","America/Puerto_Rico|America/Aruba","America/Puerto_Rico|America/Blanc-Sablon","America/Puerto_Rico|America/Curacao","America/Puerto_Rico|America/Dominica","America/Puerto_Rico|America/Grenada","America/Puerto_Rico|America/Guadeloupe","America/Puerto_Rico|America/Kralendijk","America/Puerto_Rico|America/Lower_Princes","America/Puerto_Rico|America/Marigot","America/Puerto_Rico|America/Montserrat","America/Puerto_Rico|America/Port_of_Spain","America/Puerto_Rico|America/St_Barthelemy","America/Puerto_Rico|America/St_Kitts","America/Puerto_Rico|America/St_Lucia","America/Puerto_Rico|America/St_Thomas","America/Puerto_Rico|America/St_Vincent","America/Puerto_Rico|America/Tortola","America/Puerto_Rico|America/Virgin","America/Regina|Canada/Saskatchewan","America/Rio_Branco|America/Porto_Acre","America/Rio_Branco|Brazil/Acre","America/Santiago|Chile/Continental","America/Sao_Paulo|Brazil/East","America/St_Johns|Canada/Newfoundland","America/Tijuana|America/Ensenada","America/Tijuana|America/Santa_Isabel","America/Tijuana|Mexico/BajaNorte","America/Toronto|America/Montreal","America/Toronto|America/Nassau","America/Toronto|Canada/Eastern","America/Vancouver|Canada/Pacific","America/Whitehorse|Canada/Yukon","America/Winnipeg|Canada/Central","Asia/Ashgabat|Asia/Ashkhabad","Asia/Bangkok|Asia/Phnom_Penh","Asia/Bangkok|Asia/Vientiane","Asia/Dhaka|Asia/Dacca","Asia/Dubai|Asia/Muscat","Asia/Ho_Chi_Minh|Asia/Saigon","Asia/Hong_Kong|Hongkong","Asia/Jerusalem|Asia/Tel_Aviv","Asia/Jerusalem|Israel","Asia/Kathmandu|Asia/Katmandu","Asia/Kolkata|Asia/Calcutta","Asia/Kuala_Lumpur|Asia/Singapore","Asia/Kuala_Lumpur|Singapore","Asia/Macau|Asia/Macao","Asia/Makassar|Asia/Ujung_Pandang","Asia/Nicosia|Europe/Nicosia","Asia/Qatar|Asia/Bahrain","Asia/Rangoon|Asia/Yangon","Asia/Riyadh|Antarctica/Syowa","Asia/Riyadh|Asia/Aden","Asia/Riyadh|Asia/Kuwait","Asia/Seoul|ROK","Asia/Shanghai|Asia/Chongqing","Asia/Shanghai|Asia/Chungking","Asia/Shanghai|Asia/Harbin","Asia/Shanghai|PRC","Asia/Taipei|ROC","Asia/Tehran|Iran","Asia/Thimphu|Asia/Thimbu","Asia/Tokyo|Japan","Asia/Ulaanbaatar|Asia/Ulan_Bator","Asia/Urumqi|Asia/Kashgar","Atlantic/Faroe|Atlantic/Faeroe","Atlantic/Reykjavik|Iceland","Atlantic/South_Georgia|Etc/GMT+2","Australia/Adelaide|Australia/South","Australia/Brisbane|Australia/Queensland","Australia/Broken_Hill|Australia/Yancowinna","Australia/Darwin|Australia/North","Australia/Hobart|Australia/Currie","Australia/Hobart|Australia/Tasmania","Australia/Lord_Howe|Australia/LHI","Australia/Melbourne|Australia/Victoria","Australia/Perth|Australia/West","Australia/Sydney|Australia/ACT","Australia/Sydney|Australia/Canberra","Australia/Sydney|Australia/NSW","Etc/GMT-0|Etc/GMT","Etc/GMT-0|Etc/GMT+0","Etc/GMT-0|Etc/GMT0","Etc/GMT-0|Etc/Greenwich","Etc/GMT-0|GMT","Etc/GMT-0|GMT+0","Etc/GMT-0|GMT-0","Etc/GMT-0|GMT0","Etc/GMT-0|Greenwich","Etc/UTC|Etc/UCT","Etc/UTC|Etc/Universal","Etc/UTC|Etc/Zulu","Etc/UTC|UCT","Etc/UTC|UTC","Etc/UTC|Universal","Etc/UTC|Zulu","Europe/Belgrade|Europe/Ljubljana","Europe/Belgrade|Europe/Podgorica","Europe/Belgrade|Europe/Sarajevo","Europe/Belgrade|Europe/Skopje","Europe/Belgrade|Europe/Zagreb","Europe/Chisinau|Europe/Tiraspol","Europe/Dublin|Eire","Europe/Helsinki|Europe/Mariehamn","Europe/Istanbul|Asia/Istanbul","Europe/Istanbul|Turkey","Europe/Lisbon|Portugal","Europe/London|Europe/Belfast","Europe/London|Europe/Guernsey","Europe/London|Europe/Isle_of_Man","Europe/London|Europe/Jersey","Europe/London|GB","Europe/London|GB-Eire","Europe/Moscow|W-SU","Europe/Oslo|Arctic/Longyearbyen","Europe/Oslo|Atlantic/Jan_Mayen","Europe/Prague|Europe/Bratislava","Europe/Rome|Europe/San_Marino","Europe/Rome|Europe/Vatican","Europe/Warsaw|Poland","Europe/Zurich|Europe/Busingen","Europe/Zurich|Europe/Vaduz","Indian/Christmas|Etc/GMT-7","Pacific/Auckland|Antarctica/McMurdo","Pacific/Auckland|Antarctica/South_Pole","Pacific/Auckland|NZ","Pacific/Chatham|NZ-CHAT","Pacific/Chuuk|Pacific/Truk","Pacific/Chuuk|Pacific/Yap","Pacific/Easter|Chile/EasterIsland","Pacific/Enderbury|Pacific/Kanton","Pacific/Guam|Pacific/Saipan","Pacific/Honolulu|Pacific/Johnston","Pacific/Honolulu|US/Hawaii","Pacific/Kwajalein|Kwajalein","Pacific/Pago_Pago|Pacific/Midway","Pacific/Pago_Pago|Pacific/Samoa","Pacific/Pago_Pago|US/Samoa","Pacific/Palau|Etc/GMT-9","Pacific/Pohnpei|Pacific/Ponape","Pacific/Port_Moresby|Antarctica/DumontDUrville","Pacific/Port_Moresby|Etc/GMT-10","Pacific/Tarawa|Etc/GMT-12","Pacific/Tarawa|Pacific/Funafuti","Pacific/Tarawa|Pacific/Wake","Pacific/Tarawa|Pacific/Wallis"],countries:["AD|Europe/Andorra","AE|Asia/Dubai","AF|Asia/Kabul","AG|America/Port_of_Spain America/Antigua","AI|America/Port_of_Spain America/Anguilla","AL|Europe/Tirane","AM|Asia/Yerevan","AO|Africa/Lagos Africa/Luanda","AQ|Antarctica/Casey Antarctica/Davis Antarctica/DumontDUrville Antarctica/Mawson Antarctica/Palmer Antarctica/Rothera Antarctica/Syowa Antarctica/Troll Antarctica/Vostok Pacific/Auckland Antarctica/McMurdo","AR|America/Argentina/Buenos_Aires America/Argentina/Cordoba America/Argentina/Salta America/Argentina/Jujuy America/Argentina/Tucuman America/Argentina/Catamarca America/Argentina/La_Rioja America/Argentina/San_Juan America/Argentina/Mendoza America/Argentina/San_Luis America/Argentina/Rio_Gallegos America/Argentina/Ushuaia","AS|Pacific/Pago_Pago","AT|Europe/Vienna","AU|Australia/Lord_Howe Antarctica/Macquarie Australia/Hobart Australia/Melbourne Australia/Sydney Australia/Broken_Hill Australia/Brisbane Australia/Lindeman Australia/Adelaide Australia/Darwin Australia/Perth Australia/Eucla","AW|America/Curacao America/Aruba","AX|Europe/Helsinki Europe/Mariehamn","AZ|Asia/Baku","BA|Europe/Belgrade Europe/Sarajevo","BB|America/Barbados","BD|Asia/Dhaka","BE|Europe/Brussels","BF|Africa/Abidjan Africa/Ouagadougou","BG|Europe/Sofia","BH|Asia/Qatar Asia/Bahrain","BI|Africa/Maputo Africa/Bujumbura","BJ|Africa/Lagos Africa/Porto-Novo","BL|America/Port_of_Spain America/St_Barthelemy","BM|Atlantic/Bermuda","BN|Asia/Brunei","BO|America/La_Paz","BQ|America/Curacao America/Kralendijk","BR|America/Noronha America/Belem America/Fortaleza America/Recife America/Araguaina America/Maceio America/Bahia America/Sao_Paulo America/Campo_Grande America/Cuiaba America/Santarem America/Porto_Velho America/Boa_Vista America/Manaus America/Eirunepe America/Rio_Branco","BS|America/Nassau","BT|Asia/Thimphu","BW|Africa/Maputo Africa/Gaborone","BY|Europe/Minsk","BZ|America/Belize","CA|America/St_Johns America/Halifax America/Glace_Bay America/Moncton America/Goose_Bay America/Blanc-Sablon America/Toronto America/Nipigon America/Thunder_Bay America/Iqaluit America/Pangnirtung America/Atikokan America/Winnipeg America/Rainy_River America/Resolute America/Rankin_Inlet America/Regina America/Swift_Current America/Edmonton America/Cambridge_Bay America/Yellowknife America/Inuvik America/Creston America/Dawson_Creek America/Fort_Nelson America/Whitehorse America/Dawson America/Vancouver","CC|Indian/Cocos","CD|Africa/Maputo Africa/Lagos Africa/Kinshasa Africa/Lubumbashi","CF|Africa/Lagos Africa/Bangui","CG|Africa/Lagos Africa/Brazzaville","CH|Europe/Zurich","CI|Africa/Abidjan","CK|Pacific/Rarotonga","CL|America/Santiago America/Punta_Arenas Pacific/Easter","CM|Africa/Lagos Africa/Douala","CN|Asia/Shanghai Asia/Urumqi","CO|America/Bogota","CR|America/Costa_Rica","CU|America/Havana","CV|Atlantic/Cape_Verde","CW|America/Curacao","CX|Indian/Christmas","CY|Asia/Nicosia Asia/Famagusta","CZ|Europe/Prague","DE|Europe/Zurich Europe/Berlin Europe/Busingen","DJ|Africa/Nairobi Africa/Djibouti","DK|Europe/Copenhagen","DM|America/Port_of_Spain America/Dominica","DO|America/Santo_Domingo","DZ|Africa/Algiers","EC|America/Guayaquil Pacific/Galapagos","EE|Europe/Tallinn","EG|Africa/Cairo","EH|Africa/El_Aaiun","ER|Africa/Nairobi Africa/Asmara","ES|Europe/Madrid Africa/Ceuta Atlantic/Canary","ET|Africa/Nairobi Africa/Addis_Ababa","FI|Europe/Helsinki","FJ|Pacific/Fiji","FK|Atlantic/Stanley","FM|Pacific/Chuuk Pacific/Pohnpei Pacific/Kosrae","FO|Atlantic/Faroe","FR|Europe/Paris","GA|Africa/Lagos Africa/Libreville","GB|Europe/London","GD|America/Port_of_Spain America/Grenada","GE|Asia/Tbilisi","GF|America/Cayenne","GG|Europe/London Europe/Guernsey","GH|Africa/Accra","GI|Europe/Gibraltar","GL|America/Nuuk America/Danmarkshavn America/Scoresbysund America/Thule","GM|Africa/Abidjan Africa/Banjul","GN|Africa/Abidjan Africa/Conakry","GP|America/Port_of_Spain America/Guadeloupe","GQ|Africa/Lagos Africa/Malabo","GR|Europe/Athens","GS|Atlantic/South_Georgia","GT|America/Guatemala","GU|Pacific/Guam","GW|Africa/Bissau","GY|America/Guyana","HK|Asia/Hong_Kong","HN|America/Tegucigalpa","HR|Europe/Belgrade Europe/Zagreb","HT|America/Port-au-Prince","HU|Europe/Budapest","ID|Asia/Jakarta Asia/Pontianak Asia/Makassar Asia/Jayapura","IE|Europe/Dublin","IL|Asia/Jerusalem","IM|Europe/London Europe/Isle_of_Man","IN|Asia/Kolkata","IO|Indian/Chagos","IQ|Asia/Baghdad","IR|Asia/Tehran","IS|Atlantic/Reykjavik","IT|Europe/Rome","JE|Europe/London Europe/Jersey","JM|America/Jamaica","JO|Asia/Amman","JP|Asia/Tokyo","KE|Africa/Nairobi","KG|Asia/Bishkek","KH|Asia/Bangkok Asia/Phnom_Penh","KI|Pacific/Tarawa Pacific/Enderbury Pacific/Kiritimati","KM|Africa/Nairobi Indian/Comoro","KN|America/Port_of_Spain America/St_Kitts","KP|Asia/Pyongyang","KR|Asia/Seoul","KW|Asia/Riyadh Asia/Kuwait","KY|America/Panama America/Cayman","KZ|Asia/Almaty Asia/Qyzylorda Asia/Qostanay Asia/Aqtobe Asia/Aqtau Asia/Atyrau Asia/Oral","LA|Asia/Bangkok Asia/Vientiane","LB|Asia/Beirut","LC|America/Port_of_Spain America/St_Lucia","LI|Europe/Zurich Europe/Vaduz","LK|Asia/Colombo","LR|Africa/Monrovia","LS|Africa/Johannesburg Africa/Maseru","LT|Europe/Vilnius","LU|Europe/Luxembourg","LV|Europe/Riga","LY|Africa/Tripoli","MA|Africa/Casablanca","MC|Europe/Monaco","MD|Europe/Chisinau","ME|Europe/Belgrade Europe/Podgorica","MF|America/Port_of_Spain America/Marigot","MG|Africa/Nairobi Indian/Antananarivo","MH|Pacific/Majuro Pacific/Kwajalein","MK|Europe/Belgrade Europe/Skopje","ML|Africa/Abidjan Africa/Bamako","MM|Asia/Yangon","MN|Asia/Ulaanbaatar Asia/Hovd Asia/Choibalsan","MO|Asia/Macau","MP|Pacific/Guam Pacific/Saipan","MQ|America/Martinique","MR|Africa/Abidjan Africa/Nouakchott","MS|America/Port_of_Spain America/Montserrat","MT|Europe/Malta","MU|Indian/Mauritius","MV|Indian/Maldives","MW|Africa/Maputo Africa/Blantyre","MX|America/Mexico_City America/Cancun America/Merida America/Monterrey America/Matamoros America/Mazatlan America/Chihuahua America/Ojinaga America/Hermosillo America/Tijuana America/Bahia_Banderas","MY|Asia/Kuala_Lumpur Asia/Kuching","MZ|Africa/Maputo","NA|Africa/Windhoek","NC|Pacific/Noumea","NE|Africa/Lagos Africa/Niamey","NF|Pacific/Norfolk","NG|Africa/Lagos","NI|America/Managua","NL|Europe/Amsterdam","NO|Europe/Oslo","NP|Asia/Kathmandu","NR|Pacific/Nauru","NU|Pacific/Niue","NZ|Pacific/Auckland Pacific/Chatham","OM|Asia/Dubai Asia/Muscat","PA|America/Panama","PE|America/Lima","PF|Pacific/Tahiti Pacific/Marquesas Pacific/Gambier","PG|Pacific/Port_Moresby Pacific/Bougainville","PH|Asia/Manila","PK|Asia/Karachi","PL|Europe/Warsaw","PM|America/Miquelon","PN|Pacific/Pitcairn","PR|America/Puerto_Rico","PS|Asia/Gaza Asia/Hebron","PT|Europe/Lisbon Atlantic/Madeira Atlantic/Azores","PW|Pacific/Palau","PY|America/Asuncion","QA|Asia/Qatar","RE|Indian/Reunion","RO|Europe/Bucharest","RS|Europe/Belgrade","RU|Europe/Kaliningrad Europe/Moscow Europe/Simferopol Europe/Kirov Europe/Volgograd Europe/Astrakhan Europe/Saratov Europe/Ulyanovsk Europe/Samara Asia/Yekaterinburg Asia/Omsk Asia/Novosibirsk Asia/Barnaul Asia/Tomsk Asia/Novokuznetsk Asia/Krasnoyarsk Asia/Irkutsk Asia/Chita Asia/Yakutsk Asia/Khandyga Asia/Vladivostok Asia/Ust-Nera Asia/Magadan Asia/Sakhalin Asia/Srednekolymsk Asia/Kamchatka Asia/Anadyr","RW|Africa/Maputo Africa/Kigali","SA|Asia/Riyadh","SB|Pacific/Guadalcanal","SC|Indian/Mahe","SD|Africa/Khartoum","SE|Europe/Stockholm","SG|Asia/Singapore","SH|Africa/Abidjan Atlantic/St_Helena","SI|Europe/Belgrade Europe/Ljubljana","SJ|Europe/Oslo Arctic/Longyearbyen","SK|Europe/Prague Europe/Bratislava","SL|Africa/Abidjan Africa/Freetown","SM|Europe/Rome Europe/San_Marino","SN|Africa/Abidjan Africa/Dakar","SO|Africa/Nairobi Africa/Mogadishu","SR|America/Paramaribo","SS|Africa/Juba","ST|Africa/Sao_Tome","SV|America/El_Salvador","SX|America/Curacao America/Lower_Princes","SY|Asia/Damascus","SZ|Africa/Johannesburg Africa/Mbabane","TC|America/Grand_Turk","TD|Africa/Ndjamena","TF|Indian/Reunion Indian/Kerguelen","TG|Africa/Abidjan Africa/Lome","TH|Asia/Bangkok","TJ|Asia/Dushanbe","TK|Pacific/Fakaofo","TL|Asia/Dili","TM|Asia/Ashgabat","TN|Africa/Tunis","TO|Pacific/Tongatapu","TR|Europe/Istanbul","TT|America/Port_of_Spain","TV|Pacific/Funafuti","TW|Asia/Taipei","TZ|Africa/Nairobi Africa/Dar_es_Salaam","UA|Europe/Simferopol Europe/Kiev Europe/Uzhgorod Europe/Zaporozhye","UG|Africa/Nairobi Africa/Kampala","UM|Pacific/Pago_Pago Pacific/Wake Pacific/Honolulu Pacific/Midway","US|America/New_York America/Detroit America/Kentucky/Louisville America/Kentucky/Monticello America/Indiana/Indianapolis America/Indiana/Vincennes America/Indiana/Winamac America/Indiana/Marengo America/Indiana/Petersburg America/Indiana/Vevay America/Chicago America/Indiana/Tell_City America/Indiana/Knox America/Menominee America/North_Dakota/Center America/North_Dakota/New_Salem America/North_Dakota/Beulah America/Denver America/Boise America/Phoenix America/Los_Angeles America/Anchorage America/Juneau America/Sitka America/Metlakatla America/Yakutat America/Nome America/Adak Pacific/Honolulu","UY|America/Montevideo","UZ|Asia/Samarkand Asia/Tashkent","VA|Europe/Rome Europe/Vatican","VC|America/Port_of_Spain America/St_Vincent","VE|America/Caracas","VG|America/Port_of_Spain America/Tortola","VI|America/Port_of_Spain America/St_Thomas","VN|Asia/Bangkok Asia/Ho_Chi_Minh","VU|Pacific/Efate","WF|Pacific/Wallis","WS|Pacific/Apia","YE|Asia/Riyadh Asia/Aden","YT|Africa/Nairobi Indian/Mayotte","ZA|Africa/Johannesburg","ZM|Africa/Maputo Africa/Lusaka","ZW|Africa/Maputo Africa/Harare"]}),b});!function(t,e){"use strict";"object"==typeof module&&module.exports?module.exports=e(require("moment")):"function"==typeof define&&define.amd?define(["moment"],e):e(t.moment)}(this,function(i){"use strict";void 0===i.version&&i.default&&(i=i.default);var e,s={},f={},u={},a={},c={};i&&"string"==typeof i.version||D("Moment Timezone requires Moment.js. See https://momentjs.com/timezone/docs/#/use-it/browser/");var t=i.version.split("."),n=+t[0],o=+t[1];function l(t){return 96<t?t-87:64<t?t-29:t-48}function r(t){var e=0,n=t.split("."),o=n[0],r=n[1]||"",i=1,s=0,f=1;for(45===t.charCodeAt(0)&&(f=-(e=1));e<o.length;e++)s=60*s+l(o.charCodeAt(e));for(e=0;e<r.length;e++)i/=60,s+=l(r.charCodeAt(e))*i;return s*f}function h(t){for(var e=0;e<t.length;e++)t[e]=r(t[e])}function p(t,e){var n,o=[];for(n=0;n<e.length;n++)o[n]=t[e[n]];return o}function m(t){var e=t.split("|"),n=e[2].split(" "),o=e[3].split(""),r=e[4].split(" ");return h(n),h(o),h(r),function(t,e){for(var n=0;n<e;n++)t[n]=Math.round((t[n-1]||0)+6e4*t[n]);t[e-1]=1/0}(r,o.length),{name:e[0],abbrs:p(e[1].split(" "),o),offsets:p(n,o),untils:r,population:0|e[5]}}function d(t){t&&this._set(m(t))}function z(t,e){this.name=t,this.zones=e}function v(t){var e=t.toTimeString(),n=e.match(/\([a-z ]+\)/i);"GMT"===(n=n&&n[0]?(n=n[0].match(/[A-Z]/g))?n.join(""):void 0:(n=e.match(/[A-Z]{3,5}/g))?n[0]:void 0)&&(n=void 0),this.at=+t,this.abbr=n,this.offset=t.getTimezoneOffset()}function b(t){this.zone=t,this.offsetScore=0,this.abbrScore=0}function g(t,e){for(var n,o;o=6e4*((e.at-t.at)/12e4|0);)(n=new v(new Date(t.at+o))).offset===t.offset?t=n:e=n;return t}function _(t,e){return t.offsetScore!==e.offsetScore?t.offsetScore-e.offsetScore:t.abbrScore!==e.abbrScore?t.abbrScore-e.abbrScore:t.zone.population!==e.zone.population?e.zone.population-t.zone.population:e.zone.name.localeCompare(t.zone.name)}function w(t,e){var n,o;for(h(e),n=0;n<e.length;n++)o=e[n],c[o]=c[o]||{},c[o][t]=!0}function y(){try{var t=Intl.DateTimeFormat().resolvedOptions().timeZone;if(t&&3<t.length){var e=a[O(t)];if(e)return e;D("Moment Timezone found "+t+" from the Intl api, but did not have that data loaded.")}}catch(t){}var n,o,r,i=function(){var t,e,n,o=(new Date).getFullYear()-2,r=new v(new Date(o,0,1)),i=[r];for(n=1;n<48;n++)(e=new v(new Date(o,n,1))).offset!==r.offset&&(t=g(r,e),i.push(t),i.push(new v(new Date(t.at+6e4)))),r=e;for(n=0;n<4;n++)i.push(new v(new Date(o+n,0,1))),i.push(new v(new Date(o+n,6,1)));return i}(),s=i.length,f=function(t){var e,n,o,r=t.length,i={},s=[];for(e=0;e<r;e++)for(n in o=c[t[e].offset]||{})o.hasOwnProperty(n)&&(i[n]=!0);for(e in i)i.hasOwnProperty(e)&&s.push(a[e]);return s}(i),u=[];for(o=0;o<f.length;o++){for(n=new b(M(f[o]),s),r=0;r<s;r++)n.scoreOffsetAt(i[r]);u.push(n)}return u.sort(_),0<u.length?u[0].zone.name:void 0}function O(t){return(t||"").toLowerCase().replace(/\//g,"_")}function S(t){var e,n,o,r;for("string"==typeof t&&(t=[t]),e=0;e<t.length;e++)r=O(n=(o=t[e].split("|"))[0]),s[r]=t[e],a[r]=n,w(r,o[2].split(" "))}function M(t,e){t=O(t);var n,o=s[t];return o instanceof d?o:"string"==typeof o?(o=new d(o),s[t]=o):f[t]&&e!==M&&(n=M(f[t],M))?((o=s[t]=new d)._set(n),o.name=a[t],o):null}function j(t){var e,n,o,r;for("string"==typeof t&&(t=[t]),e=0;e<t.length;e++)o=O((n=t[e].split("|"))[0]),r=O(n[1]),f[o]=r,a[o]=n[0],f[r]=o,a[r]=n[1]}function A(t){var e="X"===t._f||"x"===t._f;return!(!t._a||void 0!==t._tzm||e)}function D(t){"undefined"!=typeof console&&"function"==typeof console.error&&console.error(t)}function T(t){var e=Array.prototype.slice.call(arguments,0,-1),n=arguments[arguments.length-1],o=M(n),r=i.utc.apply(null,e);return o&&!i.isMoment(t)&&A(r)&&r.add(o.parse(r),"minutes"),r.tz(n),r}(n<2||2==n&&o<6)&&D("Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js "+i.version+". See momentjs.com"),d.prototype={_set:function(t){this.name=t.name,this.abbrs=t.abbrs,this.untils=t.untils,this.offsets=t.offsets,this.population=t.population},_index:function(t){var e,n=+t,o=this.untils;for(e=0;e<o.length;e++)if(n<o[e])return e},countries:function(){var e=this.name;return Object.keys(u).filter(function(t){return-1!==u[t].zones.indexOf(e)})},parse:function(t){var e,n,o,r,i=+t,s=this.offsets,f=this.untils,u=f.length-1;for(r=0;r<u;r++)if(e=s[r],n=s[r+1],o=s[r?r-1:r],e<n&&T.moveAmbiguousForward?e=n:o<e&&T.moveInvalidForward&&(e=o),i<f[r]-6e4*e)return s[r];return s[u]},abbr:function(t){return this.abbrs[this._index(t)]},offset:function(t){return D("zone.offset has been deprecated in favor of zone.utcOffset"),this.offsets[this._index(t)]},utcOffset:function(t){return this.offsets[this._index(t)]}},b.prototype.scoreOffsetAt=function(t){this.offsetScore+=Math.abs(this.zone.utcOffset(t.at)-t.offset),this.zone.abbr(t.at).replace(/[^A-Z]/g,"")!==t.abbr&&this.abbrScore++},T.version="0.5.34",T.dataVersion="",T._zones=s,T._links=f,T._names=a,T._countries=u,T.add=S,T.link=j,T.load=function(t){S(t.zones),j(t.links),function(t){var e,n,o,r;if(t&&t.length)for(e=0;e<t.length;e++)n=(r=t[e].split("|"))[0].toUpperCase(),o=r[1].split(" "),u[n]=new z(n,o)}(t.countries),T.dataVersion=t.version},T.zone=M,T.zoneExists=function t(e){return t.didShowError||(t.didShowError=!0,D("moment.tz.zoneExists('"+e+"') has been deprecated in favor of !moment.tz.zone('"+e+"')")),!!M(e)},T.guess=function(t){return e&&!t||(e=y()),e},T.names=function(){var t,e=[];for(t in a)a.hasOwnProperty(t)&&(s[t]||s[f[t]])&&a[t]&&e.push(a[t]);return e.sort()},T.Zone=d,T.unpack=m,T.unpackBase60=r,T.needsOffset=A,T.moveInvalidForward=!0,T.moveAmbiguousForward=!1,T.countries=function(){return Object.keys(u)},T.zonesForCountry=function(t,e){if(!(t=function(t){return t=t.toUpperCase(),u[t]||null}(t)))return null;var n=t.zones.sort();return e?n.map(function(t){return{name:t,offset:M(t).utcOffset(new Date)}}):n};var x,C=i.fn;function Z(t){return function(){return this._z?this._z.abbr(this):t.call(this)}}function k(t){return function(){return this._z=null,t.apply(this,arguments)}}i.tz=T,i.defaultZone=null,i.updateOffset=function(t,e){var n,o=i.defaultZone;if(void 0===t._z&&(o&&A(t)&&!t._isUTC&&(t._d=i.utc(t._a)._d,t.utc().add(o.parse(t),"minutes")),t._z=o),t._z)if(n=t._z.utcOffset(t),Math.abs(n)<16&&(n/=60),void 0!==t.utcOffset){var r=t._z;t.utcOffset(-n,e),t._z=r}else t.zone(n,e)},C.tz=function(t,e){if(t){if("string"!=typeof t)throw new Error("Time zone name must be a string, got "+t+" ["+typeof t+"]");return this._z=M(t),this._z?i.updateOffset(this,e):D("Moment Timezone has no data for "+t+". See http://momentjs.com/timezone/docs/#/data-loading/."),this}if(this._z)return this._z.name},C.zoneName=Z(C.zoneName),C.zoneAbbr=Z(C.zoneAbbr),C.utc=k(C.utc),C.local=k(C.local),C.utcOffset=(x=C.utcOffset,function(){return 0<arguments.length&&(this._z=null),x.apply(this,arguments)}),i.tz.setDefault=function(t){return(n<2||2==n&&o<9)&&D("Moment Timezone setDefault() requires Moment.js >= 2.9.0. You are using Moment.js "+i.version+"."),i.defaultZone=t?M(t):null,i};var F=i.momentProperties;return"[object Array]"===Object.prototype.toString.call(F)?(F.push("_z"),F.push("_a")):F&&(F._z=null),i});### Moment-timezone version which you use:

Version:

_Note: many issues are resolved if you just upgrade to the latest version_

### Issue description:

/**
 * Helpers.
 */

var s = 1000;
var m = s * 60;
var h = m * 60;
var d = h * 24;
var w = d * 7;
var y = d * 365.25;

/**
 * Parse or format the given `val`.
 *
 * Options:
 *
 *  - `long` verbose formatting [false]
 *
 * @param {String|Number} val
 * @param {Object} [options]
 * @throws {Error} throw an error if val is not a non-empty string or a number
 * @return {String|Number}
 * @api public
 */

module.exports = function(val, options) {
  options = options || {};
  var type = typeof val;
  if (type === 'string' && val.length > 0) {
    return parse(val);
  } else if (type === 'number' && isFinite(val)) {
    return options.long ? fmtLong(val) : fmtShort(val);
  }
  throw new Error(
    'val is not a non-empty string or a valid number. val=' +
      JSON.stringify(val)
  );
};

/**
 * Parse the given `str` and return milliseconds.
 *
 * @param {String} str
 * @return {Number}
 * @api private
 */

function parse(str) {
  str = String(str);
  if (str.length > 100) {
    return;
  }
  var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(
    str
  );
  if (!match) {
    return;
  }
  var n = parseFloat(match[1]);
  var type = (match[2] || 'ms').toLowerCase();
  switch (type) {
    case 'years':
    case 'year':
    case 'yrs':
    case 'yr':
    case 'y':
      return n * y;
    case 'weeks':
    case 'week':
    case 'w':
      return n * w;
    case 'days':
    case 'day':
    case 'd':
      return n * d;
    case 'hours':
    case 'hour':
    case 'hrs':
    case 'hr':
    case 'h':
      return n * h;
    case 'minutes':
    case 'minute':
    case 'mins':
    case 'min':
    case 'm':
      return n * m;
    case 'seconds':
    case 'second':
    case 'secs':
    case 'sec':
    case 's':
      return n * s;
    case 'milliseconds':
    case 'millisecond':
    case 'msecs':
    case 'msec':
    case 'ms':
      return n;
    default:
      return undefined;
  }
}

/**
 * Short format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtShort(ms) {
  var msAbs = Math.abs(ms);
  if (msAbs >= d) {
    return Math.round(ms / d) + 'd';
  }
  if (msAbs >= h) {
    return Math.round(ms / h) + 'h';
  }
  if (msAbs >= m) {
    return Math.round(ms / m) + 'm';
  }
  if (msAbs >= s) {
    return Math.round(ms / s) + 's';
  }
  return ms + 'ms';
}

/**
 * Long format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtLong(ms) {
  var msAbs = Math.abs(ms);
  if (msAbs >= d) {
    return plural(ms, msAbs, d, 'day');
  }
  if (msAbs >= h) {
    return plural(ms, msAbs, h, 'hour');
  }
  if (msAbs >= m) {
    return plural(ms, msAbs, m, 'minute');
  }
  if (msAbs >= s) {
    return plural(ms, msAbs, s, 'second');
  }
  return ms + ' ms';
}

/**
 * Pluralization helper.
 */

function plural(ms, msAbs, n, name) {
  var isPlural = msAbs >= n * 1.5;
  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
}
The MIT License (MIT)

Copyright (c) 2016 Zeit, Inc.

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": "ms",
  "version": "2.1.2",
  "description": "Tiny millisecond conversion utility",
  "repository": "zeit/ms",
  "main": "./index",
  "files": [
    "index.js"
  ],
  "lint-staged": {
    "*.js": [
      "npm run lint",
      "prettier --single-quote --write",
      "git add"
    ]
  },
  "license": "MIT",
  "devDependencies": {
    "eslint": "4.12.1",
    "expect.js": "0.3.1",
    "husky": "0.14.3",
    "lint-staged": "5.0.0",
    "mocha": "4.0.1"
  }
}{
  "test": {
    "CONNECTION_KEY": "UAT18",
    "LOCAL": "Driver={ODBC Driver 17 for SQL Server};Server=(localdb)\\node;Database=scratch;Trusted_Connection=yes;",
    "LAP": "Driver={ODBC Driver 17 for SQL Server}; Server=DESKTOP-9RLN5E4;UID=linux; PWD=linux; Database=node",
    "WSL": "DSN=MSSQLTest;UID=linux; PWD=linux; Database=node",
    "DEV": "Driver={ODBC Driver 17 for SQL Server}; Server=192.168.1.102;UID=linux; PWD=linux; Database=node",
    "UAT18": "Driver={ODBC Driver 18 for SQL Server}; Server=DESKTOP-VIUCH90;UID=linux; PWD=linux; Database=node;TrustServerCertificate=yes;",
    "UAT": "Driver={ODBC Driver 17 for SQL Server}; Server=DESKTOP-VIUCH90;UID=linux; PWD=linux; Database=node",
    "SA": "Driver={ODBC Driver 17 for SQL Server}; Server=192.168.1.102;UID=sa; PWD=sqlexpress; Database=node"
  },
  "appv-ubuntu": {
    "DEFAULT": "Driver={ODBC Driver 17 for SQL Server}; Server=localhost; Uid=SA; Pwd=Password12!"
  },
  "appv-2014": {
    "DEFAULT": "Driver={SQL Server Native Client 11.0}; Server=(local)\\SQL2014; Database={master}; Uid=sa; Pwd=Password12!"
  },
  "appv-2016": {
    "DEFAULT": "Driver={SQL Server Native Client 11.0}; Server=(local)\\SQL2016; Database={master}; Uid=sa; Pwd=Password12!"
  },
  "appv-2017": {
    "DEFAULT": "Driver={SQL Server Native Client 11.0}; Server=(local)\\SQL2017; Database={master}; Uid=sa; Pwd=Password12!"
  },
  "appv-2019": {
    "DEFAULT": "Driver={SQL Server Native Client 11.0}; Server=(local)\\SQL2019; Database={master}; Uid=sa; Pwd=Password12!"
  },
  "appv-v17-2017": {
    "DEFAULT": "Driver={ODBC Driver 17 for SQL Server}; Server=(local)\\SQL2017; Database={master}; Uid=sa; Pwd=Password12!"
  },
  "appv-v17-2019": {
    "DEFAULT": "Driver={ODBC Driver 17 for SQL Server}; Server=(local)\\SQL2019; Database={master}; Uid=sa; Pwd=Password12!"
  },
  "localdb": {
    "DEFAULT": "Driver={SQL Server Native Client 11.0}; Server=(localdb)\\node;Database=scratch;Trusted_Connection=yes;"
  },
  "sybase": {
    "DEFAULT": "Driver={Adaptive Server Enterprise}; app=myAppName; server=DESKTOP-9RLN5E4; port=5000; db=pubs3; uid=sa; pwd=sap001;"
  },
  "sa": {
    "DEFAULT": "Driver={ODBC Driver 17 for SQL Server}; Server=192.168.1.102;UID=sa; PWD=sqlexpress; Database=node"
  }
}

# Contribution Guidelines Overview

If you would like to become involved in the development of the [Microsoft Driver for Node.js for SQL Server][Project], there are many different ways in which you can contribute. We strongly value user feedback and will appreciate your questions, bug reports and feature requests. For more details how you can submit those see section Using the product and providing feedback below. In addition you can also contribute changes to the code, which include bug fixes and improvements as well as new features. For more details how to do this please see section Contributing changes below.

## Using the product and providing feedback

Using the Microsoft Driver for Node.js for SQL Server, asking and answering question, reporting bugs and making feature requests are critical parts of the project community. User feedback is crucial for improving the quality of the products and drive further development.
In order to become familiar with the functionality you can donwnload the pre-compiled binaries (see Obtaining the binaries below) or synch the source code from Github and compile locally (see Obtaining the source code below). Once you become familiar with the functionality you can report bugs or request new features (see Report bugs and request features below).

### Asking and answering questions

The easiest way to ask and answer questions is to visit the [Issues][Issues] page, and ask a question there.

### Obtaining the binaries

Pre-compiled binaries of Driver are available at the [download page][Download]. 

### Obtaining the source code

In order to obtain the source code you need to become familiar with [Git](http://progit.org/book/) and [Github](http://help.github.com/) and you need to have Git installed on your local machine. You can obtain the source code from the [Project page][Project].

### Report bugs and request features

Issues and feature requests are submitted through the project's [Issues][Issues] section on GitHub. Please use the following guidelines when you submit issues and feature requests:

* Make sure the issue is not already reported by searching through the list of issues
* Provide detailed description of the issue including the following information:
    * Which feature the issue appears in
    * Under what circumstances the issue appears
    * What is desired behavior
    * What is breaking
    * What is the impact (things like loss or corruption of data, compromizing security, disruption of service etc.)
    * Any code that will be helpful to reproduce the issue

Issues are regularly reviewed and updated with additional information by the core team. Sometimes the core team may have questions about particular issue that might need clarifications so, please be ready to provide additional information.

## Contributing changes
### How to become a contributor?

In order to become a contributor to the project we need you to sign the Contributor License Agreement (CLA). Signing the Contributor License Agreement (CLA) does not grant you rights to commit to the main repository but it does mean that we will consider your contributions and you will get credit if we do. Active contributors might be asked to join the core team, and given the ability to merge pull requests.
You can download the Contributor License Agreement (CLA) by clicking at the following [link][CLA]. Please fill in, sign, scan and email it to [cla@microsoft.com](mailto:cla@microsoft.com).

### Create bug fixes and features

You make modifications of the code in your local Git repository. Once you are done with your implementation follow the steps below:

* Change the working branch to master with the following command: ```git checkout master````
* Submit the changes to your own fork in GitHub by using the following command: ```git submit````
* In GitHub create new pull request by clicking on the Pull Request button
* In the pull request select your fork as source and WindowsAzure/node-sqlserver as destination for the request
* Write detailed message describing the changes in the pull request
    Submit the pull request for consideration by the Core Team

Note: All changes and pull request should be done in the master branch if they are bug fixes. Major changes should be coordinated with the core team so that we can set up an improvement branch for this work. Changes will be integrated in a release branch by the Core Team.

Please keep in mind that not all requests will be approved. Requests are reviewed by the Core Team on a regular basis and will be updated with the status at each review. If your request is accepted you will receive information about the next steps and when the request will be integrated in the main branch. If your request is rejected you will receive information about the reasons why it was rejected.
Contribution guidelines

Before you start working on bug fixes and features it is good idea to discuss those broadly with the community. You can file an Issue as described in Asking and answering questions for this purpose.
Before submitting your changes make sure you followed the guidelines below:

* You have properly documented any new functionality using the documentation standards for the language (this includes classes, methods and functions, properties etc.)
*   Proper inline documentation is included for any change you make  
* For any new functionality you have written complete unit tests
* You have ran all unit tests and they pass

In order to speed up the process of accepting your contributions, you should try to make your checkins as small as possible, avoid any unnecessary deltas and the need to rebase. 

[Issues]: https://github.com/WindowsAzure/node-sqlserver/issues
[Project]: https://github.com/WindowsAzure/node-sqlserver/
[Download]: http://www.microsoft.com/en-us/download/details.aspx?id=29995
[CLA]: http://windowsazure.github.com/docs/Contribution%20License%20Agreement.pdf
# Contributors Attribution

Copyright Microsoft Corporation and contributors

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.

You may obtain a copy of the License at:
http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

This file contains all entities that have contributed to the
development, testing, or documentation of this module.

## Contributors

Microsoft Corp.
Einar Otto Stangvik <einaros@gmail.com>
Dino M. Gambone <dmgambone@linearsoftwaresolutions.com>
Stephen James <sjames8888@gmail.com>
Copyright Microsoft Corporation and contributors

Licensed under the Apache License, Version 2.0 (the "License"); you
may not use this file except in compliance with the License. You may
obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. See the License for the specific language governing
permissions and limitations under the License.

{
  "name": "msnodesqlv8",
  "description": "Microsoft Driver for Node.js SQL Server compatible with all versions of Node.",
  "author": {
    "name": "Stephen James"
  },
  "version": "2.6.0",
  "homepage": "https://github.com/TimelordUK/node-sqlserver-v8",
  "license": "Apache-2.0",
  "main": "./lib/sql.js",
  "typings": "./lib/index.d.ts",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/TimelordUK/node-sqlserver-v8.git"
  },
  "engines": {
    "node": ">=10"
  },
  "maintainers": [
    {
      "name": "timelorduk",
      "email": "sjames8888@gmail.com"
    }
  ],
  "dependencies": {
    "nan": "^2.16.0",
    "node-abi": "^3.22.0",
    "prebuild-install": "^7.1.1"
  },
  "devDependencies": {
    "@types/chai": "^4.3.1",
    "@types/chai-as-promised": "^7.1.5",
    "@types/electron": "^1.4.38",
    "@types/mocha": "^9.1.1",
    "@types/mochawesome": "^6.2.1",
    "@types/node": "^18.0.3",
    "@types/sequelize": "^4.28.14",
    "chai": "^4.3.6",
    "chai-as-promised": "^7.1.1",
    "electron": "^19.0.8",
    "electron-rebuild": "^3.2.8",
    "env-cmd": "^10.1.0",
    "eslint": "^8.19.0",
    "minimist": "^1.2.6",
    "mocha": "^10.0.0",
    "mochawesome": "^7.1.3",
    "node-gyp": "^9.0.0",
    "nyc": "^15.1.0",
    "prebuild": "^11.0.3",
    "sequelize": "^6.21.2",
    "standard": "^17.0.0",
    "typescript": "^4.7.4"
  },
  "os": [
    "win32",
    "linux",
    "darwin"
  ],
  "directories": {}
}{
    "compilerOptions": {
      "target": "es6",
      "module": "commonjs",
      "noImplicitAny": true,
      "removeComments": true,
      "preserveConstEnums": true,
      "sourceMap": true,
      "inlineSources": true,
      "pretty": true,
      "outDir": "dist"
    }
  }#include "OdbcConnection.h"
#include <BeginTranOperation.h>

namespace mssql
{
	BeginTranOperation::BeginTranOperation(const shared_ptr<OdbcConnection> &connection, const Local<Object> callback)
		: OdbcOperation(connection, callback)
	{
	}

	bool BeginTranOperation::TryInvokeOdbc()
	{
		return _connection->try_begin_tran();
	}

	Local<Value> BeginTranOperation::CreateCompletionArg()
	{
		const nodeTypeFactory fact;
		return fact.null();
	}
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcOperation.h
// Contents: ODBC Operation objects called on background thread
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include <OdbcOperation.h>

namespace mssql
{
	using namespace std;
	using namespace v8;

	class OdbcConnection;

	class BeginTranOperation : public OdbcOperation
	{
	public:
		BeginTranOperation(const shared_ptr<OdbcConnection> &connection, const Local<Object> callback);
		bool TryInvokeOdbc() override;
		Local<Value> CreateCompletionArg() override;
	};
}

#pragma once

#include <v8.h>
#include <Column.h>
#include <BoundDatumHelper.h>
#include <string>

namespace mssql
{
    using namespace std;

    class BigIntColumn : public Column
    {
    public:

		BigIntColumn(int id, DatumStorage::bigint_t d) : Column(id), value(d)
		{
		}

		BigIntColumn(int id, shared_ptr<DatumStorage> storage) : Column(id), value((*storage->bigint_vec_ptr)[0])
		{			
		}

	   inline Local<Value> ToString() override
	   {
		   return AsString<DatumStorage::bigint_t>(value);
	   }

	   inline Local<Value> ToNative() override
	   {
		  return Nan::New((double)value);
	   }

    private:
	   DatumStorage::bigint_t value;
    };
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: Column.cpp
// Contents: Column objects from SQL Server to return as Javascript types
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#include "stdafx.h"
#include <BinaryColumn.h>

namespace mssql {

	BinaryColumn::BinaryColumn(const int id, const shared_ptr<DatumStorage> s, const size_t l) : Column(id)
	                                                                                             , storage(s->charvec_ptr), len(l), offset(0)
	{
	}

	BinaryColumn::BinaryColumn(const int id, const shared_ptr<DatumStorage> s, const size_t offset, const size_t l) : Column(id)                                                                                             , storage(s->charvec_ptr), len(l), offset(offset)
	{
	}

    Local<Value> BinaryColumn::ToString()
	{
		const auto* const ptr = storage->data() + offset;
		std::string s(ptr, ptr + len);
		storage->reserve(0);
		storage = nullptr;
		auto st = Nan::Encode(s.data() + offset, s.size() * 2, Nan::UCS2);
		// fprintf(stderr, "[%d], ToValue len = %zu, offset = %zu, ptr = %p, destructed = %d\n", Id(), len, offset, str, destructed);
		return st;
	}

	Local<Value> BinaryColumn::ToNative()
	{
		const auto* const ptr = storage->data() + offset;
		const auto buff = Nan::CopyBuffer(ptr, len).ToLocalChecked();
		storage->reserve(0);
		storage = nullptr;
		// fprintf(stderr, "[%d], ToValue len = %zu, offset = %zu, ptr = %p, destructed = %d\n", Id(), len, offset, str, destructed);
		return buff;
	}
}   // namespace mssql#pragma once

#include <vector>
#include <v8.h>
#include "Column.h"
#include <node_buffer.h>
#include "BoundDatumHelper.h"

namespace mssql
{
    using namespace std;

    class BinaryColumn : public Column
    {

    public:
		BinaryColumn(const int id, shared_ptr<DatumStorage> s, size_t l);
		BinaryColumn(const int id, shared_ptr<DatumStorage> s, size_t offset, size_t l);
		Local<Value> ToNative() override;
    Local<Value> ToString() override;

    private:
		shared_ptr<DatumStorage::char_vec_t> storage;
		size_t len;
		size_t offset;

    };
}

#pragma once

#include "stdafx.h"
#include <Column.h>

namespace mssql
{
	using namespace std;

	class BoolColumn : public Column
	{
	public:
		BoolColumn(int id, shared_ptr<DatumStorage> storage) : Column(id), value((*storage->charvec_ptr)[0] != 0 ? true : false)
		{			
		}

		BoolColumn(int id, char v) : Column(id), value(v != 0 ? true : false)
		{
		}

	   inline Local<Value> ToString() override
	   {
		   return AsString<bool>(value);
	   }

		inline Local<Value> ToNative() override
		{
			return Nan::New<Boolean>(value);
		}
	private:
		bool value;
	};
}
#include <BoundDatum.h>
#include <BoundDatumHelper.h>
#include <TimestampColumn.h>
#include <QueryOperationParams.h>
#include <MutateJS.h>
#include <codecvt>
#include <locale>
#include <cstring>

namespace mssql
{
	constexpr int sql_server_2008_default_time_precision = 16;
	constexpr int sql_server_2008_default_datetime_precision = 34;
	constexpr int sql_server_2008_default_timestamp_precision = 27;
	constexpr int sql_server_2008_default_datetime_scale = 7;

	static Local<Boolean> get_as_bool(const Local<Value> o, const char* v)
	{
		const nodeTypeFactory fact;
		const auto context = fact.isolate->GetCurrentContext();
		const auto vp = Nan::New(v).ToLocalChecked();
		const auto false_val = Nan::New(false);
		if (o->IsNull())
		{
			return false_val;
		}
		if (!o->IsObject())
		{
			return false_val;
		}
		Local<Object> as_obj;
		if (!o->ToObject(context).ToLocal(&as_obj))
		{
			return false_val;
		}
		if (as_obj->IsNull())
		{
			return false_val;
		}
		Local<Value> as_val;
		if (!as_obj->Get(context, vp).ToLocal(&as_val))
		{
			return false_val;
		}
		if (as_val->IsNull())
		{
			return false_val;
		}
		
		return Nan::To<Boolean>(as_val).ToLocalChecked();
	}

	bool sql_type_s_maps_to_tvp(const Local<Value> p)
	{
		const auto is_user_defined = get_as_bool(p, "is_user_defined");
		if (is_user_defined->IsNull()) return false;
		const auto as_bool = MutateJS::as_boolean(is_user_defined);	
		return as_bool;
	}

	bool BoundDatum::bind(Local<Value>& p)
	{
		auto res = false;
		if (sql_type_s_maps_to_tvp(p))
		{
			bind_tvp(p);
			return true;
		}
		if (p->IsArray())
		{
			res = bind_array(p);
		}
		else if (p->IsObject())
		{
			res = bind_object(p);
		}
		if (!res) res = bind_datum_type(p);
		return res;
	}

	static Local<String> get_as_string(const Local<Value> o, const char* v)
	{
		const auto key = Nan::New<String>(v).ToLocalChecked();
		const auto ss = Nan::Get(Nan::To<Object>(o).ToLocalChecked(), key).ToLocalChecked();
		if (!ss.IsEmpty()) {
			return Nan::To<String>(ss).ToLocalChecked();
		}
		return Nan::EmptyString();
	}

	void BoundDatum::bind_null(const Local<Value>& p)
	{
		reserve_null(1);
		_indvec[0] = SQL_NULL_DATA;
	}

	void BoundDatum::bind_null_array(const Local<Value>& p)
	{
		const auto arr = Local<Array>::Cast(p);
		const auto len = arr->Length();
		reserve_null(len);
		for (uint32_t i = 0; i < len; ++i)
		{
			_indvec[i] = SQL_NULL_DATA;
		}
	}

	void BoundDatum::reserve_null(const SQLLEN len)
	{
		buffer_len = 0;
		_indvec.resize(len);
		js_type = JS_NULL;
		c_type = SQL_C_CHAR;
		sql_type = SQL_CHAR;
		param_size = 1;
		digits = 0;
		buffer = nullptr;
	}

	void BoundDatum::bind_w_long_var_char(const Local<Value>& p)
	{
		bind_w_var_char(p);
		sql_type = SQL_WLONGVARCHAR;
		param_size = buffer_len;
	}

	void BoundDatum::bind_w_var_char(const Local<Value>& p)
	{
		const auto str_param = Nan::To<String>(p).FromMaybe(Nan::EmptyString());	
		bind_w_var_char(p, str_param->Length());
	}

	void BoundDatum::bind_char(const Local<Value>& p)
	{
		bind_var_char(p);
	}

	void BoundDatum::bind_var_char(const Local<Value>& p)
	{
		const auto local = Nan::To<String>(p).FromMaybe(Nan::EmptyString());
		SQLULEN precision = local->Length();
		if (param_size > 0) precision = min(param_size, precision);
		bind_var_char(p, static_cast<int>(precision));
	}

	void BoundDatum::reserve_var_char(const size_t precision, const size_t array_len)
	{
		js_type = JS_STRING;
		c_type = SQL_C_CHAR;
		sql_type = precision > 8000 ? SQL_WLONGVARCHAR : SQL_VARCHAR;
		if (precision == 4000) {
			sql_type = SQL_WCHAR;
		}
		digits = 0;
		_indvec[0] = SQL_NULL_DATA;
		_indvec.resize(array_len);
		_storage->ReserveChars(max(1, static_cast<int>(array_len * precision)));	
		auto* itr_p = _storage->charvec_ptr->data();
		buffer = itr_p;
		buffer_len = static_cast<SQLLEN>(precision);
		param_size = max(buffer_len, static_cast<SQLLEN>(1));
	}
	
	void BoundDatum::bind_var_char(const Local<Value>& p, const int precision)
	{
		reserve_var_char(precision, 1);
		if (!p->IsNullOrUndefined())
		{	
			const auto str_param = Nan::To<String>(p).FromMaybe(Nan::EmptyString());
			Nan::Utf8String x(str_param);
			const auto *x_p = *x;
			memcpy(_storage->charvec_ptr->data(), x_p, precision);	
			_indvec[0] = precision;	
		}
	}
	
	int get_max_str_len(const Local<Value>& p)
	{
		auto str_len = 0;
		const auto arr = Local<Array>::Cast(p);
		const auto len = arr->Length();
		for (uint32_t i = 0; i < len; ++i)
		{	
			auto elem = Nan::Get(arr, i);
			if (elem.IsEmpty()) continue;
			auto maybe_value = Nan::To<String>(elem.ToLocalChecked());
			const auto str = maybe_value.FromMaybe(Nan::EmptyString()); 	
			if (str->Length() > str_len) {
				str_len = str->Length();
			}		
		}
		return str_len;
	}

	void BoundDatum::bind_var_char_array_bcp(const Local<Value>& p)
	{
		const auto arr = Local<Array>::Cast(p);
		const auto array_len = arr->Length();
		_storage->ReserveCharVec(array_len);
		_indvec.resize(array_len);
		sql_type = SQLVARCHAR;
		param_size = SQL_VARLEN_DATA;
		buffer_len = get_max_str_len(p);
		auto & vec = *_storage->char_vec_vec_ptr;
		for (uint32_t i = 0; i < array_len; ++i)
		{
			_indvec[i] = SQL_NULL_DATA;
			auto elem = Nan::Get(arr, i);
			if (elem.IsEmpty()) continue;
			const auto local_elem = elem.ToLocalChecked();
			if (local_elem->IsNullOrUndefined()) {
				continue;
			}
			auto maybe_value = Nan::To<String>(elem.ToLocalChecked());
			const auto str = maybe_value.FromMaybe(Nan::EmptyString()); 	
			const auto width = str->Length();
			_indvec[i] = width;
			Nan::Utf8String x(str);
			const auto *x_p = *x;
			_indvec[i] = width;
			const auto store = make_shared<DatumStorage::char_vec_t>(width);
			store->reserve(width);
			store->resize(width);
			vec[i] = store;
			const auto itr = store->data();
			memcpy(&*itr, x_p, width);		
		}
	}

	void BoundDatum::bind_var_char_array(const Local<Value>& p)
	{
		if (is_bcp) {
			bind_var_char_array_bcp(p);
			return;
		}
		const auto max_str_len = max(1, get_max_str_len(p));
		const auto arr = Local<Array>::Cast(p);
		const auto array_len = arr->Length();
		reserve_var_char(max_str_len, array_len);
		auto itr = _storage->charvec_ptr->begin();
		for (uint32_t i = 0; i < array_len; ++i)
		{
			_indvec[i] = SQL_NULL_DATA;
			auto elem = Nan::Get(arr, i);
			if (elem.IsEmpty()) continue;
			auto maybe_value = Nan::To<String>(elem.ToLocalChecked());
			const auto str = maybe_value.FromMaybe(Nan::EmptyString()); 	
			const auto width = str->Length();
			_indvec[i] = width;
			Nan::Utf8String x(str);
			const auto *x_p = *x;
			memcpy(&*itr, x_p, max_str_len);
			itr += max_str_len;
		}
	}
	
	void BoundDatum::reserve_w_var_char_array(const size_t max_str_len, const size_t array_len)
	{
		js_type = JS_STRING;
		c_type = SQL_C_WCHAR;
		sql_type = max_str_len > 2000 && max_str_len < 4000 ? SQL_WLONGVARCHAR : SQL_WVARCHAR;
		constexpr auto size = sizeof(uint16_t);
		_indvec.resize(array_len);
		_storage->ReserveUint16(array_len * max_str_len);
		buffer = _storage->uint16vec_ptr->data();
		buffer_len = static_cast<SQLLEN>(max_str_len * size);
		if (max_str_len >= 4000)
		{
			param_size = 0;
		}
		else
		{
			param_size = max(buffer_len, static_cast<SQLLEN>(1));
		}
	}

	void BoundDatum::bind_w_var_char_array_bcp(const Local<Value>& p)
	{
		const auto arr = Local<Array>::Cast(p);
		const auto array_len = arr->Length();
		_storage->ReserveUint16Vec(array_len);
		_indvec.resize(array_len);
		sql_type = SQLNCHAR;
		param_size = SQL_VARLEN_DATA;
		buffer_len = get_max_str_len(p) + 1;
		bcp_terminator = reinterpret_cast<LPCBYTE>(L"");
		bcp_terminator_len = sizeof(WCHAR);
		auto & vec = *_storage->uint16_vec_vec_ptr;
		for (uint32_t i = 0; i < array_len; ++i)
		{
			_indvec[i] = SQL_NULL_DATA;
			auto elem = Nan::Get(arr, i);
			if (elem.IsEmpty()) continue;
			const auto local_elem = elem.ToLocalChecked();
			if (local_elem->IsNullOrUndefined()) {
				continue;
			}
			auto maybe_value = Nan::To<String>(local_elem);
			const auto str = maybe_value.FromMaybe(Nan::EmptyString()); 	
			const auto len = str->Length();
			constexpr auto size = sizeof(uint16_t);
			const auto store = make_shared<DatumStorage::uint16_t_vec_t>(len);
			store->reserve(len);
			store->resize(len);
			vec[i] = store;
			const auto itr = store->data();
			const auto width = len * size;
			_indvec[i] = static_cast<SQLLEN>(width);
			const size_t strlen = static_cast<size_t>(str->Length()) * 2;
			Nan::DecodeWrite(reinterpret_cast<char*>(&*itr), strlen, str, Nan::UCS2);
			store->push_back(0);
		}
	}

	void BoundDatum::bind_w_var_char_array(const Local<Value>& p)
	{
		if (is_bcp) {
			bind_w_var_char_array_bcp(p);
			return;
		}
		const auto max_str_len = max(1, get_max_str_len(p));
		const auto arr = Local<Array>::Cast(p);
		const auto array_len = arr->Length();
		reserve_w_var_char_array(max_str_len, array_len);
		auto* const base = _storage->uint16vec_ptr->data();
		for (uint32_t i = 0; i < array_len; ++i)
		{
			constexpr auto size = sizeof(uint16_t);
			auto* const itr = base + static_cast<SQLLEN>(max_str_len ) * i;
			_indvec[i] = SQL_NULL_DATA;
			auto elem = Nan::Get(arr, i);
			if (elem.IsEmpty()) continue;
			const auto local_elem = elem.ToLocalChecked();
			if (local_elem->IsNullOrUndefined()) continue;
			auto maybe_value = Nan::To<String>(local_elem);
			const auto str = maybe_value.FromMaybe(Nan::EmptyString()); 	
			const auto width = str->Length() * size;
			_indvec[i] = static_cast<SQLLEN>(width);
			const auto strlen = static_cast<size_t>(str->Length()) * 2;
			Nan::DecodeWrite(reinterpret_cast<char*>(&*itr), strlen, str, Nan::UCS2);
		}
	}

	void BoundDatum::bind_w_var_char(const Local<Value>& p, const int precision)
	{
		const size_t max_str_len = max(1, precision);
		reserve_w_var_char_array(max_str_len, 1);	
		_indvec[0] = SQL_NULL_DATA;
		if (!p->IsNullOrUndefined())
		{
			constexpr auto size = sizeof(uint16_t);
			const auto str_param = Nan::To<String>(p).FromMaybe(Nan::EmptyString());
			auto* const first_p = _storage->uint16vec_ptr->data();
			DecodeWrite(reinterpret_cast<char*>(first_p), static_cast<size_t>(str_param->Length()) * 2, str_param, Nan::UCS2);
			buffer_len = static_cast<SQLLEN>(precision) * static_cast<SQLLEN>(size);
			if (precision >= 4000)
			{
				param_size = 0;
			}
			else
			{
				param_size = max(buffer_len, static_cast<SQLLEN>(1));
			}
			_indvec[0] = buffer_len;
		}
	}

	size_t get_max_object_len(const Local<Value>& p)
	{
		size_t obj_len = 0;
		const auto arr = Local<Array>::Cast(p);
		const auto len = arr->Length();
		for (uint32_t i = 0; i < len; ++i)
		{
			auto elem = Nan::Get(arr, i);
			if (elem.IsEmpty()) continue;
			const auto local = elem.ToLocalChecked();
			if (local->IsNullOrUndefined()) continue;
			auto maybe_value = Nan::To<Object>(local);
			if (maybe_value.IsEmpty()) continue;
			const auto local_instance = maybe_value.ToLocalChecked();
			const auto width = node::Buffer::Length(local_instance);
			if (width > obj_len) obj_len = width;
		}
		return obj_len;
	}

	void BoundDatum::bind_long_var_binary(Local<Value>& p)
	{
		bind_var_binary(p);
		sql_type = SQL_LONGVARBINARY;
	}

	void BoundDatum::reserve_var_binary_array(const size_t max_obj_len, const size_t array_len)
	{
		js_type = JS_BUFFER;
		c_type = SQL_C_BINARY;
		sql_type = max_obj_len > 2000 ? SQL_LONGVARBINARY : SQL_VARBINARY;
		digits = 0;
		constexpr auto size = sizeof(uint8_t);
		_storage->ReserveChars(array_len * max_obj_len);
		_indvec.resize(array_len);
		buffer = _storage->charvec_ptr->data();
		buffer_len = static_cast<SQLLEN>(max_obj_len) * static_cast<SQLLEN>(size);
		param_size = max_obj_len;
	}

	/*
	 *const auto r = SQLBindParameter(*_statement, current_param, datum.param_type, datum.c_type, datum.sql_type,
									  datum.param_size, datum.digits, datum.buffer, datum.buffer_len, datum.get_ind_vec().data());


									  retcode = SQLBindParameter(
									  hstmt,              // Statement handle
				current_param		1,                  // Parameter Number
				param_type			SQL_PARAM_INPUT,    // Input/Output Type (always INPUT for TVP)
				c_type				SQL_C_DEFAULT,      // C - Type (always this for a TVP)
				sql_type			SQL_SS_TABLE,       // SQL Type (always this for a TVP)
				param_size			MAX_ARRAY_SIZE,     // For a TVP this is max rows we will use
				digits				0,                  // For a TVP this is always 0
				buffer				TVPTableName,       // For a TVP this is the type name of the
									  // TVP, and also a token returned by
									  // SQLParamData.
				buffer_len			SQL_NTS,            // For a TVP this is the length of the type
									  // name or SQL_NTS.
									  &lTVPRowsUsed);     // For a TVP this is the number of rows
									  // actually available.
	 */

	static int get_row_count(Local<Value>& p)
	{
		auto rows = 1;
		auto maybe_object = Nan::To<Object>(p);
		if (maybe_object.IsEmpty()) return -1;
		const auto local = maybe_object.ToLocalChecked();	
		auto maybe_get = Nan::Get(local, Nan::New<String>("row_count").FromMaybe(Nan::EmptyString()));
		if (maybe_get.IsEmpty()) return rows;
		const auto int32 = Nan::To<int>(maybe_get.ToLocalChecked());
		rows = int32.FromMaybe(1);
		return rows;
	}

	wstring wide_from_js_string(const Local<String> s)
	{		
		wstring_convert<codecvt_utf8_utf16<wchar_t>> converter;
		Nan::Utf8String x(s);
		const auto *x_p = *x;
		const string narrow = x_p;
		auto wide = converter.from_bytes(narrow);
		return wide;
	}

	void BoundDatum::bind_tvp(Local<Value>& p)
	{
		wstring_convert<codecvt_utf8_utf16<wchar_t>> converter;
		// string narrow = converter.to_bytes(wide_utf16_source_string);
		// fprintf(stderr, "bind tvp\n");
		is_tvp = true;
		param_type = SQL_PARAM_INPUT;
		c_type = SQL_C_DEFAULT;
		sql_type = SQL_SS_TABLE;
		const auto rows = get_row_count(p);
		const auto type_id_str = get_as_string(p, "type_id");
		const auto schema_str = get_as_string(p, "schema");
		
		if (!schema_str->IsNullOrUndefined())
		{
			_storage->schema = wide_from_js_string(schema_str);
		}
		_indvec.resize(1);
		const size_t precision = type_id_str->Length();
		_storage->ReserveChars(precision + 1);
		_storage->ReserveUint16(precision + 1);
		auto* itr_p = _storage->charvec_ptr->data();
		Nan::Utf8String x(type_id_str);
		const auto *x_p = *x;
		memcpy(itr_p, x_p, precision);
		//type_id_str->WriteUtf8(fact.isolate, itr_p, precision);
		const string narrow = _storage->charvec_ptr->data();
		const auto type_name = converter.from_bytes(narrow);
		const auto type_name_vec = wstr2wcvec(type_name);
		constexpr auto size = sizeof(type_name_vec[0]);
		memcpy(_storage->uint16vec_ptr->data(), type_name_vec.data(), precision * size);
		buffer = _storage->uint16vec_ptr->data();
		buffer_len = static_cast<SQLLEN>(precision) * static_cast<SQLLEN>(size);
		param_size = rows; // max no of rows.
		_indvec[0] = rows; // no of rows.
		digits = 0;
	}

	void BoundDatum::bind_var_binary(Local<Value>& p)
	{
		Local<Object> o;
		_indvec[0] = SQL_NULL_DATA;
		if (!p->IsNullOrUndefined()) {
		 	o = p.As<Object>();
		}
		const auto valid = !p->IsNullOrUndefined() && !o->IsNullOrUndefined();
		const auto obj_len = valid ? node::Buffer::Length(o) : 0;
		reserve_var_binary_array(obj_len, 1);

		if (valid)
		{
			const auto itr = _storage->charvec_ptr->begin();
			const auto* const ptr = node::Buffer::Data(o);
			_indvec[0] = static_cast<SQLLEN>(obj_len);
			memcpy(&*itr, ptr, obj_len);
		}
	}

	void BoundDatum::bind_var_binary_array_bcp(const Local<Value>& p)
	{
		const auto arr = Local<Array>::Cast(p);
		const auto array_len = arr->Length();
		_storage->ReserveCharVec(array_len);
		_indvec.resize(array_len);
		sql_type = SQLVARBINARY;
		param_size = SQL_VARLEN_DATA;
		buffer_len = static_cast<SQLLEN>(get_max_object_len(p));
		auto & vec = *_storage->char_vec_vec_ptr;
		for (uint32_t i = 0; i < array_len; ++i)
		{
			_indvec[i] = SQL_NULL_DATA;
			auto elem = Nan::Get(arr, i);
			if (elem.IsEmpty()) continue;
			const auto local_elem = elem.ToLocalChecked();
			if (local_elem->IsNullOrUndefined()) {
				continue;
			}
			auto maybe_value = Nan::To<Object>(local_elem);
			if (maybe_value.IsEmpty()) continue;
			const auto local_instance = maybe_value.ToLocalChecked();
			if (local_instance->IsNullOrUndefined()) continue;
			const auto* const ptr = node::Buffer::Data(local_instance);
			const auto obj_len = node::Buffer::Length(local_instance);
			_indvec[i] = static_cast<SQLLEN>(obj_len);
			const auto store = make_shared<DatumStorage::char_vec_t>(obj_len);
			store->reserve(obj_len);
			store->resize(obj_len);
			vec[i] = store;
			const auto itr = store->data();
			memcpy(&*itr, ptr, obj_len);		
		}
	}

	void BoundDatum::bind_var_binary_array(const Local<Value>& p)
	{
		if (is_bcp) {
			bind_var_binary_array_bcp(p);
			return;
		}

		const auto arr = Local<Array>::Cast(p);
		const auto array_len = arr->Length();
		const auto max_obj_len = get_max_object_len(p);
		reserve_var_binary_array(max_obj_len, array_len);
		auto* const base = _storage->charvec_ptr->data();
		for (uint32_t i = 0; i < array_len; ++i)
		{
			auto* const itr = base + (max_obj_len * i);
			_indvec[i] = SQL_NULL_DATA;
			auto elem = Nan::Get(arr, i);
			if (elem.IsEmpty()) continue;
			const auto toLocal = elem.ToLocalChecked();
			if (toLocal->IsNullOrUndefined()) continue;
			auto maybe_value = Nan::To<Object>(toLocal);
			if (maybe_value.IsEmpty()) continue;
			const auto local_instance = maybe_value.ToLocalChecked();
			if (local_instance->IsNullOrUndefined()) continue;
			const auto* const ptr = node::Buffer::Data(local_instance);
			const auto obj_len = node::Buffer::Length(local_instance);
			_indvec[i] = static_cast<SQLLEN>(obj_len);
			memcpy(&*itr, ptr, obj_len);		
		}
	}

	void BoundDatum::bind_boolean(const Local<Value>& p)
	{
		reserve_boolean(1);
		auto& vec = *_storage->charvec_ptr;
		_indvec[0] = SQL_NULL_DATA;
		if (!p->IsNullOrUndefined())
		{
			const auto v = MutateJS::as_boolean(p);
			vec[0] = !v ? 0 : 1;
			_indvec[0] = 0;
		}
	}

	void BoundDatum::bind_boolean_array(const Local<Value>& p)
	{
		const auto arr = Local<Array>::Cast(p);
		const auto len = arr->Length();
		reserve_boolean(len);
		auto& vec = *_storage->charvec_ptr;	
		for (uint32_t i = 0; i < len; ++i)
		{
			_indvec[i] = SQL_NULL_DATA;
			const auto elem = Nan::Get(arr, i).ToLocalChecked();
			if (!elem->IsNullOrUndefined())
			{
				const auto v = MutateJS::as_boolean(elem);
				const auto b = !v ? 0 : 1;
				vec[i] = static_cast<char>(b);
				_indvec[i] = is_bcp ? sizeof(int8_t) : 0;
			}
		}
	}

	void BoundDatum::reserve_boolean(const SQLLEN len)
	{
		constexpr auto size = sizeof(char);
		buffer_len = static_cast<SQLLEN>(len) * static_cast<SQLLEN>(size);
		_storage->ReserveChars(len);
		_indvec.resize(len);
		js_type = JS_BOOLEAN;
		c_type = SQL_C_BIT;
		sql_type = SQL_BIT;
		buffer = _storage->charvec_ptr->data();
		param_size = size;
		digits = 0;
		if (is_bcp) {
			sql_type = SQLBIT;
			param_size = sizeof(DBBIT);
		}
	}

	void BoundDatum::bind_numeric(const Local<Value>& p)
	{
		reserve_numeric(1);
		sql_type = SQL_NUMERIC;
		_indvec[0] = SQL_NULL_DATA;
		if (!p->IsNullOrUndefined())
		{
			const auto local = Nan::To<Number>(p).ToLocalChecked();
			const auto d = local->Value();
			auto& vec = *_storage->numeric_ptr;
			auto& ns = vec[0];
			encode_numeric_struct(d, static_cast<int>(param_size), digits, ns);
			param_size = ns.precision;
			digits = static_cast<unsigned char>(ns.scale);
			_indvec[0] = sizeof(SQL_NUMERIC_STRUCT);
		}
	}

	void BoundDatum::bind_numeric_array(const Local<Value>& p)
	{
		const auto arr = Local<Array>::Cast(p);
		const int len = arr->Length();
		reserve_numeric(len);
		auto& vec = *_storage->numeric_ptr;
		for (auto i = 0; i < len; ++i)
		{
			auto& ns = vec[i];
			_indvec[i] = SQL_NULL_DATA;
			const auto elem = Nan::Get(arr, i).ToLocalChecked();
			if (!elem->IsNullOrUndefined())
			{
				const auto num = Nan::To<Number>(elem).ToLocalChecked();
				const auto d = num->Value();
				encode_numeric_struct(d, static_cast<int>(param_size), 0, ns);
				param_size = max(static_cast<unsigned int>(param_size), static_cast<unsigned int>(ns.precision));
				digits = 0;
				_indvec[i] = sizeof(SQL_NUMERIC_STRUCT);
			}
		}
	}

	void BoundDatum::reserve_numeric(const SQLLEN len)
	{
		definedPrecision = true;
		buffer_len = len * sizeof(SQL_NUMERIC_STRUCT);
		_storage->ReserveNumerics(len);
		_indvec.resize(len);
		js_type = JS_NUMBER;
		c_type = SQL_C_NUMERIC;
		sql_type = SQL_NUMERIC;
		buffer = _storage->numeric_ptr->data();
		if (is_bcp) {
			sql_type = SQLNUMERICN;
			param_size = sizeof(SQL_NUMERIC_STRUCT); 
		}
	}

	void BoundDatum::bind_tiny_int(const Local<Value>& p)
	{
		bind_int32(p);
		sql_type = SQL_TINYINT;
	}

	void BoundDatum::bind_small_int(const Local<Value>& p)
	{
		bind_int32(p);
		sql_type = SQL_SMALLINT;
	}

	void BoundDatum::bind_int32(const Local<Value>& p)
	{
		reserve_int32(1);
		_indvec[0] = SQL_NULL_DATA;
		auto& vec = *_storage->int32vec_ptr;
		vec[0] = SQL_NULL_DATA;
		if (!p->IsNullOrUndefined())
		{			
			const auto local = Nan::To<Int32>(p).FromMaybe(Nan::New<Int32>(0));	
			const auto d = local->Value();
			vec[0] = d;
			_indvec[0] = 0;
		}
	}

	void BoundDatum::bind_int32_array(const Local<Value>& p)
	{
		const auto arr = Local<Array>::Cast(p);
		const auto len = arr->Length();
		reserve_int32(len);
		auto& vec = *_storage->int32vec_ptr;

		for (unsigned int i = 0; i < len; ++i)
		{
			_indvec[i] = SQL_NULL_DATA;
			auto maybe_elem = Nan::Get(arr, i);
			if (!maybe_elem.IsEmpty()) {
				const auto local_elem = maybe_elem.ToLocalChecked();
				if (local_elem->IsNullOrUndefined()) continue;
				const auto local = Nan::To<Int32>(local_elem).FromMaybe(Nan::New<Int32>(0));
				vec[i] = local->Value();
				_indvec[i] = is_bcp ? sizeof(int32_t) : 0;
			}
		}
	}

	void BoundDatum::reserve_int32(const SQLLEN len)
	{
		constexpr auto size = sizeof(int32_t);
		buffer_len = len * static_cast<SQLLEN>(size);
		_storage->ReserveInt32(len);
		_indvec.resize(len);
		js_type = JS_INT;
		c_type = SQL_C_SLONG;
		sql_type = SQL_INTEGER;
		buffer = _storage->int32vec_ptr->data();
		param_size = size;
		digits = 0;
		if (is_bcp) {
			sql_type = SQLINT4;
			param_size = sizeof(DBINT);
		}
	}

	void BoundDatum::bind_uint32(const Local<Value>& p)
	{
		reserve_uint32(1);
		auto& vec = *_storage->uint32vec_ptr;
		_indvec[0] = SQL_NULL_DATA;
		if (!p->IsNullOrUndefined())
		{
			const auto local = Nan::To<Uint32>(p).FromMaybe(Nan::New<Uint32>(0));
			vec[0] = local->Value();
			_indvec[0] = 0;	
		}
	}

	void BoundDatum::bind_uint32_array(const Local<Value>& p)
	{
		const auto arr = Local<Array>::Cast(p);
		const auto len = arr->Length();
		reserve_uint32(len);
		auto& vec = *_storage->uint32vec_ptr;
		for (uint32_t i = 0; i < len; ++i)
		{
			_indvec[i] = SQL_NULL_DATA;
			auto maybe_elem = Nan::Get(arr, i);
			if (!maybe_elem.IsEmpty()) {
				const auto local_elem = maybe_elem.ToLocalChecked();
				if (local_elem->IsNullOrUndefined()) continue;
				const auto local = Nan::To<Uint32>(local_elem).FromMaybe(Nan::New<Uint32>(0));
				vec[i] = local->Value();
				_indvec[i] = 0;
			}
		}
	}

	void BoundDatum::reserve_uint32(const SQLLEN len)
	{
		constexpr auto size = sizeof(uint32_t);
		buffer_len = static_cast<SQLLEN>(len * size);
		_storage->ReserveUInt32(len);
		_indvec.resize(len);
		js_type = JS_UINT;
		c_type = SQL_C_ULONG;
		sql_type = SQL_BIGINT;
		buffer = _storage->uint32vec_ptr->data();
		param_size = size;
		digits = 0;
	}

	void BoundDatum::bind_date(const Local<Value>& p)
	{
		reserve_date(1);
		auto& vec = *_storage->datevec_ptr;
		// Since JS dates have no timezone context, all dates are assumed to be UTC
		_indvec[0] = SQL_NULL_DATA;
		if (!p->IsNullOrUndefined())
		{
				const auto d = Local<Date>::Cast<Value>(p);
				auto& dt = vec[0];
				const auto local = Nan::To<Number>(d).ToLocalChecked() ;
				const auto ms = local->Value() - offset * 60000;
				const TimestampColumn sql_date(-1, ms);
				sql_date.ToDateStruct(dt);
				_indvec[0] = sizeof(SQL_DATE_STRUCT);
		}
	}

	void BoundDatum::bind_date_array(const Local<Value>& p)
	{
		const auto arr = Local<Array>::Cast(p);
		const auto len = arr->Length();
		reserve_date(len);
		auto& vec = *_storage->datevec_ptr;
		for (uint32_t i = 0; i < len; ++i)
		{
			_indvec[i] = SQL_NULL_DATA;
			const auto elem = Nan::Get(arr, i).ToLocalChecked();
			if (!elem->IsNullOrUndefined())
			{
				const auto d = Local<Date>::Cast<Value>(elem);
				auto& dt = vec[i];
				const auto local = Nan::To<Number>(d).ToLocalChecked() ;
				const auto ms = local->Value() - offset * 60000;
				const TimestampColumn sql_date(-1, ms);
				sql_date.ToDateStruct(dt);
				_indvec[i] = sizeof(SQL_DATE_STRUCT);
			}
		}
	}

	void BoundDatum::reserve_date(SQLLEN len)
	{
		buffer_len = sizeof(SQL_DATE_STRUCT);
		_storage->ReserveDate(len);
		_indvec.resize(len);
		// Since JS dates have no timezone context, all dates are assumed to be UTC		
		js_type = JS_DATE;
		c_type = SQL_C_TYPE_DATE;
		// TODO: Determine proper SQL type based on version of server we're talking to
		sql_type = SQL_TYPE_DATE;
		buffer = _storage->datevec_ptr->data();
		// TODO: Determine proper precision and size based on version of server we're talking to
		if (param_size <= 0)
			param_size = sql_server_2008_default_datetime_precision;
		digits = sql_server_2008_default_datetime_scale;
		if (is_bcp) {
			param_size = sizeof(SQL_DATE_STRUCT);
			sql_type = SQLDATEN;
		}
	}

	void BoundDatum::bind_time_array(const Local<Value>& p)
	{
		const auto arr = Local<Array>::Cast(p);
		const auto len = arr->Length();
		reserve_time(len);
		auto& vec = *_storage->time2vec_ptr;
		for (uint32_t i = 0; i < len; ++i)
		{
			_indvec[i] = SQL_NULL_DATA;
			const auto elem = Nan::Get(arr, i).ToLocalChecked();
			if (!elem->IsNullOrUndefined())
			{
				//    rc = SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_SS_TIME2, 16, 7, &time2, 0, &cbtime2);  
				// dates in JS are stored internally as ms count from Jan 1, 1970
				const auto d = Local<Date>::Cast<Value>(elem);
				auto& time2 = vec[i];
				const auto local = Nan::To<Number>(d).ToLocalChecked() ;
				const auto ms = local->Value() - offset * 60000;
				const TimestampColumn sql_date(-1, ms);
				sql_date.ToTime2Struct(time2);
				sql_type = SQL_SS_TIME2;
				c_type = SQL_TIME;
				_indvec[i] = sizeof(SQL_SS_TIME2_STRUCT);
			}
		}
	}

	void BoundDatum::bind_time(const Local<Value>& p)
	{
		reserve_time(1);
		// Since JS dates have no timezone context, all dates are assumed to be UTC
		_indvec[0] = SQL_NULL_DATA;
		auto& vec = *_storage->time2vec_ptr;
		if (!p->IsNullOrUndefined())
		{
				const auto d = Local<Date>::Cast<Value>(p);
				auto& time2 = vec[0];
				const auto local = Nan::To<Number>(d).ToLocalChecked() ;
				const auto ms = local->Value() - offset * 60000;
				const TimestampColumn sql_date(-1, ms);
				sql_date.ToTime2Struct(time2);
				_indvec[0] = sizeof(SQL_SS_TIME2_STRUCT);
				param_size = sizeof(SQL_SS_TIME2_STRUCT);
		}
	}

	void BoundDatum::reserve_time(const SQLLEN len)
	{
		buffer_len = static_cast<SQLLEN>(len * sizeof(SQL_SS_TIME2_STRUCT));
		_storage->Reservetime2(len);
		_indvec.resize(len);
		// Since JS dates have no timezone context, all dates are assumed to be UTC		
		js_type = JS_DATE;
		c_type = SQL_C_BINARY;
		// TODO: Determine proper SQL type based on version of server we're talking to
		sql_type = SQL_SS_TIME2;
		buffer = _storage->time2vec_ptr->data();
		// TODO: Determine proper precision and size based on version of server we're talking to

		param_size = sql_server_2008_default_time_precision;
		if (digits <= 0) digits = sql_server_2008_default_datetime_scale;
		if (is_bcp) {
			sql_type = SQLTIMEN;
			param_size = sizeof(SQL_SS_TIME2_STRUCT);
		}
	}

	void BoundDatum::bind_time_stamp(const Local<Value>& p)
	{
		reserve_time_stamp(1);
		_indvec[0] = SQL_NULL_DATA;
		auto& vec = *_storage->timestampvec_ptr;
		if (!p->IsNullOrUndefined())
		{
			// dates in JS are stored internally as ms count from Jan 1, 1970
			const auto d = Local<Date>::Cast<Value>(p);
			auto& ts = vec[0];
			const auto local = Nan::To<Number>(d).ToLocalChecked() ;
			const auto ms = local->Value() - offset * 60000;
			const TimestampColumn sql_date(-1, ms);
			sql_date.to_timestamp_struct(ts);
			_indvec[0] = buffer_len;
		}
	}

	void BoundDatum::bind_time_stamp_array(const Local<Value>& p)
	{
		const auto arr = Local<Array>::Cast(p);
		const auto len = arr->Length();
		reserve_time_stamp(len);
		auto& vec = *_storage->timestampvec_ptr;
		for (uint32_t i = 0; i < len; ++i)
		{
			_indvec[i] = SQL_NULL_DATA;
			const auto elem = Nan::Get(arr, i).ToLocalChecked();
			if (!elem->IsNullOrUndefined())
			{
				// dates in JS are stored internally as ms count from Jan 1, 1970
				const auto d = Local<Date>::Cast<Value>(elem);
				auto& ts = vec[i];
				const auto local = Nan::To<Number>(d).ToLocalChecked() ;
				const auto ms = local->Value() - offset * 60000;
				const TimestampColumn sql_date(-1, ms);
				sql_date.to_timestamp_struct(ts);
				_indvec[i] = sizeof(SQL_TIMESTAMP_STRUCT);
			}
		}
	}

	void BoundDatum::reserve_time_stamp(const SQLLEN len)
	{
		buffer_len = static_cast<SQLLEN>(len) * static_cast<SQLLEN>(sizeof(SQL_TIMESTAMP_STRUCT));
		_storage->ReserveTimestamp(len);
		_indvec.resize(len);
		// Since JS dates have no timezone context, all dates are assumed to be UTC		
		js_type = JS_DATE;
		c_type = SQL_C_TIMESTAMP;
		// TODO: Determine proper SQL type based on version of server we're talking to
		sql_type = SQL_TYPE_TIMESTAMP;
		buffer = _storage->timestampvec_ptr->data();
		// TODO: Determine proper precision and size based on version of server we're talking to
		param_size = sql_server_2008_default_timestamp_precision;
		if (digits <= 0) digits = sql_server_2008_default_datetime_scale;
		if (is_bcp) {
			sql_type = SQLDATETIME2N;
			param_size = sizeof(SQL_TIMESTAMP_STRUCT);
		}
	}

	void BoundDatum::bind_time_stamp_offset(const Local<Value>& p)
	{
		reserve_time_stamp_offset(1);
		// Since JS dates have no timezone context, all dates are assumed to be UTC
		_indvec[0] = SQL_NULL_DATA;
		if (!p->IsNullOrUndefined())
		{
			const auto date_object = Local<Date>::Cast<Value>(p);
			assert(!date_object.IsEmpty());
			// dates in JS are stored internally as ms count from Jan 1, 1970
			const auto local = Nan::To<Number>(date_object).ToLocalChecked();
			auto& ts = (*_storage->timestampoffsetvec_ptr)[0];
			const TimestampColumn sql_date(-1, local->Value(), 0, offset);
			sql_date.to_timestamp_offset(ts);
			_indvec[0] = buffer_len;
		}
	}

	void BoundDatum::reserve_time_stamp_offset(SQLLEN len)
	{
		buffer_len = sizeof(SQL_SS_TIMESTAMPOFFSET_STRUCT);
		_storage->timestampoffsetvec_ptr = make_shared<vector<SQL_SS_TIMESTAMPOFFSET_STRUCT>>(len);
		_indvec.resize(len);
		// Since JS dates have no timezone context, all dates are assumed to be UTC		
		js_type = JS_DATE;
		c_type = SQL_C_BINARY;
		// TODO: Determine proper SQL type based on version of server we're talking to
		sql_type = SQL_SS_TIMESTAMPOFFSET;
		buffer = _storage->timestampoffsetvec_ptr->data();
		// TODO: Determine proper precision and size based on version of server we're talking to
		param_size = sql_server_2008_default_datetime_precision;
		if (digits <= 0) digits = sql_server_2008_default_datetime_scale;
		if (is_bcp) {
			sql_type = SQLDATETIMEOFFSETN;
			param_size = sizeof(SQL_SS_TIMESTAMPOFFSET_STRUCT);
		}
	}

	void BoundDatum::bind_time_stamp_offset_array(const Local<Value>& p)
	{
		const auto arr = Local<Array>::Cast(p);
		const auto len = arr->Length();
		reserve_time_stamp_offset(len);
		auto& vec = *_storage->timestampoffsetvec_ptr;
		buffer_len = sizeof(SQL_SS_TIMESTAMPOFFSET_STRUCT);
		for (uint32_t i = 0; i < len; ++i)
		{
			_indvec[i] = SQL_NULL_DATA;
			const auto elem = Nan::Get(arr, i).ToLocalChecked();
			if (!elem->IsNullOrUndefined())
			{
				_indvec[i] = sizeof(SQL_SS_TIMESTAMPOFFSET_STRUCT);
				const auto d = Local<Date>::Cast<Value>(elem);
				auto& ts = vec[i];
				const auto local = Nan::To<Number>(d).ToLocalChecked();
				TimestampColumn sql_date(-1, local->Value(), 0, offset);
				sql_date.to_timestamp_offset(ts);
			}
		}
	}

	void BoundDatum::bind_integer(const Local<Value>& p)
	{
		reserve_integer(1);
		auto& vec = *_storage->int64vec_ptr;
		_indvec[0] = SQL_NULL_DATA;
		if (!p->IsNullOrUndefined())
		{
			const auto local = Nan::To<Number>(p).ToLocalChecked();
			vec[0] = static_cast<long long>(local->Value());
			_indvec[0] = 0;
		}
	}

	void BoundDatum::reserve_big_integer(const SQLLEN len)
	{
		constexpr auto size = sizeof(DatumStorage::bigint_t);
		_storage->ReserveBigInt(len);
		_indvec.resize(len);
		js_type = JS_NUMBER;
		c_type = SQL_C_SBIGINT;
		sql_type = SQL_BIGINT;
		buffer = _storage->bigint_vec_ptr->data();
		buffer_len = static_cast<SQLLEN>(size) * len;
		param_size = size;
		digits = 0;
		if (is_bcp) {
			sql_type = SQLINT8;
			param_size = sizeof(int64_t);
		}
	}

	void BoundDatum::reserve_integer(const SQLLEN len)
	{
		constexpr auto size = sizeof(int64_t);
		_storage->ReserveInt64(len);
		_indvec.resize(len);
		js_type = JS_NUMBER;
		c_type = SQL_C_SBIGINT;
		sql_type = SQL_BIGINT;
		buffer = _storage->int64vec_ptr->data();
		buffer_len = static_cast<SQLLEN>(size) * len;
		param_size = size;
		digits = 0;
		if (is_bcp) {
			sql_type = SQLINT8;
			param_size = sizeof(int64_t);
		}
	}

	void BoundDatum::bind_integer_array(const Local<Value>& p)
	{
		const auto arr = Local<Array>::Cast(p);
		const auto len = arr->Length();
		reserve_integer(len);
		auto& vec = *_storage->int64vec_ptr;
		for (uint32_t i = 0; i < len; ++i)
		{
			_indvec[i] = SQL_NULL_DATA;
			const auto elem = Nan::Get(arr, i).ToLocalChecked();
			if (!elem->IsNullOrUndefined())
			{
				_indvec[i] = 0;
				const auto v = Nan::To<int64_t>(elem).ToChecked();
				vec[i] = v;
			}
		}
	}

	void BoundDatum::bind_float(const Local<Value>& p)
	{
		bind_double(p);
		sql_type = SQL_FLOAT;
	}

	void BoundDatum::bind_real(const Local<Value>& p)
	{
		bind_double(p);
		sql_type = SQL_REAL;
	}

	void BoundDatum::bind_double(const Local<Value>& p)
	{
		reserve_double(1);
		auto& vec = *_storage->doublevec_ptr;
		_indvec[0] = SQL_NULL_DATA;
		if (!p->IsNullOrUndefined())
		{
			const auto v = Nan::To<double>(p).ToChecked();
			vec[0] = v;
			_indvec[0] = 0;	
		}
	}

	void BoundDatum::reserve_double(const SQLLEN len)
	{
		constexpr auto size = sizeof(double);
		_storage->ReserveDouble(len);
		_indvec.resize(len);
		js_type = JS_NUMBER;
		c_type = SQL_C_DOUBLE;
		sql_type = SQL_DOUBLE;
		buffer = _storage->doublevec_ptr->data();
		buffer_len = static_cast<SQLLEN>(size) * len;
		param_size = size;
		digits = 0;
		if (is_bcp) {
			sql_type = SQLFLT8;
			param_size = sizeof(double);
		}
	}

	void BoundDatum::bind_double_array(const Local<Value>& p)
	{
		const auto arr = Local<Array>::Cast(p);
		const auto len = arr->Length();
		reserve_double(len);
		auto& vec = *_storage->doublevec_ptr;
		for (uint32_t i = 0; i < len; ++i)
		{
			_indvec[i] = SQL_NULL_DATA;
			auto maybe = Nan::Get(arr, i);
			if (maybe.IsEmpty()) continue;
			const auto local_elem = maybe.ToLocalChecked();
			if (local_elem->IsNullOrUndefined()) continue;
			const auto v = Nan::To<double>(local_elem).ToChecked();
			vec[i] = v;
			if (is_bcp) {
				_indvec[i] = sizeof(double);
			} else {
				_indvec[i] = 0;
			}
		}
	}

	void BoundDatum::bind_number(const Local<Value>& p)
	{
		// numbers can be either integers or doubles.  We attempt to determine which it is through a simple
		// cast and equality check
		const nodeTypeFactory fact;
		const auto context = fact.isolate->GetCurrentContext();
		const auto maybe = p->ToNumber(context);
		Local<Number> local;
		if (maybe.ToLocal(&local)) {
			const auto d = static_cast<long double>(local->Value());
			if (d == floor(d) &&
				d >= static_cast<long double>(numeric_limits<int64_t>::min()) &&
				d <= static_cast<long double>(numeric_limits<int64_t>::max()))
			{
				bind_integer(p);
			}
			else
			{
				bind_double(p);
			}
		}
	}

	void BoundDatum::bind_number_array(const Local<Value>& pp)
	{
		const nodeTypeFactory fact;
		const auto context = fact.isolate->GetCurrentContext();
		const auto arr = Local<Array>::Cast(pp);
		const auto maybe_elem = arr->Get(context, 0);
		Local<Value> p;
		if (maybe_elem.ToLocal(&p)) {
			const auto maybe = p->ToNumber(context);
			Local<Number> local;
			if (maybe.ToLocal(&local)) {
				const auto d = static_cast<long double>(local->Value());
				if (d == floor(d) &&
					d >= static_cast<long double>(numeric_limits<int64_t>::min()) &&
					d <= static_cast<long double>(numeric_limits<int64_t>::max()))
				{
					bind_integer_array(pp);
				}
				else
				{
					bind_double_array(pp);
				}
			}
		}
	}

	bool BoundDatum::bind(const Local<Object> o, const char* if_str, const uint16_t type)
	{
		auto val = Nan::Get(o, Nan::New(if_str).ToLocalChecked()).ToLocalChecked();
		if (!val->IsUndefined())
		{
			param_type = type;
			return bind_datum_type(val);
		}
		return false;
	}

	bool is_numeric(const wstring& v)
	{
		const auto res = v == L"numeric"
			|| v == L"decimal"
			|| v == L"smallmoney"
			|| v == L"money"
			|| v == L"float"
			|| v == L"real";
		return res;
	}

	bool is_int(const wstring& v)
	{
		const auto res = v == L"smallint"
			|| v == L"int"
			|| v == L"bigint"
			|| v == L"tinyint";
		return res;
	}

	bool is_string(const wstring& v)
	{
		const auto res = v == L"char"
			|| v == L"text"
			|| v == L"varchar";
		return res;
	}

	bool is_binary(const wstring& v)
	{
		const auto res = v == L"binary";
		return res;
	}

	bool is_bit(const wstring& v)
	{
		const auto res = v == L"bit";
		return res;
	}

	bool is_date(const wstring& v)
	{
		const auto res = v == L"date"
			|| v == L"datetimeoffset"
			|| v == L"datetime2"
			|| v == L"smalldatetime"
			|| v == L"datetime"
			|| v == L"time";
		return res;
	}


	bool sql_type_s_maps_to_numeric(const Local<Value> p)
	{
		const auto str = get_as_string(p, "type_id");
		const auto v = FromV8String(str);
		const auto res = is_numeric(v);
		return res;
	}

	bool sql_type_s_maps_to_u_int32(const Local<Value> p)
	{
		const auto str = get_as_string(p, "type_id");
		const auto v = FromV8String(str);
		const auto res = v == L"sbigint";
		return res;
	}

	bool sql_type_s_maps_to_int32(const Local<Value> p)
	{
		const auto str = get_as_string(p, "type_id");
		const auto v = FromV8String(str);
		const auto res = is_int(v);
		return res;
	}

	bool sql_type_s_maps_to_string(const Local<Value> p)
	{
		const auto str = get_as_string(p, "type_id");
		const auto v = FromV8String(str);
		const auto res = is_string(v);
		return res;
	}

	bool sql_type_s_maps_to_boolean(const Local<Value> p)
	{
		const auto str = get_as_string(p, "type_id");
		const auto v = FromV8String(str);
		const auto res = is_bit(v);
		return res;
	}

	bool sql_type_s_maps_to_date(const Local<Value> p)
	{
		const auto str = get_as_string(p, "type_id");
		const auto v = FromV8String(str);
		const auto res = is_date(v);
		return res;
	}

	bool BoundDatum::bind_datum_type(Local<Value>& p)
	{
		const nodeTypeFactory fact;
		const auto context = fact.isolate->GetCurrentContext();
		if (p->IsNull())
		{
			bind_null(p);
		}
		else if (p->IsString())
		{
			bind_w_var_char(p);
		}
		else if (p->IsBoolean())
		{
			bind_boolean(p);
		}
		else if (p->IsInt32())
		{
			bind_int32(p);
		}
		else if (p->IsUint32())
		{
			bind_uint32(p);
		}
		else if (p->IsNumber())
		{
			const auto maybe = p->ToNumber(context);
			Local<Number> local;
			if (maybe.ToLocal(&local)) {
				const auto d = local->Value();
				if (isnan(d) || !isfinite(d))
				{
					err = const_cast<char*>("Invalid number parameter");
					return false;
				}
				bind_number(p);
			}
		}
		else if (p->IsDate())
		{
			bind_time_stamp_offset(p);
		}
		else if (p->IsObject() && node::Buffer::HasInstance(p))
		{
			bind_var_binary(p);
		}
		else if (sql_type_s_maps_to_tvp(p))
		{
			bind_tvp(p);
		}
		else
		{
			err = const_cast<char*>("Invalid parameter type");
			return false;
		}

		return true;
	}

	Local<Value> reserve_output_param(const Local<Value> p, const int size)
	{
		Local<Value> pval;
		const nodeTypeFactory fact;

		if (sql_type_s_maps_to_int32(p) || sql_type_s_maps_to_boolean(p))
		{
			pval = fact.new_int32(0);
		}
		else if (sql_type_s_maps_to_u_int32(p))
		{
			pval = Nan::New<Integer>(0);
		}
		else if (sql_type_s_maps_to_numeric(p))
		{
			pval = Nan::New(0.0);
		}
		else if (sql_type_s_maps_to_date(p))
		{
			pval = fact.new_date();
		}
		else if (sql_type_s_maps_to_string(p))
		{
			vector<char> b;
			b.resize(static_cast<size_t>(size) + 1);
			pval = fact.new_string(b.data(), size + 1);
		}
		else
		{
			pval = fact.new_buffer(size);
		}
		return pval;
	}

	inline Local<Value> get(const char * key,Local<Object> local_object ) {
		return Nan::Get(local_object, Nan::New(key).ToLocalChecked()).ToLocalChecked();
	}

	bool BoundDatum::proc_bind(Local<Value>& p, Local<Value>& v)
	{
		const auto context = Nan::GetCurrentContext();
		const auto maybe_is_output = v->ToInteger(context);
		Local<Integer> is_output;
		if (!maybe_is_output.ToLocal(&is_output))
		{
			return false;
		}

		Local<Value> pval;
		const auto maybe_object = p->ToObject(context);
		Local<Object> local_object;
		if (!maybe_object.ToLocal(&local_object))
		{
			return false;
		}
		const auto maybe_size = get("max_length", local_object)->Int32Value(context);
		auto size = 0;
		if (!maybe_size.To(&size))
		{
			return false;
		}

		Local<Object> as_object;
		if (p->ToObject(context).ToLocal(&as_object))
		{
			pval = get("val", as_object);
		} else {
			pval = Nan::Null();
		}
		
		auto is_output_i = 0;
		if (!is_output->Int32Value(context).To(&is_output_i))
		{
			return false;
		}
		if (is_output_i != 0)
		{
			if (pval->IsNull()) {
				param_type = SQL_PARAM_OUTPUT;
				pval = reserve_output_param(p, size);
			} else {
				param_type = SQL_PARAM_INPUT_OUTPUT;
			}	
		}
		else
		{
			param_type = SQL_PARAM_INPUT;
		}

		return bind_datum_type(pval);
	}

	void BoundDatum::assign_precision(Local<Object>& pv)
	{
		const auto context = Nan::GetCurrentContext();
		const auto precision = get("precision", pv);
		if (!precision->IsUndefined())
		{
			const auto maybe_param_size = precision->Int32Value(context);
			param_size = maybe_param_size.FromMaybe(0);
		}

		const auto bcp = get("bcp", pv);
		if (!bcp->IsUndefined())
		{
			 is_bcp = Nan::To<bool>(bcp).ToChecked();
			 if (is_bcp) {
				bcp_version = MutateJS::getint32(pv, "bcp_version");
				const auto table_name_str = get_as_string(pv, "table_name");
				if (!table_name_str->IsNullOrUndefined())
				{
					_storage->table = wide_from_js_string(table_name_str);
				}
				const auto position = get("ordinal_position", pv);
				if (!position->IsUndefined())
				{
					const auto maybe_offset = position->Int32Value(context);
					ordinal_position = static_cast<uint32_t>(maybe_offset.FromMaybe(0));
				}		
			 }
		}

		const auto scale = get("scale", pv);
		if (!scale->IsUndefined())
		{
			const auto maybe_digits = scale->Int32Value(context);
			digits = static_cast<SQLSMALLINT>(maybe_digits.FromMaybe(0));
		}

		const auto off = get("offset", pv);
		if (!off->IsUndefined())
		{
			const auto maybe_offset = off->Int32Value(context);
			offset = static_cast<int32_t>(maybe_offset.FromMaybe(0));
		}
	}

	void BoundDatum::sql_longvarbinary(Local<Value> pp)
	{
		if (pp->IsArray())
		{
			bind_var_binary_array(pp);
		}
		else
		{
			bind_long_var_binary(pp);
		}
	}

	void BoundDatum::sql_integer(const Local<Value> pp)
	{
		if (pp->IsArray())
		{
			bind_int32_array(pp);
		}
		else
		{
			bind_int32(pp);
		}
	}

	void BoundDatum::sql_wvarchar(const Local<Value> pp)
	{
		if (pp->IsArray())
		{
			bind_w_var_char_array(pp);
		}
		else
		{
			bind_w_var_char(pp);
		}
	}

	void BoundDatum::sql_wlongvarchar(const Local<Value> pp)
	{
		if (pp->IsArray())
		{
			bind_w_var_char_array(pp);
		}
		else
		{
			bind_w_long_var_char(pp);
		}
	}

	void BoundDatum::sql_bit(const Local<Value> pp)
	{
		if (pp->IsArray())
		{
			bind_boolean_array(pp);
		}
		else
		{
			bind_boolean(pp);
		}
	}

	void BoundDatum::sql_bigint(const Local<Value> pp)
	{
		if (pp->IsArray())
		{
			bind_integer_array(pp);
		}
		else
		{
			bind_integer(pp);
		}
	}

	void BoundDatum::sql_double(const Local<Value> pp)
	{
		if (pp->IsArray())
		{
			bind_double_array(pp);
		}
		else
		{
			bind_double(pp);
		}
	}

	void BoundDatum::sql_float(const Local<Value> pp)
	{
		if (pp->IsArray())
		{
			bind_double_array(pp);
			if (!is_bcp) {
				sql_type = SQL_FLOAT;
			}
		}
		else
		{
			bind_float(pp);
		}
	}

	void BoundDatum::sql_real(const Local<Value> pp)
	{
		if (pp->IsArray())
		{
			bind_double_array(pp);
			if (!is_bcp) {
				sql_type = SQL_REAL;
			}
		}
		else
		{
			bind_real(pp);
		}
	}

	void BoundDatum::sql_tinyint(const Local<Value> pp)
	{
		if (pp->IsArray())
		{
			bind_int32_array(pp);
			if (!is_bcp) {
				sql_type = SQL_TINYINT;
			}
		}
		else
		{
			bind_tiny_int(pp);
		}
	}

	void BoundDatum::sql_smallint(const Local<Value> pp)
	{
		if (pp->IsArray())
		{
			bind_int32_array(pp);
			if (!is_bcp) {
				sql_type = SQL_SMALLINT;
			}
		}
		else
		{
			bind_small_int(pp);
		}
	}

	void BoundDatum::sql_numeric(const Local<Value> pp)
	{
		if (pp->IsArray())
		{
			if (is_bcp) {
				bind_numeric_array(pp);
			} else {
				bind_double_array(pp);
			}
		}
		else
		{
			bind_numeric(pp);
		}
	}

	void BoundDatum::sql_char(const Local<Value> pp)
	{
		if (pp->IsArray())
		{
			bind_w_var_char_array(pp);
		}
		else
		{
			bind_char(pp);
		}
	}

	void BoundDatum::sql_varchar(const Local<Value> pp)
	{
		if (pp->IsArray())
		{
			if (is_bcp) {
				bind_var_char_array(pp);
			} else {
				bind_w_var_char_array(pp);
			}
		}
		else
		{
			bind_w_var_char(pp);
		}
	}

	void BoundDatum::sql_ss_time2(const Local<Value> pp)
	{
		if (pp->IsArray())
		{
			// bind_time_array(pp);
			bind_time_stamp_offset_array(pp);
		}
		else
		{
			bind_time(pp);
		}
	}

	void BoundDatum::sql_type_date(const Local<Value> pp)
	{
		if (pp->IsArray())
		{
			bind_date_array(pp);
		}
		else
		{
			bind_date(pp);
		}
	}

	void BoundDatum::sql_type_timestamp(const Local<Value> pp)
	{
		if (pp->IsArray())
		{
			bind_time_stamp_array(pp);
		}
		else
		{
			bind_time_stamp(pp);
		}
	}

	void BoundDatum::sql_ss_timestampoffset(const Local<Value> pp)
	{
		if (pp->IsArray())
		{
			bind_time_stamp_offset_array(pp);
		}
		else
		{
			bind_time_stamp_offset(pp);
		}
	}

	void BoundDatum::sql_varbinary(Local<Value> pp)
	{
		if (pp->IsArray())
		{
			bind_var_binary_array(pp);
		}
		else
		{
			if (pp->IsNull()
				|| (pp->IsObject() && node::Buffer::HasInstance(pp)))
			{
				bind_var_binary(pp);
			}
			else
			{
				err = const_cast<char*>("Invalid parameter type");
			}
		}
	}

	bool BoundDatum::user_bind(Local<Value>& p, Local<Value>& v)
	{
		const nodeTypeFactory fact;
		const auto context = fact.isolate->GetCurrentContext();
		const auto maybe_sql_type = v->Int32Value(fact.isolate->GetCurrentContext());
		const auto local_sql_type = maybe_sql_type.FromMaybe(0);
		if (local_sql_type == 0) return false;
		sql_type = static_cast<SQLSMALLINT>(local_sql_type);
		param_type = SQL_PARAM_INPUT;

		const auto maybe_local = p->ToObject(context);
		Local<Object> as_local;
		if (!maybe_local.ToLocal(&as_local))
		{
			return false;
		}

		const auto pp = get("value", as_local);

		assign_precision(as_local);

		switch (sql_type)
		{
		case SQL_LONGVARBINARY:
			sql_longvarbinary(pp);
			break;

		case SQL_VARBINARY:
		{
			sql_varbinary(pp);
			if (err) return false;
		}
		break;

		case SQL_INTEGER:
			sql_integer(pp);
			break;

		case SQL_VARCHAR:
			sql_varchar(pp);
			break;

		case SQL_WVARCHAR:
			sql_wvarchar(pp);
			break;

		case SQL_WLONGVARCHAR:
			sql_wlongvarchar(pp);
			break;

		case SQL_BIT:
			sql_bit(pp);
			break;

		case SQL_BIGINT:
			sql_bigint(pp);
			break;

		case SQL_DOUBLE:
			sql_double(pp);
			break;

		case SQL_FLOAT:
			sql_float(pp);
			break;

		case SQL_REAL:
			sql_real(pp);
			break;

		case SQL_TINYINT:
			sql_tinyint(pp);
			break;

		case SQL_SMALLINT:
			sql_smallint(pp);
			break;

		case SQL_NUMERIC:
			sql_numeric(pp);
			break;

		case SQL_CHAR:
			sql_char(pp);
			break;

		case SQL_SS_TIME2:
			sql_ss_time2(pp);
			break;

		case SQL_TYPE_DATE:
			sql_type_date(pp);
			break;

		case SQL_TYPE_TIMESTAMP:
			sql_type_timestamp(pp);
			break;

		case SQL_SS_TIMESTAMPOFFSET:
			sql_ss_timestampoffset(pp);
			break;

		case SQL_UNKNOWN_TYPE:
		default:
			return false;
		}

		return true;
	}

	bool BoundDatum::bind_object(Local<Value>& p)
	{
		// fprintf(stderr, "bind obj\n");
		const nodeTypeFactory fact;
		const auto context = fact.isolate->GetCurrentContext();
		const auto maybe_object = p->ToObject(context);
		Local<Object> po;
		if (!maybe_object.ToLocal(&po))
		{
			return false;
		}

		auto v = get("is_output", po);
		if (!v->IsUndefined())
		{
			return proc_bind(p, v);
		}

		v = get("sql_type", po);
		if (!v->IsUndefined())
		{
			return user_bind(p, v);
		}

		const auto n = get_as_string(p, "name");
		if (!n->IsUndefined())
		{
			name = wide_from_js_string(n);
			auto pp = get("value", po);
			return bind_datum_type(pp);
		}
		
		return false;
	}

	bool BoundDatum::bind_array(Local<Value>& pp)
	{
		const auto arr = Local<Array>::Cast(pp);
		nodeTypeCounter counts;

		for (uint32_t i = 0; i < arr->Length(); ++i)
		{
			auto p = Nan::Get(arr, i);
			const auto l = p.ToLocalChecked();
			counts.Decode(l);
		}

		if (counts.boolCount != 0)
		{
			bind_boolean_array(pp);
		}
		else if (counts.stringCount != 0)
		{
			bind_w_var_char_array(pp);
		}
		else if (counts.dateCount != 0)
		{
			bind_time_stamp_offset_array(pp);
		}
		else if (counts.bufferCount != 0)
		{
			bind_var_binary_array(pp);
		}
		else if (counts.getoutBoundsCount() > 0)
		{
			err = const_cast<char*>("Invalid number parameter");
			return false;
		}
		else if (counts.numberCount > 0 || (counts.int64Count > 0 && counts.int32Count > 0))
		{
			bind_double_array(pp);
		}
		else if (counts.int64Count > 0)
		{
			bind_integer_array(pp);
		}
		else if (counts.int32Count != 0)
		{
			bind_int32_array(pp);
		}
		else if (counts.uint32Count != 0)
		{
			bind_uint32_array(pp);
		}
		else if (counts.nullCount == static_cast<int>(arr->Length()))
		{
			bind_null_array(pp);
		}
		else
		{
			err = const_cast<char*>("Invalid parameter type");
			return false;
		}

		return true;
	}

	Local<Value> BoundDatum::unbind_null()
	{
		const nodeTypeFactory fact;
		return fact.null();
	}

	Local<Value> BoundDatum::unbind_string() const
	{
		const auto s = Nan::New<String>(_storage->uint16vec_ptr->data()).ToLocalChecked();
		return s;
	}

	Local<Value> BoundDatum::unbind_double() const
	{
		const auto& vec = *_storage->doublevec_ptr;
		const auto s = Nan::New(vec[0]);
		return s;
	}

	Local<Value> BoundDatum::unbind_boolean() const
	{
		const auto& vec = *_storage->uint16vec_ptr;
		const auto s = Nan::New<Boolean>(vec[0] != 0);
		return s;
	}

	Local<Value> BoundDatum::unbind_int32() const
	{		
		const auto& vec = *_storage->int32vec_ptr;
		const auto s = Nan::New<Int32>(vec[0]);
		return s;
	}

	Local<Value> BoundDatum::unbind_uint32() const
	{	
		const auto& vec = *_storage->uint32vec_ptr;
		const auto s = Nan::New<Integer>(vec[0]);
		return s;
	}

	Local<Value> BoundDatum::unbind_number() const
	{
		Local<Value> v;
		if (sql_type == SQL_C_DOUBLE)
		{
			v = unbind_double();
		}
		else
		{
			const nodeTypeFactory fact;
			const auto& vec = *_storage->int64vec_ptr;
			v = fact.new_int64(vec[0]);
		}
		return v;
	}

	Local<Value> BoundDatum::unbind_date() const
	{
		const auto& vec = *_storage->timestampoffsetvec_ptr;
		TimestampColumn tsc(-1, vec[0]);
		return tsc.ToValue();
	}

	size_t BoundDatum::get_default_size(size_t len) {
		if (len != 0) return len;
		const uint32_t defaultSize = _params->max_prepared_column_size();
		len = defaultSize > 0 ? defaultSize : 8 * 1024;
		return len;
	}

	void BoundDatum::reserve_column_type(const SQLSMALLINT type,  size_t& len, const size_t row_count)
	{
		switch (type)
		{
		case SQL_SS_VARIANT:
			len = max(len, get_default_size(len));
			reserve_w_var_char_array(len, row_count);
			break;

		case SQL_CHAR:
		case SQL_VARCHAR:
		case SQL_LONGVARCHAR:
		case SQL_WCHAR:
		case SQL_WVARCHAR:
		case SQL_WLONGVARCHAR:
		case SQL_SS_XML:
		case SQL_GUID:
			len = max(len, get_default_size(len));
			reserve_w_var_char_array(len + 1, row_count);
			break;

		case SQL_BIT:
			reserve_boolean(static_cast<SQLLEN>(row_count));
			break;

		case SQL_SMALLINT:
		case SQL_TINYINT:
		case SQL_INTEGER:
		case SQL_C_SLONG:
		case SQL_C_SSHORT:
		case SQL_C_STINYINT:
		case SQL_C_ULONG:
		case SQL_C_USHORT:
		case SQL_C_UTINYINT:
			reserve_integer(static_cast<SQLLEN>(row_count));
			break;

		case SQL_BIGINT:
			reserve_big_integer(static_cast<SQLLEN>(row_count));
			break;

		case SQL_DECIMAL:
		case SQL_NUMERIC:
		case SQL_REAL:
		case SQL_FLOAT:
		case SQL_DOUBLE:
			reserve_double(static_cast<SQLLEN>(row_count));
			break;

		case SQL_BINARY:
		case SQL_VARBINARY:
		case SQL_LONGVARBINARY:
		case SQL_SS_UDT:
			len = max(len, get_default_size(len));
			reserve_var_binary_array(len, row_count);
			break;

		case SQL_SS_TIMESTAMPOFFSET:
			reserve_time_stamp_offset(static_cast<SQLLEN>(row_count));
			break;

		case SQL_TYPE_TIME:
		case SQL_SS_TIME2:
			reserve_time(static_cast<SQLLEN>(row_count));
			break;

		case SQL_TIMESTAMP:
		case SQL_DATETIME:
		case SQL_TYPE_TIMESTAMP:
		case SQL_TYPE_DATE:
			reserve_time_stamp(static_cast<SQLLEN>(row_count));
			break;

		default:
			len = max(len, get_default_size(len));
			reserve_w_var_char_array(len, row_count);
			break;
		}
	}

	Local<Value> BoundDatum::unbind() const
	{
		Local<Value> v;

		switch (js_type)
		{
		case JS_STRING:
			v = unbind_string();
			break;

		case JS_BOOLEAN:
			v = unbind_boolean();
			break;

		case JS_INT:
			v = unbind_int32();
			break;

		case JS_UINT:
			v = unbind_uint32();
			break;

		case JS_DATE:
			v = unbind_double();
			break;

		case JS_NUMBER:
			v = unbind_number();
			break;

		default:
			v = unbind_null();
			break;
		}

		return v;
	}
}
#pragma once
// undo these tokens to use numeric_limits below

#include "stdafx.h"
#include <BoundDatumHelper.h>

namespace mssql
{
	using namespace std;
	class QueryOperationParams;

	class BoundDatum {
	public:
		bool bind(Local<Value> &p);
		void reserve_column_type(SQLSMALLINT type, size_t& len, const size_t row_count);

		bool get_defined_precision() const {
			return definedPrecision;
		}

		bool get_defined_scale() const {
			return definedScale;
		}

		Local<Value> unbind() const;
		
		vector<SQLLEN> & get_ind_vec()  { return _indvec; }
		
		char *getErr() const { return err; }

		shared_ptr<DatumStorage> get_storage() { return _storage; }

		BoundDatum() :
			js_type(JS_UNKNOWN),
			c_type(0),
			sql_type(0),
			param_size(0),
			digits(0),
			buffer(nullptr),
			buffer_len(0),
			param_type(SQL_PARAM_INPUT),
			offset(0),
			is_bcp(false),
			ordinal_position(0),
			bcp_terminator_len(0),
			bcp_terminator(NULL),
			is_tvp(false),
			tvp_no_cols(0),
			definedPrecision(false),
			definedScale(false),
			err(nullptr)
		{
			_indvec = vector<SQLLEN>(1);
			_storage = make_shared<DatumStorage>();
			_params = nullptr;
		}

		BoundDatum(shared_ptr<QueryOperationParams> params) : BoundDatum()
		{
			_params = params;
		}

		enum JS_TYPE {

			JS_UNKNOWN,
			JS_NULL,
			JS_STRING,
			JS_BOOLEAN,
			JS_INT,
			JS_UINT,
			JS_NUMBER,
			JS_DATE,
			JS_BUFFER
		};

		JS_TYPE js_type;
		SQLSMALLINT c_type;
		SQLSMALLINT sql_type;
		SQLULEN param_size;
		SQLSMALLINT digits;
		SQLPOINTER buffer;
		SQLLEN buffer_len;
		uint16_t param_type;
		int32_t offset;
		bool is_bcp;
		int32_t bcp_version;
		uint32_t ordinal_position;
		SQLULEN bcp_terminator_len;
		LPCBYTE bcp_terminator;

		bool is_tvp;
		int tvp_no_cols;
		wstring name;


	private:
	
		vector<SQLLEN> _indvec;
		shared_ptr<DatumStorage> _storage;
		shared_ptr<QueryOperationParams> _params;
		bool definedPrecision;
		bool definedScale;

		char * err;
	
		void bind_null(const Local<Value> & p);
		void bind_null_array(const Local<Value> & p);
		void reserve_null(SQLLEN len);

		void bind_long_var_binary(Local<Value> & p);

		void bind_w_long_var_char(const Local<Value> & p);
		void bind_w_var_char(const Local<Value> & p);
		void bind_w_var_char(const Local<Value>& p, int precision);
		void reserve_w_var_char_array(size_t max_str_len, size_t  array_len);
		void bind_w_var_char_array(const Local<Value> & p);
		void bind_w_var_char_array_bcp(const Local<Value> & p);

		void bind_boolean(const Local<Value> & p);
		void reserve_boolean(SQLLEN len);
		void bind_boolean_array(const Local<Value> & p);

		void bind_small_int(const Local<Value> & p);
		void bind_tiny_int(const Local<Value> & p);

		void bind_numeric(const Local<Value> & p);
		void bind_numeric_array(const Local<Value> & p);
		void reserve_numeric(SQLLEN len);

		void bind_int32(const Local<Value> & p);
		void reserve_int32(SQLLEN len);
		void bind_int32_array(const Local<Value> & p);

		void bind_uint32(const Local<Value> & p);
		void reserve_uint32(SQLLEN len);
		void bind_uint32_array(const Local<Value> & p);

		void bind_integer(const Local<Value>& p);
		void reserve_integer(SQLLEN len);
		void bind_integer_array(const Local<Value> & p);

		void reserve_big_integer(SQLLEN len);
	
		void bind_float(const Local<Value> & p);
		void bind_real(const Local<Value> & p);

		void bind_double(const Local<Value>& p);
		void reserve_double(SQLLEN len);
		void bind_double_array(const Local<Value> & p);

		void bind_time(const Local<Value> & p);
		void bind_time_array(const Local<Value> & p);
		void reserve_time(SQLLEN len);

		void bind_date(const Local<Value> & p);
		void bind_date_array(const Local<Value> & p);
		void reserve_date(SQLLEN len);

		void bind_time_stamp(const Local<Value> & p);
		void bind_time_stamp_array(const Local<Value> & p);
		void reserve_time_stamp(SQLLEN len);

		void bind_time_stamp_offset(const Local<Value> & p);
		void reserve_time_stamp_offset(SQLLEN len);
		void bind_time_stamp_offset_array(const Local<Value> & p);

		void bind_number(const Local<Value> & p);
		void bind_number_array(const Local<Value> & p);

		void bind_tvp(Local<Value> & p);

		void bind_var_binary( Local<Value> & p);
		void bind_var_binary_array(const Local<Value> & p);
		void bind_var_binary_array_bcp(const Local<Value> & p);
		void reserve_var_binary_array(size_t max_obj_len, size_t  array_len);

		bool bind_datum_type(Local<Value>& p);
		bool bind(Local<Object> o, const char* if_str, uint16_t type);
		bool bind_object(Local<Value> &p);
		bool bind_array(Local<Value> &pp);

		bool proc_bind(Local<Value> &p, Local<Value> &v);
		void bind_char(const Local<Value> & pp);
		void bind_var_char(const Local<Value> & p);
		void bind_var_char_array_bcp(const Local<Value>& p);
		void bind_var_char_array(const Local<Value>& p);
		void bind_var_char(const Local<Value> & p, int precision);
		void reserve_var_char(size_t precision, size_t  array_len);
		bool user_bind(Local<Value> &p, Local<Value> &v);
		void assign_precision(Local<Object> &pv);

		void sql_longvarbinary(Local<Value> pp);
		void sql_integer(Local<Value> pp);
		void sql_wvarchar(Local<Value> pp);
		void sql_wlongvarchar(Local<Value> pp);
		void sql_bit(Local<Value> pp);
		void sql_bigint(Local<Value> pp);
		void sql_double(Local<Value> pp);
		void sql_float(Local<Value> pp);
		void sql_real(Local<Value> pp);
		void sql_tinyint(Local<Value> pp);
		void sql_smallint(Local<Value> pp);
		void sql_numeric(Local<Value> pp);
		void sql_char(Local<Value> pp);
		void sql_varchar(Local<Value> pp);
		void sql_ss_time2(Local<Value> pp);
		void sql_type_date(Local<Value> pp);
		void sql_type_timestamp(Local<Value> pp);
		void sql_ss_timestampoffset(Local<Value> pp);
		void sql_varbinary(Local<Value> pp);
		size_t get_default_size(size_t len);

		static Local<Value> unbind_null();
		Local<Value> unbind_string() const;
		Local<Value> unbind_double() const;
		Local<Value> unbind_boolean() const;
		Local<Value> unbind_int32() const;
		Local<Value> unbind_uint32() const;
		Local<Value> unbind_number() const;
		Local<Value> unbind_date() const;
	};
}
#pragma once
// undo these tokens to use numeric_limits below

#undef min
#undef max

#include <limits>
#include <vector>
#include <string.h>

#ifdef LINUX_BUILD
#include <cmath>
#include <cfloat>
#endif

namespace mssql
{
	using namespace std;

	class DatumStorage
	{
	public:

		typedef long long int bigint_t; 
		typedef vector<uint16_t> uint16_t_vec_t;
		typedef vector<shared_ptr<uint16_t_vec_t>> uint16_vec_t_vec_t;
		typedef vector<char> char_vec_t;
		typedef vector<shared_ptr<char_vec_t>> char_vec_t_vec_t;
		typedef vector<int16_t> int16_vec_t;
		typedef vector<int32_t> int32_vec_t;
		typedef vector<uint32_t> uint32_vec_t;
		typedef vector<int64_t> int64_vec_t;
		typedef vector<double> double_vec_t;
		typedef vector<bigint_t> bigint_vec_t;
		typedef vector<SQL_SS_TIMESTAMPOFFSET_STRUCT> timestamp_offset_vec_t;
		typedef vector<SQL_SS_TIME2_STRUCT> time2_struct_vec_t;
		typedef vector<SQL_TIMESTAMP_STRUCT> timestamp_struct_vec_t;
		typedef vector<SQL_DATE_STRUCT> date_struct_vec_t;
		typedef vector<SQL_NUMERIC_STRUCT> numeric_struct_vec_t;

		DatumStorage() :
			int16vec_ptr(nullptr),
			int32vec_ptr(nullptr),
			uint32vec_ptr(nullptr),
			int64vec_ptr(nullptr),
			doublevec_ptr(nullptr),
			timestampoffsetvec_ptr(nullptr),
			time2vec_ptr(nullptr),
			timestampvec_ptr(nullptr),
			datevec_ptr(nullptr),
			numeric_ptr(nullptr),
			charvec_ptr(nullptr),
			uint16vec_ptr(nullptr),
			uint16_vec_vec_ptr(nullptr),
			char_vec_vec_ptr(nullptr),
			bigint_vec_ptr(nullptr)
		{
		}

		template<typename  T>
		inline shared_ptr<vector<T>> reserve_vec(shared_ptr<vector<T>> existing, size_t size)
		{
			if (existing == nullptr) {
				existing = make_shared<vector<T>>(size);
			}
			else
			{
				if (size > existing->capacity()) {
					existing->reserve(size);
				}
			}
			return existing;
		}

		inline bool isNumeric() const {
			return numeric_ptr && !numeric_ptr->empty();
		}

		inline void ReserveNumerics(size_t len)
		{
			numeric_ptr = reserve_vec<SQL_NUMERIC_STRUCT>(numeric_ptr, len);
		}

		inline bool isChar() const {
			return charvec_ptr && !charvec_ptr->empty();
		}

		inline void ReserveChars(size_t len)
		{
			charvec_ptr = reserve_vec<char>(charvec_ptr, len);
		}

		inline bool isBigInt() const {
			return bigint_vec_ptr && !bigint_vec_ptr->empty();
		}

		inline void ReserveBigInt(size_t len)
		{
			bigint_vec_ptr = reserve_vec<bigint_t>(bigint_vec_ptr, len);
		}

		inline void ReserveUint16(size_t len)
		{
			uint16vec_ptr = reserve_vec<uint16_t>(uint16vec_ptr, len);
		}

		inline bool isUint16Vec() const {
			return uint16_vec_vec_ptr && !uint16_vec_vec_ptr->empty();
		}

		inline void ReserveUint16Vec(size_t len)
		{
			uint16_vec_vec_ptr = reserve_vec<shared_ptr<uint16_t_vec_t>>(uint16_vec_vec_ptr, len);
		}

		inline bool isInt32() const {
			return int32vec_ptr  && !int32vec_ptr->empty();
		}

		inline void ReserveInt32(size_t len)
		{
			int32vec_ptr = reserve_vec<int32_t>(int32vec_ptr, len);
		}

		inline bool isInt16() const {
			return int16vec_ptr  && !int16vec_ptr->empty();
		}

		inline void ReserveInt16(size_t len)
		{
			int16vec_ptr = reserve_vec<int16_t>(int16vec_ptr, len);
		}

		inline bool isUInt32() const {
			return uint32vec_ptr  && !uint32vec_ptr->empty();
		}

		inline void ReserveUInt32(size_t len)
		{
			uint32vec_ptr = make_shared<uint32_vec_t>(len);
		}

		inline bool isInt64() const {
			return int64vec_ptr && !int64vec_ptr->empty();
		}

		inline void ReserveInt64(size_t len)
		{
			int64vec_ptr = reserve_vec<int64_t>(int64vec_ptr, len);
		}

		inline bool isDouble() const {
			return doublevec_ptr && !doublevec_ptr->empty();
		}

		inline void ReserveDouble(size_t len)
		{
			doublevec_ptr = reserve_vec<double>(doublevec_ptr, len);
		}

		inline bool isTimestamp() const {
			return timestampvec_ptr && !timestampvec_ptr->empty();
		}

		inline void ReserveTimestamp(size_t len)
		{
			timestampvec_ptr = reserve_vec<SQL_TIMESTAMP_STRUCT>(timestampvec_ptr, len);
		}

		inline bool isTime2() const {
			return time2vec_ptr && !time2vec_ptr->empty();
		}

		inline void Reservetime2(size_t len) {
			time2vec_ptr = reserve_vec<SQL_SS_TIME2_STRUCT>(time2vec_ptr, len);
		}

		inline bool isTimestampOffset() const {
			return timestampoffsetvec_ptr && !timestampoffsetvec_ptr->empty();
		}

		inline void ReserveTimestampOffset(size_t len)
		{
			timestampoffsetvec_ptr = reserve_vec<SQL_SS_TIMESTAMPOFFSET_STRUCT>(timestampoffsetvec_ptr, len);
		}

		inline bool isCharVec() const {
			return char_vec_vec_ptr && !char_vec_vec_ptr->empty();
		}

		inline void ReserveCharVec(size_t len)
		{
			char_vec_vec_ptr = reserve_vec<shared_ptr<char_vec_t>>(char_vec_vec_ptr, len);
		}

		inline bool isDate() const {
			return datevec_ptr && !datevec_ptr->empty();
		}

		inline void ReserveDate(size_t len) {
			datevec_ptr = reserve_vec<SQL_DATE_STRUCT>(datevec_ptr, len);
		}

		shared_ptr<int16_vec_t> int16vec_ptr;
		shared_ptr<int32_vec_t> int32vec_ptr;
		shared_ptr<uint32_vec_t> uint32vec_ptr;
		shared_ptr<int64_vec_t> int64vec_ptr;
		shared_ptr<double_vec_t> doublevec_ptr;
		shared_ptr<timestamp_offset_vec_t> timestampoffsetvec_ptr;
		shared_ptr<time2_struct_vec_t> time2vec_ptr;
		shared_ptr<timestamp_struct_vec_t> timestampvec_ptr;
		shared_ptr<date_struct_vec_t> datevec_ptr;
		shared_ptr<numeric_struct_vec_t> numeric_ptr;
		shared_ptr<char_vec_t> charvec_ptr;
		shared_ptr<uint16_t_vec_t> uint16vec_ptr;
		shared_ptr<uint16_vec_t_vec_t> uint16_vec_vec_ptr;
		shared_ptr<char_vec_t_vec_t> char_vec_vec_ptr;
		shared_ptr<bigint_vec_t> bigint_vec_ptr;

		wstring schema;
		wstring table;
	private:

	};

	class nodeTypeCounter
	{
	public:
		void Decode(v8::Local<v8::Value> p)
		{
			nodeTypeFactory fact;
			auto context = fact.isolate->GetCurrentContext();
			if (p->IsNullOrUndefined()) {
				++nullCount;
			}
			else if (p->IsString()) {
				++stringCount;
			}
			else if (p->IsBoolean()) {
				++boolCount;
			}
			else if (p->IsNumber()) {
				MaybeLocal<Number> maybe = p->ToNumber(context);
				Local<Number> local;
				if (maybe.ToLocal(&local))
				{
					auto d = local->Value();
					#ifdef WINDOWS_BUILD
					if (_isnan(d)) ++nanCount;
					#endif
					#ifdef LINUX_BUILD
					if (isnan(d)) ++nanCount;
					#endif
					#ifdef WINDOWS_BUILD
					else if (!_finite(d)) ++infiniteCount;
					#endif
					#ifdef LINUX_BUILD
					else if (!isfinite(d)) ++infiniteCount;
					#endif

					if (d == floor(d) &&
						d >= std::numeric_limits<int32_t>::min() &&
						d <= std::numeric_limits<int32_t>::max()) {
						++int32Count;
					}
					else if (d == floor(d) &&
						d >= std::numeric_limits<int64_t>::min() &&
						d <= std::numeric_limits<int64_t>::max()) {
						++int64Count;
					}
					else ++numberCount;
				}
			}/*
			else if (p->IsBigInt())
			{
				MaybeLocal<BigInt> maybe = p->ToBigInt(context);
				Local<BigInt> local;
				if (maybe.ToLocal(&local))
				{
					++int64Count;
				}
			}*/
			else if (p->IsInt32()) {
				++int32Count;
			}
			else if (p->IsUint32()) {
				++uint32Count;
			}
			else if (p->IsDate()) {
				++dateCount;
			}
			else if (p->IsObject() && node::Buffer::HasInstance(p)) {
				++bufferCount;
			}
			else {
				++invalidCount;
			}
		}

		int getoutBoundsCount() const { return nanCount + infiniteCount; }

		int boolCount = 0;
		int stringCount = 0;
		int nullCount = 0;
		int int32Count = 0;
		int uint32Count = 0;
		int numberCount = 0;
		int dateCount = 0;
		int bufferCount = 0;
		int invalidCount = 0;
		int nanCount = 0;
		int infiniteCount = 0;
		int int64Count = 0;
	};
}#include "stdafx.h"
#include <BoundDatum.h>
#include <BoundDatumSet.h>
#include <QueryOperationParams.h>
#include <ResultSet.h>

namespace mssql
{
	BoundDatumSet::BoundDatumSet() :
		err(nullptr),
		first_error(0),
		_output_param_count(-1),
		_params(nullptr)
	{
		_bindings = make_shared<param_bindings>();
	}

	BoundDatumSet::BoundDatumSet(shared_ptr<QueryOperationParams> params) : 
	BoundDatumSet()
	{
		_params = params;
	}

	bool BoundDatumSet::reserve(const shared_ptr<ResultSet>& set, const size_t row_count) const
	{
		for (uint32_t i = 0; i < set->get_column_count(); ++i) {
			const auto binding = make_shared<BoundDatum>(_params);
			auto& def = set->get_meta_data(i);
			size_t size = def.columnSize;
			size_t newSize = size;
			binding->reserve_column_type(def.dataType, newSize, row_count);
			if (size != newSize) {
				def.columnSize = newSize;
			}
			_bindings->push_back(binding);
		}
		return true;
	}

	Local<Value> get(const Local<Object> o, const char* v)
	{	
		const auto vp = Nan::New(v).ToLocalChecked();
		const auto val = Nan::Get(o, vp).ToLocalChecked();
		return val;
	}

	int get_tvp_col_count(Local<Value>& v)
	{
		const auto tvp_columns = Nan::Get(Nan::To<Object>(v).ToLocalChecked(), Nan::New("table_value_param").ToLocalChecked()).ToLocalChecked();
		const auto cols = tvp_columns.As<Array>();
		const auto count = cols->Length();
		return count;
	}

	bool BoundDatumSet::tvp(Local<Value>& v) const
	{
		const auto tvp_columns = Nan::Get(Nan::To<Object>(v).ToLocalChecked(), Nan::New("table_value_param").ToLocalChecked()).ToLocalChecked();
		if (tvp_columns->IsNull()) return false;
		if (!tvp_columns->IsArray()) return false;

		const auto cols = tvp_columns.As<Array>();
		const auto count = cols->Length();

		for (uint32_t i = 0; i < count; ++i) {
			const auto binding = make_shared<BoundDatum>();
			auto p = Nan::Get(Nan::To<Object>(tvp_columns).ToLocalChecked(), i).ToLocalChecked();
			const auto res = binding->bind(p);
			if (!res) break;
			_bindings->push_back(binding);
		}
		return true;
	}

	bool BoundDatumSet::bind(Local<Array>& node_params)
	{
		const auto count = node_params->Length();
		auto res = true;
		_output_param_count = 0;
		if (count > 0) {
			for (uint32_t i = 0; i < count; ++i) {
				const auto binding = make_shared<BoundDatum>();
				auto v = Nan::Get(node_params, i).ToLocalChecked();
				res = binding->bind(v);

				switch (binding->param_type)
				{
				case SQL_PARAM_OUTPUT:
				case SQL_PARAM_INPUT_OUTPUT:
					_output_param_count++;
					break;

				default:
					break;
				}

				if (!res) {
					err = binding->getErr();
					first_error = i;
					break;
				}

				_bindings->push_back(binding);

				if (binding->is_tvp)
				{
					const auto col_count = get_tvp_col_count(v);
					binding->tvp_no_cols = col_count;
					res = tvp(v);
				}
			}
		}

		return res;
	}

	Local<Array> BoundDatumSet::unbind() const
	{
		const nodeTypeFactory fact;
		const auto arr = fact.new_array(_output_param_count);
		auto i = 0;

		std::for_each(_bindings->begin(), _bindings->end(), [&](const shared_ptr<BoundDatum> & param) mutable
			{
				switch (param->param_type)
				{
				case SQL_PARAM_OUTPUT:
				case SQL_PARAM_INPUT_OUTPUT:
				{
					const auto v = param->unbind();
					Nan::Set(arr, i++, v);
				}
				break;

				default:
					break;
				}
			});
		return arr;
	}
}
#pragma once

#include <vector>
#include <BoundDatum.h>

namespace mssql
{
	class ResultSet;
	class QueryOperationParams;

	class BoundDatumSet
	{
	public:	
		typedef vector<shared_ptr<BoundDatum>> param_bindings;
		BoundDatumSet();
		BoundDatumSet(const shared_ptr<QueryOperationParams> params);
		bool reserve(const shared_ptr<ResultSet> &set, size_t row_count) const;
		bool bind(Local<Array> &node_params);
		Local<Array> unbind() const;	
		void clear() { _bindings->clear(); }
		size_t size() { return _bindings->size(); }
		shared_ptr<BoundDatum> & atIndex(int i) { return (*_bindings)[i]; }
		param_bindings::iterator begin() { return _bindings->begin(); }
		param_bindings::iterator end() { return _bindings->end(); }

		char * err;
		uint32_t first_error;

	private:
		bool tvp(Local<Value> &v) const;
		int _output_param_count;
		shared_ptr<param_bindings> _bindings;
		shared_ptr<QueryOperationParams> _params;
	};
}
cmake_minimum_required(VERSION 3.3)
project(src)

                     # e.g. "date_time" for "libboost_date_time"

set(Boost_USE_STATIC_LIBS        ON) # only find static libs
set(Boost_USE_MULTITHREADED      ON)
set(Boost_USE_STATIC_RUNTIME    OFF)
find_package(Boost COMPONENTS date_time filesystem system)


set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES
    BinaryColumn.h
    BoolColumn.h
    Column.cpp
    Column.h
    Connection.cpp
    Connection.h
    CriticalSection.h
    IntColumn.h
    NodeColumns.h
    NullColumn.h
    NumberColumn.h
    OdbcConnection.cpp
    OdbcConnection.h
    OdbcConnectionBridge.h
    OdbcError.cpp
    OdbcError.h
    OdbcHandle.h
    OdbcOperation.cpp
    OdbcOperation.h
    Operation.h
    ResultSet.cpp
    ResultSet.h
    sqlncli.h
    stdafx.cpp
    stdafx.h
    StringColumn.h
    TimestampColumn.h
    Utility.cpp
    Utility.h)

if(Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIRS})
    add_executable(src ${SOURCE_FILES})
    target_link_libraries(nodelib ${Boost_LIBRARIES})
endif()#include "stdafx.h"
#include <OdbcStatement.h>
#include <CancelOperation.h>

namespace mssql
{
	bool CancelOperation::TryInvokeOdbc()
	{
		if (!_statement) return false;
		return _statement->cancel();
	}

	Local<Value> CancelOperation::CreateCompletionArg()
	{
		const nodeTypeFactory fact;
		return fact.null();
	}
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcOperation.h
// Contents: ODBC Operation objects called on background thread
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include <OdbcOperation.h>

namespace mssql
{
	using namespace std;
	using namespace v8;

	class OdbcConnection;

	class CancelOperation : public OdbcOperation
	{
	public:

		CancelOperation(shared_ptr<OdbcConnection> connection, size_t queryId, Local<Object> callback)
			: OdbcOperation(connection, callback)
		{
			_statementId = queryId;
			_can_lock = false;
		}

		bool TryInvokeOdbc() override;

		Local<Value> CreateCompletionArg() override;
	};
}

#include "stdafx.h"
#include <OdbcConnection.h>
#include <CloseOperation.h>

namespace mssql
{
	CloseOperation::CloseOperation(const shared_ptr<OdbcConnection> &connection, const Local<Object> callback)
		: OdbcOperation(connection, callback)
	{
	}

	bool CloseOperation::TryInvokeOdbc()
	{
		//fprintf(stderr, "invoke TryClose statementId = %d operationId = %llu\n",
		//	statementId,
		//	OperationID );
		// cerr << "CloseOperation statementId = " << _statementId << endl;
		return _connection->TryClose();
	}

	Local<Value> CloseOperation::CreateCompletionArg()
	{
		const nodeTypeFactory fact;
		return fact.null();
	}
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcOperation.h
// Contents: ODBC Operation objects called on background thread
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include "OdbcOperation.h"

namespace mssql
{
	using namespace std;
	using namespace v8;

	class OdbcConnection;

	class CloseOperation : public OdbcOperation
	{
	public:
		CloseOperation(const shared_ptr<OdbcConnection> &connection, const Local<Object> callback);
		bool TryInvokeOdbc() override;
		Local<Value> CreateCompletionArg() override;
	};
}

#include "stdafx.h"
#include <OdbcConnection.h>
#include <CollectOperation.h>

namespace mssql
{
	CollectOperation::CollectOperation(const shared_ptr<OdbcConnection> &connection)
		: OdbcOperation(connection, Local<Object>())
	{
	}

	bool CollectOperation::TryInvokeOdbc()
	{
		return _connection->TryClose();
	}

	Local<Value> CollectOperation::CreateCompletionArg()
	{
		const nodeTypeFactory fact;
		return fact.null();
	}
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcOperation.h
// Contents: ODBC Operation objects called on background thread
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include "OdbcOperation.h"

namespace mssql
{
	using namespace std;
	using namespace v8;

	class OdbcConnection;

	class CollectOperation : public OdbcOperation
	{
	public:
		CollectOperation(const shared_ptr<OdbcConnection> &connection);
		bool TryInvokeOdbc() override;
		Local<Value> CreateCompletionArg() override;
		// override to not call a callback
	};
}

//---------------------------------------------------------------------------------------------------------------------------------
// File: Column.cpp
// Contents: Column objects from SQL Server to return as Javascript types
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#include <NodeColumns.h>

namespace mssql {

	 Column::~Column()
	 { 
	 }
}   // namespace mssql//---------------------------------------------------------------------------------------------------------------------------------
// File: Column.h
// Contents: Column objects from SQL Server to return as Javascript types
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include <stdafx.h>
#include <v8.h>

namespace mssql
{
	using namespace std;
	using namespace v8;

	class Column
	{
	public:
		Column(int id) : _id(id), _asNative(true)
		{			
		}
		virtual ~Column();

		virtual Local<Value> ToNative() = 0;
		virtual Local<Value> ToValue() {
			return _asNative ? ToNative() : ToString();
		}
		
		virtual Local<Value> ToString() = 0;

		int Id() const { return _id; }
		void AsString() {
			_asNative = false;
		}

		template<class T> Local<Value> AsString(T value)
	    {
			auto str = to_wstring(value);
			auto sptr = str.data();
			auto s = Nan::Encode(sptr, str.size() * 2, Nan::UCS2);
			return s;
	    }

	private:
		int _id;
		bool _asNative;
	};
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: Connection.cpp
// Contents: C++ interface to Microsoft Driver for Node.js for SQL Server
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#include "stdafx.h"
#include <Connection.h>
#include <OdbcConnection.h>
#include <MutateJS.h>

namespace mssql
{
	using namespace v8;

	Nan::Persistent<v8::Function> Connection::constructor;

	Connection::Connection()
		: connectionBridge(make_unique<OdbcConnectionBridge>())
	{
	}

	void Connection::api(Local<FunctionTemplate> & tpl)
	{
		 Nan::SetPrototypeMethod(tpl, "close", close);
		 Nan::SetPrototypeMethod(tpl, "open", open);
		 Nan::SetPrototypeMethod(tpl, "query", query);
		 Nan::SetPrototypeMethod(tpl, "bindQuery", bind_query);
		 Nan::SetPrototypeMethod(tpl, "prepare", prepare);
		 Nan::SetPrototypeMethod(tpl, "readColumn", read_column);
		 Nan::SetPrototypeMethod(tpl, "beginTransaction", begin_transaction);
		 Nan::SetPrototypeMethod(tpl, "commit", commit);
		 Nan::SetPrototypeMethod(tpl, "rollback", rollback);
		 Nan::SetPrototypeMethod(tpl, "nextResult", read_next_result);
		 Nan::SetPrototypeMethod(tpl, "callProcedure", call_procedure);
		 Nan::SetPrototypeMethod(tpl, "unbind", unbind);
		 Nan::SetPrototypeMethod(tpl, "freeStatement", free_statement);
		 Nan::SetPrototypeMethod(tpl, "cancelQuery", cancel_statement);
		 Nan::SetPrototypeMethod(tpl, "pollingMode", polling_mode);
	}

	void Connection::Init(Local<Object> exports) {
		const auto context = exports->CreationContext();
  		Nan::HandleScope scope;
		const auto initialized = OdbcConnection::InitializeEnvironment();
		const auto name = Nan::New("Connection").ToLocalChecked();
		if (!initialized) {
			const nodeTypeFactory fact;
			MutateJS::set_property_value(exports, name, Nan::Null());
			fact.throwError("Unable to initialize msnodesql");
			return;
		}

		// Prepare constructor template
		auto tpl = Nan::New<FunctionTemplate>(New);
		tpl->SetClassName(name);
		tpl->InstanceTemplate()->SetInternalFieldCount(1);

		api(tpl);

  		constructor.Reset(tpl->GetFunction(context).ToLocalChecked());
		Nan::Set(exports, name, tpl->GetFunction(context).ToLocalChecked());
 	}

	Connection::~Connection()
	{
		// close the connection now since the object is being collected
		//connectionBridge->Collect();
	}

	void Connection::close(const Nan::FunctionCallbackInfo<v8::Value>& info)
	{
		const auto cb = info[0].As<Object>();
		const auto* const connection = Unwrap<Connection>(info.This());
		const auto ret = connection->connectionBridge->close(cb);
		info.GetReturnValue().Set(ret);
	}

	void Connection::begin_transaction(const Nan::FunctionCallbackInfo<v8::Value>& info)
	{
		const auto cb = info[0].As<Object>();
		const auto* const connection = Unwrap<Connection>(info.This());
		const auto ret = connection->connectionBridge->begin_transaction(cb);
		info.GetReturnValue().Set(ret);
	}

	void Connection::commit(const Nan::FunctionCallbackInfo<v8::Value>& info)
	{
		const auto cb = info[0].As<Object>();
		const auto* const connection = Unwrap<Connection>(info.This());
		const auto ret = connection->connectionBridge->commit(cb);
		info.GetReturnValue().Set(ret);
	}

	void Connection::rollback(const Nan::FunctionCallbackInfo<v8::Value>& info)
	{
		const auto cb = info[0].As<Object>();
		const auto* const connection = Unwrap<Connection>(info.This());
		const auto ret = connection->connectionBridge->rollback(cb);
		info.GetReturnValue().Set(ret);
	}

	void Connection::New(const Nan::FunctionCallbackInfo<v8::Value>& info) {
		const auto context = info.GetIsolate()->GetCurrentContext();
  		if (info.IsConstructCall()) {
    		// Invoked as constructor: `new MyObject(...)`
            auto* obj = new Connection();
    		obj->Wrap(info.This());
    		info.GetReturnValue().Set(info.This());
  		} else {
    		// Invoked as plain function `MyObject(...)`, turn into construct call.
    		constexpr auto argc = 1;
    		Local<Value> argv[argc] = {info[0]};
            const auto cons = Nan::New<Function>(constructor);
    		info.GetReturnValue().Set(
        	cons->NewInstance(context, argc, argv).ToLocalChecked());
  		}
	}

	void Connection::query(const Nan::FunctionCallbackInfo<v8::Value>& info)
	{
		const auto query_id = info[0].As<Number>();
		const auto query_object = info[1].As<Object>();
		const auto params = info[2].As<Array>();
		const auto callback = info[3].As<Object>();

		const auto* const connection = Unwrap<Connection>(info.This());
		const auto ret = connection->connectionBridge->query(query_id, query_object, params, callback);
		info.GetReturnValue().Set(ret);
	}

	void Connection::prepare(const Nan::FunctionCallbackInfo<v8::Value>& info)
	{
		const auto query_id = info[0].As<Number>();
		const auto query_object = info[1].As<Object>();
		const auto callback = info[2].As<Object>();

		const auto* const connection = Unwrap<Connection>(info.This());
		const auto ret = connection->connectionBridge->prepare(query_id, query_object, callback);
		info.GetReturnValue().Set(ret);
	}

	void Connection::bind_query(const Nan::FunctionCallbackInfo<v8::Value>& info)
	{
		const auto query_id = info[0].As<Number>();
		const auto params = info[1].As<Array>();
		const auto callback = info[2].As<Object>();

		const auto* const connection = Unwrap<Connection>(info.This());
		const auto ret = connection->connectionBridge->query_prepared(query_id, params, callback);
		info.GetReturnValue().Set(ret);
	}

	void Connection::call_procedure(const Nan::FunctionCallbackInfo<v8::Value>& info)
	{
		// need to ensure the signature is changed (in js ?) to form (?) = call sproc (?, ? ... );
		const auto query_id = info[0].As<Number>();
		const auto query_object = info[1].As<Object>();
		const auto params = info[2].As<Array>();
		const auto callback = info[3].As<Object>();

		const auto* const connection = Unwrap<Connection>(info.This());
		const auto ret = connection->connectionBridge->call_procedure(query_id, query_object, params, callback);
		info.GetReturnValue().Set(ret);
	}

	void Connection::unbind(const Nan::FunctionCallbackInfo<v8::Value>& info)
	{
		const auto query_id = info[0].As<Number>();
		const auto callback = info[1].As<Object>();
		const auto* const connection = Unwrap<Connection>(info.This());
		const auto ret = connection->connectionBridge->unbind_parameters(query_id, callback);
		info.GetReturnValue().Set(ret);
	}

	void Connection::free_statement(const Nan::FunctionCallbackInfo<v8::Value>& info)
	{
		const auto query_id = info[0].As<Number>();
		const auto callback = info[1].As<Object>();
		const auto* const connection = Unwrap<Connection>(info.This());
		const auto ret = connection->connectionBridge->free_statement(query_id, callback);
		info.GetReturnValue().Set(ret);
	}

	void Connection::read_column(const Nan::FunctionCallbackInfo<v8::Value>& info)
	{
		const auto query_id = info[0].As<Number>();
		const auto number_rows = info[1].As<Number>();
		const auto cb = info[2].As<Object>();
		const auto* const connection = Unwrap<Connection>(info.This());
		const auto ret = connection->connectionBridge->read_column(query_id, number_rows, cb);
		info.GetReturnValue().Set(ret);
	}

	void Connection::read_next_result(const Nan::FunctionCallbackInfo<v8::Value>& info)
	{
		const auto query_id = info[0].As<Number>();
		const auto callback = info[1].As<Object>();
		const auto* const connection = Unwrap<Connection>(info.This());
		const auto ret = connection->connectionBridge->read_next_result(query_id, callback);
		info.GetReturnValue().Set(ret);
	}

	void Connection::open(const Nan::FunctionCallbackInfo<v8::Value>& info)
	{
		const auto connection_object = info[0].As<Object>();
		const auto callback = info[1].As<Object>();

		const auto* const connection = Unwrap<Connection>(info.This());
		const auto ret = connection->connectionBridge->open(connection_object, callback, info.This());
		info.GetReturnValue().Set(ret);
	}

	void Connection::cancel_statement(const Nan::FunctionCallbackInfo<v8::Value>& info)
	{
		const auto query_id = info[0].As<Number>();
		const auto callback = info[1].As<Object>();
		const auto* const connection = Unwrap<Connection>(info.This());

		const auto ret = connection->connectionBridge->cancel(query_id, callback);
		info.GetReturnValue().Set(ret);
	}

	void Connection::polling_mode(const Nan::FunctionCallbackInfo<v8::Value>& info)
	{
		const auto query_id = info[0].As<Number>();
		const auto v1 = info[1].As<Boolean>();
		const auto callback = info[2].As<Object>();
		const auto* const connection = Unwrap<Connection>(info.This());
		const nodeTypeFactory fact;
		const auto context = fact.isolate->GetCurrentContext();
		const auto maybe = v1->Int32Value(context);
		const auto i32 = maybe.FromMaybe(0);
		const auto b1 = Nan::New(i32 > 0);

		const auto ret = connection->connectionBridge->polling_mode(query_id, b1, callback);
		info.GetReturnValue().Set(ret);
	}
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: Connection.h
// Contents: C++ interface to Microsoft Driver for Node.js for SQL Server
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include <nan.h>
#include "OdbcConnectionBridge.h"

namespace mssql
{
    using namespace std;
    using namespace v8;

    class Connection : public Nan::ObjectWrap
    {
    public:
		static void Init(v8::Local<v8::Object> exports);
		Connection();
		virtual ~Connection();

	private:
		
		static void New(const Nan::FunctionCallbackInfo<v8::Value>& info);
		static void close(const Nan::FunctionCallbackInfo<v8::Value>& info);
		static void begin_transaction(const Nan::FunctionCallbackInfo<v8::Value>& info);
		static void commit(const Nan::FunctionCallbackInfo<v8::Value>& info);
		static void rollback(const Nan::FunctionCallbackInfo<v8::Value>& info);
		static void open(const Nan::FunctionCallbackInfo<v8::Value>& info);
		static void query(const Nan::FunctionCallbackInfo<v8::Value>& info);
		static void prepare(const Nan::FunctionCallbackInfo<v8::Value>& info);
		static void bind_query(const Nan::FunctionCallbackInfo<v8::Value>& info);
		static void call_procedure(const Nan::FunctionCallbackInfo<v8::Value>& info);
		static void unbind(const Nan::FunctionCallbackInfo<v8::Value>& info);
		static void free_statement(const Nan::FunctionCallbackInfo<v8::Value>& info);
		static void read_row(const Nan::FunctionCallbackInfo<v8::Value>& info);
		static void cancel_statement(const Nan::FunctionCallbackInfo<v8::Value>& info);
		static void read_column(const Nan::FunctionCallbackInfo<v8::Value>& info);
		static void read_next_result(const Nan::FunctionCallbackInfo<v8::Value>& info);
		static void polling_mode(const Nan::FunctionCallbackInfo<v8::Value>& info);
		
		static Nan::Persistent<v8::Function> constructor;
		static void api(Local<FunctionTemplate>& tpl);
		unique_ptr<OdbcConnectionBridge> connectionBridge;
		Persistent<Object> This;
    };
}

#include "ConnectionHandles.h"

namespace mssql {
    ConnectionHandles::ConnectionHandles(const OdbcEnvironmentHandle& env) {
        _connectionHandle = make_shared<OdbcConnectionHandle>();
        if (!_connectionHandle->alloc(env)) {
			_connectionHandle = nullptr;
		}
    }

    ConnectionHandles::~ConnectionHandles() { 
        clear();
        _connectionHandle->free(); 
		_connectionHandle = nullptr;
    }

	void ConnectionHandles::clear()
	{
		// cerr << "OdbcStatementCache - size = " << statements.size() << endl;
		vector<long> ids;
		// fprintf(stderr, "destruct OdbcStatementCache\n");

		for_each(_statementHandles.begin(), _statementHandles.end(), [&](const auto & p) {
			const shared_ptr<OdbcStatementHandle> s = (p.second);
			// std::cerr << " clear " << p.first << " p = " << this << std::endl;
            s->free();
			ids.insert(ids.begin(), p.first);
		});

		for_each(ids.begin(), ids.end(), [&](const long id) {
			// cerr << "destruct OdbcStatementCache - erase statement" << id << endl;
			_statementHandles.erase(id);
		});
	}

	shared_ptr<OdbcStatementHandle> ConnectionHandles::find(const long statement_id)
	{
		shared_ptr<OdbcStatementHandle> statement_handle = nullptr;
		const auto itr = _statementHandles.find(statement_id);
		if (itr != _statementHandles.end()) {
			statement_handle = itr->second;
		}
		return statement_handle;
	}

	shared_ptr<OdbcStatementHandle> ConnectionHandles::store(shared_ptr<OdbcStatementHandle> handle)
	{
		_statementHandles.insert(pair<long, shared_ptr<OdbcStatementHandle>>(handle->statementId, handle));
		return handle;
	}

	shared_ptr<OdbcStatementHandle> ConnectionHandles::checkout(long statement_id)
	{
		if (statement_id < 0)
		{
			//fprintf(stderr, "dont fetch id %ld\n", statementId);
			return nullptr;
		}
		auto statement = find(statement_id);
		if (statement) return statement;
		const auto handle = make_shared<OdbcStatementHandle>(statement_id);
        handle->alloc(*_connectionHandle);
		//std::cerr << " checkout " << statement_id << " p = " << this <<  endl;
		return store(handle);
	}

    void ConnectionHandles::checkin(long statementId) { 
		// std::cerr << " checkin " << statementId << " p = " << this <<  endl;
		const auto handle = find(statementId);
        if (handle == nullptr) return;
		 _statementHandles.erase(statementId);
        handle->free(); 
    }
}//---------------------------------------------------------------------------------------------------------------------------------
// File: ConnectionHandles.h
// Contents: Object to manage ODBC handles
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include "stdafx.h"
#include <vector>
#include <map>

namespace mssql
{
    using namespace std;
    class OdbcConnectionHandle;
    class OdbcStatementHandle;
    class OdbcEnvironmentHandle;

    class ConnectionHandles
    {
    public:
		 ConnectionHandles(const OdbcEnvironmentHandle &env);
         ~ConnectionHandles();
         shared_ptr<OdbcStatementHandle> checkout(long statementId);
         void checkin(long statementId);
         inline shared_ptr<OdbcConnectionHandle> connectionHandle() { return _connectionHandle; }
         void clear();

    private:
      
        shared_ptr<OdbcStatementHandle> store(shared_ptr<OdbcStatementHandle> handle);
        shared_ptr<OdbcStatementHandle> find(const long statement_id); 
        map<long, shared_ptr<OdbcStatementHandle>> _statementHandles;
        shared_ptr<OdbcConnectionHandle> _connectionHandle;
    };
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: CriticalSection.h
// Contents: Wrapper for a critical section that handles scope
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------
#include <thread>
#include <mutex>

namespace mssql {

#pragma once

   class ScopedCriticalSectionLock {

   public:

       ScopedCriticalSectionLock( std::mutex & cs ) :
           criticalSection_( cs )
       {
           criticalSection_.lock();
       }

       ~ScopedCriticalSectionLock( void )
       {
           criticalSection_.unlock();
       }

   private:
      std::mutex & criticalSection_;
   };

}  // mssql
#include "stdafx.h"
#include <OdbcConnection.h>
#include <EndTranOperation.h>

namespace mssql
{
	EndTranOperation::EndTranOperation(const shared_ptr<OdbcConnection> &connection,
	                                   const SQLSMALLINT completion_type, const Local<Object> callback)
		: OdbcOperation(connection, callback),
		completionType(completion_type)
	{
	}

	bool EndTranOperation::TryInvokeOdbc()
	{
		return _connection->try_end_tran(completionType);
	}

	Local<Value> EndTranOperation::CreateCompletionArg()
	{
		const nodeTypeFactory fact;
		return fact.null();
	}
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcOperation.h
// Contents: ODBC Operation objects called on background thread
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include "OdbcOperation.h"

namespace mssql
{
	using namespace std;
	using namespace v8;

	class OdbcConnection;

	class EndTranOperation : public OdbcOperation
	{
		SQLSMALLINT completionType;

	public:
		EndTranOperation(const shared_ptr<OdbcConnection> &connection, SQLSMALLINT completion_type, Local<Object> callback);
		bool TryInvokeOdbc() override;
		Local<Value> CreateCompletionArg() override;
	};
}

#include "stdafx.h"
#include <FreeStatementOperation.h>
#include <OdbcConnection.h>
#include <OdbcStatementCache.h>

namespace mssql
{
	bool FreeStatementOperation::TryInvokeOdbc()
	{
		// cerr << "FreeStatementOperation() " << _statementId << " " << endl;
		//_connection->getStatamentCache()->checkin(_statementId);
		_connection->getStatamentCache()->checkin(_statementId);
		//fprintf(stderr, " checkin statementId %d size %llu\n", statementId, connection->statements->size());
		return true;
	}

	Local<Value> FreeStatementOperation::CreateCompletionArg()
	{
		const nodeTypeFactory fact;
		return fact.null();
	}
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcOperation.h
// Contents: ODBC Operation objects called on background thread
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include "OdbcOperation.h"

namespace mssql
{
	using namespace std;
	using namespace v8;

	class OdbcConnection;

	class FreeStatementOperation : public OdbcOperation
	{
	public:

		FreeStatementOperation(shared_ptr<OdbcConnection> connection, size_t queryId, Local<Object> callback)
			: OdbcOperation(connection, queryId, callback)
		{
		}

		bool TryInvokeOdbc() override;

		Local<Value> CreateCompletionArg() override;
	};
}

#pragma once

#include <stdafx.h>
#include "Column.h"
#include "BoundDatumHelper.h"

namespace mssql
{
    using namespace std;

    class IntColumn : public Column
    {
    public:
	   IntColumn(int id,shared_ptr<DatumStorage> storage) : Column(id), value((*storage->int64vec_ptr)[0])
	   {		   
	   }

	   IntColumn(int id, long v) : Column(id), value(v)
	   {
	   }

	   inline Local<Value> ToString() override
	   {
		   return AsString<int64_t>(value);
	   }

	   inline Local<Value> ToNative() override
	   {
		 	return Nan::New(static_cast<int32_t>(value));
	   }

    private:
	   int64_t value;
    };
}
#include "stdafx.h"
#include <MutateJS.h>
#include <nan.h>

namespace mssql
{
	bool MutateJS::getbool(const Local<Object> query_object, const char* v)
	{
		const auto l = get(query_object, v);
		return as_boolean(l);
	}

	 bool MutateJS::set_property_value(const Local<Object>& o, const Local<Value>& p, const Local<Value>& v)
	 {
		 return Nan::Set(o, p, v).ToChecked();
	 }

	Local<Value> MutateJS::get_property_as_value(const Local<Object>& o, const Local<Value>& v)
	{
		if ( o->IsUndefined() || o->IsNull())
		{
			const nodeTypeFactory fact;
			return fact.null();
		}
		const auto p = Nan::Get(o,v).ToLocalChecked();
		return p;
	}

	static bool isUnDefined(const Local<Value> l) {
		return l->IsUndefined() || l->IsNull();
	}

	int32_t MutateJS::getint32(const Local<Object> query_object, const char* v)
	{
		const auto l = get(query_object, v);
		if (!isUnDefined(l))
		{
			return Nan::To<int32_t>(l).ToChecked();
		}
		return 0;
	}

	 bool MutateJS::as_boolean(const Local<Value>& as_val) 
	 {
		 if (!isUnDefined(as_val))
		 {
			 return Nan::To<bool>(as_val).ToChecked();
		 }
		 return false;
	 }

	int32_t MutateJS::getint32(const Local<Number> l)
	{
		const auto v = isUnDefined(l) ? 0 : Nan::To<int32_t>(l).ToChecked();
		return v;
	}

	int64_t MutateJS::getint64(const Local<Object> query_object, const char* v)
	{
		const auto l = get(query_object, v);
		if (!isUnDefined(l))
		{
			return Nan::To<int64_t>(l).ToChecked();
		}
		return 0;
	}

	int64_t MutateJS::getint64(const Local<Number> l)
	{
		if (!isUnDefined(l))
		{
			return Nan::To<int64_t>(l).ToChecked();
		}
		return 0;
	}

	Local<Value> MutateJS::get_property_as_value(const Local<Object>& o, const char* v)
	{
		return get(o, v);
	}

	Local<Value> MutateJS::get(const Local<Object> o, const char* v)
	{
		if (isUnDefined(o))
		{
			const nodeTypeFactory fact;
			return fact.null();
		}
		const auto p = Nan::Get(o, Nan::New<String>(v).ToLocalChecked()).ToLocalChecked();
		return p;
	}
}
#pragma once

// undo these tokens to use numeric_limits below

#include <BoundDatumHelper.h>

namespace mssql
{
	using namespace std;

	class MutateJS {
	public:
		static bool as_boolean(const Local<Value>& as_val);
		static Local<Value> get_property_as_value(const Local<Object>& o, const char* v);
		static Local<Value> get_property_as_value(const Local<Object>& o, const Local<Value>& v);
		static bool set_property_value(const Local<Object>& o, const Local<Value>& p, const Local<Value>& v);
		static int32_t getint32(Local<Object> query_object, const char* v);
		static int64_t getint64(Local<Object> query_object, const char* v);
		static int64_t getint64(Local<Number> l);
		static int32_t getint32(Local<Number> l);
		static Local<Value> get(Local<Object> o, const char* v);
		static bool getbool(Local<Object> query_object, const char* v);
	};
}
#pragma once

#include <Column.h>
#include <IntColumn.h>
#include <BoolColumn.h>
#include <NullColumn.h>
#include <NumberColumn.h>
#include <TimestampColumn.h>
#include <BinaryColumn.h>
#include <StringColumn.h>
#include <BigIntColumn.h>

#pragma once

#include <v8.h>
#include <Column.h>

namespace mssql
{
    using namespace std;

    class NullColumn : public Column
    {
    public:
		NullColumn(int id) : Column(id)
		{		
		}

	   inline Local<Value> ToString() override
	   {
		  nodeTypeFactory fact;
		  return fact.null();
	   }

	   Local<Value> ToNative() override
	   {
		  nodeTypeFactory fact;
		  return fact.null();
	   }
    }; 
}
#pragma once

#include <v8.h>
#include <Column.h>
#include <BoundDatumHelper.h>
#include <string>

namespace mssql
{
    using namespace std;

    class NumberColumn : public Column
    {
    public:

		NumberColumn(int id, double d) : Column(id), value(d)
		{
		}

		NumberColumn(int id, shared_ptr<DatumStorage> storage) : Column(id), value((*storage->doublevec_ptr)[0])
		{			
		}

	   inline Local<Value> ToString() override
	   {
		   return AsString<double>(value);
	   }

	   inline Local<Value> ToNative() override
	   {
		  return Nan::New(value);
	   }

    private:
	   double value;
    };
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcConnection.cpp
// Contents: Async calls to ODBC done in background thread
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#include "stdafx.h"
#include <OdbcConnection.h>
#include <OdbcStatementCache.h>
#include <OdbcOperation.h>
#include <ConnectionHandles.h>
#include <NodeColumns.h>
#include <sqltypes.h>

namespace mssql
{
	OdbcEnvironmentHandle OdbcConnection::environment;

#ifdef WINDOWS_BUILD
	bool OdbcConnection::InitializeEnvironment()
	{
		// fprintf(stderr, ">> InitializeEnvironment\n\n");

		auto ret = SQLSetEnvAttr(nullptr, SQL_ATTR_CONNECTION_POOLING,
		                         reinterpret_cast<SQLPOINTER>(SQL_CP_ONE_PER_HENV), 0);
		if (!SQL_SUCCEEDED(ret)) { return false; }

		if (!environment.alloc()) { return false; }

		ret = SQLSetEnvAttr(environment, SQL_ATTR_ODBC_VERSION, reinterpret_cast<SQLPOINTER>(SQL_OV_ODBC3), 0);
		if (!SQL_SUCCEEDED(ret)) { return false; }
		ret = SQLSetEnvAttr(environment, SQL_ATTR_CP_MATCH, reinterpret_cast<SQLPOINTER>(SQL_CP_RELAXED_MATCH), 0);
		if
		(!SQL_SUCCEEDED(ret)) { return false; }

		// fprintf(stderr, "<< InitializeEnvironment\n\n");

		return true;
	}
#endif
#ifdef LINUX_BUILD
	bool OdbcConnection::InitializeEnvironment()
	{
		if (!environment.alloc()) { return false; }
		auto ret = SQLSetEnvAttr(environment, SQL_ATTR_CONNECTION_POOLING, reinterpret_cast<SQLPOINTER>(SQL_CP_ONE_PER_HENV), 0);
		if (!SQL_SUCCEEDED(ret)) { return false; }
		ret = SQLSetEnvAttr(environment, SQL_ATTR_ODBC_VERSION, reinterpret_cast<SQLPOINTER>(SQL_OV_ODBC3), 0);
		if (!SQL_SUCCEEDED(ret)) { return false; }
		//ret = SQLSetEnvAttr(environment, SQL_ATTR_CP_MATCH, reinterpret_cast<SQLPOINTER>(SQL_CP_RELAXED_MATCH), 0);
		if (!SQL_SUCCEEDED(ret)) { 
			fprintf(stderr, " InitializeEnvironment fail %d\n", ret);
			return false; 
		}

		return true;
	}
#endif

	OdbcConnection::OdbcConnection() :
		_statements(nullptr),
		connectionState(Closed)
	{
		_errors = make_shared<vector<shared_ptr<OdbcError>>>();
		// ops = make_shared<OperationManager>();
	}

	OdbcConnection::~OdbcConnection()
	{
		//fprintf(stderr, "destruct OdbcConnection\n");
	}

	bool OdbcConnection::TryClose()
	{
		if (connectionState != Closed) // fast fail before critical section
		{
			ScopedCriticalSectionLock crit_sec_lock(closeCriticalSection);
			// std::cerr << " TryClose " << std::endl;
			//fprintf(stderr, "TryClose - %llu\n", statements->size());
			_statements->clear();
			_connectionHandles->clear();
			if (connectionState != Closed)
			{
				const auto ch = _connectionHandles->connectionHandle();
				const auto& connection = *ch;
				SQLDisconnect(connection);
				connectionState = Closed;
			}
		}

		return true;
	}

	bool OdbcConnection::ReturnOdbcError()
	{
		_errors->clear();
		const auto ch = _connectionHandles->connectionHandle();
		const auto& connection = *ch;
		connection.read_errors(_errors);
		// cerr << " RETURN_ODBC_ERROR " << endl;
		// fprintf(stderr, "RETURN_ODBC_ERROR - free connection handle\n\n");
		TryClose();
		return false;
	}

	bool OdbcConnection::CheckOdbcError(const SQLRETURN ret)
	{
		if (!SQL_SUCCEEDED(ret))
		{
			return ReturnOdbcError();
		}
		return true;
	}

	SQLRETURN OdbcConnection::open_timeout(const int timeout)
	{
		if (timeout > 0)
		{
			const auto ch = _connectionHandles->connectionHandle();
			const auto& connection = *ch;
			auto* const to = reinterpret_cast<SQLPOINTER>(static_cast<long long>(timeout));
			auto ret = SQLSetConnectAttr(connection, SQL_ATTR_CONNECTION_TIMEOUT, to, 0);
			if (!CheckOdbcError(ret)) return false;

			ret = SQLSetConnectAttr(connection, SQL_ATTR_LOGIN_TIMEOUT, to, 0);
			if (!CheckOdbcError(ret)) return false;
		}
		return true;
	}

	bool OdbcConnection::try_open(shared_ptr<vector<uint16_t>> connection_string, const int timeout)
	{
		assert(connectionState == Closed);
		_errors->clear();
		this->_connectionHandles = make_shared<ConnectionHandles>(environment);
		const auto connection = _connectionHandles->connectionHandle();
		if (connection == nullptr)
		{
			_errors->clear();
			environment.read_errors(_errors);
			//fprintf(stderr, "RETURN_ODBC_ERROR - free environment handle\n\n");
			environment.free();
			return false;
		}
		const auto &handle = *connection;
		_statements = make_shared<OdbcStatementCache>(_connectionHandles);
		auto ret = open_timeout(timeout);
		if (!CheckOdbcError(ret)) return false;
		ret = SQLSetConnectAttr(handle, SQL_COPT_SS_BCP, reinterpret_cast<SQLPOINTER>(SQL_BCP_ON), SQL_IS_INTEGER);  
		if (!CheckOdbcError(ret)) return false;

		ret = SQLDriverConnect(handle, nullptr, reinterpret_cast<SQLWCHAR*>(connection_string->data()),
		                       connection_string->size(), nullptr, 0, nullptr, SQL_DRIVER_NOPROMPT);
		if (!CheckOdbcError(ret)) return false;
		connectionState = Open;
		return true;
	}

	bool OdbcConnection::try_begin_tran()
	{
		// turn off autocommit
		const auto connection = _connectionHandles->connectionHandle();
		if (!connection) return false;
		auto* const acoff = reinterpret_cast<SQLPOINTER>(SQL_AUTOCOMMIT_OFF);
		const auto ret = SQLSetConnectAttr(*connection, SQL_ATTR_AUTOCOMMIT, acoff, SQL_IS_UINTEGER);
		return CheckOdbcError(ret);
	}

	void OdbcConnection::send(OdbcOperation* op) const
	{
		//fprintf(stderr, "OdbcConnection send\n");
		op->fetch_statement();
		Nan::AsyncQueueWorker(op);
	}

	bool OdbcConnection::try_end_tran(const SQLSMALLINT completion_type)
	{
		const auto connection = _connectionHandles->connectionHandle();
		if (!connection) return false;
		auto ret = SQLEndTran(SQL_HANDLE_DBC, *connection, completion_type);
		// cout << " try_end_tran " << "ret = " << ret << endl;
		if (!CheckOdbcError(ret)) return false;
		auto* const acon = reinterpret_cast<SQLPOINTER>(SQL_AUTOCOMMIT_ON);
		// put the connection back into auto commit mode
		ret = SQLSetConnectAttr(*connection, SQL_ATTR_AUTOCOMMIT, acon, SQL_IS_UINTEGER);
		return CheckOdbcError(ret);
	}
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcConnection.h
// Contents: Async calls to ODBC done in background thread
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include "stdafx.h"
#include <CriticalSection.h>
#include <map>

namespace mssql
{
	using namespace std;

	class OdbcStatementCache;
	class ResultSet;
	class OdbcOperation;
	class OperationManager;
	class ConnectionHandles;

	class OdbcConnection
	{
	public:
		OdbcConnection();
		~OdbcConnection();
		static bool InitializeEnvironment();
		bool try_begin_tran();
		void send(OdbcOperation* op) const;
		bool try_end_tran(SQLSMALLINT completion_type);
		bool try_open(shared_ptr<vector<uint16_t>> connection_string, int timeout);
		shared_ptr<vector<shared_ptr<OdbcError>>> errors(void) const { return _errors; }
		bool TryClose();
		shared_ptr<OdbcStatementCache> getStatamentCache() { return _statements; }
		
	private:
		shared_ptr<OdbcStatementCache> _statements;
		bool ReturnOdbcError();
		bool CheckOdbcError(SQLRETURN ret);
		
		static OdbcEnvironmentHandle environment;
		SQLRETURN open_timeout(int timeout);		
		shared_ptr<ConnectionHandles> _connectionHandles;
		std::mutex closeCriticalSection;

		// any error that occurs when a Try* function returns false is stored here
		// and may be retrieved via the Error function below.

		shared_ptr<vector<shared_ptr<OdbcError>>> _errors;
	
		enum ConnectionStates
		{
			Closed,
			Opening,
			TurnOffAutoCommit,
			Open
		} connectionState;

		// set binary true if a binary Buffer should be returned instead of a JS string
	};
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcConnectionBridge.cpp
// Contents: Create (bridge) operations to be completed on background thread queue
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#include <OdbcConnectionBridge.h>
#include <QueryOperation.h>
#include <QueryOperationParams.h>
#include <EndTranOperation.h>
#include <CollectOperation.h>
#include <BeginTranOperation.h>
#include <ProcedureOperation.h>
#include <OpenOperation.h>
#include <ReadNextResultOperation.h>
#include <ReadColumnOperation.h>
#include <CloseOperation.h>
#include <CancelOperation.h>
#include <PrepareOperation.h>
#include <FreeStatementOperation.h>
#include <QueryPreparedOperation.h>
#include <OperationManager.h>
#include <UnbindOperation.h>
#include <OdbcStatementCache.h>
#include <PollingModeOperation.h>
#include <MutateJS.h>
#include <iostream>

namespace mssql
{
	using namespace std;
	using namespace v8;

	OdbcConnectionBridge::OdbcConnectionBridge()
	{
		connection = make_shared<OdbcConnection>();
	}

	OdbcConnectionBridge::~OdbcConnectionBridge()
	{
		// fprintf(stderr, "destruct OdbcConnectionBridge\n");
	}

	Local<Value> OdbcConnectionBridge::close(const Local<Object> callback) const
	{
		auto* const op = new CloseOperation(connection, callback);
		connection->send(op);
		//fprintf(stderr, "CloseOperation operationId=%llu\n", op->OperationID);
		return Nan::Null();
	}

	void OdbcConnectionBridge::collect() const 
	{
		auto* const op = new CollectOperation(connection);
		connection->send(op);
	}

	Local<Value> OdbcConnectionBridge::begin_transaction(const Local<Object> callback) const 
	{
		auto* const op = new BeginTranOperation(connection, callback);
		connection->send(op);
		return Nan::Null();
	}

	Local<Value> OdbcConnectionBridge::commit(const Local<Object> callback) const
	{
		auto* const op = new EndTranOperation(connection, SQL_COMMIT, callback);
		connection->send(op);
		return Nan::Null();
	}

	Local<Value> OdbcConnectionBridge::rollback(const Local<Object> callback) const
	{
		auto* const op = new EndTranOperation(connection, SQL_ROLLBACK, callback);
		connection->send(op);
		return Nan::Null();
	}

	Local<Value> OdbcConnectionBridge::query(Local<Number> query_id, Local<Object> query_object, Local<Array> params, const Local<Object> callback) const
	{
		const auto q = make_shared<QueryOperationParams>(query_id, query_object);
		auto* operation = new QueryOperation(connection, q, callback);
		if (operation->bind_parameters(params)) {
			connection->send(operation);
		} else {
			delete operation;
		}
		return Nan::Null();
	}

	int32_t getint32(const Local<Number> l)
	{
		const nodeTypeFactory fact;
		const auto context = fact.isolate->GetCurrentContext();
		if (!l->IsNull())
		{
			const auto maybe = l->ToInt32(context);
			Local<Int32> local;
			if (maybe.ToLocal(&local))
			{
				return local->Value();
			}
		}
		return 0;
	}

	Local<String> getstring(const Local<Value> l)
	{
		const nodeTypeFactory fact;
		const auto context = fact.isolate->GetCurrentContext();
		if (!l->IsNull())
		{
			const auto maybe = l->ToString(context);
			Local<String> local;
			if (maybe.ToLocal(&local))
			{
				return local;
			}
		}
		const Local<String> s;
		return s;
	}

	Local<Value> OdbcConnectionBridge::query_prepared(const Local<Number> query_id, Local<Array> params, const Local<Object> callback) const
	{
		const auto id = getint32(query_id);
		auto *operation = new QueryPreparedOperation(connection, id, 0, callback);
		if (operation->bind_parameters(params)) {
			connection->send(operation);
		} else {
			delete operation;
		}
		return Nan::Null();
	}

	Local<Value> OdbcConnectionBridge::prepare(Local<Number> query_id, Local<Object> query_object, const Local<Object> callback) const
	{
		const auto q = make_shared<QueryOperationParams>(query_id, query_object);
		auto* const operation = new PrepareOperation(connection, q, callback);
		connection->send(operation);
		return Nan::Null();
	}

	Local<Value> OdbcConnectionBridge::call_procedure(Local<Number> query_id, Local<Object> query_object, Local<Array> params, const Local<Object> callback) const
	{
		const auto q = make_shared<QueryOperationParams>(query_id, query_object);

		auto *operation = new ProcedureOperation(connection, q, callback);
		if (operation->bind_parameters(params)) {
			connection->send(operation);
		} else {
			delete operation;
		}
		return Nan::Null();
	}

	Local<Value> OdbcConnectionBridge::unbind_parameters(const Local<Number> query_id, const Local<Object> callback) const 
	{
		const auto id = getint32(query_id);
		auto* const op = new UnbindOperation(connection, id, callback);
		connection->send(op);
		return Nan::Null();
	}

	Local<Value> OdbcConnectionBridge::cancel(const Local<Number> query_id, const Local<Object> callback) const
	{
		const auto id = getint32(query_id);
		//fprintf(stderr, "cancel %lld", id);
		auto* const op = new CancelOperation(connection, id, callback);
		connection->send(op);
		return Nan::Null();
	}

	Local<Value> OdbcConnectionBridge::polling_mode(const Local<Number> query_id, const Local<Boolean> mode, const Local<Object> callback) const
	{
		const auto id = getint32(query_id);
		const auto polling = MutateJS::as_boolean(mode);
		auto* const op = new PollingModeOperation(connection, id, polling, callback);
		connection->send(op);
		return Nan::Null();
	}

	Local<Value> OdbcConnectionBridge::free_statement(const Local<Number> query_id, const Local<Object> callback) const
	{
		const auto id = static_cast<long>(getint32(query_id));
		auto* op = new FreeStatementOperation(connection, id, callback);
		connection->send(op);
		return Nan::Null();
	}

	Local<Value> OdbcConnectionBridge::read_next_result(const Local<Number> query_id, const Local<Object> callback) const
	{
		const auto id = getint32(query_id);
		auto* const op = new ReadNextResultOperation(connection, id, callback);
		connection->send(op);
		return Nan::Null();
	}

	Local<Value> OdbcConnectionBridge::read_column(const Local<Number> query_id, const Local<Number> number_rows, Local<Object> callback) const
	{
		const auto id = getint32(query_id);
		auto* const op = new ReadColumnOperation(connection, id, getint32(number_rows), callback);
		connection->send(op);
		return Nan::Null();
	}

	Local<Value> OdbcConnectionBridge::open(const Local<Object> connection_object, const Local<Object> callback, const Local<Object> backpointer) const
	{
		nodeTypeFactory fact;
		const auto context = Nan::GetCurrentContext();
		const auto cs = MutateJS::get_property_as_value(connection_object, "conn_str");
		const auto connection_string = getstring(cs);
		const auto to = MutateJS::get_property_as_value(connection_object, "conn_timeout");
		const auto maybe_to = to->ToInt32(context);
		Local<Int32> local;
		auto timeout = 0;
		if (maybe_to.ToLocal(&local)) {
			timeout = local->Value();
		}

		auto* const op = new OpenOperation(connection, connection_string, timeout, callback, backpointer);
		connection->send(op);
		return Nan::Null();
	}
}//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcConnectionBridge.h
// Contents: Create (bridge) operations to be completed on background thread queue
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include <stdafx.h>

namespace mssql
{
	using namespace std;
	using namespace v8;

	class OdbcConnection;

	class OdbcConnectionBridge
	{
	public:

		OdbcConnectionBridge();
		~OdbcConnectionBridge();
		Local<Value> close(Local<Object> callback) const;
		void collect(void) const ;
		Local<Value> begin_transaction(Local<Object> callback) const;
		Local<Value> commit(Local<Object> callback) const;
		Local<Value> rollback(Local<Object> callback) const;
		Local<Value> query(Local<Number> query_id, Local<Object> query_object, Local<Array> params, Local<Object> callback) const;
		Local<Value> query_prepared(Local<Number> query_id, Local<Array> params, Local<Object> callback) const;
		Local<Value> prepare(Local<Number> query_id, Local<Object> query_object, Local<Object> callback) const;
		Local<Value> call_procedure(Local<Number> query_id, Local<Object> query_object, Local<Array> params, Local<Object> callback) const;
		Local<Value> unbind_parameters(Local<Number> query_id, Local<Object> callback) const;
		Local<Value> cancel(Local<Number> query_id, Local<Object> callback) const ;
		Local<Value> polling_mode(Local<Number> query_id, Local<Boolean> mode, Local<Object> callback) const;
		Local<Value> read_row(Local<Number> query_id, Local<Object> callback) const;
		Local<Value> read_next_result(Local<Number> query_id, Local<Object> callback) const;
		Local<Value> read_column(Local<Number> query_id, Local<Number> number_rows, Local<Object> callback) const;
		Local<Value> open(Local<Object> connection_object, Local<Object> callback, Local<Object> backpointer) const;
		Local<Value> free_statement(Local<Number> query_id, Local<Object> callback) const;

	private:
		shared_ptr<OdbcConnection> connection;
	};
}
//--------------------------------------------------------------------------------------------------------------------------------
// File: OdbcError.cpp
// Contents: Custom errors for this driver
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//--------------------------------------------------------------------------------------------------------------------------------

#include "stdafx.h"

// list of msnodesql specific errors
namespace mssql {

	// error returned when a string returns no data but it's not a NULL field
	// ODBC returns SQL_NO_DATA so we translate this into an error and return it to node.js
    OdbcError OdbcError::NODE_SQL_NO_DATA = OdbcError( "IMNOD", "No data returned", 1, 0, "", "", 0);
}
//--------------------------------------------------------------------------------------------------------------------------------
// File: OdbcError.h
// Contents: Object that represents ODBC errors
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//--------------------------------------------------------------------------------------------------------------------------------

#pragma once

namespace mssql
{
    using namespace std;

    class OdbcError
    {
    public:

        OdbcError( const char* sqlstate, const char* message, SQLINTEGER code, 
                    const int severity, const char* serverName, const char* procName, const unsigned int lineNumber 
        )
           : sqlstate( sqlstate ), message(message), code(code), 
                severity(severity), serverName(serverName), procName(procName), lineNumber(lineNumber)
        {
        }

        const char* Message( void ) const
        {
            return message.c_str();
        }

        const char* SqlState( void ) const
        {
            return sqlstate.c_str();
        }

        SQLINTEGER Code( void ) const
        {
            return code;
        }
        
        int Severity( void ) const
        {
            return severity;
        }

        const char* ServerName( void ) const
        {
            return serverName.c_str();
        }

        const char* ProcName( void ) const
        {
            return procName.c_str();
        }

        unsigned int LineNumber( void ) const
        {
            return lineNumber;
        }

        // list of msnodesql specific errors
        static OdbcError NODE_SQL_NO_DATA;

    private:
        string sqlstate;
        string message; 
        SQLINTEGER code;
        int severity;
        string serverName;
        string procName;
        unsigned int lineNumber;
    };

}
//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcHandle.cpp
// Contents: Object to manage ODBC handles
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#include <OdbcHandle.h>
#include "stdafx.h"
#include <locale>
#include <set>

namespace mssql
{
	OdbcStatementHandle::~OdbcStatementHandle() {
		// cerr << "OdbcStatementHandle::~OdbcStatementHandle " << _statementId << endl; 
	}

	OdbcHandle::OdbcHandle(const SQLSMALLINT ht) 
		: 
		HandleType(ht), 
		handle(nullptr)
	{
		//fprintf(stderr, "OdbcHandle::OdbcHandle %i\n", HandleType);
	}

	OdbcHandle::~OdbcHandle()
	{
	}

	bool OdbcHandle::alloc()
	{
		if (handle) return true;
		assert(handle == SQL_NULL_HANDLE);
		const auto ret = SQLAllocHandle(HandleType, nullptr, &handle);
		if (!SQL_SUCCEEDED(ret))
		{
			handle = nullptr;
			return false;
		}
		return true;
	}
	
	bool OdbcHandle::alloc(const OdbcHandle &parent)
	{
		if (handle) return true;
		assert(handle == SQL_NULL_HANDLE);
		const auto ret = SQLAllocHandle(HandleType, parent, &handle);
		//fprintf(stderr, "Alloc OdbcHandle %i %p\n", HandleType, handle);
		if (!SQL_SUCCEEDED(ret))
		{
			handle = nullptr;
			return false;
		}
		return true;
	}

	void OdbcHandle::free()
	{
		if (handle != nullptr)
		{		
			// cerr << "free hande " << HandleType << " handle " << handle << endl;
			//fprintf(stderr, "destruct OdbcHandle %i %p\n", HandleType, handle);
			SQLFreeHandle(HandleType, handle);	
			handle = nullptr;
		}
	}

	SQLHANDLE OdbcHandle::get() const
	{
		return handle;
	} 

	void OdbcHandle::read_errors(shared_ptr<vector<shared_ptr<OdbcError>>> & errors) const
	{
		SQLSMALLINT msg_len = 0;
		SQLRETURN      rc2;
		SQLINTEGER    native_error = 0;
		vector<SQLWCHAR> msg;
		msg.reserve(2 * 1024);
		msg.resize(2 * 1024);
		vector<SQLWCHAR> sql_state;
		sql_state.reserve(6);
		sql_state.resize(6);
		set<string> received;
		int severity = 0;
		SQLSMALLINT serverName_len = 0;
		vector<SQLWCHAR> serverName;
		serverName.reserve(SQL_MAX_SQLSERVERNAME);
		serverName.resize(SQL_MAX_SQLSERVERNAME);
		SQLSMALLINT procName_len = 0;
		vector<SQLWCHAR> procName;
		procName.reserve(128);
		procName.resize(128);
		unsigned int lineNumber = 0;
		// Get the status records.  
		SQLSMALLINT i = 1;
		errors->clear();
		while ((rc2 = SQLGetDiagRec(HandleType, handle, i,  sql_state.data(), &native_error, msg.data(), msg.capacity(), &msg_len)) != SQL_NO_DATA) {
			if (rc2 < 0) {
				break;
			}
		
			auto c_msg = swcvec2str(msg, msg_len);
			auto c_state = swcvec2str(sql_state, sql_state.size());
			const auto m = string(c_msg);
			SQLGetDiagField(HandleType, handle, i, SQL_DIAG_SS_SEVERITY, &severity, SQL_IS_INTEGER, nullptr);
			SQLGetDiagField(HandleType, handle, i, SQL_DIAG_SS_SRVNAME, serverName.data(), serverName.capacity(), &serverName_len);
			const string c_serverName = swcvec2str(serverName, serverName_len);
			SQLGetDiagField(HandleType, handle, i, SQL_DIAG_SS_PROCNAME, procName.data(), procName.capacity(), &procName_len);
			const string c_procName = swcvec2str(procName, procName_len);
			SQLGetDiagField(HandleType, handle, i, SQL_DIAG_SS_LINE, &lineNumber, SQL_IS_UINTEGER, nullptr);
			if (received.find(m) == received.end()) {
				const auto last = make_shared<OdbcError>(c_state.c_str(), c_msg.c_str(), native_error, severity, c_serverName.c_str(), c_procName.c_str(), lineNumber);
				errors->push_back(last);
				received.insert(m);
			}
			i++;
		}
	}
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcHandle.h
// Contents: Object to manage ODBC handles
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include "stdafx.h"
#include <vector>

namespace mssql
{
    using namespace std;

    class OdbcHandle
    {
    public:
		SQLSMALLINT HandleType;
		OdbcHandle(SQLSMALLINT ht);
		virtual ~OdbcHandle();
		bool alloc();
		bool alloc(const OdbcHandle &parent);
		void free();
		SQLHANDLE get() const;
		operator SQLHANDLE() const { return handle; }
		operator bool() const { return handle != nullptr; }
		void read_errors(shared_ptr<vector<shared_ptr<OdbcError>>> & errors) const;
      
    private:

        void operator=(const OdbcHandle& orig) 
        {
            assert(false);
        }

        SQLHANDLE handle;
    };

	class OdbcEnvironmentHandle : public OdbcHandle
	{
	public:
		OdbcEnvironmentHandle() : OdbcHandle(SQL_HANDLE_ENV)
		{	
		}
	};

	class OdbcConnectionHandle : public OdbcHandle
	{
	public:
		OdbcConnectionHandle() : OdbcHandle(SQL_HANDLE_DBC)
		{
		}
	};

	class OdbcStatementHandle : public OdbcHandle
	{
	public:
		OdbcStatementHandle(long id) : OdbcHandle(SQL_HANDLE_STMT), statementId(id)
		{
		}
		~OdbcStatementHandle();
		long statementId;
	};	
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcConnection.h
// Contents: Async calls to ODBC done in background thread
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

namespace mssql
{
#ifdef WINDOWS_BUILD
#pragma intrinsic( memset )
#endif

	// boilerplate macro for checking if SQL_NO_DATA was returned for field data
#define CHECK_ODBC_NO_DATA( r, handle ) {                                                                 \
    if( r == SQL_NO_DATA ) {                                                                              \
        error = make_shared<OdbcError>( OdbcError::NODE_SQL_NO_DATA.SqlState(), OdbcError::NODE_SQL_NO_DATA.Message(), \
            OdbcError::NODE_SQL_NO_DATA.Code() );                                                         \
        handle.Free();                                                                                    \
        return false;                                                                                     \
             } }

	// to use with numeric_limits below
#undef max

	namespace {

		// max characters within a (var)char field in SQL Server
		const int SQL_SERVER_MAX_STRING_SIZE = 8000;

		// default size to retrieve from a LOB field and we don't know the size
		const int LOB_PACKET_SIZE = 8192;
	}

}
//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcOperation.cpp
// Contents: Functions called by thread queue for background ODBC operations
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#include "stdafx.h"
#include <OdbcOperation.h>
#include <OdbcConnection.h>
#include <OdbcStatement.h>
#include <OdbcStatementCache.h>
#include <iostream>

namespace mssql
{
	OdbcOperation::OdbcOperation(const shared_ptr<OdbcConnection> &connection, const size_t query_id, Local<Object> cb)
		: Nan::AsyncWorker(new Nan::Callback(cb.As<Function>())),
		_connection(connection),
		_statement(nullptr),
		_callback(Isolate::GetCurrent(), cb.As<Function>()),
		_cb(cb),
		_can_lock(true),
		_failed(false),
		_failures(nullptr)	
	{
		_statementId = static_cast<long>(query_id);
		const nodeTypeFactory fact;
		_output_param = fact.null();
	}

	OdbcOperation::OdbcOperation(const size_t query_id, const Local<Object> cb)
	: OdbcOperation(nullptr, -1, cb) {	
	}

	OdbcOperation::OdbcOperation(const shared_ptr<OdbcConnection> & connection, Local<Object> cb)
	: OdbcOperation(connection, -1, cb) {	
	}

	void OdbcOperation::Execute () {
		if (_statement && _can_lock) {
		 	const std::lock_guard<std::mutex> lock(_statement->_statement_mutex);
		// std::cout << " invoke_background .... " << timer.get_counter() << endl;
			_failed = !TryInvokeOdbc();
		} else {
			_failed = !TryInvokeOdbc();
		}
		// std::cout << " .... invoke_background " << timer.get_counter() << endl;
		if (_failed) {
			getFailure();
		}
	}

	void OdbcOperation::HandleOKCallback () {
		if (_callback.IsEmpty()) return;
		Local<Value> args[4];
		const auto argc = _failed ? error(args) : success(args);
		// std::cout << " complete_foreground " << timer.get_counter() << endl;
		//args[argc] = fact.new_number(timer.get_counter());
		Nan::Call(Nan::New(_callback), Nan::GetCurrentContext()->Global(), argc, args);
	}

	OdbcOperation::~OdbcOperation()
	{
		_callback.Reset();
		// int count = _statement.use_count();
		// cerr << "~OdbcOperation statementId " << _statementId << " count " << count << endl;
	}

	bool OdbcOperation::fetch_statement()
	{
		_statement = _connection->getStatamentCache()->checkout(_statementId);
		// int count = _statement.use_count();
		// cerr << "fetch_statement statementId " << _statementId << " count " << count << endl;
		const bool res = _statement ? true : false;
		return res;
	}

	void OdbcOperation::getFailure()
	{
		if (_connection) {
			_failures = _connection->errors();
		}
		if (!_failures || (_failures->empty() && _statement)) {
			_failures = _statement->errors();
		}
		if (!_failures || _failures->empty())
		{
			_failures = make_shared<vector<shared_ptr<OdbcError>>>();
			_failures->push_back(make_shared<OdbcError>("unknown", "internal error", -1, 0, "", "", 0));
		}
	}

	int OdbcOperation::error(Local<Value> args[])
	{
		const nodeTypeFactory fact;
		const unsigned int error_count = _failures ? static_cast<int>(_failures->size()) : 0;
		const auto errors = fact.new_array(error_count);
		for (unsigned int i = 0; i < error_count; ++i)
		{
			const auto failure = (*_failures)[i];
			const auto err = fact.error(failure->Message());
			Nan::Set(err, Nan::New("sqlstate").ToLocalChecked(), Nan::New(failure->SqlState()).ToLocalChecked());
			Nan::Set(err, Nan::New("code").ToLocalChecked(), Nan::New(failure->Code()));
			Nan::Set(err, Nan::New("severity").ToLocalChecked(), Nan::New(failure->Severity()));
			Nan::Set(err, Nan::New("serverName").ToLocalChecked(), Nan::New(failure->ServerName()).ToLocalChecked());
			Nan::Set(err, Nan::New("procName").ToLocalChecked(), Nan::New(failure->ProcName()).ToLocalChecked());
			Nan::Set(err, Nan::New("lineNumber").ToLocalChecked(), Nan::New(failure->LineNumber()));
			Nan::Set(errors, i, err);
		}
		
		auto more = false;
		if (_statement)
		{
			const auto rs = _statement->get_result_set();
			if (rs) more = !rs->EndOfRows();
		}

		args[0] = errors;
		if (more) {
			const auto arg = CreateCompletionArg();
			args[1] = Nan::New<Value>(arg);
		}
		else
		{
			args[1] = fact.new_array();
		}
		args[2] = Nan::New(more);
		constexpr auto argc = 3;
		return argc;
	}

	int OdbcOperation::success(Local<Value> args[])
	{
		args[0] = Nan::New(false);
		const auto arg = CreateCompletionArg();
		args[1] = arg;
		const auto c = _output_param->IsNull() ? 0 : _output_param.As<Array>()->Length();
		if (c > 0) args[2] = _output_param;
		const auto argc = c == 0 ? 2 : 3;
		return argc;
	}
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcOperation.h
// Contents: ODBC Operation objects called on background thread
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include <Operation.h>
#include <nan.h>

namespace mssql
{
	using namespace std;
	using namespace v8;

	class OdbcConnection;
	class OdbcStatement;

	class OdbcOperation : public Nan::AsyncWorker
	{
	public:

		OdbcOperation(size_t query_id, Local<Object> cb);
		OdbcOperation(const shared_ptr<OdbcConnection>& connection, size_t query_id, Local<Object>);
		OdbcOperation(const shared_ptr<OdbcConnection>& connection, Local<Object> cb);

		virtual ~OdbcOperation();
		virtual bool TryInvokeOdbc() = 0;
		virtual Local<Value> CreateCompletionArg() = 0;
		void getFailure();

	protected:

		friend OdbcConnection;
		void Execute ();
		void HandleOKCallback ();
		shared_ptr<OdbcConnection> _connection;
		shared_ptr<OdbcStatement> _statement;
		Persistent<Function> _callback;
		Local<Value> _output_param;
		Local<Object> _cb;
		bool _can_lock;
		bool fetch_statement();
		long _statementId;

	private:

		bool _failed;
		shared_ptr<vector<shared_ptr<OdbcError>>> _failures;
		//clock_capture timer;
		int error(Local<Value> args[]);
		int success(Local<Value> args[]);
	};
}

//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcOperation.h
// Contents: ODBC Operation objects called on background thread
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include <nan.h>
#include <mutex>
#include <queue>

namespace mssql
{
	using namespace std;
	using namespace v8;

	class OdbcConnection;
	class OdbcStatement;
	class OdbcOperation;

	class OdbcOperationQueue
	{
	public:
		OdbcOperationQueue(const shared_ptr<OdbcConnection>& connection);
		void enqueue(shared_ptr<OdbcOperation> op);
		void dispatch();

	private:
		shared_ptr<queue<shared_ptr<OdbcOperation>>> _operations;
		mutex g_i_mutex;
	};	
}

//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcConnection.h
// Contents: Async calls to ODBC done in background thread
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include "OdbcStatement.h"
#include <OdbcConnection.h>

namespace mssql
{
	class OdbcPreparedStatement : public OdbcStatement
	{
	public:
		OdbcPreparedStatement(int statementId, OdbcConnectionHandle &c);
		virtual ~OdbcPreparedStatement();
		bool TryExecute(const std::wstring& query, u_int timeout, BoundDatumSet& paramIt);
	};
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcConnection.cpp
// Contents: Async calls to ODBC done in background thread
//
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#include "stdafx.h"
#include <algorithm>
#include <cmath>
#include <cstring>
#include <OdbcStatement.h>
#include <BoundDatum.h>
#include <BoundDatumSet.h>
#include <NodeColumns.h>
#include <OdbcHelper.h>
#include <QueryOperationParams.h>
#include <ConnectionHandles.h>
#include <iostream>
#include <algorithm>
#include <bcp.h>

#ifdef LINUX_BUILD
#include <unistd.h>
#endif

namespace mssql
{
	// internal constants

	size_t get_size(BoundDatumSet &params)
	{
		const auto f = params.begin();
		if (f == params.end())
			return 0;
		const auto p = *f;
		if (p->is_tvp)
		{
			// return p->param_size;
		}
		const auto size = p->get_ind_vec().size();
		return size;
	}

	OdbcStatement::~OdbcStatement()
	{
		// cerr << "~OdbcStatement() " << _statementId << " " << endl;
		if (_statementState != OdbcStatementState::STATEMENT_CLOSED)
		{
			_statementState = OdbcStatementState::STATEMENT_CLOSED;
		}
	}

	OdbcStatement::OdbcStatement(const long statement_id, shared_ptr<ConnectionHandles> c)
		: _connectionHandles(c),
		  _endOfResults(true),
		  _statementId(static_cast<long>(statement_id)),
		  _prepared(false),
		  _cancelRequested(false),
		  _pollingEnabled(false),
		  _numericStringEnabled(false),
		  _resultset(nullptr),
		  _boundParamsSet(nullptr)
	{
		// cerr << "OdbcStatement() " << _statementId << " " << endl;
		// fprintf(stderr, "OdbcStatement::OdbcStatement OdbcStatement ID = %ld\n ", statement_id);
		_statement = _connectionHandles->checkout(_statementId);
		_errors = make_shared<vector<shared_ptr<OdbcError>>>();
	}

	bool OdbcStatement::try_read_columns(const size_t number_rows)
	{
		if (!_statement)
			return false;
		// fprintf(stderr, "try_read_columns %d\n", number_rows);
		bool res;
		_resultset->start_results();
		if (!_prepared)
		{
			res = fetch_read(number_rows);
		}
		else
		{
			res = prepared_read();
		}
		return res;
	}

	bool OdbcStatement::fetch_read(const size_t number_rows)
	{
		// fprintf(stderr, "fetch_read %d\n", number_rows);
		if (!_statement)
			return false;
		const auto &statement = *_statement;
		auto res = false;
		for (size_t row_id = 0; row_id < number_rows; ++row_id)
		{
			const auto ret = SQLFetch(statement);
			if (ret == SQL_NO_DATA)
			{
				// fprintf(stderr, "fetch_read SQL_NO_DATA\n");
				_resultset->_end_of_rows = true;
				return true;
			}
			if (!check_odbc_error(ret))
			{
				// fprintf(stderr, "fetch_read check_odbc_error\n");
				return false;
			}
			_resultset->_end_of_rows = false;
			res = true;

			// fprintf(stderr, "column_count %d\n", _resultset->get_column_count());
			const auto column_count = static_cast<int>(_resultset->get_column_count());
			for (auto c = 0; c < column_count; ++c)
			{
				const auto &definition = _resultset->get_meta_data(c);
				res = dispatch(definition.dataType, row_id, c);
				if (!res)
				{
					break;
				}
			}
		}
		return res;
	}

	bool OdbcStatement::prepared_read()
	{
		if (!_statement)
			return false;
		// fprintf(stderr, "prepared_read");
		const auto &statement = *_statement;
		SQLSetStmtAttr(statement, SQL_ATTR_ROWS_FETCHED_PTR, &_resultset->_row_count, 0);

		const auto ret = SQLFetchScroll(statement, SQL_FETCH_NEXT, 0);
		// cerr << " row_count " << row_count << endl;
		if (ret == SQL_NO_DATA)
		{
			_resultset->_end_of_rows = true;
			return true;
		}
		_resultset->_end_of_rows = false;
		auto res = true;
		if (!check_odbc_error(ret))
			return false;
		const auto column_count = static_cast<int>(_resultset->get_column_count());
		for (auto c = 0; c < column_count; ++c)
		{
			const auto &definition = _resultset->get_meta_data(c);
			// having bound a block, will collect 50 rows worth of data in 1 call.
			res = dispatch_prepared(definition.dataType, definition.columnSize, _resultset->_row_count, c);
			if (!res)
			{
				res = false;
				break;
			}
		}
		return res;
	}

	Local<Value> OdbcStatement::get_column_values() const
	{
		const nodeTypeFactory fact;
		const auto result = Nan::New<Object>();
		if (_resultset->EndOfRows())
		{
			Nan::Set(result, Nan::New("end_rows").ToLocalChecked(), Nan::New(true));
		}
		// cerr << " get_column_values " << endl;
		const auto number_rows = _resultset->get_result_count();
		const auto column_count = static_cast<int>(_resultset->get_column_count());
		const auto results_array = fact.new_array(static_cast<int>(number_rows));
		const auto data = Nan::New("data").ToLocalChecked();
		Nan::Set(result, data, results_array);
		for (size_t row_id = 0; row_id < number_rows; ++row_id)
		{
			const auto row_array = fact.new_array(column_count);
			Nan::Set(results_array, static_cast<uint32_t>(row_id), row_array);
			for (auto c = 0; c < column_count; ++c)
			{
				Nan::Set(row_array, c, _resultset->get_column(row_id, c)->ToValue());
			}
		}

		return result;
	}

	void OdbcStatement::apply_precision(const shared_ptr<BoundDatum> &datum, const int current_param) const
	{
		/* Modify the fields in the implicit application parameter descriptor */
		SQLHDESC hdesc = nullptr;

		SQLGetStmtAttr(_statement->get(), SQL_ATTR_APP_PARAM_DESC, &hdesc, 0, nullptr);
		SQLSetDescField(hdesc, current_param, SQL_DESC_TYPE, reinterpret_cast<SQLPOINTER>(datum->c_type), 0);
		SQLSetDescField(hdesc, current_param, SQL_DESC_PRECISION, reinterpret_cast<SQLPOINTER>(datum->param_size), 0);
		SQLSetDescField(hdesc, current_param, SQL_DESC_SCALE, reinterpret_cast<SQLPOINTER>(datum->digits), 0);
		SQLSetDescField(hdesc, current_param, SQL_DESC_DATA_PTR, static_cast<SQLPOINTER>(datum->buffer), 0);
	}

	// this will show on a different thread to the current executing query.
	bool OdbcStatement::cancel()
	{
		lock_guard<mutex> lock(g_i_mutex);
		if (_pollingEnabled)
		{
			_cancelRequested = true;
			return true;
		}
		SQLINTEGER native_error = -1;
		const auto *c_state = "CANCEL";
		const auto *c_msg = "Error: [msnodesql] cancel only supported for statements where polling is enabled.";
		_errors->push_back(make_shared<OdbcError>(c_state, c_msg, native_error, 0, "", "", 0));
		return false;
	}

	bool OdbcStatement::set_polling(const bool mode)
	{
		lock_guard<mutex> lock(g_i_mutex);
		_pollingEnabled = mode;
		return true;
	}

	bool OdbcStatement::set_numeric_string(const bool mode)
	{
		lock_guard<mutex> lock(g_i_mutex);
		_numericStringEnabled = mode;
		return true;
	}

	bool OdbcStatement::bind_tvp(vector<tvp_t> &tvps)
	{
		if (!_statement)
			return false;
		const auto &statement = *_statement;
		for (const auto &tvp : tvps)
		{
			auto tvpret = SQLSetStmtAttr(statement, SQL_SOPT_SS_PARAM_FOCUS,
										 reinterpret_cast<SQLPOINTER>(static_cast<long long>(tvp.first)), SQL_IS_INTEGER);
			if (!check_odbc_error(tvpret))
			{
				return false;
			}
			auto current_param = 1;
			const auto col_set = tvp.second;
			for (auto &col_itr : *col_set)
			{
				bind_datum(current_param, col_itr);
				current_param++;
			}
			tvpret = SQLSetStmtAttr(statement, SQL_SOPT_SS_PARAM_FOCUS,
									static_cast<SQLPOINTER>(nullptr), SQL_IS_INTEGER);
			if (!check_odbc_error(tvpret))
			{
				return false;
			}
		}
		return true;
	}

	bool OdbcStatement::bind_datum(const int current_param, const shared_ptr<BoundDatum> &datum)
	{
		if (!_statement)
			return false;
		const auto &statement = *_statement;
		auto r = SQLBindParameter(statement, static_cast<SQLUSMALLINT>(current_param), datum->param_type, datum->c_type, datum->sql_type,
								  datum->param_size, datum->digits, datum->buffer, datum->buffer_len,
								  datum->get_ind_vec().data());
		if (!check_odbc_error(r))
		{
			return false;
		}
		if (datum->get_defined_precision())
		{
			apply_precision(datum, current_param);
		}
		const auto name = datum->name;
		if (!name.empty())
		{
			SQLINTEGER string_length = 0;
			SQLHANDLE ipd = nullptr;
			auto *const name_ptr = const_cast<wchar_t *>(name.c_str());
			r = SQLGetStmtAttr(statement, SQL_ATTR_IMP_PARAM_DESC, &ipd, SQL_IS_POINTER, &string_length);
			if (!check_odbc_error(r))
				return false;
			SQLSetDescField(ipd, current_param, SQL_DESC_NAME, name_ptr, name.size() * sizeof(wchar_t));
			if (!check_odbc_error(r))
				return false;
		}

		return true;
	}

	void OdbcStatement::queue_tvp(int current_param, param_bindings::iterator &itr, shared_ptr<BoundDatum> &datum, vector<tvp_t> &tvps)
	{
		if (!_statement)
			return;
		SQLHANDLE ipd = nullptr;
		const auto &statement = *_statement;
		SQLINTEGER string_length = 0;
		auto r = SQLGetStmtAttr(statement, SQL_ATTR_IMP_PARAM_DESC, &ipd, SQL_IS_POINTER, &string_length);
		if (!check_odbc_error(r))
			return;
		const auto &schema = datum->get_storage()->schema;
		if (!schema.empty())
		{
			auto schema_vec = wstr2wcvec(schema);
			r = SQLSetDescField(ipd, current_param, SQL_CA_SS_SCHEMA_NAME, reinterpret_cast<SQLPOINTER>(schema_vec.data()), schema_vec.size() * 2);
			if (!check_odbc_error(r))
				return;
		}
		tvp_t tvp;
		const auto cols = make_shared<BoundDatumSet::param_bindings>();
		for (auto c = 1; c <= datum->tvp_no_cols; ++c)
		{
			++itr;
			const auto &col_datum = *itr;
			cols->push_back(col_datum);
		}
		tvps.emplace_back(current_param, cols);
	}

	// bind all the parameters in the array
	bool OdbcStatement::bind_params(const shared_ptr<BoundDatumSet> &params)
	{
		if (!_statement)
			return false;
		auto &ps = *params;
		// fprintf(stderr, "bind_params\n");
		const auto size = get_size(ps);
		if (size <= 0)
			return true;
		const auto &statement = *_statement;
		if (size > 1)
		{
			const auto ret = SQLSetStmtAttr(statement, SQL_ATTR_PARAMSET_SIZE, reinterpret_cast<SQLPOINTER>(size), 0);
			if (!check_odbc_error(ret))
			{
				return false;
			}
		}
		auto current_param = 1;

		vector<tvp_t> tvps;
		for (auto itr = ps.begin(); itr != ps.end(); ++itr)
		{
			auto &datum = *itr;
			if (!bind_datum(current_param, datum))
			{
				return false;
			}
			if (datum->is_tvp)
			{
				queue_tvp(current_param, itr, datum, tvps);
			}
			++current_param;
		}
		bind_tvp(tvps);

		return true;
	}

	Local<Array> OdbcStatement::unbind_params() const
	{
		if (_boundParamsSet != nullptr)
		{
			return _boundParamsSet->unbind();
		}
		const nodeTypeFactory fact;
		const auto arr = fact.new_array(0);
		return arr;
	}

	Local<Value> OdbcStatement::get_meta_value() const
	{
		if (_cancelRequested || _resultset == nullptr)
		{
			const nodeTypeFactory fact;
			const auto metadata = fact.new_array();
			return metadata;
		}
		return _resultset->meta_to_value();
	}

	bool OdbcStatement::end_of_results() const
	{
		return _endOfResults;
	}

	Local<Value> OdbcStatement::handle_end_of_results() const
	{
		return Nan::New(_endOfResults);
	}

	Local<Value> OdbcStatement::end_of_rows() const
	{
		return Nan::New(_resultset->EndOfRows());
	}

	bool OdbcStatement::return_odbc_error()
	{
		if (!_statement)
			return false;
		_statement->read_errors(_errors);
		return false;
	}

	bool OdbcStatement::check_odbc_error(const SQLRETURN ret)
	{
		if (!SQL_SUCCEEDED(ret))
		{
			_statementState = OdbcStatementState::STATEMENT_ERROR;
			return return_odbc_error();
		}
		return true;
	}

	bool OdbcStatement::read_col_attributes(ResultSet::ColumnDefinition &current, const int column)
	{
		constexpr size_t l = 1024;
		vector<SQLWCHAR> type_name(l);
		SQLSMALLINT type_name_len = 0;
		const auto index = column + 1;
		auto ret = SQLColAttribute(*_statement, index, SQL_DESC_TYPE_NAME, type_name.data(), type_name.size(), &type_name_len, nullptr);
		if (!check_odbc_error(ret))
			return false;

		current.dataTypeName = swcvec2str(type_name, type_name_len);
		// wcerr << "type_name_len " << current.dataTypeName << endl;
		switch (current.dataType)
		{
		case SQL_SS_VARIANT:
		{
			// dispatch as variant type which reads underlying column type and re-reads correctly.
		}
		break;

		case SQL_SS_UDT:
		{
			vector<SQLWCHAR> udt_type_name(l);
			SQLSMALLINT udt_type_name_len = 0;
			ret = SQLColAttribute(*_statement, index, SQL_CA_SS_UDT_TYPE_NAME, udt_type_name.data(), udt_type_name.size(), &udt_type_name_len,
								  nullptr);
			if (!check_odbc_error(ret))
				return false;
			current.udtTypeName = swcvec2str(udt_type_name, udt_type_name_len);
		}
		break;

		default:
			break;
		}

		return true;
	}

	bool OdbcStatement::read_next(const int column)
	{
		if (!_statement)
			return false;
		const auto &statement = *_statement;
		SQLSMALLINT name_length = 1024;
		const auto index = column + 1;
		auto &current = _resultset->get_meta_data(column);
		const auto l = name_length + static_cast<SQLSMALLINT>(1);
		vector<SQLWCHAR> buffer(l);
		auto ret = SQLDescribeCol(statement, index, buffer.data(), buffer.size(), &name_length, &current.dataType,
								  &current.columnSize, &current.decimalDigits, &current.nullable);
		if (!check_odbc_error(ret))
			return false;
		const auto s = swcvec2str(buffer, name_length);
		current.name = s;
		// wcerr << "read_next " << column << " name = " << current.name << endl;
		ret = read_col_attributes(current, column);
		if (!check_odbc_error(ret))
			return false;

		return ret;
	}

	bool OdbcStatement::start_reading_results()
	{
		if (!_statement)
			return false;
		if (_cancelRequested)
		{
			_resultset = make_unique<ResultSet>(0);
			return true;
		}
		SQLSMALLINT columns = 0;
		const auto &statement = *_statement;
		auto ret = SQLNumResultCols(statement, &columns);
		if (!check_odbc_error(ret))
			return false;

		auto column = 0;
		_resultset = make_unique<ResultSet>(columns);
		const auto cols = static_cast<int>(_resultset->get_column_count());
		// cerr << "start_reading_results. cols = " << cols << " " << endl;
		while (column < cols)
		{
			if (!read_next(column++))
			{
				return false;
			}
		}

		ret = SQLRowCount(statement, &_resultset->_row_count);
		// cerr << "start_reading_results. row count = " << _resultset->_row_count << " " << endl;
		return check_odbc_error(ret);
	}

	SQLRETURN OdbcStatement::query_timeout(const int timeout)
	{
		const auto &statement = *_statement;
		if (timeout > 0)
		{
			auto *const to = reinterpret_cast<SQLPOINTER>(static_cast<long long>(timeout));
			const auto ret = SQLSetStmtAttr(statement, SQL_QUERY_TIMEOUT, to, SQL_IS_UINTEGER);
			if (!check_odbc_error(ret))
				return false;
			SQLSetStmtAttr(statement, SQL_ATTR_QUERY_TIMEOUT, to, SQL_IS_UINTEGER);
			if (!check_odbc_error(ret))
				return false;
		}
		return true;
	}

	bool OdbcStatement::try_prepare(const shared_ptr<QueryOperationParams> &q)
	{
		if (!_statement)
			return false;
		const auto &statement = *_statement;
		_query = q;
		const auto query = q->query_string();
		SQLSMALLINT num_cols = 0;

		auto ret = SQLPrepare(statement, reinterpret_cast<SQLWCHAR *>(query->data()), query->size());
		if (!check_odbc_error(ret))
			return false;

		ret = SQLNumResultCols(statement, &num_cols);
		if (!check_odbc_error(ret))
			return false;

		_preparedStorage = make_shared<BoundDatumSet>(q);
		_resultset = make_unique<ResultSet>(num_cols);

		for (auto i = 0; i < num_cols; i++)
		{
			read_next(i);
		}

		SQLSetStmtAttr(statement, SQL_ATTR_ROW_ARRAY_SIZE, reinterpret_cast<SQLPOINTER>(prepared_rows_to_bind), 0);
		_preparedStorage->reserve(_resultset, prepared_rows_to_bind);

		auto i = 0;
		for (const auto &datum : *_preparedStorage)
		{
			ret = SQLBindCol(statement, static_cast<SQLUSMALLINT>(i + 1), datum->c_type, datum->buffer, datum->buffer_len, datum->get_ind_vec().data());
			if (!check_odbc_error(ret))
				return false;
			++i;
		}

		_resultset->_end_of_rows = true;
		_prepared = true;

		_statementState = OdbcStatementState::STATEMENT_PREPARED;

		return true;
	}

	SQLRETURN OdbcStatement::poll_check(SQLRETURN ret, shared_ptr<vector<uint16_t>> query, const bool direct)
	{
		const auto &statement = *_statement;

		if (ret == SQL_STILL_EXECUTING)
		{
			while (true)
			{
				if (direct)
				{
					ret = SQLExecDirect(statement, reinterpret_cast<SQLWCHAR *>(query->data()), SQL_NTS);
				}
				else
				{
					ret = SQLExecute(statement);
				}

				bool submit_cancel;
				if (ret != SQL_STILL_EXECUTING)
				{
					break;
				}

#if defined(WINDOWS_BUILD)
				Sleep(1); // wait 1 MS
#endif
#if defined(LINUX_BUILD)
				usleep(1000); // wait 1 MS
#endif
				{
					lock_guard<mutex> lock(g_i_mutex);
					submit_cancel = _cancelRequested;
				}

				if (submit_cancel)
				{
					cancel_handle();
				}
			}
		}
		return ret;
	}

	bool OdbcStatement::raise_cancel()
	{
		_resultset = make_unique<ResultSet>(0);
		_resultset->_end_of_rows = true;
		_endOfResults = true; // reset
		const string c_msg = "[Microsoft] Operation canceled";
		const string c_state = "U00000";
		const auto last = make_shared<OdbcError>(c_state.c_str(), c_msg.c_str(), 0, 0, "", "", 0);
		_errors->push_back(last);
		return true;
	}

	bool OdbcStatement::try_bcp(const shared_ptr<BoundDatumSet> &param_set, int32_t version)
	{
		// cerr << "bcp version " << version << endl;
		if (version == 0) version = 17;
		bcp b(param_set, _connectionHandles->connectionHandle());
		const auto ret = b.insert(version);
		_resultset = make_unique<ResultSet>(0);
		_resultset->_end_of_rows = true;
		_errors->clear();
		copy(b._errors->begin(), b._errors->end(), back_inserter(*_errors));
		return ret > 0;
	}

	bool OdbcStatement::bind_fetch(const shared_ptr<BoundDatumSet> &param_set)
	{
		if (!_statement)
			return false;
		const auto &statement = *_statement;
		bool polling_mode;
		{
			lock_guard<mutex> lock(g_i_mutex);
			polling_mode = _pollingEnabled;
		}
		const auto bound = bind_params(param_set);
		if (!bound)
		{
			// error already set in BindParams
			return false;
		}
		if (polling_mode)
		{
			const auto s = SQLSetStmtAttr(statement, SQL_ATTR_ASYNC_ENABLE, reinterpret_cast<SQLPOINTER>(SQL_ASYNC_ENABLE_ON), 0);
			if (!check_odbc_error(s))
			{
				return false;
			}
		}

		auto ret = SQLExecute(statement);
		if (polling_mode)
		{
			const auto vec = make_shared<vector<uint16_t>>();
			ret = poll_check(ret, vec, false);
		}

		if (_statementState == OdbcStatementState::STATEMENT_CANCELLED)
		{
			return raise_cancel();
		}

		if (ret == SQL_NO_DATA)
		{
			_resultset = make_unique<ResultSet>(0);
			_resultset->_end_of_rows = true;
			return true;
		}

		if (!check_odbc_error(ret))
			return false;

		ret = SQLRowCount(statement, &_resultset->_row_count);
		return check_odbc_error(ret);
	}

	bool OdbcStatement::cancel_handle()
	{
		if (!_statement)
			return false;
		const auto &hnd = *_statement;
		const auto ret2 = SQLCancelHandle(hnd.HandleType, hnd.get());
		if (!check_odbc_error(ret2))
		{
			// fprintf(stderr, "cancel req failed state %d %ld \n", _statementState, _statementId);
			return false;
		}
		{
			lock_guard<mutex> lock(g_i_mutex);
			_cancelRequested = false;
		}
		return true;
	}

	bool OdbcStatement::try_execute_direct(const shared_ptr<QueryOperationParams> &q, const shared_ptr<BoundDatumSet> &param_set)
	{
		if (!_statement)
			return false;
		// cout << "id " << _statementId << " try_execute_direct" << endl;
		_errors->clear();
		_query = q;
		const auto timeout = q->timeout();
		auto &pars = *param_set;

		if (pars.size() > 0)
		{
			const auto &first = (*param_set).atIndex(0);
			if (first->is_bcp)
			{
				return try_bcp(param_set, first->bcp_version);
			}
		}

		const auto bound = bind_params(param_set);
		if (!bound)
		{
			// error already set in BindParams
			return false;
		}
		bool polling_mode;
		{
			lock_guard<mutex> lock(g_i_mutex);
			polling_mode = _pollingEnabled;
		}
		_endOfResults = true; // reset
		auto ret = query_timeout(timeout);
		if (!check_odbc_error(ret))
			return false;
		const auto query = q->query_string();
		_statementState = OdbcStatementState::STATEMENT_SUBMITTED;
		if (polling_mode)
		{
			SQLSetStmtAttr(*_statement, SQL_ATTR_ASYNC_ENABLE, reinterpret_cast<SQLPOINTER>(SQL_ASYNC_ENABLE_ON), 0);
		}
		ret = SQLExecDirect(*_statement, reinterpret_cast<SQLWCHAR *>(query->data()), query->size());
		if (polling_mode)
		{
			ret = poll_check(ret, query, true);
		}

		if (_statementState == OdbcStatementState::STATEMENT_CANCELLED)
		{
			return raise_cancel();
		}

		// cerr << "ret = " << ret << endl;
		if (ret == SQL_NO_DATA)
		{
			// cerr << "no data = " << ret << endl;
			start_reading_results();
			_resultset = make_unique<ResultSet>(0);
			_resultset->_end_of_rows = true;
			return true;
		}

		if (!SQL_SUCCEEDED(ret))
		{
			// cerr << "SQL_SUCCEEDED = " << ret << endl;
			return_odbc_error();
			_resultset = make_unique<ResultSet>(0);
			_resultset->_end_of_rows = true;
			return false;
		}

		if (ret == SQL_SUCCESS_WITH_INFO)
		{
			return_odbc_error();
			_boundParamsSet = param_set;
			if (start_reading_results())
			{
				_resultset->_end_of_rows = false;
			}
			else
			{
				_resultset = make_unique<ResultSet>(0);
				_resultset->_end_of_rows = true;
			}
			// cout << "id " << _statementId << "SQL_SUCCESS_WITH_INFO = " << ret << endl;
			return false;
		}
		_boundParamsSet = param_set;
		// cout << "id " << _statementId << " start_reading_results ret " << ret << endl;
		return start_reading_results();
	}

	bool OdbcStatement::dispatch_prepared(const SQLSMALLINT t, const size_t column_size, const size_t rows_read, const size_t column) const
	{
		auto res = false;
		switch (t)
		{
		case SQL_SS_VARIANT:
			// res = d_variant(row_id, column);
			break;

		case SQL_CHAR:
		case SQL_VARCHAR:
		case SQL_LONGVARCHAR:
		case SQL_WCHAR:
		case SQL_WVARCHAR:
		case SQL_WLONGVARCHAR:
		case SQL_SS_XML:
		case SQL_GUID:
			res = reserved_string(rows_read, column_size, column);
			break;

		case SQL_BIT:
			res = reserved_bit(rows_read, column);
			break;

		case SQL_SMALLINT:
		case SQL_TINYINT:
		case SQL_INTEGER:
		case SQL_C_SLONG:
		case SQL_C_SSHORT:
		case SQL_C_STINYINT:
		case SQL_C_ULONG:
		case SQL_C_USHORT:
		case SQL_C_UTINYINT:
			res = reserved_int(rows_read, column);
			break;

		case SQL_BIGINT:
			res = reserved_big_int(rows_read, column);
			break;

		case SQL_DECIMAL:
		case SQL_NUMERIC:
		case SQL_REAL:
		case SQL_FLOAT:
		case SQL_DOUBLE:
			res = reserved_decimal(rows_read, column);
			break;

		case SQL_BINARY:
		case SQL_VARBINARY:
		case SQL_LONGVARBINARY:
		case SQL_SS_UDT:
			res = reserved_binary(rows_read, column_size, column);
			break;

		case SQL_SS_TIMESTAMPOFFSET:
			res = reserved_timestamp_offset(rows_read, column);
			break;

		case SQL_TYPE_TIME:
		case SQL_SS_TIME2:
			res = reserved_time(rows_read, column);
			break;

		case SQL_TIMESTAMP:
		case SQL_DATETIME:
		case SQL_TYPE_TIMESTAMP:
		case SQL_TYPE_DATE:
			res = reserved_timestamp(rows_read, column);
			break;

		default:
			res = reserved_string(rows_read, column_size, column);
			break;
		}

		return res;
	}

	bool OdbcStatement::dispatch(const SQLSMALLINT t, const size_t row_id, const size_t column)
	{
		if (!_statement)
			return false;
		// cerr << " dispatch row = " << row_id << endl;
		bool res;
		switch (t)
		{
		case SQL_SS_VARIANT:
			res = d_variant(row_id, column);
			break;

		case SQL_CHAR:
		case SQL_VARCHAR:
		case SQL_LONGVARCHAR:
		case SQL_WCHAR:
		case SQL_WVARCHAR:
		case SQL_WLONGVARCHAR:
		case SQL_SS_XML:
		case SQL_GUID:
			res = try_read_string(false, row_id, column);
			break;

		case SQL_BIT:
			res = get_data_bit(row_id, column);
			break;

		case SQL_SMALLINT:
		case SQL_TINYINT:
		case SQL_INTEGER:
		case SQL_C_SLONG:
		case SQL_C_SSHORT:
		case SQL_C_STINYINT:
		case SQL_C_ULONG:
		case SQL_C_USHORT:
		case SQL_C_UTINYINT:
			if (_numericStringEnabled)
			{
				res = try_read_string(false, row_id, column);
			}
			else
			{
				res = get_data_long(row_id, column);
			}
			break;

		case SQL_C_SBIGINT:
		case SQL_C_UBIGINT:
		case SQL_BIGINT:
			if (_numericStringEnabled)
			{
				res = try_read_string(false, row_id, column);
			}
			else
			{
				res = get_data_big_int(row_id, column);
			}
			break;

		case SQL_NUMERIC:
			if (_numericStringEnabled)
			{
				res = try_read_string(false, row_id, column);
			}
			else
			{
				res = get_data_decimal(row_id, column);
			}
			break;

		case SQL_DECIMAL:
		case SQL_REAL:
		case SQL_FLOAT:
		case SQL_DOUBLE:
			res = get_data_decimal(row_id, column);
			break;

		case SQL_BINARY:
		case SQL_VARBINARY:
		case SQL_LONGVARBINARY:
		case SQL_SS_UDT:
			res = get_data_binary(row_id, column);
			break;

		case SQL_SS_TIMESTAMPOFFSET:
			res = get_data_timestamp_offset(row_id, column);
			break;

		case SQL_TYPE_TIME:
		case SQL_SS_TIME2:
			res = d_time(row_id, column);
			break;

		case SQL_TIMESTAMP:
		case SQL_DATETIME:
		case SQL_TYPE_TIMESTAMP:
		case SQL_TYPE_DATE:
			res = get_data_timestamp(row_id, column);
			break;

		default:
			res = try_read_string(false, row_id, column);
			break;
		}

		return res;
	}

	bool OdbcStatement::d_variant(const size_t row_id, const size_t column)
	{
		const auto &statement = *_statement;
		SQLLEN variant_type = 0;
		SQLLEN iv = 0;
		char b = 0;
		// Figure out the length
		auto ret = SQLGetData(statement, static_cast<SQLSMALLINT>(column + 1), SQL_C_BINARY, &b, 0, &iv);
		if (!check_odbc_error(ret))
			return false;
		// Figure out the type
		ret = SQLColAttribute(statement, column + 1, SQL_CA_SS_VARIANT_TYPE, nullptr, 0, nullptr, &variant_type);
		if (!check_odbc_error(ret))
			return false;
		// set the definiton to actual data underlying data type.
		auto &definition = _resultset->get_meta_data(static_cast<int>(column));
		definition.dataType = static_cast<SQLSMALLINT>(variant_type);
		const auto res = dispatch(definition.dataType, row_id, column);
		return res;
	}

	bool OdbcStatement::d_time(const size_t row_id, const size_t column)
	{
		const auto &statement = *_statement;
		SQLLEN str_len_or_ind_ptr = 0;
		SQL_SS_TIME2_STRUCT time = {};

		const auto ret = SQLGetData(statement, static_cast<SQLSMALLINT>(column + 1), SQL_C_DEFAULT, &time, sizeof(time), &str_len_or_ind_ptr);
		if (!check_odbc_error(ret))
			return false;
		if (str_len_or_ind_ptr == SQL_NULL_DATA)
		{
			_resultset->add_column(row_id, make_shared<NullColumn>(column));
			return true;
		}

		SQL_SS_TIMESTAMPOFFSET_STRUCT datetime = {};
		datetime.year = SQL_SERVER_DEFAULT_YEAR;
		datetime.month = SQL_SERVER_DEFAULT_MONTH;
		datetime.day = SQL_SERVER_DEFAULT_DAY;
		datetime.hour = time.hour;
		datetime.minute = time.minute;
		datetime.second = time.second;
		datetime.fraction = time.fraction;

		_resultset->add_column(row_id, make_shared<TimestampColumn>(column, datetime));
		return true;
	}

	bool OdbcStatement::get_data_timestamp_offset(const size_t row_id, const size_t column)
	{
		const auto &statement = *_statement;
		const auto storage = make_shared<DatumStorage>();
		storage->ReserveTimestampOffset(1);
		SQLLEN str_len_or_ind_ptr = 0;

		const auto ret = SQLGetData(statement, static_cast<SQLSMALLINT>(column + 1), SQL_C_DEFAULT, storage->timestampoffsetvec_ptr->data(),
									sizeof(SQL_SS_TIMESTAMPOFFSET_STRUCT), &str_len_or_ind_ptr);
		if (!check_odbc_error(ret))
			return false;
		if (str_len_or_ind_ptr == SQL_NULL_DATA)
		{
			_resultset->add_column(row_id, make_shared<NullColumn>(column));
			return true; // break
		}
		_resultset->add_column(row_id, make_shared<TimestampColumn>(column, storage));
		return true;
	}

	bool OdbcStatement::get_data_timestamp(const size_t row_id, const size_t column)
	{
		const auto &statement = *_statement;
		SQLLEN str_len_or_ind_ptr = 0;
		TIMESTAMP_STRUCT v;
		const auto ret = SQLGetData(statement, static_cast<SQLSMALLINT>(column + 1), SQL_C_TIMESTAMP, &v,
									sizeof(TIMESTAMP_STRUCT), &str_len_or_ind_ptr);
		if (!check_odbc_error(ret))
			return false;
		if (str_len_or_ind_ptr == SQL_NULL_DATA)
		{
			_resultset->add_column(row_id, make_shared<NullColumn>(column));
			return true; // break
		}
		_resultset->add_column(row_id, make_shared<TimestampColumn>(column, v));
		return true;
	}

	bool OdbcStatement::get_data_big_int(const size_t row_id, const size_t column)
	{
		const auto &statement = *_statement;
		DatumStorage::bigint_t v = 0;
		SQLLEN str_len_or_ind_ptr = 0;
		const auto ret = SQLGetData(statement, static_cast<SQLSMALLINT>(column + 1), SQL_C_SBIGINT, &v, sizeof(DatumStorage::bigint_t),
									&str_len_or_ind_ptr);
		if (!check_odbc_error(ret))
			return false;
		if (str_len_or_ind_ptr == SQL_NULL_DATA)
		{
			_resultset->add_column(row_id, make_shared<NullColumn>(column));
			return true;
		}
		auto col = make_shared<BigIntColumn>(column, v);
		if (_numericStringEnabled)
		{
			col->AsString();
		}
		_resultset->add_column(row_id, col);
		return true;
	}

	bool OdbcStatement::get_data_long(const size_t row_id, const size_t column)
	{
		const auto &statement = *_statement;

		long v = 0;
		SQLLEN str_len_or_ind_ptr = 0;
		const auto ret = SQLGetData(statement, static_cast<SQLSMALLINT>(column + 1), SQL_C_SLONG, &v, sizeof(int64_t),
									&str_len_or_ind_ptr);
		if (!check_odbc_error(ret))
			return false;
		if (str_len_or_ind_ptr == SQL_NULL_DATA)
		{
			_resultset->add_column(row_id, make_shared<NullColumn>(column));
			return true;
		}
		auto col = make_shared<IntColumn>(column, v);
		if (_numericStringEnabled)
		{
			col->AsString();
		}
		_resultset->add_column(row_id, col);
		return true;
	}

	bool OdbcStatement::get_data_bit(const size_t row_id, const size_t column)
	{
		const auto &statement = *_statement;
		char v = 0;
		SQLLEN str_len_or_ind_ptr = 0;
		const auto ret = SQLGetData(statement, static_cast<SQLSMALLINT>(column + 1), SQL_C_BIT, &v, sizeof(char),
									&str_len_or_ind_ptr);
		if (!check_odbc_error(ret))
			return false;
		if (str_len_or_ind_ptr == SQL_NULL_DATA)
		{
			_resultset->add_column(row_id, make_shared<NullColumn>(column));
			return true;
		}
		_resultset->add_column(row_id, make_shared<BoolColumn>(column, v));
		return true;
	}

	bool OdbcStatement::reserved_bit(const size_t row_count, const size_t column) const
	{
		const auto &bound_datum = _preparedStorage->atIndex(static_cast<int>(column));
		const auto &ind = bound_datum->get_ind_vec();
		const auto storage = bound_datum->get_storage();
		for (size_t row_id = 0; row_id < row_count; ++row_id)
		{
			const auto str_len_or_ind_ptr = ind[row_id];
			if (str_len_or_ind_ptr == SQL_NULL_DATA)
			{
				_resultset->add_column(row_id, make_shared<NullColumn>(column));
				continue;
			}
			auto v = (*storage->charvec_ptr)[row_id];
			_resultset->add_column(row_id, make_shared<BoolColumn>(column, v));
		}
		return true;
	}

	bool OdbcStatement::reserved_big_int(const size_t row_count, const size_t column) const
	{
		const auto &bound_datum = _preparedStorage->atIndex(static_cast<int>(column));
		const auto &ind = bound_datum->get_ind_vec();
		const auto storage = bound_datum->get_storage();
		for (size_t row_id = 0; row_id < row_count; ++row_id)
		{
			auto v = (*storage->bigint_vec_ptr)[row_id];
			const auto str_len_or_ind_ptr = ind[row_id];
			if (str_len_or_ind_ptr == SQL_NULL_DATA)
			{
				_resultset->add_column(row_id, make_shared<NullColumn>(column));
				continue;
			}
			auto col = make_shared<BigIntColumn>(column, v);
			if (_numericStringEnabled)
			{
				col->AsString();
			}
			_resultset->add_column(row_id, col);
		}
		return true;
	}

	bool OdbcStatement::reserved_int(const size_t row_count, const size_t column) const
	{
		const auto &bound_datum = _preparedStorage->atIndex(static_cast<int>(column));
		const auto &ind = bound_datum->get_ind_vec();
		const auto storage = bound_datum->get_storage();
		for (size_t row_id = 0; row_id < row_count; ++row_id)
		{
			auto v = (*storage->int64vec_ptr)[row_id];
			const auto str_len_or_ind_ptr = ind[row_id];
			if (str_len_or_ind_ptr == SQL_NULL_DATA)
			{
				_resultset->add_column(row_id, make_shared<NullColumn>(column));
				continue;
			}
			auto col = make_shared<IntColumn>(column, v);
			if (_numericStringEnabled)
			{
				col->AsString();
			}
			_resultset->add_column(row_id, col);
		}
		return true;
	}

	bool OdbcStatement::reserved_decimal(const size_t row_count, const size_t column) const
	{
		const auto &bound_datum = _preparedStorage->atIndex(static_cast<int>(column));
		const auto &ind = bound_datum->get_ind_vec();
		const auto storage = bound_datum->get_storage();
		for (size_t row_id = 0; row_id < row_count; ++row_id)
		{
			auto v = (*storage->doublevec_ptr)[row_id];
			const auto str_len_or_ind_ptr = ind[row_id];
			if (str_len_or_ind_ptr == SQL_NULL_DATA)
			{
				_resultset->add_column(row_id, make_shared<NullColumn>(column));
				continue;
			}
			auto v2 = trunc(v);
			if (v2 == v &&
				v2 >= static_cast<long double>(numeric_limits<DatumStorage::bigint_t>::min()) &&
				v2 <= static_cast<long double>(numeric_limits<DatumStorage::bigint_t>::max()))
			{
				auto bi = (DatumStorage::bigint_t)v;
				auto col = make_shared<BigIntColumn>(column, bi);
				if (_numericStringEnabled)
				{
					col->AsString();
				}
				_resultset->add_column(row_id, col);
			}
			else
			{
				auto col = make_shared<NumberColumn>(column, v);
				if (_numericStringEnabled)
				{
					col->AsString();
				}
				_resultset->add_column(row_id, col);
			}
		}
		return true;
	}

	bool OdbcStatement::reserved_timestamp(const size_t row_count, const size_t column) const
	{
		const auto &bound_datum = _preparedStorage->atIndex(static_cast<int>(column));
		const auto &ind = bound_datum->get_ind_vec();
		const auto storage = bound_datum->get_storage();
		for (size_t row_id = 0; row_id < row_count; ++row_id)
		{
			auto v = (*storage->timestampvec_ptr)[row_id];
			const auto str_len_or_ind_ptr = ind[row_id];
			if (str_len_or_ind_ptr == SQL_NULL_DATA)
			{
				_resultset->add_column(row_id, make_shared<NullColumn>(column));
				continue;
			}
			_resultset->add_column(row_id, make_shared<TimestampColumn>(column, v));
		}
		return true;
	}

	bool OdbcStatement::reserved_timestamp_offset(const size_t row_count, const size_t column) const
	{
		const auto &bound_datum = _preparedStorage->atIndex(static_cast<int>(column));
		const auto &ind = bound_datum->get_ind_vec();
		const auto storage = bound_datum->get_storage();
		for (size_t row_id = 0; row_id < row_count; ++row_id)
		{
			auto v = (*storage->timestampoffsetvec_ptr)[row_id];
			const auto str_len_or_ind_ptr = ind[row_id];
			if (str_len_or_ind_ptr == SQL_NULL_DATA)
			{
				_resultset->add_column(row_id, make_shared<NullColumn>(column));
				continue;
			}
			_resultset->add_column(row_id, make_shared<TimestampColumn>(column, v));
		}
		return true;
	}

	bool OdbcStatement::reserved_time(const size_t row_count, const size_t column) const
	{
		const auto &bound_datum = _preparedStorage->atIndex(static_cast<int>(column));
		const auto &ind = bound_datum->get_ind_vec();
		const auto storage = bound_datum->get_storage();
		for (size_t row_id = 0; row_id < row_count; ++row_id)
		{
			const auto &time = (*storage->time2vec_ptr)[row_id];
			const auto str_len_or_ind_ptr = ind[row_id];
			if (str_len_or_ind_ptr == SQL_NULL_DATA)
			{
				_resultset->add_column(row_id, make_shared<NullColumn>(column));
				continue;
			}

			SQL_SS_TIMESTAMPOFFSET_STRUCT datetime = {};
			datetime.year = SQL_SERVER_DEFAULT_YEAR;
			datetime.month = SQL_SERVER_DEFAULT_MONTH;
			datetime.day = SQL_SERVER_DEFAULT_DAY;
			datetime.hour = time.hour;
			datetime.minute = time.minute;
			datetime.second = time.second;
			datetime.fraction = time.fraction;

			_resultset->add_column(row_id, make_shared<TimestampColumn>(column, datetime));
		}
		return true;
	}

	bool OdbcStatement::get_data_numeric(const size_t row_id, const size_t column)
	{
		const auto &statement = *_statement;
		SQLLEN str_len_or_ind_ptr = 0;
		SQL_NUMERIC_STRUCT v;
		const auto ret = SQLGetData(statement, static_cast<SQLSMALLINT>(column + 1), SQL_C_NUMERIC, &v, sizeof(SQL_NUMERIC_STRUCT),
									&str_len_or_ind_ptr);
		if (!check_odbc_error(ret))
			return false;
		if (str_len_or_ind_ptr == SQL_NULL_DATA)
		{
			_resultset->add_column(row_id, make_shared<NullColumn>(column));
			return true;
		}

		auto x = decode_numeric_struct(v);
		if (trunc(x) == x)
		{
			auto bi = (DatumStorage::bigint_t)x;
			auto col = make_shared<BigIntColumn>(column, bi);
			if (_numericStringEnabled)
			{
				col->AsString();
			}
			_resultset->add_column(row_id, col);
		}
		else
		{
			auto col = make_shared<NumberColumn>(column, (double)x);
			if (_numericStringEnabled)
			{
				col->AsString();
			}
			_resultset->add_column(row_id, col);
		}

		return true;
	}

	bool OdbcStatement::get_data_decimal(const size_t row_id, const size_t column)
	{
		const auto &statement = *_statement;
		SQLLEN str_len_or_ind_ptr = 0;
		double v = NAN;
		const auto ret = SQLGetData(statement, static_cast<SQLSMALLINT>(column + 1), SQL_C_DOUBLE, &v, sizeof(double),
									&str_len_or_ind_ptr);
		if (!check_odbc_error(ret))
			return false;
		if (str_len_or_ind_ptr == SQL_NULL_DATA)
		{
			_resultset->add_column(row_id, make_shared<NullColumn>(column));
			return true;
		}

		auto v2 = trunc(v);
		if (v2 == v &&
			v2 >= static_cast<long double>(numeric_limits<DatumStorage::bigint_t>::min()) &&
			v2 <= static_cast<long double>(numeric_limits<DatumStorage::bigint_t>::max()))
		{
			auto bi = (DatumStorage::bigint_t)v;
			auto col = make_shared<BigIntColumn>(column, bi);
			if (_numericStringEnabled)
			{
				col->AsString();
			}
			_resultset->add_column(row_id, col);
		}
		else
		{
			auto col = make_shared<NumberColumn>(column, v);
			if (_numericStringEnabled)
			{
				col->AsString();
			}
			_resultset->add_column(row_id, col);
		}

		return true;
	}

	bool OdbcStatement::get_data_binary(const size_t row_id, const size_t column)
	{
		auto storage = make_shared<DatumStorage>();

		const auto &statement = *_statement;
		constexpr SQLLEN atomic_read = 24 * 1024;
		auto bytes_to_read = atomic_read;
		storage->ReserveChars(bytes_to_read + 1);
		const auto &char_data = storage->charvec_ptr;
		auto *write_ptr = char_data->data();
		SQLLEN total_bytes_to_read = 0;
		auto r = SQLGetData(statement, static_cast<SQLSMALLINT>(column + 1), SQL_C_BINARY, write_ptr, bytes_to_read, &total_bytes_to_read);
		if (!check_odbc_error(r))
			return false;
		if (total_bytes_to_read == SQL_NULL_DATA)
		{
			_resultset->add_column(row_id, make_shared<NullColumn>(column));
			return true; // break
		}
		auto status = false;
		auto more = check_more_read(r, status);
		if (!status)
		{
			return false;
		}
		char_data->resize(total_bytes_to_read);

		if (total_bytes_to_read > bytes_to_read)
		{
			total_bytes_to_read -= bytes_to_read;
		}
		write_ptr = char_data->data();
		write_ptr += bytes_to_read;
		while (more)
		{
			bytes_to_read = min(static_cast<SQLLEN>(atomic_read), total_bytes_to_read);
			r = SQLGetData(statement, static_cast<SQLSMALLINT>(column + 1), SQL_C_BINARY, write_ptr, bytes_to_read, &total_bytes_to_read);
			if (!check_odbc_error(r))
				return false;
			more = check_more_read(r, status);
			if (!status)
			{
				return false;
			}
			write_ptr += bytes_to_read;
		}

		_resultset->add_column(row_id, make_shared<BinaryColumn>(column, storage, char_data->size()));
		return true;
	}

	bool OdbcStatement::check_more_read(SQLRETURN r, bool &status)
	{
		const auto &statement = *_statement;
		vector<SQLWCHAR> sql_state(6);
		SQLINTEGER native_error = 0;
		SQLSMALLINT text_length = 0;
		auto res = false;
		if (r == SQL_SUCCESS_WITH_INFO)
		{
			r = SQLGetDiagRec(SQL_HANDLE_STMT, statement, 1, sql_state.data(), &native_error, nullptr, 0, &text_length);
			if (!check_odbc_error(r))
			{
				status = false;
				return false;
			}
			const auto state = swcvec2str(sql_state, sql_state.size());
			// cerr << "check_more_read " << status << endl;
			res = state == "01004";
		}
		status = true;
		return res;
	}

	struct lob_capture
	{
		lob_capture() : total_bytes_to_read(atomic_read_bytes)
		{
			storage.ReserveUint16(atomic_read_bytes / item_size + 1);
			src_data = storage.uint16vec_ptr;
			write_ptr = src_data->data();
			maxvarchar = false;
		}

		void trim() const
		{
			if (maxvarchar)
			{
				auto last = src_data->size() - 1;
				if (maxvarchar)
				{
					while ((*src_data)[last] == 0)
					{
						--last;
					}
					if (last < src_data->size() - 1)
					{
						src_data->resize(last + 1);
					}
				}
			}
		}

		void on_next_read()
		{
			++reads;
			if (total_bytes_to_read < 0)
			{
				const auto previous = src_data->size();
				total_bytes_to_read = bytes_to_read * (reads + 1);
				n_items = total_bytes_to_read / item_size;
				src_data->reserve(n_items + 1);
				src_data->resize(n_items);
				write_ptr = src_data->data() + previous;
				memset(write_ptr, 0, src_data->data() + src_data->size() - write_ptr);
			}
			else
			{
				write_ptr += bytes_to_read / item_size;
			}
		}

		void on_first_read(const int factor = 2)
		{
			maxvarchar = total_bytes_to_read < 0;
			if (maxvarchar)
			{
				total_bytes_to_read = bytes_to_read * factor;
			}
			n_items = total_bytes_to_read / item_size;
			src_data->reserve(n_items + 1);
			src_data->resize(n_items);

			if (total_bytes_to_read > bytes_to_read)
			{
				total_bytes_to_read -= bytes_to_read;
			}
			write_ptr = src_data->data();
			write_ptr += bytes_to_read / item_size;
		}

		SQLLEN reads = 1;
		size_t n_items = 0;
		bool maxvarchar;
		const size_t item_size = sizeof(uint16_t);
		shared_ptr<vector<uint16_t>> src_data{};
		unsigned short *write_ptr{};
		const SQLLEN atomic_read_bytes = 24 * 1024;
		SQLLEN bytes_to_read = atomic_read_bytes;
		DatumStorage storage;
		SQLLEN total_bytes_to_read;
	};

	bool OdbcStatement::lob(const size_t row_id, size_t column)
	{
		// cerr << "lob ..... " << endl;
		const auto &statement = *_statement;
		lob_capture capture;
		auto r = SQLGetData(statement, static_cast<SQLSMALLINT>(column + 1), SQL_C_WCHAR, capture.write_ptr, capture.bytes_to_read + capture.item_size, &capture.total_bytes_to_read);
		if (capture.total_bytes_to_read == SQL_NULL_DATA)
		{
			// cerr << "lob NullColumn " << endl;
			_resultset->add_column(row_id, make_shared<NullColumn>(column));
			return true;
		}
		if (!check_odbc_error(r))
			return false;
		auto status = false;
		auto more = check_more_read(r, status);
		if (!status)
		{
			// cerr << "lob check_more_read " << endl;
			return false;
		}
		capture.on_first_read();
		while (more)
		{
			capture.bytes_to_read = min(capture.atomic_read_bytes, capture.total_bytes_to_read);
			r = SQLGetData(statement, static_cast<SQLSMALLINT>(column + 1), SQL_C_WCHAR, capture.write_ptr, capture.bytes_to_read + capture.item_size, &capture.total_bytes_to_read);
			capture.on_next_read();
			if (!check_odbc_error(r))
			{
				// cerr << "lob error " << endl;
				return false;
			}
			more = check_more_read(r, status);
			if (!status)
			{
				// cerr << "lob status " << endl;
				return false;
			}
		}
		capture.trim();
		// cerr << "lob add StringColumn column " << endl;
		_resultset->add_column(row_id, make_shared<StringColumn>(column, capture.src_data, capture.src_data->size()));
		return true;
	}

	bool OdbcStatement::reserved_string(const size_t row_count, const size_t column_size, const size_t column) const
	{
		const auto &bound_datum = _preparedStorage->atIndex(static_cast<int>(column));
		const auto &ind = bound_datum->get_ind_vec();
		const auto storage = bound_datum->get_storage();
		for (size_t row_id = 0; row_id < row_count; ++row_id)
		{
			constexpr auto size = sizeof(uint16_t);
			const auto str_len_or_ind_ptr = ind[row_id];
			if (str_len_or_ind_ptr == SQL_NULL_DATA)
			{
				_resultset->add_column(row_id, make_shared<NullColumn>(column));
				continue;
			}
			auto offset = (column_size + 1) * row_id;
			size_t actual_size = ind[row_id] / size;
			auto to_read = min(actual_size, column_size);
			const auto value = make_shared<StringColumn>(column, storage->uint16vec_ptr, offset, to_read);
			_resultset->add_column(row_id, value);
		}
		return true;
	}

	bool OdbcStatement::reserved_binary(const size_t row_count, const size_t column_size, const size_t column) const
	{
		const auto &bound_datum = _preparedStorage->atIndex(static_cast<int>(column));
		auto &ind = bound_datum->get_ind_vec();
		const auto storage = bound_datum->get_storage();
		for (size_t row_id = 0; row_id < row_count; ++row_id)
		{
			const auto str_len_or_ind_ptr = ind[row_id];
			if (str_len_or_ind_ptr == SQL_NULL_DATA)
			{
				_resultset->add_column(row_id, make_shared<NullColumn>(column));
				continue;
			}
			auto offset = column_size * row_id;
			const auto value = make_shared<BinaryColumn>(column, storage, offset, ind[row_id]);
			_resultset->add_column(row_id, value);
		}
		return true;
	}

	bool OdbcStatement::bounded_string(SQLLEN display_size, const size_t row_id, size_t column)
	{
		// cerr << "bounded_string ... " << endl;

		const auto storage = make_shared<DatumStorage>();
		constexpr auto size = sizeof(uint16_t);
		SQLLEN value_len = 0;

		display_size++;
		storage->ReserveUint16(display_size); // increment for null terminator
		const auto r = SQLGetData(*_statement, static_cast<SQLSMALLINT>(column + 1), SQL_C_WCHAR, storage->uint16vec_ptr->data(), display_size * size,
								  &value_len);

		if (r != SQL_NO_DATA && !check_odbc_error(r))
			return false;

		if (r == SQL_NO_DATA || value_len == SQL_NULL_DATA)
		{
			_resultset->add_column(row_id, make_shared<NullColumn>(column));
			return true;
		}

		value_len /= size;

		assert(value_len >= 0 && value_len <= display_size - 1);
		storage->uint16vec_ptr->resize(value_len);
		const auto value = make_shared<StringColumn>(column, storage, value_len);
		_resultset->add_column(row_id, value);

		return true;
	}

	bool OdbcStatement::try_read_string(bool binary, const size_t row_id, const size_t column)
	{
		SQLLEN display_size = 0;
		// cerr << " try_read_string row_id = " << row_id << " column = " << column;
		const auto r = SQLColAttribute(*_statement, column + 1, SQL_DESC_DISPLAY_SIZE, nullptr, 0, nullptr, &display_size);
		if (!check_odbc_error(r))
			return false;

		// when a field type is LOB, we read a packet at time and pass that back.
		if (display_size == 0 || display_size == numeric_limits<int>::max() ||
			display_size == numeric_limits<int>::max() >> 1 ||
			static_cast<unsigned long>(display_size) == numeric_limits<unsigned long>::max() - 1)
		{
			return lob(row_id, column);
		}

		if (display_size >= 1 && display_size <= SQL_SERVER_MAX_STRING_SIZE)
		{
			return bounded_string(display_size, row_id, column);
		}

		return false;
	}

	bool OdbcStatement::try_read_next_result()
	{
		// fprintf(stderr, "TryReadNextResult\n");
		// fprintf(stderr, "TryReadNextResult ID = %llu\n ", getStatementId());
		const auto state = _statementState;
		if (state == OdbcStatementState::STATEMENT_CANCELLED)
		{
			// fprintf(stderr, "TryReadNextResult - cancel mode.\n");
			_resultset->_end_of_rows = true;
			_endOfResults = true;
			_statementState = OdbcStatementState::STATEMENT_ERROR;
			return false;
		}
		const auto &statement = *_statement;
		const auto ret = SQLMoreResults(statement);
		switch (ret)
		{
		case SQL_NO_DATA:
		{
			// fprintf(stderr, "SQL_NO_DATA\n");
			_endOfResults = true;
			if (_prepared)
			{
				SQLCloseCursor(statement);
			}
			return true;
		}

		case SQL_SUCCESS_WITH_INFO:
		{
			return_odbc_error();
			const auto res = start_reading_results();
			if (res)
			{
				_resultset->_end_of_rows = false;
			}
			else
			{
				_resultset->_end_of_rows = true;
			}
			return false;
		}
		default:;
		}
		_endOfResults = false;
		return start_reading_results();
	}
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcConnection.h
// Contents: Async calls to ODBC done in background thread
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include <ResultSet.h>
#include <CriticalSection.h>

namespace mssql
{
	class BoundDatum;
	class BoundDatumSet;
	class DatumStorage;
	class QueryOperationParams;
	class ConnectionHandles;

	using namespace std;

	class OdbcStatement
	{
	public:
		mutex _statement_mutex;
		enum class OdbcStatementState
		{
			STATEMENT_CREATED = 1,
			STATEMENT_PREPARED = 2,
			STATEMENT_SUBMITTED = 3,
			STATEMENT_FETCHING = 4,
			STATEMENT_CANCELLED = 5,
			STATEMENT_ERROR = 6,
			STATEMENT_CLOSED = 7
		};

		bool created() { return  _statementState == OdbcStatementState::STATEMENT_CREATED; }
		bool cancel();

		OdbcStatement(long statement_id, shared_ptr<ConnectionHandles> c);
		virtual ~OdbcStatement();
		SQLLEN get_row_count() const { return _resultset != nullptr ? _resultset->row_count() : -1; }
		shared_ptr<ResultSet> get_result_set() const
		{
			return _resultset;
		}

		long get_statement_id() const
		{
			return _statementId;
		}

		bool is_prepared() const
		{
			return _prepared;
		}

		Local<Array> unbind_params() const;
		Local<Value> get_meta_value() const;
		bool  end_of_results() const;
		Local<Value> handle_end_of_results() const;
		Local<Value> end_of_rows() const;
		Local<Value> get_column_values() const;
		bool set_polling(bool mode);
		bool set_numeric_string(bool mode);

		shared_ptr<vector<shared_ptr<OdbcError>>> errors(void) const
		{
			return _errors;
		}

		bool try_prepare(const shared_ptr<QueryOperationParams>& q);
		bool bind_fetch(const shared_ptr<BoundDatumSet>& param_set);
		bool try_bcp(const shared_ptr<BoundDatumSet>& param_set, int32_t version);
		bool try_execute_direct(const shared_ptr<QueryOperationParams>& q, const shared_ptr<BoundDatumSet>& paramSet);
		bool cancel_handle();
		bool try_read_columns(size_t number_rows);
		bool try_read_next_result();
		void done() {
			_statementState = OdbcStatementState::STATEMENT_CLOSED;
			_statement = nullptr;
		}

	private:
		bool fetch_read(const size_t number_rows);
		bool prepared_read();
		SQLRETURN poll_check(SQLRETURN ret, shared_ptr<vector<uint16_t>> vec, const bool direct);
		bool get_data_binary(size_t row_id, size_t column);
		bool get_data_decimal(size_t row_id, size_t column);
		bool get_data_numeric(size_t row_id, size_t column);
		bool get_data_bit(size_t row_id, size_t column);
		bool get_data_timestamp(size_t row_id, size_t column);
		bool get_data_long(size_t row_id, size_t column);
		bool get_data_big_int(size_t row_id, size_t column);
		bool get_data_timestamp_offset(size_t row_id, size_t column);

		bool start_reading_results();
		SQLRETURN query_timeout(int timeout);
		bool d_variant(size_t row_id, size_t column);
		bool d_time(size_t row_id, size_t column);
		bool bounded_string(SQLLEN display_size, size_t row, size_t column);
		bool reserved_string(const size_t row_count, const size_t column_size, size_t const column) const;
		bool reserved_binary(const size_t row_count, const size_t column_size, size_t const column) const;
		bool reserved_bit(const size_t row_count, const size_t column) const;
		bool reserved_int(const size_t row_count, const size_t column) const;
		bool reserved_big_int(const size_t row_count, const size_t column) const;
		bool reserved_decimal(const size_t row_count, const size_t column) const;
		bool reserved_time(const size_t row_count, const size_t column) const;
		bool reserved_timestamp(const size_t row_count, const size_t column) const;
		bool reserved_timestamp_offset(const size_t row_count, const size_t column) const;
		void apply_precision(const shared_ptr<BoundDatum>& datum, int current_param) const;
		bool read_col_attributes(ResultSet::ColumnDefinition& current, int column);
		bool read_next(int column);
		bool raise_cancel();
		bool check_more_read(SQLRETURN r, bool& status);
		bool lob(size_t, size_t column);
		static OdbcEnvironmentHandle environment;
		bool dispatch(SQLSMALLINT t, size_t row, size_t column);
		bool dispatch_prepared(const SQLSMALLINT t, const size_t column_size, const size_t rows_count, const size_t column) const;
		typedef vector<shared_ptr<BoundDatum>> param_bindings;
		typedef pair<int, shared_ptr<param_bindings>> tvp_t;
		bool bind_tvp(vector<tvp_t>& tvps);
		bool bind_datum(int current_param, const shared_ptr<BoundDatum>& datum);
		bool bind_params(const shared_ptr<BoundDatumSet>& params);
		void queue_tvp(int current_param, param_bindings::iterator& itr, shared_ptr<BoundDatum>& datum, vector <tvp_t>& tvps);
		bool try_read_string(bool binary, size_t row_id, size_t column);

		bool return_odbc_error();
		bool check_odbc_error(SQLRETURN ret);

		shared_ptr<QueryOperationParams> _query;
		shared_ptr<OdbcStatementHandle> _statement;
		shared_ptr<ConnectionHandles> _connectionHandles;
	
		// any error that occurs when a Try* function returns false is stored here
		// and may be retrieved via the Error function below.

		shared_ptr<vector<shared_ptr<OdbcError>>> _errors;

		bool _endOfResults;
		long _statementId;
		bool _prepared;
		bool _cancelRequested;
		bool _pollingEnabled;
		bool _numericStringEnabled;

		OdbcStatementState _statementState = OdbcStatementState::STATEMENT_CREATED;

		// set binary true if a binary Buffer should be returned instead of a JS string

		shared_ptr<ResultSet> _resultset;
		shared_ptr<BoundDatumSet> _boundParamsSet;
		shared_ptr<BoundDatumSet> _preparedStorage;

		mutex g_i_mutex;
		

		const static size_t prepared_rows_to_bind = 50;
	};

	struct OdbcStatementGuard {
		OdbcStatementGuard(shared_ptr<OdbcStatement> statement) : 
		_statement(statement) {
			if (!_statement) return;
			lock_guard<mutex> lock(_statement->_statement_mutex);
		}
		shared_ptr<OdbcStatement> _statement;
	};
}//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcStatementCache.cpp
// Contents: Async calls to ODBC done in background thread
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#include <OdbcStatementCache.h>
#include <OdbcStatement.h>
#include <ConnectionHandles.h>
// #include <iostream>

namespace mssql
{
	using namespace std;

	OdbcStatementCache::OdbcStatementCache(const shared_ptr<ConnectionHandles>  connectionHandles) 
		: 
		_connectionHandles(connectionHandles)
	{
	}

	OdbcStatementCache::~OdbcStatementCache()
	{
	}

	void OdbcStatementCache::clear()
	{
		// cerr << "OdbcStatementCache - size = " << statements.size() << endl;
		vector<long> ids;
		// fprintf(stderr, "destruct OdbcStatementCache\n");

		for_each(statements.begin(), statements.end(), [&](const auto & p) {
			ids.insert(ids.begin(), p.first);
		});

		for_each(ids.begin(), ids.end(), [&](const long id) {
			// cerr << "destruct OdbcStatementCache - erase statement" << id << endl;
			statements.erase(id);
		});
	}

	shared_ptr<OdbcStatement> OdbcStatementCache::find(const long statement_id)
	{
		shared_ptr<OdbcStatement> statement = nullptr;
		const auto itr = statements.find(statement_id);
		if (itr != statements.end()) {
			statement = itr->second;
		}
		return statement;
	}

	shared_ptr<OdbcStatement> OdbcStatementCache::store(shared_ptr<OdbcStatement> statement)
	{
		statements.insert(pair<long, shared_ptr<OdbcStatement>>(statement->get_statement_id(), statement));
		return statement;
	}

	shared_ptr<OdbcStatement> OdbcStatementCache::checkout(long statement_id)
	{
		if (statement_id < 0)
		{
			//fprintf(stderr, "dont fetch id %ld\n", statementId);
			return nullptr;
		}
		auto statement = find(statement_id);
		if (statement) return statement;
		return store(make_shared<OdbcStatement>(statement_id, _connectionHandles));
	}

	void OdbcStatementCache::checkin(const long statement_id)
	{
		if (statement_id < 0) return;
		const auto statement = find(statement_id);
		if (statement != nullptr) {
			statement->done();
		    // cerr << "checkin  " << statement_id << endl;
			_connectionHandles->checkin(statement_id);
			statements.erase(statement_id);
		}
	}
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcStatementCache.h
// Contents: Async calls to ODBC done in background thread
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include "stdafx.h"
#include <map>
#include <OdbcConnection.h>

namespace mssql
{
	using namespace std;

	class OdbcStatement;
	class ConnectionHandles;

	class OdbcStatementCache
	{
	public:		
		OdbcStatementCache(const shared_ptr<ConnectionHandles> connectionHandles);
		~OdbcStatementCache();
		shared_ptr<OdbcStatement> checkout(long statement_id);
		void checkin(long statement_id);
		size_t size() const { return statements.size(); } 
		void clear();

	private:
		shared_ptr<OdbcStatement> find(long statement_id);
		shared_ptr<OdbcStatement> store(shared_ptr<OdbcStatement> statement);

		typedef map<long, shared_ptr<OdbcStatement>> map_statements_t;

		map_statements_t statements;
		shared_ptr<ConnectionHandles> _connectionHandles;
	};
}
#include "stdafx.h"
#include <OdbcConnection.h>
#include <OpenOperation.h>

namespace mssql
{
	OpenOperation::OpenOperation(const shared_ptr<OdbcConnection> &connection, 
								 Local<String> connection_string,
								 const int timeout, 
								 const Local<Object> callback,
	                             const Local<Object> backpointer)
		: OdbcOperation(connection, callback),
		connectionString(js2u16(connection_string)),
		backpointer(Isolate::GetCurrent(), backpointer),
		timeout(timeout)
	{
	}

	OpenOperation::~OpenOperation()
	{
		backpointer.Reset();
	}

	bool OpenOperation::TryInvokeOdbc()
	{
		return _connection->try_open(connectionString, timeout);
	}

	Local<Value> OpenOperation::CreateCompletionArg()
	{
		const auto o = Nan::New(backpointer);
		return o;
	}
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcOperation.h
// Contents: ODBC Operation objects called on background thread
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include <OdbcOperation.h>
#include <vector>

namespace mssql
{
	using namespace std;
	using namespace v8;

	class OdbcConnection;

	class OpenOperation : public OdbcOperation
	{
		shared_ptr<vector<uint16_t>> connectionString;
		Persistent<Object> backpointer;
		int timeout;

	public:
		OpenOperation(const shared_ptr<OdbcConnection> &connection, 
			Local<String> connectionString,
			int timeout, 
			Local<Object> callback, 
			Local<Object> backpointer);
		virtual ~OpenOperation(void);
		bool TryInvokeOdbc() override;
		Local<Value> CreateCompletionArg() override;
	};
}

#include <Operation.h>

namespace mssql
{
	Operation::~Operation()
	{
		//fprintf(stderr, "destruct Operation\n");
	}
}//---------------------------------------------------------------------------------------------------------------------------------
// File: Operation.h
// Contents: Queue calls to ODBC on background thread
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once
#include <map>
#include <memory>
#include <stdafx.h>

namespace mssql {

    using namespace std;
 
	class OdbcStatement;
	class OperationManager;

    class Operation
    {
	   friend class OperationManager;

    public:
	   Operation() :
		   OperationID(-1)
	   {
	   }

	   virtual ~Operation();
	   size_t OperationID;
	   shared_ptr<OperationManager> mgr;
	  
    private:
	   uv_work_t  work;	 
    };
}
#include <Operation.h>
#include <OperationManager.h>
#include <mutex>

namespace mssql
{
	OperationManager::OperationManager() : _id(0)
	{		
	}

	OperationManager::~OperationManager()
	{
	//	fprintf(stderr, "~OperationManager\n");
	}

	bool OperationManager::add(shared_ptr<Operation> operation_ptr)
	{
		lock_guard<mutex> lock(g_i_mutex);
		operation_ptr->OperationID = static_cast<int>(++_id);
		operations.insert(pair<size_t, shared_ptr<Operation>>(operation_ptr->OperationID, operation_ptr));
		operation_ptr->work.data = operation_ptr.get();

		const auto result = uv_queue_work(uv_default_loop(), &operation_ptr->work, on_background, reinterpret_cast<uv_after_work_cb>(on_foreground));
		return result == 0;
	}

	void OperationManager::on_foreground(uv_work_t* work, int x)
	{
		//auto* operation = static_cast<Operation*>(work->data);
		//fprintf(stderr, "OnForeground %llu\n ", operation->OperationID);
		//operation->complete_foreground();
		//operation->mgr->check_in_operation(operation->OperationID);
	}

	void OperationManager::check_in_operation(const size_t id)
	{
		lock_guard<mutex> lock(g_i_mutex);
		operations.erase(id);
	}

	void OperationManager::on_background(uv_work_t*work)
	{
		//auto* operation = static_cast<Operation*>(work->data);
		//operation->invoke_background();
	}
}//---------------------------------------------------------------------------------------------------------------------------------
// File: OperationManager.h
// Contents: Queue calls to ODBC on background thread
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once
#include <map>
#include <memory>
#include <stdafx.h>

namespace mssql {

	using namespace std;

	class Operation;

	/* need to think about threading with multiple active connections */

	class OperationManager
	{
		typedef map<size_t, shared_ptr<Operation>> map_operations_t;

	public:
		OperationManager();
		~OperationManager();
		bool add(shared_ptr<Operation> operation_ptr);
		void check_in_operation(size_t id);
		shared_ptr<Operation> get_operation(int id)
		{
			map_operations_t::const_iterator itr = operations.find(id);
			return itr->second;
		}

	private:
		map_operations_t operations;
		ssize_t _id;
		static void on_background(uv_work_t* work);
		static void on_foreground(uv_work_t* work, int x);
		mutex g_i_mutex;
	};
}
#include "stdafx.h"
#include <OdbcStatement.h>
#include <PollingModeOperation.h>

namespace mssql
{
	bool PollingModeOperation::TryInvokeOdbc()
	{
		if (!_statement) return false;
		return _statement->set_polling(_polling);
	}

	Local<Value> PollingModeOperation::CreateCompletionArg()
	{
		return Nan::Null();
	}
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcOperation.h
// Contents: ODBC Operation objects called on background thread
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include <OdbcOperation.h>

namespace mssql
{
	using namespace std;
	using namespace v8;

	class OdbcConnection;

	class PollingModeOperation : public OdbcOperation
	{
	public:
		bool  _polling;
		PollingModeOperation(shared_ptr<OdbcConnection> connection, size_t queryId, bool mode, Local<Object> callback)
			: OdbcOperation(connection, callback)
		{
			_polling = mode;
			_can_lock = false;
			_statementId = queryId;
		}

		bool TryInvokeOdbc() override;

		Local<Value> CreateCompletionArg() override;
	};
}

#include "stdafx.h"
#include <OdbcConnection.h>
#include <OdbcStatement.h>
#include <OdbcStatementCache.h>
#include <PrepareOperation.h>
#include <QueryOperationParams.h>

namespace mssql
{
	PrepareOperation::PrepareOperation(
		const shared_ptr<OdbcConnection> &connection,
		const shared_ptr<QueryOperationParams> &query,
		const Local<Object> callback) :
		QueryOperation(connection, query, callback)
	{
	}

	bool PrepareOperation::TryInvokeOdbc()
	{
		_statement = _connection->getStatamentCache()->checkout(_statementId);
		if (!_statement) return false;
		_statement->set_polling(_query->polling());
		return _statement->try_prepare(_query);
	}
}//---------------------------------------------------------------------------------------------------------------------------------
// File: ProcedureOperation.h
// Contents: ODBC Operation objects called on background thread
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include <QueryOperation.h>

namespace mssql
{
	using namespace std;
	using namespace v8;

	class OdbcConnection;

	class PrepareOperation : public QueryOperation
	{
	public:
		bool TryInvokeOdbc() override;
		PrepareOperation(const shared_ptr<OdbcConnection> &connection, const shared_ptr<QueryOperationParams> &query, Local<Object> callback);
	};
}

#include "stdafx.h"
#include <OdbcConnection.h>
#include <OdbcStatement.h>
#include <OdbcStatementCache.h>
#include <ProcedureOperation.h>
#include <QueryOperationParams.h>

namespace mssql
{
	ProcedureOperation::ProcedureOperation(const shared_ptr<OdbcConnection> &connection,
	                                       const shared_ptr<QueryOperationParams> &query,
	                                       const Local<Object> callback) :
		QueryOperation(connection, query, callback)
	{
	}

	bool ProcedureOperation::TryInvokeOdbc()
	{
		_statement = _connection->getStatamentCache()->checkout(_statementId);
		if (!_statement) return false;
		_statement->set_polling(_query->polling());
		return _statement->try_execute_direct(_query, _params);
	}

	Local<Value> ProcedureOperation::CreateCompletionArg()
	{
		return _statement->get_meta_value();
	}
}//---------------------------------------------------------------------------------------------------------------------------------
// File: ProcedureOperation.h
// Contents: ODBC Operation objects called on background thread
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include <QueryOperation.h>

namespace mssql
{
	using namespace std;
	using namespace v8;

	class OdbcConnection;

	class ProcedureOperation : public QueryOperation
	{
	public:
		bool TryInvokeOdbc() override;
		Local<Value> CreateCompletionArg() override;
		ProcedureOperation(const shared_ptr<OdbcConnection> &connection, const shared_ptr<QueryOperationParams> &query, Local<Object> callback);
	};
}

#include "stdafx.h"
#include <OdbcConnection.h>
#include <OdbcStatement.h>
#include <OdbcStatementCache.h>
#include <QueryOperation.h>
#include <QueryOperationParams.h>
#include <BoundDatumSet.h>
#include <iostream>

namespace mssql
{
	QueryOperation::QueryOperation(
		const shared_ptr<OdbcConnection> &connection, 
		const shared_ptr<QueryOperationParams> &query, 
		const Local<Object> callback) :
		OdbcOperation(connection, callback),
		_query(query),
		output_param_count(0)
	{
		_statementId = static_cast<long>(_query->id());
		_params = make_shared<BoundDatumSet>();
	}

	QueryOperation::~QueryOperation() {
		// auto size = _connection->statements->size();
		// std::cerr << "size = " << size << " statementId = " << _statementId << endl; 
	}

	bool QueryOperation::parameter_error_to_user_callback(const uint32_t param, const char* error) const
	{
		const nodeTypeFactory fact;

		_params->clear();

		stringstream full_error;
		full_error << "IMNOD: [msnodesql] Parameter " << param + 1 << ": " << error;

		const auto err = fact.error(full_error);
		const auto imn = Nan::New("IMNOD").ToLocalChecked();
		Nan::Set(err, Nan::New("sqlstate").ToLocalChecked(), imn);
		Nan::Set(err, Nan::New("code").ToLocalChecked(), Nan::New(-1));

		Local<Value> args[1];
		args[0] = err;
		constexpr auto argc = 1;

		Nan::Call(Nan::New(_callback), Nan::GetCurrentContext()->Global(), argc, args);

		return false;
	}

	bool QueryOperation::bind_parameters(Local<Array> &node_params) const
	{
		const auto res = _params->bind(node_params);
		if (!res)
		{
			parameter_error_to_user_callback(_params->first_error, _params->err);
		}

		return res;
	}

	bool QueryOperation::TryInvokeOdbc()
	{
		_statement = _connection->getStatamentCache()->checkout(_statementId);
		if (!_statement) return false;
		_statement->set_polling(_query->polling());
		_statement->set_numeric_string(_query->numeric_string());
		const auto res = _statement->try_execute_direct(_query, _params);
		return res;
	}

	Local<Value> QueryOperation::CreateCompletionArg()
	{
		return _statement->get_meta_value();
	}
}//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcOperation.h
// Contents: ODBC Operation objects called on background thread
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include <OdbcOperation.h>

namespace mssql
{
	using namespace std;
	using namespace v8;

	class OdbcConnection;
	class OdbcStatement;
	class BoundDatumSet;
	class QueryOperationParams;

	class QueryOperation : public OdbcOperation
	{
	public:
		QueryOperation(
			const shared_ptr<OdbcConnection> &connection, 
			const shared_ptr<QueryOperationParams> &query, 
			Local<Object> callback);
		bool bind_parameters(Local<Array> & node_params) const;
		// called by BindParameters when an error occurs.  It passes a node.js error to the user's callback.
		bool parameter_error_to_user_callback(uint32_t param, const char* error) const;
		bool TryInvokeOdbc() override;
		Local<Value> CreateCompletionArg() override;
		virtual ~QueryOperation();
	protected:
		shared_ptr<QueryOperationParams> _query;
		shared_ptr<BoundDatumSet> _params;
		int output_param_count;
	};
}

#include <QueryOperationParams.h>
#include <MutateJS.h>
#include "stdafx.h"

namespace mssql
{
	using namespace std;
	using namespace v8;

/*
shared_ptr<vector<uint16_t>> _query_string;
		int32_t _timeout;
		int32_t _query_tz_adjustment;
		int64_t _id;
		size_t _max_prepared_column_size;
		bool _numeric_string;
		bool _polling;
*/
	QueryOperationParams::QueryOperationParams(const Local<Number> query_id, 
		const Local<Object> query_object) :
		_timeout(MutateJS::getint32(query_object, "query_timeout")),
		_id(MutateJS::getint32(query_id)),
		_max_prepared_column_size(MutateJS::getint64(query_object, "max_prepared_column_size")),
		_numeric_string(MutateJS::getbool(query_object, "numeric_string")),
		_polling(MutateJS::getbool(query_object, "query_polling"))
	{
		const auto qs = Nan::Get(query_object, Nan::New("query_str").ToLocalChecked()).ToLocalChecked();
		const auto maybe_value = Nan::To<String>(qs);
		const auto str = maybe_value.FromMaybe(Nan::EmptyString());

		_query_string = js2u16(str);
	}
}
#pragma once

#include <stdafx.h>

namespace mssql
{
	using namespace std;
	using namespace v8;

	class QueryOperationParams
	{
	public:
		shared_ptr<vector<uint16_t>> query_string() { return _query_string; }
		int64_t id() { return _id; }
		int32_t timeout() { return _timeout; }
		int32_t query_tz_adjustment() { return _query_tz_adjustment; }
		size_t max_prepared_column_size() { return _max_prepared_column_size; }
		bool polling() { return _polling; }
		bool numeric_string() { return _numeric_string; }
	
		QueryOperationParams(Local<Number> query_id, Local<Object> query_object);
	private:
		shared_ptr<vector<uint16_t>> _query_string;
		int32_t _timeout;
		int32_t _query_tz_adjustment;
		int64_t _id;
		size_t _max_prepared_column_size;
		bool _numeric_string;
		bool _polling;
	};
}
#include "stdafx.h"
#include <OdbcConnection.h>
#include <OdbcStatement.h>
#include <BoundDatumSet.h>
#include <QueryPreparedOperation.h>
#include <MutateJS.h>

namespace mssql
{
	QueryPreparedOperation::QueryPreparedOperation(
		const shared_ptr<OdbcConnection> &connection, 
		const size_t query_id, const u_int timeout, 
		const Local<Object> callback) :
		OdbcOperation(connection, callback),
		_timeout(timeout),
		_output_param_count(0)
	{
		_statementId = static_cast<long>(query_id);
		_params = make_shared<BoundDatumSet>();
	}

	bool QueryPreparedOperation::parameter_error_to_user_callback(const uint32_t param, const char* error) const
	{
		const nodeTypeFactory fact;

		_params->clear();

		stringstream full_error;
		full_error << "IMNOD: [msnodesql] Parameter " << param + 1 << ": " << error;

		const auto err = fact.error(full_error);
		const auto imn = fact.new_string("IMNOD");
		MutateJS::set_property_value(err, fact.new_string("sqlstate"), imn);
		MutateJS::set_property_value(err, fact.new_string("code"), Nan::New(-1));

		Local<Value> args[1];
		args[0] = err;
		constexpr auto argc = 1;

		Nan::Call(Nan::New(_callback), Nan::GetCurrentContext()->Global(), argc, args);
		return false;
	}

	bool QueryPreparedOperation::bind_parameters(Local<Array> &node_params) const
	{
		const auto res = _params->bind(node_params);
		if (!res)
		{
			parameter_error_to_user_callback(_params->first_error, _params->err);
		}

		return res;
	}

	bool QueryPreparedOperation::TryInvokeOdbc()
	{
		if (_statement == nullptr) return false;
		return _statement->bind_fetch(_params);
	}

	Local<Value> QueryPreparedOperation::CreateCompletionArg()
	{
		return _statement->get_meta_value();
	}
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcOperation.h
// Contents: ODBC Operation objects called on background thread
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include <OdbcOperation.h>

namespace mssql
{
	using namespace std;
	using namespace v8;

	class OdbcConnection;
	class OdbcStatement;
	class BoundDatumSet;

	class QueryPreparedOperation : public OdbcOperation
	{
	public:
		QueryPreparedOperation(const shared_ptr<OdbcConnection> &connection, 
			size_t query_id, u_int timeout,
			Local<Object> callback);
		bool bind_parameters(Local<Array> & node_params) const;
		// called by BindParameters when an error occurs.  It passes a node.js error to the user's callback.
		bool parameter_error_to_user_callback(uint32_t param, const char* error) const;
		bool TryInvokeOdbc() override;
		Local<Value> CreateCompletionArg() override;

	protected:
	
		u_int _timeout;
		shared_ptr<BoundDatumSet> _params;
		int _output_param_count;
	};
}

#include "stdafx.h"
#include <OdbcStatement.h>
#include <ReadColumnOperation.h>

namespace mssql
{
	bool ReadColumnOperation::TryInvokeOdbc()
	{
		if (!_statement) return false;
		return _statement->try_read_columns(this->_number_rows);
	}

	Local<Value> ReadColumnOperation::CreateCompletionArg()
	{
		return _statement->get_column_values();
	}
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcOperation.h
// Contents: ODBC Operation objects called on background thread
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include <OdbcOperation.h>

namespace mssql
{
	using namespace std;
	using namespace v8;

	class OdbcConnection;

	class ReadColumnOperation : public OdbcOperation
	{
		int _number_rows;

	public:

		ReadColumnOperation(shared_ptr<OdbcConnection> connection, size_t queryId, int number_rows, Local<Object> callback)
			: OdbcOperation(connection, callback),
			_number_rows(number_rows)
		{
			_statementId = queryId;
		}

		bool TryInvokeOdbc() override;

		Local<Value> CreateCompletionArg() override;
	};
}

#include "stdafx.h"
#include <OdbcStatement.h>
#include <ReadNextResultOperation.h>

namespace mssql
{
	bool ReadNextResultOperation::TryInvokeOdbc()
	{
		if (!_statement) return false;
		preRowCount = _statement->get_row_count();
		const auto res = _statement->try_read_next_result();
		postRowCount = _statement->get_row_count();
		return res;
	}

	Local<Value> ReadNextResultOperation::CreateCompletionArg()
	{
		const auto more_meta = Nan::New<Object>();
		Nan::Set(more_meta, Nan::New("endOfResults").ToLocalChecked(), _statement->handle_end_of_results());
		Nan::Set(more_meta, Nan::New("meta").ToLocalChecked(), _statement->get_meta_value());
		Nan::Set(more_meta, Nan::New("preRowCount").ToLocalChecked(), Nan::New(static_cast<int32_t>(preRowCount)));
		Nan::Set(more_meta, Nan::New("rowCount").ToLocalChecked(), Nan::New(static_cast<int32_t>(postRowCount)));

		return more_meta;
	}
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcOperation.h
// Contents: ODBC Operation objects called on background thread
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include <OdbcOperation.h>

namespace mssql
{
	using namespace std;
	using namespace v8;

	class OdbcConnection;

	class ReadNextResultOperation : public OdbcOperation
	{
	public:
		ReadNextResultOperation(shared_ptr<OdbcConnection> connection, size_t queryId, Local<Object> callback)
			: OdbcOperation(connection, callback), preRowCount(-1), postRowCount(-1)
		{
			_statementId = queryId;
		}

		bool TryInvokeOdbc() override;

		Local<Value> CreateCompletionArg() override;
		SQLLEN preRowCount;
		SQLLEN postRowCount;
	};
}

//---------------------------------------------------------------------------------------------------------------------------------
// File: ResultSet.cpp
// Contents: ResultSet object that holds metadata and current column to return to Javascript
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#include "stdafx.h"
#include <ResultSet.h>

namespace mssql
{
    using namespace v8;

    static const char* map_type(const SQLSMALLINT datatype)
    {
	   const char* type_name;

	   switch (datatype)
	   {
	   case SQL_CHAR:
	   case SQL_VARCHAR:
	   case SQL_LONGVARCHAR:
	   case SQL_WCHAR:
	   case SQL_WVARCHAR:
	   case SQL_WLONGVARCHAR:
	   case SQL_GUID:
	   case SQL_SS_XML:
		  type_name = "text";
		  break;
	   case SQL_BIT:
		  type_name = "boolean";
		  break;
	   case SQL_SMALLINT:
	   case SQL_TINYINT:
	   case SQL_INTEGER:
	   case SQL_DECIMAL:
	   case SQL_NUMERIC:
	   case SQL_REAL:
	   case SQL_FLOAT:
	   case SQL_DOUBLE:
	   case SQL_BIGINT:
		  type_name = "number";
		  break;
	   case SQL_TYPE_TIME:
	   case SQL_SS_TIME2:
	   case SQL_TYPE_TIMESTAMP:
	   case SQL_TYPE_DATE:
	   case SQL_SS_TIMESTAMPOFFSET:
		  type_name = "date";
		  break;
	   case SQL_BINARY:
	   case SQL_VARBINARY:
	   case SQL_LONGVARBINARY:
	   case SQL_SS_UDT:
		  type_name = "binary";
		  break;
	   default:
		  type_name = "text";
		  break;
	   }
	   return type_name;
    }

	shared_ptr<Column> ResultSet::get_column(const size_t row_id, const size_t column_id) const
	{
		if (row_id >= _rows.size())
		{
			return nullptr;
		}
		const auto& row = _rows[row_id];
		return row[column_id];
	}

	void ResultSet::add_column(const size_t row_id, const shared_ptr<Column> &column)
	{
		if (_rows.size() < row_id + 1)
		{
			_rows.resize(row_id + 1);
		}
		auto &row = _rows[row_id];
		if (row.size() != _metadata.size())
		{
			row.resize(_metadata.size());
		}
		row[column->Id()] = column;
	}

	Local<Object> ResultSet::get_entry(const ColumnDefinition & definition)  {
		const auto* const type_name = map_type(definition.dataType);
		const auto entry = Nan::New<Object>();
		Nan::Set(entry, Nan::New("size").ToLocalChecked(), Nan::New(static_cast<int32_t>(definition.columnSize)));
		Nan::Set(entry, Nan::New("name").ToLocalChecked(),  Nan::New(definition.name.c_str()).ToLocalChecked());
		Nan::Set(entry, Nan::New("nullable").ToLocalChecked(), Nan::New(definition.nullable != 0));
		Nan::Set(entry, Nan::New("type").ToLocalChecked(), Nan::New(type_name).ToLocalChecked());
		Nan::Set(entry, Nan::New("sqlType").ToLocalChecked(), Nan::New(definition.dataTypeName.c_str()).ToLocalChecked());
		if (definition.dataType == SQL_SS_UDT) {
			Nan::Set(entry, Nan::New("udtType").ToLocalChecked(), Nan::New(definition.udtTypeName.c_str()).ToLocalChecked());
		}
		return entry;
	}

	Local<Value> ResultSet::meta_to_value()
    {
	   const nodeTypeFactory fact;
	   auto metadata = fact.new_array();

	   for_each(this->_metadata.begin(), this->_metadata.end(), [metadata](const ColumnDefinition & definition) {
		   Nan::Set(metadata, metadata->Length(), get_entry(definition));
	   });

	   return metadata;
    }
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: ResultSet.h
// Contents: ResultSet object that holds metadata and current column to return to Javascript
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include<vector>
#include "Column.h"

namespace mssql
{
    using namespace std;

    class ResultSet
    {

    public:
		typedef vector<shared_ptr<Column>> t_row;
        struct ColumnDefinition
        {
            string name;
            SQLULEN columnSize;
            SQLSMALLINT dataType;
            string dataTypeName;
            SQLSMALLINT decimalDigits;
            SQLSMALLINT nullable;
            string udtTypeName;
        };

        ResultSet(int num_columns) 
            : _row_count(0),
              _end_of_rows(true)
        {
            _metadata.resize(num_columns);
        }
  
        ColumnDefinition & get_meta_data(int column)
        {
            return _metadata[column];
        }

        size_t get_column_count() const
        {
            return _metadata.size();
        }
		void start_results()
        {
			_rows.clear();
        }
        Local<Value> meta_to_value();
		void add_column(size_t row_id, const shared_ptr<Column> & column);
		shared_ptr<Column> get_column(size_t row_id, size_t id) const;
		size_t get_result_count() const
		{
			return  _rows.size();
		}
       
        SQLLEN row_count() const
        {
            return _row_count;
        }

        bool EndOfRows() const
        {
            return _end_of_rows;
        }

    private:
		static Local<Object> get_entry(const ColumnDefinition & definition);
        vector<ColumnDefinition> _metadata;
		
        SQLLEN _row_count;
        bool _end_of_rows;
		vector<t_row> _rows;

		friend class OdbcStatement;
    };
}
#pragma once

#include <iostream>
#include <memory>
#include <vector>
#include <v8.h>
#include "Column.h"
#include "Utility.h"
#include "BoundDatumHelper.h"
#include <MutateJS.h>

namespace mssql
{
    using namespace std;

    class StringColumn : public Column
    {
    public:
	   virtual ~StringColumn()
	   {
	   }

	   StringColumn(int id, shared_ptr<DatumStorage> s, size_t size) 
	   : 
	   Column(id), 
	   size(size), 
	   storage(s->uint16vec_ptr)
	   {
	   }

	   StringColumn(int id, shared_ptr<DatumStorage::uint16_t_vec_t> s, size_t size) 
	   : 
	   Column(id), 
	   size(size), 
	   storage(s)
	   {
	   }

	   StringColumn(int id, shared_ptr<DatumStorage::uint16_t_vec_t> s, size_t offset, size_t size) 
	   : 
	   Column(id), 
	   size(size), 
	   storage(s),
	   offset(offset)
	   {
	   }

	   inline Local<Value> ToString() override
	   {
		  	return ToValue();
	   }

	   inline Local<Value> ToNative() override
	   {
		   	auto sptr = storage->data();
		  	auto s = Nan::Encode(sptr + offset, size * 2, Nan::UCS2);
		  	return s;
	   }

    private:
		size_t size;
		shared_ptr<DatumStorage::uint16_t_vec_t> storage;
		size_t offset = 0;
    };
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: Column.cpp
// Contents: Column objects from SQL Server to return as Javascript types
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#include "stdafx.h"
#include <TimestampColumn.h>

namespace mssql {

	namespace {

		constexpr int64_t ms_per_second = static_cast<int64_t>(1e3);
		constexpr int64_t ms_per_minute = 60 * ms_per_second;
		constexpr int64_t ms_per_hour = 60 * ms_per_minute;
		constexpr int64_t ms_per_day = 24 * ms_per_hour;

		bool is_leap_year(const int64_t year)
		{
			return ( (year % 4 == 0 && (year % 100 != 0)) || (year % 400) == 0);
		}
	}

	// return the number of days since Jan 1, 1970
	double TimestampColumn::DaysSinceEpoch(const SQLSMALLINT y, const SQLUSMALLINT m, const SQLUSMALLINT d) const
	{
		// table derived from ECMA 262 15.9.1.4
		static constexpr double days_in_months[] = { 0.0, 31.0, 59.0, 90.0, 120.0, 151.0, 181.0, 212.0, 243.0, 273.0, 304.0, 334.0 };

		// calculate the number of days to the start of the year
		auto days = 365.0 * (y - 1970.0) + floor((y - 1969.0) / 4.0) - floor((y - 1901.0) / 100.0) + floor((y - 1601.0) / 400.0);

		// add in the number of days from the month
		days += days_in_months[m - 1];

		// and finally add in the day from the date to the number of days elapsed
		days += d - 1.0;

		// account for leap year this year (affects days after Feb. 29)
		if (is_leap_year(y) && m > 2) {
			days += 1.0;
		}

		return floor(days);
	}

	void TimestampColumn::milliseconds_from_timestamp(TIMESTAMP_STRUCT const & ts, const int32_t tz_offset)
	{
		const auto tzhrs = tz_offset / 60;
		const auto tzmins = tz_offset % 60;

		SQL_SS_TIMESTAMPOFFSET_STRUCT time_struct;
		time_struct.year = ts.year;
		time_struct.month = ts.month;
		time_struct.day = ts.day;
		time_struct.hour = ts.hour;
		time_struct.minute = ts.minute;
		time_struct.second = ts.second;
		time_struct.fraction = ts.fraction;
		time_struct.timezone_hour = tzhrs;
		time_struct.timezone_minute = tzmins;
		milliseconds_from_timestamp_offset(time_struct);
	}

	// derived from ECMA 262 15.9
	void TimestampColumn::milliseconds_from_timestamp_offset(SQL_SS_TIMESTAMPOFFSET_STRUCT const& time_struct)
	{
		auto ms = DaysSinceEpoch(time_struct.year, time_struct.month, time_struct.day);
		ms *= ms_per_day;

		// add in the hour, day minute, second and millisecond
		ms += time_struct.hour * ms_per_hour + time_struct.minute * ms_per_minute + time_struct.second * ms_per_second;
		ms += static_cast<double>(time_struct.fraction / NANOSECONDS_PER_MS);    
		// fraction is in nanoseconds
		// handle timezone adjustment to UTC
		ms -= time_struct.timezone_hour * ms_per_hour;
		ms -= time_struct.timezone_minute * ms_per_minute;

		milliseconds = ms;

		nanoseconds_delta = time_struct.fraction % NANOSECONDS_PER_MS;
	}

	int64_t TimestampColumn::year_from_day(int64_t& day)
	{
		int64_t year = 1970;
		int64_t days_in_year = 365;

		if (day >= 0) {
			while (day >= days_in_year) {

				day -= days_in_year;
				++year;
				if (is_leap_year(year)) {
					days_in_year = 366;
				}
				else {
					days_in_year = 365;
				}
			}
		}
		else {

			while (day <= -days_in_year) {

				day += days_in_year;
				--year;
				if (is_leap_year(year - 1)) {
					days_in_year = 366;
				}
				else {
					days_in_year = 365;
				}
			}

			if (day < 0) {
				--year;
				day += days_in_year;
			}
		}

		return year;
	}

	// calculate the individual components of a date from the total milliseconds
	// since Jan 1, 1970.  Dates before 1970 are represented as negative numbers.
	void TimestampColumn::DateFromMilliseconds(SQL_SS_TIMESTAMPOFFSET_STRUCT& date) const
	{
		static constexpr int64_t days_in_months[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
		static constexpr int64_t leap_days_in_months[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

		const auto* start_days = days_in_months;

		// calculate the number of days elapsed (normalized from the beginning of supported datetime)
		auto day = static_cast<int64_t>(milliseconds) / ms_per_day;
		// calculate time portion of the timestamp
		auto time = static_cast<int64_t>(milliseconds) % ms_per_day;
		if (time < 0) {
			time = ms_per_day + time;
			--day;
		}

		// how many leap years have passed since that time?
		const auto year = year_from_day(day);

		if (is_leap_year(year)) {
			start_days = leap_days_in_months;
		}


		int64_t month = 0;
		while (day >= start_days[month]) {
			day -= start_days[month];
			++month;
		}
		assert(month >= 0 && month <= 11);
		assert(day >= 0 && day <= 30);

		date.year = static_cast<SQLSMALLINT>(year);
		date.month = static_cast<SQLUSMALLINT>(month + 1);
		date.day = static_cast<SQLUSMALLINT>(day + 1);

		// SQL Server has 100 nanosecond resolution, so we adjust the milliseconds to high bits
		date.hour = static_cast<SQLUSMALLINT>(time / ms_per_hour);
		date.minute = static_cast<SQLUSMALLINT>(time % ms_per_hour / ms_per_minute);
		date.second = time % ms_per_minute / ms_per_second;
		date.fraction = time % 1000 * NANOSECONDS_PER_MS;
		date.timezone_hour = offset_minutes / 60;
		date.timezone_minute = offset_minutes % 60;
	}

}   // namespace mssql#pragma once

#include <v8.h>
#include <Column.h>
#include <Utility.h>
#include <sql.h>
#include <stdafx.h>
#include <BoundDatumHelper.h>

namespace mssql
{
	using namespace std;

	// Timestamps return dates in UTC timezone
	class TimestampColumn : public Column
	{
	public:

		TimestampColumn(int id, shared_ptr<DatumStorage> storage, int32_t tz_offset = 0) : Column(id)
		{
			auto & ins = (*storage);
			if (ins.timestampoffsetvec_ptr != nullptr) {
				auto & timeStruct = (*ins.timestampoffsetvec_ptr)[0];
				milliseconds_from_timestamp_offset(timeStruct);
			}
			else if (ins.timestampvec_ptr != nullptr) {
				auto & timeStruct = (*ins.timestampvec_ptr)[0];
				milliseconds_from_timestamp(timeStruct, tz_offset);
			}
		}

		TimestampColumn(int id, SQL_SS_TIMESTAMPOFFSET_STRUCT const& timeStruct) : Column(id)
		{
			milliseconds_from_timestamp_offset(timeStruct);
		}

		TimestampColumn(int id, TIMESTAMP_STRUCT const& timeStruct) : Column(id)
		{
			milliseconds_from_timestamp(timeStruct);
		}

		TimestampColumn(int id, double ms, int32_t delta, int32_t offset) : Column(id),
			milliseconds(ms),
			nanoseconds_delta(delta),
			offset_minutes(offset)
		{
		}

		TimestampColumn(int id, double ms) : TimestampColumn(id, ms, 0, 0)
		{
		}

		Local<Value> ToString() override
		{
			return AsString<double>(milliseconds);
		}

		Local<Value> ToNative() override
		{
			nodeTypeFactory fact;
			auto dd = fact.new_date(milliseconds, nanoseconds_delta);
			return dd;
		}

		void to_timestamp_offset(SQL_SS_TIMESTAMPOFFSET_STRUCT& date) const
		{
			DateFromMilliseconds(date);
		}

		void to_timestamp_struct(SQL_TIMESTAMP_STRUCT & timestamp) const
		{
			SQL_SS_TIMESTAMPOFFSET_STRUCT ts;
			to_timestamp_offset(ts);
			timestamp.year = ts.year;
			timestamp.month = ts.month;
			timestamp.day = ts.day;
			timestamp.hour = ts.hour;
			timestamp.minute = ts.minute;
			timestamp.second = ts.second;
			timestamp.fraction = ts.fraction;
		}

		void ToTime2Struct(SQL_SS_TIME2_STRUCT & time2) const
		{
			SQL_SS_TIMESTAMPOFFSET_STRUCT ts;
			to_timestamp_offset(ts);
			time2.hour = ts.hour;
			time2.minute = ts.minute;
			time2.second = ts.second;
			time2.fraction = ts.fraction;
		}

		void ToDateStruct(SQL_DATE_STRUCT & dt) const
		{
			SQL_SS_TIMESTAMPOFFSET_STRUCT ts;
			to_timestamp_offset(ts);
			dt.year = ts.year;
			dt.month = ts.month;
			dt.day = ts.day;
		}

		static const int64_t NANOSECONDS_PER_MS = static_cast<int64_t>(1e6);                  // nanoseconds per millisecond

	private:

		double milliseconds;
		int32_t nanoseconds_delta;    // just the fractional part of the time passed in, not since epoch time

									  // return the number of days since Jan 1, 1970
		double DaysSinceEpoch(SQLSMALLINT y, SQLUSMALLINT m, SQLUSMALLINT d) const;

		void milliseconds_from_timestamp(TIMESTAMP_STRUCT const & ts, int tz_offset = 0);

		// derived from ECMA 262 15.9
		void milliseconds_from_timestamp_offset(SQL_SS_TIMESTAMPOFFSET_STRUCT const& time_struct);

		// return the year from the epoch time.  The remainder is returned in the day parameter
		static int64_t year_from_day(int64_t& day);

		// calculate the individual components of a date from the total milliseconds
		// since Jan 1, 1970
		void DateFromMilliseconds(SQL_SS_TIMESTAMPOFFSET_STRUCT& date) const;

		int32_t offset_minutes;
	};
}
#include "stdafx.h"
#include <OdbcStatement.h>
#include <UnbindOperation.h>

namespace mssql
{
	bool UnbindOperation::TryInvokeOdbc()
	{
		if (_statement == nullptr) return false;	
		return true;
	}

	Local<Value> UnbindOperation::CreateCompletionArg()
	{
		auto a = _statement->unbind_params();
		const auto ret = a->Clone();
		return ret;
	}
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: OdbcOperation.h
// Contents: ODBC Operation objects called on background thread
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include "OdbcOperation.h"

namespace mssql
{
	using namespace std;
	using namespace v8;

	class OdbcConnection;

	class UnbindOperation : public OdbcOperation
	{
	public:

		UnbindOperation(shared_ptr<OdbcConnection> connection, size_t queryId, Local<Object> callback)
			: OdbcOperation(connection, callback)
		{
			_statementId = queryId;
		}

		bool TryInvokeOdbc() override;

		Local<Value> CreateCompletionArg() override;
	};
}

//---------------------------------------------------------------------------------------------------------------------------------
// File: Utility.cpp
// Contents: Utility functions used in Microsoft Driver for Node.js for SQL Server
//
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#include "stdafx.h"
#include <BoundDatumHelper.h>
#include <cstring>
#include <locale>
#include <codecvt>
#include <nan.h>

namespace mssql
{
	using namespace v8;

	string swcvec2str(vector<SQLWCHAR> &v, const size_t l)
	{
		vector<char> c_str;
		c_str.reserve(l + 1);
		c_str.resize(l + 1);
		constexpr auto c = static_cast<int>(sizeof(SQLWCHAR));
		const auto *ptr = reinterpret_cast<const char *>(v.data());
		for (size_t i = 0, j = 0; i < l * c; i += c, j++)
		{
			c_str[j] = ptr[i];
		}
		if (l > 0)
			c_str.resize(l - 1);
		string s(c_str.data());
		return s;
	}

	shared_ptr<vector<uint16_t>> js2u16(Local<String> str)
	{
		const auto str_len = str->Length();
		auto query_string = make_shared<vector<uint16_t>>();
		query_string->reserve(str_len);
		query_string->resize(str_len);
		Nan::DecodeWrite(reinterpret_cast<char *>(query_string->data()),
						 static_cast<size_t>(str->Length() * 2),
						 str, Nan::UCS2);
		return query_string;
	}

	vector<SQLWCHAR> wstr2wcvec(const wstring &s)
	{
		const auto cs = w2sqlc(s);
		return str2wcvec(cs);
	}

	vector<SQLWCHAR> str2wcvec(const string &cs)
	{
		vector<SQLWCHAR> ret;
		ret.resize(cs.size());
		ret.reserve(cs.size());
		auto wptr = ret.begin();
		for (auto ptr = cs.begin(); ptr != cs.end(); ++ptr, ++wptr)
		{
			*wptr = *ptr;
		}
		return ret;
	}

	string w2sqlc(const wstring &s)
	{
		std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
		auto c_cs = converter.to_bytes(s);
		return c_cs;
	}

	wstring s2ws(const string &s)
	{
		using convert_type = codecvt_utf8<wchar_t>;
		wstring_convert<convert_type, wchar_t> converter;
		const auto c_cs = converter.from_bytes(s);
		return wstring{c_cs};
	}

	wstring FromV8String(const Local<String> input)
	{

		Nan::Utf8String cons(input);
		const auto *x = *cons;
		const string cc = x;
		auto wides = s2ws(cc);
		return wides;
	}

	int char2_int(const char input)
	{
		if (input >= '0' && input <= '9')
			return input - '0';
		if (input >= 'A' && input <= 'F')
			return input - 'A' + 10;
		if (input >= 'a' && input <= 'f')
			return input - 'a' + 10;
		// throw invalid_argument("Invalid input string");
		return 0;
	}

	// This function assumes src to be a zero terminated sanitized string with
	// an even number of [0-9a-f] characters, and target to be sufficiently large

	int hex2_bin(const char *src, char *target)
	{
		auto len = 0;
		while (*src && src[1])
		{
			*target++ = static_cast<char>(char2_int(*src) * 16 + char2_int(src[1]));
			src += 2;
			++len;
		}
		return len;
	}

	double round(const double val, const int dp)
	{
		const auto raised = pow(10, dp);
		const auto temp = val * raised;
		auto rounded = floor(temp);

		if (temp - rounded >= .5)
		{
			rounded = ceil(temp);
		}

		return rounded / raised;
	}

	string hexify(unsigned long long n)
	{
		string res;

		do
		{
			res += "0123456789ABCDEF"[n % 16];
			n >>= 4;
		} while (n);

		return string{res.rbegin(), res.rend()};
	}

	long strtohextoval(const SQL_NUMERIC_STRUCT &numeric)
	{
		long value = 0;
		int i = 1, last = 1, current;
		int a = 0, b = 0;
		for (i = 0; i <= 15; i++)
		{
			current = (int)numeric.val[i];
			a = current % 16; // Obtain LSD
			b = current / 16; // Obtain MSD

			value += last * a;
			last = last * 16;
			value += last * b;
			last = last * 16;
		}
		return value;
	}

	double decode_numeric_struct(const SQL_NUMERIC_STRUCT &numeric)
	{
		// Call to convert the little endian mode data into numeric data.

		auto myvalue = strtohextoval(numeric);

		// The returned value in the above code is scaled to the value specified
		// in the scale field of the numeric structure. For example 25.212 would
		// be returned as 25212. The scale in this case is 3 hence the integer
		// value needs to be divided by 1000.

		auto divisor = 1;
		if (numeric.scale > 0)
		{
			for (auto i = 0; i < numeric.scale; i++) {
				divisor = divisor * 10;
			}
		}
		auto final_val = (double)myvalue / (double)divisor;
		return final_val;
	}

	void encode_numeric_struct(const double v, const int precision, int upscale_limit, SQL_NUMERIC_STRUCT & numeric) {
		auto encode = fabs(v);
		double intpart;
		auto scale = 0;
		char hex[SQL_MAX_NUMERIC_LEN];

		if (upscale_limit <= 0) upscale_limit = SQL_MAX_NUMERIC_LEN;

		auto dmod = modf(encode, &intpart);
		while (scale < upscale_limit && dmod != 0.0)
		{
			++scale;
			encode = encode * 10;
			dmod = modf(encode, &intpart);
		}

		const auto ull = static_cast<unsigned long long>(encode);
		memset(numeric.val, 0, SQL_MAX_NUMERIC_LEN);
		memset(hex, 0, SQL_MAX_NUMERIC_LEN);
		auto ss = hexify(ull);
		if (ss.size() % 2 == 1) ss = "0" + ss;
		const auto len = hex2_bin(ss.c_str(), hex);
		auto j = 0;
		for (auto i = len - 1; i >= 0; --i)
		{
			numeric.val[j++] = hex[i];
		}

		numeric.sign = v >= 0.0 ? 1 : 0;
		numeric.precision = precision > 0 ? static_cast<SQLCHAR>(precision) : static_cast<SQLCHAR>(log10(encode) + 1);
		numeric.scale = static_cast<SQLSCHAR>(min(upscale_limit, scale));
	}


	nodeTypeFactory::nodeTypeFactory()
	{
		isolate = Isolate::GetCurrent();
	}

	Local<Integer> nodeTypeFactory::new_long(const int64_t i) const
	{
		return Nan::New(static_cast<int32_t>(i));
	}

	Local<Integer> nodeTypeFactory::new_int32(const int32_t i) const
	{
		return Nan::New<Int32>(i);
	}

	Local<Number> nodeTypeFactory::new_int64(const int64_t i) const
	{
		return Nan::New<Number>(static_cast<double>(i));
	}

	Local<Value> nodeTypeFactory::new_number() const
	{
		return Object::New(isolate);
	}

	Local<String> nodeTypeFactory::new_string(const char *cstr) const
	{
		return Nan::New(cstr).ToLocalChecked();
	}

	Local<String> nodeTypeFactory::new_string(const char *cstr, const int size) const
	{
		return Nan::New<String>(cstr, size).ToLocalChecked();
	}

	Local<Array> nodeTypeFactory::new_array() const
	{
		return Nan::New<Array>();
	}

	Local<Array> nodeTypeFactory::new_array(const int count) const
	{
		return Array::New(isolate, count);
	}

	Local<Value> nodeTypeFactory::new_buffer(const int size) const
	{
		return Nan::NewBuffer(size).ToLocalChecked();
	}

	Local<Object> nodeTypeFactory::error(const stringstream &full_error) const
	{
		const auto err = Local<Object>::Cast(Exception::Error(new_string(full_error.str().c_str())));
		return err;
	}

	Local<Object> nodeTypeFactory::error(const char *full_error) const
	{
		const auto err = Local<Object>::Cast(Exception::Error(new_string(full_error)));
		return err;
	}

	Local<Value> nodeTypeFactory::new_date() const
	{
		return Nan::New<Date>(0.0).ToLocalChecked();
	}

	Local<Value> nodeTypeFactory::new_date(const double milliseconds, const int32_t nanoseconds_delta) const
	{
		const auto ns = Nan::New<String>("nanosecondsDelta").ToLocalChecked();
		const auto n = Nan::New<Number>(nanoseconds_delta / (NANOSECONDS_PER_MS * 1000.0));
		// include the properties for items in a DATETIMEOFFSET that are not included in a JS Date object
		const auto d = Nan::New<Date>(milliseconds).ToLocalChecked();
		Nan::Set(d, ns, n);
		return d;
	}

	Local<Value> nodeTypeFactory::global() const
	{
		return isolate->GetCurrentContext()->Global();
	}

	Local<Primitive> nodeTypeFactory::null() const
	{
		return Nan::Null();
	}

	Local<Primitive> nodeTypeFactory::undefined() const
	{
		return Undefined(isolate);
	}

	void nodeTypeFactory::throwError(const char *err) const
	{
		isolate->ThrowException(error(err));
	}
}//---------------------------------------------------------------------------------------------------------------------------------
// File: Utility.h
// Contents: Utility functions used in Microsoft Driver for Node.js for SQL Server
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once
#include <v8.h>
#include <sstream>
#include <map>
#include <mutex>
#include <ctime>

namespace mssql
{
    using namespace std;
    using namespace v8;

	shared_ptr<vector<uint16_t>> js2u16(Local<String> str);
	vector<SQLWCHAR> wstr2wcvec(const wstring & s);
	vector<SQLWCHAR> str2wcvec(const string & cs);
	string swcvec2str(vector<SQLWCHAR> &v, size_t l);
    string w2sqlc(const wstring & s);
	wstring s2ws(const string & s);
    wstring FromV8String(Local<String> input);
	
	void encode_numeric_struct(double v, int precision, int upscale_limit, SQL_NUMERIC_STRUCT & numeric);
	double decode_numeric_struct(const SQL_NUMERIC_STRUCT & numeric);

    struct nodeTypeFactory
    {
	   static const int64_t NANOSECONDS_PER_MS = 1000000;

	   Isolate *isolate;

	   nodeTypeFactory();
	   Local<Integer> new_long(int64_t i) const;
	   Local<Integer> new_int32(int32_t i) const;
	   Local<Number> new_int64(int64_t i) const;
	   Local<Value> new_number() const;
	   Local<String> new_string(const char *cstr) const;
	   Local<String> new_string(const char *cstr, int size) const;
	   Local<Array> new_array() const;
	   Local<Array> new_array(int count) const;
	   Local<Value> new_buffer(int size) const;
	   Local<Object> error(const stringstream &full_error) const;
	   Local<Object> error(const char* full_error) const;
	   Local<Value> new_date() const;
	   Local<Value> new_date(double milliseconds, int32_t nanoseconds_delta) const;
	   Local<Value> global() const;
	   Local<Primitive> null() const;
	   Local<Primitive> undefined() const;
	   void throwError(const char * err) const;
	};
}
#include "stdafx.h"
#include "Connection.h"

void InitAll(v8::Local<v8::Object> exports) {
  mssql::Connection::Init(exports);
}

NAN_MODULE_WORKER_ENABLED(addon, InitAll)#include "stdafx.h"
#include <algorithm>
#include <BoundDatum.h>
#include <BoundDatumHelper.h>
#include <BoundDatumSet.h>
#include <OdbcHandle.h>
#include <iostream>
#include <utility>
#include <bcp.h>

#ifdef LINUX_BUILD
#include <dlfcn.h>
#include <unistd.h>
#endif

#ifdef LINUX_BUILD
#define SYN_SIG string
#define DYN_SYM dlsym
#define DYN_OPEN dlopen
#define DYN_CLOSE dlclose
#endif

#ifdef WINDOWS_BUILD
#define SYN_SIG wstring
#define DYN_SYM GetProcAddress
#define DYN_OPEN LoadLibrary
#define DYN_CLOSE FreeLibrary
#endif

namespace mssql
{
    bool plugin_bcp::load(const SYN_SIG& shared_lib, shared_ptr<vector<shared_ptr<OdbcError>>> errors) {
        #ifdef WINDOWS_BUILD
        hinstLib = DYN_OPEN(shared_lib.data());
        #endif
        #ifdef LINUX_BUILD
        hinstLib = DYN_OPEN(shared_lib.data(), RTLD_NOW);
        #endif
        if (hinstLib != nullptr)
        {
            dll_bcp_init = reinterpret_cast<plug_bcp_init>(DYN_SYM(hinstLib, "bcp_initW"));
            if (!dll_bcp_init) errors->push_back(make_shared<OdbcError>("bcp", "bcp failed to get symbol bcp_initW.", -1, 0, "", "", 0));
            dll_bcp_bind = reinterpret_cast<plug_bcp_bind>(DYN_SYM(hinstLib, "bcp_bind"));
            if (!dll_bcp_bind) errors->push_back(make_shared<OdbcError>("bcp", "bcp failed to get symbol dll_bcp_bind.", -1, 0, "", "", 0));
            dll_bcp_sendrow = reinterpret_cast<plug_bcp_sendrow>(DYN_SYM(hinstLib, "bcp_sendrow"));
            if (!dll_bcp_sendrow) errors->push_back(make_shared<OdbcError>("bcp", "bcp failed to get symbol dll_bcp_sendrow.", -1, 0, "", "", 0));
            dll_bcp_done = reinterpret_cast<plug_bcp_done>(DYN_SYM(hinstLib, "bcp_done"));
            if (!dll_bcp_done) errors->push_back(make_shared<OdbcError>("bcp", "bcp failed to get symbol dll_bcp_done.", -1, 0, "", "", 0));
            return errors->empty();
        }
        return false;
    }

    plugin_bcp::~plugin_bcp() {
        if (hinstLib != nullptr) {
            DYN_CLOSE(hinstLib);
        }
    }
	
    inline RETCODE plugin_bcp::bcp_bind(HDBC const p1, const LPCBYTE p2, const INT p3, const DBINT p4, const LPCBYTE p5, const INT p6, const INT p7, const INT p8) const {
            return (dll_bcp_bind != nullptr) ?
            (dll_bcp_bind)(p1, p2, p3, p4, p5, p6, p7, p8)
            : static_cast<RETCODE>(-1);
    }

    inline RETCODE plugin_bcp::bcp_init(HDBC const p1, const LPCWSTR p2, const LPCWSTR p3, const LPCWSTR p4, const INT p5) const {
            return (dll_bcp_init != nullptr) ?
            (dll_bcp_init)(p1, p2, p3, p4, p5)
            : static_cast<RETCODE>(-1);
    }

    inline DBINT plugin_bcp::bcp_sendrow(HDBC const p1) const {
            return (dll_bcp_sendrow != nullptr) ?
            (dll_bcp_sendrow)(p1)
            : FAIL;
    }

    inline DBINT plugin_bcp::bcp_done(HDBC const p1) const {
             return (dll_bcp_done != nullptr) ?
            (dll_bcp_done)(p1)
            : static_cast<RETCODE>(-1);
    }

    template <class T> struct storage_jagged_t final : basestorage {

        SQLLEN i_indicator;
        typedef vector<T> vec_t;
        typedef vector<shared_ptr<vec_t>> vec_vec_t; 
        vec_t current;
        const vector<shared_ptr<vec_t>>& vec;
        const vector<SQLLEN>& ind;
        LPCBYTE ptr() override { return reinterpret_cast<LPCBYTE>(current.data()); } 
        storage_jagged_t(const vec_vec_t &v, const vector<SQLLEN> & i, size_t max_len) :
        basestorage(),
        i_indicator(0),
        vec(v),
        ind(i) {
            current.reserve(max_len + sizeof(SQLLEN) / sizeof(T));
        }
        size_t size() override { return vec.size(); }
        bool next() override {
            if (index == vec.size()) return false;
            i_indicator = ind[index];
            const auto &src = *vec[index++];
            current.resize(sizeof(SQLLEN) / sizeof(T));
            auto *const ptr = reinterpret_cast<SQLLEN*>(current.data());
            *ptr = i_indicator;
            if (i_indicator != SQL_NULL_DATA) {
                copy(src.begin(), src.end(), back_inserter(current));
            }
            return true;
        }
    };

    template<class T> struct storage_value_t final : basestorage {
        SQLLEN i_indicator;
        T current;
        LPCBYTE ptr() override { return reinterpret_cast<LPCBYTE>(&i_indicator); }
        const vector<T>& vec;
        const vector<SQLLEN>& ind;
        storage_value_t(const vector<T>& v, const vector<SQLLEN> & i) 
        :
    	basestorage(),
    	i_indicator(0),
    	vec(v),
    	ind(i) {
        }
        size_t size() override { return vec.size(); }
        bool next() override  {
            if (index == vec.size()) return false;
            i_indicator = ind[index];
            if (i_indicator != SQL_NULL_DATA) {
                current = vec[index]; 
            }
            index++;
            return true;
        }
    };

    typedef storage_value_t<char> storage_char;
    typedef storage_value_t<double> storage_double;
    typedef storage_value_t<int16_t> storage_int16;
    typedef storage_value_t<int32_t> storage_int32;
    typedef storage_value_t<uint32_t> storage_uint32;
    typedef storage_value_t<int64_t> storage_int64;
    typedef storage_value_t<SQL_DATE_STRUCT> storage_date;
    typedef storage_value_t<SQL_TIMESTAMP_STRUCT> storage_timestamp;
    typedef storage_value_t<SQL_SS_TIMESTAMPOFFSET_STRUCT> storage_timestamp_offset;
    typedef storage_value_t<SQL_NUMERIC_STRUCT> storage_numeric;
    typedef storage_jagged_t<uint16_t> storage_uint16; 
    typedef storage_jagged_t<char> storage_binary; 
    typedef storage_value_t<SQL_SS_TIME2_STRUCT> storage_time2;

    bcp::bcp(const shared_ptr<BoundDatumSet> param_set, shared_ptr<OdbcConnectionHandle> h) : 
        _ch(std::move(h)),
        _param_set(param_set)  {
        _errors = make_shared<vector<shared_ptr<OdbcError>>>();
    }

    wstring bcp::table_name() const {
        auto& set = *_param_set;
        if (set.size() == 0 ) return L"";
		const auto& first = set.atIndex(0);
		if (!first->is_bcp) return L""; 
		const auto &table = first->get_storage()->table;
        return table;
    }

    bool bcp::init() {
        const auto tn = table_name();
        if (tn.empty()) return false;
        const auto &ch = *_ch;
        auto vec = wstr2wcvec(tn);
        vec.push_back(static_cast<uint16_t>(0));
		const auto retcode = plugin.bcp_init(ch, vec.data(), nullptr, nullptr, DB_IN);
		if ( (retcode != SUCCEED) ) {
			ch.read_errors(_errors);
			return false;
		}
        return true;
    }

    inline shared_ptr<basestorage> get_storage(shared_ptr<BoundDatum> p) {
        shared_ptr<basestorage> r = nullptr;
        const auto storage = p->get_storage();
        const auto &ind = p->get_ind_vec();

        if (storage->isDate()) {
            r = make_shared<storage_date>(*storage->datevec_ptr, ind);
        }else if (storage->isTimestamp()) {
            r = make_shared<storage_timestamp>(*storage->timestampvec_ptr, ind);
        }else if (storage->isTime2()) {
            r = make_shared<storage_time2>(*storage->time2vec_ptr, ind);
        }else if (storage->isTimestampOffset()) {
            r = make_shared<storage_timestamp_offset>(*storage->timestampoffsetvec_ptr, ind);
        }else if (storage->isNumeric()) {
            r = make_shared<storage_numeric>(*storage->numeric_ptr, ind);
        }else if (storage->isDouble()) {
            r = make_shared<storage_double>(*storage->doublevec_ptr, ind);
        }else if (storage->isCharVec()) {
            r = make_shared<storage_binary>(*storage->char_vec_vec_ptr, ind, p->buffer_len);
        }else if (storage->isInt64()) {
            r = make_shared<storage_int64>(*storage->int64vec_ptr, ind);
        }else if (storage->isInt32()) {
            r = make_shared<storage_int32>(*storage->int32vec_ptr, ind);
        }else if (storage->isUInt32()) {
            r = make_shared<storage_uint32>(*storage->uint32vec_ptr, ind);
        }else if (storage->isInt16()) {
            r = make_shared<storage_int16>(*storage->int16vec_ptr, ind);
        }else if (storage->isUint16Vec()) {
            r = make_shared<storage_uint16>(*storage->uint16_vec_vec_ptr, ind, p->buffer_len);
        }else if (storage->isChar()) {
            r = make_shared<storage_char>(*storage->charvec_ptr, ind);
        }
        return r;
    }

    bool bcp::bind() {
        const auto &ch = *_ch;
        auto& ps = *_param_set;
		for (auto itr = ps.begin(); itr != ps.end(); ++itr)
		{ 
			const auto& p = *itr;
			if (const auto s = get_storage(p)) {
                _storage.push_back(s);
                if (plugin.bcp_bind(ch, s->ptr(), s->indicator, static_cast<DBINT>(p->param_size), p->bcp_terminator, static_cast<int>(p->bcp_terminator_len), p->sql_type, static_cast<int>(p->ordinal_position)) == FAIL)  
   			    {  
				    ch.read_errors(_errors);  
   				    return false;  
   			    }
            } else {
                return false;  
            }
		}
        return true;
    }

    bool bcp::send() {
        const auto size = _storage[0]->size();
        const auto &ch = *_ch;
        for (size_t i = 0; i < size; ++i) {
            for (auto itr = _storage.begin(); itr != _storage.end(); ++itr) {
                if (!(*itr)->next()) return false;
            }
            if (plugin.bcp_sendrow(ch) == FAIL)  {  
         	    ch.read_errors(_errors);  
         		    return false;  
         	}
        }
        return true;
    }

    int bcp::done() {
        DBINT n_rows_processed;
        const auto &ch = *_ch;
		if ((n_rows_processed = plugin.bcp_done(ch)) == -1) {
			ch.read_errors(_errors);
             if (_errors->empty()) {
                const string msg = "bcp failed in step `done` yet no error was returned. No rows have likely been inserted";
                _errors->push_back(make_shared<OdbcError>("bcp", msg.c_str(), -1, 0, "", "", 0));
            }
   			return false;  
        }
        return n_rows_processed;
    }

    int bcp::dynload(const SYN_SIG name) {
        _errors->clear();
        if (!plugin.load(name, _errors)) {
            if (_errors->empty()) {
                _errors->push_back(make_shared<OdbcError>("unknown", "bcp failed to dynamically load msodbcsql v17", -1, 0, "", "", 0));
            }
            return false;
        }
        return true;
    }

    int bcp::clean(const string &step) {
        if (_errors->empty()) {
            const string msg = "bcp failed in step `" + step + "`, yet no error was returned.";
            _errors->push_back(make_shared<OdbcError>("bcp", msg.c_str(), -1, 0, "", "", 0));
        }
        done();
        return -1;
    }

    int bcp::insert(int version) {

        #ifdef WINDOWS_BUILD
        auto vs = std::to_wstring(version);
        if (!dynload(L"msodbcsql" + vs + L".dll")) {
            return -1;
        }
        #endif
        #ifdef LINUX_BUILD
        auto vs = std::to_string(version);
        if (!dynload("libmsodbcsql-" + vs + ".so") && !dynload("libmsodbcsql." + vs + ".dylib")) {
            return -1;
        }
        #endif
		if (!init()) {
            return clean("init");
        }
        if (!bind()) {
            return clean("bind");
        }
        if (!send()) {
            return clean("send");
        }
        return done();
    }
}
//---------------------------------------------------------------------------------------------------------------------------------
// File: bcp.h
// Contents: 
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#include <OdbcOperation.h>

namespace mssql
{
	using namespace std;
	using namespace v8;

	class OdbcConnection;
	class BoundDatum;
	class BoundDatumSet;
	class DatumStorage;
	class QueryOperationParams;
	class ConnectionHandles;
  
    struct plugin_bcp
    {
        ~plugin_bcp();
        #ifdef WINDOWS_BUILD
		bool load(const wstring &, shared_ptr<vector<shared_ptr<OdbcError>>> errors);
        HINSTANCE hinstLib = NULL;
        #endif
        #ifdef LINUX_BUILD
        #define __cdecl 
        bool load(const string &, shared_ptr<vector<shared_ptr<OdbcError>>> errors);
        void * hinstLib = NULL;
        #endif

        inline RETCODE bcp_bind(HDBC const, const LPCBYTE, const INT, const DBINT, const LPCBYTE, const INT, const INT, const INT) const;
        inline RETCODE bcp_init(HDBC const, const LPCWSTR, const LPCWSTR, const LPCWSTR, const INT) const;
        inline DBINT bcp_sendrow(HDBC const) const;
        inline DBINT bcp_done(HDBC const) const;

        typedef RETCODE (__cdecl* plug_bcp_bind)(HDBC const, const LPCBYTE, const INT, const DBINT, const LPCBYTE, const INT, const INT, const INT);
        typedef RETCODE (__cdecl* plug_bcp_init)(HDBC, LPCWSTR, LPCWSTR, LPCWSTR, INT);
		typedef DBINT (__cdecl* plug_bcp_sendrow)(HDBC);
		typedef DBINT (__cdecl* plug_bcp_done)(HDBC);
        plug_bcp_bind dll_bcp_bind;
        plug_bcp_init dll_bcp_init;
		plug_bcp_sendrow dll_bcp_sendrow;
		plug_bcp_done dll_bcp_done;
    };

    struct basestorage {
        basestorage() :
        index(0),
    	indicator(sizeof(SQLLEN))
        {
        }
        virtual ~basestorage() {}
		virtual size_t size() = 0;
        virtual bool next() = 0;
        virtual LPCBYTE ptr() = 0;
        size_t index;
        INT indicator;
    };

	struct bcp 
	{
		bcp(const shared_ptr<BoundDatumSet> param_set, shared_ptr<OdbcConnectionHandle> h);
        int insert(int version = 17);
        bool init();
        bool bind();
        bool send();
        #ifdef WINDOWS_BUILD
        int dynload(const wstring name);
        #endif
        #ifdef LINUX_BUILD
        int dynload(const string name);
        #endif
        int done();
        int clean(const string &step);
        wstring table_name() const;
        shared_ptr<OdbcConnectionHandle> _ch;
        shared_ptr<BoundDatumSet> _param_set;
        shared_ptr<vector<shared_ptr<OdbcError>>> _errors;
        vector<shared_ptr<basestorage>> _storage;
		plugin_bcp plugin;
	};
}#pragma once

#include <sqltypes.h>
#include <sqlspi.h>
#include <sqlext.h>
#include <sql.h>

typedef unsigned char DBBIT;


/* this ALWAYS GENERATED file contains the definitions for the interfaces */


 /* File created by MIDL compiler version 7.00.0555 */
/* Compiler settings for sqlncli.idl:
    Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 
    protocol : dce , ms_ext, c_ext, robust
    error checks: allocation ref bounds_check enum stub_data 
    VC __declspec() decoration level: 
         __declspec(uuid()), __declspec(selectany), __declspec(novtable)
         DECLSPEC_UUID(), MIDL_INTERFACE()
*/
/* @@MIDL_FILE_HEADING(  ) */

#pragma warning( disable: 4049 )  /* more than 64k source lines */


/* verify that the <rpcndr.h> version is high enough to compile this file*/
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

/* verify that the <rpcsal.h> version is high enough to compile this file*/
#ifndef __REQUIRED_RPCSAL_H_VERSION__
#define __REQUIRED_RPCSAL_H_VERSION__ 100
#endif

#include "rpc.h"
#include "rpcndr.h"

#ifndef __RPCNDR_H_VERSION__
#error this stub requires an updated version of <rpcndr.h>
#endif // __RPCNDR_H_VERSION__

#ifndef COM_NO_WINDOWS_H
#include "windows.h"
#include "ole2.h"
#endif /*COM_NO_WINDOWS_H*/

#ifndef __sqlncli_h__
#define __sqlncli_h__

#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#pragma once
#endif

/* Forward Declarations */ 

#ifndef __ICommandWithParameters_FWD_DEFINED__
#define __ICommandWithParameters_FWD_DEFINED__
typedef interface ICommandWithParameters ICommandWithParameters;
#endif 	/* __ICommandWithParameters_FWD_DEFINED__ */


#ifndef __IUMSInitialize_FWD_DEFINED__
#define __IUMSInitialize_FWD_DEFINED__
typedef interface IUMSInitialize IUMSInitialize;
#endif 	/* __IUMSInitialize_FWD_DEFINED__ */


#ifndef __ISQLServerErrorInfo_FWD_DEFINED__
#define __ISQLServerErrorInfo_FWD_DEFINED__
typedef interface ISQLServerErrorInfo ISQLServerErrorInfo;
#endif 	/* __ISQLServerErrorInfo_FWD_DEFINED__ */


#ifndef __IRowsetFastLoad_FWD_DEFINED__
#define __IRowsetFastLoad_FWD_DEFINED__
typedef interface IRowsetFastLoad IRowsetFastLoad;
#endif 	/* __IRowsetFastLoad_FWD_DEFINED__ */


#ifndef __ISchemaLock_FWD_DEFINED__
#define __ISchemaLock_FWD_DEFINED__
typedef interface ISchemaLock ISchemaLock;
#endif 	/* __ISchemaLock_FWD_DEFINED__ */


#ifndef __IBCPSession_FWD_DEFINED__
#define __IBCPSession_FWD_DEFINED__
typedef interface IBCPSession IBCPSession;
#endif 	/* __IBCPSession_FWD_DEFINED__ */


#ifndef __IBCPSession2_FWD_DEFINED__
#define __IBCPSession2_FWD_DEFINED__
typedef interface IBCPSession2 IBCPSession2;
#endif 	/* __IBCPSession2_FWD_DEFINED__ */


#ifndef __ISSAbort_FWD_DEFINED__
#define __ISSAbort_FWD_DEFINED__
typedef interface ISSAbort ISSAbort;
#endif 	/* __ISSAbort_FWD_DEFINED__ */


#ifndef __ISSCommandWithParameters_FWD_DEFINED__
#define __ISSCommandWithParameters_FWD_DEFINED__
typedef interface ISSCommandWithParameters ISSCommandWithParameters;
#endif 	/* __ISSCommandWithParameters_FWD_DEFINED__ */


#ifndef __IDBAsynchStatus_FWD_DEFINED__
#define __IDBAsynchStatus_FWD_DEFINED__
typedef interface IDBAsynchStatus IDBAsynchStatus;
#endif 	/* __IDBAsynchStatus_FWD_DEFINED__ */


#ifndef __ISSAsynchStatus_FWD_DEFINED__
#define __ISSAsynchStatus_FWD_DEFINED__
typedef interface ISSAsynchStatus ISSAsynchStatus;
#endif 	/* __ISSAsynchStatus_FWD_DEFINED__ */


/* header files for imported files */
#include "unknwn.h"
#include "oaidl.h"

#ifdef __cplusplus
extern "C"{
#endif 


/* interface __MIDL_itf_sqlncli_0000_0000 */
/* [local] */ 

//-----------------------------------------------------------------------------
// File:        sqlncli.h
//
// Copyright:   Copyright (c) Microsoft Corporation
//
// Contents:    SQL Server Native Client OLEDB provider and ODBC driver specific
//              definitions.
//
//-----------------------------------------------------------------------------

#if !defined(SQLNCLI_VER)
#define SQLNCLI_VER 1100
#endif

#if SQLNCLI_VER >= 1100

#define SQLNCLI_PRODUCT_NAME_FULL_VER_ANSI      "Microsoft SQL Server Native Client 11.0"
#define SQLNCLI_PRODUCT_NAME_FULL_ANSI          "Microsoft SQL Server Native Client"
#define SQLNCLI_PRODUCT_NAME_SHORT_VER_ANSI     "SQL Server Native Client 11.0"
#define SQLNCLI_PRODUCT_NAME_SHORT_ANSI         "SQL Server Native Client"

#define SQLNCLI_FILE_NAME_ANSI                  "sqlncli"
#define SQLNCLI_FILE_NAME_VER_ANSI              "sqlncli11"
#define SQLNCLI_FILE_NAME_FULL_ANSI             "sqlncli11.dll"

#define SQLNCLI_PRODUCT_NAME_FULL_VER_UNICODE   L"Microsoft SQL Server Native Client 11.0"
#define SQLNCLI_PRODUCT_NAME_FULL_UNICODE       L"Microsoft SQL Server Native Client"
#define SQLNCLI_PRODUCT_NAME_SHORT_VER_UNICODE  L"SQL Server Native Client 11.0"
#define SQLNCLI_PRODUCT_NAME_SHORT_UNICODE      L"SQL Server Native Client"

#define SQLNCLI_FILE_NAME_UNICODE               L"sqlncli"
#define SQLNCLI_FILE_NAME_VER_UNICODE           L"sqlncli11"
#define SQLNCLI_FILE_NAME_FULL_UNICODE          L"sqlncli11.dll"

#if defined(_SQLNCLI_OLEDB_) || !defined(_SQLNCLI_ODBC_)

#define SQLNCLI_VI_PROG_ID_ANSI                 "SQLNCLI11"
#define SQLNCLI_VI_ERROR_LOOKUP_PROG_ID_ANSI    "SQLNCLI11.ErrorLookup"
#define SQLNCLI_VI_ENUMERATOR_PROG_ID_ANSI      "SQLNCLI11.Enumerator"

#define SQLNCLI_PROG_ID_ANSI                    "SQLNCLI11.1"
#define SQLNCLI_ERROR_LOOKUP_PROG_ID_ANSI       "SQLNCLI11.ErrorLookup.1"
#define SQLNCLI_ENUMERATOR_PROG_ID_ANSI         "SQLNCLI11.Enumerator.1"

#define SQLNCLI_VI_PROG_ID_UNICODE              L"SQLNCLI11"
#define SQLNCLI_VI_ERROR_LOOKUP_PROG_ID_UNICODE L"SQLNCLI11.ErrorLookup"
#define SQLNCLI_VI_ENUMERATOR_PROG_ID_UNICODE   L"SQLNCLI11.Enumerator"

#define SQLNCLI_PROG_ID_UNICODE                 L"SQLNCLI11.1"
#define SQLNCLI_ERROR_LOOKUP_PROG_ID_UNICODE    L"SQLNCLI11.ErrorLookup.1"
#define SQLNCLI_ENUMERATOR_PROG_ID_UNICODE      L"SQLNCLI11.Enumerator.1"

#define SQLNCLI_CLSID                           CLSID_SQLNCLI11
#define SQLNCLI_ERROR_CLSID                     CLSID_SQLNCLI11_ERROR
#define SQLNCLI_ENUMERATOR_CLSID                CLSID_SQLNCLI11_ENUMERATOR

#endif // defined(_SQLNCLI_OLEDB_) || !defined(_SQLNCLI_ODBC_)

#elif SQLNCLI_VER >= 1000

#define SQLNCLI_PRODUCT_NAME_FULL_VER_ANSI      "Microsoft SQL Server Native Client 10.0"
#define SQLNCLI_PRODUCT_NAME_FULL_ANSI          "Microsoft SQL Server Native Client"
#define SQLNCLI_PRODUCT_NAME_SHORT_VER_ANSI     "SQL Server Native Client 10.0"
#define SQLNCLI_PRODUCT_NAME_SHORT_ANSI         "SQL Server Native Client"

#define SQLNCLI_FILE_NAME_ANSI                  "sqlncli"
#define SQLNCLI_FILE_NAME_VER_ANSI              "sqlncli10"
#define SQLNCLI_FILE_NAME_FULL_ANSI             "sqlncli10.dll"

#define SQLNCLI_PRODUCT_NAME_FULL_VER_UNICODE   L"Microsoft SQL Server Native Client 10.0"
#define SQLNCLI_PRODUCT_NAME_FULL_UNICODE       L"Microsoft SQL Server Native Client"
#define SQLNCLI_PRODUCT_NAME_SHORT_VER_UNICODE  L"SQL Server Native Client 10.0"
#define SQLNCLI_PRODUCT_NAME_SHORT_UNICODE      L"SQL Server Native Client"

#define SQLNCLI_FILE_NAME_UNICODE               L"sqlncli"
#define SQLNCLI_FILE_NAME_VER_UNICODE           L"sqlncli10"
#define SQLNCLI_FILE_NAME_FULL_UNICODE          L"sqlncli10.dll"

#if defined(_SQLNCLI_OLEDB_) || !defined(_SQLNCLI_ODBC_)

#define SQLNCLI_VI_PROG_ID_ANSI                 "SQLNCLI10"
#define SQLNCLI_VI_ERROR_LOOKUP_PROG_ID_ANSI    "SQLNCLI10 ErrorLookup"
#define SQLNCLI_VI_ENUMERATOR_PROG_ID_ANSI      "SQLNCLI10 Enumerator"

#define SQLNCLI_PROG_ID_ANSI                    "SQLNCLI10.1"
#define SQLNCLI_ERROR_LOOKUP_PROG_ID_ANSI       "SQLNCLI10 ErrorLookup.1"
#define SQLNCLI_ENUMERATOR_PROG_ID_ANSI         "SQLNCLI10 Enumerator.1"

#define SQLNCLI_VI_PROG_ID_UNICODE              L"SQLNCLI10"
#define SQLNCLI_VI_ERROR_LOOKUP_PROG_ID_UNICODE L"SQLNCLI10 ErrorLookup"
#define SQLNCLI_VI_ENUMERATOR_PROG_ID_UNICODE   L"SQLNCLI10 Enumerator"

#define SQLNCLI_PROG_ID_UNICODE                 L"SQLNCLI10.1"
#define SQLNCLI_ERROR_LOOKUP_PROG_ID_UNICODE    L"SQLNCLI10 ErrorLookup.1"
#define SQLNCLI_ENUMERATOR_PROG_ID_UNICODE      L"SQLNCLI10 Enumerator.1"

#define SQLNCLI_CLSID                           CLSID_SQLNCLI10
#define SQLNCLI_ERROR_CLSID                     CLSID_SQLNCLI10_ERROR
#define SQLNCLI_ENUMERATOR_CLSID                CLSID_SQLNCLI10_ENUMERATOR

#endif // defined(_SQLNCLI_OLEDB_) || !defined(_SQLNCLI_ODBC_)

#else

#define SQLNCLI_PRODUCT_NAME_FULL_VER_ANSI      "Microsoft SQL Server Native Client"
#define SQLNCLI_PRODUCT_NAME_FULL_ANSI          "Microsoft SQL Server Native Client"
#define SQLNCLI_PRODUCT_NAME_SHORT_VER_ANSI     "SQL Native Client"
#define SQLNCLI_PRODUCT_NAME_SHORT_ANSI         "SQL Native Client"

#define SQLNCLI_FILE_NAME_ANSI                  "sqlncli"
#define SQLNCLI_FILE_NAME_VER_ANSI              "sqlncli"
#define SQLNCLI_FILE_NAME_FULL_ANSI             "sqlncli.dll"

#define SQLNCLI_PRODUCT_NAME_FULL_VER_UNICODE   L"Microsoft SQL Server Native Client"
#define SQLNCLI_PRODUCT_NAME_FULL_UNICODE       L"Microsoft SQL Server Native Client"
#define SQLNCLI_PRODUCT_NAME_SHORT_VER_UNICODE  L"SQL Native Client"
#define SQLNCLI_PRODUCT_NAME_SHORT_UNICODE      L"SQL Native Client"

#define SQLNCLI_FILE_NAME_UNICODE               L"sqlncli"
#define SQLNCLI_FILE_NAME_VER_UNICODE           L"sqlncli"
#define SQLNCLI_FILE_NAME_FULL_UNICODE          L"sqlncli.dll"

#if defined(_SQLNCLI_OLEDB_) || !defined(_SQLNCLI_ODBC_)

#define SQLNCLI_VI_PROG_ID_ANSI                 "SQLNCLI"
#define SQLNCLI_VI_ERROR_LOOKUP_PROG_ID_ANSI    "SQLNCLI ErrorLookup"
#define SQLNCLI_VI_ENUMERATOR_PROG_ID_ANSI      "SQLNCLI Enumerator"

#define SQLNCLI_PROG_ID_ANSI                    "SQLNCLI.1"
#define SQLNCLI_ERROR_LOOKUP_PROG_ID_ANSI       "SQLNCLI ErrorLookup.1"
#define SQLNCLI_ENUMERATOR_PROG_ID_ANSI         "SQLNCLI Enumerator.1"

#define SQLNCLI_VI_PROG_ID_UNICODE              L"SQLNCLI"
#define SQLNCLI_VI_ERROR_LOOKUP_PROG_ID_UNICODE L"SQLNCLI ErrorLookup"
#define SQLNCLI_VI_ENUMERATOR_PROG_ID_UNICODE   L"SQLNCLI Enumerator"

#define SQLNCLI_PROG_ID_UNICODE                 L"SQLNCLI.1"
#define SQLNCLI_ERROR_LOOKUP_PROG_ID_UNICODE    L"SQLNCLI ErrorLookup.1"
#define SQLNCLI_ENUMERATOR_PROG_ID_UNICODE      L"SQLNCLI Enumerator.1"

#define SQLNCLI_CLSID                           CLSID_SQLNCLI
#define SQLNCLI_ERROR_CLSID                     CLSID_SQLNCLI_ERROR
#define SQLNCLI_ENUMERATOR_CLSID                CLSID_SQLNCLI_ENUMERATOR

#endif  // defined(_SQLNCLI_OLEDB_) || !defined(_SQLNCLI_ODBC_)

#endif  // SQLNCLI_VER >= 1100

// define the character type agnostic constants
#if defined(_UNICODE) || defined(UNICODE)

#define SQLNCLI_PRODUCT_NAME_FULL_VER           SQLNCLI_PRODUCT_NAME_FULL_VER_UNICODE
#define SQLNCLI_PRODUCT_NAME_FULL               SQLNCLI_PRODUCT_NAME_FULL_UNICODE
#define SQLNCLI_PRODUCT_NAME_SHORT_VER          SQLNCLI_PRODUCT_NAME_SHORT_VER_UNICODE
#define SQLNCLI_PRODUCT_NAME_SHORT              SQLNCLI_PRODUCT_NAME_SHORT_UNICODE

#define SQLNCLI_FILE_NAME                       SQLNCLI_FILE_NAME_UNICODE
#define SQLNCLI_FILE_NAME_VER                   SQLNCLI_FILE_NAME_VER_UNICODE
#define SQLNCLI_FILE_NAME_FULL                  SQLNCLI_FILE_NAME_FULL_UNICODE

#if defined(_SQLNCLI_OLEDB_) || !defined(_SQLNCLI_ODBC_)

#define SQLNCLI_VI_PROG_ID                      SQLNCLI_VI_PROG_ID_UNICODE
#define SQLNCLI_VI_ERROR_LOOKUP_PROG_ID         SQLNCLI_VI_ERROR_LOOKUP_PROG_ID_UNICODE
#define SQLNCLI_VI_ENUMERATOR_PROG_ID           SQLNCLI_VI_ENUMERATOR_PROG_ID_UNICODE

#define SQLNCLI_PROG_ID                         SQLNCLI_PROG_ID_UNICODE
#define SQLNCLI_ERROR_LOOKUP_PROG_ID            SQLNCLI_ERROR_LOOKUP_PROG_ID_UNICODE
#define SQLNCLI_ENUMERATOR_PROG_ID              SQLNCLI_ENUMERATOR_PROG_ID_UNICODE

#endif  // defined(_SQLNCLI_OLEDB_) || !defined(_SQLNCLI_ODBC_)

#else   // _UNICODE || UNICODE

#define SQLNCLI_PRODUCT_NAME_FULL_VER           SQLNCLI_PRODUCT_NAME_FULL_VER_ANSI
#define SQLNCLI_PRODUCT_NAME_FULL               SQLNCLI_PRODUCT_NAME_FULL_ANSI
#define SQLNCLI_PRODUCT_NAME_SHORT_VER          SQLNCLI_PRODUCT_NAME_SHORT_VER_ANSI
#define SQLNCLI_PRODUCT_NAME_SHORT              SQLNCLI_PRODUCT_NAME_SHORT_ANSI

#define SQLNCLI_FILE_NAME                       SQLNCLI_FILE_NAME_ANSI
#define SQLNCLI_FILE_NAME_VER                   SQLNCLI_FILE_NAME_VER_ANSI
#define SQLNCLI_FILE_NAME_FULL                  SQLNCLI_FILE_NAME_FULL_ANSI

#if defined(_SQLNCLI_OLEDB_) || !defined(_SQLNCLI_ODBC_)

#define SQLNCLI_VI_PROG_ID                      SQLNCLI_VI_PROG_ID_ANSI
#define SQLNCLI_VI_ERROR_LOOKUP_PROG_ID         SQLNCLI_VI_ERROR_LOOKUP_PROG_ID_ANSI
#define SQLNCLI_VI_ENUMERATOR_PROG_ID           SQLNCLI_VI_ENUMERATOR_PROG_ID_ANSI

#define SQLNCLI_PROG_ID                         SQLNCLI_PROG_ID_ANSI
#define SQLNCLI_ERROR_LOOKUP_PROG_ID            SQLNCLI_ERROR_LOOKUP_PROG_ID_ANSI
#define SQLNCLI_ENUMERATOR_PROG_ID              SQLNCLI_ENUMERATOR_PROG_ID_ANSI

#endif  // defined(_SQLNCLI_OLEDB_) || !defined(_SQLNCLI_ODBC_)

#endif  // _UNICODE || UNICODE

#if defined(_SQLNCLI_ODBC_) || !defined(_SQLNCLI_OLEDB_)

#define SQLNCLI_DRIVER_NAME                     SQLNCLI_PRODUCT_NAME_SHORT_VER

#endif

// OLEDB part of SQL Server Native Client header - begin here
#if defined(_SQLNCLI_OLEDB_) || !defined(_SQLNCLI_ODBC_)
#ifndef  __oledb_h__
#include <oledb.h>
#endif  /*__oledb_h__*/

#if 0        // This is already defined in oledb.h

#ifdef _WIN64

// Length of a non-character object, size
typedef ULONGLONG			DBLENGTH;

// Offset within a rowset
typedef LONGLONG				DBROWOFFSET;

// Number of rows
typedef LONGLONG				DBROWCOUNT;

typedef ULONGLONG			DBCOUNTITEM;

// Ordinal (column number, etc.)
typedef ULONGLONG			DBORDINAL;

typedef LONGLONG				DB_LORDINAL;

// Bookmarks
typedef ULONGLONG			DBBKMARK;
// Offset in the buffer

typedef ULONGLONG			DBBYTEOFFSET;
// Reference count of each row/accessor  handle

typedef ULONG				DBREFCOUNT;

// Parameters
typedef ULONGLONG			DB_UPARAMS;

typedef LONGLONG				DB_LPARAMS;

// hash values corresponding to the elements (bookmarks)
typedef DWORDLONG			DBHASHVALUE;

// For reserve
typedef DWORDLONG			DB_DWRESERVE;

typedef LONGLONG				DB_LRESERVE;

typedef ULONGLONG			DB_URESERVE;

#else //_WIN64

// Length of a non-character object, size
typedef ULONG DBLENGTH;

// Offset within a rowset
typedef LONG DBROWOFFSET;

// Number of rows
typedef LONG DBROWCOUNT;

typedef ULONG DBCOUNTITEM;

// Ordinal (column number, etc.)
typedef ULONG DBORDINAL;

typedef LONG DB_LORDINAL;

// Bookmarks
typedef ULONG DBBKMARK;

// Offset in the buffer
typedef ULONG DBBYTEOFFSET;

// Reference count of each row handle
typedef ULONG DBREFCOUNT;

// Parameters
typedef ULONG DB_UPARAMS;

typedef LONG DB_LPARAMS;

// hash values corresponding to the elements (bookmarks)
typedef DWORD DBHASHVALUE;

// For reserve
typedef DWORD DB_DWRESERVE;

typedef LONG DB_LRESERVE;

typedef ULONG DB_URESERVE;

#endif	// _WIN64
typedef DWORD DBKIND;


enum DBKINDENUM
    {	DBKIND_GUID_NAME	= 0,
	DBKIND_GUID_PROPID	= ( DBKIND_GUID_NAME + 1 ) ,
	DBKIND_NAME	= ( DBKIND_GUID_PROPID + 1 ) ,
	DBKIND_PGUID_NAME	= ( DBKIND_NAME + 1 ) ,
	DBKIND_PGUID_PROPID	= ( DBKIND_PGUID_NAME + 1 ) ,
	DBKIND_PROPID	= ( DBKIND_PGUID_PROPID + 1 ) ,
	DBKIND_GUID	= ( DBKIND_PROPID + 1 ) 
    } ;
typedef struct tagDBID
    {
    union 
        {
        GUID guid;
        GUID *pguid;
         /* Empty union arm */ 
        } 	uGuid;
    DBKIND eKind;
    union 
        {
        LPOLESTR pwszName;
        ULONG ulPropid;
         /* Empty union arm */ 
        } 	uName;
    } 	DBID;

typedef struct tagDB_NUMERIC
    {
    BYTE precision;
    BYTE scale;
    BYTE sign;
    BYTE val[ 16 ];
    } 	DB_NUMERIC;

typedef struct tagDBDATE
    {
    SHORT year;
    USHORT month;
    USHORT day;
    } 	DBDATE;

typedef struct tagDBTIME
    {
    USHORT hour;
    USHORT minute;
    USHORT second;
    } 	DBTIME;

typedef struct tagDBTIMESTAMP
    {
    SHORT year;
    USHORT month;
    USHORT day;
    USHORT hour;
    USHORT minute;
    USHORT second;
    ULONG fraction;
    } 	DBTIMESTAMP;

typedef struct tagDBOBJECT
    {
    DWORD dwFlags;
    IID iid;
    } 	DBOBJECT;

typedef WORD DBTYPE;

typedef ULONG_PTR HACCESSOR;

typedef ULONG_PTR HCHAPTER;

typedef DWORD DBPARAMFLAGS;

typedef struct tagDBPARAMINFO
    {
    DBPARAMFLAGS dwFlags;
    DBORDINAL iOrdinal;
    LPOLESTR pwszName;
    ITypeInfo *pTypeInfo;
    DBLENGTH ulParamSize;
    DBTYPE wType;
    BYTE bPrecision;
    BYTE bScale;
    } 	DBPARAMINFO;

typedef DWORD DBPROPID;

typedef struct tagDBPROPIDSET
    {
    DBPROPID *rgPropertyIDs;
    ULONG cPropertyIDs;
    GUID guidPropertySet;
    } 	DBPROPIDSET;

typedef DWORD DBPROPFLAGS;

typedef DWORD DBPROPOPTIONS;

typedef DWORD DBPROPSTATUS;

typedef struct tagDBPROP
    {
    DBPROPID dwPropertyID;
    DBPROPOPTIONS dwOptions;
    DBPROPSTATUS dwStatus;
    DBID colid;
    VARIANT vValue;
    } 	DBPROP;

typedef struct tagDBPROPSET
    {
    DBPROP *rgProperties;
    ULONG cProperties;
    GUID guidPropertySet;
    } 	DBPROPSET;



extern RPC_IF_HANDLE __MIDL_itf_sqlncli_0000_0000_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_sqlncli_0000_0000_v0_0_s_ifspec;

#ifndef __ICommandWithParameters_INTERFACE_DEFINED__
#define __ICommandWithParameters_INTERFACE_DEFINED__

/* interface ICommandWithParameters */
/* [unique][uuid][object][local] */ 

typedef struct tagDBPARAMBINDINFO
    {
    LPOLESTR pwszDataSourceType;
    LPOLESTR pwszName;
    DBLENGTH ulParamSize;
    DBPARAMFLAGS dwFlags;
    BYTE bPrecision;
    BYTE bScale;
    } 	DBPARAMBINDINFO;


EXTERN_C const IID IID_ICommandWithParameters;

#if defined(__cplusplus) && !defined(CINTERFACE)
    
    MIDL_INTERFACE("0c733a64-2a1c-11ce-ade5-00aa0044773d")
    ICommandWithParameters : public IUnknown
    {
    public:
        virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetParameterInfo( 
            /* [out][in] */ DB_UPARAMS *pcParams,
            /* [size_is][size_is][out] */ DBPARAMINFO **prgParamInfo,
            /* [out] */ OLECHAR **ppNamesBuffer) = 0;
        
        virtual /* [local] */ HRESULT STDMETHODCALLTYPE MapParameterNames( 
            /* [in] */ DB_UPARAMS cParamNames,
            /* [size_is][in] */ const OLECHAR *rgParamNames[  ],
            /* [size_is][out] */ DB_LPARAMS rgParamOrdinals[  ]) = 0;
        
        virtual /* [local] */ HRESULT STDMETHODCALLTYPE SetParameterInfo( 
            /* [in] */ DB_UPARAMS cParams,
            /* [size_is][unique][in] */ const DB_UPARAMS rgParamOrdinals[  ],
            /* [size_is][unique][in] */ const DBPARAMBINDINFO rgParamBindInfo[  ]) = 0;
        
    };
    
#else 	/* C style interface */

    typedef struct ICommandWithParametersVtbl
    {
        BEGIN_INTERFACE
        
        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
            ICommandWithParameters * This,
            /* [in] */ REFIID riid,
            /* [annotation][iid_is][out] */ 
            __RPC__deref_out  void **ppvObject);
        
        ULONG ( STDMETHODCALLTYPE *AddRef )( 
            ICommandWithParameters * This);
        
        ULONG ( STDMETHODCALLTYPE *Release )( 
            ICommandWithParameters * This);
        
        /* [local] */ HRESULT ( STDMETHODCALLTYPE *GetParameterInfo )( 
            ICommandWithParameters * This,
            /* [out][in] */ DB_UPARAMS *pcParams,
            /* [size_is][size_is][out] */ DBPARAMINFO **prgParamInfo,
            /* [out] */ OLECHAR **ppNamesBuffer);
        
        /* [local] */ HRESULT ( STDMETHODCALLTYPE *MapParameterNames )( 
            ICommandWithParameters * This,
            /* [in] */ DB_UPARAMS cParamNames,
            /* [size_is][in] */ const OLECHAR *rgParamNames[  ],
            /* [size_is][out] */ DB_LPARAMS rgParamOrdinals[  ]);
        
        /* [local] */ HRESULT ( STDMETHODCALLTYPE *SetParameterInfo )( 
            ICommandWithParameters * This,
            /* [in] */ DB_UPARAMS cParams,
            /* [size_is][unique][in] */ const DB_UPARAMS rgParamOrdinals[  ],
            /* [size_is][unique][in] */ const DBPARAMBINDINFO rgParamBindInfo[  ]);
        
        END_INTERFACE
    } ICommandWithParametersVtbl;

    interface ICommandWithParameters
    {
        CONST_VTBL struct ICommandWithParametersVtbl *lpVtbl;
    };

    

#ifdef COBJMACROS


#define ICommandWithParameters_QueryInterface(This,riid,ppvObject)	\
    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) 

#define ICommandWithParameters_AddRef(This)	\
    ( (This)->lpVtbl -> AddRef(This) ) 

#define ICommandWithParameters_Release(This)	\
    ( (This)->lpVtbl -> Release(This) ) 


#define ICommandWithParameters_GetParameterInfo(This,pcParams,prgParamInfo,ppNamesBuffer)	\
    ( (This)->lpVtbl -> GetParameterInfo(This,pcParams,prgParamInfo,ppNamesBuffer) ) 

#define ICommandWithParameters_MapParameterNames(This,cParamNames,rgParamNames,rgParamOrdinals)	\
    ( (This)->lpVtbl -> MapParameterNames(This,cParamNames,rgParamNames,rgParamOrdinals) ) 

#define ICommandWithParameters_SetParameterInfo(This,cParams,rgParamOrdinals,rgParamBindInfo)	\
    ( (This)->lpVtbl -> SetParameterInfo(This,cParams,rgParamOrdinals,rgParamBindInfo) ) 

#endif /* COBJMACROS */


#endif 	/* C style interface */



/* [call_as] */ HRESULT STDMETHODCALLTYPE ICommandWithParameters_RemoteGetParameterInfo_Proxy( 
    ICommandWithParameters * This,
    /* [out][in] */ DB_UPARAMS *pcParams,
    /* [size_is][size_is][out] */ DBPARAMINFO **prgParamInfo,
    /* [size_is][size_is][out] */ DBBYTEOFFSET **prgNameOffsets,
    /* [out][in] */ DBLENGTH *pcbNamesBuffer,
    /* [size_is][size_is][unique][out][in] */ OLECHAR **ppNamesBuffer,
    /* [out] */ IErrorInfo **ppErrorInfoRem);


void __RPC_STUB ICommandWithParameters_RemoteGetParameterInfo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


/* [call_as] */ HRESULT STDMETHODCALLTYPE ICommandWithParameters_RemoteMapParameterNames_Proxy( 
    ICommandWithParameters * This,
    /* [in] */ DB_UPARAMS cParamNames,
    /* [size_is][in] */ LPCOLESTR *rgParamNames,
    /* [size_is][out] */ DB_LPARAMS *rgParamOrdinals,
    /* [out] */ IErrorInfo **ppErrorInfoRem);


void __RPC_STUB ICommandWithParameters_RemoteMapParameterNames_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


/* [call_as] */ HRESULT STDMETHODCALLTYPE ICommandWithParameters_RemoteSetParameterInfo_Proxy( 
    ICommandWithParameters * This,
    /* [in] */ DB_UPARAMS cParams,
    /* [size_is][unique][in] */ const DB_UPARAMS *rgParamOrdinals,
    /* [size_is][unique][in] */ const DBPARAMBINDINFO *rgParamBindInfo,
    /* [out] */ IErrorInfo **ppErrorInfoRem);


void __RPC_STUB ICommandWithParameters_RemoteSetParameterInfo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);



#endif 	/* __ICommandWithParameters_INTERFACE_DEFINED__ */


/* interface __MIDL_itf_sqlncli_0000_0001 */
/* [local] */ 

typedef DWORD DBASYNCHOP;

typedef DWORD DBASYNCHPHASE;

#endif       // This is already defined in oledb.h

#ifndef _SQLNCLI_OLEDB_IGNORE_DEPRECATION_WARNING_
    #define _SQLNCLI_OLEDB_DEPRECATE_WARNING __declspec(deprecated("The SQL Server Native Client OLEDB provider is deprecated and will be removed in a future release of SQL Server Native Client. To disable this warning, define the following symbol in your application: _SQLNCLI_OLEDB_IGNORE_DEPRECATION_WARNING_"))
#else
    #define _SQLNCLI_OLEDB_DEPRECATE_WARNING
#endif
//-------------------------------------------------------------------
// Variant Access macros, similar to ole automation.
//-------------------------------------------------------------------
#define V_SS_VT(X)               ((X)->vt)
#define V_SS_UNION(X, Y)         ((X)->Y)

#define V_SS_UI1(X)              V_SS_UNION(X, bTinyIntVal)
#define V_SS_I2(X)               V_SS_UNION(X, sShortIntVal)
#define V_SS_I4(X)               V_SS_UNION(X, lIntVal)
#define V_SS_I8(X)               V_SS_UNION(X, llBigIntVal)

#define V_SS_R4(X)               V_SS_UNION(X, fltRealVal)
#define V_SS_R8(X)               V_SS_UNION(X, dblFloatVal)
#define V_SS_UI4(X)              V_SS_UNION(X, ulVal)

#define V_SS_MONEY(X)            V_SS_UNION(X, cyMoneyVal)
#define V_SS_SMALLMONEY(X)       V_SS_UNION(X, cyMoneyVal)

#define V_SS_WSTRING(X)          V_SS_UNION(X, NCharVal)
#define V_SS_WVARSTRING(X)       V_SS_UNION(X, NCharVal)

#define V_SS_STRING(X)           V_SS_UNION(X, CharVal)
#define V_SS_VARSTRING(X)        V_SS_UNION(X, CharVal)

#define V_SS_BIT(X)              V_SS_UNION(X, fBitVal)
#define V_SS_GUID(X)             V_SS_UNION(X, rgbGuidVal)

#define V_SS_NUMERIC(X)          V_SS_UNION(X, numNumericVal)
#define V_SS_DECIMAL(X)          V_SS_UNION(X, numNumericVal)

#define V_SS_BINARY(X)           V_SS_UNION(X, BinaryVal)
#define V_SS_VARBINARY(X)        V_SS_UNION(X, BinaryVal)

#define V_SS_DATETIME(X)         V_SS_UNION(X, tsDateTimeVal)
#define V_SS_SMALLDATETIME(X)    V_SS_UNION(X, tsDateTimeVal)

#define V_SS_UNKNOWN(X)          V_SS_UNION(X, UnknownType)

//Text and image types.
#define V_SS_IMAGE(X)            V_SS_UNION(X, ImageVal)
#define V_SS_TEXT(X)             V_SS_UNION(X, TextVal)
#define V_SS_NTEXT(X)            V_SS_UNION(X, NTextVal)

//Microsoft SQL Server 2008 datetime.
#define V_SS_DATE(X)             V_SS_UNION(X, dDateVal)
#define V_SS_TIME2(X)            V_SS_UNION(X, Time2Val)
#define V_SS_DATETIME2(X)        V_SS_UNION(X, DateTimeVal)
#define V_SS_DATETIMEOFFSET(X)   V_SS_UNION(X, DateTimeOffsetVal)

//-------------------------------------------------------------------
// define SQL Server specific types.
//-------------------------------------------------------------------
typedef enum DBTYPEENUM EOledbTypes;
#define DBTYPE_XML               ((EOledbTypes) 141) // introduced in SQL 2005
#define DBTYPE_TABLE             ((EOledbTypes) 143) // introduced in SQL 2008
#define DBTYPE_DBTIME2           ((EOledbTypes) 145) // introduced in SQL 2008
#define DBTYPE_DBTIMESTAMPOFFSET ((EOledbTypes) 146) // introduced in SQL 2008
#ifdef  _SQLOLEDB_H_
#undef DBTYPE_SQLVARIANT
#endif //_SQLOLEDB_H_
#define DBTYPE_SQLVARIANT        ((EOledbTypes) 144) // introduced in MDAC 2.5


#ifndef  _SQLOLEDB_H_
enum SQLVARENUM
    {
    VT_SS_EMPTY = DBTYPE_EMPTY,
    VT_SS_NULL = DBTYPE_NULL,
    VT_SS_UI1 = DBTYPE_UI1,
    VT_SS_I2 = DBTYPE_I2,
    VT_SS_I4 = DBTYPE_I4,
    VT_SS_I8 = DBTYPE_I8,

    //Floats
    VT_SS_R4  = DBTYPE_R4,
    VT_SS_R8 = DBTYPE_R8,

    //Money
    VT_SS_MONEY = DBTYPE_CY,
    VT_SS_SMALLMONEY  = 200,

    //Strings
    VT_SS_WSTRING    = 201,
    VT_SS_WVARSTRING = 202,

    VT_SS_STRING     = 203,
    VT_SS_VARSTRING  = 204,

    //Bit
    VT_SS_BIT        = DBTYPE_BOOL,

    //Guid
    VT_SS_GUID       = DBTYPE_GUID,

    //Exact precision
    VT_SS_NUMERIC    = DBTYPE_NUMERIC,
    VT_SS_DECIMAL    = 205,

    //Datetime
    VT_SS_DATETIME      = DBTYPE_DBTIMESTAMP,
    VT_SS_SMALLDATETIME =206,

    //Binary
    VT_SS_BINARY =207,
    VT_SS_VARBINARY = 208,
    //Future
    VT_SS_UNKNOWN   = 209,

    //Additional datetime
    VT_SS_DATE = DBTYPE_DBDATE,
    VT_SS_TIME2 = DBTYPE_DBTIME2,
    VT_SS_DATETIME2 = 212,
    VT_SS_DATETIMEOFFSET = DBTYPE_DBTIMESTAMPOFFSET,
    };
typedef unsigned short SSVARTYPE;


enum DBPARAMFLAGSENUM_SS_100
    {	DBPARAMFLAGS_SS_ISVARIABLESCALE	= 0x40000000
    } ;
enum DBCOLUMNFLAGSENUM_SS_100
    {   DBCOLUMNFLAGS_SS_ISVARIABLESCALE    = 0x40000000,
        DBCOLUMNFLAGS_SS_ISCOLUMNSET        = 0x80000000
    } ;

//-------------------------------------------------------------------
// Class Factory Interface used to initialize pointer to UMS.
//-------------------------------------------------------------------


extern RPC_IF_HANDLE __MIDL_itf_sqlncli_0000_0001_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_sqlncli_0000_0001_v0_0_s_ifspec;

#ifndef __IUMSInitialize_INTERFACE_DEFINED__
#define __IUMSInitialize_INTERFACE_DEFINED__

/* interface IUMSInitialize */
/* [unique][uuid][object][local] */ 


EXTERN_C const IID IID_IUMSInitialize;

#if defined(__cplusplus) && !defined(CINTERFACE)
    
    MIDL_INTERFACE("5cf4ca14-ef21-11d0-97e7-00c04fc2ad98")
    IUMSInitialize : public IUnknown
    {
    public:
        virtual HRESULT STDMETHODCALLTYPE Initialize( 
            /* [in] */ void *pUMS) = 0;
        
    };
    
#else 	/* C style interface */

    typedef struct IUMSInitializeVtbl
    {
        BEGIN_INTERFACE
        
        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
            IUMSInitialize * This,
            /* [in] */ REFIID riid,
            /* [annotation][iid_is][out] */ 
            __RPC__deref_out  void **ppvObject);
        
        ULONG ( STDMETHODCALLTYPE *AddRef )( 
            IUMSInitialize * This);
        
        ULONG ( STDMETHODCALLTYPE *Release )( 
            IUMSInitialize * This);
        
        HRESULT ( STDMETHODCALLTYPE *Initialize )( 
            IUMSInitialize * This,
            /* [in] */ void *pUMS);
        
        END_INTERFACE
    } IUMSInitializeVtbl;

    interface IUMSInitialize
    {
        CONST_VTBL struct IUMSInitializeVtbl *lpVtbl;
    };

    

#ifdef COBJMACROS


#define IUMSInitialize_QueryInterface(This,riid,ppvObject)	\
    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) 

#define IUMSInitialize_AddRef(This)	\
    ( (This)->lpVtbl -> AddRef(This) ) 

#define IUMSInitialize_Release(This)	\
    ( (This)->lpVtbl -> Release(This) ) 


#define IUMSInitialize_Initialize(This,pUMS)	\
    ( (This)->lpVtbl -> Initialize(This,pUMS) ) 

#endif /* COBJMACROS */


#endif 	/* C style interface */




#endif 	/* __IUMSInitialize_INTERFACE_DEFINED__ */


/* interface __MIDL_itf_sqlncli_0000_0002 */
/* [local] */ 


// the structure returned by  ISQLServerErrorInfo::GetSQLServerInfo
typedef struct tagSSErrorInfo
    {
    LPOLESTR pwszMessage;
    LPOLESTR pwszServer;
    LPOLESTR pwszProcedure;
    LONG lNative;
    BYTE bState;
    BYTE bClass;
    WORD wLineNumber;
    } 	SSERRORINFO;



extern RPC_IF_HANDLE __MIDL_itf_sqlncli_0000_0002_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_sqlncli_0000_0002_v0_0_s_ifspec;

#ifndef __ISQLServerErrorInfo_INTERFACE_DEFINED__
#define __ISQLServerErrorInfo_INTERFACE_DEFINED__

/* interface ISQLServerErrorInfo */
/* [unique][uuid][object][local] */ 


EXTERN_C const IID IID_ISQLServerErrorInfo;

#if defined(__cplusplus) && !defined(CINTERFACE)
    
    MIDL_INTERFACE("5CF4CA12-EF21-11d0-97E7-00C04FC2AD98")
    ISQLServerErrorInfo : public IUnknown
    {
    public:
        virtual HRESULT STDMETHODCALLTYPE GetErrorInfo( 
            /* [out] */ SSERRORINFO **ppErrorInfo,
            /* [annotation][out] */ 
            __deref_out  OLECHAR **ppStringsBuffer) = 0;
        
    };
    
#else 	/* C style interface */

    typedef struct ISQLServerErrorInfoVtbl
    {
        BEGIN_INTERFACE
        
        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
            ISQLServerErrorInfo * This,
            /* [in] */ REFIID riid,
            /* [annotation][iid_is][out] */ 
            __RPC__deref_out  void **ppvObject);
        
        ULONG ( STDMETHODCALLTYPE *AddRef )( 
            ISQLServerErrorInfo * This);
        
        ULONG ( STDMETHODCALLTYPE *Release )( 
            ISQLServerErrorInfo * This);
        
        HRESULT ( STDMETHODCALLTYPE *GetErrorInfo )( 
            ISQLServerErrorInfo * This,
            /* [out] */ SSERRORINFO **ppErrorInfo,
            /* [annotation][out] */ 
            __deref_out  OLECHAR **ppStringsBuffer);
        
        END_INTERFACE
    } ISQLServerErrorInfoVtbl;

    interface ISQLServerErrorInfo
    {
        CONST_VTBL struct ISQLServerErrorInfoVtbl *lpVtbl;
    };

    

#ifdef COBJMACROS


#define ISQLServerErrorInfo_QueryInterface(This,riid,ppvObject)	\
    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) 

#define ISQLServerErrorInfo_AddRef(This)	\
    ( (This)->lpVtbl -> AddRef(This) ) 

#define ISQLServerErrorInfo_Release(This)	\
    ( (This)->lpVtbl -> Release(This) ) 


#define ISQLServerErrorInfo_GetErrorInfo(This,ppErrorInfo,ppStringsBuffer)	\
    ( (This)->lpVtbl -> GetErrorInfo(This,ppErrorInfo,ppStringsBuffer) ) 

#endif /* COBJMACROS */


#endif 	/* C style interface */




#endif 	/* __ISQLServerErrorInfo_INTERFACE_DEFINED__ */


#ifndef __IRowsetFastLoad_INTERFACE_DEFINED__
#define __IRowsetFastLoad_INTERFACE_DEFINED__

/* interface IRowsetFastLoad */
/* [unique][uuid][object][local] */ 


EXTERN_C const IID IID_IRowsetFastLoad;

#if defined(__cplusplus) && !defined(CINTERFACE)
    
    MIDL_INTERFACE("5CF4CA13-EF21-11d0-97E7-00C04FC2AD98")
    IRowsetFastLoad : public IUnknown
    {
    public:
        virtual HRESULT STDMETHODCALLTYPE InsertRow( 
            /* [in] */ HACCESSOR hAccessor,
            /* [in] */ void *pData) = 0;
        
        virtual HRESULT STDMETHODCALLTYPE Commit( 
            /* [in] */ BOOL fDone) = 0;
        
    };
    
#else 	/* C style interface */

    typedef struct IRowsetFastLoadVtbl
    {
        BEGIN_INTERFACE
        
        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
            IRowsetFastLoad * This,
            /* [in] */ REFIID riid,
            /* [annotation][iid_is][out] */ 
            __RPC__deref_out  void **ppvObject);
        
        ULONG ( STDMETHODCALLTYPE *AddRef )( 
            IRowsetFastLoad * This);
        
        ULONG ( STDMETHODCALLTYPE *Release )( 
            IRowsetFastLoad * This);
        
        HRESULT ( STDMETHODCALLTYPE *InsertRow )( 
            IRowsetFastLoad * This,
            /* [in] */ HACCESSOR hAccessor,
            /* [in] */ void *pData);
        
        HRESULT ( STDMETHODCALLTYPE *Commit )( 
            IRowsetFastLoad * This,
            /* [in] */ BOOL fDone);
        
        END_INTERFACE
    } IRowsetFastLoadVtbl;

    interface IRowsetFastLoad
    {
        CONST_VTBL struct IRowsetFastLoadVtbl *lpVtbl;
    };

    

#ifdef COBJMACROS


#define IRowsetFastLoad_QueryInterface(This,riid,ppvObject)	\
    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) 

#define IRowsetFastLoad_AddRef(This)	\
    ( (This)->lpVtbl -> AddRef(This) ) 

#define IRowsetFastLoad_Release(This)	\
    ( (This)->lpVtbl -> Release(This) ) 


#define IRowsetFastLoad_InsertRow(This,hAccessor,pData)	\
    ( (This)->lpVtbl -> InsertRow(This,hAccessor,pData) ) 

#define IRowsetFastLoad_Commit(This,fDone)	\
    ( (This)->lpVtbl -> Commit(This,fDone) ) 

#endif /* COBJMACROS */


#endif 	/* C style interface */




#endif 	/* __IRowsetFastLoad_INTERFACE_DEFINED__ */


/* interface __MIDL_itf_sqlncli_0000_0004 */
/* [local] */ 

#include <pshpack8.h>    // 8-byte structure packing

typedef struct tagDBTIME2
    {
    USHORT hour;
    USHORT minute;
    USHORT second;
    ULONG fraction;
    } 	DBTIME2;

typedef struct tagDBTIMESTAMPOFFSET
    {
    SHORT year;
    USHORT month;
    USHORT day;
    USHORT hour;
    USHORT minute;
    USHORT second;
    ULONG fraction;
    SHORT timezone_hour;
    SHORT timezone_minute;
    } 	DBTIMESTAMPOFFSET;

#include <poppack.h>     // restore original structure packing

struct SSVARIANT
    {
    SSVARTYPE vt;
    DWORD dwReserved1;
    DWORD dwReserved2;
    union 
        {
        BYTE bTinyIntVal;
        SHORT sShortIntVal;
        LONG lIntVal;
        LONGLONG llBigIntVal;
        FLOAT fltRealVal;
        DOUBLE dblFloatVal;
        CY cyMoneyVal;
        VARIANT_BOOL fBitVal;
        BYTE rgbGuidVal[ 16 ];
        DB_NUMERIC numNumericVal;
        DBDATE dDateVal;
        DBTIMESTAMP tsDateTimeVal;
        struct _Time2Val
            {
            DBTIME2 tTime2Val;
            BYTE bScale;
            } 	Time2Val;
        struct _DateTimeVal
            {
            DBTIMESTAMP tsDateTimeVal;
            BYTE bScale;
            } 	DateTimeVal;
        struct _DateTimeOffsetVal
            {
            DBTIMESTAMPOFFSET tsoDateTimeOffsetVal;
            BYTE bScale;
            } 	DateTimeOffsetVal;
        struct _NCharVal
            {
            SHORT sActualLength;
            SHORT sMaxLength;
            WCHAR *pwchNCharVal;
            BYTE rgbReserved[ 5 ];
            DWORD dwReserved;
            WCHAR *pwchReserved;
            } 	NCharVal;
        struct _CharVal
            {
            SHORT sActualLength;
            SHORT sMaxLength;
            CHAR *pchCharVal;
            BYTE rgbReserved[ 5 ];
            DWORD dwReserved;
            WCHAR *pwchReserved;
            } 	CharVal;
        struct _BinaryVal
            {
            SHORT sActualLength;
            SHORT sMaxLength;
            BYTE *prgbBinaryVal;
            DWORD dwReserved;
            } 	BinaryVal;
        struct _UnknownType
            {
            DWORD dwActualLength;
            BYTE rgMetadata[ 16 ];
            BYTE *pUnknownData;
            } 	UnknownType;
        struct _BLOBType
            {
            DBOBJECT dbobj;
            IUnknown *pUnk;
            } 	BLOBType;
        } 	;
    } ;
typedef DWORD LOCKMODE;


enum LOCKMODEENUM
    {	LOCKMODE_INVALID	= 0,
	LOCKMODE_EXCLUSIVE	= ( LOCKMODE_INVALID + 1 ) ,
	LOCKMODE_SHARED	= ( LOCKMODE_EXCLUSIVE + 1 ) 
    } ;


extern RPC_IF_HANDLE __MIDL_itf_sqlncli_0000_0004_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_sqlncli_0000_0004_v0_0_s_ifspec;

#ifndef __ISchemaLock_INTERFACE_DEFINED__
#define __ISchemaLock_INTERFACE_DEFINED__

/* interface ISchemaLock */
/* [unique][uuid][object][local] */ 


EXTERN_C const IID IID_ISchemaLock;

#if defined(__cplusplus) && !defined(CINTERFACE)
    
    MIDL_INTERFACE("4C2389FB-2511-11d4-B258-00C04F7971CE")
    ISchemaLock : public IUnknown
    {
    public:
        virtual HRESULT STDMETHODCALLTYPE GetSchemaLock( 
            /* [in] */ DBID *pTableID,
            /* [in] */ LOCKMODE lmMode,
            /* [out] */ HANDLE *phLockHandle,
            /* [out] */ ULONGLONG *pTableVersion) = 0;
        
        virtual HRESULT STDMETHODCALLTYPE ReleaseSchemaLock( 
            /* [in] */ HANDLE hLockHandle) = 0;
        
    };
    
#else 	/* C style interface */

    typedef struct ISchemaLockVtbl
    {
        BEGIN_INTERFACE
        
        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
            ISchemaLock * This,
            /* [in] */ REFIID riid,
            /* [annotation][iid_is][out] */ 
            __RPC__deref_out  void **ppvObject);
        
        ULONG ( STDMETHODCALLTYPE *AddRef )( 
            ISchemaLock * This);
        
        ULONG ( STDMETHODCALLTYPE *Release )( 
            ISchemaLock * This);
        
        HRESULT ( STDMETHODCALLTYPE *GetSchemaLock )( 
            ISchemaLock * This,
            /* [in] */ DBID *pTableID,
            /* [in] */ LOCKMODE lmMode,
            /* [out] */ HANDLE *phLockHandle,
            /* [out] */ ULONGLONG *pTableVersion);
        
        HRESULT ( STDMETHODCALLTYPE *ReleaseSchemaLock )( 
            ISchemaLock * This,
            /* [in] */ HANDLE hLockHandle);
        
        END_INTERFACE
    } ISchemaLockVtbl;

    interface ISchemaLock
    {
        CONST_VTBL struct ISchemaLockVtbl *lpVtbl;
    };

    

#ifdef COBJMACROS


#define ISchemaLock_QueryInterface(This,riid,ppvObject)	\
    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) 

#define ISchemaLock_AddRef(This)	\
    ( (This)->lpVtbl -> AddRef(This) ) 

#define ISchemaLock_Release(This)	\
    ( (This)->lpVtbl -> Release(This) ) 


#define ISchemaLock_GetSchemaLock(This,pTableID,lmMode,phLockHandle,pTableVersion)	\
    ( (This)->lpVtbl -> GetSchemaLock(This,pTableID,lmMode,phLockHandle,pTableVersion) ) 

#define ISchemaLock_ReleaseSchemaLock(This,hLockHandle)	\
    ( (This)->lpVtbl -> ReleaseSchemaLock(This,hLockHandle) ) 

#endif /* COBJMACROS */


#endif 	/* C style interface */




#endif 	/* __ISchemaLock_INTERFACE_DEFINED__ */


#ifndef __IBCPSession_INTERFACE_DEFINED__
#define __IBCPSession_INTERFACE_DEFINED__

/* interface IBCPSession */
/* [unique][uuid][object][local] */ 


EXTERN_C const IID IID_IBCPSession;

#if defined(__cplusplus) && !defined(CINTERFACE)
    
    MIDL_INTERFACE("88352D80-42D1-42f0-A170-AB0F8B45B939")
    IBCPSession : public IUnknown
    {
    public:
        virtual HRESULT STDMETHODCALLTYPE BCPColFmt( 
            /* [in] */ DBORDINAL idxUserDataCol,
            /* [in] */ int eUserDataType,
            /* [in] */ int cbIndicator,
            /* [in] */ int cbUserData,
            /* [size_is][in] */ BYTE *pbUserDataTerm,
            /* [in] */ int cbUserDataTerm,
            /* [in] */ DBORDINAL idxServerCol) = 0;
        
        virtual HRESULT STDMETHODCALLTYPE BCPColumns( 
            /* [in] */ DBCOUNTITEM nColumns) = 0;
        
        virtual HRESULT STDMETHODCALLTYPE BCPControl( 
            /* [in] */ int eOption,
            /* [in] */ void *iValue) = 0;
        
        virtual HRESULT STDMETHODCALLTYPE BCPDone( void) = 0;
        
        virtual HRESULT STDMETHODCALLTYPE BCPExec( 
            /* [out] */ DBROWCOUNT *pRowsCopied) = 0;
        
        virtual HRESULT STDMETHODCALLTYPE BCPInit( 
            /* [string][in] */ const wchar_t *pwszTable,
            /* [string][in] */ const wchar_t *pwszDataFile,
            /* [string][in] */ const wchar_t *pwszErrorFile,
            /* [in] */ int eDirection) = 0;
        
        virtual HRESULT STDMETHODCALLTYPE BCPReadFmt( 
            /* [string][in] */ const wchar_t *pwszFormatFile) = 0;
        
        virtual HRESULT STDMETHODCALLTYPE BCPWriteFmt( 
            /* [string][in] */ const wchar_t *pwszFormatFile) = 0;
        
    };
    
#else 	/* C style interface */

    typedef struct IBCPSessionVtbl
    {
        BEGIN_INTERFACE
        
        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
            IBCPSession * This,
            /* [in] */ REFIID riid,
            /* [annotation][iid_is][out] */ 
            __RPC__deref_out  void **ppvObject);
        
        ULONG ( STDMETHODCALLTYPE *AddRef )( 
            IBCPSession * This);
        
        ULONG ( STDMETHODCALLTYPE *Release )( 
            IBCPSession * This);
        
        HRESULT ( STDMETHODCALLTYPE *BCPColFmt )( 
            IBCPSession * This,
            /* [in] */ DBORDINAL idxUserDataCol,
            /* [in] */ int eUserDataType,
            /* [in] */ int cbIndicator,
            /* [in] */ int cbUserData,
            /* [size_is][in] */ BYTE *pbUserDataTerm,
            /* [in] */ int cbUserDataTerm,
            /* [in] */ DBORDINAL idxServerCol);
        
        HRESULT ( STDMETHODCALLTYPE *BCPColumns )( 
            IBCPSession * This,
            /* [in] */ DBCOUNTITEM nColumns);
        
        HRESULT ( STDMETHODCALLTYPE *BCPControl )( 
            IBCPSession * This,
            /* [in] */ int eOption,
            /* [in] */ void *iValue);
        
        HRESULT ( STDMETHODCALLTYPE *BCPDone )( 
            IBCPSession * This);
        
        HRESULT ( STDMETHODCALLTYPE *BCPExec )( 
            IBCPSession * This,
            /* [out] */ DBROWCOUNT *pRowsCopied);
        
        HRESULT ( STDMETHODCALLTYPE *BCPInit )( 
            IBCPSession * This,
            /* [string][in] */ const wchar_t *pwszTable,
            /* [string][in] */ const wchar_t *pwszDataFile,
            /* [string][in] */ const wchar_t *pwszErrorFile,
            /* [in] */ int eDirection);
        
        HRESULT ( STDMETHODCALLTYPE *BCPReadFmt )( 
            IBCPSession * This,
            /* [string][in] */ const wchar_t *pwszFormatFile);
        
        HRESULT ( STDMETHODCALLTYPE *BCPWriteFmt )( 
            IBCPSession * This,
            /* [string][in] */ const wchar_t *pwszFormatFile);
        
        END_INTERFACE
    } IBCPSessionVtbl;

    interface IBCPSession
    {
        CONST_VTBL struct IBCPSessionVtbl *lpVtbl;
    };

    

#ifdef COBJMACROS


#define IBCPSession_QueryInterface(This,riid,ppvObject)	\
    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) 

#define IBCPSession_AddRef(This)	\
    ( (This)->lpVtbl -> AddRef(This) ) 

#define IBCPSession_Release(This)	\
    ( (This)->lpVtbl -> Release(This) ) 


#define IBCPSession_BCPColFmt(This,idxUserDataCol,eUserDataType,cbIndicator,cbUserData,pbUserDataTerm,cbUserDataTerm,idxServerCol)	\
    ( (This)->lpVtbl -> BCPColFmt(This,idxUserDataCol,eUserDataType,cbIndicator,cbUserData,pbUserDataTerm,cbUserDataTerm,idxServerCol) ) 

#define IBCPSession_BCPColumns(This,nColumns)	\
    ( (This)->lpVtbl -> BCPColumns(This,nColumns) ) 

#define IBCPSession_BCPControl(This,eOption,iValue)	\
    ( (This)->lpVtbl -> BCPControl(This,eOption,iValue) ) 

#define IBCPSession_BCPDone(This)	\
    ( (This)->lpVtbl -> BCPDone(This) ) 

#define IBCPSession_BCPExec(This,pRowsCopied)	\
    ( (This)->lpVtbl -> BCPExec(This,pRowsCopied) ) 

#define IBCPSession_BCPInit(This,pwszTable,pwszDataFile,pwszErrorFile,eDirection)	\
    ( (This)->lpVtbl -> BCPInit(This,pwszTable,pwszDataFile,pwszErrorFile,eDirection) ) 

#define IBCPSession_BCPReadFmt(This,pwszFormatFile)	\
    ( (This)->lpVtbl -> BCPReadFmt(This,pwszFormatFile) ) 

#define IBCPSession_BCPWriteFmt(This,pwszFormatFile)	\
    ( (This)->lpVtbl -> BCPWriteFmt(This,pwszFormatFile) ) 

#endif /* COBJMACROS */


#endif 	/* C style interface */




#endif 	/* __IBCPSession_INTERFACE_DEFINED__ */


#ifndef __IBCPSession2_INTERFACE_DEFINED__
#define __IBCPSession2_INTERFACE_DEFINED__

/* interface IBCPSession2 */
/* [unique][uuid][object][local] */ 


EXTERN_C const IID IID_IBCPSession2;

#if defined(__cplusplus) && !defined(CINTERFACE)
    
    MIDL_INTERFACE("AD79D3B6-59DD-46a3-BFC6-E62A65FF3523")
    IBCPSession2 : public IBCPSession
    {
    public:
        virtual HRESULT STDMETHODCALLTYPE BCPSetBulkMode( 
            /* [in] */ int property,
            /* [size_is][in] */ void *pField,
            /* [in] */ int cbField,
            /* [size_is][in] */ void *pRow,
            /* [in] */ int cbRow) = 0;
        
    };
    
#else 	/* C style interface */

    typedef struct IBCPSession2Vtbl
    {
        BEGIN_INTERFACE
        
        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
            IBCPSession2 * This,
            /* [in] */ REFIID riid,
            /* [annotation][iid_is][out] */ 
            __RPC__deref_out  void **ppvObject);
        
        ULONG ( STDMETHODCALLTYPE *AddRef )( 
            IBCPSession2 * This);
        
        ULONG ( STDMETHODCALLTYPE *Release )( 
            IBCPSession2 * This);
        
        HRESULT ( STDMETHODCALLTYPE *BCPColFmt )( 
            IBCPSession2 * This,
            /* [in] */ DBORDINAL idxUserDataCol,
            /* [in] */ int eUserDataType,
            /* [in] */ int cbIndicator,
            /* [in] */ int cbUserData,
            /* [size_is][in] */ BYTE *pbUserDataTerm,
            /* [in] */ int cbUserDataTerm,
            /* [in] */ DBORDINAL idxServerCol);
        
        HRESULT ( STDMETHODCALLTYPE *BCPColumns )( 
            IBCPSession2 * This,
            /* [in] */ DBCOUNTITEM nColumns);
        
        HRESULT ( STDMETHODCALLTYPE *BCPControl )( 
            IBCPSession2 * This,
            /* [in] */ int eOption,
            /* [in] */ void *iValue);
        
        HRESULT ( STDMETHODCALLTYPE *BCPDone )( 
            IBCPSession2 * This);
        
        HRESULT ( STDMETHODCALLTYPE *BCPExec )( 
            IBCPSession2 * This,
            /* [out] */ DBROWCOUNT *pRowsCopied);
        
        HRESULT ( STDMETHODCALLTYPE *BCPInit )( 
            IBCPSession2 * This,
            /* [string][in] */ const wchar_t *pwszTable,
            /* [string][in] */ const wchar_t *pwszDataFile,
            /* [string][in] */ const wchar_t *pwszErrorFile,
            /* [in] */ int eDirection);
        
        HRESULT ( STDMETHODCALLTYPE *BCPReadFmt )( 
            IBCPSession2 * This,
            /* [string][in] */ const wchar_t *pwszFormatFile);
        
        HRESULT ( STDMETHODCALLTYPE *BCPWriteFmt )( 
            IBCPSession2 * This,
            /* [string][in] */ const wchar_t *pwszFormatFile);
        
        HRESULT ( STDMETHODCALLTYPE *BCPSetBulkMode )( 
            IBCPSession2 * This,
            /* [in] */ int property,
            /* [size_is][in] */ void *pField,
            /* [in] */ int cbField,
            /* [size_is][in] */ void *pRow,
            /* [in] */ int cbRow);
        
        END_INTERFACE
    } IBCPSession2Vtbl;

    interface IBCPSession2
    {
        CONST_VTBL struct IBCPSession2Vtbl *lpVtbl;
    };

    

#ifdef COBJMACROS


#define IBCPSession2_QueryInterface(This,riid,ppvObject)	\
    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) 

#define IBCPSession2_AddRef(This)	\
    ( (This)->lpVtbl -> AddRef(This) ) 

#define IBCPSession2_Release(This)	\
    ( (This)->lpVtbl -> Release(This) ) 


#define IBCPSession2_BCPColFmt(This,idxUserDataCol,eUserDataType,cbIndicator,cbUserData,pbUserDataTerm,cbUserDataTerm,idxServerCol)	\
    ( (This)->lpVtbl -> BCPColFmt(This,idxUserDataCol,eUserDataType,cbIndicator,cbUserData,pbUserDataTerm,cbUserDataTerm,idxServerCol) ) 

#define IBCPSession2_BCPColumns(This,nColumns)	\
    ( (This)->lpVtbl -> BCPColumns(This,nColumns) ) 

#define IBCPSession2_BCPControl(This,eOption,iValue)	\
    ( (This)->lpVtbl -> BCPControl(This,eOption,iValue) ) 

#define IBCPSession2_BCPDone(This)	\
    ( (This)->lpVtbl -> BCPDone(This) ) 

#define IBCPSession2_BCPExec(This,pRowsCopied)	\
    ( (This)->lpVtbl -> BCPExec(This,pRowsCopied) ) 

#define IBCPSession2_BCPInit(This,pwszTable,pwszDataFile,pwszErrorFile,eDirection)	\
    ( (This)->lpVtbl -> BCPInit(This,pwszTable,pwszDataFile,pwszErrorFile,eDirection) ) 

#define IBCPSession2_BCPReadFmt(This,pwszFormatFile)	\
    ( (This)->lpVtbl -> BCPReadFmt(This,pwszFormatFile) ) 

#define IBCPSession2_BCPWriteFmt(This,pwszFormatFile)	\
    ( (This)->lpVtbl -> BCPWriteFmt(This,pwszFormatFile) ) 


#define IBCPSession2_BCPSetBulkMode(This,property,pField,cbField,pRow,cbRow)	\
    ( (This)->lpVtbl -> BCPSetBulkMode(This,property,pField,cbField,pRow,cbRow) ) 

#endif /* COBJMACROS */


#endif 	/* C style interface */




#endif 	/* __IBCPSession2_INTERFACE_DEFINED__ */


/* interface __MIDL_itf_sqlncli_0000_0007 */
/* [local] */ 


#endif //_SQLOLEDB_H_

#define ISOLATIONLEVEL_SNAPSHOT          ((ISOLATIONLEVEL)(0x01000000)) // Changes made in other transactions can not be seen.

#define DBPROPVAL_TI_SNAPSHOT            0x01000000L



extern RPC_IF_HANDLE __MIDL_itf_sqlncli_0000_0007_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_sqlncli_0000_0007_v0_0_s_ifspec;

#ifndef __ISSAbort_INTERFACE_DEFINED__
#define __ISSAbort_INTERFACE_DEFINED__

/* interface ISSAbort */
/* [unique][uuid][object][local] */ 


EXTERN_C const IID IID_ISSAbort;

#if defined(__cplusplus) && !defined(CINTERFACE)
    
    MIDL_INTERFACE("5CF4CA15-EF21-11d0-97E7-00C04FC2AD98")
    ISSAbort : public IUnknown
    {
    public:
        virtual HRESULT STDMETHODCALLTYPE Abort( void) = 0;
        
    };
    
#else 	/* C style interface */

    typedef struct ISSAbortVtbl
    {
        BEGIN_INTERFACE
        
        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
            ISSAbort * This,
            /* [in] */ REFIID riid,
            /* [annotation][iid_is][out] */ 
            __RPC__deref_out  void **ppvObject);
        
        ULONG ( STDMETHODCALLTYPE *AddRef )( 
            ISSAbort * This);
        
        ULONG ( STDMETHODCALLTYPE *Release )( 
            ISSAbort * This);
        
        HRESULT ( STDMETHODCALLTYPE *Abort )( 
            ISSAbort * This);
        
        END_INTERFACE
    } ISSAbortVtbl;

    interface ISSAbort
    {
        CONST_VTBL struct ISSAbortVtbl *lpVtbl;
    };

    

#ifdef COBJMACROS


#define ISSAbort_QueryInterface(This,riid,ppvObject)	\
    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) 

#define ISSAbort_AddRef(This)	\
    ( (This)->lpVtbl -> AddRef(This) ) 

#define ISSAbort_Release(This)	\
    ( (This)->lpVtbl -> Release(This) ) 


#define ISSAbort_Abort(This)	\
    ( (This)->lpVtbl -> Abort(This) ) 

#endif /* COBJMACROS */


#endif 	/* C style interface */




#endif 	/* __ISSAbort_INTERFACE_DEFINED__ */


/* interface __MIDL_itf_sqlncli_0000_0008 */
/* [local] */ 


enum DBBINDFLAGENUM90
    {	DBBINDFLAG_OBJECT	= 0x2
    } ;

enum SSACCESSORFLAGS
    {	SSACCESSOR_ROWDATA	= 0x100
    } ;

enum DBPROPFLAGSENUM90
    {	DBPROPFLAGS_PARAMETER	= 0x10000
    } ;
typedef struct tagSSPARAMPROPS
    {
    DBORDINAL iOrdinal;
    ULONG cPropertySets;
    DBPROPSET *rgPropertySets;
    } 	SSPARAMPROPS;



extern RPC_IF_HANDLE __MIDL_itf_sqlncli_0000_0008_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_sqlncli_0000_0008_v0_0_s_ifspec;

#ifndef __ISSCommandWithParameters_INTERFACE_DEFINED__
#define __ISSCommandWithParameters_INTERFACE_DEFINED__

/* interface ISSCommandWithParameters */
/* [unique][uuid][object][local] */ 


EXTERN_C const IID IID_ISSCommandWithParameters;

#if defined(__cplusplus) && !defined(CINTERFACE)
    
    MIDL_INTERFACE("eec30162-6087-467c-b995-7c523ce96561")
    ISSCommandWithParameters : public ICommandWithParameters
    {
    public:
        virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetParameterProperties( 
            /* [out][in] */ DB_UPARAMS *pcParams,
            /* [size_is][size_is][out] */ SSPARAMPROPS **prgParamProperties) = 0;
        
        virtual /* [local] */ HRESULT STDMETHODCALLTYPE SetParameterProperties( 
            /* [in] */ DB_UPARAMS cParams,
            /* [size_is][unique][in] */ SSPARAMPROPS rgParamProperties[  ]) = 0;
        
    };
    
#else 	/* C style interface */

    typedef struct ISSCommandWithParametersVtbl
    {
        BEGIN_INTERFACE
        
        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
            ISSCommandWithParameters * This,
            /* [in] */ REFIID riid,
            /* [annotation][iid_is][out] */ 
            __RPC__deref_out  void **ppvObject);
        
        ULONG ( STDMETHODCALLTYPE *AddRef )( 
            ISSCommandWithParameters * This);
        
        ULONG ( STDMETHODCALLTYPE *Release )( 
            ISSCommandWithParameters * This);
        
        /* [local] */ HRESULT ( STDMETHODCALLTYPE *GetParameterInfo )( 
            ISSCommandWithParameters * This,
            /* [out][in] */ DB_UPARAMS *pcParams,
            /* [size_is][size_is][out] */ DBPARAMINFO **prgParamInfo,
            /* [out] */ OLECHAR **ppNamesBuffer);
        
        /* [local] */ HRESULT ( STDMETHODCALLTYPE *MapParameterNames )( 
            ISSCommandWithParameters * This,
            /* [in] */ DB_UPARAMS cParamNames,
            /* [size_is][in] */ const OLECHAR *rgParamNames[  ],
            /* [size_is][out] */ DB_LPARAMS rgParamOrdinals[  ]);
        
        /* [local] */ HRESULT ( STDMETHODCALLTYPE *SetParameterInfo )( 
            ISSCommandWithParameters * This,
            /* [in] */ DB_UPARAMS cParams,
            /* [size_is][unique][in] */ const DB_UPARAMS rgParamOrdinals[  ],
            /* [size_is][unique][in] */ const DBPARAMBINDINFO rgParamBindInfo[  ]);
        
        /* [local] */ HRESULT ( STDMETHODCALLTYPE *GetParameterProperties )( 
            ISSCommandWithParameters * This,
            /* [out][in] */ DB_UPARAMS *pcParams,
            /* [size_is][size_is][out] */ SSPARAMPROPS **prgParamProperties);
        
        /* [local] */ HRESULT ( STDMETHODCALLTYPE *SetParameterProperties )( 
            ISSCommandWithParameters * This,
            /* [in] */ DB_UPARAMS cParams,
            /* [size_is][unique][in] */ SSPARAMPROPS rgParamProperties[  ]);
        
        END_INTERFACE
    } ISSCommandWithParametersVtbl;

    interface ISSCommandWithParameters
    {
        CONST_VTBL struct ISSCommandWithParametersVtbl *lpVtbl;
    };

    

#ifdef COBJMACROS


#define ISSCommandWithParameters_QueryInterface(This,riid,ppvObject)	\
    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) 

#define ISSCommandWithParameters_AddRef(This)	\
    ( (This)->lpVtbl -> AddRef(This) ) 

#define ISSCommandWithParameters_Release(This)	\
    ( (This)->lpVtbl -> Release(This) ) 


#define ISSCommandWithParameters_GetParameterInfo(This,pcParams,prgParamInfo,ppNamesBuffer)	\
    ( (This)->lpVtbl -> GetParameterInfo(This,pcParams,prgParamInfo,ppNamesBuffer) ) 

#define ISSCommandWithParameters_MapParameterNames(This,cParamNames,rgParamNames,rgParamOrdinals)	\
    ( (This)->lpVtbl -> MapParameterNames(This,cParamNames,rgParamNames,rgParamOrdinals) ) 

#define ISSCommandWithParameters_SetParameterInfo(This,cParams,rgParamOrdinals,rgParamBindInfo)	\
    ( (This)->lpVtbl -> SetParameterInfo(This,cParams,rgParamOrdinals,rgParamBindInfo) ) 


#define ISSCommandWithParameters_GetParameterProperties(This,pcParams,prgParamProperties)	\
    ( (This)->lpVtbl -> GetParameterProperties(This,pcParams,prgParamProperties) ) 

#define ISSCommandWithParameters_SetParameterProperties(This,cParams,rgParamProperties)	\
    ( (This)->lpVtbl -> SetParameterProperties(This,cParams,rgParamProperties) ) 

#endif /* COBJMACROS */


#endif 	/* C style interface */




#endif 	/* __ISSCommandWithParameters_INTERFACE_DEFINED__ */


#ifndef __IDBAsynchStatus_INTERFACE_DEFINED__
#define __IDBAsynchStatus_INTERFACE_DEFINED__

/* interface IDBAsynchStatus */
/* [unique][uuid][object][local] */ 


EXTERN_C const IID IID_IDBAsynchStatus;

#if defined(__cplusplus) && !defined(CINTERFACE)
    
    MIDL_INTERFACE("0c733a95-2a1c-11ce-ade5-00aa0044773d")
    IDBAsynchStatus : public IUnknown
    {
    public:
        virtual /* [local] */ HRESULT STDMETHODCALLTYPE Abort( 
            /* [in] */ HCHAPTER hChapter,
            /* [in] */ DBASYNCHOP eOperation) = 0;
        
        virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetStatus( 
            /* [in] */ HCHAPTER hChapter,
            /* [in] */ DBASYNCHOP eOperation,
            /* [out] */ DBCOUNTITEM *pulProgress,
            /* [out] */ DBCOUNTITEM *pulProgressMax,
            /* [out] */ DBASYNCHPHASE *peAsynchPhase,
            /* [out] */ LPOLESTR *ppwszStatusText) = 0;
        
    };
    
#else 	/* C style interface */

    typedef struct IDBAsynchStatusVtbl
    {
        BEGIN_INTERFACE
        
        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
            IDBAsynchStatus * This,
            /* [in] */ REFIID riid,
            /* [annotation][iid_is][out] */ 
            __RPC__deref_out  void **ppvObject);
        
        ULONG ( STDMETHODCALLTYPE *AddRef )( 
            IDBAsynchStatus * This);
        
        ULONG ( STDMETHODCALLTYPE *Release )( 
            IDBAsynchStatus * This);
        
        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Abort )( 
            IDBAsynchStatus * This,
            /* [in] */ HCHAPTER hChapter,
            /* [in] */ DBASYNCHOP eOperation);
        
        /* [local] */ HRESULT ( STDMETHODCALLTYPE *GetStatus )( 
            IDBAsynchStatus * This,
            /* [in] */ HCHAPTER hChapter,
            /* [in] */ DBASYNCHOP eOperation,
            /* [out] */ DBCOUNTITEM *pulProgress,
            /* [out] */ DBCOUNTITEM *pulProgressMax,
            /* [out] */ DBASYNCHPHASE *peAsynchPhase,
            /* [out] */ LPOLESTR *ppwszStatusText);
        
        END_INTERFACE
    } IDBAsynchStatusVtbl;

    interface IDBAsynchStatus
    {
        CONST_VTBL struct IDBAsynchStatusVtbl *lpVtbl;
    };

    

#ifdef COBJMACROS


#define IDBAsynchStatus_QueryInterface(This,riid,ppvObject)	\
    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) 

#define IDBAsynchStatus_AddRef(This)	\
    ( (This)->lpVtbl -> AddRef(This) ) 

#define IDBAsynchStatus_Release(This)	\
    ( (This)->lpVtbl -> Release(This) ) 


#define IDBAsynchStatus_Abort(This,hChapter,eOperation)	\
    ( (This)->lpVtbl -> Abort(This,hChapter,eOperation) ) 

#define IDBAsynchStatus_GetStatus(This,hChapter,eOperation,pulProgress,pulProgressMax,peAsynchPhase,ppwszStatusText)	\
    ( (This)->lpVtbl -> GetStatus(This,hChapter,eOperation,pulProgress,pulProgressMax,peAsynchPhase,ppwszStatusText) ) 

#endif /* COBJMACROS */


#endif 	/* C style interface */



/* [call_as] */ HRESULT STDMETHODCALLTYPE IDBAsynchStatus_RemoteAbort_Proxy( 
    IDBAsynchStatus * This,
    /* [in] */ HCHAPTER hChapter,
    /* [in] */ DBASYNCHOP eOperation,
    /* [out] */ IErrorInfo **ppErrorInfoRem);


void __RPC_STUB IDBAsynchStatus_RemoteAbort_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


/* [call_as] */ HRESULT STDMETHODCALLTYPE IDBAsynchStatus_RemoteGetStatus_Proxy( 
    IDBAsynchStatus * This,
    /* [in] */ HCHAPTER hChapter,
    /* [in] */ DBASYNCHOP eOperation,
    /* [unique][out][in] */ DBCOUNTITEM *pulProgress,
    /* [unique][out][in] */ DBCOUNTITEM *pulProgressMax,
    /* [unique][out][in] */ DBASYNCHPHASE *peAsynchPhase,
    /* [unique][out][in] */ LPOLESTR *ppwszStatusText,
    /* [out] */ IErrorInfo **ppErrorInfoRem);


void __RPC_STUB IDBAsynchStatus_RemoteGetStatus_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);



#endif 	/* __IDBAsynchStatus_INTERFACE_DEFINED__ */


#ifndef __ISSAsynchStatus_INTERFACE_DEFINED__
#define __ISSAsynchStatus_INTERFACE_DEFINED__

/* interface ISSAsynchStatus */
/* [unique][uuid][object][local] */ 


EXTERN_C const IID IID_ISSAsynchStatus;

#if defined(__cplusplus) && !defined(CINTERFACE)
    
    MIDL_INTERFACE("1FF1F743-8BB0-4c00-ACC4-C10E43B08FC1")
    ISSAsynchStatus : public IDBAsynchStatus
    {
    public:
        virtual /* [local] */ HRESULT STDMETHODCALLTYPE WaitForAsynchCompletion( 
            /* [in] */ DWORD dwMillisecTimeOut) = 0;
        
    };
    
#else 	/* C style interface */

    typedef struct ISSAsynchStatusVtbl
    {
        BEGIN_INTERFACE
        
        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( 
            ISSAsynchStatus * This,
            /* [in] */ REFIID riid,
            /* [annotation][iid_is][out] */ 
            __RPC__deref_out  void **ppvObject);
        
        ULONG ( STDMETHODCALLTYPE *AddRef )( 
            ISSAsynchStatus * This);
        
        ULONG ( STDMETHODCALLTYPE *Release )( 
            ISSAsynchStatus * This);
        
        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Abort )( 
            ISSAsynchStatus * This,
            /* [in] */ HCHAPTER hChapter,
            /* [in] */ DBASYNCHOP eOperation);
        
        /* [local] */ HRESULT ( STDMETHODCALLTYPE *GetStatus )( 
            ISSAsynchStatus * This,
            /* [in] */ HCHAPTER hChapter,
            /* [in] */ DBASYNCHOP eOperation,
            /* [out] */ DBCOUNTITEM *pulProgress,
            /* [out] */ DBCOUNTITEM *pulProgressMax,
            /* [out] */ DBASYNCHPHASE *peAsynchPhase,
            /* [out] */ LPOLESTR *ppwszStatusText);
        
        /* [local] */ HRESULT ( STDMETHODCALLTYPE *WaitForAsynchCompletion )( 
            ISSAsynchStatus * This,
            /* [in] */ DWORD dwMillisecTimeOut);
        
        END_INTERFACE
    } ISSAsynchStatusVtbl;

    interface ISSAsynchStatus
    {
        CONST_VTBL struct ISSAsynchStatusVtbl *lpVtbl;
    };

    

#ifdef COBJMACROS


#define ISSAsynchStatus_QueryInterface(This,riid,ppvObject)	\
    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) 

#define ISSAsynchStatus_AddRef(This)	\
    ( (This)->lpVtbl -> AddRef(This) ) 

#define ISSAsynchStatus_Release(This)	\
    ( (This)->lpVtbl -> Release(This) ) 


#define ISSAsynchStatus_Abort(This,hChapter,eOperation)	\
    ( (This)->lpVtbl -> Abort(This,hChapter,eOperation) ) 

#define ISSAsynchStatus_GetStatus(This,hChapter,eOperation,pulProgress,pulProgressMax,peAsynchPhase,ppwszStatusText)	\
    ( (This)->lpVtbl -> GetStatus(This,hChapter,eOperation,pulProgress,pulProgressMax,peAsynchPhase,ppwszStatusText) ) 


#define ISSAsynchStatus_WaitForAsynchCompletion(This,dwMillisecTimeOut)	\
    ( (This)->lpVtbl -> WaitForAsynchCompletion(This,dwMillisecTimeOut) ) 

#endif /* COBJMACROS */


#endif 	/* C style interface */




#endif 	/* __ISSAsynchStatus_INTERFACE_DEFINED__ */


/* interface __MIDL_itf_sqlncli_0000_0011 */
/* [local] */ 

//----------------------------------------------------------------------------
// Values for STATUS bitmask for DBSCHEMA_TABLES & DBSCHEMA_TABLES_INFO
#define TABLE_HAS_UPDATE_INSTEAD_OF_TRIGGER     0x00000001 //table has IOT defined
#define TABLE_HAS_DELETE_INSTEAD_OF_TRIGGER     0x00000002 //table has IOT defined
#define TABLE_HAS_INSERT_INSTEAD_OF_TRIGGER     0x00000004 //table has IOT defined
#define TABLE_HAS_AFTER_UPDATE_TRIGGER          0x00000008 //table has update trigger
#define TABLE_HAS_AFTER_DELETE_TRIGGER          0x00000010 //table has delete trigger
#define TABLE_HAS_AFTER_INSERT_TRIGGER          0x00000020 //table has insert trigger
#define TABLE_HAS_CASCADE_UPDATE                0x00000040 //table has cascade update
#define TABLE_HAS_CASCADE_DELETE                0x00000080 //table has cascade delete

//----------------------------------------------------------------------------
// PropIds for DBPROP_INIT_GENERALTIMEOUT
#if (OLEDBVER >= 0x0210)
#define DBPROP_INIT_GENERALTIMEOUT      0x11cL
#endif

//----------------------------------------------------------------------------
// PropIds for DBPROPSET_SQLSERVERDATASOURCE
#define SSPROP_ENABLEFASTLOAD           2
#define SSPROP_ENABLEBULKCOPY           3

//----------------------------------------------------------------------------
// PropIds for DBPROPSET_SQLSERVERDATASOURCEINFO
#define SSPROP_UNICODELCID                       2
#define SSPROP_UNICODECOMPARISONSTYLE            3
#define SSPROP_COLUMNLEVELCOLLATION              4
#define SSPROP_CHARACTERSET                      5
#define SSPROP_SORTORDER                         6
#define SSPROP_CURRENTCOLLATION                  7
#define SSPROP_INTEGRATEDAUTHENTICATIONMETHOD    8
#define SSPROP_MUTUALLYAUTHENTICATED             9

//----------------------------------------------------------------------------
// PropIds for DBPROPSET_SQLSERVERDBINIT
#define SSPROP_INIT_CURRENTLANGUAGE              4
#define SSPROP_INIT_NETWORKADDRESS               5
#define SSPROP_INIT_NETWORKLIBRARY               6
#define SSPROP_INIT_USEPROCFORPREP               7
#define SSPROP_INIT_AUTOTRANSLATE                8
#define SSPROP_INIT_PACKETSIZE                   9
#define SSPROP_INIT_APPNAME                      10
#define SSPROP_INIT_WSID                         11
#define SSPROP_INIT_FILENAME                     12
#define SSPROP_INIT_ENCRYPT                      13
#define SSPROP_AUTH_REPL_SERVER_NAME             14
#define SSPROP_INIT_TAGCOLUMNCOLLATION           15
#define SSPROP_INIT_MARSCONNECTION               16
#define SSPROP_INIT_FAILOVERPARTNER              18
#define SSPROP_AUTH_OLD_PASSWORD                 19
#define SSPROP_INIT_DATATYPECOMPATIBILITY        20
#define SSPROP_INIT_TRUST_SERVER_CERTIFICATE     21
#define SSPROP_INIT_SERVERSPN                    22
#define SSPROP_INIT_FAILOVERPARTNERSPN           23
#define SSPROP_INIT_APPLICATIONINTENT            24

//-----------------------------------------------------------------------------
// Values for SSPROP_INIT_USEPROCFORPREP
#define SSPROPVAL_USEPROCFORPREP_OFF        0
#define SSPROPVAL_USEPROCFORPREP_ON         1
#define SSPROPVAL_USEPROCFORPREP_ON_DROP    2

//-----------------------------------------------------------------------------
// Values for SSPROP_INIT_DATATYPECOMPATIBILITY
#define SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000  80
#define SSPROPVAL_DATATYPECOMPATIBILITY_DEFAULT  0

//----------------------------------------------------------------------------
// PropIds for DBPROPSET_SQLSERVERSESSION
#define SSPROP_QUOTEDCATALOGNAMES       2
#define SSPROP_ALLOWNATIVEVARIANT       3
#define SSPROP_SQLXMLXPROGID            4
#define SSPROP_ASYNCH_BULKCOPY          5

//----------------------------------------------------------------------------
// PropIds for DBPROPSET_SQLSERVERROWSET
#define SSPROP_MAXBLOBLENGTH            8
#define SSPROP_FASTLOADOPTIONS          9
#define SSPROP_FASTLOADKEEPNULLS        10
#define SSPROP_FASTLOADKEEPIDENTITY     11
#define SSPROP_CURSORAUTOFETCH          12
#define SSPROP_DEFERPREPARE             13
#define SSPROP_IRowsetFastLoad          14
#define SSPROP_QP_NOTIFICATION_TIMEOUT  17
#define SSPROP_QP_NOTIFICATION_MSGTEXT  18
#define SSPROP_QP_NOTIFICATION_OPTIONS  19
#define SSPROP_NOCOUNT_STATUS           20
#define SSPROP_COMPUTE_ID               21
#define SSPROP_COLUMN_ID                22
#define SSPROP_COMPUTE_BYLIST           23
#define SSPROP_ISSAsynchStatus          24

//-----------------------------------------------------------------------------
// Values for SSPROP_QP_NOTIFICATION_TIMEOUT
#define SSPROPVAL_DEFAULT_NOTIFICATION_TIMEOUT  432000 /* in sec */
#define SSPROPVAL_MAX_NOTIFICATION_TIMEOUT      0x7FFFFFFF /* in sec */
#define MAX_NOTIFICATION_LEN                    2000 /* NVARCHAR [2000] for both ID & DELIVERY_QUEUE */

//----------------------------------------------------------------------------
// PropIds for DBPROPSET_SQLSERVERCOLUMN
#define SSPROP_COL_COLLATIONNAME                         14
#define SSPROP_COL_UDT_CATALOGNAME                       31
#define SSPROP_COL_UDT_SCHEMANAME                        32
#define SSPROP_COL_UDT_NAME                              33
#define SSPROP_COL_XML_SCHEMACOLLECTION_CATALOGNAME      34
#define SSPROP_COL_XML_SCHEMACOLLECTION_SCHEMANAME       35
#define SSPROP_COL_XML_SCHEMACOLLECTIONNAME              36
#define SSPROP_COL_COMPUTED                              37


//----------------------------------------------------------------------------
// PropIds for DBPROPSET_SQLSERVERSTREAM
#define SSPROP_STREAM_XMLROOT                            19

//----------------------------------------------------------------------------
// PropIds for DBPROPSET_SQLSERVERPARAMETER
#define SSPROP_PARAM_XML_SCHEMACOLLECTION_CATALOGNAME    24
#define SSPROP_PARAM_XML_SCHEMACOLLECTION_SCHEMANAME     25
#define SSPROP_PARAM_XML_SCHEMACOLLECTIONNAME            26
#define SSPROP_PARAM_UDT_CATALOGNAME                     27
#define SSPROP_PARAM_UDT_SCHEMANAME                      28
#define SSPROP_PARAM_UDT_NAME                            29
#define SSPROP_PARAM_TYPE_CATALOGNAME                    38
#define SSPROP_PARAM_TYPE_SCHEMANAME                     39
#define SSPROP_PARAM_TYPE_TYPENAME                       40
#define SSPROP_PARAM_TABLE_DEFAULT_COLUMNS               41
#define SSPROP_PARAM_TABLE_COLUMN_SORT_ORDER             42

//----------------------------------------------------------------------------
// PropIds for DBPROPSET_SQLSERVERINDEX
#define SSPROP_INDEX_XML         1

//-----------------------------------------------------------------------------
//
#define BCP_TYPE_DEFAULT         0x00
#define BCP_TYPE_SQLTEXT         0x23
#define BCP_TYPE_SQLVARBINARY    0x25
#define BCP_TYPE_SQLINTN         0x26
#define BCP_TYPE_SQLVARCHAR      0x27
#define BCP_TYPE_SQLBINARY       0x2d
#define BCP_TYPE_SQLIMAGE        0x22
#define BCP_TYPE_SQLCHARACTER    0x2f
#define BCP_TYPE_SQLINT1         0x30
#define BCP_TYPE_SQLBIT          0x32
#define BCP_TYPE_SQLINT2         0x34
#define BCP_TYPE_SQLINT4         0x38
#define BCP_TYPE_SQLMONEY        0x3c
#define BCP_TYPE_SQLDATETIME     0x3d
#define BCP_TYPE_SQLFLT8         0x3e
#define BCP_TYPE_SQLFLTN         0x6d
#define BCP_TYPE_SQLMONEYN       0x6e
#define BCP_TYPE_SQLDATETIMN     0x6f
#define BCP_TYPE_SQLFLT4         0x3b
#define BCP_TYPE_SQLMONEY4       0x7a
#define BCP_TYPE_SQLDATETIM4     0x3a
#define BCP_TYPE_SQLDECIMAL      0x6a
#define BCP_TYPE_SQLNUMERIC      0x6c
#define BCP_TYPE_SQLUNIQUEID     0x24
#define BCP_TYPE_SQLBIGCHAR      0xaf
#define BCP_TYPE_SQLBIGVARCHAR   0xa7
#define BCP_TYPE_SQLBIGBINARY    0xad
#define BCP_TYPE_SQLBIGVARBINARY 0xa5
#define BCP_TYPE_SQLBITN         0x68
#define BCP_TYPE_SQLNCHAR        0xef
#define BCP_TYPE_SQLNVARCHAR     0xe7
#define BCP_TYPE_SQLNTEXT        0x63
#define BCP_TYPE_SQLDECIMALN     0x6a
#define BCP_TYPE_SQLNUMERICN     0x6c
#define BCP_TYPE_SQLINT8         0x7f
#define BCP_TYPE_SQLVARIANT      0x62
#define BCP_TYPE_SQLUDT          0xf0
#define BCP_TYPE_SQLXML          0xf1
#define BCP_TYPE_SQLDATE         0x28
#define BCP_TYPE_SQLTIME         0x29
#define BCP_TYPE_SQLDATETIME2    0x2a
#define BCP_TYPE_SQLDATETIMEOFFSET 0x2b

#define BCP_DIRECTION_IN            1
#define BCP_DIRECTION_OUT           2

#define BCP_OPTION_MAXERRS          1
#define BCP_OPTION_FIRST            2
#define BCP_OPTION_LAST             3
#define BCP_OPTION_BATCH            4
#define BCP_OPTION_KEEPNULLS        5
#define BCP_OPTION_ABORT            6
#define BCP_OPTION_KEEPIDENTITY     8
#define BCP_OPTION_HINTSA           10
#define BCP_OPTION_HINTSW           11
#define BCP_OPTION_FILECP           12
#define BCP_OPTION_UNICODEFILE      13
#define BCP_OPTION_TEXTFILE         14
#define BCP_OPTION_FILEFMT          15
#define BCP_OPTION_FMTXML           16
#define BCP_OPTION_FIRSTEX          17
#define BCP_OPTION_LASTEX           18
#define BCP_OPTION_ROWCOUNT         19
#define BCP_OPTION_DELAYREADFMT     20

#define BCP_OUT_CHARACTER_MODE      0x01
#define BCP_OUT_WIDE_CHARACTER_MODE 0x02
#define BCP_OUT_NATIVE_TEXT_MODE    0x03
#define BCP_OUT_NATIVE_MODE         0x04

#define BCP_FILECP_ACP              0
#define BCP_FILECP_OEMCP            1
#define BCP_FILECP_RAW              (-1)

#ifdef UNICODE
#define BCP_OPTION_HINTS             BCP_OPTION_HINTSW
#else
#define BCP_OPTION_HINTS             BCP_OPTION_HINTSA
#endif

#define BCP_PREFIX_DEFAULT           (-10)

#define BCP_LENGTH_NULL              (-1)
#define BCP_LENGTH_VARIABLE          (-10)
//
//-----------------------------------------------------------------------------


//----------------------------------------------------------------------------
// Provider-specific Class Ids
//

#if SQLNCLI_VER >= 1100

extern const GUID OLEDBDECLSPEC _SQLNCLI_OLEDB_DEPRECATE_WARNING CLSID_SQLNCLI11                = {0x397C2819L,0x8272,0x4532,{0xAD,0x3A,0xFB,0x5E,0x43,0xBE,0xAA,0x39}};
extern const GUID OLEDBDECLSPEC _SQLNCLI_OLEDB_DEPRECATE_WARNING CLSID_SQLNCLI11_ERROR          = {0xCA99D701L,0xE6E7,0x4db4,{0xA5,0xCC,0x81,0x54,0x1C,0x75,0x18,0x8A}};
extern const GUID OLEDBDECLSPEC _SQLNCLI_OLEDB_DEPRECATE_WARNING CLSID_SQLNCLI11_ENUMERATOR     = {0x8F612DD2L,0x7E28,0x424f,{0xA2,0xFD,0xC2,0xEE,0xCC,0x31,0x4A,0xA2}};

#endif

#if SQLNCLI_VER >= 1000

extern const GUID OLEDBDECLSPEC _SQLNCLI_OLEDB_DEPRECATE_WARNING CLSID_SQLNCLI10                = {0x8F4A6B68L,0x4F36,0x4e3c,{0xBE,0x81,0xBC,0x7C,0xA4,0xE9,0xC4,0x5C}};
extern const GUID OLEDBDECLSPEC _SQLNCLI_OLEDB_DEPRECATE_WARNING CLSID_SQLNCLI10_ERROR          = {0x53F9C3BCL,0x275F,0x4FA5,{0xB3,0xE6,0x25,0xED,0xCD,0x51,0x20,0x23}};
extern const GUID OLEDBDECLSPEC _SQLNCLI_OLEDB_DEPRECATE_WARNING CLSID_SQLNCLI10_ENUMERATOR     = {0x91E4F2A5L,0x1B07,0x45f6,{0x86,0xBF,0x92,0x03,0xC7,0xC7,0x2B,0xE3}};

#endif

extern const GUID OLEDBDECLSPEC _SQLNCLI_OLEDB_DEPRECATE_WARNING CLSID_SQLNCLI                = {0x85ecafccL,0xbdd9,0x4b03,{0x97,0xa8,0xfa,0x65,0xcb,0xe3,0x85,0x9b}};
extern const GUID OLEDBDECLSPEC _SQLNCLI_OLEDB_DEPRECATE_WARNING CLSID_SQLNCLI_ERROR          = {0xe8bc0a7aL,0xea71,0x4263,{0x8c,0xda,0x94,0xf3,0x88,0xb8,0xed,0x10}};
extern const GUID OLEDBDECLSPEC _SQLNCLI_OLEDB_DEPRECATE_WARNING CLSID_SQLNCLI_ENUMERATOR     = {0x4898ad37L,0xfe05,0x42df,{0x92,0xf9,0xe8,0x57,0xdd,0xfe,0xe7,0x30}};
extern const GUID OLEDBDECLSPEC _SQLNCLI_OLEDB_DEPRECATE_WARNING CLSID_ROWSET_TVP             = {0xc7ef28d5L,0x7bee,0x443f,{0x86,0xda,0xe3,0x98,0x4f,0xcd,0x4d,0xf9}};

//----------------------------------------------------------------------------
// Provider-specific Interface Ids
//
#ifndef  _SQLOLEDB_H_
extern const GUID OLEDBDECLSPEC IID_ISQLServerErrorInfo      = {0x5cf4ca12,0xef21,0x11d0,{0x97,0xe7,0x0,0xc0,0x4f,0xc2,0xad,0x98}};
extern const GUID OLEDBDECLSPEC IID_IRowsetFastLoad          = {0x5cf4ca13,0xef21,0x11d0,{0x97,0xe7,0x0,0xc0,0x4f,0xc2,0xad,0x98}};
extern const GUID OLEDBDECLSPEC IID_IUMSInitialize           = {0x5cf4ca14,0xef21,0x11d0,{0x97,0xe7,0x0,0xc0,0x4f,0xc2,0xad,0x98}};
extern const GUID OLEDBDECLSPEC IID_ISchemaLock              = {0x4c2389fb,0x2511,0x11d4,{0xb2,0x58,0x0,0xc0,0x4f,0x79,0x71,0xce}};
extern const GUID OLEDBDECLSPEC IID_ISQLXMLHelper            = {0xd22a7678L,0xf860,0x40cd,{0xa5,0x67,0x15,0x63,0xde,0xb4,0x6d,0x49}};
#endif //_SQLOLEDB_H_
extern const GUID OLEDBDECLSPEC IID_ISSAbort                 = {0x5cf4ca15,0xef21,0x11d0,{0x97,0xe7,0x0,0xc0,0x4f,0xc2,0xad,0x98}};
extern const GUID OLEDBDECLSPEC IID_IBCPSession              = {0x88352D80,0x42D1,0x42f0,{0xA1,0x70,0xAB,0x0F,0x8B,0x45,0xB9,0x39}};
extern const GUID OLEDBDECLSPEC IID_IBCPSession2             = {0xad79d3b6,0x59dd,0x46a3,{0xbf,0xc6,0xe6,0x2a,0x65,0xff,0x35,0x23}};
extern const GUID OLEDBDECLSPEC IID_ISSCommandWithParameters = {0xeec30162,0x6087,0x467c,{0xb9,0x95,0x7c,0x52,0x3c,0xe9,0x65,0x61}};
extern const GUID OLEDBDECLSPEC IID_ISSAsynchStatus          = {0x1FF1F743,0x8BB0, 0x4c00,{0xAC,0xC4,0xC1,0x0E,0x43,0xB0,0x8F,0xC1}};


//----------------------------------------------------------------------------
// Provider-specific schema rowsets
//
#ifndef  _SQLOLEDB_H_
extern const GUID OLEDBDECLSPEC DBSCHEMA_LINKEDSERVERS               = {0x9093caf4,0x2eac,0x11d1,{0x98,0x9,0x0,0xc0,0x4f,0xc2,0xad,0x98}};
#endif //_SQLOLEDB_H_
extern const GUID OLEDBDECLSPEC DBSCHEMA_SQL_ASSEMBLIES              = {0x7c1112c8, 0xc2d3, 0x4f6e, {0x94, 0x9a, 0x98, 0x3d, 0x38, 0xa5, 0x8f, 0x46}};
extern const GUID OLEDBDECLSPEC DBSCHEMA_SQL_ASSEMBLY_DEPENDENCIES   = {0xcb0f837b, 0x974c, 0x41b8, {0x90, 0x9d, 0x64, 0x9c, 0xaf, 0x45, 0xad, 0x2f}};
extern const GUID OLEDBDECLSPEC DBSCHEMA_SQL_USER_TYPES              = {0xf1198bd8, 0xa424, 0x4ea3, {0x8d, 0x4c, 0x60, 0x7e, 0xee, 0x2b, 0xab, 0x60}};
extern const GUID OLEDBDECLSPEC DBSCHEMA_XML_COLLECTIONS             = {0x56bfad8c, 0x6e8f, 0x480d, {0x91, 0xde, 0x35, 0x16, 0xd9, 0x9a, 0x5d, 0x10}};
extern const GUID OLEDBDECLSPEC DBSCHEMA_SQL_TABLE_TYPES             = {0x4e26cde7, 0xaaa4, 0x41ed, {0x93, 0xdd, 0x37, 0x6e, 0x6d, 0x40, 0x9c, 0x17}};
extern const GUID OLEDBDECLSPEC DBSCHEMA_SQL_TABLE_TYPE_PRIMARY_KEYS = {0x9738faea, 0x31e8, 0x4f63, {0xae,  0xd, 0x61, 0x33, 0x16, 0x41, 0x8c, 0xdd}};
extern const GUID OLEDBDECLSPEC DBSCHEMA_SQL_TABLE_TYPE_COLUMNS      = {0xa663d94b, 0xddf7, 0x4a7f, {0xa5, 0x37, 0xd6, 0x1f, 0x12, 0x36, 0x5d, 0x7c}};
extern const GUID OLEDBDECLSPEC DBSCHEMA_COLUMNS_EXTENDED            = {0x66462f01, 0x633a, 0x44d9, {0xb0, 0xd0, 0xfe, 0x66, 0xf2, 0x1a, 0x0d, 0x24}};
extern const GUID OLEDBDECLSPEC DBSCHEMA_SPARSE_COLUMN_SET           = {0x31a4837c, 0xf9ff, 0x405f, {0x89, 0x82, 0x02, 0x19, 0xaa, 0xaa, 0x4a, 0x12}};


#ifndef CRESTRICTIONS_DBSCHEMA_LINKEDSERVERS
#define CRESTRICTIONS_DBSCHEMA_LINKEDSERVERS    1
#endif

#ifndef CRESTRICTIONS_DBSCHEMA_ASSEMBLIES
#define CRESTRICTIONS_DBSCHEMA_SQL_ASSEMBLIES       4
#endif

#ifndef CRESTRICTIONS_DBSCHEMA_ASSEMBLY_DEPENDENCIES
#define CRESTRICTIONS_DBSCHEMA_SQL_ASSEMBLY_DEPENDENCIES 4
#endif

#ifndef CRESTRICTIONS_DBSCHEMA_USER_TYPES
#define CRESTRICTIONS_DBSCHEMA_SQL_USER_TYPES   3
#endif

#ifndef CRESTRICTIONS_DBSCHEMA_XML_COLLECTIONS
#define CRESTRICTIONS_DBSCHEMA_XML_COLLECTIONS   4
#endif

#ifndef CRESTRICTIONS_DBSCHEMA_SQL_TABLE_TYPES
#define CRESTRICTIONS_DBSCHEMA_SQL_TABLE_TYPES    3
#endif

#ifndef CRESTRICTIONS_DBSCHEMA_SQL_TABLE_TYPE_PRIMARY_KEYS
#define CRESTRICTIONS_DBSCHEMA_SQL_TABLE_TYPE_PRIMARY_KEYS    3
#endif

#ifndef CRESTRICTIONS_DBSCHEMA_SQL_TABLE_TYPE_COLUMNS
#define CRESTRICTIONS_DBSCHEMA_SQL_TABLE_TYPE_COLUMNS    4
#endif

#ifndef CRESTRICTIONS_DBSCHEMA_COLUMNS_EXTENDED
#define CRESTRICTIONS_DBSCHEMA_COLUMNS_EXTENDED    4
#endif

#ifndef CRESTRICTIONS_DBSCHEMA_SPARSE_COLUMN_SET
#define CRESTRICTIONS_DBSCHEMA_SPARSE_COLUMN_SET    4
#endif


//----------------------------------------------------------------------------
// Provider-specific property sets
//
#ifndef  _SQLOLEDB_H_
extern const GUID OLEDBDECLSPEC DBPROPSET_SQLSERVERDATASOURCE    = {0x28efaee4,0x2d2c,0x11d1,{0x98,0x7,0x0,0xc0,0x4f,0xc2,0xad,0x98}};
extern const GUID OLEDBDECLSPEC DBPROPSET_SQLSERVERDATASOURCEINFO= {0xdf10cb94,0x35f6,0x11d2,{0x9c,0x54,0x0,0xc0,0x4f,0x79,0x71,0xd3}};
extern const GUID OLEDBDECLSPEC DBPROPSET_SQLSERVERDBINIT        = {0x5cf4ca10,0xef21,0x11d0,{0x97,0xe7,0x0,0xc0,0x4f,0xc2,0xad,0x98}};
extern const GUID OLEDBDECLSPEC DBPROPSET_SQLSERVERROWSET        = {0x5cf4ca11,0xef21,0x11d0,{0x97,0xe7,0x0,0xc0,0x4f,0xc2,0xad,0x98}};
extern const GUID OLEDBDECLSPEC DBPROPSET_SQLSERVERSESSION       = {0x28efaee5,0x2d2c,0x11d1,{0x98,0x7,0x0,0xc0,0x4f,0xc2,0xad,0x98}};
extern const GUID OLEDBDECLSPEC DBPROPSET_SQLSERVERCOLUMN        = {0x3b63fb5e,0x3fbb,0x11d3,{0x9f,0x29,0x0,0xc0,0x4f,0x8e,0xe9,0xdc}};
extern const GUID OLEDBDECLSPEC DBPROPSET_SQLSERVERSTREAM        = {0x9f79c073,0x8a6d,0x4bca,{0xa8,0xa8,0xc9,0xb7,0x9a,0x9b,0x96,0x2d}};
#endif //_SQLOLEDB_H_
extern const GUID OLEDBDECLSPEC DBPROPSET_SQLSERVERPARAMETER     = {0xfee09128,0xa67d,0x47ea,{0x8d,0x40,0x24,0xa1,0xd4,0x73,0x7e,0x8d}};
extern const GUID OLEDBDECLSPEC DBPROPSET_SQLSERVERINDEX         = {0xE428B84E,0xA6B7,0x413a,{0x94,0x65,0x56,0x23,0x2E,0x0D,0x2B,0xEB}};
extern const GUID OLEDBDECLSPEC DBPROPSET_PARAMETERALL           = {0x2cd2b7d8,0xe7c2,0x4f6c,{0x9b,0x30,0x75,0xe2,0x58,0x46,0x10,0x97}};


//----------------------------------------------------------------------------
// Provider-specific columns for IColumnsRowset
//
#define DBCOLUMN_SS_X_GUID {0x627bd890,0xed54,0x11d2,{0xb9,0x94,0x0,0xc0,0x4f,0x8c,0xa8,0x2c}}
//
#ifndef  _SQLOLEDB_H_
extern const DBID OLEDBDECLSPEC DBCOLUMN_SS_COMPFLAGS        = {DBCOLUMN_SS_X_GUID, DBKIND_GUID_PROPID, (LPOLESTR)100};
extern const DBID OLEDBDECLSPEC DBCOLUMN_SS_SORTID           = {DBCOLUMN_SS_X_GUID, DBKIND_GUID_PROPID, (LPOLESTR)101};
extern const DBID OLEDBDECLSPEC DBCOLUMN_BASETABLEINSTANCE   = {DBCOLUMN_SS_X_GUID, DBKIND_GUID_PROPID, (LPOLESTR)102};
extern const DBID OLEDBDECLSPEC DBCOLUMN_SS_TDSCOLLATION     = {DBCOLUMN_SS_X_GUID, DBKIND_GUID_PROPID, (LPOLESTR)103};
#endif //_SQLOLEDB_H_
extern const DBID OLEDBDECLSPEC DBCOLUMN_BASESERVERNAME      = {DBCOLUMN_SS_X_GUID, DBKIND_GUID_PROPID, (LPOLESTR)104};
extern const DBID OLEDBDECLSPEC DBCOLUMN_SS_XML_SCHEMACOLLECTION_CATALOGNAME= {DBCOLUMN_SS_X_GUID, DBKIND_GUID_PROPID, (LPOLESTR)105};
extern const DBID OLEDBDECLSPEC DBCOLUMN_SS_XML_SCHEMACOLLECTION_SCHEMANAME = {DBCOLUMN_SS_X_GUID, DBKIND_GUID_PROPID, (LPOLESTR)106};
extern const DBID OLEDBDECLSPEC DBCOLUMN_SS_XML_SCHEMACOLLECTIONNAME        = {DBCOLUMN_SS_X_GUID, DBKIND_GUID_PROPID, (LPOLESTR)107};
extern const DBID OLEDBDECLSPEC DBCOLUMN_SS_UDT_CATALOGNAME  = {DBCOLUMN_SS_X_GUID, DBKIND_GUID_PROPID, (LPOLESTR)108};
extern const DBID OLEDBDECLSPEC DBCOLUMN_SS_UDT_SCHEMANAME   = {DBCOLUMN_SS_X_GUID, DBKIND_GUID_PROPID, (LPOLESTR)109};
extern const DBID OLEDBDECLSPEC DBCOLUMN_SS_UDT_NAME         = {DBCOLUMN_SS_X_GUID, DBKIND_GUID_PROPID, (LPOLESTR)110};
extern const DBID OLEDBDECLSPEC DBCOLUMN_SS_ASSEMBLY_TYPENAME= {DBCOLUMN_SS_X_GUID, DBKIND_GUID_PROPID, (LPOLESTR)111};

// OLEDB part of SQL Server Native Client header - end here!
#endif // defined(_SQLNCLI_OLEDB_) || !defined(_SQLNCLI_ODBC_)

// ODBC part of SQL Server Native Client header - begin here!
#if defined(_SQLNCLI_ODBC_) || !defined(_SQLNCLI_OLEDB_)
#ifdef ODBCVER

// max SQL Server identifier length
#define SQL_MAX_SQLSERVERNAME                       128

// SQLSetConnectAttr driver specific defines.
// Microsoft has 1200 thru 1249 reserved for Microsoft SQL Server Native Client driver usage.
// Connection attributes
#define SQL_COPT_SS_BASE                                1200
#define SQL_COPT_SS_REMOTE_PWD                          (SQL_COPT_SS_BASE+1) // dbrpwset SQLSetConnectOption only
#define SQL_COPT_SS_USE_PROC_FOR_PREP                   (SQL_COPT_SS_BASE+2) // Use create proc for SQLPrepare
#define SQL_COPT_SS_INTEGRATED_SECURITY                 (SQL_COPT_SS_BASE+3) // Force integrated security on login
#define SQL_COPT_SS_PRESERVE_CURSORS                    (SQL_COPT_SS_BASE+4) // Preserve server cursors after SQLTransact
#define SQL_COPT_SS_USER_DATA                           (SQL_COPT_SS_BASE+5) // dbgetuserdata/dbsetuserdata
#define SQL_COPT_SS_ENLIST_IN_DTC                       SQL_ATTR_ENLIST_IN_DTC // Enlist in a DTC transaction
#define SQL_COPT_SS_ENLIST_IN_XA                        SQL_ATTR_ENLIST_IN_XA // Enlist in a XA transaction
#define SQL_COPT_SS_FALLBACK_CONNECT                    (SQL_COPT_SS_BASE+10) // Enables FallBack connections
#define SQL_COPT_SS_PERF_DATA                           (SQL_COPT_SS_BASE+11) // Used to access SQL Server ODBC driver performance data
#define SQL_COPT_SS_PERF_DATA_LOG                       (SQL_COPT_SS_BASE+12) // Used to set the logfile name for the Performance data
#define SQL_COPT_SS_PERF_QUERY_INTERVAL                 (SQL_COPT_SS_BASE+13) // Used to set the query logging threshold in milliseconds.
#define SQL_COPT_SS_PERF_QUERY_LOG                      (SQL_COPT_SS_BASE+14) // Used to set the logfile name for saving queryies.
#define SQL_COPT_SS_PERF_QUERY                          (SQL_COPT_SS_BASE+15) // Used to start and stop query logging.
#define SQL_COPT_SS_PERF_DATA_LOG_NOW                   (SQL_COPT_SS_BASE+16) // Used to make a statistics log entry to disk.
#define SQL_COPT_SS_QUOTED_IDENT                        (SQL_COPT_SS_BASE+17) // Enable/Disable Quoted Identifiers
#define SQL_COPT_SS_ANSI_NPW                            (SQL_COPT_SS_BASE+18) // Enable/Disable ANSI NULL, Padding and Warnings
#define SQL_COPT_SS_BCP                                 (SQL_COPT_SS_BASE+19) // Allow BCP usage on connection
#define SQL_COPT_SS_TRANSLATE                           (SQL_COPT_SS_BASE+20) // Perform code page translation
#define SQL_COPT_SS_ATTACHDBFILENAME                    (SQL_COPT_SS_BASE+21) // File name to be attached as a database
#define SQL_COPT_SS_CONCAT_NULL                         (SQL_COPT_SS_BASE+22) // Enable/Disable CONCAT_NULL_YIELDS_NULL
#define SQL_COPT_SS_ENCRYPT                             (SQL_COPT_SS_BASE+23) // Allow strong encryption for data
#define SQL_COPT_SS_MARS_ENABLED                        (SQL_COPT_SS_BASE+24) // Multiple active result set per connection
#define SQL_COPT_SS_FAILOVER_PARTNER                    (SQL_COPT_SS_BASE+25) // Failover partner server
#define SQL_COPT_SS_OLDPWD                              (SQL_COPT_SS_BASE+26) // Old Password, used when changing password during login
#define SQL_COPT_SS_TXN_ISOLATION                       (SQL_COPT_SS_BASE+27) // Used to set/get any driver-specific or ODBC-defined TXN iso level
#define SQL_COPT_SS_TRUST_SERVER_CERTIFICATE            (SQL_COPT_SS_BASE+28) // Trust server certificate
#define SQL_COPT_SS_SERVER_SPN                          (SQL_COPT_SS_BASE+29) // Server SPN
#define SQL_COPT_SS_FAILOVER_PARTNER_SPN                (SQL_COPT_SS_BASE+30) // Failover partner server SPN
#define SQL_COPT_SS_INTEGRATED_AUTHENTICATION_METHOD    (SQL_COPT_SS_BASE+31) // The integrated authentication method used for the connection
#define SQL_COPT_SS_MUTUALLY_AUTHENTICATED              (SQL_COPT_SS_BASE+32) // Used to decide if the connection is mutually authenticated
#define SQL_COPT_SS_CLIENT_CONNECTION_ID                (SQL_COPT_SS_BASE+33) // Post connection attribute used to get the ConnectionID
#define SQL_COPT_SS_MAX_USED                            SQL_COPT_SS_CLIENT_CONNECTION_ID
// Define old names
#define SQL_REMOTE_PWD                              SQL_COPT_SS_REMOTE_PWD
#define SQL_USE_PROCEDURE_FOR_PREPARE               SQL_COPT_SS_USE_PROC_FOR_PREP
#define SQL_INTEGRATED_SECURITY                     SQL_COPT_SS_INTEGRATED_SECURITY
#define SQL_PRESERVE_CURSORS                        SQL_COPT_SS_PRESERVE_CURSORS

// SQLSetStmtAttr SQL Server Native Client driver specific defines.
// Statement attributes
#define SQL_SOPT_SS_BASE                            1225
#define SQL_SOPT_SS_TEXTPTR_LOGGING                 (SQL_SOPT_SS_BASE+0) // Text pointer logging
#define SQL_SOPT_SS_CURRENT_COMMAND                 (SQL_SOPT_SS_BASE+1) // dbcurcmd SQLGetStmtOption only
#define SQL_SOPT_SS_HIDDEN_COLUMNS                  (SQL_SOPT_SS_BASE+2) // Expose FOR BROWSE hidden columns
#define SQL_SOPT_SS_NOBROWSETABLE                   (SQL_SOPT_SS_BASE+3) // Set NOBROWSETABLE option
#define SQL_SOPT_SS_REGIONALIZE                     (SQL_SOPT_SS_BASE+4) // Regionalize output character conversions
#define SQL_SOPT_SS_CURSOR_OPTIONS                  (SQL_SOPT_SS_BASE+5) // Server cursor options
#define SQL_SOPT_SS_NOCOUNT_STATUS                  (SQL_SOPT_SS_BASE+6) // Real vs. Not Real row count indicator
#define SQL_SOPT_SS_DEFER_PREPARE                   (SQL_SOPT_SS_BASE+7) // Defer prepare until necessary
#define SQL_SOPT_SS_QUERYNOTIFICATION_TIMEOUT       (SQL_SOPT_SS_BASE+8) // Notification timeout
#define SQL_SOPT_SS_QUERYNOTIFICATION_MSGTEXT       (SQL_SOPT_SS_BASE+9) // Notification message text
#define SQL_SOPT_SS_QUERYNOTIFICATION_OPTIONS       (SQL_SOPT_SS_BASE+10)// SQL service broker name
#define SQL_SOPT_SS_PARAM_FOCUS                     (SQL_SOPT_SS_BASE+11)// Direct subsequent calls to parameter related methods to set properties on constituent columns/parameters of container types
#define SQL_SOPT_SS_NAME_SCOPE                      (SQL_SOPT_SS_BASE+12)// Sets name scope for subsequent catalog function calls
#define SQL_SOPT_SS_MAX_USED                        SQL_SOPT_SS_NAME_SCOPE
// Define old names
#define SQL_TEXTPTR_LOGGING                         SQL_SOPT_SS_TEXTPTR_LOGGING
#define SQL_COPT_SS_BASE_EX                         1240
#define SQL_COPT_SS_BROWSE_CONNECT                  (SQL_COPT_SS_BASE_EX+1) // Browse connect mode of operation
#define SQL_COPT_SS_BROWSE_SERVER                   (SQL_COPT_SS_BASE_EX+2) // Single Server browse request.
#define SQL_COPT_SS_WARN_ON_CP_ERROR                (SQL_COPT_SS_BASE_EX+3) // Issues warning when data from the server had a loss during code page conversion.
#define SQL_COPT_SS_CONNECTION_DEAD                 (SQL_COPT_SS_BASE_EX+4) // dbdead SQLGetConnectOption only. It will try to ping the server. Expensive connection check
#define SQL_COPT_SS_BROWSE_CACHE_DATA               (SQL_COPT_SS_BASE_EX+5) // Determines if we should cache browse info. Used when returned buffer is greater then ODBC limit (32K)
#define SQL_COPT_SS_RESET_CONNECTION                (SQL_COPT_SS_BASE_EX+6) // When this option is set, we will perform connection reset on next packet
#define SQL_COPT_SS_APPLICATION_INTENT              (SQL_COPT_SS_BASE_EX+7) // Application Intent
#define SQL_COPT_SS_MULTISUBNET_FAILOVER            (SQL_COPT_SS_BASE_EX+8) // Multi-subnet Failover
#define SQL_COPT_SS_EX_MAX_USED                     SQL_COPT_SS_MULTISUBNET_FAILOVER

// SQLColAttributes driver specific defines.
// SQLSetDescField/SQLGetDescField driver specific defines.
// Microsoft has 1200 thru 1249 reserved for Microsoft SQL Server Native Client driver usage.
#define SQL_CA_SS_BASE                              1200
#define SQL_CA_SS_COLUMN_SSTYPE                     (SQL_CA_SS_BASE+0)   //  dbcoltype/dbalttype
#define SQL_CA_SS_COLUMN_UTYPE                      (SQL_CA_SS_BASE+1)   //  dbcolutype/dbaltutype
#define SQL_CA_SS_NUM_ORDERS                        (SQL_CA_SS_BASE+2)   //  dbnumorders
#define SQL_CA_SS_COLUMN_ORDER                      (SQL_CA_SS_BASE+3)   //  dbordercol
#define SQL_CA_SS_COLUMN_VARYLEN                    (SQL_CA_SS_BASE+4)   //  dbvarylen
#define SQL_CA_SS_NUM_COMPUTES                      (SQL_CA_SS_BASE+5)   //  dbnumcompute
#define SQL_CA_SS_COMPUTE_ID                        (SQL_CA_SS_BASE+6)   //  dbnextrow status return
#define SQL_CA_SS_COMPUTE_BYLIST                    (SQL_CA_SS_BASE+7)   //  dbbylist
#define SQL_CA_SS_COLUMN_ID                         (SQL_CA_SS_BASE+8)   //  dbaltcolid
#define SQL_CA_SS_COLUMN_OP                         (SQL_CA_SS_BASE+9)   //  dbaltop
#define SQL_CA_SS_COLUMN_SIZE                       (SQL_CA_SS_BASE+10)  //  dbcollen
#define SQL_CA_SS_COLUMN_HIDDEN                     (SQL_CA_SS_BASE+11)  //  Column is hidden (FOR BROWSE)
#define SQL_CA_SS_COLUMN_KEY                        (SQL_CA_SS_BASE+12)  //  Column is key column (FOR BROWSE)
//#define SQL_DESC_BASE_COLUMN_NAME_OLD             (SQL_CA_SS_BASE+13)  //  This is defined at another location.
#define SQL_CA_SS_COLUMN_COLLATION                  (SQL_CA_SS_BASE+14)  //  Column collation (only for chars)
#define SQL_CA_SS_VARIANT_TYPE                      (SQL_CA_SS_BASE+15)
#define SQL_CA_SS_VARIANT_SQL_TYPE                  (SQL_CA_SS_BASE+16)
#define SQL_CA_SS_VARIANT_SERVER_TYPE               (SQL_CA_SS_BASE+17)

// XML, CLR UDT, and table valued parameter related metadata
#define SQL_CA_SS_UDT_CATALOG_NAME                  (SQL_CA_SS_BASE+18) //  UDT catalog name
#define SQL_CA_SS_UDT_SCHEMA_NAME                   (SQL_CA_SS_BASE+19) //  UDT schema name
#define SQL_CA_SS_UDT_TYPE_NAME                     (SQL_CA_SS_BASE+20) //  UDT type name
#define SQL_CA_SS_UDT_ASSEMBLY_TYPE_NAME            (SQL_CA_SS_BASE+21) //  Qualified name of the assembly containing the UDT class
#define SQL_CA_SS_XML_SCHEMACOLLECTION_CATALOG_NAME (SQL_CA_SS_BASE+22) //  Name of the catalog that contains XML Schema collection
#define SQL_CA_SS_XML_SCHEMACOLLECTION_SCHEMA_NAME  (SQL_CA_SS_BASE+23) //  Name of the schema that contains XML Schema collection
#define SQL_CA_SS_XML_SCHEMACOLLECTION_NAME         (SQL_CA_SS_BASE+24) //  Name of the XML Schema collection
#define SQL_CA_SS_CATALOG_NAME                      (SQL_CA_SS_BASE+25) //  Catalog name
#define SQL_CA_SS_SCHEMA_NAME                       (SQL_CA_SS_BASE+26) //  Schema name
#define SQL_CA_SS_TYPE_NAME                         (SQL_CA_SS_BASE+27) //  Type name

// table valued parameter related metadata
#define SQL_CA_SS_COLUMN_COMPUTED                   (SQL_CA_SS_BASE+29) //  column is computed
#define SQL_CA_SS_COLUMN_IN_UNIQUE_KEY              (SQL_CA_SS_BASE+30) //  column is part of a unique key
#define SQL_CA_SS_COLUMN_SORT_ORDER                 (SQL_CA_SS_BASE+31) //  column sort order
#define SQL_CA_SS_COLUMN_SORT_ORDINAL               (SQL_CA_SS_BASE+32) //  column sort ordinal
#define SQL_CA_SS_COLUMN_HAS_DEFAULT_VALUE          (SQL_CA_SS_BASE+33) //  column has default value for all rows of the table valued parameter

// sparse column related metadata
#define SQL_CA_SS_IS_COLUMN_SET                     (SQL_CA_SS_BASE+34) //  column is a column-set column for sparse columns

// Legacy datetime related metadata
#define SQL_CA_SS_SERVER_TYPE                       (SQL_CA_SS_BASE+35) //  column type to send on the wire for datetime types

#define SQL_CA_SS_MAX_USED                          (SQL_CA_SS_BASE+36)

// Defines returned by SQL_ATTR_CURSOR_TYPE/SQL_CURSOR_TYPE
#define SQL_CURSOR_FAST_FORWARD_ONLY        8            //  Only returned by SQLGetStmtAttr/Option
// Defines for use with SQL_COPT_SS_USE_PROC_FOR_PREP
#define SQL_UP_OFF                          0L           //  Procedures won't be used for prepare
#define SQL_UP_ON                           1L           //  Procedures will be used for prepare
#define SQL_UP_ON_DROP                      2L           //  Temp procedures will be explicitly dropped
#define SQL_UP_DEFAULT                      SQL_UP_ON
// Defines for use with SQL_COPT_SS_INTEGRATED_SECURITY - Pre-Connect Option only
#define SQL_IS_OFF                          0L           //  Integrated security isn't used
#define SQL_IS_ON                           1L           //  Integrated security is used
#define SQL_IS_DEFAULT                      SQL_IS_OFF
// Defines for use with SQL_COPT_SS_PRESERVE_CURSORS
#define SQL_PC_OFF                          0L           //  Cursors are closed on SQLTransact
#define SQL_PC_ON                           1L           //  Cursors remain open on SQLTransact
#define SQL_PC_DEFAULT                      SQL_PC_OFF
// Defines for use with SQL_COPT_SS_USER_DATA
#define SQL_UD_NOTSET                       NULL         //  No user data pointer set
// Defines for use with SQL_COPT_SS_TRANSLATE
#define SQL_XL_OFF                          0L           //  Code page translation is not performed
#define SQL_XL_ON                           1L           //  Code page translation is performed
#define SQL_XL_DEFAULT                      SQL_XL_ON
// Defines for use with SQL_COPT_SS_FALLBACK_CONNECT - Pre-Connect Option only
#define SQL_FB_OFF                          0L           //  FallBack connections are disabled
#define SQL_FB_ON                           1L           //  FallBack connections are enabled
#define SQL_FB_DEFAULT                      SQL_FB_OFF
// Defines for use with SQL_COPT_SS_BCP - Pre-Connect Option only
#define SQL_BCP_OFF                         0L           //  BCP is not allowed on connection
#define SQL_BCP_ON                          1L           //  BCP is allowed on connection
#define SQL_BCP_DEFAULT                     SQL_BCP_OFF
// Defines for use with SQL_COPT_SS_QUOTED_IDENT
#define SQL_QI_OFF                          0L           //  Quoted identifiers are enable
#define SQL_QI_ON                           1L           //  Quoted identifiers are disabled
#define SQL_QI_DEFAULT                      SQL_QI_ON
// Defines for use with SQL_COPT_SS_ANSI_NPW - Pre-Connect Option only
#define SQL_AD_OFF                          0L           //  ANSI NULLs, Padding and Warnings are enabled
#define SQL_AD_ON                           1L           //  ANSI NULLs, Padding and Warnings are disabled
#define SQL_AD_DEFAULT                      SQL_AD_ON
// Defines for use with SQL_COPT_SS_CONCAT_NULL - Pre-Connect Option only
#define SQL_CN_OFF                          0L           //  CONCAT_NULL_YIELDS_NULL is off
#define SQL_CN_ON                           1L           //  CONCAT_NULL_YIELDS_NULL is on
#define SQL_CN_DEFAULT                      SQL_CN_ON
// Defines for use with SQL_SOPT_SS_TEXTPTR_LOGGING
#define SQL_TL_OFF                          0L           //  No logging on text pointer ops
#define SQL_TL_ON                           1L           //  Logging occurs on text pointer ops
#define SQL_TL_DEFAULT                      SQL_TL_ON
// Defines for use with SQL_SOPT_SS_HIDDEN_COLUMNS
#define SQL_HC_OFF                          0L           //  FOR BROWSE columns are hidden
#define SQL_HC_ON                           1L           //  FOR BROWSE columns are exposed
#define SQL_HC_DEFAULT                      SQL_HC_OFF
// Defines for use with SQL_SOPT_SS_NOBROWSETABLE
#define SQL_NB_OFF                          0L           //  NO_BROWSETABLE is off
#define SQL_NB_ON                           1L           //  NO_BROWSETABLE is on
#define SQL_NB_DEFAULT                      SQL_NB_OFF
// Defines for use with SQL_SOPT_SS_REGIONALIZE
#define SQL_RE_OFF                          0L           //  No regionalization occurs on output character conversions
#define SQL_RE_ON                           1L           //  Regionalization occurs on output character conversions
#define SQL_RE_DEFAULT                      SQL_RE_OFF
// Defines for use with SQL_SOPT_SS_CURSOR_OPTIONS
#define SQL_CO_OFF                          0L           //  Clear all cursor options
#define SQL_CO_FFO                          1L           //  Fast-forward cursor will be used
#define SQL_CO_AF                           2L           //  Autofetch on cursor open
#define SQL_CO_FFO_AF                       (SQL_CO_FFO|SQL_CO_AF)  //  Fast-forward cursor with autofetch
#define SQL_CO_FIREHOSE_AF                  4L           //  Auto fetch on fire-hose cursors
#define SQL_CO_DEFAULT                      SQL_CO_OFF
//SQL_SOPT_SS_NOCOUNT_STATUS 
#define SQL_NC_OFF                          0L
#define SQL_NC_ON                           1L
//SQL_SOPT_SS_DEFER_PREPARE 
#define SQL_DP_OFF                          0L
#define SQL_DP_ON                           1L
//SQL_SOPT_SS_NAME_SCOPE
#define SQL_SS_NAME_SCOPE_TABLE             0L
#define SQL_SS_NAME_SCOPE_TABLE_TYPE        1L
#define SQL_SS_NAME_SCOPE_EXTENDED          2L
#define SQL_SS_NAME_SCOPE_SPARSE_COLUMN_SET 3L
#define SQL_SS_NAME_SCOPE_DEFAULT           SQL_SS_NAME_SCOPE_TABLE
//SQL_COPT_SS_ENCRYPT 
#define SQL_EN_OFF                          0L
#define SQL_EN_ON                           1L
//SQL_COPT_SS_TRUST_SERVER_CERTIFICATE
#define SQL_TRUST_SERVER_CERTIFICATE_NO     0L
#define SQL_TRUST_SERVER_CERTIFICATE_YES    1L
//SQL_COPT_SS_BROWSE_CONNECT 
#define SQL_MORE_INFO_NO                    0L
#define SQL_MORE_INFO_YES                   1L
//SQL_COPT_SS_BROWSE_CACHE_DATA 
#define SQL_CACHE_DATA_NO                   0L
#define SQL_CACHE_DATA_YES                  1L
//SQL_COPT_SS_RESET_CONNECTION 
#define SQL_RESET_YES                       1L
//SQL_COPT_SS_WARN_ON_CP_ERROR 
#define SQL_WARN_NO                         0L
#define SQL_WARN_YES                        1L
//SQL_COPT_SS_MARS_ENABLED 
#define SQL_MARS_ENABLED_NO                 0L
#define SQL_MARS_ENABLED_YES                1L
/* SQL_TXN_ISOLATION_OPTION bitmasks */
#define SQL_TXN_SS_SNAPSHOT                 0x00000020L

// The following are defines for SQL_CA_SS_COLUMN_SORT_ORDER
#define SQL_SS_ORDER_UNSPECIFIED            0L
#define SQL_SS_DESCENDING_ORDER             1L
#define SQL_SS_ASCENDING_ORDER              2L
#define SQL_SS_ORDER_DEFAULT                SQL_SS_ORDER_UNSPECIFIED

// Driver specific SQL data type defines.
// Microsoft has -150 thru -199 reserved for Microsoft SQL Server Native Client driver usage.
#define SQL_SS_VARIANT                      (-150)
#define SQL_SS_UDT                          (-151)
#define SQL_SS_XML                          (-152)
#define SQL_SS_TABLE                        (-153)
#define SQL_SS_TIME2                        (-154)
#define SQL_SS_TIMESTAMPOFFSET              (-155)

// Local types to be used with SQL_CA_SS_SERVER_TYPE
#define SQL_SS_TYPE_DEFAULT                         0L
#define SQL_SS_TYPE_SMALLDATETIME                   1L
#define SQL_SS_TYPE_DATETIME                        2L

// Extended C Types range 4000 and above. Range of -100 thru 200 is reserved by Driver Manager.
#define SQL_C_TYPES_EXTENDED                0x04000L
#define SQL_C_SS_TIME2                         (SQL_C_TYPES_EXTENDED+0)
#define SQL_C_SS_TIMESTAMPOFFSET               (SQL_C_TYPES_EXTENDED+1)

#ifndef SQLNCLI_NO_BCP
// Define the symbol SQLNCLI_NO_BCP if you are not using BCP in your application
// and you want to exclude the BCP-related definitions in this header file.

// SQL Server Data Type defines.
// New types for SQL 6.0 and later servers
#define SQLTEXT                             0x23
#define SQLVARBINARY                        0x25
#define SQLINTN                             0x26
#define SQLVARCHAR                          0x27
#define SQLBINARY                           0x2d
#define SQLIMAGE                            0x22
#define SQLCHARACTER                        0x2f
#define SQLINT1                             0x30
#define SQLBIT                              0x32
#define SQLINT2                             0x34
#define SQLINT4                             0x38
#define SQLMONEY                            0x3c
#define SQLDATETIME                         0x3d
#define SQLFLT8                             0x3e
#define SQLFLTN                             0x6d
#define SQLMONEYN                           0x6e
#define SQLDATETIMN                         0x6f
#define SQLFLT4                             0x3b
#define SQLMONEY4                           0x7a
#define SQLDATETIM4                         0x3a
// New types for SQL 6.0 and later servers
#define SQLDECIMAL                          0x6a
#define SQLNUMERIC                          0x6c
// New types for SQL 7.0 and later servers
#define SQLUNIQUEID                         0x24
#define SQLBIGCHAR                          0xaf
#define SQLBIGVARCHAR                       0xa7
#define SQLBIGBINARY                        0xad
#define SQLBIGVARBINARY                     0xa5
#define SQLBITN                             0x68
#define SQLNCHAR                            0xef
#define SQLNVARCHAR                         0xe7
#define SQLNTEXT                            0x63
// New types for SQL 2000 and later servers
#define SQLINT8                             0x7f
#define SQLVARIANT                          0x62
// New types for SQL 2005 and later servers
#define SQLUDT                              0xf0
#define SQLXML                              0xf1
// New types for SQL 2008 and later servers
#define SQLTABLE                            0xf3
#define SQLDATEN                            0x28
#define SQLTIMEN                            0x29
#define SQLDATETIME2N                       0x2a
#define SQLDATETIMEOFFSETN                  0x2b
// Define old names
#define SQLDECIMALN                         0x6a
#define SQLNUMERICN                         0x6c
#endif // SQLNCLI_NO_BCP

// SQL_SS_LENGTH_UNLIMITED is used to describe the max length of
// VARCHAR(max), VARBINARY(max), NVARCHAR(max), and XML columns
#define SQL_SS_LENGTH_UNLIMITED             0

// User Data Type definitions.
// Returned by SQLColAttributes/SQL_CA_SS_COLUMN_UTYPE.
#define SQLudtBINARY                        3
#define SQLudtBIT                           16
#define SQLudtBITN                          0
#define SQLudtCHAR                          1
#define SQLudtDATETIM4                      22
#define SQLudtDATETIME                      12
#define SQLudtDATETIMN                      15
#define SQLudtDECML                         24
#define SQLudtDECMLN                        26
#define SQLudtFLT4                          23
#define SQLudtFLT8                          8
#define SQLudtFLTN                          14
#define SQLudtIMAGE                         20
#define SQLudtINT1                          5
#define SQLudtINT2                          6
#define SQLudtINT4                          7
#define SQLudtINTN                          13
#define SQLudtMONEY                         11
#define SQLudtMONEY4                        21
#define SQLudtMONEYN                        17
#define SQLudtNUM                           10
#define SQLudtNUMN                          25
#define SQLudtSYSNAME                       18
#define SQLudtTEXT                          19
#define SQLudtTIMESTAMP                     80
#define SQLudtUNIQUEIDENTIFIER              0
#define SQLudtVARBINARY                     4
#define SQLudtVARCHAR                       2
#define MIN_USER_DATATYPE                   256
// Aggregate operator types.
// Returned by SQLColAttributes/SQL_CA_SS_COLUMN_OP.
#define SQLAOPSTDEV                         0x30    // Standard deviation
#define SQLAOPSTDEVP                        0x31    // Standard deviation population
#define SQLAOPVAR                           0x32    // Variance
#define SQLAOPVARP                          0x33    // Variance population
#define SQLAOPCNT                           0x4b    // Count
#define SQLAOPSUM                           0x4d    // Sum
#define SQLAOPAVG                           0x4f    // Average
#define SQLAOPMIN                           0x51    // Min
#define SQLAOPMAX                           0x52    // Max
#define SQLAOPANY                           0x53    // Any
#define SQLAOPNOOP                          0x56    // None
// SQLGetInfo driver specific defines.
// Microsoft has 1151 thru 1200 reserved for Microsoft SQL Server Native Client driver usage.
#define SQL_INFO_SS_FIRST                   1199
#define SQL_INFO_SS_NETLIB_NAMEW            (SQL_INFO_SS_FIRST+0) //  dbprocinfo
#define SQL_INFO_SS_NETLIB_NAMEA            (SQL_INFO_SS_FIRST+1) //  dbprocinfo
#define SQL_INFO_SS_MAX_USED                SQL_INFO_SS_NETLIB_NAMEA
#ifdef UNICODE
#define SQL_INFO_SS_NETLIB_NAME             SQL_INFO_SS_NETLIB_NAMEW
#else
#define SQL_INFO_SS_NETLIB_NAME             SQL_INFO_SS_NETLIB_NAMEA
#endif
// SQLGetDiagField driver specific defines.
// Microsoft has -1150 thru -1199 reserved for Microsoft SQL Server Native Client driver usage.
#define SQL_DIAG_SS_BASE                    (-1150)
#define SQL_DIAG_SS_MSGSTATE                (SQL_DIAG_SS_BASE)
#define SQL_DIAG_SS_SEVERITY                (SQL_DIAG_SS_BASE-1)
#define SQL_DIAG_SS_SRVNAME                 (SQL_DIAG_SS_BASE-2)
#define SQL_DIAG_SS_PROCNAME                (SQL_DIAG_SS_BASE-3)
#define SQL_DIAG_SS_LINE                    (SQL_DIAG_SS_BASE-4)
// SQLGetDiagField/SQL_DIAG_DYNAMIC_FUNCTION_CODE driver specific defines.
// Microsoft has -200 thru -299 reserved for Microsoft SQL Server Native Client driver usage.
#define SQL_DIAG_DFC_SS_BASE                (-200)
#define SQL_DIAG_DFC_SS_ALTER_DATABASE      (SQL_DIAG_DFC_SS_BASE-0)
#define SQL_DIAG_DFC_SS_CHECKPOINT          (SQL_DIAG_DFC_SS_BASE-1)
#define SQL_DIAG_DFC_SS_CONDITION           (SQL_DIAG_DFC_SS_BASE-2)
#define SQL_DIAG_DFC_SS_CREATE_DATABASE     (SQL_DIAG_DFC_SS_BASE-3)
#define SQL_DIAG_DFC_SS_CREATE_DEFAULT      (SQL_DIAG_DFC_SS_BASE-4)
#define SQL_DIAG_DFC_SS_CREATE_PROCEDURE    (SQL_DIAG_DFC_SS_BASE-5)
#define SQL_DIAG_DFC_SS_CREATE_RULE         (SQL_DIAG_DFC_SS_BASE-6)
#define SQL_DIAG_DFC_SS_CREATE_TRIGGER      (SQL_DIAG_DFC_SS_BASE-7)
#define SQL_DIAG_DFC_SS_CURSOR_DECLARE      (SQL_DIAG_DFC_SS_BASE-8)
#define SQL_DIAG_DFC_SS_CURSOR_OPEN         (SQL_DIAG_DFC_SS_BASE-9)
#define SQL_DIAG_DFC_SS_CURSOR_FETCH        (SQL_DIAG_DFC_SS_BASE-10)
#define SQL_DIAG_DFC_SS_CURSOR_CLOSE        (SQL_DIAG_DFC_SS_BASE-11)
#define SQL_DIAG_DFC_SS_DEALLOCATE_CURSOR   (SQL_DIAG_DFC_SS_BASE-12)
#define SQL_DIAG_DFC_SS_DBCC                (SQL_DIAG_DFC_SS_BASE-13)
#define SQL_DIAG_DFC_SS_DISK                (SQL_DIAG_DFC_SS_BASE-14)
#define SQL_DIAG_DFC_SS_DROP_DATABASE       (SQL_DIAG_DFC_SS_BASE-15)
#define SQL_DIAG_DFC_SS_DROP_DEFAULT        (SQL_DIAG_DFC_SS_BASE-16)
#define SQL_DIAG_DFC_SS_DROP_PROCEDURE      (SQL_DIAG_DFC_SS_BASE-17)
#define SQL_DIAG_DFC_SS_DROP_RULE           (SQL_DIAG_DFC_SS_BASE-18)
#define SQL_DIAG_DFC_SS_DROP_TRIGGER        (SQL_DIAG_DFC_SS_BASE-19)
#define SQL_DIAG_DFC_SS_DUMP_DATABASE       (SQL_DIAG_DFC_SS_BASE-20)
#define SQL_DIAG_DFC_SS_BACKUP_DATABASE     (SQL_DIAG_DFC_SS_BASE-20)
#define SQL_DIAG_DFC_SS_DUMP_TABLE          (SQL_DIAG_DFC_SS_BASE-21)
#define SQL_DIAG_DFC_SS_DUMP_TRANSACTION    (SQL_DIAG_DFC_SS_BASE-22)
#define SQL_DIAG_DFC_SS_BACKUP_TRANSACTION  (SQL_DIAG_DFC_SS_BASE-22)
#define SQL_DIAG_DFC_SS_GOTO                (SQL_DIAG_DFC_SS_BASE-23)
#define SQL_DIAG_DFC_SS_INSERT_BULK         (SQL_DIAG_DFC_SS_BASE-24)
#define SQL_DIAG_DFC_SS_KILL                (SQL_DIAG_DFC_SS_BASE-25)
#define SQL_DIAG_DFC_SS_LOAD_DATABASE       (SQL_DIAG_DFC_SS_BASE-26)
#define SQL_DIAG_DFC_SS_RESTORE_DATABASE    (SQL_DIAG_DFC_SS_BASE-26)
#define SQL_DIAG_DFC_SS_LOAD_HEADERONLY     (SQL_DIAG_DFC_SS_BASE-27)
#define SQL_DIAG_DFC_SS_RESTORE_HEADERONLY  (SQL_DIAG_DFC_SS_BASE-27)
#define SQL_DIAG_DFC_SS_LOAD_TABLE          (SQL_DIAG_DFC_SS_BASE-28)
#define SQL_DIAG_DFC_SS_LOAD_TRANSACTION    (SQL_DIAG_DFC_SS_BASE-29)
#define SQL_DIAG_DFC_SS_RESTORE_TRANSACTION (SQL_DIAG_DFC_SS_BASE-29)
#define SQL_DIAG_DFC_SS_PRINT               (SQL_DIAG_DFC_SS_BASE-30)
#define SQL_DIAG_DFC_SS_RAISERROR           (SQL_DIAG_DFC_SS_BASE-31)
#define SQL_DIAG_DFC_SS_READTEXT            (SQL_DIAG_DFC_SS_BASE-32)
#define SQL_DIAG_DFC_SS_RECONFIGURE         (SQL_DIAG_DFC_SS_BASE-33)
#define SQL_DIAG_DFC_SS_RETURN              (SQL_DIAG_DFC_SS_BASE-34)
#define SQL_DIAG_DFC_SS_SELECT_INTO         (SQL_DIAG_DFC_SS_BASE-35)
#define SQL_DIAG_DFC_SS_SET                 (SQL_DIAG_DFC_SS_BASE-36)
#define SQL_DIAG_DFC_SS_SET_IDENTITY_INSERT (SQL_DIAG_DFC_SS_BASE-37)
#define SQL_DIAG_DFC_SS_SET_ROW_COUNT       (SQL_DIAG_DFC_SS_BASE-38)
#define SQL_DIAG_DFC_SS_SET_STATISTICS      (SQL_DIAG_DFC_SS_BASE-39)
#define SQL_DIAG_DFC_SS_SET_TEXTSIZE        (SQL_DIAG_DFC_SS_BASE-40)
#define SQL_DIAG_DFC_SS_SETUSER             (SQL_DIAG_DFC_SS_BASE-41)
#define SQL_DIAG_DFC_SS_SHUTDOWN            (SQL_DIAG_DFC_SS_BASE-42)
#define SQL_DIAG_DFC_SS_TRANS_BEGIN         (SQL_DIAG_DFC_SS_BASE-43)
#define SQL_DIAG_DFC_SS_TRANS_COMMIT        (SQL_DIAG_DFC_SS_BASE-44)
#define SQL_DIAG_DFC_SS_TRANS_PREPARE       (SQL_DIAG_DFC_SS_BASE-45)
#define SQL_DIAG_DFC_SS_TRANS_ROLLBACK      (SQL_DIAG_DFC_SS_BASE-46)
#define SQL_DIAG_DFC_SS_TRANS_SAVE          (SQL_DIAG_DFC_SS_BASE-47)
#define SQL_DIAG_DFC_SS_TRUNCATE_TABLE      (SQL_DIAG_DFC_SS_BASE-48)
#define SQL_DIAG_DFC_SS_UPDATE_STATISTICS   (SQL_DIAG_DFC_SS_BASE-49)
#define SQL_DIAG_DFC_SS_UPDATETEXT          (SQL_DIAG_DFC_SS_BASE-50)
#define SQL_DIAG_DFC_SS_USE                 (SQL_DIAG_DFC_SS_BASE-51)
#define SQL_DIAG_DFC_SS_WAITFOR             (SQL_DIAG_DFC_SS_BASE-52)
#define SQL_DIAG_DFC_SS_WRITETEXT           (SQL_DIAG_DFC_SS_BASE-53)
#define SQL_DIAG_DFC_SS_DENY                (SQL_DIAG_DFC_SS_BASE-54)
#define SQL_DIAG_DFC_SS_SET_XCTLVL          (SQL_DIAG_DFC_SS_BASE-55)
#define SQL_DIAG_DFC_SS_MERGE               (SQL_DIAG_DFC_SS_BASE-56)

// Severity codes for SQL_DIAG_SS_SEVERITY
#define EX_ANY          0
#define EX_INFO         10
#define EX_MAXISEVERITY EX_INFO
#define EX_MISSING      11
#define EX_TYPE         12
#define EX_DEADLOCK     13
#define EX_PERMIT       14
#define EX_SYNTAX       15
#define EX_USER         16
#define EX_RESOURCE     17
#define EX_INTOK        18
#define MAXUSEVERITY    EX_INTOK
#define EX_LIMIT        19
#define EX_CMDFATAL     20
#define MINFATALERR     EX_CMDFATAL
#define EX_DBFATAL      21
#define EX_TABCORRUPT   22
#define EX_DBCORRUPT    23
#define EX_HARDWARE     24
#define EX_CONTROL      25
// Internal server datatypes - used when binding to SQL_C_BINARY
#ifndef MAXNUMERICLEN   // Resolve ODS/DBLib conflicts
// DB-Library datatypes
#define DBMAXCHAR       (8000+1)                    // Max length of DBVARBINARY and DBVARCHAR, etc. +1 for zero byte
#define MAXNAME         (SQL_MAX_SQLSERVERNAME+1)   // Max server identifier length including zero byte
#ifdef UNICODE
typedef wchar_t  DBCHAR;
#else
typedef char DBCHAR;

#endif
typedef short SQLSMALLINT;

typedef unsigned short SQLUSMALLINT;

typedef unsigned char DBBINARY;

typedef unsigned char DBTINYINT;

typedef short DBSMALLINT;

typedef unsigned short DBUSMALLINT;

typedef double DBFLT8;

typedef unsigned char DBBIT;

typedef unsigned char DBBOOL;

typedef float DBFLT4;

typedef DBFLT4 DBREAL;

typedef UINT DBUBOOL;

typedef struct dbmoney
    {
    LONG mnyhigh;
    ULONG mnylow;
    } 	DBMONEY;

typedef struct dbdatetime
    {
    LONG dtdays;
    ULONG dttime;
    } 	DBDATETIME;

typedef struct dbdatetime4
    {
    USHORT numdays;
    USHORT nummins;
    } 	DBDATETIM4;

typedef LONG DBMONEY4;

#include <pshpack8.h>    // 8-byte structure packing

// New Date Time Structures
// New Structure for TIME2
typedef struct tagSS_TIME2_STRUCT
{
        SQLUSMALLINT   hour;
        SQLUSMALLINT   minute;
        SQLUSMALLINT   second;
        SQLUINTEGER    fraction;
} SQL_SS_TIME2_STRUCT;
// New Structure for TIMESTAMPOFFSET
typedef struct tagSS_TIMESTAMPOFFSET_STRUCT
{
        SQLSMALLINT    year;
        SQLUSMALLINT   month;
        SQLUSMALLINT   day;
        SQLUSMALLINT   hour;
        SQLUSMALLINT   minute;
        SQLUSMALLINT   second;
        SQLUINTEGER    fraction;
        SQLSMALLINT    timezone_hour;
        SQLSMALLINT    timezone_minute;
} SQL_SS_TIMESTAMPOFFSET_STRUCT;
#include <poppack.h>     // restore original structure packing

// Money value *10,000
#define DBNUM_PREC_TYPE BYTE
#define DBNUM_SCALE_TYPE BYTE
#define DBNUM_VAL_TYPE BYTE

#if (ODBCVER < 0x0300)
#define MAXNUMERICLEN 16
typedef struct dbnumeric         // Internal representation of NUMERIC data type
{
    DBNUM_PREC_TYPE precision;   // Precision
    DBNUM_SCALE_TYPE scale;      // Scale
    BYTE sign;                   // Sign (1 if positive, 0 if negative)
    DBNUM_VAL_TYPE val[MAXNUMERICLEN];// Value
} DBNUMERIC;
typedef DBNUMERIC DBDECIMAL;// Internal representation of DECIMAL data type
#else //  Use ODBC 3.0 definitions since same as DBLib
#define MAXNUMERICLEN SQL_MAX_NUMERIC_LEN
typedef SQL_NUMERIC_STRUCT DBNUMERIC;
typedef SQL_NUMERIC_STRUCT DBDECIMAL;
#endif // ODCBVER
#endif // MAXNUMERICLEN

#ifndef INT
typedef int     INT;
typedef long    DBINT;
typedef DBINT * LPDBINT;
#ifndef _LPCBYTE_DEFINED
#define _LPCBYTE_DEFINED
typedef BYTE const* LPCBYTE;
#endif //_LPCBYTE_DEFINED
#endif // INT
/************************************************************************** 
This struct is a global used for gathering statistical data on the driver.
Access to this structure is controlled via the pStatCrit;
***************************************************************************/ 
typedef struct sqlperf
{
    // Application Profile Statistics
    DWORD TimerResolution;
    DWORD SQLidu;
    DWORD SQLiduRows;
    DWORD SQLSelects;
    DWORD SQLSelectRows;
    DWORD Transactions;
    DWORD SQLPrepares;
    DWORD ExecDirects;
    DWORD SQLExecutes;
    DWORD CursorOpens;
    DWORD CursorSize;
    DWORD CursorUsed;
    LDOUBLE PercentCursorUsed;
    LDOUBLE AvgFetchTime;
    LDOUBLE AvgCursorSize;
    LDOUBLE AvgCursorUsed;
    DWORD SQLFetchTime;
    DWORD SQLFetchCount;
    DWORD CurrentStmtCount;
    DWORD MaxOpenStmt;
    DWORD SumOpenStmt;
    // Connection Statistics
    DWORD CurrentConnectionCount;
    DWORD MaxConnectionsOpened;
    DWORD SumConnectionsOpened;
    DWORD SumConnectiontime;
    LDOUBLE AvgTimeOpened;
    // Network Statistics
    DWORD ServerRndTrips;
    DWORD BuffersSent;
    DWORD BuffersRec;
    DWORD BytesSent;
    DWORD BytesRec;
    // Time Statistics;
    DWORD msExecutionTime;
    DWORD msNetWorkServerTime;
} SQLPERF;
// The following are options for SQL_COPT_SS_PERF_DATA and SQL_COPT_SS_PERF_QUERY
#define SQL_PERF_START          1           // Starts the driver sampling performance data.
#define SQL_PERF_STOP           2           // Stops the counters from sampling performance data.
// The following are defines for SQL_COPT_SS_PERF_DATA_LOG
#define SQL_SS_DL_DEFAULT       TEXT("STATS.LOG")
// The following are defines for SQL_COPT_SS_PERF_QUERY_LOG
#define SQL_SS_QL_DEFAULT       TEXT("QUERY.LOG")
// The following are defines for SQL_COPT_SS_PERF_QUERY_INTERVAL
#define SQL_SS_QI_DEFAULT       30000   //  30,000 milliseconds

#ifndef SQLNCLI_NO_BCP
// Define the symbol SQLNCLI_NO_BCP if you are not using BCP in your application
// and you want to exclude the BCP-related definitions in this header file.

// ODBC BCP prototypes and defines
// Return codes
#define SUCCEED                 1
#define FAIL                    0
#define SUCCEED_ABORT           2
#define SUCCEED_ASYNC           3
// Transfer directions
#define DB_IN                   1   // Transfer from client to server
#define DB_OUT                  2   // Transfer from server to client
// bcp_control option
#define BCPMAXERRS              1   // Sets max errors allowed
#define BCPFIRST                2   // Sets first row to be copied out
#define BCPLAST                 3   // Sets number of rows to be copied out
#define BCPBATCH                4   // Sets input batch size
#define BCPKEEPNULLS            5   // Sets to insert NULLs for empty input values
#define BCPABORT                6   // Sets to have bcpexec return SUCCEED_ABORT
#define BCPODBC                 7   // Sets ODBC canonical character output
#define BCPKEEPIDENTITY         8   // Sets IDENTITY_INSERT on
#if SQLNCLI_VER < 1000
#define BCP6xFILEFMT            9   // DEPRECATED: Sets 6x file format on
#endif
#define BCPHINTSA               10  // Sets server BCP hints (ANSI string)
#define BCPHINTSW               11  // Sets server BCP hints (UNICODE string)
#define BCPFILECP               12  // Sets clients code page for the file
#define BCPUNICODEFILE          13  // Sets that the file contains unicode header
#define BCPTEXTFILE             14  // Sets BCP mode to expect a text file and to detect Unicode or ANSI automatically
#define BCPFILEFMT              15  // Sets file format version
#define BCPFMTXML               16  // Sets the format file type to xml
#define BCPFIRSTEX              17  // Starting Row for BCP operation (64 bit)
#define BCPLASTEX               18  // Ending Row for BCP operation (64 bit)
#define BCPROWCOUNT             19  // Total Number of Rows Copied (64 bit)
#define BCPDELAYREADFMT         20  // Delay reading format file unil bcp_exec
// BCPFILECP values
// Any valid code page that is installed on the client can be passed plus:
#define BCPFILECP_ACP           0   // Data in file is in Windows code page
#define BCPFILECP_OEMCP         1   // Data in file is in OEM code page (default)
#define BCPFILECP_RAW           (-1)// Data in file is in Server code page (no conversion)
// bcp_collen definition
#define SQL_VARLEN_DATA (-10)   // Use default length for column
// BCP column format properties
#define BCP_FMT_TYPE            0x01
#define BCP_FMT_INDICATOR_LEN   0x02
#define BCP_FMT_DATA_LEN        0x03
#define BCP_FMT_TERMINATOR      0x04
#define BCP_FMT_SERVER_COL      0x05
#define BCP_FMT_COLLATION       0x06
#define BCP_FMT_COLLATION_ID    0x07
// bcp_setbulkmode properties
#define BCP_OUT_CHARACTER_MODE      0x01
#define BCP_OUT_WIDE_CHARACTER_MODE 0x02
#define BCP_OUT_NATIVE_TEXT_MODE    0x03
#define BCP_OUT_NATIVE_MODE         0x04
// BCP functions
DBINT SQL_API bcp_batch (HDBC);
RETCODE SQL_API bcp_bind (HDBC, LPCBYTE, INT, DBINT, LPCBYTE, INT, INT, INT);
RETCODE SQL_API bcp_colfmt (HDBC, INT, BYTE, INT, DBINT, LPCBYTE, INT, INT);
RETCODE SQL_API bcp_collen (HDBC, DBINT, INT);
RETCODE SQL_API bcp_colptr (HDBC, LPCBYTE, INT);
RETCODE SQL_API bcp_columns (HDBC, INT);
RETCODE SQL_API bcp_control (HDBC, INT, void *);
DBINT SQL_API bcp_done (HDBC);
RETCODE SQL_API bcp_exec (HDBC, LPDBINT);
RETCODE SQL_API bcp_getcolfmt (HDBC, INT, INT, void *, INT, INT *);
RETCODE SQL_API bcp_initA (HDBC, LPCSTR, LPCSTR, LPCSTR, INT);
RETCODE SQL_API bcp_initW (HDBC, LPCWSTR, LPCWSTR, LPCWSTR, INT);
RETCODE SQL_API bcp_moretext (HDBC, DBINT, LPCBYTE);
RETCODE SQL_API bcp_readfmtA (HDBC, LPCSTR);
RETCODE SQL_API bcp_readfmtW (HDBC, LPCWSTR);
RETCODE SQL_API bcp_sendrow (HDBC);
RETCODE SQL_API bcp_setbulkmode (HDBC, INT, __in_bcount(cbField) void*, INT cbField, __in_bcount(cbRow) void *, INT cbRow);
RETCODE SQL_API bcp_setcolfmt (HDBC, INT, INT, void *, INT);
RETCODE SQL_API bcp_writefmtA (HDBC, LPCSTR);
RETCODE SQL_API bcp_writefmtW (HDBC, LPCWSTR);
CHAR* SQL_API dbprtypeA (INT);
WCHAR* SQL_API dbprtypeW (INT);
CHAR* SQL_API bcp_gettypenameA (INT, DBBOOL);
WCHAR* SQL_API bcp_gettypenameW (INT, DBBOOL);
#ifdef UNICODE
#define bcp_init        bcp_initW
#define bcp_readfmt     bcp_readfmtW
#define bcp_writefmt    bcp_writefmtW
#define dbprtype        dbprtypeW
#define bcp_gettypename bcp_gettypenameW
#define BCPHINTS        BCPHINTSW
#else
#define bcp_init        bcp_initA
#define bcp_readfmt     bcp_readfmtA
#define bcp_writefmt    bcp_writefmtA
#define dbprtype        dbprtypeA
#define bcp_gettypename bcp_gettypenameA
#define BCPHINTS        BCPHINTSA
#endif // UNICODE

#endif // SQLNCLI_NO_BCP

// The following options have been deprecated
#define SQL_FAST_CONNECT                (SQL_COPT_SS_BASE+0)
// Defines for use with SQL_FAST_CONNECT - only useable before connecting
#define SQL_FC_OFF                      0L          //  Fast connect is off
#define SQL_FC_ON                       1L          //  Fast connect is on
#define SQL_FC_DEFAULT                  SQL_FC_OFF
#define SQL_COPT_SS_ANSI_OEM            (SQL_COPT_SS_BASE+6)
#define SQL_AO_OFF                      0L
#define SQL_AO_ON                       1L
#define SQL_AO_DEFAULT                  SQL_AO_OFF
#define SQL_CA_SS_BASE_COLUMN_NAME      SQL_DESC_BASE_COLUMN_NAME

#endif // ODBCVER
#endif // defined(_SQLNCLI_ODBC_) || !defined(_SQLNCLI_OLEDB_)
// ODBC part of SQL Server Native Client header - end here!

//The following facilitates opening a handle to a SQL filestream
typedef enum _SQL_FILESTREAM_DESIRED_ACCESS {
            SQL_FILESTREAM_READ        = 0,
            SQL_FILESTREAM_WRITE       = 1,
            SQL_FILESTREAM_READWRITE   = 2
} SQL_FILESTREAM_DESIRED_ACCESS;
#define SQL_FILESTREAM_OPEN_FLAG_ASYNC               0x00000001L
#define SQL_FILESTREAM_OPEN_FLAG_NO_BUFFERING        0x00000002L
#define SQL_FILESTREAM_OPEN_FLAG_NO_WRITE_THROUGH    0x00000004L
#define SQL_FILESTREAM_OPEN_FLAG_SEQUENTIAL_SCAN     0x00000008L
#define SQL_FILESTREAM_OPEN_FLAG_RANDOM_ACCESS       0x00000010L
HANDLE __stdcall OpenSqlFilestream (
           LPCWSTR                        FilestreamPath,
           SQL_FILESTREAM_DESIRED_ACCESS  DesiredAccess,
           ULONG                          OpenOptions,
           LPBYTE                         FilestreamTransactionContext,
           SSIZE_T                        FilestreamTransactionContextLength,
           PLARGE_INTEGER                 AllocationSize);
#define FSCTL_SQL_FILESTREAM_FETCH_OLD_CONTENT       CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 2392, METHOD_BUFFERED, FILE_ANY_ACCESS)



#ifndef _SQLUSERINSTANCE_H_
#define _SQLUSERINSTANCE_H_

#include <windows.h>

#ifdef __cplusplus
extern "C" {
#endif


//  Recommended buffer size to store a LocalDB connection string 
#define LOCALDB_MAX_SQLCONNECTION_BUFFER_SIZE 260

// type definition for LocalDBCreateInstance function
typedef HRESULT __cdecl FnLocalDBCreateInstance (
		// I			the LocalDB version (e.g. 11.0 or 11.0.1094.2)
		__in_z			PCWSTR	wszVersion,
		// I			the instance name
		__in_z			PCWSTR	pInstanceName,
		// I			reserved for the future use. Currently should be set to 0.
		__in			DWORD	dwFlags
);

// type definition for pointer to LocalDBCreateInstance function
typedef FnLocalDBCreateInstance* PFnLocalDBCreateInstance;

// type definition for LocalDBStartInstance function
typedef HRESULT __cdecl FnLocalDBStartInstance (
		// I			the LocalDB instance name
		__in_z									PCWSTR	pInstanceName,
		// I			reserved for the future use. Currently should be set to 0.
		__in									DWORD	dwFlags,
		// O			the buffer to store the connection string to the LocalDB instance
		__out_ecount_z_opt(*lpcchSqlConnection)	LPWSTR	wszSqlConnection,
		// I/O			on input has the size of the wszSqlConnection buffer in characters. On output, if the given buffer size is 
		//				too small, has the buffer size required, in characters, including trailing null.
		__inout_opt								LPDWORD	lpcchSqlConnection
);

// type definition for pointer to LocalDBStartInstance function
typedef FnLocalDBStartInstance* PFnLocalDBStartInstance;

// Flags for the LocalDBFormatMessage function
#define LOCALDB_TRUNCATE_ERR_MESSAGE		0x0001L

// type definition for LocalDBFormatMessage function
typedef HRESULT __cdecl FnLocalDBFormatMessage(
			// I		the LocalDB error code
			__in							HRESULT	hrLocalDB,
			// I		Available flags:
			//			LOCALDB_TRUNCATE_ERR_MESSAGE - if the input buffer is too short,
			//			the error message will be truncated to fit into the buffer 
			__in							DWORD	dwFlags,
			// I		Language desired (LCID) or 0 (in which case Win32 FormatMessage order is used)
			__in							DWORD	dwLanguageId,
			// O		the buffer to store the LocalDB error message
			__out_ecount_z(*lpcchMessage)	LPWSTR	wszMessage,
			// I/O		on input has the size of the wszMessage buffer in characters. On output, if the given buffer size is 
			//			too small, has the buffer size required, in characters, including trailing null. If the function succeeds
			//			contains the number of characters in the message, excluding the trailing null
			__inout							LPDWORD	lpcchMessage
);

// type definition for function pointer to LocalDBFormatMessage function
typedef FnLocalDBFormatMessage* PFnLocalDBFormatMessage;


// MessageId: LOCALDB_ERROR_NOT_INSTALLED
//
// MessageText:
//
// LocalDB is not installed.
//
#define LOCALDB_ERROR_NOT_INSTALLED            ((HRESULT)0x89C50116L)

//---------------------------------------------------------------------
// Function: LocalDBCreateInstance
//
// Description: This function will create the new LocalDB instance.
// 
// Available Flags:
//	No flags available. Reserved for future use.
//
// Return Values:
//	S_OK, if the function succeeds
//	LOCALDB_ERROR_INVALID_PARAM_INSTANCE_NAME, if the instance name parameter is invalid
//	LOCALDB_ERROR_INVALID_PARAM_VERSION, if the version parameter is invalid
//	LOCALDB_ERROR_INVALID_PARAM_FLAGS, if the flags are invalid
//	LOCALDB_ERROR_INVALID_OPERATION, if the user tries to create a default instance
//	LOCALDB_ERROR_INSTANCE_FOLDER_PATH_TOO_LONG, if the path where instance should be stored is longer than MAX_PATH
//	LOCALDB_ERROR_VERSION_REQUESTED_NOT_INSTALLED, if the specified patch level is not installed
//	LOCALDB_ERROR_INSTANCE_FOLDER_ALREADY_EXISTS, if the instance folder already exists and is not empty
//	LOCALDB_ERROR_INSTANCE_EXISTS_WITH_LOWER_VERSION,	if the specified instance already exists but with lower version
//	LOCALDB_ERROR_CANNOT_CREATE_INSTANCE_FOLDER, if a folder cannot be created under %userprofile%
//	LOCALDB_ERROR_CANNOT_GET_USER_PROFILE_FOLDER, if a user profile folder cannot be retrieved
//	LOCALDB_ERROR_CANNOT_ACCESS_INSTANCE_FOLDER, if a instance folder cannot be accessed
//	LOCALDB_ERROR_CANNOT_ACCESS_INSTANCE_REGISTRY, if a instance registry cannot be accessed
//	LOCALDB_ERROR_INTERNAL_ERROR, if an unexpected error occurred. See event log for details
//	LOCALDB_ERROR_CANNOT_MODIFY_INSTANCE_REGISTRY, if an instance registry cannot be modified
//	LOCALDB_ERROR_CANNOT_CREATE_SQL_PROCESS, if a process for Sql Server cannot be created
//	LOCALDB_ERROR_SQL_SERVER_STARTUP_FAILED, if a Sql Server process is started but Sql Server startup failed.
//	LOCALDB_ERROR_INSTANCE_CONFIGURATION_CORRUPT, if a instance configuration is corrupted
//
FnLocalDBCreateInstance LocalDBCreateInstance;

//---------------------------------------------------------------------
// Function: LocalDBStartInstance
// 
// Description: This function will start the given LocalDB instance.
//
// Return Values:
//	S_OK, if the function succeeds
//	LOCALDB_ERROR_UNKNOWN_INSTANCE, if the specified instance doesn't exist
//	LOCALDB_ERROR_INVALID_PARAM_INSTANCE_NAME, if the instance name parameter is invalid
//	LOCALDB_ERROR_INVALID_PARAM_CONNECTION, if the wszSqlConnection parameter is NULL
//	LOCALDB_ERROR_INVALID_PARAM_FLAGS, if the flags are invalid
//	LOCALDB_ERROR_INSUFFICIENT_BUFFER, if the buffer wszSqlConnection is too small
//	LOCALDB_ERROR_INSTANCE_FOLDER_PATH_TOO_LONG, if the path where instance should be stored is longer than MAX_PATH

//	LOCALDB_ERROR_CANNOT_GET_USER_PROFILE_FOLDER, if a user profile folder cannot be retrieved
//	LOCALDB_ERROR_CANNOT_ACCESS_INSTANCE_FOLDER, if a instance folder cannot be accessed
//	LOCALDB_ERROR_CANNOT_ACCESS_INSTANCE_REGISTRY, if a instance registry cannot be accessed
//	LOCALDB_ERROR_INTERNAL_ERROR, if an unexpected error occurred. See event log for details
//	LOCALDB_ERROR_CANNOT_MODIFY_INSTANCE_REGISTRY, if an instance registry cannot be modified
//	LOCALDB_ERROR_CANNOT_CREATE_SQL_PROCESS, if a process for Sql Server cannot be created
//	LOCALDB_ERROR_SQL_SERVER_STARTUP_FAILED, if a Sql Server process is started but Sql Server startup failed.
//	LOCALDB_ERROR_INSTANCE_CONFIGURATION_CORRUPT, if a instance configuration is corrupted
//
FnLocalDBStartInstance LocalDBStartInstance;

// type definition for LocalDBStopInstance function
typedef HRESULT __cdecl FnLocalDBStopInstance (
		// I			the LocalDB instance name
		__in_z			PCWSTR	pInstanceName,
		// I			Available flags:
		//				LOCALDB_SHUTDOWN_KILL_PROCESS	- force the instance to stop immediately
		//				LOCALDB_SHUTDOWN_WITH_NOWAIT	- shutdown the instance with NOWAIT option
		__in			DWORD	dwFlags,
		// I			the time in seconds to wait this operation to complete. If this value is 0, this function will return immediately
		//				without waiting for LocalDB instance to stop
		__in			ULONG	ulTimeout
);

// type definition for pointer to LocalDBStopInstance function
typedef FnLocalDBStopInstance* PFnLocalDBStopInstance;

// Flags for the StopLocalDBInstance function
#define LOCALDB_SHUTDOWN_KILL_PROCESS		0x0001L
#define LOCALDB_SHUTDOWN_WITH_NOWAIT		0x0002L

//---------------------------------------------------------------------
// Function: LocalDBStopInstance
//
// Description: This function will shutdown the given LocalDB instance. 
// If the flag LOCALDB_SHUTDOWN_KILL_PROCESS is set, the LocalDB instance will be killed immediately.
// IF the flag LOCALDB_SHUTDOWN_WITH_NOWAIT is set, the LocalDB instance will shutdown with NOWAIT option.
//
// Return Values:
//	S_OK, if the function succeeds
//	LOCALDB_ERROR_UNKNOWN_INSTANCE, if the specified instance doesn't exist
//	LOCALDB_ERROR_INVALID_PARAM_INSTANCE_NAME, if the instance name parameter is invalid
//	LOCALDB_ERROR_INVALID_PARAM_FLAGS, if the flags are invalid
//	LOCALDB_ERROR_WAIT_TIMEOUT - if this function has not finished in given time
//	LOCALDB_ERROR_INTERNAL_ERROR, if an unexpected error occurred. See event log for details
//
FnLocalDBStopInstance LocalDBStopInstance;

// type definition for LocalDBDeleteInstance function
typedef HRESULT __cdecl FnLocalDBDeleteInstance (
		// I			the LocalDB instance name
		__in_z			PCWSTR	pInstanceName,
		// I			reserved for the future use. Currently should be set to 0.
		__in			DWORD	dwFlags
);

// type definition for pointer to LocalDBDeleteInstance function
typedef FnLocalDBDeleteInstance* PFnLocalDBDeleteInstance;

//---------------------------------------------------------------------
// Function: LocalDBDeleteInstance
//
// Description: This function will remove the given LocalDB instance. If the given instance is running this function will
// fail with the error code LOCALDB_ERROR_INSTANCE_BUSY.
//
// Return Values:
//	S_OK, if the function succeeds
//	LOCALDB_ERROR_INVALID_PARAM_INSTANCE_NAME, if the instance name parameter is invalid
//	LOCALDB_ERROR_INVALID_PARAM_FLAGS, if the flags are invalid
//	LOCALDB_ERROR_UNKNOWN_INSTANCE, if the specified instance doesn't exist
//	LOCALDB_ERROR_INSTANCE_BUSY, if the given instance is running
//	LOCALDB_ERROR_INTERNAL_ERROR, if an unexpected error occurred. See event log for details
//
FnLocalDBDeleteInstance LocalDBDeleteInstance;

// Function: LocalDBFormatMessage
//
// Description: This function will return the localized textual description for the given LocalDB error
//
// Available Flags:
//	LOCALDB_TRUNCATE_ERR_MESSAGE - the error message should be truncated to fit into the provided buffer
//
// Return Value:
//	S_OK, if the function succeeds
//
//	LOCALDB_ERROR_UNKNOWN_HRESULT,		if the given HRESULT is unknown
//	LOCALDB_ERROR_UNKNOWN_LANGUAGE_ID,	if the given language id is unknown (0 is recommended for the //	default language)
//	LOCALDB_ERROR_UNKNOWN_ERROR_CODE,	if the LocalDB error code is unknown
//	LOCALDB_ERROR_INVALID_PARAM_FLAGS,	if the flags are invalid
//	LOCALDB_ERROR_INSUFFICIENT_BUFFER,	if the input buffer is too short and LOCALDB_TRUNCATE_ERR_MESSAGE flag 
//										is not set
//	LOCALDB_ERROR_INTERNAL_ERROR,		if an unexpected error occurred. See event log for details
//
FnLocalDBFormatMessage LocalDBFormatMessage;

#define MAX_LOCALDB_INSTANCE_NAME_LENGTH 128
#define MAX_LOCALDB_PARENT_INSTANCE_LENGTH MAX_INSTANCE_NAME

typedef WCHAR TLocalDBInstanceName[MAX_LOCALDB_INSTANCE_NAME_LENGTH + 1];
typedef TLocalDBInstanceName* PTLocalDBInstanceName;

// type definition for LocalDBGetInstances function
typedef HRESULT __cdecl FnLocalDBGetInstances(
		// O					buffer for a LocalDB instance names
		__out					PTLocalDBInstanceName	pInstanceNames,
		// I/O					on input has the number slots for instance names in the pInstanceNames buffer. On output, 
		//						has the number of existing LocalDB instances
		__inout					LPDWORD					lpdwNumberOfInstances
);

// type definition for pointer to LocalDBGetInstances function
typedef FnLocalDBGetInstances* PFnLocalDBGetInstances;

// Function: LocalDBGetInstances
// 
// Description: This function returns names for all existing Local DB instances
//
// Usage Example:
//	DWORD dwN = 0;
//	LocalDBGetInstances(NULL, &dwN);

//	PTLocalDBInstanceName insts = (PTLocalDBInstanceName) malloc(dwN * sizeof(TLocalDBInstanceName));
//	LocalDBGetInstances(insts, &dwN);

//	for (int i = 0; i < dwN; i++)
//		wprintf(L"%s\n", insts[i]);
//
// Return values:
//	S_OK, if the function succeeds
//
// LOCALDB_ERROR_INSUFFICIENT_BUFFER,			the given buffer is to small
// LOCALDB_ERROR_INTERNAL_ERROR,		if an unexpected error occurred. See event log for details
//
FnLocalDBGetInstances LocalDBGetInstances;

// SID string format: S - Revision(1B) - Authority ID (6B) {- Sub authority ID (4B)} * max 15 sub-authorities = 1 + 1 + 3 + 1 + 15 + (1 + 10) * 15
#define MAX_STRING_SID_LENGTH 186

#pragma pack(push)
#pragma pack(8)

// DEVNOTE: If you want to modify this structure please read DEVNOTEs on top of function LocalDBGetInstanceInfo in sqluserinstance.cpp file.
//
typedef struct _LocalDBInstanceInfo
{
	DWORD					cbLocalDBInstanceInfoSize;
	TLocalDBInstanceName	wszInstanceName;
	BOOL					bExists;
	BOOL					bConfigurationCorrupted;
	BOOL					bIsRunning;
	DWORD					dwMajor;
	DWORD					dwMinor;
	DWORD					dwBuild;
	DWORD					dwRevision;
	FILETIME				ftLastStartDateUTC;
	WCHAR					wszConnection[LOCALDB_MAX_SQLCONNECTION_BUFFER_SIZE];
	BOOL					bIsShared;
	TLocalDBInstanceName	wszSharedInstanceName;
	WCHAR					wszOwnerSID[MAX_STRING_SID_LENGTH + 1];
	BOOL					bIsAutomatic;
} LocalDBInstanceInfo;

#pragma pack(pop)

typedef LocalDBInstanceInfo* PLocalDBInstanceInfo;

// type definition for LocalDBGetInstanceInfo function
typedef HRESULT __cdecl FnLocalDBGetInstanceInfo(
		// I		the LocalDB instance name
		__in_z		PCWSTR					wszInstanceName, 
		// O		instance information
		__out		PLocalDBInstanceInfo	pInfo,
		// I		Size of LocalDBInstanceInfo structure in bytes
		__in		DWORD					cbInfo);

// type definition for pointer to LocalDBGetInstances function
typedef FnLocalDBGetInstanceInfo* PFnLocalDBGetInstanceInfo;

// Function: LocalDBGetInstanceInfo
//
// Description: This function returns information about the given instance.
//
// Return values:
//	S_OK, if the function succeeds
//
// ERROR_INVALID_PARAMETER, if some of the parameters is invalid
// LOCALDB_ERROR_INTERNAL_ERROR,		if an unexpected error occurred. See event log for details
// 
FnLocalDBGetInstanceInfo LocalDBGetInstanceInfo;

// Version has format: Major.Minor[.Build[.Revision]]. Each of components is 32bit integer which is at most 40 digits and 3 dots
//
#define MAX_LOCALDB_VERSION_LENGTH 43

typedef WCHAR TLocalDBVersion[MAX_LOCALDB_VERSION_LENGTH + 1];
typedef TLocalDBVersion* PTLocalDBVersion;

// type definition for LocalDBGetVersions function
typedef HRESULT __cdecl FnLocalDBGetVersions(
		// O					buffer for installed LocalDB versions
		__out					PTLocalDBVersion	pVersions,
		// I/O					on input has the number slots for versions in the pVersions buffer. On output, 
		//						has the number of existing LocalDB versions
		__inout					LPDWORD				lpdwNumberOfVersions
);

// type definition for pointer to LocalDBGetVersions function
typedef FnLocalDBGetVersions* PFnLocalDBGetVersions;

// Function: LocalDBGetVersions
// 
// Description: This function returns all installed LocalDB versions. Returned versions will be in format Major.Minor
//
// Usage Example:
//	DWORD dwN = 0;
//	LocalDBGetVersions(NULL, &dwN);

//	PTLocalDBVersion versions = (PTLocalDBVersion) malloc(dwN * sizeof(TLocalDBVersion));
//	LocalDBGetVersions(insts, &dwN);

//	for (int i = 0; i < dwN; i++)
//		wprintf(L"%s\n", insts[i]);
//
// Return values:
//	S_OK, if the function succeeds
//
// LOCALDB_ERROR_INSUFFICIENT_BUFFER,			the given buffer is to small
// LOCALDB_ERROR_INTERNAL_ERROR,				if an unexpected error occurs.
//
FnLocalDBGetVersions LocalDBGetVersions;

#pragma pack(push)
#pragma pack(8)

// DEVNOTE: If you want to modify this structure please read DEVNOTEs on top of function LocalDBGetVersionInfo in sqluserinstance.cpp file.
//
typedef struct _LocalDBVersionInfo
{
	DWORD				cbLocalDBVersionInfoSize;
	TLocalDBVersion		wszVersion;
	BOOL				bExists;
	DWORD				dwMajor;
	DWORD				dwMinor;
	DWORD				dwBuild;
	DWORD				dwRevision;
} LocalDBVersionInfo;

#pragma pack(pop)

typedef LocalDBVersionInfo* PLocalDBVersionInfo;

// type definition for LocalDBGetVersionInfo function
typedef HRESULT __cdecl FnLocalDBGetVersionInfo(
		// I			LocalDB version string
		__in_z			PCWSTR					wszVersion,
		// O			version information
		__out			PLocalDBVersionInfo		pVersionInfo,
		// I			Size of LocalDBVersionInfo structure in bytes
		__in			DWORD					cbVersionInfo
);

// type definition for pointer to LocalDBGetVersionInfo function
typedef FnLocalDBGetVersionInfo* PFnLocalDBGetVersionInfo;

// Function: LocalDBGetVersionInfo
// 
// Description: This function returns information about the given LocalDB version
//
// Return values:
//	S_OK, if the function succeeds
//	LOCALDB_ERROR_INTERNAL_ERROR, if some internal error occurred
//	LOCALDB_ERROR_INVALID_PARAMETER, if a input parameter is invalid
//
FnLocalDBGetVersionInfo LocalDBGetVersionInfo;

typedef HRESULT __cdecl FnLocalDBStartTracing();
typedef FnLocalDBStartTracing* PFnLocalDBStartTracing;

// Function: LocalDBStartTracing
//
// Description: This function will write in registry that Tracing sessions should be started for the current user.
//
// Return values:
//	S_OK - on success
//	Propper HRESULT in case of failure
//
FnLocalDBStartTracing LocalDBStartTracing;

typedef HRESULT __cdecl FnLocalDBStopTracing();
typedef FnLocalDBStopTracing* PFnFnLocalDBStopTracing;

// Function: LocalDBStopTracing
//
// Description: This function will write in registry that Tracing sessions should be stopped for the current user.
//
// Return values:
//	S_OK - on success
//	Propper HRESULT in case of failure
//
FnLocalDBStopTracing LocalDBStopTracing;

// type definition for LocalDBShareInstance function
typedef HRESULT __cdecl FnLocalDBShareInstance(
		// I		the SID of the LocalDB instance owner
		__in_opt	PSID 					pOwnerSID, 
		// I		the private name of LocalDB instance which should be shared
		__in_z		PCWSTR					wszPrivateLocalDBInstanceName,
		// I		the public shared name
		__in_z		PCWSTR					wszSharedName,
		// I		reserved for the future use. Currently should be set to 0.
		__in		DWORD	dwFlags);

// type definition for pointer to LocalDBShareInstance function
typedef FnLocalDBShareInstance* PFnLocalDBShareInstance;

// Function: LocalDBShareInstance
//
// Description: This function will share the given private instance of the given user with the given shared name.
// This function has to be executed elevated.
//
// Return values:
//	HRESULT
//
FnLocalDBShareInstance LocalDBShareInstance;

// type definition for LocalDBUnshareInstance function
typedef HRESULT __cdecl FnLocalDBUnshareInstance(
		// I		the LocalDB instance name
		__in_z		PCWSTR					pInstanceName,
		// I		reserved for the future use. Currently should be set to 0.
		__in		DWORD	dwFlags);

// type definition for pointer to LocalDBUnshareInstance function
typedef FnLocalDBUnshareInstance* PFnLocalDBUnshareInstance;

// Function: LocalDBUnshareInstance
//
// Description: This function unshares the given LocalDB instance.
// If a shared name is given then that shared instance will be unshared.
// If a private name is given then we will check if the caller
// shares a private instance with the given private name and unshare it.
//
// Return values:
//	HRESULT
//
FnLocalDBUnshareInstance LocalDBUnshareInstance;

#ifdef __cplusplus
} // extern "C"
#endif

#if defined(LOCALDB_DEFINE_PROXY_FUNCTIONS)
//---------------------------------------------------------------------
// The following section is enabled only if the constant LOCALDB_DEFINE_PROXY_FUNCTIONS
// is defined. It provides an implementation of proxies for each of the LocalDB APIs.
// The proxy implementations use a common function to bind to entry points in the
// latest installed SqlUserInstance DLL, and then forward the requests.
//
// The current implementation loads the SqlUserInstance DLL on the first call into
// a proxy function. There is no provision for unloading the DLL. Note that if the
// process includes multiple binaries (EXE and one or more DLLs), each of them could
// load a separate instance of the SqlUserInstance DLL.
//
// For future consideration: allow the SqlUserInstance DLL to be unloaded dynamically.
//
// WARNING: these functions must not be called in DLL initialization, since a deadlock
// could result loading dependent DLLs.
//---------------------------------------------------------------------

// This macro provides the body for each proxy function.
//
#define LOCALDB_PROXY(LocalDBFn) static Fn##LocalDBFn* pfn##LocalDBFn = NULL; if (!pfn##LocalDBFn) {HRESULT hr = LocalDBGetPFn(#LocalDBFn, (FARPROC *)&pfn##LocalDBFn); if (FAILED(hr)) return hr;} return (*pfn##LocalDBFn)

// Structure and function to parse the "Installed Versions" registry subkeys
//
typedef struct {
    DWORD dwComponent[2];
    WCHAR wszKeyName[256];
} Version;

// The following algorithm is intended to match, in part, the .NET Version class.
// A maximum of two components are allowed, which must be separated with a period.
// Valid: "11", "11.0"
// Invalid: "", ".0", "11.", "11.0."
//
static BOOL ParseVersion(Version * pVersion)
{
    pVersion->dwComponent[0] = 0;
    pVersion->dwComponent[1] = 0;
    WCHAR * pwch = pVersion->wszKeyName;

    for (int i = 0; i<2; i++)
    {
        LONGLONG llVal = 0;
        BOOL fHaveDigit = FALSE;

        while (*pwch >= L'0' && *pwch <= L'9')
        {
            llVal = llVal * 10 + (*pwch++ - L'0');
            fHaveDigit = TRUE;

            if (llVal > 0x7fffffff)
            {
                return FALSE;
            }
        }

        if (!fHaveDigit)
            return FALSE;

        pVersion->dwComponent[i] = (DWORD) llVal;

        if (*pwch == L'\0')
            return TRUE;

        if (*pwch != L'.')
            return FALSE;

        pwch++;
    }
    // If we get here, the version string was terminated with L'.', which is not valid
    //
    return FALSE;
}

#include <assert.h>

// This function loads the correct LocalDB API DLL (if required) and returns a pointer to a procedure.
// Note that the first-loaded API DLL for the process will be used until process termination: installation of
//  a new version of the API will not be recognized after first load.
//
static HRESULT LocalDBGetPFn(LPCSTR szLocalDBFn, FARPROC *pfnLocalDBFn)
{
    static volatile HMODULE hLocalDBDll = NULL;

    if (!hLocalDBDll)
    {
        LONG    ec;
        HKEY    hkeyVersions = NULL;
        HKEY    hkeyVersion = NULL;
        Version verHigh = {0};
        Version verCurrent;
        DWORD   cchKeyName;
        DWORD   dwValueType;
        WCHAR   wszLocalDBDll[MAX_PATH+1];
        DWORD   cbLocalDBDll = sizeof(wszLocalDBDll) - sizeof(WCHAR); // to deal with RegQueryValueEx null-termination quirk
        HMODULE hLocalDBDllTemp = NULL;

        if (ERROR_SUCCESS != (ec = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Microsoft SQL Server Local DB\\Installed Versions", 0, KEY_READ, &hkeyVersions)))
        {
            goto Cleanup;
        }

        for (int i = 0; ; i++)
        {
            cchKeyName = 256;
            if (ERROR_SUCCESS != (ec = RegEnumKeyExW(hkeyVersions, i, verCurrent.wszKeyName, &cchKeyName, 0, NULL, NULL, NULL)))
            {
                if (ERROR_NO_MORE_ITEMS == ec)
                {
                    break;
                }
                goto Cleanup;
            }

            if (!ParseVersion(&verCurrent))
            {
                continue; // invalid version syntax
            }

            if (verCurrent.dwComponent[0] > verHigh.dwComponent[0] ||
                (verCurrent.dwComponent[0] == verHigh.dwComponent[0] && verCurrent.dwComponent[1] > verHigh.dwComponent[1]))
            {
                verHigh = verCurrent;
            }
        }
        if (!verHigh.wszKeyName[0])
        {
            // ec must be ERROR_NO_MORE_ITEMS here
            //
            assert(ec == ERROR_NO_MORE_ITEMS);

            // We will change the error code to ERROR_FILE_NOT_FOUND in order to indicate that
            // LocalDB instalation is not found. Registry key "SOFTWARE\\Microsoft\\Microsoft SQL Server Local DB\\Installed Versions" exists
            // but it is empty.
            //
            ec = ERROR_FILE_NOT_FOUND;
            goto Cleanup;
        }

        if (ERROR_SUCCESS != (ec = RegOpenKeyExW(hkeyVersions, verHigh.wszKeyName, 0, KEY_READ, &hkeyVersion)))
        {
            goto Cleanup;
        }
        if (ERROR_SUCCESS != (ec = RegQueryValueExW(hkeyVersion, L"InstanceAPIPath", NULL, &dwValueType, (PBYTE) wszLocalDBDll, &cbLocalDBDll)))
        {
            goto Cleanup;
        }
        if (dwValueType != REG_SZ)
        {
            ec = ERROR_INVALID_DATA;
            goto Cleanup;
        }
        // Ensure string value null-terminated
        // Note that we left a spare character in the output buffer for RegQueryValueEx for this purpose
        //
        wszLocalDBDll[cbLocalDBDll/sizeof(WCHAR)] = L'\0';

        hLocalDBDllTemp = LoadLibraryW(wszLocalDBDll);
        if (NULL == hLocalDBDllTemp)
        {
            ec = GetLastError();
            goto Cleanup;
        }
        if (NULL == InterlockedCompareExchangePointer((volatile PVOID *)&hLocalDBDll, hLocalDBDllTemp, NULL))
        {
            // We were the winner: we gave away our DLL handle
            //
            hLocalDBDllTemp = NULL;
        }
        ec = ERROR_SUCCESS;
Cleanup:
        if (hLocalDBDllTemp)
            FreeLibrary(hLocalDBDllTemp);
        if (hkeyVersion)
            RegCloseKey(hkeyVersion);
        if (hkeyVersions)
            RegCloseKey(hkeyVersions);

        // Error code ERROR_FILE_NOT_FOUND can occure if registry hive with installed LocalDB versions is missing.
        // In that case we should return the LocalDB specific error code
        //
        if (ec == ERROR_FILE_NOT_FOUND)
            return LOCALDB_ERROR_NOT_INSTALLED;

        if (ec != ERROR_SUCCESS)
            return HRESULT_FROM_WIN32(ec);
    }

    FARPROC pfn = GetProcAddress(hLocalDBDll, szLocalDBFn);

    if (!pfn)
    {
       return HRESULT_FROM_WIN32(GetLastError());
    }
    *pfnLocalDBFn = pfn;
    return S_OK;
}

// The following proxy functions forward calls to the latest LocalDB API DLL.
//

HRESULT __cdecl
LocalDBCreateInstance (
		// I			the LocalDB version (e.g. 11.0 or 11.0.1094.2)
		__in_z			PCWSTR	wszVersion,
		// I			the instance name
		__in_z			PCWSTR	pInstanceName,
		// I			reserved for the future use. Currently should be set to 0.
		__in			DWORD	dwFlags
)
{
	LOCALDB_PROXY(LocalDBCreateInstance)(wszVersion, pInstanceName, dwFlags);
}

HRESULT __cdecl
LocalDBStartInstance(
		// I			the instance name
		__in_z										PCWSTR	pInstanceName,
		// I			reserved for the future use. Currently should be set to 0.
		__in										DWORD	dwFlags,
		// O			the buffer to store the connection string to the LocalDB instance
		__out_ecount_z_opt(*lpcchSqlConnection)		LPWSTR	wszSqlConnection,
		// I/O			on input has the size of the wszSqlConnection buffer in characters. On output, if the given buffer size is 
		//				too small, has the buffer size required, in characters, including trailing null.
		__inout_opt									LPDWORD	lpcchSqlConnection
)
{
	LOCALDB_PROXY(LocalDBStartInstance)(pInstanceName, dwFlags, wszSqlConnection, lpcchSqlConnection);
}

HRESULT __cdecl
LocalDBStopInstance (
		// I			the instance name
		__in_z			PCWSTR	pInstanceName,
		// I			Available flags:
		//				LOCALDB_SHUTDOWN_KILL_PROCESS		- force the instance to stop immediately
		//				LOCALDB_SHUTDOWN_WITH_NOWAIT	- shutdown the instance with NOWAIT option
		__in			DWORD	dwFlags,
		// I			the time in seconds to wait this operation to complete. If this value is 0, this function will return immediately
		//				without waiting for LocalDB instance to stop
		__in			ULONG	ulTimeout
)
{
	LOCALDB_PROXY(LocalDBStopInstance)(pInstanceName, dwFlags, ulTimeout);
}

HRESULT __cdecl
LocalDBDeleteInstance (
		// I			the instance name
		__in_z			PCWSTR	pInstanceName,
		//				reserved for the future use. Currently should be set to 0.
		__in			DWORD	dwFlags
)
{
	LOCALDB_PROXY(LocalDBDeleteInstance)(pInstanceName, dwFlags);
}

HRESULT __cdecl
LocalDBFormatMessage(
			// I		the LocalDB error code
			__in								HRESULT	hrLocalDB,
			// I		Available flags:
			//			LOCALDB_TRUNCATE_ERR_MESSAGE - if the input buffer is too short,
			//			the error message will be truncated to fit into the buffer 
			__in								DWORD	dwFlags,
			// I		Language desired (LCID) or 0 (in which case Win32 FormatMessage order is used)
			__in								DWORD	dwLanguageId,
			// O		the buffer to store the LocalDB error message
			__out_ecount_z(*lpcchMessage)		LPWSTR	wszMessage,
			// I/O		on input has the size of the wszMessage buffer in characters. On output, if the given buffer size is 
			//			too small, has the buffer size required, in characters, including trailing null. If the function succeeds
			//			contains the number of characters in the message, excluding the trailing null
			__inout								LPDWORD	lpcchMessage
)
{
	LOCALDB_PROXY(LocalDBFormatMessage)(hrLocalDB, dwFlags, dwLanguageId, wszMessage, lpcchMessage);
}

HRESULT __cdecl
LocalDBGetInstances(
		// O					buffer with instance names
		__out					PTLocalDBInstanceName	pInstanceNames,
		// I/O					on input has the number slots for instance names in the pInstanceNames buffer. On output, 
		//						has the number of existing LocalDB instances
		__inout					LPDWORD					lpdwNumberOfInstances
)
{
	LOCALDB_PROXY(LocalDBGetInstances)(pInstanceNames, lpdwNumberOfInstances);
}

HRESULT __cdecl
LocalDBGetInstanceInfo(
		// I		the instance name
		__in_z		PCWSTR					wszInstanceName, 
		// O		instance information
		__out		PLocalDBInstanceInfo	pInfo,
		// I		Size of LocalDBInstanceInfo structure in bytes
		__in		DWORD					cbInfo
)
{
	LOCALDB_PROXY(LocalDBGetInstanceInfo)(wszInstanceName, pInfo, cbInfo);
}

HRESULT __cdecl
LocalDBStartTracing()
{
	LOCALDB_PROXY(LocalDBStartTracing)();
}

HRESULT __cdecl
LocalDBStopTracing()
{
	LOCALDB_PROXY(LocalDBStopTracing)();
}

HRESULT __cdecl 
LocalDBShareInstance(
		// I		the SID of the LocalDB instance owner
		__in_opt	PSID 					pOwnerSID, 
		// I		the private name of LocalDB instance which should be shared
		__in_z		PCWSTR					wszLocalDBInstancePrivateName,
		// I		the public shared name
		__in_z		PCWSTR					wszSharedName,
		// I		reserved for the future use. Currently should be set to 0.
		__in		DWORD	dwFlags)
{
	LOCALDB_PROXY(LocalDBShareInstance)(pOwnerSID, wszLocalDBInstancePrivateName, wszSharedName, dwFlags);
}

HRESULT __cdecl
LocalDBGetVersions(
		// O					buffer for installed LocalDB versions
		__out					PTLocalDBVersion	pVersions,
		// I/O					on input has the number slots for versions in the pVersions buffer. On output, 
		//						has the number of existing LocalDB versions
		__inout					LPDWORD				lpdwNumberOfVersions
)
{
	LOCALDB_PROXY(LocalDBGetVersions)(pVersions, lpdwNumberOfVersions);
}

HRESULT __cdecl
LocalDBUnshareInstance(
		// I		the LocalDB instance name
		__in_z		PCWSTR					pInstanceName,
		// I		reserved for the future use. Currently should be set to 0.
		__in		DWORD	dwFlags)
{
	LOCALDB_PROXY(LocalDBUnshareInstance)(pInstanceName, dwFlags);
}

HRESULT __cdecl 
LocalDBGetVersionInfo(
		// I			LocalDB version string
		__in_z			PCWSTR						wszVersion,
		// O			version information
		__out			PLocalDBVersionInfo			pVersionInfo,
		// I			Size of LocalDBVersionInfo structure in bytes
		__in			DWORD						cbVersionInfo)
{
	LOCALDB_PROXY(LocalDBGetVersionInfo)(wszVersion, pVersionInfo, cbVersionInfo);
}

#endif

#endif	// _SQLUSERINSTANCE_H_

//-----------------------------------------------------------------------------
// File:			sqluserinstancemsgs.mc
//
// Copyright:		Copyright (c) Microsoft Corporation
//-----------------------------------------------------------------------------
#ifndef _LOCALDB_MESSAGES_H_
#define _LOCALDB_MESSAGES_H_
// Header section
//
// Section with the LocalDB messages
//
//
//  Values are 32 bit values laid out as follows:
//
//   3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
//   1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
//  +-+-+-+-+-+---------------------+-------------------------------+
//  |S|R|C|N|r|    Facility         |               Code            |
//  +-+-+-+-+-+---------------------+-------------------------------+
//
//  where
//
//      S - Severity - indicates success/fail
//
//          0 - Success
//          1 - Fail (COERROR)
//
//      R - reserved portion of the facility code, corresponds to NT's
//              second severity bit.
//
//      C - reserved portion of the facility code, corresponds to NT's
//              C field.
//
//      N - reserved portion of the facility code. Used to indicate a
//              mapped NT status value.
//
//      r - reserved portion of the facility code. Reserved for internal
//              use. Used to indicate HRESULT values that are not status
//              values, but are instead message ids for display strings.
//
//      Facility - is the facility code
//
//      Code - is the facility's status code
//
//
// Define the facility codes
//
#define FACILITY_LOCALDB                 0x9C5


//
// Define the severity codes
//
#define LOCALDB_SEVERITY_SUCCESS         0x0
#define LOCALDB_SEVERITY_ERROR           0x2


//
// MessageId: LOCALDB_ERROR_CANNOT_CREATE_INSTANCE_FOLDER
//
// MessageText:
//
// Cannot create folder for the LocalDB instance at: %%LOCALAPPDATA%%\Microsoft\Microsoft SQL Server Local DB\Instances\<instance name>.
//
#define LOCALDB_ERROR_CANNOT_CREATE_INSTANCE_FOLDER ((HRESULT)0x89C50100L)

//
// MessageId: LOCALDB_ERROR_INVALID_PARAMETER
//
// MessageText:
//
// The parameter for the LocalDB Instance API method is incorrect. Consult the API documentation.
//
#define LOCALDB_ERROR_INVALID_PARAMETER  ((HRESULT)0x89C50101L)

//
// MessageId: LOCALDB_ERROR_INSTANCE_EXISTS_WITH_LOWER_VERSION
//
// MessageText:
//
// Unable to create the LocalDB instance with specified version. An instance with the same name already exists, but it has lower version than the specified version.
//
#define LOCALDB_ERROR_INSTANCE_EXISTS_WITH_LOWER_VERSION ((HRESULT)0x89C50102L)

//
// MessageId: LOCALDB_ERROR_CANNOT_GET_USER_PROFILE_FOLDER
//
// MessageText:
//
// Cannot access the user profile folder for local application data (%%LOCALAPPDATA%%).
//
#define LOCALDB_ERROR_CANNOT_GET_USER_PROFILE_FOLDER ((HRESULT)0x89C50103L)

//
// MessageId: LOCALDB_ERROR_INSTANCE_FOLDER_PATH_TOO_LONG
//
// MessageText:
//
// The full path length of the LocalDB instance folder is longer than MAX_PATH. The instance must be stored in folder: %%LOCALAPPDATA%%\Microsoft\Microsoft SQL Server Local DB\Instances\<instance name>.
//
#define LOCALDB_ERROR_INSTANCE_FOLDER_PATH_TOO_LONG ((HRESULT)0x89C50104L)

//
// MessageId: LOCALDB_ERROR_CANNOT_ACCESS_INSTANCE_FOLDER
//
// MessageText:
//
// Cannot access LocalDB instance folder: %%LOCALAPPDATA%%\Microsoft\Microsoft SQL Server Local DB\Instances\<instance name>.
//
#define LOCALDB_ERROR_CANNOT_ACCESS_INSTANCE_FOLDER ((HRESULT)0x89C50105L)

//
// MessageId: LOCALDB_ERROR_CANNOT_ACCESS_INSTANCE_REGISTRY
//
// MessageText:
//
// Unexpected error occurred while trying to access the LocalDB instance registry configuration. See the Windows Application event log for error details.
//
#define LOCALDB_ERROR_CANNOT_ACCESS_INSTANCE_REGISTRY ((HRESULT)0x89C50106L)

//
// MessageId: LOCALDB_ERROR_UNKNOWN_INSTANCE
//
// MessageText:
//
// The specified LocalDB instance does not exist.
//
#define LOCALDB_ERROR_UNKNOWN_INSTANCE   ((HRESULT)0x89C50107L)

//
// MessageId: LOCALDB_ERROR_INTERNAL_ERROR
//
// MessageText:
//
// Unexpected error occurred inside a LocalDB instance API method call. See the Windows Application event log for error details.
//
#define LOCALDB_ERROR_INTERNAL_ERROR     ((HRESULT)0x89C50108L)

//
// MessageId: LOCALDB_ERROR_CANNOT_MODIFY_INSTANCE_REGISTRY
//
// MessageText:
//
// Unexpected error occurred while trying to modify the registry configuration for the LocalDB instance. See the Windows Application event log for error details.
//
#define LOCALDB_ERROR_CANNOT_MODIFY_INSTANCE_REGISTRY ((HRESULT)0x89C50109L)

//
// MessageId: LOCALDB_ERROR_SQL_SERVER_STARTUP_FAILED
//
// MessageText:
//
// Error occurred during LocalDB instance startup: SQL Server process failed to start.
//
#define LOCALDB_ERROR_SQL_SERVER_STARTUP_FAILED ((HRESULT)0x89C5010AL)

//
// MessageId: LOCALDB_ERROR_INSTANCE_CONFIGURATION_CORRUPT
//
// MessageText:
//
// LocalDB instance is corrupted. See the Windows Application event log for error details.
//
#define LOCALDB_ERROR_INSTANCE_CONFIGURATION_CORRUPT ((HRESULT)0x89C5010BL)

//
// MessageId: LOCALDB_ERROR_CANNOT_CREATE_SQL_PROCESS
//
// MessageText:
//
// Error occurred during LocalDB instance startup: unable to create the SQL Server process.
//
#define LOCALDB_ERROR_CANNOT_CREATE_SQL_PROCESS ((HRESULT)0x89C5010CL)

//
// MessageId: LOCALDB_ERROR_UNKNOWN_VERSION
//
// MessageText:
//
// The specified LocalDB version is not available on this computer.
//
#define LOCALDB_ERROR_UNKNOWN_VERSION    ((HRESULT)0x89C5010DL)

//
// MessageId: LOCALDB_ERROR_UNKNOWN_LANGUAGE_ID
//
// MessageText:
//
// Error getting the localized error message. The language specified by 'Language ID' parameter is unknown.
//
#define LOCALDB_ERROR_UNKNOWN_LANGUAGE_ID ((HRESULT)0x89C5010EL)

//
// MessageId: LOCALDB_ERROR_INSTANCE_STOP_FAILED
//
// MessageText:
//
// Stop operation for LocalDB instance failed to complete within the specified time.
//
#define LOCALDB_ERROR_INSTANCE_STOP_FAILED ((HRESULT)0x89C5010FL)

//
// MessageId: LOCALDB_ERROR_UNKNOWN_ERROR_CODE
//
// MessageText:
//
// Error getting the localized error message. The specified error code is unknown.
//
#define LOCALDB_ERROR_UNKNOWN_ERROR_CODE ((HRESULT)0x89C50110L)

//
// MessageId: LOCALDB_ERROR_VERSION_REQUESTED_NOT_INSTALLED
//
// MessageText:
//
// The LocalDB version available on this workstation is lower than the requested LocalDB version.
//
#define LOCALDB_ERROR_VERSION_REQUESTED_NOT_INSTALLED ((HRESULT)0x89C50111L)

//
// MessageId: LOCALDB_ERROR_INSTANCE_BUSY
//
// MessageText:
//
// Requested operation on LocalDB instance cannot be performed because specified instance is currently in use. Stop the instance and try again.
//
#define LOCALDB_ERROR_INSTANCE_BUSY      ((HRESULT)0x89C50112L)

//
// MessageId: LOCALDB_ERROR_INVALID_OPERATION
//
// MessageText:
//
// Default LocalDB instances cannot be created, stopped or deleted manually.
//
#define LOCALDB_ERROR_INVALID_OPERATION  ((HRESULT)0x89C50113L)

//
// MessageId: LOCALDB_ERROR_INSUFFICIENT_BUFFER
//
// MessageText:
//
// The buffer passed to the LocalDB instance API method has insufficient size.
//
#define LOCALDB_ERROR_INSUFFICIENT_BUFFER ((HRESULT)0x89C50114L)

//
// MessageId: LOCALDB_ERROR_WAIT_TIMEOUT
//
// MessageText:
//
// Timeout occurred inside the LocalDB instance API method.
//
#define LOCALDB_ERROR_WAIT_TIMEOUT       ((HRESULT)0x89C50115L)

// MessageId=0x0116 message id is reserved. This message ID will be used for error LOCALDB_ERROR_NOT_INSTALLED.
// This message is specific since it has to be present in SqlUserIntsnace.h because it can be returned by discovery API.
//
//
// MessageId: LOCALDB_ERROR_XEVENT_FAILED
//
// MessageText:
//
// Failed to start XEvent engine within the LocalDB Instance API.
//
#define LOCALDB_ERROR_XEVENT_FAILED      ((HRESULT)0x89C50117L)

//
// MessageId: LOCALDB_ERROR_AUTO_INSTANCE_CREATE_FAILED
//
// MessageText:
//
// Cannot create an automatic instance. See the Windows Application event log for error details.
//
#define LOCALDB_ERROR_AUTO_INSTANCE_CREATE_FAILED ((HRESULT)0x89C50118L)

//
// MessageId: LOCALDB_ERROR_SHARED_NAME_TAKEN
//
// MessageText:
//
// Cannot create a shared instance. The specified shared instance name is already in use.
//
#define LOCALDB_ERROR_SHARED_NAME_TAKEN  ((HRESULT)0x89C50119L)

//
// MessageId: LOCALDB_ERROR_CALLER_IS_NOT_OWNER
//
// MessageText:
//
// API caller is not LocalDB instance owner.
//
#define LOCALDB_ERROR_CALLER_IS_NOT_OWNER ((HRESULT)0x89C5011AL)

//
// MessageId: LOCALDB_ERROR_INVALID_INSTANCE_NAME
//
// MessageText:
//
// Specified LocalDB instance name is invalid.
//
#define LOCALDB_ERROR_INVALID_INSTANCE_NAME ((HRESULT)0x89C5011BL)

//
// MessageId: LOCALDB_ERROR_INSTANCE_ALREADY_SHARED
//
// MessageText:
//
// The specified LocalDB instance is already shared with different shared name.
//
#define LOCALDB_ERROR_INSTANCE_ALREADY_SHARED ((HRESULT)0x89C5011CL)

//
// MessageId: LOCALDB_ERROR_INSTANCE_NOT_SHARED
//
// MessageText:
//
// The specified LocalDB instance is not shared.
//
#define LOCALDB_ERROR_INSTANCE_NOT_SHARED ((HRESULT)0x89C5011DL)

//
// MessageId: LOCALDB_ERROR_ADMIN_RIGHTS_REQUIRED
//
// MessageText:
//
// Administrator privileges are required in order to execute this operation.
//
#define LOCALDB_ERROR_ADMIN_RIGHTS_REQUIRED ((HRESULT)0x89C5011EL)

//
// MessageId: LOCALDB_ERROR_TOO_MANY_SHARED_INSTANCES
//
// MessageText:
//
// Unable to share a LocalDB instance - maximum number of shared LocalDB instances reached.
//
#define LOCALDB_ERROR_TOO_MANY_SHARED_INSTANCES ((HRESULT)0x89C5011FL)

//
// MessageId: LOCALDB_ERROR_CANNOT_GET_LOCAL_APP_DATA_PATH
//
// MessageText:
//
// Cannot get a local application data path. Most probably a user profile is not loaded. If LocalDB is executed under IIS, make sure that profile loading is enabled for the current user.
//
#define LOCALDB_ERROR_CANNOT_GET_LOCAL_APP_DATA_PATH ((HRESULT)0x89C50120L)

//
// MessageId: LOCALDB_ERROR_CANNOT_LOAD_RESOURCES
//
// MessageText:
//
// Cannot load resources for this DLL. Resources for this DLL should be stored in a subfolder Resources, with the same file name as this DLL and the extension ".RLL".
//
#define LOCALDB_ERROR_CANNOT_LOAD_RESOURCES ((HRESULT)0x89C50121L)

 // Detailed error descriptions
//
// MessageId: LOCALDB_EDETAIL_DATADIRECTORY_IS_MISSING
//
// MessageText:
//
// The "DataDirectory" registry value is missing in the LocalDB instance registry key: %1
//
#define LOCALDB_EDETAIL_DATADIRECTORY_IS_MISSING ((HRESULT)0x89C50200L)

//
// MessageId: LOCALDB_EDETAIL_CANNOT_ACCESS_INSTANCE_FOLDER
//
// MessageText:
//
// Cannot access LocalDB instance folder: %1
//
#define LOCALDB_EDETAIL_CANNOT_ACCESS_INSTANCE_FOLDER ((HRESULT)0x89C50201L)

//
// MessageId: LOCALDB_EDETAIL_DATADIRECTORY_IS_TOO_LONG
//
// MessageText:
//
// The "DataDirectory" registry value is too long in the LocalDB instance registry key: %1
//
#define LOCALDB_EDETAIL_DATADIRECTORY_IS_TOO_LONG ((HRESULT)0x89C50202L)

//
// MessageId: LOCALDB_EDETAIL_PARENT_INSTANCE_IS_MISSING
//
// MessageText:
//
// The "Parent Instance" registry value is missing in the LocalDB instance registry key: %1
//
#define LOCALDB_EDETAIL_PARENT_INSTANCE_IS_MISSING ((HRESULT)0x89C50203L)

//
// MessageId: LOCALDB_EDETAIL_PARENT_INSTANCE_IS_TOO_LONG
//
// MessageText:
//
// The "Parent Instance" registry value is too long in the LocalDB instance registry key: %1
//
#define LOCALDB_EDETAIL_PARENT_INSTANCE_IS_TOO_LONG ((HRESULT)0x89C50204L)

//
// MessageId: LOCALDB_EDETAIL_DATA_DIRECTORY_INVALID
//
// MessageText:
//
// Data directory for LocalDB instance is invalid: %1
//
#define LOCALDB_EDETAIL_DATA_DIRECTORY_INVALID ((HRESULT)0x89C50205L)

//
// MessageId: LOCALDB_EDETAIL_XEVENT_ASSERT
//
// MessageText:
//
// LocalDB instance API: XEvent engine assert: %1 in %2:%3 (%4)
//
#define LOCALDB_EDETAIL_XEVENT_ASSERT    ((HRESULT)0x89C50206L)

//
// MessageId: LOCALDB_EDETAIL_XEVENT_ERROR
//
// MessageText:
//
// LocalDB instance API: XEvent error: %1
//
#define LOCALDB_EDETAIL_XEVENT_ERROR     ((HRESULT)0x89C50207L)

//
// MessageId: LOCALDB_EDETAIL_INSTALLATION_CORRUPTED
//
// MessageText:
//
// LocalDB installation is corrupted. Reinstall the LocalDB.
//
#define LOCALDB_EDETAIL_INSTALLATION_CORRUPTED ((HRESULT)0x89C50208L)

//
// MessageId: LOCALDB_EDETAIL_CANNOT_GET_PROGRAM_FILES_LOCATION
//
// MessageText:
//
// LocalDB XEvent error: cannot determine %ProgramFiles% folder location.
//
#define LOCALDB_EDETAIL_CANNOT_GET_PROGRAM_FILES_LOCATION ((HRESULT)0x89C50209L)

//
// MessageId: LOCALDB_EDETAIL_XEVENT_CANNOT_INITIALIZE
//
// MessageText:
//
// LocalDB XEvent error: Cannot initialize XEvent engine.
//
#define LOCALDB_EDETAIL_XEVENT_CANNOT_INITIALIZE ((HRESULT)0x89C5020AL)

//
// MessageId: LOCALDB_EDETAIL_XEVENT_CANNOT_FIND_CONF_FILE
//
// MessageText:
//
// LocalDB XEvent error: Cannot find XEvents configuration file: %1
//
#define LOCALDB_EDETAIL_XEVENT_CANNOT_FIND_CONF_FILE ((HRESULT)0x89C5020BL)

//
// MessageId: LOCALDB_EDETAIL_XEVENT_CANNOT_CONFIGURE
//
// MessageText:
//
// LocalDB XEvent error: Cannot configure XEvents engine with the configuration file: %1
// HRESULT returned: %2
//
#define LOCALDB_EDETAIL_XEVENT_CANNOT_CONFIGURE ((HRESULT)0x89C5020CL)

//
// MessageId: LOCALDB_EDETAIL_XEVENT_CONF_FILE_NAME_TOO_LONG
//
// MessageText:
//
// LocalDB XEvent error: XEvents engine configuration file too long
//
#define LOCALDB_EDETAIL_XEVENT_CONF_FILE_NAME_TOO_LONG ((HRESULT)0x89C5020DL)

//
// MessageId: LOCALDB_EDETAIL_COINITIALIZEEX_FAILED
//
// MessageText:
//
// CoInitializeEx API failed. HRESULT returned: %1
//
#define LOCALDB_EDETAIL_COINITIALIZEEX_FAILED ((HRESULT)0x89C5020EL)

//
// MessageId: LOCALDB_EDETAIL_PARENT_INSTANCE_VERSION_INVALID
//
// MessageText:
//
// LocalDB parent instance version is invalid: %1
//
#define LOCALDB_EDETAIL_PARENT_INSTANCE_VERSION_INVALID ((HRESULT)0x89C5020FL)

//
// MessageId: LOCALDB_EDETAIL_WINAPI_ERROR
//
// MessageText:
//
// Windows API call %1 returned error code: %2. Windows system error message is: %3Reported at line: %4. %5
//
#define LOCALDB_EDETAIL_WINAPI_ERROR     ((HRESULT)0xC9C50210L)

//
// MessageId: LOCALDB_EDETAIL_UNEXPECTED_RESULT
//
// MessageText:
//
// Function %1 returned %2 at line %3.
//
#define LOCALDB_EDETAIL_UNEXPECTED_RESULT ((HRESULT)0x89C50211L)

//
#endif


extern RPC_IF_HANDLE __MIDL_itf_sqlncli_0000_0011_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_sqlncli_0000_0011_v0_0_s_ifspec;

/* Additional Prototypes for ALL interfaces */

/* end of Additional Prototypes */

#ifdef __cplusplus
}
#endif

#endif


//---------------------------------------------------------------------------------------------------------------------------------
// File: sfdafx.cpp
// Contents: Precompiled Header
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#include "stdafx.h"
//---------------------------------------------------------------------------------------------------------------------------------
// File: stdafx.h
// Contents: Precompiled header
// 
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//---------------------------------------------------------------------------------------------------------------------------------

#pragma once

#ifdef LINUX_BUILD
#define GCC_VERSION (__GNUC__ * 10000 \
                     + __GNUC_MINOR__ * 100 \
                     + __GNUC_PATCHLEVEL__)
    #if GCC_VERSION > 90200
    #pragma GCC diagnostic ignored "-Wcast-function-type"
    #endif
#endif

#include <v8.h>
#include <uv.h>
#include <node.h>
#include <node_buffer.h>
#include <nan.h>
#ifdef LINUX_BUILD
    #include <sqltypes.h>
    #include <sqlspi.h>
    #include <sqlext.h>
    #include <sql.h>
    #include <msodbcsql.h>
    #include <sqlncli-linux.h>
#endif

#include <sqlucode.h>

#ifdef WINDOWS_BUILD
    #include <windows.h>	// for critical section until xplatform
#endif

#include <vector>
#include <queue>
#include <string>
#include <functional>
#include <algorithm>
#include <numeric>
#include <memory>

#include "Utility.h"
#include "OdbcError.h"
#include "OdbcHandle.h"

// #define interface struct 	// for the COM interfaces in sqlncli.h and to avoid including extra files

#ifdef WINDOWS_BUILD
    #include "sqlncli.h"	 	// SQL Server specific constants
#endif



// default values filled in for a JS date object when retrieving a SQL Server time field
// There is no default JS date when only a time is furnished, so we are using the SQL Server
// defaults, which is Jan 1, 1900.
const int SQL_SERVER_DEFAULT_YEAR  = 1900;
const int SQL_SERVER_DEFAULT_MONTH = 1;		// JS months are 0 based, SQL Server months are 1 based
const int SQL_SERVER_DEFAULT_DAY   = 1;

#define ErrorIf(x) if (x) goto Error;


import {SqlClient, Error, Meta, EventColumnCb, PreparedStatement, Query, Connection} from "msnodesqlv8";

/**
 * Created by Stephen on 1/22/2017.
 */

export module MsNodeSqlWrapperModule {

    const legacyDriver: SqlClient = require('msnodesqlv8');

    export class SqlModuleWrapperError implements Error {
        constructor(public message: string) {
        }

        sqlstate: string = "";
        code: number = 0;
    }

    export interface queryCb<T> { (v: T): void
    }

    export enum SqlCommandType
    {
        None,
        QueryObjectFormat,
        QueryRawFormat,
        StoredProcedure,
        PreparingStatement,
        PreparedStatement
    }

    export class SqlCommand {

        constructor(public connection: SqlConnection, public id ?: string, public commandType: SqlCommandType = SqlCommandType.QueryObjectFormat) {
        }

        _driverTimeoutMs: number | undefined;
        _wrapperTimeoutMs: number | undefined;
        _sql: string | undefined;
        _procedure: string | undefined;

        _inputParams: any[] | undefined;

        _onMeta: queryCb<Meta> | undefined;
        _onColumn: EventColumnCb | undefined;
        _onRowCount: queryCb<number> | undefined;
        _onRow: queryCb<number> | undefined;
        _onDone: queryCb<any> | undefined;
        _onSubmitted: queryCb<any> | undefined;
        _onError: queryCb<string> | undefined;
        _onClosed: queryCb<string> | undefined;

        _query: Query | undefined;
        _preparedStatement: PreparedStatement | undefined;

        public isPrepared(): boolean {
            return this.commandType == SqlCommandType.PreparingStatement;
        }

        public sql(s: string): SqlCommand {
            this._sql = s;
            if (this.commandType == SqlCommandType.None)
                this.commandType = SqlCommandType.QueryObjectFormat;
            return this;
        }

        public params(v: any[]): SqlCommand {
            this._inputParams = v;
            return this;
        }

        public param(v: any): SqlCommand {
            if (this._inputParams == null) {
                this._inputParams = [];
            }
            this._inputParams.push(v);
            return this;
        }

        public procedure(s: string): SqlCommand {
            this._procedure = s;
            this.commandType = SqlCommandType.StoredProcedure;
            this.unsubscribe();
            return this;
        }

        public rawFormat(): SqlCommand {
            this.commandType = SqlCommandType.QueryRawFormat;
            return this;
        }

        public wrapperTimeoutMs(to: number): SqlCommand {
            this._wrapperTimeoutMs = to;
            return this;
        }

        public driverTimeoutMs(to: number): SqlCommand {
            this._driverTimeoutMs = to;
            return this;
        }

        public onMeta(cb: queryCb<Meta>): SqlCommand {
            this._onMeta = cb;
            return this;
        }

        public onColumn(cb: EventColumnCb): SqlCommand {
            this._onColumn = cb;
            return this;
        }

        public onRowCount(cb: queryCb<number>): SqlCommand {
            this._onRowCount = cb;
            return this;
        }

        public onRow(cb: queryCb<number>): SqlCommand {
            this._onRow = cb;
            return this;
        }

        public onDone(cb: queryCb<any>): SqlCommand {
            this._onDone = cb;
            return this;
        }

        public onSubmitted(cb: queryCb<any>): SqlCommand {
            this._onSubmitted = cb;
            return this;
        }

        public onError(cb: queryCb<string>): SqlCommand {
            this._onError = cb;
            return this;
        }

        public onClosed(cb: queryCb<string>): SqlCommand {
            this._onClosed = cb;
            return this;
        }

        public unsubscribe(): void {
            this._onMeta = undefined;
            this._onColumn = undefined;
            this._onRowCount = undefined;
            this._onRow = undefined;
            this._onDone = undefined;
            this._onError = undefined;
            this._onClosed = undefined;
        }

        private subscribe(): void {

            let query = this._query;

            if (query) {
                if (this._onMeta != null) {
                    query.on('meta', (m:any) => this._onMeta(m));
                }
                if (this._onColumn != null) {
                    query.on('column', (c:any, d:any, m:any) => this._onColumn(c, d, m));
                }
                if (this._onRowCount != null) {
                    query.on('rowCount', (m:any) => this._onRowCount(m));
                }
                if (this._onRow != null) {
                    query.on('row', (m:any) => this._onRow(m));
                }
                if (this._onDone != null) {
                    query.on('done', m => this._onDone(m));
                }
                if (this._onError != null) {
                    query.on('error', m => this._onError(m));
                }
                if (this._onClosed != null) {
                    query.on('closed', m => this._onClosed(m));
                }
                if (this._onSubmitted != null) {
                    query.on('submitted', m => this._onSubmitted(m));
                }
            }            
        }

        public subscribing(): boolean {
            return this._onMeta != null
                || this._onSubmitted != null
                || this._onColumn != null
                || this._onRowCount != null
                || this._onRow != null
                || this._onDone != null
                || this._onError != null
                || this._onClosed != null
        }

        private execProcedure(resolve: Function, reject: Function, res: SqlCommandResponse): void {
            let timeout = this._driverTimeoutMs > 0 ? this._driverTimeoutMs / 1000 : 0;
            let pm = this.connection.legacy_conn.procedureMgr();
            pm.setTimeout(timeout);
            pm.callproc(this._procedure, this._inputParams, (err?: Error, rows?: any[], outputParams?: any[]) => {
                if (err) {
                    res.error = err;
                    reject(res);
                }
                else {
                    res.aggregate(rows);
                    res.outputParams = outputParams;
                    resolve(res);
                }
            });
        }

        private execQuery(resolve: Function, reject: Function, res: SqlCommandResponse): void {
            let timeout = this._driverTimeoutMs > 0 ? this._driverTimeoutMs / 1000 : 0;
            this._query = this.connection.legacy_conn.query({
                query_str: this._sql,
                query_timeout: timeout
            }, this._inputParams, (err: Error, rows: any[], more: boolean) => {
                if (err) {
                    res.error = err;
                    reject(res);
                } else {
                    res.aggregate(rows);
                    if (!more) resolve(res);
                }
            });
        }

        private execQueryRaw(resolve: Function, reject: Function, res: SqlCommandResponse): void {
            let timeout = this._driverTimeoutMs > 0 ? this._driverTimeoutMs / 1000 : 0;
            this._query = this.connection.legacy_conn.queryRaw({
                query_str: this._sql,
                query_timeout: timeout
            }, this._inputParams, (err?: Error, rawData?: RawData, more?: boolean) => {
                if (err) {
                    res.error = err;
                    reject(res);
                } else {
                    res.aggregateRaw(rawData);
                    if (!more) resolve(res);
                }
            });
        }

        private execPrepared(resolve: Function, reject: Function, res: SqlCommandResponse): void {
            this._preparedStatement.preparedQuery(
                this._inputParams, (err: Error, rows: any[], more: boolean) => {
                    if (err) {
                        res.error = err;
                        reject(res);
                    } else {
                        res.aggregate(rows);
                        if (!more) resolve(res);
                    }
                });
        }

        public cancel(): Promise<SqlCommand> {
            return new Promise((resolve, reject) => {
                let inst = this;
                if (!this._query) {
                    reject(new SqlModuleWrapperError('can only cancel a submitted query.'));
                    return;
                }
                this._query.cancelQuery(err => {
                    if (!err) reject(new SqlModuleWrapperError(`failed to cancel: ${err.message}`));
                    resolve(inst);
                })
            });
        }

        public freePrepared(): Promise<SqlCommand> {
            return new Promise((resolve, reject) => {
                let inst = this;
                if (this.commandType != SqlCommandType.PreparedStatement) {
                    reject(new SqlModuleWrapperError('freePrepared must be called on prepared command.'));
                    return;
                }
                this._preparedStatement.free(() => {
                    inst._preparedStatement = null;
                    inst.commandType = SqlCommandType.None;
                    resolve(inst);
                })
            });
        }

        public prepare(): Promise<SqlCommand> {
            return new Promise((resolve, reject) => {
                if (this._sql == null) {
                    reject(new SqlModuleWrapperError('prepare must be called after sql() with sql to prepare.'));
                    return;
                }
                if (this.commandType == SqlCommandType.PreparingStatement) {
                    reject(new SqlModuleWrapperError('prepare is preparing and must be called once only on a command.'));
                    return;
                }
                if (this._preparedStatement != null) {
                    reject(new SqlModuleWrapperError('this command has previously been prepared.'));
                    return;
                }
                this.commandType = SqlCommandType.PreparingStatement;
                this.unsubscribe();
                let inst = this;
                this.connection.legacy_conn.prepare(this._sql, (err?: Error, statement?: PreparedStatement) => {
                    if (err) {
                        reject(err);
                        inst.commandType = SqlCommandType.None;
                    } else {
                        inst._preparedStatement = statement;
                        inst.commandType = SqlCommandType.PreparedStatement;
                        resolve(inst);
                    }
                })
            });
        }

        private dispatchCommandType(resolve: Function, reject: Function, res: SqlCommandResponse): void {
            switch (this.commandType) {

                case SqlCommandType.QueryObjectFormat: {
                    this.execQuery(resolve, reject, res);
                    break;
                }

                case SqlCommandType.QueryRawFormat: {
                    this.execQueryRaw(resolve, reject, res);
                    break;
                }

                case SqlCommandType.StoredProcedure: {
                    this.execProcedure(resolve, reject, res);
                    break;
                }

                case SqlCommandType.PreparingStatement: {
                    res.error = new SqlModuleWrapperError(`statement not yet prepared.`);
                    break;
                }

                case SqlCommandType.PreparedStatement: {
                    this.execPrepared(resolve, reject, res);
                    break;
                }

                default: {
                    res.error = new SqlModuleWrapperError(`${this.commandType} is not valid value.`);
                    break;
                }
            }
        }

        public execute(): Promise<SqlCommandResponse> {

            return new Promise((resolve, reject) => {
                let res = new SqlCommandResponse();
                let to = this._wrapperTimeoutMs;
                if (to > 0) {
                    setTimeout(() => {
                        res.error = new SqlModuleWrapperError(`wrapper timeout ${to} expired.`);
                        reject(res);
                    }, to);
                }

                this.dispatchCommandType(resolve, reject, res);

                if (res.error != null) {
                    reject(res);
                } else if (this.subscribing()) {
                    this.subscribe()
                }
            })
        }
    }

    export class RawData implements RawData {
        public meta: Meta[] = [];
        public rows: Array<any[]> [];
    }

    export class SqlCommandResponse {

        public aggregateRaw(raw: RawData) {
            let rd = this.rawData;
            if (rd == null) {
                this.rawData = rd = new RawData();
                rd.meta = raw.meta;
                rd.rows = [];
            }

            raw.rows.forEach(row => rd.rows.push(row));
            
        }

        public aggregate(rows: any[]) {
            if (this.asObjects == null) {
                this.asObjects = [];
            }
            rows.forEach(r => this.asObjects.push(r));
        }

        public error: Error | undefined;
        public asObjects: any[] = [];
        public outputParams: any[] | undefined;
        public rawData: RawData | undefined;
    }

    export interface dictIteratorCb<T> { (key: string, val: T): void
    }

    export class Dictionary<T> {

        container: {[id: string]: T;} = {};

        public count(): number {
            let keys = Object.keys(this.container);
            return keys.length;
        }

        public values(): T[] {
            let va: T[] = [];
            let keys = Object.keys(this.container);
            keys.forEach(k => va.push(this.container[k]));
            return va;
        }

        public keys(): string[] {
            return Object.keys(this.container);
        }

        public containsKey(key: string): boolean {
            return this.container[key] != null;
        }

        public add(key: string, v: T): void {
            if (this.containsKey(key)) throw new Error(`duplicate key ${key}`);
            this.container[key] = v;
        }

        public remove(key: string): void {
            delete this.container[key];
        }

        public get(key: string): T {
            return this.container[key];
        }

        public forEach(cb: dictIteratorCb<T>) {
            Object.keys(this.container).forEach((k: string) => cb(k, this.container[k]));
        }
    }

    export class ConnectionPool {
        connections: Dictionary<Connection> = new Dictionary<Connection>();
    }

    export class CommandCache {
        public CachedCommands: Dictionary<SqlCommand> = new Dictionary<SqlCommand>();

        constructor(public connection: SqlConnection) {
        }

        public get(id?: string): SqlCommand {
            if (id == null) return new SqlCommand(this.connection);
            let cached = this.CachedCommands.get(id);
            if (cached == null) {
                cached = new SqlCommand(this.connection);
                this.CachedCommands.add(id, cached);
            }
            return cached;
        }

        public free(commandId?: string): Promise<string> {
            return new Promise((resolve, reject) => {
                let c: SqlCommand = this.CachedCommands.get(commandId);
                if (c == null) {
                    reject(false);
                    return;
                }
                if (c.isPrepared()) {
                    c.freePrepared().then(() => {
                        this.CachedCommands.remove(commandId);
                        resolve(commandId);
                    });
                } else {
                    this.CachedCommands.remove(commandId);
                    resolve(commandId);
                }
            });
        }

        public deleteAll(): Promise<boolean> {
            return new Promise((resolve, reject) => {
                this.CachedCommands.forEach((id, c) => {
                    this.free(id).then(()=> {
                        if (this.CachedCommands.count() == 0) {
                            resolve(true);
                        }
                    }).catch(e => {
                        reject(e);
                    })
                });
            });
        }
    }

    export class SqlConnection {

        public CommandCache: CommandCache;

        constructor(public legacy_conn: Connection) {
            this.CommandCache = new CommandCache(this);
        }

        public id(): string {
            return this.legacy_conn.id.toString();
        }

        public getCommand() : SqlCommand {
            return new SqlCommand(this);
        }

        public static getLegacy(): SqlClient {
            return legacyDriver;
        }

        public close(): Promise<any> {
            return new Promise((resolve, reject) => {
                this.legacy_conn.close((err: Error) => {
                    if (err) reject(err);
                    else resolve(null);
                })
            });
        }
    }

    export class Sql {

        constructor(public connStr: string) {
        }

        public execute(sql:string, params:any = [], raw:boolean = false) : Promise<SqlCommandResponse> {
            return new Promise((resolve, reject) => {
                this.open().then( (connection : SqlConnection) => {
                    let command = new SqlCommand(connection);
                    if (raw) command = command.rawFormat();
                    command.sql(sql).params(params).execute().then(res=> {
                        connection.close().then(() => {
                            resolve(res);
                        }).catch(e=>{
                            reject(e);
                        });
                    }).catch(e=> {
                        reject(e);
                    })
                }).catch(e=> {
                    reject(e);
                });
            });
        }

        public open(timeout: number = 0): Promise<SqlConnection> {
            return new Promise((resolve, reject) => {
                legacyDriver.open({
                    conn_str: this.connStr,
                    conn_timeout: timeout
                }, (err: Error, legacy: any) => {
                    if (err) {
                        reject(err);
                    } else {
                        let connection = new SqlConnection(legacy);
                        resolve(connection);
                    }
                });
            });
        }
    }
}/**
 * Created by Stephen on 9/28/2015.
 */

'use strict'

const connectionModule = ((() => {
  // private
  const util = require('util')
  const cppDriver = require('../build/Release/sqlserverv8.node')
  const { driverModule } = require('./driver')
  const { procedureModule } = require('./procedure')
  const { notifyModule } = require('./notifier')
  const { tableModule } = require('./table')
  const { userModule } = require('./user')
  const { metaModule } = require('./meta')
  const { utilModule } = require('./util')

  const sqlMeta = new metaModule.Meta()
  const userTypes = new userModule.SqlTypes()

  class PreparedStatementPromises {
    query (params, options) {
      const q = this.prepared.preparedQuery(params)
      return this.aggregator.queryPrepared(q, options)
    }

    constructor (c, ps) {
      this.aggregator = new utilModule.QueryAggregator(c)
      this.connection = c
      this.prepared = ps
      this.free = util.promisify(ps.free)
    }
  }

  class PreparedStatement {
    constructor (notifier, driverMgr, preparedSignature, connection, preparedNotifier, preparedMeta) {
      const meta = preparedMeta
      const notify = preparedNotifier

      let active = true
      const signature = preparedSignature

      function getMeta () {
        return meta
      }

      function getSignature () {
        return signature
      }

      function getId () {
        return notify.getQueryId()
      }

      function preparedQuery (paramsOrCallback, callback) {
        if (!active) {
          if (callback) {
            callback(new Error('error; prepared statement has been Debugd.'))
          }
        }
        const chunky = notifier.getChunkyArgs(paramsOrCallback, callback)

        const onPreparedQuery = (err, results, more) => {
          if (chunky.callback) {
            if (err) {
              chunky.callback(err)
            } else {
              chunky.callback(err, driverMgr.objectify(results), more)
            }
          }
        }

        if (chunky.callback) {
          driverMgr.readAllPrepared(notify, {}, chunky.params, onPreparedQuery)
        } else {
          driverMgr.readAllPrepared(notify, {}, chunky.params)
        }

        return notify
      }

      const free = callback => {
        driverMgr.freeStatement(notify, err => {
          active = false
          if (callback) {
            callback(err, null)
          }
        })
      }

      this.preparedQuery = preparedQuery
      this.meta = meta
      this.connection = connection
      this.free = free
      this.getMeta = getMeta
      this.getSignature = getSignature
      this.getId = getId
      this.promises = new PreparedStatementPromises(connection, this)

      return this
    }
  }

  class PrivateConnection {
    constructor (parentFn, p, cb, id) {
      const defaultCallback = err => {
        if (err) {
          throw new Error(err)
        }
      }

      let callback2 = cb
      const native = new cppDriver.Connection()
      const driverMgr = new driverModule.DriverMgr(native)
      const nf = new notifyModule.NotifyFactory()
      const connection = new ConnectionWrapper(driverMgr, defaultCallback, id)
      connection.setUseUTC(true)
      const connectObj = p
      const version = this.decodeSqlServerVersion(connectObj.conn_str)
      connection.setDriverVersion(version)

      const open = () => {
        nf.validateParameters(
          [
            {
              type: 'string',
              value: connectObj.conn_str,
              name: 'connection string'
            },
            {
              type: 'function',
              value: cb,
              name: 'callback'
            }
          ],
          parentFn
        )

        callback2 = callback2 || defaultCallback

        const queueCb = err => {
          setImmediate(() => {
            if (Array.isArray(err) && err.length === 1) {
              callback2(err[0], connection)
            } else {
              callback2(err, connection)
            }
          })
        }

        native.open(connectObj, queueCb)
      }

      this.id = connection.id
      this.connection = connection
      this.open = open

      return this
    }

    decodeSqlServerVersion (connectionString) {
      const myRegexp = /Driver=\{ODBC Driver (.*?) for SQL Server}.*$/g
      const match = myRegexp.exec(connectionString)
      return match !== null ? parseInt(match[1]) : 17
    }
  }

  class ConnectionWrapperPromises {
    constructor (connection) {
      function prepare (sqlQuery) {
        const inst = this
        return new Promise((resolve, reject) => {
          inst.connection.prepare(sqlQuery, (err, res) => {
            if (err) {
              setImmediate(() => {
                reject(err)
              })
            } else {
              setImmediate(() => {
                resolve(res)
              })
            }
          })
        })
      }

      function beginTransaction () {
        const inst = this
        return new Promise((resolve, reject) => {
          inst.connection.beginTransaction((err, res) => {
            if (err) {
              setImmediate(() => {
                reject(err)
              })
            } else {
              setImmediate(() => {
                resolve(res)
              })
            }
          })
        })
      }

      function commit () {
        const inst = this
        return new Promise((resolve, reject) => {
          inst.connection.commit((err, res) => {
            if (err) {
              setImmediate(() => {
                reject(err)
              })
            } else {
              setImmediate(() => {
                resolve(res)
              })
            }
          })
        })
      }

      function rollback () {
        const inst = this
        return new Promise((resolve, reject) => {
          inst.connection.rollback((err, res) => {
            if (err) {
              setImmediate(() => {
                reject(err)
              })
            } else {
              setImmediate(() => {
                resolve(res)
              })
            }
          })
        })
      }

      this.me = this
      this.beginTransaction = beginTransaction
      this.commit = commit
      this.rollback = rollback
      this.prepare = prepare
      this.connection = connection
      const tm = connection.tableMgr()
      const pm = connection.procedureMgr()
      this.aggregator = new utilModule.QueryAggregator(connection)
      this.query = this.aggregator.query
      this.callProc = this.aggregator.callProc
      this.getUserTypeTable = util.promisify(connection.getUserTypeTable)
      this.getTable = tm.promises.getTable
      this.getProc = util.promisify(pm.getProc)
      this.close = util.promisify(connection.close)
      this.cancel = util.promisify(connection.cancelQuery)
    }
  }

  class ConnectionWrapper {
    constructor (driver, defCb, name) {
      const defaultCallback = defCb
      const id = name
      const driverMgr = driver
      const inst = this
      const notifier = new notifyModule.NotifyFactory()

      let nextQueryId = 0

      let dead = false
      let useUTC = true
      let driverVersion = 0
      let maxPreparedColumnSize = null
      let useNumericString = false
      let procedureCache = null
      let tableCache = null

      function setSharedCache (pc, tc) {
        procedureCache = pc
        tableCache = tc
      }

      function getUserTypeTable (name, callback) {
        return tables.getUserTypeTable(name, callback)
      }

      function tableMgr () {
        return tables
      }

      function getMaxPreparedColumnSize () {
        return maxPreparedColumnSize
      }

      function setMaxPreparedColumnSize (m) {
        maxPreparedColumnSize = m
      }

      function getUseUTC () {
        return useUTC
      }

      function setDriverVersion (v) {
        driverVersion = v
        if (driverVersion > 0) {
          tables.setBcpVersion(driverVersion)
        }
      }

      function getDriverVersion () {
        return driverVersion
      }

      function setUseUTC (utc) {
        useUTC = utc
        driverMgr.setUseUTC(utc)
      }

      function getUseNumericString () {
        return useNumericString
      }

      function setUseNumericString (uns) {
        useNumericString = uns
      }

      function procedureMgr () {
        return procedures
      }

      function isClosed () {
        return dead
      }

      function close (immediately, callback) {
        if (dead) {
          return
        }

        // require only callback
        if (typeof immediately === 'function') {
          callback = immediately
        } else if (typeof immediately !== 'boolean' && immediately !== undefined) {
          throw new Error('[msnodesql] Invalid parameters passed to close.')
        }

        callback = callback || defaultCallback

        dead = true
        driverMgr.close(err => {
          setImmediate(() => {
            driverMgr.emptyQueue()
            callback(err, null)
          })
        })
      }

      function queryRawNotify (notify, queryOrObj, chunky) {
        const queryObj = notifier.validateQuery(queryOrObj, useUTC, 'queryRaw')
        if (!Object.hasOwnProperty.call(queryObj, 'numeric_string')) {
          queryObj.numeric_string = useNumericString
        }
        driverMgr.readAllQuery(notify, queryObj, chunky.params, chunky.callback)
      }

      function queryNotify (notify, queryOrObj, chunky) {
        notifier.validateQuery(queryOrObj, useUTC, 'query')

        const onQueryRaw = (err, results, more) => {
          if (chunky.callback) {
            if (err) {
              chunky.callback(err, null, more)
            } else {
              chunky.callback(err, driverMgr.objectify(results), more)
            }
          }
        }

        if (chunky.callback) {
          return queryRawNotify(notify, queryOrObj, notifier.getChunkyArgs(chunky.params, (err, results, more) => {
            setImmediate(() => {
              onQueryRaw(err, results, more)
            })
          }))
        } else {
          queryRawNotify(notify, queryOrObj, chunky)
        }
      }

      function getNotify (queryOrObj) {
        const qid = nextQueryId++
        const notify = new notifier.StreamEvents()
        notify.setQueryId(qid)
        notify.setConn(inst)
        notify.setQueryObj(queryOrObj)
        return notify
      }

      function queryRaw (queryOrObj, paramsOrCallback, callback) {
        if (dead) {
          throw new Error('[msnodesql] Connection is closed.')
        }

        const notify = getNotify(queryOrObj)
        const chunky = notifier.getChunkyArgs(paramsOrCallback, callback)
        if (!chunky.callback) {
          queryRawNotify(notify, queryOrObj, chunky)
        } else {
          queryRawNotify(notify, queryOrObj, notifier.getChunkyArgs(chunky.params, (err, results, more) => {
            setImmediate(() => {
              chunky.callback(err, results, more)
            })
          }))
        }
        return notify
      }

      function query (queryOrObj, paramsOrCallback, callback) {
        if (dead) {
          throw new Error('[msnodesql] Connection is closed.')
        }
        const notify = getNotify(queryOrObj)
        const chunky = notifier.getChunkyArgs(paramsOrCallback, callback)
        queryNotify(notify, queryOrObj, chunky)
        return notify
      }

      function beginTransaction (callback) {
        if (dead) {
          throw new Error('[msnodesql] Connection is closed.')
        }
        callback = callback || defaultCallback

        driverMgr.beginTransaction(callback)
      }

      function cancelQuery (notify, callback) {
        if (dead) {
          throw new Error('[msnodesql] Connection is closed.')
        }

        const qo = notify.getQueryObj()
        const polling = qo.query_polling || false
        callback = callback || defaultCallback
        const paused = notify.isPaused()
        const canCancel = paused || polling
        if (!canCancel) {
          setImmediate(() => {
            callback(new Error('Error: [msnodesql] cancel only supported for statements where polling is enabled.'))
          })
        } else {
          driverMgr.cancel(notify, (e) => {
            notify.emit('done')
            callback(e, null)
          })
        }
      }

      function commit (callback) {
        if (dead) {
          throw new Error('[msnodesql] Connection is closed.')
        }

        callback = callback || defaultCallback

        driverMgr.commit(callback)
      }

      function rollback (callback) {
        if (dead) {
          throw new Error('[msnodesql] Connection is closed.')
        }

        callback = callback || defaultCallback

        driverMgr.rollback(callback)
      }

      // inform driver to prepare the sql statement and reserve it for repeated use with parameters.

      function prepare (queryOrObj, callback) {
        const notify = getNotify(queryOrObj)
        notify.setPrepared()
        const chunky = notifier.getChunkyArgs(callback)
        const queryObj = notifier.validateQuery(queryOrObj, useUTC, 'prepare')

        if (!Object.hasOwnProperty.call(queryObj, 'numeric_string')) {
          queryObj.numeric_string = useNumericString
        }
        if (!Object.hasOwnProperty.call(queryObj, 'max_prepared_column_size')) {
          if (maxPreparedColumnSize) {
            queryObj.max_prepared_column_size = maxPreparedColumnSize
          }
        }

        const onPrepare = (err, meta) => {
          const prepared = new PreparedStatement(notifier, driverMgr, queryObj.query_str, inst, notify, meta)
          chunky.callback(err, prepared)
        }

        driverMgr.prepare(notify, queryObj, onPrepare)

        return notify
      }

      function callproc (name, paramsOrCb, cb) {
        return procedures.callproc(name, paramsOrCb, cb)
      }

      // returns a promise of aggregated results not a query
      function callprocAggregator (name, params, options) {
        return this.promises.callProc(name, params, options)
      }

      this.id = id

      this.setUseNumericString = setUseNumericString
      this.getUseNumericString = getUseNumericString
      this.getUserTypeTable = getUserTypeTable
      this.cancelQuery = cancelQuery
      this.queryNotify = queryNotify
      this.queryRaw = queryRaw
      this.queryRawNotify = queryRawNotify
      this.close = close
      this.query = query
      this.beginTransaction = beginTransaction
      this.commit = commit
      this.rollback = rollback
      this.tableMgr = tableMgr
      this.procedureMgr = procedureMgr
      this.prepare = prepare
      this.getUseUTC = getUseUTC
      this.setUseUTC = setUseUTC
      this.getMaxPreparedColumnSize = getMaxPreparedColumnSize
      this.setMaxPreparedColumnSize = setMaxPreparedColumnSize
      this.getNotify = getNotify
      this.callproc = callproc
      this.callprocAggregator = callprocAggregator
      this.setSharedCache = setSharedCache
      this.isClosed = isClosed
      this.setDriverVersion = setDriverVersion
      this.getDriverVersion = getDriverVersion

      const tables = new tableModule.TableMgr(this, sqlMeta, userTypes, tableCache)
      const procedures = new procedureModule.ProcedureMgr(this, notifier, driverMgr, sqlMeta, procedureCache)
      this.promises = new ConnectionWrapperPromises(this)
    }
  }

  let nextID = 0

  function getConnectObject (p) {
    return typeof (p) === 'string'
      ? {
          conn_str: p,
          connect_timeout: 0
        }
      : p
  }

  function openFrom (parentFn, params, callback) {
    const c = new PrivateConnection(parentFn, getConnectObject(params), callback, nextID)
    nextID += 1
    c.open()

    return c.connection
  }

  function queryCloseOnDone (fn, action, connectDetails, queryOrObj, paramsOrCallback, callback) {
    let thisConn
    const nf = new notifyModule.NotifyFactory()
    const args = nf.getChunkyArgs(paramsOrCallback, callback)
    const notify = new nf.StreamEvents()

    const complete = (err, res, more) => {
      if (!more && thisConn !== null) {
        thisConn.close(() => {
          notify.emit('closed', notify.getQueryId())
          if (args.callback !== null) {
            args.callback(err, res, more)
          }
        })
      } else {
        if (args.callback !== null) {
          args.callback(err, res, more)
        }
      }
    }

    const args2 = {
      params: args.params,
      callback: complete
    }

    const go = (err, conn) => {
      notify.setConn(conn)
      notify.setQueryObj(queryOrObj)
      thisConn = conn
      notify.emit('open', notify.getQueryId())
      if (err) {
        args2.callback(err, null)
      } else {
        action(conn, notify, args2)
      }
    }

    nf.validateQuery(queryOrObj, true, fn)
    openFrom(fn, connectDetails, go)
    return notify
  }

  function query (connectDetails, queryOrObj, paramsOrCallback, callback) {
    return queryCloseOnDone('query', (conn, notify, args) => conn.queryNotify(notify, queryOrObj, args), connectDetails, queryOrObj, paramsOrCallback, callback)
  }

  function queryRaw (connectDetails, queryOrObj, paramsOrCallback, callback) {
    return queryCloseOnDone('queryRaw', (conn, notify, args) => conn.queryRawNotify(notify, queryOrObj, args), connectDetails, queryOrObj, paramsOrCallback, callback)
  }

  function open (params, callback) {
    return openFrom('open', params, callback)
  }

  class SqlPromises {
    query (connStr, sql, params, options) {
      return new Promise((resolve, reject) => {
        this.open(connStr)
          .then(connection => {
            connection.promises.query(sql, params, options)
              .then(results => {
                connection.promises.close()
                  .then(() => {
                    resolve(results)
                  }).catch(err => {
                    reject(err)
                  })
              }).catch(err => {
                reject(err)
              })
          }).catch(err => {
            reject(err)
          })
      })
    }

    callProc (connStr, name, params, options) {
      return new Promise((resolve, reject) => {
        this.open(connStr)
          .then(connection => {
            connection.promises.callProc(name, params, options)
              .then(results => {
                connection.promises.close()
                  .then(() => {
                    resolve(results)
                  }).catch(err => {
                    reject(err)
                  })
              }).catch(err => {
                reject(err)
              })
          }).catch(err => {
            reject(err)
          })
      })
    }

    constructor () {
      this.open = util.promisify(open)
    }
  }

  const promises = new SqlPromises(this)
  return {
    meta: sqlMeta,
    userTypes,
    query,
    queryRaw,
    open,
    promises
  }
})())

exports.connectionModule = connectionModule
class ServerDialect {
  constructor (name) {
    this.name = name
  }

  static Sybase = new ServerDialect('Sybase')
  static SqlServer = new ServerDialect('SqlServer')
}

module.exports = {
  ServerDialect
}
/* global: bindQuery */

'use strict'

const driverModule = ((() => {
  const readerModule = require('./reader').readerModule
  const queueModule = require('./queue').queueModule

  function DriverMgr (sql) {
    const driverCommandEnum = {
      CANCEL: 10,
      COMMIT: 11,
      ROLLBACK: 12,
      BEGIN_TRANSACTION: 13,
      PREPARE: 14,
      FREE_STATEMENT: 15,
      QUERY: 16,
      CLOSE: 17,
      UNBIND: 18
    }

    const cppDriver = sql
    const workQueue = new queueModule.WorkQueue()
    const reader = new readerModule.DriverRead(cppDriver, workQueue)

    function setUseUTC (utc) {
      reader.setUseUTC(utc)
    }

    function emptyQueue () {
      workQueue.emptyQueue()
    }

    function close (callback) {
      workQueue.enqueue(driverCommandEnum.CLOSE, () => {
        cppDriver.close(() => {
          callback()
        })
      }, [])
    }

    function execCancel (qid, queueItem, callback) {
      // send cancel directly to driver.
      const args = queueItem.args
      const cb = args[3]
      const peek = workQueue.peek()

      function forwardCancel (err) {
        setImmediate(() => {
          if (err && err.length > 0) {
            callback(err[0])
          } else {
            callback(null)
          }
        })
      }

      if (queueItem.operationId === peek.operationId) {
        cppDriver.pollingMode(qid, true, () => {
          cppDriver.cancelQuery(qid, (e) => {
            forwardCancel(e)
          })
        })
      } else {
        workQueue.dropItem(queueItem)
        setImmediate(() => {
          // make a callback on the cancel request with no error.
          callback(null)
          // invoke the listener as if this has come from driver so user query callback can be invoked.
          if (cb) cb(new Error('Error: [msnodesql] (query removed from q) Operation canceled'))
        })
      }
      return true
    }

    // if this relates to the active query being executed then immediately send
    // the cancel, else the query can be removed from the queue and never submitted to the driver.

    function cancel (notify, callback) {
      const qid = notify.getQueryId()
      if (workQueue.length() === 0) {
        setImmediate(() => {
          callback(new Error(`Error: [msnodesql] cannot cancel query (empty queue) id ${qid}`))
        })
        return
      }

      const first = workQueue.first((_idx, currentItem) => {
        if (currentItem.commandType !== driverCommandEnum.QUERY) {
          return false
        }
        const args = currentItem.args
        const not = args[0]
        const currentQueryId = not.getQueryId()
        return qid === currentQueryId
      })

      if (first) {
        if (first.paused) {
          execCancel(qid, first, () => {
            freeStatement(notify, () => {
              workQueue.dropItem(first)
              callback(null)
            })
          })
        } else {
          execCancel(qid, first, callback)
        }
      } else {
        setImmediate(() => {
          callback(new Error(`Error: [msnodesql] cannot cancel query (not found) id ${qid}`))
        })
      }
    }

    function objectify (results) {
      const names = {}

      const lim = results.meta
        ? results.meta.length
        : 0

      for (let idx = 0; idx < lim; idx += 1) {
        const meta = results.meta[idx]
        const name = meta.name
        if (name !== '' && !names[name]) {
          names[name] = idx
        } else {
          let extra = 0
          let candidate = `Column${idx}`
          while (names[candidate]) {
            candidate = `Column${idx}_${extra}`
            extra += 1
          }
          names[candidate] = idx
        }
      }

      const rows = []
      if (results.rows) {
        results.rows.forEach(row => {
          const value = {}
          Object.keys(names).forEach(name => {
            if (Object.prototype.hasOwnProperty.call(names, name)) {
              value[name] = row[names[name]]
            }
          })
          rows.push(value)
        })
      }

      return rows
    }

    function freeStatement (notify, callback) {
      const queryId = notify.getQueryId()
      if (queryId >= 0) {
        workQueue.enqueue(driverCommandEnum.FREE_STATEMENT, () => {
          cppDriver.freeStatement(queryId, () => {
            setImmediate(() => {
              callback(null, queryId)
              setImmediate(() => {
                notify.emit('free', queryId)
                workQueue.nextOp()
              })
            })
          })
        }, [])
      } else {
        setImmediate(() => {
          callback(null, queryId)
          setImmediate(() => {
            notify.emit('free', queryId)
            workQueue.nextOp()
          })
        })
      }
    }

    function onStatementComplete (notify, outputParams, callback, results, more) {
      if (!more) {
        freeStatement(notify, () => {
          if (callback) {
            callback(null, results, more, outputParams)
          }
        })
      } else {
        if (callback) {
          callback(null, results, more, outputParams)
        }
      }
    }

    // for a stored procedure, the out parameters / return value can
    // only be unbound when rest of query completes. The output params
    // will now be ready to fetch out of the statement.

    function beginTransaction (callback) {
      workQueue.enqueue(driverCommandEnum.BEGIN_TRANSACTION, () => {
        cppDriver.beginTransaction(err => {
          setImmediate(() => {
            callback(err || null, false)
            setImmediate(() => {
              workQueue.nextOp()
            })
          })
        })
      }, [])
    }

    function rollback (callback) {
      workQueue.enqueue(driverCommandEnum.ROLLBACK, () => {
        cppDriver.rollback(err => {
          callback(err || null, false)
          setImmediate(() => {
            workQueue.nextOp()
          })
        })
      }, [])
    }

    function commit (callback) {
      workQueue.enqueue(driverCommandEnum.COMMIT, () => {
        cppDriver.commit(err => {
          setImmediate(() => {
            callback(err || null, false)
            setImmediate(() => {
              workQueue.nextOp()
            })
          })
        })
      }, [])
    }

    function prepare (notify, queryOrObj, callback) {
      workQueue.enqueue(driverCommandEnum.PREPARE, () => {
        cppDriver.prepare(notify.getQueryId(), queryOrObj, (err, meta) => {
          callback(err, meta)
          workQueue.nextOp()
        })
      }, [])
    }

    function readAllPrepared (notify, queryObj, params, cb) {
      notify.setOperation(workQueue.enqueue(driverCommandEnum.QUERY,
        (notify, query, params, callback) => {
          setImmediate(() => {
            const q = reader.getQuery(notify, query, params, {
              begin: (queryId, query, params, callback) => {
                cppDriver.bindQuery(queryId, params, (err, meta) => {
                  if (callback) {
                    callback(err, meta)
                  }
                })
              },
              end: (queryId, outputParams, callback, results, more) => {
                if (callback) {
                  callback(null, results, more, outputParams)
                }
              }
            }, callback)
            notify.setQueryWorker(q)
            q.begin()
          })
        }, [notify, queryObj, params, cb]))
    }

    function read (notify, queryObj, params, cb) {
      notify.setOperation(workQueue.enqueue(driverCommandEnum.QUERY, (notify, query, params, callback) => {
        setImmediate(() => {
          const q = reader.getQuery(notify, query, params, {
            begin: (queryId, query, params, callback) => cppDriver.query(queryId, query, params, (err, results, more) => {
              if (callback) {
                callback(err, results, more)
              }
            }),
            end: (not, outputParams, callback, results, endMore) => {
              onStatementComplete(not, outputParams, callback, results, endMore)
            }
          }, callback)
          notify.setQueryWorker(q)
          q.begin()
        })
      }, [notify, queryObj, params, cb]))
    }

    function readAllQuery (notify, queryObj, params, cb) {
      // if paused at head of q then kill this statement to allow driver to set up this one
      const peek = workQueue.peek()
      if (peek && peek.paused) {
        const pausedNotify = peek.args[0]
        freeStatement(pausedNotify, () => {
          workQueue.dropItem(peek)
          read(notify, queryObj, params, cb)
        })
      } else {
        read(notify, queryObj, params, cb)
      }
    }

    function realAllProc (notify, queryObj, params, cb) {
      notify.setOperation(workQueue.enqueue(driverCommandEnum.QUERY,
        (notify, query, params, callback) => {
          setImmediate(() => {
            const q = reader.getQuery(notify, query, params, {
              begin: (queryId, procedure, params, callback) => {
                cppDriver.callProcedure(queryId, procedure, params, (err, results, params) => {
                  if (callback) {
                    callback(err, results, params)
                  }
                })
              },
              // for a stored procedure with multiple statements, only unbind after all
              // statements are completed
              end: (not, outputParams, callback, results, endMore) => {
                if (!endMore) {
                  const qid = not.getQueryId()
                  workQueue.enqueue(driverCommandEnum.UNBIND, (a) => {
                    setImmediate(() => {
                      cppDriver.unbind(qid, (err, outputVector) => {
                        if (err && callback) {
                          callback(err, results)
                        }
                        not.emit('output', outputVector)
                        onStatementComplete(not, outputVector, callback, results, a)
                        if (!a) {
                          workQueue.nextOp()
                        }
                      })
                    }, [endMore])
                  })
                } else {
                  onStatementComplete(not, null, callback, results, endMore)
                }
              }
            }, callback)
            notify.setQueryWorker(q)
            q.begin()
          })
        }, [notify, queryObj, params, cb]))
    }

    return {
      setUseUTC,
      cancel,
      commit,
      rollback,
      beginTransaction,
      prepare,
      objectify,
      freeStatement,
      readAllQuery,
      realAllProc,
      readAllPrepared,
      emptyQueue,
      close
    }
  }

  return {
    DriverMgr
  }
})())

exports.driverModule = driverModule
'use strict'

const metaModule = (() => {
  const fs = require('fs')
  const path = require('path')

  class FileReader {
    constructor (file) {
      let resolvedSql

      function readFile (f) {
        return new Promise((resolve, reject) => {
          fs.readFile(f, 'utf8', (err, contents) => {
            if (err) {
              reject(err)
            } else {
              resolve(contents)
            }
          })
        })
      }

      function resolve () {
        return new Promise((resolve, reject) => {
          if (!resolvedSql) {
            const p = path.join(__dirname, 'queries', file)
            readFile(p).then(sql => {
              resolvedSql = sql
              resolve(resolvedSql)
            }).catch(e => {
              reject(e)
            })
          } else {
            resolve(resolvedSql)
          }
        })
      }

      function query (conn, mapFn) {
        const inst = this
        return new Promise((resolve, reject) => {
          inst.resolve().then(sql => {
            sql = mapFn ? mapFn(sql) : sql
            conn.query(sql, (err, results) => {
              if (err) {
                reject(err)
              } else {
                resolve(results)
              }
            })
          }).catch(e => {
            reject(e)
          })
        })
      }
      this.query = query
      this.resolve = resolve
    }
  }

  class Meta {
    constructor () {
      this.describeProc = new FileReader('proc_describe.sql')
      this.describeServerVersion = new FileReader('server_version.sql')
      this.describeTableType = new FileReader('user_type.sql')
      this.describeTable = new FileReader('table_describe.sql')
      this.describeTable2014 = new FileReader('table_describe.2014.sql')
    }

    getUserType (conn, userTypeName, mapFn) {
      return new Promise((resolve, reject) => {
        this.describeTableType.query(conn, mapFn).then(typeResults => {
          typeResults.forEach(col => {
            col.type = {
              declaration: col.declaration,
              length: col.length
            }
          })
          resolve(typeResults)
        }).catch(err => {
          reject(err)
        })
      })
    }

    getProcedureDefinition (conn, procedureName, mapFn) {
      return this.describeProc.query(conn, mapFn)
    }

    getServerVersionRes (conn) {
      return this.describeServerVersion.query(conn)
    }

    getTableDefinition (conn, majorVersion, mapFn) {
      const target = majorVersion <= 2014 ? this.describeTable2014 : this.describeTable
      return target.query(conn, mapFn)
    }
  }

  return {
    Meta
  }
})()

/*
    provide support to fetch table and procedure meta data, injected into procedure manager and tableManager
  */

exports.metaModule = metaModule
/**
 * Created by Stephen on 28/06/2017.
 */

'use strict'

const notifyModule = ((() => {
  const events = require('events')
  const { EventEmitter } = require('stream')

  function NotifyFactory () {
    class StreamEvents extends EventEmitter {
      constructor () {
        super()
        let queryId = 0
        let theConnection
        let queryObj
        let queryWorker
        let operation
        let paused
        let prepared

        function isPaused () {
          return paused
        }

        function setPrepared () {
          prepared = true
        }

        function isPrepared () {
          return prepared
        }

        function getQueryObj () {
          return queryObj
        }

        function getQueryId () {
          return queryId
        }

        function setQueryId (qid) {
          queryId = qid
        }

        function setOperation (id) {
          operation = id
        }

        function getOperation () {
          return operation
        }

        function setQueryObj (qo) {
          queryObj = qo
        }

        function setConn (c) {
          theConnection = c
        }

        function setQueryWorker (qw) {
          queryWorker = qw
          if (paused) {
            queryWorker.pause()
          }
        }

        function cancelQuery (cb) {
          if (theConnection) {
            theConnection.cancelQuery(this, cb)
          } else {
            setImmediate(() => {
              cb(new Error('[msnodesql] cannot cancel query where setConn has not been set'))
            })
          }
        }

        function pauseQuery () {
          paused = true
          if (queryWorker) {
            queryWorker.pause()
          }
        }

        function resumeQuery () {
          paused = false
          if (queryWorker) {
            queryWorker.resume()
          }
        }

        this.setOperation = setOperation
        this.getOperation = getOperation
        this.getQueryObj = getQueryObj
        this.getQueryId = getQueryId
        this.setQueryId = setQueryId
        this.setConn = setConn
        this.setQueryObj = setQueryObj
        this.cancelQuery = cancelQuery
        this.setQueryWorker = setQueryWorker
        this.pauseQuery = pauseQuery
        this.resumeQuery = resumeQuery
        this.isPaused = isPaused
        this.isPrepared = isPrepared
        this.setPrepared = setPrepared

        events.EventEmitter.call(this)
      }
    }

    function getChunkyArgs (paramsOrCallback, callback) {
      if ((typeof paramsOrCallback === 'object' &&
        Array.isArray(paramsOrCallback) === true) &&
        typeof callback === 'function') {
        return { params: paramsOrCallback, callback }
      }

      if (!paramsOrCallback && typeof callback === 'function') {
        return { params: [], callback }
      }

      if (typeof paramsOrCallback === 'function' && callback === undefined) {
        return { params: [], callback: paramsOrCallback }
      }

      if ((typeof paramsOrCallback === 'object' &&
        Array.isArray(paramsOrCallback) === true) &&
        callback === undefined) {
        return { params: paramsOrCallback, callback: null }
      }

      if ((!paramsOrCallback) &&
        callback === undefined) {
        return { params: [], callback: null }
      }

      throw new Error('[msnodesql] Invalid parameter(s) passed to function query or queryRaw.')
    }

    function getQueryObject (p) {
      return typeof (p) === 'string'
        ? {
            query_str: p,
            query_timeout: 0,
            query_polling: false,
            query_tz_adjustment: 0
          }
        : p
    }

    function validateParameters (parameters, funcName) {
      parameters.forEach(p => {
        if (typeof p.value !== p.type) {
          throw new Error(['[msnodesql] Invalid ', p.name, ' passed to function ', funcName, '. Type should be ', p.type, '.'].join(''))
        }
      })
    }

    function validateQuery (queryOrObj, useUTC, parentFn) {
      const queryObj = getQueryObject(queryOrObj, useUTC)
      validateParameters(
        [
          {
            type: 'string',
            value: queryObj.query_str,
            name: 'query string'
          }
        ],
        parentFn
      )
      return queryObj
    }

    return {
      StreamEvents,
      validateParameters,
      getChunkyArgs,
      validateQuery
    }
  }

  return {
    NotifyFactory
  }
})())

exports.notifyModule = notifyModule
'use strict'

const poolModule = (() => {
  const util = require('util')
  const cppDriver = require('../build/Release/sqlserverv8')
  const { EventEmitter } = require('stream')
  const { procedureModule } = require('./procedure')
  const { driverModule } = require('./driver')
  const { connectionModule } = require('./connection')
  const { notifyModule } = require('./notifier')
  const { utilModule } = require('./util')
  const { tableModule } = require('./table')
  const userModule = require('./user').userModule
  const { metaModule } = require('./meta')

  class PoolEventCaster extends EventEmitter {
    constructor () {
      super()
      let queryObj = null
      let paused = false
      let pendingCancel = false

      function isPaused () {
        return paused
      }

      function getQueryObj () {
        return queryObj
      }

      function getQueryId () {
        return queryObj != null ? queryObj : -1
      }

      function isPendingCancel () {
        return pendingCancel
      }

      function cancelQuery (cb) {
        if (queryObj) {
          queryObj.cancelQuery(cb)
        } else {
          pendingCancel = true
          setImmediate(() => {
            if (cb) {
              cb()
            }
          })
        }
      }

      function pauseQuery () {
        paused = true
        if (queryObj) {
          queryObj.pause()
        }
      }

      function resumeQuery () {
        paused = false
        if (queryObj) {
          queryObj.resume()
        }
      }

      function setQueryObj (q, chunky) {
        queryObj = q
        q.on('submitted', (d) => {
          this.emit('submitted', d)
        })

        if (!chunky.callback) {
          q.on('error', (e, more) => {
            if (this.listenerCount('error') > 0) {
              this.emit('error', e, more)
            }
          })
        }

        q.on('done', (r) => {
          this.emit('done', r)
        })

        q.on('row', (r) => {
          this.emit('row', r)
        })

        q.on('column', (i, v) => {
          this.emit('column', i, v)
        })

        q.on('meta', (m) => {
          this.emit('meta', m)
        })

        q.on('info', (e) => {
          this.emit('info', e)
        })

        q.on('output', (e) => {
          this.emit('output', e)
        })
      }

      function isPrepared () {
        return false
      }

      this.isPendingCancel = isPendingCancel
      this.getQueryObj = getQueryObj
      this.getQueryId = getQueryId
      this.setQueryObj = setQueryObj
      this.cancelQuery = cancelQuery
      this.pauseQuery = pauseQuery
      this.resumeQuery = resumeQuery
      this.isPaused = isPaused
      this.isPrepared = isPrepared
    }
  }

  class PoolPromises {
    constructor (pool) {
      this.open = util.promisify(pool.open)
      this.close = util.promisify(pool.close)
      this.query = pool.queryAggregator
      this.callProc = pool.callprocAggregator
      this.getUserTypeTable = pool.getUserTypeTable
      this.getTable = pool.getTable
      this.getProc = pool.getProc
    }
  }

  class Pool extends EventEmitter {
    constructor (opt) {
      super()
      const openPromise = connectionModule.promises.open
      const idle = []
      const parked = []
      const workQueue = []
      const pause = []
      let busyConnectionCount = 0
      let parkingConnectionCount = 0
      let opened = false
      let hbTimer = null
      let pollTimer = null
      const _this = this
      let descriptionId = 0
      let commandId = 0
      let pendingCreates = 0
      let closed = false
      const heartbeatTickMs = 250
      const notifierFactory = new notifyModule.NotifyFactory()
      const poolProcedureCache = {}
      const poolTableCache = {}
      const aggregator = new utilModule.QueryAggregator(this)
      const userTypes = new userModule.SqlTypes()
      const sqlMeta = new metaModule.Meta()
      const native = new cppDriver.Connection()
      const driverMgr = new driverModule.DriverMgr(native)
      const tableMgr = new tableModule.TableMgr(this, sqlMeta, userTypes, poolTableCache)
      const procedureManager = new procedureModule.ProcedureMgr(this, notifierFactory, driverMgr, sqlMeta, poolProcedureCache)
      const promisesGetProc = util.promisify(procedureManager.getProc)
      const closedError = new Error('pool is closed.')

      function getOpt (src, p, def) {
        if (!src) {
          return def
        }
        let ret
        if (Object.hasOwnProperty.call(src, p)) {
          ret = src[p]
        } else {
          ret = def
        }
        return ret
      }

      function parseOptions () {
        const options = {
          floor: Math.max(0, getOpt(opt, 'floor', 0)),
          ceiling: Math.max(1, getOpt(opt, 'ceiling', 4)),
          heartbeatSecs: Math.max(1, getOpt(opt, 'heartbeatSecs', 20)),
          heartbeatSql: getOpt(opt, 'heartbeatSql', 'select @@SPID as spid'),
          inactivityTimeoutSecs: Math.max(3, getOpt(opt, 'inactivityTimeoutSecs', 60)),
          connectionString: getOpt(opt, 'connectionString', ''),
          useUTC: getOpt(opt, 'useUTC', null),
          useNumericString: getOpt(opt, 'useNumericString', null),
          maxPreparedColumnSize: getOpt(opt, 'maxPreparedColumnSize', null)
        }

        options.floor = Math.min(options.floor, options.ceiling)
        options.inactivityTimeoutSecs = Math.max(options.inactivityTimeoutSecs, options.heartbeatSecs)
        return options
      }

      const options = parseOptions()

      function getUseUTC () {
        return options.useUTC
      }

      function setUseUTC (utc) {
        options.useUTC = utc
      }

      function newDescription (c) {
        return {
          id: descriptionId++,
          pool: this,
          connection: c,
          heartbeatSqlResponse: null,
          lastActive: new Date(),
          lastWorkItem: null,
          keepAliveCount: 0,
          recreateCount: 0,
          parkedCount: 0,
          queriesSent: 0,
          totalElapsedQueryMs: 0
        }
      }

      function parkedDescription (c) {
        if (parked.length > 0) {
          const d = parked.pop()
          d.connection = c
          d.lastWorkItem = null
          d.heartbeatSqlResponse = null
          d.lastActive = new Date()
          d.keepAliveCount = 0
          return d
        } else {
          return null
        }
      }

      function getDescription (c) {
        return parkedDescription(c) || newDescription(c)
      }

      function callTheCall (begin, theCall, description, work) {
        const q = theCall(work.sql, work.paramsOrCallback, work.callback)
        work.poolNotifier.setQueryObj(q, work.chunky)
        q.on('submitted', () => {
          _this.emit('debug', `[${description.id}] submitted work id ${work.id}`)
          _this.emit('submitted', q)
          description.work = work
          setImmediate(() => {
            crank()
          })
        })

        q.on('free', () => {
          description.totalElapsedQueryMs += new Date() - begin
          checkin('work', description)
          _this.emit('debug', `[${description.id}] free work id ${work.id}`)
          work.poolNotifier.emit('free')
          setImmediate(() => {
            crank()
          })
        })

        q.on('error', (e, more) => {
          sendError(e, more)
          setImmediate(() => {
            crank()
          })
        })
      }

      function getTheCall (description, work) {
        let theCall = null
        switch (work.workType) {
          case workTypeEnum.QUERY:
            theCall = description.connection.query
            break

          case workTypeEnum.RAW:
            theCall = description.connection.queryRaw
            break

          case workTypeEnum.PROC:
            theCall = description.connection.callproc
            break
        }
        return theCall
      }

      function item (description, work) {
        const begin = new Date()
        description.lastActive = begin
        description.keepAliveCount = 0
        description.queriesSent++
        _this.emit('debug', `[${description.id}] query work id = ${work.id}, workQueue = ${workQueue.length}`)
        const theCall = getTheCall(description, work)
        if (theCall) {
          callTheCall(begin, theCall, description, work)
        }
      }

      function doneFree (poolNotifier) {
        poolNotifier.emit('done')
        poolNotifier.emit('free')
      }

      function promotePause () {
        const add = []
        const start = pause.length
        while (pause.length > 0) {
          const item = pause.pop()
          if (item.isPaused) {
            add.unshift(item)
          } else {
            workQueue.push(item)
          }
        }
        while (add.length > 0) {
          pause.unshift(add.pop())
        }
        if (start !== pause.length) {
          setImmediate(() => crank())
        }
      }

      function poll () {
        if (pause.length + workQueue.length > 0) {
          crank()
        }
      }

      function crank () {
        if (closed) {
          return
        }
        grow().then(() => {
          promotePause()
          while (workQueue.length > 0 && idle.length > 0) {
            const work = workQueue.pop()
            if (work.poolNotifier.isPendingCancel()) {
              _this.emit('debug', `query work id = ${work.id} has been cancelled waiting in pool to execute, workQueue = ${workQueue.length}`)
              doneFree(work.poolNotifier)
            } else if (work.poolNotifier.isPaused()) {
              pause.unshift(work)
            } else {
              const description = checkout('work')
              item(description, work)
            }
          }
        })
      }

      const workTypeEnum = {
        QUERY: 10,
        RAW: 11,
        PROC: 12
      }

      function chunk (paramsOrCallback, callback, workType) {
        switch (workType) {
          case workTypeEnum.QUERY:
          case workTypeEnum.RAW:
            return notifierFactory.getChunkyArgs(paramsOrCallback, callback)

          case workTypeEnum.PROC:
            return { params: paramsOrCallback, callback }
        }
      }

      function newWorkItem (sql, paramsOrCallback, callback, notifier, workType) {
        return {
          id: commandId++,
          sql,
          paramsOrCallback,
          callback,
          poolNotifier: notifier,
          workType,
          chunky: chunk(paramsOrCallback, callback, workType)
        }
      }

      function checkClosedPromise () {
        return new Promise((resolve, reject) => {
          if (closed) {
            reject(closedError)
          } else {
            resolve(null)
          }
        })
      }

      function submit (sql, paramsOrCallback, callback, type) {
        const notifier = new PoolEventCaster()
        const work = newWorkItem(sql, paramsOrCallback, callback, notifier, type)
        if (!closed) {
          enqueue(work)
        } else {
          if (work.chunky.callback) {
            setImmediate(() => {
              work.chunky.callback(closedError)
            })
          } else {
            sendError(closedError)
            setImmediate(() => {
              notifier.emit('error', closedError)
              doneFree(notifier)
            })
          }
        }
        return notifier
      }

      function query (sql, paramsOrCallback, callback) {
        return submit(sql, paramsOrCallback, callback, workTypeEnum.QUERY)
      }

      function queryRaw (sql, paramsOrCallback, callback) {
        return submit(sql, paramsOrCallback, callback, workTypeEnum.RAW)
      }

      function callproc (sql, paramsOrCallback, callback) {
        return submit(sql, paramsOrCallback, callback, workTypeEnum.PROC)
      }

      function getUserTypeTable (name) {
        // the table mgr will submit query into pool as if its a connection
        return checkClosedPromise().then(() => tableMgr.promises.getUserTypeTable(name))
      }

      function getTable (name) {
        return checkClosedPromise().then(() => tableMgr.promises.getTable(name))
      }

      function getProc (name) {
        return checkClosedPromise().then(() => promisesGetProc(name))
      }

      // returns a promise of aggregated results not a query
      function callprocAggregator (name, params, options) {
        return checkClosedPromise().then(() => aggregator.callProc(name, params, options))
      }

      function queryAggregator (sql, params, options) {
        return checkClosedPromise().then(() => aggregator.query(sql, params, options))
      }

      function enqueue (item) {
        if (closed) {
          return
        }
        workQueue.unshift(item)
        if (opened) {
          setImmediate(() => {
            crank()
          })
        }
      }

      function getStatus (work, activity, op) {
        const s = {
          time: new Date(),
          parked: parked.length,
          idle: idle.length,
          busy: busyConnectionCount,
          pause: pause.length,
          parking: parkingConnectionCount,
          workQueue: workQueue.length,
          activity,
          op
        }
        if (work) {
          s.lastSql = work.sql
          s.lastParams = work.chunky.params
        }
        return s
      }

      function checkin (activity, description) {
        if (closed) {
          return
        }
        idle.unshift(description)
        if (busyConnectionCount > 0) {
          busyConnectionCount--
        }
        _this.emit('status', getStatus(description.work, activity, 'checkin'))
        description.work = null
        _this.emit('debug', `[${description.id}] checkin idle = ${idle.length}, parking = ${parkingConnectionCount}, parked = ${parked.length}, busy = ${busyConnectionCount}, pause = ${pause.length}, workQueue = ${workQueue.length}`)
      }

      function checkout (activity) {
        if (idle.length === 0) {
          return null
        }
        const description = idle.pop()
        busyConnectionCount++
        _this.emit('status', getStatus(null, activity, 'checkout'))
        _this.emit('debug', `[${description.id}] checkout idle = ${idle.length}, parking = ${parkingConnectionCount}, parked = ${parked.length}, busy = ${busyConnectionCount}, pause = ${pause.length}, workQueue = ${workQueue.length}`)
        return description
      }

      async function grow () {
        if (closed) {
          return
        }
        const existing = idle.length + busyConnectionCount + pendingCreates + parkingConnectionCount

        if (existing === options.ceiling) {
          return
        }

        function connectionOptions (c) {
          c.setSharedCache(poolProcedureCache, poolTableCache)
          if (options.maxPreparedColumnSize) {
            c.setMaxPreparedColumnSize(options.maxPreparedColumnSize)
          }
          if (options.useUTC === true || options.useUTC === false) {
            c.setUseUTC(options.useUTC)
          }
          if (options.useNumericString === true || options.useNumericString === false) {
            c.setUseNumericString(options.useUTC)
          }
        }

        const toPromise = []
        for (let i = existing; i < options.ceiling; ++i) {
          ++pendingCreates
          toPromise.push(openPromise(options.connectionString)
            .then(
              c => {
                --pendingCreates
                connectionOptions(c)
                checkin('grow', getDescription(c))
              },
              e => {
                --pendingCreates
                return Promise.reject(e)
              }
            )
          )
        }

        const res = await Promise.all(toPromise)
        _this.emit('debug', `grow creates ${res.length} connections for pool idle = ${idle.length}, busy = ${busyConnectionCount}, pending = ${pendingCreates}, parkingConnectionCount = ${parkingConnectionCount}, existing = ${existing}`)
      }

      function open (cb) {
        if (opened) {
          return
        }
        grow().then(() => {
          if (cb) {
            cb(null, options)
          }

          if (options.heartbeatSecs) {
            hbTimer = setInterval(() => {
              park()
              heartbeat()
            }, heartbeatTickMs, _this)
            crank()
          }
          pollTimer = setInterval(() => {
            poll()
          }, 200, _this)
          opened = true
          _this.emit('open', options)
        }).catch(e => {
          if (cb) {
            cb(e, null)
          }
          sendError(e)
        })
      }

      function park () {
        const toParkIndex = idle.findIndex(description => {
          const inactivePeriod = description.keepAliveCount * options.heartbeatSecs
          return inactivePeriod >= options.inactivityTimeoutSecs
        })
        if (toParkIndex === -1) {
          return
        }
        const description = idle[toParkIndex]
        if (parkDescription(description)) {
          idle.splice(toParkIndex, 1)
        }
      }

      function promoteToFront (index) {
        if (index < 0 || index >= idle.length) {
          return
        }
        const description = idle[index]
        idle.splice(index, 1)
        idle.push(description)
      }

      function sendError (e, more) {
        if (_this.listenerCount('error') > 0) {
          _this.emit('error', e, more)
        }
      }

      function heartbeat () {
        const toHeartBeatIndex = idle.findIndex(d => new Date() - d.lastActive >= options.heartbeatSecs * 1000)
        if (toHeartBeatIndex === -1) {
          return
        }
        promoteToFront(toHeartBeatIndex)
        const description = checkout('heartbeat')
        const q = description.connection.query(options.heartbeatSql)
        q.on('column', (i, v) => {
          description.heatbeatSqlResponse = v
        })
        q.on('done', () => {
          description.keepAliveCount++ // reset by user query
          description.lastActive = new Date()
          checkin('heartbeat', description)
          const inactivePeriod = description.keepAliveCount * options.heartbeatSecs
          _this.emit('debug', `[${description.id}] heartbeat response = '${description.heatbeatSqlResponse}', ${description.lastActive.toLocaleTimeString()}` +
            `, keepAliveCount = ${description.keepAliveCount} inactivePeriod = ${inactivePeriod}, inactivityTimeoutSecs = ${options.inactivityTimeoutSecs}`)
        })
        q.on('error', (e) => {
          sendError(e)
          recreate(description)
        })
      }

      function parkDescription (description) {
        // need to leave at least floor connections in idle pool
        const canPark = Math.max(0, idle.length - options.floor)
        if (canPark === 0) {
          return false
        }
        _this.emit('debug', `[${description.id}] close connection and park due to inactivity parked = ${parked.length}, canPark = ${canPark}`)
        parkingConnectionCount++
        const promisedClose = description.connection.promises.close
        promisedClose().then(() => {
          parkingConnectionCount--
          description.connection = null
          description.parkedCount++
          description.keepAliveCount = 0
          parked.unshift(description)
          _this.emit('debug', `[${description.id}] closed connection and park due to inactivity parked = ${parked.length}, idle = ${idle.length}, busy = ${busyConnectionCount}`)
          _this.emit('status', getStatus(null, 'parked', 'parked'))
        }).catch(e => {
          sendError(e)
        })
        return true
      }

      function recreate (description) {
        _this.emit('debug', `recreate connection [${description.id}]`)
        const toPromise = []
        if (description.connection) {
          const promisedClose = description.connection.promises.close
          toPromise.push(promisedClose)
        }
        Promise.all(toPromise).then(() => {
          openPromise(options.connectionString).then(conn => {
            description.connection = conn
            description.lastActive = new Date()
            description.heartbeatSqlResponse = null
            description.recreateCount++
            checkin('recreate', description)
          }).catch(e => {
            sendError(e)
          })
        })
      }

      function isClosed () {
        return closed
      }

      function close (cb) {
        if (hbTimer) {
          clearInterval(hbTimer)
        }
        if (pollTimer) {
          clearInterval(pollTimer)
        }
        // any parked connection will have been closed
        while (parked.length > 0) {
          parked.pop()
        }

        while (workQueue.length > 0) {
          workQueue.pop()
        }

        const toClosePromise = idle.map(description => description.connection.promises.close)
        Promise.all(toClosePromise).then(res => {
          _this.emit('debug', `closed ${res.length} connections due to pool shutdown busy = ${busyConnectionCount}`)
          _this.emit('close')
          if (cb) {
            cb()
          }
        }).catch(e => {
          if (cb) {
            cb()
          }
          sendError(e)
        }).finally(
          closed = true
        )
      }

      this.open = open
      this.close = close
      this.query = query
      this.queryRaw = queryRaw
      this.callproc = callproc
      this.callprocAggregator = callprocAggregator
      this.getUserTypeTable = getUserTypeTable
      this.getTable = getTable
      this.getProc = getProc
      this.queryAggregator = queryAggregator
      this.promises = new PoolPromises(this)
      this.getUseUTC = getUseUTC
      this.setUseUTC = setUseUTC
      this.isClosed = isClosed
    }
  }

  return {
    Pool
  }
})()

exports.poolModule = poolModule
/**
 * Created by Stephen on 9/27/2015.
 */

'use strict'

const procedureModule = ((() => {
  const { ServerDialect } = require('./dialect')
  class BoundProcedure {
    constructor (connectionDriverMgr, procedureNotifier, theConnection, paramVector, procedureName, pollingEnabled, procedureTimeout) {
      const conn = theConnection
      const driverMgr = connectionDriverMgr
      const notifier = procedureNotifier

      const name = procedureName
      let timeout = procedureTimeout
      let polling = pollingEnabled

      let dialect = ServerDialect.SqlServer

      let meta = constructMeta(name, paramVector)

      function constructMeta (name, paramVector) {
        paramVector = where(paramVector, p => p.object_id !== null)
        const outputParams = where(paramVector, p => p.is_output)
        const inputParams = where(paramVector, p => !p.is_output)

        const signature = buildSignature(paramVector, name)
        const select = asSelect(paramVector, name)
        const summary = summarise(name, paramVector)
        const paramByName = paramVector.reduce((agg, latest) => {
          if (latest.name) {
            agg[latest.name.slice(1)] = latest
          }
          return agg
        }, {})

        return {
          select,
          signature,
          summary,
          params: paramVector,
          outputParams,
          inputParams,
          paramByName
        }
      }

      function descp (p) {
        let s = ''
        s += `${p.name} [ ${p.type_id}${p.is_output
          ? ' out '
          : ' in '} ] `
        return s
      }

      function summarise (name, pv) {
        if (!pv || pv.length === 0) return 'proc does not exist.'
        let s = `${descp(pv[0])} ${name}( `
        for (let i = 1; i < pv.length; i += 1) {
          s += descp(pv[i])
          if (i < pv.length - 1) {
            s += ', '
          }
        }
        s += ' ) '
        return s
      }

      function buildSignature (pv, name) {
        const pars = pv.reduce((aggr, latest, i) => {
          if (i > 0) {
            aggr.push(`${latest.name} = ?`)
          }
          return aggr
        }, []).join(', ')
        return `{ ? = call ${name}(${pars}) }`
      }

      function asSelect (pv, procedure) {
        if (dialect === ServerDialect.SqlServer) {
          return asSelectSqlServer(pv, procedure)
        } else {
          return asSelectSybase(pv, procedure)
        }
      }

      function asSelectSybase (pv, procName) {
        const params = []
        const parameters = []
        pv.forEach(param => {
          if (param.name !== '@returns') {
            parameters.push(param)
          }
        })

        parameters.forEach(param => {
          if (param.is_output) {
            const size = param.type_id === 'varchar' ? `(${param.max_length})` : ''
            const s = `${param.name} ${param.type_id}${size}`
            params.push(s)
          }
        })

        let cmdParam = ['@___return___ int'].concat(params).join(', ')
        let cmd = `declare ${cmdParam} `
        cmd += `exec @___return___ = ${procName} `

        const spp = []
        parameters.forEach(param => {
          if (param.is_output) {
            // output parameter
            cmdParam = `${param.name} output`
            spp.push(cmdParam)
          } else {
            // input parameter
            cmdParam = param.name + '=?'
            spp.push(cmdParam)
          }
        })

        const params2 = []
        parameters.forEach(param => {
          if (param.is_output) {
            let paramName = param.name
            if (paramName[0] === '@') {
              paramName = paramName.substring(1)
            }
            cmdParam = `${param.name} as ${paramName}`
            params2.push(cmdParam)
          }
        })

        const sppJoined = spp.join(', ')
        cmd += sppJoined + ' '
        const selectCmd = `select ${['@___return___ as \'___return___\''].concat(params2).join(', ')}`
        cmd += selectCmd + ' '

        return cmd
      }

      function asSelectSqlServer (pv, procName) {
        const params = []
        const parameters = []
        pv.forEach(param => {
          if (param.name !== '@returns') {
            parameters.push(param)
          }
        })

        parameters.forEach(param => {
          if (param.is_output) {
            const s = `${param.name} ${param.type_id}`
            params.push(s)
          }
        })

        let cmdParam = ['@___return___ int'].concat(params).join(', ')
        let cmd = `declare ${cmdParam};`
        cmd += `exec @___return___ = ${procName} `

        const spp = []
        parameters.forEach(param => {
          if (param.is_output) {
          // output parameter
            cmdParam = `${param.name}=${param.name} output`
            spp.push(cmdParam)
          } else {
          // input parameter
            cmdParam = param.name + '=?'
            spp.push(cmdParam)
          }
        })

        const params2 = []
        parameters.forEach(param => {
          if (param.is_output) {
            let paramName = param.name
            if (paramName[0] === '@') {
              paramName = paramName.substring(1)
            }
            cmdParam = `${param.name} as ${paramName}`
            params2.push(cmdParam)
          }
        })

        const sppJoined = spp.join(', ')
        cmd += sppJoined + ';'
        const selectCmd = `select ${['@___return___ as \'___return___\''].concat(params2).join(', ')}`
        cmd += selectCmd + ';'

        return cmd
      }

      function setDialect (d) {
        dialect = d
        meta = constructMeta(name, paramVector)
      }

      function setTimeout (t) {
        timeout = t
      }

      function setPolling (b) {
        polling = b
      }

      function getMeta () {
        return meta
      }

      function getName () {
        return name
      }

      function callStoredProcedure (notify, signature, paramsOrCallback, callback) {
        const queryOb = {
          query_str: signature,
          query_timeout: timeout,
          query_polling: polling
        }

        notifier.validateParameters(
          [
            {
              type: 'string',
              value: queryOb.query_str,
              name: 'query string'
            }
          ],
          'callproc'
        )

        notify.setQueryObj(queryOb)
        const chunky = notifier.getChunkyArgs(paramsOrCallback, callback)

        function onProcedureRaw (err, results, more, outputParams) {
          if (chunky.callback) {
            if (err) {
              chunky.callback(err)
            } else {
              chunky.callback(err, driverMgr.objectify(results), outputParams, more)
            }
          }
        }

        if (callback) {
          driverMgr.realAllProc(notify, queryOb, chunky.params, onProcedureRaw)
        } else {
          driverMgr.realAllProc(notify, queryOb, chunky.params)
        }

        return notify
      }

      function paramsArray (params) {
        if (Array.isArray(params)) {
          return params
        }
        return meta.params.reduce((agg, latest, i) => {
          if (i === 0) return agg
          const name = latest.name.slice(1)
          const v = Object.prototype.hasOwnProperty.call(params, name) ? params[name] : null
          agg.push(v)
          return agg
        }, [])
      }

      function initFullParamVector (meta) {
        return meta.params.map(p => {
          return {
            is_output: p.is_output,
            name: p.name.slice(1),
            type_id: p.type_id,
            max_length: p.max_length,
            is_user_defined: p.is_user_defined,
            use_default: false,
            val: null
          }
        })
      }

      function mapParamObjectToFullParamVector (vec, meta, params) {
        for (let i = 0; i < meta.params.length; i += 1) {
          const latest = vec[i]
          const name = meta.params[i].name.slice(1)
          const v = Object.prototype.hasOwnProperty.call(params, name) ? params[name] : null
          if (latest.is_user_defined) {
            vec[i] = v
          } else {
            latest.val = v
          }
          // when using an object based parameter mark those params not included such
          // that default keyword is used in sql submitted
          const onParams = Object.prototype.hasOwnProperty.call(params, latest.name)
          if (!latest.is_output && !onParams) {
            latest.use_default = true
          }
        }

        return vec
      }

      function mapParamArrayToFullParamVector (vec, params) {
        let j = 1 // skip the first return code bound

        for (let i = 0; i < params.length; i += 1) {
          if (params.length < vec.length - 1) {
            while (j < vec.length && vec[j].is_output === true) {
              j += 1
            }
          }
          if (j >= vec.length) break
          if (vec[j].is_user_defined) {
            vec[j] = params[i]
          } else {
            vec[j].val = params[i]
          }
          j += 1
        }
        return vec
      }

      function bindParams (meta, params) {
        const vec = initFullParamVector(meta)
        return Array.isArray(params) ? mapParamArrayToFullParamVector(vec, params) : mapParamObjectToFullParamVector(vec, meta, params)
      }

      function forwardError (msg, notify, cb) {
        const error = new Error(`${name}: ${msg}`)
        if (cb) {
          cb(error, null, null)
        } else {
          setImmediate(() => {
            notify.emit('error', error)
          })
        }
      }

      function where (list, primitive) {
        return list.reduce((agg, latest) => {
          if (primitive(latest)) {
            agg.push(latest)
          }
          return agg
        }, [])
      }

      function getProblemParams (list, primitive) {
        const failures = where(list, primitive)
        if (failures.length > 0) {
          const failureNames = failures.map(p => p.name)
          return failureNames.join()
        }
        return null
      }

      function checkParamIntegrityOnParamObject (userParamObject) {
        const illegalMissingNames = getProblemParams(Object.keys(userParamObject).map(name => {
          return {
            name
          }
        }), p =>
          !Object.prototype.hasOwnProperty.call(meta.paramByName, p.name))
        if (illegalMissingNames) {
          return `illegal params on param object = ${illegalMissingNames}`
        }
      }

      function checkParamIntegrity (userParamArrayOrObject) {
        if (meta.params.length === 0) {
          return 'proc could not be found'
        }
        if (Array.isArray(userParamArrayOrObject) && userParamArrayOrObject.length >= meta.params.length) {
          return `illegal parameter count, expected <= ${meta.params.length - 1}`
        }
        if (!Array.isArray(userParamArrayOrObject)) {
          return checkParamIntegrityOnParamObject(userParamArrayOrObject)
        }
        return null
      }

      function build (pv, name) {
        // for sybase do not support mix of default input and output parameters
        const isSybase = dialect === ServerDialect.Sybase
        const withOutput = pv.filter(latest => latest.is_output && latest.name !== 'returns')
        const pars = pv.reduce((aggr, latest, i) => {
          if (i > 0) {
            if (latest.use_default) {
              if (!isSybase) {
                aggr.push(`@${latest.name} = DEFAULT`)
              }
            } else if (isSybase) {
              if (withOutput.length > 0) {
                aggr.push('?')
              } else {
                aggr.push(`@${latest.name} = ?`)
              }
            } else {
              aggr.push(`@${latest.name} = ?`)
            }
          }
          return aggr
        }, []).join(', ')
        return `{ ? = call ${name}(${pars}) }`
      }

      function privateCall (notify, params, cb) {
        const errorMsg = checkParamIntegrity(params)
        if (errorMsg) {
          forwardError(errorMsg, notify, cb)
          setImmediate(() => {
            notify.emit('free')
          })
          return
        }
        let paramVec = bindParams(meta, params)
        const signature = build(paramVec, name)
        paramVec = where(paramVec, latest => !latest.use_default)
        if (cb) {
          callStoredProcedure(notify, signature, paramVec, (err, results, output, more) => {
            cb(err, results, output, more)
          })
        } else {
          callStoredProcedure(notify, signature, paramVec)
        }
      }

      function callNotify (paramsOrCb, fn, notify) {
        let vec
        let cb
        if (Array.isArray(paramsOrCb)) {
          vec = paramsOrCb
          cb = fn
        } else if (typeof paramsOrCb === 'function') {
          vec = []
          cb = paramsOrCb
        } else {
          vec = paramsOrCb
          cb = fn
        }

        privateCall(notify, vec, cb)
      }

      function call (paramsOrCb, fn) {
        const notify = conn.getNotify()
        callNotify(paramsOrCb, fn, notify)

        return notify
      }

      this.paramsArray = paramsArray
      this.call = call
      this.callNotify = callNotify
      this.setTimeout = setTimeout
      this.setPolling = setPolling
      this.getMeta = getMeta
      this.getName = getName
      this.setDialect = setDialect
    }
  }

  class ProcedureMgr {
    constructor (procedureConnection, procedureNotifier, procedureDriverMgr, metaResolver, sharedCache) {
      const cache = sharedCache || {}
      const conn = procedureConnection
      let timeout = 0
      let polling = false
      const driverMgr = procedureDriverMgr
      const notifier = procedureNotifier

      function returnMeta () {
        return {
          is_output: true,
          name: '@returns',
          type_id: 'int',
          max_length: 4,
          order: 0,
          is_user_defined: false,
          has_default_value: false,
          default_value: null,
          collation: null
        }
      }

      function describeProcedure (procedureName, callback) {
        const ret = returnMeta()
        function mapFn (sql) {
          let schemaName = 'dbo'
          let unqualifiedTableName = procedureName
          const schemaIndex = procedureName.indexOf('.')
          if (schemaIndex > 0) {
            schemaName = procedureName.substring(0, schemaIndex)
            unqualifiedTableName = procedureName.substring(schemaIndex + 1)
          }
          sql = sql.replace(/<escaped_procedure_name>/g, unqualifiedTableName)
          sql = sql.replace(/<schema_name>/g, schemaName)
          return sql
        }

        metaResolver.getProcedureDefinition(conn, procedureName, mapFn).then(results => {
          if (results.length > 0) {
            results.unshift(ret)
          }
          callback(null, results)
        }).catch(err => {
          callback(err, null)
        })
      }

      /*
      {
  proc_name: "test_sp",
  type_desc: "SQL_STORED_PROCEDURE",
  object_id: 1446165539,
  has_default_value: false,
  default_value: null,
  is_output: false,
  name: "@param",
  type_id: "varchar",
  max_length: 50,
  order: 1,
  collation: "SQL_Latin1_General_CP1_CI_AS",
  is_user_defined: null,
}
      */

      function makeParam (procName, paramName, paramType, paramLength, isOutput) {
        return {
          proc_name: procName,
          type_desc: 'SQL_STORED_PROCEDURE',
          object_id: -1,
          has_default_value: false,
          default_value: null,
          is_output: isOutput,
          name: paramName,
          type_id: paramType,
          max_length: paramLength,
          order: 1,
          collation: '',
          is_user_defined: null
        }
      }

      function addProc (name, paramVector) {
        if (paramVector.length === 0 || paramVector[0].name !== '@returns') {
          const retMeta = returnMeta()
          paramVector.unshift(retMeta)
        }

        const procedure = new BoundProcedure(driverMgr, notifier, conn, paramVector, name, polling, timeout)
        cache[name] = procedure
        return procedure
      }

      function createProcedure (name, cb) {
        let procedure = cache[name]
        if (!procedure) {
          describeProcedure(name, (err, paramVector) => {
            if (!err) {
              procedure = addProc(name, paramVector)
              cb(null, procedure)
            } else {
              cb(err, null)
            }
          })
        } else {
          cb(null, procedure)
        }
      }

      function describe (name, cb) {
        createProcedure(name, p => {
          if (p) {
            cb(p)
          } else {
            cb(new Error(`could not get definition of ${name}`))
          }
        })
      }

      function getProc (name, cb) {
        createProcedure(name, (err, p) => {
          cb(err, p)
        })
      }

      function get (name, cb) {
        createProcedure(name, (err, p) => {
          if (err) {
            cb(err)
          } else {
            cb(p)
          }
        })
      }

      function callproc (name, paramsOrCb, cb) {
        const notify = conn.getNotify()
        createProcedure(name, (e, p) => {
          if (e) {
            const err = new Error(`unable to construct proc ${name} ${e.message}`)
            if (cb) {
              cb(err, null, null)
            } else {
              notify.emit('error', err)
            }
          } else {
            p.callNotify(paramsOrCb, cb, notify)
          }
        })
        return notify
      }

      function setTimeout (t) {
        timeout = t
      }

      function clear () {
        Object.keys(cache).forEach(k => {
          delete cache[k]
        })
      }

      function setPolling (b) {
        polling = b
      }

      function getCount () {
        return Object.keys(cache).length
      }

      this.makeParam = makeParam
      this.setTimeout = setTimeout
      this.setPolling = setPolling
      this.addProc = addProc
      this.callproc = callproc
      this.describe = describe
      this.getCount = getCount
      this.clear = clear
      this.get = get // legacy call
      this.getProc = getProc
      this.ServerDialect = ServerDialect
    }
  }

  return {
    ProcedureMgr
  }
})())

exports.procedureModule = procedureModule
'use strict'

const queueModule = ((() => {
  const priorityQueue = require('./data-struture/priority-queue/PriorityQueue')
  function WorkQueue () {
    const workQueue = new priorityQueue.PriorityQueue()
    let operationId = 0

    function emptyQueue () {
      while (!workQueue.isEmpty()) {
        workQueue.poll()
      }
    }

    function execQueueOp (op) {
      const peek = workQueue.peek()
      workQueue.add(op, op.operationId)
      if (!peek || peek.paused) {
        op.fn.apply(op.fn, op.args)
      }
    }

    function enqueue (commandType, fn, args) {
      const op = {
        commandType,
        fn,
        args,
        operationId,
        paused: false
      }
      ++operationId
      execQueueOp(op)
      return op
    }

    function park (item) {
      workQueue.changePriority(item, Number.MAX_SAFE_INTEGER)
      item.paused = true
      const peek = workQueue.peek()
      if (!peek.paused) {
        nextOp()
      }
    }

    function resume (item) {
      workQueue.changePriority(item, item.operationId)
      item.paused = false
    }

    function dropItem (item) {
      return workQueue.remove(item)
    }

    function exec () {
      const op = workQueue.peek()
      if (op && !op.paused) {
        op.fn.apply(op.fn, op.args)
      }
    }

    function nextOp () {
      workQueue.remove(workQueue.peek())
      exec()
    }

    function length () {
      return workQueue.length()
    }

    function first (primitive) {
      const ops = []
      let ret = null
      while (!workQueue.isEmpty()) {
        const op = workQueue.peek()
        if (primitive(op.operationId, op)) {
          ret = op
          break
        }
        const peek = workQueue.peek()
        workQueue.remove(peek)
        ops.push(peek)
      }
      while (ops.length > 0) {
        const op = ops.pop()
        workQueue.add(op, op.operationId)
      }
      return ret
    }

    function peek () {
      return workQueue.peek()
    }

    return {
      resume,
      park,
      peek,
      exec,
      first,
      dropItem,
      nextOp,
      emptyQueue,
      enqueue,
      length
    }
  }

  return {
    WorkQueue
  }
})())

// encapsulate operation management - used by driver manager to queue work to the c++ driver.
// note that item[0] is live with the c++ and remains until the statement is complete.

exports.queueModule = queueModule
/**
 * Created by Stephen on 28/06/2017.
 */

// the main work horse that manages a query from start to finish by interacting with the c++

'use strict'

const readerModule = ((() => {
  function DriverRead (cppDriver, queue) {
    const native = cppDriver
    const workQueue = queue
    let useUTC = true

    function setUseUTC (utc) {
      useUTC = utc
    }

    // invokeObject.begin(queryId, query, params, onInvoke)

    function getQuery (notify, query, params, invokeObject, callback) {
      const q = new Query(notify, workQueue, query, params, invokeObject, callback)
      notify.setQueryWorker(q)
      return q
    }

    class Query {
      constructor (notify, queue, query, params, invokeObject, callback) {
        let meta
        let rows = []
        let outputParams = []
        const queryId = notify.getQueryId()
        let queryRowIndex = 0
        let batchRowIndex = 0
        let batchData = null
        let running = true
        let paused = false
        let done = false
        let infoFromNextResult = false

        const rowBatchSize = 50 /* ignored for prepared statements */

        function isInfo (err) {
          return err && err.sqlstate && err.sqlstate.length >= 2 && err.sqlstate.substring(0, 2) === '01'
        }

        /* route non critical info messages to its own event to prevent streams based readers from halting */
        const routeStatementError = (errorsAndInfo, callback, notify) => {
          if (!Array.isArray(errorsAndInfo)) {
            errorsAndInfo = [errorsAndInfo]
          }
          let i = 0
          const onlyErrors = errorsAndInfo.reduce((agg, latest) => {
            if (!isInfo(latest)) {
              agg.push(latest)
            }
            return agg
          }, [])
          const errorCount = onlyErrors.length
          errorsAndInfo.forEach(err => {
            const info = isInfo(err)
            if (callback && !info) {
              const more = i < errorsAndInfo.length - 1
              callback(err, null, more)
            } else {
              const ev = info ? 'info' : 'error'
              if (notify) {
                const more = i < errorCount - 1
                if (notify.listenerCount(ev) > 0) {
                  notify.emit(ev, err, more)
                }
              } else {
                throw new Error(err)
              }
            }
            ++i
          })
        }

        function nativeGetRows (queryId, rowBatchSize) {
          return new Promise((resolve, reject) => {
            native.readColumn(queryId, rowBatchSize, (e, res) => {
              setImmediate(() => {
                if (e) {
                  reject(e)
                } else {
                  resolve(res)
                }
              })
            })
          })
        }

        function close () {
          running = false
          workQueue.nextOp()
        }

        function emitDone () {
          setImmediate(() => {
            if (done) return
            done = true
            notify.emit('done', queryId)
          })
        }

        function dispatchInfoReturnErrors (e) {
          const infoMessages = []
          const errorMessages = []
          if (e && Array.isArray(e)) {
            e.forEach(errorOrInfo => {
              if (isInfo(errorOrInfo)) {
                infoMessages.push(errorOrInfo)
              } else {
                errorMessages.push(errorOrInfo)
              }
            })
          }
          if (errorMessages.length > 0) {
            return errorMessages
          } else if (infoMessages.length > 0) {
            routeStatementError(infoMessages, callback, notify, false)
          }
          return []
        }

        function nativeNextResult (queryId) {
          return new Promise((resolve, reject) => {
            infoFromNextResult = false
            native.nextResult(queryId, (e, res) => {
              setImmediate(() => {
              // may contain info messages e.g. raised by PRINT statements - do not want to reject these
                const errorMessages = e ? dispatchInfoReturnErrors(e) : []
                if (errorMessages.length > 0) {
                  reject(errorMessages)
                } else {
                  infoFromNextResult = e != null && Array.isArray(e) && e.length > 0
                  resolve(res)
                }
              })
            })
          })
        }

        function beginQuery (queryId) {
          return new Promise((resolve, reject) => {
            invokeObject.begin(queryId, query, params, (e, columnDefinitions, procOutputOrMore) => {
              setImmediate(() => {
                if (e && !procOutputOrMore) {
                  reject(e)
                } else {
                  resolve({
                    warning: e,
                    columnDefinitions,
                    procOutput: procOutputOrMore
                  })
                }
              })
            })
          })
        }

        // console.log('fetch ', queryId)
        const dispatchRows = (results) => {
          if (!results) { return }
          if (paused) return
          const resultRows = results.data
          if (!resultRows) { return }
          const numberRows = resultRows.length
          while (batchRowIndex < numberRows) {
            if (paused) {
              break
            }
            const driverRow = resultRows[batchRowIndex]
            notify.emit('row', queryRowIndex)
            batchRowIndex++
            queryRowIndex++
            let currentRow
            if (callback) {
              currentRow = []
              rows[rows.length] = currentRow
            }
            for (let column = 0; column < driverRow.length; ++column) {
              let rowColumn = driverRow[column]
              if (rowColumn && useUTC === false) {
                if (meta[column].type === 'date') {
                  rowColumn = new Date(rowColumn.getTime() - rowColumn.getTimezoneOffset() * -60000)
                }
              }
              if (callback) {
                currentRow[column] = rowColumn
              }
              notify.emit('column', column, rowColumn, false)
            }
          }
        }

        function rowsCompleted (results, more) {
          invokeObject.end(notify, outputParams, (err, r, freeMore, op) => {
            if (callback) {
              callback(err, r, freeMore, op)
            }
            if (!freeMore) {
              emitDone()
            }
          }, results, more)
        }

        function rowsAffected (nextResultSetInfo) {
          const rowCount = nextResultSetInfo.rowCount
          const preRowCount = nextResultSetInfo.preRowCount
          const moreResults = !nextResultSetInfo.endOfResults || infoFromNextResult
          notify.emit('rowcount', preRowCount)

          const state = {
            meta: null,
            rowcount: rowCount
          }

          rowsCompleted(state, moreResults)
        }

        function end (err) {
          invokeObject.end(notify, outputParams, () => {
            if (!Array.isArray(err)) {
              err = [err]
            }
            routeStatementError(err, callback, notify)
          }, null, false)
          close()
        }

        function moveToNextResult (nextResultSetInfo) {
          setImmediate(() => {
            if (!meta) {
              rowsCompleted(
                {
                  meta,
                  rows
                },
                !nextResultSetInfo.endOfResults)
            } else if (infoFromNextResult) {
              rowsAffected(nextResultSetInfo)
              nextResult()
              return
            } else if (meta && meta.length === 0) {
            // handle the just finished result reading
            // if there was no metadata, then pass the row count (rows affected)
              rowsAffected(nextResultSetInfo)
            } else {
              rowsCompleted(
                {
                  meta,
                  rows
                },
                !nextResultSetInfo.endOfResults)
            }

            // reset for the next resultset
            meta = nextResultSetInfo.meta
            if (!meta) {
              nextResult()
              return
            }
            rows = []
            if (nextResultSetInfo.endOfResults) {
              close()
            } else {
            // if this is just a set of rows
              if (meta.length > 0) {
                notify.emit('meta', meta)
                // kick off reading next set of rows
                dispatch()
              } else {
                nextResult()
              }
            }
          })
        }

        function dispatch () {
          if (!running) return
          if (paused) return // will come back at some later stage

          nativeGetRows(queryId, rowBatchSize).then(d => {
            batchRowIndex = 0
            batchData = d
            dispatchRows(d)
            if (!d.end_rows) {
              dispatch()
            } else {
              nextResult()
            }
          }).catch(err => {
            end(err)
          })
        }

        const nextResult = () => {
          infoFromNextResult = false
          nativeNextResult(queryId).then(nextResultSetInfo => {
            moveToNextResult(nextResultSetInfo)
          }).catch(err => {
            end(err)
          })
        }

        function begin () {
          beginQuery(queryId, query, params).then(res => {
            if (res.warning) {
              routeStatementError(res.warning, callback, notify)
            }
            outputParams = res.outputParams
            meta = res.columnDefinitions
            if (meta.length > 0) {
              notify.emit('meta', meta)
              dispatch()
            } else {
              nextResult()
            }
          }).catch(err => {
            end(err)
          })
          notify.emit('submitted', query, params)
        }

        function pause () {
          if (paused) return
          paused = true
          queue.park(notify.getOperation())
        }

        function resume () {
          if (!paused) return
          queue.resume(notify.getOperation())
          paused = false
          dispatchRows(batchData)
          dispatch()
        }
        this.begin = begin
        this.pause = pause
        this.resume = resume
      }
    }

    return {
      setUseUTC,
      getQuery
    }
  }

  return {
    DriverRead
  }
})())

exports.readerModule = readerModule
'use strict'

// ---------------------------------------------------------------------------------------------------------------------------------
// File: sql.js
// Contents: javascript interface to Microsoft Driver for Node.js  for SQL Server
//
// Copyright Microsoft Corporation and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
//
// You may obtain a copy of the License at:
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ---------------------------------------------------------------------------------------------------------------------------------

const cw = require('./connection').connectionModule
const pm = require('./pool').poolModule
const us = cw.userTypes

exports.module = module

exports.query = cw.query
exports.queryRaw = cw.queryRaw
exports.open = cw.open
exports.promises = cw.promises

exports.Bit = us.Bit

exports.BigInt = us.BigInt
exports.Int = us.Int
exports.TinyInt = us.TinyInt
exports.SmallInt = us.SmallInt

// add support for user assigned length.
exports.VarBinary = us.VarBinary
exports.LongVarBinary = us.LongVarBinary
exports.Image = us.LongVarBinary

exports.Float = us.Float
exports.Numeric = us.Numeric
exports.Money = us.Money
exports.SmallMoney = us.Money

exports.WVarChar = us.WVarChar
exports.Double = us.Double
exports.Decimal = us.Numeric

exports.Real = us.Real
exports.Char = us.Char // sent as Utf8
exports.VarChar = us.VarChar // sent as Utf8
exports.NChar = us.NChar // 16 bit
exports.NVarChar = us.NVarChar // 16 bit i.e. unicode
exports.Text = us.Text
exports.NText = us.Text
exports.Xml = us.Xml // recommended to use wide 16 bit rather than char
exports.UniqueIdentifier = us.UniqueIdentifier
exports.Time = us.Time
exports.Time2 = us.Time2
exports.Date = us.MyDate
exports.DateTime = us.DateTime
exports.DateTime2 = us.DateTime2
exports.DateRound = us.DateRound
exports.SmallDateTime = us.SmallDateTime
exports.DateTimeOffset = us.DateTimeOffset
exports.WLongVarChar = us.WLongVarChar
exports.PollingQuery = us.PollingQuery
exports.TimeoutQuery = us.TimeoutQuery
exports.TzOffsetQuery = us.TzOffsetQuery

exports.Table = us.Table
exports.TvpFromTable = us.TvpFromTable
exports.Pool = pm.Pool
/**
 * Created by Stephen on 9/28/2015.
 */

/*
 supports bulk table operations, delete, modify and insert. Also capture table definition such that
 template sql statements can be used to insert single entries.

 this manager will ultimately become the underlying mechanism for simple "entity framework" like
 transactions i.e. working with a concrete java script type that requires efficient binding to
 the database, thus it must be robust and simple to enhance.
 */

'use strict'

const tableModule = (() => {
  const { ServerDialect } = require('./dialect')
  const util = require('util')
  const userModule = require('./user').userModule
  const utilModule = require('./util').utilModule
  const userTypes = new userModule.SqlTypes()
  const splitter = new utilModule.SchemaSplitter()

  class TableMgrPromises {
    constructor (tm) {
      this.getTable = util.promisify(tm.getTable)
      this.getUserTypeTable = util.promisify(tm.getUserTypeTable)
    }
  }

  class TableColumn {
    constructor (tableName, tableSchema, ordinalPosition, columnName, type, maxLength, isPrimaryKey) {
      if (!columnName) return
      columnName = splitter.stripEscape(columnName)
      this.table_name = tableName
      this.table_schema = tableSchema
      this.name = columnName
      this.type = type
      this.max_length = maxLength
      this.is_primary_key = isPrimaryKey
      this.ordinal_position = ordinalPosition

      this.table_catalog = ''
      this.column_default = ''
      this.precision = 0
      this.scale = 0
      this.is_nullable = false
      this.is_computed = false
      this.is_identity = false
      this.object_id = 0
      this.generated_always_type = 0
      this.generated_always_type_desc = 'NOT_APPLICABLE'
      this.is_hidden = 0
      this.is_foreign_key = 0
      this.decorator = ''
    }

    static asTableColumn (rawCol) {
      const tp = new TableColumn()
      tp.fromRaw(rawCol)
      return tp
    }

    isReadOnly () {
      return (this.is_identity ||
        this.is_computed ||
        this.is_hidden ||
        this.generated_always_type ||
        this.type === 'timestamp')
    }

    isTzAdjusted () {
      return this.type === 'datetimeoffset' ||
        this.type === 'datetime' ||
        this.type === 'datetime2' ||
        this.type === 'time' ||
        this.type === 'date' ||
        this.type === 'smalldatetime'
    }

    asUserType (useUTC) {
      const declaration = `${this.typed(true)}`
      let length = 0
      if (this.max_length > 0) {
        if (this.type === 'nvarchar') {
          length = this.max_length / 2
        } else if (this.type === 'varbinary') {
          length = this.max_length
        } else {
          length = this.max_length
        }
      }

      let offset = 0
      const isDateTime = this.isTzAdjusted()
      if (useUTC === false && isDateTime) {
        offset = new Date().getTimezoneOffset()
      }
      return {
        name: this.name,
        userType: declaration,
        scale: this.scale,
        precision: this.precision,
        type: {
          offset,
          declaration: this.type,
          length
        }
      }
    }

    typed (user) {
      const oneParam =
        this.type === 'varbinary' ||
        this.type === 'varchar' ||
        this.type === 'nvarchar' ||
        this.type === 'nchar'

      const twoParam =
        this.type === 'numeric' ||
        this.type === 'decimal' ||
        this.type === 'time'

      const timeParam =
        this.type === 'time'

      let maxLength = this.max_length || 0
      if (this.type === 'nvarchar' || this.type === 'nchar') {
        if (maxLength === -1) {
          maxLength = 'MAX'
        } else {
          maxLength = maxLength / 2
        }
      }

      if (this.is_computed) {
        return user ? `${this.type}` : `${this.decorator}`
      } else if (timeParam) {
        return `${this.type} (${this.scale}) ${this.decorator}`
      } else if (oneParam) {
        return `${this.type} (${maxLength}) ${this.decorator}`
      } else if (twoParam) {
        return `${this.type} (${this.precision},${this.scale}) ${this.decorator}`
      } else {
        return `${this.type} ${this.decorator}`
      }
    }

    fromRaw (c) {
      this.table_name = c.table_name
      this.table_schema = c.table_schema
      this.name = c.name
      this.type = c.type
      this.max_length = c.max_length
      this.is_primary_key = c.is_primary_key

      this.ordinal_position = c.ordinal_position
      this.table_catalog = c.table_catalog
      this.column_default = c.column_default
      this.precision = c.precision
      this.scale = c.scale
      this.is_nullable = c.is_nullable
      this.is_computed = c.is_computed
      this.is_identity = c.is_identity
      this.object_id = c.object_id
      this.generated_always_type = c.generated_always_type
      this.generated_always_type_desc = c.generated_always_type_desc
      this.is_hidden = c.is_hidden
      this.is_foreign_key = c.is_foreign_key
      this.decorator = ''
    }

    asExpression (expression) {
      this.is_computed = true
      this.decorator = expression
      return this
    }

    isComputed (v) {
      this.is_computed = v
      return this
    }

    isIdentity (v, start, inc) {
      start = start || 1
      this.is_identity = v
      if (v) {
        inc = inc || 1
        this.decorator = `IDENTITY(${start},${inc})`
      }
      return this
    }

    isHidden (v) {
      this.is_hidden = v
      return this
    }

    isPrimaryKey (v) {
      this.is_primary_key = v
      return this
    }

    isForeignKey (v) {
      this.is_foreign_key = v
      return this
    }

    notNull () {
      this.decorator = 'NOT NULL'
      return this
    }

    null () {
      this.decorator = 'NULL'
      return this
    }

    withDecorator (v) {
      this.decorator = v
      return this
    }

    asBit () {
      this.type = 'bit'
      this.sql_type = userTypes.getSqlTypeFromDeclaredType(this).sql_type
      this.max_length = 1
      this.precision = 1
      this.scale = 0
      return this
    }

    asInt () {
      this.type = 'int'
      this.sql_type = userTypes.getSqlTypeFromDeclaredType(this).sql_type
      this.length = 4
      this.precision = 10
      this.scale = 0
      return this
    }

    asNVarCharMax () {
      return this.asNVarChar(-1)
    }

    asNVarChar (length) {
      this.type = 'nvarchar'
      this.sql_type = userTypes.getSqlTypeFromDeclaredType(this).sql_type
      this.max_length = length > 0 ? length * 2 : length
      this.precision = 0
      this.scale = 0
      return this
    }

    asVarBinary (length) {
      this.type = 'varbinary'
      this.sql_type = userTypes.getSqlTypeFromDeclaredType(this).sql_type
      this.max_length = length
      this.precision = 0
      this.scale = 0
      return this
    }

    asVarChar (length) {
      this.type = 'varchar'
      this.sql_type = userTypes.getSqlTypeFromDeclaredType(this).sql_type
      this.max_length = length
      this.precision = 0
      this.scale = 0
      return this
    }

    asDate () {
      this.type = 'date'
      this.sql_type = userTypes.getSqlTypeFromDeclaredType(this).sql_type
      this.max_length = 3
      this.precision = 10
      this.scale = 0
      return this
    }

    asTime () {
      this.type = 'time'
      this.sql_type = userTypes.getSqlTypeFromDeclaredType(this).sql_type
      this.max_length = 5
      this.precision = 16
      this.scale = 7
      return this
    }

    asDateTime () {
      this.type = 'datetime'
      this.sql_type = userTypes.getSqlTypeFromDeclaredType(this).sql_type
      this.max_length = 8
      this.precision = 23
      this.scale = 3
      return this
    }

    asDateTimeOffset () {
      this.type = 'datetimeoffset'
      this.sql_type = userTypes.getSqlTypeFromDeclaredType(this).sql_type
      this.max_length = 10
      this.precision = 34
      this.scale = 7
      return this
    }

    asSmallMoney () {
      return this.asNumeric(10, 4)
    }

    asNumeric (precision, scale) {
      this.type = 'numeric'
      this.sql_type = userTypes.getSqlTypeFromDeclaredType(this).sql_type
      this.max_length = 9
      this.precision = precision
      this.scale = scale
      return this
    }

    asDecimal (precision, scale) {
      this.type = 'decimal'
      this.sql_type = userTypes.getSqlTypeFromDeclaredType(this).sql_type
      this.max_length = 9
      this.precision = precision
      this.scale = scale
      return this
    }

    asUniqueIdentifier () {
      this.type = 'uniqueidentifier'
      this.sql_type = userTypes.getSqlTypeFromDeclaredType(this).sql_type
      this.max_length = 16
      this.precision = 0
      this.scale = 0
      return this
    }

    asHierarchyId () {
      this.type = 'hierarchyid'
      this.sql_type = userTypes.getSqlTypeFromDeclaredType(this).sql_type
      this.max_length = 892
      this.precision = 0
      this.scale = 0
      return this
    }

    asBigInt () {
      this.type = 'bigint'
      this.sql_type = userTypes.getSqlTypeFromDeclaredType(this).sql_type
      this.max_length = 8
      this.precision = 19
      this.scale = 0
      return this
    }

    asSmallInt () {
      this.type = 'smallint'
      this.sql_type = userTypes.getSqlTypeFromDeclaredType(this).sql_type
      this.max_length = 2
      this.precision = 5
      this.scale = 0
      return this
    }

    asTinyInt () {
      this.type = 'tinyint'
      this.sql_type = userTypes.getSqlTypeFromDeclaredType(this).sql_type
      this.max_length = 1
      this.precision = 3
      this.scale = 0
      return this
    }

    asReal () {
      this.type = 'real'
      this.sql_type = userTypes.getSqlTypeFromDeclaredType(this).sql_type
      this.max_length = 4
      this.precision = 24
      this.scale = 0
      return this
    }

    asNChar (length) {
      this.type = 'nchar'
      this.sql_type = userTypes.getSqlTypeFromDeclaredType(this).sql_type
      this.max_length = length > 0 ? length * 2 : length
      this.precision = 0
      this.scale = 0
      return this
    }
  }

  class TableBuilder {
    constructor (mgr, conn, tableName, tableCatelog, tableSchema) {
      this.mgr = mgr
      this.theConnection = conn
      this.dialect = ServerDialect.SqlServer
      this.tableName = tableName
      this.tableSchema = tableSchema || 'dbo'
      this.tableCatelog = tableCatelog
      this.columns = []
      this.fullTableName = this.getFullName()
      this.clear()
    }

    setDialect (d) {
      this.dialect = d
      this.fullTableName = this.getFullName()
    }

    enclose (txt, enclosed) {
      if (!txt) return null
      const begin = enclosed ? '[' : ''
      const end = enclosed ? ']' : ''
      return `${begin}${txt}${end}`
    }

    getFullName (enclosed) {
      const tableCatelog = this.enclose(this.tableCatelog, enclosed)
      const tableSchema = this.enclose(this.tableSchema, enclosed)
      const tableName = this.enclose(this.tableName, enclosed)
      if (tableCatelog && tableSchema) {
        return `${tableCatelog}.${tableSchema}.${tableName}`
      } else if (tableSchema) {
        return `${tableSchema}.${tableName}`
      } else {
        return `${tableName}`
      }
    }

    addColumn (columnName, columnType, maxLength, isPrimaryKey) {
      const col = this.mgr.makeColumn(
        this.tableName,
        this.tableSchema,
        this.columns.length + 1,
        columnName,
        columnType,
        maxLength,
        isPrimaryKey)
      col.table_catalog = this.tableCatelog
      this.columns.push(col)
      return col
    }

    typed (c) {
      return c.typed()
    }

    compute () {
      const tableName = this.fullTableName
      const columns = this.columns.map(e => `[${e.name}] ${this.typed(e)}`).join(', ')
      const insertColumnNames = this.columns.filter(c => {
        return !c.is_identity
      }).map(e => `${e.name}`).join(', ')

      const primaryColumns = this.columns.filter(c => c.is_primary_key)
      const primaryNames = primaryColumns.map(e => `${e.name}`).join(', ')
      const columnNames = this.columns.map(e => `[${e.name}]`).join(', ')
      let dropTableSql
      if (this.dialect === ServerDialect.Sybase) {
        dropTableSql = `IF OBJECT_ID('${this.getFullName(false)}') IS NOT NULL DROP TABLE ${tableName};`
      } else {
        dropTableSql = `IF OBJECT_ID('${tableName}', 'U') IS NOT NULL DROP TABLE ${tableName};`
      }
      const createTableSql = `CREATE TABLE ${tableName} (${columns})`
      const typeName = `${tableName}Type`
      const dropTypeSql = `IF TYPE_ID(N'${typeName}') IS not NULL drop type ${typeName}`
      const userTypeTableSql = `CREATE TYPE ${typeName} AS TABLE (${columns})`
      const nameBar = tableName.replace(/\./g, '_')
      const clusteredSql = `CREATE CLUSTERED INDEX IX_${nameBar}_c ON ${tableName}(${primaryNames})`
      const nonClusteredSql = `CREATE NONCLUSTERED INDEX IX_${nameBar}_nc ON ${tableName}(${columnNames})`
      const insertSql = `INSERT INTO ${tableName} (${insertColumnNames}) VALUES `
      const selectSql = `SELECT ${columnNames} FROM ${tableName}`
      const trucateSql = `TRUNCATE TABLE ${tableName}`
      const paramsSql = `(${this.columns.map(_ => '?').join(', ')})`

      this.dropTypeSql = dropTypeSql
      this.userTypeTableSql = userTypeTableSql
      this.primaryColumns = primaryColumns
      this.dropTableSql = dropTableSql
      this.createTableSql = createTableSql
      this.clusteredSql = clusteredSql
      this.nonClusteredSql = nonClusteredSql
      this.selectSql = selectSql
      this.insertSql = insertSql
      this.truncateSql = trucateSql
      this.paramsSql = paramsSql
      this.insertParamsSql = `${insertSql} ${paramsSql}`
    }

    toTable () {
      this.compute()
      const table = this.mgr.addTable(this.tableName, this.columns, this.dialect)
      table.useMetaType(true)
      return table
    }

    async drop () {
      if (this.dropTableSql.length > 0) {
        return await this.theConnection.promises.query(this.dropTableSql)
      }
    }

    async create () {
      if (this.createTableSql.length > 0) {
        return await this.theConnection.promises.query(this.createTableSql)
      }
    }

    async index () {
      if (this.clusteredSql.length > 0) {
        await this.theConnection.promises.query(this.clusteredSql)
      }
      if (this.nonClusteredSql.length > 0) {
        await this.theConnection.promises.query(this.nonClusteredSql)
      }
    }

    async truncate () {
      if (this.truncateSql.length > 0) {
        return await this.theConnection.promises.query(this.truncateSql)
      }
    }

    keys (vec) {
      return vec.map(elem => {
        return this.primaryColumns.reduce(function (obj, column) {
          if (Object.prototype.hasOwnProperty.call(elem, column.name)) {
            obj[column.name] = elem[column.name]
          }
          return obj
        }, {})
      })
    }

    clear () {
      while (this.columns.length > 0) {
        this.columns.pop()
      }
      this.dropTableSql = ''
      this.createTableSql = ''
      this.clusteredSql = ''
      this.selectSql = ''
      this.insertSql = ''
      this.truncateSql = ''
      this.paramsSql = ''
      this.insertParamsSql = ''
    }
  }

  class TableMgr {
    constructor (connection, connectionMeta, connectionUser, sharedCache) {
      const cache = sharedCache || {}
      const bulkTableManagers = {}
      const theConnection = connection
      const metaResolver = connectionMeta
      const user = connectionUser
      let bcpVersion = 0

      function setBcpVersion (v) {
        bcpVersion = v
      }

      function getBcpVersion () {
        return bcpVersion
      }

      function getUserTypeTable (name, callback) {
        const mapFn = sql => {
          const decomp = splitter.decomposeSchema(name, '')
          decomp.schema = decomp.schema || 'dbo'
          return splitter.substitute(sql, decomp)
        }

        metaResolver.getUserType(connection, name, mapFn).then(res => {
          callback(null, new userTypes.Table(name, res))
        }).catch(err => {
          callback(err, null)
        })
      }

      function describeTable (tableName) {
        const resolver = metaResolver
        return new Promise((resolve, reject) => {
          resolver.getServerVersionRes(theConnection).then(res => {
            const cat = `[${res[0].Cat}]`
            function mapFn (data) {
              const decomp = splitter.decomposeSchema(tableName, cat)
              return splitter.substitute(data, decomp)
            }

            resolver.getTableDefinition(theConnection, res[0].MajorVersion, mapFn).then(res => {
              resolve(res)
            }).catch(err => {
              reject(err)
            })
          }).catch(err => {
            reject(err)
          })
        })
      }

      /*
        ordinal_position: 2,
        table_catalog: "",
        table_schema: "dbo",
        table_name: "test_default_val_table_bulk",
        column_default: "('def1')",
        name: "s1",
        type: "varchar",
        max_length: 255,
        precision: 0,
        scale: 0,
        is_nullable: false,
        is_computed: false,
        is_identity: false,
        object_id: 2137696055,
        generated_always_type: 0,
        generated_always_type_desc: "NOT_APPLICABLE",
        is_hidden: 0,
        is_primary_key: 0,
        is_foreign_key: 0,
      */

      function makeColumn (tableName, tableSchema, position, columnName, columnType, maxLength, isPrimaryKey) {
        return new TableColumn(tableName, tableSchema, position, columnName, columnType, maxLength, isPrimaryKey)
      }

      function addMeta (tableName, columns, dialect) {
        const tableMeta = new Meta(tableName, columns, dialect)
        cache[tableMeta] = tableMeta
        return tableMeta
      }

      function addTable (tableName, columns, dialect) {
        const meta = addMeta(tableName, columns, dialect)
        return getBulk(tableName, meta)
      }

      function makeBuilder (tableName, tableCatelog, tableSchema) {
        return new TableBuilder(this, theConnection, tableName, tableCatelog, tableSchema)
      }

      /*
     based on an instance bind properties of that instance to a given table.
     Will have to allow for not all properties binding i.e. may be partial persistence - and allow for
     mappings i.e. object.myName = table.<name> or table.my_name etc.
     */

      function describe (name) {
        return new Promise((resolve, reject) => {
          let tableMeta = cache[name]
          if (!tableMeta) {
            describeTable(name).then(rawCols => {
              // console.log(JSON.stringify(rawCols, null, 4))
              const tps = rawCols.map(rc => TableColumn.asTableColumn(rc))
              tableMeta = addMeta(name, tps)
              resolve(tableMeta)
            }).catch(err => {
              reject(err)
            })
          } else {
            resolve(tableMeta)
          }
        })
      }

      function getBulk (table, meta) {
        let bulkMgr = bulkTableManagers[table]
        if (!bulkMgr) {
          bulkMgr = new BulkTableOpMgr(theConnection, user, meta)
          if (bcpVersion > 0) {
            bulkMgr.setBcpVersion(bcpVersion)
          }
          bulkTableManagers[table] = bulkMgr
        }
        return bulkMgr
      }

      // promise safe (err, table)
      function getTable (table, cb) {
        describe(table).then(meta => {
          const bulkMgr = getBulk(table, meta)
          cb(null, bulkMgr)
        }).catch(err => {
          cb(err, null)
        })
      }

      // (table)
      function bind (table, cb) {
        describe(table).then(meta => {
          const bulkMgr = getBulk(table, meta)
          cb(bulkMgr)
        }).catch(err => {
          cb(null, err)
        })
      }

      this.makeBuilder = makeBuilder
      this.addTable = addTable
      this.makeColumn = makeColumn
      this.describe = describe
      this.bind = bind
      this.getTable = getTable
      this.getUserTypeTable = getUserTypeTable
      this.promises = new TableMgrPromises(this)
      this.ServerDialect = ServerDialect
      this.setBcpVersion = setBcpVersion
      this.getBcpVersion = getBcpVersion
    }
  }

  class Meta {
    constructor (tableName, cols, dialect) {
      this.dialect = dialect || ServerDialect.SqlServer
      this.tableName = tableName
      this.build(tableName, cols)
    }

    build (tableName, cols) {
      this.cols = cols.filter((item, pos) => cols.findIndex(col => col.name === item.name) === pos)
      this.fullTableName = cols.length > 0 && cols[0].table_catalog !== 'tempdb'
        ? this.getFullName()
        : tableName
      this.bcpTableName = this.fullTableName.replace(/\[/g, '').replace(/\]/g, '')
      this.allColumns = cols

      this.assignableColumns = this.recalculateAssignableColumns()
      this.primaryCols = this.recalculatePrimaryColumns()
      this.primaryByName = this.primaryCols.reduce((agg, col) => {
        agg[col.name] = col
        return agg
      }, {})

      this.colByName = this.allColumns.reduce((agg, col) => {
        agg[col.name] = col
        return agg
      }, {})

      this.setWhereCols(this.primaryCols)
      this.setUpdateCols(this.recalculateUpdateColumns())
    }

    setDialect (d) {
      this.dialect = d
      this.build(this.tableName, this.cols)
    }

    enclose (txt) {
      const begin = '['
      const end = ']'
      return `${begin}${txt}${end}`
    }

    getFullName () {
      const first = this.cols[0]
      const tableCatelog = this.enclose(first.table_catalog)
      const tableSchema = this.enclose(first.table_schema)
      const tableName = this.enclose(first.table_name)
      if (first.table_catalog && first.table_schema) {
        return `${tableCatelog}.${tableSchema}.${tableName}`
      } else if (first.table_schema) {
        return `${tableSchema}.${tableName}`
      } else {
        return `${tableName}`
      }
    }

    recalculateAssignableColumns () {
      return this.allColumns.filter(col => !col.isReadOnly())
    }

    recalculatePrimaryColumns () {
      return this.allColumns.filter(col => col.is_primary_key)
    }

    columnSet (colSubSet, operator) {
      operator = operator || ' and '
      return `${colSubSet.map(e => `[${e.name}] = ?`).join(operator)}`
    }

    whereClause (colSubSet) {
      return `where ( ${this.columnSet(colSubSet)} )`
    }

    columnList (colSubSet) {
      return colSubSet.map(e => `[${e.name}]`).join(', ')
    }

    selectStatement (colSubSet) {
      return `select ${this.columnList(this.allColumns)} from ${this.fullTableName} ${this.whereClause(colSubSet)}`
    }

    deleteStatement (colSubSet) {
      return `delete from ${this.fullTableName} ${this.whereClause(colSubSet)}`
    }

    updateStatement (colSubSet) {
      return `update ${this.fullTableName} set ${this.columnSet(colSubSet, ', ')} ${this.whereClause(this.whereColumns)}`
    }

    insertStatement () {
      const subSet = this.recalculateAssignableColumns()
      const w = subSet.map(() => '?').join(', ')
      const values = subSet.length > 0 ? ` values ( ${w} )` : ''
      return `insert into ${this.fullTableName} ( ${this.columnList(subSet)} ) ${values}`
    }

    filteredSet (colSubSet) {
      return colSubSet.reduce((agg, c) => {
        if (Object.prototype.hasOwnProperty.call(this.colByName, c.name)) {
          agg.push(this.colByName[c.name])
        }
        return agg
      }, [])
    }

    setWhereCols (colSubSet) {
      const subSet = this.filteredSet(colSubSet)
      this.whereColumns = subSet
      this.insertSignature = this.insertStatement()
      this.deleteSignature = this.deleteStatement(subSet)
      this.selectSignature = this.selectStatement(subSet)
      this.updateSignature = this.updateStatement(subSet)

      return this.selectSignature
    }

    setUpdateCols (colSubSet) {
      const filtered = this.filteredSet(colSubSet)
      this.updateColumns = filtered
      this.updateSignature = this.updateStatement(filtered)

      return this.updateSignature
    }

    recalculateUpdateColumns () {
      const assignable = this.recalculateAssignableColumns()
      return assignable.filter(col => !Object.prototype.hasOwnProperty.call(this.primaryByName, col.name))
    }

    getSummary () {
      return {
        insertSignature: this.insertSignature,
        whereColumns: this.whereColumns,
        updateColumns: this.updateColumns,
        selectSignature: this.selectSignature,
        deleteSignature: this.deleteSignature,
        updateSignature: this.updateSignature,
        columns: this.allColumns,
        primaryColumns: this.primaryCols,
        assignableColumns: this.assignableColumns,
        by_name: this.colByName
      }
    }

    toString () {
      const s = this.getSummary()
      return JSON.stringify(s, null, 4)
    }

    // export api

    getAllColumns () {
      return this.allColumns
    }

    getInsertSignature () {
      return this.insertSignature
    }

    getWhereColumns () {
      return this.whereColumns
    }

    getUpdateColumns () {
      return this.updateColumns
    }

    getSelectSignature () {
      return this.selectSignature
    }

    getDeleteSignature () {
      return this.deleteSignature
    }

    getUpdateSignature () {
      return this.updateSignature
    }

    getPrimaryColumns () {
      return this.primaryCols
    }

    getAssignableColumns () {
      return this.assignableColumns
    }

    getColumnsByName () {
      return this.colByName
    }
  }

  class BulkPromises {
    constructor (bulk) {
      this.insert = util.promisify(bulk.insertRows)
      this.delete = util.promisify(bulk.deleteRows)
      this.select = util.promisify(bulk.selectRows)
      this.update = util.promisify(bulk.updateRows)
    }
  }

  class BulkTableOpMgr {
    constructor (theConnection, user, m) {
      const meta = m

      let batch = 0
      let meTableType = null
      let summary = meta.getSummary()
      let tvp = null
      let bcp = false
      let bcpVersion = 17
      let declaredTypeByColumn = {}
      // if utc is off, we switch to using meta data from table columns
      // and on date related columns, the local timezone offset is sent
      // to driver to offset the UTC timestamp - giving ability to write local
      // dates into the database.
      if (theConnection.getUseUTC() === false) {
        useMetaType(true)
      }

      function asTableType (name) {
        const summary = meta.getSummary()
        const columns = summary.columns

        if (!name) {
          name = `${columns[0].table_name}Type`
        }
        const cols = userTypeCols(name)
        return new user.Table(name, cols)
      }

      function keys (vec) {
        return vec.map(elem => {
          return meta.primaryCols.reduce(function (obj, column) {
            if (Object.prototype.hasOwnProperty.call(elem, column.name)) {
              obj[column.name] = elem[column.name]
            }
            return obj
          }, {})
        })
      }

      function userTypeCols () {
        const summary = meta.getSummary()
        const useUTC = theConnection.getUseUTC()
        return summary.columns.map(c => c.asUserType(useUTC))
      }

      function asUserType (name) {
        const summary = meta.getSummary()
        const columns = summary.columns
        const cols = userTypeCols()
        const declarations = cols.map(c => `${c.name} ${c.userType}`).join(', ')
        // CREATE TYPE TestType AS TABLE ( a VARCHAR(50), b INT );

        if (!name) {
          name = `${columns[0].table_name}Type`
        }
        return `CREATE TYPE ${name} AS TABLE (${declarations})`
      }

      // create an object of arrays where each array represents all values
      // for the batch.

      function prepare () {
        return summary.columns.reduce((agg, col) => {
          const property = col.name
          if (Object.prototype.hasOwnProperty.call(summary.by_name, property) &&
        !summary.by_name[property].isReadOnly()) {
            agg.keys.push(property)
            if (!Object.prototype.hasOwnProperty.call(agg.arrays_by_name, property)) {
              agg.arrays_by_name[property] = []
            }
          }
          return agg
        }, {
          keys: [],
          arrays_by_name: {}
        })
      }

      function arrayPerColumn (vec) {
        const res = prepare()
        vec.forEach(instance => {
          res.keys.reduce((agg, property) => {
            const columnValues = agg[property]
            const val = Object.prototype.hasOwnProperty.call(instance, property)
              ? instance[property]
              : null
            columnValues.push(val)
            return agg
          }, res.arrays_by_name)
        })

        return res
      }

      // if batch size is set, split the input into that batch size.

      function rowBatches (rows) {
        const batches = []
        if (batch === 0) {
          batches.push(rows)
        } else {
          let singleBatch = []
          for (let i = 0; i < rows.length; i += 1) {
            singleBatch.push(rows[i])
            if (singleBatch.length === batch) {
              batches.push(singleBatch)
              singleBatch = []
            }
          }
        }

        return batches
      }

      // driver will have to recognise this is an array of arrays where each array
      // represents all values for that particular column.

      function arrayPerColumnForCols (rows, colSubSet, usebcp) {
        const colsByName = arrayPerColumn(rows).arrays_by_name
        return colSubSet.reduce((agg, col) => {
          if (Object.prototype.hasOwnProperty.call(colsByName, col.name)) {
            const valueVector = colsByName[col.name]
            if (Object.prototype.hasOwnProperty.call(declaredTypeByColumn, col.name)) {
              const declaration = declaredTypeByColumn[col.name]
              agg.push({
                value: valueVector,
                offset: declaration.offset || 0,
                sql_type: declaration.sql_type,
                precision: declaration.precision,
                scale: declaration.scale,
                bcp: usebcp,
                bcp_version: bcpVersion,
                ordinal_position: col.ordinal_position,
                table_name: usebcp ? meta.bcpTableName : ''
              })
            } else {
              agg.push(valueVector)
            }
          }
          return agg
        }, [])
      }

      // given the input array of asObjects consisting of potentially all columns, strip out
      // the sub set corresponding to the where column set.

      function whereForRowsNoBatch (sql, rows, callback) {
        const colArray = arrayPerColumnForCols(rows, summary.whereColumns)
        theConnection.query(sql, colArray, callback)
      }

      function selectRows (rows, callback) {
        const res = []
        whereForRowsNoBatch(summary.selectSignature, rows, (err, results, more) => {
          results.forEach(r => {
            res.push(r)
          })
          if (!more) {
            callback(err, res)
          }
        })
      }

      function runQuery (sql, colArray) {
        return new Promise((resolve, reject) => {
          theConnection.query(sql, colArray, (e, res) => {
            if (e) {
              reject(e)
            } else {
              resolve(res)
            }
          })
        })
      }

      function batchIterator (sql, rows, iterate) {
        return Promise.all(rowBatches(rows).map(b => runQuery(sql, iterate(b))))
      }

      function insertRows (rows, callback) {
        batchIterator(summary.insertSignature, rows, b => arrayPerColumnForCols(b, summary.assignableColumns, bcp))
          .then(res => {
            callback(null, res)
          }).catch(e => callback(e, null))
      }

      function updateRows (rows, callback) {
        batchIterator(summary.updateSignature, rows, b => arrayPerColumnForCols(b, summary.updateColumns, false).concat(arrayPerColumnForCols(b, summary.whereColumns)))
          .then(res => {
            callback(null, res)
          }).catch(e => callback(e, null))
      }

      function deleteRows (rows, callback) {
        batchIterator(summary.deleteSignature, rows, b => arrayPerColumnForCols(b, summary.whereColumns, false))
          .then(res => {
            callback(null, res)
          }).catch(e => callback(e, null))
      }

      function getMeta () {
        return meta
      }

      function setBatchSize (batchSize) {
        batch = batchSize
      }

      function setWhereCols (whereCols) {
        meta.setWhereCols(whereCols)
        summary = meta.getSummary()
      }

      function setUpdateCols (updateCols) {
        meta.setUpdateCols(updateCols)
        summary = meta.getSummary()
      }

      function getSummary () {
        return meta.getSummary()
      }

      // insert only
      function setUseBcp (v) {
        bcp = v
        if (bcp) {
          this.useMetaType(true)
        }
      }

      function setBcpVersion (v) {
        bcpVersion = v
      }

      function getBcpVersion () {
        return bcpVersion
      }

      function getUseBcp () {
        return bcp
      }

      function useMetaType (v) {
        if (v) {
          meTableType = asTableType('me')
          tvp = userTypes.TvpFromTable(meTableType)
          for (let i = 0; i < meta.cols.length; ++i) {
            const col = meta.cols[i]
            declaredTypeByColumn[col.name] = tvp.table_value_param[i]
          }
        } else {
          meTableType = null
          tvp = null
          declaredTypeByColumn = {}
        }
      }

      // public api

      this.useMetaType = useMetaType
      this.asTableType = asTableType
      this.asUserType = asUserType

      this.insertRows = insertRows
      this.selectRows = selectRows
      this.deleteRows = deleteRows
      this.updateRows = updateRows

      this.setBatchSize = setBatchSize
      this.setWhereCols = setWhereCols
      this.setUpdateCols = setUpdateCols
      this.getMeta = getMeta
      this.meta = meta
      this.columns = meta.getAllColumns()
      this.getSummary = getSummary
      this.setUseBcp = setUseBcp
      this.getUseBcp = getUseBcp
      this.setBcpVersion = setBcpVersion
      this.getBcpVersion = getBcpVersion
      this.keys = keys
      this.promises = new BulkPromises(this)
    }
  }

  return {
    TableMgr
  }
})()

exports.tableModule = tableModule
'use strict'

const userModule = ((() => {
  /*
 sql.UDT(value)
 sql.Geography(value)
 sql.Geometry(value)
 sql.Variant(value)
 */

  function SqlTypes () {
    // var SQL_UNKNOWN_TYPE = 0;
    // var SQL_DECIMAL = 3;
    // var SQL_INTERVAL = 10;
    // var SQL_TIMESTAMP = 11;
    // var SQL_BINARY = -2;
    // var SQL_WCHAR = -8;
    // var SQL_SS_VARIANT = -150;
    // var SQL_SS_UDT = -151;
    // var SQL_SS_XML = -152;
    const SQL_SS_TABLE = -153
    const SQL_CHAR = 1
    const SQL_NUMERIC = 2
    const SQL_INTEGER = 4
    const SQL_SMALLINT = 5
    const SQL_FLOAT = 6
    const SQL_REAL = 7
    const SQL_DOUBLE = 8
    const SQL_VARCHAR = 12
    // var SQL_LONGVARCHAR = -1;
    const SQL_VARBINARY = -3
    const SQL_LONGVARBINARY = -4
    const SQL_BIGINT = -5
    const SQL_TINYINT = -6
    const SQL_BIT = -7
    const SQL_WVARCHAR = -9
    const SQL_WLONGVARCHAR = -10
    const SQL_TYPE_DATE = 91
    const SQL_TYPE_TIMESTAMP = 93
    const SQL_SS_TIME2 = -154
    const SQL_SS_TIMESTAMPOFFSET = -155

    // currently mapped in the driver .. either through a guess by looking at type or explicitly from user

    function Bit (p) {
      return {
        sql_type: SQL_BIT,
        value: p
      }
    }

    // sql.BigInt(value)

    function BigInt (p) {
      return {
        sql_type: SQL_BIGINT,
        value: p
      }
    }

    // sql.Float(value)

    function Float (p) {
      return {
        sql_type: SQL_FLOAT,
        value: p
      }
    }

    // sql.Real(value)

    function Real (p) {
      return {
        sql_type: SQL_REAL,
        value: p
      }
    }

    // sql.Int(value)

    function Int (p) {
      return {
        sql_type: SQL_INTEGER,
        value: p
      }
    }

    // sql.SmallInt(value)

    function SmallInt (p) {
      return {
        sql_type: SQL_SMALLINT,
        value: p
      }
    }

    // sql.TinyInt(value)

    function TinyInt (p) {
      return {
        sql_type: SQL_TINYINT,
        value: p
      }
    }

    // sql.Numeric(value, [precision], [scale]) -- optional precision and scale definition

    function Numeric (p, precision, scale) {
      return {
        sql_type: SQL_NUMERIC,
        value: p,
        precision: precision > 0
          ? precision
          : 0,
        scale: scale > 0
          ? scale
          : 0
      }
    }

    // sql.Money(value) - uses underlying numeric type with driver computed precision/scale

    function Money (p) {
      return {
        sql_type: SQL_NUMERIC,
        value: p,
        precision: 0,
        scale: 0
      }
    }

    // sql.SmallMoney(value)

    function VarBinary (p) {
      return {
        sql_type: SQL_VARBINARY,
        value: p
      }
    }

    function LongVarBinary (p) {
      return {
        sql_type: SQL_LONGVARBINARY,
        value: p
      }
    }

    function WVarChar (p) {
      return {
        sql_type: SQL_WVARCHAR,
        value: p
      }
    }

    function WLongVarChar (p) {
      return {
        sql_type: SQL_WLONGVARCHAR,
        value: p
      }
    }

    // sql.DateTimeOffset(value, [scale]) -- optional scale definition

    function DateTimeOffset (p, scale, offset) {
      return {
        sql_type: SQL_SS_TIMESTAMPOFFSET,
        value: p,
        scale: scale > 0
          ? scale
          : 0,
        offset
      }
    }

    function Double (p) {
      return {
        sql_type: SQL_DOUBLE,
        value: p
      }
    }

    // sql.Char(value, [length]) -- optional length definition

    function Char (p, precision) {
      return {
        sql_type: SQL_CHAR,
        value: p,
        precision: precision > 0
          ? precision
          : 0
      }
    }

    // sql.VarChar(value, [length]) -- optional length definition

    function VarChar (p, precision) {
      return {
        sql_type: SQL_VARCHAR,
        value: p,
        precision: precision > 0
          ? precision
          : 0
      }
    }

    // sql.Time(value, [scale]) -- optional scale definition

    function Time2 (p, scale, offset) {
      return {
        sql_type: SQL_SS_TIME2,
        value: p,
        scale: scale > 0
          ? scale
          : 0,
        offset
      }
    }

    function MyDate (p, offset) {
      return {
        sql_type: SQL_TYPE_DATE,
        offset,
        value: p
      }
    }

    function DateTime (p, offset) {
      return {
        sql_type: SQL_TYPE_TIMESTAMP,
        offset,
        value: p
      }
    }

    // fraction is not yet used by driver, this is a placeholder for potential use given
    // a JS date only holds MS resolution.  Also presents an issue of how to pass this
    // additional information back to the client.

    // sql.DateTime2(value, [scale]) -- optional scale definition

    function DateTime2 (p, scale, fraction, offset) {
      if (!fraction && p) {
        fraction = 0
        if (Array.isArray(p)) {
          if (p.length > 0) {
            const s = p.find(o => !!o)
            if (s) {
              fraction = s.getUTCMilliseconds()
            }
          }
        } else {
          fraction = p.getUTCMilliseconds()
        }
      }
      return {
        sql_type: SQL_TYPE_TIMESTAMP,
        offset,
        value: p,
        fraction,
        scale: scale > 0
          ? scale
          : 0
      }
    }

    // datetime Date round to 10 ms as fraction is not guaranteed

    function DateRound (d, scale) {
      if (!d) {
        d = new Date()
      }
      if (!scale) {
        scale = 10
      }
      const rms = Math.ceil(d.getUTCMilliseconds() / scale) * scale
      return new Date(Date.UTC(
        d.getUTCFullYear(),
        d.getUTCMonth(),
        d.getUTCDate(),
        d.getUTCHours(),
        d.getUTCMinutes(),
        d.getUTCSeconds(),
        rms
      ))
    }

    function TzOffsetQuery (s, offsetMinutes) {
      const offset = offsetMinutes || -new Date().getTimezoneOffset()
      return {
        query_str: s,
        query_timeout: 0,
        query_polling: false,
        query_tz_adjustment: offset
      }
    }

    function PollingQuery (s) {
      return {
        query_str: s,
        query_timeout: 0,
        query_polling: true,
        query_tz_adjustment: 0
      }
    }

    function TimeoutQuery (s, tSecs) {
      return {
        query_str: s,
        query_timeout: tSecs,
        query_polling: false,
        query_tz_adjustment: 0
      }
    }

    function fromRow (rows, c) {
      let v
      if (rows.length === 1) {
        v = rows[0][c]
      } else {
        v = []
        for (let r = 0; r < rows.length; ++r) {
          v[v.length] = rows[r][c]
        }
      }
      return v
    }

    function Table (typeName, cols) {
      const rows = []
      const columns = []
      let schema = 'dbo'
      let unqualifiedTableName = typeName
      const schemaIndex = typeName.indexOf('.')
      if (schemaIndex > 0) {
        schema = typeName.substr(0, schemaIndex)
        unqualifiedTableName = typeName.substr(schemaIndex + 1)
      }

      if (cols && Array.isArray(cols)) {
        cols.forEach(c => {
          columns.push(c)
          if (Object.prototype.hasOwnProperty.call(c, 'schema_name')) {
            schema = c.schema_name
          }
        })
      }

      function addRowsFromObjects (vec) {
        vec.forEach(v => {
          addRowFromObject(v)
        })
      }

      function addRowFromObject (o) {
        const row = []
        columns.forEach(col => {
          row.push(o[col.name])
        })
        rows.push(row)
      }

      return {
        schema,
        name: unqualifiedTableName,
        rows,
        columns,
        addRowsFromObjects
      }
    }

    function TvpFromTable (p) {
      const tp = {
        sql_type: SQL_SS_TABLE,
        table_name: p.name,
        type_id: p.name,
        is_user_defined: true,
        is_output: false,
        value: p,
        table_value_param: [],
        row_count: 1,
        schema: p.schema || 'dbo'
      }
      if (Object.prototype.hasOwnProperty.call(p, 'columns') &&
        Object.prototype.hasOwnProperty.call(p, 'rows')) {
        const cols = p.columns
        const rows = p.rows
        tp.row_count = rows.length
        for (let c = 0; c < cols.length; ++c) {
          const v = rows.length > 0 ? fromRow(rows, c) : []
          const { scale, precision, type: ty } = cols[c]
          tp.table_value_param[c] = getSqlTypeFromDeclaredType({
            scale,
            precision,
            ...ty
          }, v)
        }
      }

      return tp
    }

    function getSqlTypeFromDeclaredType (dt, p) {
      const type = dt.declaration || dt.type
      switch (type) {
        case 'char':
        case 'nchar':
          return Char(p)

        case 'varchar':
        case 'uniqueidentifier':
          return VarChar(p)

        case 'nvarchar':
          return WVarChar(p)

        case 'text':
          return VarChar(p)

        case 'int':
          return Int(p)

        case 'bigint':
          return BigInt(p)

        case 'tinyint':
          return TinyInt(p)

        case 'smallint':
          return SmallInt(p)

        case 'bit':
          return Bit(p)

        case 'float':
          return Float(p)

        case 'numeric':
          return Numeric(p, dt.precision, dt.scale)

        case 'decimal':
          return Numeric(p, dt.precision, dt.scale)

        case 'real':
          return Real(p)

        case 'date':
          return MyDate(p, dt.offset)

        case 'datetime':
          return DateTime(p, dt.offset)

        case 'datetimeoffset':
          return DateTimeOffset(p, dt.scale, dt.offset)

        case 'datetime2':
          return DateTime2(p, dt.scale, 0, dt.offset)

        case 'smalldatetime':
          return DateTime2(p, dt.scale, 0, dt.offset)

        case 'time':
          return Time2(p, dt.scale, dt.offset)

        case 'money':
          return Money(p)

        case 'smallmoney':
          return Money(p)

        case 'binary':
        case 'varbinary':
        case 'hierarchyid':
          return VarBinary(p)

        default:
          return null
      }
    }

    return {
      TzOffsetQuery,
      TimeoutQuery,
      PollingQuery,
      Bit,
      BigInt,
      Int,
      TinyInt,
      Numeric,
      Money,
      SmallMoney: Money,
      VarBinary,
      UniqueIdentifier: WVarChar,
      LongVarBinary,
      Image: LongVarBinary,
      WVarChar,
      Double,
      Decimal: Numeric,
      SmallInt,
      Float,
      Real,
      Char,
      VarChar,
      WLongVarChar,
      NChar: Char,
      NVarChar: WVarChar,
      Text: VarChar,
      NText: WVarChar,
      Xml: WVarChar,
      Time2,
      Time: Time2,
      MyDate,
      DateTime,
      DateTime2,
      DateRound,
      SmallDateTime: DateTime2,
      DateTimeOffset,
      TvpFromTable,
      Table,
      getSqlTypeFromDeclaredType
    }
  }

  return {
    SqlTypes
  }
})())

exports.userModule = userModule
const utilModule = ((() => {
  /*
  console.log(stripEscape('[node].[dbo].[BusinessID]'))
  console.log(stripEscape('[dbo].[BusinessID]'))
  console.log(stripEscape('dbo.[BusinessID]'))
  console.log(stripEscape('node.dbo.[BusinessID]'))
  console.log(stripEscape('node.dbo.BusinessID'))
  console.log(stripEscape('[Age]'))
  console.log(stripEscape('Name'))

BusinessID
BusinessID
BusinessID
BusinessID
BusinessID
Age
Name
   */

  class SchemaSplitter {
    stripEscape (columnName) {
      const columnParts = columnName.split(/\.(?![^[]*])/g)
      const qualified = columnParts[columnParts.length - 1]
      const columnNameRegexp = /\[?(.*?)]?$/g
      const match = columnNameRegexp.exec(qualified)
      const trim = match.filter(r => r !== '')
      return trim[trim.length - 1]
    }

    strip (name) {
      return name.replace(/^\[|]$/g, '').replace(/]]/g, ']')
    }

    substitute (sql, decomp) {
      // removes brackets at start end end, change ']]' to ']'
      sql = sql.replace(/<table_name>/g, this.strip(decomp.table))
        // removes brackets at start end end, change ']]' to ']'
        .replace(/<table_schema>/g, this.strip(decomp.schema))
        // use the escaped table name for the OBJECT_ID() function
        .replace(/<escaped_table_name>/g, decomp.fullTableName)
        // use the escaped table name for the OBJECT_ID() function
        .replace(/<table_catalog>/g, decomp.cat)
      return sql
    }

    decomposeSchema (qualifiedName, cat) {
      cat = cat || ''
      // Split table names like 'dbo.table1' to: ['dbo', 'table1'] and 'table1' to: ['table1']
      const tableParts = qualifiedName.split(/\.(?![^[]*])/g)
      const table = tableParts[tableParts.length - 1] // get the table name
      let fullTableName = table
      // get the table schema, if missing set schema to ''
      const schema = tableParts.length >= 2 ? tableParts[tableParts.length - 2] || '' : ''
      if (tableParts.length > 2) {
        cat = tableParts[tableParts.length - 3]
      } else if (table[0] === '#') {
        cat = '[tempdb]'
        fullTableName = `${cat}.${schema}.${table}`
      }
      return {
        qualifiedName,
        fullTableName,
        cat,
        schema,
        table
      }
    }
  }

  class QueryAggregator {
    constructor (connectionProxy) {
      function getOpt (src, p, def) {
        if (!src) {
          return def
        }
        let ret
        if (Object.hasOwnProperty.call(src, p)) {
          ret = src[p]
        } else {
          ret = def
        }
        return ret
      }

      function timeOut (q, timeoutMs, reject) {
        return setTimeout(() => {
          try {
            q.pauseQuery()
            q.cancelQuery((e) => {
              reject(e || new Error(`query cancelled timeout ${timeoutMs}`))
            })
          } catch (e) {
            reject(e)
          }
        }, timeoutMs)
      }

      function emptyResults () {
        return {
          elapsed: new Date(),
          first: null,
          meta: [],
          counts: [],
          results: [],
          output: null,
          info: null,
          errors: [],
          returns: null
        }
      }

      function run (q, options) {
        return new Promise((resolve, reject) => {
          if (connectionProxy.isClosed()) {
            reject(new Error('connection is closed.'))
          }
          let handle = null

          const ret = emptyResults()
          const timeoutMs = getOpt(options, 'timeoutMs', 0)
          const raw = getOpt(options, 'raw', false)
          const replaceEmptyColumnNames = getOpt(options, 'replaceEmptyColumnNames', false)

          let row = null
          if (timeoutMs) {
            handle = timeOut(q, timeoutMs, reject)
          }

          function onRowCount (count) {
            ret.counts.push(count)
          }

          function onOutput (o) {
            ret.output = o
            if (o.length > 0) {
              ret.returns = o[0]
            }
          }

          function onError (e, more) {
            ret.errors.push(e)
            if (!more) {
              e._results = ret
            }
          }

          function onInfo (m) {
            if (!ret.info) {
              ret.info = []
            }
            ret.info.push(m.message.substr(m.message.lastIndexOf(']') + 1))
          }

          function onMeta (meta) {
            for (let i = 0; i < meta.length; ++i) {
              if (replaceEmptyColumnNames) {
                if (!meta[i].name || meta[i].length === 0) {
                  meta[i].name = `Column${i}`
                }
              }
            }
            ret.meta.push(meta)
            ret.results.push([])
            if (ret.first === null) {
              ret.first = ret.results[0]
            }
          }

          function onRow () {
            const resultId = ret.meta.length - 1
            row = raw ? [ret.meta[resultId].length] : {}
          }

          function rejectResolve () {
            if (ret.errors.length > 0) {
              reject(ret.errors[ret.errors.length - 1])
            } else {
              resolve(ret)
            }
          }

          function onDone () {
            if (handle) {
              clearTimeout(handle)
            }
            unSubscribe()
            ret.elapsed = new Date() - ret.elapsed
            if (q.isPrepared()) {
              rejectResolve()
            }
          }

          function onFree () {
            q.removeListener('free', onFree)
            rejectResolve()
          }

          function onColumn (c, v) {
            const resultId = ret.meta.length - 1
            const meta = ret.meta[resultId]
            const results = ret.results[resultId]
            if (raw) {
              row[c] = v
            } else {
              row[meta[c].name] = v
            }
            if (c === meta.length - 1) {
              results.push(row)
            }
          }

          function unSubscribe () {
            q.removeListener('rowcount', onRowCount)
            q.removeListener('column', onColumn)
            q.removeListener('output', onOutput)
            q.removeListener('error', onError)
            q.removeListener('info', onInfo)
            q.removeListener('meta', onMeta)
            q.removeListener('row', onRow)
            q.removeListener('done', onDone)
            if (q.isPrepared()) {
              q.removeListener('free', onFree)
            }
          }

          function subscribe () {
            q.on('rowcount', onRowCount)
            q.on('output', onOutput)
            q.on('error', onError)
            q.on('info', onInfo)
            q.on('meta', onMeta)
            q.on('row', onRow)
            q.on('done', onDone)
            q.on('free', onFree)
            q.on('column', onColumn)
          }

          subscribe()
        })
      }

      function callProc (name, params, options) {
        const q = connectionProxy.callproc(name, params)
        return run(q, options)
      }

      function query (sql, params, options) {
        const q = connectionProxy.query(sql, params)
        return run(q, options)
      }

      function queryPrepared (q, options) {
        return run(q, options)
      }

      this.queryPrepared = queryPrepared
      this.callProc = callProc
      this.query = query
    }
  }
  return {
    QueryAggregator,
    SchemaSplitter
  }
})())

exports.utilModule = utilModule
'use strict'

const EventEmitter = require('events').EventEmitter

const debug = require('debug')('msnodesqlv8-sequelize')
const mssql = require('msnodesqlv8')
const uuid = require('uuid')

const Request = require('./request.js')

function detectDriver () {
  const drivers = [
    'SQL Server Native Client 14.0',
    'SQL Server Native Client 13.0',
    'SQL Server Native Client 12.0',
    'SQL Server Native Client 11.0',
    'SQL Server Native Client 10.0',
    'SQL Native Client',
    'SQL Server'
  ]
  let detectedDriver = null
  return drivers.reduce((prev, driver) => {
    return prev.then(() => {
      if (detectedDriver !== null) {
        return
      }
      return new Promise((resolve) => {
        mssql.open(`Driver=${driver};`, (err, conn) => {
          if (err) {
            if (err.message.indexOf('Neither DSN nor SERVER keyword supplied') !== -1 && detectedDriver === null) {
              detectedDriver = driver
            }
          } else {
            // Should not be possible because nothing but driver is specified.
            conn.close(() => {})
          }
          resolve()
        })
      })
    })
  }, Promise.resolve()).then(() => {
    if (detectedDriver) {
      return detectedDriver
    }
    throw new Error('driver was not specified and no driver was detected')
  })
}

class Connection extends EventEmitter {
  constructor (config) {
    super()
    this.STATE = { INITIALIZED: 1 }
    config = Object.assign({}, config, config.options)
    delete config.options

    if (!config.connectionString) {
      if (typeof config.instanceName !== 'string' || config.instanceName.match(/^MSSQLSERVER$/i)) {
        config.instanceName = ''
      }
      config.connectionString = (config.driver ? `Driver={${config.driver}};` : '') +
        `Server=${config.server ? config.server : 'localhost'}\\${config.instanceName};` +
        (config.database ? `Database=${config.database};` : '') +
        (config.trustedConnection ? 'Trusted_Connection=yes;' : `Uid=${config.userName || ''};Pwd=${config.password || ''};`)
    }

    this.uuid = uuid.v4()
    this.config = config
    this.connection = null
    this.connectionCloseFunc = null
    this.timer = null
    this.requests = []

    Promise.resolve().then(() => {
      const match = this.config.connectionString.match(/(?:^\s*Driver\s*=)|(?:;\s*Driver\s*=)/i)
      if (!match) {
        return detectDriver().then((driver) => {
          this.config.driver = driver
          this.config.connectionString = `Driver={${driver}};${this.config.connectionString}`
        })
      }
    }).then(() => {
      this.connect()
    }).catch((err) => {
      this.emit('connect', err)
    })
  }

  get closed () {
    return this.connection === null || this.connection.close !== this.connectionCloseFunc
  }

  get loggedIn () {
    return !this.closed
  }

  connect () {
    mssql.open(this.config.connectionString, (err, conn) => {
      if (!err) {
        debug(`connection (${this.uuid}): opened`)
        this.connection = conn
        this.connectionCloseFunc = conn.close
        // Poll connection to make sure it is still open.
        this.timer = setInterval(() => {
          if (this.closed) {
            this.reset()
          }
        }, 5000)
      }
      this.emit('connect', err)
    })
  }

  reset () {
    debug(`connection (${this.uuid}): reset by peer`)
    const error = new Error('connection reset by peer')
    error.code = 'ECONNRESET'
    this.emit('error', error)
  }

  close () {
    clearInterval(this.timer)
    this.timer = null
    if (this.connection !== null) {
      this.connection.close((err) => {
        this.connection = null
        this.emit('end', err)
      })
    } else {
      this.emit('end', new Error('connection already closed'))
    }
    this.requests.slice().forEach((request) => this.removeRequest(request, new Error('connection closed')))
    debug(`connection (${this.uuid}): closed`)
  }

  beginTransaction (callback, name) {
    name = name ? `[${name}]` : ''
    const request = new Request(`BEGIN TRANSACTION ${name};`, (err) => {
      if (typeof callback === 'function') {
        callback(err)
      }
    })
    request.execute(this)
  }

  commitTransaction (callback, name) {
    name = name ? `[${name}]` : ''
    const request = new Request(`COMMIT TRANSACTION ${name};`, (err) => {
      if (typeof callback === 'function') {
        callback(err)
      }
    })
    request.execute(this)
  }

  rollbackTransaction (callback, name) {
    name = name ? `[${name}]` : ''
    const request = new Request(`ROLLBACK TRANSACTION ${name};`, (err) => {
      if (typeof callback === 'function') {
        callback(err)
      }
    })
    request.execute(this)
  }

  saveTransaction (callback, name) {
    if (!name) {
      callback(new Error('name required for transaction savepoint'))
      return
    }
    name = `[${name}]`
    const request = new Request(`SAVE TRANSACTION ${name};`, (err) => {
      if (typeof callback === 'function') {
        callback(err)
      }
    })
    request.execute(this)
  }

  execSql (request) {
    request.execute(this)
  }

  removeRequest (request, error) {
    debug(`connection (${this.uuid}): removing request (${request.uuid})`)
    const index = this.requests.indexOf(request)
    if (index !== -1) {
      this.requests.splice(index, 1)
      if (error && typeof request.callback === 'function') {
        request.callback(error)
      }
    }
  }
}

module.exports = Connection
'use strict'
/*
  thanks to https://www.npmjs.com/package/sequelize-msnodesqlv8
  this module is now included and supported as part of msnodesqlv8
 */

const Connection = require('./connection.js')
const Request = require('./request.js')

module.exports = {
  Connection: Connection,
  Request: Request,
  ISOLATION_LEVEL: {},
  TYPES: {}
}
'use strict'

const EventEmitter = require('events').EventEmitter
const uuid = require('uuid')
const debug = require('debug')('msnodesqlv8-sequelize')

class Request extends EventEmitter {
  constructor (sql, callback) {
    super()

    this.uuid = uuid.v4()
    this.sql = sql
    this.callback = callback
    this.params = []

    debug(`creating request (${this.uuid}): ${this.sql.length > 80 ? this.sql.slice(0, 80) + '...' : this.sql}`)
  }

  static createColumn (metadata, index, data) {
    const columnMetadata = metadata[index]
    return {
      metadata: {
        colName: columnMetadata.name,
        type: {
          id: columnMetadata.sqlType
        },
        nullable: columnMetadata.nullable,
        size: columnMetadata.size
      },
      value: data
    }
  }

  addParameter (key, paramType, value, typeOptions) {
    this.params.push(value)
  }

  execute (context) {
    let metadata = null
    let currentRow = null
    let e = null
    let rowCount = 0
    let lastColumn = 0

    debug(`connection (${context.uuid}): executing request (${this.uuid})`)
    let s = this.sql
    context.requests.push(this)
    try {
      if (this.params.length > 0) {
        if (s.startsWith('INSERT')) {
          s = s.replace(/@\d+/g, '?')
        } else if (s.startsWith('UPDATE')) {
          s = s.replace(/\s*=\s*@\d+/g, ' = ?')
        }
      }
      const request = context.connection.queryRaw(s, this.params)

      request.on('meta', (meta) => {
        metadata = meta
        currentRow = [metadata.length]
        lastColumn = metadata.length - 1
      })

      request.on('column', (index, data) => {
        currentRow[index] = Request.createColumn(metadata, index, data)
        if (index === lastColumn) {
          ++rowCount
          this.emit('row', currentRow)
          currentRow = [metadata.length]
        }
      })

      request.on('error', err => {
        e = err
        context.removeRequest(this, e)
      })

      request.on('done', () => {
        context.removeRequest(this)
        if (typeof this.callback === 'function') {
          this.callback(e, rowCount)
        }
      })
    } catch (ex) {
      context.removeRequest(this, ex)
      context.close()
    }
  }
}

module.exports = Request
with proc_exist_cte(object_id, proc_name, type_desc) as
(
	SELECT object_id, name as proc_name, type_desc  
		FROM sys.objects WHERE type = 'P' AND object_id = object_id('<schema_name>.<escaped_procedure_name>')
), 
proc_params_cte(object_id,has_default_value,default_value,is_output,[name],type_id,max_length,[order],collation,is_user_defined) as
( 
select
	object_id,
    has_default_value,
    default_value,
    is_output,
    sp.name,
    type_id   = type_name(sp.user_type_id),
    sp.max_length,
    'order'  = parameter_id,
    'collation'   = convert(sysname,
        case
            when sp.system_type_id in (35, 99, 167, 175, 231, 239)
                then ServerProperty('collation') end),
    ty.is_user_defined
 from
	sys.parameters sp
	left outer join sys.table_types ty
	    on ty.name=type_name(sp.user_type_id)
		and ty.schema_id = schema_id('<schema_name>')
	where
	    object_id = object_id('<schema_name>.<escaped_procedure_name>')
) select 
	r.proc_name, r.type_desc, 
    p.* 
        from proc_exist_cte r
	outer apply 
    proc_params_cte p
SELECT
  CASE
     WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('productversion')) like '8%' THEN 2000
     WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('productversion')) like '9%' THEN 2005
     WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('productversion')) like '10.0%' THEN 2008
     WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('productversion')) like '10.5%' THEN 2008.2
     WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('productversion')) like '11%' THEN 2012
     WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('productversion')) like '12%' THEN 2014
     WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('productversion')) like '13%' THEN 2016
     WHEN CONVERT(VARCHAR(128), SERVERPROPERTY ('productversion')) like '14%' THEN 2017
     ELSE 0
  END AS MajorVersion,
  SERVERPROPERTY('ProductLevel') AS ProductLevel,
  SERVERPROPERTY('Edition') AS Edition,
  SERVERPROPERTY('ProductVersion') AS ProductVersion,
  DB_NAME() as CatWITH t_name_cte(id, full_name, table_name) AS
(SELECT  TOP (1)
	0 AS id,
	TABLE_CATALOG + '..' + TABLE_NAME AS full_name,
	TABLE_NAME
	FROM
		<table_catalog>.INFORMATION_SCHEMA.COLUMNS sc
		inner join <table_catalog>.sys.objects so
		on so.name = sc.TABLE_NAME
  	WHERE object_id = OBJECT_ID('<table_catalog>.<table_schema>.<table_name>')
)
SELECT
  distinct
  sc.ordinal_position,
  sc.table_catalog,
	sc.table_schema,
	sc.table_name,
  sc.column_default,
  c.name name,
  t.Name type,
  c.max_length,
  c.precision,
  c.scale,
  c.is_nullable,
  c.is_computed,
  c.is_identity,
  c.object_id,
  0 as generated_always_type,
  'NOT_APPLICABLE' as generated_always_type_desc,
  0 as is_hidden,
  (
  CASE
  WHEN CONSTRAINT_NAME IN (SELECT NAME
                           FROM <table_catalog>.sys.objects
                           WHERE TYPE = 'PK')
    THEN 1
  ELSE 0
  END) AS is_primary_key,
  (CASE
  WHEN CONSTRAINT_NAME IN (SELECT NAME
                           FROM <table_catalog>.sys.objects
                           WHERE TYPE = 'F')
    THEN 1
  ELSE 0
  END) AS is_foreign_key
FROM <table_catalog>.INFORMATION_SCHEMA.TABLES st
  INNER JOIN <table_catalog>.INFORMATION_SCHEMA.COLUMNS sc
    ON sc.TABLE_CATALOG = st.TABLE_CATALOG
       AND sc.TABLE_SCHEMA = st.TABLE_SCHEMA
       AND sc.TABLE_NAME = st.TABLE_NAME
  LEFT JOIN <table_catalog>.INFORMATION_SCHEMA.KEY_COLUMN_USAGE u
    ON sc.TABLE_CATALOG = u.TABLE_CATALOG
       AND sc.TABLE_SCHEMA = u.TABLE_SCHEMA
       AND sc.TABLE_NAME = u.TABLE_NAME
       AND sc.COLUMN_NAME = u.COLUMN_NAME
  cross join t_name_cte r
  INNER JOIN 
  <table_catalog>.sys.columns c ON c.name = sc.column_name
  INNER JOIN
  <table_catalog>.sys.types t ON c.user_type_id = t.user_type_id
  INNER JOIN
  <table_catalog>.sys.tables ta ON ta.name = r.table_name
  LEFT OUTER JOIN
  <table_catalog>.sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id
  LEFT OUTER JOIN
  <table_catalog>.sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
WHERE
  c.object_id = ta.object_id
  AND TABLE_TYPE = 'BASE TABLE'
  AND sc.TABLE_NAME = r.table_name
  AND (sc.TABLE_SCHEMA = '<table_schema>' or '<table_schema>' = '')
  AND (ta.schema_id = SCHEMA_ID('<table_schema>') or '<table_schema>' = '')
  
WITH t_name_cte(id, full_name, table_name) AS
(SELECT  TOP (1)
	0 AS id,
	TABLE_CATALOG + '..' + TABLE_NAME AS full_name,
	TABLE_NAME
	FROM
		<table_catalog>.INFORMATION_SCHEMA.COLUMNS sc
		inner join <table_catalog>.sys.objects so
		on so.name = sc.TABLE_NAME
  	WHERE object_id = OBJECT_ID('<table_catalog>.<table_schema>.<table_name>')
)
SELECT
    distinct
    sc.ordinal_position,
    sc.table_catalog,
	  sc.table_schema,
	  sc.table_name,
    sc.column_default,
    c.name name,
    t.Name type,
    c.max_length,
    c.precision,
    c.scale,
    c.is_nullable,
    c.is_computed,
    c.is_identity,
    c.object_id,
    c.generated_always_type,
    c.generated_always_type_desc,
    c.is_hidden,
  (
  CASE
  WHEN CONSTRAINT_NAME IN (SELECT NAME
                           FROM <table_catalog>.sys.objects
                           WHERE TYPE = 'PK')
    THEN 1
  ELSE 0
  END) AS is_primary_key,
  (CASE
  WHEN CONSTRAINT_NAME IN (SELECT NAME
                           FROM <table_catalog>.sys.objects
                           WHERE TYPE = 'F')
    THEN 1
  ELSE 0
  END) AS is_foreign_key
FROM <table_catalog>.INFORMATION_SCHEMA.TABLES st
  INNER JOIN <table_catalog>.INFORMATION_SCHEMA.COLUMNS sc
    ON sc.TABLE_CATALOG = st.TABLE_CATALOG
       AND sc.TABLE_SCHEMA = st.TABLE_SCHEMA
       AND sc.TABLE_NAME = st.TABLE_NAME
  LEFT JOIN <table_catalog>.INFORMATION_SCHEMA.KEY_COLUMN_USAGE u
    ON sc.TABLE_CATALOG = u.TABLE_CATALOG
       AND sc.TABLE_SCHEMA = u.TABLE_SCHEMA
       AND sc.TABLE_NAME = u.TABLE_NAME
       AND sc.COLUMN_NAME = u.COLUMN_NAME
  cross join t_name_cte r
  INNER JOIN 
  <table_catalog>.sys.columns c ON c.name = sc.column_name
  INNER JOIN
  <table_catalog>.sys.types t ON c.user_type_id = t.user_type_id
  INNER JOIN
  <table_catalog>.sys.tables ta ON ta.name = r.table_name
  LEFT OUTER JOIN
  <table_catalog>.sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id
  LEFT OUTER JOIN
  <table_catalog>.sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
WHERE
  c.object_id = ta.object_id
  AND TABLE_TYPE = 'BASE TABLE'
  AND sc.TABLE_NAME = r.table_name
  AND (sc.TABLE_SCHEMA = '<table_schema>' or '<table_schema>' = '')
  AND (ta.schema_id = SCHEMA_ID('<table_schema>') or '<table_schema>' = '')
  
SELECT SCHEMA_NAME(type_t.schema_id) + '.' + type_t.name      AS type_name,
	   SCHEMA_NAME(type_t.schema_id) as schema_name,
	   type_t.name as type_id,
       col.column_id,
       SUBSTRING(CAST(col.column_id + 100 AS char(3)), 2, 2)  + ': ' + col.name   AS ordered_column,
	   col.name                                         AS column_name,
       col.name                                         AS name,
       ST.name                                          AS data_type,
       ST.name                                          AS type_id,
       ST.name                                          AS declaration,
       (CASE col.Is_Nullable
       WHEN 1 THEN ''
       ELSE        'NOT NULL'
       END)                                             AS nullable,
       col.max_length                                   AS length,
       col.[precision]                                  AS precision,
       col.scale                                        AS scale,
       ST.collation                                     AS collation,
       0                                                As is_output,
	   col.system_type_id,
	   col.column_id

FROM sys.table_types type_t
JOIN sys.columns     col
    ON type_t.type_table_object_id = col.object_id
JOIN sys.systypes AS ST
ON  ST.xtype = col.system_type_id  and st.xusertype=col.user_type_id
where
	type_t.is_user_defined = 1
	and type_t.schema_id = schema_id('<table_schema>')
	and type_t.name = '<table_name>'

ORDER BY type_name,
         col.column_id
class Comparator {
  /**
   * @param {function(a: *, b: *)} [compareFunction] - It may be custom compare function that, let's
   * say may compare custom objects together.
   */
  constructor (compareFunction) {
    this.compare = compareFunction || Comparator.defaultCompareFunction
  }

  /**
   * Default comparison function. It just assumes that "a" and "b" are strings or numbers.
   * @param {(string|number)} a
   * @param {(string|number)} b
   * @returns {number}
   */
  static defaultCompareFunction (a, b) {
    if (a === b) {
      return 0
    }

    return a < b ? -1 : 1
  }

  /**
   * Checks if two variables are equal.
   * @param {*} a
   * @param {*} b
   * @return {boolean}
   */
  equal (a, b) {
    return this.compare(a, b) === 0
  }

  /**
   * Checks if variable "a" is less than "b".
   * @param {*} a
   * @param {*} b
   * @return {boolean}
   */
  lessThan (a, b) {
    return this.compare(a, b) < 0
  }

  /**
   * Checks if variable "a" is greater than "b".
   * @param {*} a
   * @param {*} b
   * @return {boolean}
   */
  greaterThan (a, b) {
    return this.compare(a, b) > 0
  }

  /**
   * Checks if variable "a" is less than or equal to "b".
   * @param {*} a
   * @param {*} b
   * @return {boolean}
   */
  lessThanOrEqual (a, b) {
    return this.lessThan(a, b) || this.equal(a, b)
  }

  /**
   * Checks if variable "a" is greater than or equal to "b".
   * @param {*} a
   * @param {*} b
   * @return {boolean}
   */
  greaterThanOrEqual (a, b) {
    return this.greaterThan(a, b) || this.equal(a, b)
  }

  /**
   * Reverses the comparison order.
   */
  reverse () {
    const compareOriginal = this.compare
    this.compare = (a, b) => compareOriginal(b, a)
  }
}

exports.Comparator = Comparator
const minHeap = require('../heap/MinHeap')
const comparator = require('../utils/comparator/Comparator')

// It is the same as min heap except that when comparing two elements
// we take into account its priority instead of the element's value.
class PriorityQueue extends minHeap.MinHeap {
  constructor () {
    // Call MinHip constructor first.
    super()

    // Setup priorities map.
    this.priorities = new Map()

    // Use custom comparator for heap elements that will take element priority
    // instead of element value into account.
    this.compare = new comparator.Comparator(this.comparePriority.bind(this))
  }

  /**
   * Add item to the priority queue.
   * @param {*} item - item we're going to add to the queue.
   * @param {number} [priority] - items priority.
   * @return {PriorityQueue}
   */
  add (item, priority = 0) {
    this.priorities.set(item, priority)
    super.add(item)
    return this
  }

  /**
   * Remove item from priority queue.
   * @param {*} item - item we're going to remove.
   * @param {Comparator} [customFindingComparator] - custom function for finding the item to remove
   * @return {PriorityQueue}
   */
  remove (item, customFindingComparator) {
    super.remove(item, customFindingComparator)
    this.priorities.delete(item)
    return this
  }

  /**
   * Change priority of the item in a queue.
   * @param {*} item - item we're going to re-prioritize.
   * @param {number} priority - new item's priority.
   * @return {PriorityQueue}
   */
  changePriority (item, priority) {
    this.remove(item, new comparator.Comparator(this.compareValue))
    this.add(item, priority)
    return this
  }

  /**
   * Find item by ite value.
   * @param {*} item
   * @return {Number[]}
   */
  findByValue (item) {
    return this.find(item, new comparator.Comparator(this.compareValue))
  }

  /**
   * Check if item already exists in a queue.
   * @param {*} item
   * @return {boolean}
   */
  hasValue (item) {
    return this.findByValue(item).length > 0
  }

  /**
   * Compares priorities of two items.
   * @param {*} a
   * @param {*} b
   * @return {number}
   */
  comparePriority (a, b) {
    if (this.priorities.get(a) === this.priorities.get(b)) {
      return 0
    }
    return this.priorities.get(a) < this.priorities.get(b) ? -1 : 1
  }

  /**
   * Compares values of two items.
   * @param {*} a
   * @param {*} b
   * @return {number}
   */
  compareValue (a, b) {
    if (a === b) {
      return 0
    }
    return a < b ? -1 : 1
  }
}

exports.PriorityQueue = PriorityQueue
const comparator = require('../utils/comparator/Comparator')
/**
 * Parent class for Min and Max Heaps.
 */
class Heap {
  /**
   * @constructs Heap
   * @param {Function} [comparatorFunction]
   */
  constructor (comparatorFunction) {
    if (new.target === Heap) {
      throw new TypeError('Cannot construct Heap instance directly')
    }

    // Array representation of the heap.
    this.heapContainer = []
    this.compare = new comparator.Comparator(comparatorFunction)
  }

  /**
   * @param {number} parentIndex
   * @return {number}
   */
  getLeftChildIndex (parentIndex) {
    return (2 * parentIndex) + 1
  }

  /**
   * @param {number} parentIndex
   * @return {number}
   */
  getRightChildIndex (parentIndex) {
    return (2 * parentIndex) + 2
  }

  /**
   * @param {number} childIndex
   * @return {number}
   */
  getParentIndex (childIndex) {
    return Math.floor((childIndex - 1) / 2)
  }

  /**
   * @param {number} childIndex
   * @return {boolean}
   */
  hasParent (childIndex) {
    return this.getParentIndex(childIndex) >= 0
  }

  /**
   * @param {number} parentIndex
   * @return {boolean}
   */
  hasLeftChild (parentIndex) {
    return this.getLeftChildIndex(parentIndex) < this.heapContainer.length
  }

  /**
   * @param {number} parentIndex
   * @return {boolean}
   */
  hasRightChild (parentIndex) {
    return this.getRightChildIndex(parentIndex) < this.heapContainer.length
  }

  /**
   * @param {number} parentIndex
   * @return {*}
   */
  leftChild (parentIndex) {
    return this.heapContainer[this.getLeftChildIndex(parentIndex)]
  }

  /**
   * @param {number} parentIndex
   * @return {*}
   */
  rightChild (parentIndex) {
    return this.heapContainer[this.getRightChildIndex(parentIndex)]
  }

  /**
   * @param {number} childIndex
   * @return {*}
   */
  parent (childIndex) {
    return this.heapContainer[this.getParentIndex(childIndex)]
  }

  /**
   * @param {number} indexOne
   * @param {number} indexTwo
   */
  swap (indexOne, indexTwo) {
    const tmp = this.heapContainer[indexTwo]
    this.heapContainer[indexTwo] = this.heapContainer[indexOne]
    this.heapContainer[indexOne] = tmp
  }

  /**
   * @return {*}
   */
  peek () {
    if (this.heapContainer.length === 0) {
      return null
    }

    return this.heapContainer[0]
  }

  length () {
    return this.heapContainer.length
  }

  /**
   * @return {*}
   */
  poll () {
    if (this.heapContainer.length === 0) {
      return null
    }

    if (this.heapContainer.length === 1) {
      return this.heapContainer.pop()
    }

    const item = this.heapContainer[0]

    // Move the last element from the end to the head.
    this.heapContainer[0] = this.heapContainer.pop()
    this.heapifyDown()

    return item
  }

  /**
   * @param {*} item
   * @return {Heap}
   */
  add (item) {
    this.heapContainer.push(item)
    this.heapifyUp()
    return this
  }

  /**
   * @param {*} item
   * @param {Comparator} [comparator]
   * @return {Heap}
   */
  remove (item, comparator = this.compare) {
    // Find number of items to remove.
    const numberOfItemsToRemove = this.find(item, comparator).length

    for (let iteration = 0; iteration < numberOfItemsToRemove; iteration += 1) {
      // We need to find item index to remove each time after removal since
      // indices are being changed after each heapify process.
      const indexToRemove = this.find(item, comparator).pop()

      // If we need to remove last child in the heap then just remove it.
      // There is no need to heapify the heap afterwards.
      if (indexToRemove === (this.heapContainer.length - 1)) {
        this.heapContainer.pop()
      } else {
        // Move last element in heap to the vacant (removed) position.
        this.heapContainer[indexToRemove] = this.heapContainer.pop()

        // Get parent.
        const parentItem = this.parent(indexToRemove)

        // If there is no parent or parent is in correct order with the node
        // we're going to delete then heapify down. Otherwise heapify up.
        if (
          this.hasLeftChild(indexToRemove) &&
          (
            !parentItem ||
            this.pairIsInCorrectOrder(parentItem, this.heapContainer[indexToRemove])
          )
        ) {
          this.heapifyDown(indexToRemove)
        } else {
          this.heapifyUp(indexToRemove)
        }
      }
    }

    return this
  }

  /**
   * @param {*} item
   * @param {Comparator} [comparator]
   * @return {Number[]}
   */
  find (item, comparator = this.compare) {
    const foundItemIndices = []

    for (let itemIndex = 0; itemIndex < this.heapContainer.length; itemIndex += 1) {
      if (comparator.equal(item, this.heapContainer[itemIndex])) {
        foundItemIndices.push(itemIndex)
      }
    }

    return foundItemIndices
  }

  /**
   * @return {boolean}
   */
  isEmpty () {
    return !this.heapContainer.length
  }

  /**
   * @return {string}
   */
  toString () {
    return this.heapContainer.toString()
  }

  /**
   * @param {number} [customStartIndex]
   */
  heapifyUp (customStartIndex) {
    // Take the last element (last in array or the bottom left in a tree)
    // in the heap container and lift it up until it is in the correct
    // order with respect to its parent element.
    let currentIndex = customStartIndex || this.heapContainer.length - 1

    while (
      this.hasParent(currentIndex) &&
      !this.pairIsInCorrectOrder(this.parent(currentIndex), this.heapContainer[currentIndex])
    ) {
      this.swap(currentIndex, this.getParentIndex(currentIndex))
      currentIndex = this.getParentIndex(currentIndex)
    }
  }

  /**
   * @param {number} [customStartIndex]
   */
  heapifyDown (customStartIndex = 0) {
    // Compare the parent element to its children and swap parent with the appropriate
    // child (smallest child for MinHeap, largest child for MaxHeap).
    // Do the same for next children after swap.
    let currentIndex = customStartIndex
    let nextIndex = null

    while (this.hasLeftChild(currentIndex)) {
      if (
        this.hasRightChild(currentIndex) &&
        this.pairIsInCorrectOrder(this.rightChild(currentIndex), this.leftChild(currentIndex))
      ) {
        nextIndex = this.getRightChildIndex(currentIndex)
      } else {
        nextIndex = this.getLeftChildIndex(currentIndex)
      }

      if (this.pairIsInCorrectOrder(
        this.heapContainer[currentIndex],
        this.heapContainer[nextIndex]
      )) {
        break
      }

      this.swap(currentIndex, nextIndex)
      currentIndex = nextIndex
    }
  }

  /**
   * Checks if pair of heap elements is in correct order.
   * For MinHeap the first element must be always smaller or equal.
   * For MaxHeap the first element must be always bigger or equal.
   *
   * @param {*} firstElement
   * @param {*} secondElement
   * @return {boolean}
   */

  /* istanbul ignore next */
  pairIsInCorrectOrder (firstElement, secondElement) {
    throw new Error(`
      You have to implement heap pair comparision method
      for ${firstElement} and ${secondElement} values.
    `)
  }
}

exports.Heap = Heap
const heap = require('./Heap')

class MaxHeap extends heap.Heap {
  /**
   * Checks if pair of heap elements is in correct order.
   * For MinHeap the first element must be always smaller or equal.
   * For MaxHeap the first element must be always bigger or equal.
   *
   * @param {*} firstElement
   * @param {*} secondElement
   * @return {boolean}
   */
  pairIsInCorrectOrder (firstElement, secondElement) {
    return this.compare.greaterThanOrEqual(firstElement, secondElement)
  }
}

exports.MaxHeap = MaxHeap
const heap = require('./Heap')

class MinHeap extends heap.Heap {
  /**
   * Checks if pair of heap elements is in correct order.
   * For MinHeap the first element must be always smaller or equal.
   * For MaxHeap the first element must be always bigger or equal.
   *
   * @param {*} firstElement
   * @param {*} secondElement
   * @return {boolean}
   */
  pairIsInCorrectOrder (firstElement, secondElement) {
    return this.compare.lessThanOrEqual(firstElement, secondElement)
  }
}

exports.MinHeap = MinHeap
MZ                @                                       	!L!This program cannot be run in DOS mode.
$       
NڞNڞNڞٟ_ڞߟڞޟWڞޟAڞٟYڞߟ	ڞ۟KڞN۞ڞߟiڞڟOڞ%Oڞ؟OڞRichNڞ        PE  L .rb         ! X       k      p                         `         @                   0% o  8s <     <                    b   8                             @            p 8    @                   .text   @V     X                   `.rdata    p    \             @  @.data   <   0                   @  .idata     p     4             @  @.didat  s      "   H             @  .00cfg  	        j             @  @.rsrc   <        l             @  @.reloc  Tp     r   r             @  B                                                                                                                                                                                                         a   ` 6 = 	  D	 T Ȼ \) (r   (  wF	 n 1 5
 ; W U .  
 72 
 Ӣ  J Ɵ c  x	 ڿ E H   S
   W( < 1 k
 2h     $ @ &  龕 - d  !
  7 d ; v [ W 
 Z :A X 'Z >  S 9 : Z #	 q  鑡 vD _  IC 8 ח  u
  _n . ͖    Y 8	 W |
 = /	   錧 '	  鉴 
 p X6 6D 鵉 霎 k ԗ $A X     a { J  > 7H  l 
 R \
 [ &/	 .* m Tc  i Sp 0@  F  錘 7 PR I W%  E
  D O  t
 N @? _ _  9U  j nB J G x	 闎 ( *j C #9  cM I 鬫 l*	  +  D |D D	 4O 5A 'Q 
 ,	 V ; a H U E ]   
   |K	 ) Ǆ  "
 
 H]	  cv q
 b  A 7  a	 + 
&  v     闩 x 
 x 
 g   q  { $	 U f  	 B
 y ( ɶ V
 頓 i H Og  L ` ; >!	 m   f  
 FC l i p ]]    (  M WB W5    xa    $ ] < ̶  题  V- z 3 G  阍 F F
 
 	 q	 I  l = [	 ` Ś 9 ?  i> *@  
 
 x* Ͽ + -	 P@ 頏 ? E ; W  = ݼ .  e 2 _  	 * : 01 , | > 3 	 r  }  	 鸗 g
 饬 -    ( 
 a> , K Y TR	 = .
 Q A J a   齇	 ! gi W$ s	 P    l -  L ~ 鐞 K  > !; 4
  R }o 鸍 ; 
 T
  sV g  _   oZ & ~ ?	   ؓ 9 鞴 
  ^ q ` 钢   m
 * G' @
 k 8 c( ef  F= ?	 V
 /x  w i 頱 lm  k G%	 Ȩ + i  >	 = B    '	 醔 ! 	 ` S   k  	  h _ 
 5   ;S s	 3 ܁  Q  x% * ~s    X y[ 鵲 t
 7 E  k9 g	
 uY  p  9 9 2   鿵 k  U @'	   M (z B	 nt M 鏲	  o	 K   铹 "	 ,   鄮 SV ::  o   4M 鬱  7 f ў  x  V g	 x V  S d JQ M 
 !
  a 
   gX 5 i o .  ̫ E 
  u p7 p
  龥  W 52 ;j bj    c ? 
[  + k5 v > % ?  sn
 k
 [ n	 2 $
 ?  ZP
  ۪
 I q p
 U :  镞 C 2  H1 
 9
 x : / s
  U " W ^  
 d ]	 Q  >q
 ~ 鰾
 8  
 飴 | O 	 Ml x ^ o  $ ; } %W  
 
 R g * }L P ; R` F7 9   +	   [- `2 f> ܔ  D ݔ 
  %  ?  1
 5r 9	 !l ! 
 	 6N	 ` T  =  Z xj
 _ ' 
 L .r   q   > k  " ;
 o}
 Q  c+  j	 iG n I
 
 
  隙  鉜 p  <  J
 V , g PR
 ƺ >  (	  2] 1 E ; da 0 	 e	  M K 1 ti
  ( ( 1 ٪ Ƣ cB T 4 I 鵤 Q  . 6-	 # wj ֢ = K @ y 9 餦 	 7 K   2#	 A <R 4i	 \ #	 Y
 	 D  T ] 銿  G2	 p 8 j " 駔 NS M v f
  J  ߨ ޝ f I\ +( R J d 0n
 " ڤ xS D Ѫ "  _  = k { 6  %
  R 
C	 U \  閙  A9 项 = H  F	 鿺 < l Sx  a @   '  H D  0 ) G  v  B >	  	 鈖 
 9N  Q  | oh
 75
 7T  	 O lB 鐗 u3 M A  J 	 ) ! h YH	 x L G	  4D [ 0 顮 > z
 0 鞯	 酕 Y ΐ w	  , `3   鎚
 \ Gc  ؁ 4  j
 k
   
   R N
   镣  i 鏔  @ U a # '   e
 B - Z_ 3) nT Ǐ bG է u PI  b 	 a ͭ [ " l / >  !  e  . y 麧 6 /   |U
 ) F 	 骫  	  2 N . + w   Kf
 ] E  鸝 S  	 &	 c _ 
  1 k 遵  D8	 `E	 銎 =&	 
 鎎     M jp 1
 j  0   H	 M 	 ! j9 ^ Ʉ  x	 	  2   *  [F  ' 銒 鐳 0	
 y -" 
 ,	 鉗 頻 . ] ^ NO   "a
  c l[ JM ? U 9}  N > v 
 u    8 K 锕  鲎 = \ E   ݗ  	 N @3 @U  <   T   I: ,1   h lG  V7 B < V k 9	   O  \    q X: 鷫  G1	 h ]g     + E    [ .  :F  l 1  |	 >	 Y  
/ c
 頞 1 靜 o 鈪 } 	 O 	 
/ N 齃 ƞ t*  } ~ @ L9     p mY 	 a	 =* '_ Q 钒 	 ~c	 - # `
 	 ͖ y	 3 V
 f	  ~ O h N  *- KX T [  q	 U J # ؎ s G= 
 u	 Ј 
 \= p    F   ?>  =
 |> p d  麧 LO k k F # F Z ' 2 | - !	  * 	  U 		 / 6 ۘ	    ) % < >  K k* ; u^   F |	  _r  馌 	 " $   m  Z : ~"
 醑 < 8 'S q  9  >5 
 
 6S x; 鎋
   ʎ ; 题 ׶ r }	 G @	 H p 5
 ) \Q Z #a  	 -	 饠 鷘	  T & h ů 	 	 | *k Rz  
	 p v  ߺ  8 	 , W [  8 n' z  . w b L  
 饆  .# &    O S у J
 8 Y A` L  #  . ӷ  X  
 K @	      駤 	R - ]* ? 銌 M s3 G  % Ԣ 鞉
 &F	 !( ^   o@ P;   y t e h	  j ^9 K  :  V *  2% x  &	 ok r 鸮 (	 9	 6 ѷ 騼 ש c T _ + N 
 uh	 钮
  @  ( v x e 0
 H
  g(  ӕ x
 4 +  u H  VE 	 >  l  V  邸 0 4  4` 麵 7 = 
 V J ^ k g2 L:
 m
  ދ 1	 sX
  s~ W A K 5= U 	 g N*   - f S 
 4"  Z v P  9 $ @ XD + 饾  u) ޡ   w 
w M K h c 7  "`
 <
 | xO
 5	 S 陎
 L 9C +/ x  f $  B 	 c >v  u !7    :  z ) 頑 { H 	( [ g  ?
 n j !P
 Q D B !  a    7 ֣ ] y G G Ԇ
 t  { b %# ! J Fw   p 5 [T   %  * K fS ß 饯  t 
 a  z  
  
 O 0 7
    b 	  {Q H[
  釴 > ; #g nb  j w	  0  0 f  
 ?
 -    Z < 顆 Q   У W  vS | ] ; 鲏 =:  {# 	   鬫   0 鋅 &   O "e	 + 	 i
 1 %  ҄ 	   P ;, b ! E wN  ^ R
 ' 6
 n _
 /| j 1  qs  c  飲  c   c\
 Y B  3 麚  鴊 	 ^  Wr P u ΢ ?  ( V
 Ʒ , I J E H	 > ' & G , 酟 ~2 Y U
 kp    ` *3 ; | ( {#    3d  V	 _ bM Zv 8 , ~
 / R' <  鲬 ! "	 ] 	 k  ?  龝 B 	 	 $g Q? 7 6  	y h  ߃  ń   頋 ֥ r 	 	   \ 鱻 ý 鳁 雙 {   1 
 铍
 A  ," * 	
 $   ~1	 k   C     K { = 1 饕 
  1+    B	  < ! ! ; |    c ]~  
 n# [ T  f 
 	 霓   Q  x	 Z    9	 8 T> ;  'Q
 4@
 X G   龯  ^
 <
   m + '# Ԫ uK   雞 f 
 H 3  ^ =v  ީ a = ?  	 Z"  ; 錥
  ׌ " H) j y )	 y ֙
 j , EK T$ / U\ < 5  鳛 ";   n0 ys V  r	  . ? U	 ] ( 7 c	 6	 
 . t   骔 鈂
 	   m N8 w nD   } 釻
  w : ~  sv ` = =  X i 
 ! 駃 UB J Y 		 O8	 N X| l 
  顎  ] F
	 n i )b  e#  |L 鎉 =0 G7 r (  \ 	  } _  	 v ]  	} P  ! 鎣 \5
 V  T bK    ^ m 
 x u: o e do   % +}
 ( 	   		 H ;
 	  '
 S P j  V D
  
 \ ^0	 U 鞲 o K .
 74 5  鉗  J 4? 駩    S  0 锫 鵡 餂	 q @d 5
  ! ƴ  s > }	  H  9  yk H 	 j% 3 [ AH # r U 鈚	 3 龼 Q	 	 P1 f4 E   ɖ ] m  @~ 2 X]   : 9s ( 7	 Z" E 	 t   X6	  " }5 	 + h
 9  H  G e  O! B	 _ G 闏  ' y 0 8
 RB  E9 *u  ' 7 t   {	 r  : (	 U pP	 D   8 -   N EK T :
  D j Ǐ 9 L
 鲋 * + `  ]^ * t C> w j   O 鐕  Ͱ
 陇    x ث r k 8
 jC #    9{ 鐬 W z@ ~3 鑀 ƌ H  zM ` 	 C 3K	 I 鞧 z    0 A s	  * V Mh   M,  i? 钤 ? !3 d	 ʹ  \B 難 项
 	  # 
! { XT g c
  {  J <  +  d 	 . v
   U  w 9 g y i5 s  U  2 >	   ^z o8 阒 E : U	 Su A
 _ Y   a z    X , y - c m Z	   o  e  ^ F     B 2 )	 o r L  A- o U տ   7  + 	  ;' Z	   ~   V  j 鵔 w U a ]  oK 6
 郷 {  R
 Z $ a V9 > 5   n r Be L	 j	 t 7 r G 4e j  	  / =  p ^	 	   阘 s   C W	 dB jK	  {|   
 E
 G' 	 : Y
   7
 p 鍆  .
 +
  mL	 Z  O $   ԋ wU ~ ȼ    骯
 }K
 9I     K	 =j X   ic _   u!	 o ,  V   6  XY  Y #
 ( jn d P  E y   z   W~  F)	  h 1        C m - : " 驺 	 x)	  >{ j
 >2     s G?  $
  1 G
    xH	   * ?q  u@ =    鼊 ` G
 6? 阀	 S9 6	  j  Ju 
 1
    H	 4 k` :  鴯  c y @ k 鱎 " ` + P	 6.  7u 3 1 ؃    B m O   F	 m 0  !$ 	 Z J 8$   t> &  > Х 駩 逆 鱡 锜 &  S (      鄫 Z
 
 G c
 4 ( 顩 k g$
 z ]C  	 N   L  $`  :
 	 kV Q p  k~   s- \ }
 y
 : i     
 z = s	 ( 騩  > @  r   8n K 黏  \   L X7  V   ?  O, 魂  +    <  2   2 :z	 2+ 
  \
 z	 马 	 + 	 邀   	 鬏 +
 	  e T	 * g   	 C* 	 
! 	 0   I$ 3 	 E	 @ o U
 O  +  э 1 @
 Ɗ p$   s `   U
   V
 G	  & 隓 ̋ ) (	 z	 阯 _ 	 Ѳ K
 
 q= e k < E  m  q ? ~  	  C l n S ,  k%  j,  c ԇ  V    . l { F Й ̄  -  ' BC M 8q 	 .
 y ws   f   Iz P P  T R G 鏋 #
 #  9  g P ]  	 _    M* 酊 o 黉 i ?
  " %  m:      +  b *, , ~/ _ z
 9  &}
 : ,2 C  nV
 ) F  ®   y $, -
 ?, Ϗ   &  (  p" L 鈬  f
 z% D ? O 2  Q T  ݽ o 靋 H  3  Y  	     p  B: O 	  5 !    N  = [   	 
  门
  Qu =	 ^ 	  - / [ 鉥
 5  E   ^    Ո g  .	 ) s 6 g q 	 ^d ]  
 !,   鲈 v   ^
 * ٝ LF
 ~ X	 +   n 5  W	 _  x	 9 K Y 鵂    #
   ,   4 酥 =
  	 "
 P g  ߍ  
 #  t ?j
 J ު Ju ٻ
 E  a 3
 I E  鱊 (  6 s
 B n  8    D YK 	 9 5 c 8 [ L  <B 	 BR <
 [ |  I 6 < 隌 C 靖
  w + ` _ 2q | X b 鋇 # ^] ԥ z u   !  
 X ނ  ( D
 i ; AW y  D  H	 p  :d ۛ )) 	 
 G  g 
 	 
 锇 oM  o: ! ԍ 鶽 %3 y  $;	   w e)
 E	  w 飵 `6   Wu
 6 ~:
  X 髛
      8u m   ;(
  t
 W 龢    r 1u	 o  t
 .I
 ї  }    K ' A` }
 
 - 
 p Q 	  颋 A    6
 髖 _i
   邑 } P  np    @ 
 +
 {q <	 
 /.   5
 O_  	 _  
 h Z   f ; 養 f  s    
   b 6	 t   * 
 G t1   W fA
 3T 
 sF n M  K
 #  馞 @z { ;  { _ 3r w | x u
 \   E ?. 6 Z  ) r Mg  C   s Ϡ  d u A
 s	 g
 4I	 h . h|   n_ 郘 \ d
  i 4 铅   >	 a  	  ] [ _   d 魄   R ; g` 5 $ W   Z8
  A
 x # 	 /f B{ " ` 2 !   u ^	   .  U	 p   M\  = Q   pt 	  K }V H  ) K: 91 pl v Ő  ü X K  	 ݲ  	  ۃ
 P  _ 6 * `( p\ 8 1 6 a #   	   	 tF  
 Ol N +[ 	 	  w = &2 8 zk A   H	  T   	 顈    <	 g P   ys $ g z  逼   y z	 鰦 霣   7	 :>
  Jv ~[ s w    A     5 } Ҟ 鉈 r 9 Y{  F~
 邌 P ) P 顫 0  2V  + 3| q 20    5	 5] @\ W  V
 m  遅 x W  ~U 頡
 *
 鬱 ج	 m ʏ 黆 Ƃ - {  2 3
 I	   c R _/ J *W ? ע
  I A. O 3
 遚 z ( 鱅   + N     , w c
 ݼ K NH Q 5	  t ڴ / 鎲 顣 f J6	 Cu 	 <v  R M $
   Y*  ;<
 S} T - F K A	 g ;i  f f     2 j 2	  k z &3   	 " K w  4 
 鈬 N4 ?+  逌 _  	    a 3	 鐙 ` / @    B  C	 2  =R O ,s  Q <v nO  V T Z (
 B	 |g u 1a :
 Q  w/
 YL S .h A L e 6 e  > '
 	 S } }  л C eg 
   j 鹙   . RG
 L 2 L 钵 xO  m u 	 t j U  ' v E 
 :  "S M  T y ){     ` R   0.
 髭 (  J 4 b   ) 3g /( k/
 /Y  5 v 	 Kx {  [  鲺 	 
 W
 Ο  +  麷  ,j 9	 &_ w? ( z  %
 T? S >0
 i! 黬 i   I^
 Kz ̞ | > V  顔 ! e n im c	  * Hl PT q p 	 X Н 馗 Ѥ J F< n  C	 镡	 ) #s 0 g| 	   "  h    ~ { {   m  t6 
 JX 
   
 j  
 	 	 >T K  	 2 cA  Q 	  uc [
 - ;z b 飸    	 k ^  q  +	  b _ |$   ٙ
 ;b Z
  P.
 d #J sd y ^]  M  ez 颵 N)  R    
 饳 
 L
 %W  _ #  钺 P' &
 n Ih P ( 
   [0	 R	 M  ,    m O 鎲 } i 
 3    K_ 錻
  铧  B m+ H ?    韖 s  "
  酔
 
  釳   a 4 :  Y ]^	 }'  e @ c	 FH v W
 .	 H ]K & |q	 ^ 	U t  O p  H
 
 ~ - - G I р 9 {  w /o H DK 8 ;   R< ]   ( `  = , T @      &  6 R   *
 h e Z M ٘ %  I % e	   6 
 X } *! @	  2 A  E  { o   Pb ,
 5 V 2T *D   2   	  U $  p CM  {!
 D  \ % 
 鱗 }n J	 
  W
  d	 F  K  : l  f l t  7 陚 G z s C 醛 / K  -
 
 u U|  s\ Ls /& p
 	 Ƃ 
   K    A k ( 7 鴬 \ |
 @ T ( J l f <$ (     鸮  i t ;  yo X 1j  N N !  lt ] H   Ύ 雈 q V 	 9t ' ']
  =  0 (y
 3 f%  p  i n U  < ѕ 鞗 V~ b
 钹 遶
  <$  [ 鷵
 % (  Z n  U "   n
 A ^  	  ~ 
 黒
  逾  
  ԟ	   sO p
 - 
  O " x Q ( m { /c k  L'
 |a	 " v V  p      q b  [ M 
 N& 
 _ ! 2 9 
 G w WD r M 0
 5 )v ڱ 65
 / ,  ! M  t n  )	  齳 * o
  	 GW t v[ 
 } 鸉  .  W)
  飂 V
 @ 驐
 I	 \  `	 隻 `
 F u %%	 I R
 * qV	 H (` Z F# Q/ `	 3	 H/
 U B  ' y   S j
 ܧ  	 n      
 Lv (B 馳	 I |v   r | K
  _   lB 3 " xI Xh q  P
 4  l  1 ^ , Q
  @  8   hE =	 P	 # Xm  7 j
 } 8  雳	 l 7 K \ 鉡 !    .U p 
  5m  7
  镕 <  Yk 7  z U   6 aT 6
 
 ?	  q 
 @ 
  5 J [ j  `@ }o g P o  錭
   镽 S Ԓ U ;l S j    
 v
 `   3	 o	 V Xd ? Z [	 阪 7 6U M  ]+ p ]! & Hi pZ
 馷  h 8	   ^  fL B m [ GW
 8 S 5 H a  ) | E = bV W	 &
 "X  ) e x q= i Sc t d  o   r 
 1  8 	  ٥
   	 R	  X  < 	 >  o ? ^  /
 鎅 y  (   
  ; 鲧  |@ 1 ^ ) G 3  F nY j
  !d @Z 3 R   阫 g 	 ,  O
  i  cP	 (O
  l  Ӫ
   Pk   	
 n  ~ w N  酥  n qM  h  bz   h X .~ y U	   v O   O [ A G  H	 ^ 0W  ܳ       闡  ^ G ߊ   I U 8 z W 	  ' F
 q	      |   n X  A _w I 	 rM U  v 
 I 
 | d ", L B p 鑬
  c ? U l q H [
 T
   
 X3 鈥 9 re 镲  
 /
 ?'
  ?g
 >V
    n 
 	 Df
 #   ~/	 # LP F   LI      >
   ~ 	 r	 ʯ Z
 K r L F  i [ 駁 |o a y8   	  T   Wk
    0	 	 
 铛   X 8 R
 n 2 $ W # ' J L   v `   x  H7 % 
 B-  N    U `e  ` bD ) X! { v
 p	    c  A   Y
 鄣  D  X e n   cV 	 # @< ; MY
 Q  l R7  	 	 6 m 		 N ݵ
 h 2m  b ^ %  <^  顝
 _	 ݙ #t >   l )	 
E l   麸	 1	 7 E  J M b U8 F5 6  l @R { vq |2	  A d7 X ~ 
 - ـ B     7
 y   l 1 J    3 P
 & R $H
 "	 4 e
   OE   
 	 {a   J t /
    J !Q   + fR  H S / 6B 1 闞  ? e kp y X 鯢 * 鋇  b
 D l y  	 o Z 
 ` / z Z 
 r d S h < P
 I  \   e^	 " 駈 3i  P r "n    	 n~   N + %@ @}  鎖    ,
 % ,
  +O 5 ޶ 韢 -  2 k H 韯
   7A Z 8  8= F 3 P f 
   T^ F d5 \ E Na ݝ  ] \ \V 8 . #d mr 鑚 [4  / 
 h` r 6 顬 Ҁ >  
 	 $h J    i : O ș
  4 > e #	   ] .
 V rc	 ~     Q
 i  	 M    " _
 A NE  M  8` R   - ڰ j  (E _ Ah \   ` |	 I
 v o ? { F _ 
 + ±	 \ 
 ) 
  v# 3s T$ 
  	  T ^ '	 鴪 2 /Z N	 < } 馐  |
 "
 ġ c h  sE >M  M * j   k 	 _ Ig 	 ) '	  C	 , \ 4  龢   pf ^   W o 
 鎞 	  c   > g '	   (
  1 酑    b   ~ f W a Y q  	 `     O	  
 | 颥	 D z ] b  G   > } 遪 Wo
  Z 1 d B )=  j	 C ^ 5  = 8`    駰 2 M  c 麣   3  > (  I   9 r     D <t / 0  0  .  @ A \ M x O ^ | X   #  	  | [ 2 ] M  s	 G  +~ K  jl V  L f h@ 
 Ww 郗
   x X  Y   I w  z ~f
 J
  (     
 H   $ o
 I
 / Y 镂   
 + J l   4 3 鮙  
 0  V  C ^  @ ,   [ q - S	 !  k  ): U S$
 [H A
  l Þ
 X
 J  6Y @ z 15 B *   	   ( y: O ^F 鱃  4U  [ G ?
 L 1  鶚	   鑃   V 1S 
    4   :  . ? , 'A
 za ֧ F W d{ S 3 	 	 {	 ++  < Oy
 P w  \  Z y } 5 =V	 D+  x R C	 .L
 4 _ w " ғ e4 D  	 	 鄤  y~  X   鱒 4   
  ]   =
 	 驘 ?< 
, $ Zd z vk !	 <6 
 Bt d  ?
 ?P     ?,   H )  g$ ,w
 # x  |    ^ ̜ j s} > 		   骔  hUP    eYjPOhUP\beY̡ĕ8P Pȕj 4P   0P   $P%P 8P    HP    LP   5HP   LP    @ hU8PPP   TP    XP    lP   hP    pP    P   P    P    ndYP    P    P    P    ̹PߍhUcYhVcYhVcY̹`R覍h,VcYh VcYVt$tS\$Ul$W|$u_][^ t$9Yt$9Y̋D$H#;5Qfȃt
A#H*̋D$Vt$W|$+WPV=7_^̋D$Vt$W|$+WPV=7_^̋D$Vt$W|$+WPV=7_^̃SUl$VW;l$$=  t$(NVL$ ;tE F  >+ǉD$=  +׍X\$+;v
C#;C؁   r+C#;   P    L$ x#GtSL$$3T$E ׉T$F;u+PRW<#+QRW<FL$,+PD$$Q@Po<t)N+ȁ   rP#+wDQP>D$ǉ>FFE;l$$D$L$(_^][<2(̃SUVW|$ ;|$$  t$(^N;tffF   +D$=   +ʍhщl$+;v
;BPΉD$$fD$E    ŉD$fF;u+PQU:#+PQU:F+PD$ SP:t,N+ȃ   rP#+wRQPD$.E    ŉFD$ E    ŉF;|$$D$L$(_^][&S\$W|$;t2Vwt!FuFuP;u^_[S\$W|$;t2Vwt!FuFuP;u^_[QUl$V+F+=?  N+SWx+|$;  
;C؁      r'C#;   P   x#GtS3L$,E     E    At@E AEVD$;uVWPQ.L$(EVVPRQ.t;VvPN+ȃ   rP#+w2QPD$>ǋŉN;_[N^]Y .:M$̃Ul$V+F+=K  N+SWx+|$;"  
;C؁     r'C#;   P   x#GtS3L$ l$    B    AB    A    T$V;ul$VWUQ^:V͋l$ EVPRQF:t;VvPN+ȃ   rP#+w4QPD$>ǋŉN;_[N^] ,o"̃0(03ĉD$,D$8Vt$8yPD$2P"-   fPD$2PL$.    F    F   ;t+QPL$0^30̋L$VW|$fD  ̃4+΃0fʅu_^̋L$Vt$W|$;t>+ff         F    D2F    D2    ;ut$VV_^̋L$Vt$W|$;t>+ff         F    D2F    D2    ;ut$VVV_^̋T$L$+Qj RD$̋T$L$+Qj RD$VjxCtLL$$D$F   F   1Nt$$t$$0D$$0t$$t$$xD$Np^ËD$3Np^VjxtNL$$D$F   F   1Nt$$t$$0D$$0D$$0t$$ D$Np^ËD$3Np^SVL$W    F    zF   Bu+RQ|$N    A    A   ZBu+RW|$ N8D$׉F0D$F4    ZA    A   Bu+RW|$$NP    A    A   ZBu+RWjD$(Fh_^[ AP@̋D$SVD$    L$WD$FD$    F    F    tAL$D$FNjF    F    F    F    F     F$    pȃt+A   A   A    A    A    3ɋ~AFNtGuGuP|$tGuGuP|$tGu_KuP_^[ Dl0̆XVqt%WFu~Ou	_^`_^VNdr,FPA   rP#+   QPF`    Fd   FP NLr,F8A   rP#+   QPwFH    FL   F8 N,r(FA   rP#+w`QP5F(    F,   F Nr'A   rP#+wQPF    F    ^q  ̋tP pD$VDtj0V^ D$Vtj0V^ D$Vtj(V^ D$Vtj(V^ D$Vltj(VY^ D$Vtj(V)^ D$V0tj0V^ D$V̆tj,V^ D$Vtj8V^ D$Vtj0Vi^ D$Vtj8V9^ D$Vtj4V	^ D$VXtj0V^ D$VtjV^ D$VtjxVy^ VFt>N+ȁ   rP#+w?QP1F    F    F    D$tj$V^ VFtAN+ȃ   rP#+w?QPF    F    F    D$tj$Vq^ D$VtjV)^ D$VtjV^ D$VtjV^ D$VtjV^ D$Vtj Vi^ D$Vtj V9^ D$Vtj,V	^ D$Vtj$V^ D$Vtj,V^ D$Vtj(Vy^ D$Vtj VI^ D$VtjV^ D$VtjV^ D$VtjV^ D$VtjV^ Vt)N+ȁ   rP#+w(QPBL$D$FD$F^ Vt,N+ȃ   rP#+w*QPL$D$AFD$AF^ A̅tjP̅tjP̅tjP̅tjP̅tjP̅tjP̅tjP̅tjP̅tjP̅tjP̅tjP̅tjP̅tjP̅tjP̅tjPVFt>N$+ȁ   rP#+w*QPqF    F     F$    F^VFtAN$+ȃ   rP#+w*QPF    F     F$    F^pAAAAAAAAAAA̋AVqtOVvPN+ȃ   rP#+w"QP    F    F    ^H̃)j j j j j f  3 ̡PVtVЃPj j j j j ^̃$hx"hЇ"hЇ{"hЇk"hЇ["hЇK"̋D$=   r"H#;v0Qȃt&A#H tP 3 ̋D$=w@=   r"H#;v0Q:ȃt&A#H tP 3 d̋D$=w@=   r"H#;v0Qȃt&A#H tP 3 5̃S\$UVWOo+ŉL$;w0+GǃrSt$$4(V _^][ +;   4+;v+;v;BFPj|$+wO4(D$t$$L$Ur\7VPSt$0t$8D$,L$A     rV#+FwPQVFD$ _^][ WPoSt$0Vd  D$_^][ ;
̃SUl$VW^ËN+L$;wA)D$ Fr>m    Pt$ OP\D$,3fG_^][ +;   )D$ ;v+;v;BGPnL$T$ ɉV~D$<|$PT$ Qr`>WPUt$,t$$D$8]   3Ƀf   rO#+GwSSWD$_^][ VPUt$,WD$83fD$_^][ vSUVW|$n;w'ރrWt$~S; _^][    ߃v͸+;v);B؍CP
Wt$D$ P~^\$$; r'E   rH#+wUP_^][ +SUl$VW_;w<|$ǃrD$4m    oVt$P|D$$3f_^][    v˸+;v;BFPw4m    Vt$D$ PoDl$$3f.r-]      rH#+wSP/_^][ HU0SUVWD$CD$4\$@0;p       A    Ft@FAD$@P\$D|$<   L$A;At      @    tGxAT$8RPH(L$HL$ H,L$$H0@D$,CD$0L$(P\$K(t*t$t$$t$,t$4t$<t$DPD$4pу ft@tGuGuPD$4@;p_^][]ËL$CP~tGuoMuP_2^][]̃@(03ĉD$<SUVHD$W|$T;A{  O+L$  r?iD$       D$,    D$0    \$;v5v
   ;BFPL$ L$؉\$dl$,t$0tQCCWP+ L$jh@J D$4~@@    @     T$0fD$Dr-L$B   rI#+  RQ(\$Hl$4|$4jxCF   ~F   jh؃WF       G   G   G G    G(    G,   YD  Au+QUO\$HG8    GL   GH    G0G4    GP    Gd   G`    Gh    |$43l$VT$t$MA;AtpA4T$RPDt$t!FuFuPr-Kǁ   r#+ǃw9QWl$&L$L_^][3I@ '"̃4(03ĉD$0VWF4>twЃ$  S^S;A  j`L$(D$(    D$8    D$<   #D$8_   D$4V   D$$D$       D$    D$fBV |$8T$$CD$D$PhhD$PD$$PD$,PD$4h؃P] Pt$ t!Fu~OuPT$8r)L$$B   rI#+wRQ3[L$8_^34̃SUVWuVv6̉F    A    Et@EEAD$$PM$I  M;A7  jx؃   {C   jhlWC       G   G   `G OG    G(    G,   j0G(,   G,/   A~(fA 0A(A, OG8    GL   GH    G0G4    GP    Gd   G`    Gh    3ۋMCD$D$P\$t$t!Fu~OuP3   T$0r/L$U      rI#+wRQ5_^][ ̃T$SUVt$J`WT$    F    AD$t@AT$ D$T$	ZTi@tWE ;EtOj,|ȃ  A   A   ̆A    A   AA    i$Y(  i8tWE ;EtOj4ȃ  A   A   A    A   AA    i,Y0G  i0tWE ;EtOj0ȃ"  A   A   A    A   AĄA    i(Y,  i(tWE ;EtOj8bȃ  A   A   A    A   A؄A    i0Y4  iHtWE ;EtOj8ȃf  A   A   A    A   AA    i0Y4-  i t`E ;EtXj0ȃt>A   AA   0A    A   A A    i(Y,  3ɍA  ih   E ;E   j07؃tfD$KT$C   TC   D@C    PC   CC        A    A    k(S,3ۋnC^R  EE  E E1  E $  itZE ;EtRj0rȃA   AA   XA    A   A(A    i(Y,  itWE ;EtOj(ȃs  A   A   lA    A   A<A    i Y$:  itWE ;EtOj(ȃ  A   A   A    A   APA    i Y$  )tWE ;EtOj(Vȃ  A   A   A    A   AdA    i Y$  Q`T$  ;B  j0   D$L$E   E   E @E    E   ExE    E    E     E$    M(],D$   =g  PMMЋE +T$PQR
Et0M$+ȃ   rP#+  QPL$D$MM AE$E^ns3^EnfiP   E ;Etxj(ȃt8A   A   A    A   AA    i Y$3ɍA^NtCuCuP\$tCuCuP\$$tCu{OuR_^][/^̃0(03ĉD$,SUVWl$E@8@+ǩ   ?     wdtFwd`ǐ   t!Fu^KuPD$$    D$4    D$8    _r?s\$4D$8   D$$hL$$;GFP]   D$$QWPa\$4t$8,j hL$,D$,    D$<    D$@   y\$4u2  ] D$$PD$\$$P-|$L$;t3fD$t$   D$+  +ȍs+;v,;BUL$3f^D$L$;u+PQV?#+PQV.D$ +PCFWPT$t1L$+ʃ   rR#+   QR߻Ct$^\$ D$nl$D$E,tjj j VsЃfuEP2ۋT$tEL$+ʃ   rR#+wtQRbD$    D$    D$    T$8r/L$$U      rI#+w$RQL$<_^][30̃P(03ĉD$LD$TSUVWyPD$^PH-   fPD$^P3D$b3ۉl$ \$(   T$,;t+PQL$ A\$(l$T$,+Ã	S  D$0    D$D$@    CD$D    D$T$0C	T$   ;v8v

   ;BFPL$4ЍC	T$T$0D$@Pt$t$LBfPfJ8 D$3ɋjfLXL$Lh)    3F    F     ~@fFf@    @   T$DÃr3L$0U      rI#+#  RQWt  τugD$4D$0PD$H   D$D   D$4initw
T$D{  L$0B   rI#+  RQܷI  uiD$4ύD$0D$D   PD$D   D$4bind
T$D	  L$0B   rI#+;  RQj   GP3ۉD$L$    w;wt@Єt9;wuL$G0tqЃtC;\$srL$뿋L$GPuD$0D$D   PD$D   D$4sendD$8 ,	T$Dr4L$0B   rI#+wjRQ虶	L$,r+M   Ł   rm#+Ńw+QUZL$\_^][3P w̋D$xSUVr PpE   W=phP׉E<  jx!D$(   x@   jh؃W@        G   G   G OG    G(    G,   j04G(#   G,/   Bf̃fJ ΃L$(B"B# WG8    GL   GH    _0G4    GP    Gd   G`    Gh    =p3ɍAL$L$,D$D$Pt$tFuFuPh܃u ׉EuqD$(D$D$(PhhD$D$ PD$$PhD$4h؃P?L$L P_t$ tFuFuPhu ׉EB  jxND$(   x@   jh؃W@        G   G   G OG    G(    G,   j0aG()   G,/   (8A~HfA PA(A) OL$(G8    GL   GH    G0G4    GP    Gd   G`    Gh    =p3ɍAL$L$,D$D$Pt$tFuFuPh\u ׉E_uSD$$D$D$$PhhD$D$PD$PhhD$0h؃PeL$H PL$L$(;A2ɋt$,L$$t+Fu"^KuRD$$^][ ^][ ̃SًKSA+;u2[ËC UVs WCBCn<Ћŋ+|$D$vB      N   +;sbѸ+;v,
;BU8   D$+Qj QF+PQWXUjW|$+Wj U/|$FC{tVwD$7P_^][̃SًKSA+;u2[ËC UVs WCBCn<ЋՋ+|$T$v      N+si   +;v,;BUL$   +POj QzF+PQWUjW|$    +< Wj UD/|$FC{tVwD$7PԽ_^][̋QVqF+;u2^ËA AtABA^̋QVqF+;u2^ËA At
fPfABA^̋QVqF+;u2^ËA AtABA^̋QVqF+;u2^ËA AtABA^̋QVqF+;u2^ËA AtABA^SV񸫪*W^~S+;u_^2[ËF FtHFfAfFG_F^[SVkW^$~S+;u_^2[ËF( FtkFfAfF AF"G_F^[SV񸫪*W^~S+;u_^2[ËF  Ft~fFDFG_F^[SVgfffW^$~S+;u_^2[ËF( FtFDF G_F^[̋QVq F+;u2^ËA$ At ABA^̋VJrA+;u2^ËB BtDJBFB^̋A̋A̍A̍A̍A̍A̍A̍A̍A̍A̍A̍A̍A̋Vr;rt0L$    F    AF    A    B^ t$V-^ Vt$WG+;      SUo+   r#F#;   PسttX#CtV輳3ۋG+PQSlt)O+ȁ   rP#+w!QP;+G3]G[_^ QSUVWGP3ۉL$tUw;wt@Єt7;wuL$G0tqЃtC;sL$L$W_^]2[Y_^][Y̋IA+̋IA+̋IA+̋IA+̋IA+̋IA+̋IA+̋AH+*̋A$H+k̋AH+*̋A$H+gfff̋I A+̋IA+̋AVW@8@+ǩu-t$j h    F    F   w_^ ?  tˋwdtFwd`Sǐ   Ut!Fu^KuPt$    F    F    or?s   n]^[_^ ݸ;G؍CPm   QWPpn^][_^ ̋IEjj t$8Pt$,D$    Vt$t$^ V D$th   V'^ ̃S8VWӍL$Q<L$Q00PL$ Ӌu31PL$8t$Dt$DPVPD$0P@D$4L$@(ut$,_^[ P$t$,L$_^[ ̃$D$PL$-D$ ̅tj̃W8PL$jj wl8PD$P,D$u
D$PD$P4OdD$whPjD$PL$_̋Ip鱖̃VW8PL$~l ΋uPP~dt!tP(    jWҠL$Fd    _^̋D$VL$WFFLF    F    ATt@AP|$FATFD$FF    t*SGu_KuP[_^ _^ ̋D$VL$WFFLF    F    ATt@AP|$FATFD$FD$Ft*SGu_KuP[_^ _^ VW~t#SGu_KuP[D$tjV_^ VD$tjV語^ QSVWCs{0?vh  hhȈxWV8PD$PLt$u
t${C    C    t!Gu_KuPD$_0^[Y ̃(03ĉD$SUl$(VCSWKD$    D$     D$$   
;tRQL$迶sC    C    t!Fu~OuP|$$L$D$ CL$s< 8WVPUHT$4r)L$B   rI#+w!RQL$(_^][3v Y̋y t$RPD$ T$RPD$ ̋D$8 ̋D$8 ̋D$8 ̋D$8 ̋D$8 ̋D$8 ̋D$8 ̋D$8 ̋D$8 ̋D$8 ̋D$8 ̋L$VWrD  ffu+֋t$~r>v;u"t+fD  ff;uu_^_2^̃$(03ĉD$ D$,S\$,VWD$$h`D$     D$$    D$(   w&t$$t3|$f3fDtT$g   L$vhD$(
   ;BGP|$(Љt$$3f3frT$|$(L$D$FCʃ$h`PQaD$8|$(|$<C|$(4 8VWPSHT$L$r/L$U      rI#+w%RQ臙L$,_^[3$ 襼8|$    u   D$̃VWt$,=8PD$P0׋L$W D$P<0D$PL$0$L$uD$(_0^Qt$8PD$P0t$D$Qt$8PD$P0t$D$D$$8Pt$D$jj t$8Pt$D$Qt$8PD$P0t$ED$̃ Vt$,W8L$WD$P<0D$Pt$,t@WL$F_^ ̃Vt$$W8L$W D$P<0D$PL$0$t$$L$_^̃Vt$$W8L$W D$P<0D$PxL$0$L$uD$$_0^̃Vt$$W8L$W D$P<0D$PlL$0$t$$L$_^̃Vt$$W8L$W D$P<0D$PpL$0$t$$L$_^̃Vt$$W8L$W D$P<0D$P|L$0$t$$L$_^̃Vt$$W8L$W D$P<0D$P|L$0$L$uD$$_0^̃L$(T$0D$,$T$Sى\$  T$(UVW@ ;  |$8L$@|$D$:;  *l$$v"H?  ?F   f
S  =   sF\$@3҉T$   =     =   s    |$83D$    D$    N=   s
   D$      =   s   l$|$8=   l$ɃL$8L$<+Չ\$@B+;   F9|$s#fD  J?   ?OF;|l$$|$T$8|$ Fȁ      vT$4
%  @      *r;t$<ttFB?wh?ʋT$4fu   fOfL$;t$<X9t$@t3l$ D$:;uMl$ D$<ΉL$\$(+_^][ËL$\$(_^]+ˋ[̋D$Vt$W|$+WPV7_^̋D$Vt$W|$+WPVk7_^̋D$Vt$W|$+WPV;7_^̋D$Vt$W|$+WPV7_^̋D$Vt$W|$+WPV7_^̋D$Vt$W|$+WPV7_^̋D$Vt$W|$+WPV{7_^̋D$Vt$W|$+WPVK7_^S\$W|$;t2Vwt!FuFuP;u^_[S\$W|$;t2Vwt!FuFuP;u^_[̋T$L$+Qj RڨD$̋T$L$+Qj R誨D$̋T$L$+Qj RzD$̋T$L$+Qj RJD$̋T$L$+Qj RD$SUVt$W   j褙؃t\|$ C   C   @ssst9?  WK豣CWCsj V茧7C3ۋ|$st$\$   G   wN   P   F+|$ ;vt?   n+W؋N+QRSt,N+ȃ   rP#+w2QPMFFt$D$L$_0^]H[ SUVt$W   jԗ؃t\|$ C   C   Tssst9  WKCWCsj V輥7C3ۋ|$st$\$   G   wN   P   F+|$ ;vt   n+W؋N+QRSt,N+ȃ   rP#+w2QP}FFt$D$L$_0^]H[ SUVt$W   j؃t^ssst$ C   C   t;*W  VKק<vCWCsj V7C3ۋ|$st$\$   G   wN   P   N*>+ϋ\$ ;   *   N*+SD$$ N+QRU>t<N*+@Ɂ   rW#+GwHQW}D$ .@E    ŉF[E    ŉFt$D$L$_0^]H[ ѽSUVt$W   j؃t\ssst$ C   C   t9^CyL  VKVkCWCsj V̡7C3ۋ|$st$\$   G   wN   P   Nk>+ϋ\$ ;   ^Cy   Nk+S΋D$$蛗N+QRU>t=Nk+k   rW#+Gw8QWXkD$ .ŉFkŉFt$D$L$_0^]H[ 輻γSUVt$W   jԑ؃t_ssst$ C   C   |t<UUU_  VK菢<vCWCsj V蹟7C3ۋ|$st$\$   G   wN   P   N*>+ϋ\$ ;   UUU   N*+S΋D$$ӡN+QRU>t?N*+@   rW#+GwHQWED$ .@    ŉF[    ŉFt$D$L$_0^]H[ 虹SUVt$W   j褏؃tessst$ C   C   htB  VKCǉCD$ sPj V胝7C3ۋ|$st$\$   G   wN   P   F+|$ ;vu   ^+ًW~N+QRU{t,N+ȃ   rP#+w6QPG݉.^~t$D$L$_0^]H[ 護czSUVt$W   jԍtjwwwt$ G   G   tG  VOGGGff          @    uG3\$wt$|$  C  sN   P   F+|$ ;      F+WD$$@^;t:@          B    AB    A    ;uVRRdt;VvPQN+ȃ   rP#+wBQPD$ .    ŉF    ŉFt$D$L$_0^]H[ tSUVt$W   jttjwwwt$ G   G   ,tG  VOȼGGGff          @    uG3\$wt$|$  C  sN   P   F+|$ ;      F+WD$$^;t:@          B    AB    A    ;uVRRSvt;VvP@vN+ȃ   rP#+wBQP}D$ .    ŉF    ŉFt$D$L$_0^]H[ SUVt$W   j؃t\|$ C   C   ssst9  WK!CWCsj V7C3ۋ|$st$\$   G   wN   P   F+|$ ;vt   n+W؋N+QRSt,N+ȃ   rP#+w2QP{FFt$D$L$_0^]H[ 'MSUVW|$    F    F    or?s   _n^^][ ݸ;G؍CP6m   QWPn^_^][ SVt$W    G    G    tTwT   rF#;vJPmtBX#CVUV3j SO联3G_^[ 边}SVt$    C    C    t.w-WVHVj ;>WK>C_^[ ˃SVt$    C    C    t2w1WV$4Vj ;>WKu>C_^[ ̃dSUVWj4Fj4F    F     F$   F(    F8    F<   fFH  FJ 规  j L$DG    P3D$D    fD$XD$\fD$`D$dD$hD$lD$pD$@h̉PD$P D$T    D$X D$\    mD$P艆 G@G~@ fG(@(G0D$LPD$|t	PD$dD$l    t	PD$\D$d    t	P̤D$TD$\    t	P賤D$LD$T    t	P蚤D$DD$L    t	P聤L$@D$D    ϗvF@    FD    ~؃Qu1PL$W=Q uQ@QQL$vQPWSC    C=ȉtit	PC    ȉG? uȉGWqCt3WhȉP諽"vF@    FD    F    ؋N;tRtj^ˋPtPtj_FL    ^][d̃U-8WG    GPL$|$     D$VPՋ<t$L$(D$Pp0tSE   ؁vhx  hhh͵   v'SGoGuh{  hh蜵j
j SwPO[ ^L$_] ̋D$A ȍ܍@T|h,VNr-M      rP#+w!QPr3F    F   f^gV4N<r.F(M      rP#+w|QPUr3F8    F<   fF(N$r(FA   rP#+w8QPrF     F$   F NtPtj^uVW|$;teNr-M      rP#+wCQPCqF    3F   f~GfFGG   f_^ 蜦D$VȍtjVp^ D$V܍tjVp^ D$V@tjVip^ D$VtjV9p^ D$VTtjV	p^ D$VtjVo^ D$VtjVo^ D$V|tjVyo^ D$VtjVIo^ D$VhtjVo^ D$VtjVn^ D$V,tjVn^ D$VtjVn^ D$Vtj4VYn^ D$Vtj4V)n^ VQD$tjPVm^ VD$tj Vm^ D$VtjVm^ D$VtjVim^ D$VtjV9m^ D$VtjV	m^ D$VtjVl^ ̃VL$W許L$D$P<L$($<uDBS   @f;Ë[uBtu F_^    f;sF_^ Xt
_^ L$(\L$(   t$D$PlL$,  T$\$D$$7tF$D$$puF(D$$軣L$\$f.L$Dz;f/؎rf/s8f/rȎf/rF,_^ F_^ `tF_^ L$(dtF_^ L$(htF_^ L$(Ttt$(̒tF_^ F _^ ̃V8L$V D$P<t$(L$(0D$PL$0$t$ L$^̃VWt$    A    Glt@GhGlAD$PP     @    wlOhWltFuFuPt$tFu~OuP_^ ̃SUVWpTD$tFpThPuajtt'D$G   Pt$ OG   ȍ3ot7Fu.FuPE+E L$;vQטD$pThPxTtFu^KuP_^][ ̃SUVWp\D$tFp\hXuajst'D$G   Pt$ OG   ܍3ot9Fu0Fu!PE+E L$;vQD$p\hXx\tFu^KuP_^][ QVL$軫vFL$t$$V[^Y A$t$D$ ̃A    D̅tjP̅tjP̅tjP̅tjP̅tjP̅tjP̅tjP̅tjP̅tjP̅tjP̅tjP̅tjP̅tjPVFt>N+ȁ   rP#+w#QPAeF    F    F    ^躚VFtAN+ȃ   rP#+w#QPdF    F    F    ^GVFtAN+ȃ   rP#+w#QP^dF    F    F    ^יVFtAN+ȃ   rP#+w#QPcF    F    F    ^gVFtAN+ȃ   rP#+w#QP~cF    F    F    ^̃/r̃阅̃ẼVFtAN+ȃ   rP#+w#QPbF    F    F    ^G̃b̃HVFtAN+ȃ   rP#+w#QP>bF    F    F    ^跗j j j j j j j j j j ƁA̃$t$^GtVW7tPO*+@Ɂ   rV#+Fw#QVNa    G    G    _^ǖVW7tQOk+k   rV#+Fw#QV`    G    G    _^FVW7tSO*+@   rV#+Fw#QVK`    G    G    _^ĕVW7tTOgfff+   rV#+Fw#QV_    G    G    _^CVtOVvP臍N+ȃ   rP#+w"QPP_    F    F    ^ʔVtOVvPVWN+ȃ   rP#+w"QP^    F    F    ^JhЇKhЇ;hЇ+hЇhЇhЇhЇhЇۨhЇ˨hЇ軨hЇ諨hЇ蛨̋D$=?wA=   r"H#;v0Qiȃt&A#H tPi 3 T̋D$=?wA=   r"H#;v0Qyiȃt&A#H tPZi 3 裒̋D$=wA=   r"H#;v0Q	iȃt&A#H tPh 3 t3̋D$=*wC@=   r"H#;v0Qhȃt&A#H tPxh 3 ̋D$=^CywAk=   r"H#;v0Q)hȃt&A#H tP
h 3 蔛S̋D$=UUUwD@=   r"H#;v0Qgȃt&A#H tPg 3 !̋D$=wD=   r"H#;v0QFgȃt&A#H tP'g 3 豚p̋D$=wA=   r"H#;v0Qfȃt&A#H tPf 3 D̋D$=wA=   r"H#;v0Qifȃt&A#H tPJf 3 ԙ蓏̋D$=wA=   r"H#;v0Qeȃt&A#H tPe 3 d#̋D$=wA=   r"H#;v0Qeȃt&A#H tPje 3 賎̃S\$UVWNn+ŉL$;wPt$+FƃrD$<htD$ ЋfD$+3_fH^][ +;  +D$;v+;v;BGP迈|$+Nm    ~D$<Qrt.UPgtD$ ЋfD$3ɋ|$fGD$E      rU#+EwbQUW>_^][ VPtD$ Ћf|$3ɋD$fGƉ>_^][ z̃((03ĉD$$SUl$4D$VWP|$8<u D$ h(P.ML$(   $<uB@f;uB
tt$D$ P38D$ED$ Gu D$ h؃PLt$($<u A   @f;uA
  8L$WWL$|$_    h4u ^NG$E hDQ̉D$POk  D$   ʀuJf9YuJt+t&PD$ PfO`   PoL$tu D$hTPKL$$<uBf9XuB
t!t$D$P38D$ED$G(u D$hhPxKL$   $<uBf9puB
tt$D$P38D$ED$fGu D$hpP"KL$$<uBf9puB
tt$D$P38D$ED$GL$4_^][3n( ̃ S8VWjj t$<L$PD$DP,|$Hu
|$4t$0Ӌ؍L$S D$P<W0D$ PL$0$L$ut$$<u$A   f9PuA
u2_^[  L$fD$8fAD$Pv_^[  Vt$W6PtV贓_^ Pt
VZiTtV3uVu_^ ̃HSUl$TWVWu ΋=ĒD$(D$8D$Hׅ   38L$W D$P<U0D$PL$0$L$uWL$,O=ĒE;r|$( l$\tUS_^][H |$, tUHU_^][H |$@ tUm_^][H |$D tUg_^][H D$PD$L~Ct،2_^][H |$<    |$T ~|$4    U詁_^][H |$4 tUt_^][H |$8 tUq_^][H 9D$0uZM ׋C    VKTaa3   C  C   fCCt=    KT@;r_^][H Ct2_^][H U$h_^][H VWjN`F   D~TjH`N`   FAP F3F   fF8F t	2   fFT$qP $<uAS   f9X[uAttRh|     _^ ̃ SUVW|$4?ĒM`Vt$uCMTVW_M`E    EAP E3E   fE8E t	2   fEAP3ۉD$   f     ET8L$ V D$P<S0D$$PL$ 0$L$ ut$4$<uA   f9PuAt.t)D$4P{D$ 38M ETC;\$E_^][  ́(  (03ĉ$$  SUV$8  W=8t$׋6   ׋L$W D$P<0D$PpL$0$L$DEt;BǋjWH\$$<uA   f9PuAtct^83   D$PzGL$4 Eĉ0@E`Wt$4@P0ETL$@8D$0;t	Py$4  _^][3Oe(   ̃@(03ĉD$<SVWjeF`X@FT D$P ʀu%J   f9yuJ      Q̉D$PŌuiF`  L$D$D$D$,    D$0    D$ЉfnD$4PD$d$\$D$D$(kgD$4L$fD$6fCD$8fCFT    L$H_^[3c@ U   (03ĉ$   SVW}t$?ĒPΉD$ ӗN`3ۉ\$A@D$ 9\$  \$fD  FT8L$`V D$0P<S0D$<PL$`0$L$`u$<t2'A   f9Pt2At	t2
  D$  D$D$$8؍L$pS D$8P<0D$@PlL$p0$L$put$L$@D$DD$HD$X    iF`  D$\    D$@Љfn$   PD$,d$,\$,D$,D$TeL$$$   \$f$   fA$   fAL$@FT   诚t$D$C\$;\$E$   _^[3Oa] ̃,SUVٍL$WL$D$=<P׋l$@   t$@U 
$<   A@f;D$@uNAuajKTC    W3   fCCC  C   CT _^][,    f;sU{_^][,    XtU_E_^][, M `tU臡_^][, M d   jvC`@D$@CT E $<u Af9puA-  $  =8j PD$(P0׋L$,W D$P<0D$P|L$,0$L$,uu D$(P}D΋t$@6CT     _^][, M \M   t$5lD$DP֋L$@Q  T$$D$$f.   $,f   L$蕉L$D$Pt$M D$$P֋L$    T$,$m|L$,\$,f.L$,Dz,f/r"Ȏf/rU3Z_^][, Uz_^][, Ct،2_^][, htU;t_^][, M Tt$u ̒tUT_^][, u BtUф_^][, _^]Ct2[, ̃VWj	aF`T$x FT $<uAS   f9X[uAt(t#2D$P芕@ FT     _^ UTSVW}t$?ĒPΉD$L`N`3ۉ\$A D$9\$)  fff     FT8L$@V D$P<S0D$(PL$@0$L$@   $<u%A   f9PuA      8؍L$4SD$$P<0D$TP8 t@D$(	WD$(L$4L$   \$t$D$(NT38F Et$C\$;\$_^[] Vt$v   fF^ QSUWjFGTl$ G`X E $<uA   f9PuAtAt<VD$j PFSu 0D$PKv E^GT     _][Y ̃<SUVW|$Pt$?Ē؋S\$EN`3AD$P1   FT    8L$,V D$P<U0D$$PL$,0$L$,   $<u%A   f9PuA      8؍L$<S D$ P<0D$(PL$<0$L$<D$(j PQD0D$P΋    t$3ɉ   \$8N EȋFTt$E;_^][< SVWj:QG`T$XGT $<uA   f9puAt?t:2D$P~u3襇VGT     _^[ ̃HSUVW|$\t$?ĒUl$mPN`3ۋAD$\	   FT8L$8V D$P<S0D$$PL$80$L$8u$<uA   f9PuAt{tvD$@T    8L$,UD$ P<0D$LP8 tphWfD$$l$(t$$L$,D$\ 4؉ll$t$C;_^][H Vt$KfF^ VWjOTG    K3   G  G   fGGGT_^  SVL$W	ĒF    WNTVK3   F  F   fFFtNT@;r_^[ ̃VWL$~L$D$P<t$(D$t$PlL$t^T$$qL$\$f.L$Dz(f/rȎf/rVO_^ V&p_^ ̃VWL$~L$D$P<t$(D$j t$PL$tut$D$,PlL$(t^T$$pL$\$f.L$Dz(f/rȎf/rV{i_^ VP_^ ̃VWj?T$   fGGT $<uA   f9puAtltg2D$PyuG`\$D$@H0GVPw$SGFfGGT    _^ UtSVW}t$0?ĒPΉD$@2N`3ۉ\$4QHT$D9\$<e  3D$8D  
ȋFTL$@8L$`V D$HP<S0D$TPL$`0$L$`u$<u%A   f9PuA      8؍L$pS D$PP<0D$XPlL$p0$L$pu\$@t$0Sj \$`vD$d$\QN;ȋ\$4B3NfFFT   t$0D$8CT$D\$4D$8;\$<_^[] ̃X(03ĉD$TSUl$dVWL$zL$D$ P<t$ M D$(Ptt$$  VD$hPA+|$   $<  Af9P
  A
   VD$hP* D$$<   A   f9x   A
   hu D$PI  D$ ʀuJf9yuJ
  PD$PPlK<PML$LuVD$hxPV*D$P~W_^][L$T3tMX D$PUE_^][L$T3RMX D$P8<t$D$,Pxt$(t  t$M D$0=tP׋D$,T  PD$<hP)L$0t$Q|$0 %  D$4t$M D$D$@P׋ tPD$Dh$Pe) 8   t$D$΍D$HP8    x    D$$<u]A   f9xuOAuDt$   fCD$u P\ˋ D$D$PV_^][L$T3LX    fCD$PU_^][L$T3KX    fCD$PU_^][L$T3KX L$d2_^][3KX Vt$g   fF^ Vt$R   fF^ ̃@(03ĉD$<SVWj*FT F`X0D$P ʀu%J   f9yuJ      Q̉D$PUruiF`  L$D$D$D$,    D$0    D$ЉfnD$4PD$d$\$D$D$(LD$:L$fD$<fCD$>fCD$@CFT    F   萂L$H_^[3MI@ U   (03ĉ$   SVW}t$?ĒPΉD$ (N`3ۉ\$A0D$ 9\$  \$fD  FT8L$`V D$0P<S0D$<PL$`0$L$`u$<t2'A   f9Pt2At	t2  D$  D$D$$8؍L$pS D$8P<0D$@PlL$p0$L$put$L$@D$DD$HD$X    iF`  D$\    D$@Љfn$   PD$,d$,\$,D$,D$TJL$$$   \$f$   fA$   fA$   AL$@F
 fFT   t$D$C\$;\$4$   _^[3F] ̃@(03ĉD$<SVWjgFT F`X8D$P ʀu%J   f9yuJ      Q̉D$PmuiF`  L$D$D$D$,    D$0    D$ЉfnD$4PD$d$\$D$D$(HD$4fD$6fCD$8fCD$:fCD$<fCD$>fC
D$@CNTFL$~L$H_^[3D@ U   (03ĉ$   SVW}ى\$?ĒVt$(f3ۉ\$J`A8D$  \$@ BT8L$`V D$0P<S0D$<PL$`0$L$`u$<t2'A   f9Pt2At	t26  D$ D$D$ 8؍L$pS D$8P<0D$@PlL$p0$L$pu\$L$@D$DD$HD$X    iC`  D$\    D$@Љfn$   PD$,d$,\$,D$,D$TFL$ $   f$   fA$   fA$   fA$   fA$   fA
$   AL$@CT\$   q{D$CT$\$;\$$$   _^[3B] ̃(SVWj}CTt$8 6$<u%A   f9PuA      uh  hPhphQĉ0D$<P?iuC`s@(8\$D$L$WD$D$ D$ЉD$(D$0    t$4CKTCL$y_^[( UtSVW}t$?ĒPΉD$ 8|N`3ۉ\$A(D$ F   9\$  \$FT8L$@V D$(P<S0D$4PL$@0$L$@u$<t2'A   f9Pt2At	t2   D$@T   D$  D$D$$8؍L$PS D$0P<0D$8PlL$P0$L$PuD$΋Xt$$\$<D$<L$dD$hD$lD$dЉD$tD$|    $   AL$`w\$D$Ct$\$;\$_^[] Vt$fF^ ́  (03ĉ$  SUV$  WL$tt$E-8   C4fCCc g6ՋL$DW D$P<0D$(PtL$D0$L$Du   jj hPD$4P,D$8u   QVD$P$t$tGՋL$DWD$P<0D$(PL$D8 thн   t$D$h86P_8  hD6D$(PN8  D$,ʀuJ   f9quJt(t#PD$HPe[K`xP<L$DvdKTjz3t$K`D$xWK`W$K`QAP$   8ĉ00t$V$   WgiC`@PD$,    D$<    D$@   yAu+QRL$41;|$@L$,D$<CL$,PQD$dP$   P"D$\PD$P/C`Vt$$@X0hC`@X CskCT(3T$fCtIL$ +ʃ   rR#+   QRG!D$    D$    D$     T$pr3L$\U      rI#+   RQ T$@3D$l    D$p   fD$\r)L$,B   rI#+w^RQ $   $   D$<    D$@   D$, ;t	PML$tZ$  _^][3:   Ũ SUVWjPC`l$4@D$CT E $<u%A   f9PuA      =8j PD$<P0׋L$ W D$P<0D$P|L$ 0$L$ uu D$ PVD΋t$6CT     _^][  ̃\SUVt$lW|$6Ήt$Ē؋S\$ NO`3AD$  GT    8L$<W D$ P<U0D$,PL$<0$L$<  $<u%A   f9PuA      8j PD$0P0Ӌ؍L$LS D$,ˋ<PӋ0D$4P|L$L0$L$Lt$pu8L$\V D$4PӋ0D$<P|L$\0$L$\D$    Dt$p8t$|$GT    \$|$E;{_^][\ SUVW   ET D$2$<t3Ff9xt&Ft	tF33ۃtct^
$<uAf9xuAtAt<RԒjWIM`SqP6ВMTWPV9Wb_^][ jj H_^][ ̃<SUVW{  \$tt$P_^][< t$P>ĒVl$bD$UPRHK`3IPD$P9l$B       CT8L$,V D$P<U0D$(PL$,0$L$,   $<u%A   f9PuA      8؍L$<S D$$P<0D$,PtL$<0$L$<tO$<uA   f9PuAt-t(VВVԒL$PSt$`ITv`\$D$ED$P;l$_^][< ̃DSUVt$TW>ĒK`PD$At$kT͉l$c)%   CVfC`CC`@hD$3D$9D$  8    E L$XӋL$4V D$$P<t$0D$0PL$40$L$4  $<u%A   f9PuAn  e  Ӌ؍L$DS D$,P<0D$4PtL$D0$L$D  $<u%A   f9PuA      VВVD$(ԒL$D$`j	,$#t$D$XF   PUNF   ȍJ3^U4GU L$tFL$ȋ\tt!CuCuPUt$$v]t!FuFuPl$8D$@D$;D$_^][D ́(  (03ĉ$$  SUV$8  W=8t$׋6   ׋L$W D$P<0D$PpL$0$L$DEt;BǋjWM\$$<uA   f9PuAtct^83   D$PL$4 Eĉ0b	E`Wt$4@P0[ETL$@8D$0;t	PA$4  _^][3-(   ́  (03ĉ$  S$  UVWjS#$$  E $<uA   f9PuAtdt_8u    D$PL$ Eĉ03G`St$@P0jZGTL$(D$;t	PV@$  _^][3,   ́`  (03ĉ$\  SUVW$t  {  \$Wt
S:*  *?   |$ ;ƋOt$ĒPVˉD$K`3qP69l$  D  CT8؍L$8S D$$P<U0D$0PL$80$L$8s  8Ћ؍L$HS D$,P<0D$4PpL$H0$L$H8   DL$ITD$lD$d    D$hPL$\   D$PӋ<t$D$8Pp   <E   vhx  hhhR   v(W}D$huh{  hhQD$hj
j WP8PL$hD$d L$X\$|$hSWVWD$x;t	W=|$ E\$;l$ $l  _^][3)`   ́p  (03ĉ$l  SUV$  W>ĒK`PD$$8t$ kT͉l$(O '   CVfC'C3ɋC`L$@hD$,9L$ a  8ff     E ӋL$HV D$4P<l$U0D$@PL$H0$L$H  $<u%A   f9PuA    Ӌ؍L$XS D$<P<0D$DPpL$X0$L$X8   D؋D$$ 4D$|-8D$t    D$xPL$l   D$(PՋ<t$(D$HPp(   E   ؁vhx  hhhN   v(SD$xuh{  hhqND$xj
j SP8PL$xD$t L$hD$xL$D$0D$$j 4Ht%D$E   PVME   E ȍ@3M]+;   3  C+D$   r'F#;  P  P#BtV3ҋC+T$PQRbUt-K+ȁ   rP#+  QP-L$D$ΉCKCD$+D$;s2      +;vqX  Ѹ+;v;BPˉD$s؋΋D$+Qj Q&ME+PQSTt$VS]//+Sj t$%D$Í]CD$, tET$LЉL$lt!AuL$AuPVt$43RRt#EuE EuE PD$xL$|;t	P88L$AL$;L$ s	l$$$|  _^][3H$p   dJ#@7TVt$>fFFF^ ̃SUVW=8׋t$,   6׋L$W D$P<0D$PpL$0$L$D   D$;jOQETt$, $<u%A   f9PuA      86   D$0P EE`ϋ@X0jWPVPȒD$$U 
=  |3EET_^][ D$,   D$,M EET_^][ UV   9D$WOD$jP`ETt$ $<u%A   f9PuA      86   D$Pm EE`ϋ@X0jWPV8PȒD$(U 
=  |3EET_^] D$   D$M EET_^] ̃<SUVWt$~  tt$P_^][< |$PW{?   ;O؉\$ĒPSΉD$ N`3IX\$P9l$<  D$D$fD  FT8L$,V D$P<U0D$(PL$,0$L$,   $<u%A   f9PuA      8؍L$<S D$$P<0D$,PpL$<0$L$<8   DӋL$ITӋ\$PjVPS8PȒ\$Et$\$P;l$_^][< ̃TSUVW|$hً?Ēk`PD$,    A    Edt@E`EdAD$HP&2P     @    udM`Udt!FuFuPt$@t!FuFuPt$ CTVȉD$Jt$h   CfC@C0CC`C,   @`D$(3D$  -8\$    L$,ՋL$DV D$0P<t$0D$<PL$D0$L$D  $<u%A   f9PuAo  f  Ջ؍L$TS D$8P<0D$@PpL$T0$L$T   D؋ˉ\$j\$1t%D$hE   PSME   E ܍Z3Mu+;     F+SD$(H#N+ʉD$hQRPJt0N+ȃ   rP#+{  QPIL$hD$$AYFNVT$h+T$$;sX      +;vt  Ѹ+;v
;BPΉD$l"L$؋D$$+Qj CQ1F+PQSIt$ht$S@X+ Sj t$pD$tÉFD$( tEL$\4ȉlt!CuCuPD$T$, D$ L$jt$ PS8PȒ]M;t3fF   +D$,=   +@D$+;v
;D$BD$PΉD$lF!L$,ЍJT$$3ɉD$,fN;u+QPRiH%+PQRVHF+PD$<SPBHt$ht$ t$,Vt#EuE EuE P\$-8D$@D$;D$ _^][T ;	j42223y3̸   ̃D$WT$ S\$UVt$(W|$8L$fD$;tEl$4;tXD$PD$P+PQRP%t7t#   D;u_^]3[ _^]   [ _^]   [ ̋D$S\$Ul$,Vt$3WE ;;|$$      D$09E   t$f>v)H?  O?M ffE f  =   sw|$ 3ɉ3L$,   =     =   s&   D$    D$,    3ɉ\$4t$ Z=   s
   D$,      =   s   L$\$4t$ =   |$ L$t$4ދӉL$+ыL$$B+;   wL$(19\$s%J?   L$(?KF19\$|ۋًL$4|$, FЁ      v-E 
  @   fD$E    f<r;t$$tW>FO?wc?׋t$f> u   fE fE    ;;|$$$t$ 3;_^][ t$ 3;;_^][ G_^]   [ QS\$UVt$ƉD$t>W|$  ;t-EPt$+PD$(VP!x   D+uϋD$_+^][Y t$t$t$t$Q ̋A̸   ̸   ̃(03ĉD$D$ T$0SUl$<Vt$DW|$<D$D$4\$;L$8   ;   Ń+S| t$PRj   GD$PT$ PPD$,T$(P8؃xc+;|DSL$$QP?\$;L$8r_3;L$4^][L$3Q D$L$L$H͋L$(   _^][3" ̋L$D$S\$ D$UVW;D$3     L$(  9  T$D$, f;s $  f;
   $
 (  f;w@(D$,
=   s3ЋC=   s   +=   s   l$,   L$(u+;΋L$ |n|$, ust&<    ЋN?ʀ
   |$, EȋD$fD$  ;D$L$ T$3;_^][ _^]   [ ̃(03ĉD$D$S\$UVW|$0C+D$APSD$j PG_^]   [L$3 D$,N+;}#D$_^+C   ][L$3d ~VT$RQ;7L$3_^][38 ̋L$D$    ̃h(03ĉD$dD$lSUVWD$4$   3ۋ$   3D$    G@|$(L$@L$D$\    D$l    D$p   t$D\$\$Tl$XD$88_HuXj jL$d_L|$;|$ t  fD  |$pL$\D$l\$<CL$\SL$AL$,Pt$D$IPt$0Wt$PR\$ k  b  h  |$;|$   fD  L$;s1CD$TD$DCfX3fLX\$Tl$Xt$D\$   ˸+L$05  Y\$vϸ+;v;BEPL$H"L$0D$$\$Tl$X	L$RrLVP9D$ <}   L$$f3fHƁ   rv#+ƃ  WV L$HQPU9D$ L$f3fHt$$t$D|$G|$;|$   L$<|$;v  +ϋ+ÉL$;wCٍ	PD$ |$Ht$\$\CGP:3f_\$Tl$Xt$D\$;  Ӹ+T$,;  
Ջ\$T$$vʸ+;v
;BEPL$H!ȉ\$TD$,L$0l$X D$|$$D$
D$YD$,Rr^VQ!8t$$Wt$(8D$D3ɃfD$$E   Ɓ   rv#+ƃ  QVt$8t$DGD$HPQ7t$$Wt$(7D$Dt$03ɉt$Df|$l"  j jL$dN|$L$(+D$@AL;|$ |$4D$DT$p~D$TfG   L$\U         I#+3     D$(xJ   |$4(Pr/,m   Ɓ   rv#+ƃ   UVT$pr3L$\U      rI#+   RQCL$t_^][3h D$(xJ tv|$4(Pr+,m   Ɓ   rv#+ƃwUUVT$prL$\U      tI#+w_h2$($̃S8VWjj t$8PD$P,|$ u
|$t$4Ӌ؍L$S D$P<W0D$PL$0$L$uD$,_0^[̃ SUVWL$H1L$D$P<-8jj t$DPD$ P,t$$uӋt$ՋL$8   $<u#B   f9XuB   T   t$L$<D$Pt   $<u#B   f9XuB   Qĉ0D$ t$P0tl$<uA   f9PuAtIՋL$ W WD$PL$ 0$L$ uӋD$40_^][ ËD$48_^][ ̃0S8UVWjj t$TPD$ P,|$$-uՋ|$t$HӋ؍L$ S D$P<0D$PtL$ 0$L$ u8؍L$0S D$P<W0D$$PL$00$L$0u8   D$D_^][0ÍD$VPuՋD$D_^][0̋D$uAhHɸ    E ̃4SUVW|$H3?Ē3ۉD$\$H       8L$$V D$P<S0D$ PL$$0$L$$   $<uA   f9PuAtct^8؍L$4S D$P<0D$$PtL$40$L$4tVԒ;G\$HC\$H;\$_^][4̃4SUVW|$H3l$?Ē3ۉD$H       8L$$V D$P<S0D$ PL$$0$L$$tu8L$4U D$P<0D$$PpL$40$L$48   Dl$;~l$C;\$H4_^][4ht$9/h(t$/Vt$h4V.u\h@V.uJhdV.u8h|V.u&hV.uhV.u^ð^Vt$hVW.u8hVE.u&hȋV3.uh؋V!.u^ð^Vt$h4V-u\hHV-uJh\V-u8hxV-u&hV-uhV-u^ð^Vt$hVG-u&hV5-uhV#-u^ð^̃ UVWD$P8<L$4D$t$P	xt$R  l$0D$t$PM tD$0  PD$8hPL$t$Q|$   D$ t$M D$8D$4Pt tPD$4h$P 8   t$D$΍D$(P8    x t}D$$<uQA   f9PuCAu8t$4   fGD$8u Pϋ D$D$P=_^]     fGD$P_^]     fGD$P_^]  _^2]  VW|$F+;vowqSUn+Wi؋N+QRS*t,N+ȃ   rP#+w!QPpkF{]F[_^ ̃SUl$VWU̋^`    A    Ctt@CpCtAD$P"P     @    {tKpSttGuGuP|$tGu_KuPUNTtF`   F@p F    F3F   fF8F t	   fF_^][ Vt$WVO`wFVOTG`   G@P G3G   fG8G t	2   fG_^ D$   SUVW=   7  l?$@?t$ >WZt$$;BW>@_^][ t$ t"t$$;BʉAP_^][ Ch    t$$@E;BʉAP_^][ t$$_^][ t$$_^][ l$${`U    A    Gtt@GpGtAD$PP     @    wtOpWttFuFuPt$tFu~OuPUKTC`   C@p C    C3C   fC8C       fC_^][ t$$0_^][ t$ tCh    @Et$$;BʉQ@_^][ t$$3_^][ t$$_^][ t$$_^][ t$ tCh    @Et$$;BQ_^][ >>=><t=a==~>>? 





































































































































	
	













































































		̃SVWt$̋^`F       A    CDt@C@CDAD$PP     @    {DK@SDtGuGuP|$tGu_KuPt$NT~ F`   F[ [ @@ FwF"   ~     fFt(   F   fF_^[ ̃SUl$VWU̋^`    A    C$t@C C$AD$PP     @    {$K S$tGuGuP|$tGu_KuPUNTF`   F  @  F    F3F   fF8F t	>   fF_^][ ̃SUl$VWU    ̋^`F    A    Ct@CCAD$PP     @    {KStGuGuP|$tGu_KuPUNTzF`   F @ F3F   fF8F t	8   fF_^][ ̃SUl$VWU̋^`    A    Ct@CCAD$PP     @    {KStGuGuP|$tGu_KuPUNTDF`   F@ F    F3F   fF8F t	   fF_^][ Vt$NTF    3   F  F   fFF^ ̃SUl$VWkU̋^`FpF    A    CLt@CHCLAD$P*!P     @    {LKHSLtGuGuP|$tGu_KuPUNT~  F`   F  @H Ftl   F   fF_^][ ̃0(03ĉD$,S\$8L$Vt$DW    h8t$HD$Pet$D$0P$ D$4hPuGD$ hPu1D$ hȋPuD$ h؋PD$ tD$T$4r3L$ U      rI#+U  RQ=|$   h8t$HD$Pt$D$0PZD$4h(PT$PD$r7L$ U      rI#+  RQD$  h8t$HD$Pt$D$0PD$4hČPT$PD$r7L$ U      rI#+b  RQ@D$t~=8j PD$P0׋L$ W D$P<0D$PxL$ 0$L$ u3_^[L$,3e0h8t$HD$P#t$D$0PD$4h4PusD$ hHPu]D$ h\PquGD$ hxP[u1D$ hPEuD$ hP/D$ tD$T$4r3L$ U      rI#+  RQ|$ t:W$8PD$PD$ _^[L$,390h8t$HD$Pt$D$0PD$4h4PqusD$ h@P[u]D$ hdPEuGD$ h|P/u1D$ hPuD$ hPD$ tD$T$4r3L$ U      rI#+  RQ|$ t&D$PL$ _^[L$,3!0h8t$HD$Pt$D$0PD$4hPYu1D$ hPCuD$ hP-D$ tD$T$4r3L$ U      rI#+   RQ|$    FD$     VL$$D$(    D$,    Vt$$D$VPL$  t}L$(+΁   rv#+ƃ   QVU_^[L$,30VD$PL$ _^[L$,30j D$PL$8L$8_^[30}xsnid̃SUl$VWUm    ŋ̋^`F    A    C4t@C0C4AD$PP     @    {4K0S4tGuGuP|$tGu_KuPUNTuf~ F`   Ff@0 FF   	   fF~  t)   F   fF_^][ ̃SUl$VWU̋^`F    A    C<t@C8C<AD$PP     @    {<K8S<tGuGuP|$tGu_KuPUNTf~ F`   F ] @8 FF   	   fF~  t*   F   fF_^][ QVWjF   t'D$G   Pt$OG   3N`GSY,A(y,t!Cu{OuPt$NTf~ F`   Fe[@( FF"   	   fF~  t+   F   fF_^Y QSUVt$WjC`,    kD$   G   G   G    G    G    to?      r)E#;   P)ȃ   A#HtU3GUGwj V..G3L$GqAyt!Fu~OuPt$KTlC`   C_@^] C3C   fC[Y Q SٸW|$K`fC  ;   fC3fCD$Pt$KTC`@P {{_C[ S\$@  ;U   W   fofG  u	fGt$3OTfG O`D$OU^G`OD$   @P GD$M G_][ SٸW|$  t$fC   /;ȍKT؃fC^K`D$PC`?S@X C
  r_C    [ D$   D$M_ C[ SUVW|$s+;s_^]C[    K+;vjw}Ѹ+;v
;BPˉD$'+Qj .QC+PQVNt$WV_^][ +Wj V7C_^][ SUVt$Wo݋+;sG_^][    O+;   ?   Ѹ?+;v?,
;BUΉD$+Qj QG\$ +PQSJt,O+ȃ   rP#+wDQPGG_^][ +Vj Ul.G_^][ }nVL$P΍D$Pt	a^ s^ VL$P΍D$Pt	}^ O^ ́$  (03ĉ$   SUV鋌$4  WPt$8  P  =8׋$8     ׋L$W D$P<0D$PpL$0$L$DEt;BǋjW޽$8  $<uA   f9PuAthtc8$8     D$P腼L$0 Eĉ0E`Wt$0@P0$ETL$<8D$,;t	P$0  _^][3Z$   VL$P΍D$Pt	M^ ^ VL$P΍D$Pt~  u   fF^    fF^ VL$P΍D$Pt	W^ ^ VL$P΍D$Pt	^ fF^ ̃WL$Pτt#  D$Pt_ _ Vj   fGGT D$ʀuJ   f9quJtktfPD$P uG`\$D$@H0GVPw$GFfGGT    ^_ VL$P΍D$Pt~  u   fF^ {   fF^ VL$P΍D$PtG~  u   fF^    fF^ ̃@(03ĉD$<SVL$LWP΄tD$PP_^[L$<3@ jǶFT F`X0D$Pʀu%J   f9yuJ      Q̉D$PuiF`  L$D$D$D$,    D$0    D$ЉfnD$4PD$d$\$D$D$(/D$:L$fD$<fCD$>fCD$@CFT    F   L$H_^[3@ VL$P΍D$Pt	 ^ ^ VL$P΍D$Pt~  ufF^ ifF^ ̃@(03ĉD$<SVL$LWP΄tD$PP_^[L$<3@@ jF`x@FT D$Pʀu%J   f9YuJ      Q̉D$P)uiF`  L$D$D$D$,    D$0    D$ЉfnD$4PD$d$\$D$D$(D$4L$fD$6fCD$8fCFT    rL$H_^[3/@ ̃ (03ĉD$Sh8t$,D$P~t$D$P=D$h(PT$8؃r/L$U      rI#+wRQ訸L$ [3A &̃ (03ĉD$Sh8t$,D$Pt$D$P}D$h4P8urD$h@P"u\D$hdPuFD$h|P u0D$hP uD$hP u2T$r/L$U      rI#+wRQrL$ [3 ̃ (03ĉD$Sh8t$,D$Pnt$D$P-D$hPuFD$hPu0D$hȋPuD$h؋Pu2T$r/L$U      rI#+wRQNL$ [3 ̃ (03ĉD$Sh8t$,D$PNt$D$PD$h4PurD$hHPu\D$h\PuFD$hxPu0D$hPpuD$hPZu2T$r/L$U      rI#+wRQL$ [3 ̃ (03ĉD$Sh8t$,D$Pt$D$PD$hPxu0D$hPbuD$hPLu2T$r/L$U      rI#+wRQL$ [3 rQht$D$P,D$ʀuJV   f9q^uJu2YÉ$$PỸ (03ĉD$Sh8t$,D$Pt$D$PMD$hČPT$8؃r/L$U      rI#+wRQ踲L$ [3Q 6̃@(03ĉD$<SVL$LWP΄tD$PP̻_^[L$<3@ jFT F`X8D$Pʀu%J   f9yuJ      Q̉D$PuiF`  L$D$D$D$,    D$0    D$ЉfnD$4PD$d$\$D$D$(oD$4fD$6fCD$8fCD$:fCD$<fCD$>fC
D$@CNTFL$L$H_^[3@ VL$PtD$P	^ L$$<uBW   f9x_uBtTt!t$̒tD$P^ Ft^ VL$P΍D$Pt~  t	r^ ۳^ <^ VL$P΍D$Pt	蚳^ fFFF^ VL$P΍D$Pt	J^ ^ ̃S\$ VW      $nF`jj @X08PD$8PL$<u
L$(_^[ F`@X 083f   _^[ F`@ 0D$,P;D$0_^[ F`=8@ 0PD$0P0׋L$W D$P<0D$PxL$0$L$u3_^[ D$(P9 _^[ f~u:F`@   $8PD$4PD$8_^[ L$zF`L$@ p0D$P	 _^[ L$(GD$PL$,w_^ [ f'mgmmmTn;n̋A`V@X 08f^   u   D$ ̃,A`L$@( PD$D$D$Љ~|$ D$t=@=/ u.L$ t$$D$ D$L$$P$<$0@=t u"D$D$L$$PND$L$QL$ЋVt$4L$u^, QA`@   $8PD$PD$L$ QA`@ 0D$P谾D$L$ ̃$D$PL$D$QVt$W    fu7G`@   $8PD$PL$ _^Y L$BG`L$@ p0D$P_ ^Y QA`jj @X08PD$PD$uD$$Y L$Y ̋A`@VW=8 0PD$P0׋L$W D$P<0D$PxL$0$L$uD$(_0^ Ut  (03ĉ$p  ESVuWL$$\$D$L$$D$L=<P׋L$$D$ P׋0D$XP|$T [  D$XO  L$t$LfC   fCD$T	PtD$P!  PD$$D$hxP襞D$ PC   =      $L$L$PˍD$Ptm_^[$p  3] 誸fC_^[$p  3X] t$Ήt$PtD$PR$<uA   f9PuAtTtV̒tD$PCt{t 
  2_^[$p  3] L$L$PˍD$Pt_^[$p  3] B_^[$p  3l] L$L$PˍD$Pt${  tU,_^[$p  3/] _^[$p  3] L$L$PˍD$PtI_^[$p  3ڿ] L$L$PˍD$Pu|fCCC_^[$p  3蔿] L$L$PˍD$Pt_^[$p  3]] ̤_^[$p  3?] L$L$PˍD$Pt^_^[$p  3] [_^[$p  3] L$L$PˍD$PtE_^[$p  3賾] _^[$p  3蕾] L$L$PˍD$Pt1{  =     fC_^[$p  3K] U   fC_^[$p  3$] L$L$PˍD$Pt1{       fC_^[$p  3ڽ]    fC_^[$p  3賽] L$L$PˍD$Pt1{  [  fC_^[$p  3i] !fC_^[$p  3B] L$L$PˍD$Pt1G{       fC_^[$p  3]    fC_^[$p  3Ѽ] t$Ήt$P˄t-{  D$P_^[$p  3莼] j   fCCT $<u%A   f9PuA    D$VPuC`\$D$@H0CVPs$趽CFfCCT    _^[$p  3ǻ] |$ω|$ Pt%D$ P_^[$p  3莻] 58֍   ֋L$\V D$ P<0D$PpL$\0$L$\D\$D$Kt;BȋL$jP$<u%A   f9PuA    8W   D$P蓜EčL$t0C`t$Vt$x@P0.CT$   0D$t;N  P_^[$p  3\] t$Ήt$P˄t#D$P8_^[$p  3#] jJCT C`x0$<u%A   f9PuA    ?Qĉ0D$PuiC`  L$(D$,D$0D$@    D$D    D$(ЉfnD$\PD$d$\$D$D$<踼D$bL$(fD$dfGD$ffGD$hGCT    C   M_^[$p  3] t$Ήt$P˄t#D$P_^[$p  3̸] jSC`x@CT $<u%A   f9PuA`  W  ?Qĉ0D$PuiC`  L$(D$,D$0D$@    D$D    D$(ЉfnD$\PD$d$\$D$D$<aD$\L$(fD$^fGD$`fGCT    _^[$p  3輷] t$Ήt$P˄t#D$Pt_^[$p  3胷] jTCT C`x8$<u%A   f9PuA    ?Qĉ0D$PruiC`  L$(D$,D$0D$@    D$D    D$(ЉfnD$\PD$d$\$D$D$<D$\fD$^fGD$`fGD$bfGD$dfGD$ffG
D$hGKTCL$(_^[$p  3R] L$L$PˍD$P$|  _^[3] fu{uu=vxvtytt
z yux<wwveu|~t 	
́t  (03ĉ$p  V$|  L$W聹$  Q̉L$tbT$tD$    D$    D$   y@ Au+QRL$x|$L$D$CL$PQVL$,螗T$r)L$B   rI#+wVRQޖL$tD$xD$    D$   D$ ;t	QL$ $x  _^3@t  "̸ P̍D$Pj t$j j zpQ1H̍D$Pj t$t$t$6p05HS\$W|$;t2Vwt!FuFuP;u^_[QUl$V+F+=?  N+SWx+|$;  
;C؁      r'C#;   P   x#GtS3L$,E     E    At@E AEVD$;uVWPQ5L$(EVVPRQt;VvPN+ȃ   rP#+w2QPD$>ǋŉN;_[N^]Y A}̋L$Vt$W|$;t>+ff         F    D2F    D2    ;ut$VV_^̃3SUVW~T    FFfFFF   j    fFF    F  F(    F,    F0    F4 F8    F<    FL    FP   G    G    F`    Fd    Fh    Fl    fFp  Ft    芞؃D$    k;t@t0O+ȃ   rP#+  QPootjSh   ȃ'  A   A   A    A    A    A    A    A     A$    A(    A,    A0    A4    A8    A<    A@    AD    AH    AL    AP    AT    AX    A\    A`    Ad    Ah    Al    Ap    At    Ax    A|    ǁ       ǁ       ǁ       ǁ      ǁ       ǁ       ǁ      3ɋ~dAF`NdtGuGuP~lFh    Fl    tGu_KuP_^][SVWj    G    GG    G    G    G    ȃt+A   A    A    A    A    3ɋwAGOtFuFuPt$tFt$D$UoGwt%EuE EuE Pt$]tFu^KuP_^[ VWj    F    FF    F    F    F     ȃt+A   A    A    A    A    3ɋ~AFNt(SGu_KuP[_^_^ 4SVW~ltGuGuP~dtGu_KuPFTtAN\+ȃ   rP#+woQP莌FT    FX    F\    NPr.F<M      rP#+w$QPC3FL    _FP   fF<^[W   r5   M      rP#+  QP衋3Ǉ       Ǉ      f      r2GxM      rP#+k  QPGS3Ǉ       VǇ      fGx_ttCuCuP_ltCuCuP_dtCuCuP_\tCuCuP_TtCuCuP_LtCuCuP_DtCuCuP_<tCuCuP_4tCuCuP_,tCuCuP_$tCuCuP_tCuCuP_tCuCuP_tCuCuPt!GuwNu
^[_`^[_xD$V tjV^ D$V4th   VƇ^ D$Vth   V薇^ ̅tjP̅tjP̅tjP̋AVqtOVvPN+ȃ   rP#+w"QP    F    F    ^舼̃̃{hЇk̃hSUVW|$|t$ĒD$$F      D$    h   蛒؃tKC   C   43ۋ7kl$@\$D8L$HW D$(P<|$W0D$4PL$H0$L$HuD$t$PMЈT$tu	t$Ft$  NA;At      @    tC(XAT$@RP蛑T$}4    -8jj hPD$0P,|$4u
|$ t$ՋL$XU D$0P<0D$8PtL$X0$L$Xu8L$hU D$8P<W0D$DPL$h0$L$huĒL$CDD$P|$ЈT$t&CuCuPT$G;|$$|$|$|_^][h Et~tCu܋sNuPD$_^][h _^][h ̃S8VWjj t$8PD$P,|$ u
|$t$,Ӌ؍L$S D$P<W0D$PL$0$L$uD$(_0^[̃0S8UVWjj hPD$ P,|$$-uՋ|$t$D6Ӌ؍L$ S D$DP<0D$PtL$ 0$L$ u8؍L$0S D$P<W0D$$PL$00$L$0uՋĒ_^][0̃D$SUV W\$D$    P+10  3|$ h      F   F   4{tG{[NUtG^t^x~xt!CuCuPt!GuGuP|$3D$,nt$0͉l$$t$( D$P{|$CPD$;tC\$KA;At      @    tF(pAT$ RPt!FuFuPD$,l$|$ETl$ |$H+10;_^][ ̃PS8UVWjj hL$$PD$ P,|$$-uՋ|$t$d6Ӌ؍L$0S D$dP<0D$ PtL$00$L$0u8؍L$@S D$P<W0D$(PL$@0$L$@uՋ$<uA   f9PuAtPu2_^][P ĒD$D$d      h   މ؃tKC   C   473ۍC\$4D$08L$@V D$ P<0D$(PtL$@0$L$@u8L$PU D$(P<l$dU0D$4PL$P0$L$Put$D$sP   D$HA;At      @    tC0XAT$0RP譈t"CuCuPE;l$l$d-_^][P t!CusNuP_^][P ̃(SUVL$W&v\$@L$ SF3@L$D$$;    Btu`D$ Pt$ G|$;8؍L$,SD$(P<VU0D$PؒL$,L$\$<|$L$;L$$u_^][( ̃$-D$PL$]D$ ̋Ixu2Vt$t$uL^ V耔D$th   Vy^ ̃$}D$PL$譣D$ ̋IpVVj t$׊t^ VD$th   Vy^ ̃$D$PL$D$ ̋Ip8j t$t$t$菾D$t$t$t$t$]D$t$8Pt$4D$̋L$ujhhL$j hhhVW|$7F@PtF_^j _^jătnL$ËD$     VjF    F    mtFF    ^3FF^VW~tOjWvFt"PFtP(F    _^VFt"PFtP(F    ^VW~t菌jWvFt"PFtP(F    D$tjVu_^ VFt"PFtP(F    D$tjV`u^ ̋D$SV0W^C@Pt{SܒWPӃD$jD$PN D$~D$OIQtwWܒVPӃj D$PN D$L$$D$D$PL$T$_^[̃V8L$V D$P<L$$0D$PL$0$t$ L$^̃(S8UVWPL$0Jjj hD$PD$(P,|$,5u֋|$|$ uQL$g   |$D$D$PD$PD$DPL$h5L$,_^][(j j D$hw PL$$W$L$D$Pj0j hv! hȑt$ j h, hБt$0ձj hs hؑt$@j hd ht$P諱@j hH ht$ 蓱j hu ht$0~j h\w ht$@ij ha ht$PT@j hq h$t$ <j hR6 h0t$0'j h6 h@t$@j h@M hPt$P@j hzc hXt$ j h|M hht$0аj hZ hxt$@軰t$DD$LP]8D$(u	֋l$m ӋPD$tQ(D$ P    tUPPt$D$PD$(u	֋l$m t$<Ӌ؍L$ SD$P<UW0D$P5L$ ֍L$,_^][(̃,SUVW=8׃|$D 
   L$,Uj D$UP(L$j0t$׋L$WӍD$P<0D$P,$L$0ӍL$ut$DD$HUP=̋ j׋D$Ht0UtPj j j j j j jj t$hQhU0D$pP0L$,0Ӌt$@L$,_^][,j t$Dj j j j jj t$ht$hj UV0_^][,̃$S\$VWPI<1V$<   B   f9x   B
uwy 
F   AD$8Pu31PL$Qjt$L$Q8u   _^A[jyt?jG    G    ytXGG    3GG33v tj5hhCj6hhh#UWj 8GtP(G    3tVUGj hH' WP@]uA_^A[Ë _^A[VFuj]hhԏFPF^̃V58PL$t$PD$P4t$D$t$8t$8P蓱jj t$(PD$P,t$u
t$D$j QQĉ0D$L$(P L$V$L$^VFujlhhԏFt@$<ujmhh֫FjnhhH軫FFuj hH' Vv^̋D$Vp~ tj}hh`VFtP(F    j^Vt$j hv! hȑ6j h, hБ6j hs hؑ6Ԩj hd h6@j hH h6諨j hu h6蘨j h\w h6腨j ha h6r@j hq h$6\j hR6 h06Ij h6 h@66j h@M hP6#@j hzc hX6j h|M hh6j hZ hx60^VW|$x 0@vƘ   pƃPZL$VQHZ_^D$uAAË AQS\$VWPH"86 vǘ   @Ƙ      56 v@Ƙ      q @   AD$AP蜨L$t$VWQH_^[$uAAYË AY̋D$SUVYQW9?1 vƘ   ǘ   @   D$@   D$   +? ǘ   @   D$@   D$Uz @   D$@   D$-BD$z@   D$JD$L$zBPTL$t$t$WVQHjL$ _^][D$u
AAË AS\$VW;O7G?vƘ   ǘ   wƃ?ǘ   ~PxL$WVQHv_^[D$uAAË AVW|$x 0@vƘ   pƃPL$VQH蹭_^D$uAAË AVW|$x 0@vƘ   pƃP芥L$VQHA~_^D$uAAË AS\$VW;O7G?vƘ   ǘ   wƃ?ǘ   ~PL$WVQH\_^[D$uAAË AS\$VW;O7G?vƘ   ǘ   wƃ?ǘ   ~PXIQWVL$QH&a_^[D$uAAË A̃S\$UVWPH"86 vǘ   @Ƙ      56 v@Ƙ      q @   AD$(APyL$]L$D$P<t$D$ P|$ tt$ 8~   8   t$(MPWD$$PuX_^]D$[u
AAË AQS\$VWPH"86 vǘ   @Ƙ      56 v@Ƙ      q @   AD$AP,L$t$VWQHA_^[$uAAYË AY̋D$SUVYQW9?1 vƘ   ǘ   @   D$@   D$   +? ǘ   @   D$@   D$Uz @   D$@   D$-BD$z@   D$JD$L$zBPL$t$t$WVQHhL$ _^][D$u
AAË AQS\$VWPH"86 vǘ   @Ƙ      56 v@Ƙ      q @   AD$APܟL$t$VWQHb_^[$uAAYË AYS\$VW;O7G?vƘ   ǘ   wƃ?ǘ   ~P(L$WVQHR_^[D$uAAË AVW|$x 0@vƘ   pƃP語L$VQHc_^D$uAAË AS\$VW;O7G?vƘ   ǘ   wƃ?ǘ   ~PL$WVQHr_^[D$uAAË A̋D$8 ̋D$L$+QPD$+P蛥̃Ul$W+G+=?&  W+SVp?+t$;   ;C؁?      r'C#;   P@h   p#FtS h3D$ l$L$ G;u+PQV蹤l$#+PQV褤G+PUl$$EP萤t,O+ȃ   rP#+w4QP\[D$7ŉO3^[O_] 
ӮĐUW|$ uOSVwt$ߋ?st!FuFuPjSZ t^[_] ̋	T$AB    Jx u)L$V19p}@3
B    Jx t^ SVWj    G    fj @@f@G    G    e؃t'jKC   C   mC 3ۋwC_GtFuFuPt$O蛗u3wG    G    tFu^KuP_^[ SVW0QO蜖wG    G    tFuFuPwtFu^KuPpW聓j7X_^[VWz t"Bx u;PuЋ@x t_^Ëy u    Ȁx t>_^D$VtjViW^ D$VtjV9W^ VlYD$tjV
W^ V_D$tjVV^ ̅tjP̅tjP̋Aj ̋Aj QSUl$VWL$l$uE }x u tL$y;    uuw9hux9.u>~+ՋD$9E u  tWyȃD$M +9Bu2 tΉJP{   Gπx uȋAx tՋD$JPWHE ;Mu quw>EAEH9huHE9(uHEQAEAU<  ;x-  !  ;   Ny uCANF Fx upFA;puHF;0uH1NNy    zuAx   AxuBA QWNFAFAV@Eyuy uDAF AAx upFA;puHF;puHqNy uQzu7xu/A v;hGKD$tIK_^][Y xuBA QxFAFV@ṼT$Ul$@ D$U;u(hhE] |$ uj;Puh*;u(EՀx   SVWJzqY;   Fx    q;uEщBx uPFE ;Pup3;u
03p3F@@ H1FFx uHAFE ;HupN   A;HupN   0N   x uA@@@ P   ;u<ыȋAAx uPAE ;PuH;PuHQA@@ HqAx uHAFE ;HupA;u0pqBx yl$$_^[D$@@] ̋T$VrBx uPBF;Pupr^ B;u0r^ pr^ ̋D$y u@ ыȀx t̋T$V2FFx uPBF;PupVr^ B;PupVr^ 0Vr^ h;̃VWt$D$Pg|$tD$PXNt$t!Fu~OuP_^ ̃4S\$<Ul$DVt$Wy    C    _^][4 UD$(P#gD$$tD$(C_^][4 jZ|$tYjOG   G   booGvl$袌GD$H ML$L$, ŉl$L1v3Ou   |$D$D$H   D$LHL$L$,D$0D$,PD$<L$PΉ|$<f~ @fD$,x u>L$;H|5t$Ht{usGudPD$D$C[~I$	   6jYL$ HL$LHL$ Pt$4xt$40ppf@  t$HD$L{tuGuPt$(tFunMuP_^][4 H̃V1W3L$|$|$|$D$;   SU    xXtG{KL$l$;L$ t2;u	D$.AD$+ŃP+UQҔ] SUL$ ]t!GuGuPL$蛅D$;b|$L$][t$;tD$D$PTL$;u|$t-L$+σ   r#+ǃwQW$K_^讀̃SD$Ul$VWCЉ\$z u/]     J;}R t;Lz tߋ\$ ux uM ;H} @x t3Ɖl$;tNHEy t$Hy u    ;AuIy tz uf
рy t;ul$t$;3u0 t*st$V+[[F    _^][ ;tl$L$调V ؋st!NuFuPjSjIt$$;uD$_^][ ̃Vt$D$WPD$P    F    aL$y uD$;A|;tJQtBQ~AVt-SGu_KuR[_^ _^ ̃D$$SUVhW|$8l$tG|$8D$4D$D$D$PD$$|$ P`~ @fD$x u,;h|'tgGuWwNuIP@{I$	tR3jSL$HPt$ht$x0ppf@  <|$8D$0L$4x_^][ +CVt$t$XfD$f   0^ VaD$th   VF^ ̃$荋D$PL$pD$    IpPF̃$=D$PL$mpD$ ̋VHpqtFq   	t;t'WFu~OuP_^ð^̃Vt$$W8L$WD$P<0D$Pt$$t@L$F_^3L$F_^̃(Vt$4W8L$WD$P<0D$$Pt$4tH@WfD$D$L$NL$F_^(̋D$W8$<u+A   f9PuA
tAu2_SV8L$VVL$^[_̋D$$W<uHA   f9Pu:A
tAu$L$詈D$PL$mD$_jj t$ 8PD$P,D$u
D$Q̉D$t$P"DuD$_QT$V$<uFA   f9pu8A
tAu"L$蹇D$PL$l^D$YËD$0D$2PdCuD$^Y̋D$t$0t$訑D$̃Vt$D$t$Put$$<u+A   f9PuA
tAu2^SW8L$WWL$_[^̋D$ʀVu+J   f9quJ
tJu3^Q̉D$P@^̃t$D$t$PVD$ʀu,JV   f9q^uJ
tJu3PD$P`@̋D$ʀVu-J   f9quJ
tJu	33^Q̉D$PcbЃBR^̃t$D$t$PFD$ʀu.JV   f9q^uJ
tJu33҃PD$PaЃBR̃D$SVt$ W|$$6D$ ?8؍L$SD$P<L$ WV0D$0P8 tXL$_^[ÍL$2_^[VAD$tjV>^ ̋D$8 VWjF    PF    F    F    jjF@    FD    FH    uJȃt+A   A   A    A    A    3ɋ~DAF@NDt(SGu_KuP[_^_^ThSVWsDtFuFuPCPXstFuFuPst!Fu~Ou
_^[`_^[D$VTtjV<^ D$VhtjVy<^ ̋D$`̋D$V0΋P^`̋D$Uf   SVu@]@Wv6_FMytGyISl}H tuVD   M qMV4}H tLEXtCX@p EH    t"CuCuPV4tGu_KuP_^[2] ] P}j jh   j  fuEPn=t7j jh   5P fuj jh   5P fu2QSUVs@k@WΉ\$v6*^FKytGyIU觀{H t|sV#C   pK2{H tJCXtCX@p D$@H    tCuCuPV3tGuoMuP_^]2[YP[{SV{H txsV.BumoK1{H tJCWxtGx@p CH    t!Gu_KuP_V'2^[Pz̅tjP̅tjP̃2̃n{S\$W|$;t2Vwt!FuFuP;u^_[ SUVW|$م~qCptFphj Wjqu PDtMj Wjgu PnDt1t!Fu~OuP_^]   [ t!Fu~OuP_^]3[ Vt$?JhG Fh! P8P@P<^ SVWGptFp@u2jj jfp PJC؅t!Nu~OuP_^[SVWCptFpxt:t$wj# PBtjjjfw PB2ۅt!Fu~OuP_^[ ̃SUVW{H th   h`hRvs@C@ΉD$v6YjFSAt#hPNF   F   T=3kFCst!EuE EuE PChtEh@D$   \$3v6kXPSFzPxr2ۅt!EuE EuE Pt$ tFu~OuR_^][ jE@D$tFF   F   hN    B    Ct@CCBw3t$FsD$CtFuFuPD$$   KqtFqIj PjqqL$  P7@u'tFuFuP3rD$j t$(jgpN P?u'tՋFűFuP3(tFuFuP   P?,t$jjh  v Pj?D$j j j @j +PQj v P6?CH   SVWjX    F    r=tOG   G   TO3^G~t!Cu{OuP_^[Vqt%WFu~Ou	_^`_^D$VtjXV90^ D$Vtj0V	0^ VJD$th   V/^ VJD$th   V/^ VPJD$th   Vw/^ V JD$th   VG/^ VID$th   V/^ VID$th   V.^ ̅tjP̅tjP̃OyVqt%WFu~Ou	_^`_^Vh   :tt$Vbl3P!y8^   D$ ̃VWj0-:t&F   NF   t$t$n3Ft$h   D$9tt$$L$QWM3D$ P>t
Vcxtj8t$   |$t-SGu_KuR[_^ _^ ̃SUVWt$ ;h   8tgMtAME t$$D$D$L$P>   t$̔Ƈ    t%Fu^KuP3M W$w8_^]   D$[ Vh   8tt$Vj#3Pv8^   D$ Vh   7tVbPIv^Ë3P=v^Vh   n7tt$j VU3Pu8^   D$ ̃SUVWt$ 9h   6t[MtAMt$$E D$D$VL$PBt$t%Fu^KuP3M W@u8_^]   D$[ ̃$n$D$P<L$$<uBV   f9p^uBt!t$D$PL$t
3̃$]n$D$P<L$$<uBV   f9p^uBt!t$D$PpL$t
D$ËD$     ̃ SVٍL$$WmD$P8=<hlD$8PD$PLGt$L$mL$D$P׋$<uA   f9PuAtt$D$Ppt$u3hxD$8PD$(PFL$,D$0t$PL$$3th   B4tt$<t$<WVSX3Pr8_^[   D$$  ̃SUVWt$ 6T$(D$T$PTh   3tmMtAME t$(D$D$L$P8   t$D   Ƈ    t%Fu^KuP3M Wq8_^]   D$[ ̃VWj02t&F   NF   t$t$Eg3Ft$h   D$W2tt$ L$QWI23Pp8t$   |$t-SGu_KuR[_^ _^ ̃VWj01t&F   NF   t$t$Ef3Ft$h   D$W1tt$$L$QW.[3D$ P<6t
Votj8t$   |$t-SGu_KuR[_^ _^ VWt$W3h   b0tt$j VWD3D$Ph*t
Vntj8_^   D$ ̃SUVWt$ 2h   /ttt$$2M؅tAME t$(D$D$L$P4   t$   t%Fu^KuP3M Wm8_^]   D$[ ̃SUVWt$ 1h   .ttMtAME t$$D$D$L$P3   |$|ǆ   ǆ   t%Gu_KuP3M Vl8_^]   D$[ Vh   -tt$jVw3Pol8^   D$ ̃SUVWt$ b0h   m-t`MtAME t$$D$D$L$P2   t$t%Fu^KuP3M Wk8_^]   D$[ ̋D$ЃxrL$Vyr1pRqV,,^̋L$   rD$#P+v	UT$L$T$QUl$V+F+=?  N+SWx+|$;  
;C؁      r'C#;   P+   x#GtS+3L$,E     E    At@E AEVD$;uVWPQkL$(EVVPRQkt;VvPJN+ȃ   rP#+w2QPD$>ǋŉN;_[N^]Y S^TUW|$ ujS\$VwSk'?N$r(FA   rP#+w6QPj(VF     F$   F  t^[_] 'S̋VW|$p7~ G    Gu[S\$UCkD$ 7Ӄr~$NrNt$Rv Q(yv3
w   6G~ t][_^ ̋T$S\$Vt$W|$;ߋB˃r;ust4:u't)B:FutB:FutB:Ft3u;v_^[_^[̋T$L$+Qj Rz6D$fD$fA̕A     ̕̕D$V̕tjVy^ Vt,N+ȃ   rP#+w*QP/L$D$AFD$AF^ P̃T$Ul$@ D$U;u(hhE] |$ uj;Puh*;u(EՀx   SVWJzqY;   Fx    q;uEщBx uPFE ;Pup3;u
03p3F@@ H1FFx uHAFE ;HupN   A;HupN   0N   x uA@@@ P   ;u<ыȋAAx uPAE ;PuH;PuHQA@@ HqAx uHAFE ;HupA;u0pqBx yl$$_^[D$@@] ̃y Vqu$D$VpAP蚨 ft    2^ ^ ̃y VquAVj PO ft
    2^ð^̋D$ D$   rP#+wQP 2MVFtPFPǧ F    ^̋A́(  (03ĉ$$  SVW$8  h#  \$H$   D$X    D$\    D$8    D$<    D$@    #
  p#FD$8L$4+PQV_T$@t1L$<+ʃ   rR#+w
  QR   t$4h   L$8t$<D$@7jD$    D$    D$    }"L$T$+QRV1_T$ t1L$+ʃ   rR#+	  QRFt$jL$t$D$I7j(D$P    "h    @@f@D$PD$|    D$p    D$0    D$4    D$8    !L$4T$0+QRVt^T$<t1L$0+ʃ   rR#++	  QR9   t$(h   L$,t$0D$46h   D$p    D$     D$$    D$(    &!L$$T$ +QRV]T$,t1L$$+ʃ   rR#+  QRU   t$ h   L$$t$(D$,57D$t    VD$X   v6@T$dFD$8L$@+RQPD$hPt$$jsCP蒤 fd  f  D$XPD$<P$   P"0D$$+D$ PD$$P$0  P0$   $   Ǆ$       $   Ǆ$       C$   \$Ds   $   $   kGE=   r'H#;O  QC  x#GtPs3C$   PVWcZ\$Dt$TD$xj jPD$ThV$   p@P$   F L$,D$lPD$8+PD$PQhVp@P D$lPD$0P$  P.L$,D$|PD$,+PD$PQhVp@Pע D$pPD$$P$   P.D$tj jPD$Th~Vp@P蜢 $   P$   PL$To$   ~ u5~$VrVv $   RCSPx
;t$L  $   $   jxC$   $  $   $  C$  $   $   $   C$   $4  $   $   C$   $   D  L$|F   F   D$tD$hD$xD$D$\D$dAF    F    F    D$`    Au+L$`Q$   N1*$   N$    A    A   BD$`Bu+T$`R$   )D$dND$   F<D$F@B    A    A   D$D  Bu+T$R$   )$   N\    A    A   BD$ Bu+T$R$   d)D$hFt3$   V$   $   A;At      @    tFpA$   RP$   P$   PL$TH~ fք$   y u/y$QrQq $   RCSPP  |$PfffL  D$Lj(D$h}؍$   D$HCC    C     C$    L$hs   C|ȺGʉL$A   r+A#;  P
  H#AD$DtQȃD$D3@KPt$lQUD$PL$C D$dK$L$LS$   $   CCfC  It!FuFuPt$T$   Ft$Tr@P$   	$  Ǆ$       Ǆ$      Ƅ$    r@P$  J	Ǆ$      Ǆ$     Ƅ$   r)Eǁ   r#+ǃ  UW$0  r@P$   $   Ǆ$,      Ǆ$0     Ƅ$   r@P$   D$8T$XL$@\$H+RQPD$hPt$$VL$ t+D$(+PQL$(]D$     D$$    D$(    L$,t+D$4+PQL$4]D$,    D$0    D$4    D$LpD$PPj(t$PL$t+D$+PQL$:]D$    D$    D$    L$8tD$@+PQL$@]$4  ]_^[3%(   AKAQSUW|$UڋE +T$;sx_E][Y    M+V;vr   Ѹ+;v
;BP͉D$#9ϋ+Q^j Q#M E+PQVQt$WVY^_][Y +4?Vj R"D$ƉE^_][Y /V8Pt$DD$̃VWt$,=8PD$P0׋L$W D$P<0D$P|L$0$L$uD$(_0^̃0SUVWj{85t)t$LӅu53E V5PփE 3ԕG`    odGl    PL$(PD$PDӋO`tQ(G`    D$t
PUփG`j   t$ӉD$uPD$PDt$ jj hPD$$P,D$(u
D$$PVt$,D$DPL E fE3L$$ohL$DGp    Gt    At@t$LGpAGtGx    G|    Ӆu3VP   L$ D$LǇ          D$HƇ   Ƈ    Ǉ       Ǉ          EJD$DPL$$u/    _^][0 Vt$jt$^ ̃Vt$D$D$    jPD$    ^ ̃VWԕ8PL$F`tP(F`    ~dt!tP(    jWvl6vht#8PPjVL$_^SVW   tP(ǆ          tGuGuP~|tGuGuP~ttGu_KuP_^[nV0D$tjpVZ^ V D$th   V'^ ̃V8L$V t$(D$$t$(Q̉D$4P<L$(0D$4PHL$0$t$L$^VWwxt>    t5Vt
uGϋ@ЄV      @Є   t	_^_^PB̃V8PL$vhNdD$j j PP5L$^̃ (03ĉD$V񃾀           SW=8D$    D$    D$     D$$    tD$PVl   L$D$QP   D$D$
$<uA   f9XuAu3Ēt
   L$ 3ۅÃD$P׋<׋   u31PL$D$P0L$QS0D$ VPOM_[L$ ^3" ́  SUVWL$ |$XC   L$ 8  p+0D$(VPt$4>3ɉL$$  =,-fff     D$X    4ȋFD$Tt@FD$T6~,Ft$r PD$PL$(~rjj PPD$@P׋t$Dt$u
ՋD$0D$jj h@PD$DP׋|$HuՋ|$4t$Ӌ荌$   U$   P<t$W0D$"P-$   ՋD$p0PD$tP0Ӌ$   W D$pP<0D$xP$   0$$   t$Յ5ujj hLPD$HP,|$Lu֋|$8t$Ӌ荌$   UD$xP<t$W0D$hP-$   ՋD$p4P$   P0Ӌ$   W $   P<0$   P$   0$$   t$Ջ-ujj hTPD$LP,|$PuՋ|$<t$Ӌ荌$   U$   P<t$W0D$jP$   D$8xr jj PӋ=,PD$PP׋t$T-t$u
ՋD$@D$jj h`PD$TP׋|$XuՋ|$Dt$Ӌ荌$   U$   P<t$W0D$lP$   D$Pxr jj PӋ=,PD$XP׋t$\-t$u
ՋD$HD$jj hpPD$\P׋|$`uՋ|$Lt$Ӌ荌$   U$   P<t$W0D$nP-$   ՋD$phP$   P0Ӌ$   W $   P<0$   P|$   0$$   t$Ջ-ujj h|PD$`P,|$duՋ|$Pt$Ӌ荌$  U$   P<t$W0D$pP$  t$|$(Ӌ荌$  UD$hP<Vt$(0D$rPؒ$  t$Tt"FuFuPL$$-A=,L$$;L$,y|$Xj D$,P8GxD$ t@phtFph@dt	x D$tFunMuP|$ $0  D$(E tbL$,QPt$,ӅuӉu   XVPӅuu   96PVE(   D$hPL$$ E   _^E   ][   ̃UVWMpqtFq	D$S   P$P     @    ]|MxU|tCuCuP\$tCuCuP[tFu~OuP}x _^]̃SUVCptFHDtAHD   @@      tFuFuP   t;AuO{x tICxHPtAHP   @L      tFuFuP   t;A]  j ȃt+A   A   A    A    A    3ɋ   A      tFuFuPjxR D$   Wx@   jhlW@        G   G   <wG jh,V    F   F   <D$(F G8    GL   GH    G0G4    GP    Gd   G`    Gh    _3   pt$D$Q;Qt2BA^][ÍD$PRVDt$tFu݋nMuϋ^][`QVW8|$L$   QΉPD$G   
$<u-AS   f9X[uAu33_^Y ĒЅt	   O3_^Y ̋T$    A    Bt@BA S\$3VW3ɋ;t1jt@   @    x3    ϋ~Ft!Gu_KuP_^[ ̋D$8 ̋D$8 ̋D$8 ̋D$8 ̋D$8 ̃H(03ĉD$DD$TL$PS\$P&|s ك PQD$NP/H-   fPQD$NP/ȃ3   D$T$VW3|$Nt$;t+PQL$}T$ t$D$|$C8VWPSHT$0_^r/L$U      rI#+wRQL$H[3 	H %̋D$Vt$W|$+WPV87_^S\$W|$;t2Vwt!FuFuP;u^_[Vt$W|$;   Pr,FA   rP#+   QPLF       F Nr(FA   rP#+wqQPF    F   F Năr(FA   rP#+w/QPF    F   F TF;*_^6#̃T$*UVW7+֋O+θ*D$=UUU}  O+SX*UUUʋ+;L  
;CȁUUU6  I   r'C#;  P  p#FtS3L$$m    ō,D$ l$ E E    E    At@EAL$EW;uWVQPD$,MWWQRPtRWwQO*/+@   rU#+Ew<QUl$D$@7@ōO3[O_^] d+!̃0(03ĉD$,D$<L$8Vt$8)|s#ك PQD$6P*-   fPQD$6P}*L$.    F    F   ;t+QP#L$0^3-0̃S\$W|$05  O10+O10+U0ʋ+V;  
;s=0  kTD$=   r'H#;  Q  p#FtP3D$  P+PkTPaAG;   K4V4D  E     RTB    ITB    E ~CfETA    A    TABAB    B    B    fBAB~AfBA    A   A AfBAfBB    B    B    AB~AfBA    A   A ;%|$WUUtLWwQ}O10+kT   rS#+ڍCw5QS(kD$T7ƉGD$^]G_[ '̃SUl$$W|$,l$(uw	\$$   D$$D$V ŉ|$(/KimD$D$(ڋȋD$(ξ	   D$ L$ |$|$(3݋l$,ˋ\$ЉT$+|$|$i ʚ;+͋l$,̃+ȃ0fʃu߉\$>r	3^f̃+0f+u_][̋L$Vt$W|$;tNSލVA+ H@RD    B    HLHJH@    @    ;u[t$VVv_^Vj(stEL$D$F   F   8I FD$N$NFFV p^ËD$3Np^jЃt5L$D$B   B   	JJBBȖPËD$3ҍJPjЃt5L$D$B   B   	JJBBȖPËD$3ҍJPj(ЃtBL$D$B   B   t JBD$BBܖB PËD$3ҍJPVj0tAT$Nt$F   F   $QAЉtD$Np^ËD$3Np^Vj0tCT$Nj t$F   F   $QAЉ D$Np^ËD$3Np^QVj tUL$    F    F    F    FF    F    F    tL$QPD$0^YËD$^     YQVj tTL$    F    F    F    FF    F    F    tL$QP5D$0^YËD$^     YSUVt$W   jT   \$ G   G   ȍwwwtgr     r)C#;d  PȃG  A#H	SGSGwj V
G3\$wt$|$   C   sN   P   F+|$ ;      n+   r'G#;   P9   X#CtW3ۋF+PQS(t)N+ȁ   rP#+w2QP+F;Ft$D$L$_0^]H[ )4    A    A    A    A    A    A    A    A     A$    A(    A,    A0    A4    A8    A<    A@    AD    AH    AL    AP    AT    AX    A\    A`    Ad    Ah    Al    Ap    At    Ax    ǁ       ǁ      ǁ       ǁ       ǁ      ̃SVWjFP=	L$(F4    F8    F<    F@    FD    FH    tAL$ D$FDD$NHFL    FP    FXF|jPFTF\    F`   Fd    Fh    Fl    Fp    Ft    Fx    NDD$vXPaP     @    ^@N<V@tCuCuP\$tCuCuPjȃt+A   A   A    A    A    3ɋ^PAFLNPtCuCuP\$ tCu{OuP_^[ 8`Lt$  VNr'A   rP#+wQPrF    F    ^Vqt%WFu~Ou	_^`_^Vqt%WFu~Ou	_^`_^Vqt%WFu~Ou	_^`_^V1tNyj Vc^VtbWVvPSN10>+kT   rW#+Gw#QW    F    F    _^wVt`WvPN*>+@   rW#+Gw#QWp    F    F    _^Vt@N+ȃ   rP#+w"QP    F    F    ^ySVW~`tF`   F|P^xtCuCuP^ptCuCuP^htCuCuP^PtCuCuP^HtCuCuP^@tCuCuP^8tCu{OuPFP_^[VWwt#SFu^KuP[_^(QSUVM$mu   W}|$;t<fD  ~t#GuGuPD$;uϋuM +΃_   rV#+F   QVOE    E    E     utFuFuPutFuFuPut$Fu^Ku^][`^][YN
VW|$;taNr'A   rP#+wEQP)F    F    ~GfFG    G    _^ 	̋D$VWHtAH~ Nt*SGu_KuP[_^ _^ ̋D$VWHtAH~ Nt*SGu_KuP[_^ _^ D$V8tj(V^ D$Vtj(V^ D$V`tjVi^ D$Vtj(V9^ D$VLtj(V	^ D$VtjV^ D$Vttj(V^ D$Vtj(Vy^ D$V$tj0VI^ D$VtjV^ V#D$tjV^ V#D$tjV^ Vx#D$tjV^ VH#D$tjVZ^ V#D$tjV*^ VD$th   V^ VW~t#SGu_KuP["D$tjV_^ ̃V8L$VD$P<t$(L$$t$(0D$Pt$t@L$F^2L$F^QQI-*$8PD$PD$L$ SY8[   u   D$ ̃VWq=8PD$P0׋L$W D$P<0D$PL$0$L$uD$(_0^ ̃$D$PL$D$ QA$8PD$PD$L$ ̋AQVW y4P8WVt$PVH_^ qqt$~D$ ̃H(03ĉD$DAS\$PVWPD$RPȍ|$V33D$t$   T$ ;t+PQL$T$ t$D$|$C8VWPSHT$0r/L$U      rI#+w RQL$P_^[3H qqt$ND$ ̃$D$PL$D$ A$t$D$ ̋t$RD$ Vt;VvPN+ȃ   rP#+w*QPL$D$FD$F^ R ̅tjP̅tjP̅tjP̅tjP̅tjP̅tjP̅tjP̅tjP̅tjP̅tjP̋Aj ̋Aj ̋Aj SVWs$tFuFuPst!Fu~Ou
_^[`_^[̋Aj ̋Aj ̋Aj ̋Aj ̋Aj VqtNmj V^S\$W|$;   UV3t{k;t5~t!GuGuP;uы3|$C+ƃ=   rN#+w2PVS    C    C    ;t^]_[ ̋D$Vh<PuF^ 3^ S\$UW|$t^Vw4jPGj P    vTF    TF   F    F    F   F    F    F   u^UWWP_][ hЇhЇ̋D$=wA=   r"H#;v0Qȃt&A#H tP 3 d#QI<$VWj j Ph'  D$    PW t$|$j @Ph  Wt$V j ph  Wt$V j @Ph  Wt$V j ph  Wt$V _^Y ̃((03ĉD$$UVW|$<V<T$tMl$8qTAqqPqAPAPAPUrV ft-N<F`   t	FLP_^2]L$$3( S{p    N<D$j j Ph'  D$     PU j @Ph  Ut$ U j ph  Ut$ U j @Ph  Ut$ vU j ph  Ut$ `U <D$    D$,    D$0    {krs!   l$,D$0D$   :L$;GGPm   D$QSPgl$,|$0D$D$    PjD$D$    PD$$\$(h'  pC\$0T W&t0D$,PD$@Sh  Pt$ tT WtD$0D$02ۃr/L$E      rI#+w!RQhL$4[_^]3( ̃SUVWo<  w|V  _^V\$t$d  t!j jjuS P?  uR |$    jNt+F   F   ܍F    F    F    3j V    A    tF qS.؉\$t'Nu^KuP\$`u,_^][ fdu?D$D$    PD$PzOdPRL$Gd@_^][ Smt$GdPuQ PO_^][ _^]2[ P̃UVW}<   D$, D$P;B  ptFp xX+xTt!FuFuP}  v#E<j WjpP P$`  D$33ɉT$S   T$ @L$$L$(0t$0;ptTWS覵  x4 tD$ PWD$8PSt$0D$Ct$0@;puT$ L$$T$E<D$+  ;#  rt$jvh  pO f   >   |$0t
G>|$0FH0L$;t VSC;u|$0D$jj h  pO fuMt!GuGuPt$t$F;D$$tiD$Dl$ D$0 ^M<E`   t	ELPt:Gu0Gu PM<E`   t	ELPl$D$0|   \$$;t2 wt!FuFuP;uыL$(*+@   rm#+Ńw.QU腽D$0[_^] _^] _^2] ̃SUVWU<T$%  D$(@L$D$ ;;  qt$     j1h  rM f   >   |$(t
G>|$(FH0L$;tVSC;u|$(D$jj h  pL fuKt"GuGuPL$t$L$t$;L$ ttT$?M<E`   t	ELPt!Gu_KuP_^]2[ M<E`   tELP_^]2[ _^][ ̃S\$UVWh   \$tNF   F   3CD$$    SN蕼D$$PPFd0D$8j@PE<pJ fd  ft"M<E`   t	ELP 2D$,  D$$W  D$$;D$~h  hЗhD$0NdPjj(   G   G   tFD$$L$,OGGGG    G     Fht@FdGFhG G$    tFuFuPGG3   MdD$D$Pt$,|$zl$t!EuE EuE PL$,   G   G   P   D$,PD$PȃD$AD$D$Pt$,    A    Mdغ|$tGuGuP|$tGuGuPD$,L$,t,Fu#^KuRD$,_^][ _^][ ̃SV\$s|V  UW8C^tC]VT_]^[jx   ]E   jh,SE   E     C   C   C KC    C(    C,   j`C(Q   C,_   8HAXA hA0xA@APAQ KC8    CL   CH    C0C4    CP    Cd   C`    Ch    \$3{LE_O;tkG   +D$=   +@D$+;v
;D$BD$PωD$Q	L$UȉlWȉL$D$;tWPSQ(D$(W˃WPRQt$t$t$$V2i_]^[PVWw<t/PFPD ftO<G`   t	GLP_2^Íw|V	uVG]^_^P̃0(03ĉD$,SUl$@VWj~<ٿD$W2f|$DHL$f @    L$D$     D$       D$Pj j D$,Pt$ jwjC ftN<F`   t	FLP22QD$+D$PD$PD$,P0D$$|$8CD$$|$4u80100u
x4u2ۍL$$=E T$t-L$+ʃ   rR#+w!QR蚲L$<_^][300 ̋D$ftQ<A`   tALP~2  ̃8(03ĉD$4VD$D$    PjD$(    D$ WPD$PV<@jcPfD$,r)B ft+N<F`   t	FLP2^L$438 |$WuD$HPD$P诬W   D$8    fD$,D$fD$.D$fD$0D$ fD$2D$$D$4D$(PD$LD$,l PD$PL$HL$     @    D$NdPt$HD|$tGuGuP|$tGuwNuPL$<_^38 ̃S\$D$UVWPj D$    D$D$     Pj~<kUD$' wS@ fuD$Pj j j h  UwR@ ft#N<F`   t	FLP_^]2[ FdkTSt$$fD$fAt$_^][ ̃VW~<u
_2^ D$   SU=     o$n\$$D$Pj D$$D$    PjkD$$    UD$0 wB? ft#N<F`   t	FLP][_2^ D$Pj j j h  Uw? fuFdkTSt$$fD$fAt$][_^ t$$t$$N][_^ ~_ t$$t$$   ][_^ ~_ t$$t$$   ][_^ ~_ t$$t$$   :][_^ t$$t$$#][_^ t$$t$$-][_^ t$$t$$費][_^ t$$t$$O][_^ t$$t$$t][_^ t$$t$$j ][_^  nnntn=mmnm<n]nnn 				



D$2   =      q$qt$t$ t$t$ t$t$ t$t$ t$t$t$ t$t$ t$t$a t$t$ t$t$t$Њ  cquqqMqqqq)q;qqq 





































































































































	
	













































































		̊AT̋AdSX8[   u   D$ ̃SUVWK<L$   329l$    q8 fd   fuiCd3D$@ CdH+10D$~&3CdVU D8PtFT;t$|D$E;l$ s"L$zK<C`   t	CLP@2_^][ Cd_^]@[ ̃PSUVٍL$W\$0B-8PD$PDsd=~ tNՍ   Qjj hPD$(P,D$,u׋D$Q̉D$t$ PsdN*+NN+D$,10t$,VD$$ڍL$ P\$0ijj h$PD$$P,D$(u׋D$QL$$Q
̉D$t$ P~D$      SD$(PL$$t$$|$ Ջ؍L$HSD$4P<Vt$V0D$PؒL$H\$(3   UVD$HPD$<HdLT$8RP|$$08؍L$TSD$<P<VU0D$PؒL$Tt$Dt!FuFuP\$(Et$;f-8Ft$;t$,D$dL$_^][P ̃VD$D$    PjD$PD$4WjV<@PfD$$r4 ft N<F`   t	FLP2^ |$WumD$,PD$ PmL$HL$     @    D$NdPt$,[|$tGuGuP|$ vD$PD$0PD$PBD$~_ t@ |$tGNdSD$D$Pt$0|$\$tCuCuP[tGuwNuP_^ ̃$SUVWh   t$Ԯ؃tKC   C   3ۋF<h`  D$0    A    C`t@C\C`AD$8PK艣P     @    {`K\S`tGuGuP|$0tGuGuPC\T$L$<Rh `   APD$0jQD$(    p-2 ȋft%N<F`   t	FLPD$< L$<
  |$   D$<PD$(P诜L$,HL$0     @    D$,NdPt$<蝣t$0tFuFuPt$(tFuFuPD$<L$<f  D$D$ PQ4|$ D$u2>  s\C|$t$ VT$+щT$,;s      N+;vs0  Ѹ+;v
;BPΉD$ ϋD$,+Qj R蚺D$,P +RPVL$8t$WV+Wj t$$eD$(ǉF|$C `  ~
 `  |$|$ HP `  D$    f      `  L$Q;LVPD$Hj@PD$8p0 ȋfu9|$D$PQޡ|$ D$ ƉD$ t|$뜋K\*D$H<@`   wLP2   |$A+j(D$06tHt$,F   F        @    tCt$HKXN蝽3OdFD$$D$$Pt$<t$0t$(tFuFuPL$<t"CukMuRL$<_^][$ ̃VW|$(D$PjD$ D$D$    PjV<GPr]- ft!N<F`   t	FLP1_2^ |$uuD$(PD$PL$HL$     @    D$NdPt$(ܞ|$tGuGuP|$   ij\Ѓt0B   B   `L$ɉzBBB3ҋNdBD$D$Pt$(T$F|$t!GuwNuP_^ U4șD$SVWPjD$,    D$0D$0PEV<@jPr+ ft"N<F`   t	FLPT2_^[] |$$unEPD$<PL$0HL$4     @    D$0NdPu |$4tGuGuP|$<*  D$($mD$0\$8T$8f.ПD   f/rzȎf/rl轵D$8D$8PET$@PD$8P~_ tD$0@ D$0PL$<XNdD$8Pu2L$8L$0_^[] D$(PEPD$@PHD$D~_ t@ |$<tGNdD$0D$0Pu|$<͛\$4tCuCuPtGuwNuP_^[] ̃S\$$D$WPjD$    D$D$    PjW<CPr( ft!O<G`   t	GLP_2[ |$VupD$,PD$ PJL$HL$     @    D$OdPt$,8t$tFuFuPt$    j(轣t/F   F   LD$^FFF V$3_ Ft@ tFOdD$D$Pt$,t$ 薙\$tCuCuPtFu~OuP^_[ U8(03ĉD$4VWD$$D$$    PjD$0PEjN<@Pq& ft,N<F`   t	FLPx2_^L$43葯] |$$   EPD$P'L$PT$     @    D$NdPu|$tGuGuP|$  G  wNr  P_^L$43ڮ] D$(P\$D$Q$9D$ \$L$f.ȟD   衰D$D$PET$PD$ PpL$$~_ tA D$t@D$D$PuL$Nd|$t!GuwNuPL$ʥ_^L$43] D$PEPD$PL$~_ tA D$t@D$D$PuL$ Nd聖|$t!GuwNuPL$кL$<_^3o] ̃((03ĉD$$VD$D$    PjD$ PD$@jV<@Prj# ft+N<F`   t	FLP>2^L$$3X( |$WuD$8PD$PD$PD$<PD$PL$HL$     @    D$NdPt$8Ŕ|$tGuGuP|$tGuwNuPL$,_^3蕫( ̃SUVWD$@<h   D$(譝tNF   F   3^8tC^8F4D$  j[tUjE   E   E E    E    E    !EWEE @    E3ED$tCuCuP\$^4^8n8tCuCuPD$    D$PF4j0D$@jc@PD$8p  f   D$H<@`   t	LP2  \$gfffK+]Kgfff+jD$ 	K+ʉD$QRPtFK+ȸgfff   rP#+  QPpL$D$CAC|$uqD$4PD$ P蘊L$$HL$(L$     @    D$$Pt$4Id肑\$(tCuCuP\$    j0
؃txC   KC   n$tE D$4AAЉF4t	0݂FDt	j 0t#E uFuP3ۋL$CD$$D$$Pt$4Id\$0訐\$(tCuCuPtFu~OuR_^][ ĩy] uIdtt$D$ $D$PL$D$L$ ̋D$H;Au3VpWtFp xX+xTt#SFu^KuR[_^SYT8[   u   D$ ́   (03ĉ$   SUD$   VWD$$    fD$0L$DE<WD$D$0   D$4    D$8    D$<    D$@ `  D$D `  D$@L$H$   3t$0@P|$   tA$   t$8$   D$4L$8tFuFuPD$4$   C$   PD$4D$HPD$RjST$PD$@ pL $   u{$   PD$ PL$PT$     @    D$MdP$   t$  F  F  P  ftM<E`   t	ELP2  D$D$ PQy|$ D$u2  $   D$,yD$D$   3ҋL$4t$0D$(@PTt$(L$8M$   D$D;~	+$   3ҋ\$4t$0|$ AT$<   D$@$   ;QLƉD$HD$4P$  Rj@PD$(p 3ҋD$$@D$$9$   }_L$4@D$Dq+1$   t$0D$(@Pt$(L$8L$4pT$<I+ȃ+Qj RID$Dt$0L$<AD$<Ãf~D$PS|$ }t$   T$<\$4|$, t2s+Nf<A AuȍRHf: t;sQ\$4C+j(D$f   F   F   \$8tC\$8L$4S$   FD$FFFF    F     t0Nǉ^ F$    u)CuPN^ F$    3MdFD$D$P$   t$(t$ tFuFuPL$Ht$8tFu~OuR$   _^][3褠    SUVt$Wo<f   |$  tD$j0u> u f   jpw|Vk   _]V~t_<tɝPCP ft O<G`   uGLPgVuDVG]`~I|$t!Gu_KuR_f^][ PQSVWw<t[Gdj Pjv j jv Odfdu_^A[YÃA ftO<G`   t	GLP{_^2[YËGd3H+10D$   U3    GdPD)\)   =   wg@$VRXVRhMVRABVRQ7VSR荦+VRz VRVR
VSRՋ؄tFT;t$^]_^[Y2]_^[YfØΘ٘ 





































































































































	
	













































































		̃VW~N;t2L$    G    At@AGF_^ S+   +ʍCD$+U;v,
C;BUT$ȍىL$    C    Bt@BCV;tVQWPoVKVQRP[Ut$t$][_^ vSVW|$~B^<jWj s ftN<F`   t	FLP9_^3[ jWj su _^   [ ̃WG<  L$D$    QjL$D$    Qh'  p ft"O<G`     GLP_ S\$,VsdtFsd[`UxtFuFuP{ tWD$SP6D$(L$+PQh  t$8t$ g PL$u̮]^[_ 轮j貊D$t+F   F    F    F    F    3t$D$4~   |$t$  9X8|]l$0t$4fD  E OU ;Ot(    A    Bt@BAG	RQC;X8~t$L$8A;At(T$,@    @    tFxpAT$RT$0RPtFunMuP]^[_ ̃@(03ĉD$<SUWj \$݈t6     @    @    @    @@    @    @    3D$KdVD$Pft$tN辪Ixj V3|CdL$4j @CTvD$D      D$H   jx|$8l$4~fGOfGG ȗėfD$$D$ D$0   \$ D$& D$ԇt|j hhj j Wt$(NF   F   L$FD$D$Pt$ILFu~OuP|$4l$0\$!L$D$PD$   D$    IL^r'MÁ   r[#+ÃwLQSzL$Dr%Aǁ   r#+ǃwQWzL$H_][33@̃H(03ĉD$DS\$PUVWh   D$     h   j P   D$(t$0L$(D$ l$pt$E+D$    j PG<VQjUp
 ft"O<G`   *  GLPʿ2  D$PD$PD$,PVK P4T$8r-L$$B   rI#+~  RQxif9C  h   D$,    h   j P   D$4t$<*D$4L$$t$(+D$    j QVPG<h  Up,	 ftTO<G`   t	GLPT$$t1L$,+ʃ   rR#+   QR*x2aD$PD$(PD$DP8K<PL$<eT$$t-L$,+ʃ   rR#+w]QRwT$t-L$ +ʃ   rR#+w+QRwL$T_^][3&H 	̃4(03ĉD$0SًL$<L$C<D$u2[L$0394 CdUkTVWD$   yh  (D$    蛂h  j P  D$$t$,L$$E:t$+PE8PEPEPD$ PD$4VQWp ftK<C`   t	CLPx2MD$PD$PD$0PD$4;t|$<t$8CD$,Pt$$U藧L$(T$_^]t-L$+ʃ   rR#+wQRpuL$4[3	4 ̃$L$,$SU@tV@ ȉL$qdt$tFqdt$A`3D$9l$4d  WD  @p <DD$AT<u`j軀ȃt(D$<A   A   AAAȖ3ɍAL$0D$,D$,PD$UHdvt$0   j([t2D$<FD$F   F   8FF~ F$3L$Fy_ t@ D$$    D$(    tFIdD$$D$$PUt$0 v|$(tGuGuPtFuFuPL$ED$ ;l$8t$_tFu^KuP^][$ ̃(SUVL$@Wt$Ft@ ȉD$$xd|$tGxd|$H`3L$ 9l$<  l$@T<D$   j`~ȃt(D$DA   A   AAAȖ3ɍAL$4NdD$0D$0PUUtt$4  F  F   P   j(}tfD$NF   F   0t$     @    tGT$0t$TxjD$(    D$,    FF3   L$D$(D$(PUIdt$4s|$,tGuGuPtFuFuP|$D$@ED$t$D$$;l$<atGu_KuP_^][( ̃ D$SU@tVt$4W@ hdl$tEhdl$H`3L$$9|$4  fD  ET<uYj{ȃt$A   A   qAAȖ3ɍAL$ D$D$PD$WHdqt$ nAPj D$V{ȃt/|$ A   A   `qAAA3ɍAL$,D$(D$(PD$WHd@qt$,tFuFuPt$8GL$$;|$4l$t EuE ]KuE P_^][  UtSVWM|$4Gt@ ȉT$@JdL$<tAJdL$<B`3D$Dt$89uJ  @  BTD$p<   jyȃt'EA   A   AAAȖ3ɍAL$\OdD$XD$XPVot$\  F  F  P  $D$x\$xL$xf.ȟD   f/r}Ȏf/rohD$`D$`PET$hPD$pP7D$t_ t@ t$lD$H    D$L    tFOdD$HD$HPt$<t$Tn|$L   j(uxt2D$pEF   F   tFFFܖF 3_ Ft@ D$P    D$T    tFOdD$PD$PPt$<t$\;n|$TtGuGuPtFuFuP|$4t$8T$@FD$Dt$8;uL$<tAuL$<YKuP_^[] ̃(L$0$SU@tV@ ȉL$qdt$tFqdt$A`3ۃD$9\$8[  WD  @ <؋AT<u`jCvȃt(D$@A   A   AAAȖ3ɍAL$,D$(D$(PD$SHd4lt$,   j(ut1D$@FǙF   F   LFFF V$3L$Fy_ t@ D$     D$$    tFIdD$ D$ PSt$,k|$$tGuGuPtFuFuPL$CD$;\$<t$_tFunMuP^][( ̃(SUVWL$D|$Gt@ ȉL$$qdt$tFqdt$A`3D$9l$<  @ AT   jsȃt(D$DA   A   AAAȖ3ɍAL$4OdD$0D$0PUit$4y  Fl  FY  PM  T$@j(J;BD$$L$Qs   D$F   F   x\tGx\PXOD$DFD$ FFFF    F     tD$V~ F$D$V~ F$tuGuPD$(    D$,    F|$F3   OdD$(D$(PUt$4h|$,tGuGuPtFuFuP|$L$$E;l$<
t$tFu^KuP_^][( ̃<(03ĉD$8T$DSUVT$Wt$Ft@ ЉD$$hdl$tEhdl$@`3D$(9|$P_  l$3҉T$@0D$$ʋ@T<uVjpt$@   @    h@@Ȗ3HD$ D$L$NdPWft$    WD$D    D$4D$4l    fD$8fD$:AfD$<AfD$>Aj0D$D"pt0NF   D$4F   P$iAЉX3L$FD$,D$,PWIdt$8ft$0tFuFuPT$Gt$D$(T$;|$Pl$t EuE ]KuE PL$H_^][3|< ̃8(03ĉD$4T$@SUVT$Wt$Ft@ ЉT$$jdl$tEjdl$B`3D$(9|$L$  l$3ɉL$@8 BTD$4<uUj8nȃt$A   A   iAAȖ3ɍAL$ NdD$D$PW1dt$ ej0mt2NF   j D$8F   P$iAЉß3L$FD$,D$,PWIdt$8ct$0tFuFuPL$Gt$T$$D$(L$;|$Ll$t EuE ]KuE PL$D_^][3wz8 ̃<(03ĉD$8T$DSUVT$Wt$Ft@ ЉT$$jdl$tEjdl$B`3D$(9|$P*  l$3ɉL$@( D$4DD$DBT<uUj lȃt$A   A   iAAȖ3ɍAL$ NdD$D$PWat$ cj0kt0NF   D$4F   P$iAЉS3L$FD$,D$,PWIdt$8at$0tFuFuPL$Gt$T$$D$(L$;|$Pl$t EuE ]KuE PL$H_^][3Ax< QSUW|$UڋE +T$;sx_E][Y    M+V;vr   Ѹ+;v
;BP͉D$dϋ+Q^j QxM E+PQV茦t$WV'^_][Y +4?Vj RwD$ƉE^_][Y g̋Q<tALP聣2VWw|VeuD$VG_EV_^ P諞VWw|VeuD$VG^V_^ Pk̃SUVWo<   ]    j ht6     @    @    @    @@    @    @    3D$OdD$Pzt$tNhWj V[_^][ÍD$D$    PuR  ft!O<G`   t	GLP _^]2[ÍD$3PD$P褀OdPy\$tKnWj SX[GdD$H+10څ~ VVFt;|GdD$Pu  PSq_^][̋D$8SUV   EWKD    B    At@AA̉BT$\    A    Bt@BAL$ {TVL$"j Bft6     @    @    @    @@    @    @    3D$PKdD$PPwt$PtN$Uj VYCd@sLVv6AFD$ sLX8;tW3;uL$g_^][8 SUVW< i  wLVv6胄O4\$ FS~yl$XE @@+tx  tp$UI_^][ U  w|Vna  G^VD$QGT~Aw<jSj v  ftO<G`   tGLP苞jSj v  D$ XtCX|$ 0G`   tG<j jjp  F+PG<Qpj  |$ t,j     @    tCQω0Xȃ`u'y   fduA2kD$D$    PD$PsOOdPKuL$舄Gd@   ft>gD$D$    PD$P(OOdP uL$=Gd@2<fu&gUOljtGd@ 2UOl̠tjD$t.Ku"sNuPD$_^][ 2_^][ PD̃SUVWs<t$u2_^][ |$ K4WTvAD$t@AD$D$    @+PQv  f  D$Pv  f  j(^atEF   F   N    B    Gt@GBb3{xFCtsxtGuGuPD$PD$$P{dyPrt$ tNPj ViT33f;D$}VOD$F;|D$j j2jp
  Ktj2W*QCt3x7;t.pTpp@PEPD$(ph  fuVE;uҋCdD$ @C\C`   \$t!CukMuRD$ _^][ K<C`   t	CLP
D$  ̃Sك{< u	2[ UVsdWvNvFF{\    K<2L$   |$  D$        q  fd   futCd3D$@ CdH+10~-3fD  CdVt$ D8PtFT;|D$l$El$;l$ sFL$oK<C`   t	CLPk_^]2[ Cd_^]@[ }_^][ V~`uFd@2FTF`   ^W~<w  t)ct_FT ^d~\ FTtw  _^ËN<t	FLPydNd_^A2QVW|$D$Pj j j D$    jGPF<p3  ftN<F`   t	FLP_2^Y L$t2t*?t"tA=?  wWt$Q腌_^Y Wt$H_^Y ̋Iltt$ED$ $賔j D$PL$腏D$L$ ̋D$8 UW|$ uOSVwt$vߋ?st!FuFuPjSO t^[_] ̋	T$AB    Jx u)L$V19p}@3
B    Jx t^ VWj    F    Z @@f@|$F    F    tG|$D$F~t*SGu_KuP[_^ _^ ԙVWwt#SFu^KuP[pW
uj7M_^VWz t"Bx u;PuЋ@x t_^Ëy u    Ȁx t>_^D$Vԙth   VL^ ̅tjP̋Aj QSUl$VWL$l$ʓE }x u tL$y;    uuw9hux9.u>~+ՋD$9E u  tWeȃD$M +9Bu2 tΉJP{   Gπx uȋAx tՋD$JPWHE ;Mu quw>EAEH9huHE9(uHEQAEAU<  ;x-  !  ;   Ny uCANF Fx upFA;puHF;0uH1NNy    zuAx   AxuBA QECNFAFAV@^uy uDAF AAx upFA;puHF;puHqNy uQzu7xu/A v;hGKD$tIK_^][Y xuBA Q贔FAFV@eB̃T$Ul$@ D$U;u(hhE] |$ uj;Puh*;u(EՀx   SVWJzqY;   Fx    q;uEщBx uPFE ;Pup3;u
03p3F@@ H1FFx uHAFE ;HupN   A;HupN   0N   x uA@@@ P   ;u<ыȋAAx uPAE ;PuH;PuHQA@@ HqAx uHAFE ;HupA;u0pqBx yl$$_^[D$@@] ̋T$VrBx uPBF;Pupr^ B;u0r^ pr^ ̋D$y u@ ыȀx t̋T$V2FFx uPBF;PupVr^ B;PupVr^ 0Vr^ ̃S\$U   VWSD$PlD$tPp@@`   @<    @@    tFuFuPMSID$P-t$tFu~OuP_^][ ̋D$$SUVWyD$8     @    _^][$ PD$PkL$tD$8L$H_^][$ t$tFuFuPh   PtiG   G   ԙO    B    Et@Et$DEBxbwdOL$<Gt$t$ t$wd   3   D$D$L$<D$wD$L$ PD$,|$(P~ @fD$x uAL$;H|8tu_KuPD$8\$<x_^][$ }I$	tOu jpOL$\$<HPt$$Xt$$x0ppf@  u@D$8x_^][$ >̃SV13W3\$|$\$L$D$;tjU;|$ t7(;u/|$|$1GǃD$+ÃP+SW+PSL$ S|$L$#D$\$;uL$];tD$D$PĕL$;u\$t-L$+˃   r[#+ÃwQSA_^[w̃SD$Ul$VWCЉ\$z u/]     J;}R t;Lz tߋ\$ ux uM ;H} @x t3Ɖl$;tNHEy t$Hy u    ;AuIy tz uf
рy t;ul$t$;3u0 t*st$Vg[[F    _^][ ;tl$L$UVK؋st!NuFuPjS?t$$;uD$_^][ ̃Vt$D$WPD$P    F    貕L$y uD$;A|;tJQtBQ~AVt-SGu_KuR[_^ _^ ̃D$$SUVhXW|$8l$tG|$8D$4D$D$D$PD$$|$ P֔~ @fD$x u,;h|'tgGuWwNuIP@{I$	tR3jWJL$HPt$ht$x0ppf@  `;|$8D$0L$4x_^][ 9VWt$t$Ot$   PFt$$8u3VP   D$   _^ VW   tP(Ǉ          t#SFu^KuP[_^zWV   tP(ǆ       W   t#SGu_KuP[VD$_th   V"<^ V8   ^u	D$ 1PL$        B       t@      BIp0Vqt%WFu~Ou	_^`_^VW~t#SGu_KuP[D$tjlV:_^ UW|$ uOSVwt$Hߋ?st!FuFuPjSO: t^[_] ̋	T$AB    Jx u)L$V19ps@3
B    Jx t^ Vj    F    Ej @@f@FPF    Me^VFPTpV`Gj6L9^VWz t"Bx u;PuЋ@x t_^Ëy u    Ȁx t>_^QSUl$VWL$l$WE }x u tL$y;    uuw9hux9.u>~+ՋD$9E u  tWeȃD$M +9Bu2 tΉJP{   Gπx uȋAx tՋD$JPWHE ;Mu quw>EAEH9huHE9(uHEQAEAU<  ;x-  !  ;   Ny uCANF Fx upFA;puHF;0uH1NNy    zuAx   AxuBA Qi9NFAFAV@35uy uDAF AAx upFA;puHF;puHqNy uQzu7xu/A v;hGKD$tIK_^][Y xuBA Q4FAFV@8̃T$Ul$@ D$U;u(hhE] |$ uj;Puh*;u(EՀx   SVWJzqY;   Fx    q;uEщBx uPFE ;Pup3;u
03p3F@@ H1FFx uHAFE ;HupN   A;HupN   0N   x uA@@@ P   ;u<ыȋAAx uPAE ;PuH;PuHQA@@ HqAx uHAFE ;HupA;u0pqBx yl$$_^[D$@@] ̋T$VrBx uPBF;Pupr^ B;u0r^ pr^ ̋D$y u@ ыȀx t̋T$V2FFx uPBF;PupVr^ B;PupVr^ 0Vr^ ̃ UVuV:E  D$,EMSHD$0\$4@D$D$tC\$4D$0͉D$D$D$WPD$(\$$P@H~ fD$y u.D$;Ar%tmCudCuUPL}I$	   } j6=L$HL$HPt$ Xt$ 8xxf@  u:D$4h6\ h3A @D$<PTP<V*t$LtFu~OuR_[^]  PFr2,VWwV8uD$P9;V@)_^ Pq̃SD$Ul$VWCЉ\$z u/]     J;sR t;Bz tߋ\$ ux uM ;Hs @x t3Ɖl$;tNHEy t$Hy u    ;AuIy tz uf
рy t;ul$t$;3u0 t*st$V<[[F    _^][ ;tl$L$MV=؋st!NuFuPjSJ.t$$;uD$_^][     8   D$ ̋Qxu2   PeVt$t$t$c^ V^?D$th   V'-^ ̃UVMpqtFq	D$SW   Pu[P     @    ]|MxU|tCuCuP\$tCuCuPtFu~OuPMx_[u^2]Ë      @P~dMxVh^]Vt$t$t$a@^ V=D$th   V+^ t$Ixj,D$ ̃UVMpqtFq	D$SW   PYP     @    ]|MxU|tCuCuP\$tCuCuPtFu~OuPMx_[u^2]Ë      @PbMx   PVp3^]̃S\$Ul$ME Eu+VW@|$t |t|;v+ WfD$|$t$SL$V|$ u
     AD%  @ti|et_ @L@L$L8A 8 t!Q0~HI BD$D$PRtu|uAj Ut$(L8@$;uJuF|gta@L8T@T$A 8 t*i0E ~ HE I BD$    PRt|u3ɋ@D     D$    j QHt$@|0 u%D0tL08P4uj jH苁_IL18^tR][̋L$ 0  u   ËT$D$|uuø   ̋L$ 0  u   ËT$D$|uuø   ̸ 0̊D$̋D$P@uV+WjxWCttWt$Vn_^f̃LSUVW3ۍL$S\$x=Q-Pu1WL$x9QuQ@QQL$F=QL$`I;ysA4   38Ytpc;xs@4   tL$F_^][Lj(2tJD$`HtAu
APL$,YYD$^P.q    F3t	L$(+VC0R5PL$F_^][L̃<SUVW3ۍL$S\$fw=P-Pu1WL$Lw9PuQ@QPL$lE=PL$PI;ysA4   38Yta;xs@4   tL$E_^][<j0t6D$PHtAu
APL$W^    3t	L$h*V.R5PL$D_^][<́   SUV$   L$W3ۉt$S\$u=P-Pu1WL$u9PuQ@QPL$C=PN;ysA4.  38YtV`;xs@4  t  j/   L$ItAu
APL$ IV^\D$PP31$   ^P^^1jj?   jjFj?ȃ   fjjfAN@?ȃte   ANfF.,3t	L$V(V,R5PL$B_^][Ę   sni̃|$  VWt0xFF(    FH    FL    FP    F PSj@THAD1F    F    xG0    G    G    G  G   G    G     G$    G(    G,    G    ,؃tj]C3ۋD$(_0G8G<    [ˉ\$PD$P?ȋj B ЈD$,tRtjD$,8 G@[uGOG#u=F_@DdFHAD1@tHAD1^ tԚDD$jPOL$PVEt&2S\$W    G    G   wD$SPW_L9; _[ wPUVv
   ;BEPKL$SQV_o8 7^]_[ ASVWt$t$/L$(ǆ       ǆ       At@   A      ǆ       ǆ       ǆ       @j(   )tOG   G   GN3   G      t!Cu{OuP_^[ Vj co3F    fFFfF F$F(F,F0D$F F    F F    tPV(o^ h~)̃L(03ĉD$HS\$\UVW{krs"t$dl$ D$$   \$`D$tR@L$;GFPȍEPSQL$Oc\$lt$$t$dl$ jhhL$-L$(SQP|$<D$(t$8CD$,L$P-T$<r-L$(B   rI#+   RQL$T$$D$@~D$ f~L$@CfD$PGr%B   rI#+w:RQ3L$`ǋT$dOL$XhW_^][34L PP̃(03ĉD$T$ D$$SUVXD$    W8D$     D$$   ifAu+QRL$3D$PSW-T$$r)L$B   rI#+w'RQ L$(_^][33 sÕS\$VWBL8tPB| 4t2G_^[ v<   ;   U@l08tyVL$~E|$ tE P4uj jH<rt$@|0 u)D0t"L08P4uj jHrt$@L08tP]@| G_^[ G_^[ QКsY̋A@DtAPBD
܍QB@DdBHADB@DTBHAD̋A@DTAPBD
̋A@DdAPBD
Vq4t#NtPtjjV3^VF<؛tGF t	F0
F,NF +Ё   rH#+wRPF     F     F,     F     F      F0     f<F8    v4t#NtPtjjV]^KVFN@D0 FPBD2,F@D0tFHAD1F@D0dFHAD1F@D0TFHAD1^VF~
vB
yv.HvB^Vv\KBvCBv;B^SVW(   tFuFuP   tFu~OuP_^[//VVkF,t	PsAF,    F$t	P\AF$    Ft	PEAF    Ft	P.AF    Ft	PAF    Ft	P AF    ^P4  QКnỸPSUD$    VSL$$3l?|$$ V  @D0p΋PUL$ ie-PPD$u1UL$Le9-PuQ@QPL$l3-PW;nsF<   3~ tO;hs
@<umD$tajt(FuFPL$0EG        D$3t	L$,WP=PL$ 2Ptjt$d7D$ PD@PRD$$r8t$(PV 3   |$ _Ej UHjt$ @|0 u%D0tL08P4uj jHj@L08tP^][P ̋Vqh@D0 FHAD1N'FV@D0tFHAD1F@D0dFHAD1F@D0TFHAD1Кk^+IZ+I?+IM+I%3VVКkD$tjHV^ VFW~V@D0tPBD2܋F@D0dFHAD1F@D0TFHAD1КjD$tjhWL_^ ̋AVqQ@DTPBD
КjD$tj`V^ ̋AVqQ@DdPBD
К6jD$tjPV^ VW~4t#OtPtjjW0D$tj8V_^ V$D$tjDV^ VqD$th   V^ VF~
v:
yv^@v:D$tjVZ^ D$VtjV^ Vv\;:v3:v+:D$tjV^ SVW(   tGuGuP   tGu_KuP'D$th   V)_^[ D$VtjV^ D$VtjV^ D$VtjVy^ D$VtjVI^ VVКfD$tj8V^ D$VtjV
^ t$IxD$ ̃UVMpqtFq	D$SW   P9P     @    ]|MxU|tCuCuP\$tCuCuPtFu~OuPMx_[u^2]Ë      @PBMx@PMx   PV^]j j j j j 6)j j j j j )̋T$Vt$%F t +@t #@L$f .*t@ʁ 0  t6    t6 0  uA@ ^Á   ME   @ ^Á    uf@ ^Á 0  ua@ ^Á   Me   @ ^̃T(03ĉD$PD$\SUl$xV$   D$(D$tD$WtM +t-u   3ۋ@% 0  = 0  tt"Cx;w<+0uL+xtXuRU_D$(.   fD$  D$D$PU9D$@0HL$(L$PD$P&L$,D$tPȅtjj VL$8H(|$DD$0L$CD$0P.PURL$A0HL$PD$P[L$tPȅtjE L$HQPE ͋@ЈD$;tE ͋@Ѓ|$DȍD$0CD$0;8D|$ t$H|$\Ct$H<t2l$~*ȋ+;sU+L$4jWeM~ FO<uҋl$|$@}$ u |t;v+3E%  @   =   t^V$   D$(t$|t$|Pt$|p3|$\SHD$LCD$LPQRD$H$   P$   $   X0   |$DD$0SCD$4Pt$|D$,t$|Pt$|*V$   @P$   D$DQP$   $   03)|$DD$0SCD$4Pt$|D$,t$|Pt$|PD$0|$DL$pCD$0+WÉT$x\$lPRQD$0PSV$   t$L@PQVS$   $   E     E$    D$   0r)L$HB   rI#+wfRQT$DD$X    D$\   D$H r)L$0B   rI#+wRQCL$`_^][3T9̋A8 tA, 3̃H(03ĉD$DD$PL$dSUl$dVW|$xD$ L$t<+t<-u   3ۋE%   =   uC;w<0uLxtXu؋E0pΉt$PD$P	"D$tPȅtjj WL$,t#|$8D$$L$CD$$t$P9PQRE0HL$PD$PWL$ t$tPȅtjL$<QP|$Pt$<Ct$<<tQ~ML$@ЈD$<t8    ~-ȋ+;s"t$+L$(jWH~ FO<uσ}$ |$4u |t;v+3E%  @   =   t[Vt$tD$t$pt$pPt$p3|$PSHD$@CD$@PQRD$8$   P$   $   0   |$8D$$SCD$(Pt$pD$t$pPt$poV$   @P$   D$4QP$   $   !03)|$8D$$SCD$(Pt$pD$t$pPt$pPD$$|$8L$dCD$$+WÉT$l\$`PRQD$ PS V$   t$@@PQVS$   $   E     E$    $   0r)L$<B   rI#+wfRQT$8D$L    D$P   D$< r)L$$B   rI#+wRQL$T_^][3H5  ̋A 8 tA0 3Vt$W|$ tXS\$ tCF L$$8 t!V0~HN BD$$PRt$uD$Cu[D$L$_p^Vt$W|$ tMS\$ t9F 8 tN0~HN BPRt$uD$u[D$L$_p^  hJSVt$񋎨   @ ؄u   1q"^[ ̋L$D$   rP#+wQP %2̋D$T$H ̊A̋QVt$Wy    F    F   Au+QRX_^ ̋QVt$Wy    F    F   Au+QR_^ ̊D$ ̋T$L$+QRt$BD$ ̃L(03ĉD$HD$SUVt$hٽ+   D$%W|$`Nу E    D$l$D$Et #@ l      uo   tdр Xt$tH@ D$PD$ j@PV?PD$,P$   V$   $   WS`!$   0_^][33L ̃L(03ĉD$HD$SUVt$hٽ+   D$%W|$`Nу E    D$l$D$Et #@ l      uo   tuр Xt$tH@ D$PD$ j@P6>PD$,P$   V$   $   WS@ $   0_^][3L ̃8(03ĉD$4D$<D$D$HL$VWH 0  D$D$    D$,    D$0    0  u|$w   Px|
tuupd3       uSL$X(Tf/v9D$P$ED$3+iȗu  j F2PL$$/|$0t$D$XD$4Ct$$W|$ wj Pt$0(Pt$<V<|$HL$4t$(CL$4PQt$tWt$tt$tVt$LT$h8r)L$B   rI#+wRQL$<_^3(8 -̃8(03ĉD$4D$<D$D$HL$VWH 0  D$D$    D$,    D$0    0  u|$w   Px|
tuupd3       uSL$X(Tf/v9D$P$fCD$3+iȗu  j F2PL$$-|$0t$D$XD$4Ct$$W|$ wjLPt$0&Pt$<V`:|$HL$4t$(CL$4PQt$tWt$tt$tVt$LT$h8r)L$B   rI#+wRQpL$<_^38 *̃D(03ĉD$@D$\S\$LVt$\WPh`D$j@PC9PD$ Pt$|Vt$|t$|SWVL$|0_^[3-D ̃L(03ĉD$HD$SUVt$hٽ+   D$%W|$`Nу E    D$l$D$Et #@f I6   @4   uo   tdр Xt$xHt$x@ D$PD$$j@PL8PD$0P$   V$   $   WSV$   4_^][3)L ̃L(03ĉD$HD$SUVt$hٽ+   D$%W|$`Nу E    D$l$D$Et #@f I6   @4   uo   tuр Xt$xHt$x@ D$PD$$j@P7PD$0P$   V$   $   WS&$   4_^][3L ̃D(03ĉD$@D$XSUl$PW|$`\$D$G @  uD$hPt$Wt$ht$hUR$O  G0VHL$PD$PFL$ tRtj|$l L$8QtPP$ D$8w D$ ~D$HfD$0D$0|t;v+3G%  @t,Vt$D$ t$ht$hPS3PL$\T$`T$`L$\t$0|$8D$$\$$CPRQD$(Pt$(oVt$,@PQUt$@$   $   G     G$    D$d0^r'HÁ   r[#+Ãw QSgL$L_][3	D %̊A̍APD$P Vt$W|$;tSYSPF;u[_^ ̍APD$P& Vt$W|$;tSYSPp&F;u[_^ ̋QVt$Wy    F    F   Au+QR_^ ̊D$ ̋T$L$+QRt$5D$ ̋AVt$V;Bu;D$u^ 2^ ̋T$Vt$RPt$HVI;Ju ;u	^ 2^  ̃SVt$W_;  WUl$(+ÉT$;w=+Gǃr+\$$CSV.P6D$8UPV]_^[ +;)  +v'D$(+D$(;vD$(;BȍAL$(P+D$O+ދL$(COL$,L$,0L$(̓|$\$L$rk\$$7SVP!4Ut$<t$<Jt$0Pt$44L$4$A   rV#+FwaQVD$$]_^[ VWP3Ut$<t$<S>Pt$43D$@$]_^[ Bx!̋D$L$@ 0̋D$Vt$uSj     F    F   0F   F    HH@ ^ WP(    F    F   yAu+QRT_^ ̸̃ QSVWG<-  |$u	_^3[Y G G0t&;s"JW D$2N
KO8_^[Y G +ۉD$#ك s    ?s4   UO@VSt$UM1G+JO8+ʉ(΋G t$G0G<tG(G     G,(GW8G++щ(GG,G<]tSVO@HG<G<G0O _^[BD$Y _^[Y ́   SUVٍL$W\$ -   h]} ;t6@ wt!FuFuP;uы} }D$\j PL$LD$L$D$\0Ǆ$       Ǆ$       Ǆ$       Ǆ$       Ǆ$   PD$Dj@DH D$HHADDD$`ctj^%F3$   D$d$   D$lD$hD$pD$tD$|D$x$   $   $   $   $   $   hh@D$l    PD$`Ǆ$       h<PǄ$       D$t    Ǆ$       Ǆ$       D$p؛Ǆ$       Ǆ$       +PPD$DL$PD$P98jj hĕӋ5,PD$$P֋D$(-uՋD$Qjj h@PD$$P֋D$(uՋD$Q̉D$t$ P	jPD$0P0ӋL$4W D$,ϋ=<P׋0D$4PL$40$L$4uQjj hL0PD$$P,D$(uՋD$Q̉D$t$ P9	D$(D$$D$PӋӋL$    u31PL$D$0P00Ӌ؍L$4S D$$PjQ̍D$8P1<0D$8PHL$40$L$4L$DN_^]2[    ̃ ̋AV0t?A;0v8T$t:VtA<u$A, AtI	3^DЋ ^ ̃Ul$VNL$;wn~r6. ^] VS݉T$++;w)nr6D$ SPV [^] +;   Wvʸ+;v;BGPL$$L$$L$~nl$D$ <|$T$QrV>WP7*St$4t$$`D$0E     rO#+GwMUWD$(_[^] VP)St$4W D$ _[^] ̋D$W @@    @    f@ ̃SUVWF<FT$t3F t9N8sN8F\$<(F8D$+D$8|$ t`t   ǙZÃ<   tu   +ř1   u   +řWfD$ D$$|$ |$0D$4D$8D$9T$8wvr;wpT$D$8ttt[ttR/ttVT$+ЋF,t"tF N0F/+щ(F F0D$,L$88HD$, @_^W@    ]@    f@[ ̋D$W @@    @    f@  ̃S\$(UVW|$0|$(F\$,F<(l$t3F t9N8sN8FF8D$+T$;w}r;wwT$@tttdtt[l$t|$ tF)l$T$(F,T$@t#tF N0FL$+ՉF (F0D$$8XD$$ @_^W@    ]@    f@[  ̋ 3҃9Q8   ED$AAI#u VtԚDD$jPL$PV2^333VPu^ËF,N^B̃VWytEA, ;s_^ËA  t+A<u%q8;B;vq8+A,_0A^  _^̃S\$Uˉl$L$W|$ǉD$      V|Bt<;
|;sD$V@0t$$#+݋l$E,)0E0D$$l$͋E Pȃt%D$   ƉD$|wD$ L$^+_][ ̃S\$Uˉl$L$W|$ǉD$      VO|?t9;
|;sD$VPD$@ 0"+݋l$E0)0E 0$l$͋D$U  PRt   t$|uD$ L$^+_][ ̍D$Pj t$t$t$&#p0H̃ SUVWhĜt$<E     E    t$<EhԜt$HEU	ht$PEht$XEr8$Ejj hPD$ P,|$$u
|$t$8Ӌ؍L$ S D$P<W0D$ PL$ 0$L$ u8ӋL$ W D$P<0D$PpL$ 0$L$    DD$VPP     @    uM UtFuFuPt$tFu~OuP_^][  ̋D$8 SVWt$t$D$(   D$j(ǆ       ǆ       ǆ          :tOG   G   3   G      t!Cu{OuP_^[ VW   t#SGu_KuP[D$th   V_^ t$IxD$ ̋Qxu2Í   PSVt$񋎤   ؄u   1q^[ ́   SUVٍL$W\$$O   h]} ;t6@ wt!FuFuP;uы} }D$dj PL$TD$T$D$d0Ǆ$       Ǆ$       Ǆ$       Ǆ$       Ǆ$   PBD$Lj@DP D$PHADLD$htjF3$  D$l$   D$tD$pD$xD$|$   $   $   $   $   $   $   $  hh@D$t    PD$hǄ$       h<PǄ$       D$|    Ǆ$       Ǆ$       D$x؛Ǆ$       Ǆ$       T)PDP;D$LL$PD$PhĕD$$PL$<D$ L$D$D$,h@P! D$D$PD$PD$ P8jPD$4P0ӋL$<W -<D$0PՋ0D$8PL$<0$L$<uhLD$<t$PL$ D$D$PD$ PD$ P:D$$D$(D$PӋӋL$$   u31PL$D$8P00Ӌ؍L$<S D$(PjQ̍D$@P1Ջ0D$@PHL$<0$L$<L$L_^]2[    t$Ix D$ ̋Axu2   ̋D$8 ̃S8UVWL$PD$PDjj hPӋ-,PD$,PՋt$0=u׋t$L$D$ PIxx0Qĉ0D$t$Pkjj h`PD$,PՋt$0u׋t$D$ PD$Hx0Qĉ0D$t$Pt$(D$0   P%̋ jj hhPD$0PՋD$4u׋D$ Q̉D$t$P   D$4P̋ jj hxPD$0PՋD$4u׋D$ Q̉D$t$PzD$8L$_^][ ̃VWt$,=8PD$P0׋L$W D$P<0D$PL$0$L$uD$(_0^VNxu2^ËAdt@   tNxIdtI   ^Ã   ^S\$W|$;t2Vwt!FuFuP;u^_[Vt$W|$;t^ftOVvP*N+ȃ   rP#+w*QP#    F    F    ;u_^QUl$VT  N+L$N++SW;&  
;s     r'C#;   P   x#GtSz3D$L$ P+PϋPF׋;tA@ f         B    AB    A    ;uҋl$VRRt;VvPN+ȃ   rP#+w,QP>F;_[F^]Y <z̃SW|$ى\$UUU  K*+K+D$*UUUʋ+UV;N  
;s=UUU8  4@t$   r'F#;  P  h#EtVt3D$$L$ P+PIˍ    PuK;t8ًpP@    @         Ww;uҋ\$t$SWW' tNSsQ K*;+@   rW#+Gw;QWmD$ +@    ŉC.^]_C[ 
̋D$Vt$t     F    uQVVm^ ̋D$Vt$t     F    F    uQVV^ hЇhЇ̃SUh+PVt$WxD$*F;s8O*+;vD$PVt$+VUG\$[l<D$+H+10;tDvW4UV,w/s-G+;vD$PQPt$+QUGT$ 2NȋBt	@2B1qAt!Fu~OuP_^][ V񸫪*V+VD$ʋT$    B    ;s%@FD$HtAH J^ ̃(SUVt$<WF   =   w6X$pXD$&D$D$D$D$8Pt$@DvPD$$P0ӋL$(W D$ P<0D$(PL$(0$L$(=uQjj h0Ӌ-,PD$,PՋD$0u׋D$Q̉D$D0D$Pt$Pƃ~rjj PPD$(PՋD$,u׋D$Qjj hPD$0PՋD$4u׋D$ Q̉D$D0D$Pv:Ӎ   fu   Qjj hPD$0PՋD$4u׋D$ t$@Q̉D$6PDjj t$PD$,PՋD$0u׋D$Qjj hĝPD$,PՋD$0u׋D$Q̉D$6Pt$P~4F r jj PPD$,PՋD$0u׋D$Qjj h̝PD$,PՋD$0u׋D$Q̉D$D0D$LPtif9Fuv<~r6jj VPD$PPՋD$Tu׋D$@Qjj h؝PD$0PՋD$4u׋D$ \$@Q̉D$D3P_^][(ËD$<_^][(ÐmUUwUYUcUU     ̃(SUVL$WfD$PL$ N|$L$ D$;tzPD$(PAϋ0Ē8؍L$,SD$(P<VU0D$PؒL$,D$TD$;D$ uD$<L$_^][( D$<8_^][( ̃ SUVW@D$,6j h \&RPL$ \$|s \&L$  \$  33҉l$m        ;  ;|  +j j SUu!PjdSUj jdRP+ȋu-j h  SUj h  RPs+ȋȹm  un  3;   ;s      |   j |$(t$ŃˉD$ jQPL$$u+Pjdt$t$j jdRPL$+ȋD$u7j h  t$t$j h  RPL$+ȋD$ȹm  un  3ҋ؉D$;N
;|$Bt$D$$l$|sl$SUE  ؞`WEfD$$J;|f;r`l$(\$$ +DL ;|;sl$$l$|r|$$ |$vh   hPh\$$|r|vh   hPhHt$4C\$ j h6 fFG|$$WSf.fFmj h6 RPfFO+ȋj h`  PQEj h`  WSfF3j h`  RP+ȋj h  PQj h  WSfF
|$,<   i  +i@B FoWfFG_fV^][  U8VuWfn\YD$@D$@$fn\$@T$@(\ YX(\T$8^D$@D$@$zD$8\$@\D$@D$8fn\Р^D$@D$@$:L$8fu\$@XL$@XEfnERP\XL$@L$H   tfvD$0XD$8D$8$_^] Vt$W|$j jWVu!PjdWVj jdRP+ȋu)j h  WVj h  RP+t_2^_^U4SVW}L$4MGD$(G
D$,GD$$fnЋT$0+\+ȉMYD$@D$@$1fn\$@T$@(\ YX(\T$8^D$@D$@$D$8\$@\D$@D$8fn\Р^D$@D$@$L$8w\$@XL$@XGfnÙ\XL$8L$@RPtvD$0XD$8D$8$ G\$8+D$8D$ YD$0D$$˙j +h  QVeD$4L$0XȿCD$8D$L$0T$$3ڋ3CΉD$  L$$ |$83ًL$ L$0D$(Xj h6 RPL$@hL$0E\j h`  RPL$@>L$0t$,\j h@B j t$(NL_F^[] U4S]VWL$4;fn\YD$8D$8$fn\$8T$8(\ YX(\T$8^D$(D$($PD$8\$(\D$(D$8fn\Р^D$(D$($L$8s\$(XL$(XCfnǙRP\XL$@L$0xtvD$0XD$ D$ $C\$0+D$0EYj @D$4ڋh  +ˋ]C
QVyKCL$04XL$0D$ T$3ڋ3CΉD$  L$ |$83ًL$ ]L$0j XCh6 RPL$@9L$0C\j h`  RPL$@L$0t$,\j h@B j Ns_F^[] ̋D$3ҹm  SUV03Wx          ;  +j 0xj US޺u!PjdUSj jdRP謿+ȋu-j h  USj h  RP脿+ȋȹm  un  D$3;	  ;w_^Ջ][Ã   |   f0xÃj ͉D$ jQPL$$u+Pjdt$t$j jdRPL$+ȋD$u7j h  t$t$j h  RP贾L$+ȋD$ȹm  un  3ҋ؉D$;D$M
;t$A|sD$0x_^Ջ][̃Ix$P$D$PXD$L$ ̃yx j 8Pt$\D$̃V8L$V D$P<D$$$0D$P`L$0$t$ L$^t$j t$8Pt$,D$̃D$S\$ˉL$Ul$   VWD$;   \$,D$.;      sFz         s
   2   s
       s
      ՍO+;|;F J?w`?OFL$ 9 u= w?;L9t$$t.L$T$.;ڋމ\$$AEL$+_^][Ë\$$L$_^+][̋D$W;D$D  SUV_HoL$\$;sEGǃr(D(    +Ń  uv
F$7˸+;v
F$;BN   r'A#;   P   X#CtQθ3ۃ|$EGwUrC7VSL$ D$A+D+    rV#+FwMQV<WSuD$+D+ D$HD$;D$ ^][_ 9̃fnL$fnD$ $$SUVW|$    F    F    or?s   _n^^][ ݸ;G؍CP諥MQWP)n^_^][ ̃dSUVWjLFj4F    F     F$   F(    F8    F<   fFH  FJ 藶  j L$DG    P3D$D    fD$XD$\fD$`D$dD$hD$lD$pD$@h̉PD$P D$T    D$X D$\    ]D$Py G@G~@ fG(@(G0D$LPzD$|t	PD$dD$l    t	PD$\D$d    t	PD$TD$\    t	PD$LD$T    t	PD$DD$L    t	PqL$@D$D    vF@    FD    ~؃Qu1PL$G=Q uQ@QQL$fQPWSC    C=ȉtit	PC    ȉG? uȉGWCt3WhȉP"vF@    FD    F    ؋N;tRtj^ˋPtPtj_FL    ^][dV8^VLN<r.F(M      rP#+w|QPŦ3F8    F<   fF(N$r(FA   rP#+w8QP聦F     F$   F NtPtj^D$Vtj4V^ VD$tjPVʥ^ ́  (03ĉ$  S8$   U$  V$  WǄ$       $   PL$4   D$PӋ<t$D$Pp0   <E   vhx  hhh   v+W莟$   uh{  hh$   j
j WPP$   $    L$0$   D$    D$(    D$,   qAu+QRL$ 觽L$H5|$,L$D$(CL$PQD$8PL$T=D$0PT$Dr3L$0U      rI#+   RQL$HT$,r)L$B   rI#+wZRQ诣$   $   D$(    D$,   D$ ;t	Q$  _^][3Ĕ  ̃S\$UVWOo+ŉL$;w2+Gǃr4(D$$SPV _^][ +;   4+;v+;v;BFP؜|$+OL$$w4(L$$D$t$ L$Ur\7VP.St$4t$4WD$,L$A     rV#+FwPQV諡D$ _^][ WPSt$4V   D$_^][ ̊L$A<	w0ÍA<w7ÍA<wW3̃S\$V3W3VL;G~݊K   ~Ʌ~
ufnfn_^[^$$23̋D$T$S\$Ul$$VD$ E 3W;   f     ;D$(      sF~            s
   2   s
       s
      +֍O;|MF3J?wS?OF3T$L$9 u= w,M fE 3E ;7_39t$^][ F_^]   [ QD$L$Sى\$Ul$  VWD$;   \$ D$";      sF{         s
   2   s
       s
      ՍO+;|<F@ J?w`?OFL$9 u= w?;K9t$$t.L$T$";ډt$$ލAEL$+_^][Y \$$L$_^+][Y ̸   ̋T$L$Ul$ Vt$W|$u ;D$   S    ;      s\$$3/   s˸   L$$L$(D$$   T$: uu эH+;|MM T$$E u t'<@ӋH?ʀu Fu |$ L$(;D$OT$[3;_^] ̋L$D$    ̃t(03ĉD$p$      D$xTVOD$W$   D$P|$D$@    L$<$Qt$<W\$ ~KD$ f.D{:D$D$YD$4PD$$$W\$ 9t$4|WG D$$D$hD$RPD$XP蚘D$`   L$`+  |$dD$P|$PQCD$8    D$   T$(D$8D$,;v;v
   ;BFPL$<L$`T$(D$,D$8Qt$T$Pt$T 0@P{D$8L$( D$dr+Hǁ   r#+ǃa  QWD$8D$P~D$HfD$`|$dt$PCt$P3> tr    Vtd,0<	w",A<w,a<w2Ɋ,0<	v,A<w,7,a<w,W2ȃL<hG> uOxT$$DhRBy$   W|$f/G$   D$ X,T$4;T$0D$0LȋD$dOr+T$PH   rR#+w QR赘L$x_^3Otػ/̃4(03ĉD$0T$<WD$8SD$   BTVW3\$8$"|$$|$4fD$<tB8tB(;JPBJP0+)BTUuB4(tB$0BD+L$t$]tQVL$,y\$8|$$D$$jCj P8PD$P,D$ u
D$PD$$P4t$T$8 r)L$$B   rI#+w RQ誖L$<_^[3A4 $Qjj t$8PD$P,D$ u
D$PD$P4D$ ̃h(03ĉD$dD$lSUVWD$4$   3ۋ$   3D$    G@|$(L$@L$D$\    D$l    D$p   t$D\$\$Tl$XD$88_HuXj jL$dX_L|$;|$ t  fD  |$pL$\D$l\$<CL$\SL$AL$,Pt$D$IPt$0Wt$PR\$ k  b  h  |$;|$   fD  L$;s1CD$TD$DCfX3fLX\$Tl$Xt$D\$   ˸+L$05  Y\$vϸ+;v;BEPL$HL$0D$$\$Tl$X	L$RrLVPED$ <}   L$$f3fHƁ   rv#+ƃ  WVL$HQPD$ L$f3fHt$$t$D|$G|$;|$   L$<|$;v  +ϋ+ÉL$;wCٍ	PD$ |$Ht$\$\CGP93f_\$Tl$Xt$D\$;  Ӹ+T$,;  
Ջ\$T$$vʸ+;v
;BEPL$H-ȉ\$TD$,L$0l$X D$|$$D$
D$YD$,Rr^VQt$$Wt$(D$D3ɃfD$$E   Ɓ   rv#+ƃ  QV2t$8t$DGD$HPQ_t$$Wt$(QD$Dt$03ɉt$Df|$l"  j jL$d|$L$(+D$@AL;|$ |$4D$DT$p~D$TfG   L$\U         I#+3     D$(xJ   |$4(P.r/,m   Ɓ   rv#+ƃ   UVT$pr3L$\U      rI#+   RQL$t_^][3yh D$(xJ tv|$4(P莅r+,m   Ɓ   rv#+ƃwUUV胐T$prL$\U      tI#+w_h\q̋	D$P<L$Q0D$ Vt$W3trS\$Vt`HЀ	w Hw,Hw,2JЀ	vJwJJwJ2ɃȈGCu[_^Ë_^̃0(03ĉD$,D$4L$8SUV3D$D$H3W   t$$l$4|$8D$L$|$ PT$;s"ED$4D$$Cƈ(D( t$$  +Ń  ]v
C$7ϸ+;v
C$9;B؍K   r+A#;r  P.f  x#Gt$$tQ
t$(3\$8E\$ D$4UrAVWD$C/D/    rF#+   SVrD$(PWD$/D/ L$t$$l$ŉL$l$t|$8l$4|$8|$$\$L$$CCt$4ˋ    +C    PC   D$ t$WVcT$8r)L$$B   rI#+w)RQ襋L$<_^][3;0ĮW̋L$SUVWjt+@   @    ܍@    @    @    3l$HWM E!] CD$+D$;sz      K+;vl   Ѹ+;v,
;BUӫϋD$+Qj FQ聤C+PRVUWVl$+4?|$Vj WM>Ct$ M jVP18PȒ_^][t$1t$\D$ j 8Pt$\D$ Q|$?vh  hhȈt$8PD$PdD$uD$$Y L$Y ̃SU-8VWjj hdPD$ P,|$$uӋ|$fnD$8^$PD$ PՋL$V D$8P<D$0$0D$P`L$0$L$t$0uӋt$Ջ؍L$SD$P<Vt$4W0D$DPL$D$,_0^][ ̃V8L$V D$P<W$0D$P`L$0$L$uD$ 0^ t$D$P'D$ ̋T$L$$8Pt$D$ t$D$P跙D$L$ Q1D$PDD$ jj t$8PD$P,D$uD$L$ L$ t$j t$8PD$P,D$ uD$L$ L$ 8   D$ QVW|$VT$;&  S^;  U   ϸ++;  v˸+;v;BEP nl$D$~MQrF>WPkC   rO#+G   SWD$ n][_^Y VP'D$$n][_^Y sDr?>BPWVNA   rW#+GwQW菃F   ][_^Y 详̃fnL$$.D$YD$$D$$D$$$D$ٺD$T$\D$f/xr؃D$$$?t$̃l(03ĉD$hVt$xL$W|$x2~rFPQD$PL$,?D$PwT$r/L$U      rI#+w&RQL$ L$p_^3ldS\$3UVW|$3    3C    C    ot   Uձm    Pj VʛC+PQVAt0K+ȃ   rP#+   QP	3nnKCo+;vt   +L$UFC+PQVt,K+ȃ   rP#+wTQP莀D$3FCnCrrO;tf@f_^]['ֵS\$V3W3NfT;G~_^[̃SUl$ L$VWD$    uD$    VD$    VL$fD$$<m    t$3ɋt֊RB;rtEPL$,t$|$     QG    G   Au+QV5t*L$+΁   rv#+ƃwQV~_^][ẼVjj t$8PD$ P,D$$u
D$PD$P4̋ D$P^ ̃h(03ĉD$dD$lT$pSUVD$03$   3yH WD$   A@L$(T$@T$D$\    D$l    D$p   t$Dl$T|$XD$8u0pD$8j jL$dT$(\$rL;\$s  @ |$pL$\D$lCL$\L$JT$<RPt$D$$Pt$,St$PR     i  \$;\$  L$;s*ED$TD$DCƈ(D( |$Xl$Tt$D3  ͸+L$-  ߍi\$ v
G$7Ӹ+;v
G$;BW   r+B#;  P胈  L$X#CtR_L$3ۍl$TD$AÉ|$X|$ D$$QrJVS6D$ L$D$$L$ A  Ɓ   rv#+ƃF  QV{D$HPSD$ L$D$$  t$D\$\$;\$t  \$<L$;H  ++;w4+D$TD$DCSQ4(V; |$Xl$Tt$D"  ͸+L$,;  ׍,T$$vʸ+;v
;BGPL$H~uT$,ȉL$0l$T|$X
D$ Ã|$$D$,RrVVQSt$$t$4D$DL$$A  Ɓ   rv#+ƃ  QVQzt$8t$DED$HPQ~St$$t$4pD$Dt$0t$D  |$l  j jL$d葵\$T$(+D$@BL;\$\$4D$DT$p~D$TfC   L$\B      I#+  wL$(yI    \$4APkr)GƁ   rv#+ƃ   WVMyT$pr-L$\B   rI#+   RQyL$t_^][3譒h L$(yI tf\$4APףr%GƁ   rv#+ƃwPWVxT$prL$\B   rI#+woh~M谛̋D$	    ̃T(03ĉD$PVt$`L$W|$`~rNHQPWL$L$ÞL$X_^36T̃l(03ĉD$hVt$xL$W|$x2~rFAPQD$PL$,wL$ OD$PWT$$r)L$B   rI#+wRQuL$p_^3肏lg̃|$u"D$hpպu
Pp 3 % p%p%p%p%p   %QRPh sZY%%% % $%$(%(,%,0u%04e%48U%8<E%<@5%@D%%DH%HL%LP%PT%TX%X\%\`%`d%dh%hl%lpu%pte%txU%x|E%|5%%%%%%%%%%%%%u%e%U%E%5%Ē%%ĒȒ%Ȓ̒%̒В%ВԒ%Ԓؒ%ؒܒ%ܒ%%%%u%e%U%E% 5% %%%%%%%% % $%$(%(,%,0u%04e%48U%8<E%<@5%@D%%DH%HL%LP%PT%TX%X\%\`%`%d%d%r%r%r%r%r%r%r%r%r%r%r%r%r%r%r%r%r%r%r%r%r%r%r%r%r%r%rUVuK^] ̃a a AUVu^] ̃a a UVFС  ` PEP2YY^] UQQEVEEEVС" b RPYY^ UEСa a A] Сa a UVu$T^] UQVuu讇T^ UVuݟd^] UQVuugd^ UVu薟D^] UQVuu D^ UVuOt^] UQVuuنt^ UVu^] UQVuu蒆^ UVuWV连FG_^] UQVuWV}mYP4w_^ UVu[^] UQVuu^ ̍AСP葶Y̍AСP|Y̍AСPgY̍AСPRY̍AСP=Y̍AСP(Y̍AСPY̍AСPY̍AСPY̍AСPԵYUVFСP蹵EYt
jVjYY^] UVFСP聵EYt
jVjYY^] UVFСPIEYt
jVjYY^] UVFСPEYt
jVRjYY^] UVFСPٴEYt
jVjYY^] UVFСP衴EYt
jViYY^] UVFСPiEYt
jViYY^] UVFСP1EYt
jVriYY^] UVFСPEYt
jV:iYY^] UEwp$]ø ]ø]ø]øh]ø]ø]øp]ø]øh]ø]ø`]ø]ø]øȨ]ø]Ë")07>ELSZahoUMthEPUM躝h8EPyUMuWahEPRUMu`bh<EP*UMurhEPUMu蚇hEPUMuьh|EPUMuˡhEP̸(ËAuܡ3W@0uVPV!]YQu^_UEVu#q}kPP蚙Y^] V& p^̃0yVPVpYQu^̋}kPP!mY3@0uVPVG\YQu^̃0yVPVYQu^hP贘YUMu]pEkPP艘Y]UEu]okPP[Y]UEk PP5lY]UEu]韊kPPlY]h(QYh(QkYUVW}3j,VW>~ۇG蓆H3Gt2S賟3f9s}֋L:3L:F   |[_^]UQEMV39ptfE   f;w+3@2UuRVpQjMQV0pt9utr *   ^U]
jUM$<uыM?3]3@]UQ} u3S]uE3f3  VW}U    G   tmH   uEP  YYȅ      U3F;usT$$<   ă?Fuۍ (=  vdMfv3FD:t9uujXTj[VuSuj	7pt33FVuVSj	7pu *   Ef3@_^[UMx3]Ê$<uEɃ3@]Ê$<uɃjEX]Ê$<u
Ƀj]UVu& F ՚^] UEEA] j
k{uF   }N3$VUGFGFGFGuGPQPWVEݶYYNV UQE3VhȉuNF   $VVVFQ^ UQEAM UE] UEA] ̋ V> t6脍Y& ^VWyp ֋tj1 _^VΣQ荞jV_YY5Qu^VV$訴~ Yt	vYf ^Wyt+Vp ֋tj1 ^_UE]USW}9;t>; t3qY# t*? VtF> u+FVYYtVWP=^_[] UVyEt
jV^YY^] UVEt
j V^YY^] ̋uA̃9 UQjjEYtQMH3Q̡Qj
:x3MV舰=QuuEVW[YYh̉OG?   *=Qp ֡QQ} tp ֍MX~RUQQSWj Mگ]{t@VCOEt, p M։Etj1 Mօu^sgYM}_[Uj j GYYuVuPN$} tuj YYuȉPN,^]UEx$ tp$j YY]j
}vj hYȉM3Etu-QUQj ihEYtuTW3U=Q uhQ̀YEQ]V> t6Y& ^̋uAj YQUj j|YYMA]UEW8t+Vp ֋tj1 ^_]UQj M藭hQŶ%Q YM{3AA UE ] UE] ̋ UuM]]      UE=   r	P_Y]ÅtPf3]UEE]UEE]UE]  UQVuEE uPFPVx+^UQVuEE uPFPVx+^UQVuEE uPFPVsx+^UE+EPE PuuE]UM;MtE 8tA;Mu]UQE uuuuwUE]jH8]EuE̊EEt:uFBuj VM؉u#z3@PE7EEEPrxYYMEE s3EBU323M׉u9um  ;t:tG;u}M}rM؀<1 tM؄tM1   ;:      uM   }uÈx uWU3Ɋ;:BW;EEu p M֋üEր~ uWEȊNMu p M֋u38Eu
UбM>UЃsjY}ErE؈0rjZM؄tM؈1UЉuMFu;ut'uűuEЋYMU~M(iE辱UU AB A]4   UQQS]VW;wVGQPSE褜NQʧMSQPE_wpuE r@P7QYY7_^[ WyUQQS]VW;wTGQPSENQ<SuEP_wuE r@P7QYY7_^[ xUUSVپWK+M;   C<VPWExNQ螦M}U{<Es}UQr/3VPJ}WuuroE8 E@PV\P SPuVuWGo7 E_^[ wUUSVپWK+M;   C<VPWE膚NQ謥M}{E<s}Qr/3VP_}WuuPE E@PVqO SP2uVuW%> E_^[ wUUSVپWK+M;rkC<VPWE衙NQǤ{}MEsuuuur3VPqeGPVNYYSP\eE_^[ BvUUSYVM+W;r|A<VPWENQE}ESx}pr$0VWəE;E@D; PVMPW觙E;D; M9_^[ }uUE ]UE]UE]UE]̰ðUE]UE]UE]UE]UE]UE]UE]UEE]UEE]UEE]UE]UE]UE]UUM	
]UE]UE]UE]UE]UUM;rʋ]UMU;|ʋ]UMU;rʋ]UE]UE]UE]jjj M5QQe uMPmXuCt;uEP<~YYt8}}WEZYp ։=QMp_Ejij M85QQe uAMPWuCt;uEPFYYt8}}WE9ZYp ։=QMpD)3AA̃! A ̃! 3fA̋j i& uf MF   D Ujhd    P(03PEd    ! a A   Md    YUQEAM UESVW]CEP衙{Yå_^[ UQEAMة UQEAM  j?guEFue u\6B ̃! Ë Ua a EA] UVus8^] ̃a a AP8UVu4H^] ̃a a ATHUQEAMd UQEAM UESVWx{p _^[] Ujhfd    PV(03PEd    jwFYMd    Y^    	cV> t61yY& ^Ã9 t16w  AСP[Y̍AСPFYUVNtuEu^] Uyr	E] Uyr	E] UQV> u$j My> uQ@QMk^V~ uJF^̋VSM^̋UVuW}WuVEuVPWe7 _^] UVuW}WuV覑uVuW藑7 _^] UEVuW}WPVd> _^] UVuW}WuV<> _^] US]VuW}WSVEuVPW6dEU+BR7QP$_^[] UVuW}WuV跐E>D> _^] UW}tVj0 ^_] U]~UEVt
jVIYY^] UEVt
jVHYY^] UVFСPaEYt
jVHYY^] UVFСP)EYt
jVjHYY^] UuuQx] UEM #P+w]} U]<TUhqu)] UMV;Mwu֋E+;w2;rE^]UA;Er] HUyrEA ] ̋ËËËËj8aa}3ۉ]tG9uCjqSYu!]tM蓞PMzCf 37tMTMjXD<j8`}3މ]tC97u?jRYEutMPM1zMCVP̈7tMLjX;j8``}3ۉ]tG9uCjpRYu!]tM蒝PMyCةf 37tMSLjXC;j8J_}3ۉ]tG9uCjQYu!]tMPM0yC f 37tMKjX:j<\_}3ۉ]tZ9uVjlQYu!]t1M莜PMxf C]SPE   \藏37tM<KjX,:UEVWP-EY_^ U,EVWPSYjEY_^ UIVu;qsAu3y t苁;ps@3^] ̸j|}]uMGU% 0  ]uMU= 0  uRWQSVu蠛W  w0M_e EP谘MYMu@EPq M֋EMw0E   EE E G_EEPbYMEEPhǪhq ֋}WnuC8CuBC:EuE +ˍpE { u
BC:EuE -׋uM330xFu9 ʚ;UUHU%  $}|EErEE <2  *  9UuUM)E3҉URjMȉUE   UEęuE3m   { uACPEEPZYY
s]ME9|EtEutFAuM}E}rEȀ<8tVEȄtE8GM܍UȋEȃrЀ<: tP} tJ{ u7ASM܋EU:Uu*j MrGCulM܋EȅtUȃrЀ<: ~ZGM܋EȋUtNUtDtUȃrЊ]::]u&uUȃrЊ]:]|UB: ~UEEr-AEM   rEPEPmEYYMQP@YY}W9l   8Cu3@M[K6:   d8]ˋ  FuB}Wku{ u?CPEPXYY
sDM9|EtEutFAMEBWktu<]E8 ʚ;   }    WYku6u{ uS?C:EuEN#BW)ktӉuuEyY0F@EO{ u?CPEP>WYY
s9M;|}FAMtEEAWjt} tB~}6 :t9u0O;xuE;xuE1}E2  WXj  8CuR>C:Et{ u
=>C:E   eF
AuE 3ju98Cu>C:Eu+{ u
=C:Eu-F@uiuA{ MMu
=MC:EuE@uitt0Furiu=8Cup=CPEPUYY
s}
FGE%@뵊E} uuuM bOEh   ]~}ME]xEw0EE]leWe EPyMYMt{EPq tw0ME   WEEPZYMEzEPh	hq ֋}ˋxWE fu?8Cu:C:Eu +{ u
m:C:Eu -ˍp:=3f0xEWˉ|EE'fu]8Cu%:C:EuI<W fu28Cu9C:Et{ u
9C:Eu	<El39 ʚ;H%  $}pEErEE <T  L  } u3Et脂E3EPjMEE   EEuE36e   { u/9CPEEPVHYYsXME9pEutFA|M}E}rE<8tVEtE8GM̍UErЀ<: tP} tJ{ u8SM̋EU:Uu*j M9jGV;uZd$M̋EtUrЀ<: ~_GM̋EUtStLt]]rE]:;]u*u]]rE]:]|UB: ~UEEr-AEM   rEPEPdEYYMQP7YY}} t} u
0F|W~c   8Cux7t[-:   /]ˋ  F|*:xW.cu{ u+7CPEPTFYYs<M9pEutFAME9Wbt|%]}    Wbu9u{ u6C:EuENv9W|btӉu|EyO0F@EE{ u_6CPEPEYYs/M;p}FAME9WbtE2  Wa  8Cu5C:Et{ u
5C:E   pF8uE 3au98Cu5C:Eu+{ u
5C:Eu-F_8ucauA{ MMu
Z5MC:EuE(8u,att0Fuau=8Cu5CPEP;DYYs}
FGE7뵊E} uuxlE MF3荏jl.vE]EEEEPE)EYPq փe } uE 
{EuREYPhh̪q ֋uuƉE]^u>8Cu[2C:Eu+{ u
A2C:Eu-FˉE5uj
   _}   uj
   uj^#uE ]   8Cu1C:EulˈEE4u]uF8Cu1C:Et{ u
1C:Eutu)j2^EET4uj^2EEt;t3HEuMjREuE3E]   { u1CPEEP$AYY;EsP} ̪Eu0t;Es@EE}EE}rE<8tVEtE8GUЍEMr<8 tP} tJ{ ux0CUЋME:Eu*j MbG73u;\,UЋMtEr<8 ~G
2	UЋM]}ErEtdtQtJtMMMrUЉMM:9Mu5u}UUrMU:U|x ~@뫀} Eu	 0@EM  AMAb&A,uA0̸ËA,QH
UEVuW%N t+At#A}QSLtIf64ȁ   [   uo   tG	$ X_B ^]Vt)t2& F^ UEVWP|yY_^   j4p%EPZ<3uFFFEEP@<]YYuGMQj PH0FEPj h50FEPj h"0$FtF., FG FǇ ̃yj3Gj MZ}e ]9_w6s(sj(^PwMYYt|GOG$ G9wrMp M֋GEt, p M։Etj1 M֋GMML! j<oFu;5Qu.h̉M_e Ej uj?P5M#2fj M*~]E   CtCPE&CYt@{)FOCMtp M֋uuӍML UVW}3   ?*u tHUuVV^zYY4?uWS3@tWS;zUYYC~WV)zYY[}W,uhȉ
uJ9*uItVc_^]hd7Uj j yYYuVuPN$vcuuVF^]jDE]}EtLQ}ku+j6EYtSul3VPWYSJIVPWYE  Q'k   j5EYt!X ة3VPWYPjj5EYt`   3VPWrYPjjE\5YuE   tf j uE\s3uMVWYKSuVPWYPQjS)lVPWXP4jS}VPWX} tJQju)j4EYt!X 3VPWXS2iVPWXuSWuVuSWuVg=S]WSV^	_0F,uF0POFaQUVuWjY_^] Ujhd    PVW(03PEd    "9EjY` @     Md    Y_^ ̃yr	̃yr	  Vt.,tF& FF^̋A0Q H
  UVWJuu7' B1E} U7_^tE]EG;MUQQVWJuu7' 9{} EYY7_]^t E]E:]EM]E  Ujh d    PVW(03PEd    EjY` @     Md    Y_^ UM<hEP~V> t6dRY& ^VF~
vGR
y	vWYv2RY^VvRvRv
R^VFr@P6 YY f F   ^Ujh$d    P(03PEd    a A    Md    YUExPr RP5] U} vuuus>E]UuEPuQ>]UEE]UVu_^] UQVW};~w&~SrEWPS~=; [uuWR_^ UUVrBu+Rus<^] ̃yr	̋ItAu	AøUuuu$jE]VWp _^̰j<UeuME] EE$v0Ed>e EPvEPEPEPW"MMaEЄuE3   fU<-uEuuэEPWEPVPMȋЃ¿  f9ut} u;w} tf	   f9EPMMtEMUPQ|  UVEPu EuuuuuP`1M$pEEp^  j8duMċE] EE$v0E<e EPvEPEPEPW+!MMă`} uM   ! .EPVEPEP"fM̃E9Et} t   EPM2LtEMUP{  j8 cuMċE] EE$v0E;e EPvEPEPEPW6 MMă_} uM   ! .EPVEPEPgNM̃E9Et} t   EPM=KtEMUPz  U,  (03ŉEES]$Vu W}RPEǅ ʚ;PEPPQF tiQPPPٝم9t- u$= ʚ;t#tPQ$YY   ؍EPMJtMǋUMW3_^[ 8  U(  (03ŉEES]$Vu W}RPEǅ ʚ;PEPPQE t_QPPPm9t/ u&= ʚ;t%t!PQQ$1   ؍EPMHtMǋUMW3_^[6  UEPu EuuuuuP?YEPE$EP  j4x_EM$]} p0M̍MQ8e EPh   EPEPEPVMMă[} t*EPVEPEPJM̃E9Et} tM   ! EPMGtMËUSmv  j8Y^uMċE] EE$v0Ec7e EPvEPEPEPWMMăZ} uE     ` 1EPVEPEP%OM̃EЉQ9Et} t   EPMFtEMUPsu  j8]uMċE] EE$v0Ef6e EPvEPEPEPWMMăY} uE     ` 1EPVEPEPIM̃EЉQ9Et} t   EPMEtEMUPvt  jh\MEu} ]$@ @  H0QuMEt  Z5e EPnnYMuY3EMMPjEE   EpE   pEP Mփ}EErEuMP*ME*j M_JMpEP Mփ}EErEuMP*ME*}ErEjPjEPEPHH3Ƀ+tt
   MẼr/M@EM=   rEPEP%EEYYMPQ9YYuEPMCtMƋUVr  3EE   PEpEPEPEPuMMErW} u    닍EPuEPEP]ȃE9Et } uULUMEjM EX] UE+E;ErE] UMEjM EX] UMEjX] ̃UEE;]UVuW u~ u39u9t9t_^] UVWur ֋E_^] ̋AUq0M1E] j]/3}3CS]RYMAWM]	hE   R؋E;X   p ֋؅tj0 ֋EXSQYp ֋s??uCuCPWdYY&3@tCuCPW^dYYG~ڍM5E7
̋A UVWur ֋E_^] 2UEP@u+]̸ÃøUuuu=]E]̋AQUQQ;QsyBAr	ED uuju1 ̋! WG8 tG,8 ~O_BËVp ^_WGtG,8 ~_ËVp ^_̋AUS]WG 8 tG08 ~O BEVSp ֋^_[] VWp _^UE ]UE ]UVWup _^] UVWur ֋E_^] UVWuuup _^] UQ$A VuW}y$_q ^] ̋A Q$UuuuuuUZp0y]UE]UuEQQ$^]UQuEQQ$%]EUQEE|&]E̋Vj h  F(Pp^VFDPp^̍AÃ=,T UQ tt
tM=,T t	M]qUM]-̍APp  APp̍APpU(03ŉES]VuW%uu.p9C(tC0 KpC(C,=  u`p9C(tC0 K֋uK,AC,         K,   Fu	9F   j   ~       Fu9F~yEjPuYYM;N|9Er9Eu;NuE;F}p9C(aCpEPuzXYYP Kք4EjPup9C(Cp K֋u#jXpC(3M_^3[(̍APp̍APD Y̍APp ̍AP Y ̍APp̍APpUEH(H,]UVW}39w,tp9G(uF_^]U} tu\)Y]%;]UVW}Gp O_^]UE]UVW}j0j' *YYu@uV<9YY73_^]UVuFPj!N(Ef, Y^]Uj uYY]UpMA,A(]UuuTYYujX]U(03ŉEE3ɉMMMMQPYYM3`&UW}o,uO(GVp O^3_]Uj0Pu.ju0Pj
D=IUEQ]3AA ̸0UE]Ujhd    PSVW(03PEd    ыE3jYZZX@   Md    Y_^[ UVuWV=hFVGǉW_^] UEEA] UEEA] UQEVuxr P$^ UVuRx^] j MuԋEMPuie EPuuMxe   AСPUY̍AСPUYUEI;H] UUVuBN@;Au
;u2^]UEVt
jV	YY^] UQSVW}E_r?sj^/þ;wFP	[MKQWPPEX_p^[ j =Luuԃe }$ tjhhMEPMs^xHEr QPMMEPMycUEtttEj\j jUVu4\?P4xMhtEPaUUVrBu+Ru^] ̋AËAÃy ̸0UuEYMPE] UVWy1ur ֋E_^] ̸UE]̋ËUM09t=u]Ë@]UM9t=0u3]Ë@]U3PuuPuPh   pPu)X]US ]jh   $CYYtVWB{   C   _^Ac C(@Ct
PYC[]UVuWus(x~EuEA   Z       S]   sBuSYu7FXtvFHt1jU]E X,uԋEAUH%   3]E @juMjQPEPh   Wx uEt	M[_^UVuWu6'x~EuEa   z       S]   sBuS1Yu7FXtvFHt1jU]E X,uԋE?UH%   3]E @juMjQPEPh   W; uEt	M[_^UVCEt
jVYY^] UQVWjMWVU3@B<R΅t;t@B΃r,RRMZ$_^USW{,tVwwSu ֋?u^_[] UVuFt,R,R\Pv0tBjVYY^]Ujh:d    PVW(03PEd    j G(t0jPYYug( G,t0jPYYug, Md    Y_^Uup]Uj h  up]Uup]Uup]Ujh^d    PV(03PEd    %dRAP0pt
 ֋0
rЋMd    Y^U=0 >up0I0dR]3AA 3AA 3AA 3AA UuMW]UuMr]                  UEE]UEE]UEE]UEE]UVuMPU;uuEMU^P]UVuMPN;uuEMU^P]    UQVuEE uPF4PVM'+^UQVuEE uPF8PV'+^UQVuEE uPFPV&+^UQVuEE uPFPV&+^UQVuEE uPF4PV+^UQVuEE uPF8PV+^UQVuEE uPFPV+^UQVuEE uPFPV+^UM;MtE f9t;Mu]UM;MtE f9t;Mu]UQE uuuu}%UQE uuuuUE==]UE ]UE]UE]jD@]EuE̊EEt:uFBuj VM؉u3@PE:EEEPYYMEE <3EBU323M׉u9um  ;t:tG;u}M}rM؀<1 tM؄tM1   ;:      uMR   }u!Èx u
K<EH3;;S;EEu p M֋üEր~ u	<EVRq M֋u38Eu
UбM>UЃsjY}ErE؈0rjZM؄tM؈1UЉuMFu;ut'uűQuEЋBMU~ME?VjD>]3ɋEuEEEftf;uFAKfuj VM؉u3@PE 8EEEP)$YYMEE \:3EBU323M׉u9ut  {ftf;t
G{fu}M}rM؀<1 tM؄tM1   {f;   f   uM/P   }uÈx u9U3f{f;BSE{Q p  M֋uE~ uk9ENQ p  M֋u3f9Eu
UбM>UЃsjY}ErE؈0rjZM؄tM؈1UЉuMFu;ut'uűBOuEЋMUwM
ESjD-j;]EuE̊EEt:uFBuj VM؉uo3@PE5EEEPYYMEE 73EBU323M׉u9um  ;t:tG;u}M}rM؀<1 tM؄tM1   ;:      uM   }u!Èx u
TDEH3;;S;EEu p M֋üEր~ uDEVRq M֋u38Eu
UбM>UЃsjY}ErE؈0rjZM؄tM؈1UЉuMFu;ut'uű uEЋ+MU~MtE
QjDx8]3ɋEuEEEftf;uFAKfuj VM؉u3@PE2EEEPdYYMEE '53EBU323M׉u9ut  {ftf;t
G{fu}M}rM؀<1 tM؄tM1   {f;   f   uMn   }uÈx uAU3f{f;BSE{Q p  M֋uE~ utAENQ p  M֋u3f9Eu
UбM>UЃsjY}ErE؈0rjZM؄tM؈1UЉuMFu;ut'uűuEЋ )MUwMEkNUSVuW( _,tFFSj PG~.wF Sj PG~/HwF$Sj PGFSj  P0fGFSj  P0$fG_^[] U0(03ŉESVWjٍuY}uEPj  Pf0fCEPFj  PP0MfC3_^[4 U0SVEЋWP] YjYM3SW} PuMSWFD6PnSWh<F_F_^[ U,ESVWP* YjY{M[CPM-YMCa+P;-C$(,-Y_^C[ UEPuhŝ]UEPuhŝ]UEM +]UEMV;Mt,1f;rw;Eu;Mt3@
3;E^]U]YUE+EVu+u;6Quu7^]U]PEUu3!E!EfEEPjEPEPfEUu3!E!EfEEPjEPEPMfEUe e S]VWQAu+3AEt#uEPWESP~F+u]FjVeEYYt=e e t%uEPuSW~
؃uދE3f_^[Ue e S]VWQAu+3AEt#uEPWESP$~F+u]FjVEYYt=e e t%uEPuSW~
؃uދE3f_^[    UQQS]VW;waGQPSEMNQSuEP_w(u3f^ErE   P7YY7_^[ UQQS]W;weGVQPSENQw4VuEP_k4]3fE^rE   P7zYY_[ -UQQS]VW;waGQPSE NQSuEP_w&u3f^ErE   P7YY7_^[ UQQS]W;weGVQPSEdNQuw4VuEP_/3]3fE^rE   P7>YY_[ UUSVپWK+M;rnC<VPWENQu{Mu}Esur3VP}   PVYYSPE_^[ <UUSVپWK+M;rnC<VPWENQNu{Mu}Esur3VP}   PVYYSPE_^[ UUSVپWK+M;rnC<VPWEB	NQSu{Mu}Esur3VP*}   PV"YYSPE_^[ UUSVپWK+M;rnC<VPWENQu{Mu}Esur3VP)}   PVhYYSPE_^[ UUSVپWK+M;rqC<VPWENQ 
u{Mu}Esuur3VP,}   PVYYSP,E_^[ QUUSVپWK+M;rqC<VPWENQ!u{Mu}Esuur3VPH}   PVYYSP/E_^[ 
UUSVپWK+M;   C<VPWE_NQ}MsE{4	r;3	}PVW
.UfEf93fD9EE   PVVSW-fEf>3fD>;_^[ 	UUSVپWK+M;   C<VPWE[NQl}MsE{4	r;3	}PVW-UfEf93fD9EE   PV$VSW,fEf>3fD>;_^[ UE]UE]UEPEP]UEPEP]UE]UE]UE]UE]UE]UE]UE]UE]UE]UE]UE]UE]UE]UE]UE]UE]UE]UE]UE]UEfEf]UEE]UEE]UEE]UEE]UEfEf]UQQuEuuuP>PEPUQQuEuuuP6PEPUE]UE]UE]UE]UE]UE]UE]UE]UE]UE]UE]UE]UE]UE]UE]jj M!55XSQe u*$MPuCt;uEP1YYt8}}WE"Yp ։=XSM*jj Mg45$SQe up#MPuCt;uEP5YYt8}}WEhYp ։=$SM7X)j?^j M358SRe u"MP(uCt;uEP,YYt8}}WEYp ։=8SM}(j}j M25SRe u!MPnuCt;uEP:YYt8}}WEYp ։=SM `'jj M925(SQe uB!MPuCt;uEPU6YYt8}}WE:Yp ։=(SM	 *'j0j M15RQe u MPuCt;uEPYYt8}}WEYp ։=RMOp&j7vj M05<SRe uMP@uCt;uEPG$YYt8}}WEYp ։=<SM2%juj M05SRe uMPuCt;uEPYYt8}}WEYp ։=SMx$jj MQ/5@SRe uZMPuCt;uEPYYt8}}WERYp ։=@SM!B$jHj M.5SRe uMPuCt;uEPYYt8}}WEYp ։=SMg#j/j M-5DSRe uMPXuCt;uEPYYt8}}WEYp ։=DSMJ"jmj M#-5SRe u,MPuCt;uEPYYt8}}WE$Yp ։=SM"jj Mi,5LSRe urMPuCt;uEP6YYt8}}WEjYp ։=LSM9Z!j`j M+5HSRe uMP*uCt;uEP$YYt8}}WEYp ։=HSM j'j M*5SRe uMPpuCt;uEP%YYt8}}WEYp ։=SMbjej M;*5SRe uDMPuCt;uEPf)YYt8}}WE<Yp ։=SM,j2j M)5,SRe uMPuCt;uEP.YYt8}}WEYp ։=,SMQrjxj M(5RRe uMPBuCt;uEPYYt8}}WEYp ։=RM4jj M(50SRe uMPuCt;uEP2YYt8}}WEYp ։=0SMzj]j MS'5RRe u\MPuCt;uEPrYYt8}}WETYp ։=RM#DjJj M&54SRe uMPuCt;uEPYYt8}}WEYp ։=4SMijj M%5 SRe uMPZuCt;uEP[YYt8}}WEYp ։= SMLjj M%%5PSRe u.MPuCt;uEPLYYt8}}WE&Yp ։=PSMjUj Mk$5SRe utMPuCt;uEP^YYt8}}WElYp ։=SM;\jbj M#5TSRe uMP,uCt;uEPYYt8}}WEYp ։=TSMjj M"5 SRe u MPruCt;uEPGYYt8}}WEYp ։= SMdjuEFuEue F(E j;uEFuEue ԾF(@+ UE] ̃! UE] ̃! UE] UE] 3AA3AA̋ËUjhbd    PSVW(03PEd    ыE3jYZZX3@   fMd    Y_^[ UVu3FF^] j >& uf uMF   )V j & uf MF    j & uf uMF   f  Ujhd    P(03PEd    ! a A   Md    YUjhd    PSVW(03PEd    ыE3jYZZX3@   fMd    Y_^[ j :& uf uMF   2 j ^O& uf MF   j j & uf uMF   k# Ujhd    P(03PEd    ! a A   Md    YU0ESVW]CEPYjY{_^[ U0ESVW]CEPPYjY{_^[ UQEVuFxFƉV^ UQEVuFTmFƉV^ UQEVuuF7^ UQEVuuF^ UQEAM UQEAMx UQEAM UQEAM UQEAM UQEAM UQVujuuuDx^ UQVuj uuu8^ UQVujuuuT^ UQVuj uuud^ UQEAMȿ UQEAM UQEAM UQEAM j0uEFue uLUG juEFue u( j?uEFue ļ jskuEFue 腼 UQEVuuFf x^ UQEVuuFf ^ ̃! Ã! UE] UQEAMP UQEAMd UQEAMx     V^VԾX^    	i̋	.̋	̋	̋	Y̋	7VvxY^VvTY^V~ t	vYvY^V~ t	vjYvaY^V;^V ^VԾ^VԾ^VLk^V(#^V^Vq^VvY^VvY^    1YUSW}9;tF; t3Y3t1Vf9tf9u+V߽YtVWPt
^_[] UQV;utE uu^ UVNtu  f;u^] UVNtul  f;u^] UVW};t6' Y_^] UE	;] UE	;] Uyr	EA] Uyr	EA] Uyr	EA] Uyr	EA] ̋ËËËV~ u?fF^V~ udfF^̋ËÃÃÃÃV^Vn^̋ Ë UE	+ȋE] UE	+ȋE] UE	AE] UE	AE] US]VW}4VuW>uVuP33fG_^[] US]VW}4VuW>u6PuQ33fG_^[] US]VW}4VuW_>uVuPM33fG_^[] US]VW}4VuW>u6PuQ33fG_^[] UVuW}WuV3f~_^] UEVuW< WuV3f7_^] UVuW}WuVk3f~_^] UEVuW< WuV=3f7_^] US]VuW}VWSuVuPEGƍCE+EE   PRQ$_^[] US]VuW}VWSuVuPEGƍCE+EE   PRQu$_^[] UEVuW< WuV?fEf73fD7_^] UEVuW< WuVfEf73fD7_^] UE] UE] UE] UE] UVu^] U]U]UE] UE] UE] UE] UV!Et
jXV蝼YY^] UVԾEt
jXVdYY^] UEVt
j4V6YY^] UVEt
jVYY^] UVEt
jVYY^] UV@Et
jDV踻YY^] UVVEt
jDV莻YY^] UEVt
jVcYY^] UEVt
jV8YY^] UEVt
jVYY^] UEVt
jVYY^] UEVt
jV跺YY^] UEVt
jV茺YY^] UVEt
jXVVYY^] UVEt
jXVYY^] UVԾ:	Et
jXVYY^] UVԾ	Et
jXV諹YY^] UEVt
jV}YY^] UEVt
jVRYY^] UEVt
jV'YY^] UEVt
jVYY^] UVLEt
jVƸYY^] UV(Et
jV荸YY^] UVEt
jDVTYY^] UVEt
jDVYY^] UV0Et
jVYY^] UV;Et
jVķYY^] UEVt
jV虷YY^] UEVt
jVnYY^] UEVt
jVCYY^]  uAUhquu] UMV;Mwu֋E+;w2;rE^]Uhqu] UMV;Mwu֋E+;w2;rE^]UA;Er] UA;Er]   UQSVW}كGEr?sj^1;wFPMM   QWPEC_s^[ UQSVW}كGEr?sj^1;wFPMM   QWPEC_s^[ U(03ŉEe Ae PEPuEP=EuEM3 U(03ŉEe Ae PEPuEPEuEM35 Ue Ae PEPjEPEPy  fE Ue Ae PEPjEPEP  xE ̃9 UyrEA3fB] UyrEA3fB] UUVuW%F t +@t #@Mf .*t@ʿ 0  #t"    t";uA6   ME   $    uf;ua   Me   @ _^]UUVuW%F t +@t #@Mf .*t@ʿ 0  #t"    t";uA6   ME   $    uf;ua   Me   @ _^]UM39UvVu23iȓ B;Ur^]jdM$E]u E]Mt<+t<-u3G3C 0  #;tt"Gx;w<>0uL>xtXuRV@Ej.XfEf  EEPV EMs0*e EPMYMEj uMV}EE   rE؋MPEPVs0MEEPSYEMuvpEP M֋MEuЉU;ut M}ȍErE؋UfpEE}uru<t3]~)ȋ+;sR+ٍMjS~ ~FU<uӋ]{$ EE|{  vs ;v+3C%  @   =   t8VuEuuPur3}PE؉MUrEWPRQX}ErEWPuEuPuPVu@PEEQPuM03#}ErEWPuuEPu}PE؉MUErE؉EE+PEx}PRQEPWлVuu@c  c$ PQVWME0MMw	jdM$E]u E]Mt<+t<-u3G3C 0  #;tt"Gx;w<>0uL>xtXuRVyEj.XfE蟥  EEPVYEMs0ce EPEMYME	j uM}EE   rE؋MPEPVs0MEEP6YEMupEP M֋ME uЉU;ut MP}ȍErE؋UfpEE}uru<t3]~)ȋ+;sR+ٍMjS~ ~FU<uӋ]{$ EE|{  vs ;v+3C%  @   =   t8VuEuuPu趥3}PE؉MUrEWPRQX}ErEWPuEuPu1Vu@PEEQPuMW03#}ErEWPuuEPu}PE؉MUErE؉EE+PEx}PRQEPWVuu@c  c$ PQVWMEѤ0M!Ml̋ËËËËËËËj8jQ}3މ]tC97u?j4_YEutMPMMCVP7tMFjX6j8}3މ]tC97u?j4YEutMPM$MCVP57tMǯjX跞j\*}3ۋEEԉ]Ѕt{9uwj]Yu!]tBMԍEPKxEE   r PMf j[xFV37tMtM衺3@7j\]`}3ۋEEԉ]Ѕt{9uwj蓴Yu!]tBMԍEPxEE   r PMf j[TFV37tMOtM׹3@mj8}3ۉ]tO9uKjDϳYu!]t&MPMf PC>37tM読jX蚜j83}3ۉ]tO9uKjDCYu!]t&MePMf PC37tMjXj8 }3ۉ]tG9uCj跲Yu!]tMPMCf 37tM蚬jX芛j8X %}3ۉ]tG9uCj5Yu!]tMWPMwCxf 37tMjXj8 裿}3ۉ]tG9uCj賱Yu!]tMPMCf 37tM薫jX膚j8 !}3ۉ]tG9uCj1Yu!]tMSPMsCf 37tMjXj8!蟾}3ۉ]tG9uCj诰Yu!]tMPMCf 37tM蒪jX肙j8@!}3ۉ]tG9uCj-Yu!]tMOPMoCf 37tMjX j<!蛽}3ۉ]tc9u_jX諯Yu!]t:MPMf C]SPE   ^(x37tMrjXbj<!}3ۉ]td9u`jXYu!]t;M(PMHf C]SPE   F( 837tM̨jX輗j<c"P}3ۉ]tc9u_jX`Yu!]t:MPMf C]SPE   Ծ^(T37tM'jXj<"諻}3ۉ]td9u`jX軭Yu!]t;MPMf C]SPE   ԾF( 37tM聧jXqj8
#}3ۉ]tG9uCjYu!]tM7PMWCȿf 37tMjXj8D#胺}3ۉ]tG9uCj蓬Yu!]tMPMCf 37tMvjXfj8~#}3ۉ]tG9uCjYu!]tM3PMSCf 37tMjXj8#}3ۉ]tG9uCj菫Yu!]tMPMCf 37tMrjXbj<$}3ۉ]tZ9uVjYu!]t1M/PMOf C]SPE   L37tMݤjX͓j<w$d}3ۉ]tZ9uVjtYu!]t1MPMf C]SPE   (737tMDjX4j<$˷}3މ]tI97uEjD٩YEut$MPMMCVP]]7tM躣jX誒j<-%D}3މ]tI97uEjDRYEut$MvPMMCVP]]7tM3jX#j8n%轶}3ۉ]tS9uOjͨYu!]t*MPMf Cf P37tM褢jX蔑j8%,}3ۉ]tS9uOj<Yu!]t*M^PM~f Cf Pȯ37tMjXUgMQ] gVW詼tVOVYG_^u(h   %}uMUG]% 0  |Mp= 0  uRWQSVuy  w0t軶e tP9MYtlVEPq l֋|tw0E   EE E TtEPYtEEPhhq, ֋}W-uM8CuCf;Eu| +ˍpo%{ uCf;Eu| -ҋup330xFu9 ʚ;UUHU%  $}hEErEE <=  5  9UuUl3҉EURjMUE   UEuE31   { uCPEPYY
s]ME9hEtEutFAuM}E}rE<8tXEtE8IM̍UErЀ<: tRf} tK{ SuSM̋Ef;Uu*j MGɧuPM̋EtUrЀ<: ~ZGM̋EUtNUtDtUrЊM::Mu&uUrЊM:
M|UB: ~UEEr-AEM   rEPEPEYYMQP蘗YY}W   8Culstf;   Suˋ  Fu蹦}W@u{ uCPEPYY
sDM9hEtEutFAMEQWtu7up8 ʚ;   }    Wu8u{ u,fCf;EuENWutщuuEyY0F@EO{ uCPEPYY
s9M;h}FAMtEEzWt} tH~pލ :t9u0O;xup;xuE1}E<  W)  8Cu#Cf;Et{ uCf;E   eFɤuE 3Ju=8CuCf;Eu+{ uCf;Eu-FxuuC{ MMu
MfCf;EuE?utt0Fuu=8Cu7CPEPYY
s}
FGEޣ뵊E} uu|M 9Eh   e&_}uMUG]% 0  |Mp= 0  uRWQSVu%  w0te tP,MYtlEPq l֋|tw0E   EE E 蝭tEP|YtE>EPhhq, ֋}WuM8Cu=Cf;Eu| +ˍpj%{ uCf;Eu| -ҋup330xFu9 ʚ;UUHU%  $}hEErEE <=  5  9UuUl3҉EURjMUE   UEuE3   { u<CPEP襱YY
s]ME9hEtEutFAuM}E}rE<8tXEtE8IM̍UErЀ<: tRf} tK{ SuSM̋Ef;Uu*j MGuM̋EtUrЀ<: ~ZGM̋EUtNUtDtUrЊM::Mu&uUrЊM:
M|UB: ~UEEr-AEM   rEPEPͻEYYMQPYY}WL   8Culs,f;   蜆uˋ  Fu}Wu{ uOCPEP踯YY
sDM9hEtEutFAMELW藎tu7up8 ʚ;   }    Wdu8u{ ufCf;EuENW2tщuuEyY0F@EO{ umCPEP֮YY
s9M;h}FAMtEEuWt} tH~p' :t9u0O;xup;xuE1}E<  W[)  8CuCf;Et{ uCf;E   eFuE 3u=8CuZCf;Eu+{ u>Cf;Eu-Fsu輌uC{ MMu
MfCf;EuE:u背tt0Fuku=8CuCPEP'YY
s}
FGE뵊E} uu|M 肝Eh   &}\E]dEw0|ETne \PMY\X	EPq Xw0\E   \EP臲Y\EEPhahDq, ֋|ˋdVE uC8CumCf;Eu +{ uOCf;Eu -ˍx3f0xEVˉhptvuc8CuCf;EuMėVMu68CuCf;Et{ uCf;Eu	脗ET39 ʚ;H%  $}`Elr	El <    } u
3xXx3EPjMEE   EE|E3m  { uCPEP&YYsapE9`tutDGAhp}E}rE<0t^EtE0OMUErЀ<2 t[fx tQ{ SuJSMEf;xu-j MF|MEtUrЀ<2 ~|FMEltmtft#}Mxrxx:1Mu:u"}Mxrxx:M|lB: ~lEEr?Alx   r!xPlP腲lYYxQP蓅YY|} tp u
0GhVnu?8CuXsWf;u:}ˋ  Gh蠔|p 8  VuAt{ ufCf;EuEOXVtщtht   0G@t   V{ u/CPEPdYYsEp9`tutDGApE跓V@th{ uCPEPYYs5p;`}DGApEUVtEH  V5  8CuLCf;Et{ u5Cf;E  pG|E 3pu=8CuCf;Eu+{ uCf;Eu-G螒|"uF{ MMu
MfCf;EuEb|tt0G|u=8CuTCPEP艉YYs}
DGFE벊E} uudTt MH3h   9'O}\E]dEw0|ETe \P=MY\X谿EPq Xw0\E   进\EP螝Y\E`EPhhhq, ֋|ˋdVE uC8CuRCf;Eu +{ u4Cf;Eu -ˍxe3f0xEVˉhptuc8CuCf;EuMVhu68CuCf;Et{ uCf;Eu	ݳET39 ʚ;H%  $}`Elr	El <    } u
3xX{x3EPjMEE   EE|E3~  { uCPEP%YYsapE9`tuthGAhp}E}rE<0t^EtE0OMUErЀ<2 t[fx tQ{ Su/SMEf;xu-j M覮FT|}MEtUrЀ<2 ~|FMEltmtft#}Mxrxx:1Mu:u"}Mxrxx:M|lB: ~lEEr?Alx   r!xPlP,lYYxQP:|YY|} tp u
0GhV|u?8CuXsmf;usˋ  Gh|p 8  V1|uAt{ u}fCf;EuEO豰V{tщtht   0G@t   V{{ uCPEPcYYsEp9`tuthGApEV[{th{ uCPEPYYs5p;`}hGApE讯VztEH  Vz5  8Cu1Cf;Et{ uCf;E  pGK|E 3zu=8CuCf;Eu+{ uCf;Eu-G|=zuF{ MMu
MfCf;EuE軮|ztt0G|yu=8Cu9CPEP舾YYs}
hGFET벊E} uudTt M3j'"MEMp0ݒe EPOMYMu聶](}    %uCECj  p$Pu$EWuuuuuP M֋@ME    uTEPM@} uMujHp MքtNM軅EPM@ut1} uMµj up8 M:uMuuC EPMtEMUPk$ j'xMEMp03e EPMYMu״](}    %uCECj  p$Pu$EWuuuuuP M֋@ME    uTEPMIu@} uMujHp MքtNMéEPM
uut1} uMVj up8 M:uM}uC EPMttEMUPpi$ h   '袶E]lExEPEEYPq փe } u	p Ĺpu貜EYPhhq, ֋lxƉ|uE8Cu褲Cf;Eu+{ u舲Cf;Eu-Fˉ|Auj
   _}   uj
   uj^#xE    8CuCf;EuyˈEtҁxVuM8Cu߱Cf;Et{ uȱCf;Eu tu/j2^Etvuj^2Ett;t3HEtMjlxE3t  { u)CPEPIYY;EsY} |u0t;ts@E|}EE}rE<8t^EtE8OUEMr<8 t[fp tQ{ Cu芰CUMf;pu-j M?G;xUMtEr<8 ~G
2	UM]}ErEtgtQtJtMMMrUMM:9Mu8u}UUrMU:U|x ~@뫀} |u 0@lM  M~h   C(ױE]lExEPEEYPq փe } u	p kpuWEYPh7hq, ֋lxƉ|nuE8CuCf;Eu+{ uCf;Eu-Fˉ|(uj
   _}   uj
   uj^#xE <n   8Cu苺Cf;EuyˈEt蹢xmuM8CuRCf;Et{ u;Cf;Eu tu/j2^Et]uj^2Ett;t3HEtMjlxE3tNm  { u蜹CPEP*iYY;EsY} |u0t;ts@E|}EE}rE<8t^EtE8OUEMr<8 t[fp tQ{ CuCUMf;pu-j MtG"xhlUMtEr<8 ~G
2	UM]}ErEtgtQtJtMMMrUMM:9Mu8u}UUrMU:U|x ~@뫀} |u 0@lM  $}M}U@(03ŉE}	EMSVEE W}M̉E3F	}cj^u3}  EЋE3QωEпF;}K uVEOQjH p MքtyűC苿uЄtuűuu~;}z8GuEOj Q p8 M<+uE<-uEE܍E݉E3;]}C u质EOj Q p8 M<0uCbxűtu؅~W0FuN uaEOj Q p8 M֋u؍HЀ	w(;]}#E;sFu؋Cwű}tuu܍E3Pj
EĈPE܉]P辭ϋuItCE9Et} u;u|9u|E0M_^3[蹁U@(03ŉE}	EMSVEE W}M̉E3F	}cj^u3}  EЋE3QωEgF;}K uEOQjH p Mքt
űCRguЄtuű<gu~;}z8Gu苳EOj Q p8 M<+uE<-uEE܍E݉E3;]}C uEEOj Q p8 M<0uCgűftu؅~W0FuN uEOj Q p8 M֋u؍HЀ	w(;]}#E;sFu؋CűDftuu܍E3Pj
EĈPE܉]PϋuftCE9Et} u;u|9u|E0M_^3[h   [)貧EM}Le EEEElpTxp0h} tpE   P5؉]pE   PX؉EYp3ɈMMM3ME   fEE   p,dP ֋u3FF   xp3C]p0]pEP)YEphUlhhX3|  d 3      Kt(H  E||ht	  u3ΉEqEpEP Mց   ]]} E8  M蟾Ef!  }ErE8  3E؉EE   EPMEu3覸   ]؉] u$GPl_zYY
sAM``œ}E}rÀ<0tKE؄t07}ErÀ<0 tE Gu誡Gf;Eu*j MhF]؉]^quE]t$}ErE<0 M~FEMME}UUrUUuN      t}Er:0u"u}Er:|Uz ~BUEEr,@ME=   rEPEPEYYMPQaYYMErEE   @ME=   rEPEP豍EYYMPQ`YYeuV躶uV] u?GPlzxYY
s,ˈ\\oVgt]MpuK   f   8GuǟGf;   ouuEuX;}i u莟GPlwYY
s6MXX/E)ou谵;}EEuEMy u	Es;k}+j0ܐuTMuWE pEP Mց   E} ]vRE pEP Mց   E	   }u]ru utGEf9tE tM]sE   tM؉]ps} tRmEMQ p MƅP EP   MP]])MsE p EP Mց   E
} ]vRE p EP Mց   E   }u]ru ujGEf9tE tM]rE   tM؉]fr} tVlEMQ p  Mƅt Et    MP]]MrEE pEP Mց @   E} ]]t/E p EP Mց@  E} ]]tE @t㿍M]]qE    tߍM؉]]rq} E8E/E pEP Mցˀ   ]]xuE@u-VIu!8Guқ}EOrEf;u<|uH}wBVu!8Gu薛}EOrEf;t}ErE؃e 3f}uruu轱uH]}MrM؋EA;t, u,Gf;uσjSxt]}MrM؋EA;tEEM|uE 0uP] u赚OQjHp hքtE`jSht]|d k} aEZM   }uruEEE}rEH;t2uvu!8GufGf;uiM뻋M}ErEH;tuƃ~rf   } utj-jj Er>ME   xM=   rxPEP趆xYYMPQYYYJ h   *ϙEM}Le EEEElpTxp0r} tpE   P8؉]pE   P衂؉EYp3ɈMMM3ME   fEE   p,dP ֋u3FF   xp3C]p0]qpEPsYEphrlhh'j3|  d 3      Kt(H  E||ht	  u3ΉEMEpEP Mց   ]]} E8  MWEf!  }ErE8  3E؉EE   EPME:u37U   ]؉] uGPluYY
sAM``}E}rÀ<0tKE؄t07}ErÀ<0 tE GuGf;Eu*j M腅F]؉]-uvTE]t$}ErE<0 M~FEMME}UUrUUuN      t}Er:0u"u}Er:|Uz ~BUEEr,@ME=   rEPEPEYYMPQ/SYYMEeEE   @ME=   rEPEPEYYMPQRYYeuVKSuV] u蚟GPltYY
s,ˈ\\譇VRt]M舐uR   f   8Gu"Gf;   XuRuEuX;}i uGPlisYY
s6MXXLEuAR;}EEuEMy u	Es;k}+j0uTMuQE pEP Mց   E} ]vRE pEP Mց   E	   }u]ru uϝGEf9tE tM]E   tM؉]} tR΅EMQ p MƅP EP   MP]]訆M褛E p EP Mց   E
} ]vRE p EP Mց   E   }u]ru uŜGEf9tE tM]E   tM؉]} tVĄEMQ p  Mƅt Et    MP]]螅M蚚EE pEP Mց @   E} ]]t/E p EP Mց@  E} ]]tE @t㿍M]]E    tߍM؉]]} E8E/E pEP Mցˀ   ]]xuE@u-VNu!8Gu-}EOrEf;u<|uH}wBVNu!8Gu}EOrEf;t}ErE؃e 3f}uruuNNuH]}MrM؋EA;t, u臚Gf;uσ辂S	Nt]}MrM؋EA;tEEM|uE MuP] uOQjHp hքtE/SzMht]|d k} aEZM   }uruEEE}rEH;t2uMu!8GuZfGf;u蔁M뻋M}ErEH;tuƃ~rf   } utj-jj ;Er>ME   xM=   rxPEPxxYYMPQKYYg VW|tVO8V>vYG_^u̋UVuW( tF8F<P菄G~.YwFHPwG$~/YwFLP_GF@Yf fGFDf fG_^] UUB0f fAB4f fA]4 ̋A39tA,̋A39tA,̋A,QH
̋A,QH
UEVuW%N t+At#A}QSLtIf64ȁ   [   uo   tG	$ X_B ^]UEVuW%N t+At#A}QSLtIf64ȁ   [   uo   tG	$ X_B ^]Vtj  f;t2& F^Vt.  f;t2& F^j0+Z`ى]EPT,jY!>u3uFFFFSPwEHFWj f~( tG(G)Fx|f G.^ PG*PG+PSG/N$PG,PG-PQ觘} t
$+xvF$: j0S+]_ى]EPS,jY$=u3uFFFFSPwEGFWj 行~( tG(G)Fx|f G.^ PG*PG+PS`BG/N$PG,PG-PQFB} t
$+xvF$9 U,EVWPRYjY_^ U,EVWPRYjY_^ V^FV^ V^FV^ U<ESVWPA{EPIRYYjY{_^[ U<ESVWP{EPRYYjY{_^[           jd+;EEPQjY]}3sssEuPQ} YYtE@MQVPECEPVhH\CEPVh6\$C} t%EPVj.聀fCEPVj,qfC,ujYuj ݜ jd+9EEPPjY]}3{{{E}PqP} uYYuFMQWPxDCEPWh\CEPWh\$C} t$EPWj.茅fCEPWj,|F0f fCF4 fC֛ j	,[3uFFFuEP譒لF/6 j=,Z3uFFFuEPj蓄F5 UQV
MENEP$8umY^ UQVLENEP7u|mY^ jP,]$EuM EuMt<+t<-u3G3F%   =   uG;w<90uL9xtXuv0M[e EPiMYME9j SM}EE   rE؋MPPQM4v0M<[EEPwYEMu~pEP Mփ}uEru<tA~=MeЉU'~)ȋ+;sR+ٍMjSl~ ~FU<uӋ]EE{$ |{  vs ;v+3C%  @   =   t8VuEuuPu3}PE؉MUrEWPRQX}ErEWPuEuPuJVu@PEEQPuM計03#}ErEWPuuEPuJ}PE؉MUErE؉EE+PEx}PRQEPWeJVuu@c  c$ PQVWME"0M}OM^RjP,]$EuM EuMt<+t<-u3G3F%   =   uG;w<90uL9xtXuv0MIXe EP+ZMYME{j SM}EE   rE؋MPPQMPv0MWEEPYEMu{pEP Mփ}uEru<tA~=M8ЉU'~)ȋ+;sR+ٍMjS~ ~FU<uӋ]EE{$ |{  vs ;v+3C%  @   =   t8VuEuuPu43}PE؉MUrEWPRQX}ErEWPuEuPuCwVu@PEEQPuMi403#}ErEWPuuEPuv}PE؉MUErE؉EE+PEx}PRQEPWvVuu@c  c$ PQVWME30M3LM~̃y̃yjs-~SE}j E[t^Qz9]u:jDE{EuYtuΉ^muVWOiuebVPW8iE  Rtz}    jEEYtX ȿVPWhR7zjDEYtX VPWhRzjEDYuE   t^SuEL蝅uMVWlhQuEVPWWhRyuoVPW8hR~yuUpVPWhSS腃3YYBUt`RHy} u;jECuYt^xoRFVuVWgunSVPWgU tQRx} u)jCEYtX VPWagu|VPWLgU  Rx}   j!CEYtX VPWgRIxjBEYtX VPWfRxjXEBYuE   t#^SuE^(Z8uMVWufRwjXE_BYuE   t$^SuEF(ZxuMVWfpuLNVPWfRJwuBVPWeR+wu *VPWeRwu;VPWeU   Rv} u{jDAYEE   tSu^ÃMVPWUeRvjE?AuYtu^^ZouVWe2uCVPWdRAvuVPWd} tNQv} u)j4@EYtSuVSWduSVPWd)j-ME}j E[t^Q_t9]u:jDE>uYtuΉ^hvuVWbuXPVPWbE  Rs}    j>EYtX VPWtbRsj_>EYtX VPWAbRsjE+>YuE   t^SuE(quMVWaQu[9VPWaR su3VPWaRsutVPWaSS蟋3YYBUt`Rr} u;jEi=uYt^TKFVuVW<auHVPW%aU tQRcr} u)j=EYtX xVPW`u\,VPW`U  R	r}   j<EYtX VPW`Rqjq<EYtX VPWS`RqjXE=<YuE   t#^SuEԾ^(譋uMVW_R>qjXE;YuE   t$^SuEԾF(QTuMVW_puhVPW_RpuRVPWh_RpuF[VPWI_RpuoVPW*_U   Rdp} u{jD;YEE   tSu蠃ÃMVPW^RpjE:uYtu^^cBuVW^2uOVPW~^RouyVPW_^} tNQo} u)j4>:EYtSu见VSW ^uAVPW^#UMQffu+VWjyWcIYYt?PuVs_^] Uy( u(Ew Mw}wAkE<E	] Uy( u(Ew Mw}wAkE<E	] UVuWjY_^] UVuWjY_^] Ujh4.d    PVW(03PEd    ?EjY` 3@   fMd    Y_^ UjhX.d    PVW(03PEd    uEjY` 3@   fMd    Y_^ ̃yr	̃yr	̃yr	̃yr	Vt'D  f;tfF& FF^VtS  f;tfF& FF^̋A 39tA0̋A 39tA0̋A0Q H
̋A0Q H
UVutE MP~EEuEMU^P]UVutE MP-EEuEMU^P]UVutW}MP&~u_EMU^P]UVutW}MP,u_EMU^P]h   .9kMEtM<\Ehlp0e `C} t`EPv}`EPUEY`E wgpEP ֋EL63+x9}4wlǍM$+E4@Pj 1U|}M}rM9tcMtM9 ~TM}}ȉMr}u4+x<t%~!;sQ+M$jVT ~GMՋxe e 3E   fE؀}  EE0EPt#v, M֋EpE p !v( M֋EpE pEP ME EuMPYUMM;e e 3E   fEhE@t4EMQ p ME EuMP UM:23ɈU35p tDt:t0KtHt089}4w+U4B33;E4UMMAtUFrhx$ |x  vp ;v+3@%  d@t3=   uu(VtEuuPY3PMUUM3Ep   a  5  KtH    u}8E$rE$u4PRQL   9}4wklM4zM5MP z+E4PlDuuPX}8PE$MUrE$u4PRQ<   E4+ǃ}8}$|xr}$|xP|4RQP@@MMEn4MPwy}8M$rM$E4+WAPu,uP=@   }    }ErEjPRQ$σ}ErEuPRQjtRQPWPMUd   u%VtTRQPW3PUME@EEv0}xErEWPRQTPi?PMUhVt\`  `$ RQVCWEԃ   r;ME   E|;rEP|POEYY|PQ"YYe 3fEEE   r;M؍E   E|;rEP|P=OEYY|PQN"YYe M3E   fE!4M$7|8 h   5/mcMEtM<\Ehlp0e `*<} t`EP`}`EPLLEY`E _pEP ֋Ex3+x9}4wlǍM$+E4@Pj !i|}M}rM9tcMtM9 ~TMN}}ȉMr}u4+x<t%~!;sQ+M$jVh ~GMՋxe e 3E   fE؀}  EE0EPt#v, M֋EpE p !v( M֋EpE pEP ME EuMPTMie e 3E   fEhE@t4EMQ p ME EuMPTMi23ɈU35p tDt:t0KtHt089}4w+U4B33;E4UMMAtUFrhx$ |x  vp ;v+3@%  d@t3=   uu(VtEuuPC3PMUUM3Ep   a  5  KtH    u}8E$rE$u4PRQL   9}4wklM!M[MP !+E4PlDuuPB}8PE$MUrE$u4PRQ<   E4+ǃ}8}$|xr}$|xP|4RQPXU@MMEoZMPW }8M$rM$E4+WAPu,uPU   }    }ErEjPRQ$σ}ErEuPRQjtRQPAPMUd   u%VtTRQPA3PUME@EEv0}xErEWPRQTP:TPMUhVt\`  `$ RQVDAEԃ   r;ME   E|;rEP|PGEYY|PQYYe 3fEEE   r;M؍E   E|;rEP|PqGEYY|PQYYe M3E   fEU,M$et8 UVutuMnuEMU^P]UVutuMuEMU^P]UVutuMmuEMU^P]UVutuMuEMU^P]  Ujhx/d    PVW(03PEd    EjY` 3@   fMd    Y_^ Ujh/d    PVW(03PEd    EjY` 3@   fMd    Y_^ VvNDvFDv>Dv6D^VvDvDvDvD^VvCvCvC^VvCvCvC^VvCvCvC^VvrCvjCvbC^VFrE   P6hYY3f!FF   ^VFrE   P60YY3f!FF   ^Ujh/d    P(03PEd    a 3A   fMd    YUjh/d    P(03PEd    a 3A   fMd    YVWi.tVOMVBYG_^u8VWxOtVOMVAYG_^uU!M] h7bh*bUExPr RPl
] UQVMFV+;w.~S
W^r>QuWP8N3f__[uQuQ\W^ UQUVFN+;w1~SW^r>PuOQ\3f__[RuuRJ^ UExPr RP] UMtEЋW}f_E]UMtEЋW}f_E]UuuuL]UEfEf]UuuuL]UEfEf]UVuR^] UQVW};~w&~SrWu~SaL3f{[uuWn4_^ UVuW3f9>t	@Bf98uRVD_^] UQEW;Gw+SVr4 GVuSZ3f^[uuP^_ UVu*^] UQVW};~w&~SrWu~S]K3f{[uuW
_^ UUVrffu+RuX^] Uyr	E] Uyr	E] ̃yr	̃yr	UEPuuWE]UEPuuzWE]UVWur ֋E_^] UVWur ֋E_^] VWp _^VWp _^UEPu
YY] VWp _^VWp _^VWp _^VWp _^2  UAPuuuu]Aȃy3] UAPuuuu,ȃy3] UqM"*E] UqM	E] ̋AËAfAfAfAfA3yUqM)E] UqME] ̋AËAUVu3uΉFFI0^] UVu3uΉFF4a^] j@0kPU(E ]u$UURPuEPEPEPe EPMMct} t7}}r}e EPj EPWb]9}t} uE؃MUMStg$ j<V0OEU؋]$}(REE PuEPEPEP#EЍME3EuPtbt9uu^]VSE}ErE8-u=rfE3fF'}ErE0ExrfpF;rՋ]MUMSpf$ j@0NU(E ]u$UURPuEPEPEPe EPMt} t7}}r}e EPj EPW[9}t} uE؃MUMSe$ j<0MEU؋]$}(REE PuEPEPEPEЍME3EuPt9uu^]VS}ErE8-u=rfE3fF'}ErE0ExrfpF;rՋ]MUMSd$ j<1LuME] EE$v0E}%e EPvEPEPEPWW8MMIEЄuE3   fU<-uEuuэEPWEPV7MȋЃ¿  f9ut} u;w} tf	   f9EPM^tEMUPjc  UVEPu EuuuuuP
M$pEEp^  j8Z1.KuMċE] EE$v0E$e EPvEPEPEPW6MMăG} uM   ! .EPVEPEP;MM̃E9Et} t   EPM]tEMUPb  j819JuMċE] EE$v0E#e EPvEPEPEPW5MMăF} uM   ! .EPVEPEP5M̃E9Et} t   EPM\tEMUP&a  U,  (03ŉEES]$Vu W}RPEǅ ʚ;PEPPQM tiQPPPٝم9t- u$= ʚ;t#tPQ$YY   ؍EPM[tMǋUMW3_^[  U(  (03ŉEES]$Vu W}RPEǅ ʚ;PEPPQoL t_QPPPU9t/ u&= ʚ;t%t!PQQ$   ؍EPMeZtMǋUMW3_^[  UEPu EuuuuuPP\EPE$EP  j41FEM$]} p0M̍Mje EPh   EPEPEPVB2MMăB} t*EPVEPEP1M̃E9Et} tM   ! EPMYtMËUS]  j82EuMċE] EE$v0E|e EPvEPEPEPWV1MMăB} uE     ` 1EPVEPEP>6M̃EЉQ9Et} t   EPMXtEMUP\  j8^2DuMċE] EE$v0Ee EPvEPEPEPWY0MMăA} uE     ` 1EPVEPEP(0M̃EЉQ9Et} t   EPM!WtEMUP[  jh2CMEu} ]$@ @  H0QuME}  se EP8YMu@3ɉMM3QMȍMjE   fEY[E   pEP Mփ}EErEuMPSMEj M>MpEP Mփ}EErEuMPME}ErEjPjEPEPS3Ƀ+tt
   MẼr5ME   EM=   rEPEP5,EYYMPQIYYuEPM<UtMƋUVY  EE   PEpEPEPEPu-MME>} u    닍EPuEPEP%DȃE9Et } uULj<3@uME] EE$v0Ee EPvEPEPEPW?2MMA=EЄuE3   fU<-uEuuэEPWEPV,MȋЃ¿  f9ut} u;w} tf	   f9EPMtEMUPW  UVEPu EuuuuuPM$pEEp^  j8I3]?uMċE] EE$v0E3e EPvEPEPEPW0MMă;} uM   ! .EPVEPEPjAM̃E9Et} t   EPMPtEMUPJV  j83h>uMċE] EE$v0E>e EPvEPEPEPW/MMă:} uM   ! .EPVEPEP)M̃E9Et} t   EPM[tEMUPUU  U,  (03ŉEES]$Vu W}RPEǅ ʚ;PEPPQ? tiQPPPٝم9t- u$= ʚ;t#tPQ$3YY   ؍EPM7tMǋUMW3_^[H  U(  (03ŉEES]$Vu W}RPEǅ ʚ;PEPPQ> t_QPPP2I9t/ u&= ʚ;t%t!PQQ$   ؍EPMtMǋUMW3_^[  UEPu EuuuuuP9EPE$EP  j43:EM$]} p0M̍Me EPh   EPEPEPV*,MMă,7} t*EPVEPEP&M̃E9Et} tM   ! EPMtMËUSQ  j849uMċE] EE$v0Ee EPvEPEPEPW>+MMă@6} uE     ` 1EPVEPEPm*M̃EЉQ9Et} t   EPMtEMUPP  j8M48uMċE] EE$v0Ee EPvEPEPEPWA*MMăC5} uE     ` 1EPVEPEPW$M̃EЉQ9Et} t   EPMtEMUPO  jh47MEu} ]$@ @  H0QuME}  e EP7YMuJ43ɉMM3QMȍMjE   fEQEE   pEP Mփ}EErEuMPME?j M+MpEP Mփ}EErEuMPVME5?}ErEjPjEPEP'3Ƀ+tt
   MẼr5ME   EM=   rEPEPd EYYMPQxYYuEPMtMƋUVM  %EE   PEpEPEPEPu'MME2} u    닍EPuEPEPT8ȃE9Et } uULj4.]Ms0e EP\MYME1u 3M(UjXa  ^  R      AF  A     tvt_ta  uE$Pj;OuEPjjEPEPWȉ  ME$#MH  uE$PjR  h(  uEPjcREPEPWȉf  EkdE$HR  h`J  StUtFt0+t,t8  u$EVSuuuuPmDuE$Pj5Xhl   uu$j<Au$EVSuuuuPc'@ME  n   f  b      tfta   +tC   uEPjjEPEPWuȉI  E$MIH:  uE$Phn  uE$PjjEPEPW'	  hu$EVSuuuuPu$EVSuuuuPfp   +ty+tktUtFt   uEPjcREPEPWȉuoMEdh|SuE$Pjh88hL.Rh<REPEP!y~E$@EPMDtEMUP( j+5}]Ms09	e EPMYME,u 3M(UjXa  ^  R      AF  A     tvt_ta  uE$Pj;OuEPjjEPEPWȉ  ME$#MH  uE$PjR  h(  uEPjcREPEPWeȉf  EkdE$HR  h`J  StUtFt0+t,t8  u$EVSuuuuPTDuE$Pj5Xhl   uu$j<Au$EVSuuuuP~=@ME  n   f  b      tfta   +tC   uEPjjEPEPWHȉI  E$MIH:  uE$Phn  uE$PjjEPEPW	  hu$EVSuuuuPu$EVSuuuuP>p   +ty+tktUtFt   uEPjcREPEPWjȉuoMEdh|SuE$Pjh88hL.Rh<REPEPy~E$@EPMJtEMUP	( j_5uEMp0e EPMYM,(~BuuE   EPMk>}   } uM'ujp քu-E$MPWuEuuuuP*	j^@uyuu(u$ESVjjPEPun	   E$uSPjVEPEPuB	ZMPWuEuuuuPf@EM0} uM'ujHp քtMEPMN=tEPM>=ua8EuM&j up8 <:t2<,t.</u2(} uM&ujHp քtMHEPM<tEPM<   8EuMA&ujp ֋uuKu	7   u$MEWuuuuuPr@ME   E      t(t#E$SPjjEPEPu
	Uu$ESVjjPEPu~
	0} uMy%ujHp քtM-EPM;tEPM;ua8EuM*%j up8 <:t2<,t.</u2(} uM$ujHp քtMEPM1;tEPM!;t   } uM$ujp քu'}uu$MEWuuuuuPtEu%u$ESVjjPEPu)		Ru#E$SPjjEPEPu	*u$MEWuuuuuP!@EMEPM;:tEMUPn  j5uEMp0e EP MYMW"uuE   EPM
}   } uMT/ujp քu-E$MPWuEuuuuPj^@uyuu(u$ESVjjPEPu	   E$uSPjVEPEPu	ZMPWuEuuuuP)@EM0} uM~.ujHp քtMEPMtEPMua8EuM/.j up8 <:t2<,t.</u2(} uM-ujHp քtM%EPMltEPM\   8EuM-ujp ֋uuKu	7   u$MEWuuuuuP&@ME   E      t(t#E$SPjjEPEPuP	Uu$ESVjjPEPu-	0} uM,ujHp քtM
EPMQtEPMAua8EuM,j up8 <:t2<,t.</u2(} uMa,ujHp քtMEPMtEPMt   } uM	,ujp քu'}uu$MEWuuuuuPtEu%u$ESVjjPEPu	Ru#E$SPjjEPEPu	*u$MEWuuuuuP@EMEPMtEMUP  Uj qEj PEP0ȃyE E$HEMUP]  Uj qEj PEPȃyE E$HEMUP]  j5~uEMp07e EPMYMM$ESQjj PEPV } 	uS} uMj up8 <:u+M[E$SPj;j EPEPuW 	uN8EuMLj up8 <:u'M Su$Ej<j PEPu  	EMUP  j5uEMp0e EPMYMtM$ESQjj PEPV} 	uS} uM{'j up8 <:u+ME$SPj;j EPEPuq	uN8EuM 'j up8 <:u'MHSu$Ej<j PEPu	EMUP?  Uj qEj PEP~-ȃyE E$HEMUP]  Uj qEj PEP.ȃyE E$HEMUP]  j/6EMp0e EP4MYMie EVPh'  j EPEPW4M 	uEM$E}d
d|AEMUP  jc6LEMp0e EPMYMe EVPh'  j EPEPWM 	uEM$E}d
d|AEMUP  UqM-E] UqME] UqME] UqME] UE+EPuhŝ] UE+EPuhŝ] UQQEe Ue SVuW} 3;UtCCPEPE+PQRt&tu@;Mu3_^[ jX3@UAPuuu] UAPufEYY] UAPuuut] UAPu[fEYY] UQQSVuW}]t4;ut*CPuE+PEVPxu3@uы]+_^[ ̋AU]USVu;utW}uPG;uu_^[] U]USVu;utW}uPG;uu_^[] UEI$] UEI$] UqM4E] UqME] ̃  U (03ŉEEUS]VuW} M}   ;U   E+|!EPSPR5}yLjXaECEEPSPEPȃMxϋE+;|=QEP7E;Ms3;MM_^3[" EECUEI ] UEI ] UqME] UqME] jL6MEM] EEEp0e EPMYM1p,EPhh 3E 9{t{rf f;Eu3EG;{s%{rpPEPYY
sF;srۃ{r+{VPM} E   uu؍Mu3̉AAEPXuuuMuuuuVM4, j`68ME uы}uE zEP3Az$Ɂ  sC
A{QQ؍E$hj(PoEyMUW   v0Me EPMYMu6j0q0 Mj uME"}ME   rMEQMȋ p,EPP M֋uMVSV3̉AAEPuMuuuuuW5Mt*  jL57fMEM] EEEp0>e EP MYMp,EPhh 3E 9{t{rf f;Eu3EG;{s%{rpPEPKYY
sF;srۃ{r+{VPM} E   uu؍M&u3̉AAEP!"uuuMuuuuV9M( j`7ME uы}uE zEP3Az$Ɂ  sC
A{QQ؍E$hj(P#EyMUW   v0MFe EP(MYMuj0q0 Mj uME}ME   rMEQMȋ p,EPP M֋uMVSV3̉AAEP^ uMuuuuuWyM('  UL(03ŉES]EVuWuvhpPWPEj@PPEPuVuuSWM03_^[ UL(03ŉES]EVuWuvhlPW PEj@PPEPuVuuSWM03_^[ j47M̋E}E3EЉEE   EЋw 0  #E   ;u_GVPSEȉMā    u=Au,EPQQ$Eȹ 3+iu  MȍA2j PMKwEj Puȃ}ErEEQQ$SQuPȃ}ErEЋuQPuWuuVuE r/M@ẺM=   rEPEPEYYMPQYYk$ j48eM̋E}E3EЉEE   EЋw 0  #E   ;u_GVPS$EȉMā    u=Au,EPQQ$"Eȹ 3+iu  MȍA2j PM wEjLPuEȃ}ErEEQQ$SQuP1ȃ}ErEЋuQPuWuuVu0E r/M@ẺM=   rEPEP)EYYMPQ=YY" UD(03ŉEES]VuWPh`Ej@P@PEPuVuuSWOM03_^[/ UL(03ŉES]EVuWu uvhhPWPEj@PPEPuVuuSWM43_^[ UL(03ŉES]EVuWu uvhdPW(PEj@P3PEPuVuuSWBM43_^[" jLM87	E}M]]G @  Mu&0EPQN$WuuS MV$k  w0ME3P]]YM]3]E   fE؀} EE   PtK SK SE EuMPiM]$ |  vw ;uv+u3G%  @t(VuEuuPu3PMUUM}Ã}]]؋sEuPRQEPuVuu@g  g$ PQVuMEf0} t5E]E   E=   rEPEPE]YYPSYY% UL(03ŉES]EVuWuvhpPWPEj@PzPEPuVuuSWM03_^[i UL(03ŉES]EVuWuvhlPWPEj@PPEPuVuuSWUM03_^[ j48M̋E}E3EЉEE   EЋw 0  #E   ;u_GVPS|EȉMā    u=Au,EPQQ$Eȹ 3+iu  MȍA2j PM5wEj Puȃ}ErEEQQ$SQuPȃ}ErEЋuQPuWuuVuE r/M@ẺM=   rEPEPEYYMPQYYU j48OM̋E}E3EЉEE   EЋw 0  #E   ;u_GVPSEȉMā    u=Au,EPQQ$Eȹ 3+iu  MȍA2j PMwEjLPuȃ}ErEEQQ$SQuPȃ}ErEЋuQPuWuuVuhE r/M@ẺM=   rEPEPEYYMPQ'YY UD(03ŉEES]VuWPh`Ej@P*PEPuVuuSWM03_^[ UL(03ŉES]EVuWu uvhhPW?PEj@PPEPuVuuSWM43_^[ UL(03ŉES]EVuWu uvhdPWPEj@PPEPuVuuSW}M43_^[ jL9!E}M]]G @  Mu&0EPQN$WuuS MV$k  w0ME3P] YMq]3]E   fE؀} EE   PtK SK SE EuMPM$ |  vw ;uv+u3G%  @t(VuEuuPuö3PMUUM}Ã}]]؋sEuPRQEPu=Vuu@g  g$ PQVuME[0} t5E]E   E=   rEPEPxE]YYPS茼YY j4]9Mċ]}E e ]Eȥfe 3E   fE̊E$fM E   ufM
ffMfE}ċ]j^j VM}ErEwMSQuP!Ѓu˃}M̋]}rM̍QM̄tMuAuRPSEr5M̍E   EȉM=   rEPEPEYYMPQ YY  j49Mċ]}E e ]Eȥfe 3E   fE̊E$fM E   ufM
ffMfE}ċ]j^j VMJ}ErEwMSQuPЃu˃}M̋]}rM̍QM̄tMuAuRPS	Er5M̍E   EȉM=   rEPEPEYYMPQ蝹YY   USW};}t&VQup քu;}u^_[] USW};}t&VQup քu;}u^_[] USW};}t&VQup քt;}u^_[] USW};}t&VQup քt;}u^_[] fAfAfAfAUAPuYY] UVu;utWyWPfYY;uu_^] UVu;utWyWP註fYY;uu_^] UAPuyYY] UAPuYY] UVu;utWyWPfYY;uu_^] UVu;utWyWPfYY;uu_^] UAPuYY] j93ۉ]u3^F   fE+E]E   t<ySP.~rFArWuuQP;FvuSP肫 j9:3ۉ]u3^F   fE+E]E   t<ySPK~rFArWuuQP
;FvuSPت UqME] UqME] U(03ŉEUES]VW3UEBEAPREWP1j_2EN+;}E3MGMH~VEP33M_^3[L U]USVu;utW}PFf;uu_^[] USVu;utW}PFf;uu_^[] U]̃y ̃y UyrABE] UyrABE] ̸  ø  UEfEf;]UEfEf;]UVuW u~ u39u9t9t_^] UVuW u~ u39u9t9t_^] UE9AryrA ] O	UEV9FrP`^] UEV9FrP^] 萿UVWur ֋E_^] UVWur ֋E_^] VWp$ _^VWp$ _^UVWu$u u7uuNuuu VE_^]  UVWu$u u7uuNuuu VE_^]  UVWu$u u7uuNuuu VE_^]  UVWu$u u7uuNuuu VE_^]  UVWu$u u7uuN uuu V E_^]  UVWu$u u7uuN uuu V E_^]  ̋A ËA UVWur ֋E_^] UVWur ֋E_^] UVWur ֋E_^] UVWur ֋E_^] UQSVWMW;r]wƋ]+;w8Gǃr+U4H^U   PVQSuV1uSQuS_^[ {UQSVWMW;r]wƋ]+;w8Gǃr+U4H^U   PVQgSuVuSQuS_^[ 腻UVWuup _^] UVWuup _^] UM3ҋ@If9u]UM3ҋ@If9u]UEPffu+]̸øøøUEPuu>E]UEPuuE]j@d:u3uIEtAuAPM艱jE؉EEE   j[Pòt:Er/M@EM=   rEPEPiEYYMPQ}YYtM\ UVWuup8 _^] UVWuup8 _^] UVWur, ֋E_^] UVWur, ֋E_^] UVWur  ֋E_^] UVWur  ֋E_^] UVWur( ֋E_^] UVWur( ֋E_^] UVWur ֋E_^] UVWur ֋E_^] UQQ;QsyBAr	fEfQ3fDQuuj UQQ;QsyBAr	fEfQ3fDQuuj UE;AwPu+AP] UE;AwP-u+AP] WG8 tG,8 ~O_BËVp ^_WG8 tG,8 ~O_BËVp ^_UE]UE]WGtG,8 ~_ËVp ^_WGtG,8 ~_ËVp ^_̋AËAUWG 8 tG08 ~O BEfVup ^_] UWG 8 tG08 ~O BEfVup ^_] VWp _^VWp _^VWp _^VWp _^UEf ]UEf ]UEf ]UEf ]UVWup  _^] UVWup  _^] UVWur ֋E_^] UVWur ֋E_^] UVWup0 _^] UVWuuup, _^] UVWuuup, _^] UVWup0 _^] UEPuu]UMtEЋW}f_E]UVuMPF;uuEMU^P]UQVuEE uPFPV+^UE ]UE]USVuW( _,tFFSj PkG~.wF Sj PNG~/HwF$Sj P1GF GF G_^[] U0SVEЋWP]蹲YjYM3SWP迦uMSWFQP覦SWh<F藦F_^[ Uuuhŝ@]UEM +]U])U]UE]UEPEP]UE]UE]UQQuEuuuPPEPUE]j:j MF5|S\Se uOMPuCt;uEPYYt8}}WEGYp ։=|SM賗7j:=j M5S`Se uMPuCt;uEPYYt8}}WE荬Yp ։=SM\}j%;胻j M5SdSe uMPMuCt;uEPخYYt8}}WEӫYp ։=SM?jc;ɺj M5ShSe u!MP蓨uCt;uEPYYt8}}WEYp ։=SM腕	j;j M^5SpSe ugMP٧uCt;uEPYYt8}}WE_Yp ։=SM.˔Oj;Uj M5SlSe uMPuCt;uEP9YYt8}}WE襩Yp ։=SMtj<蛸j M5StSe uMPeuCt;uEPnYYt8}}WEYp ։=SM躾Wj[<j M05SxSe u9MP諥uCt;uEPYYt8}}WE1Yp ։=SM 蝒!j<'uEFuEue F(A8 UE] ̃! UE] j <贶& uf uMF   ͵̑ UQEVuF`%FƉV^ UQEAM UQEAM UQEAM UQVujuuuh`^ UQVuj uuu8 ^ j<}uEFue f藐 UQEVuuFf 蕻^ VƬ^̋	̋	]Vv`	Y^V\^VA^V^VvY^UE	;] ̋ËË U	E+M] UE	M] UE] UE] UE)] UE)] UVPEt
jXVlYY^] UVEt
jV?YY^] UEVt
jVYY^] UEVt
jVYY^] UEVt
jV辘YY^] UVlEt
jXV舘YY^] UV3Et
jXVOYY^] UV赞Et
jDVYY^] UVEt
jVYY^]  j\;=}3ۋEEԉ]Ѕt{9uwjYu!]tBMԍEPxEE   r PMf j[`@FV37tM袝tM*3@j8=}3ۉ]tG9uCj"Yu!]tMDPMdCf 37tMjXj8=萰}3ۉ]tG9uCj蠢Yu!]tMPMCf 37tM胜jXsj8=}3ۉ]tG9uCjYu!]tM@PM`Cf 37tMjXj<W>茯}3ۉ]tc9u_jX蜡Yu!]t:MPMf C]SPE   ^(v`37tMcjXSj<>}3ۉ]td9u`jXYu!]t;MPM9f C]SPE   F( Р 37tM轚jX證j<?A}3މ]tI97uEjDOYEut$MsPMMCVP]]]7tM0jX j8X?躭}3ۉ]tS9uOjʟYu!]t*MPMf Cf P۳37tM衙jX葈j?)MEMp0e EP舲MYMu](} %u@ECj  p$Pu$EWuuuuuP M֋@ME6 td} uM6j up( M:uMMuCw8} uMMFHHt؍MĔEPMƽt뾃EPM豽tEMUPF$ UD(03ŉE}	EMSVEE W}MЉE3F	}cj^u3}  E̋E3ۉEQ,;}3 uEO@HHt貓uC赼tuЋ觼   ;   8Gu虐GEȋEj uȋ p( M<+uE<-uIE܍E݉E7;]}G uOGEȋEj uȋ p( M<0uCuЋtu؅~[0FuR uGEȋEj uȋ p( M֋u؍HЀ	w(;]}#E;sFu؋C藒uЋ蛻tuu܍E3Pj
EPE܉]P>ϋugtCE9Et} u;u|9u|E0M_^3[9h   @EM}@e EEEEtlHxp0蘪} tlE   PA؉]lE   P؉EYl3ɈMMMME   ME   p,hP ֋u3FF   x`3C]p0]`EP莭YE`pthh 3|  h +    #  Kt"H
  E||t  u3ΉE-EpEP Mց   ]]} E  M&E  }ErE8  3E؉EE   EPMEZu3聸   ]؉] utGPtEYY
sA M\\ }E}rÀ<0tJE؄t06}ErÀ<0 tD uGE:Eu*j M褽F]؉]軎u迷D]t$}ErE<0 M~FEMME}UUrUUuN      t}Er:0u"u}Er:|Uz ~BUEEr,@ME=   rEPEP:EYYMPQNYYEM.EEr,@ME=   rEPEPEYYMPQYYuMVψE菶/  8E&  8Gu耊G:E  QVWuE   ;    uBGPPtYY
    MLL»E݌u닋uVԵ*] uʉGXXtgYY
s, ˈTTOmVst];}EEuEMy u	ER;J}+j0uH,uVE pEP Mց   E} ]vPE pEP Mց   E	   }u]ru u衈GE8tE tM]轚E   tM؉]裚} tJ<EMQ p MƅD ED   MP]](E p EP Mց   E
} ]vPE p EP Mց   E   }u]ru u衇GE8tE tM]轙E   tM؉]裙} tV<EMQ p  Mƅd Ed    MP]](MPEE pEP Mց @   E} ]]t/E p EP Mց@  E} ]]tE @t㿍M]]̘E    tߍM؉]]诘} E+E"E pEP Mցˀ   ]]xuE@u+Vu8Gu}E؊OrE:u:|u;}w5Vӱu8Guх}E؊OrE:t
j M謦}uruu萱uC]}MrM؋E;t( uuG:uFJSPtË]}MrM؋E;tEEM=|uVE u:p uOCHHtEˇVѰtϋ]|h } ~EwMv}}uruEEFE}rE;t0uku8GuiG:u?MM}ErE;tuƃ~rf   } utj-jj xEr8M@xM=   rxPEPxYYMPQ'YY UM] j0APى]EPˏ,jYyu3uFFFFSPwE較FWj 2~( tG(G)Fx|f G.^ PG*PG+PS"G/N$PG,PG-PQ} t
$+xvF$u VFV^    j@A43uFFFuEPFIu UQVhENEPwuY^ jA軙j j ]3ҋ}BYYUt\\Su;jE請uYt!^`4FV3uVW~SVPWiE tM`Su)jIEYt!X 3VPW+S2VPWE  dSS  jEYt!X 3VPWҮhSj轊EYt`  3VPW螮lSjXE舊YuE   t%3FPuEF(s 3uMVWApS臿jXE+YuE   t&f j uEF(`3uMVWhSUVPWЭhSSVPW賭lSSVPW薭pSܾSVPWyE   tS贾uzjDUYEE   tSuv3MVPW*xSpjuYtf uf 93SVW.S/VPWӬxSS}VPW趬qUy( u(Ew Mw}wAkE<E	] UVutE MP!E@EuEMU^P]h   BEM\EtE<hlq0e `詖} t`EPU}`EP,EY`E *pEP ֋E03+x9}4wlǍM$+E4@Pj Rx}M}rM9t_MtM9 ~PM	}}Er}u4+x<t$~ ;su+M$jV ~G֋x3E؉EE   E؀}  EE0EPt#v, M֋EpE p !v( M֋EpE pEP ME EuMPMe e E   E hE@t4EMQ p ME EuMP蟦MǊ23ɈU35p tDt:t0KtHt089}4w+U4B33;E4UMMAtUFrhx$ |x  vp ;v+3@%  d@t3=   uu(VtEuuP3PMUUM3Ep z  W  +  KtH}    u}8E$rE$u4PRQL   9}4welMyMePMh+E4PlDuuP	}8PE$MUrE$u4PRQ<~E4+ǃ}8}$|xr}$|xP|4RQPz@MMEPM}8M$rM$E4+WPu,uP4   }    }ErEjPRQ$σ}ErEuPRQjtRQPPMUd   u%VtTRQP3PUME@EEv.}xErEW@PRQTPbPMUhVt\`  `$ RQVZEԃ   r5M@E|;rEP|P_EYY|PQpuYYe EE   E r5M@E|;rEP|PEYY|PQ$uYYe ME   E M$8 UVutuMFuEMU^P]Vv}vuvmve^VvKvCv;^Uyr	E] UVWur ֋E_^] VWp _^VWp _^ UAPuuuuȃy3] UqMvE] ̋AÊAËAUVu3uΉFF,^] j4aB说U(E ]u$UURPuEPEPEP4{e EPM/t} t7}}r}̃e EPj EPW9}t} uE؃MUM̉S!$ j0BݳEU]$}(REċE PuEPEPEPbzE܍ME3EuPVt9uuV]ȋVSdjZE9UrÈ8-u39WrE3F E9UrE0L9Wr0F;r܋]ċMUM̉S%$ jB ]Ms0輋e EP`MYMEbu 3M(UjXa  ^  R      AF  A     tvt_ta  uE$Pj;OuEPjjEPEPW΂ȉ  ME$#MH  uE$PjR  h(  uEPjcREPEPWpȉf  EkdE$HR  h`J  StUtFt0+t,t8  u$EVSuuuuPVDuE$Pj5Xhl   uu$j<Au$EVSuuuuPC@ME  n   f  b      tfta   +tC   uEPjjEPEPWSȉI  E$MIH:  uE$Phn  uE$PjjEPEPW	  hu$EVSuuuuPΥu$EVSuuuuP7bp   +ty+tktUtFt   uEPjcREPEPWuȉuoMEdh|SuE$Pjh88hL.Rh<REPEP0y~E$@EPMtEMUPa( jCOى]EMp0e EP謊MYMu謪[|؅uj[EPM萖}    UuMjUMFHu#E$MPWuEuuRuP_j[qu*uu$EVjjPEPu~	urE$uVPjSEPEPu}	KMPWuEuuRuP@EM#} uMiMFHHtMlEPM葕t͍EPM聕u88EuM~ij up( M<:t<,t</uM7lEPM9u9}} uM2iMGHHtMlEPMt͋} EPM   8EuMhUMBHu@u	   u$MEWuuuuuP^@MEuUj[Pt(t#E$RPjjEPEPuU|	#u$ERVjjPEPu2|	EPM*uu08EuM$hMFHHtMjEPM̍EPMu88EuMgj up( M<:t<,t</uMjEPM蟓u9}} uMgMGHHtMgjEPMit͋} EPMVt   } uMJgUMBHu&uu$MEWuuuuuPv\qu%u$ERVjjPEPuz	Ru#E$RPjjEPEPuz	*u$MEWuuuuuP؆@EMEPMytEMUP\  Uj qEj PEP7ȃyE E$HEMUP]  jKCLuEMp0e EP詄MYM謤M$ESQjj PEPVx} 	uS} uMdj up( <:u+MJgE$SPj;j EPEPu1x	uN8EuM-dj up( <:u'MfSu$Ej<j PEPuw	EMUPwY  Uj qEj PEP{ȃyE E$HEMUP]  jC}EMp0Le EPMYMe EVPh'  j EPEPWvM 	uEM$E}d
d|AEMUPHX  UqMqgE] UE+EPuhŝBs] UEI$] UqM gE] ̃ UEI ] UqMfE] j@CMEM] EEEp0}e EP茁MYM菡pEPhh 3E 9{t{r :Eu3EG;{s%{r0PEPYY
sF;srۃ{r+;VPM]} E   uuM迒u3̉AAEPtuȋuuMuuuuV轰Mr蔻 j`D蘣ME uы}uE zEP3Az$Ɂ  sC
A{QQ؍E$hj(PϤEyMUW   v0M{e EPMYMu薟j0q  Mj uME}ME   rMEQMȋ pEPP MuMS!u3̉AAEPruMuuuuuWM?qֹ  j,IDɡًE}e EȡE}̈Ee E   E E$E   uE E	EE E}j^j VM}ErEsMWQuPNu̓}uЋU}r4	EЄtu}@uVPWQEr/M@ẺM=   rEPEPԊEYYMPQ]YYk  ̊AjDw3ۉ]u^F   E]E   +Et?ySP"~rNȃ~rWuuQP{;FvuSPcR UyrIȋE] VWp$ _^UVWu$u u7uuNuuu VE_^]  UVWu$u u7uuNuuu VE_^]  UVWu$u u7uuN uuu V E_^]  UVWur ֋E_^] UUIfEfQ] UVWuup( _^] UVWur, ֋E_^] UVWur  ֋E_^] UVWur( ֋E_^] UVWur ֋E_^] VWp _^UVWup  _^] UQSVW}u}E FP谧Yu-t	+t+FuuWVňM;7u;uu+u=w-u0=   v'j~ "   Et    3-_^[Uj uuu-]UE3ɉMtS]VWFP迦YuE<-t
<+tE+F}  
  $  ~uM>0uHF<xt><Xu=8<0tj
_uF<xt <Xtj_uF<0t3ɉuىM$j_u]*߉EFWPqYPPݜu9uuEtoMh8++Mx:E+;r3ҋ;Et| "   Et    }-uۋMt1Et3_^[Uj uuu薋]UQSVW}u}E FP٤Yu-t	+t+FuuWV*ȋE;7u;uu7+uw*rw#-u   3;rw;wڋ_^[3   i{ "   Et    -tƋUj uuub]UEt  S]VWFP輣YuE<-t
<+tE+F}a  X  $O  ~u1>0u,F<xt"<Xu!>0tj
_F<xt<Xtjj_Ɖu F<0t3ɉuىMMM.ElSPj *ʉEW]M^cȋEFWPMRYPlP辙ȃu9uuM   E   ++Mx[8EMM)EE;rEw;rj WuP;Eu;Ut~y "   Et    }-Eu؃ ۋMt1Et33_^[UE]UE]UUR]UE tttt]UQQ)M} ttttEU UQQEUEUm9E UQQEу t:tttEMEMm:E"EMEMmEMEMm: UMSVuWyyq  ʚ;qxyq ʚ;;r 6eċqǃ q;}AE+p+X;x}  ʚ;Yq|ru! a a _^[]UEPʅy  ʚ;ʃPxHV ʚ;;r P +;}H^]UQQEPpEUUQQj S腇uEPpEUEUm=SU(03ŉEVuEjP2JEPVsM3^kU VWuEuP}@B E?B iM  _^UQQEP[U3EY - >ՁޱUQ} t
}uEUQQSV(Sj h RP1N][ukdVF^[UQQVuWu.}t'S~Sj h RPM][kdW[G3_^VhphVphVSph VSphVSph VSphDVSph\VSphpVSphVSphVSphVSphVSphVSphVSph0VSphHVSph`VSphVSphVSpShVphVSphV TphVTph0VTphPVTphxVTphVTphVTphVTphV TphV$Tph,V(TphLV,TphhV0TphV4TphV8TphV<TphV@TphVDTph HTVpLT3^Uup]Uu(q]Uu4q]Uuq]Uuuuup]Uuuuuuup]Uuuu<q]Uuuuq]Uuuu,q]Uuuuq]Uup]Uup]Uup]Uuup]%pUuuq]% qUuuuu8q]UV5Tut q^]%qUuuuup]Uup]Uuuup]Uup]̋ 0yyȉ 03Uup]Uuuuup]Uuuuu q]Uuuu0q]Uuuup]Uuuuup]Uuq]UV5,Tu ^]Uuu$q]Uup]Uup]UQe V5 Ttj EP փzu3@3^UE] UEtUL tu] UVu3PPVPuPh   pP6^] %@qUE] UE] ̋t8  uPvỸ9 ËUEH;#]UEtM]U(03ŉESVuW~VuXY;Yp|39E$j j Vu   Pu p}^  ?H;#<  =   wVf܅t  PBYt	  ]  WSVuju p   3PPPPPWSuuDq      Ut0E   ;   j j j PuWSuuDq   6H;#ts;wet  PAYt	  }tCj j j VWuSuuDqt'3PP9EuPPuuVWPu pe Mhe 3Mhƍe_^[M3V`UEt8  uPgsY]VgPt	R(MYЋ^UESVu+uW}+}ugXyX u-;|PuuMuB;t>;E0PWuVuh   Soui    _^[]UQe EjPj"gpHqE0ttt3j3@jXUEVu+uW}+}uf@u-;|Puu;uA;t=;E/WuVuh   Pmuh    _^]UMVWtUE+48f;uu3_^]@Uu2qY] UE] V6q& Y^̃9 ËÃ9 V6p& Y^UQEU+MS]+]WEuReUHEIMu;wPuR艊mVP=YtWuVSuh   uuu#PPSuh   uuu3ɅtU1fJA;rVpY^_[UQEPjEPjLqf#EUuM+MQujLqE]UQfM  fMf;tEE   @uf;sAfw(f "jMQjMQRPtfMtfMfUQfM  fMf;tIE@u   f;sAfw,f &jMQjMQh   PJtfMtfMfUQQMSVu+uW}+}uc@E݅ȉEEA	EMuu;wVuu?AjQj j Vuh   PT t$;EjuWuVuh   PjT _^[U4(03ŉEESVuW}E̋EuE~WVPYEY	  ]~SPOYY	  t   ;     EEPu Tq  ~4}r&} EtHt:r:  8 ujX  ~7}r)} Et }Ht:r:O  8 u3@H  3VVWuj	u pE؅(   Q;#   =   w]ĉE܅t"   P9EYt   E܉EЅ   uPWuju p   }VVSWj	u pE    Q;#tk=   w]t  P>9Yt	  }ԅt7uWSuju pt VVVuWuuuuPquԍM>`uЍM1`	jy3e_^[M3WUVu~VugYYE~PuqgYYtt3QQQPuVuuuPq+uj^	^]UVu~VugY;Yp|3PPPuuVuuuDq^]UujYtu@7Yt]Ã}'
HUu^AY];(0u2vDfD̃=dX|$XU<$D$L$f?ry6f@sff>@3+3wy=   uXɸ   ̃=dX|>z,wPv ̃$$vL$3XU<$D$L$r"f?r"y&f@sff>@f?s3Xɸ̃=dX|̃$$T$U<$$T$L$f?r6yUf>@s5ff>@؀ r3f|$ }؃ 33ÍU    wuf|$ }Xɺ   3̃=dX|Cz0wTv1̃$$T$vL$3XU<$$T$L$r.f?r.y4f?@s-ff>@؀ r3f?s
33XɸZtPrYUEVH<AQAk(;tM;Jr
BB;r(;u3^]Ë:UEt&MZ  f9uH<ȁ9PE  u  f9Au]2]d   VaZt d   tTP;t3u2^ð^$Zt ZZsPrYt20:j LYLiu2ouIEYIUYu}uuMPu UuuSYY]gYth|T<Y`j JYjU} uxT!You2]9pu
j ,Y]U=yT t]VutubXt&u"h|T*:YuhT:Yt+20|TTTTTTyT^]j[jhX?e MZ  f9   u]<     PE  uL  f9  u>E   +PQYYt'x$ |!EE 3Ɂ8  ËeE2Md    Y_^[UWt} u	3tT]U=xT t} uuIu3+YY]U=|TuuNFh|T*YY#E]U=Tu]	2uhT*YY]UubYH]~9̃=dX|b~xf~r=   s,=   s=   r,`̃=dX|   b}x~yf~r3=   s,3=   s%y3Ë3=   r,`̃=dX|   b}z~yf~=   s,=   s3+ux,`   3̃=dX|bxË̃$$T$r-  As,Á  As' t,dÁ  ?s,3,`3H̃=dX|~bx~yË̃$$T$rJ  As,3Ë 3  }S3t,d[ÃsÁ  ?s	,33,`3H̃=dX|~bz~yË̃$$T$Ɂ  As<,Ë 3  }S3t,d[Á  Cst؃ wt,`   3̃=dX|ny"bzW*XhtW*XhYpX̃=dX|ny"bW*W*YpXhXUEVt
jV/YY^] WVS3D$}GT$ڃ D$T$D$}GT$ڃ D$T$uL$D$3؋D$A؋L$T$D$ud$ȋD$r;T$wr;D$vN3ҋOu؃ [^_ WVU33D$}GET$ڃ D$T$D$}GT$ڃ D$T$u(L$D$3؋D$d$ȋd$G؋L$T$D$ud$ȋD$r;T$wr;D$v	N+D$T$3+D$T$My؃ ʋӋًȋOu؃ ]^_ ̋D$L$ȋL$u	D$ S؋D$d$؋D$[ SW3D$}GT$ڃ D$T$D$}T$ڃ D$T$uL$D$3D$3OyNS؋L$T$D$ud$d$r;T$wr;D$v+D$T$+D$T$Oy؃ _[ SD$uL$D$3D$3Pȋ\$T$D$ud$d$r;T$wr;D$v+D$T$+D$T$؃ [ UE t3t tt3@0b:\uu,   Y} Pa  Y] jhxA5j 1kY   pE]e =pT    pT   2tMo /uGhdwhHu,YYu)UCt hDth p!}YYpT   2ۈ]E=   uC%> tV>Ytuju6 T3@]ufIY3Md    Y_^[jOjh3T3iHT3G}e 2oE}=pTuk::aK%pT e 9   j uIYY#uE"   ƋMd    Y_^[Ë}ulHYËut'jOjh3}u9=T3   e t
t]1]SWu  u   SWuu   SWutOuu'u#SPu\OPYSVu   tuHSWuut5SWu   $MQ0h"uuu6Ëe3uEƋMd    Y_^[UV5u3@uuu ^] U]U}uuuuW] ̋Md    Y__^[]Q̋M3CA̋M31APd5    D$+d$SVW((03PuEEd    Pd5    D$+d$SVW((03PEuEEd    Pd5    D$+d$SVW((03PeuEEd    Pd5    D$+d$SVW((03PEeuEEd      UE ]UE ]UE++;w]UE++;wjAY)]  UE++;w=T tV5Tu Y^]UE++;@]UM+E-@;Ev++;w]UM+E-@;Ev++;wjAY)]  UE+E-@;Ev4M++;w=T tV5Tu Y^]UE+E-@9E]̋ 3CT SVD$uL$D$3؋D$Aȋ\$T$D$ud$ȋD$r;T$wr;D$vN3ҋ^[ VD$u(L$D$3؋D$d$ȋd$Gȋ\$T$D$ud$ȋD$r;T$wr;D$v	N+D$T$3+D$T$؃ ʋӋًȋ^ QL$+ȃYJ'QL$+ȃY4'UMHThEPq|UMU#h@EPM|PUj \quXqh	 `qPdq]U$  jhqtjY)UUUU5U=UfUfUfUfUf%Uf-UUE UEUEUT  UTT	 T   T   jXk ǀT   jXk (0LjX $0Lh {Ujt]U  jhqtM)UUUU5U=UfUfUfUfUf%Uf-UUE UEUEUUTT	 T   T   jXk MThzU   jhqtM)UUUU5U=UfUfUfUfUf%Uf-UUE UEUEUUTT	 T   } v
} ue }vEHEE@TjXk MTe E@EE;EsEMUThxU%dX $P0j
hq  e 3SVW3ɍ}S[wO3ɉWE܋}EntelE5ineIEE5GenuE3@S[]܉EsEKSuCE%?= t#=` t=p t=P t=` t=p u=hX=hX=hXMjXM9E|/3S[]܉sKMS]   t=hX]P0dX   P0      dX   P0   ty   tq3ЉEUEMj^#;uWP0dX   P0 t; dX   P0  #;uE   M#;uP0@5dX_^[33@39kU$  SjhqtM)jZ$  j P6|xffftfpflfhEEǅ  @jPEj PK6EE  @E   Elqj XۍEEۉE\qEPXquujYY[UDjDEj P5EPpqEtEj
X33j pt4MZ  f9u*H<ȁ9PE  u  f9Auytv    t2h!g \q3UVW}7>csmu%~uF= t=!t="t= @t_3^] "0wm0̃%pX h Id5    D$l$l$+SVW(01E3PeuEEEEd    ̋Md    Y__^[]QUe Ee PqE3EEp1Etq1EEPpEM3E3E3̋(0VWN@  ;tu&;uO@u
G  ȉ(0_$0^3@ hxXxqhxX8_Y̸X`H$HhHH̸kSV@@;sW>t
 ׃;r_^[SVHH;sW>t
 ׃;r_^[QL$+#ȋ% ;r
Y $-    UEM]UE ]UE ]̡XVCNt
 xTUEX]WVt$L$|$;v;        s%P0    %hXs	D$^_Ë3Ʃ   u%P0  %hX             svs~vf   te   foNvfo^0foF fon0v00fof:ffof:fGfof:fo 0sv   foNvI fo^0foF fon0v00fof:ffof:fGfof:fo 0svVfoNvfo^0foF fon0v00fof:ffof:fGfof:fo 0svrovfsvs~vf$   tI   uу   $$$44<H\D$^_ÐD$^_ÐFGD$^_ÍI FGFGD$^_Ð4< Q  %P0      t׃+ʊFGNOu   $D$^_ÐFGD$^_ÍI FGFGD$^_ÐFGFGFGD$^_   tINO   u   rh      ooNoV o^0of@onPov`o~pOW _0g@oPw`p   u r#  ooNO ututuD$^_̋ƃ   уtf$    fofoNfoV fo^0ffOfW f_0fof@fonPfov`fo~pfg@foPfw`fp      Jut_t!    ooNOv  Jut0tuȃtFGIu$    I D$^_Í$       ++Qȃt	FGIutvHuYWVt$L$|$;v;        s%P0    %hXs	D$^_Ë3Ʃ   u%P0  %hX             svs~vf   te   foNvfo^0foF fon0v00fof:ffof:fGfof:fo 0sv   foNvI fo^0foF fon0v00fof:ffof:fGfof:fo 0svVfoNvfo^0foF fon0v00fof:ffof:fGfof:fo 0svrovfsvs~vf   tI   uу   $$(<D$^_ÐD$^_ÐFGD$^_ÍI FGFGD$^_Ð4< Q  %P0      t׃+ʊFGNOu   $D$^_ÐFGD$^_ÍI FGFGD$^_ÐFGFGFGD$^_   tINO   u   rh      ooNoV o^0of@onPov`o~pOW _0g@oPw`p   u r#  ooNO ututuD$^_̋ƃ   уtf$    fofoNfoV fo^0ffOfW f_0fof@fonPfov`fo~pfg@foPfw`fp      Jut_t!    ooNOv  Jut0tuȃtFGIu$    I D$^_Í$       ++Qȃt	FGIutvHuY̋L$D$׋|$<  i          %hXs	D$%P0   fnfp +ρ   vL$    $    ffGfG fG0fG@fGPfG`fGp       u%P0s>fnfp  rG   s   tb|GD$   tG   u   tt $        GuD$U],5Uu!5Y] Uu5Y] UUME]UE ]UE] UE] V64& Y^V64& Y^̃9 Ã9 ø0ø;UuY] Uu_4Y] ̋! ËËÃ9 Ã9 V624& Y^V64& Y^UEM;u3]Ã:utP:Quu]UuqtV0P3Yu^]UMŝ3iГ Au]UM   SVh (  h;h03ۍASPSt~΍QAu+tF8 uHuAEWPY Yt=VuG}PE<VMU3
tuu|q]W2Y_V2Y^[Uun2Y] UE] V6J2& Y^̃9 Ë! ËÃ9 V62& Y^UW} tHtBQAu+SVYSAYt7SV0UE΃3@V1Y^[MA _]UVu~ t61Y& F ^]UESW} Et-tVQp ΋x ^t
t @EEEPjjhcsm]}q_[ UE@AE@AQ] UE]UEEA] UQEMSVXWx׉Ux-kË]t<J9X};~uuIUyB;w;wEM_p^PH[?Ue E3(0MEEEE@EMEd    EEd    uQuR(ȋEd    U@S}#  uM3@   e Ei(0M3EȋEE̋EEЋEEԋE E؃e e e e܉md    EEd    E0WYME   EEEE@E EMUEEEPE0UYYe } td    ]d    	Ed    E[UQSEEd    d    E]mc[ UQQSVWd5    uEhj uuuqE@MAd=    ];d    _^[ UVuN3j Vvvj uvuf6 ^]UMVukH$N`p$^]UVFu;p$uv6p$^]+H$;tHt	F<UQSEH3MNE@ftE@$   3@ljjEpEpEpj uEpuv5 Ex$ uuuJj j j j j EPh#  E]ck 3@[USVWE3PPPuuuuu4 E_^[E]USVWE3PPPuuuuu4 E_^[E]USVWE3PPPuuuuu]4 E_^[E]UVuVvv(j v^] jhEt~8csmuvxupx tx!t	x"uUHtNQt)e RpSE1uun   YYËet@tQp ֋Md    Y_^[UMU] U} t2VW}7>csmu!~u~ t~!t~"t_^3]pwp3̍AU@$tM9t@u3@]3]UEX]UMUVqxI
^]UVuW>?RCCt?MOCt
?csmtYx ~NH_3^]@xv5pVUQQVu& @t/Ht(t
@ @e EEPh<QYY3^UE       8csmu~xuxx tx!t	x"u]@SVW@p~?}W@:utZ:Xuu3tI3_^[]3@7̋D$StRT$3ۊ\$   t
2trt2   urWߋ_t
2t@u[Ãr
3˿~3σ tJ2t#2t2t2t_B[ÍB_[ÍB_[ÍB_[UEE +t3E]UMU;tRV+uqB+uqB+t3ɅMIB+t3E^]3]UMt3E]UMUff;t:V+t3ɅMIB+t3E^]3]US]V q  Z  7    U  uW   ;tT+u~B+u~B+t3ɅMNB+t3E.  F;BtUB+u~B+u~B+t3ɅMNB+t3E  F;BtUB+u~	B	+u~
B
+t3ɅMNB+t3Et  F;BtUB+u~B+u~B+t3ɅMNB+t3E  F;BtVB~+u~B+u~B+t3ɅMNB+t3E  F;BtUB+u~B+u~B+t3ɅMNB+t3E\  F;BtUB+u~B+u~B+t3ɅMNB+t3E  F;BtUB+u~B+u~B+t3ɅMNB+t3E  j Y+;	$52F;BtUB+u~B+u~B+t3ɅMNB+t3E)  F;BtUB+u~B+u~B+t3ɅMNB+t3E  F;BtUB+u~B+u~B+t3ɅMNB+t3Eo  F;BtUB+u~B+u~B+t3ɅMNB+t3E  F;BtVB~+u~B+u~B+t3ɅMNB+t3E   F;BtQB+u~B+u~B+t3ɅMNB+t3Eu[F;BtQB+u~B+u~B+t3ɅMNB+t3Eu3ɋ_  F;BtQB+u~B+u~B+t3ɅMNB+t3EuF;BtUB+u~B+u~B+t3ɅMNB+t3EBF;BtUB+u~B+u~B+t3ɅMNB+t3EF;BtUB+u~B+u~B+t3ɅMNB+t3EF;BtUB+u~B+u~B+t3ɅMNB+t3E+F;BtVB~+u~B+u~B+t3ɅMNB+t3EF;BtUB+u~B+u~B+t3ɅMNB+t3EpBN+`3EMF;BtUB+u~B+u~B+t3ɅMNB+t3EF;BtUB+u~B+u~B+t3ɅMNB+t3EF;BtUB+u~B+u~B+t3ɅMNB+t3E6F;BtUB+u~B+u~B+t3ɅMNB+t3EF;BtUB+u~B+u~B+t3ɅMNB+t3E|F;BtVB~+uB~+uB~+t3ɅMBN+t3EF;BtUB+u~B+u~B+t3ɅMNB+t3EfFf;B  F;BtVB~+u~B+u~B+t3ɅMNB+t3EPF;BtUB+u~B+u~B+t3ɅMNB+t3EF;BtUB+u~B+u~B+t3ɅMNB+t3EF;BtUB+u~B+u~B+t3ɅMNB+t3E9F;BtVB~+u~B+u~B+t3ɅMNB+t3EF;BtUB+u~B+u~B+t3ɅMNB+t3E~F;BtUB+u~B+u~B+t3ɅMNB+t3E!~B+uB~+3ɅMM1+uqB+uqB+t3ɅMIB+t3EVMu+uQF+t3ɅIF뾋Mu+uIF뤋EE 3^[]Ëv),.W1)+Z.0(M+-0f(*-?0	(*B-/'6*,/O'),(/&)+,.UMUSVW}   ;tT+urA+urA+t3ۅÍ]ZA+t3E  B;AtUA+urA+urA+t3ۅÍ]ZA+t3EB  B;AtUA+ur	A	+ur
A
+t3ۅÍ]ZA+t3E  B;AtUA+urA+urA+t3ۅÍ]ZA+t3E  B;AtUA+urA+urA+t3ۅÍ]ZA+t3E+  B;AtUA+urA+urA+t3ۅÍ]ZA+t3E   B;AtQA+urA+urA+t3ۅÍ]ZA+t3EuuB;AtQA+urA+urA+t3ۅÍ]ZA+t3Euj [+;$<D
  B;AtRAr+urA+urA+t3ۅÍ]ZA+t3EuB;AtUA+urA+urA+t3ۅÍ]ZA+t3EBB;AtUA+urA+urA+t3ۅÍ]ZA+t3EB;AtUA+urA+urA+t3ۅÍ]ZA+t3EB;AtUA+urA+urA+t3ۅÍ]ZA+t3E+B;AtUA+urA+urA+t3ۅÍ]ZA+t3EB;Al  A+urA+urA+t3҅URA+t3E    B;AtUA+urA+urA+t3ۅÍ]ZA+t3E	B;AtVAr+urA+urA+t3ۅÍ]ZA+t3EB;AtUA+urA+urA+t3ۅÍ]ZA+t3ENB;AtUA+urA+urA+t3ۅÍ]ZA+t3EB;AtUA+urA+urA+t3ۅÍ]ZA+t3EB;AtUA+urA+urA+t3ۅÍ]ZA+t3E7B;AtUA+urA+urA+t3ۅÍ]ZA+t3ERA+]3EJB;AtUA+urA+urA+t3ۅÍ]ZA+t3EZB;AtVAr+urA+urA+t3ۅÍ]ZA+t3EB;AtUA+urA+urA+t3ۅÍ]ZA+t3EB;AtUA+urA+urA+t3ۅÍ]ZA+t3EBB;AtUA+urA+urA+t3ۅÍ]ZA+t3EB;AtUA+urA+urA+t3ۅÍ]ZA+t3EB;AtUA+urA+urA+t3ۅÍ]ZA+t3E+fBf;At#rA+73҅U3B;AtVAr+urA+urA+t3ۅÍ]ZA+t3EB;AtUA+urA+urA+t3ۅÍ]ZA+t3E<B;AtUA+urA+urA+t3ۅÍ]ZA+t3EB;AtUA+urA+urA+t3ۅÍ]ZA+t3EB;AtUA+urA+urA+t3ۅÍ]ZA+t3E%B;AtUA+urA+urA+t3ۅÍ]ZA+t3EB;AtUA+urA+urA+t3ۅÍ]ZA+t3EkrA+:E3_^[]Ë3D>^AD;R>AC^;=@dC;=G@C:;=?BG:<?MB9</?A9#<>Au2Ouj 2YU} u
]  UVuW}tN38FN38_^]US]VWE 3E   (]Cs3(0VPuEuKE{@fuZEEEECtiMGGHEtMxHMuɄt. E    th(0VWVuE_^[]ËE8csmu8= t/ht5ju ֋uEME9xth(0V׋EVuXsM֋I	UV3MFt8t@< ut	PQ^] UEAEA] UV3MFt8t@< ut	PQ*^] UVXW}WF~tWuP߄  f _^] UV3MFt8t@< ut	PQ^] UVXW}W<F~tWuPP  f _^] UE@AA] UE@AA] UE@AA] UVW}t)jXtH  Hx& F_^] UVW}t)jX<tH  Hx& F_^] UVW}t)jXtH  Hx& F_^] UVW}t)jXtH  Hx& F_^] UVW}t)jXItH  Hx& F_^] US]VWtQ}~JǹXtjt( Xxjt Hƃ  FF_^[] UQS]VtX} ~REXtjdt,E uuSjEt H3u
FF^[ UQS]VtX} ~REXtjt,E uuSRjt H3u
FF^[ UE]jXjAXA A A Ã! USVW}& f tY3ۋ:Et" uX   t,CBuSQrt@:Mt& FF
~ uF_^[] UEV& f x ~
p0 ^] UUBA] UVu& f ^] USV3ۉ^9]t'jXtu؅$ÉF^[] UEVf t	t3ȃ& NuP YuF^] ̃! a U,(03ŉEU3ɉE܈MMHVuW};|;s
ESSQj
RWN][0j Yu[8MtN-M+QMV/#ME3_^ U$(03ŉEUS]VE W}& f Sj j
RSO][0uM+QW"M_^3[ ̃	XU	Q,
EXXEXEX3XXXXX] ̋UEA] UEtPtu3A] UEIAEA ] XU} Xut ]B	]UEV& f p0^] UUBA] UVu& f J^] UV& f } t%jXtuJu	& F^] UEVf FuPYu	F& ^] UU	w)9t;TE
JHE` @E` @  ] ̊AËUQQuMuuEUQQue Me uMuEUQQuMuuEUVuuIN`^] UVuuIN^] UVuuIN^] UVuuIN^] UVuuIN'^] UEUI+MH] UV~EW} ~:> uW-jX9tW HP3P_^] UV~D> MuuAP5(AFuAtPDPۻ^] UV~BS]t9> u& f S%jXZt X3P
[^] UV~QW}tHS39uW8Gt<tP}"jXt
WxS[_^] UV~-> EttttPYPl	P^] UV>	t,W}? t"jX7tOHD_^] UytE@<~A] UEU]UEEA3AAA] W t-GGt#VOwQΉG ֋GGYu^_UE]UUXШՠդu]U   X+XSW3E}}U3@
tB   Eu}  uEx@8    uRPuɸE    uEJH  V   u  ˋÁ   M   u%   ]e   E%   ]e   Et%   =   9  %      uUUȋU	uuȋu9}t=     =      @  tRXEXPt! PEj P#@ME YPMUMEuEȁ   tu9}       j{E̋PEWPUYYEPEPPMEP   Y5Xu8EEPEE   j,PnMQMQPMEEPME   EPYXШ  Ш    EPEj PMj QMQMQ@Ma     }̉}Љ}}}}}ȉ}}};tƋ      ;uu   uGEjPEE̋EEЍEjPEEEEEjPEEE#;u =   uEjPEYEEYEEjPE   YYMEȋEE;u:   t2X`<`EPtY@MEYPM7XШEPt,t".YMQMQ_ @MEYPMEt49}t&X   uPEj PCMPn	@ME}}9}t3EWPyPEj PMP6X   t3  jXt8xEWP/YY@MEE   ;u        ;      uoEEPME   MQMQ=j,EPMMQxQj,MQMQMQMj,Q>;uJ   uBEEPME
   NMQMQj,EPMPMEE,PME
   z	EȍMEEEEPEE   T	EPM=Xu=X uEXEP"PEj(PTMj)QPMr}   u%   =   tEPMOXШEPtYPM.YPMeEP蠿YPM
XШEPtHYPM7YPM EPFYPMXШttEEGEEEE}  RM |  uw#= h  t^= p  tW= `  u^EMEEj{EE   EEWPYYEPEPMMQu9'EPu%   ;uEPunYYEW  }܋Ӆt   3    `   `  j X   Uˋt%      E܉M%      M܉Et.Ë%   -   @ɅtE<E       3t   EuEt+Ë%   -   @ɅtEdE0   N3t   EuE   Ë%   -   @Ʌt}EE/   EPM;tu3   EuEtc3   ρ   Ʌu3ρ   Ʌt1EPEj P,u% |  = x    39E댍EPEPôYY@EMt3   ˁ    `  ˋ `  j X   M  X	Шj  3t   tGt%   =   u9EEPME   MQMQEEEEt%   =      E3Ɂ   E3Ʌɋt         3Ʌt   Ë% `     ɉEt      tP   Åt%   -   % `  @t   t 3t   9Et=   u5EEPME   MQMQEEEEXШ   M3t   t.3҅t$<@   tEE	      3t   t+3҅t$<   tE E   I3t   ɋ   tLtj X3t5EE   EPMMQMQEEEE3t   9Et%   %   tAX   u5EEPME   MQMQEEEE   t5EE(PME   MQMQPEEEEEMMH^_[̡XЃ̡XЃ̡XЃ̡XЃ̡XЃ̡XЃ̡XЃ̡X	Ѓ̡X%   ̡X%   US]Vt$jXt X& F^[] ̡XЃ̡XЃ̋X3``̡XЃ̡X%    ̡XЃU졨X8 uMjvEV3Mj&uuEPYPMXE9@uAXMMH	p@0^USVu3CW& f X<@   <Z   t3j,X   Ѓ	w!APEXXP迴PYe Ee PEPQX+YY~X9	t	EP&EPX;uf & FX~ 8 ~> th`j1_^[U졨XX   I   EPkUYu~Xts@thZtE`   @@XXШEtEE   EE   PEPMU
HJ@XEMP@XXШEtEhE   'EE
   @EXEE   MP%EU졨X8 uMj8EÍEPYj[M!EPYPMtj]MXE9@uAXMMHÃ`   @U졨X8 uMj蚩EÍEPYj{MQn2t
j,MpEPYPMX8@u/@X8@t@Mj}X4EMMHËE`   @U졨X(8 VW@        S]3uuC   tEEPME   @Ot?X8 t5EVP=PEj[PMj]QGPM}~93tKC   tEPEP&SEj(PTMj)QMQMQM@EEPEPEUYYM   P[;3j[Muu jEPMMj]QPuEYY_^ËE390tPEElj(PE   MQMQjMQMUj CYEMEUPNXt[AX0t0HtuKE`   @ÍEPYPM&EEPME   W
jMEE8PME   1EMMHUXSVW  j^3AUXUj	_X      C   Xx$4xEE   EPM   EE   E E   EEE   EPMƱ}  EETPME   觱EEPME   B5  EE   롃_tiAXEP藟YPMUp  2Ct*+t+t+t+t      E	      EE      AXUM  U  G/        $             EE   EPM萰EEt+t+t+t+u1}E\EPMbMQMQEEEEE8 tPEj PܽMPEMMHU  E$E   buEEPE   PEPu  XMjp*E,Ht7t2t!tEPE   EDE8N$lxj[3ҋEUU@MEuK   ƉEERPEPEPUuEEPME   fUM  ubt:EEPME   ®t:EEPME	   tEE|PME   脮jEPEPu   EE   E\}EhEtEEuEEE   `EXP'YPMUIEPujuE_^[Ðssst
tCt)t_t|t   I wvwwwwww@uwwwUSVEWP腘} YubXtXX~Fu+;s@}E$$h _Gu+EWP
PtF;r]t;Er3_^[ PX
؅t5X5XSWEPXPX+XFVP9P$Uj u%EYY]U졨X   ɃA@X   Xe jZUtmw.t( t+t+t+t+uNj2j.j*R'j#jt+t+t+u&j

j	jjEEYPMU&EMMHËE`   @ËMjwEU   X3SVW U  u<$u.VEPEPEP跺MtEMH>  3ҡX3ɋUԉ}ЉŮ <A؈UUI++ًʉMȋÃ        tm  XШT  jݴYt9EMEj U}EWEPEPM8H}ЉM  EEU     E     E   XШ   jtBSYMȉEẺMMj UEEPEPMB@MȉE   YEMȍEUPlXXШtWjYt6EMEj U}EZEPEPM8@}ЉEEEUPM讧}СX@X8$u VEPEPEP蹸M  X3Ɋ <AI++ًMX8 tX  EEĉEEMMPe Ee MPEMEMt+MMj EcEPEPM\@MEMȅt.ẺMMj E.EPEPM'@ME     9u   EEPME   eMQMQEEEEX8 t#EPAYMQMQ@M"jM苙MQMQEEEEX8 t<EPYPMXt@X@t5E`   @~  }} Mth`j<XШt/uBuEPYMQMQ@MEuEPYPM]t5EEpPME	   MQMQEEEEt5EE<PME   ܰMQMQPEEEE} t2EMEEEEPEDE   EEEE} t2EMEEEEPEHE   EEEE   ututKFu2U: t*REj PͱMj Q|VMQ)   tME#V	E8 tPEj P艱PM贱U׀} t    EMP   EM.9Uubu9tQF   u8}9t1jMWMQj EPMεVu$Vju褐E9tPMj譖E_^[U3ɍEQPQEMPuMMMEUMuX   ?tXXtEPusYY   @} XEPuMEE   mMEhE   ԬG@3ɣXEQPQEMPEMPQM@EEPujMMQu Ej(D~XX3Ҿ    Ut/%XERP"	5XYYEM؉M܉H
  X?  @X8u#8HuEPpXY@X8 u밍EPu3]@Yt   tEe #~E0X  X    <@   EP[EY   =X MtdEX Pu]Xu]u8@]tsEPYEE   @EE؉MMPLEPE'EE܉EEPEE   #EPEPM(X0]uMtt	   ]   tډ]   X t<@tE`   @_X=Xt"uu!MЍE!MPEPЮYYEPu轮YYtEP@Mj`EX_UX(S2ۀ9Qu	AXuMj芐E   V<0|Z<9Vt5/ARXMPh`0M֨VMQMU{уARXMP_EP臑} Yt;uX} utt
M떍M%tM{M뮡X8 ujMďЋ
3E   MUE^JH[U졨Xt:_u5Ht._u)XA@XvE`   @]ËE  ` ]Uju诰EYY]UX(u+EEPME   5juEVW3}}WuMXЃuWAXWu
EP`YEPYEPM躨EM_^MHË5XШt   uA}}XT      tst.t   E$E   wEE   gEE4PE   譠YM؍EP/VMQEEEE3EEE   EE   EPMߙEEEEUu'EY]UX3ɉMM    Ѓ   $E<'EDE   ELE   ETE   EPMߘX X1tHtHtHu5EE\PME	   裤MQMQEEEEEMMHËEH@ËMj؋EÍI ȌȌььUXBSXV
3WÉu}AC          B   9u   KBУXكv&j,M$VSM薄PEPM0xj>Mu}軵XUMU8$Mu@X!MMj^U荵UMXUM8 t@X% Mth`"j脤UME @  H~Mj.EoE    !9utEp@QEMj> <X@.9uu&E8t8t8u        XBXEp0_^[UXVjt	& f 3VuEPEMj PuMQHEN^UX(03ŉEXVuuj袈   <0| <9/ARXP9   EP݉} XYtSEB}BMXEMu/EQQ$h\EjAPE EuPr5}AuEɀ: ujM3E   ME@FM3^?UX0SVW  <6|<9~<_h  ؃6AX)u*\  ؍Q=ʉX|~$  у    ue e jEFEX#   9@   EM؍EEP_MQMQEEEEX8 t1EP;PEj PΠMQMQ@M"jMwMQMQsEEEEXBX   @1  @XX`<`EPtWpY@MEt~XШEPt^PEj PMQMQ@ME=YPMnjM貅MQu  fYPM@XШEPt"DYMQMQu@ME"YPM39t*EPEj(PjMj)Q@MEjXt^EVP茵EPPEj(PMj)QģPM3X`<`ttEPMXEPt苑YPMzYPM(EPcYPM͞XШEPtYPM謞YPMEtMMNMMH.X@#E`   @uju}E_^[Uj u谤EYY]W9u2_ËVp ^_̃y$ ̊AËI2SVW{p քu{p _^[̋QtAD2UEj PPEj`PJj'uEU졨X8 uMj߁EÍEVPbYj.MǬ3EVVP賕MPXE9@uAXMMH	p@0^USVW}كwj_s;s5   ;w@jhXh  迤t(  KtCC+sC_^[] 3UEV1P Y^] UQQXt8_u3Ht,Eu'MXEPEE	   EËE  ` ̋XtR<0|<9/AX3 t4<A|)<P%¿AX<@u܊AX<@tË3U(XSVWp35X}׉U}}j[I    8  d  3H  U  +!  0tt:  Ex@8_^[Ë߉}]8U   EPUPEj<PWMP肙]tp <>u
j Mj>MEt 5X> uEMMHq]F5XWEWP訒PMU5Xt#~1uEPEj~P豘PMUtEPMʘUMEPN5XMj>~E4tt	FŐPM蔊}  EEPM؉]vMQMQ}U  D.t9t+ttYFX}  3GEtttуJ'$NXGB     8mtR35t+t#0tt	AŰIX4t߃tڃtՃAŰMPvC      9titHt	dAx뽊AXtu0t~F> WEjPME   NAMŰPU   MjEWP諝U   ރDcPHà$AMxPvWEWP@MEt   lEPM|  AMxP.X ujuMN0#ŸPMX@X0   t&ypgHXEMEEEEPuEPYj,MQPMUEP`Yj,MQƙPM5EP@Yj,MQ覙PMEWPmYYj)MQ脙PMj'uMn;EWPEYYEMEj EYEPEPMRMQuDAxPM襆	}tU   UEPQAX$۠B@BM@P6X8?EPu!YPMX8@u@XVuYPMؓEE4PME   LEMM|BM@P躑<@t AXMPXu<@uAX뭊
BX2uY                 `b1m            b          U졨X8 uMjyvEV3Mj&uu蠪EPYPM趐}aX8@uW@EXMEE   PVEVPMPoX8@uM@XEMHEp@0^UjuuuòE]Uj uuu袲E]UX3VUU+   $tutItVuYY   EMP9tEpE	   E|E   }XjAEF   XEEPEPuA<$t  ujunE^ÃXR   ut{+t̃At\t?t   :  AURXEPREUVPnoPujVuAXVxVuAXEMP9tEpE	   E|E   aXjS   tAHt   uAXqUAXE
JHAXE9t PEEPuE   蟢MEPEE   迋AXEP@wU졨XC  } tjXuM@XE8 uEE   MEPƊ  EhE   PEPug   _u8HuxZuX$u;8HuSxTuMXE8 uEE   EE   딀Yuu@uXgrYY   VuEVPF @  YYt1ELE   EPMMQMQkMUF    tE\E   ċUME^PujujEUVuWEXM    <6|<9~<_uQEPM E3}90t97t	G   u	PM辊97t	WM豊EPuYYE   j uEVuPIk3PEPu= jMoEPM}397t	WMGS]93t97t
j M˚SM(EM[MH_^Uuuuu聬E]UX SVW   <_   A   D   X3A@X   XЉuM   j Mҙj3YEMEUP謾ta#ǃtugEEE   EEE   PMi#tEEPME   Ij)MIMuEHEp@E3p_0^[U졨Xu8@uM@XȺ
uLYYE]U   SVuW& f 2ۡX   <@  =X t=X f  > tREEPME   辅VMQ5EЉEԉFtVEj[P@ȃ2ۋAFX8?h  HX$6    7  H     tEPըYM*  3A!}}Xj EjP}MuFt=EEEȉMMPEE   GEPxPMI8H
}jY3M}u@X8@uEPpj[P8hj]QȋAF   f & Fs  Aj X`jPXj]Q蘊VPQ褰&  y_uUy?uOAj XHj Ps@VQgȋAFX8@   X   8P\qP0j`PM(j'Q    j@hXMEEPE   ZVMQѯEEFX9	tPEP耴EAj XjP~Mj EjPv~MVQwȋAF~ X t<@tXf & FK> ju	b;MEE   jMQMQ苬VMQHN_^[U ESVuW3WjP>~|@jFX[uItC@tEEEP]8YMQMQVMQ蕭@FX@u@XTt
~^>Fju	臂7ME]=hMQMQ贪VMQ-HN_^[UQQXuMjg0j ?u@XEPoPj-uˁ
uWYYEUudeEY]UW9uEVupu ^_] USVuW; t5uƘXxWӪt}GPVp  t _^[] Uyu6EU+jY;}ȅtSVWL+ي7Fu_^[E] UE;EsI@] UIt]NpE] USVWu{up ;Es{uPr _^[] Uqquu;] UEMP%~XPX@uzBX<_umBXEj P2Ej P'Xt,@t@Xu8 tM@XEMHËMHjXeEËE`   @UEVuW}+;~VuW  7_^]U졨X8 uMjdE]jh`PRuXjPuʅЋE`   @]U졨X8?u'@8$uju|YY"j j uX}j juwE]U4e e XS]VWEXf  @]  e e E 	w'APE܉XXPk0Xu]   $uf8QuA$tD1t/t5t!t+9$u?A9$t9EԉXP诏1EOXՍO	yVuʍOX   EPX0YX+ǉ]u~2=X?	t'tkjX艦t0XDXtD} u
j,M苍EPM|} tEEhPME   SX&]E EMX X_^[ËE`   @U졨X   8?:  x$0  XMM\MXSM2ۍMXV5XXMX\X8?u]u@XEPEjPz]jEjPu@EMuXukWj<MEPYPM4{}t"p <>u
j M訋uj>M蛋} _tX8 t@XME죠XE裤XE5X^[MHËE`   @U,(03ŉEXSVWP}ًÉXF7  K  6          0   t0t#Ht  W%Y  WrW莼:@u&BElXEE   Pw  e Me j&dEPMeYPWM  W肵댍BjX^r  Wk7tLt<	t*t%tH9  Wd=Wi2SW]Y%WqWG  $e Me j{蚒ÃHt
tuEPrdYPMxj,M/Ft1ttDt"uMEP致YPMixj,MEPjYPMLxj,M܈EPMYPM/xj}MW|;  ' g /  EPYjEPMډEPjX @  Yt5XMt(%  P UYtE uP@     EVhtjP~E EMuPn{RtSKtMt8u}EܸE   EPMruMQMQj'MEܘE   ExEPâ}Y!W4%EEE   Cg ' GM_^3[xÐȼ޼޼    U,(03ŉEXW}Xu$@EXύEE   Ps   ?   EPwX @  YtJ=X tAVjEPM5XEP觶YP Y^tE uP蛗JEEPME   sMQMQ膟j'WM`ye Ee PW>}YYM3_vU3ɍEjPQEMPuMMMUEUXE
  ` ZuBX]̋XSVW3ɀ:_uB @  X<A|<Z   <$o  BX5  35  +j  $C  zPuBr5XM4t$    FtHtH   HupVXXN      HtڃuE!=X   ABXt    9  Ё   ttt    ɀ   @   Ht"HtHú                   F5X<0| <9ƣX]          tptktftat\M  r   A            tsBX
0|I3G5AOˁ   t     tHtHtJɀ   =@83            |        FX   <0|]<8YBЉXR$   f   _3[ @  T `  M    F h  ? p  8 x  1<9uB  X<;uB l  X3Ʉ  _^[ÐUEPyN}Yu3   }SVWtX   u
X8 u]E Mu5Xޡ}u7u30 ֍pXVu   EυtIu(0 @XPE耘ȅt#ErPRQ    ǋׄt@r u
@8 t
քu
_^[ U졨X8 uMjSEÍEVPYj{MQrX38@t4VEVPgMPnj:M~EP,YPMmj}M~XE9@uAXMMH	p@0^UQQXt7AtE`   @ËM@XEPEpE   pk
MjREUQQSXVW33%@t8A<w%ACXu}uϋE@ _^[ÍEP谪YPEP@U졨X08 uMjREÍEP%}Y   j{M|X2Ʉtj,M|X2tYtCt-thEP֗YPM lj:M|EP7~1@XEPd @XEPk@XEP蜮YPMkX},8@t\@Mj}XC|EMMHËE`   @Uuu=EYY]UQQMVuExE   AΉFEP舠EPxYPjj}y{X9@uAX^UM SVu3CAF:-  X8    EPNYj EPMnVMQȋAF:   X8@   ExE   EP讟NX:   tb@tYEP&wPEj`PiMj'QhnPiX8@u@XN:48@tEE   :8 uS蘨j},zX8@u(@X SMOVMQMMN^[U<(03ŉES]V5X]ԊЈM	wXFPS5XV  W?uPEj PIfYY8XX}]@X@O  H3ɣX8AQM?h]}-  jhV1  uEE   )jhV
     E E   E؉5XPX @  Ytt=X tkjEPMy5XEPLYP YtE MuP@sEPMeMQMQ9Ej'PMlHEPMeMQMQEӀ} t}@u3F߉5Xj@hXMjX8} t,5X>	t!tjX腐t8XDEԉ8X_M^3[h̡X% @  ̋A̋A3939	̋A̋A̋A39t
A   t@39t
A   t@̋A3yW9u3_ËV0 ^_̋A3@ËI|3UQAMy9SVWy0 ֋؋Ex0 ֋M_^[A̋AUEw
kT]øx]U졬X3W}W   8?   H@uHXEVPEE   PYMEPbVMQDEEG^~$uTREP"bYYȋAG<tX   uQX8 tGXXEPPYȋAG%?ux@uGEPOYHO_̋A3@ÃËAËAÁI   ́I @  ́I   ́I    ̃9 tI   ́I   ́I   AUUtMVu+Au^]UM38t@A9 u]UEu]ËMUStt:uBA	+[]UEPj uuuuuu]jdhT}u3k3uVKYu=XEX5X5X5Xu uuMgAuuMs}XcE   ǋMd    Y_^[3}VFYUEXuVWuXMEX3PuXXX@uMu袐5Xt?XщXt-RX YXщXt5XӋ_^UuvY] UE] Vq^V6v& Y^1q̃9 Ë! ËÃ9 V6^v& Y^Uu5l0DYY]UEt=XtPvY] Ul0t'VuuPvl0Yj P^DYYVj^][pk̃=l0u3SWq5l0uYtuYj5l0CYYu3BVj(j/eYYtV5l0CYYu3S5l0CYY3V9uY^Wq_[̃=l0u3VWq5l0uYVqG#_^hX җl0Yu2hXPCYYuV̡l0tP[l0YjhP3ۋEH
  8Y  Pu9   ux]}y tXEt UEtH      GPQ7t=x       wpVguV> tQGP6G<YY@H9_u#tZtVwGPQ$<YYPV"t7t3j [C]E3@Ëe3Md    Y_^[Ђjh84OUM: }yze uVRQ]S?t!u4FPs9;YYjPvW^FPs;YYPvWxEMd    Y_^[3@ËeU}  S]VW}tu SWu"E,uuPԏu$6uuWXF@PuWNh   u(suuWu	  8tWPA_^[]UdSVW}3WuEuEkȃMs  ;Oj  ];csm   {   { t{!t{"   39s   V9p  VXVE@E  ;csmu*{u${ t{!t	{"u	9s  V9ptb~V@EsVuSp  YYu@}970  Gh?L@8  E@E;  ӋUUUM3}ЉEԁ;csm  {  { t{!t{"  u$9G  u EWuQPEPhUăEE؉U;U   kM }jpEY9E   ;E   3ɉM9M   C@EEU܉E}}~&sE7P6u"NMEUAME;Mu+uEuu$u P7EPuuuuS0UMBE؃UM;U'}u$} t
jS\YY%=!rl uG t\}  uVG t}TXuTMHGwS
  YYt]&9Gv!8E   u$u QWuRuSd   1Tx uf_^[J5jS%\YYM9hXEPGSXSMHuuSVߋWuujWPL  x}U8S];    VWR39xtFWpR9pt3;MOCt+;RCCt#u$u uuuuST   EE}9x   u PuEuPEPCeUE܉EU;U   kM }jpEY9EN;EIMԋEHty u. @u)j ju$Mu Qj PuuuuSU0MBEUM;Ur_^[X{UUSVWBtvH9 tn}tua_3;t0C:utY:Xuut3+ttE tt tt3F3@_^[]USVWuLYPM3U"9p u":csmt:&  t#;r
A    Bft&9q   9u   Quu`f   9qu#=!r9qu;rhA t^:csmu:zr49zv/Bpt%E$Pu uQuuuR փ u uu$QuuuRA 3@_^[]UUBAB] UEEA] UVun^] ̃a a AUEEA] ̍AСP6YUEI;H] UEPAPkvYY] UEI;H] UVqpEW_^] UkIVW jpEY_^] AAUEI;H] UVFСPTEYt
jV:YY^] U][j<hDEEe ]CEЋ}wEP5YYEvM@EkM@E`MxXMMHe 3@EEu uuuSӉ؉]e    u  YËeM`  }GEWu]SnaEW3ɉM9Ov:k];D]~"};D}kD@EM؋E	AM;OrPWj SL3ۉ]!]}EE       ËMd    Y_^[Ë}]EЋMAuYOLMȉHDLMĉH?csmuKuE t!t	"u*} u$t wQYt} PWSYYjD}hKx ue ITKMj j H苑tUE 8csmu6xu0x tx!t	x"ux uJ3AH ]3]UjuuuK]jhXAuuu_uJ@e ;uth   };w   GME   | t0QWu@h  uGt\u}SYËee uuE'   ;uu6VuuX@Md    Y_^[ËuIx ~IHsUE@]USVuW   >3ۅ~qEӉ]@@MEȋEME~;FEUr1P*uEMHEMEUEUu_^[rUSVW}397~ދGh?L*uF;7|2_^[]ðU]*UuMU] UuMuU] UE` ] UE	H] UE@]̋AUE %]̋@UE@ $]UE@ $]U]_U]O)Uup]USQEEEUuMmtVW_^]MU   u   Qt]Y[ UE@]U =CT td   E   ;Ar;AvjY)]U =CT td   E@;Ar;AvjY)]U =CT t(MVud5    UY;Fr;FvjY)^]VWY3j h  Wmft,Yr۰<q2_^UkEYPp]V5,Yt kWXWp,Yu_^UkEYPp]SVWT$D$L$URPQQhd5    (03ĉD$d%    D$0XL$,3pF   T$4t;5   4v\H{ h  C豁   CYd    _^[̋L$A      t3D$H3+KUhpppH]D$T$   Ut$&L$)qqq(H] UVWS33333[_^]̋j蓀33333USVWj RhuQq_^[]Ul$RQt$G] UEM]UEM]UEM]UE ]UE ]̃hh|hj J  hhhj*  hhh j
  hhhj   hhh j   UQSVW}o8Y3tuvVh   j PEquGqWu(ujhhVSttj j Vqu;}u3_^[ËƇtV pUEVW<DY;t+u)uuYYtuPptȇ73_^]UEW<8YtA#-V4`   Yu	3tV p^_]UuuuYYu]uPp]Uh   j uqu2qWu%jhhurtj j uq]3]UVhh|hj tu ^]^]%qUVhhhjYut q^]UVhhh jut q^]UVhhhjuut q^]UVhhh jztuuu uuq^]UE@u ]4?@u U?ЋBu MJ]V>pt
  UEMx   A]ËA]UEMH]USVWUj j huq]_^[]̋L$A      2   D$H3DUhP(RP$R#]D$T$   SVWD$UPjhd5    (03PD$d    D$(XpI   |$,
   ;t$,4   4vL$H|    h  DzDpQL$d    _^[3d    y   QR9Q      SQp0   SQp0L$KCkUQPXY]Y[ ËU(03E]̋U(0j Y+ȋE3(0]̋UEE]̋UEM]̋3ËËU(  (03ŉE}Wt	uGgYjPj PdCh  0j PQC0ffffffEEǅ0  @EEElqj \qPXquu}t	u@fYM3_A̋UE`Y]̡(03`YuË\  ̋UVt)\  tuuuuu փ^]u5(0u35`YuuuuF3PPPPPw̋V3VVVVVwVVVVVFjhqtjY)Vj Vj8pV`qPdq^̋UV5(0Wu3=`Y?Y`Yϋ_^]̋UUMЋ\  \  ]̋UE ]̋Uj=Ytu
A%t]^   uuu2  ̋UjK=Ytu
$t]   uuu  ̋UD  (03ŉES]VuW}h@  j P?VuWSh@  P5  h  hTP7}0_^[ttu̋M3>jpYjua̋U  (03ŉES]|VuW}h  j P>Vu|WSh@  P  h  |hPR$0_^[ttu̋M3=j!pYj<u
a̋U  (03ŉEES]VuW}hEWVOt  h(WVq  hWVq  h  PP= Pjq؍h  #QPeu!h4h  Ps;  ʍAAu+A@v1jEhh+PQL    RWVp  h WVp  h@WVo  ˍQAu+ʍA@   ˍQAu+3BD<\t{</t;sBO<\u}+ʃ&vr&  ꉕj5X+PSWV$  hhWVDo  +SWV%o  h WVo  hXWVn  ΍QAu+ʋ֍ZBu+Ӌj
+P2Puuzr  h(WVn[  hpWVnD  ΍QAu+ʍ   YAu+ˍ;   +PWV#   hhWV'n   (SWVn   hWVm   SWVm   h4WVm   rj#SWV9#uphhWVmu]+jPWV#u>hhWVrmu+P.!M_^3[l93PPPPP?̋U(  (03ŉEES]VuW}hEWVA   h,WV2l  h(WVh2U  h
  PP83PSjq؍  S#QPquhPSPFA  ˍQff;u+A@v/M
  jh+ȍQS    SWV1{  h$WVw1d  hHWV`1M  ʍYff;u+A@  ڍKff;u+ǅ\   3ADZf;t3z<_f/t;sAf;u}+&vIsAj5X+PRWVP  hWV0y  HP&  j5X+PRWVP>  hWV:0'  +XPWV0  h$WV0  h`WV/  3ۍQff;u+ʋZff;u+Ӌ+j
PVPuL  h,WV/t  hWVp/]  3ۍQff;u+   Yff;u+;   +PWVBO   hWV.   ,SWV.   h(WV.   SWV.   hWV.   yj#RWVNuwhWVs.udjHPWVNuDhWV@.u1XRM_^3[}33PPPPP9̋UQQj<Y@  uj jj j<YP)j f  jEg<EEPEPEPEPEPcGjD<P]$ŰUQQuuu  j;@  uj jj j;YP)j   jE;EEPEPEPEPEP'nj;P0]$mT̋UE0E0E0E0E0H]̋UE0E0E0E0E0p]̋UE0Eu0Y]̋UE0Eu0q]̋UE0E0E0E0o]̋UE0E0E0E0G]̋UE0E0uln]̋UE0E0u$]̋UE0E0E0zc]̋UE0E0E0Uc]̋UE0E0E00c]̋UE0E0E0)]̋UE0E0E0)]̋UE0E0E0x)]̋UE0E0ue]̋UE0E0u8]̋UE0E0E0ve]̋UE0E0E088]̋UEP@u+]̋UEPffu+]̋UE P@u+]̋UE Pffu+]̋UE P@u+]̋UE Pffu+]̋UE0E0E0E0]̋UE0E0E0E0]̋UE0E0E0E0o]̋UE0E0E0E0G]̋UE0E0E0E0G]̋UE0E0E0E0XG]̋UE]   U  (03ŉES]VW}jqtmtiVqu]u|SWhh@  P>x;|3Qff;uW+ʉxxPQ|PVquM_^3[+O̸øøTøøøøhøø(ø,øpøø@øHË@ø4øøø(øXø`ø ø$øø(ø4øPË@  ̋U@E] ̋UVuj(Yt#u
jtVuuu~^]uuuL̋U} u]uuuuu0̋UuuuuXp0]̋UuuuuXp0O1]̋UuuuuuXp0>4y]̋UVuj'Yt#u
PtVuuu$^]uuu̋UEPj uuf]̋UEPj uu_]̋UVuu3mEu3j^00SW}t9urVWPnV36uj P)u	3j9usy3j"^00jX_^]̋UEPj uuu|d]̋UQuE    EYcY̋U]:̋UVuuuuu&^] ̋UVuuuuu&FX   \   
  
  `  ^] ̋UEV0E0E0Ep0u*9P   ^] ̋UVuuuuuU^] ̋UVuuuuuUFX   \   
  
  `  ^] ̋UEV0E0E0Ep0uP   ^] ̋UVuuuuuNC^] ̋UVuuuuu#CFX   \   
  
  `  ^] ̋UEV0E0E0Ep0u(P   ^] ̋UVuuuuu^] ̋UVuuuuuFX   \   
  
  `  ^] ̋UEV0E0E0Ep0uP   ^] jh e E0Ye Mkh  uE   ƋMd    Y_^[ uE0 Yjhe E0qYe Mzc  uE   ƋMd    Y_^[ uE0Yjh e E0 Ye Mzf  uE   ƋMd    Y_^[ uE0Yjh e E0Ye Mc  uE   ƋMd    Y_^[ uE0Yjh>e E0Ye Ma  uE   ƋMd    Y_^[ uE0<Yjh@e E0Ye Mc  uE   ƋMd    Y_^[ uE0Y̋UEMEEEPuEP̋UEMEEEPuEPx̋UEMEEEPuEP+̋UEMEEEPuEP̋UEMEEEPuEP\̋UEMEEEPuEPK̋UE u,    )Ã} tMEMMMMEEMMPMEPMEMPMŐUE u+    (Ã} tMEMMMMEEMMPMEPMEMPMa̋UE u+    (Ã} tMEMMMMEEMMPMEPMEMPM7̋UE u*    'Ã} tMEMMMMEEMMPMEPMEMPM̋UE u*    #'Ã} tMEMMMMEEMMPMEPMEMPM̋UE u)    &Ã} tMEMMMMEEMMPMEPMEMPMŐUQ} u)    ,&S]VuW}uuu3qtt	E   e (} u    A Eu$u u;v<CPVuu  tCy u( "   %_^[WVuu  D> uuP(8"uF(M̋UQ} u'    
%S]VuW}uuu3stt	E   e '} u    C Eu$u u;v>CPVuu}  tGy3fuc' "   y$_^[WVuuB  3ɃfL~uu*'8"u 'M̋U  (03ŉE} ES]u&    #  ttVWu|IM33ҫu
uƅu PuuQPRe j$tKE3Ƀtuum;u*x);v%YtKty;tK4 t|P  _^M3[Åuŋ;uj^L̋U  (03ŉE} ES]u$    !  ttVWu|GM33ҫu
uƅu PuuQPe 0tQE tuut;u.x0;v,` tQty3f;tN3fG2 t|P  _^M3[Åuŋ;uj^3fD_̋U
  (03ŉEES]VuHu"      D  ttWuFM833ҫH(8<@u
DuƅD8 ,LE H4E$HP40P0P P,PLtKE3Ƀtuum@;u*x);v%Y(tKty@;tK0 _tP  ƋM^3[Åuŋ@;uj^L̋U
  (03ŉEES]VuHu     J  ttWuCM833ҫH(8<@u
DuƅD8 ,LE H4E$HP40P0P P,PPLtQE tuut@;u.x0;v,`( tQty3f@;tN3fG. _tP  ƋM^3[Åuŋ@;uj^3fD_̋U  (03ŉE} ES]u      ttVWu|AM33ҫu
uƅu PuuQPJe 'tKE3Ƀtuum;u*x);v%YtKty;tK, t|P  _^M3[Åuŋ;uj^L̋U  (03ŉE} ES]u      ttVWu|?M33ҫu
uƅu PuuQP
e tQE tuut;u.x0;v,` tQty3f;tN3fG* t|P  _^M3[Åuŋ;uj^3fD_̋U} u    ]Vut:} v4u uuuVuuy u  "       ^]̋U} uk    ]Vut<} v6u uuuVuu4y3fu  "       (^]̃   u   Ë   ̃   u   Ë   ̋  u̋  u̋UQVuWvl    2SS39  u   v;   w1V!EYtEP  E   PeIY[_^ ̋UQVuW?v    2TS39  u   v;   w1V} EYtEP  +E   PHY[_^ ̋U샹\  uAIAO
  cv"    82;҃X  uq,A1Pd  jPAl   MQ] ̋U샹\  uAIAO
  cv    2;҃X  uq,A1Pd  jP]l   MQ] ̋U샹\  uAIAO
  cv    
2;҃X  uq,A2Pd  jPl   MQ] ̋U샹\  uAIAO
  cv]    s2;҃X  uq,A2Pd  jPAl   MQ] ̋UAAM@Q] ̋UAAM@Q] ̋UAAM@Q] ̋UAAM@Q] ̋U샹\  uAIAO
  cv.    D2;҃X  uq,A1Pd  jPMl   MQ] ̋U샹\  uAIAO
  cv    2;҃X  uq,A1Pd  jPi l   MQ] ̋U샹\  uAIAO
  cv     2;҃X  uq,A2Pd  jPl   MQ] ̋U샹\  uAIAO
  cvi    2;҃X  uq,A2Pd  jP>l   MQ] ̋UAAM@Q] ̋UAAM@Q] ̋UAAM@Q] ̋UAAM@Q] ̋U샹\  uAIAO
  cv:    P2;҃X  uq,A1Pd  jPYl   MQ] ̋U샹\  uAIAO
  cv    2;҃X  uq,A1Pd  jPul   MQ] ̋U샹\  uAIAO
  cv    "2;҃X  uq,A2Pd  jPl   MQ] ̋U샹\  uAIAO
  cvu    2;҃X  uq,A2Pd  jP<l   MQ] ̋UAAM@Q] ̋UAAM@Q] ̋UAAM@Q] ̋UAAM@Q] ̋U샹\  uAIQMS
  cvB    X26҃X  uq,A1Pd  jPal  E] ̋U샹\  uAIQMS
  cv    26҃X  uq,A1Pd  jP~l  E] ̋UAAHE] ̋UAAHE] ̋U샹\  uAIAO
  cv    
2;҃X  uq,A1Pd  jPl   MQ] ̋U샹\  uAIAO
  cvC    Y
2;҃X  uq,A1Pd  jPl   MQ] ̋U샹\  uAIAO
  cv    	2;҃X  uq,A2Pd  jP
l   MQ] ̋U샹\  uAIAO
  cv    +	2;҃X  uq,A2Pd  jP7l   MQ] ̋UAAM@Q] ̋UAAM@Q] ̋UAAM@Q] ̋UAAM@Q] ̋U샹\  uAA@N
  cv
    2:҃X  uq,A1Pd  jPl   MQ] ̋U샹\  uAA@N
  cvS
    i2:҃X  uq,A1Pd  jP%l   MQ] ̋U샹\  uAA@N
  cv	    2:҃X  uq,A2Pd  jPl   MQ] ̋U샹\  uAA@N
  cv+	    A2:҃X  uq,A2Pd  jP4l   MQ] ̋UAAM@Q] ̋UAAM@Q] ̋UAAM@Q] ̋UAAM@Q] ̋U샹\  uAIUIb 
W
  cv    2:҃X  uq,A1Pd  jPl  M a ] ̋U샹\  uAIUIb 
W
  cvZ    p2:҃X  uq,A1Pd  jP,l  M a ] ̋U샹\  uAIUIb 
W
  cv    2:҃X  uq,A2Pd  jPl  M a ] ̋U샹\  uAIUIb 
W
  cv    02:҃X  uq,A2Pd  jP1l  M a ] ̋UAAM@a ] ̋UAAM@a ] ̋UAAM@a ] ̋UAAM@a ] ̋U샹\  uAIQMS
  cv     26҃X  uq,A1Pd  jP	l  E] ̋U샹\  uAIQMS
  cvT    j26҃X  uq,A1Pd  jP&l  E] ̋U샹\  uAIQMS
  cv     26҃X  uq,A2Pd  jPl  E] ̋U샹\  uAIQMS
  cv(    > 26҃X  uq,A2Pd  jP.l  E] ̋UAAHE] ̋UAAHE] ̋UAAHE] ̋UAAHE] ̋UAAHE] ̋U샹\  uAIQMS
  cv    26҃X  uq,A1Pd  jPl  E] ̋UAAHE] ̋UAAHE] ̋UAAHE] ̋U샹\  uAIQMS
  cv     26҃X  uq,A1Pd  jPl  E] ̋UAAHE] ̋UAAHE] ̋UAAHE] ̋U샹\  uAIQMS
  cv     26҃X  uq,A2Pd  jPl  E] ̋UAAHE] ̋UAAHE] ̋UAAHE] ̋U샹\  uAIQMS
  cv    &26҃X  uq,A2Pd  jP*l  E] ̋UAAHE] ̋UAAHE] ̋U샹\  uAIQMS
  cv:    P26҃X  uq,A1Pd  jPYl  E] ̋U샹\  uAIQMS
  cv    26҃X  uq,A1Pd  jPvl  E] ̋U샹\  uAIQMS
  cv    $26҃X  uq,A2Pd  jPl  E] ̋U샹\  uAIQMS
  cvx    26҃X  uq,A2Pd  jP(l  E] ̋UAAHE] ̋UAAHE] ̋UAAHE] ̋UAAHE] ̋U샹\  uAIVqQMq^Y
  cvZ    p2<҃X  uq,A1Pd  jPyl  PEP] ̋U샹\  uAIVqQMq^Y
  cv    2<҃X  uq,A1Pd  jPl  PEP] ̋U샹\  uAIVqQMq^Y
  cv    "2<҃X  uq,A2Pd  jPl  PEP] ̋U샹\  uAIVqQMq^Y
  cve    {2<҃X  uq,A2Pd  jP$l  PEP] ̋UAAHPEP] ̋UAAHPEP] ̋UAAHPEP] ̋UAAHPEP] ̋U샹\  uAUVqN
NJ^Y
  cv    42<҃X  uq,A1Pd  jP=l  MBA] ̋U샹\  uAUVqN
NJ^Y
  cvw    2<҃X  uq,A1Pd  jPIl  MBA] ̋U샹\  uAUVqN
NJ^Y
  cv    2<҃X  uq,A2Pd  jPl  MBA] ̋U샹\  uAUVqN
NJ^Y
  cv)    ?2<҃X  uq,A2Pd  jP!l  MBA] ̋UAQMBBA] ̋UAQMBBA] ̋UAQMBBA] ̋UAQMBBA] ̋U샹\  uAUVqN
NJ^Y
  cv    2<҃X  uq,A1Pd  jPl  MBA] ̋U샹\  uAUVqN
NJ^Y
  cv;    Q2<҃X  uq,A1Pd  jPl  MBA] ̋U샹\  uAUVqN
NJ^Y
  cv    2<҃X  uq,A2Pd  jPml  MBA] ̋U샹\  uAUVqN
NJ^Y
  cv    2<҃X  uq,A2Pd  jPzl  MBA] ̋UAQMBBA] ̋UAQMBBA] ̋UAQMBBA] ̋UAQMBBA] ̋U샹\  uAIfQMfU
  cv    28҃X  uq,A1Pd  jPl  fEf] ̋U샹\  uAIfQMfU
  cv    '28҃X  uq,A1Pd  jPl  fEf] ̋U샹\  uAIfQMfU
  cvv    28҃X  uq,A2Pd  jPOl  fEf] ̋U샹\  uAIfQMfU
  cv    28҃X  uq,A2Pd  jPhl  fEf] ̋UAAfHEf] ̋UAAfHEf] ̋UAAfHEf] ̋UAAfHEf] jXjXjXjXjXjXjXjXjXjXjXjXËUE<ct<Ct2]ð]̋UE<ct<Ct2]ð]̋Uf}ctf}Ct2]ð]̋Uf}ctf}Ct2]ð]̋UE<dt<it<ot<ut<xt<Xt<*t2]ð]̋UE<dt<it<ot<ut<xt<Xt<*t2]ð]̋UfEfdt(fit"fotfutfxtfXt
f*t2]ð]̋UfEfdt(fit"fotfutfxtfXt
f*t2]ð]̋U}p]̋U}p]̋Uf}p]̋Uf}p]̋UE<st<St2]ð]̋UE<st<St2]ð]̋Uf}stf}St2]ð]̋Uf}stf}St2]ð]̋UEHtt	t}tE<ct<st]2]̋UEHt<t3	t.}t(E jXt2f}ctf}su22]ð]2]̋UE ]̋UE ]̋UEf ]̋UEf ]̋UE ]̋UE ]̋UE ]̋UE ]̋UE ]̋UE ]̋UE ]̋UE ]̋UUR]̋UUR]̋UUR]̋UEf ]̋UE0E PYY]̋UE0E PYY]̋UE  @]̋UE  @]̋UE  f@]̋UE  f@]̋UE  @]̋UE  @]̋UE  @]̋UE  @]̋UE  @]̋UE  @]̋UE  @]̋UE  @]̋UE  @]̋UE  @]̋UE  @]̋UE  @]̋UE  @]̋UE  @]̋UE  @]̋UE  @]̋UMBR]̋UE BR]̋UE BR]̋UE  f@]VW  u_^̋UE0E0E0[]̋UE0E0E0]̋UE0E0E0]̋UE0E0E0N]̋USVWN@  uF]H~4ϋV(t0J3҉N(u0؀9~E4ЋF4N4N4+~8F4_^[] ̋USVWN@  u]H~4ϋV(t0J3҉N(u0؀9~E4ЋF4N4N4+~8F4_^[] ̋USVWN@  u(]H~4ϋV(t0J3҉N(u0؀9~E4ЋF4N4N4+~8F4_^[] ̋USVWN@  u
]H~4ϋV(t0J3҉N(u0؀9~E4ЋF4N4N4+~8F4_^[] ̋USVWN@  u

]H~4ϋV(t0J3҉N(u0؀9~E4ЋF4N4N4+~8F4_^[] ̋USVWN@  u{	]H~4ϋV(t0J3҉N(u0؀9~E4ЋF4N4N4+~8F4_^[] ̋USVWN@  u]<G~4ϋV(t>J3҉N(u؍B0ȃ9vE4fȋF4ffF4N4+~8F4_^[] ̋USVWN@  u]<G~4ϋV(t>J3҉N(u؍B0ȃ9vE4fȋF4ffF4N4+~8F4_^[] ̋USVWN@  u8]<G~4ϋV(t>J3҉N(u؍B0ȃ9vE4fȋF4ffF4N4+~8F4_^[] ̋USVWN@  u]<G~4ϋV(t>J3҉N(u؍B0ȃ9vE4fȋF4ffF4N4+~8F4_^[] ̋USVWN@  u]<G~4ϋV(t>J3҉N(u؍B0ȃ9vE4fȋF4ffF4N4+~8F4_^[] ̋USVWN@  u@]<G~4ϋV(t>J3҉N(u؍B0ȃ9vE4fȋF4ffF4N4+~8F4_^[] ̋USVWN@  u]H}ω~4}V(t=Sj uBSWF(2][0ڀ9~E4ȋF4N4N4붋}+~8F4_^[ ̋USVWN@  uH]H}ω~4}V(t=Sj uBSWF(聸][0ڀ9~E4ȋF4N4N4붋}+~8F4_^[ ̋USVWN@  u]H}ω~4}V(t=Sj uBSWF(з][0ڀ9~E4ȋF4N4N4붋}+~8F4_^[ ̋USVWN@  u]H}ω~4}V(t=Sj uBSWF(][0ڀ9~E4ȋF4N4N4붋}+~8F4_^[ ̋USVWN@  u5]H}ω~4}V(t=Sj uBSWF(n][0ڀ9~E4ȋF4N4N4붋}+~8F4_^[ ̋USVWN@  u]H}ω~4}V(t=Sj uBSWF(轵][0ڀ9~E4ȋF4N4N4붋}+~8F4_^[ ̋USVWN@  uo]<G}ω~4}V(tKSj uBSWF(	][0ɋڃ9vE4fȋF4ffF4N4먋}+~8F4_^[ ̋USVWN@  u]<G}ω~4}V(tKSj uBSWF(?][0ɋڃ9vE4fȋF4ffF4N4먋}+~8F4_^[ ̋USVWN@  u]<G}ω~4}V(tKSj uBSWF(u][0ɋڃ9vE4fȋF4ffF4N4먋}+~8F4_^[ ̋USVWN@  u]<G}ω~4}V(tKSj uBSWF(諲][0ɋڃ9vE4fȋF4ffF4N4먋}+~8F4_^[ ̋USVWN@  uG]<G}ω~4}V(tKSj uBSWF(][0ɋڃ9vE4fȋF4ffF4N4먋}+~8F4_^[ ̋USVWN@  u}]<G}ω~4}V(tKSj uBSWF(][0ɋڃ9vE4fȋF4ffF4N4먋}+~8F4_^[ ̋UV39u~+W}uM ttF;u|_^]̋UV39u~0Sf]W}MSttF;u|_[^]̋UV39u~W}MWu?tF;u|_^]̋UV39u~!Sf]W}MWS?tF;u|_[^]̋UEEAEAEAEA] ̋UE ] ̋UE ] ̋UE ] ̋UE ] ̋UE ] ̋UEEAEAEAEA] ̋UE ] ̋UE ] ̋UEEAEAEAEA] ̋UEEAEAEAEA] ̋UE ] ̋UEEAEAEAEA] ̋UE ] ̋UE ] ̋UE ] ̋UEEAEAEAEA] ̋UE ] ̋UQ3MAAAAAAAA A$A(fA0A8A<@  D  ̋UQ3҉M3QQQfA2QQQQQ Q$Q(Q0Q8Q<@  D  ̋UVqE H  EEFEFEFEF^] ̋UV&E H  EEFEFEFEF^] ̋UV:E H  EEFEFEFEF^] ̋UVE H  EEFEFEFEF^] ̋UVuuuuuu6P   ^] ̋UVEPEPEPEPu^] ̋UVuuuuuuP   ^] ̋UVuuuuuuP   ^] ̋UVEPEPEPEPu^] ̋UVuuuuuuP   ^] ̋UVuuuuuu膬P   ^] ̋UVEPEPEPEPu^] ̋UVuuuuuuP   ^] ̋UVuuuuuu-P   ^] ̋UVEPEPEPEPu4^] ̋UVuuuuuužP   ^] ̋UE] ̋UE] ̋UE] ̋UE] ̋USWMG _t	A=f u22CAVwSPHLHHkV7P  ^uP  G_[] ̋UEVP{FY^] ̃! ËUUA" ] ̃       ̃@̃@̃@̃@~̃@t̃@j̃@`̃@Ṽ@L̃@B̃@8̃@.̃@$̃@̃@̃@̃@̃@̃@̃@̃@̃@̃@̃@̃@̃@̃@̃@̃@̃@z̀y t	P  1AP.YY̋: u	At̋V  z   Y^̋UV6[U& Yƃ" ^] ̋ËUt  (03ŉEVW8WVFY0 F0PF0Fp0P^e Wb tP  WYYM_3^Y1wY1lY1Y1VY1Y̋Ut  (03ŉEVW8W1FY0 F0PF0Fp0P9e c= tP  WYYM_3^41RY1Y̋U
  (03ŉEVW8W-8FY 0N <F H$DF @0AL4HPDP@P0P<PLe, t P  W8YYM_3^̋U
  (03ŉEVW8W8FY 0N <F H$DF @0AL4HPDP@P0P<PL, t P  W8YYM_3^ʽ1}Y̋Ut  (03ŉEVW8WFY0h F0PF0Fp0PXe ` tP  WYYM_3^ü1Y1yY1nY̋Ut  (03ŉEVW8WFY0Y F0PF0Fp0PIe  tP  WqYYM_3^贻1ҦY̍AËUE4E]̋UE4E]̋UE4E]̋UE4E]̋UE4E]̋UE4E]̋UE4E]̋UE4E]̋UE4E]̋UE4E]̋UE4E]̋UE4E]̋X  X  t6u	\  t(
  3Ƀ
  \  J$J(`  J2̋X  X  t6u	\  t(
  3Ƀ
  \  J$J(`  J2̋X  X  t6u	\  t(
  3Ƀ
  \  J$J(`  J2̋X  X  t6u	\  t(
  3Ƀ
  \  J$J(`  J2P  P  P  P  P  P  P  P  ̋UEMS     tЊ:t	AЄuAt)	<et<EtAuI<0t:uIABu[]̋UQMEA<Zw3k	E ̋UQMEA<Zw3k	E ̋UQMEA<Zwh3ɋEȈ ̋UQMEA<Zw3k	E ̋UQMEA<Zw3k	E ̋UQMEA<Zwh3ɋEȈ ̋UQMEAfZw3k	E ̋UQMEAfZw3k	E ̋UQMEAfZwh3ɋEȈ ̋UQMEAfZw3k	E ̋UQMEAfZw3k	E ̋UQMEAfZwh3ɋEȈ ̋UEUSWË   <8etV1BFu^À<8xu     BˈB؄u_[]̋Vu蓾^3@3@3@3@jXjXjX3@3@3@3@3@jXjXjX3@3@3@3@3@jXjXjX3@3@3@3@3@jXjXjX3@ËUEA ] ̋UEA ] ̋UEA ] ̋UEA ] ̋UEA ] ̋UEA ] ̋UEA ] ̋UEA ] ̋UEA ] ̋UEA ] ̋UEA ] ̋UEA ] ̋UQS]VuWF<p   p   3<stM<SuEstSu<ct<CuctCu} ul   ue   PSEYYMuup;E0:ue3Ƀ~	3}	;uOvͦuæYY;@8uu/:u+vPw7Auuw7/ :u2p2_^[ ̋UQS]VuWF<p   p   3<stM<SuEstSu<ct<CuctCu} ul   ue   PSEYYMuup;E0:ue3Ƀ~	3}	;uOvoueYY;@8uu/:u+vPw7uuw7 :u2p2_^[ ̋UQQS]VuW{jpMYf;   f;   WaVEXWEVE|Mup8M   Muh   WjVEaYYMuut;E0:ui3Ƀ{	3}	;uSsuYY;D:Mu3M:u,sW}w7uVw7ג :u2f;2_^[ ̋UQQS]VuW{jpMYf;   f;   WeVE\WEAVE8Mup8M   Muh   WĶVE軶YYMuut;E0:ui3Ƀ{	3}	;uSs跢u譢YY;D:Mu3M:u,sW}w7艑uVw7y :u2f;2_^[ ̋@$̸xøxøxøxøxøxøxøxøxøxøxøxËUQSVWwu
wM& Ge Hj
QP#MGuG8"tE;GrG2> ut_^[ ̋UQSVWwu
苶wM& Ge Hj
QPMGuYG8"tE;GrG2> ut_^[ ̋UQSVWwu
wM& Ge Hj
QPMGuȵG8"tE;GrG2> ut_^[ ̋UQSVWwu
iwM& Ge Hj
QPpMGu7G8"tE;GrG2> ut_^[ ̋UQSVWwu
شwM& Ge Hj
QPMGu覴G8"tE;GrG2> ut_^[ ̋UQSVWwu
GwM& Ge Hj
QPNMGuG8"tE;GrG2> ut_^[ ̋UQSVWwu
足wM& Ge j
QPMGu肳G8"tE;GrG2> ut_^[ ̋UQSVWwu
#wM& Ge j
QP芮MGuG8"tE;GrG2> ut_^[ ̋UQSVWwu
萲wM& Ge j
QPMGu\G8"tE;GrG2> ut_^[ ̋UQSVWwu
wM& Ge j
QPdMGuɱG8"tE;GrG2> ut_^[ ̋UQSVWwu
jwM& Ge j
QPѬMGu6G8"tE;GrG2> ut_^[ ̋UQSVWwu
װwM& Ge j
QP>MGu裰G8"tE;GrG2> ut_^[ ̋SVH  ݳt39^   6    L^[É^8^   F9^   vF1P蛌Ftw$F\EN(^$^0^ ^,^<8'赔^(!F裕jF F1kFNHP  P  ;F0Аِ̋SVH  pt39^   ɮ    ߫^[É^8^   F9^   vF1P3ΉF襌tƋFtw$~EN(^$^0^ ^,^<8'	~^(!Ұ	\F F1]F讌:裺1F&I -6KT]bkt̋SVH  t39^   M    c^[É^8^   F9^   vF1P!Ftw$EN(^$^0^ ^,^<8'^(!ԚjF F1kFP  P  JF?˓Гٓ̋SVH  t39^       
^[É^8^   F9^   vF1PmFtw$EN(^$^0^ ^,^<8u'`{^(!gDjF F1kF HP  P  ;F0$)2;̋SVH  t39^   自    蝧^[É^8^   F9^   vF1PΉFtƋFtw$`{EN(^$^0^ ^,^<8|'^(!觋hJ\F F1]Ft:{1F&I ox̋SVH  t39^       !^[É^8^   F9^   vF1P~Ftw$aEN(^$^0^ ^,^<8>~'蛁^(!-jF F1kFP  P  JF?ݗ$̋SVH  t39^   貧    Ȥ^[É^8^   F9^   vF2PFtw$ΙGEN(^$^0^ ^,^<8E'^(!7胩肃iF fF2fgF薊CP  P  6F+7@U^glu~̋SVH  Ht39^   @    V^[É^8^   F9^   vF2PΉFGtŋFtw$L_EN(^$^0^ ^,^<8路'^(!n[F fF2fYFD5,F!՚ޚ̋SVH  t39^   迤    ա^[É^8^   F9^   vF2P9Ftw$EN(^$^0^ ^,^<8'^(!	iF fF2fgFP  P  EF:I *3HQZ_hq̋SVH  t39^   \    r^[É^8^   F9^   vF2PYFtw$$$tEN(^$^0^ ^,^<8$~'~^(![)聝iF fF2fgFCP  P  6F+˝ԝ̋SVH  蔓t39^        ^[É^8^   F9^   vF2PΉFFtŋFtw$EN(^$^0^ ^,^<8'^(!Mq聝[F fF2fYFd5,F!+4=BKT̋SVH  t39^   i    ^[É^8^   F9^   vF2P3Ftw$苣EN(^$^0^ ^,^<8'6r^(!~Ӂ詉iF fF2fgFP  P  EF:I Ǡ̋ËUE	A ] ̋UE	A ] ̋UE	A ] ̋UE	A ] ̋UE	A ] ̋UE	A ] ̋UE	A ] ̋UE	A ] ̋UE	A ] ̋UE	A ] ̋UE	A ] ̋UE	A ] 3@9X  u
9\  t23@9X  u
9\  t23@9X  u
9\  t23@9X  u
9\  t2̰ðððËX  u	\  u\   u2̋X  u	\  u\   u2̋X  u	\  u\   u2̋X  u	\  u\   u22222Ã\  u3@9X  t2̃\  u3@9X  t2̃\  u3@9X  t2̃\  u3@9X  t22222Ãa( Ãa( Ãa( Ãa( Ãa( Ãa( Ãa( Ãa( Ãa( Ãa( Ãa( Ãa( A1 t-t"tHtuI I I 
I  I A1 t-t"tHtuI I I 
I  I A1 t-t"tHtuI I I 
I  I A1 t-t"tHtuI I I 
I  I A1 t-t"tHtuI I I 
I  I A1 t-t"tHtuI I I 
I  I A2 t-t"tHtuI I I 
I  I A2 t-t"tHtuI I I 
I  I A2 t-t"tHtuI I I 
I  I A2 t-t"tHtuI I I 
I  I A2 t-t"tHtuI I I 
I  I A2 t-t"tHtuI I I 
I  I vu薘    謕2ð̋Vgxuu`    v2^ð^u3    I2ð,u    #2ð̋V>uuח    2^ð^	u誗    2ðsu脗    蚔2ð̋VoluBuN    d2^ð^u!    72ðXuu    2ð̋Vku-uŖ    ۓ2^ð^'u蘖    讓2ð̋UQVj 
ft#F1H  EuԿtFN^̋UQVj t#F1H  Eu茿tFN^̋UQVj 5t#F1H  EuDtFN^̋Vj eu^ÍFPF1H  P2^̋Vj Zu^ÍFPF1H  P^̋Vj !u^ÍFPF1H  Pʙ^̋VF2H  PF<ltFN^̋VF2H  PF<~ltFN^̋VF2H  PF<JltFN^̍QA<RQ2H  Rk̍QA<RQ2H  Rk̍QA<RQ2H  Rbk̋SVh   ^1PFF<  0t=SH  TtFNF@N1Fu趓    ̐2^[ ̋SVh   ^1PFF<  0Dt=SH  ̼tFNF@N1Fu.    D2^[ ̋SVh   ^1PFF<  0t=SH  DtFNF@N1Fu覒    輏2^[ ̋SVh   ^1PFF<  04t4FPSH  F@N1Fu'    =2^[ ̋SVh   ^1PFF<  0跿t4FPSH  oF@N1Fu誑    2^[ ̋SVh   ^1PFF<  0:t4FPSH  F@N1Fu-    C2^[ A< A< A< A< A< A< ̃I(3A$A0A A,A<̃I(3A$A0A A,A<̃I(3A$A0A A,A<̃I(3A$A0A A,A<̃I(3A$A0A A,A<̃I(3A$A0A A,A<̃I(3A$A0A A,A<̃I(3A$A0A A,A<̃I(3A$A0A A,A<̃I(3A$A0A A,A<̃I(3A$A0A A,A<̃I(3A$A0A A,A<̀y1*Q(tRÃAA@y
̋V~1*tF(Ph^u^Ët
~( }N(^̀y1*Q(tRÃAA@y
̀y1*Q(tR腲ÃAA@y
̋V~1*tF(P贮^ku^Ë,t
~( }N(^̀y1*Q(tR{ÃAA@y
fy2*Q(tR蛁ÃAA@y
̋Vf~2*tF(PϽ^iu^ËOt
~( }N(^fy2*Q(tRjÃAA@y
fy2*Q(tRpÃAA@y
̋Vf~2*tF(PX^u^Ë葱t
~( }N(^fy2*Q(tRc}ÃAA@y
̊A1<Fu 6  A   r<Nu&jZ#   Qy    菉2Ãy, u<j      <ItC<Lt3<Tt#<h   A8hu@A3@   j   A,      A,      Q<3uz2uBA,
   A   <6uz4uBA,   Ak<dt<it<ot<ut<xt<XuSA,	   JA,   A<lt'<tt<wt<zu1A,   (A,   A,   A8lu@AjjXA,̊A1<Fu 6  A   ۅ<Nu&jZ#   Q؊    2Ãy, u<j      <ItC<Lt3<Tt#<h   A8hu@A3@   j   A,      A,      Q<3uz2uBA,
   A   <6uz4uBA,   Ak<dt<it<ot<ut<xt<XuSA,	   JA,   A<lt'<tt<wt<zu1A,   (A,   A,   A8lu@AjjXA,̊A1<Fu 6  A   u<Nu&jZ#   Q7    M2Ãy, u<j      <ItC<Lt3<Tt#<h   A8hu@A3@   j   A,      A,      Q<3uz2uBA,
   A   <6uz4uBA,   Ak<dt<it<ot<ut<xt<XuSA,	   JA,   A<lt'<tt<wt<zu1A,   (A,   A,   A8lu@AjjXA,̊A1<Fu 6  A   O<Nu&jZ#   Q薇    謄2Ãy, u<j      <ItC<Lt3<Tt#<h   A8hu@A3@   j   A,      A,      Q<3uz2uBA,
   A   <6uz4uBA,   Ak<dt<it<ot<ut<xt<XuSA,	   JA,   A<lt'<tt<wt<zu1A,   (A,   A,   A8lu@AjjXA,̊A1<Fu 6  A   {<Nu&jZ#   Q    2Ãy, u<j      <ItC<Lt3<Tt#<h   A8hu@A3@   j   A,      A,      Q<3uz2uBA,
   A   <6uz4uBA,   Ak<dt<it<ot<ut<xt<XuSA,	   JA,   A<lt'<tt<wt<zu1A,   (A,   A,   A8lu@AjjXA,̊A1<Fu 6  A   +e<Nu&jZ#   QT    j2Ãy, u<j      <ItC<Lt3<Tt#<h   A8hu@A3@   j   A,      A,      Q<3uz2uBA,
   A   <6uz4uBA,   Ak<dt<it<ot<ut<xt<XuSA,	   JA,   A<lt'<tt<wt<zu1A,   (A,   A,   A8lu@AjjXA,Q2VFu Z  A   ^3_Nu'jZ# 8  Q謂    2^Ãy, ujj^f;      ItKLt:Tt)jhZf;   Af9uA3@   j   A,      A,      Q3ufz2uBA,
   A   6ufz4uBA,   Azdtitotut
xtXu\A,	   SA,   Jjl^f;t*ttwtzu3A,   *A,   !A,   Af90u
AjjXA,^Q2VFu Z  A   ^ɛNu'jZ# 8  Qր    }2^Ãy, ujj^f;      ItKLt:Tt)jhZf;   Af9uA3@   j   A,      A,      Q3ufz2uBA,
   A   6ufz4uBA,   Azdtitotut
xtXu\A,	   SA,   Jjl^f;t*ttwtzu3A,   *A,   !A,   Af90u
AjjXA,^Q2VFu Z  A   ^sNu'jZ# 8  Q     |2^Ãy, ujj^f;      ItKLt:Tt)jhZf;   Af9uA3@   j   A,      A,      Q3ufz2uBA,
   A   6ufz4uBA,   Azdtitotut
xtXu\A,	   SA,   Jjl^f;t*ttwtzu3A,   *A,   !A,   Af90u
AjjXA,^Q2VFu Z  A   ^xNu'jZ# 8  Q*}    @z2^Ãy, ujj^f;      ItKLt:Tt)jhZf;   Af9uA3@   j   A,      A,      Q3ufz2uBA,
   A   6ufz4uBA,   Azdtitotut
xtXu\A,	   SA,   Jjl^f;t*ttwtzu3A,   *A,   !A,   Af90u
AjjXA,^Q2VFu Z  A   ^Nu'jZ# 8  QT{    jx2^Ãy, ujj^f;      ItKLt:Tt)jhZf;   Af9uA3@   j   A,      A,      Q3ufz2uBA,
   A   6ufz4uBA,   Azdtitotut
xtXu\A,	   SA,   Jjl^f;t*ttwtzu3A,   *A,   !A,   Af90u
AjjXA,^Q2VFu Z  A   ^ucNu'jZ# 8  Q~y    v2^Ãy, ujj^f;      ItKLt:Tt)jhZf;   Af9uA3@   j   A,      A,      Q3ufz2uBA,
   A   6ufz4uBA,   Azdtitotut
xtXu\A,	   SA,   Jjl^f;t*ttwtzu3A,   *A,   !A,   Af90u
AjjXA,^̋UQQSV3jXYF1dl   ;?t7A   Ct?D~G   Suz~   2  jjWZttVHuS輌ыȃpMt?g~1itntouÅ뤋`]뛃N Sj
i닋L낋\vsfHtЃfSi8^0.  f]]3ҋ^ BÉMt/tE-tE+ʉMt	E ʉUV1xtXut2ۀat	At2ut D0Xt	AtxjXXDMW~$^+~8H  +F uSWj P*zMFPSQEPH  豠N tuSWH  j0Pyj H; |F tSWH  j Py_^[̋UQQSV3jXYF1dl   ;?t7A   Ct?D~G   SuX   2  jjWZttVHuS藑ы˟ȃpMt?g~1itntouz뤋A뛃N Sj
q닋I낋3vsfHtЃfSiji7  8^0.  f]]3ҋ^ BÉMt/tE-tE+ʉMt	E ʉUV1xtXut2ۀat	At2ut D0Xt	AtxjXXDMW~$^+~8H  +F uSWj P]wMFPSQEPH  N tuSWH  j0Pwj |; |F tSWH  j Pv_^[̋UQQSV3jXYF1dl   ;?t7A   Ct?D~G   SudU   2  jjWZttVHuSRSыPȃpMt?g~1itntouZ뤋2~뛃N Sj
م닋0q낋yBvsfHtЃfSi8^0.  f]]3ҋ^ BÉMt/tE-tE+ʉMt	E ʉUV1xtXut2ۀat	At2ut D0Xt	AtxjXXDMW~$^+~8H  +F uSWj PtMFPSQEPH  "N tuSWH  j0P\tj ;; |F tSWH  j P1t_^[̋UQQSV3jXYF1dl   ;?t7A   Ct?D~G   Suj   2  jjWZttVHuSxы轇ȃpMt?g~1itntou"E뤋_뛃N Sj
Ԓ닋p낋{vsfHtЃfSi8^0.  f]]3ҋ^ BÉMt/tE-tE+ʉMt	E ʉUV1xtXut2ۀat	At2ut D0Xt	AtxjXXDMW~$^+~8H  +F uSWj PMuMFPSQEPH  謌N tuSWH  j0Puj ; |F tSWH  j Pt_^[̋UQQSV3jXYF1dl   ;?t7A   Ct?D~G   Su@   2  jjWZttVHuSeы裟ȃpMt?g~1itntou;뤋o뛃N Sj
cM닋ߐ낋nSvsfHtЃfSiMO7  8^0.  f]]3ҋ^ BÉMt/tE-tE+ʉMt	E ʉUV1xtXut2ۀat	At2ut D0Xt	AtxjXXDMW~$^+~8H  +F uSWj PrMFPSQEPH  ߉N tuSWH  j0PArj M; |F tSWH  j Pr_^[̋UQQSV3jXYF1dl   ;?t7A   Ct?D~G   Su   2  jjWZttVHuS]ы賓ȃpMt?g~1itntout뤋c뛃N Sj
HI닋8낋vsfHtЃfSi8^0.  f]]3ҋ^ BÉMt/tE-tE+ʉMt	E ʉUV1xtXut2ۀat	At2ut D0Xt	AtxjXXDMW~$^+~8H  +F uSWj PoMFPSQEPH  N tuSWH  j0Poj BA; |F tSWH  j PTo_^[̋U(03ŉESV3jAZjXF2Ydwk   ;w>t6;   Ct?DvG   Sur8   2  jj\Ztt[HuS0ыqXȃpwUtGerăgv1itntouEB럋떃N Sj
{놋FzZmns^Ht̓^Sa8^0B  ˉ]f]3ҋ^ BWÉMj _t0tj-tj+XfEMt	f}ʉUV2jx_f;tjXXf;ut2ۃatjAXf;t2E0   ut%EjXfDMXf;tjA[f;uf|MM^$F+^8H  +F uPSj WaMFPFPQEPmN tuFPSuW%j 讒N9 |F tQSj W_M^3[Z̋U(03ŉESV3jAZjXF2Ydwk   ;w>t6;   Ct?DvG   SuaW   2  jj\Ztt[HuSnыjȃpwUtGerăgv1itntou럋FA떃N Sj
i놋趔zIns^Ht̓^Sa%^K  8^0B  ˉ]f]3ҋ^ BWÉMj _t0tj-tj+XfEMt	f}ʉUV2jx_f;tjXXf;ut2ۃatjAXf;t2E0   ut%EjXfDMXf;tjA[f;uf|MM^$F+^8H  +F uPSj WTMFPFPQEPrjN tuFPSuWj lN9 |F tQSj W_M^3[W̋U(03ŉESV3jAZjXF2Ydwk   ;w>t6;   Ct?DvG   SuR   2  jj\Ztt[HuSG0ыڎȃpwUtGerăgv1itntouL럋B떃N Sj
螗놋ɕz薔ns^Ht̓^Sa8^0B  ˉ]f]3ҋ^ BWÉMj _t0tj-tj+XfEMt	f}ʉUV2jx_f;tjXXf;ut2ۃatjAXf;t2E0   ut%EjXfDMXf;tjA[f;uf|MM^$F+^8H  +F uPSj WRMFPFPQEPpgN tuFPSuWj ~SN9 |F tQSj W_M^3[T̋U(03ŉESV3jAZjXF2Ydwk   ;w>t6;   Ct?DvG   SuB   2  jj\Ztt[HuSeыȃpwUtGerăgv1itntouA럋j떃N Sj
$C놋wz|:ns^Ht̓^Sa8^0B  ˉ]f]3ҋ^ BWÉMj _t0tj-tj+XfEMt	f}ʉUV2jx_f;tjXXf;ut2ۃatjAXf;t2E0   ut%EjXfDMXf;tjA[f;uf|MM^$F+^8H  +F uPSj W$cMFPFPQEP$IN tuFPSuWbj o/N9 |F tQSj Wb_M^3[Q̋U(03ŉESV3jAZjXF2Ydwk   ;w>t6;   Ct?DvG   Su]   2  jj\Ztt[HuSDыnȃpwUtGerăgv1itntouC럋A떃N Sj
e놋Zbz.ns^Ht̓^Sa/CK  8^0B  ˉ]f]3ҋ^ BWÉMj _t0tj-tj+XfEMt	f}ʉUV2jx_f;tjXXf;ut2ۃatjAXf;t2E0   ut%EjXfDMXf;tjA[f;uf|MM^$F+^8H  +F uPSj W`MFPFPQEPFN tuFPSuW_j zN9 |F tQSj W__M^3[N̋U(03ŉESV3jAZjXF2Ydwk   ;w>t6;   Ct?DvG   SuI1   2  jj\Ztt[HuSTыCȃpwUtGerăgv1itntou7럋軈떃N Sj
u-놋Nsz=ns^Ht̓^Sa8^0B  ˉ]f]3ҋ^ BWÉMj _t0tj-tj+XfEMt	f}ʉUV2jx_f;tjXXf;ut2ۃatjAXf;t2E0   ut%EjXfDMXf;tjA[f;uf|MM^$F+^8H  +F uPSj W]MFPFPQEPCN tuFPSuW\j TN9 |F tQSj W\_M^3[K̀y1*Q$tR蘆ÃAA@yI ؉̋V~1*tF$P.^P3u^Ë裇tF$y	N ؉F$^̀y1*Q$tR׀ÃAA@yI ؉̀y1*Q$tRUxÃAA@yI ؉̋V~1*tF$P~t^gu^ËotF$y	N ؉F$^̀y1*Q$tRAÃAA@yI ؉fy2*Q$tRWGÃAA@yI ؉̋Vf~2*tF$P脃^
)u^Ë^tF$y	N ؉F$^fy2*Q$tR|0ÃAA@yI ؉fy2*Q$tRKÃAA@yI ؉̋Vf~2*tF$P^}u^Ë0wtF$y	N ؉F$^fy2*Q$tRBÃAA@yI ؉j	Xj	Xj	Xj	XjXjXjXjXøøøøøøøøÍA4 A4ÍA4ÍA4 UEw $3@]jX]jj3]ÍI       jjADjjNjjejjAujj2jj,1jj6fjjWjj=jj6jj\jj&̋SVWFFxt._t'v,F1Pv6`^4tF<jF4xYF< _N8^[̋VW3\  uTFFx   S   _   v,F1Pv6P`^4tnF<j
  cvP    M;ɃX  uv,F1Pd  ȋjP#!l  8^2jF4xYF< N8[_^̋SVWFFxt._t'v,F1Pv6d_^4tF<jF4xYF< _N8^[̋SVWFFxt._t'v,F1Pv6^^4tF<jF4xYF< _N8^[̋VW3\  uTFFx>j   S   _   v,F1Pv6b^^4tnF<j
  cvN    ,K;ɃX  uv,F1Pd  ȋjP9l  8^2jF4xYF< N8[_^̋SVWFFxt._t'v,F1Pv6v]^4tF<jF4xYF< _N8^[̋SVWFFxt._t'v,F2Pv6j&^4tF<jF4xYF< _N8^[̋VW3\  uTFFxW   S   _   v,F2Pv6%^4tnF<j
  cv(L    >I;ɃX  uv,F2Pd  ȋjPJl  8^2jF4xYF< N8[_^̋SVWFFxt._t'v,F2Pv6$^4tF<jF4xYF< _N8^[̋SVWFFxt._t'v,F2Pv6|$^4tF<jF4xYF< _N8^[̋VW3\  uTFFxo   S   _   v,F2Pv6#^4tnF<j
  cv:J    PG;ɃX  uv,F2Pd  ȋjPul  8^2jF4xYF< N8[_^̋SVWFFxt._t'v,F2Pv6"^4tF<jF4xYF< _N8^[̋UQQV3BWN F(yF1<at<AtjjXF(uN1gt3GuV(]  ~@P]uym-]  F(  uǉF4FNSAEAωEGm  ȅuvF1v6v(PQ>PmPESPQF ([t~( uvv4-YYF1<gt<GuF uvv4CoYYV4<-u
N @BV4<it<It<nt<Nuf F1sz
Bu+װ_V8^̋UQQVWN 9aY  4zuI  F(3ByF1<at<AtjjXF(uN1gt3GuV(]  ~@P<\uk-]  F(  uǃe ΃e F4EP   S~k  ȅuvF1v6v(PQP<PPkPESPOF ([t~( uvv4+YYF1<gt<GuF uvv4zmYYV4<-u
N @BV4<it<It<nt<Nuf F1sz
Bu+׉V82_^̋UQQV3BWN F(yF1<at<AtjjXF(uN1gt3GuV(]  ~@PZui-]  F(  uǉF4FNSAEAωEi  ȅuvF1v6v(PQ:PiPESP6NF ([t~( uvv4*YYF1<gt<GuF uvv4kYYV4<-u
N @BV4<it<It<nt<Nuf F1sz
Bu+װ_V8^̋UQQV3BWN F(yF1<at<AtjjXF(uN1gt3GuV(]  ~@PXu\h-]  F(  uǉF4FNSAEAωE*h  ȅuvF1v6v(PQ8PgPESPLF ([t~( uvv4q(YYF1<gt<GuF uvv4&jYYV4<-u
N @BV4<it<It<nt<Nuf F1sz
Bu+װ_V8^̋UQQVWN Y  $^uI  F(3ByF1<at<AtjjXF(uN1gt3GuV(]  ~@PWuf-]  F(  uǃe ΃e F4EP5   Saf  ȅuvF1v6v(PQ37P3fPESPJF ([t~( uvv4&YYF1<gt<GuF uvv4]hYYV4<-u
N @BV4<it<It<nt<Nuf F1sz
Bu+׉V82_^̋UQQV3BWN F(yF1<at<AtjjXF(uN1gt3GuV(]  ~@PeUud-]  F(  uǉF4FNSAEAωEd  ȅuvF1v6v(PQ5PdPESPIF ([t~( uvv4$YYF1<gt<GuF uvv4fYYV4<-u
N @BV4<it<It<nt<Nuf F1sz
Bu+װ_V8^̋UQQSVW3jg[jGN BF(_yF2at	AtjjXF(uN2f;t3f;uV(]  ~@PSu4c-]  F(  uǉF4FNAEAωEc  ȅuvF2v6v(PQ3PbPESPmGF (t~( uvv4K#YYF2jgYf;tjGYf;uF uvv4dYYV4<-u
N @BV4<it<It<nt<Nuf jsXfF2z
Bu+װ_V8^[̋UQQSVWN bm  Gu]  F(3jg[BjG_yF2at	AtjjXF(uN2f;t3f;uV(]  ~@PQuWa-]  F(  uǃe ΃e F4EP_   a  ȅuvF2v6v(PQ1P`PESPEF (t~( uvv4f!YYF2jgYf;tjGYf;uF uvv4cYYV4<-u
N @BV4<it<It<nt<Nuf jsXfF2z
Bu+׉V82_^[̋UQQSVW3jg[jGN BF(_yF2at	AtjjXF(uN2f;t3f;uV(]  ~@PPu_-]  F(  uǉF4FNAEAωEP_  ȅuvF2v6v(PQ"0P"_PESPCF (t~( uvv4YYF2jgYf;tjGYf;uF uvv4DaYYV4<-u
N @BV4<it<It<nt<Nuf jsXfF2z
Bu+װ_V8^[̋UQQSVW3jg[jGN BF(_yF2at	AtjjXF(uN2f;t3f;uV(]  ~@PGNu]-]  F(  uǉF4FNAEAωE]  ȅuvF2v6v(PQd.Pd]PESPAF (t~( uvv4YYF2jgYf;tjGYf;uF uvv4_YYV4<-u
N @BV4<it<It<nt<Nuf jsXfF2z
Bu+װ_V8^[̋UQQSVWN Bbm  /\u]  F(3jg[BjG_yF2at	AtjjXF(uN2f;t3f;uV(]  ~@PjLu[-]  F(  uǃe ΃e F4EP   [  ȅuvF2v6v(PQ,P[PESP@F (t~( uvv4YYF2jgYf;tjGYf;uF uvv4]YYV4<-u
N @BV4<it<It<nt<Nuf jsXfF2z
Bu+׉V82_^[̋UQQSVW3jg[jGN BF(_yF2at	AtjjXF(uN2f;t3f;uV(]  ~@PJuZ-]  F(  uǉF4FNAEAωEY  ȅuvF2v6v(PQ*PYPESPI>F (t~( uvv4'YYF2jgYf;tjGYf;uF uvv4[YYV4<-u
N @BV4<it<It<nt<Nuf jsXfF2z
Bu+װ_V8^[j XIj Pj ij <j ,j (j 7Lj >j Ij ;j j Ef̋VWv,F1~@Pv6Ct9FFS  @uPXPF8SP![t%F0  uσFF@F8     t~4_^ ̋UQVWv,F1Pv6BtS3fEEP(tYrets~@S  uu5WPF8SP [t7F01~@  uPPu2#etF8     t~4_^ ̋VWv,F1~@Pv6Bt9FFS  @uPcVPF8SP [t%F0  uσFF@F8     t~4_^ ̋VWv,F1~@Pv6TAt9FFS  @uPUPF8SPS[t%F0  uσFF@F8     t~4_^ ̋UQVWv,F1Pv6@tS3fEEP!tY*Lts~@S  uuTPF8SP[t7F01~@  uP]9u2#KtF8     t~4_^ ̋VWv,F1~@Pv6?t9FFS  @uPTPF8SP[t%F0  uσFF@F8     t~4_^ ̋UQSVWF<~@FFv,XF2Pv6Ou2  ]EuϋFP pEPQdyF0  uf  t~4_F8   ^[ ̋UQV3fEEPF<5   8twF2Wv,~@Pv6~  u0EEE uϋFP pEPQyF0ufEf  t~4F8   _^ ̋UQSVWF<~@FFv,XF2Pv6u2  ]EuϋFP pEPQyF0  uf  t~4_F8   ^[ ̋UQSVWF<~@FFv,XF2Pv6u2  ]EuϋFP pEPQyF0  uf  t~4_F8   ^[ ̋UQV3fEEPF<#   JPtwF2Wv,~@Pv60  u0EEE uϋFP pEPQAyF0ufEf  t~4F8   _^ ̋UQSVWF<~@FFv,XF2Pv6nu2  ]EuϋFP pEPQyF0  uf  t~4_F8   ^[ ̃I j j
̃I j j
d'̃I j j
d>̃I j j
ÑI j j
H̃I j j
	̃I j j
>̃I j j
@0̃I j j
`̃I j j
b̃I j j
4̃I j j
̋UQSVWv,YȉEtxtVIt3tX)    n&2  F FFxXZF FFt@?x3=F FFt@!@F FFt@@ڋN t|s߃ ۃ@N ~( }	F(   v(N N@=uf ߃}uF< uu	SWSW2IF t~8 tF480tN4N40F8_^[ ̋UVv,\e e YȉE   t^It:t'    $2+  F EPtI_[XF EPt\AA8;:F EPt#NCF EPt{Y   N S]W}t|s߃ ۃ@N ~( }	F(   v(N N@;uf ߃}uF< uu	SWrWF _[t~8 tF480tN4N40F8^ ̋UQSVWv,{YȉEtxtVIt3t%    "2  F FFxXZF FFt@?x3=F FFt@!@F FFt@@ڋN t|s߃ ۃ@N ~( }	F(   v(N N@.:uf ߃}uF< uu	SW0W*F t~8 tF480tN4N40F8_^[ ̋UQSVWv,YȉEtxtVIt3t-$    C!2  F FFxXZF FFt@?x3=F FFt@!@F FFt@@ڋN t|s߃ ۃ@N ~( }	F(   v(N N@8uf ߃}uF< uu	SW$WHF t~8 tF480tN4N40F8_^[ ̋UVv,1e e YȉE   t^It:t|"    2+  F EPtHC__4XF EPtFAO:F EPt#^?F EPt9p{=   N S]W}t|s߃ ۃ@N ~( }	F(   v(N N@6uf ߃}uF< uu	SWt+WLF _[t~8 tF480tN4N40F8^ ̋UQSVWv,PYȉEtxtVIt3t     2  F FFxXZF FFt@?x3=F FFt@!@F FFt@@ڋN t|s߃ ۃ@N ~( }	F(   v(N N@5uf ߃}uF< uu	SW9WUF t~8 tF480tN4N40F8_^[ ̋UQSVWv,	YȉEtxtVIt3t    2	  F FFxXZF FFt@?x3=F FFt@!@F FFt@@ڋN t|s߃ ۃ@N ~( }	F(   v(N N@Auf ߃}uF<uu	SW"LW$F t~8 j0ZtF4f9tF4N4fF8_^[ ̋UVv,e e YȉE   t^It:tL    b2/  F EPtE_A'XF EPtzJA:F EPt
#VF EPtzH{U'   N S]W}t|s߃ ۃ@N ~( }	F(   v(N N@?uf ߃}uF<uu	SWSWF _[t~8 j0ZtF4f9tF4N4fF8^ ̋UQSVWv,YȉEtxtVIt3tr    2	  F FFxXZF FFt@?x3=F FFt@!@F FFt@@ڋN t|s߃ ۃ@N ~( }	F(   v(N N@=uf ߃}uF<uu	SWNWf5F t~8 j0ZtF4f9tF4N4fF8_^[ ̋UQSVWv,qYȉEtxtVIt3t    2	  F FFxXZF FFt@?x3=F FFt@!@F FFt@@ڋN t|s߃ ۃ@N ~( }	F(   v(N N@M<uf ߃}uF<uu	SWS1W6KF t~8 j0ZtF4f9tF4N4fF8_^[ ̋UVv,e e YȉE   t^It:t    (2/  F EPt_XF EPt<A:F EPt)M#5F EPt?3
{<   N S]W}t|s߃ ۃ@N ~( }	F(   v(N N@s:uf ߃}uF<uu	SWW%F _[t~8 j0ZtF4f9tF4N4fF8^ ̋UQSVWv, YȉEtxtVIt3t8    N2	  F FFxXZF FFt@?x3=F FFt@!@F FFt@@ڋN t|s߃ ۃ@N ~( }	F(   v(N N@8uf ߃}uF<uu	SWYLWF t~8 j0ZtF4f9tF4N4fF8_^[ ̋VWFFx$u    2Dv,Yt+tHtu΋FWFfFfFF0_^̋UQe EVP=u2vFtizu    v,mYt4t#HtuЋFMQENEfNfENF0^̋VWFFxuV    l2Dv,Yt+tHtu΋FWFfFfFF0_^̋VWFFxFu    2Dv,7Yt+tHtu΋FWFfFfFF0_^̋UQe EVPu2v.tiu    1v,Yt4t#HtuЋFMQENEfNfENF0^̋VWFFxux    2Dv,Yt+tHtu΋FWFfFfFF0_^̋VWFFxhu    2Dv,YYt+tHtu΋FWFfFfFF0_^̋UQe EVPY$u2vtiu=    Sv,Yt4t#HtuЋFMQENEfNfENF0^̋VWFFxu    2Dv,Yt+tHtu΋FWFfFfFF0_^̋VWFFxu	    2Dv,{Yt+tHtu΋FWFfFfFF0_^̋UQe EVPu2v2tiu_    uv,Yt4t#HtuЋFMQENEfNfENF0^̋VWFFx=u    
2Dv,.Yt+tHtu΋FWFfFfFF0_^̋Q t	ʀ   Q j j̋Q t	ʀ   Q j j0
̋Q t	ʀ   Q j j!̋Q t	ʀ   Q j j0̋Q t	ʀ   Q j j̋Q t	ʀ   Q j je̋Q t	ʀ   Q j jU!̋Q t	ʀ   Q j j̋Q t	ʀ   Q j j(C̋Q t	ʀ   Q j j̋Q t	ʀ   Q j j̋Q t	ʀ   Q j jjjA(   A,
   ;jjA(   A,
   wjjA(   A,
   jjjA(   A,
   /jjA(   A,
   4jjA(   A,
   jjA(   A,
   jjA(   A,
   jjA(   A,
   AjjA(   A,
   jjA(   A,
   ejjA(   A,
   1̋SVWFF^(x~4uv,F1Pv6tuh~4SWF<cux~4SWYY_F8^[̋VW~4Wth:<t[S^(uv,F1?Pv6stuh~4SWF<ux~4SWYYF8[_^̋SVWFF^(x~4uv,F1Pv6tuh~4SWF<9ux~4SWiYY_F8^[̋SVWFF^(x~4uv,F1Pv6Vtuh~4SWF<ux~4SWYY_F8^[̋VW~4W#th#t[S^(uv,F1?Pv6tuh~4SWF<ux~4SWBYYF8[_^̋SVWFF^(x~4uv,F1Pv6,tuh~4SWF<ux~4SWYY_F8^[̋SVWFF^(x~4uv,F2Pv6tuh~4SWF<YYuF4xj S
_F8^[̋SV^4S$tjt]W~(uv,F2Pv6gtuh^4WSF<YYYuF4xj WuF8_^[̋SVWFF^(x~4uv,F2Pv6tuh~4SWF<
YYuF4xj Sv7_F8^[̋SVWFF^(x~4uv,F2Pv6Etuh~4SWF<7
YYuF4xj Sb_F8^[̋SV^4S^;tj(t]W~(uv,F2Pv6tuh^4WSF<	YYuF4xj WF8_^[̋SVWFF^(x~4uv,F2Pv6tuh~4SWF<	YYuF4xj S_F8^[̋Uuq4	YY] ̋Uuq4	YY] ̋Uuq4	YY] ̋Uuq4	YY] ̋Uuq4	YY] ̋Uuq4x	YY] ̋USVW3s49}~*t$h   PC 0?0tFFG;}|֋_^[] ̋USVW3s49}~*t$h   PC 0/tFFG;}|֋_^[] ̋USVW3s49}~*t$h   PC 0/tFFG;}|֋_^[] ̋USVW3s49}~*t$h   PC 07/tFFG;}|֋_^[] ̋USVW3s49}~*t$h   PC 0.tFFG;}|֋_^[] ̋USVW3s49}~*t$h   PC 0.tFFG;}|֋_^[] j j
Ej j
j j
j j
E$j j
j j
0j j
:j j
j j
A7j j
j j
#j j
j jj jj jj j#j jj jj jj jj j6j j)j j
j jq̋UE!A ] ̋UE!A ] ̋UE!A ] ̋UE!A ] ̋UE!A ] ̋UE!A ] ̋UE!A ] ̋UE!A ] ̋UE!A ] ̋UE!A ] ̋UE!A ] ̋UE!A ] ̋UQV\  uFVJN$   e Ej
PvPX  PEHNuSx;8$u6d}1
  ;~v,
  F1Pd  jP($    2ҋl   F$^̋UQV\  uFVJN$   e Ej
PvoX  PEHNuSx;8$u6d}1
  ;~v,
  F1Pd  jP$    2ҋl   F$^̋UQV\  uFVJN$   e Ej
PvX  PEHNuTx<f8$u6d}1
  ;~v,
  F2Pd  jP$    "2ҋl   F$^̋UQV\  uFVJN$   e Ej
PvX  PEHNuTx<f8$u6d}1
  ;~v,
  F2Pd  jP&$*    @2ҋl   F$^̃AA@A$̃AA@A$̃AA@A$̃AA@A$̋UQV\  uFVJN(   e Ej
PvzX  PEHNuSx;8$u6d}1
  ;~v,
  F1Pd  jPR$    2ҋl   F(^̋UQV\  uFVJN(   e Ej
PvX  PEHNuSx;8$u6d}1
  ;~v,
  F1Pd  jP$$    .2ҋl   F(^̋UQV\  uFVJN(   e Ej
PvX  PEHNuTx<f8$u6d}1
  ;~v,
  F2Pd  jPI$6    L2ҋl   F(^̋UQV\  uFVJN(   e Ej
Pv8X  PEHNuTx<f8$u6d}1
  ;~v,
  F2Pd  jP#$T    j2ҋl   F(^̃AA@A(̃AA@A(̃AA@A(̃AA@A(̃9 Ëu    2PỸ9 u{    2ð̃9 uZ    p2ð̃9 u9    O2ð̋UU: uEEBEB] uuuRu    2̋UU: uEEBEB] uuuRu    2̋UU: uEfEfBEB] uuuRu*    @2̋UU: uEfEfBEB] uuuRu    2̋UQQSV3C9^uoF%te\  ui!U0|Y9Tj
MQP~5E8$u-9X  uh@  d  j P>Fǆ\     \  ^[É\  Ӄue Mj
QP(UHB
  F9X  ux:$ud}
  ;ȉ
      2̋UQQSV3C9^uoF%te\  ui!U0|Y9Tj
MQPW~5E8$u-9X  uh@  d  j PFǆ\     \  ^[É\  Ӄue Mj
QPUHB
  F9X  ux:$ud}
  ;ȉ
      2̋UQQSV3CW9^utF%ti\  3ul}0r\9wWj
MQP~7Ej$Yf9u,9X  uh@  d  WPFǆ\     \  _^[É\  Ӄuj
M}QPUHB
  F9X  ux!j$Xf9ud}
  ;ȉ
  J    `2̋UQQSV3CW9^utF%ti\  3ul}0r\9wWj
MQP>~7Ej$Yf9u,9X  uh@  d  WPFǆ\     \  _^[É\  Ӄuj
M}QPUHB
  F9X  ux!j$Xf9ud}
  ;ȉ
  	    2̰ðððÃy tyt    2ð̃y tyts    2ð̃y tytI    _2ð̃y tyt    52ð̋Vu^Ã\  SWu[X  uR
  Fd  ;t:V߉Wtt
tu"FFVd  ;uɰ_[^    2̋V/u^Ã\  SWu[X  uR
  Fd  ;t:V߉Wtt
tu"FFVd  ;uɰ_[^    2̋V8u^Ã\  SWu[X  uR
  Fd  ;t:V߉Wtt
tu"FFVd  ;uɰ_[^    32̋V1u^Ã\  SWu[X  uR
  Fd  ;t:V߉Wtt
tu"FFVd  ;uɰ_[^i    2̰ðððÃ\  uCX  u:
  cv    2q,A1Pd  jP1ð̃\  uCX  u:
  cv    2q,A1Pd  jPð̃\  uCX  u:
  cvD    Z2q,A2Pd  jP'ð̃\  uCX  u:
  cv    2q,A2Pd  jPyð̰ðððËUMVAunWQ^Y2ttЃ?k8<fЋ?) _utt
k8fA-t#    92^]̰øhøhøhøhøhøhøhøhøhøhøhøhËUuEt ] ̋Uu/Et ] ̋Uы
A;AEuy t @ @E ] ̋Uы
A;AEuy t @ @fEf ] ̋U@tx u1EPYY] ̋U@tx u1u9YY  f;] ̋U(03ŉESVW~< t^F8~W~43ۅtge PjEPEP6u'9Et"FPFPuEPH  VC;^8uNFPFPv8H  v4/M_^3[ ̋U(03ŉESVW~< t^F8~W~43ۅtge PjEPEPfu'9Et"FPFPuEPH  C;^8uNFPFPv8H  v4_M_^3[ ̋U(03ŉESVW~< t^F8~W~43ۅtge PjEPEPu'9Et"FPFPuEPH  C;^8uNFPFPv8H  v4M_^3[ ̋U(03ŉESVW~< t^F8~W~43ۅtge PjEPEPu'9Et"FPFPuEPH  .C;^8uNFPFPv8H  v4M_^3[@ ̋U(03ŉESVW~< t^F8~W~43ۅtge PjEPEPu'9Et"FPFPuEPH  ^C;^8uNFPFPv8H  v47M_^3[p ̋U(03ŉESVW~< t^F8~W~43ۅtge PjEPEP&u'9Et"FPFPuEPH  C;^8uNFPFPv8H  v4gM_^3[ ̋UQQSVW~< u_F8~X^43th3fEFP pESPֲE~&uH  豺tFN]G;~8uNFPFPv8H  v4_^[ ̋UQQSVW~< u_F8~X^43th3fEFP pESPE~&uH  tFN]G;~8uNFPFPv8H  v48_^[ ̋UQQSVW~< u_F8~X^43th3fEFP pESPhE~&uH  CtFN]G;~8uNFPFPv8H  v4_^[ ̋USVW~< u^F8~WN43Mtd^3fEFP pEQP誰E~ SuH  MMGM;~8uFPFPv8H  v4|_^[ ̋USVW~< u^F8~WN43Mtd^3fEFP pEQPE~ SuH  ZMMGM;~8uFPFPv8H  v4_^[ ̋USVW~< u^F8~WN43Mtd^3fEFP pEQP<E~ SuH  裶MMGM;~8uFPFPv8H  v4_^[ ̋U@tx uME] ]@̋U@tx uME] ]̋USW}مtQVp9pux Et5++p;rVu00px Et8;t0^_[] ̋UQS]EtY Wx9xux Et=3+x;rV4?Vu0 M0^xx Et;t8_[ ̋US]VU3ucU3]M˃& EM;tRW}Pu&E u
$M8*u Mj?tUC;]uE_> ut^[ ̋US]VU3uU3]M& EKM;tTW}P/u&E u
^M8*u"Mj?	tU;]uE_> ut^[ ̋UEh   u 0	]̃=f ̋UMA=   wEH#E]3]̋U8EMUEEEEE܋EUMEua    wÅtEMEȍEE̍E܉EЍEEԍEE؍EPEȉMPEPM̋U8EMUEEEEE܋EUMEu    ÅtEMEȍEE̍E܉EЍEEԍEE؍EPEȉMPEPM̋U8EMUEEEEE܋EUMEu    1ÅtEMEȍEE̍E܉EЍEEԍEE؍EPEȉMPEPMk̋U8EMUEEEEE܋EUMEux    ÅtEMEȍEE̍E܉EЍEEԍEE؍EPEȉMPEPM9̋U8EMUEEEEE܋EUMEu    ÅtEMEȍEE̍E܉EЍEEԍEE؍EPEȉMPEPM̋U8EMUEEEEE܋EUMEu2    HÅtEMEȍEE̍E܉EЍEEԍEE؍EPEȉMPEPM̋Uu$u uuuuuu{ ]̋Uu$u uuuuuum ]̋Uu uuuuuuo]̋Uu uuuuuu]̋Uu uuuuuuڻ]̋Uu uuuuuuŹ]̋Uu uuuuuu蔵]̋Uu uuuuuu]̋UEM  fHf#E]̋UEM  fHf]̋UEM    ]̋UQQEEE3Ё3ȉME̋UQE3Ё3ȉME̋UQQEEE3E%3EEE̋UQE3E%3EEE̋U  3f#Mf;]̋UfM  ff#f;u3EQQ$xYYttt3@]jjX]ø   ]Ɂ   fuE u} tɃᐍ   ]EDzɃA@]Ɂ   ]̋UfE  f#Jf;uE u} uf;u3@]3]̋UVW  Wh?  `EYYM  #f;uLQQ$SYY~
~)t-EV\$$j%j\WVYYENDzHV\$$j%jčEPQQ$EHEEWV]E_^̋UE\$E$覢]̋UuEQQ$]̋UEPtY]̋UEVP^Yj^f;t9EPLYf;t*EEz	3@AujX3^]̋UE%   ]H̃=k \$D$%  =  u<$f$ffd$y ~D$f(f(f(fs4f~fTffʩ   u"=  |Yf=2  fL$D$D$~D$ff(f.zf=  |!=2  fT\fL$D$ffVfTf\$D$̋UEj P}EYY]̋UQQVuu       SW  Sh?  EYYM  #f;uHQQ$YYt&t!tEW\$$jjDSWEYY^Dz8QQ$9YYt%& W\$E$jj EVQQ$^SW]BE_[^̋U]UV3PPPPPPPPUI 
t	$uI 
t	$s ^̋UQHLMMQP<EYY   ̃=k F\$D$%  =  u<$f$ffd$ ~D$f( f(f(f(f(fsfs5fs4fT%f~fЋL$fff~=  |=2   f	\fVft$D$f!D$=  ~D$tf   |f(XffTf f fTfVĺ   ufD$D$ÃfD$T$ԃT$T$$D$̃\$D$%  =  q  <$f$ff\  f$    f(ffs4f f(@f(Pf(f(%`f(5pfTfVfXf %  f( f(@fTf\fYf\XfYf(fXƁ         *f
        Df( f(f(fYfYfXf( Yf(-fYf(fTfXfXfYYfXf(0fYf(ffYf(fXfXXXf$fW f  wLtb  wpf$f(@f(fTfV f  tfú  Of^f   4fY%    s<fW^ɺ	   fL$T$ԃT$T$$fD$ f$f(f~fs f~с  t  f$ $~$Í$        ̃\$D$%  =    <$f$ff
  f$fL$f=ffTfs,f fVf%   %  Y< f, f(4  +уʁ          fnffsffs&f fT%%   %  Y)Y,)fX4p.fV%XfTfsf f\f=%  %  Y, 8Y 8fX4AfT\XYYY\Y\XfL$f\\ff\X\\f%  =      -?  º@  +-p<  Ё     \\f%fTfT\fWҺ`@  fY\\YYf( UY-Yf(0UXfpX + -    ȃခ XXfY\fY\f(PUf(5fYfXfpYfW?  XfXf%fnYT$Yfs-fpDf(=XfYXffYYfYfXfYYfpYfpYYXXXXÃfL$ff~fTfs f~Ɂ            ځ  fs4fVӹ  fnfsfffffvfʁ      %   =     fL$f(ѹ  fnfTfs4ffffvf%    ȁ   r[ ff5f<$f(f~fs f~%=         {      fWC  ff=fYf~fs f~ tRfTfTfs,f fV%   %  Y< f, f(4> nЁ uT$    t0#  fnfs ff$^ʺ     #    fWffWfTfvfɁ         f       %   =   umfL$f(ѹ  fnfTfs4ffffvf%   =   t-fL$f%    tfffL$f%    9  fWfL$f%      fWXĺ  n  f$f~fs f~ҁ¹     kff0Yɺ   (  f$$fT$f~ u)fs f~  ?     ufffWfTfvf%   =   ucff$$%     у     tf%  =?  r!fWf%  =?  sfWf Xº  Uf~fs f~f    t,f~   %=  wr wf ÃfD$T$ԃT$T$$fD$(Ã ~(=   "  VЃ     W?  &=   VЃ     W    XX fY\fY\f(PUf(5fYfXfpYXXf%fnʁ  fW?  fYT$Yfs-fpDf(=XfYXffYYfYfXfYYfpYfpYYfnfs-fnfvfXXfTXfWfvf\XfTf_\XXÃ A^YYXYXf%     =       ^XYYXf%     =      f(fnYfs-fV       tfY }f YlfpDfYf%  @  +-p<  Ё   $=   rɀ fnfs-f$$f  ?  f3%    ;Yf$fL$艖  $~$Í$    ̃=k \$D$%  =  u<$f$ffd$ ~D$f(f(f(fs4f~fTffʩ   tL=  |}f=2  fL$D$f.{$  T$ԃT$T$$*D$~D$ff(f=  |%=2  fTpXfL$D$ffTpf\$D$̋UVuW}Aw FBw G+uu_^]̋UMAA v]̋U=f u)} u    ]Ã} t]j uu]̋UVuu薹    謶dW}uw    荶DSuME􋘔   FG+uu} [t
MP  _^̋VWpY3j h  WtZP  r۰
j Y2_^̋UkEpYPp]̋V5Zt kWXYWpZu_^̋UkEpYPp]DjYj蓖Y̋UM3;t'@-rAwjX]ÍDjY;#]Ë]̋UVMQY觷0^]u1Ãu 1Ã̋UVuu
{jX褐 3^]̋UVuu
MjX" 3^]̋U>ujX]LM3]̋UujX]϶M3]̋UuY] ̋UuY] ̋UE] ̋UE] ̋V6& Y^̋V6& Y^̋! Ë! Ë! ËV6r& Y^̋V6\& Y^̋UQXHLMMQPEYY@̋UQ*HLMMQPEYY@̋UQHLMMQPEYY   ̋UQHLMMQPzEYY@̋UEu] @]̋UX(03ŉESVu3Wű]䋎   ]]܉u]  F]9uPh  QESP  jjSEj  WSEjWS}jh  SEjh  SE<9]  9]  M܅    9]  È@=   |EPvTq  E  EȃvT~  uEh   j Pک3U8]t+M܊Bt2;w FB;~8uۋűM܍   Sv   ARPRQh      MS$'  E   Sv   QPQuh      SQ$  ESv   Ph   u܉EjSą  E3҃}   fU؉MM   Z}Y   }   ~  uW   E؍   j+X++Eԍj2[;؋]E%    f]ԍA=   ~h}8]tb]GtV7u;wA Uԍ   +ыMč4sEظ   fvAGC;~U؋M]? u3ۋEj?Yj   EYjf   Yf   fű   tIu@   -   P      +P   +P   E       EE   E   E   EȉF$uuWuy3ۃCukY<   t   3   xǆ   ǆ   hF   M_^3[̋UQ
HLMMQP踻EYY ̡1jh`謔e E0Ye M  uE   ƋMd    Y_^[ uE0蝍Y̋UuSY] ̋UEMEEEPuEPŰUE ] ̋UEEA] ̋UE ] ̋UE] ̋V6& Y^1Y̋USVWF00  YYtC船E3ۋHLMHHEPSWSEMSP]Dt   "   3_^[ËEP賵YtMQjWuCPj t   "   SY믋} T$t&u t$Y d$ EP  u903u0 D$t"Iu t$uY d$ OC	ɉ\$	ɉD3SSSSSb1 Y̋ËV6& Y^̋UEt
;Et;Et]u$u uuu踧̋UQ} uj uYYVWhu3EWWP̒t
tS"tNjuYYt/juuVW蚒tt!"tVuAYYVY_^WWWWW̋U{EEMjEEXEEEPEPEP̋UVW  Wh?  oEYYM  #f;uvQQ$bYY~:~nu0E]E\$E$WV]Es  EV\$E]E\$$jj?  DzWVEYY)  EPQQ$ȪMUy   +;|Z+;   
= 
     =   ~- PQQ$V\$E]E\$   =}%V\$E]E\$E$jj|=}&   PQQ$V\$E]EPQQ$WV]V\$H$\$E]E$QQE$jjw$_^̋U]b̋UE   ]̋UE  @  ]̋UME  ]̋UEM  ! A]̋UME]̋UEM	A]̋UME ]̋UEM3  A]̋UMEI  ȋE% ȋE3]̋UE3MVu    E% Ep3^]̋UEM]̋UEM! A]̋UVuW}t7uզ    ]uMEPQQWVP]bEPLtu舦 "   } E]t
E胠P  E_^̋UVuW}t7u#    9]uMYEPQQWVP]EP5tu֥ "   } E]t
E胠P  E_^̋UVuW}t7uq    臢WuMEPQQWVP]EPtu$ "   } Et
E䃠P  _^̋UVuW}t7uƤ    ܡWuMEPQQWVP]EP({tuy "   } Et
E䃠P  _^̋UQQEEEPuE mYY̋UQQEEEPuEDYY̋UQQEEEPuE YY̋UQQEEEPuE[YY̋UEMUHt]̋UEMUHt]̋U  (03ŉEEVutu+    A3@"QMQP{VQPvU^tM
M3̋U  (03ŉEEVutu蚢    谟3@"QMQPzVQP膥U^tM
M3̋U  (03ŉEEVutu	    3@"QMQP赉VQPTU^tM
M3̋U  (03ŉEEVutux    莞3@"QMQP$VQPdU^tM
M3]̋USVuW)  }]C@WjPM莤uUM  -Ut+u
@MIb  iY  N=  n4  3ۈ]0u4>WE<xt<XtuuM
BEM}EE0u@M0t38UJ	U,0<	w0#,a<wW,A<w7;w;}tGC@M벋Ej ][     :u|@ʈU;}u0uUJ@M0tUU,0<	w0#,a<wW,A<w7;w;}tG@Muu;} E  jX_^[EPMÉUEtPt
et
pu
EE4  *E@U+t̀-u
@Uʉ0u@Uʉ0t,0<	w0#,a<wW,A<w7
s"k
؁P  @Uʉ뫻Q  0|9#,a<w,A<w
s@Uʉ븀-uۄuuE EEu؏U;ta uO;u;tRP  C;|3M3H@E؁P  ;|E+xUjMj	Fj?SEVP -SEVP̋U   SVW}r  ]CjQfMaYYuufU  j-Yf;щuj+Xtf;uffUfI  fi  fNi  fn_  j03YEEMf;u<7NxtXtP裎fUfAEfU]u3MEj0MYEf;uEffUf;t]38EE:   E  HE`  Ej  	E  EE  Ef	  Ep	  ǅ|	  E	  ǅxf
  Ep
  ǅt
  E
  ǅpf  Ep  ǅlf  Ep  ǅh  E  ǅdf  Ep  ǅ`P  EZ  ǅ\  E  ǅX   E*  ǅT@  EJ  ǅP  E  ǅL  E  E  j0Xf;U  j:Xf;s0=    f;  `  f;&  
f;s-`      f;  
f;s-    f	  f;  
f;s-f	    	  f;  
f;s-	    f
  f;  
f;s-f
    
  f;w  
f;s-
  ]  f  f;T  
f;s-f  :  f  f;1  
f;s-f      f;  
f;s-     f  f;   
f;s-f     P  f;   
f;s-P       f;   
f;s-        f;   
f;s
-   k@  f;rf
f;s
-@  O  f;rJ
f;s
-  3  f;r.
f;s&-    f;s
-  u-Ar
ZwHHwwM;w!E;tCEffUME]]     ;N  ]j0p8ϋEf}0Y9]u3f;ыUu.]EKfj0f}X2f;tj0]YUu]f;  f;Es
+l    f;Q  `  f;U  f;ErԹ  f;A  f;Erf	  f;-  f;Er	  f;  f;Erf
  f;  f;Er
  f;   f;Elf  f;   f;ETf  f;   f;E<  f;   f;E$f  f;   f;EP  f;r}f;E  f;rif;EPf;rWf;E@  f;rCf;E  f;r/f;E0f;rf;Esf;Eu*ǃAr
ZwHHww;w,ME;tAMj0ff}Y]}u} u} j  jX_^[Ë3ۉUfEUÉEtPt
et
pu
EE4  2j+fuXM܉f;tj-[f;u
Bffu3Ȋf;Eu!j0fЍAfuXf;t3j0Yf;
  f;Es
+  f;E  f;E  f;Es-`    f;E  f;Es-    f;E  f;Es-f	    f;|  f;Es-	  t  f;xl  f;Es-f
  T  f;tL  f;Es-
  4  f;p,  f;Es-f    f;l  f;Es-f     f;h   f;Es-     f;d   f;Es-f     f;`   f;Es-P     f;\   f;Es
-  wf;Xrsf;Es
-   ^f;TrZf;Es
-@  Ef;PrAf;Es
-  ,f;Lr(f;Es"-  f;Es
-  u-ƃAr
ZwHHwwj0Y
s2k
ЉUP  ffuQ  U  f;H  j:Xf;s
+1  f;  `  f;  
f;s-`      f;  
f;s-    f	  f;  
f;s-f	    	  f;  
f;s-	    f
  f;  
f;s-f
  y  
  f;p  
f;s-
  V  f  f;M  
f;s-f  3  f  f;*  
f;s-f      f;  
f;s-     f  f;   
f;s-f     P  f;   
f;s-P       f;   
f;s-        f;r
f;s
-   h@  f;rc
f;s
-@  L  f;rG
f;s
-  0  f;r+
f;s#-    f;s+u-ƃAr
ZwHHwwj0Y
sf0fujUj-Xf9EuډUuuEf fEE]uuMV;t]y uI;u;tNP  ?;|/38EH@E؁P  ;|E+ʉNjj	jSEWPiSEWP̋UVu3W}:t:uZ@BuSQg|3ҊC:t:u6@BuQ/|jX[_^]P|E jXP
| ̋UQS]VuW3Ћf;t	f;u+f؉U]]ЃtEP|3fEjTP|Eff;t	f;u)fу
uQB|jX_^[Q2|3fE̋UVuEW}3ɉu}E:t:uB@AuRzE@(t)M3
     M
  j   VW@?YYtP&zjdVWYYtRzjI)tBʊфt1,0<	v,a<v,A<v	_i@)uˊр)PjX_^̋UVuEW}3ɉEu}f;t	f;uNfuRKzEf(t*M	     Mz	  jX   VWf|YYtPyjVWYYtQyjSj)[f;tIft<ʍAЃ	vAvAvf_u#j)Xff;uj)[f;tM  jX[_^̋USVu3W}ʊ:t:u@Au_^[]̋USVu3W}f;t	f;ufu׳_^[]̋USVu3W}ʊ:t:u@Au_^[]̋USVu3W}f;t	f;uf
u׳_^[]̋UEV	   $t	uukYY   uu9E     ##ȋE3   E3ҋM  8  #J   Ё  ʋE38  I   먋E3ҋM  8  #J   Ё 믋E   oE  3@^]ËEj     ##ȋEX܋E3ҋM  j8  #J   Ё  ̐I	[	h			׼			!	B	̋UE	   $	uuYY]uueE38  E  H3]ËE38    ڋE38  EEu  P|YY뭋E  @  랋E  ` 3@]ËE3j8  E  HX]ËE3j8    ٍI 		+	I	b					վ	̋USVW39}t/]uM+:t:u E] @G]A;}uް_^[]2̋USVW39}t:]uU+f;tf;u(E] G]f;}u԰_^[]2̋UEEAEA] ̋UEEAEA] ̋UEEAEA] ̋UEEAEA] ̋UEEAEA] ̋UEEAEA] ̋UEUAt] ̋UEUAt] ̋UUVPBPFh  PVU  ^]     ̋UEA ] ̋UEA] ̋Qt̋Qt̋UUVPBPFh  PT  ^] ̋US]VW};w"r6ItW+;uIu_^2[]ÃtD;Dw_^[]̋VF P"pF  F^ ̋VF PqF3fF^ ̋VF PoF  F^ ̋VF PpF3fF^ ̋VF PpF3fF^ ̋VF P.oF  F^ ̋U  (03ŉES]3VW}3H8;}  	   Ttg{33ۋ ʚ; C;u狝H8}t2ssL#3P\`PCh  P`R  tQ3҅tK3IB;ut0sst#3P\`PCh  PR  33k
AG8};}  3j
YTʉ4  &vj&X4<W\`j PfqP<0P`P\   `u 3P,0Ph  CP    X  S3D3؋$ƃ DG;u拝Hv  sstd  3P\`Ph  R  sX   >P`Ph  VsP  u3\P`    X  33ۋ$ C;Xu苝H  ss	L>3P\`Ph  V?  ;s`LLtD`D@u@ЉX@33,  L< u;   0 G,   P 3ɋ   st[;u0 G,DL$0 P0, APXF;uP tGs  ;u0 F,03P0FP,us   @LG;sP0Ph  V]N     T+<Tw4   <      T   C3ɉ43؋$ F;Tu苝Htjss@L[3PdhPh  CPM  2@d # j 3PdhPCh  PjM  8tR3tS3RF;ut1ssL$d h# j PCh  PM  M_^3[l̋U  W}t4US3ۋtVr3v~C;u^[tss|_]j 4ǅ0    PB    h  PJ  2_]̋UU3
MM
 ]̋UEeM E ]̀y tj h  hhh h òy uj h  hh hdvőUMy tE  ! A]MM  ]̋U$SVu3W};wwǉ]t@Ɖ]t@Ã M3ҊIɈMMJ+3+ʉU8EMH%  E;d  38EH%;8  EMHىEM  ؉E@   H33@j{EʃME3M@M3I{#E#׋u]#E#MEu]8]tM#ʋU#ЊtE8]ut5蝆t=   t=   u]]8]t8]u8]tMǋ>OÙt)M菉;o  w;e  ]+]+]KY  uuYYj*  M-     ډU@r	   3J@3>zME܃UE3U@3z#E#׋u]#E#MEu]8]tM#ʋU#ЊtE8]ut5st=   t=   u]]8]t8]u8]tMǋNÙMʜ;rOw;vIM3]C8AH%  ;~*uuEYYjX_^[~M֋0y]M##EȀx t葁PVWSuPIPVWSuV̋U 3S]VW}8SJ@w7M9 vq39vI3ɊE4SPu3R QP+  MwEE\]]]uOM}ʉM3LMM MtP: R"ȃuMSuuuWu   3CHEj@X+EEM3҉EEIwMEEU3ҋD#EvEEUЋ}3ҋM#_KMȉMU} u}t2ۈ]tM9 I"؈]uMuUuuuRQ_^[̋UMy t~E! A]FM]̋UQEu3]ËE    t@]3]̋UQEE    t@]3]̋UQEuMwEt@]3]E    t@ ]3    ]̋U,  (03ŉEM3USV8AHWy3ۋB;r+ٍz3ۉ3+3ɉ,;c  	     3ɿ ʚ;300 F;u䋽tK,ss0,C,03P,P0h  PhA  ,tn3҅t30,B;utLss0,C,1 , j P0h  P@  ,33k
AG;*  3j
Yʉ  &vj&X4Wj P9`P0PP،3A;   uC3P,Ph  0P?  ,  ;ut3300 G;ut,ss0,A,3ۍSP0h  P,V?  ,g;   0  ,PP0VP?  3uP,PV,@;330Ɖ0 G;u,s!0;Ír00ut
ЉӉu33   < u;    G   33ɉ   stU;u G$  AF;ut4s   ;u F3FЋȃs   G;,PP0h  P+=  ,t1+j   <uj , j P0h  P<  ,   3ۍSP0h  P,<  RtStO3300 F;ut,sZ0,A,   3҅t30,B;ut^ss0,C,C , j P0h  P;  ,
  j
3Yʉ  &vj&X4W1j PZP0PP蜇3A;   uC3P,Ph  0P:  ,  ;ut3300 F;ut,ss0,A,3ۍSP0h  P,:  ,g;   0  ,PP0VP9  3uP,PV,@;330Ɖ0 G;u,s!0;Ír00ut
ЉӉu33   < u;    F   33΅   stR;u F$ǃ  BA;ut4s   ;u A3Aȃs   F;,PP0h  P7  ,   +itE<   3P,P0h  P7  ,   3  3P,P0h  P<7  2E , j dtt3300 F;uq,ss0,C,S3,PP0h  P6    PzYYjX  , t@3Kȉ;    33\3ɉ;	  	     3ɿ ʚ;3`` F;u䋽tK\ss`\C\03P\P`h  P5  \tn3Ʌt3`\A;utLss`\C\1 \ j P`h  P5  \33k
AF;  3j
YʉQ  &vj&X4W1j PaTP0PP 3A;   u3\Pq  ;u  t33`` F;utO\ss`\C\43ۍSP`h  P\3    \  ;   `  \PP`SP_3  3uP\PS  \@;    33`` F;u;Ír``ut
ЉӉu33   < u;    F   33΅   stR;u F$ǃ  BA;ut4s  ;u A3Aȃs   F;\PPh  `P1  \   +   <         33`` F;u   \ssY`\C\s3P\P`h  P0  22 \ j 3P\P`h  P0  \tn3Ʌt3`\A;utLss`\C\1 \ j P`h  P0  \9 }+j
3҃ ^3A  &vj&[؉4Wj 1P`OP0PP|3B;   uC3PPh  P/    ;u틍t33Ɖ G;u   A렋;     PPVPw.  3uPPV1@;9133Ɖ G;us<3ۍSPh  P-  ;rut
؉ىu33   < u;    G   33ۉ   stR;u G$Ã  ڋBF;ut4s  ;u F3Fȃs   G;PPh  Pe,     +o\H     PPh  P+  \     j Ph  P+  2:  j s      33ǉ F;unssAR3PPh  P*    P躃YYjTu3 \ t@3su3  t@3QЋ+;#Љ  j Y3+ω@3\\H Љt@3j Y+ȉsu;v2s      rr	jrZ   `+;rg;s93F;sA3##苍狍ǋ`ONt\땋t΍`3󫋅;vZ\; \ j P`h  P(  \+ǉt5;v-;P  PW  +;w<r3Kt2`;uIut`;wBj 3Y+Ή@3҉}Z\H Љt@3j Y+ȉsu;v2s      rr	jrZʉ   `+;rm;s83F;s@3##苍狍ǉ`INt\돋t3`;vB\3\+ \ j P`h  P&  P\P`\ YYuwtF3tF3 ;v=+t!33@Xƅ##tƅ ǋӋ-ڋ3;@#0;3#4ƃ NXӅt  PVRQ蛅7;P  PQ,P0M_^3[fD̋UQQEMSV3W3q8PAÉUKE;t6M~sM;w!r;wFM;uuЋMUtFE;uuu  uPSRWc}_^[̋UMt	   +]ø    ]̀y t	 ø 3̋U  S]VW3r  UE̅b  xNM+  RUu/sWPKh  Q;  3_^[]Åu@sQP{h  WR  3ҋu3;ʉ_3^[]3E    E    }tKAM䍤$    Sj R3WP][UM3ЉUU M܋MMuƋ]j ǅ    Ps    h  V  EU3;ȉ>CE_A^[];  ы+;|"uA4>;9uH;}sB  E]̋4LƉuЉMt	   +        }+ǉEԅt'MeuЃvuMԋD	E3E    U.  ]EȍKMčKM;EwA3Q	EE    EMtIM3UMLMƋu}EurEEMԋDEuSj uPR3][3]E]Eu܅uv*j uЃPS--3u܉]]EEwPrwIPS3ɋMj uM,;r)w;Ev"E]}ЉEU Eu
vE]u   M33tUE]ăE܉M EEeȋEe3;s+E܃mEu]M3;wFr9}s?t4u3ۋUă    
v3RNˉJ ؃u]UEHEu3UËM] mJ}EEHUEȉMM]A;sS        R@;rt< uuE_^[]_^33[]38AH%  ̋B̋̋UMAЃ	vAvAv	_t2]ð]̊AËUuEjPRD]̋Uju#YY]̋UE3ҋMHMɉHB]38AH38AH%  38AH%̋U  (03ŉEMS]Vq W   >uW0,Ph  C;P    x  S33ɋ؋$ƃ A;u拝 ?  sst_^[M3W4]j 0ǅ,    Ph  R    !  2_^[M34]Ë{$wl?PVh  sV  u,;W      $33ɋ؋$ƃ $A;u;s((sȉ$ʉ$r33,   d$ u;   G0,   339   d$ stU;uGǄ0    É,0 Ɖ0, CA;t릅t;s   ;uAǄ0    ,30A,uǃstL$(G; sP0Ph  V)  _^[M3%2]Ë @j Qh       Pǅ<      M32_^[1]̋U  W}u+E,WQh  8P(  _]StHMt?Q3VU3ȍ    $Ã ڋUF;uM^tss\[_]j ,ǅ(    Ph  R    E  2[_]̋UEeȋEe]̋U  (03ŉEeS]XD4VWr  &v&   4L<    1W\`j P:0    PL0P`P\\   `uW0,Ph  C;P    uX  X33ɋǋ`$ƃ XA;u݋XM  sst;  j `ǅ\    Ph  R    f  2  sTPwx>P`Ph  V,  u\`;W    uX  P33ɋ$ƃ PA;u$;s`88t
@`T@3<3ۉ,  $    Hu;   C0,   339T   d$ stU;uCǄ0    ǉ,@0 Ɖ0, GA;TtH릅t;s   ;uAǄ0    ,30A,uǃs   <8C;	PXP0Ph  VR     4+L4DM+t0<   W`\PC;h  P  _^[M3+]ËX`j Ph  Cǅ\    P      2Tj `ǅ\    PC    h  Pz  2_^[M3v+]ÃpD`S3H3ɋ؋$ƃ HA;u拝X)sst_^[M3+]j `ǅ\    Ph  R      M32_^[*]̋UVW}33Ʌt&US]$    $ƃ UA;u[_^]̀y t	 ø 3̋UMA<	w0]ÍA<wW]ÍA<w7]Ã]̋UfEj0Zf;  f:s
+    f;x  `  f;X  J
f;rҺ  f;B  J
f;rf	  f;,  J
f;rQvf;  J
f;rQvf;  J
f;zQvf;   J
f;bQvf;   J
f;Jf  f;   J
f;0Qvf;   J
f;Qvf;   J
f; P  f;rtJ
f;Qvf;r`J
f;Pf;rLPf;@  f;r6J
f;  f;r J
f;0f;r0f;Ar$ZwH"  f;bt؋]ÍHww]Ã]̋UE] ̋UE] ̋U33S]@   VWK@9U˃3U@3l9#E#UEj [u]E#}#Euˀ} MtE#E#utEut8Dt=   t=   u!]]} t} u} tEUM]ȋÙ_^[̋Ë̋U  S]    3VE+W   ]MV8UHEЉEE    2t@3M    +}usu
;   ;   rrr   uƉEtru+U^I ;rJ;s3ҍG;sC3#EO#UMMMUEHUEuuU]tz3;]vF_2^[]j ǅ    PB    h  P  2_^[]̋US}]ut4kBt=   t=   uE4Etu8]t2[]̋UHMt8t-    *] ̋UfMftf9t-    *] ̃9 u|-    *2ð̃9 u[-    q*2ð̋UfEj0Yf;  f:s+]ú  f;j  `  f;W  J
f;s+]ú  f;:  J
f;rf	  f;$  J
f;r͍Qvf;  J
f;rQvf;   J
f;rQvf;   J
f;rQvf;   J
f;yf  f;   J
f;_Qvf;   J
f;GQvf;   J
f;/P  f;rtJ
f;Qvf;r`J
f;Pf;rLPf;@  f;r6J
f;  f;r J
f;0f;r0f;]ù  ̋UE ]̋UEA|Z~w3@]3]̋UMAAv]̋UMAw]̋UuEut 0OAPX]̋UMVt0U1B=   wP#E*~~QuR53uu@P*X^]̋U]铄̋U]"̋U]y̋U]̋U]魃̋U]̋UVuu3mEu)j^0&SW}t9urVWPiL36uj Pu	)j9ust)j"^0&jX_^]̋Uj uu蝃]̋Uj uu]̋Uj uue]̋Uj uu]̋Uj uu{]̋Uj uu較]̃=k t2\$D$%  =  u<$f$ffd$u2$T$D$   ÍT$B P<$f<$t  T$              L$R  u=0j     =0j     ZÍT$ztA1uZZ33% D$učT$fD$%   =  uT$uutQ$\$qVYat/   CD$% D$؋D$%D$t=f   l$D$   t- it      -i   ٱ u$ٛu̋UuUY] ̋UE] ̋V6U& Y^̋! ËV6U& Y^̡[Vj^u   ;}ƣ[jPL?j [uU=[ u+jV5[&?j [OU=[ u^W31j h  F P<[4ǃ?k8fDt	tuF8G1u_3^̋UkE81]̋ViY[3[4[Y Ppu5[XT%[ Y^̋UMu#     jX]ËUtAEtUtA3]̋UE Pp]̋UE Pp]̋UUjyRuYY]ËM]̋Uj"Pu6]̋U]2jh-uu"       e VYe F   VNYt t?k8f22ً?{) utt
k8fA-t(U"    kjMQh(0)UVu31YY}E   ǋMd    Y_^[Ëu}V|Y̋U]r5̋U]
jhe E0Ye M   uE   ƋMd    Y_^[ uE0Y̋UEMEEEPuEPk̋UEEAEA] ̋UE ] ̋UE ] ̋UQSVW8W'+E0F0Fj0`*N3Wu;FEC_^[1 Y1cY̋U} u%     ;ËEtHVuoWPK2YttЋȃ?k8<fȋ?) _utt
k84fF-t    AMQAuE+ʉEEEEEEEEEPEMPEPM^̋UU1ҋM##Mщ1]Atj^FY1t"jhqtjY)jh  @jCjNK̋Uuu51aL]̋U}   ]̋US]PNYu_u3@[]̋Uu-Yu}_t]3@]̋UE]̋UuM<AEPh  u!} t
MP  ̋UuM@EPh  uT!} t
MP  ̋UMu@}	uj@XEPj@u!} t
MP  ̋UuM]@EPj u } t
MP  ̋UuuHYYu}_t]3@]̋Uuu~YYu}_t]3@]̋UuM?EPju& } t
MP  ̋UuM?EPh  u} t
MP  ̋UuM:?EPju} t
MP  ̋UuM>EPhW  uV} t
MP  ̋UuM>EPju} t
MP  ̋UuMm>EPju} t
MP  ̋UuM*>EPju} t
MP  ̋UuM=EPh   uF} t
MP  ̋U=f tj uQFYY]h  u51H]̋U=f tj uYY]h  u51G]̋U=f tj uYY]Ã}	j@uX]u51G]̋U=f tj uYY]j u51NG]̋U=f tj uNKYY]ju51G]̋U=f tj uDYY]h  u51F]̋U=f tj uYY]ju51F]̋U=f tj ux=YY]hW  u51SF]̋U=f tj u}YY]ju51F]̋U=f tj u&YY]ju51E]̋U=f tj u4YY]ju51E]̋U=f tj u+-YY]h   u51[E]̋U} SWt?M3Qff;u+YP]YtuSW2u
3_[]3PPPPP̋UVuWuu3~~~   3> uu9~ujOujF3fWWjVj	ucuqP*Y| 4};GvPu wwjVj	utHG3_^]̋UVuuM3   S3f9u%u9^uj;   F3^zSSSSjVSuH uqP)Y MW};GvPu7SSwwjVSuyH uqP)Y\ HG3_[^]̋UQuEPuu̋UQuEPuu̋UEUa AAQA ] 3AAAAA̀y tA [U3PPuujuPuaG ] ̋Uuujuj	u] ̀y tA ̋V~ tvVDYF ^̋V~ tF j"Yf F ^ ̋UVW
}V?PFPBBt
f F 	F3~_^] ̋UuKYM]Nj"Y̋AËAËAËAËUuxCY]  ËË! 38AtAAAA̋V	3FFF^̋UEA] ̋AËUEA] j $Y̋USVWuM5E33   MzBuL+׍yAu+σMFrЍC]P%Ytq3ۋEM:AF4+PVD>uj΍QAuE+MA:Ft+PV>u7΍QAu+Crj B} Yt
M胡P  _^[3PPPPPj  Y̋USVWuM4E3j_   hENЍQAu+ʋBEBu+U
؃uύCPYt{e E:FpЋ+@PV<uu΍QAuE+:F0+@PV<uG΍QAuE+MAEMr j @} Yt
M胡P  _^[3PPPPPUj uuuuu2]̋UDSWuM3E3ۋHEMt}t9]t9]u       QEԉ]Pu]؉]܉]]]'uc?VP0YtJuuuuWVjt0EuEEčEPV}}ȉ]̈]*#]VL?Y^} t	u<?Y} t
M샡P  _[̋Uuj uuuue1]̋Uj j uuuu>1]̋UM%  yHuVjd^^ul    u]2]̋UEl  jdY]̋UEl  jdY]̋UVuWu}WVD   u"NV+}m  PWV    3@_^]̋USVuWjYFE+uT+uYjs  }+^m  jYl  |tk  |tj  |
uttÃuC_^[]̋UVuuuV1uFF^]̋UE+EjYE+]̋! ËUQQUSVWZc  n    e   gt}ujbZRXHt@q  EHR  }  $0PuujAP  \	  EHm    }  $0PuujċMQl  ='    j0uujqqRl  jdYR  a  v  t8  EHA  }  $0PuujQ5]E       }3VS]WSujauu
    2  WShLB  VuWSujbuQ(tWShL  VuWSujeu+(tWShL  VuWSujTu(zWShL  VuWSujYu(  KSuuuPu  *uuhLx  Suuuju  $멋EHw(uEu   ?  =  EHv	    2  uEu   뿋EPBwɊM fQuujuuh$놃wS  tp  HtSHt=uEHju	fuujY}  $0PuujuuhXuu V   }]WSujIuWWShT
  u VWSujMu-(WShT	  u VWSujSu(xWShL	  u VWSujpuuujXuE@dEL  P  uuP*x      7c*E3PuYE9p t EuPYMMMM3+j<^ɹ\x$uuQ  j0uujV  j0uujW~  4  E@l  ='  t}  ɀ0QuujuE uuuPu    MC  /  D      %   tktBE@l  ='  }  ɀ0QuujjdYEHuEu  EHuEu   ]uuh`Mu uu}VWujmuVWPS^  u uVWujduk(VWS6  u uVWujycF   tQt8E@jYuр}  $0PEHMQl  ='  j0uujqqRYl  'u uu}VWujYuVW$SX  u uVWujmue(VWS0  u uVWujd]EH;@jR_;$M>
u uuuujHuyuuhT  u uuuujME<u uu}VWujHu VWTSq  u uVWujMu~(VWSI  u uVWujSvEHfWu
ujYI@=m  3;|
;|F}  ɀ0PuujVy}  $0PuEujppp`Huuuuj'E@l  '  U}  $0Puuju%3uMu}]I jɃP7E3Pt
t."t)Pu
7M3@+M_^[VVVVVI 8<
<
<
<
W=
<
=
=
̋UfEȉMMfuuuu   Vu;sWS3IW}t@uE
   Mtƙ}0Ej
fJ^CI} u͋u)_[& ^̋US]VW}vG}ǋj
_B0fH~w݋}fff
;r	+ȉ# _^[]̋UM9 t"UVuW:ftf8)u_^]̋U0(03ŉEEUMEЋES]EEUԉ]܉MVW tt\  X  T       l  fBfEfBf@fEfBfEfBfEfBfEf3fE3}fE`  MRRuWQRPl
RWQRP@ ؅   H;#t@=   w u     PuY     3utx}ME؋`  uSVWQj Pj SVWQj PЋJ~&]܋utffJuVjYe_^[M3j NY]s  3tE 3}ʃ@f9tʉ]]܃d$     '   AtHtXMt"a  h0WYYuSO
Mbt!t t  jB  jb  Ejm  t
t	  EjH  h@W\YYuGEjpz  <G  fUy  j'Xf;j  f3fuQ  t!t t   jA  ja
  Ejd   h         t'   HtH   jY   jy   MԃyML  P  utEffE    
f   E    fE 
3fuhtt&EjS6ttEjM"ttMf'EjIXuuSuuPut}fX    2H̋USVW3ۍMS]Ej_      EVJff;Eu+ыAEff;Eu+M؃u]   P: 3Yu   j:EEYfp΋++@PV0   ΍Qff;Eu+j:X4NfE+0+@PVuW΍Qff;EuE+j:E4NMAMYg3fP'} Yt
M䃡P  _^[3PPPPP̋USVW3ۍMS]WEj_     EVЍJff;Eu+ыAEff;Eu+M؃u]   P3Yu   j:EEYfpЋ΋++@PVz   ΍Qff;Eu+j:X4NfE+0+@PV7uW΍Qff;EuE+j:E4NMAMYg3fP8&} Yt
M䃡P  _^[3PPPPP:̋U(SVW3MWEܾd  }׉}   ǉMEu+V
EY  VWPEMud  ׉E)MىU}u%0E3E+PQ !X  UAEAu+MFEBUr]׉U}u'EMΉ3E+PQ   UAEAu+MFBUr]׉U8}u'EMΉ3E+PQK   UAEAu+MFBUr]׉Uh}u'EMΉ3E+PQJ  UAEAu+MFBUr]׉UØ   }u'EMΉ3E+PQ  UAEAu+MFBUr}]u)E3      E+PQ@  E   QAu+F}u)E3      E+PQQ  E   QAu+F}u)E3      E+PQ
  E   QAu+ʋUYMރuE         u}ƴ   Cuu(AEE6+PQ  Qff;uE+ʋUKM@Eru}   Cu}u+MAEE6+PQ  Qff;uE+K@Eru}   Cu}u+MAEE6+PQ<  Qff;uE+K@Eru}  Cu}u+MAEE6+PQ?  Qff;uE+K@Eru}L  Cu}u+MAEE6+PQ`  Qff;uE+K@ErCu}uu/FET  T  E+PQh  ET  Qff;u+KCu}u/FEX  X  E+PQ
  EX  Qff;u+KCu}u/FE\  \  E+PQ;   E\  Qff;u+KCu}u+FE`  `  E+PQuRE`  Qff;u+ʋUBUq4s}EM]}} t
M؃P  _^[WWWWW̋Uj uuuuu]̋U(W}ur    3Y  } tVu3fuH    ^3.  uM{UuE܋   UES3ۉME   >}f}u   Ef%tfMEHMEa9]   ]ȃ#uuEfEt	fOuuMRQMQuPEP3Et"MU^t]3f+]4t3fuu3 "   &    <} t
M؃P  [^_̋Uuj uuuu]̋Uj j uuuu]̋US];   uM   sEˋ      3EEx~.ÍMEQPYYtEE3j]EY3 *   3]AEfEUEEjpjRQMQu   EP$t]t	E؀} t
M䃡P  [̋US];   uM_   sEˋ      3EEx~.ÍMEQPYYtEE3j]EY3 *   3]AEfEUEEjpjRQMQu   EP$t]t	E؀} t
M䃡P  [̋US]3VuEx~+EVPYYtE3jE]MX3 *   3]@MfMUMjqjRPEPu   V$uEt	M^[̋UE ]̋US];   WuMY
   ;s)} Eˋ      E䃠P     3EEx~.ÍMEQPYYtEE3j]EY3 *   3]AEfEUEEjpjRQMQW   EPh$uUt	EЀ} t
M䃡P  _[̋UE]̋UEM    ]̋US];   uM   s)} Eˋ      E䃠P     3EEx~.ÍMEQPE
YYtEE3j]EY$3 *   3]AEfEUEEjpjRQMQh      EP$uUt	EЀ} t
M䃡P  [̋U=f tj uZYYMAw ]̋U=f tj u1YYMAw]̋UM38t;Et@< u]̋UdXVW   EȨt3f9t+euj X+#;rE3ҋȍ<p;tf9t;u+;u*Huu f9t+Mw   E|}Ȩt3f9uujX+#;rE3ҋȍ<p;tf9t;u+;uHWfufuf9t+M3f9t+E_^]̋UdXVW|xu֋}j X+#;s׍2;t
8 t@;u+;u:+ȃ;ttu ;uE9 tA;u+w   |ru֋}jX+#;s׍2;t
8 t@;u+;u+ȃW;tftfu;uE9 tA;u+낋MU;t
8 t@;u+_^]̋UdXMVW   t#EA;t3f9t;u+   уj X+#ЋE;sЋu<Q3;tf9t;u+;uJE<N+ɍFuu ;uEF;t3f9t;u+w      t(EuA;L3f9A;u5уjX+#ЋE;sЋu<Q3;tf9t;u+;uE<N+WɃFfufu;uEF;t3f9t;uE4A;t3f9t;u+_^]̋UEf8 t+E]̋UMU;t
8 t@;u+]̋UMEA;tf8 t;u+]̋UUVt3f90t+gW}ʃj X+#;rz3;tf90t;u+;_u+Buu f91t+w^]̋UUVt3f90t+fW}ʃjX+#;rz3;tf90t;u+;_u*BW(fufuf91t+^]̋UVuW}j X+#;s׍2;t
9 tA;u+;u8+tu ;uE9 tA;u+w_^]̋UQMWt#EA;t3f98t;u+   уj X+#ЋE;sV4Q3u;Mtf9>t;uu+;tF+qUɍ4Buu ;uEBf99t;u+w^_̋UVuW}jX+#;s׍2;t
9 tA;u+;u7+WɃ(ftfu;uE9 tA;u+΋_^]̋UQMWt#EA;t3f98t;u+   уjX+#ЋE;sV4Q3u;Mtf9>t;uu+;tE+qUWɍ4B(fufu;uEBf99t;u+^_2ËUE;E]w  tuftfufWËUdXVW|zu֋}j X+#;s׍2;t
8 t@;u+;   +ȃ;ttu ;uE9 tA;u+w   |ru֋}jX+#;s׍2;t
8 t@;u+;uU+ȃW;tftfu;uE9 tA;u+UʋE;t
9 tA;u+_^]̋UdXVW   Et3f9t+   j X+3#Eȍ<p;tf9t;u+;   Huu f9t+Mw   |qEt3f9yjX+3#Eȍ<p;tf9t;u+;u8HWfufuf9tM3f9t+M_^]̋UdXVW   Mt!EA;t3f9t;u+j  уj X+#ЋE;sЋu<Q3;tf9t;u+;-  E<N+ɍFuu ;uEF;t3f9t;u+w      Mt'EA;J3f9?;u3уjX+#ЋE;sЋu<Q3;tf9t;u+;ukE<N+WɃFfufu;uEF;t3f9t;uUʋE4B;t3f9t;u+_^]̡(0ËU(03E]̋U(0j Y+ȋE3(0]̋UQE5(0Y̋UA3;VF;wEBI;u^] ̋ËUE[]̋UV%tu Yt3@3^]jh
e j DYe 5(0΃35[ΉuE   ƋMd    Y_^[Ëuj Yjh藸e j Ye 5(0΃35[Ήuu	Y[E   ƋMd    Y_^[Ëuj yY̋UE   ;tU9t	;u3]̋Ucsm9Et3]uPYY]̋UQSVW9  3ۋʍ   ;t}99t	;u˅  y  u3Y@   u   FEEFy   B$PlX;u^  9wGt>9  t/9  t 9  t9  ub   X   Q   J   C   <9  t/9  t 9 t9 u            FPj Y^qY ׋EYF3_^[̡(0jh 
E0EYe MY  E   Md    Y_^[ E0	Y̋UEMEEEPuEP|̋U(03E]̋U(0j Y+ȋE3(0]̋Uuup]̋UE ] ̋UE ] ̋UEEAEA] ̋UE] ̋V> t6 p& ^1 Y1ܭYjh 莴=$[    3@[3ۉ] u,=(0σ [;t3SSS h^
uh _"YE9uh|{hhxmYYh}h|\YYF9u$[F Md    Y_^[ËE 0G   ËerjXËU3}csm]̋V> t6 p& ^̋Uu p]̋U} u   t	u6  YEE EMEEEjEXEEEPEPEP} tu   ̋Ut d0   @huu`qPdqu   Yuq̋Ë3j pt4MZ  f9u*H<ȁ9PE  u  f9Auytv    t2	td0   Ihu2̋UQe EPhTj qt#Vhpuptu ^} t	u p̋Uj ju3]̋UE []jjj jj j ̋Uj ju]̡[ËU [;(0u+Y []̋Uj j u]̋Uj juv]̋UuY] ̋UuY] ̋US]u3  Vttj^00   Wh  ([3VW&`k5LkEt8 uƉuM}QM}QWWP  juu uj_82EPEPEPVu  uEHTkƋXkJE}PVYYtE&Uϋ9:t@A98uǉTkE߉XkPnY}VdY_^[̋US]u3  Vttj^0   Wh  h\3VWqdk5PkEtf98uƉuM}QM}QWWP  juu u#j_82EPEPEPVu  uEHTkƋ\kJE}PVQYYtE&Uϋ9:t@A98uǉTkE߉\kPY}VY_^[̋UE0Eu0c]̋UE0Eu0q]̋UQES]VuW# }    Et0E2ɈM?"uɰ"GM5tFGEPYttFGEtMu< t<	utF OE    < t<	uG   Mt1ME 3B3G@\t"u1uMtO9"uM3҄EHt\Fut=} u< t3<	t/t%tFPYtGtFGst F1M_^[t! E ̋UEMUVuW}'     tuS2E    E	   j"Xf9u
Ãt	ffftuf;Et	f;Ej"Xuąt3fBE ft]f;t	f;Euf   tuEj\^ 3E   f;uCf;tj"Xf;u*u#Etj"A_f98uEe E}tKtf2ft,} uf;Et f;Et} ttfcut3f[t& E_^ ̋UE Lk]̋UE Pk]̋UE] ̋UE] ̋UE] ̋UE] ̋V6& Y^̋V6& Y^̋3ҋ9t	IB9 ű3ҋ9t	IB9 ű! Ë!   U]̋U]̋ËËËøXkø\ká`kádkËV6J& Y^̋V64& Y^̋UEPY]2ËUVu?s9M3u;s*M;vjPj 3^]̋U]̋U]̋UELk]̋UEPk]̡^u
$   ^̡^u
B   ^̡^u"9^tX   t	  u^3̡^u"9^t   t	  u^3̃=^ t3VW`u$V;  Yu^3^j YV~Y_^̃=^ t3VWu$V  Yu^3^j #YVY_^̋UVu3ҊtW<=tB΍yAu+Fu_^]̋USVu3ۋft-Wf=tB΍yff;u+4Nfu_^[]̋UQQS]3VW<=tB΍yAu+FuBjPYYtn}RˍqAu+΍AE=t7jPYYt1SuVu@Ej 0EEY؊uW  j YY3j Y_^[3PPPPP辺̋US]3EVWft3j=[f;tB΍yff;Eu+4NfuՋ]BjPYY   }ft|Ћˍqff;Eu+j=AYEf;t8jPYYt7SuViuFE0E3PEYCfuW   3WuYY3PkY_^[3PPPPP}̋UVutWPYuVY_^]̋UVutWPYuVY_^]GFSVW=^tmt\3SSSSjPSS"؃ tNjS*YYt7j j SVj73SS tSV^S0u3
VY_^[̋SVW=^tgtV3SSjPSSK؃tJjSYYt3SVj73SS#tSVSu3
V}Y_^[̋UE0E0jYY]̋UE0E0藜YY]̋UE0E0E0]̋UE0E0E0蕺]̋UE P@u+]̋UE Pffu+]̋UVW~MV UY;u_^] ̋UVW~MV UY;u_^] ̋UE ;^tPY]̋UE ;^tPY]̃9 Ã9 Ã9 ËU3PPjuPu5]̋U3PPPPjuPuF ]̋Uuujuj u]̋U3PPuujuPu ]̸^ø^ø^ø^ø^ø^ËUA3;VF;wEBI;u^] ̋UA3;VF;wEBI;u^] ̃9 Ã9 Ã9   ËUhȅ
^h
^5^M5^|YY̸^ø^á^u
^̡^u
^7(0á(0ËUuY] jh`趝e E0Ye M  uE   ƋMd    Y_^[ uE0觖Yjh@Ee E0|Ye M  uE   ƋMd    Y_^[ uE06Y̋UEMEEEPuEPk̋UEMEEEPuEP̋U(03E]̋U(03E]̋U(0j Y+ȋE3(0]̋U(0j Y+ȋE3(0]̋U(0j Y+ȋE3(0]̋UE ] ̋UE ] ̋UEEA] ̋UE ] ̋UE ] ̋UE] ̋UE] ̋V6L& Y^  1]Y1RY̋UESV W0  (0ȋ~3؋v33;   +   ;wƍ<0uj _;rjWS_j EMu$j~WS?j EM   ىE4(0}ωE+ǃ;#t}3@9I;u}E@0S褏]	GP蒏V	A腏	A3_^[1Y1Y̋USW]8u   (0V733υ      U}u;rT;Et3UȋȉE U(0ʃ @33;]]]u;EtuE뢃tV(0Y  P P3^_[̋! ËV6~& Y^̋Uuh _lYY]̋Uuh^QYY]̋UjEEMXEEEPEPEP8̋UMu]Ë;Au(0AA3]̋UEEMjEEXEEEPEPEP8̰f1h^<$ _0Y̰ð ̰ðËV5(0VV\V讪VVp^j LY̋UQh@kM   ̋V5f5f35f5Xk5f5\k5Xk5\k^̡(0ËU(0j Y+ȋE3(0]̋UVW~MV   ;u_^] ̋UVuuW49>t
6	Y>_^] ̃=[ ̋UA3;VF;wEBI;u^] hh&YY̋U} t=[ tJ]hh譧YY]̋UuJY]̋UE tjt3@]ètjtjX]]̋SQQUkl$   (03ŉEVs CWVPs/u&ePCPCPsC sPEPOs s-Yt)t%CV\$\$C$sW蒼$W$  VMCYYM_3^][̋SQQUkl$   (03ŉEVs(C WVPs.Cu4EEC j PCPsC(s]PEP?s(sY蘿t*t&C V\$C\$C$sW}$W$  V8C YYM_3^][̋UM39(t
@|3]Ë,]̋US]VtEtj&Y  #EtjY     E   jEY   #tT=   t7=   t;ubMh{LHM{,h2MzhMzHH      E   EW D   EPQQ$褬U U}3GgAu	E   e EfE;}0E+ʋUEtuGEEt   EUu؃} EtE3G_tj脑YtE tj nY3^[̋UEE]̋Uj uuuuuu]̋UE3S3CHEW  HEHMtE  	XtE  HtE  HtE  HtE  HMVu3A1AM3A1AM3A1AM3A1AM3A#1AztMItEHtEHtEH tE	X   #t5=   t"=   t;u)E!MME    #t =   t;u"E MMEM3 1E	X }  t,E` E EXE	X`E]``EXP:MA A E EXE	X`M]A`A`EXPEPjj WqMAt&At&At&At&At&ߋ t5t"tu(    %   %   ! tt	u!#   	#   }  ^tAPAP_[]̋Ujuuuuuu]̋UEtwŦ "   ]踦 !   ]̋UU 3ɋ9(t@|,MtUEEEEEEEVuEE h  u(EE$uEEP舚uVCYE^h  u(qu'E ̋UQESVu+ƃW39u#tEt UG;u_^[̋UVuW>t ׅu
;uu3_^]̋UE@uY ]葰@uY ̋UvЋBuY MJ]jh"Gpte  3@ËeE3̋UUVtMt
uu 臤j^0螡^]W+>Gtu_u
Xj"3̋UUVtMt
uu j^0.^]W+>Gtu_u
j"3̋UEuEtEt}   v]Á}w2]̋UEuEt,Et}   rw} v]Á}wr}w2]̋UEMUHt]̋UEMUHt]̋U(MSVt!ut.|$~$΢    3ۋUtM
^[WuME3}EE@EEPjP];uEE-uE+u}G]}}tux,0<	wÃ#,a<wÃ,A<wÃt	u=j
^8GE}<xt<Xtuj^uM }uj^G]}3҃UUEKЀ	w˃#,a<w˃,A<w˃t1;s-E];ru;Mvj
jEGX]Љ}uMUd]u
E3ۉEA}WS{YYt( "   ut   	tߋ߀} _#E؃P  ̋U   MSWt!}t.|$~$    33ۋUtM
_[Vu`?E3upE0jVEBYYu]f-uf+uU2UUǅt:     E`  Ej  E  E  Ef	  Ep	  E	  E	  Ef
  Ep
  E
  E
  Ef  Ep  Ef  Ep  E  E  Ef  Ep  EP  EZ  E  E  E   E*  E@  EJ  E  E  E  ǅ|  ǅx  j0Yt	  f;o  f;ts
+W  f;8  Mf;G  f;urۋMf;5  f;urɋMf;#  f;urMf;  f;urMf;   f;urMf;   f;urMf;   f;ukMf;   f;uUMf;   f;u?Mf;   f;u)Mf;   f;uMf;rqf;uMf;r_f;uMf;rMf;uMf;r;f;uMf;r)f;|s f;xs
-  u*ƃAr
ZwHHwwtuCj
_};JMxtXtuj_}PMuj_}1QU3j0Yf;m  j:Xf;s
+V    f;8  Mf;A  f;ur֋Mf;/  f;urċMf;  f;urMf;  f;urMf;   f;urMf;   f;uxMf;   f;ubMf;   f;uLMf;   f;u6Mf;   f;u Mf;r}f;uMf;rkf;uMf;rYf;uMf;rGf;uMf;r5f;uMf;r#f;|sf;xu*ƃAr
ZwHHwwt5;Es0M;r
u;vjMjȉMMX1M#VM up3ۉEAuVSauYYt(萚 "   ut   	tދހl ^F`P  4̋U<MSVWݜt!Et5|$~+蕘    諕3ߋEtM_֋^[uM贻E3}EE@EEPjP]]uEE-uE+uUB]]UUMt	   ,0<	wÃ#,a<wÃ,A<wÃtuOj
XEIBEU<xt<XtuE   uM諉EuE   EEBESʉEQPjjMep][]MMEU,0<	wɃ#,a<wɃ,A<wɃMt`;Ms[E;r#Uw;r;u;uu;}rw;MvMVPuuEEEU@MEeuM]跈u
EԋEA]VSut1m "   Eu#t   Etހ} EăP  ̋U   MSVWB~t#]j_t4;|$~+A    W3؋utMǋ_^[uH]3EEEX0E0jVEXxYYuEEf-uǉEf+uU2׉UUE:     ǅpj  `  E  E  Ef	  Ep	  E	  E	  Ef
  Ep
  E
  E
  Ef  Ep  Ef  Ep  E  E  Ef  Ep  EP  EZ  E  E  E   E*  E@  EJ  E  E  ǅ|  ǅx  ǅt  j0_t	  f;x  f;us
+c  f;J  f;V  f;ps-`  ;  Mf;4  f;us
+  Mf;  f;urMf;  f;urҋMf;   f;urMf;   f;urMf;   f;urMf;   f;urMf;   f;utMf;   f;u^Mf;   f;uHMf;rnf;u6Mf;r\f;u$Mf;rJf;uMf;r8f;u |f;r#f;xsf;tu*ƃAr
ZwHHwwtuCj
[];JMxtXtuj[]PMuj[]1MÙSʉ`QPjjdjl[hڋȉ]\f;|  j:Xf;s0d    f;F  `  f;M  f;ps
+5  Ef;.  f;urEf;  f;urҋEf;
  f;urEf;   f;urEf;   f;urEf;   f;urEf;   f;utEf;   f;u^Ef;   f;uHEf;   f;u2Ef;rnf;u Ef;r\f;uEf;rJf;uEf;r8f;u|f;r#f;xsf;tu*Ar
ZwGGww   ;}   UE;ÉU]r-w;r';u;Eu3ɋ;lrw;hv
U#3PSd`x؋߉]ƉE}\]j07}_VMuEuXE3D]}SWP觐t3 "   Eu&t	3   Et߃ ۀT HP  r̋UQjuQQuuP@u跻̋UQjuQQuuPu̋UQjuQQuuP֡uɔ̋UQjuQQuuP覒uދ̸Ã̸   3   ̋UQEjj
QQj a F̋UQEjj
QQua ̋UQEjj
QQua q̋UQEjj
QQua D̋UQEjj
QQua 蓓̋UQEjj
QQj a +̋UQEjj
QQj a 膊̋UQEjj
QQua Z̋UQEjj
QQua 觍̋UQEjj
QQj a {̋UQEjj
QQua O̋UQEjj
QQj a 詉̋UQEjj
QQua }̋UQEjj
QQj a 苸̋UQEjj
QQj a `̋UQEjj
QQj a 豑SVL$T$\$tP+   t:uHt:Bv4u%  =  wڋ;uӃv#Ʃt3^[^[̋UEu]ËMUVt2ftf;1u	+^]̋Uu蔸Y] jhfmE0衹Ye E  @H E   Md    Y_^[ E0`fYjh mE0;Ye E  HHtu4tQYE   Md    Y_^[ E0eYjh {lE0趸Ye j E 01  YYE   Md    Y_^[ E0reYjhlE0LYe MA 00  YYE   Md    Y_^[ E0eY̋UEMEEEPuEPl̋UEMEEEPuEPN̋UEMEEEPuEP̋UEMEEEPuEP̋UE ] ̋UE ] ̋UE ] ̋UEEA] ̋UE] ̋UE ] ̋UE ] ̋UE ] ̋UE ] ̋UE] ̋UE] ̋UE ] ̋UE] ̋Vq^̋V6δ& Y^1q̃9 1׵Y1bY1Y̋A 00;  YY̋ HHtu4tQXY1kbY1gY1UbY1QY̋j 0  YY̋ @H 1!bY̋UE3AjCHE hEP  EYj@H4EfHlEfr  MEL   EEXEEEPEPEPEEMjEEXEEEPEPEP+̋Uhfu/YY]̋ËU} tu   u YY] ̋UEht
QײEYp<˲Ep0Ep4赲Ep8課Ep(蟲Ep,蔲Ep@色EpD~E`  p$EEMjXEEEPEPEP%jEEMXEEEPEPEP! Ë3á1tP~ttá1jP[u3VWhd  jpYYtV51Zu3W51ZhfVzY3YVfY_^̋SWq1tPR~tX#z1jPiZu3eVhd  j辚YYu3S51>ZSV51/Zu3S51ZV趰YhfVj 衰^Wq_[̃9 ËV6P& Y^̋UVu~L t(vLFLY;ft=1tx uP茶YEFL^tPrY]̡1t
P}u3̋á1t!VP|tj 51YV^̋SVWq1tP|tux3ۋt1jPXthd  jYYu3S51XS,YW51~Xu3S51lXWhfWj Vq#t_^[̡1VtP{ttxn1jPWtehd  j7YYuP51WVRY<V51WuP51WVhfV-j t^5̋SVWq1tPztux3ۋt1jPWthd  jgYYu3S51VS耭YW51Vu3S51VWhfWYj JVq#_^[hԽ
׭1u2ϲu	PY̡1tPT1%q%p2jqoYtu	=_t2ð̋U  (03ŉEVjqtJtEUAE;tfu3PEP+IQPVqM3^p̋UjnY   u=_   SVhh  h_Zz3ۅ   Wh  J_fRaVSq  uhPWVz   Nff;u+F<v!jF+EJ_hWPJuLh,  _WVsju/uWVbj_uh  hVV^[]]]SSSSSu̡_ËUE_]̋UQQM3S]VW]E8EtC-E3@ىE]u]3ҋuj	ȋCEX;$'0UFEt;rϋ];ur yj"^0v OF;r3_^[̋UQQM3S]VW]E8Etj-XfCE3@ىE]u]3ҋuj	ȋCEX;'0fUFfEt;rˋ];ur3fxj"^0u3ffff;r3_^[̋UE3ɋUS]VEWM8MtA -ۉMp uڋEuuESj uRS4Q][؍FEj	X;$'0E@EutMu;rMu;rE  wj"^0tE  OF;r3_^[̋UE3ɋUS]VEWM8Mtj-Yfp3ɉuAۉM ڋEuuESj uRS7P][؍FEj	X;'0ffE@EutMu;rMu;rE3fvj"^0s E3ffff;r3_^[̋UMVuVvj^0msMUSt"]@ ;w	-vj"uF"vvj^00sSVRQu[^]̋UMVuuj^0rOUSt$]3f@;w	uj"uF"vuj^0rSVRQu[^]̋UMVu<uj^0SrPUSt"]@ ;w	uj"uF"vtj^0rSVRQuuo[^]̋UMVutj^0qRUSt$]3f@;w	tj"uF"vntj^0qSVRQuu[^]̋UQ3}
u9E|9EsEEuujuuuE̋UQ3}
u9E|9EsEEuuuuuuT̋UQ3}
u9E|9EsEEuujuuuE̋UQ3}
u9E|9EsEEuuuuuuD̋UQ}
u
} E|E uujuuE̋UQ}
u
} E|E uuuuu̋UQ}
u
} E|E uujuuE̋UQ}
u
} E|E uuuuu"̋UQ}
u
} E|E uujuuE̋UQ}
u
} E|E uuuuu̋UQ}
u
} E|E uujuuE̋UQ}
u
} E|E uuuuu ̋Uj ujuuu^E]̋Uj uuuuuX]̋Uj ujuuuE]̋Uj uuuuu]̋Uj ujuuE]̋Uj uuuu]̋Uj ujuuE]̋Uj uuuu]̋UMx~u|f]á|f|f]o    l]̋UVuWtMt}u3f?oj^0Vl_^]Ëf: tut+fRftu3ufnj"̋USVW}tMt]u3fnj^0k_^[]Ë3f92tut+fRftuu3ffnj"̋UUVtMtuu3f nj^07k^]W+>fftu3_ufmj"̋UUVtMtuu3fmj^0j^]W+>fftu_u3fqmj"3̋UQMSVuWuu9Mu3,tEt]tu3fmj^0'j_^[Ëыf: tut̓u+fRft8u1t&[fft
tuMMEuf]uE3jPfTAXv3fplj"[̋U]̋UVuWtMt
}u kj^0i_^]Ëր: tBut+Btuukj"3̋UVuWtMt
}u |kj^0h_^]Ëր: tBut+Btuu?kj"3̋UQMSVW}uu9Mu3*tEt]tu jj^0g_^[Ëыǀ: tBut҃u+ڊBt0u)tϊBCt
tuMMEuouEjPD X Vjj"r̋U]̋UVuuM\3   S3f9u%u9^uj6m   F3^zSSSSjVSu躜 uqP}Yi MW};GvPlu7SSwwjVSut uqP}YWi HG3_[^]̋U3PPuujuPu ] ̋Uj M(E  9Ptz3҅uB} t
MP  ̋U,  (03ŉEEh  QPquqP|Y3UME ƅ iPPPPM3+]̋USVlquÅttVyDDtjXGs|u7Zt.m~uE    PuVj HrpCuuVPÃ^[]̋USVlquÅttVqiCtjXG{u7qYt.}uE    PuVj }BuuVPÃ^[]̋UE0E0E0E0Sq]̋UE0E0E0E0}]̋UE0E0E0E0q]̋UE0E0E0E0|]̋UE0B]̋UE0q]̋U]̋U]jh JE09Ye uv0+  YYt2F8 u @t0HYtF FE   Md    Y_^[ E0EYj,h@3JE0nYe 5[[}u;tOE7Pf  YYt7WO}}ĉEȉM̉UЋEE܉E؍EPEPEPM}E   Md    Y_^[ E0BYjh`\Ie E0<8Ye E 0YuE   ƋMd    Y_^[ uE0UDY̋UEMEEEPuEP̋UEMEEEPuEP̋UEMEEEPuEP̋UE ] ̋UE ] ̋UE ] ̋UEEAEAEA] ̋UE ] ̋UE ] ̋UE] ̋UEEAEA] ̋UE ] ̋UE] 1Q6Y1BY1蒓Y̋Vv0  YYt2F8 u @t0輓YtF^ ËF^10BY15Y̋0vY̋U$[SV5[W3M2;#tT2PE   YYt7EE܍MEBEBEEEEEPEPEPcUG;u_^[1V?Y̋UEHE` ]̋U e Ee MEEEEjEXEEEPEPEP{} EuE̋UEtHtQs   u	E 2]ð]̋U@#E;E] ̋UE$]̋UE$<u
Et]2]̋UE$<uEu	E   t]2]̋UVu
u^] ̋UVuW֋#
uE_^] ̋UMVWq$<uGtB9A+a ~1WPQYPF;tjX	tjX!3_^]̋UVuu	VY/VhYu!FtVsPnYYu3^]jY̋UEEu	PYË@Pju3ÍEEMEEEEPEPEPjh Ce E0 2Ye M   uE   ƋMd    Y_^[ uE0>Y̋UEMEEEPuEPk̋UE ] ̋UE ] ̋UEEAEAEA] 11Y1o=Y̋SVW8F0fF0gVFYY !F tNh   jP1>F u)Wgdj ьYYu[h@  WSh  WPF0-   _^[̋UEM	MEAEMEHE` 3]̋U MMu[    XËEt	t@uڅt@uE=wčEMEEEEEEEEPEMPEPMu̡(0jh m@e E0褌Ye 5(0΃35fΉuE   ƋMd    Y_^[ uM1U9Y̋UEMEEEPuEP_̋U(03E]̋U(0j Y+ȋE3(0]̋UE ] ̋UE ] ̡(03f18Y1|Yjh'?3uuj]Yu(0ȋ} uf35fjf35fjΉu_}ttE   u3#u}j7YÃtW Y3@Md    Y_^[ ̋UEHt-t!	tt	t3]øf]øf]øf]øf]̋UA3;VF;wEBI;u^] ̋U}t
}t3]3@]̋U}t
}t3]3@]̋UkE;tU9Pt	;u3]̋UEttt~~X    ]̋ËUjXEMEEPEPEP̋UEffff]bbj(h<3ۉ]!]̱Muj_;t5Ft"Ht'HuEtt
~4/V>a؉]؅ug  3VYYuW    T؃2ɈME܃e tj\YMe E e E܄t(0ʃ3ʊMUUԃEul   ;t
tu&CEЃc ;u>v( El(    U;u"kk ȉE;t` (0M܉E1   } um;u9zapWM UY-j_u]؋UԉU} tj_4YUV UY;t
tuEЉC;uaM̉H3Md    Y_^[Ätj4Yj4jh<:u    }               tttWC  ܊؅t=hu(5i\Yt5hhP;wPWYYȅtQE   k;t9zu
2JE   3ۈ]ÉEEj蓅Y]tu:=f u1jh
qt	f3-q]uWЉU؅t%(0ȃ3ȉEE܃tVTYM؉Eu   }]uj1Yu.YMd    Y_^[̡hkËU} t-uj 5hkquVRqPdY^]̋UVuw0uFct VH[YtVj 5hkqtPR    3^]̋UQjuQQuuPmu̋UQjuQQuuPuuU̋UQj uQQuuPimu葀̋UQj uQQuuP|uuT̋UQjuQQuuPluY̋UQjuQQuuPuuP̋UQj uQQuuPlu9Y̋UQj uQQuuPtuNP̋UQjuQQuuP+lj X̋UQjuQQuuPkuX̋UQjuQQuuPkufX̋UQjuQQuuPku~̋UQjuQQuuPXkuW̋UQj uQQuuP#kj W̋UQj uQQuuPjuW̋UQj uQQuuPju}̋UQj uQQuuPju)W̋UQj uQQuuPPjuV̋UQjuQQuuPcrj 
N̋UQjuQQuuP/ruM̋UQjuQQuuPquM̋UQjuQQuuPquP̋UQjuQQuuPqu6M̋UQj uQQuuP[qj M̋UQj uQQuuP'quL̋UQj uQQuuPpuP̋UQj uQQuuPpucL̋UQj uQQuuPpu.L̋UQjuQQuuPhj T̋UQjuQQuuPgj  {̋UQjuQQuuPgj HT̋UQj uQQuuPogj z̋UQj uQQuuP;gj S̋UQj uQQuuPgj S̋UQjuQQuuPoj J̋UQjuQQuuPnj N̋UQjuQQuuPnj ZJ̋UQj uQQuuPnj M̋UQj uQQuuPKnj I̋UQj uQQuuPnj I̋USW}  ]  ? uE  3f  VuMmEx  u!hfSWuN          uMtf3F   EPP_nYYtBu~~);^|'39EPuvWj	v%uu;^r0 t*v339E3PuEFVWj	p%uH *   } t
MP  ^%f %f 3_[̋Uj uuu]̋UuMke EPEupEuPU)tE} t
M샡P  ̋UW}u9}vEt!83   S]t}VvGj^0D   uMjE3H  u,EuPEPWut~?RG069   u\fE   f;v7t9uvuVW%=Gj*^0} t
M胡P  ^[_Åt9uv\t   ҍEuPVuEWjPVQy t9uutqzut9uvuVW<Fj"^0Cp̋UQe j uDPuEPN'tËE̋Uj uuuu']̋ËUVu;ftM03P  uG^]̋UVu;@ktM03P  u>^]̋UE3VW  8P#;u;ǁ u@,   ;|;s;u	;ujX#tjj3_^]̋UM39A|9s]̋U83W}ySVuMu(gG9EwDj"_8A  ]K%  =  uP3Pu$PWuuuVSl  $t ~  jeVt!YYtM P@ 3W  3;|;s-FKE V4E  E  U܉E3j0XuC% uME  13ɍruuE̋     C% Ew9   j0ѹ   XEUM~P#S#ыM _ j0Yf9vEUMFEOUMEfyufxU#S#ыM  fv5j0F[ftFuH];Et9uM:@~Wj0XPV8uE܀8 uuE4PS3E  +MPUx
r+
j- [Xj0X3;|(  ;rSPSVQk[U0U܈z3;u;|#drSPjdVQk[0UU܈G3;u;|
rSPj
VQwk[0U܈G30G} ^[t
MȃP  _̋UVuW~G;ErEPuEPEWp0`9MtM3}-+3+ȍEPW}Q3Ƀ}-3PCt u(Ej Pu$u VuW/    _^̋UVW}~3	9Ew?j"^0=_^Su$M+cU ]t%M3P39-PuS  U E8-u-s~FFE􋀈     9Et+EhPVk[uvN8EtEUB80t/RyF-jd_;| Fj
_;| F V}u90ujAPQc} t
EP  33PPPPPL:̋U3VWu}uE}PEWp0W^9MtM3}-+ȋuEPEP3}-QPAAt u Ej PWuV)   _^̋UMSVWuaUu}JI} t;u3:-f80 :-u-_BjSuWS  30@؅~NjSuW8  E     CE@y%؀} u;}VSuW  Vj0S3} _^[t
EP  3̋USVWu3}uE}PEWp0\E3ɋ]}-HE49EtE+MQWPV?t PEH|+;}'9E}
FuFu(EjPWuS`u(EjPu$u WuS _^[̋UQMU;sEj  XÄɋMt-A tJESVW};4PFEFu+u;C4PRQg_^[u3PPPPP6̋UUt&VuWyAu+ύAPVP}__^]̋U]̋UQQVW}u:j^07  } v} tރ} v؋uAtEtFt	E GuEE$ S]u9SGYt.39K|9sEMuuWuPa   E$ tjjXa(t
Atu,Puu uuuWS6Ueu,t6tPuu uuuWS/u uuuWS>Puu uuuWS$[_^̋UE@yuEPIOYY]ËUfE
f]̋U(03ŉEW}GtWuYY   SVWd2Yt0WdYt$WdWdY?Yk8fÊ@)<   <   WedYt.WYdYt"WMdWBdf?YYk8ـ{( }FuEjPEP&u&39u~D5WP&GYYtF;u|fE  WuYY^[M3_-̋Uj37PuKf]̋U]hBjh uuY7    o4  5  fEV_Ye VuBYYff}E   fǋMd    Y_^[Ëuf}VyY̋U]e̋U]xa̋@ËUEu6    3]Ë@]̋(039f̋U(03M9f#ʉf]̋@	$̋USVuWVaPSjYY   j5Yj[;ufS5Y;ujf[N  uR  	u-h   =j eYYuN^N^FF   F   2_^[]̋U} t-VuW~	tVB?Y!3FF_^]3ËUuAeY] ̋Uu+eY] ̋UueY] jhe M  E   Md    Y_^[ E  P  jhE0eYe M?  E   Md    Y_^[ E0Yjh1E0leYe E  @ E   Md    Y_^[ E0+YjhE0eYe E  0&YE   Md    Y_^[ E0YjhpbE0dYe f1uft9>tWVr$YYE   Md    Y_^[ E0@Y̋UEMEEEPuEPS̋UEMEEEPuEP̋UEMEEEPuEP̋UEMEEEPuEP̋UQuEuMP̋VW~;tS19tSV*#YY;u[_^ ̋UEEAEAEAEA] ̋UE ] ̋UE ] ̋UE ] ̋UE] ̋UE] ̋UEEAEAEAEA] ̋UE ] ̋UE ] ̋UE ] ̋UE] ̋UE ] ̋UE ] ̋UE] ̋UE] ̋UE] ̋UEUSVu3WjUGP  PRV7W_PVu	_^[] SSSSS9+̋V6_& Y^̋V6_& Y^̋V6_& Y^̀y uqA1P  jUPUu3PPPPP*̃9 Ã9 Ã9   U VWh   jIj 2E_t:MEGEGEGEGjEXEEEPEPEPN_^̸19ftPhfYYf1_Y1_Y1_Y̋ 0M!Y̋UVu19tPVYY^] ̋ P  ̋VF pL0  F0F00:  N   F t?2Wf83Af;:uftfxf;zufu3_tf0F LP0uKF P  uO03uFpLhffYY^   01@2Ë0 K0cYY^15Y1*Y1&^Y̋ @ 1Y1
Y̋UVuujUFP  PRuuuT^] 3PPPPP'̋UVuuv6Ru	F^] 3PPPPPp'̋! Ë! Ë! ËËËÃ9 Ã9 Ã9 ËV6 \& Y^̋V6[& Y^̋V6[& Y^̋U} SWt@jUu0YYUs-]   Q*3YtKQuQWQu
3_[]3PPPPP&3f@̋UjXEMEEPEPEP̋UMAw ]̋UVW}Wuu)3uF   f90tPhjuuT   f97tWhjuuT_^]VVVVV%̋UQQSVW}3h  SW  ufu3  j.Yf;u-Ff9t%jP   jP?P   f  hV]%YY   j,ZFMMu+@   PVj@WO   j.Xf;uK3@Iu@sv_tqPVj@   u`s[ftf;uQPVj   POuBEj,Yf;fu@hVE7%YYj,ZE_^[3SSSSSD$̋UV3Uj XP  @t3t6tt?(    U%P  03^]̋UVutEt;tWj.Y` PY_^]̋U  (03ŉEEVuw4t0h   QjPj j TtPV+YY3M3^̋U  (03ŉEES]Vu3W}p  f>C u,f9Fu&huS%T  6  22PPuH,"  H($W3ҍOff;u+   sr΋ff;uftfPf;Qufu3n  $ff;uftfPf;Qufu33  ,M3ۄ0VPRYYuy0ۋ,PSPtX?G!tY(0Ph   Ss?PQff; u+APPPNGe  ,VVt0N  GWV(h   SK  WV  0PQ  YYl  PP[X  f0f   ȍAw j8ZuuA2Aw tu*4Aw fuf96u
f8 t)f6-   f98   f:      PPV  YGWV(h   SJ   PQff; u+APPPX3f9t$   9sWVP$^JtS$3f,Su "u"3؍/ËM_^3[3PPPPPjh@u   jSYe Ntu~4t	vRYE\   > t=jSYE   62@Ytx u=1tPXYE&   VHRYMd    Y_^[ËujR YËujF Y̋UV,jj;EYYu3h"ENLjENHHEEMXEEEPEPEPjEEMXEEEPEPEPue j ZQY^̋UQ}   }    SW3jCS:}YYu 3       Vh   S:YYu 3       h   S:YYuZ     Xh1VJuuV  t*WvHYYuEΉ3؉3H3EV>V3VYY3WDP}YV:PY^W2PY_[3̋US3V9]~"W}7uu+uF;u|_^[]SSSSS̋U(e e }v(    >3w*E!2y EMP  EEEE؍EE܍EEEEEEEPEPEPE̋USV3Fh  ue&3Y  W{f3uF00Eht5jhQ  WHEhphQ  W  EH M	Mff;uftfPf;Qufu3uht!EEEEE0jhQ  WGHE=j} uHN(tu	v(MYF$t8Ou	v$MYf$ Cf ^(F _^[SMYN(tu	v(MYF$t8Ou	v$xMY3F$FF(F F@3PPPPP~̋U  (03ŉEESVuW}8t!tVPWu      3ǅ<   0؉DZ  f>Lh  f~C]  f~_R  hhV؉4YY.  +<  j;Xf9  <ǅ@   WV3S<uQff;0u+;t@~Ë4hpS8YYuj;Xf9   @_VSh   PAu  6=  b  3fP@W  DtADD4sftf   3   4PjUHPh   PVW   3ɍW D   
f8f;98u3f8 t'fPf;QfBDufB u3ɋ3Ʌt,PVW(  DtC33ɋ<C<FD^uuW1YM_^3[(3PPPPP(̋U  (03ŉES]VuW}$*$x  0<PjUHPh   PVT  s8>f0D f;18u5f8 t'fpf;qfB8ufB uDuc  Qff;Du+A4E   P(Y   >,    OQ4@PZ  fC@>uf u
DHPaYD     0ы<ΉG@F 4F$<G;tG@B4I<<΃^$04@|#t։DF4֋<DuqjwPjhjD7t<D  f!E@rh   51PE3ɃDNGFGu<Gu	<GkW Y,tJ88   3F( Q   FYYG3M_^3[
Á2tJD(u9t(Et$E   E8D8   8(   8L(낋DPPPPP̋UE-tt
1t
3@]jX]3]̋UQe EjPh  u%$tEu  ̋UH(03ŉEESVu3Wh  SVuE]	UMЋÉMȃEċC  thxRUYYʍqff;Eu+EGuȃEPJEĉFu-tt1tÉ]
jX3EăU;u      tM   EPV  YY   EPV#  YY   EPV(  YY   E   EPV~  YY   EPV  YYt EPV  YYuiEPV   YYuYEPV  YYtEE3EPV%  YYt0EPV  YYu$EPV  YYuEPV   YYu3؊EPV   YY2M_^3[̋UExt2]p0E   jP7u]3PPPPP̋USVu39^uPNAwEQ6  YYt7Wv}6j@WZ7u%v   6jUQ@7_u
2^[]SSSSS'̋USVu3W9^   ~uj6N  YYu+~uv3{jP&P,>tYGr3v}6j@   P6u;jh$   jUWuv6jUWu2_^[]SSSSSR̋USVu39^uN~uHj6l   YYt9W}jh$   jUW\uv6jUWH_u
2^[]SSSSS
̋UV3W9uv%}wh  P%P<tF;urް_^]2̋UV3W9uv"}wjPY%P<tF;ur_^]2̡f   01@2̋UQHLMMQPgEYY̋UE ttjjjX]̋UHEPpqf}    S]   V3CƉE    ;|V iY;~W3tYEtDt?Tt6uQqt#ǋσ?k8Ef BDB(EGE;u_^[̋SVW3ǋσ?k84f~t~tN(yF( ttjjjXPq؃tt	Sq3t^uN(@)u$N(N(@F[t
@GW_^[jhrj=Y3ۈ]]SNYu]E   ËMd    Y_^[Ê]j^Y̋V3ftP%f Y   rݰ^̋UMEE  PQQ$c(]̋UEVDz	3   Wf}ǩ  uzMU uthپS3AuCEuɉMyMNEtf}U  f#f}[t	   fEEj QQ$'#j QQ$'    _E0^]̋UE%  -  ]̋UQQMEE%  ]fME̋UQQMEE%  ]  fME̋U}  Euu@]Á}  u	ujX]fM  f#f;uj  f;uE utj3]̃=dXV|?3^̋U=dXV|%rUM#M#R<Y3^]̋UQ=dX|]eŰUQ=dX|	]E3jh0=dX|[E@tJ=3 tAe UE:E 8  t8  t33@Ëe%3 eUǃ࿉EUMd    Y_^[̋ULM?P;Y]̃=dX|	'?3̋UQ}E̋UQQ}MEf#M#EffMmE̋UMt
-]t-]t
-]t	؛ t]̋UQ}E̋UE\$E$*]̋US]t tttVtP2	EEjP62^tx !   tf "   []̋UQSVu  WV#f;u&u3f9Fuf9Fuf9u@   jX   u3f9Fuf9Fuf9t3  ++Ef3   j5Zf;3   FffNbfEVf#3ȉEfVfȃttufN3fFfN3fFf3f3fH_^[̋UMV  A#f;^uu3f9Auf9Auf9u@]jX]éu3f9Auf9Auf9u]3f]̋UQSVu   WVf;uuf> u3@   jX   uf> t   ++EfEf3]jZf;3   ffNAfEǋN#3UfN3ff;}ff3fH_^[̋UMV  A#f;^uuf9 u3@]jX]éu
f9 u3]3f]̋UQEjP$uu)̋U]4̋U]̋U =$i VWt5lp4 E      etPjY+t:t)t  EL  MEL?  EH   MEH$  E   E@  tT	tC9  EDEϋuE    E] E]P] Y   E      E@E      tAt3	t%t-  t	   E ElEtEEDEϋuE    E] E]P] YuQ8 !   DE   EDEϋu E] E]P] Yu  "   E_^̋U} u3upl3@$i]j
hqk3̋UE3Ƀ=dX#k]̋UQQSV  Vh?  <EYYM  #QQ$f;u=/HYYwVSEaES\$$jj ?UED{ uS\$$jjVSEYY^[̋UVutj3X;Er4uuFdt VYtVj5hkqt    3^]̋USVWj j   S5 3fu  #QQf;u~uXEU$YY~9~u/EE\$$]SWmEhEW\$$jjDE$FEYYmUUDz%   f	EE]SWEYY_^[̃=k t2\$D$%  =  u<$f$ffd$u$   ÍT$R<$tLD$f<$t-i  t^   uA=0j 0       uԩ u|$ u%   t-i   "d/ uŃ|$ u-*i   =0j y0   Z̋UQQSV  Vh?  <EYYM  #QQ$f;u=/HYYwVSEaES\$$jj?UED{ uS\$$jjVSEYY^[̋U3]u  ̡(0jhP.e E0e,Ye E 07Y,jjhEp(0,juE   ƋMd    Y_^[ uM1Y̋UEMEEEPuEPA̋U(03E]̋U(03E]̋U(0j Y+ȋE3(0]̋UE ] ̋UE] ̋UE ] ̸EËUV5(035,jj j u΋ ^] 1*Y̋0YjhE,jp(0,j1Y̋UufYjhE,jp(0,j]̃h0gh,gh0gj"  hghghgj  h`gh\gh`gj  hghghgj  hLdhHdhLdj   hhdh`dhj  htdhldhxdjb  hdhdhjB  hdhdhj"  hdhdh j  hdhdhj  hdhdhdj  hdhdhdj  heh ehej	  h4eh,eh8ej
b  hXehPehjB  hdeh\ehhej"  hehehPj  hehehej  hehehej  hehehej  hfh fhfj  h0fh(fh jb  h<fh4fh@fjB  hlfhdfhpfj"  h`fhXfh j  hfhfhfj  hfhfhfj  hfhfhfj  hfhfhfj  hgh ghgjb  hghghgjB  hghghgj "  hhhhhhj!  ̋UQSVW}   (i0Et   }^h   j SquPqWu5jhhSt!jh4dStVVSq3u
MMƇtV pu;}U3_^[Ë̋UESWxi(03Ѓ;u3QtIVuuYYtuPptV Y(0j Y+3=(0;3^_[]̋UEW<(itA#-V4^d   Yu	3tV p^_]̋UuuYYu]uPp]̋Uh   j uquHqWu;jhhut%jh4dutj j uq]3]jXËUVh0gh,gh0gj/tuj % ^] ̋UVhghghgjtuj % ^] ̋UVh`gh\gh`gjtuj % ^] ̋UVhghghgj?tuj % ^] ̋VKt ^3@^̋UVBt'u(u$u uuuuuu  uuuuuj uPq^]$ ̋UVtuuuu #jEEMXEEEPEPEP^ ̋UVhdhdhjtu q^] ̋UVhdhdhjtu ^] ^]%q̋UVhdhdh jPtu ^] ^]%q̋UVhdhdhjtuu ^] ^]%q̋UV	t!u uuuuuu  uuuuuj uPq^] ̋Vheh ehej	Gt ^C̋UVuuutu j uPq^] ̋UVhehehPjtu ^] ^]%q̋UVuuuuutu j ubPq^] ̋UVJtuu j uuqP^] ̋UVhfh fhfjtuu ^] ̋UVh0fh(fh jvtuuu uuq^] ̋UVtu jj u!Pq^] ̋UVtuuuu uuu^] ̋UV~t'u(u$u uuuuuu  uuuuuj uhPq^]$ ̋UV*tuu 	u)Y^] ̋UVtuuu ^] ̋UVtuuuu ^] ̋UVtuuuu ^] ]̋UVhgh ghgjtu 3^] ̋Vhghghgjt
 ^̋UVhhhhhhj!tuu ^] ̋UVhghghgj Ltu 3^] ̋S2uStjtÊ[R3N	dUk̋VWhdhdhdjwt@ ֋t0h4eh,eh8ej
HuW 3_^̹ jxi3;V5(0Ƀރ"B0@;u^̋U(03ŉESVhdeh\ehhejt\hehehej؃t= ֋ȅt)W3}j jEPjQ _tEu2M^3[̋U} u'V(i> t>t6 p& xiu^]̋U(03ŉESVWuM	E3WWu@uEl؅t}H;#t2=   wtV  PYtA  t0SVuutEWWP#EPjVWu V|Y} t
E胠P  Ǎe_^[M3̋U   (03ŉEEMS]VuW3px;   h   |PuVQttFjPW:9;  tAP|PQ3,  3   qz   WWuVp$t   jPYYt*tVuxptƋVYwu<WWuV_ttZjP4YYttVux0륅u/jxxPE    PVtxM_^3[WWWWW!̋U(03ŉESVWuMl]uEX339E WWuu   PS轿E    JU;#t5=   wt  PYt	  Ut1RWVuVuujSI$tuPVuLqV&Y} t
E䃠P  Ǎe_^[M3i̋UQQ(03ŉESVuW~VuY;Yp|}$uE x}$39E(j j Vu   PWhЃUX  H;#t5=   wN܅t  P;Yt	  U3ۅ   RSVujW   }3PPPPPWSuui      Ut8E    ;   3QQQPuWSuu,      6H;#t/;wt`  PuYtK  3t:j j j VWuSuuöt3PP9E u:PPVWPu$Q u,WY3SYƍe_^[M3Pu uWڳY̋UuMu(Eu$u uuuuuPh$} t
MP  ̋US]VW}3t3}  f9uu    "]  uM>EH  uEuPSEuPW     9   u)   Mf<    F;r   SWVuj	QE   qzu`MEӅt4JUt'EPP?YEYt@8 t,U@EuϋMSW+PEQjpں9 *   3fA9   uuNFu+(VVVuj	Q蓺u *   p} t
M䃡P  _^[̋U]̋US]VW}3u;u;t3fEt0uM: 9]wE=vjXuj^0rMQPuWsut3f0:@t,;v!}t3fzj"^0jP^3fLGMt} t
MP  _^[̋U=f uh2j uuu]̋Uj uuuuu辿]j0&E}3E]}؉Eutu3t  uv    X  uMEȉuH  uEԉuPSEuPW    9   u:  M   f9n  7Mf  F;r  xuat#Ef90tutf90u+]CEPVSWSuVQ   }    |7 )  N#  EPVSWjuVQh t}    w   }    qz     EUȋJ~jY]SVQMQjPVr]Ѓ    }          :;   ƉE܅~M؊D9   E@GE;|EE;nt *   -9   u)Mft   f;w7Ffu3EPVVVjuVQA t} ux& *   } t
MăP  ̋UMыEVt 3f90tutf90u+E@^]̋U]^̋UQVu3EW}t.t.tS]t9}wE=v jYtj^0kuPuVut  E@t5;v'}t ;wnj"^0jPYMD0 Mt[_^̋Uj uuuJ]̋Uj uuuuu]̋UW}uuY$Vuu	WYv%    3^_]tVPYtVWj 5hkpt̋Uuu詹YY]̋UQQfE  Vfuf;tG   f;sȡ1H#/fE3fEEPjEPjtE#3^̋U=f tj uu:uu51Y]̋U (03ŉEuMU|   E PtSVuW3f9<H}3Ɉ]jUMX3ɈU3M@jMfMMvQPEPEjP臧_^[u8Et
EP  3E#E} t
MP  M3̋UEM  fH   f#]rȅt%   t   t3   HjXjX3@PYU$\$   fD$f=@hfPhfTfs,f fVf%   %  Y< f, f(4  +уʁ          fnffsfhfs&f fT%@h%   %  Y)Y,)fX4p.fV%PhXfTfsf fh\f=h%  %  Y, 8Y 8fX4AfT\XYYY\Y\XfL$f\\fhf\X\\f%  =      -?  º@  +-p<  Ё     \\f%hfTfT\fWҺ`@  fY\\YYf( UY-Yf(0UXfpX + -    ȃခ XX0hfY\0hfY\f(PUf(5phfYfXfpYfW?  XfXf%hfnYT$Yfs-fpDf(=hXfYXffYYfYfXfYYfpYfpYYXŃXXXfD$D$fL$f`hf~fTfs f~Ɂ           ځ  fs4fVӹ  fnfsfffffvfʁ      %   =     fL$fT$  fnfT`hfs4ffhffvf%    ȁ   r^ f@hfPh&f|$fd$f~fs f~%=  r       ^      fWC  ff=@hfPhYf~fs f~ tRfTfT`hfs,f fV%   %  Y< f, f(4> \Ё uT$    t1#  fnfs fPhfT$^ʺ   g  #    f@hfWfTfvfɁ         f       %   =   uefL$fT$  fnfT`hfs4ffffvf%   =   t#fL$f%    thhfL$f%      fL$f%      Xĺ  ]  fT$f~fs f~ҁ¹     fhfhYɺ     fd$fT$f~ u fs f~  ?     uf@hfWfTfvf%   =   uUffd$%     у     tf%  =?  rf%  =?  shXº  Yf~fs f~fPh    t0f~   %=  wr wfD$D$ÃfD$T$ԃT$T$$D$Ã ~(=   <  VЃ     W?  &=   VЃ     W    XX0h fY\0hfY\f(PUf(5phfYfXfpYXXf%hfnʁ  fW?  fYT$Yfs-fpDf(=hXfYXffYYfYfXfYYfpYfpYYfnfs-fnfvfXXfTXfWfvf\XfTf_\XXÃ N^YYXYXf%     =      fD$D$^XYYXf%     =      fD$D$fhfnYfs-fV       tfhYhefhYTfpDfYf%  @  +-p<  Ё   !=   r ɀ fnfs-fD$D$fd$f  ?  f3%    -Kƅp
uJ$    $    ƅp2+  at@u
tO  F  t2tk  - iƅpݽ`aAuƅp-*i
uS
u     
uu
tƅp- iu
t    Xݽ`au- i
tƅp  - iƅp
u- i->iٛݽ`aAuݽ`aݽ`ٛuRiٛt   ø       VtV$$vft^t  ̀zuf\?f?f^٭^i剕lݽ`ƅp a$  ؃PRQ YZX#zuf\?f?f^٭^i剕lݽ`ƅp Ɋaݽ`ɊaŊ$׊$
  ؃PRQ YZX#  ɍ$    I ؍$    $       ÐtؐÍ$    d$ ۽bۭbi@tƅp ƅp iɍ$    $    ۽bۭbi@t	ƅp ƅp Í$    ۽bۭbi@t ۽bۭbi@t	ƅp ƅpÐ-ip ƅp
ÍI -i
t
ti
t̋U0jM0j]UEEEEE	UE]MEMEMEMPQR;Ef}tmËT$   fT$l$é   t    i    ËB%  =  tËB
  D$B
D$$,$
    BËD$%  =  tËD$f<$t,$Zf$f=tf tf t   ϴZ,$ZÃ$D$%  $D$%  t==  t_f$f=t*f u!f t   tqZ軩Z,$Zji   sjji   vj̋UQQEQQ$聚YYuJEQQ$BEYYDz+xQQU$EYYDzjX3@3̋UE    9Mu;} uuzH   AE      9Eu;} u5z   AE   H   9Mu.}    EAsE{b\9EuY} uSEQQ$EYYыAuHu zuE3]̋@$jh%e j_Ye j^u;5[tY[tJ@t[4?YtE[ Pp[4Y[$ FE   EMd    Y_^[jƙY̋@$̋UVuW~t%tv=Y!3FF_^]̋UWuYMIu袺 	   EjY	   E@tu "   ыE@t(u^  YMa EtHEjY!ESj[	EjY!E` E@  u3Vuj袹Y;tuS蔹Y;uW,Yu	u讛Y^u]S  YYuEjY	[_]̋UWu?YMIu!H 	   EjY	     E@t "   ϋE@t(u  YMa EtHEjY!ESVj[	EjY!E` E@  u1ujFY;tuS8Y;uWYu	uRYuuVf  YYuEjY	  ^[_]̋UVWuYMЋI   M3A1+@EHIH~$EVpR肟E;HEettʃ?k8f2@( tjWWR[#uEjY	jEPRH_^]̋UVWuYMЋI   M3A1+EHH~#EVpRE;HfEfattʃ?k8f2@( tjWWRY#uEjY	jEPR_^]̋@̋UE@tËESV@Et;HtN@P"Yt<3ۍECSPj j Vxpt%EPV|ptE;EuE;Et2ۊ2^[̋U]̋U]jhie E0IYe M   uE   ƋMd    Y_^[ uE0gY̋UEMEEEPuEPk̋UE ] ̋UEEAEAEA] ̋UE ] 1fY̋UQVW8W踾E0F0F0F0Wu_^1eY̋US]VWtut}u踳    ΰ3_^[Ã} t3;w؍GE   tO   މM   UGt@Gt9   G   GE;sƉuPR7E)G+k;rlGtW,Y   Mƅt3+EurjXEPuWYP蓚ЃtSM;w+;rBM%WPdYYt5ON3M3AM@UЉUEEjY	+3ҋu̋U} t} tEuܱ    3ÍMEMMEEMMPMEPMEMPM_̋UE5  ;w(tQ*tL=+  v=.  v>=1  t7=3  t0E]=  t=  v=  v=  t=  u؋E]3]̋UE5  ;w(te*t`=+  v=.  vR=1  tK=3  tDM)=  t=  v=  v*=  t#=  u؋MuuuuQPp]3̋UE5  ;w#tN*tI=+  v8=.  v;=1  t4=3  !=  t&=  v=  v=  t=  t
E%]3]̋UM3SV  W~;t;u5  ;w'tN*tI+  v8.  v91  t13    t!  v  v;t;t	U#E$P#E PuuuuRQp_^[]̋UVuW}Aw Bw +uu_^]̋UEMtE    ]]̋UE   f;s MtE    ]uPgYY]̋U=f u)} u&    <]Ã} t]頢j uu7]̋UVuuϭ       W}u譭    êkuME􃸨    uWVYY5SMQPMvQP˃+uu[} t
EP  _^̋ËUA3;VF;wEBI;u^] ̋UA3;VF;wEBI;u^] ̋Ë4jp  38j   <j@j3̸8jø<jø4já@jËUMu9    OjX]á8j3]̋UMu    jX]á<j3]̋UMu˫    jX]á4j3]̋UQUMVt&t&t S]u*|j^0蓨vtej^0|`W}ttEj^0\>@j4FEFu+uF3u3;vj"X@j4QR _[^̋UEV  WH+  jd__+^]̋USVE3PuY  9u  ]W{;=3u;=3^  95Pj   jf95juj3j@]ujƋ։u]j]j]j]jSu]uuuuRQWPV  j,j]j]j]j]]f95juj3=j@Ƌ֋5juuuuVWRQsPj  ,XVVV3kjV@VP3kPWjVn  VV3kVjVV   P3k
Psjj?  X33K_;};|Q;M;~;}3@^[;|;;~;|.kC<Ck<i  3;u;53;5 43VVVVVߣ̋UM]̋U諤M]̋U蹟M]̋UQQe S]VWSz}}YEujt	44\SFYim  j6YkM+u;U} t	`}u ;~t	44\u kE$<E(k<E,i  E0} u5333_^[ã 4EP53)YuAiM   4 4y \&3= \&| 3 433PPPPPڡ̋UQQW|jEWh   uP\uE@"t37Vu賭YtWuEVP)u33VY^_̋USVRe ؃e EP]蔜Y  EP輼Y  Hjut4ʋƊ:utX:Yuu3L  ]RSY΍QAu+ʍAPȬj Hj/HjYY  WyAu+VAPR   j_WVj@3   > tFu_-uFVYi  M+tB<	wF:uLFVk<YMȊM<0|Њ9	F<0}<:uFVYMȉM<9F<0}-uىM3EE@tjVj@PFu  uכ0uҥ0^[3PPPPP&̋USV3ۍE]P]]CY"  EPkY  EPcY   5Hj,Hj$Xjtp   kXj<3AW=jPjUf9jtk<Ef9jt kt+k<ËˉMESEPSj?6jh\jSWV t9]uX?EPSj?vjhjSW' _t9]uFX?Fu0u	0uמ0^[SSSSSŰU  (03ŉE33SVW|j3Sh   P=PjP複uF"uAYuW`&SVPbtVW:Y+#t? t	W>YV
YM_^3[ؕjh 螅(ku.jYe (ku(kE   Md    Y_^[j~Yjh *e jdYe uYYuE   ƋMd    Y_^[Ëuj"~YjhjYe E   Md    Y_^[j}Y̋Uh  u观YYu	f}_t]3@]̋Uh  uxYYu	f}_t]3@]̋UuM!Eh   u0} t
MP  ̋Uh  uYY]̋Uh  uYY]̋Uf}	j@uX]uāYY]̋Uj u誁YY]̋Uh  u萁YYu	f}_t]3@]̋Uh  uaYYu	f}_t]3@]̋Uju5YY]̋Uh  uYY]̋UjuYY]̋UhW  uYY]̋UjuрYY]̋Uju躀YY]̋Uju裀YY]̋Uh   u艀YY]̋Uj uYY]̋Uh  uWYY]̋Uh  u<YY]̋U츀   f9E]̋Uf}	j@uX]uYY]̋Uj uYY]̋UjuYY]̋Uh  uYY]̋UjuYY]̋UhW  uYY]̋UjulYY]̋UjuUYY]̋Uju>YY]̋Uh   u$YY]̋UQ,ku1EEd0   @x |	EP.3,k}@ȇ
̋UQ0ku1EEd0   @x |	EPK30k}@ȇ
̋UQ4kuIEEd0   @x |	EPEtttjj3@jXȺ4k
̋UQEEd0   @x |	EP轠3}̋Uu]̋Uu\]̋Uuv]̋UuY]̋U3}@]̋U3}@]̋U3}]̋UEtttjj3@]jX]̋UQV5,ku-d0   !uF@x |EP$9uuj^θ,k^̋UQV50ku-d0   Fu@x |EP?9uuj^θ0k^̋UQd0   V3u@9p|EP!}t3F^̋UQV54kuEd0   j^u@x |	EP̽Etttjj^3Fθ4k^̋UE;Ev]]̋UE;Ev]]̋UVuWuu͎3~~~   3> uu9~ujaujF3fWWjVj	uutuqPګY莗 4};GvPu wwjVj	u1ttHG3_^]̋USVuuu蠠3ۉ^^^3   3f9u u9^uj}   FSSSSjVSu uqPY謖 MW};GvP|u7SSwwjVSu uqP貪Yf HG3_^[]̋UQuEPuu̋UE(Vuj^0  uS3Wˉ}؉M܉]taMfE*?QP]蠄YYuEPSSQ  uURPQ^  E   uuu}؋M܋]+ǋЉuB;ΉU#t/ǋӋAEAu+MCEكBE;u݋U]3juRkuu   }   E}ȉEǉM;Et[+׉U ЉEBEBu+UBPuEE+EPQurEUMMME;EuE]0SYE܋+U9U#ȉMt7CY;u}؋uWvY_[^SSSSS芏̋U4(03ŉEEEVuuunj^0腐  SW38ߋω]ԉM؉}܅tlj*YfMj?YfM3fMMQPYYuEPWWQ  uURPQ  E   uuu]ԋM؋}+ËЉuB;ΉU#t6Ë׋AEff;u+ME@EEBE;uыUjuR߽uu   ]   E]ЉE̋ÉU;Eth+ˉM ȉEЍAEff;u+MA+MPuЉEE+PRtuEMUMEJU;EuE}0WYE؋+U9U#ȉMt3G[Y;u]ԋuSY_[M3^詆WWWWW̋UQMQAuW}+ʋAЉM;vjX_SV_jSǪYYtWuSV}uPu+ߍ>uSP}u7]A
  3EtVuYC0CWY^[3WWWWW謋̋UQMSW3ۍQff;u}+AЉM;vjX_[V_jSYYtWuSV&uJu+ߍ~uSPu1}
  ؅t	VͿYG0G3j 踿Y^3PPPPP̊̋U  (03ŉEMUSW};t#</t<\t<:tQWvYY;u㋕<:u G;tR3SSW  3</t
<\t<:u+Ah؉lVp#tx|PhPW蓦SSSQ#pSPlpuSSW7  H+肏PPPP#8.uHt*.u8Xt WPu\8t賽YPVhpM@+;t4h]+jPP8tWYVpp| ^tp2YËM_3[̋Ud  (03ŉEUMS]VW;t Pi  u;u拍2:uC;tQ3WWS   V*  +B3WW#WPWSlpuPWWS|   H+j.Yf9uf9t-f9u	f9tPSP)uGPVhpj.Yu@+;th{+jPPVppǋM_^3[̋UE0E0E0E0w]̋UE0E0E0E0蘰]̋UE0E0E0E0`w]̋UE0E0E0E05w]̋UE0E0E0E0]̋UE0E0E0E0]̋UEu0KxYY]̋UEu04YY]̋UE] 3AAAAA3AA3AA̋V>t6pp^VVW7;wt6Y;wu7VY_^̋VW7;wt6ϸY;wu7V辸Y_^̸]ø{ËU3PPuujuPu9 ] ̋UE</t<\t<:t2] ̋Uuujuj	ud] ̋UE;Ev] ̋UE;Ev] ̋Uf}/tf}\tf}:t2] ̋V~ tv詷YF ^̋UVWΐ}FVWPȵt
f F 	F3~_^] ̋UVW   tu5YNEF3_^] ̋UVW+  tuYNEF3_^] ̋ËËAËV>t6pp^̋Uupp]̋AËËAËAËVW~9~t3r> u&jj)j UtFF+>vjX5Sj?S6vuj^NF3j Y[_^̋VW~9~t3r> u&jj聟j 譵tFF+>vjX5Sj?S6vuj^NF3j VY[_^̋ËUV|uPVuDkt3F^]̋UE]̃ËUE]̋UV-uPVu贜t3F^]̋U]Kl̋UE]̋V3FFF^̋UEA] ̋A+̋A+̋U]r̋U]Ղ̋U]̋U].jh`hE0*Ye M   E   Md    Y_^[ E0aY̋UEMEEEPuEP|̋UME]̋UME]̋UEEA] ̋UE ] ̋UE ] ̋V  Q @HPQ58k	     Q @H  PQ5<kc	  F   uF 84t0貲YFBH @H ^1`Y1葳Y̋UE-  t(ttt3]áj]áj]áj]áj]̋ËËUMj %Dk EuDk   \p,uDk   `puEDk   @} t
MP  ̋UA3;VF;wEBI;u^] ̋US]VWh  3sWVv{3{    {4+7Fu     9Au_^[]̋U  (03ŉESVuW~    PvTq   3ۿ   È@;rƅ Q;sƄ @;vuSvPWPjSRSvWPWPW  SƩ@SvWPWPh     S螩$EtLtL ˈ  @;r>3ۿ   ˍQB w
LA wF AÈ  A;rˋM_^3[1t̋UuuL  uMEIH;Au3SVWh   CYt.u   vHWu' YY;u2~    WvY_^[À} uĘE@HKuExH4t	pHBY   ϋE3HHEP  u03uEEMjEEXEEEPEPEP} mE 2^jh@ob3u}03P  t9wLt	wHtmYj芮YuwHu];3t'tu4tV2Y3wHuE   뭋uj3[YËƋMd    Y_^[̋À=Kk u<@k4<k78k6h@kPjjKkh@kvPYY̡<ká8kËUV3MV6E9ptp} t
MP  ^̋Uh@kPj u]̋U (03ŉESVuWuY  3ϋǉM99   A0M=   r     Pdp     ;u&F  ~f~~3~V{F  EPSTqtuh  FWPp^}  u} Et!HtLA;v8 uߍF   @uvv3  Gf9=Dk      h  FWPQpkE0E9E8 t5At+   s9DBA;v9 u΋EGErS^F     ENj9_fRfIuV3YM_^3[n̋UVuu3mEuyj^0vSW}t9urVWP譛36uj Pnu	xj9usxj"^0ujX_^]̋UVuM进uEML0u39UtE p#Et3B} ^t
MP  ̋Ujh  uj ~]̋Ujh  uu\]̋Ujh  uj :]̋Ujh  uu]̋U}	uj@X]jj@uj ]̋U}	uj@X]jj@uu]̋Ujh  uj ]̋Ujh  uu|]̋Ujj uj ]]̋Ujj uu>]̋Uj uKYY]̋UuMܙEtx  ujj uu3ɀ} t
EP  ̋Ujj uj ]̋Ujj uu]̋Ujj uj j]̋Ujj uuK]̋Ujj uj -]̋Ujj uu]̋UjhW  uj ]̋UjhW  uu]̋Ujjuj ]̋Ujjuu]̋Ujj uj o]̋Ujj uuP]Xp`kTpdk̰øTkøXkø\kø`køLkødkøPkËUEVujtj^0qLkt3^]̋UEVu-tj^0DqPkt3^]̋UE] ̋V> t6Lp& ^̃9 ËV> t6Lp& ^̋UuLp]̋UUW3f9:t!Vʍqff;u+Jf9:u^B_]̋3Ã9 ËUQSVWPp3tYVWWWW+SVWW$Et6PzYt3PPuWSVPP t33W-Y߅tVLp_^[̋VWPpu37SV+ރSZzYYtSVW4j 賢YVLp[_^̋UVuu*r      SWj=VpSEYY  ;  @E.  39^u{9]t9^tB    Z8]u3  jj͋S^9^y  9^u#jj袋S^̡9^N  ^E>  E+PV  EYYMxO9tK4艡YM8]u0UDA9ujQRbSE\Etb[E4V8]   ؉EP;   ?   jRQaSEE   M4\^9]tNFu+jFPE蜊YYtFuuV菜uXM+EAE#YPV讎YYu:p *   V}Y#p    WfY_[^SSSSSzk̋US]u]o    "  VWj=SEYY  ;  HEE{  5^3ۅ   ^9]ttx  K  Uf9]u3  u-jjS^9^|  5^u%jjS^5^M  M+QPM]  EYYxL9tH4貞YMf9]tE   DA9ujQV$_S}ǅtYQf9]   ؉EH;   ?   jQV^S;   ME\5^9]   ȍQff;u+jAPE軇YYtGEPuVluXE@F3fAE#PVHpuXm *   V蛝YAm    W脝Y_^[SSSSSh̋UQW}u3_3ɋ9t	@A8 uVAjPxYYtftPS+ߍQAu+jAPEKj ;v<; t.7u4;2uu[j HY^ra3PPPPPTg̋UQQW}u3_3ҋǋʉU9t@A9uVAjP藅YYtotXS+ߍQff;Eu+jAPEc;3P荛<; t/7u4;0ju u[3P^Y^ew3PPPPPjf̡^;^uP$Y^̡^;^uPY^̋USVW=^t*]SPu[iu<=ttu+_^[]+̋USVW=^t-]SPu菓uX=tftu+_^[]+:sUE0E0YY]̋UE0E0Hp]̋UEEQ0JYY]̋UEf ȋEQ0ЃYY]̋UE0E0E0,]̋UE0E0E0g]̋UE0E0E0]̋UE0E0E0g]̋UE0E0E0pg]̋UE0E0E0]̸^ø^ø^ø^ø^ø^ËU]tI̋U]髂̋U]̋U]{̋U]X̋UVutj3X;Esg    3BS]WtS{9Y3uVSCsYYt;s+;Vj P{]_[^]̡hkDphk̃%hk ̡hkËUSVW};}tQt ӄt;uu;ut.;t&~ ttj  YF;u2_^[]̋UVu9utW~tj  Y;uu_^]̋U(03E]̋U(0j Y+ȋE3(0]̋UA3;VF;wEBI;u^] ̋á(03lkȅ̋UElk]̋UV5(035lk΅u3u Y^]̋UuqYlk]̋UE@H|t   t   t   tVjH(^y2t	ty t
Qtu   VY^]̋UQSVuW   tl=0teF|t^8 uY   t8 uP   i]YY   t8 uPŔ   5GYYv|谔   襔YY   tE8 u@   -   P胔      +Pp   +Pb   W   豁YjX   E~(2tt8 uP3YYE tGt8 uPYEEuVY_^[̋UMtt3@   @]ø]̋UVut!t   uV֙V,YY^]̋UMtt   H]ø]̋UEtsHH|t	   t	   t	   t	VjH(^y2t	t
y t
Qt
u   s5Y^]jh"Ge Cm03xLP  t7u=j@Ye 5fW)SYYuE	   t uj@YËƋMd    Y_^[y̋UVuWt<Et58;u-V0:TYtW1 Yu1tWۗY3_^]̋UMS]Vuuu9ut)`j^0]^[]ÅtEtu	3f3u3f+ًWufRft.u'fRft
tuɋMu3f_uuE3jPfTAXt3f,`j"Y̋U]̋U(03ŉE} SVtBuNFu+^t,YVuESPEPcFu	uqe^[M3T jhD3uE04YuE 8ǃ?k8fD(t!WvlYP@puX8q^ 	   uE   ƋMd    Y_^[ uM11Y̋UEMEEEPuEP̋UE] ̋UE ] ̋UE ] ̋V0ƃ?k8fD(t%V^kYP@pt3^<7q]^ 	   1{0Y13Y̋UVuu] 	   YxE;5 is=Ƌփ?k8fD(t"EuEMEuPEPEP7] 	   MZ^̋UEЃ?k8VufWj L3FPuuQquq_^]̋U   (03ŉEEȋU?SVk8WUMfuDuEu<p3ۉESMM}3IM}};  uEՋE]E   fEЁ  -  U.ˉE8tA|}E+M؅   ED.0:@E+E;  Ӆ~uDB;|EЋ}܅~uЍEWPO~M؃~!U؋uE>Gf\.;|}܍E|E|3]}Q@EPE? 0:AM;  }3ttx}@QEPEPEP豈  EH   MT-tD.EEEjT-EPCEAqMf9H},GE;E5  jEWPHI  }jWEPH,  SSjEGPu؍E}PSu8 E̅  SMQPEPuq   u+uEu9E   }
u4jXSfEԍEPjEPuq   }   EFu;}   M~&u܋Eыf3CD
.M؋U;|u} uS~u܋EӋf3CD
.U;|΋UM]f\.fL-FqE8]t
EP  EuM3ͥ_^[+N̋UQSVu3W}EǉE;s?S覈Yf;u(F
uj[S莈Yf;uFF;}rq_^[̋UQVuWVYtU?k8f|0( }<b@L    uf|0) tEPft08pt2_^̋U  6(03ŉEMU?k8S]fVWDMщ3;ss;sA<
uCFFE;r䍅M+j PVPWqtC;rM;rqM_^3[WK̋U  5(03ŉEMU?k8S]fVWDMщ3u;s%
uCj_f>fE;r׋+Mj PVPWqtC;rM;rqM_^3[8J̋U  b4(03ŉEMU?k8SVfuWDM3;   P;s!
u	jZffM;rj j hU  QP+PPj h  u tQ3ۅt5j +QPPqt&;rˋ+EF;FqM_^3[H̋UE0:]jhh8uuv,  S 	         ;5 i   ƃ?k8MfD(tiVM(Y}e fMD(uR 	   +  uuVL2}E
   )u}V?%Y+  gR 	   }OMd    Y_^[̋U(MEEMSVuW  u 6+  Q    N  Ƌ?k8Uf}\:)tuШtD:( tjj j V+3}VYt?t%ˀ]   uESP>   u]ESVPMUf|( }EË] t*tuluESVPuESVPuESVP뢋L}؋]3j EPuSQqu	qE؍u؍}䥥MUEu\Et*j^;uP 	   )0PdYfD(@t;tJP    )  h+E3_^[̡pkËUEttO    L]ùpk]̋UM9 u3@y ujX38A] ̋UQuEuuPeЃwM  v  Etf̋UQQ} SVW}?   ]uthWMMuPEWP|eЃt\tOM  v+v3   KM
     f   fu]+u;Y33fE8AN *   =3t:uCCWMuPWj duN *   _^[Ë̋USW}t3f]  }   ;   VuMpUz  u"uuSWYRMj  c  J3M9   u/tfEt    } t
M샡P  ^<  E90tA]C~-3PWjSj	r)t3MtE막3   EPPqYY   E9EsMEo d~HӍJBu+ѹ;sˍQAu+3PEWQSj	p)b{ XE0$3PEWjSj	p(K *   t3fEtK0Et  3_[̋US]u5K    KH   e MVW;3V_nMukMEx  uQuSux   EEuQEPQhWEPEP	Ex*]tuFEPShWEPEPEyكKUUt?URQhWPEPExtMEFmEu3;} t
M䃡P  _^[̋UEu  ÃM3ɈE3fEEQPjEMPEMPEP  } |E̋UQMEutkj PuEuj PE̋UQMMEVtukUuuk33ҹFj PVQREP0E^̋U]p̋US]VWtu}uCuCt3f} t4E;vuPuV)u)t3f]H ?uPHj^0gE(@t3;vf;v+Hj"fLFt3_^[]̋UUu3ɋEH3@]ËMu
u
SV u3F3  u   r  vCj  u5 w-j^W$?uE
ˈ
3_HF	u0Y^[]̋UE  ` E]̋UE  ` F *   ]̋U]<̋UUVuFj^0C   } vM ~3@9Ew	Fj"̋utSZW~0~tG0@IZ  x?5| 0H9t:1uFˍqAu+΍APSRj_3[^]̋UP	  (03ŉEME SVuΉ%   Wu33G	3   3] E  bQQ${tYYo$=t=   u303ۅ4Ã\ C,3     ǅ   ǅ     3ɋ;0  u䍇3ҋj _+3@&M,H Љt@33+su9v2Ƀs      rr	jrZʉ   0+;rm;s83F;s@3##苍狍ǉ0INt,돋t΍03󫋅  ;vB,3,+3  P,P0SP'-   3jXA\PP`SP,    3ҋj ^+3@GK,H Љt@3;+su9v2Ƀs      rr	jrZʉ   0+;rm;s83F;s@3##苍狍ǉ0INt,돋t30  9vB,3,+3  P,P0SPH+   3@ǅ   \j5   ǅ   ǅ      3ɋ;0   u䃥 t@3j _+󉽤΍,<;s0 A;s3ҋЉ0It,볃sF,,5  +Vj P"63@5   , t@3j _+󉽤΍,<;s0 A;s3ҋЉ0It,봃sF,,4  +Vj PR53@5G  \PP`SP)  3j
YT  񉅠ʉb  &vj&Xj4jW1j P4Pj0PPEawru3\    \   \33؋`` G;u   `\Y  \   `PP`\SP'  u3\P    \   \3ɋ3؋`` F;u    \s43\P  ;\r``ut
ω\t\33   < u;    F   3ҋ!   std;u @Ɖ$  @A;ǉut4s   ;u A3Aȃs   F;\PP`SP%  tr+  u]3\P:3\PP`SP0%  2늃 \ j P`    \  33`Ɖ` G;uW  \sQ`\6  񉅜ʉA  &vj&Xj4jW1j PP0Pj0PP\   u3,Pm  u  , h  ,33؋00 G;u  3  ,s  0,  ,   0PP0,SPI#  6  ,   ,3ɋ3؋00 F;uE;,r00ut
ω,t,33   < u;    F   3ҋ!   std;u @Ɖ$  @A;ǉut4s  ;u A3Aȃs   F;,PP0SPs!     +         ,   330Ɖ0 G;ut,ssN0,e3P,P0SP   27 , j 3P,P0SPp   ,ttj
33[0ǉ0 F;u䋵  t@,ss0,&3P,P0SP  \P,PFYY
   w\1   j
3ɋ3[`` G;u䋵  tV\ss`\<3P\P`SP2  u	H0wMx
wȋEH;r;   ,   3ɋ30 ʚ;0 G;u߻  t@,ss0,&3P,P0SPa  \P,PDYYj_+30;r7Ou	vj	Y;4M_ 3^[0)̋VWV$>Yt
VTYF_^̀y tQ<Y̋UMVW}7;1u"3҅tA+;uB;u_^]_2^]̋UEVW}0;7t_^]3҅tH+;uB;u_2^]̋UE8 ]̋UQS]VuW<    EWFj PS$˺   ƋMT7A_^[]̋Ud	  (03ŉEEElPd#lY<u	ƅt lPHSYƅtS]VuWj _|sj-Xǋ3Q΁  u&΋Á uhku` Rh  EP:YtA   R  ,      E| @u]EݕΉ%   u33C	3   3ۋ   IQQ$[YYȉj _t   u33ۋ0É4\ C,3     ǅ   ǅ     3ɋ;0  u䍂ϋ3҃+ȉ3@Z4,H Љt@33+su9v2Ƀs      rr	jrZʉ   +0;rg;s3F;sB3##苍㋍É0INt,땋t΍03󫋽  9vB,3,+3  P,P0SPa   3jXA\PP`SP*    ϋ3҃+ȉ3@2,H Љt@33+su9v2Ƀs      rr	jrZʉ   +0;rg;s3F;sB3##苍㋍É0INt,땋t΍03󫋽  9vB,3,+3  P,P0SP   3@ǅ   \j#5   ǅ   ǅ      3ɋ;0   u䃥 t@3+,΍;s0 A;s3ҋЉ0It,볋sF,,5  +Vj P^3@5   , t@3+,΍;s0 A;s3ҋЉ0It,봋sF,,4  +Vj P3@5G  \PP`SPH  3j
YT  񉅐ʉ|b  &vj&Xj4jW1j PPj0PPzHwru3\    \   \33؋`` F;u   `\Y  \   `PP`\SP  u3\P    \   \3ɋ3؋`` F;u    \s43\P  ;\r``ut
ω\t\33   < u;    F   3ҋ!   std;u @Ɖ$  @A;ǉut4s   ;u A3Aȃs   F;\PP`SP  tr+|  |u]3\P:3\PP`SPe  2늃 \ j P`    \  33`ǉ`| F;uW  \sQ`\6  񉅠ʉA  &vj&Xj4jW1j PPj0PP$D   u3,Pm  u  , h  ,33؋00 F;u  3  ,s  0,  ,   0P|P0,SP~
  6  ,   ,3ɋ|3؋00 F;uE;,r00ut
ω,t,33   < u;    F   3ҋ!   std;u @Ɖ$  @A;ǉut4s  ;u A3Aȃs   F;,PP0SP     +         ,   330ǉ0 F;ut,ssN0,e3P,P0SP  27 , j 3P,P0SP  ,t|j
33[0Ɖ0 G;u䉵  tB,ss0,&3P,P0SP  \P,PB-YY
   w\1   j
33[`ǉ` A;u䋵  tV\ss`\<3P\P`SP_  u	H0wAx
wȋEH;r;   ,   33ɋ0 ʚ;ǉ0 A;u߻  t@,ss0,&3P,P0SP  \P,P+YYj_+30;r7Ou	vj	Y;4 t _^[tlP'YM3ChkhkhkuQGu	hk3PPPPPM̋UVuu3mEuj^0SW}t9urVWP836uj Pu	j9usj"^0jX_^]̋UMuO 	   8x$; is?k8fD(@] 	   03]̋Uu;EY] ̋UE] ̋V6E& Y^̋! ËV6D& Y^̋UVu   F;0tPDYF;0tPDYF;0tPDYF;0tPDYF;0tPDYF ;0tPpDYF$;0tP^DYF8;0tPLDYF<;0tP:DYF@;0tP(DYFD;0tPDYFH;0tPDYFL;0tPCY^]̋US]3VWM]M9   u9   uM04  jPj9-j ubCu3@V  jj-j }>Cu	V1CYӃ      jj,j }CuVBEPBY   FPjWEjPMEQjWjPEPjWEjPEPjWEjPPEEPjWEjPdE PjPWEjPME$PjQWEjP6E(PjWEj PPE)PjWEj PE*PjTWEj PE+PjUWEj PE,PjVWEj PPE-PjWWEj PE.PjRWEj PE/PjSWEj PxE8PjWjEPaPE<PjWEjPGE@PjWEjP0EDPjWEjPEHPjPWEjPPELPjQWEjPt)]Sz	S@EP@EP@rUHЀ	w
Bu"<;uFu}0jY󥋃   3ɋuA}    @F   @F   @0F0   @4F4Et   tK|tu   @s|@YYEC|3      _^[̋UUtVHЀ	w
Bu^]<;uFűUVutY;0tP>YF;0tP>YF;0tP>YF0;0tPr>YF4;0tP`>Y^]̋USVu3WuE9   u9   uE0N  3GjPW}'YYuw     jYji3Wu=YYuS=3Y@A  >u9   J  j/j }=YYSu=Y   ' E싾   jWjPXKQjWEjPDCPjWEjP0C0PjWEjPPC4PjWEjPt*SS=u<MMQ<EYpSHЀ	wh
Bu}uM3@t   tN|tuv|<   <YYEF|3      _^[<;uFu놡00C0C0C00C4f̋UUtVHЀ	w
Bu^]<;uFűUu];Y] ̋Uju   YY]̋Uju   YY]̋Uju   YY]̋Ujum   YY]̋UjuV   YY]̋Uju?   YY]̋UE] ̋V6:& Y^̃9 Ë! ËUMSVuW3?;#t6i:GvY;u_^[]̋ËUW}    u5Vhd  j#YYtWVD   YYuV@Y3V :Y^_]ǆ      3̋UEe SV   WVuEXYM3j1`  XjZEUMj_3PuEVjPZu؋EPVuEjP9؋E   PuEujP؋E}   PVWEjP؃PE@mEhEj8^huEE   ЃPVWEjPu؍EuWjP؋E   PVWEjPu؋E   PVWEjPu؃PEFmEuuu   Pj(WEjPE؍   Pj)WEjP.؍L  Pj(WEjP؍P  Pj)WEjP P؍   PjWEjP؍   Pj WEjP؍   Ph  WEjP؍   Ph	  WEj PP؍T  PjWjEP؍X  Pj WEjPj؍\  Ph  WEjPP<_^[̃9 ËV66& Y^̋UVu   jVFjPF8jPFhjP   jP   F6   ;6   06   jP   jPD   jPp  jPbL  jPTT  5X  5\  5`  5(^]̋US]VW39   uFhd  jYYtSVtYYuV;YW053@$Wǆ      5Y      3Y_^[]̋UQQU3SVWf9t8uft#Ef9EtЉUUfu3f9u_+^[̋UM3SVWf9t1U:ftf;t!fu3f9u3_^[]Ë̋U   (03ŉEVuPjUPN  ~<PWQ3ff;u+APPPP  jUP)u_M3^uWWWWW̋UQSVu3Wj_]Qff;u+3VZFff;Eu+3Ft
6   Y3ۉ~SSjh>`N	"u^_^[̋USVu3WjZyff;u+3Ft
68   YSSjhBVFu^_^[]̋UM3҅u3]fArfZv	fwB]̋U   (03ŉEVW}|j@PNdɁ  QWu	!FX@r  S|PvT3ۉxYY   j@|PF`%  PWLu!^X   |PvPYYNXu  NXύQff;u;uX9^\   v\|PvPuzNXύQff;u+APW  jUP&  FX   #;u  N`|j@ɁP  QW{u5^X3@N  FXuW9  YtNXύQff;up|PvPYY   NX   NX9^`t1     NXf9   ύYff;xu   9^\tyVPZff;xu+;V\uYW  Yu$^P3ҍKff;uvP+yY;tlNX     3f9uXύYff;xu*3ہ     NXf9u,ύYff;xu+APWjURo%uFXЃ[M_3^	 3SSSSSC̋U   (03ŉEVW}V	jxPN`Ɂ  QWu!FX@VPvPYYYu6S3ۍQff;u+APW  jUP#u NX[FXЃM_3^ SSSSS̋UQVuW   3f9>   |ff;uftfPf;Qufuދ   h{VeYYtjh|VTYYtY |ff;uftfPf;Qufuu.jEPh   EP  Pt'E}  _^V"YjEPh  3̋U(03ŉEVuEj	PjYVtj	EVPVu@3M3^̋UuYu/9Et*EVVffu+QoY;^u3]3@]̋UQVu3WB3xNStH7+؋EkM4E0YYuEMȋE
ys{;~[3_^̋UQQS]VW33҉UpPP  Vf~Eˍ   f9tWjhho,3Vf9tGf9t43Y9Fu2Vj@hkt3Vf9tLY39~6     f9;uf98u`p	VPYY       Pdp   Et0}   M   3fQff;Eu+APujUS   j@Wh  S	   j@   Sh     Po	tjj_SYYuj.SYYtj@Sj   P>	t9     ujh{jW\uj
jWV3@3_^[3PPPPP0̋U   (03ŉESVuW|uVL  ~  YKdٍjxɁP  QVqu!@3PsTkYYuV  Yt	wwЃM_^3[ ̋UVW3JTqff;u+3jhdHBdpE u8_^]̋UVu  qFF^]̋USVW=3jZNPyff;u+3NTF`yff;u+3}Fd_9^`uvP   Yjh$KV\p	"u_^[]̋USVW|3jZNPyff;u+3F`tvP9   YjhNV\pE u_^[]̋UM3fArfZv	fwB]̋U   (03ŉESVuW  VL    YKdٍjxɁP  QVq   PsTYY   jxPC`%  PVq  PsPbYYu  wdub{\ tBs\PsPqu)wKPQff;u+;K\uwuVE  Ytw   #;   jxPC`%  PVq   PsPYYuj   9C`t   9G   9C\tSPBff;u+;S\uWjV  tN   3339C`u99C\t4PsPYYuW3SV  t   9_uwЃ3@M_^3[X ̋U   (03ŉESVuWVL     YK`ٍjxɁP  QVqu!@aPsPYYK`u	u2Wj u29K\t-PsPYYuWPV  t	wwЃM_^3[ ̋UUV3
ft9Wj_ARf;w  Af;w  Ƀ
fu_^]̋UQMVW   3f9   |f:f;>uftfzf;~ufuދ҃t] |f:f;>uftfzf;~ufuu jEPEh   pqt)E5Q@Y,jEPEh  pqu3Eu`p_^̋UM3f;,|tr3@]3]̋UQVW2ujEP  h      Qqt2;ut(} t"wPNffuwP+Y;t3@3_^̋UQSVuW3x47+؋EkM4E0YYtys{;~2_^[ËMEM̋U(03ŉEES]VuWEP}E3M3҉L     E0xtf9tpWHPhhoE3҉U tnf9titf9tEPZ	EP} Y   `ouHPhktN3tf98tEP	EPY,tf9tEPoYE  qEE3} u3M_^3[3EP   #VnYYtQdptjuqtEt0EWjUP  Purt^WjU   Pu\j@Sh  uqfj@   Ph  uqGj
j   QV3@-̋UuY] ̋UE] ̋V6& Y^̃9 Ë! ËÃ9 ËV6W& Y^̋UQQSVj8j@3ۉuYYuK   ;tAW~ Sh  GPO8_̍GG  

G
g_ֈ_;uɋu_SY^[̋UVut%S   W;tWp8;uVY_[^]jh M}    r!j	^0ƋMd    Y_^[3uj\Yu i}9E|94fu1fuj^uE   뢡 i@ iG뻋ujY̋UEȃ?k8fPp]̋UQSVuxi;5 isaƋރ?k8fM|uCW}u" tt
uWjWjWj4pfM|3_ 	     ^[̋UEȃ?k8fPp]jh |jY]3}}ԁ   }DfE؅uTft& i@SkYf@(]E   ËMd    Y_^[Í   Mj8Xu;t`F(uVpF(tVpMj8X+u؋ƙj8Y4΃?k8fD(f\jG]jY̋USVuWxg;5 is_Ƌ?k8fD(tD|t=u#3+tt
uPjPjPj4pfL3} 	     _^[]̋UMu  ) 	   Cx'; is?k8fD(tD]E   	   ]jh]E @  tˀEtuquqPY   u@u uuM    薿  E e uVYYƃ?k8f\(fD) fd-EE   ƋMd    Y_^[ËuEuƃ?k8fd(VtY̋USVEWPYj  _f;  EP"EYf;  ED   3Af;u E%  E
    fuz3   fEfM   z	{zFzAfEurfE
ukfEudfEf@fE%;uNjYDfE  ffEf;u+fE
ffE
f;ufEffEf;ufM]E_^[ujYE]̋UEM!]̋UW}uE!8VWYM#^3_]̋UE#E]̋UE]̋UEM	]̋UEtHSVWPj?M1#Nϋ##SS;_^[t3@]3]̋UE#EM]̋UE#EM]̋UE#EfEuE]̋UE#EfEuE]̋UEEEuE]̋UEEEuE]̋UEEfEufE]̋UEEEuE]̋UEEfEufE]̋UEEEuE]̋UEM#E]̋UEM#E]̋UUVW3G######_^]̋UUVW3G######_^]̋UUVW3G###ɋ	#
##_^]̋UUVW3G###ɋ###_^]̋UUVW3G##
##	#   ȋ_f^]̋UUVW3G##ɋf###f_f^]̋UE%   ]̋UE @  t   ]3]̋UE%   t=   t3]ø   ]ø    ]̋UE% 0  t=   t3]ø   ]ø   ]̋UE `  #t'=    t= @  t;u   ]ø   ]ø   ]3]̋UE   #t'=   t=   t;u   ]ø   ]ø   ]3]̋UE   #t'=   t=   t;u `  ]ø @  ]ø    ]3]̋UE   #t'=   t=   t;u   ]ø   ]ø   ]3]̋UUVW3G######_^]̋UUVW3G######_^]̋UUVW3G######_^]̋UUVW3G######_^]̋UE#E]̋UE#E]̋UE#E]̋UE#E]̋UE#E]̋UEE]̋UEE]̋UEE]̋UEE]̋UEM	]̋UEfMf	]̋UEM	]̋UEfMf	]̋UEM	]̋UM? ]̋UE?]̋UM?   ]̋UE?]̋UM?%  ]̋UE?]̋UM   %  ]̋UE?]̋UQ=dX}3]E%  ̋UQ=dX}3]E?̋UWjY3}ueE%?  _̋UQ3fE}E?̋UQ=dX|E]M%  ? ȉMŰUQ=dX|E]M?ȉMŰUWjY3}uME3%?  3ȉMe_̋UWjY3}uM3E?3ȉMe_̋USV@  3W}#Jf;u   f@u      f;tދǹ `  #t%=    t= @  t;u         3ɋA#ы#Ћ	#Ћ
#Ƀ_^[]̋UQS]   VWËU#   j ^   t	;tuE       #t"=   t=   t;u   	   3ɋA##Ћ#Ћ#_E^[̋UMSV?   W#3   t   t;t   
j@[@  ƹ   #t%=   t=   t;u `   @      3ɋA#ы#
Ћ#	Ћ#_^[]̋UVuW֋3G######_^]̋UQM   SV%        W#Ej _ 0  t;t	   ڋ#t%=   t=   t;u         3ɋA##Ћ#Ћ#E_^[̋UVuW֋3G######_^]̋UE@  #Jf;u   ]f@u   ]f;u   ]3]̋UE   #=   t=   t;t3]ø   ]j@X]ø@  ]̋UUM? M   E]̋UM   ##;t]̋U VWjY3}ueE%?  P0=dXY}3]M  Q"YЋȃ? ы?ы   _^̋UM?E]̋UQQV3WfE}M3?G#####9=dX}3
]U?ʋ##ȋ#ȋ#ȋ#ʋ_^̋U WuYjЍ}Y3uE3Ё?  3Eeu\=dXY_|]E  %? EŰU SVW]?3F##Ћ#Ћ#Ћ##ƍ}j3YuM3?3ȉMe?Ë##ȋ#ȋ#ȋ##_95dX^[|]E?EŰUQQE]EU$~$   fD$    f(ffs4f f(P|f(`|f(|f(%p|f(5|fTfVfXf %  f( f(@fTf\fYf\XfYf(fXƁ         *f
        Df(}f(f( }fYfYfXf(0}Yf(-|fYf(|fTfXfXfYYfXf(@}fYf(ffY˃f(fXfXXXfD$D$fD$f(| f  wHt^  wlfD$f(P|f(|fTfV f  t|ú  Of|^f|   4f|Y    s:fW^ɺ	   fL$T$ԃT$T$$ED$fT$fD$f~fs f~с  t  릍$    ̋UV3ɾ   +U+ň}typH;~܃^]̋USVW3   ;+jU4Xu<ty^~;~Ѓ\_^[]̋UMSVW      t{   ts} uufxb3   ;++ň}tyXx;~݃x1Ō}jUSYY~;}SVu"uG3_^[]3PPPPPp̋U} tuYx=   s	ň}]3]̋UMS]Vuuu9ut'tj^0^[]ÅtEtu 3u+ًWuBt'u ΊBt
tuɋMu _uuEjPD X j"q̋U]̋U (03ŉEEMMES]]VW8   E}sMMΉuSPQ؃tSE;t9]r1SPVt	3y tt}E+]E뜋E3qU+u<UM
/3t| tSPEP\uHƋM_^3[ܽj^EuME3ut0My  u1ukPEPu蓛Mt~{0r9   u"fM   f;wHEEtP    HEuPVuEujPVq t9uuMtEtj*^0} t
MP  W̋U0(03ŉES]VuuW}u    2B  j MOEԁx  uVuSWE  e 3MueEԋPuPjEPEPFE~7}|    EPuPjEPEPE̃   UU   ;PsUU׉}EPuPjREPE~H;}tM;r?PEPQW   E tMU+ЉMUtE덃# NM} t
MЃP  ƋM_^3[̋UVuu3mEu8j^0OSW}t9urVWP36uj Pu	j9usj"^0 jX_^]̋UQMuEuPuEPE̋U(03ŉEEMVuu9EtPj^0g2Mj QuujEuPEPȅtEM3^3̋U]̋US]VWtu}u?u?t } t2E;vuPuVPu't  9uuj^0"@t;v Vj"D0 t3_^[]̋U(03ŉE  f9Et6M3PEEEPuEjPEPmu}uEM3̋UuuuuLq]̋SQQUkl$   (03ŉECVsW|t)t tttuljj
jjj_QFPW̵uGKttteEF]EFPFPQW|PEPh  |	>YYttVYu6YM_3^謶][̋UVuu#    9RFWt9VV蘺VPy~ tv"f YVY_^]jhpΥuuu    蜽<FVt<Ye 耔Ye VYuE   ƋMd    Y_^[Ëuu裠Yjh)uu7  ۿ 	         ;5 i   ƃ?k8MfD(tiVY}e fMD(uw 	     uuV  }E
   )u}V Y脘  ( 	   >Md    Y_^[jh}u	  譾 	         ;= i   Mǃ?k8UfD(t|WݓYu؋މ]܃e EfMD(u> 	   臗  uuuW  u؋ډ]E   .}]܋uW輐Y@   	   ֋ƋMd    Y_^[̋UVuVYue 	   /uuP   Ѓtƃ?k8fd(^]̋UQQVuWVbY;u 	   ǋMuMQuuPxpuqP
YӋEU#;tǋE΃?k8fd1(_^̋UEVjP3VVuxpuqPYMuEMQRPuuuxptыE9u|(=vVVuuuxp    ^̋UQQuEPuuuxpuqPYËEŰU]̋U]̋Uuuuu]̋Uuuuu&]̋U[VuW   Wj F[~ FYYtj@Y	   	FjF_~Ff _^]̋U  f9E   uMfM   f;s$UtE   E   ujMQjMQRP譛u	EE} t
M샡P  ̋Uj uYY]jhPe jEYe uuuuuu   uE   ƋMd    Y_^[ËujYjhp荞e jYe uuuuuu  uE   ƋMd    Y_^[ËujtY̋UQVW}uθj^0T' ut& } tSu  YtMˍQAu+jAPEYYutjY[_^Ë}SWPu
t>33PPPPP踳̋UQVW}uj^0]u3Et9EtSu[  YtTˍQff;Eu+jAPE<YYu蠷jY[_^Ë}SWP蔶u
t>33PPPPPjhmuu(    >3<  WVYY;sڃe jzYe V   YuE   ƋMd    Y_^[Ëuj:Yjhϛuu芶    蠳3<  WV
YY;sڃe jYe V   YuE   ƋMd    Y_^[Ëuj蜔Y̋UQVWtM} tGuNFu+0эBEBu+U;v<1=uVuQ谴tu3_^Ë@̋UQQVW_t`} tZu3҉UNff;u+8ʍAEff;Eu+M;vf<r=uVuRtu3_^Ëpjhe j>Ye uuuu   uE   ƋMd    Y_^[ËujYjh0莙e jYe uuuu  uE   ƋMd    Y_^[Ëuj{Y̋UQS]Vu׳j^0s# uW}t<t<t uYtHʍAEAu+MAt/;vj"X(tvj^0荰RVWu3_^[3PPPPP辮̋UQQS]Vuj^0   u3W}EtEtEt3fuSYtOʍAEff;Eu+MAt/;vj"X(t薲j^0譯RVW英u3_^[3PPPPPޭ̋UE0E0E0C]̋UE0E0E0]̋UE0E0E0]̋UE0E0E0軰]̋UE0E0E0臰]̋UE0E0E0 ]̋UE0E0&YY]̋UE0E0öYY]̋Uj j juuu']̋Uj j juuu]̋U]'̋U][̋U]őU]̋UMS];vgEVW;w#MWV U~E;vM;t!t+RLDJuEM+؍;w_^[]̋UEW};t&Vut+    @TLPu^_]̋U  (03ŉEMS]VuW} u%t!j    耬M_^3[耤]Åtۅtǅ    rIΉ3+x    ;   7I Ƌ;w1PV Ӄ~
Ɖ;vы;t4+߉RBDƈJu㋝+ϋ;kIt
 ˋWP Ӄ~VW Ӄ~VW Ӄ~VW؋ d$ ;v7;s%WV  ~;w=;wWV Ӌ ~ۋ     +ډ;vWS փً ;rYt6+ӋI RLDJu답 ;;s5+;v#WP Ӌ t;r; +Ɖ;vWP Ӄt׋ʋ++;|A;s|A ;I{;st@ ;8UV3PPPPPPPPUI 
t	$u
t$sF ^̋Uj uu]̋U} uΩ    3Vuu販    Ȧ9ur3EuMMVy tJ9Uw
Du+փ+J} t
MP  ^謺3Ʉ̋U=f VuH} u    >} t9uvި    ^])j uuu^]̋UW}u3   } uu    若   } tV;vK    aauMEWu   uu{&Wuh  Pu    p} t
MP  ^_̋U=f u]钙j uuu艦]̋UMSVWuEu3   MtUu=    Sh;v    3M}􋟤   uuVPRQQ-wPRPQh  ESP uΦ    p} t
MP  _^[̋UVuWuuC3~~~   3> uu9~ujשujF3fWWjVj	uuqPPY 4};GvP荩u wwjVj	u观tHG3_^]̋Uuujuj	uP] ̋U0S3V]Љ]ԉ]؉]܉]]]]u]]]PEPuqu(ѦPEPuXuuVuHp؀} tVFY} t	u7Y^[̋U]v̋U} u蜤    財]uj 5hk0p]jh蚉3fEE0Ye E  PYffuE   fƋMd    Y_^[ fuE0~Y̋UEMEEEPuEPZ̋UE] ̋UE ] ̋UE ] ̋ P1Y1܁Y1Y̋Uj	EEMXEEEPEPEP̋UQStEPEjPՠtfEø  ̋UES]?VWk8UfL8MMt;
uL8(d8(]E;   Ê   @tFE   ;Es((FE
u3u
@EE   j EEPjEPu,pti} tcUfD8(Ht'MFE
ufL8*E2}
u	;u
"jjju7|U}
t	UFE;EfD9(@uD9(F+_^[̋U(ES]?VWk8MfE
   TUUtj
^f93uL(d(SE;d  E   E   f;E)  Jf;Et  ;Ms;	MNj
MM[f;uSX3f9]]fuE      j E܉MPjEPu,p   }    MfD(HtMfUFEf;Uuj
Zf1jXffj
T*ffT+fZT,Ej
Xf9Eu;ufU.jjjuzUj
Xf9EtUjXfM;U fD9(@uD9(	jXf+_^[̋UEȃ?k8EfD*]̋UEfMV?k8fL*ffL+f^D,
]̋UQQSu]Suoȃ0  EU?Wk8UfE|) u  Vpx   3Bw;rNB0: t0:uϝ *      @;uSED(Ht5FL*rMFfD+uEfFD,+ڋjRPuwu+uVSj h   z؃uqP胱Y#E;ɋfD-$
ȍL-^_[̋UEVW}ϋG;sXSt4uY;sj
Xf9uj
Xjj[f^;rEȃ?k8fL([+_^]jhNuu\u    	         ;5 i   ƃ?k8MfD(   }vu  詛    |VqY}e fMD(uz 	   t  uuV}E
   )u}VnYt  + 	   AMd    Y_^[̋U(S]Wut  詚 	     _  ; iS  Ë?k8Mf3A}MT8('  Mvs  F          } tыT8UT8)UV3tOtUMU   Шu?s!0      }UMUf   ШtjXE;rMP|j j uu~    r    d  jj j SsMfD ET$֋Mf]3UD(H]   ]D*]<
      ]GBEI} UMfD*
]tE]fD+]<
tgtc]BEI}jUf_MD+
]u;E]fD,]<
t#tBEIMMjfU_D,
SYtqEMf|( }]EPu8ptL}uJj EPEPuu(puqPKYVMY^   EM<G)E j EPEPuu,ptZM9MwR}EUf|( }}tQuWuS.} WuSt
Jqj_;u] 	   p8Gm73:3p  * 	   @_[̋U$(03ŉEMS]Vu]Wuk3Bu	E߉E#ujXD  3f9FudCMxt3  $<u$<u$<   EEjY+EmMJ#%Nn,<      :   ŉEE9EsEEE܉])E#CE$<uă?ЋE9Erߋ];s*mfFŉfF   r  v= w5E   E   E   ;Trt& f #ӋVk}YM_^3[赉̋U]ܪ̋UV蛻u>F3^]̋UQQVu6jve Ee P9u;EuF;Eu33@^̋UQQe Ee PYu+MUEAEPUYu	蘆33@̋UMu3]S]VW}Bw 3Fw +u	tu_^[]̋U=f u)} u賒    ɏ]Ã} t]wj uuu]̋UW}uX    n   S]u6    L   Vuu3vuMZE    uVSWWw>MQPxME[QP_U+u	tu} t
E샠P  ^[_̋UQue EPfEYY̋UQQUVuWuk>  $  u<  f;w	VyYZ (  f;w'@
3=VQu2{.  f;wčE3P%#}Pu}{>~_^̋UME%#]̋UE8 ]̋UE   (  f;]̋UE   $  f;]̋UME'@
]̋U]tjhue E0:eYe E 0ƃ?k8fD(tVQY荏 	   uE   ƋMd    Y_^[ uE0bY̋UEMEEEPuEP-̋UE ] ̋UE ] ̋UE] 1/dY1waY̋V0ƃ?k8fD(t	V>Y^|^ 	   ̋Uu跛YtS}fu	   u}u@`tVj艛j耛YY;^tuqYP$pu]%q3]̋UVuug   	   axE;5 is=Ƌփ?k8fD(t"EuEMEuPEPEPf  c 	   y^̋UVW}W耚Yu3Nfu	   uu@`tjQjHYY;tW<YP$puqW/Yσ?k8fD( tVY3_^]̋Uu豼Y] ̋UE] ̃! ËV6肼& Y^jhSq3u>j芽Y}EP   Y txx8xHE   ƋMd    Y_^[Ëuj6jY̋UE3ɉEHEHEHEHEHEHE]̋3҃̋! ËUQS[VW=[]B7tRFu.V5_YV    
u]ШuVkkY;uE  _^[ËE0j8jj tӃHj h   P蘢7    F	V^Y1v^Y̋V6葺& Y^̋V    
u$^1jY̋UVu~Vu臏Y;Yp|3PPPuuVuuu#`^]̋UVu~Vu:YYE~Pu&YYtt3QQQPuVuuu贘+uj^	^]̋U=f VuH} u    3>} t9uv    ^]rj uuu*^]̋UW}u蚈    谅   S]ux    莅|VuvU    kXu3PuM耫E   MGUC+utMuـ} t
M샡P  ^[_̋U,(03ŉEESVuE؋EEԋEEW}}~VWrYEY	*  ] ~SPrYY	  E$uE؋ @E$t   ;     CMQPTq  ~4}r&} EtHt:r:  8 ujX  ~7}r)} Et u܊Ht:r:\  8 u3@U  3WWVuj	u$LcE؅3   Q;#tA=   w4ĉE      PEY      Eǉ}   uPVuu$jVb   WWSuj	VbE    Q;#t2=   wt\  P苍YtG  t6uVSuju$Pbt]WWWuVuSuu譔]VYY]SYY	jl3e_^[M3Yz̋UuMħu$Eu uuuuuP } t
MP  ̋UVuWj vv65d;qu,qu!蚱y   Wvv65d;q_^]̋UE E AE A] j qq15d;q3PPjPjh   @h pd;̋d;ud;3̡d;ttP$p̋UVj uuu5d;qu-qu"聰`Vuuu5d;q^]̋UMSVW   t   t   t   t   t   ѻ `  #t!    t @  t;u   _@  ^[@t  t@u   ]   ]   ]̋UM3?t2ttt tt   ]̋UQQ]EEUM3?t2ttt tt   ̋US]VW}e  }fEЃttt tt   ΁   t.   t    t   u            t   u         t   E##;   Qg  YfEm}fEȃttt tt   ց   t.   t    t   u            t   u         t   u  =dXw  ]M   t   t   t   t   t   ѿ `  #t'    t @  t;u         j@@  _+t  t+u         #]#;   Qr  PE螲YY]M   t   t   t   t   t   ѻ `  #t'    t @  t;u         @  +t  t+u         & _3^@[̋UQQSVuW]M   t   t   t   t   t   с `  t%    t @  t `  u   j@@  [+t  t+u         M##;   R  PEHYY]M   t   t   t   tt   с `  t%    t @  t `  u   ǁ@  +t  t+u         _^[h  :Y̋UMS   VWtt   t   t         tƋѿ   #t;t;t;u `   @         _#^[   t   t;u   ]Ã@]@  ]ʊ3?t2ttt tt   ̋UMttt tt   SV   W      t%   t   t   u	   #t;u      _^[   t   ]̋UM3?t2ttt tt   ]̋UV}3F95dX   fE3ɋW   ?t)#ttt t֨t]EEUE?t(#ttt tΨtʋ_<fM3?t1#ttt tt   ^̋U}fEȃttt tt   SV   W   #t&   t   t;u   
      t;u         t   }E##;   VZ  YfEm}fEttt tt   Ћ#t*   t   t;u            t   u         t   =dX  ]M   t   t   tt   t   ѻ `  #t'    t @  t;u         j@@  [+t  t+u         #}#;   Q|PE訩YY]M   t   t   t   t   t   ѿ `  #t'    t @  t;u         @  +t  t+u         3Ω t   _^[̋UE%PuYY]̋VBO0oJtF   t`  @$  ^̋UMtttt    tVѾ   W   #t#   t;t;u         с   t   u_^   t   ]̋UQQ} 	 Mu8u3}E=  %=  f;u=dX|.]E%  =  tV3QuVu^VVVVVn̋UQQVW}fU33Fȿ   ?t.#ttt tt95dX|=]U?t-#ttt tt_^̋UQUtD}fM3?t3ttt tt   Vut^UWVSMtMu}AZ I &
t'
t#:r:w:r:w:uu3:t	rً[^_̋UME#Vut$tj j wYYpj^0mQut	SJYY3^]%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p% q%q%q%q%q%q%q%q% q%$q%(q%,q%0q%4q%8q%<q%@q%Dq%Hq%Lq%Pq%Tq%Xq%\q%`q%dq%hq%lq%pq%tq%xq%|q%q%q%q%q%q%q%q%q%q%q%q%q%q%q%q%q%q%q%q%q%q%q%q%q%q%q%q%q%q%q%p%p%|p%xp%tp%pp%lp%hp%dp%`p%\p%Xp%Tp%Pp%Lp%Hp%Dp%@p%<p%8p%4p%0p%,p%(p%$p% pUE   ] ̋UE   ] ̋UE   ] ̋UE   ] ̋UE   ] ̋UE   ] ̋UE   ] ̋UM39t	I@9 u] x   t&]tk@kuhkjl髌̡kS3CV;t`uXhpu*hVpthLVkptףkκk3
u;t;t2^[DtV5khk ^úkku3A
űU@EjPupujY)EDtEVWEPp}ċ#uW#U#EJ33ҋȋEt3	u_^ ̋U<  SVWt  vD  t:        3tB;r	J;rF(;r3_^[] EEJ$B   ̋UQQVEPEPWuE    C=k u!E   k   ujY)uVonuuuVpujY)^ ̋UQx   t"q-kuEP5kjBtV5khk ^k    ̋UEM;H4] ̋UE+E] ̋UUV392t	@F8 uMt+ъ
Au^] ̋UQ<  S39  tD     Bt1VW   ϊAuu+IFu+uN;u)uu_^[ :uFGu+tދB$ űUMA<] ̋UE@] ̋UMu3UVut
:uFB
+^] ̋UEVutUW+
Bu_^] ̋UE@u+EH] ̋UE~  ] ̋UE ] ̋UE ] ̋UEM] ̋UEM] ̋UUME] ̋UQVWu3td9wt_S_   EtK7W   Oȋ92t@G90ut+ъ
Auu p3貁3F[_^ ̋UQQSWu~ e؅t=Vs3   }ϋ9>t@A98uE;sVS!V;r}^_[ ̋U4SVW6M   E$   MЋAYǋQߋq]y   E؉}y}}}3   }܉}}}}u$ẺE蔀EPjWhW mq3  E;+EЃE܍  u3EtE̋PV Ӌ\     tE̋Pj Ӌua3SSuquNq=EtE̋Pj ׋u%ẺEEPjSh~ mqE   MǇ;uW p}tE̋Pj Ӌ   E39Xt-9Xt(G<<8PE  uM9L8u;|84uuE4u^uWpuNq5EtE̋Pj ֋u%ẺE~EPjSh mqr4uE0te EPjˉ}u ~_^[ UE3SVWH<AYt}p;r	H;r
B(;r3_^[]Ujhh Id    PSVW(01E3PEd    eE    h   AtTE-   Ph   F?t:@$ЃEMd    Y_^[]ËE 3Ɂ8  ËeE3Md    Y_^[]UMMZ  f9uA<8PE  u  f9Hu   ]3]̀@s sË333̀@s sË3Ҁ33h   h   j xujbUW=dX   }wwUfnp ۹   #σ+3offtftf#uf#ǅEЃSf#3+#I#[ǅD_Ut93   t;Dǅt G   ufnf:cG@L9Bu_ø#fft    #Ϻf#ufft@ft뽋}3كE8t3_̃=dXr_D$fnp ۋT$   #+o
fftftff#uf~3:E3D$ST$   t
:tYtQ   uWV؋
~333ƃ u!% t% u   u^_[3ÍB[ËB:t6t:t't:tt:tt^_B[ÍB^_[ÍB^_[ÍB^_[SQQUkl$K=dXV}2ftf;stfu3f;SH#hfSfnp fp %  =  wffufuffujf;tftjX3f93^][%p%p%p%qUQ=dX|f} t	} uT]E?t?  u  é  t*  u  é  u  é   u  ø  ËE̋M$M&̐T$BJ3-+%e̍M2̐T$BJ3*8dj u.YY̐T$BJ3*d̍Mb6MP̐T$BJ3*J3v*nd̍MX1M
̐T$BJ35*-d̍M1M
̐T$BJ3)c̐T$BJ3)c̐T$BJ3)hc̋MR"̐T$BJ3y)qc̐T$BJ3R)LJcjuYY̐T$BJ3)cjuSYY̐T$BJ3(bjuYY̐T$BJ3(bjuYY̐T$BJ3n(fbjuYYËE   eMËM ̐T$BJ3(4b̍MMM3MMM3̐T$Bt3'J3'a̍MMME3MsMM53̐T$Bh3X'J3N'$Fa̍M2M2̐T$BJ3	'J3&`̍M"B̐T$BJ3&J3&h`̍M-̐T$BJ3&h}`̍MMd-̐T$BJ3I&A`juYYËM̐T$BJ3&_̐T$BJ3%_̐T$BJ3%_̐T$BJ3%8_̍MsK̐T$BJ3c%J3Y%|Q_̍M2K̐T$BJ3"%J3%_̍MJ̐T$BJ3$J3$^̍MJ̐T$BJ3$J3$l^̍MoJ̐T$BJ3_$J3U$M^̍M.J̐T$BJ3$J3$<^̍MIM/M/M/MI̐T$BJ3#J3#]̋E   eMtIÍMv*̐T$BJ3[#S]̐T$BJ3.#&]̍M.̐T$BJ3"J3"L\̍M.M.̐T$BJ3"J3"\̐T$BJ3~"v\̐T$BJ3Z"R\̍M.M1H̐T$BJ3!"J3"p\̍M-MG̐T$BJ3!J3![̍Mm-MG̐T$BJ3!J3!y[̍M"-MPG̐T$BJ3@!J36!<	.[̍M(M̐T$BJ3 ,Z̍M'M]̐T$BJ3 Z̍M'M̐T$BJ3y ,qZ̍M^'M ̐T$BJ3; 3Z̍M 'M ̐T$BJ3Y̍M&Me ̐T$BJ3Y̍M&M' ̐T$BJ3yY̍Mf&M̐T$BJ3C4;Y̍M(&M̐T$BJ3X̍M%Mm̐T$BJ3X̍M%M/̐T$BJ3X̍Mn%M̐T$BJ3KCX̍M0%M̐T$BJ3xX̍M$Mu̐T$BJ3W̍M$M7̐T$BJ3xW̍Mv$M̐T$BJ3SKW̍M8$M̐T$BJ3W̍M#M}̐T$BJ3dV̍M#M?̐T$BJ3V̍M~#M̐T$BJ3[$SV̍M@#M̐T$BJ3pV̍M#M̐T$BJ3U̍M"MG̐T$BJ3HU̍M"M	̐T$BJ3cH[U̍MH"M̐T$BJ3%U̍M
"M̐T$BJ3T̋MF̐T$BJ3<T̋MF̐T$BJ3}<uT̐T$BJ3V,NT̐T$BJ32*T̐T$BJ3T̐T$BJ3S̐T$BJ3dS̐T$BJ3 S̐T$BJ3~vS̐T$BJ3ZRS̐T$BJ36h.S̐T$BJ38
S̋M̐T$BJ3R̋M̐T$BJ3XR̋M̐T$BJ3yqR̋M}̐T$BJ3E=R̍M!>MM>M#̐T$BJ3J3 Q̍M=M@M=Mt#̐T$BJ3J3Qj4uYY̐T$BJ3NFQj4uYY̐T$BJ3dQjuKYYËEЃ   eM"̐T$BJ3J3PjuYYËEЃ   eM6"̐T$BJ3[J3QPIPjDuYY̐T$BJ3PjDuEYY̐T$BJ3OjuYY̐T$BJ3`OjuYY̐T$BJ3`XOjuYY̐T$BJ3&Oju]YY̐T$BJ3hNju#YY̐T$BJ3LNjuYY̐T$BJ3xpNjXuYYËE   eM ËMc@̐T$BJ3<NjXuKYYËE   eM ËM?̐T$BJ3MjXuYYËE   eM% ËM?̐T$BJ3U<MMjXuYYËE   eMËM7?̐T$BJ3LjuYY̐T$BJ30LjuYY̐T$BJ3tlLjuYY̐T$BJ3:2LjuqYY̐T$BJ3 Kju7YYËE   eMuËM~
̐T$BJ3KjuYYËE   eMËM
̐T$BJ3A9KjDuoYYËE   eM̐T$BJ3JjDuYYËE   eMS̐T$BJ3JjuYY̐T$BJ3J|BJjuYY̐T$BJ3$J̍t5Mt5M̐T$Bd3J3I̍t~5M@tk5M-̐T$Bd3PJ3F>I̍\5M\5M̐T$BP3J3dH̍\4Ml\4MY̐T$BP3|J3r jH̍MC4̐T$BJ33+H̍M4̐T$BJ3G̍MM̐T$Bh3J3G̍MWMO̐T$Bh3rJ3h`G̍p<3p13ME   eLÍp3MME   eMRËE   eM9ËE   eM ËE   eMËE    eߍMÍM̐T$BH3ZJ3PT HF̍p1p1M64E   eLÍp1MyMqE   eM3ËE   eM3ËE   eM3ËE   eM3ËE    eߍM3ÍMz3̐T$BH3J3D̍MH̐T$BJ3
lD̍M̐T$BJ3e
l]D̍M?̐T$BJ31
J3'
8D̍M̐T$BJ3	J3	C̍M(̐T$BJ3	 C̍M̐T$BJ3{	 sC̍MW/MMG/M	̐T$BJ3/	J3%	LC̍M.MH1M.M̐T$BJ3J3BjuYYËMUjXuYYËM4jXuYYËM4jDuYY̐T$BJ3E=BjulYYËM jXuWYYËM$4jXuBYYËM4jDu-YY̐T$BJ3A̐T$BJ3h|A̐T$BJ3`<XA̍M$`4-`)-MMM̐T$B3J3@̍M$/`,`,MmM.M.̐T$B3J3vn@̐T$BJ3@8@̐T$BJ3x@̐T$BJ3?̐T$BJ3?̍M}̐T$BJ3J3?̍M<̐T$BJ3bJ3X, P?̍M̐T$BJ3!J3?̍M̐T$BJ3J3>̍M*̐T$BJ3J3>̍Mn*̐T$BJ3^J3TL>̍M-*̐T$BJ3J3>̍M)̐T$BJ3J3=̍M)̐T$BJ3J3L=̍Mj)̐T$BJ3ZJ3P|H=̍M))MMMM	)̐T$BJ3J3X<̍M(̐T$BJ3J3X<̍M(̐T$BJ3oJ3e]<̍M>(̐T$BJ3.J3$<̍M'̐T$BJ3J3H;̍M'̐T$BJ3J3;̍M{'̐T$BJ3kJ3aY;̍M:'M)M)Mz)M'̐T$BJ3
J3 :̍M&̐T$BJ3 :̍M&̐T$BJ3 :̍Mi&̐T$BJ3Y Q:̍M5&̐T$BJ3% :̍M&̐T$BJ3P9̍M%̐T$BJ3P9̍M%̐T$BJ39̍Me%̐T$BJ3UM9̍M1%M̐T$BJ3J39̍M$MV̐T$BJ3J38̍M$M&̐T$BJ3J3y\q8̍MP$M&̐T$BJ38J3. &8̍M	̐T$BJ3J3x7̍M	̐T$BJ3J37̍M#M̐T$BJ3kJ3a<Y7̍M	̐T$BJ3(J37̍M̐T$BJ3J3P6̍M"M%̐T$BJ3J36̍M$̐T$BJ3[J3QI6̍M$̐T$BJ3J3\6̋E   eMQ̐T$BJ35̋E   eM#̐T$BJ3w5̐T$BJ3TJ3J4B5̍M2M̐T$BJ3 5̍MMw̐T$BJ3l4̍MM9̐T$BJ34̍MxM̐T$BJ3U@M4̍M:M̐T$BJ34̍M M̐T$BJ3(3̍M MA̐T$BJ33̍M M̐T$BJ3](U3̋Mm%̐T$BJ3't3̐T$BJ3 p	2̋M̐T$BJ32juYYËEЃ   eMX̐T$BJ3}J3s
k2juYY̐T$BJ304(2jugYY̐T$BJ31ju-YY̐T$BJ3 1jXuYYËE   eM1ËM#̐T$BJ3atY1jXuYYËE   eMËMC#̐T$BJ30jDu+YYËE   eMi̐T$BJ3$0juYY̐T$BJ3`X0̍M;̐T$BJ3+H#0̍llME   e@Í`MME   eMlËE   eMSËE   eM:ËE   eM!ËE    eߍMÍM ̐T$B<3"J3(/̍M̐T$BJ3.̍M̐T$BJ3xXp.jXuYYËM} jXuYYËMh jDuYY̐T$BJ3	.̍M$``MMM̐T$B3J3-̍M1̐T$BJ3WJ3ME-̍M̐T$BJ3J3 -̍M̐T$BJ3,̍M̐T$BJ3,̍M}̐T$BJ3me,̍MI̐T$BJ391,̍MM̐T$BJ3J3+̍MM̐T$BJ3J3X+̍MI̐T$BJ3oJ3e]+̋E   eM̐T$BJ3
+̍M̐T$BJ30*̐T$BJ3*̍MT$BJ3J3x*̍MT$BJ3\HT*  ̹P̹ P̹P*̹Q̹Q̹aR̹`R                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     6 Q                                                                                                                                                                                                                                                                     '                                                                                                                                                                                                                                                                      P p                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       nt {N l                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            $_ =n                                                                                                                                                                                                                                                                     WJ                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         \! O­    \! O­    \! O­    #L%X Oyq    -5BBpE9    yYF*e5#    \! O­    b`|F|R<ea    C LC    (|9r2E:^C9    יḾTu    -a(~OB1J    hkJ6O<N|\    S_'O%Q #    E+    ̯ٽKeㅛ    z
qcBڔ    7HBW0    ({?DOM    xv*`@gc޴mI    ʓ.	 O­    |nO=8F    {LAdE/    ؋$NL`~+`    VnH5ٚ]    &NA7nm@    81cOa3A    KcJ76]|    /Ff:cDf$    |1_@J    (,- O­    5T Oyq    \! O­    \! O­    (,- O­    ^c;?) O    symKɷ-    (}G@$s~    N(䷦:AeV#.+    ط,lO0uXF    {bT O,   d       {bT O,   e       {bT O,   f       {bT O,   g       {bT O,   h       {bT O,   i       {bT O,   j       {bT O,   k       {bT O,   l       {bT O,   m       {bT O,   n       {bT O,   o            * %O     unknown exception       4^ * *Y     dQ * *Y     bad array new length        unknown     string too long     )        bcp_initW   bcp failed to get symbol bcp_initW.         bcp bcp_bind    bcp failed to get symbol dll_bcp_bind.          bcp_sendrow     bcp failed to get symbol dll_bcp_sendrow.           bcp_done    bcp failed to get symbol dll_bcp_done.              {0 F  l     l  t Y     P C x      j_ M" ? /h     }= I Z3 =     = D  j     o $A u 6p     " s S %6     9 C  a     . 1 = 7G     v ' j      j ' qq      &l Z ^9 kc     bcp failed in step `done` yet no error was returned. No rows have likely been inserted                  bcp failed to dynamically load msodbcsql v17            `, yet no error was returned.       bcp failed in step `        . d l l     m s o d b c s q l       .  ` " <     dL 50 G <     & HY (L <     f j t< <      V ! <     k' qI $ <     nV 4 l? <     O* 9 6 <     a Dg [ <      f 8 <     V ' & <     F T q <     #  w  . <     #B  wR <     D H TM <     vector too long     < {! 0 @ p f f1 2o             C : \ U s e r s \ S t e p h e n \ d e v \ j s \ v 8 \ n o d e _ m o d u l e s \ m s n o d e s q l v 8 \ n o d e _ m o d u l e s \ n a n \ n a n . h                                     s i z e   < =   i m p : : k M a x L e n g t h   & &   " t o o   l a r g e   b u f f e r "                       k;  G      Fj a G cR     % f     l e n   < =   I N T _ M A X         s t r _   ! =   0       9 * ]     bad locale name     *   C   K` / G t     is_user_defined     row_count    m :v P j X \m c ] r         ` type_id     schema      C : \ U s e r s \ S t e p h e n \ d e v \ j s \ v 8 \ n o d e _ m o d u l e s \ m s n o d e s q l v 8 \ s r c \ B o u n d D a t u m . c p p                                 ! d a t e _ o b j e c t . I s E m p t y ( )             n u m e r i c       d e c i m a l       s m a l l m o n e y         m o n e y       f l o a t       r e a l     s m a l l i n t         i n t       b i g i n t     t i n y i n t       c h a r     t e x t     v a r c h a r       b i n a r y     b i t       d a t e     d a t e t i m e o f f s e t         d a t e t i m e 2       s m a l l d a t e t i m e           d a t e t i m e         t i m e     s b i g i n t       Invalid number parameter        Invalid parameter type      max_length      val precision   bcp_version     table_name      ordinal_position    scale   offset  value   is_output   sql_type    name    bad conversion      |u { Sb <     tA O sV <     Il N  <     Aj  F <      ; <= <     `Z jU % <     [ x u^ <     ) 4 8 <     d C' !D <     Q EW L <     + A ( <     k q LA <     ? R;  Q <       A              C                                table_value_param       j )  <     < U p <     ]I 6 [ <         kO {! 0 @ p f + h         s {! 0 @ p f [ -         p e r s i s t e n t ( ) . I s E m p t y ( )             ! p e r s i s t e n t ( ) . I s E m p t y ( )               ! p e r s i s t e n t ( ) . I s W e a k ( )             r e f s _   >   0       w r a p - > r e f s _   = =   0         [ -= d     C : \ U s e r s \ S t e p h e n \ d e v \ j s \ v 8 \ n o d e _ m o d u l e s \ m s n o d e s q l v 8 \ n o d e _ m o d u l e s \ n a n \ n a n _ o b j e c t _ w r a p . h                                     o b j e c t - > I n t e r n a l F i e l d C o u n t ( )   >   0                 . -= d     close   open    query   bindQuery   prepare     readColumn      beginTransaction    commit  rollback    nextResult      callProcedure   unbind  freeStatement   cancelQuery     pollingMode     Connection      Unable to initialize msnodesql          ! o b j e c t . I s E m p t y ( )           map/set too long    )d W " A e <      Q @ <     % {! 0 @ p f R &             k C : \ U s e r s \ S t e p h e n \ d e v \ j s \ v 8 \ n o d e _ m o d u l e s \ m s n o d e s q l v 8 \ s r c \ O d b c C o n n e c t i o n . c p p                                 c o n n e c t i o n S t a t e   = =   C l o s e d               78 b ; <     C 
B V <     l {! 0 @ p f \ H         ( {! 0 @ p f [          - {! 0 @ p f k ;a         ?b {! 0 @ p f , `#         !N {! 0 @ p f  AL         + {! 0 @ p f  g         conn_str    conn_timeout    ^ HE 5 <     @ U ZB <     No data returned    IMNOD   l     T {!  @ 1> f     | {! 0 @ p f           nan:AsyncWorker     internal error      sqlstate    code    severity    serverName      procName    lineNumber                     H" C G      I a G      u Y G .     lD )s G @     6 iL G g&     ^ ~_ G ,     end_rows    data    CANCEL      Error: [msnodesql] cancel only supported for statements where polling is enabled.                   [Microsoft] Operation canceled          U00000      C : \ U s e r s \ S t e p h e n \ d e v \ j s \ v 8 \ n o d e _ m o d u l e s \ m s n o d e s q l v 8 \ s r c \ O d b c S t a t e m e n t . c p p                                       v a l u e _ l e n   > =   0   & &   v a l u e _ l e n   < =   d i s p l a y _ s i z e   -   1                       #Q . < <     [ f  <     * N + <     " D Mc <     pJ ~s c <     ,u AV 9Y <     [ L g <     l! t F <     G ' 6u <     'M p >' [                   B( K < <     ?! {! 0 @ p f m O         VP     v {! 0 @ p f >r =         ru {! 0 @ p f [ \h         :    
 v0 uc T %     iostream    iostream stream error       false   true     * >     3 ios_base::badbit set        ios_base::failbit set       ios_base::eofbit set        ! {! 0 @ p f }e =         `F                         Q                        6/  " }o [A * 3  Y B U H Tf # cM             Q  " \ N * 2B  Y B L PQ Tf # cM                  h           X       IMNOD: [msnodesql] Parameter        %p  Lu  Ld  lu  ld  eE  pP  .   invalid string position             _B            query_timeout   max_prepared_column_size        numeric_string      query_polling   query_str       B {! 0 @ p f g l&         endOfResults    meta    preRowCount     rowCount    text    boolean     number  date    binary  size    nullable    type    sqlType     udtType                       ?@     M@     V@      ^@     b@     f@     j@     `n@     q@      s@     t@                                                                                                                                                                                                                                                C : \ U s e r s \ S t e p h e n \ d e v \ j s \ v 8 \ n o d e _ m o d u l e s \ m s n o d e s q l v 8 \ s r c \ T i m e s t a m p C o l u m n . c p p                                   m o n t h   > =   0   & &   m o n t h   < =   1 1               d a y   > =   0   & &   d a y   < =   3 0                     ?              ?              Y@             v@              y@             @             @             Ğ@             Ȟ@            pA      m :v E4 S: .A h% 0 ^ ]         s. 0123456789ABCDEF    nanosecondsDelta          ?              $@            eA    node.exe                node.exe    ph ~(     Unknown exception       % ~(     bad allocation      <I Vi     bad function call       # ~(     %h ~(     Ts ~(     9 ~(     A ~(     p: ~(     вf6 ~(     regex_error(error_collate): The expression contained an invalid collating element name.                         regex_error(error_ctype): The expression contained an invalid character class name.                     regex_error(error_escape): The expression contained an invalid escaped character, or a trailing escape.                         regex_error(error_backref): The expression contained an invalid back reference.                 regex_error(error_brack): The expression contained mismatched [ and ].                  regex_error(error_paren): The expression contained mismatched ( and ).                  regex_error(error_brace): The expression contained mismatched { and }.                  regex_error(error_badbrace): The expression contained an invalid range in a { expression }.                     regex_error(error_range): The expression contained an invalid character range, such as [b-a] in most encodings.                         regex_error(error_space): There was insufficient memory to convert the expression into a finite state machine.                          regex_error(error_badrepeat): One of *?+{ was not preceded by a valid regular expression.                       regex_error(error_complexity): The complexity of an attempted match against a regular expression exceeded a pre-set level.                              regex_error(error_stack): There was insufficient memory to determine whether the regular expression could match the specified character sequence.                               regex_error(error_parse)        regex_error(error_syntax)       regex_error     0
       R m :v      m :v      ~(     ]0 ~(     bad cast    l5 m :v C r #L         еR m :v     4t m :v S   U B< x %^ =(              m :v R, n X W u@ NI  ,  :g y( p             1W m :v Z  m -G V +  7             h) m :v ,W ] 3- 3 TR         ̷EC m :v it r #L \@ B G i         0123456789-+Ee      0123456789ABCDEFabcdef-+Xx      0123456789ABCDEFabcdef-+XxPp                            x?  0l  K     Ըp' r 1 > D     Ы<               $                  device or resource busy     invalid argument    no such process     not enough memory       operation not permitted     resource deadlock would occur       resource unavailable try again          p2 ~(     йG ~(     4)( ' 8 uc T %         generic                     5            m       o   &               R                           7      d	        )        p      P            '                     (         {      W      !   '      '                                2      n      a	       i                     )                                         '     @'  d   A'  e   ?'  f   5'  g   '  	   E'  j   M'  k   F'  l   7'  m   '     Q'  n   4'  p   '     &'     H'  q   ('     8'  s   O'  &   B'  t   D'  u   C'  v   G'  w   :'  {   I'  ~   6'     ='     ;'     9'     L'     3'     f   d   e   Բq      !   $   @	   Ph   h    xj   g   k   ȳl      m      )   0   H   d   t&   (   n   o   д*         0      @   P   \s   pt   u   v   w   
   ̵y   '   x   z    {   0   H|   `   x         Ы   ̶   }   ~          i    p   8      T   p            ȷ   $      <"          4   H   \   h      r      ܸ                                                                                                                                                                                                                                                               address family not supported        address in use      address not available       already connected       argument list too long      argument out of domain      bad address     bad file descriptor     bad message     broken pipe     connection aborted      connection already in progress          connection refused      connection reset    cross device link       destination address required        directory not empty     executable format error     file exists     file too large      filename too long       function not supported      host unreachable    identifier removed      illegal byte sequence       inappropriate io control operation          interrupted     invalid seek    io error    is a directory      message size    network down    network reset   network unreachable     no buffer space     no child process    no link     no lock available       no message available        no message      no protocol option      no space on device      no stream resources     no such device or address       no such device      no such file or directory       not a directory     not a socket    not a stream    not connected   not supported   operation canceled      operation in progress       operation not supported     operation would block       owner dead      permission denied       protocol error      protocol not supported      read only file system       result out of range     state not recoverable       stream timeout      text file busy      timed out   too many files open in system       too many files open     too many links      too many symbolic link levels       value too large     wrong protocol type     unknown error           :Sun:Sunday:Mon:Monday:Tue:Tuesday:Wed:Wednesday:Thu:Thursday:Fri:Friday:Sat:Saturday                   :Jan:January:Feb:February:Mar:March:Apr:April:May:May:Jun:June:Jul:July:Aug:August:Sep:September:Oct:October:Nov:November:Dec:December                                  : S u n : S u n d a y : M o n : M o n d a y : T u e : T u e s d a y : W e d : W e d n e s d a y : T h u : T h u r s d a y : F r i : F r i d a y : S a t : S a t u r d a y                                       : J a n : J a n u a r y : F e b : F e b r u a r y : M a r : M a r c h : A p r : A p r i l : M a y : M a y : J u n : J u n e : J u l : J u l y : A u g : A u g u s t : S e p : S e p t e m b e r : O c t : O c t o b e r : N o v : N o v e m b e r : D e c : D e c e m b e r                                                         5 m :v $ 0 u, 0 8# %          & m :v 0 L . = Y e 7$         hf@ m :v q ; _t d w i= T  f )# N on             ԻHJ m :v : 8 8s   = 1  E +: J\ - e             @( m :v     ]] m :v     05 m :v     )_ m :v W     l! m :v X? P P c (` Gn  [2 !5 Nv              нr m :v YW & c* 6  - 0 $P 3             4  m :v  2 P $ ]N         w4 m :v cf A T%         g m :v + yF 73         hqb m :v  " S     ̿( m :v 4; r     4 m :v S ^ pO q  i  + u             0N m :v S ^ pO q  i  + u             & m :v S ^ pO q  i  + u             dF m :v rf c  aT BF )Z Ja         L<t m :v   t R " # . T / / ,              m :v ' m & }Q s @ .s )i             - m :v (G p Y  nG         xr m :v  g '         H m :v  g `P         H!v m :v % uE     9 m :v MT /     J m :v " t h O  #. j *c 5             9 m :v " t h O  #. j *c 5             n m :v " t h O  #. j *c 5             De m :v JC  ; [_ ] L #8         J m :v R     ! % x       %b %d %H : %M : %S %Y       %m / %d / %y        :AM:am:PM:pm    %I : %M : %S %p     %H : %M     %H : %M : %S    %d / %m / %y    0123456789-     %.0Lf   0123456789-     0123456789-     0123456789-+Ee      0123456789ABCDEFabcdef-+Xx      0123456789-     0123456789-+Ee      0123456789ABCDEFabcdef-+Xx      $+xv    0123456789ABCDEFabcdef-+XxPp        0123456789ABCDEFabcdef-+XxPp            +v$x+v$xv$+xv+$xv$+x+$vx+$vx$v+x+$vx$+vx+v $+v $v $+v +$v $++$ v+$ v$ v++$ v$+ v+xv$+ v$v$ +v+ $v$ ++x$v+ $v$v ++ $v$ +v                            -   : A M : a m : P M : p m         -       MraB3G    ,_ m :v  " nQ         Y m :v "  m 3Z          m :v qN !S     `Q m :v C6  e     )7 m :v \ Sg i Uo "k  I / Q(              m :v \ Sg i Uo "k  I / Q(             7 m :v \ Sg i Uo "k  I / Q(             ] m :v a y< E ` f^ ! 6         d> m :v e     !%x     0123456789-     0123456789-     0123456789abcdefghijklmnopqrstuvwxyz      !

					               0123456789abcdefghijklmnopqrstuvwxyz      A)!               k e r n e l 3 2 . d l l         FlsAlloc    FlsFree     FlsGetValue     FlsSetValue     InitializeCriticalSectionEx         InitOnceExecuteOnce     CreateEventExW      CreateSemaphoreW    CreateSemaphoreExW      CreateThreadpoolTimer       SetThreadpoolTimer      WaitForThreadpoolTimerCallbacks         CloseThreadpoolTimer        CreateThreadpoolWait        SetThreadpoolWait       CloseThreadpoolWait     FlushProcessWriteBuffers        FreeLibraryWhenCallbackReturns          GetCurrentProcessorNumber       CreateSymbolicLinkW     GetCurrentPackageId     GetTickCount64      GetFileInformationByHandleEx        SetFileInformationByHandle      GetSystemTimePreciseAsFileTime          InitializeConditionVariable         WakeConditionVariable       WakeAllConditionVariable        SleepConditionVariableCS        InitializeSRWLock       AcquireSRWLockExclusive     TryAcquireSRWLockExclusive      ReleaseSRWLockExclusive     SleepConditionVariableSRW       CreateThreadpoolWork        SubmitThreadpoolWork        CloseThreadpoolWork     CompareStringEx     GetLocaleInfoEx     LCMapStringEx                                                                                                                                                                                                                                                                                                                                O   _      ?              A    #t         TT    j7              	   
   
   $   4	   @   H	   T	   `   l
   |   	                                        ȉ         H                                                        $   (   ,   0   4   8   <   @   D   H	   T	   `   l   x                   $   H   l#             &   8   X   l   p   x   #      	             $%   T$   %   +          ,"   X(   *                      4   X   p          ȉ                                                                                                                                                                                                         __based(    __cdecl     __pascal    __stdcall   __thiscall      __fastcall      __vectorcall    __clrcall   __eabi  __swift_1   __swift_2   __ptr64     __restrict      __unaligned     restrict(    new     delete     =   >>  <<  !   ==  !=  []  operator    ->  ++  --  +   &   ->* /   %   <   <=  >   >=  ,   ()  ~   ^   |   &&  ||  *=  +=  -=  /=  %=  >>= <<= &=  |=  ^=  `vftable'   `vbtable'   `vcall'     `typeof'    `local static guard'        `string'    `vbase destructor'      `vector deleting destructor'        `default constructor closure'       `scalar deleting destructor'        `vector constructor iterator'       `vector destructor iterator'        `vector vbase constructor iterator'         `virtual displacement map'      `eh vector constructor iterator'        `eh vector destructor iterator'         `eh vector vbase constructor iterator'          `copy constructor closure'      `udt returning'     `EH `RTTI   `local vftable'     `local vftable constructor closure'          new[]   delete[]   `omni callsig'      `placement delete closure'      `placement delete[] closure'        `managed vector constructor iterator'           `managed vector destructor iterator'        `eh vector copy constructor iterator'           `eh vector vbase copy constructor iterator'         `dynamic initializer for '      `dynamic atexit destructor for '        `vector copy constructor iterator'          `vector vbase copy constructor iterator'            `managed vector copy constructor iterator'          `local static thread guard'         operator ""     operator co_await       operator<=>      Type Descriptor'        Base Class Descriptor at (          Base Class Array'       Class Hierarchy Descriptor'         Complete Object Locator'       `anonymous namespace'       CV:     ::  template-parameter-     `template-parameter-        generic-type-   `generic-type-      ''  `non-type-template-parameter        %lf ??_C    ... NULL    %d  `template-type-parameter-       `generic-class-parameter-       `generic-method-parameter-      nullptr     void    `template-parameter     }'  }'  `vtordispex{    `vtordisp{      `adjustor{      `local static destructor helper'        `template static data member constructor helper'            `template static data member destructor helper'             static      virtual     private:    protected:      public:     [thunk]:    extern "C"      )   char    short   int     long    unsigned    void    volatile    volatile    std::nullptr_t      std::nullptr_t      <ellipsis>      ,...    ,<ellipsis>      noexcept   cpu amp ,   char    short   int long    float   double  bool    __int8  __int16     __int32     __int64     __int128    <unknown>   char8_t     char16_t    char32_t    wchar_t     auto    decltype(auto)      __w64   UNKNOWN     signed      const    volatile   `unknown ecsu'      union   struct      class   coclass     cointerface     enum    const   &   &&  cli::array<     cli::pin_ptr<   )[  {flat}  {for    s   8        j 'p q >     " = F $     H4J ]! JW \     l  s 2      NS QA F K                                                                                                                            ??                                             \ @ ~(     bad exception   P    a p i - m s - w i n - c o r e - f i b e r s - l 1 - 1 - 1               a p i - m s - w i n - c o r e - s y n c h - l 1 - 2 - 0                 k e r n e l 3 2         a p i - m s -                                                             Assertion failed: %Ts, file %Ts, line %d
               A s s e r t i o n   f a i l e d :   % T s ,   f i l e   % T s ,   l i n e   % d 
                   Microsoft Visual C++ Runtime Library        M i c r o s o f t   V i s u a l   C + +   R u n t i m e   L i b r a r y                 Assertion failed!       A s s e r t i o n   f a i l e d !           Program:    P r o g r a m :         File:   F i l e :       Line:   L i n e :       Expression:     E x p r e s s i o n :           For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts                         F o r   i n f o r m a t i o n   o n   h o w   y o u r   p r o g r a m   c a n   c a u s e   a n   a s s e r t i o n 
 f a i l u r e ,   s e e   t h e   V i s u a l   C + +   d o c u m e n t a t i o n   o n   a s s e r t s                                               (Press Retry to debug the application - JIT must be enabled)                ( P r e s s   R e t r y   t o   d e b u g   t h e   a p p l i c a t i o n   -   J I T   m u s t   b e   e n a b l e d )                             . . .       
   
   

  
 
     <program name unknown>      < p r o g r a m   n a m e   u n k n o w n >                    EEE50 P    ( 8PX 700WP       `h````  xpxxxx                             EEE  00P  ('8PW  700PP   (   `h`hhhxwpwpp                         ( n u l l )     (null)        ?      ?3      3                  0C                                                             3      3                                                           ?     ?BB       xPD?X1=                      ?      ?                      0C      0C                      Η5@=)d	U5j%5j?~@5wzA.lzZ?                                                                              8C      8C        ?      ?1gU?k?wNo?ł?9B.?      @G                                                                                                               ?      ?3      3                                                                                            	               	      
                                                !      5      A      C      P      R      S      W      Y      l      m       p      r   	      
      
      	                  )                                             Y  *                                                                                                                                                                                                                                                                                                                                                                  ( ( ( ( (                                     H                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  	
 !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                                                                                 	
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~                                                                                                    ( ( ( ( (                                     H                                                       (                                                                 0                                                                                                                           ???         T     c-^k      @tFМ,    a\)c     d4҇f;lD      ِe,BbE"&'O   @V$gmsmr    d'c%{pk>_     njf29.EZ%qVJ  .C|!@ΊĄ'|Ô%I   @T̿aYܫ\DgR)`*     !VG6K]_܀
@َЀk#c  d8L2WBJa"=<rtYl*   [aOni*{P+4/'PcqɦJ(.onIn   @2&@Prє)[f.;}eSw Sƫ%KM -"RP(WB}]9֙Y8 wzaja  gV :6	ipev &gn	+2qQH΢ER   xt ]u۩reLK(wmCQɕ'U'樜=    @J#m
XoC]-HY(?.qּDi}nVyu  Ჹ<u?k:އFEMh$h0'DAXQh٢%v}qN  dZW f) }m?Mp=ANqא:@O?owM&
   1U	X&aVjuvD,GA>UD~ $s%rс@b;zO]3AOmm!3VV%(w;I-G 8NhU]i<$qE}  A'JnWb쪉"f37>,ެdNj5jVg@;*xh2kůid&   _U JW
{,Ji)Ǫv6UړǚK%v	t:H孎cY˗i&>r䴆["93uzKG-wn@_l%Bɝs|-Ciu+-,W @zbjUUYԾX1EL9M Ly;-"m^8{yrvxyN      \lo};obwQ4Y+X<XF"|WYu&Sgwc_
i9351C!CZؖ?h   d}/KNs	Ogֵ8sI̗+_?8 7xB">W߯_w[R/=OB
    R	E]B.4o?nz(wKgg;ɭVl H[=J6RMq!	EJjت|Lu <     @rd6x)Q9%0+L;<(wXC=sF|bt!ۮ.P9B4Ҁy7   P,=87MsgmQĢR:#שsDp:RRN/M׫
Ob{!@f u)/    wdq=v/}fL3.iLs&`@<
q!-7ڊ1BALlȸ|Rabڇ3ah𔽚j-    6zƞ)
?IϦw#[/r5D¨N2Lɭ3v2!L.2>p6\BF8҇i>o     @@w,=q/	cQrFZ**F΍$'#+GK	ŎQ1VÎX/4Bycg6fvPb   ag
;s?.❲ac*&pa%¹u!,`j;҉s}`+i7$fnIoۍut^6n16B(Ȏy$    dAՙ,C瀢.=k=yICyJ"pפl dNnEtTWtøBncW[5laQۺNPqc+/ޝ"     ^<V7w8=Oҁ,t×j8_լZ>̯p?m-}oi^,dH94X<H'W&|.ڋu;-Hm~$P                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         	     % - 5 	> 
H 
R ] i u         -C	Y	p	



	%                                
   d     '   @B    ʚ;            m i n k e r n e l \ c r t s \ u c r t \ i n c \ c o r e c r t _ i n t e r n a l _ s t r t o x . h                       _ _ c r t _ s t r t o x : : f l o a t i n g _ p o i n t _ v a l u e : : a s _ d o u b l e                       _ i s _ d o u b l e             _ _ c r t _ s t r t o x : : f l o a t i n g _ p o i n t _ v a l u e : : a s _ f l o a t                     ! _ i s _ d o u b l e       INF inf INITY   inity   NAN nan I N F   i n f   I N I T Y   i n i t y   N A N   n a n   SNAN)   snan)   IND)ind)S N A N )   s n a n )   I N D )     i n d )     pow       ?    a m / p m       a / p           /   :   	   +   %                                                                                                                                                      	     0    \     @    \ /       P    m s c o r e e . d l l       CorExitProcess          ^
    
    . R 

 1 o Mm     ݎ
Qi F o 3 1 , R         [
    
    


n

                                   @   D   H   L   T   \!   d   l   t   |                                           "   #   $   %   &                                                   exp pow log log10   sinh    cosh    tanh    asin    acos    atan    atan2   sqrt    sin cos tan ceil    floor   fabs    modf    ldexp   _cabs   _hypot  fmod    frexp   _y0 _y1 _yn _logb   _nextafter      R u n t i m e   E r r o r ! 
 
 P r o g r a m :                                 INF inf NAN nan NAN(SNAN)   nan(snan)   NAN(IND)    nan(ind)    e+000       	
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                             22R 2qS 82k T2-Q                 L C _ A L L     L C _ C O L L A T E         L C _ C T Y P E         L C _ M O N E T A R Y       L C _ N U M E R I C         L C _ T I M E       = ;     ;   =   - _ .       C   _ . ,       _   .       L
P
T
X
\
`
d
h
p
x



















 
 ,8DPTXd|       (@Pht$4DP\l 8                                                                        Sun Mon Tue Wed Thu Fri Sat Sunday  Monday  Tuesday     Wednesday   Thursday    Friday  Saturday    Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec January     February    March   April   June    July    August  September   October     November    December    AM  PM  MM/dd/yy    dddd, MMMM dd, yyyy     HH:mm:ss    S u n       M o n       T u e       W e d       T h u       F r i       S a t       S u n d a y     M o n d a y     T u e s d a y       W e d n e s d a y       T h u r s d a y         F r i d a y     S a t u r d a y         J a n       F e b       M a r       A p r       M a y       J u n       J u l       A u g       S e p       O c t       N o v       D e c       J a n u a r y       F e b r u a r y         M a r c h       A p r i l       J u n e     J u l y     A u g u s t     S e p t e m b e r       O c t o b e r       N o v e m b e r         D e c e m b e r         A M     P M     M M / d d / y y         d d d d ,   M M M M   d d ,   y y y y           H H : m m : s s         e n - U S                                                                            D             0             ?   ?                                ?   ?                                                                                                                                                                                                                   <              @>           3              9                  <              @>                              2@           A                          2@                                                                                    IqI    `B`B        YnYn    ?  log10                             
|?Q-8>=  ޶W?0	k8= ޮp?x9=  >.ښ?pn5= Yح?  	Q*=  c??b6= Y?T?=  >?W!= @-32?Dz= p(?vP(= `?US?>= e?g7= `ŀ'?bͬ/= ^s?}#= Jwk?zn= Nָ?LN 9= @$"3?5Wg4p6= T?Nv$^)= &?.)< lB?M%= `j?w*=  <śm?E2=  ެ>?E= t??= OQ?w(@	< 0?Ac0= Pyp?dry?= St)?4K	>= $?QhBC .= 0	ub?-0=  ?a>-?=  ?Й,<  (lX ?T@b == P?3h,%= f??# = V?ߠϡ6= Y?z $= G? $l35= @n?[+3= Rŷ ?sdLi== p|?rx"#2= @.?|U2=  lԝ?rF= a?4= Y?sl׼#{ = `~R=?.i1= ,? = vX? = p?h}s"= 	E[
?%S#[k= 7H?j= !V1?}a2= jq?20J5= ?5= x¾/@?"B <1= iz?\-!y!= X0z?~b>== :?#.X'= HBO&?(~= xbb?.= Cq?y7i9+= v?:= 0?2ض8= xPD?X1=                                                                                                                                                                                                                     ?     ?     Q?     Q?    ?    ?    ?    ?    ?    ?    ?    ?    ]?    ]?    P?    P?     ?     ?    U?    U?    (?    (?    `?    `?    _?    _?    ?    ?    ?    ?    z?    z?    1?    1?    p?    p?    ?    ?    (e?    (e?    @#?    @#?    ?    ?    `?    `?    hk?    hk?    ,?    ,?    x?    x?    ?    ?     ?     ?    N?    N?    x?    x?    p?    p?    ?    ?    ~?    ~?    HN?    HN?    ?    ?    ?    ?    ?    ?    p?    p?    Xi?    Xi?    ??    ??    ?    ?     ?     ?    ?    ?    8?    8?    s?    s?    pI?    pI?    &?    &?     ?     ?    ?    ?    o?    o?     *?     *?    ?    ?    `?    `?     Z?     Z?    ?    ?    0?    0?    ?    ?    PY?    PY?    ?    ?    `?    `?    ?    ?    pm?    pm?     /?     /?    ?    ?     ?     ?                                                                                                                                                                                                                      ?    ?     ?    D?    ?     ?    @?    @W?     ?    ?    ?    w?    A?    ?    @?    ?    q?    ??     ?    @?     ?    }?    N?    @ ?    ?    ?     ?     m?    A?    ?    ?    ?    ?     q?    H?     !?    ?     ?    ?     ?    a?    <?     ?     ?    @?    @?    @?    g?    E?    @$?     ?     ?    ?    @?    ?     b?    B?     $?    ?    @?    ?     ?    ?     r?    @U?     9?     ?    @?     ?    ?    ?    @?     {?    `?     G?    -?     ?     ?    @?    ?    @?     ?    @?    i?     R?     ;?     $?     ?    ?    @?     ?     ?    @?    ?    @s?    @^?    @I?    @4?    ?    @?     ?     ?     ?    @?    ?    @?     ?     n?     [?    @H?    5?    @#?     ?     ?     ?    @?    ?     ?    ?    @?    @?    @s?    @b?    Q?     A?    0?    @ ?     ?      ?                                                                                                                                                                                                                                          a?F<=  z1%?Vd?E=  b?6\M=  ?p9t^<= \cN?	ʽJ= 3?/N=  b?DZ.0=  Ohe??0=  ]3?`$= @׹ƻ?X&eBE= rr?\3#.J= ׌?C5= 3:?LtmYE= @'z+?"e=  tLVv?p$M= `dH?h6_~(= `x?YO= YL?wJQ\C= jU?Vш4= +0?e37.= `2?⋱K= `I?)-W0=  -Ƀ?*D= D?7Tf(G= 6	x?Y8= %?E<= w?~?= ҐC?]u<= PW?>#4<  Xq?BJ= _D?mKF= Ԛ?s7E= @[-?K>d:= g?Z}=\uI= s~Q?g:"(N= '?9~$O1=  q?n1%= p)k ?vʌ= `X:?q.W = Pi?g>M= [?ֲa
M= _3?֍,uXO= `Ɏ/?1w<= >'eH?`	JJ= x~? &= n`Y?˖C= 0?]/= # g?uP= ?,lC= 5q?ᕎ	= @Dӳ?-[@= pt4z? فpnJ= l?i.Eg< y~??O^'= (Tt?
x;;=  P?RRF= &?XɣN= J@?~= Ht=c?AzU"= nB?U_lj7= ]?qBD=  h<?z)t'= Z#z?0L= @5ڿSOOF ڿۓD 0ٿ= n  W9!ٿ?j> 0"ؿ؍ I Qn0ؿHn&E :׿E7D5 7A׿%@ @ֿ* Z+A STֿrJ D @ӑտNT? w3kտr19  ]ԿFKm8 C!`Կ1y2Y @Կ*(<j  䃝ӿVCD p,ӿ1n ҿ2=l7 0IҿO	x*  l@ѿ2>FE O5iѿ4Q! ?:	пC	 + pڌXпxO,C  "пAri< q~_ϿR v= =	~οo6 @mPͿ	 d+ >̿9Ȓ [\˿8B' &˿i[J ZOʿbnE DE}ɿUgc@ H	ȿUZdL  " ǿ=Dj!  ǿVm:A @`3ƿ~%3  kcſ"7M  Ŀp> )%ÿ\B jx¿#6HQ; `t-¿=]PH0 ;TaָE  &a-#K V\Vb4M @U@  Xx55 @캿D= iI^Gי'7 AԷUN  <N>Ҫ1 GƴO\C @+Bg:IB @Zu}M :(T!1 n]vQ<)8  h׾o$|f+ x2S74  U".mœFB* 6IKS_D   5M-C  z1}BK G  c?OfF  L,sX4I+  xm	w$VcE                                                                                                                                                                                                                                                                                                                                                                                                                                                      ?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?     ?    ?    ?    @?     ?    ?    ?    @?     ?    ?    ?    @?     ?    ?    ?    @?     ?    ?    ?    @?     ?    
?    
?    @
?     
?    	?    	?    @	?     	?    ?    ?    @?     ?    ?    ?    @?     ?    ?    ?    @?     ?    ?    ?    @?     ?    ?    ?    @?     ?    ?    ?    @?     ?    ?    ?    @?     ?    ?    ?    @?     ?     ?     ?    @ ?      ?                                                                                                                                                                                                                                          |)P!?Ua0		!=   +34?2Q	=  `??7;WJ=  `7E?'a %C=  MkK?*b<=  0ɘP?*,z?=  d|S?KT'K=   R_V?bF=  p^BY?E&=  9&\?߇N9=  p	_?߭Eb2]A=  `?f#I=  hb?O2H`3=  c?e2a1=  ԆLe?2RM=  f?A3_:=  @0h?[2ieO=  i?1rK=  k?Σ-=  l?̈[8=  yQm?>|W8A=  ՛ko?>qݲN=  np?z m{M=  t)(q?m,SD=   E`q?}e?=  ԩr?}~:fE=  PSs?&A=  &t?,&8=  tt?eѴN@=  PSu?^p?o40=  !9v?W?N=  <v?+#GYM=  Hw?qC@=  Pex?0&ے=  Xy?8 =  <8y?!({=H=   z?d,GB=  6K{?ҝE	M=  ¾|?w31!=  L|?^X-F=  <w}?0!O=  y1~?|"įQ<=  $~?kf@=  +?bUC=  4/?*K_<*=  <t?̍xI=  2р?wYV%A+=  .?x+s7E=  8#o?efE=  |R?Ks޸E=  T8E?=(=  !?)G=  ?#F؇K=  V[?C<  :︃?kVI=  ?YH=  r?q4';=  .~τ?=S7=  ',?7X#=  4ԉ?Ck7=  bB?EpC=  BC?'2xk==  蠆?̸WUA=  xm	w$VcE  ̑ʭvK[7  GQve$lF  uyԏH  gԙu|ǣ%I  =u?FK  tS'q	!   YхtL8|H  dw)tv#L  l&s>D  fqsg~7(  7s6uE  (ruv.E,  t]rLvO  rȚp  &qC "5F  zIqoO  jpO  |WpȮ/N  #D5pO/3N  ^oI!  `1nDCE  "Bnu
^!E  WΉm--0  lNpC  P&`lJ  $akN  8xj[-=  8Riy~   La8i[٬zF+  ghk<@8K  Hg}7ڒ%  gmg1&3   {4WfI8  e}OA  8ӌd_\M  P4.dó6D  @uc2I  {bTWB  `b.r}  X]La6MŞr<  P`;ƥI  pη_v<-  UF^9M  \̢N  3e[ݻk>?   #JY&-D  PZXm4I@  @7eWO/  jUIlN  Ai0TWquI  bR|m:K  @VNQ?|G¾d0  `7O84   fXLzB7C  Ip4"%H  `/G:
WI  `ȃ1D/!H  @%OAA9"I  x<u*6"dм  7xG@  @O1O(;>  '8RؔN   ;*2]                                                                                                                                                                                                                                                                                                                                                                                                                                                   @G?   E?   @D?    C?   A?    @?   >?   @=?   ;?   @:?   8?   7?    6?   4?    3?   1?   @0?   .?   @-?   +?   *?    )?   '?    &?   $?   @#?   !?   @ ?   ?   ?    ?   ?    ?   ?   @?   ?   @?   ?   ?    ?   ?    ?   
?   @	?   ?   @?    ?   ?    ?    ?    ?   ?   @?   ?   @?    ?   ?    ?   ?   @?   ?   @?   ?   @?    ?   ?    ?   ?   @?   ?   @?   ?   ?    ?   ?    ?   ?   @?   ?   @?   ?   ?    ?   ?    ?   ?   @?   ?   @?   ?   ?    ?   ?    ?   ?   @?   ?   @?    ?   ?    ?   ?    ?   ?   @?   ?   @?    ?   ?    ?   ?   @?   ?   @?   ?   @?    ?   ?    ?   ?   @?   ?   @?   ?   ?    ?   ?    ?   ?   ?   @?   ?   ?    ?   @?   ?   ?    ?   @?   ?    ?   @?   ?   ?    ?   @?   ?    ?   @?   ?   ?    ?   @?   ?   ?    ?   ?   ?    ?   @?   ?   ?    ?   @?   ?    ?   @?   ?   ?    ?   @?   ?   ?    ?   ?   ?    ?   @?   ?   ~?    ~?   @}?   |?    |?   @{?   z?   y?    y?   @x?   w?   v?   @v?   u?   t?    t?   @s?   r?   q?    q?   @p?   o?    o?   @n?   m?   l?    l?   @k?   j?    j?   @i?   h?   g?    g?   @f?   e?   d?    d?   c?   b?    b?   @a?   `?   _?    _?   @^?   ]?    ]?   @\?   [?   Z?    Z?   @Y?   X?   W?    W?   V?   U?    U?   @T?   S?   R?    R?   @Q?   P?    P?   @O?   N?   M?    M?   @L?   K?   J?   @J?   I?   H?    H?   @G?                                                                                                                                                                                                                                                                                                                                                                                                                                                             >Y "G=    >.ܶlWE=    >jۋbH=     >^IL#=    >(i&I=   h>gݟP'E=   p >*)D=    >&N=   x >.;ĝ@=   H	 >Qyu3=   
>c-=   @>Rݡ:==   >	{M=    	@>C=   `
>bߔB=    >tdC=   $>9O=    >B NC=   >j&==   >.<=    @>`lrG=   >!ls1=    ?8=   @? mN=   & ?UtQ$=   X?PiB{^C=   ?Gv72=   @?qlm+=   ?!.j7/=   d?L C=   `?m	+=   P ?5Od%	=   ?r<   (?*Hga2=   @	?CI=   r 
?sA=   *
?GTiA=    `?KՋD=   r" ?Dp`q=   L$?~G=   4&?D=   '@?E=   ) ?'P<   +?f4±cC=   @?qWn{;=   ?gC i8=   ?XKD=   P?G;R"=   7?8΁3<L=   a?rF҈K=   ^`?_UN=   ?;T6=    ?Ԛ<   !?qW*#M=   ""?j
\M=   p#0?|I7Z#/=   $?^aDJ=   &?>,'1D=   B'@?:+NB=   (?1z@J=   * ?3=   +`?wU4?=   ,?DO=   ;.?$b =   /p?g)([|X>=   H1?>gV=   20?OBO=   *4?bPA<   5?e4=   f7@?|[{~*L=   9?ٹE=   t:?G]C=   '<P?{mu!K=   =?
v\4=   ??n=   fAp?{7!O=   B?=   D ?=u <=   F?i&-=   lH?oN=   I0?IT$7QN=   K?Н\0=   M?0tЗI=   OP?
'C=   uQ?4%@@=   vS ?*
qwG=   ~U`?K ᴽ+=   W?FPn;M=  , ?]K=  -8 ?ƎIM=  .h ?5m3=   / ? M=   0 ?I=   1 ?"I=   2 !?y$=  4P!?_	D=  .5!?]uE:=  "6!?l#5=   J7!?,A=   u8"?!y##<  98"?xyF=  :h"?bCڝD=   ;"?uRF=   ="?2w}=  D>"?@(6F=  ? #?'A=   @H#?43A=  Ax#?uN}*J=  C#?)r7Yr7=  ]D#?.K="=   rE $?r=  F0$?3=1Z1=   H`$?h|=G=   gI$?ܩN:=   J$?4e6=   K$?{<9=  =M%?uYPwH=  NH%?-*8=  Px%?yF.=  -Q%?\9;,=   R%?29Zd@=   T &?~YK|=  sU0&?WĻ(J=  VX&?RIG=   X&?W	N=   Y&?g'9=   [&?D"^=   2)$   7bmL   Mӿ(   	ԏS4   _	>L   |/dM   4g±8   2qڜ1   ןqaPC   Qo %;9   ?_0C   w4g%6L   &M;k@   ڿ81AB   ۏ1uB   )_Y   /󓎣,:   x.Ճ^-   ?   ޯԝI   -:]=O>   O#w_jُB   n(+E    -V~|_   B}_A   CK!ܨY:   _5G   t/C$>   #H   m-
M   Vn@   QU^tA   $OÄ   þiM   @K8|;2   @(A   V64   oꬠTC   9?&u.   ~Fs:4   Կ	J   _LII   =@0(   ן$.G   ?}3Rʏ3   !|.4   *ڟ඄}3   ?G"jm
>;   *O   0 :O   2K;   ޿Q`4   _ ZD   
69   *
F   _
T3ʢK   	M.֢>   	@_@   ?	1\hU   XpM   &Jx3   Ҭ   x/h7   8Lv]E   V3   Bv9   r_cM   *5&L   q3   ?:R$   @܎$=   K'   \?Ъ{b>   $EvC   Iw8R'   FG_j,)   +jBD   |_`kA   %'rBL   	TE   _GO    #i#     ;^طH   ? 6(`JJ   \HB5   ``.11   \?QD   T<VD=   DMϲk:UG   ?,'   hUF   UȘI   t@5   X?󕕠4   $cG   y/C   tTM   h?A)E   zcϨN   {-   <?G#?F   }-wF   wj'   Qx   ?*
<   4	,   p~ܾUY =   ˚G   쾂p7   m81<   'mN   辙L   hKY02    ̟q   㾭vBfe9   0%2F   ΥE8   ߾`=?   ܾE=|
   پuM   @־9>   Ӿ96   оk<
xE    ˾CqTR;   ǾdG    GgL   @_h%?   SS@                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                b?Wdy>c*GPAiFC.ֿ                      ?        53=?͸)a<aw>,?][SqnC?nwtӰY?eus<)kp?&<ߑțuE?Ka<>?5a1xH<lX?
aJ.<Gr+?qO<2?R{':@<f?{NkQ[?9D9Ŗ1l*?ǥlQ-B?6/QȘZ?	j@<{Q}<r?u׹Aꍌ8?k#uo[?hI{L[<\?.5Sh1?<d n<"P?{ߑ֌b;?JuǍ<}I?~<8bunz8?rǶ~<?OQ?U<|eEk?@3<c߄?}?:L?U<?8
A䦅?ATG<V/>?#Eq<1
?1j<1Lp!?|眊<d<?Y6!'<_V?(FN\\˩:7q?B:fm?<4ۧ?a6u-?)]7"4L?	ڊ<E?V#З*.!
?x0i^P1?y_ǁ-a`N?πzH<W Aj?vdK<<?bs<*?Vb˙<'*6ڿ?B쯗C}<?3xj<,v?WY	BfϢ?ivOV+4?<z]ʤQ?h'6Go?,<Ǘ?[ᕂ<)TH?GFL2<FY&?iK<<H!o?]0<	v?GVB⓼U:~$?@~ 4FC?2u<H%"U8b?3Y	sLU?d>D8`<;f?Ud4ݛu?gVr/e<?<h:kQ}?%<t_u?zGntH??;el٨gBV_?m1WY$?]Oi?,
f<s?/w20?ML<bN6?~y]p<>T'?*mb|L%?2L#FG?AֈDh?ԛƟfǊ?:|<۠*B?&KV<D2?2^p6w?l̅<[?#%X.y֝Ͱ77?~_gRDZ?9|KvPNޟ}?Ѕ|[p?2Αs𣂑?qF||<##c?nLx$x<e]{f?2]IY3-J0?6}\0<]%>U?An/X0y?c~˛<yUk?1<zӿk?l4Z?]4͡<f)?$LޛO3?ׄ0^b:YrY?mqG^v?:T~OXuJ0?.)TK?-z=<	[?rk?Rݛ?HPe<z_@?
ƃ7E<KW.g?<HM<m?D\Hq<i ?Iu<]U?rS;؍|J-?zyC7/?wq{HX?7[<?2?2mi #<`!?xWڒ<_{3?[KOͥ)F&?z'?.P?̩<LQz?"Ւ<ڐ?(#g-H?󓜼'Za?ǝ<k7+%?C<@En[vP?-ә<{?	5ؐ?SH<q+?yetb<                                                                                                                                                                                                                                                                                                                                                                                                                            ?  P___8``aLaaa(bbbHccPcc$d                a p i - m s - w i n - c o r e - d a t e t i m e - l 1 - 1 - 1               a p i - m s - w i n - c o r e - f i l e - l 1 - 2 - 2               a p i - m s - w i n - c o r e - l o c a l i z a t i o n - l 1 - 2 - 1                   a p i - m s - w i n - c o r e - l o c a l i z a t i o n - o b s o l e t e - l 1 - 2 - 0                         a p i - m s - w i n - c o r e - p r o c e s s t h r e a d s - l 1 - 1 - 2                   a p i - m s - w i n - c o r e - s t r i n g - l 1 - 1 - 0               a p i - m s - w i n - c o r e - s y s i n f o - l 1 - 2 - 1                 a p i - m s - w i n - c o r e - w i n r t - l 1 - 1 - 0                 a p i - m s - w i n - c o r e - x s t a t e - l 2 - 1 - 0               a p i - m s - w i n - r t c o r e - n t u s e r - w i n d o w - l 1 - 1 - 0                     a p i - m s - w i n - s e c u r i t y - s y s t e m f u n c t i o n s - l 1 - 1 - 0                     e x t - m s - w i n - n t u s e r - d i a l o g b o x - l 1 - 1 - 0                     e x t - m s - w i n - n t u s e r - w i n d o w s t a t i o n - l 1 - 1 - 0                     a d v a p i 3 2         n t d l l       a p i - m s - w i n - a p p m o d e l - r u n t i m e - l 1 - 1 - 2                 u s e r 3 2     e x t - m s -          AreFileApisANSI                         EnumSystemLocalesEx                                                       GetActiveWindow                GetDateFormatEx     
          GetEnabledXStateFeatures                  GetLastActivePopup                          GetProcessWindowStation                   GetTimeFormatEx               GetUserDefaultLocaleName                  GetUserObjectInformationW       
          GetXStateFeaturesMask                           IsValidLocaleName                           LCIDToLocaleName              LocaleNameToLCID    
          LocateXStateFeature               MessageBoxA               MessageBoxW     	   RoInitialize    	   RoUninitialize         AppPolicyGetProcessTerminationMethod           AppPolicyGetThreadInitializationType           AppPolicyGetShowDeveloperDiagnostic            AppPolicyGetWindowingModel                SetThreadStackGuarantee               SystemFunction036                 8C      8C        ?      ?1gU?k?wNo?ł?9B.?      @G                                                                                                                       ܧ׹fq@      @6C?      ?exp          cC _ f (                              5h!?5h!?      ?      @                          ?5h!>@                   @                              SunMonTueWedThuFriSat       JanFebMarAprMayJunJulAugSepOctNovDec        TZ  jjjj    j a - J P       z h - C N       k o - K R       z h - T W                  	     % - 5 	> 
H 
R ] i u         -C	Y	p	



	%                                0   1#INF   1#QNAN  1#SNAN  1#IND       pE N U   pE N U   pE N U    qE N A   <qN L B   PqE N C   hqZ H H   tqZ H I   qC H S   qZ H H   qC H S   qZ H I   rC H T   HrN L B   lrE N U   rE N A   rE N L   rE N C   rE N B   sE N I   8sE N J   `sE N Z   |sE N S   sE N T   sE N G   tE N U   (tE N U   DtF R B   htF R C   tF R L   tF R S   tD E A   uD E C   4uD E L   `uD E S   uE N I   uI T S   uN O R   uN O R   vN O N   4vP T B   hvE S S   vE S B   vE S L   vE S O   wE S C   8wE S D   xwE S F   wE S E   wE S G   wE S H   $xE S M   LxE S N   pxE S I   xE S A   xE S Z   xE S R   yE S U   8yE S Y   `yE S V   yS V F   yD E S   yE N G   yE N U   yE N U                                                                                                                                                               A       yU S A   yG B R   zC H N   zC Z E   (zG B R   <zG B R   `zN L D   tzH K G   zN Z L   zN Z L   zC H N   zC H N   zP R I   zS V K   {Z A F   ,{K O R   H{Z A F   h{K O R   {T T O   yG B R   {G B R   {U S A   yU S A                                                              a m e r i c a n         a m e r i c a n   e n g l i s h         a m e r i c a n - e n g l i s h         a u s t r a l i a n         b e l g i a n       c a n a d i a n         c h h       c h i       c h i n e s e       c h i n e s e - h o n g k o n g         c h i n e s e - s i m p l i f i e d             c h i n e s e - s i n g a p o r e           c h i n e s e - t r a d i t i o n a l           d u t c h - b e l g i a n           e n g l i s h - a m e r i c a n         e n g l i s h - a u s       e n g l i s h - b e l i z e         e n g l i s h - c a n       e n g l i s h - c a r i b b e a n           e n g l i s h - i r e       e n g l i s h - j a m a i c a           e n g l i s h - n z         e n g l i s h - s o u t h   a f r i c a             e n g l i s h - t r i n i d a d   y   t o b a g o               e n g l i s h - u k         e n g l i s h - u s         e n g l i s h - u s a       f r e n c h - b e l g i a n         f r e n c h - c a n a d i a n           f r e n c h - l u x e m b o u r g           f r e n c h - s w i s s         g e r m a n - a u s t r i a n           g e r m a n - l i c h t e n s t e i n           g e r m a n - l u x e m b o u r g           g e r m a n - s w i s s         i r i s h - e n g l i s h           i t a l i a n - s w i s s           n o r w e g i a n       n o r w e g i a n - b o k m a l         n o r w e g i a n - n y n o r s k           p o r t u g u e s e - b r a z i l i a n             s p a n i s h - a r g e n t i n a           s p a n i s h - b o l i v i a           s p a n i s h - c h i l e           s p a n i s h - c o l o m b i a         s p a n i s h - c o s t a   r i c a             s p a n i s h - d o m i n i c a n   r e p u b l i c             s p a n i s h - e c u a d o r           s p a n i s h - e l   s a l v a d o r           s p a n i s h - g u a t e m a l a           s p a n i s h - h o n d u r a s         s p a n i s h - m e x i c a n           s p a n i s h - m o d e r n         s p a n i s h - n i c a r a g u a           s p a n i s h - p a n a m a         s p a n i s h - p a r a g u a y         s p a n i s h - p e r u         s p a n i s h - p u e r t o   r i c o           s p a n i s h - u r u g u a y           s p a n i s h - v e n e z u e l a           s w e d i s h - f i n l a n d           s w i s s       u k     u s     u s a       a m e r i c a       b r i t a i n       c h i n a       c z e c h       e n g l a n d       g r e a t   b r i t a i n           h o l l a n d       h o n g - k o n g       n e w - z e a l a n d       n z     p r   c h i n a         p r - c h i n a         p u e r t o - r i c o       s l o v a k     s o u t h   a f r i c a         s o u t h   k o r e a       s o u t h - a f r i c a         s o u t h - k o r e a       t r i n i d a d   &   t o b a g o           u n i t e d - k i n g d o m         u n i t e d - s t a t e s           u t f 8     A C P       u t f - 8       O C P       6-                       ?     ?BB       xPD?X1=                      ?      ?                      0C      0C                      Η5@=)d	U5j%5j?~@5wzA.lzZ?                                                                         $   ,   <   D   L   T	   \
   d   l   t   |                           Ć   ̆   Ԇ   ܆                   !   "   y#   $   $%   ,&   4'   <)   D*   L+   T,   \-   d/   l6   t7   |8   9   >   ?   @   A   C   D   F   ćG   ̇I   ԇJ   ܇K   N   O   P   V   W   Z   e   $     0  @  P  j  `  p    	  8        Ј      j  j          0  @  P  `  p           !  Љ"  #  $   %  &   '  0)  @*  P+  `,  p-  /  2  4  5  ̊6  ܊7  8  9  :  ;  ,>  <?  L@  \A  lC  |D  E  F  G  ȋI  ؋J  K  L  N  O  (P  8R  HV  XW  hZ  xe  k  l      Ȍ  j  ،	  
        (  8  H  X  t,  ;  >  C  k  ܍      	  
  ,  <  L;  hk  x      	  
  Ȏ  ؎  ;        (	  8
  H  X  h;    	  
    ď  ԏ;     	  
     0;  L   \	   l
   |;   $  	$  
$  ;$  ̐(  ܐ	(  
(  ,  	,  
,  ,0  <	0  L
0  \4  l	4  |
4  8  
8  <  
<  ̑@  ܑ
@  
D  
H  
L  
P  ,|  <|  L                                                                                                                                                                                                                                                                                                                                                                            a r     b g     c a     z h - C H S     c s     d a     d e     e l     e n     e s     f i     f r     h e     h u     i s     i t     j a     k o     n l     n o     p l     p t     r o     r u     h r     s k     s q     s v     t h     t r     u r     i d     b e     s l     e t     l v     l t     f a     v i     h y     a z     e u     m k     a f     k a     f o     h i     m s     k k     k y     s w     u z     t t     p a     g u     t a     t e     k n     m r     s a     m n     g l     k o k       s y r       d i v       a r - S A       b g - B G       c a - E S       c s - C Z       d a - D K       d e - D E       e l - G R       f i - F I       f r - F R       h e - I L       h u - H U       i s - I S       i t - I T       n l - N L       n b - N O       p l - P L       p t - B R       r o - R O       r u - R U       h r - H R       s k - S K       s q - A L       s v - S E       t h - T H       t r - T R       u r - P K       i d - I D       u k - U A       b e - B Y       s l - S I       e t - E E       l v - L V       l t - L T       f a - I R       v i - V N       h y - A M       a z - A Z - L a t n         e u - E S       m k - M K       t n - Z A       x h - Z A       z u - Z A       a f - Z A       k a - G E       f o - F O       h i - I N       m t - M T       s e - N O       m s - M Y       k k - K Z       k y - K G       s w - K E       u z - U Z - L a t n         t t - R U       b n - I N       p a - I N       g u - I N       t a - I N       t e - I N       k n - I N       m l - I N       m r - I N       s a - I N       m n - M N       c y - G B       g l - E S       k o k - I N     s y r - S Y     d i v - M V     q u z - B O     n s - Z A       m i - N Z       a r - I Q       d e - C H       e n - G B       e s - M X       f r - B E       i t - C H       n l - B E       n n - N O       p t - P T       s r - S P - L a t n         s v - F I       a z - A Z - C y r l         s e - S E       m s - B N       u z - U Z - C y r l         q u z - E C     a r - E G       z h - H K       d e - A T       e n - A U       e s - E S       f r - C A       s r - S P - C y r l         s e - F I       q u z - P E     a r - L Y       z h - S G       d e - L U       e n - C A       e s - G T       f r - C H       h r - B A       s m j - N O     a r - D Z       z h - M O       d e - L I       e n - N Z       e s - C R       f r - L U       b s - B A - L a t n         s m j - S E     a r - M A       e n - I E       e s - P A       f r - M C       s r - B A - L a t n         s m a - N O     a r - T N       e n - Z A       e s - D O       s r - B A - C y r l         s m a - S E     a r - O M       e n - J M       e s - V E       s m s - F I     a r - Y E       e n - C B       e s - C O       s m n - F I     a r - S Y       e n - B Z       e s - P E       a r - J O       e n - T T       e s - A R       a r - L B       e n - Z W       e s - E C       a r - K W       e n - P H       e s - C L       a r - A E       e s - U Y       a r - B H       e s - P Y       a r - Q A       e s - B O       e s - S V       e s - H N       e s - N I       e s - P R       z h - C H T     s r         B   t,   q                $   4   D   T   d   t            C   ě   ԛ      \)      k   !   ,c      <D   L}   \   $   xE   <   G      D   H   L      Ȝ   ؜I         $A      T   J   \   (   8   H   X   h   x               ȝK   ؝      d	            (   8   H   X   h   x               Ȟ   ؞               ,#   (e   d*   8l   D&   Hh   l
   XL   .   hs   t   x         M      ȟ   >   ؟   ̇7      |   N   /   t   ܆      (Z      8O   T(   Hj      Xa      hP      x   Q      R   |-   r   1   x   :   Ƞ      ?   ؠ   S   2   y   <%   g   4$   f   (   l+   8m   H   =   X   ;   h   0   x   w   u   U         ȡT   ء         ć6   ~      V   Ć   W   (   8   H   X   ̆   hX   Ԇ   xY   <         v         Ȣ[   $"   آd               (   8      H\   L   X   t            ȣ   أ]   3   z   @      ԇ8      ܇9         (^   8n      H_   5   X|   y    hb      x`   4      {   L'   i   Фo                    0   @F   Pp                                                                                                                                                                                                                                                                                                                                                                               a f - z a       a r - a e       a r - b h       a r - d z       a r - e g       a r - i q       a r - j o       a r - k w       a r - l b       a r - l y       a r - m a       a r - o m       a r - q a       a r - s a       a r - s y       a r - t n       a r - y e       a z - a z - c y r l         a z - a z - l a t n         b e - b y       b g - b g       b n - i n       b s - b a - l a t n         c a - e s       c s - c z       c y - g b       d a - d k       d e - a t       d e - c h       d e - d e       d e - l i       d e - l u       d i v - m v     e l - g r       e n - a u       e n - b z       e n - c a       e n - c b       e n - g b       e n - i e       e n - j m       e n - n z       e n - p h       e n - t t       e n - u s       e n - z a       e n - z w       e s - a r       e s - b o       e s - c l       e s - c o       e s - c r       e s - d o       e s - e c       e s - e s       e s - g t       e s - h n       e s - m x       e s - n i       e s - p a       e s - p e       e s - p r       e s - p y       e s - s v       e s - u y       e s - v e       e t - e e       e u - e s       f a - i r       f i - f i       f o - f o       f r - b e       f r - c a       f r - c h       f r - f r       f r - l u       f r - m c       g l - e s       g u - i n       h e - i l       h i - i n       h r - b a       h r - h r       h u - h u       h y - a m       i d - i d       i s - i s       i t - c h       i t - i t       j a - j p       k a - g e       k k - k z       k n - i n       k o k - i n     k o - k r       k y - k g       l t - l t       l v - l v       m i - n z       m k - m k       m l - i n       m n - m n       m r - i n       m s - b n       m s - m y       m t - m t       n b - n o       n l - b e       n l - n l       n n - n o       n s - z a       p a - i n       p l - p l       p t - b r       p t - p t       q u z - b o     q u z - e c     q u z - p e     r o - r o       r u - r u       s a - i n       s e - f i       s e - n o       s e - s e       s k - s k       s l - s i       s m a - n o     s m a - s e     s m j - n o     s m j - s e     s m n - f i     s m s - f i     s q - a l       s r - b a - c y r l         s r - b a - l a t n         s r - s p - c y r l         s r - s p - l a t n         s v - f i       s v - s e       s w - k e       s y r - s y     t a - i n       t e - i n       t h - t h       t n - z a       t r - t r       t t - r u       u k - u a       u r - p k       u z - u z - c y r l         u z - u z - l a t n         v i - v n       x h - z a       z h - c h s     z h - c h t     z h - c n       z h - h k       z h - m o       z h - s g       z h - t w       z u - z a          :   Y   w                 /  M  l                 ;   Z   x                 0  N  m              C O N O U T $        K E R N E L 3 2 . D L L                                                                            (0h                                                                                                               T                                            .rb       j         .rb                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    =                       =            @                       <                       <           @                        >T               h    t     >           @   T                    =               İ    а    =           @                       X=                    0а    X=           @                       =l                   а    =           @   l                    =̱                   а    =           @   ̱                    0=,               @    L    0=           @   ,                    =                   L    =           @                       L>                   L    L>           @                       @@H               \    d    @@            @   H                    d@                  ȳd4    d@           @           @           @                     $    d4    @           @   X                   l    t    @            @   X                    @                p>ȴ               ܴ        p>           @   ȴ                    >(               <    H    >           @   (                    @                  d4    @           @                       A                  d4    A           @                       (AL              `    |d4        (A           @   L                    PA              ̶    d4    PA           @                       A              0    Dd4    A           @                       B                  d4    B           @                       DB                  d4        DB           @                      L    T    xB            @   8                    B                   T    B           @                       C                    T    C           @                      D    L    \C            @   0                    >                   L    >           @                       >                   L    >           @                       CL               `    lL    C           @   L                    C                  غd4        C           @                       C              (    Dd4        C           @                        D                  d4         D           @                       DD                   d4        DD           @                       hDX              l    d4    hD           @   X                    D              м    d4    D           @                       D               4    Hd4    D           @                        D                  d4    D           @                       @E                  d4    @E           @                       EL              `    td4    E           @   L                    E              ľ    ؾd4    E           @                       E              (    Dd4        E           @                        F                  d4     F           @                       F                  d4    F           @                       FH              \    |d4        F           @   H         G           @                         d4                    HG                   @d4        HG           @                       xG|                  Hd4        xG           @   |                    G                  d4    G           @                        G                HHd              x    d4    HH           @   d                    H                  d4    H           @                       I,              @    Td4    I           @   ,                    <I                  d4    <I           @                       `I                  $d4        `I           @                       I`              t    d4    I           @   `                    I                  d4    I           @                       TJ(              <    \d4        TJ           @   (        J           @                         d4                    J                    d4        J           @                       J\              p    Hd4        J           @   \                    8K                  d4    8K           @                       J                KD              X    ld4    K           @   D                    K                  d4        K           @                       K              (    <d4    K           @                       PLx                  d4    PL           @   x                    L                  4d4        L           @           L           @   X                  l    4d4                    M                  4d4        M           @                       0M              $    @Hd4        0M           @                       M|                  d4    M           @   |                    LX                M                       M            @                       NP               d    l    N            @   P                    4N                   l    4N           @                       PN                   $l    PN           @                       lN`               t    l    lN           @   `                    N                   l    N           @                       N               ,    8l    N           @                       ?t                       ?           @   t                                                                                                                                                                                                                                                                                                                                                                                                                                                         i  I   
 
 
 8     ? f    J   ]   3 o     $ U    Y   ]    : ^   - x   ? }   7 u   / m   ' e    ]    U    ; b      : ^     ? s   j   ]     X      ! @! ! ! c" " 
# D# ~# # $ w$ $ -% n% % % e& & 9' ' ' ' C( [) * + S+ + + 	, =, , , s- - 4. X. . 5/ x/ / / / 0 V0 0 0 1 Z1 1 1 2 ^2 2 3 I3 3 3 4 M4 4 4 +5 _5 5 5 5 /6 c6 6 6 57 7 7 8 M8 8 8 9 ]9 9 9 9: d: : : %; c; ; ; < [< < < < ;= = = = W> > ? X? ? @ A @A A B aB B B C KC C C D ID D D D &E ^E                                                                                                                                                                                                                                                                                                                                                                                                                                                     RSDSD6H4-Z^8   C:\Users\Stephen\dev\js\v8\node_modules\msnodesqlv8\build\Release\sqlserverv8.pdb       5  5                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           <           X         =           SN         0=           H         \'            Pp                    p        X=           ?         =           2         pr     P       dp        =                    =            p        =           J>                     p        =           m         +v     (       p        H     L       \p         >           H         X            p        L>           j     
"                              s
    {
"                                  
"   0                           >^ "   `                           >^ "                              >^     "                                  >^     "                                  "                                   &"   `                           Zb"                                  "
                                                                               "                                   7    >^     P"   t                               "                              "                              "   <                       >^               H"   t                           "                              "                              L"                              "   4                           "   d                               "                                  "                                >^            "   H                       8@   H   >^    P            "   x                               8"                              2"                              r       "                                  "   `                           "                              n    v"                                  #    >^     +"                                      O     T       hPp        p>           3         L            p        >           4     >^     "                                      "                                  "   D                               	W            p        >                    >           .     "                                   "                                   >^ "   0                           >^ "   `                           >^ "                              >^ "                              >^     "                                  >^     "   ,                               >^     "   h                               "                                   "                                                            -   -                                  -   -                      -   -               -                                    "                                                             "-   /-                                  7-   D-                      L-   Y-               a-                                    >^ "   ,                           "   \                           X"                              "                              "                              %"                              >^ 9"   L                                   "                                  2#"                              "                          4>^ 4   4   44        2"   P                           <3"                              }3"                              3"                              @4"                              3"   @                           .(    6("   p                               "                          :&E&   M&   >^    X&        "   $                       ''   !'   >^    ,'            "   T                               #"                              9>^ 9"                                  >^ 8"                                  >^ 8"   @                                  	   "   |                               ,,   ,   ,"                                  H    P"                                  "   P                           D$    Q$   j$Q$"                                  +"                                  "                                  2    ??"   8                               :    >^ "   |                               h    p"                                  F "                              `    h"   $                                "   `                           0"                              0"                              "                          )    )    )    >^     )   >^    *   *   *   5*   N*
   g*   *   *   >^    *                    "                                  .!"                              k7s7"                                   7(7"   L                               "                          .    /    /    /   >^     /   >^    (/            X    `"                                  ."   4                           F+"   d                           "    "   """                                  P    X"                                  0"    ="   V"=""                                      "   h                               f"                              %    %%"                                  0,"                              5"   H                           5"   x                           V6"                              5"                              '"                              @    H"   8                                   "   t                                   "                                      "                                  ""   (                           "   |                       2>^ 2   2   22        1"                              M1"                              1"                              2"   D                           Q2"   t                           1"                              '    '"                                  "   4                       %%   %   >^    %        "                          &&   &   >^    &            "                                  l#"                              88>^ @8"   $                               >^ 7"   h                               >^ 7"                                        "                                  d,l,   t,   |,"   ,                               
    "   x                               "                              #    #   $#"                                  z+"   0                               "   `                                   "                                  9    >^ "                                  *    2"                                   "   X                           "    *"                                   "                              0"                              I0"   $                            "   x                        (    |(    (    >^     (   >^    (   N)   (   (   )
   )   5)   (   >^    (                    "                                   "   D                           66"   t                               66"                                  "                          |.    .    .    .   >^    .   >^    .            >^ "   \                           >^ "                              >^ "                              >^ "                              >^     "                                  >^     "   X                               >^     "                                  "                                       ""                                  "   4                           +"   d                           !    !   !!"                                      "                                  h!    u!   !u!"                                      "   h                               2"                              $    $$"                                  +"                              5"   H                           R5"   x                           "6"                              4"                              x'"                                  
"   8                               \%"   t                           >^ P9"                                  ~    "                                      "                                      >^     "   X                                   >^     "                                      >^      "                                  c    >^     k"   $	                               >^ "   h	                           "   	                                                         gA   tA    	       
           |A   A               A                        =    =="   p
                               }D    >^ "   
                               :    :"   
                               v="   ,                           :    :"   \                               ="                              TB"                              B"                              "   L                       ?    ?    ?    >^     ?   >^    ?   @   	@   "@   ;@
   T@   m@   ?   >^    @                ;    ;"                                  ="                              CC"   H                               CC"                                  "                          A    A    A    A   >^    A   >^    B            N;    V;"   0                               <"   l                           @"                              >    >   >>"                                  ;    ;"                                  $>    1>   J>1>"   T                               ;    ;"                                  <"                              >    >>"                                  3A"   P                           >C"                              
C"                              rC"                              B"                              ?"   @                           <    <"   p                               F?"                              >^ <D"                                  F<    N<"                                              cv                i                p        c                x                    |            D"   (                                       x    /9                        <F    @                                 "                                         &*            "&        ]     l       |p        ?           ;                                                                                     g                I                j	                
                O
                m
                m
            q
r
                p
                ш
                `
            Л
ԛ
                
                
                )
                
                h
                7
                
                
                "
                
                
                
                	                                                        G                                z                                4            18M8                	F    E"   p                                       G                                B                                                                                                                                Z                UX                V    VE"   @                                       s                Z                                Љ                n                                                                                                W                <                Դ            i|                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            b%          X% \% `%   s%   sqlserverv8.node node_register_module_v106                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    l             
   DN@    u                                         8                                    0dYdYdYdYdYdYdYdYdY0hYhYhYhYhYhYhY                0.   .             x                                                                                                                         $                                                                                x                                         2            2            2            2            2                    0        h                                                            14    C                                           


                          ?                          PST                                                                             PDT                                                                         @33                                                                                                                                                                                                                                                                                                                                                            abcdefghijklmnopqrstuvwxyz      ABCDEFGHIJKLMNOPQRSTUVWXYZ                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           abcdefghijklmnopqrstuvwxyz      ABCDEFGHIJKLMNOPQRSTUVWXYZ                                                                                                                                                                                           `y!                       @~      ڣ                              @        ڣ                              A        Ϣ [                       @~    Q  Q^  _j2                   1~                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            .?AU?$default_delete@VResultSet@mssql@@@std@@               .?AVbad_alloc@std@@             .?AVexception@std@@             .?AVruntime_error@std@@             .?AVinvalid_argument@std@@              .?AVlogic_error@std@@           .?AVlength_error@std@@              .?AVout_of_range@std@@              .?AVoverflow_error@std@@            .?AVbad_function_call@std@@             .?AVregex_error@std@@           .?AVbad_array_new_length@std@@              .?AVbad_cast@std@@          .?AVsystem_error@std@@              .?AV_System_error@std@@             .?AVbad_exception@std@@                                                                                                                                                                                                                                                                                     .?AV_Facet_base@std@@           .?AV_Locimp@locale@std@@            .?AVfacet@locale@std@@              .?AU_Crt_new_delete@std@@           .?AVcodecvt_base@std@@              .?AUctype_base@std@@            .?AV?$ctype@D@std@@                 .?AV?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@                           .?AV?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@                       .?AV?$numpunct@D@std@@              .?AV?$codecvt@DDU_Mbstatet@@@std@@              .?AVstl_critical_section_interface@details@Concurrency@@                    .?AVstl_critical_section_vista@details@Concurrency@@                    .?AVstl_critical_section_win7@details@Concurrency@@                 .?AVerror_category@std@@            .?AV_Generic_error_category@std@@               .?AV?$codecvt@_WDU_Mbstatet@@@std@@             .?AV?$codecvt@GDU_Mbstatet@@@std@@              .?AV?$ctype@_W@std@@            .?AV?$ctype@G@std@@             .?AUmessages_base@std@@             .?AUmoney_base@std@@            .?AUtime_base@std@@             .?AV?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@                        .?AV?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@                        .?AV?$numpunct@_W@std@@             .?AV?$collate@_W@std@@              .?AV?$messages@_W@std@@             .?AV?$money_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@                      .?AV?$money_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@                      .?AV?$moneypunct@_W$0A@@std@@               .?AV?$_Mpunct@_W@std@@              .?AV?$moneypunct@_W$00@std@@                .?AV?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@                       .?AV?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@                       .?AV?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@                           .?AV?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@                       .?AV?$numpunct@G@std@@              .?AV?$collate@G@std@@           .?AV?$messages@G@std@@              .?AV?$money_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@                         .?AV?$money_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@                     .?AV?$moneypunct@G$0A@@std@@            .?AV?$_Mpunct@G@std@@           .?AV?$moneypunct@G$00@std@@             .?AV?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@                          .?AV?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@                      .?AV?$collate@D@std@@           .?AV?$messages@D@std@@              .?AV?$money_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@                         .?AV?$money_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@                     .?AV?$moneypunct@D$0A@@std@@            .?AV?$_Mpunct@D@std@@           .?AV?$moneypunct@D$00@std@@             .?AV?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@                          .?AV?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@                      .?AVtype_info@@         .?AVDNameNode@@         .?AVcharNode@@          .?AVpcharNode@@         .?AVpDNameNode@@            .?AVDNameStatusNode@@           .?AVpairNode@@                                                                                                                                                                                                                                                                                                                          v v v v v   z l ^ N B 6 &        ~ l ` V D 4    ~ ~ ~ ~ ~ $w :w Pw dw ~w w w w w  x x .x @x Px `x zx x x x x x x x y 2y Ny jy y y y y y  z z 4z Lz dz zz z z z z z { ${ D{ Z{ f{ v{ { { { { { { | | 6| J| \| r| | | | | | | | "} .} <} J} T} f} v} } } } } } } } ~ ~ (~ 4~ F~ X~ j~ z~ ~ ~                                                                                                                                                    w    o  l    H  =      +          w               K    	                                                                    ts         v  p  v         w r                     v v v v v   z l ^ N B 6 &        ~ l ` V D 4    ~ ~ ~ ~ ~ $w :w Pw dw ~w w w w w  x x .x @x Px `x zx x x x x x x x y 2y Ny jy y y y y y  z z 4z Lz dz zz z z z z z { ${ D{ Z{ f{ v{ { { { { { { | | 6| J| \| r| | | | | | | | "} .} <} J} T} f} v} } } } } } } } ~ ~ (~ 4~ F~ X~ j~ z~ ~ ~                                                                                                                                                    w    o  l    H  =      +          w               K    	                                                                    FreeLibrary GetProcAddress  LoadLibraryW  }Sleep xGetModuleHandleW  KERNEL32.dll   SQLCancelHandle ODBC32.dll  WideCharToMultiByte MultiByteToWideChar dInitializeSRWLock ReleaseSRWLockExclusive   AcquireSRWLockExclusive 1EnterCriticalSection  LeaveCriticalSection  `InitializeCriticalSectionEx TryEnterCriticalSection DeleteCriticalSection GetCurrentThreadId  FormatMessageA  -EncodePointer 	DecodePointer MQueryPerformanceCounter NQueryPerformanceFrequency  SetFileInformationByHandle  FlsAlloc  FlsGetValue FlsSetValue FlsFree YInitOnceExecuteOnce [InitializeConditionVariable WakeConditionVariable WakeAllConditionVariable  ~SleepConditionVariableCS  SleepConditionVariableSRW  CreateEventExW   CreateSemaphoreExW  FlushProcessWriteBuffers  GetCurrentProcessorNumber GetSystemTimeAsFileTime GetTickCount64  FreeLibraryWhenCallbackReturns   CreateThreadpoolWork  SubmitThreadpoolWork   CloseThreadpoolWork  CreateThreadpoolTimer gSetThreadpoolTimer  WaitForThreadpoolTimerCallbacks  CloseThreadpoolTimer   CreateThreadpoolWait  iSetThreadpoolWait  CloseThreadpoolWait HGetFileInformationByHandleEx   CreateSymbolicLinkW LocalFree LCMapStringEx dGetLocaleInfoEx GetStringTypeW   CompareStringEx GetCPInfo UnhandledExceptionFilter  mSetUnhandledExceptionFilter GetCurrentProcess TerminateProcess  IsProcessorFeaturePresent IsDebuggerPresent GetStartupInfoW GetCurrentProcessId cInitializeSListHead oInterlockedPushEntrySList lInterlockedFlushSList bRaiseException  RtlUnwind aGetLastError  2SetLastError  _InitializeCriticalSectionAndSpinCount TlsAlloc  TlsGetValue TlsSetValue TlsFree LoadLibraryExW  GetStdHandle  NGetFileType tGetModuleFileNameW  wGetModuleHandleExW  WriteConsoleW ^ExitProcess GetCurrentThread  WriteFile OutputDebugStringW  SetConsoleCtrlHandler IHeapFree  EHeapAlloc !GetDateFormatW  GetTimeFormatW   CompareStringW  LCMapStringW  eGetLocaleInfoW  IsValidLocale GetUserDefaultLCID  TEnumSystemLocalesW  LHeapReAlloc LGetFileSizeEx #SetFilePointerEx  GetTimeZoneInformation  uFindClose {FindFirstFileExW  FindNextFileW IsValidCodePage GetACP  GetOEMCP  GetCommandLineA GetCommandLineW 7GetEnvironmentStringsW  FreeEnvironmentStringsW SetEnvironmentVariableW GetProcessHeap  FlushFileBuffers  GetConsoleCP  GetConsoleMode  JSetStdHandle  NHeapSize  sReadFile  pReadConsoleW   CloseHandle  CreateFileW GetSystemInfo VirtualProtect  VirtualQuery  LoadLibraryExA                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        P  @                                          ؓ    * F     v     b  V      @ ^ |   
 ^   \   $ l    L  ̜  N   ҝ 8    2 j   D r   B  ġ  <    &  t ؤ * |  0  Ħ *    ,   L ^  Щ `                                                                                                                 צ8(8HXhxȧا(8HXhxȨب(8HXhxȩة(8HXhxȪت(8HXhxȫث(H                                                                                                                  ?ToLocalEmpty@api_internal@v8@@YAXXZ    ??0HandleScope@v8@@QAE@PAVIsolate@1@@Z    ??1HandleScope@v8@@QAE@XZ   ?CreateHandle@HandleScope@v8@@KAPAIPAVIsolate@internal@2@I@Z    ??0EscapableHandleScope@v8@@QAE@PAVIsolate@1@@Z   ?Escape@EscapableHandleScope@v8@@AAEPAIPAI@Z    ?DisposeGlobal@api_internal@v8@@YAXPAI@Z    ?NewFromUtf8@String@v8@@SA?AV?$MaybeLocal@VString@v8@@@2@PAVIsolate@2@PBDW4NewStringType@2@H@Z    ?Global@Context@v8@@QAE?AV?$Local@VObject@v8@@@2@XZ   ?Error@Exception@v8@@SA?AV?$Local@VValue@v8@@@2@V?$Local@VString@v8@@@2@@Z    ?GetCurrent@Isolate@v8@@SAPAV12@XZ    ?GetCurrentContext@Isolate@v8@@QAE?AV?$Local@VContext@v8@@@2@XZ   ?MakeCallback@node@@YA?AV?$MaybeLocal@VValue@v8@@@v8@@PAVIsolate@3@V?$Local@VObject@v8@@@3@V?$Local@VFunction@v8@@@3@HPAV?$Local@VValue@v8@@@3@Uasync_context@1@@Z    ?Encode@node@@YA?AV?$Local@VValue@v8@@@v8@@PAVIsolate@3@PBDIW4encoding@1@@Z   ?Encode@node@@YA?AV?$Local@VValue@v8@@@v8@@PAVIsolate@3@PBGI@Z    ?Copy@Buffer@node@@YA?AV?$MaybeLocal@VObject@v8@@@v8@@PAVIsolate@4@PBDI@Z   ?IsArray@Value@v8@@QBE_NXZ    ?IsObject@Value@v8@@QBE_NXZ   ?IsBoolean@Value@v8@@QBE_NXZ    ?IsNumber@Value@v8@@QBE_NXZ   ?IsInt32@Value@v8@@QBE_NXZ    ?IsUint32@Value@v8@@QBE_NXZ   ?IsDate@Value@v8@@QBE_NXZ   ?ToNumber@Value@v8@@QBE?AV?$MaybeLocal@VNumber@v8@@@2@V?$Local@VContext@v8@@@2@@Z   ?ToString@Value@v8@@QBE?AV?$MaybeLocal@VString@v8@@@2@V?$Local@VContext@v8@@@2@@Z   ?ToObject@Value@v8@@QBE?AV?$MaybeLocal@VObject@v8@@@2@V?$Local@VContext@v8@@@2@@Z   ?ToInteger@Value@v8@@QBE?AV?$MaybeLocal@VInteger@v8@@@2@V?$Local@VContext@v8@@@2@@Z   ?ToUint32@Value@v8@@QBE?AV?$MaybeLocal@VUint32@v8@@@2@V?$Local@VContext@v8@@@2@@Z   ?ToInt32@Value@v8@@QBE?AV?$MaybeLocal@VInt32@v8@@@2@V?$Local@VContext@v8@@@2@@Z   ?ToBoolean@Value@v8@@QBE?AV?$Local@VBoolean@v8@@@2@PAVIsolate@2@@Z    ?BooleanValue@Value@v8@@QBE_NPAVIsolate@2@@Z    ?NumberValue@Value@v8@@QBE?AV?$Maybe@N@2@V?$Local@VContext@v8@@@2@@Z    ?IntegerValue@Value@v8@@QBE?AV?$Maybe@_J@2@V?$Local@VContext@v8@@@2@@Z    ?Int32Value@Value@v8@@QBE?AV?$Maybe@H@2@V?$Local@VContext@v8@@@2@@Z   ?Length@String@v8@@QBEHXZ   ?WriteUtf8@String@v8@@QBEHPAVIsolate@2@PADHPAHH@Z   ?NewFromTwoByte@String@v8@@SA?AV?$MaybeLocal@VString@v8@@@2@PAVIsolate@2@PBGW4NewStringType@2@H@Z   ?Value@Number@v8@@QBENXZ    ?New@Number@v8@@SA?AV?$Local@VNumber@v8@@@2@PAVIsolate@2@N@Z    ?New@Integer@v8@@SA?AV?$Local@VInteger@v8@@@2@PAVIsolate@2@H@Z    ?NewFromUnsigned@Integer@v8@@SA?AV?$Local@VInteger@v8@@@2@PAVIsolate@2@I@Z    ?Value@Int32@v8@@QBEHXZ   ?Value@Uint32@v8@@QBEIXZ    ?Get@Object@v8@@QAE?AV?$MaybeLocal@VValue@v8@@@2@V?$Local@VContext@v8@@@2@V?$Local@VValue@v8@@@2@@Z   ?Get@Object@v8@@QAE?AV?$MaybeLocal@VValue@v8@@@2@V?$Local@VContext@v8@@@2@I@Z   ?Length@Array@v8@@QBEIXZ    ?DecodeWrite@node@@YAHPAVIsolate@v8@@PADIV?$Local@VValue@v8@@@3@W4encoding@1@@Z   ?HasInstance@Buffer@node@@YA_NV?$Local@VValue@v8@@@v8@@@Z   ?Data@Buffer@node@@YAPADV?$Local@VObject@v8@@@v8@@@Z    ?Length@Buffer@node@@YAIV?$Local@VObject@v8@@@v8@@@Z    ?Set@Object@v8@@QAE?AV?$Maybe@_N@2@V?$Local@VContext@v8@@@2@IV?$Local@VValue@v8@@@2@@Z    ?IsolateFromNeverReadOnlySpaceObject@internal@v8@@YAPAVIsolate@12@I@Z   ?CanHaveInternalField@internal@v8@@YA_NH@Z    ?ClearWeak@api_internal@v8@@YAPAXPAI@Z    ?GlobalizeReference@api_internal@v8@@YAPAIPAVIsolate@internal@2@PAI@Z   ?MakeWeak@api_internal@v8@@YAXPAIPAXP6AXABV?$WeakCallbackInfo@X@2@@ZW4WeakCallbackType@2@@Z   ?Set@Object@v8@@QAE?AV?$Maybe@_N@2@V?$Local@VContext@v8@@@2@V?$Local@VValue@v8@@@2@1@Z    ?InternalFieldCount@Object@v8@@QBEHXZ   ?SetInternalField@Object@v8@@QAEXHV?$Local@VValue@v8@@@2@@Z   ?SetAlignedPointerInInternalField@Object@v8@@QAEXHPAX@Z   ?SlowGetInternalField@Object@v8@@AAE?AV?$Local@VValue@v8@@@2@H@Z    ?SlowGetAlignedPointerFromInternalField@Object@v8@@AAEPAXH@Z    ?New@External@v8@@SA?AV?$Local@VExternal@v8@@@2@PAVIsolate@2@PAX@Z    ?Value@External@v8@@QBEPAXXZ    ?Set@Template@v8@@QAEXV?$Local@VName@v8@@@2@V?$Local@VData@v8@@@2@W4PropertyAttribute@2@@Z    ?New@FunctionTemplate@v8@@SA?AV?$Local@VFunctionTemplate@v8@@@2@PAVIsolate@2@P6AXABV?$FunctionCallbackInfo@VValue@v8@@@2@@ZV?$Local@VValue@v8@@@2@V?$Local@VSignature@v8@@@2@HW4ConstructorBehavior@2@W4SideEffectType@2@PBVCFunction@2@GGG@Z   ?GetFunction@FunctionTemplate@v8@@QAE?AV?$MaybeLocal@VFunction@v8@@@2@V?$Local@VContext@v8@@@2@@Z   ?InstanceTemplate@FunctionTemplate@v8@@QAE?AV?$Local@VObjectTemplate@v8@@@2@XZ    ?PrototypeTemplate@FunctionTemplate@v8@@QAE?AV?$Local@VObjectTemplate@v8@@@2@XZ   ?SetClassName@FunctionTemplate@v8@@QAEXV?$Local@VString@v8@@@2@@Z   ?New@ObjectTemplate@v8@@SA?AV?$Local@VObjectTemplate@v8@@@2@PAVIsolate@2@V?$Local@VFunctionTemplate@v8@@@2@@Z   ?NewInstance@ObjectTemplate@v8@@QAE?AV?$MaybeLocal@VObject@v8@@@2@V?$Local@VContext@v8@@@2@@Z   ?SetInternalFieldCount@ObjectTemplate@v8@@QAEXH@Z   ?New@Signature@v8@@SA?AV?$Local@VSignature@v8@@@2@PAVIsolate@2@V?$Local@VFunctionTemplate@v8@@@2@@Z   ?NewInstance@Function@v8@@QBE?AV?$MaybeLocal@VObject@v8@@@2@V?$Local@VContext@v8@@@2@HQAV?$Local@VValue@v8@@@2@@Z   uv_queue_work   ?GetCurrentEventLoop@node@@YAPAUuv_loop_s@@PAVIsolate@v8@@@Z    ?New@Object@v8@@SA?AV?$Local@VObject@v8@@@2@PAVIsolate@2@@Z   ?Call@Function@v8@@QAE?AV?$MaybeLocal@VValue@v8@@@2@V?$Local@VContext@v8@@@2@V?$Local@VValue@v8@@@2@HQAV52@@Z   ?EmitAsyncInit@node@@YA?AUasync_context@1@PAVIsolate@v8@@V?$Local@VObject@v8@@@4@V?$Local@VString@v8@@@4@N@Z    ?EmitAsyncDestroy@node@@YAXPAVIsolate@v8@@Uasync_context@1@@Z   uv_default_loop   ?Clone@Object@v8@@QAE?AV?$Local@VObject@v8@@@2@XZ   ?New@Array@v8@@SA?AV?$Local@VArray@v8@@@2@PAVIsolate@2@H@Z    ?New@Date@v8@@SA?AV?$MaybeLocal@VValue@v8@@@2@V?$Local@VContext@v8@@@2@N@Z    ?ThrowException@Isolate@v8@@QAE?AV?$Local@VValue@v8@@@2@V32@@Z    ?New@Buffer@node@@YA?AV?$MaybeLocal@VObject@v8@@@v8@@PAVIsolate@4@I@Z                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         CT CT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               0                 	  H   p }                                                                                                                                                                                                                                                                                                  <?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      \   Q0W0s0}000000000000000111!1'111;1E1O1Y1c1m1w11111122(272A2R2      ?   0 x   922S4[4566"626B6R6b6r6666666688888*9Z9999:J:z:::
;:;j;;<<<=J=z===
>:>j>>>>*?Z?? @ <   1>2c2s22222222233A4Q4a4q444=i>y>>/?=? P X   T1122-233344456Z6o6667+7t7777K8g8	99g9|999":7:::;;$>?   ` H   23 3E377!7V7d77777'8p888888)9799999 :I:h:m::: p P   7T8z8889)969G9\99999X:c:p:|::::	;;:;_;;U<=====d>>?       41Z102R2^223k3y333333344G4S4444444+585E5T5y5555555+686E6T6`6l6v6666666+787E7T7`7p7777777+888E8T8`8l8v8>     0}2468:=d?     m3345$585@5F5K5Y5s555567707?7Z7_77777828B8R8b8r888888888r999::J;z;;;
<:<j<<<<*=Z====z>>>
?:?{???    H   0000000011)111122!234=======>>!>1>A>    x   $5C5K5W5j555566(6>66677c7v88888888899':H:U:b:r:~::::0;<=,>9>F>V>b>n>x>G?c???????       00^1f11]2|22222223Y3f3s3333333,5556o6666666667)7B77778-8N8[88[:::::::;(;5;D;i;<=S=`=m=}=======>>>>A?K?????     000(0c0p0}0001;2P2^2223"393G3w33F4N4445A5N5^5j5v55555555 6667.7D777/8888888 939M9T;;;<<=L=Y=f=v======>>>*>4><>p>?     >0F0v0m111111222i2v222222224444555566"6.686666666667808U8b8q8}88888899!959B99+=;=O=\=k=w====+>d>q>~>>>>>>??%?1?A?K?Q?^?v????      001111222[2h2u22222233"4/4B4N4Z44444455Y5566 777(747A77g88w999	::&:2:>:K:Z:g:v::::::::	;$;);V;[;r;};;<<=5=B=V=b=n=======>>/>F>W>i>>>>>>>>6?    p   U1383E3T3`3l3y33445G5T5[5'6l6y666666677 7,72787g7n7#88'9O9\9o9{999999::M:<<$<$=     (   367y=??/?F?S?c?o?{????? 0    00<0S0n000001111111222)262C2S2_2k2w2C3b3o3|3333333444%444444555+585G5S5_5e5w555666H6Z6l6~666667F7X7j7|77777
8O8W8l8888889 9<<@?D?H?L?P?T?X?\?`?d?h? @ T   8)8N8d8z8889r9999::.:::F:P:k:::::::i;u;;;;;;<*<<<< = P @   2399:3:Q:o:|::::::;)<<<===9>>>	???? `    00T1i1122233533334!474M4c45 5E5[5q5546@6e6{666667777788 9%999Z:b::;;;;)<y<<#=5=A=R=t=====>> >*>q>}>>>>> ???? p    	0F00011/2;2L222222222=3p333344%444445o556G666F77(88999:E:\:i:x:::::;<<I<<h=p==!>>>>??????????????????       000045]:<T>>>?     4J4z4q555566&626>6H66666
77&727>7H7N7[7h7x777779.9?9V9c9s99999999:):8:D:P:\:i:v:::::g;F=R=d=q==========>>C>[>>>>>>>> ???.?:?F?P??      K1X1e1v11B22b33344"4-424P4g4465X5c5t555556#6466666
77-777?7T7e7~777 888-8V8f8t8888899%9/969;9K9P9`9e9u9z9999999999999::#:(:;:@:P:U:e:j::::::
;;(;.;<.<C<R<n<}<<<<<<<<=(=V==$>*>;>V>d>>>>>?	??#?3?K?X?`?    |   00$0F0S0e0000000-121Q1V1l1q111111(2-2;2@2N2S2a2f2w2|22222222222222333(3-3;3@39999       22b3r344<==    P   05{66666677%747i7777888889V:c:l:x:<<<==2==>>j??  <   W1o11M5U5\5c5m5667)77788;r;;;
<=J>>??    H   n011152m2{222X3^3g3333	4@45U55*66J7=8899::,;d;        M0r0004:     44;4I4]4j4y44444455"5C5Q5f5555556+656}677	888(8F8r88888:#:A:R:^:n:8;C;a;;;-<T<m<<%=[=a==>->A>G>e>|>>>>>>> ??!?'?H?_?o????????   h   0060K0f00000001E1U1i1o11111111
212A2U2b2|2222223337&848[89:::;P<\<   0 (   1	7(77778h8888n9}9(;>? @ d   0011"121B1R1b1k45J9z999
:::j:::F<<<<<==f=r=====	>>$>0>:>>>>?T???   P    ;4!515t6&:   ` D   1@2E222p555555 6	6d8D:2=9=>>>>> ???????   p L   0111111111111y34445555
66,666o6|666669E=    $   0/00224459:;p==    0   &0W04B4688999 9$9(9,9094989<9=d?  <   
060A0K0Z0`0000D2d577$8/8:&::<<&=4=>>\?f?  <   0052C22244+5U5$777Z8g89<:J:::;t<<<<       7B>*?       7>>>?'???     50R00&1_;d;u;|;r>>  l   V055555555T6l66)7/7C7J7P7U7d777$88888888d9w9999:6:::;);8<Q<p<z<<>>y??     x   -0011-233434j444	55 6@6[6v6667767Z78&9+9C9J9P9U9d99:M;q;;;;&<r<<<<=!=o===>>>(?F??       j0000:14W4a4$9?   $   01333$555D7_778$:   0 P   m0000Q133333g444555-5C555555555I6]6n66666>>> @    11111122/2<2L2X2d2n2t2222223=4$6,6c6y667+7]777788"8:8F8R8\8a8888	999v::::::U;;[<i<}<<<<<<   P `   33N5U5]5g5q5{555555555556666=77 8p8t8x8|888:::;;&;==>>D>I>   ` d   >0F0u0}000001'1W12233)373o3w333334h6p666666757O7~77)<d<o<<<<<<<='= p D   }112343H3P3V3[3i3333345%56w66666677H7M7m77  0   d0003d455)595566(6T6;l=y=T>>    t   M1q1a2r2y2233Q3V3h3t3333334414>4Y4h4x44444&535@5X5g5s5}556Z666666	7B79h99====>4>    3D55666666666667	777$7)74797D7I7T7Y7d7i7t7y777777777777777778	888$8)84898D8I8T8Y8d8i8t8y888888888888888889	999$9)94999D9I9T9Y9d9i9t9y99999999999999999:	:::$:):4:9:D:I:T:Y:d:i:t:y:::::::::::::::::;	;;;$;);4;9;D;I;T;Y;d;i;t;y;;;;;;;;;;;;;;;;;<	<<<$<)<4<9<D<I<T<Z<`<f<l<r<x<~<<<<<<<<<<<<<<<<<<<<<
=(=.=I=f=z===>1>V>x>>>>?+?M?r????     060K0`0u00000001F1~111&2^222	3333#3*31383?3F3M3T3[3b3i3p3w333333333333333334E4m44445$515C5K5[5555566%656M6U6e6w66667/7>78z99:::N;a;;<<8<M<f<<<<====>#>8>E>N>S>f>>>A?i??  `   00%040s0000124G4;;;; <B<W<\<<<*=q=}===3>R>c>>>> ??!???E?a?????    H   H0O0l00001 123<3f3345L556M666"7	888888::<<}>  8   f00111245689:9A9L9:==H>>>> ????  P   0%0,00h1112'2}22222!3S3p33344536r66677&9]9t9:;<>?   l   u0r1o22A36W66667u88979t999:::: ;;);U;e;r;;;;;;;<<<<=====>a>?>???    p   00*00171K1111223334E4`4|444444D8a8h8888!9/99999::):1:7:E:M::::::c>??     $   042d2344*6i77899L:: 0 h   Y9n9s999:(:-::::::;;E;;;;;;A<V<[<<<<==i=s====#>->o>>>>>)?>?C?????? @    Q0[000011W1l1q1112&2+22222293C333333?4T4Y444455g5q5555!6+6m66666'7<7A777777O8Y8888	99U9j9o999:$:):}:::::7;A;;;;;;=<`<<<L=[==5>y>>>?(???   P     0k0w001T1111222Q2p2222383h3333334>4^444445D55555566s666666667 7'7.757<7C7M7X7h7s777777777777788&818D8P8d8p8888g?v????   ` X   00111\111111 2/2Y2h22223>3M3w333333z4446Y74:v::Z;==>G>!?   p p   1Y22<334l444@5556G666
7K7778O888859999.:<::::&;g;;;*<k<<<.===>`>>n???    0   E000z1111D3-55791::::;=>    (   Z0Z2233!357&89; <j<o<z<_>  8   112	5|55
66&7n77`88888:+=e===={?    @   1{223p34(5556P78w8|899;I<<===>>>0??    0   1355Z6_667{9,:::;;<<<==>    ,   93n33568F9f9x9:Q:s::;W;<<M?     :022203Y3m33334&4\44445G5[5z555556+6Z6y666	707c77*9E9q9999	::P::::;A;f;;;;;<><L<f<<<<<=@====>    0   *010{0000L1Z13Y4B5e555;%<=1=S==   4   C4Q4446666Z7777<;<b<<<<<=>i?  (   y0K1[23456q8\9Y:V;;+<,>?     4   012B4-5*6'7779:A;;<8=S=]=h=>??   0 @   L0A11222_3345855S666,7499::;`;(<w<<=?   @ D   %00111%337P9999::;9;;;<<<<>G>X>>>,??   P P   
0q000\123L4c444F5g556g6w68 8889r9:;b<y<<<\=}==>}>>   ` @   0*0w112C333n5669':N:l:::/;u;;<@<m<<<>J>? p    0/0Y00001:1g1123g333W4444495b55556D6n677?849I9N9999::\:f::::; ;b;w;|;;;<1<6<<<<<<D=N=====>J>_>d>>>?'?w???     0=0g00000"1-1Z1f1t1{1111111111222*3U3|333333O445Z5556^666 7D7777q889r99:O;;; ==D>I>>x?    P   1*22233344
55:;p<<<<=Q=x=====>>R>a>>>>>4?[??    4   0011222$3j999S:%;+<'=o==>f????  8   0a236W7789>:C:K:j;;;;8<}<9=R=Z=>a???  4  $0W0000*1W1~11c333j666+:D:Y:n::;;<<<<<#<)</<4<:<@<E<K<Q<V<\<b<g<m<s<x<~<<<<<<<<<<<<<<<<<<<<<<< ======"=(=.=3=9=?=D=I=P=U=[=a=f=l=r=w=}========================>>>>>!>'>->2>8>>>C>I>O>T>Z>`>e>k>q>v>|>>>>>>>>>g?x??????       
0#0<0O0`0q00000000001%1<1O1Z1k111111
22,272Q2c2t22223.333a4~445?5	799;-<<-=G===>R???       a0000'1b11B2S2223445[5555555555666#656?6667$7J7[7777Y8889\9|99:I:::#;b;;;;;;<#<4<    <  000001	11X1`111122223 4444<55555566-676B6a6f6666666677 7*757\7t7|7&9J9k9t9999999999999999 ::::$:-:2:8:B:L:\:l:|:::::;
;;;;$;+;2;9;@;G;O;W;_;j;o;u;;;;;;; <<<<<<&<-<4<;<B<I<Q<Y<a<l<q<w<<<<<<>=H=Q==>	>D>N>W>`>u>~>>>>>>>>??        k0001;111	2!2>22222253>3]3c3l3{33333333~44445%535677$7(7,707777777;;<<===>>>>f>>>>>>    4   22@3445666*8Z8j99999t:S;d;'>>?      06 0 L   5292=2A2E2I2M2Q2U2Y2]2a2e2i2m2q2u2y2}222222222222229   @    <4@4D4H4L4P4T4X4\4`4d4h4l4p4t4x4|4444444444444444+9999::0:;[;f;;;<<<
=F=[=====A>W>r>>>S??   P l   0%011l222333%3,31363>3D3o33333~46777R8899999::H;T;<<I<i<===>>>???? `    00)000	1u1j22	33=4I5y556R6666:::::::;; ;=;L;s;;;;;;;<+<|<<<<<=%=:=X===>>%>5>`>s>x>>>>>?e?t??   p    00*000012223m333333344/4I4j4444C5{555636\6o6{666727R77777777774888<8@8D8H8L8P8T8l8p8t8x8|88888888::o::::::;3;A;4<<<a===@>F>p>>>>>t???       0!0M0`000H11444	555555556'606}66666(7777
8888	939W99:-:9:::::';J;{;;;;;;<<<<<<==6=========>>k>>>>>?i???     #000001$111222
33-323X33J444566 7p777.88888979Z9i999[::::;I;g;;;;;6<B<j<<<=U=\=j=====>7>8?x?????????       )0<0K0\0h00000000000000023+303_3m34M4]4o444	575M5i5y555555676677/7`7z777778888$:W:e:s::::;;;;<<h<z<<=C===>%>j>|>>>?A?       0000111'2Z22Q3n333333	4414I444495^55555>6S6i666666
7,77778888(898r8888888z999::i:::;;;*<d<<<<<<=====>%>8>=>l>y>>>>?????       10h00041K11Z2t22222 33333333 4+4E4g4s4444b5555>6b6m66607j7777778888A99999::<:G::::;*;8;I;j;~;;;;;;;;z<<<<c=>]>u>>>>>?]?h?r?w?    l   151=1C1I1O1x111122!2-252C2I2R2Z2d222 3C3_3y333334484g4u4{44444445[5j569P;<?     D0b0h00s113467@8E8|8888889J9Q9_9m9t9z99999j;q;;;;	<<<)<.<3<I<N<S<i<n<s<<<<<<<=S={====!>>>H>T>p>>>>>>>>>>	?#?(?-?H?R?l?q?v????????     020M0q000\1h12S2c222233444444555555556
777?8X8~8889_999R::::;o;;;;;$<====$>H>Q>>>>?     `   0L0c000W1n11112f5e9{99994:::@:F:L:R:X:^:d:j:p:v:|::::::::::::::       0<1122 39;=?      13 p D   1'1.13457W8f9== >'>;>P>w>>>>>>?'?<?c?w?????  @   00,0S0i0{00000	11E1[1m1#9)9/959;9A9G9M9S9Y9_9e9       0F1J1N1R1V1Z1^1b1)22222222234#4'4+4/43474;4455555555k677	7777777a8e8i8m8q8u8y8}83999999999:L;P;T;X;\;`;d;h;&<<<<<<<<<=$>(>,>0>4>8><>@>	?????????       |0111111#1'1       T9R<c?    0   a2_5p8x>~>>>>>>>>>>>>>>?        0z112h334V556D7   0	 8   66]7v778z889-9991:N:::`;};;<<<=;= P	 4   $6B6k66666666666668Q9!::;<   `	     4<	=]>r>>>3?M?V?^?   p	    :0011222333333394E4Y4e4q44445)555D5667"7-7h7~7777777778M8888F9R9j9r999!:::;;q;y;;;;;<K<<<<~====T>>>Q?e?}????   	 H   121:1G145355555677788#8*808W8^8889$9;<???   	    1!1O35.7U==w>?   	 \   0686i6q677t7}78!8m9v9 ;;M;V;;;;;E<t=x=|========>>>>>?????? 	     355G5N58^<c<h<<<< 	     4456=6t6{69q;y;;;	?   	    22L2S2]577G7N7:  
    0526:6u6|69   
 L   888889#:A:H;b;q;;;;;;;;<K<e<r<<<<=2==>>>9>Z>?  
 P   00011112A6`666667'7H7d777778"8D8`8888889::1;   0
 @   55646^66c777868`8:9E9::;4<c<<M>Q>U>Y>]>a>e>i> @
    y2w44   P
    2<n<<O>?   `
 4   6X89;;<<6<<<<<<6=Q=\=o=5?K???   p
    U0p0001?1L1[1p1z111111111u22>3E3W3y34	444-4?4}44444555*636l6w67)7.74777778v<<====i>{>>>>>>>>>>?&?X?_????   
    a34v5555666666g7l7v7{7777777777788Z9u9999999:s;p<<<	===>`>d>o>{>>>	???'?-?8?>?L?i?t???? 
 8   70<0p00012313333448
:::,;_;w;;;; 
 0   g888R99</<<=%==>?)?U?g?s???? 
 x   	00*0=0W0001&1@1c1j1111112I2g222223373`3u333333"434C4I4c4444-5;5E5b5h5p5~555556l6z6 
 0   1116678(8288o99::;;;q<?"?   
 p   2&4X5`5~556*6=6w66666666177777?8888899A:J:b:::;<
<<!<R<<<<<<<====8>>> 
    6779::;;   <   41505777A8/9:':;:I:X::::;<<<=k====>    <   
222$2l223J3U3_3n3v3~35"6C66788c99>D>>     0   L092?2Q2\222
4445!57 :8::::< = 0 p   0122'2/2223'33334[444D7r7777	88R8819C9U9
;;<<====$>3>?>N>a>>>>??!?*?U?w?? @   K0P0X0k0p0000112>22R3333484C4P445555555l6666777,7Z7_7e7k7q777777777777	888)8.838I8N8S8i8n8s8888888888888	999)9.939I9N9S9i9n9s9999999999999	:::):.:3:I:N:S:i:n:s:::::::::::::	;;;);.;3;I;N;S;i;n;s;;;;;;;;;;;;;<:<H<T<`<t<<<==N=f=v===='>G>Q>]>s>>>>>>???3?\?a?f??????   P    0K0o0001	1$1.1M1R1W1r11111111112 2^2222223363;3@3[3j3333 4%4*4/4M4u4z44444425555.6k66666677757O7T7Y7w77777t8y8~888888889/9;9@9E9Z9_9d9|999::8:Q;;j=3>> ` T   32444`61:7:::;?;<<== =[=q==========@>>>>9?E?]?e???   p h   !00011v1~111112L2222n3v3314`4-5A5Y5a5556(707=7;N;;;;;<P<Y===6>>F?f?v?    D   0(001122%2622Q3349444444
55599:::;d;       0[11(2e2444(4,4<4B4H4N4u444g55P6X6d6q6x6666666666777"7+747D77788'909n9w9999999999
::#:)::W;;;========>>@>o>#?.?;?D?Y?  4   /090O0`001 5*5S5}5557<7a777;889':=  D   1i2G3n33o4 5~5557@8F8::R:<=>0>>>>>>???%?5??  |   '0O0223^3p33(41454;4?4E4I4S4f444445@5j55+6X666;;;;;;<
<<<<C<<<<<`== >@>>>>>	??(?3??  t   111111	2283555566%66,7[8a8g8m8s8y8H9O9V9d9o999:9:T:g:::::::#;u;;<r===R>>>>?    t   01D1w1112223433334*4B44435q566787Y7d7r7829Q9c9m9999:_:::X;~;;;<<X=e====>w???     >0015G7777:        1122)56&6]6d6^9      2.3::::=>>(?/?     4   )25555\;p;<+<=<O<a<s<<<<<<<<o=   0 ,   U0;2M2_2q222444446;<=>> @ @   233334.6c6667p88d9m99!:*:::0;z;;<>a>?? P p   0>0S0001!2)2s2}223)3q33Y55555 66X6_6~666697@7Q7{77777848@88899999:::::: `    6647n7=>?   p P   0Y1a1i1q1y11122!2-292Y22222233o444D5d55638f8`9,<=>:>?  <   000112%2L2g3333=4G4l4444v566@7`99;?<  8   '001{222*3]33H4478:;<<3<=t>>>>?  `   V0r000011222q22223V3s3I44445	6&66J7a77778-8N8b8888809z:::=v?  T   002R2222 33333z4^5f5m789<<<<<==0=6=;=I=Y=n=======       17
:=f>      A0G0M0S0Y0_0e0k0q0w0}0000000000000000000000111111%1+11171=1C1I1O1U1[1a1g1m1s1y111111111111111111111112	2222!2'2-23292?2E2K2Q2W2]2c2i2o2u2{222222222222222222222223#393O3e3{333333344%4,454;4A4J4Q44444445k5t5}555555%656Y66666666{77777v999::::!;,;B;T;n;;;;;;;;<Q<]<c<x<<<<===>/>5>?       "1233333     8   ::;V;;;;"<S<z<<<$=^==>~>>?G????       080s00061w112q222"3N3r33 4K4445S5556K6667C7777;8y88839q999+:i:::;O;v;;;;<*<N<r<<<<=S===<>~>>?{???     h   20l0001T112w223X333'444A555666Z7778d8|9:3;g;;;<Q<<==>H>l>>V????? 0    30t00071x111;2|22&3g333*4k445?5s5556C6w667S777"8k88889{99:M::::9;w;;;1<o<<<<Y===>k>>+?l??   @ 0   0 1T1122222+3_333$4g4445B5p5   P    555	66!6-6   p 0   11122 3$3(3,3034383L6P6T6X6\6l9p9x:    333034383@3D3H3333344444444444444444444 5555555 5(5,50545<5@5D5H5P5T5X5\5d5h5l5p5x5|55555556666666666666666666 777777 7$7(7074787<7D7H7L7P7X7\7`7d7l7p7t7x777777777777777777777777 889<9@9D9L9P9T9X99999999::::::: :$:(:4:================>>>>>> >$>,>0>4>8>@>D>H>L>T>X>\>`>h>l>p>t>|>>>>>>>>>>>>???? ?$?(?,?4?8?<?@?L?P?T?X?\?`?d?h?t?x?|??????      000111 3333333 3$3(3034383<3@3D3H3L3\3T4X4\4`4h4l4p4t4|444444444444444444444444444 555555 5$5(5,5054585D5H5L5P5T5X5\5`55555555555555555555 666666666666666666666666677778 9999999$9(9,90989<9@9D9L9P9T9X9`9d9h9l9t9x9|999999999999999999999999 ::::: :$:(:,:0:4:@:D:H:L:P:T:X:\:l:p:t:x:|::::::(;,;0;4;8;<;@;D;P;T;d;t;;;;;;;;;;;;;;;;;;;;;;;;;; <<<<< <(=,=0=4=8=<=@=D=      1 1$1(1,1014181<1@1L1111111122 2@2D2H2P2T2X2`2d2h2p2t2x222222222288 999999 9$9(9,94989<9D9H9L9`9d9h9l9p9t9x9999999999999999999999999999 ::::: :$:(:,:0:4:8:<:@:D:H:X:\:`:d:h:l:p:t:x::::::::::::$;(;,;0;4;8;@;D;H;L;P;T;\;`;d;h;l;p;t;d<h<l<t<x<|<<<<<<<<4?<?D?L?T?\?d?l?t?|?????????????????    0000$0,040<0D0L0T0\0d0l0t0|000000000000000001111$1,141<1D1L1T1\1d1l1t1|11111L<P<T<X<\<`<d<h<l<p<t<<<<<<<<<<<<<<<<<<<<<<<<<<<< ======== =$=(=,=0=4=8=<=L=P=T=X=`=d=h=l=t=x=|============================ >>>>>>$>(>,>0>4>8><>@>D>P>T>X>\>`>d>h>t>x>|>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ????? ?$?(?,?0?4?8?<?@?P?T?X?\?`?d?h?l?p?t?x?|????????????????????????????  X  00000 0$0(0,0004080H0L0P0T0X0\0`0d0h0t0x0|000000000000000000000000000 11111111 1$14181<1@1D1H1L1P1T1X1\1`1d1t1x1|111111111111111111111111111\4`4d4h4l4p4t44444444444444444444444444444 55555 5$5(5,5054585<5@5D5H5L5\5`5d5h5l5p5t5x5|555555555555555555555|<<<<<<<<<<<<<<<<< ==== =(=0=8=@=H=P=X=`=h=p=x================= >>>> >(>0>8>@>H>P>X>`>h>p>x>>>>>>>>>>>>>>>>> ???? ?(?0?8?@?H?P?X?`?h?p?x?????????????????  `    0000<<<<<<<<<<<<<<<<<<<<<<<<<< ====T>`>l>x>>>>>>>   l  (383L333333333333333333333333 44,444<4D4L4T4\4d4l4t4|4444444444444444455P6T6X6\6`6d6h6l6p6t6x6|6666677777777777777777888888888888888888888888 99999999 9$9(9,9094989<9@9D9H9T9X9\9`9d9h9l9p9t9x9|999999999999999999999999999999999 :   P 0   >>>> ???????? ?$?(?,?0?4?8?<? `    j9n9r9v9::::;;;;;; <<<$<0<<<H<T<`<l<x<<<<<<<<<<<<== =,=8=D=P=\=h=t============>>>(>4>@>L>X>d>p>|>>>>>>h?t???????????? p    000(040@0L0X0d0p0===============>>>>$>,>4><>D>L>T>\>d>l>t>|>>>>>>>>>>>>>>>>>????$?,?4?<?D?L?T?\?d?l?t?|?????????????????    4  0000$0,040<0D0L0T0\0d0l0t0|000000000000000001111$1,141<1D1L1T1\1d1l1t1|111111111111111112222$2,242<2D2L2T2\2d2l2t2|222222222222222223333$3,343<3D3L3T3\3d3l3t3|333333333333333334444$4,444<4D4L4T4\4d4l4t4|444444      X2`2h2p2x22222222222222222 3333 3(30383@3H3P3X3`3h3p3x33333333333333333 4444 4(40484@4H4P4X4`4h4p4x44444444444444444 5555 5(50585@5H5P5X5`5h5p5x55555555555555555 6666 6(60686@6H6P6X6`6h6p6x66666666666666666 7777 7(70787@7H7P7X7`7h7p7x77777777777777777 8888 8(80888@8H8P8X8`8h8p8x88888888888888888 9999 9(90989@9H9P9X9`9h9p9      \6`6h66????????    000000H0L0`0h0l0t000000000 111 1$1(101H1`1d1x11111111111112 2$282@2D2L2d2|222222222222 333$3<3@3T3\3d3|3333333333344$4(4,444L4d4l4t4444444444455 545<5@5H5`5x5|555555555555 6666(6@6D6X6`6d6h6l6p6|6666666666677(7074787<7D7\7t7x7777777777777 8888,8D8L8T8l88888888888 999$9<9D9L9d9|999999999999 ::::(:@:D:X:`:d:l::::::::::::;; ;(;,;0;4;8;D;\;t;x;;;;;;;;;;;; <<<<<<4<L<P<d<l<p<t<x<<<<<<<<<<<<==,=4=8=<=@=H=`=x=|============ >>>>(>@>D>X>`>d>h>l>t>>>>>>>>>>>?? ?(?,?0?4?8?D?\?t?x?????????????  x   000$0<0@0T0\0`0d0h0l0p0|0000000000 111 1$1(1,10141@1X1p1t1111111111111 2222(2@2D2X2\2p2x2|22222222222223 3$383@3D3H3L3T3l333333333333 444444$4<4T4X4l4t4x4|44444444444455 545<5@5D5H5L5P5\5t555555555555 666666 686P6T6h6p6t6x6|6666666666667 7$787<7P7X7\7`7d7l77777777777788 8(8,80848<8T8l8p888888888888888 999(949L9d9l9p9t9x9|999999999999:::$:(:,:0:4:@:X:p:t::::::::::::;;;,;D;H;\;d;l;;;;;;;;;;;<<<$<<<T<X<l<t<x<<<<<<<<<<==$=,=0=8=P=h=l======     T:h:t::::::::::::: ;; ;4;@;H;T;X;\;h;|;;;;;;;;;;;;;;<< <,<0<<<D<P<T<`<t<<<<<<<<<<< ==4=@=d=p===== >>d>p>>>>>,?4?x????????     0@0H0P0X0`0h0x0000001181D1h1t111111 2222,2L2T2\2d2l2|22222223 3(303<3d3p333333 4444D4L4X4\4`4l444444444455 5H5T5x555555555546@6d6p666666707D7l777,848t8|88889\9d9999990:<:`:l::::::: ;,;P;X;d;;;;;;;<$<,<4<<<D<T<`<<<<<<<= =D=P=t=|========>(>0>8>@>H>X>`>l>>>>>>>???D?L?X???????????    0 0,0T0`00000000 111<1D1L1X111111112(202<2d2p2222223 3(30383@3H3P3X3`3h3p3x33333333344(4P4X4d444444444445585D5h5t555555555 6(60686D6l6t666666667(7L7X7|77777788<8D8P8x888888889,989`99999999999:$:H:T:x:::::::;8;@;H;P;X;l;;;;;;;;;;<(<0<8<D<l<t<<<<<<<<<=0=8=@=H=T=|======== >>4>@>d>l>x>>>>>>>> ?(?4?\?h???????     0(040\0|000000000000000011 1H1T1x111111122$2,242<2D2L2`2l2222222 343\3p33334484D4h4t444444444 5(50585D5l5t555555556(6L6X6|66666677<7D7P7x77777777 8(848\8d8l8x88888888 9(90989D9l9x999 :(:0:P:t:|::::::::;0;<;`;h;t;;;;;;<0<P<X<`<h<p<x<<<<<<<<<<<<<<=(=L=T=`======== >>>> >4><>H>p>|>>>>>>>>?$?0?X?`?h?p?|??????    00 0,0T0`00000001 1D1P1t1|11111112$202l2p2222222 3 3,383p3x3|33333333,404L4P4\4d4p4t444444585X5x555556686X6x666666787X7x77777888X8d888889(9D9H9h9t99999:8:X:x:::::;8;D;P;;;;;<(<H<h<<<<<=$=(=   0 x    00`0000000000000000000011112(282H2X2p2|2222233<<=0=X===== >L>p>>>>?   @    @0d00001(1P112D2x223\3333 4D4h4444@5555 666 7H7x77H889<9`999T::::8;;;;P<<<=0===>4>P>l>>>       22222 2$2(2,2024282<2@2D2H2L2P2T2X2\2`2d2h2l2p2t2x2|222222222222222222222222222222222 33333333 3$3(3,3034383<3@3D3H3L3P3T3X3\3`3d3        00                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                v9.0.0 (2022-08-10)
-------------------
[change] Upgrade tedious to v15 ([#1417](https://github.com/tediousjs/node-mssql/pull/1417))
[removed] Removed NodeJS 10 & 12 support ([#1417](https://github.com/tediousjs/node-mssql/pull/1417))

v8.1.3 (2022-08-08)
-------------------
[fix] requestTimeout correctly resolved ([#1398](https://github.com/tediousjs/node-mssql/pull/1398))
[fix] Forcibly deny use of `useColumnNames` tedious config option that can be passed in the config object ([#1416](https://github.com/tediousjs/node-mssql/pull/1416))

v8.1.2 (2022-05-27)
-------------------
[fix] quote identifiers in table constraint declaration ([#1397](https://github.com/tediousjs/node-mssql/pull/1397))

v8.1.1 (2022-05-18)
-------------------
[fix] quote identifiers in table primary keys ([#1394](https://github.com/tediousjs/node-mssql/pull/1394))

v8.1.0 (2022-04-06)
-------------------
[new] MSSQL CLI tool now accepts some options to allow overriding config file ((#1381](https://github.com/tediousjs/node-mssql/pull/1381))
[fix] nodemsqlv8 driver tests working against Node 10 ([#1368](https://github.com/tediousjs/node-mssql/pull/1368))

v8.0.2 (2022-02-07)
-------------------
Merge up missing fixes from v7.3.0
[new] Transaction/PreparedStatements expose the config from their parent connection ([#1338](https://github.com/tediousjs/node-mssql/pull/1338))
[fix] Fix inherited request configs from the pool. Specifically stream and arrayRowMode now inherit accurately from the connection config ([#1338](https://github.com/tediousjs/node-mssql/pull/1338))

v8.0.1 (2022-01-30)
-------------------
Re-release of v8.0.0

v8.0.0 (2022-01-30)
-------------------
[new] Add table.rows.clear() method to allow for chunking updates ([#1094](https://github.com/tediousjs/node-mssql/pull/1094))
[new] Add valueHandler map to store callbacks that are used to process row values ([#1356](https://github.com/tediousjs/node-mssql/pull/1356))
[change] msnodesqlv8 driver detects os platform and attempts to pick correct connections string for it ((#1318)[https://github.com/tediousjs/node-mssql/pull/1318])
[change] Updated to latest Tedious 14 ((#1312)[https://github.com/tediousjs/node-mssql/pull/1312])
[change] Errors for bad bulk load parameters have slightly different error messages ((#1318)[https://github.com/tediousjs/node-mssql/pull/1318])
[change] Options provided to the driver via the config.options object will not be overridden with other values if set explicitly ((#1340)[https://github.com/tediousjs/node-mssql/pull/1340])
[change] Duplicate column names will now be presented as an array even if the values are empty ((#1240)[https://github.com/tediousjs/node-mssql/pull/1240])
[change] Update tarn pool dependency ((#1344)[https://github.com/tediousjs/node-mssql/pull/1344])
[removed] Remove connection string parser helpers ((#1342)[https://github.com/tediousjs/node-mssql/pull/1342])
[removed] Remove deprecated pool properties ((#1359)[https://github.com/tediousjs/node-mssql/pull/1359])

v7.3.5 (2022-05-27)
-------------------
[fix] quote identifiers in table constraint declaration ([#1397](https://github.com/tediousjs/node-mssql/pull/1397))

v7.3.4 (2022-05-18)
-------------------
[fix] msnodesqlv8.js file was missing from previous release

v7.3.3 (2022-05-18)
-------------------
Duplicate tag

v7.3.2 (2022-05-18)
-------------------
[fix] nodemsqlv8 driver tests working against Node 10 ([#1368](https://github.com/tediousjs/node-mssql/pull/1368))
[fix] quote identifiers in table primary keys ([#1394](https://github.com/tediousjs/node-mssql/pull/1394))

v7.3.1 (2022-02-24)
-------------------
[fix] Bump debug dependency ([#1361](https://github.com/tediousjs/node-mssql/pull/1361))

v7.3.0 (2021-11-18)
-------------------
[new] Transaction/PreparedStatements expose the config from their parent connection ([#1338](https://github.com/tediousjs/node-mssql/pull/1338))
[fix] Fix inherited request configs from the pool. Specifically stream and arrayRowMode now inherit accurately from the connection config ([#1338](https://github.com/tediousjs/node-mssql/pull/1338))

v7.2.1 (2021-08-19)
-------------------
[fix] Fix issue with bulk insert of dates ((#1298)[https://github.com/tediousjs/node-mssql/pull/1298])

v7.2.0 (2021-07-29)
-------------------
[new] Update Geography field parsing to provide lat/lng props from Geography Point ((#1282)[https://github.com/tediousjs/node-mssql/pull/1282])
[fix] Handle errors when adding rows to bulk operations ((#1264)[https://github.com/tediousjs/node-mssql/pull/1264])
[fix] Input/Output parameter passing fix for msnodesqlv8 driver ((#1275)[https://github.com/tediousjs/node-mssql/pull/1275])

v7.1.3 (2021-06-11)
-------------------
[fix] Request timeout settings now respect value parsed from connection strings ((#1257)[https://github.com/tediousjs/node-mssql/pull/1257)

v7.1.1 (2021-06-09)
-------------------
[fix] Errors from tedious connection creation now cause connection promise to reject ((#1254)[https://github.com/tediousjs/node-mssql/pull/1254])
[fix] Encrypt and transaction binding settings now respect value parsed from connection strings ((#1252)[https://github.com/tediousjs/node-mssql/pull/1252)

v7.1.0 (2021-05-13)
-------------------
[new] Add `parseJSON` support to query strings
[fix] Bump various dependencies for security fixes

v7.0.0 (2021-05-06)
-------------------
[new] Result sets with duplicate keys can now be handled using `request.arrayRowMode` ([#1130](https://github.com/tediousjs/node-mssql/pull/1130))
[new] Requests in stream mode now emit a `rowsaffected` event ([#1213](https://github.com/tediousjs/node-mssql/pull/1213))
[new] msnodesqlv8 driver now has detailed error support ([#1212](https://github.com/tediousjs/node-mssql/pull/1212))
[new] Connection validation checks before releasing connections from the pool. This can be turned of via `validateConnection: false` config option ([#1192](https://github.com/tediousjs/node-mssql/pull/1192))
[new] UseUTC is now supported on msnodesqlv8 connections ([#1222](https://github.com/tediousjs/node-mssql/pull/1222))
[change] Updated to latest Tedious 11
[change] Updated tarnjs to v3
[change] Updated to support latest msnodesqlv8 v2 ([#1157](https://github.com/tediousjs/node-mssql/pull/1157))
[change] Piped streams no longer have errors forwarded on to them ([#1028](https://github.com/tediousjs/node-mssql/pull/1028))
[change] tedious config option `trustServerCertificate` defaults to `false` if not supplied ([#1030](https://github.com/tediousjs/node-mssql/pull/1030))
[change] Request.pipe now pipes a true node stream for better support of backpressure ([#1078](https://github.com/tediousjs/node-mssql/pull/1078))
[change] drop support for NodeJS < 10 ([#1070](https://github.com/tediousjs/node-mssql/pull/1070))
[fix] Ensure line endings are unix style (LF)
[fix] Avoid using deprecated `.inspect` on Objects ([#1071](https://github.com/tediousjs/node-mssql/pull/1071))
[fix] Bump various dependencies for security fixes ([#1102](https://github.com/tediousjs/node-mssql/pull/1102))
[fix] Trailing rows from request streams using msnodesqlv8 driver fail to be emitted ([#1109](https://github.com/tediousjs/node-mssql/pull/1109))
[fix] Issue with geography v2 parsing resolve ([#1138](https://github.com/tediousjs/node-mssql/pull/1138))
[fix] Connection config objects are now deep cloned when stored against a connection pool ([#1217](https://github.com/tediousjs/node-mssql/pull/1217))
[removed] Support for connection uri format has been removed (eg: `mssql://user:password@host/?params=values`)

v6.4.1 (2022-02-24)
-------------------
[fix] Bump debug dependency ([#1361](https://github.com/tediousjs/node-mssql/pull/1361))

v6.4.0 (2021-11-18)
-------------------
[new] Transaction/PreparedStatements expose the config from their parent connection
[fix] Fix inherited request configs from the pool. Specifically stream and arrayRowMode now inherit accurately from the connection config ([#1338](https://github.com/tediousjs/node-mssql/pull/1338))

v6.3.2 (2021-05-13)
-------------------
[fix] Bump various dependencies for security fixes

v6.3.1 (2021-01-01)
-------------------
[fix] Ensure line endings are unix style (LF)

v6.3.0 (2020-12-14)
-------------------
[new] Result sets with duplicate keys can now be handled using `request.arrayRowMode` ([#1130](https://github.com/tediousjs/node-mssql/pull/1130))
[fix] Issue with geography v2 parsing resolve ([#1138](https://github.com/tediousjs/node-mssql/pull/1138))
[fix] Fixed issue where msnodesqlv8 could sometimes terminate queries before all errors has been emitted causing queries to hang ([#1145](https://github.com/tediousjs/node-mssql/pull/1145))

v6.2.3 (2020-09-25)
-------------------
[fix] Remove reference to global pool on connection error ([#1107](https://github.com/tediousjs/node-mssql/pull/1107))
[fix] Trailing rows from request streams using msnodesqlv8 driver fail to be emitted ([#1109](https://github.com/tediousjs/node-mssql/pull/1109))

v6.2.2 (2020-09-18)
-------------------
[fix] Avoid using deprecated `.inspect` on Objects ([#1071](https://github.com/tediousjs/node-mssql/pull/1071))
[fix] Bump various dependencies for security fixes ([#1102](https://github.com/tediousjs/node-mssql/pull/1102))

v6.2.1 (2020-07-22)
-------------------
[fix] Bump various dependencies for security fixes

v6.2.0 (2020-03-13)
-------------------
[new] Set default isolationLevel for all transactions ([#1005](https://github.com/tediousjs/node-mssql/pull/1005))
[new] sql.Date now is coerced into a date object ([#1007](https://github.com/tediousjs/node-mssql/pull/1007))
[fix] Bump acorn dependency for security fix

v6.1.0 (2020-02-17)
-------------------
[new] Add `Request.template` helper for providing templated strings to queries ([#960](https://github.com/tediousjs/node-mssql/pull/960))
[new] Repeat calls to `ConnectionPool.connect()` resolve ([#941](https://github.com/tediousjs/node-mssql/pull/941))
[new] Stored procedure params are now logged to debug log ([#979](https://github.com/tediousjs/node-mssql/pull/979))
[fix] Repeat calls to `mssql.connect()` will now resolve correctly ([#986](https://github.com/tediousjs/node-mssql/pull/986))
[fix] Connections are encrypted by default as documented ([#977](https://github.com/tediousjs/node-mssql/pull/977))
[fix] Tagged template literal queries with empty array values now work ([#990](https://github.com/tediousjs/node-mssql/pull/990))

v6.0.1 (2019-11-15)
-------------------
[fix] Fix an issue with connection strings where usernames have url encoded values ([#945](https://github.com/tediousjs/node-mssql/pull/945)

v6.0.0 (2019-11-05)
-------------------
[fix] Fixed bug when trying to bulk insert columns that were `NVarChar(MAX)` ([#901](https://github.com/tediousjs/node-mssql/pull/901))
[fix] Fixed an issue where Object prototype pollution could cause errors ([#879](https://github.com/tediousjs/node-mssql/pull/879))
[fix] Fixed an issue where Request.input didn't validate against 0 parameters being passed ([#885](https://github.com/tediousjs/node-mssql/pull/885))
[new] Implement pause/resume for msnodesqlv8 driver ([#877](https://github.com/tediousjs/node-mssql/pull/877))
[new] Added `healthy` flag to the pool to help determine if the pool is safe to use or not ([#816](https://github.com/tediousjs/node-mssql/pull/816))
[new] Invalid isolation levels passed to transactions will now throw an error
[new] Duplicate parameter names in queries/stored procedures will now throw an error
[new] `replaceInput` and `replaceOutput` functions added to `Request` and `PreparedStatement` to facilitate replacing existing parameters
[new] Calls to the global `connect` function will return the global connection if it exists
[new] Bulk table inserts now attempt to coerce Date objects out of non Date values
[change] Closing the global connection by reference will now cleanup the internally managed globalConnection
[change] Upgraded tedious to v6 ([#818](https://github.com/tediousjs/node-mssql/pull/818) and [#933](https://github.com/tediousjs/node-mssql/pull/933))
[change] Upgraded msnodesqlv8 support to v0.7 ([#877](https://github.com/tediousjs/node-mssql/pull/877))
[change] Remove references to deprecated `TYPES.Null` from tedious
[change] `options.encrypt` is now set to true by default
[change] Upgraded `debug` dependency to v4
[change] Config objects are cloned so that the original object is not modified
[change] Replaced pool library (`generic-pool`) with `tarn.js` ([#808](https://github.com/tediousjs/node-mssql/pull/808))
[removed] Backoff try strategy for creating connections removed, `tarn.js` built-in retry strategy used instead

v5.1.5 (2021-05-13)
-------------------
[fix] Bump various dependencies for security fixes

v5.1.4 (2021-01-01)
-------------------
[fix] Ensure line endings are unix style (LF)

v5.1.3 (2020-09-18)
-------------------
[fix] Avoid using deprecated `.inspect` on Objects ([#1071](https://github.com/tediousjs/node-mssql/pull/1071))
[fix] Bump various dependencies for security fixes ([#1102](https://github.com/tediousjs/node-mssql/pull/1102))

v5.1.2 (2020-07-22)
-------------------
[fix] Bump various dependencies for security fixes

v5.1.1 (2020-03-13)
-------------------
[fix] Bump acorn dependency for security fix

v5.1.0 (2019-04-17)
-------------------
[new] Add readOnlyIntent to connection string parser ([#853](https://github.com/tediousjs/node-mssql/pull/853))

v5.0.6 (2019-04-17)
-------------------
[fix] Ensure callbacks don't block the event loop by executing them with `setImmediate` ([#855](https://github.com/tediousjs/node-mssql/pull/855))

v5.0.5 (2019-03-28)
-------------------
[fix] Fix an issue where connections that error can deplete the pool ([#842](https://github.com/tediousjs/node-mssql/pull/842))

v5.0.4 (2019-03-27)
-------------------
[fix] Fix a bug where msnodesqlv8 driver could execute callbacks twice ([#834](https://github.com/tediousjs/node-mssql/pull/834))
[fix] npm audit fix on vulnerable dependencies

v5.0.3 (2019-03-13)
-------------------
[fix] Fix a bug with streamed requests that start paused ([#833](https://github.com/tediousjs/node-mssql/pull/833))

v5.0.2 (2019-03-09)
-------------------
[change] Remove references to deprecated `TYPES.Null` from tedious

v5.0.1 (2019-03-09)
-------------------
[change] Config objects are cloned so that the original object is not modified

v5.0.0 (2019-03-07)
-------------------
[new] Added pause / resume feature to streamed requests ([#775](https://github.com/tediousjs/node-mssql/pull/775))
[new] Added options argument to bulk requests for compatibility with tedious driver
[new] Added a backoff retry strategy for failed connection creation to mitigate issue with `generic-pool` connection creation logic ([#806](https://github.com/tediousjs/node-mssql/pull/806)
[change] Updated to latest Tedious 4.1.1
[removed] Node.js < 6 is no longer supported
[removed] Support dropped for deprecated tedious configuration values and types

v4.3.9 (2020-07-22)
-------------------
[fix] Bump various dependencies for security fixes

v4.3.8 (2020-03-13)
-------------------
[fix] Bump acorn dependency for security fix

v4.3.7 (2019-03-29)
-------------------
[fix] Fix an issue where connections that error can deplete the pool ([#842](https://github.com/tediousjs/node-mssql/pull/842))

v4.3.6 (2019-03-27)
-------------------
[fix] Fix a bug where msnodesqlv8 driver could execute callbacks twice ([#834](https://github.com/tediousjs/node-mssql/pull/834))
[fix] Bump js-yaml dependency for security fix

v4.3.5 (2019-03-09)
-------------------
[change] Remove references to deprecated `TYPES.Null` from tedious

v4.3.4 (2019-03-09)
-------------------
[change] Config objects are cloned so that the original object is not modified

v4.3.3 (2019-03-07)
-------------------
[change] Updated to latest generic-pool 3.6.1

v4.3.0 (2018-11-20)
-------------------
[new] Add beforeConnect handler
[change] Interpret connection timeout in seconds (not milliseconds)

v4.2.3 (2018-11-03)
-------------------
[new] Add info event for execute function
[fix] Fix JSON parsing with empty recordsets
[new] Array / string literal template query preparation fixes
[new] Passing encrypt option from mssql connection options to tedious options
[change] Return the _poolDestroy promise before connecting again

v4.2.2 (2018-10-17)
-------------------
[change] Updated to latest Tedious 2.7.1

v4.2.1 (2018-08-05)
-------------------
[fix] Fix connections in the pool depleting due to unfulfilled Promises and timeouts
[change] Updated to latest Tedious 2.6.4

v4.2.0 (2018-07-05)
-------------------
[new] Added TVP support for msnodesqlv8 driver
[new] Added support for information messages in msnodesqlv8 driver
[new] Added support for request cancellation in msnodesqlv8 driver
[fix] Fixed Tedious deprecation warnings
[fix] Fixed ResourceRequest timed out error
[fix] All query and batch methods now have the same interface
[fix] Fixed msnodesqlv8 issue where the encrypt option was getting ignored
[change] Updated to latest Tedious 2.3.1

v4.1.0 (2017-09-29)
-------------------
[new] Adding support for the MultiSubnetFailover option in connection strings (Paul Kehrer)
[new] Add request timeout support for msnodesqlv8 queries (Michael Parque)
[fix] Fix type inference of non-integer numbers (Andrew Crites)
[fix] Set acquireTimeout on generic pool (Karl Wiggisser)

v4.0.4 (2017-04-25)
-------------------
[fix] Fix auto-closing of idle connections

v4.0.3 (2017-04-25)
-------------------
[fix] Fixed broken CLI & debugging

v4.0.2 (2017-04-19)
-------------------
[fix] Fixed broken JSON parser

v4.0.1 (2017-04-02)
-------------------
[fix] Fixed stream in pipe mode

v4.0.0 (2017-04-01)
-------------------
[new] Completly rewritten to ES6
[new] Library is now compatible with Webpack
[new] Library is ready for async/await
[change] Removed support for < Node.js 4
[change] Removed support for outdated node-tds and msnodesql drivers
[change] Removed require('mssql/nofix') syntax
[change] Removed verbose and debug mode
[change] Removed 'driver' from options
[change] Removed Transaction and Prepared Statement queues
[change] Removed 'multiple' directive
[change] Connection renamed to ConnectionPool
[change] Updated to latest Tedious 2.0.0

v3.3.0 (2016-05-06)
-------------------
[new] Added support for receiving informational messages
[new] Added JSON support for msnodesql and msnodesqlv8 drivers
[fix] Minor fixes in connection string parsing

v3.2.1 (2016-04-16)
-------------------
[fix] Added PreparedStatement.lastRequest to access internal Request when using Promises

v3.2.0 (2016-04-11)
-------------------
[new] Added experimental support for ES6 tagged template literals
[new] Added support for Variant data type
[change] Updated to latest Tedious 1.14.0

v3.1.2 (2016-03-08)
-------------------
[fix] Correctly release connection after transaction error

v3.1.1 (2016-02-21)
-------------------
[change] Minor internal changes because of connect-mssql module

v3.1.0 (2016-02-13)
-------------------
[new] Added support for creating columns with primary keys in TVP Tables

v3.0.1 (2016-02-04)
-------------------
[fix] Fix error causing app to crash when parsing json/xml from stored procedure
[fix] Correctly check connection health after socket error

v3.0.0 (2016-01-08)
-------------------
[new] Version bump because of breakinch change introduced in release 2.6

v2.6.2 (2015-12-25) - unpublished from npm
-------------------
[new] Added support for receiving number of affected rows
[new] Automatically concat chunks of FOR XML / FOR JSON recordset
[fix] Correctly preserve domains

v2.5.0 (2015-12-17)
-------------------
[new] Added support for new TDS driver msnodesqlv8
[new] Support for configs formated as Connection String, Connection String URI

v2.4.0 (2015-12-11)
-------------------
[new] Connection.connect, PreparedStatement.prepare and Transaction.begin now returns instance of itself as a first argument to Promise resolver.
[fix] Correctly handle Socket Errors inside Requests (Jørgen Elgaard Larsen)

v2.3.2 (2015-11-11)
-------------------
[change] Updated to latest Tedious 1.13.1

v2.3.1 (2015-09-21)
-------------------
[fix] JSON fixes

v2.3.0 (2015-09-20)
-------------------
[new] Experimental JSON support

v2.2.1 (2015-09-19)
-------------------
[change] Updated to latest Tedious 1.12.3
[fix] Promise not returns rowCount in bulk load (Ben Farr)

v2.2.0 (2015-08-17)
-------------------
[new] Added column metadata identity, caseSensitive and readOnly (nino-porcino)

v2.1.8 (2015-08-11)
-------------------
[change] Updated to latest Tedious 1.12.2

v2.1.7 (2015-08-09)
-------------------
[change] Updated to latest Tedious 1.11.4

v2.1.6 (2015-06-17)
-------------------
[change] Updated to latest Tedious 1.11.2

v2.1.5 (2015-06-05)
-------------------
[fix] Correctly resolve database and schema name from table path.

v2.1.4 (2015-06-05)
-------------------
[new] Better test coverage, automated integration tests.
[fix] msnodesql: Manual transaction aborting.
[fix] msnodesql: Tests.

v2.1.3 (2015-05-03)
-------------------
[fix] msnodesql: Release connection to pool on query error (Farhan Khan)

v2.1.2 (2015-03-28)
-------------------
[fix] Fix name parsing in Table constructor (David Mercer)

v2.1.1 (2015-02-25)
-------------------
[fix] Fix Promise in Prepared Statement

v2.1.0 (2015-02-20)
-------------------
[new] Detailed SQL errors
[fix] Precise detection of column data types

v2.0.0 (2015-02-17)
-------------------
[change] Updated to latest Tedious 1.10.0
[new] Promises
[new] Pipe request to object stream
[new] Integrated type checks
[new] CLI
[fix] Transaction Abort Handling
[fix] Allow rollback on transaction with queued requests
[fix] Connection pool fixes
[fix] Minor fixes

v1.3.0 (2014-10-27)
-------------------
[change] Updated to latest Tedious 1.7.0
[new] Tedious: Char and NChar types are now available as input parameters

v1.2.1 (2014-10-07)
-------------------
[change] Updated to latest Tedious 1.5.3

v1.2.0 (2014-08-26)
-------------------
[change] Updated to latest Tedious 1.4.0
[new] Added support for bulk insert.

v1.1.1 (2014-08-07)
-------------------
[new] Added column index to recordset metadata.
[fix] Minor fixes in Tedious driver

v1.1.0 (2014-07-13)
-------------------
[change] Updated to latest Tedious 1.1.0
[new] Added support for domain logins (NTLM)

v1.0.2 (2014-07-04)
-------------------
[new] Added support for input and output parameters in batch method.
[new] Added checks for SQL injection in parameter names

v1.0.1 (2014-07-04)
-------------------
[new] Added support for Streaming in Prepared Statements

v1.0.0 (2014-07-04)
-------------------
[new] Start of semantic versioning, and commitment to stable API until 2.0.0

v0.6.2 (2014-07-04)
-------------------
[new] Added batch() method to execute sql commands like "create procedure"
[new] Cancel request in node-tds driver
[fix] Fixed VarChar/NVarChar/VarBinary MAX in prepared statements

v0.6.1 (2014-07-04)
-------------------
[change] TDS debugging simplified

v0.6.0 (2014-07-03)
-------------------
[change] Updated to latest Tedious 1.0.0
[new] Added support for Streaming
[new] Added option to set request timeout (config.requestTimeout = 15000)
[new] Errors documented
[change] Connection timeout renamed from config.timeout to config.connectionTimeout
[fix] Minor bug fixes

v0.5.5 (2014-06-24)
-------------------
[fix] Failed login left open connection pool

v0.5.4 (2014-06-15)
-------------------
[new] Multiple errors handling

v0.5.3 (2014-04-04)
-------------------
[fix] Multiple recordsets in Prepared Statements

v0.5.2 (2014-04-04)
-------------------
[new] Support for Prepared Statements
[fix] Fixed order of output parameters
[fix] Minor fixes in node-tds driver

v0.5.1 (2014-04-01)
-------------------
[change] Updated to new Tedious 0.2.1
[new] You can now easily setup type's length/scale (sql.VarChar(50))
[new] Serialization of Geography and Geometry CLR types
[new] Support for creating Table-Value Parameters (var tvp = new sql.Table())
[new] Output parameters are now Input-Output and can handle initial value
[new] Option to choose whether to pass/receive times in UTC or local time
[new] Connecting to named instances simplified
[change] Default SQL data type for JS String type is now NVarChar (was VarChar)

v0.5.0 (2014-01-25)
-------------------
[new] You can now attach event listeners to Connection (connect, close), Transaction (begin, commit, rollback) and Request (row, recordset, done)
[new] You can now set length of Char, NChar and Binary output parameters
[new] You can now change default transaction isolation level
[change] Errors are now splitted to three categories for better error handling - ConnectionError, TransactionError, ReqestError
[new] Tedious: Binary and VarBinary types are now available as input and output parameters
[new] Tedious: Image type is now available as input parameter
[change] Tedious: Binary, VarBinary and Image types are now returned as buffer (was byte array)
[change] Tedious: Transaction isolationLevel default is now READ_COMMITED (was READ_UNCOMMITED)
[fix] Tedious: Fixed issue when zero value was casted as null when using BigInt as input parameter
[fix] Tedious: Fixed issue when dates before 1900/01/01 in input parameters resulted in "Out of bounds" error
[new] node-tds: UniqueIdentifier type in now available as input and output parameter
[fix] node-tds: UniqueIdentifier type is now parsed correctly as string value (was buffer)
[fix] node-tds: Text, NText, Char, NChar, VarChar and NVarChar input parameters has correct lengths
[fix] node-tds: Fixed Error messages
[fix] Msnodesql: Char, NChar, Xml, Text, NText and VarBinary types are now correctly functional as output parameters

v0.4.5 (2014-01-23)
-------------------
[new] Added support for "co" flow controller via co-mssql module

v0.4.4 (2014-01-22)
-------------------
[change] returnValue also accessible as property of recordsets

v0.4.3 (2014-01-14)
-------------------
[fix] Even better network error handling in tedious
[new] Module is compatible with Node.js 0.11

v0.4.2 (2014-01-06)
-------------------
[new] Added connection timeout for node-tds
[fix] Module now handle tedious network errors correctly
[fix] Connection pool now destroy failed connections correctly
[fix] Connection to instance name via tedious now works correctly
[change] Option 'timeout' is now common option for all drivers (see documentation)

v0.4.1 (2013-12-13)
-------------------
[fix] Filter empty recordsets when NOCOUNT is OFF

v0.4.0 (2013-12-12)
-------------------
[new] Added support for transactions.
[new] node-tds is now available as an optional TDS driver.
[new] Documentation updated to CSDoc spec.
[change] Tedious driver no longer use tedious-connection-pool for connection pooling
[change] Msnodesql is now pooled

v0.3.4 (2013-10-23)
-------------------
[new] Queries with input and output parameters.

v0.3.3 (2013-10-23)
-------------------
[new] Test connection when tedious pool is created.

v0.3.2 (2013-09-30)
-------------------
[new] Added support for multiple connections.

v0.3.1 (2013-09-13)
-------------------
[fix] NaN values of input parameters are automatically converted to null.

v0.3.0 (2013-09-08)
-------------------
[new] Documentation extended
[new] Microsoft Driver for Node.js for SQL Server is now available as an optional TDS driver.
[new] Metadata are now accesible trough recordset.columns property.
[new] Support for multiple recordsets in query.
[fix] SQL null values are now correctly casted as JS null.
[change] Default SQL data type for JS Number is now sql.Int (was sql.BigInt).

v0.2.5 (2013-09-05)
-------------------
[fix] Multiple columns with identical name in same recordset are now handled correctly.

v0.2.4 (2013-08-15)
-------------------
[fix] Errors are now instance of Error.
[fix] Empty recordsets fixed.

v0.2.3 (2013-08-14)
-------------------
[new] Verbose mode for query.

v0.2.2 (2013-08-11)
-------------------
[new] Verbose mode for stored procedure.
[fix] Null values fixed.

v0.2.0 (2013-08-10)
-------------------
[change] Project was renamed from xsp-mssql to node-mssql.
[fix] Some minor bug fixes.

v0.1.0 (2013-07-10)
-------------------
Initial release.
MIT License

Copyright (c) 2013-2018 Patrik Simek and contributors

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

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

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

module.exports = require('./lib/tedious')
module.exports = require('./lib/msnodesqlv8')
{
  "author": {
    "name": "Patrik Simek",
    "url": "https://patriksimek.cz"
  },
  "name": "mssql",
  "description": "Microsoft SQL Server client for Node.js.",
  "version": "9.0.0",
  "main": "index.js",
  "repository": "github:tediousjs/node-mssql",
  "license": "MIT",
  "dependencies": {
    "@tediousjs/connection-string": "^0.4.1",
    "commander": "^9.4.0",
    "debug": "^4.3.3",
    "rfdc": "^1.3.0",
    "tarn": "^3.0.2",
    "tedious": "^15.0.1"
  },
  "devDependencies": {
    "mocha": "^10.0.0",
    "standard": "^17.0.0"
  },
  "engines": {
    "node": ">=10"
  },
  "files": [
    "lib/",
    "bin/",
    "tedious.js",
    "msnodesqlv8.js"
  ],
  "bin": {
    "mssql": "./bin/mssql"
  }
}module.exports = require('./lib/tedious')
'use strict'
const objectHasProperty = require('./utils').objectHasProperty
const inspect = Symbol.for('nodejs.util.inspect.custom')

const TYPES = {
  VarChar (length) {
    return { type: TYPES.VarChar, length }
  },
  NVarChar (length) {
    return { type: TYPES.NVarChar, length }
  },
  Text () {
    return { type: TYPES.Text }
  },
  Int () {
    return { type: TYPES.Int }
  },
  BigInt () {
    return { type: TYPES.BigInt }
  },
  TinyInt () {
    return { type: TYPES.TinyInt }
  },
  SmallInt () {
    return { type: TYPES.SmallInt }
  },
  Bit () {
    return { type: TYPES.Bit }
  },
  Float () {
    return { type: TYPES.Float }
  },
  Numeric (precision, scale) {
    return { type: TYPES.Numeric, precision, scale }
  },
  Decimal (precision, scale) {
    return { type: TYPES.Decimal, precision, scale }
  },
  Real () {
    return { type: TYPES.Real }
  },
  Date () {
    return { type: TYPES.Date }
  },
  DateTime () {
    return { type: TYPES.DateTime }
  },
  DateTime2 (scale) {
    return { type: TYPES.DateTime2, scale }
  },
  DateTimeOffset (scale) {
    return { type: TYPES.DateTimeOffset, scale }
  },
  SmallDateTime () {
    return { type: TYPES.SmallDateTime }
  },
  Time (scale) {
    return { type: TYPES.Time, scale }
  },
  UniqueIdentifier () {
    return { type: TYPES.UniqueIdentifier }
  },
  SmallMoney () {
    return { type: TYPES.SmallMoney }
  },
  Money () {
    return { type: TYPES.Money }
  },
  Binary (length) {
    return { type: TYPES.Binary, length }
  },
  VarBinary (length) {
    return { type: TYPES.VarBinary, length }
  },
  Image () {
    return { type: TYPES.Image }
  },
  Xml () {
    return { type: TYPES.Xml }
  },
  Char (length) {
    return { type: TYPES.Char, length }
  },
  NChar (length) {
    return { type: TYPES.NChar, length }
  },
  NText () {
    return { type: TYPES.NText }
  },
  TVP (tvpType) {
    return { type: TYPES.TVP, tvpType }
  },
  UDT () {
    return { type: TYPES.UDT }
  },
  Geography () {
    return { type: TYPES.Geography }
  },
  Geometry () {
    return { type: TYPES.Geometry }
  },
  Variant () {
    return { type: TYPES.Variant }
  }
}

module.exports.TYPES = TYPES
module.exports.DECLARATIONS = {}

const zero = function (value, length) {
  if (length == null) length = 2

  value = String(value)
  if (value.length < length) {
    for (let i = 1; i <= length - value.length; i++) {
      value = `0${value}`
    }
  }
  return value
}

for (const key in TYPES) {
  if (objectHasProperty(TYPES, key)) {
    const value = TYPES[key]
    value.declaration = key.toLowerCase()
    module.exports.DECLARATIONS[value.declaration] = value;

    ((key, value) => {
      value[inspect] = () => `[sql.${key}]`
    })(key, value)
  }
}

module.exports.declare = (type, options) => {
  switch (type) {
    case TYPES.VarChar: case TYPES.VarBinary:
      return `${type.declaration} (${options.length > 8000 ? 'MAX' : (options.length == null ? 'MAX' : options.length)})`
    case TYPES.NVarChar:
      return `${type.declaration} (${options.length > 4000 ? 'MAX' : (options.length == null ? 'MAX' : options.length)})`
    case TYPES.Char: case TYPES.NChar: case TYPES.Binary:
      return `${type.declaration} (${options.length == null ? 1 : options.length})`
    case TYPES.Decimal: case TYPES.Numeric:
      return `${type.declaration} (${options.precision == null ? 18 : options.precision}, ${options.scale == null ? 0 : options.scale})`
    case TYPES.Time: case TYPES.DateTime2: case TYPES.DateTimeOffset:
      return `${type.declaration} (${options.scale == null ? 7 : options.scale})`
    case TYPES.TVP:
      return `${options.tvpType} readonly`
    default:
      return type.declaration
  }
}

module.exports.cast = (value, type, options) => {
  if (value == null) {
    return null
  }

  switch (typeof value) {
    case 'string':
      return `N'${value.replace(/'/g, '\'\'')}'`

    case 'number':
      return value

    case 'boolean':
      return value ? 1 : 0

    case 'object':
      if (value instanceof Date) {
        let ns = value.getUTCMilliseconds() / 1000
        if (value.nanosecondDelta != null) {
          ns += value.nanosecondDelta
        }
        const scale = options.scale == null ? 7 : options.scale

        if (scale > 0) {
          ns = String(ns).substr(1, scale + 1)
        } else {
          ns = ''
        }

        return `N'${value.getUTCFullYear()}-${zero(value.getUTCMonth() + 1)}-${zero(value.getUTCDate())} ${zero(value.getUTCHours())}:${zero(value.getUTCMinutes())}:${zero(value.getUTCSeconds())}${ns}'`
      } else if (Buffer.isBuffer(value)) {
        return `0x${value.toString('hex')}`
      }

      return null

    default:
      return null
  }
}
'use strict'

const shared = require('./shared')

let globalConnection = null
const globalConnectionHandlers = {}

/**
 * Open global connection pool.
 *
 * @param {Object|String} config Connection configuration object or connection string.
 * @param {basicCallback} [callback] A callback which is called after connection has established, or an error has occurred. If omited, method returns Promise.
 * @return {Promise.<ConnectionPool>}
 */

function connect (config, callback) {
  if (!globalConnection) {
    globalConnection = new shared.driver.ConnectionPool(config)

    for (const event in globalConnectionHandlers) {
      for (let i = 0, l = globalConnectionHandlers[event].length; i < l; i++) {
        globalConnection.on(event, globalConnectionHandlers[event][i])
      }
    }

    const ogClose = globalConnection.close

    const globalClose = function (callback) {
      // remove event handlers from the global connection
      for (const event in globalConnectionHandlers) {
        for (let i = 0, l = globalConnectionHandlers[event].length; i < l; i++) {
          this.removeListener(event, globalConnectionHandlers[event][i])
        }
      }

      // attach error handler to prevent process crash in case of error
      this.on('error', err => {
        if (globalConnectionHandlers.error) {
          for (let i = 0, l = globalConnectionHandlers.error.length; i < l; i++) {
            globalConnectionHandlers.error[i].call(this, err)
          }
        }
      })

      globalConnection = null
      return ogClose.call(this, callback)
    }

    globalConnection.close = globalClose.bind(globalConnection)
  }
  if (typeof callback === 'function') {
    return globalConnection.connect((err, connection) => {
      if (err) {
        globalConnection = null
      }
      callback(err, connection)
    })
  }
  return globalConnection.connect().catch((err) => {
    globalConnection = null
    return shared.Promise.reject(err)
  })
}

/**
 * Close all active connections in the global pool.
 *
 * @param {basicCallback} [callback] A callback which is called after connection has closed, or an error has occurred. If omited, method returns Promise.
 * @return {ConnectionPool|Promise}
 */

function close (callback) {
  if (globalConnection) {
    const gc = globalConnection
    globalConnection = null
    return gc.close(callback)
  }

  if (typeof callback === 'function') {
    setImmediate(callback)
    return null
  }

  return new shared.Promise((resolve) => {
    resolve(globalConnection)
  })
}

/**
 * Attach event handler to global connection pool.
 *
 * @param {String} event Event name.
 * @param {Function} handler Event handler.
 * @return {ConnectionPool}
 */

function on (event, handler) {
  if (!globalConnectionHandlers[event]) globalConnectionHandlers[event] = []
  globalConnectionHandlers[event].push(handler)

  if (globalConnection) globalConnection.on(event, handler)
  return globalConnection
}

/**
 * Detach event handler from global connection.
 *
 * @param {String} event Event name.
 * @param {Function} handler Event handler.
 * @return {ConnectionPool}
 */

function removeListener (event, handler) {
  if (!globalConnectionHandlers[event]) return globalConnection
  const index = globalConnectionHandlers[event].indexOf(handler)
  if (index === -1) return globalConnection
  globalConnectionHandlers[event].splice(index, 1)
  if (globalConnectionHandlers[event].length === 0) globalConnectionHandlers[event] = undefined

  if (globalConnection) globalConnection.removeListener(event, handler)
  return globalConnection
}

/**
 * Creates a new query using global connection from a tagged template string.
 *
 * @variation 1
 * @param {Array|String} strings Array of string literals or sql command.
 * @param {...*} keys Values.
 * @return {Request}
 */

/**
 * Execute the SQL command.
 *
 * @variation 2
 * @param {String} command T-SQL command to be executed.
 * @param {Request~requestCallback} [callback] A callback which is called after execution has completed, or an error has occurred. If omited, method returns Promise.
 * @return {Request|Promise}
 */

function query () {
  if (typeof arguments[0] === 'string') { return new shared.driver.Request().query(arguments[0], arguments[1]) }

  const values = Array.prototype.slice.call(arguments)
  const strings = values.shift()

  return new shared.driver.Request()._template(strings, values, 'query')
}

/**
 * Creates a new batch using global connection from a tagged template string.
 *
 * @variation 1
 * @param {Array} strings Array of string literals.
 * @param {...*} keys Values.
 * @return {Request}
 */

/**
 * Execute the SQL command.
 *
 * @variation 2
 * @param {String} command T-SQL command to be executed.
 * @param {Request~requestCallback} [callback] A callback which is called after execution has completed, or an error has occurred. If omited, method returns Promise.
 * @return {Request|Promise}
 */

function batch () {
  if (typeof arguments[0] === 'string') { return new shared.driver.Request().batch(arguments[0], arguments[1]) }

  const values = Array.prototype.slice.call(arguments)
  const strings = values.shift()

  return new shared.driver.Request()._template(strings, values, 'batch')
}

module.exports = {
  batch,
  close,
  connect,
  off: removeListener,
  on,
  query,
  removeListener
}

Object.defineProperty(module.exports, 'pool', {
  get: () => {
    return globalConnection
  },
  set: () => {}
})
'use strict'

module.exports = {
  READ_UNCOMMITTED: 0x01,
  READ_COMMITTED: 0x02,
  REPEATABLE_READ: 0x03,
  SERIALIZABLE: 0x04,
  SNAPSHOT: 0x05
}
'use strict'

const TYPES = require('./datatypes').TYPES
const Table = require('./table')

let PromiseLibrary = Promise
const driver = {}
const map = []

/**
 * Register you own type map.
 *
 * @path module.exports.map
 * @param {*} jstype JS data type.
 * @param {*} sqltype SQL data type.
 */

map.register = function (jstype, sqltype) {
  for (let index = 0; index < this.length; index++) {
    const item = this[index]
    if (item.js === jstype) {
      this.splice(index, 1)
      break
    }
  }

  this.push({
    js: jstype,
    sql: sqltype
  })

  return null
}

map.register(String, TYPES.NVarChar)
map.register(Number, TYPES.Int)
map.register(Boolean, TYPES.Bit)
map.register(Date, TYPES.DateTime)
map.register(Buffer, TYPES.VarBinary)
map.register(Table, TYPES.TVP)

/**
 * @ignore
 */

const getTypeByValue = function (value) {
  if ((value === null) || (value === undefined)) { return TYPES.NVarChar }

  switch (typeof value) {
    case 'string':
      for (const item of Array.from(map)) {
        if (item.js === String) {
          return item.sql
        }
      }

      return TYPES.NVarChar

    case 'number':
    case 'bigint':
      if (value % 1 === 0) {
        if (value < -2147483648 || value > 2147483647) {
          return TYPES.BigInt
        } else {
          return TYPES.Int
        }
      } else {
        return TYPES.Float
      }

    case 'boolean':
      for (const item of Array.from(map)) {
        if (item.js === Boolean) {
          return item.sql
        }
      }

      return TYPES.Bit

    case 'object':
      for (const item of Array.from(map)) {
        if (value instanceof item.js) {
          return item.sql
        }
      }

      return TYPES.NVarChar

    default:
      return TYPES.NVarChar
  }
}

module.exports = {
  driver,
  getTypeByValue,
  map
}

Object.defineProperty(module.exports, 'Promise', {
  get: () => {
    return PromiseLibrary
  },
  set: (value) => {
    PromiseLibrary = value
  }
})

Object.defineProperty(module.exports, 'valueHandler', {
  enumerable: true,
  value: new Map(),
  writable: false,
  configurable: false
})
'use strict'

const TYPES = require('./datatypes').TYPES
const declareType = require('./datatypes').declare
const objectHasProperty = require('./utils').objectHasProperty

const MAX = 65535 // (1 << 16) - 1
const JSON_COLUMN_ID = 'JSON_F52E2B61-18A1-11d1-B105-00805F49916B'

function Table (name) {
  if (name) {
    const parsed = Table.parseName(name)
    this.name = parsed.name
    this.schema = parsed.schema
    this.database = parsed.database
    this.path = (this.database ? `[${this.database}].` : '') + (this.schema ? `[${this.schema}].` : '') + `[${this.name}]`
    this.temporary = this.name.charAt(0) === '#'
  }

  this.columns = []
  this.rows = []

  Object.defineProperty(this.columns, 'add', {
    value (name, column, options) {
      if (column == null) {
        throw new Error('Column data type is not defined.')
      }
      if (column instanceof Function) {
        column = column()
      }

      options = options || {}
      column.name = name;

      ['nullable', 'primary', 'identity', 'readOnly', 'length'].forEach(prop => {
        if (objectHasProperty(options, prop)) {
          column[prop] = options[prop]
        }
      })

      return this.push(column)
    }
  })

  Object.defineProperty(this.rows, 'add', {
    value () {
      return this.push(Array.prototype.slice.call(arguments))
    }
  }
  )

  Object.defineProperty(this.rows, 'clear', {
    value () {
      return this.splice(0, this.length)
    }
  }
  )
}

/*
@private
*/

Table.prototype._makeBulk = function _makeBulk () {
  for (let i = 0; i < this.columns.length; i++) {
    const col = this.columns[i]
    switch (col.type) {
      case TYPES.Date:
      case TYPES.DateTime:
      case TYPES.DateTime2:
        for (let j = 0; j < this.rows.length; j++) {
          const dateValue = this.rows[j][i]
          if (typeof dateValue === 'string' || typeof dateValue === 'number') {
            const date = new Date(dateValue)
            if (isNaN(date.getDate())) {
              throw new TypeError('Invalid date value passed to bulk rows')
            }
            this.rows[j][i] = date
          }
        }
        break

      case TYPES.Xml:
        col.type = TYPES.NVarChar(MAX).type
        break

      case TYPES.UDT:
      case TYPES.Geography:
      case TYPES.Geometry:
        col.type = TYPES.VarBinary(MAX).type
        break

      default:
        break
    }
  }

  return this
}

Table.prototype.declare = function declare () {
  const pkey = this.columns.filter(col => col.primary === true).map(col => `[${col.name}]`)
  const cols = this.columns.map(col => {
    const def = [`[${col.name}] ${declareType(col.type, col)}`]

    if (col.nullable === true) {
      def.push('null')
    } else if (col.nullable === false) {
      def.push('not null')
    }

    if (col.primary === true && pkey.length === 1) {
      def.push('primary key')
    }

    return def.join(' ')
  })

  const constraint = pkey.length > 1 ? `, constraint [PK_${this.temporary ? this.name.substr(1) : this.name}] primary key (${pkey.join(', ')})` : ''
  return `create table ${this.path} (${cols.join(', ')}${constraint})`
}

Table.fromRecordset = function fromRecordset (recordset, name) {
  const t = new this(name)

  for (const colName in recordset.columns) {
    if (objectHasProperty(recordset.columns, colName)) {
      const col = recordset.columns[colName]

      t.columns.add(colName, {
        type: col.type,
        length: col.length,
        scale: col.scale,
        precision: col.precision
      }, {
        nullable: col.nullable,
        identity: col.identity,
        readOnly: col.readOnly
      })
    }
  }

  if (t.columns.length === 1 && t.columns[0].name === JSON_COLUMN_ID) {
    for (let i = 0; i < recordset.length; i++) {
      t.rows.add(JSON.stringify(recordset[i]))
    }
  } else {
    for (let i = 0; i < recordset.length; i++) {
      t.rows.add.apply(t.rows, t.columns.map(col => recordset[i][col.name]))
    }
  }

  return t
}

Table.parseName = function parseName (name) {
  const length = name.length
  let cursor = -1
  let buffer = ''
  let escaped = false
  const path = []

  while (++cursor < length) {
    const char = name.charAt(cursor)
    if (char === '[') {
      if (escaped) {
        buffer += char
      } else {
        escaped = true
      }
    } else if (char === ']') {
      if (escaped) {
        escaped = false
      } else {
        throw new Error('Invalid table name.')
      }
    } else if (char === '.') {
      if (escaped) {
        buffer += char
      } else {
        path.push(buffer)
        buffer = ''
      }
    } else {
      buffer += char
    }
  }

  if (buffer) {
    path.push(buffer)
  }

  switch (path.length) {
    case 1:
      return {
        name: path[0],
        schema: null,
        database: null
      }

    case 2:
      return {
        name: path[1],
        schema: path[0],
        database: null
      }

    case 3:
      return {
        name: path[2],
        schema: path[1],
        database: path[0]
      }

    default:
      throw new Error('Invalid table name.')
  }
}

module.exports = Table
'use strict'

/* const FIGURE = {
  INTERIOR_RING: 0x00,
  STROKE: 0x01,
  EXTERIOR_RING: 0x02
};

const FIGURE_V2 = {
  POINT: 0x00,
  LINE: 0x01,
  ARC: 0x02,
  COMPOSITE_CURVE: 0x03
};

const SHAPE = {
  POINT: 0x01,
  LINESTRING: 0x02,
  POLYGON: 0x03,
  MULTIPOINT: 0x04,
  MULTILINESTRING: 0x05,
  MULTIPOLYGON: 0x06,
  GEOMETRY_COLLECTION: 0x07
};

const SHAPE_V2 = {
  POINT: 0x01,
  LINESTRING: 0x02,
  POLYGON: 0x03,
  MULTIPOINT: 0x04,
  MULTILINESTRING: 0x05,
  MULTIPOLYGON: 0x06,
  GEOMETRY_COLLECTION: 0x07,
  CIRCULAR_STRING: 0x08,
  COMPOUND_CURVE: 0x09,
  CURVE_POLYGON: 0x0A,
  FULL_GLOBE: 0x0B
};

const SEGMENT = {
  LINE: 0x00,
  ARC: 0x01,
  FIRST_LINE: 0x02,
  FIRST_ARC: 0x03
}; */

class Point {
  constructor () {
    this.x = 0
    this.y = 0
    this.z = null
    this.m = null
  }
}

const parsePoints = (buffer, count, isGeometryPoint) => {
  // s2.1.5 + s2.1.6
  // The key distinction for parsing is that a GEOGRAPHY POINT is ordered Lat (y) then Long (x),
  // while a GEOMETRY POINT is ordered x then y.
  // Further, there are additional range constraints on GEOGRAPHY POINT that are useful for testing that the coordinate order has not been flipped, such as that Lat must be in the range [-90, +90].

  const points = []
  if (count < 1) {
    return points
  }

  if (isGeometryPoint) {
    // GEOMETRY POINT (s2.1.6): x then y.
    for (let i = 1; i <= count; i++) {
      const point = new Point()
      points.push(point)
      point.x = buffer.readDoubleLE(buffer.position)
      point.y = buffer.readDoubleLE(buffer.position + 8)
      buffer.position += 16
    }
  } else {
    // GEOGRAPHY POINT (s2.1.5): Lat (y) then Long (x).
    for (let i = 1; i <= count; i++) {
      const point = new Point()
      points.push(point)
      point.lat = buffer.readDoubleLE(buffer.position)
      point.lng = buffer.readDoubleLE(buffer.position + 8)

      // For backwards compatibility, preserve the coordinate inversion in x and y.
      // A future breaking change likely eliminate x and y for geography points in favor of just the lat and lng fields, as they've proven marvelously confusing.
      // See discussion at: https://github.com/tediousjs/node-mssql/pull/1282#discussion_r677769531
      point.x = point.lat
      point.y = point.lng

      buffer.position += 16
    }
  }

  return points
}

const parseZ = (buffer, points) => {
  // s2.1.1 + s.2.1.2

  if (points < 1) {
    return
  }

  points.forEach(point => {
    point.z = buffer.readDoubleLE(buffer.position)
    buffer.position += 8
  })
}

const parseM = (buffer, points) => {
  // s2.1.1 + s.2.1.2

  if (points < 1) {
    return
  }

  points.forEach(point => {
    point.m = buffer.readDoubleLE(buffer.position)
    buffer.position += 8
  })
}

const parseFigures = (buffer, count, properties) => {
  // s2.1.3

  const figures = []
  if (count < 1) {
    return figures
  }

  if (properties.P) {
    figures.push({
      attribute: 0x01,
      pointOffset: 0
    })
  } else if (properties.L) {
    figures.push({
      attribute: 0x01,
      pointOffset: 0
    })
  } else {
    for (let i = 1; i <= count; i++) {
      figures.push({
        attribute: buffer.readUInt8(buffer.position),
        pointOffset: buffer.readInt32LE(buffer.position + 1)
      })

      buffer.position += 5
    }
  }

  return figures
}

const parseShapes = (buffer, count, properties) => {
  // s2.1.4

  const shapes = []
  if (count < 1) {
    return shapes
  }

  if (properties.P) {
    shapes.push({
      parentOffset: -1,
      figureOffset: 0,
      type: 0x01
    })
  } else if (properties.L) {
    shapes.push({
      parentOffset: -1,
      figureOffset: 0,
      type: 0x02
    })
  } else {
    for (let i = 1; i <= count; i++) {
      shapes.push({
        parentOffset: buffer.readInt32LE(buffer.position),
        figureOffset: buffer.readInt32LE(buffer.position + 4),
        type: buffer.readUInt8(buffer.position + 8)
      })

      buffer.position += 9
    }
  }

  return shapes
}

const parseSegments = (buffer, count) => {
  // s2.1.7

  const segments = []
  if (count < 1) {
    return segments
  }

  for (let i = 1; i <= count; i++) {
    segments.push({ type: buffer.readUInt8(buffer.position) })

    buffer.position++
  }

  return segments
}

const parseGeography = (buffer, isUsingGeometryPoints) => {
  // s2.1.1 + s.2.1.2

  const srid = buffer.readInt32LE(0)
  if (srid === -1) {
    return null
  }

  const value = {
    srid,
    version: buffer.readUInt8(4)
  }

  const flags = buffer.readUInt8(5)
  buffer.position = 6

  // console.log("srid", srid)
  // console.log("version", version)

  const properties = {
    Z: (flags & (1 << 0)) > 0,
    M: (flags & (1 << 1)) > 0,
    V: (flags & (1 << 2)) > 0,
    P: (flags & (1 << 3)) > 0,
    L: (flags & (1 << 4)) > 0
  }

  if (value.version === 2) {
    properties.H = (flags & (1 << 3)) > 0
  }

  // console.log("properties", properties);

  let numberOfPoints
  if (properties.P) {
    numberOfPoints = 1
  } else if (properties.L) {
    numberOfPoints = 2
  } else {
    numberOfPoints = buffer.readUInt32LE(buffer.position)
    buffer.position += 4
  }

  // console.log("numberOfPoints", numberOfPoints)

  value.points = parsePoints(buffer, numberOfPoints, isUsingGeometryPoints)

  if (properties.Z) {
    parseZ(buffer, value.points)
  }

  if (properties.M) {
    parseM(buffer, value.points)
  }

  // console.log("points", points)

  let numberOfFigures
  if (properties.P) {
    numberOfFigures = 1
  } else if (properties.L) {
    numberOfFigures = 1
  } else {
    numberOfFigures = buffer.readUInt32LE(buffer.position)
    buffer.position += 4
  }

  // console.log("numberOfFigures", numberOfFigures)

  value.figures = parseFigures(buffer, numberOfFigures, properties)

  // console.log("figures", figures)

  let numberOfShapes
  if (properties.P) {
    numberOfShapes = 1
  } else if (properties.L) {
    numberOfShapes = 1
  } else {
    numberOfShapes = buffer.readUInt32LE(buffer.position)
    buffer.position += 4
  }

  // console.log("numberOfShapes", numberOfShapes)

  value.shapes = parseShapes(buffer, numberOfShapes, properties)

  // console.log( "shapes", shapes)

  if (value.version === 2 && buffer.position < buffer.length) {
    const numberOfSegments = buffer.readUInt32LE(buffer.position)
    buffer.position += 4

    // console.log("numberOfSegments", numberOfSegments)

    value.segments = parseSegments(buffer, numberOfSegments)

    // console.log("segments", segments)
  } else {
    value.segments = []
  }

  return value
}

module.exports.PARSERS = {
  geography (buffer) {
    return parseGeography(buffer, /* isUsingGeometryPoints: */false)
  },

  geometry (buffer) {
    return parseGeography(buffer, /* isUsingGeometryPoints: */true)
  }
}
const IDS = new WeakMap()
const INCREMENT = {
  Connection: 1,
  ConnectionPool: 1,
  Request: 1,
  Transaction: 1,
  PreparedStatement: 1
}

module.exports = {
  objectHasProperty: (object, property) => Object.prototype.hasOwnProperty.call(object, property),
  INCREMENT,
  IDS: {
    get: IDS.get.bind(IDS),
    add: (object, type, id) => {
      if (id) return IDS.set(object, id)
      IDS.set(object, INCREMENT[type]++)
    }
  }
}
'use strict'

const tds = require('tedious')
const debug = require('debug')('mssql:tedi')
const BaseConnectionPool = require('../base/connection-pool')
const { IDS } = require('../utils')
const shared = require('../shared')
const ConnectionError = require('../error/connection-error')

class ConnectionPool extends BaseConnectionPool {
  _poolCreate () {
    return new shared.Promise((resolve, reject) => {
      const resolveOnce = (v) => {
        resolve(v)
        resolve = reject = () => {}
      }
      const rejectOnce = (e) => {
        reject(e)
        resolve = reject = () => {}
      }
      const cfg = {
        server: this.config.server,
        options: Object.assign({
          encrypt: typeof this.config.encrypt === 'boolean' ? this.config.encrypt : true,
          trustServerCertificate: typeof this.config.trustServerCertificate === 'boolean' ? this.config.trustServerCertificate : false
        }, this.config.options),
        authentication: Object.assign({
          type: this.config.domain !== undefined ? 'ntlm' : 'default',
          options: {
            userName: this.config.user,
            password: this.config.password,
            domain: this.config.domain
          }
        }, this.config.authentication)
      }

      cfg.options.database = cfg.options.database || this.config.database
      cfg.options.port = cfg.options.port || this.config.port
      cfg.options.connectTimeout = cfg.options.connectTimeout || this.config.connectionTimeout || this.config.timeout || 15000
      cfg.options.requestTimeout = cfg.options.requestTimeout || this.config.requestTimeout || this.config.timeout || 15000
      cfg.options.tdsVersion = cfg.options.tdsVersion || '7_4'
      cfg.options.rowCollectionOnDone = cfg.options.rowCollectionOnDone || false
      cfg.options.rowCollectionOnRequestCompletion = cfg.options.rowCollectionOnRequestCompletion || false
      cfg.options.useColumnNames = cfg.options.useColumnNames || false
      cfg.options.appName = cfg.options.appName || 'node-mssql'

      // tedious always connect via tcp when port is specified
      if (cfg.options.instanceName) delete cfg.options.port

      if (isNaN(cfg.options.requestTimeout)) cfg.options.requestTimeout = 15000
      if (cfg.options.requestTimeout === Infinity || cfg.options.requestTimeout < 0) cfg.options.requestTimeout = 0

      if (!cfg.options.debug && this.config.debug) {
        cfg.options.debug = {
          packet: true,
          token: true,
          data: true,
          payload: true
        }
      }
      let tedious
      try {
        tedious = new tds.Connection(cfg)
      } catch (err) {
        rejectOnce(err)
        return
      }
      tedious.connect(err => {
        if (err) {
          err = new ConnectionError(err)
          return rejectOnce(err)
        }

        debug('connection(%d): established', IDS.get(tedious))
        this.collation = tedious.databaseCollation
        resolveOnce(tedious)
      })
      IDS.add(tedious, 'Connection')
      debug('pool(%d): connection #%d created', IDS.get(this), IDS.get(tedious))
      debug('connection(%d): establishing', IDS.get(tedious))

      tedious.on('end', () => {
        const err = new ConnectionError('The connection ended without ever completing the connection')
        rejectOnce(err)
      })
      tedious.on('error', err => {
        if (err.code === 'ESOCKET') {
          tedious.hasError = true
        } else {
          this.emit('error', err)
        }
        rejectOnce(err)
      })

      if (this.config.debug) {
        tedious.on('debug', this.emit.bind(this, 'debug', tedious))
      }
      if (typeof this.config.beforeConnect === 'function') {
        this.config.beforeConnect(tedious)
      }
    })
  }

  _poolValidate (tedious) {
    if (tedious && !tedious.closed && !tedious.hasError) {
      return !this.config.validateConnection || new shared.Promise((resolve) => {
        const req = new tds.Request('SELECT 1;', (err) => {
          resolve(!err)
        })
        tedious.execSql(req)
      })
    }
    return false
  }

  _poolDestroy (tedious) {
    return new shared.Promise((resolve, reject) => {
      if (!tedious) {
        resolve()
        return
      }
      debug('connection(%d): destroying', IDS.get(tedious))

      if (tedious.closed) {
        debug('connection(%d): already closed', IDS.get(tedious))
        resolve()
      } else {
        tedious.once('end', () => {
          debug('connection(%d): destroyed', IDS.get(tedious))
          resolve()
        })

        tedious.close()
      }
    })
  }
}

module.exports = ConnectionPool
'use strict'

const base = require('../base')
const ConnectionPool = require('./connection-pool')
const Transaction = require('./transaction')
const Request = require('./request')

module.exports = Object.assign({
  ConnectionPool,
  Transaction,
  Request,
  PreparedStatement: base.PreparedStatement
}, base.exports)

Object.defineProperty(module.exports, 'Promise', {
  enumerable: true,
  get: () => {
    return base.Promise
  },
  set: (value) => {
    base.Promise = value
  }
})

Object.defineProperty(module.exports, 'valueHandler', {
  enumerable: true,
  value: base.valueHandler,
  writable: false,
  configurable: false
})

base.driver.name = 'tedious'
base.driver.ConnectionPool = ConnectionPool
base.driver.Transaction = Transaction
base.driver.Request = Request
'use strict'

const tds = require('tedious')
const debug = require('debug')('mssql:tedi')
const BaseRequest = require('../base/request')
const RequestError = require('../error/request-error')
const { IDS, objectHasProperty } = require('../utils')
const { TYPES, DECLARATIONS, declare, cast } = require('../datatypes')
const Table = require('../table')
const { PARSERS: UDT } = require('../udt')
const { valueHandler } = require('../shared')

const JSON_COLUMN_ID = 'JSON_F52E2B61-18A1-11d1-B105-00805F49916B'
const XML_COLUMN_ID = 'XML_F52E2B61-18A1-11d1-B105-00805F49916B'

const N_TYPES = {
  BitN: 0x68,
  DateTimeN: 0x6F,
  DecimalN: 0x6A,
  FloatN: 0x6D,
  IntN: 0x26,
  MoneyN: 0x6E,
  NumericN: 0x6C
}

const getTediousType = function (type) {
  switch (type) {
    case TYPES.VarChar: return tds.TYPES.VarChar
    case TYPES.NVarChar: return tds.TYPES.NVarChar
    case TYPES.Text: return tds.TYPES.Text
    case TYPES.Int: return tds.TYPES.Int
    case TYPES.BigInt: return tds.TYPES.BigInt
    case TYPES.TinyInt: return tds.TYPES.TinyInt
    case TYPES.SmallInt: return tds.TYPES.SmallInt
    case TYPES.Bit: return tds.TYPES.Bit
    case TYPES.Float: return tds.TYPES.Float
    case TYPES.Decimal: return tds.TYPES.Decimal
    case TYPES.Numeric: return tds.TYPES.Numeric
    case TYPES.Real: return tds.TYPES.Real
    case TYPES.Money: return tds.TYPES.Money
    case TYPES.SmallMoney: return tds.TYPES.SmallMoney
    case TYPES.Time: return tds.TYPES.Time
    case TYPES.Date: return tds.TYPES.Date
    case TYPES.DateTime: return tds.TYPES.DateTime
    case TYPES.DateTime2: return tds.TYPES.DateTime2
    case TYPES.DateTimeOffset: return tds.TYPES.DateTimeOffset
    case TYPES.SmallDateTime: return tds.TYPES.SmallDateTime
    case TYPES.UniqueIdentifier: return tds.TYPES.UniqueIdentifier
    case TYPES.Xml: return tds.TYPES.NVarChar
    case TYPES.Char: return tds.TYPES.Char
    case TYPES.NChar: return tds.TYPES.NChar
    case TYPES.NText: return tds.TYPES.NVarChar
    case TYPES.Image: return tds.TYPES.Image
    case TYPES.Binary: return tds.TYPES.Binary
    case TYPES.VarBinary: return tds.TYPES.VarBinary
    case TYPES.UDT: case TYPES.Geography: case TYPES.Geometry: return tds.TYPES.UDT
    case TYPES.TVP: return tds.TYPES.TVP
    case TYPES.Variant: return tds.TYPES.Variant
    default: return type
  }
}

const getMssqlType = function (type, length) {
  if (typeof type !== 'object') return undefined

  switch (type) {
    case tds.TYPES.Char: return TYPES.Char
    case tds.TYPES.NChar: return TYPES.NChar
    case tds.TYPES.VarChar: return TYPES.VarChar
    case tds.TYPES.NVarChar: return TYPES.NVarChar
    case tds.TYPES.Text: return TYPES.Text
    case tds.TYPES.NText: return TYPES.NText
    case tds.TYPES.Int: return TYPES.Int
    case tds.TYPES.BigInt: return TYPES.BigInt
    case tds.TYPES.TinyInt: return TYPES.TinyInt
    case tds.TYPES.SmallInt: return TYPES.SmallInt
    case tds.TYPES.Bit: return TYPES.Bit
    case tds.TYPES.Float: return TYPES.Float
    case tds.TYPES.Real: return TYPES.Real
    case tds.TYPES.Money: return TYPES.Money
    case tds.TYPES.SmallMoney: return TYPES.SmallMoney
    case tds.TYPES.Numeric: return TYPES.Numeric
    case tds.TYPES.Decimal: return TYPES.Decimal
    case tds.TYPES.DateTime: return TYPES.DateTime
    case tds.TYPES.Time: return TYPES.Time
    case tds.TYPES.Date: return TYPES.Date
    case tds.TYPES.DateTime2: return TYPES.DateTime2
    case tds.TYPES.DateTimeOffset: return TYPES.DateTimeOffset
    case tds.TYPES.SmallDateTime: return TYPES.SmallDateTime
    case tds.TYPES.UniqueIdentifier: return TYPES.UniqueIdentifier
    case tds.TYPES.Image: return TYPES.Image
    case tds.TYPES.Binary: return TYPES.Binary
    case tds.TYPES.VarBinary: return TYPES.VarBinary
    case tds.TYPES.Xml: return TYPES.Xml
    case tds.TYPES.UDT: return TYPES.UDT
    case tds.TYPES.TVP: return TYPES.TVP
    case tds.TYPES.Variant: return TYPES.Variant
    default:
      switch (type.id) {
        case N_TYPES.BitN: return TYPES.Bit
        case N_TYPES.NumericN: return TYPES.Numeric
        case N_TYPES.DecimalN: return TYPES.Decimal
        case N_TYPES.IntN:
          if (length === 8) return TYPES.BigInt
          if (length === 4) return TYPES.Int
          if (length === 2) return TYPES.SmallInt
          return TYPES.TinyInt
        case N_TYPES.FloatN:
          if (length === 8) return TYPES.Float
          return TYPES.Real
        case N_TYPES.MoneyN:
          if (length === 8) return TYPES.Money
          return TYPES.SmallMoney
        case N_TYPES.DateTimeN:
          if (length === 8) return TYPES.DateTime
          return TYPES.SmallDateTime
      }
  }
}

const createColumns = function (metadata, arrayRowMode) {
  let out = {}
  if (arrayRowMode) out = []
  for (let index = 0, length = metadata.length; index < length; index++) {
    const column = metadata[index]
    const outColumn = {
      index,
      name: column.colName,
      length: column.dataLength,
      type: getMssqlType(column.type, column.dataLength),
      scale: column.scale,
      precision: column.precision,
      nullable: !!(column.flags & 0x01),
      caseSensitive: !!(column.flags & 0x02),
      identity: !!(column.flags & 0x10),
      readOnly: !(column.flags & 0x0C)
    }

    if (column.udtInfo) {
      outColumn.udt = {
        name: column.udtInfo.typeName,
        database: column.udtInfo.dbname,
        schema: column.udtInfo.owningSchema,
        assembly: column.udtInfo.assemblyName
      }

      if (DECLARATIONS[column.udtInfo.typeName]) {
        outColumn.type = DECLARATIONS[column.udtInfo.typeName]
      }
    }

    if (arrayRowMode) {
      out.push(outColumn)
    } else {
      out[column.colName] = outColumn
    }
  }

  return out
}

const valueCorrection = function (value, metadata) {
  const type = getMssqlType(metadata.type)
  if (valueHandler.has(type)) {
    return valueHandler.get(type)(value)
  } else if ((metadata.type === tds.TYPES.UDT) && (value != null)) {
    if (UDT[metadata.udtInfo.typeName]) {
      return UDT[metadata.udtInfo.typeName](value)
    } else {
      return value
    }
  } else {
    return value
  }
}

const parameterCorrection = function (value) {
  if (value instanceof Table) {
    const tvp = {
      name: value.name,
      schema: value.schema,
      columns: [],
      rows: value.rows
    }

    for (const col of value.columns) {
      tvp.columns.push({
        name: col.name,
        type: getTediousType(col.type),
        length: col.length,
        scale: col.scale,
        precision: col.precision
      })
    }

    return tvp
  } else {
    return value
  }
}

class Request extends BaseRequest {
  /*
  Execute specified sql batch.
  */

  _batch (batch, callback) {
    this._isBatch = true
    this._query(batch, callback)
  }

  /*
  Bulk load.
  */

  _bulk (table, options, callback) {
    super._bulk(table, options, err => {
      if (err) return callback(err)

      try {
        table._makeBulk()
      } catch (e) {
        return callback(new RequestError(e, 'EREQUEST'))
      }

      if (!table.name) {
        return callback(new RequestError('Table name must be specified for bulk insert.', 'ENAME'))
      }

      if (table.name.charAt(0) === '@') {
        return callback(new RequestError("You can't use table variables for bulk insert.", 'ENAME'))
      }

      const errors = []
      const errorHandlers = {}
      let hasReturned = false

      const handleError = (doReturn, connection, info) => {
        let err = new Error(info.message)
        err.info = info
        err = new RequestError(err, 'EREQUEST')

        if (this.stream) {
          this.emit('error', err)
        } else {
          if (doReturn && !hasReturned) {
            if (connection) {
              for (const event in errorHandlers) {
                connection.removeListener(event, errorHandlers[event])
              }

              this.parent.release(connection)
            }

            hasReturned = true
            callback(err)
          }
        }

        // we must collect errors even in stream mode
        errors.push(err)
      }

      const handleInfo = msg => {
        this.emit('info', {
          message: msg.message,
          number: msg.number,
          state: msg.state,
          class: msg.class,
          lineNumber: msg.lineNumber,
          serverName: msg.serverName,
          procName: msg.procName
        })
      }

      this.parent.acquire(this, (err, connection) => {
        const callbackWithRelease = (err, ...args) => {
          try {
            this.parent.release(connection)
          } catch (e) {
            // noop
          }
          callback(err, ...args)
        }
        if (err) return callbackWithRelease(err)

        debug('connection(%d): borrowed to request #%d', IDS.get(connection), IDS.get(this))

        if (this.canceled) {
          debug('request(%d): canceled', IDS.get(this))
          return callbackWithRelease(new RequestError('Canceled.', 'ECANCEL'))
        }

        this._cancel = () => {
          debug('request(%d): cancel', IDS.get(this))
          connection.cancel()
        }

        // attach handler to handle multiple error messages
        connection.on('infoMessage', errorHandlers.infoMessage = handleInfo)
        connection.on('errorMessage', errorHandlers.errorMessage = handleError.bind(null, false, connection))
        connection.on('error', errorHandlers.error = handleError.bind(null, true, connection))

        const done = (err, rowCount) => {
          // to make sure we handle no-sql errors as well
          if (err && (!errors.length || (errors.length && err.message !== errors[errors.length - 1].message))) {
            err = new RequestError(err, 'EREQUEST')
            if (this.stream) this.emit('error', err)
            errors.push(err)
          }

          delete this._cancel

          let error
          if (errors.length && !this.stream) {
            error = errors.pop()
            error.precedingErrors = errors
          }

          if (!hasReturned) {
            for (const event in errorHandlers) {
              connection.removeListener(event, errorHandlers[event])
            }

            hasReturned = true

            if (this.stream) {
              callbackWithRelease(null, rowCount)
            } else {
              callbackWithRelease(error, rowCount)
            }
          }
        }

        const bulk = connection.newBulkLoad(table.path, options, done)

        for (const col of table.columns) {
          bulk.addColumn(col.name, getTediousType(col.type), { nullable: col.nullable, length: col.length, scale: col.scale, precision: col.precision })
        }

        if (table.create) {
          const objectid = table.temporary ? `tempdb..[${table.name}]` : table.path
          const req = new tds.Request(`if object_id('${objectid.replace(/'/g, '\'\'')}') is null ${table.declare()}`, err => {
            if (err) return done(err)

            connection.execBulkLoad(bulk, table.rows)
          })
          this._setCurrentRequest(req)

          connection.execSqlBatch(req)
        } else {
          connection.execBulkLoad(bulk, table.rows)
        }
      })
    })
  }

  /*
  Execute specified sql command.
  */

  _query (command, callback) {
    super._query(command, err => {
      if (err) return callback(err)

      const recordsets = []
      const recordsetcolumns = []
      const errors = []
      const errorHandlers = {}
      const output = {}
      const rowsAffected = []

      let columns = {}
      let recordset = []
      let batchLastRow = null
      let batchHasOutput = false
      let isChunkedRecordset = false
      let chunksBuffer = null
      let hasReturned = false

      const handleError = (doReturn, connection, info) => {
        let err = new Error(info.message)
        err.info = info
        err = new RequestError(err, 'EREQUEST')

        if (this.stream) {
          this.emit('error', err)
        } else {
          if (doReturn && !hasReturned) {
            if (connection) {
              for (const event in errorHandlers) {
                connection.removeListener(event, errorHandlers[event])
              }

              this.parent.release(connection)
            }

            hasReturned = true
            callback(err)
          }
        }

        // we must collect errors even in stream mode
        errors.push(err)
      }

      const handleInfo = msg => {
        this.emit('info', {
          message: msg.message,
          number: msg.number,
          state: msg.state,
          class: msg.class,
          lineNumber: msg.lineNumber,
          serverName: msg.serverName,
          procName: msg.procName
        })
      }

      this.parent.acquire(this, (err, connection, config) => {
        if (err) return callback(err)

        debug('connection(%d): borrowed to request #%d', IDS.get(connection), IDS.get(this))

        let row

        if (this.canceled) {
          debug('request(%d): canceled', IDS.get(this))
          this.parent.release(connection)
          return callback(new RequestError('Canceled.', 'ECANCEL'))
        }

        this._cancel = () => {
          debug('request(%d): cancel', IDS.get(this))
          connection.cancel()
        }

        // attach handler to handle multiple error messages
        connection.on('infoMessage', errorHandlers.infoMessage = handleInfo)
        connection.on('errorMessage', errorHandlers.errorMessage = handleError.bind(null, false, connection))
        connection.on('error', errorHandlers.error = handleError.bind(null, true, connection))

        debug('request(%d): query', IDS.get(this), command)

        const req = new tds.Request(command, err => {
          // tedious v15 has started using AggregateErrors to wrap multiple errors into single error objects
          (err?.errors ? err.errors : [err]).forEach((e, i, { length }) => {
            // to make sure we handle no-sql errors as well
            if (e && (!errors.length || (errors.length && errors.length >= length && e.message !== errors[errors.length - length + i].message))) {
              e = new RequestError(e, 'EREQUEST')
              if (this.stream) this.emit('error', e)
              errors.push(e)
            }
          })

          // process batch outputs
          if (batchHasOutput) {
            if (!this.stream) batchLastRow = recordsets.pop()[0]

            for (const name in batchLastRow) {
              const value = batchLastRow[name]
              if (name !== '___return___') {
                output[name] = value
              }
            }
          }

          delete this._cancel

          let error
          if (errors.length && !this.stream) {
            error = errors.pop()
            error.precedingErrors = errors
          }

          if (!hasReturned) {
            for (const event in errorHandlers) {
              connection.removeListener(event, errorHandlers[event])
            }

            this.parent.release(connection)
            hasReturned = true

            if (error) {
              debug('request(%d): failed', IDS.get(this), error)
            } else {
              debug('request(%d): completed', IDS.get(this))
            }

            if (this.stream) {
              callback(null, null, output, rowsAffected, recordsetcolumns)
            } else {
              callback(error, recordsets, output, rowsAffected, recordsetcolumns)
            }
          }
        })

        this._setCurrentRequest(req)

        req.on('columnMetadata', metadata => {
          columns = createColumns(metadata, this.arrayRowMode)

          isChunkedRecordset = false
          if (metadata.length === 1 && (metadata[0].colName === JSON_COLUMN_ID || metadata[0].colName === XML_COLUMN_ID)) {
            isChunkedRecordset = true
            chunksBuffer = []
          }

          if (this.stream) {
            if (this._isBatch) {
              // don't stream recordset with output values in batches
              if (!columns.___return___) {
                this.emit('recordset', columns)
              }
            } else {
              this.emit('recordset', columns)
            }
          }
          if (this.arrayRowMode) recordsetcolumns.push(columns)
        })

        const doneHandler = (rowCount, more) => {
          if (rowCount != null) {
            rowsAffected.push(rowCount)
            if (this.stream) {
              this.emit('rowsaffected', rowCount)
            }
          }
          // this function is called even when select only set variables so we should skip adding a new recordset
          if (Object.keys(columns).length === 0) return

          if (isChunkedRecordset) {
            const concatenatedChunks = chunksBuffer.join('')
            if (columns[JSON_COLUMN_ID] && config.parseJSON === true) {
              try {
                if (concatenatedChunks === '') {
                  row = null
                } else {
                  row = JSON.parse(concatenatedChunks)
                }
              } catch (ex) {
                row = null
                const ex2 = new RequestError(new Error(`Failed to parse incoming JSON. ${ex.message}`), 'EJSON')

                if (this.stream) this.emit('error', ex2)

                // we must collect errors even in stream mode
                errors.push(ex2)
              }
            } else {
              row = {}
              row[Object.keys(columns)[0]] = concatenatedChunks
            }

            chunksBuffer = null

            if (this.stream) {
              this.emit('row', row)
            } else {
              recordset.push(row)
            }
          }

          if (!this.stream) {
            // all rows of current recordset loaded
            Object.defineProperty(recordset, 'columns', {
              enumerable: false,
              configurable: true,
              value: columns
            })

            Object.defineProperty(recordset, 'toTable', {
              enumerable: false,
              configurable: true,
              value (name) { return Table.fromRecordset(this, name) }
            })

            recordsets.push(recordset)
          }

          recordset = []
          columns = {}
        }

        req.on('doneInProc', doneHandler) // doneInProc handlers are used in both queries and batches
        req.on('done', doneHandler) // done handlers are used in batches

        req.on('returnValue', (parameterName, value, metadata) => {
          output[parameterName] = value
        })

        req.on('row', columns => {
          if (!recordset) recordset = []

          if (isChunkedRecordset) {
            return chunksBuffer.push(columns[0].value)
          }

          if (this.arrayRowMode) {
            row = []
          } else {
            row = {}
          }
          for (const col of columns) {
            col.value = valueCorrection(col.value, col.metadata)

            if (this.arrayRowMode) {
              row.push(col.value)
            } else {
              const exi = row[col.metadata.colName]
              if (exi !== undefined) {
                if (exi instanceof Array) {
                  exi.push(col.value)
                } else {
                  row[col.metadata.colName] = [exi, col.value]
                }
              } else {
                row[col.metadata.colName] = col.value
              }
            }
          }

          if (this.stream) {
            if (this._isBatch) {
              // dont stream recordset with output values in batches
              if (row.___return___) {
                batchLastRow = row
              } else {
                this.emit('row', row)
              }
            } else {
              this.emit('row', row)
            }
          } else {
            recordset.push(row)
          }
        })

        if (this._isBatch) {
          if (Object.keys(this.parameters).length) {
            for (const name in this.parameters) {
              if (!objectHasProperty(this.parameters, name)) {
                continue
              }
              const param = this.parameters[name]

              try {
                param.value = getTediousType(param.type).validate(param.value, this.parent.collation)
              } catch (e) {
                e.message = `Validation failed for parameter '${name}'. ${e.message}`
                const err = new RequestError(e, 'EPARAM')

                this.parent.release(connection)
                return callback(err)
              }
            }

            const declarations = []
            for (const name in this.parameters) {
              if (!objectHasProperty(this.parameters, name)) {
                continue
              }
              const param = this.parameters[name]
              declarations.push(`@${name} ${declare(param.type, param)}`)
            }

            const assigns = []
            for (const name in this.parameters) {
              if (!objectHasProperty(this.parameters, name)) {
                continue
              }
              const param = this.parameters[name]
              assigns.push(`@${name} = ${cast(param.value, param.type, param)}`)
            }

            const selects = []
            for (const name in this.parameters) {
              if (!objectHasProperty(this.parameters, name)) {
                continue
              }
              const param = this.parameters[name]
              if (param.io === 2) {
                selects.push(`@${name} as [${name}]`)
              }
            }

            batchHasOutput = selects.length > 0

            req.sqlTextOrProcedure = `declare ${declarations.join(', ')};select ${assigns.join(', ')};${req.sqlTextOrProcedure};${batchHasOutput ? (`select 1 as [___return___], ${selects.join(', ')}`) : ''}`
          }
        } else {
          for (const name in this.parameters) {
            if (!objectHasProperty(this.parameters, name)) {
              continue
            }
            const param = this.parameters[name]
            if (param.io === 1) {
              req.addParameter(param.name, getTediousType(param.type), parameterCorrection(param.value), { length: param.length, scale: param.scale, precision: param.precision })
            } else {
              req.addOutputParameter(param.name, getTediousType(param.type), parameterCorrection(param.value), { length: param.length, scale: param.scale, precision: param.precision })
            }
          }
        }

        try {
          connection[this._isBatch ? 'execSqlBatch' : 'execSql'](req)
        } catch (error) {
          handleError(true, connection, error)
        }
      })
    })
  }

  /*
  Execute stored procedure with specified parameters.
  */

  _execute (procedure, callback) {
    super._execute(procedure, err => {
      if (err) return callback(err)

      const recordsets = []
      const recordsetcolumns = []
      const errors = []
      const errorHandlers = {}
      const output = {}
      const rowsAffected = []

      let columns = {}
      let recordset = []
      let returnValue = 0
      let isChunkedRecordset = false
      let chunksBuffer = null
      let hasReturned = false

      const handleError = (doReturn, connection, info) => {
        let err = new Error(info.message)
        err.info = info
        err = new RequestError(err, 'EREQUEST')

        if (this.stream) {
          this.emit('error', err)
        } else {
          if (doReturn && !hasReturned) {
            if (connection) {
              for (const event in errorHandlers) {
                connection.removeListener(event, errorHandlers[event])
              }

              this.parent.release(connection)
            }

            hasReturned = true
            callback(err)
          }
        }

        // we must collect errors even in stream mode
        errors.push(err)
      }

      const handleInfo = msg => {
        this.emit('info', {
          message: msg.message,
          number: msg.number,
          state: msg.state,
          class: msg.class,
          lineNumber: msg.lineNumber,
          serverName: msg.serverName,
          procName: msg.procName
        })
      }

      this.parent.acquire(this, (err, connection, config) => {
        if (err) return callback(err)

        debug('connection(%d): borrowed to request #%d', IDS.get(connection), IDS.get(this))

        let row

        if (this.canceled) {
          debug('request(%d): canceled', IDS.get(this))
          this.parent.release(connection)
          return callback(new RequestError('Canceled.', 'ECANCEL'))
        }

        this._cancel = () => {
          debug('request(%d): cancel', IDS.get(this))
          connection.cancel()
        }

        // attach handler to handle multiple error messages
        connection.on('infoMessage', errorHandlers.infoMessage = handleInfo)
        connection.on('errorMessage', errorHandlers.errorMessage = handleError.bind(null, false, connection))
        connection.on('error', errorHandlers.error = handleError.bind(null, true, connection))

        if (debug.enabled) {
          // log stored procedure executions and provided parameters
          const params = Object.keys(this.parameters).map(k => this.parameters[k])
          // cut long string parameters short to keep log somewhat clean
          const logValue = s => typeof s === 'string' && s.length > 50 ? s.substring(0, 47) + '...' : s
          // format parameter names as 'my_parameter [sql.Int]'
          const logName = param => param.name + ' [sql.' + param.type.name + ']'
          const logParams = {}
          params.forEach(p => { logParams[logName(p)] = logValue(p.value) })
          debug('request(%d): execute %s %O', IDS.get(this), procedure, logParams)
        }

        const req = new tds.Request(procedure, err => {
          // to make sure we handle no-sql errors as well
          if (err && (!errors.length || (errors.length && err.message !== errors[errors.length - 1].message))) {
            err = new RequestError(err, 'EREQUEST')
            if (this.stream) this.emit('error', err)
            errors.push(err)
          }

          delete this._cancel

          let error
          if (errors.length && !this.stream) {
            error = errors.pop()
            error.precedingErrors = errors
          }

          if (!hasReturned) {
            for (const event in errorHandlers) {
              connection.removeListener(event, errorHandlers[event])
            }

            this.parent.release(connection)
            hasReturned = true

            if (error) {
              debug('request(%d): failed', IDS.get(this), error)
            } else {
              debug('request(%d): complete', IDS.get(this))
            }

            if (this.stream) {
              callback(null, null, output, returnValue, rowsAffected, recordsetcolumns)
            } else {
              callback(error, recordsets, output, returnValue, rowsAffected, recordsetcolumns)
            }
          }
        })

        this._setCurrentRequest(req)

        req.on('columnMetadata', metadata => {
          columns = createColumns(metadata, this.arrayRowMode)

          isChunkedRecordset = false
          if ((metadata.length === 1) && (metadata[0].colName === JSON_COLUMN_ID || metadata[0].colName === XML_COLUMN_ID)) {
            isChunkedRecordset = true
            chunksBuffer = []
          }

          if (this.stream) this.emit('recordset', columns)
          if (this.arrayRowMode) recordsetcolumns.push(columns)
        })

        req.on('row', columns => {
          if (!recordset) recordset = []

          if (isChunkedRecordset) {
            return chunksBuffer.push(columns[0].value)
          }

          if (this.arrayRowMode) {
            row = []
          } else {
            row = {}
          }
          for (const col of columns) {
            col.value = valueCorrection(col.value, col.metadata)

            if (this.arrayRowMode) {
              row.push(col.value)
            } else {
              const exi = row[col.metadata.colName]
              if (exi != null) {
                if (exi instanceof Array) {
                  exi.push(col.value)
                } else {
                  row[col.metadata.colName] = [exi, col.value]
                }
              } else {
                row[col.metadata.colName] = col.value
              }
            }
          }

          if (this.stream) {
            this.emit('row', row)
          } else {
            recordset.push(row)
          }
        })

        req.on('doneInProc', (rowCount, more) => {
          if (rowCount != null) {
            rowsAffected.push(rowCount)
            if (this.stream) {
              this.emit('rowsaffected', rowCount)
            }
          }

          // filter empty recordsets when NOCOUNT is OFF
          if (Object.keys(columns).length === 0) return

          if (isChunkedRecordset) {
            if (columns[JSON_COLUMN_ID] && config.parseJSON === true) {
              try {
                if (chunksBuffer.length === 0) {
                  row = null
                } else {
                  row = JSON.parse(chunksBuffer.join(''))
                }
              } catch (ex) {
                row = null
                const ex2 = new RequestError(new Error(`Failed to parse incoming JSON. ${ex.message}`), 'EJSON')

                if (this.stream) this.emit('error', ex2)

                // we must collect errors even in stream mode
                errors.push(ex2)
              }
            } else {
              row = {}
              row[Object.keys(columns)[0]] = chunksBuffer.join('')
            }

            chunksBuffer = null

            if (this.stream) {
              this.emit('row', row)
            } else {
              recordset.push(row)
            }
          }

          if (!this.stream) {
            // all rows of current recordset loaded
            Object.defineProperty(recordset, 'columns', {
              enumerable: false,
              configurable: true,
              value: columns
            })

            Object.defineProperty(recordset, 'toTable', {
              enumerable: false,
              configurable: true,
              value (name) { return Table.fromRecordset(this, name) }
            })

            recordsets.push(recordset)
          }

          recordset = []
          columns = {}
        })

        req.on('doneProc', (rowCount, more, returnStatus) => {
          returnValue = returnStatus
        })

        req.on('returnValue', (parameterName, value, metadata) => {
          output[parameterName] = value
        })

        for (const name in this.parameters) {
          if (!objectHasProperty(this.parameters, name)) {
            continue
          }
          const param = this.parameters[name]
          if (param.io === 1) {
            req.addParameter(param.name, getTediousType(param.type), parameterCorrection(param.value), { length: param.length, scale: param.scale, precision: param.precision })
          } else {
            req.addOutputParameter(param.name, getTediousType(param.type), parameterCorrection(param.value), { length: param.length, scale: param.scale, precision: param.precision })
          }
        }

        connection.callProcedure(req)
      })
    })
  }

  _pause () {
    super._pause()
    if (this._currentRequest) {
      this._currentRequest.pause()
    }
  }

  _resume () {
    super._resume()
    if (this._currentRequest) {
      this._currentRequest.resume()
    }
  }
}

module.exports = Request
'use strict'

const debug = require('debug')('mssql:tedi')
const BaseTransaction = require('../base/transaction')
const { IDS } = require('../utils')
const TransactionError = require('../error/transaction-error')

class Transaction extends BaseTransaction {
  constructor (parent) {
    super(parent)

    this._abort = () => {
      if (!this._rollbackRequested) {
        // transaction interrupted because of XACT_ABORT

        const pc = this._acquiredConnection

        // defer releasing so connection can switch from SentClientRequest to LoggedIn state
        setImmediate(this.parent.release.bind(this.parent), pc)

        this._acquiredConnection.removeListener('rollbackTransaction', this._abort)
        this._acquiredConnection = null
        this._acquiredConfig = null
        this._aborted = true

        this.emit('rollback', true)
      }
    }
  }

  _begin (isolationLevel, callback) {
    super._begin(isolationLevel, err => {
      if (err) return callback(err)

      debug('transaction(%d): begin', IDS.get(this))

      this.parent.acquire(this, (err, connection, config) => {
        if (err) return callback(err)

        this._acquiredConnection = connection
        this._acquiredConnection.on('rollbackTransaction', this._abort)
        this._acquiredConfig = config

        connection.beginTransaction(err => {
          if (err) err = new TransactionError(err)

          debug('transaction(%d): begun', IDS.get(this))

          callback(err)
        }, this.name, this.isolationLevel)
      })
    })
  }

  _commit (callback) {
    super._commit(err => {
      if (err) return callback(err)

      debug('transaction(%d): commit', IDS.get(this))

      this._acquiredConnection.commitTransaction(err => {
        if (err) err = new TransactionError(err)

        this._acquiredConnection.removeListener('rollbackTransaction', this._abort)
        this.parent.release(this._acquiredConnection)
        this._acquiredConnection = null
        this._acquiredConfig = null

        if (!err) debug('transaction(%d): commited', IDS.get(this))

        callback(err)
      })
    })
  }

  _rollback (callback) {
    super._rollback(err => {
      if (err) return callback(err)

      debug('transaction(%d): rollback', IDS.get(this))

      this._acquiredConnection.rollbackTransaction(err => {
        if (err) err = new TransactionError(err)

        this._acquiredConnection.removeListener('rollbackTransaction', this._abort)
        this.parent.release(this._acquiredConnection)
        this._acquiredConnection = null
        this._acquiredConfig = null

        if (!err) debug('transaction(%d): rolled back', IDS.get(this))

        callback(err)
      })
    })
  }
}

module.exports = Transaction
'use strict'

const msnodesql = require('msnodesqlv8')
const debug = require('debug')('mssql:msv8')
const BaseConnectionPool = require('../base/connection-pool')
const { IDS, INCREMENT } = require('../utils')
const shared = require('../shared')
const ConnectionError = require('../error/connection-error')
const { platform } = require('os')

const CONNECTION_DRIVER = ['darwin', 'linux'].includes(platform()) ? 'ODBC Driver 17 for SQL Server' : 'SQL Server Native Client 11.0'
const CONNECTION_STRING_PORT = `Driver=${CONNECTION_DRIVER};Server=#{server},#{port};Database=#{database};Uid=#{user};Pwd=#{password};Trusted_Connection=#{trusted};Encrypt=#{encrypt};`
const CONNECTION_STRING_NAMED_INSTANCE = `Driver=${CONNECTION_DRIVER};Server=#{server}\\#{instance};Database=#{database};Uid=#{user};Pwd=#{password};Trusted_Connection=#{trusted};Encrypt=#{encrypt};`

class ConnectionPool extends BaseConnectionPool {
  _poolCreate () {
    return new shared.Promise((resolve, reject) => {
      let defaultConnectionString = CONNECTION_STRING_PORT

      if (this.config.options.instanceName != null) {
        defaultConnectionString = CONNECTION_STRING_NAMED_INSTANCE
      }

      this.config.requestTimeout = this.config.requestTimeout || this.config.timeout || 15000

      const cfg = {
        conn_str: this.config.connectionString || defaultConnectionString,
        conn_timeout: (this.config.connectionTimeout || this.config.timeout || 15000) / 1000
      }

      cfg.conn_str = cfg.conn_str.replace(/#{([^}]*)}/g, (p) => {
        const key = p.substr(2, p.length - 3)

        switch (key) {
          case 'instance':
            return this.config.options.instanceName
          case 'trusted':
            return this.config.options.trustedConnection ? 'Yes' : 'No'
          case 'encrypt':
            return this.config.options.encrypt ? 'Yes' : 'No'
          default:
            return this.config[key] != null ? this.config[key] : ''
        }
      })

      const connedtionId = INCREMENT.Connection++
      debug('pool(%d): connection #%d created', IDS.get(this), connedtionId)
      debug('connection(%d): establishing', connedtionId)

      if (typeof this.config.beforeConnect === 'function') {
        this.config.beforeConnect(cfg)
      }

      msnodesql.open(cfg, (err, tds) => {
        if (err) {
          err = new ConnectionError(err)
          return reject(err)
        }

        IDS.add(tds, 'Connection', connedtionId)
        tds.setUseUTC(this.config.options.useUTC)
        debug('connection(%d): established', IDS.get(tds))
        resolve(tds)
      })
    })
  }

  _poolValidate (tds) {
    if (tds && !tds.hasError) {
      return !this.config.validateConnection || new shared.Promise((resolve) => {
        tds.query('SELECT 1;', (err) => {
          resolve(!err)
        })
      })
    }
    return false
  }

  _poolDestroy (tds) {
    return new shared.Promise((resolve, reject) => {
      if (!tds) {
        resolve()
        return
      }
      debug('connection(%d): destroying', IDS.get(tds))
      tds.close(() => {
        debug('connection(%d): destroyed', IDS.get(tds))
        resolve()
      })
    })
  }
}

module.exports = ConnectionPool
'use strict'

const base = require('../base')
const ConnectionPool = require('./connection-pool')
const Transaction = require('./transaction')
const Request = require('./request')

module.exports = Object.assign({
  ConnectionPool,
  Transaction,
  Request,
  PreparedStatement: base.PreparedStatement
}, base.exports)

Object.defineProperty(module.exports, 'Promise', {
  enumerable: true,
  get: () => {
    return base.Promise
  },
  set: (value) => {
    base.Promise = value
  }
})

Object.defineProperty(module.exports, 'valueHandler', {
  enumerable: true,
  value: base.valueHandler,
  writable: false,
  configurable: false
})

base.driver.name = 'msnodesqlv8'
base.driver.ConnectionPool = ConnectionPool
base.driver.Transaction = Transaction
base.driver.Request = Request
'use strict'

const msnodesql = require('msnodesqlv8')
const debug = require('debug')('mssql:msv8')
const BaseRequest = require('../base/request')
const RequestError = require('../error/request-error')
const { IDS, objectHasProperty } = require('../utils')
const { TYPES, DECLARATIONS, declare } = require('../datatypes')
const { PARSERS: UDT } = require('../udt')
const Table = require('../table')
const { valueHandler } = require('../shared')

const JSON_COLUMN_ID = 'JSON_F52E2B61-18A1-11d1-B105-00805F49916B'
const XML_COLUMN_ID = 'XML_F52E2B61-18A1-11d1-B105-00805F49916B'
const EMPTY_BUFFER = Buffer.alloc(0)

const castParameter = function (value, type) {
  if (value == null) {
    if ((type === TYPES.Binary) || (type === TYPES.VarBinary) || (type === TYPES.Image)) {
      // msnodesql has some problems with NULL values in those types, so we need to replace it with empty buffer
      return EMPTY_BUFFER
    }

    return null
  }

  switch (type) {
    case TYPES.VarChar:
    case TYPES.NVarChar:
    case TYPES.Char:
    case TYPES.NChar:
    case TYPES.Xml:
    case TYPES.Text:
    case TYPES.NText:
      if ((typeof value !== 'string') && !(value instanceof String)) {
        value = value.toString()
      }
      break

    case TYPES.Int:
    case TYPES.TinyInt:
    case TYPES.BigInt:
    case TYPES.SmallInt:
      if ((typeof value !== 'number') && !(value instanceof Number)) {
        value = parseInt(value)
        if (isNaN(value)) { value = null }
      }
      break

    case TYPES.Float:
    case TYPES.Real:
    case TYPES.Decimal:
    case TYPES.Numeric:
    case TYPES.SmallMoney:
    case TYPES.Money:
      if ((typeof value !== 'number') && !(value instanceof Number)) {
        value = parseFloat(value)
        if (isNaN(value)) { value = null }
      }
      break

    case TYPES.Bit:
      if ((typeof value !== 'boolean') && !(value instanceof Boolean)) {
        value = Boolean(value)
      }
      break

    case TYPES.DateTime:
    case TYPES.SmallDateTime:
    case TYPES.DateTimeOffset:
    case TYPES.Date:
      if (!(value instanceof Date)) {
        value = new Date(value)
      }
      break

    case TYPES.Binary:
    case TYPES.VarBinary:
    case TYPES.Image:
      if (!(value instanceof Buffer)) {
        value = Buffer.from(value.toString())
      }
      break
    case TYPES.TVP:
      value = msnodesql.TvpFromTable(value)
      break
  }

  return value
}

const createColumns = function (metadata, arrayRowMode) {
  let out = {}
  if (arrayRowMode) out = []
  for (let index = 0, length = metadata.length; index < length; index++) {
    const column = metadata[index]
    const colName = column.name
    const outColumn = {
      index,
      name: column.name,
      length: column.size,
      type: DECLARATIONS[column.sqlType],
      nullable: column.nullable
    }

    if (column.udtType != null) {
      outColumn.udt = {
        name: column.udtType
      }

      if (DECLARATIONS[column.udtType]) {
        outColumn.type = DECLARATIONS[column.udtType]
      }
    }
    if (arrayRowMode) {
      out.push(outColumn)
    } else {
      out[colName] = outColumn
    }
  }

  return out
}

const valueCorrection = function (value, metadata) {
  const type = metadata && objectHasProperty(metadata, 'sqlType') && objectHasProperty(DECLARATIONS, metadata.sqlType)
    ? DECLARATIONS[metadata.sqlType]
    : null
  if (type && valueHandler.has(type)) {
    return valueHandler.get(type)(value)
  } else if ((metadata.sqlType === 'time') && (value != null)) {
    value.setFullYear(1970)
    return value
  } else if ((metadata.sqlType === 'udt') && (value != null)) {
    if (UDT[metadata.udtType]) {
      return UDT[metadata.udtType](value)
    } else {
      return value
    }
  } else {
    return value
  }
}

class Request extends BaseRequest {
  _batch (batch, callback) {
    this._isBatch = true
    this._query(batch, callback)
  }

  _bulk (table, options, callback) {
    super._bulk(table, options, err => {
      if (err) return callback(err)

      try {
        table._makeBulk()
      } catch (e) {
        return callback(new RequestError(e, 'EREQUEST'))
      }

      if (!table.name) {
        setImmediate(callback, new RequestError('Table name must be specified for bulk insert.', 'ENAME'))
      }

      if (table.name.charAt(0) === '@') {
        setImmediate(callback, new RequestError("You can't use table variables for bulk insert.", 'ENAME'))
      }

      this.parent.acquire(this, (err, connection) => {
        let hasReturned = false
        if (!err) {
          debug('connection(%d): borrowed to request #%d', IDS.get(connection), IDS.get(this))

          if (this.canceled) {
            debug('request(%d): canceled', IDS.get(this))
            this.parent.release(connection)
            return callback(new RequestError('Canceled.', 'ECANCEL'))
          }

          const done = (err, rowCount) => {
            if (hasReturned) {
              return
            }

            hasReturned = true

            if (err) {
              if ((typeof err.sqlstate === 'string') && (err.sqlstate.toLowerCase() === '08s01')) {
                connection.hasError = true
              }

              err = new RequestError(err)
              err.code = 'EREQUEST'
            }

            this.parent.release(connection)

            if (err) {
              callback(err)
            } else {
              callback(null, table.rows.length)
            }
          }

          const go = () => {
            const tm = connection.tableMgr()
            return tm.bind(table.path.replace(/\[|\]/g, ''), mgr => {
              if (mgr.columns.length === 0) {
                return done(new RequestError('Table was not found on the server.', 'ENAME'))
              }

              const rows = []
              for (const row of Array.from(table.rows)) {
                const item = {}
                for (let index = 0; index < table.columns.length; index++) {
                  const col = table.columns[index]
                  item[col.name] = row[index]
                }

                rows.push(item)
              }

              mgr.insertRows(rows, done)
            })
          }

          if (table.create) {
            let objectid
            if (table.temporary) {
              objectid = `tempdb..[${table.name}]`
            } else {
              objectid = table.path
            }

            return connection.queryRaw(`if object_id('${objectid.replace(/'/g, '\'\'')}') is null ${table.declare()}`, function (err) {
              if (err) { return done(err) }
              go()
            })
          } else {
            go()
          }
        }
      })
    })
  }

  _query (command, callback) {
    super._query(command, err => {
      if (err) return callback(err)

      if (command.length === 0) {
        return callback(null, [])
      }

      const recordsets = []
      const recordsetcolumns = []
      const errors = []
      const errorHandlers = {}
      const output = {}
      const rowsAffected = []

      let hasReturned = false
      let row = null
      let columns = null
      let recordset = null
      let handleOutput = false
      let isChunkedRecordset = false
      let chunksBuffer = null

      const handleError = (req, connection, info, moreErrors) => {
        const doReturn = !moreErrors
        if ((typeof info.sqlstate === 'string') && (info.sqlstate.toLowerCase() === '08s01')) {
          connection.hasError = true
        }

        const err = new RequestError(info, 'EREQUEST')
        err.code = 'EREQUEST'

        if (this.stream) {
          this.emit('error', err)
        } else {
          if (doReturn && !hasReturned) {
            if (req) {
              for (const event in errorHandlers) {
                req.removeListener(event, errorHandlers[event])
              }
            }
            if (connection) {
              this.parent.release(connection)
              delete this._cancel

              debug('request(%d): failed', IDS.get(this), err)
            }

            let previous
            if (errors.length) {
              previous = errors.pop()
              if (!err.precedingErrors) {
                err.precedingErrors = []
              }
              err.precedingErrors.push(previous)
            }

            hasReturned = true
            callback(err)
          }
        }

        // we must collect errors even in stream mode
        errors.push(err)
      }

      // nested = function is called by this.execute

      if (!this._nested) {
        const input = []
        for (const name in this.parameters) {
          if (!objectHasProperty(this.parameters, name)) {
            continue
          }
          const param = this.parameters[name]
          input.push(`@${param.name} ${declare(param.type, param)}`)
        }

        const sets = []
        for (const name in this.parameters) {
          if (!objectHasProperty(this.parameters, name)) {
            continue
          }
          const param = this.parameters[name]
          if (param.io === 1) {
            sets.push(`set @${param.name}=?`)
          }
        }

        const output = []
        for (const name in this.parameters) {
          if (!objectHasProperty(this.parameters, name)) {
            continue
          }
          const param = this.parameters[name]
          if (param.io === 2) {
            output.push(`@${param.name} as '${param.name}'`)
          }
        }

        if (input.length) command = `declare ${input.join(',')};${sets.join(';')};${command};`
        if (output.length) {
          command += `select ${output.join(',')};`
          handleOutput = true
        }
      }

      this.parent.acquire(this, (err, connection, config) => {
        if (err) return callback(err)

        debug('connection(%d): borrowed to request #%d', IDS.get(connection), IDS.get(this))

        if (this.canceled) {
          debug('request(%d): canceled', IDS.get(this))
          this.parent.release(connection)
          return callback(new RequestError('Canceled.', 'ECANCEL'))
        }

        const params = []
        for (const name in this.parameters) {
          if (!objectHasProperty(this.parameters, name)) {
            continue
          }
          const param = this.parameters[name]
          if (param.io === 1 || (param.io === 2 && param.value)) {
            params.push(castParameter(param.value, param.type))
          }
        }

        debug('request(%d): query', IDS.get(this), command)

        const req = connection.queryRaw({
          query_str: command,
          query_timeout: config.requestTimeout / 1000 // msnodesqlv8 timeouts are in seconds (<1 second not supported)
        }, params)

        this._setCurrentRequest(req)

        this._cancel = () => {
          debug('request(%d): cancel', IDS.get(this))
          req.cancelQuery(err => {
            if (err) debug('request(%d): failed to cancel', IDS.get(this), err)
            // this fixes an issue where paused connections don't emit a done event
            try {
              if (req.isPaused()) req.emit('done')
            } catch (err) {
              // do nothing
            }
          })
        }

        req.on('meta', metadata => {
          if (row) {
            if (isChunkedRecordset) {
              const concatenatedChunks = chunksBuffer.join('')
              if ((columns[0].name === JSON_COLUMN_ID) && (config.parseJSON === true)) {
                try {
                  if (concatenatedChunks === '') {
                    row = null
                  } else {
                    row = JSON.parse(concatenatedChunks)
                  }
                  if (!this.stream) { recordsets[recordsets.length - 1][0] = row }
                } catch (ex) {
                  row = null
                  const ex2 = new RequestError(`Failed to parse incoming JSON. ${ex.message}`, 'EJSON')

                  if (this.stream) {
                    this.emit('error', ex2)
                  } else {
                    console.error(ex2)
                  }
                }
              } else {
                row[columns[0].name] = concatenatedChunks
              }

              chunksBuffer = null
              if (row && row.___return___ == null) {
                // row with ___return___ col is the last row
                if (this.stream && !this.paused) this.emit('row', row)
              }
            }
          }

          row = null
          columns = metadata
          recordset = []

          Object.defineProperty(recordset, 'columns', {
            enumerable: false,
            configurable: true,
            value: createColumns(metadata, this.arrayRowMode)
          })

          Object.defineProperty(recordset, 'toTable', {
            enumerable: false,
            configurable: true,
            value (name) { return Table.fromRecordset(this, name) }
          })

          isChunkedRecordset = false
          if ((metadata.length === 1) && (metadata[0].name === JSON_COLUMN_ID || metadata[0].name === XML_COLUMN_ID)) {
            isChunkedRecordset = true
            chunksBuffer = []
          }

          let hasReturnColumn = false
          if (recordset.columns.___return___ != null) {
            hasReturnColumn = true
          } else if (this.arrayRowMode) {
            for (let i = 0; i < columns.length; i++) {
              if (columns[i].name === '___return___') {
                hasReturnColumn = true
                break
              }
            }
          }
          if (this.stream) {
            if (!hasReturnColumn) {
              this.emit('recordset', recordset.columns)
            }
          } else {
            recordsets.push(recordset)
          }
          if (this.arrayRowMode) recordsetcolumns.push(recordset.columns)
        })

        req.on('row', rownumber => {
          if (row && isChunkedRecordset) return

          if (this.arrayRowMode) {
            row = []
          } else {
            row = {}
          }

          if (!this.stream) recordset.push(row)
        })

        req.on('column', (idx, data, more) => {
          if (isChunkedRecordset) {
            chunksBuffer.push(data)
          } else {
            data = valueCorrection(data, columns[idx])

            if (this.arrayRowMode) {
              row.push(data)
            } else {
              const exi = row[columns[idx].name]
              if (exi != null) {
                if (exi instanceof Array) {
                  exi.push(data)
                } else {
                  row[columns[idx].name] = [exi, data]
                }
              } else {
                row[columns[idx].name] = data
              }
            }
            let hasReturnColumn = false
            if (row && row.___return___ != null) {
              hasReturnColumn = true
            } else if (this.arrayRowMode) {
              for (let i = 0; i < columns.length; i++) {
                if (columns[i].name === '___return___') {
                  hasReturnColumn = true
                  break
                }
              }
            }
            if (!hasReturnColumn) {
              if (this.stream && !this.paused && idx === columns.length - 1) {
                this.emit('row', row)
              }
            }
          }
        })

        req.on('rowcount', rowCount => {
          rowsAffected.push(rowCount)
          if (this.stream) {
            this.emit('rowsaffected', rowCount)
          }
        })

        req.on('info', msg => {
          if ((/^\[Microsoft\]\[SQL Server Native Client 11\.0\](?:\[SQL Server\])?([\s\S]*)$/).exec(msg.message)) {
            msg.message = RegExp.$1
          }

          this.emit('info', {
            message: msg.message,
            number: msg.code,
            state: msg.sqlstate,
            class: msg.class || 0,
            lineNumber: msg.lineNumber || 0,
            serverName: msg.serverName,
            procName: msg.procName
          })

          // query terminated
          if (msg.code === 3621 && !hasReturned) {
            // if the query has been terminated it's probably best to throw the last meaningful error if there was one
            // pop it off the errors array so it doesn't get put in twice
            const error = errors.length > 0 ? errors.pop() : msg
            handleError(req, connection, error.originalError || error, false)
          }
        })

        req.on('error', errorHandlers.error = handleError.bind(null, req, connection))

        req.once('done', () => {
          if (hasReturned) {
            return
          }

          hasReturned = true

          if (!this._nested) {
            if (row) {
              if (isChunkedRecordset) {
                const concatenatedChunks = chunksBuffer.join('')
                if ((columns[0].name === JSON_COLUMN_ID) && (config.parseJSON === true)) {
                  try {
                    if (concatenatedChunks === '') {
                      row = null
                    } else {
                      row = JSON.parse(concatenatedChunks)
                    }
                    if (!this.stream) { recordsets[recordsets.length - 1][0] = row }
                  } catch (ex) {
                    row = null
                    const ex2 = new RequestError(`Failed to parse incoming JSON. ${ex.message}`, 'EJSON')

                    if (this.stream) {
                      this.emit('error', ex2)
                    } else {
                      console.error(ex2)
                    }
                  }
                } else {
                  row[columns[0].name] = concatenatedChunks
                }

                chunksBuffer = null
                if (row && row.___return___ == null) {
                  // row with ___return___ col is the last row
                  if (this.stream && !this.paused) { this.emit('row', row) }
                }
              }
            }

            // do we have output parameters to handle?
            if (handleOutput && recordsets.length) {
              const last = recordsets.pop()[0]

              for (const name in this.parameters) {
                if (!objectHasProperty(this.parameters, name)) {
                  continue
                }
                const param = this.parameters[name]
                if (param.io === 2) {
                  output[param.name] = last[param.name]
                }
              }
            }
          }

          delete this._cancel
          this.parent.release(connection)

          debug('request(%d): completed', IDS.get(this))

          if (this.stream) {
            callback(null, this._nested ? row : null, output, rowsAffected, recordsetcolumns)
          } else {
            callback(null, recordsets, output, rowsAffected, recordsetcolumns)
          }
        })
      })
    })
  }

  _execute (procedure, callback) {
    super._execute(procedure, err => {
      if (err) return callback(err)

      const params = []
      for (const name in this.parameters) {
        if (!objectHasProperty(this.parameters, name)) {
          continue
        }
        const param = this.parameters[name]
        if (param.io === 2) {
          params.push(`@${param.name} ${declare(param.type, param)}`)
        }
      }

      // set output params w/ values
      const sets = []
      for (const name in this.parameters) {
        if (!objectHasProperty(this.parameters, name)) {
          continue
        }
        const param = this.parameters[name]
        if (param.io === 2 && param.value) {
          sets.push(`set @${param.name}=?`)
        }
      }

      let cmd = `declare ${['@___return___ int'].concat(params).join(', ')};${sets.join(';')};`
      cmd += `exec @___return___ = ${procedure} `

      const spp = []
      for (const name in this.parameters) {
        if (!objectHasProperty(this.parameters, name)) {
          continue
        }
        const param = this.parameters[name]

        if (param.io === 2) {
          // output parameter
          spp.push(`@${param.name}=@${param.name} output`)
        } else {
          // input parameter
          spp.push(`@${param.name}=?`)
        }
      }

      const params2 = []
      for (const name in this.parameters) {
        if (!objectHasProperty(this.parameters, name)) {
          continue
        }
        const param = this.parameters[name]
        if (param.io === 2) {
          params2.push(`@${param.name} as '${param.name}'`)
        }
      }

      cmd += `${spp.join(', ')};`
      cmd += `select ${['@___return___ as \'___return___\''].concat(params2).join(', ')};`

      this._nested = true

      this._query(cmd, (err, recordsets, output, rowsAffected, recordsetcolumns) => {
        this._nested = false

        if (err) return callback(err)

        let last, returnValue
        if (this.stream) {
          last = recordsets
        } else {
          last = recordsets.pop()
          if (last) last = last[0]
        }
        const lastColumns = recordsetcolumns.pop()

        if (last && this.arrayRowMode && lastColumns) {
          let returnColumnIdx = null
          const parametersNameToLastIdxDict = {}
          for (let i = 0; i < lastColumns.length; i++) {
            if (lastColumns[i].name === '___return___') {
              returnColumnIdx = i
            } else if (objectHasProperty(this.parameters, lastColumns[i].name)) {
              parametersNameToLastIdxDict[lastColumns[i].name] = i
            }
          }
          if (returnColumnIdx != null) {
            returnValue = last[returnColumnIdx]
          }
          for (const name in parametersNameToLastIdxDict) {
            if (!objectHasProperty(parametersNameToLastIdxDict, name)) {
              continue
            }
            const param = this.parameters[name]
            if (param.io === 2) {
              output[param.name] = last[parametersNameToLastIdxDict[name]]
            }
          }
        } else {
          if (last && (last.___return___ != null)) {
            returnValue = last.___return___

            for (const name in this.parameters) {
              if (!objectHasProperty(this.parameters, name)) {
                continue
              }
              const param = this.parameters[name]
              if (param.io === 2) {
                output[param.name] = last[param.name]
              }
            }
          }
        }
        if (this.stream) {
          callback(null, null, output, returnValue, rowsAffected, recordsetcolumns)
        } else {
          callback(null, recordsets, output, returnValue, rowsAffected, recordsetcolumns)
        }
      })
    })
  }

  _pause () {
    super._pause()
    if (this._currentRequest) {
      this._currentRequest.pauseQuery()
    }
  }

  _resume () {
    super._resume()
    if (this._currentRequest) {
      this._currentRequest.resumeQuery()
    }
  }
}

module.exports = Request
'use strict'

const debug = require('debug')('mssql:msv8')
const BaseTransaction = require('../base/transaction')
const { IDS } = require('../utils')
const Request = require('./request')
const ISOLATION_LEVEL = require('../isolationlevel')
const TransactionError = require('../error/transaction-error')

const isolationLevelDeclaration = function (type) {
  switch (type) {
    case ISOLATION_LEVEL.READ_UNCOMMITTED: return 'READ UNCOMMITTED'
    case ISOLATION_LEVEL.READ_COMMITTED: return 'READ COMMITTED'
    case ISOLATION_LEVEL.REPEATABLE_READ: return 'REPEATABLE READ'
    case ISOLATION_LEVEL.SERIALIZABLE: return 'SERIALIZABLE'
    case ISOLATION_LEVEL.SNAPSHOT: return 'SNAPSHOT'
    default: throw new TransactionError('Invalid isolation level.')
  }
}

class Transaction extends BaseTransaction {
  _begin (isolationLevel, callback) {
    super._begin(isolationLevel, err => {
      if (err) return callback(err)

      debug('transaction(%d): begin', IDS.get(this))

      this.parent.acquire(this, (err, connection, config) => {
        if (err) return callback(err)

        this._acquiredConnection = connection
        this._acquiredConfig = config

        const req = new Request(this)
        req.stream = false
        req.query(`set transaction isolation level ${isolationLevelDeclaration(this.isolationLevel)};begin tran;`, err => {
          if (err) {
            this.parent.release(this._acquiredConnection)
            this._acquiredConnection = null
            this._acquiredConfig = null

            return callback(err)
          }

          debug('transaction(%d): begun', IDS.get(this))

          callback(null)
        })
      })
    })
  }

  _commit (callback) {
    super._commit(err => {
      if (err) return callback(err)

      debug('transaction(%d): commit', IDS.get(this))

      const req = new Request(this)
      req.stream = false
      req.query('commit tran', err => {
        if (err) err = new TransactionError(err)

        this.parent.release(this._acquiredConnection)
        this._acquiredConnection = null
        this._acquiredConfig = null

        if (!err) debug('transaction(%d): commited', IDS.get(this))

        callback(null)
      })
    })
  }

  _rollback (callback) {
    super._commit(err => {
      if (err) return callback(err)

      debug('transaction(%d): rollback', IDS.get(this))

      const req = new Request(this)
      req.stream = false
      req.query('rollback tran', err => {
        if (err) err = new TransactionError(err)

        this.parent.release(this._acquiredConnection)
        this._acquiredConnection = null
        this._acquiredConfig = null

        if (!err) debug('transaction(%d): rolled back', IDS.get(this))

        callback(null)
      })
    })
  }
}

module.exports = Transaction
'use strict'

const MSSQLError = require('./mssql-error')

/**
 * Class ConnectionError.
 */

class ConnectionError extends MSSQLError {
  /**
   * Creates a new ConnectionError.
   *
   * @param {String} message Error message.
   * @param {String} [code] Error code.
   */

  constructor (message, code) {
    super(message, code)

    this.name = 'ConnectionError'
  }
}

module.exports = ConnectionError
'use strict'

const ConnectionError = require('./connection-error')
const MSSQLError = require('./mssql-error')
const PreparedStatementError = require('./prepared-statement-error')
const RequestError = require('./request-error')
const TransactionError = require('./transaction-error')

module.exports = {
  ConnectionError,
  MSSQLError,
  PreparedStatementError,
  RequestError,
  TransactionError
}
'use strict'

class MSSQLError extends Error {
  /**
   * Creates a new ConnectionError.
   *
   * @param {String} message Error message.
   * @param {String} [code] Error code.
   */

  constructor (message, code) {
    if (message instanceof Error) {
      super(message.message)
      this.code = message.code || code

      Error.captureStackTrace(this, this.constructor)
      Object.defineProperty(this, 'originalError', { enumerable: true, value: message })
    } else {
      super(message)
      this.code = code
    }

    this.name = 'MSSQLError'
  }
}

module.exports = MSSQLError
'use strict'

const MSSQLError = require('./mssql-error')

/**
 * Class PreparedStatementError.
 */

class PreparedStatementError extends MSSQLError {
  /**
   * Creates a new PreparedStatementError.
   *
   * @param {String} message Error message.
   * @param {String} [code] Error code.
   */

  constructor (message, code) {
    super(message, code)

    this.name = 'PreparedStatementError'
  }
}

module.exports = PreparedStatementError
'use strict'

const MSSQLError = require('./mssql-error')

/**
 * Class RequestError.
 *
 * @property {String} number Error number.
 * @property {Number} lineNumber Line number.
 * @property {String} state Error state.
 * @property {String} class Error class.
 * @property {String} serverName Server name.
 * @property {String} procName Procedure name.
 */

class RequestError extends MSSQLError {
  /**
   * Creates a new RequestError.
   *
   * @param {String} message Error message.
   * @param {String} [code] Error code.
   */

  constructor (message, code) {
    super(message, code)
    if (message instanceof Error) {
      if (message.info) {
        this.number = message.info.number || message.code // err.code is returned by msnodesql driver
        this.lineNumber = message.info.lineNumber
        this.state = message.info.state || message.sqlstate // err.sqlstate is returned by msnodesql driver
        this.class = message.info.class
        this.serverName = message.info.serverName
        this.procName = message.info.procName
      } else {
        // Use err attributes returned by msnodesql driver
        this.number = message.code
        this.lineNumber = message.lineNumber
        this.state = message.sqlstate
        this.class = message.severity
        this.serverName = message.serverName
        this.procName = message.procName
      }
    }

    this.name = 'RequestError'
    if ((/^\[Microsoft\]\[SQL Server Native Client 11\.0\](?:\[SQL Server\])?([\s\S]*)$/).exec(this.message)) {
      this.message = RegExp.$1
    }
  }
}

module.exports = RequestError
'use strict'

const MSSQLError = require('./mssql-error')

/**
 * Class TransactionError.
 */

class TransactionError extends MSSQLError {
  /**
   * Creates a new TransactionError.
   *
   * @param {String} message Error message.
   * @param {String} [code] Error code.
   */

  constructor (message, code) {
    super(message, code)

    this.name = 'TransactionError'
  }
}

module.exports = TransactionError
'use strict'

const { EventEmitter } = require('events')
const debug = require('debug')('mssql:base')
const { parseSqlConnectionString } = require('@tediousjs/connection-string')
const tarn = require('tarn')
const { IDS } = require('../utils')
const ConnectionError = require('../error/connection-error')
const shared = require('../shared')
const clone = require('rfdc/default')
const { MSSQLError } = require('../error')

/**
 * Class ConnectionPool.
 *
 * Internally, each `Connection` instance is a separate pool of TDS connections. Once you create a new `Request`/`Transaction`/`Prepared Statement`, a new TDS connection is acquired from the pool and reserved for desired action. Once the action is complete, connection is released back to the pool.
 *
 * @property {Boolean} connected If true, connection is established.
 * @property {Boolean} connecting If true, connection is being established.
 *
 * @fires ConnectionPool#connect
 * @fires ConnectionPool#close
 */

class ConnectionPool extends EventEmitter {
  /**
   * Create new Connection.
   *
   * @param {Object|String} config Connection configuration object or connection string.
   * @param {basicCallback} [callback] A callback which is called after connection has established, or an error has occurred.
   */

  constructor (config, callback) {
    super()

    IDS.add(this, 'ConnectionPool')
    debug('pool(%d): created', IDS.get(this))

    this._connectStack = []
    this._closeStack = []

    this._connected = false
    this._connecting = false
    this._healthy = false

    if (typeof config === 'string') {
      try {
        this.config = this.constructor.parseConnectionString(config)
      } catch (ex) {
        if (typeof callback === 'function') {
          return setImmediate(callback, ex)
        }
        throw ex
      }
    } else {
      this.config = clone(config)
    }

    // set defaults
    this.config.port = this.config.port || 1433
    this.config.options = this.config.options || {}
    this.config.stream = this.config.stream || false
    this.config.parseJSON = this.config.parseJSON || false
    this.config.arrayRowMode = this.config.arrayRowMode || false
    this.config.validateConnection = 'validateConnection' in this.config ? this.config.validateConnection : true

    if (/^(.*)\\(.*)$/.exec(this.config.server)) {
      this.config.server = RegExp.$1
      this.config.options.instanceName = RegExp.$2
    }

    if (typeof this.config.options.useColumnNames !== 'undefined' && this.config.options.useColumnNames !== true) {
      const ex = new MSSQLError('Invalid options `useColumnNames`, use `arrayRowMode` instead')
      if (typeof callback === 'function') {
        return setImmediate(callback, ex)
      }
      throw ex
    }

    if (typeof callback === 'function') {
      this.connect(callback)
    }
  }

  get connected () {
    return this._connected
  }

  get connecting () {
    return this._connecting
  }

  get healthy () {
    return this._healthy
  }

  static parseConnectionString (connectionString) {
    return this._parseConnectionString(connectionString)
  }

  static _parseConnectionString (connectionString) {
    const parsed = parseSqlConnectionString(connectionString, true, true)
    return Object.entries(parsed).reduce((config, [key, value]) => {
      switch (key) {
        case 'application name':
          break
        case 'applicationintent':
          Object.assign(config.options, {
            readOnlyIntent: value === 'readonly'
          })
          break
        case 'asynchronous processing':
          break
        case 'attachdbfilename':
          break
        case 'authentication':
          break
        case 'column encryption setting':
          break
        case 'connection timeout':
          Object.assign(config, {
            connectionTimeout: value * 1000
          })
          break
        case 'connection lifetime':
          break
        case 'connectretrycount':
          break
        case 'connectretryinterval':
          Object.assign(config.options, {
            connectionRetryInterval: value * 1000
          })
          break
        case 'context connection':
          break
        case 'current language':
          Object.assign(config.options, {
            language: value
          })
          break
        case 'data source':
        {
          let server = value
          let instanceName
          let port = 1433
          if (/^np:/i.test(server)) {
            throw new Error('Connection via Named Pipes is not supported.')
          }
          if (/^tcp:/i.test(server)) {
            server = server.substr(4)
          }
          if (/^(.*)\\(.*)$/.exec(server)) {
            server = RegExp.$1
            instanceName = RegExp.$2
          }
          if (/^(.*),(.*)$/.exec(server)) {
            server = RegExp.$1.trim()
            port = parseInt(RegExp.$2.trim(), 10)
          }
          if (server === '.' || server === '(.)' || server.toLowerCase() === '(localdb)' || server.toLowerCase() === '(local)') {
            server = 'localhost'
          }
          Object.assign(config, {
            port,
            server
          })
          Object.assign(config.options, {
            instanceName
          })
          break
        }
        case 'encrypt':
          Object.assign(config.options, {
            encrypt: !!value
          })
          break
        case 'enlist':
          break
        case 'failover partner':
          break
        case 'initial catalog':
          Object.assign(config, {
            database: value
          })
          break
        case 'integrated security':
          break
        case 'max pool size':
          Object.assign(config.pool, {
            max: value
          })
          break
        case 'min pool size':
          Object.assign(config.pool, {
            min: value
          })
          break
        case 'multipleactiveresultsets':
          break
        case 'multisubnetfailover':
          Object.assign(config.options, {
            multiSubnetFailover: value
          })
          break
        case 'network library':
          break
        case 'packet size':
          Object.assign(config.options, {
            packetSize: value
          })
          break
        case 'password':
          Object.assign(config, {
            password: value
          })
          break
        case 'persist security info':
          break
        case 'poolblockingperiod':
          break
        case 'pooling':
          break
        case 'replication':
          break
        case 'transaction binding':
          Object.assign(config.options, {
            enableImplicitTransactions: value.toLowerCase() === 'implicit unbind'
          })
          break
        case 'transparentnetworkipresolution':
          break
        case 'trustservercertificate':
          Object.assign(config.options, {
            trustServerCertificate: value
          })
          break
        case 'type system version':
          break
        case 'user id': {
          let user = value
          let domain
          if (/^(.*)\\(.*)$/.exec(user)) {
            domain = RegExp.$1
            user = RegExp.$2
          }
          Object.assign(config, {
            domain,
            user
          })
          break
        }
        case 'user instance':
          break
        case 'workstation id':
          Object.assign(config.options, {
            workstationId: value
          })
          break
        case 'request timeout':
          Object.assign(config, {
            requestTimeout: parseInt(value, 10)
          })
          break
        case 'stream':
          Object.assign(config, {
            stream: !!value
          })
          break
        case 'useutc':
          Object.assign(config.options, {
            useUTC: !!value
          })
          break
        case 'parsejson':
          Object.assign(config, {
            parseJSON: !!value
          })
          break
      }
      return config
    }, { options: {}, pool: {} })
  }

  /**
   * Acquire connection from this connection pool.
   *
   * @param {ConnectionPool|Transaction|PreparedStatement} requester Requester.
   * @param {acquireCallback} [callback] A callback which is called after connection has been acquired, or an error has occurred. If omited, method returns Promise.
   * @return {ConnectionPool|Promise}
   */

  acquire (requester, callback) {
    const acquirePromise = shared.Promise.resolve(this._acquire().promise).catch(err => {
      this.emit('error', err)
      throw err
    })
    if (typeof callback === 'function') {
      acquirePromise.then(connection => callback(null, connection, this.config)).catch(callback)
      return this
    }

    return acquirePromise
  }

  _acquire () {
    if (!this.pool) {
      return shared.Promise.reject(new ConnectionError('Connection not yet open.', 'ENOTOPEN'))
    } else if (this.pool.destroyed) {
      return shared.Promise.reject(new ConnectionError('Connection is closing', 'ENOTOPEN'))
    }

    return this.pool.acquire()
  }

  /**
   * Release connection back to the pool.
   *
   * @param {Connection} connection Previously acquired connection.
   * @return {ConnectionPool}
   */

  release (connection) {
    debug('connection(%d): released', IDS.get(connection))

    if (this.pool) {
      this.pool.release(connection)
    }
    return this
  }

  /**
   * Creates a new connection pool with one active connection. This one initial connection serves as a probe to find out whether the configuration is valid.
   *
   * @param {basicCallback} [callback] A callback which is called after connection has established, or an error has occurred. If omited, method returns Promise.
   * @return {ConnectionPool|Promise}
   */

  connect (callback) {
    if (typeof callback === 'function') {
      this._connect(callback)
      return this
    }

    return new shared.Promise((resolve, reject) => {
      return this._connect(err => {
        if (err) return reject(err)
        resolve(this)
      })
    })
  }

  /**
   * @private
   * @param {basicCallback} callback
   */

  _connect (callback) {
    if (this._connected) {
      debug('pool(%d): already connected, executing connect callback immediately', IDS.get(this))
      return setImmediate(callback, null, this)
    }

    this._connectStack.push(callback)

    if (this._connecting) {
      return
    }

    this._connecting = true
    debug('pool(%d): connecting', IDS.get(this))

    // create one test connection to check if everything is ok
    this._poolCreate().then((connection) => {
      debug('pool(%d): connected', IDS.get(this))
      this._healthy = true

      return this._poolDestroy(connection).then(() => {
        // prepare pool
        this.pool = new tarn.Pool(
          Object.assign({
            create: () => this._poolCreate()
              .then(connection => {
                this._healthy = true
                return connection
              })
              .catch(err => {
                if (this.pool.numUsed() + this.pool.numFree() <= 0) {
                  this._healthy = false
                }
                throw err
              }),
            validate: this._poolValidate.bind(this),
            destroy: this._poolDestroy.bind(this),
            max: 10,
            min: 0,
            idleTimeoutMillis: 30000,
            propagateCreateError: true
          }, this.config.pool)
        )

        this._connecting = false
        this._connected = true
      })
    }).then(() => {
      this._connectStack.forEach((cb) => {
        setImmediate(cb, null, this)
      })
    }).catch(err => {
      this._connecting = false
      this._connectStack.forEach((cb) => {
        setImmediate(cb, err)
      })
    }).then(() => {
      this._connectStack = []
    })
  }

  get size () {
    return this.pool.numFree() + this.pool.numUsed() + this.pool.numPendingCreates()
  }

  get available () {
    return this.pool.numFree()
  }

  get pending () {
    return this.pool.numPendingAcquires()
  }

  get borrowed () {
    return this.pool.numUsed()
  }

  /**
   * Close all active connections in the pool.
   *
   * @param {basicCallback} [callback] A callback which is called after connection has closed, or an error has occurred. If omited, method returns Promise.
   * @return {ConnectionPool|Promise}
   */

  close (callback) {
    if (typeof callback === 'function') {
      this._close(callback)
      return this
    }

    return new shared.Promise((resolve, reject) => {
      this._close(err => {
        if (err) return reject(err)
        resolve(this)
      })
    })
  }

  /**
   * @private
   * @param {basicCallback} callback
   */

  _close (callback) {
    // we don't allow pools in a connecting state to be closed because it means there are far too many
    // edge cases to deal with
    if (this._connecting) {
      debug('pool(%d): close called while connecting', IDS.get(this))
      setImmediate(callback, new ConnectionError('Cannot close a pool while it is connecting'))
    }

    if (!this.pool) {
      debug('pool(%d): already closed, executing close callback immediately', IDS.get(this))
      return setImmediate(callback, null)
    }

    this._closeStack.push(callback)

    if (this.pool.destroyed) return

    this._connecting = this._connected = this._healthy = false

    this.pool.destroy().then(() => {
      debug('pool(%d): pool closed, removing pool reference and executing close callbacks', IDS.get(this))
      this.pool = null
      this._closeStack.forEach(cb => {
        setImmediate(cb, null)
      })
    }).catch(err => {
      this.pool = null
      this._closeStack.forEach(cb => {
        setImmediate(cb, err)
      })
    }).then(() => {
      this._closeStack = []
    })
  }

  /**
   * Returns new request using this connection.
   *
   * @return {Request}
   */

  request () {
    return new shared.driver.Request(this)
  }

  /**
   * Returns new transaction using this connection.
   *
   * @return {Transaction}
   */

  transaction () {
    return new shared.driver.Transaction(this)
  }

  /**
   * Creates a new query using this connection from a tagged template string.
   *
   * @variation 1
   * @param {Array} strings Array of string literals.
   * @param {...*} keys Values.
   * @return {Request}
   */

  /**
   * Execute the SQL command.
   *
   * @variation 2
   * @param {String} command T-SQL command to be executed.
   * @param {Request~requestCallback} [callback] A callback which is called after execution has completed, or an error has occurred. If omited, method returns Promise.
   * @return {Request|Promise}
   */

  query () {
    if (typeof arguments[0] === 'string') { return new shared.driver.Request(this).query(arguments[0], arguments[1]) }

    const values = Array.prototype.slice.call(arguments)
    const strings = values.shift()

    return new shared.driver.Request(this)._template(strings, values, 'query')
  }

  /**
   * Creates a new batch using this connection from a tagged template string.
   *
   * @variation 1
   * @param {Array} strings Array of string literals.
   * @param {...*} keys Values.
   * @return {Request}
   */

  /**
   * Execute the SQL command.
   *
   * @variation 2
   * @param {String} command T-SQL command to be executed.
   * @param {Request~requestCallback} [callback] A callback which is called after execution has completed, or an error has occurred. If omited, method returns Promise.
   * @return {Request|Promise}
   */

  batch () {
    if (typeof arguments[0] === 'string') { return new shared.driver.Request(this).batch(arguments[0], arguments[1]) }

    const values = Array.prototype.slice.call(arguments)
    const strings = values.shift()

    return new shared.driver.Request(this)._template(strings, values, 'batch')
  }
}

module.exports = ConnectionPool
'use strict'

const ConnectionPool = require('./connection-pool')
const PreparedStatement = require('./prepared-statement')
const Request = require('./request')
const Transaction = require('./transaction')
const { ConnectionError, TransactionError, RequestError, PreparedStatementError, MSSQLError } = require('../error')
const shared = require('../shared')
const Table = require('../table')
const ISOLATION_LEVEL = require('../isolationlevel')
const { TYPES } = require('../datatypes')
const { connect, close, on, off, removeListener, query, batch } = require('../global-connection')

module.exports = {
  ConnectionPool,
  Transaction,
  Request,
  PreparedStatement,
  ConnectionError,
  TransactionError,
  RequestError,
  PreparedStatementError,
  MSSQLError,
  driver: shared.driver,
  exports: {
    ConnectionError,
    TransactionError,
    RequestError,
    PreparedStatementError,
    MSSQLError,
    Table,
    ISOLATION_LEVEL,
    TYPES,
    MAX: 65535, // (1 << 16) - 1
    map: shared.map,
    getTypeByValue: shared.getTypeByValue,
    connect,
    close,
    on,
    removeListener,
    off,
    query,
    batch
  }
}

Object.defineProperty(module.exports, 'Promise', {
  enumerable: true,
  get: () => {
    return shared.Promise
  },
  set: (value) => {
    shared.Promise = value
  }
})

Object.defineProperty(module.exports, 'valueHandler', {
  enumerable: true,
  value: shared.valueHandler,
  writable: false,
  configurable: false
})

for (const key in TYPES) {
  const value = TYPES[key]
  module.exports.exports[key] = value
  module.exports.exports[key.toUpperCase()] = value
}

/**
 * @callback Request~requestCallback
 * @param {Error} err Error on error, otherwise null.
 * @param {Object} [result] Request result.
 */

/**
 * @callback Request~bulkCallback
 * @param {Error} err Error on error, otherwise null.
 * @param {Number} [rowsAffected] Number of affected rows.
 */

/**
 * @callback basicCallback
 * @param {Error} err Error on error, otherwise null.
 * @param {Connection} [connection] Acquired connection.
 */

/**
 * @callback acquireCallback
 * @param {Error} err Error on error, otherwise null.
 * @param {Connection} [connection] Acquired connection.
 * @param {Object} [config] Connection config
 */

/**
 * Dispatched after connection has established.
 * @event ConnectionPool#connect
 */

/**
 * Dispatched after connection has closed a pool (by calling close).
 * @event ConnectionPool#close
 */

/**
 * Dispatched when transaction begin.
 * @event Transaction#begin
 */

/**
 * Dispatched on successful commit.
 * @event Transaction#commit
 */

/**
 * Dispatched on successful rollback.
 * @event Transaction#rollback
 */

/**
 * Dispatched when metadata for new recordset are parsed.
 * @event Request#recordset
 */

/**
 * Dispatched when new row is parsed.
 * @event Request#row
 */

/**
 * Dispatched when request is complete.
 * @event Request#done
 */

/**
 * Dispatched on error.
 * @event Request#error
 */
'use strict'

const debug = require('debug')('mssql:base')
const { EventEmitter } = require('events')
const { IDS, objectHasProperty } = require('../utils')
const globalConnection = require('../global-connection')
const { TransactionError, PreparedStatementError } = require('../error')
const shared = require('../shared')
const { TYPES, declare } = require('../datatypes')

/**
 * Class PreparedStatement.
 *
 * IMPORTANT: Rememeber that each prepared statement means one reserved connection from the pool. Don't forget to unprepare a prepared statement!
 *
 * @property {String} statement Prepared SQL statement.
 */

class PreparedStatement extends EventEmitter {
  /**
   * Creates a new Prepared Statement.
   *
   * @param {ConnectionPool|Transaction} [holder]
   */

  constructor (parent) {
    super()

    IDS.add(this, 'PreparedStatement')
    debug('ps(%d): created', IDS.get(this))

    this.parent = parent || globalConnection.pool
    this._handle = 0
    this.prepared = false
    this.parameters = {}
  }

  get config () {
    return this.parent.config
  }

  get connected () {
    return this.parent.connected
  }

  /**
   * Acquire connection from connection pool.
   *
   * @param {Request} request Request.
   * @param {ConnectionPool~acquireCallback} [callback] A callback which is called after connection has established, or an error has occurred. If omited, method returns Promise.
   * @return {PreparedStatement|Promise}
   */

  acquire (request, callback) {
    if (!this._acquiredConnection) {
      setImmediate(callback, new PreparedStatementError('Statement is not prepared. Call prepare() first.', 'ENOTPREPARED'))
      return this
    }

    if (this._activeRequest) {
      setImmediate(callback, new TransactionError("Can't acquire connection for the request. There is another request in progress.", 'EREQINPROG'))
      return this
    }

    this._activeRequest = request
    setImmediate(callback, null, this._acquiredConnection, this._acquiredConfig)
    return this
  }

  /**
   * Release connection back to the pool.
   *
   * @param {Connection} connection Previously acquired connection.
   * @return {PreparedStatement}
   */

  release (connection) {
    if (connection === this._acquiredConnection) {
      this._activeRequest = null
    }

    return this
  }

  /**
   * Add an input parameter to the prepared statement.
   *
   * @param {String} name Name of the input parameter without @ char.
   * @param {*} type SQL data type of input parameter.
   * @return {PreparedStatement}
   */

  input (name, type) {
    if ((/(--| |\/\*|\*\/|')/).test(name)) {
      throw new PreparedStatementError(`SQL injection warning for param '${name}'`, 'EINJECT')
    }

    if (arguments.length < 2) {
      throw new PreparedStatementError('Invalid number of arguments. 2 arguments expected.', 'EARGS')
    }

    if (type instanceof Function) {
      type = type()
    }

    if (objectHasProperty(this.parameters, name)) {
      throw new PreparedStatementError(`The parameter name ${name} has already been declared. Parameter names must be unique`, 'EDUPEPARAM')
    }

    this.parameters[name] = {
      name,
      type: type.type,
      io: 1,
      length: type.length,
      scale: type.scale,
      precision: type.precision,
      tvpType: type.tvpType
    }

    return this
  }

  /**
   * Replace an input parameter on the request.
   *
   * @param {String} name Name of the input parameter without @ char.
   * @param {*} [type] SQL data type of input parameter. If you omit type, module automaticaly decide which SQL data type should be used based on JS data type.
   * @param {*} value Input parameter value. `undefined` and `NaN` values are automatically converted to `null` values.
   * @return {Request}
   */

  replaceInput (name, type, value) {
    delete this.parameters[name]

    return this.input(name, type, value)
  }

  /**
   * Add an output parameter to the prepared statement.
   *
   * @param {String} name Name of the output parameter without @ char.
   * @param {*} type SQL data type of output parameter.
   * @return {PreparedStatement}
   */

  output (name, type) {
    if (/(--| |\/\*|\*\/|')/.test(name)) {
      throw new PreparedStatementError(`SQL injection warning for param '${name}'`, 'EINJECT')
    }

    if (arguments.length < 2) {
      throw new PreparedStatementError('Invalid number of arguments. 2 arguments expected.', 'EARGS')
    }

    if (type instanceof Function) type = type()

    if (objectHasProperty(this.parameters, name)) {
      throw new PreparedStatementError(`The parameter name ${name} has already been declared. Parameter names must be unique`, 'EDUPEPARAM')
    }

    this.parameters[name] = {
      name,
      type: type.type,
      io: 2,
      length: type.length,
      scale: type.scale,
      precision: type.precision
    }

    return this
  }

  /**
   * Replace an output parameter on the request.
   *
   * @param {String} name Name of the output parameter without @ char.
   * @param {*} type SQL data type of output parameter.
   * @return {PreparedStatement}
   */

  replaceOutput (name, type) {
    delete this.parameters[name]

    return this.output(name, type)
  }

  /**
   * Prepare a statement.
   *
   * @param {String} statement SQL statement to prepare.
   * @param {basicCallback} [callback] A callback which is called after preparation has completed, or an error has occurred. If omited, method returns Promise.
   * @return {PreparedStatement|Promise}
   */

  prepare (statement, callback) {
    if (typeof callback === 'function') {
      this._prepare(statement, callback)
      return this
    }

    return new shared.Promise((resolve, reject) => {
      this._prepare(statement, err => {
        if (err) return reject(err)
        resolve(this)
      })
    })
  }

  /**
   * @private
   * @param {String} statement
   * @param {basicCallback} callback
   */

  _prepare (statement, callback) {
    debug('ps(%d): prepare', IDS.get(this))

    if (typeof statement === 'function') {
      callback = statement
      statement = undefined
    }

    if (this.prepared) {
      return setImmediate(callback, new PreparedStatementError('Statement is already prepared.', 'EALREADYPREPARED'))
    }

    this.statement = statement || this.statement

    this.parent.acquire(this, (err, connection, config) => {
      if (err) return callback(err)

      this._acquiredConnection = connection
      this._acquiredConfig = config

      const req = new shared.driver.Request(this)
      req.stream = false
      req.output('handle', TYPES.Int)
      req.input('params', TYPES.NVarChar, ((() => {
        const result = []
        for (const name in this.parameters) {
          if (!objectHasProperty(this.parameters, name)) {
            continue
          }
          const param = this.parameters[name]
          result.push(`@${name} ${declare(param.type, param)}${param.io === 2 ? ' output' : ''}`)
        }
        return result
      })()).join(','))
      req.input('stmt', TYPES.NVarChar, this.statement)
      req.execute('sp_prepare', (err, result) => {
        if (err) {
          this.parent.release(this._acquiredConnection)
          this._acquiredConnection = null
          this._acquiredConfig = null

          return callback(err)
        }

        debug('ps(%d): prepared', IDS.get(this))

        this._handle = result.output.handle
        this.prepared = true

        callback(null)
      })
    })
  }

  /**
   * Execute a prepared statement.
   *
   * @param {Object} values An object whose names correspond to the names of parameters that were added to the prepared statement before it was prepared.
   * @param {basicCallback} [callback] A callback which is called after execution has completed, or an error has occurred. If omited, method returns Promise.
   * @return {Request|Promise}
   */

  execute (values, callback) {
    if (this.stream || (typeof callback === 'function')) {
      return this._execute(values, callback)
    }

    return new shared.Promise((resolve, reject) => {
      this._execute(values, (err, recordset) => {
        if (err) return reject(err)
        resolve(recordset)
      })
    })
  }

  /**
   * @private
   * @param {Object} values
   * @param {basicCallback} callback
   */

  _execute (values, callback) {
    const req = new shared.driver.Request(this)
    req.stream = this.stream
    req.arrayRowMode = this.arrayRowMode
    req.input('handle', TYPES.Int, this._handle)

    // copy parameters with new values
    for (const name in this.parameters) {
      if (!objectHasProperty(this.parameters, name)) {
        continue
      }
      const param = this.parameters[name]
      req.parameters[name] = {
        name,
        type: param.type,
        io: param.io,
        value: values[name],
        length: param.length,
        scale: param.scale,
        precision: param.precision
      }
    }

    req.execute('sp_execute', (err, result) => {
      if (err) return callback(err)

      callback(null, result)
    })

    return req
  }

  /**
   * Unprepare a prepared statement.
   *
   * @param {basicCallback} [callback] A callback which is called after unpreparation has completed, or an error has occurred. If omited, method returns Promise.
   * @return {PreparedStatement|Promise}
   */

  unprepare (callback) {
    if (typeof callback === 'function') {
      this._unprepare(callback)
      return this
    }

    return new shared.Promise((resolve, reject) => {
      this._unprepare(err => {
        if (err) return reject(err)
        resolve()
      })
    })
  }

  /**
   * @private
   * @param {basicCallback} callback
   */

  _unprepare (callback) {
    debug('ps(%d): unprepare', IDS.get(this))

    if (!this.prepared) {
      return setImmediate(callback, new PreparedStatementError('Statement is not prepared. Call prepare() first.', 'ENOTPREPARED'))
    }

    if (this._activeRequest) {
      return setImmediate(callback, new TransactionError("Can't unprepare the statement. There is a request in progress.", 'EREQINPROG'))
    }

    const req = new shared.driver.Request(this)
    req.stream = false
    req.input('handle', TYPES.Int, this._handle)
    req.execute('sp_unprepare', err => {
      if (err) return callback(err)

      this.parent.release(this._acquiredConnection)
      this._acquiredConnection = null
      this._acquiredConfig = null
      this._handle = 0
      this.prepared = false

      debug('ps(%d): unprepared', IDS.get(this))

      return callback(null)
    })
  }
}

module.exports = PreparedStatement
'use strict'

const debug = require('debug')('mssql:base')
const { EventEmitter } = require('events')
const { Readable } = require('stream')
const { IDS, objectHasProperty } = require('../utils')
const globalConnection = require('../global-connection')
const { RequestError, ConnectionError } = require('../error')
const { TYPES } = require('../datatypes')
const shared = require('../shared')

/**
 * Class Request.
 *
 * @property {Transaction} transaction Reference to transaction when request was created in transaction.
 * @property {*} parameters Collection of input and output parameters.
 * @property {Boolean} canceled `true` if request was canceled.
 *
 * @fires Request#recordset
 * @fires Request#row
 * @fires Request#done
 * @fires Request#error
 */

class Request extends EventEmitter {
  /**
   * Create new Request.
   *
   * @param {Connection|ConnectionPool|Transaction|PreparedStatement} parent If omitted, global connection is used instead.
   */

  constructor (parent) {
    super()

    IDS.add(this, 'Request')
    debug('request(%d): created', IDS.get(this))

    this.canceled = false
    this._paused = false
    this.parent = parent || globalConnection.pool
    this.parameters = {}
    this.stream = null
    this.arrayRowMode = null
  }

  get paused () {
    return this._paused
  }

  /**
   * Generate sql string and set input parameters from tagged template string.
   *
   * @param {Template literal} template
   * @return {String}
   */
  template () {
    const values = Array.prototype.slice.call(arguments)
    const strings = values.shift()
    return this._template(strings, values)
  }

  /**
   * Fetch request from tagged template string.
   *
   * @private
   * @param {Array} strings
   * @param {Array} values
   * @param {String} [method] If provided, method is automatically called with serialized command on this object.
   * @return {Request}
   */

  _template (strings, values, method) {
    const command = [strings[0]]

    for (let index = 0; index < values.length; index++) {
      const value = values[index]
      // if value is an array, prepare each items as it's own comma separated parameter
      if (Array.isArray(value)) {
        for (let parameterIndex = 0; parameterIndex < value.length; parameterIndex++) {
          this.input(`param${index + 1}_${parameterIndex}`, value[parameterIndex])
          command.push(`@param${index + 1}_${parameterIndex}`)
          if (parameterIndex < value.length - 1) {
            command.push(', ')
          }
        }
        command.push(strings[index + 1])
      } else {
        this.input(`param${index + 1}`, value)
        command.push(`@param${index + 1}`, strings[index + 1])
      }
    }

    if (method) {
      return this[method](command.join(''))
    } else {
      return command.join('')
    }
  }

  /**
   * Add an input parameter to the request.
   *
   * @param {String} name Name of the input parameter without @ char.
   * @param {*} [type] SQL data type of input parameter. If you omit type, module automaticaly decide which SQL data type should be used based on JS data type.
   * @param {*} value Input parameter value. `undefined` and `NaN` values are automatically converted to `null` values.
   * @return {Request}
   */

  input (name, type, value) {
    if ((/(--| |\/\*|\*\/|')/).test(name)) {
      throw new RequestError(`SQL injection warning for param '${name}'`, 'EINJECT')
    }

    if (arguments.length < 2) {
      throw new RequestError('Invalid number of arguments. At least 2 arguments expected.', 'EARGS')
    } else if (arguments.length === 2) {
      value = type
      type = shared.getTypeByValue(value)
    }

    // support for custom data types
    if (value && typeof value.valueOf === 'function' && !(value instanceof Date)) value = value.valueOf()

    if (value === undefined) value = null // undefined to null
    if (typeof value === 'number' && isNaN(value)) value = null // NaN to null
    if (type instanceof Function) type = type()

    if (objectHasProperty(this.parameters, name)) {
      throw new RequestError(`The parameter name ${name} has already been declared. Parameter names must be unique`, 'EDUPEPARAM')
    }

    this.parameters[name] = {
      name,
      type: type.type,
      io: 1,
      value,
      length: type.length,
      scale: type.scale,
      precision: type.precision,
      tvpType: type.tvpType
    }

    return this
  }

  /**
   * Replace an input parameter on the request.
   *
   * @param {String} name Name of the input parameter without @ char.
   * @param {*} [type] SQL data type of input parameter. If you omit type, module automaticaly decide which SQL data type should be used based on JS data type.
   * @param {*} value Input parameter value. `undefined` and `NaN` values are automatically converted to `null` values.
   * @return {Request}
   */

  replaceInput (name, type, value) {
    delete this.parameters[name]

    return this.input(name, type, value)
  }

  /**
   * Add an output parameter to the request.
   *
   * @param {String} name Name of the output parameter without @ char.
   * @param {*} type SQL data type of output parameter.
   * @param {*} [value] Output parameter value initial value. `undefined` and `NaN` values are automatically converted to `null` values. Optional.
   * @return {Request}
   */

  output (name, type, value) {
    if (!type) { type = TYPES.NVarChar }

    if ((/(--| |\/\*|\*\/|')/).test(name)) {
      throw new RequestError(`SQL injection warning for param '${name}'`, 'EINJECT')
    }

    if ((type === TYPES.Text) || (type === TYPES.NText) || (type === TYPES.Image)) {
      throw new RequestError('Deprecated types (Text, NText, Image) are not supported as OUTPUT parameters.', 'EDEPRECATED')
    }

    // support for custom data types
    if (value && typeof value.valueOf === 'function' && !(value instanceof Date)) value = value.valueOf()

    if (value === undefined) value = null // undefined to null
    if (typeof value === 'number' && isNaN(value)) value = null // NaN to null
    if (type instanceof Function) type = type()

    if (objectHasProperty(this.parameters, name)) {
      throw new RequestError(`The parameter name ${name} has already been declared. Parameter names must be unique`, 'EDUPEPARAM')
    }

    this.parameters[name] = {
      name,
      type: type.type,
      io: 2,
      value,
      length: type.length,
      scale: type.scale,
      precision: type.precision
    }

    return this
  }

  /**
   * Replace an output parameter on the request.
   *
   * @param {String} name Name of the output parameter without @ char.
   * @param {*} type SQL data type of output parameter.
   * @param {*} [value] Output parameter value initial value. `undefined` and `NaN` values are automatically converted to `null` values. Optional.
   * @return {Request}
   */

  replaceOutput (name, type, value) {
    delete this.parameters[name]

    return this.output(name, type, value)
  }

  /**
   * Execute the SQL batch.
   *
   * @param {String} batch T-SQL batch to be executed.
   * @param {Request~requestCallback} [callback] A callback which is called after execution has completed, or an error has occurred. If omited, method returns Promise.
   * @return {Request|Promise}
   */

  batch (batch, callback) {
    if (this.stream === null && this.parent) this.stream = this.parent.config.stream
    if (this.arrayRowMode === null && this.parent) this.arrayRowMode = this.parent.config.arrayRowMode
    this.rowsAffected = 0

    if (typeof callback === 'function') {
      this._batch(batch, (err, recordsets, output, rowsAffected) => {
        if (this.stream) {
          if (err) this.emit('error', err)
          err = null

          this.emit('done', {
            output,
            rowsAffected
          })
        }

        if (err) return callback(err)
        callback(null, {
          recordsets,
          recordset: recordsets && recordsets[0],
          output,
          rowsAffected
        })
      })
      return this
    }

    // Check is method was called as tagged template
    if (typeof batch === 'object') {
      const values = Array.prototype.slice.call(arguments)
      const strings = values.shift()
      batch = this._template(strings, values)
    }

    return new shared.Promise((resolve, reject) => {
      this._batch(batch, (err, recordsets, output, rowsAffected) => {
        if (this.stream) {
          if (err) this.emit('error', err)
          err = null

          this.emit('done', {
            output,
            rowsAffected
          })
        }

        if (err) return reject(err)
        resolve({
          recordsets,
          recordset: recordsets && recordsets[0],
          output,
          rowsAffected
        })
      })
    })
  }

  /**
   * @private
   * @param {String} batch
   * @param {Request~requestCallback} callback
   */

  _batch (batch, callback) {
    if (!this.parent) {
      return setImmediate(callback, new RequestError('No connection is specified for that request.', 'ENOCONN'))
    }

    if (!this.parent.connected) {
      return setImmediate(callback, new ConnectionError('Connection is closed.', 'ECONNCLOSED'))
    }

    this.canceled = false
    setImmediate(callback)
  }

  /**
   * Bulk load.
   *
   * @param {Table} table SQL table.
   * @param {object} [options] Options to be passed to the underlying driver (tedious only).
   * @param {Request~bulkCallback} [callback] A callback which is called after bulk load has completed, or an error has occurred. If omited, method returns Promise.
   * @return {Request|Promise}
   */

  bulk (table, options, callback) {
    if (typeof options === 'function') {
      callback = options
      options = {}
    } else if (typeof options === 'undefined') {
      options = {}
    }

    if (this.stream === null && this.parent) this.stream = this.parent.config.stream
    if (this.arrayRowMode === null && this.parent) this.arrayRowMode = this.parent.config.arrayRowMode

    if (this.stream || typeof callback === 'function') {
      this._bulk(table, options, (err, rowsAffected) => {
        if (this.stream) {
          if (err) this.emit('error', err)
          return this.emit('done', {
            rowsAffected
          })
        }

        if (err) return callback(err)
        callback(null, {
          rowsAffected
        })
      })
      return this
    }

    return new shared.Promise((resolve, reject) => {
      this._bulk(table, options, (err, rowsAffected) => {
        if (err) return reject(err)
        resolve({
          rowsAffected
        })
      })
    })
  }

  /**
   * @private
   * @param {Table} table
   * @param {object} options
   * @param {Request~bulkCallback} callback
   */

  _bulk (table, options, callback) {
    if (!this.parent) {
      return setImmediate(callback, new RequestError('No connection is specified for that request.', 'ENOCONN'))
    }

    if (!this.parent.connected) {
      return setImmediate(callback, new ConnectionError('Connection is closed.', 'ECONNCLOSED'))
    }

    this.canceled = false
    setImmediate(callback)
  }

  /**
   * Wrap original request in a Readable stream that supports back pressure and return.
   * It also sets request to `stream` mode and pulls all rows from all recordsets to a given stream.
   *
   * @param {Object} streamOptions - optional options to configure the readable stream with like highWaterMark
   * @return {Stream}
   */
  toReadableStream (streamOptions = {}) {
    this.stream = true
    this.pause()
    const readableStream = new Readable({
      ...streamOptions,
      objectMode: true,
      read: (/* size */) => {
        this.resume()
      }
    })
    this.on('row', (row) => {
      if (!readableStream.push(row)) {
        this.pause()
      }
    })
    this.on('error', (error) => {
      readableStream.emit('error', error)
    })
    this.on('done', () => {
      readableStream.push(null)
    })
    return readableStream
  }

  /**
   * Wrap original request in a Readable stream that supports back pressure and pipe to the Writable stream.
   * It also sets request to `stream` mode and pulls all rows from all recordsets to a given stream.
   *
   * @param {Stream} stream Stream to pipe data into.
   * @return {Stream}
   */
  pipe (writableStream) {
    const readableStream = this.toReadableStream()
    return readableStream.pipe(writableStream)
  }

  /**
   * Execute the SQL command.
   *
   * @param {String} command T-SQL command to be executed.
   * @param {Request~requestCallback} [callback] A callback which is called after execution has completed, or an error has occurred. If omited, method returns Promise.
   * @return {Request|Promise}
   */

  query (command, callback) {
    if (this.stream === null && this.parent) this.stream = this.parent.config.stream
    if (this.arrayRowMode === null && this.parent) this.arrayRowMode = this.parent.config.arrayRowMode
    this.rowsAffected = 0

    if (typeof callback === 'function') {
      this._query(command, (err, recordsets, output, rowsAffected, columns) => {
        if (this.stream) {
          if (err) this.emit('error', err)
          err = null

          this.emit('done', {
            output,
            rowsAffected
          })
        }

        if (err) return callback(err)
        const result = {
          recordsets,
          recordset: recordsets && recordsets[0],
          output,
          rowsAffected
        }
        if (this.arrayRowMode) result.columns = columns
        callback(null, result)
      })
      return this
    }

    // Check is method was called as tagged template
    if (typeof command === 'object') {
      const values = Array.prototype.slice.call(arguments)
      const strings = values.shift()
      command = this._template(strings, values)
    }

    return new shared.Promise((resolve, reject) => {
      this._query(command, (err, recordsets, output, rowsAffected, columns) => {
        if (this.stream) {
          if (err) this.emit('error', err)
          err = null

          this.emit('done', {
            output,
            rowsAffected
          })
        }

        if (err) return reject(err)
        const result = {
          recordsets,
          recordset: recordsets && recordsets[0],
          output,
          rowsAffected
        }
        if (this.arrayRowMode) result.columns = columns
        resolve(result)
      })
    })
  }

  /**
   * @private
   * @param {String} command
   * @param {Request~bulkCallback} callback
   */

  _query (command, callback) {
    if (!this.parent) {
      return setImmediate(callback, new RequestError('No connection is specified for that request.', 'ENOCONN'))
    }

    if (!this.parent.connected) {
      return setImmediate(callback, new ConnectionError('Connection is closed.', 'ECONNCLOSED'))
    }

    this.canceled = false
    setImmediate(callback)
  }

  /**
   * Call a stored procedure.
   *
   * @param {String} procedure Name of the stored procedure to be executed.
   * @param {Request~requestCallback} [callback] A callback which is called after execution has completed, or an error has occurred. If omited, method returns Promise.
   * @return {Request|Promise}
   */

  execute (command, callback) {
    if (this.stream === null && this.parent) this.stream = this.parent.config.stream
    if (this.arrayRowMode === null && this.parent) this.arrayRowMode = this.parent.config.arrayRowMode
    this.rowsAffected = 0

    if (typeof callback === 'function') {
      this._execute(command, (err, recordsets, output, returnValue, rowsAffected, columns) => {
        if (this.stream) {
          if (err) this.emit('error', err)
          err = null

          this.emit('done', {
            output,
            rowsAffected,
            returnValue
          })
        }

        if (err) return callback(err)
        const result = {
          recordsets,
          recordset: recordsets && recordsets[0],
          output,
          rowsAffected,
          returnValue
        }
        if (this.arrayRowMode) result.columns = columns
        callback(null, result)
      })
      return this
    }

    return new shared.Promise((resolve, reject) => {
      this._execute(command, (err, recordsets, output, returnValue, rowsAffected, columns) => {
        if (this.stream) {
          if (err) this.emit('error', err)
          err = null

          this.emit('done', {
            output,
            rowsAffected,
            returnValue
          })
        }

        if (err) return reject(err)
        const result = {
          recordsets,
          recordset: recordsets && recordsets[0],
          output,
          rowsAffected,
          returnValue
        }
        if (this.arrayRowMode) result.columns = columns
        resolve(result)
      })
    })
  }

  /**
   * @private
   * @param {String} procedure
   * @param {Request~bulkCallback} callback
   */

  _execute (procedure, callback) {
    if (!this.parent) {
      return setImmediate(callback, new RequestError('No connection is specified for that request.', 'ENOCONN'))
    }

    if (!this.parent.connected) {
      return setImmediate(callback, new ConnectionError('Connection is closed.', 'ECONNCLOSED'))
    }

    this.canceled = false
    setImmediate(callback)
  }

  /**
   * Cancel currently executed request.
   *
   * @return {Boolean}
   */

  cancel () {
    this._cancel()
    return true
  }

  /**
   * @private
   */

  _cancel () {
    this.canceled = true
  }

  pause () {
    if (this.stream) {
      this._pause()
      return true
    }
    return false
  }

  _pause () {
    this._paused = true
  }

  resume () {
    if (this.stream) {
      this._resume()
      return true
    }
    return false
  }

  _resume () {
    this._paused = false
  }

  _setCurrentRequest (request) {
    this._currentRequest = request
    if (this._paused) {
      this.pause()
    }
    return this
  }
}

module.exports = Request
'use strict'

const debug = require('debug')('mssql:base')
const { EventEmitter } = require('events')
const { IDS } = require('../utils')
const globalConnection = require('../global-connection')
const { TransactionError } = require('../error')
const shared = require('../shared')
const ISOLATION_LEVEL = require('../isolationlevel')

/**
 * Class Transaction.
 *
 * @property {Number} isolationLevel Controls the locking and row versioning behavior of TSQL statements issued by a connection. READ_COMMITTED by default.
 * @property {String} name Transaction name. Empty string by default.
 *
 * @fires Transaction#begin
 * @fires Transaction#commit
 * @fires Transaction#rollback
 */

class Transaction extends EventEmitter {
  /**
   * Create new Transaction.
   *
   * @param {Connection} [parent] If ommited, global connection is used instead.
   */

  constructor (parent) {
    super()

    IDS.add(this, 'Transaction')
    debug('transaction(%d): created', IDS.get(this))

    this.parent = parent || globalConnection.pool
    this.isolationLevel = Transaction.defaultIsolationLevel
    this.name = ''
  }

  get config () {
    return this.parent.config
  }

  get connected () {
    return this.parent.connected
  }

  /**
   * Acquire connection from connection pool.
   *
   * @param {Request} request Request.
   * @param {ConnectionPool~acquireCallback} [callback] A callback which is called after connection has established, or an error has occurred. If omited, method returns Promise.
   * @return {Transaction|Promise}
   */

  acquire (request, callback) {
    if (!this._acquiredConnection) {
      setImmediate(callback, new TransactionError('Transaction has not begun. Call begin() first.', 'ENOTBEGUN'))
      return this
    }

    if (this._activeRequest) {
      setImmediate(callback, new TransactionError("Can't acquire connection for the request. There is another request in progress.", 'EREQINPROG'))
      return this
    }

    this._activeRequest = request
    setImmediate(callback, null, this._acquiredConnection, this._acquiredConfig)
    return this
  }

  /**
   * Release connection back to the pool.
   *
   * @param {Connection} connection Previously acquired connection.
   * @return {Transaction}
   */

  release (connection) {
    if (connection === this._acquiredConnection) {
      this._activeRequest = null
    }

    return this
  }

  /**
   * Begin a transaction.
   *
   * @param {Number} [isolationLevel] Controls the locking and row versioning behavior of TSQL statements issued by a connection.
   * @param {basicCallback} [callback] A callback which is called after transaction has began, or an error has occurred. If omited, method returns Promise.
   * @return {Transaction|Promise}
   */

  begin (isolationLevel, callback) {
    if (isolationLevel instanceof Function) {
      callback = isolationLevel
      isolationLevel = undefined
    }

    if (typeof callback === 'function') {
      this._begin(isolationLevel, err => {
        if (!err) {
          this.emit('begin')
        }
        callback(err)
      })
      return this
    }

    return new shared.Promise((resolve, reject) => {
      this._begin(isolationLevel, err => {
        if (err) return reject(err)
        this.emit('begin')
        resolve(this)
      })
    })
  }

  /**
   * @private
   * @param {Number} [isolationLevel]
   * @param {basicCallback} [callback]
   * @return {Transaction}
   */

  _begin (isolationLevel, callback) {
    if (this._acquiredConnection) {
      return setImmediate(callback, new TransactionError('Transaction has already begun.', 'EALREADYBEGUN'))
    }

    this._aborted = false
    this._rollbackRequested = false
    if (isolationLevel) {
      if (Object.keys(ISOLATION_LEVEL).some(key => {
        return ISOLATION_LEVEL[key] === isolationLevel
      })) {
        this.isolationLevel = isolationLevel
      } else {
        throw new TransactionError('Invalid isolation level.')
      }
    }

    setImmediate(callback)
  }

  /**
   * Commit a transaction.
   *
   * @param {basicCallback} [callback] A callback which is called after transaction has commited, or an error has occurred. If omited, method returns Promise.
   * @return {Transaction|Promise}
   */

  commit (callback) {
    if (typeof callback === 'function') {
      this._commit(err => {
        if (!err) {
          this.emit('commit')
        }
        callback(err)
      })
      return this
    }

    return new shared.Promise((resolve, reject) => {
      this._commit(err => {
        if (err) return reject(err)
        this.emit('commit')
        resolve()
      })
    })
  }

  /**
   * @private
   * @param {basicCallback} [callback]
   * @return {Transaction}
   */

  _commit (callback) {
    if (this._aborted) {
      return setImmediate(callback, new TransactionError('Transaction has been aborted.', 'EABORT'))
    }

    if (!this._acquiredConnection) {
      return setImmediate(callback, new TransactionError('Transaction has not begun. Call begin() first.', 'ENOTBEGUN'))
    }

    if (this._activeRequest) {
      return setImmediate(callback, new TransactionError("Can't commit transaction. There is a request in progress.", 'EREQINPROG'))
    }

    setImmediate(callback)
  }

  /**
   * Returns new request using this transaction.
   *
   * @return {Request}
   */

  request () {
    return new shared.driver.Request(this)
  }

  /**
   * Rollback a transaction.
   *
   * @param {basicCallback} [callback] A callback which is called after transaction has rolled back, or an error has occurred. If omited, method returns Promise.
   * @return {Transaction|Promise}
   */

  rollback (callback) {
    if (typeof callback === 'function') {
      this._rollback(err => {
        if (!err) {
          this.emit('rollback', this._aborted)
        }
        callback(err)
      })
      return this
    }

    return new shared.Promise((resolve, reject) => {
      return this._rollback(err => {
        if (err) return reject(err)
        this.emit('rollback', this._aborted)
        resolve()
      })
    })
  }

  /**
   * @private
   * @param {basicCallback} [callback]
   * @return {Transaction}
   */

  _rollback (callback) {
    if (this._aborted) {
      return setImmediate(callback, new TransactionError('Transaction has been aborted.', 'EABORT'))
    }

    if (!this._acquiredConnection) {
      return setImmediate(callback, new TransactionError('Transaction has not begun. Call begin() first.', 'ENOTBEGUN'))
    }

    if (this._activeRequest) {
      return setImmediate(callback, new TransactionError("Can't rollback transaction. There is a request in progress.", 'EREQINPROG'))
    }

    this._rollbackRequested = true

    setImmediate(callback)
  }
}

/**
 * Default isolation level used for any transactions that don't explicitly specify an isolation level.
 *
 * @type {number}
 */
Transaction.defaultIsolationLevel = ISOLATION_LEVEL.READ_COMMITTED

module.exports = Transaction
#!/usr/bin/env node
const { Command } = require('commander')
const { version } = require('../package.json')
const { resolve: resolvePath } = require('path')
const { constants: { R_OK } } = require('fs')
const { ConnectionPool } = require('../')
const { lstat, access, readFile } = require('fs').promises
Buffer.prototype.toJSON = () => {
  return `0x${this.toString('hex')}`
}

/**
 * @param {Readable} stream
 * @returns {Promise<Buffer>}
 */
async function streamToBuffer (stream) {
  const chunks = []
  return new Promise((resolve, reject) => {
    stream.on('data', (chunk) => {
      chunks.push(chunk)
    })
    stream.on('end', () => {
      resolve(Buffer.concat(chunks))
    })
    stream.on('error', reject)
  })
}

async function resolveConfig (opts, cfgFile) {
  const cfg = Object.entries({
    options: {
      encrypt: opts.encrypt,
      trustServerCertificate: opts.trustServerCertificate
    },
    user: opts.user,
    password: opts.password,
    server: opts.server,
    database: opts.database,
    port: opts.port
  }).reduce((config, [key, value]) => {
    if (value) {
      Object.assign(config, {
        [key]: value
      })
    }
    return config
  }, {})
  let cfgPath = cfgFile || process.cwd()
  const stat = await lstat(resolvePath(cfgPath))
  if (stat.isDirectory()) {
    cfgPath = resolvePath(cfgPath, opts.config)
  }
  const configAccess = await access(cfgPath, R_OK).then(() => true).catch(() => false)
  if (!configAccess) {
    return cfg;
  }
  const config = await (readFile(cfgPath))
    .then((content) => JSON.parse(content.toString()))

  return {
    ...config,
    ...cfg,
    options: {
      ...(config.options || {}),
      ...cfg.options
    }
  }
}

const program = new Command()

program
  .name('mssql')
  .argument('[configPath]')
  .description('CLI tools for node-mssql')
  .version(version)
  .option('--config <file>', 'Configuration file for the connection', './.mssql.json')
  .option('--user <user>', 'User for the database connection')
  .option('--password <password>', 'Password for the database connection')
  .option('--server <server>', 'Server for the database connection')
  .option('--database <database>', 'Database for the database connection')
  .option('--port <port>', 'Port for the database connection', parseInt)
  .option('--encrypt', 'Use the encrypt option for this connection', false)
  .option('--trust-server-certificate', 'Trust the server certificate for this connection', false)
  // .option('--format <format>', 'The output format to use, eg: JSON', 'json')
  .action(async function (configPath, opts) {
    const [config, statement] = await Promise.all([
      resolveConfig(opts, configPath),
      streamToBuffer(process.stdin).then((stmt) => stmt.toString().trim())
    ])
    if (!statement.length) {
      throw new Error('Statement is empty.')
    }
    const pool = await (new ConnectionPool(config)).connect()
    const request = pool.request()
    request.stream = true
    let started = false
    request.on('error', (e) => {
      pool.close()
      throw e
    })
    request.on('recordset', () => {
      if (started) {
        process.stdout.write('],')
      } else {
        process.stdout.write('[')
      }
      started = false
    })
    request.on('row', (row) => {
      if (!started) {
        started = true
        process.stdout.write('[')
      } else {
        process.stdout.write(',')
      }
      process.stdout.write(JSON.stringify(row))
    })
    request.on('done', () => {
      if (started) {
        process.stdout.write(']]')
      }
      process.stdout.write('\n')
      pool.close()
    })
    request.query(statement)
  })

program.parseAsync(process.argv).catch((e) => {
  program.error(e.message, { exitCode: 1 });
})
The MIT License (MIT)

Copyright (c) 2018 [NAN contributors](<https://github.com/nodejs/nan#wg-members--collaborators>)

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.
console.log(require('path').relative('.', __dirname));
/*********************************************************************
 * NAN - Native Abstractions for Node.js
 *
 * Copyright (c) 2018 NAN contributors:
 *   - Rod Vagg <https://github.com/rvagg>
 *   - Benjamin Byholm <https://github.com/kkoopa>
 *   - Trevor Norris <https://github.com/trevnorris>
 *   - Nathan Rajlich <https://github.com/TooTallNate>
 *   - Brett Lawson <https://github.com/brett19>
 *   - Ben Noordhuis <https://github.com/bnoordhuis>
 *   - David Siegel <https://github.com/agnat>
 *   - Michael Ira Krufky <https://github.com/mkrufky>
 *
 * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
 *
 * Version 2.16.0: current Node 18.2.0, Node 0.12: 0.12.18, Node 0.10: 0.10.48, iojs: 3.3.1
 *
 * See https://github.com/nodejs/nan for the latest update to this file
 **********************************************************************************/

#ifndef NAN_H_
#define NAN_H_

#include <node_version.h>

#define NODE_0_10_MODULE_VERSION 11
#define NODE_0_12_MODULE_VERSION 14
#define ATOM_0_21_MODULE_VERSION 41
#define IOJS_1_0_MODULE_VERSION  42
#define IOJS_1_1_MODULE_VERSION  43
#define IOJS_2_0_MODULE_VERSION  44
#define IOJS_3_0_MODULE_VERSION  45
#define NODE_4_0_MODULE_VERSION  46
#define NODE_5_0_MODULE_VERSION  47
#define NODE_6_0_MODULE_VERSION  48
#define NODE_7_0_MODULE_VERSION  51
#define NODE_8_0_MODULE_VERSION  57
#define NODE_9_0_MODULE_VERSION  59
#define NODE_10_0_MODULE_VERSION 64
#define NODE_11_0_MODULE_VERSION 67
#define NODE_12_0_MODULE_VERSION 72
#define NODE_13_0_MODULE_VERSION 79
#define NODE_14_0_MODULE_VERSION 83
#define NODE_15_0_MODULE_VERSION 88
#define NODE_16_0_MODULE_VERSION 93
#define NODE_17_0_MODULE_VERSION 102
#define NODE_18_0_MODULE_VERSION 108

#ifdef _MSC_VER
# define NAN_HAS_CPLUSPLUS_11 (_MSC_VER >= 1800)
#else
# define NAN_HAS_CPLUSPLUS_11 (__cplusplus >= 201103L)
#endif

#if NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION && !NAN_HAS_CPLUSPLUS_11
# error This version of node/NAN/v8 requires a C++11 compiler
#endif

#include <uv.h>
#include <node.h>
#include <node_buffer.h>
#include <node_object_wrap.h>
#include <algorithm>
#include <cstring>
#include <climits>
#include <cstdlib>
#include <utility>
#if defined(_MSC_VER)
# pragma warning( push )
# pragma warning( disable : 4530 )
# include <queue>
# include <string>
# include <vector>
# pragma warning( pop )
#else
# include <queue>
# include <string>
# include <vector>
#endif

// uv helpers
#ifdef UV_VERSION_MAJOR
# ifndef UV_VERSION_PATCH
#  define UV_VERSION_PATCH 0
# endif
# define NAUV_UVVERSION ((UV_VERSION_MAJOR << 16) | \
                         (UV_VERSION_MINOR <<  8) | \
                         (UV_VERSION_PATCH))
#else
# define NAUV_UVVERSION 0x000b00
#endif

#if NAUV_UVVERSION < 0x000b0b
# ifdef WIN32
#  include <windows.h>
# else
#  include <pthread.h>
# endif
#endif

namespace Nan {

#define NAN_CONCAT(a, b) NAN_CONCAT_HELPER(a, b)
#define NAN_CONCAT_HELPER(a, b) a##b

#define NAN_INLINE inline  // TODO(bnoordhuis) Remove in v3.0.0.

#if defined(__GNUC__) && \
    !(defined(V8_DISABLE_DEPRECATIONS) && V8_DISABLE_DEPRECATIONS)
# define NAN_DEPRECATED __attribute__((deprecated))
#elif defined(_MSC_VER) && \
    !(defined(V8_DISABLE_DEPRECATIONS) && V8_DISABLE_DEPRECATIONS)
# define NAN_DEPRECATED __declspec(deprecated)
#else
# define NAN_DEPRECATED
#endif

#if NAN_HAS_CPLUSPLUS_11
# define NAN_DISALLOW_ASSIGN(CLASS) void operator=(const CLASS&) = delete;
# define NAN_DISALLOW_COPY(CLASS) CLASS(const CLASS&) = delete;
# define NAN_DISALLOW_MOVE(CLASS)                                              \
    CLASS(CLASS&&) = delete;  /* NOLINT(build/c++11) */                        \
    void operator=(CLASS&&) = delete;
#else
# define NAN_DISALLOW_ASSIGN(CLASS) void operator=(const CLASS&);
# define NAN_DISALLOW_COPY(CLASS) CLASS(const CLASS&);
# define NAN_DISALLOW_MOVE(CLASS)
#endif

#define NAN_DISALLOW_ASSIGN_COPY(CLASS)                                        \
    NAN_DISALLOW_ASSIGN(CLASS)                                                 \
    NAN_DISALLOW_COPY(CLASS)

#define NAN_DISALLOW_ASSIGN_MOVE(CLASS)                                        \
    NAN_DISALLOW_ASSIGN(CLASS)                                                 \
    NAN_DISALLOW_MOVE(CLASS)

#define NAN_DISALLOW_COPY_MOVE(CLASS)                                          \
    NAN_DISALLOW_COPY(CLASS)                                                   \
    NAN_DISALLOW_MOVE(CLASS)

#define NAN_DISALLOW_ASSIGN_COPY_MOVE(CLASS)                                   \
    NAN_DISALLOW_ASSIGN(CLASS)                                                 \
    NAN_DISALLOW_COPY(CLASS)                                                   \
    NAN_DISALLOW_MOVE(CLASS)

#define TYPE_CHECK(T, S)                                                       \
    while (false) {                                                            \
      *(static_cast<T *volatile *>(0)) = static_cast<S*>(0);                   \
    }

//=== RegistrationFunction =====================================================

#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
  typedef v8::Handle<v8::Object> ADDON_REGISTER_FUNCTION_ARGS_TYPE;
#else
  typedef v8::Local<v8::Object> ADDON_REGISTER_FUNCTION_ARGS_TYPE;
#endif

#define NAN_MODULE_INIT(name)                                                  \
    void name(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target)

#if NODE_MAJOR_VERSION >= 10 || \
    NODE_MAJOR_VERSION == 9 && NODE_MINOR_VERSION >= 3
#define NAN_MODULE_WORKER_ENABLED(module_name, registration)                   \
    extern "C" NODE_MODULE_EXPORT void                                         \
      NAN_CONCAT(node_register_module_v, NODE_MODULE_VERSION)(                 \
        v8::Local<v8::Object> exports, v8::Local<v8::Value> module,            \
        v8::Local<v8::Context> context)                                        \
    {                                                                          \
        registration(exports);                                                 \
    }
#else
#define NAN_MODULE_WORKER_ENABLED(module_name, registration)                   \
    NODE_MODULE(module_name, registration)
#endif

//=== CallbackInfo =============================================================

#include "nan_callbacks.h"  // NOLINT(build/include)

//==============================================================================

#if (NODE_MODULE_VERSION < NODE_0_12_MODULE_VERSION)
typedef v8::Script             UnboundScript;
typedef v8::Script             BoundScript;
#else
typedef v8::UnboundScript      UnboundScript;
typedef v8::Script             BoundScript;
#endif

#if (NODE_MODULE_VERSION < ATOM_0_21_MODULE_VERSION)
typedef v8::String::ExternalAsciiStringResource
    ExternalOneByteStringResource;
#else
typedef v8::String::ExternalOneByteStringResource
    ExternalOneByteStringResource;
#endif

#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION)
template<typename T>
class NonCopyablePersistentTraits :
    public v8::NonCopyablePersistentTraits<T> {};
template<typename T>
class CopyablePersistentTraits :
    public v8::CopyablePersistentTraits<T> {};

template<typename T>
class PersistentBase :
    public v8::PersistentBase<T> {};

template<typename T, typename M = v8::NonCopyablePersistentTraits<T> >
class Persistent;
#else
template<typename T> class NonCopyablePersistentTraits;
template<typename T> class PersistentBase;
template<typename T, typename P> class WeakCallbackData;
template<typename T, typename M = NonCopyablePersistentTraits<T> >
class Persistent;
#endif  // NODE_MODULE_VERSION

template<typename T>
class Maybe {
 public:
  inline bool IsNothing() const { return !has_value_; }
  inline bool IsJust() const { return has_value_; }

  inline T ToChecked() const { return FromJust(); }
  inline void Check() const { FromJust(); }

  inline bool To(T* out) const {
    if (IsJust()) *out = value_;
    return IsJust();
  }

  inline T FromJust() const {
#if defined(V8_ENABLE_CHECKS)
    assert(IsJust() && "FromJust is Nothing");
#endif  // V8_ENABLE_CHECKS
    return value_;
  }

  inline T FromMaybe(const T& default_value) const {
    return has_value_ ? value_ : default_value;
  }

  inline bool operator==(const Maybe &other) const {
    return (IsJust() == other.IsJust()) &&
        (!IsJust() || FromJust() == other.FromJust());
  }

  inline bool operator!=(const Maybe &other) const {
    return !operator==(other);
  }

#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
  // Allow implicit conversions from v8::Maybe<T> to Nan::Maybe<T>.
  Maybe(const v8::Maybe<T>& that)  // NOLINT(runtime/explicit)
    : has_value_(that.IsJust())
    , value_(that.FromMaybe(T())) {}
#endif

 private:
  Maybe() : has_value_(false) {}
  explicit Maybe(const T& t) : has_value_(true), value_(t) {}
  bool has_value_;
  T value_;

  template<typename U>
  friend Maybe<U> Nothing();
  template<typename U>
  friend Maybe<U> Just(const U& u);
};

template<typename T>
inline Maybe<T> Nothing() {
  return Maybe<T>();
}

template<typename T>
inline Maybe<T> Just(const T& t) {
  return Maybe<T>(t);
}

#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
# include "nan_maybe_43_inl.h"  // NOLINT(build/include)
#else
# include "nan_maybe_pre_43_inl.h"  // NOLINT(build/include)
#endif

#include "nan_converters.h"  // NOLINT(build/include)
#include "nan_new.h"  // NOLINT(build/include)

#if NAUV_UVVERSION < 0x000b17
#define NAUV_WORK_CB(func) \
    void func(uv_async_t *async, int)
#else
#define NAUV_WORK_CB(func) \
    void func(uv_async_t *async)
#endif

#if NAUV_UVVERSION >= 0x000b0b

typedef uv_key_t nauv_key_t;

inline int nauv_key_create(nauv_key_t *key) {
  return uv_key_create(key);
}

inline void nauv_key_delete(nauv_key_t *key) {
  uv_key_delete(key);
}

inline void* nauv_key_get(nauv_key_t *key) {
  return uv_key_get(key);
}

inline void nauv_key_set(nauv_key_t *key, void *value) {
  uv_key_set(key, value);
}

#else

/* Implement thread local storage for older versions of libuv.
 * This is essentially a backport of libuv commit 5d2434bf
 * written by Ben Noordhuis, adjusted for names and inline.
 */

#ifndef WIN32

typedef pthread_key_t nauv_key_t;

inline int nauv_key_create(nauv_key_t* key) {
  return -pthread_key_create(key, NULL);
}

inline void nauv_key_delete(nauv_key_t* key) {
  if (pthread_key_delete(*key))
    abort();
}

inline void* nauv_key_get(nauv_key_t* key) {
  return pthread_getspecific(*key);
}

inline void nauv_key_set(nauv_key_t* key, void* value) {
  if (pthread_setspecific(*key, value))
    abort();
}

#else

typedef struct {
  DWORD tls_index;
} nauv_key_t;

inline int nauv_key_create(nauv_key_t* key) {
  key->tls_index = TlsAlloc();
  if (key->tls_index == TLS_OUT_OF_INDEXES)
    return UV_ENOMEM;
  return 0;
}

inline void nauv_key_delete(nauv_key_t* key) {
  if (TlsFree(key->tls_index) == FALSE)
    abort();
  key->tls_index = TLS_OUT_OF_INDEXES;
}

inline void* nauv_key_get(nauv_key_t* key) {
  void* value = TlsGetValue(key->tls_index);
  if (value == NULL)
    if (GetLastError() != ERROR_SUCCESS)
      abort();
  return value;
}

inline void nauv_key_set(nauv_key_t* key, void* value) {
  if (TlsSetValue(key->tls_index, value) == FALSE)
    abort();
}

#endif
#endif

#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
template<typename T>
v8::Local<T> New(v8::Handle<T>);
#endif

#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
  typedef v8::WeakCallbackType WeakCallbackType;
#else
struct WeakCallbackType {
  enum E {kParameter, kInternalFields};
  E type;
  WeakCallbackType(E other) : type(other) {}  // NOLINT(runtime/explicit)
  inline bool operator==(E other) { return other == this->type; }
  inline bool operator!=(E other) { return !operator==(other); }
};
#endif

template<typename P> class WeakCallbackInfo;

#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
# include "nan_persistent_12_inl.h"  // NOLINT(build/include)
#else
# include "nan_persistent_pre_12_inl.h"  // NOLINT(build/include)
#endif

namespace imp {
  static const size_t kMaxLength = 0x3fffffff;
  // v8::String::REPLACE_INVALID_UTF8 was introduced
  // in node.js v0.10.29 and v0.8.27.
#if NODE_MAJOR_VERSION > 0 || \
    NODE_MINOR_VERSION > 10 || \
    NODE_MINOR_VERSION == 10 && NODE_PATCH_VERSION >= 29 || \
    NODE_MINOR_VERSION == 8 && NODE_PATCH_VERSION >= 27
  static const unsigned kReplaceInvalidUtf8 = v8::String::REPLACE_INVALID_UTF8;
#else
  static const unsigned kReplaceInvalidUtf8 = 0;
#endif
}  // end of namespace imp

//=== HandleScope ==============================================================

class HandleScope {
  v8::HandleScope scope;

 public:
#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
  inline HandleScope() : scope(v8::Isolate::GetCurrent()) {}
  inline static int NumberOfHandles() {
    return v8::HandleScope::NumberOfHandles(v8::Isolate::GetCurrent());
  }
#else
  inline HandleScope() : scope() {}
  inline static int NumberOfHandles() {
    return v8::HandleScope::NumberOfHandles();
  }
#endif

 private:
  // Make it hard to create heap-allocated or illegal handle scopes by
  // disallowing certain operations.
  HandleScope(const HandleScope &);
  void operator=(const HandleScope &);
  void *operator new(size_t size);
  void operator delete(void *, size_t) {
    abort();
  }
};

class EscapableHandleScope {
 public:
#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
  inline EscapableHandleScope() : scope(v8::Isolate::GetCurrent()) {}

  inline static int NumberOfHandles() {
    return v8::EscapableHandleScope::NumberOfHandles(v8::Isolate::GetCurrent());
  }

  template<typename T>
  inline v8::Local<T> Escape(v8::Local<T> value) {
    return scope.Escape(value);
  }

 private:
  v8::EscapableHandleScope scope;
#else
  inline EscapableHandleScope() : scope() {}

  inline static int NumberOfHandles() {
    return v8::HandleScope::NumberOfHandles();
  }

  template<typename T>
  inline v8::Local<T> Escape(v8::Local<T> value) {
    return scope.Close(value);
  }

 private:
  v8::HandleScope scope;
#endif

 private:
  // Make it hard to create heap-allocated or illegal handle scopes by
  // disallowing certain operations.
  EscapableHandleScope(const EscapableHandleScope &);
  void operator=(const EscapableHandleScope &);
  void *operator new(size_t size);
  void operator delete(void *, size_t) {
    abort();
  }
};

//=== TryCatch =================================================================

class TryCatch {
  v8::TryCatch try_catch_;
  friend void FatalException(const TryCatch&);

 public:
#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION
  TryCatch() : try_catch_(v8::Isolate::GetCurrent()) {}
#endif

  inline bool HasCaught() const { return try_catch_.HasCaught(); }

  inline bool CanContinue() const { return try_catch_.CanContinue(); }

  inline v8::Local<v8::Value> ReThrow() {
#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
    return New(try_catch_.ReThrow());
#else
    return try_catch_.ReThrow();
#endif
  }

  inline v8::Local<v8::Value> Exception() const {
    return try_catch_.Exception();
  }

#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
  inline v8::MaybeLocal<v8::Value> StackTrace() const {
    v8::Isolate *isolate = v8::Isolate::GetCurrent();
    v8::EscapableHandleScope scope(isolate);
    return scope.Escape(try_catch_.StackTrace(isolate->GetCurrentContext())
                            .FromMaybe(v8::Local<v8::Value>()));
  }
#else
  inline MaybeLocal<v8::Value> StackTrace() const {
    return try_catch_.StackTrace();
  }
#endif

  inline v8::Local<v8::Message> Message() const {
    return try_catch_.Message();
  }

  inline void Reset() { try_catch_.Reset(); }

  inline void SetVerbose(bool value) { try_catch_.SetVerbose(value); }

  inline void SetCaptureMessage(bool value) {
    try_catch_.SetCaptureMessage(value);
  }
};

v8::Local<v8::Value> MakeCallback(v8::Local<v8::Object> target,
                                  v8::Local<v8::Function> func,
                                  int argc,
                                  v8::Local<v8::Value>* argv);
v8::Local<v8::Value> MakeCallback(v8::Local<v8::Object> target,
                                  v8::Local<v8::String> symbol,
                                  int argc,
                                  v8::Local<v8::Value>* argv);
v8::Local<v8::Value> MakeCallback(v8::Local<v8::Object> target,
                                  const char* method,
                                  int argc,
                                  v8::Local<v8::Value>* argv);

// === AsyncResource ===========================================================

class AsyncResource {
 public:
  AsyncResource(
      v8::Local<v8::String> name
    , v8::Local<v8::Object> resource = New<v8::Object>()) {
#if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
    v8::Isolate* isolate = v8::Isolate::GetCurrent();

    if (resource.IsEmpty()) {
      resource = New<v8::Object>();
    }

    context = node::EmitAsyncInit(isolate, resource, name);
#endif
  }

  AsyncResource(
      const char* name
    , v8::Local<v8::Object> resource = New<v8::Object>()) {
#if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
    v8::Isolate* isolate = v8::Isolate::GetCurrent();

    if (resource.IsEmpty()) {
      resource = New<v8::Object>();
    }

    v8::Local<v8::String> name_string =
        New<v8::String>(name).ToLocalChecked();
    context = node::EmitAsyncInit(isolate, resource, name_string);
#endif
  }

  ~AsyncResource() {
#if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
    v8::Isolate* isolate = v8::Isolate::GetCurrent();
    node::EmitAsyncDestroy(isolate, context);
#endif
  }

  inline MaybeLocal<v8::Value> runInAsyncScope(
      v8::Local<v8::Object> target
    , v8::Local<v8::Function> func
    , int argc
    , v8::Local<v8::Value>* argv) {
#if NODE_MODULE_VERSION < NODE_9_0_MODULE_VERSION
    return MakeCallback(target, func, argc, argv);
#else
    return node::MakeCallback(
        v8::Isolate::GetCurrent(), target, func, argc, argv, context);
#endif
  }

  inline MaybeLocal<v8::Value> runInAsyncScope(
      v8::Local<v8::Object> target
    , v8::Local<v8::String> symbol
    , int argc
    , v8::Local<v8::Value>* argv) {
#if NODE_MODULE_VERSION < NODE_9_0_MODULE_VERSION
    return MakeCallback(target, symbol, argc, argv);
#else
    return node::MakeCallback(
        v8::Isolate::GetCurrent(), target, symbol, argc, argv, context);
#endif
  }

  inline MaybeLocal<v8::Value> runInAsyncScope(
      v8::Local<v8::Object> target
    , const char* method
    , int argc
    , v8::Local<v8::Value>* argv) {
#if NODE_MODULE_VERSION < NODE_9_0_MODULE_VERSION
    return MakeCallback(target, method, argc, argv);
#else
    return node::MakeCallback(
        v8::Isolate::GetCurrent(), target, method, argc, argv, context);
#endif
  }

 private:
  NAN_DISALLOW_ASSIGN_COPY_MOVE(AsyncResource)
#if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
  node::async_context context;
#endif
};

inline uv_loop_t* GetCurrentEventLoop() {
#if NODE_MAJOR_VERSION >= 10 || \
  NODE_MAJOR_VERSION == 9 && NODE_MINOR_VERSION >= 3 || \
  NODE_MAJOR_VERSION == 8 && NODE_MINOR_VERSION >= 10
    return node::GetCurrentEventLoop(v8::Isolate::GetCurrent());
#else
    return uv_default_loop();
#endif
}

//============ =================================================================

/* node 0.12  */
#if NODE_MODULE_VERSION >= NODE_0_12_MODULE_VERSION
  inline
  void SetCounterFunction(v8::CounterLookupCallback cb) {
    v8::Isolate::GetCurrent()->SetCounterFunction(cb);
  }

  inline
  void SetCreateHistogramFunction(v8::CreateHistogramCallback cb) {
    v8::Isolate::GetCurrent()->SetCreateHistogramFunction(cb);
  }

  inline
  void SetAddHistogramSampleFunction(v8::AddHistogramSampleCallback cb) {
    v8::Isolate::GetCurrent()->SetAddHistogramSampleFunction(cb);
  }

#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
  inline bool IdleNotification(int idle_time_in_ms) {
    return v8::Isolate::GetCurrent()->IdleNotificationDeadline(
        idle_time_in_ms * 0.001);
  }
# else
  inline bool IdleNotification(int idle_time_in_ms) {
    return v8::Isolate::GetCurrent()->IdleNotification(idle_time_in_ms);
  }
#endif

  inline void LowMemoryNotification() {
    v8::Isolate::GetCurrent()->LowMemoryNotification();
  }

  inline void ContextDisposedNotification() {
    v8::Isolate::GetCurrent()->ContextDisposedNotification();
  }
#else
  inline
  void SetCounterFunction(v8::CounterLookupCallback cb) {
    v8::V8::SetCounterFunction(cb);
  }

  inline
  void SetCreateHistogramFunction(v8::CreateHistogramCallback cb) {
    v8::V8::SetCreateHistogramFunction(cb);
  }

  inline
  void SetAddHistogramSampleFunction(v8::AddHistogramSampleCallback cb) {
    v8::V8::SetAddHistogramSampleFunction(cb);
  }

  inline bool IdleNotification(int idle_time_in_ms) {
    return v8::V8::IdleNotification(idle_time_in_ms);
  }

  inline void LowMemoryNotification() {
    v8::V8::LowMemoryNotification();
  }

  inline void ContextDisposedNotification() {
    v8::V8::ContextDisposedNotification();
  }
#endif

#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION)  // Node 0.12
  inline v8::Local<v8::Primitive> Undefined() {
# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
    EscapableHandleScope scope;
    return scope.Escape(New(v8::Undefined(v8::Isolate::GetCurrent())));
# else
    return v8::Undefined(v8::Isolate::GetCurrent());
# endif
  }

  inline v8::Local<v8::Primitive> Null() {
# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
    EscapableHandleScope scope;
    return scope.Escape(New(v8::Null(v8::Isolate::GetCurrent())));
# else
    return v8::Null(v8::Isolate::GetCurrent());
# endif
  }

  inline v8::Local<v8::Boolean> True() {
# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
    EscapableHandleScope scope;
    return scope.Escape(New(v8::True(v8::Isolate::GetCurrent())));
# else
    return v8::True(v8::Isolate::GetCurrent());
# endif
  }

  inline v8::Local<v8::Boolean> False() {
# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
    EscapableHandleScope scope;
    return scope.Escape(New(v8::False(v8::Isolate::GetCurrent())));
# else
    return v8::False(v8::Isolate::GetCurrent());
# endif
  }

  inline v8::Local<v8::String> EmptyString() {
    return v8::String::Empty(v8::Isolate::GetCurrent());
  }

  inline int AdjustExternalMemory(int bc) {
    return static_cast<int>(
        v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(bc));
  }

  inline void SetTemplate(
      v8::Local<v8::Template> templ
    , const char *name
    , v8::Local<v8::Data> value) {
    templ->Set(v8::Isolate::GetCurrent(), name, value);
  }

  inline void SetTemplate(
      v8::Local<v8::Template> templ
    , v8::Local<v8::String> name
    , v8::Local<v8::Data> value
    , v8::PropertyAttribute attributes) {
    templ->Set(name, value, attributes);
  }

  inline v8::Local<v8::Context> GetCurrentContext() {
    return v8::Isolate::GetCurrent()->GetCurrentContext();
  }

  inline void* GetInternalFieldPointer(
      v8::Local<v8::Object> object
    , int index) {
    return object->GetAlignedPointerFromInternalField(index);
  }

  inline void SetInternalFieldPointer(
      v8::Local<v8::Object> object
    , int index
    , void* value) {
    object->SetAlignedPointerInInternalField(index, value);
  }

# define NAN_GC_CALLBACK(name)                                                 \
    void name(v8::Isolate *isolate, v8::GCType type, v8::GCCallbackFlags flags)

#if NODE_MODULE_VERSION <= NODE_4_0_MODULE_VERSION
  typedef v8::Isolate::GCEpilogueCallback GCEpilogueCallback;
  typedef v8::Isolate::GCPrologueCallback GCPrologueCallback;
#else
  typedef v8::Isolate::GCCallback GCEpilogueCallback;
  typedef v8::Isolate::GCCallback GCPrologueCallback;
#endif

  inline void AddGCEpilogueCallback(
      GCEpilogueCallback callback
    , v8::GCType gc_type_filter = v8::kGCTypeAll) {
    v8::Isolate::GetCurrent()->AddGCEpilogueCallback(callback, gc_type_filter);
  }

  inline void RemoveGCEpilogueCallback(
      GCEpilogueCallback callback) {
    v8::Isolate::GetCurrent()->RemoveGCEpilogueCallback(callback);
  }

  inline void AddGCPrologueCallback(
      GCPrologueCallback callback
    , v8::GCType gc_type_filter = v8::kGCTypeAll) {
    v8::Isolate::GetCurrent()->AddGCPrologueCallback(callback, gc_type_filter);
  }

  inline void RemoveGCPrologueCallback(
      GCPrologueCallback callback) {
    v8::Isolate::GetCurrent()->RemoveGCPrologueCallback(callback);
  }

  inline void GetHeapStatistics(
      v8::HeapStatistics *heap_statistics) {
    v8::Isolate::GetCurrent()->GetHeapStatistics(heap_statistics);
  }

# define X(NAME)                                                               \
    inline v8::Local<v8::Value> NAME(const char *msg) {                        \
      EscapableHandleScope scope;                                              \
      return scope.Escape(v8::Exception::NAME(New(msg).ToLocalChecked()));     \
    }                                                                          \
                                                                               \
    inline                                                                     \
    v8::Local<v8::Value> NAME(v8::Local<v8::String> msg) {                     \
      return v8::Exception::NAME(msg);                                         \
    }                                                                          \
                                                                               \
    inline void Throw ## NAME(const char *msg) {                               \
      HandleScope scope;                                                       \
      v8::Isolate::GetCurrent()->ThrowException(                               \
          v8::Exception::NAME(New(msg).ToLocalChecked()));                     \
    }                                                                          \
                                                                               \
    inline void Throw ## NAME(v8::Local<v8::String> msg) {                     \
      HandleScope scope;                                                       \
      v8::Isolate::GetCurrent()->ThrowException(                               \
          v8::Exception::NAME(msg));                                           \
    }

  X(Error)
  X(RangeError)
  X(ReferenceError)
  X(SyntaxError)
  X(TypeError)

# undef X

  inline void ThrowError(v8::Local<v8::Value> error) {
    v8::Isolate::GetCurrent()->ThrowException(error);
  }

  inline MaybeLocal<v8::Object> NewBuffer(
      char *data
    , size_t length
#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION
    , node::Buffer::FreeCallback callback
#else
    , node::smalloc::FreeCallback callback
#endif
    , void *hint
  ) {
    // arbitrary buffer lengths requires
    // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION
    assert(length <= imp::kMaxLength && "too large buffer");
#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION
    return node::Buffer::New(
        v8::Isolate::GetCurrent(), data, length, callback, hint);
#else
    return node::Buffer::New(v8::Isolate::GetCurrent(), data, length, callback,
                             hint);
#endif
  }

  inline MaybeLocal<v8::Object> CopyBuffer(
      const char *data
    , uint32_t size
  ) {
    // arbitrary buffer lengths requires
    // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION
    assert(size <= imp::kMaxLength && "too large buffer");
#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION
    return node::Buffer::Copy(
        v8::Isolate::GetCurrent(), data, size);
#else
    return node::Buffer::New(v8::Isolate::GetCurrent(), data, size);
#endif
  }

  inline MaybeLocal<v8::Object> NewBuffer(uint32_t size) {
    // arbitrary buffer lengths requires
    // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION
    assert(size <= imp::kMaxLength && "too large buffer");
#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION
    return node::Buffer::New(
        v8::Isolate::GetCurrent(), size);
#else
    return node::Buffer::New(v8::Isolate::GetCurrent(), size);
#endif
  }

  inline MaybeLocal<v8::Object> NewBuffer(
      char* data
    , uint32_t size
  ) {
    // arbitrary buffer lengths requires
    // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION
    assert(size <= imp::kMaxLength && "too large buffer");
#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION
    return node::Buffer::New(v8::Isolate::GetCurrent(), data, size);
#else
    return node::Buffer::Use(v8::Isolate::GetCurrent(), data, size);
#endif
  }

#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
  inline MaybeLocal<v8::String>
  NewOneByteString(const uint8_t * value, int length = -1) {
    return v8::String::NewFromOneByte(v8::Isolate::GetCurrent(), value,
          v8::NewStringType::kNormal, length);
  }

  inline MaybeLocal<BoundScript> CompileScript(
      v8::Local<v8::String> s
    , const v8::ScriptOrigin& origin
  ) {
    v8::Isolate *isolate = v8::Isolate::GetCurrent();
    v8::EscapableHandleScope scope(isolate);
    v8::ScriptCompiler::Source source(s, origin);
    return scope.Escape(
        v8::ScriptCompiler::Compile(isolate->GetCurrentContext(), &source)
            .FromMaybe(v8::Local<BoundScript>()));
  }

  inline MaybeLocal<BoundScript> CompileScript(
      v8::Local<v8::String> s
  ) {
    v8::Isolate *isolate = v8::Isolate::GetCurrent();
    v8::EscapableHandleScope scope(isolate);
    v8::ScriptCompiler::Source source(s);
    return scope.Escape(
        v8::ScriptCompiler::Compile(isolate->GetCurrentContext(), &source)
            .FromMaybe(v8::Local<BoundScript>()));
  }

  inline MaybeLocal<v8::Value> RunScript(
      v8::Local<UnboundScript> script
  ) {
    v8::Isolate *isolate = v8::Isolate::GetCurrent();
    v8::EscapableHandleScope scope(isolate);
    return scope.Escape(script->BindToCurrentContext()
                            ->Run(isolate->GetCurrentContext())
                            .FromMaybe(v8::Local<v8::Value>()));
  }

  inline MaybeLocal<v8::Value> RunScript(
      v8::Local<BoundScript> script
  ) {
    v8::Isolate *isolate = v8::Isolate::GetCurrent();
    v8::EscapableHandleScope scope(isolate);
    return scope.Escape(script->Run(isolate->GetCurrentContext())
                            .FromMaybe(v8::Local<v8::Value>()));
  }
#else
  inline MaybeLocal<v8::String>
  NewOneByteString(const uint8_t * value, int length = -1) {
    return v8::String::NewFromOneByte(v8::Isolate::GetCurrent(), value,
                                      v8::String::kNormalString, length);
  }

  inline MaybeLocal<BoundScript> CompileScript(
      v8::Local<v8::String> s
    , const v8::ScriptOrigin& origin
  ) {
    v8::ScriptCompiler::Source source(s, origin);
    return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &source);
  }

  inline MaybeLocal<BoundScript> CompileScript(
      v8::Local<v8::String> s
  ) {
    v8::ScriptCompiler::Source source(s);
    return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &source);
  }

  inline MaybeLocal<v8::Value> RunScript(
      v8::Local<UnboundScript> script
  ) {
    EscapableHandleScope scope;
    return scope.Escape(script->BindToCurrentContext()->Run());
  }

  inline MaybeLocal<v8::Value> RunScript(
      v8::Local<BoundScript> script
  ) {
    return script->Run();
  }
#endif

  NAN_DEPRECATED inline v8::Local<v8::Value> MakeCallback(
      v8::Local<v8::Object> target
    , v8::Local<v8::Function> func
    , int argc
    , v8::Local<v8::Value>* argv) {
#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
    EscapableHandleScope scope;
    return scope.Escape(New(node::MakeCallback(
        v8::Isolate::GetCurrent(), target, func, argc, argv)));
#else
# if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
    AsyncResource res("nan:makeCallback");
    return res.runInAsyncScope(target, func, argc, argv)
        .FromMaybe(v8::Local<v8::Value>());
# else
    return node::MakeCallback(
        v8::Isolate::GetCurrent(), target, func, argc, argv);
# endif  // NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
#endif  // NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
  }

  NAN_DEPRECATED inline v8::Local<v8::Value> MakeCallback(
      v8::Local<v8::Object> target
    , v8::Local<v8::String> symbol
    , int argc
    , v8::Local<v8::Value>* argv) {
#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
    EscapableHandleScope scope;
    return scope.Escape(New(node::MakeCallback(
        v8::Isolate::GetCurrent(), target, symbol, argc, argv)));
#else
# if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
    AsyncResource res("nan:makeCallback");
    return res.runInAsyncScope(target, symbol, argc, argv)
        .FromMaybe(v8::Local<v8::Value>());
# else
    return node::MakeCallback(
        v8::Isolate::GetCurrent(), target, symbol, argc, argv);
# endif  // NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
#endif  // NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
  }

  NAN_DEPRECATED inline v8::Local<v8::Value> MakeCallback(
      v8::Local<v8::Object> target
    , const char* method
    , int argc
    , v8::Local<v8::Value>* argv) {
#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
    EscapableHandleScope scope;
    return scope.Escape(New(node::MakeCallback(
        v8::Isolate::GetCurrent(), target, method, argc, argv)));
#else
# if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
    AsyncResource res("nan:makeCallback");
    return res.runInAsyncScope(target, method, argc, argv)
        .FromMaybe(v8::Local<v8::Value>());
# else
    return node::MakeCallback(
        v8::Isolate::GetCurrent(), target, method, argc, argv);
# endif  // NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
#endif  // NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
  }

  inline void FatalException(const TryCatch& try_catch) {
    node::FatalException(v8::Isolate::GetCurrent(), try_catch.try_catch_);
  }

  inline v8::Local<v8::Value> ErrnoException(
          int errorno
       ,  const char* syscall = NULL
       ,  const char* message = NULL
       ,  const char* path = NULL) {
    return node::ErrnoException(v8::Isolate::GetCurrent(), errorno, syscall,
            message, path);
  }

  NAN_DEPRECATED inline v8::Local<v8::Value> NanErrnoException(
          int errorno
       ,  const char* syscall = NULL
       ,  const char* message = NULL
       ,  const char* path = NULL) {
    return ErrnoException(errorno, syscall, message, path);
  }

  template<typename T>
  inline void SetIsolateData(
      v8::Isolate *isolate
    , T *data
  ) {
      isolate->SetData(0, data);
  }

  template<typename T>
  inline T *GetIsolateData(
      v8::Isolate *isolate
  ) {
      return static_cast<T*>(isolate->GetData(0));
  }

class Utf8String {
 public:
  inline explicit Utf8String(v8::Local<v8::Value> from) :
      length_(0), str_(str_st_) {
    HandleScope scope;
    if (!from.IsEmpty()) {
#if NODE_MAJOR_VERSION >= 10
      v8::Local<v8::Context> context = GetCurrentContext();
      v8::Local<v8::String> string =
          from->ToString(context).FromMaybe(v8::Local<v8::String>());
#else
      v8::Local<v8::String> string = from->ToString();
#endif
      if (!string.IsEmpty()) {
        size_t len = 3 * string->Length() + 1;
        assert(len <= INT_MAX);
        if (len > sizeof (str_st_)) {
          str_ = static_cast<char*>(malloc(len));
          assert(str_ != 0);
        }
        const int flags =
            v8::String::NO_NULL_TERMINATION | imp::kReplaceInvalidUtf8;
#if NODE_MAJOR_VERSION >= 11
        length_ = string->WriteUtf8(v8::Isolate::GetCurrent(), str_,
                                    static_cast<int>(len), 0, flags);
#else
        // See https://github.com/nodejs/nan/issues/832.
        // Disable the warning as there is no way around it.
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4996)
#endif
#ifdef __GNUC__
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#endif
        length_ = string->WriteUtf8(str_, static_cast<int>(len), 0, flags);
#ifdef __GNUC__
#pragma GCC diagnostic pop
#endif
#ifdef _MSC_VER
#pragma warning(pop)
#endif
#endif  // NODE_MAJOR_VERSION < 11
        str_[length_] = '\0';
      }
    }
  }

  inline int length() const {
    return length_;
  }

  inline char* operator*() { return str_; }
  inline const char* operator*() const { return str_; }

  inline ~Utf8String() {
    if (str_ != str_st_) {
      free(str_);
    }
  }

 private:
  NAN_DISALLOW_ASSIGN_COPY_MOVE(Utf8String)

  int length_;
  char *str_;
  char str_st_[1024];
};

#else  // Node 0.8 and 0.10
  inline v8::Local<v8::Primitive> Undefined() {
    EscapableHandleScope scope;
    return scope.Escape(New(v8::Undefined()));
  }

  inline v8::Local<v8::Primitive> Null() {
    EscapableHandleScope scope;
    return scope.Escape(New(v8::Null()));
  }

  inline v8::Local<v8::Boolean> True() {
    EscapableHandleScope scope;
    return scope.Escape(New(v8::True()));
  }

  inline v8::Local<v8::Boolean> False() {
    EscapableHandleScope scope;
    return scope.Escape(New(v8::False()));
  }

  inline v8::Local<v8::String> EmptyString() {
    return v8::String::Empty();
  }

  inline int AdjustExternalMemory(int bc) {
    return static_cast<int>(v8::V8::AdjustAmountOfExternalAllocatedMemory(bc));
  }

  inline void SetTemplate(
      v8::Local<v8::Template> templ
    , const char *name
    , v8::Local<v8::Data> value) {
    templ->Set(name, value);
  }

  inline void SetTemplate(
      v8::Local<v8::Template> templ
    , v8::Local<v8::String> name
    , v8::Local<v8::Data> value
    , v8::PropertyAttribute attributes) {
    templ->Set(name, value, attributes);
  }

  inline v8::Local<v8::Context> GetCurrentContext() {
    return v8::Context::GetCurrent();
  }

  inline void* GetInternalFieldPointer(
      v8::Local<v8::Object> object
    , int index) {
    return object->GetPointerFromInternalField(index);
  }

  inline void SetInternalFieldPointer(
      v8::Local<v8::Object> object
    , int index
    , void* value) {
    object->SetPointerInInternalField(index, value);
  }

# define NAN_GC_CALLBACK(name)                                                 \
    void name(v8::GCType type, v8::GCCallbackFlags flags)

  inline void AddGCEpilogueCallback(
    v8::GCEpilogueCallback callback
  , v8::GCType gc_type_filter = v8::kGCTypeAll) {
    v8::V8::AddGCEpilogueCallback(callback, gc_type_filter);
  }
  inline void RemoveGCEpilogueCallback(
    v8::GCEpilogueCallback callback) {
    v8::V8::RemoveGCEpilogueCallback(callback);
  }
  inline void AddGCPrologueCallback(
    v8::GCPrologueCallback callback
  , v8::GCType gc_type_filter = v8::kGCTypeAll) {
    v8::V8::AddGCPrologueCallback(callback, gc_type_filter);
  }
  inline void RemoveGCPrologueCallback(
    v8::GCPrologueCallback callback) {
    v8::V8::RemoveGCPrologueCallback(callback);
  }
  inline void GetHeapStatistics(
    v8::HeapStatistics *heap_statistics) {
    v8::V8::GetHeapStatistics(heap_statistics);
  }

# define X(NAME)                                                               \
    inline v8::Local<v8::Value> NAME(const char *msg) {                        \
      EscapableHandleScope scope;                                              \
      return scope.Escape(v8::Exception::NAME(New(msg).ToLocalChecked()));     \
    }                                                                          \
                                                                               \
    inline                                                                     \
    v8::Local<v8::Value> NAME(v8::Local<v8::String> msg) {                     \
      return v8::Exception::NAME(msg);                                         \
    }                                                                          \
                                                                               \
    inline void Throw ## NAME(const char *msg) {                               \
      HandleScope scope;                                                       \
      v8::ThrowException(v8::Exception::NAME(New(msg).ToLocalChecked()));      \
    }                                                                          \
                                                                               \
    inline                                                                     \
    void Throw ## NAME(v8::Local<v8::String> errmsg) {                         \
      HandleScope scope;                                                       \
      v8::ThrowException(v8::Exception::NAME(errmsg));                         \
    }

  X(Error)
  X(RangeError)
  X(ReferenceError)
  X(SyntaxError)
  X(TypeError)

# undef X

  inline void ThrowError(v8::Local<v8::Value> error) {
    v8::ThrowException(error);
  }

  inline MaybeLocal<v8::Object> NewBuffer(
      char *data
    , size_t length
    , node::Buffer::free_callback callback
    , void *hint
  ) {
    EscapableHandleScope scope;
    // arbitrary buffer lengths requires
    // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION
    assert(length <= imp::kMaxLength && "too large buffer");
    return scope.Escape(
        New(node::Buffer::New(data, length, callback, hint)->handle_));
  }

  inline MaybeLocal<v8::Object> CopyBuffer(
      const char *data
    , uint32_t size
  ) {
    EscapableHandleScope scope;
    // arbitrary buffer lengths requires
    // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION
    assert(size <= imp::kMaxLength && "too large buffer");
#if NODE_MODULE_VERSION >= NODE_0_10_MODULE_VERSION
    return scope.Escape(New(node::Buffer::New(data, size)->handle_));
#else
    return scope.Escape(
        New(node::Buffer::New(const_cast<char *>(data), size)->handle_));
#endif
  }

  inline MaybeLocal<v8::Object> NewBuffer(uint32_t size) {
    // arbitrary buffer lengths requires
    // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION
    EscapableHandleScope scope;
    assert(size <= imp::kMaxLength && "too large buffer");
    return scope.Escape(New(node::Buffer::New(size)->handle_));
  }

  inline void FreeData(char *data, void *hint) {
    (void) hint;  // unused
    delete[] data;
  }

  inline MaybeLocal<v8::Object> NewBuffer(
      char* data
    , uint32_t size
  ) {
    EscapableHandleScope scope;
    // arbitrary buffer lengths requires
    // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION
    assert(size <= imp::kMaxLength && "too large buffer");
    return scope.Escape(
        New(node::Buffer::New(data, size, FreeData, NULL)->handle_));
  }

namespace imp {
inline void
widenString(std::vector<uint16_t> *ws, const uint8_t *s, int l) {
  size_t len = static_cast<size_t>(l);
  if (l < 0) {
    len = strlen(reinterpret_cast<const char*>(s));
  }
  assert(len <= INT_MAX && "string too long");
  ws->resize(len);
  std::copy(s, s + len, ws->begin());  // NOLINT(build/include_what_you_use)
}
}  // end of namespace imp

  inline MaybeLocal<v8::String>
  NewOneByteString(const uint8_t * value, int length = -1) {
    std::vector<uint16_t> wideString;  // NOLINT(build/include_what_you_use)
    imp::widenString(&wideString, value, length);
    return v8::String::New(wideString.data(),
                           static_cast<int>(wideString.size()));
  }

  inline MaybeLocal<BoundScript> CompileScript(
      v8::Local<v8::String> s
    , const v8::ScriptOrigin& origin
  ) {
    return v8::Script::Compile(s, const_cast<v8::ScriptOrigin *>(&origin));
  }

  inline MaybeLocal<BoundScript> CompileScript(
    v8::Local<v8::String> s
  ) {
    return v8::Script::Compile(s);
  }

  inline
  MaybeLocal<v8::Value> RunScript(v8::Local<v8::Script> script) {
    return script->Run();
  }

  inline v8::Local<v8::Value> MakeCallback(
      v8::Local<v8::Object> target
    , v8::Local<v8::Function> func
    , int argc
    , v8::Local<v8::Value>* argv) {
    v8::HandleScope scope;
    return scope.Close(New(node::MakeCallback(target, func, argc, argv)));
  }

  inline v8::Local<v8::Value> MakeCallback(
      v8::Local<v8::Object> target
    , v8::Local<v8::String> symbol
    , int argc
    , v8::Local<v8::Value>* argv) {
    v8::HandleScope scope;
    return scope.Close(New(node::MakeCallback(target, symbol, argc, argv)));
  }

  inline v8::Local<v8::Value> MakeCallback(
      v8::Local<v8::Object> target
    , const char* method
    , int argc
    , v8::Local<v8::Value>* argv) {
    v8::HandleScope scope;
    return scope.Close(New(node::MakeCallback(target, method, argc, argv)));
  }

  inline void FatalException(const TryCatch& try_catch) {
    node::FatalException(const_cast<v8::TryCatch &>(try_catch.try_catch_));
  }

  inline v8::Local<v8::Value> ErrnoException(
          int errorno
       ,  const char* syscall = NULL
       ,  const char* message = NULL
       ,  const char* path = NULL) {
    return node::ErrnoException(errorno, syscall, message, path);
  }

  NAN_DEPRECATED inline v8::Local<v8::Value> NanErrnoException(
          int errorno
       ,  const char* syscall = NULL
       ,  const char* message = NULL
       ,  const char* path = NULL) {
    return ErrnoException(errorno, syscall, message, path);
  }


  template<typename T>
  inline void SetIsolateData(
      v8::Isolate *isolate
    , T *data
  ) {
      isolate->SetData(data);
  }

  template<typename T>
  inline T *GetIsolateData(
      v8::Isolate *isolate
  ) {
      return static_cast<T*>(isolate->GetData());
  }

class Utf8String {
 public:
  inline explicit Utf8String(v8::Local<v8::Value> from) :
      length_(0), str_(str_st_) {
    v8::HandleScope scope;
    if (!from.IsEmpty()) {
      v8::Local<v8::String> string = from->ToString();
      if (!string.IsEmpty()) {
        size_t len = 3 * string->Length() + 1;
        assert(len <= INT_MAX);
        if (len > sizeof (str_st_)) {
          str_ = static_cast<char*>(malloc(len));
          assert(str_ != 0);
        }
        const int flags =
            v8::String::NO_NULL_TERMINATION | imp::kReplaceInvalidUtf8;
        length_ = string->WriteUtf8(str_, static_cast<int>(len), 0, flags);
        str_[length_] = '\0';
      }
    }
  }

  inline int length() const {
    return length_;
  }

  inline char* operator*() { return str_; }
  inline const char* operator*() const { return str_; }

  inline ~Utf8String() {
    if (str_ != str_st_) {
      free(str_);
    }
  }

 private:
  NAN_DISALLOW_ASSIGN_COPY_MOVE(Utf8String)

  int length_;
  char *str_;
  char str_st_[1024];
};

#endif  // NODE_MODULE_VERSION

typedef void (*FreeCallback)(char *data, void *hint);

typedef const FunctionCallbackInfo<v8::Value>& NAN_METHOD_ARGS_TYPE;
typedef void NAN_METHOD_RETURN_TYPE;

typedef const PropertyCallbackInfo<v8::Value>& NAN_GETTER_ARGS_TYPE;
typedef void NAN_GETTER_RETURN_TYPE;

typedef const PropertyCallbackInfo<void>& NAN_SETTER_ARGS_TYPE;
typedef void NAN_SETTER_RETURN_TYPE;

typedef const PropertyCallbackInfo<v8::Value>&
    NAN_PROPERTY_GETTER_ARGS_TYPE;
typedef void NAN_PROPERTY_GETTER_RETURN_TYPE;

typedef const PropertyCallbackInfo<v8::Value>&
    NAN_PROPERTY_SETTER_ARGS_TYPE;
typedef void NAN_PROPERTY_SETTER_RETURN_TYPE;

typedef const PropertyCallbackInfo<v8::Array>&
    NAN_PROPERTY_ENUMERATOR_ARGS_TYPE;
typedef void NAN_PROPERTY_ENUMERATOR_RETURN_TYPE;

typedef const PropertyCallbackInfo<v8::Boolean>&
    NAN_PROPERTY_DELETER_ARGS_TYPE;
typedef void NAN_PROPERTY_DELETER_RETURN_TYPE;

typedef const PropertyCallbackInfo<v8::Integer>&
    NAN_PROPERTY_QUERY_ARGS_TYPE;
typedef void NAN_PROPERTY_QUERY_RETURN_TYPE;

typedef const PropertyCallbackInfo<v8::Value>& NAN_INDEX_GETTER_ARGS_TYPE;
typedef void NAN_INDEX_GETTER_RETURN_TYPE;

typedef const PropertyCallbackInfo<v8::Value>& NAN_INDEX_SETTER_ARGS_TYPE;
typedef void NAN_INDEX_SETTER_RETURN_TYPE;

typedef const PropertyCallbackInfo<v8::Array>&
    NAN_INDEX_ENUMERATOR_ARGS_TYPE;
typedef void NAN_INDEX_ENUMERATOR_RETURN_TYPE;

typedef const PropertyCallbackInfo<v8::Boolean>&
    NAN_INDEX_DELETER_ARGS_TYPE;
typedef void NAN_INDEX_DELETER_RETURN_TYPE;

typedef const PropertyCallbackInfo<v8::Integer>&
    NAN_INDEX_QUERY_ARGS_TYPE;
typedef void NAN_INDEX_QUERY_RETURN_TYPE;

#define NAN_METHOD(name)                                                       \
    Nan::NAN_METHOD_RETURN_TYPE name(Nan::NAN_METHOD_ARGS_TYPE info)
#define NAN_GETTER(name)                                                       \
    Nan::NAN_GETTER_RETURN_TYPE name(                                          \
        v8::Local<v8::String> property                                         \
      , Nan::NAN_GETTER_ARGS_TYPE info)
#define NAN_SETTER(name)                                                       \
    Nan::NAN_SETTER_RETURN_TYPE name(                                          \
        v8::Local<v8::String> property                                         \
      , v8::Local<v8::Value> value                                             \
      , Nan::NAN_SETTER_ARGS_TYPE info)
#define NAN_PROPERTY_GETTER(name)                                              \
    Nan::NAN_PROPERTY_GETTER_RETURN_TYPE name(                                 \
        v8::Local<v8::String> property                                         \
      , Nan::NAN_PROPERTY_GETTER_ARGS_TYPE info)
#define NAN_PROPERTY_SETTER(name)                                              \
    Nan::NAN_PROPERTY_SETTER_RETURN_TYPE name(                                 \
        v8::Local<v8::String> property                                         \
      , v8::Local<v8::Value> value                                             \
      , Nan::NAN_PROPERTY_SETTER_ARGS_TYPE info)
#define NAN_PROPERTY_ENUMERATOR(name)                                          \
    Nan::NAN_PROPERTY_ENUMERATOR_RETURN_TYPE name(                             \
        Nan::NAN_PROPERTY_ENUMERATOR_ARGS_TYPE info)
#define NAN_PROPERTY_DELETER(name)                                             \
    Nan::NAN_PROPERTY_DELETER_RETURN_TYPE name(                                \
        v8::Local<v8::String> property                                         \
      , Nan::NAN_PROPERTY_DELETER_ARGS_TYPE info)
#define NAN_PROPERTY_QUERY(name)                                               \
    Nan::NAN_PROPERTY_QUERY_RETURN_TYPE name(                                  \
        v8::Local<v8::String> property                                         \
      , Nan::NAN_PROPERTY_QUERY_ARGS_TYPE info)
# define NAN_INDEX_GETTER(name)                                                \
    Nan::NAN_INDEX_GETTER_RETURN_TYPE name(                                    \
        uint32_t index                                                         \
      , Nan::NAN_INDEX_GETTER_ARGS_TYPE info)
#define NAN_INDEX_SETTER(name)                                                 \
    Nan::NAN_INDEX_SETTER_RETURN_TYPE name(                                    \
        uint32_t index                                                         \
      , v8::Local<v8::Value> value                                             \
      , Nan::NAN_INDEX_SETTER_ARGS_TYPE info)
#define NAN_INDEX_ENUMERATOR(name)                                             \
    Nan::NAN_INDEX_ENUMERATOR_RETURN_TYPE                                      \
    name(Nan::NAN_INDEX_ENUMERATOR_ARGS_TYPE info)
#define NAN_INDEX_DELETER(name)                                                \
    Nan::NAN_INDEX_DELETER_RETURN_TYPE name(                                   \
        uint32_t index                                                         \
      , Nan::NAN_INDEX_DELETER_ARGS_TYPE info)
#define NAN_INDEX_QUERY(name)                                                  \
    Nan::NAN_INDEX_QUERY_RETURN_TYPE name(                                     \
        uint32_t index                                                         \
      , Nan::NAN_INDEX_QUERY_ARGS_TYPE info)

class Callback {
 public:
  Callback() {}

  explicit Callback(const v8::Local<v8::Function> &fn) : handle_(fn) {}

  ~Callback() {
    handle_.Reset();
  }

  bool operator==(const Callback &other) const {
    return handle_ == other.handle_;
  }

  bool operator!=(const Callback &other) const {
    return !operator==(other);
  }

  inline
  v8::Local<v8::Function> operator*() const { return GetFunction(); }

  NAN_DEPRECATED inline v8::Local<v8::Value> operator()(
      v8::Local<v8::Object> target
    , int argc = 0
    , v8::Local<v8::Value> argv[] = 0) const {
#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
    v8::Isolate *isolate = v8::Isolate::GetCurrent();
# if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
    AsyncResource async("nan:Callback:operator()");
    return Call_(isolate, target, argc, argv, &async)
        .FromMaybe(v8::Local<v8::Value>());
# else
    return Call_(isolate, target, argc, argv);
# endif  // NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
#else
    return Call_(target, argc, argv);
#endif  //  NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
  }

  NAN_DEPRECATED inline v8::Local<v8::Value> operator()(
      int argc = 0
    , v8::Local<v8::Value> argv[] = 0) const {
#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
    v8::Isolate *isolate = v8::Isolate::GetCurrent();
    v8::EscapableHandleScope scope(isolate);
# if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
    AsyncResource async("nan:Callback:operator()");
    return scope.Escape(Call_(isolate, isolate->GetCurrentContext()->Global(),
                              argc, argv, &async)
                            .FromMaybe(v8::Local<v8::Value>()));
# else
    return scope.Escape(
        Call_(isolate, isolate->GetCurrentContext()->Global(), argc, argv));
# endif  // NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
#else
    v8::HandleScope scope;
    return scope.Close(Call_(v8::Context::GetCurrent()->Global(), argc, argv));
#endif  //  NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
  }

  inline MaybeLocal<v8::Value> operator()(
      AsyncResource* resource
    , int argc = 0
    , v8::Local<v8::Value> argv[] = 0) const {
    return this->Call(argc, argv, resource);
  }

  inline MaybeLocal<v8::Value> operator()(
      AsyncResource* resource
    , v8::Local<v8::Object> target
    , int argc = 0
    , v8::Local<v8::Value> argv[] = 0) const {
    return this->Call(target, argc, argv, resource);
  }

  // TODO(kkoopa): remove
  inline void SetFunction(const v8::Local<v8::Function> &fn) {
    Reset(fn);
  }

  inline void Reset(const v8::Local<v8::Function> &fn) {
    handle_.Reset(fn);
  }

  inline void Reset() {
    handle_.Reset();
  }

  inline v8::Local<v8::Function> GetFunction() const {
    return New(handle_);
  }

  inline bool IsEmpty() const {
    return handle_.IsEmpty();
  }

  // Deprecated: For async callbacks Use the versions that accept an
  // AsyncResource. If this callback does not correspond to an async resource,
  // that is, it is a synchronous function call on a non-empty JS stack, you
  // should Nan::Call instead.
  NAN_DEPRECATED inline v8::Local<v8::Value>
  Call(v8::Local<v8::Object> target
     , int argc
     , v8::Local<v8::Value> argv[]) const {
#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
    v8::Isolate *isolate = v8::Isolate::GetCurrent();
# if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
    AsyncResource async("nan:Callback:Call");
    return Call_(isolate, target, argc, argv, &async)
        .FromMaybe(v8::Local<v8::Value>());
# else
    return Call_(isolate, target, argc, argv);
# endif  // NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
#else
    return Call_(target, argc, argv);
#endif
  }

  // Deprecated: For async callbacks Use the versions that accept an
  // AsyncResource. If this callback does not correspond to an async resource,
  // that is, it is a synchronous function call on a non-empty JS stack, you
  // should Nan::Call instead.
  NAN_DEPRECATED inline v8::Local<v8::Value>
  Call(int argc, v8::Local<v8::Value> argv[]) const {
#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
    v8::Isolate *isolate = v8::Isolate::GetCurrent();
    v8::EscapableHandleScope scope(isolate);
# if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
    AsyncResource async("nan:Callback:Call");
    return scope.Escape(Call_(isolate, isolate->GetCurrentContext()->Global(),
                              argc, argv, &async)
                            .FromMaybe(v8::Local<v8::Value>()));
# else
    return scope.Escape(
        Call_(isolate, isolate->GetCurrentContext()->Global(), argc, argv));
# endif  // NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
#else
    v8::HandleScope scope;
    return scope.Close(Call_(v8::Context::GetCurrent()->Global(), argc, argv));
#endif
  }

  inline MaybeLocal<v8::Value>
  Call(v8::Local<v8::Object> target
     , int argc
     , v8::Local<v8::Value> argv[]
     , AsyncResource* resource) const {
#if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
    v8::Isolate* isolate = v8::Isolate::GetCurrent();
    return Call_(isolate, target, argc, argv, resource);
#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
    v8::Isolate *isolate = v8::Isolate::GetCurrent();
    return Call_(isolate, target, argc, argv);
#else
    return Call_(target, argc, argv);
#endif
  }

  inline MaybeLocal<v8::Value>
  Call(int argc, v8::Local<v8::Value> argv[], AsyncResource* resource) const {
#if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
    v8::Isolate* isolate = v8::Isolate::GetCurrent();
    return Call(isolate->GetCurrentContext()->Global(), argc, argv, resource);
#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
    v8::Isolate *isolate = v8::Isolate::GetCurrent();
    v8::EscapableHandleScope scope(isolate);
    return scope.Escape(
        Call_(isolate, isolate->GetCurrentContext()->Global(), argc, argv));
#else
    v8::HandleScope scope;
    return scope.Close(Call_(v8::Context::GetCurrent()->Global(), argc, argv));
#endif
  }

 private:
  NAN_DISALLOW_ASSIGN_COPY_MOVE(Callback)
  Persistent<v8::Function> handle_;

#if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
  MaybeLocal<v8::Value> Call_(v8::Isolate *isolate
                            , v8::Local<v8::Object> target
                            , int argc
                            , v8::Local<v8::Value> argv[]
                            , AsyncResource* resource) const {
    EscapableHandleScope scope;
    v8::Local<v8::Function> func = New(handle_);
    auto maybe = resource->runInAsyncScope(target, func, argc, argv);
    v8::Local<v8::Value> local;
    if (!maybe.ToLocal(&local)) return MaybeLocal<v8::Value>();
    return scope.Escape(local);
  }
#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
  v8::Local<v8::Value> Call_(v8::Isolate *isolate
                           , v8::Local<v8::Object> target
                           , int argc
                           , v8::Local<v8::Value> argv[]) const {
    EscapableHandleScope scope;

    v8::Local<v8::Function> callback = New(handle_);
# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
    return scope.Escape(New(node::MakeCallback(
        isolate
      , target
      , callback
      , argc
      , argv
    )));
# else
    return scope.Escape(node::MakeCallback(
        isolate
      , target
      , callback
      , argc
      , argv
    ));
# endif
  }
#else
  v8::Local<v8::Value> Call_(v8::Local<v8::Object> target
                           , int argc
                           , v8::Local<v8::Value> argv[]) const {
    EscapableHandleScope scope;

    v8::Local<v8::Function> callback = New(handle_);
    return scope.Escape(New(node::MakeCallback(
        target
      , callback
      , argc
      , argv
    )));
  }
#endif
};

inline MaybeLocal<v8::Value> Call(
    const Nan::Callback& callback
  , v8::Local<v8::Object> recv
  , int argc
  , v8::Local<v8::Value> argv[]) {
  return Call(*callback, recv, argc, argv);
}

inline MaybeLocal<v8::Value> Call(
    const Nan::Callback& callback
  , int argc
  , v8::Local<v8::Value> argv[]) {
#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
  v8::Isolate* isolate = v8::Isolate::GetCurrent();
  v8::EscapableHandleScope scope(isolate);
  return scope.Escape(
      Call(*callback, isolate->GetCurrentContext()->Global(), argc, argv)
          .FromMaybe(v8::Local<v8::Value>()));
#else
  EscapableHandleScope scope;
  return scope.Escape(
      Call(*callback, v8::Context::GetCurrent()->Global(), argc, argv)
          .FromMaybe(v8::Local<v8::Value>()));
#endif
}

inline MaybeLocal<v8::Value> Call(
    v8::Local<v8::String> symbol
  , v8::Local<v8::Object> recv
  , int argc
  , v8::Local<v8::Value> argv[]) {
  EscapableHandleScope scope;
  v8::Local<v8::Value> fn_v =
      Get(recv, symbol).FromMaybe(v8::Local<v8::Value>());
  if (fn_v.IsEmpty() || !fn_v->IsFunction()) return v8::Local<v8::Value>();
  v8::Local<v8::Function> fn = fn_v.As<v8::Function>();
  return scope.Escape(
      Call(fn, recv, argc, argv).FromMaybe(v8::Local<v8::Value>()));
}

inline MaybeLocal<v8::Value> Call(
    const char* method
  , v8::Local<v8::Object> recv
  , int argc
  , v8::Local<v8::Value> argv[]) {
  EscapableHandleScope scope;
  v8::Local<v8::String> method_string =
      New<v8::String>(method).ToLocalChecked();
  return scope.Escape(
      Call(method_string, recv, argc, argv).FromMaybe(v8::Local<v8::Value>()));
}

/* abstract */ class AsyncWorker {
 public:
  explicit AsyncWorker(Callback *callback_,
                       const char* resource_name = "nan:AsyncWorker")
      : callback(callback_), errmsg_(NULL) {
    request.data = this;

    HandleScope scope;
    v8::Local<v8::Object> obj = New<v8::Object>();
    persistentHandle.Reset(obj);
    async_resource = new AsyncResource(resource_name, obj);
  }

  virtual ~AsyncWorker() {
    HandleScope scope;

    if (!persistentHandle.IsEmpty())
      persistentHandle.Reset();
    delete callback;
    delete[] errmsg_;
    delete async_resource;
  }

  virtual void WorkComplete() {
    HandleScope scope;

    if (errmsg_ == NULL)
      HandleOKCallback();
    else
      HandleErrorCallback();
    delete callback;
    callback = NULL;
  }

  inline void SaveToPersistent(
      const char *key, const v8::Local<v8::Value> &value) {
    HandleScope scope;
    Set(New(persistentHandle), New(key).ToLocalChecked(), value).FromJust();
  }

  inline void SaveToPersistent(
      const v8::Local<v8::String> &key, const v8::Local<v8::Value> &value) {
    HandleScope scope;
    Set(New(persistentHandle), key, value).FromJust();
  }

  inline void SaveToPersistent(
      uint32_t index, const v8::Local<v8::Value> &value) {
    HandleScope scope;
    Set(New(persistentHandle), index, value).FromJust();
  }

  inline v8::Local<v8::Value> GetFromPersistent(const char *key) const {
    EscapableHandleScope scope;
    return scope.Escape(
        Get(New(persistentHandle), New(key).ToLocalChecked())
        .FromMaybe(v8::Local<v8::Value>()));
  }

  inline v8::Local<v8::Value>
  GetFromPersistent(const v8::Local<v8::String> &key) const {
    EscapableHandleScope scope;
    return scope.Escape(
        Get(New(persistentHandle), key)
        .FromMaybe(v8::Local<v8::Value>()));
  }

  inline v8::Local<v8::Value> GetFromPersistent(uint32_t index) const {
    EscapableHandleScope scope;
    return scope.Escape(
        Get(New(persistentHandle), index)
        .FromMaybe(v8::Local<v8::Value>()));
  }

  virtual void Execute() = 0;

  uv_work_t request;

  virtual void Destroy() {
      delete this;
  }

 protected:
  Persistent<v8::Object> persistentHandle;
  Callback *callback;
  AsyncResource *async_resource;

  virtual void HandleOKCallback() {
    HandleScope scope;

    callback->Call(0, NULL, async_resource);
  }

  virtual void HandleErrorCallback() {
    HandleScope scope;

    v8::Local<v8::Value> argv[] = {
      v8::Exception::Error(New<v8::String>(ErrorMessage()).ToLocalChecked())
    };
    callback->Call(1, argv, async_resource);
  }

  void SetErrorMessage(const char *msg) {
    delete[] errmsg_;

    size_t size = strlen(msg) + 1;
    errmsg_ = new char[size];
    memcpy(errmsg_, msg, size);
  }

  const char* ErrorMessage() const {
    return errmsg_;
  }

 private:
  NAN_DISALLOW_ASSIGN_COPY_MOVE(AsyncWorker)
  char *errmsg_;
};

/* abstract */ class AsyncBareProgressWorkerBase : public AsyncWorker {
 public:
  explicit AsyncBareProgressWorkerBase(
      Callback *callback_,
      const char* resource_name = "nan:AsyncBareProgressWorkerBase")
      : AsyncWorker(callback_, resource_name) {
    uv_async_init(
        GetCurrentEventLoop()
      , &async
      , AsyncProgress_
    );
    async.data = this;
  }

  virtual ~AsyncBareProgressWorkerBase() {
  }

  virtual void WorkProgress() = 0;

  virtual void Destroy() {
      uv_close(reinterpret_cast<uv_handle_t*>(&async), AsyncClose_);
  }

 private:
  inline static NAUV_WORK_CB(AsyncProgress_) {
    AsyncBareProgressWorkerBase *worker =
            static_cast<AsyncBareProgressWorkerBase*>(async->data);
    worker->WorkProgress();
  }

  inline static void AsyncClose_(uv_handle_t* handle) {
    AsyncBareProgressWorkerBase *worker =
            static_cast<AsyncBareProgressWorkerBase*>(handle->data);
    delete worker;
  }

 protected:
  uv_async_t async;
};

template<class T>
/* abstract */
class AsyncBareProgressWorker : public AsyncBareProgressWorkerBase {
 public:
  explicit AsyncBareProgressWorker(
      Callback *callback_,
      const char* resource_name = "nan:AsyncBareProgressWorker")
      : AsyncBareProgressWorkerBase(callback_, resource_name) {
    uv_mutex_init(&async_lock);
  }

  virtual ~AsyncBareProgressWorker() {
    uv_mutex_destroy(&async_lock);
  }

  class ExecutionProgress {
    friend class AsyncBareProgressWorker;
   public:
    void Signal() const {
      uv_mutex_lock(&that_->async_lock);
      uv_async_send(&that_->async);
      uv_mutex_unlock(&that_->async_lock);
    }

    void Send(const T* data, size_t count) const {
      that_->SendProgress_(data, count);
    }

   private:
    explicit ExecutionProgress(AsyncBareProgressWorker *that) : that_(that) {}
    NAN_DISALLOW_ASSIGN_COPY_MOVE(ExecutionProgress)
    AsyncBareProgressWorker* const that_;
  };

  virtual void Execute(const ExecutionProgress& progress) = 0;
  virtual void HandleProgressCallback(const T *data, size_t size) = 0;

 protected:
  uv_mutex_t async_lock;

 private:
  void Execute() /*final override*/ {
    ExecutionProgress progress(this);
    Execute(progress);
  }

  virtual void SendProgress_(const T *data, size_t count) = 0;
};

template<class T>
/* abstract */
class AsyncProgressWorkerBase : public AsyncBareProgressWorker<T> {
 public:
  explicit AsyncProgressWorkerBase(
      Callback *callback_,
      const char* resource_name = "nan:AsyncProgressWorkerBase")
      : AsyncBareProgressWorker<T>(callback_, resource_name), asyncdata_(NULL),
        asyncsize_(0) {
  }

  virtual ~AsyncProgressWorkerBase() {
    delete[] asyncdata_;
  }

  void WorkProgress() {
    uv_mutex_lock(&this->async_lock);
    T *data = asyncdata_;
    size_t size = asyncsize_;
    asyncdata_ = NULL;
    asyncsize_ = 0;
    uv_mutex_unlock(&this->async_lock);

    // Don't send progress events after we've already completed.
    if (this->callback) {
        this->HandleProgressCallback(data, size);
    }
    delete[] data;
  }

 private:
  void SendProgress_(const T *data, size_t count) {
    T *new_data = new T[count];
    std::copy(data, data + count, new_data);

    uv_mutex_lock(&this->async_lock);
    T *old_data = asyncdata_;
    asyncdata_ = new_data;
    asyncsize_ = count;
    uv_async_send(&this->async);
    uv_mutex_unlock(&this->async_lock);

    delete[] old_data;
  }

  T *asyncdata_;
  size_t asyncsize_;
};

// This ensures compatibility to the previous un-templated AsyncProgressWorker
// class definition.
typedef AsyncProgressWorkerBase<char> AsyncProgressWorker;

template<class T>
/* abstract */
class AsyncBareProgressQueueWorker : public AsyncBareProgressWorkerBase {
 public:
  explicit AsyncBareProgressQueueWorker(
      Callback *callback_,
      const char* resource_name = "nan:AsyncBareProgressQueueWorker")
      : AsyncBareProgressWorkerBase(callback_, resource_name) {
  }

  virtual ~AsyncBareProgressQueueWorker() {
  }

  class ExecutionProgress {
    friend class AsyncBareProgressQueueWorker;
   public:
    void Send(const T* data, size_t count) const {
      that_->SendProgress_(data, count);
    }

   private:
    explicit ExecutionProgress(AsyncBareProgressQueueWorker *that)
        : that_(that) {}
    NAN_DISALLOW_ASSIGN_COPY_MOVE(ExecutionProgress)
    AsyncBareProgressQueueWorker* const that_;
  };

  virtual void Execute(const ExecutionProgress& progress) = 0;
  virtual void HandleProgressCallback(const T *data, size_t size) = 0;

 private:
  void Execute() /*final override*/ {
    ExecutionProgress progress(this);
    Execute(progress);
  }

  virtual void SendProgress_(const T *data, size_t count) = 0;
};

template<class T>
/* abstract */
class AsyncProgressQueueWorker : public AsyncBareProgressQueueWorker<T> {
 public:
  explicit AsyncProgressQueueWorker(
      Callback *callback_,
      const char* resource_name = "nan:AsyncProgressQueueWorker")
      : AsyncBareProgressQueueWorker<T>(callback_) {
    uv_mutex_init(&async_lock);
  }

  virtual ~AsyncProgressQueueWorker() {
    uv_mutex_lock(&async_lock);

    while (!asyncdata_.empty()) {
      std::pair<T*, size_t> &datapair = asyncdata_.front();
      T *data = datapair.first;

      asyncdata_.pop();

      delete[] data;
    }

    uv_mutex_unlock(&async_lock);
    uv_mutex_destroy(&async_lock);
  }

  void WorkComplete() {
    WorkProgress();
    AsyncWorker::WorkComplete();
  }

  void WorkProgress() {
    uv_mutex_lock(&async_lock);

    while (!asyncdata_.empty()) {
      std::pair<T*, size_t> &datapair = asyncdata_.front();

      T *data = datapair.first;
      size_t size = datapair.second;

      asyncdata_.pop();
      uv_mutex_unlock(&async_lock);

      // Don't send progress events after we've already completed.
      if (this->callback) {
          this->HandleProgressCallback(data, size);
      }

      delete[] data;

      uv_mutex_lock(&async_lock);
    }

    uv_mutex_unlock(&async_lock);
  }

 private:
  void SendProgress_(const T *data, size_t count) {
    T *new_data = new T[count];
    std::copy(data, data + count, new_data);

    uv_mutex_lock(&async_lock);
    asyncdata_.push(std::pair<T*, size_t>(new_data, count));
    uv_mutex_unlock(&async_lock);

    uv_async_send(&this->async);
  }

  uv_mutex_t async_lock;
  std::queue<std::pair<T*, size_t> > asyncdata_;
};

inline void AsyncExecute (uv_work_t* req) {
  AsyncWorker *worker = static_cast<AsyncWorker*>(req->data);
  worker->Execute();
}

/* uv_after_work_cb has 1 argument before node-v0.9.4 and
 * 2 arguments since node-v0.9.4
 * https://github.com/libuv/libuv/commit/92fb84b751e18f032c02609467f44bfe927b80c5
 */
inline void AsyncExecuteComplete(uv_work_t *req) {
  AsyncWorker* worker = static_cast<AsyncWorker*>(req->data);
  worker->WorkComplete();
  worker->Destroy();
}
inline void AsyncExecuteComplete (uv_work_t* req, int status) {
  AsyncExecuteComplete(req);
}

inline void AsyncQueueWorker (AsyncWorker* worker) {
  uv_queue_work(
      GetCurrentEventLoop()
    , &worker->request
    , AsyncExecute
    , AsyncExecuteComplete
  );
}

namespace imp {

inline
ExternalOneByteStringResource const*
GetExternalResource(v8::Local<v8::String> str) {
#if NODE_MODULE_VERSION < ATOM_0_21_MODULE_VERSION
    return str->GetExternalAsciiStringResource();
#else
    return str->GetExternalOneByteStringResource();
#endif
}

inline
bool
IsExternal(v8::Local<v8::String> str) {
#if NODE_MODULE_VERSION < ATOM_0_21_MODULE_VERSION
    return str->IsExternalAscii();
#else
    return str->IsExternalOneByte();
#endif
}

}  // end of namespace imp

enum Encoding {ASCII, UTF8, BASE64, UCS2, BINARY, HEX, BUFFER};

#if NODE_MODULE_VERSION < NODE_0_10_MODULE_VERSION
# include "nan_string_bytes.h"  // NOLINT(build/include)
#endif

inline v8::Local<v8::Value> Encode(
    const void *buf, size_t len, enum Encoding encoding = BINARY) {
#if (NODE_MODULE_VERSION >= ATOM_0_21_MODULE_VERSION)
  v8::Isolate* isolate = v8::Isolate::GetCurrent();
  node::encoding node_enc = static_cast<node::encoding>(encoding);

  if (encoding == UCS2) {
    return node::Encode(
        isolate
      , reinterpret_cast<const uint16_t *>(buf)
      , len / 2);
  } else {
    return node::Encode(
        isolate
      , reinterpret_cast<const char *>(buf)
      , len
      , node_enc);
  }
#elif (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION)
  return node::Encode(
      v8::Isolate::GetCurrent()
    , buf, len
    , static_cast<node::encoding>(encoding));
#else
# if NODE_MODULE_VERSION >= NODE_0_10_MODULE_VERSION
  return node::Encode(buf, len, static_cast<node::encoding>(encoding));
# else
  return imp::Encode(reinterpret_cast<const char*>(buf), len, encoding);
# endif
#endif
}

inline ssize_t DecodeBytes(
    v8::Local<v8::Value> val, enum Encoding encoding = BINARY) {
#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION)
  return node::DecodeBytes(
      v8::Isolate::GetCurrent()
    , val
    , static_cast<node::encoding>(encoding));
#else
# if (NODE_MODULE_VERSION < NODE_0_10_MODULE_VERSION)
  if (encoding == BUFFER) {
    return node::DecodeBytes(val, node::BINARY);
  }
# endif
  return node::DecodeBytes(val, static_cast<node::encoding>(encoding));
#endif
}

inline ssize_t DecodeWrite(
    char *buf
  , size_t len
  , v8::Local<v8::Value> val
  , enum Encoding encoding = BINARY) {
#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION)
  return node::DecodeWrite(
      v8::Isolate::GetCurrent()
    , buf
    , len
    , val
    , static_cast<node::encoding>(encoding));
#else
# if (NODE_MODULE_VERSION < NODE_0_10_MODULE_VERSION)
  if (encoding == BUFFER) {
    return node::DecodeWrite(buf, len, val, node::BINARY);
  }
# endif
  return node::DecodeWrite(
      buf
    , len
    , val
    , static_cast<node::encoding>(encoding));
#endif
}

inline void SetPrototypeTemplate(
    v8::Local<v8::FunctionTemplate> templ
  , const char *name
  , v8::Local<v8::Data> value
) {
  HandleScope scope;
  SetTemplate(templ->PrototypeTemplate(), name, value);
}

inline void SetPrototypeTemplate(
    v8::Local<v8::FunctionTemplate> templ
  , v8::Local<v8::String> name
  , v8::Local<v8::Data> value
  , v8::PropertyAttribute attributes
) {
  HandleScope scope;
  SetTemplate(templ->PrototypeTemplate(), name, value, attributes);
}

inline void SetInstanceTemplate(
    v8::Local<v8::FunctionTemplate> templ
  , const char *name
  , v8::Local<v8::Data> value
) {
  HandleScope scope;
  SetTemplate(templ->InstanceTemplate(), name, value);
}

inline void SetInstanceTemplate(
    v8::Local<v8::FunctionTemplate> templ
  , v8::Local<v8::String> name
  , v8::Local<v8::Data> value
  , v8::PropertyAttribute attributes
) {
  HandleScope scope;
  SetTemplate(templ->InstanceTemplate(), name, value, attributes);
}

namespace imp {

// Note(@agnat): Helper to distinguish different receiver types. The first
// version deals with receivers derived from v8::Template. The second version
// handles everything else. The final argument only serves as discriminator and
// is unused.
template <typename T>
inline
void
SetMethodAux(T recv,
             v8::Local<v8::String> name,
             v8::Local<v8::FunctionTemplate> tpl,
             v8::Template *) {
  recv->Set(name, tpl);
}

template <typename T>
inline
void
SetMethodAux(T recv,
             v8::Local<v8::String> name,
             v8::Local<v8::FunctionTemplate> tpl,
             ...) {
  Set(recv, name, GetFunction(tpl).ToLocalChecked());
}

}  // end of namespace imp

template <typename T, template <typename> class HandleType>
inline void SetMethod(
    HandleType<T> recv
  , const char *name
  , FunctionCallback callback
  , v8::Local<v8::Value> data = v8::Local<v8::Value>()) {
  HandleScope scope;
  v8::Local<v8::FunctionTemplate> t = New<v8::FunctionTemplate>(callback, data);
  v8::Local<v8::String> fn_name = New(name).ToLocalChecked();
  t->SetClassName(fn_name);
  // Note(@agnat): Pass an empty T* as discriminator. See note on
  // SetMethodAux(...) above
  imp::SetMethodAux(recv, fn_name, t, static_cast<T*>(0));
}

inline void SetPrototypeMethod(
    v8::Local<v8::FunctionTemplate> recv
  , const char* name
  , FunctionCallback callback
  , v8::Local<v8::Value> data = v8::Local<v8::Value>()) {
  HandleScope scope;
  v8::Local<v8::FunctionTemplate> t = New<v8::FunctionTemplate>(
      callback
    , data
    , New<v8::Signature>(recv));
  v8::Local<v8::String> fn_name = New(name).ToLocalChecked();
  recv->PrototypeTemplate()->Set(fn_name, t);
  t->SetClassName(fn_name);
}

//=== Accessors and Such =======================================================

inline void SetAccessor(
    v8::Local<v8::ObjectTemplate> tpl
  , v8::Local<v8::String> name
  , GetterCallback getter
  , SetterCallback setter = 0
  , v8::Local<v8::Value> data = v8::Local<v8::Value>()
  , v8::AccessControl settings = v8::DEFAULT
  , v8::PropertyAttribute attribute = v8::None
  , imp::Sig signature = imp::Sig()) {
  HandleScope scope;

  imp::NativeGetter getter_ =
      imp::GetterCallbackWrapper;
  imp::NativeSetter setter_ =
      setter ? imp::SetterCallbackWrapper : 0;

  v8::Local<v8::ObjectTemplate> otpl = New<v8::ObjectTemplate>();
  otpl->SetInternalFieldCount(imp::kAccessorFieldCount);
  v8::Local<v8::Object> obj = NewInstance(otpl).ToLocalChecked();

  obj->SetInternalField(
      imp::kGetterIndex
    , New<v8::External>(reinterpret_cast<void *>(getter)));

  if (setter != 0) {
    obj->SetInternalField(
        imp::kSetterIndex
      , New<v8::External>(reinterpret_cast<void *>(setter)));
  }

  if (!data.IsEmpty()) {
    obj->SetInternalField(imp::kDataIndex, data);
  }

  tpl->SetAccessor(
      name
    , getter_
    , setter_
    , obj
    , settings
    , attribute
#if (NODE_MODULE_VERSION < NODE_18_0_MODULE_VERSION)
    , signature
#endif
  );
}

inline bool SetAccessor(
    v8::Local<v8::Object> obj
  , v8::Local<v8::String> name
  , GetterCallback getter
  , SetterCallback setter = 0
  , v8::Local<v8::Value> data = v8::Local<v8::Value>()
  , v8::AccessControl settings = v8::DEFAULT
  , v8::PropertyAttribute attribute = v8::None) {
  HandleScope scope;

  imp::NativeGetter getter_ =
      imp::GetterCallbackWrapper;
  imp::NativeSetter setter_ =
      setter ? imp::SetterCallbackWrapper : 0;

  v8::Local<v8::ObjectTemplate> otpl = New<v8::ObjectTemplate>();
  otpl->SetInternalFieldCount(imp::kAccessorFieldCount);
  v8::Local<v8::Object> dataobj = NewInstance(otpl).ToLocalChecked();

  dataobj->SetInternalField(
      imp::kGetterIndex
    , New<v8::External>(reinterpret_cast<void *>(getter)));

  if (!data.IsEmpty()) {
    dataobj->SetInternalField(imp::kDataIndex, data);
  }

  if (setter) {
    dataobj->SetInternalField(
        imp::kSetterIndex
      , New<v8::External>(reinterpret_cast<void *>(setter)));
  }

#if (NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION)
  return obj->SetAccessor(
      GetCurrentContext()
    , name
    , getter_
    , setter_
    , dataobj
    , settings
    , attribute).FromMaybe(false);
#else
  return obj->SetAccessor(
      name
    , getter_
    , setter_
    , dataobj
    , settings
    , attribute);
#endif
}

inline void SetNamedPropertyHandler(
    v8::Local<v8::ObjectTemplate> tpl
  , PropertyGetterCallback getter
  , PropertySetterCallback setter = 0
  , PropertyQueryCallback query = 0
  , PropertyDeleterCallback deleter = 0
  , PropertyEnumeratorCallback enumerator = 0
  , v8::Local<v8::Value> data = v8::Local<v8::Value>()) {
  HandleScope scope;

  imp::NativePropertyGetter getter_ =
      imp::PropertyGetterCallbackWrapper;
  imp::NativePropertySetter setter_ =
      setter ? imp::PropertySetterCallbackWrapper : 0;
  imp::NativePropertyQuery query_ =
      query ? imp::PropertyQueryCallbackWrapper : 0;
  imp::NativePropertyDeleter *deleter_ =
      deleter ? imp::PropertyDeleterCallbackWrapper : 0;
  imp::NativePropertyEnumerator enumerator_ =
      enumerator ? imp::PropertyEnumeratorCallbackWrapper : 0;

  v8::Local<v8::ObjectTemplate> otpl = New<v8::ObjectTemplate>();
  otpl->SetInternalFieldCount(imp::kPropertyFieldCount);
  v8::Local<v8::Object> obj = NewInstance(otpl).ToLocalChecked();
  obj->SetInternalField(
      imp::kPropertyGetterIndex
    , New<v8::External>(reinterpret_cast<void *>(getter)));

  if (setter) {
    obj->SetInternalField(
        imp::kPropertySetterIndex
      , New<v8::External>(reinterpret_cast<void *>(setter)));
  }

  if (query) {
    obj->SetInternalField(
        imp::kPropertyQueryIndex
      , New<v8::External>(reinterpret_cast<void *>(query)));
  }

  if (deleter) {
    obj->SetInternalField(
        imp::kPropertyDeleterIndex
      , New<v8::External>(reinterpret_cast<void *>(deleter)));
  }

  if (enumerator) {
    obj->SetInternalField(
        imp::kPropertyEnumeratorIndex
      , New<v8::External>(reinterpret_cast<void *>(enumerator)));
  }

  if (!data.IsEmpty()) {
    obj->SetInternalField(imp::kDataIndex, data);
  }

#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION
  tpl->SetHandler(v8::NamedPropertyHandlerConfiguration(
      getter_, setter_, query_, deleter_, enumerator_, obj));
#else
  tpl->SetNamedPropertyHandler(
      getter_
    , setter_
    , query_
    , deleter_
    , enumerator_
    , obj);
#endif
}

inline void SetIndexedPropertyHandler(
    v8::Local<v8::ObjectTemplate> tpl
  , IndexGetterCallback getter
  , IndexSetterCallback setter = 0
  , IndexQueryCallback query = 0
  , IndexDeleterCallback deleter = 0
  , IndexEnumeratorCallback enumerator = 0
  , v8::Local<v8::Value> data = v8::Local<v8::Value>()) {
  HandleScope scope;

  imp::NativeIndexGetter getter_ =
      imp::IndexGetterCallbackWrapper;
  imp::NativeIndexSetter setter_ =
      setter ? imp::IndexSetterCallbackWrapper : 0;
  imp::NativeIndexQuery query_ =
      query ? imp::IndexQueryCallbackWrapper : 0;
  imp::NativeIndexDeleter deleter_ =
      deleter ? imp::IndexDeleterCallbackWrapper : 0;
  imp::NativeIndexEnumerator enumerator_ =
      enumerator ? imp::IndexEnumeratorCallbackWrapper : 0;

  v8::Local<v8::ObjectTemplate> otpl = New<v8::ObjectTemplate>();
  otpl->SetInternalFieldCount(imp::kIndexPropertyFieldCount);
  v8::Local<v8::Object> obj = NewInstance(otpl).ToLocalChecked();
  obj->SetInternalField(
      imp::kIndexPropertyGetterIndex
    , New<v8::External>(reinterpret_cast<void *>(getter)));

  if (setter) {
    obj->SetInternalField(
        imp::kIndexPropertySetterIndex
      , New<v8::External>(reinterpret_cast<void *>(setter)));
  }

  if (query) {
    obj->SetInternalField(
        imp::kIndexPropertyQueryIndex
      , New<v8::External>(reinterpret_cast<void *>(query)));
  }

  if (deleter) {
    obj->SetInternalField(
        imp::kIndexPropertyDeleterIndex
      , New<v8::External>(reinterpret_cast<void *>(deleter)));
  }

  if (enumerator) {
    obj->SetInternalField(
        imp::kIndexPropertyEnumeratorIndex
      , New<v8::External>(reinterpret_cast<void *>(enumerator)));
  }

  if (!data.IsEmpty()) {
    obj->SetInternalField(imp::kDataIndex, data);
  }

#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION
  tpl->SetHandler(v8::IndexedPropertyHandlerConfiguration(
      getter_, setter_, query_, deleter_, enumerator_, obj));
#else
  tpl->SetIndexedPropertyHandler(
      getter_
    , setter_
    , query_
    , deleter_
    , enumerator_
    , obj);
#endif
}

inline void SetCallHandler(
    v8::Local<v8::FunctionTemplate> tpl
  , FunctionCallback callback
  , v8::Local<v8::Value> data = v8::Local<v8::Value>()) {
  HandleScope scope;

  v8::Local<v8::ObjectTemplate> otpl = New<v8::ObjectTemplate>();
  otpl->SetInternalFieldCount(imp::kFunctionFieldCount);
  v8::Local<v8::Object> obj = NewInstance(otpl).ToLocalChecked();

  obj->SetInternalField(
      imp::kFunctionIndex
    , New<v8::External>(reinterpret_cast<void *>(callback)));

  if (!data.IsEmpty()) {
    obj->SetInternalField(imp::kDataIndex, data);
  }

  tpl->SetCallHandler(imp::FunctionCallbackWrapper, obj);
}


inline void SetCallAsFunctionHandler(
    v8::Local<v8::ObjectTemplate> tpl,
    FunctionCallback callback,
    v8::Local<v8::Value> data = v8::Local<v8::Value>()) {
  HandleScope scope;

  v8::Local<v8::ObjectTemplate> otpl = New<v8::ObjectTemplate>();
  otpl->SetInternalFieldCount(imp::kFunctionFieldCount);
  v8::Local<v8::Object> obj = NewInstance(otpl).ToLocalChecked();

  obj->SetInternalField(
      imp::kFunctionIndex
    , New<v8::External>(reinterpret_cast<void *>(callback)));

  if (!data.IsEmpty()) {
    obj->SetInternalField(imp::kDataIndex, data);
  }

  tpl->SetCallAsFunctionHandler(imp::FunctionCallbackWrapper, obj);
}

//=== Weak Persistent Handling =================================================

#include "nan_weak.h"  // NOLINT(build/include)

//=== ObjectWrap ===============================================================

#include "nan_object_wrap.h"  // NOLINT(build/include)

//=== HiddenValue/Private ======================================================

#include "nan_private.h"  // NOLINT(build/include)

//=== Export ==================================================================

inline
void
Export(ADDON_REGISTER_FUNCTION_ARGS_TYPE target, const char *name,
    FunctionCallback f) {
  HandleScope scope;

  Set(target, New<v8::String>(name).ToLocalChecked(),
      GetFunction(New<v8::FunctionTemplate>(f)).ToLocalChecked());
}

//=== Tap Reverse Binding =====================================================

struct Tap {
  explicit Tap(v8::Local<v8::Value> t) : t_() {
    HandleScope scope;

    t_.Reset(To<v8::Object>(t).ToLocalChecked());
  }

  ~Tap() { t_.Reset(); }  // not sure if necessary

  inline void plan(int i) {
    HandleScope scope;
    v8::Local<v8::Value> arg = New(i);
    Call("plan", New(t_), 1, &arg);
  }

  inline void ok(bool isOk, const char *msg = NULL) {
    HandleScope scope;
    v8::Local<v8::Value> args[2];
    args[0] = New(isOk);
    if (msg) args[1] = New(msg).ToLocalChecked();
    Call("ok", New(t_), msg ? 2 : 1, args);
  }

  inline void pass(const char * msg = NULL) {
    HandleScope scope;
    v8::Local<v8::Value> hmsg;
    if (msg) hmsg = New(msg).ToLocalChecked();
    Call("pass", New(t_), msg ? 1 : 0, &hmsg);
  }

  inline void end() {
    HandleScope scope;
    Call("end", New(t_), 0, NULL);
  }

 private:
  Persistent<v8::Object> t_;
};

#define NAN_STRINGIZE2(x) #x
#define NAN_STRINGIZE(x) NAN_STRINGIZE2(x)
#define NAN_TEST_EXPRESSION(expression) \
  ( expression ), __FILE__ ":" NAN_STRINGIZE(__LINE__) ": " #expression

#define NAN_EXPORT(target, function) Export(target, #function, function)

#undef TYPE_CHECK

//=== Generic Maybefication ===================================================

namespace imp {

template <typename T> struct Maybefier;

template <typename T> struct Maybefier<v8::Local<T> > {
  inline static MaybeLocal<T> convert(v8::Local<T> v) {
    return v;
  }
};

template <typename T> struct Maybefier<MaybeLocal<T> > {
  inline static MaybeLocal<T> convert(MaybeLocal<T> v) {
    return v;
  }
};

}  // end of namespace imp

template <typename T, template <typename> class MaybeMaybe>
inline MaybeLocal<T>
MakeMaybe(MaybeMaybe<T> v) {
  return imp::Maybefier<MaybeMaybe<T> >::convert(v);
}

//=== TypedArrayContents =======================================================

#include "nan_typedarray_contents.h"  // NOLINT(build/include)

//=== JSON =====================================================================

#include "nan_json.h"  // NOLINT(build/include)

//=== ScriptOrigin =============================================================

#include "nan_scriptorigin.h"  // NOLINT(build/include)

}  // end of namespace Nan

#endif  // NAN_H_
/*********************************************************************
 * NAN - Native Abstractions for Node.js
 *
 * Copyright (c) 2018 NAN contributors
 *
 * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
 ********************************************************************/

#ifndef NAN_CALLBACKS_H_
#define NAN_CALLBACKS_H_

template<typename T> class FunctionCallbackInfo;
template<typename T> class PropertyCallbackInfo;
template<typename T> class Global;

typedef void(*FunctionCallback)(const FunctionCallbackInfo<v8::Value>&);
typedef void(*GetterCallback)
    (v8::Local<v8::String>, const PropertyCallbackInfo<v8::Value>&);
typedef void(*SetterCallback)(
    v8::Local<v8::String>,
    v8::Local<v8::Value>,
    const PropertyCallbackInfo<void>&);
typedef void(*PropertyGetterCallback)(
    v8::Local<v8::String>,
    const PropertyCallbackInfo<v8::Value>&);
typedef void(*PropertySetterCallback)(
    v8::Local<v8::String>,
    v8::Local<v8::Value>,
    const PropertyCallbackInfo<v8::Value>&);
typedef void(*PropertyEnumeratorCallback)
    (const PropertyCallbackInfo<v8::Array>&);
typedef void(*PropertyDeleterCallback)(
    v8::Local<v8::String>,
    const PropertyCallbackInfo<v8::Boolean>&);
typedef void(*PropertyQueryCallback)(
    v8::Local<v8::String>,
    const PropertyCallbackInfo<v8::Integer>&);
typedef void(*IndexGetterCallback)(
    uint32_t,
    const PropertyCallbackInfo<v8::Value>&);
typedef void(*IndexSetterCallback)(
    uint32_t,
    v8::Local<v8::Value>,
    const PropertyCallbackInfo<v8::Value>&);
typedef void(*IndexEnumeratorCallback)
    (const PropertyCallbackInfo<v8::Array>&);
typedef void(*IndexDeleterCallback)(
    uint32_t,
    const PropertyCallbackInfo<v8::Boolean>&);
typedef void(*IndexQueryCallback)(
    uint32_t,
    const PropertyCallbackInfo<v8::Integer>&);

namespace imp {
typedef v8::Local<v8::AccessorSignature> Sig;

static const int kDataIndex =                    0;

static const int kFunctionIndex =                1;
static const int kFunctionFieldCount =           2;

static const int kGetterIndex =                  1;
static const int kSetterIndex =                  2;
static const int kAccessorFieldCount =           3;

static const int kPropertyGetterIndex =          1;
static const int kPropertySetterIndex =          2;
static const int kPropertyEnumeratorIndex =      3;
static const int kPropertyDeleterIndex =         4;
static const int kPropertyQueryIndex =           5;
static const int kPropertyFieldCount =           6;

static const int kIndexPropertyGetterIndex =     1;
static const int kIndexPropertySetterIndex =     2;
static const int kIndexPropertyEnumeratorIndex = 3;
static const int kIndexPropertyDeleterIndex =    4;
static const int kIndexPropertyQueryIndex =      5;
static const int kIndexPropertyFieldCount =      6;

}  // end of namespace imp

#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
# include "nan_callbacks_12_inl.h"  // NOLINT(build/include)
#else
# include "nan_callbacks_pre_12_inl.h"  // NOLINT(build/include)
#endif

#endif  // NAN_CALLBACKS_H_
/*********************************************************************
 * NAN - Native Abstractions for Node.js
 *
 * Copyright (c) 2018 NAN contributors
 *
 * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
 ********************************************************************/

#ifndef NAN_CALLBACKS_12_INL_H_
#define NAN_CALLBACKS_12_INL_H_

template<typename T>
class ReturnValue {
  v8::ReturnValue<T> value_;

 public:
  template <class S>
  explicit inline ReturnValue(const v8::ReturnValue<S> &value) :
      value_(value) {}
  template <class S>
  explicit inline ReturnValue(const ReturnValue<S>& that)
      : value_(that.value_) {
    TYPE_CHECK(T, S);
  }

  // Handle setters
  template <typename S> inline void Set(const v8::Local<S> &handle) {
    TYPE_CHECK(T, S);
    value_.Set(handle);
  }

  template <typename S> inline void Set(const Global<S> &handle) {
    TYPE_CHECK(T, S);
#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) &&                       \
  (V8_MINOR_VERSION > 5 || (V8_MINOR_VERSION == 5 &&                           \
  defined(V8_BUILD_NUMBER) && V8_BUILD_NUMBER >= 8))))
    value_.Set(handle);
#else
    value_.Set(*reinterpret_cast<const v8::Persistent<S>*>(&handle));
    const_cast<Global<S> &>(handle).Reset();
#endif
  }

  // Fast primitive setters
  inline void Set(bool value) {
    TYPE_CHECK(T, v8::Boolean);
    value_.Set(value);
  }

  inline void Set(double i) {
    TYPE_CHECK(T, v8::Number);
    value_.Set(i);
  }

  inline void Set(int32_t i) {
    TYPE_CHECK(T, v8::Integer);
    value_.Set(i);
  }

  inline void Set(uint32_t i) {
    TYPE_CHECK(T, v8::Integer);
    value_.Set(i);
  }

  // Fast JS primitive setters
  inline void SetNull() {
    TYPE_CHECK(T, v8::Primitive);
    value_.SetNull();
  }

  inline void SetUndefined() {
    TYPE_CHECK(T, v8::Primitive);
    value_.SetUndefined();
  }

  inline void SetEmptyString() {
    TYPE_CHECK(T, v8::String);
    value_.SetEmptyString();
  }

  // Convenience getter for isolate
  inline v8::Isolate *GetIsolate() const {
    return value_.GetIsolate();
  }

  // Pointer setter: Uncompilable to prevent inadvertent misuse.
  template<typename S>
  inline void Set(S *whatever) { TYPE_CHECK(S*, v8::Primitive); }
};

template<typename T>
class FunctionCallbackInfo {
  const v8::FunctionCallbackInfo<T> &info_;
  const v8::Local<v8::Value> data_;

 public:
  explicit inline FunctionCallbackInfo(
      const v8::FunctionCallbackInfo<T> &info
    , v8::Local<v8::Value> data) :
          info_(info)
        , data_(data) {}

  inline ReturnValue<T> GetReturnValue() const {
    return ReturnValue<T>(info_.GetReturnValue());
  }

#if NODE_MAJOR_VERSION < 10
  inline v8::Local<v8::Function> Callee() const { return info_.Callee(); }
#endif
  inline v8::Local<v8::Value> Data() const { return data_; }
  inline v8::Local<v8::Object> Holder() const { return info_.Holder(); }
  inline bool IsConstructCall() const { return info_.IsConstructCall(); }
  inline int Length() const { return info_.Length(); }
  inline v8::Local<v8::Value> operator[](int i) const { return info_[i]; }
  inline v8::Local<v8::Object> This() const { return info_.This(); }
  inline v8::Isolate *GetIsolate() const { return info_.GetIsolate(); }


 protected:
  static const int kHolderIndex = 0;
  static const int kIsolateIndex = 1;
  static const int kReturnValueDefaultValueIndex = 2;
  static const int kReturnValueIndex = 3;
  static const int kDataIndex = 4;
  static const int kCalleeIndex = 5;
  static const int kContextSaveIndex = 6;
  static const int kArgsLength = 7;

 private:
  NAN_DISALLOW_ASSIGN_COPY_MOVE(FunctionCallbackInfo)
};

template<typename T>
class PropertyCallbackInfo {
  const v8::PropertyCallbackInfo<T> &info_;
  const v8::Local<v8::Value> data_;

 public:
  explicit inline PropertyCallbackInfo(
      const v8::PropertyCallbackInfo<T> &info
    , const v8::Local<v8::Value> data) :
          info_(info)
        , data_(data) {}

  inline v8::Isolate* GetIsolate() const { return info_.GetIsolate(); }
  inline v8::Local<v8::Value> Data() const { return data_; }
  inline v8::Local<v8::Object> This() const { return info_.This(); }
  inline v8::Local<v8::Object> Holder() const { return info_.Holder(); }
  inline ReturnValue<T> GetReturnValue() const {
    return ReturnValue<T>(info_.GetReturnValue());
  }

 protected:
  static const int kHolderIndex = 0;
  static const int kIsolateIndex = 1;
  static const int kReturnValueDefaultValueIndex = 2;
  static const int kReturnValueIndex = 3;
  static const int kDataIndex = 4;
  static const int kThisIndex = 5;
  static const int kArgsLength = 6;

 private:
  NAN_DISALLOW_ASSIGN_COPY_MOVE(PropertyCallbackInfo)
};

namespace imp {
static
void FunctionCallbackWrapper(const v8::FunctionCallbackInfo<v8::Value> &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  FunctionCallback callback = reinterpret_cast<FunctionCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kFunctionIndex).As<v8::External>()->Value()));
  FunctionCallbackInfo<v8::Value>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  callback(cbinfo);
}

typedef void (*NativeFunction)(const v8::FunctionCallbackInfo<v8::Value> &);

#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION
static
void GetterCallbackWrapper(
    v8::Local<v8::Name> property
  , const v8::PropertyCallbackInfo<v8::Value> &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Value>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  GetterCallback callback = reinterpret_cast<GetterCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kGetterIndex).As<v8::External>()->Value()));
  callback(property.As<v8::String>(), cbinfo);
}

typedef void (*NativeGetter)
    (v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value> &);

static
void SetterCallbackWrapper(
    v8::Local<v8::Name> property
  , v8::Local<v8::Value> value
  , const v8::PropertyCallbackInfo<void> &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<void>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  SetterCallback callback = reinterpret_cast<SetterCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kSetterIndex).As<v8::External>()->Value()));
  callback(property.As<v8::String>(), value, cbinfo);
}

typedef void (*NativeSetter)(
    v8::Local<v8::Name>
  , v8::Local<v8::Value>
  , const v8::PropertyCallbackInfo<void> &);
#else
static
void GetterCallbackWrapper(
    v8::Local<v8::String> property
  , const v8::PropertyCallbackInfo<v8::Value> &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Value>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  GetterCallback callback = reinterpret_cast<GetterCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kGetterIndex).As<v8::External>()->Value()));
  callback(property, cbinfo);
}

typedef void (*NativeGetter)
    (v8::Local<v8::String>, const v8::PropertyCallbackInfo<v8::Value> &);

static
void SetterCallbackWrapper(
    v8::Local<v8::String> property
  , v8::Local<v8::Value> value
  , const v8::PropertyCallbackInfo<void> &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<void>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  SetterCallback callback = reinterpret_cast<SetterCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kSetterIndex).As<v8::External>()->Value()));
  callback(property, value, cbinfo);
}

typedef void (*NativeSetter)(
    v8::Local<v8::String>
  , v8::Local<v8::Value>
  , const v8::PropertyCallbackInfo<void> &);
#endif

#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION
static
void PropertyGetterCallbackWrapper(
    v8::Local<v8::Name> property
  , const v8::PropertyCallbackInfo<v8::Value> &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Value>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  PropertyGetterCallback callback = reinterpret_cast<PropertyGetterCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kPropertyGetterIndex)
              .As<v8::External>()->Value()));
  callback(property.As<v8::String>(), cbinfo);
}

typedef void (*NativePropertyGetter)
    (v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value> &);

static
void PropertySetterCallbackWrapper(
    v8::Local<v8::Name> property
  , v8::Local<v8::Value> value
  , const v8::PropertyCallbackInfo<v8::Value> &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Value>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  PropertySetterCallback callback = reinterpret_cast<PropertySetterCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kPropertySetterIndex)
              .As<v8::External>()->Value()));
  callback(property.As<v8::String>(), value, cbinfo);
}

typedef void (*NativePropertySetter)(
    v8::Local<v8::Name>
  , v8::Local<v8::Value>
  , const v8::PropertyCallbackInfo<v8::Value> &);

static
void PropertyEnumeratorCallbackWrapper(
    const v8::PropertyCallbackInfo<v8::Array> &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Array>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  PropertyEnumeratorCallback callback =
      reinterpret_cast<PropertyEnumeratorCallback>(reinterpret_cast<intptr_t>(
          obj->GetInternalField(kPropertyEnumeratorIndex)
              .As<v8::External>()->Value()));
  callback(cbinfo);
}

typedef void (*NativePropertyEnumerator)
    (const v8::PropertyCallbackInfo<v8::Array> &);

static
void PropertyDeleterCallbackWrapper(
    v8::Local<v8::Name> property
  , const v8::PropertyCallbackInfo<v8::Boolean> &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Boolean>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  PropertyDeleterCallback callback = reinterpret_cast<PropertyDeleterCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kPropertyDeleterIndex)
              .As<v8::External>()->Value()));
  callback(property.As<v8::String>(), cbinfo);
}

typedef void (NativePropertyDeleter)
    (v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Boolean> &);

static
void PropertyQueryCallbackWrapper(
    v8::Local<v8::Name> property
  , const v8::PropertyCallbackInfo<v8::Integer> &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Integer>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  PropertyQueryCallback callback = reinterpret_cast<PropertyQueryCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kPropertyQueryIndex)
              .As<v8::External>()->Value()));
  callback(property.As<v8::String>(), cbinfo);
}

typedef void (*NativePropertyQuery)
    (v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Integer> &);
#else
static
void PropertyGetterCallbackWrapper(
    v8::Local<v8::String> property
  , const v8::PropertyCallbackInfo<v8::Value> &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Value>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  PropertyGetterCallback callback = reinterpret_cast<PropertyGetterCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kPropertyGetterIndex)
              .As<v8::External>()->Value()));
  callback(property, cbinfo);
}

typedef void (*NativePropertyGetter)
    (v8::Local<v8::String>, const v8::PropertyCallbackInfo<v8::Value> &);

static
void PropertySetterCallbackWrapper(
    v8::Local<v8::String> property
  , v8::Local<v8::Value> value
  , const v8::PropertyCallbackInfo<v8::Value> &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Value>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  PropertySetterCallback callback = reinterpret_cast<PropertySetterCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kPropertySetterIndex)
              .As<v8::External>()->Value()));
  callback(property, value, cbinfo);
}

typedef void (*NativePropertySetter)(
    v8::Local<v8::String>
  , v8::Local<v8::Value>
  , const v8::PropertyCallbackInfo<v8::Value> &);

static
void PropertyEnumeratorCallbackWrapper(
    const v8::PropertyCallbackInfo<v8::Array> &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Array>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  PropertyEnumeratorCallback callback =
      reinterpret_cast<PropertyEnumeratorCallback>(reinterpret_cast<intptr_t>(
          obj->GetInternalField(kPropertyEnumeratorIndex)
              .As<v8::External>()->Value()));
  callback(cbinfo);
}

typedef void (*NativePropertyEnumerator)
    (const v8::PropertyCallbackInfo<v8::Array> &);

static
void PropertyDeleterCallbackWrapper(
    v8::Local<v8::String> property
  , const v8::PropertyCallbackInfo<v8::Boolean> &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Boolean>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  PropertyDeleterCallback callback = reinterpret_cast<PropertyDeleterCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kPropertyDeleterIndex)
              .As<v8::External>()->Value()));
  callback(property, cbinfo);
}

typedef void (NativePropertyDeleter)
    (v8::Local<v8::String>, const v8::PropertyCallbackInfo<v8::Boolean> &);

static
void PropertyQueryCallbackWrapper(
    v8::Local<v8::String> property
  , const v8::PropertyCallbackInfo<v8::Integer> &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Integer>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  PropertyQueryCallback callback = reinterpret_cast<PropertyQueryCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kPropertyQueryIndex)
              .As<v8::External>()->Value()));
  callback(property, cbinfo);
}

typedef void (*NativePropertyQuery)
    (v8::Local<v8::String>, const v8::PropertyCallbackInfo<v8::Integer> &);
#endif

static
void IndexGetterCallbackWrapper(
    uint32_t index, const v8::PropertyCallbackInfo<v8::Value> &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Value>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  IndexGetterCallback callback = reinterpret_cast<IndexGetterCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kIndexPropertyGetterIndex)
              .As<v8::External>()->Value()));
  callback(index, cbinfo);
}

typedef void (*NativeIndexGetter)
    (uint32_t, const v8::PropertyCallbackInfo<v8::Value> &);

static
void IndexSetterCallbackWrapper(
    uint32_t index
  , v8::Local<v8::Value> value
  , const v8::PropertyCallbackInfo<v8::Value> &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Value>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  IndexSetterCallback callback = reinterpret_cast<IndexSetterCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kIndexPropertySetterIndex)
              .As<v8::External>()->Value()));
  callback(index, value, cbinfo);
}

typedef void (*NativeIndexSetter)(
    uint32_t
  , v8::Local<v8::Value>
  , const v8::PropertyCallbackInfo<v8::Value> &);

static
void IndexEnumeratorCallbackWrapper(
    const v8::PropertyCallbackInfo<v8::Array> &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Array>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  IndexEnumeratorCallback callback = reinterpret_cast<IndexEnumeratorCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(
              kIndexPropertyEnumeratorIndex).As<v8::External>()->Value()));
  callback(cbinfo);
}

typedef void (*NativeIndexEnumerator)
    (const v8::PropertyCallbackInfo<v8::Array> &);

static
void IndexDeleterCallbackWrapper(
    uint32_t index, const v8::PropertyCallbackInfo<v8::Boolean> &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Boolean>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  IndexDeleterCallback callback = reinterpret_cast<IndexDeleterCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kIndexPropertyDeleterIndex)
              .As<v8::External>()->Value()));
  callback(index, cbinfo);
}

typedef void (*NativeIndexDeleter)
    (uint32_t, const v8::PropertyCallbackInfo<v8::Boolean> &);

static
void IndexQueryCallbackWrapper(
    uint32_t index, const v8::PropertyCallbackInfo<v8::Integer> &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Integer>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  IndexQueryCallback callback = reinterpret_cast<IndexQueryCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kIndexPropertyQueryIndex)
              .As<v8::External>()->Value()));
  callback(index, cbinfo);
}

typedef void (*NativeIndexQuery)
    (uint32_t, const v8::PropertyCallbackInfo<v8::Integer> &);
}  // end of namespace imp

#endif  // NAN_CALLBACKS_12_INL_H_
/*********************************************************************
 * NAN - Native Abstractions for Node.js
 *
 * Copyright (c) 2018 NAN contributors
 *
 * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
 ********************************************************************/

#ifndef NAN_CALLBACKS_PRE_12_INL_H_
#define NAN_CALLBACKS_PRE_12_INL_H_

namespace imp {
template<typename T> class ReturnValueImp;
}  // end of namespace imp

template<typename T>
class ReturnValue {
  v8::Isolate *isolate_;
  v8::Persistent<T> *value_;
  friend class imp::ReturnValueImp<T>;

 public:
  template <class S>
  explicit inline ReturnValue(v8::Isolate *isolate, v8::Persistent<S> *p) :
      isolate_(isolate), value_(p) {}
  template <class S>
  explicit inline ReturnValue(const ReturnValue<S>& that)
      : isolate_(that.isolate_), value_(that.value_) {
    TYPE_CHECK(T, S);
  }

  // Handle setters
  template <typename S> inline void Set(const v8::Local<S> &handle) {
    TYPE_CHECK(T, S);
    value_->Dispose();
    *value_ = v8::Persistent<T>::New(handle);
  }

  template <typename S> inline void Set(const Global<S> &handle) {
    TYPE_CHECK(T, S);
    value_->Dispose();
    *value_ = v8::Persistent<T>::New(handle.persistent);
    const_cast<Global<S> &>(handle).Reset();
  }

  // Fast primitive setters
  inline void Set(bool value) {
    v8::HandleScope scope;

    TYPE_CHECK(T, v8::Boolean);
    value_->Dispose();
    *value_ = v8::Persistent<T>::New(v8::Boolean::New(value));
  }

  inline void Set(double i) {
    v8::HandleScope scope;

    TYPE_CHECK(T, v8::Number);
    value_->Dispose();
    *value_ = v8::Persistent<T>::New(v8::Number::New(i));
  }

  inline void Set(int32_t i) {
    v8::HandleScope scope;

    TYPE_CHECK(T, v8::Integer);
    value_->Dispose();
    *value_ = v8::Persistent<T>::New(v8::Int32::New(i));
  }

  inline void Set(uint32_t i) {
    v8::HandleScope scope;

    TYPE_CHECK(T, v8::Integer);
    value_->Dispose();
    *value_ = v8::Persistent<T>::New(v8::Uint32::NewFromUnsigned(i));
  }

  // Fast JS primitive setters
  inline void SetNull() {
    v8::HandleScope scope;

    TYPE_CHECK(T, v8::Primitive);
    value_->Dispose();
    *value_ = v8::Persistent<T>::New(v8::Null());
  }

  inline void SetUndefined() {
    v8::HandleScope scope;

    TYPE_CHECK(T, v8::Primitive);
    value_->Dispose();
    *value_ = v8::Persistent<T>::New(v8::Undefined());
  }

  inline void SetEmptyString() {
    v8::HandleScope scope;

    TYPE_CHECK(T, v8::String);
    value_->Dispose();
    *value_ = v8::Persistent<T>::New(v8::String::Empty());
  }

  // Convenience getter for isolate
  inline v8::Isolate *GetIsolate() const {
    return isolate_;
  }

  // Pointer setter: Uncompilable to prevent inadvertent misuse.
  template<typename S>
  inline void Set(S *whatever) { TYPE_CHECK(S*, v8::Primitive); }
};

template<typename T>
class FunctionCallbackInfo {
  const v8::Arguments &args_;
  v8::Local<v8::Value> data_;
  ReturnValue<T> return_value_;
  v8::Persistent<T> retval_;

 public:
  explicit inline FunctionCallbackInfo(
      const v8::Arguments &args
    , v8::Local<v8::Value> data) :
          args_(args)
        , data_(data)
        , return_value_(args.GetIsolate(), &retval_)
        , retval_(v8::Persistent<T>::New(v8::Undefined())) {}

  inline ~FunctionCallbackInfo() {
    retval_.Dispose();
    retval_.Clear();
  }

  inline ReturnValue<T> GetReturnValue() const {
    return ReturnValue<T>(return_value_);
  }

  inline v8::Local<v8::Function> Callee() const { return args_.Callee(); }
  inline v8::Local<v8::Value> Data() const { return data_; }
  inline v8::Local<v8::Object> Holder() const { return args_.Holder(); }
  inline bool IsConstructCall() const { return args_.IsConstructCall(); }
  inline int Length() const { return args_.Length(); }
  inline v8::Local<v8::Value> operator[](int i) const { return args_[i]; }
  inline v8::Local<v8::Object> This() const { return args_.This(); }
  inline v8::Isolate *GetIsolate() const { return args_.GetIsolate(); }


 protected:
  static const int kHolderIndex = 0;
  static const int kIsolateIndex = 1;
  static const int kReturnValueDefaultValueIndex = 2;
  static const int kReturnValueIndex = 3;
  static const int kDataIndex = 4;
  static const int kCalleeIndex = 5;
  static const int kContextSaveIndex = 6;
  static const int kArgsLength = 7;

 private:
  NAN_DISALLOW_ASSIGN_COPY_MOVE(FunctionCallbackInfo)
};

template<typename T>
class PropertyCallbackInfoBase {
  const v8::AccessorInfo &info_;
  const v8::Local<v8::Value> data_;

 public:
  explicit inline PropertyCallbackInfoBase(
      const v8::AccessorInfo &info
    , const v8::Local<v8::Value> data) :
          info_(info)
        , data_(data) {}

  inline v8::Isolate* GetIsolate() const { return info_.GetIsolate(); }
  inline v8::Local<v8::Value> Data() const { return data_; }
  inline v8::Local<v8::Object> This() const { return info_.This(); }
  inline v8::Local<v8::Object> Holder() const { return info_.Holder(); }

 protected:
  static const int kHolderIndex = 0;
  static const int kIsolateIndex = 1;
  static const int kReturnValueDefaultValueIndex = 2;
  static const int kReturnValueIndex = 3;
  static const int kDataIndex = 4;
  static const int kThisIndex = 5;
  static const int kArgsLength = 6;

 private:
  NAN_DISALLOW_ASSIGN_COPY_MOVE(PropertyCallbackInfoBase)
};

template<typename T>
class PropertyCallbackInfo : public PropertyCallbackInfoBase<T> {
  ReturnValue<T> return_value_;
  v8::Persistent<T> retval_;

 public:
  explicit inline PropertyCallbackInfo(
      const v8::AccessorInfo &info
    , const v8::Local<v8::Value> data) :
          PropertyCallbackInfoBase<T>(info, data)
        , return_value_(info.GetIsolate(), &retval_)
        , retval_(v8::Persistent<T>::New(v8::Undefined())) {}

  inline ~PropertyCallbackInfo() {
    retval_.Dispose();
    retval_.Clear();
  }

  inline ReturnValue<T> GetReturnValue() const { return return_value_; }
};

template<>
class PropertyCallbackInfo<v8::Array> :
    public PropertyCallbackInfoBase<v8::Array> {
  ReturnValue<v8::Array> return_value_;
  v8::Persistent<v8::Array> retval_;

 public:
  explicit inline PropertyCallbackInfo(
      const v8::AccessorInfo &info
    , const v8::Local<v8::Value> data) :
          PropertyCallbackInfoBase<v8::Array>(info, data)
        , return_value_(info.GetIsolate(), &retval_)
        , retval_(v8::Persistent<v8::Array>::New(v8::Local<v8::Array>())) {}

  inline ~PropertyCallbackInfo() {
    retval_.Dispose();
    retval_.Clear();
  }

  inline ReturnValue<v8::Array> GetReturnValue() const {
    return return_value_;
  }
};

template<>
class PropertyCallbackInfo<v8::Boolean> :
    public PropertyCallbackInfoBase<v8::Boolean> {
  ReturnValue<v8::Boolean> return_value_;
  v8::Persistent<v8::Boolean> retval_;

 public:
  explicit inline PropertyCallbackInfo(
      const v8::AccessorInfo &info
    , const v8::Local<v8::Value> data) :
          PropertyCallbackInfoBase<v8::Boolean>(info, data)
        , return_value_(info.GetIsolate(), &retval_)
        , retval_(v8::Persistent<v8::Boolean>::New(v8::Local<v8::Boolean>())) {}

  inline ~PropertyCallbackInfo() {
    retval_.Dispose();
    retval_.Clear();
  }

  inline ReturnValue<v8::Boolean> GetReturnValue() const {
    return return_value_;
  }
};

template<>
class PropertyCallbackInfo<v8::Integer> :
    public PropertyCallbackInfoBase<v8::Integer> {
  ReturnValue<v8::Integer> return_value_;
  v8::Persistent<v8::Integer> retval_;

 public:
  explicit inline PropertyCallbackInfo(
      const v8::AccessorInfo &info
    , const v8::Local<v8::Value> data) :
          PropertyCallbackInfoBase<v8::Integer>(info, data)
        , return_value_(info.GetIsolate(), &retval_)
        , retval_(v8::Persistent<v8::Integer>::New(v8::Local<v8::Integer>())) {}

  inline ~PropertyCallbackInfo() {
    retval_.Dispose();
    retval_.Clear();
  }

  inline ReturnValue<v8::Integer> GetReturnValue() const {
    return return_value_;
  }
};

namespace imp {
template<typename T>
class ReturnValueImp : public ReturnValue<T> {
 public:
  explicit ReturnValueImp(ReturnValue<T> that) :
      ReturnValue<T>(that) {}
  inline v8::Handle<T> Value() {
      return *ReturnValue<T>::value_;
  }
};

static
v8::Handle<v8::Value> FunctionCallbackWrapper(const v8::Arguments &args) {
  v8::Local<v8::Object> obj = args.Data().As<v8::Object>();
  FunctionCallback callback = reinterpret_cast<FunctionCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kFunctionIndex).As<v8::External>()->Value()));
  FunctionCallbackInfo<v8::Value>
      cbinfo(args, obj->GetInternalField(kDataIndex));
  callback(cbinfo);
  return ReturnValueImp<v8::Value>(cbinfo.GetReturnValue()).Value();
}

typedef v8::Handle<v8::Value> (*NativeFunction)(const v8::Arguments &);

static
v8::Handle<v8::Value> GetterCallbackWrapper(
    v8::Local<v8::String> property, const v8::AccessorInfo &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Value>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  GetterCallback callback = reinterpret_cast<GetterCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kGetterIndex).As<v8::External>()->Value()));
  callback(property, cbinfo);
  return ReturnValueImp<v8::Value>(cbinfo.GetReturnValue()).Value();
}

typedef v8::Handle<v8::Value> (*NativeGetter)
    (v8::Local<v8::String>, const v8::AccessorInfo &);

static
void SetterCallbackWrapper(
    v8::Local<v8::String> property
  , v8::Local<v8::Value> value
  , const v8::AccessorInfo &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<void>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  SetterCallback callback = reinterpret_cast<SetterCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kSetterIndex).As<v8::External>()->Value()));
  callback(property, value, cbinfo);
}

typedef void (*NativeSetter)
    (v8::Local<v8::String>, v8::Local<v8::Value>, const v8::AccessorInfo &);

static
v8::Handle<v8::Value> PropertyGetterCallbackWrapper(
    v8::Local<v8::String> property, const v8::AccessorInfo &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Value>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  PropertyGetterCallback callback = reinterpret_cast<PropertyGetterCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kPropertyGetterIndex)
              .As<v8::External>()->Value()));
  callback(property, cbinfo);
  return ReturnValueImp<v8::Value>(cbinfo.GetReturnValue()).Value();
}

typedef v8::Handle<v8::Value> (*NativePropertyGetter)
    (v8::Local<v8::String>, const v8::AccessorInfo &);

static
v8::Handle<v8::Value> PropertySetterCallbackWrapper(
    v8::Local<v8::String> property
  , v8::Local<v8::Value> value
  , const v8::AccessorInfo &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Value>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  PropertySetterCallback callback = reinterpret_cast<PropertySetterCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kPropertySetterIndex)
              .As<v8::External>()->Value()));
  callback(property, value, cbinfo);
  return ReturnValueImp<v8::Value>(cbinfo.GetReturnValue()).Value();
}

typedef v8::Handle<v8::Value> (*NativePropertySetter)
    (v8::Local<v8::String>, v8::Local<v8::Value>, const v8::AccessorInfo &);

static
v8::Handle<v8::Array> PropertyEnumeratorCallbackWrapper(
    const v8::AccessorInfo &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Array>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  PropertyEnumeratorCallback callback =
      reinterpret_cast<PropertyEnumeratorCallback>(reinterpret_cast<intptr_t>(
          obj->GetInternalField(kPropertyEnumeratorIndex)
              .As<v8::External>()->Value()));
  callback(cbinfo);
  return ReturnValueImp<v8::Array>(cbinfo.GetReturnValue()).Value();
}

typedef v8::Handle<v8::Array> (*NativePropertyEnumerator)
    (const v8::AccessorInfo &);

static
v8::Handle<v8::Boolean> PropertyDeleterCallbackWrapper(
    v8::Local<v8::String> property
  , const v8::AccessorInfo &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Boolean>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  PropertyDeleterCallback callback = reinterpret_cast<PropertyDeleterCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kPropertyDeleterIndex)
              .As<v8::External>()->Value()));
  callback(property, cbinfo);
  return ReturnValueImp<v8::Boolean>(cbinfo.GetReturnValue()).Value();
}

typedef v8::Handle<v8::Boolean> (NativePropertyDeleter)
    (v8::Local<v8::String>, const v8::AccessorInfo &);

static
v8::Handle<v8::Integer> PropertyQueryCallbackWrapper(
    v8::Local<v8::String> property, const v8::AccessorInfo &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Integer>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  PropertyQueryCallback callback = reinterpret_cast<PropertyQueryCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kPropertyQueryIndex)
              .As<v8::External>()->Value()));
  callback(property, cbinfo);
  return ReturnValueImp<v8::Integer>(cbinfo.GetReturnValue()).Value();
}

typedef v8::Handle<v8::Integer> (*NativePropertyQuery)
    (v8::Local<v8::String>, const v8::AccessorInfo &);

static
v8::Handle<v8::Value> IndexGetterCallbackWrapper(
    uint32_t index, const v8::AccessorInfo &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Value>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  IndexGetterCallback callback = reinterpret_cast<IndexGetterCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kIndexPropertyGetterIndex)
              .As<v8::External>()->Value()));
  callback(index, cbinfo);
  return ReturnValueImp<v8::Value>(cbinfo.GetReturnValue()).Value();
}

typedef v8::Handle<v8::Value> (*NativeIndexGetter)
    (uint32_t, const v8::AccessorInfo &);

static
v8::Handle<v8::Value> IndexSetterCallbackWrapper(
    uint32_t index
  , v8::Local<v8::Value> value
  , const v8::AccessorInfo &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Value>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  IndexSetterCallback callback = reinterpret_cast<IndexSetterCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kIndexPropertySetterIndex)
              .As<v8::External>()->Value()));
  callback(index, value, cbinfo);
  return ReturnValueImp<v8::Value>(cbinfo.GetReturnValue()).Value();
}

typedef v8::Handle<v8::Value> (*NativeIndexSetter)
    (uint32_t, v8::Local<v8::Value>, const v8::AccessorInfo &);

static
v8::Handle<v8::Array> IndexEnumeratorCallbackWrapper(
    const v8::AccessorInfo &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Array>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  IndexEnumeratorCallback callback = reinterpret_cast<IndexEnumeratorCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kIndexPropertyEnumeratorIndex)
              .As<v8::External>()->Value()));
  callback(cbinfo);
  return ReturnValueImp<v8::Array>(cbinfo.GetReturnValue()).Value();
}

typedef v8::Handle<v8::Array> (*NativeIndexEnumerator)
    (const v8::AccessorInfo &);

static
v8::Handle<v8::Boolean> IndexDeleterCallbackWrapper(
    uint32_t index, const v8::AccessorInfo &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Boolean>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  IndexDeleterCallback callback = reinterpret_cast<IndexDeleterCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kIndexPropertyDeleterIndex)
              .As<v8::External>()->Value()));
  callback(index, cbinfo);
  return ReturnValueImp<v8::Boolean>(cbinfo.GetReturnValue()).Value();
}

typedef v8::Handle<v8::Boolean> (*NativeIndexDeleter)
    (uint32_t, const v8::AccessorInfo &);

static
v8::Handle<v8::Integer> IndexQueryCallbackWrapper(
    uint32_t index, const v8::AccessorInfo &info) {
  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
  PropertyCallbackInfo<v8::Integer>
      cbinfo(info, obj->GetInternalField(kDataIndex));
  IndexQueryCallback callback = reinterpret_cast<IndexQueryCallback>(
      reinterpret_cast<intptr_t>(
          obj->GetInternalField(kIndexPropertyQueryIndex)
              .As<v8::External>()->Value()));
  callback(index, cbinfo);
  return ReturnValueImp<v8::Integer>(cbinfo.GetReturnValue()).Value();
}

typedef v8::Handle<v8::Integer> (*NativeIndexQuery)
    (uint32_t, const v8::AccessorInfo &);
}  // end of namespace imp

#endif  // NAN_CALLBACKS_PRE_12_INL_H_
/*********************************************************************
 * NAN - Native Abstractions for Node.js
 *
 * Copyright (c) 2018 NAN contributors
 *
 * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
 ********************************************************************/

#ifndef NAN_CONVERTERS_H_
#define NAN_CONVERTERS_H_

namespace imp {
template<typename T> struct ToFactoryBase {
  typedef MaybeLocal<T> return_t;
};
template<typename T> struct ValueFactoryBase { typedef Maybe<T> return_t; };

template<typename T> struct ToFactory;

template<>
struct ToFactory<v8::Function> : ToFactoryBase<v8::Function> {
  static inline return_t convert(v8::Local<v8::Value> val) {
    if (val.IsEmpty() || !val->IsFunction()) return MaybeLocal<v8::Function>();
    return MaybeLocal<v8::Function>(val.As<v8::Function>());
  }
};

#define X(TYPE)                                                                \
    template<>                                                                 \
    struct ToFactory<v8::TYPE> : ToFactoryBase<v8::TYPE> {                     \
      static inline return_t convert(v8::Local<v8::Value> val);                \
    };

X(Boolean)
X(Number)
X(String)
X(Object)
X(Integer)
X(Uint32)
X(Int32)

#undef X

#define X(TYPE)                                                                \
    template<>                                                                 \
    struct ToFactory<TYPE> : ValueFactoryBase<TYPE> {                          \
      static inline return_t convert(v8::Local<v8::Value> val);                \
    };

X(bool)
X(double)
X(int64_t)
X(uint32_t)
X(int32_t)

#undef X
}  // end of namespace imp

template<typename T>
inline
typename imp::ToFactory<T>::return_t To(v8::Local<v8::Value> val) {
  return imp::ToFactory<T>::convert(val);
}

#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
# include "nan_converters_43_inl.h"
#else
# include "nan_converters_pre_43_inl.h"
#endif

#endif  // NAN_CONVERTERS_H_
/*********************************************************************
 * NAN - Native Abstractions for Node.js
 *
 * Copyright (c) 2018 NAN contributors
 *
 * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
 ********************************************************************/

#ifndef NAN_CONVERTERS_43_INL_H_
#define NAN_CONVERTERS_43_INL_H_

#define X(TYPE)                                                                \
imp::ToFactory<v8::TYPE>::return_t                                             \
imp::ToFactory<v8::TYPE>::convert(v8::Local<v8::Value> val) {                  \
  v8::Isolate *isolate = v8::Isolate::GetCurrent();                            \
  v8::EscapableHandleScope scope(isolate);                                     \
  return scope.Escape(                                                         \
      val->To ## TYPE(isolate->GetCurrentContext())                            \
          .FromMaybe(v8::Local<v8::TYPE>()));                                  \
}

X(Number)
X(String)
X(Object)
X(Integer)
X(Uint32)
X(Int32)
// V8 <= 7.0
#if V8_MAJOR_VERSION < 7 || (V8_MAJOR_VERSION == 7 && V8_MINOR_VERSION == 0)
X(Boolean)
#else
imp::ToFactory<v8::Boolean>::return_t                                          \
imp::ToFactory<v8::Boolean>::convert(v8::Local<v8::Value> val) {               \
  v8::Isolate *isolate = v8::Isolate::GetCurrent();                            \
  v8::EscapableHandleScope scope(isolate);                                     \
  return scope.Escape(val->ToBoolean(isolate));                                \
}
#endif

#undef X

#define X(TYPE, NAME)                                                          \
imp::ToFactory<TYPE>::return_t                                                 \
imp::ToFactory<TYPE>::convert(v8::Local<v8::Value> val) {                      \
  v8::Isolate *isolate = v8::Isolate::GetCurrent();                            \
  v8::HandleScope scope(isolate);                                              \
  return val->NAME ## Value(isolate->GetCurrentContext());                     \
}

X(double, Number)
X(int64_t, Integer)
X(uint32_t, Uint32)
X(int32_t, Int32)
// V8 <= 7.0
#if V8_MAJOR_VERSION < 7 || (V8_MAJOR_VERSION == 7 && V8_MINOR_VERSION == 0)
X(bool, Boolean)
#else
imp::ToFactory<bool>::return_t                                                 \
imp::ToFactory<bool>::convert(v8::Local<v8::Value> val) {                      \
  v8::Isolate *isolate = v8::Isolate::GetCurrent();                            \
  v8::HandleScope scope(isolate);                                              \
  return Just<bool>(val->BooleanValue(isolate));                               \
}
#endif

#undef X

#endif  // NAN_CONVERTERS_43_INL_H_
/*********************************************************************
 * NAN - Native Abstractions for Node.js
 *
 * Copyright (c) 2018 NAN contributors
 *
 * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
 ********************************************************************/

#ifndef NAN_CONVERTERS_PRE_43_INL_H_
#define NAN_CONVERTERS_PRE_43_INL_H_

#define X(TYPE)                                                                \
imp::ToFactory<v8::TYPE>::return_t                                             \
imp::ToFactory<v8::TYPE>::convert(v8::Local<v8::Value> val) {                  \
  return val->To ## TYPE();                                                    \
}

X(Boolean)
X(Number)
X(String)
X(Object)
X(Integer)
X(Uint32)
X(Int32)

#undef X

#define X(TYPE, NAME)                                                          \
imp::ToFactory<TYPE>::return_t                                                 \
imp::ToFactory<TYPE>::convert(v8::Local<v8::Value> val) {                      \
  return Just(val->NAME ## Value());                                           \
}

X(bool, Boolean)
X(double, Number)
X(int64_t, Integer)
X(uint32_t, Uint32)
X(int32_t, Int32)

#undef X

#endif  // NAN_CONVERTERS_PRE_43_INL_H_
/*********************************************************************
 * NAN - Native Abstractions for Node.js
 *
 * Copyright (c) 2018 NAN contributors
 *
 * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
 ********************************************************************/

#ifndef NAN_DEFINE_OWN_PROPERTY_HELPER_H_
#define NAN_DEFINE_OWN_PROPERTY_HELPER_H_

namespace imp {

inline Maybe<bool> DefineOwnPropertyHelper(
    v8::PropertyAttribute current
  , v8::Handle<v8::Object> obj
  , v8::Handle<v8::String> key
  , v8::Handle<v8::Value> value
  , v8::PropertyAttribute attribs = v8::None) {
  return !(current & v8::DontDelete) ||                     // configurable OR
                  (!(current & v8::ReadOnly) &&             // writable AND
                   !((attribs ^ current) & ~v8::ReadOnly))  // same excluding RO
             ? Just<bool>(obj->ForceSet(key, value, attribs))
             : Nothing<bool>();
}

}  // end of namespace imp

#endif  // NAN_DEFINE_OWN_PROPERTY_HELPER_H_
/*********************************************************************
 * NAN - Native Abstractions for Node.js
 *
 * Copyright (c) 2018 NAN contributors
 *
 * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
 ********************************************************************/

#ifndef NAN_IMPLEMENTATION_12_INL_H_
#define NAN_IMPLEMENTATION_12_INL_H_
//==============================================================================
// node v0.11 implementation
//==============================================================================

namespace imp {

//=== Array ====================================================================

Factory<v8::Array>::return_t
Factory<v8::Array>::New() {
  return v8::Array::New(v8::Isolate::GetCurrent());
}

Factory<v8::Array>::return_t
Factory<v8::Array>::New(int length) {
  return v8::Array::New(v8::Isolate::GetCurrent(), length);
}

//=== Boolean ==================================================================

Factory<v8::Boolean>::return_t
Factory<v8::Boolean>::New(bool value) {
  return v8::Boolean::New(v8::Isolate::GetCurrent(), value);
}

//=== Boolean Object ===========================================================

Factory<v8::BooleanObject>::return_t
Factory<v8::BooleanObject>::New(bool value) {
#if (NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION)
  return v8::BooleanObject::New(
    v8::Isolate::GetCurrent(), value).As<v8::BooleanObject>();
#else
  return v8::BooleanObject::New(value).As<v8::BooleanObject>();
#endif
}

//=== Context ==================================================================

Factory<v8::Context>::return_t
Factory<v8::Context>::New( v8::ExtensionConfiguration* extensions
                         , v8::Local<v8::ObjectTemplate> tmpl
                         , v8::Local<v8::Value> obj) {
  return v8::Context::New(v8::Isolate::GetCurrent(), extensions, tmpl, obj);
}

//=== Date =====================================================================

#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
Factory<v8::Date>::return_t
Factory<v8::Date>::New(double value) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::EscapableHandleScope scope(isolate);
  return scope.Escape(v8::Date::New(isolate->GetCurrentContext(), value)
      .FromMaybe(v8::Local<v8::Value>()).As<v8::Date>());
}
#else
Factory<v8::Date>::return_t
Factory<v8::Date>::New(double value) {
  return v8::Date::New(v8::Isolate::GetCurrent(), value).As<v8::Date>();
}
#endif

//=== External =================================================================

Factory<v8::External>::return_t
Factory<v8::External>::New(void * value) {
  return v8::External::New(v8::Isolate::GetCurrent(), value);
}

//=== Function =================================================================

Factory<v8::Function>::return_t
Factory<v8::Function>::New( FunctionCallback callback
                          , v8::Local<v8::Value> data) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::EscapableHandleScope scope(isolate);
  v8::Local<v8::ObjectTemplate> tpl = v8::ObjectTemplate::New(isolate);
  tpl->SetInternalFieldCount(imp::kFunctionFieldCount);
  v8::Local<v8::Object> obj = NewInstance(tpl).ToLocalChecked();

  obj->SetInternalField(
      imp::kFunctionIndex
    , v8::External::New(isolate, reinterpret_cast<void *>(callback)));

  v8::Local<v8::Value> val = v8::Local<v8::Value>::New(isolate, data);

  if (!val.IsEmpty()) {
    obj->SetInternalField(imp::kDataIndex, val);
  }

#if NODE_MAJOR_VERSION >= 10
  v8::Local<v8::Context> context = isolate->GetCurrentContext();
  v8::Local<v8::Function> function =
      v8::Function::New(context, imp::FunctionCallbackWrapper, obj)
      .ToLocalChecked();
#else
  v8::Local<v8::Function> function =
      v8::Function::New(isolate, imp::FunctionCallbackWrapper, obj);
#endif

  return scope.Escape(function);
}

//=== Function Template ========================================================

Factory<v8::FunctionTemplate>::return_t
Factory<v8::FunctionTemplate>::New( FunctionCallback callback
                                  , v8::Local<v8::Value> data
                                  , v8::Local<v8::Signature> signature) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  if (callback) {
    v8::EscapableHandleScope scope(isolate);
    v8::Local<v8::ObjectTemplate> tpl = v8::ObjectTemplate::New(isolate);
    tpl->SetInternalFieldCount(imp::kFunctionFieldCount);
    v8::Local<v8::Object> obj = NewInstance(tpl).ToLocalChecked();

    obj->SetInternalField(
        imp::kFunctionIndex
      , v8::External::New(isolate, reinterpret_cast<void *>(callback)));
    v8::Local<v8::Value> val = v8::Local<v8::Value>::New(isolate, data);

    if (!val.IsEmpty()) {
      obj->SetInternalField(imp::kDataIndex, val);
    }

    return scope.Escape(v8::FunctionTemplate::New( isolate
                                    , imp::FunctionCallbackWrapper
                                    , obj
                                    , signature));
  } else {
    return v8::FunctionTemplate::New(isolate, 0, data, signature);
  }
}

//=== Number ===================================================================

Factory<v8::Number>::return_t
Factory<v8::Number>::New(double value) {
  return v8::Number::New(v8::Isolate::GetCurrent(), value);
}

//=== Number Object ============================================================

Factory<v8::NumberObject>::return_t
Factory<v8::NumberObject>::New(double value) {
  return v8::NumberObject::New( v8::Isolate::GetCurrent()
                              , value).As<v8::NumberObject>();
}

//=== Integer, Int32 and Uint32 ================================================

template <typename T>
typename IntegerFactory<T>::return_t
IntegerFactory<T>::New(int32_t value) {
  return To<T>(T::New(v8::Isolate::GetCurrent(), value));
}

template <typename T>
typename IntegerFactory<T>::return_t
IntegerFactory<T>::New(uint32_t value) {
  return To<T>(T::NewFromUnsigned(v8::Isolate::GetCurrent(), value));
}

Factory<v8::Uint32>::return_t
Factory<v8::Uint32>::New(int32_t value) {
  return To<v8::Uint32>(
      v8::Uint32::NewFromUnsigned(v8::Isolate::GetCurrent(), value));
}

Factory<v8::Uint32>::return_t
Factory<v8::Uint32>::New(uint32_t value) {
  return To<v8::Uint32>(
      v8::Uint32::NewFromUnsigned(v8::Isolate::GetCurrent(), value));
}

//=== Object ===================================================================

Factory<v8::Object>::return_t
Factory<v8::Object>::New() {
  return v8::Object::New(v8::Isolate::GetCurrent());
}

//=== Object Template ==========================================================

Factory<v8::ObjectTemplate>::return_t
Factory<v8::ObjectTemplate>::New() {
  return v8::ObjectTemplate::New(v8::Isolate::GetCurrent());
}

//=== RegExp ===================================================================

#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
Factory<v8::RegExp>::return_t
Factory<v8::RegExp>::New(
    v8::Local<v8::String> pattern
  , v8::RegExp::Flags flags) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::EscapableHandleScope scope(isolate);
  return scope.Escape(
      v8::RegExp::New(isolate->GetCurrentContext(), pattern, flags)
          .FromMaybe(v8::Local<v8::RegExp>()));
}
#else
Factory<v8::RegExp>::return_t
Factory<v8::RegExp>::New(
    v8::Local<v8::String> pattern
  , v8::RegExp::Flags flags) {
  return v8::RegExp::New(pattern, flags);
}
#endif

//=== Script ===================================================================

#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
Factory<v8::Script>::return_t
Factory<v8::Script>::New( v8::Local<v8::String> source) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::EscapableHandleScope scope(isolate);
  v8::ScriptCompiler::Source src(source);
  return scope.Escape(
      v8::ScriptCompiler::Compile(isolate->GetCurrentContext(), &src)
          .FromMaybe(v8::Local<v8::Script>()));
}

Factory<v8::Script>::return_t
Factory<v8::Script>::New( v8::Local<v8::String> source
                        , v8::ScriptOrigin const& origin) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::EscapableHandleScope scope(isolate);
  v8::ScriptCompiler::Source src(source, origin);
  return scope.Escape(
      v8::ScriptCompiler::Compile(isolate->GetCurrentContext(), &src)
          .FromMaybe(v8::Local<v8::Script>()));
}
#else
Factory<v8::Script>::return_t
Factory<v8::Script>::New( v8::Local<v8::String> source) {
  v8::ScriptCompiler::Source src(source);
  return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &src);
}

Factory<v8::Script>::return_t
Factory<v8::Script>::New( v8::Local<v8::String> source
                        , v8::ScriptOrigin const& origin) {
  v8::ScriptCompiler::Source src(source, origin);
  return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &src);
}
#endif

//=== Signature ================================================================

Factory<v8::Signature>::return_t
Factory<v8::Signature>::New(Factory<v8::Signature>::FTH receiver) {
  return v8::Signature::New(v8::Isolate::GetCurrent(), receiver);
}

//=== String ===================================================================

Factory<v8::String>::return_t
Factory<v8::String>::New() {
  return v8::String::Empty(v8::Isolate::GetCurrent());
}

#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
Factory<v8::String>::return_t
Factory<v8::String>::New(const char * value, int length) {
  return v8::String::NewFromUtf8(
      v8::Isolate::GetCurrent(), value, v8::NewStringType::kNormal, length);
}

Factory<v8::String>::return_t
Factory<v8::String>::New(std::string const& value) {
  assert(value.size() <= INT_MAX && "string too long");
  return v8::String::NewFromUtf8(v8::Isolate::GetCurrent(),
      value.data(), v8::NewStringType::kNormal, static_cast<int>(value.size()));
}

Factory<v8::String>::return_t
Factory<v8::String>::New(const uint16_t * value, int length) {
  return v8::String::NewFromTwoByte(v8::Isolate::GetCurrent(), value,
        v8::NewStringType::kNormal, length);
}

Factory<v8::String>::return_t
Factory<v8::String>::New(v8::String::ExternalStringResource * value) {
  return v8::String::NewExternalTwoByte(v8::Isolate::GetCurrent(), value);
}

Factory<v8::String>::return_t
Factory<v8::String>::New(ExternalOneByteStringResource * value) {
  return v8::String::NewExternalOneByte(v8::Isolate::GetCurrent(), value);
}
#else
Factory<v8::String>::return_t
Factory<v8::String>::New(const char * value, int length) {
  return v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), value,
                                 v8::String::kNormalString, length);
}

Factory<v8::String>::return_t
Factory<v8::String>::New(
    std::string const& value) /* NOLINT(build/include_what_you_use) */ {
  assert(value.size() <= INT_MAX && "string too long");
  return v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), value.data(),
                                 v8::String::kNormalString,
                                 static_cast<int>(value.size()));
}

Factory<v8::String>::return_t
Factory<v8::String>::New(const uint16_t * value, int length) {
  return v8::String::NewFromTwoByte(v8::Isolate::GetCurrent(), value,
                                    v8::String::kNormalString, length);
}

Factory<v8::String>::return_t
Factory<v8::String>::New(v8::String::ExternalStringResource * value) {
  return v8::String::NewExternal(v8::Isolate::GetCurrent(), value);
}

Factory<v8::String>::return_t
Factory<v8::String>::New(ExternalOneByteStringResource * value) {
  return v8::String::NewExternal(v8::Isolate::GetCurrent(), value);
}
#endif

//=== String Object ============================================================

// See https://github.com/nodejs/nan/pull/811#discussion_r224594980.
// Disable the warning as there is no way around it.
// TODO(bnoordhuis) Use isolate-based version in Node.js v12.
Factory<v8::StringObject>::return_t
Factory<v8::StringObject>::New(v8::Local<v8::String> value) {
// V8 > 7.0
#if V8_MAJOR_VERSION > 7 || (V8_MAJOR_VERSION == 7 && V8_MINOR_VERSION > 0)
  return v8::StringObject::New(v8::Isolate::GetCurrent(), value)
      .As<v8::StringObject>();
#else
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4996)
#endif
#ifdef __GNUC__
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#endif
  return v8::StringObject::New(value).As<v8::StringObject>();
#ifdef __GNUC__
#pragma GCC diagnostic pop
#endif
#ifdef _MSC_VER
#pragma warning(pop)
#endif
#endif
}

//=== Unbound Script ===========================================================

#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
Factory<v8::UnboundScript>::return_t
Factory<v8::UnboundScript>::New(v8::Local<v8::String> source) {
  v8::ScriptCompiler::Source src(source);
  return v8::ScriptCompiler::CompileUnboundScript(
      v8::Isolate::GetCurrent(), &src);
}

Factory<v8::UnboundScript>::return_t
Factory<v8::UnboundScript>::New( v8::Local<v8::String> source
                               , v8::ScriptOrigin const& origin) {
  v8::ScriptCompiler::Source src(source, origin);
  return v8::ScriptCompiler::CompileUnboundScript(
      v8::Isolate::GetCurrent(), &src);
}
#else
Factory<v8::UnboundScript>::return_t
Factory<v8::UnboundScript>::New(v8::Local<v8::String> source) {
  v8::ScriptCompiler::Source src(source);
  return v8::ScriptCompiler::CompileUnbound(v8::Isolate::GetCurrent(), &src);
}

Factory<v8::UnboundScript>::return_t
Factory<v8::UnboundScript>::New( v8::Local<v8::String> source
                               , v8::ScriptOrigin const& origin) {
  v8::ScriptCompiler::Source src(source, origin);
  return v8::ScriptCompiler::CompileUnbound(v8::Isolate::GetCurrent(), &src);
}
#endif

}  // end of namespace imp

//=== Presistents and Handles ==================================================

#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
template <typename T>
inline v8::Local<T> New(v8::Handle<T> h) {
  return v8::Local<T>::New(v8::Isolate::GetCurrent(), h);
}
#endif

template <typename T, typename M>
inline v8::Local<T> New(v8::Persistent<T, M> const& p) {
  return v8::Local<T>::New(v8::Isolate::GetCurrent(), p);
}

template <typename T, typename M>
inline v8::Local<T> New(Persistent<T, M> const& p) {
  return v8::Local<T>::New(v8::Isolate::GetCurrent(), p);
}

template <typename T>
inline v8::Local<T> New(Global<T> const& p) {
  return v8::Local<T>::New(v8::Isolate::GetCurrent(), p);
}

#endif  // NAN_IMPLEMENTATION_12_INL_H_
/*********************************************************************
 * NAN - Native Abstractions for Node.js
 *
 * Copyright (c) 2018 NAN contributors
 *
 * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
 ********************************************************************/

#ifndef NAN_IMPLEMENTATION_PRE_12_INL_H_
#define NAN_IMPLEMENTATION_PRE_12_INL_H_

//==============================================================================
// node v0.10 implementation
//==============================================================================

namespace imp {

//=== Array ====================================================================

Factory<v8::Array>::return_t
Factory<v8::Array>::New() {
  return v8::Array::New();
}

Factory<v8::Array>::return_t
Factory<v8::Array>::New(int length) {
  return v8::Array::New(length);
}

//=== Boolean ==================================================================

Factory<v8::Boolean>::return_t
Factory<v8::Boolean>::New(bool value) {
  return v8::Boolean::New(value)->ToBoolean();
}

//=== Boolean Object ===========================================================

Factory<v8::BooleanObject>::return_t
Factory<v8::BooleanObject>::New(bool value) {
  return v8::BooleanObject::New(value).As<v8::BooleanObject>();
}

//=== Context ==================================================================

Factory<v8::Context>::return_t
Factory<v8::Context>::New( v8::ExtensionConfiguration* extensions
                         , v8::Local<v8::ObjectTemplate> tmpl
                         , v8::Local<v8::Value> obj) {
  v8::Persistent<v8::Context> ctx = v8::Context::New(extensions, tmpl, obj);
  v8::Local<v8::Context> lctx = v8::Local<v8::Context>::New(ctx);
  ctx.Dispose();
  return lctx;
}

//=== Date =====================================================================

Factory<v8::Date>::return_t
Factory<v8::Date>::New(double value) {
  return v8::Date::New(value).As<v8::Date>();
}

//=== External =================================================================

Factory<v8::External>::return_t
Factory<v8::External>::New(void * value) {
  return v8::External::New(value);
}

//=== Function =================================================================

Factory<v8::Function>::return_t
Factory<v8::Function>::New( FunctionCallback callback
                          , v8::Local<v8::Value> data) {
  v8::HandleScope scope;

  return scope.Close(Factory<v8::FunctionTemplate>::New(
                         callback, data, v8::Local<v8::Signature>())
                         ->GetFunction());
}


//=== FunctionTemplate =========================================================

Factory<v8::FunctionTemplate>::return_t
Factory<v8::FunctionTemplate>::New( FunctionCallback callback
                                  , v8::Local<v8::Value> data
                                  , v8::Local<v8::Signature> signature) {
  if (callback) {
    v8::HandleScope scope;

    v8::Local<v8::ObjectTemplate> tpl = v8::ObjectTemplate::New();
    tpl->SetInternalFieldCount(imp::kFunctionFieldCount);
    v8::Local<v8::Object> obj = tpl->NewInstance();

    obj->SetInternalField(
        imp::kFunctionIndex
      , v8::External::New(reinterpret_cast<void *>(callback)));

    v8::Local<v8::Value> val = v8::Local<v8::Value>::New(data);

    if (!val.IsEmpty()) {
      obj->SetInternalField(imp::kDataIndex, val);
    }

    // Note(agnat): Emulate length argument here. Unfortunately, I couldn't find
    // a way. Have at it though...
    return scope.Close(
        v8::FunctionTemplate::New(imp::FunctionCallbackWrapper
                                 , obj
                                 , signature));
  } else {
    return v8::FunctionTemplate::New(0, data, signature);
  }
}

//=== Number ===================================================================

Factory<v8::Number>::return_t
Factory<v8::Number>::New(double value) {
  return v8::Number::New(value);
}

//=== Number Object ============================================================

Factory<v8::NumberObject>::return_t
Factory<v8::NumberObject>::New(double value) {
  return v8::NumberObject::New(value).As<v8::NumberObject>();
}

//=== Integer, Int32 and Uint32 ================================================

template <typename T>
typename IntegerFactory<T>::return_t
IntegerFactory<T>::New(int32_t value) {
  return To<T>(T::New(value));
}

template <typename T>
typename IntegerFactory<T>::return_t
IntegerFactory<T>::New(uint32_t value) {
  return To<T>(T::NewFromUnsigned(value));
}

Factory<v8::Uint32>::return_t
Factory<v8::Uint32>::New(int32_t value) {
  return To<v8::Uint32>(v8::Uint32::NewFromUnsigned(value));
}

Factory<v8::Uint32>::return_t
Factory<v8::Uint32>::New(uint32_t value) {
  return To<v8::Uint32>(v8::Uint32::NewFromUnsigned(value));
}


//=== Object ===================================================================

Factory<v8::Object>::return_t
Factory<v8::Object>::New() {
  return v8::Object::New();
}

//=== Object Template ==========================================================

Factory<v8::ObjectTemplate>::return_t
Factory<v8::ObjectTemplate>::New() {
  return v8::ObjectTemplate::New();
}

//=== RegExp ===================================================================

Factory<v8::RegExp>::return_t
Factory<v8::RegExp>::New(
    v8::Local<v8::String> pattern
  , v8::RegExp::Flags flags) {
  return v8::RegExp::New(pattern, flags);
}

//=== Script ===================================================================

Factory<v8::Script>::return_t
Factory<v8::Script>::New( v8::Local<v8::String> source) {
  return v8::Script::New(source);
}
Factory<v8::Script>::return_t
Factory<v8::Script>::New( v8::Local<v8::String> source
                        , v8::ScriptOrigin const& origin) {
  return v8::Script::New(source, const_cast<v8::ScriptOrigin*>(&origin));
}

//=== Signature ================================================================

Factory<v8::Signature>::return_t
Factory<v8::Signature>::New(Factory<v8::Signature>::FTH receiver) {
  return v8::Signature::New(receiver);
}

//=== String ===================================================================

Factory<v8::String>::return_t
Factory<v8::String>::New() {
  return v8::String::Empty();
}

Factory<v8::String>::return_t
Factory<v8::String>::New(const char * value, int length) {
  return v8::String::New(value, length);
}

Factory<v8::String>::return_t
Factory<v8::String>::New(
    std::string const& value) /* NOLINT(build/include_what_you_use) */ {
  assert(value.size() <= INT_MAX && "string too long");
  return v8::String::New(value.data(), static_cast<int>(value.size()));
}

Factory<v8::String>::return_t
Factory<v8::String>::New(const uint16_t * value, int length) {
  return v8::String::New(value, length);
}

Factory<v8::String>::return_t
Factory<v8::String>::New(v8::String::ExternalStringResource * value) {
  return v8::String::NewExternal(value);
}

Factory<v8::String>::return_t
Factory<v8::String>::New(v8::String::ExternalAsciiStringResource * value) {
  return v8::String::NewExternal(value);
}

//=== String Object ============================================================

Factory<v8::StringObject>::return_t
Factory<v8::StringObject>::New(v8::Local<v8::String> value) {
  return v8::StringObject::New(value).As<v8::StringObject>();
}

}  // end of namespace imp

//=== Presistents and Handles ==================================================

template <typename T>
inline v8::Local<T> New(v8::Handle<T> h) {
  return v8::Local<T>::New(h);
}

template <typename T>
inline v8::Local<T> New(v8::Persistent<T> const& p) {
  return v8::Local<T>::New(p);
}

template <typename T, typename M>
inline v8::Local<T> New(Persistent<T, M> const& p) {
  return v8::Local<T>::New(p.persistent);
}

template <typename T>
inline v8::Local<T> New(Global<T> const& p) {
  return v8::Local<T>::New(p.persistent);
}

#endif  // NAN_IMPLEMENTATION_PRE_12_INL_H_
/*********************************************************************
 * NAN - Native Abstractions for Node.js
 *
 * Copyright (c) 2018 NAN contributors
 *
 * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
 ********************************************************************/

#ifndef NAN_JSON_H_
#define NAN_JSON_H_

#if NODE_MODULE_VERSION < NODE_0_12_MODULE_VERSION
#define NAN_JSON_H_NEED_PARSE 1
#else
#define NAN_JSON_H_NEED_PARSE 0
#endif  // NODE_MODULE_VERSION < NODE_0_12_MODULE_VERSION

#if NODE_MODULE_VERSION >= NODE_7_0_MODULE_VERSION
#define NAN_JSON_H_NEED_STRINGIFY 0
#else
#define NAN_JSON_H_NEED_STRINGIFY 1
#endif  // NODE_MODULE_VERSION >= NODE_7_0_MODULE_VERSION

class JSON {
 public:
  JSON() {
#if NAN_JSON_H_NEED_PARSE + NAN_JSON_H_NEED_STRINGIFY
    Nan::HandleScope scope;

    Nan::MaybeLocal<v8::Value> maybe_global_json = Nan::Get(
      Nan::GetCurrentContext()->Global(),
      Nan::New("JSON").ToLocalChecked()
    );

    assert(!maybe_global_json.IsEmpty() && "global JSON is empty");
    v8::Local<v8::Value> val_global_json = maybe_global_json.ToLocalChecked();

    assert(val_global_json->IsObject() && "global JSON is not an object");
    Nan::MaybeLocal<v8::Object> maybe_obj_global_json =
      Nan::To<v8::Object>(val_global_json);

    assert(!maybe_obj_global_json.IsEmpty() && "global JSON object is empty");
    v8::Local<v8::Object> global_json = maybe_obj_global_json.ToLocalChecked();

#if NAN_JSON_H_NEED_PARSE
    Nan::MaybeLocal<v8::Value> maybe_parse_method = Nan::Get(
      global_json, Nan::New("parse").ToLocalChecked()
    );

    assert(!maybe_parse_method.IsEmpty() && "JSON.parse is empty");
    v8::Local<v8::Value> parse_method = maybe_parse_method.ToLocalChecked();

    assert(parse_method->IsFunction() && "JSON.parse is not a function");
    parse_cb_.Reset(parse_method.As<v8::Function>());
#endif  // NAN_JSON_H_NEED_PARSE

#if NAN_JSON_H_NEED_STRINGIFY
    Nan::MaybeLocal<v8::Value> maybe_stringify_method = Nan::Get(
      global_json, Nan::New("stringify").ToLocalChecked()
    );

    assert(!maybe_stringify_method.IsEmpty() && "JSON.stringify is empty");
    v8::Local<v8::Value> stringify_method =
      maybe_stringify_method.ToLocalChecked();

    assert(
      stringify_method->IsFunction() && "JSON.stringify is not a function"
    );
    stringify_cb_.Reset(stringify_method.As<v8::Function>());
#endif  // NAN_JSON_H_NEED_STRINGIFY
#endif  // NAN_JSON_H_NEED_PARSE + NAN_JSON_H_NEED_STRINGIFY
  }

  inline
  Nan::MaybeLocal<v8::Value> Parse(v8::Local<v8::String> json_string) {
    Nan::EscapableHandleScope scope;
#if NAN_JSON_H_NEED_PARSE
    return scope.Escape(parse(json_string));
#else
    Nan::MaybeLocal<v8::Value> result;
#if NODE_MODULE_VERSION >= NODE_0_12_MODULE_VERSION && \
    NODE_MODULE_VERSION <= IOJS_2_0_MODULE_VERSION
    result = v8::JSON::Parse(json_string);
#else
#if NODE_MODULE_VERSION > NODE_6_0_MODULE_VERSION
    v8::Local<v8::Context> context_or_isolate = Nan::GetCurrentContext();
#else
    v8::Isolate* context_or_isolate = v8::Isolate::GetCurrent();
#endif  // NODE_MODULE_VERSION > NODE_6_0_MODULE_VERSION
    result = v8::JSON::Parse(context_or_isolate, json_string);
#endif  // NODE_MODULE_VERSION >= NODE_0_12_MODULE_VERSION &&
        // NODE_MODULE_VERSION <= IOJS_2_0_MODULE_VERSION
    if (result.IsEmpty()) return v8::Local<v8::Value>();
    return scope.Escape(result.ToLocalChecked());
#endif  // NAN_JSON_H_NEED_PARSE
  }

  inline
  Nan::MaybeLocal<v8::String> Stringify(v8::Local<v8::Object> json_object) {
    Nan::EscapableHandleScope scope;
    Nan::MaybeLocal<v8::String> result =
#if NAN_JSON_H_NEED_STRINGIFY
      Nan::To<v8::String>(stringify(json_object));
#else
      v8::JSON::Stringify(Nan::GetCurrentContext(), json_object);
#endif  // NAN_JSON_H_NEED_STRINGIFY
    if (result.IsEmpty()) return v8::Local<v8::String>();
    return scope.Escape(result.ToLocalChecked());
  }

  inline
  Nan::MaybeLocal<v8::String> Stringify(v8::Local<v8::Object> json_object,
    v8::Local<v8::String> gap) {
    Nan::EscapableHandleScope scope;
    Nan::MaybeLocal<v8::String> result =
#if NAN_JSON_H_NEED_STRINGIFY
      Nan::To<v8::String>(stringify(json_object, gap));
#else
      v8::JSON::Stringify(Nan::GetCurrentContext(), json_object, gap);
#endif  // NAN_JSON_H_NEED_STRINGIFY
    if (result.IsEmpty()) return v8::Local<v8::String>();
    return scope.Escape(result.ToLocalChecked());
  }

 private:
  NAN_DISALLOW_ASSIGN_COPY_MOVE(JSON)
#if NAN_JSON_H_NEED_PARSE
  Nan::Callback parse_cb_;
#endif  // NAN_JSON_H_NEED_PARSE
#if NAN_JSON_H_NEED_STRINGIFY
  Nan::Callback stringify_cb_;
#endif  // NAN_JSON_H_NEED_STRINGIFY

#if NAN_JSON_H_NEED_PARSE
  inline v8::Local<v8::Value> parse(v8::Local<v8::Value> arg) {
    assert(!parse_cb_.IsEmpty() && "parse_cb_ is empty");
    AsyncResource resource("nan:JSON.parse");
    return parse_cb_.Call(1, &arg, &resource).FromMaybe(v8::Local<v8::Value>());
  }
#endif  // NAN_JSON_H_NEED_PARSE

#if NAN_JSON_H_NEED_STRINGIFY
  inline v8::Local<v8::Value> stringify(v8::Local<v8::Value> arg) {
    assert(!stringify_cb_.IsEmpty() && "stringify_cb_ is empty");
    AsyncResource resource("nan:JSON.stringify");
    return stringify_cb_.Call(1, &arg, &resource)
        .FromMaybe(v8::Local<v8::Value>());
  }

  inline v8::Local<v8::Value> stringify(v8::Local<v8::Value> arg,
    v8::Local<v8::String> gap) {
    assert(!stringify_cb_.IsEmpty() && "stringify_cb_ is empty");

    v8::Local<v8::Value> argv[] = {
      arg,
      Nan::Null(),
      gap
    };
    AsyncResource resource("nan:JSON.stringify");
    return stringify_cb_.Call(3, argv, &resource)
        .FromMaybe(v8::Local<v8::Value>());
  }
#endif  // NAN_JSON_H_NEED_STRINGIFY
};

#endif  // NAN_JSON_H_
/*********************************************************************
 * NAN - Native Abstractions for Node.js
 *
 * Copyright (c) 2018 NAN contributors
 *
 * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
 ********************************************************************/

#ifndef NAN_MAYBE_43_INL_H_
#define NAN_MAYBE_43_INL_H_

template<typename T>
using MaybeLocal = v8::MaybeLocal<T>;

inline
MaybeLocal<v8::String> ToDetailString(v8::Local<v8::Value> val) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::EscapableHandleScope scope(isolate);
  return scope.Escape(val->ToDetailString(isolate->GetCurrentContext())
                          .FromMaybe(v8::Local<v8::String>()));
}

inline
MaybeLocal<v8::Uint32> ToArrayIndex(v8::Local<v8::Value> val) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::EscapableHandleScope scope(isolate);
  return scope.Escape(val->ToArrayIndex(isolate->GetCurrentContext())
                          .FromMaybe(v8::Local<v8::Uint32>()));
}

inline
Maybe<bool> Equals(v8::Local<v8::Value> a, v8::Local<v8::Value>(b)) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::HandleScope scope(isolate);
  return a->Equals(isolate->GetCurrentContext(), b);
}

inline
MaybeLocal<v8::Object> NewInstance(v8::Local<v8::Function> h) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::EscapableHandleScope scope(isolate);
  return scope.Escape(h->NewInstance(isolate->GetCurrentContext())
                          .FromMaybe(v8::Local<v8::Object>()));
}

inline
MaybeLocal<v8::Object> NewInstance(
      v8::Local<v8::Function> h
    , int argc
    , v8::Local<v8::Value> argv[]) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::EscapableHandleScope scope(isolate);
  return scope.Escape(h->NewInstance(isolate->GetCurrentContext(), argc, argv)
                          .FromMaybe(v8::Local<v8::Object>()));
}

inline
MaybeLocal<v8::Object> NewInstance(v8::Local<v8::ObjectTemplate> h) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::EscapableHandleScope scope(isolate);
  return scope.Escape(h->NewInstance(isolate->GetCurrentContext())
                          .FromMaybe(v8::Local<v8::Object>()));
}


inline MaybeLocal<v8::Function> GetFunction(
    v8::Local<v8::FunctionTemplate> t) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::EscapableHandleScope scope(isolate);
  return scope.Escape(t->GetFunction(isolate->GetCurrentContext())
                          .FromMaybe(v8::Local<v8::Function>()));
}

inline Maybe<bool> Set(
    v8::Local<v8::Object> obj
  , v8::Local<v8::Value> key
  , v8::Local<v8::Value> value) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::HandleScope scope(isolate);
  return obj->Set(isolate->GetCurrentContext(), key, value);
}

inline Maybe<bool> Set(
    v8::Local<v8::Object> obj
  , uint32_t index
  , v8::Local<v8::Value> value) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::HandleScope scope(isolate);
  return obj->Set(isolate->GetCurrentContext(), index, value);
}

#if NODE_MODULE_VERSION < NODE_4_0_MODULE_VERSION
#include "nan_define_own_property_helper.h"  // NOLINT(build/include)
#endif

inline Maybe<bool> DefineOwnProperty(
    v8::Local<v8::Object> obj
  , v8::Local<v8::String> key
  , v8::Local<v8::Value> value
  , v8::PropertyAttribute attribs = v8::None) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::HandleScope scope(isolate);
#if NODE_MODULE_VERSION >= NODE_4_0_MODULE_VERSION
  return obj->DefineOwnProperty(isolate->GetCurrentContext(), key, value,
                                attribs);
#else
  Maybe<v8::PropertyAttribute> maybeCurrent =
      obj->GetPropertyAttributes(isolate->GetCurrentContext(), key);
  if (maybeCurrent.IsNothing()) {
    return Nothing<bool>();
  }
  v8::PropertyAttribute current = maybeCurrent.FromJust();
  return imp::DefineOwnPropertyHelper(current, obj, key, value, attribs);
#endif
}

NAN_DEPRECATED inline Maybe<bool> ForceSet(
    v8::Local<v8::Object> obj
  , v8::Local<v8::Value> key
  , v8::Local<v8::Value> value
  , v8::PropertyAttribute attribs = v8::None) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::HandleScope scope(isolate);
#if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
  return key->IsName()
             ? obj->DefineOwnProperty(isolate->GetCurrentContext(),
                                      key.As<v8::Name>(), value, attribs)
             : Nothing<bool>();
#else
  return obj->ForceSet(isolate->GetCurrentContext(), key, value, attribs);
#endif
}

inline MaybeLocal<v8::Value> Get(
    v8::Local<v8::Object> obj
  , v8::Local<v8::Value> key) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::EscapableHandleScope scope(isolate);
  return scope.Escape(obj->Get(isolate->GetCurrentContext(), key)
                          .FromMaybe(v8::Local<v8::Value>()));
}

inline
MaybeLocal<v8::Value> Get(v8::Local<v8::Object> obj, uint32_t index) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::EscapableHandleScope scope(isolate);
  return scope.Escape(obj->Get(isolate->GetCurrentContext(), index)
                          .FromMaybe(v8::Local<v8::Value>()));
}

inline v8::PropertyAttribute GetPropertyAttributes(
    v8::Local<v8::Object> obj
  , v8::Local<v8::Value> key) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::HandleScope scope(isolate);
  return obj->GetPropertyAttributes(isolate->GetCurrentContext(), key)
      .FromJust();
}

inline Maybe<bool> Has(
    v8::Local<v8::Object> obj
  , v8::Local<v8::String> key) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::HandleScope scope(isolate);
  return obj->Has(isolate->GetCurrentContext(), key);
}

inline Maybe<bool> Has(v8::Local<v8::Object> obj, uint32_t index) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::HandleScope scope(isolate);
  return obj->Has(isolate->GetCurrentContext(), index);
}

inline Maybe<bool> Delete(
    v8::Local<v8::Object> obj
  , v8::Local<v8::String> key) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::HandleScope scope(isolate);
  return obj->Delete(isolate->GetCurrentContext(), key);
}

inline
Maybe<bool> Delete(v8::Local<v8::Object> obj, uint32_t index) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::HandleScope scope(isolate);
  return obj->Delete(isolate->GetCurrentContext(), index);
}

inline
MaybeLocal<v8::Array> GetPropertyNames(v8::Local<v8::Object> obj) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::EscapableHandleScope scope(isolate);
  return scope.Escape(obj->GetPropertyNames(isolate->GetCurrentContext())
                          .FromMaybe(v8::Local<v8::Array>()));
}

inline
MaybeLocal<v8::Array> GetOwnPropertyNames(v8::Local<v8::Object> obj) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::EscapableHandleScope scope(isolate);
  return scope.Escape(obj->GetOwnPropertyNames(isolate->GetCurrentContext())
                          .FromMaybe(v8::Local<v8::Array>()));
}

inline Maybe<bool> SetPrototype(
    v8::Local<v8::Object> obj
  , v8::Local<v8::Value> prototype) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::HandleScope scope(isolate);
  return obj->SetPrototype(isolate->GetCurrentContext(), prototype);
}

inline MaybeLocal<v8::String> ObjectProtoToString(
    v8::Local<v8::Object> obj) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::EscapableHandleScope scope(isolate);
  return scope.Escape(obj->ObjectProtoToString(isolate->GetCurrentContext())
                          .FromMaybe(v8::Local<v8::String>()));
}

inline Maybe<bool> HasOwnProperty(
    v8::Local<v8::Object> obj
  , v8::Local<v8::String> key) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::HandleScope scope(isolate);
  return obj->HasOwnProperty(isolate->GetCurrentContext(), key);
}

inline Maybe<bool> HasRealNamedProperty(
    v8::Local<v8::Object> obj
  , v8::Local<v8::String> key) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::HandleScope scope(isolate);
  return obj->HasRealNamedProperty(isolate->GetCurrentContext(), key);
}

inline Maybe<bool> HasRealIndexedProperty(
    v8::Local<v8::Object> obj
  , uint32_t index) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::HandleScope scope(isolate);
  return obj->HasRealIndexedProperty(isolate->GetCurrentContext(), index);
}

inline Maybe<bool> HasRealNamedCallbackProperty(
    v8::Local<v8::Object> obj
  , v8::Local<v8::String> key) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::HandleScope scope(isolate);
  return obj->HasRealNamedCallbackProperty(isolate->GetCurrentContext(), key);
}

inline MaybeLocal<v8::Value> GetRealNamedPropertyInPrototypeChain(
    v8::Local<v8::Object> obj
  , v8::Local<v8::String> key) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::EscapableHandleScope scope(isolate);
  return scope.Escape(obj->GetRealNamedPropertyInPrototypeChain(
                             isolate->GetCurrentContext(), key)
                          .FromMaybe(v8::Local<v8::Value>()));
}

inline MaybeLocal<v8::Value> GetRealNamedProperty(
    v8::Local<v8::Object> obj
  , v8::Local<v8::String> key) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::EscapableHandleScope scope(isolate);
  return scope.Escape(
      obj->GetRealNamedProperty(isolate->GetCurrentContext(), key)
          .FromMaybe(v8::Local<v8::Value>()));
}

inline MaybeLocal<v8::Value> CallAsFunction(
    v8::Local<v8::Object> obj
  , v8::Local<v8::Object> recv
  , int argc
  , v8::Local<v8::Value> argv[]) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::EscapableHandleScope scope(isolate);
  return scope.Escape(
      obj->CallAsFunction(isolate->GetCurrentContext(), recv, argc, argv)
          .FromMaybe(v8::Local<v8::Value>()));
}

inline MaybeLocal<v8::Value> CallAsConstructor(
    v8::Local<v8::Object> obj
  , int argc, v8::Local<v8::Value> argv[]) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::EscapableHandleScope scope(isolate);
  return scope.Escape(
      obj->CallAsConstructor(isolate->GetCurrentContext(), argc, argv)
          .FromMaybe(v8::Local<v8::Value>()));
}

inline
MaybeLocal<v8::String> GetSourceLine(v8::Local<v8::Message> msg) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::EscapableHandleScope scope(isolate);
  return scope.Escape(msg->GetSourceLine(isolate->GetCurrentContext())
                          .FromMaybe(v8::Local<v8::String>()));
}

inline Maybe<int> GetLineNumber(v8::Local<v8::Message> msg) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::HandleScope scope(isolate);
  return msg->GetLineNumber(isolate->GetCurrentContext());
}

inline Maybe<int> GetStartColumn(v8::Local<v8::Message> msg) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::HandleScope scope(isolate);
  return msg->GetStartColumn(isolate->GetCurrentContext());
}

inline Maybe<int> GetEndColumn(v8::Local<v8::Message> msg) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::HandleScope scope(isolate);
  return msg->GetEndColumn(isolate->GetCurrentContext());
}

inline MaybeLocal<v8::Object> CloneElementAt(
    v8::Local<v8::Array> array
  , uint32_t index) {
#if (NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION)
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::EscapableHandleScope scope(isolate);
  v8::Local<v8::Context> context = isolate->GetCurrentContext();
  v8::Local<v8::Value> elem;
  v8::Local<v8::Object> obj;
  if (!array->Get(context, index).ToLocal(&elem)) {
    return scope.Escape(obj);
  }
  if (!elem->ToObject(context).ToLocal(&obj)) {
    return scope.Escape(v8::Local<v8::Object>());
  }
  return scope.Escape(obj->Clone());
#else
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::EscapableHandleScope scope(isolate);
  return scope.Escape(array->CloneElementAt(isolate->GetCurrentContext(), index)
                          .FromMaybe(v8::Local<v8::Object>()));
#endif
}

inline MaybeLocal<v8::Value> Call(
    v8::Local<v8::Function> fun
  , v8::Local<v8::Object> recv
  , int argc
  , v8::Local<v8::Value> argv[]) {
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::EscapableHandleScope scope(isolate);
  return scope.Escape(fun->Call(isolate->GetCurrentContext(), recv, argc, argv)
                          .FromMaybe(v8::Local<v8::Value>()));
}

#endif  // NAN_MAYBE_43_INL_H_
/*********************************************************************
 * NAN - Native Abstractions for Node.js
 *
 * Copyright (c) 2018 NAN contributors
 *
 * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
 ********************************************************************/

#ifndef NAN_MAYBE_PRE_43_INL_H_
#define NAN_MAYBE_PRE_43_INL_H_

template<typename T>
class MaybeLocal {
 public:
  inline MaybeLocal() : val_(v8::Local<T>()) {}

  template<typename S>
# if NODE_MODULE_VERSION >= NODE_0_12_MODULE_VERSION
  inline
  MaybeLocal(v8::Local<S> that) : val_(that) {}  // NOLINT(runtime/explicit)
# else
  inline
  MaybeLocal(v8::Local<S> that) :  // NOLINT(runtime/explicit)
      val_(*reinterpret_cast<v8::Local<T>*>(&that)) {}
# endif

  inline bool IsEmpty() const { return val_.IsEmpty(); }

  template<typename S>
  inline bool ToLocal(v8::Local<S> *out) const {
    *out = val_;
    return !IsEmpty();
  }

  inline v8::Local<T> ToLocalChecked() const {
#if defined(V8_ENABLE_CHECKS)
    assert(!IsEmpty() && "ToLocalChecked is Empty");
#endif  // V8_ENABLE_CHECKS
    return val_;
  }

  template<typename S>
  inline v8::Local<S> FromMaybe(v8::Local<S> default_value) const {
    return IsEmpty() ? default_value : v8::Local<S>(val_);
  }

 private:
  v8::Local<T> val_;
};

inline
MaybeLocal<v8::String> ToDetailString(v8::Handle<v8::Value> val) {
  return MaybeLocal<v8::String>(val->ToDetailString());
}

inline
MaybeLocal<v8::Uint32> ToArrayIndex(v8::Handle<v8::Value> val) {
  return MaybeLocal<v8::Uint32>(val->ToArrayIndex());
}

inline
Maybe<bool> Equals(v8::Handle<v8::Value> a, v8::Handle<v8::Value>(b)) {
  return Just<bool>(a->Equals(b));
}

inline
MaybeLocal<v8::Object> NewInstance(v8::Handle<v8::Function> h) {
  return MaybeLocal<v8::Object>(h->NewInstance());
}

inline
MaybeLocal<v8::Object> NewInstance(
      v8::Local<v8::Function> h
    , int argc
    , v8::Local<v8::Value> argv[]) {
  return MaybeLocal<v8::Object>(h->NewInstance(argc, argv));
}

inline
MaybeLocal<v8::Object> NewInstance(v8::Handle<v8::ObjectTemplate> h) {
  return MaybeLocal<v8::Object>(h->NewInstance());
}

inline
MaybeLocal<v8::Function> GetFunction(v8::Handle<v8::FunctionTemplate> t) {
  return MaybeLocal<v8::Function>(t->GetFunction());
}

inline Maybe<bool> Set(
    v8::Handle<v8::Object> obj
  , v8::Handle<v8::Value> key
  , v8::Handle<v8::Value> value) {
  return Just<bool>(obj->Set(key, value));
}

inline Maybe<bool> Set(
    v8::Handle<v8::Object> obj
  , uint32_t index
  , v8::Handle<v8::Value> value) {
  return Just<bool>(obj->Set(index, value));
}

#include "nan_define_own_property_helper.h"  // NOLINT(build/include)

inline Maybe<bool> DefineOwnProperty(
    v8::Handle<v8::Object> obj
  , v8::Handle<v8::String> key
  , v8::Handle<v8::Value> value
  , v8::PropertyAttribute attribs = v8::None) {
  v8::PropertyAttribute current = obj->GetPropertyAttributes(key);
  return imp::DefineOwnPropertyHelper(current, obj, key, value, attribs);
}

NAN_DEPRECATED inline Maybe<bool> ForceSet(
    v8::Handle<v8::Object> obj
  , v8::Handle<v8::Value> key
  , v8::Handle<v8::Value> value
  , v8::PropertyAttribute attribs = v8::None) {
  return Just<bool>(obj->ForceSet(key, value, attribs));
}

inline MaybeLocal<v8::Value> Get(
    v8::Handle<v8::Object> obj
  , v8::Handle<v8::Value> key) {
  return MaybeLocal<v8::Value>(obj->Get(key));
}

inline MaybeLocal<v8::Value> Get(
    v8::Handle<v8::Object> obj
  , uint32_t index) {
  return MaybeLocal<v8::Value>(obj->Get(index));
}

inline Maybe<v8::PropertyAttribute> GetPropertyAttributes(
    v8::Handle<v8::Object> obj
  , v8::Handle<v8::Value> key) {
  return Just<v8::PropertyAttribute>(obj->GetPropertyAttributes(key));
}

inline Maybe<bool> Has(
    v8::Handle<v8::Object> obj
  , v8::Handle<v8::String> key) {
  return Just<bool>(obj->Has(key));
}

inline Maybe<bool> Has(
    v8::Handle<v8::Object> obj
  , uint32_t index) {
  return Just<bool>(obj->Has(index));
}

inline Maybe<bool> Delete(
    v8::Handle<v8::Object> obj
  , v8::Handle<v8::String> key) {
  return Just<bool>(obj->Delete(key));
}

inline Maybe<bool> Delete(
    v8::Handle<v8::Object> obj
  , uint32_t index) {
  return Just<bool>(obj->Delete(index));
}

inline
MaybeLocal<v8::Array> GetPropertyNames(v8::Handle<v8::Object> obj) {
  return MaybeLocal<v8::Array>(obj->GetPropertyNames());
}

inline
MaybeLocal<v8::Array> GetOwnPropertyNames(v8::Handle<v8::Object> obj) {
  return MaybeLocal<v8::Array>(obj->GetOwnPropertyNames());
}

inline Maybe<bool> SetPrototype(
    v8::Handle<v8::Object> obj
  , v8::Handle<v8::Value> prototype) {
  return Just<bool>(obj->SetPrototype(prototype));
}

inline MaybeLocal<v8::String> ObjectProtoToString(
    v8::Handle<v8::Object> obj) {
  return MaybeLocal<v8::String>(obj->ObjectProtoToString());
}

inline Maybe<bool> HasOwnProperty(
    v8::Handle<v8::Object> obj
  , v8::Handle<v8::String> key) {
  return Just<bool>(obj->HasOwnProperty(key));
}

inline Maybe<bool> HasRealNamedProperty(
    v8::Handle<v8::Object> obj
  , v8::Handle<v8::String> key) {
  return Just<bool>(obj->HasRealNamedProperty(key));
}

inline Maybe<bool> HasRealIndexedProperty(
    v8::Handle<v8::Object> obj
  , uint32_t index) {
  return Just<bool>(obj->HasRealIndexedProperty(index));
}

inline Maybe<bool> HasRealNamedCallbackProperty(
    v8::Handle<v8::Object> obj
  , v8::Handle<v8::String> key) {
  return Just<bool>(obj->HasRealNamedCallbackProperty(key));
}

inline MaybeLocal<v8::Value> GetRealNamedPropertyInPrototypeChain(
    v8::Handle<v8::Object> obj
  , v8::Handle<v8::String> key) {
  return MaybeLocal<v8::Value>(
      obj->GetRealNamedPropertyInPrototypeChain(key));
}

inline MaybeLocal<v8::Value> GetRealNamedProperty(
    v8::Handle<v8::Object> obj
  , v8::Handle<v8::String> key) {
  return MaybeLocal<v8::Value>(obj->GetRealNamedProperty(key));
}

inline MaybeLocal<v8::Value> CallAsFunction(
    v8::Handle<v8::Object> obj
  , v8::Handle<v8::Object> recv
  , int argc
  , v8::Handle<v8::Value> argv[]) {
  return MaybeLocal<v8::Value>(obj->CallAsFunction(recv, argc, argv));
}

inline MaybeLocal<v8::Value> CallAsConstructor(
    v8::Handle<v8::Object> obj
  , int argc
  , v8::Local<v8::Value> argv[]) {
  return MaybeLocal<v8::Value>(obj->CallAsConstructor(argc, argv));
}

inline
MaybeLocal<v8::String> GetSourceLine(v8::Handle<v8::Message> msg) {
  return MaybeLocal<v8::String>(msg->GetSourceLine());
}

inline Maybe<int> GetLineNumber(v8::Handle<v8::Message> msg) {
  return Just<int>(msg->GetLineNumber());
}

inline Maybe<int> GetStartColumn(v8::Handle<v8::Message> msg) {
  return Just<int>(msg->GetStartColumn());
}

inline Maybe<int> GetEndColumn(v8::Handle<v8::Message> msg) {
  return Just<int>(msg->GetEndColumn());
}

inline MaybeLocal<v8::Object> CloneElementAt(
    v8::Handle<v8::Array> array
  , uint32_t index) {
  return MaybeLocal<v8::Object>(array->CloneElementAt(index));
}

inline MaybeLocal<v8::Value> Call(
    v8::Local<v8::Function> fun
  , v8::Local<v8::Object> recv
  , int argc
  , v8::Local<v8::Value> argv[]) {
  return MaybeLocal<v8::Value>(fun->Call(recv, argc, argv));
}

#endif  // NAN_MAYBE_PRE_43_INL_H_
/*********************************************************************
 * NAN - Native Abstractions for Node.js
 *
 * Copyright (c) 2018 NAN contributors
 *
 * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
 ********************************************************************/

#ifndef NAN_NEW_H_
#define NAN_NEW_H_

namespace imp {  // scnr

// TODO(agnat): Generalize
template <typename T> v8::Local<T> To(v8::Local<v8::Integer> i);

template <>
inline
v8::Local<v8::Integer>
To<v8::Integer>(v8::Local<v8::Integer> i) {
  return Nan::To<v8::Integer>(i).ToLocalChecked();
}

template <>
inline
v8::Local<v8::Int32>
To<v8::Int32>(v8::Local<v8::Integer> i) {
  return Nan::To<v8::Int32>(i).ToLocalChecked();
}

template <>
inline
v8::Local<v8::Uint32>
To<v8::Uint32>(v8::Local<v8::Integer> i) {
  return Nan::To<v8::Uint32>(i).ToLocalChecked();
}

template <typename T> struct FactoryBase {
  typedef v8::Local<T> return_t;
};

template <typename T> struct MaybeFactoryBase {
  typedef MaybeLocal<T> return_t;
};

template <typename T> struct Factory;

template <>
struct Factory<v8::Array> : FactoryBase<v8::Array> {
  static inline return_t New();
  static inline return_t New(int length);
};

template <>
struct Factory<v8::Boolean> : FactoryBase<v8::Boolean> {
  static inline return_t New(bool value);
};

template <>
struct Factory<v8::BooleanObject> : FactoryBase<v8::BooleanObject> {
  static inline return_t New(bool value);
};

template <>
struct Factory<v8::Context> : FactoryBase<v8::Context> {
  static inline
  return_t
  New( v8::ExtensionConfiguration* extensions = NULL
     , v8::Local<v8::ObjectTemplate> tmpl = v8::Local<v8::ObjectTemplate>()
     , v8::Local<v8::Value> obj = v8::Local<v8::Value>());
};

template <>
struct Factory<v8::Date> : MaybeFactoryBase<v8::Date> {
  static inline return_t New(double value);
};

template <>
struct Factory<v8::External> : FactoryBase<v8::External> {
  static inline return_t New(void *value);
};

template <>
struct Factory<v8::Function> : FactoryBase<v8::Function> {
  static inline
  return_t
  New( FunctionCallback callback
     , v8::Local<v8::Value> data = v8::Local<v8::Value>());
};

template <>
struct Factory<v8::FunctionTemplate> : FactoryBase<v8::FunctionTemplate> {
  static inline
  return_t
  New( FunctionCallback callback = NULL
     , v8::Local<v8::Value> data = v8::Local<v8::Value>()
     , v8::Local<v8::Signature> signature = v8::Local<v8::Signature>());
};

template <>
struct Factory<v8::Number> : FactoryBase<v8::Number> {
  static inline return_t New(double value);
};

template <>
struct Factory<v8::NumberObject> : FactoryBase<v8::NumberObject> {
  static inline return_t New(double value);
};

template <typename T>
struct IntegerFactory : FactoryBase<T> {
  typedef typename FactoryBase<T>::return_t return_t;
  static inline return_t New(int32_t value);
  static inline return_t New(uint32_t value);
};

template <>
struct Factory<v8::Integer> : IntegerFactory<v8::Integer> {};

template <>
struct Factory<v8::Int32> : IntegerFactory<v8::Int32> {};

template <>
struct Factory<v8::Uint32> : FactoryBase<v8::Uint32> {
  static inline return_t New(int32_t value);
  static inline return_t New(uint32_t value);
};

template <>
struct Factory<v8::Object> : FactoryBase<v8::Object> {
  static inline return_t New();
};

template <>
struct Factory<v8::ObjectTemplate> : FactoryBase<v8::ObjectTemplate> {
  static inline return_t New();
};

template <>
struct Factory<v8::RegExp> : MaybeFactoryBase<v8::RegExp> {
  static inline return_t New(
      v8::Local<v8::String> pattern, v8::RegExp::Flags flags);
};

template <>
struct Factory<v8::Script> : MaybeFactoryBase<v8::Script> {
  static inline return_t New( v8::Local<v8::String> source);
  static inline return_t New( v8::Local<v8::String> source
                            , v8::ScriptOrigin const& origin);
};

template <>
struct Factory<v8::Signature> : FactoryBase<v8::Signature> {
  typedef v8::Local<v8::FunctionTemplate> FTH;
  static inline return_t New(FTH receiver = FTH());
};

template <>
struct Factory<v8::String> : MaybeFactoryBase<v8::String> {
  static inline return_t New();
  static inline return_t New(const char *value, int length = -1);
  static inline return_t New(const uint16_t *value, int length = -1);
  static inline return_t New(std::string const& value);

  static inline return_t New(v8::String::ExternalStringResource * value);
  static inline return_t New(ExternalOneByteStringResource * value);
};

template <>
struct Factory<v8::StringObject> : FactoryBase<v8::StringObject> {
  static inline return_t New(v8::Local<v8::String> value);
};

}  // end of namespace imp

#if (NODE_MODULE_VERSION >= 12)

namespace imp {

template <>
struct Factory<v8::UnboundScript> : MaybeFactoryBase<v8::UnboundScript> {
  static inline return_t New( v8::Local<v8::String> source);
  static inline return_t New( v8::Local<v8::String> source
                            , v8::ScriptOrigin const& origin);
};

}  // end of namespace imp

# include "nan_implementation_12_inl.h"

#else  // NODE_MODULE_VERSION >= 12

# include "nan_implementation_pre_12_inl.h"

#endif

//=== API ======================================================================

template <typename T>
typename imp::Factory<T>::return_t
New() {
  return imp::Factory<T>::New();
}

template <typename T, typename A0>
typename imp::Factory<T>::return_t
New(A0 arg0) {
  return imp::Factory<T>::New(arg0);
}

template <typename T, typename A0, typename A1>
typename imp::Factory<T>::return_t
New(A0 arg0, A1 arg1) {
  return imp::Factory<T>::New(arg0, arg1);
}

template <typename T, typename A0, typename A1, typename A2>
typename imp::Factory<T>::return_t
New(A0 arg0, A1 arg1, A2 arg2) {
  return imp::Factory<T>::New(arg0, arg1, arg2);
}

template <typename T, typename A0, typename A1, typename A2, typename A3>
typename imp::Factory<T>::return_t
New(A0 arg0, A1 arg1, A2 arg2, A3 arg3) {
  return imp::Factory<T>::New(arg0, arg1, arg2, arg3);
}

// Note(agnat): When passing overloaded function pointers to template functions
// as generic arguments the compiler needs help in picking the right overload.
// These two functions handle New<Function> and New<FunctionTemplate> with
// all argument variations.

// v8::Function and v8::FunctionTemplate with one or two arguments
template <typename T>
typename imp::Factory<T>::return_t
New( FunctionCallback callback
      , v8::Local<v8::Value> data = v8::Local<v8::Value>()) {
    return imp::Factory<T>::New(callback, data);
}

// v8::Function and v8::FunctionTemplate with three arguments
template <typename T, typename A2>
typename imp::Factory<T>::return_t
New( FunctionCallback callback
      , v8::Local<v8::Value> data = v8::Local<v8::Value>()
      , A2 a2 = A2()) {
    return imp::Factory<T>::New(callback, data, a2);
}

// Convenience

#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
template <typename T> inline v8::Local<T> New(v8::Handle<T> h);
#endif

#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
template <typename T, typename M>
    inline v8::Local<T> New(v8::Persistent<T, M> const& p);
#else
template <typename T> inline v8::Local<T> New(v8::Persistent<T> const& p);
#endif
template <typename T, typename M>
inline v8::Local<T> New(Persistent<T, M> const& p);
template <typename T>
inline v8::Local<T> New(Global<T> const& p);

inline
imp::Factory<v8::Boolean>::return_t
New(bool value) {
  return New<v8::Boolean>(value);
}

inline
imp::Factory<v8::Int32>::return_t
New(int32_t value) {
  return New<v8::Int32>(value);
}

inline
imp::Factory<v8::Uint32>::return_t
New(uint32_t value) {
  return New<v8::Uint32>(value);
}

inline
imp::Factory<v8::Number>::return_t
New(double value) {
  return New<v8::Number>(value);
}

inline
imp::Factory<v8::String>::return_t
New(std::string const& value) {  // NOLINT(build/include_what_you_use)
  return New<v8::String>(value);
}

inline
imp::Factory<v8::String>::return_t
New(const char * value, int length) {
  return New<v8::String>(value, length);
}

inline
imp::Factory<v8::String>::return_t
New(const uint16_t * value, int length) {
  return New<v8::String>(value, length);
}

inline
imp::Factory<v8::String>::return_t
New(const char * value) {
  return New<v8::String>(value);
}

inline
imp::Factory<v8::String>::return_t
New(const uint16_t * value) {
  return New<v8::String>(value);
}

inline
imp::Factory<v8::String>::return_t
New(v8::String::ExternalStringResource * value) {
  return New<v8::String>(value);
}

inline
imp::Factory<v8::String>::return_t
New(ExternalOneByteStringResource * value) {
  return New<v8::String>(value);
}

inline
imp::Factory<v8::RegExp>::return_t
New(v8::Local<v8::String> pattern, v8::RegExp::Flags flags) {
  return New<v8::RegExp>(pattern, flags);
}

#endif  // NAN_NEW_H_
/*********************************************************************
 * NAN - Native Abstractions for Node.js
 *
 * Copyright (c) 2018 NAN contributors
 *
 * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
 ********************************************************************/

#ifndef NAN_OBJECT_WRAP_H_
#define NAN_OBJECT_WRAP_H_

class ObjectWrap {
 public:
  ObjectWrap() {
    refs_ = 0;
  }


  virtual ~ObjectWrap() {
    if (persistent().IsEmpty()) {
      return;
    }

    persistent().ClearWeak();
    persistent().Reset();
  }


  template <class T>
  static inline T* Unwrap(v8::Local<v8::Object> object) {
    assert(!object.IsEmpty());
    assert(object->InternalFieldCount() > 0);
    // Cast to ObjectWrap before casting to T.  A direct cast from void
    // to T won't work right when T has more than one base class.
    void* ptr = GetInternalFieldPointer(object, 0);
    ObjectWrap* wrap = static_cast<ObjectWrap*>(ptr);
    return static_cast<T*>(wrap);
  }


  inline v8::Local<v8::Object> handle() const {
    return New(handle_);
  }


  inline Persistent<v8::Object>& persistent() {
    return handle_;
  }


 protected:
  inline void Wrap(v8::Local<v8::Object> object) {
    assert(persistent().IsEmpty());
    assert(object->InternalFieldCount() > 0);
    SetInternalFieldPointer(object, 0, this);
    persistent().Reset(object);
    MakeWeak();
  }

#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))

  inline void MakeWeak() {
    persistent().v8::PersistentBase<v8::Object>::SetWeak(
        this, WeakCallback, v8::WeakCallbackType::kParameter);
#if NODE_MAJOR_VERSION < 10
    // FIXME(bnoordhuis) Probably superfluous in older Node.js versions too.
    persistent().MarkIndependent();
#endif
  }

#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION

  inline void MakeWeak() {
    persistent().v8::PersistentBase<v8::Object>::SetWeak(this, WeakCallback);
    persistent().MarkIndependent();
  }

#else

  inline void MakeWeak() {
    persistent().persistent.MakeWeak(this, WeakCallback);
    persistent().MarkIndependent();
  }

#endif

  /* Ref() marks the object as being attached to an event loop.
   * Refed objects will not be garbage collected, even if
   * all references are lost.
   */
  virtual void Ref() {
    assert(!persistent().IsEmpty());
    persistent().ClearWeak();
    refs_++;
  }

  /* Unref() marks an object as detached from the event loop.  This is its
   * default state.  When an object with a "weak" reference changes from
   * attached to detached state it will be freed. Be careful not to access
   * the object after making this call as it might be gone!
   * (A "weak reference" means an object that only has a
   * persistent handle.)
   *
   * DO NOT CALL THIS FROM DESTRUCTOR
   */
  virtual void Unref() {
    assert(!persistent().IsEmpty());
    assert(!persistent().IsWeak());
    assert(refs_ > 0);
    if (--refs_ == 0)
      MakeWeak();
  }

  int refs_;  // ro

 private:
  NAN_DISALLOW_ASSIGN_COPY_MOVE(ObjectWrap)
#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))

  static void
  WeakCallback(v8::WeakCallbackInfo<ObjectWrap> const& info) {
    ObjectWrap* wrap = info.GetParameter();
    assert(wrap->refs_ == 0);
    wrap->handle_.Reset();
    delete wrap;
  }

#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION

  static void
  WeakCallback(v8::WeakCallbackData<v8::Object, ObjectWrap> const& data) {
    ObjectWrap* wrap = data.GetParameter();
    assert(wrap->refs_ == 0);
    assert(wrap->handle_.IsNearDeath());
    wrap->handle_.Reset();
    delete wrap;
  }

#else

  static void WeakCallback(v8::Persistent<v8::Value> value, void *data) {
    ObjectWrap *wrap = static_cast<ObjectWrap*>(data);
    assert(wrap->refs_ == 0);
    assert(wrap->handle_.IsNearDeath());
    wrap->handle_.Reset();
    delete wrap;
  }

#endif
  Persistent<v8::Object> handle_;
};


#endif  // NAN_OBJECT_WRAP_H_
/*********************************************************************
 * NAN - Native Abstractions for Node.js
 *
 * Copyright (c) 2018 NAN contributors
 *
 * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
 ********************************************************************/

#ifndef NAN_PERSISTENT_12_INL_H_
#define NAN_PERSISTENT_12_INL_H_

template<typename T, typename M> class Persistent :
    public v8::Persistent<T, M> {
 public:
  inline Persistent() : v8::Persistent<T, M>() {}

  template<typename S> inline Persistent(v8::Local<S> that) :
      v8::Persistent<T, M>(v8::Isolate::GetCurrent(), that) {}

  template<typename S, typename M2>
  inline
  Persistent(const v8::Persistent<S, M2> &that) :  // NOLINT(runtime/explicit)
      v8::Persistent<T, M2>(v8::Isolate::GetCurrent(), that) {}

  inline void Reset() { v8::PersistentBase<T>::Reset(); }

  template <typename S>
  inline void Reset(const v8::Local<S> &other) {
    v8::PersistentBase<T>::Reset(v8::Isolate::GetCurrent(), other);
  }

  template <typename S>
  inline void Reset(const v8::PersistentBase<S> &other) {
    v8::PersistentBase<T>::Reset(v8::Isolate::GetCurrent(), other);
  }

  template<typename P>
  inline void SetWeak(
    P *parameter
    , typename WeakCallbackInfo<P>::Callback callback
    , WeakCallbackType type);

 private:
  inline T *operator*() const { return *PersistentBase<T>::persistent; }

  template<typename S, typename M2>
  inline void Copy(const Persistent<S, M2> &that) {
    TYPE_CHECK(T, S);

    this->Reset();

    if (!that.IsEmpty()) {
      this->Reset(that);
      M::Copy(that, this);
    }
  }
};

#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
template<typename T>
class Global : public v8::Global<T> {
 public:
  inline Global() : v8::Global<T>() {}

  template<typename S> inline Global(v8::Local<S> that) :
    v8::Global<T>(v8::Isolate::GetCurrent(), that) {}

  template<typename S>
  inline
  Global(const v8::PersistentBase<S> &that) :  // NOLINT(runtime/explicit)
      v8::Global<S>(v8::Isolate::GetCurrent(), that) {}

  inline void Reset() { v8::PersistentBase<T>::Reset(); }

  template <typename S>
  inline void Reset(const v8::Local<S> &other) {
    v8::PersistentBase<T>::Reset(v8::Isolate::GetCurrent(), other);
  }

  template <typename S>
  inline void Reset(const v8::PersistentBase<S> &other) {
    v8::PersistentBase<T>::Reset(v8::Isolate::GetCurrent(), other);
  }

  template<typename P>
  inline void SetWeak(
    P *parameter
    , typename WeakCallbackInfo<P>::Callback callback
    , WeakCallbackType type) {
    reinterpret_cast<Persistent<T>*>(this)->SetWeak(
        parameter, callback, type);
  }
};
#else
template<typename T>
class Global : public v8::UniquePersistent<T> {
 public:
  inline Global() : v8::UniquePersistent<T>() {}

  template<typename S> inline Global(v8::Local<S> that) :
    v8::UniquePersistent<T>(v8::Isolate::GetCurrent(), that) {}

  template<typename S>
  inline
  Global(const v8::PersistentBase<S> &that) :  // NOLINT(runtime/explicit)
      v8::UniquePersistent<S>(v8::Isolate::GetCurrent(), that) {}

  inline void Reset() { v8::PersistentBase<T>::Reset(); }

  template <typename S>
  inline void Reset(const v8::Local<S> &other) {
    v8::PersistentBase<T>::Reset(v8::Isolate::GetCurrent(), other);
  }

  template <typename S>
  inline void Reset(const v8::PersistentBase<S> &other) {
    v8::PersistentBase<T>::Reset(v8::Isolate::GetCurrent(), other);
  }

  template<typename P>
  inline void SetWeak(
    P *parameter
    , typename WeakCallbackInfo<P>::Callback callback
    , WeakCallbackType type) {
    reinterpret_cast<Persistent<T>*>(this)->SetWeak(
        parameter, callback, type);
  }
};
#endif

#endif  // NAN_PERSISTENT_12_INL_H_
/*********************************************************************
 * NAN - Native Abstractions for Node.js
 *
 * Copyright (c) 2018 NAN contributors
 *
 * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
 ********************************************************************/

#ifndef NAN_PERSISTENT_PRE_12_INL_H_
#define NAN_PERSISTENT_PRE_12_INL_H_

template<typename T>
class PersistentBase {
  v8::Persistent<T> persistent;
  template<typename U>
  friend v8::Local<U> New(const PersistentBase<U> &p);
  template<typename U, typename M>
  friend v8::Local<U> New(const Persistent<U, M> &p);
  template<typename U>
  friend v8::Local<U> New(const Global<U> &p);
  template<typename S> friend class ReturnValue;

 public:
  inline PersistentBase() :
      persistent() {}

  inline void Reset() {
    persistent.Dispose();
    persistent.Clear();
  }

  template<typename S>
  inline void Reset(const v8::Local<S> &other) {
    TYPE_CHECK(T, S);

    if (!persistent.IsEmpty()) {
      persistent.Dispose();
    }

    if (other.IsEmpty()) {
      persistent.Clear();
    } else {
      persistent = v8::Persistent<T>::New(other);
    }
  }

  template<typename S>
  inline void Reset(const PersistentBase<S> &other) {
    TYPE_CHECK(T, S);

    if (!persistent.IsEmpty()) {
      persistent.Dispose();
    }

    if (other.IsEmpty()) {
      persistent.Clear();
    } else {
      persistent = v8::Persistent<T>::New(other.persistent);
    }
  }

  inline bool IsEmpty() const { return persistent.IsEmpty(); }

  inline void Empty() { persistent.Clear(); }

  template<typename S>
  inline bool operator==(const PersistentBase<S> &that) const {
    return this->persistent == that.persistent;
  }

  template<typename S>
  inline bool operator==(const v8::Local<S> &that) const {
    return this->persistent == that;
  }

  template<typename S>
  inline bool operator!=(const PersistentBase<S> &that) const {
    return !operator==(that);
  }

  template<typename S>
  inline bool operator!=(const v8::Local<S> &that) const {
    return !operator==(that);
  }

  template<typename P>
  inline void SetWeak(
    P *parameter
    , typename WeakCallbackInfo<P>::Callback callback
    , WeakCallbackType type);

  inline void ClearWeak() { persistent.ClearWeak(); }

  inline void MarkIndependent() { persistent.MarkIndependent(); }

  inline bool IsIndependent() const { return persistent.IsIndependent(); }

  inline bool IsNearDeath() const { return persistent.IsNearDeath(); }

  inline bool IsWeak() const { return persistent.IsWeak(); }

 private:
  inline explicit PersistentBase(v8::Persistent<T> that) :
      persistent(that) { }
  inline explicit PersistentBase(T *val) : persistent(val) {}
  template<typename S, typename M> friend class Persistent;
  template<typename S> friend class Global;
  friend class ObjectWrap;
};

template<typename T>
class NonCopyablePersistentTraits {
 public:
  typedef Persistent<T, NonCopyablePersistentTraits<T> >
      NonCopyablePersistent;
  static const bool kResetInDestructor = false;
  template<typename S, typename M>
  inline static void Copy(const Persistent<S, M> &source,
                             NonCopyablePersistent *dest) {
    Uncompilable<v8::Object>();
  }

  template<typename O> inline static void Uncompilable() {
    TYPE_CHECK(O, v8::Primitive);
  }
};

template<typename T>
struct CopyablePersistentTraits {
  typedef Persistent<T, CopyablePersistentTraits<T> > CopyablePersistent;
  static const bool kResetInDestructor = true;
  template<typename S, typename M>
  static inline void Copy(const Persistent<S, M> &source,
                             CopyablePersistent *dest) {}
};

template<typename T, typename M> class Persistent :
    public PersistentBase<T> {
 public:
  inline Persistent() {}

  template<typename S> inline Persistent(v8::Handle<S> that)
      : PersistentBase<T>(v8::Persistent<T>::New(that)) {
    TYPE_CHECK(T, S);
  }

  inline Persistent(const Persistent &that) : PersistentBase<T>() {
    Copy(that);
  }

  template<typename S, typename M2>
  inline Persistent(const Persistent<S, M2> &that) :
      PersistentBase<T>() {
    Copy(that);
  }

  inline Persistent &operator=(const Persistent &that) {
    Copy(that);
    return *this;
  }

  template <class S, class M2>
  inline Persistent &operator=(const Persistent<S, M2> &that) {
    Copy(that);
    return *this;
  }

  inline ~Persistent() {
    if (M::kResetInDestructor) this->Reset();
  }

 private:
  inline T *operator*() const { return *PersistentBase<T>::persistent; }

  template<typename S, typename M2>
  inline void Copy(const Persistent<S, M2> &that) {
    TYPE_CHECK(T, S);

    this->Reset();

    if (!that.IsEmpty()) {
      this->persistent = v8::Persistent<T>::New(that.persistent);
      M::Copy(that, this);
    }
  }
};

template<typename T>
class Global : public PersistentBase<T> {
  struct RValue {
    inline explicit RValue(Global* obj) : object(obj) {}
    Global* object;
  };

 public:
  inline Global() : PersistentBase<T>(0) { }

  template <typename S>
  inline Global(v8::Local<S> that)  // NOLINT(runtime/explicit)
      : PersistentBase<T>(v8::Persistent<T>::New(that)) {
    TYPE_CHECK(T, S);
  }

  template <typename S>
  inline Global(const PersistentBase<S> &that)  // NOLINT(runtime/explicit)
    : PersistentBase<T>(that) {
    TYPE_CHECK(T, S);
  }
  /**
   * Move constructor.
   */
  inline Global(RValue rvalue)  // NOLINT(runtime/explicit)
    : PersistentBase<T>(rvalue.object->persistent) {
    rvalue.object->Reset();
  }
  inline ~Global() { this->Reset(); }
  /**
   * Move via assignment.
   */
  template<typename S>
  inline Global &operator=(Global<S> rhs) {
    TYPE_CHECK(T, S);
    this->Reset(rhs.persistent);
    rhs.Reset();
    return *this;
  }
  /**
   * Cast operator for moves.
   */
  inline operator RValue() { return RValue(this); }
  /**
   * Pass allows returning uniques from functions, etc.
   */
  Global Pass() { return Global(RValue(this)); }

 private:
  Global(Global &);
  void operator=(Global &);
  template<typename S> friend class ReturnValue;
};

#endif  // NAN_PERSISTENT_PRE_12_INL_H_
/*********************************************************************
 * NAN - Native Abstractions for Node.js
 *
 * Copyright (c) 2018 NAN contributors
 *
 * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
 ********************************************************************/

#ifndef NAN_PRIVATE_H_
#define NAN_PRIVATE_H_

inline Maybe<bool>
HasPrivate(v8::Local<v8::Object> object, v8::Local<v8::String> key) {
  HandleScope scope;
#if NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::Local<v8::Context> context = isolate->GetCurrentContext();
  v8::Local<v8::Private> private_key = v8::Private::ForApi(isolate, key);
  return object->HasPrivate(context, private_key);
#else
  return Just(!object->GetHiddenValue(key).IsEmpty());
#endif
}

inline MaybeLocal<v8::Value>
GetPrivate(v8::Local<v8::Object> object, v8::Local<v8::String> key) {
#if NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::EscapableHandleScope scope(isolate);
  v8::Local<v8::Context> context = isolate->GetCurrentContext();
  v8::Local<v8::Private> private_key = v8::Private::ForApi(isolate, key);
  v8::MaybeLocal<v8::Value> v = object->GetPrivate(context, private_key);
  return scope.Escape(v.ToLocalChecked());
#else
  EscapableHandleScope scope;
  v8::Local<v8::Value> v = object->GetHiddenValue(key);
  if (v.IsEmpty()) {
    v = Undefined();
  }
  return scope.Escape(v);
#endif
}

inline Maybe<bool> SetPrivate(
    v8::Local<v8::Object> object,
    v8::Local<v8::String> key,
    v8::Local<v8::Value> value) {
#if NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION
  HandleScope scope;
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::Local<v8::Context> context = isolate->GetCurrentContext();
  v8::Local<v8::Private> private_key = v8::Private::ForApi(isolate, key);
  return object->SetPrivate(context, private_key, value);
#else
  return Just(object->SetHiddenValue(key, value));
#endif
}

inline Maybe<bool> DeletePrivate(
    v8::Local<v8::Object> object,
    v8::Local<v8::String> key) {
#if NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION
  HandleScope scope;
  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  v8::Local<v8::Private> private_key = v8::Private::ForApi(isolate, key);
  return object->DeletePrivate(isolate->GetCurrentContext(), private_key);
#else
  return Just(object->DeleteHiddenValue(key));
#endif
}

#endif  // NAN_PRIVATE_H_

/*********************************************************************
 * NAN - Native Abstractions for Node.js
 *
 * Copyright (c) 2021 NAN contributors
 *
 * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
 ********************************************************************/

#ifndef NAN_SCRIPTORIGIN_H_
#define NAN_SCRIPTORIGIN_H_

class ScriptOrigin : public v8::ScriptOrigin {
 public:
#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 9 ||                      \
  (V8_MAJOR_VERSION == 9 && (defined(V8_MINOR_VERSION) && (V8_MINOR_VERSION > 0\
      || (V8_MINOR_VERSION == 0 && defined(V8_BUILD_NUMBER)                    \
          && V8_BUILD_NUMBER >= 1)))))
  explicit ScriptOrigin(v8::Local<v8::Value> name) :
      v8::ScriptOrigin(v8::Isolate::GetCurrent(), name) {}

  ScriptOrigin(v8::Local<v8::Value> name
             , v8::Local<v8::Integer> line) :
      v8::ScriptOrigin(v8::Isolate::GetCurrent()
                   , name
                   , To<int32_t>(line).FromMaybe(0)) {}

  ScriptOrigin(v8::Local<v8::Value> name
             , v8::Local<v8::Integer> line
             , v8::Local<v8::Integer> column) :
      v8::ScriptOrigin(v8::Isolate::GetCurrent()
                   , name
                   , To<int32_t>(line).FromMaybe(0)
                   , To<int32_t>(column).FromMaybe(0)) {}
#elif defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 8 ||                    \
  (V8_MAJOR_VERSION == 8 && (defined(V8_MINOR_VERSION) && (V8_MINOR_VERSION > 9\
      || (V8_MINOR_VERSION == 9 && defined(V8_BUILD_NUMBER)                    \
          && V8_BUILD_NUMBER >= 45)))))
  explicit ScriptOrigin(v8::Local<v8::Value> name) : v8::ScriptOrigin(name) {}

  ScriptOrigin(v8::Local<v8::Value> name
             , v8::Local<v8::Integer> line) :
      v8::ScriptOrigin(name, To<int32_t>(line).FromMaybe(0)) {}

  ScriptOrigin(v8::Local<v8::Value> name
             , v8::Local<v8::Integer> line
             , v8::Local<v8::Integer> column) :
      v8::ScriptOrigin(name
                   , To<int32_t>(line).FromMaybe(0)
                   , To<int32_t>(column).FromMaybe(0)) {}
#else
  explicit ScriptOrigin(v8::Local<v8::Value> name) : v8::ScriptOrigin(name) {}

  ScriptOrigin(v8::Local<v8::Value> name
             , v8::Local<v8::Integer> line) : v8::ScriptOrigin(name, line) {}

  ScriptOrigin(v8::Local<v8::Value> name
             , v8::Local<v8::Integer> line
             , v8::Local<v8::Integer> column) :
      v8::ScriptOrigin(name, line, column) {}
#endif

#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 8 ||                      \
  (V8_MAJOR_VERSION == 8 && (defined(V8_MINOR_VERSION) && (V8_MINOR_VERSION > 9\
      || (V8_MINOR_VERSION == 9 && defined(V8_BUILD_NUMBER)                    \
          && V8_BUILD_NUMBER >= 45)))))
    v8::Local<v8::Integer> ResourceLineOffset() const {
      return New(LineOffset());
    }

    v8::Local<v8::Integer> ResourceColumnOffset() const {
      return New(ColumnOffset());
    }
#endif
};

#endif  // NAN_SCRIPTORIGIN_H_
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

#ifndef NAN_STRING_BYTES_H_
#define NAN_STRING_BYTES_H_

// Decodes a v8::Local<v8::String> or Buffer to a raw char*

namespace imp {

using v8::Local;
using v8::Object;
using v8::String;
using v8::Value;


//// Base 64 ////

#define base64_encoded_size(size) ((size + 2 - ((size + 2) % 3)) / 3 * 4)



//// HEX ////

static bool contains_non_ascii_slow(const char* buf, size_t len) {
  for (size_t i = 0; i < len; ++i) {
    if (buf[i] & 0x80) return true;
  }
  return false;
}


static bool contains_non_ascii(const char* src, size_t len) {
  if (len < 16) {
    return contains_non_ascii_slow(src, len);
  }

  const unsigned bytes_per_word = sizeof(void*);
  const unsigned align_mask = bytes_per_word - 1;
  const unsigned unaligned = reinterpret_cast<uintptr_t>(src) & align_mask;

  if (unaligned > 0) {
    const unsigned n = bytes_per_word - unaligned;
    if (contains_non_ascii_slow(src, n)) return true;
    src += n;
    len -= n;
  }


#if defined(__x86_64__) || defined(_WIN64)
  const uintptr_t mask = 0x8080808080808080ll;
#else
  const uintptr_t mask = 0x80808080l;
#endif

  const uintptr_t* srcw = reinterpret_cast<const uintptr_t*>(src);

  for (size_t i = 0, n = len / bytes_per_word; i < n; ++i) {
    if (srcw[i] & mask) return true;
  }

  const unsigned remainder = len & align_mask;
  if (remainder > 0) {
    const size_t offset = len - remainder;
    if (contains_non_ascii_slow(src + offset, remainder)) return true;
  }

  return false;
}


static void force_ascii_slow(const char* src, char* dst, size_t len) {
  for (size_t i = 0; i < len; ++i) {
    dst[i] = src[i] & 0x7f;
  }
}


static void force_ascii(const char* src, char* dst, size_t len) {
  if (len < 16) {
    force_ascii_slow(src, dst, len);
    return;
  }

  const unsigned bytes_per_word = sizeof(void*);
  const unsigned align_mask = bytes_per_word - 1;
  const unsigned src_unalign = reinterpret_cast<uintptr_t>(src) & align_mask;
  const unsigned dst_unalign = reinterpret_cast<uintptr_t>(dst) & align_mask;

  if (src_unalign > 0) {
    if (src_unalign == dst_unalign) {
      const unsigned unalign = bytes_per_word - src_unalign;
      force_ascii_slow(src, dst, unalign);
      src += unalign;
      dst += unalign;
      len -= src_unalign;
    } else {
      force_ascii_slow(src, dst, len);
      return;
    }
  }

#if defined(__x86_64__) || defined(_WIN64)
  const uintptr_t mask = ~0x8080808080808080ll;
#else
  const uintptr_t mask = ~0x80808080l;
#endif

  const uintptr_t* srcw = reinterpret_cast<const uintptr_t*>(src);
  uintptr_t* dstw = reinterpret_cast<uintptr_t*>(dst);

  for (size_t i = 0, n = len / bytes_per_word; i < n; ++i) {
    dstw[i] = srcw[i] & mask;
  }

  const unsigned remainder = len & align_mask;
  if (remainder > 0) {
    const size_t offset = len - remainder;
    force_ascii_slow(src + offset, dst + offset, remainder);
  }
}


static size_t base64_encode(const char* src,
                            size_t slen,
                            char* dst,
                            size_t dlen) {
  // We know how much we'll write, just make sure that there's space.
  assert(dlen >= base64_encoded_size(slen) &&
      "not enough space provided for base64 encode");

  dlen = base64_encoded_size(slen);

  unsigned a;
  unsigned b;
  unsigned c;
  unsigned i;
  unsigned k;
  unsigned n;

  static const char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                              "abcdefghijklmnopqrstuvwxyz"
                              "0123456789+/";

  i = 0;
  k = 0;
  n = slen / 3 * 3;

  while (i < n) {
    a = src[i + 0] & 0xff;
    b = src[i + 1] & 0xff;
    c = src[i + 2] & 0xff;

    dst[k + 0] = table[a >> 2];
    dst[k + 1] = table[((a & 3) << 4) | (b >> 4)];
    dst[k + 2] = table[((b & 0x0f) << 2) | (c >> 6)];
    dst[k + 3] = table[c & 0x3f];

    i += 3;
    k += 4;
  }

  if (n != slen) {
    switch (slen - n) {
      case 1:
        a = src[i + 0] & 0xff;
        dst[k + 0] = table[a >> 2];
        dst[k + 1] = table[(a & 3) << 4];
        dst[k + 2] = '=';
        dst[k + 3] = '=';
        break;

      case 2:
        a = src[i + 0] & 0xff;
        b = src[i + 1] & 0xff;
        dst[k + 0] = table[a >> 2];
        dst[k + 1] = table[((a & 3) << 4) | (b >> 4)];
        dst[k + 2] = table[(b & 0x0f) << 2];
        dst[k + 3] = '=';
        break;
    }
  }

  return dlen;
}


static size_t hex_encode(const char* src, size_t slen, char* dst, size_t dlen) {
  // We know how much we'll write, just make sure that there's space.
  assert(dlen >= slen * 2 &&
      "not enough space provided for hex encode");

  dlen = slen * 2;
  for (uint32_t i = 0, k = 0; k < dlen; i += 1, k += 2) {
    static const char hex[] = "0123456789abcdef";
    uint8_t val = static_cast<uint8_t>(src[i]);
    dst[k + 0] = hex[val >> 4];
    dst[k + 1] = hex[val & 15];
  }

  return dlen;
}



static Local<Value> Encode(const char* buf,
                           size_t buflen,
                           enum Encoding encoding) {
  assert(buflen <= node::Buffer::kMaxLength);
  if (!buflen && encoding != BUFFER)
    return New("").ToLocalChecked();

  Local<String> val;
  switch (encoding) {
    case BUFFER:
      return CopyBuffer(buf, buflen).ToLocalChecked();

    case ASCII:
      if (contains_non_ascii(buf, buflen)) {
        char* out = new char[buflen];
        force_ascii(buf, out, buflen);
        val = New<String>(out, buflen).ToLocalChecked();
        delete[] out;
      } else {
        val = New<String>(buf, buflen).ToLocalChecked();
      }
      break;

    case UTF8:
      val = New<String>(buf, buflen).ToLocalChecked();
      break;

    case BINARY: {
      // TODO(isaacs) use ExternalTwoByteString?
      const unsigned char *cbuf = reinterpret_cast<const unsigned char*>(buf);
      uint16_t * twobytebuf = new uint16_t[buflen];
      for (size_t i = 0; i < buflen; i++) {
        // XXX is the following line platform independent?
        twobytebuf[i] = cbuf[i];
      }
      val = New<String>(twobytebuf, buflen).ToLocalChecked();
      delete[] twobytebuf;
      break;
    }

    case BASE64: {
      size_t dlen = base64_encoded_size(buflen);
      char* dst = new char[dlen];

      size_t written = base64_encode(buf, buflen, dst, dlen);
      assert(written == dlen);

      val = New<String>(dst, dlen).ToLocalChecked();
      delete[] dst;
      break;
    }

    case UCS2: {
      const uint16_t* data = reinterpret_cast<const uint16_t*>(buf);
      val = New<String>(data, buflen / 2).ToLocalChecked();
      break;
    }

    case HEX: {
      size_t dlen = buflen * 2;
      char* dst = new char[dlen];
      size_t written = hex_encode(buf, buflen, dst, dlen);
      assert(written == dlen);

      val = New<String>(dst, dlen).ToLocalChecked();
      delete[] dst;
      break;
    }

    default:
      assert(0 && "unknown encoding");
      break;
  }

  return val;
}

#undef base64_encoded_size

}  // end of namespace imp

#endif  // NAN_STRING_BYTES_H_
/*********************************************************************
 * NAN - Native Abstractions for Node.js
 *
 * Copyright (c) 2018 NAN contributors
 *
 * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
 ********************************************************************/

#ifndef NAN_TYPEDARRAY_CONTENTS_H_
#define NAN_TYPEDARRAY_CONTENTS_H_

template<typename T>
class TypedArrayContents {
 public:
  inline explicit TypedArrayContents(v8::Local<v8::Value> from) :
      length_(0), data_(NULL) {
    HandleScope scope;

    size_t length = 0;
    void*  data = NULL;

#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))

    if (from->IsArrayBufferView()) {
      v8::Local<v8::ArrayBufferView> array =
        v8::Local<v8::ArrayBufferView>::Cast(from);

      const size_t    byte_length = array->ByteLength();
      const ptrdiff_t byte_offset = array->ByteOffset();
      v8::Local<v8::ArrayBuffer> buffer = array->Buffer();

      length = byte_length / sizeof(T);
// Actually it's 7.9 here but this would lead to ABI issues with Node.js 13
// using 7.8 till 13.2.0.
#if (V8_MAJOR_VERSION >= 8)
      data = static_cast<char*>(buffer->GetBackingStore()->Data()) + byte_offset;
#else
      data = static_cast<char*>(buffer->GetContents().Data()) + byte_offset;
#endif
    }

#else

    if (from->IsObject() && !from->IsNull()) {
      v8::Local<v8::Object> array = v8::Local<v8::Object>::Cast(from);

      MaybeLocal<v8::Value> buffer = Get(array,
        New<v8::String>("buffer").ToLocalChecked());
      MaybeLocal<v8::Value> byte_length = Get(array,
        New<v8::String>("byteLength").ToLocalChecked());
      MaybeLocal<v8::Value> byte_offset = Get(array,
        New<v8::String>("byteOffset").ToLocalChecked());

      if (!buffer.IsEmpty() &&
          !byte_length.IsEmpty() && byte_length.ToLocalChecked()->IsUint32() &&
          !byte_offset.IsEmpty() && byte_offset.ToLocalChecked()->IsUint32()) {
        data = array->GetIndexedPropertiesExternalArrayData();
        if(data) {
          length = byte_length.ToLocalChecked()->Uint32Value() / sizeof(T);
        }
      }
    }

#endif

#if defined(_MSC_VER) && _MSC_VER >= 1900 || __cplusplus >= 201103L
    assert(reinterpret_cast<uintptr_t>(data) % alignof (T) == 0);
#elif defined(_MSC_VER) && _MSC_VER >= 1600 || defined(__GNUC__)
    assert(reinterpret_cast<uintptr_t>(data) % __alignof(T) == 0);
#else
    assert(reinterpret_cast<uintptr_t>(data) % sizeof (T) == 0);
#endif

    length_ = length;
    data_   = static_cast<T*>(data);
  }

  inline size_t length() const      { return length_; }
  inline T* operator*()             { return data_;   }
  inline const T* operator*() const { return data_;   }

 private:
  NAN_DISALLOW_ASSIGN_COPY_MOVE(TypedArrayContents)

  //Disable heap allocation
  void *operator new(size_t size);
  void operator delete(void *, size_t) {
    abort();
  }

  size_t  length_;
  T*      data_;
};

#endif  // NAN_TYPEDARRAY_CONTENTS_H_
/*********************************************************************
 * NAN - Native Abstractions for Node.js
 *
 * Copyright (c) 2018 NAN contributors
 *
 * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
 ********************************************************************/

#ifndef NAN_WEAK_H_
#define NAN_WEAK_H_

static const int kInternalFieldsInWeakCallback = 2;
static const int kNoInternalFieldIndex = -1;

#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
# define NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ \
    v8::WeakCallbackInfo<WeakCallbackInfo<T> > const&
# define NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ \
    NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
# define NAN_WEAK_PARAMETER_CALLBACK_SIG_ NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
# define NAN_WEAK_TWOFIELD_CALLBACK_SIG_ NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_
#elif NODE_MODULE_VERSION > IOJS_1_1_MODULE_VERSION
# define NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ \
    v8::PhantomCallbackData<WeakCallbackInfo<T> > const&
# define NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ \
    NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
# define NAN_WEAK_PARAMETER_CALLBACK_SIG_ NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
# define NAN_WEAK_TWOFIELD_CALLBACK_SIG_ NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_
#elif NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION
# define NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ \
    v8::PhantomCallbackData<WeakCallbackInfo<T> > const&
# define NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ \
    v8::InternalFieldsCallbackData<WeakCallbackInfo<T>, void> const&
# define NAN_WEAK_PARAMETER_CALLBACK_SIG_ NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
# define NAN_WEAK_TWOFIELD_CALLBACK_SIG_ NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_
#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
# define NAN_WEAK_CALLBACK_DATA_TYPE_ \
    v8::WeakCallbackData<S, WeakCallbackInfo<T> > const&
# define NAN_WEAK_CALLBACK_SIG_ NAN_WEAK_CALLBACK_DATA_TYPE_
#else
# define NAN_WEAK_CALLBACK_DATA_TYPE_ void *
# define NAN_WEAK_CALLBACK_SIG_ \
    v8::Persistent<v8::Value>, NAN_WEAK_CALLBACK_DATA_TYPE_
#endif

template<typename T>
class WeakCallbackInfo {
 public:
  typedef void (*Callback)(const WeakCallbackInfo<T>& data);
  WeakCallbackInfo(
      Persistent<v8::Value> *persistent
    , Callback callback
    , void *parameter
    , void *field1 = 0
    , void *field2 = 0) :
        callback_(callback), isolate_(0), parameter_(parameter) {
    std::memcpy(&persistent_, persistent, sizeof (v8::Persistent<v8::Value>));
    internal_fields_[0] = field1;
    internal_fields_[1] = field2;
  }
  inline v8::Isolate *GetIsolate() const { return isolate_; }
  inline T *GetParameter() const { return static_cast<T*>(parameter_); }
  inline void *GetInternalField(int index) const {
    assert((index == 0 || index == 1) && "internal field index out of bounds");
    if (index == 0) {
      return internal_fields_[0];
    } else {
      return internal_fields_[1];
    }
  }

 private:
  NAN_DISALLOW_ASSIGN_COPY_MOVE(WeakCallbackInfo)
  Callback callback_;
  v8::Isolate *isolate_;
  void *parameter_;
  void *internal_fields_[kInternalFieldsInWeakCallback];
  v8::Persistent<v8::Value> persistent_;
  template<typename S, typename M> friend class Persistent;
  template<typename S> friend class PersistentBase;
#if NODE_MODULE_VERSION <= NODE_0_12_MODULE_VERSION
# if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
  template<typename S>
  static void invoke(NAN_WEAK_CALLBACK_SIG_ data);
  template<typename S>
  static WeakCallbackInfo *unwrap(NAN_WEAK_CALLBACK_DATA_TYPE_ data);
# else
  static void invoke(NAN_WEAK_CALLBACK_SIG_ data);
  static WeakCallbackInfo *unwrap(NAN_WEAK_CALLBACK_DATA_TYPE_ data);
# endif
#else
# if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                     \
  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
  template<bool isFirstPass>
  static void invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data);
  template<bool isFirstPass>
  static void invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data);
# else
  static void invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data);
  static void invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data);
# endif
  static WeakCallbackInfo *unwrapparameter(
      NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ data);
  static WeakCallbackInfo *unwraptwofield(
      NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ data);
#endif
};


#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))

template<typename T>
template<bool isFirstPass>
void
WeakCallbackInfo<T>::invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data) {
  WeakCallbackInfo<T> *cbinfo = unwrapparameter(data);
  if (isFirstPass) {
    cbinfo->persistent_.Reset();
    data.SetSecondPassCallback(invokeparameter<false>);
  } else {
    cbinfo->callback_(*cbinfo);
    delete cbinfo;
  }
}

template<typename T>
template<bool isFirstPass>
void
WeakCallbackInfo<T>::invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data) {
  WeakCallbackInfo<T> *cbinfo = unwraptwofield(data);
  if (isFirstPass) {
    cbinfo->persistent_.Reset();
    data.SetSecondPassCallback(invoketwofield<false>);
  } else {
    cbinfo->callback_(*cbinfo);
    delete cbinfo;
  }
}

template<typename T>
WeakCallbackInfo<T> *WeakCallbackInfo<T>::unwrapparameter(
    NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ data) {
  WeakCallbackInfo<T> *cbinfo =
      static_cast<WeakCallbackInfo<T>*>(data.GetParameter());
  cbinfo->isolate_ = data.GetIsolate();
  return cbinfo;
}

template<typename T>
WeakCallbackInfo<T> *WeakCallbackInfo<T>::unwraptwofield(
    NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ data) {
  WeakCallbackInfo<T> *cbinfo =
      static_cast<WeakCallbackInfo<T>*>(data.GetInternalField(0));
  cbinfo->isolate_ = data.GetIsolate();
  return cbinfo;
}

#undef NAN_WEAK_PARAMETER_CALLBACK_SIG_
#undef NAN_WEAK_TWOFIELD_CALLBACK_SIG_
#undef NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
#undef NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_
# elif NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION

template<typename T>
void
WeakCallbackInfo<T>::invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data) {
  WeakCallbackInfo<T> *cbinfo = unwrapparameter(data);
  cbinfo->persistent_.Reset();
  cbinfo->callback_(*cbinfo);
  delete cbinfo;
}

template<typename T>
void
WeakCallbackInfo<T>::invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data) {
  WeakCallbackInfo<T> *cbinfo = unwraptwofield(data);
  cbinfo->persistent_.Reset();
  cbinfo->callback_(*cbinfo);
  delete cbinfo;
}

template<typename T>
WeakCallbackInfo<T> *WeakCallbackInfo<T>::unwrapparameter(
    NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ data) {
  WeakCallbackInfo<T> *cbinfo =
       static_cast<WeakCallbackInfo<T>*>(data.GetParameter());
  cbinfo->isolate_ = data.GetIsolate();
  return cbinfo;
}

template<typename T>
WeakCallbackInfo<T> *WeakCallbackInfo<T>::unwraptwofield(
    NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ data) {
  WeakCallbackInfo<T> *cbinfo =
       static_cast<WeakCallbackInfo<T>*>(data.GetInternalField1());
  cbinfo->isolate_ = data.GetIsolate();
  return cbinfo;
}

#undef NAN_WEAK_PARAMETER_CALLBACK_SIG_
#undef NAN_WEAK_TWOFIELD_CALLBACK_SIG_
#undef NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
#undef NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_
#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION

template<typename T>
template<typename S>
void WeakCallbackInfo<T>::invoke(NAN_WEAK_CALLBACK_SIG_ data) {
  WeakCallbackInfo<T> *cbinfo = unwrap(data);
  cbinfo->persistent_.Reset();
  cbinfo->callback_(*cbinfo);
  delete cbinfo;
}

template<typename T>
template<typename S>
WeakCallbackInfo<T> *WeakCallbackInfo<T>::unwrap(
    NAN_WEAK_CALLBACK_DATA_TYPE_ data) {
  void *parameter = data.GetParameter();
  WeakCallbackInfo<T> *cbinfo =
      static_cast<WeakCallbackInfo<T>*>(parameter);
  cbinfo->isolate_ = data.GetIsolate();
  return cbinfo;
}

#undef NAN_WEAK_CALLBACK_SIG_
#undef NAN_WEAK_CALLBACK_DATA_TYPE_
#else

template<typename T>
void WeakCallbackInfo<T>::invoke(NAN_WEAK_CALLBACK_SIG_ data) {
  WeakCallbackInfo<T> *cbinfo = unwrap(data);
  cbinfo->persistent_.Dispose();
  cbinfo->persistent_.Clear();
  cbinfo->callback_(*cbinfo);
  delete cbinfo;
}

template<typename T>
WeakCallbackInfo<T> *WeakCallbackInfo<T>::unwrap(
    NAN_WEAK_CALLBACK_DATA_TYPE_ data) {
  WeakCallbackInfo<T> *cbinfo =
      static_cast<WeakCallbackInfo<T>*>(data);
  cbinfo->isolate_ = v8::Isolate::GetCurrent();
  return cbinfo;
}

#undef NAN_WEAK_CALLBACK_SIG_
#undef NAN_WEAK_CALLBACK_DATA_TYPE_
#endif

#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
template<typename T, typename M>
template<typename P>
inline void Persistent<T, M>::SetWeak(
    P *parameter
  , typename WeakCallbackInfo<P>::Callback callback
  , WeakCallbackType type) {
  WeakCallbackInfo<P> *wcbd;
  if (type == WeakCallbackType::kParameter) {
    wcbd = new WeakCallbackInfo<P>(
        reinterpret_cast<Persistent<v8::Value>*>(this)
      , callback
      , parameter);
    v8::PersistentBase<T>::SetWeak(
        wcbd
      , WeakCallbackInfo<P>::template invokeparameter<true>
      , type);
  } else {
    v8::Local<v8::Value>* self_v(reinterpret_cast<v8::Local<v8::Value>*>(this));
    assert((*self_v)->IsObject());
    v8::Local<v8::Object> self((*self_v).As<v8::Object>());
    int count = self->InternalFieldCount();
    void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0};
    for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) {
      internal_fields[i] = self->GetAlignedPointerFromInternalField(i);
    }
    wcbd = new WeakCallbackInfo<P>(
        reinterpret_cast<Persistent<v8::Value>*>(this)
      , callback
      , 0
      , internal_fields[0]
      , internal_fields[1]);
    self->SetAlignedPointerInInternalField(0, wcbd);
    v8::PersistentBase<T>::SetWeak(
        static_cast<WeakCallbackInfo<P>*>(0)
      , WeakCallbackInfo<P>::template invoketwofield<true>
      , type);
  }
}
#elif NODE_MODULE_VERSION > IOJS_1_1_MODULE_VERSION
template<typename T, typename M>
template<typename P>
inline void Persistent<T, M>::SetWeak(
    P *parameter
  , typename WeakCallbackInfo<P>::Callback callback
  , WeakCallbackType type) {
  WeakCallbackInfo<P> *wcbd;
  if (type == WeakCallbackType::kParameter) {
    wcbd = new WeakCallbackInfo<P>(
        reinterpret_cast<Persistent<v8::Value>*>(this)
      , callback
      , parameter);
    v8::PersistentBase<T>::SetPhantom(
        wcbd
      , WeakCallbackInfo<P>::invokeparameter);
  } else {
    v8::Local<v8::Value>* self_v(reinterpret_cast<v8::Local<v8::Value>*>(this));
    assert((*self_v)->IsObject());
    v8::Local<v8::Object> self((*self_v).As<v8::Object>());
    int count = self->InternalFieldCount();
    void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0};
    for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) {
      internal_fields[i] = self->GetAlignedPointerFromInternalField(i);
    }
    wcbd = new WeakCallbackInfo<P>(
        reinterpret_cast<Persistent<v8::Value>*>(this)
      , callback
      , 0
      , internal_fields[0]
      , internal_fields[1]);
    self->SetAlignedPointerInInternalField(0, wcbd);
    v8::PersistentBase<T>::SetPhantom(
        static_cast<WeakCallbackInfo<P>*>(0)
      , WeakCallbackInfo<P>::invoketwofield
      , 0
      , count > 1 ? 1 : kNoInternalFieldIndex);
  }
}
#elif NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION
template<typename T, typename M>
template<typename P>
inline void Persistent<T, M>::SetWeak(
    P *parameter
  , typename WeakCallbackInfo<P>::Callback callback
  , WeakCallbackType type) {
  WeakCallbackInfo<P> *wcbd;
  if (type == WeakCallbackType::kParameter) {
    wcbd = new WeakCallbackInfo<P>(
        reinterpret_cast<Persistent<v8::Value>*>(this)
      , callback
      , parameter);
    v8::PersistentBase<T>::SetPhantom(
        wcbd
      , WeakCallbackInfo<P>::invokeparameter);
  } else {
    v8::Local<v8::Value>* self_v(reinterpret_cast<v8::Local<v8::Value>*>(this));
    assert((*self_v)->IsObject());
    v8::Local<v8::Object> self((*self_v).As<v8::Object>());
    int count = self->InternalFieldCount();
    void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0};
    for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) {
      internal_fields[i] = self->GetAlignedPointerFromInternalField(i);
    }
    wcbd = new WeakCallbackInfo<P>(
        reinterpret_cast<Persistent<v8::Value>*>(this)
      , callback
      , 0
      , internal_fields[0]
      , internal_fields[1]);
    self->SetAlignedPointerInInternalField(0, wcbd);
    v8::PersistentBase<T>::SetPhantom(
        WeakCallbackInfo<P>::invoketwofield
      , 0
      , count > 1 ? 1 : kNoInternalFieldIndex);
  }
}
#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
template<typename T, typename M>
template<typename P>
inline void Persistent<T, M>::SetWeak(
    P *parameter
  , typename WeakCallbackInfo<P>::Callback callback
  , WeakCallbackType type) {
  WeakCallbackInfo<P> *wcbd;
  if (type == WeakCallbackType::kParameter) {
    wcbd = new WeakCallbackInfo<P>(
        reinterpret_cast<Persistent<v8::Value>*>(this)
      , callback
      , parameter);
    v8::PersistentBase<T>::SetWeak(wcbd, WeakCallbackInfo<P>::invoke);
  } else {
    v8::Local<v8::Value>* self_v(reinterpret_cast<v8::Local<v8::Value>*>(this));
    assert((*self_v)->IsObject());
    v8::Local<v8::Object> self((*self_v).As<v8::Object>());
    int count = self->InternalFieldCount();
    void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0};
    for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) {
      internal_fields[i] = self->GetAlignedPointerFromInternalField(i);
    }
    wcbd = new WeakCallbackInfo<P>(
        reinterpret_cast<Persistent<v8::Value>*>(this)
      , callback
      , 0
      , internal_fields[0]
      , internal_fields[1]);
    v8::PersistentBase<T>::SetWeak(wcbd, WeakCallbackInfo<P>::invoke);
  }
}
#else
template<typename T>
template<typename P>
inline void PersistentBase<T>::SetWeak(
    P *parameter
  , typename WeakCallbackInfo<P>::Callback callback
  , WeakCallbackType type) {
  WeakCallbackInfo<P> *wcbd;
  if (type == WeakCallbackType::kParameter) {
    wcbd = new WeakCallbackInfo<P>(
        reinterpret_cast<Persistent<v8::Value>*>(this)
      , callback
      , parameter);
    persistent.MakeWeak(wcbd, WeakCallbackInfo<P>::invoke);
  } else {
    v8::Local<v8::Value>* self_v(reinterpret_cast<v8::Local<v8::Value>*>(this));
    assert((*self_v)->IsObject());
    v8::Local<v8::Object> self((*self_v).As<v8::Object>());
    int count = self->InternalFieldCount();
    void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0};
    for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) {
      internal_fields[i] = self->GetPointerFromInternalField(i);
    }
    wcbd = new WeakCallbackInfo<P>(
        reinterpret_cast<Persistent<v8::Value>*>(this)
      , callback
      , 0
      , internal_fields[0]
      , internal_fields[1]);
    persistent.MakeWeak(wcbd, WeakCallbackInfo<P>::invoke);
  }
}
#endif

#endif  // NAN_WEAK_H_
{
  "name": "nan",
  "version": "2.16.0",
  "description": "Native Abstractions for Node.js: C++ header for Node 0.8 -> 14 compatibility",
  "main": "include_dirs.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/nodejs/nan.git"
  },
  "devDependencies": {
    "bindings": "~1.2.1",
    "commander": "^2.8.1",
    "glob": "^5.0.14",
    "request": "=2.81.0",
    "node-gyp": "~8.4.1",
    "readable-stream": "^2.1.4",
    "tap": "~0.7.1",
    "xtend": "~4.0.0"
  },
  "license": "MIT"
}#!/usr/bin/env node
/*********************************************************************
 * NAN - Native Abstractions for Node.js
 *
 * Copyright (c) 2018 NAN contributors
 *
 * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
 ********************************************************************/

var commander = require('commander'),
    fs = require('fs'),
    glob = require('glob'),
    groups = [],
    total = 0,
    warning1 = '/* ERROR: Rewrite using Buffer */\n',
    warning2 = '\\/\\* ERROR\\: Rewrite using Buffer \\*\\/\\n',
    length,
    i;

fs.readFile(__dirname + '/package.json', 'utf8', function (err, data) {
  if (err) {
    throw err;
  }

  commander
      .version(JSON.parse(data).version)
      .usage('[options] <file ...>')
      .parse(process.argv);

  if (!process.argv.slice(2).length) {
    commander.outputHelp();
  }
});

/* construct strings representing regular expressions
   each expression contains a unique group allowing for identification of the match
   the index of this key group, relative to the regular expression in question,
    is indicated by the first array member */

/* simple substistutions, key group is the entire match, 0 */
groups.push([0, [
  '_NAN_',
  'NODE_SET_METHOD',
  'NODE_SET_PROTOTYPE_METHOD',
  'NanAsciiString',
  'NanEscapeScope',
  'NanReturnValue',
  'NanUcs2String'].join('|')]);

/* substitutions of parameterless macros, key group is 1 */
groups.push([1, ['(', [
  'NanEscapableScope',
  'NanReturnNull',
  'NanReturnUndefined',
  'NanScope'].join('|'), ')\\(\\)'].join('')]);

/* replace TryCatch with NanTryCatch once, gobbling possible namespace, key group 2 */
groups.push([2, '(?:(?:v8\\:\\:)?|(Nan)?)(TryCatch)']);

/* NanNew("string") will likely not fail a ToLocalChecked(), key group 1 */ 
groups.push([1, ['(NanNew)', '(\\("[^\\"]*"[^\\)]*\\))(?!\\.ToLocalChecked\\(\\))'].join('')]);

/* Removed v8 APIs, warn that the code needs rewriting using node::Buffer, key group 2 */
groups.push([2, ['(', warning2, ')?', '^.*?(', [
      'GetIndexedPropertiesExternalArrayDataLength',
      'GetIndexedPropertiesExternalArrayData',
      'GetIndexedPropertiesExternalArrayDataType',
      'GetIndexedPropertiesPixelData',
      'GetIndexedPropertiesPixelDataLength',
      'HasIndexedPropertiesInExternalArrayData',
      'HasIndexedPropertiesInPixelData',
      'SetIndexedPropertiesToExternalArrayData',
      'SetIndexedPropertiesToPixelData'].join('|'), ')'].join('')]);

/* No need for NanScope in V8-exposed methods, key group 2 */
groups.push([2, ['((', [
      'NAN_METHOD',
      'NAN_GETTER',
      'NAN_SETTER',
      'NAN_PROPERTY_GETTER',
      'NAN_PROPERTY_SETTER',
      'NAN_PROPERTY_ENUMERATOR',
      'NAN_PROPERTY_DELETER',
      'NAN_PROPERTY_QUERY',
      'NAN_INDEX_GETTER',
      'NAN_INDEX_SETTER',
      'NAN_INDEX_ENUMERATOR',
      'NAN_INDEX_DELETER',
      'NAN_INDEX_QUERY'].join('|'), ')\\([^\\)]*\\)\\s*\\{)\\s*NanScope\\(\\)\\s*;'].join('')]);

/* v8::Value::ToXXXXXXX returns v8::MaybeLocal<T>, key group 3 */
groups.push([3, ['([\\s\\(\\)])([^\\s\\(\\)]+)->(', [
      'Boolean',
      'Number',
      'String',
      'Object',
      'Integer',
      'Uint32',
      'Int32'].join('|'), ')\\('].join('')]);

/* v8::Value::XXXXXXXValue returns v8::Maybe<T>, key group 3 */
groups.push([3, ['([\\s\\(\\)])([^\\s\\(\\)]+)->((?:', [
      'Boolean',
      'Number',
      'Integer',
      'Uint32',
      'Int32'].join('|'), ')Value)\\('].join('')]);

/* NAN_WEAK_CALLBACK macro was removed, write out callback definition, key group 1 */
groups.push([1, '(NAN_WEAK_CALLBACK)\\(([^\\s\\)]+)\\)']);

/* node::ObjectWrap and v8::Persistent have been replaced with Nan implementations, key group 1 */
groups.push([1, ['(', [
  'NanDisposePersistent',
  'NanObjectWrapHandle'].join('|'), ')\\s*\\(\\s*([^\\s\\)]+)'].join('')]);

/* Since NanPersistent there is no need for NanMakeWeakPersistent, key group 1 */
groups.push([1, '(NanMakeWeakPersistent)\\s*\\(\\s*([^\\s,]+)\\s*,\\s*']);

/* Many methods of v8::Object and others now return v8::MaybeLocal<T>, key group 3 */
groups.push([3, ['([\\s])([^\\s]+)->(', [
  'GetEndColumn',
  'GetFunction',
  'GetLineNumber',
  'NewInstance',
  'GetPropertyNames',
  'GetOwnPropertyNames',
  'GetSourceLine',
  'GetStartColumn',
  'ObjectProtoToString',
  'ToArrayIndex',
  'ToDetailString',
  'CallAsConstructor',
  'CallAsFunction',
  'CloneElementAt',
  'Delete',
  'ForceSet',
  'Get',
  'GetPropertyAttributes',
  'GetRealNamedProperty',
  'GetRealNamedPropertyInPrototypeChain',
  'Has',
  'HasOwnProperty',
  'HasRealIndexedProperty',
  'HasRealNamedCallbackProperty',
  'HasRealNamedProperty',
  'Set',
  'SetAccessor',
  'SetIndexedPropertyHandler',
  'SetNamedPropertyHandler',
  'SetPrototype'].join('|'), ')\\('].join('')]);

/* You should get an error if any of these fail anyways,
   or handle the error better, it is indicated either way, key group 2 */
groups.push([2, ['NanNew(<(?:v8\\:\\:)?(', ['Date', 'String', 'RegExp'].join('|'), ')>)(\\([^\\)]*\\))(?!\\.ToLocalChecked\\(\\))'].join('')]);

/* v8::Value::Equals now returns a v8::Maybe, key group 3 */
groups.push([3, '([\\s\\(\\)])([^\\s\\(\\)]+)->(Equals)\\(([^\\s\\)]+)']);

/* NanPersistent makes this unnecessary, key group 1 */
groups.push([1, '(NanAssignPersistent)(?:<v8\\:\\:[^>]+>)?\\(([^,]+),\\s*']);

/* args has been renamed to info, key group 2 */
groups.push([2, '(\\W)(args)(\\W)'])

/* node::ObjectWrap was replaced with NanObjectWrap, key group 2 */
groups.push([2, '(\\W)(?:node\\:\\:)?(ObjectWrap)(\\W)']);

/* v8::Persistent was replaced with NanPersistent, key group 2 */
groups.push([2, '(\\W)(?:v8\\:\\:)?(Persistent)(\\W)']);

/* counts the number of capturing groups in a well-formed regular expression,
   ignoring non-capturing groups and escaped parentheses */
function groupcount(s) {
  var positive = s.match(/\((?!\?)/g),
      negative = s.match(/\\\(/g);
  return (positive ? positive.length : 0) - (negative ? negative.length : 0);
}

/* compute the absolute position of each key group in the joined master RegExp */
for (i = 1, length = groups.length; i < length; i++) {
	total += groupcount(groups[i - 1][1]);
	groups[i][0] += total;
}

/* create the master RegExp, whis is the union of all the groups' expressions */
master = new RegExp(groups.map(function (a) { return a[1]; }).join('|'), 'gm');

/* replacement function for String.replace, receives 21 arguments */
function replace() {
	/* simple expressions */
      switch (arguments[groups[0][0]]) {
        case '_NAN_':
          return 'NAN_';
        case 'NODE_SET_METHOD':
          return 'NanSetMethod';
        case 'NODE_SET_PROTOTYPE_METHOD':
          return 'NanSetPrototypeMethod';
        case 'NanAsciiString':
          return 'NanUtf8String';
        case 'NanEscapeScope':
          return 'scope.Escape';
        case 'NanReturnNull':
          return 'info.GetReturnValue().SetNull';
        case 'NanReturnValue':
          return 'info.GetReturnValue().Set';
        case 'NanUcs2String':
          return 'v8::String::Value';
        default:
      }

      /* macros without arguments */
      switch (arguments[groups[1][0]]) {
        case 'NanEscapableScope':
          return 'NanEscapableScope scope'
        case 'NanReturnUndefined':
          return 'return';
        case 'NanScope':
          return 'NanScope scope';
        default:
      }

      /* TryCatch, emulate negative backref */
      if (arguments[groups[2][0]] === 'TryCatch') {
        return arguments[groups[2][0] - 1] ? arguments[0] : 'NanTryCatch';
      }

      /* NanNew("foo") --> NanNew("foo").ToLocalChecked() */
      if (arguments[groups[3][0]] === 'NanNew') {
        return [arguments[0], '.ToLocalChecked()'].join('');
      }

      /* insert warning for removed functions as comment on new line above */
      switch (arguments[groups[4][0]]) {
        case 'GetIndexedPropertiesExternalArrayData':
        case 'GetIndexedPropertiesExternalArrayDataLength':
        case 'GetIndexedPropertiesExternalArrayDataType':
        case 'GetIndexedPropertiesPixelData':
        case 'GetIndexedPropertiesPixelDataLength':
        case 'HasIndexedPropertiesInExternalArrayData':
        case 'HasIndexedPropertiesInPixelData':
        case 'SetIndexedPropertiesToExternalArrayData':
        case 'SetIndexedPropertiesToPixelData':
          return arguments[groups[4][0] - 1] ? arguments[0] : [warning1, arguments[0]].join('');
        default:
      }

     /* remove unnecessary NanScope() */
      switch (arguments[groups[5][0]]) {
        case 'NAN_GETTER':
        case 'NAN_METHOD':
        case 'NAN_SETTER':
        case 'NAN_INDEX_DELETER':
        case 'NAN_INDEX_ENUMERATOR':
        case 'NAN_INDEX_GETTER':
        case 'NAN_INDEX_QUERY':
        case 'NAN_INDEX_SETTER':
        case 'NAN_PROPERTY_DELETER':
        case 'NAN_PROPERTY_ENUMERATOR':
        case 'NAN_PROPERTY_GETTER':
        case 'NAN_PROPERTY_QUERY':
        case 'NAN_PROPERTY_SETTER':
          return arguments[groups[5][0] - 1];
        default:
      }

      /* Value conversion */
      switch (arguments[groups[6][0]]) {
        case 'Boolean':
        case 'Int32':
        case 'Integer':
        case 'Number':
        case 'Object':
        case 'String':
        case 'Uint32':
          return [arguments[groups[6][0] - 2], 'NanTo<v8::', arguments[groups[6][0]], '>(',  arguments[groups[6][0] - 1]].join('');
        default:
      }

      /* other value conversion */
      switch (arguments[groups[7][0]]) {
        case 'BooleanValue':
          return [arguments[groups[7][0] - 2], 'NanTo<bool>(', arguments[groups[7][0] - 1]].join('');
        case 'Int32Value':
          return [arguments[groups[7][0] - 2], 'NanTo<int32_t>(', arguments[groups[7][0] - 1]].join('');
        case 'IntegerValue':
          return [arguments[groups[7][0] - 2], 'NanTo<int64_t>(', arguments[groups[7][0] - 1]].join('');
        case 'Uint32Value':
          return [arguments[groups[7][0] - 2], 'NanTo<uint32_t>(', arguments[groups[7][0] - 1]].join('');
        default:
      }

      /* NAN_WEAK_CALLBACK */
      if (arguments[groups[8][0]] === 'NAN_WEAK_CALLBACK') {
        return ['template<typename T>\nvoid ',
          arguments[groups[8][0] + 1], '(const NanWeakCallbackInfo<T> &data)'].join('');
      }

      /* use methods on NAN classes instead */
      switch (arguments[groups[9][0]]) {
        case 'NanDisposePersistent':
          return [arguments[groups[9][0] + 1], '.Reset('].join('');
        case 'NanObjectWrapHandle':
          return [arguments[groups[9][0] + 1], '->handle('].join('');
        default:
      }

      /* use method on NanPersistent instead */
      if (arguments[groups[10][0]] === 'NanMakeWeakPersistent') {
        return arguments[groups[10][0] + 1] + '.SetWeak(';
      }

      /* These return Maybes, the upper ones take no arguments */
      switch (arguments[groups[11][0]]) {
        case 'GetEndColumn':
        case 'GetFunction':
        case 'GetLineNumber':
        case 'GetOwnPropertyNames':
        case 'GetPropertyNames':
        case 'GetSourceLine':
        case 'GetStartColumn':
        case 'NewInstance':
        case 'ObjectProtoToString':
        case 'ToArrayIndex':
        case 'ToDetailString':
          return [arguments[groups[11][0] - 2], 'Nan', arguments[groups[11][0]], '(', arguments[groups[11][0] - 1]].join('');
        case 'CallAsConstructor':
        case 'CallAsFunction':
        case 'CloneElementAt':
        case 'Delete':
        case 'ForceSet':
        case 'Get':
        case 'GetPropertyAttributes':
        case 'GetRealNamedProperty':
        case 'GetRealNamedPropertyInPrototypeChain':
        case 'Has':
        case 'HasOwnProperty':
        case 'HasRealIndexedProperty':
        case 'HasRealNamedCallbackProperty':
        case 'HasRealNamedProperty':
        case 'Set':
        case 'SetAccessor':
        case 'SetIndexedPropertyHandler':
        case 'SetNamedPropertyHandler':
        case 'SetPrototype':
          return [arguments[groups[11][0] - 2], 'Nan', arguments[groups[11][0]], '(', arguments[groups[11][0] - 1], ', '].join('');
        default:
      }

      /* Automatic ToLocalChecked(), take it or leave it */
      switch (arguments[groups[12][0]]) {
        case 'Date':
        case 'String':
        case 'RegExp':
          return ['NanNew', arguments[groups[12][0] - 1], arguments[groups[12][0] + 1], '.ToLocalChecked()'].join('');
        default:
      }

      /* NanEquals is now required for uniformity */
      if (arguments[groups[13][0]] === 'Equals') {
        return [arguments[groups[13][0] - 1], 'NanEquals(', arguments[groups[13][0] - 1], ', ', arguments[groups[13][0] + 1]].join('');
      }

      /* use method on replacement class instead */
      if (arguments[groups[14][0]] === 'NanAssignPersistent') {
        return [arguments[groups[14][0] + 1], '.Reset('].join('');
      }

      /* args --> info */
      if (arguments[groups[15][0]] === 'args') {
        return [arguments[groups[15][0] - 1], 'info', arguments[groups[15][0] + 1]].join('');
      }

      /* ObjectWrap --> NanObjectWrap */
      if (arguments[groups[16][0]] === 'ObjectWrap') {
        return [arguments[groups[16][0] - 1], 'NanObjectWrap', arguments[groups[16][0] + 1]].join('');
      }

      /* Persistent --> NanPersistent */
      if (arguments[groups[17][0]] === 'Persistent') {
        return [arguments[groups[17][0] - 1], 'NanPersistent', arguments[groups[17][0] + 1]].join('');
      }

      /* This should not happen. A switch is probably missing a case if it does. */
      throw 'Unhandled match: ' + arguments[0];
}

/* reads a file, runs replacement and writes it back */
function processFile(file) {
  fs.readFile(file, {encoding: 'utf8'}, function (err, data) {
    if (err) {
      throw err;
    }

    /* run replacement twice, might need more runs */
    fs.writeFile(file, data.replace(master, replace).replace(master, replace), function (err) {
      if (err) {
        throw err;
      }
    });
  });
}

/* process file names from command line and process the identified files */
for (i = 2, length = process.argv.length; i < length; i++) {
  glob(process.argv[i], function (err, matches) {
    if (err) {
      throw err;
    }
    matches.forEach(processFile);
  });
}
1to2 naively converts source code files from NAN 1 to NAN 2. There will be erroneous conversions,
false positives and missed opportunities. The input files are rewritten in place. Make sure that
you have backups. You will have to manually review the changes afterwards and do some touchups.

```sh
$ tools/1to2.js

  Usage: 1to2 [options] <file ...>

  Options:

    -h, --help     output usage information
    -V, --version  output the version number
```
{
  "name": "1to2",
  "version": "1.0.0",
  "description": "NAN 1 -> 2 Migration Script",
  "main": "1to2.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/nodejs/nan.git"
  },
  "dependencies": {
    "glob": "~5.0.10",
    "commander": "~2.8.1"
  },
  "license": "MIT"
}## Asynchronous work helpers

`Nan::AsyncWorker`, `Nan::AsyncProgressWorker` and `Nan::AsyncProgressQueueWorker` are helper classes that make working with asynchronous code easier.

 - <a href="#api_nan_async_worker"><b><code>Nan::AsyncWorker</code></b></a>
 - <a href="#api_nan_async_progress_worker"><b><code>Nan::AsyncProgressWorkerBase &amp; Nan::AsyncProgressWorker</code></b></a>
 - <a href="#api_nan_async_progress_queue_worker"><b><code>Nan::AsyncProgressQueueWorker</code></b></a>
 - <a href="#api_nan_async_queue_worker"><b><code>Nan::AsyncQueueWorker</code></b></a>

<a name="api_nan_async_worker"></a>
### Nan::AsyncWorker

`Nan::AsyncWorker` is an _abstract_ class that you can subclass to have much of the annoying asynchronous queuing and handling taken care of for you. It can even store arbitrary V8 objects for you and have them persist while the asynchronous work is in progress.

This class internally handles the details of creating an [`AsyncResource`][AsyncResource], and running the callback in the
correct async context. To be able to identify the async resources created by this class in async-hooks, provide a
`resource_name` to the constructor. It is recommended that the module name be used as a prefix to the `resource_name` to avoid
collisions in the names. For more details see [`AsyncResource`][AsyncResource] documentation.  The `resource_name` needs to stay valid for the lifetime of the worker instance.

Definition:

```c++
class AsyncWorker {
 public:
  explicit AsyncWorker(Callback *callback_, const char* resource_name = "nan:AsyncWorker");

  virtual ~AsyncWorker();

  virtual void WorkComplete();

  void SaveToPersistent(const char *key, const v8::Local<v8::Value> &value);

  void SaveToPersistent(const v8::Local<v8::String> &key,
                        const v8::Local<v8::Value> &value);

  void SaveToPersistent(uint32_t index,
                        const v8::Local<v8::Value> &value);

  v8::Local<v8::Value> GetFromPersistent(const char *key) const;

  v8::Local<v8::Value> GetFromPersistent(const v8::Local<v8::String> &key) const;

  v8::Local<v8::Value> GetFromPersistent(uint32_t index) const;

  virtual void Execute() = 0;

  uv_work_t request;

  virtual void Destroy();

 protected:
  Persistent<v8::Object> persistentHandle;

  Callback *callback;

  virtual void HandleOKCallback();

  virtual void HandleErrorCallback();

  void SetErrorMessage(const char *msg);

  const char* ErrorMessage();
};
```

<a name="api_nan_async_progress_worker"></a>
### Nan::AsyncProgressWorkerBase &amp; Nan::AsyncProgressWorker

`Nan::AsyncProgressWorkerBase` is an _abstract_ class template that extends `Nan::AsyncWorker` and adds additional progress reporting callbacks that can be used during the asynchronous work execution to provide progress data back to JavaScript.

Previously the definition of `Nan::AsyncProgressWorker` only allowed sending `const char` data. Now extending `Nan::AsyncProgressWorker` will yield an instance of the implicit `Nan::AsyncProgressWorkerBase` template with type `<char>` for compatibility.

`Nan::AsyncProgressWorkerBase` &amp; `Nan::AsyncProgressWorker` is intended for best-effort delivery of nonessential progress messages, e.g. a progress bar.  The last event sent before the main thread is woken will be delivered.

Definition:

```c++
template<class T>
class AsyncProgressWorkerBase<T> : public AsyncWorker {
 public:
  explicit AsyncProgressWorkerBase(Callback *callback_, const char* resource_name = ...);

  virtual ~AsyncProgressWorkerBase();

  void WorkProgress();

  class ExecutionProgress {
   public:
    void Signal() const;
    void Send(const T* data, size_t count) const;
  };

  virtual void Execute(const ExecutionProgress& progress) = 0;

  virtual void HandleProgressCallback(const T *data, size_t count) = 0;

  virtual void Destroy();
};

typedef AsyncProgressWorkerBase<T> AsyncProgressWorker;
```

<a name="api_nan_async_progress_queue_worker"></a>
### Nan::AsyncProgressQueueWorker

`Nan::AsyncProgressQueueWorker` is an _abstract_ class template that extends `Nan::AsyncWorker` and adds additional progress reporting callbacks that can be used during the asynchronous work execution to provide progress data back to JavaScript.

`Nan::AsyncProgressQueueWorker` behaves exactly the same as `Nan::AsyncProgressWorker`, except all events are queued and delivered to the main thread.

Definition:

```c++
template<class T>
class AsyncProgressQueueWorker<T> : public AsyncWorker {
 public:
  explicit AsyncProgressQueueWorker(Callback *callback_, const char* resource_name = "nan:AsyncProgressQueueWorker");

  virtual ~AsyncProgressQueueWorker();

  void WorkProgress();

  class ExecutionProgress {
   public:
    void Send(const T* data, size_t count) const;
  };

  virtual void Execute(const ExecutionProgress& progress) = 0;

  virtual void HandleProgressCallback(const T *data, size_t count) = 0;

  virtual void Destroy();
};
```

<a name="api_nan_async_queue_worker"></a>
### Nan::AsyncQueueWorker

`Nan::AsyncQueueWorker` will run a `Nan::AsyncWorker` asynchronously via libuv. Both the `execute` and `after_work` steps are taken care of for you. Most of the logic for this is embedded in `Nan::AsyncWorker`.

Definition:

```c++
void AsyncQueueWorker(AsyncWorker *);
```

[AsyncResource]: node_misc.md#api_nan_asyncresource
## Buffers

NAN's `node::Buffer` helpers exist as the API has changed across supported Node versions. Use these methods to ensure compatibility.

 - <a href="#api_nan_new_buffer"><b><code>Nan::NewBuffer()</code></b></a>
 - <a href="#api_nan_copy_buffer"><b><code>Nan::CopyBuffer()</code></b></a>
 - <a href="#api_nan_free_callback"><b><code>Nan::FreeCallback()</code></b></a>

<a name="api_nan_new_buffer"></a>
### Nan::NewBuffer()

Allocate a new `node::Buffer` object with the specified size and optional data. Calls `node::Buffer::New()`.

Note that when creating a `Buffer` using `Nan::NewBuffer()` and an existing `char*`, it is assumed that the ownership of the pointer is being transferred to the new `Buffer` for management.
When a `node::Buffer` instance is garbage collected and a `FreeCallback` has not been specified, `data` will be disposed of via a call to `free()`.
You _must not_ free the memory space manually once you have created a `Buffer` in this way.

Signature:

```c++
Nan::MaybeLocal<v8::Object> Nan::NewBuffer(uint32_t size)
Nan::MaybeLocal<v8::Object> Nan::NewBuffer(char* data, uint32_t size)
Nan::MaybeLocal<v8::Object> Nan::NewBuffer(char *data,
                                           size_t length,
                                           Nan::FreeCallback callback,
                                           void *hint)
```


<a name="api_nan_copy_buffer"></a>
### Nan::CopyBuffer()

Similar to [`Nan::NewBuffer()`](#api_nan_new_buffer) except that an implicit memcpy will occur within Node. Calls `node::Buffer::Copy()`.

Management of the `char*` is left to the user, you should manually free the memory space if necessary as the new `Buffer` will have its own copy.

Signature:

```c++
Nan::MaybeLocal<v8::Object> Nan::CopyBuffer(const char *data, uint32_t size)
```


<a name="api_nan_free_callback"></a>
### Nan::FreeCallback()

A free callback that can be provided to [`Nan::NewBuffer()`](#api_nan_new_buffer).
The supplied callback will be invoked when the `Buffer` undergoes garbage collection.

Signature:

```c++
typedef void (*FreeCallback)(char *data, void *hint);
```
## Nan::Callback

`Nan::Callback` makes it easier to use `v8::Function` handles as callbacks. A class that wraps a `v8::Function` handle, protecting it from garbage collection and making it particularly useful for storage and use across asynchronous execution.

 - <a href="#api_nan_callback"><b><code>Nan::Callback</code></b></a>

<a name="api_nan_callback"></a>
### Nan::Callback

```c++
class Callback {
 public:
  Callback();

  explicit Callback(const v8::Local<v8::Function> &fn);

  ~Callback();

  bool operator==(const Callback &other) const;

  bool operator!=(const Callback &other) const;

  v8::Local<v8::Function> operator*() const;

  MaybeLocal<v8::Value> operator()(AsyncResource* async_resource,
                                   v8::Local<v8::Object> target,
                                   int argc = 0,
                                   v8::Local<v8::Value> argv[] = 0) const;

  MaybeLocal<v8::Value> operator()(AsyncResource* async_resource,
                                   int argc = 0,
                                   v8::Local<v8::Value> argv[] = 0) const;

  void SetFunction(const v8::Local<v8::Function> &fn);

  v8::Local<v8::Function> GetFunction() const;

  bool IsEmpty() const;

  void Reset(const v8::Local<v8::Function> &fn);

  void Reset();

  MaybeLocal<v8::Value> Call(v8::Local<v8::Object> target,
                            int argc,
                            v8::Local<v8::Value> argv[],
                            AsyncResource* async_resource) const;
  MaybeLocal<v8::Value> Call(int argc,
                             v8::Local<v8::Value> argv[],
                             AsyncResource* async_resource) const;

  // Deprecated versions. Use the versions that accept an async_resource instead
  // as they run the callback in the correct async context as specified by the
  // resource. If you want to call a synchronous JS function (i.e. on a
  // non-empty JS stack), you can use Nan::Call instead.
  v8::Local<v8::Value> operator()(v8::Local<v8::Object> target,
                                  int argc = 0,
                                  v8::Local<v8::Value> argv[] = 0) const;

  v8::Local<v8::Value> operator()(int argc = 0,
                                  v8::Local<v8::Value> argv[] = 0) const;
  v8::Local<v8::Value> Call(v8::Local<v8::Object> target,
                            int argc,
                            v8::Local<v8::Value> argv[]) const;

  v8::Local<v8::Value> Call(int argc, v8::Local<v8::Value> argv[]) const;
};
```

Example usage:

```c++
v8::Local<v8::Function> function;
Nan::Callback callback(function);
callback.Call(0, 0);
```
## Converters

NAN contains functions that convert `v8::Value`s to other `v8::Value` types and native types. Since type conversion is not guaranteed to succeed, they return `Nan::Maybe` types. These converters can be used in place of `value->ToX()` and `value->XValue()` (where `X` is one of the types, e.g. `Boolean`) in a way that provides a consistent interface across V8 versions. Newer versions of V8 use the new `v8::Maybe` and `v8::MaybeLocal` types for these conversions, older versions don't have this functionality so it is provided by NAN.

 - <a href="#api_nan_to"><b><code>Nan::To()</code></b></a>

<a name="api_nan_to"></a>
### Nan::To()

Converts a `v8::Local<v8::Value>` to a different subtype of `v8::Value` or to a native data type. Returns a `Nan::MaybeLocal<>` or a `Nan::Maybe<>` accordingly.

See [maybe_types.md](./maybe_types.md) for more information on `Nan::Maybe` types.

Signatures:

```c++
// V8 types
Nan::MaybeLocal<v8::Boolean> Nan::To<v8::Boolean>(v8::Local<v8::Value> val);
Nan::MaybeLocal<v8::Int32> Nan::To<v8::Int32>(v8::Local<v8::Value> val);
Nan::MaybeLocal<v8::Integer> Nan::To<v8::Integer>(v8::Local<v8::Value> val);
Nan::MaybeLocal<v8::Object> Nan::To<v8::Object>(v8::Local<v8::Value> val);
Nan::MaybeLocal<v8::Number> Nan::To<v8::Number>(v8::Local<v8::Value> val);
Nan::MaybeLocal<v8::String> Nan::To<v8::String>(v8::Local<v8::Value> val);
Nan::MaybeLocal<v8::Uint32> Nan::To<v8::Uint32>(v8::Local<v8::Value> val);

// Native types
Nan::Maybe<bool> Nan::To<bool>(v8::Local<v8::Value> val);
Nan::Maybe<double> Nan::To<double>(v8::Local<v8::Value> val);
Nan::Maybe<int32_t> Nan::To<int32_t>(v8::Local<v8::Value> val);
Nan::Maybe<int64_t> Nan::To<int64_t>(v8::Local<v8::Value> val);
Nan::Maybe<uint32_t> Nan::To<uint32_t>(v8::Local<v8::Value> val);
```

### Example

```c++
v8::Local<v8::Value> val;
Nan::MaybeLocal<v8::String> str = Nan::To<v8::String>(val);
Nan::Maybe<double> d = Nan::To<double>(val);
```

## Errors

NAN includes helpers for creating, throwing and catching Errors as much of this functionality varies across the supported versions of V8 and must be abstracted.

Note that an Error object is simply a specialized form of `v8::Value`.

Also consult the V8 Embedders Guide section on [Exceptions](https://developers.google.com/v8/embed#exceptions) for more information.

 - <a href="#api_nan_error"><b><code>Nan::Error()</code></b></a>
 - <a href="#api_nan_range_error"><b><code>Nan::RangeError()</code></b></a>
 - <a href="#api_nan_reference_error"><b><code>Nan::ReferenceError()</code></b></a>
 - <a href="#api_nan_syntax_error"><b><code>Nan::SyntaxError()</code></b></a>
 - <a href="#api_nan_type_error"><b><code>Nan::TypeError()</code></b></a>
 - <a href="#api_nan_throw_error"><b><code>Nan::ThrowError()</code></b></a>
 - <a href="#api_nan_throw_range_error"><b><code>Nan::ThrowRangeError()</code></b></a>
 - <a href="#api_nan_throw_reference_error"><b><code>Nan::ThrowReferenceError()</code></b></a>
 - <a href="#api_nan_throw_syntax_error"><b><code>Nan::ThrowSyntaxError()</code></b></a>
 - <a href="#api_nan_throw_type_error"><b><code>Nan::ThrowTypeError()</code></b></a>
 - <a href="#api_nan_fatal_exception"><b><code>Nan::FatalException()</code></b></a>
 - <a href="#api_nan_errno_exception"><b><code>Nan::ErrnoException()</code></b></a>
 - <a href="#api_nan_try_catch"><b><code>Nan::TryCatch</code></b></a>


<a name="api_nan_error"></a>
### Nan::Error()

Create a new Error object using the [v8::Exception](https://v8docs.nodesource.com/node-8.16/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8.

Note that an Error object is simply a specialized form of `v8::Value`.

Signature:

```c++
v8::Local<v8::Value> Nan::Error(const char *msg);
v8::Local<v8::Value> Nan::Error(v8::Local<v8::String> msg);
```


<a name="api_nan_range_error"></a>
### Nan::RangeError()

Create a new RangeError object using the [v8::Exception](https://v8docs.nodesource.com/node-8.16/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8.

Note that an RangeError object is simply a specialized form of `v8::Value`.

Signature:

```c++
v8::Local<v8::Value> Nan::RangeError(const char *msg);
v8::Local<v8::Value> Nan::RangeError(v8::Local<v8::String> msg);
```


<a name="api_nan_reference_error"></a>
### Nan::ReferenceError()

Create a new ReferenceError object using the [v8::Exception](https://v8docs.nodesource.com/node-8.16/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8.

Note that an ReferenceError object is simply a specialized form of `v8::Value`.

Signature:

```c++
v8::Local<v8::Value> Nan::ReferenceError(const char *msg);
v8::Local<v8::Value> Nan::ReferenceError(v8::Local<v8::String> msg);
```


<a name="api_nan_syntax_error"></a>
### Nan::SyntaxError()

Create a new SyntaxError object using the [v8::Exception](https://v8docs.nodesource.com/node-8.16/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8.

Note that an SyntaxError object is simply a specialized form of `v8::Value`.

Signature:

```c++
v8::Local<v8::Value> Nan::SyntaxError(const char *msg);
v8::Local<v8::Value> Nan::SyntaxError(v8::Local<v8::String> msg);
```


<a name="api_nan_type_error"></a>
### Nan::TypeError()

Create a new TypeError object using the [v8::Exception](https://v8docs.nodesource.com/node-8.16/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8.

Note that an TypeError object is simply a specialized form of `v8::Value`.

Signature:

```c++
v8::Local<v8::Value> Nan::TypeError(const char *msg);
v8::Local<v8::Value> Nan::TypeError(v8::Local<v8::String> msg);
```


<a name="api_nan_throw_error"></a>
### Nan::ThrowError()

Throw an Error object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new Error object will be created.

Signature:

```c++
void Nan::ThrowError(const char *msg);
void Nan::ThrowError(v8::Local<v8::String> msg);
void Nan::ThrowError(v8::Local<v8::Value> error);
```


<a name="api_nan_throw_range_error"></a>
### Nan::ThrowRangeError()

Throw an RangeError object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new RangeError object will be created.

Signature:

```c++
void Nan::ThrowRangeError(const char *msg);
void Nan::ThrowRangeError(v8::Local<v8::String> msg);
void Nan::ThrowRangeError(v8::Local<v8::Value> error);
```


<a name="api_nan_throw_reference_error"></a>
### Nan::ThrowReferenceError()

Throw an ReferenceError object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new ReferenceError object will be created.

Signature:

```c++
void Nan::ThrowReferenceError(const char *msg);
void Nan::ThrowReferenceError(v8::Local<v8::String> msg);
void Nan::ThrowReferenceError(v8::Local<v8::Value> error);
```


<a name="api_nan_throw_syntax_error"></a>
### Nan::ThrowSyntaxError()

Throw an SyntaxError object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new SyntaxError object will be created.

Signature:

```c++
void Nan::ThrowSyntaxError(const char *msg);
void Nan::ThrowSyntaxError(v8::Local<v8::String> msg);
void Nan::ThrowSyntaxError(v8::Local<v8::Value> error);
```


<a name="api_nan_throw_type_error"></a>
### Nan::ThrowTypeError()

Throw an TypeError object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new TypeError object will be created.

Signature:

```c++
void Nan::ThrowTypeError(const char *msg);
void Nan::ThrowTypeError(v8::Local<v8::String> msg);
void Nan::ThrowTypeError(v8::Local<v8::Value> error);
```

<a name="api_nan_fatal_exception"></a>
### Nan::FatalException()

Replaces `node::FatalException()` which has a different API across supported versions of Node. For use with [`Nan::TryCatch`](#api_nan_try_catch).

Signature:

```c++
void Nan::FatalException(const Nan::TryCatch& try_catch);
```

<a name="api_nan_errno_exception"></a>
### Nan::ErrnoException()

Replaces `node::ErrnoException()` which has a different API across supported versions of Node. 

Signature:

```c++
v8::Local<v8::Value> Nan::ErrnoException(int errorno,
                                         const char* syscall = NULL,
                                         const char* message = NULL,
                                         const char* path = NULL);
```


<a name="api_nan_try_catch"></a>
### Nan::TryCatch

A simple wrapper around [`v8::TryCatch`](https://v8docs.nodesource.com/node-8.16/d4/dc6/classv8_1_1_try_catch.html) compatible with all supported versions of V8. Can be used as a direct replacement in most cases. See also [`Nan::FatalException()`](#api_nan_fatal_exception) for an internal use compatible with `node::FatalException`.

Signature:

```c++
class Nan::TryCatch {
 public:
  Nan::TryCatch();

  bool HasCaught() const;

  bool CanContinue() const;

  v8::Local<v8::Value> ReThrow();

  v8::Local<v8::Value> Exception() const;

  // Nan::MaybeLocal for older versions of V8
  v8::MaybeLocal<v8::Value> StackTrace() const;

  v8::Local<v8::Message> Message() const;

  void Reset();

  void SetVerbose(bool value);

  void SetCaptureMessage(bool value);
};
```

## JSON

The _JSON_ object provides the C++ versions of the methods offered by the `JSON` object in javascript. V8 exposes these methods via the `v8::JSON` object.

 - <a href="#api_nan_json_parse"><b><code>Nan::JSON.Parse</code></b></a>
 - <a href="#api_nan_json_stringify"><b><code>Nan::JSON.Stringify</code></b></a>

Refer to the V8 JSON object in the [V8 documentation](https://v8docs.nodesource.com/node-8.16/da/d6f/classv8_1_1_j_s_o_n.html) for more information about these methods and their arguments.

<a name="api_nan_json_parse"></a>

### Nan::JSON.Parse

A simple wrapper around [`v8::JSON::Parse`](https://v8docs.nodesource.com/node-8.16/da/d6f/classv8_1_1_j_s_o_n.html#a936310d2540fb630ed37d3ee3ffe4504).

Definition:

```c++
Nan::MaybeLocal<v8::Value> Nan::JSON::Parse(v8::Local<v8::String> json_string);
```

Use `JSON.Parse(json_string)` to parse a string into a `v8::Value`.

Example:

```c++
v8::Local<v8::String> json_string = Nan::New("{ \"JSON\": \"object\" }").ToLocalChecked();

Nan::JSON NanJSON;
Nan::MaybeLocal<v8::Value> result = NanJSON.Parse(json_string);
if (!result.IsEmpty()) {
  v8::Local<v8::Value> val = result.ToLocalChecked();
}
```

<a name="api_nan_json_stringify"></a>

### Nan::JSON.Stringify

A simple wrapper around [`v8::JSON::Stringify`](https://v8docs.nodesource.com/node-8.16/da/d6f/classv8_1_1_j_s_o_n.html#a44b255c3531489ce43f6110209138860).

Definition:

```c++
Nan::MaybeLocal<v8::String> Nan::JSON::Stringify(v8::Local<v8::Object> json_object, v8::Local<v8::String> gap = v8::Local<v8::String>());
```

Use `JSON.Stringify(value)` to stringify a `v8::Object`.

Example:

```c++
// using `v8::Local<v8::Value> val` from the `JSON::Parse` example
v8::Local<v8::Object> obj = Nan::To<v8::Object>(val).ToLocalChecked();

Nan::JSON NanJSON;
Nan::MaybeLocal<v8::String> result = NanJSON.Stringify(obj);
if (!result.IsEmpty()) {
  v8::Local<v8::String> stringified = result.ToLocalChecked();
}
```

## Maybe Types

The `Nan::MaybeLocal` and `Nan::Maybe` types are monads that encapsulate `v8::Local` handles that _may be empty_.

* **Maybe Types**
  - <a href="#api_nan_maybe_local"><b><code>Nan::MaybeLocal</code></b></a>
  - <a href="#api_nan_maybe"><b><code>Nan::Maybe</code></b></a>
  - <a href="#api_nan_nothing"><b><code>Nan::Nothing</code></b></a>
  - <a href="#api_nan_just"><b><code>Nan::Just</code></b></a>
* **Maybe Helpers**
  - <a href="#api_nan_call"><b><code>Nan::Call()</code></b></a>
  - <a href="#api_nan_to_detail_string"><b><code>Nan::ToDetailString()</code></b></a>
  - <a href="#api_nan_to_array_index"><b><code>Nan::ToArrayIndex()</code></b></a>
  - <a href="#api_nan_equals"><b><code>Nan::Equals()</code></b></a>
  - <a href="#api_nan_new_instance"><b><code>Nan::NewInstance()</code></b></a>
  - <a href="#api_nan_get_function"><b><code>Nan::GetFunction()</code></b></a>
  - <a href="#api_nan_set"><b><code>Nan::Set()</code></b></a>
  - <a href="#api_nan_define_own_property"><b><code>Nan::DefineOwnProperty()</code></b></a>
  - <a href="#api_nan_force_set"><del><b><code>Nan::ForceSet()</code></b></del></a>
  - <a href="#api_nan_get"><b><code>Nan::Get()</code></b></a>
  - <a href="#api_nan_get_property_attribute"><b><code>Nan::GetPropertyAttributes()</code></b></a>
  - <a href="#api_nan_has"><b><code>Nan::Has()</code></b></a>
  - <a href="#api_nan_delete"><b><code>Nan::Delete()</code></b></a>
  - <a href="#api_nan_get_property_names"><b><code>Nan::GetPropertyNames()</code></b></a>
  - <a href="#api_nan_get_own_property_names"><b><code>Nan::GetOwnPropertyNames()</code></b></a>
  - <a href="#api_nan_set_prototype"><b><code>Nan::SetPrototype()</code></b></a>
  - <a href="#api_nan_object_proto_to_string"><b><code>Nan::ObjectProtoToString()</code></b></a>
  - <a href="#api_nan_has_own_property"><b><code>Nan::HasOwnProperty()</code></b></a>
  - <a href="#api_nan_has_real_named_property"><b><code>Nan::HasRealNamedProperty()</code></b></a>
  - <a href="#api_nan_has_real_indexed_property"><b><code>Nan::HasRealIndexedProperty()</code></b></a>
  - <a href="#api_nan_has_real_named_callback_property"><b><code>Nan::HasRealNamedCallbackProperty()</code></b></a>
  - <a href="#api_nan_get_real_named_property_in_prototype_chain"><b><code>Nan::GetRealNamedPropertyInPrototypeChain()</code></b></a>
  - <a href="#api_nan_get_real_named_property"><b><code>Nan::GetRealNamedProperty()</code></b></a>
  - <a href="#api_nan_call_as_function"><b><code>Nan::CallAsFunction()</code></b></a>
  - <a href="#api_nan_call_as_constructor"><b><code>Nan::CallAsConstructor()</code></b></a>
  - <a href="#api_nan_get_source_line"><b><code>Nan::GetSourceLine()</code></b></a>
  - <a href="#api_nan_get_line_number"><b><code>Nan::GetLineNumber()</code></b></a>
  - <a href="#api_nan_get_start_column"><b><code>Nan::GetStartColumn()</code></b></a>
  - <a href="#api_nan_get_end_column"><b><code>Nan::GetEndColumn()</code></b></a>
  - <a href="#api_nan_clone_element_at"><b><code>Nan::CloneElementAt()</code></b></a>
  - <a href="#api_nan_has_private"><b><code>Nan::HasPrivate()</code></b></a>
  - <a href="#api_nan_get_private"><b><code>Nan::GetPrivate()</code></b></a>
  - <a href="#api_nan_set_private"><b><code>Nan::SetPrivate()</code></b></a>
  - <a href="#api_nan_delete_private"><b><code>Nan::DeletePrivate()</code></b></a>
  - <a href="#api_nan_make_maybe"><b><code>Nan::MakeMaybe()</code></b></a>

<a name="api_nan_maybe_local"></a>
### Nan::MaybeLocal

A `Nan::MaybeLocal<T>` is a wrapper around [`v8::Local<T>`](https://v8docs.nodesource.com/node-8.16/de/deb/classv8_1_1_local.html) that enforces a check that determines whether the `v8::Local<T>` is empty before it can be used.

If an API method returns a `Nan::MaybeLocal`, the API method can potentially fail either because an exception is thrown, or because an exception is pending, e.g. because a previous API call threw an exception that hasn't been caught yet, or because a `v8::TerminateExecution` exception was thrown. In that case, an empty `Nan::MaybeLocal` is returned.

Definition:

```c++
template<typename T> class Nan::MaybeLocal {
 public:
  MaybeLocal();

  template<typename S> MaybeLocal(v8::Local<S> that);

  bool IsEmpty() const;

  template<typename S> bool ToLocal(v8::Local<S> *out);

  // Will crash if the MaybeLocal<> is empty.
  v8::Local<T> ToLocalChecked();

  template<typename S> v8::Local<S> FromMaybe(v8::Local<S> default_value) const;
};
```

See the documentation for [`v8::MaybeLocal`](https://v8docs.nodesource.com/node-8.16/d8/d7d/classv8_1_1_maybe_local.html) for further details.

<a name="api_nan_maybe"></a>
### Nan::Maybe

A simple `Nan::Maybe` type, representing an object which may or may not have a value, see https://hackage.haskell.org/package/base/docs/Data-Maybe.html.

If an API method returns a `Nan::Maybe<>`, the API method can potentially fail either because an exception is thrown, or because an exception is pending, e.g. because a previous API call threw an exception that hasn't been caught yet, or because a `v8::TerminateExecution` exception was thrown. In that case, a "Nothing" value is returned.

Definition:

```c++
template<typename T> class Nan::Maybe {
 public:
  bool IsNothing() const;
  bool IsJust() const;

  // Will crash if the Maybe<> is nothing.
  T FromJust();

  T FromMaybe(const T& default_value);

  bool operator==(const Maybe &other);

  bool operator!=(const Maybe &other);
};
```

See the documentation for [`v8::Maybe`](https://v8docs.nodesource.com/node-8.16/d9/d4b/classv8_1_1_maybe.html) for further details.

<a name="api_nan_nothing"></a>
### Nan::Nothing

Construct an empty `Nan::Maybe` type representing _nothing_.

```c++
template<typename T> Nan::Maybe<T> Nan::Nothing();
```

<a name="api_nan_just"></a>
### Nan::Just

Construct a `Nan::Maybe` type representing _just_ a value.

```c++
template<typename T> Nan::Maybe<T> Nan::Just(const T &t);
```

<a name="api_nan_call"></a>
### Nan::Call()

A helper method for calling a synchronous [`v8::Function#Call()`](https://v8docs.nodesource.com/node-8.16/d5/d54/classv8_1_1_function.html#a9c3d0e4e13ddd7721fce238aa5b94a11) in a way compatible across supported versions of V8.

For asynchronous callbacks, use Nan::Callback::Call along with an AsyncResource.

Signature:

```c++
Nan::MaybeLocal<v8::Value> Nan::Call(v8::Local<v8::Function> fun, v8::Local<v8::Object> recv, int argc, v8::Local<v8::Value> argv[]);
Nan::MaybeLocal<v8::Value> Nan::Call(const Nan::Callback& callback, v8::Local<v8::Object> recv,
 int argc, v8::Local<v8::Value> argv[]);
Nan::MaybeLocal<v8::Value> Nan::Call(const Nan::Callback& callback, int argc, v8::Local<v8::Value> argv[]);
```


<a name="api_nan_to_detail_string"></a>
### Nan::ToDetailString()

A helper method for calling [`v8::Value#ToDetailString()`](https://v8docs.nodesource.com/node-8.16/dc/d0a/classv8_1_1_value.html#a2f9770296dc2c8d274bc8cc0dca243e5) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::MaybeLocal<v8::String> Nan::ToDetailString(v8::Local<v8::Value> val);
```


<a name="api_nan_to_array_index"></a>
### Nan::ToArrayIndex()

A helper method for calling [`v8::Value#ToArrayIndex()`](https://v8docs.nodesource.com/node-8.16/dc/d0a/classv8_1_1_value.html#acc5bbef3c805ec458470c0fcd6f13493) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::MaybeLocal<v8::Uint32> Nan::ToArrayIndex(v8::Local<v8::Value> val);
```


<a name="api_nan_equals"></a>
### Nan::Equals()

A helper method for calling [`v8::Value#Equals()`](https://v8docs.nodesource.com/node-8.16/dc/d0a/classv8_1_1_value.html#a08fba1d776a59bbf6864b25f9152c64b) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::Maybe<bool> Nan::Equals(v8::Local<v8::Value> a, v8::Local<v8::Value>(b));
```


<a name="api_nan_new_instance"></a>
### Nan::NewInstance()

A helper method for calling [`v8::Function#NewInstance()`](https://v8docs.nodesource.com/node-8.16/d5/d54/classv8_1_1_function.html#ae477558b10c14b76ed00e8dbab44ce5b) and [`v8::ObjectTemplate#NewInstance()`](https://v8docs.nodesource.com/node-8.16/db/d5f/classv8_1_1_object_template.html#ad605a7543cfbc5dab54cdb0883d14ae4) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::MaybeLocal<v8::Object> Nan::NewInstance(v8::Local<v8::Function> h);
Nan::MaybeLocal<v8::Object> Nan::NewInstance(v8::Local<v8::Function> h, int argc, v8::Local<v8::Value> argv[]);
Nan::MaybeLocal<v8::Object> Nan::NewInstance(v8::Local<v8::ObjectTemplate> h);
```


<a name="api_nan_get_function"></a>
### Nan::GetFunction()

A helper method for calling [`v8::FunctionTemplate#GetFunction()`](https://v8docs.nodesource.com/node-8.16/d8/d83/classv8_1_1_function_template.html#a56d904662a86eca78da37d9bb0ed3705) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::MaybeLocal<v8::Function> Nan::GetFunction(v8::Local<v8::FunctionTemplate> t);
```


<a name="api_nan_set"></a>
### Nan::Set()

A helper method for calling [`v8::Object#Set()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a67604ea3734f170c66026064ea808f20) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::Maybe<bool> Nan::Set(v8::Local<v8::Object> obj,
                          v8::Local<v8::Value> key,
                          v8::Local<v8::Value> value)
Nan::Maybe<bool> Nan::Set(v8::Local<v8::Object> obj,
                          uint32_t index,
                          v8::Local<v8::Value> value);
```


<a name="api_nan_define_own_property"></a>
### Nan::DefineOwnProperty()

A helper method for calling [`v8::Object#DefineOwnProperty()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a6f76b2ed605cb8f9185b92de0033a820) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::Maybe<bool> Nan::DefineOwnProperty(v8::Local<v8::Object> obj,
                                        v8::Local<v8::String> key,
                                        v8::Local<v8::Value> value,
                                        v8::PropertyAttribute attribs = v8::None);
```


<a name="api_nan_force_set"></a>
### <del>Nan::ForceSet()</del>

Deprecated, use <a href="#api_nan_define_own_property"><code>Nan::DefineOwnProperty()</code></a>.

<del>A helper method for calling [`v8::Object#ForceSet()`](https://v8docs.nodesource.com/node-0.12/db/d85/classv8_1_1_object.html#acfbdfd7427b516ebdb5c47c4df5ed96c) in a way compatible across supported versions of V8.</del>

Signature:

```c++
NAN_DEPRECATED Nan::Maybe<bool> Nan::ForceSet(v8::Local<v8::Object> obj,
                                              v8::Local<v8::Value> key,
                                              v8::Local<v8::Value> value,
                                              v8::PropertyAttribute attribs = v8::None);
```


<a name="api_nan_get"></a>
### Nan::Get()

A helper method for calling [`v8::Object#Get()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a2565f03e736694f6b1e1cf22a0b4eac2) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::MaybeLocal<v8::Value> Nan::Get(v8::Local<v8::Object> obj,
                                    v8::Local<v8::Value> key);
Nan::MaybeLocal<v8::Value> Nan::Get(v8::Local<v8::Object> obj, uint32_t index);
```


<a name="api_nan_get_property_attribute"></a>
### Nan::GetPropertyAttributes()

A helper method for calling [`v8::Object#GetPropertyAttributes()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a9b898894da3d1db2714fd9325a54fe57) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::Maybe<v8::PropertyAttribute> Nan::GetPropertyAttributes(
    v8::Local<v8::Object> obj,
    v8::Local<v8::Value> key);
```


<a name="api_nan_has"></a>
### Nan::Has()

A helper method for calling [`v8::Object#Has()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#ab3c3d89ea7c2f9afd08965bd7299a41d) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::Maybe<bool> Nan::Has(v8::Local<v8::Object> obj, v8::Local<v8::String> key);
Nan::Maybe<bool> Nan::Has(v8::Local<v8::Object> obj, uint32_t index);
```


<a name="api_nan_delete"></a>
### Nan::Delete()

A helper method for calling [`v8::Object#Delete()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a48e4a19b2cedff867eecc73ddb7d377f) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::Maybe<bool> Nan::Delete(v8::Local<v8::Object> obj,
                             v8::Local<v8::String> key);
Nan::Maybe<bool> Nan::Delete(v8::Local<v8::Object> obj, uint32_t index);
```


<a name="api_nan_get_property_names"></a>
### Nan::GetPropertyNames()

A helper method for calling [`v8::Object#GetPropertyNames()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#aced885270cfd2c956367b5eedc7fbfe8) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::MaybeLocal<v8::Array> Nan::GetPropertyNames(v8::Local<v8::Object> obj);
```


<a name="api_nan_get_own_property_names"></a>
### Nan::GetOwnPropertyNames()

A helper method for calling [`v8::Object#GetOwnPropertyNames()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a79a6e4d66049b9aa648ed4dfdb23e6eb) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::MaybeLocal<v8::Array> Nan::GetOwnPropertyNames(v8::Local<v8::Object> obj);
```


<a name="api_nan_set_prototype"></a>
### Nan::SetPrototype()

A helper method for calling [`v8::Object#SetPrototype()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a442706b22fceda6e6d1f632122a9a9f4) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::Maybe<bool> Nan::SetPrototype(v8::Local<v8::Object> obj,
                                   v8::Local<v8::Value> prototype);
```


<a name="api_nan_object_proto_to_string"></a>
### Nan::ObjectProtoToString()

A helper method for calling [`v8::Object#ObjectProtoToString()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#ab7a92b4dcf822bef72f6c0ac6fea1f0b) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::MaybeLocal<v8::String> Nan::ObjectProtoToString(v8::Local<v8::Object> obj);
```


<a name="api_nan_has_own_property"></a>
### Nan::HasOwnProperty()

A helper method for calling [`v8::Object#HasOwnProperty()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#ab7b7245442ca6de1e1c145ea3fd653ff) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::Maybe<bool> Nan::HasOwnProperty(v8::Local<v8::Object> obj,
                                     v8::Local<v8::String> key);
```


<a name="api_nan_has_real_named_property"></a>
### Nan::HasRealNamedProperty()

A helper method for calling [`v8::Object#HasRealNamedProperty()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#ad8b80a59c9eb3c1e6c3cd6c84571f767) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::Maybe<bool> Nan::HasRealNamedProperty(v8::Local<v8::Object> obj,
                                           v8::Local<v8::String> key);
```


<a name="api_nan_has_real_indexed_property"></a>
### Nan::HasRealIndexedProperty()

A helper method for calling [`v8::Object#HasRealIndexedProperty()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#af94fc1135a5e74a2193fb72c3a1b9855) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::Maybe<bool> Nan::HasRealIndexedProperty(v8::Local<v8::Object> obj,
                                             uint32_t index);
```


<a name="api_nan_has_real_named_callback_property"></a>
### Nan::HasRealNamedCallbackProperty()

A helper method for calling [`v8::Object#HasRealNamedCallbackProperty()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#af743b7ea132b89f84d34d164d0668811) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::Maybe<bool> Nan::HasRealNamedCallbackProperty(
    v8::Local<v8::Object> obj,
    v8::Local<v8::String> key);
```


<a name="api_nan_get_real_named_property_in_prototype_chain"></a>
### Nan::GetRealNamedPropertyInPrototypeChain()

A helper method for calling [`v8::Object#GetRealNamedPropertyInPrototypeChain()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a8700b1862e6b4783716964ba4d5e6172) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::MaybeLocal<v8::Value> Nan::GetRealNamedPropertyInPrototypeChain(
    v8::Local<v8::Object> obj,
    v8::Local<v8::String> key);
```


<a name="api_nan_get_real_named_property"></a>
### Nan::GetRealNamedProperty()

A helper method for calling [`v8::Object#GetRealNamedProperty()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a84471a824576a5994fdd0ffcbf99ccc0) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::MaybeLocal<v8::Value> Nan::GetRealNamedProperty(v8::Local<v8::Object> obj,
                                                     v8::Local<v8::String> key);
```


<a name="api_nan_call_as_function"></a>
### Nan::CallAsFunction()

A helper method for calling [`v8::Object#CallAsFunction()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#ad3ffc36f3dfc3592ce2a96bc047ee2cd) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::MaybeLocal<v8::Value> Nan::CallAsFunction(v8::Local<v8::Object> obj,
                                               v8::Local<v8::Object> recv,
                                               int argc,
                                               v8::Local<v8::Value> argv[]);
```


<a name="api_nan_call_as_constructor"></a>
### Nan::CallAsConstructor()

A helper method for calling [`v8::Object#CallAsConstructor()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a50d571de50d0b0dfb28795619d07a01b) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::MaybeLocal<v8::Value> Nan::CallAsConstructor(v8::Local<v8::Object> obj,
                                                  int argc,
                                                  v8::Local<v8::Value> argv[]);
```


<a name="api_nan_get_source_line"></a>
### Nan::GetSourceLine()

A helper method for calling [`v8::Message#GetSourceLine()`](https://v8docs.nodesource.com/node-8.16/d9/d28/classv8_1_1_message.html#a849f7a6c41549d83d8159825efccd23a) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::MaybeLocal<v8::String> Nan::GetSourceLine(v8::Local<v8::Message> msg);
```


<a name="api_nan_get_line_number"></a>
### Nan::GetLineNumber()

A helper method for calling [`v8::Message#GetLineNumber()`](https://v8docs.nodesource.com/node-8.16/d9/d28/classv8_1_1_message.html#adbe46c10a88a6565f2732a2d2adf99b9) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::Maybe<int> Nan::GetLineNumber(v8::Local<v8::Message> msg);
```


<a name="api_nan_get_start_column"></a>
### Nan::GetStartColumn()

A helper method for calling [`v8::Message#GetStartColumn()`](https://v8docs.nodesource.com/node-8.16/d9/d28/classv8_1_1_message.html#a60ede616ba3822d712e44c7a74487ba6) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::Maybe<int> Nan::GetStartColumn(v8::Local<v8::Message> msg);
```


<a name="api_nan_get_end_column"></a>
### Nan::GetEndColumn()

A helper method for calling [`v8::Message#GetEndColumn()`](https://v8docs.nodesource.com/node-8.16/d9/d28/classv8_1_1_message.html#aaa004cf19e529da980bc19fcb76d93be) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::Maybe<int> Nan::GetEndColumn(v8::Local<v8::Message> msg);
```


<a name="api_nan_clone_element_at"></a>
### Nan::CloneElementAt()

A helper method for calling [`v8::Array#CloneElementAt()`](https://v8docs.nodesource.com/node-4.8/d3/d32/classv8_1_1_array.html#a1d3a878d4c1c7cae974dd50a1639245e) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::MaybeLocal<v8::Object> Nan::CloneElementAt(v8::Local<v8::Array> array, uint32_t index);
```

<a name="api_nan_has_private"></a>
### Nan::HasPrivate()

A helper method for calling [`v8::Object#HasPrivate()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#af68a0b98066cfdeb8f943e98a40ba08d) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::Maybe<bool> Nan::HasPrivate(v8::Local<v8::Object> object, v8::Local<v8::String> key);
```

<a name="api_nan_get_private"></a>
### Nan::GetPrivate()

A helper method for calling [`v8::Object#GetPrivate()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a169f2da506acbec34deadd9149a1925a) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::MaybeLocal<v8::Value> Nan::GetPrivate(v8::Local<v8::Object> object, v8::Local<v8::String> key);
```

<a name="api_nan_set_private"></a>
### Nan::SetPrivate()

A helper method for calling [`v8::Object#SetPrivate()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#ace1769b0f3b86bfe9fda1010916360ee) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::Maybe<bool> Nan::SetPrivate(v8::Local<v8::Object> object, v8::Local<v8::String> key, v8::Local<v8::Value> value);
```

<a name="api_nan_delete_private"></a>
### Nan::DeletePrivate()

A helper method for calling [`v8::Object#DeletePrivate()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a138bb32a304f3982be02ad499693b8fd) in a way compatible across supported versions of V8.

Signature:

```c++
Nan::Maybe<bool> Nan::DeletePrivate(v8::Local<v8::Object> object, v8::Local<v8::String> key);
```

<a name="api_nan_make_maybe"></a>
### Nan::MakeMaybe()

Wraps a `v8::Local<>` in a `Nan::MaybeLocal<>`. When called with a `Nan::MaybeLocal<>` it just returns its argument. This is useful in generic template code that builds on NAN.

Synopsis:

```c++
  MaybeLocal<v8::Number> someNumber = MakeMaybe(New<v8::Number>(3.141592654));
  MaybeLocal<v8::String> someString = MakeMaybe(New<v8::String>("probably"));
```

Signature:

```c++
template <typename T, template <typename> class MaybeMaybe>
Nan::MaybeLocal<T> Nan::MakeMaybe(MaybeMaybe<T> v);
```
## JavaScript-accessible methods

A _template_ is a blueprint for JavaScript functions and objects in a context. You can use a template to wrap C++ functions and data structures within JavaScript objects so that they can be manipulated from JavaScript. See the V8 Embedders Guide section on [Templates](https://github.com/v8/v8/wiki/Embedder%27s-Guide#templates) for further information.

In order to expose functionality to JavaScript via a template, you must provide it to V8 in a form that it understands. Across the versions of V8 supported by NAN, JavaScript-accessible method signatures vary widely, NAN fully abstracts method declaration and provides you with an interface that is similar to the most recent V8 API but is backward-compatible with older versions that still use the now-deceased `v8::Argument` type.

* **Method argument types**
 - <a href="#api_nan_function_callback_info"><b><code>Nan::FunctionCallbackInfo</code></b></a>
 - <a href="#api_nan_property_callback_info"><b><code>Nan::PropertyCallbackInfo</code></b></a>
 - <a href="#api_nan_return_value"><b><code>Nan::ReturnValue</code></b></a>
* **Method declarations**
 - <a href="#api_nan_method"><b>Method declaration</b></a>
 - <a href="#api_nan_getter"><b>Getter declaration</b></a>
 - <a href="#api_nan_setter"><b>Setter declaration</b></a>
 - <a href="#api_nan_property_getter"><b>Property getter declaration</b></a>
 - <a href="#api_nan_property_setter"><b>Property setter declaration</b></a>
 - <a href="#api_nan_property_enumerator"><b>Property enumerator declaration</b></a>
 - <a href="#api_nan_property_deleter"><b>Property deleter declaration</b></a>
 - <a href="#api_nan_property_query"><b>Property query declaration</b></a>
 - <a href="#api_nan_index_getter"><b>Index getter declaration</b></a>
 - <a href="#api_nan_index_setter"><b>Index setter declaration</b></a>
 - <a href="#api_nan_index_enumerator"><b>Index enumerator declaration</b></a>
 - <a href="#api_nan_index_deleter"><b>Index deleter declaration</b></a>
 - <a href="#api_nan_index_query"><b>Index query declaration</b></a>
* Method and template helpers
 - <a href="#api_nan_set_method"><b><code>Nan::SetMethod()</code></b></a>
 - <a href="#api_nan_set_prototype_method"><b><code>Nan::SetPrototypeMethod()</code></b></a>
 - <a href="#api_nan_set_accessor"><b><code>Nan::SetAccessor()</code></b></a>
 - <a href="#api_nan_set_named_property_handler"><b><code>Nan::SetNamedPropertyHandler()</code></b></a>
 - <a href="#api_nan_set_indexed_property_handler"><b><code>Nan::SetIndexedPropertyHandler()</code></b></a>
 - <a href="#api_nan_set_template"><b><code>Nan::SetTemplate()</code></b></a>
 - <a href="#api_nan_set_prototype_template"><b><code>Nan::SetPrototypeTemplate()</code></b></a>
 - <a href="#api_nan_set_instance_template"><b><code>Nan::SetInstanceTemplate()</code></b></a>
 - <a href="#api_nan_set_call_handler"><b><code>Nan::SetCallHandler()</code></b></a>
 - <a href="#api_nan_set_call_as_function_handler"><b><code>Nan::SetCallAsFunctionHandler()</code></b></a>

<a name="api_nan_function_callback_info"></a>
### Nan::FunctionCallbackInfo

`Nan::FunctionCallbackInfo` should be used in place of [`v8::FunctionCallbackInfo`](https://v8docs.nodesource.com/node-8.16/dd/d0d/classv8_1_1_function_callback_info.html), even with older versions of Node where `v8::FunctionCallbackInfo` does not exist.

Definition:

```c++
template<typename T> class FunctionCallbackInfo {
 public:
  ReturnValue<T> GetReturnValue() const;
  v8::Local<v8::Function> Callee(); // NOTE: Not available in NodeJS >= 10.0.0
  v8::Local<v8::Value> Data();
  v8::Local<v8::Object> Holder();
  bool IsConstructCall();
  int Length() const;
  v8::Local<v8::Value> operator[](int i) const;
  v8::Local<v8::Object> This() const;
  v8::Isolate *GetIsolate() const;
};
```

See the [`v8::FunctionCallbackInfo`](https://v8docs.nodesource.com/node-8.16/dd/d0d/classv8_1_1_function_callback_info.html) documentation for usage details on these. See [`Nan::ReturnValue`](#api_nan_return_value) for further information on how to set a return value from methods.

**Note:** `FunctionCallbackInfo::Callee` is removed in Node.js after `10.0.0` because it is was deprecated in V8. Consider using `info.Data()` to pass any information you need.

<a name="api_nan_property_callback_info"></a>
### Nan::PropertyCallbackInfo

`Nan::PropertyCallbackInfo` should be used in place of [`v8::PropertyCallbackInfo`](https://v8docs.nodesource.com/node-8.16/d7/dc5/classv8_1_1_property_callback_info.html), even with older versions of Node where `v8::PropertyCallbackInfo` does not exist.

Definition:

```c++
template<typename T> class PropertyCallbackInfo : public PropertyCallbackInfoBase<T> {
 public:
  ReturnValue<T> GetReturnValue() const;
  v8::Isolate* GetIsolate() const;
  v8::Local<v8::Value> Data() const;
  v8::Local<v8::Object> This() const;
  v8::Local<v8::Object> Holder() const;
};
```

See the [`v8::PropertyCallbackInfo`](https://v8docs.nodesource.com/node-8.16/d7/dc5/classv8_1_1_property_callback_info.html) documentation for usage details on these. See [`Nan::ReturnValue`](#api_nan_return_value) for further information on how to set a return value from property accessor methods.

<a name="api_nan_return_value"></a>
### Nan::ReturnValue

`Nan::ReturnValue` is used in place of [`v8::ReturnValue`](https://v8docs.nodesource.com/node-8.16/da/da7/classv8_1_1_return_value.html) on both [`Nan::FunctionCallbackInfo`](#api_nan_function_callback_info) and [`Nan::PropertyCallbackInfo`](#api_nan_property_callback_info) as the return type of `GetReturnValue()`.

Example usage:

```c++
void EmptyArray(const Nan::FunctionCallbackInfo<v8::Value>& info) {
  info.GetReturnValue().Set(Nan::New<v8::Array>());
}
```

Definition:

```c++
template<typename T> class ReturnValue {
 public:
  // Handle setters
  template <typename S> void Set(const v8::Local<S> &handle);
  template <typename S> void Set(const Nan::Global<S> &handle);

  // Fast primitive setters
  void Set(bool value);
  void Set(double i);
  void Set(int32_t i);
  void Set(uint32_t i);

  // Fast JS primitive setters
  void SetNull();
  void SetUndefined();
  void SetEmptyString();

  // Convenience getter for isolate
  v8::Isolate *GetIsolate() const;
};
```

See the documentation on [`v8::ReturnValue`](https://v8docs.nodesource.com/node-8.16/da/da7/classv8_1_1_return_value.html) for further information on this.

<a name="api_nan_method"></a>
### Method declaration

JavaScript-accessible methods should be declared with the following signature to form a `Nan::FunctionCallback`:

```c++
typedef void(*FunctionCallback)(const FunctionCallbackInfo<v8::Value>&);
```

Example:

```c++
void MethodName(const Nan::FunctionCallbackInfo<v8::Value>& info) {
  ...
}
```

You do not need to declare a new `HandleScope` within a method as one is implicitly created for you.

**Example usage**

```c++
// .h:
class Foo : public Nan::ObjectWrap {
  ...

  static void Bar(const Nan::FunctionCallbackInfo<v8::Value>& info);
  static void Baz(const Nan::FunctionCallbackInfo<v8::Value>& info);
}


// .cc:
void Foo::Bar(const Nan::FunctionCallbackInfo<v8::Value>& info) {
  ...
}

void Foo::Baz(const Nan::FunctionCallbackInfo<v8::Value>& info) {
  ...
}
```

A helper macro `NAN_METHOD(methodname)` exists, compatible with NAN v1 method declarations.

**Example usage with `NAN_METHOD(methodname)`**

```c++
// .h:
class Foo : public Nan::ObjectWrap {
  ...

  static NAN_METHOD(Bar);
  static NAN_METHOD(Baz);
}


// .cc:
NAN_METHOD(Foo::Bar) {
  ...
}

NAN_METHOD(Foo::Baz) {
  ...
}
```

Use [`Nan::SetPrototypeMethod`](#api_nan_set_prototype_method) to attach a method to a JavaScript function prototype or [`Nan::SetMethod`](#api_nan_set_method) to attach a method directly on a JavaScript object.

<a name="api_nan_getter"></a>
### Getter declaration

JavaScript-accessible getters should be declared with the following signature to form a `Nan::GetterCallback`:

```c++
typedef void(*GetterCallback)(v8::Local<v8::String>,
                              const PropertyCallbackInfo<v8::Value>&);
```

Example:

```c++
void GetterName(v8::Local<v8::String> property,
                const Nan::PropertyCallbackInfo<v8::Value>& info) {
  ...
}
```

You do not need to declare a new `HandleScope` within a getter as one is implicitly created for you.

A helper macro `NAN_GETTER(methodname)` exists, compatible with NAN v1 method declarations.

Also see the V8 Embedders Guide documentation on [Accessors](https://developers.google.com/v8/embed#accesssors).

<a name="api_nan_setter"></a>
### Setter declaration

JavaScript-accessible setters should be declared with the following signature to form a <b><code>Nan::SetterCallback</code></b>:

```c++
typedef void(*SetterCallback)(v8::Local<v8::String>,
                              v8::Local<v8::Value>,
                              const PropertyCallbackInfo<void>&);
```

Example:

```c++
void SetterName(v8::Local<v8::String> property,
                v8::Local<v8::Value> value,
                const Nan::PropertyCallbackInfo<void>& info) {
  ...
}
```

You do not need to declare a new `HandleScope` within a setter as one is implicitly created for you.

A helper macro `NAN_SETTER(methodname)` exists, compatible with NAN v1 method declarations.

Also see the V8 Embedders Guide documentation on [Accessors](https://developers.google.com/v8/embed#accesssors).

<a name="api_nan_property_getter"></a>
### Property getter declaration

JavaScript-accessible property getters should be declared with the following signature to form a <b><code>Nan::PropertyGetterCallback</code></b>:

```c++
typedef void(*PropertyGetterCallback)(v8::Local<v8::String>,
                                      const PropertyCallbackInfo<v8::Value>&);
```

Example:

```c++
void PropertyGetterName(v8::Local<v8::String> property,
                        const Nan::PropertyCallbackInfo<v8::Value>& info) {
  ...
}
```

You do not need to declare a new `HandleScope` within a property getter as one is implicitly created for you.

A helper macro `NAN_PROPERTY_GETTER(methodname)` exists, compatible with NAN v1 method declarations.

Also see the V8 Embedders Guide documentation on named property [Interceptors](https://developers.google.com/v8/embed#interceptors).

<a name="api_nan_property_setter"></a>
### Property setter declaration

JavaScript-accessible property setters should be declared with the following signature to form a <b><code>Nan::PropertySetterCallback</code></b>:

```c++
typedef void(*PropertySetterCallback)(v8::Local<v8::String>,
                                      v8::Local<v8::Value>,
                                      const PropertyCallbackInfo<v8::Value>&);
```

Example:

```c++
void PropertySetterName(v8::Local<v8::String> property,
                        v8::Local<v8::Value> value,
                        const Nan::PropertyCallbackInfo<v8::Value>& info);
```

You do not need to declare a new `HandleScope` within a property setter as one is implicitly created for you.

A helper macro `NAN_PROPERTY_SETTER(methodname)` exists, compatible with NAN v1 method declarations.

Also see the V8 Embedders Guide documentation on named property [Interceptors](https://developers.google.com/v8/embed#interceptors).

<a name="api_nan_property_enumerator"></a>
### Property enumerator declaration

JavaScript-accessible property enumerators should be declared with the following signature to form a <b><code>Nan::PropertyEnumeratorCallback</code></b>:

```c++
typedef void(*PropertyEnumeratorCallback)(const PropertyCallbackInfo<v8::Array>&);
```

Example:

```c++
void PropertyEnumeratorName(const Nan::PropertyCallbackInfo<v8::Array>& info);
```

You do not need to declare a new `HandleScope` within a property enumerator as one is implicitly created for you.

A helper macro `NAN_PROPERTY_ENUMERATOR(methodname)` exists, compatible with NAN v1 method declarations.

Also see the V8 Embedders Guide documentation on named property [Interceptors](https://developers.google.com/v8/embed#interceptors).

<a name="api_nan_property_deleter"></a>
### Property deleter declaration

JavaScript-accessible property deleters should be declared with the following signature to form a <b><code>Nan::PropertyDeleterCallback</code></b>:

```c++
typedef void(*PropertyDeleterCallback)(v8::Local<v8::String>,
                                       const PropertyCallbackInfo<v8::Boolean>&);
```

Example:

```c++
void PropertyDeleterName(v8::Local<v8::String> property,
                         const Nan::PropertyCallbackInfo<v8::Boolean>& info);
```

You do not need to declare a new `HandleScope` within a property deleter as one is implicitly created for you.

A helper macro `NAN_PROPERTY_DELETER(methodname)` exists, compatible with NAN v1 method declarations.

Also see the V8 Embedders Guide documentation on named property [Interceptors](https://developers.google.com/v8/embed#interceptors).

<a name="api_nan_property_query"></a>
### Property query declaration

JavaScript-accessible property query methods should be declared with the following signature to form a <b><code>Nan::PropertyQueryCallback</code></b>:

```c++
typedef void(*PropertyQueryCallback)(v8::Local<v8::String>,
                                     const PropertyCallbackInfo<v8::Integer>&);
```

Example:

```c++
void PropertyQueryName(v8::Local<v8::String> property,
                       const Nan::PropertyCallbackInfo<v8::Integer>& info);
```

You do not need to declare a new `HandleScope` within a property query method as one is implicitly created for you.

A helper macro `NAN_PROPERTY_QUERY(methodname)` exists, compatible with NAN v1 method declarations.

Also see the V8 Embedders Guide documentation on named property [Interceptors](https://developers.google.com/v8/embed#interceptors).

<a name="api_nan_index_getter"></a>
### Index getter declaration

JavaScript-accessible index getter methods should be declared with the following signature to form a <b><code>Nan::IndexGetterCallback</code></b>:

```c++
typedef void(*IndexGetterCallback)(uint32_t,
                                   const PropertyCallbackInfo<v8::Value>&);
```

Example:

```c++
void IndexGetterName(uint32_t index, const PropertyCallbackInfo<v8::Value>& info);
```

You do not need to declare a new `HandleScope` within a index getter as one is implicitly created for you.

A helper macro `NAN_INDEX_GETTER(methodname)` exists, compatible with NAN v1 method declarations.

Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://developers.google.com/v8/embed#interceptors).

<a name="api_nan_index_setter"></a>
### Index setter declaration

JavaScript-accessible index setter methods should be declared with the following signature to form a <b><code>Nan::IndexSetterCallback</code></b>:

```c++
typedef void(*IndexSetterCallback)(uint32_t,
                                   v8::Local<v8::Value>,
                                   const PropertyCallbackInfo<v8::Value>&);
```

Example:

```c++
void IndexSetterName(uint32_t index,
                     v8::Local<v8::Value> value,
                     const PropertyCallbackInfo<v8::Value>& info);
```

You do not need to declare a new `HandleScope` within a index setter as one is implicitly created for you.

A helper macro `NAN_INDEX_SETTER(methodname)` exists, compatible with NAN v1 method declarations.

Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://developers.google.com/v8/embed#interceptors).

<a name="api_nan_index_enumerator"></a>
### Index enumerator declaration

JavaScript-accessible index enumerator methods should be declared with the following signature to form a <b><code>Nan::IndexEnumeratorCallback</code></b>:

```c++
typedef void(*IndexEnumeratorCallback)(const PropertyCallbackInfo<v8::Array>&);
```

Example:

```c++
void IndexEnumeratorName(const PropertyCallbackInfo<v8::Array>& info);
```

You do not need to declare a new `HandleScope` within a index enumerator as one is implicitly created for you.

A helper macro `NAN_INDEX_ENUMERATOR(methodname)` exists, compatible with NAN v1 method declarations.

Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://developers.google.com/v8/embed#interceptors).

<a name="api_nan_index_deleter"></a>
### Index deleter declaration

JavaScript-accessible index deleter methods should be declared with the following signature to form a <b><code>Nan::IndexDeleterCallback</code></b>:

```c++
typedef void(*IndexDeleterCallback)(uint32_t,
                                    const PropertyCallbackInfo<v8::Boolean>&);
```

Example:

```c++
void IndexDeleterName(uint32_t index, const PropertyCallbackInfo<v8::Boolean>& info);
```

You do not need to declare a new `HandleScope` within a index deleter as one is implicitly created for you.

A helper macro `NAN_INDEX_DELETER(methodname)` exists, compatible with NAN v1 method declarations.

Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://developers.google.com/v8/embed#interceptors).

<a name="api_nan_index_query"></a>
### Index query declaration

JavaScript-accessible index query methods should be declared with the following signature to form a <b><code>Nan::IndexQueryCallback</code></b>:

```c++
typedef void(*IndexQueryCallback)(uint32_t,
                                  const PropertyCallbackInfo<v8::Integer>&);
```

Example:

```c++
void IndexQueryName(uint32_t index, const PropertyCallbackInfo<v8::Integer>& info);
```

You do not need to declare a new `HandleScope` within a index query method as one is implicitly created for you.

A helper macro `NAN_INDEX_QUERY(methodname)` exists, compatible with NAN v1 method declarations.

Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://developers.google.com/v8/embed#interceptors).

<a name="api_nan_set_method"></a>
### Nan::SetMethod()

Sets a method with a given name directly on a JavaScript object where the method has the `Nan::FunctionCallback` signature (see <a href="#api_nan_method">Method declaration</a>).

Signature:

```c++
void Nan::SetMethod(v8::Local<v8::Object> recv,
                    const char *name,
                    Nan::FunctionCallback callback,
                    v8::Local<v8::Value> data = v8::Local<v8::Value>())
void Nan::SetMethod(v8::Local<v8::Template> templ,
                    const char *name,
                    Nan::FunctionCallback callback,
                    v8::Local<v8::Value> data = v8::Local<v8::Value>())
```

<a name="api_nan_set_prototype_method"></a>
### Nan::SetPrototypeMethod()

Sets a method with a given name on a `FunctionTemplate`'s prototype where the method has the `Nan::FunctionCallback` signature (see <a href="#api_nan_method">Method declaration</a>).

Signature:

```c++
void Nan::SetPrototypeMethod(v8::Local<v8::FunctionTemplate> recv,
                             const char* name,
                             Nan::FunctionCallback callback,
                             v8::Local<v8::Value> data = v8::Local<v8::Value>())
```

<a name="api_nan_set_accessor"></a>
### Nan::SetAccessor()

Sets getters and setters for a property with a given name on an `ObjectTemplate` or a plain `Object`. Accepts getters with the `Nan::GetterCallback` signature (see <a href="#api_nan_getter">Getter declaration</a>) and setters with the `Nan::SetterCallback` signature (see <a href="#api_nan_setter">Setter declaration</a>).

Signature:

```c++
void SetAccessor(v8::Local<v8::ObjectTemplate> tpl,
                 v8::Local<v8::String> name,
                 Nan::GetterCallback getter,
                 Nan::SetterCallback setter = 0,
                 v8::Local<v8::Value> data = v8::Local<v8::Value>(),
                 v8::AccessControl settings = v8::DEFAULT,
                 v8::PropertyAttribute attribute = v8::None,
                 imp::Sig signature = imp::Sig());
bool SetAccessor(v8::Local<v8::Object> obj,
                 v8::Local<v8::String> name,
                 Nan::GetterCallback getter,
                 Nan::SetterCallback setter = 0,
                 v8::Local<v8::Value> data = v8::Local<v8::Value>(),
                 v8::AccessControl settings = v8::DEFAULT,
                 v8::PropertyAttribute attribute = v8::None)
```

See the V8 [`ObjectTemplate#SetAccessor()`](https://v8docs.nodesource.com/node-8.16/db/d5f/classv8_1_1_object_template.html#aca0ed196f8a9adb1f68b1aadb6c9cd77) and [`Object#SetAccessor()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#ae91b3b56b357f285288c89fbddc46d1b) for further information about how to use `Nan::SetAccessor()`.

<a name="api_nan_set_named_property_handler"></a>
### Nan::SetNamedPropertyHandler()

Sets named property getters, setters, query, deleter and enumerator methods on an `ObjectTemplate`. Accepts:

* Property getters with the `Nan::PropertyGetterCallback` signature (see <a href="#api_nan_property_getter">Property getter declaration</a>)
* Property setters with the `Nan::PropertySetterCallback` signature (see <a href="#api_nan_property_setter">Property setter declaration</a>)
* Property query methods with the `Nan::PropertyQueryCallback` signature (see <a href="#api_nan_property_query">Property query declaration</a>)
* Property deleters with the `Nan::PropertyDeleterCallback` signature (see <a href="#api_nan_property_deleter">Property deleter declaration</a>)
* Property enumerators with the `Nan::PropertyEnumeratorCallback` signature (see <a href="#api_nan_property_enumerator">Property enumerator declaration</a>)

Signature:

```c++
void SetNamedPropertyHandler(v8::Local<v8::ObjectTemplate> tpl,
                             Nan::PropertyGetterCallback getter,
                             Nan::PropertySetterCallback setter = 0,
                             Nan::PropertyQueryCallback query = 0,
                             Nan::PropertyDeleterCallback deleter = 0,
                             Nan::PropertyEnumeratorCallback enumerator = 0,
                             v8::Local<v8::Value> data = v8::Local<v8::Value>())
```

See the V8 [`ObjectTemplate#SetNamedPropertyHandler()`](https://v8docs.nodesource.com/node-8.16/db/d5f/classv8_1_1_object_template.html#a33b3ebd7de641f6cc6414b7de01fc1c7) for further information about how to use `Nan::SetNamedPropertyHandler()`.

<a name="api_nan_set_indexed_property_handler"></a>
### Nan::SetIndexedPropertyHandler()

Sets indexed property getters, setters, query, deleter and enumerator methods on an `ObjectTemplate`. Accepts:

* Indexed property getters with the `Nan::IndexGetterCallback` signature (see <a href="#api_nan_index_getter">Index getter declaration</a>)
* Indexed property setters with the `Nan::IndexSetterCallback` signature (see <a href="#api_nan_index_setter">Index setter declaration</a>)
* Indexed property query methods with the `Nan::IndexQueryCallback` signature (see <a href="#api_nan_index_query">Index query declaration</a>)
* Indexed property deleters with the `Nan::IndexDeleterCallback` signature (see <a href="#api_nan_index_deleter">Index deleter declaration</a>)
* Indexed property enumerators with the `Nan::IndexEnumeratorCallback` signature (see <a href="#api_nan_index_enumerator">Index enumerator declaration</a>)

Signature:

```c++
void SetIndexedPropertyHandler(v8::Local<v8::ObjectTemplate> tpl,
                               Nan::IndexGetterCallback getter,
                               Nan::IndexSetterCallback setter = 0,
                               Nan::IndexQueryCallback query = 0,
                               Nan::IndexDeleterCallback deleter = 0,
                               Nan::IndexEnumeratorCallback enumerator = 0,
                               v8::Local<v8::Value> data = v8::Local<v8::Value>())
```

See the V8 [`ObjectTemplate#SetIndexedPropertyHandler()`](https://v8docs.nodesource.com/node-8.16/db/d5f/classv8_1_1_object_template.html#ac89f06d634add0e890452033f7d17ff1) for further information about how to use `Nan::SetIndexedPropertyHandler()`.

<a name="api_nan_set_template"></a>
### Nan::SetTemplate()

Adds properties on an `Object`'s or `Function`'s template.

Signature:

```c++
void Nan::SetTemplate(v8::Local<v8::Template> templ,
                      const char *name,
                      v8::Local<v8::Data> value);
void Nan::SetTemplate(v8::Local<v8::Template> templ,
                      v8::Local<v8::String> name,
                      v8::Local<v8::Data> value,
                      v8::PropertyAttribute attributes)
```

Calls the `Template`'s [`Set()`](https://v8docs.nodesource.com/node-8.16/db/df7/classv8_1_1_template.html#ae3fbaff137557aa6a0233bc7e52214ac).

<a name="api_nan_set_prototype_template"></a>
### Nan::SetPrototypeTemplate()

Adds properties on an `Object`'s or `Function`'s prototype template.

Signature:

```c++
void Nan::SetPrototypeTemplate(v8::Local<v8::FunctionTemplate> templ,
                               const char *name,
                               v8::Local<v8::Data> value);
void Nan::SetPrototypeTemplate(v8::Local<v8::FunctionTemplate> templ,
                               v8::Local<v8::String> name,
                               v8::Local<v8::Data> value,
                               v8::PropertyAttribute attributes)
```

Calls the `FunctionTemplate`'s _PrototypeTemplate's_ [`Set()`](https://v8docs.nodesource.com/node-8.16/db/df7/classv8_1_1_template.html#a2db6a56597bf23c59659c0659e564ddf).

<a name="api_nan_set_instance_template"></a>
### Nan::SetInstanceTemplate()

Use to add instance properties on `FunctionTemplate`'s.

Signature:

```c++
void Nan::SetInstanceTemplate(v8::Local<v8::FunctionTemplate> templ,
                              const char *name,
                              v8::Local<v8::Data> value);
void Nan::SetInstanceTemplate(v8::Local<v8::FunctionTemplate> templ,
                              v8::Local<v8::String> name,
                              v8::Local<v8::Data> value,
                              v8::PropertyAttribute attributes)
```

Calls the `FunctionTemplate`'s _InstanceTemplate's_ [`Set()`](https://v8docs.nodesource.com/node-8.16/db/df7/classv8_1_1_template.html#a2db6a56597bf23c59659c0659e564ddf).

<a name="api_nan_set_call_handler"></a>
### Nan::SetCallHandler()

Set the call-handler callback for a `v8::FunctionTemplate`.
This callback is called whenever the function created from this FunctionTemplate is called.

Signature:

```c++
void Nan::SetCallHandler(v8::Local<v8::FunctionTemplate> templ, Nan::FunctionCallback callback, v8::Local<v8::Value> data = v8::Local<v8::Value>())
```

Calls the `FunctionTemplate`'s [`SetCallHandler()`](https://v8docs.nodesource.com/node-8.16/d8/d83/classv8_1_1_function_template.html#ab7574b298db3c27fbc2ed465c08ea2f8).

<a name="api_nan_set_call_as_function_handler"></a>
### Nan::SetCallAsFunctionHandler()

Sets the callback to be used when calling instances created from the `v8::ObjectTemplate` as a function.
If no callback is set, instances behave like normal JavaScript objects that cannot be called as a function.

Signature:

```c++
void Nan::SetCallAsFunctionHandler(v8::Local<v8::ObjectTemplate> templ, Nan::FunctionCallback callback, v8::Local<v8::Value> data = v8::Local<v8::Value>())
```

Calls the `ObjectTemplate`'s [`SetCallAsFunctionHandler()`](https://v8docs.nodesource.com/node-8.16/db/d5f/classv8_1_1_object_template.html#a5e9612fc80bf6db8f2da199b9b0bd04e).

## New

NAN provides a `Nan::New()` helper for the creation of new JavaScript objects in a way that's compatible across the supported versions of V8.

 - <a href="#api_nan_new"><b><code>Nan::New()</code></b></a>
 - <a href="#api_nan_undefined"><b><code>Nan::Undefined()</code></b></a>
 - <a href="#api_nan_null"><b><code>Nan::Null()</code></b></a>
 - <a href="#api_nan_true"><b><code>Nan::True()</code></b></a>
 - <a href="#api_nan_false"><b><code>Nan::False()</code></b></a>
 - <a href="#api_nan_empty_string"><b><code>Nan::EmptyString()</code></b></a>


<a name="api_nan_new"></a>
### Nan::New()

`Nan::New()` should be used to instantiate new JavaScript objects.

Refer to the specific V8 type in the [V8 documentation](https://v8docs.nodesource.com/node-8.16/d1/d83/classv8_1_1_data.html) for information on the types of arguments required for instantiation.

Signatures:

Return types are mostly omitted from the signatures for simplicity. In most cases the type will be contained within a `v8::Local<T>`. The following types will be contained within a `Nan::MaybeLocal<T>`: `v8::String`, `v8::Date`, `v8::RegExp`, `v8::Script`, `v8::UnboundScript`.

Empty objects:

```c++
Nan::New<T>();
```

Generic single and multiple-argument:

```c++
Nan::New<T>(A0 arg0);
Nan::New<T>(A0 arg0, A1 arg1);
Nan::New<T>(A0 arg0, A1 arg1, A2 arg2);
Nan::New<T>(A0 arg0, A1 arg1, A2 arg2, A3 arg3);
```

For creating `v8::FunctionTemplate` and `v8::Function` objects:

_The definition of `Nan::FunctionCallback` can be found in the [Method declaration](./methods.md#api_nan_method) documentation._

```c++
Nan::New<T>(Nan::FunctionCallback callback,
            v8::Local<v8::Value> data = v8::Local<v8::Value>());
Nan::New<T>(Nan::FunctionCallback callback,
            v8::Local<v8::Value> data = v8::Local<v8::Value>(),
            A2 a2 = A2());
```

Native number types:

```c++
v8::Local<v8::Boolean> Nan::New<T>(bool value);
v8::Local<v8::Int32> Nan::New<T>(int32_t value);
v8::Local<v8::Uint32> Nan::New<T>(uint32_t value);
v8::Local<v8::Number> Nan::New<T>(double value);
```

String types:

```c++
Nan::MaybeLocal<v8::String> Nan::New<T>(std::string const& value);
Nan::MaybeLocal<v8::String> Nan::New<T>(const char * value, int length);
Nan::MaybeLocal<v8::String> Nan::New<T>(const char * value);
Nan::MaybeLocal<v8::String> Nan::New<T>(const uint16_t * value);
Nan::MaybeLocal<v8::String> Nan::New<T>(const uint16_t * value, int length);
```

Specialized types:

```c++
v8::Local<v8::String> Nan::New<T>(v8::String::ExternalStringResource * value);
v8::Local<v8::String> Nan::New<T>(Nan::ExternalOneByteStringResource * value);
v8::Local<v8::RegExp> Nan::New<T>(v8::Local<v8::String> pattern, v8::RegExp::Flags flags);
```

Note that `Nan::ExternalOneByteStringResource` maps to [`v8::String::ExternalOneByteStringResource`](https://v8docs.nodesource.com/node-8.16/d9/db3/classv8_1_1_string_1_1_external_one_byte_string_resource.html), and `v8::String::ExternalAsciiStringResource` in older versions of V8.


<a name="api_nan_undefined"></a>
### Nan::Undefined()

A helper method to reference the `v8::Undefined` object in a way that is compatible across all supported versions of V8.

Signature:

```c++
v8::Local<v8::Primitive> Nan::Undefined()
```

<a name="api_nan_null"></a>
### Nan::Null()

A helper method to reference the `v8::Null` object in a way that is compatible across all supported versions of V8.

Signature:

```c++
v8::Local<v8::Primitive> Nan::Null()
```

<a name="api_nan_true"></a>
### Nan::True()

A helper method to reference the `v8::Boolean` object representing the `true` value in a way that is compatible across all supported versions of V8.

Signature:

```c++
v8::Local<v8::Boolean> Nan::True()
```

<a name="api_nan_false"></a>
### Nan::False()

A helper method to reference the `v8::Boolean` object representing the `false` value in a way that is compatible across all supported versions of V8.

Signature:

```c++
v8::Local<v8::Boolean> Nan::False()
```

<a name="api_nan_empty_string"></a>
### Nan::EmptyString()

Call [`v8::String::Empty`](https://v8docs.nodesource.com/node-8.16/d2/db3/classv8_1_1_string.html#a7c1bc8886115d7ee46f1d571dd6ebc6d) to reference the empty string in a way that is compatible across all supported versions of V8.

Signature:

```c++
v8::Local<v8::String> Nan::EmptyString()
```


<a name="api_nan_new_one_byte_string"></a>
### Nan::NewOneByteString()

An implementation of [`v8::String::NewFromOneByte()`](https://v8docs.nodesource.com/node-8.16/d2/db3/classv8_1_1_string.html#a5264d50b96d2c896ce525a734dc10f09) provided for consistent availability and API across supported versions of V8. Allocates a new string from Latin-1 data.

Signature:

```c++
Nan::MaybeLocal<v8::String> Nan::NewOneByteString(const uint8_t * value,
                                                  int length = -1)
```
## Miscellaneous Node Helpers

 - <a href="#api_nan_asyncresource"><b><code>Nan::AsyncResource</code></b></a>
 - <a href="#api_nan_make_callback"><b><code>Nan::MakeCallback()</code></b></a>
 - <a href="#api_nan_module_init"><b><code>NAN_MODULE_INIT()</code></b></a>
 - <a href="#api_nan_export"><b><code>Nan::Export()</code></b></a>

<a name="api_nan_asyncresource"></a>
### Nan::AsyncResource

This class is analogous to the `AsyncResource` JavaScript class exposed by Node's [async_hooks][] API.

When calling back into JavaScript asynchronously, special care must be taken to ensure that the runtime can properly track
async hops. `Nan::AsyncResource` is a class that provides an RAII wrapper around `node::EmitAsyncInit`, `node::EmitAsyncDestroy`,
and `node::MakeCallback`. Using this mechanism to call back into JavaScript, as opposed to `Nan::MakeCallback` or
`v8::Function::Call` ensures that the callback is executed in the correct async context. This ensures that async mechanisms
such as domains and [async_hooks][] function correctly.

Definition:

```c++
class AsyncResource {
 public:
  AsyncResource(v8::Local<v8::String> name,
                v8::Local<v8::Object> resource = New<v8::Object>());
  AsyncResource(const char* name,
                v8::Local<v8::Object> resource = New<v8::Object>());
  ~AsyncResource();

  v8::MaybeLocal<v8::Value> runInAsyncScope(v8::Local<v8::Object> target,
                                            v8::Local<v8::Function> func,
                                            int argc,
                                            v8::Local<v8::Value>* argv);
  v8::MaybeLocal<v8::Value> runInAsyncScope(v8::Local<v8::Object> target,
                                            v8::Local<v8::String> symbol,
                                            int argc,
                                            v8::Local<v8::Value>* argv);
  v8::MaybeLocal<v8::Value> runInAsyncScope(v8::Local<v8::Object> target,
                                            const char* method,
                                            int argc,
                                            v8::Local<v8::Value>* argv);
};
```

* `name`: Identifier for the kind of resource that is being provided for diagnostics information exposed by the [async_hooks][]
  API. This will be passed to the possible `init` hook as the `type`. To avoid name collisions with other modules we recommend
  that the name include the name of the owning module as a prefix. For example `mysql` module could use something like
  `mysql:batch-db-query-resource`.
* `resource`: An optional object associated with the async work that will be passed to the possible [async_hooks][]
  `init` hook. If this parameter is omitted, or an empty handle is provided, this object will be created automatically.
* When calling JS on behalf of this resource, one can use `runInAsyncScope`. This will ensure that the callback runs in the
  correct async execution context.
* `AsyncDestroy` is automatically called when an AsyncResource object is destroyed.

For more details, see the Node [async_hooks][] documentation. You might also want to take a look at the documentation for the
[N-API counterpart][napi]. For example usage, see the `asyncresource.cpp` example in the `test/cpp` directory.

<a name="api_nan_make_callback"></a>
### Nan::MakeCallback()

Deprecated wrappers around the legacy `node::MakeCallback()` APIs. Node.js 10+
has deprecated these legacy APIs as they do not provide a mechanism to preserve
async context.

We recommend that you use the `AsyncResource` class and `AsyncResource::runInAsyncScope` instead of using `Nan::MakeCallback` or
`v8::Function#Call()` directly. `AsyncResource` properly takes care of running the callback in the correct async execution
context – something that is essential for functionality like domains, async_hooks and async debugging.

Signatures:

```c++
NAN_DEPRECATED
v8::Local<v8::Value> Nan::MakeCallback(v8::Local<v8::Object> target,
                                       v8::Local<v8::Function> func,
                                       int argc,
                                       v8::Local<v8::Value>* argv);
NAN_DEPRECATED
v8::Local<v8::Value> Nan::MakeCallback(v8::Local<v8::Object> target,
                                       v8::Local<v8::String> symbol,
                                       int argc,
                                       v8::Local<v8::Value>* argv);
NAN_DEPRECATED
v8::Local<v8::Value> Nan::MakeCallback(v8::Local<v8::Object> target,
                                       const char* method,
                                       int argc,
                                       v8::Local<v8::Value>* argv);
```


<a name="api_nan_module_init"></a>
### NAN_MODULE_INIT()

Used to define the entry point function to a Node add-on. Creates a function with a given `name` that receives a `target` object representing the equivalent of the JavaScript `exports` object.

See example below.

<a name="api_nan_export"></a>
### Nan::Export()

A simple helper to register a `v8::FunctionTemplate` from a JavaScript-accessible method (see [Methods](./methods.md)) as a property on an object. Can be used in a way similar to assigning properties to `module.exports` in JavaScript.

Signature:

```c++
void Export(v8::Local<v8::Object> target, const char *name, Nan::FunctionCallback f)
```

Also available as the shortcut `NAN_EXPORT` macro.

Example:

```c++
NAN_METHOD(Foo) {
  ...
}

NAN_MODULE_INIT(Init) {
  NAN_EXPORT(target, Foo);
}
```

[async_hooks]: https://nodejs.org/dist/latest-v9.x/docs/api/async_hooks.html
[napi]: https://nodejs.org/dist/latest-v9.x/docs/api/n-api.html#n_api_custom_asynchronous_operations
## Object Wrappers

The `ObjectWrap` class can be used to make wrapped C++ objects and a factory of wrapped objects.

 - <a href="#api_nan_object_wrap"><b><code>Nan::ObjectWrap</code></b></a>


<a name="api_nan_object_wrap"></a>
### Nan::ObjectWrap()

A reimplementation of `node::ObjectWrap` that adds some API not present in older versions of Node. Should be preferred over `node::ObjectWrap` in all cases for consistency.

Definition:

```c++
class ObjectWrap {
 public:
  ObjectWrap();

  virtual ~ObjectWrap();

  template <class T>
  static inline T* Unwrap(v8::Local<v8::Object> handle);

  inline v8::Local<v8::Object> handle();

  inline Nan::Persistent<v8::Object>& persistent();

 protected:
  inline void Wrap(v8::Local<v8::Object> handle);

  inline void MakeWeak();

  /* Ref() marks the object as being attached to an event loop.
   * Refed objects will not be garbage collected, even if
   * all references are lost.
   */
  virtual void Ref();

  /* Unref() marks an object as detached from the event loop.  This is its
   * default state.  When an object with a "weak" reference changes from
   * attached to detached state it will be freed. Be careful not to access
   * the object after making this call as it might be gone!
   * (A "weak reference" means an object that only has a
   * persistent handle.)
   *
   * DO NOT CALL THIS FROM DESTRUCTOR
   */
  virtual void Unref();

  int refs_;  // ro
};
```

See the Node documentation on [Wrapping C++ Objects](https://nodejs.org/api/addons.html#addons_wrapping_c_objects) for more details.

### This vs. Holder

When calling `Unwrap`, it is important that the argument is indeed some JavaScript object which got wrapped by a `Wrap` call for this class or any derived class.
The `Signature` installed by [`Nan::SetPrototypeMethod()`](methods.md#api_nan_set_prototype_method) does ensure that `info.Holder()` is just such an instance.
In Node 0.12 and later, `info.This()` will also be of such a type, since otherwise the invocation will get rejected.
However, in Node 0.10 and before it was possible to invoke a method on a JavaScript object which just had the extension type in its prototype chain.
In such a situation, calling `Unwrap` on `info.This()` will likely lead to a failed assertion causing a crash, but could lead to even more serious corruption.

On the other hand, calling `Unwrap` in an [accessor](methods.md#api_nan_set_accessor) should not use `Holder()` if the accessor is defined on the prototype.
So either define your accessors on the instance template,
or use `This()` after verifying that it is indeed a valid object.

### Examples

#### Basic

```c++
class MyObject : public Nan::ObjectWrap {
 public:
  static NAN_MODULE_INIT(Init) {
    v8::Local<v8::FunctionTemplate> tpl = Nan::New<v8::FunctionTemplate>(New);
    tpl->SetClassName(Nan::New("MyObject").ToLocalChecked());
    tpl->InstanceTemplate()->SetInternalFieldCount(1);

    Nan::SetPrototypeMethod(tpl, "getHandle", GetHandle);
    Nan::SetPrototypeMethod(tpl, "getValue", GetValue);

    constructor().Reset(Nan::GetFunction(tpl).ToLocalChecked());
    Nan::Set(target, Nan::New("MyObject").ToLocalChecked(),
      Nan::GetFunction(tpl).ToLocalChecked());
  }

 private:
  explicit MyObject(double value = 0) : value_(value) {}
  ~MyObject() {}

  static NAN_METHOD(New) {
    if (info.IsConstructCall()) {
      double value = info[0]->IsUndefined() ? 0 : Nan::To<double>(info[0]).FromJust();
      MyObject *obj = new MyObject(value);
      obj->Wrap(info.This());
      info.GetReturnValue().Set(info.This());
    } else {
      const int argc = 1;
      v8::Local<v8::Value> argv[argc] = {info[0]};
      v8::Local<v8::Function> cons = Nan::New(constructor());
      info.GetReturnValue().Set(Nan::NewInstance(cons, argc, argv).ToLocalChecked());
    }
  }

  static NAN_METHOD(GetHandle) {
    MyObject* obj = Nan::ObjectWrap::Unwrap<MyObject>(info.Holder());
    info.GetReturnValue().Set(obj->handle());
  }

  static NAN_METHOD(GetValue) {
    MyObject* obj = Nan::ObjectWrap::Unwrap<MyObject>(info.Holder());
    info.GetReturnValue().Set(obj->value_);
  }

  static inline Nan::Persistent<v8::Function> & constructor() {
    static Nan::Persistent<v8::Function> my_constructor;
    return my_constructor;
  }

  double value_;
};

NODE_MODULE(objectwrapper, MyObject::Init)
```

To use in Javascript:

```Javascript
var objectwrapper = require('bindings')('objectwrapper');

var obj = new objectwrapper.MyObject(5);
console.log('Should be 5: ' + obj.getValue());
```

#### Factory of wrapped objects

```c++
class MyFactoryObject : public Nan::ObjectWrap {
 public:
  static NAN_MODULE_INIT(Init) {
    v8::Local<v8::FunctionTemplate> tpl = Nan::New<v8::FunctionTemplate>(New);
    tpl->InstanceTemplate()->SetInternalFieldCount(1);

    Nan::SetPrototypeMethod(tpl, "getValue", GetValue);

    constructor().Reset(Nan::GetFunction(tpl).ToLocalChecked());
  }

  static NAN_METHOD(NewInstance) {
    v8::Local<v8::Function> cons = Nan::New(constructor());
    double value = info[0]->IsNumber() ? Nan::To<double>(info[0]).FromJust() : 0;
    const int argc = 1;
    v8::Local<v8::Value> argv[1] = {Nan::New(value)};
    info.GetReturnValue().Set(Nan::NewInstance(cons, argc, argv).ToLocalChecked());
  }

  // Needed for the next example:
  inline double value() const {
    return value_;
  }

 private:
  explicit MyFactoryObject(double value = 0) : value_(value) {}
  ~MyFactoryObject() {}

  static NAN_METHOD(New) {
    if (info.IsConstructCall()) {
      double value = info[0]->IsNumber() ? Nan::To<double>(info[0]).FromJust() : 0;
      MyFactoryObject * obj = new MyFactoryObject(value);
      obj->Wrap(info.This());
      info.GetReturnValue().Set(info.This());
    } else {
      const int argc = 1;
      v8::Local<v8::Value> argv[argc] = {info[0]};
      v8::Local<v8::Function> cons = Nan::New(constructor());
      info.GetReturnValue().Set(Nan::NewInstance(cons, argc, argv).ToLocalChecked());
    }
  }

  static NAN_METHOD(GetValue) {
    MyFactoryObject* obj = ObjectWrap::Unwrap<MyFactoryObject>(info.Holder());
    info.GetReturnValue().Set(obj->value_);
  }

  static inline Nan::Persistent<v8::Function> & constructor() {
    static Nan::Persistent<v8::Function> my_constructor;
    return my_constructor;
  }

  double value_;
};

NAN_MODULE_INIT(Init) {
  MyFactoryObject::Init(target);
  Nan::Set(target,
    Nan::New<v8::String>("newFactoryObjectInstance").ToLocalChecked(),
    Nan::GetFunction(
      Nan::New<v8::FunctionTemplate>(MyFactoryObject::NewInstance)).ToLocalChecked()
  );
}

NODE_MODULE(wrappedobjectfactory, Init)
```

To use in Javascript:

```Javascript
var wrappedobjectfactory = require('bindings')('wrappedobjectfactory');

var obj = wrappedobjectfactory.newFactoryObjectInstance(10);
console.log('Should be 10: ' + obj.getValue());
```

#### Passing wrapped objects around

Use the `MyFactoryObject` class above along with the following:

```c++
static NAN_METHOD(Sum) {
  Nan::MaybeLocal<v8::Object> maybe1 = Nan::To<v8::Object>(info[0]);
  Nan::MaybeLocal<v8::Object> maybe2 = Nan::To<v8::Object>(info[1]);

  // Quick check:
  if (maybe1.IsEmpty() || maybe2.IsEmpty()) {
    // return value is undefined by default
    return;
  }

  MyFactoryObject* obj1 =
    Nan::ObjectWrap::Unwrap<MyFactoryObject>(maybe1.ToLocalChecked());
  MyFactoryObject* obj2 =
    Nan::ObjectWrap::Unwrap<MyFactoryObject>(maybe2.ToLocalChecked());

  info.GetReturnValue().Set(Nan::New<v8::Number>(obj1->value() + obj2->value()));
}

NAN_MODULE_INIT(Init) {
  MyFactoryObject::Init(target);
  Nan::Set(target,
    Nan::New<v8::String>("newFactoryObjectInstance").ToLocalChecked(),
    Nan::GetFunction(
      Nan::New<v8::FunctionTemplate>(MyFactoryObject::NewInstance)).ToLocalChecked()
  );
  Nan::Set(target,
    Nan::New<v8::String>("sum").ToLocalChecked(),
    Nan::GetFunction(Nan::New<v8::FunctionTemplate>(Sum)).ToLocalChecked()
  );
}

NODE_MODULE(myaddon, Init)
```

To use in Javascript:

```Javascript
var myaddon = require('bindings')('myaddon');

var obj1 = myaddon.newFactoryObjectInstance(5);
var obj2 = myaddon.newFactoryObjectInstance(10);
console.log('sum of object values: ' + myaddon.sum(obj1, obj2));
```
## Persistent references

An object reference that is independent of any `HandleScope` is a _persistent_ reference. Where a `Local` handle only lives as long as the `HandleScope` in which it was allocated, a `Persistent` handle remains valid until it is explicitly disposed.

Due to the evolution of the V8 API, it is necessary for NAN to provide a wrapper implementation of the `Persistent` classes to supply compatibility across the V8 versions supported.

 - <a href="#api_nan_persistent_base"><b><code>Nan::PersistentBase & v8::PersistentBase</code></b></a>
 - <a href="#api_nan_non_copyable_persistent_traits"><b><code>Nan::NonCopyablePersistentTraits & v8::NonCopyablePersistentTraits</code></b></a>
 - <a href="#api_nan_copyable_persistent_traits"><b><code>Nan::CopyablePersistentTraits & v8::CopyablePersistentTraits</code></b></a>
 - <a href="#api_nan_persistent"><b><code>Nan::Persistent</code></b></a>
 - <a href="#api_nan_global"><b><code>Nan::Global</code></b></a>
 - <a href="#api_nan_weak_callback_info"><b><code>Nan::WeakCallbackInfo</code></b></a>
 - <a href="#api_nan_weak_callback_type"><b><code>Nan::WeakCallbackType</code></b></a>

Also see the V8 Embedders Guide section on [Handles and Garbage Collection](https://developers.google.com/v8/embed#handles).

<a name="api_nan_persistent_base"></a>
### Nan::PersistentBase & v8::PersistentBase

A persistent handle contains a reference to a storage cell in V8 which holds an object value and which is updated by the garbage collector whenever the object is moved. A new storage cell can be created using the constructor or `Nan::PersistentBase::Reset()`. Existing handles can be disposed using an argument-less `Nan::PersistentBase::Reset()`.

Definition:

_(note: this is implemented as `Nan::PersistentBase` for older versions of V8 and the native `v8::PersistentBase` is used for newer versions of V8)_

```c++
template<typename T> class PersistentBase {
 public:
  /**
   * If non-empty, destroy the underlying storage cell
   */
  void Reset();

  /**
   * If non-empty, destroy the underlying storage cell and create a new one with
   * the contents of another if it is also non-empty
   */
  template<typename S> void Reset(const v8::Local<S> &other);

  /**
   * If non-empty, destroy the underlying storage cell and create a new one with
   * the contents of another if it is also non-empty
   */
  template<typename S> void Reset(const PersistentBase<S> &other);

  /** Returns true if the handle is empty. */
  bool IsEmpty() const;

  /**
   * If non-empty, destroy the underlying storage cell
   * IsEmpty() will return true after this call.
   */
  void Empty();

  template<typename S> bool operator==(const PersistentBase<S> &that);

  template<typename S> bool operator==(const v8::Local<S> &that);

  template<typename S> bool operator!=(const PersistentBase<S> &that);

  template<typename S> bool operator!=(const v8::Local<S> &that);

   /**
   *  Install a finalization callback on this object.
   *  NOTE: There is no guarantee as to *when* or even *if* the callback is
   *  invoked. The invocation is performed solely on a best effort basis.
   *  As always, GC-based finalization should *not* be relied upon for any
   *  critical form of resource management! At the moment you can either
   *  specify a parameter for the callback or the location of two internal
   *  fields in the dying object.
   */
  template<typename P>
  void SetWeak(P *parameter,
               typename WeakCallbackInfo<P>::Callback callback,
               WeakCallbackType type);

  void ClearWeak();

  /**
   * Marks the reference to this object independent. Garbage collector is free
   * to ignore any object groups containing this object. Weak callback for an
   * independent handle should not assume that it will be preceded by a global
   * GC prologue callback or followed by a global GC epilogue callback.
   */
  void MarkIndependent() const;

  bool IsIndependent() const;

  /** Checks if the handle holds the only reference to an object. */
  bool IsNearDeath() const;

  /** Returns true if the handle's reference is weak.  */
  bool IsWeak() const
};
```

See the V8 documentation for [`PersistentBase`](https://v8docs.nodesource.com/node-8.16/d4/dca/classv8_1_1_persistent_base.html) for further information.

**Tip:** To get a `v8::Local` reference to the original object back from a `PersistentBase` or `Persistent` object:

```c++
v8::Local<v8::Object> object = Nan::New(persistent);
```

<a name="api_nan_non_copyable_persistent_traits"></a>
### Nan::NonCopyablePersistentTraits & v8::NonCopyablePersistentTraits

Default traits for `Nan::Persistent`. This class does not allow use of the a copy constructor or assignment operator. At present `kResetInDestructor` is not set, but that will change in a future version.

Definition:

_(note: this is implemented as `Nan::NonCopyablePersistentTraits` for older versions of V8 and the native `v8::NonCopyablePersistentTraits` is used for newer versions of V8)_

```c++
template<typename T> class NonCopyablePersistentTraits {
 public:
  typedef Persistent<T, NonCopyablePersistentTraits<T> > NonCopyablePersistent;

  static const bool kResetInDestructor = false;

  template<typename S, typename M>
  static void Copy(const Persistent<S, M> &source,
                   NonCopyablePersistent *dest);

  template<typename O> static void Uncompilable();
};
```

See the V8 documentation for [`NonCopyablePersistentTraits`](https://v8docs.nodesource.com/node-8.16/de/d73/classv8_1_1_non_copyable_persistent_traits.html) for further information.

<a name="api_nan_copyable_persistent_traits"></a>
### Nan::CopyablePersistentTraits & v8::CopyablePersistentTraits

A helper class of traits to allow copying and assignment of `Persistent`. This will clone the contents of storage cell, but not any of the flags, etc..

Definition:

_(note: this is implemented as `Nan::CopyablePersistentTraits` for older versions of V8 and the native `v8::NonCopyablePersistentTraits` is used for newer versions of V8)_

```c++
template<typename T>
class CopyablePersistentTraits {
 public:
  typedef Persistent<T, CopyablePersistentTraits<T> > CopyablePersistent;

  static const bool kResetInDestructor = true;

  template<typename S, typename M>
  static void Copy(const Persistent<S, M> &source,
                   CopyablePersistent *dest);
};
```

See the V8 documentation for [`CopyablePersistentTraits`](https://v8docs.nodesource.com/node-8.16/da/d5c/structv8_1_1_copyable_persistent_traits.html) for further information.

<a name="api_nan_persistent"></a>
### Nan::Persistent

A type of `PersistentBase` which allows copy and assignment. Copy, assignment and destructor behavior is controlled by the traits class `M`.

Definition:

```c++
template<typename T, typename M = NonCopyablePersistentTraits<T> >
class Persistent;

template<typename T, typename M> class Persistent : public PersistentBase<T> {
 public:
 /**
  * A Persistent with no storage cell.
  */
  Persistent();

  /**
   * Construct a Persistent from a v8::Local. When the v8::Local is non-empty, a
   * new storage cell is created pointing to the same object, and no flags are
   * set.
   */
  template<typename S> Persistent(v8::Local<S> that);

  /**
   * Construct a Persistent from a Persistent. When the Persistent is non-empty,
   * a new storage cell is created pointing to the same object, and no flags are
   * set.
   */
  Persistent(const Persistent &that);

  /**
   * The copy constructors and assignment operator create a Persistent exactly
   * as the Persistent constructor, but the Copy function from the traits class
   * is called, allowing the setting of flags based on the copied Persistent.
   */
  Persistent &operator=(const Persistent &that);

  template <typename S, typename M2>
  Persistent &operator=(const Persistent<S, M2> &that);

  /**
   * The destructor will dispose the Persistent based on the kResetInDestructor
   * flags in the traits class.  Since not calling dispose can result in a
   * memory leak, it is recommended to always set this flag.
   */
  ~Persistent();
};
```

See the V8 documentation for [`Persistent`](https://v8docs.nodesource.com/node-8.16/d2/d78/classv8_1_1_persistent.html) for further information.

<a name="api_nan_global"></a>
### Nan::Global

A type of `PersistentBase` which has move semantics.

```c++
template<typename T> class Global : public PersistentBase<T> {
 public:
  /**
   * A Global with no storage cell.
   */
  Global();

  /**
   * Construct a Global from a v8::Local. When the v8::Local is non-empty, a new
   * storage cell is created pointing to the same object, and no flags are set.
   */
  template<typename S> Global(v8::Local<S> that);
  /**
   * Construct a Global from a PersistentBase. When the Persistent is non-empty,
   * a new storage cell is created pointing to the same object, and no flags are
   * set.
   */
  template<typename S> Global(const PersistentBase<S> &that);

  /**
   * Pass allows returning globals from functions, etc.
   */
  Global Pass();
};
```

See the V8 documentation for [`Global`](https://v8docs.nodesource.com/node-8.16/d5/d40/classv8_1_1_global.html) for further information.

<a name="api_nan_weak_callback_info"></a>
### Nan::WeakCallbackInfo

`Nan::WeakCallbackInfo` is used as an argument when setting a persistent reference as weak. You may need to free any external resources attached to the object. It is a mirror of `v8:WeakCallbackInfo` as found in newer versions of V8.

Definition:

```c++
template<typename T> class WeakCallbackInfo {
 public:
  typedef void (*Callback)(const WeakCallbackInfo<T>& data);

  v8::Isolate *GetIsolate() const;

  /**
   * Get the parameter that was associated with the weak handle.
   */
  T *GetParameter() const;

  /**
   * Get pointer from internal field, index can be 0 or 1.
   */
  void *GetInternalField(int index) const;
};
```

Example usage:

```c++
void weakCallback(const WeakCallbackInfo<int> &data) {
  int *parameter = data.GetParameter();
  delete parameter;
}

Persistent<v8::Object> obj;
int *data = new int(0);
obj.SetWeak(data, callback, WeakCallbackType::kParameter);
```

See the V8 documentation for [`WeakCallbackInfo`](https://v8docs.nodesource.com/node-8.16/d8/d06/classv8_1_1_weak_callback_info.html) for further information.

<a name="api_nan_weak_callback_type"></a>
### Nan::WeakCallbackType

Represents the type of a weak callback.
A weak callback of type `kParameter` makes the supplied parameter to `Nan::PersistentBase::SetWeak` available through `WeakCallbackInfo::GetParameter`.
A weak callback of type `kInternalFields` uses up to two internal fields at indices 0 and 1 on the `Nan::PersistentBase<v8::Object>` being made weak.
Note that only `v8::Object`s and derivatives can have internal fields.

Definition:

```c++
enum class WeakCallbackType { kParameter, kInternalFields };
```
## Scopes

A _local handle_ is a pointer to an object. All V8 objects are accessed using handles, they are necessary because of the way the V8 garbage collector works.

A handle scope can be thought of as a container for any number of handles. When you've finished with your handles, instead of deleting each one individually you can simply delete their scope.

The creation of `HandleScope` objects is different across the supported versions of V8. Therefore, NAN provides its own implementations that can be used safely across these.

 - <a href="#api_nan_handle_scope"><b><code>Nan::HandleScope</code></b></a>
 - <a href="#api_nan_escapable_handle_scope"><b><code>Nan::EscapableHandleScope</code></b></a>

Also see the V8 Embedders Guide section on [Handles and Garbage Collection](https://github.com/v8/v8/wiki/Embedder%27s%20Guide#handles-and-garbage-collection).

<a name="api_nan_handle_scope"></a>
### Nan::HandleScope

A simple wrapper around [`v8::HandleScope`](https://v8docs.nodesource.com/node-8.16/d3/d95/classv8_1_1_handle_scope.html).

Definition:

```c++
class Nan::HandleScope {
 public:
  Nan::HandleScope();
  static int NumberOfHandles();
};
```

Allocate a new `Nan::HandleScope` whenever you are creating new V8 JavaScript objects. Note that an implicit `HandleScope` is created for you on JavaScript-accessible methods so you do not need to insert one yourself.

Example:

```c++
// new object is created, it needs a new scope:
void Pointless() {
  Nan::HandleScope scope;
  v8::Local<v8::Object> obj = Nan::New<v8::Object>();
}

// JavaScript-accessible method already has a HandleScope
NAN_METHOD(Pointless2) {
  v8::Local<v8::Object> obj = Nan::New<v8::Object>();
}
```

<a name="api_nan_escapable_handle_scope"></a>
### Nan::EscapableHandleScope

Similar to [`Nan::HandleScope`](#api_nan_handle_scope) but should be used in cases where a function needs to return a V8 JavaScript type that has been created within it.

Definition:

```c++
class Nan::EscapableHandleScope {
 public:
  Nan::EscapableHandleScope();
  static int NumberOfHandles();
  template<typename T> v8::Local<T> Escape(v8::Local<T> value);
}
```

Use `Escape(value)` to return the object.

Example:

```c++
v8::Local<v8::Object> EmptyObj() {
  Nan::EscapableHandleScope scope;
  v8::Local<v8::Object> obj = Nan::New<v8::Object>();
  return scope.Escape(obj);
}
```

## Script

NAN provides `v8::Script` helpers as the API has changed over the supported versions of V8.

 - <a href="#api_nan_compile_script"><b><code>Nan::CompileScript()</code></b></a>
 - <a href="#api_nan_run_script"><b><code>Nan::RunScript()</code></b></a>
 - <a href="#api_nan_script_origin"><b><code>Nan::ScriptOrigin</code></b></a>


<a name="api_nan_compile_script"></a>
### Nan::CompileScript()

A wrapper around [`v8::ScriptCompiler::Compile()`](https://v8docs.nodesource.com/node-8.16/da/da5/classv8_1_1_script_compiler.html#a93f5072a0db55d881b969e9fc98e564b).

Note that `Nan::BoundScript` is an alias for `v8::Script`.

Signature:

```c++
Nan::MaybeLocal<Nan::BoundScript> Nan::CompileScript(
    v8::Local<v8::String> s,
    const v8::ScriptOrigin& origin);
Nan::MaybeLocal<Nan::BoundScript> Nan::CompileScript(v8::Local<v8::String> s);
```


<a name="api_nan_run_script"></a>
### Nan::RunScript()

Calls `script->Run()` or `script->BindToCurrentContext()->Run(Nan::GetCurrentContext())`.

Note that `Nan::BoundScript` is an alias for `v8::Script` and `Nan::UnboundScript` is an alias for `v8::UnboundScript` where available and `v8::Script` on older versions of V8.

Signature:

```c++
Nan::MaybeLocal<v8::Value> Nan::RunScript(v8::Local<Nan::UnboundScript> script)
Nan::MaybeLocal<v8::Value> Nan::RunScript(v8::Local<Nan::BoundScript> script)
```

<a name="api_nan_script_origin"></a>
### Nan::ScriptOrigin

A class transparently extending [`v8::ScriptOrigin`](https://v8docs.nodesource.com/node-16.0/db/d84/classv8_1_1_script_origin.html#pub-methods)
to provide backwards compatibility. Only the listed methods are guaranteed to
be available on all versions of Node.

Declaration:

```c++
class Nan::ScriptOrigin : public v8::ScriptOrigin {
 public:
  ScriptOrigin(v8::Local<v8::Value> name, v8::Local<v8::Integer> line = v8::Local<v8::Integer>(), v8::Local<v8::Integer> column = v8::Local<v8::Integer>())
  v8::Local<v8::Value> ResourceName() const;
  v8::Local<v8::Integer> ResourceLineOffset() const;
  v8::Local<v8::Integer> ResourceColumnOffset() const;
}
```
## Strings & Bytes

Miscellaneous string & byte encoding and decoding functionality provided for compatibility across supported versions of V8 and Node. Implemented by NAN to ensure that all encoding types are supported, even for older versions of Node where they are missing.

 - <a href="#api_nan_encoding"><b><code>Nan::Encoding</code></b></a>
 - <a href="#api_nan_encode"><b><code>Nan::Encode()</code></b></a>
 - <a href="#api_nan_decode_bytes"><b><code>Nan::DecodeBytes()</code></b></a>
 - <a href="#api_nan_decode_write"><b><code>Nan::DecodeWrite()</code></b></a>


<a name="api_nan_encoding"></a>
### Nan::Encoding

An enum representing the supported encoding types. A copy of `node::encoding` that is consistent across versions of Node.

Definition:

```c++
enum Nan::Encoding { ASCII, UTF8, BASE64, UCS2, BINARY, HEX, BUFFER }
```


<a name="api_nan_encode"></a>
### Nan::Encode()

A wrapper around `node::Encode()` that provides a consistent implementation across supported versions of Node.

Signature:

```c++
v8::Local<v8::Value> Nan::Encode(const void *buf,
                                 size_t len,
                                 enum Nan::Encoding encoding = BINARY);
```


<a name="api_nan_decode_bytes"></a>
### Nan::DecodeBytes()

A wrapper around `node::DecodeBytes()` that provides a consistent implementation across supported versions of Node.

Signature:

```c++
ssize_t Nan::DecodeBytes(v8::Local<v8::Value> val,
                         enum Nan::Encoding encoding = BINARY);
```


<a name="api_nan_decode_write"></a>
### Nan::DecodeWrite()

A wrapper around `node::DecodeWrite()` that provides a consistent implementation across supported versions of Node.

Signature:

```c++
ssize_t Nan::DecodeWrite(char *buf,
                         size_t len,
                         v8::Local<v8::Value> val,
                         enum Nan::Encoding encoding = BINARY);
```
## V8 internals

The hooks to access V8 internals—including GC and statistics—are different across the supported versions of V8, therefore NAN provides its own hooks that call the appropriate V8 methods.

 - <a href="#api_nan_gc_callback"><b><code>NAN_GC_CALLBACK()</code></b></a>
 - <a href="#api_nan_add_gc_epilogue_callback"><b><code>Nan::AddGCEpilogueCallback()</code></b></a>
 - <a href="#api_nan_remove_gc_epilogue_callback"><b><code>Nan::RemoveGCEpilogueCallback()</code></b></a>
 - <a href="#api_nan_add_gc_prologue_callback"><b><code>Nan::AddGCPrologueCallback()</code></b></a>
 - <a href="#api_nan_remove_gc_prologue_callback"><b><code>Nan::RemoveGCPrologueCallback()</code></b></a>
 - <a href="#api_nan_get_heap_statistics"><b><code>Nan::GetHeapStatistics()</code></b></a>
 - <a href="#api_nan_set_counter_function"><b><code>Nan::SetCounterFunction()</code></b></a>
 - <a href="#api_nan_set_create_histogram_function"><b><code>Nan::SetCreateHistogramFunction()</code></b></a>
 - <a href="#api_nan_set_add_histogram_sample_function"><b><code>Nan::SetAddHistogramSampleFunction()</code></b></a>
 - <a href="#api_nan_idle_notification"><b><code>Nan::IdleNotification()</code></b></a>
 - <a href="#api_nan_low_memory_notification"><b><code>Nan::LowMemoryNotification()</code></b></a>
 - <a href="#api_nan_context_disposed_notification"><b><code>Nan::ContextDisposedNotification()</code></b></a>
 - <a href="#api_nan_get_internal_field_pointer"><b><code>Nan::GetInternalFieldPointer()</code></b></a>
 - <a href="#api_nan_set_internal_field_pointer"><b><code>Nan::SetInternalFieldPointer()</code></b></a>
 - <a href="#api_nan_adjust_external_memory"><b><code>Nan::AdjustExternalMemory()</code></b></a>


<a name="api_nan_gc_callback"></a>
### NAN_GC_CALLBACK(callbackname)

Use `NAN_GC_CALLBACK` to declare your callbacks for `Nan::AddGCPrologueCallback()` and `Nan::AddGCEpilogueCallback()`. Your new method receives the arguments `v8::GCType type` and `v8::GCCallbackFlags flags`.

```c++
static Nan::Persistent<Function> callback;

NAN_GC_CALLBACK(gcPrologueCallback) {
  v8::Local<Value> argv[] = { Nan::New("prologue").ToLocalChecked() };
  Nan::MakeCallback(Nan::GetCurrentContext()->Global(), Nan::New(callback), 1, argv);
}

NAN_METHOD(Hook) {
  callback.Reset(To<Function>(args[0]).ToLocalChecked());
  Nan::AddGCPrologueCallback(gcPrologueCallback);
  info.GetReturnValue().Set(info.Holder());
}
```

<a name="api_nan_add_gc_epilogue_callback"></a>
### Nan::AddGCEpilogueCallback()

Signature:

```c++
void Nan::AddGCEpilogueCallback(v8::Isolate::GCEpilogueCallback callback, v8::GCType gc_type_filter = v8::kGCTypeAll)
```

Calls V8's [`AddGCEpilogueCallback()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#a580f976e4290cead62c2fc4dd396be3e).

<a name="api_nan_remove_gc_epilogue_callback"></a>
### Nan::RemoveGCEpilogueCallback()

Signature:

```c++
void Nan::RemoveGCEpilogueCallback(v8::Isolate::GCEpilogueCallback callback)
```

Calls V8's [`RemoveGCEpilogueCallback()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#adca9294555a3908e9f23c7bb0f0f284c).

<a name="api_nan_add_gc_prologue_callback"></a>
### Nan::AddGCPrologueCallback()

Signature:

```c++
void Nan::AddGCPrologueCallback(v8::Isolate::GCPrologueCallback, v8::GCType gc_type_filter callback)
```

Calls V8's [`AddGCPrologueCallback()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#a6dbef303603ebdb03da6998794ea05b8).

<a name="api_nan_remove_gc_prologue_callback"></a>
### Nan::RemoveGCPrologueCallback()

Signature:

```c++
void Nan::RemoveGCPrologueCallback(v8::Isolate::GCPrologueCallback callback)
```

Calls V8's [`RemoveGCPrologueCallback()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#a5f72c7cda21415ce062bbe5c58abe09e).

<a name="api_nan_get_heap_statistics"></a>
### Nan::GetHeapStatistics()

Signature:

```c++
void Nan::GetHeapStatistics(v8::HeapStatistics *heap_statistics)
```

Calls V8's [`GetHeapStatistics()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#a5593ac74687b713095c38987e5950b34).

<a name="api_nan_set_counter_function"></a>
### Nan::SetCounterFunction()

Signature:

```c++
void Nan::SetCounterFunction(v8::CounterLookupCallback cb)
```

Calls V8's [`SetCounterFunction()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#a045d7754e62fa0ec72ae6c259b29af94).

<a name="api_nan_set_create_histogram_function"></a>
### Nan::SetCreateHistogramFunction()

Signature:

```c++
void Nan::SetCreateHistogramFunction(v8::CreateHistogramCallback cb) 
```

Calls V8's [`SetCreateHistogramFunction()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#a542d67e85089cb3f92aadf032f99e732).

<a name="api_nan_set_add_histogram_sample_function"></a>
### Nan::SetAddHistogramSampleFunction()

Signature:

```c++
void Nan::SetAddHistogramSampleFunction(v8::AddHistogramSampleCallback cb) 
```

Calls V8's [`SetAddHistogramSampleFunction()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#aeb420b690bc2c216882d6fdd00ddd3ea).

<a name="api_nan_idle_notification"></a>
### Nan::IdleNotification()

Signature:

```c++
bool Nan::IdleNotification(int idle_time_in_ms)
```

Calls V8's [`IdleNotification()` or `IdleNotificationDeadline()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#ad6a2a02657f5425ad460060652a5a118) depending on V8 version.

<a name="api_nan_low_memory_notification"></a>
### Nan::LowMemoryNotification()

Signature:

```c++
void Nan::LowMemoryNotification() 
```

Calls V8's [`LowMemoryNotification()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#a24647f61d6b41f69668094bdcd6ea91f).

<a name="api_nan_context_disposed_notification"></a>
### Nan::ContextDisposedNotification()

Signature:

```c++
void Nan::ContextDisposedNotification()
```

Calls V8's [`ContextDisposedNotification()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#ad7f5dc559866343fe6cd8db1f134d48b).

<a name="api_nan_get_internal_field_pointer"></a>
### Nan::GetInternalFieldPointer()

Gets a pointer to the internal field with at `index` from a V8 `Object` handle.

Signature:

```c++
void* Nan::GetInternalFieldPointer(v8::Local<v8::Object> object, int index) 
```

Calls the Object's [`GetAlignedPointerFromInternalField()` or `GetPointerFromInternalField()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a580ea84afb26c005d6762eeb9e3c308f) depending on the version of V8.

<a name="api_nan_set_internal_field_pointer"></a>
### Nan::SetInternalFieldPointer()

Sets the value of the internal field at `index` on a V8 `Object` handle.

Signature:

```c++
void Nan::SetInternalFieldPointer(v8::Local<v8::Object> object, int index, void* value)
```

Calls the Object's [`SetAlignedPointerInInternalField()` or `SetPointerInInternalField()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#ab3c57184263cf29963ef0017bec82281) depending on the version of V8.

<a name="api_nan_adjust_external_memory"></a>
### Nan::AdjustExternalMemory()

Signature:

```c++
int Nan::AdjustExternalMemory(int bytesChange)
```

Calls V8's [`AdjustAmountOfExternalAllocatedMemory()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#ae1a59cac60409d3922582c4af675473e).

## Miscellaneous V8 Helpers

 - <a href="#api_nan_utf8_string"><b><code>Nan::Utf8String</code></b></a>
 - <a href="#api_nan_get_current_context"><b><code>Nan::GetCurrentContext()</code></b></a>
 - <a href="#api_nan_set_isolate_data"><b><code>Nan::SetIsolateData()</code></b></a>
 - <a href="#api_nan_get_isolate_data"><b><code>Nan::GetIsolateData()</code></b></a>
 - <a href="#api_nan_typedarray_contents"><b><code>Nan::TypedArrayContents</code></b></a>


<a name="api_nan_utf8_string"></a>
### Nan::Utf8String

Converts an object to a UTF-8-encoded character array. If conversion to a string fails (e.g. due to an exception in the toString() method of the object) then the length() method returns 0 and the * operator returns NULL. The underlying memory used for this object is managed by the object.

An implementation of [`v8::String::Utf8Value`](https://v8docs.nodesource.com/node-8.16/d4/d1b/classv8_1_1_string_1_1_utf8_value.html) that is consistent across all supported versions of V8.

Definition:

```c++
class Nan::Utf8String {
 public:
  Nan::Utf8String(v8::Local<v8::Value> from);

  int length() const;

  char* operator*();
  const char* operator*() const;
};
```

<a name="api_nan_get_current_context"></a>
### Nan::GetCurrentContext()

A call to [`v8::Isolate::GetCurrent()->GetCurrentContext()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#a81c7a1ed7001ae2a65e89107f75fd053) that works across all supported versions of V8.

Signature:

```c++
v8::Local<v8::Context> Nan::GetCurrentContext()
```

<a name="api_nan_set_isolate_data"></a>
### Nan::SetIsolateData()

A helper to provide a consistent API to [`v8::Isolate#SetData()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#a7acadfe7965997e9c386a05f098fbe36).

Signature:

```c++
void Nan::SetIsolateData(v8::Isolate *isolate, T *data)
```


<a name="api_nan_get_isolate_data"></a>
### Nan::GetIsolateData()

A helper to provide a consistent API to [`v8::Isolate#GetData()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#aabd223436bc1100a787dadaa024c6257).

Signature:

```c++
T *Nan::GetIsolateData(v8::Isolate *isolate)
```

<a name="api_nan_typedarray_contents"></a>
### Nan::TypedArrayContents<T>

A helper class for accessing the contents of an ArrayBufferView (aka a typedarray) from C++.  If the input array is not a valid typedarray, then the data pointer of TypedArrayContents will default to `NULL` and the length will be 0.  If the data pointer is not compatible with the alignment requirements of type, an assertion error will fail.

Note that you must store a reference to the `array` object while you are accessing its contents.

Definition:

```c++
template<typename T>
class Nan::TypedArrayContents {
 public:
  TypedArrayContents(v8::Local<Value> array);

  size_t length() const;

  T* const operator*();
  const T* const operator*() const;
};
```
MIT License

Copyright (c) 2018 inspiredware

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'
// Copyright (c) 2018 inspiredware

var path = require('path')
var pkg = require(path.resolve('package.json'))

var versionArray = process.version
  .substr(1)
  .replace(/-.*$/, '')
  .split('.')
  .map(function (item) {
    return +item
  })

/**
 *
 * A set of utilities to assist developers of tools that build
 * [N-API](https://nodejs.org/api/n-api.html#n_api_n_api) native add-ons.
 *
 * The main repository can be found
 * [here](https://github.com/inspiredware/napi-build-utils#napi-build-utils).
 *
 * @module napi-build-utils
 */

/**
 * Implements a consistent name of `napi` for N-API runtimes.
 *
 * @param {string} runtime The runtime string.
 * @returns {boolean}
 */
exports.isNapiRuntime = function (runtime) {
  return runtime === 'napi'
}

/**
 * Determines whether the specified N-API version is supported
 * by both the currently running Node instance and the package.
 *
 * @param {string} napiVersion The N-API version to check.
 * @returns {boolean}
 */
exports.isSupportedVersion = function (napiVersion) {
  var version = parseInt(napiVersion, 10)
  return version <= exports.getNapiVersion() && exports.packageSupportsVersion(version)
}

/**
 * Determines whether the specified N-API version is supported by the package.
 * The N-API version must be preseent in the `package.json`
 * `binary.napi_versions` array.
 *
 * @param {number} napiVersion The N-API version to check.
 * @returns {boolean}
 * @private
 */
exports.packageSupportsVersion = function (napiVersion) {
  if (pkg.binary && pkg.binary.napi_versions &&
      pkg.binary.napi_versions instanceof Array) {
    for (var i = 0; i < pkg.binary.napi_versions.length; i++) {
      if (pkg.binary.napi_versions[i] === napiVersion) return true
    };
  };
  return false
}

/**
 * Issues a warning to the supplied log if the N-API version is not supported
 * by the current Node instance or if the N-API version is not supported
 * by the package.
 *
 * @param {string} napiVersion The N-API version to check.
 * @param {Object} log The log object to which the warnings are to be issued.
 * Must implement the `warn` method.
 */
exports.logUnsupportedVersion = function (napiVersion, log) {
  if (!exports.isSupportedVersion(napiVersion)) {
    if (exports.packageSupportsVersion(napiVersion)) {
      log.warn('This Node instance does not support N-API version ' + napiVersion)
    } else {
      log.warn('This package does not support N-API version ' + napiVersion)
    }
  }
}

/**
 * Issues warnings to the supplied log for those N-API versions not supported
 * by the N-API runtime or the package.
 *
 * Note that this function is specific to the
 * [`prebuild`](https://github.com/prebuild/prebuild#prebuild) package.
 *
 * `target` is the list of targets to be built and is determined in one of
 * three ways from the command line arguments:
 * (1) `--target` specifies a specific target to build.
 * (2) `--all` specifies all N-API versions supported by the package.
 * (3) Neither of these specifies to build the single "best version available."
 *
 * `prebuild` is an array of objects in the form `{runtime: 'napi', target: '2'}`.
 * The array contains the list of N-API versions that are supported by both the
 * package being built and the currently running Node instance.
 *
 * The objective of this function is to issue a warning for those items that appear
 * in the `target` argument but not in the `prebuild` argument.
 * If a specific target is supported by the package (`packageSupportsVersion`) but
 * but note in `prebuild`, the assumption is that the target is not supported by
 * Node.
 *
 * @param {(Array<string>|string)} target The N-API version(s) to check. Target is
 * @param {Array<Object>} prebuild A config object created by the `prebuild` package.
 * @param {Object} log The log object to which the warnings are to be issued.
 * Must implement the `warn` method.
 * @private
 */
exports.logMissingNapiVersions = function (target, prebuild, log) {
  if (exports.getNapiBuildVersions()) {
    var targets = [].concat(target)
    targets.forEach(function (napiVersion) {
      if (!prebuildExists(prebuild, napiVersion)) {
        if (exports.packageSupportsVersion(parseInt(napiVersion, 10))) {
          log.warn('This Node instance does not support N-API version ' + napiVersion)
        } else {
          log.warn('This package does not support N-API version ' + napiVersion)
        }
      }
    })
  } else {
    log.error('Builds with runtime \'napi\' require a binary.napi_versions ' +
              'property on the package.json file')
  }
}

/**
 * Determines whether the specified N-API version exists in the prebuild
 * configuration object.
 *
 * Note that this function is speicifc to the `prebuild` and `prebuild-install`
 * packages.
 *
 * @param {Object} prebuild A config object created by the `prebuild` package.
 * @param {string} napiVersion The N-APi version to be checked.
 * @return {boolean}
 * @private
 */
var prebuildExists = function (prebuild, napiVersion) {
  if (prebuild) {
    for (var i = 0; i < prebuild.length; i++) {
      if (prebuild[i].target === napiVersion) return true
    }
  }
  return false
}

/**
 * Returns the best N-API version to build given the highest N-API
 * version supported by the current Node instance and the N-API versions
 * supported by the package, or undefined if a suitable N-API version
 * cannot be determined.
 *
 * The best build version is the greatest N-API version supported by
 * the package that is less than or equal to the highest N-API version
 * supported by the current Node instance.
 *
 * @returns {number|undefined}
 */
exports.getBestNapiBuildVersion = function () {
  var bestNapiBuildVersion = 0
  var napiBuildVersions = exports.getNapiBuildVersions(pkg)
  if (napiBuildVersions) {
    var ourNapiVersion = exports.getNapiVersion()
    napiBuildVersions.forEach(function (napiBuildVersion) {
      if (napiBuildVersion > bestNapiBuildVersion &&
        napiBuildVersion <= ourNapiVersion) {
        bestNapiBuildVersion = napiBuildVersion
      }
    })
  }
  return bestNapiBuildVersion === 0 ? undefined : bestNapiBuildVersion
}

/**
 * Returns an array of N-API versions supported by the package.
 *
 * @returns {Array<string>}
 */
exports.getNapiBuildVersions = function () {
  var napiBuildVersions = []
  // remove duplicates, convert to text
  if (pkg.binary && pkg.binary.napi_versions) {
    pkg.binary.napi_versions.forEach(function (napiVersion) {
      var duplicated = napiBuildVersions.indexOf('' + napiVersion) !== -1
      if (!duplicated) {
        napiBuildVersions.push('' + napiVersion)
      }
    })
  }
  return napiBuildVersions.length ? napiBuildVersions : undefined
}

/**
 * Returns the highest N-API version supported by the current node instance
 * or undefined if N-API is not supported.
 *
 * @returns {string|undefined}
 */
exports.getNapiVersion = function () {
  var version = process.versions.napi // string, can be undefined
  if (!version) { // this code should never need to be updated
    if (versionArray[0] === 9 && versionArray[1] >= 3) version = '2' // 9.3.0+
    else if (versionArray[0] === 8) version = '1' // 8.0.0+
  }
  return version
}
<a name="module_napi-build-utils"></a>

## napi-build-utils
A set of utilities to assist developers of tools that build
[N-API](https://nodejs.org/api/n-api.html#n_api_n_api) native add-ons.

The main repository can be found
[here](https://github.com/inspiredware/napi-build-utils#napi-build-utils).


* [napi-build-utils](#module_napi-build-utils)
    * [.isNapiRuntime(runtime)](#module_napi-build-utils.isNapiRuntime) ⇒ <code>boolean</code>
    * [.isSupportedVersion(napiVersion)](#module_napi-build-utils.isSupportedVersion) ⇒ <code>boolean</code>
    * [.logUnsupportedVersion(napiVersion, log)](#module_napi-build-utils.logUnsupportedVersion)
    * [.getBestNapiBuildVersion()](#module_napi-build-utils.getBestNapiBuildVersion) ⇒ <code>number</code> \| <code>undefined</code>
    * [.getNapiBuildVersions()](#module_napi-build-utils.getNapiBuildVersions) ⇒ <code>Array.&lt;string&gt;</code>
    * [.getNapiVersion()](#module_napi-build-utils.getNapiVersion) ⇒ <code>string</code> \| <code>undefined</code>

<a name="module_napi-build-utils.isNapiRuntime"></a>

### napi-build-utils.isNapiRuntime(runtime) ⇒ <code>boolean</code>
Implements a consistent name of `napi` for N-API runtimes.

**Kind**: static method of [<code>napi-build-utils</code>](#module_napi-build-utils)  

| Param | Type | Description |
| --- | --- | --- |
| runtime | <code>string</code> | The runtime string. |

<a name="module_napi-build-utils.isSupportedVersion"></a>

### napi-build-utils.isSupportedVersion(napiVersion) ⇒ <code>boolean</code>
Determines whether the specified N-API version is supported
by both the currently running Node instance and the package.

**Kind**: static method of [<code>napi-build-utils</code>](#module_napi-build-utils)  

| Param | Type | Description |
| --- | --- | --- |
| napiVersion | <code>string</code> | The N-API version to check. |

<a name="module_napi-build-utils.logUnsupportedVersion"></a>

### napi-build-utils.logUnsupportedVersion(napiVersion, log)
Issues a warning to the supplied log if the N-API version is not supported
by the current Node instance or if the N-API version is not supported
by the package.

**Kind**: static method of [<code>napi-build-utils</code>](#module_napi-build-utils)  

| Param | Type | Description |
| --- | --- | --- |
| napiVersion | <code>string</code> | The N-API version to check. |
| log | <code>Object</code> | The log object to which the warnings are to be issued. Must implement the `warn` method. |

<a name="module_napi-build-utils.getBestNapiBuildVersion"></a>

### napi-build-utils.getBestNapiBuildVersion() ⇒ <code>number</code> \| <code>undefined</code>
Returns the best N-API version to build given the highest N-API
version supported by the current Node instance and the N-API versions
supported by the package, or undefined if a suitable N-API version
cannot be determined.

The best build version is the greatest N-API version supported by
the package that is less than or equal to the highest N-API version
supported by the current Node instance.

**Kind**: static method of [<code>napi-build-utils</code>](#module_napi-build-utils)  
<a name="module_napi-build-utils.getNapiBuildVersions"></a>

### napi-build-utils.getNapiBuildVersions() ⇒ <code>Array.&lt;string&gt;</code>
Returns an array of N-API versions supported by the package.

**Kind**: static method of [<code>napi-build-utils</code>](#module_napi-build-utils)  
<a name="module_napi-build-utils.getNapiVersion"></a>

### napi-build-utils.getNapiVersion() ⇒ <code>string</code> \| <code>undefined</code>
Returns the highest N-API version supported by the current node instance
or undefined if N-API is not supported.

**Kind**: static method of [<code>napi-build-utils</code>](#module_napi-build-utils)  
{
  "name": "napi-build-utils",
  "version": "1.0.2",
  "description": "A set of utilities to assist developers of tools that build N-API native add-ons",
  "main": "index.js",
  "author": "Jim Schlight",
  "license": "MIT",
  "homepage": "https://github.com/inspiredware/napi-build-utils#readme",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/inspiredware/napi-build-utils.git"
  },
  "devDependencies": {
    "chai": "^4.1.2",
    "jsdoc-to-markdown": "^4.0.1",
    "mocha": "^5.2.0",
    "standard": "^12.0.1"
  },
  "binary": {
    "note": "napi-build-tools is not an N-API module. This entry is for unit testing.",
    "napi_versions": [
      2,
      2,
      3
    ]
  }
}The MIT License (MIT)

Copyright (c) 2017 Anna Henningsen

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.

# Contributor Covenant Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, gender identity and expression, level of experience,
nationality, personal appearance, race, religion, or sexual identity and
orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment
include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or
  advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
  address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project maintainer at anna@addaleax.net. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html

[homepage]: https://www.contributor-covenant.org

'use strict';
const Duplex = require('stream').Duplex;

const kCallback = Symbol('Callback');
const kOtherSide = Symbol('Other');

class DuplexSocket extends Duplex {
  constructor(options) {
    super(options);
    this[kCallback] = null;
    this[kOtherSide] = null;
  }

  _read() {
    const callback = this[kCallback];
    if (callback) {
      this[kCallback] = null;
      callback();
    }
  }

  _write(chunk, encoding, callback) {
    this[kOtherSide][kCallback] = callback;
    this[kOtherSide].push(chunk);
  }

  _final(callback) {
    this[kOtherSide].on('end', callback);
    this[kOtherSide].push(null);
  }
}

class DuplexPair {
  constructor(options) {
    this.socket1 = new DuplexSocket(options);
    this.socket2 = new DuplexSocket(options);
    this.socket1[kOtherSide] = this.socket2;
    this.socket2[kOtherSide] = this.socket1;
  }
}

module.exports = DuplexPair;
{
  "name": "native-duplexpair",
  "version": "1.0.0",
  "description": "Make a full duplex stream with 2 Duplex endpoints, using the native version of `Duplex`",
  "engine": ">=4.0.0",
  "main": "index.js",
  "directories": {
    "test": "test"
  },
  "devDependencies": {
    "mocha": "^4.0.1",
    "nyc": "^11.3.0"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/tediousjs/native-duplexpair.git"
  },
  "author": "Anna Henningsen <anna@addaleax.net>",
  "license": "MIT",
  "homepage": "https://github.com/tediousjs/native-duplexpair#readme"
}0.6.3 / 2022-01-22
==================

  * Revert "Lazy-load modules from main entry point"

0.6.2 / 2019-04-29
==================

  * Fix sorting charset, encoding, and language with extra parameters

0.6.1 / 2016-05-02
==================

  * perf: improve `Accept` parsing speed
  * perf: improve `Accept-Charset` parsing speed
  * perf: improve `Accept-Encoding` parsing speed
  * perf: improve `Accept-Language` parsing speed

0.6.0 / 2015-09-29
==================

  * Fix including type extensions in parameters in `Accept` parsing
  * Fix parsing `Accept` parameters with quoted equals
  * Fix parsing `Accept` parameters with quoted semicolons
  * Lazy-load modules from main entry point
  * perf: delay type concatenation until needed
  * perf: enable strict mode
  * perf: hoist regular expressions
  * perf: remove closures getting spec properties
  * perf: remove a closure from media type parsing
  * perf: remove property delete from media type parsing

0.5.3 / 2015-05-10
==================

  * Fix media type parameter matching to be case-insensitive

0.5.2 / 2015-05-06
==================

  * Fix comparing media types with quoted values
  * Fix splitting media types with quoted commas

0.5.1 / 2015-02-14
==================

  * Fix preference sorting to be stable for long acceptable lists

0.5.0 / 2014-12-18
==================

  * Fix list return order when large accepted list
  * Fix missing identity encoding when q=0 exists
  * Remove dynamic building of Negotiator class

0.4.9 / 2014-10-14
==================

  * Fix error when media type has invalid parameter

0.4.8 / 2014-09-28
==================

  * Fix all negotiations to be case-insensitive
  * Stable sort preferences of same quality according to client order
  * Support Node.js 0.6

0.4.7 / 2014-06-24
==================

  * Handle invalid provided languages
  * Handle invalid provided media types

0.4.6 / 2014-06-11
==================

  *  Order by specificity when quality is the same

0.4.5 / 2014-05-29
==================

  * Fix regression in empty header handling

0.4.4 / 2014-05-29
==================

  * Fix behaviors when headers are not present

0.4.3 / 2014-04-16
==================

  * Handle slashes on media params correctly

0.4.2 / 2014-02-28
==================

  * Fix media type sorting
  * Handle media types params strictly

0.4.1 / 2014-01-16
==================

  * Use most specific matches

0.4.0 / 2014-01-09
==================

  * Remove preferred prefix from methods
(The MIT License)

Copyright (c) 2012-2014 Federico Romero
Copyright (c) 2012-2014 Isaac Z. Schlueter
Copyright (c) 2014-2015 Douglas Christopher Wilson

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.
/*!
 * negotiator
 * Copyright(c) 2012 Federico Romero
 * Copyright(c) 2012-2014 Isaac Z. Schlueter
 * Copyright(c) 2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict';

var preferredCharsets = require('./lib/charset')
var preferredEncodings = require('./lib/encoding')
var preferredLanguages = require('./lib/language')
var preferredMediaTypes = require('./lib/mediaType')

/**
 * Module exports.
 * @public
 */

module.exports = Negotiator;
module.exports.Negotiator = Negotiator;

/**
 * Create a Negotiator instance from a request.
 * @param {object} request
 * @public
 */

function Negotiator(request) {
  if (!(this instanceof Negotiator)) {
    return new Negotiator(request);
  }

  this.request = request;
}

Negotiator.prototype.charset = function charset(available) {
  var set = this.charsets(available);
  return set && set[0];
};

Negotiator.prototype.charsets = function charsets(available) {
  return preferredCharsets(this.request.headers['accept-charset'], available);
};

Negotiator.prototype.encoding = function encoding(available) {
  var set = this.encodings(available);
  return set && set[0];
};

Negotiator.prototype.encodings = function encodings(available) {
  return preferredEncodings(this.request.headers['accept-encoding'], available);
};

Negotiator.prototype.language = function language(available) {
  var set = this.languages(available);
  return set && set[0];
};

Negotiator.prototype.languages = function languages(available) {
  return preferredLanguages(this.request.headers['accept-language'], available);
};

Negotiator.prototype.mediaType = function mediaType(available) {
  var set = this.mediaTypes(available);
  return set && set[0];
};

Negotiator.prototype.mediaTypes = function mediaTypes(available) {
  return preferredMediaTypes(this.request.headers.accept, available);
};

// Backwards compatibility
Negotiator.prototype.preferredCharset = Negotiator.prototype.charset;
Negotiator.prototype.preferredCharsets = Negotiator.prototype.charsets;
Negotiator.prototype.preferredEncoding = Negotiator.prototype.encoding;
Negotiator.prototype.preferredEncodings = Negotiator.prototype.encodings;
Negotiator.prototype.preferredLanguage = Negotiator.prototype.language;
Negotiator.prototype.preferredLanguages = Negotiator.prototype.languages;
Negotiator.prototype.preferredMediaType = Negotiator.prototype.mediaType;
Negotiator.prototype.preferredMediaTypes = Negotiator.prototype.mediaTypes;
{
  "name": "negotiator",
  "description": "HTTP content negotiation",
  "version": "0.6.3",
  "license": "MIT",
  "repository": "jshttp/negotiator",
  "devDependencies": {
    "eslint": "7.32.0",
    "eslint-plugin-markdown": "2.2.1",
    "mocha": "9.1.3",
    "nyc": "15.1.0"
  },
  "files": [
    "lib/",
    "HISTORY.md",
    "LICENSE",
    "index.js",
    "README.md"
  ],
  "engines": {
    "node": ">= 0.6"
  }
}/**
 * negotiator
 * Copyright(c) 2012 Isaac Z. Schlueter
 * Copyright(c) 2014 Federico Romero
 * Copyright(c) 2014-2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict';

/**
 * Module exports.
 * @public
 */

module.exports = preferredCharsets;
module.exports.preferredCharsets = preferredCharsets;

/**
 * Module variables.
 * @private
 */

var simpleCharsetRegExp = /^\s*([^\s;]+)\s*(?:;(.*))?$/;

/**
 * Parse the Accept-Charset header.
 * @private
 */

function parseAcceptCharset(accept) {
  var accepts = accept.split(',');

  for (var i = 0, j = 0; i < accepts.length; i++) {
    var charset = parseCharset(accepts[i].trim(), i);

    if (charset) {
      accepts[j++] = charset;
    }
  }

  // trim accepts
  accepts.length = j;

  return accepts;
}

/**
 * Parse a charset from the Accept-Charset header.
 * @private
 */

function parseCharset(str, i) {
  var match = simpleCharsetRegExp.exec(str);
  if (!match) return null;

  var charset = match[1];
  var q = 1;
  if (match[2]) {
    var params = match[2].split(';')
    for (var j = 0; j < params.length; j++) {
      var p = params[j].trim().split('=');
      if (p[0] === 'q') {
        q = parseFloat(p[1]);
        break;
      }
    }
  }

  return {
    charset: charset,
    q: q,
    i: i
  };
}

/**
 * Get the priority of a charset.
 * @private
 */

function getCharsetPriority(charset, accepted, index) {
  var priority = {o: -1, q: 0, s: 0};

  for (var i = 0; i < accepted.length; i++) {
    var spec = specify(charset, accepted[i], index);

    if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) {
      priority = spec;
    }
  }

  return priority;
}

/**
 * Get the specificity of the charset.
 * @private
 */

function specify(charset, spec, index) {
  var s = 0;
  if(spec.charset.toLowerCase() === charset.toLowerCase()){
    s |= 1;
  } else if (spec.charset !== '*' ) {
    return null
  }

  return {
    i: index,
    o: spec.i,
    q: spec.q,
    s: s
  }
}

/**
 * Get the preferred charsets from an Accept-Charset header.
 * @public
 */

function preferredCharsets(accept, provided) {
  // RFC 2616 sec 14.2: no header = *
  var accepts = parseAcceptCharset(accept === undefined ? '*' : accept || '');

  if (!provided) {
    // sorted list of all charsets
    return accepts
      .filter(isQuality)
      .sort(compareSpecs)
      .map(getFullCharset);
  }

  var priorities = provided.map(function getPriority(type, index) {
    return getCharsetPriority(type, accepts, index);
  });

  // sorted list of accepted charsets
  return priorities.filter(isQuality).sort(compareSpecs).map(function getCharset(priority) {
    return provided[priorities.indexOf(priority)];
  });
}

/**
 * Compare two specs.
 * @private
 */

function compareSpecs(a, b) {
  return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0;
}

/**
 * Get full charset string.
 * @private
 */

function getFullCharset(spec) {
  return spec.charset;
}

/**
 * Check if a spec has any quality.
 * @private
 */

function isQuality(spec) {
  return spec.q > 0;
}
/**
 * negotiator
 * Copyright(c) 2012 Isaac Z. Schlueter
 * Copyright(c) 2014 Federico Romero
 * Copyright(c) 2014-2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict';

/**
 * Module exports.
 * @public
 */

module.exports = preferredEncodings;
module.exports.preferredEncodings = preferredEncodings;

/**
 * Module variables.
 * @private
 */

var simpleEncodingRegExp = /^\s*([^\s;]+)\s*(?:;(.*))?$/;

/**
 * Parse the Accept-Encoding header.
 * @private
 */

function parseAcceptEncoding(accept) {
  var accepts = accept.split(',');
  var hasIdentity = false;
  var minQuality = 1;

  for (var i = 0, j = 0; i < accepts.length; i++) {
    var encoding = parseEncoding(accepts[i].trim(), i);

    if (encoding) {
      accepts[j++] = encoding;
      hasIdentity = hasIdentity || specify('identity', encoding);
      minQuality = Math.min(minQuality, encoding.q || 1);
    }
  }

  if (!hasIdentity) {
    /*
     * If identity doesn't explicitly appear in the accept-encoding header,
     * it's added to the list of acceptable encoding with the lowest q
     */
    accepts[j++] = {
      encoding: 'identity',
      q: minQuality,
      i: i
    };
  }

  // trim accepts
  accepts.length = j;

  return accepts;
}

/**
 * Parse an encoding from the Accept-Encoding header.
 * @private
 */

function parseEncoding(str, i) {
  var match = simpleEncodingRegExp.exec(str);
  if (!match) return null;

  var encoding = match[1];
  var q = 1;
  if (match[2]) {
    var params = match[2].split(';');
    for (var j = 0; j < params.length; j++) {
      var p = params[j].trim().split('=');
      if (p[0] === 'q') {
        q = parseFloat(p[1]);
        break;
      }
    }
  }

  return {
    encoding: encoding,
    q: q,
    i: i
  };
}

/**
 * Get the priority of an encoding.
 * @private
 */

function getEncodingPriority(encoding, accepted, index) {
  var priority = {o: -1, q: 0, s: 0};

  for (var i = 0; i < accepted.length; i++) {
    var spec = specify(encoding, accepted[i], index);

    if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) {
      priority = spec;
    }
  }

  return priority;
}

/**
 * Get the specificity of the encoding.
 * @private
 */

function specify(encoding, spec, index) {
  var s = 0;
  if(spec.encoding.toLowerCase() === encoding.toLowerCase()){
    s |= 1;
  } else if (spec.encoding !== '*' ) {
    return null
  }

  return {
    i: index,
    o: spec.i,
    q: spec.q,
    s: s
  }
};

/**
 * Get the preferred encodings from an Accept-Encoding header.
 * @public
 */

function preferredEncodings(accept, provided) {
  var accepts = parseAcceptEncoding(accept || '');

  if (!provided) {
    // sorted list of all encodings
    return accepts
      .filter(isQuality)
      .sort(compareSpecs)
      .map(getFullEncoding);
  }

  var priorities = provided.map(function getPriority(type, index) {
    return getEncodingPriority(type, accepts, index);
  });

  // sorted list of accepted encodings
  return priorities.filter(isQuality).sort(compareSpecs).map(function getEncoding(priority) {
    return provided[priorities.indexOf(priority)];
  });
}

/**
 * Compare two specs.
 * @private
 */

function compareSpecs(a, b) {
  return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0;
}

/**
 * Get full encoding string.
 * @private
 */

function getFullEncoding(spec) {
  return spec.encoding;
}

/**
 * Check if a spec has any quality.
 * @private
 */

function isQuality(spec) {
  return spec.q > 0;
}
/**
 * negotiator
 * Copyright(c) 2012 Isaac Z. Schlueter
 * Copyright(c) 2014 Federico Romero
 * Copyright(c) 2014-2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict';

/**
 * Module exports.
 * @public
 */

module.exports = preferredLanguages;
module.exports.preferredLanguages = preferredLanguages;

/**
 * Module variables.
 * @private
 */

var simpleLanguageRegExp = /^\s*([^\s\-;]+)(?:-([^\s;]+))?\s*(?:;(.*))?$/;

/**
 * Parse the Accept-Language header.
 * @private
 */

function parseAcceptLanguage(accept) {
  var accepts = accept.split(',');

  for (var i = 0, j = 0; i < accepts.length; i++) {
    var language = parseLanguage(accepts[i].trim(), i);

    if (language) {
      accepts[j++] = language;
    }
  }

  // trim accepts
  accepts.length = j;

  return accepts;
}

/**
 * Parse a language from the Accept-Language header.
 * @private
 */

function parseLanguage(str, i) {
  var match = simpleLanguageRegExp.exec(str);
  if (!match) return null;

  var prefix = match[1]
  var suffix = match[2]
  var full = prefix

  if (suffix) full += "-" + suffix;

  var q = 1;
  if (match[3]) {
    var params = match[3].split(';')
    for (var j = 0; j < params.length; j++) {
      var p = params[j].split('=');
      if (p[0] === 'q') q = parseFloat(p[1]);
    }
  }

  return {
    prefix: prefix,
    suffix: suffix,
    q: q,
    i: i,
    full: full
  };
}

/**
 * Get the priority of a language.
 * @private
 */

function getLanguagePriority(language, accepted, index) {
  var priority = {o: -1, q: 0, s: 0};

  for (var i = 0; i < accepted.length; i++) {
    var spec = specify(language, accepted[i], index);

    if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) {
      priority = spec;
    }
  }

  return priority;
}

/**
 * Get the specificity of the language.
 * @private
 */

function specify(language, spec, index) {
  var p = parseLanguage(language)
  if (!p) return null;
  var s = 0;
  if(spec.full.toLowerCase() === p.full.toLowerCase()){
    s |= 4;
  } else if (spec.prefix.toLowerCase() === p.full.toLowerCase()) {
    s |= 2;
  } else if (spec.full.toLowerCase() === p.prefix.toLowerCase()) {
    s |= 1;
  } else if (spec.full !== '*' ) {
    return null
  }

  return {
    i: index,
    o: spec.i,
    q: spec.q,
    s: s
  }
};

/**
 * Get the preferred languages from an Accept-Language header.
 * @public
 */

function preferredLanguages(accept, provided) {
  // RFC 2616 sec 14.4: no header = *
  var accepts = parseAcceptLanguage(accept === undefined ? '*' : accept || '');

  if (!provided) {
    // sorted list of all languages
    return accepts
      .filter(isQuality)
      .sort(compareSpecs)
      .map(getFullLanguage);
  }

  var priorities = provided.map(function getPriority(type, index) {
    return getLanguagePriority(type, accepts, index);
  });

  // sorted list of accepted languages
  return priorities.filter(isQuality).sort(compareSpecs).map(function getLanguage(priority) {
    return provided[priorities.indexOf(priority)];
  });
}

/**
 * Compare two specs.
 * @private
 */

function compareSpecs(a, b) {
  return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0;
}

/**
 * Get full language string.
 * @private
 */

function getFullLanguage(spec) {
  return spec.full;
}

/**
 * Check if a spec has any quality.
 * @private
 */

function isQuality(spec) {
  return spec.q > 0;
}
/**
 * negotiator
 * Copyright(c) 2012 Isaac Z. Schlueter
 * Copyright(c) 2014 Federico Romero
 * Copyright(c) 2014-2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict';

/**
 * Module exports.
 * @public
 */

module.exports = preferredMediaTypes;
module.exports.preferredMediaTypes = preferredMediaTypes;

/**
 * Module variables.
 * @private
 */

var simpleMediaTypeRegExp = /^\s*([^\s\/;]+)\/([^;\s]+)\s*(?:;(.*))?$/;

/**
 * Parse the Accept header.
 * @private
 */

function parseAccept(accept) {
  var accepts = splitMediaTypes(accept);

  for (var i = 0, j = 0; i < accepts.length; i++) {
    var mediaType = parseMediaType(accepts[i].trim(), i);

    if (mediaType) {
      accepts[j++] = mediaType;
    }
  }

  // trim accepts
  accepts.length = j;

  return accepts;
}

/**
 * Parse a media type from the Accept header.
 * @private
 */

function parseMediaType(str, i) {
  var match = simpleMediaTypeRegExp.exec(str);
  if (!match) return null;

  var params = Object.create(null);
  var q = 1;
  var subtype = match[2];
  var type = match[1];

  if (match[3]) {
    var kvps = splitParameters(match[3]).map(splitKeyValuePair);

    for (var j = 0; j < kvps.length; j++) {
      var pair = kvps[j];
      var key = pair[0].toLowerCase();
      var val = pair[1];

      // get the value, unwrapping quotes
      var value = val && val[0] === '"' && val[val.length - 1] === '"'
        ? val.substr(1, val.length - 2)
        : val;

      if (key === 'q') {
        q = parseFloat(value);
        break;
      }

      // store parameter
      params[key] = value;
    }
  }

  return {
    type: type,
    subtype: subtype,
    params: params,
    q: q,
    i: i
  };
}

/**
 * Get the priority of a media type.
 * @private
 */

function getMediaTypePriority(type, accepted, index) {
  var priority = {o: -1, q: 0, s: 0};

  for (var i = 0; i < accepted.length; i++) {
    var spec = specify(type, accepted[i], index);

    if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) {
      priority = spec;
    }
  }

  return priority;
}

/**
 * Get the specificity of the media type.
 * @private
 */

function specify(type, spec, index) {
  var p = parseMediaType(type);
  var s = 0;

  if (!p) {
    return null;
  }

  if(spec.type.toLowerCase() == p.type.toLowerCase()) {
    s |= 4
  } else if(spec.type != '*') {
    return null;
  }

  if(spec.subtype.toLowerCase() == p.subtype.toLowerCase()) {
    s |= 2
  } else if(spec.subtype != '*') {
    return null;
  }

  var keys = Object.keys(spec.params);
  if (keys.length > 0) {
    if (keys.every(function (k) {
      return spec.params[k] == '*' || (spec.params[k] || '').toLowerCase() == (p.params[k] || '').toLowerCase();
    })) {
      s |= 1
    } else {
      return null
    }
  }

  return {
    i: index,
    o: spec.i,
    q: spec.q,
    s: s,
  }
}

/**
 * Get the preferred media types from an Accept header.
 * @public
 */

function preferredMediaTypes(accept, provided) {
  // RFC 2616 sec 14.2: no header = */*
  var accepts = parseAccept(accept === undefined ? '*/*' : accept || '');

  if (!provided) {
    // sorted list of all types
    return accepts
      .filter(isQuality)
      .sort(compareSpecs)
      .map(getFullType);
  }

  var priorities = provided.map(function getPriority(type, index) {
    return getMediaTypePriority(type, accepts, index);
  });

  // sorted list of accepted types
  return priorities.filter(isQuality).sort(compareSpecs).map(function getType(priority) {
    return provided[priorities.indexOf(priority)];
  });
}

/**
 * Compare two specs.
 * @private
 */

function compareSpecs(a, b) {
  return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0;
}

/**
 * Get full type string.
 * @private
 */

function getFullType(spec) {
  return spec.type + '/' + spec.subtype;
}

/**
 * Check if a spec has any quality.
 * @private
 */

function isQuality(spec) {
  return spec.q > 0;
}

/**
 * Count the number of quotes in a string.
 * @private
 */

function quoteCount(string) {
  var count = 0;
  var index = 0;

  while ((index = string.indexOf('"', index)) !== -1) {
    count++;
    index++;
  }

  return count;
}

/**
 * Split a key value pair.
 * @private
 */

function splitKeyValuePair(str) {
  var index = str.indexOf('=');
  var key;
  var val;

  if (index === -1) {
    key = str;
  } else {
    key = str.substr(0, index);
    val = str.substr(index + 1);
  }

  return [key, val];
}

/**
 * Split an Accept header into media types.
 * @private
 */

function splitMediaTypes(accept) {
  var accepts = accept.split(',');

  for (var i = 1, j = 0; i < accepts.length; i++) {
    if (quoteCount(accepts[j]) % 2 == 0) {
      accepts[++j] = accepts[i];
    } else {
      accepts[j] += ',' + accepts[i];
    }
  }

  // trim accepts
  accepts.length = j + 1;

  return accepts;
}

/**
 * Split a string of parameters.
 * @private
 */

function splitParameters(str) {
  var parameters = str.split(';');

  for (var i = 1, j = 0; i < parameters.length; i++) {
    if (quoteCount(parameters[j]) % 2 == 0) {
      parameters[++j] = parameters[i];
    } else {
      parameters[j] += ';' + parameters[i];
    }
  }

  // trim parameters
  parameters.length = j + 1;

  for (var i = 0; i < parameters.length; i++) {
    parameters[i] = parameters[i].trim();
  }

  return parameters;
}
{
    "plugins": [
      "@semantic-release/commit-analyzer",
      "@semantic-release/release-notes-generator",
      "@continuous-auth/semantic-release-npm",
      "@semantic-release/github"
    ],
    "branches": [ "main" ]
  }# Contributor Covenant Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, gender identity and expression, level of experience,
nationality, personal appearance, race, religion, or sexual identity and
orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment
include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or
  advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
  address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at lukas.geiger94@gmail.com. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct/

[homepage]: https://www.contributor-covenant.org
# Contributing to `node-abi`

:+1::tada: First off, thanks for taking the time to contribute to `node-abi`! :tada::+1:

## Commit Message Guidelines

This module uses [`semantic-release`](https://github.com/semantic-release/semantic-release) to automatically release new versions via Travis.
Therefor we have very precise rules over how our git commit messages can be formatted.

Each commit message consists of a **header**, a **body** and a **footer**.  The header has a special
format that includes a **type**, a **scope** and a **subject** ([full explanation](https://github.com/stevemao/conventional-changelog-angular/blob/master/convention.md)):

```
<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
```

### Type

Must be one of the following:

- **feat**: A new feature. **Will trigger a new release**
- **fix**: A bug fix or a addition to one of the target arrays. **Will trigger a new release**
- **docs**: Documentation only changes
- **style**: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
- **refactor**: A code change that neither fixes a bug nor adds a feature
- **perf**: A code change that improves performance
- **test**: Adding missing or correcting existing tests
- **chore**: Changes to the build process or auxiliary tools and libraries such as documentation generation


### Patch Release

```
fix(electron): Support Electron 1.8.0
```

### ~~Minor~~ Feature Release

```
feat: add .getTarget(abi, runtime)
```

### ~~Major~~ Breaking Release

```
feat: Add amazing new feature

BREAKING CHANGE: This removes support for Node 0.10 and 0.12.
```

## Pull request guidelines

Here are some things to keep in mind as you file pull requests to fix bugs, add new features, etc.:

- CircleCI is used to make sure that the project builds packages as expected on the supported platforms, using supported Node.js versions.
- Unless it's impractical, please write tests for your changes. This will help us so that we can spot regressions much easier.
- Squashing commits during discussion of the pull request is almost always unnecessary, and makes it more difficult for both the submitters and reviewers to understand what changed in between comments. However, rebasing is encouraged when practical, particularly when there's a merge conflict.
- If you are continuing the work of another person's PR and need to rebase/squash, please retain the attribution of the original author(s) and continue the work in subsequent commits.
MIT License

Copyright (c) 2016 Lukas Geiger

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.
[
  {
    "runtime": "node",
    "target": "11.0.0",
    "lts": false,
    "future": false,
    "abi": "67"
  },
  {
    "runtime": "node",
    "target": "12.0.0",
    "lts": [
      "2019-10-21",
      "2020-11-30"
    ],
    "future": false,
    "abi": "72"
  },
  {
    "runtime": "node",
    "target": "13.0.0",
    "lts": false,
    "future": false,
    "abi": "79"
  },
  {
    "runtime": "node",
    "target": "14.0.0",
    "lts": [
      "2020-10-27",
      "2021-10-19"
    ],
    "future": false,
    "abi": "83"
  },
  {
    "runtime": "node",
    "target": "15.0.0",
    "lts": false,
    "future": false,
    "abi": "88"
  },
  {
    "runtime": "node",
    "target": "16.0.0",
    "lts": [
      "2021-10-26",
      "2022-10-18"
    ],
    "future": false,
    "abi": "93"
  },
  {
    "runtime": "node",
    "target": "17.0.0",
    "lts": false,
    "future": false,
    "abi": "102"
  },
  {
    "runtime": "node",
    "target": "18.0.0",
    "lts": [
      "2022-10-25",
      "2023-10-18"
    ],
    "future": false,
    "abi": "108"
  },
  {
    "abi": "70",
    "future": false,
    "lts": false,
    "runtime": "electron",
    "target": "5.0.0-beta.9"
  },
  {
    "abi": "73",
    "future": false,
    "lts": false,
    "runtime": "electron",
    "target": "6.0.0-beta.1"
  },
  {
    "abi": "75",
    "future": false,
    "lts": false,
    "runtime": "electron",
    "target": "7.0.0-beta.1"
  },
  {
    "abi": "76",
    "future": false,
    "lts": false,
    "runtime": "electron",
    "target": "8.0.0-beta.1"
  },
  {
    "abi": "76",
    "future": false,
    "lts": false,
    "runtime": "electron",
    "target": "9.0.0-beta.1"
  },
  {
    "abi": "80",
    "future": false,
    "lts": false,
    "runtime": "electron",
    "target": "9.0.0-beta.2"
  },
  {
    "abi": "82",
    "future": false,
    "lts": false,
    "runtime": "electron",
    "target": "10.0.0-beta.1"
  },
  {
    "abi": "82",
    "future": false,
    "lts": false,
    "runtime": "electron",
    "target": "11.0.0-beta.1"
  },
  {
    "abi": "85",
    "future": false,
    "lts": false,
    "runtime": "electron",
    "target": "11.0.0-beta.11"
  },
  {
    "abi": "87",
    "future": false,
    "lts": false,
    "runtime": "electron",
    "target": "12.0.0-beta.1"
  },
  {
    "abi": "89",
    "future": false,
    "lts": false,
    "runtime": "electron",
    "target": "13.0.0-beta.2"
  },
  {
    "abi": "89",
    "future": false,
    "lts": false,
    "runtime": "electron",
    "target": "15.0.0-alpha.1"
  },
  {
    "abi": "89",
    "future": false,
    "lts": false,
    "runtime": "electron",
    "target": "14.0.0-beta.1"
  },
  {
    "abi": "97",
    "future": false,
    "lts": false,
    "runtime": "electron",
    "target": "14.0.2"
  },
  {
    "abi": "98",
    "future": false,
    "lts": false,
    "runtime": "electron",
    "target": "15.0.0-beta.7"
  },
  {
    "abi": "99",
    "future": false,
    "lts": false,
    "runtime": "electron",
    "target": "16.0.0-alpha.1"
  },
  {
    "abi": "101",
    "future": false,
    "lts": false,
    "runtime": "electron",
    "target": "17.0.0-alpha.1"
  },
  {
    "abi": "103",
    "future": false,
    "lts": false,
    "runtime": "electron",
    "target": "18.0.0-alpha.1"
  },
  {
    "abi": "106",
    "future": false,
    "lts": false,
    "runtime": "electron",
    "target": "19.0.0-alpha.1"
  },
  {
    "abi": "107",
    "future": false,
    "lts": false,
    "runtime": "electron",
    "target": "20.0.0-alpha.1"
  },
  {
    "abi": "109",
    "future": false,
    "lts": false,
    "runtime": "electron",
    "target": "21.0.0-alpha.1"
  }
]var semver = require('semver')

function getNextTarget (runtime, targets) {
  if (targets == null) targets = allTargets
  var latest = targets.filter(function (t) { return t.runtime === runtime }).slice(-1)[0]
  var increment = runtime === 'electron' ? 'minor' : 'major'
  var next = semver.inc(latest.target, increment)
  // Electron releases appear in the registry in their beta form, sometimes there is
  // no active beta line.  During this time we need to double bump
  if (runtime === 'electron' && semver.parse(latest.target).prerelease.length) {
    next = semver.inc(next, 'major')
  }
  return next
}

function getAbi (target, runtime) {
  if (target === String(Number(target))) return target
  if (target) target = target.replace(/^v/, '')
  if (!runtime) runtime = 'node'

  if (runtime === 'node') {
    if (!target) return process.versions.modules
    if (target === process.versions.node) return process.versions.modules
  }

  var abi
  var lastTarget

  for (var i = 0; i < allTargets.length; i++) {
    var t = allTargets[i]
    if (t.runtime !== runtime) continue
    if (semver.lte(t.target, target) && (!lastTarget || semver.gte(t.target, lastTarget))) {
      abi = t.abi
      lastTarget = t.target
    }
  }

  if (abi && semver.lt(target, getNextTarget(runtime))) return abi
  throw new Error('Could not detect abi for version ' + target + ' and runtime ' + runtime + '.  Updating "node-abi" might help solve this issue if it is a new release of ' + runtime)
}

function getTarget (abi, runtime) {
  if (abi && abi !== String(Number(abi))) return abi
  if (!runtime) runtime = 'node'

  if (runtime === 'node' && !abi) return process.versions.node

  var match = allTargets
    .filter(function (t) {
      return t.abi === abi && t.runtime === runtime
    })
    .map(function (t) {
      return t.target
    })
  if (match.length) {
    var betaSeparatorIndex = match[0].indexOf("-")
    return betaSeparatorIndex > -1
      ? match[0].substring(0, betaSeparatorIndex)
      : match[0]
  }

  throw new Error('Could not detect target for abi ' + abi + ' and runtime ' + runtime)
}

function sortByTargetFn (a, b) {
  var abiComp = Number(a.abi) - Number(b.abi)
  if (abiComp !== 0) return abiComp
  if (a.target < b.target) return -1
  if (a.target > b.target) return 1
  return 0
}

function loadGeneratedTargets () {
  var registry = require('./abi_registry.json')
  var targets = {
    supported: [],
    additional: [],
    future: []
  }

  registry.forEach(function (item) {
    var target = {
      runtime: item.runtime,
      target: item.target,
      abi: item.abi
    }
    if (item.lts) {
      var startDate = new Date(Date.parse(item.lts[0]))
      var endDate = new Date(Date.parse(item.lts[1]))
      var currentDate = new Date()
      target.lts = startDate < currentDate && currentDate < endDate
    } else {
      target.lts = false
    }

    if (target.runtime === 'node-webkit') {
      targets.additional.push(target)
    } else if (item.future) {
      targets.future.push(target)
    } else {
      targets.supported.push(target)
    }
  })

  targets.supported.sort(sortByTargetFn)
  targets.additional.sort(sortByTargetFn)
  targets.future.sort(sortByTargetFn)

  return targets
}

var generatedTargets = loadGeneratedTargets()

var supportedTargets = [
  {runtime: 'node', target: '5.0.0', abi: '47', lts: false},
  {runtime: 'node', target: '6.0.0', abi: '48', lts: false},
  {runtime: 'node', target: '7.0.0', abi: '51', lts: false},
  {runtime: 'node', target: '8.0.0', abi: '57', lts: false},
  {runtime: 'node', target: '9.0.0', abi: '59', lts: false},
  {runtime: 'node', target: '10.0.0', abi: '64', lts: new Date(2018, 10, 1) < new Date() && new Date() < new Date(2020, 4, 31)},
  {runtime: 'electron', target: '0.36.0', abi: '47', lts: false},
  {runtime: 'electron', target: '1.1.0', abi: '48', lts: false},
  {runtime: 'electron', target: '1.3.0', abi: '49', lts: false},
  {runtime: 'electron', target: '1.4.0', abi: '50', lts: false},
  {runtime: 'electron', target: '1.5.0', abi: '51', lts: false},
  {runtime: 'electron', target: '1.6.0', abi: '53', lts: false},
  {runtime: 'electron', target: '1.7.0', abi: '54', lts: false},
  {runtime: 'electron', target: '1.8.0', abi: '57', lts: false},
  {runtime: 'electron', target: '2.0.0', abi: '57', lts: false},
  {runtime: 'electron', target: '3.0.0', abi: '64', lts: false},
  {runtime: 'electron', target: '4.0.0', abi: '64', lts: false},
  {runtime: 'electron', target: '4.0.4', abi: '69', lts: false}
]

supportedTargets.push.apply(supportedTargets, generatedTargets.supported)

var additionalTargets = [
  {runtime: 'node-webkit', target: '0.13.0', abi: '47', lts: false},
  {runtime: 'node-webkit', target: '0.15.0', abi: '48', lts: false},
  {runtime: 'node-webkit', target: '0.18.3', abi: '51', lts: false},
  {runtime: 'node-webkit', target: '0.23.0', abi: '57', lts: false},
  {runtime: 'node-webkit', target: '0.26.5', abi: '59', lts: false}
]

additionalTargets.push.apply(additionalTargets, generatedTargets.additional)

var deprecatedTargets = [
  {runtime: 'node', target: '0.2.0', abi: '1', lts: false},
  {runtime: 'node', target: '0.9.1', abi: '0x000A', lts: false},
  {runtime: 'node', target: '0.9.9', abi: '0x000B', lts: false},
  {runtime: 'node', target: '0.10.4', abi: '11', lts: false},
  {runtime: 'node', target: '0.11.0', abi: '0x000C', lts: false},
  {runtime: 'node', target: '0.11.8', abi: '13', lts: false},
  {runtime: 'node', target: '0.11.11', abi: '14', lts: false},
  {runtime: 'node', target: '1.0.0', abi: '42', lts: false},
  {runtime: 'node', target: '1.1.0', abi: '43', lts: false},
  {runtime: 'node', target: '2.0.0', abi: '44', lts: false},
  {runtime: 'node', target: '3.0.0', abi: '45', lts: false},
  {runtime: 'node', target: '4.0.0', abi: '46', lts: false},
  {runtime: 'electron', target: '0.30.0', abi: '44', lts: false},
  {runtime: 'electron', target: '0.31.0', abi: '45', lts: false},
  {runtime: 'electron', target: '0.33.0', abi: '46', lts: false}
]

var futureTargets = generatedTargets.future

var allTargets = deprecatedTargets
  .concat(supportedTargets)
  .concat(additionalTargets)
  .concat(futureTargets)

exports.getAbi = getAbi
exports.getTarget = getTarget
exports.deprecatedTargets = deprecatedTargets
exports.supportedTargets = supportedTargets
exports.additionalTargets = additionalTargets
exports.futureTargets = futureTargets
exports.allTargets = allTargets
exports._getNextTarget = getNextTarget
{
  "name": "node-abi",
  "version": "3.25.0",
  "description": "Get the Node ABI for a given target and runtime, and vice versa.",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "https://github.com/lgeiger/node-abi.git"
  },
  "author": "Lukas Geiger",
  "license": "MIT",
  "homepage": "https://github.com/lgeiger/node-abi#readme",
  "devDependencies": {
    "@continuous-auth/semantic-release-npm": "^2.0.0",
    "got": "^11.8.2",
    "tape": "^5.3.1"
  },
  "dependencies": {
    "semver": "^7.3.5"
  },
  "engines": {
    "node": ">=10"
  }
}const got = require('got')
const path = require('path')
const semver = require('semver')
const { writeFile } = require('fs').promises

async function getJSONFromCDN (urlPath) {
  const response = await got(`https://cdn.jsdelivr.net/gh/${urlPath}`)
  return JSON.parse(response.body)
}

async function fetchElectronReleases () {
  const response = await got(`https://electronjs.org/headers/index.json`)
  return JSON.parse(response.body)
}

async function fetchNodeVersions () {
  const schedule = await getJSONFromCDN('nodejs/Release/schedule.json')
  const versions = {}

  for (const [majorVersion, metadata] of Object.entries(schedule)) {
    if (majorVersion.startsWith('v0')) {
      continue
    }
    const version = `${majorVersion.slice(1)}.0.0`
    const lts = metadata.hasOwnProperty('lts') ? [metadata.lts, metadata.maintenance] : false
    versions[version] = {
      runtime: 'node',
      target: version,
      lts: lts,
      future: new Date(Date.parse(metadata.start)) > new Date()
    }
  }

  return versions
}

async function fetchAbiVersions () {
  return (await getJSONFromCDN('nodejs/node/doc/abi_version_registry.json'))
    .NODE_MODULE_VERSION
    .filter(({ modules }) => modules > 66)
}

function electronReleasesToTargets (releases) {
  const versions = releases.map(({ version }) => version)
  const versionsByModules = releases
    .filter(release => Number(release.modules) >= 70)
    .map(({ version, modules }) => ({
      version,
      modules,
    }))
    .filter(({ version }) => !version.includes('nightly'))
    .sort((a, b) => Number(a.modules) - Number(b.modules))
    .reduce(
      (acc, { modules, version }) => ({
        ...acc,
        [`${version.split('.')[0]}-${modules}`]: {
          version,
          modules,
        }
      }),
      {}
    )

    return Object.entries(versionsByModules)
      .map(
        ([major, {version, modules}]) => ({
          abi: modules,
          future: !versions.find(
            v => {
              const major = version.split(".")[0]
              return semver.satisfies(
                v,
                /^[0-9]/.test(major) ? `>= ${major}` : major
              )
            }
          ),
          lts: false,
          runtime: 'electron',
          target: version
        })
      )
}

function nodeVersionsToTargets (abiVersions, nodeVersions) {
  return Object.values(
    abiVersions
      .filter(({ runtime }) => runtime === 'node')
      .reduce(
        (acc, abiVersion) => {
          const { version: nodeVersion } = semver.coerce(abiVersion.versions)

          return {
            [nodeVersion]: {
              ...nodeVersions[nodeVersion],
              abi: abiVersion.modules.toString(),
            },
            ...acc,
          };
        },
        {}
      )
  )
}

async function main () {
  const nodeVersions = await fetchNodeVersions()
  const abiVersions = await fetchAbiVersions()
  const electronReleases = await fetchElectronReleases()
  const electronTargets = electronReleasesToTargets(electronReleases)
  const nodeTargets = nodeVersionsToTargets(abiVersions, nodeVersions)
  const supportedTargets = [
    ...nodeTargets,
    ...electronTargets,
  ]

  await writeFile(path.resolve(__dirname, '..', 'abi_registry.json'), JSON.stringify(supportedTargets, null, 2))
}

main()
name: Auto-update ABI JSON file
on:
  schedule:
    - cron: '0 * * * *'
jobs:
  autoupdate:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - uses: actions/setup-node@v1
      with:
        node-version: '12.x'
    - name: Get npm cache directory
      id: npm-cache
      run: |
        echo "::set-output name=dir::$(npm config get cache)"
    - uses: actions/cache@v1
      with:
        path: ${{ steps.npm-cache.outputs.dir }}
        key: ${{ runner.os }}-node-${{ hashFiles('**/package.json') }}
        restore-keys: |
          ${{ runner.os }}-node-
    - run: npm install --no-package-lock
    - name: Update ABI registry
      run: npm run update-abi-registry
    - name: Commit Changes to ABI registry
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: |
        echo "machine github.com login $GITHUB_ACTOR password $GITHUB_TOKEN" > ~/.netrc
        chmod 600 ~/.netrc
        git add abi_registry.json
        if test -n "$(git status -s)"; then
          git config user.name "GitHub Actions"
          git config user.email "github-actions@users.noreply.github.com"
          git diff --cached
          git commit -m "feat: update ABI registry"
          git push origin HEAD:$GITHUB_REF
        else
          echo No update needed
        fi
MIT License

Copyright (c) 2019 Steve Faulkner

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.
# Node.js
# Build a general Node.js project with npm.
# Add steps that analyze code, save build artifacts, deploy, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/javascript

trigger:
- master

pool:
  vmImage: 'Ubuntu-16.04'

steps:
- task: NodeTool@0
  inputs:
    versionSpec: '10.x'
  displayName: 'Install Node.js'

- script: |
    npm install
    npm test
  displayName: 'npm install and build'
'use strict'

const _global =
  typeof self !== 'undefined'
    ? self
    : typeof window !== 'undefined'
    ? window
    : /* otherwise */ undefined

if (!_global) {
  throw new Error(
    `Unable to find global scope. Are you sure this is running in the browser?`
  )
}

if (!_global.AbortController) {
  throw new Error(
    `Could not find "AbortController" in the global scope. You need to polyfill it first`
  )
}

module.exports.AbortController = _global.AbortControllerconst { EventEmitter } = require("events");

class AbortSignal {
  constructor() {
    this.eventEmitter = new EventEmitter();
    this.onabort = null;
    this.aborted = false;
  }
  toString() {
    return "[object AbortSignal]";
  }
  get [Symbol.toStringTag]() {
    return "AbortSignal";
  }
  removeEventListener(name, handler) {
    this.eventEmitter.removeListener(name, handler);
  }
  addEventListener(name, handler) {
    this.eventEmitter.on(name, handler);
  }
  dispatchEvent(type) {
    const event = { type, target: this };
    const handlerName = `on${type}`;

    if (typeof this[handlerName] === "function") this[handlerName](event);

    this.eventEmitter.emit(type, event);
  }
}
class AbortController {
  constructor() {
    this.signal = new AbortSignal();
  }
  abort() {
    if (this.signal.aborted) return;

    this.signal.aborted = true;
    this.signal.dispatchEvent("abort");
  }
  toString() {
    return "[object AbortController]";
  }
  get [Symbol.toStringTag]() {
    return "AbortController";
  }
}

module.exports = { AbortController, AbortSignal };
{
  "name": "node-abort-controller",
  "version": "3.0.1",
  "description": "AbortController for Node based on EventEmitter",
  "main": "index.js",
  "browser": "browser.js",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/southpolesteve/node-abort-controller.git"
  },
  "author": "Steve Faulkner <southpolesteve@gmail.com>",
  "license": "MIT",
  "homepage": "https://github.com/southpolesteve/node-abort-controller#readme",
  "devDependencies": {
    "jest": "^27.2.4",
    "node-fetch": "^2.6.5",
    "whatwg-fetch": "^3.6.2"
  },
  "jest": {
    "testEnvironment": "jsdom"
  }
}The MIT License (MIT)
=====================

Copyright (c) 2017 Node.js API collaborators
-----------------------------------

*Node.js API collaborators listed at <https://github.com/nodejs/node-addon-api#collaborators>*

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.{
  'variables': {
    'NAPI_VERSION%': "<!(node -p \"process.versions.napi\")",
    'disable_deprecated': "<!(node -p \"process.env['npm_config_disable_deprecated']\")"
  },
  'conditions': [
    ['NAPI_VERSION!=""', { 'defines': ['NAPI_VERSION=<@(NAPI_VERSION)'] } ],
    ['disable_deprecated=="true"', {
      'defines': ['NODE_ADDON_API_DISABLE_DEPRECATED']
    }],
    ['OS=="mac"', {
      'cflags+': ['-fvisibility=hidden'],
      'xcode_settings': {
        'OTHER_CFLAGS': ['-fvisibility=hidden']
      }
    }]
  ],
  'include_dirs': ["<!(node -p \"require('../').include_dir\")"],
  'cflags': [ '-Werror', '-Wall', '-Wextra', '-Wpedantic', '-Wunused-parameter' ],
  'cflags_cc': [ '-Werror', '-Wall', '-Wextra', '-Wpedantic', '-Wunused-parameter' ]
}
{
  'defines': [ 'NAPI_CPP_EXCEPTIONS' ],
  'cflags!': [ '-fno-exceptions' ],
  'cflags_cc!': [ '-fno-exceptions' ],
  'conditions': [
    ["OS=='win'", {
      "defines": [
        "_HAS_EXCEPTIONS=1"
      ],
      "msvs_settings": {
        "VCCLCompilerTool": {
          "ExceptionHandling": 1,
          'EnablePREfast': 'true',
        },
      },
    }],
    ["OS=='mac'", {
      'xcode_settings': {
        'GCC_ENABLE_CPP_EXCEPTIONS': 'YES',
        'CLANG_CXX_LIBRARY': 'libc++',
        'MACOSX_DEPLOYMENT_TARGET': '10.7',
      },
    }],
  ],
}
const path = require('path');

const include_dir = path.relative('.', __dirname);

module.exports = {
  include: `"${__dirname}"`, // deprecated, can be removed as part of 4.0.0
  include_dir,
  gyp: path.join(include_dir, 'node_api.gyp:nothing'),
  isNodeApiBuiltin: true,
  needsFlag: false
};
#ifndef SRC_NAPI_INL_DEPRECATED_H_
#define SRC_NAPI_INL_DEPRECATED_H_

////////////////////////////////////////////////////////////////////////////////
// PropertyDescriptor class
////////////////////////////////////////////////////////////////////////////////

template <typename Getter>
inline PropertyDescriptor
PropertyDescriptor::Accessor(const char* utf8name,
                             Getter getter,
                             napi_property_attributes attributes,
                             void* /*data*/) {
  using CbData = details::CallbackData<Getter, Napi::Value>;
  // TODO: Delete when the function is destroyed
  auto callbackData = new CbData({ getter, nullptr });

  return PropertyDescriptor({
    utf8name,
    nullptr,
    nullptr,
    CbData::Wrapper,
    nullptr,
    nullptr,
    attributes,
    callbackData
  });
}

template <typename Getter>
inline PropertyDescriptor PropertyDescriptor::Accessor(const std::string& utf8name,
                                                       Getter getter,
                                                       napi_property_attributes attributes,
                                                       void* data) {
  return Accessor(utf8name.c_str(), getter, attributes, data);
}

template <typename Getter>
inline PropertyDescriptor PropertyDescriptor::Accessor(napi_value name,
                                                       Getter getter,
                                                       napi_property_attributes attributes,
                                                       void* /*data*/) {
  using CbData = details::CallbackData<Getter, Napi::Value>;
  // TODO: Delete when the function is destroyed
  auto callbackData = new CbData({ getter, nullptr });

  return PropertyDescriptor({
    nullptr,
    name,
    nullptr,
    CbData::Wrapper,
    nullptr,
    nullptr,
    attributes,
    callbackData
  });
}

template <typename Getter>
inline PropertyDescriptor PropertyDescriptor::Accessor(Name name,
                                                       Getter getter,
                                                       napi_property_attributes attributes,
                                                       void* data) {
  napi_value nameValue = name;
  return PropertyDescriptor::Accessor(nameValue, getter, attributes, data);
}

template <typename Getter, typename Setter>
inline PropertyDescriptor PropertyDescriptor::Accessor(const char* utf8name,
                                                       Getter getter,
                                                       Setter setter,
                                                       napi_property_attributes attributes,
                                                       void* /*data*/) {
  using CbData = details::AccessorCallbackData<Getter, Setter>;
  // TODO: Delete when the function is destroyed
  auto callbackData = new CbData({ getter, setter, nullptr });

  return PropertyDescriptor({
    utf8name,
    nullptr,
    nullptr,
    CbData::GetterWrapper,
    CbData::SetterWrapper,
    nullptr,
    attributes,
    callbackData
  });
}

template <typename Getter, typename Setter>
inline PropertyDescriptor PropertyDescriptor::Accessor(const std::string& utf8name,
                                                       Getter getter,
                                                       Setter setter,
                                                       napi_property_attributes attributes,
                                                       void* data) {
  return Accessor(utf8name.c_str(), getter, setter, attributes, data);
}

template <typename Getter, typename Setter>
inline PropertyDescriptor PropertyDescriptor::Accessor(napi_value name,
                                                       Getter getter,
                                                       Setter setter,
                                                       napi_property_attributes attributes,
                                                       void* /*data*/) {
  using CbData = details::AccessorCallbackData<Getter, Setter>;
  // TODO: Delete when the function is destroyed
  auto callbackData = new CbData({ getter, setter, nullptr });

  return PropertyDescriptor({
    nullptr,
    name,
    nullptr,
    CbData::GetterWrapper,
    CbData::SetterWrapper,
    nullptr,
    attributes,
    callbackData
  });
}

template <typename Getter, typename Setter>
inline PropertyDescriptor PropertyDescriptor::Accessor(Name name,
                                                       Getter getter,
                                                       Setter setter,
                                                       napi_property_attributes attributes,
                                                       void* data) {
  napi_value nameValue = name;
  return PropertyDescriptor::Accessor(nameValue, getter, setter, attributes, data);
}

template <typename Callable>
inline PropertyDescriptor PropertyDescriptor::Function(const char* utf8name,
                                                       Callable cb,
                                                       napi_property_attributes attributes,
                                                       void* /*data*/) {
  using ReturnType = decltype(cb(CallbackInfo(nullptr, nullptr)));
  using CbData = details::CallbackData<Callable, ReturnType>;
  // TODO: Delete when the function is destroyed
  auto callbackData = new CbData({ cb, nullptr });

  return PropertyDescriptor({
    utf8name,
    nullptr,
    CbData::Wrapper,
    nullptr,
    nullptr,
    nullptr,
    attributes,
    callbackData
  });
}

template <typename Callable>
inline PropertyDescriptor PropertyDescriptor::Function(const std::string& utf8name,
                                                       Callable cb,
                                                       napi_property_attributes attributes,
                                                       void* data) {
  return Function(utf8name.c_str(), cb, attributes, data);
}

template <typename Callable>
inline PropertyDescriptor PropertyDescriptor::Function(napi_value name,
                                                       Callable cb,
                                                       napi_property_attributes attributes,
                                                       void* /*data*/) {
  using ReturnType = decltype(cb(CallbackInfo(nullptr, nullptr)));
  using CbData = details::CallbackData<Callable, ReturnType>;
  // TODO: Delete when the function is destroyed
  auto callbackData = new CbData({ cb, nullptr });

  return PropertyDescriptor({
    nullptr,
    name,
    CbData::Wrapper,
    nullptr,
    nullptr,
    nullptr,
    attributes,
    callbackData
  });
}

template <typename Callable>
inline PropertyDescriptor PropertyDescriptor::Function(Name name,
                                                       Callable cb,
                                                       napi_property_attributes attributes,
                                                       void* data) {
  napi_value nameValue = name;
  return PropertyDescriptor::Function(nameValue, cb, attributes, data);
}

#endif // !SRC_NAPI_INL_DEPRECATED_H_
#ifndef SRC_NAPI_INL_H_
#define SRC_NAPI_INL_H_

////////////////////////////////////////////////////////////////////////////////
// Node-API C++ Wrapper Classes
//
// Inline header-only implementations for "Node-API" ABI-stable C APIs for
// Node.js.
////////////////////////////////////////////////////////////////////////////////

// Note: Do not include this file directly! Include "napi.h" instead.

#include <algorithm>
#include <cstring>
#include <mutex>
#include <type_traits>
#include <utility>

namespace Napi {

// Helpers to handle functions exposed from C++.
namespace details {

// Attach a data item to an object and delete it when the object gets
// garbage-collected.
// TODO: Replace this code with `napi_add_finalizer()` whenever it becomes
// available on all supported versions of Node.js.
template <typename FreeType>
static inline napi_status AttachData(napi_env env,
                                     napi_value obj,
                                     FreeType* data,
                                     napi_finalize finalizer = nullptr,
                                     void* hint = nullptr) {
  napi_status status;
  if (finalizer == nullptr) {
    finalizer = [](napi_env /*env*/, void* data, void* /*hint*/) {
      delete static_cast<FreeType*>(data);
    };
  }
#if (NAPI_VERSION < 5)
  napi_value symbol, external;
  status = napi_create_symbol(env, nullptr, &symbol);
  if (status == napi_ok) {
    status = napi_create_external(env,
                              data,
                              finalizer,
                              hint,
                              &external);
    if (status == napi_ok) {
      napi_property_descriptor desc = {
        nullptr,
        symbol,
        nullptr,
        nullptr,
        nullptr,
        external,
        napi_default,
        nullptr
      };
      status = napi_define_properties(env, obj, 1, &desc);
    }
  }
#else  // NAPI_VERSION >= 5
  status = napi_add_finalizer(env, obj, data, finalizer, hint, nullptr);
#endif
  return status;
}

// For use in JS to C++ callback wrappers to catch any Napi::Error exceptions
// and rethrow them as JavaScript exceptions before returning from the callback.
template <typename Callable>
inline napi_value WrapCallback(Callable callback) {
#ifdef NAPI_CPP_EXCEPTIONS
  try {
    return callback();
  } catch (const Error& e) {
    e.ThrowAsJavaScriptException();
    return nullptr;
  }
#else // NAPI_CPP_EXCEPTIONS
  // When C++ exceptions are disabled, errors are immediately thrown as JS
  // exceptions, so there is no need to catch and rethrow them here.
  return callback();
#endif // NAPI_CPP_EXCEPTIONS
}

// For use in JS to C++ void callback wrappers to catch any Napi::Error
// exceptions and rethrow them as JavaScript exceptions before returning from the
// callback.
template <typename Callable>
inline void WrapVoidCallback(Callable callback) {
#ifdef NAPI_CPP_EXCEPTIONS
  try {
    callback();
  } catch (const Error& e) {
    e.ThrowAsJavaScriptException();
  }
#else // NAPI_CPP_EXCEPTIONS
  // When C++ exceptions are disabled, errors are immediately thrown as JS
  // exceptions, so there is no need to catch and rethrow them here.
  callback();
#endif // NAPI_CPP_EXCEPTIONS
}

template <typename Callable, typename Return>
struct CallbackData {
  static inline
  napi_value Wrapper(napi_env env, napi_callback_info info) {
    return details::WrapCallback([&] {
      CallbackInfo callbackInfo(env, info);
      CallbackData* callbackData =
        static_cast<CallbackData*>(callbackInfo.Data());
      callbackInfo.SetData(callbackData->data);
      return callbackData->callback(callbackInfo);
    });
  }

  Callable callback;
  void* data;
};

template <typename Callable>
struct CallbackData<Callable, void> {
  static inline
  napi_value Wrapper(napi_env env, napi_callback_info info) {
    return details::WrapCallback([&] {
      CallbackInfo callbackInfo(env, info);
      CallbackData* callbackData =
        static_cast<CallbackData*>(callbackInfo.Data());
      callbackInfo.SetData(callbackData->data);
      callbackData->callback(callbackInfo);
      return nullptr;
    });
  }

  Callable callback;
  void* data;
};

template <void (*Callback)(const CallbackInfo& info)>
static napi_value
TemplatedVoidCallback(napi_env env, napi_callback_info info) NAPI_NOEXCEPT {
  return details::WrapCallback([&] {
    CallbackInfo cbInfo(env, info);
    Callback(cbInfo);
    return nullptr;
  });
}

template <Napi::Value (*Callback)(const CallbackInfo& info)>
static napi_value
TemplatedCallback(napi_env env, napi_callback_info info) NAPI_NOEXCEPT {
  return details::WrapCallback([&] {
    CallbackInfo cbInfo(env, info);
    return Callback(cbInfo);
  });
}

template <typename T,
          Napi::Value (T::*UnwrapCallback)(const CallbackInfo& info)>
static napi_value
TemplatedInstanceCallback(napi_env env, napi_callback_info info) NAPI_NOEXCEPT {
  return details::WrapCallback([&] {
    CallbackInfo cbInfo(env, info);
    T* instance = T::Unwrap(cbInfo.This().As<Object>());
    return (instance->*UnwrapCallback)(cbInfo);
  });
}

template <typename T, void (T::*UnwrapCallback)(const CallbackInfo& info)>
static napi_value
TemplatedInstanceVoidCallback(napi_env env,
                              napi_callback_info info) NAPI_NOEXCEPT {
  return details::WrapCallback([&] {
    CallbackInfo cbInfo(env, info);
    T* instance = T::Unwrap(cbInfo.This().As<Object>());
    (instance->*UnwrapCallback)(cbInfo);
    return nullptr;
  });
}

template <typename T, typename Finalizer, typename Hint = void>
struct FinalizeData {
  static inline void Wrapper(napi_env env,
                             void* data,
                             void* finalizeHint) NAPI_NOEXCEPT {
    WrapVoidCallback([&] {
      FinalizeData* finalizeData = static_cast<FinalizeData*>(finalizeHint);
      finalizeData->callback(Env(env), static_cast<T*>(data));
      delete finalizeData;
    });
  }

  static inline void WrapperWithHint(napi_env env,
                                     void* data,
                                     void* finalizeHint) NAPI_NOEXCEPT {
    WrapVoidCallback([&] {
      FinalizeData* finalizeData = static_cast<FinalizeData*>(finalizeHint);
      finalizeData->callback(Env(env), static_cast<T*>(data), finalizeData->hint);
      delete finalizeData;
    });
  }

  Finalizer callback;
  Hint* hint;
};

#if (NAPI_VERSION > 3 && !defined(__wasm32__))
template <typename ContextType=void,
          typename Finalizer=std::function<void(Env, void*, ContextType*)>,
          typename FinalizerDataType=void>
struct ThreadSafeFinalize {
  static inline
  void Wrapper(napi_env env, void* rawFinalizeData, void* /* rawContext */) {
    if (rawFinalizeData == nullptr)
      return;

    ThreadSafeFinalize* finalizeData =
        static_cast<ThreadSafeFinalize*>(rawFinalizeData);
    finalizeData->callback(Env(env));
    delete finalizeData;
  }

  static inline
  void FinalizeWrapperWithData(napi_env env,
                               void* rawFinalizeData,
                               void* /* rawContext */) {
    if (rawFinalizeData == nullptr)
      return;

    ThreadSafeFinalize* finalizeData =
        static_cast<ThreadSafeFinalize*>(rawFinalizeData);
    finalizeData->callback(Env(env), finalizeData->data);
    delete finalizeData;
  }

  static inline
  void FinalizeWrapperWithContext(napi_env env,
                                  void* rawFinalizeData,
                                  void* rawContext) {
    if (rawFinalizeData == nullptr)
      return;

    ThreadSafeFinalize* finalizeData =
        static_cast<ThreadSafeFinalize*>(rawFinalizeData);
    finalizeData->callback(Env(env), static_cast<ContextType*>(rawContext));
    delete finalizeData;
  }

  static inline
  void FinalizeFinalizeWrapperWithDataAndContext(napi_env env,
                                         void* rawFinalizeData,
                                         void* rawContext) {
    if (rawFinalizeData == nullptr)
      return;

    ThreadSafeFinalize* finalizeData =
        static_cast<ThreadSafeFinalize*>(rawFinalizeData);
    finalizeData->callback(Env(env), finalizeData->data,
        static_cast<ContextType*>(rawContext));
    delete finalizeData;
  }

  FinalizerDataType* data;
  Finalizer callback;
};

template <typename ContextType, typename DataType, typename CallJs, CallJs call>
typename std::enable_if<call != nullptr>::type static inline CallJsWrapper(
    napi_env env, napi_value jsCallback, void* context, void* data) {
  call(env,
       Function(env, jsCallback),
       static_cast<ContextType*>(context),
       static_cast<DataType*>(data));
}

template <typename ContextType, typename DataType, typename CallJs, CallJs call>
typename std::enable_if<call == nullptr>::type static inline CallJsWrapper(
    napi_env env, napi_value jsCallback, void* /*context*/, void* /*data*/) {
  if (jsCallback != nullptr) {
    Function(env, jsCallback).Call(0, nullptr);
  }
}

#if NAPI_VERSION > 4

template <typename CallbackType, typename TSFN>
napi_value DefaultCallbackWrapper(napi_env /*env*/, std::nullptr_t /*cb*/) {
  return nullptr;
}

template <typename CallbackType, typename TSFN>
napi_value DefaultCallbackWrapper(napi_env /*env*/, Napi::Function cb) {
  return cb;
}

#else
template <typename CallbackType, typename TSFN>
napi_value DefaultCallbackWrapper(napi_env env, Napi::Function cb) {
  if (cb.IsEmpty()) {
    return TSFN::EmptyFunctionFactory(env);
  }
  return cb;
}
#endif  // NAPI_VERSION > 4
#endif  // NAPI_VERSION > 3 && !defined(__wasm32__)

template <typename Getter, typename Setter>
struct AccessorCallbackData {
  static inline
  napi_value GetterWrapper(napi_env env, napi_callback_info info) {
    return details::WrapCallback([&] {
      CallbackInfo callbackInfo(env, info);
      AccessorCallbackData* callbackData =
        static_cast<AccessorCallbackData*>(callbackInfo.Data());
      callbackInfo.SetData(callbackData->data);
      return callbackData->getterCallback(callbackInfo);
    });
  }

  static inline
  napi_value SetterWrapper(napi_env env, napi_callback_info info) {
    return details::WrapCallback([&] {
      CallbackInfo callbackInfo(env, info);
      AccessorCallbackData* callbackData =
        static_cast<AccessorCallbackData*>(callbackInfo.Data());
      callbackInfo.SetData(callbackData->data);
      callbackData->setterCallback(callbackInfo);
      return nullptr;
    });
  }

  Getter getterCallback;
  Setter setterCallback;
  void* data;
};

}  // namespace details

#ifndef NODE_ADDON_API_DISABLE_DEPRECATED
# include "napi-inl.deprecated.h"
#endif // !NODE_ADDON_API_DISABLE_DEPRECATED

////////////////////////////////////////////////////////////////////////////////
// Module registration
////////////////////////////////////////////////////////////////////////////////

// Register an add-on based on an initializer function.
#define NODE_API_MODULE(modname, regfunc)                                      \
  static napi_value __napi_##regfunc(napi_env env, napi_value exports) {       \
    return Napi::RegisterModule(env, exports, regfunc);                        \
  }                                                                            \
  NAPI_MODULE(modname, __napi_##regfunc)

// Register an add-on based on a subclass of `Addon<T>` with a custom Node.js
// module name.
#define NODE_API_NAMED_ADDON(modname, classname)                 \
  static napi_value __napi_ ## classname(napi_env env,           \
                                         napi_value exports) {   \
    return Napi::RegisterModule(env, exports, &classname::Init); \
  }                                                              \
  NAPI_MODULE(modname, __napi_ ## classname)

// Register an add-on based on a subclass of `Addon<T>` with the Node.js module
// name given by node-gyp from the `target_name` in binding.gyp.
#define NODE_API_ADDON(classname) \
  NODE_API_NAMED_ADDON(NODE_GYP_MODULE_NAME, classname)

// Adapt the NAPI_MODULE registration function:
//  - Wrap the arguments in NAPI wrappers.
//  - Catch any NAPI errors and rethrow as JS exceptions.
inline napi_value RegisterModule(napi_env env,
                                 napi_value exports,
                                 ModuleRegisterCallback registerCallback) {
  return details::WrapCallback([&] {
    return napi_value(registerCallback(Napi::Env(env),
                                       Napi::Object(env, exports)));
  });
}

////////////////////////////////////////////////////////////////////////////////
// Maybe class
////////////////////////////////////////////////////////////////////////////////

template <class T>
bool Maybe<T>::IsNothing() const {
  return !_has_value;
}

template <class T>
bool Maybe<T>::IsJust() const {
  return _has_value;
}

template <class T>
void Maybe<T>::Check() const {
  NAPI_CHECK(IsJust(), "Napi::Maybe::Check", "Maybe value is Nothing.");
}

template <class T>
T Maybe<T>::Unwrap() const {
  NAPI_CHECK(IsJust(), "Napi::Maybe::Unwrap", "Maybe value is Nothing.");
  return _value;
}

template <class T>
T Maybe<T>::UnwrapOr(const T& default_value) const {
  return _has_value ? _value : default_value;
}

template <class T>
bool Maybe<T>::UnwrapTo(T* out) const {
  if (IsJust()) {
    *out = _value;
    return true;
  };
  return false;
}

template <class T>
bool Maybe<T>::operator==(const Maybe& other) const {
  return (IsJust() == other.IsJust()) &&
         (!IsJust() || Unwrap() == other.Unwrap());
}

template <class T>
bool Maybe<T>::operator!=(const Maybe& other) const {
  return !operator==(other);
}

template <class T>
Maybe<T>::Maybe() : _has_value(false) {}

template <class T>
Maybe<T>::Maybe(const T& t) : _has_value(true), _value(t) {}

template <class T>
inline Maybe<T> Nothing() {
  return Maybe<T>();
}

template <class T>
inline Maybe<T> Just(const T& t) {
  return Maybe<T>(t);
}

////////////////////////////////////////////////////////////////////////////////
// Env class
////////////////////////////////////////////////////////////////////////////////

inline Env::Env(napi_env env) : _env(env) {
}

inline Env::operator napi_env() const {
  return _env;
}

inline Object Env::Global() const {
  napi_value value;
  napi_status status = napi_get_global(*this, &value);
  NAPI_THROW_IF_FAILED(*this, status, Object());
  return Object(*this, value);
}

inline Value Env::Undefined() const {
  napi_value value;
  napi_status status = napi_get_undefined(*this, &value);
  NAPI_THROW_IF_FAILED(*this, status, Value());
  return Value(*this, value);
}

inline Value Env::Null() const {
  napi_value value;
  napi_status status = napi_get_null(*this, &value);
  NAPI_THROW_IF_FAILED(*this, status, Value());
  return Value(*this, value);
}

inline bool Env::IsExceptionPending() const {
  bool result;
  napi_status status = napi_is_exception_pending(_env, &result);
  if (status != napi_ok) result = false; // Checking for a pending exception shouldn't throw.
  return result;
}

inline Error Env::GetAndClearPendingException() {
  napi_value value;
  napi_status status = napi_get_and_clear_last_exception(_env, &value);
  if (status != napi_ok) {
    // Don't throw another exception when failing to get the exception!
    return Error();
  }
  return Error(_env, value);
}

inline MaybeOrValue<Value> Env::RunScript(const char* utf8script) {
  String script = String::New(_env, utf8script);
  return RunScript(script);
}

inline MaybeOrValue<Value> Env::RunScript(const std::string& utf8script) {
  return RunScript(utf8script.c_str());
}

inline MaybeOrValue<Value> Env::RunScript(String script) {
  napi_value result;
  napi_status status = napi_run_script(_env, script, &result);
  NAPI_RETURN_OR_THROW_IF_FAILED(
      _env, status, Napi::Value(_env, result), Napi::Value);
}

#if NAPI_VERSION > 2
template <typename Hook, typename Arg>
void Env::CleanupHook<Hook, Arg>::Wrapper(void* data) NAPI_NOEXCEPT {
  auto* cleanupData =
      static_cast<typename Napi::Env::CleanupHook<Hook, Arg>::CleanupData*>(
          data);
  cleanupData->hook();
  delete cleanupData;
}

template <typename Hook, typename Arg>
void Env::CleanupHook<Hook, Arg>::WrapperWithArg(void* data) NAPI_NOEXCEPT {
  auto* cleanupData =
      static_cast<typename Napi::Env::CleanupHook<Hook, Arg>::CleanupData*>(
          data);
  cleanupData->hook(static_cast<Arg*>(cleanupData->arg));
  delete cleanupData;
}
#endif  // NAPI_VERSION > 2

#if NAPI_VERSION > 5
template <typename T, Env::Finalizer<T> fini>
inline void Env::SetInstanceData(T* data) {
  napi_status status =
    napi_set_instance_data(_env, data, [](napi_env env, void* data, void*) {
      fini(env, static_cast<T*>(data));
    }, nullptr);
  NAPI_THROW_IF_FAILED_VOID(_env, status);
}

template <typename DataType,
          typename HintType,
          Napi::Env::FinalizerWithHint<DataType, HintType> fini>
inline void Env::SetInstanceData(DataType* data, HintType* hint) {
  napi_status status =
    napi_set_instance_data(_env, data,
      [](napi_env env, void* data, void* hint) {
        fini(env, static_cast<DataType*>(data), static_cast<HintType*>(hint));
      }, hint);
  NAPI_THROW_IF_FAILED_VOID(_env, status);
}

template <typename T>
inline T* Env::GetInstanceData() {
  void* data = nullptr;

  napi_status status = napi_get_instance_data(_env, &data);
  NAPI_THROW_IF_FAILED(_env, status, nullptr);

  return static_cast<T*>(data);
}

template <typename T> void Env::DefaultFini(Env, T* data) {
  delete data;
}

template <typename DataType, typename HintType>
void Env::DefaultFiniWithHint(Env, DataType* data, HintType*) {
  delete data;
}
#endif  // NAPI_VERSION > 5

////////////////////////////////////////////////////////////////////////////////
// Value class
////////////////////////////////////////////////////////////////////////////////

inline Value::Value() : _env(nullptr), _value(nullptr) {
}

inline Value::Value(napi_env env, napi_value value) : _env(env), _value(value) {
}

inline Value::operator napi_value() const {
  return _value;
}

inline bool Value::operator ==(const Value& other) const {
  return StrictEquals(other);
}

inline bool Value::operator !=(const Value& other) const {
  return !this->operator ==(other);
}

inline bool Value::StrictEquals(const Value& other) const {
  bool result;
  napi_status status = napi_strict_equals(_env, *this, other, &result);
  NAPI_THROW_IF_FAILED(_env, status, false);
  return result;
}

inline Napi::Env Value::Env() const {
  return Napi::Env(_env);
}

inline bool Value::IsEmpty() const {
  return _value == nullptr;
}

inline napi_valuetype Value::Type() const {
  if (IsEmpty()) {
    return napi_undefined;
  }

  napi_valuetype type;
  napi_status status = napi_typeof(_env, _value, &type);
  NAPI_THROW_IF_FAILED(_env, status, napi_undefined);
  return type;
}

inline bool Value::IsUndefined() const {
  return Type() == napi_undefined;
}

inline bool Value::IsNull() const {
  return Type() == napi_null;
}

inline bool Value::IsBoolean() const {
  return Type() == napi_boolean;
}

inline bool Value::IsNumber() const {
  return Type() == napi_number;
}

#if NAPI_VERSION > 5
inline bool Value::IsBigInt() const {
  return Type() == napi_bigint;
}
#endif  // NAPI_VERSION > 5

#if (NAPI_VERSION > 4)
inline bool Value::IsDate() const {
  if (IsEmpty()) {
    return false;
  }

  bool result;
  napi_status status = napi_is_date(_env, _value, &result);
  NAPI_THROW_IF_FAILED(_env, status, false);
  return result;
}
#endif

inline bool Value::IsString() const {
  return Type() == napi_string;
}

inline bool Value::IsSymbol() const {
  return Type() == napi_symbol;
}

inline bool Value::IsArray() const {
  if (IsEmpty()) {
    return false;
  }

  bool result;
  napi_status status = napi_is_array(_env, _value, &result);
  NAPI_THROW_IF_FAILED(_env, status, false);
  return result;
}

inline bool Value::IsArrayBuffer() const {
  if (IsEmpty()) {
    return false;
  }

  bool result;
  napi_status status = napi_is_arraybuffer(_env, _value, &result);
  NAPI_THROW_IF_FAILED(_env, status, false);
  return result;
}

inline bool Value::IsTypedArray() const {
  if (IsEmpty()) {
    return false;
  }

  bool result;
  napi_status status = napi_is_typedarray(_env, _value, &result);
  NAPI_THROW_IF_FAILED(_env, status, false);
  return result;
}

inline bool Value::IsObject() const {
  return Type() == napi_object || IsFunction();
}

inline bool Value::IsFunction() const {
  return Type() == napi_function;
}

inline bool Value::IsPromise() const {
  if (IsEmpty()) {
    return false;
  }

  bool result;
  napi_status status = napi_is_promise(_env, _value, &result);
  NAPI_THROW_IF_FAILED(_env, status, false);
  return result;
}

inline bool Value::IsDataView() const {
  if (IsEmpty()) {
    return false;
  }

  bool result;
  napi_status status = napi_is_dataview(_env, _value, &result);
  NAPI_THROW_IF_FAILED(_env, status, false);
  return result;
}

inline bool Value::IsBuffer() const {
  if (IsEmpty()) {
    return false;
  }

  bool result;
  napi_status status = napi_is_buffer(_env, _value, &result);
  NAPI_THROW_IF_FAILED(_env, status, false);
  return result;
}

inline bool Value::IsExternal() const {
  return Type() == napi_external;
}

template <typename T>
inline T Value::As() const {
  return T(_env, _value);
}

inline MaybeOrValue<Boolean> Value::ToBoolean() const {
  napi_value result;
  napi_status status = napi_coerce_to_bool(_env, _value, &result);
  NAPI_RETURN_OR_THROW_IF_FAILED(
      _env, status, Napi::Boolean(_env, result), Napi::Boolean);
}

inline MaybeOrValue<Number> Value::ToNumber() const {
  napi_value result;
  napi_status status = napi_coerce_to_number(_env, _value, &result);
  NAPI_RETURN_OR_THROW_IF_FAILED(
      _env, status, Napi::Number(_env, result), Napi::Number);
}

inline MaybeOrValue<String> Value::ToString() const {
  napi_value result;
  napi_status status = napi_coerce_to_string(_env, _value, &result);
  NAPI_RETURN_OR_THROW_IF_FAILED(
      _env, status, Napi::String(_env, result), Napi::String);
}

inline MaybeOrValue<Object> Value::ToObject() const {
  napi_value result;
  napi_status status = napi_coerce_to_object(_env, _value, &result);
  NAPI_RETURN_OR_THROW_IF_FAILED(
      _env, status, Napi::Object(_env, result), Napi::Object);
}

////////////////////////////////////////////////////////////////////////////////
// Boolean class
////////////////////////////////////////////////////////////////////////////////

inline Boolean Boolean::New(napi_env env, bool val) {
  napi_value value;
  napi_status status = napi_get_boolean(env, val, &value);
  NAPI_THROW_IF_FAILED(env, status, Boolean());
  return Boolean(env, value);
}

inline Boolean::Boolean() : Napi::Value() {
}

inline Boolean::Boolean(napi_env env, napi_value value) : Napi::Value(env, value) {
}

inline Boolean::operator bool() const {
  return Value();
}

inline bool Boolean::Value() const {
  bool result;
  napi_status status = napi_get_value_bool(_env, _value, &result);
  NAPI_THROW_IF_FAILED(_env, status, false);
  return result;
}

////////////////////////////////////////////////////////////////////////////////
// Number class
////////////////////////////////////////////////////////////////////////////////

inline Number Number::New(napi_env env, double val) {
  napi_value value;
  napi_status status = napi_create_double(env, val, &value);
  NAPI_THROW_IF_FAILED(env, status, Number());
  return Number(env, value);
}

inline Number::Number() : Value() {
}

inline Number::Number(napi_env env, napi_value value) : Value(env, value) {
}

inline Number::operator int32_t() const {
  return Int32Value();
}

inline Number::operator uint32_t() const {
  return Uint32Value();
}

inline Number::operator int64_t() const {
  return Int64Value();
}

inline Number::operator float() const {
  return FloatValue();
}

inline Number::operator double() const {
  return DoubleValue();
}

inline int32_t Number::Int32Value() const {
  int32_t result;
  napi_status status = napi_get_value_int32(_env, _value, &result);
  NAPI_THROW_IF_FAILED(_env, status, 0);
  return result;
}

inline uint32_t Number::Uint32Value() const {
  uint32_t result;
  napi_status status = napi_get_value_uint32(_env, _value, &result);
  NAPI_THROW_IF_FAILED(_env, status, 0);
  return result;
}

inline int64_t Number::Int64Value() const {
  int64_t result;
  napi_status status = napi_get_value_int64(_env, _value, &result);
  NAPI_THROW_IF_FAILED(_env, status, 0);
  return result;
}

inline float Number::FloatValue() const {
  return static_cast<float>(DoubleValue());
}

inline double Number::DoubleValue() const {
  double result;
  napi_status status = napi_get_value_double(_env, _value, &result);
  NAPI_THROW_IF_FAILED(_env, status, 0);
  return result;
}

#if NAPI_VERSION > 5
////////////////////////////////////////////////////////////////////////////////
// BigInt Class
////////////////////////////////////////////////////////////////////////////////

inline BigInt BigInt::New(napi_env env, int64_t val) {
  napi_value value;
  napi_status status = napi_create_bigint_int64(env, val, &value);
  NAPI_THROW_IF_FAILED(env, status, BigInt());
  return BigInt(env, value);
}

inline BigInt BigInt::New(napi_env env, uint64_t val) {
  napi_value value;
  napi_status status = napi_create_bigint_uint64(env, val, &value);
  NAPI_THROW_IF_FAILED(env, status, BigInt());
  return BigInt(env, value);
}

inline BigInt BigInt::New(napi_env env, int sign_bit, size_t word_count, const uint64_t* words) {
  napi_value value;
  napi_status status = napi_create_bigint_words(env, sign_bit, word_count, words, &value);
  NAPI_THROW_IF_FAILED(env, status, BigInt());
  return BigInt(env, value);
}

inline BigInt::BigInt() : Value() {
}

inline BigInt::BigInt(napi_env env, napi_value value) : Value(env, value) {
}

inline int64_t BigInt::Int64Value(bool* lossless) const {
  int64_t result;
  napi_status status = napi_get_value_bigint_int64(
      _env, _value, &result, lossless);
  NAPI_THROW_IF_FAILED(_env, status, 0);
  return result;
}

inline uint64_t BigInt::Uint64Value(bool* lossless) const {
  uint64_t result;
  napi_status status = napi_get_value_bigint_uint64(
      _env, _value, &result, lossless);
  NAPI_THROW_IF_FAILED(_env, status, 0);
  return result;
}

inline size_t BigInt::WordCount() const {
  size_t word_count;
  napi_status status = napi_get_value_bigint_words(
      _env, _value, nullptr, &word_count, nullptr);
  NAPI_THROW_IF_FAILED(_env, status, 0);
  return word_count;
}

inline void BigInt::ToWords(int* sign_bit, size_t* word_count, uint64_t* words) {
  napi_status status = napi_get_value_bigint_words(
      _env, _value, sign_bit, word_count, words);
  NAPI_THROW_IF_FAILED_VOID(_env, status);
}
#endif  // NAPI_VERSION > 5

#if (NAPI_VERSION > 4)
////////////////////////////////////////////////////////////////////////////////
// Date Class
////////////////////////////////////////////////////////////////////////////////

inline Date Date::New(napi_env env, double val) {
  napi_value value;
  napi_status status = napi_create_date(env, val, &value);
  NAPI_THROW_IF_FAILED(env, status, Date());
  return Date(env, value);
}

inline Date::Date() : Value() {
}

inline Date::Date(napi_env env, napi_value value) : Value(env, value) {
}

inline Date::operator double() const {
  return ValueOf();
}

inline double Date::ValueOf() const {
  double result;
  napi_status status = napi_get_date_value(
      _env, _value, &result);
  NAPI_THROW_IF_FAILED(_env, status, 0);
  return result;
}
#endif

////////////////////////////////////////////////////////////////////////////////
// Name class
////////////////////////////////////////////////////////////////////////////////

inline Name::Name() : Value() {
}

inline Name::Name(napi_env env, napi_value value) : Value(env, value) {
}

////////////////////////////////////////////////////////////////////////////////
// String class
////////////////////////////////////////////////////////////////////////////////

inline String String::New(napi_env env, const std::string& val) {
  return String::New(env, val.c_str(), val.size());
}

inline String String::New(napi_env env, const std::u16string& val) {
  return String::New(env, val.c_str(), val.size());
}

inline String String::New(napi_env env, const char* val) {
  // TODO(@gabrielschulhof) Remove if-statement when core's error handling is
  // available in all supported versions.
  if (val == nullptr) {
    // Throw an error that looks like it came from core.
    NAPI_THROW_IF_FAILED(env, napi_invalid_arg, String());
  }
  napi_value value;
  napi_status status = napi_create_string_utf8(env, val, std::strlen(val), &value);
  NAPI_THROW_IF_FAILED(env, status, String());
  return String(env, value);
}

inline String String::New(napi_env env, const char16_t* val) {
  napi_value value;
  // TODO(@gabrielschulhof) Remove if-statement when core's error handling is
  // available in all supported versions.
  if (val == nullptr) {
    // Throw an error that looks like it came from core.
    NAPI_THROW_IF_FAILED(env, napi_invalid_arg, String());
  }
  napi_status status = napi_create_string_utf16(env, val, std::u16string(val).size(), &value);
  NAPI_THROW_IF_FAILED(env, status, String());
  return String(env, value);
}

inline String String::New(napi_env env, const char* val, size_t length) {
  napi_value value;
  napi_status status = napi_create_string_utf8(env, val, length, &value);
  NAPI_THROW_IF_FAILED(env, status, String());
  return String(env, value);
}

inline String String::New(napi_env env, const char16_t* val, size_t length) {
  napi_value value;
  napi_status status = napi_create_string_utf16(env, val, length, &value);
  NAPI_THROW_IF_FAILED(env, status, String());
  return String(env, value);
}

inline String::String() : Name() {
}

inline String::String(napi_env env, napi_value value) : Name(env, value) {
}

inline String::operator std::string() const {
  return Utf8Value();
}

inline String::operator std::u16string() const {
  return Utf16Value();
}

inline std::string String::Utf8Value() const {
  size_t length;
  napi_status status = napi_get_value_string_utf8(_env, _value, nullptr, 0, &length);
  NAPI_THROW_IF_FAILED(_env, status, "");

  std::string value;
  value.reserve(length + 1);
  value.resize(length);
  status = napi_get_value_string_utf8(_env, _value, &value[0], value.capacity(), nullptr);
  NAPI_THROW_IF_FAILED(_env, status, "");
  return value;
}

inline std::u16string String::Utf16Value() const {
  size_t length;
  napi_status status = napi_get_value_string_utf16(_env, _value, nullptr, 0, &length);
  NAPI_THROW_IF_FAILED(_env, status, NAPI_WIDE_TEXT(""));

  std::u16string value;
  value.reserve(length + 1);
  value.resize(length);
  status = napi_get_value_string_utf16(_env, _value, &value[0], value.capacity(), nullptr);
  NAPI_THROW_IF_FAILED(_env, status, NAPI_WIDE_TEXT(""));
  return value;
}

////////////////////////////////////////////////////////////////////////////////
// Symbol class
////////////////////////////////////////////////////////////////////////////////

inline Symbol Symbol::New(napi_env env, const char* description) {
  napi_value descriptionValue = description != nullptr ?
    String::New(env, description) : static_cast<napi_value>(nullptr);
  return Symbol::New(env, descriptionValue);
}

inline Symbol Symbol::New(napi_env env, const std::string& description) {
  napi_value descriptionValue = String::New(env, description);
  return Symbol::New(env, descriptionValue);
}

inline Symbol Symbol::New(napi_env env, String description) {
  napi_value descriptionValue = description;
  return Symbol::New(env, descriptionValue);
}

inline Symbol Symbol::New(napi_env env, napi_value description) {
  napi_value value;
  napi_status status = napi_create_symbol(env, description, &value);
  NAPI_THROW_IF_FAILED(env, status, Symbol());
  return Symbol(env, value);
}

inline MaybeOrValue<Symbol> Symbol::WellKnown(napi_env env,
                                              const std::string& name) {
#if defined(NODE_ADDON_API_ENABLE_MAYBE)
  Value symbol_obj;
  Value symbol_value;
  if (Napi::Env(env).Global().Get("Symbol").UnwrapTo(&symbol_obj) &&
      symbol_obj.As<Object>().Get(name).UnwrapTo(&symbol_value)) {
    return Just<Symbol>(symbol_value.As<Symbol>());
  }
  return Nothing<Symbol>();
#else
  return Napi::Env(env).Global().Get("Symbol").As<Object>().Get(name).As<Symbol>();
#endif
}

inline MaybeOrValue<Symbol> Symbol::For(napi_env env,
                                        const std::string& description) {
  napi_value descriptionValue = String::New(env, description);
  return Symbol::For(env, descriptionValue);
}

inline MaybeOrValue<Symbol> Symbol::For(napi_env env, const char* description) {
  napi_value descriptionValue = String::New(env, description);
  return Symbol::For(env, descriptionValue);
}

inline MaybeOrValue<Symbol> Symbol::For(napi_env env, String description) {
  return Symbol::For(env, static_cast<napi_value>(description));
}

inline MaybeOrValue<Symbol> Symbol::For(napi_env env, napi_value description) {
#if defined(NODE_ADDON_API_ENABLE_MAYBE)
  Value symbol_obj;
  Value symbol_for_value;
  Value symbol_value;
  if (Napi::Env(env).Global().Get("Symbol").UnwrapTo(&symbol_obj) &&
      symbol_obj.As<Object>().Get("for").UnwrapTo(&symbol_for_value) &&
      symbol_for_value.As<Function>()
          .Call(symbol_obj, {description})
          .UnwrapTo(&symbol_value)) {
    return Just<Symbol>(symbol_value.As<Symbol>());
  }
  return Nothing<Symbol>();
#else
  Object symbol_obj = Napi::Env(env).Global().Get("Symbol").As<Object>();
  return symbol_obj.Get("for")
      .As<Function>()
      .Call(symbol_obj, {description})
      .As<Symbol>();
#endif
}

inline Symbol::Symbol() : Name() {
}

inline Symbol::Symbol(napi_env env, napi_value value) : Name(env, value) {
}

////////////////////////////////////////////////////////////////////////////////
// Automagic value creation
////////////////////////////////////////////////////////////////////////////////

namespace details {
template <typename T>
struct vf_number {
  static Number From(napi_env env, T value) {
    return Number::New(env, static_cast<double>(value));
  }
};

template<>
struct vf_number<bool> {
  static Boolean From(napi_env env, bool value) {
    return Boolean::New(env, value);
  }
};

struct vf_utf8_charp {
  static String From(napi_env env, const char* value) {
    return String::New(env, value);
  }
};

struct vf_utf16_charp {
  static String From(napi_env env, const char16_t* value) {
    return String::New(env, value);
  }
};
struct vf_utf8_string {
  static String From(napi_env env, const std::string& value) {
    return String::New(env, value);
  }
};

struct vf_utf16_string {
  static String From(napi_env env, const std::u16string& value) {
    return String::New(env, value);
  }
};

template <typename T>
struct vf_fallback {
  static Value From(napi_env env, const T& value) {
    return Value(env, value);
  }
};

template <typename...> struct disjunction : std::false_type {};
template <typename B> struct disjunction<B> : B {};
template <typename B, typename... Bs>
struct disjunction<B, Bs...>
    : std::conditional<bool(B::value), B, disjunction<Bs...>>::type {};

template <typename T>
struct can_make_string
    : disjunction<typename std::is_convertible<T, const char *>::type,
                  typename std::is_convertible<T, const char16_t *>::type,
                  typename std::is_convertible<T, std::string>::type,
                  typename std::is_convertible<T, std::u16string>::type> {};
}

template <typename T>
Value Value::From(napi_env env, const T& value) {
  using Helper = typename std::conditional<
    std::is_integral<T>::value || std::is_floating_point<T>::value,
    details::vf_number<T>,
    typename std::conditional<
      details::can_make_string<T>::value,
      String,
      details::vf_fallback<T>
    >::type
  >::type;
  return Helper::From(env, value);
}

template <typename T>
String String::From(napi_env env, const T& value) {
  struct Dummy {};
  using Helper = typename std::conditional<
    std::is_convertible<T, const char*>::value,
    details::vf_utf8_charp,
    typename std::conditional<
      std::is_convertible<T, const char16_t*>::value,
      details::vf_utf16_charp,
      typename std::conditional<
        std::is_convertible<T, std::string>::value,
        details::vf_utf8_string,
        typename std::conditional<
          std::is_convertible<T, std::u16string>::value,
          details::vf_utf16_string,
          Dummy
        >::type
      >::type
    >::type
  >::type;
  return Helper::From(env, value);
}

////////////////////////////////////////////////////////////////////////////////
// Object class
////////////////////////////////////////////////////////////////////////////////

template <typename Key>
inline Object::PropertyLValue<Key>::operator Value() const {
  MaybeOrValue<Value> val = Object(_env, _object).Get(_key);
#ifdef NODE_ADDON_API_ENABLE_MAYBE
  return val.Unwrap();
#else
  return val;
#endif
}

template <typename Key> template <typename ValueType>
inline Object::PropertyLValue<Key>& Object::PropertyLValue<Key>::operator =(ValueType value) {
#ifdef NODE_ADDON_API_ENABLE_MAYBE
  MaybeOrValue<bool> result =
#endif
      Object(_env, _object).Set(_key, value);
#ifdef NODE_ADDON_API_ENABLE_MAYBE
  result.Unwrap();
#endif
  return *this;
}

template <typename Key>
inline Object::PropertyLValue<Key>::PropertyLValue(Object object, Key key)
  : _env(object.Env()), _object(object), _key(key) {}

inline Object Object::New(napi_env env) {
  napi_value value;
  napi_status status = napi_create_object(env, &value);
  NAPI_THROW_IF_FAILED(env, status, Object());
  return Object(env, value);
}

inline Object::Object() : Value() {
}

inline Object::Object(napi_env env, napi_value value) : Value(env, value) {
}

inline Object::PropertyLValue<std::string> Object::operator [](const char* utf8name) {
  return PropertyLValue<std::string>(*this, utf8name);
}

inline Object::PropertyLValue<std::string> Object::operator [](const std::string& utf8name) {
  return PropertyLValue<std::string>(*this, utf8name);
}

inline Object::PropertyLValue<uint32_t> Object::operator [](uint32_t index) {
  return PropertyLValue<uint32_t>(*this, index);
}

inline Object::PropertyLValue<Value> Object::operator[](Value index) {
  return PropertyLValue<Value>(*this, index);
}

inline Object::PropertyLValue<Value> Object::operator[](Value index) const {
  return PropertyLValue<Value>(*this, index);
}

inline MaybeOrValue<Value> Object::operator[](const char* utf8name) const {
  return Get(utf8name);
}

inline MaybeOrValue<Value> Object::operator[](
    const std::string& utf8name) const {
  return Get(utf8name);
}

inline MaybeOrValue<Value> Object::operator[](uint32_t index) const {
  return Get(index);
}

inline MaybeOrValue<bool> Object::Has(napi_value key) const {
  bool result;
  napi_status status = napi_has_property(_env, _value, key, &result);
  NAPI_RETURN_OR_THROW_IF_FAILED(_env, status, result, bool);
}

inline MaybeOrValue<bool> Object::Has(Value key) const {
  bool result;
  napi_status status = napi_has_property(_env, _value, key, &result);
  NAPI_RETURN_OR_THROW_IF_FAILED(_env, status, result, bool);
}

inline MaybeOrValue<bool> Object::Has(const char* utf8name) const {
  bool result;
  napi_status status = napi_has_named_property(_env, _value, utf8name, &result);
  NAPI_RETURN_OR_THROW_IF_FAILED(_env, status, result, bool);
}

inline MaybeOrValue<bool> Object::Has(const std::string& utf8name) const {
  return Has(utf8name.c_str());
}

inline MaybeOrValue<bool> Object::HasOwnProperty(napi_value key) const {
  bool result;
  napi_status status = napi_has_own_property(_env, _value, key, &result);
  NAPI_RETURN_OR_THROW_IF_FAILED(_env, status, result, bool);
}

inline MaybeOrValue<bool> Object::HasOwnProperty(Value key) const {
  bool result;
  napi_status status = napi_has_own_property(_env, _value, key, &result);
  NAPI_RETURN_OR_THROW_IF_FAILED(_env, status, result, bool);
}

inline MaybeOrValue<bool> Object::HasOwnProperty(const char* utf8name) const {
  napi_value key;
  napi_status status = napi_create_string_utf8(_env, utf8name, std::strlen(utf8name), &key);
  NAPI_MAYBE_THROW_IF_FAILED(_env, status, bool);
  return HasOwnProperty(key);
}

inline MaybeOrValue<bool> Object::HasOwnProperty(
    const std::string& utf8name) const {
  return HasOwnProperty(utf8name.c_str());
}

inline MaybeOrValue<Value> Object::Get(napi_value key) const {
  napi_value result;
  napi_status status = napi_get_property(_env, _value, key, &result);
  NAPI_RETURN_OR_THROW_IF_FAILED(_env, status, Value(_env, result), Value);
}

inline MaybeOrValue<Value> Object::Get(Value key) const {
  napi_value result;
  napi_status status = napi_get_property(_env, _value, key, &result);
  NAPI_RETURN_OR_THROW_IF_FAILED(_env, status, Value(_env, result), Value);
}

inline MaybeOrValue<Value> Object::Get(const char* utf8name) const {
  napi_value result;
  napi_status status = napi_get_named_property(_env, _value, utf8name, &result);
  NAPI_RETURN_OR_THROW_IF_FAILED(_env, status, Value(_env, result), Value);
}

inline MaybeOrValue<Value> Object::Get(const std::string& utf8name) const {
  return Get(utf8name.c_str());
}

template <typename ValueType>
inline MaybeOrValue<bool> Object::Set(napi_value key, const ValueType& value) {
  napi_status status =
      napi_set_property(_env, _value, key, Value::From(_env, value));
  NAPI_RETURN_OR_THROW_IF_FAILED(_env, status, status == napi_ok, bool);
}

template <typename ValueType>
inline MaybeOrValue<bool> Object::Set(Value key, const ValueType& value) {
  napi_status status =
      napi_set_property(_env, _value, key, Value::From(_env, value));
  NAPI_RETURN_OR_THROW_IF_FAILED(_env, status, status == napi_ok, bool);
}

template <typename ValueType>
inline MaybeOrValue<bool> Object::Set(const char* utf8name,
                                      const ValueType& value) {
  napi_status status =
      napi_set_named_property(_env, _value, utf8name, Value::From(_env, value));
  NAPI_RETURN_OR_THROW_IF_FAILED(_env, status, status == napi_ok, bool);
}

template <typename ValueType>
inline MaybeOrValue<bool> Object::Set(const std::string& utf8name,
                                      const ValueType& value) {
  return Set(utf8name.c_str(), value);
}

inline MaybeOrValue<bool> Object::Delete(napi_value key) {
  bool result;
  napi_status status = napi_delete_property(_env, _value, key, &result);
  NAPI_RETURN_OR_THROW_IF_FAILED(_env, status, result, bool);
}

inline MaybeOrValue<bool> Object::Delete(Value key) {
  bool result;
  napi_status status = napi_delete_property(_env, _value, key, &result);
  NAPI_RETURN_OR_THROW_IF_FAILED(_env, status, result, bool);
}

inline MaybeOrValue<bool> Object::Delete(const char* utf8name) {
  return Delete(String::New(_env, utf8name));
}

inline MaybeOrValue<bool> Object::Delete(const std::string& utf8name) {
  return Delete(String::New(_env, utf8name));
}

inline MaybeOrValue<bool> Object::Has(uint32_t index) const {
  bool result;
  napi_status status = napi_has_element(_env, _value, index, &result);
  NAPI_RETURN_OR_THROW_IF_FAILED(_env, status, result, bool);
}

inline MaybeOrValue<Value> Object::Get(uint32_t index) const {
  napi_value value;
  napi_status status = napi_get_element(_env, _value, index, &value);
  NAPI_RETURN_OR_THROW_IF_FAILED(_env, status, Value(_env, value), Value);
}

template <typename ValueType>
inline MaybeOrValue<bool> Object::Set(uint32_t index, const ValueType& value) {
  napi_status status =
      napi_set_element(_env, _value, index, Value::From(_env, value));
  NAPI_RETURN_OR_THROW_IF_FAILED(_env, status, status == napi_ok, bool);
}

inline MaybeOrValue<bool> Object::Delete(uint32_t index) {
  bool result;
  napi_status status = napi_delete_element(_env, _value, index, &result);
  NAPI_RETURN_OR_THROW_IF_FAILED(_env, status, result, bool);
}

inline MaybeOrValue<Array> Object::GetPropertyNames() const {
  napi_value result;
  napi_status status = napi_get_property_names(_env, _value, &result);
  NAPI_RETURN_OR_THROW_IF_FAILED(_env, status, Array(_env, result), Array);
}

inline MaybeOrValue<bool> Object::DefineProperty(
    const PropertyDescriptor& property) {
  napi_status status = napi_define_properties(_env, _value, 1,
    reinterpret_cast<const napi_property_descriptor*>(&property));
  NAPI_RETURN_OR_THROW_IF_FAILED(_env, status, status == napi_ok, bool);
}

inline MaybeOrValue<bool> Object::DefineProperties(
    const std::initializer_list<PropertyDescriptor>& properties) {
  napi_status status = napi_define_properties(_env, _value, properties.size(),
    reinterpret_cast<const napi_property_descriptor*>(properties.begin()));
  NAPI_RETURN_OR_THROW_IF_FAILED(_env, status, status == napi_ok, bool);
}

inline MaybeOrValue<bool> Object::DefineProperties(
    const std::vector<PropertyDescriptor>& properties) {
  napi_status status = napi_define_properties(_env, _value, properties.size(),
    reinterpret_cast<const napi_property_descriptor*>(properties.data()));
  NAPI_RETURN_OR_THROW_IF_FAILED(_env, status, status == napi_ok, bool);
}

inline MaybeOrValue<bool> Object::InstanceOf(
    const Function& constructor) const {
  bool result;
  napi_status status = napi_instanceof(_env, _value, constructor, &result);
  NAPI_RETURN_OR_THROW_IF_FAILED(_env, status, result, bool);
}

template <typename Finalizer, typename T>
inline void Object::AddFinalizer(Finalizer finalizeCallback, T* data) {
  details::FinalizeData<T, Finalizer>* finalizeData =
      new details::FinalizeData<T, Finalizer>(
          {std::move(finalizeCallback), nullptr});
  napi_status status =
      details::AttachData(_env,
                          *this,
                          data,
                          details::FinalizeData<T, Finalizer>::Wrapper,
                          finalizeData);
  if (status != napi_ok) {
    delete finalizeData;
    NAPI_THROW_IF_FAILED_VOID(_env, status);
  }
}

template <typename Finalizer, typename T, typename Hint>
inline void Object::AddFinalizer(Finalizer finalizeCallback,
                                 T* data,
                                 Hint* finalizeHint) {
  details::FinalizeData<T, Finalizer, Hint>* finalizeData =
      new details::FinalizeData<T, Finalizer, Hint>(
          {std::move(finalizeCallback), finalizeHint});
  napi_status status =
      details::AttachData(_env,
                          *this,
                          data,
                          details::FinalizeData<T, Finalizer, Hint>::WrapperWithHint,
                          finalizeData);
  if (status != napi_ok) {
    delete finalizeData;
    NAPI_THROW_IF_FAILED_VOID(_env, status);
  }
}

#ifdef NAPI_CPP_EXCEPTIONS
inline Object::const_iterator::const_iterator(const Object* object,
                                              const Type type) {
  _object = object;
  _keys = object->GetPropertyNames();
  _index = type == Type::BEGIN ? 0 : _keys.Length();
}

inline Object::const_iterator Napi::Object::begin() const {
  const_iterator it(this, Object::const_iterator::Type::BEGIN);
  return it;
}

inline Object::const_iterator Napi::Object::end() const {
  const_iterator it(this, Object::const_iterator::Type::END);
  return it;
}

inline Object::const_iterator& Object::const_iterator::operator++() {
  ++_index;
  return *this;
}

inline bool Object::const_iterator::operator==(
    const const_iterator& other) const {
  return _index == other._index;
}

inline bool Object::const_iterator::operator!=(
    const const_iterator& other) const {
  return _index != other._index;
}

inline const std::pair<Value, Object::PropertyLValue<Value>>
Object::const_iterator::operator*() const {
  const Value key = _keys[_index];
  const PropertyLValue<Value> value = (*_object)[key];
  return {key, value};
}

inline Object::iterator::iterator(Object* object, const Type type) {
  _object = object;
  _keys = object->GetPropertyNames();
  _index = type == Type::BEGIN ? 0 : _keys.Length();
}

inline Object::iterator Napi::Object::begin() {
  iterator it(this, Object::iterator::Type::BEGIN);
  return it;
}

inline Object::iterator Napi::Object::end() {
  iterator it(this, Object::iterator::Type::END);
  return it;
}

inline Object::iterator& Object::iterator::operator++() {
  ++_index;
  return *this;
}

inline bool Object::iterator::operator==(const iterator& other) const {
  return _index == other._index;
}

inline bool Object::iterator::operator!=(const iterator& other) const {
  return _index != other._index;
}

inline std::pair<Value, Object::PropertyLValue<Value>>
Object::iterator::operator*() {
  Value key = _keys[_index];
  PropertyLValue<Value> value = (*_object)[key];
  return {key, value};
}
#endif  // NAPI_CPP_EXCEPTIONS

#if NAPI_VERSION >= 8
inline MaybeOrValue<bool> Object::Freeze() {
  napi_status status = napi_object_freeze(_env, _value);
  NAPI_RETURN_OR_THROW_IF_FAILED(_env, status, status == napi_ok, bool);
}

inline MaybeOrValue<bool> Object::Seal() {
  napi_status status = napi_object_seal(_env, _value);
  NAPI_RETURN_OR_THROW_IF_FAILED(_env, status, status == napi_ok, bool);
}
#endif  // NAPI_VERSION >= 8

////////////////////////////////////////////////////////////////////////////////
// External class
////////////////////////////////////////////////////////////////////////////////

template <typename T>
inline External<T> External<T>::New(napi_env env, T* data) {
  napi_value value;
  napi_status status = napi_create_external(env, data, nullptr, nullptr, &value);
  NAPI_THROW_IF_FAILED(env, status, External());
  return External(env, value);
}

template <typename T>
template <typename Finalizer>
inline External<T> External<T>::New(napi_env env,
                                    T* data,
                                    Finalizer finalizeCallback) {
  napi_value value;
  details::FinalizeData<T, Finalizer>* finalizeData =
      new details::FinalizeData<T, Finalizer>(
          {std::move(finalizeCallback), nullptr});
  napi_status status = napi_create_external(
    env,
    data,
    details::FinalizeData<T, Finalizer>::Wrapper,
    finalizeData,
    &value);
  if (status != napi_ok) {
    delete finalizeData;
    NAPI_THROW_IF_FAILED(env, status, External());
  }
  return External(env, value);
}

template <typename T>
template <typename Finalizer, typename Hint>
inline External<T> External<T>::New(napi_env env,
                                    T* data,
                                    Finalizer finalizeCallback,
                                    Hint* finalizeHint) {
  napi_value value;
  details::FinalizeData<T, Finalizer, Hint>* finalizeData =
      new details::FinalizeData<T, Finalizer, Hint>(
          {std::move(finalizeCallback), finalizeHint});
  napi_status status = napi_create_external(
    env,
    data,
    details::FinalizeData<T, Finalizer, Hint>::WrapperWithHint,
    finalizeData,
    &value);
  if (status != napi_ok) {
    delete finalizeData;
    NAPI_THROW_IF_FAILED(env, status, External());
  }
  return External(env, value);
}

template <typename T>
inline External<T>::External() : Value() {
}

template <typename T>
inline External<T>::External(napi_env env, napi_value value) : Value(env, value) {
}

template <typename T>
inline T* External<T>::Data() const {
  void* data;
  napi_status status = napi_get_value_external(_env, _value, &data);
  NAPI_THROW_IF_FAILED(_env, status, nullptr);
  return reinterpret_cast<T*>(data);
}

////////////////////////////////////////////////////////////////////////////////
// Array class
////////////////////////////////////////////////////////////////////////////////

inline Array Array::New(napi_env env) {
  napi_value value;
  napi_status status = napi_create_array(env, &value);
  NAPI_THROW_IF_FAILED(env, status, Array());
  return Array(env, value);
}

inline Array Array::New(napi_env env, size_t length) {
  napi_value value;
  napi_status status = napi_create_array_with_length(env, length, &value);
  NAPI_THROW_IF_FAILED(env, status, Array());
  return Array(env, value);
}

inline Array::Array() : Object() {
}

inline Array::Array(napi_env env, napi_value value) : Object(env, value) {
}

inline uint32_t Array::Length() const {
  uint32_t result;
  napi_status status = napi_get_array_length(_env, _value, &result);
  NAPI_THROW_IF_FAILED(_env, status, 0);
  return result;
}

////////////////////////////////////////////////////////////////////////////////
// ArrayBuffer class
////////////////////////////////////////////////////////////////////////////////

inline ArrayBuffer ArrayBuffer::New(napi_env env, size_t byteLength) {
  napi_value value;
  void* data;
  napi_status status = napi_create_arraybuffer(env, byteLength, &data, &value);
  NAPI_THROW_IF_FAILED(env, status, ArrayBuffer());

  return ArrayBuffer(env, value);
}

inline ArrayBuffer ArrayBuffer::New(napi_env env,
                                    void* externalData,
                                    size_t byteLength) {
  napi_value value;
  napi_status status = napi_create_external_arraybuffer(
    env, externalData, byteLength, nullptr, nullptr, &value);
  NAPI_THROW_IF_FAILED(env, status, ArrayBuffer());

  return ArrayBuffer(env, value);
}

template <typename Finalizer>
inline ArrayBuffer ArrayBuffer::New(napi_env env,
                                    void* externalData,
                                    size_t byteLength,
                                    Finalizer finalizeCallback) {
  napi_value value;
  details::FinalizeData<void, Finalizer>* finalizeData =
      new details::FinalizeData<void, Finalizer>(
          {std::move(finalizeCallback), nullptr});
  napi_status status = napi_create_external_arraybuffer(
    env,
    externalData,
    byteLength,
    details::FinalizeData<void, Finalizer>::Wrapper,
    finalizeData,
    &value);
  if (status != napi_ok) {
    delete finalizeData;
    NAPI_THROW_IF_FAILED(env, status, ArrayBuffer());
  }

  return ArrayBuffer(env, value);
}

template <typename Finalizer, typename Hint>
inline ArrayBuffer ArrayBuffer::New(napi_env env,
                                    void* externalData,
                                    size_t byteLength,
                                    Finalizer finalizeCallback,
                                    Hint* finalizeHint) {
  napi_value value;
  details::FinalizeData<void, Finalizer, Hint>* finalizeData =
      new details::FinalizeData<void, Finalizer, Hint>(
          {std::move(finalizeCallback), finalizeHint});
  napi_status status = napi_create_external_arraybuffer(
    env,
    externalData,
    byteLength,
    details::FinalizeData<void, Finalizer, Hint>::WrapperWithHint,
    finalizeData,
    &value);
  if (status != napi_ok) {
    delete finalizeData;
    NAPI_THROW_IF_FAILED(env, status, ArrayBuffer());
  }

  return ArrayBuffer(env, value);
}

inline ArrayBuffer::ArrayBuffer() : Object() {
}

inline ArrayBuffer::ArrayBuffer(napi_env env, napi_value value)
  : Object(env, value) {
}

inline void* ArrayBuffer::Data() {
  void* data;
  napi_status status = napi_get_arraybuffer_info(_env, _value, &data, nullptr);
  NAPI_THROW_IF_FAILED(_env, status, nullptr);
  return data;
}

inline size_t ArrayBuffer::ByteLength() {
  size_t length;
  napi_status status = napi_get_arraybuffer_info(_env, _value, nullptr, &length);
  NAPI_THROW_IF_FAILED(_env, status, 0);
  return length;
}

#if NAPI_VERSION >= 7
inline bool ArrayBuffer::IsDetached() const {
  bool detached;
  napi_status status = napi_is_detached_arraybuffer(_env, _value, &detached);
  NAPI_THROW_IF_FAILED(_env, status, false);
  return detached;
}

inline void ArrayBuffer::Detach() {
  napi_status status = napi_detach_arraybuffer(_env, _value);
  NAPI_THROW_IF_FAILED_VOID(_env, status);
}
#endif  // NAPI_VERSION >= 7

////////////////////////////////////////////////////////////////////////////////
// DataView class
////////////////////////////////////////////////////////////////////////////////
inline DataView DataView::New(napi_env env,
                              Napi::ArrayBuffer arrayBuffer) {
  return New(env, arrayBuffer, 0, arrayBuffer.ByteLength());
}

inline DataView DataView::New(napi_env env,
                              Napi::ArrayBuffer arrayBuffer,
                              size_t byteOffset) {
  if (byteOffset > arrayBuffer.ByteLength()) {
    NAPI_THROW(RangeError::New(env,
        "Start offset is outside the bounds of the buffer"),
        DataView());
  }
  return New(env, arrayBuffer, byteOffset,
      arrayBuffer.ByteLength() - byteOffset);
}

inline DataView DataView::New(napi_env env,
                              Napi::ArrayBuffer arrayBuffer,
                              size_t byteOffset,
                              size_t byteLength) {
  if (byteOffset + byteLength > arrayBuffer.ByteLength()) {
    NAPI_THROW(RangeError::New(env, "Invalid DataView length"),
               DataView());
  }
  napi_value value;
  napi_status status = napi_create_dataview(
    env, byteLength, arrayBuffer, byteOffset, &value);
  NAPI_THROW_IF_FAILED(env, status, DataView());
  return DataView(env, value);
}

inline DataView::DataView() : Object() {
}

inline DataView::DataView(napi_env env, napi_value value) : Object(env, value) {
  napi_status status = napi_get_dataview_info(
    _env,
    _value   /* dataView */,
    &_length /* byteLength */,
    &_data   /* data */,
    nullptr  /* arrayBuffer */,
    nullptr  /* byteOffset */);
  NAPI_THROW_IF_FAILED_VOID(_env, status);
}

inline Napi::ArrayBuffer DataView::ArrayBuffer() const {
  napi_value arrayBuffer;
  napi_status status = napi_get_dataview_info(
    _env,
    _value       /* dataView */,
    nullptr      /* byteLength */,
    nullptr      /* data */,
    &arrayBuffer /* arrayBuffer */,
    nullptr      /* byteOffset */);
  NAPI_THROW_IF_FAILED(_env, status, Napi::ArrayBuffer());
  return Napi::ArrayBuffer(_env, arrayBuffer);
}

inline size_t DataView::ByteOffset() const {
  size_t byteOffset;
  napi_status status = napi_get_dataview_info(
    _env,
    _value      /* dataView */,
    nullptr     /* byteLength */,
    nullptr     /* data */,
    nullptr     /* arrayBuffer */,
    &byteOffset /* byteOffset */);
  NAPI_THROW_IF_FAILED(_env, status, 0);
  return byteOffset;
}

inline size_t DataView::ByteLength() const {
  return _length;
}

inline void* DataView::Data() const {
  return _data;
}

inline float DataView::GetFloat32(size_t byteOffset) const {
  return ReadData<float>(byteOffset);
}

inline double DataView::GetFloat64(size_t byteOffset) const {
  return ReadData<double>(byteOffset);
}

inline int8_t DataView::GetInt8(size_t byteOffset) const {
  return ReadData<int8_t>(byteOffset);
}

inline int16_t DataView::GetInt16(size_t byteOffset) const {
  return ReadData<int16_t>(byteOffset);
}

inline int32_t DataView::GetInt32(size_t byteOffset) const {
  return ReadData<int32_t>(byteOffset);
}

inline uint8_t DataView::GetUint8(size_t byteOffset) const {
  return ReadData<uint8_t>(byteOffset);
}

inline uint16_t DataView::GetUint16(size_t byteOffset) const {
  return ReadData<uint16_t>(byteOffset);
}

inline uint32_t DataView::GetUint32(size_t byteOffset) const {
  return ReadData<uint32_t>(byteOffset);
}

inline void DataView::SetFloat32(size_t byteOffset, float value) const {
  WriteData<float>(byteOffset, value);
}

inline void DataView::SetFloat64(size_t byteOffset, double value) const {
  WriteData<double>(byteOffset, value);
}

inline void DataView::SetInt8(size_t byteOffset, int8_t value) const {
  WriteData<int8_t>(byteOffset, value);
}

inline void DataView::SetInt16(size_t byteOffset, int16_t value) const {
  WriteData<int16_t>(byteOffset, value);
}

inline void DataView::SetInt32(size_t byteOffset, int32_t value) const {
  WriteData<int32_t>(byteOffset, value);
}

inline void DataView::SetUint8(size_t byteOffset, uint8_t value) const {
  WriteData<uint8_t>(byteOffset, value);
}

inline void DataView::SetUint16(size_t byteOffset, uint16_t value) const {
  WriteData<uint16_t>(byteOffset, value);
}

inline void DataView::SetUint32(size_t byteOffset, uint32_t value) const {
  WriteData<uint32_t>(byteOffset, value);
}

template <typename T>
inline T DataView::ReadData(size_t byteOffset) const {
  if (byteOffset + sizeof(T) > _length ||
      byteOffset + sizeof(T) < byteOffset) {  // overflow
    NAPI_THROW(RangeError::New(_env,
        "Offset is outside the bounds of the DataView"), 0);
  }

  return *reinterpret_cast<T*>(static_cast<uint8_t*>(_data) + byteOffset);
}

template <typename T>
inline void DataView::WriteData(size_t byteOffset, T value) const {
  if (byteOffset + sizeof(T) > _length ||
      byteOffset + sizeof(T) < byteOffset) {  // overflow
    NAPI_THROW_VOID(RangeError::New(_env,
        "Offset is outside the bounds of the DataView"));
  }

  *reinterpret_cast<T*>(static_cast<uint8_t*>(_data) + byteOffset) = value;
}

////////////////////////////////////////////////////////////////////////////////
// TypedArray class
////////////////////////////////////////////////////////////////////////////////

inline TypedArray::TypedArray()
  : Object(), _type(TypedArray::unknown_array_type), _length(0) {
}

inline TypedArray::TypedArray(napi_env env, napi_value value)
  : Object(env, value), _type(TypedArray::unknown_array_type), _length(0) {
}

inline TypedArray::TypedArray(napi_env env,
                              napi_value value,
                              napi_typedarray_type type,
                              size_t length)
  : Object(env, value), _type(type), _length(length) {
}

inline napi_typedarray_type TypedArray::TypedArrayType() const {
  if (_type == TypedArray::unknown_array_type) {
    napi_status status = napi_get_typedarray_info(_env, _value,
      &const_cast<TypedArray*>(this)->_type, &const_cast<TypedArray*>(this)->_length,
      nullptr, nullptr, nullptr);
    NAPI_THROW_IF_FAILED(_env, status, napi_int8_array);
  }

  return _type;
}

inline uint8_t TypedArray::ElementSize() const {
  switch (TypedArrayType()) {
    case napi_int8_array:
    case napi_uint8_array:
    case napi_uint8_clamped_array:
      return 1;
    case napi_int16_array:
    case napi_uint16_array:
      return 2;
    case napi_int32_array:
    case napi_uint32_array:
    case napi_float32_array:
      return 4;
    case napi_float64_array:
#if (NAPI_VERSION > 5)
    case napi_bigint64_array:
    case napi_biguint64_array:
#endif  // (NAPI_VERSION > 5)
      return 8;
    default:
      return 0;
  }
}

inline size_t TypedArray::ElementLength() const {
  if (_type == TypedArray::unknown_array_type) {
    napi_status status = napi_get_typedarray_info(_env, _value,
      &const_cast<TypedArray*>(this)->_type, &const_cast<TypedArray*>(this)->_length,
      nullptr, nullptr, nullptr);
    NAPI_THROW_IF_FAILED(_env, status, 0);
  }

  return _length;
}

inline size_t TypedArray::ByteOffset() const {
  size_t byteOffset;
  napi_status status = napi_get_typedarray_info(
    _env, _value, nullptr, nullptr, nullptr, nullptr, &byteOffset);
  NAPI_THROW_IF_FAILED(_env, status, 0);
  return byteOffset;
}

inline size_t TypedArray::ByteLength() const {
  return ElementSize() * ElementLength();
}

inline Napi::ArrayBuffer TypedArray::ArrayBuffer() const {
  napi_value arrayBuffer;
  napi_status status = napi_get_typedarray_info(
    _env, _value, nullptr, nullptr, nullptr, &arrayBuffer, nullptr);
  NAPI_THROW_IF_FAILED(_env, status, Napi::ArrayBuffer());
  return Napi::ArrayBuffer(_env, arrayBuffer);
}

////////////////////////////////////////////////////////////////////////////////
// TypedArrayOf<T> class
////////////////////////////////////////////////////////////////////////////////

template <typename T>
inline TypedArrayOf<T> TypedArrayOf<T>::New(napi_env env,
                                            size_t elementLength,
                                            napi_typedarray_type type) {
  Napi::ArrayBuffer arrayBuffer = Napi::ArrayBuffer::New(env, elementLength * sizeof (T));
  return New(env, elementLength, arrayBuffer, 0, type);
}

template <typename T>
inline TypedArrayOf<T> TypedArrayOf<T>::New(napi_env env,
                                            size_t elementLength,
                                            Napi::ArrayBuffer arrayBuffer,
                                            size_t bufferOffset,
                                            napi_typedarray_type type) {
  napi_value value;
  napi_status status = napi_create_typedarray(
    env, type, elementLength, arrayBuffer, bufferOffset, &value);
  NAPI_THROW_IF_FAILED(env, status, TypedArrayOf<T>());

  return TypedArrayOf<T>(
    env, value, type, elementLength,
    reinterpret_cast<T*>(reinterpret_cast<uint8_t*>(arrayBuffer.Data()) + bufferOffset));
}

template <typename T>
inline TypedArrayOf<T>::TypedArrayOf() : TypedArray(), _data(nullptr) {
}

template <typename T>
inline TypedArrayOf<T>::TypedArrayOf(napi_env env, napi_value value)
  : TypedArray(env, value), _data(nullptr) {
  napi_status status = napi_ok;
  if (value != nullptr) {
    void* data = nullptr;
    status = napi_get_typedarray_info(
        _env, _value, &_type, &_length, &data, nullptr, nullptr);
    _data = static_cast<T*>(data);
  } else {
    _type = TypedArrayTypeForPrimitiveType<T>();
    _length = 0;
  }
  NAPI_THROW_IF_FAILED_VOID(_env, status);
}

template <typename T>
inline TypedArrayOf<T>::TypedArrayOf(napi_env env,
                                     napi_value value,
                                     napi_typedarray_type type,
                                     size_t length,
                                     T* data)
  : TypedArray(env, value, type, length), _data(data) {
  if (!(type == TypedArrayTypeForPrimitiveType<T>() ||
      (type == napi_uint8_clamped_array && std::is_same<T, uint8_t>::value))) {
    NAPI_THROW_VOID(TypeError::New(env, "Array type must match the template parameter. "
      "(Uint8 arrays may optionally have the \"clamped\" array type.)"));
  }
}

template <typename T>
inline T& TypedArrayOf<T>::operator [](size_t index) {
  return _data[index];
}

template <typename T>
inline const T& TypedArrayOf<T>::operator [](size_t index) const {
  return _data[index];
}

template <typename T>
inline T* TypedArrayOf<T>::Data() {
  return _data;
}

template <typename T>
inline const T* TypedArrayOf<T>::Data() const {
  return _data;
}

////////////////////////////////////////////////////////////////////////////////
// Function class
////////////////////////////////////////////////////////////////////////////////

template <typename CbData>
static inline napi_status
CreateFunction(napi_env env,
               const char* utf8name,
               napi_callback cb,
               CbData* data,
               napi_value* result) {
  napi_status status =
      napi_create_function(env, utf8name, NAPI_AUTO_LENGTH, cb, data, result);
  if (status == napi_ok) {
    status = Napi::details::AttachData(env, *result, data);
  }

  return status;
}

template <Function::VoidCallback cb>
inline Function Function::New(napi_env env, const char* utf8name, void* data) {
  napi_value result = nullptr;
  napi_status status = napi_create_function(env,
                                            utf8name,
                                            NAPI_AUTO_LENGTH,
                                            details::TemplatedVoidCallback<cb>,
                                            data,
                                            &result);
  NAPI_THROW_IF_FAILED(env, status, Function());
  return Function(env, result);
}

template <Function::Callback cb>
inline Function Function::New(napi_env env, const char* utf8name, void* data) {
  napi_value result = nullptr;
  napi_status status = napi_create_function(env,
                                            utf8name,
                                            NAPI_AUTO_LENGTH,
                                            details::TemplatedCallback<cb>,
                                            data,
                                            &result);
  NAPI_THROW_IF_FAILED(env, status, Function());
  return Function(env, result);
}

template <Function::VoidCallback cb>
inline Function Function::New(napi_env env,
                              const std::string& utf8name,
                              void* data) {
  return Function::New<cb>(env, utf8name.c_str(), data);
}

template <Function::Callback cb>
inline Function Function::New(napi_env env,
                              const std::string& utf8name,
                              void* data) {
  return Function::New<cb>(env, utf8name.c_str(), data);
}

template <typename Callable>
inline Function Function::New(napi_env env,
                              Callable cb,
                              const char* utf8name,
                              void* data) {
  using ReturnType = decltype(cb(CallbackInfo(nullptr, nullptr)));
  using CbData = details::CallbackData<Callable, ReturnType>;
  auto callbackData = new CbData{std::move(cb), data};

  napi_value value;
  napi_status status = CreateFunction(env,
                                      utf8name,
                                      CbData::Wrapper,
                                      callbackData,
                                      &value);
  if (status != napi_ok) {
    delete callbackData;
    NAPI_THROW_IF_FAILED(env, status, Function());
  }

  return Function(env, value);
}

template <typename Callable>
inline Function Function::New(napi_env env,
                              Callable cb,
                              const std::string& utf8name,
                              void* data) {
  return New(env, cb, utf8name.c_str(), data);
}

inline Function::Function() : Object() {
}

inline Function::Function(napi_env env, napi_value value) : Object(env, value) {
}

inline MaybeOrValue<Value> Function::operator()(
    const std::initializer_list<napi_value>& args) const {
  return Call(Env().Undefined(), args);
}

inline MaybeOrValue<Value> Function::Call(
    const std::initializer_list<napi_value>& args) const {
  return Call(Env().Undefined(), args);
}

inline MaybeOrValue<Value> Function::Call(
    const std::vector<napi_value>& args) const {
  return Call(Env().Undefined(), args);
}

inline MaybeOrValue<Value> Function::Call(size_t argc,
                                          const napi_value* args) const {
  return Call(Env().Undefined(), argc, args);
}

inline MaybeOrValue<Value> Function::Call(
    napi_value recv, const std::initializer_list<napi_value>& args) const {
  return Call(recv, args.size(), args.begin());
}

inline MaybeOrValue<Value> Function::Call(
    napi_value recv, const std::vector<napi_value>& args) const {
  return Call(recv, args.size(), args.data());
}

inline MaybeOrValue<Value> Function::Call(napi_value recv,
                                          size_t argc,
                                          const napi_value* args) const {
  napi_value result;
  napi_status status = napi_call_function(
    _env, recv, _value, argc, args, &result);
  NAPI_RETURN_OR_THROW_IF_FAILED(
      _env, status, Napi::Value(_env, result), Napi::Value);
}

inline MaybeOrValue<Value> Function::MakeCallback(
    napi_value recv,
    const std::initializer_list<napi_value>& args,
    napi_async_context context) const {
  return MakeCallback(recv, args.size(), args.begin(), context);
}

inline MaybeOrValue<Value> Function::MakeCallback(
    napi_value recv,
    const std::vector<napi_value>& args,
    napi_async_context context) const {
  return MakeCallback(recv, args.size(), args.data(), context);
}

inline MaybeOrValue<Value> Function::MakeCallback(
    napi_value recv,
    size_t argc,
    const napi_value* args,
    napi_async_context context) const {
  napi_value result;
  napi_status status = napi_make_callback(
    _env, context, recv, _value, argc, args, &result);
  NAPI_RETURN_OR_THROW_IF_FAILED(
      _env, status, Napi::Value(_env, result), Napi::Value);
}

inline MaybeOrValue<Object> Function::New(
    const std::initializer_list<napi_value>& args) const {
  return New(args.size(), args.begin());
}

inline MaybeOrValue<Object> Function::New(
    const std::vector<napi_value>& args) const {
  return New(args.size(), args.data());
}

inline MaybeOrValue<Object> Function::New(size_t argc,
                                          const napi_value* args) const {
  napi_value result;
  napi_status status = napi_new_instance(
    _env, _value, argc, args, &result);
  NAPI_RETURN_OR_THROW_IF_FAILED(
      _env, status, Napi::Object(_env, result), Napi::Object);
}

////////////////////////////////////////////////////////////////////////////////
// Promise class
////////////////////////////////////////////////////////////////////////////////

inline Promise::Deferred Promise::Deferred::New(napi_env env) {
  return Promise::Deferred(env);
}

inline Promise::Deferred::Deferred(napi_env env) : _env(env) {
  napi_status status = napi_create_promise(_env, &_deferred, &_promise);
  NAPI_THROW_IF_FAILED_VOID(_env, status);
}

inline Promise Promise::Deferred::Promise() const {
  return Napi::Promise(_env, _promise);
}

inline Napi::Env Promise::Deferred::Env() const {
  return Napi::Env(_env);
}

inline void Promise::Deferred::Resolve(napi_value value) const {
  napi_status status = napi_resolve_deferred(_env, _deferred, value);
  NAPI_THROW_IF_FAILED_VOID(_env, status);
}

inline void Promise::Deferred::Reject(napi_value value) const {
  napi_status status = napi_reject_deferred(_env, _deferred, value);
  NAPI_THROW_IF_FAILED_VOID(_env, status);
}

inline Promise::Promise(napi_env env, napi_value value) : Object(env, value) {
}

////////////////////////////////////////////////////////////////////////////////
// Buffer<T> class
////////////////////////////////////////////////////////////////////////////////

template <typename T>
inline Buffer<T> Buffer<T>::New(napi_env env, size_t length) {
  napi_value value;
  void* data;
  napi_status status = napi_create_buffer(env, length * sizeof (T), &data, &value);
  NAPI_THROW_IF_FAILED(env, status, Buffer<T>());
  return Buffer(env, value, length, static_cast<T*>(data));
}

template <typename T>
inline Buffer<T> Buffer<T>::New(napi_env env, T* data, size_t length) {
  napi_value value;
  napi_status status = napi_create_external_buffer(
    env, length * sizeof (T), data, nullptr, nullptr, &value);
  NAPI_THROW_IF_FAILED(env, status, Buffer<T>());
  return Buffer(env, value, length, data);
}

template <typename T>
template <typename Finalizer>
inline Buffer<T> Buffer<T>::New(napi_env env,
                                T* data,
                                size_t length,
                                Finalizer finalizeCallback) {
  napi_value value;
  details::FinalizeData<T, Finalizer>* finalizeData =
      new details::FinalizeData<T, Finalizer>(
          {std::move(finalizeCallback), nullptr});
  napi_status status = napi_create_external_buffer(
    env,
    length * sizeof (T),
    data,
    details::FinalizeData<T, Finalizer>::Wrapper,
    finalizeData,
    &value);
  if (status != napi_ok) {
    delete finalizeData;
    NAPI_THROW_IF_FAILED(env, status, Buffer());
  }
  return Buffer(env, value, length, data);
}

template <typename T>
template <typename Finalizer, typename Hint>
inline Buffer<T> Buffer<T>::New(napi_env env,
                                T* data,
                                size_t length,
                                Finalizer finalizeCallback,
                                Hint* finalizeHint) {
  napi_value value;
  details::FinalizeData<T, Finalizer, Hint>* finalizeData =
      new details::FinalizeData<T, Finalizer, Hint>(
          {std::move(finalizeCallback), finalizeHint});
  napi_status status = napi_create_external_buffer(
    env,
    length * sizeof (T),
    data,
    details::FinalizeData<T, Finalizer, Hint>::WrapperWithHint,
    finalizeData,
    &value);
  if (status != napi_ok) {
    delete finalizeData;
    NAPI_THROW_IF_FAILED(env, status, Buffer());
  }
  return Buffer(env, value, length, data);
}

template <typename T>
inline Buffer<T> Buffer<T>::Copy(napi_env env, const T* data, size_t length) {
  napi_value value;
  napi_status status = napi_create_buffer_copy(
    env, length * sizeof (T), data, nullptr, &value);
  NAPI_THROW_IF_FAILED(env, status, Buffer<T>());
  return Buffer<T>(env, value);
}

template <typename T>
inline Buffer<T>::Buffer() : Uint8Array(), _length(0), _data(nullptr) {
}

template <typename T>
inline Buffer<T>::Buffer(napi_env env, napi_value value)
  : Uint8Array(env, value), _length(0), _data(nullptr) {
}

template <typename T>
inline Buffer<T>::Buffer(napi_env env, napi_value value, size_t length, T* data)
  : Uint8Array(env, value), _length(length), _data(data) {
}

template <typename T>
inline size_t Buffer<T>::Length() const {
  EnsureInfo();
  return _length;
}

template <typename T>
inline T* Buffer<T>::Data() const {
  EnsureInfo();
  return _data;
}

template <typename T>
inline void Buffer<T>::EnsureInfo() const {
  // The Buffer instance may have been constructed from a napi_value whose
  // length/data are not yet known. Fetch and cache these values just once,
  // since they can never change during the lifetime of the Buffer.
  if (_data == nullptr) {
    size_t byteLength;
    void* voidData;
    napi_status status = napi_get_buffer_info(_env, _value, &voidData, &byteLength);
    NAPI_THROW_IF_FAILED_VOID(_env, status);
    _length = byteLength / sizeof (T);
    _data = static_cast<T*>(voidData);
  }
}

////////////////////////////////////////////////////////////////////////////////
// Error class
////////////////////////////////////////////////////////////////////////////////

inline Error Error::New(napi_env env) {
  napi_status status;
  napi_value error = nullptr;
  bool is_exception_pending;
  napi_extended_error_info last_error_info_copy;

  {
    // We must retrieve the last error info before doing anything else because
    // doing anything else will replace the last error info.
    const napi_extended_error_info* last_error_info;
    status = napi_get_last_error_info(env, &last_error_info);
    NAPI_FATAL_IF_FAILED(status, "Error::New", "napi_get_last_error_info");

    // All fields of the `napi_extended_error_info` structure gets reset in
    // subsequent Node-API function calls on the same `env`. This includes a
    // call to `napi_is_exception_pending()`. So here it is necessary to make a
    // copy of the information as the `error_code` field is used later on.
    memcpy(&last_error_info_copy,
           last_error_info,
           sizeof(napi_extended_error_info));
  }

  status = napi_is_exception_pending(env, &is_exception_pending);
  NAPI_FATAL_IF_FAILED(status, "Error::New", "napi_is_exception_pending");

  // A pending exception takes precedence over any internal error status.
  if (is_exception_pending) {
    status = napi_get_and_clear_last_exception(env, &error);
    NAPI_FATAL_IF_FAILED(status, "Error::New", "napi_get_and_clear_last_exception");
  }
  else {
    const char* error_message = last_error_info_copy.error_message != nullptr
                                    ? last_error_info_copy.error_message
                                    : "Error in native callback";

    napi_value message;
    status = napi_create_string_utf8(
      env,
      error_message,
      std::strlen(error_message),
      &message);
    NAPI_FATAL_IF_FAILED(status, "Error::New", "napi_create_string_utf8");

    switch (last_error_info_copy.error_code) {
      case napi_object_expected:
      case napi_string_expected:
      case napi_boolean_expected:
      case napi_number_expected:
        status = napi_create_type_error(env, nullptr, message, &error);
        break;
      default:
        status = napi_create_error(env, nullptr, message, &error);
        break;
    }
    NAPI_FATAL_IF_FAILED(status, "Error::New", "napi_create_error");
  }

  return Error(env, error);
}

inline Error Error::New(napi_env env, const char* message) {
  return Error::New<Error>(env, message, std::strlen(message), napi_create_error);
}

inline Error Error::New(napi_env env, const std::string& message) {
  return Error::New<Error>(env, message.c_str(), message.size(), napi_create_error);
}

inline NAPI_NO_RETURN void Error::Fatal(const char* location, const char* message) {
  napi_fatal_error(location, NAPI_AUTO_LENGTH, message, NAPI_AUTO_LENGTH);
}

inline Error::Error() : ObjectReference() {
}

inline Error::Error(napi_env env, napi_value value) : ObjectReference(env, nullptr) {
  if (value != nullptr) {
    // Attempting to create a reference on the error object.
    // If it's not a Object/Function/Symbol, this call will return an error
    // status.
    napi_status status = napi_create_reference(env, value, 1, &_ref);

    if (status != napi_ok) {
      napi_value wrappedErrorObj;

      // Create an error object
      status = napi_create_object(env, &wrappedErrorObj);
      NAPI_FATAL_IF_FAILED(status, "Error::Error", "napi_create_object");

      // property flag that we attach to show the error object is wrapped
      napi_property_descriptor wrapObjFlag = {
          ERROR_WRAP_VALUE,  // Unique GUID identifier since Symbol isn't a
                             // viable option
          nullptr,
          nullptr,
          nullptr,
          nullptr,
          Value::From(env, value),
          napi_enumerable,
          nullptr};

      status = napi_define_properties(env, wrappedErrorObj, 1, &wrapObjFlag);
      NAPI_FATAL_IF_FAILED(status, "Error::Error", "napi_define_properties");

      // Create a reference on the newly wrapped object
      status = napi_create_reference(env, wrappedErrorObj, 1, &_ref);
    }

    // Avoid infinite recursion in the failure case.
    NAPI_FATAL_IF_FAILED(status, "Error::Error", "napi_create_reference");
  }
}

inline Object Error::Value() const {
  if (_ref == nullptr) {
    return Object(_env, nullptr);
  }

  napi_value refValue;
  napi_status status = napi_get_reference_value(_env, _ref, &refValue);
  NAPI_THROW_IF_FAILED(_env, status, Object());

  napi_valuetype type;
  status = napi_typeof(_env, refValue, &type);
  NAPI_THROW_IF_FAILED(_env, status, Object());

  // If refValue isn't a symbol, then we proceed to whether the refValue has the
  // wrapped error flag
  if (type != napi_symbol) {
    // We are checking if the object is wrapped
    bool isWrappedObject = false;

    status = napi_has_property(
        _env, refValue, String::From(_env, ERROR_WRAP_VALUE), &isWrappedObject);

    // Don't care about status
    if (isWrappedObject) {
      napi_value unwrappedValue;
      status = napi_get_property(_env,
                                 refValue,
                                 String::From(_env, ERROR_WRAP_VALUE),
                                 &unwrappedValue);
      NAPI_THROW_IF_FAILED(_env, status, Object());

      return Object(_env, unwrappedValue);
    }
  }

  return Object(_env, refValue);
}

inline Error::Error(Error&& other) : ObjectReference(std::move(other)) {
}

inline Error& Error::operator =(Error&& other) {
  static_cast<Reference<Object>*>(this)->operator=(std::move(other));
  return *this;
}

inline Error::Error(const Error& other) : ObjectReference(other) {
}

inline Error& Error::operator =(const Error& other) {
  Reset();

  _env = other.Env();
  HandleScope scope(_env);

  napi_value value = other.Value();
  if (value != nullptr) {
    napi_status status = napi_create_reference(_env, value, 1, &_ref);
    NAPI_THROW_IF_FAILED(_env, status, *this);
  }

  return *this;
}

inline const std::string& Error::Message() const NAPI_NOEXCEPT {
  if (_message.size() == 0 && _env != nullptr) {
#ifdef NAPI_CPP_EXCEPTIONS
    try {
      _message = Get("message").As<String>();
    }
    catch (...) {
      // Catch all errors here, to include e.g. a std::bad_alloc from
      // the std::string::operator=, because this method may not throw.
    }
#else // NAPI_CPP_EXCEPTIONS
#if defined(NODE_ADDON_API_ENABLE_MAYBE)
    Napi::Value message_val;
    if (Get("message").UnwrapTo(&message_val)) {
      _message = message_val.As<String>();
    }
#else
    _message = Get("message").As<String>();
#endif
#endif // NAPI_CPP_EXCEPTIONS
  }
  return _message;
}

// we created an object on the &_ref
inline void Error::ThrowAsJavaScriptException() const {
  HandleScope scope(_env);
  if (!IsEmpty()) {
#ifdef NODE_API_SWALLOW_UNTHROWABLE_EXCEPTIONS
    bool pendingException = false;

    // check if there is already a pending exception. If so don't try to throw a
    // new one as that is not allowed/possible
    napi_status status = napi_is_exception_pending(_env, &pendingException);

    if ((status != napi_ok) ||
        ((status == napi_ok) && (pendingException == false))) {
      // We intentionally don't use `NAPI_THROW_*` macros here to ensure
      // that there is no possible recursion as `ThrowAsJavaScriptException`
      // is part of `NAPI_THROW_*` macro definition for noexcept.

      status = napi_throw(_env, Value());

      if (status == napi_pending_exception) {
        // The environment must be terminating as we checked earlier and there
        // was no pending exception. In this case continuing will result
        // in a fatal error and there is nothing the author has done incorrectly
        // in their code that is worth flagging through a fatal error
        return;
      }
    } else {
      status = napi_pending_exception;
    }
#else
    // We intentionally don't use `NAPI_THROW_*` macros here to ensure
    // that there is no possible recursion as `ThrowAsJavaScriptException`
    // is part of `NAPI_THROW_*` macro definition for noexcept.

    napi_status status = napi_throw(_env, Value());
#endif

#ifdef NAPI_CPP_EXCEPTIONS
    if (status != napi_ok) {
      throw Error::New(_env);
    }
#else // NAPI_CPP_EXCEPTIONS
    NAPI_FATAL_IF_FAILED(status, "Error::ThrowAsJavaScriptException", "napi_throw");
#endif // NAPI_CPP_EXCEPTIONS
  }
}

#ifdef NAPI_CPP_EXCEPTIONS

inline const char* Error::what() const NAPI_NOEXCEPT {
  return Message().c_str();
}

#endif // NAPI_CPP_EXCEPTIONS

template <typename TError>
inline TError Error::New(napi_env env,
                         const char* message,
                         size_t length,
                         create_error_fn create_error) {
  napi_value str;
  napi_status status = napi_create_string_utf8(env, message, length, &str);
  NAPI_THROW_IF_FAILED(env, status, TError());

  napi_value error;
  status = create_error(env, nullptr, str, &error);
  NAPI_THROW_IF_FAILED(env, status, TError());

  return TError(env, error);
}

inline TypeError TypeError::New(napi_env env, const char* message) {
  return Error::New<TypeError>(env, message, std::strlen(message), napi_create_type_error);
}

inline TypeError TypeError::New(napi_env env, const std::string& message) {
  return Error::New<TypeError>(env, message.c_str(), message.size(), napi_create_type_error);
}

inline TypeError::TypeError() : Error() {
}

inline TypeError::TypeError(napi_env env, napi_value value) : Error(env, value) {
}

inline RangeError RangeError::New(napi_env env, const char* message) {
  return Error::New<RangeError>(env, message, std::strlen(message), napi_create_range_error);
}

inline RangeError RangeError::New(napi_env env, const std::string& message) {
  return Error::New<RangeError>(env, message.c_str(), message.size(), napi_create_range_error);
}

inline RangeError::RangeError() : Error() {
}

inline RangeError::RangeError(napi_env env, napi_value value) : Error(env, value) {
}

////////////////////////////////////////////////////////////////////////////////
// Reference<T> class
////////////////////////////////////////////////////////////////////////////////

template <typename T>
inline Reference<T> Reference<T>::New(const T& value, uint32_t initialRefcount) {
  napi_env env = value.Env();
  napi_value val = value;

  if (val == nullptr) {
    return Reference<T>(env, nullptr);
  }

  napi_ref ref;
  napi_status status = napi_create_reference(env, value, initialRefcount, &ref);
  NAPI_THROW_IF_FAILED(env, status, Reference<T>());

  return Reference<T>(env, ref);
}


template <typename T>
inline Reference<T>::Reference() : _env(nullptr), _ref(nullptr), _suppressDestruct(false) {
}

template <typename T>
inline Reference<T>::Reference(napi_env env, napi_ref ref)
  : _env(env), _ref(ref), _suppressDestruct(false) {
}

template <typename T>
inline Reference<T>::~Reference() {
  if (_ref != nullptr) {
    if (!_suppressDestruct) {
      napi_delete_reference(_env, _ref);
    }

    _ref = nullptr;
  }
}

template <typename T>
inline Reference<T>::Reference(Reference<T>&& other)
  : _env(other._env), _ref(other._ref), _suppressDestruct(other._suppressDestruct) {
  other._env = nullptr;
  other._ref = nullptr;
  other._suppressDestruct = false;
}

template <typename T>
inline Reference<T>& Reference<T>::operator =(Reference<T>&& other) {
  Reset();
  _env = other._env;
  _ref = other._ref;
  _suppressDestruct = other._suppressDestruct;
  other._env = nullptr;
  other._ref = nullptr;
  other._suppressDestruct = false;
  return *this;
}

template <typename T>
inline Reference<T>::Reference(const Reference<T>& other)
  : _env(other._env), _ref(nullptr), _suppressDestruct(false) {
  HandleScope scope(_env);

  napi_value value = other.Value();
  if (value != nullptr) {
    // Copying is a limited scenario (currently only used for Error object) and always creates a
    // strong reference to the given value even if the incoming reference is weak.
    napi_status status = napi_create_reference(_env, value, 1, &_ref);
    NAPI_FATAL_IF_FAILED(status, "Reference<T>::Reference", "napi_create_reference");
  }
}

template <typename T>
inline Reference<T>::operator napi_ref() const {
  return _ref;
}

template <typename T>
inline bool Reference<T>::operator ==(const Reference<T> &other) const {
  HandleScope scope(_env);
  return this->Value().StrictEquals(other.Value());
}

template <typename T>
inline bool Reference<T>::operator !=(const Reference<T> &other) const {
  return !this->operator ==(other);
}

template <typename T>
inline Napi::Env Reference<T>::Env() const {
  return Napi::Env(_env);
}

template <typename T>
inline bool Reference<T>::IsEmpty() const {
  return _ref == nullptr;
}

template <typename T>
inline T Reference<T>::Value() const {
  if (_ref == nullptr) {
    return T(_env, nullptr);
  }

  napi_value value;
  napi_status status = napi_get_reference_value(_env, _ref, &value);
  NAPI_THROW_IF_FAILED(_env, status, T());
  return T(_env, value);
}

template <typename T>
inline uint32_t Reference<T>::Ref() {
  uint32_t result;
  napi_status status = napi_reference_ref(_env, _ref, &result);
  NAPI_THROW_IF_FAILED(_env, status, 0);
  return result;
}

template <typename T>
inline uint32_t Reference<T>::Unref() {
  uint32_t result;
  napi_status status = napi_reference_unref(_env, _ref, &result);
  NAPI_THROW_IF_FAILED(_env, status, 0);
  return result;
}

template <typename T>
inline void Reference<T>::Reset() {
  if (_ref != nullptr) {
    napi_status status = napi_delete_reference(_env, _ref);
    NAPI_THROW_IF_FAILED_VOID(_env, status);
    _ref = nullptr;
  }
}

template <typename T>
inline void Reference<T>::Reset(const T& value, uint32_t refcount) {
  Reset();
  _env = value.Env();

  napi_value val = value;
  if (val != nullptr) {
    napi_status status = napi_create_reference(_env, value, refcount, &_ref);
    NAPI_THROW_IF_FAILED_VOID(_env, status);
  }
}

template <typename T>
inline void Reference<T>::SuppressDestruct() {
  _suppressDestruct = true;
}

template <typename T>
inline Reference<T> Weak(T value) {
  return Reference<T>::New(value, 0);
}

inline ObjectReference Weak(Object value) {
  return Reference<Object>::New(value, 0);
}

inline FunctionReference Weak(Function value) {
  return Reference<Function>::New(value, 0);
}

template <typename T>
inline Reference<T> Persistent(T value) {
  return Reference<T>::New(value, 1);
}

inline ObjectReference Persistent(Object value) {
  return Reference<Object>::New(value, 1);
}

inline FunctionReference Persistent(Function value) {
  return Reference<Function>::New(value, 1);
}

////////////////////////////////////////////////////////////////////////////////
// ObjectReference class
////////////////////////////////////////////////////////////////////////////////

inline ObjectReference::ObjectReference(): Reference<Object>() {
}

inline ObjectReference::ObjectReference(napi_env env, napi_ref ref): Reference<Object>(env, ref) {
}

inline ObjectReference::ObjectReference(Reference<Object>&& other)
  : Reference<Object>(std::move(other)) {
}

inline ObjectReference& ObjectReference::operator =(Reference<Object>&& other) {
  static_cast<Reference<Object>*>(this)->operator=(std::move(other));
  return *this;
}

inline ObjectReference::ObjectReference(ObjectReference&& other)
  : Reference<Object>(std::move(other)) {
}

inline ObjectReference& ObjectReference::operator =(ObjectReference&& other) {
  static_cast<Reference<Object>*>(this)->operator=(std::move(other));
  return *this;
}

inline ObjectReference::ObjectReference(const ObjectReference& other)
  : Reference<Object>(other) {
}

inline MaybeOrValue<Napi::Value> ObjectReference::Get(
    const char* utf8name) const {
  EscapableHandleScope scope(_env);
  MaybeOrValue<Napi::Value> result = Value().Get(utf8name);
#ifdef NODE_ADDON_API_ENABLE_MAYBE
  if (result.IsJust()) {
    return Just(scope.Escape(result.Unwrap()));
  }
  return result;
#else
  if (scope.Env().IsExceptionPending()) {
    return Value();
  }
  return scope.Escape(result);
#endif
}

inline MaybeOrValue<Napi::Value> ObjectReference::Get(
    const std::string& utf8name) const {
  EscapableHandleScope scope(_env);
  MaybeOrValue<Napi::Value> result = Value().Get(utf8name);
#ifdef NODE_ADDON_API_ENABLE_MAYBE
  if (result.IsJust()) {
    return Just(scope.Escape(result.Unwrap()));
  }
  return result;
#else
  if (scope.Env().IsExceptionPending()) {
    return Value();
  }
  return scope.Escape(result);
#endif
}

inline MaybeOrValue<bool> ObjectReference::Set(const char* utf8name,
                                               napi_value value) {
  HandleScope scope(_env);
  return Value().Set(utf8name, value);
}

inline MaybeOrValue<bool> ObjectReference::Set(const char* utf8name,
                                               Napi::Value value) {
  HandleScope scope(_env);
  return Value().Set(utf8name, value);
}

inline MaybeOrValue<bool> ObjectReference::Set(const char* utf8name,
                                               const char* utf8value) {
  HandleScope scope(_env);
  return Value().Set(utf8name, utf8value);
}

inline MaybeOrValue<bool> ObjectReference::Set(const char* utf8name,
                                               bool boolValue) {
  HandleScope scope(_env);
  return Value().Set(utf8name, boolValue);
}

inline MaybeOrValue<bool> ObjectReference::Set(const char* utf8name,
                                               double numberValue) {
  HandleScope scope(_env);
  return Value().Set(utf8name, numberValue);
}

inline MaybeOrValue<bool> ObjectReference::Set(const std::string& utf8name,
                                               napi_value value) {
  HandleScope scope(_env);
  return Value().Set(utf8name, value);
}

inline MaybeOrValue<bool> ObjectReference::Set(const std::string& utf8name,
                                               Napi::Value value) {
  HandleScope scope(_env);
  return Value().Set(utf8name, value);
}

inline MaybeOrValue<bool> ObjectReference::Set(const std::string& utf8name,
                                               std::string& utf8value) {
  HandleScope scope(_env);
  return Value().Set(utf8name, utf8value);
}

inline MaybeOrValue<bool> ObjectReference::Set(const std::string& utf8name,
                                               bool boolValue) {
  HandleScope scope(_env);
  return Value().Set(utf8name, boolValue);
}

inline MaybeOrValue<bool> ObjectReference::Set(const std::string& utf8name,
                                               double numberValue) {
  HandleScope scope(_env);
  return Value().Set(utf8name, numberValue);
}

inline MaybeOrValue<Napi::Value> ObjectReference::Get(uint32_t index) const {
  EscapableHandleScope scope(_env);
  MaybeOrValue<Napi::Value> result = Value().Get(index);
#ifdef NODE_ADDON_API_ENABLE_MAYBE
  if (result.IsJust()) {
    return Just(scope.Escape(result.Unwrap()));
  }
  return result;
#else
  if (scope.Env().IsExceptionPending()) {
    return Value();
  }
  return scope.Escape(result);
#endif
}

inline MaybeOrValue<bool> ObjectReference::Set(uint32_t index,
                                               napi_value value) {
  HandleScope scope(_env);
  return Value().Set(index, value);
}

inline MaybeOrValue<bool> ObjectReference::Set(uint32_t index,
                                               Napi::Value value) {
  HandleScope scope(_env);
  return Value().Set(index, value);
}

inline MaybeOrValue<bool> ObjectReference::Set(uint32_t index,
                                               const char* utf8value) {
  HandleScope scope(_env);
  return Value().Set(index, utf8value);
}

inline MaybeOrValue<bool> ObjectReference::Set(uint32_t index,
                                               const std::string& utf8value) {
  HandleScope scope(_env);
  return Value().Set(index, utf8value);
}

inline MaybeOrValue<bool> ObjectReference::Set(uint32_t index, bool boolValue) {
  HandleScope scope(_env);
  return Value().Set(index, boolValue);
}

inline MaybeOrValue<bool> ObjectReference::Set(uint32_t index,
                                               double numberValue) {
  HandleScope scope(_env);
  return Value().Set(index, numberValue);
}

////////////////////////////////////////////////////////////////////////////////
// FunctionReference class
////////////////////////////////////////////////////////////////////////////////

inline FunctionReference::FunctionReference(): Reference<Function>() {
}

inline FunctionReference::FunctionReference(napi_env env, napi_ref ref)
  : Reference<Function>(env, ref) {
}

inline FunctionReference::FunctionReference(Reference<Function>&& other)
  : Reference<Function>(std::move(other)) {
}

inline FunctionReference& FunctionReference::operator =(Reference<Function>&& other) {
  static_cast<Reference<Function>*>(this)->operator=(std::move(other));
  return *this;
}

inline FunctionReference::FunctionReference(FunctionReference&& other)
  : Reference<Function>(std::move(other)) {
}

inline FunctionReference& FunctionReference::operator =(FunctionReference&& other) {
  static_cast<Reference<Function>*>(this)->operator=(std::move(other));
  return *this;
}

inline MaybeOrValue<Napi::Value> FunctionReference::operator()(
    const std::initializer_list<napi_value>& args) const {
  EscapableHandleScope scope(_env);
  MaybeOrValue<Napi::Value> result = Value()(args);
#ifdef NODE_ADDON_API_ENABLE_MAYBE
  if (result.IsJust()) {
    return Just(scope.Escape(result.Unwrap()));
  }
  return result;
#else
  if (scope.Env().IsExceptionPending()) {
    return Value();
  }
  return scope.Escape(result);
#endif
}

inline MaybeOrValue<Napi::Value> FunctionReference::Call(
    const std::initializer_list<napi_value>& args) const {
  EscapableHandleScope scope(_env);
  MaybeOrValue<Napi::Value> result = Value().Call(args);
#ifdef NODE_ADDON_API_ENABLE_MAYBE
  if (result.IsJust()) {
    return Just(scope.Escape(result.Unwrap()));
  }
  return result;
#else
  if (scope.Env().IsExceptionPending()) {
    return Value();
  }
  return scope.Escape(result);
#endif
}

inline MaybeOrValue<Napi::Value> FunctionReference::Call(
    const std::vector<napi_value>& args) const {
  EscapableHandleScope scope(_env);
  MaybeOrValue<Napi::Value> result = Value().Call(args);
#ifdef NODE_ADDON_API_ENABLE_MAYBE
  if (result.IsJust()) {
    return Just(scope.Escape(result.Unwrap()));
  }
  return result;
#else
  if (scope.Env().IsExceptionPending()) {
    return Value();
  }
  return scope.Escape(result);
#endif
}

inline MaybeOrValue<Napi::Value> FunctionReference::Call(
    napi_value recv, const std::initializer_list<napi_value>& args) const {
  EscapableHandleScope scope(_env);
  MaybeOrValue<Napi::Value> result = Value().Call(recv, args);
#ifdef NODE_ADDON_API_ENABLE_MAYBE
  if (result.IsJust()) {
    return Just(scope.Escape(result.Unwrap()));
  }
  return result;
#else
  if (scope.Env().IsExceptionPending()) {
    return Value();
  }
  return scope.Escape(result);
#endif
}

inline MaybeOrValue<Napi::Value> FunctionReference::Call(
    napi_value recv, const std::vector<napi_value>& args) const {
  EscapableHandleScope scope(_env);
  MaybeOrValue<Napi::Value> result = Value().Call(recv, args);
#ifdef NODE_ADDON_API_ENABLE_MAYBE
  if (result.IsJust()) {
    return Just(scope.Escape(result.Unwrap()));
  }
  return result;
#else
  if (scope.Env().IsExceptionPending()) {
    return Value();
  }
  return scope.Escape(result);
#endif
}

inline MaybeOrValue<Napi::Value> FunctionReference::Call(
    napi_value recv, size_t argc, const napi_value* args) const {
  EscapableHandleScope scope(_env);
  MaybeOrValue<Napi::Value> result = Value().Call(recv, argc, args);
#ifdef NODE_ADDON_API_ENABLE_MAYBE
  if (result.IsJust()) {
    return Just(scope.Escape(result.Unwrap()));
  }
  return result;
#else
  if (scope.Env().IsExceptionPending()) {
    return Value();
  }
  return scope.Escape(result);
#endif
}

inline MaybeOrValue<Napi::Value> FunctionReference::MakeCallback(
    napi_value recv,
    const std::initializer_list<napi_value>& args,
    napi_async_context context) const {
  EscapableHandleScope scope(_env);
  MaybeOrValue<Napi::Value> result = Value().MakeCallback(recv, args, context);
#ifdef NODE_ADDON_API_ENABLE_MAYBE
  if (result.IsJust()) {
    return Just(scope.Escape(result.Unwrap()));
  }

  return result;
#else
  if (scope.Env().IsExceptionPending()) {
    return Value();
  }
  return scope.Escape(result);
#endif
}

inline MaybeOrValue<Napi::Value> FunctionReference::MakeCallback(
    napi_value recv,
    const std::vector<napi_value>& args,
    napi_async_context context) const {
  EscapableHandleScope scope(_env);
  MaybeOrValue<Napi::Value> result = Value().MakeCallback(recv, args, context);
#ifdef NODE_ADDON_API_ENABLE_MAYBE
  if (result.IsJust()) {
    return Just(scope.Escape(result.Unwrap()));
  }
  return result;
#else
  if (scope.Env().IsExceptionPending()) {
    return Value();
  }
  return scope.Escape(result);
#endif
}

inline MaybeOrValue<Napi::Value> FunctionReference::MakeCallback(
    napi_value recv,
    size_t argc,
    const napi_value* args,
    napi_async_context context) const {
  EscapableHandleScope scope(_env);
  MaybeOrValue<Napi::Value> result =
      Value().MakeCallback(recv, argc, args, context);
#ifdef NODE_ADDON_API_ENABLE_MAYBE
  if (result.IsJust()) {
    return Just(scope.Escape(result.Unwrap()));
  }
  return result;
#else
  if (scope.Env().IsExceptionPending()) {
    return Value();
  }
  return scope.Escape(result);
#endif
}

inline MaybeOrValue<Object> FunctionReference::New(
    const std::initializer_list<napi_value>& args) const {
  EscapableHandleScope scope(_env);
  MaybeOrValue<Object> result = Value().New(args);
#ifdef NODE_ADDON_API_ENABLE_MAYBE
  if (result.IsJust()) {
    return Just(scope.Escape(result.Unwrap()).As<Object>());
  }
  return result;
#else
  if (scope.Env().IsExceptionPending()) {
    return Object();
  }
  return scope.Escape(result).As<Object>();
#endif
}

inline MaybeOrValue<Object> FunctionReference::New(
    const std::vector<napi_value>& args) const {
  EscapableHandleScope scope(_env);
  MaybeOrValue<Object> result = Value().New(args);
#ifdef NODE_ADDON_API_ENABLE_MAYBE
  if (result.IsJust()) {
    return Just(scope.Escape(result.Unwrap()).As<Object>());
  }
  return result;
#else
  if (scope.Env().IsExceptionPending()) {
    return Object();
  }
  return scope.Escape(result).As<Object>();
#endif
}

////////////////////////////////////////////////////////////////////////////////
// CallbackInfo class
////////////////////////////////////////////////////////////////////////////////

inline CallbackInfo::CallbackInfo(napi_env env, napi_callback_info info)
    : _env(env), _info(info), _this(nullptr), _dynamicArgs(nullptr), _data(nullptr) {
  _argc = _staticArgCount;
  _argv = _staticArgs;
  napi_status status = napi_get_cb_info(env, info, &_argc, _argv, &_this, &_data);
  NAPI_THROW_IF_FAILED_VOID(_env, status);

  if (_argc > _staticArgCount) {
    // Use either a fixed-size array (on the stack) or a dynamically-allocated
    // array (on the heap) depending on the number of args.
    _dynamicArgs = new napi_value[_argc];
    _argv = _dynamicArgs;

    status = napi_get_cb_info(env, info, &_argc, _argv, nullptr, nullptr);
    NAPI_THROW_IF_FAILED_VOID(_env, status);
  }
}

inline CallbackInfo::~CallbackInfo() {
  if (_dynamicArgs != nullptr) {
    delete[] _dynamicArgs;
  }
}

inline Value CallbackInfo::NewTarget() const {
  napi_value newTarget;
  napi_status status = napi_get_new_target(_env, _info, &newTarget);
  NAPI_THROW_IF_FAILED(_env, status, Value());
  return Value(_env, newTarget);
}

inline bool CallbackInfo::IsConstructCall() const {
  return !NewTarget().IsEmpty();
}

inline Napi::Env CallbackInfo::Env() const {
  return Napi::Env(_env);
}

inline size_t CallbackInfo::Length() const {
  return _argc;
}

inline const Value CallbackInfo::operator [](size_t index) const {
  return index < _argc ? Value(_env, _argv[index]) : Env().Undefined();
}

inline Value CallbackInfo::This() const {
  if (_this == nullptr) {
    return Env().Undefined();
  }
  return Object(_env, _this);
}

inline void* CallbackInfo::Data() const {
  return _data;
}

inline void CallbackInfo::SetData(void* data) {
  _data = data;
}

////////////////////////////////////////////////////////////////////////////////
// PropertyDescriptor class
////////////////////////////////////////////////////////////////////////////////

template <typename PropertyDescriptor::GetterCallback Getter>
PropertyDescriptor
PropertyDescriptor::Accessor(const char* utf8name,
                             napi_property_attributes attributes,
                             void* data) {
  napi_property_descriptor desc = napi_property_descriptor();

  desc.utf8name = utf8name;
  desc.getter = details::TemplatedCallback<Getter>;
  desc.attributes = attributes;
  desc.data = data;

  return desc;
}

template <typename PropertyDescriptor::GetterCallback Getter>
PropertyDescriptor
PropertyDescriptor::Accessor(const std::string& utf8name,
                             napi_property_attributes attributes,
                             void* data) {
  return Accessor<Getter>(utf8name.c_str(), attributes, data);
}

template <typename PropertyDescriptor::GetterCallback Getter>
PropertyDescriptor
PropertyDescriptor::Accessor(Name name,
                             napi_property_attributes attributes,
                             void* data) {
  napi_property_descriptor desc = napi_property_descriptor();

  desc.name = name;
  desc.getter = details::TemplatedCallback<Getter>;
  desc.attributes = attributes;
  desc.data = data;

  return desc;
}

template <
typename PropertyDescriptor::GetterCallback Getter,
typename PropertyDescriptor::SetterCallback Setter>
PropertyDescriptor
PropertyDescriptor::Accessor(const char* utf8name,
                             napi_property_attributes attributes,
                             void* data) {

  napi_property_descriptor desc = napi_property_descriptor();

  desc.utf8name = utf8name;
  desc.getter = details::TemplatedCallback<Getter>;
  desc.setter = details::TemplatedVoidCallback<Setter>;
  desc.attributes = attributes;
  desc.data = data;

  return desc;
}

template <
typename PropertyDescriptor::GetterCallback Getter,
typename PropertyDescriptor::SetterCallback Setter>
PropertyDescriptor
PropertyDescriptor::Accessor(const std::string& utf8name,
                             napi_property_attributes attributes,
                             void* data) {
  return Accessor<Getter, Setter>(utf8name.c_str(), attributes, data);
}

template <
typename PropertyDescriptor::GetterCallback Getter,
typename PropertyDescriptor::SetterCallback Setter>
PropertyDescriptor
PropertyDescriptor::Accessor(Name name,
                             napi_property_attributes attributes,
                             void* data) {
  napi_property_descriptor desc = napi_property_descriptor();

  desc.name = name;
  desc.getter = details::TemplatedCallback<Getter>;
  desc.setter = details::TemplatedVoidCallback<Setter>;
  desc.attributes = attributes;
  desc.data = data;

  return desc;
}

template <typename Getter>
inline PropertyDescriptor
PropertyDescriptor::Accessor(Napi::Env env,
                             Napi::Object object,
                             const char* utf8name,
                             Getter getter,
                             napi_property_attributes attributes,
                             void* data) {
  using CbData = details::CallbackData<Getter, Napi::Value>;
  auto callbackData = new CbData({ getter, data });

  napi_status status = AttachData(env, object, callbackData);
  if (status != napi_ok) {
    delete callbackData;
    NAPI_THROW_IF_FAILED(env, status, napi_property_descriptor());
  }

  return PropertyDescriptor({
    utf8name,
    nullptr,
    nullptr,
    CbData::Wrapper,
    nullptr,
    nullptr,
    attributes,
    callbackData
  });
}

template <typename Getter>
inline PropertyDescriptor PropertyDescriptor::Accessor(Napi::Env env,
                                                       Napi::Object object,
                                                       const std::string& utf8name,
                                                       Getter getter,
                                                       napi_property_attributes attributes,
                                                       void* data) {
  return Accessor(env, object, utf8name.c_str(), getter, attributes, data);
}

template <typename Getter>
inline PropertyDescriptor PropertyDescriptor::Accessor(Napi::Env env,
                                                       Napi::Object object,
                                                       Name name,
                                                       Getter getter,
                                                       napi_property_attributes attributes,
                                                       void* data) {
  using CbData = details::CallbackData<Getter, Napi::Value>;
  auto callbackData = new CbData({ getter, data });

  napi_status status = AttachData(env, object, callbackData);
  if (status != napi_ok) {
    delete callbackData;
    NAPI_THROW_IF_FAILED(env, status, napi_property_descriptor());
  }

  return PropertyDescriptor({
    nullptr,
    name,
    nullptr,
    CbData::Wrapper,
    nullptr,
    nullptr,
    attributes,
    callbackData
  });
}

template <typename Getter, typename Setter>
inline PropertyDescriptor PropertyDescriptor::Accessor(Napi::Env env,
                                                       Napi::Object object,
                                                       const char* utf8name,
                                                       Getter getter,
                                                       Setter setter,
                                                       napi_property_attributes attributes,
                                                       void* data) {
  using CbData = details::AccessorCallbackData<Getter, Setter>;
  auto callbackData = new CbData({ getter, setter, data });

  napi_status status = AttachData(env, object, callbackData);
  if (status != napi_ok) {
    delete callbackData;
    NAPI_THROW_IF_FAILED(env, status, napi_property_descriptor());
  }

  return PropertyDescriptor({
    utf8name,
    nullptr,
    nullptr,
    CbData::GetterWrapper,
    CbData::SetterWrapper,
    nullptr,
    attributes,
    callbackData
  });
}

template <typename Getter, typename Setter>
inline PropertyDescriptor PropertyDescriptor::Accessor(Napi::Env env,
                                                       Napi::Object object,
                                                       const std::string& utf8name,
                                                       Getter getter,
                                                       Setter setter,
                                                       napi_property_attributes attributes,
                                                       void* data) {
  return Accessor(env, object, utf8name.c_str(), getter, setter, attributes, data);
}

template <typename Getter, typename Setter>
inline PropertyDescriptor PropertyDescriptor::Accessor(Napi::Env env,
                                                       Napi::Object object,
                                                       Name name,
                                                       Getter getter,
                                                       Setter setter,
                                                       napi_property_attributes attributes,
                                                       void* data) {
  using CbData = details::AccessorCallbackData<Getter, Setter>;
  auto callbackData = new CbData({ getter, setter, data });

  napi_status status = AttachData(env, object, callbackData);
  if (status != napi_ok) {
    delete callbackData;
    NAPI_THROW_IF_FAILED(env, status, napi_property_descriptor());
  }

  return PropertyDescriptor({
    nullptr,
    name,
    nullptr,
    CbData::GetterWrapper,
    CbData::SetterWrapper,
    nullptr,
    attributes,
    callbackData
  });
}

template <typename Callable>
inline PropertyDescriptor PropertyDescriptor::Function(Napi::Env env,
                                                       Napi::Object /*object*/,
                                                       const char* utf8name,
                                                       Callable cb,
                                                       napi_property_attributes attributes,
                                                       void* data) {
  return PropertyDescriptor({
    utf8name,
    nullptr,
    nullptr,
    nullptr,
    nullptr,
    Napi::Function::New(env, cb, utf8name, data),
    attributes,
    nullptr
  });
}

template <typename Callable>
inline PropertyDescriptor PropertyDescriptor::Function(Napi::Env env,
                                                       Napi::Object object,
                                                       const std::string& utf8name,
                                                       Callable cb,
                                                       napi_property_attributes attributes,
                                                       void* data) {
  return Function(env, object, utf8name.c_str(), cb, attributes, data);
}

template <typename Callable>
inline PropertyDescriptor PropertyDescriptor::Function(Napi::Env env,
                                                       Napi::Object /*object*/,
                                                       Name name,
                                                       Callable cb,
                                                       napi_property_attributes attributes,
                                                       void* data) {
  return PropertyDescriptor({
    nullptr,
    name,
    nullptr,
    nullptr,
    nullptr,
    Napi::Function::New(env, cb, nullptr, data),
    attributes,
    nullptr
  });
}

inline PropertyDescriptor PropertyDescriptor::Value(const char* utf8name,
                                                    napi_value value,
                                                    napi_property_attributes attributes) {
  return PropertyDescriptor({
    utf8name, nullptr, nullptr, nullptr, nullptr, value, attributes, nullptr
  });
}

inline PropertyDescriptor PropertyDescriptor::Value(const std::string& utf8name,
                                                    napi_value value,
                                                    napi_property_attributes attributes) {
  return Value(utf8name.c_str(), value, attributes);
}

inline PropertyDescriptor PropertyDescriptor::Value(napi_value name,
                                                    napi_value value,
                                                    napi_property_attributes attributes) {
  return PropertyDescriptor({
    nullptr, name, nullptr, nullptr, nullptr, value, attributes, nullptr
  });
}

inline PropertyDescriptor PropertyDescriptor::Value(Name name,
                                                    Napi::Value value,
                                                    napi_property_attributes attributes) {
  napi_value nameValue = name;
  napi_value valueValue = value;
  return PropertyDescriptor::Value(nameValue, valueValue, attributes);
}

inline PropertyDescriptor::PropertyDescriptor(napi_property_descriptor desc)
  : _desc(desc) {
}

inline PropertyDescriptor::operator napi_property_descriptor&() {
  return _desc;
}

inline PropertyDescriptor::operator const napi_property_descriptor&() const {
  return _desc;
}

////////////////////////////////////////////////////////////////////////////////
// InstanceWrap<T> class
////////////////////////////////////////////////////////////////////////////////

template <typename T>
inline void InstanceWrap<T>::AttachPropData(napi_env env,
                                       napi_value value,
                                       const napi_property_descriptor* prop) {
  napi_status status;
  if (!(prop->attributes & napi_static)) {
    if (prop->method == T::InstanceVoidMethodCallbackWrapper) {
      status = Napi::details::AttachData(env,
                    value,
                    static_cast<InstanceVoidMethodCallbackData*>(prop->data));
      NAPI_THROW_IF_FAILED_VOID(env, status);
    } else if (prop->method == T::InstanceMethodCallbackWrapper) {
      status = Napi::details::AttachData(env,
                        value,
                        static_cast<InstanceMethodCallbackData*>(prop->data));
      NAPI_THROW_IF_FAILED_VOID(env, status);
    } else if (prop->getter == T::InstanceGetterCallbackWrapper ||
        prop->setter == T::InstanceSetterCallbackWrapper) {
      status = Napi::details::AttachData(env,
                          value,
                          static_cast<InstanceAccessorCallbackData*>(prop->data));
      NAPI_THROW_IF_FAILED_VOID(env, status);
    }
  }
}

template <typename T>
inline ClassPropertyDescriptor<T> InstanceWrap<T>::InstanceMethod(
    const char* utf8name,
    InstanceVoidMethodCallback method,
    napi_property_attributes attributes,
    void* data) {
  InstanceVoidMethodCallbackData* callbackData =
    new InstanceVoidMethodCallbackData({ method, data});

  napi_property_descriptor desc = napi_property_descriptor();
  desc.utf8name = utf8name;
  desc.method = T::InstanceVoidMethodCallbackWrapper;
  desc.data = callbackData;
  desc.attributes = attributes;
  return desc;
}

template <typename T>
inline ClassPropertyDescriptor<T> InstanceWrap<T>::InstanceMethod(
    const char* utf8name,
    InstanceMethodCallback method,
    napi_property_attributes attributes,
    void* data) {
  InstanceMethodCallbackData* callbackData = new InstanceMethodCallbackData({ method, data });

  napi_property_descriptor desc = napi_property_descriptor();
  desc.utf8name = utf8name;
  desc.method = T::InstanceMethodCallbackWrapper;
  desc.data = callbackData;
  desc.attributes = attributes;
  return desc;
}

template <typename T>
inline ClassPropertyDescriptor<T> InstanceWrap<T>::InstanceMethod(
    Symbol name,
    InstanceVoidMethodCallback method,
    napi_property_attributes attributes,
    void* data) {
  InstanceVoidMethodCallbackData* callbackData =
    new InstanceVoidMethodCallbackData({ method, data});

  napi_property_descriptor desc = napi_property_descriptor();
  desc.name = name;
  desc.method = T::InstanceVoidMethodCallbackWrapper;
  desc.data = callbackData;
  desc.attributes = attributes;
  return desc;
}

template <typename T>
inline ClassPropertyDescriptor<T> InstanceWrap<T>::InstanceMethod(
    Symbol name,
    InstanceMethodCallback method,
    napi_property_attributes attributes,
    void* data) {
  InstanceMethodCallbackData* callbackData = new InstanceMethodCallbackData({ method, data });

  napi_property_descriptor desc = napi_property_descriptor();
  desc.name = name;
  desc.method = T::InstanceMethodCallbackWrapper;
  desc.data = callbackData;
  desc.attributes = attributes;
  return desc;
}

template <typename T>
template <typename InstanceWrap<T>::InstanceVoidMethodCallback method>
inline ClassPropertyDescriptor<T> InstanceWrap<T>::InstanceMethod(
    const char* utf8name,
    napi_property_attributes attributes,
    void* data) {
  napi_property_descriptor desc = napi_property_descriptor();
  desc.utf8name = utf8name;
  desc.method = details::TemplatedInstanceVoidCallback<T, method>;
  desc.data = data;
  desc.attributes = attributes;
  return desc;
}

template <typename T>
template <typename InstanceWrap<T>::InstanceMethodCallback method>
inline ClassPropertyDescriptor<T> InstanceWrap<T>::InstanceMethod(
    const char* utf8name,
    napi_property_attributes attributes,
    void* data) {
  napi_property_descriptor desc = napi_property_descriptor();
  desc.utf8name = utf8name;
  desc.method = details::TemplatedInstanceCallback<T, method>;
  desc.data = data;
  desc.attributes = attributes;
  return desc;
}

template <typename T>
template <typename InstanceWrap<T>::InstanceVoidMethodCallback method>
inline ClassPropertyDescriptor<T> InstanceWrap<T>::InstanceMethod(
    Symbol name,
    napi_property_attributes attributes,
    void* data) {
  napi_property_descriptor desc = napi_property_descriptor();
  desc.name = name;
  desc.method = details::TemplatedInstanceVoidCallback<T, method>;
  desc.data = data;
  desc.attributes = attributes;
  return desc;
}

template <typename T>
template <typename InstanceWrap<T>::InstanceMethodCallback method>
inline ClassPropertyDescriptor<T> InstanceWrap<T>::InstanceMethod(
    Symbol name,
    napi_property_attributes attributes,
    void* data) {
  napi_property_descriptor desc = napi_property_descriptor();
  desc.name = name;
  desc.method = details::TemplatedInstanceCallback<T, method>;
  desc.data = data;
  desc.attributes = attributes;
  return desc;
}

template <typename T>
inline ClassPropertyDescriptor<T> InstanceWrap<T>::InstanceAccessor(
    const char* utf8name,
    InstanceGetterCallback getter,
    InstanceSetterCallback setter,
    napi_property_attributes attributes,
    void* data) {
  InstanceAccessorCallbackData* callbackData =
    new InstanceAccessorCallbackData({ getter, setter, data });

  napi_property_descriptor desc = napi_property_descriptor();
  desc.utf8name = utf8name;
  desc.getter = getter != nullptr ? T::InstanceGetterCallbackWrapper : nullptr;
  desc.setter = setter != nullptr ? T::InstanceSetterCallbackWrapper : nullptr;
  desc.data = callbackData;
  desc.attributes = attributes;
  return desc;
}

template <typename T>
inline ClassPropertyDescriptor<T> InstanceWrap<T>::InstanceAccessor(
    Symbol name,
    InstanceGetterCallback getter,
    InstanceSetterCallback setter,
    napi_property_attributes attributes,
    void* data) {
  InstanceAccessorCallbackData* callbackData =
    new InstanceAccessorCallbackData({ getter, setter, data });

  napi_property_descriptor desc = napi_property_descriptor();
  desc.name = name;
  desc.getter = getter != nullptr ? T::InstanceGetterCallbackWrapper : nullptr;
  desc.setter = setter != nullptr ? T::InstanceSetterCallbackWrapper : nullptr;
  desc.data = callbackData;
  desc.attributes = attributes;
  return desc;
}

template <typename T>
template <typename InstanceWrap<T>::InstanceGetterCallback getter,
          typename InstanceWrap<T>::InstanceSetterCallback setter>
inline ClassPropertyDescriptor<T> InstanceWrap<T>::InstanceAccessor(
    const char* utf8name,
    napi_property_attributes attributes,
    void* data) {
  napi_property_descriptor desc = napi_property_descriptor();
  desc.utf8name = utf8name;
  desc.getter = details::TemplatedInstanceCallback<T, getter>;
  desc.setter = This::WrapSetter(This::SetterTag<setter>());
  desc.data = data;
  desc.attributes = attributes;
  return desc;
}

template <typename T>
template <typename InstanceWrap<T>::InstanceGetterCallback getter,
          typename InstanceWrap<T>::InstanceSetterCallback setter>
inline ClassPropertyDescriptor<T> InstanceWrap<T>::InstanceAccessor(
    Symbol name,
    napi_property_attributes attributes,
    void* data) {
  napi_property_descriptor desc = napi_property_descriptor();
  desc.name = name;
  desc.getter = details::TemplatedInstanceCallback<T, getter>;
  desc.setter = This::WrapSetter(This::SetterTag<setter>());
  desc.data = data;
  desc.attributes = attributes;
  return desc;
}

template <typename T>
inline ClassPropertyDescriptor<T> InstanceWrap<T>::InstanceValue(
    const char* utf8name,
    Napi::Value value,
    napi_property_attributes attributes) {
  napi_property_descriptor desc = napi_property_descriptor();
  desc.utf8name = utf8name;
  desc.value = value;
  desc.attributes = attributes;
  return desc;
}

template <typename T>
inline ClassPropertyDescriptor<T> InstanceWrap<T>::InstanceValue(
    Symbol name,
    Napi::Value value,
    napi_property_attributes attributes) {
  napi_property_descriptor desc = napi_property_descriptor();
  desc.name = name;
  desc.value = value;
  desc.attributes = attributes;
  return desc;
}

template <typename T>
inline napi_value InstanceWrap<T>::InstanceVoidMethodCallbackWrapper(
    napi_env env,
    napi_callback_info info) {
  return details::WrapCallback([&] {
    CallbackInfo callbackInfo(env, info);
    InstanceVoidMethodCallbackData* callbackData =
      reinterpret_cast<InstanceVoidMethodCallbackData*>(callbackInfo.Data());
    callbackInfo.SetData(callbackData->data);
    T* instance = T::Unwrap(callbackInfo.This().As<Object>());
    auto cb = callbackData->callback;
    (instance->*cb)(callbackInfo);
    return nullptr;
  });
}

template <typename T>
inline napi_value InstanceWrap<T>::InstanceMethodCallbackWrapper(
    napi_env env,
    napi_callback_info info) {
  return details::WrapCallback([&] {
    CallbackInfo callbackInfo(env, info);
    InstanceMethodCallbackData* callbackData =
      reinterpret_cast<InstanceMethodCallbackData*>(callbackInfo.Data());
    callbackInfo.SetData(callbackData->data);
    T* instance = T::Unwrap(callbackInfo.This().As<Object>());
    auto cb = callbackData->callback;
    return (instance->*cb)(callbackInfo);
  });
}

template <typename T>
inline napi_value InstanceWrap<T>::InstanceGetterCallbackWrapper(
    napi_env env,
    napi_callback_info info) {
  return details::WrapCallback([&] {
    CallbackInfo callbackInfo(env, info);
    InstanceAccessorCallbackData* callbackData =
      reinterpret_cast<InstanceAccessorCallbackData*>(callbackInfo.Data());
    callbackInfo.SetData(callbackData->data);
    T* instance = T::Unwrap(callbackInfo.This().As<Object>());
    auto cb = callbackData->getterCallback;
    return (instance->*cb)(callbackInfo);
  });
}

template <typename T>
inline napi_value InstanceWrap<T>::InstanceSetterCallbackWrapper(
    napi_env env,
    napi_callback_info info) {
  return details::WrapCallback([&] {
    CallbackInfo callbackInfo(env, info);
    InstanceAccessorCallbackData* callbackData =
      reinterpret_cast<InstanceAccessorCallbackData*>(callbackInfo.Data());
    callbackInfo.SetData(callbackData->data);
    T* instance = T::Unwrap(callbackInfo.This().As<Object>());
    auto cb = callbackData->setterCallback;
    (instance->*cb)(callbackInfo, callbackInfo[0]);
    return nullptr;
  });
}

template <typename T>
template <typename InstanceWrap<T>::InstanceSetterCallback method>
inline napi_value InstanceWrap<T>::WrappedMethod(
    napi_env env, napi_callback_info info) NAPI_NOEXCEPT {
  return details::WrapCallback([&] {
    const CallbackInfo cbInfo(env, info);
    T* instance = T::Unwrap(cbInfo.This().As<Object>());
    (instance->*method)(cbInfo, cbInfo[0]);
    return nullptr;
  });
}

////////////////////////////////////////////////////////////////////////////////
// ObjectWrap<T> class
////////////////////////////////////////////////////////////////////////////////

template <typename T>
inline ObjectWrap<T>::ObjectWrap(const Napi::CallbackInfo& callbackInfo) {
  napi_env env = callbackInfo.Env();
  napi_value wrapper = callbackInfo.This();
  napi_status status;
  napi_ref ref;
  T* instance = static_cast<T*>(this);
  status = napi_wrap(env, wrapper, instance, FinalizeCallback, nullptr, &ref);
  NAPI_THROW_IF_FAILED_VOID(env, status);

  Reference<Object>* instanceRef = instance;
  *instanceRef = Reference<Object>(env, ref);
}

template <typename T>
inline ObjectWrap<T>::~ObjectWrap() {
  // If the JS object still exists at this point, remove the finalizer added
  // through `napi_wrap()`.
  if (!IsEmpty()) {
    Object object = Value();
    // It is not valid to call `napi_remove_wrap()` with an empty `object`.
    // This happens e.g. during garbage collection.
    if (!object.IsEmpty() && _construction_failed) {
      napi_remove_wrap(Env(), object, nullptr);
    }
  }
}

template<typename T>
inline T* ObjectWrap<T>::Unwrap(Object wrapper) {
  void* unwrapped;
  napi_status status = napi_unwrap(wrapper.Env(), wrapper, &unwrapped);
  NAPI_THROW_IF_FAILED(wrapper.Env(), status, nullptr);
  return static_cast<T*>(unwrapped);
}

template <typename T>
inline Function
ObjectWrap<T>::DefineClass(Napi::Env env,
                           const char* utf8name,
                           const size_t props_count,
                           const napi_property_descriptor* descriptors,
                           void* data) {
  napi_status status;
  std::vector<napi_property_descriptor> props(props_count);

  // We copy the descriptors to a local array because before defining the class
  // we must replace static method property descriptors with value property
  // descriptors such that the value is a function-valued `napi_value` created
  // with `CreateFunction()`.
  //
  // This replacement could be made for instance methods as well, but V8 aborts
  // if we do that, because it expects methods defined on the prototype template
  // to have `FunctionTemplate`s.
  for (size_t index = 0; index < props_count; index++) {
    props[index] = descriptors[index];
    napi_property_descriptor* prop = &props[index];
    if (prop->method == T::StaticMethodCallbackWrapper) {
      status = CreateFunction(env,
                             utf8name,
                             prop->method,
                             static_cast<StaticMethodCallbackData*>(prop->data),
               &(prop->value));
      NAPI_THROW_IF_FAILED(env, status, Function());
      prop->method = nullptr;
      prop->data = nullptr;
    } else if (prop->method == T::StaticVoidMethodCallbackWrapper) {
      status = CreateFunction(env,
                         utf8name,
                         prop->method,
                         static_cast<StaticVoidMethodCallbackData*>(prop->data),
                         &(prop->value));
      NAPI_THROW_IF_FAILED(env, status, Function());
      prop->method = nullptr;
      prop->data = nullptr;
    }
  }

  napi_value value;
  status = napi_define_class(env,
                             utf8name,
                             NAPI_AUTO_LENGTH,
                             T::ConstructorCallbackWrapper,
                             data,
                             props_count,
                             props.data(),
                             &value);
  NAPI_THROW_IF_FAILED(env, status, Function());

  // After defining the class we iterate once more over the property descriptors
  // and attach the data associated with accessors and instance methods to the
  // newly created JavaScript class.
  for (size_t idx = 0; idx < props_count; idx++) {
    const napi_property_descriptor* prop = &props[idx];

    if (prop->getter == T::StaticGetterCallbackWrapper ||
        prop->setter == T::StaticSetterCallbackWrapper) {
      status = Napi::details::AttachData(env,
                          value,
                          static_cast<StaticAccessorCallbackData*>(prop->data));
      NAPI_THROW_IF_FAILED(env, status, Function());
    } else {
      // InstanceWrap<T>::AttachPropData is responsible for attaching the data
      // of instance methods and accessors.
      T::AttachPropData(env, value, prop);
    }
  }

  return Function(env, value);
}

template <typename T>
inline Function ObjectWrap<T>::DefineClass(
    Napi::Env env,
    const char* utf8name,
    const std::initializer_list<ClassPropertyDescriptor<T>>& properties,
    void* data) {
  return DefineClass(env,
          utf8name,
          properties.size(),
          reinterpret_cast<const napi_property_descriptor*>(properties.begin()),
          data);
}

template <typename T>
inline Function ObjectWrap<T>::DefineClass(
    Napi::Env env,
    const char* utf8name,
    const std::vector<ClassPropertyDescriptor<T>>& properties,
    void* data) {
  return DefineClass(env,
           utf8name,
           properties.size(),
           reinterpret_cast<const napi_property_descriptor*>(properties.data()),
           data);
}

template <typename T>
inline ClassPropertyDescriptor<T> ObjectWrap<T>::StaticMethod(
    const char* utf8name,
    StaticVoidMethodCallback method,
    napi_property_attributes attributes,
    void* data) {
  StaticVoidMethodCallbackData* callbackData = new StaticVoidMethodCallbackData({ method, data });

  napi_property_descriptor desc = napi_property_descriptor();
  desc.utf8name = utf8name;
  desc.method = T::StaticVoidMethodCallbackWrapper;
  desc.data = callbackData;
  desc.attributes = static_cast<napi_property_attributes>(attributes | napi_static);
  return desc;
}

template <typename T>
inline ClassPropertyDescriptor<T> ObjectWrap<T>::StaticMethod(
    const char* utf8name,
    StaticMethodCallback method,
    napi_property_attributes attributes,
    void* data) {
  StaticMethodCallbackData* callbackData = new StaticMethodCallbackData({ method, data });

  napi_property_descriptor desc = napi_property_descriptor();
  desc.utf8name = utf8name;
  desc.method = T::StaticMethodCallbackWrapper;
  desc.data = callbackData;
  desc.attributes = static_cast<napi_property_attributes>(attributes | napi_static);
  return desc;
}

template <typename T>
inline ClassPropertyDescriptor<T> ObjectWrap<T>::StaticMethod(
    Symbol name,
    StaticVoidMethodCallback method,
    napi_property_attributes attributes,
    void* data) {
  StaticVoidMethodCallbackData* callbackData = new StaticVoidMethodCallbackData({ method, data });

  napi_property_descriptor desc = napi_property_descriptor();
  desc.name = name;
  desc.method = T::StaticVoidMethodCallbackWrapper;
  desc.data = callbackData;
  desc.attributes = static_cast<napi_property_attributes>(attributes | napi_static);
  return desc;
}

template <typename T>
inline ClassPropertyDescriptor<T> ObjectWrap<T>::StaticMethod(
    Symbol name,
    StaticMethodCallback method,
    napi_property_attributes attributes,
    void* data) {
  StaticMethodCallbackData* callbackData = new StaticMethodCallbackData({ method, data });

  napi_property_descriptor desc = napi_property_descriptor();
  desc.name = name;
  desc.method = T::StaticMethodCallbackWrapper;
  desc.data = callbackData;
  desc.attributes = static_cast<napi_property_attributes>(attributes | napi_static);
  return desc;
}

template <typename T>
template <typename ObjectWrap<T>::StaticVoidMethodCallback method>
inline ClassPropertyDescriptor<T> ObjectWrap<T>::StaticMethod(
    const char* utf8name,
    napi_property_attributes attributes,
    void* data) {
  napi_property_descriptor desc = napi_property_descriptor();
  desc.utf8name = utf8name;
  desc.method = details::TemplatedVoidCallback<method>;
  desc.data = data;
  desc.attributes = static_cast<napi_property_attributes>(attributes | napi_static);
  return desc;
}

template <typename T>
template <typename ObjectWrap<T>::StaticVoidMethodCallback method>
inline ClassPropertyDescriptor<T> ObjectWrap<T>::StaticMethod(
    Symbol name,
    napi_property_attributes attributes,
    void* data) {
  napi_property_descriptor desc = napi_property_descriptor();
  desc.name = name;
  desc.method = details::TemplatedVoidCallback<method>;
  desc.data = data;
  desc.attributes = static_cast<napi_property_attributes>(attributes | napi_static);
  return desc;
}

template <typename T>
template <typename ObjectWrap<T>::StaticMethodCallback method>
inline ClassPropertyDescriptor<T> ObjectWrap<T>::StaticMethod(
    const char* utf8name,
    napi_property_attributes attributes,
    void* data) {
  napi_property_descriptor desc = napi_property_descriptor();
  desc.utf8name = utf8name;
  desc.method = details::TemplatedCallback<method>;
  desc.data = data;
  desc.attributes = static_cast<napi_property_attributes>(attributes | napi_static);
  return desc;
}

template <typename T>
template <typename ObjectWrap<T>::StaticMethodCallback method>
inline ClassPropertyDescriptor<T> ObjectWrap<T>::StaticMethod(
    Symbol name,
    napi_property_attributes attributes,
    void* data) {
  napi_property_descriptor desc = napi_property_descriptor();
  desc.name = name;
  desc.method = details::TemplatedCallback<method>;
  desc.data = data;
  desc.attributes = static_cast<napi_property_attributes>(attributes | napi_static);
  return desc;
}

template <typename T>
inline ClassPropertyDescriptor<T> ObjectWrap<T>::StaticAccessor(
    const char* utf8name,
    StaticGetterCallback getter,
    StaticSetterCallback setter,
    napi_property_attributes attributes,
    void* data) {
  StaticAccessorCallbackData* callbackData =
    new StaticAccessorCallbackData({ getter, setter, data });

  napi_property_descriptor desc = napi_property_descriptor();
  desc.utf8name = utf8name;
  desc.getter = getter != nullptr ? T::StaticGetterCallbackWrapper : nullptr;
  desc.setter = setter != nullptr ? T::StaticSetterCallbackWrapper : nullptr;
  desc.data = callbackData;
  desc.attributes = static_cast<napi_property_attributes>(attributes | napi_static);
  return desc;
}

template <typename T>
inline ClassPropertyDescriptor<T> ObjectWrap<T>::StaticAccessor(
    Symbol name,
    StaticGetterCallback getter,
    StaticSetterCallback setter,
    napi_property_attributes attributes,
    void* data) {
  StaticAccessorCallbackData* callbackData =
    new StaticAccessorCallbackData({ getter, setter, data });

  napi_property_descriptor desc = napi_property_descriptor();
  desc.name = name;
  desc.getter = getter != nullptr ? T::StaticGetterCallbackWrapper : nullptr;
  desc.setter = setter != nullptr ? T::StaticSetterCallbackWrapper : nullptr;
  desc.data = callbackData;
  desc.attributes = static_cast<napi_property_attributes>(attributes | napi_static);
  return desc;
}

template <typename T>
template <typename ObjectWrap<T>::StaticGetterCallback getter,
          typename ObjectWrap<T>::StaticSetterCallback setter>
inline ClassPropertyDescriptor<T> ObjectWrap<T>::StaticAccessor(
    const char* utf8name,
    napi_property_attributes attributes,
    void* data) {
  napi_property_descriptor desc = napi_property_descriptor();
  desc.utf8name = utf8name;
  desc.getter = details::TemplatedCallback<getter>;
  desc.setter = This::WrapStaticSetter(This::StaticSetterTag<setter>());
  desc.data = data;
  desc.attributes = static_cast<napi_property_attributes>(attributes | napi_static);
  return desc;
}

template <typename T>
template <typename ObjectWrap<T>::StaticGetterCallback getter,
          typename ObjectWrap<T>::StaticSetterCallback setter>
inline ClassPropertyDescriptor<T> ObjectWrap<T>::StaticAccessor(
    Symbol name,
    napi_property_attributes attributes,
    void* data) {
  napi_property_descriptor desc = napi_property_descriptor();
  desc.name = name;
  desc.getter = details::TemplatedCallback<getter>;
  desc.setter = This::WrapStaticSetter(This::StaticSetterTag<setter>());
  desc.data = data;
  desc.attributes = static_cast<napi_property_attributes>(attributes | napi_static);
  return desc;
}

template <typename T>
inline ClassPropertyDescriptor<T> ObjectWrap<T>::StaticValue(const char* utf8name,
    Napi::Value value, napi_property_attributes attributes) {
  napi_property_descriptor desc = napi_property_descriptor();
  desc.utf8name = utf8name;
  desc.value = value;
  desc.attributes = static_cast<napi_property_attributes>(attributes | napi_static);
  return desc;
}

template <typename T>
inline ClassPropertyDescriptor<T> ObjectWrap<T>::StaticValue(Symbol name,
    Napi::Value value, napi_property_attributes attributes) {
  napi_property_descriptor desc = napi_property_descriptor();
  desc.name = name;
  desc.value = value;
  desc.attributes = static_cast<napi_property_attributes>(attributes | napi_static);
  return desc;
}

template <typename T>
inline void ObjectWrap<T>::Finalize(Napi::Env /*env*/) {}

template <typename T>
inline napi_value ObjectWrap<T>::ConstructorCallbackWrapper(
    napi_env env,
    napi_callback_info info) {
  napi_value new_target;
  napi_status status = napi_get_new_target(env, info, &new_target);
  if (status != napi_ok) return nullptr;

  bool isConstructCall = (new_target != nullptr);
  if (!isConstructCall) {
    napi_throw_type_error(env, nullptr, "Class constructors cannot be invoked without 'new'");
    return nullptr;
  }

  napi_value wrapper = details::WrapCallback([&] {
    CallbackInfo callbackInfo(env, info);
    T* instance = new T(callbackInfo);
#ifdef NAPI_CPP_EXCEPTIONS
    instance->_construction_failed = false;
#else
    if (callbackInfo.Env().IsExceptionPending()) {
      // We need to clear the exception so that removing the wrap might work.
      Error e = callbackInfo.Env().GetAndClearPendingException();
      delete instance;
      e.ThrowAsJavaScriptException();
    } else {
      instance->_construction_failed = false;
    }
# endif  // NAPI_CPP_EXCEPTIONS
    return callbackInfo.This();
  });

  return wrapper;
}

template <typename T>
inline napi_value ObjectWrap<T>::StaticVoidMethodCallbackWrapper(
    napi_env env,
    napi_callback_info info) {
  return details::WrapCallback([&] {
    CallbackInfo callbackInfo(env, info);
    StaticVoidMethodCallbackData* callbackData =
      reinterpret_cast<StaticVoidMethodCallbackData*>(callbackInfo.Data());
    callbackInfo.SetData(callbackData->data);
    callbackData->callback(callbackInfo);
    return nullptr;
  });
}

template <typename T>
inline napi_value ObjectWrap<T>::StaticMethodCallbackWrapper(
    napi_env env,
    napi_callback_info info) {
  return details::WrapCallback([&] {
    CallbackInfo callbackInfo(env, info);
    StaticMethodCallbackData* callbackData =
      reinterpret_cast<StaticMethodCallbackData*>(callbackInfo.Data());
    callbackInfo.SetData(callbackData->data);
    return callbackData->callback(callbackInfo);
  });
}

template <typename T>
inline napi_value ObjectWrap<T>::StaticGetterCallbackWrapper(
    napi_env env,
    napi_callback_info info) {
  return details::WrapCallback([&] {
    CallbackInfo callbackInfo(env, info);
    StaticAccessorCallbackData* callbackData =
      reinterpret_cast<StaticAccessorCallbackData*>(callbackInfo.Data());
    callbackInfo.SetData(callbackData->data);
    return callbackData->getterCallback(callbackInfo);
  });
}

template <typename T>
inline napi_value ObjectWrap<T>::StaticSetterCallbackWrapper(
    napi_env env,
    napi_callback_info info) {
  return details::WrapCallback([&] {
    CallbackInfo callbackInfo(env, info);
    StaticAccessorCallbackData* callbackData =
      reinterpret_cast<StaticAccessorCallbackData*>(callbackInfo.Data());
    callbackInfo.SetData(callbackData->data);
    callbackData->setterCallback(callbackInfo, callbackInfo[0]);
    return nullptr;
  });
}

template <typename T>
inline void ObjectWrap<T>::FinalizeCallback(napi_env env, void* data, void* /*hint*/) {
  HandleScope scope(env);
  T* instance = static_cast<T*>(data);
  instance->Finalize(Napi::Env(env));
  delete instance;
}

template <typename T>
template <typename ObjectWrap<T>::StaticSetterCallback method>
inline napi_value ObjectWrap<T>::WrappedMethod(
    napi_env env, napi_callback_info info) NAPI_NOEXCEPT {
  return details::WrapCallback([&] {
    const CallbackInfo cbInfo(env, info);
    method(cbInfo, cbInfo[0]);
    return nullptr;
  });
}

////////////////////////////////////////////////////////////////////////////////
// HandleScope class
////////////////////////////////////////////////////////////////////////////////

inline HandleScope::HandleScope(napi_env env, napi_handle_scope scope)
    : _env(env), _scope(scope) {
}

inline HandleScope::HandleScope(Napi::Env env) : _env(env) {
  napi_status status = napi_open_handle_scope(_env, &_scope);
  NAPI_THROW_IF_FAILED_VOID(_env, status);
}

inline HandleScope::~HandleScope() {
  napi_status status = napi_close_handle_scope(_env, _scope);
  NAPI_FATAL_IF_FAILED(status,
                       "HandleScope::~HandleScope",
                       "napi_close_handle_scope");
}

inline HandleScope::operator napi_handle_scope() const {
  return _scope;
}

inline Napi::Env HandleScope::Env() const {
  return Napi::Env(_env);
}

////////////////////////////////////////////////////////////////////////////////
// EscapableHandleScope class
////////////////////////////////////////////////////////////////////////////////

inline EscapableHandleScope::EscapableHandleScope(
  napi_env env, napi_escapable_handle_scope scope) : _env(env), _scope(scope) {
}

inline EscapableHandleScope::EscapableHandleScope(Napi::Env env) : _env(env) {
  napi_status status = napi_open_escapable_handle_scope(_env, &_scope);
  NAPI_THROW_IF_FAILED_VOID(_env, status);
}

inline EscapableHandleScope::~EscapableHandleScope() {
  napi_status status = napi_close_escapable_handle_scope(_env, _scope);
  NAPI_FATAL_IF_FAILED(status,
                       "EscapableHandleScope::~EscapableHandleScope",
                       "napi_close_escapable_handle_scope");
}

inline EscapableHandleScope::operator napi_escapable_handle_scope() const {
  return _scope;
}

inline Napi::Env EscapableHandleScope::Env() const {
  return Napi::Env(_env);
}

inline Value EscapableHandleScope::Escape(napi_value escapee) {
  napi_value result;
  napi_status status = napi_escape_handle(_env, _scope, escapee, &result);
  NAPI_THROW_IF_FAILED(_env, status, Value());
  return Value(_env, result);
}


#if (NAPI_VERSION > 2)
////////////////////////////////////////////////////////////////////////////////
// CallbackScope class
////////////////////////////////////////////////////////////////////////////////

inline CallbackScope::CallbackScope(
  napi_env env, napi_callback_scope scope) : _env(env), _scope(scope) {
}

inline CallbackScope::CallbackScope(napi_env env, napi_async_context context)
    : _env(env) {
  napi_status status = napi_open_callback_scope(
      _env, Object::New(env), context, &_scope);
  NAPI_THROW_IF_FAILED_VOID(_env, status);
}

inline CallbackScope::~CallbackScope() {
  napi_status status = napi_close_callback_scope(_env, _scope);
  NAPI_FATAL_IF_FAILED(status,
                       "CallbackScope::~CallbackScope",
                       "napi_close_callback_scope");
}

inline CallbackScope::operator napi_callback_scope() const {
  return _scope;
}

inline Napi::Env CallbackScope::Env() const {
  return Napi::Env(_env);
}
#endif

////////////////////////////////////////////////////////////////////////////////
// AsyncContext class
////////////////////////////////////////////////////////////////////////////////

inline AsyncContext::AsyncContext(napi_env env, const char* resource_name)
  : AsyncContext(env, resource_name, Object::New(env)) {
}

inline AsyncContext::AsyncContext(napi_env env,
                                  const char* resource_name,
                                  const Object& resource)
    : _env(env), _context(nullptr) {
  napi_value resource_id;
  napi_status status = napi_create_string_utf8(
      _env, resource_name, NAPI_AUTO_LENGTH, &resource_id);
  NAPI_THROW_IF_FAILED_VOID(_env, status);

  status = napi_async_init(_env, resource, resource_id, &_context);
  NAPI_THROW_IF_FAILED_VOID(_env, status);
}

inline AsyncContext::~AsyncContext() {
  if (_context != nullptr) {
    napi_async_destroy(_env, _context);
    _context = nullptr;
  }
}

inline AsyncContext::AsyncContext(AsyncContext&& other) {
  _env = other._env;
  other._env = nullptr;
  _context = other._context;
  other._context = nullptr;
}

inline AsyncContext& AsyncContext::operator =(AsyncContext&& other) {
  _env = other._env;
  other._env = nullptr;
  _context = other._context;
  other._context = nullptr;
  return *this;
}

inline AsyncContext::operator napi_async_context() const {
  return _context;
}

inline Napi::Env AsyncContext::Env() const {
  return Napi::Env(_env);
}

////////////////////////////////////////////////////////////////////////////////
// AsyncWorker class
////////////////////////////////////////////////////////////////////////////////

inline AsyncWorker::AsyncWorker(const Function& callback)
  : AsyncWorker(callback, "generic") {
}

inline AsyncWorker::AsyncWorker(const Function& callback,
                                const char* resource_name)
  : AsyncWorker(callback, resource_name, Object::New(callback.Env())) {
}

inline AsyncWorker::AsyncWorker(const Function& callback,
                                const char* resource_name,
                                const Object& resource)
  : AsyncWorker(Object::New(callback.Env()),
                callback,
                resource_name,
                resource) {
}

inline AsyncWorker::AsyncWorker(const Object& receiver,
                                const Function& callback)
  : AsyncWorker(receiver, callback, "generic") {
}

inline AsyncWorker::AsyncWorker(const Object& receiver,
                                const Function& callback,
                                const char* resource_name)
  : AsyncWorker(receiver,
                callback,
                resource_name,
                Object::New(callback.Env())) {
}

inline AsyncWorker::AsyncWorker(const Object& receiver,
                                const Function& callback,
                                const char* resource_name,
                                const Object& resource)
  : _env(callback.Env()),
    _receiver(Napi::Persistent(receiver)),
    _callback(Napi::Persistent(callback)),
    _suppress_destruct(false) {
  napi_value resource_id;
  napi_status status = napi_create_string_latin1(
      _env, resource_name, NAPI_AUTO_LENGTH, &resource_id);
  NAPI_THROW_IF_FAILED_VOID(_env, status);

  status = napi_create_async_work(_env, resource, resource_id, OnAsyncWorkExecute,
                                  OnAsyncWorkComplete, this, &_work);
  NAPI_THROW_IF_FAILED_VOID(_env, status);
}

inline AsyncWorker::AsyncWorker(Napi::Env env)
  : AsyncWorker(env, "generic") {
}

inline AsyncWorker::AsyncWorker(Napi::Env env,
                                const char* resource_name)
  : AsyncWorker(env, resource_name, Object::New(env)) {
}

inline AsyncWorker::AsyncWorker(Napi::Env env,
                                const char* resource_name,
                                const Object& resource)
  : _env(env),
    _receiver(),
    _callback(),
    _suppress_destruct(false) {
  napi_value resource_id;
  napi_status status = napi_create_string_latin1(
      _env, resource_name, NAPI_AUTO_LENGTH, &resource_id);
  NAPI_THROW_IF_FAILED_VOID(_env, status);

  status = napi_create_async_work(_env, resource, resource_id, OnAsyncWorkExecute,
                                  OnAsyncWorkComplete, this, &_work);
  NAPI_THROW_IF_FAILED_VOID(_env, status);
}

inline AsyncWorker::~AsyncWorker() {
  if (_work != nullptr) {
    napi_delete_async_work(_env, _work);
    _work = nullptr;
  }
}

inline void AsyncWorker::Destroy() {
  delete this;
}

inline AsyncWorker::AsyncWorker(AsyncWorker&& other) {
  _env = other._env;
  other._env = nullptr;
  _work = other._work;
  other._work = nullptr;
  _receiver = std::move(other._receiver);
  _callback = std::move(other._callback);
  _error = std::move(other._error);
  _suppress_destruct = other._suppress_destruct;
}

inline AsyncWorker& AsyncWorker::operator =(AsyncWorker&& other) {
  _env = other._env;
  other._env = nullptr;
  _work = other._work;
  other._work = nullptr;
  _receiver = std::move(other._receiver);
  _callback = std::move(other._callback);
  _error = std::move(other._error);
  _suppress_destruct = other._suppress_destruct;
  return *this;
}

inline AsyncWorker::operator napi_async_work() const {
  return _work;
}

inline Napi::Env AsyncWorker::Env() const {
  return Napi::Env(_env);
}

inline void AsyncWorker::Queue() {
  napi_status status = napi_queue_async_work(_env, _work);
  NAPI_THROW_IF_FAILED_VOID(_env, status);
}

inline void AsyncWorker::Cancel() {
  napi_status status = napi_cancel_async_work(_env, _work);
  NAPI_THROW_IF_FAILED_VOID(_env, status);
}

inline ObjectReference& AsyncWorker::Receiver() {
  return _receiver;
}

inline FunctionReference& AsyncWorker::Callback() {
  return _callback;
}

inline void AsyncWorker::SuppressDestruct() {
  _suppress_destruct = true;
}

inline void AsyncWorker::OnOK() {
  if (!_callback.IsEmpty()) {
    _callback.Call(_receiver.Value(), GetResult(_callback.Env()));
  }
}

inline void AsyncWorker::OnError(const Error& e) {
  if (!_callback.IsEmpty()) {
    _callback.Call(_receiver.Value(), std::initializer_list<napi_value>{ e.Value() });
  }
}

inline void AsyncWorker::SetError(const std::string& error) {
  _error = error;
}

inline std::vector<napi_value> AsyncWorker::GetResult(Napi::Env /*env*/) {
  return {};
}
// The OnAsyncWorkExecute method receives an napi_env argument. However, do NOT
// use it within this method, as it does not run on the JavaScript thread and
// must not run any method that would cause JavaScript to run. In practice,
// this means that almost any use of napi_env will be incorrect.
inline void AsyncWorker::OnAsyncWorkExecute(napi_env env, void* asyncworker) {
  AsyncWorker* self = static_cast<AsyncWorker*>(asyncworker);
  self->OnExecute(env);
}
// The OnExecute method receives an napi_env argument. However, do NOT
// use it within this method, as it does not run on the JavaScript thread and
// must not run any method that would cause JavaScript to run. In practice,
// this means that almost any use of napi_env will be incorrect.
inline void AsyncWorker::OnExecute(Napi::Env /*DO_NOT_USE*/) {
#ifdef NAPI_CPP_EXCEPTIONS
  try {
    Execute();
  } catch (const std::exception& e) {
    SetError(e.what());
  }
#else // NAPI_CPP_EXCEPTIONS
  Execute();
#endif // NAPI_CPP_EXCEPTIONS
}

inline void AsyncWorker::OnAsyncWorkComplete(napi_env env,
                                             napi_status status,
                                             void* asyncworker) {
  AsyncWorker* self = static_cast<AsyncWorker*>(asyncworker);
  self->OnWorkComplete(env, status);
}
inline void AsyncWorker::OnWorkComplete(Napi::Env /*env*/, napi_status status) {
  if (status != napi_cancelled) {
    HandleScope scope(_env);
    details::WrapCallback([&] {
      if (_error.size() == 0) {
        OnOK();
      }
      else {
        OnError(Error::New(_env, _error));
      }
      return nullptr;
    });
  }
  if (!_suppress_destruct) {
    Destroy();
  }
}

#if (NAPI_VERSION > 3 && !defined(__wasm32__))
////////////////////////////////////////////////////////////////////////////////
// TypedThreadSafeFunction<ContextType,DataType,CallJs> class
////////////////////////////////////////////////////////////////////////////////

// Starting with NAPI 5, the JavaScript function `func` parameter of
// `napi_create_threadsafe_function` is optional.
#if NAPI_VERSION > 4
// static, with Callback [missing] Resource [missing] Finalizer [missing]
template <typename ContextType,
          typename DataType,
          void (*CallJs)(Napi::Env, Napi::Function, ContextType*, DataType*)>
template <typename ResourceString>
inline TypedThreadSafeFunction<ContextType, DataType, CallJs>
TypedThreadSafeFunction<ContextType, DataType, CallJs>::New(
    napi_env env,
    ResourceString resourceName,
    size_t maxQueueSize,
    size_t initialThreadCount,
    ContextType* context) {
  TypedThreadSafeFunction<ContextType, DataType, CallJs> tsfn;

  napi_status status =
      napi_create_threadsafe_function(env,
                                      nullptr,
                                      nullptr,
                                      String::From(env, resourceName),
                                      maxQueueSize,
                                      initialThreadCount,
                                      nullptr,
                                      nullptr,
                                      context,
                                      CallJsInternal,
                                      &tsfn._tsfn);
  if (status != napi_ok) {
    NAPI_THROW_IF_FAILED(
        env, status, TypedThreadSafeFunction<ContextType, DataType, CallJs>());
  }

  return tsfn;
}

// static, with Callback [missing] Resource [passed] Finalizer [missing]
template <typename ContextType,
          typename DataType,
          void (*CallJs)(Napi::Env, Napi::Function, ContextType*, DataType*)>
template <typename ResourceString>
inline TypedThreadSafeFunction<ContextType, DataType, CallJs>
TypedThreadSafeFunction<ContextType, DataType, CallJs>::New(
    napi_env env,
    const Object& resource,
    ResourceString resourceName,
    size_t maxQueueSize,
    size_t initialThreadCount,
    ContextType* context) {
  TypedThreadSafeFunction<ContextType, DataType, CallJs> tsfn;

  napi_status status =
      napi_create_threadsafe_function(env,
                                      nullptr,
                                      resource,
                                      String::From(env, resourceName),
                                      maxQueueSize,
                                      initialThreadCount,
                                      nullptr,
                                      nullptr,
                                      context,
                                      CallJsInternal,
                                      &tsfn._tsfn);
  if (status != napi_ok) {
    NAPI_THROW_IF_FAILED(
        env, status, TypedThreadSafeFunction<ContextType, DataType, CallJs>());
  }

  return tsfn;
}

// static, with Callback [missing] Resource [missing] Finalizer [passed]
template <typename ContextType,
          typename DataType,
          void (*CallJs)(Napi::Env, Napi::Function, ContextType*, DataType*)>
template <typename ResourceString,
          typename Finalizer,
          typename FinalizerDataType>
inline TypedThreadSafeFunction<ContextType, DataType, CallJs>
TypedThreadSafeFunction<ContextType, DataType, CallJs>::New(
    napi_env env,
    ResourceString resourceName,
    size_t maxQueueSize,
    size_t initialThreadCount,
    ContextType* context,
    Finalizer finalizeCallback,
    FinalizerDataType* data) {
  TypedThreadSafeFunction<ContextType, DataType, CallJs> tsfn;

  auto* finalizeData = new details::
      ThreadSafeFinalize<ContextType, Finalizer, FinalizerDataType>(
          {data, finalizeCallback});
  napi_status status = napi_create_threadsafe_function(
      env,
      nullptr,
      nullptr,
      String::From(env, resourceName),
      maxQueueSize,
      initialThreadCount,
      finalizeData,
      details::ThreadSafeFinalize<ContextType, Finalizer, FinalizerDataType>::
          FinalizeFinalizeWrapperWithDataAndContext,
      context,
      CallJsInternal,
      &tsfn._tsfn);
  if (status != napi_ok) {
    delete finalizeData;
    NAPI_THROW_IF_FAILED(
        env, status, TypedThreadSafeFunction<ContextType, DataType, CallJs>());
  }

  return tsfn;
}

// static, with Callback [missing] Resource [passed] Finalizer [passed]
template <typename ContextType,
          typename DataType,
          void (*CallJs)(Napi::Env, Napi::Function, ContextType*, DataType*)>
template <typename ResourceString,
          typename Finalizer,
          typename FinalizerDataType>
inline TypedThreadSafeFunction<ContextType, DataType, CallJs>
TypedThreadSafeFunction<ContextType, DataType, CallJs>::New(
    napi_env env,
    const Object& resource,
    ResourceString resourceName,
    size_t maxQueueSize,
    size_t initialThreadCount,
    ContextType* context,
    Finalizer finalizeCallback,
    FinalizerDataType* data) {
  TypedThreadSafeFunction<ContextType, DataType, CallJs> tsfn;

  auto* finalizeData = new details::
      ThreadSafeFinalize<ContextType, Finalizer, FinalizerDataType>(
          {data, finalizeCallback});
  napi_status status = napi_create_threadsafe_function(
      env,
      nullptr,
      resource,
      String::From(env, resourceName),
      maxQueueSize,
      initialThreadCount,
      finalizeData,
      details::ThreadSafeFinalize<ContextType, Finalizer, FinalizerDataType>::
          FinalizeFinalizeWrapperWithDataAndContext,
      context,
      CallJsInternal,
      &tsfn._tsfn);
  if (status != napi_ok) {
    delete finalizeData;
    NAPI_THROW_IF_FAILED(
        env, status, TypedThreadSafeFunction<ContextType, DataType, CallJs>());
  }

  return tsfn;
}
#endif

// static, with Callback [passed] Resource [missing] Finalizer [missing]
template <typename ContextType,
          typename DataType,
          void (*CallJs)(Napi::Env, Napi::Function, ContextType*, DataType*)>
template <typename ResourceString>
inline TypedThreadSafeFunction<ContextType, DataType, CallJs>
TypedThreadSafeFunction<ContextType, DataType, CallJs>::New(
    napi_env env,
    const Function& callback,
    ResourceString resourceName,
    size_t maxQueueSize,
    size_t initialThreadCount,
    ContextType* context) {
  TypedThreadSafeFunction<ContextType, DataType, CallJs> tsfn;

  napi_status status =
      napi_create_threadsafe_function(env,
                                      callback,
                                      nullptr,
                                      String::From(env, resourceName),
                                      maxQueueSize,
                                      initialThreadCount,
                                      nullptr,
                                      nullptr,
                                      context,
                                      CallJsInternal,
                                      &tsfn._tsfn);
  if (status != napi_ok) {
    NAPI_THROW_IF_FAILED(
        env, status, TypedThreadSafeFunction<ContextType, DataType, CallJs>());
  }

  return tsfn;
}

// static, with Callback [passed] Resource [passed] Finalizer [missing]
template <typename ContextType,
          typename DataType,
          void (*CallJs)(Napi::Env, Napi::Function, ContextType*, DataType*)>
template <typename ResourceString>
inline TypedThreadSafeFunction<ContextType, DataType, CallJs>
TypedThreadSafeFunction<ContextType, DataType, CallJs>::New(
    napi_env env,
    const Function& callback,
    const Object& resource,
    ResourceString resourceName,
    size_t maxQueueSize,
    size_t initialThreadCount,
    ContextType* context) {
  TypedThreadSafeFunction<ContextType, DataType, CallJs> tsfn;

  napi_status status =
      napi_create_threadsafe_function(env,
                                      callback,
                                      resource,
                                      String::From(env, resourceName),
                                      maxQueueSize,
                                      initialThreadCount,
                                      nullptr,
                                      nullptr,
                                      context,
                                      CallJsInternal,
                                      &tsfn._tsfn);
  if (status != napi_ok) {
    NAPI_THROW_IF_FAILED(
        env, status, TypedThreadSafeFunction<ContextType, DataType, CallJs>());
  }

  return tsfn;
}

// static, with Callback [passed] Resource [missing] Finalizer [passed]
template <typename ContextType,
          typename DataType,
          void (*CallJs)(Napi::Env, Napi::Function, ContextType*, DataType*)>
template <typename ResourceString,
          typename Finalizer,
          typename FinalizerDataType>
inline TypedThreadSafeFunction<ContextType, DataType, CallJs>
TypedThreadSafeFunction<ContextType, DataType, CallJs>::New(
    napi_env env,
    const Function& callback,
    ResourceString resourceName,
    size_t maxQueueSize,
    size_t initialThreadCount,
    ContextType* context,
    Finalizer finalizeCallback,
    FinalizerDataType* data) {
  TypedThreadSafeFunction<ContextType, DataType, CallJs> tsfn;

  auto* finalizeData = new details::
      ThreadSafeFinalize<ContextType, Finalizer, FinalizerDataType>(
          {data, finalizeCallback});
  napi_status status = napi_create_threadsafe_function(
      env,
      callback,
      nullptr,
      String::From(env, resourceName),
      maxQueueSize,
      initialThreadCount,
      finalizeData,
      details::ThreadSafeFinalize<ContextType, Finalizer, FinalizerDataType>::
          FinalizeFinalizeWrapperWithDataAndContext,
      context,
      CallJsInternal,
      &tsfn._tsfn);
  if (status != napi_ok) {
    delete finalizeData;
    NAPI_THROW_IF_FAILED(
        env, status, TypedThreadSafeFunction<ContextType, DataType, CallJs>());
  }

  return tsfn;
}

// static, with: Callback [passed] Resource [passed] Finalizer [passed]
template <typename ContextType,
          typename DataType,
          void (*CallJs)(Napi::Env, Napi::Function, ContextType*, DataType*)>
template <typename CallbackType,
          typename ResourceString,
          typename Finalizer,
          typename FinalizerDataType>
inline TypedThreadSafeFunction<ContextType, DataType, CallJs>
TypedThreadSafeFunction<ContextType, DataType, CallJs>::New(
    napi_env env,
    CallbackType callback,
    const Object& resource,
    ResourceString resourceName,
    size_t maxQueueSize,
    size_t initialThreadCount,
    ContextType* context,
    Finalizer finalizeCallback,
    FinalizerDataType* data) {
  TypedThreadSafeFunction<ContextType, DataType, CallJs> tsfn;

  auto* finalizeData = new details::
      ThreadSafeFinalize<ContextType, Finalizer, FinalizerDataType>(
          {data, finalizeCallback});
  napi_status status = napi_create_threadsafe_function(
      env,
      details::DefaultCallbackWrapper<
          CallbackType,
          TypedThreadSafeFunction<ContextType, DataType, CallJs>>(env,
                                                                  callback),
      resource,
      String::From(env, resourceName),
      maxQueueSize,
      initialThreadCount,
      finalizeData,
      details::ThreadSafeFinalize<ContextType, Finalizer, FinalizerDataType>::
          FinalizeFinalizeWrapperWithDataAndContext,
      context,
      CallJsInternal,
      &tsfn._tsfn);
  if (status != napi_ok) {
    delete finalizeData;
    NAPI_THROW_IF_FAILED(
        env, status, TypedThreadSafeFunction<ContextType, DataType, CallJs>());
  }

  return tsfn;
}

template <typename ContextType,
          typename DataType,
          void (*CallJs)(Napi::Env, Napi::Function, ContextType*, DataType*)>
inline TypedThreadSafeFunction<ContextType, DataType, CallJs>::
    TypedThreadSafeFunction()
    : _tsfn() {}

template <typename ContextType,
          typename DataType,
          void (*CallJs)(Napi::Env, Napi::Function, ContextType*, DataType*)>
inline TypedThreadSafeFunction<ContextType, DataType, CallJs>::
    TypedThreadSafeFunction(napi_threadsafe_function tsfn)
    : _tsfn(tsfn) {}

template <typename ContextType,
          typename DataType,
          void (*CallJs)(Napi::Env, Napi::Function, ContextType*, DataType*)>
inline TypedThreadSafeFunction<ContextType, DataType, CallJs>::
operator napi_threadsafe_function() const {
  return _tsfn;
}

template <typename ContextType,
          typename DataType,
          void (*CallJs)(Napi::Env, Napi::Function, ContextType*, DataType*)>
inline napi_status
TypedThreadSafeFunction<ContextType, DataType, CallJs>::BlockingCall(
    DataType* data) const {
  return napi_call_threadsafe_function(_tsfn, data, napi_tsfn_blocking);
}

template <typename ContextType,
          typename DataType,
          void (*CallJs)(Napi::Env, Napi::Function, ContextType*, DataType*)>
inline napi_status
TypedThreadSafeFunction<ContextType, DataType, CallJs>::NonBlockingCall(
    DataType* data) const {
  return napi_call_threadsafe_function(_tsfn, data, napi_tsfn_nonblocking);
}

template <typename ContextType,
          typename DataType,
          void (*CallJs)(Napi::Env, Napi::Function, ContextType*, DataType*)>
inline void TypedThreadSafeFunction<ContextType, DataType, CallJs>::Ref(
    napi_env env) const {
  if (_tsfn != nullptr) {
    napi_status status = napi_ref_threadsafe_function(env, _tsfn);
    NAPI_THROW_IF_FAILED_VOID(env, status);
  }
}

template <typename ContextType,
          typename DataType,
          void (*CallJs)(Napi::Env, Napi::Function, ContextType*, DataType*)>
inline void TypedThreadSafeFunction<ContextType, DataType, CallJs>::Unref(
    napi_env env) const {
  if (_tsfn != nullptr) {
    napi_status status = napi_unref_threadsafe_function(env, _tsfn);
    NAPI_THROW_IF_FAILED_VOID(env, status);
  }
}

template <typename ContextType,
          typename DataType,
          void (*CallJs)(Napi::Env, Napi::Function, ContextType*, DataType*)>
inline napi_status
TypedThreadSafeFunction<ContextType, DataType, CallJs>::Acquire() const {
  return napi_acquire_threadsafe_function(_tsfn);
}

template <typename ContextType,
          typename DataType,
          void (*CallJs)(Napi::Env, Napi::Function, ContextType*, DataType*)>
inline napi_status
TypedThreadSafeFunction<ContextType, DataType, CallJs>::Release() {
  return napi_release_threadsafe_function(_tsfn, napi_tsfn_release);
}

template <typename ContextType,
          typename DataType,
          void (*CallJs)(Napi::Env, Napi::Function, ContextType*, DataType*)>
inline napi_status
TypedThreadSafeFunction<ContextType, DataType, CallJs>::Abort() {
  return napi_release_threadsafe_function(_tsfn, napi_tsfn_abort);
}

template <typename ContextType,
          typename DataType,
          void (*CallJs)(Napi::Env, Napi::Function, ContextType*, DataType*)>
inline ContextType*
TypedThreadSafeFunction<ContextType, DataType, CallJs>::GetContext() const {
  void* context;
  napi_status status = napi_get_threadsafe_function_context(_tsfn, &context);
  NAPI_FATAL_IF_FAILED(status,
                       "TypedThreadSafeFunction::GetContext",
                       "napi_get_threadsafe_function_context");
  return static_cast<ContextType*>(context);
}

// static
template <typename ContextType,
          typename DataType,
          void (*CallJs)(Napi::Env, Napi::Function, ContextType*, DataType*)>
void TypedThreadSafeFunction<ContextType, DataType, CallJs>::CallJsInternal(
    napi_env env, napi_value jsCallback, void* context, void* data) {
  details::CallJsWrapper<ContextType, DataType, decltype(CallJs), CallJs>(
      env, jsCallback, context, data);
}

#if NAPI_VERSION == 4
// static
template <typename ContextType,
          typename DataType,
          void (*CallJs)(Napi::Env, Napi::Function, ContextType*, DataType*)>
Napi::Function
TypedThreadSafeFunction<ContextType, DataType, CallJs>::EmptyFunctionFactory(
    Napi::Env env) {
  return Napi::Function::New(env, [](const CallbackInfo& cb) {});
}

// static
template <typename ContextType,
          typename DataType,
          void (*CallJs)(Napi::Env, Napi::Function, ContextType*, DataType*)>
Napi::Function
TypedThreadSafeFunction<ContextType, DataType, CallJs>::FunctionOrEmpty(
    Napi::Env env, Napi::Function& callback) {
  if (callback.IsEmpty()) {
    return EmptyFunctionFactory(env);
  }
  return callback;
}

#else
// static
template <typename ContextType,
          typename DataType,
          void (*CallJs)(Napi::Env, Napi::Function, ContextType*, DataType*)>
std::nullptr_t
TypedThreadSafeFunction<ContextType, DataType, CallJs>::EmptyFunctionFactory(
    Napi::Env /*env*/) {
  return nullptr;
}

// static
template <typename ContextType,
          typename DataType,
          void (*CallJs)(Napi::Env, Napi::Function, ContextType*, DataType*)>
Napi::Function
TypedThreadSafeFunction<ContextType, DataType, CallJs>::FunctionOrEmpty(
    Napi::Env /*env*/, Napi::Function& callback) {
  return callback;
}

#endif

////////////////////////////////////////////////////////////////////////////////
// ThreadSafeFunction class
////////////////////////////////////////////////////////////////////////////////

// static
template <typename ResourceString>
inline ThreadSafeFunction ThreadSafeFunction::New(napi_env env,
                                  const Function& callback,
                                  ResourceString resourceName,
                                  size_t maxQueueSize,
                                  size_t initialThreadCount) {
  return New(env, callback, Object(), resourceName, maxQueueSize,
             initialThreadCount);
}

// static
template <typename ResourceString, typename ContextType>
inline ThreadSafeFunction ThreadSafeFunction::New(napi_env env,
                                  const Function& callback,
                                  ResourceString resourceName,
                                  size_t maxQueueSize,
                                  size_t initialThreadCount,
                                  ContextType* context) {
  return New(env, callback, Object(), resourceName, maxQueueSize,
             initialThreadCount, context);
}

// static
template <typename ResourceString, typename Finalizer>
inline ThreadSafeFunction ThreadSafeFunction::New(napi_env env,
                                  const Function& callback,
                                  ResourceString resourceName,
                                  size_t maxQueueSize,
                                  size_t initialThreadCount,
                                  Finalizer finalizeCallback) {
  return New(env, callback, Object(), resourceName, maxQueueSize,
             initialThreadCount, finalizeCallback);
}

// static
template <typename ResourceString, typename Finalizer,
          typename FinalizerDataType>
inline ThreadSafeFunction ThreadSafeFunction::New(napi_env env,
                                  const Function& callback,
                                  ResourceString resourceName,
                                  size_t maxQueueSize,
                                  size_t initialThreadCount,
                                  Finalizer finalizeCallback,
                                  FinalizerDataType* data) {
  return New(env, callback, Object(), resourceName, maxQueueSize,
             initialThreadCount, finalizeCallback, data);
}

// static
template <typename ResourceString, typename ContextType, typename Finalizer>
inline ThreadSafeFunction ThreadSafeFunction::New(napi_env env,
                                  const Function& callback,
                                  ResourceString resourceName,
                                  size_t maxQueueSize,
                                  size_t initialThreadCount,
                                  ContextType* context,
                                  Finalizer finalizeCallback) {
  return New(env, callback, Object(), resourceName, maxQueueSize,
             initialThreadCount, context, finalizeCallback);
}

// static
template <typename ResourceString, typename ContextType,
          typename Finalizer, typename FinalizerDataType>
inline ThreadSafeFunction ThreadSafeFunction::New(napi_env env,
                                                  const Function& callback,
                                                  ResourceString resourceName,
                                                  size_t maxQueueSize,
                                                  size_t initialThreadCount,
                                                  ContextType* context,
                                                  Finalizer finalizeCallback,
                                                  FinalizerDataType* data) {
  return New(env, callback, Object(), resourceName, maxQueueSize,
             initialThreadCount, context, finalizeCallback, data);
}

// static
template <typename ResourceString>
inline ThreadSafeFunction ThreadSafeFunction::New(napi_env env,
                                  const Function& callback,
                                  const Object& resource,
                                  ResourceString resourceName,
                                  size_t maxQueueSize,
                                  size_t initialThreadCount) {
  return New(env, callback, resource, resourceName, maxQueueSize,
             initialThreadCount, static_cast<void*>(nullptr) /* context */);
}

// static
template <typename ResourceString, typename ContextType>
inline ThreadSafeFunction ThreadSafeFunction::New(napi_env env,
                                  const Function& callback,
                                  const Object& resource,
                                  ResourceString resourceName,
                                  size_t maxQueueSize,
                                  size_t initialThreadCount,
                                  ContextType* context) {
  return New(env, callback, resource, resourceName, maxQueueSize,
             initialThreadCount, context,
             [](Env, ContextType*) {} /* empty finalizer */);
}

// static
template <typename ResourceString, typename Finalizer>
inline ThreadSafeFunction ThreadSafeFunction::New(napi_env env,
                                  const Function& callback,
                                  const Object& resource,
                                  ResourceString resourceName,
                                  size_t maxQueueSize,
                                  size_t initialThreadCount,
                                  Finalizer finalizeCallback) {
  return New(env, callback, resource, resourceName, maxQueueSize,
             initialThreadCount, static_cast<void*>(nullptr) /* context */,
             finalizeCallback, static_cast<void*>(nullptr) /* data */,
             details::ThreadSafeFinalize<void, Finalizer>::Wrapper);
}

// static
template <typename ResourceString, typename Finalizer,
          typename FinalizerDataType>
inline ThreadSafeFunction ThreadSafeFunction::New(napi_env env,
                                  const Function& callback,
                                  const Object& resource,
                                  ResourceString resourceName,
                                  size_t maxQueueSize,
                                  size_t initialThreadCount,
                                  Finalizer finalizeCallback,
                                  FinalizerDataType* data) {
  return New(env, callback, resource, resourceName, maxQueueSize,
             initialThreadCount, static_cast<void*>(nullptr) /* context */,
             finalizeCallback, data,
             details::ThreadSafeFinalize<
                 void, Finalizer, FinalizerDataType>::FinalizeWrapperWithData);
}

// static
template <typename ResourceString, typename ContextType, typename Finalizer>
inline ThreadSafeFunction ThreadSafeFunction::New(napi_env env,
                                  const Function& callback,
                                  const Object& resource,
                                  ResourceString resourceName,
                                  size_t maxQueueSize,
                                  size_t initialThreadCount,
                                  ContextType* context,
                                  Finalizer finalizeCallback) {
  return New(env, callback, resource, resourceName, maxQueueSize,
             initialThreadCount, context, finalizeCallback,
             static_cast<void*>(nullptr) /* data */,
             details::ThreadSafeFinalize<
                 ContextType, Finalizer>::FinalizeWrapperWithContext);
}

// static
template <typename ResourceString, typename ContextType,
          typename Finalizer, typename FinalizerDataType>
inline ThreadSafeFunction ThreadSafeFunction::New(napi_env env,
                                                  const Function& callback,
                                                  const Object& resource,
                                                  ResourceString resourceName,
                                                  size_t maxQueueSize,
                                                  size_t initialThreadCount,
                                                  ContextType* context,
                                                  Finalizer finalizeCallback,
                                                  FinalizerDataType* data) {
  return New(env, callback, resource, resourceName, maxQueueSize,
             initialThreadCount, context, finalizeCallback, data,
             details::ThreadSafeFinalize<ContextType, Finalizer,
                 FinalizerDataType>::FinalizeFinalizeWrapperWithDataAndContext);
}

inline ThreadSafeFunction::ThreadSafeFunction()
  : _tsfn() {
}

inline ThreadSafeFunction::ThreadSafeFunction(
    napi_threadsafe_function tsfn)
  : _tsfn(tsfn) {
}

inline ThreadSafeFunction::operator napi_threadsafe_function() const {
  return _tsfn;
}

inline napi_status ThreadSafeFunction::BlockingCall() const {
  return CallInternal(nullptr, napi_tsfn_blocking);
}

template <>
inline napi_status ThreadSafeFunction::BlockingCall(
    void* data) const {
  return napi_call_threadsafe_function(_tsfn, data, napi_tsfn_blocking);
}

template <typename Callback>
inline napi_status ThreadSafeFunction::BlockingCall(
    Callback callback) const {
  return CallInternal(new CallbackWrapper(callback), napi_tsfn_blocking);
}

template <typename DataType, typename Callback>
inline napi_status ThreadSafeFunction::BlockingCall(
    DataType* data, Callback callback) const {
  auto wrapper = [data, callback](Env env, Function jsCallback) {
    callback(env, jsCallback, data);
  };
  return CallInternal(new CallbackWrapper(wrapper), napi_tsfn_blocking);
}

inline napi_status ThreadSafeFunction::NonBlockingCall() const {
  return CallInternal(nullptr, napi_tsfn_nonblocking);
}

template <>
inline napi_status ThreadSafeFunction::NonBlockingCall(
    void* data) const {
  return napi_call_threadsafe_function(_tsfn, data, napi_tsfn_nonblocking);
}

template <typename Callback>
inline napi_status ThreadSafeFunction::NonBlockingCall(
    Callback callback) const {
  return CallInternal(new CallbackWrapper(callback), napi_tsfn_nonblocking);
}

template <typename DataType, typename Callback>
inline napi_status ThreadSafeFunction::NonBlockingCall(
    DataType* data, Callback callback) const {
  auto wrapper = [data, callback](Env env, Function jsCallback) {
    callback(env, jsCallback, data);
  };
  return CallInternal(new CallbackWrapper(wrapper), napi_tsfn_nonblocking);
}

inline void ThreadSafeFunction::Ref(napi_env env) const {
  if (_tsfn != nullptr) {
    napi_status status = napi_ref_threadsafe_function(env, _tsfn);
    NAPI_THROW_IF_FAILED_VOID(env, status);
  }
}

inline void ThreadSafeFunction::Unref(napi_env env) const {
  if (_tsfn != nullptr) {
    napi_status status = napi_unref_threadsafe_function(env, _tsfn);
    NAPI_THROW_IF_FAILED_VOID(env, status);
  }
}

inline napi_status ThreadSafeFunction::Acquire() const {
  return napi_acquire_threadsafe_function(_tsfn);
}

inline napi_status ThreadSafeFunction::Release() {
  return napi_release_threadsafe_function(_tsfn, napi_tsfn_release);
}

inline napi_status ThreadSafeFunction::Abort() {
  return napi_release_threadsafe_function(_tsfn, napi_tsfn_abort);
}

inline ThreadSafeFunction::ConvertibleContext
ThreadSafeFunction::GetContext() const {
  void* context;
  napi_status status = napi_get_threadsafe_function_context(_tsfn, &context);
  NAPI_FATAL_IF_FAILED(status, "ThreadSafeFunction::GetContext", "napi_get_threadsafe_function_context");
  return ConvertibleContext({ context });
}

// static
template <typename ResourceString, typename ContextType,
          typename Finalizer, typename FinalizerDataType>
inline ThreadSafeFunction ThreadSafeFunction::New(napi_env env,
                                                  const Function& callback,
                                                  const Object& resource,
                                                  ResourceString resourceName,
                                                  size_t maxQueueSize,
                                                  size_t initialThreadCount,
                                                  ContextType* context,
                                                  Finalizer finalizeCallback,
                                                  FinalizerDataType* data,
                                                  napi_finalize wrapper) {
  static_assert(details::can_make_string<ResourceString>::value
      || std::is_convertible<ResourceString, napi_value>::value,
      "Resource name should be convertible to the string type");

  ThreadSafeFunction tsfn;
  auto* finalizeData = new details::ThreadSafeFinalize<ContextType, Finalizer,
      FinalizerDataType>({ data, finalizeCallback });
  napi_status status = napi_create_threadsafe_function(env, callback, resource,
      Value::From(env, resourceName), maxQueueSize, initialThreadCount,
      finalizeData, wrapper, context, CallJS, &tsfn._tsfn);
  if (status != napi_ok) {
    delete finalizeData;
    NAPI_THROW_IF_FAILED(env, status, ThreadSafeFunction());
  }

  return tsfn;
}

inline napi_status ThreadSafeFunction::CallInternal(
    CallbackWrapper* callbackWrapper,
    napi_threadsafe_function_call_mode mode) const {
  napi_status status = napi_call_threadsafe_function(
      _tsfn, callbackWrapper, mode);
  if (status != napi_ok && callbackWrapper != nullptr) {
    delete callbackWrapper;
  }

  return status;
}

// static
inline void ThreadSafeFunction::CallJS(napi_env env,
                                       napi_value jsCallback,
                                       void* /* context */,
                                       void* data) {
  if (env == nullptr && jsCallback == nullptr) {
    return;
  }

  if (data != nullptr) {
    auto* callbackWrapper = static_cast<CallbackWrapper*>(data);
    (*callbackWrapper)(env, Function(env, jsCallback));
    delete callbackWrapper;
  } else if (jsCallback != nullptr) {
    Function(env, jsCallback).Call({});
  }
}

////////////////////////////////////////////////////////////////////////////////
// Async Progress Worker Base class
////////////////////////////////////////////////////////////////////////////////
template <typename DataType>
inline AsyncProgressWorkerBase<DataType>::AsyncProgressWorkerBase(const Object& receiver,
                                                                  const Function& callback,
                                                                  const char* resource_name,
                                                                  const Object& resource,
                                                                  size_t queue_size)
  : AsyncWorker(receiver, callback, resource_name, resource) {
  // Fill all possible arguments to work around ambiguous ThreadSafeFunction::New signatures.
  _tsfn = ThreadSafeFunction::New(callback.Env(),
                                  callback,
                                  resource,
                                  resource_name,
                                  queue_size,
                                  /** initialThreadCount */ 1,
                                  /** context */ this,
                                  OnThreadSafeFunctionFinalize,
                                  /** finalizeData */ this);
}

#if NAPI_VERSION > 4
template <typename DataType>
inline AsyncProgressWorkerBase<DataType>::AsyncProgressWorkerBase(Napi::Env env,
                                                                  const char* resource_name,
                                                                  const Object& resource,
                                                                  size_t queue_size)
  : AsyncWorker(env, resource_name, resource) {
  // TODO: Once the changes to make the callback optional for threadsafe
  // functions are available on all versions we can remove the dummy Function here.
  Function callback;
  // Fill all possible arguments to work around ambiguous ThreadSafeFunction::New signatures.
  _tsfn = ThreadSafeFunction::New(env,
                                  callback,
                                  resource,
                                  resource_name,
                                  queue_size,
                                  /** initialThreadCount */ 1,
                                  /** context */ this,
                                  OnThreadSafeFunctionFinalize,
                                  /** finalizeData */ this);
}
#endif

template<typename DataType>
inline AsyncProgressWorkerBase<DataType>::~AsyncProgressWorkerBase() {
  // Abort pending tsfn call.
  // Don't send progress events after we've already completed.
  // It's ok to call ThreadSafeFunction::Abort and ThreadSafeFunction::Release duplicated.
  _tsfn.Abort();
}

template <typename DataType>
inline void AsyncProgressWorkerBase<DataType>::OnAsyncWorkProgress(Napi::Env /* env */,
                                Napi::Function /* jsCallback */,
                                void* data) {
  ThreadSafeData* tsd = static_cast<ThreadSafeData*>(data);
  tsd->asyncprogressworker()->OnWorkProgress(tsd->data());
  delete tsd;
}

template <typename DataType>
inline napi_status AsyncProgressWorkerBase<DataType>::NonBlockingCall(DataType* data) {
  auto tsd = new AsyncProgressWorkerBase::ThreadSafeData(this, data);
  return _tsfn.NonBlockingCall(tsd, OnAsyncWorkProgress);
}

template <typename DataType>
inline void AsyncProgressWorkerBase<DataType>::OnWorkComplete(Napi::Env /* env */, napi_status status) {
  _work_completed = true;
  _complete_status = status;
  _tsfn.Release();
}

template <typename DataType>
inline void AsyncProgressWorkerBase<DataType>::OnThreadSafeFunctionFinalize(Napi::Env env, void* /* data */, AsyncProgressWorkerBase* context) {
  if (context->_work_completed) {
    context->AsyncWorker::OnWorkComplete(env, context->_complete_status);
  }
}

////////////////////////////////////////////////////////////////////////////////
// Async Progress Worker class
////////////////////////////////////////////////////////////////////////////////
template<class T>
inline AsyncProgressWorker<T>::AsyncProgressWorker(const Function& callback)
  : AsyncProgressWorker(callback, "generic") {
}

template<class T>
inline AsyncProgressWorker<T>::AsyncProgressWorker(const Function& callback,
                                const char* resource_name)
  : AsyncProgressWorker(callback, resource_name, Object::New(callback.Env())) {
}

template<class T>
inline AsyncProgressWorker<T>::AsyncProgressWorker(const Function& callback,
                                const char* resource_name,
                                const Object& resource)
  : AsyncProgressWorker(Object::New(callback.Env()),
                callback,
                resource_name,
                resource) {
}

template<class T>
inline AsyncProgressWorker<T>::AsyncProgressWorker(const Object& receiver,
                                                   const Function& callback)
  : AsyncProgressWorker(receiver, callback, "generic") {
}

template<class T>
inline AsyncProgressWorker<T>::AsyncProgressWorker(const Object& receiver,
                                                   const Function& callback,
                                                   const char* resource_name)
  : AsyncProgressWorker(receiver,
                callback,
                resource_name,
                Object::New(callback.Env())) {
}

template<class T>
inline AsyncProgressWorker<T>::AsyncProgressWorker(const Object& receiver,
                                                   const Function& callback,
                                                   const char* resource_name,
                                                   const Object& resource)
  : AsyncProgressWorkerBase(receiver, callback, resource_name, resource),
    _asyncdata(nullptr),
    _asyncsize(0) {
}

#if NAPI_VERSION > 4
template<class T>
inline AsyncProgressWorker<T>::AsyncProgressWorker(Napi::Env env)
  : AsyncProgressWorker(env, "generic") {
}

template<class T>
inline AsyncProgressWorker<T>::AsyncProgressWorker(Napi::Env env,
                                                   const char* resource_name)
  : AsyncProgressWorker(env, resource_name, Object::New(env)) {
}

template<class T>
inline AsyncProgressWorker<T>::AsyncProgressWorker(Napi::Env env,
                                                   const char* resource_name,
                                                   const Object& resource)
  : AsyncProgressWorkerBase(env, resource_name, resource),
    _asyncdata(nullptr),
    _asyncsize(0) {
}
#endif

template<class T>
inline AsyncProgressWorker<T>::~AsyncProgressWorker() {
  {
    std::lock_guard<std::mutex> lock(this->_mutex);
    _asyncdata = nullptr;
    _asyncsize = 0;
  }
}

template<class T>
inline void AsyncProgressWorker<T>::Execute() {
  ExecutionProgress progress(this);
  Execute(progress);
}

template<class T>
inline void AsyncProgressWorker<T>::OnWorkProgress(void*) {
  T* data;
  size_t size;
  {
    std::lock_guard<std::mutex> lock(this->_mutex);
    data = this->_asyncdata;
    size = this->_asyncsize;
    this->_asyncdata = nullptr;
    this->_asyncsize = 0;
  }

  /**
   * The callback of ThreadSafeFunction is not been invoked immediately on the
   * callback of uv_async_t (uv io poll), rather the callback of TSFN is
   * invoked on the right next uv idle callback. There are chances that during
   * the deferring the signal of uv_async_t is been sent again, i.e. potential
   * not coalesced two calls of the TSFN callback.
   */
  if (data == nullptr) {
    return;
  }

  this->OnProgress(data, size);
  delete[] data;
}

template<class T>
inline void AsyncProgressWorker<T>::SendProgress_(const T* data, size_t count) {
    T* new_data = new T[count];
    std::copy(data, data + count, new_data);

    T* old_data;
    {
      std::lock_guard<std::mutex> lock(this->_mutex);
      old_data = _asyncdata;
      _asyncdata = new_data;
      _asyncsize = count;
    }
    this->NonBlockingCall(nullptr);

    delete[] old_data;
}

template<class T>
inline void AsyncProgressWorker<T>::Signal() const {
  this->NonBlockingCall(static_cast<T*>(nullptr));
}

template<class T>
inline void AsyncProgressWorker<T>::ExecutionProgress::Signal() const {
  _worker->Signal();
}

template<class T>
inline void AsyncProgressWorker<T>::ExecutionProgress::Send(const T* data, size_t count) const {
  _worker->SendProgress_(data, count);
}

////////////////////////////////////////////////////////////////////////////////
// Async Progress Queue Worker class
////////////////////////////////////////////////////////////////////////////////
template<class T>
inline AsyncProgressQueueWorker<T>::AsyncProgressQueueWorker(const Function& callback)
  : AsyncProgressQueueWorker(callback, "generic") {
}

template<class T>
inline AsyncProgressQueueWorker<T>::AsyncProgressQueueWorker(const Function& callback,
                                                             const char* resource_name)
  : AsyncProgressQueueWorker(callback, resource_name, Object::New(callback.Env())) {
}

template<class T>
inline AsyncProgressQueueWorker<T>::AsyncProgressQueueWorker(const Function& callback,
                                                             const char* resource_name,
                                                             const Object& resource)
  : AsyncProgressQueueWorker(Object::New(callback.Env()),
                             callback,
                             resource_name,
                             resource) {
}

template<class T>
inline AsyncProgressQueueWorker<T>::AsyncProgressQueueWorker(const Object& receiver,
                                                             const Function& callback)
  : AsyncProgressQueueWorker(receiver, callback, "generic") {
}

template<class T>
inline AsyncProgressQueueWorker<T>::AsyncProgressQueueWorker(const Object& receiver,
                                                             const Function& callback,
                                                             const char* resource_name)
  : AsyncProgressQueueWorker(receiver,
                             callback,
                             resource_name,
                             Object::New(callback.Env())) {
}

template<class T>
inline AsyncProgressQueueWorker<T>::AsyncProgressQueueWorker(const Object& receiver,
                                                             const Function& callback,
                                                             const char* resource_name,
                                                             const Object& resource)
  : AsyncProgressWorkerBase<std::pair<T*, size_t>>(receiver, callback, resource_name, resource, /** unlimited queue size */0) {
}

#if NAPI_VERSION > 4
template<class T>
inline AsyncProgressQueueWorker<T>::AsyncProgressQueueWorker(Napi::Env env)
  : AsyncProgressQueueWorker(env, "generic") {
}

template<class T>
inline AsyncProgressQueueWorker<T>::AsyncProgressQueueWorker(Napi::Env env,
                                const char* resource_name)
  : AsyncProgressQueueWorker(env, resource_name, Object::New(env)) {
}

template<class T>
inline AsyncProgressQueueWorker<T>::AsyncProgressQueueWorker(Napi::Env env,
                                                             const char* resource_name,
                                                             const Object& resource)
  : AsyncProgressWorkerBase<std::pair<T*, size_t>>(env, resource_name, resource, /** unlimited queue size */0) {
}
#endif

template<class T>
inline void AsyncProgressQueueWorker<T>::Execute() {
  ExecutionProgress progress(this);
  Execute(progress);
}

template<class T>
inline void AsyncProgressQueueWorker<T>::OnWorkProgress(std::pair<T*, size_t>* datapair) {
  if (datapair == nullptr) {
    return;
  }

  T *data = datapair->first;
  size_t size = datapair->second;

  this->OnProgress(data, size);
  delete datapair;
  delete[] data;
}

template<class T>
inline void AsyncProgressQueueWorker<T>::SendProgress_(const T* data, size_t count) {
    T* new_data = new T[count];
    std::copy(data, data + count, new_data);

    auto pair = new std::pair<T*, size_t>(new_data, count);
    this->NonBlockingCall(pair);
}

template<class T>
inline void AsyncProgressQueueWorker<T>::Signal() const {
  this->NonBlockingCall(nullptr);
}

template<class T>
inline void AsyncProgressQueueWorker<T>::OnWorkComplete(Napi::Env env, napi_status status) {
  // Draining queued items in TSFN.
  AsyncProgressWorkerBase<std::pair<T*, size_t>>::OnWorkComplete(env, status);
}

template<class T>
inline void AsyncProgressQueueWorker<T>::ExecutionProgress::Signal() const {
  _worker->Signal();
}

template<class T>
inline void AsyncProgressQueueWorker<T>::ExecutionProgress::Send(const T* data, size_t count) const {
  _worker->SendProgress_(data, count);
}
#endif  // NAPI_VERSION > 3 && !defined(__wasm32__)

////////////////////////////////////////////////////////////////////////////////
// Memory Management class
////////////////////////////////////////////////////////////////////////////////

inline int64_t MemoryManagement::AdjustExternalMemory(Env env, int64_t change_in_bytes) {
  int64_t result;
  napi_status status = napi_adjust_external_memory(env, change_in_bytes, &result);
  NAPI_THROW_IF_FAILED(env, status, 0);
  return result;
}

////////////////////////////////////////////////////////////////////////////////
// Version Management class
////////////////////////////////////////////////////////////////////////////////

inline uint32_t VersionManagement::GetNapiVersion(Env env) {
  uint32_t result;
  napi_status status = napi_get_version(env, &result);
  NAPI_THROW_IF_FAILED(env, status, 0);
  return result;
}

inline const napi_node_version* VersionManagement::GetNodeVersion(Env env) {
  const napi_node_version* result;
  napi_status status = napi_get_node_version(env, &result);
  NAPI_THROW_IF_FAILED(env, status, 0);
  return result;
}

#if NAPI_VERSION > 5
////////////////////////////////////////////////////////////////////////////////
// Addon<T> class
////////////////////////////////////////////////////////////////////////////////

template <typename T>
inline Object Addon<T>::Init(Env env, Object exports) {
  T* addon = new T(env, exports);
  env.SetInstanceData(addon);
  return addon->entry_point_;
}

template <typename T>
inline T* Addon<T>::Unwrap(Object wrapper) {
  return wrapper.Env().GetInstanceData<T>();
}

template <typename T>
inline void
Addon<T>::DefineAddon(Object exports,
                      const std::initializer_list<AddonProp>& props) {
  DefineProperties(exports, props);
  entry_point_ = exports;
}

template <typename T>
inline Napi::Object
Addon<T>::DefineProperties(Object object,
                           const std::initializer_list<AddonProp>& props) {
  const napi_property_descriptor* properties =
    reinterpret_cast<const napi_property_descriptor*>(props.begin());
  size_t size = props.size();
  napi_status status = napi_define_properties(object.Env(),
                                              object,
                                              size,
                                              properties);
  NAPI_THROW_IF_FAILED(object.Env(), status, object);
  for (size_t idx = 0; idx < size; idx++)
    T::AttachPropData(object.Env(), object, &properties[idx]);
  return object;
}
#endif  // NAPI_VERSION > 5

#if NAPI_VERSION > 2
template <typename Hook, typename Arg>
Env::CleanupHook<Hook, Arg> Env::AddCleanupHook(Hook hook, Arg* arg) {
  return CleanupHook<Hook, Arg>(*this, hook, arg);
}

template <typename Hook>
Env::CleanupHook<Hook> Env::AddCleanupHook(Hook hook) {
  return CleanupHook<Hook>(*this, hook);
}

template <typename Hook, typename Arg>
Env::CleanupHook<Hook, Arg>::CleanupHook(Napi::Env env, Hook hook)
    : wrapper(Env::CleanupHook<Hook, Arg>::Wrapper) {
  data = new CleanupData{std::move(hook), nullptr};
  napi_status status = napi_add_env_cleanup_hook(env, wrapper, data);
  if (status != napi_ok) {
    delete data;
    data = nullptr;
  }
}

template <typename Hook, typename Arg>
Env::CleanupHook<Hook, Arg>::CleanupHook(Napi::Env env, Hook hook, Arg* arg)
    : wrapper(Env::CleanupHook<Hook, Arg>::WrapperWithArg) {
  data = new CleanupData{std::move(hook), arg};
  napi_status status = napi_add_env_cleanup_hook(env, wrapper, data);
  if (status != napi_ok) {
    delete data;
    data = nullptr;
  }
}

template <class Hook, class Arg>
bool Env::CleanupHook<Hook, Arg>::Remove(Env env) {
  napi_status status = napi_remove_env_cleanup_hook(env, wrapper, data);
  delete data;
  data = nullptr;
  return status == napi_ok;
}

template <class Hook, class Arg>
bool Env::CleanupHook<Hook, Arg>::IsEmpty() const {
  return data == nullptr;
}
#endif  // NAPI_VERSION > 2

} // namespace Napi

#endif // SRC_NAPI_INL_H_
#ifndef SRC_NAPI_H_
#define SRC_NAPI_H_

#include <node_api.h>
#include <functional>
#include <initializer_list>
#include <memory>
#include <mutex>
#include <string>
#include <vector>

// VS2015 RTM has bugs with constexpr, so require min of VS2015 Update 3 (known good version)
#if !defined(_MSC_VER) || _MSC_FULL_VER >= 190024210
#define NAPI_HAS_CONSTEXPR 1
#endif

// VS2013 does not support char16_t literal strings, so we'll work around it using wchar_t strings
// and casting them. This is safe as long as the character sizes are the same.
#if defined(_MSC_VER) && _MSC_VER <= 1800
static_assert(sizeof(char16_t) == sizeof(wchar_t), "Size mismatch between char16_t and wchar_t");
#define NAPI_WIDE_TEXT(x) reinterpret_cast<char16_t*>(L ## x)
#else
#define NAPI_WIDE_TEXT(x) u ## x
#endif

// If C++ exceptions are not explicitly enabled or disabled, enable them
// if exceptions were enabled in the compiler settings.
#if !defined(NAPI_CPP_EXCEPTIONS) && !defined(NAPI_DISABLE_CPP_EXCEPTIONS)
  #if defined(_CPPUNWIND) || defined (__EXCEPTIONS)
    #define NAPI_CPP_EXCEPTIONS
  #else
    #error Exception support not detected. \
      Define either NAPI_CPP_EXCEPTIONS or NAPI_DISABLE_CPP_EXCEPTIONS.
  #endif
#endif

// If C++ NAPI_CPP_EXCEPTIONS are enabled, NODE_ADDON_API_ENABLE_MAYBE should
// not be set
#if defined(NAPI_CPP_EXCEPTIONS) && defined(NODE_ADDON_API_ENABLE_MAYBE)
#error NODE_ADDON_API_ENABLE_MAYBE should not be set when \
    NAPI_CPP_EXCEPTIONS is defined.
#endif

#ifdef _NOEXCEPT
  #define NAPI_NOEXCEPT _NOEXCEPT
#else
  #define NAPI_NOEXCEPT noexcept
#endif

#ifdef NAPI_CPP_EXCEPTIONS

// When C++ exceptions are enabled, Errors are thrown directly. There is no need
// to return anything after the throw statements. The variadic parameter is an
// optional return value that is ignored.
// We need _VOID versions of the macros to avoid warnings resulting from
// leaving the NAPI_THROW_* `...` argument empty.

#define NAPI_THROW(e, ...)  throw e
#define NAPI_THROW_VOID(e)  throw e

#define NAPI_THROW_IF_FAILED(env, status, ...)           \
  if ((status) != napi_ok) throw Napi::Error::New(env);

#define NAPI_THROW_IF_FAILED_VOID(env, status)           \
  if ((status) != napi_ok) throw Napi::Error::New(env);

#else // NAPI_CPP_EXCEPTIONS

// When C++ exceptions are disabled, Errors are thrown as JavaScript exceptions,
// which are pending until the callback returns to JS.  The variadic parameter
// is an optional return value; usually it is an empty result.
// We need _VOID versions of the macros to avoid warnings resulting from
// leaving the NAPI_THROW_* `...` argument empty.

#define NAPI_THROW(e, ...)                               \
  do {                                                   \
    (e).ThrowAsJavaScriptException();                    \
    return __VA_ARGS__;                                  \
  } while (0)

#define NAPI_THROW_VOID(e)                               \
  do {                                                   \
    (e).ThrowAsJavaScriptException();                    \
    return;                                              \
  } while (0)

#define NAPI_THROW_IF_FAILED(env, status, ...)                                 \
  if ((status) != napi_ok) {                                                   \
    Napi::Error::New(env).ThrowAsJavaScriptException();                        \
    return __VA_ARGS__;                                                        \
  }

#define NAPI_THROW_IF_FAILED_VOID(env, status)                                 \
  if ((status) != napi_ok) {                                                   \
    Napi::Error::New(env).ThrowAsJavaScriptException();                        \
    return;                                                                    \
  }

#endif // NAPI_CPP_EXCEPTIONS

#ifdef NODE_ADDON_API_ENABLE_MAYBE
#define NAPI_MAYBE_THROW_IF_FAILED(env, status, type)                          \
  NAPI_THROW_IF_FAILED(env, status, Napi::Nothing<type>())

#define NAPI_RETURN_OR_THROW_IF_FAILED(env, status, result, type)              \
  NAPI_MAYBE_THROW_IF_FAILED(env, status, type);                               \
  return Napi::Just<type>(result);
#else
#define NAPI_MAYBE_THROW_IF_FAILED(env, status, type)                          \
  NAPI_THROW_IF_FAILED(env, status, type())

#define NAPI_RETURN_OR_THROW_IF_FAILED(env, status, result, type)              \
  NAPI_MAYBE_THROW_IF_FAILED(env, status, type);                               \
  return result;
#endif

# define NAPI_DISALLOW_ASSIGN(CLASS) void operator=(const CLASS&) = delete;
# define NAPI_DISALLOW_COPY(CLASS) CLASS(const CLASS&) = delete;

#define NAPI_DISALLOW_ASSIGN_COPY(CLASS)  \
    NAPI_DISALLOW_ASSIGN(CLASS)           \
    NAPI_DISALLOW_COPY(CLASS)

#define NAPI_CHECK(condition, location, message)                               \
  do {                                                                         \
    if (!(condition)) {                                                        \
      Napi::Error::Fatal((location), (message));                               \
    }                                                                          \
  } while (0)

#define NAPI_FATAL_IF_FAILED(status, location, message)                        \
  NAPI_CHECK((status) == napi_ok, location, message)

////////////////////////////////////////////////////////////////////////////////
/// Node-API C++ Wrapper Classes
///
/// These classes wrap the "Node-API" ABI-stable C APIs for Node.js, providing a
/// C++ object model and C++ exception-handling semantics with low overhead.
/// The wrappers are all header-only so that they do not affect the ABI.
////////////////////////////////////////////////////////////////////////////////
namespace Napi {

  // Forward declarations
  class Env;
  class Value;
  class Boolean;
  class Number;
#if NAPI_VERSION > 5
  class BigInt;
#endif  // NAPI_VERSION > 5
#if (NAPI_VERSION > 4)
  class Date;
#endif
  class String;
  class Object;
  class Array;
  class ArrayBuffer;
  class Function;
  class Error;
  class PropertyDescriptor;
  class CallbackInfo;
  class TypedArray;
  template <typename T> class TypedArrayOf;

  using Int8Array =
      TypedArrayOf<int8_t>;  ///< Typed-array of signed 8-bit integers
  using Uint8Array =
      TypedArrayOf<uint8_t>;  ///< Typed-array of unsigned 8-bit integers
  using Int16Array =
      TypedArrayOf<int16_t>;  ///< Typed-array of signed 16-bit integers
  using Uint16Array =
      TypedArrayOf<uint16_t>;  ///< Typed-array of unsigned 16-bit integers
  using Int32Array =
      TypedArrayOf<int32_t>;  ///< Typed-array of signed 32-bit integers
  using Uint32Array =
      TypedArrayOf<uint32_t>;  ///< Typed-array of unsigned 32-bit integers
  using Float32Array =
      TypedArrayOf<float>;  ///< Typed-array of 32-bit floating-point values
  using Float64Array =
      TypedArrayOf<double>;  ///< Typed-array of 64-bit floating-point values
#if NAPI_VERSION > 5
  using BigInt64Array =
      TypedArrayOf<int64_t>;  ///< Typed array of signed 64-bit integers
  using BigUint64Array =
      TypedArrayOf<uint64_t>;  ///< Typed array of unsigned 64-bit integers
#endif  // NAPI_VERSION > 5

  /// Defines the signature of a Node-API C++ module's registration callback
  /// (init) function.
  using ModuleRegisterCallback = Object (*)(Env env, Object exports);

  class MemoryManagement;

  /// A simple Maybe type, representing an object which may or may not have a
  /// value.
  ///
  /// If an API method returns a Maybe<>, the API method can potentially fail
  /// either because an exception is thrown, or because an exception is pending,
  /// e.g. because a previous API call threw an exception that hasn't been
  /// caught yet. In that case, a "Nothing" value is returned.
  template <class T>
  class Maybe {
   public:
    bool IsNothing() const;
    bool IsJust() const;

    /// Short-hand for Unwrap(), which doesn't return a value. Could be used
    /// where the actual value of the Maybe is not needed like Object::Set.
    /// If this Maybe is nothing (empty), node-addon-api will crash the
    /// process.
    void Check() const;

    /// Return the value of type T contained in the Maybe. If this Maybe is
    /// nothing (empty), node-addon-api will crash the process.
    T Unwrap() const;

    /// Return the value of type T contained in the Maybe, or using a default
    /// value if this Maybe is nothing (empty).
    T UnwrapOr(const T& default_value) const;

    /// Converts this Maybe to a value of type T in the out. If this Maybe is
    /// nothing (empty), `false` is returned and `out` is left untouched.
    bool UnwrapTo(T* out) const;

    bool operator==(const Maybe& other) const;
    bool operator!=(const Maybe& other) const;

   private:
    Maybe();
    explicit Maybe(const T& t);

    bool _has_value;
    T _value;

    template <class U>
    friend Maybe<U> Nothing();
    template <class U>
    friend Maybe<U> Just(const U& u);
  };

  template <class T>
  inline Maybe<T> Nothing();

  template <class T>
  inline Maybe<T> Just(const T& t);

#if defined(NODE_ADDON_API_ENABLE_MAYBE)
  template <typename T>
  using MaybeOrValue = Maybe<T>;
#else
  template <typename T>
  using MaybeOrValue = T;
#endif

  /// Environment for Node-API values and operations.
  ///
  /// All Node-API values and operations must be associated with an environment.
  /// An environment instance is always provided to callback functions; that
  /// environment must then be used for any creation of Node-API values or other
  /// Node-API operations within the callback. (Many methods infer the
  /// environment from the `this` instance that the method is called on.)
  ///
  /// In the future, multiple environments per process may be supported,
  /// although current implementations only support one environment per process.
  ///
  /// In the V8 JavaScript engine, a Node-API environment approximately
  /// corresponds to an Isolate.
  class Env {
   private:
#if NAPI_VERSION > 2
    template <typename Hook, typename Arg = void>
    class CleanupHook;
#endif  // NAPI_VERSION > 2
#if NAPI_VERSION > 5
    template <typename T> static void DefaultFini(Env, T* data);
    template <typename DataType, typename HintType>
    static void DefaultFiniWithHint(Env, DataType* data, HintType* hint);
#endif  // NAPI_VERSION > 5
  public:
    Env(napi_env env);

    operator napi_env() const;

    Object Global() const;
    Value Undefined() const;
    Value Null() const;

    bool IsExceptionPending() const;
    Error GetAndClearPendingException();

    MaybeOrValue<Value> RunScript(const char* utf8script);
    MaybeOrValue<Value> RunScript(const std::string& utf8script);
    MaybeOrValue<Value> RunScript(String script);

#if NAPI_VERSION > 2
    template <typename Hook>
    CleanupHook<Hook> AddCleanupHook(Hook hook);

    template <typename Hook, typename Arg>
    CleanupHook<Hook, Arg> AddCleanupHook(Hook hook, Arg* arg);
#endif  // NAPI_VERSION > 2

#if NAPI_VERSION > 5
    template <typename T> T* GetInstanceData();

    template <typename T> using Finalizer = void (*)(Env, T*);
    template <typename T, Finalizer<T> fini = Env::DefaultFini<T>>
    void SetInstanceData(T* data);

    template <typename DataType, typename HintType>
    using FinalizerWithHint = void (*)(Env, DataType*, HintType*);
    template <typename DataType,
              typename HintType,
              FinalizerWithHint<DataType, HintType> fini =
                Env::DefaultFiniWithHint<DataType, HintType>>
    void SetInstanceData(DataType* data, HintType* hint);
#endif  // NAPI_VERSION > 5

  private:
    napi_env _env;

#if NAPI_VERSION > 2
    template <typename Hook, typename Arg>
    class CleanupHook {
     public:
      CleanupHook(Env env, Hook hook, Arg* arg);
      CleanupHook(Env env, Hook hook);
      bool Remove(Env env);
      bool IsEmpty() const;

     private:
      static inline void Wrapper(void* data) NAPI_NOEXCEPT;
      static inline void WrapperWithArg(void* data) NAPI_NOEXCEPT;

      void (*wrapper)(void* arg);
      struct CleanupData {
        Hook hook;
        Arg* arg;
      } * data;
    };
  };
#endif  // NAPI_VERSION > 2

  /// A JavaScript value of unknown type.
  ///
  /// For type-specific operations, convert to one of the Value subclasses using a `To*` or `As()`
  /// method. The `To*` methods do type coercion; the `As()` method does not.
  ///
  ///     Napi::Value value = ...
  ///     if (!value.IsString()) throw Napi::TypeError::New(env, "Invalid arg...");
  ///     Napi::String str = value.As<Napi::String>(); // Cast to a string value
  ///
  ///     Napi::Value anotherValue = ...
  ///     bool isTruthy = anotherValue.ToBoolean(); // Coerce to a boolean value
  class Value {
  public:
    Value();                               ///< Creates a new _empty_ Value instance.
    Value(napi_env env,
          napi_value value);  ///< Wraps a Node-API value primitive.

    /// Creates a JS value from a C++ primitive.
    ///
    /// `value` may be any of:
    /// - bool
    /// - Any integer type
    /// - Any floating point type
    /// - const char* (encoded using UTF-8, null-terminated)
    /// - const char16_t* (encoded using UTF-16-LE, null-terminated)
    /// - std::string (encoded using UTF-8)
    /// - std::u16string
    /// - napi::Value
    /// - napi_value
    template <typename T>
    static Value From(napi_env env, const T& value);

    /// Converts to a Node-API value primitive.
    ///
    /// If the instance is _empty_, this returns `nullptr`.
    operator napi_value() const;

    /// Tests if this value strictly equals another value.
    bool operator ==(const Value& other) const;

    /// Tests if this value does not strictly equal another value.
    bool operator !=(const Value& other) const;

    /// Tests if this value strictly equals another value.
    bool StrictEquals(const Value& other) const;

    /// Gets the environment the value is associated with.
    Napi::Env Env() const;

    /// Checks if the value is empty (uninitialized).
    ///
    /// An empty value is invalid, and most attempts to perform an operation on an empty value
    /// will result in an exception. Note an empty value is distinct from JavaScript `null` or
    /// `undefined`, which are valid values.
    ///
    /// When C++ exceptions are disabled at compile time, a method with a `Value` return type may
    /// return an empty value to indicate a pending exception. So when not using C++ exceptions,
    /// callers should check whether the value is empty before attempting to use it.
    bool IsEmpty() const;

    napi_valuetype Type() const; ///< Gets the type of the value.

    bool IsUndefined() const;   ///< Tests if a value is an undefined JavaScript value.
    bool IsNull() const;        ///< Tests if a value is a null JavaScript value.
    bool IsBoolean() const;     ///< Tests if a value is a JavaScript boolean.
    bool IsNumber() const;      ///< Tests if a value is a JavaScript number.
#if NAPI_VERSION > 5
    bool IsBigInt() const;      ///< Tests if a value is a JavaScript bigint.
#endif  // NAPI_VERSION > 5
#if (NAPI_VERSION > 4)
    bool IsDate() const;        ///< Tests if a value is a JavaScript date.
#endif
    bool IsString() const;      ///< Tests if a value is a JavaScript string.
    bool IsSymbol() const;      ///< Tests if a value is a JavaScript symbol.
    bool IsArray() const;       ///< Tests if a value is a JavaScript array.
    bool IsArrayBuffer() const; ///< Tests if a value is a JavaScript array buffer.
    bool IsTypedArray() const;  ///< Tests if a value is a JavaScript typed array.
    bool IsObject() const;      ///< Tests if a value is a JavaScript object.
    bool IsFunction() const;    ///< Tests if a value is a JavaScript function.
    bool IsPromise() const;     ///< Tests if a value is a JavaScript promise.
    bool IsDataView() const;    ///< Tests if a value is a JavaScript data view.
    bool IsBuffer() const;      ///< Tests if a value is a Node buffer.
    bool IsExternal() const;    ///< Tests if a value is a pointer to external data.

    /// Casts to another type of `Napi::Value`, when the actual type is known or assumed.
    ///
    /// This conversion does NOT coerce the type. Calling any methods inappropriate for the actual
    /// value type will throw `Napi::Error`.
    template <typename T> T As() const;

    MaybeOrValue<Boolean> ToBoolean()
        const;  ///< Coerces a value to a JavaScript boolean.
    MaybeOrValue<Number> ToNumber()
        const;  ///< Coerces a value to a JavaScript number.
    MaybeOrValue<String> ToString()
        const;  ///< Coerces a value to a JavaScript string.
    MaybeOrValue<Object> ToObject()
        const;  ///< Coerces a value to a JavaScript object.

   protected:
    /// !cond INTERNAL
    napi_env _env;
    napi_value _value;
    /// !endcond
  };

  /// A JavaScript boolean value.
  class Boolean : public Value {
  public:
   static Boolean New(napi_env env,  ///< Node-API environment
                      bool value     ///< Boolean value
   );

   Boolean();  ///< Creates a new _empty_ Boolean instance.
   Boolean(napi_env env,
           napi_value value);  ///< Wraps a Node-API value primitive.

   operator bool() const;  ///< Converts a Boolean value to a boolean primitive.
   bool Value() const;     ///< Converts a Boolean value to a boolean primitive.
  };

  /// A JavaScript number value.
  class Number : public Value {
  public:
   static Number New(napi_env env,  ///< Node-API environment
                     double value   ///< Number value
   );

   Number();  ///< Creates a new _empty_ Number instance.
   Number(napi_env env,
          napi_value value);  ///< Wraps a Node-API value primitive.

   operator int32_t()
       const;  ///< Converts a Number value to a 32-bit signed integer value.
   operator uint32_t()
       const;  ///< Converts a Number value to a 32-bit unsigned integer value.
   operator int64_t()
       const;  ///< Converts a Number value to a 64-bit signed integer value.
   operator float()
       const;  ///< Converts a Number value to a 32-bit floating-point value.
   operator double()
       const;  ///< Converts a Number value to a 64-bit floating-point value.

   int32_t Int32Value()
       const;  ///< Converts a Number value to a 32-bit signed integer value.
   uint32_t Uint32Value()
       const;  ///< Converts a Number value to a 32-bit unsigned integer value.
   int64_t Int64Value()
       const;  ///< Converts a Number value to a 64-bit signed integer value.
   float FloatValue()
       const;  ///< Converts a Number value to a 32-bit floating-point value.
   double DoubleValue()
       const;  ///< Converts a Number value to a 64-bit floating-point value.
  };

#if NAPI_VERSION > 5
  /// A JavaScript bigint value.
  class BigInt : public Value {
  public:
   static BigInt New(napi_env env,  ///< Node-API environment
                     int64_t value  ///< Number value
   );
   static BigInt New(napi_env env,   ///< Node-API environment
                     uint64_t value  ///< Number value
   );

   /// Creates a new BigInt object using a specified sign bit and a
   /// specified list of digits/words.
   /// The resulting number is calculated as:
   /// (-1)^sign_bit * (words[0] * (2^64)^0 + words[1] * (2^64)^1 + ...)
   static BigInt New(napi_env env,          ///< Node-API environment
                     int sign_bit,          ///< Sign bit. 1 if negative.
                     size_t word_count,     ///< Number of words in array
                     const uint64_t* words  ///< Array of words
   );

   BigInt();  ///< Creates a new _empty_ BigInt instance.
   BigInt(napi_env env,
          napi_value value);  ///< Wraps a Node-API value primitive.

   int64_t Int64Value(bool* lossless)
       const;  ///< Converts a BigInt value to a 64-bit signed integer value.
   uint64_t Uint64Value(bool* lossless)
       const;  ///< Converts a BigInt value to a 64-bit unsigned integer value.

   size_t WordCount() const;  ///< The number of 64-bit words needed to store
                              ///< the result of ToWords().

   /// Writes the contents of this BigInt to a specified memory location.
   /// `sign_bit` must be provided and will be set to 1 if this BigInt is
   /// negative.
   /// `*word_count` has to be initialized to the length of the `words` array.
   /// Upon return, it will be set to the actual number of words that would
   /// be needed to store this BigInt (i.e. the return value of `WordCount()`).
   void ToWords(int* sign_bit, size_t* word_count, uint64_t* words);
  };
#endif  // NAPI_VERSION > 5

#if (NAPI_VERSION > 4)
  /// A JavaScript date value.
  class Date : public Value {
  public:
    /// Creates a new Date value from a double primitive.
   static Date New(napi_env env,  ///< Node-API environment
                   double value   ///< Number value
   );

   Date();  ///< Creates a new _empty_ Date instance.
   Date(napi_env env, napi_value value);  ///< Wraps a Node-API value primitive.
   operator double() const;  ///< Converts a Date value to double primitive

   double ValueOf() const;  ///< Converts a Date value to a double primitive.
  };
  #endif

  /// A JavaScript string or symbol value (that can be used as a property name).
  class Name : public Value {
  public:
    Name();                               ///< Creates a new _empty_ Name instance.
    Name(napi_env env,
         napi_value value);  ///< Wraps a Node-API value primitive.
  };

  /// A JavaScript string value.
  class String : public Name {
  public:
    /// Creates a new String value from a UTF-8 encoded C++ string.
   static String New(napi_env env,             ///< Node-API environment
                     const std::string& value  ///< UTF-8 encoded C++ string
   );

   /// Creates a new String value from a UTF-16 encoded C++ string.
   static String New(napi_env env,                ///< Node-API environment
                     const std::u16string& value  ///< UTF-16 encoded C++ string
   );

   /// Creates a new String value from a UTF-8 encoded C string.
   static String New(
       napi_env env,      ///< Node-API environment
       const char* value  ///< UTF-8 encoded null-terminated C string
   );

   /// Creates a new String value from a UTF-16 encoded C string.
   static String New(
       napi_env env,          ///< Node-API environment
       const char16_t* value  ///< UTF-16 encoded null-terminated C string
   );

   /// Creates a new String value from a UTF-8 encoded C string with specified
   /// length.
   static String New(napi_env env,       ///< Node-API environment
                     const char* value,  ///< UTF-8 encoded C string (not
                                         ///< necessarily null-terminated)
                     size_t length       ///< length of the string in bytes
   );

   /// Creates a new String value from a UTF-16 encoded C string with specified
   /// length.
   static String New(
       napi_env env,           ///< Node-API environment
       const char16_t* value,  ///< UTF-16 encoded C string (not necessarily
                               ///< null-terminated)
       size_t length           ///< Length of the string in 2-byte code units
   );

   /// Creates a new String based on the original object's type.
   ///
   /// `value` may be any of:
   /// - const char* (encoded using UTF-8, null-terminated)
   /// - const char16_t* (encoded using UTF-16-LE, null-terminated)
   /// - std::string (encoded using UTF-8)
   /// - std::u16string
   template <typename T>
   static String From(napi_env env, const T& value);

   String();  ///< Creates a new _empty_ String instance.
   String(napi_env env,
          napi_value value);  ///< Wraps a Node-API value primitive.

   operator std::string()
       const;  ///< Converts a String value to a UTF-8 encoded C++ string.
   operator std::u16string()
       const;  ///< Converts a String value to a UTF-16 encoded C++ string.
   std::string Utf8Value()
       const;  ///< Converts a String value to a UTF-8 encoded C++ string.
   std::u16string Utf16Value()
       const;  ///< Converts a String value to a UTF-16 encoded C++ string.
  };

  /// A JavaScript symbol value.
  class Symbol : public Name {
  public:
    /// Creates a new Symbol value with an optional description.
   static Symbol New(
       napi_env env,  ///< Node-API environment
       const char* description =
           nullptr  ///< Optional UTF-8 encoded null-terminated C string
                    ///  describing the symbol
   );

   /// Creates a new Symbol value with a description.
   static Symbol New(
       napi_env env,  ///< Node-API environment
       const std::string&
           description  ///< UTF-8 encoded C++ string describing the symbol
   );

   /// Creates a new Symbol value with a description.
   static Symbol New(napi_env env,       ///< Node-API environment
                     String description  ///< String value describing the symbol
   );

   /// Creates a new Symbol value with a description.
   static Symbol New(
       napi_env env,           ///< Node-API environment
       napi_value description  ///< String value describing the symbol
   );

   /// Get a public Symbol (e.g. Symbol.iterator).
   static MaybeOrValue<Symbol> WellKnown(napi_env, const std::string& name);

   // Create a symbol in the global registry, UTF-8 Encoded cpp string
   static MaybeOrValue<Symbol> For(napi_env env,
                                   const std::string& description);

   // Create a symbol in the global registry, C style string (null terminated)
   static MaybeOrValue<Symbol> For(napi_env env, const char* description);

   // Create a symbol in the global registry, String value describing the symbol
   static MaybeOrValue<Symbol> For(napi_env env, String description);

   // Create a symbol in the global registry, napi_value describing the symbol
   static MaybeOrValue<Symbol> For(napi_env env, napi_value description);

   Symbol();  ///< Creates a new _empty_ Symbol instance.
   Symbol(napi_env env,
          napi_value value);  ///< Wraps a Node-API value primitive.
  };

  /// A JavaScript object value.
  class Object : public Value {
  public:
   /// Enables property and element assignments using indexing syntax.
   ///
   /// This is a convenient helper to get and set object properties. As
   /// getting and setting object properties may throw with JavaScript
   /// exceptions, it is notable that these operations may fail.
   /// When NODE_ADDON_API_ENABLE_MAYBE is defined, the process will abort
   /// on JavaScript exceptions.
   ///
   /// Example:
   ///
   ///     Napi::Value propertyValue = object1['A'];
   ///     object2['A'] = propertyValue;
   ///     Napi::Value elementValue = array[0];
   ///     array[1] = elementValue;
   template <typename Key>
   class PropertyLValue {
    public:
      /// Converts an L-value to a value.
      operator Value() const;

      /// Assigns a value to the property. The type of value can be
      /// anything supported by `Object::Set`.
      template <typename ValueType>
      PropertyLValue& operator =(ValueType value);

    private:
      PropertyLValue() = delete;
      PropertyLValue(Object object, Key key);
      napi_env _env;
      napi_value _object;
      Key _key;

      friend class Napi::Object;
   };

    /// Creates a new Object value.
    static Object New(napi_env env  ///< Node-API environment
    );

    Object();                               ///< Creates a new _empty_ Object instance.
    Object(napi_env env,
           napi_value value);  ///< Wraps a Node-API value primitive.

    /// Gets or sets a named property.
    PropertyLValue<std::string> operator [](
      const char* utf8name ///< UTF-8 encoded null-terminated property name
    );

    /// Gets or sets a named property.
    PropertyLValue<std::string> operator [](
      const std::string& utf8name ///< UTF-8 encoded property name
    );

    /// Gets or sets an indexed property or array element.
    PropertyLValue<uint32_t> operator [](
      uint32_t index /// Property / element index
    );

    /// Gets or sets an indexed property or array element.
    PropertyLValue<Value> operator[](Value index  /// Property / element index
    );

    /// Gets or sets an indexed property or array element.
    PropertyLValue<Value> operator[](Value index  /// Property / element index
    ) const;

    /// Gets a named property.
    MaybeOrValue<Value> operator[](
        const char* utf8name  ///< UTF-8 encoded null-terminated property name
    ) const;

    /// Gets a named property.
    MaybeOrValue<Value> operator[](
        const std::string& utf8name  ///< UTF-8 encoded property name
    ) const;

    /// Gets an indexed property or array element.
    MaybeOrValue<Value> operator[](uint32_t index  ///< Property / element index
    ) const;

    /// Checks whether a property is present.
    MaybeOrValue<bool> Has(napi_value key  ///< Property key primitive
    ) const;

    /// Checks whether a property is present.
    MaybeOrValue<bool> Has(Value key  ///< Property key
    ) const;

    /// Checks whether a named property is present.
    MaybeOrValue<bool> Has(
        const char* utf8name  ///< UTF-8 encoded null-terminated property name
    ) const;

    /// Checks whether a named property is present.
    MaybeOrValue<bool> Has(
        const std::string& utf8name  ///< UTF-8 encoded property name
    ) const;

    /// Checks whether a own property is present.
    MaybeOrValue<bool> HasOwnProperty(
        napi_value key  ///< Property key primitive
    ) const;

    /// Checks whether a own property is present.
    MaybeOrValue<bool> HasOwnProperty(Value key  ///< Property key
    ) const;

    /// Checks whether a own property is present.
    MaybeOrValue<bool> HasOwnProperty(
        const char* utf8name  ///< UTF-8 encoded null-terminated property name
    ) const;

    /// Checks whether a own property is present.
    MaybeOrValue<bool> HasOwnProperty(
        const std::string& utf8name  ///< UTF-8 encoded property name
    ) const;

    /// Gets a property.
    MaybeOrValue<Value> Get(napi_value key  ///< Property key primitive
    ) const;

    /// Gets a property.
    MaybeOrValue<Value> Get(Value key  ///< Property key
    ) const;

    /// Gets a named property.
    MaybeOrValue<Value> Get(
        const char* utf8name  ///< UTF-8 encoded null-terminated property name
    ) const;

    /// Gets a named property.
    MaybeOrValue<Value> Get(
        const std::string& utf8name  ///< UTF-8 encoded property name
    ) const;

    /// Sets a property.
    template <typename ValueType>
    MaybeOrValue<bool> Set(napi_value key,         ///< Property key primitive
                           const ValueType& value  ///< Property value primitive
    );

    /// Sets a property.
    template <typename ValueType>
    MaybeOrValue<bool> Set(Value key,              ///< Property key
                           const ValueType& value  ///< Property value
    );

    /// Sets a named property.
    template <typename ValueType>
    MaybeOrValue<bool> Set(
        const char* utf8name,  ///< UTF-8 encoded null-terminated property name
        const ValueType& value);

    /// Sets a named property.
    template <typename ValueType>
    MaybeOrValue<bool> Set(
        const std::string& utf8name,  ///< UTF-8 encoded property name
        const ValueType& value        ///< Property value primitive
    );

    /// Delete property.
    MaybeOrValue<bool> Delete(napi_value key  ///< Property key primitive
    );

    /// Delete property.
    MaybeOrValue<bool> Delete(Value key  ///< Property key
    );

    /// Delete property.
    MaybeOrValue<bool> Delete(
        const char* utf8name  ///< UTF-8 encoded null-terminated property name
    );

    /// Delete property.
    MaybeOrValue<bool> Delete(
        const std::string& utf8name  ///< UTF-8 encoded property name
    );

    /// Checks whether an indexed property is present.
    MaybeOrValue<bool> Has(uint32_t index  ///< Property / element index
    ) const;

    /// Gets an indexed property or array element.
    MaybeOrValue<Value> Get(uint32_t index  ///< Property / element index
    ) const;

    /// Sets an indexed property or array element.
    template <typename ValueType>
    MaybeOrValue<bool> Set(uint32_t index,         ///< Property / element index
                           const ValueType& value  ///< Property value primitive
    );

    /// Deletes an indexed property or array element.
    MaybeOrValue<bool> Delete(uint32_t index  ///< Property / element index
    );

    /// This operation can fail in case of Proxy.[[OwnPropertyKeys]] and
    /// Proxy.[[GetOwnProperty]] calling into JavaScript. See:
    /// -
    /// https://tc39.es/ecma262/#sec-proxy-object-internal-methods-and-internal-slots-ownpropertykeys
    /// -
    /// https://tc39.es/ecma262/#sec-proxy-object-internal-methods-and-internal-slots-getownproperty-p
    MaybeOrValue<Array> GetPropertyNames() const;  ///< Get all property names

    /// Defines a property on the object.
    ///
    /// This operation can fail in case of Proxy.[[DefineOwnProperty]] calling
    /// into JavaScript. See
    /// https://tc39.es/ecma262/#sec-proxy-object-internal-methods-and-internal-slots-defineownproperty-p-desc
    MaybeOrValue<bool> DefineProperty(
        const PropertyDescriptor&
            property  ///< Descriptor for the property to be defined
    );

    /// Defines properties on the object.
    ///
    /// This operation can fail in case of Proxy.[[DefineOwnProperty]] calling
    /// into JavaScript. See
    /// https://tc39.es/ecma262/#sec-proxy-object-internal-methods-and-internal-slots-defineownproperty-p-desc
    MaybeOrValue<bool> DefineProperties(
        const std::initializer_list<PropertyDescriptor>& properties
        ///< List of descriptors for the properties to be defined
    );

    /// Defines properties on the object.
    ///
    /// This operation can fail in case of Proxy.[[DefineOwnProperty]] calling
    /// into JavaScript. See
    /// https://tc39.es/ecma262/#sec-proxy-object-internal-methods-and-internal-slots-defineownproperty-p-desc
    MaybeOrValue<bool> DefineProperties(
        const std::vector<PropertyDescriptor>& properties
        ///< Vector of descriptors for the properties to be defined
    );

    /// Checks if an object is an instance created by a constructor function.
    ///
    /// This is equivalent to the JavaScript `instanceof` operator.
    ///
    /// This operation can fail in case of Proxy.[[GetPrototypeOf]] calling into
    /// JavaScript.
    /// See
    /// https://tc39.es/ecma262/#sec-proxy-object-internal-methods-and-internal-slots-getprototypeof
    MaybeOrValue<bool> InstanceOf(
        const Function& constructor  ///< Constructor function
    ) const;

    template <typename Finalizer, typename T>
    inline void AddFinalizer(Finalizer finalizeCallback, T* data);

    template <typename Finalizer, typename T, typename Hint>
    inline void AddFinalizer(Finalizer finalizeCallback,
                             T* data,
                             Hint* finalizeHint);

#ifdef NAPI_CPP_EXCEPTIONS
    class const_iterator;

    inline const_iterator begin() const;

    inline const_iterator end() const;

    class iterator;

    inline iterator begin();

    inline iterator end();
#endif  // NAPI_CPP_EXCEPTIONS

#if NAPI_VERSION >= 8
    /// This operation can fail in case of Proxy.[[GetPrototypeOf]] calling into
    /// JavaScript.
    /// See
    /// https://tc39.es/ecma262/#sec-proxy-object-internal-methods-and-internal-slots-getprototypeof
    MaybeOrValue<bool> Freeze();
    /// This operation can fail in case of Proxy.[[GetPrototypeOf]] calling into
    /// JavaScript.
    /// See
    /// https://tc39.es/ecma262/#sec-proxy-object-internal-methods-and-internal-slots-getprototypeof
    MaybeOrValue<bool> Seal();
#endif  // NAPI_VERSION >= 8
  };

  template <typename T>
  class External : public Value {
  public:
    static External New(napi_env env, T* data);

    // Finalizer must implement `void operator()(Env env, T* data)`.
    template <typename Finalizer>
    static External New(napi_env env,
                        T* data,
                        Finalizer finalizeCallback);
    // Finalizer must implement `void operator()(Env env, T* data, Hint* hint)`.
    template <typename Finalizer, typename Hint>
    static External New(napi_env env,
                        T* data,
                        Finalizer finalizeCallback,
                        Hint* finalizeHint);

    External();
    External(napi_env env, napi_value value);

    T* Data() const;
  };

  class Array : public Object {
  public:
    static Array New(napi_env env);
    static Array New(napi_env env, size_t length);

    Array();
    Array(napi_env env, napi_value value);

    uint32_t Length() const;
  };

#ifdef NAPI_CPP_EXCEPTIONS
  class Object::const_iterator {
   private:
    enum class Type { BEGIN, END };

    inline const_iterator(const Object* object, const Type type);

   public:
    inline const_iterator& operator++();

    inline bool operator==(const const_iterator& other) const;

    inline bool operator!=(const const_iterator& other) const;

    inline const std::pair<Value, Object::PropertyLValue<Value>> operator*()
        const;

   private:
    const Napi::Object* _object;
    Array _keys;
    uint32_t _index;

    friend class Object;
  };

  class Object::iterator {
   private:
    enum class Type { BEGIN, END };

    inline iterator(Object* object, const Type type);

   public:
    inline iterator& operator++();

    inline bool operator==(const iterator& other) const;

    inline bool operator!=(const iterator& other) const;

    inline std::pair<Value, Object::PropertyLValue<Value>> operator*();

   private:
    Napi::Object* _object;
    Array _keys;
    uint32_t _index;

    friend class Object;
  };
#endif  // NAPI_CPP_EXCEPTIONS

  /// A JavaScript array buffer value.
  class ArrayBuffer : public Object {
  public:
    /// Creates a new ArrayBuffer instance over a new automatically-allocated buffer.
   static ArrayBuffer New(
       napi_env env,      ///< Node-API environment
       size_t byteLength  ///< Length of the buffer to be allocated, in bytes
   );

   /// Creates a new ArrayBuffer instance, using an external buffer with
   /// specified byte length.
   static ArrayBuffer New(
       napi_env env,        ///< Node-API environment
       void* externalData,  ///< Pointer to the external buffer to be used by
                            ///< the array
       size_t byteLength    ///< Length of the external buffer to be used by the
                            ///< array, in bytes
   );

   /// Creates a new ArrayBuffer instance, using an external buffer with
   /// specified byte length.
   template <typename Finalizer>
   static ArrayBuffer New(
       napi_env env,        ///< Node-API environment
       void* externalData,  ///< Pointer to the external buffer to be used by
                            ///< the array
       size_t byteLength,   ///< Length of the external buffer to be used by the
                            ///< array,
                            ///  in bytes
       Finalizer finalizeCallback  ///< Function to be called when the array
                                   ///< buffer is destroyed;
                                   ///  must implement `void operator()(Env env,
                                   ///  void* externalData)`
   );

   /// Creates a new ArrayBuffer instance, using an external buffer with
   /// specified byte length.
   template <typename Finalizer, typename Hint>
   static ArrayBuffer New(
       napi_env env,        ///< Node-API environment
       void* externalData,  ///< Pointer to the external buffer to be used by
                            ///< the array
       size_t byteLength,   ///< Length of the external buffer to be used by the
                            ///< array,
                            ///  in bytes
       Finalizer finalizeCallback,  ///< Function to be called when the array
                                    ///< buffer is destroyed;
                                    ///  must implement `void operator()(Env
                                    ///  env, void* externalData, Hint* hint)`
       Hint* finalizeHint  ///< Hint (second parameter) to be passed to the
                           ///< finalize callback
   );

   ArrayBuffer();  ///< Creates a new _empty_ ArrayBuffer instance.
   ArrayBuffer(napi_env env,
               napi_value value);  ///< Wraps a Node-API value primitive.

   void* Data();         ///< Gets a pointer to the data buffer.
   size_t ByteLength();  ///< Gets the length of the array buffer in bytes.

#if NAPI_VERSION >= 7
    bool IsDetached() const;
    void Detach();
#endif  // NAPI_VERSION >= 7
  };

  /// A JavaScript typed-array value with unknown array type.
  ///
  /// For type-specific operations, cast to a `TypedArrayOf<T>` instance using the `As()`
  /// method:
  ///
  ///     Napi::TypedArray array = ...
  ///     if (t.TypedArrayType() == napi_int32_array) {
  ///         Napi::Int32Array int32Array = t.As<Napi::Int32Array>();
  ///     }
  class TypedArray : public Object {
  public:
    TypedArray();                               ///< Creates a new _empty_ TypedArray instance.
    TypedArray(napi_env env,
               napi_value value);  ///< Wraps a Node-API value primitive.

    napi_typedarray_type TypedArrayType() const; ///< Gets the type of this typed-array.
    Napi::ArrayBuffer ArrayBuffer() const;       ///< Gets the backing array buffer.

    uint8_t ElementSize() const;  ///< Gets the size in bytes of one element in the array.
    size_t ElementLength() const; ///< Gets the number of elements in the array.
    size_t ByteOffset() const;    ///< Gets the offset into the buffer where the array starts.
    size_t ByteLength() const;    ///< Gets the length of the array in bytes.

  protected:
    /// !cond INTERNAL
    napi_typedarray_type _type;
    size_t _length;

    TypedArray(napi_env env, napi_value value, napi_typedarray_type type, size_t length);

    static const napi_typedarray_type unknown_array_type = static_cast<napi_typedarray_type>(-1);

    template <typename T>
    static
#if defined(NAPI_HAS_CONSTEXPR)
    constexpr
#endif
    napi_typedarray_type TypedArrayTypeForPrimitiveType() {
      return std::is_same<T, int8_t>::value ? napi_int8_array
        : std::is_same<T, uint8_t>::value ? napi_uint8_array
        : std::is_same<T, int16_t>::value ? napi_int16_array
        : std::is_same<T, uint16_t>::value ? napi_uint16_array
        : std::is_same<T, int32_t>::value ? napi_int32_array
        : std::is_same<T, uint32_t>::value ? napi_uint32_array
        : std::is_same<T, float>::value ? napi_float32_array
        : std::is_same<T, double>::value ? napi_float64_array
#if NAPI_VERSION > 5
        : std::is_same<T, int64_t>::value ? napi_bigint64_array
        : std::is_same<T, uint64_t>::value ? napi_biguint64_array
#endif  // NAPI_VERSION > 5
        : unknown_array_type;
    }
    /// !endcond
  };

  /// A JavaScript typed-array value with known array type.
  ///
  /// Note while it is possible to create and access Uint8 "clamped" arrays using this class,
  /// the _clamping_ behavior is only applied in JavaScript.
  template <typename T>
  class TypedArrayOf : public TypedArray {
  public:
    /// Creates a new TypedArray instance over a new automatically-allocated array buffer.
    ///
    /// The array type parameter can normally be omitted (because it is inferred from the template
    /// parameter T), except when creating a "clamped" array:
    ///
    ///     Uint8Array::New(env, length, napi_uint8_clamped_array)
   static TypedArrayOf New(
       napi_env env,          ///< Node-API environment
       size_t elementLength,  ///< Length of the created array, as a number of
                              ///< elements
#if defined(NAPI_HAS_CONSTEXPR)
       napi_typedarray_type type =
           TypedArray::TypedArrayTypeForPrimitiveType<T>()
#else
       napi_typedarray_type type
#endif
       ///< Type of array, if different from the default array type for the
       ///< template parameter T.
   );

    /// Creates a new TypedArray instance over a provided array buffer.
    ///
    /// The array type parameter can normally be omitted (because it is inferred from the template
    /// parameter T), except when creating a "clamped" array:
    ///
    ///     Uint8Array::New(env, length, buffer, 0, napi_uint8_clamped_array)
   static TypedArrayOf New(
       napi_env env,          ///< Node-API environment
       size_t elementLength,  ///< Length of the created array, as a number of
                              ///< elements
       Napi::ArrayBuffer arrayBuffer,  ///< Backing array buffer instance to use
       size_t bufferOffset,  ///< Offset into the array buffer where the
                             ///< typed-array starts
#if defined(NAPI_HAS_CONSTEXPR)
       napi_typedarray_type type =
           TypedArray::TypedArrayTypeForPrimitiveType<T>()
#else
       napi_typedarray_type type
#endif
       ///< Type of array, if different from the default array type for the
       ///< template parameter T.
   );

    TypedArrayOf();                               ///< Creates a new _empty_ TypedArrayOf instance.
    TypedArrayOf(napi_env env,
                 napi_value value);  ///< Wraps a Node-API value primitive.

    T& operator [](size_t index);             ///< Gets or sets an element in the array.
    const T& operator [](size_t index) const; ///< Gets an element in the array.

    /// Gets a pointer to the array's backing buffer.
    ///
    /// This is not necessarily the same as the `ArrayBuffer::Data()` pointer, because the
    /// typed-array may have a non-zero `ByteOffset()` into the `ArrayBuffer`.
    T* Data();

    /// Gets a pointer to the array's backing buffer.
    ///
    /// This is not necessarily the same as the `ArrayBuffer::Data()` pointer, because the
    /// typed-array may have a non-zero `ByteOffset()` into the `ArrayBuffer`.
    const T* Data() const;

  private:
    T* _data;

    TypedArrayOf(napi_env env,
                 napi_value value,
                 napi_typedarray_type type,
                 size_t length,
                 T* data);
  };

  /// The DataView provides a low-level interface for reading/writing multiple
  /// number types in an ArrayBuffer irrespective of the platform's endianness.
  class DataView : public Object {
  public:
    static DataView New(napi_env env,
                        Napi::ArrayBuffer arrayBuffer);
    static DataView New(napi_env env,
                        Napi::ArrayBuffer arrayBuffer,
                        size_t byteOffset);
    static DataView New(napi_env env,
                        Napi::ArrayBuffer arrayBuffer,
                        size_t byteOffset,
                        size_t byteLength);

    DataView();                               ///< Creates a new _empty_ DataView instance.
    DataView(napi_env env,
             napi_value value);  ///< Wraps a Node-API value primitive.

    Napi::ArrayBuffer ArrayBuffer() const;    ///< Gets the backing array buffer.
    size_t ByteOffset() const;    ///< Gets the offset into the buffer where the array starts.
    size_t ByteLength() const;    ///< Gets the length of the array in bytes.

    void* Data() const;

    float GetFloat32(size_t byteOffset) const;
    double GetFloat64(size_t byteOffset) const;
    int8_t GetInt8(size_t byteOffset) const;
    int16_t GetInt16(size_t byteOffset) const;
    int32_t GetInt32(size_t byteOffset) const;
    uint8_t GetUint8(size_t byteOffset) const;
    uint16_t GetUint16(size_t byteOffset) const;
    uint32_t GetUint32(size_t byteOffset) const;

    void SetFloat32(size_t byteOffset, float value) const;
    void SetFloat64(size_t byteOffset, double value) const;
    void SetInt8(size_t byteOffset, int8_t value) const;
    void SetInt16(size_t byteOffset, int16_t value) const;
    void SetInt32(size_t byteOffset, int32_t value) const;
    void SetUint8(size_t byteOffset, uint8_t value) const;
    void SetUint16(size_t byteOffset, uint16_t value) const;
    void SetUint32(size_t byteOffset, uint32_t value) const;

  private:
    template <typename T>
    T ReadData(size_t byteOffset) const;

    template <typename T>
    void WriteData(size_t byteOffset, T value) const;

    void* _data;
    size_t _length;
  };

  class Function : public Object {
  public:
   using VoidCallback = void (*)(const CallbackInfo& info);
   using Callback = Value (*)(const CallbackInfo& info);

   template <VoidCallback cb>
   static Function New(napi_env env,
                       const char* utf8name = nullptr,
                       void* data = nullptr);

   template <Callback cb>
   static Function New(napi_env env,
                       const char* utf8name = nullptr,
                       void* data = nullptr);

   template <VoidCallback cb>
   static Function New(napi_env env,
                       const std::string& utf8name,
                       void* data = nullptr);

   template <Callback cb>
   static Function New(napi_env env,
                       const std::string& utf8name,
                       void* data = nullptr);

   /// Callable must implement operator() accepting a const CallbackInfo&
   /// and return either void or Value.
   template <typename Callable>
   static Function New(napi_env env,
                       Callable cb,
                       const char* utf8name = nullptr,
                       void* data = nullptr);
   /// Callable must implement operator() accepting a const CallbackInfo&
   /// and return either void or Value.
   template <typename Callable>
   static Function New(napi_env env,
                       Callable cb,
                       const std::string& utf8name,
                       void* data = nullptr);

   Function();
   Function(napi_env env, napi_value value);

   MaybeOrValue<Value> operator()(
       const std::initializer_list<napi_value>& args) const;

   MaybeOrValue<Value> Call(
       const std::initializer_list<napi_value>& args) const;
   MaybeOrValue<Value> Call(const std::vector<napi_value>& args) const;
   MaybeOrValue<Value> Call(size_t argc, const napi_value* args) const;
   MaybeOrValue<Value> Call(
       napi_value recv, const std::initializer_list<napi_value>& args) const;
   MaybeOrValue<Value> Call(napi_value recv,
                            const std::vector<napi_value>& args) const;
   MaybeOrValue<Value> Call(napi_value recv,
                            size_t argc,
                            const napi_value* args) const;

   MaybeOrValue<Value> MakeCallback(
       napi_value recv,
       const std::initializer_list<napi_value>& args,
       napi_async_context context = nullptr) const;
   MaybeOrValue<Value> MakeCallback(napi_value recv,
                                    const std::vector<napi_value>& args,
                                    napi_async_context context = nullptr) const;
   MaybeOrValue<Value> MakeCallback(napi_value recv,
                                    size_t argc,
                                    const napi_value* args,
                                    napi_async_context context = nullptr) const;

   MaybeOrValue<Object> New(
       const std::initializer_list<napi_value>& args) const;
   MaybeOrValue<Object> New(const std::vector<napi_value>& args) const;
   MaybeOrValue<Object> New(size_t argc, const napi_value* args) const;
  };

  class Promise : public Object {
  public:
    class Deferred {
    public:
      static Deferred New(napi_env env);
      Deferred(napi_env env);

      Napi::Promise Promise() const;
      Napi::Env Env() const;

      void Resolve(napi_value value) const;
      void Reject(napi_value value) const;

    private:
      napi_env _env;
      napi_deferred _deferred;
      napi_value _promise;
    };

    Promise(napi_env env, napi_value value);
  };

  template <typename T>
  class Buffer : public Uint8Array {
  public:
    static Buffer<T> New(napi_env env, size_t length);
    static Buffer<T> New(napi_env env, T* data, size_t length);

    // Finalizer must implement `void operator()(Env env, T* data)`.
    template <typename Finalizer>
    static Buffer<T> New(napi_env env, T* data,
                         size_t length,
                         Finalizer finalizeCallback);
    // Finalizer must implement `void operator()(Env env, T* data, Hint* hint)`.
    template <typename Finalizer, typename Hint>
    static Buffer<T> New(napi_env env, T* data,
                         size_t length,
                         Finalizer finalizeCallback,
                         Hint* finalizeHint);

    static Buffer<T> Copy(napi_env env, const T* data, size_t length);

    Buffer();
    Buffer(napi_env env, napi_value value);
    size_t Length() const;
    T* Data() const;

  private:
    mutable size_t _length;
    mutable T* _data;

    Buffer(napi_env env, napi_value value, size_t length, T* data);
    void EnsureInfo() const;
  };

  /// Holds a counted reference to a value; initially a weak reference unless otherwise specified,
  /// may be changed to/from a strong reference by adjusting the refcount.
  ///
  /// The referenced value is not immediately destroyed when the reference count is zero; it is
  /// merely then eligible for garbage-collection if there are no other references to the value.
  template <typename T>
  class Reference {
  public:
    static Reference<T> New(const T& value, uint32_t initialRefcount = 0);

    Reference();
    Reference(napi_env env, napi_ref ref);
    ~Reference();

    // A reference can be moved but cannot be copied.
    Reference(Reference<T>&& other);
    Reference<T>& operator =(Reference<T>&& other);
    NAPI_DISALLOW_ASSIGN(Reference<T>)

    operator napi_ref() const;
    bool operator ==(const Reference<T> &other) const;
    bool operator !=(const Reference<T> &other) const;

    Napi::Env Env() const;
    bool IsEmpty() const;

    // Note when getting the value of a Reference it is usually correct to do so
    // within a HandleScope so that the value handle gets cleaned up efficiently.
    T Value() const;

    uint32_t Ref();
    uint32_t Unref();
    void Reset();
    void Reset(const T& value, uint32_t refcount = 0);

    // Call this on a reference that is declared as static data, to prevent its
    // destructor from running at program shutdown time, which would attempt to
    // reset the reference when the environment is no longer valid. Avoid using
    // this if at all possible. If you do need to use static data, MAKE SURE to
    // warn your users that your addon is NOT threadsafe.
    void SuppressDestruct();

  protected:
    Reference(const Reference<T>&);

    /// !cond INTERNAL
    napi_env _env;
    napi_ref _ref;
    /// !endcond

  private:
    bool _suppressDestruct;
  };

  class ObjectReference: public Reference<Object> {
  public:
    ObjectReference();
    ObjectReference(napi_env env, napi_ref ref);

    // A reference can be moved but cannot be copied.
    ObjectReference(Reference<Object>&& other);
    ObjectReference& operator =(Reference<Object>&& other);
    ObjectReference(ObjectReference&& other);
    ObjectReference& operator =(ObjectReference&& other);
    NAPI_DISALLOW_ASSIGN(ObjectReference)

    MaybeOrValue<Napi::Value> Get(const char* utf8name) const;
    MaybeOrValue<Napi::Value> Get(const std::string& utf8name) const;
    MaybeOrValue<bool> Set(const char* utf8name, napi_value value);
    MaybeOrValue<bool> Set(const char* utf8name, Napi::Value value);
    MaybeOrValue<bool> Set(const char* utf8name, const char* utf8value);
    MaybeOrValue<bool> Set(const char* utf8name, bool boolValue);
    MaybeOrValue<bool> Set(const char* utf8name, double numberValue);
    MaybeOrValue<bool> Set(const std::string& utf8name, napi_value value);
    MaybeOrValue<bool> Set(const std::string& utf8name, Napi::Value value);
    MaybeOrValue<bool> Set(const std::string& utf8name, std::string& utf8value);
    MaybeOrValue<bool> Set(const std::string& utf8name, bool boolValue);
    MaybeOrValue<bool> Set(const std::string& utf8name, double numberValue);

    MaybeOrValue<Napi::Value> Get(uint32_t index) const;
    MaybeOrValue<bool> Set(uint32_t index, const napi_value value);
    MaybeOrValue<bool> Set(uint32_t index, const Napi::Value value);
    MaybeOrValue<bool> Set(uint32_t index, const char* utf8value);
    MaybeOrValue<bool> Set(uint32_t index, const std::string& utf8value);
    MaybeOrValue<bool> Set(uint32_t index, bool boolValue);
    MaybeOrValue<bool> Set(uint32_t index, double numberValue);

   protected:
    ObjectReference(const ObjectReference&);
  };

  class FunctionReference: public Reference<Function> {
  public:
    FunctionReference();
    FunctionReference(napi_env env, napi_ref ref);

    // A reference can be moved but cannot be copied.
    FunctionReference(Reference<Function>&& other);
    FunctionReference& operator =(Reference<Function>&& other);
    FunctionReference(FunctionReference&& other);
    FunctionReference& operator =(FunctionReference&& other);
    NAPI_DISALLOW_ASSIGN_COPY(FunctionReference)

    MaybeOrValue<Napi::Value> operator()(
        const std::initializer_list<napi_value>& args) const;

    MaybeOrValue<Napi::Value> Call(
        const std::initializer_list<napi_value>& args) const;
    MaybeOrValue<Napi::Value> Call(const std::vector<napi_value>& args) const;
    MaybeOrValue<Napi::Value> Call(
        napi_value recv, const std::initializer_list<napi_value>& args) const;
    MaybeOrValue<Napi::Value> Call(napi_value recv,
                                   const std::vector<napi_value>& args) const;
    MaybeOrValue<Napi::Value> Call(napi_value recv,
                                   size_t argc,
                                   const napi_value* args) const;

    MaybeOrValue<Napi::Value> MakeCallback(
        napi_value recv,
        const std::initializer_list<napi_value>& args,
        napi_async_context context = nullptr) const;
    MaybeOrValue<Napi::Value> MakeCallback(
        napi_value recv,
        const std::vector<napi_value>& args,
        napi_async_context context = nullptr) const;
    MaybeOrValue<Napi::Value> MakeCallback(
        napi_value recv,
        size_t argc,
        const napi_value* args,
        napi_async_context context = nullptr) const;

    MaybeOrValue<Object> New(
        const std::initializer_list<napi_value>& args) const;
    MaybeOrValue<Object> New(const std::vector<napi_value>& args) const;
  };

  // Shortcuts to creating a new reference with inferred type and refcount = 0.
  template <typename T> Reference<T> Weak(T value);
  ObjectReference Weak(Object value);
  FunctionReference Weak(Function value);

  // Shortcuts to creating a new reference with inferred type and refcount = 1.
  template <typename T> Reference<T> Persistent(T value);
  ObjectReference Persistent(Object value);
  FunctionReference Persistent(Function value);

  /// A persistent reference to a JavaScript error object. Use of this class
  /// depends somewhat on whether C++ exceptions are enabled at compile time.
  ///
  /// ### Handling Errors With C++ Exceptions
  ///
  /// If C++ exceptions are enabled, then the `Error` class extends
  /// `std::exception` and enables integrated error-handling for C++ exceptions
  /// and JavaScript exceptions.
  ///
  /// If a Node-API call fails without executing any JavaScript code (for
  /// example due to an invalid argument), then the Node-API wrapper
  /// automatically converts and throws the error as a C++ exception of type
  /// `Napi::Error`. Or if a JavaScript function called by C++ code via Node-API
  /// throws a JavaScript exception, then the Node-API wrapper automatically
  /// converts and throws it as a C++ exception of type `Napi::Error`.
  ///
  /// If a C++ exception of type `Napi::Error` escapes from a Node-API C++
  /// callback, then the Node-API wrapper automatically converts and throws it
  /// as a JavaScript exception. Therefore, catching a C++ exception of type
  /// `Napi::Error` prevents a JavaScript exception from being thrown.
  ///
  /// #### Example 1A - Throwing a C++ exception:
  ///
  ///     Napi::Env env = ...
  ///     throw Napi::Error::New(env, "Example exception");
  ///
  /// Following C++ statements will not be executed. The exception will bubble
  /// up as a C++ exception of type `Napi::Error`, until it is either caught
  /// while still in C++, or else automatically propataged as a JavaScript
  /// exception when the callback returns to JavaScript.
  ///
  /// #### Example 2A - Propagating a Node-API C++ exception:
  ///
  ///     Napi::Function jsFunctionThatThrows = someObj.As<Napi::Function>();
  ///     Napi::Value result = jsFunctionThatThrows({ arg1, arg2 });
  ///
  /// Following C++ statements will not be executed. The exception will bubble
  /// up as a C++ exception of type `Napi::Error`, until it is either caught
  /// while still in C++, or else automatically propagated as a JavaScript
  /// exception when the callback returns to JavaScript.
  ///
  /// #### Example 3A - Handling a Node-API C++ exception:
  ///
  ///     Napi::Function jsFunctionThatThrows = someObj.As<Napi::Function>();
  ///     Napi::Value result;
  ///     try {
  ///        result = jsFunctionThatThrows({ arg1, arg2 });
  ///     } catch (const Napi::Error& e) {
  ///       cerr << "Caught JavaScript exception: " + e.what();
  ///     }
  ///
  /// Since the exception was caught here, it will not be propagated as a
  /// JavaScript exception.
  ///
  /// ### Handling Errors Without C++ Exceptions
  ///
  /// If C++ exceptions are disabled (by defining `NAPI_DISABLE_CPP_EXCEPTIONS`)
  /// then this class does not extend `std::exception`, and APIs in the `Napi`
  /// namespace do not throw C++ exceptions when they fail. Instead, they raise
  /// _pending_ JavaScript exceptions and return _empty_ `Value`s. Calling code
  /// should check `Value::IsEmpty()` before attempting to use a returned value,
  /// and may use methods on the `Env` class to check for, get, and clear a
  /// pending JavaScript exception. If the pending exception is not cleared, it
  /// will be thrown when the native callback returns to JavaScript.
  ///
  /// #### Example 1B - Throwing a JS exception
  ///
  ///     Napi::Env env = ...
  ///     Napi::Error::New(env, "Example
  ///     exception").ThrowAsJavaScriptException(); return;
  ///
  /// After throwing a JS exception, the code should generally return
  /// immediately from the native callback, after performing any necessary
  /// cleanup.
  ///
  /// #### Example 2B - Propagating a Node-API JS exception:
  ///
  ///     Napi::Function jsFunctionThatThrows = someObj.As<Napi::Function>();
  ///     Napi::Value result = jsFunctionThatThrows({ arg1, arg2 });
  ///     if (result.IsEmpty()) return;
  ///
  /// An empty value result from a Node-API call indicates an error occurred,
  /// and a JavaScript exception is pending. To let the exception propagate, the
  /// code should generally return immediately from the native callback, after
  /// performing any necessary cleanup.
  ///
  /// #### Example 3B - Handling a Node-API JS exception:
  ///
  ///     Napi::Function jsFunctionThatThrows = someObj.As<Napi::Function>();
  ///     Napi::Value result = jsFunctionThatThrows({ arg1, arg2 });
  ///     if (result.IsEmpty()) {
  ///       Napi::Error e = env.GetAndClearPendingException();
  ///       cerr << "Caught JavaScript exception: " + e.Message();
  ///     }
  ///
  /// Since the exception was cleared here, it will not be propagated as a
  /// JavaScript exception after the native callback returns.
  class Error : public ObjectReference
#ifdef NAPI_CPP_EXCEPTIONS
    , public std::exception
#endif // NAPI_CPP_EXCEPTIONS
    {
  public:
    static Error New(napi_env env);
    static Error New(napi_env env, const char* message);
    static Error New(napi_env env, const std::string& message);

    static NAPI_NO_RETURN void Fatal(const char* location, const char* message);

    Error();
    Error(napi_env env, napi_value value);

    // An error can be moved or copied.
    Error(Error&& other);
    Error& operator =(Error&& other);
    Error(const Error&);
    Error& operator =(const Error&);

    const std::string& Message() const NAPI_NOEXCEPT;
    void ThrowAsJavaScriptException() const;

    Object Value() const;

#ifdef NAPI_CPP_EXCEPTIONS
    const char* what() const NAPI_NOEXCEPT override;
#endif // NAPI_CPP_EXCEPTIONS

  protected:
    /// !cond INTERNAL
   using create_error_fn = napi_status (*)(napi_env envb,
                                           napi_value code,
                                           napi_value msg,
                                           napi_value* result);

   template <typename TError>
   static TError New(napi_env env,
                     const char* message,
                     size_t length,
                     create_error_fn create_error);
   /// !endcond

  private:
   const char* ERROR_WRAP_VALUE =
       "4bda9e7e-4913-4dbc-95de-891cbf66598e-errorVal";
   mutable std::string _message;
  };

  class TypeError : public Error {
  public:
    static TypeError New(napi_env env, const char* message);
    static TypeError New(napi_env env, const std::string& message);

    TypeError();
    TypeError(napi_env env, napi_value value);
  };

  class RangeError : public Error {
  public:
    static RangeError New(napi_env env, const char* message);
    static RangeError New(napi_env env, const std::string& message);

    RangeError();
    RangeError(napi_env env, napi_value value);
  };

  class CallbackInfo {
  public:
    CallbackInfo(napi_env env, napi_callback_info info);
    ~CallbackInfo();

    // Disallow copying to prevent multiple free of _dynamicArgs
    NAPI_DISALLOW_ASSIGN_COPY(CallbackInfo)

    Napi::Env Env() const;
    Value NewTarget() const;
    bool IsConstructCall() const;
    size_t Length() const;
    const Value operator [](size_t index) const;
    Value This() const;
    void* Data() const;
    void SetData(void* data);

  private:
    const size_t _staticArgCount = 6;
    napi_env _env;
    napi_callback_info _info;
    napi_value _this;
    size_t _argc;
    napi_value* _argv;
    napi_value _staticArgs[6];
    napi_value* _dynamicArgs;
    void* _data;
  };

  class PropertyDescriptor {
  public:
   using GetterCallback = Napi::Value (*)(const Napi::CallbackInfo& info);
   using SetterCallback = void (*)(const Napi::CallbackInfo& info);

#ifndef NODE_ADDON_API_DISABLE_DEPRECATED
    template <typename Getter>
    static PropertyDescriptor Accessor(const char* utf8name,
                                       Getter getter,
                                       napi_property_attributes attributes = napi_default,
                                       void* data = nullptr);
    template <typename Getter>
    static PropertyDescriptor Accessor(const std::string& utf8name,
                                       Getter getter,
                                       napi_property_attributes attributes = napi_default,
                                       void* data = nullptr);
    template <typename Getter>
    static PropertyDescriptor Accessor(napi_value name,
                                       Getter getter,
                                       napi_property_attributes attributes = napi_default,
                                       void* data = nullptr);
    template <typename Getter>
    static PropertyDescriptor Accessor(Name name,
                                       Getter getter,
                                       napi_property_attributes attributes = napi_default,
                                       void* data = nullptr);
    template <typename Getter, typename Setter>
    static PropertyDescriptor Accessor(const char* utf8name,
                                       Getter getter,
                                       Setter setter,
                                       napi_property_attributes attributes = napi_default,
                                       void* data = nullptr);
    template <typename Getter, typename Setter>
    static PropertyDescriptor Accessor(const std::string& utf8name,
                                       Getter getter,
                                       Setter setter,
                                       napi_property_attributes attributes = napi_default,
                                       void* data = nullptr);
    template <typename Getter, typename Setter>
    static PropertyDescriptor Accessor(napi_value name,
                                       Getter getter,
                                       Setter setter,
                                       napi_property_attributes attributes = napi_default,
                                       void* data = nullptr);
    template <typename Getter, typename Setter>
    static PropertyDescriptor Accessor(Name name,
                                       Getter getter,
                                       Setter setter,
                                       napi_property_attributes attributes = napi_default,
                                       void* data = nullptr);
    template <typename Callable>
    static PropertyDescriptor Function(const char* utf8name,
                                       Callable cb,
                                       napi_property_attributes attributes = napi_default,
                                       void* data = nullptr);
    template <typename Callable>
    static PropertyDescriptor Function(const std::string& utf8name,
                                       Callable cb,
                                       napi_property_attributes attributes = napi_default,
                                       void* data = nullptr);
    template <typename Callable>
    static PropertyDescriptor Function(napi_value name,
                                       Callable cb,
                                       napi_property_attributes attributes = napi_default,
                                       void* data = nullptr);
    template <typename Callable>
    static PropertyDescriptor Function(Name name,
                                       Callable cb,
                                       napi_property_attributes attributes = napi_default,
                                       void* data = nullptr);
#endif // !NODE_ADDON_API_DISABLE_DEPRECATED

    template <GetterCallback Getter>
    static PropertyDescriptor Accessor(const char* utf8name,
                                       napi_property_attributes attributes = napi_default,
                                       void* data = nullptr);

    template <GetterCallback Getter>
    static PropertyDescriptor Accessor(const std::string& utf8name,
                                       napi_property_attributes attributes = napi_default,
                                       void* data = nullptr);

    template <GetterCallback Getter>
    static PropertyDescriptor Accessor(Name name,
                                       napi_property_attributes attributes = napi_default,
                                       void* data = nullptr);

    template <GetterCallback Getter, SetterCallback Setter>
    static PropertyDescriptor Accessor(const char* utf8name,
                                       napi_property_attributes attributes = napi_default,
                                       void* data = nullptr);

    template <GetterCallback Getter, SetterCallback Setter>
    static PropertyDescriptor Accessor(const std::string& utf8name,
                                       napi_property_attributes attributes = napi_default,
                                       void* data = nullptr);

    template <GetterCallback Getter, SetterCallback Setter>
    static PropertyDescriptor Accessor(Name name,
                                       napi_property_attributes attributes = napi_default,
                                       void* data = nullptr);

    template <typename Getter>
    static PropertyDescriptor Accessor(Napi::Env env,
                                       Napi::Object object,
                                       const char* utf8name,
                                       Getter getter,
                                       napi_property_attributes attributes = napi_default,
                                       void* data = nullptr);
    template <typename Getter>
    static PropertyDescriptor Accessor(Napi::Env env,
                                       Napi::Object object,
                                       const std::string& utf8name,
                                       Getter getter,
                                       napi_property_attributes attributes = napi_default,
                                       void* data = nullptr);
    template <typename Getter>
    static PropertyDescriptor Accessor(Napi::Env env,
                                       Napi::Object object,
                                       Name name,
                                       Getter getter,
                                       napi_property_attributes attributes = napi_default,
                                       void* data = nullptr);
    template <typename Getter, typename Setter>
    static PropertyDescriptor Accessor(Napi::Env env,
                                       Napi::Object object,
                                       const char* utf8name,
                                       Getter getter,
                                       Setter setter,
                                       napi_property_attributes attributes = napi_default,
                                       void* data = nullptr);
    template <typename Getter, typename Setter>
    static PropertyDescriptor Accessor(Napi::Env env,
                                       Napi::Object object,
                                       const std::string& utf8name,
                                       Getter getter,
                                       Setter setter,
                                       napi_property_attributes attributes = napi_default,
                                       void* data = nullptr);
    template <typename Getter, typename Setter>
    static PropertyDescriptor Accessor(Napi::Env env,
                                       Napi::Object object,
                                       Name name,
                                       Getter getter,
                                       Setter setter,
                                       napi_property_attributes attributes = napi_default,
                                       void* data = nullptr);
    template <typename Callable>
    static PropertyDescriptor Function(Napi::Env env,
                                       Napi::Object object,
                                       const char* utf8name,
                                       Callable cb,
                                       napi_property_attributes attributes = napi_default,
                                       void* data = nullptr);
    template <typename Callable>
    static PropertyDescriptor Function(Napi::Env env,
                                       Napi::Object object,
                                       const std::string& utf8name,
                                       Callable cb,
                                       napi_property_attributes attributes = napi_default,
                                       void* data = nullptr);
    template <typename Callable>
    static PropertyDescriptor Function(Napi::Env env,
                                       Napi::Object object,
                                       Name name,
                                       Callable cb,
                                       napi_property_attributes attributes = napi_default,
                                       void* data = nullptr);
    static PropertyDescriptor Value(const char* utf8name,
                                    napi_value value,
                                    napi_property_attributes attributes = napi_default);
    static PropertyDescriptor Value(const std::string& utf8name,
                                    napi_value value,
                                    napi_property_attributes attributes = napi_default);
    static PropertyDescriptor Value(napi_value name,
                                    napi_value value,
                                    napi_property_attributes attributes = napi_default);
    static PropertyDescriptor Value(Name name,
                                    Napi::Value value,
                                    napi_property_attributes attributes = napi_default);

    PropertyDescriptor(napi_property_descriptor desc);

    operator napi_property_descriptor&();
    operator const napi_property_descriptor&() const;

  private:
    napi_property_descriptor _desc;
  };

  /// Property descriptor for use with `ObjectWrap::DefineClass()`.
  ///
  /// This is different from the standalone `PropertyDescriptor` because it is specific to each
  /// `ObjectWrap<T>` subclass. This prevents using descriptors from a different class when
  /// defining a new class (preventing the callbacks from having incorrect `this` pointers).
  template <typename T>
  class ClassPropertyDescriptor {
  public:
    ClassPropertyDescriptor(napi_property_descriptor desc) : _desc(desc) {}

    operator napi_property_descriptor&() { return _desc; }
    operator const napi_property_descriptor&() const { return _desc; }

  private:
    napi_property_descriptor _desc;
  };

  template <typename T, typename TCallback>
  struct MethodCallbackData {
    TCallback callback;
    void* data;
  };

  template <typename T, typename TGetterCallback, typename TSetterCallback>
  struct AccessorCallbackData {
    TGetterCallback getterCallback;
    TSetterCallback setterCallback;
    void* data;
  };

  template <typename T>
  class InstanceWrap {
   public:
    using InstanceVoidMethodCallback = void (T::*)(const CallbackInfo& info);
    using InstanceMethodCallback = Napi::Value (T::*)(const CallbackInfo& info);
    using InstanceGetterCallback = Napi::Value (T::*)(const CallbackInfo& info);
    using InstanceSetterCallback = void (T::*)(const CallbackInfo& info,
                                               const Napi::Value& value);

    using PropertyDescriptor = ClassPropertyDescriptor<T>;

    static PropertyDescriptor InstanceMethod(const char* utf8name,
                                             InstanceVoidMethodCallback method,
                                             napi_property_attributes attributes = napi_default,
                                             void* data = nullptr);
    static PropertyDescriptor InstanceMethod(const char* utf8name,
                                             InstanceMethodCallback method,
                                             napi_property_attributes attributes = napi_default,
                                             void* data = nullptr);
    static PropertyDescriptor InstanceMethod(Symbol name,
                                             InstanceVoidMethodCallback method,
                                             napi_property_attributes attributes = napi_default,
                                             void* data = nullptr);
    static PropertyDescriptor InstanceMethod(Symbol name,
                                             InstanceMethodCallback method,
                                             napi_property_attributes attributes = napi_default,
                                             void* data = nullptr);
    template <InstanceVoidMethodCallback method>
    static PropertyDescriptor InstanceMethod(const char* utf8name,
                                             napi_property_attributes attributes = napi_default,
                                             void* data = nullptr);
    template <InstanceMethodCallback method>
    static PropertyDescriptor InstanceMethod(const char* utf8name,
                                             napi_property_attributes attributes = napi_default,
                                             void* data = nullptr);
    template <InstanceVoidMethodCallback method>
    static PropertyDescriptor InstanceMethod(Symbol name,
                                             napi_property_attributes attributes = napi_default,
                                             void* data = nullptr);
    template <InstanceMethodCallback method>
    static PropertyDescriptor InstanceMethod(Symbol name,
                                             napi_property_attributes attributes = napi_default,
                                             void* data = nullptr);
    static PropertyDescriptor InstanceAccessor(const char* utf8name,
                                               InstanceGetterCallback getter,
                                               InstanceSetterCallback setter,
                                               napi_property_attributes attributes = napi_default,
                                               void* data = nullptr);
    static PropertyDescriptor InstanceAccessor(Symbol name,
                                               InstanceGetterCallback getter,
                                               InstanceSetterCallback setter,
                                               napi_property_attributes attributes = napi_default,
                                               void* data = nullptr);
    template <InstanceGetterCallback getter, InstanceSetterCallback setter=nullptr>
    static PropertyDescriptor InstanceAccessor(const char* utf8name,
                                               napi_property_attributes attributes = napi_default,
                                               void* data = nullptr);
    template <InstanceGetterCallback getter, InstanceSetterCallback setter=nullptr>
    static PropertyDescriptor InstanceAccessor(Symbol name,
                                               napi_property_attributes attributes = napi_default,
                                               void* data = nullptr);
    static PropertyDescriptor InstanceValue(const char* utf8name,
                                            Napi::Value value,
                                            napi_property_attributes attributes = napi_default);
    static PropertyDescriptor InstanceValue(Symbol name,
                                            Napi::Value value,
                                            napi_property_attributes attributes = napi_default);

   protected:
    static void AttachPropData(napi_env env, napi_value value, const napi_property_descriptor* prop);

   private:
    using This = InstanceWrap<T>;

    using InstanceVoidMethodCallbackData =
        MethodCallbackData<T, InstanceVoidMethodCallback>;
    using InstanceMethodCallbackData =
        MethodCallbackData<T, InstanceMethodCallback>;
    using InstanceAccessorCallbackData =
        AccessorCallbackData<T, InstanceGetterCallback, InstanceSetterCallback>;

    static napi_value InstanceVoidMethodCallbackWrapper(napi_env env, napi_callback_info info);
    static napi_value InstanceMethodCallbackWrapper(napi_env env, napi_callback_info info);
    static napi_value InstanceGetterCallbackWrapper(napi_env env, napi_callback_info info);
    static napi_value InstanceSetterCallbackWrapper(napi_env env, napi_callback_info info);

    template <InstanceSetterCallback method>
    static napi_value WrappedMethod(napi_env env,
                                    napi_callback_info info) NAPI_NOEXCEPT;

    template <InstanceSetterCallback setter> struct SetterTag {};

    template <InstanceSetterCallback setter>
    static napi_callback WrapSetter(SetterTag<setter>) NAPI_NOEXCEPT {
      return &This::WrappedMethod<setter>;
    }
    static napi_callback WrapSetter(SetterTag<nullptr>) NAPI_NOEXCEPT {
      return nullptr;
    }
  };

  /// Base class to be extended by C++ classes exposed to JavaScript; each C++ class instance gets
  /// "wrapped" by a JavaScript object that is managed by this class.
  ///
  /// At initialization time, the `DefineClass()` method must be used to
  /// hook up the accessor and method callbacks. It takes a list of
  /// property descriptors, which can be constructed via the various
  /// static methods on the base class.
  ///
  /// #### Example:
  ///
  ///     class Example: public Napi::ObjectWrap<Example> {
  ///       public:
  ///         static void Initialize(Napi::Env& env, Napi::Object& target) {
  ///           Napi::Function constructor = DefineClass(env, "Example", {
  ///             InstanceAccessor<&Example::GetSomething, &Example::SetSomething>("value"),
  ///             InstanceMethod<&Example::DoSomething>("doSomething"),
  ///           });
  ///           target.Set("Example", constructor);
  ///         }
  ///
  ///         Example(const Napi::CallbackInfo& info); // Constructor
  ///         Napi::Value GetSomething(const Napi::CallbackInfo& info);
  ///         void SetSomething(const Napi::CallbackInfo& info, const Napi::Value& value);
  ///         Napi::Value DoSomething(const Napi::CallbackInfo& info);
  ///     }
  template <typename T>
  class ObjectWrap : public InstanceWrap<T>, public Reference<Object> {
  public:
    ObjectWrap(const CallbackInfo& callbackInfo);
    virtual ~ObjectWrap();

    static T* Unwrap(Object wrapper);

    // Methods exposed to JavaScript must conform to one of these callback signatures.
    using StaticVoidMethodCallback = void (*)(const CallbackInfo& info);
    using StaticMethodCallback = Napi::Value (*)(const CallbackInfo& info);
    using StaticGetterCallback = Napi::Value (*)(const CallbackInfo& info);
    using StaticSetterCallback = void (*)(const CallbackInfo& info,
                                          const Napi::Value& value);

    using PropertyDescriptor = ClassPropertyDescriptor<T>;

    static Function DefineClass(Napi::Env env,
                                const char* utf8name,
                                const std::initializer_list<PropertyDescriptor>& properties,
                                void* data = nullptr);
    static Function DefineClass(Napi::Env env,
                                const char* utf8name,
                                const std::vector<PropertyDescriptor>& properties,
                                void* data = nullptr);
    static PropertyDescriptor StaticMethod(const char* utf8name,
                                           StaticVoidMethodCallback method,
                                           napi_property_attributes attributes = napi_default,
                                           void* data = nullptr);
    static PropertyDescriptor StaticMethod(const char* utf8name,
                                           StaticMethodCallback method,
                                           napi_property_attributes attributes = napi_default,
                                           void* data = nullptr);
    static PropertyDescriptor StaticMethod(Symbol name,
                                           StaticVoidMethodCallback method,
                                           napi_property_attributes attributes = napi_default,
                                           void* data = nullptr);
    static PropertyDescriptor StaticMethod(Symbol name,
                                           StaticMethodCallback method,
                                           napi_property_attributes attributes = napi_default,
                                           void* data = nullptr);
    template <StaticVoidMethodCallback method>
    static PropertyDescriptor StaticMethod(const char* utf8name,
                                           napi_property_attributes attributes = napi_default,
                                           void* data = nullptr);
    template <StaticVoidMethodCallback method>
    static PropertyDescriptor StaticMethod(Symbol name,
                                           napi_property_attributes attributes = napi_default,
                                           void* data = nullptr);
    template <StaticMethodCallback method>
    static PropertyDescriptor StaticMethod(const char* utf8name,
                                           napi_property_attributes attributes = napi_default,
                                           void* data = nullptr);
    template <StaticMethodCallback method>
    static PropertyDescriptor StaticMethod(Symbol name,
                                           napi_property_attributes attributes = napi_default,
                                           void* data = nullptr);
    static PropertyDescriptor StaticAccessor(const char* utf8name,
                                             StaticGetterCallback getter,
                                             StaticSetterCallback setter,
                                             napi_property_attributes attributes = napi_default,
                                             void* data = nullptr);
    static PropertyDescriptor StaticAccessor(Symbol name,
                                             StaticGetterCallback getter,
                                             StaticSetterCallback setter,
                                             napi_property_attributes attributes = napi_default,
                                             void* data = nullptr);
    template <StaticGetterCallback getter, StaticSetterCallback setter=nullptr>
    static PropertyDescriptor StaticAccessor(const char* utf8name,
                                             napi_property_attributes attributes = napi_default,
                                             void* data = nullptr);
    template <StaticGetterCallback getter, StaticSetterCallback setter=nullptr>
    static PropertyDescriptor StaticAccessor(Symbol name,
                                             napi_property_attributes attributes = napi_default,
                                             void* data = nullptr);
    static PropertyDescriptor StaticValue(const char* utf8name,
                                          Napi::Value value,
                                          napi_property_attributes attributes = napi_default);
    static PropertyDescriptor StaticValue(Symbol name,
                                          Napi::Value value,
                                          napi_property_attributes attributes = napi_default);
    virtual void Finalize(Napi::Env env);

  private:
    using This = ObjectWrap<T>;

    static napi_value ConstructorCallbackWrapper(napi_env env, napi_callback_info info);
    static napi_value StaticVoidMethodCallbackWrapper(napi_env env, napi_callback_info info);
    static napi_value StaticMethodCallbackWrapper(napi_env env, napi_callback_info info);
    static napi_value StaticGetterCallbackWrapper(napi_env env, napi_callback_info info);
    static napi_value StaticSetterCallbackWrapper(napi_env env, napi_callback_info info);
    static void FinalizeCallback(napi_env env, void* data, void* hint);
    static Function DefineClass(Napi::Env env,
                                const char* utf8name,
                                const size_t props_count,
                                const napi_property_descriptor* props,
                                void* data = nullptr);

    using StaticVoidMethodCallbackData =
        MethodCallbackData<T, StaticVoidMethodCallback>;
    using StaticMethodCallbackData =
        MethodCallbackData<T, StaticMethodCallback>;

    using StaticAccessorCallbackData =
        AccessorCallbackData<T, StaticGetterCallback, StaticSetterCallback>;

    template <StaticSetterCallback method>
    static napi_value WrappedMethod(napi_env env,
                                    napi_callback_info info) NAPI_NOEXCEPT;

    template <StaticSetterCallback setter> struct StaticSetterTag {};

    template <StaticSetterCallback setter>
    static napi_callback WrapStaticSetter(StaticSetterTag<setter>)
        NAPI_NOEXCEPT {
      return &This::WrappedMethod<setter>;
    }
    static napi_callback WrapStaticSetter(StaticSetterTag<nullptr>)
        NAPI_NOEXCEPT {
      return nullptr;
    }

    bool _construction_failed = true;
  };

  class HandleScope {
  public:
    HandleScope(napi_env env, napi_handle_scope scope);
    explicit HandleScope(Napi::Env env);
    ~HandleScope();

    // Disallow copying to prevent double close of napi_handle_scope
    NAPI_DISALLOW_ASSIGN_COPY(HandleScope)

    operator napi_handle_scope() const;

    Napi::Env Env() const;

  private:
    napi_env _env;
    napi_handle_scope _scope;
  };

  class EscapableHandleScope {
  public:
    EscapableHandleScope(napi_env env, napi_escapable_handle_scope scope);
    explicit EscapableHandleScope(Napi::Env env);
    ~EscapableHandleScope();

    // Disallow copying to prevent double close of napi_escapable_handle_scope
    NAPI_DISALLOW_ASSIGN_COPY(EscapableHandleScope)

    operator napi_escapable_handle_scope() const;

    Napi::Env Env() const;
    Value Escape(napi_value escapee);

  private:
    napi_env _env;
    napi_escapable_handle_scope _scope;
  };

#if (NAPI_VERSION > 2)
  class CallbackScope {
  public:
    CallbackScope(napi_env env, napi_callback_scope scope);
    CallbackScope(napi_env env, napi_async_context context);
    virtual ~CallbackScope();

    // Disallow copying to prevent double close of napi_callback_scope
    NAPI_DISALLOW_ASSIGN_COPY(CallbackScope)

    operator napi_callback_scope() const;

    Napi::Env Env() const;

  private:
    napi_env _env;
    napi_callback_scope _scope;
  };
#endif

  class AsyncContext {
  public:
    explicit AsyncContext(napi_env env, const char* resource_name);
    explicit AsyncContext(napi_env env, const char* resource_name, const Object& resource);
    virtual ~AsyncContext();

    AsyncContext(AsyncContext&& other);
    AsyncContext& operator =(AsyncContext&& other);
    NAPI_DISALLOW_ASSIGN_COPY(AsyncContext)

    operator napi_async_context() const;

    Napi::Env Env() const;

  private:
    napi_env _env;
    napi_async_context _context;
  };

  class AsyncWorker {
  public:
    virtual ~AsyncWorker();

    // An async worker can be moved but cannot be copied.
    AsyncWorker(AsyncWorker&& other);
    AsyncWorker& operator =(AsyncWorker&& other);
    NAPI_DISALLOW_ASSIGN_COPY(AsyncWorker)

    operator napi_async_work() const;

    Napi::Env Env() const;

    void Queue();
    void Cancel();
    void SuppressDestruct();

    ObjectReference& Receiver();
    FunctionReference& Callback();

    virtual void OnExecute(Napi::Env env);
    virtual void OnWorkComplete(Napi::Env env,
                                napi_status status);

  protected:
    explicit AsyncWorker(const Function& callback);
    explicit AsyncWorker(const Function& callback,
                         const char* resource_name);
    explicit AsyncWorker(const Function& callback,
                         const char* resource_name,
                         const Object& resource);
    explicit AsyncWorker(const Object& receiver,
                         const Function& callback);
    explicit AsyncWorker(const Object& receiver,
                         const Function& callback,
                         const char* resource_name);
    explicit AsyncWorker(const Object& receiver,
                         const Function& callback,
                         const char* resource_name,
                         const Object& resource);

    explicit AsyncWorker(Napi::Env env);
    explicit AsyncWorker(Napi::Env env,
                         const char* resource_name);
    explicit AsyncWorker(Napi::Env env,
                         const char* resource_name,
                         const Object& resource);

    virtual void Execute() = 0;
    virtual void OnOK();
    virtual void OnError(const Error& e);
    virtual void Destroy();
    virtual std::vector<napi_value> GetResult(Napi::Env env);

    void SetError(const std::string& error);

  private:
    static inline void OnAsyncWorkExecute(napi_env env, void* asyncworker);
    static inline void OnAsyncWorkComplete(napi_env env,
                                           napi_status status,
                                           void* asyncworker);

    napi_env _env;
    napi_async_work _work;
    ObjectReference _receiver;
    FunctionReference _callback;
    std::string _error;
    bool _suppress_destruct;
  };

  #if (NAPI_VERSION > 3 && !defined(__wasm32__))
  class ThreadSafeFunction {
  public:
    // This API may only be called from the main thread.
    template <typename ResourceString>
    static ThreadSafeFunction New(napi_env env,
                                  const Function& callback,
                                  ResourceString resourceName,
                                  size_t maxQueueSize,
                                  size_t initialThreadCount);

    // This API may only be called from the main thread.
    template <typename ResourceString, typename ContextType>
    static ThreadSafeFunction New(napi_env env,
                                  const Function& callback,
                                  ResourceString resourceName,
                                  size_t maxQueueSize,
                                  size_t initialThreadCount,
                                  ContextType* context);

    // This API may only be called from the main thread.
    template <typename ResourceString, typename Finalizer>
    static ThreadSafeFunction New(napi_env env,
                                  const Function& callback,
                                  ResourceString resourceName,
                                  size_t maxQueueSize,
                                  size_t initialThreadCount,
                                  Finalizer finalizeCallback);

    // This API may only be called from the main thread.
    template <typename ResourceString, typename Finalizer,
              typename FinalizerDataType>
    static ThreadSafeFunction New(napi_env env,
                                  const Function& callback,
                                  ResourceString resourceName,
                                  size_t maxQueueSize,
                                  size_t initialThreadCount,
                                  Finalizer finalizeCallback,
                                  FinalizerDataType* data);

    // This API may only be called from the main thread.
    template <typename ResourceString, typename ContextType, typename Finalizer>
    static ThreadSafeFunction New(napi_env env,
                                  const Function& callback,
                                  ResourceString resourceName,
                                  size_t maxQueueSize,
                                  size_t initialThreadCount,
                                  ContextType* context,
                                  Finalizer finalizeCallback);

    // This API may only be called from the main thread.
    template <typename ResourceString, typename ContextType,
              typename Finalizer, typename FinalizerDataType>
    static ThreadSafeFunction New(napi_env env,
                                  const Function& callback,
                                  ResourceString resourceName,
                                  size_t maxQueueSize,
                                  size_t initialThreadCount,
                                  ContextType* context,
                                  Finalizer finalizeCallback,
                                  FinalizerDataType* data);

    // This API may only be called from the main thread.
    template <typename ResourceString>
    static ThreadSafeFunction New(napi_env env,
                                  const Function& callback,
                                  const Object& resource,
                                  ResourceString resourceName,
                                  size_t maxQueueSize,
                                  size_t initialThreadCount);

    // This API may only be called from the main thread.
    template <typename ResourceString, typename ContextType>
    static ThreadSafeFunction New(napi_env env,
                                  const Function& callback,
                                  const Object& resource,
                                  ResourceString resourceName,
                                  size_t maxQueueSize,
                                  size_t initialThreadCount,
                                  ContextType* context);

    // This API may only be called from the main thread.
    template <typename ResourceString, typename Finalizer>
    static ThreadSafeFunction New(napi_env env,
                                  const Function& callback,
                                  const Object& resource,
                                  ResourceString resourceName,
                                  size_t maxQueueSize,
                                  size_t initialThreadCount,
                                  Finalizer finalizeCallback);

    // This API may only be called from the main thread.
    template <typename ResourceString, typename Finalizer,
              typename FinalizerDataType>
    static ThreadSafeFunction New(napi_env env,
                                  const Function& callback,
                                  const Object& resource,
                                  ResourceString resourceName,
                                  size_t maxQueueSize,
                                  size_t initialThreadCount,
                                  Finalizer finalizeCallback,
                                  FinalizerDataType* data);

    // This API may only be called from the main thread.
    template <typename ResourceString, typename ContextType, typename Finalizer>
    static ThreadSafeFunction New(napi_env env,
                                  const Function& callback,
                                  const Object& resource,
                                  ResourceString resourceName,
                                  size_t maxQueueSize,
                                  size_t initialThreadCount,
                                  ContextType* context,
                                  Finalizer finalizeCallback);

    // This API may only be called from the main thread.
    template <typename ResourceString, typename ContextType,
              typename Finalizer, typename FinalizerDataType>
    static ThreadSafeFunction New(napi_env env,
                                  const Function& callback,
                                  const Object& resource,
                                  ResourceString resourceName,
                                  size_t maxQueueSize,
                                  size_t initialThreadCount,
                                  ContextType* context,
                                  Finalizer finalizeCallback,
                                  FinalizerDataType* data);

    ThreadSafeFunction();
    ThreadSafeFunction(napi_threadsafe_function tsFunctionValue);

    operator napi_threadsafe_function() const;

    // This API may be called from any thread.
    napi_status BlockingCall() const;

    // This API may be called from any thread.
    template <typename Callback>
    napi_status BlockingCall(Callback callback) const;

    // This API may be called from any thread.
    template <typename DataType, typename Callback>
    napi_status BlockingCall(DataType* data, Callback callback) const;

    // This API may be called from any thread.
    napi_status NonBlockingCall() const;

    // This API may be called from any thread.
    template <typename Callback>
    napi_status NonBlockingCall(Callback callback) const;

    // This API may be called from any thread.
    template <typename DataType, typename Callback>
    napi_status NonBlockingCall(DataType* data, Callback callback) const;

    // This API may only be called from the main thread.
    void Ref(napi_env env) const;

    // This API may only be called from the main thread.
    void Unref(napi_env env) const;

    // This API may be called from any thread.
    napi_status Acquire() const;

    // This API may be called from any thread.
    napi_status Release();

    // This API may be called from any thread.
    napi_status Abort();

    struct ConvertibleContext
    {
      template <class T>
      operator T*() { return static_cast<T*>(context); }
      void* context;
    };

    // This API may be called from any thread.
    ConvertibleContext GetContext() const;

  private:
    using CallbackWrapper = std::function<void(Napi::Env, Napi::Function)>;

    template <typename ResourceString, typename ContextType,
              typename Finalizer, typename FinalizerDataType>
    static ThreadSafeFunction New(napi_env env,
                                  const Function& callback,
                                  const Object& resource,
                                  ResourceString resourceName,
                                  size_t maxQueueSize,
                                  size_t initialThreadCount,
                                  ContextType* context,
                                  Finalizer finalizeCallback,
                                  FinalizerDataType* data,
                                  napi_finalize wrapper);

    napi_status CallInternal(CallbackWrapper* callbackWrapper,
                        napi_threadsafe_function_call_mode mode) const;

    static void CallJS(napi_env env,
                       napi_value jsCallback,
                       void* context,
                       void* data);

    napi_threadsafe_function _tsfn;
  };

  // A TypedThreadSafeFunction by default has no context (nullptr) and can
  // accept any type (void) to its CallJs.
  template <typename ContextType = std::nullptr_t,
            typename DataType = void,
            void (*CallJs)(Napi::Env, Napi::Function, ContextType*, DataType*) =
                nullptr>
  class TypedThreadSafeFunction {
   public:
    // This API may only be called from the main thread.
    // Helper function that returns nullptr if running Node-API 5+, otherwise a
    // non-empty, no-op Function. This provides the ability to specify at
    // compile-time a callback parameter to `New` that safely does no action
    // when targeting _any_ Node-API version.
#if NAPI_VERSION > 4
    static std::nullptr_t EmptyFunctionFactory(Napi::Env env);
#else
    static Napi::Function EmptyFunctionFactory(Napi::Env env);
#endif
    static Napi::Function FunctionOrEmpty(Napi::Env env,
                                          Napi::Function& callback);

#if NAPI_VERSION > 4
    // This API may only be called from the main thread.
    // Creates a new threadsafe function with:
    //   Callback [missing] Resource [missing] Finalizer [missing]
    template <typename ResourceString>
    static TypedThreadSafeFunction<ContextType, DataType, CallJs> New(
        napi_env env,
        ResourceString resourceName,
        size_t maxQueueSize,
        size_t initialThreadCount,
        ContextType* context = nullptr);

    // This API may only be called from the main thread.
    // Creates a new threadsafe function with:
    //   Callback [missing] Resource [passed] Finalizer [missing]
    template <typename ResourceString>
    static TypedThreadSafeFunction<ContextType, DataType, CallJs> New(
        napi_env env,
        const Object& resource,
        ResourceString resourceName,
        size_t maxQueueSize,
        size_t initialThreadCount,
        ContextType* context = nullptr);

    // This API may only be called from the main thread.
    // Creates a new threadsafe function with:
    //   Callback [missing] Resource [missing] Finalizer [passed]
    template <typename ResourceString,
              typename Finalizer,
              typename FinalizerDataType = void>
    static TypedThreadSafeFunction<ContextType, DataType, CallJs> New(
        napi_env env,
        ResourceString resourceName,
        size_t maxQueueSize,
        size_t initialThreadCount,
        ContextType* context,
        Finalizer finalizeCallback,
        FinalizerDataType* data = nullptr);

    // This API may only be called from the main thread.
    // Creates a new threadsafe function with:
    //   Callback [missing] Resource [passed] Finalizer [passed]
    template <typename ResourceString,
              typename Finalizer,
              typename FinalizerDataType = void>
    static TypedThreadSafeFunction<ContextType, DataType, CallJs> New(
        napi_env env,
        const Object& resource,
        ResourceString resourceName,
        size_t maxQueueSize,
        size_t initialThreadCount,
        ContextType* context,
        Finalizer finalizeCallback,
        FinalizerDataType* data = nullptr);
#endif

    // This API may only be called from the main thread.
    // Creates a new threadsafe function with:
    //   Callback [passed] Resource [missing] Finalizer [missing]
    template <typename ResourceString>
    static TypedThreadSafeFunction<ContextType, DataType, CallJs> New(
        napi_env env,
        const Function& callback,
        ResourceString resourceName,
        size_t maxQueueSize,
        size_t initialThreadCount,
        ContextType* context = nullptr);

    // This API may only be called from the main thread.
    // Creates a new threadsafe function with:
    //   Callback [passed] Resource [passed] Finalizer [missing]
    template <typename ResourceString>
    static TypedThreadSafeFunction<ContextType, DataType, CallJs> New(
        napi_env env,
        const Function& callback,
        const Object& resource,
        ResourceString resourceName,
        size_t maxQueueSize,
        size_t initialThreadCount,
        ContextType* context = nullptr);

    // This API may only be called from the main thread.
    // Creates a new threadsafe function with:
    //   Callback [passed] Resource [missing] Finalizer [passed]
    template <typename ResourceString,
              typename Finalizer,
              typename FinalizerDataType = void>
    static TypedThreadSafeFunction<ContextType, DataType, CallJs> New(
        napi_env env,
        const Function& callback,
        ResourceString resourceName,
        size_t maxQueueSize,
        size_t initialThreadCount,
        ContextType* context,
        Finalizer finalizeCallback,
        FinalizerDataType* data = nullptr);

    // This API may only be called from the main thread.
    // Creates a new threadsafe function with:
    //   Callback [passed] Resource [passed] Finalizer [passed]
    template <typename CallbackType,
              typename ResourceString,
              typename Finalizer,
              typename FinalizerDataType>
    static TypedThreadSafeFunction<ContextType, DataType, CallJs> New(
        napi_env env,
        CallbackType callback,
        const Object& resource,
        ResourceString resourceName,
        size_t maxQueueSize,
        size_t initialThreadCount,
        ContextType* context,
        Finalizer finalizeCallback,
        FinalizerDataType* data = nullptr);

    TypedThreadSafeFunction();
    TypedThreadSafeFunction(napi_threadsafe_function tsFunctionValue);

    operator napi_threadsafe_function() const;

    // This API may be called from any thread.
    napi_status BlockingCall(DataType* data = nullptr) const;

    // This API may be called from any thread.
    napi_status NonBlockingCall(DataType* data = nullptr) const;

    // This API may only be called from the main thread.
    void Ref(napi_env env) const;

    // This API may only be called from the main thread.
    void Unref(napi_env env) const;

    // This API may be called from any thread.
    napi_status Acquire() const;

    // This API may be called from any thread.
    napi_status Release();

    // This API may be called from any thread.
    napi_status Abort();

    // This API may be called from any thread.
    ContextType* GetContext() const;

   private:
    template <typename ResourceString,
              typename Finalizer,
              typename FinalizerDataType>
    static TypedThreadSafeFunction<ContextType, DataType, CallJs> New(
        napi_env env,
        const Function& callback,
        const Object& resource,
        ResourceString resourceName,
        size_t maxQueueSize,
        size_t initialThreadCount,
        ContextType* context,
        Finalizer finalizeCallback,
        FinalizerDataType* data,
        napi_finalize wrapper);

    static void CallJsInternal(napi_env env,
                               napi_value jsCallback,
                               void* context,
                               void* data);

   protected:
    napi_threadsafe_function _tsfn;
  };
  template <typename DataType>
  class AsyncProgressWorkerBase : public AsyncWorker {
    public:
     virtual void OnWorkProgress(DataType* data) = 0;
     class ThreadSafeData {
       public:
        ThreadSafeData(AsyncProgressWorkerBase* asyncprogressworker, DataType* data)
          : _asyncprogressworker(asyncprogressworker), _data(data) {}

        AsyncProgressWorkerBase* asyncprogressworker() { return _asyncprogressworker; };
        DataType* data() { return _data; };

       private:
        AsyncProgressWorkerBase* _asyncprogressworker;
        DataType* _data;
     };
     void OnWorkComplete(Napi::Env env, napi_status status) override;
    protected:
     explicit AsyncProgressWorkerBase(const Object& receiver,
                                      const Function& callback,
                                      const char* resource_name,
                                      const Object& resource,
                                      size_t queue_size = 1);
    virtual ~AsyncProgressWorkerBase();

// Optional callback of Napi::ThreadSafeFunction only available after NAPI_VERSION 4.
// Refs: https://github.com/nodejs/node/pull/27791
#if NAPI_VERSION > 4
     explicit AsyncProgressWorkerBase(Napi::Env env,
                                      const char* resource_name,
                                      const Object& resource,
                                      size_t queue_size = 1);
#endif

     static inline void OnAsyncWorkProgress(Napi::Env env,
                                            Napi::Function jsCallback,
                                            void* data);

     napi_status NonBlockingCall(DataType* data);

    private:
     ThreadSafeFunction _tsfn;
     bool _work_completed = false;
     napi_status _complete_status;
     static inline void OnThreadSafeFunctionFinalize(Napi::Env env, void* data, AsyncProgressWorkerBase* context);
  };

  template<class T>
  class AsyncProgressWorker : public AsyncProgressWorkerBase<void> {
    public:
     virtual ~AsyncProgressWorker();

     class ExecutionProgress {
        friend class AsyncProgressWorker;
       public:
        void Signal() const;
        void Send(const T* data, size_t count) const;
       private:
        explicit ExecutionProgress(AsyncProgressWorker* worker) : _worker(worker) {}
        AsyncProgressWorker* const _worker;
     };

     void OnWorkProgress(void*) override;

    protected:
     explicit AsyncProgressWorker(const Function& callback);
     explicit AsyncProgressWorker(const Function& callback,
                                  const char* resource_name);
     explicit AsyncProgressWorker(const Function& callback,
                                  const char* resource_name,
                                  const Object& resource);
     explicit AsyncProgressWorker(const Object& receiver,
                                  const Function& callback);
     explicit AsyncProgressWorker(const Object& receiver,
                                  const Function& callback,
                                  const char* resource_name);
     explicit AsyncProgressWorker(const Object& receiver,
                                  const Function& callback,
                                  const char* resource_name,
                                  const Object& resource);

// Optional callback of Napi::ThreadSafeFunction only available after NAPI_VERSION 4.
// Refs: https://github.com/nodejs/node/pull/27791
#if NAPI_VERSION > 4
     explicit AsyncProgressWorker(Napi::Env env);
     explicit AsyncProgressWorker(Napi::Env env,
                                  const char* resource_name);
     explicit AsyncProgressWorker(Napi::Env env,
                                  const char* resource_name,
                                  const Object& resource);
#endif
     virtual void Execute(const ExecutionProgress& progress) = 0;
     virtual void OnProgress(const T* data, size_t count) = 0;

    private:
     void Execute() override;
     void Signal() const;
     void SendProgress_(const T* data, size_t count);

     std::mutex _mutex;
     T* _asyncdata;
     size_t _asyncsize;
  };

  template<class T>
  class AsyncProgressQueueWorker : public AsyncProgressWorkerBase<std::pair<T*, size_t>> {
    public:
     virtual ~AsyncProgressQueueWorker() {};

     class ExecutionProgress {
        friend class AsyncProgressQueueWorker;
       public:
        void Signal() const;
        void Send(const T* data, size_t count) const;
       private:
        explicit ExecutionProgress(AsyncProgressQueueWorker* worker) : _worker(worker) {}
        AsyncProgressQueueWorker* const _worker;
     };

     void OnWorkComplete(Napi::Env env, napi_status status) override;
     void OnWorkProgress(std::pair<T*, size_t>*) override;

    protected:
     explicit AsyncProgressQueueWorker(const Function& callback);
     explicit AsyncProgressQueueWorker(const Function& callback,
                                       const char* resource_name);
     explicit AsyncProgressQueueWorker(const Function& callback,
                                       const char* resource_name,
                                       const Object& resource);
     explicit AsyncProgressQueueWorker(const Object& receiver,
                                       const Function& callback);
     explicit AsyncProgressQueueWorker(const Object& receiver,
                                       const Function& callback,
                                       const char* resource_name);
     explicit AsyncProgressQueueWorker(const Object& receiver,
                                       const Function& callback,
                                       const char* resource_name,
                                       const Object& resource);

// Optional callback of Napi::ThreadSafeFunction only available after NAPI_VERSION 4.
// Refs: https://github.com/nodejs/node/pull/27791
#if NAPI_VERSION > 4
     explicit AsyncProgressQueueWorker(Napi::Env env);
     explicit AsyncProgressQueueWorker(Napi::Env env,
                                       const char* resource_name);
     explicit AsyncProgressQueueWorker(Napi::Env env,
                                       const char* resource_name,
                                       const Object& resource);
#endif
     virtual void Execute(const ExecutionProgress& progress) = 0;
     virtual void OnProgress(const T* data, size_t count) = 0;

    private:
     void Execute() override;
     void Signal() const;
     void SendProgress_(const T* data, size_t count);
  };
  #endif  // NAPI_VERSION > 3 && !defined(__wasm32__)

  // Memory management.
  class MemoryManagement {
    public:
      static int64_t AdjustExternalMemory(Env env, int64_t change_in_bytes);
  };

  // Version management
  class VersionManagement {
    public:
      static uint32_t GetNapiVersion(Env env);
      static const napi_node_version* GetNodeVersion(Env env);
  };

#if NAPI_VERSION > 5
  template <typename T>
  class Addon : public InstanceWrap<T> {
   public:
    static inline Object Init(Env env, Object exports);
    static T* Unwrap(Object wrapper);

   protected:
    using AddonProp = ClassPropertyDescriptor<T>;
    void DefineAddon(Object exports,
                     const std::initializer_list<AddonProp>& props);
    Napi::Object DefineProperties(Object object,
                                 const std::initializer_list<AddonProp>& props);

   private:
    Object entry_point_;
  };
#endif  // NAPI_VERSION > 5

} // namespace Napi

// Inline implementations of all the above class methods are included here.
#include "napi-inl.h"

#endif // SRC_NAPI_H_
{
  'targets': [
    {
      'target_name': 'nothing',
      'type': 'static_library',
      'sources': [ 'nothing.c' ]
    }
  ]
}
{
  'defines': [ 'NAPI_DISABLE_CPP_EXCEPTIONS' ],
  'cflags': [ '-fno-exceptions' ],
  'cflags_cc': [ '-fno-exceptions' ],
  'conditions': [
    ["OS=='win'", {
      # _HAS_EXCEPTIONS is already defined and set to 0 in common.gypi
      #"defines": [
      #  "_HAS_EXCEPTIONS=0"
      #],
      "msvs_settings": {
        "VCCLCompilerTool": {
          'ExceptionHandling': 0,
          'EnablePREfast': 'true',
        },
      },
    }],
    ["OS=='mac'", {
      'xcode_settings': {
        'CLANG_CXX_LIBRARY': 'libc++',
        'MACOSX_DEPLOYMENT_TARGET': '10.7',
        'GCC_ENABLE_CPP_EXCEPTIONS': 'NO',
      },
    }],
  ],
}
{
  "versions": [
    {
      "version": "*",
      "target": {
        "node": "active"
      },
      "response": {
        "type": "time-permitting",
        "paid": false,
        "contact": {
          "name": "node-addon-api team",
          "url": "https://github.com/nodejs/node-addon-api/issues"
        }
      },
      "backing": [ { "project": "https://github.com/nodejs" },
                   { "foundation": "https://openjsf.org/" }
      ]
    }
  ]
}
{
  "description": "Node.js API (Node-API)",
  "devDependencies": {
    "benchmark": "^2.1.4",
    "bindings": "^1.5.0",
    "clang-format": "^1.4.0",
    "eslint": "^7.32.0",
    "eslint-config-semistandard": "^16.0.0",
    "eslint-config-standard": "^16.0.3",
    "eslint-plugin-import": "^2.24.2",
    "eslint-plugin-node": "^11.1.0",
    "eslint-plugin-promise": "^5.1.0",
    "fs-extra": "^9.0.1",
    "path": "^0.12.7",
    "pre-commit": "^1.2.2",
    "safe-buffer": "^5.1.1"
  },
  "directories": {},
  "gypfile": false,
  "homepage": "https://github.com/nodejs/node-addon-api",
  "license": "MIT",
  "main": "index.js",
  "name": "node-addon-api",
  "readme": "README.md",
  "repository": {
    "type": "git",
    "url": "git://github.com/nodejs/node-addon-api.git"
  },
  "files": [
    "*.{c,h,gyp,gypi}",
    "package-support.json",
    "tools/"
  ],
  "pre-commit": "lint",
  "version": "4.3.0",
  "support": true
}# Tools

## clang-format

The clang-format checking tools is designed to check changed lines of code compared to given git-refs.

## Migration Script

The migration tool is designed to reduce repetitive work in the migration process. However, the script is not aiming to convert every thing for you. There are usually some small fixes and major reconstruction required.

### How To Use

To run the conversion script, first make sure you have the latest `node-addon-api` in your `node_modules` directory.
```
npm install node-addon-api
```

Then run the script passing your project directory
```
node ./node_modules/node-addon-api/tools/conversion.js ./
```

After finish, recompile and debug things that are missed by the script.


### Quick Fixes
Here is the list of things that can be fixed easily.
  1. Change your methods' return value to void if it doesn't return value to JavaScript.
  2. Use `.` to access attribute or to invoke member function in Napi::Object instead of `->`.
  3. `Napi::New(env, value);` to `Napi::[Type]::New(env, value);


### Major Reconstructions
The implementation of `Napi::ObjectWrap` is significantly different from NAN's. `Napi::ObjectWrap` takes a pointer to the wrapped object and creates a reference to the wrapped object inside ObjectWrap constructor. `Napi::ObjectWrap` also associates wrapped object's instance methods to Javascript module instead of static methods like NAN.

So if you use Nan::ObjectWrap in your module, you will need to execute the following steps.

  1. Convert your [ClassName]::New function to a constructor function that takes a `Napi::CallbackInfo`. Declare it as
```
[ClassName](const Napi::CallbackInfo& info);
```
and define it as
```
[ClassName]::[ClassName](const Napi::CallbackInfo& info) : Napi::ObjectWrap<[ClassName]>(info){
  ...
}
```
This way, the `Napi::ObjectWrap` constructor will be invoked after the object has been instantiated and `Napi::ObjectWrap` can use the `this` pointer to create a reference to the wrapped object.

  2. Move your original constructor code into the new constructor. Delete your original constructor.
  3. In your class initialization function, associate native methods in the following way.
```
Napi::FunctionReference constructor;

void [ClassName]::Init(Napi::Env env, Napi::Object exports, Napi::Object module) {
  Napi::HandleScope scope(env);
  Napi::Function ctor = DefineClass(env, "Canvas", {
    InstanceMethod<&[ClassName]::Func1>("Func1"),
    InstanceMethod<&[ClassName]::Func2>("Func2"),
    InstanceAccessor<&[ClassName]::ValueGetter>("Value"),
    StaticMethod<&[ClassName]::StaticMethod>("MethodName"),
    InstanceValue("Value", Napi::[Type]::New(env, value)),
  });

  constructor = Napi::Persistent(ctor);
  constructor .SuppressDestruct();
  exports.Set("[ClassName]", ctor);
}
```
  4. In function where you need to Unwrap the ObjectWrap in NAN like `[ClassName]* native = Nan::ObjectWrap::Unwrap<[ClassName]>(info.This());`, use `this` pointer directly as the unwrapped object as each ObjectWrap instance is associated with a unique object instance.


If you still find issues after following this guide, please leave us an issue describing your problem and we will try to resolve it.
'use strict';
// Descend into a directory structure and, for each file matching *.node, output
// based on the imports found in the file whether it's an N-API module or not.

const fs = require('fs');
const path = require('path');
const child_process = require('child_process');

// Read the output of the command, break it into lines, and use the reducer to
// decide whether the file is an N-API module or not.
function checkFile(file, command, argv, reducer) {
  const child = child_process.spawn(command, argv, {
    stdio: ['inherit', 'pipe', 'inherit']
  });
  let leftover = '';
  let isNapi = undefined;
  child.stdout.on('data', (chunk) => {
    if (isNapi === undefined) {
      chunk = (leftover + chunk.toString()).split(/[\r\n]+/);
      leftover = chunk.pop();
      isNapi = chunk.reduce(reducer, isNapi);
      if (isNapi !== undefined) {
        child.kill();
      }
    }
  });
  child.on('close', (code, signal) => {
    if ((code === null && signal !== null) || (code !== 0)) {
      console.log(
        command + ' exited with code: '  + code + ' and signal: ' + signal);
    } else {
      // Green if it's a N-API module, red otherwise.
      console.log(
          '\x1b[' + (isNapi ? '42' : '41') + 'm' +
          (isNapi ? '    N-API' : 'Not N-API') +
          '\x1b[0m: ' + file);
    }
  });
}

// Use nm -a to list symbols.
function checkFileUNIX(file) {
  checkFile(file, 'nm', ['-a', file], (soFar, line) => {
    if (soFar === undefined) {
      line = line.match(/([0-9a-f]*)? ([a-zA-Z]) (.*$)/);
      if (line[2] === 'U') {
        if (/^napi/.test(line[3])) {
          soFar = true;
        }
      }
    }
    return soFar;
  });
}

// Use dumpbin /imports to list symbols.
function checkFileWin32(file) {
  checkFile(file, 'dumpbin', ['/imports', file], (soFar, line) => {
    if (soFar === undefined) {
      line = line.match(/([0-9a-f]*)? +([a-zA-Z0-9]) (.*$)/);
      if (line && /^napi/.test(line[line.length - 1])) {
        soFar = true;
      }
    }
    return soFar;
  });
}

// Descend into a directory structure and pass each file ending in '.node' to
// one of the above checks, depending on the OS.
function recurse(top) {
  fs.readdir(top, (error, items) => {
    if (error) {
      throw ("error reading directory " + top + ": " + error);
    }
    items.forEach((item) => {
      item = path.join(top, item);
      fs.stat(item, ((item) => (error, stats) => {
        if (error) {
          throw ("error about " + item + ": " + error);
        }
        if (stats.isDirectory()) {
          recurse(item);
        } else if (/[.]node$/.test(item) &&
            // Explicitly ignore files called 'nothing.node' because they are
            // artefacts of node-addon-api having identified a version of
            // Node.js that ships with a correct implementation of N-API.
            path.basename(item) !== 'nothing.node') {
          process.platform === 'win32' ?
              checkFileWin32(item) :
              checkFileUNIX(item);
        }
      })(item));
    });
  });
}

// Start with the directory given on the command line or the current directory
// if nothing was given.
recurse(process.argv.length > 3 ? process.argv[2] : '.');
#!/usr/bin/env node

const spawn = require('child_process').spawnSync;
const path = require('path');

const filesToCheck = ['*.h', '*.cc'];
const FORMAT_START = process.env.FORMAT_START || 'main';

function main (args) {
  let fix = false;
  while (args.length > 0) {
    switch (args[0]) {
      case '-f':
      case '--fix':
        fix = true;
        break;
      default:
    }
    args.shift();
  }

  const clangFormatPath = path.dirname(require.resolve('clang-format'));
  const options = ['--binary=node_modules/.bin/clang-format', '--style=file'];
  if (fix) {
    options.push(FORMAT_START);
  } else {
    options.push('--diff', FORMAT_START);
  }

  const gitClangFormatPath = path.join(clangFormatPath, 'bin/git-clang-format');
  const result = spawn(
    'python',
    [gitClangFormatPath, ...options, '--', ...filesToCheck],
    { encoding: 'utf-8' }
  );

  if (result.stderr) {
    console.error('Error running git-clang-format:', result.stderr);
    return 2;
  }

  const clangFormatOutput = result.stdout.trim();
  // Bail fast if in fix mode.
  if (fix) {
    console.log(clangFormatOutput);
    return 0;
  }
  // Detect if there is any complains from clang-format
  if (
    clangFormatOutput !== '' &&
    clangFormatOutput !== 'no modified files to format' &&
    clangFormatOutput !== 'clang-format did not modify any files'
  ) {
    console.error(clangFormatOutput);
    const fixCmd = 'npm run lint:fix';
    console.error(`
      ERROR: please run "${fixCmd}" to format changes in your commit
        Note that when running the command locally, please keep your local
        main branch and working branch up to date with nodejs/node-addon-api
        to exclude un-related complains.
        Or you can run "env FORMAT_START=upstream/main ${fixCmd}".`);
    return 1;
  }
}

if (require.main === module) {
  process.exitCode = main(process.argv.slice(2));
}
#! /usr/bin/env node

'use strict'

const fs = require('fs');
const path = require('path');

const args = process.argv.slice(2);
const dir = args[0];
if (!dir) {
  console.log('Usage: node ' + path.basename(__filename) + ' <target-dir>');
  process.exit(1);
}

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

const disable = args[1];
if (disable != "--disable" && dir != "--disable") {
  var ConfigFileOperations = {
    'package.json': [
       [ /([ ]*)"dependencies": {/g, '$1"dependencies": {\n$1  "node-addon-api": "' + NodeApiVersion + '",'],
       [ /[ ]*"nan": *"[^"]+"(,|)[\n\r]/g, '' ]
    ],
    'binding.gyp': [
       [ /([ ]*)'include_dirs': \[/g, '$1\'include_dirs\': [\n$1  \'<!(node -p "require(\\\'node-addon-api\\\').include_dir")\',' ],
       [ /([ ]*)"include_dirs": \[/g, '$1"include_dirs": [\n$1  "<!(node -p \\"require(\'node-addon-api\').include_dir\\")",' ],
       [ /[ ]*("|')<!\(node -e ("|'|\\"|\\')require\(("|'|\\"|\\')nan("|'|\\"|\\')\)("|'|\\"|\\')\)("|')(,|)[\r\n]/g, '' ],
       [ /([ ]*)("|')target_name("|'): ("|')(.+?)("|'),/g, '$1$2target_name$2: $4$5$6,\n      $2cflags!$2: [ $2-fno-exceptions$2 ],\n      $2cflags_cc!$2: [ $2-fno-exceptions$2 ],\n      $2xcode_settings$2: { $2GCC_ENABLE_CPP_EXCEPTIONS$2: $2YES$2,\n        $2CLANG_CXX_LIBRARY$2: $2libc++$2,\n        $2MACOSX_DEPLOYMENT_TARGET$2: $210.7$2,\n      },\n      $2msvs_settings$2: {\n        $2VCCLCompilerTool$2: { $2ExceptionHandling$2: 1 },\n      },' ],
    ]
  };
} else {
  var ConfigFileOperations = {
    'package.json': [
      [ /([ ]*)"dependencies": {/g, '$1"dependencies": {\n$1  "node-addon-api": "' + NodeApiVersion + '",'],
      [ /[ ]*"nan": *"[^"]+"(,|)[\n\r]/g, '' ]
    ],
    'binding.gyp': [
      [ /([ ]*)'include_dirs': \[/g, '$1\'include_dirs\': [\n$1  \'<!(node -p "require(\\\'node-addon-api\\\').include_dir")\',' ],
      [ /([ ]*)"include_dirs": \[/g, '$1"include_dirs": [\n$1  "<!(node -p \'require(\\\"node-addon-api\\\").include_dir\')",' ],
      [ /[ ]*("|')<!\(node -e ("|'|\\"|\\')require\(("|'|\\"|\\')nan("|'|\\"|\\')\)("|'|\\"|\\')\)("|')(,|)[\r\n]/g, '' ],
      [ /([ ]*)("|')target_name("|'): ("|')(.+?)("|'),/g, '$1$2target_name$2: $4$5$6,\n      $2cflags!$2: [ $2-fno-exceptions$2 ],\n      $2cflags_cc!$2: [ $2-fno-exceptions$2 ],\n      $2defines$2: [ $2NAPI_DISABLE_CPP_EXCEPTIONS$2 ],\n      $2conditions$2: [\n        [\'OS==\"win\"\', { $2defines$2: [ $2_HAS_EXCEPTIONS=1$2 ] }]\n      ]' ],
    ]
  };
}

var SourceFileOperations = [
  [ /Nan::SetMethod\(target,[\s]*\"(.*)\"[\s]*,[\s]*([^)]+)\)/g, 'exports.Set(Napi::String::New(env, \"$1\"), Napi::Function::New(env, $2))' ],

  [ /v8::Local<v8::FunctionTemplate>\s+(\w+)\s*=\s*Nan::New<FunctionTemplate>\([\w\d:]+\);(?:\w+->Reset\(\1\))?\s+\1->SetClassName\(Nan::String::New\("(\w+)"\)\);/g, 'Napi::Function $1 = DefineClass(env, "$2", {' ],
  [ /Local<FunctionTemplate>\s+(\w+)\s*=\s*Nan::New<FunctionTemplate>\([\w\d:]+\);\s+(\w+)\.Reset\((\1)\);\s+\1->SetClassName\((Nan::String::New|Nan::New<(v8::)*String>)\("(.+?)"\)\);/g, 'Napi::Function $1 = DefineClass(env, "$6", {'],
  [ /Local<FunctionTemplate>\s+(\w+)\s*=\s*Nan::New<FunctionTemplate>\([\w\d:]+\);(?:\w+->Reset\(\1\))?\s+\1->SetClassName\(Nan::String::New\("(\w+)"\)\);/g, 'Napi::Function $1 = DefineClass(env, "$2", {' ],
  [ /Nan::New<v8::FunctionTemplate>\(([\w\d:]+)\)->GetFunction\(\)/g, 'Napi::Function::New(env, $1)' ],
  [ /Nan::New<FunctionTemplate>\(([\w\d:]+)\)->GetFunction()/g, 'Napi::Function::New(env, $1);' ],
  [ /Nan::New<v8::FunctionTemplate>\(([\w\d:]+)\)/g, 'Napi::Function::New(env, $1)' ],
  [ /Nan::New<FunctionTemplate>\(([\w\d:]+)\)/g, 'Napi::Function::New(env, $1)' ],

  // FunctionTemplate to FunctionReference
  [ /Nan::Persistent<(v8::)*FunctionTemplate>/g, 'Napi::FunctionReference' ],
  [ /Nan::Persistent<(v8::)*Function>/g, 'Napi::FunctionReference' ],
  [ /v8::Local<v8::FunctionTemplate>/g, 'Napi::FunctionReference' ],
  [ /Local<FunctionTemplate>/g, 'Napi::FunctionReference' ],
  [ /v8::FunctionTemplate/g, 'Napi::FunctionReference' ],
  [ /FunctionTemplate/g, 'Napi::FunctionReference' ],


  [ /([ ]*)Nan::SetPrototypeMethod\(\w+, "(\w+)", (\w+)\);/g, '$1InstanceMethod("$2", &$3),' ],
  [ /([ ]*)(?:\w+\.Reset\(\w+\);\s+)?\(target\)\.Set\("(\w+)",\s*Nan::GetFunction\((\w+)\)\);/gm,
    '});\n\n' +
    '$1constructor = Napi::Persistent($3);\n' +
    '$1constructor.SuppressDestruct();\n' +
    '$1target.Set("$2", $3);' ],


  // TODO: Other attribute combinations
  [ /static_cast<PropertyAttribute>\(ReadOnly\s*\|\s*DontDelete\)/gm,
    'static_cast<napi_property_attributes>(napi_enumerable | napi_configurable)' ],

  [ /([\w\d:<>]+?)::Cast\((.+?)\)/g, '$2.As<$1>()' ],

  [ /\*Nan::Utf8String\(([^)]+)\)/g, '$1->As<Napi::String>().Utf8Value().c_str()' ],
  [ /Nan::Utf8String +(\w+)\(([^)]+)\)/g, 'std::string $1 = $2.As<Napi::String>()' ],
  [ /Nan::Utf8String/g, 'std::string' ],

  [ /v8::String::Utf8Value (.+?)\((.+?)\)/g, 'Napi::String $1(env, $2)' ],
  [ /String::Utf8Value (.+?)\((.+?)\)/g, 'Napi::String $1(env, $2)' ],
  [ /\.length\(\)/g, '.Length()' ],

  [ /Nan::MakeCallback\(([^,]+),[\s\\]+([^,]+),/gm, '$2.MakeCallback($1,' ],

  [ /class\s+(\w+)\s*:\s*public\s+Nan::ObjectWrap/g, 'class $1 : public Napi::ObjectWrap<$1>' ],
  [ /(\w+)\(([^\)]*)\)\s*:\s*Nan::ObjectWrap\(\)\s*(,)?/gm, '$1($2) : Napi::ObjectWrap<$1>()$3' ],

  // HandleOKCallback to OnOK
  [ /HandleOKCallback/g, 'OnOK' ],
  // HandleErrorCallback to OnError
  [ /HandleErrorCallback/g, 'OnError' ],

  // ex. .As<Function>() to .As<Napi::Object>()
  [ /\.As<v8::(Value|Boolean|String|Number|Object|Array|Symbol|External|Function)>\(\)/g, '.As<Napi::$1>()' ],
  [ /\.As<(Value|Boolean|String|Number|Object|Array|Symbol|External|Function)>\(\)/g, '.As<Napi::$1>()' ],

  // ex. Nan::New<Number>(info[0]) to Napi::Number::New(info[0])
  [ /Nan::New<(v8::)*Integer>\((.+?)\)/g, 'Napi::Number::New(env, $2)' ],
  [ /Nan::New\(([0-9\.]+)\)/g, 'Napi::Number::New(env, $1)' ],
  [ /Nan::New<(v8::)*String>\("(.+?)"\)/g, 'Napi::String::New(env, "$2")' ],
  [ /Nan::New\("(.+?)"\)/g, 'Napi::String::New(env, "$1")' ],
  [ /Nan::New<(v8::)*(.+?)>\(\)/g, 'Napi::$2::New(env)' ],
  [ /Nan::New<(.+?)>\(\)/g, 'Napi::$1::New(env)' ],
  [ /Nan::New<(v8::)*(.+?)>\(/g, 'Napi::$2::New(env, ' ],
  [ /Nan::New<(.+?)>\(/g, 'Napi::$1::New(env, ' ],
  [ /Nan::NewBuffer\(/g, 'Napi::Buffer<char>::New(env, ' ],
  // TODO: Properly handle this
  [ /Nan::New\(/g, 'Napi::New(env, ' ],

  [ /\.IsInt32\(\)/g, '.IsNumber()' ],
  [ /->IsInt32\(\)/g, '.IsNumber()' ],


  [ /(.+?)->BooleanValue\(\)/g, '$1.As<Napi::Boolean>().Value()' ],
  [ /(.+?)->Int32Value\(\)/g, '$1.As<Napi::Number>().Int32Value()' ],
  [ /(.+?)->Uint32Value\(\)/g, '$1.As<Napi::Number>().Uint32Value()' ],
  [ /(.+?)->IntegerValue\(\)/g, '$1.As<Napi::Number>().Int64Value()' ],
  [ /(.+?)->NumberValue\(\)/g, '$1.As<Napi::Number>().DoubleValue()' ],

  // ex. Nan::To<bool>(info[0]) to info[0].Value()
  [ /Nan::To<v8::(Boolean|String|Number|Object|Array|Symbol|Function)>\((.+?)\)/g, '$2.To<Napi::$1>()' ],
  [ /Nan::To<(Boolean|String|Number|Object|Array|Symbol|Function)>\((.+?)\)/g, '$2.To<Napi::$1>()' ],
  // ex. Nan::To<bool>(info[0]) to info[0].As<Napi::Boolean>().Value()
  [ /Nan::To<bool>\((.+?)\)/g, '$1.As<Napi::Boolean>().Value()' ],
  // ex. Nan::To<int>(info[0]) to info[0].As<Napi::Number>().Int32Value()
  [ /Nan::To<int>\((.+?)\)/g, '$1.As<Napi::Number>().Int32Value()' ],
  // ex. Nan::To<int32_t>(info[0]) to info[0].As<Napi::Number>().Int32Value()
  [ /Nan::To<int32_t>\((.+?)\)/g, '$1.As<Napi::Number>().Int32Value()' ],
  // ex. Nan::To<uint32_t>(info[0]) to info[0].As<Napi::Number>().Uint32Value()
  [ /Nan::To<uint32_t>\((.+?)\)/g, '$1.As<Napi::Number>().Uint32Value()' ],
  // ex. Nan::To<int64_t>(info[0]) to info[0].As<Napi::Number>().Int64Value()
  [ /Nan::To<int64_t>\((.+?)\)/g, '$1.As<Napi::Number>().Int64Value()' ],
  // ex. Nan::To<float>(info[0]) to info[0].As<Napi::Number>().FloatValue()
  [ /Nan::To<float>\((.+?)\)/g, '$1.As<Napi::Number>().FloatValue()' ],
  // ex. Nan::To<double>(info[0]) to info[0].As<Napi::Number>().DoubleValue()
  [ /Nan::To<double>\((.+?)\)/g, '$1.As<Napi::Number>().DoubleValue()' ],

  [ /Nan::New\((\w+)\)->HasInstance\((\w+)\)/g, '$2.InstanceOf($1.Value())' ],

  [ /Nan::Has\(([^,]+),\s*/gm, '($1).Has(' ],
  [ /\.Has\([\s|\\]*Nan::New<(v8::)*String>\(([^)]+)\)\)/gm, '.Has($1)' ],
  [ /\.Has\([\s|\\]*Nan::New\(([^)]+)\)\)/gm, '.Has($1)' ],

  [ /Nan::Get\(([^,]+),\s*/gm, '($1).Get(' ],
  [ /\.Get\([\s|\\]*Nan::New<(v8::)*String>\(([^)]+)\)\)/gm, '.Get($1)' ],
  [ /\.Get\([\s|\\]*Nan::New\(([^)]+)\)\)/gm, '.Get($1)' ],

  [ /Nan::Set\(([^,]+),\s*/gm, '($1).Set(' ],
  [ /\.Set\([\s|\\]*Nan::New<(v8::)*String>\(([^)]+)\)\s*,/gm, '.Set($1,' ],
  [ /\.Set\([\s|\\]*Nan::New\(([^)]+)\)\s*,/gm, '.Set($1,' ],


  // ex. node::Buffer::HasInstance(info[0]) to info[0].IsBuffer()
  [ /node::Buffer::HasInstance\((.+?)\)/g, '$1.IsBuffer()' ],
  // ex. node::Buffer::Length(info[0]) to info[0].Length()
  [ /node::Buffer::Length\((.+?)\)/g, '$1.As<Napi::Buffer<char>>().Length()' ],
  // ex. node::Buffer::Data(info[0]) to info[0].Data()
  [ /node::Buffer::Data\((.+?)\)/g, '$1.As<Napi::Buffer<char>>().Data()' ],
  [ /Nan::CopyBuffer\(/g, 'Napi::Buffer::Copy(env, ' ],

  // Nan::AsyncQueueWorker(worker)
  [ /Nan::AsyncQueueWorker\((.+)\);/g, '$1.Queue();' ],
  [ /Nan::(Undefined|Null|True|False)\(\)/g, 'env.$1()' ],

  // Nan::ThrowError(error) to Napi::Error::New(env, error).ThrowAsJavaScriptException()
  [ /([ ]*)return Nan::Throw(\w*?)Error\((.+?)\);/g, '$1Napi::$2Error::New(env, $3).ThrowAsJavaScriptException();\n$1return env.Null();' ],
  [ /Nan::Throw(\w*?)Error\((.+?)\);\n(\s*)return;/g, 'Napi::$1Error::New(env, $2).ThrowAsJavaScriptException();\n$3return env.Null();' ],
  [ /Nan::Throw(\w*?)Error\((.+?)\);/g, 'Napi::$1Error::New(env, $2).ThrowAsJavaScriptException();\n' ],
  // Nan::RangeError(error) to Napi::RangeError::New(env, error)
  [ /Nan::(\w*?)Error\((.+)\)/g, 'Napi::$1Error::New(env, $2)' ],

  [ /Nan::Set\((.+?),\n* *(.+?),\n* *(.+?),\n* *(.+?)\)/g, '$1.Set($2, $3, $4)' ],

  [ /Nan::(Escapable)?HandleScope\s+(\w+)\s*;/g, 'Napi::$1HandleScope $2(env);' ],
  [ /Nan::(Escapable)?HandleScope/g, 'Napi::$1HandleScope' ],
  [ /Nan::ForceSet\(([^,]+), ?/g, '$1->DefineProperty(' ],
  [ /\.ForceSet\(Napi::String::New\(env, "(\w+)"\),\s*?/g, '.DefineProperty("$1", ' ],
  // [ /Nan::GetPropertyNames\(([^,]+)\)/, '$1->GetPropertyNames()' ],
  [ /Nan::Equals\(([^,]+),/g, '$1.StrictEquals(' ],


  [ /(.+)->Set\(/g, '$1.Set\(' ],


  [ /Nan::Callback/g, 'Napi::FunctionReference' ],


  [ /Nan::Persistent<Object>/g, 'Napi::ObjectReference' ],
  [ /Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target/g, 'Napi::Env& env, Napi::Object& target' ],

  [ /(\w+)\*\s+(\w+)\s*=\s*Nan::ObjectWrap::Unwrap<\w+>\(info\.This\(\)\);/g, '$1* $2 = this;' ],
  [ /Nan::ObjectWrap::Unwrap<(\w+)>\((.*)\);/g, '$2.Unwrap<$1>();' ],

  [ /Nan::NAN_METHOD_RETURN_TYPE/g, 'void' ],
  [ /NAN_INLINE/g, 'inline' ],

  [ /Nan::NAN_METHOD_ARGS_TYPE/g, 'const Napi::CallbackInfo&' ],
  [ /NAN_METHOD\(([\w\d:]+?)\)/g, 'Napi::Value $1(const Napi::CallbackInfo& info)'],
  [ /static\s*NAN_GETTER\(([\w\d:]+?)\)/g, 'Napi::Value $1(const Napi::CallbackInfo& info)' ],
  [ /NAN_GETTER\(([\w\d:]+?)\)/g, 'Napi::Value $1(const Napi::CallbackInfo& info)' ],
  [ /static\s*NAN_SETTER\(([\w\d:]+?)\)/g, 'void $1(const Napi::CallbackInfo& info, const Napi::Value& value)' ],
  [ /NAN_SETTER\(([\w\d:]+?)\)/g, 'void $1(const Napi::CallbackInfo& info, const Napi::Value& value)' ],
  [ /void Init\((v8::)*Local<(v8::)*Object> exports\)/g, 'Napi::Object Init(Napi::Env env, Napi::Object exports)' ],
  [ /NAN_MODULE_INIT\(([\w\d:]+?)\);/g, 'Napi::Object $1(Napi::Env env, Napi::Object exports);' ],
  [ /NAN_MODULE_INIT\(([\w\d:]+?)\)/g, 'Napi::Object $1(Napi::Env env, Napi::Object exports)' ],


  [ /::(Init(?:ialize)?)\(target\)/g, '::$1(env, target, module)' ],
  [ /constructor_template/g, 'constructor' ],

  [ /Nan::FunctionCallbackInfo<(v8::)?Value>[ ]*& [ ]*info\)[ ]*{\n*([ ]*)/gm, 'Napi::CallbackInfo& info) {\n$2Napi::Env env = info.Env();\n$2' ],
  [ /Nan::FunctionCallbackInfo<(v8::)*Value>\s*&\s*info\);/g, 'Napi::CallbackInfo& info);' ],
  [ /Nan::FunctionCallbackInfo<(v8::)*Value>\s*&/g, 'Napi::CallbackInfo&' ],

  [ /Buffer::HasInstance\(([^)]+)\)/g, '$1.IsBuffer()' ],

  [ /info\[(\d+)\]->/g, 'info[$1].' ],
  [ /info\[([\w\d]+)\]->/g, 'info[$1].' ],
  [ /info\.This\(\)->/g, 'info.This().' ],
  [ /->Is(Object|String|Int32|Number)\(\)/g, '.Is$1()' ],
  [ /info.GetReturnValue\(\).SetUndefined\(\)/g, 'return env.Undefined()' ],
  [ /info\.GetReturnValue\(\)\.Set\(((\n|.)+?)\);/g, 'return $1;' ],


  // ex. Local<Value> to Napi::Value
  [ /v8::Local<v8::(Value|Boolean|String|Number|Object|Array|Symbol|External|Function)>/g, 'Napi::$1' ],
  [ /Local<(Value|Boolean|String|Number|Object|Array|Symbol|External|Function)>/g, 'Napi::$1' ],

  // Declare an env in helper functions that take a Napi::Value
  [ /(\w+)\(Napi::Value (\w+)(,\s*[^\()]+)?\)\s*{\n*([ ]*)/gm, '$1(Napi::Value $2$3) {\n$4Napi::Env env = $2.Env();\n$4' ],

  // delete #include <node.h> and/or <v8.h>
  [ /#include +(<|")(?:node|nan).h("|>)/g, "#include $1napi.h$2\n#include $1uv.h$2" ],
  // NODE_MODULE to NODE_API_MODULE
  [ /NODE_MODULE/g, 'NODE_API_MODULE' ],
  [ /Nan::/g, 'Napi::' ],
  [ /nan.h/g, 'napi.h' ],

  // delete .FromJust()
  [ /\.FromJust\(\)/g, '' ],
  // delete .ToLocalCheck()
  [ /\.ToLocalChecked\(\)/g, '' ],
  [ /^.*->SetInternalFieldCount\(.*$/gm, '' ],

  // replace using node; and/or using v8; to using Napi;
  [ /using (node|v8);/g, 'using Napi;' ],
  [ /using namespace (node|Nan|v8);/g, 'using namespace Napi;' ],
  // delete using v8::Local;
  [ /using v8::Local;\n/g, '' ],
  // replace using v8::XXX; with using Napi::XXX
  [ /using v8::([A-Za-z]+);/g, 'using Napi::$1;' ],

];

var paths = listFiles(dir);
paths.forEach(function(dirEntry) {
  var filename = dirEntry.split('\\').pop().split('/').pop();

  // Check whether the file is a source file or a config file
  // then execute function accordingly
  var sourcePattern = /.+\.h|.+\.cc|.+\.cpp/;
  if (sourcePattern.test(filename)) {
    convertFile(dirEntry, SourceFileOperations);
  } else if (ConfigFileOperations[filename] != null) {
    convertFile(dirEntry, ConfigFileOperations[filename]);
  }
});

function listFiles(dir, filelist) {
  var files = fs.readdirSync(dir);
  filelist = filelist || [];
  files.forEach(function(file) {
    if (file === 'node_modules') {
      return
    }

    if (fs.statSync(path.join(dir, file)).isDirectory()) {
      filelist = listFiles(path.join(dir, file), filelist);
    } else {
      filelist.push(path.join(dir, file));
    }
  });
  return filelist;
}

function convert(content, operations) {
  for (let i = 0; i < operations.length; i ++) {
    let operation = operations[i];
    content = content.replace(operation[0], operation[1]);
  }
  return content;
}

function convertFile(fileName, operations) {
  fs.readFile(fileName, "utf-8", function (err, file) {
    if (err) throw err;

    file = convert(file, operations);

    fs.writeFile(fileName, file, function(err){
      if (err) throw err;
    });
  });
}
#!/usr/bin/env node

const spawn = require('child_process').spawnSync;

const filesToCheck = '*.js';
const FORMAT_START = process.env.FORMAT_START || 'main';

function main (args) {
  let fix = false;
  while (args.length > 0) {
    switch (args[0]) {
      case '-f':
      case '--fix':
        fix = true;
        break;
      default:
    }
    args.shift();
  }

  // Check js files that change on unstaged file
  const fileUnStaged = spawn(
    'git',
    ['diff', '--name-only', FORMAT_START, filesToCheck],
    {
      encoding: 'utf-8'
    }
  );

  // Check js files that change on staged file
  const fileStaged = spawn(
    'git',
    ['diff', '--name-only', '--cached', FORMAT_START, filesToCheck],
    {
      encoding: 'utf-8'
    }
  );

  const options = [
    ...fileStaged.stdout.split('\n').filter((f) => f !== ''),
    ...fileUnStaged.stdout.split('\n').filter((f) => f !== '')
  ];

  if (fix) {
    options.push('--fix');
  }
  const result = spawn('node_modules/.bin/eslint', [...options], {
    encoding: 'utf-8'
  });

  if (result.status === 1) {
    console.error('Eslint error:', result.stdout);
    const fixCmd = 'npm run lint:fix';
    console.error(`ERROR: please run "${fixCmd}" to format changes in your commit
    Note that when running the command locally, please keep your local
    main branch and working branch up to date with nodejs/node-addon-api
    to exclude un-related complains.
    Or you can run "env FORMAT_START=upstream/main ${fixCmd}".
    Also fix JS files by yourself if necessary.`);
    return 1;
  }

  if (result.stderr) {
    console.error('Error running eslint:', result.stderr);
    return 2;
  }
}

if (require.main === module) {
  process.exitCode = main(process.argv.slice(2));
}
The MIT License (MIT)

Copyright (c) 2016 David Frank

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";

// ref: https://github.com/tc39/proposal-global
var getGlobal = function () {
	// the only reliable means to get the global object is
	// `Function('return this')()`
	// However, this causes CSP violations in Chrome apps.
	if (typeof self !== 'undefined') { return self; }
	if (typeof window !== 'undefined') { return window; }
	if (typeof global !== 'undefined') { return global; }
	throw new Error('unable to locate global object');
}

var global = getGlobal();

module.exports = exports = global.fetch;

// Needed for TypeScript and Webpack.
if (global.fetch) {
	exports.default = global.fetch.bind(global);
}

exports.Headers = global.Headers;
exports.Request = global.Request;
exports.Response = global.Response;{
  "name": "node-fetch",
  "version": "2.6.7",
  "description": "A light-weight module that brings window.fetch to node.js",
  "main": "lib/index.js",
  "browser": "./browser.js",
  "module": "lib/index.mjs",
  "files": [
    "lib/index.js",
    "lib/index.mjs",
    "lib/index.es.js",
    "browser.js"
  ],
  "engines": {
    "node": "4.x || >=6.0.0"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/bitinn/node-fetch.git"
  },
  "author": "David Frank",
  "license": "MIT",
  "homepage": "https://github.com/bitinn/node-fetch",
  "dependencies": {
    "whatwg-url": "^5.0.0"
  },
  "peerDependencies": {
    "encoding": "^0.1.0"
  },
  "peerDependenciesMeta": {
    "encoding": {
      "optional": true
    }
  },
  "devDependencies": {
    "@ungap/url-search-params": "^0.1.2",
    "abort-controller": "^1.1.0",
    "abortcontroller-polyfill": "^1.3.0",
    "babel-core": "^6.26.3",
    "babel-plugin-istanbul": "^4.1.6",
    "babel-preset-env": "^1.6.1",
    "babel-register": "^6.16.3",
    "chai": "^3.5.0",
    "chai-as-promised": "^7.1.1",
    "chai-iterator": "^1.1.1",
    "chai-string": "~1.3.0",
    "codecov": "3.3.0",
    "cross-env": "^5.2.0",
    "form-data": "^2.3.3",
    "is-builtin-module": "^1.0.0",
    "mocha": "^5.0.0",
    "nyc": "11.9.0",
    "parted": "^0.1.1",
    "promise": "^8.0.3",
    "resumer": "0.0.0",
    "rollup": "^0.63.4",
    "rollup-plugin-babel": "^3.0.7",
    "string-to-arraybuffer": "^1.0.2",
    "teeny-request": "3.7.0"
  }
}process.emitWarning("The .es.js file is deprecated. Use .mjs instead.");

import Stream from 'stream';
import http from 'http';
import Url from 'url';
import whatwgUrl from 'whatwg-url';
import https from 'https';
import zlib from 'zlib';

// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js

// fix for "Readable" isn't a named export issue
const Readable = Stream.Readable;

const BUFFER = Symbol('buffer');
const TYPE = Symbol('type');

class Blob {
	constructor() {
		this[TYPE] = '';

		const blobParts = arguments[0];
		const options = arguments[1];

		const buffers = [];
		let size = 0;

		if (blobParts) {
			const a = blobParts;
			const length = Number(a.length);
			for (let i = 0; i < length; i++) {
				const element = a[i];
				let buffer;
				if (element instanceof Buffer) {
					buffer = element;
				} else if (ArrayBuffer.isView(element)) {
					buffer = Buffer.from(element.buffer, element.byteOffset, element.byteLength);
				} else if (element instanceof ArrayBuffer) {
					buffer = Buffer.from(element);
				} else if (element instanceof Blob) {
					buffer = element[BUFFER];
				} else {
					buffer = Buffer.from(typeof element === 'string' ? element : String(element));
				}
				size += buffer.length;
				buffers.push(buffer);
			}
		}

		this[BUFFER] = Buffer.concat(buffers);

		let type = options && options.type !== undefined && String(options.type).toLowerCase();
		if (type && !/[^\u0020-\u007E]/.test(type)) {
			this[TYPE] = type;
		}
	}
	get size() {
		return this[BUFFER].length;
	}
	get type() {
		return this[TYPE];
	}
	text() {
		return Promise.resolve(this[BUFFER].toString());
	}
	arrayBuffer() {
		const buf = this[BUFFER];
		const ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
		return Promise.resolve(ab);
	}
	stream() {
		const readable = new Readable();
		readable._read = function () {};
		readable.push(this[BUFFER]);
		readable.push(null);
		return readable;
	}
	toString() {
		return '[object Blob]';
	}
	slice() {
		const size = this.size;

		const start = arguments[0];
		const end = arguments[1];
		let relativeStart, relativeEnd;
		if (start === undefined) {
			relativeStart = 0;
		} else if (start < 0) {
			relativeStart = Math.max(size + start, 0);
		} else {
			relativeStart = Math.min(start, size);
		}
		if (end === undefined) {
			relativeEnd = size;
		} else if (end < 0) {
			relativeEnd = Math.max(size + end, 0);
		} else {
			relativeEnd = Math.min(end, size);
		}
		const span = Math.max(relativeEnd - relativeStart, 0);

		const buffer = this[BUFFER];
		const slicedBuffer = buffer.slice(relativeStart, relativeStart + span);
		const blob = new Blob([], { type: arguments[2] });
		blob[BUFFER] = slicedBuffer;
		return blob;
	}
}

Object.defineProperties(Blob.prototype, {
	size: { enumerable: true },
	type: { enumerable: true },
	slice: { enumerable: true }
});

Object.defineProperty(Blob.prototype, Symbol.toStringTag, {
	value: 'Blob',
	writable: false,
	enumerable: false,
	configurable: true
});

/**
 * fetch-error.js
 *
 * FetchError interface for operational errors
 */

/**
 * Create FetchError instance
 *
 * @param   String      message      Error message for human
 * @param   String      type         Error type for machine
 * @param   String      systemError  For Node.js system error
 * @return  FetchError
 */
function FetchError(message, type, systemError) {
  Error.call(this, message);

  this.message = message;
  this.type = type;

  // when err.type is `system`, err.code contains system error code
  if (systemError) {
    this.code = this.errno = systemError.code;
  }

  // hide custom error implementation details from end-users
  Error.captureStackTrace(this, this.constructor);
}

FetchError.prototype = Object.create(Error.prototype);
FetchError.prototype.constructor = FetchError;
FetchError.prototype.name = 'FetchError';

let convert;
try {
	convert = require('encoding').convert;
} catch (e) {}

const INTERNALS = Symbol('Body internals');

// fix an issue where "PassThrough" isn't a named export for node <10
const PassThrough = Stream.PassThrough;

/**
 * Body mixin
 *
 * Ref: https://fetch.spec.whatwg.org/#body
 *
 * @param   Stream  body  Readable stream
 * @param   Object  opts  Response options
 * @return  Void
 */
function Body(body) {
	var _this = this;

	var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
	    _ref$size = _ref.size;

	let size = _ref$size === undefined ? 0 : _ref$size;
	var _ref$timeout = _ref.timeout;
	let timeout = _ref$timeout === undefined ? 0 : _ref$timeout;

	if (body == null) {
		// body is undefined or null
		body = null;
	} else if (isURLSearchParams(body)) {
		// body is a URLSearchParams
		body = Buffer.from(body.toString());
	} else if (isBlob(body)) ; else if (Buffer.isBuffer(body)) ; else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {
		// body is ArrayBuffer
		body = Buffer.from(body);
	} else if (ArrayBuffer.isView(body)) {
		// body is ArrayBufferView
		body = Buffer.from(body.buffer, body.byteOffset, body.byteLength);
	} else if (body instanceof Stream) ; else {
		// none of the above
		// coerce to string then buffer
		body = Buffer.from(String(body));
	}
	this[INTERNALS] = {
		body,
		disturbed: false,
		error: null
	};
	this.size = size;
	this.timeout = timeout;

	if (body instanceof Stream) {
		body.on('error', function (err) {
			const error = err.name === 'AbortError' ? err : new FetchError(`Invalid response body while trying to fetch ${_this.url}: ${err.message}`, 'system', err);
			_this[INTERNALS].error = error;
		});
	}
}

Body.prototype = {
	get body() {
		return this[INTERNALS].body;
	},

	get bodyUsed() {
		return this[INTERNALS].disturbed;
	},

	/**
  * Decode response as ArrayBuffer
  *
  * @return  Promise
  */
	arrayBuffer() {
		return consumeBody.call(this).then(function (buf) {
			return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
		});
	},

	/**
  * Return raw response as Blob
  *
  * @return Promise
  */
	blob() {
		let ct = this.headers && this.headers.get('content-type') || '';
		return consumeBody.call(this).then(function (buf) {
			return Object.assign(
			// Prevent copying
			new Blob([], {
				type: ct.toLowerCase()
			}), {
				[BUFFER]: buf
			});
		});
	},

	/**
  * Decode response as json
  *
  * @return  Promise
  */
	json() {
		var _this2 = this;

		return consumeBody.call(this).then(function (buffer) {
			try {
				return JSON.parse(buffer.toString());
			} catch (err) {
				return Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json'));
			}
		});
	},

	/**
  * Decode response as text
  *
  * @return  Promise
  */
	text() {
		return consumeBody.call(this).then(function (buffer) {
			return buffer.toString();
		});
	},

	/**
  * Decode response as buffer (non-spec api)
  *
  * @return  Promise
  */
	buffer() {
		return consumeBody.call(this);
	},

	/**
  * Decode response as text, while automatically detecting the encoding and
  * trying to decode to UTF-8 (non-spec api)
  *
  * @return  Promise
  */
	textConverted() {
		var _this3 = this;

		return consumeBody.call(this).then(function (buffer) {
			return convertBody(buffer, _this3.headers);
		});
	}
};

// In browsers, all properties are enumerable.
Object.defineProperties(Body.prototype, {
	body: { enumerable: true },
	bodyUsed: { enumerable: true },
	arrayBuffer: { enumerable: true },
	blob: { enumerable: true },
	json: { enumerable: true },
	text: { enumerable: true }
});

Body.mixIn = function (proto) {
	for (const name of Object.getOwnPropertyNames(Body.prototype)) {
		// istanbul ignore else: future proof
		if (!(name in proto)) {
			const desc = Object.getOwnPropertyDescriptor(Body.prototype, name);
			Object.defineProperty(proto, name, desc);
		}
	}
};

/**
 * Consume and convert an entire Body to a Buffer.
 *
 * Ref: https://fetch.spec.whatwg.org/#concept-body-consume-body
 *
 * @return  Promise
 */
function consumeBody() {
	var _this4 = this;

	if (this[INTERNALS].disturbed) {
		return Body.Promise.reject(new TypeError(`body used already for: ${this.url}`));
	}

	this[INTERNALS].disturbed = true;

	if (this[INTERNALS].error) {
		return Body.Promise.reject(this[INTERNALS].error);
	}

	let body = this.body;

	// body is null
	if (body === null) {
		return Body.Promise.resolve(Buffer.alloc(0));
	}

	// body is blob
	if (isBlob(body)) {
		body = body.stream();
	}

	// body is buffer
	if (Buffer.isBuffer(body)) {
		return Body.Promise.resolve(body);
	}

	// istanbul ignore if: should never happen
	if (!(body instanceof Stream)) {
		return Body.Promise.resolve(Buffer.alloc(0));
	}

	// body is stream
	// get ready to actually consume the body
	let accum = [];
	let accumBytes = 0;
	let abort = false;

	return new Body.Promise(function (resolve, reject) {
		let resTimeout;

		// allow timeout on slow response body
		if (_this4.timeout) {
			resTimeout = setTimeout(function () {
				abort = true;
				reject(new FetchError(`Response timeout while trying to fetch ${_this4.url} (over ${_this4.timeout}ms)`, 'body-timeout'));
			}, _this4.timeout);
		}

		// handle stream errors
		body.on('error', function (err) {
			if (err.name === 'AbortError') {
				// if the request was aborted, reject with this Error
				abort = true;
				reject(err);
			} else {
				// other errors, such as incorrect content-encoding
				reject(new FetchError(`Invalid response body while trying to fetch ${_this4.url}: ${err.message}`, 'system', err));
			}
		});

		body.on('data', function (chunk) {
			if (abort || chunk === null) {
				return;
			}

			if (_this4.size && accumBytes + chunk.length > _this4.size) {
				abort = true;
				reject(new FetchError(`content size at ${_this4.url} over limit: ${_this4.size}`, 'max-size'));
				return;
			}

			accumBytes += chunk.length;
			accum.push(chunk);
		});

		body.on('end', function () {
			if (abort) {
				return;
			}

			clearTimeout(resTimeout);

			try {
				resolve(Buffer.concat(accum, accumBytes));
			} catch (err) {
				// handle streams that have accumulated too much data (issue #414)
				reject(new FetchError(`Could not create Buffer from response body for ${_this4.url}: ${err.message}`, 'system', err));
			}
		});
	});
}

/**
 * Detect buffer encoding and convert to target encoding
 * ref: http://www.w3.org/TR/2011/WD-html5-20110113/parsing.html#determining-the-character-encoding
 *
 * @param   Buffer  buffer    Incoming buffer
 * @param   String  encoding  Target encoding
 * @return  String
 */
function convertBody(buffer, headers) {
	if (typeof convert !== 'function') {
		throw new Error('The package `encoding` must be installed to use the textConverted() function');
	}

	const ct = headers.get('content-type');
	let charset = 'utf-8';
	let res, str;

	// header
	if (ct) {
		res = /charset=([^;]*)/i.exec(ct);
	}

	// no charset in content type, peek at response body for at most 1024 bytes
	str = buffer.slice(0, 1024).toString();

	// html5
	if (!res && str) {
		res = /<meta.+?charset=(['"])(.+?)\1/i.exec(str);
	}

	// html4
	if (!res && str) {
		res = /<meta[\s]+?http-equiv=(['"])content-type\1[\s]+?content=(['"])(.+?)\2/i.exec(str);
		if (!res) {
			res = /<meta[\s]+?content=(['"])(.+?)\1[\s]+?http-equiv=(['"])content-type\3/i.exec(str);
			if (res) {
				res.pop(); // drop last quote
			}
		}

		if (res) {
			res = /charset=(.*)/i.exec(res.pop());
		}
	}

	// xml
	if (!res && str) {
		res = /<\?xml.+?encoding=(['"])(.+?)\1/i.exec(str);
	}

	// found charset
	if (res) {
		charset = res.pop();

		// prevent decode issues when sites use incorrect encoding
		// ref: https://hsivonen.fi/encoding-menu/
		if (charset === 'gb2312' || charset === 'gbk') {
			charset = 'gb18030';
		}
	}

	// turn raw buffers into a single utf-8 buffer
	return convert(buffer, 'UTF-8', charset).toString();
}

/**
 * Detect a URLSearchParams object
 * ref: https://github.com/bitinn/node-fetch/issues/296#issuecomment-307598143
 *
 * @param   Object  obj     Object to detect by type or brand
 * @return  String
 */
function isURLSearchParams(obj) {
	// Duck-typing as a necessary condition.
	if (typeof obj !== 'object' || typeof obj.append !== 'function' || typeof obj.delete !== 'function' || typeof obj.get !== 'function' || typeof obj.getAll !== 'function' || typeof obj.has !== 'function' || typeof obj.set !== 'function') {
		return false;
	}

	// Brand-checking and more duck-typing as optional condition.
	return obj.constructor.name === 'URLSearchParams' || Object.prototype.toString.call(obj) === '[object URLSearchParams]' || typeof obj.sort === 'function';
}

/**
 * Check if `obj` is a W3C `Blob` object (which `File` inherits from)
 * @param  {*} obj
 * @return {boolean}
 */
function isBlob(obj) {
	return typeof obj === 'object' && typeof obj.arrayBuffer === 'function' && typeof obj.type === 'string' && typeof obj.stream === 'function' && typeof obj.constructor === 'function' && typeof obj.constructor.name === 'string' && /^(Blob|File)$/.test(obj.constructor.name) && /^(Blob|File)$/.test(obj[Symbol.toStringTag]);
}

/**
 * Clone body given Res/Req instance
 *
 * @param   Mixed  instance  Response or Request instance
 * @return  Mixed
 */
function clone(instance) {
	let p1, p2;
	let body = instance.body;

	// don't allow cloning a used body
	if (instance.bodyUsed) {
		throw new Error('cannot clone body after it is used');
	}

	// check that body is a stream and not form-data object
	// note: we can't clone the form-data object without having it as a dependency
	if (body instanceof Stream && typeof body.getBoundary !== 'function') {
		// tee instance body
		p1 = new PassThrough();
		p2 = new PassThrough();
		body.pipe(p1);
		body.pipe(p2);
		// set instance body to teed body and return the other teed body
		instance[INTERNALS].body = p1;
		body = p2;
	}

	return body;
}

/**
 * Performs the operation "extract a `Content-Type` value from |object|" as
 * specified in the specification:
 * https://fetch.spec.whatwg.org/#concept-bodyinit-extract
 *
 * This function assumes that instance.body is present.
 *
 * @param   Mixed  instance  Any options.body input
 */
function extractContentType(body) {
	if (body === null) {
		// body is null
		return null;
	} else if (typeof body === 'string') {
		// body is string
		return 'text/plain;charset=UTF-8';
	} else if (isURLSearchParams(body)) {
		// body is a URLSearchParams
		return 'application/x-www-form-urlencoded;charset=UTF-8';
	} else if (isBlob(body)) {
		// body is blob
		return body.type || null;
	} else if (Buffer.isBuffer(body)) {
		// body is buffer
		return null;
	} else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {
		// body is ArrayBuffer
		return null;
	} else if (ArrayBuffer.isView(body)) {
		// body is ArrayBufferView
		return null;
	} else if (typeof body.getBoundary === 'function') {
		// detect form data input from form-data module
		return `multipart/form-data;boundary=${body.getBoundary()}`;
	} else if (body instanceof Stream) {
		// body is stream
		// can't really do much about this
		return null;
	} else {
		// Body constructor defaults other things to string
		return 'text/plain;charset=UTF-8';
	}
}

/**
 * The Fetch Standard treats this as if "total bytes" is a property on the body.
 * For us, we have to explicitly get it with a function.
 *
 * ref: https://fetch.spec.whatwg.org/#concept-body-total-bytes
 *
 * @param   Body    instance   Instance of Body
 * @return  Number?            Number of bytes, or null if not possible
 */
function getTotalBytes(instance) {
	const body = instance.body;


	if (body === null) {
		// body is null
		return 0;
	} else if (isBlob(body)) {
		return body.size;
	} else if (Buffer.isBuffer(body)) {
		// body is buffer
		return body.length;
	} else if (body && typeof body.getLengthSync === 'function') {
		// detect form data input from form-data module
		if (body._lengthRetrievers && body._lengthRetrievers.length == 0 || // 1.x
		body.hasKnownLength && body.hasKnownLength()) {
			// 2.x
			return body.getLengthSync();
		}
		return null;
	} else {
		// body is stream
		return null;
	}
}

/**
 * Write a Body to a Node.js WritableStream (e.g. http.Request) object.
 *
 * @param   Body    instance   Instance of Body
 * @return  Void
 */
function writeToStream(dest, instance) {
	const body = instance.body;


	if (body === null) {
		// body is null
		dest.end();
	} else if (isBlob(body)) {
		body.stream().pipe(dest);
	} else if (Buffer.isBuffer(body)) {
		// body is buffer
		dest.write(body);
		dest.end();
	} else {
		// body is stream
		body.pipe(dest);
	}
}

// expose Promise
Body.Promise = global.Promise;

/**
 * headers.js
 *
 * Headers class offers convenient helpers
 */

const invalidTokenRegex = /[^\^_`a-zA-Z\-0-9!#$%&'*+.|~]/;
const invalidHeaderCharRegex = /[^\t\x20-\x7e\x80-\xff]/;

function validateName(name) {
	name = `${name}`;
	if (invalidTokenRegex.test(name) || name === '') {
		throw new TypeError(`${name} is not a legal HTTP header name`);
	}
}

function validateValue(value) {
	value = `${value}`;
	if (invalidHeaderCharRegex.test(value)) {
		throw new TypeError(`${value} is not a legal HTTP header value`);
	}
}

/**
 * Find the key in the map object given a header name.
 *
 * Returns undefined if not found.
 *
 * @param   String  name  Header name
 * @return  String|Undefined
 */
function find(map, name) {
	name = name.toLowerCase();
	for (const key in map) {
		if (key.toLowerCase() === name) {
			return key;
		}
	}
	return undefined;
}

const MAP = Symbol('map');
class Headers {
	/**
  * Headers class
  *
  * @param   Object  headers  Response headers
  * @return  Void
  */
	constructor() {
		let init = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined;

		this[MAP] = Object.create(null);

		if (init instanceof Headers) {
			const rawHeaders = init.raw();
			const headerNames = Object.keys(rawHeaders);

			for (const headerName of headerNames) {
				for (const value of rawHeaders[headerName]) {
					this.append(headerName, value);
				}
			}

			return;
		}

		// We don't worry about converting prop to ByteString here as append()
		// will handle it.
		if (init == null) ; else if (typeof init === 'object') {
			const method = init[Symbol.iterator];
			if (method != null) {
				if (typeof method !== 'function') {
					throw new TypeError('Header pairs must be iterable');
				}

				// sequence<sequence<ByteString>>
				// Note: per spec we have to first exhaust the lists then process them
				const pairs = [];
				for (const pair of init) {
					if (typeof pair !== 'object' || typeof pair[Symbol.iterator] !== 'function') {
						throw new TypeError('Each header pair must be iterable');
					}
					pairs.push(Array.from(pair));
				}

				for (const pair of pairs) {
					if (pair.length !== 2) {
						throw new TypeError('Each header pair must be a name/value tuple');
					}
					this.append(pair[0], pair[1]);
				}
			} else {
				// record<ByteString, ByteString>
				for (const key of Object.keys(init)) {
					const value = init[key];
					this.append(key, value);
				}
			}
		} else {
			throw new TypeError('Provided initializer must be an object');
		}
	}

	/**
  * Return combined header value given name
  *
  * @param   String  name  Header name
  * @return  Mixed
  */
	get(name) {
		name = `${name}`;
		validateName(name);
		const key = find(this[MAP], name);
		if (key === undefined) {
			return null;
		}

		return this[MAP][key].join(', ');
	}

	/**
  * Iterate over all headers
  *
  * @param   Function  callback  Executed for each item with parameters (value, name, thisArg)
  * @param   Boolean   thisArg   `this` context for callback function
  * @return  Void
  */
	forEach(callback) {
		let thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;

		let pairs = getHeaders(this);
		let i = 0;
		while (i < pairs.length) {
			var _pairs$i = pairs[i];
			const name = _pairs$i[0],
			      value = _pairs$i[1];

			callback.call(thisArg, value, name, this);
			pairs = getHeaders(this);
			i++;
		}
	}

	/**
  * Overwrite header values given name
  *
  * @param   String  name   Header name
  * @param   String  value  Header value
  * @return  Void
  */
	set(name, value) {
		name = `${name}`;
		value = `${value}`;
		validateName(name);
		validateValue(value);
		const key = find(this[MAP], name);
		this[MAP][key !== undefined ? key : name] = [value];
	}

	/**
  * Append a value onto existing header
  *
  * @param   String  name   Header name
  * @param   String  value  Header value
  * @return  Void
  */
	append(name, value) {
		name = `${name}`;
		value = `${value}`;
		validateName(name);
		validateValue(value);
		const key = find(this[MAP], name);
		if (key !== undefined) {
			this[MAP][key].push(value);
		} else {
			this[MAP][name] = [value];
		}
	}

	/**
  * Check for header name existence
  *
  * @param   String   name  Header name
  * @return  Boolean
  */
	has(name) {
		name = `${name}`;
		validateName(name);
		return find(this[MAP], name) !== undefined;
	}

	/**
  * Delete all header values given name
  *
  * @param   String  name  Header name
  * @return  Void
  */
	delete(name) {
		name = `${name}`;
		validateName(name);
		const key = find(this[MAP], name);
		if (key !== undefined) {
			delete this[MAP][key];
		}
	}

	/**
  * Return raw headers (non-spec api)
  *
  * @return  Object
  */
	raw() {
		return this[MAP];
	}

	/**
  * Get an iterator on keys.
  *
  * @return  Iterator
  */
	keys() {
		return createHeadersIterator(this, 'key');
	}

	/**
  * Get an iterator on values.
  *
  * @return  Iterator
  */
	values() {
		return createHeadersIterator(this, 'value');
	}

	/**
  * Get an iterator on entries.
  *
  * This is the default iterator of the Headers object.
  *
  * @return  Iterator
  */
	[Symbol.iterator]() {
		return createHeadersIterator(this, 'key+value');
	}
}
Headers.prototype.entries = Headers.prototype[Symbol.iterator];

Object.defineProperty(Headers.prototype, Symbol.toStringTag, {
	value: 'Headers',
	writable: false,
	enumerable: false,
	configurable: true
});

Object.defineProperties(Headers.prototype, {
	get: { enumerable: true },
	forEach: { enumerable: true },
	set: { enumerable: true },
	append: { enumerable: true },
	has: { enumerable: true },
	delete: { enumerable: true },
	keys: { enumerable: true },
	values: { enumerable: true },
	entries: { enumerable: true }
});

function getHeaders(headers) {
	let kind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'key+value';

	const keys = Object.keys(headers[MAP]).sort();
	return keys.map(kind === 'key' ? function (k) {
		return k.toLowerCase();
	} : kind === 'value' ? function (k) {
		return headers[MAP][k].join(', ');
	} : function (k) {
		return [k.toLowerCase(), headers[MAP][k].join(', ')];
	});
}

const INTERNAL = Symbol('internal');

function createHeadersIterator(target, kind) {
	const iterator = Object.create(HeadersIteratorPrototype);
	iterator[INTERNAL] = {
		target,
		kind,
		index: 0
	};
	return iterator;
}

const HeadersIteratorPrototype = Object.setPrototypeOf({
	next() {
		// istanbul ignore if
		if (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) {
			throw new TypeError('Value of `this` is not a HeadersIterator');
		}

		var _INTERNAL = this[INTERNAL];
		const target = _INTERNAL.target,
		      kind = _INTERNAL.kind,
		      index = _INTERNAL.index;

		const values = getHeaders(target, kind);
		const len = values.length;
		if (index >= len) {
			return {
				value: undefined,
				done: true
			};
		}

		this[INTERNAL].index = index + 1;

		return {
			value: values[index],
			done: false
		};
	}
}, Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())));

Object.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, {
	value: 'HeadersIterator',
	writable: false,
	enumerable: false,
	configurable: true
});

/**
 * Export the Headers object in a form that Node.js can consume.
 *
 * @param   Headers  headers
 * @return  Object
 */
function exportNodeCompatibleHeaders(headers) {
	const obj = Object.assign({ __proto__: null }, headers[MAP]);

	// http.request() only supports string as Host header. This hack makes
	// specifying custom Host header possible.
	const hostHeaderKey = find(headers[MAP], 'Host');
	if (hostHeaderKey !== undefined) {
		obj[hostHeaderKey] = obj[hostHeaderKey][0];
	}

	return obj;
}

/**
 * Create a Headers object from an object of headers, ignoring those that do
 * not conform to HTTP grammar productions.
 *
 * @param   Object  obj  Object of headers
 * @return  Headers
 */
function createHeadersLenient(obj) {
	const headers = new Headers();
	for (const name of Object.keys(obj)) {
		if (invalidTokenRegex.test(name)) {
			continue;
		}
		if (Array.isArray(obj[name])) {
			for (const val of obj[name]) {
				if (invalidHeaderCharRegex.test(val)) {
					continue;
				}
				if (headers[MAP][name] === undefined) {
					headers[MAP][name] = [val];
				} else {
					headers[MAP][name].push(val);
				}
			}
		} else if (!invalidHeaderCharRegex.test(obj[name])) {
			headers[MAP][name] = [obj[name]];
		}
	}
	return headers;
}

const INTERNALS$1 = Symbol('Response internals');

// fix an issue where "STATUS_CODES" aren't a named export for node <10
const STATUS_CODES = http.STATUS_CODES;

/**
 * Response class
 *
 * @param   Stream  body  Readable stream
 * @param   Object  opts  Response options
 * @return  Void
 */
class Response {
	constructor() {
		let body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
		let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

		Body.call(this, body, opts);

		const status = opts.status || 200;
		const headers = new Headers(opts.headers);

		if (body != null && !headers.has('Content-Type')) {
			const contentType = extractContentType(body);
			if (contentType) {
				headers.append('Content-Type', contentType);
			}
		}

		this[INTERNALS$1] = {
			url: opts.url,
			status,
			statusText: opts.statusText || STATUS_CODES[status],
			headers,
			counter: opts.counter
		};
	}

	get url() {
		return this[INTERNALS$1].url || '';
	}

	get status() {
		return this[INTERNALS$1].status;
	}

	/**
  * Convenience property representing if the request ended normally
  */
	get ok() {
		return this[INTERNALS$1].status >= 200 && this[INTERNALS$1].status < 300;
	}

	get redirected() {
		return this[INTERNALS$1].counter > 0;
	}

	get statusText() {
		return this[INTERNALS$1].statusText;
	}

	get headers() {
		return this[INTERNALS$1].headers;
	}

	/**
  * Clone this response
  *
  * @return  Response
  */
	clone() {
		return new Response(clone(this), {
			url: this.url,
			status: this.status,
			statusText: this.statusText,
			headers: this.headers,
			ok: this.ok,
			redirected: this.redirected
		});
	}
}

Body.mixIn(Response.prototype);

Object.defineProperties(Response.prototype, {
	url: { enumerable: true },
	status: { enumerable: true },
	ok: { enumerable: true },
	redirected: { enumerable: true },
	statusText: { enumerable: true },
	headers: { enumerable: true },
	clone: { enumerable: true }
});

Object.defineProperty(Response.prototype, Symbol.toStringTag, {
	value: 'Response',
	writable: false,
	enumerable: false,
	configurable: true
});

const INTERNALS$2 = Symbol('Request internals');
const URL = Url.URL || whatwgUrl.URL;

// fix an issue where "format", "parse" aren't a named export for node <10
const parse_url = Url.parse;
const format_url = Url.format;

/**
 * Wrapper around `new URL` to handle arbitrary URLs
 *
 * @param  {string} urlStr
 * @return {void}
 */
function parseURL(urlStr) {
	/*
 	Check whether the URL is absolute or not
 		Scheme: https://tools.ietf.org/html/rfc3986#section-3.1
 	Absolute URL: https://tools.ietf.org/html/rfc3986#section-4.3
 */
	if (/^[a-zA-Z][a-zA-Z\d+\-.]*:/.exec(urlStr)) {
		urlStr = new URL(urlStr).toString();
	}

	// Fallback to old implementation for arbitrary URLs
	return parse_url(urlStr);
}

const streamDestructionSupported = 'destroy' in Stream.Readable.prototype;

/**
 * Check if a value is an instance of Request.
 *
 * @param   Mixed   input
 * @return  Boolean
 */
function isRequest(input) {
	return typeof input === 'object' && typeof input[INTERNALS$2] === 'object';
}

function isAbortSignal(signal) {
	const proto = signal && typeof signal === 'object' && Object.getPrototypeOf(signal);
	return !!(proto && proto.constructor.name === 'AbortSignal');
}

/**
 * Request class
 *
 * @param   Mixed   input  Url or Request instance
 * @param   Object  init   Custom options
 * @return  Void
 */
class Request {
	constructor(input) {
		let init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

		let parsedURL;

		// normalize input
		if (!isRequest(input)) {
			if (input && input.href) {
				// in order to support Node.js' Url objects; though WHATWG's URL objects
				// will fall into this branch also (since their `toString()` will return
				// `href` property anyway)
				parsedURL = parseURL(input.href);
			} else {
				// coerce input to a string before attempting to parse
				parsedURL = parseURL(`${input}`);
			}
			input = {};
		} else {
			parsedURL = parseURL(input.url);
		}

		let method = init.method || input.method || 'GET';
		method = method.toUpperCase();

		if ((init.body != null || isRequest(input) && input.body !== null) && (method === 'GET' || method === 'HEAD')) {
			throw new TypeError('Request with GET/HEAD method cannot have body');
		}

		let inputBody = init.body != null ? init.body : isRequest(input) && input.body !== null ? clone(input) : null;

		Body.call(this, inputBody, {
			timeout: init.timeout || input.timeout || 0,
			size: init.size || input.size || 0
		});

		const headers = new Headers(init.headers || input.headers || {});

		if (inputBody != null && !headers.has('Content-Type')) {
			const contentType = extractContentType(inputBody);
			if (contentType) {
				headers.append('Content-Type', contentType);
			}
		}

		let signal = isRequest(input) ? input.signal : null;
		if ('signal' in init) signal = init.signal;

		if (signal != null && !isAbortSignal(signal)) {
			throw new TypeError('Expected signal to be an instanceof AbortSignal');
		}

		this[INTERNALS$2] = {
			method,
			redirect: init.redirect || input.redirect || 'follow',
			headers,
			parsedURL,
			signal
		};

		// node-fetch-only options
		this.follow = init.follow !== undefined ? init.follow : input.follow !== undefined ? input.follow : 20;
		this.compress = init.compress !== undefined ? init.compress : input.compress !== undefined ? input.compress : true;
		this.counter = init.counter || input.counter || 0;
		this.agent = init.agent || input.agent;
	}

	get method() {
		return this[INTERNALS$2].method;
	}

	get url() {
		return format_url(this[INTERNALS$2].parsedURL);
	}

	get headers() {
		return this[INTERNALS$2].headers;
	}

	get redirect() {
		return this[INTERNALS$2].redirect;
	}

	get signal() {
		return this[INTERNALS$2].signal;
	}

	/**
  * Clone this request
  *
  * @return  Request
  */
	clone() {
		return new Request(this);
	}
}

Body.mixIn(Request.prototype);

Object.defineProperty(Request.prototype, Symbol.toStringTag, {
	value: 'Request',
	writable: false,
	enumerable: false,
	configurable: true
});

Object.defineProperties(Request.prototype, {
	method: { enumerable: true },
	url: { enumerable: true },
	headers: { enumerable: true },
	redirect: { enumerable: true },
	clone: { enumerable: true },
	signal: { enumerable: true }
});

/**
 * Convert a Request to Node.js http request options.
 *
 * @param   Request  A Request instance
 * @return  Object   The options object to be passed to http.request
 */
function getNodeRequestOptions(request) {
	const parsedURL = request[INTERNALS$2].parsedURL;
	const headers = new Headers(request[INTERNALS$2].headers);

	// fetch step 1.3
	if (!headers.has('Accept')) {
		headers.set('Accept', '*/*');
	}

	// Basic fetch
	if (!parsedURL.protocol || !parsedURL.hostname) {
		throw new TypeError('Only absolute URLs are supported');
	}

	if (!/^https?:$/.test(parsedURL.protocol)) {
		throw new TypeError('Only HTTP(S) protocols are supported');
	}

	if (request.signal && request.body instanceof Stream.Readable && !streamDestructionSupported) {
		throw new Error('Cancellation of streamed requests with AbortSignal is not supported in node < 8');
	}

	// HTTP-network-or-cache fetch steps 2.4-2.7
	let contentLengthValue = null;
	if (request.body == null && /^(POST|PUT)$/i.test(request.method)) {
		contentLengthValue = '0';
	}
	if (request.body != null) {
		const totalBytes = getTotalBytes(request);
		if (typeof totalBytes === 'number') {
			contentLengthValue = String(totalBytes);
		}
	}
	if (contentLengthValue) {
		headers.set('Content-Length', contentLengthValue);
	}

	// HTTP-network-or-cache fetch step 2.11
	if (!headers.has('User-Agent')) {
		headers.set('User-Agent', 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)');
	}

	// HTTP-network-or-cache fetch step 2.15
	if (request.compress && !headers.has('Accept-Encoding')) {
		headers.set('Accept-Encoding', 'gzip,deflate');
	}

	let agent = request.agent;
	if (typeof agent === 'function') {
		agent = agent(parsedURL);
	}

	if (!headers.has('Connection') && !agent) {
		headers.set('Connection', 'close');
	}

	// HTTP-network fetch step 4.2
	// chunked encoding is handled by Node.js

	return Object.assign({}, parsedURL, {
		method: request.method,
		headers: exportNodeCompatibleHeaders(headers),
		agent
	});
}

/**
 * abort-error.js
 *
 * AbortError interface for cancelled requests
 */

/**
 * Create AbortError instance
 *
 * @param   String      message      Error message for human
 * @return  AbortError
 */
function AbortError(message) {
  Error.call(this, message);

  this.type = 'aborted';
  this.message = message;

  // hide custom error implementation details from end-users
  Error.captureStackTrace(this, this.constructor);
}

AbortError.prototype = Object.create(Error.prototype);
AbortError.prototype.constructor = AbortError;
AbortError.prototype.name = 'AbortError';

const URL$1 = Url.URL || whatwgUrl.URL;

// fix an issue where "PassThrough", "resolve" aren't a named export for node <10
const PassThrough$1 = Stream.PassThrough;

const isDomainOrSubdomain = function isDomainOrSubdomain(destination, original) {
	const orig = new URL$1(original).hostname;
	const dest = new URL$1(destination).hostname;

	return orig === dest || orig[orig.length - dest.length - 1] === '.' && orig.endsWith(dest);
};

/**
 * Fetch function
 *
 * @param   Mixed    url   Absolute url or Request instance
 * @param   Object   opts  Fetch options
 * @return  Promise
 */
function fetch(url, opts) {

	// allow custom promise
	if (!fetch.Promise) {
		throw new Error('native promise missing, set fetch.Promise to your favorite alternative');
	}

	Body.Promise = fetch.Promise;

	// wrap http.request into fetch
	return new fetch.Promise(function (resolve, reject) {
		// build request object
		const request = new Request(url, opts);
		const options = getNodeRequestOptions(request);

		const send = (options.protocol === 'https:' ? https : http).request;
		const signal = request.signal;

		let response = null;

		const abort = function abort() {
			let error = new AbortError('The user aborted a request.');
			reject(error);
			if (request.body && request.body instanceof Stream.Readable) {
				request.body.destroy(error);
			}
			if (!response || !response.body) return;
			response.body.emit('error', error);
		};

		if (signal && signal.aborted) {
			abort();
			return;
		}

		const abortAndFinalize = function abortAndFinalize() {
			abort();
			finalize();
		};

		// send request
		const req = send(options);
		let reqTimeout;

		if (signal) {
			signal.addEventListener('abort', abortAndFinalize);
		}

		function finalize() {
			req.abort();
			if (signal) signal.removeEventListener('abort', abortAndFinalize);
			clearTimeout(reqTimeout);
		}

		if (request.timeout) {
			req.once('socket', function (socket) {
				reqTimeout = setTimeout(function () {
					reject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout'));
					finalize();
				}, request.timeout);
			});
		}

		req.on('error', function (err) {
			reject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err));
			finalize();
		});

		req.on('response', function (res) {
			clearTimeout(reqTimeout);

			const headers = createHeadersLenient(res.headers);

			// HTTP fetch step 5
			if (fetch.isRedirect(res.statusCode)) {
				// HTTP fetch step 5.2
				const location = headers.get('Location');

				// HTTP fetch step 5.3
				let locationURL = null;
				try {
					locationURL = location === null ? null : new URL$1(location, request.url).toString();
				} catch (err) {
					// error here can only be invalid URL in Location: header
					// do not throw when options.redirect == manual
					// let the user extract the errorneous redirect URL
					if (request.redirect !== 'manual') {
						reject(new FetchError(`uri requested responds with an invalid redirect URL: ${location}`, 'invalid-redirect'));
						finalize();
						return;
					}
				}

				// HTTP fetch step 5.5
				switch (request.redirect) {
					case 'error':
						reject(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${request.url}`, 'no-redirect'));
						finalize();
						return;
					case 'manual':
						// node-fetch-specific step: make manual redirect a bit easier to use by setting the Location header value to the resolved URL.
						if (locationURL !== null) {
							// handle corrupted header
							try {
								headers.set('Location', locationURL);
							} catch (err) {
								// istanbul ignore next: nodejs server prevent invalid response headers, we can't test this through normal request
								reject(err);
							}
						}
						break;
					case 'follow':
						// HTTP-redirect fetch step 2
						if (locationURL === null) {
							break;
						}

						// HTTP-redirect fetch step 5
						if (request.counter >= request.follow) {
							reject(new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect'));
							finalize();
							return;
						}

						// HTTP-redirect fetch step 6 (counter increment)
						// Create a new Request object.
						const requestOpts = {
							headers: new Headers(request.headers),
							follow: request.follow,
							counter: request.counter + 1,
							agent: request.agent,
							compress: request.compress,
							method: request.method,
							body: request.body,
							signal: request.signal,
							timeout: request.timeout,
							size: request.size
						};

						if (!isDomainOrSubdomain(request.url, locationURL)) {
							for (const name of ['authorization', 'www-authenticate', 'cookie', 'cookie2']) {
								requestOpts.headers.delete(name);
							}
						}

						// HTTP-redirect fetch step 9
						if (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) {
							reject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect'));
							finalize();
							return;
						}

						// HTTP-redirect fetch step 11
						if (res.statusCode === 303 || (res.statusCode === 301 || res.statusCode === 302) && request.method === 'POST') {
							requestOpts.method = 'GET';
							requestOpts.body = undefined;
							requestOpts.headers.delete('content-length');
						}

						// HTTP-redirect fetch step 15
						resolve(fetch(new Request(locationURL, requestOpts)));
						finalize();
						return;
				}
			}

			// prepare response
			res.once('end', function () {
				if (signal) signal.removeEventListener('abort', abortAndFinalize);
			});
			let body = res.pipe(new PassThrough$1());

			const response_options = {
				url: request.url,
				status: res.statusCode,
				statusText: res.statusMessage,
				headers: headers,
				size: request.size,
				timeout: request.timeout,
				counter: request.counter
			};

			// HTTP-network fetch step 12.1.1.3
			const codings = headers.get('Content-Encoding');

			// HTTP-network fetch step 12.1.1.4: handle content codings

			// in following scenarios we ignore compression support
			// 1. compression support is disabled
			// 2. HEAD request
			// 3. no Content-Encoding header
			// 4. no content response (204)
			// 5. content not modified response (304)
			if (!request.compress || request.method === 'HEAD' || codings === null || res.statusCode === 204 || res.statusCode === 304) {
				response = new Response(body, response_options);
				resolve(response);
				return;
			}

			// For Node v6+
			// Be less strict when decoding compressed responses, since sometimes
			// servers send slightly invalid responses that are still accepted
			// by common browsers.
			// Always using Z_SYNC_FLUSH is what cURL does.
			const zlibOptions = {
				flush: zlib.Z_SYNC_FLUSH,
				finishFlush: zlib.Z_SYNC_FLUSH
			};

			// for gzip
			if (codings == 'gzip' || codings == 'x-gzip') {
				body = body.pipe(zlib.createGunzip(zlibOptions));
				response = new Response(body, response_options);
				resolve(response);
				return;
			}

			// for deflate
			if (codings == 'deflate' || codings == 'x-deflate') {
				// handle the infamous raw deflate response from old servers
				// a hack for old IIS and Apache servers
				const raw = res.pipe(new PassThrough$1());
				raw.once('data', function (chunk) {
					// see http://stackoverflow.com/questions/37519828
					if ((chunk[0] & 0x0F) === 0x08) {
						body = body.pipe(zlib.createInflate());
					} else {
						body = body.pipe(zlib.createInflateRaw());
					}
					response = new Response(body, response_options);
					resolve(response);
				});
				return;
			}

			// for br
			if (codings == 'br' && typeof zlib.createBrotliDecompress === 'function') {
				body = body.pipe(zlib.createBrotliDecompress());
				response = new Response(body, response_options);
				resolve(response);
				return;
			}

			// otherwise, use response as-is
			response = new Response(body, response_options);
			resolve(response);
		});

		writeToStream(req, request);
	});
}
/**
 * Redirect code matching
 *
 * @param   Number   code  Status code
 * @return  Boolean
 */
fetch.isRedirect = function (code) {
	return code === 301 || code === 302 || code === 303 || code === 307 || code === 308;
};

// expose Promise
fetch.Promise = global.Promise;

export default fetch;
export { Headers, Request, Response, FetchError };
'use strict';

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

function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }

var Stream = _interopDefault(require('stream'));
var http = _interopDefault(require('http'));
var Url = _interopDefault(require('url'));
var whatwgUrl = _interopDefault(require('whatwg-url'));
var https = _interopDefault(require('https'));
var zlib = _interopDefault(require('zlib'));

// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js

// fix for "Readable" isn't a named export issue
const Readable = Stream.Readable;

const BUFFER = Symbol('buffer');
const TYPE = Symbol('type');

class Blob {
	constructor() {
		this[TYPE] = '';

		const blobParts = arguments[0];
		const options = arguments[1];

		const buffers = [];
		let size = 0;

		if (blobParts) {
			const a = blobParts;
			const length = Number(a.length);
			for (let i = 0; i < length; i++) {
				const element = a[i];
				let buffer;
				if (element instanceof Buffer) {
					buffer = element;
				} else if (ArrayBuffer.isView(element)) {
					buffer = Buffer.from(element.buffer, element.byteOffset, element.byteLength);
				} else if (element instanceof ArrayBuffer) {
					buffer = Buffer.from(element);
				} else if (element instanceof Blob) {
					buffer = element[BUFFER];
				} else {
					buffer = Buffer.from(typeof element === 'string' ? element : String(element));
				}
				size += buffer.length;
				buffers.push(buffer);
			}
		}

		this[BUFFER] = Buffer.concat(buffers);

		let type = options && options.type !== undefined && String(options.type).toLowerCase();
		if (type && !/[^\u0020-\u007E]/.test(type)) {
			this[TYPE] = type;
		}
	}
	get size() {
		return this[BUFFER].length;
	}
	get type() {
		return this[TYPE];
	}
	text() {
		return Promise.resolve(this[BUFFER].toString());
	}
	arrayBuffer() {
		const buf = this[BUFFER];
		const ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
		return Promise.resolve(ab);
	}
	stream() {
		const readable = new Readable();
		readable._read = function () {};
		readable.push(this[BUFFER]);
		readable.push(null);
		return readable;
	}
	toString() {
		return '[object Blob]';
	}
	slice() {
		const size = this.size;

		const start = arguments[0];
		const end = arguments[1];
		let relativeStart, relativeEnd;
		if (start === undefined) {
			relativeStart = 0;
		} else if (start < 0) {
			relativeStart = Math.max(size + start, 0);
		} else {
			relativeStart = Math.min(start, size);
		}
		if (end === undefined) {
			relativeEnd = size;
		} else if (end < 0) {
			relativeEnd = Math.max(size + end, 0);
		} else {
			relativeEnd = Math.min(end, size);
		}
		const span = Math.max(relativeEnd - relativeStart, 0);

		const buffer = this[BUFFER];
		const slicedBuffer = buffer.slice(relativeStart, relativeStart + span);
		const blob = new Blob([], { type: arguments[2] });
		blob[BUFFER] = slicedBuffer;
		return blob;
	}
}

Object.defineProperties(Blob.prototype, {
	size: { enumerable: true },
	type: { enumerable: true },
	slice: { enumerable: true }
});

Object.defineProperty(Blob.prototype, Symbol.toStringTag, {
	value: 'Blob',
	writable: false,
	enumerable: false,
	configurable: true
});

/**
 * fetch-error.js
 *
 * FetchError interface for operational errors
 */

/**
 * Create FetchError instance
 *
 * @param   String      message      Error message for human
 * @param   String      type         Error type for machine
 * @param   String      systemError  For Node.js system error
 * @return  FetchError
 */
function FetchError(message, type, systemError) {
  Error.call(this, message);

  this.message = message;
  this.type = type;

  // when err.type is `system`, err.code contains system error code
  if (systemError) {
    this.code = this.errno = systemError.code;
  }

  // hide custom error implementation details from end-users
  Error.captureStackTrace(this, this.constructor);
}

FetchError.prototype = Object.create(Error.prototype);
FetchError.prototype.constructor = FetchError;
FetchError.prototype.name = 'FetchError';

let convert;
try {
	convert = require('encoding').convert;
} catch (e) {}

const INTERNALS = Symbol('Body internals');

// fix an issue where "PassThrough" isn't a named export for node <10
const PassThrough = Stream.PassThrough;

/**
 * Body mixin
 *
 * Ref: https://fetch.spec.whatwg.org/#body
 *
 * @param   Stream  body  Readable stream
 * @param   Object  opts  Response options
 * @return  Void
 */
function Body(body) {
	var _this = this;

	var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
	    _ref$size = _ref.size;

	let size = _ref$size === undefined ? 0 : _ref$size;
	var _ref$timeout = _ref.timeout;
	let timeout = _ref$timeout === undefined ? 0 : _ref$timeout;

	if (body == null) {
		// body is undefined or null
		body = null;
	} else if (isURLSearchParams(body)) {
		// body is a URLSearchParams
		body = Buffer.from(body.toString());
	} else if (isBlob(body)) ; else if (Buffer.isBuffer(body)) ; else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {
		// body is ArrayBuffer
		body = Buffer.from(body);
	} else if (ArrayBuffer.isView(body)) {
		// body is ArrayBufferView
		body = Buffer.from(body.buffer, body.byteOffset, body.byteLength);
	} else if (body instanceof Stream) ; else {
		// none of the above
		// coerce to string then buffer
		body = Buffer.from(String(body));
	}
	this[INTERNALS] = {
		body,
		disturbed: false,
		error: null
	};
	this.size = size;
	this.timeout = timeout;

	if (body instanceof Stream) {
		body.on('error', function (err) {
			const error = err.name === 'AbortError' ? err : new FetchError(`Invalid response body while trying to fetch ${_this.url}: ${err.message}`, 'system', err);
			_this[INTERNALS].error = error;
		});
	}
}

Body.prototype = {
	get body() {
		return this[INTERNALS].body;
	},

	get bodyUsed() {
		return this[INTERNALS].disturbed;
	},

	/**
  * Decode response as ArrayBuffer
  *
  * @return  Promise
  */
	arrayBuffer() {
		return consumeBody.call(this).then(function (buf) {
			return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
		});
	},

	/**
  * Return raw response as Blob
  *
  * @return Promise
  */
	blob() {
		let ct = this.headers && this.headers.get('content-type') || '';
		return consumeBody.call(this).then(function (buf) {
			return Object.assign(
			// Prevent copying
			new Blob([], {
				type: ct.toLowerCase()
			}), {
				[BUFFER]: buf
			});
		});
	},

	/**
  * Decode response as json
  *
  * @return  Promise
  */
	json() {
		var _this2 = this;

		return consumeBody.call(this).then(function (buffer) {
			try {
				return JSON.parse(buffer.toString());
			} catch (err) {
				return Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json'));
			}
		});
	},

	/**
  * Decode response as text
  *
  * @return  Promise
  */
	text() {
		return consumeBody.call(this).then(function (buffer) {
			return buffer.toString();
		});
	},

	/**
  * Decode response as buffer (non-spec api)
  *
  * @return  Promise
  */
	buffer() {
		return consumeBody.call(this);
	},

	/**
  * Decode response as text, while automatically detecting the encoding and
  * trying to decode to UTF-8 (non-spec api)
  *
  * @return  Promise
  */
	textConverted() {
		var _this3 = this;

		return consumeBody.call(this).then(function (buffer) {
			return convertBody(buffer, _this3.headers);
		});
	}
};

// In browsers, all properties are enumerable.
Object.defineProperties(Body.prototype, {
	body: { enumerable: true },
	bodyUsed: { enumerable: true },
	arrayBuffer: { enumerable: true },
	blob: { enumerable: true },
	json: { enumerable: true },
	text: { enumerable: true }
});

Body.mixIn = function (proto) {
	for (const name of Object.getOwnPropertyNames(Body.prototype)) {
		// istanbul ignore else: future proof
		if (!(name in proto)) {
			const desc = Object.getOwnPropertyDescriptor(Body.prototype, name);
			Object.defineProperty(proto, name, desc);
		}
	}
};

/**
 * Consume and convert an entire Body to a Buffer.
 *
 * Ref: https://fetch.spec.whatwg.org/#concept-body-consume-body
 *
 * @return  Promise
 */
function consumeBody() {
	var _this4 = this;

	if (this[INTERNALS].disturbed) {
		return Body.Promise.reject(new TypeError(`body used already for: ${this.url}`));
	}

	this[INTERNALS].disturbed = true;

	if (this[INTERNALS].error) {
		return Body.Promise.reject(this[INTERNALS].error);
	}

	let body = this.body;

	// body is null
	if (body === null) {
		return Body.Promise.resolve(Buffer.alloc(0));
	}

	// body is blob
	if (isBlob(body)) {
		body = body.stream();
	}

	// body is buffer
	if (Buffer.isBuffer(body)) {
		return Body.Promise.resolve(body);
	}

	// istanbul ignore if: should never happen
	if (!(body instanceof Stream)) {
		return Body.Promise.resolve(Buffer.alloc(0));
	}

	// body is stream
	// get ready to actually consume the body
	let accum = [];
	let accumBytes = 0;
	let abort = false;

	return new Body.Promise(function (resolve, reject) {
		let resTimeout;

		// allow timeout on slow response body
		if (_this4.timeout) {
			resTimeout = setTimeout(function () {
				abort = true;
				reject(new FetchError(`Response timeout while trying to fetch ${_this4.url} (over ${_this4.timeout}ms)`, 'body-timeout'));
			}, _this4.timeout);
		}

		// handle stream errors
		body.on('error', function (err) {
			if (err.name === 'AbortError') {
				// if the request was aborted, reject with this Error
				abort = true;
				reject(err);
			} else {
				// other errors, such as incorrect content-encoding
				reject(new FetchError(`Invalid response body while trying to fetch ${_this4.url}: ${err.message}`, 'system', err));
			}
		});

		body.on('data', function (chunk) {
			if (abort || chunk === null) {
				return;
			}

			if (_this4.size && accumBytes + chunk.length > _this4.size) {
				abort = true;
				reject(new FetchError(`content size at ${_this4.url} over limit: ${_this4.size}`, 'max-size'));
				return;
			}

			accumBytes += chunk.length;
			accum.push(chunk);
		});

		body.on('end', function () {
			if (abort) {
				return;
			}

			clearTimeout(resTimeout);

			try {
				resolve(Buffer.concat(accum, accumBytes));
			} catch (err) {
				// handle streams that have accumulated too much data (issue #414)
				reject(new FetchError(`Could not create Buffer from response body for ${_this4.url}: ${err.message}`, 'system', err));
			}
		});
	});
}

/**
 * Detect buffer encoding and convert to target encoding
 * ref: http://www.w3.org/TR/2011/WD-html5-20110113/parsing.html#determining-the-character-encoding
 *
 * @param   Buffer  buffer    Incoming buffer
 * @param   String  encoding  Target encoding
 * @return  String
 */
function convertBody(buffer, headers) {
	if (typeof convert !== 'function') {
		throw new Error('The package `encoding` must be installed to use the textConverted() function');
	}

	const ct = headers.get('content-type');
	let charset = 'utf-8';
	let res, str;

	// header
	if (ct) {
		res = /charset=([^;]*)/i.exec(ct);
	}

	// no charset in content type, peek at response body for at most 1024 bytes
	str = buffer.slice(0, 1024).toString();

	// html5
	if (!res && str) {
		res = /<meta.+?charset=(['"])(.+?)\1/i.exec(str);
	}

	// html4
	if (!res && str) {
		res = /<meta[\s]+?http-equiv=(['"])content-type\1[\s]+?content=(['"])(.+?)\2/i.exec(str);
		if (!res) {
			res = /<meta[\s]+?content=(['"])(.+?)\1[\s]+?http-equiv=(['"])content-type\3/i.exec(str);
			if (res) {
				res.pop(); // drop last quote
			}
		}

		if (res) {
			res = /charset=(.*)/i.exec(res.pop());
		}
	}

	// xml
	if (!res && str) {
		res = /<\?xml.+?encoding=(['"])(.+?)\1/i.exec(str);
	}

	// found charset
	if (res) {
		charset = res.pop();

		// prevent decode issues when sites use incorrect encoding
		// ref: https://hsivonen.fi/encoding-menu/
		if (charset === 'gb2312' || charset === 'gbk') {
			charset = 'gb18030';
		}
	}

	// turn raw buffers into a single utf-8 buffer
	return convert(buffer, 'UTF-8', charset).toString();
}

/**
 * Detect a URLSearchParams object
 * ref: https://github.com/bitinn/node-fetch/issues/296#issuecomment-307598143
 *
 * @param   Object  obj     Object to detect by type or brand
 * @return  String
 */
function isURLSearchParams(obj) {
	// Duck-typing as a necessary condition.
	if (typeof obj !== 'object' || typeof obj.append !== 'function' || typeof obj.delete !== 'function' || typeof obj.get !== 'function' || typeof obj.getAll !== 'function' || typeof obj.has !== 'function' || typeof obj.set !== 'function') {
		return false;
	}

	// Brand-checking and more duck-typing as optional condition.
	return obj.constructor.name === 'URLSearchParams' || Object.prototype.toString.call(obj) === '[object URLSearchParams]' || typeof obj.sort === 'function';
}

/**
 * Check if `obj` is a W3C `Blob` object (which `File` inherits from)
 * @param  {*} obj
 * @return {boolean}
 */
function isBlob(obj) {
	return typeof obj === 'object' && typeof obj.arrayBuffer === 'function' && typeof obj.type === 'string' && typeof obj.stream === 'function' && typeof obj.constructor === 'function' && typeof obj.constructor.name === 'string' && /^(Blob|File)$/.test(obj.constructor.name) && /^(Blob|File)$/.test(obj[Symbol.toStringTag]);
}

/**
 * Clone body given Res/Req instance
 *
 * @param   Mixed  instance  Response or Request instance
 * @return  Mixed
 */
function clone(instance) {
	let p1, p2;
	let body = instance.body;

	// don't allow cloning a used body
	if (instance.bodyUsed) {
		throw new Error('cannot clone body after it is used');
	}

	// check that body is a stream and not form-data object
	// note: we can't clone the form-data object without having it as a dependency
	if (body instanceof Stream && typeof body.getBoundary !== 'function') {
		// tee instance body
		p1 = new PassThrough();
		p2 = new PassThrough();
		body.pipe(p1);
		body.pipe(p2);
		// set instance body to teed body and return the other teed body
		instance[INTERNALS].body = p1;
		body = p2;
	}

	return body;
}

/**
 * Performs the operation "extract a `Content-Type` value from |object|" as
 * specified in the specification:
 * https://fetch.spec.whatwg.org/#concept-bodyinit-extract
 *
 * This function assumes that instance.body is present.
 *
 * @param   Mixed  instance  Any options.body input
 */
function extractContentType(body) {
	if (body === null) {
		// body is null
		return null;
	} else if (typeof body === 'string') {
		// body is string
		return 'text/plain;charset=UTF-8';
	} else if (isURLSearchParams(body)) {
		// body is a URLSearchParams
		return 'application/x-www-form-urlencoded;charset=UTF-8';
	} else if (isBlob(body)) {
		// body is blob
		return body.type || null;
	} else if (Buffer.isBuffer(body)) {
		// body is buffer
		return null;
	} else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {
		// body is ArrayBuffer
		return null;
	} else if (ArrayBuffer.isView(body)) {
		// body is ArrayBufferView
		return null;
	} else if (typeof body.getBoundary === 'function') {
		// detect form data input from form-data module
		return `multipart/form-data;boundary=${body.getBoundary()}`;
	} else if (body instanceof Stream) {
		// body is stream
		// can't really do much about this
		return null;
	} else {
		// Body constructor defaults other things to string
		return 'text/plain;charset=UTF-8';
	}
}

/**
 * The Fetch Standard treats this as if "total bytes" is a property on the body.
 * For us, we have to explicitly get it with a function.
 *
 * ref: https://fetch.spec.whatwg.org/#concept-body-total-bytes
 *
 * @param   Body    instance   Instance of Body
 * @return  Number?            Number of bytes, or null if not possible
 */
function getTotalBytes(instance) {
	const body = instance.body;


	if (body === null) {
		// body is null
		return 0;
	} else if (isBlob(body)) {
		return body.size;
	} else if (Buffer.isBuffer(body)) {
		// body is buffer
		return body.length;
	} else if (body && typeof body.getLengthSync === 'function') {
		// detect form data input from form-data module
		if (body._lengthRetrievers && body._lengthRetrievers.length == 0 || // 1.x
		body.hasKnownLength && body.hasKnownLength()) {
			// 2.x
			return body.getLengthSync();
		}
		return null;
	} else {
		// body is stream
		return null;
	}
}

/**
 * Write a Body to a Node.js WritableStream (e.g. http.Request) object.
 *
 * @param   Body    instance   Instance of Body
 * @return  Void
 */
function writeToStream(dest, instance) {
	const body = instance.body;


	if (body === null) {
		// body is null
		dest.end();
	} else if (isBlob(body)) {
		body.stream().pipe(dest);
	} else if (Buffer.isBuffer(body)) {
		// body is buffer
		dest.write(body);
		dest.end();
	} else {
		// body is stream
		body.pipe(dest);
	}
}

// expose Promise
Body.Promise = global.Promise;

/**
 * headers.js
 *
 * Headers class offers convenient helpers
 */

const invalidTokenRegex = /[^\^_`a-zA-Z\-0-9!#$%&'*+.|~]/;
const invalidHeaderCharRegex = /[^\t\x20-\x7e\x80-\xff]/;

function validateName(name) {
	name = `${name}`;
	if (invalidTokenRegex.test(name) || name === '') {
		throw new TypeError(`${name} is not a legal HTTP header name`);
	}
}

function validateValue(value) {
	value = `${value}`;
	if (invalidHeaderCharRegex.test(value)) {
		throw new TypeError(`${value} is not a legal HTTP header value`);
	}
}

/**
 * Find the key in the map object given a header name.
 *
 * Returns undefined if not found.
 *
 * @param   String  name  Header name
 * @return  String|Undefined
 */
function find(map, name) {
	name = name.toLowerCase();
	for (const key in map) {
		if (key.toLowerCase() === name) {
			return key;
		}
	}
	return undefined;
}

const MAP = Symbol('map');
class Headers {
	/**
  * Headers class
  *
  * @param   Object  headers  Response headers
  * @return  Void
  */
	constructor() {
		let init = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined;

		this[MAP] = Object.create(null);

		if (init instanceof Headers) {
			const rawHeaders = init.raw();
			const headerNames = Object.keys(rawHeaders);

			for (const headerName of headerNames) {
				for (const value of rawHeaders[headerName]) {
					this.append(headerName, value);
				}
			}

			return;
		}

		// We don't worry about converting prop to ByteString here as append()
		// will handle it.
		if (init == null) ; else if (typeof init === 'object') {
			const method = init[Symbol.iterator];
			if (method != null) {
				if (typeof method !== 'function') {
					throw new TypeError('Header pairs must be iterable');
				}

				// sequence<sequence<ByteString>>
				// Note: per spec we have to first exhaust the lists then process them
				const pairs = [];
				for (const pair of init) {
					if (typeof pair !== 'object' || typeof pair[Symbol.iterator] !== 'function') {
						throw new TypeError('Each header pair must be iterable');
					}
					pairs.push(Array.from(pair));
				}

				for (const pair of pairs) {
					if (pair.length !== 2) {
						throw new TypeError('Each header pair must be a name/value tuple');
					}
					this.append(pair[0], pair[1]);
				}
			} else {
				// record<ByteString, ByteString>
				for (const key of Object.keys(init)) {
					const value = init[key];
					this.append(key, value);
				}
			}
		} else {
			throw new TypeError('Provided initializer must be an object');
		}
	}

	/**
  * Return combined header value given name
  *
  * @param   String  name  Header name
  * @return  Mixed
  */
	get(name) {
		name = `${name}`;
		validateName(name);
		const key = find(this[MAP], name);
		if (key === undefined) {
			return null;
		}

		return this[MAP][key].join(', ');
	}

	/**
  * Iterate over all headers
  *
  * @param   Function  callback  Executed for each item with parameters (value, name, thisArg)
  * @param   Boolean   thisArg   `this` context for callback function
  * @return  Void
  */
	forEach(callback) {
		let thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;

		let pairs = getHeaders(this);
		let i = 0;
		while (i < pairs.length) {
			var _pairs$i = pairs[i];
			const name = _pairs$i[0],
			      value = _pairs$i[1];

			callback.call(thisArg, value, name, this);
			pairs = getHeaders(this);
			i++;
		}
	}

	/**
  * Overwrite header values given name
  *
  * @param   String  name   Header name
  * @param   String  value  Header value
  * @return  Void
  */
	set(name, value) {
		name = `${name}`;
		value = `${value}`;
		validateName(name);
		validateValue(value);
		const key = find(this[MAP], name);
		this[MAP][key !== undefined ? key : name] = [value];
	}

	/**
  * Append a value onto existing header
  *
  * @param   String  name   Header name
  * @param   String  value  Header value
  * @return  Void
  */
	append(name, value) {
		name = `${name}`;
		value = `${value}`;
		validateName(name);
		validateValue(value);
		const key = find(this[MAP], name);
		if (key !== undefined) {
			this[MAP][key].push(value);
		} else {
			this[MAP][name] = [value];
		}
	}

	/**
  * Check for header name existence
  *
  * @param   String   name  Header name
  * @return  Boolean
  */
	has(name) {
		name = `${name}`;
		validateName(name);
		return find(this[MAP], name) !== undefined;
	}

	/**
  * Delete all header values given name
  *
  * @param   String  name  Header name
  * @return  Void
  */
	delete(name) {
		name = `${name}`;
		validateName(name);
		const key = find(this[MAP], name);
		if (key !== undefined) {
			delete this[MAP][key];
		}
	}

	/**
  * Return raw headers (non-spec api)
  *
  * @return  Object
  */
	raw() {
		return this[MAP];
	}

	/**
  * Get an iterator on keys.
  *
  * @return  Iterator
  */
	keys() {
		return createHeadersIterator(this, 'key');
	}

	/**
  * Get an iterator on values.
  *
  * @return  Iterator
  */
	values() {
		return createHeadersIterator(this, 'value');
	}

	/**
  * Get an iterator on entries.
  *
  * This is the default iterator of the Headers object.
  *
  * @return  Iterator
  */
	[Symbol.iterator]() {
		return createHeadersIterator(this, 'key+value');
	}
}
Headers.prototype.entries = Headers.prototype[Symbol.iterator];

Object.defineProperty(Headers.prototype, Symbol.toStringTag, {
	value: 'Headers',
	writable: false,
	enumerable: false,
	configurable: true
});

Object.defineProperties(Headers.prototype, {
	get: { enumerable: true },
	forEach: { enumerable: true },
	set: { enumerable: true },
	append: { enumerable: true },
	has: { enumerable: true },
	delete: { enumerable: true },
	keys: { enumerable: true },
	values: { enumerable: true },
	entries: { enumerable: true }
});

function getHeaders(headers) {
	let kind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'key+value';

	const keys = Object.keys(headers[MAP]).sort();
	return keys.map(kind === 'key' ? function (k) {
		return k.toLowerCase();
	} : kind === 'value' ? function (k) {
		return headers[MAP][k].join(', ');
	} : function (k) {
		return [k.toLowerCase(), headers[MAP][k].join(', ')];
	});
}

const INTERNAL = Symbol('internal');

function createHeadersIterator(target, kind) {
	const iterator = Object.create(HeadersIteratorPrototype);
	iterator[INTERNAL] = {
		target,
		kind,
		index: 0
	};
	return iterator;
}

const HeadersIteratorPrototype = Object.setPrototypeOf({
	next() {
		// istanbul ignore if
		if (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) {
			throw new TypeError('Value of `this` is not a HeadersIterator');
		}

		var _INTERNAL = this[INTERNAL];
		const target = _INTERNAL.target,
		      kind = _INTERNAL.kind,
		      index = _INTERNAL.index;

		const values = getHeaders(target, kind);
		const len = values.length;
		if (index >= len) {
			return {
				value: undefined,
				done: true
			};
		}

		this[INTERNAL].index = index + 1;

		return {
			value: values[index],
			done: false
		};
	}
}, Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())));

Object.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, {
	value: 'HeadersIterator',
	writable: false,
	enumerable: false,
	configurable: true
});

/**
 * Export the Headers object in a form that Node.js can consume.
 *
 * @param   Headers  headers
 * @return  Object
 */
function exportNodeCompatibleHeaders(headers) {
	const obj = Object.assign({ __proto__: null }, headers[MAP]);

	// http.request() only supports string as Host header. This hack makes
	// specifying custom Host header possible.
	const hostHeaderKey = find(headers[MAP], 'Host');
	if (hostHeaderKey !== undefined) {
		obj[hostHeaderKey] = obj[hostHeaderKey][0];
	}

	return obj;
}

/**
 * Create a Headers object from an object of headers, ignoring those that do
 * not conform to HTTP grammar productions.
 *
 * @param   Object  obj  Object of headers
 * @return  Headers
 */
function createHeadersLenient(obj) {
	const headers = new Headers();
	for (const name of Object.keys(obj)) {
		if (invalidTokenRegex.test(name)) {
			continue;
		}
		if (Array.isArray(obj[name])) {
			for (const val of obj[name]) {
				if (invalidHeaderCharRegex.test(val)) {
					continue;
				}
				if (headers[MAP][name] === undefined) {
					headers[MAP][name] = [val];
				} else {
					headers[MAP][name].push(val);
				}
			}
		} else if (!invalidHeaderCharRegex.test(obj[name])) {
			headers[MAP][name] = [obj[name]];
		}
	}
	return headers;
}

const INTERNALS$1 = Symbol('Response internals');

// fix an issue where "STATUS_CODES" aren't a named export for node <10
const STATUS_CODES = http.STATUS_CODES;

/**
 * Response class
 *
 * @param   Stream  body  Readable stream
 * @param   Object  opts  Response options
 * @return  Void
 */
class Response {
	constructor() {
		let body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
		let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

		Body.call(this, body, opts);

		const status = opts.status || 200;
		const headers = new Headers(opts.headers);

		if (body != null && !headers.has('Content-Type')) {
			const contentType = extractContentType(body);
			if (contentType) {
				headers.append('Content-Type', contentType);
			}
		}

		this[INTERNALS$1] = {
			url: opts.url,
			status,
			statusText: opts.statusText || STATUS_CODES[status],
			headers,
			counter: opts.counter
		};
	}

	get url() {
		return this[INTERNALS$1].url || '';
	}

	get status() {
		return this[INTERNALS$1].status;
	}

	/**
  * Convenience property representing if the request ended normally
  */
	get ok() {
		return this[INTERNALS$1].status >= 200 && this[INTERNALS$1].status < 300;
	}

	get redirected() {
		return this[INTERNALS$1].counter > 0;
	}

	get statusText() {
		return this[INTERNALS$1].statusText;
	}

	get headers() {
		return this[INTERNALS$1].headers;
	}

	/**
  * Clone this response
  *
  * @return  Response
  */
	clone() {
		return new Response(clone(this), {
			url: this.url,
			status: this.status,
			statusText: this.statusText,
			headers: this.headers,
			ok: this.ok,
			redirected: this.redirected
		});
	}
}

Body.mixIn(Response.prototype);

Object.defineProperties(Response.prototype, {
	url: { enumerable: true },
	status: { enumerable: true },
	ok: { enumerable: true },
	redirected: { enumerable: true },
	statusText: { enumerable: true },
	headers: { enumerable: true },
	clone: { enumerable: true }
});

Object.defineProperty(Response.prototype, Symbol.toStringTag, {
	value: 'Response',
	writable: false,
	enumerable: false,
	configurable: true
});

const INTERNALS$2 = Symbol('Request internals');
const URL = Url.URL || whatwgUrl.URL;

// fix an issue where "format", "parse" aren't a named export for node <10
const parse_url = Url.parse;
const format_url = Url.format;

/**
 * Wrapper around `new URL` to handle arbitrary URLs
 *
 * @param  {string} urlStr
 * @return {void}
 */
function parseURL(urlStr) {
	/*
 	Check whether the URL is absolute or not
 		Scheme: https://tools.ietf.org/html/rfc3986#section-3.1
 	Absolute URL: https://tools.ietf.org/html/rfc3986#section-4.3
 */
	if (/^[a-zA-Z][a-zA-Z\d+\-.]*:/.exec(urlStr)) {
		urlStr = new URL(urlStr).toString();
	}

	// Fallback to old implementation for arbitrary URLs
	return parse_url(urlStr);
}

const streamDestructionSupported = 'destroy' in Stream.Readable.prototype;

/**
 * Check if a value is an instance of Request.
 *
 * @param   Mixed   input
 * @return  Boolean
 */
function isRequest(input) {
	return typeof input === 'object' && typeof input[INTERNALS$2] === 'object';
}

function isAbortSignal(signal) {
	const proto = signal && typeof signal === 'object' && Object.getPrototypeOf(signal);
	return !!(proto && proto.constructor.name === 'AbortSignal');
}

/**
 * Request class
 *
 * @param   Mixed   input  Url or Request instance
 * @param   Object  init   Custom options
 * @return  Void
 */
class Request {
	constructor(input) {
		let init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

		let parsedURL;

		// normalize input
		if (!isRequest(input)) {
			if (input && input.href) {
				// in order to support Node.js' Url objects; though WHATWG's URL objects
				// will fall into this branch also (since their `toString()` will return
				// `href` property anyway)
				parsedURL = parseURL(input.href);
			} else {
				// coerce input to a string before attempting to parse
				parsedURL = parseURL(`${input}`);
			}
			input = {};
		} else {
			parsedURL = parseURL(input.url);
		}

		let method = init.method || input.method || 'GET';
		method = method.toUpperCase();

		if ((init.body != null || isRequest(input) && input.body !== null) && (method === 'GET' || method === 'HEAD')) {
			throw new TypeError('Request with GET/HEAD method cannot have body');
		}

		let inputBody = init.body != null ? init.body : isRequest(input) && input.body !== null ? clone(input) : null;

		Body.call(this, inputBody, {
			timeout: init.timeout || input.timeout || 0,
			size: init.size || input.size || 0
		});

		const headers = new Headers(init.headers || input.headers || {});

		if (inputBody != null && !headers.has('Content-Type')) {
			const contentType = extractContentType(inputBody);
			if (contentType) {
				headers.append('Content-Type', contentType);
			}
		}

		let signal = isRequest(input) ? input.signal : null;
		if ('signal' in init) signal = init.signal;

		if (signal != null && !isAbortSignal(signal)) {
			throw new TypeError('Expected signal to be an instanceof AbortSignal');
		}

		this[INTERNALS$2] = {
			method,
			redirect: init.redirect || input.redirect || 'follow',
			headers,
			parsedURL,
			signal
		};

		// node-fetch-only options
		this.follow = init.follow !== undefined ? init.follow : input.follow !== undefined ? input.follow : 20;
		this.compress = init.compress !== undefined ? init.compress : input.compress !== undefined ? input.compress : true;
		this.counter = init.counter || input.counter || 0;
		this.agent = init.agent || input.agent;
	}

	get method() {
		return this[INTERNALS$2].method;
	}

	get url() {
		return format_url(this[INTERNALS$2].parsedURL);
	}

	get headers() {
		return this[INTERNALS$2].headers;
	}

	get redirect() {
		return this[INTERNALS$2].redirect;
	}

	get signal() {
		return this[INTERNALS$2].signal;
	}

	/**
  * Clone this request
  *
  * @return  Request
  */
	clone() {
		return new Request(this);
	}
}

Body.mixIn(Request.prototype);

Object.defineProperty(Request.prototype, Symbol.toStringTag, {
	value: 'Request',
	writable: false,
	enumerable: false,
	configurable: true
});

Object.defineProperties(Request.prototype, {
	method: { enumerable: true },
	url: { enumerable: true },
	headers: { enumerable: true },
	redirect: { enumerable: true },
	clone: { enumerable: true },
	signal: { enumerable: true }
});

/**
 * Convert a Request to Node.js http request options.
 *
 * @param   Request  A Request instance
 * @return  Object   The options object to be passed to http.request
 */
function getNodeRequestOptions(request) {
	const parsedURL = request[INTERNALS$2].parsedURL;
	const headers = new Headers(request[INTERNALS$2].headers);

	// fetch step 1.3
	if (!headers.has('Accept')) {
		headers.set('Accept', '*/*');
	}

	// Basic fetch
	if (!parsedURL.protocol || !parsedURL.hostname) {
		throw new TypeError('Only absolute URLs are supported');
	}

	if (!/^https?:$/.test(parsedURL.protocol)) {
		throw new TypeError('Only HTTP(S) protocols are supported');
	}

	if (request.signal && request.body instanceof Stream.Readable && !streamDestructionSupported) {
		throw new Error('Cancellation of streamed requests with AbortSignal is not supported in node < 8');
	}

	// HTTP-network-or-cache fetch steps 2.4-2.7
	let contentLengthValue = null;
	if (request.body == null && /^(POST|PUT)$/i.test(request.method)) {
		contentLengthValue = '0';
	}
	if (request.body != null) {
		const totalBytes = getTotalBytes(request);
		if (typeof totalBytes === 'number') {
			contentLengthValue = String(totalBytes);
		}
	}
	if (contentLengthValue) {
		headers.set('Content-Length', contentLengthValue);
	}

	// HTTP-network-or-cache fetch step 2.11
	if (!headers.has('User-Agent')) {
		headers.set('User-Agent', 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)');
	}

	// HTTP-network-or-cache fetch step 2.15
	if (request.compress && !headers.has('Accept-Encoding')) {
		headers.set('Accept-Encoding', 'gzip,deflate');
	}

	let agent = request.agent;
	if (typeof agent === 'function') {
		agent = agent(parsedURL);
	}

	if (!headers.has('Connection') && !agent) {
		headers.set('Connection', 'close');
	}

	// HTTP-network fetch step 4.2
	// chunked encoding is handled by Node.js

	return Object.assign({}, parsedURL, {
		method: request.method,
		headers: exportNodeCompatibleHeaders(headers),
		agent
	});
}

/**
 * abort-error.js
 *
 * AbortError interface for cancelled requests
 */

/**
 * Create AbortError instance
 *
 * @param   String      message      Error message for human
 * @return  AbortError
 */
function AbortError(message) {
  Error.call(this, message);

  this.type = 'aborted';
  this.message = message;

  // hide custom error implementation details from end-users
  Error.captureStackTrace(this, this.constructor);
}

AbortError.prototype = Object.create(Error.prototype);
AbortError.prototype.constructor = AbortError;
AbortError.prototype.name = 'AbortError';

const URL$1 = Url.URL || whatwgUrl.URL;

// fix an issue where "PassThrough", "resolve" aren't a named export for node <10
const PassThrough$1 = Stream.PassThrough;

const isDomainOrSubdomain = function isDomainOrSubdomain(destination, original) {
	const orig = new URL$1(original).hostname;
	const dest = new URL$1(destination).hostname;

	return orig === dest || orig[orig.length - dest.length - 1] === '.' && orig.endsWith(dest);
};

/**
 * Fetch function
 *
 * @param   Mixed    url   Absolute url or Request instance
 * @param   Object   opts  Fetch options
 * @return  Promise
 */
function fetch(url, opts) {

	// allow custom promise
	if (!fetch.Promise) {
		throw new Error('native promise missing, set fetch.Promise to your favorite alternative');
	}

	Body.Promise = fetch.Promise;

	// wrap http.request into fetch
	return new fetch.Promise(function (resolve, reject) {
		// build request object
		const request = new Request(url, opts);
		const options = getNodeRequestOptions(request);

		const send = (options.protocol === 'https:' ? https : http).request;
		const signal = request.signal;

		let response = null;

		const abort = function abort() {
			let error = new AbortError('The user aborted a request.');
			reject(error);
			if (request.body && request.body instanceof Stream.Readable) {
				request.body.destroy(error);
			}
			if (!response || !response.body) return;
			response.body.emit('error', error);
		};

		if (signal && signal.aborted) {
			abort();
			return;
		}

		const abortAndFinalize = function abortAndFinalize() {
			abort();
			finalize();
		};

		// send request
		const req = send(options);
		let reqTimeout;

		if (signal) {
			signal.addEventListener('abort', abortAndFinalize);
		}

		function finalize() {
			req.abort();
			if (signal) signal.removeEventListener('abort', abortAndFinalize);
			clearTimeout(reqTimeout);
		}

		if (request.timeout) {
			req.once('socket', function (socket) {
				reqTimeout = setTimeout(function () {
					reject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout'));
					finalize();
				}, request.timeout);
			});
		}

		req.on('error', function (err) {
			reject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err));
			finalize();
		});

		req.on('response', function (res) {
			clearTimeout(reqTimeout);

			const headers = createHeadersLenient(res.headers);

			// HTTP fetch step 5
			if (fetch.isRedirect(res.statusCode)) {
				// HTTP fetch step 5.2
				const location = headers.get('Location');

				// HTTP fetch step 5.3
				let locationURL = null;
				try {
					locationURL = location === null ? null : new URL$1(location, request.url).toString();
				} catch (err) {
					// error here can only be invalid URL in Location: header
					// do not throw when options.redirect == manual
					// let the user extract the errorneous redirect URL
					if (request.redirect !== 'manual') {
						reject(new FetchError(`uri requested responds with an invalid redirect URL: ${location}`, 'invalid-redirect'));
						finalize();
						return;
					}
				}

				// HTTP fetch step 5.5
				switch (request.redirect) {
					case 'error':
						reject(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${request.url}`, 'no-redirect'));
						finalize();
						return;
					case 'manual':
						// node-fetch-specific step: make manual redirect a bit easier to use by setting the Location header value to the resolved URL.
						if (locationURL !== null) {
							// handle corrupted header
							try {
								headers.set('Location', locationURL);
							} catch (err) {
								// istanbul ignore next: nodejs server prevent invalid response headers, we can't test this through normal request
								reject(err);
							}
						}
						break;
					case 'follow':
						// HTTP-redirect fetch step 2
						if (locationURL === null) {
							break;
						}

						// HTTP-redirect fetch step 5
						if (request.counter >= request.follow) {
							reject(new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect'));
							finalize();
							return;
						}

						// HTTP-redirect fetch step 6 (counter increment)
						// Create a new Request object.
						const requestOpts = {
							headers: new Headers(request.headers),
							follow: request.follow,
							counter: request.counter + 1,
							agent: request.agent,
							compress: request.compress,
							method: request.method,
							body: request.body,
							signal: request.signal,
							timeout: request.timeout,
							size: request.size
						};

						if (!isDomainOrSubdomain(request.url, locationURL)) {
							for (const name of ['authorization', 'www-authenticate', 'cookie', 'cookie2']) {
								requestOpts.headers.delete(name);
							}
						}

						// HTTP-redirect fetch step 9
						if (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) {
							reject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect'));
							finalize();
							return;
						}

						// HTTP-redirect fetch step 11
						if (res.statusCode === 303 || (res.statusCode === 301 || res.statusCode === 302) && request.method === 'POST') {
							requestOpts.method = 'GET';
							requestOpts.body = undefined;
							requestOpts.headers.delete('content-length');
						}

						// HTTP-redirect fetch step 15
						resolve(fetch(new Request(locationURL, requestOpts)));
						finalize();
						return;
				}
			}

			// prepare response
			res.once('end', function () {
				if (signal) signal.removeEventListener('abort', abortAndFinalize);
			});
			let body = res.pipe(new PassThrough$1());

			const response_options = {
				url: request.url,
				status: res.statusCode,
				statusText: res.statusMessage,
				headers: headers,
				size: request.size,
				timeout: request.timeout,
				counter: request.counter
			};

			// HTTP-network fetch step 12.1.1.3
			const codings = headers.get('Content-Encoding');

			// HTTP-network fetch step 12.1.1.4: handle content codings

			// in following scenarios we ignore compression support
			// 1. compression support is disabled
			// 2. HEAD request
			// 3. no Content-Encoding header
			// 4. no content response (204)
			// 5. content not modified response (304)
			if (!request.compress || request.method === 'HEAD' || codings === null || res.statusCode === 204 || res.statusCode === 304) {
				response = new Response(body, response_options);
				resolve(response);
				return;
			}

			// For Node v6+
			// Be less strict when decoding compressed responses, since sometimes
			// servers send slightly invalid responses that are still accepted
			// by common browsers.
			// Always using Z_SYNC_FLUSH is what cURL does.
			const zlibOptions = {
				flush: zlib.Z_SYNC_FLUSH,
				finishFlush: zlib.Z_SYNC_FLUSH
			};

			// for gzip
			if (codings == 'gzip' || codings == 'x-gzip') {
				body = body.pipe(zlib.createGunzip(zlibOptions));
				response = new Response(body, response_options);
				resolve(response);
				return;
			}

			// for deflate
			if (codings == 'deflate' || codings == 'x-deflate') {
				// handle the infamous raw deflate response from old servers
				// a hack for old IIS and Apache servers
				const raw = res.pipe(new PassThrough$1());
				raw.once('data', function (chunk) {
					// see http://stackoverflow.com/questions/37519828
					if ((chunk[0] & 0x0F) === 0x08) {
						body = body.pipe(zlib.createInflate());
					} else {
						body = body.pipe(zlib.createInflateRaw());
					}
					response = new Response(body, response_options);
					resolve(response);
				});
				return;
			}

			// for br
			if (codings == 'br' && typeof zlib.createBrotliDecompress === 'function') {
				body = body.pipe(zlib.createBrotliDecompress());
				response = new Response(body, response_options);
				resolve(response);
				return;
			}

			// otherwise, use response as-is
			response = new Response(body, response_options);
			resolve(response);
		});

		writeToStream(req, request);
	});
}
/**
 * Redirect code matching
 *
 * @param   Number   code  Status code
 * @return  Boolean
 */
fetch.isRedirect = function (code) {
	return code === 301 || code === 302 || code === 303 || code === 307 || code === 308;
};

// expose Promise
fetch.Promise = global.Promise;

module.exports = exports = fetch;
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = exports;
exports.Headers = Headers;
exports.Request = Request;
exports.Response = Response;
exports.FetchError = FetchError;
import Stream from 'stream';
import http from 'http';
import Url from 'url';
import whatwgUrl from 'whatwg-url';
import https from 'https';
import zlib from 'zlib';

// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js

// fix for "Readable" isn't a named export issue
const Readable = Stream.Readable;

const BUFFER = Symbol('buffer');
const TYPE = Symbol('type');

class Blob {
	constructor() {
		this[TYPE] = '';

		const blobParts = arguments[0];
		const options = arguments[1];

		const buffers = [];
		let size = 0;

		if (blobParts) {
			const a = blobParts;
			const length = Number(a.length);
			for (let i = 0; i < length; i++) {
				const element = a[i];
				let buffer;
				if (element instanceof Buffer) {
					buffer = element;
				} else if (ArrayBuffer.isView(element)) {
					buffer = Buffer.from(element.buffer, element.byteOffset, element.byteLength);
				} else if (element instanceof ArrayBuffer) {
					buffer = Buffer.from(element);
				} else if (element instanceof Blob) {
					buffer = element[BUFFER];
				} else {
					buffer = Buffer.from(typeof element === 'string' ? element : String(element));
				}
				size += buffer.length;
				buffers.push(buffer);
			}
		}

		this[BUFFER] = Buffer.concat(buffers);

		let type = options && options.type !== undefined && String(options.type).toLowerCase();
		if (type && !/[^\u0020-\u007E]/.test(type)) {
			this[TYPE] = type;
		}
	}
	get size() {
		return this[BUFFER].length;
	}
	get type() {
		return this[TYPE];
	}
	text() {
		return Promise.resolve(this[BUFFER].toString());
	}
	arrayBuffer() {
		const buf = this[BUFFER];
		const ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
		return Promise.resolve(ab);
	}
	stream() {
		const readable = new Readable();
		readable._read = function () {};
		readable.push(this[BUFFER]);
		readable.push(null);
		return readable;
	}
	toString() {
		return '[object Blob]';
	}
	slice() {
		const size = this.size;

		const start = arguments[0];
		const end = arguments[1];
		let relativeStart, relativeEnd;
		if (start === undefined) {
			relativeStart = 0;
		} else if (start < 0) {
			relativeStart = Math.max(size + start, 0);
		} else {
			relativeStart = Math.min(start, size);
		}
		if (end === undefined) {
			relativeEnd = size;
		} else if (end < 0) {
			relativeEnd = Math.max(size + end, 0);
		} else {
			relativeEnd = Math.min(end, size);
		}
		const span = Math.max(relativeEnd - relativeStart, 0);

		const buffer = this[BUFFER];
		const slicedBuffer = buffer.slice(relativeStart, relativeStart + span);
		const blob = new Blob([], { type: arguments[2] });
		blob[BUFFER] = slicedBuffer;
		return blob;
	}
}

Object.defineProperties(Blob.prototype, {
	size: { enumerable: true },
	type: { enumerable: true },
	slice: { enumerable: true }
});

Object.defineProperty(Blob.prototype, Symbol.toStringTag, {
	value: 'Blob',
	writable: false,
	enumerable: false,
	configurable: true
});

/**
 * fetch-error.js
 *
 * FetchError interface for operational errors
 */

/**
 * Create FetchError instance
 *
 * @param   String      message      Error message for human
 * @param   String      type         Error type for machine
 * @param   String      systemError  For Node.js system error
 * @return  FetchError
 */
function FetchError(message, type, systemError) {
  Error.call(this, message);

  this.message = message;
  this.type = type;

  // when err.type is `system`, err.code contains system error code
  if (systemError) {
    this.code = this.errno = systemError.code;
  }

  // hide custom error implementation details from end-users
  Error.captureStackTrace(this, this.constructor);
}

FetchError.prototype = Object.create(Error.prototype);
FetchError.prototype.constructor = FetchError;
FetchError.prototype.name = 'FetchError';

let convert;
try {
	convert = require('encoding').convert;
} catch (e) {}

const INTERNALS = Symbol('Body internals');

// fix an issue where "PassThrough" isn't a named export for node <10
const PassThrough = Stream.PassThrough;

/**
 * Body mixin
 *
 * Ref: https://fetch.spec.whatwg.org/#body
 *
 * @param   Stream  body  Readable stream
 * @param   Object  opts  Response options
 * @return  Void
 */
function Body(body) {
	var _this = this;

	var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
	    _ref$size = _ref.size;

	let size = _ref$size === undefined ? 0 : _ref$size;
	var _ref$timeout = _ref.timeout;
	let timeout = _ref$timeout === undefined ? 0 : _ref$timeout;

	if (body == null) {
		// body is undefined or null
		body = null;
	} else if (isURLSearchParams(body)) {
		// body is a URLSearchParams
		body = Buffer.from(body.toString());
	} else if (isBlob(body)) ; else if (Buffer.isBuffer(body)) ; else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {
		// body is ArrayBuffer
		body = Buffer.from(body);
	} else if (ArrayBuffer.isView(body)) {
		// body is ArrayBufferView
		body = Buffer.from(body.buffer, body.byteOffset, body.byteLength);
	} else if (body instanceof Stream) ; else {
		// none of the above
		// coerce to string then buffer
		body = Buffer.from(String(body));
	}
	this[INTERNALS] = {
		body,
		disturbed: false,
		error: null
	};
	this.size = size;
	this.timeout = timeout;

	if (body instanceof Stream) {
		body.on('error', function (err) {
			const error = err.name === 'AbortError' ? err : new FetchError(`Invalid response body while trying to fetch ${_this.url}: ${err.message}`, 'system', err);
			_this[INTERNALS].error = error;
		});
	}
}

Body.prototype = {
	get body() {
		return this[INTERNALS].body;
	},

	get bodyUsed() {
		return this[INTERNALS].disturbed;
	},

	/**
  * Decode response as ArrayBuffer
  *
  * @return  Promise
  */
	arrayBuffer() {
		return consumeBody.call(this).then(function (buf) {
			return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
		});
	},

	/**
  * Return raw response as Blob
  *
  * @return Promise
  */
	blob() {
		let ct = this.headers && this.headers.get('content-type') || '';
		return consumeBody.call(this).then(function (buf) {
			return Object.assign(
			// Prevent copying
			new Blob([], {
				type: ct.toLowerCase()
			}), {
				[BUFFER]: buf
			});
		});
	},

	/**
  * Decode response as json
  *
  * @return  Promise
  */
	json() {
		var _this2 = this;

		return consumeBody.call(this).then(function (buffer) {
			try {
				return JSON.parse(buffer.toString());
			} catch (err) {
				return Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json'));
			}
		});
	},

	/**
  * Decode response as text
  *
  * @return  Promise
  */
	text() {
		return consumeBody.call(this).then(function (buffer) {
			return buffer.toString();
		});
	},

	/**
  * Decode response as buffer (non-spec api)
  *
  * @return  Promise
  */
	buffer() {
		return consumeBody.call(this);
	},

	/**
  * Decode response as text, while automatically detecting the encoding and
  * trying to decode to UTF-8 (non-spec api)
  *
  * @return  Promise
  */
	textConverted() {
		var _this3 = this;

		return consumeBody.call(this).then(function (buffer) {
			return convertBody(buffer, _this3.headers);
		});
	}
};

// In browsers, all properties are enumerable.
Object.defineProperties(Body.prototype, {
	body: { enumerable: true },
	bodyUsed: { enumerable: true },
	arrayBuffer: { enumerable: true },
	blob: { enumerable: true },
	json: { enumerable: true },
	text: { enumerable: true }
});

Body.mixIn = function (proto) {
	for (const name of Object.getOwnPropertyNames(Body.prototype)) {
		// istanbul ignore else: future proof
		if (!(name in proto)) {
			const desc = Object.getOwnPropertyDescriptor(Body.prototype, name);
			Object.defineProperty(proto, name, desc);
		}
	}
};

/**
 * Consume and convert an entire Body to a Buffer.
 *
 * Ref: https://fetch.spec.whatwg.org/#concept-body-consume-body
 *
 * @return  Promise
 */
function consumeBody() {
	var _this4 = this;

	if (this[INTERNALS].disturbed) {
		return Body.Promise.reject(new TypeError(`body used already for: ${this.url}`));
	}

	this[INTERNALS].disturbed = true;

	if (this[INTERNALS].error) {
		return Body.Promise.reject(this[INTERNALS].error);
	}

	let body = this.body;

	// body is null
	if (body === null) {
		return Body.Promise.resolve(Buffer.alloc(0));
	}

	// body is blob
	if (isBlob(body)) {
		body = body.stream();
	}

	// body is buffer
	if (Buffer.isBuffer(body)) {
		return Body.Promise.resolve(body);
	}

	// istanbul ignore if: should never happen
	if (!(body instanceof Stream)) {
		return Body.Promise.resolve(Buffer.alloc(0));
	}

	// body is stream
	// get ready to actually consume the body
	let accum = [];
	let accumBytes = 0;
	let abort = false;

	return new Body.Promise(function (resolve, reject) {
		let resTimeout;

		// allow timeout on slow response body
		if (_this4.timeout) {
			resTimeout = setTimeout(function () {
				abort = true;
				reject(new FetchError(`Response timeout while trying to fetch ${_this4.url} (over ${_this4.timeout}ms)`, 'body-timeout'));
			}, _this4.timeout);
		}

		// handle stream errors
		body.on('error', function (err) {
			if (err.name === 'AbortError') {
				// if the request was aborted, reject with this Error
				abort = true;
				reject(err);
			} else {
				// other errors, such as incorrect content-encoding
				reject(new FetchError(`Invalid response body while trying to fetch ${_this4.url}: ${err.message}`, 'system', err));
			}
		});

		body.on('data', function (chunk) {
			if (abort || chunk === null) {
				return;
			}

			if (_this4.size && accumBytes + chunk.length > _this4.size) {
				abort = true;
				reject(new FetchError(`content size at ${_this4.url} over limit: ${_this4.size}`, 'max-size'));
				return;
			}

			accumBytes += chunk.length;
			accum.push(chunk);
		});

		body.on('end', function () {
			if (abort) {
				return;
			}

			clearTimeout(resTimeout);

			try {
				resolve(Buffer.concat(accum, accumBytes));
			} catch (err) {
				// handle streams that have accumulated too much data (issue #414)
				reject(new FetchError(`Could not create Buffer from response body for ${_this4.url}: ${err.message}`, 'system', err));
			}
		});
	});
}

/**
 * Detect buffer encoding and convert to target encoding
 * ref: http://www.w3.org/TR/2011/WD-html5-20110113/parsing.html#determining-the-character-encoding
 *
 * @param   Buffer  buffer    Incoming buffer
 * @param   String  encoding  Target encoding
 * @return  String
 */
function convertBody(buffer, headers) {
	if (typeof convert !== 'function') {
		throw new Error('The package `encoding` must be installed to use the textConverted() function');
	}

	const ct = headers.get('content-type');
	let charset = 'utf-8';
	let res, str;

	// header
	if (ct) {
		res = /charset=([^;]*)/i.exec(ct);
	}

	// no charset in content type, peek at response body for at most 1024 bytes
	str = buffer.slice(0, 1024).toString();

	// html5
	if (!res && str) {
		res = /<meta.+?charset=(['"])(.+?)\1/i.exec(str);
	}

	// html4
	if (!res && str) {
		res = /<meta[\s]+?http-equiv=(['"])content-type\1[\s]+?content=(['"])(.+?)\2/i.exec(str);
		if (!res) {
			res = /<meta[\s]+?content=(['"])(.+?)\1[\s]+?http-equiv=(['"])content-type\3/i.exec(str);
			if (res) {
				res.pop(); // drop last quote
			}
		}

		if (res) {
			res = /charset=(.*)/i.exec(res.pop());
		}
	}

	// xml
	if (!res && str) {
		res = /<\?xml.+?encoding=(['"])(.+?)\1/i.exec(str);
	}

	// found charset
	if (res) {
		charset = res.pop();

		// prevent decode issues when sites use incorrect encoding
		// ref: https://hsivonen.fi/encoding-menu/
		if (charset === 'gb2312' || charset === 'gbk') {
			charset = 'gb18030';
		}
	}

	// turn raw buffers into a single utf-8 buffer
	return convert(buffer, 'UTF-8', charset).toString();
}

/**
 * Detect a URLSearchParams object
 * ref: https://github.com/bitinn/node-fetch/issues/296#issuecomment-307598143
 *
 * @param   Object  obj     Object to detect by type or brand
 * @return  String
 */
function isURLSearchParams(obj) {
	// Duck-typing as a necessary condition.
	if (typeof obj !== 'object' || typeof obj.append !== 'function' || typeof obj.delete !== 'function' || typeof obj.get !== 'function' || typeof obj.getAll !== 'function' || typeof obj.has !== 'function' || typeof obj.set !== 'function') {
		return false;
	}

	// Brand-checking and more duck-typing as optional condition.
	return obj.constructor.name === 'URLSearchParams' || Object.prototype.toString.call(obj) === '[object URLSearchParams]' || typeof obj.sort === 'function';
}

/**
 * Check if `obj` is a W3C `Blob` object (which `File` inherits from)
 * @param  {*} obj
 * @return {boolean}
 */
function isBlob(obj) {
	return typeof obj === 'object' && typeof obj.arrayBuffer === 'function' && typeof obj.type === 'string' && typeof obj.stream === 'function' && typeof obj.constructor === 'function' && typeof obj.constructor.name === 'string' && /^(Blob|File)$/.test(obj.constructor.name) && /^(Blob|File)$/.test(obj[Symbol.toStringTag]);
}

/**
 * Clone body given Res/Req instance
 *
 * @param   Mixed  instance  Response or Request instance
 * @return  Mixed
 */
function clone(instance) {
	let p1, p2;
	let body = instance.body;

	// don't allow cloning a used body
	if (instance.bodyUsed) {
		throw new Error('cannot clone body after it is used');
	}

	// check that body is a stream and not form-data object
	// note: we can't clone the form-data object without having it as a dependency
	if (body instanceof Stream && typeof body.getBoundary !== 'function') {
		// tee instance body
		p1 = new PassThrough();
		p2 = new PassThrough();
		body.pipe(p1);
		body.pipe(p2);
		// set instance body to teed body and return the other teed body
		instance[INTERNALS].body = p1;
		body = p2;
	}

	return body;
}

/**
 * Performs the operation "extract a `Content-Type` value from |object|" as
 * specified in the specification:
 * https://fetch.spec.whatwg.org/#concept-bodyinit-extract
 *
 * This function assumes that instance.body is present.
 *
 * @param   Mixed  instance  Any options.body input
 */
function extractContentType(body) {
	if (body === null) {
		// body is null
		return null;
	} else if (typeof body === 'string') {
		// body is string
		return 'text/plain;charset=UTF-8';
	} else if (isURLSearchParams(body)) {
		// body is a URLSearchParams
		return 'application/x-www-form-urlencoded;charset=UTF-8';
	} else if (isBlob(body)) {
		// body is blob
		return body.type || null;
	} else if (Buffer.isBuffer(body)) {
		// body is buffer
		return null;
	} else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {
		// body is ArrayBuffer
		return null;
	} else if (ArrayBuffer.isView(body)) {
		// body is ArrayBufferView
		return null;
	} else if (typeof body.getBoundary === 'function') {
		// detect form data input from form-data module
		return `multipart/form-data;boundary=${body.getBoundary()}`;
	} else if (body instanceof Stream) {
		// body is stream
		// can't really do much about this
		return null;
	} else {
		// Body constructor defaults other things to string
		return 'text/plain;charset=UTF-8';
	}
}

/**
 * The Fetch Standard treats this as if "total bytes" is a property on the body.
 * For us, we have to explicitly get it with a function.
 *
 * ref: https://fetch.spec.whatwg.org/#concept-body-total-bytes
 *
 * @param   Body    instance   Instance of Body
 * @return  Number?            Number of bytes, or null if not possible
 */
function getTotalBytes(instance) {
	const body = instance.body;


	if (body === null) {
		// body is null
		return 0;
	} else if (isBlob(body)) {
		return body.size;
	} else if (Buffer.isBuffer(body)) {
		// body is buffer
		return body.length;
	} else if (body && typeof body.getLengthSync === 'function') {
		// detect form data input from form-data module
		if (body._lengthRetrievers && body._lengthRetrievers.length == 0 || // 1.x
		body.hasKnownLength && body.hasKnownLength()) {
			// 2.x
			return body.getLengthSync();
		}
		return null;
	} else {
		// body is stream
		return null;
	}
}

/**
 * Write a Body to a Node.js WritableStream (e.g. http.Request) object.
 *
 * @param   Body    instance   Instance of Body
 * @return  Void
 */
function writeToStream(dest, instance) {
	const body = instance.body;


	if (body === null) {
		// body is null
		dest.end();
	} else if (isBlob(body)) {
		body.stream().pipe(dest);
	} else if (Buffer.isBuffer(body)) {
		// body is buffer
		dest.write(body);
		dest.end();
	} else {
		// body is stream
		body.pipe(dest);
	}
}

// expose Promise
Body.Promise = global.Promise;

/**
 * headers.js
 *
 * Headers class offers convenient helpers
 */

const invalidTokenRegex = /[^\^_`a-zA-Z\-0-9!#$%&'*+.|~]/;
const invalidHeaderCharRegex = /[^\t\x20-\x7e\x80-\xff]/;

function validateName(name) {
	name = `${name}`;
	if (invalidTokenRegex.test(name) || name === '') {
		throw new TypeError(`${name} is not a legal HTTP header name`);
	}
}

function validateValue(value) {
	value = `${value}`;
	if (invalidHeaderCharRegex.test(value)) {
		throw new TypeError(`${value} is not a legal HTTP header value`);
	}
}

/**
 * Find the key in the map object given a header name.
 *
 * Returns undefined if not found.
 *
 * @param   String  name  Header name
 * @return  String|Undefined
 */
function find(map, name) {
	name = name.toLowerCase();
	for (const key in map) {
		if (key.toLowerCase() === name) {
			return key;
		}
	}
	return undefined;
}

const MAP = Symbol('map');
class Headers {
	/**
  * Headers class
  *
  * @param   Object  headers  Response headers
  * @return  Void
  */
	constructor() {
		let init = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined;

		this[MAP] = Object.create(null);

		if (init instanceof Headers) {
			const rawHeaders = init.raw();
			const headerNames = Object.keys(rawHeaders);

			for (const headerName of headerNames) {
				for (const value of rawHeaders[headerName]) {
					this.append(headerName, value);
				}
			}

			return;
		}

		// We don't worry about converting prop to ByteString here as append()
		// will handle it.
		if (init == null) ; else if (typeof init === 'object') {
			const method = init[Symbol.iterator];
			if (method != null) {
				if (typeof method !== 'function') {
					throw new TypeError('Header pairs must be iterable');
				}

				// sequence<sequence<ByteString>>
				// Note: per spec we have to first exhaust the lists then process them
				const pairs = [];
				for (const pair of init) {
					if (typeof pair !== 'object' || typeof pair[Symbol.iterator] !== 'function') {
						throw new TypeError('Each header pair must be iterable');
					}
					pairs.push(Array.from(pair));
				}

				for (const pair of pairs) {
					if (pair.length !== 2) {
						throw new TypeError('Each header pair must be a name/value tuple');
					}
					this.append(pair[0], pair[1]);
				}
			} else {
				// record<ByteString, ByteString>
				for (const key of Object.keys(init)) {
					const value = init[key];
					this.append(key, value);
				}
			}
		} else {
			throw new TypeError('Provided initializer must be an object');
		}
	}

	/**
  * Return combined header value given name
  *
  * @param   String  name  Header name
  * @return  Mixed
  */
	get(name) {
		name = `${name}`;
		validateName(name);
		const key = find(this[MAP], name);
		if (key === undefined) {
			return null;
		}

		return this[MAP][key].join(', ');
	}

	/**
  * Iterate over all headers
  *
  * @param   Function  callback  Executed for each item with parameters (value, name, thisArg)
  * @param   Boolean   thisArg   `this` context for callback function
  * @return  Void
  */
	forEach(callback) {
		let thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;

		let pairs = getHeaders(this);
		let i = 0;
		while (i < pairs.length) {
			var _pairs$i = pairs[i];
			const name = _pairs$i[0],
			      value = _pairs$i[1];

			callback.call(thisArg, value, name, this);
			pairs = getHeaders(this);
			i++;
		}
	}

	/**
  * Overwrite header values given name
  *
  * @param   String  name   Header name
  * @param   String  value  Header value
  * @return  Void
  */
	set(name, value) {
		name = `${name}`;
		value = `${value}`;
		validateName(name);
		validateValue(value);
		const key = find(this[MAP], name);
		this[MAP][key !== undefined ? key : name] = [value];
	}

	/**
  * Append a value onto existing header
  *
  * @param   String  name   Header name
  * @param   String  value  Header value
  * @return  Void
  */
	append(name, value) {
		name = `${name}`;
		value = `${value}`;
		validateName(name);
		validateValue(value);
		const key = find(this[MAP], name);
		if (key !== undefined) {
			this[MAP][key].push(value);
		} else {
			this[MAP][name] = [value];
		}
	}

	/**
  * Check for header name existence
  *
  * @param   String   name  Header name
  * @return  Boolean
  */
	has(name) {
		name = `${name}`;
		validateName(name);
		return find(this[MAP], name) !== undefined;
	}

	/**
  * Delete all header values given name
  *
  * @param   String  name  Header name
  * @return  Void
  */
	delete(name) {
		name = `${name}`;
		validateName(name);
		const key = find(this[MAP], name);
		if (key !== undefined) {
			delete this[MAP][key];
		}
	}

	/**
  * Return raw headers (non-spec api)
  *
  * @return  Object
  */
	raw() {
		return this[MAP];
	}

	/**
  * Get an iterator on keys.
  *
  * @return  Iterator
  */
	keys() {
		return createHeadersIterator(this, 'key');
	}

	/**
  * Get an iterator on values.
  *
  * @return  Iterator
  */
	values() {
		return createHeadersIterator(this, 'value');
	}

	/**
  * Get an iterator on entries.
  *
  * This is the default iterator of the Headers object.
  *
  * @return  Iterator
  */
	[Symbol.iterator]() {
		return createHeadersIterator(this, 'key+value');
	}
}
Headers.prototype.entries = Headers.prototype[Symbol.iterator];

Object.defineProperty(Headers.prototype, Symbol.toStringTag, {
	value: 'Headers',
	writable: false,
	enumerable: false,
	configurable: true
});

Object.defineProperties(Headers.prototype, {
	get: { enumerable: true },
	forEach: { enumerable: true },
	set: { enumerable: true },
	append: { enumerable: true },
	has: { enumerable: true },
	delete: { enumerable: true },
	keys: { enumerable: true },
	values: { enumerable: true },
	entries: { enumerable: true }
});

function getHeaders(headers) {
	let kind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'key+value';

	const keys = Object.keys(headers[MAP]).sort();
	return keys.map(kind === 'key' ? function (k) {
		return k.toLowerCase();
	} : kind === 'value' ? function (k) {
		return headers[MAP][k].join(', ');
	} : function (k) {
		return [k.toLowerCase(), headers[MAP][k].join(', ')];
	});
}

const INTERNAL = Symbol('internal');

function createHeadersIterator(target, kind) {
	const iterator = Object.create(HeadersIteratorPrototype);
	iterator[INTERNAL] = {
		target,
		kind,
		index: 0
	};
	return iterator;
}

const HeadersIteratorPrototype = Object.setPrototypeOf({
	next() {
		// istanbul ignore if
		if (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) {
			throw new TypeError('Value of `this` is not a HeadersIterator');
		}

		var _INTERNAL = this[INTERNAL];
		const target = _INTERNAL.target,
		      kind = _INTERNAL.kind,
		      index = _INTERNAL.index;

		const values = getHeaders(target, kind);
		const len = values.length;
		if (index >= len) {
			return {
				value: undefined,
				done: true
			};
		}

		this[INTERNAL].index = index + 1;

		return {
			value: values[index],
			done: false
		};
	}
}, Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())));

Object.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, {
	value: 'HeadersIterator',
	writable: false,
	enumerable: false,
	configurable: true
});

/**
 * Export the Headers object in a form that Node.js can consume.
 *
 * @param   Headers  headers
 * @return  Object
 */
function exportNodeCompatibleHeaders(headers) {
	const obj = Object.assign({ __proto__: null }, headers[MAP]);

	// http.request() only supports string as Host header. This hack makes
	// specifying custom Host header possible.
	const hostHeaderKey = find(headers[MAP], 'Host');
	if (hostHeaderKey !== undefined) {
		obj[hostHeaderKey] = obj[hostHeaderKey][0];
	}

	return obj;
}

/**
 * Create a Headers object from an object of headers, ignoring those that do
 * not conform to HTTP grammar productions.
 *
 * @param   Object  obj  Object of headers
 * @return  Headers
 */
function createHeadersLenient(obj) {
	const headers = new Headers();
	for (const name of Object.keys(obj)) {
		if (invalidTokenRegex.test(name)) {
			continue;
		}
		if (Array.isArray(obj[name])) {
			for (const val of obj[name]) {
				if (invalidHeaderCharRegex.test(val)) {
					continue;
				}
				if (headers[MAP][name] === undefined) {
					headers[MAP][name] = [val];
				} else {
					headers[MAP][name].push(val);
				}
			}
		} else if (!invalidHeaderCharRegex.test(obj[name])) {
			headers[MAP][name] = [obj[name]];
		}
	}
	return headers;
}

const INTERNALS$1 = Symbol('Response internals');

// fix an issue where "STATUS_CODES" aren't a named export for node <10
const STATUS_CODES = http.STATUS_CODES;

/**
 * Response class
 *
 * @param   Stream  body  Readable stream
 * @param   Object  opts  Response options
 * @return  Void
 */
class Response {
	constructor() {
		let body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
		let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

		Body.call(this, body, opts);

		const status = opts.status || 200;
		const headers = new Headers(opts.headers);

		if (body != null && !headers.has('Content-Type')) {
			const contentType = extractContentType(body);
			if (contentType) {
				headers.append('Content-Type', contentType);
			}
		}

		this[INTERNALS$1] = {
			url: opts.url,
			status,
			statusText: opts.statusText || STATUS_CODES[status],
			headers,
			counter: opts.counter
		};
	}

	get url() {
		return this[INTERNALS$1].url || '';
	}

	get status() {
		return this[INTERNALS$1].status;
	}

	/**
  * Convenience property representing if the request ended normally
  */
	get ok() {
		return this[INTERNALS$1].status >= 200 && this[INTERNALS$1].status < 300;
	}

	get redirected() {
		return this[INTERNALS$1].counter > 0;
	}

	get statusText() {
		return this[INTERNALS$1].statusText;
	}

	get headers() {
		return this[INTERNALS$1].headers;
	}

	/**
  * Clone this response
  *
  * @return  Response
  */
	clone() {
		return new Response(clone(this), {
			url: this.url,
			status: this.status,
			statusText: this.statusText,
			headers: this.headers,
			ok: this.ok,
			redirected: this.redirected
		});
	}
}

Body.mixIn(Response.prototype);

Object.defineProperties(Response.prototype, {
	url: { enumerable: true },
	status: { enumerable: true },
	ok: { enumerable: true },
	redirected: { enumerable: true },
	statusText: { enumerable: true },
	headers: { enumerable: true },
	clone: { enumerable: true }
});

Object.defineProperty(Response.prototype, Symbol.toStringTag, {
	value: 'Response',
	writable: false,
	enumerable: false,
	configurable: true
});

const INTERNALS$2 = Symbol('Request internals');
const URL = Url.URL || whatwgUrl.URL;

// fix an issue where "format", "parse" aren't a named export for node <10
const parse_url = Url.parse;
const format_url = Url.format;

/**
 * Wrapper around `new URL` to handle arbitrary URLs
 *
 * @param  {string} urlStr
 * @return {void}
 */
function parseURL(urlStr) {
	/*
 	Check whether the URL is absolute or not
 		Scheme: https://tools.ietf.org/html/rfc3986#section-3.1
 	Absolute URL: https://tools.ietf.org/html/rfc3986#section-4.3
 */
	if (/^[a-zA-Z][a-zA-Z\d+\-.]*:/.exec(urlStr)) {
		urlStr = new URL(urlStr).toString();
	}

	// Fallback to old implementation for arbitrary URLs
	return parse_url(urlStr);
}

const streamDestructionSupported = 'destroy' in Stream.Readable.prototype;

/**
 * Check if a value is an instance of Request.
 *
 * @param   Mixed   input
 * @return  Boolean
 */
function isRequest(input) {
	return typeof input === 'object' && typeof input[INTERNALS$2] === 'object';
}

function isAbortSignal(signal) {
	const proto = signal && typeof signal === 'object' && Object.getPrototypeOf(signal);
	return !!(proto && proto.constructor.name === 'AbortSignal');
}

/**
 * Request class
 *
 * @param   Mixed   input  Url or Request instance
 * @param   Object  init   Custom options
 * @return  Void
 */
class Request {
	constructor(input) {
		let init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

		let parsedURL;

		// normalize input
		if (!isRequest(input)) {
			if (input && input.href) {
				// in order to support Node.js' Url objects; though WHATWG's URL objects
				// will fall into this branch also (since their `toString()` will return
				// `href` property anyway)
				parsedURL = parseURL(input.href);
			} else {
				// coerce input to a string before attempting to parse
				parsedURL = parseURL(`${input}`);
			}
			input = {};
		} else {
			parsedURL = parseURL(input.url);
		}

		let method = init.method || input.method || 'GET';
		method = method.toUpperCase();

		if ((init.body != null || isRequest(input) && input.body !== null) && (method === 'GET' || method === 'HEAD')) {
			throw new TypeError('Request with GET/HEAD method cannot have body');
		}

		let inputBody = init.body != null ? init.body : isRequest(input) && input.body !== null ? clone(input) : null;

		Body.call(this, inputBody, {
			timeout: init.timeout || input.timeout || 0,
			size: init.size || input.size || 0
		});

		const headers = new Headers(init.headers || input.headers || {});

		if (inputBody != null && !headers.has('Content-Type')) {
			const contentType = extractContentType(inputBody);
			if (contentType) {
				headers.append('Content-Type', contentType);
			}
		}

		let signal = isRequest(input) ? input.signal : null;
		if ('signal' in init) signal = init.signal;

		if (signal != null && !isAbortSignal(signal)) {
			throw new TypeError('Expected signal to be an instanceof AbortSignal');
		}

		this[INTERNALS$2] = {
			method,
			redirect: init.redirect || input.redirect || 'follow',
			headers,
			parsedURL,
			signal
		};

		// node-fetch-only options
		this.follow = init.follow !== undefined ? init.follow : input.follow !== undefined ? input.follow : 20;
		this.compress = init.compress !== undefined ? init.compress : input.compress !== undefined ? input.compress : true;
		this.counter = init.counter || input.counter || 0;
		this.agent = init.agent || input.agent;
	}

	get method() {
		return this[INTERNALS$2].method;
	}

	get url() {
		return format_url(this[INTERNALS$2].parsedURL);
	}

	get headers() {
		return this[INTERNALS$2].headers;
	}

	get redirect() {
		return this[INTERNALS$2].redirect;
	}

	get signal() {
		return this[INTERNALS$2].signal;
	}

	/**
  * Clone this request
  *
  * @return  Request
  */
	clone() {
		return new Request(this);
	}
}

Body.mixIn(Request.prototype);

Object.defineProperty(Request.prototype, Symbol.toStringTag, {
	value: 'Request',
	writable: false,
	enumerable: false,
	configurable: true
});

Object.defineProperties(Request.prototype, {
	method: { enumerable: true },
	url: { enumerable: true },
	headers: { enumerable: true },
	redirect: { enumerable: true },
	clone: { enumerable: true },
	signal: { enumerable: true }
});

/**
 * Convert a Request to Node.js http request options.
 *
 * @param   Request  A Request instance
 * @return  Object   The options object to be passed to http.request
 */
function getNodeRequestOptions(request) {
	const parsedURL = request[INTERNALS$2].parsedURL;
	const headers = new Headers(request[INTERNALS$2].headers);

	// fetch step 1.3
	if (!headers.has('Accept')) {
		headers.set('Accept', '*/*');
	}

	// Basic fetch
	if (!parsedURL.protocol || !parsedURL.hostname) {
		throw new TypeError('Only absolute URLs are supported');
	}

	if (!/^https?:$/.test(parsedURL.protocol)) {
		throw new TypeError('Only HTTP(S) protocols are supported');
	}

	if (request.signal && request.body instanceof Stream.Readable && !streamDestructionSupported) {
		throw new Error('Cancellation of streamed requests with AbortSignal is not supported in node < 8');
	}

	// HTTP-network-or-cache fetch steps 2.4-2.7
	let contentLengthValue = null;
	if (request.body == null && /^(POST|PUT)$/i.test(request.method)) {
		contentLengthValue = '0';
	}
	if (request.body != null) {
		const totalBytes = getTotalBytes(request);
		if (typeof totalBytes === 'number') {
			contentLengthValue = String(totalBytes);
		}
	}
	if (contentLengthValue) {
		headers.set('Content-Length', contentLengthValue);
	}

	// HTTP-network-or-cache fetch step 2.11
	if (!headers.has('User-Agent')) {
		headers.set('User-Agent', 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)');
	}

	// HTTP-network-or-cache fetch step 2.15
	if (request.compress && !headers.has('Accept-Encoding')) {
		headers.set('Accept-Encoding', 'gzip,deflate');
	}

	let agent = request.agent;
	if (typeof agent === 'function') {
		agent = agent(parsedURL);
	}

	if (!headers.has('Connection') && !agent) {
		headers.set('Connection', 'close');
	}

	// HTTP-network fetch step 4.2
	// chunked encoding is handled by Node.js

	return Object.assign({}, parsedURL, {
		method: request.method,
		headers: exportNodeCompatibleHeaders(headers),
		agent
	});
}

/**
 * abort-error.js
 *
 * AbortError interface for cancelled requests
 */

/**
 * Create AbortError instance
 *
 * @param   String      message      Error message for human
 * @return  AbortError
 */
function AbortError(message) {
  Error.call(this, message);

  this.type = 'aborted';
  this.message = message;

  // hide custom error implementation details from end-users
  Error.captureStackTrace(this, this.constructor);
}

AbortError.prototype = Object.create(Error.prototype);
AbortError.prototype.constructor = AbortError;
AbortError.prototype.name = 'AbortError';

const URL$1 = Url.URL || whatwgUrl.URL;

// fix an issue where "PassThrough", "resolve" aren't a named export for node <10
const PassThrough$1 = Stream.PassThrough;

const isDomainOrSubdomain = function isDomainOrSubdomain(destination, original) {
	const orig = new URL$1(original).hostname;
	const dest = new URL$1(destination).hostname;

	return orig === dest || orig[orig.length - dest.length - 1] === '.' && orig.endsWith(dest);
};

/**
 * Fetch function
 *
 * @param   Mixed    url   Absolute url or Request instance
 * @param   Object   opts  Fetch options
 * @return  Promise
 */
function fetch(url, opts) {

	// allow custom promise
	if (!fetch.Promise) {
		throw new Error('native promise missing, set fetch.Promise to your favorite alternative');
	}

	Body.Promise = fetch.Promise;

	// wrap http.request into fetch
	return new fetch.Promise(function (resolve, reject) {
		// build request object
		const request = new Request(url, opts);
		const options = getNodeRequestOptions(request);

		const send = (options.protocol === 'https:' ? https : http).request;
		const signal = request.signal;

		let response = null;

		const abort = function abort() {
			let error = new AbortError('The user aborted a request.');
			reject(error);
			if (request.body && request.body instanceof Stream.Readable) {
				request.body.destroy(error);
			}
			if (!response || !response.body) return;
			response.body.emit('error', error);
		};

		if (signal && signal.aborted) {
			abort();
			return;
		}

		const abortAndFinalize = function abortAndFinalize() {
			abort();
			finalize();
		};

		// send request
		const req = send(options);
		let reqTimeout;

		if (signal) {
			signal.addEventListener('abort', abortAndFinalize);
		}

		function finalize() {
			req.abort();
			if (signal) signal.removeEventListener('abort', abortAndFinalize);
			clearTimeout(reqTimeout);
		}

		if (request.timeout) {
			req.once('socket', function (socket) {
				reqTimeout = setTimeout(function () {
					reject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout'));
					finalize();
				}, request.timeout);
			});
		}

		req.on('error', function (err) {
			reject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err));
			finalize();
		});

		req.on('response', function (res) {
			clearTimeout(reqTimeout);

			const headers = createHeadersLenient(res.headers);

			// HTTP fetch step 5
			if (fetch.isRedirect(res.statusCode)) {
				// HTTP fetch step 5.2
				const location = headers.get('Location');

				// HTTP fetch step 5.3
				let locationURL = null;
				try {
					locationURL = location === null ? null : new URL$1(location, request.url).toString();
				} catch (err) {
					// error here can only be invalid URL in Location: header
					// do not throw when options.redirect == manual
					// let the user extract the errorneous redirect URL
					if (request.redirect !== 'manual') {
						reject(new FetchError(`uri requested responds with an invalid redirect URL: ${location}`, 'invalid-redirect'));
						finalize();
						return;
					}
				}

				// HTTP fetch step 5.5
				switch (request.redirect) {
					case 'error':
						reject(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${request.url}`, 'no-redirect'));
						finalize();
						return;
					case 'manual':
						// node-fetch-specific step: make manual redirect a bit easier to use by setting the Location header value to the resolved URL.
						if (locationURL !== null) {
							// handle corrupted header
							try {
								headers.set('Location', locationURL);
							} catch (err) {
								// istanbul ignore next: nodejs server prevent invalid response headers, we can't test this through normal request
								reject(err);
							}
						}
						break;
					case 'follow':
						// HTTP-redirect fetch step 2
						if (locationURL === null) {
							break;
						}

						// HTTP-redirect fetch step 5
						if (request.counter >= request.follow) {
							reject(new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect'));
							finalize();
							return;
						}

						// HTTP-redirect fetch step 6 (counter increment)
						// Create a new Request object.
						const requestOpts = {
							headers: new Headers(request.headers),
							follow: request.follow,
							counter: request.counter + 1,
							agent: request.agent,
							compress: request.compress,
							method: request.method,
							body: request.body,
							signal: request.signal,
							timeout: request.timeout,
							size: request.size
						};

						if (!isDomainOrSubdomain(request.url, locationURL)) {
							for (const name of ['authorization', 'www-authenticate', 'cookie', 'cookie2']) {
								requestOpts.headers.delete(name);
							}
						}

						// HTTP-redirect fetch step 9
						if (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) {
							reject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect'));
							finalize();
							return;
						}

						// HTTP-redirect fetch step 11
						if (res.statusCode === 303 || (res.statusCode === 301 || res.statusCode === 302) && request.method === 'POST') {
							requestOpts.method = 'GET';
							requestOpts.body = undefined;
							requestOpts.headers.delete('content-length');
						}

						// HTTP-redirect fetch step 15
						resolve(fetch(new Request(locationURL, requestOpts)));
						finalize();
						return;
				}
			}

			// prepare response
			res.once('end', function () {
				if (signal) signal.removeEventListener('abort', abortAndFinalize);
			});
			let body = res.pipe(new PassThrough$1());

			const response_options = {
				url: request.url,
				status: res.statusCode,
				statusText: res.statusMessage,
				headers: headers,
				size: request.size,
				timeout: request.timeout,
				counter: request.counter
			};

			// HTTP-network fetch step 12.1.1.3
			const codings = headers.get('Content-Encoding');

			// HTTP-network fetch step 12.1.1.4: handle content codings

			// in following scenarios we ignore compression support
			// 1. compression support is disabled
			// 2. HEAD request
			// 3. no Content-Encoding header
			// 4. no content response (204)
			// 5. content not modified response (304)
			if (!request.compress || request.method === 'HEAD' || codings === null || res.statusCode === 204 || res.statusCode === 304) {
				response = new Response(body, response_options);
				resolve(response);
				return;
			}

			// For Node v6+
			// Be less strict when decoding compressed responses, since sometimes
			// servers send slightly invalid responses that are still accepted
			// by common browsers.
			// Always using Z_SYNC_FLUSH is what cURL does.
			const zlibOptions = {
				flush: zlib.Z_SYNC_FLUSH,
				finishFlush: zlib.Z_SYNC_FLUSH
			};

			// for gzip
			if (codings == 'gzip' || codings == 'x-gzip') {
				body = body.pipe(zlib.createGunzip(zlibOptions));
				response = new Response(body, response_options);
				resolve(response);
				return;
			}

			// for deflate
			if (codings == 'deflate' || codings == 'x-deflate') {
				// handle the infamous raw deflate response from old servers
				// a hack for old IIS and Apache servers
				const raw = res.pipe(new PassThrough$1());
				raw.once('data', function (chunk) {
					// see http://stackoverflow.com/questions/37519828
					if ((chunk[0] & 0x0F) === 0x08) {
						body = body.pipe(zlib.createInflate());
					} else {
						body = body.pipe(zlib.createInflateRaw());
					}
					response = new Response(body, response_options);
					resolve(response);
				});
				return;
			}

			// for br
			if (codings == 'br' && typeof zlib.createBrotliDecompress === 'function') {
				body = body.pipe(zlib.createBrotliDecompress());
				response = new Response(body, response_options);
				resolve(response);
				return;
			}

			// otherwise, use response as-is
			response = new Response(body, response_options);
			resolve(response);
		});

		writeToStream(req, request);
	});
}
/**
 * Redirect code matching
 *
 * @param   Number   code  Status code
 * @return  Boolean
 */
fetch.isRedirect = function (code) {
	return code === 301 || code === 302 || code === 303 || code === 307 || code === 308;
};

// expose Promise
fetch.Promise = global.Promise;

export default fetch;
export { Headers, Request, Response, FetchError };
<!-- This file is automatically added by @npmcli/template-oss. Do not edit. -->

ISC License

Copyright npm, Inc.

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 NPM DISCLAIMS ALL
WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
EVENT SHALL NPM 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.
{
  "author": "GitHub Inc.",
  "name": "npmlog",
  "description": "logger for npm",
  "version": "6.0.2",
  "repository": {
    "type": "git",
    "url": "https://github.com/npm/npmlog.git"
  },
  "main": "lib/log.js",
  "files": [
    "bin/",
    "lib/"
  ],
  "dependencies": {
    "are-we-there-yet": "^3.0.0",
    "console-control-strings": "^1.1.0",
    "gauge": "^4.0.3",
    "set-blocking": "^2.0.0"
  },
  "devDependencies": {
    "@npmcli/eslint-config": "^3.0.1",
    "@npmcli/template-oss": "3.4.1",
    "tap": "^16.0.1"
  },
  "license": "ISC",
  "engines": {
    "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
  },
  "tap": {
    "branches": 95
  },
  "templateOSS": {
    "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    "version": "3.4.1"
  }
}'use strict'
var Progress = require('are-we-there-yet')
var Gauge = require('gauge')
var EE = require('events').EventEmitter
var log = exports = module.exports = new EE()
var util = require('util')

var setBlocking = require('set-blocking')
var consoleControl = require('console-control-strings')

setBlocking(true)
var stream = process.stderr
Object.defineProperty(log, 'stream', {
  set: function (newStream) {
    stream = newStream
    if (this.gauge) {
      this.gauge.setWriteTo(stream, stream)
    }
  },
  get: function () {
    return stream
  },
})

// by default, decide based on tty-ness.
var colorEnabled
log.useColor = function () {
  return colorEnabled != null ? colorEnabled : stream.isTTY
}

log.enableColor = function () {
  colorEnabled = true
  this.gauge.setTheme({ hasColor: colorEnabled, hasUnicode: unicodeEnabled })
}
log.disableColor = function () {
  colorEnabled = false
  this.gauge.setTheme({ hasColor: colorEnabled, hasUnicode: unicodeEnabled })
}

// default level
log.level = 'info'

log.gauge = new Gauge(stream, {
  enabled: false, // no progress bars unless asked
  theme: { hasColor: log.useColor() },
  template: [
    { type: 'progressbar', length: 20 },
    { type: 'activityIndicator', kerning: 1, length: 1 },
    { type: 'section', default: '' },
    ':',
    { type: 'logline', kerning: 1, default: '' },
  ],
})

log.tracker = new Progress.TrackerGroup()

// we track this separately as we may need to temporarily disable the
// display of the status bar for our own loggy purposes.
log.progressEnabled = log.gauge.isEnabled()

var unicodeEnabled

log.enableUnicode = function () {
  unicodeEnabled = true
  this.gauge.setTheme({ hasColor: this.useColor(), hasUnicode: unicodeEnabled })
}

log.disableUnicode = function () {
  unicodeEnabled = false
  this.gauge.setTheme({ hasColor: this.useColor(), hasUnicode: unicodeEnabled })
}

log.setGaugeThemeset = function (themes) {
  this.gauge.setThemeset(themes)
}

log.setGaugeTemplate = function (template) {
  this.gauge.setTemplate(template)
}

log.enableProgress = function () {
  if (this.progressEnabled) {
    return
  }

  this.progressEnabled = true
  this.tracker.on('change', this.showProgress)
  if (this._paused) {
    return
  }

  this.gauge.enable()
}

log.disableProgress = function () {
  if (!this.progressEnabled) {
    return
  }
  this.progressEnabled = false
  this.tracker.removeListener('change', this.showProgress)
  this.gauge.disable()
}

var trackerConstructors = ['newGroup', 'newItem', 'newStream']

var mixinLog = function (tracker) {
  // mixin the public methods from log into the tracker
  // (except: conflicts and one's we handle specially)
  Object.keys(log).forEach(function (P) {
    if (P[0] === '_') {
      return
    }

    if (trackerConstructors.filter(function (C) {
      return C === P
    }).length) {
      return
    }

    if (tracker[P]) {
      return
    }

    if (typeof log[P] !== 'function') {
      return
    }

    var func = log[P]
    tracker[P] = function () {
      return func.apply(log, arguments)
    }
  })
  // if the new tracker is a group, make sure any subtrackers get
  // mixed in too
  if (tracker instanceof Progress.TrackerGroup) {
    trackerConstructors.forEach(function (C) {
      var func = tracker[C]
      tracker[C] = function () {
        return mixinLog(func.apply(tracker, arguments))
      }
    })
  }
  return tracker
}

// Add tracker constructors to the top level log object
trackerConstructors.forEach(function (C) {
  log[C] = function () {
    return mixinLog(this.tracker[C].apply(this.tracker, arguments))
  }
})

log.clearProgress = function (cb) {
  if (!this.progressEnabled) {
    return cb && process.nextTick(cb)
  }

  this.gauge.hide(cb)
}

log.showProgress = function (name, completed) {
  if (!this.progressEnabled) {
    return
  }

  var values = {}
  if (name) {
    values.section = name
  }

  var last = log.record[log.record.length - 1]
  if (last) {
    values.subsection = last.prefix
    var disp = log.disp[last.level] || last.level
    var logline = this._format(disp, log.style[last.level])
    if (last.prefix) {
      logline += ' ' + this._format(last.prefix, this.prefixStyle)
    }

    logline += ' ' + last.message.split(/\r?\n/)[0]
    values.logline = logline
  }
  values.completed = completed || this.tracker.completed()
  this.gauge.show(values)
}.bind(log) // bind for use in tracker's on-change listener

// temporarily stop emitting, but don't drop
log.pause = function () {
  this._paused = true
  if (this.progressEnabled) {
    this.gauge.disable()
  }
}

log.resume = function () {
  if (!this._paused) {
    return
  }

  this._paused = false

  var b = this._buffer
  this._buffer = []
  b.forEach(function (m) {
    this.emitLog(m)
  }, this)
  if (this.progressEnabled) {
    this.gauge.enable()
  }
}

log._buffer = []

var id = 0
log.record = []
log.maxRecordSize = 10000
log.log = function (lvl, prefix, message) {
  var l = this.levels[lvl]
  if (l === undefined) {
    return this.emit('error', new Error(util.format(
      'Undefined log level: %j', lvl)))
  }

  var a = new Array(arguments.length - 2)
  var stack = null
  for (var i = 2; i < arguments.length; i++) {
    var arg = a[i - 2] = arguments[i]

    // resolve stack traces to a plain string.
    if (typeof arg === 'object' && arg instanceof Error && arg.stack) {
      Object.defineProperty(arg, 'stack', {
        value: stack = arg.stack + '',
        enumerable: true,
        writable: true,
      })
    }
  }
  if (stack) {
    a.unshift(stack + '\n')
  }
  message = util.format.apply(util, a)

  var m = {
    id: id++,
    level: lvl,
    prefix: String(prefix || ''),
    message: message,
    messageRaw: a,
  }

  this.emit('log', m)
  this.emit('log.' + lvl, m)
  if (m.prefix) {
    this.emit(m.prefix, m)
  }

  this.record.push(m)
  var mrs = this.maxRecordSize
  var n = this.record.length - mrs
  if (n > mrs / 10) {
    var newSize = Math.floor(mrs * 0.9)
    this.record = this.record.slice(-1 * newSize)
  }

  this.emitLog(m)
}.bind(log)

log.emitLog = function (m) {
  if (this._paused) {
    this._buffer.push(m)
    return
  }
  if (this.progressEnabled) {
    this.gauge.pulse(m.prefix)
  }

  var l = this.levels[m.level]
  if (l === undefined) {
    return
  }

  if (l < this.levels[this.level]) {
    return
  }

  if (l > 0 && !isFinite(l)) {
    return
  }

  // If 'disp' is null or undefined, use the lvl as a default
  // Allows: '', 0 as valid disp
  var disp = log.disp[m.level] != null ? log.disp[m.level] : m.level
  this.clearProgress()
  m.message.split(/\r?\n/).forEach(function (line) {
    var heading = this.heading
    if (heading) {
      this.write(heading, this.headingStyle)
      this.write(' ')
    }
    this.write(disp, log.style[m.level])
    var p = m.prefix || ''
    if (p) {
      this.write(' ')
    }

    this.write(p, this.prefixStyle)
    this.write(' ' + line + '\n')
  }, this)
  this.showProgress()
}

log._format = function (msg, style) {
  if (!stream) {
    return
  }

  var output = ''
  if (this.useColor()) {
    style = style || {}
    var settings = []
    if (style.fg) {
      settings.push(style.fg)
    }

    if (style.bg) {
      settings.push('bg' + style.bg[0].toUpperCase() + style.bg.slice(1))
    }

    if (style.bold) {
      settings.push('bold')
    }

    if (style.underline) {
      settings.push('underline')
    }

    if (style.inverse) {
      settings.push('inverse')
    }

    if (settings.length) {
      output += consoleControl.color(settings)
    }

    if (style.beep) {
      output += consoleControl.beep()
    }
  }
  output += msg
  if (this.useColor()) {
    output += consoleControl.color('reset')
  }

  return output
}

log.write = function (msg, style) {
  if (!stream) {
    return
  }

  stream.write(this._format(msg, style))
}

log.addLevel = function (lvl, n, style, disp) {
  // If 'disp' is null or undefined, use the lvl as a default
  if (disp == null) {
    disp = lvl
  }

  this.levels[lvl] = n
  this.style[lvl] = style
  if (!this[lvl]) {
    this[lvl] = function () {
      var a = new Array(arguments.length + 1)
      a[0] = lvl
      for (var i = 0; i < arguments.length; i++) {
        a[i + 1] = arguments[i]
      }

      return this.log.apply(this, a)
    }.bind(this)
  }
  this.disp[lvl] = disp
}

log.prefixStyle = { fg: 'magenta' }
log.headingStyle = { fg: 'white', bg: 'black' }

log.style = {}
log.levels = {}
log.disp = {}
log.addLevel('silly', -Infinity, { inverse: true }, 'sill')
log.addLevel('verbose', 1000, { fg: 'cyan', bg: 'black' }, 'verb')
log.addLevel('info', 2000, { fg: 'green' })
log.addLevel('timing', 2500, { fg: 'green', bg: 'black' })
log.addLevel('http', 3000, { fg: 'green', bg: 'black' })
log.addLevel('notice', 3500, { fg: 'cyan', bg: 'black' })
log.addLevel('warn', 4000, { fg: 'black', bg: 'yellow' }, 'WARN')
log.addLevel('error', 5000, { fg: 'red', bg: 'black' }, 'ERR!')
log.addLevel('silent', Infinity)

// allow 'error' prefix
log.on('error', function () {})
/*
object-assign
(c) Sindre Sorhus
@license MIT
*/

'use strict';
/* eslint-disable no-unused-vars */
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
var hasOwnProperty = Object.prototype.hasOwnProperty;
var propIsEnumerable = Object.prototype.propertyIsEnumerable;

function toObject(val) {
	if (val === null || val === undefined) {
		throw new TypeError('Object.assign cannot be called with null or undefined');
	}

	return Object(val);
}

function shouldUseNative() {
	try {
		if (!Object.assign) {
			return false;
		}

		// Detect buggy property enumeration order in older V8 versions.

		// https://bugs.chromium.org/p/v8/issues/detail?id=4118
		var test1 = new String('abc');  // eslint-disable-line no-new-wrappers
		test1[5] = 'de';
		if (Object.getOwnPropertyNames(test1)[0] === '5') {
			return false;
		}

		// https://bugs.chromium.org/p/v8/issues/detail?id=3056
		var test2 = {};
		for (var i = 0; i < 10; i++) {
			test2['_' + String.fromCharCode(i)] = i;
		}
		var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
			return test2[n];
		});
		if (order2.join('') !== '0123456789') {
			return false;
		}

		// https://bugs.chromium.org/p/v8/issues/detail?id=3056
		var test3 = {};
		'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
			test3[letter] = letter;
		});
		if (Object.keys(Object.assign({}, test3)).join('') !==
				'abcdefghijklmnopqrst') {
			return false;
		}

		return true;
	} catch (err) {
		// We don't expect any of the above to throw, but better to be safe.
		return false;
	}
}

module.exports = shouldUseNative() ? Object.assign : function (target, source) {
	var from;
	var to = toObject(target);
	var symbols;

	for (var s = 1; s < arguments.length; s++) {
		from = Object(arguments[s]);

		for (var key in from) {
			if (hasOwnProperty.call(from, key)) {
				to[key] = from[key];
			}
		}

		if (getOwnPropertySymbols) {
			symbols = getOwnPropertySymbols(from);
			for (var i = 0; i < symbols.length; i++) {
				if (propIsEnumerable.call(from, symbols[i])) {
					to[symbols[i]] = from[symbols[i]];
				}
			}
		}
	}

	return to;
};
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": "object-assign",
  "version": "4.1.1",
  "description": "ES2015 `Object.assign()` ponyfill",
  "license": "MIT",
  "repository": "sindresorhus/object-assign",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "devDependencies": {
    "ava": "^0.16.0",
    "lodash": "^4.16.4",
    "matcha": "^0.7.0",
    "xo": "^0.16.0"
  }
}{
  "all": true,
  "check-coverage": false,
  "instrumentation": false,
  "sourceMap": false,
  "reporter": ["text-summary", "text", "html", "json"],
  "exclude": [
    "coverage",
    "example",
    "test",
    "test-core-js.js"
  ]
}
MIT License

Copyright (c) 2013 James Halliday

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

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

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
var hasMap = typeof Map === 'function' && Map.prototype;
var mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, 'size') : null;
var mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === 'function' ? mapSizeDescriptor.get : null;
var mapForEach = hasMap && Map.prototype.forEach;
var hasSet = typeof Set === 'function' && Set.prototype;
var setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, 'size') : null;
var setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === 'function' ? setSizeDescriptor.get : null;
var setForEach = hasSet && Set.prototype.forEach;
var hasWeakMap = typeof WeakMap === 'function' && WeakMap.prototype;
var weakMapHas = hasWeakMap ? WeakMap.prototype.has : null;
var hasWeakSet = typeof WeakSet === 'function' && WeakSet.prototype;
var weakSetHas = hasWeakSet ? WeakSet.prototype.has : null;
var hasWeakRef = typeof WeakRef === 'function' && WeakRef.prototype;
var weakRefDeref = hasWeakRef ? WeakRef.prototype.deref : null;
var booleanValueOf = Boolean.prototype.valueOf;
var objectToString = Object.prototype.toString;
var functionToString = Function.prototype.toString;
var $match = String.prototype.match;
var $slice = String.prototype.slice;
var $replace = String.prototype.replace;
var $toUpperCase = String.prototype.toUpperCase;
var $toLowerCase = String.prototype.toLowerCase;
var $test = RegExp.prototype.test;
var $concat = Array.prototype.concat;
var $join = Array.prototype.join;
var $arrSlice = Array.prototype.slice;
var $floor = Math.floor;
var bigIntValueOf = typeof BigInt === 'function' ? BigInt.prototype.valueOf : null;
var gOPS = Object.getOwnPropertySymbols;
var symToString = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? Symbol.prototype.toString : null;
var hasShammedSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'object';
// ie, `has-tostringtag/shams
var toStringTag = typeof Symbol === 'function' && Symbol.toStringTag && (typeof Symbol.toStringTag === hasShammedSymbols ? 'object' : 'symbol')
    ? Symbol.toStringTag
    : null;
var isEnumerable = Object.prototype.propertyIsEnumerable;

var gPO = (typeof Reflect === 'function' ? Reflect.getPrototypeOf : Object.getPrototypeOf) || (
    [].__proto__ === Array.prototype // eslint-disable-line no-proto
        ? function (O) {
            return O.__proto__; // eslint-disable-line no-proto
        }
        : null
);

function addNumericSeparator(num, str) {
    if (
        num === Infinity
        || num === -Infinity
        || num !== num
        || (num && num > -1000 && num < 1000)
        || $test.call(/e/, str)
    ) {
        return str;
    }
    var sepRegex = /[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;
    if (typeof num === 'number') {
        var int = num < 0 ? -$floor(-num) : $floor(num); // trunc(num)
        if (int !== num) {
            var intStr = String(int);
            var dec = $slice.call(str, intStr.length + 1);
            return $replace.call(intStr, sepRegex, '$&_') + '.' + $replace.call($replace.call(dec, /([0-9]{3})/g, '$&_'), /_$/, '');
        }
    }
    return $replace.call(str, sepRegex, '$&_');
}

var utilInspect = require('./util.inspect');
var inspectCustom = utilInspect.custom;
var inspectSymbol = isSymbol(inspectCustom) ? inspectCustom : null;

module.exports = function inspect_(obj, options, depth, seen) {
    var opts = options || {};

    if (has(opts, 'quoteStyle') && (opts.quoteStyle !== 'single' && opts.quoteStyle !== 'double')) {
        throw new TypeError('option "quoteStyle" must be "single" or "double"');
    }
    if (
        has(opts, 'maxStringLength') && (typeof opts.maxStringLength === 'number'
            ? opts.maxStringLength < 0 && opts.maxStringLength !== Infinity
            : opts.maxStringLength !== null
        )
    ) {
        throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');
    }
    var customInspect = has(opts, 'customInspect') ? opts.customInspect : true;
    if (typeof customInspect !== 'boolean' && customInspect !== 'symbol') {
        throw new TypeError('option "customInspect", if provided, must be `true`, `false`, or `\'symbol\'`');
    }

    if (
        has(opts, 'indent')
        && opts.indent !== null
        && opts.indent !== '\t'
        && !(parseInt(opts.indent, 10) === opts.indent && opts.indent > 0)
    ) {
        throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');
    }
    if (has(opts, 'numericSeparator') && typeof opts.numericSeparator !== 'boolean') {
        throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');
    }
    var numericSeparator = opts.numericSeparator;

    if (typeof obj === 'undefined') {
        return 'undefined';
    }
    if (obj === null) {
        return 'null';
    }
    if (typeof obj === 'boolean') {
        return obj ? 'true' : 'false';
    }

    if (typeof obj === 'string') {
        return inspectString(obj, opts);
    }
    if (typeof obj === 'number') {
        if (obj === 0) {
            return Infinity / obj > 0 ? '0' : '-0';
        }
        var str = String(obj);
        return numericSeparator ? addNumericSeparator(obj, str) : str;
    }
    if (typeof obj === 'bigint') {
        var bigIntStr = String(obj) + 'n';
        return numericSeparator ? addNumericSeparator(obj, bigIntStr) : bigIntStr;
    }

    var maxDepth = typeof opts.depth === 'undefined' ? 5 : opts.depth;
    if (typeof depth === 'undefined') { depth = 0; }
    if (depth >= maxDepth && maxDepth > 0 && typeof obj === 'object') {
        return isArray(obj) ? '[Array]' : '[Object]';
    }

    var indent = getIndent(opts, depth);

    if (typeof seen === 'undefined') {
        seen = [];
    } else if (indexOf(seen, obj) >= 0) {
        return '[Circular]';
    }

    function inspect(value, from, noIndent) {
        if (from) {
            seen = $arrSlice.call(seen);
            seen.push(from);
        }
        if (noIndent) {
            var newOpts = {
                depth: opts.depth
            };
            if (has(opts, 'quoteStyle')) {
                newOpts.quoteStyle = opts.quoteStyle;
            }
            return inspect_(value, newOpts, depth + 1, seen);
        }
        return inspect_(value, opts, depth + 1, seen);
    }

    if (typeof obj === 'function' && !isRegExp(obj)) { // in older engines, regexes are callable
        var name = nameOf(obj);
        var keys = arrObjKeys(obj, inspect);
        return '[Function' + (name ? ': ' + name : ' (anonymous)') + ']' + (keys.length > 0 ? ' { ' + $join.call(keys, ', ') + ' }' : '');
    }
    if (isSymbol(obj)) {
        var symString = hasShammedSymbols ? $replace.call(String(obj), /^(Symbol\(.*\))_[^)]*$/, '$1') : symToString.call(obj);
        return typeof obj === 'object' && !hasShammedSymbols ? markBoxed(symString) : symString;
    }
    if (isElement(obj)) {
        var s = '<' + $toLowerCase.call(String(obj.nodeName));
        var attrs = obj.attributes || [];
        for (var i = 0; i < attrs.length; i++) {
            s += ' ' + attrs[i].name + '=' + wrapQuotes(quote(attrs[i].value), 'double', opts);
        }
        s += '>';
        if (obj.childNodes && obj.childNodes.length) { s += '...'; }
        s += '</' + $toLowerCase.call(String(obj.nodeName)) + '>';
        return s;
    }
    if (isArray(obj)) {
        if (obj.length === 0) { return '[]'; }
        var xs = arrObjKeys(obj, inspect);
        if (indent && !singleLineValues(xs)) {
            return '[' + indentedJoin(xs, indent) + ']';
        }
        return '[ ' + $join.call(xs, ', ') + ' ]';
    }
    if (isError(obj)) {
        var parts = arrObjKeys(obj, inspect);
        if (!('cause' in Error.prototype) && 'cause' in obj && !isEnumerable.call(obj, 'cause')) {
            return '{ [' + String(obj) + '] ' + $join.call($concat.call('[cause]: ' + inspect(obj.cause), parts), ', ') + ' }';
        }
        if (parts.length === 0) { return '[' + String(obj) + ']'; }
        return '{ [' + String(obj) + '] ' + $join.call(parts, ', ') + ' }';
    }
    if (typeof obj === 'object' && customInspect) {
        if (inspectSymbol && typeof obj[inspectSymbol] === 'function' && utilInspect) {
            return utilInspect(obj, { depth: maxDepth - depth });
        } else if (customInspect !== 'symbol' && typeof obj.inspect === 'function') {
            return obj.inspect();
        }
    }
    if (isMap(obj)) {
        var mapParts = [];
        mapForEach.call(obj, function (value, key) {
            mapParts.push(inspect(key, obj, true) + ' => ' + inspect(value, obj));
        });
        return collectionOf('Map', mapSize.call(obj), mapParts, indent);
    }
    if (isSet(obj)) {
        var setParts = [];
        setForEach.call(obj, function (value) {
            setParts.push(inspect(value, obj));
        });
        return collectionOf('Set', setSize.call(obj), setParts, indent);
    }
    if (isWeakMap(obj)) {
        return weakCollectionOf('WeakMap');
    }
    if (isWeakSet(obj)) {
        return weakCollectionOf('WeakSet');
    }
    if (isWeakRef(obj)) {
        return weakCollectionOf('WeakRef');
    }
    if (isNumber(obj)) {
        return markBoxed(inspect(Number(obj)));
    }
    if (isBigInt(obj)) {
        return markBoxed(inspect(bigIntValueOf.call(obj)));
    }
    if (isBoolean(obj)) {
        return markBoxed(booleanValueOf.call(obj));
    }
    if (isString(obj)) {
        return markBoxed(inspect(String(obj)));
    }
    if (!isDate(obj) && !isRegExp(obj)) {
        var ys = arrObjKeys(obj, inspect);
        var isPlainObject = gPO ? gPO(obj) === Object.prototype : obj instanceof Object || obj.constructor === Object;
        var protoTag = obj instanceof Object ? '' : 'null prototype';
        var stringTag = !isPlainObject && toStringTag && Object(obj) === obj && toStringTag in obj ? $slice.call(toStr(obj), 8, -1) : protoTag ? 'Object' : '';
        var constructorTag = isPlainObject || typeof obj.constructor !== 'function' ? '' : obj.constructor.name ? obj.constructor.name + ' ' : '';
        var tag = constructorTag + (stringTag || protoTag ? '[' + $join.call($concat.call([], stringTag || [], protoTag || []), ': ') + '] ' : '');
        if (ys.length === 0) { return tag + '{}'; }
        if (indent) {
            return tag + '{' + indentedJoin(ys, indent) + '}';
        }
        return tag + '{ ' + $join.call(ys, ', ') + ' }';
    }
    return String(obj);
};

function wrapQuotes(s, defaultStyle, opts) {
    var quoteChar = (opts.quoteStyle || defaultStyle) === 'double' ? '"' : "'";
    return quoteChar + s + quoteChar;
}

function quote(s) {
    return $replace.call(String(s), /"/g, '&quot;');
}

function isArray(obj) { return toStr(obj) === '[object Array]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isDate(obj) { return toStr(obj) === '[object Date]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isRegExp(obj) { return toStr(obj) === '[object RegExp]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isError(obj) { return toStr(obj) === '[object Error]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isString(obj) { return toStr(obj) === '[object String]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isNumber(obj) { return toStr(obj) === '[object Number]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isBoolean(obj) { return toStr(obj) === '[object Boolean]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }

// Symbol and BigInt do have Symbol.toStringTag by spec, so that can't be used to eliminate false positives
function isSymbol(obj) {
    if (hasShammedSymbols) {
        return obj && typeof obj === 'object' && obj instanceof Symbol;
    }
    if (typeof obj === 'symbol') {
        return true;
    }
    if (!obj || typeof obj !== 'object' || !symToString) {
        return false;
    }
    try {
        symToString.call(obj);
        return true;
    } catch (e) {}
    return false;
}

function isBigInt(obj) {
    if (!obj || typeof obj !== 'object' || !bigIntValueOf) {
        return false;
    }
    try {
        bigIntValueOf.call(obj);
        return true;
    } catch (e) {}
    return false;
}

var hasOwn = Object.prototype.hasOwnProperty || function (key) { return key in this; };
function has(obj, key) {
    return hasOwn.call(obj, key);
}

function toStr(obj) {
    return objectToString.call(obj);
}

function nameOf(f) {
    if (f.name) { return f.name; }
    var m = $match.call(functionToString.call(f), /^function\s*([\w$]+)/);
    if (m) { return m[1]; }
    return null;
}

function indexOf(xs, x) {
    if (xs.indexOf) { return xs.indexOf(x); }
    for (var i = 0, l = xs.length; i < l; i++) {
        if (xs[i] === x) { return i; }
    }
    return -1;
}

function isMap(x) {
    if (!mapSize || !x || typeof x !== 'object') {
        return false;
    }
    try {
        mapSize.call(x);
        try {
            setSize.call(x);
        } catch (s) {
            return true;
        }
        return x instanceof Map; // core-js workaround, pre-v2.5.0
    } catch (e) {}
    return false;
}

function isWeakMap(x) {
    if (!weakMapHas || !x || typeof x !== 'object') {
        return false;
    }
    try {
        weakMapHas.call(x, weakMapHas);
        try {
            weakSetHas.call(x, weakSetHas);
        } catch (s) {
            return true;
        }
        return x instanceof WeakMap; // core-js workaround, pre-v2.5.0
    } catch (e) {}
    return false;
}

function isWeakRef(x) {
    if (!weakRefDeref || !x || typeof x !== 'object') {
        return false;
    }
    try {
        weakRefDeref.call(x);
        return true;
    } catch (e) {}
    return false;
}

function isSet(x) {
    if (!setSize || !x || typeof x !== 'object') {
        return false;
    }
    try {
        setSize.call(x);
        try {
            mapSize.call(x);
        } catch (m) {
            return true;
        }
        return x instanceof Set; // core-js workaround, pre-v2.5.0
    } catch (e) {}
    return false;
}

function isWeakSet(x) {
    if (!weakSetHas || !x || typeof x !== 'object') {
        return false;
    }
    try {
        weakSetHas.call(x, weakSetHas);
        try {
            weakMapHas.call(x, weakMapHas);
        } catch (s) {
            return true;
        }
        return x instanceof WeakSet; // core-js workaround, pre-v2.5.0
    } catch (e) {}
    return false;
}

function isElement(x) {
    if (!x || typeof x !== 'object') { return false; }
    if (typeof HTMLElement !== 'undefined' && x instanceof HTMLElement) {
        return true;
    }
    return typeof x.nodeName === 'string' && typeof x.getAttribute === 'function';
}

function inspectString(str, opts) {
    if (str.length > opts.maxStringLength) {
        var remaining = str.length - opts.maxStringLength;
        var trailer = '... ' + remaining + ' more character' + (remaining > 1 ? 's' : '');
        return inspectString($slice.call(str, 0, opts.maxStringLength), opts) + trailer;
    }
    // eslint-disable-next-line no-control-regex
    var s = $replace.call($replace.call(str, /(['\\])/g, '\\$1'), /[\x00-\x1f]/g, lowbyte);
    return wrapQuotes(s, 'single', opts);
}

function lowbyte(c) {
    var n = c.charCodeAt(0);
    var x = {
        8: 'b',
        9: 't',
        10: 'n',
        12: 'f',
        13: 'r'
    }[n];
    if (x) { return '\\' + x; }
    return '\\x' + (n < 0x10 ? '0' : '') + $toUpperCase.call(n.toString(16));
}

function markBoxed(str) {
    return 'Object(' + str + ')';
}

function weakCollectionOf(type) {
    return type + ' { ? }';
}

function collectionOf(type, size, entries, indent) {
    var joinedEntries = indent ? indentedJoin(entries, indent) : $join.call(entries, ', ');
    return type + ' (' + size + ') {' + joinedEntries + '}';
}

function singleLineValues(xs) {
    for (var i = 0; i < xs.length; i++) {
        if (indexOf(xs[i], '\n') >= 0) {
            return false;
        }
    }
    return true;
}

function getIndent(opts, depth) {
    var baseIndent;
    if (opts.indent === '\t') {
        baseIndent = '\t';
    } else if (typeof opts.indent === 'number' && opts.indent > 0) {
        baseIndent = $join.call(Array(opts.indent + 1), ' ');
    } else {
        return null;
    }
    return {
        base: baseIndent,
        prev: $join.call(Array(depth + 1), baseIndent)
    };
}

function indentedJoin(xs, indent) {
    if (xs.length === 0) { return ''; }
    var lineJoiner = '\n' + indent.prev + indent.base;
    return lineJoiner + $join.call(xs, ',' + lineJoiner) + '\n' + indent.prev;
}

function arrObjKeys(obj, inspect) {
    var isArr = isArray(obj);
    var xs = [];
    if (isArr) {
        xs.length = obj.length;
        for (var i = 0; i < obj.length; i++) {
            xs[i] = has(obj, i) ? inspect(obj[i], obj) : '';
        }
    }
    var syms = typeof gOPS === 'function' ? gOPS(obj) : [];
    var symMap;
    if (hasShammedSymbols) {
        symMap = {};
        for (var k = 0; k < syms.length; k++) {
            symMap['$' + syms[k]] = syms[k];
        }
    }

    for (var key in obj) { // eslint-disable-line no-restricted-syntax
        if (!has(obj, key)) { continue; } // eslint-disable-line no-restricted-syntax, no-continue
        if (isArr && String(Number(key)) === key && key < obj.length) { continue; } // eslint-disable-line no-restricted-syntax, no-continue
        if (hasShammedSymbols && symMap['$' + key] instanceof Symbol) {
            // this is to prevent shammed Symbols, which are stored as strings, from being included in the string key section
            continue; // eslint-disable-line no-restricted-syntax, no-continue
        } else if ($test.call(/[^\w$]/, key)) {
            xs.push(inspect(key, obj) + ': ' + inspect(obj[key], obj));
        } else {
            xs.push(key + ': ' + inspect(obj[key], obj));
        }
    }
    if (typeof gOPS === 'function') {
        for (var j = 0; j < syms.length; j++) {
            if (isEnumerable.call(obj, syms[j])) {
                xs.push('[' + inspect(syms[j]) + ']: ' + inspect(obj[syms[j]], obj));
            }
        }
    }
    return xs;
}
{
  "versions": [
    {
      "version": "*",
      "target": {
        "node": "all"
      },
      "response": {
        "type": "time-permitting"
      },
      "backing": {
        "npm-funding": true,
        "donations": [
          "https://github.com/ljharb",
          "https://tidelift.com/funding/github/npm/object-inspect"
        ]
      }
    }
  ]
}
{
  "name": "object-inspect",
  "version": "1.12.2",
  "description": "string representations of objects in node and the browser",
  "main": "index.js",
  "sideEffects": false,
  "devDependencies": {
    "@ljharb/eslint-config": "^21.0.0",
    "aud": "^2.0.0",
    "auto-changelog": "^2.4.0",
    "core-js": "^2.6.12",
    "error-cause": "^1.0.4",
    "es-value-fixtures": "^1.4.1",
    "eslint": "=8.8.0",
    "for-each": "^0.3.3",
    "functions-have-names": "^1.2.3",
    "has-tostringtag": "^1.0.0",
    "make-arrow-function": "^1.2.0",
    "mock-property": "^1.0.0",
    "npmignore": "^0.3.0",
    "nyc": "^10.3.2",
    "safe-publish-latest": "^2.0.0",
    "string.prototype.repeat": "^1.0.0",
    "tape": "^5.5.3"
  },
  "testling": {
    "files": [
      "test/*.js",
      "test/browser/*.js"
    ],
    "browsers": [
      "ie/6..latest",
      "chrome/latest",
      "firefox/latest",
      "safari/latest",
      "opera/latest",
      "iphone/latest",
      "ipad/latest",
      "android/latest"
    ]
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/inspect-js/object-inspect.git"
  },
  "homepage": "https://github.com/inspect-js/object-inspect",
  "author": {
    "name": "James Halliday",
    "email": "mail@substack.net",
    "url": "http://substack.net"
  },
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "license": "MIT",
  "browser": {
    "./util.inspect.js": false
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false,
    "hideCredit": true
  },
  "publishConfig": {
    "ignore": [
      ".github/workflows",
      "./test-core-js.js"
    ]
  },
  "support": true
}'use strict';

require('core-js');

var inspect = require('./');
var test = require('tape');

test('Maps', function (t) {
    t.equal(inspect(new Map([[1, 2]])), 'Map (1) {1 => 2}');
    t.end();
});

test('WeakMaps', function (t) {
    t.equal(inspect(new WeakMap([[{}, 2]])), 'WeakMap { ? }');
    t.end();
});

test('Sets', function (t) {
    t.equal(inspect(new Set([[1, 2]])), 'Set (1) {[ 1, 2 ]}');
    t.end();
});

test('WeakSets', function (t) {
    t.equal(inspect(new WeakSet([[1, 2]])), 'WeakSet { ? }');
    t.end();
});
module.exports = require('util').inspect;
# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/object-inspect
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
root = true

[*]
indent_style = tab;
insert_final_newline = true;
quote_type = auto;
space_after_anonymous_functions = true;
space_after_control_statements = true;
spaces_around_operators = true;
trim_trailing_whitespace = true;
spaces_in_brackets = false;
end_of_line = lf;

The MIT License (MIT)

Copyright (C) 2013 Jordan Harband

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 keysShim;
if (!Object.keys) {
	// modified from https://github.com/es-shims/es5-shim
	var has = Object.prototype.hasOwnProperty;
	var toStr = Object.prototype.toString;
	var isArgs = require('./isArguments'); // eslint-disable-line global-require
	var isEnumerable = Object.prototype.propertyIsEnumerable;
	var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');
	var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');
	var dontEnums = [
		'toString',
		'toLocaleString',
		'valueOf',
		'hasOwnProperty',
		'isPrototypeOf',
		'propertyIsEnumerable',
		'constructor'
	];
	var equalsConstructorPrototype = function (o) {
		var ctor = o.constructor;
		return ctor && ctor.prototype === o;
	};
	var excludedKeys = {
		$applicationCache: true,
		$console: true,
		$external: true,
		$frame: true,
		$frameElement: true,
		$frames: true,
		$innerHeight: true,
		$innerWidth: true,
		$onmozfullscreenchange: true,
		$onmozfullscreenerror: true,
		$outerHeight: true,
		$outerWidth: true,
		$pageXOffset: true,
		$pageYOffset: true,
		$parent: true,
		$scrollLeft: true,
		$scrollTop: true,
		$scrollX: true,
		$scrollY: true,
		$self: true,
		$webkitIndexedDB: true,
		$webkitStorageInfo: true,
		$window: true
	};
	var hasAutomationEqualityBug = (function () {
		/* global window */
		if (typeof window === 'undefined') { return false; }
		for (var k in window) {
			try {
				if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {
					try {
						equalsConstructorPrototype(window[k]);
					} catch (e) {
						return true;
					}
				}
			} catch (e) {
				return true;
			}
		}
		return false;
	}());
	var equalsConstructorPrototypeIfNotBuggy = function (o) {
		/* global window */
		if (typeof window === 'undefined' || !hasAutomationEqualityBug) {
			return equalsConstructorPrototype(o);
		}
		try {
			return equalsConstructorPrototype(o);
		} catch (e) {
			return false;
		}
	};

	keysShim = function keys(object) {
		var isObject = object !== null && typeof object === 'object';
		var isFunction = toStr.call(object) === '[object Function]';
		var isArguments = isArgs(object);
		var isString = isObject && toStr.call(object) === '[object String]';
		var theKeys = [];

		if (!isObject && !isFunction && !isArguments) {
			throw new TypeError('Object.keys called on a non-object');
		}

		var skipProto = hasProtoEnumBug && isFunction;
		if (isString && object.length > 0 && !has.call(object, 0)) {
			for (var i = 0; i < object.length; ++i) {
				theKeys.push(String(i));
			}
		}

		if (isArguments && object.length > 0) {
			for (var j = 0; j < object.length; ++j) {
				theKeys.push(String(j));
			}
		} else {
			for (var name in object) {
				if (!(skipProto && name === 'prototype') && has.call(object, name)) {
					theKeys.push(String(name));
				}
			}
		}

		if (hasDontEnumBug) {
			var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);

			for (var k = 0; k < dontEnums.length; ++k) {
				if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {
					theKeys.push(dontEnums[k]);
				}
			}
		}
		return theKeys;
	};
}
module.exports = keysShim;
'use strict';

var slice = Array.prototype.slice;
var isArgs = require('./isArguments');

var origKeys = Object.keys;
var keysShim = origKeys ? function keys(o) { return origKeys(o); } : require('./implementation');

var originalKeys = Object.keys;

keysShim.shim = function shimObjectKeys() {
	if (Object.keys) {
		var keysWorksWithArguments = (function () {
			// Safari 5.0 bug
			var args = Object.keys(arguments);
			return args && args.length === arguments.length;
		}(1, 2));
		if (!keysWorksWithArguments) {
			Object.keys = function keys(object) { // eslint-disable-line func-name-matching
				if (isArgs(object)) {
					return originalKeys(slice.call(object));
				}
				return originalKeys(object);
			};
		}
	} else {
		Object.keys = keysShim;
	}
	return Object.keys || keysShim;
};

module.exports = keysShim;
'use strict';

var toStr = Object.prototype.toString;

module.exports = function isArguments(value) {
	var str = toStr.call(value);
	var isArgs = str === '[object Arguments]';
	if (!isArgs) {
		isArgs = str !== '[object Array]' &&
			value !== null &&
			typeof value === 'object' &&
			typeof value.length === 'number' &&
			value.length >= 0 &&
			toStr.call(value.callee) === '[object Function]';
	}
	return isArgs;
};
{
  "name": "object-keys",
  "version": "1.1.1",
  "author": {
    "name": "Jordan Harband",
    "email": "ljharb@gmail.com",
    "url": "http://ljharb.codes"
  },
  "description": "An Object.keys replacement, in case Object.keys is not available. From https://github.com/es-shims/es5-shim",
  "license": "MIT",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/ljharb/object-keys.git"
  },
  "dependencies": {},
  "devDependencies": {
    "@ljharb/eslint-config": "^13.1.1",
    "covert": "^1.1.1",
    "eslint": "^5.13.0",
    "foreach": "^2.0.5",
    "indexof": "^0.0.1",
    "is": "^3.3.0",
    "tape": "^4.9.2"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "engines": {
    "node": ">= 0.4"
  }
}root = true

[*]
indent_style = tab
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 150

[CHANGELOG.md]
indent_style = space
indent_size = 2

[*.json]
max_line_length = off

[Makefile]
max_line_length = off
dist/
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"lines": 86,
	"statements": 85.93,
	"functions": 82.43,
	"branches": 76.06,
	"exclude": [
		"coverage",
		"operations",
		"test"
	]
}
The MIT License (MIT)

Copyright (c) 2014 Jordan Harband

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';

require('./shim')();
'use strict';

var keys = require('object-keys');

module.exports = function hasSymbols() {
	if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
	if (typeof Symbol.iterator === 'symbol') { return true; }

	var obj = {};
	var sym = Symbol('test');
	var symObj = Object(sym);
	if (typeof sym === 'string') { return false; }

	if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }
	if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }

	/*
	 * temp disabled per https://github.com/ljharb/object.assign/issues/17
	 * if (sym instanceof Symbol) { return false; }
	 * temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
	 * if (!(symObj instanceof Symbol)) { return false; }
	 */

	var symVal = 42;
	obj[sym] = symVal;
	for (sym in obj) { return false; } // eslint-disable-line no-unreachable-loop
	if (keys(obj).length !== 0) { return false; }
	if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }

	if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }

	var syms = Object.getOwnPropertySymbols(obj);
	if (syms.length !== 1 || syms[0] !== sym) { return false; }

	if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }

	if (typeof Object.getOwnPropertyDescriptor === 'function') {
		var descriptor = Object.getOwnPropertyDescriptor(obj, sym);
		if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
	}

	return true;
};
'use strict';

// modified from https://github.com/es-shims/es6-shim
var keys = require('object-keys');
var canBeObject = function (obj) {
	return typeof obj !== 'undefined' && obj !== null;
};
var hasSymbols = require('has-symbols/shams')();
var callBound = require('call-bind/callBound');
var toObject = Object;
var $push = callBound('Array.prototype.push');
var $propIsEnumerable = callBound('Object.prototype.propertyIsEnumerable');
var originalGetSymbols = hasSymbols ? Object.getOwnPropertySymbols : null;

// eslint-disable-next-line no-unused-vars
module.exports = function assign(target, source1) {
	if (!canBeObject(target)) { throw new TypeError('target must be an object'); }
	var objTarget = toObject(target);
	var s, source, i, props, syms, value, key;
	for (s = 1; s < arguments.length; ++s) {
		source = toObject(arguments[s]);
		props = keys(source);
		var getSymbols = hasSymbols && (Object.getOwnPropertySymbols || originalGetSymbols);
		if (getSymbols) {
			syms = getSymbols(source);
			for (i = 0; i < syms.length; ++i) {
				key = syms[i];
				if ($propIsEnumerable(source, key)) {
					$push(props, key);
				}
			}
		}
		for (i = 0; i < props.length; ++i) {
			key = props[i];
			value = source[key];
			if ($propIsEnumerable(source, key)) {
				objTarget[key] = value;
			}
		}
	}
	return objTarget;
};
'use strict';

var defineProperties = require('define-properties');
var callBind = require('call-bind');

var implementation = require('./implementation');
var getPolyfill = require('./polyfill');
var shim = require('./shim');

var polyfill = callBind.apply(getPolyfill());
// eslint-disable-next-line no-unused-vars
var bound = function assign(target, source1) {
	return polyfill(Object, arguments);
};

defineProperties(bound, {
	getPolyfill: getPolyfill,
	implementation: implementation,
	shim: shim
});

module.exports = bound;
{
  "name": "object.assign",
  "version": "4.1.2",
  "author": "Jordan Harband",
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "description": "ES6 spec-compliant Object.assign shim. From https://github.com/es-shims/es6-shim",
  "license": "MIT",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/ljharb/object.assign.git"
  },
  "dependencies": {
    "call-bind": "^1.0.0",
    "define-properties": "^1.1.3",
    "has-symbols": "^1.0.1",
    "object-keys": "^1.1.1"
  },
  "devDependencies": {
    "@es-shims/api": "^2.1.2",
    "@ljharb/eslint-config": "^17.2.0",
    "aud": "^1.1.2",
    "browserify": "^16.5.2",
    "eslint": "^7.12.1",
    "for-each": "^0.3.3",
    "functions-have-names": "^1.2.1",
    "has": "^1.0.3",
    "is": "^3.3.0",
    "nyc": "^10.3.2",
    "safe-publish-latest": "^1.1.4",
    "ses": "^0.10.4",
    "tape": "^5.0.1"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/6.0..latest",
      "firefox/3.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/10.0..latest",
      "opera/next",
      "safari/4.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "engines": {
    "node": ">= 0.4"
  }
}'use strict';

var implementation = require('./implementation');

var lacksProperEnumerationOrder = function () {
	if (!Object.assign) {
		return false;
	}
	/*
	 * v8, specifically in node 4.x, has a bug with incorrect property enumeration order
	 * note: this does not detect the bug unless there's 20 characters
	 */
	var str = 'abcdefghijklmnopqrst';
	var letters = str.split('');
	var map = {};
	for (var i = 0; i < letters.length; ++i) {
		map[letters[i]] = letters[i];
	}
	var obj = Object.assign({}, map);
	var actual = '';
	for (var k in obj) {
		actual += k;
	}
	return str !== actual;
};

var assignHasPendingExceptions = function () {
	if (!Object.assign || !Object.preventExtensions) {
		return false;
	}
	/*
	 * Firefox 37 still has "pending exception" logic in its Object.assign implementation,
	 * which is 72% slower than our shim, and Firefox 40's native implementation.
	 */
	var thrower = Object.preventExtensions({ 1: 2 });
	try {
		Object.assign(thrower, 'xy');
	} catch (e) {
		return thrower[1] === 'y';
	}
	return false;
};

module.exports = function getPolyfill() {
	if (!Object.assign) {
		return implementation;
	}
	if (lacksProperEnumerationOrder()) {
		return implementation;
	}
	if (assignHasPendingExceptions()) {
		return implementation;
	}
	return Object.assign;
};
'use strict';

var define = require('define-properties');
var getPolyfill = require('./polyfill');

module.exports = function shimAssign() {
	var polyfill = getPolyfill();
	define(
		Object,
		{ assign: polyfill },
		{ assign: function () { return Object.assign !== polyfill; } }
	);
	return polyfill;
};
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
'use strict';

var keys = require('object-keys').shim();
delete keys.shim;

var assign = require('./');

module.exports = assign.shim();

delete assign.shim;

},{"./":3,"object-keys":14}],2:[function(require,module,exports){
'use strict';

// modified from https://github.com/es-shims/es6-shim
var keys = require('object-keys');
var canBeObject = function (obj) {
	return typeof obj !== 'undefined' && obj !== null;
};
var hasSymbols = require('has-symbols/shams')();
var callBound = require('call-bind/callBound');
var toObject = Object;
var $push = callBound('Array.prototype.push');
var $propIsEnumerable = callBound('Object.prototype.propertyIsEnumerable');
var originalGetSymbols = hasSymbols ? Object.getOwnPropertySymbols : null;

// eslint-disable-next-line no-unused-vars
module.exports = function assign(target, source1) {
	if (!canBeObject(target)) { throw new TypeError('target must be an object'); }
	var objTarget = toObject(target);
	var s, source, i, props, syms, value, key;
	for (s = 1; s < arguments.length; ++s) {
		source = toObject(arguments[s]);
		props = keys(source);
		var getSymbols = hasSymbols && (Object.getOwnPropertySymbols || originalGetSymbols);
		if (getSymbols) {
			syms = getSymbols(source);
			for (i = 0; i < syms.length; ++i) {
				key = syms[i];
				if ($propIsEnumerable(source, key)) {
					$push(props, key);
				}
			}
		}
		for (i = 0; i < props.length; ++i) {
			key = props[i];
			value = source[key];
			if ($propIsEnumerable(source, key)) {
				objTarget[key] = value;
			}
		}
	}
	return objTarget;
};

},{"call-bind/callBound":4,"has-symbols/shams":11,"object-keys":14}],3:[function(require,module,exports){
'use strict';

var defineProperties = require('define-properties');
var callBind = require('call-bind');

var implementation = require('./implementation');
var getPolyfill = require('./polyfill');
var shim = require('./shim');

var polyfill = callBind.apply(getPolyfill());
// eslint-disable-next-line no-unused-vars
var bound = function assign(target, source1) {
	return polyfill(Object, arguments);
};

defineProperties(bound, {
	getPolyfill: getPolyfill,
	implementation: implementation,
	shim: shim
});

module.exports = bound;

},{"./implementation":2,"./polyfill":16,"./shim":17,"call-bind":5,"define-properties":6}],4:[function(require,module,exports){
'use strict';

var GetIntrinsic = require('get-intrinsic');

var callBind = require('./');

var $indexOf = callBind(GetIntrinsic('String.prototype.indexOf'));

module.exports = function callBoundIntrinsic(name, allowMissing) {
	var intrinsic = GetIntrinsic(name, !!allowMissing);
	if (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) {
		return callBind(intrinsic);
	}
	return intrinsic;
};

},{"./":5,"get-intrinsic":9}],5:[function(require,module,exports){
'use strict';

var bind = require('function-bind');
var GetIntrinsic = require('get-intrinsic');

var $apply = GetIntrinsic('%Function.prototype.apply%');
var $call = GetIntrinsic('%Function.prototype.call%');
var $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply);

var $defineProperty = GetIntrinsic('%Object.defineProperty%', true);

if ($defineProperty) {
	try {
		$defineProperty({}, 'a', { value: 1 });
	} catch (e) {
		// IE 8 has a broken defineProperty
		$defineProperty = null;
	}
}

module.exports = function callBind() {
	return $reflectApply(bind, $call, arguments);
};

var applyBind = function applyBind() {
	return $reflectApply(bind, $apply, arguments);
};

if ($defineProperty) {
	$defineProperty(module.exports, 'apply', { value: applyBind });
} else {
	module.exports.apply = applyBind;
}

},{"function-bind":8,"get-intrinsic":9}],6:[function(require,module,exports){
'use strict';

var keys = require('object-keys');
var hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';

var toStr = Object.prototype.toString;
var concat = Array.prototype.concat;
var origDefineProperty = Object.defineProperty;

var isFunction = function (fn) {
	return typeof fn === 'function' && toStr.call(fn) === '[object Function]';
};

var arePropertyDescriptorsSupported = function () {
	var obj = {};
	try {
		origDefineProperty(obj, 'x', { enumerable: false, value: obj });
		// eslint-disable-next-line no-unused-vars, no-restricted-syntax
		for (var _ in obj) { // jscs:ignore disallowUnusedVariables
			return false;
		}
		return obj.x === obj;
	} catch (e) { /* this is IE 8. */
		return false;
	}
};
var supportsDescriptors = origDefineProperty && arePropertyDescriptorsSupported();

var defineProperty = function (object, name, value, predicate) {
	if (name in object && (!isFunction(predicate) || !predicate())) {
		return;
	}
	if (supportsDescriptors) {
		origDefineProperty(object, name, {
			configurable: true,
			enumerable: false,
			value: value,
			writable: true
		});
	} else {
		object[name] = value;
	}
};

var defineProperties = function (object, map) {
	var predicates = arguments.length > 2 ? arguments[2] : {};
	var props = keys(map);
	if (hasSymbols) {
		props = concat.call(props, Object.getOwnPropertySymbols(map));
	}
	for (var i = 0; i < props.length; i += 1) {
		defineProperty(object, props[i], map[props[i]], predicates[props[i]]);
	}
};

defineProperties.supportsDescriptors = !!supportsDescriptors;

module.exports = defineProperties;

},{"object-keys":14}],7:[function(require,module,exports){
'use strict';

/* eslint no-invalid-this: 1 */

var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
var slice = Array.prototype.slice;
var toStr = Object.prototype.toString;
var funcType = '[object Function]';

module.exports = function bind(that) {
    var target = this;
    if (typeof target !== 'function' || toStr.call(target) !== funcType) {
        throw new TypeError(ERROR_MESSAGE + target);
    }
    var args = slice.call(arguments, 1);

    var bound;
    var binder = function () {
        if (this instanceof bound) {
            var result = target.apply(
                this,
                args.concat(slice.call(arguments))
            );
            if (Object(result) === result) {
                return result;
            }
            return this;
        } else {
            return target.apply(
                that,
                args.concat(slice.call(arguments))
            );
        }
    };

    var boundLength = Math.max(0, target.length - args.length);
    var boundArgs = [];
    for (var i = 0; i < boundLength; i++) {
        boundArgs.push('$' + i);
    }

    bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);

    if (target.prototype) {
        var Empty = function Empty() {};
        Empty.prototype = target.prototype;
        bound.prototype = new Empty();
        Empty.prototype = null;
    }

    return bound;
};

},{}],8:[function(require,module,exports){
'use strict';

var implementation = require('./implementation');

module.exports = Function.prototype.bind || implementation;

},{"./implementation":7}],9:[function(require,module,exports){
'use strict';

/* globals
	AggregateError,
	Atomics,
	FinalizationRegistry,
	SharedArrayBuffer,
	WeakRef,
*/

var undefined;

var $SyntaxError = SyntaxError;
var $Function = Function;
var $TypeError = TypeError;

// eslint-disable-next-line consistent-return
var getEvalledConstructor = function (expressionSyntax) {
	try {
		// eslint-disable-next-line no-new-func
		return Function('"use strict"; return (' + expressionSyntax + ').constructor;')();
	} catch (e) {}
};

var $gOPD = Object.getOwnPropertyDescriptor;
if ($gOPD) {
	try {
		$gOPD({}, '');
	} catch (e) {
		$gOPD = null; // this is IE 8, which has a broken gOPD
	}
}

var throwTypeError = function () {
	throw new $TypeError();
};
var ThrowTypeError = $gOPD
	? (function () {
		try {
			// eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties
			arguments.callee; // IE 8 does not throw here
			return throwTypeError;
		} catch (calleeThrows) {
			try {
				// IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '')
				return $gOPD(arguments, 'callee').get;
			} catch (gOPDthrows) {
				return throwTypeError;
			}
		}
	}())
	: throwTypeError;

var hasSymbols = require('has-symbols')();

var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto

var asyncGenFunction = getEvalledConstructor('async function* () {}');
var asyncGenFunctionPrototype = asyncGenFunction ? asyncGenFunction.prototype : undefined;
var asyncGenPrototype = asyncGenFunctionPrototype ? asyncGenFunctionPrototype.prototype : undefined;

var TypedArray = typeof Uint8Array === 'undefined' ? undefined : getProto(Uint8Array);

var INTRINSICS = {
	'%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError,
	'%Array%': Array,
	'%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,
	'%ArrayIteratorPrototype%': hasSymbols ? getProto([][Symbol.iterator]()) : undefined,
	'%AsyncFromSyncIteratorPrototype%': undefined,
	'%AsyncFunction%': getEvalledConstructor('async function () {}'),
	'%AsyncGenerator%': asyncGenFunctionPrototype,
	'%AsyncGeneratorFunction%': asyncGenFunction,
	'%AsyncIteratorPrototype%': asyncGenPrototype ? getProto(asyncGenPrototype) : undefined,
	'%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,
	'%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt,
	'%Boolean%': Boolean,
	'%DataView%': typeof DataView === 'undefined' ? undefined : DataView,
	'%Date%': Date,
	'%decodeURI%': decodeURI,
	'%decodeURIComponent%': decodeURIComponent,
	'%encodeURI%': encodeURI,
	'%encodeURIComponent%': encodeURIComponent,
	'%Error%': Error,
	'%eval%': eval, // eslint-disable-line no-eval
	'%EvalError%': EvalError,
	'%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,
	'%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,
	'%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry,
	'%Function%': $Function,
	'%GeneratorFunction%': getEvalledConstructor('function* () {}'),
	'%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,
	'%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,
	'%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,
	'%isFinite%': isFinite,
	'%isNaN%': isNaN,
	'%IteratorPrototype%': hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined,
	'%JSON%': typeof JSON === 'object' ? JSON : undefined,
	'%Map%': typeof Map === 'undefined' ? undefined : Map,
	'%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols ? undefined : getProto(new Map()[Symbol.iterator]()),
	'%Math%': Math,
	'%Number%': Number,
	'%Object%': Object,
	'%parseFloat%': parseFloat,
	'%parseInt%': parseInt,
	'%Promise%': typeof Promise === 'undefined' ? undefined : Promise,
	'%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,
	'%RangeError%': RangeError,
	'%ReferenceError%': ReferenceError,
	'%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,
	'%RegExp%': RegExp,
	'%Set%': typeof Set === 'undefined' ? undefined : Set,
	'%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols ? undefined : getProto(new Set()[Symbol.iterator]()),
	'%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,
	'%String%': String,
	'%StringIteratorPrototype%': hasSymbols ? getProto(''[Symbol.iterator]()) : undefined,
	'%Symbol%': hasSymbols ? Symbol : undefined,
	'%SyntaxError%': $SyntaxError,
	'%ThrowTypeError%': ThrowTypeError,
	'%TypedArray%': TypedArray,
	'%TypeError%': $TypeError,
	'%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,
	'%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,
	'%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,
	'%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,
	'%URIError%': URIError,
	'%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,
	'%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef,
	'%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet
};

var LEGACY_ALIASES = {
	'%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'],
	'%ArrayPrototype%': ['Array', 'prototype'],
	'%ArrayProto_entries%': ['Array', 'prototype', 'entries'],
	'%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'],
	'%ArrayProto_keys%': ['Array', 'prototype', 'keys'],
	'%ArrayProto_values%': ['Array', 'prototype', 'values'],
	'%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'],
	'%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'],
	'%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'],
	'%BooleanPrototype%': ['Boolean', 'prototype'],
	'%DataViewPrototype%': ['DataView', 'prototype'],
	'%DatePrototype%': ['Date', 'prototype'],
	'%ErrorPrototype%': ['Error', 'prototype'],
	'%EvalErrorPrototype%': ['EvalError', 'prototype'],
	'%Float32ArrayPrototype%': ['Float32Array', 'prototype'],
	'%Float64ArrayPrototype%': ['Float64Array', 'prototype'],
	'%FunctionPrototype%': ['Function', 'prototype'],
	'%Generator%': ['GeneratorFunction', 'prototype'],
	'%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'],
	'%Int8ArrayPrototype%': ['Int8Array', 'prototype'],
	'%Int16ArrayPrototype%': ['Int16Array', 'prototype'],
	'%Int32ArrayPrototype%': ['Int32Array', 'prototype'],
	'%JSONParse%': ['JSON', 'parse'],
	'%JSONStringify%': ['JSON', 'stringify'],
	'%MapPrototype%': ['Map', 'prototype'],
	'%NumberPrototype%': ['Number', 'prototype'],
	'%ObjectPrototype%': ['Object', 'prototype'],
	'%ObjProto_toString%': ['Object', 'prototype', 'toString'],
	'%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'],
	'%PromisePrototype%': ['Promise', 'prototype'],
	'%PromiseProto_then%': ['Promise', 'prototype', 'then'],
	'%Promise_all%': ['Promise', 'all'],
	'%Promise_reject%': ['Promise', 'reject'],
	'%Promise_resolve%': ['Promise', 'resolve'],
	'%RangeErrorPrototype%': ['RangeError', 'prototype'],
	'%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'],
	'%RegExpPrototype%': ['RegExp', 'prototype'],
	'%SetPrototype%': ['Set', 'prototype'],
	'%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'],
	'%StringPrototype%': ['String', 'prototype'],
	'%SymbolPrototype%': ['Symbol', 'prototype'],
	'%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'],
	'%TypedArrayPrototype%': ['TypedArray', 'prototype'],
	'%TypeErrorPrototype%': ['TypeError', 'prototype'],
	'%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'],
	'%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'],
	'%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'],
	'%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'],
	'%URIErrorPrototype%': ['URIError', 'prototype'],
	'%WeakMapPrototype%': ['WeakMap', 'prototype'],
	'%WeakSetPrototype%': ['WeakSet', 'prototype']
};

var bind = require('function-bind');
var hasOwn = require('has');
var $concat = bind.call(Function.call, Array.prototype.concat);
var $spliceApply = bind.call(Function.apply, Array.prototype.splice);
var $replace = bind.call(Function.call, String.prototype.replace);

/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */
var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g;
var reEscapeChar = /\\(\\)?/g; /** Used to match backslashes in property paths. */
var stringToPath = function stringToPath(string) {
	var result = [];
	$replace(string, rePropName, function (match, number, quote, subString) {
		result[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match;
	});
	return result;
};
/* end adaptation */

var getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {
	var intrinsicName = name;
	var alias;
	if (hasOwn(LEGACY_ALIASES, intrinsicName)) {
		alias = LEGACY_ALIASES[intrinsicName];
		intrinsicName = '%' + alias[0] + '%';
	}

	if (hasOwn(INTRINSICS, intrinsicName)) {
		var value = INTRINSICS[intrinsicName];
		if (typeof value === 'undefined' && !allowMissing) {
			throw new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');
		}

		return {
			alias: alias,
			name: intrinsicName,
			value: value
		};
	}

	throw new $SyntaxError('intrinsic ' + name + ' does not exist!');
};

module.exports = function GetIntrinsic(name, allowMissing) {
	if (typeof name !== 'string' || name.length === 0) {
		throw new $TypeError('intrinsic name must be a non-empty string');
	}
	if (arguments.length > 1 && typeof allowMissing !== 'boolean') {
		throw new $TypeError('"allowMissing" argument must be a boolean');
	}

	var parts = stringToPath(name);
	var intrinsicBaseName = parts.length > 0 ? parts[0] : '';

	var intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing);
	var intrinsicRealName = intrinsic.name;
	var value = intrinsic.value;
	var skipFurtherCaching = false;

	var alias = intrinsic.alias;
	if (alias) {
		intrinsicBaseName = alias[0];
		$spliceApply(parts, $concat([0, 1], alias));
	}

	for (var i = 1, isOwn = true; i < parts.length; i += 1) {
		var part = parts[i];
		if (part === 'constructor' || !isOwn) {
			skipFurtherCaching = true;
		}

		intrinsicBaseName += '.' + part;
		intrinsicRealName = '%' + intrinsicBaseName + '%';

		if (hasOwn(INTRINSICS, intrinsicRealName)) {
			value = INTRINSICS[intrinsicRealName];
		} else if (value != null) {
			if ($gOPD && (i + 1) >= parts.length) {
				var desc = $gOPD(value, part);
				isOwn = !!desc;

				if (!allowMissing && !(part in value)) {
					throw new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.');
				}
				// By convention, when a data property is converted to an accessor
				// property to emulate a data property that does not suffer from
				// the override mistake, that accessor's getter is marked with
				// an `originalValue` property. Here, when we detect this, we
				// uphold the illusion by pretending to see that original data
				// property, i.e., returning the value rather than the getter
				// itself.
				if (isOwn && 'get' in desc && !('originalValue' in desc.get)) {
					value = desc.get;
				} else {
					value = value[part];
				}
			} else {
				isOwn = hasOwn(value, part);
				value = value[part];
			}

			if (isOwn && !skipFurtherCaching) {
				INTRINSICS[intrinsicRealName] = value;
			}
		}
	}
	return value;
};

},{"function-bind":8,"has":12,"has-symbols":10}],10:[function(require,module,exports){
(function (global){(function (){
'use strict';

var origSymbol = global.Symbol;
var hasSymbolSham = require('./shams');

module.exports = function hasNativeSymbols() {
	if (typeof origSymbol !== 'function') { return false; }
	if (typeof Symbol !== 'function') { return false; }
	if (typeof origSymbol('foo') !== 'symbol') { return false; }
	if (typeof Symbol('bar') !== 'symbol') { return false; }

	return hasSymbolSham();
};

}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"./shams":11}],11:[function(require,module,exports){
'use strict';

/* eslint complexity: [2, 18], max-statements: [2, 33] */
module.exports = function hasSymbols() {
	if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
	if (typeof Symbol.iterator === 'symbol') { return true; }

	var obj = {};
	var sym = Symbol('test');
	var symObj = Object(sym);
	if (typeof sym === 'string') { return false; }

	if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }
	if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }

	// temp disabled per https://github.com/ljharb/object.assign/issues/17
	// if (sym instanceof Symbol) { return false; }
	// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
	// if (!(symObj instanceof Symbol)) { return false; }

	// if (typeof Symbol.prototype.toString !== 'function') { return false; }
	// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }

	var symVal = 42;
	obj[sym] = symVal;
	for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax
	if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }

	if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }

	var syms = Object.getOwnPropertySymbols(obj);
	if (syms.length !== 1 || syms[0] !== sym) { return false; }

	if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }

	if (typeof Object.getOwnPropertyDescriptor === 'function') {
		var descriptor = Object.getOwnPropertyDescriptor(obj, sym);
		if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
	}

	return true;
};

},{}],12:[function(require,module,exports){
'use strict';

var bind = require('function-bind');

module.exports = bind.call(Function.call, Object.prototype.hasOwnProperty);

},{"function-bind":8}],13:[function(require,module,exports){
'use strict';

var keysShim;
if (!Object.keys) {
	// modified from https://github.com/es-shims/es5-shim
	var has = Object.prototype.hasOwnProperty;
	var toStr = Object.prototype.toString;
	var isArgs = require('./isArguments'); // eslint-disable-line global-require
	var isEnumerable = Object.prototype.propertyIsEnumerable;
	var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');
	var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');
	var dontEnums = [
		'toString',
		'toLocaleString',
		'valueOf',
		'hasOwnProperty',
		'isPrototypeOf',
		'propertyIsEnumerable',
		'constructor'
	];
	var equalsConstructorPrototype = function (o) {
		var ctor = o.constructor;
		return ctor && ctor.prototype === o;
	};
	var excludedKeys = {
		$applicationCache: true,
		$console: true,
		$external: true,
		$frame: true,
		$frameElement: true,
		$frames: true,
		$innerHeight: true,
		$innerWidth: true,
		$onmozfullscreenchange: true,
		$onmozfullscreenerror: true,
		$outerHeight: true,
		$outerWidth: true,
		$pageXOffset: true,
		$pageYOffset: true,
		$parent: true,
		$scrollLeft: true,
		$scrollTop: true,
		$scrollX: true,
		$scrollY: true,
		$self: true,
		$webkitIndexedDB: true,
		$webkitStorageInfo: true,
		$window: true
	};
	var hasAutomationEqualityBug = (function () {
		/* global window */
		if (typeof window === 'undefined') { return false; }
		for (var k in window) {
			try {
				if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {
					try {
						equalsConstructorPrototype(window[k]);
					} catch (e) {
						return true;
					}
				}
			} catch (e) {
				return true;
			}
		}
		return false;
	}());
	var equalsConstructorPrototypeIfNotBuggy = function (o) {
		/* global window */
		if (typeof window === 'undefined' || !hasAutomationEqualityBug) {
			return equalsConstructorPrototype(o);
		}
		try {
			return equalsConstructorPrototype(o);
		} catch (e) {
			return false;
		}
	};

	keysShim = function keys(object) {
		var isObject = object !== null && typeof object === 'object';
		var isFunction = toStr.call(object) === '[object Function]';
		var isArguments = isArgs(object);
		var isString = isObject && toStr.call(object) === '[object String]';
		var theKeys = [];

		if (!isObject && !isFunction && !isArguments) {
			throw new TypeError('Object.keys called on a non-object');
		}

		var skipProto = hasProtoEnumBug && isFunction;
		if (isString && object.length > 0 && !has.call(object, 0)) {
			for (var i = 0; i < object.length; ++i) {
				theKeys.push(String(i));
			}
		}

		if (isArguments && object.length > 0) {
			for (var j = 0; j < object.length; ++j) {
				theKeys.push(String(j));
			}
		} else {
			for (var name in object) {
				if (!(skipProto && name === 'prototype') && has.call(object, name)) {
					theKeys.push(String(name));
				}
			}
		}

		if (hasDontEnumBug) {
			var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);

			for (var k = 0; k < dontEnums.length; ++k) {
				if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {
					theKeys.push(dontEnums[k]);
				}
			}
		}
		return theKeys;
	};
}
module.exports = keysShim;

},{"./isArguments":15}],14:[function(require,module,exports){
'use strict';

var slice = Array.prototype.slice;
var isArgs = require('./isArguments');

var origKeys = Object.keys;
var keysShim = origKeys ? function keys(o) { return origKeys(o); } : require('./implementation');

var originalKeys = Object.keys;

keysShim.shim = function shimObjectKeys() {
	if (Object.keys) {
		var keysWorksWithArguments = (function () {
			// Safari 5.0 bug
			var args = Object.keys(arguments);
			return args && args.length === arguments.length;
		}(1, 2));
		if (!keysWorksWithArguments) {
			Object.keys = function keys(object) { // eslint-disable-line func-name-matching
				if (isArgs(object)) {
					return originalKeys(slice.call(object));
				}
				return originalKeys(object);
			};
		}
	} else {
		Object.keys = keysShim;
	}
	return Object.keys || keysShim;
};

module.exports = keysShim;

},{"./implementation":13,"./isArguments":15}],15:[function(require,module,exports){
'use strict';

var toStr = Object.prototype.toString;

module.exports = function isArguments(value) {
	var str = toStr.call(value);
	var isArgs = str === '[object Arguments]';
	if (!isArgs) {
		isArgs = str !== '[object Array]' &&
			value !== null &&
			typeof value === 'object' &&
			typeof value.length === 'number' &&
			value.length >= 0 &&
			toStr.call(value.callee) === '[object Function]';
	}
	return isArgs;
};

},{}],16:[function(require,module,exports){
'use strict';

var implementation = require('./implementation');

var lacksProperEnumerationOrder = function () {
	if (!Object.assign) {
		return false;
	}
	/*
	 * v8, specifically in node 4.x, has a bug with incorrect property enumeration order
	 * note: this does not detect the bug unless there's 20 characters
	 */
	var str = 'abcdefghijklmnopqrst';
	var letters = str.split('');
	var map = {};
	for (var i = 0; i < letters.length; ++i) {
		map[letters[i]] = letters[i];
	}
	var obj = Object.assign({}, map);
	var actual = '';
	for (var k in obj) {
		actual += k;
	}
	return str !== actual;
};

var assignHasPendingExceptions = function () {
	if (!Object.assign || !Object.preventExtensions) {
		return false;
	}
	/*
	 * Firefox 37 still has "pending exception" logic in its Object.assign implementation,
	 * which is 72% slower than our shim, and Firefox 40's native implementation.
	 */
	var thrower = Object.preventExtensions({ 1: 2 });
	try {
		Object.assign(thrower, 'xy');
	} catch (e) {
		return thrower[1] === 'y';
	}
	return false;
};

module.exports = function getPolyfill() {
	if (!Object.assign) {
		return implementation;
	}
	if (lacksProperEnumerationOrder()) {
		return implementation;
	}
	if (assignHasPendingExceptions()) {
		return implementation;
	}
	return Object.assign;
};

},{"./implementation":2}],17:[function(require,module,exports){
'use strict';

var define = require('define-properties');
var getPolyfill = require('./polyfill');

module.exports = function shimAssign() {
	var polyfill = getPolyfill();
	define(
		Object,
		{ assign: polyfill },
		{ assign: function () { return Object.assign !== polyfill; } }
	);
	return polyfill;
};

},{"./polyfill":16,"define-properties":6}]},{},[1]);
# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/object.assign
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
name: Automatic Rebase

on: [pull_request_target]

jobs:
  _:
    name: "Automatic Rebase"

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - uses: ljharb/rebase@master
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
name: Require “Allow Edits”

on: [pull_request_target]

jobs:
  _:
    name: "Require “Allow Edits”"

    runs-on: ubuntu-latest

    steps:
    - uses: ljharb/require-allow-edits@main
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
2.4.1 / 2022-02-22
==================

  * Fix error on early async hooks implementations

2.4.0 / 2022-02-21
==================

  * Prevent loss of async hooks context

2.3.0 / 2015-05-26
==================

  * Add defined behavior for HTTP `CONNECT` requests
  * Add defined behavior for HTTP `Upgrade` requests
  * deps: ee-first@1.1.1

2.2.1 / 2015-04-22
==================

  * Fix `isFinished(req)` when data buffered

2.2.0 / 2014-12-22
==================

  * Add message object to callback arguments

2.1.1 / 2014-10-22
==================

  * Fix handling of pipelined requests

2.1.0 / 2014-08-16
==================

  * Check if `socket` is detached
  * Return `undefined` for `isFinished` if state unknown

2.0.0 / 2014-08-16
==================

  * Add `isFinished` function
  * Move to `jshttp` organization
  * Remove support for plain socket argument
  * Rename to `on-finished`
  * Support both `req` and `res` as arguments
  * deps: ee-first@1.0.5

1.2.2 / 2014-06-10
==================

  * Reduce listeners added to emitters
    - avoids "event emitter leak" warnings when used multiple times on same request

1.2.1 / 2014-06-08
==================

  * Fix returned value when already finished

1.2.0 / 2014-06-05
==================

  * Call callback when called on already-finished socket

1.1.4 / 2014-05-27
==================

  * Support node.js 0.8

1.1.3 / 2014-04-30
==================

  * Make sure errors passed as instanceof `Error`

1.1.2 / 2014-04-18
==================

  * Default the `socket` to passed-in object

1.1.1 / 2014-01-16
==================

  * Rename module to `finished`

1.1.0 / 2013-12-25
==================

  * Call callback when called on already-errored socket

1.0.1 / 2013-12-20
==================

  * Actually pass the error to the callback

1.0.0 / 2013-12-20
==================

  * Initial release
(The MIT License)

Copyright (c) 2013 Jonathan Ong <me@jongleberry.com>
Copyright (c) 2014 Douglas Christopher Wilson <doug@somethingdoug.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.
/*!
 * on-finished
 * Copyright(c) 2013 Jonathan Ong
 * Copyright(c) 2014 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module exports.
 * @public
 */

module.exports = onFinished
module.exports.isFinished = isFinished

/**
 * Module dependencies.
 * @private
 */

var asyncHooks = tryRequireAsyncHooks()
var first = require('ee-first')

/**
 * Variables.
 * @private
 */

/* istanbul ignore next */
var defer = typeof setImmediate === 'function'
  ? setImmediate
  : function (fn) { process.nextTick(fn.bind.apply(fn, arguments)) }

/**
 * Invoke callback when the response has finished, useful for
 * cleaning up resources afterwards.
 *
 * @param {object} msg
 * @param {function} listener
 * @return {object}
 * @public
 */

function onFinished (msg, listener) {
  if (isFinished(msg) !== false) {
    defer(listener, null, msg)
    return msg
  }

  // attach the listener to the message
  attachListener(msg, wrap(listener))

  return msg
}

/**
 * Determine if message is already finished.
 *
 * @param {object} msg
 * @return {boolean}
 * @public
 */

function isFinished (msg) {
  var socket = msg.socket

  if (typeof msg.finished === 'boolean') {
    // OutgoingMessage
    return Boolean(msg.finished || (socket && !socket.writable))
  }

  if (typeof msg.complete === 'boolean') {
    // IncomingMessage
    return Boolean(msg.upgrade || !socket || !socket.readable || (msg.complete && !msg.readable))
  }

  // don't know
  return undefined
}

/**
 * Attach a finished listener to the message.
 *
 * @param {object} msg
 * @param {function} callback
 * @private
 */

function attachFinishedListener (msg, callback) {
  var eeMsg
  var eeSocket
  var finished = false

  function onFinish (error) {
    eeMsg.cancel()
    eeSocket.cancel()

    finished = true
    callback(error)
  }

  // finished on first message event
  eeMsg = eeSocket = first([[msg, 'end', 'finish']], onFinish)

  function onSocket (socket) {
    // remove listener
    msg.removeListener('socket', onSocket)

    if (finished) return
    if (eeMsg !== eeSocket) return

    // finished on first socket event
    eeSocket = first([[socket, 'error', 'close']], onFinish)
  }

  if (msg.socket) {
    // socket already assigned
    onSocket(msg.socket)
    return
  }

  // wait for socket to be assigned
  msg.on('socket', onSocket)

  if (msg.socket === undefined) {
    // istanbul ignore next: node.js 0.8 patch
    patchAssignSocket(msg, onSocket)
  }
}

/**
 * Attach the listener to the message.
 *
 * @param {object} msg
 * @return {function}
 * @private
 */

function attachListener (msg, listener) {
  var attached = msg.__onFinished

  // create a private single listener with queue
  if (!attached || !attached.queue) {
    attached = msg.__onFinished = createListener(msg)
    attachFinishedListener(msg, attached)
  }

  attached.queue.push(listener)
}

/**
 * Create listener on message.
 *
 * @param {object} msg
 * @return {function}
 * @private
 */

function createListener (msg) {
  function listener (err) {
    if (msg.__onFinished === listener) msg.__onFinished = null
    if (!listener.queue) return

    var queue = listener.queue
    listener.queue = null

    for (var i = 0; i < queue.length; i++) {
      queue[i](err, msg)
    }
  }

  listener.queue = []

  return listener
}

/**
 * Patch ServerResponse.prototype.assignSocket for node.js 0.8.
 *
 * @param {ServerResponse} res
 * @param {function} callback
 * @private
 */

// istanbul ignore next: node.js 0.8 patch
function patchAssignSocket (res, callback) {
  var assignSocket = res.assignSocket

  if (typeof assignSocket !== 'function') return

  // res.on('socket', callback) is broken in 0.8
  res.assignSocket = function _assignSocket (socket) {
    assignSocket.call(this, socket)
    callback(socket)
  }
}

/**
 * Try to require async_hooks
 * @private
 */

function tryRequireAsyncHooks () {
  try {
    return require('async_hooks')
  } catch (e) {
    return {}
  }
}

/**
 * Wrap function with async resource, if possible.
 * AsyncResource.bind static method backported.
 * @private
 */

function wrap (fn) {
  var res

  // create anonymous resource
  if (asyncHooks.AsyncResource) {
    res = new asyncHooks.AsyncResource(fn.name || 'bound-anonymous-fn')
  }

  // incompatible node.js
  if (!res || !res.runInAsyncScope) {
    return fn
  }

  // return bound function
  return res.runInAsyncScope.bind(res, fn, null)
}
{
  "name": "on-finished",
  "description": "Execute a callback when a request closes, finishes, or errors",
  "version": "2.4.1",
  "license": "MIT",
  "repository": "jshttp/on-finished",
  "dependencies": {
    "ee-first": "1.1.1"
  },
  "devDependencies": {
    "eslint": "7.32.0",
    "eslint-config-standard": "14.1.1",
    "eslint-plugin-import": "2.25.4",
    "eslint-plugin-markdown": "2.2.1",
    "eslint-plugin-node": "11.1.0",
    "eslint-plugin-promise": "5.2.0",
    "eslint-plugin-standard": "4.1.0",
    "mocha": "9.2.1",
    "nyc": "15.1.0"
  },
  "engines": {
    "node": ">= 0.8"
  },
  "files": [
    "HISTORY.md",
    "LICENSE",
    "index.js"
  ]
}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.
var wrappy = require('wrappy')
module.exports = wrappy(once)
module.exports.strict = wrappy(onceStrict)

once.proto = once(function () {
  Object.defineProperty(Function.prototype, 'once', {
    value: function () {
      return once(this)
    },
    configurable: true
  })

  Object.defineProperty(Function.prototype, 'onceStrict', {
    value: function () {
      return onceStrict(this)
    },
    configurable: true
  })
})

function once (fn) {
  var f = function () {
    if (f.called) return f.value
    f.called = true
    return f.value = fn.apply(this, arguments)
  }
  f.called = false
  return f
}

function onceStrict (fn) {
  var f = function () {
    if (f.called)
      throw new Error(f.onceError)
    f.called = true
    return f.value = fn.apply(this, arguments)
  }
  var name = fn.name || 'Function wrapped with `once`'
  f.onceError = name + " shouldn't be called more than once"
  f.called = false
  return f
}
{
  "name": "once",
  "version": "1.4.0",
  "description": "Run a function exactly one time",
  "main": "once.js",
  "directories": {
    "test": "test"
  },
  "dependencies": {
    "wrappy": "1"
  },
  "devDependencies": {
    "tap": "^7.0.1"
  },
  "files": [
    "once.js"
  ],
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/once"
  },
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
  "license": "ISC"
}const path = require('path');
const childProcess = require('child_process');
const {promises: fs, constants: fsConstants} = require('fs');
const isWsl = require('is-wsl');
const isDocker = require('is-docker');
const defineLazyProperty = require('define-lazy-prop');

// Path to included `xdg-open`.
const localXdgOpenPath = path.join(__dirname, 'xdg-open');

const {platform, arch} = process;

/**
Get the mount point for fixed drives in WSL.

@inner
@returns {string} The mount point.
*/
const getWslDrivesMountPoint = (() => {
	// Default value for "root" param
	// according to https://docs.microsoft.com/en-us/windows/wsl/wsl-config
	const defaultMountPoint = '/mnt/';

	let mountPoint;

	return async function () {
		if (mountPoint) {
			// Return memoized mount point value
			return mountPoint;
		}

		const configFilePath = '/etc/wsl.conf';

		let isConfigFileExists = false;
		try {
			await fs.access(configFilePath, fsConstants.F_OK);
			isConfigFileExists = true;
		} catch {}

		if (!isConfigFileExists) {
			return defaultMountPoint;
		}

		const configContent = await fs.readFile(configFilePath, {encoding: 'utf8'});
		const configMountPoint = /(?<!#.*)root\s*=\s*(?<mountPoint>.*)/g.exec(configContent);

		if (!configMountPoint) {
			return defaultMountPoint;
		}

		mountPoint = configMountPoint.groups.mountPoint.trim();
		mountPoint = mountPoint.endsWith('/') ? mountPoint : `${mountPoint}/`;

		return mountPoint;
	};
})();

const pTryEach = async (array, mapper) => {
	let latestError;

	for (const item of array) {
		try {
			return await mapper(item); // eslint-disable-line no-await-in-loop
		} catch (error) {
			latestError = error;
		}
	}

	throw latestError;
};

const baseOpen = async options => {
	options = {
		wait: false,
		background: false,
		newInstance: false,
		allowNonzeroExitCode: false,
		...options
	};

	if (Array.isArray(options.app)) {
		return pTryEach(options.app, singleApp => baseOpen({
			...options,
			app: singleApp
		}));
	}

	let {name: app, arguments: appArguments = []} = options.app || {};
	appArguments = [...appArguments];

	if (Array.isArray(app)) {
		return pTryEach(app, appName => baseOpen({
			...options,
			app: {
				name: appName,
				arguments: appArguments
			}
		}));
	}

	let command;
	const cliArguments = [];
	const childProcessOptions = {};

	if (platform === 'darwin') {
		command = 'open';

		if (options.wait) {
			cliArguments.push('--wait-apps');
		}

		if (options.background) {
			cliArguments.push('--background');
		}

		if (options.newInstance) {
			cliArguments.push('--new');
		}

		if (app) {
			cliArguments.push('-a', app);
		}
	} else if (platform === 'win32' || (isWsl && !isDocker())) {
		const mountPoint = await getWslDrivesMountPoint();

		command = isWsl ?
			`${mountPoint}c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe` :
			`${process.env.SYSTEMROOT}\\System32\\WindowsPowerShell\\v1.0\\powershell`;

		cliArguments.push(
			'-NoProfile',
			'-NonInteractive',
			'–ExecutionPolicy',
			'Bypass',
			'-EncodedCommand'
		);

		if (!isWsl) {
			childProcessOptions.windowsVerbatimArguments = true;
		}

		const encodedArguments = ['Start'];

		if (options.wait) {
			encodedArguments.push('-Wait');
		}

		if (app) {
			// Double quote with double quotes to ensure the inner quotes are passed through.
			// Inner quotes are delimited for PowerShell interpretation with backticks.
			encodedArguments.push(`"\`"${app}\`""`, '-ArgumentList');
			if (options.target) {
				appArguments.unshift(options.target);
			}
		} else if (options.target) {
			encodedArguments.push(`"${options.target}"`);
		}

		if (appArguments.length > 0) {
			appArguments = appArguments.map(arg => `"\`"${arg}\`""`);
			encodedArguments.push(appArguments.join(','));
		}

		// Using Base64-encoded command, accepted by PowerShell, to allow special characters.
		options.target = Buffer.from(encodedArguments.join(' '), 'utf16le').toString('base64');
	} else {
		if (app) {
			command = app;
		} else {
			// When bundled by Webpack, there's no actual package file path and no local `xdg-open`.
			const isBundled = !__dirname || __dirname === '/';

			// Check if local `xdg-open` exists and is executable.
			let exeLocalXdgOpen = false;
			try {
				await fs.access(localXdgOpenPath, fsConstants.X_OK);
				exeLocalXdgOpen = true;
			} catch {}

			const useSystemXdgOpen = process.versions.electron ||
				platform === 'android' || isBundled || !exeLocalXdgOpen;
			command = useSystemXdgOpen ? 'xdg-open' : localXdgOpenPath;
		}

		if (appArguments.length > 0) {
			cliArguments.push(...appArguments);
		}

		if (!options.wait) {
			// `xdg-open` will block the process unless stdio is ignored
			// and it's detached from the parent even if it's unref'd.
			childProcessOptions.stdio = 'ignore';
			childProcessOptions.detached = true;
		}
	}

	if (options.target) {
		cliArguments.push(options.target);
	}

	if (platform === 'darwin' && appArguments.length > 0) {
		cliArguments.push('--args', ...appArguments);
	}

	const subprocess = childProcess.spawn(command, cliArguments, childProcessOptions);

	if (options.wait) {
		return new Promise((resolve, reject) => {
			subprocess.once('error', reject);

			subprocess.once('close', exitCode => {
				if (options.allowNonzeroExitCode && exitCode > 0) {
					reject(new Error(`Exited with code ${exitCode}`));
					return;
				}

				resolve(subprocess);
			});
		});
	}

	subprocess.unref();

	return subprocess;
};

const open = (target, options) => {
	if (typeof target !== 'string') {
		throw new TypeError('Expected a `target`');
	}

	return baseOpen({
		...options,
		target
	});
};

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

	const {arguments: appArguments = []} = options || {};
	if (appArguments !== undefined && appArguments !== null && !Array.isArray(appArguments)) {
		throw new TypeError('Expected `appArguments` as Array type');
	}

	return baseOpen({
		...options,
		app: {
			name,
			arguments: appArguments
		}
	});
};

function detectArchBinary(binary) {
	if (typeof binary === 'string' || Array.isArray(binary)) {
		return binary;
	}

	const {[arch]: archBinary} = binary;

	if (!archBinary) {
		throw new Error(`${arch} is not supported`);
	}

	return archBinary;
}

function detectPlatformBinary({[platform]: platformBinary}, {wsl}) {
	if (wsl && isWsl) {
		return detectArchBinary(wsl);
	}

	if (!platformBinary) {
		throw new Error(`${platform} is not supported`);
	}

	return detectArchBinary(platformBinary);
}

const apps = {};

defineLazyProperty(apps, 'chrome', () => detectPlatformBinary({
	darwin: 'google chrome',
	win32: 'chrome',
	linux: ['google-chrome', 'google-chrome-stable', 'chromium']
}, {
	wsl: {
		ia32: '/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe',
		x64: ['/mnt/c/Program Files/Google/Chrome/Application/chrome.exe', '/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe']
	}
}));

defineLazyProperty(apps, 'firefox', () => detectPlatformBinary({
	darwin: 'firefox',
	win32: 'C:\\Program Files\\Mozilla Firefox\\firefox.exe',
	linux: 'firefox'
}, {
	wsl: '/mnt/c/Program Files/Mozilla Firefox/firefox.exe'
}));

defineLazyProperty(apps, 'edge', () => detectPlatformBinary({
	darwin: 'microsoft edge',
	win32: 'msedge',
	linux: ['microsoft-edge', 'microsoft-edge-dev']
}, {
	wsl: '/mnt/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe'
}));

open.apps = apps;
open.openApp = openApp;

module.exports = open;
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": "open",
  "version": "8.4.0",
  "description": "Open stuff like URLs, files, executables. Cross-platform.",
  "license": "MIT",
  "repository": "sindresorhus/open",
  "funding": "https://github.com/sponsors/sindresorhus",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "https://sindresorhus.com"
  },
  "engines": {
    "node": ">=12"
  },
  "files": [
    "index.js",
    "index.d.ts",
    "xdg-open"
  ],
  "dependencies": {
    "define-lazy-prop": "^2.0.0",
    "is-docker": "^2.1.1",
    "is-wsl": "^2.2.0"
  },
  "devDependencies": {
    "@types/node": "^15.0.0",
    "ava": "^3.15.0",
    "tsd": "^0.14.0",
    "xo": "^0.39.1"
  }
}#!/bin/sh
#---------------------------------------------
#   xdg-open
#
#   Utility script to open a URL in the registered default application.
#
#   Refer to the usage() function below for usage.
#
#   Copyright 2009-2010, Fathi Boudra <fabo@freedesktop.org>
#   Copyright 2009-2010, Rex Dieter <rdieter@fedoraproject.org>
#   Copyright 2006, Kevin Krammer <kevin.krammer@gmx.at>
#   Copyright 2006, Jeremy White <jwhite@codeweavers.com>
#
#   LICENSE:
#
#   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.
#
#---------------------------------------------

manualpage()
{
cat << _MANUALPAGE
Name

   xdg-open -- opens a file or URL in the user's preferred
   application

Synopsis

   xdg-open { file | URL }

   xdg-open { --help | --manual | --version }

Description

   xdg-open opens a file or URL in the user's preferred
   application. If a URL is provided the URL will be opened in the
   user's preferred web browser. If a file is provided the file
   will be opened in the preferred application for files of that
   type. xdg-open supports file, ftp, http and https URLs.

   xdg-open is for use inside a desktop session only. It is not
   recommended to use xdg-open as root.

Options

   --help
          Show command synopsis.

   --manual
          Show this manual page.

   --version
          Show the xdg-utils version information.

Exit Codes

   An exit code of 0 indicates success while a non-zero exit code
   indicates failure. The following failure codes can be returned:

   1
          Error in command line syntax.

   2
          One of the files passed on the command line did not
          exist.

   3
          A required tool could not be found.

   4
          The action failed.

See Also

   xdg-mime(1), xdg-settings(1), MIME applications associations
   specification

Examples

xdg-open 'http://www.freedesktop.org/'

   Opens the freedesktop.org website in the user's default
   browser.

xdg-open /tmp/foobar.png

   Opens the PNG image file /tmp/foobar.png in the user's default
   image viewing application.
_MANUALPAGE
}

usage()
{
cat << _USAGE
   xdg-open -- opens a file or URL in the user's preferred
   application

Synopsis

   xdg-open { file | URL }

   xdg-open { --help | --manual | --version }

_USAGE
}

#@xdg-utils-common@

#----------------------------------------------------------------------------
#   Common utility functions included in all XDG wrapper scripts
#----------------------------------------------------------------------------

DEBUG()
{
  [ -z "${XDG_UTILS_DEBUG_LEVEL}" ] && return 0;
  [ ${XDG_UTILS_DEBUG_LEVEL} -lt $1 ] && return 0;
  shift
  echo "$@" >&2
}

# This handles backslashes but not quote marks.
first_word()
{
    read first rest
    echo "$first"
}

#-------------------------------------------------------------
# map a binary to a .desktop file
binary_to_desktop_file()
{
    search="${XDG_DATA_HOME:-$HOME/.local/share}:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}"
    binary="`which "$1"`"
    binary="`readlink -f "$binary"`"
    base="`basename "$binary"`"
    IFS=:
    for dir in $search; do
        unset IFS
        [ "$dir" ] || continue
        [ -d "$dir/applications" ] || [ -d "$dir/applnk" ] || continue
        for file in "$dir"/applications/*.desktop "$dir"/applications/*/*.desktop "$dir"/applnk/*.desktop "$dir"/applnk/*/*.desktop; do
            [ -r "$file" ] || continue
            # Check to make sure it's worth the processing.
            grep -q "^Exec.*$base" "$file" || continue
            # Make sure it's a visible desktop file (e.g. not "preferred-web-browser.desktop").
            grep -Eq "^(NoDisplay|Hidden)=true" "$file" && continue
            command="`grep -E "^Exec(\[[^]=]*])?=" "$file" | cut -d= -f 2- | first_word`"
            command="`which "$command"`"
            if [ x"`readlink -f "$command"`" = x"$binary" ]; then
                # Fix any double slashes that got added path composition
                echo "$file" | sed -e 's,//*,/,g'
                return
            fi
        done
    done
}

#-------------------------------------------------------------
# map a .desktop file to a binary
desktop_file_to_binary()
{
    search="${XDG_DATA_HOME:-$HOME/.local/share}:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}"
    desktop="`basename "$1"`"
    IFS=:
    for dir in $search; do
        unset IFS
        [ "$dir" ] && [ -d "$dir/applications" ] || [ -d "$dir/applnk" ] || continue
        # Check if desktop file contains -
        if [ "${desktop#*-}" != "$desktop" ]; then
            vendor=${desktop%-*}
            app=${desktop#*-}
            if [ -r $dir/applications/$vendor/$app ]; then
                file_path=$dir/applications/$vendor/$app
            elif [ -r $dir/applnk/$vendor/$app ]; then
                file_path=$dir/applnk/$vendor/$app
            fi
        fi
        if test -z "$file_path" ; then
            for indir in "$dir"/applications/ "$dir"/applications/*/ "$dir"/applnk/ "$dir"/applnk/*/; do
                file="$indir/$desktop"
                if [ -r "$file" ]; then
                    file_path=$file
                    break
                fi
            done
        fi
        if [ -r "$file_path" ]; then
            # Remove any arguments (%F, %f, %U, %u, etc.).
            command="`grep -E "^Exec(\[[^]=]*])?=" "$file_path" | cut -d= -f 2- | first_word`"
            command="`which "$command"`"
            readlink -f "$command"
            return
        fi
    done
}

#-------------------------------------------------------------
# Exit script on successfully completing the desired operation

exit_success()
{
    if [ $# -gt 0 ]; then
        echo "$@"
        echo
    fi

    exit 0
}


#-----------------------------------------
# Exit script on malformed arguments, not enough arguments
# or missing required option.
# prints usage information

exit_failure_syntax()
{
    if [ $# -gt 0 ]; then
        echo "xdg-open: $@" >&2
        echo "Try 'xdg-open --help' for more information." >&2
    else
        usage
        echo "Use 'man xdg-open' or 'xdg-open --manual' for additional info."
    fi

    exit 1
}

#-------------------------------------------------------------
# Exit script on missing file specified on command line

exit_failure_file_missing()
{
    if [ $# -gt 0 ]; then
        echo "xdg-open: $@" >&2
    fi

    exit 2
}

#-------------------------------------------------------------
# Exit script on failure to locate necessary tool applications

exit_failure_operation_impossible()
{
    if [ $# -gt 0 ]; then
        echo "xdg-open: $@" >&2
    fi

    exit 3
}

#-------------------------------------------------------------
# Exit script on failure returned by a tool application

exit_failure_operation_failed()
{
    if [ $# -gt 0 ]; then
        echo "xdg-open: $@" >&2
    fi

    exit 4
}

#------------------------------------------------------------
# Exit script on insufficient permission to read a specified file

exit_failure_file_permission_read()
{
    if [ $# -gt 0 ]; then
        echo "xdg-open: $@" >&2
    fi

    exit 5
}

#------------------------------------------------------------
# Exit script on insufficient permission to write a specified file

exit_failure_file_permission_write()
{
    if [ $# -gt 0 ]; then
        echo "xdg-open: $@" >&2
    fi

    exit 6
}

check_input_file()
{
    if [ ! -e "$1" ]; then
        exit_failure_file_missing "file '$1' does not exist"
    fi
    if [ ! -r "$1" ]; then
        exit_failure_file_permission_read "no permission to read file '$1'"
    fi
}

check_vendor_prefix()
{
    file_label="$2"
    [ -n "$file_label" ] || file_label="filename"
    file=`basename "$1"`
    case "$file" in
       [[:alpha:]]*-*)
         return
         ;;
    esac

    echo "xdg-open: $file_label '$file' does not have a proper vendor prefix" >&2
    echo 'A vendor prefix consists of alpha characters ([a-zA-Z]) and is terminated' >&2
    echo 'with a dash ("-"). An example '"$file_label"' is '"'example-$file'" >&2
    echo "Use --novendor to override or 'xdg-open --manual' for additional info." >&2
    exit 1
}

check_output_file()
{
    # if the file exists, check if it is writeable
    # if it does not exists, check if we are allowed to write on the directory
    if [ -e "$1" ]; then
        if [ ! -w "$1" ]; then
            exit_failure_file_permission_write "no permission to write to file '$1'"
        fi
    else
        DIR=`dirname "$1"`
        if [ ! -w "$DIR" ] || [ ! -x "$DIR" ]; then
            exit_failure_file_permission_write "no permission to create file '$1'"
        fi
    fi
}

#----------------------------------------
# Checks for shared commands, e.g. --help

check_common_commands()
{
    while [ $# -gt 0 ] ; do
        parm="$1"
        shift

        case "$parm" in
            --help)
            usage
            echo "Use 'man xdg-open' or 'xdg-open --manual' for additional info."
            exit_success
            ;;

            --manual)
            manualpage
            exit_success
            ;;

            --version)
            echo "xdg-open 1.1.3"
            exit_success
            ;;
        esac
    done
}

check_common_commands "$@"

[ -z "${XDG_UTILS_DEBUG_LEVEL}" ] && unset XDG_UTILS_DEBUG_LEVEL;
if [ ${XDG_UTILS_DEBUG_LEVEL-0} -lt 1 ]; then
    # Be silent
    xdg_redirect_output=" > /dev/null 2> /dev/null"
else
    # All output to stderr
    xdg_redirect_output=" >&2"
fi

#--------------------------------------
# Checks for known desktop environments
# set variable DE to the desktop environments name, lowercase

detectDE()
{
    # see https://bugs.freedesktop.org/show_bug.cgi?id=34164
    unset GREP_OPTIONS

    if [ -n "${XDG_CURRENT_DESKTOP}" ]; then
      case "${XDG_CURRENT_DESKTOP}" in
         # only recently added to menu-spec, pre-spec X- still in use
         Cinnamon|X-Cinnamon)
           DE=cinnamon;
           ;;
         ENLIGHTENMENT)
           DE=enlightenment;
           ;;
         # GNOME, GNOME-Classic:GNOME, or GNOME-Flashback:GNOME
         GNOME*)
           DE=gnome;
           ;;
         KDE)
           DE=kde;
           ;;
         # Deepin Desktop Environments
         DEEPIN|Deepin|deepin)
           DE=dde;
           ;;
         LXDE)
           DE=lxde;
           ;;
         LXQt)
           DE=lxqt;
           ;;
         MATE)
           DE=mate;
           ;;
         XFCE)
           DE=xfce
           ;;
         X-Generic)
           DE=generic
           ;;
      esac
    fi

    if [ x"$DE" = x"" ]; then
      # classic fallbacks
      if [ x"$KDE_FULL_SESSION" != x"" ]; then DE=kde;
      elif [ x"$GNOME_DESKTOP_SESSION_ID" != x"" ]; then DE=gnome;
      elif [ x"$MATE_DESKTOP_SESSION_ID" != x"" ]; then DE=mate;
      elif `dbus-send --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.GetNameOwner string:org.gnome.SessionManager > /dev/null 2>&1` ; then DE=gnome;
      elif xprop -root _DT_SAVE_MODE 2> /dev/null | grep ' = \"xfce4\"$' >/dev/null 2>&1; then DE=xfce;
      elif xprop -root 2> /dev/null | grep -i '^xfce_desktop_window' >/dev/null 2>&1; then DE=xfce
      elif echo $DESKTOP | grep -q '^Enlightenment'; then DE=enlightenment;
      elif [ x"$LXQT_SESSION_CONFIG" != x"" ]; then DE=lxqt;
      fi
    fi

    if [ x"$DE" = x"" ]; then
      # fallback to checking $DESKTOP_SESSION
      case "$DESKTOP_SESSION" in
         gnome)
           DE=gnome;
           ;;
         LXDE|Lubuntu)
           DE=lxde; 
           ;;
         MATE)
           DE=mate;
           ;;
         xfce|xfce4|'Xfce Session')
           DE=xfce;
           ;;
      esac
    fi

    if [ x"$DE" = x"" ]; then
      # fallback to uname output for other platforms
      case "$(uname 2>/dev/null)" in 
        CYGWIN*)
          DE=cygwin;
          ;;
        Darwin)
          DE=darwin;
          ;;
      esac
    fi

    if [ x"$DE" = x"gnome" ]; then
      # gnome-default-applications-properties is only available in GNOME 2.x
      # but not in GNOME 3.x
      which gnome-default-applications-properties > /dev/null 2>&1  || DE="gnome3"
    fi

    if [ -f "$XDG_RUNTIME_DIR/flatpak-info" ]; then
      DE="flatpak"
    fi
}

#----------------------------------------------------------------------------
# kfmclient exec/openURL can give bogus exit value in KDE <= 3.5.4
# It also always returns 1 in KDE 3.4 and earlier
# Simply return 0 in such case

kfmclient_fix_exit_code()
{
    version=`LC_ALL=C.UTF-8 kde-config --version 2>/dev/null | grep '^KDE'`
    major=`echo $version | sed 's/KDE.*: \([0-9]\).*/\1/'`
    minor=`echo $version | sed 's/KDE.*: [0-9]*\.\([0-9]\).*/\1/'`
    release=`echo $version | sed 's/KDE.*: [0-9]*\.[0-9]*\.\([0-9]\).*/\1/'`
    test "$major" -gt 3 && return $1
    test "$minor" -gt 5 && return $1
    test "$release" -gt 4 && return $1
    return 0
}

#----------------------------------------------------------------------------
# Returns true if there is a graphical display attached.

has_display()
{
    if [ -n "$DISPLAY" ] || [ -n "$WAYLAND_DISPLAY" ]; then
        return 0
    else
        return 1
    fi
}

# This handles backslashes but not quote marks.
last_word()
{
    read first rest
    echo "$rest"
}

# Get the value of a key in a desktop file's Desktop Entry group.
# Example: Use get_key foo.desktop Exec
# to get the values of the Exec= key for the Desktop Entry group.
get_key()
{
    local file="${1}"
    local key="${2}"
    local desktop_entry=""

    IFS_="${IFS}"
    IFS=""
    while read line
    do
        case "$line" in
            "[Desktop Entry]")
                desktop_entry="y"
            ;;
            # Reset match flag for other groups
            "["*)
                desktop_entry=""
            ;;
            "${key}="*)
                # Only match Desktop Entry group
                if [ -n "${desktop_entry}" ]
                then
                    echo "${line}" | cut -d= -f 2-
                fi
        esac
    done < "${file}"
    IFS="${IFS_}"
}

# Returns true if argument is a file:// URL or path
is_file_url_or_path()
{
    if echo "$1" | grep -q '^file://' \
            || ! echo "$1" | egrep -q '^[[:alpha:]+\.\-]+:'; then
        return 0
    else
        return 1
    fi
}

# If argument is a file URL, convert it to a (percent-decoded) path.
# If not, leave it as it is.
file_url_to_path()
{
    local file="$1"
    if echo "$file" | grep -q '^file:///'; then
        file=${file#file://}
        file=${file%%#*}
        file=$(echo "$file" | sed -r 's/\?.*$//')
        local printf=printf
        if [ -x /usr/bin/printf ]; then
            printf=/usr/bin/printf
        fi
        file=$($printf "$(echo "$file" | sed -e 's@%\([a-f0-9A-F]\{2\}\)@\\x\1@g')")
    fi
    echo "$file"
}

open_cygwin()
{
    cygstart "$1"

    if [ $? -eq 0 ]; then
        exit_success
    else
        exit_failure_operation_failed
    fi
}

open_darwin()
{
    open "$1"

    if [ $? -eq 0 ]; then
        exit_success
    else
        exit_failure_operation_failed
    fi
}

open_kde()
{
    if [ -n "${KDE_SESSION_VERSION}" ]; then
      case "${KDE_SESSION_VERSION}" in
        4)
          kde-open "$1"
        ;;
        5)
          kde-open${KDE_SESSION_VERSION} "$1"
        ;;
      esac
    else
        kfmclient exec "$1"
        kfmclient_fix_exit_code $?
    fi

    if [ $? -eq 0 ]; then
        exit_success
    else
        exit_failure_operation_failed
    fi
}

open_dde()
{
    if dde-open -version >/dev/null 2>&1; then
        dde-open "$1"
    else
        open_generic "$1"
    fi

    if [ $? -eq 0 ]; then
        exit_success
    else
        exit_failure_operation_failed
    fi
}

open_gnome3()
{
    if gio help open 2>/dev/null 1>&2; then
        gio open "$1"
    elif gvfs-open --help 2>/dev/null 1>&2; then
        gvfs-open "$1"
    else
        open_generic "$1"
    fi

    if [ $? -eq 0 ]; then
        exit_success
    else
        exit_failure_operation_failed
    fi
}

open_gnome()
{
    if gio help open 2>/dev/null 1>&2; then
        gio open "$1"
    elif gvfs-open --help 2>/dev/null 1>&2; then
        gvfs-open "$1"
    elif gnome-open --help 2>/dev/null 1>&2; then
        gnome-open "$1"
    else
        open_generic "$1"
    fi

    if [ $? -eq 0 ]; then
        exit_success
    else
        exit_failure_operation_failed
    fi
}

open_mate()
{
    if gio help open 2>/dev/null 1>&2; then
        gio open "$1"
    elif gvfs-open --help 2>/dev/null 1>&2; then
        gvfs-open "$1"
    elif mate-open --help 2>/dev/null 1>&2; then
        mate-open "$1"
    else
        open_generic "$1"
    fi

    if [ $? -eq 0 ]; then
        exit_success
    else
        exit_failure_operation_failed
    fi
}

open_xfce()
{
    if exo-open --help 2>/dev/null 1>&2; then
        exo-open "$1"
    elif gio help open 2>/dev/null 1>&2; then
        gio open "$1"
    elif gvfs-open --help 2>/dev/null 1>&2; then
        gvfs-open "$1"
    else
        open_generic "$1"
    fi

    if [ $? -eq 0 ]; then
        exit_success
    else
        exit_failure_operation_failed
    fi
}

open_enlightenment()
{
    if enlightenment_open --help 2>/dev/null 1>&2; then
        enlightenment_open "$1"
    else
        open_generic "$1"
    fi

    if [ $? -eq 0 ]; then
        exit_success
    else
        exit_failure_operation_failed
    fi
}

open_flatpak()
{
    gdbus call --session \
        --dest org.freedesktop.portal.Desktop \
        --object-path /org/freedesktop/portal/desktop \
        --method org.freedesktop.portal.OpenURI.OpenURI \
        "" "$1" {}

    if [ $? -eq 0 ]; then
        exit_success
    else
        exit_failure_operation_failed
    fi
}

#-----------------------------------------
# Recursively search .desktop file

search_desktop_file()
{
    local default="$1"
    local dir="$2"
    local target="$3"

    local file=""
    # look for both vendor-app.desktop, vendor/app.desktop
    if [ -r "$dir/$default" ]; then
      file="$dir/$default"
    elif [ -r "$dir/`echo $default | sed -e 's|-|/|'`" ]; then
      file="$dir/`echo $default | sed -e 's|-|/|'`"
    fi

    if [ -r "$file" ] ; then
        command="$(get_key "${file}" "Exec" | first_word)"
        command_exec=`which $command 2>/dev/null`
        icon="$(get_key "${file}" "Icon")"
        # FIXME: Actually LC_MESSAGES should be used as described in
        # http://standards.freedesktop.org/desktop-entry-spec/latest/ar01s04.html
        localised_name="$(get_key "${file}" "Name")"
        set -- $(get_key "${file}" "Exec" | last_word)
        # We need to replace any occurrence of "%f", "%F" and
        # the like by the target file. We examine each
        # argument and append the modified argument to the
        # end then shift.
        local args=$#
        local replaced=0
        while [ $args -gt 0 ]; do
            case $1 in
                %[c])
                    replaced=1
                    arg="${localised_name}"
                    shift
                    set -- "$@" "$arg"
                    ;;
                %[fFuU])
                    replaced=1
                    arg="$target"
                    shift
                    set -- "$@" "$arg"
                    ;;
                %[i])
                    replaced=1
                    shift
                    set -- "$@" "--icon" "$icon"
                    ;;
                *)
                    arg="$1"
                    shift
                    set -- "$@" "$arg"
                    ;;
            esac
            args=$(( $args - 1 ))
        done
        [ $replaced -eq 1 ] || set -- "$@" "$target"
        "$command_exec" "$@"

        if [ $? -eq 0 ]; then
            exit_success
        fi
    fi

    for d in $dir/*/; do
        [ -d "$d" ] && search_desktop_file "$default" "$d" "$target"
    done
}


open_generic_xdg_mime()
{
    filetype="$2"
    default=`xdg-mime query default "$filetype"`
    if [ -n "$default" ] ; then
        xdg_user_dir="$XDG_DATA_HOME"
        [ -n "$xdg_user_dir" ] || xdg_user_dir="$HOME/.local/share"

        xdg_system_dirs="$XDG_DATA_DIRS"
        [ -n "$xdg_system_dirs" ] || xdg_system_dirs=/usr/local/share/:/usr/share/

DEBUG 3 "$xdg_user_dir:$xdg_system_dirs"
        for x in `echo "$xdg_user_dir:$xdg_system_dirs" | sed 's/:/ /g'`; do
            search_desktop_file "$default" "$x/applications/" "$1"
        done
    fi
}

open_generic_xdg_file_mime()
{
    filetype=`xdg-mime query filetype "$1" | sed "s/;.*//"`
    open_generic_xdg_mime "$1" "$filetype"
}

open_generic_xdg_x_scheme_handler()
{
    scheme="`echo $1 | sed -n 's/\(^[[:alnum:]+\.-]*\):.*$/\1/p'`"
    if [ -n $scheme ]; then
        filetype="x-scheme-handler/$scheme"
        open_generic_xdg_mime "$1" "$filetype"
    fi
}

has_single_argument()
{
  test $# = 1
}

open_envvar()
{
    local oldifs="$IFS"
    local browser browser_with_arg

    IFS=":"
    for browser in $BROWSER; do
        IFS="$oldifs"

        if [ -z "$browser" ]; then
            continue
        fi

        if echo "$browser" | grep -q %s; then
            # Avoid argument injection.
            # See https://bugs.freedesktop.org/show_bug.cgi?id=103807
            # URIs don't have IFS characters spaces anyway.
            has_single_argument $1 && $(printf "$browser" "$1")
        else
            $browser "$1"
        fi

        if [ $? -eq 0 ]; then
            exit_success
        fi
    done
}

open_generic()
{
    if is_file_url_or_path "$1"; then
        local file="$(file_url_to_path "$1")"

        check_input_file "$file"

        if has_display; then
            filetype=`xdg-mime query filetype "$file" | sed "s/;.*//"`
            open_generic_xdg_mime "$file" "$filetype"
        fi

        if which run-mailcap 2>/dev/null 1>&2; then
            run-mailcap --action=view "$file"
            if [ $? -eq 0 ]; then
                exit_success
            fi
        fi

        if has_display && mimeopen -v 2>/dev/null 1>&2; then
            mimeopen -L -n "$file"
            if [ $? -eq 0 ]; then
                exit_success
            fi
        fi
    fi

    if has_display; then
        open_generic_xdg_x_scheme_handler "$1"
    fi

    if [ -n "$BROWSER" ]; then
        open_envvar "$1"
    fi

    # if BROWSER variable is not set, check some well known browsers instead
    if [ x"$BROWSER" = x"" ]; then
        BROWSER=www-browser:links2:elinks:links:lynx:w3m
        if has_display; then
            BROWSER=x-www-browser:firefox:iceweasel:seamonkey:mozilla:epiphany:konqueror:chromium:chromium-browser:google-chrome:microsoft-edge:$BROWSER
        fi
    fi

    open_envvar "$1"

    exit_failure_operation_impossible "no method available for opening '$1'"
}

open_lxde()
{

    # pcmanfm only knows how to handle file:// urls and filepaths, it seems.
    if pcmanfm --help >/dev/null 2>&1 && is_file_url_or_path "$1"; then
        local file="$(file_url_to_path "$1")"

        # handle relative paths
        if ! echo "$file" | grep -q ^/; then
            file="$(pwd)/$file"
        fi

        pcmanfm "$file"
    else
        open_generic "$1"
    fi

    if [ $? -eq 0 ]; then
        exit_success
    else
        exit_failure_operation_failed
    fi
}

open_lxqt()
{
    open_generic "$1"
}

[ x"$1" != x"" ] || exit_failure_syntax

url=
while [ $# -gt 0 ] ; do
    parm="$1"
    shift

    case "$parm" in
      -*)
        exit_failure_syntax "unexpected option '$parm'"
        ;;

      *)
        if [ -n "$url" ] ; then
            exit_failure_syntax "unexpected argument '$parm'"
        fi
        url="$parm"
        ;;
    esac
done

if [ -z "${url}" ] ; then
    exit_failure_syntax "file or URL argument missing"
fi

detectDE

if [ x"$DE" = x"" ]; then
    DE=generic
fi

DEBUG 2 "Selected DE $DE"

# sanitize BROWSER (avoid caling ourselves in particular)
case "${BROWSER}" in
    *:"xdg-open"|"xdg-open":*)
        BROWSER=$(echo $BROWSER | sed -e 's|:xdg-open||g' -e 's|xdg-open:||g')
        ;;
    "xdg-open")
        BROWSER=
        ;;
esac

case "$DE" in
    kde)
    open_kde "$url"
    ;;

    dde)
    open_dde "$url"
    ;;

    gnome3|cinnamon)
    open_gnome3 "$url"
    ;;

    gnome)
    open_gnome "$url"
    ;;

    mate)
    open_mate "$url"
    ;;

    xfce)
    open_xfce "$url"
    ;;

    lxde)
    open_lxde "$url"
    ;;

    lxqt)
    open_lxqt "$url"
    ;;

    enlightenment)
    open_enlightenment "$url"
    ;;

    cygwin)
    open_cygwin "$url"
    ;;

    darwin)
    open_darwin "$url"
    ;;

    flatpak)
    open_flatpak "$url"
    ;;

    generic)
    open_generic "$url"
    ;;

    *)
    exit_failure_operation_impossible "no method available for opening '$url'"
    ;;
esac
'use strict';
const AggregateError = require('aggregate-error');

module.exports = async (
	iterable,
	mapper,
	{
		concurrency = Infinity,
		stopOnError = true
	} = {}
) => {
	return new Promise((resolve, reject) => {
		if (typeof mapper !== 'function') {
			throw new TypeError('Mapper function is required');
		}

		if (!((Number.isSafeInteger(concurrency) || concurrency === Infinity) && concurrency >= 1)) {
			throw new TypeError(`Expected \`concurrency\` to be an integer from 1 and up or \`Infinity\`, got \`${concurrency}\` (${typeof concurrency})`);
		}

		const result = [];
		const errors = [];
		const iterator = iterable[Symbol.iterator]();
		let isRejected = false;
		let isIterableDone = false;
		let resolvingCount = 0;
		let currentIndex = 0;

		const next = () => {
			if (isRejected) {
				return;
			}

			const nextItem = iterator.next();
			const index = currentIndex;
			currentIndex++;

			if (nextItem.done) {
				isIterableDone = true;

				if (resolvingCount === 0) {
					if (!stopOnError && errors.length !== 0) {
						reject(new AggregateError(errors));
					} else {
						resolve(result);
					}
				}

				return;
			}

			resolvingCount++;

			(async () => {
				try {
					const element = await nextItem.value;
					result[index] = await mapper(element, index);
					resolvingCount--;
					next();
				} catch (error) {
					if (stopOnError) {
						isRejected = true;
						reject(error);
					} else {
						errors.push(error);
						resolvingCount--;
						next();
					}
				}
			})();
		};

		for (let i = 0; i < concurrency; i++) {
			next();

			if (isIterableDone) {
				break;
			}
		}
	});
};
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": "p-map",
  "version": "4.0.0",
  "description": "Map over promises concurrently",
  "license": "MIT",
  "repository": "sindresorhus/p-map",
  "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": {
    "aggregate-error": "^3.0.0"
  },
  "devDependencies": {
    "ava": "^2.2.0",
    "delay": "^4.1.0",
    "in-range": "^2.0.0",
    "random-int": "^2.0.0",
    "time-span": "^3.1.0",
    "tsd": "^0.7.4",
    "xo": "^0.27.2"
  }
}1.3.3 / 2019-04-15
==================

  * Fix Node.js 0.8 return value inconsistencies

1.3.2 / 2017-09-09
==================

  * perf: reduce overhead for full URLs
  * perf: unroll the "fast-path" `RegExp`

1.3.1 / 2016-01-17
==================

  * perf: enable strict mode

1.3.0 / 2014-08-09
==================

  * Add `parseurl.original` for parsing `req.originalUrl` with fallback
  * Return `undefined` if `req.url` is `undefined`

1.2.0 / 2014-07-21
==================

  * Cache URLs based on original value
  * Remove no-longer-needed URL mis-parse work-around
  * Simplify the "fast-path" `RegExp`

1.1.3 / 2014-07-08
==================

  * Fix typo

1.1.2 / 2014-07-08
==================

  * Seriously fix Node.js 0.8 compatibility

1.1.1 / 2014-07-08
==================

  * Fix Node.js 0.8 compatibility

1.1.0 / 2014-07-08
==================

  * Incorporate URL href-only parse fast-path

1.0.1 / 2014-03-08
==================

  * Add missing `require`

1.0.0 / 2014-03-08
==================

  * Genesis from `connect`

(The MIT License)

Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
Copyright (c) 2014-2017 Douglas Christopher Wilson <doug@somethingdoug.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.
/*!
 * parseurl
 * Copyright(c) 2014 Jonathan Ong
 * Copyright(c) 2014-2017 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module dependencies.
 * @private
 */

var url = require('url')
var parse = url.parse
var Url = url.Url

/**
 * Module exports.
 * @public
 */

module.exports = parseurl
module.exports.original = originalurl

/**
 * Parse the `req` url with memoization.
 *
 * @param {ServerRequest} req
 * @return {Object}
 * @public
 */

function parseurl (req) {
  var url = req.url

  if (url === undefined) {
    // URL is undefined
    return undefined
  }

  var parsed = req._parsedUrl

  if (fresh(url, parsed)) {
    // Return cached URL parse
    return parsed
  }

  // Parse the URL
  parsed = fastparse(url)
  parsed._raw = url

  return (req._parsedUrl = parsed)
};

/**
 * Parse the `req` original url with fallback and memoization.
 *
 * @param {ServerRequest} req
 * @return {Object}
 * @public
 */

function originalurl (req) {
  var url = req.originalUrl

  if (typeof url !== 'string') {
    // Fallback
    return parseurl(req)
  }

  var parsed = req._parsedOriginalUrl

  if (fresh(url, parsed)) {
    // Return cached URL parse
    return parsed
  }

  // Parse the URL
  parsed = fastparse(url)
  parsed._raw = url

  return (req._parsedOriginalUrl = parsed)
};

/**
 * Parse the `str` url with fast-path short-cut.
 *
 * @param {string} str
 * @return {Object}
 * @private
 */

function fastparse (str) {
  if (typeof str !== 'string' || str.charCodeAt(0) !== 0x2f /* / */) {
    return parse(str)
  }

  var pathname = str
  var query = null
  var search = null

  // This takes the regexp from https://github.com/joyent/node/pull/7878
  // Which is /^(\/[^?#\s]*)(\?[^#\s]*)?$/
  // And unrolls it into a for loop
  for (var i = 1; i < str.length; i++) {
    switch (str.charCodeAt(i)) {
      case 0x3f: /* ?  */
        if (search === null) {
          pathname = str.substring(0, i)
          query = str.substring(i + 1)
          search = str.substring(i)
        }
        break
      case 0x09: /* \t */
      case 0x0a: /* \n */
      case 0x0c: /* \f */
      case 0x0d: /* \r */
      case 0x20: /*    */
      case 0x23: /* #  */
      case 0xa0:
      case 0xfeff:
        return parse(str)
    }
  }

  var url = Url !== undefined
    ? new Url()
    : {}

  url.path = str
  url.href = str
  url.pathname = pathname

  if (search !== null) {
    url.query = query
    url.search = search
  }

  return url
}

/**
 * Determine if parsed is still fresh for url.
 *
 * @param {string} url
 * @param {object} parsedUrl
 * @return {boolean}
 * @private
 */

function fresh (url, parsedUrl) {
  return typeof parsedUrl === 'object' &&
    parsedUrl !== null &&
    (Url === undefined || parsedUrl instanceof Url) &&
    parsedUrl._raw === url
}
{
  "name": "parseurl",
  "description": "parse a url with memoization",
  "version": "1.3.3",
  "repository": "pillarjs/parseurl",
  "license": "MIT",
  "devDependencies": {
    "beautify-benchmark": "0.2.4",
    "benchmark": "2.1.4",
    "eslint": "5.16.0",
    "eslint-config-standard": "12.0.0",
    "eslint-plugin-import": "2.17.1",
    "eslint-plugin-node": "7.0.1",
    "eslint-plugin-promise": "4.1.1",
    "eslint-plugin-standard": "4.0.0",
    "fast-url-parser": "1.1.3",
    "istanbul": "0.4.5",
    "mocha": "6.1.3"
  },
  "files": [
    "LICENSE",
    "HISTORY.md",
    "README.md",
    "index.js"
  ],
  "engines": {
    "node": ">= 0.8"
  }
}'use strict';

function posix(path) {
	return path.charAt(0) === '/';
}

function win32(path) {
	// https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56
	var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/;
	var result = splitDeviceRe.exec(path);
	var device = result[1] || '';
	var isUnc = Boolean(device && device.charAt(1) !== ':');

	// UNC paths are always absolute
	return Boolean(result[2] || isUnc);
}

module.exports = process.platform === 'win32' ? win32 : posix;
module.exports.posix = posix;
module.exports.win32 = win32;
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-is-absolute",
  "version": "1.0.1",
  "description": "Node.js 0.12 path.isAbsolute() ponyfill",
  "license": "MIT",
  "repository": "sindresorhus/path-is-absolute",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "devDependencies": {
    "xo": "^0.16.0"
  }
}0.1.7 / 2015-07-28
==================

  * Fixed regression with escaped round brackets and matching groups.

0.1.6 / 2015-06-19
==================

  * Replace `index` feature by outputting all parameters, unnamed and named.

0.1.5 / 2015-05-08
==================

  * Add an index property for position in match result.

0.1.4 / 2015-03-05
==================

  * Add license information

0.1.3 / 2014-07-06
==================

  * Better array support
  * Improved support for trailing slash in non-ending mode

0.1.0 / 2014-03-06
==================

  * add options.end

0.0.2 / 2013-02-10
==================

  * Update to match current express
  * add .license property to component.json
The MIT License (MIT)

Copyright (c) 2014 Blake Embrey (hello@blakeembrey.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.
/**
 * Expose `pathtoRegexp`.
 */

module.exports = pathtoRegexp;

/**
 * Match matching groups in a regular expression.
 */
var MATCHING_GROUP_REGEXP = /\((?!\?)/g;

/**
 * Normalize the given path string,
 * returning a regular expression.
 *
 * An empty array should be passed,
 * which will contain the placeholder
 * key names. For example "/user/:id" will
 * then contain ["id"].
 *
 * @param  {String|RegExp|Array} path
 * @param  {Array} keys
 * @param  {Object} options
 * @return {RegExp}
 * @api private
 */

function pathtoRegexp(path, keys, options) {
  options = options || {};
  keys = keys || [];
  var strict = options.strict;
  var end = options.end !== false;
  var flags = options.sensitive ? '' : 'i';
  var extraOffset = 0;
  var keysOffset = keys.length;
  var i = 0;
  var name = 0;
  var m;

  if (path instanceof RegExp) {
    while (m = MATCHING_GROUP_REGEXP.exec(path.source)) {
      keys.push({
        name: name++,
        optional: false,
        offset: m.index
      });
    }

    return path;
  }

  if (Array.isArray(path)) {
    // Map array parts into regexps and return their source. We also pass
    // the same keys and options instance into every generation to get
    // consistent matching groups before we join the sources together.
    path = path.map(function (value) {
      return pathtoRegexp(value, keys, options).source;
    });

    return new RegExp('(?:' + path.join('|') + ')', flags);
  }

  path = ('^' + path + (strict ? '' : path[path.length - 1] === '/' ? '?' : '/?'))
    .replace(/\/\(/g, '/(?:')
    .replace(/([\/\.])/g, '\\$1')
    .replace(/(\\\/)?(\\\.)?:(\w+)(\(.*?\))?(\*)?(\?)?/g, function (match, slash, format, key, capture, star, optional, offset) {
      slash = slash || '';
      format = format || '';
      capture = capture || '([^\\/' + format + ']+?)';
      optional = optional || '';

      keys.push({
        name: key,
        optional: !!optional,
        offset: offset + extraOffset
      });

      var result = ''
        + (optional ? '' : slash)
        + '(?:'
        + format + (optional ? slash : '') + capture
        + (star ? '((?:[\\/' + format + '].+?)?)' : '')
        + ')'
        + optional;

      extraOffset += result.length - match.length;

      return result;
    })
    .replace(/\*/g, function (star, index) {
      var len = keys.length

      while (len-- > keysOffset && keys[len].offset > index) {
        keys[len].offset += 3; // Replacement length minus asterisk length.
      }

      return '(.*)';
    });

  // This is a workaround for handling unnamed matching groups.
  while (m = MATCHING_GROUP_REGEXP.exec(path)) {
    var escapeCount = 0;
    var index = m.index;

    while (path.charAt(--index) === '\\') {
      escapeCount++;
    }

    // It's possible to escape the bracket.
    if (escapeCount % 2 === 1) {
      continue;
    }

    if (keysOffset + i === keys.length || keys[keysOffset + i].offset > m.index) {
      keys.splice(keysOffset + i, 0, {
        name: name++, // Unnamed matching groups must be consistently linear.
        optional: false,
        offset: m.index
      });
    }

    i++;
  }

  // If the path is non-ending, match until the end or a slash.
  path += (end ? '$' : (path[path.length - 1] === '/' ? '' : '(?=\\/|$)'));

  return new RegExp(path, flags);
};
{
  "name": "path-to-regexp",
  "description": "Express style path to RegExp utility",
  "version": "0.1.7",
  "files": [
    "index.js",
    "LICENSE"
  ],
  "component": {
    "scripts": {
      "path-to-regexp": "index.js"
    }
  },
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/component/path-to-regexp.git"
  },
  "devDependencies": {
    "mocha": "^1.17.1",
    "istanbul": "^0.2.6"
  }
}The MIT License (MIT)

Copyright (c) 2014 Iced Development

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 url = require('url')
var fs = require('fs')

//Parse method copied from https://github.com/brianc/node-postgres
//Copyright (c) 2010-2014 Brian Carlson (brian.m.carlson@gmail.com)
//MIT License

//parses a connection string
function parse(str) {
  //unix socket
  if (str.charAt(0) === '/') {
    var config = str.split(' ')
    return { host: config[0], database: config[1] }
  }

  // url parse expects spaces encoded as %20
  var result = url.parse(
    / |%[^a-f0-9]|%[a-f0-9][^a-f0-9]/i.test(str) ? encodeURI(str).replace(/\%25(\d\d)/g, '%$1') : str,
    true
  )
  var config = result.query
  for (var k in config) {
    if (Array.isArray(config[k])) {
      config[k] = config[k][config[k].length - 1]
    }
  }

  var auth = (result.auth || ':').split(':')
  config.user = auth[0]
  config.password = auth.splice(1).join(':')

  config.port = result.port
  if (result.protocol == 'socket:') {
    config.host = decodeURI(result.pathname)
    config.database = result.query.db
    config.client_encoding = result.query.encoding
    return config
  }
  if (!config.host) {
    // Only set the host if there is no equivalent query param.
    config.host = result.hostname
  }

  // If the host is missing it might be a URL-encoded path to a socket.
  var pathname = result.pathname
  if (!config.host && pathname && /^%2f/i.test(pathname)) {
    var pathnameSplit = pathname.split('/')
    config.host = decodeURIComponent(pathnameSplit[0])
    pathname = pathnameSplit.splice(1).join('/')
  }
  // result.pathname is not always guaranteed to have a '/' prefix (e.g. relative urls)
  // only strip the slash if it is present.
  if (pathname && pathname.charAt(0) === '/') {
    pathname = pathname.slice(1) || null
  }
  config.database = pathname && decodeURI(pathname)

  if (config.ssl === 'true' || config.ssl === '1') {
    config.ssl = true
  }

  if (config.ssl === '0') {
    config.ssl = false
  }

  if (config.sslcert || config.sslkey || config.sslrootcert || config.sslmode) {
    config.ssl = {}
  }

  if (config.sslcert) {
    config.ssl.cert = fs.readFileSync(config.sslcert).toString()
  }

  if (config.sslkey) {
    config.ssl.key = fs.readFileSync(config.sslkey).toString()
  }

  if (config.sslrootcert) {
    config.ssl.ca = fs.readFileSync(config.sslrootcert).toString()
  }

  switch (config.sslmode) {
    case 'disable': {
      config.ssl = false
      break
    }
    case 'prefer':
    case 'require':
    case 'verify-ca':
    case 'verify-full': {
      break
    }
    case 'no-verify': {
      config.ssl.rejectUnauthorized = false
      break
    }
  }

  return config
}

module.exports = parse

parse.parse = parse
{
  "name": "pg-connection-string",
  "version": "2.5.0",
  "description": "Functions for dealing with a PostgresSQL connection string",
  "main": "./index.js",
  "types": "./index.d.ts",
  "repository": {
    "type": "git",
    "url": "git://github.com/brianc/node-postgres.git",
    "directory": "packages/pg-connection-string"
  },
  "author": "Blaine Bublitz <blaine@iceddev.com> (http://iceddev.com/)",
  "license": "MIT",
  "homepage": "https://github.com/brianc/node-postgres/tree/master/packages/pg-connection-string",
  "devDependencies": {
    "chai": "^4.1.1",
    "coveralls": "^3.0.4",
    "istanbul": "^0.4.5",
    "mocha": "^7.1.2"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ]
}BSD Zero Clause License (0BSD)

Copyright (c) 2020 Pelle Wessman

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.

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.
'use strict';

const { ErrorWithCause } = require('./lib/error-with-cause'); // linemod-replace-with: export { ErrorWithCause } from './lib/error-with-cause.mjs';

const { // linemod-replace-with: export {
  findCauseByReference,
  getErrorCause,
  messageWithCauses,
  stackWithCauses,
} = require('./lib/helpers'); // linemod-replace-with: } from './lib/helpers.mjs';

module.exports = {      // linemod-remove
  ErrorWithCause,       // linemod-remove
  findCauseByReference, // linemod-remove
  getErrorCause,        // linemod-remove
  stackWithCauses,      // linemod-remove
  messageWithCauses,    // linemod-remove
};                      // linemod-remove
'use strict';

export { ErrorWithCause } from './lib/error-with-cause.mjs';

export {
  findCauseByReference,
  getErrorCause,
  messageWithCauses,
  stackWithCauses,
} from './lib/helpers.mjs';
{
  "name": "pony-cause",
  "version": "2.1.4",
  "description": "Ponyfill and helpers for Error Causes",
  "homepage": "http://github.com/voxpelli/pony-cause",
  "repository": {
    "type": "git",
    "url": "git://github.com/voxpelli/pony-cause.git"
  },
  "main": "index.js",
  "module": "index.mjs",
  "types": "index.d.ts",
  "typesVersions": {
    "~4.6 || ~4.7": {
      "index.d.ts": [
        "compat.d.ts"
      ]
    }
  },
  "exports": {
    "require": "./index.js",
    "import": "./index.mjs"
  },
  "files": [
    "compat.d.ts",
    "index.js",
    "index.mjs",
    "index.d.ts",
    "index.d.ts.map",
    "lib/**/*.js",
    "lib/**/*.mjs",
    "lib/**/*.d.ts",
    "lib/**/*.d.ts.map"
  ],
  "author": "Pelle Wessman <pelle@kodfabrik.se> (http://kodfabrik.se/)",
  "license": "0BSD",
  "engines": {
    "node": ">=12.0.0"
  },
  "devDependencies": {
    "@skypack/package-check": "^0.2.2",
    "@types/chai": "^4.3.3",
    "@types/chai-string": "^1.4.2",
    "@types/mocha": "^9.1.1",
    "@types/node": "^14.18.26",
    "@types/verror": "^1.10.6",
    "@voxpelli/eslint-config": "^15.1.0",
    "@voxpelli/tsconfig": "^4.0.0",
    "c8": "^7.12.0",
    "chai": "^4.3.6",
    "chai-string": "^1.5.0",
    "dependency-check": "^5.0.0-7",
    "eslint": "^8.22.0",
    "eslint-config-standard": "^17.0.0",
    "eslint-plugin-es": "^4.1.0",
    "eslint-plugin-import": "^2.26.0",
    "eslint-plugin-jsdoc": "^39.3.6",
    "eslint-plugin-mocha": "^10.1.0",
    "eslint-plugin-n": "^15.2.5",
    "eslint-plugin-promise": "^6.0.1",
    "eslint-plugin-security": "^1.5.0",
    "eslint-plugin-sort-destructure-keys": "^1.4.0",
    "eslint-plugin-unicorn": "^43.0.2",
    "husky": "^8.0.1",
    "installed-check": "^6.0.4",
    "linemod": "^0.3.0",
    "mocha": "^10.0.0",
    "npm-run-all2": "^6.0.2",
    "type-coverage": "^2.22.0",
    "typescript": "~4.6.0",
    "verror": "^1.10.1"
  }
}'use strict';

/** @template [T=undefined] */
class ErrorWithCause extends Error { // linemod-prefix-with: export
  /**
   * @param {string} message
   * @param {{ cause?: T }} options
   */
  constructor (message, { cause } = {}) {
    super(message);

    /** @type {string} */
    this.name = ErrorWithCause.name;
    if (cause) {
      /** @type {T} */
      this.cause = cause;
    }
    /** @type {string} */
    this.message = message;
  }
}

module.exports = {      // linemod-remove
  ErrorWithCause,       // linemod-remove
};                      // linemod-remove
'use strict';

/** @template [T=undefined] */
export class ErrorWithCause extends Error {
  /**
   * @param {string} message
   * @param {{ cause?: T }} options
   */
  constructor (message, { cause } = {}) {
    super(message);

    /** @type {string} */
    this.name = ErrorWithCause.name;
    if (cause) {
      /** @type {T} */
      this.cause = cause;
    }
    /** @type {string} */
    this.message = message;
  }
}
'use strict';

/**
 * @template {Error} T
 * @param {unknown} err
 * @param {new(...args: any[]) => T} reference
 * @returns {T|undefined}
 */
const findCauseByReference = (err, reference) => { // linemod-prefix-with: export
  if (!err || !reference) return;
  if (!(err instanceof Error)) return;
  if (
    !(reference.prototype instanceof Error) &&
    // @ts-ignore
    reference !== Error
  ) return;

  /**
   * Ensures we don't go circular
   *
   * @type {Set<Error>}
   */
  const seen = new Set();

  /** @type {Error|undefined} */
  let currentErr = err;

  while (currentErr && !seen.has(currentErr)) {
    seen.add(currentErr);

    if (currentErr instanceof reference) {
      // @ts-ignore
      return currentErr;
    }

    currentErr = getErrorCause(currentErr);
  }
};

/**
 * @param {Error|{ cause?: unknown|(()=>err)}} err
 * @returns {Error|undefined}
 */
const getErrorCause = (err) => { // linemod-prefix-with: export
  if (!err) return;

  /** @type {unknown} */
  // @ts-ignore
  const cause = err.cause;

  // VError / NError style causes
  if (typeof cause === 'function') {
    // @ts-ignore
    const causeResult = err.cause();

    return causeResult instanceof Error
      ? causeResult
      : undefined;
  } else {
    return cause instanceof Error
      ? cause
      : undefined;
  }
};

/**
 * Internal method that keeps a track of which error we have already added, to avoid circular recursion
 *
 * @private
 * @param {Error} err
 * @param {Set<Error>} seen
 * @returns {string}
 */
const _stackWithCauses = (err, seen) => {
  if (!(err instanceof Error)) return '';

  const stack = err.stack || '';

  // Ensure we don't go circular or crazily deep
  if (seen.has(err)) {
    return stack + '\ncauses have become circular...';
  }

  const cause = getErrorCause(err);

  // TODO: Follow up in https://github.com/nodejs/node/issues/38725#issuecomment-920309092 on how to log stuff

  if (cause) {
    seen.add(err);
    return (stack + '\ncaused by: ' + _stackWithCauses(cause, seen));
  } else {
    return stack;
  }
};

/**
 * @param {Error} err
 * @returns {string}
 */
const stackWithCauses = (err) => _stackWithCauses(err, new Set()); // linemod-prefix-with: export

/**
 * Internal method that keeps a track of which error we have already added, to avoid circular recursion
 *
 * @private
 * @param {Error} err
 * @param {Set<Error>} seen
 * @param {boolean} [skip]
 * @returns {string}
 */
const _messageWithCauses = (err, seen, skip) => {
  if (!(err instanceof Error)) return '';

  const message = skip ? '' : (err.message || '');

  // Ensure we don't go circular or crazily deep
  if (seen.has(err)) {
    return message + ': ...';
  }

  const cause = getErrorCause(err);

  if (cause) {
    seen.add(err);

    // @ts-ignore
    const skipIfVErrorStyleCause = typeof err.cause === 'function';

    return (message +
      (skipIfVErrorStyleCause ? '' : ': ') +
      _messageWithCauses(cause, seen, skipIfVErrorStyleCause));
  } else {
    return message;
  }
};

/**
 * @param {Error} err
 * @returns {string}
 */
const messageWithCauses = (err) => _messageWithCauses(err, new Set()); // linemod-prefix-with: export

module.exports = {      // linemod-remove
  findCauseByReference, // linemod-remove
  getErrorCause,        // linemod-remove
  stackWithCauses,      // linemod-remove
  messageWithCauses,    // linemod-remove
};                      // linemod-remove
'use strict';

/**
 * @template {Error} T
 * @param {unknown} err
 * @param {new(...args: any[]) => T} reference
 * @returns {T|undefined}
 */
export const findCauseByReference = (err, reference) => {
  if (!err || !reference) return;
  if (!(err instanceof Error)) return;
  if (
    !(reference.prototype instanceof Error) &&
    // @ts-ignore
    reference !== Error
  ) return;

  /**
   * Ensures we don't go circular
   *
   * @type {Set<Error>}
   */
  const seen = new Set();

  /** @type {Error|undefined} */
  let currentErr = err;

  while (currentErr && !seen.has(currentErr)) {
    seen.add(currentErr);

    if (currentErr instanceof reference) {
      // @ts-ignore
      return currentErr;
    }

    currentErr = getErrorCause(currentErr);
  }
};

/**
 * @param {Error|{ cause?: unknown|(()=>err)}} err
 * @returns {Error|undefined}
 */
export const getErrorCause = (err) => {
  if (!err) return;

  /** @type {unknown} */
  // @ts-ignore
  const cause = err.cause;

  // VError / NError style causes
  if (typeof cause === 'function') {
    // @ts-ignore
    const causeResult = err.cause();

    return causeResult instanceof Error
      ? causeResult
      : undefined;
  } else {
    return cause instanceof Error
      ? cause
      : undefined;
  }
};

/**
 * Internal method that keeps a track of which error we have already added, to avoid circular recursion
 *
 * @private
 * @param {Error} err
 * @param {Set<Error>} seen
 * @returns {string}
 */
const _stackWithCauses = (err, seen) => {
  if (!(err instanceof Error)) return '';

  const stack = err.stack || '';

  // Ensure we don't go circular or crazily deep
  if (seen.has(err)) {
    return stack + '\ncauses have become circular...';
  }

  const cause = getErrorCause(err);

  // TODO: Follow up in https://github.com/nodejs/node/issues/38725#issuecomment-920309092 on how to log stuff

  if (cause) {
    seen.add(err);
    return (stack + '\ncaused by: ' + _stackWithCauses(cause, seen));
  } else {
    return stack;
  }
};

/**
 * @param {Error} err
 * @returns {string}
 */
export const stackWithCauses = (err) => _stackWithCauses(err, new Set());

/**
 * Internal method that keeps a track of which error we have already added, to avoid circular recursion
 *
 * @private
 * @param {Error} err
 * @param {Set<Error>} seen
 * @param {boolean} [skip]
 * @returns {string}
 */
const _messageWithCauses = (err, seen, skip) => {
  if (!(err instanceof Error)) return '';

  const message = skip ? '' : (err.message || '');

  // Ensure we don't go circular or crazily deep
  if (seen.has(err)) {
    return message + ': ...';
  }

  const cause = getErrorCause(err);

  if (cause) {
    seen.add(err);

    // @ts-ignore
    const skipIfVErrorStyleCause = typeof err.cause === 'function';

    return (message +
      (skipIfVErrorStyleCause ? '' : ': ') +
      _messageWithCauses(cause, seen, skipIfVErrorStyleCause));
  } else {
    return message;
  }
};

/**
 * @param {Error} err
 * @returns {string}
 */
export const messageWithCauses = (err) => _messageWithCauses(err, new Set());
# Contributing to prebuild

- no commits direct to master
- all commits as pull requests (one or several per PR)
- each commit solves one identifiable problem
- never merge one's own PRs, another contributor does this
The MIT License (MIT)

Copyright (c) 2015 Mathias Buus

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.
const get = require('simple-get')
const util = require('./util')
const proxy = require('./proxy')

function findAssetId (opts, cb) {
  const downloadUrl = util.getDownloadUrl(opts)
  const apiUrl = util.getApiUrl(opts)
  const log = opts.log || util.noopLogger

  log.http('request', 'GET ' + apiUrl)
  const reqOpts = proxy({
    url: apiUrl,
    json: true,
    headers: {
      'User-Agent': 'simple-get',
      Authorization: 'token ' + opts.token
    }
  }, opts)

  const req = get.concat(reqOpts, function (err, res, data) {
    if (err) return cb(err)
    log.http(res.statusCode, apiUrl)
    if (res.statusCode !== 200) return cb(err)

    // Find asset id in release
    for (const release of data) {
      if (release.tag_name === opts['tag-prefix'] + opts.pkg.version) {
        for (const asset of release.assets) {
          if (asset.browser_download_url === downloadUrl) {
            return cb(null, asset.id)
          }
        }
      }
    }

    cb(new Error('Could not find GitHub release for version'))
  })

  req.setTimeout(30 * 1000, function () {
    req.abort()
  })
}

module.exports = findAssetId
#!/usr/bin/env node

const path = require('path')
const fs = require('fs')
const napi = require('napi-build-utils')

const pkg = require(path.resolve('package.json'))
const rc = require('./rc')(pkg)
const log = require('./log')(rc, process.env)
const download = require('./download')
const asset = require('./asset')
const util = require('./util')

const prebuildClientVersion = require('./package.json').version
if (rc.version) {
  console.log(prebuildClientVersion)
  process.exit(0)
}

if (rc.path) process.chdir(rc.path)

if (rc.runtime === 'electron' && rc.target[0] === '4' && rc.abi === '64') {
  log.error(`Electron version ${rc.target} found - skipping prebuild-install work due to known ABI issue`)
  log.error('More information about this issue can be found at https://github.com/lgeiger/node-abi/issues/54')
  process.exit(1)
}

if (!fs.existsSync('package.json')) {
  log.error('setup', 'No package.json found. Aborting...')
  process.exit(1)
}

if (rc.help) {
  console.error(fs.readFileSync(path.join(__dirname, 'help.txt'), 'utf-8'))
  process.exit(0)
}

log.info('begin', 'Prebuild-install version', prebuildClientVersion)

const opts = Object.assign({}, rc, { pkg: pkg, log: log })

if (napi.isNapiRuntime(rc.runtime)) napi.logUnsupportedVersion(rc.target, log)

const origin = util.packageOrigin(process.env, pkg)

if (opts.force) {
  log.warn('install', 'prebuilt binaries enforced with --force!')
  log.warn('install', 'prebuilt binaries may be out of date!')
} else if (origin && origin.length > 4 && origin.substr(0, 4) === 'git+') {
  log.info('install', 'installing from git repository, skipping download.')
  process.exit(1)
} else if (opts.buildFromSource) {
  log.info('install', '--build-from-source specified, not attempting download.')
  process.exit(1)
}

const startDownload = function (downloadUrl) {
  download(downloadUrl, opts, function (err) {
    if (err) {
      log.warn('install', err.message)
      return process.exit(1)
    }
    log.info('install', 'Successfully installed prebuilt binary!')
  })
}

if (opts.token) {
  asset(opts, function (err, assetId) {
    if (err) {
      log.warn('install', err.message)
      return process.exit(1)
    }

    startDownload(util.getAssetUrl(opts, assetId))
  })
} else {
  startDownload(util.getDownloadUrl(opts))
}
const path = require('path')
const fs = require('fs')
const get = require('simple-get')
const pump = require('pump')
const tfs = require('tar-fs')
const zlib = require('zlib')
const util = require('./util')
const error = require('./error')
const proxy = require('./proxy')
const mkdirp = require('mkdirp-classic')

function downloadPrebuild (downloadUrl, opts, cb) {
  let cachedPrebuild = util.cachedPrebuild(downloadUrl)
  const localPrebuild = util.localPrebuild(downloadUrl, opts)
  const tempFile = util.tempFile(cachedPrebuild)
  const log = opts.log || util.noopLogger

  if (opts.nolocal) return download()

  log.info('looking for local prebuild @', localPrebuild)
  fs.access(localPrebuild, fs.R_OK | fs.W_OK, function (err) {
    if (err && err.code === 'ENOENT') {
      return download()
    }

    log.info('found local prebuild')
    cachedPrebuild = localPrebuild
    unpack()
  })

  function download () {
    ensureNpmCacheDir(function (err) {
      if (err) return onerror(err)

      log.info('looking for cached prebuild @', cachedPrebuild)
      fs.access(cachedPrebuild, fs.R_OK | fs.W_OK, function (err) {
        if (!(err && err.code === 'ENOENT')) {
          log.info('found cached prebuild')
          return unpack()
        }

        log.http('request', 'GET ' + downloadUrl)
        const reqOpts = proxy({ url: downloadUrl }, opts)

        if (opts.token) {
          reqOpts.headers = {
            'User-Agent': 'simple-get',
            Accept: 'application/octet-stream',
            Authorization: 'token ' + opts.token
          }
        }

        const req = get(reqOpts, function (err, res) {
          if (err) return onerror(err)
          log.http(res.statusCode, downloadUrl)
          if (res.statusCode !== 200) return onerror()
          mkdirp(util.prebuildCache(), function () {
            log.info('downloading to @', tempFile)
            pump(res, fs.createWriteStream(tempFile), function (err) {
              if (err) return onerror(err)
              fs.rename(tempFile, cachedPrebuild, function (err) {
                if (err) return cb(err)
                log.info('renaming to @', cachedPrebuild)
                unpack()
              })
            })
          })
        })

        req.setTimeout(30 * 1000, function () {
          req.abort()
        })
      })

      function onerror (err) {
        fs.unlink(tempFile, function () {
          cb(err || error.noPrebuilts(opts))
        })
      }
    })
  }

  function unpack () {
    let binaryName

    const updateName = opts.updateName || function (entry) {
      if (/\.node$/i.test(entry.name)) binaryName = entry.name
    }

    log.info('unpacking @', cachedPrebuild)

    const options = {
      readable: true,
      writable: true,
      hardlinkAsFilesFallback: true
    }
    const extract = tfs.extract(opts.path, options).on('entry', updateName)

    pump(fs.createReadStream(cachedPrebuild), zlib.createGunzip(), extract,
      function (err) {
        if (err) return cb(err)

        let resolved
        if (binaryName) {
          try {
            resolved = path.resolve(opts.path || '.', binaryName)
          } catch (err) {
            return cb(err)
          }
          log.info('unpack', 'resolved to ' + resolved)

          if (opts.runtime === 'node' && opts.platform === process.platform && opts.abi === process.versions.modules && opts.arch === process.arch) {
            try {
              require(resolved)
            } catch (err) {
              return cb(err)
            }
            log.info('unpack', 'required ' + resolved + ' successfully')
          }
        }

        cb(null, resolved)
      })
  }

  function ensureNpmCacheDir (cb) {
    const cacheFolder = util.npmCache()
    fs.access(cacheFolder, fs.R_OK | fs.W_OK, function (err) {
      if (err && err.code === 'ENOENT') {
        return makeNpmCacheDir()
      }
      cb(err)
    })

    function makeNpmCacheDir () {
      log.info('npm cache directory missing, creating it...')
      mkdirp(cacheFolder, cb)
    }
  }
}

module.exports = downloadPrebuild
exports.noPrebuilts = function (opts) {
  return new Error([
    'No prebuilt binaries found',
    '(target=' + opts.target,
    'runtime=' + opts.runtime,
    'arch=' + opts.arch,
    'libc=' + opts.libc,
    'platform=' + opts.platform + ')'
  ].join(' '))
}

exports.invalidArchive = function () {
  return new Error('Missing .node file in archive')
}
prebuild-install [options]

  --download    -d  [url]       (download prebuilds, no url means github)
  --target      -t  version     (version to install for)
  --runtime     -r  runtime     (Node runtime [node or electron] to build or install for, default is node)
  --path        -p  path        (make a prebuild-install here)
  --token       -T  gh-token    (github token for private repos)
  --arch            arch        (target CPU architecture, see Node OS module docs, default is current arch)
  --platform        platform    (target platform, see Node OS module docs, default is current platform)
  --tag-prefix <prefix>         (github tag prefix, default is "v")
  --force                       (always use prebuilt binaries when available)
  --build-from-source           (skip prebuild download)
  --verbose                     (log verbosely)
  --libc                        (use provided libc rather than system default)
  --debug                       (set Debug or Release configuration)
  --version                     (print prebuild-install version and exit)
exports.download = require('./download')
const levels = {
  silent: 0,
  error: 1,
  warn: 2,
  notice: 3,
  http: 4,
  timing: 5,
  info: 6,
  verbose: 7,
  silly: 8
}

module.exports = function (rc, env) {
  const level = rc.verbose
    ? 'verbose'
    : env.npm_config_loglevel || 'notice'

  const logAtLevel = function (messageLevel) {
    return function (...args) {
      if (levels[messageLevel] <= levels[level]) {
        console.error(`prebuild-install ${messageLevel} ${args.join(' ')}`)
      }
    }
  }

  return {
    error: logAtLevel('error'),
    warn: logAtLevel('warn'),
    http: logAtLevel('http'),
    info: logAtLevel('info'),
    level
  }
}
{
  "name": "prebuild-install",
  "version": "7.1.1",
  "description": "A command line tool to easily install prebuilt binaries for multiple version of node/iojs on a specific platform",
  "dependencies": {
    "detect-libc": "^2.0.0",
    "expand-template": "^2.0.3",
    "github-from-package": "0.0.0",
    "minimist": "^1.2.3",
    "mkdirp-classic": "^0.5.3",
    "napi-build-utils": "^1.0.1",
    "node-abi": "^3.3.0",
    "pump": "^3.0.0",
    "rc": "^1.2.7",
    "simple-get": "^4.0.0",
    "tar-fs": "^2.0.0",
    "tunnel-agent": "^0.6.0"
  },
  "devDependencies": {
    "a-native-module": "^1.0.0",
    "hallmark": "^4.0.0",
    "nock": "^10.0.6",
    "rimraf": "^2.5.2",
    "standard": "^16.0.4",
    "tape": "^5.3.1",
    "tempy": "0.2.1"
  },
  "bin": "./bin.js",
  "repository": {
    "type": "git",
    "url": "https://github.com/prebuild/prebuild-install.git"
  },
  "author": "Mathias Buus (@mafintosh)",
  "license": "MIT",
  "homepage": "https://github.com/prebuild/prebuild-install",
  "engines": {
    "node": ">=10"
  }
}const url = require('url')
const tunnel = require('tunnel-agent')
const util = require('./util')

function applyProxy (reqOpts, opts) {
  const log = opts.log || util.noopLogger

  const proxy = opts['https-proxy'] || opts.proxy

  if (proxy) {
    // eslint-disable-next-line node/no-deprecated-api
    const parsedDownloadUrl = url.parse(reqOpts.url)
    // eslint-disable-next-line node/no-deprecated-api
    const parsedProxy = url.parse(proxy)
    const uriProtocol = (parsedDownloadUrl.protocol === 'https:' ? 'https' : 'http')
    const proxyProtocol = (parsedProxy.protocol === 'https:' ? 'Https' : 'Http')
    const tunnelFnName = [uriProtocol, proxyProtocol].join('Over')
    reqOpts.agent = tunnel[tunnelFnName]({
      proxy: {
        host: parsedProxy.hostname,
        port: +parsedProxy.port,
        proxyAuth: parsedProxy.auth
      }
    })
    log.http('request', 'Proxy setup detected (Host: ' +
    parsedProxy.hostname + ', Port: ' +
      parsedProxy.port + ', Authentication: ' +
      (parsedProxy.auth ? 'Yes' : 'No') + ')' +
      ' Tunneling with ' + tunnelFnName)
  }

  return reqOpts
}

module.exports = applyProxy
const path = require('path')
const minimist = require('minimist')
const getAbi = require('node-abi').getAbi
const detectLibc = require('detect-libc')
const napi = require('napi-build-utils')

const env = process.env

const libc = env.LIBC || process.env.npm_config_libc ||
  (detectLibc.isNonGlibcLinuxSync() && detectLibc.familySync()) || ''

// Get the configuration
module.exports = function (pkg) {
  const pkgConf = pkg.config || {}
  const buildFromSource = env.npm_config_build_from_source

  const rc = require('rc')('prebuild-install', {
    target: pkgConf.target || env.npm_config_target || process.versions.node,
    runtime: pkgConf.runtime || env.npm_config_runtime || 'node',
    arch: pkgConf.arch || env.npm_config_arch || process.arch,
    libc: libc,
    platform: env.npm_config_platform || process.platform,
    debug: env.npm_config_debug === 'true',
    force: false,
    verbose: env.npm_config_verbose === 'true',
    buildFromSource: buildFromSource === pkg.name || buildFromSource === 'true',
    path: '.',
    proxy: env.npm_config_proxy || env.http_proxy || env.HTTP_PROXY,
    'https-proxy': env.npm_config_https_proxy || env.https_proxy || env.HTTPS_PROXY,
    'local-address': env.npm_config_local_address,
    'local-prebuilds': 'prebuilds',
    'tag-prefix': 'v',
    download: env.npm_config_download
  }, minimist(process.argv, {
    alias: {
      target: 't',
      runtime: 'r',
      help: 'h',
      arch: 'a',
      path: 'p',
      version: 'v',
      download: 'd',
      buildFromSource: 'build-from-source',
      token: 'T'
    }
  }))

  rc.path = path.resolve(rc.path === true ? '.' : rc.path || '.')

  if (napi.isNapiRuntime(rc.runtime) && rc.target === process.versions.node) {
    rc.target = napi.getBestNapiBuildVersion()
  }

  rc.abi = napi.isNapiRuntime(rc.runtime) ? rc.target : getAbi(rc.target, rc.runtime)

  rc.libc = rc.platform !== 'linux' || rc.libc === detectLibc.GLIBC ? '' : rc.libc

  return rc
}

// Print the configuration values when executed standalone for testing purposses
if (!module.parent) {
  console.log(JSON.stringify(module.exports({}), null, 2))
}
const path = require('path')
const github = require('github-from-package')
const home = require('os').homedir
const crypto = require('crypto')
const expandTemplate = require('expand-template')()

function getDownloadUrl (opts) {
  const pkgName = opts.pkg.name.replace(/^@[a-zA-Z0-9_\-.~]+\//, '')
  return expandTemplate(urlTemplate(opts), {
    name: pkgName,
    package_name: pkgName,
    version: opts.pkg.version,
    major: opts.pkg.version.split('.')[0],
    minor: opts.pkg.version.split('.')[1],
    patch: opts.pkg.version.split('.')[2],
    prerelease: opts.pkg.version.split('-')[1],
    build: opts.pkg.version.split('+')[1],
    abi: opts.abi || process.versions.modules,
    node_abi: process.versions.modules,
    runtime: opts.runtime || 'node',
    platform: opts.platform,
    arch: opts.arch,
    libc: opts.libc || '',
    configuration: (opts.debug ? 'Debug' : 'Release'),
    module_name: opts.pkg.binary && opts.pkg.binary.module_name,
    tag_prefix: opts['tag-prefix']
  })
}

function getApiUrl (opts) {
  return github(opts.pkg).replace('github.com', 'api.github.com/repos') + '/releases'
}

function getAssetUrl (opts, assetId) {
  return getApiUrl(opts) + '/assets/' + assetId
}

function urlTemplate (opts) {
  if (typeof opts.download === 'string') {
    return opts.download
  }

  const packageName = '{name}-v{version}-{runtime}-v{abi}-{platform}{libc}-{arch}.tar.gz'
  const hostMirrorUrl = getHostMirrorUrl(opts)

  if (hostMirrorUrl) {
    return hostMirrorUrl + '/{tag_prefix}{version}/' + packageName
  }

  if (opts.pkg.binary && opts.pkg.binary.host) {
    return [
      opts.pkg.binary.host,
      opts.pkg.binary.remote_path,
      opts.pkg.binary.package_name || packageName
    ].map(function (path) {
      return trimSlashes(path)
    }).filter(Boolean).join('/')
  }

  return github(opts.pkg) + '/releases/download/{tag_prefix}{version}/' + packageName
}

function getEnvPrefix (pkgName) {
  return 'npm_config_' + (pkgName || '').replace(/[^a-zA-Z0-9]/g, '_').replace(/^_/, '')
}

function getHostMirrorUrl (opts) {
  const propName = getEnvPrefix(opts.pkg.name) + '_binary_host'
  return process.env[propName] || process.env[propName + '_mirror']
}

function trimSlashes (str) {
  if (str) return str.replace(/^\.\/|^\/|\/$/g, '')
}

function cachedPrebuild (url) {
  const digest = crypto.createHash('md5').update(url).digest('hex').slice(0, 6)
  return path.join(prebuildCache(), digest + '-' + path.basename(url).replace(/[^a-zA-Z0-9.]+/g, '-'))
}

function npmCache () {
  const env = process.env
  return env.npm_config_cache || (env.APPDATA ? path.join(env.APPDATA, 'npm-cache') : path.join(home(), '.npm'))
}

function prebuildCache () {
  return path.join(npmCache(), '_prebuilds')
}

function tempFile (cached) {
  return cached + '.' + process.pid + '-' + Math.random().toString(16).slice(2) + '.tmp'
}

function packageOrigin (env, pkg) {
  // npm <= 6: metadata is stored on disk in node_modules
  if (pkg._from) {
    return pkg._from
  }

  // npm 7: metadata is exposed to environment by arborist
  if (env.npm_package_from) {
    // NOTE: seems undefined atm (npm 7.0.2)
    return env.npm_package_from
  }

  if (env.npm_package_resolved) {
    // NOTE: not sure about the difference with _from, but it's all we have
    return env.npm_package_resolved
  }
}

function localPrebuild (url, opts) {
  const propName = getEnvPrefix(opts.pkg.name) + '_local_prebuilds'
  const prefix = process.env[propName] || opts['local-prebuilds'] || 'prebuilds'
  return path.join(prefix, path.basename(url))
}

const noopLogger = {
  http: function () {},
  silly: function () {},
  debug: function () {},
  info: function () {},
  warn: function () {},
  error: function () {},
  critical: function () {},
  alert: function () {},
  emergency: function () {},
  notice: function () {},
  verbose: function () {},
  fatal: function () {}
}

exports.getDownloadUrl = getDownloadUrl
exports.getApiUrl = getApiUrl
exports.getAssetUrl = getAssetUrl
exports.urlTemplate = urlTemplate
exports.cachedPrebuild = cachedPrebuild
exports.localPrebuild = localPrebuild
exports.prebuildCache = prebuildCache
exports.npmCache = npmCache
exports.tempFile = tempFile
exports.packageOrigin = packageOrigin
exports.noopLogger = noopLogger
(The MIT License)

Copyright (c) 2013 Roman Shtylman <shtylman@gmail.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.
// shim for using process in browser
var process = module.exports = {};

// cached from whatever global is present so that test runners that stub it
// don't break things.  But we need to wrap it in a try catch in case it is
// wrapped in strict mode code which doesn't define any globals.  It's inside a
// function because try/catches deoptimize in certain engines.

var cachedSetTimeout;
var cachedClearTimeout;

function defaultSetTimout() {
    throw new Error('setTimeout has not been defined');
}
function defaultClearTimeout () {
    throw new Error('clearTimeout has not been defined');
}
(function () {
    try {
        if (typeof setTimeout === 'function') {
            cachedSetTimeout = setTimeout;
        } else {
            cachedSetTimeout = defaultSetTimout;
        }
    } catch (e) {
        cachedSetTimeout = defaultSetTimout;
    }
    try {
        if (typeof clearTimeout === 'function') {
            cachedClearTimeout = clearTimeout;
        } else {
            cachedClearTimeout = defaultClearTimeout;
        }
    } catch (e) {
        cachedClearTimeout = defaultClearTimeout;
    }
} ())
function runTimeout(fun) {
    if (cachedSetTimeout === setTimeout) {
        //normal enviroments in sane situations
        return setTimeout(fun, 0);
    }
    // if setTimeout wasn't available but was latter defined
    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
        cachedSetTimeout = setTimeout;
        return setTimeout(fun, 0);
    }
    try {
        // when when somebody has screwed with setTimeout but no I.E. maddness
        return cachedSetTimeout(fun, 0);
    } catch(e){
        try {
            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
            return cachedSetTimeout.call(null, fun, 0);
        } catch(e){
            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
            return cachedSetTimeout.call(this, fun, 0);
        }
    }


}
function runClearTimeout(marker) {
    if (cachedClearTimeout === clearTimeout) {
        //normal enviroments in sane situations
        return clearTimeout(marker);
    }
    // if clearTimeout wasn't available but was latter defined
    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
        cachedClearTimeout = clearTimeout;
        return clearTimeout(marker);
    }
    try {
        // when when somebody has screwed with setTimeout but no I.E. maddness
        return cachedClearTimeout(marker);
    } catch (e){
        try {
            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
            return cachedClearTimeout.call(null, marker);
        } catch (e){
            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
            return cachedClearTimeout.call(this, marker);
        }
    }



}
var queue = [];
var draining = false;
var currentQueue;
var queueIndex = -1;

function cleanUpNextTick() {
    if (!draining || !currentQueue) {
        return;
    }
    draining = false;
    if (currentQueue.length) {
        queue = currentQueue.concat(queue);
    } else {
        queueIndex = -1;
    }
    if (queue.length) {
        drainQueue();
    }
}

function drainQueue() {
    if (draining) {
        return;
    }
    var timeout = runTimeout(cleanUpNextTick);
    draining = true;

    var len = queue.length;
    while(len) {
        currentQueue = queue;
        queue = [];
        while (++queueIndex < len) {
            if (currentQueue) {
                currentQueue[queueIndex].run();
            }
        }
        queueIndex = -1;
        len = queue.length;
    }
    currentQueue = null;
    draining = false;
    runClearTimeout(timeout);
}

process.nextTick = function (fun) {
    var args = new Array(arguments.length - 1);
    if (arguments.length > 1) {
        for (var i = 1; i < arguments.length; i++) {
            args[i - 1] = arguments[i];
        }
    }
    queue.push(new Item(fun, args));
    if (queue.length === 1 && !draining) {
        runTimeout(drainQueue);
    }
};

// v8 likes predictible objects
function Item(fun, array) {
    this.fun = fun;
    this.array = array;
}
Item.prototype.run = function () {
    this.fun.apply(null, this.array);
};
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
process.version = ''; // empty string to avoid regexp issues
process.versions = {};

function noop() {}

process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.prependListener = noop;
process.prependOnceListener = noop;

process.listeners = function (name) { return [] }

process.binding = function (name) {
    throw new Error('process.binding is not supported');
};

process.cwd = function () { return '/' };
process.chdir = function (dir) {
    throw new Error('process.chdir is not supported');
};
process.umask = function() { return 0; };
// for now just expose the builtin process global from node.js
module.exports = global.process;
{
  "author": "Roman Shtylman <shtylman@gmail.com>",
  "name": "process",
  "description": "process information for node.js and browsers",
  "version": "0.11.10",
  "repository": {
    "type": "git",
    "url": "git://github.com/shtylman/node-process.git"
  },
  "license": "MIT",
  "browser": "./browser.js",
  "main": "./index.js",
  "engines": {
    "node": ">= 0.6.0"
  },
  "devDependencies": {
    "mocha": "2.2.1",
    "zuul": "^3.10.3"
  }
}Copyright (c) 2017, Rebecca Turner <me@re-becca.org>

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.

'use strict'
module.exports = inflight

let Bluebird
try {
  Bluebird = require('bluebird')
} catch (_) {
  Bluebird = Promise
}

const active = {}
inflight.active = active
function inflight (unique, doFly) {
  return Bluebird.all([unique, doFly]).then(function (args) {
    const unique = args[0]
    const doFly = args[1]
    if (Array.isArray(unique)) {
      return Bluebird.all(unique).then(function (uniqueArr) {
        return _inflight(uniqueArr.join(''), doFly)
      })
    } else {
      return _inflight(unique, doFly)
    }
  })

  function _inflight (unique, doFly) {
    if (!active[unique]) {
      active[unique] = (new Bluebird(function (resolve) {
        return resolve(doFly())
      }))
      active[unique].then(cleanup, cleanup)
      function cleanup() { delete active[unique] }
    }
    return active[unique]
  }
}
{
  "name": "promise-inflight",
  "version": "1.0.1",
  "description": "One promise for multiple requests in flight to avoid async duplication",
  "main": "inflight.js",
  "files": [
    "inflight.js"
  ],
  "license": "ISC",
  "author": "Rebecca Turner <me@re-becca.org> (http://re-becca.org/)",
  "devDependencies": {},
  "repository": {
    "type": "git",
    "url": "git+https://github.com/iarna/promise-inflight.git"
  },
  "homepage": "https://github.com/iarna/promise-inflight#readme"
}root = true

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

[*.md]
trim_trailing_whitespace = false

[package.json]
indent_size = 2
Copyright (c) 2014 IndigoUnited

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 errcode = require('err-code');
var retry = require('retry');

var hasOwn = Object.prototype.hasOwnProperty;

function isRetryError(err) {
    return err && err.code === 'EPROMISERETRY' && hasOwn.call(err, 'retried');
}

function promiseRetry(fn, options) {
    var temp;
    var operation;

    if (typeof fn === 'object' && typeof options === 'function') {
        // Swap options and fn when using alternate signature (options, fn)
        temp = options;
        options = fn;
        fn = temp;
    }

    operation = retry.operation(options);

    return new Promise(function (resolve, reject) {
        operation.attempt(function (number) {
            Promise.resolve()
            .then(function () {
                return fn(function (err) {
                    if (isRetryError(err)) {
                        err = err.retried;
                    }

                    throw errcode(new Error('Retrying'), 'EPROMISERETRY', { retried: err });
                }, number);
            })
            .then(resolve, function (err) {
                if (isRetryError(err)) {
                    err = err.retried;

                    if (operation.retry(err || new Error())) {
                        return;
                    }
                }

                reject(err);
            });
        });
    });
}

module.exports = promiseRetry;
{
  "name": "promise-retry",
  "version": "2.0.1",
  "description": "Retries a function that returns a promise, leveraging the power of the retry module.",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/IndigoUnited/node-promise-retry.git"
  },
  "author": "IndigoUnited <hello@indigounited.com> (http://indigounited.com)",
  "license": "MIT",
  "devDependencies": {
    "expect.js": "^0.3.1",
    "mocha": "^8.0.1",
    "sleep-promise": "^8.0.1"
  },
  "dependencies": {
    "err-code": "^2.0.2",
    "retry": "^0.12.0"
  },
  "engines": {
    "node": ">=10"
  }
}2.0.7 / 2021-05-31
==================

  * deps: forwarded@0.2.0
    - Use `req.socket` over deprecated `req.connection`

2.0.6 / 2020-02-24
==================

  * deps: ipaddr.js@1.9.1

2.0.5 / 2019-04-16
==================

  * deps: ipaddr.js@1.9.0

2.0.4 / 2018-07-26
==================

  * deps: ipaddr.js@1.8.0

2.0.3 / 2018-02-19
==================

  * deps: ipaddr.js@1.6.0

2.0.2 / 2017-09-24
==================

  * deps: forwarded@~0.1.2
    - perf: improve header parsing
    - perf: reduce overhead when no `X-Forwarded-For` header

2.0.1 / 2017-09-10
==================

  * deps: forwarded@~0.1.1
    - Fix trimming leading / trailing OWS
    - perf: hoist regular expression
  * deps: ipaddr.js@1.5.2

2.0.0 / 2017-08-08
==================

  * Drop support for Node.js below 0.10

1.1.5 / 2017-07-25
==================

  * Fix array argument being altered
  * deps: ipaddr.js@1.4.0

1.1.4 / 2017-03-24
==================

  * deps: ipaddr.js@1.3.0

1.1.3 / 2017-01-14
==================

  * deps: ipaddr.js@1.2.0

1.1.2 / 2016-05-29
==================

  * deps: ipaddr.js@1.1.1
    - Fix IPv6-mapped IPv4 validation edge cases

1.1.1 / 2016-05-03
==================

  * Fix regression matching mixed versions against multiple subnets

1.1.0 / 2016-05-01
==================

  * Fix accepting various invalid netmasks
    - IPv4 netmasks must be contingous
    - IPv6 addresses cannot be used as a netmask
  * deps: ipaddr.js@1.1.0

1.0.10 / 2015-12-09
===================

  * deps: ipaddr.js@1.0.5
    - Fix regression in `isValid` with non-string arguments

1.0.9 / 2015-12-01
==================

  * deps: ipaddr.js@1.0.4
    - Fix accepting some invalid IPv6 addresses
    - Reject CIDRs with negative or overlong masks
  * perf: enable strict mode

1.0.8 / 2015-05-10
==================

  * deps: ipaddr.js@1.0.1

1.0.7 / 2015-03-16
==================

  * deps: ipaddr.js@0.1.9
    - Fix OOM on certain inputs to `isValid`

1.0.6 / 2015-02-01
==================

  * deps: ipaddr.js@0.1.8

1.0.5 / 2015-01-08
==================

  * deps: ipaddr.js@0.1.6

1.0.4 / 2014-11-23
==================

  * deps: ipaddr.js@0.1.5
    - Fix edge cases with `isValid`

1.0.3 / 2014-09-21
==================

  * Use `forwarded` npm module

1.0.2 / 2014-09-18
==================

  * Fix a global leak when multiple subnets are trusted
  * Support Node.js 0.6
  * deps: ipaddr.js@0.1.3

1.0.1 / 2014-06-03
==================

  * Fix links in npm package

1.0.0 / 2014-05-08
==================

  * Add `trust` argument to determine proxy trust on
    * Accepts custom function
    * Accepts IPv4/IPv6 address(es)
    * Accepts subnets
    * Accepts pre-defined names
  * Add optional `trust` argument to `proxyaddr.all` to
    stop at first untrusted
  * Add `proxyaddr.compile` to pre-compile `trust` function
    to make subsequent calls faster

0.0.1 / 2014-05-04
==================

  * Fix bad npm publish

0.0.0 / 2014-05-04
==================

  * Initial release
(The MIT License)

Copyright (c) 2014-2016 Douglas Christopher Wilson

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.
/*!
 * proxy-addr
 * Copyright(c) 2014-2016 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module exports.
 * @public
 */

module.exports = proxyaddr
module.exports.all = alladdrs
module.exports.compile = compile

/**
 * Module dependencies.
 * @private
 */

var forwarded = require('forwarded')
var ipaddr = require('ipaddr.js')

/**
 * Variables.
 * @private
 */

var DIGIT_REGEXP = /^[0-9]+$/
var isip = ipaddr.isValid
var parseip = ipaddr.parse

/**
 * Pre-defined IP ranges.
 * @private
 */

var IP_RANGES = {
  linklocal: ['169.254.0.0/16', 'fe80::/10'],
  loopback: ['127.0.0.1/8', '::1/128'],
  uniquelocal: ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fc00::/7']
}

/**
 * Get all addresses in the request, optionally stopping
 * at the first untrusted.
 *
 * @param {Object} request
 * @param {Function|Array|String} [trust]
 * @public
 */

function alladdrs (req, trust) {
  // get addresses
  var addrs = forwarded(req)

  if (!trust) {
    // Return all addresses
    return addrs
  }

  if (typeof trust !== 'function') {
    trust = compile(trust)
  }

  for (var i = 0; i < addrs.length - 1; i++) {
    if (trust(addrs[i], i)) continue

    addrs.length = i + 1
  }

  return addrs
}

/**
 * Compile argument into trust function.
 *
 * @param {Array|String} val
 * @private
 */

function compile (val) {
  if (!val) {
    throw new TypeError('argument is required')
  }

  var trust

  if (typeof val === 'string') {
    trust = [val]
  } else if (Array.isArray(val)) {
    trust = val.slice()
  } else {
    throw new TypeError('unsupported trust argument')
  }

  for (var i = 0; i < trust.length; i++) {
    val = trust[i]

    if (!Object.prototype.hasOwnProperty.call(IP_RANGES, val)) {
      continue
    }

    // Splice in pre-defined range
    val = IP_RANGES[val]
    trust.splice.apply(trust, [i, 1].concat(val))
    i += val.length - 1
  }

  return compileTrust(compileRangeSubnets(trust))
}

/**
 * Compile `arr` elements into range subnets.
 *
 * @param {Array} arr
 * @private
 */

function compileRangeSubnets (arr) {
  var rangeSubnets = new Array(arr.length)

  for (var i = 0; i < arr.length; i++) {
    rangeSubnets[i] = parseipNotation(arr[i])
  }

  return rangeSubnets
}

/**
 * Compile range subnet array into trust function.
 *
 * @param {Array} rangeSubnets
 * @private
 */

function compileTrust (rangeSubnets) {
  // Return optimized function based on length
  var len = rangeSubnets.length
  return len === 0
    ? trustNone
    : len === 1
      ? trustSingle(rangeSubnets[0])
      : trustMulti(rangeSubnets)
}

/**
 * Parse IP notation string into range subnet.
 *
 * @param {String} note
 * @private
 */

function parseipNotation (note) {
  var pos = note.lastIndexOf('/')
  var str = pos !== -1
    ? note.substring(0, pos)
    : note

  if (!isip(str)) {
    throw new TypeError('invalid IP address: ' + str)
  }

  var ip = parseip(str)

  if (pos === -1 && ip.kind() === 'ipv6' && ip.isIPv4MappedAddress()) {
    // Store as IPv4
    ip = ip.toIPv4Address()
  }

  var max = ip.kind() === 'ipv6'
    ? 128
    : 32

  var range = pos !== -1
    ? note.substring(pos + 1, note.length)
    : null

  if (range === null) {
    range = max
  } else if (DIGIT_REGEXP.test(range)) {
    range = parseInt(range, 10)
  } else if (ip.kind() === 'ipv4' && isip(range)) {
    range = parseNetmask(range)
  } else {
    range = null
  }

  if (range <= 0 || range > max) {
    throw new TypeError('invalid range on address: ' + note)
  }

  return [ip, range]
}

/**
 * Parse netmask string into CIDR range.
 *
 * @param {String} netmask
 * @private
 */

function parseNetmask (netmask) {
  var ip = parseip(netmask)
  var kind = ip.kind()

  return kind === 'ipv4'
    ? ip.prefixLengthFromSubnetMask()
    : null
}

/**
 * Determine address of proxied request.
 *
 * @param {Object} request
 * @param {Function|Array|String} trust
 * @public
 */

function proxyaddr (req, trust) {
  if (!req) {
    throw new TypeError('req argument is required')
  }

  if (!trust) {
    throw new TypeError('trust argument is required')
  }

  var addrs = alladdrs(req, trust)
  var addr = addrs[addrs.length - 1]

  return addr
}

/**
 * Static trust function to trust nothing.
 *
 * @private
 */

function trustNone () {
  return false
}

/**
 * Compile trust function for multiple subnets.
 *
 * @param {Array} subnets
 * @private
 */

function trustMulti (subnets) {
  return function trust (addr) {
    if (!isip(addr)) return false

    var ip = parseip(addr)
    var ipconv
    var kind = ip.kind()

    for (var i = 0; i < subnets.length; i++) {
      var subnet = subnets[i]
      var subnetip = subnet[0]
      var subnetkind = subnetip.kind()
      var subnetrange = subnet[1]
      var trusted = ip

      if (kind !== subnetkind) {
        if (subnetkind === 'ipv4' && !ip.isIPv4MappedAddress()) {
          // Incompatible IP addresses
          continue
        }

        if (!ipconv) {
          // Convert IP to match subnet IP kind
          ipconv = subnetkind === 'ipv4'
            ? ip.toIPv4Address()
            : ip.toIPv4MappedAddress()
        }

        trusted = ipconv
      }

      if (trusted.match(subnetip, subnetrange)) {
        return true
      }
    }

    return false
  }
}

/**
 * Compile trust function for single subnet.
 *
 * @param {Object} subnet
 * @private
 */

function trustSingle (subnet) {
  var subnetip = subnet[0]
  var subnetkind = subnetip.kind()
  var subnetisipv4 = subnetkind === 'ipv4'
  var subnetrange = subnet[1]

  return function trust (addr) {
    if (!isip(addr)) return false

    var ip = parseip(addr)
    var kind = ip.kind()

    if (kind !== subnetkind) {
      if (subnetisipv4 && !ip.isIPv4MappedAddress()) {
        // Incompatible IP addresses
        return false
      }

      // Convert IP to match subnet IP kind
      ip = subnetisipv4
        ? ip.toIPv4Address()
        : ip.toIPv4MappedAddress()
    }

    return ip.match(subnetip, subnetrange)
  }
}
{
  "name": "proxy-addr",
  "description": "Determine address of proxied request",
  "version": "2.0.7",
  "author": "Douglas Christopher Wilson <doug@somethingdoug.com>",
  "license": "MIT",
  "repository": "jshttp/proxy-addr",
  "dependencies": {
    "forwarded": "0.2.0",
    "ipaddr.js": "1.9.1"
  },
  "devDependencies": {
    "benchmark": "2.1.4",
    "beautify-benchmark": "0.2.4",
    "deep-equal": "1.0.1",
    "eslint": "7.26.0",
    "eslint-config-standard": "14.1.1",
    "eslint-plugin-import": "2.23.4",
    "eslint-plugin-markdown": "2.2.0",
    "eslint-plugin-node": "11.1.0",
    "eslint-plugin-promise": "4.3.1",
    "eslint-plugin-standard": "4.1.0",
    "mocha": "8.4.0",
    "nyc": "15.1.0"
  },
  "files": [
    "LICENSE",
    "HISTORY.md",
    "README.md",
    "index.js"
  ],
  "engines": {
    "node": ">= 0.10"
  }
}The MIT License (MIT)

Copyright (c) 2017 Lupo Montero lupomontero@gmail.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.
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
	 viewBox="0 0 490.1 105.6" style="enable-background:new 0 0 490.1 105.6;" xml:space="preserve">
<style type="text/css">
	.st0{fill:#F4B960;}
	.st1{fill:#E66F32;}
	.st2{fill:#E43C41;}
	.st3{fill:#BDD041;}
	.st4{fill:#6DB54C;}
	.st5{fill:#AEDAE6;}
	.st6{fill:#56B8DE;}
	.st7{fill:#00B1D5;}
	.st8{fill:url(#SVGID_1_);}
	.st9{fill:#221F1F;}
	.st10{fill:#FFFFFF;}
	.st11{fill:#000111;}
</style>
<title>Browserstack-logo-white</title>
<circle class="st0" cx="52.8" cy="52.8" r="52.8"/>
<circle class="st1" cx="47.5" cy="47.5" r="47.5"/>
<circle class="st2" cx="53.8" cy="41.1" r="41.1"/>
<circle class="st3" cx="57.1" cy="44.4" r="37.8"/>
<circle class="st4" cx="54.3" cy="47.2" r="35.1"/>
<circle class="st5" cx="48.8" cy="41.7" r="29.5"/>
<circle class="st6" cx="53.6" cy="36.8" r="24.7"/>
<circle class="st7" cx="56.6" cy="39.9" r="21.7"/>
<radialGradient id="SVGID_1_" cx="53.45" cy="63.02" r="18.57" gradientTransform="matrix(1 0 0 -1 0 106)" gradientUnits="userSpaceOnUse">
	<stop  offset="0" style="stop-color:#797979"/>
	<stop  offset="1" style="stop-color:#4C4C4C"/>
</radialGradient>
<circle class="st8" cx="53.5" cy="43" r="18.6"/>
<circle class="st9" cx="53.5" cy="43" r="18.6"/>
<ellipse transform="matrix(0.4094 -0.9123 0.9123 0.4094 2.8913 76.9251)" class="st10" cx="60.9" cy="36.2" rx="5.7" ry="3.7"/>
<path class="st11" d="M122.5,32.6c0-0.3,0.3-0.6,0.6-0.6c0,0,0,0,0.1,0h16.6c9.5,0,13.9,4.4,13.9,11c0.2,3.7-1.8,7.2-5.2,8.8v0.1
	c3.7,1.5,6.1,5.2,6,9.3c0,8.2-5.6,12.2-15.4,12.2h-16c-0.3,0-0.6-0.2-0.7-0.5c0,0,0,0,0-0.1L122.5,32.6L122.5,32.6z M139.6,49.1
	c3.9,0,6.4-2.2,6.4-5.4s-2.4-5.5-6.4-5.5h-8.9c-0.2,0-0.4,0.1-0.4,0.3c0,0,0,0,0,0.1v10.2c0,0.2,0.1,0.3,0.3,0.4c0,0,0,0,0.1,0
	H139.6L139.6,49.1z M130.6,66.9h9.3c4.3,0,6.8-2.3,6.8-5.8s-2.4-5.7-6.7-5.7h-9.3c-0.2,0-0.4,0.1-0.4,0.3c0,0,0,0,0,0.1v10.7
	C130.3,66.8,130.4,66.9,130.6,66.9C130.6,66.9,130.6,66.9,130.6,66.9L130.6,66.9z"/>
<path class="st11" d="M159.9,73.3c-0.3,0-0.6-0.2-0.7-0.5c0,0,0,0,0-0.1V44.6c0-0.3,0.3-0.6,0.6-0.6c0,0,0,0,0.1,0h6
	c0.3,0,0.6,0.2,0.7,0.5c0,0,0,0,0,0.1v2.5h0.1c1.5-2.2,4.2-3.8,8.2-3.8c2.4,0,4.8,0.8,6.6,2.4c0.3,0.3,0.4,0.5,0.1,0.8l-3.5,4.1
	c-0.2,0.3-0.6,0.4-0.9,0.2c0,0,0,0-0.1,0c-1.4-0.9-3-1.4-4.7-1.4c-4.1,0-6,2.7-6,7.4v15.9c0,0.3-0.3,0.6-0.6,0.6c0,0,0,0-0.1,0
	H159.9L159.9,73.3z"/>
<path class="st11" d="M182.9,65.8c-0.8-2.3-1.1-4.8-1.1-7.2c-0.1-2.5,0.3-4.9,1.1-7.2c1.8-5.1,6.6-8.1,13.1-8.1s11.2,3,13,8.1
	c0.8,2.3,1.1,4.8,1.1,7.2c0.1,2.5-0.3,4.9-1.1,7.2c-1.8,5.1-6.6,8.1-13,8.1S184.7,71,182.9,65.8z M201.9,64c0.5-1.7,0.8-3.6,0.7-5.4
	c0.1-1.8-0.1-3.7-0.7-5.4c-0.9-2.5-3.3-4-5.9-3.8c-2.6-0.2-5.1,1.4-6,3.8c-0.5,1.8-0.8,3.6-0.7,5.4c-0.1,1.8,0.1,3.7,0.7,5.4
	c0.9,2.5,3.4,4,6,3.8C198.6,68,201,66.5,201.9,64L201.9,64z"/>
<path class="st11" d="M241.9,73.3c-0.4,0-0.7-0.3-0.8-0.6L235,53.9h-0.1l-6.2,18.7c-0.1,0.4-0.4,0.6-0.8,0.6h-5.4
	c-0.4,0-0.7-0.3-0.8-0.6l-10-28.1c-0.1-0.2,0-0.5,0.2-0.6c0.1,0,0.2-0.1,0.3,0h6.3c0.4,0,0.8,0.2,0.9,0.6l6.1,19.3h0.1l6-19.3
	c0.1-0.4,0.5-0.6,0.9-0.6h4.7c0.4,0,0.7,0.2,0.9,0.6l6.4,19.3h0.1l5.8-19.3c0.1-0.4,0.5-0.7,0.9-0.6h6.3c0.2-0.1,0.5,0.1,0.5,0.3
	c0,0.1,0,0.2,0,0.3l-10,28.1c-0.1,0.4-0.4,0.6-0.8,0.6L241.9,73.3L241.9,73.3z"/>
<path class="st11" d="M259.3,69.3c-0.2-0.2-0.3-0.6-0.1-0.8c0,0,0,0,0.1-0.1l3.7-3.6c0.3-0.2,0.7-0.2,0.9,0c2.6,2.1,5.9,3.3,9.3,3.3
	c3.9,0,5.9-1.5,5.9-3.5c0-1.8-1.1-2.9-5.2-3.2l-3.4-0.3c-6.4-0.6-9.7-3.6-9.7-8.6c0-5.7,4.4-9.2,12.3-9.2c4.2-0.1,8.4,1.2,11.9,3.6
	c0.3,0.2,0.3,0.5,0.2,0.8c0,0,0,0,0,0.1l-3.2,3.6c-0.2,0.3-0.6,0.3-0.9,0.1c-2.5-1.5-5.4-2.4-8.3-2.4c-3.1,0-4.8,1.3-4.8,3
	s1.1,2.7,5.2,3.1l3.4,0.3c6.6,0.6,9.8,3.8,9.8,8.6c0,5.8-4.6,9.9-13.3,9.9C268,74,263.2,72.4,259.3,69.3z"/>
<path class="st11" d="M291.2,65.8c-0.8-2.3-1.2-4.7-1.1-7.2c-0.1-2.5,0.3-4.9,1-7.2c1.8-5.1,6.6-8.1,12.9-8.1c6.5,0,11.2,3.1,13,8.1
	c0.7,2.1,1,4.1,1,8.8c0,0.3-0.3,0.6-0.6,0.6c0,0-0.1,0-0.1,0h-19.5c-0.2,0-0.4,0.1-0.4,0.3c0,0,0,0,0,0.1c0,0.8,0.2,1.5,0.5,2.2
	c1,2.9,3.5,4.4,7.1,4.4c2.7,0.1,5.4-0.9,7.4-2.8c0.2-0.3,0.7-0.4,1-0.1c0,0,0,0,0,0l3.9,3.2c0.2,0.1,0.3,0.5,0.2,0.7
	c0,0.1-0.1,0.1-0.1,0.1c-2.7,2.9-7.2,5-13,5C297.8,73.9,293,70.9,291.2,65.8z M310.4,52.8c-0.9-2.4-3.2-3.8-6.2-3.8
	s-5.4,1.4-6.2,3.8c-0.3,0.8-0.4,1.6-0.4,2.5c0,0.2,0.1,0.3,0.3,0.4c0,0,0,0,0.1,0h12.4c0.2,0,0.4-0.1,0.4-0.3c0,0,0,0,0-0.1
	C310.8,54.5,310.6,53.6,310.4,52.8L310.4,52.8z"/>
<path class="st11" d="M323.6,73.3c-0.3,0-0.6-0.2-0.7-0.5c0,0,0,0,0-0.1V44.6c0-0.3,0.3-0.6,0.6-0.6c0,0,0,0,0.1,0h6
	c0.3,0,0.6,0.2,0.7,0.5c0,0,0,0,0,0.1v2.5h0.1c1.5-2.2,4.2-3.8,8.2-3.8c2.4,0,4.8,0.8,6.6,2.4c0.3,0.3,0.4,0.5,0.1,0.8l-3.5,4.1
	c-0.2,0.3-0.6,0.4-0.9,0.2c0,0,0,0-0.1,0c-1.4-0.9-3-1.4-4.7-1.4c-4.1,0-6,2.7-6,7.4v15.9c0,0.3-0.3,0.6-0.6,0.6c0,0,0,0-0.1,0
	H323.6L323.6,73.3z"/>
<path class="st11" d="M346.5,68.5c-0.3-0.2-0.4-0.6-0.2-0.9c0,0,0,0,0,0l4.1-4.4c0.2-0.3,0.6-0.3,0.9-0.1c0,0,0,0,0,0
	c3.5,2.7,7.7,4.2,12.1,4.4c5.3,0,8.4-2.5,8.4-6c0-3-2-4.9-8.1-5.7l-2.4-0.3c-8.6-1.1-13.5-4.9-13.5-11.8c0-7.5,5.9-12.4,15.1-12.4
	c5.1-0.1,10.1,1.4,14.5,4.2c0.3,0.1,0.4,0.4,0.2,0.7c0,0.1-0.1,0.1-0.1,0.2l-3.1,4.5c-0.2,0.3-0.6,0.4-0.9,0.2
	c-3.2-2.1-6.9-3.2-10.7-3.2c-4.5,0-7,2.3-7,5.5c0,2.9,2.2,4.8,8.2,5.6l2.4,0.3c8.6,1.1,13.3,4.9,13.3,12c0,7.3-5.7,12.8-16.8,12.8
	C356.3,73.9,350,71.5,346.5,68.5z"/>
<path class="st11" d="M393.3,73.8c-6.4,0-8.8-2.9-8.8-8.6V49.8c0-0.2-0.1-0.3-0.3-0.4c0,0,0,0-0.1,0H382c-0.3,0-0.6-0.2-0.7-0.5
	c0,0,0,0,0-0.1v-4.1c0-0.3,0.3-0.6,0.6-0.6c0,0,0,0,0.1,0h2.1c0.2,0,0.4-0.1,0.4-0.3c0,0,0,0,0-0.1v-8c0-0.3,0.3-0.6,0.6-0.6
	c0,0,0,0,0.1,0h6c0.3,0,0.6,0.2,0.7,0.5c0,0,0,0,0,0.1v8c0,0.2,0.1,0.3,0.3,0.4c0,0,0,0,0.1,0h4.2c0.3,0,0.6,0.2,0.7,0.5
	c0,0,0,0,0,0.1v4.1c0,0.3-0.3,0.6-0.6,0.6c0,0,0,0-0.1,0h-4.2c-0.2,0-0.4,0.1-0.4,0.3c0,0,0,0,0,0.1V65c0,2.1,0.9,2.7,3,2.7h1.6
	c0.3,0,0.6,0.2,0.7,0.5c0,0,0,0,0,0.1v4.9c0,0.3-0.3,0.6-0.6,0.6c0,0,0,0-0.1,0L393.3,73.8L393.3,73.8z"/>
<path class="st11" d="M421.2,73.3c-0.3,0-0.6-0.2-0.7-0.5c0,0,0,0,0-0.1v-2.1h0c-1.5,2-4.5,3.4-8.9,3.4c-5.8,0-10.6-2.8-10.6-8.9
	c0-6.4,4.9-9.3,12.7-9.3h6.4c0.2,0,0.4-0.1,0.4-0.3c0,0,0,0,0-0.1v-1.4c0-3.3-1.7-4.9-7-4.9c-2.6-0.1-5.1,0.6-7.2,2
	c-0.3,0.2-0.7,0.2-0.9-0.1c0,0,0,0,0-0.1l-2.4-4c-0.2-0.2-0.1-0.6,0.1-0.8c0,0,0,0,0,0c2.6-1.7,6-2.9,11.2-2.9
	c9.6,0,13.2,3,13.2,10.2v19.1c0,0.3-0.3,0.6-0.6,0.6c0,0,0,0-0.1,0H421.2L421.2,73.3z M420.4,63.4v-2.2c0-0.2-0.1-0.3-0.3-0.4
	c0,0,0,0-0.1,0h-5.2c-4.7,0-6.8,1.2-6.8,3.9c0,2.4,1.9,3.6,5.5,3.6C417.9,68.4,420.4,66.8,420.4,63.4L420.4,63.4z"/>
<path class="st11" d="M433.1,65.8c-0.7-2.3-1.1-4.8-1-7.2c-0.1-2.4,0.3-4.9,1-7.2c1.8-5.2,6.7-8.1,13.1-8.1c4.2-0.2,8.2,1.5,11,4.6
	c0.2,0.2,0.2,0.6,0,0.8c0,0,0,0-0.1,0.1l-4.1,3.3c-0.3,0.2-0.7,0.2-0.9-0.1c0,0,0,0,0-0.1c-1.5-1.7-3.6-2.6-5.9-2.5
	c-2.8,0-5,1.3-5.9,3.8c-0.5,1.8-0.8,3.6-0.7,5.4c-0.1,1.8,0.1,3.7,0.7,5.5c0.9,2.5,3.1,3.8,5.9,3.8c2.2,0.1,4.4-0.9,5.9-2.6
	c0.2-0.3,0.6-0.3,0.9-0.1c0,0,0,0,0,0l4.1,3.3c0.3,0.2,0.3,0.5,0.1,0.8c0,0,0,0-0.1,0.1c-2.9,3-6.9,4.6-11,4.5
	C439.8,73.9,435,71.1,433.1,65.8z"/>
<path class="st11" d="M482.8,73.3c-0.4,0-0.8-0.2-1-0.6l-8-12.3l-4.3,4.6v7.7c0,0.3-0.3,0.6-0.6,0.6c0,0,0,0-0.1,0h-6
	c-0.3,0-0.6-0.2-0.7-0.5c0,0,0,0,0-0.1V32.6c0-0.3,0.3-0.6,0.6-0.6c0,0,0,0,0.1,0h6c0.3,0,0.6,0.2,0.7,0.5c0,0,0,0,0,0.1v23.8
	l10.8-11.8c0.3-0.4,0.8-0.6,1.2-0.6h6.7c0.2,0,0.4,0.1,0.4,0.3c0,0.1,0,0.3-0.1,0.3l-10.1,10.7L490,72.7c0.1,0.2,0.1,0.4,0,0.5
	c-0.1,0.1-0.2,0.1-0.3,0.1H482.8L482.8,73.3z"/>
</svg>
/*eslint no-var:0, prefer-arrow-callback: 0, object-shorthand: 0 */
'use strict';


var Punycode = require('punycode');


var internals = {};


//
// Read rules from file.
//
internals.rules = require('./data/rules.json').map(function (rule) {

  return {
    rule: rule,
    suffix: rule.replace(/^(\*\.|\!)/, ''),
    punySuffix: -1,
    wildcard: rule.charAt(0) === '*',
    exception: rule.charAt(0) === '!'
  };
});


//
// Check is given string ends with `suffix`.
//
internals.endsWith = function (str, suffix) {

  return str.indexOf(suffix, str.length - suffix.length) !== -1;
};


//
// Find rule for a given domain.
//
internals.findRule = function (domain) {

  var punyDomain = Punycode.toASCII(domain);
  return internals.rules.reduce(function (memo, rule) {

    if (rule.punySuffix === -1){
      rule.punySuffix = Punycode.toASCII(rule.suffix);
    }
    if (!internals.endsWith(punyDomain, '.' + rule.punySuffix) && punyDomain !== rule.punySuffix) {
      return memo;
    }
    // This has been commented out as it never seems to run. This is because
    // sub tlds always appear after their parents and we never find a shorter
    // match.
    //if (memo) {
    //  var memoSuffix = Punycode.toASCII(memo.suffix);
    //  if (memoSuffix.length >= punySuffix.length) {
    //    return memo;
    //  }
    //}
    return rule;
  }, null);
};


//
// Error codes and messages.
//
exports.errorCodes = {
  DOMAIN_TOO_SHORT: 'Domain name too short.',
  DOMAIN_TOO_LONG: 'Domain name too long. It should be no more than 255 chars.',
  LABEL_STARTS_WITH_DASH: 'Domain name label can not start with a dash.',
  LABEL_ENDS_WITH_DASH: 'Domain name label can not end with a dash.',
  LABEL_TOO_LONG: 'Domain name label should be at most 63 chars long.',
  LABEL_TOO_SHORT: 'Domain name label should be at least 1 character long.',
  LABEL_INVALID_CHARS: 'Domain name label can only contain alphanumeric characters or dashes.'
};


//
// Validate domain name and throw if not valid.
//
// From wikipedia:
//
// Hostnames are composed of series of labels concatenated with dots, as are all
// domain names. Each label must be between 1 and 63 characters long, and the
// entire hostname (including the delimiting dots) has a maximum of 255 chars.
//
// Allowed chars:
//
// * `a-z`
// * `0-9`
// * `-` but not as a starting or ending character
// * `.` as a separator for the textual portions of a domain name
//
// * http://en.wikipedia.org/wiki/Domain_name
// * http://en.wikipedia.org/wiki/Hostname
//
internals.validate = function (input) {

  // Before we can validate we need to take care of IDNs with unicode chars.
  var ascii = Punycode.toASCII(input);

  if (ascii.length < 1) {
    return 'DOMAIN_TOO_SHORT';
  }
  if (ascii.length > 255) {
    return 'DOMAIN_TOO_LONG';
  }

  // Check each part's length and allowed chars.
  var labels = ascii.split('.');
  var label;

  for (var i = 0; i < labels.length; ++i) {
    label = labels[i];
    if (!label.length) {
      return 'LABEL_TOO_SHORT';
    }
    if (label.length > 63) {
      return 'LABEL_TOO_LONG';
    }
    if (label.charAt(0) === '-') {
      return 'LABEL_STARTS_WITH_DASH';
    }
    if (label.charAt(label.length - 1) === '-') {
      return 'LABEL_ENDS_WITH_DASH';
    }
    if (!/^[a-z0-9\-]+$/.test(label)) {
      return 'LABEL_INVALID_CHARS';
    }
  }
};


//
// Public API
//


//
// Parse domain.
//
exports.parse = function (input) {

  if (typeof input !== 'string') {
    throw new TypeError('Domain name must be a string.');
  }

  // Force domain to lowercase.
  var domain = input.slice(0).toLowerCase();

  // Handle FQDN.
  // TODO: Simply remove trailing dot?
  if (domain.charAt(domain.length - 1) === '.') {
    domain = domain.slice(0, domain.length - 1);
  }

  // Validate and sanitise input.
  var error = internals.validate(domain);
  if (error) {
    return {
      input: input,
      error: {
        message: exports.errorCodes[error],
        code: error
      }
    };
  }

  var parsed = {
    input: input,
    tld: null,
    sld: null,
    domain: null,
    subdomain: null,
    listed: false
  };

  var domainParts = domain.split('.');

  // Non-Internet TLD
  if (domainParts[domainParts.length - 1] === 'local') {
    return parsed;
  }

  var handlePunycode = function () {

    if (!/xn--/.test(domain)) {
      return parsed;
    }
    if (parsed.domain) {
      parsed.domain = Punycode.toASCII(parsed.domain);
    }
    if (parsed.subdomain) {
      parsed.subdomain = Punycode.toASCII(parsed.subdomain);
    }
    return parsed;
  };

  var rule = internals.findRule(domain);

  // Unlisted tld.
  if (!rule) {
    if (domainParts.length < 2) {
      return parsed;
    }
    parsed.tld = domainParts.pop();
    parsed.sld = domainParts.pop();
    parsed.domain = [parsed.sld, parsed.tld].join('.');
    if (domainParts.length) {
      parsed.subdomain = domainParts.pop();
    }
    return handlePunycode();
  }

  // At this point we know the public suffix is listed.
  parsed.listed = true;

  var tldParts = rule.suffix.split('.');
  var privateParts = domainParts.slice(0, domainParts.length - tldParts.length);

  if (rule.exception) {
    privateParts.push(tldParts.shift());
  }

  parsed.tld = tldParts.join('.');

  if (!privateParts.length) {
    return handlePunycode();
  }

  if (rule.wildcard) {
    tldParts.unshift(privateParts.pop());
    parsed.tld = tldParts.join('.');
  }

  if (!privateParts.length) {
    return handlePunycode();
  }

  parsed.sld = privateParts.pop();
  parsed.domain = [parsed.sld,  parsed.tld].join('.');

  if (privateParts.length) {
    parsed.subdomain = privateParts.join('.');
  }

  return handlePunycode();
};


//
// Get domain.
//
exports.get = function (domain) {

  if (!domain) {
    return null;
  }
  return exports.parse(domain).domain || null;
};


//
// Check whether domain belongs to a known public suffix.
//
exports.isValid = function (domain) {

  var parsed = exports.parse(domain);
  return Boolean(parsed.domain && parsed.listed);
};
{
  "name": "psl",
  "version": "1.9.0",
  "description": "Domain name parser based on the Public Suffix List",
  "repository": {
    "type": "git",
    "url": "git@github.com:lupomontero/psl.git"
  },
  "main": "index.js",
  "author": "Lupo Montero <lupomontero@gmail.com> (https://lupomontero.com/)",
  "license": "MIT",
  "devDependencies": {
    "browserify": "^17.0.0",
    "browserslist-browserstack": "^3.1.1",
    "browserstack-local": "^1.5.1",
    "chai": "^4.3.6",
    "commit-and-pr": "^1.0.4",
    "eslint": "^8.19.0",
    "JSONStream": "^1.3.5",
    "mocha": "^7.2.0",
    "porch": "^2.0.0",
    "request": "^2.88.2",
    "selenium-webdriver": "^4.3.0",
    "serve-handler": "^6.1.3",
    "uglify-js": "^3.16.2",
    "watchify": "^4.0.0"
  }
}(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.psl = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
module.exports=[
"ac",
"com.ac",
"edu.ac",
"gov.ac",
"net.ac",
"mil.ac",
"org.ac",
"ad",
"nom.ad",
"ae",
"co.ae",
"net.ae",
"org.ae",
"sch.ae",
"ac.ae",
"gov.ae",
"mil.ae",
"aero",
"accident-investigation.aero",
"accident-prevention.aero",
"aerobatic.aero",
"aeroclub.aero",
"aerodrome.aero",
"agents.aero",
"aircraft.aero",
"airline.aero",
"airport.aero",
"air-surveillance.aero",
"airtraffic.aero",
"air-traffic-control.aero",
"ambulance.aero",
"amusement.aero",
"association.aero",
"author.aero",
"ballooning.aero",
"broker.aero",
"caa.aero",
"cargo.aero",
"catering.aero",
"certification.aero",
"championship.aero",
"charter.aero",
"civilaviation.aero",
"club.aero",
"conference.aero",
"consultant.aero",
"consulting.aero",
"control.aero",
"council.aero",
"crew.aero",
"design.aero",
"dgca.aero",
"educator.aero",
"emergency.aero",
"engine.aero",
"engineer.aero",
"entertainment.aero",
"equipment.aero",
"exchange.aero",
"express.aero",
"federation.aero",
"flight.aero",
"fuel.aero",
"gliding.aero",
"government.aero",
"groundhandling.aero",
"group.aero",
"hanggliding.aero",
"homebuilt.aero",
"insurance.aero",
"journal.aero",
"journalist.aero",
"leasing.aero",
"logistics.aero",
"magazine.aero",
"maintenance.aero",
"media.aero",
"microlight.aero",
"modelling.aero",
"navigation.aero",
"parachuting.aero",
"paragliding.aero",
"passenger-association.aero",
"pilot.aero",
"press.aero",
"production.aero",
"recreation.aero",
"repbody.aero",
"res.aero",
"research.aero",
"rotorcraft.aero",
"safety.aero",
"scientist.aero",
"services.aero",
"show.aero",
"skydiving.aero",
"software.aero",
"student.aero",
"trader.aero",
"trading.aero",
"trainer.aero",
"union.aero",
"workinggroup.aero",
"works.aero",
"af",
"gov.af",
"com.af",
"org.af",
"net.af",
"edu.af",
"ag",
"com.ag",
"org.ag",
"net.ag",
"co.ag",
"nom.ag",
"ai",
"off.ai",
"com.ai",
"net.ai",
"org.ai",
"al",
"com.al",
"edu.al",
"gov.al",
"mil.al",
"net.al",
"org.al",
"am",
"co.am",
"com.am",
"commune.am",
"net.am",
"org.am",
"ao",
"ed.ao",
"gv.ao",
"og.ao",
"co.ao",
"pb.ao",
"it.ao",
"aq",
"ar",
"bet.ar",
"com.ar",
"coop.ar",
"edu.ar",
"gob.ar",
"gov.ar",
"int.ar",
"mil.ar",
"musica.ar",
"mutual.ar",
"net.ar",
"org.ar",
"senasa.ar",
"tur.ar",
"arpa",
"e164.arpa",
"in-addr.arpa",
"ip6.arpa",
"iris.arpa",
"uri.arpa",
"urn.arpa",
"as",
"gov.as",
"asia",
"at",
"ac.at",
"co.at",
"gv.at",
"or.at",
"sth.ac.at",
"au",
"com.au",
"net.au",
"org.au",
"edu.au",
"gov.au",
"asn.au",
"id.au",
"info.au",
"conf.au",
"oz.au",
"act.au",
"nsw.au",
"nt.au",
"qld.au",
"sa.au",
"tas.au",
"vic.au",
"wa.au",
"act.edu.au",
"catholic.edu.au",
"nsw.edu.au",
"nt.edu.au",
"qld.edu.au",
"sa.edu.au",
"tas.edu.au",
"vic.edu.au",
"wa.edu.au",
"qld.gov.au",
"sa.gov.au",
"tas.gov.au",
"vic.gov.au",
"wa.gov.au",
"schools.nsw.edu.au",
"aw",
"com.aw",
"ax",
"az",
"com.az",
"net.az",
"int.az",
"gov.az",
"org.az",
"edu.az",
"info.az",
"pp.az",
"mil.az",
"name.az",
"pro.az",
"biz.az",
"ba",
"com.ba",
"edu.ba",
"gov.ba",
"mil.ba",
"net.ba",
"org.ba",
"bb",
"biz.bb",
"co.bb",
"com.bb",
"edu.bb",
"gov.bb",
"info.bb",
"net.bb",
"org.bb",
"store.bb",
"tv.bb",
"*.bd",
"be",
"ac.be",
"bf",
"gov.bf",
"bg",
"a.bg",
"b.bg",
"c.bg",
"d.bg",
"e.bg",
"f.bg",
"g.bg",
"h.bg",
"i.bg",
"j.bg",
"k.bg",
"l.bg",
"m.bg",
"n.bg",
"o.bg",
"p.bg",
"q.bg",
"r.bg",
"s.bg",
"t.bg",
"u.bg",
"v.bg",
"w.bg",
"x.bg",
"y.bg",
"z.bg",
"0.bg",
"1.bg",
"2.bg",
"3.bg",
"4.bg",
"5.bg",
"6.bg",
"7.bg",
"8.bg",
"9.bg",
"bh",
"com.bh",
"edu.bh",
"net.bh",
"org.bh",
"gov.bh",
"bi",
"co.bi",
"com.bi",
"edu.bi",
"or.bi",
"org.bi",
"biz",
"bj",
"asso.bj",
"barreau.bj",
"gouv.bj",
"bm",
"com.bm",
"edu.bm",
"gov.bm",
"net.bm",
"org.bm",
"bn",
"com.bn",
"edu.bn",
"gov.bn",
"net.bn",
"org.bn",
"bo",
"com.bo",
"edu.bo",
"gob.bo",
"int.bo",
"org.bo",
"net.bo",
"mil.bo",
"tv.bo",
"web.bo",
"academia.bo",
"agro.bo",
"arte.bo",
"blog.bo",
"bolivia.bo",
"ciencia.bo",
"cooperativa.bo",
"democracia.bo",
"deporte.bo",
"ecologia.bo",
"economia.bo",
"empresa.bo",
"indigena.bo",
"industria.bo",
"info.bo",
"medicina.bo",
"movimiento.bo",
"musica.bo",
"natural.bo",
"nombre.bo",
"noticias.bo",
"patria.bo",
"politica.bo",
"profesional.bo",
"plurinacional.bo",
"pueblo.bo",
"revista.bo",
"salud.bo",
"tecnologia.bo",
"tksat.bo",
"transporte.bo",
"wiki.bo",
"br",
"9guacu.br",
"abc.br",
"adm.br",
"adv.br",
"agr.br",
"aju.br",
"am.br",
"anani.br",
"aparecida.br",
"app.br",
"arq.br",
"art.br",
"ato.br",
"b.br",
"barueri.br",
"belem.br",
"bhz.br",
"bib.br",
"bio.br",
"blog.br",
"bmd.br",
"boavista.br",
"bsb.br",
"campinagrande.br",
"campinas.br",
"caxias.br",
"cim.br",
"cng.br",
"cnt.br",
"com.br",
"contagem.br",
"coop.br",
"coz.br",
"cri.br",
"cuiaba.br",
"curitiba.br",
"def.br",
"des.br",
"det.br",
"dev.br",
"ecn.br",
"eco.br",
"edu.br",
"emp.br",
"enf.br",
"eng.br",
"esp.br",
"etc.br",
"eti.br",
"far.br",
"feira.br",
"flog.br",
"floripa.br",
"fm.br",
"fnd.br",
"fortal.br",
"fot.br",
"foz.br",
"fst.br",
"g12.br",
"geo.br",
"ggf.br",
"goiania.br",
"gov.br",
"ac.gov.br",
"al.gov.br",
"am.gov.br",
"ap.gov.br",
"ba.gov.br",
"ce.gov.br",
"df.gov.br",
"es.gov.br",
"go.gov.br",
"ma.gov.br",
"mg.gov.br",
"ms.gov.br",
"mt.gov.br",
"pa.gov.br",
"pb.gov.br",
"pe.gov.br",
"pi.gov.br",
"pr.gov.br",
"rj.gov.br",
"rn.gov.br",
"ro.gov.br",
"rr.gov.br",
"rs.gov.br",
"sc.gov.br",
"se.gov.br",
"sp.gov.br",
"to.gov.br",
"gru.br",
"imb.br",
"ind.br",
"inf.br",
"jab.br",
"jampa.br",
"jdf.br",
"joinville.br",
"jor.br",
"jus.br",
"leg.br",
"lel.br",
"log.br",
"londrina.br",
"macapa.br",
"maceio.br",
"manaus.br",
"maringa.br",
"mat.br",
"med.br",
"mil.br",
"morena.br",
"mp.br",
"mus.br",
"natal.br",
"net.br",
"niteroi.br",
"*.nom.br",
"not.br",
"ntr.br",
"odo.br",
"ong.br",
"org.br",
"osasco.br",
"palmas.br",
"poa.br",
"ppg.br",
"pro.br",
"psc.br",
"psi.br",
"pvh.br",
"qsl.br",
"radio.br",
"rec.br",
"recife.br",
"rep.br",
"ribeirao.br",
"rio.br",
"riobranco.br",
"riopreto.br",
"salvador.br",
"sampa.br",
"santamaria.br",
"santoandre.br",
"saobernardo.br",
"saogonca.br",
"seg.br",
"sjc.br",
"slg.br",
"slz.br",
"sorocaba.br",
"srv.br",
"taxi.br",
"tc.br",
"tec.br",
"teo.br",
"the.br",
"tmp.br",
"trd.br",
"tur.br",
"tv.br",
"udi.br",
"vet.br",
"vix.br",
"vlog.br",
"wiki.br",
"zlg.br",
"bs",
"com.bs",
"net.bs",
"org.bs",
"edu.bs",
"gov.bs",
"bt",
"com.bt",
"edu.bt",
"gov.bt",
"net.bt",
"org.bt",
"bv",
"bw",
"co.bw",
"org.bw",
"by",
"gov.by",
"mil.by",
"com.by",
"of.by",
"bz",
"com.bz",
"net.bz",
"org.bz",
"edu.bz",
"gov.bz",
"ca",
"ab.ca",
"bc.ca",
"mb.ca",
"nb.ca",
"nf.ca",
"nl.ca",
"ns.ca",
"nt.ca",
"nu.ca",
"on.ca",
"pe.ca",
"qc.ca",
"sk.ca",
"yk.ca",
"gc.ca",
"cat",
"cc",
"cd",
"gov.cd",
"cf",
"cg",
"ch",
"ci",
"org.ci",
"or.ci",
"com.ci",
"co.ci",
"edu.ci",
"ed.ci",
"ac.ci",
"net.ci",
"go.ci",
"asso.ci",
"aéroport.ci",
"int.ci",
"presse.ci",
"md.ci",
"gouv.ci",
"*.ck",
"!www.ck",
"cl",
"co.cl",
"gob.cl",
"gov.cl",
"mil.cl",
"cm",
"co.cm",
"com.cm",
"gov.cm",
"net.cm",
"cn",
"ac.cn",
"com.cn",
"edu.cn",
"gov.cn",
"net.cn",
"org.cn",
"mil.cn",
"公司.cn",
"网络.cn",
"網絡.cn",
"ah.cn",
"bj.cn",
"cq.cn",
"fj.cn",
"gd.cn",
"gs.cn",
"gz.cn",
"gx.cn",
"ha.cn",
"hb.cn",
"he.cn",
"hi.cn",
"hl.cn",
"hn.cn",
"jl.cn",
"js.cn",
"jx.cn",
"ln.cn",
"nm.cn",
"nx.cn",
"qh.cn",
"sc.cn",
"sd.cn",
"sh.cn",
"sn.cn",
"sx.cn",
"tj.cn",
"xj.cn",
"xz.cn",
"yn.cn",
"zj.cn",
"hk.cn",
"mo.cn",
"tw.cn",
"co",
"arts.co",
"com.co",
"edu.co",
"firm.co",
"gov.co",
"info.co",
"int.co",
"mil.co",
"net.co",
"nom.co",
"org.co",
"rec.co",
"web.co",
"com",
"coop",
"cr",
"ac.cr",
"co.cr",
"ed.cr",
"fi.cr",
"go.cr",
"or.cr",
"sa.cr",
"cu",
"com.cu",
"edu.cu",
"org.cu",
"net.cu",
"gov.cu",
"inf.cu",
"cv",
"com.cv",
"edu.cv",
"int.cv",
"nome.cv",
"org.cv",
"cw",
"com.cw",
"edu.cw",
"net.cw",
"org.cw",
"cx",
"gov.cx",
"cy",
"ac.cy",
"biz.cy",
"com.cy",
"ekloges.cy",
"gov.cy",
"ltd.cy",
"mil.cy",
"net.cy",
"org.cy",
"press.cy",
"pro.cy",
"tm.cy",
"cz",
"de",
"dj",
"dk",
"dm",
"com.dm",
"net.dm",
"org.dm",
"edu.dm",
"gov.dm",
"do",
"art.do",
"com.do",
"edu.do",
"gob.do",
"gov.do",
"mil.do",
"net.do",
"org.do",
"sld.do",
"web.do",
"dz",
"art.dz",
"asso.dz",
"com.dz",
"edu.dz",
"gov.dz",
"org.dz",
"net.dz",
"pol.dz",
"soc.dz",
"tm.dz",
"ec",
"com.ec",
"info.ec",
"net.ec",
"fin.ec",
"k12.ec",
"med.ec",
"pro.ec",
"org.ec",
"edu.ec",
"gov.ec",
"gob.ec",
"mil.ec",
"edu",
"ee",
"edu.ee",
"gov.ee",
"riik.ee",
"lib.ee",
"med.ee",
"com.ee",
"pri.ee",
"aip.ee",
"org.ee",
"fie.ee",
"eg",
"com.eg",
"edu.eg",
"eun.eg",
"gov.eg",
"mil.eg",
"name.eg",
"net.eg",
"org.eg",
"sci.eg",
"*.er",
"es",
"com.es",
"nom.es",
"org.es",
"gob.es",
"edu.es",
"et",
"com.et",
"gov.et",
"org.et",
"edu.et",
"biz.et",
"name.et",
"info.et",
"net.et",
"eu",
"fi",
"aland.fi",
"fj",
"ac.fj",
"biz.fj",
"com.fj",
"gov.fj",
"info.fj",
"mil.fj",
"name.fj",
"net.fj",
"org.fj",
"pro.fj",
"*.fk",
"com.fm",
"edu.fm",
"net.fm",
"org.fm",
"fm",
"fo",
"fr",
"asso.fr",
"com.fr",
"gouv.fr",
"nom.fr",
"prd.fr",
"tm.fr",
"aeroport.fr",
"avocat.fr",
"avoues.fr",
"cci.fr",
"chambagri.fr",
"chirurgiens-dentistes.fr",
"experts-comptables.fr",
"geometre-expert.fr",
"greta.fr",
"huissier-justice.fr",
"medecin.fr",
"notaires.fr",
"pharmacien.fr",
"port.fr",
"veterinaire.fr",
"ga",
"gb",
"edu.gd",
"gov.gd",
"gd",
"ge",
"com.ge",
"edu.ge",
"gov.ge",
"org.ge",
"mil.ge",
"net.ge",
"pvt.ge",
"gf",
"gg",
"co.gg",
"net.gg",
"org.gg",
"gh",
"com.gh",
"edu.gh",
"gov.gh",
"org.gh",
"mil.gh",
"gi",
"com.gi",
"ltd.gi",
"gov.gi",
"mod.gi",
"edu.gi",
"org.gi",
"gl",
"co.gl",
"com.gl",
"edu.gl",
"net.gl",
"org.gl",
"gm",
"gn",
"ac.gn",
"com.gn",
"edu.gn",
"gov.gn",
"org.gn",
"net.gn",
"gov",
"gp",
"com.gp",
"net.gp",
"mobi.gp",
"edu.gp",
"org.gp",
"asso.gp",
"gq",
"gr",
"com.gr",
"edu.gr",
"net.gr",
"org.gr",
"gov.gr",
"gs",
"gt",
"com.gt",
"edu.gt",
"gob.gt",
"ind.gt",
"mil.gt",
"net.gt",
"org.gt",
"gu",
"com.gu",
"edu.gu",
"gov.gu",
"guam.gu",
"info.gu",
"net.gu",
"org.gu",
"web.gu",
"gw",
"gy",
"co.gy",
"com.gy",
"edu.gy",
"gov.gy",
"net.gy",
"org.gy",
"hk",
"com.hk",
"edu.hk",
"gov.hk",
"idv.hk",
"net.hk",
"org.hk",
"公司.hk",
"教育.hk",
"敎育.hk",
"政府.hk",
"個人.hk",
"个��.hk",
"箇人.hk",
"網络.hk",
"网络.hk",
"组織.hk",
"網絡.hk",
"网絡.hk",
"组织.hk",
"組織.hk",
"組织.hk",
"hm",
"hn",
"com.hn",
"edu.hn",
"org.hn",
"net.hn",
"mil.hn",
"gob.hn",
"hr",
"iz.hr",
"from.hr",
"name.hr",
"com.hr",
"ht",
"com.ht",
"shop.ht",
"firm.ht",
"info.ht",
"adult.ht",
"net.ht",
"pro.ht",
"org.ht",
"med.ht",
"art.ht",
"coop.ht",
"pol.ht",
"asso.ht",
"edu.ht",
"rel.ht",
"gouv.ht",
"perso.ht",
"hu",
"co.hu",
"info.hu",
"org.hu",
"priv.hu",
"sport.hu",
"tm.hu",
"2000.hu",
"agrar.hu",
"bolt.hu",
"casino.hu",
"city.hu",
"erotica.hu",
"erotika.hu",
"film.hu",
"forum.hu",
"games.hu",
"hotel.hu",
"ingatlan.hu",
"jogasz.hu",
"konyvelo.hu",
"lakas.hu",
"media.hu",
"news.hu",
"reklam.hu",
"sex.hu",
"shop.hu",
"suli.hu",
"szex.hu",
"tozsde.hu",
"utazas.hu",
"video.hu",
"id",
"ac.id",
"biz.id",
"co.id",
"desa.id",
"go.id",
"mil.id",
"my.id",
"net.id",
"or.id",
"ponpes.id",
"sch.id",
"web.id",
"ie",
"gov.ie",
"il",
"ac.il",
"co.il",
"gov.il",
"idf.il",
"k12.il",
"muni.il",
"net.il",
"org.il",
"im",
"ac.im",
"co.im",
"com.im",
"ltd.co.im",
"net.im",
"org.im",
"plc.co.im",
"tt.im",
"tv.im",
"in",
"co.in",
"firm.in",
"net.in",
"org.in",
"gen.in",
"ind.in",
"nic.in",
"ac.in",
"edu.in",
"res.in",
"gov.in",
"mil.in",
"info",
"int",
"eu.int",
"io",
"com.io",
"iq",
"gov.iq",
"edu.iq",
"mil.iq",
"com.iq",
"org.iq",
"net.iq",
"ir",
"ac.ir",
"co.ir",
"gov.ir",
"id.ir",
"net.ir",
"org.ir",
"sch.ir",
"ایران.ir",
"ايران.ir",
"is",
"net.is",
"com.is",
"edu.is",
"gov.is",
"org.is",
"int.is",
"it",
"gov.it",
"edu.it",
"abr.it",
"abruzzo.it",
"aosta-valley.it",
"aostavalley.it",
"bas.it",
"basilicata.it",
"cal.it",
"calabria.it",
"cam.it",
"campania.it",
"emilia-romagna.it",
"emiliaromagna.it",
"emr.it",
"friuli-v-giulia.it",
"friuli-ve-giulia.it",
"friuli-vegiulia.it",
"friuli-venezia-giulia.it",
"friuli-veneziagiulia.it",
"friuli-vgiulia.it",
"friuliv-giulia.it",
"friulive-giulia.it",
"friulivegiulia.it",
"friulivenezia-giulia.it",
"friuliveneziagiulia.it",
"friulivgiulia.it",
"fvg.it",
"laz.it",
"lazio.it",
"lig.it",
"liguria.it",
"lom.it",
"lombardia.it",
"lombardy.it",
"lucania.it",
"mar.it",
"marche.it",
"mol.it",
"molise.it",
"piedmont.it",
"piemonte.it",
"pmn.it",
"pug.it",
"puglia.it",
"sar.it",
"sardegna.it",
"sardinia.it",
"sic.it",
"sicilia.it",
"sicily.it",
"taa.it",
"tos.it",
"toscana.it",
"trentin-sud-tirol.it",
"trentin-süd-tirol.it",
"trentin-sudtirol.it",
"trentin-südtirol.it",
"trentin-sued-tirol.it",
"trentin-suedtirol.it",
"trentino-a-adige.it",
"trentino-aadige.it",
"trentino-alto-adige.it",
"trentino-altoadige.it",
"trentino-s-tirol.it",
"trentino-stirol.it",
"trentino-sud-tirol.it",
"trentino-süd-tirol.it",
"trentino-sudtirol.it",
"trentino-südtirol.it",
"trentino-sued-tirol.it",
"trentino-suedtirol.it",
"trentino.it",
"trentinoa-adige.it",
"trentinoaadige.it",
"trentinoalto-adige.it",
"trentinoaltoadige.it",
"trentinos-tirol.it",
"trentinostirol.it",
"trentinosud-tirol.it",
"trentinosüd-tirol.it",
"trentinosudtirol.it",
"trentinosüdtirol.it",
"trentinosued-tirol.it",
"trentinosuedtirol.it",
"trentinsud-tirol.it",
"trentinsüd-tirol.it",
"trentinsudtirol.it",
"trentinsüdtirol.it",
"trentinsued-tirol.it",
"trentinsuedtirol.it",
"tuscany.it",
"umb.it",
"umbria.it",
"val-d-aosta.it",
"val-daosta.it",
"vald-aosta.it",
"valdaosta.it",
"valle-aosta.it",
"valle-d-aosta.it",
"valle-daosta.it",
"valleaosta.it",
"valled-aosta.it",
"valledaosta.it",
"vallee-aoste.it",
"vallée-aoste.it",
"vallee-d-aoste.it",
"vallée-d-aoste.it",
"valleeaoste.it",
"valléeaoste.it",
"valleedaoste.it",
"valléedaoste.it",
"vao.it",
"vda.it",
"ven.it",
"veneto.it",
"ag.it",
"agrigento.it",
"al.it",
"alessandria.it",
"alto-adige.it",
"altoadige.it",
"an.it",
"ancona.it",
"andria-barletta-trani.it",
"andria-trani-barletta.it",
"andriabarlettatrani.it",
"andriatranibarletta.it",
"ao.it",
"aosta.it",
"aoste.it",
"ap.it",
"aq.it",
"aquila.it",
"ar.it",
"arezzo.it",
"ascoli-piceno.it",
"ascolipiceno.it",
"asti.it",
"at.it",
"av.it",
"avellino.it",
"ba.it",
"balsan-sudtirol.it",
"balsan-südtirol.it",
"balsan-suedtirol.it",
"balsan.it",
"bari.it",
"barletta-trani-andria.it",
"barlettatraniandria.it",
"belluno.it",
"benevento.it",
"bergamo.it",
"bg.it",
"bi.it",
"biella.it",
"bl.it",
"bn.it",
"bo.it",
"bologna.it",
"bolzano-altoadige.it",
"bolzano.it",
"bozen-sudtirol.it",
"bozen-südtirol.it",
"bozen-suedtirol.it",
"bozen.it",
"br.it",
"brescia.it",
"brindisi.it",
"bs.it",
"bt.it",
"bulsan-sudtirol.it",
"bulsan-südtirol.it",
"bulsan-suedtirol.it",
"bulsan.it",
"bz.it",
"ca.it",
"cagliari.it",
"caltanissetta.it",
"campidano-medio.it",
"campidanomedio.it",
"campobasso.it",
"carbonia-iglesias.it",
"carboniaiglesias.it",
"carrara-massa.it",
"carraramassa.it",
"caserta.it",
"catania.it",
"catanzaro.it",
"cb.it",
"ce.it",
"cesena-forli.it",
"cesena-forlì.it",
"cesenaforli.it",
"cesenaforlì.it",
"ch.it",
"chieti.it",
"ci.it",
"cl.it",
"cn.it",
"co.it",
"como.it",
"cosenza.it",
"cr.it",
"cremona.it",
"crotone.it",
"cs.it",
"ct.it",
"cuneo.it",
"cz.it",
"dell-ogliastra.it",
"dellogliastra.it",
"en.it",
"enna.it",
"fc.it",
"fe.it",
"fermo.it",
"ferrara.it",
"fg.it",
"fi.it",
"firenze.it",
"florence.it",
"fm.it",
"foggia.it",
"forli-cesena.it",
"forlì-cesena.it",
"forlicesena.it",
"forlìcesena.it",
"fr.it",
"frosinone.it",
"ge.it",
"genoa.it",
"genova.it",
"go.it",
"gorizia.it",
"gr.it",
"grosseto.it",
"iglesias-carbonia.it",
"iglesiascarbonia.it",
"im.it",
"imperia.it",
"is.it",
"isernia.it",
"kr.it",
"la-spezia.it",
"laquila.it",
"laspezia.it",
"latina.it",
"lc.it",
"le.it",
"lecce.it",
"lecco.it",
"li.it",
"livorno.it",
"lo.it",
"lodi.it",
"lt.it",
"lu.it",
"lucca.it",
"macerata.it",
"mantova.it",
"massa-carrara.it",
"massacarrara.it",
"matera.it",
"mb.it",
"mc.it",
"me.it",
"medio-campidano.it",
"mediocampidano.it",
"messina.it",
"mi.it",
"milan.it",
"milano.it",
"mn.it",
"mo.it",
"modena.it",
"monza-brianza.it",
"monza-e-della-brianza.it",
"monza.it",
"monzabrianza.it",
"monzaebrianza.it",
"monzaedellabrianza.it",
"ms.it",
"mt.it",
"na.it",
"naples.it",
"napoli.it",
"no.it",
"novara.it",
"nu.it",
"nuoro.it",
"og.it",
"ogliastra.it",
"olbia-tempio.it",
"olbiatempio.it",
"or.it",
"oristano.it",
"ot.it",
"pa.it",
"padova.it",
"padua.it",
"palermo.it",
"parma.it",
"pavia.it",
"pc.it",
"pd.it",
"pe.it",
"perugia.it",
"pesaro-urbino.it",
"pesarourbino.it",
"pescara.it",
"pg.it",
"pi.it",
"piacenza.it",
"pisa.it",
"pistoia.it",
"pn.it",
"po.it",
"pordenone.it",
"potenza.it",
"pr.it",
"prato.it",
"pt.it",
"pu.it",
"pv.it",
"pz.it",
"ra.it",
"ragusa.it",
"ravenna.it",
"rc.it",
"re.it",
"reggio-calabria.it",
"reggio-emilia.it",
"reggiocalabria.it",
"reggioemilia.it",
"rg.it",
"ri.it",
"rieti.it",
"rimini.it",
"rm.it",
"rn.it",
"ro.it",
"roma.it",
"rome.it",
"rovigo.it",
"sa.it",
"salerno.it",
"sassari.it",
"savona.it",
"si.it",
"siena.it",
"siracusa.it",
"so.it",
"sondrio.it",
"sp.it",
"sr.it",
"ss.it",
"suedtirol.it",
"südtirol.it",
"sv.it",
"ta.it",
"taranto.it",
"te.it",
"tempio-olbia.it",
"tempioolbia.it",
"teramo.it",
"terni.it",
"tn.it",
"to.it",
"torino.it",
"tp.it",
"tr.it",
"trani-andria-barletta.it",
"trani-barletta-andria.it",
"traniandriabarletta.it",
"tranibarlettaandria.it",
"trapani.it",
"trento.it",
"treviso.it",
"trieste.it",
"ts.it",
"turin.it",
"tv.it",
"ud.it",
"udine.it",
"urbino-pesaro.it",
"urbinopesaro.it",
"va.it",
"varese.it",
"vb.it",
"vc.it",
"ve.it",
"venezia.it",
"venice.it",
"verbania.it",
"vercelli.it",
"verona.it",
"vi.it",
"vibo-valentia.it",
"vibovalentia.it",
"vicenza.it",
"viterbo.it",
"vr.it",
"vs.it",
"vt.it",
"vv.it",
"je",
"co.je",
"net.je",
"org.je",
"*.jm",
"jo",
"com.jo",
"org.jo",
"net.jo",
"edu.jo",
"sch.jo",
"gov.jo",
"mil.jo",
"name.jo",
"jobs",
"jp",
"ac.jp",
"ad.jp",
"co.jp",
"ed.jp",
"go.jp",
"gr.jp",
"lg.jp",
"ne.jp",
"or.jp",
"aichi.jp",
"akita.jp",
"aomori.jp",
"chiba.jp",
"ehime.jp",
"fukui.jp",
"fukuoka.jp",
"fukushima.jp",
"gifu.jp",
"gunma.jp",
"hiroshima.jp",
"hokkaido.jp",
"hyogo.jp",
"ibaraki.jp",
"ishikawa.jp",
"iwate.jp",
"kagawa.jp",
"kagoshima.jp",
"kanagawa.jp",
"kochi.jp",
"kumamoto.jp",
"kyoto.jp",
"mie.jp",
"miyagi.jp",
"miyazaki.jp",
"nagano.jp",
"nagasaki.jp",
"nara.jp",
"niigata.jp",
"oita.jp",
"okayama.jp",
"okinawa.jp",
"osaka.jp",
"saga.jp",
"saitama.jp",
"shiga.jp",
"shimane.jp",
"shizuoka.jp",
"tochigi.jp",
"tokushima.jp",
"tokyo.jp",
"tottori.jp",
"toyama.jp",
"wakayama.jp",
"yamagata.jp",
"yamaguchi.jp",
"yamanashi.jp",
"栃木.jp",
"愛知.jp",
"愛媛.jp",
"兵庫.jp",
"熊本.jp",
"茨城.jp",
"北海道.jp",
"千葉.jp",
"和歌山.jp",
"長崎.jp",
"長野.jp",
"新潟.jp",
"青森.jp",
"静岡.jp",
"東京.jp",
"石川.jp",
"埼玉.jp",
"三重.jp",
"京都.jp",
"佐賀.jp",
"大分.jp",
"大阪.jp",
"奈良.jp",
"宮城.jp",
"宮崎.jp",
"富山.jp",
"山口.jp",
"山形.jp",
"山梨.jp",
"岩手.jp",
"岐阜.jp",
"岡山.jp",
"島根.jp",
"広島.jp",
"徳島.jp",
"沖縄.jp",
"滋賀.jp",
"神奈川.jp",
"福井.jp",
"福岡.jp",
"福島.jp",
"秋田.jp",
"群馬.jp",
"香川.jp",
"高知.jp",
"鳥取.jp",
"鹿児島.jp",
"*.kawasaki.jp",
"*.kitakyushu.jp",
"*.kobe.jp",
"*.nagoya.jp",
"*.sapporo.jp",
"*.sendai.jp",
"*.yokohama.jp",
"!city.kawasaki.jp",
"!city.kitakyushu.jp",
"!city.kobe.jp",
"!city.nagoya.jp",
"!city.sapporo.jp",
"!city.sendai.jp",
"!city.yokohama.jp",
"aisai.aichi.jp",
"ama.aichi.jp",
"anjo.aichi.jp",
"asuke.aichi.jp",
"chiryu.aichi.jp",
"chita.aichi.jp",
"fuso.aichi.jp",
"gamagori.aichi.jp",
"handa.aichi.jp",
"hazu.aichi.jp",
"hekinan.aichi.jp",
"higashiura.aichi.jp",
"ichinomiya.aichi.jp",
"inazawa.aichi.jp",
"inuyama.aichi.jp",
"isshiki.aichi.jp",
"iwakura.aichi.jp",
"kanie.aichi.jp",
"kariya.aichi.jp",
"kasugai.aichi.jp",
"kira.aichi.jp",
"kiyosu.aichi.jp",
"komaki.aichi.jp",
"konan.aichi.jp",
"kota.aichi.jp",
"mihama.aichi.jp",
"miyoshi.aichi.jp",
"nishio.aichi.jp",
"nisshin.aichi.jp",
"obu.aichi.jp",
"oguchi.aichi.jp",
"oharu.aichi.jp",
"okazaki.aichi.jp",
"owariasahi.aichi.jp",
"seto.aichi.jp",
"shikatsu.aichi.jp",
"shinshiro.aichi.jp",
"shitara.aichi.jp",
"tahara.aichi.jp",
"takahama.aichi.jp",
"tobishima.aichi.jp",
"toei.aichi.jp",
"togo.aichi.jp",
"tokai.aichi.jp",
"tokoname.aichi.jp",
"toyoake.aichi.jp",
"toyohashi.aichi.jp",
"toyokawa.aichi.jp",
"toyone.aichi.jp",
"toyota.aichi.jp",
"tsushima.aichi.jp",
"yatomi.aichi.jp",
"akita.akita.jp",
"daisen.akita.jp",
"fujisato.akita.jp",
"gojome.akita.jp",
"hachirogata.akita.jp",
"happou.akita.jp",
"higashinaruse.akita.jp",
"honjo.akita.jp",
"honjyo.akita.jp",
"ikawa.akita.jp",
"kamikoani.akita.jp",
"kamioka.akita.jp",
"katagami.akita.jp",
"kazuno.akita.jp",
"kitaakita.akita.jp",
"kosaka.akita.jp",
"kyowa.akita.jp",
"misato.akita.jp",
"mitane.akita.jp",
"moriyoshi.akita.jp",
"nikaho.akita.jp",
"noshiro.akita.jp",
"odate.akita.jp",
"oga.akita.jp",
"ogata.akita.jp",
"semboku.akita.jp",
"yokote.akita.jp",
"yurihonjo.akita.jp",
"aomori.aomori.jp",
"gonohe.aomori.jp",
"hachinohe.aomori.jp",
"hashikami.aomori.jp",
"hiranai.aomori.jp",
"hirosaki.aomori.jp",
"itayanagi.aomori.jp",
"kuroishi.aomori.jp",
"misawa.aomori.jp",
"mutsu.aomori.jp",
"nakadomari.aomori.jp",
"noheji.aomori.jp",
"oirase.aomori.jp",
"owani.aomori.jp",
"rokunohe.aomori.jp",
"sannohe.aomori.jp",
"shichinohe.aomori.jp",
"shingo.aomori.jp",
"takko.aomori.jp",
"towada.aomori.jp",
"tsugaru.aomori.jp",
"tsuruta.aomori.jp",
"abiko.chiba.jp",
"asahi.chiba.jp",
"chonan.chiba.jp",
"chosei.chiba.jp",
"choshi.chiba.jp",
"chuo.chiba.jp",
"funabashi.chiba.jp",
"futtsu.chiba.jp",
"hanamigawa.chiba.jp",
"ichihara.chiba.jp",
"ichikawa.chiba.jp",
"ichinomiya.chiba.jp",
"inzai.chiba.jp",
"isumi.chiba.jp",
"kamagaya.chiba.jp",
"kamogawa.chiba.jp",
"kashiwa.chiba.jp",
"katori.chiba.jp",
"katsuura.chiba.jp",
"kimitsu.chiba.jp",
"kisarazu.chiba.jp",
"kozaki.chiba.jp",
"kujukuri.chiba.jp",
"kyonan.chiba.jp",
"matsudo.chiba.jp",
"midori.chiba.jp",
"mihama.chiba.jp",
"minamiboso.chiba.jp",
"mobara.chiba.jp",
"mutsuzawa.chiba.jp",
"nagara.chiba.jp",
"nagareyama.chiba.jp",
"narashino.chiba.jp",
"narita.chiba.jp",
"noda.chiba.jp",
"oamishirasato.chiba.jp",
"omigawa.chiba.jp",
"onjuku.chiba.jp",
"otaki.chiba.jp",
"sakae.chiba.jp",
"sakura.chiba.jp",
"shimofusa.chiba.jp",
"shirako.chiba.jp",
"shiroi.chiba.jp",
"shisui.chiba.jp",
"sodegaura.chiba.jp",
"sosa.chiba.jp",
"tako.chiba.jp",
"tateyama.chiba.jp",
"togane.chiba.jp",
"tohnosho.chiba.jp",
"tomisato.chiba.jp",
"urayasu.chiba.jp",
"yachimata.chiba.jp",
"yachiyo.chiba.jp",
"yokaichiba.chiba.jp",
"yokoshibahikari.chiba.jp",
"yotsukaido.chiba.jp",
"ainan.ehime.jp",
"honai.ehime.jp",
"ikata.ehime.jp",
"imabari.ehime.jp",
"iyo.ehime.jp",
"kamijima.ehime.jp",
"kihoku.ehime.jp",
"kumakogen.ehime.jp",
"masaki.ehime.jp",
"matsuno.ehime.jp",
"matsuyama.ehime.jp",
"namikata.ehime.jp",
"niihama.ehime.jp",
"ozu.ehime.jp",
"saijo.ehime.jp",
"seiyo.ehime.jp",
"shikokuchuo.ehime.jp",
"tobe.ehime.jp",
"toon.ehime.jp",
"uchiko.ehime.jp",
"uwajima.ehime.jp",
"yawatahama.ehime.jp",
"echizen.fukui.jp",
"eiheiji.fukui.jp",
"fukui.fukui.jp",
"ikeda.fukui.jp",
"katsuyama.fukui.jp",
"mihama.fukui.jp",
"minamiechizen.fukui.jp",
"obama.fukui.jp",
"ohi.fukui.jp",
"ono.fukui.jp",
"sabae.fukui.jp",
"sakai.fukui.jp",
"takahama.fukui.jp",
"tsuruga.fukui.jp",
"wakasa.fukui.jp",
"ashiya.fukuoka.jp",
"buzen.fukuoka.jp",
"chikugo.fukuoka.jp",
"chikuho.fukuoka.jp",
"chikujo.fukuoka.jp",
"chikushino.fukuoka.jp",
"chikuzen.fukuoka.jp",
"chuo.fukuoka.jp",
"dazaifu.fukuoka.jp",
"fukuchi.fukuoka.jp",
"hakata.fukuoka.jp",
"higashi.fukuoka.jp",
"hirokawa.fukuoka.jp",
"hisayama.fukuoka.jp",
"iizuka.fukuoka.jp",
"inatsuki.fukuoka.jp",
"kaho.fukuoka.jp",
"kasuga.fukuoka.jp",
"kasuya.fukuoka.jp",
"kawara.fukuoka.jp",
"keisen.fukuoka.jp",
"koga.fukuoka.jp",
"kurate.fukuoka.jp",
"kurogi.fukuoka.jp",
"kurume.fukuoka.jp",
"minami.fukuoka.jp",
"miyako.fukuoka.jp",
"miyama.fukuoka.jp",
"miyawaka.fukuoka.jp",
"mizumaki.fukuoka.jp",
"munakata.fukuoka.jp",
"nakagawa.fukuoka.jp",
"nakama.fukuoka.jp",
"nishi.fukuoka.jp",
"nogata.fukuoka.jp",
"ogori.fukuoka.jp",
"okagaki.fukuoka.jp",
"okawa.fukuoka.jp",
"oki.fukuoka.jp",
"omuta.fukuoka.jp",
"onga.fukuoka.jp",
"onojo.fukuoka.jp",
"oto.fukuoka.jp",
"saigawa.fukuoka.jp",
"sasaguri.fukuoka.jp",
"shingu.fukuoka.jp",
"shinyoshitomi.fukuoka.jp",
"shonai.fukuoka.jp",
"soeda.fukuoka.jp",
"sue.fukuoka.jp",
"tachiarai.fukuoka.jp",
"tagawa.fukuoka.jp",
"takata.fukuoka.jp",
"toho.fukuoka.jp",
"toyotsu.fukuoka.jp",
"tsuiki.fukuoka.jp",
"ukiha.fukuoka.jp",
"umi.fukuoka.jp",
"usui.fukuoka.jp",
"yamada.fukuoka.jp",
"yame.fukuoka.jp",
"yanagawa.fukuoka.jp",
"yukuhashi.fukuoka.jp",
"aizubange.fukushima.jp",
"aizumisato.fukushima.jp",
"aizuwakamatsu.fukushima.jp",
"asakawa.fukushima.jp",
"bandai.fukushima.jp",
"date.fukushima.jp",
"fukushima.fukushima.jp",
"furudono.fukushima.jp",
"futaba.fukushima.jp",
"hanawa.fukushima.jp",
"higashi.fukushima.jp",
"hirata.fukushima.jp",
"hirono.fukushima.jp",
"iitate.fukushima.jp",
"inawashiro.fukushima.jp",
"ishikawa.fukushima.jp",
"iwaki.fukushima.jp",
"izumizaki.fukushima.jp",
"kagamiishi.fukushima.jp",
"kaneyama.fukushima.jp",
"kawamata.fukushima.jp",
"kitakata.fukushima.jp",
"kitashiobara.fukushima.jp",
"koori.fukushima.jp",
"koriyama.fukushima.jp",
"kunimi.fukushima.jp",
"miharu.fukushima.jp",
"mishima.fukushima.jp",
"namie.fukushima.jp",
"nango.fukushima.jp",
"nishiaizu.fukushima.jp",
"nishigo.fukushima.jp",
"okuma.fukushima.jp",
"omotego.fukushima.jp",
"ono.fukushima.jp",
"otama.fukushima.jp",
"samegawa.fukushima.jp",
"shimogo.fukushima.jp",
"shirakawa.fukushima.jp",
"showa.fukushima.jp",
"soma.fukushima.jp",
"sukagawa.fukushima.jp",
"taishin.fukushima.jp",
"tamakawa.fukushima.jp",
"tanagura.fukushima.jp",
"tenei.fukushima.jp",
"yabuki.fukushima.jp",
"yamato.fukushima.jp",
"yamatsuri.fukushima.jp",
"yanaizu.fukushima.jp",
"yugawa.fukushima.jp",
"anpachi.gifu.jp",
"ena.gifu.jp",
"gifu.gifu.jp",
"ginan.gifu.jp",
"godo.gifu.jp",
"gujo.gifu.jp",
"hashima.gifu.jp",
"hichiso.gifu.jp",
"hida.gifu.jp",
"higashishirakawa.gifu.jp",
"ibigawa.gifu.jp",
"ikeda.gifu.jp",
"kakamigahara.gifu.jp",
"kani.gifu.jp",
"kasahara.gifu.jp",
"kasamatsu.gifu.jp",
"kawaue.gifu.jp",
"kitagata.gifu.jp",
"mino.gifu.jp",
"minokamo.gifu.jp",
"mitake.gifu.jp",
"mizunami.gifu.jp",
"motosu.gifu.jp",
"nakatsugawa.gifu.jp",
"ogaki.gifu.jp",
"sakahogi.gifu.jp",
"seki.gifu.jp",
"sekigahara.gifu.jp",
"shirakawa.gifu.jp",
"tajimi.gifu.jp",
"takayama.gifu.jp",
"tarui.gifu.jp",
"toki.gifu.jp",
"tomika.gifu.jp",
"wanouchi.gifu.jp",
"yamagata.gifu.jp",
"yaotsu.gifu.jp",
"yoro.gifu.jp",
"annaka.gunma.jp",
"chiyoda.gunma.jp",
"fujioka.gunma.jp",
"higashiagatsuma.gunma.jp",
"isesaki.gunma.jp",
"itakura.gunma.jp",
"kanna.gunma.jp",
"kanra.gunma.jp",
"katashina.gunma.jp",
"kawaba.gunma.jp",
"kiryu.gunma.jp",
"kusatsu.gunma.jp",
"maebashi.gunma.jp",
"meiwa.gunma.jp",
"midori.gunma.jp",
"minakami.gunma.jp",
"naganohara.gunma.jp",
"nakanojo.gunma.jp",
"nanmoku.gunma.jp",
"numata.gunma.jp",
"oizumi.gunma.jp",
"ora.gunma.jp",
"ota.gunma.jp",
"shibukawa.gunma.jp",
"shimonita.gunma.jp",
"shinto.gunma.jp",
"showa.gunma.jp",
"takasaki.gunma.jp",
"takayama.gunma.jp",
"tamamura.gunma.jp",
"tatebayashi.gunma.jp",
"tomioka.gunma.jp",
"tsukiyono.gunma.jp",
"tsumagoi.gunma.jp",
"ueno.gunma.jp",
"yoshioka.gunma.jp",
"asaminami.hiroshima.jp",
"daiwa.hiroshima.jp",
"etajima.hiroshima.jp",
"fuchu.hiroshima.jp",
"fukuyama.hiroshima.jp",
"hatsukaichi.hiroshima.jp",
"higashihiroshima.hiroshima.jp",
"hongo.hiroshima.jp",
"jinsekikogen.hiroshima.jp",
"kaita.hiroshima.jp",
"kui.hiroshima.jp",
"kumano.hiroshima.jp",
"kure.hiroshima.jp",
"mihara.hiroshima.jp",
"miyoshi.hiroshima.jp",
"naka.hiroshima.jp",
"onomichi.hiroshima.jp",
"osakikamijima.hiroshima.jp",
"otake.hiroshima.jp",
"saka.hiroshima.jp",
"sera.hiroshima.jp",
"seranishi.hiroshima.jp",
"shinichi.hiroshima.jp",
"shobara.hiroshima.jp",
"takehara.hiroshima.jp",
"abashiri.hokkaido.jp",
"abira.hokkaido.jp",
"aibetsu.hokkaido.jp",
"akabira.hokkaido.jp",
"akkeshi.hokkaido.jp",
"asahikawa.hokkaido.jp",
"ashibetsu.hokkaido.jp",
"ashoro.hokkaido.jp",
"assabu.hokkaido.jp",
"atsuma.hokkaido.jp",
"bibai.hokkaido.jp",
"biei.hokkaido.jp",
"bifuka.hokkaido.jp",
"bihoro.hokkaido.jp",
"biratori.hokkaido.jp",
"chippubetsu.hokkaido.jp",
"chitose.hokkaido.jp",
"date.hokkaido.jp",
"ebetsu.hokkaido.jp",
"embetsu.hokkaido.jp",
"eniwa.hokkaido.jp",
"erimo.hokkaido.jp",
"esan.hokkaido.jp",
"esashi.hokkaido.jp",
"fukagawa.hokkaido.jp",
"fukushima.hokkaido.jp",
"furano.hokkaido.jp",
"furubira.hokkaido.jp",
"haboro.hokkaido.jp",
"hakodate.hokkaido.jp",
"hamatonbetsu.hokkaido.jp",
"hidaka.hokkaido.jp",
"higashikagura.hokkaido.jp",
"higashikawa.hokkaido.jp",
"hiroo.hokkaido.jp",
"hokuryu.hokkaido.jp",
"hokuto.hokkaido.jp",
"honbetsu.hokkaido.jp",
"horokanai.hokkaido.jp",
"horonobe.hokkaido.jp",
"ikeda.hokkaido.jp",
"imakane.hokkaido.jp",
"ishikari.hokkaido.jp",
"iwamizawa.hokkaido.jp",
"iwanai.hokkaido.jp",
"kamifurano.hokkaido.jp",
"kamikawa.hokkaido.jp",
"kamishihoro.hokkaido.jp",
"kamisunagawa.hokkaido.jp",
"kamoenai.hokkaido.jp",
"kayabe.hokkaido.jp",
"kembuchi.hokkaido.jp",
"kikonai.hokkaido.jp",
"kimobetsu.hokkaido.jp",
"kitahiroshima.hokkaido.jp",
"kitami.hokkaido.jp",
"kiyosato.hokkaido.jp",
"koshimizu.hokkaido.jp",
"kunneppu.hokkaido.jp",
"kuriyama.hokkaido.jp",
"kuromatsunai.hokkaido.jp",
"kushiro.hokkaido.jp",
"kutchan.hokkaido.jp",
"kyowa.hokkaido.jp",
"mashike.hokkaido.jp",
"matsumae.hokkaido.jp",
"mikasa.hokkaido.jp",
"minamifurano.hokkaido.jp",
"mombetsu.hokkaido.jp",
"moseushi.hokkaido.jp",
"mukawa.hokkaido.jp",
"muroran.hokkaido.jp",
"naie.hokkaido.jp",
"nakagawa.hokkaido.jp",
"nakasatsunai.hokkaido.jp",
"nakatombetsu.hokkaido.jp",
"nanae.hokkaido.jp",
"nanporo.hokkaido.jp",
"nayoro.hokkaido.jp",
"nemuro.hokkaido.jp",
"niikappu.hokkaido.jp",
"niki.hokkaido.jp",
"nishiokoppe.hokkaido.jp",
"noboribetsu.hokkaido.jp",
"numata.hokkaido.jp",
"obihiro.hokkaido.jp",
"obira.hokkaido.jp",
"oketo.hokkaido.jp",
"okoppe.hokkaido.jp",
"otaru.hokkaido.jp",
"otobe.hokkaido.jp",
"otofuke.hokkaido.jp",
"otoineppu.hokkaido.jp",
"oumu.hokkaido.jp",
"ozora.hokkaido.jp",
"pippu.hokkaido.jp",
"rankoshi.hokkaido.jp",
"rebun.hokkaido.jp",
"rikubetsu.hokkaido.jp",
"rishiri.hokkaido.jp",
"rishirifuji.hokkaido.jp",
"saroma.hokkaido.jp",
"sarufutsu.hokkaido.jp",
"shakotan.hokkaido.jp",
"shari.hokkaido.jp",
"shibecha.hokkaido.jp",
"shibetsu.hokkaido.jp",
"shikabe.hokkaido.jp",
"shikaoi.hokkaido.jp",
"shimamaki.hokkaido.jp",
"shimizu.hokkaido.jp",
"shimokawa.hokkaido.jp",
"shinshinotsu.hokkaido.jp",
"shintoku.hokkaido.jp",
"shiranuka.hokkaido.jp",
"shiraoi.hokkaido.jp",
"shiriuchi.hokkaido.jp",
"sobetsu.hokkaido.jp",
"sunagawa.hokkaido.jp",
"taiki.hokkaido.jp",
"takasu.hokkaido.jp",
"takikawa.hokkaido.jp",
"takinoue.hokkaido.jp",
"teshikaga.hokkaido.jp",
"tobetsu.hokkaido.jp",
"tohma.hokkaido.jp",
"tomakomai.hokkaido.jp",
"tomari.hokkaido.jp",
"toya.hokkaido.jp",
"toyako.hokkaido.jp",
"toyotomi.hokkaido.jp",
"toyoura.hokkaido.jp",
"tsubetsu.hokkaido.jp",
"tsukigata.hokkaido.jp",
"urakawa.hokkaido.jp",
"urausu.hokkaido.jp",
"uryu.hokkaido.jp",
"utashinai.hokkaido.jp",
"wakkanai.hokkaido.jp",
"wassamu.hokkaido.jp",
"yakumo.hokkaido.jp",
"yoichi.hokkaido.jp",
"aioi.hyogo.jp",
"akashi.hyogo.jp",
"ako.hyogo.jp",
"amagasaki.hyogo.jp",
"aogaki.hyogo.jp",
"asago.hyogo.jp",
"ashiya.hyogo.jp",
"awaji.hyogo.jp",
"fukusaki.hyogo.jp",
"goshiki.hyogo.jp",
"harima.hyogo.jp",
"himeji.hyogo.jp",
"ichikawa.hyogo.jp",
"inagawa.hyogo.jp",
"itami.hyogo.jp",
"kakogawa.hyogo.jp",
"kamigori.hyogo.jp",
"kamikawa.hyogo.jp",
"kasai.hyogo.jp",
"kasuga.hyogo.jp",
"kawanishi.hyogo.jp",
"miki.hyogo.jp",
"minamiawaji.hyogo.jp",
"nishinomiya.hyogo.jp",
"nishiwaki.hyogo.jp",
"ono.hyogo.jp",
"sanda.hyogo.jp",
"sannan.hyogo.jp",
"sasayama.hyogo.jp",
"sayo.hyogo.jp",
"shingu.hyogo.jp",
"shinonsen.hyogo.jp",
"shiso.hyogo.jp",
"sumoto.hyogo.jp",
"taishi.hyogo.jp",
"taka.hyogo.jp",
"takarazuka.hyogo.jp",
"takasago.hyogo.jp",
"takino.hyogo.jp",
"tamba.hyogo.jp",
"tatsuno.hyogo.jp",
"toyooka.hyogo.jp",
"yabu.hyogo.jp",
"yashiro.hyogo.jp",
"yoka.hyogo.jp",
"yokawa.hyogo.jp",
"ami.ibaraki.jp",
"asahi.ibaraki.jp",
"bando.ibaraki.jp",
"chikusei.ibaraki.jp",
"daigo.ibaraki.jp",
"fujishiro.ibaraki.jp",
"hitachi.ibaraki.jp",
"hitachinaka.ibaraki.jp",
"hitachiomiya.ibaraki.jp",
"hitachiota.ibaraki.jp",
"ibaraki.ibaraki.jp",
"ina.ibaraki.jp",
"inashiki.ibaraki.jp",
"itako.ibaraki.jp",
"iwama.ibaraki.jp",
"joso.ibaraki.jp",
"kamisu.ibaraki.jp",
"kasama.ibaraki.jp",
"kashima.ibaraki.jp",
"kasumigaura.ibaraki.jp",
"koga.ibaraki.jp",
"miho.ibaraki.jp",
"mito.ibaraki.jp",
"moriya.ibaraki.jp",
"naka.ibaraki.jp",
"namegata.ibaraki.jp",
"oarai.ibaraki.jp",
"ogawa.ibaraki.jp",
"omitama.ibaraki.jp",
"ryugasaki.ibaraki.jp",
"sakai.ibaraki.jp",
"sakuragawa.ibaraki.jp",
"shimodate.ibaraki.jp",
"shimotsuma.ibaraki.jp",
"shirosato.ibaraki.jp",
"sowa.ibaraki.jp",
"suifu.ibaraki.jp",
"takahagi.ibaraki.jp",
"tamatsukuri.ibaraki.jp",
"tokai.ibaraki.jp",
"tomobe.ibaraki.jp",
"tone.ibaraki.jp",
"toride.ibaraki.jp",
"tsuchiura.ibaraki.jp",
"tsukuba.ibaraki.jp",
"uchihara.ibaraki.jp",
"ushiku.ibaraki.jp",
"yachiyo.ibaraki.jp",
"yamagata.ibaraki.jp",
"yawara.ibaraki.jp",
"yuki.ibaraki.jp",
"anamizu.ishikawa.jp",
"hakui.ishikawa.jp",
"hakusan.ishikawa.jp",
"kaga.ishikawa.jp",
"kahoku.ishikawa.jp",
"kanazawa.ishikawa.jp",
"kawakita.ishikawa.jp",
"komatsu.ishikawa.jp",
"nakanoto.ishikawa.jp",
"nanao.ishikawa.jp",
"nomi.ishikawa.jp",
"nonoichi.ishikawa.jp",
"noto.ishikawa.jp",
"shika.ishikawa.jp",
"suzu.ishikawa.jp",
"tsubata.ishikawa.jp",
"tsurugi.ishikawa.jp",
"uchinada.ishikawa.jp",
"wajima.ishikawa.jp",
"fudai.iwate.jp",
"fujisawa.iwate.jp",
"hanamaki.iwate.jp",
"hiraizumi.iwate.jp",
"hirono.iwate.jp",
"ichinohe.iwate.jp",
"ichinoseki.iwate.jp",
"iwaizumi.iwate.jp",
"iwate.iwate.jp",
"joboji.iwate.jp",
"kamaishi.iwate.jp",
"kanegasaki.iwate.jp",
"karumai.iwate.jp",
"kawai.iwate.jp",
"kitakami.iwate.jp",
"kuji.iwate.jp",
"kunohe.iwate.jp",
"kuzumaki.iwate.jp",
"miyako.iwate.jp",
"mizusawa.iwate.jp",
"morioka.iwate.jp",
"ninohe.iwate.jp",
"noda.iwate.jp",
"ofunato.iwate.jp",
"oshu.iwate.jp",
"otsuchi.iwate.jp",
"rikuzentakata.iwate.jp",
"shiwa.iwate.jp",
"shizukuishi.iwate.jp",
"sumita.iwate.jp",
"tanohata.iwate.jp",
"tono.iwate.jp",
"yahaba.iwate.jp",
"yamada.iwate.jp",
"ayagawa.kagawa.jp",
"higashikagawa.kagawa.jp",
"kanonji.kagawa.jp",
"kotohira.kagawa.jp",
"manno.kagawa.jp",
"marugame.kagawa.jp",
"mitoyo.kagawa.jp",
"naoshima.kagawa.jp",
"sanuki.kagawa.jp",
"tadotsu.kagawa.jp",
"takamatsu.kagawa.jp",
"tonosho.kagawa.jp",
"uchinomi.kagawa.jp",
"utazu.kagawa.jp",
"zentsuji.kagawa.jp",
"akune.kagoshima.jp",
"amami.kagoshima.jp",
"hioki.kagoshima.jp",
"isa.kagoshima.jp",
"isen.kagoshima.jp",
"izumi.kagoshima.jp",
"kagoshima.kagoshima.jp",
"kanoya.kagoshima.jp",
"kawanabe.kagoshima.jp",
"kinko.kagoshima.jp",
"kouyama.kagoshima.jp",
"makurazaki.kagoshima.jp",
"matsumoto.kagoshima.jp",
"minamitane.kagoshima.jp",
"nakatane.kagoshima.jp",
"nishinoomote.kagoshima.jp",
"satsumasendai.kagoshima.jp",
"soo.kagoshima.jp",
"tarumizu.kagoshima.jp",
"yusui.kagoshima.jp",
"aikawa.kanagawa.jp",
"atsugi.kanagawa.jp",
"ayase.kanagawa.jp",
"chigasaki.kanagawa.jp",
"ebina.kanagawa.jp",
"fujisawa.kanagawa.jp",
"hadano.kanagawa.jp",
"hakone.kanagawa.jp",
"hiratsuka.kanagawa.jp",
"isehara.kanagawa.jp",
"kaisei.kanagawa.jp",
"kamakura.kanagawa.jp",
"kiyokawa.kanagawa.jp",
"matsuda.kanagawa.jp",
"minamiashigara.kanagawa.jp",
"miura.kanagawa.jp",
"nakai.kanagawa.jp",
"ninomiya.kanagawa.jp",
"odawara.kanagawa.jp",
"oi.kanagawa.jp",
"oiso.kanagawa.jp",
"sagamihara.kanagawa.jp",
"samukawa.kanagawa.jp",
"tsukui.kanagawa.jp",
"yamakita.kanagawa.jp",
"yamato.kanagawa.jp",
"yokosuka.kanagawa.jp",
"yugawara.kanagawa.jp",
"zama.kanagawa.jp",
"zushi.kanagawa.jp",
"aki.kochi.jp",
"geisei.kochi.jp",
"hidaka.kochi.jp",
"higashitsuno.kochi.jp",
"ino.kochi.jp",
"kagami.kochi.jp",
"kami.kochi.jp",
"kitagawa.kochi.jp",
"kochi.kochi.jp",
"mihara.kochi.jp",
"motoyama.kochi.jp",
"muroto.kochi.jp",
"nahari.kochi.jp",
"nakamura.kochi.jp",
"nankoku.kochi.jp",
"nishitosa.kochi.jp",
"niyodogawa.kochi.jp",
"ochi.kochi.jp",
"okawa.kochi.jp",
"otoyo.kochi.jp",
"otsuki.kochi.jp",
"sakawa.kochi.jp",
"sukumo.kochi.jp",
"susaki.kochi.jp",
"tosa.kochi.jp",
"tosashimizu.kochi.jp",
"toyo.kochi.jp",
"tsuno.kochi.jp",
"umaji.kochi.jp",
"yasuda.kochi.jp",
"yusuhara.kochi.jp",
"amakusa.kumamoto.jp",
"arao.kumamoto.jp",
"aso.kumamoto.jp",
"choyo.kumamoto.jp",
"gyokuto.kumamoto.jp",
"kamiamakusa.kumamoto.jp",
"kikuchi.kumamoto.jp",
"kumamoto.kumamoto.jp",
"mashiki.kumamoto.jp",
"mifune.kumamoto.jp",
"minamata.kumamoto.jp",
"minamioguni.kumamoto.jp",
"nagasu.kumamoto.jp",
"nishihara.kumamoto.jp",
"oguni.kumamoto.jp",
"ozu.kumamoto.jp",
"sumoto.kumamoto.jp",
"takamori.kumamoto.jp",
"uki.kumamoto.jp",
"uto.kumamoto.jp",
"yamaga.kumamoto.jp",
"yamato.kumamoto.jp",
"yatsushiro.kumamoto.jp",
"ayabe.kyoto.jp",
"fukuchiyama.kyoto.jp",
"higashiyama.kyoto.jp",
"ide.kyoto.jp",
"ine.kyoto.jp",
"joyo.kyoto.jp",
"kameoka.kyoto.jp",
"kamo.kyoto.jp",
"kita.kyoto.jp",
"kizu.kyoto.jp",
"kumiyama.kyoto.jp",
"kyotamba.kyoto.jp",
"kyotanabe.kyoto.jp",
"kyotango.kyoto.jp",
"maizuru.kyoto.jp",
"minami.kyoto.jp",
"minamiyamashiro.kyoto.jp",
"miyazu.kyoto.jp",
"muko.kyoto.jp",
"nagaokakyo.kyoto.jp",
"nakagyo.kyoto.jp",
"nantan.kyoto.jp",
"oyamazaki.kyoto.jp",
"sakyo.kyoto.jp",
"seika.kyoto.jp",
"tanabe.kyoto.jp",
"uji.kyoto.jp",
"ujitawara.kyoto.jp",
"wazuka.kyoto.jp",
"yamashina.kyoto.jp",
"yawata.kyoto.jp",
"asahi.mie.jp",
"inabe.mie.jp",
"ise.mie.jp",
"kameyama.mie.jp",
"kawagoe.mie.jp",
"kiho.mie.jp",
"kisosaki.mie.jp",
"kiwa.mie.jp",
"komono.mie.jp",
"kumano.mie.jp",
"kuwana.mie.jp",
"matsusaka.mie.jp",
"meiwa.mie.jp",
"mihama.mie.jp",
"minamiise.mie.jp",
"misugi.mie.jp",
"miyama.mie.jp",
"nabari.mie.jp",
"shima.mie.jp",
"suzuka.mie.jp",
"tado.mie.jp",
"taiki.mie.jp",
"taki.mie.jp",
"tamaki.mie.jp",
"toba.mie.jp",
"tsu.mie.jp",
"udono.mie.jp",
"ureshino.mie.jp",
"watarai.mie.jp",
"yokkaichi.mie.jp",
"furukawa.miyagi.jp",
"higashimatsushima.miyagi.jp",
"ishinomaki.miyagi.jp",
"iwanuma.miyagi.jp",
"kakuda.miyagi.jp",
"kami.miyagi.jp",
"kawasaki.miyagi.jp",
"marumori.miyagi.jp",
"matsushima.miyagi.jp",
"minamisanriku.miyagi.jp",
"misato.miyagi.jp",
"murata.miyagi.jp",
"natori.miyagi.jp",
"ogawara.miyagi.jp",
"ohira.miyagi.jp",
"onagawa.miyagi.jp",
"osaki.miyagi.jp",
"rifu.miyagi.jp",
"semine.miyagi.jp",
"shibata.miyagi.jp",
"shichikashuku.miyagi.jp",
"shikama.miyagi.jp",
"shiogama.miyagi.jp",
"shiroishi.miyagi.jp",
"tagajo.miyagi.jp",
"taiwa.miyagi.jp",
"tome.miyagi.jp",
"tomiya.miyagi.jp",
"wakuya.miyagi.jp",
"watari.miyagi.jp",
"yamamoto.miyagi.jp",
"zao.miyagi.jp",
"aya.miyazaki.jp",
"ebino.miyazaki.jp",
"gokase.miyazaki.jp",
"hyuga.miyazaki.jp",
"kadogawa.miyazaki.jp",
"kawaminami.miyazaki.jp",
"kijo.miyazaki.jp",
"kitagawa.miyazaki.jp",
"kitakata.miyazaki.jp",
"kitaura.miyazaki.jp",
"kobayashi.miyazaki.jp",
"kunitomi.miyazaki.jp",
"kushima.miyazaki.jp",
"mimata.miyazaki.jp",
"miyakonojo.miyazaki.jp",
"miyazaki.miyazaki.jp",
"morotsuka.miyazaki.jp",
"nichinan.miyazaki.jp",
"nishimera.miyazaki.jp",
"nobeoka.miyazaki.jp",
"saito.miyazaki.jp",
"shiiba.miyazaki.jp",
"shintomi.miyazaki.jp",
"takaharu.miyazaki.jp",
"takanabe.miyazaki.jp",
"takazaki.miyazaki.jp",
"tsuno.miyazaki.jp",
"achi.nagano.jp",
"agematsu.nagano.jp",
"anan.nagano.jp",
"aoki.nagano.jp",
"asahi.nagano.jp",
"azumino.nagano.jp",
"chikuhoku.nagano.jp",
"chikuma.nagano.jp",
"chino.nagano.jp",
"fujimi.nagano.jp",
"hakuba.nagano.jp",
"hara.nagano.jp",
"hiraya.nagano.jp",
"iida.nagano.jp",
"iijima.nagano.jp",
"iiyama.nagano.jp",
"iizuna.nagano.jp",
"ikeda.nagano.jp",
"ikusaka.nagano.jp",
"ina.nagano.jp",
"karuizawa.nagano.jp",
"kawakami.nagano.jp",
"kiso.nagano.jp",
"kisofukushima.nagano.jp",
"kitaaiki.nagano.jp",
"komagane.nagano.jp",
"komoro.nagano.jp",
"matsukawa.nagano.jp",
"matsumoto.nagano.jp",
"miasa.nagano.jp",
"minamiaiki.nagano.jp",
"minamimaki.nagano.jp",
"minamiminowa.nagano.jp",
"minowa.nagano.jp",
"miyada.nagano.jp",
"miyota.nagano.jp",
"mochizuki.nagano.jp",
"nagano.nagano.jp",
"nagawa.nagano.jp",
"nagiso.nagano.jp",
"nakagawa.nagano.jp",
"nakano.nagano.jp",
"nozawaonsen.nagano.jp",
"obuse.nagano.jp",
"ogawa.nagano.jp",
"okaya.nagano.jp",
"omachi.nagano.jp",
"omi.nagano.jp",
"ookuwa.nagano.jp",
"ooshika.nagano.jp",
"otaki.nagano.jp",
"otari.nagano.jp",
"sakae.nagano.jp",
"sakaki.nagano.jp",
"saku.nagano.jp",
"sakuho.nagano.jp",
"shimosuwa.nagano.jp",
"shinanomachi.nagano.jp",
"shiojiri.nagano.jp",
"suwa.nagano.jp",
"suzaka.nagano.jp",
"takagi.nagano.jp",
"takamori.nagano.jp",
"takayama.nagano.jp",
"tateshina.nagano.jp",
"tatsuno.nagano.jp",
"togakushi.nagano.jp",
"togura.nagano.jp",
"tomi.nagano.jp",
"ueda.nagano.jp",
"wada.nagano.jp",
"yamagata.nagano.jp",
"yamanouchi.nagano.jp",
"yasaka.nagano.jp",
"yasuoka.nagano.jp",
"chijiwa.nagasaki.jp",
"futsu.nagasaki.jp",
"goto.nagasaki.jp",
"hasami.nagasaki.jp",
"hirado.nagasaki.jp",
"iki.nagasaki.jp",
"isahaya.nagasaki.jp",
"kawatana.nagasaki.jp",
"kuchinotsu.nagasaki.jp",
"matsuura.nagasaki.jp",
"nagasaki.nagasaki.jp",
"obama.nagasaki.jp",
"omura.nagasaki.jp",
"oseto.nagasaki.jp",
"saikai.nagasaki.jp",
"sasebo.nagasaki.jp",
"seihi.nagasaki.jp",
"shimabara.nagasaki.jp",
"shinkamigoto.nagasaki.jp",
"togitsu.nagasaki.jp",
"tsushima.nagasaki.jp",
"unzen.nagasaki.jp",
"ando.nara.jp",
"gose.nara.jp",
"heguri.nara.jp",
"higashiyoshino.nara.jp",
"ikaruga.nara.jp",
"ikoma.nara.jp",
"kamikitayama.nara.jp",
"kanmaki.nara.jp",
"kashiba.nara.jp",
"kashihara.nara.jp",
"katsuragi.nara.jp",
"kawai.nara.jp",
"kawakami.nara.jp",
"kawanishi.nara.jp",
"koryo.nara.jp",
"kurotaki.nara.jp",
"mitsue.nara.jp",
"miyake.nara.jp",
"nara.nara.jp",
"nosegawa.nara.jp",
"oji.nara.jp",
"ouda.nara.jp",
"oyodo.nara.jp",
"sakurai.nara.jp",
"sango.nara.jp",
"shimoichi.nara.jp",
"shimokitayama.nara.jp",
"shinjo.nara.jp",
"soni.nara.jp",
"takatori.nara.jp",
"tawaramoto.nara.jp",
"tenkawa.nara.jp",
"tenri.nara.jp",
"uda.nara.jp",
"yamatokoriyama.nara.jp",
"yamatotakada.nara.jp",
"yamazoe.nara.jp",
"yoshino.nara.jp",
"aga.niigata.jp",
"agano.niigata.jp",
"gosen.niigata.jp",
"itoigawa.niigata.jp",
"izumozaki.niigata.jp",
"joetsu.niigata.jp",
"kamo.niigata.jp",
"kariwa.niigata.jp",
"kashiwazaki.niigata.jp",
"minamiuonuma.niigata.jp",
"mitsuke.niigata.jp",
"muika.niigata.jp",
"murakami.niigata.jp",
"myoko.niigata.jp",
"nagaoka.niigata.jp",
"niigata.niigata.jp",
"ojiya.niigata.jp",
"omi.niigata.jp",
"sado.niigata.jp",
"sanjo.niigata.jp",
"seiro.niigata.jp",
"seirou.niigata.jp",
"sekikawa.niigata.jp",
"shibata.niigata.jp",
"tagami.niigata.jp",
"tainai.niigata.jp",
"tochio.niigata.jp",
"tokamachi.niigata.jp",
"tsubame.niigata.jp",
"tsunan.niigata.jp",
"uonuma.niigata.jp",
"yahiko.niigata.jp",
"yoita.niigata.jp",
"yuzawa.niigata.jp",
"beppu.oita.jp",
"bungoono.oita.jp",
"bungotakada.oita.jp",
"hasama.oita.jp",
"hiji.oita.jp",
"himeshima.oita.jp",
"hita.oita.jp",
"kamitsue.oita.jp",
"kokonoe.oita.jp",
"kuju.oita.jp",
"kunisaki.oita.jp",
"kusu.oita.jp",
"oita.oita.jp",
"saiki.oita.jp",
"taketa.oita.jp",
"tsukumi.oita.jp",
"usa.oita.jp",
"usuki.oita.jp",
"yufu.oita.jp",
"akaiwa.okayama.jp",
"asakuchi.okayama.jp",
"bizen.okayama.jp",
"hayashima.okayama.jp",
"ibara.okayama.jp",
"kagamino.okayama.jp",
"kasaoka.okayama.jp",
"kibichuo.okayama.jp",
"kumenan.okayama.jp",
"kurashiki.okayama.jp",
"maniwa.okayama.jp",
"misaki.okayama.jp",
"nagi.okayama.jp",
"niimi.okayama.jp",
"nishiawakura.okayama.jp",
"okayama.okayama.jp",
"satosho.okayama.jp",
"setouchi.okayama.jp",
"shinjo.okayama.jp",
"shoo.okayama.jp",
"soja.okayama.jp",
"takahashi.okayama.jp",
"tamano.okayama.jp",
"tsuyama.okayama.jp",
"wake.okayama.jp",
"yakage.okayama.jp",
"aguni.okinawa.jp",
"ginowan.okinawa.jp",
"ginoza.okinawa.jp",
"gushikami.okinawa.jp",
"haebaru.okinawa.jp",
"higashi.okinawa.jp",
"hirara.okinawa.jp",
"iheya.okinawa.jp",
"ishigaki.okinawa.jp",
"ishikawa.okinawa.jp",
"itoman.okinawa.jp",
"izena.okinawa.jp",
"kadena.okinawa.jp",
"kin.okinawa.jp",
"kitadaito.okinawa.jp",
"kitanakagusuku.okinawa.jp",
"kumejima.okinawa.jp",
"kunigami.okinawa.jp",
"minamidaito.okinawa.jp",
"motobu.okinawa.jp",
"nago.okinawa.jp",
"naha.okinawa.jp",
"nakagusuku.okinawa.jp",
"nakijin.okinawa.jp",
"nanjo.okinawa.jp",
"nishihara.okinawa.jp",
"ogimi.okinawa.jp",
"okinawa.okinawa.jp",
"onna.okinawa.jp",
"shimoji.okinawa.jp",
"taketomi.okinawa.jp",
"tarama.okinawa.jp",
"tokashiki.okinawa.jp",
"tomigusuku.okinawa.jp",
"tonaki.okinawa.jp",
"urasoe.okinawa.jp",
"uruma.okinawa.jp",
"yaese.okinawa.jp",
"yomitan.okinawa.jp",
"yonabaru.okinawa.jp",
"yonaguni.okinawa.jp",
"zamami.okinawa.jp",
"abeno.osaka.jp",
"chihayaakasaka.osaka.jp",
"chuo.osaka.jp",
"daito.osaka.jp",
"fujiidera.osaka.jp",
"habikino.osaka.jp",
"hannan.osaka.jp",
"higashiosaka.osaka.jp",
"higashisumiyoshi.osaka.jp",
"higashiyodogawa.osaka.jp",
"hirakata.osaka.jp",
"ibaraki.osaka.jp",
"ikeda.osaka.jp",
"izumi.osaka.jp",
"izumiotsu.osaka.jp",
"izumisano.osaka.jp",
"kadoma.osaka.jp",
"kaizuka.osaka.jp",
"kanan.osaka.jp",
"kashiwara.osaka.jp",
"katano.osaka.jp",
"kawachinagano.osaka.jp",
"kishiwada.osaka.jp",
"kita.osaka.jp",
"kumatori.osaka.jp",
"matsubara.osaka.jp",
"minato.osaka.jp",
"minoh.osaka.jp",
"misaki.osaka.jp",
"moriguchi.osaka.jp",
"neyagawa.osaka.jp",
"nishi.osaka.jp",
"nose.osaka.jp",
"osakasayama.osaka.jp",
"sakai.osaka.jp",
"sayama.osaka.jp",
"sennan.osaka.jp",
"settsu.osaka.jp",
"shijonawate.osaka.jp",
"shimamoto.osaka.jp",
"suita.osaka.jp",
"tadaoka.osaka.jp",
"taishi.osaka.jp",
"tajiri.osaka.jp",
"takaishi.osaka.jp",
"takatsuki.osaka.jp",
"tondabayashi.osaka.jp",
"toyonaka.osaka.jp",
"toyono.osaka.jp",
"yao.osaka.jp",
"ariake.saga.jp",
"arita.saga.jp",
"fukudomi.saga.jp",
"genkai.saga.jp",
"hamatama.saga.jp",
"hizen.saga.jp",
"imari.saga.jp",
"kamimine.saga.jp",
"kanzaki.saga.jp",
"karatsu.saga.jp",
"kashima.saga.jp",
"kitagata.saga.jp",
"kitahata.saga.jp",
"kiyama.saga.jp",
"kouhoku.saga.jp",
"kyuragi.saga.jp",
"nishiarita.saga.jp",
"ogi.saga.jp",
"omachi.saga.jp",
"ouchi.saga.jp",
"saga.saga.jp",
"shiroishi.saga.jp",
"taku.saga.jp",
"tara.saga.jp",
"tosu.saga.jp",
"yoshinogari.saga.jp",
"arakawa.saitama.jp",
"asaka.saitama.jp",
"chichibu.saitama.jp",
"fujimi.saitama.jp",
"fujimino.saitama.jp",
"fukaya.saitama.jp",
"hanno.saitama.jp",
"hanyu.saitama.jp",
"hasuda.saitama.jp",
"hatogaya.saitama.jp",
"hatoyama.saitama.jp",
"hidaka.saitama.jp",
"higashichichibu.saitama.jp",
"higashimatsuyama.saitama.jp",
"honjo.saitama.jp",
"ina.saitama.jp",
"iruma.saitama.jp",
"iwatsuki.saitama.jp",
"kamiizumi.saitama.jp",
"kamikawa.saitama.jp",
"kamisato.saitama.jp",
"kasukabe.saitama.jp",
"kawagoe.saitama.jp",
"kawaguchi.saitama.jp",
"kawajima.saitama.jp",
"kazo.saitama.jp",
"kitamoto.saitama.jp",
"koshigaya.saitama.jp",
"kounosu.saitama.jp",
"kuki.saitama.jp",
"kumagaya.saitama.jp",
"matsubushi.saitama.jp",
"minano.saitama.jp",
"misato.saitama.jp",
"miyashiro.saitama.jp",
"miyoshi.saitama.jp",
"moroyama.saitama.jp",
"nagatoro.saitama.jp",
"namegawa.saitama.jp",
"niiza.saitama.jp",
"ogano.saitama.jp",
"ogawa.saitama.jp",
"ogose.saitama.jp",
"okegawa.saitama.jp",
"omiya.saitama.jp",
"otaki.saitama.jp",
"ranzan.saitama.jp",
"ryokami.saitama.jp",
"saitama.saitama.jp",
"sakado.saitama.jp",
"satte.saitama.jp",
"sayama.saitama.jp",
"shiki.saitama.jp",
"shiraoka.saitama.jp",
"soka.saitama.jp",
"sugito.saitama.jp",
"toda.saitama.jp",
"tokigawa.saitama.jp",
"tokorozawa.saitama.jp",
"tsurugashima.saitama.jp",
"urawa.saitama.jp",
"warabi.saitama.jp",
"yashio.saitama.jp",
"yokoze.saitama.jp",
"yono.saitama.jp",
"yorii.saitama.jp",
"yoshida.saitama.jp",
"yoshikawa.saitama.jp",
"yoshimi.saitama.jp",
"aisho.shiga.jp",
"gamo.shiga.jp",
"higashiomi.shiga.jp",
"hikone.shiga.jp",
"koka.shiga.jp",
"konan.shiga.jp",
"kosei.shiga.jp",
"koto.shiga.jp",
"kusatsu.shiga.jp",
"maibara.shiga.jp",
"moriyama.shiga.jp",
"nagahama.shiga.jp",
"nishiazai.shiga.jp",
"notogawa.shiga.jp",
"omihachiman.shiga.jp",
"otsu.shiga.jp",
"ritto.shiga.jp",
"ryuoh.shiga.jp",
"takashima.shiga.jp",
"takatsuki.shiga.jp",
"torahime.shiga.jp",
"toyosato.shiga.jp",
"yasu.shiga.jp",
"akagi.shimane.jp",
"ama.shimane.jp",
"gotsu.shimane.jp",
"hamada.shimane.jp",
"higashiizumo.shimane.jp",
"hikawa.shimane.jp",
"hikimi.shimane.jp",
"izumo.shimane.jp",
"kakinoki.shimane.jp",
"masuda.shimane.jp",
"matsue.shimane.jp",
"misato.shimane.jp",
"nishinoshima.shimane.jp",
"ohda.shimane.jp",
"okinoshima.shimane.jp",
"okuizumo.shimane.jp",
"shimane.shimane.jp",
"tamayu.shimane.jp",
"tsuwano.shimane.jp",
"unnan.shimane.jp",
"yakumo.shimane.jp",
"yasugi.shimane.jp",
"yatsuka.shimane.jp",
"arai.shizuoka.jp",
"atami.shizuoka.jp",
"fuji.shizuoka.jp",
"fujieda.shizuoka.jp",
"fujikawa.shizuoka.jp",
"fujinomiya.shizuoka.jp",
"fukuroi.shizuoka.jp",
"gotemba.shizuoka.jp",
"haibara.shizuoka.jp",
"hamamatsu.shizuoka.jp",
"higashiizu.shizuoka.jp",
"ito.shizuoka.jp",
"iwata.shizuoka.jp",
"izu.shizuoka.jp",
"izunokuni.shizuoka.jp",
"kakegawa.shizuoka.jp",
"kannami.shizuoka.jp",
"kawanehon.shizuoka.jp",
"kawazu.shizuoka.jp",
"kikugawa.shizuoka.jp",
"kosai.shizuoka.jp",
"makinohara.shizuoka.jp",
"matsuzaki.shizuoka.jp",
"minamiizu.shizuoka.jp",
"mishima.shizuoka.jp",
"morimachi.shizuoka.jp",
"nishiizu.shizuoka.jp",
"numazu.shizuoka.jp",
"omaezaki.shizuoka.jp",
"shimada.shizuoka.jp",
"shimizu.shizuoka.jp",
"shimoda.shizuoka.jp",
"shizuoka.shizuoka.jp",
"susono.shizuoka.jp",
"yaizu.shizuoka.jp",
"yoshida.shizuoka.jp",
"ashikaga.tochigi.jp",
"bato.tochigi.jp",
"haga.tochigi.jp",
"ichikai.tochigi.jp",
"iwafune.tochigi.jp",
"kaminokawa.tochigi.jp",
"kanuma.tochigi.jp",
"karasuyama.tochigi.jp",
"kuroiso.tochigi.jp",
"mashiko.tochigi.jp",
"mibu.tochigi.jp",
"moka.tochigi.jp",
"motegi.tochigi.jp",
"nasu.tochigi.jp",
"nasushiobara.tochigi.jp",
"nikko.tochigi.jp",
"nishikata.tochigi.jp",
"nogi.tochigi.jp",
"ohira.tochigi.jp",
"ohtawara.tochigi.jp",
"oyama.tochigi.jp",
"sakura.tochigi.jp",
"sano.tochigi.jp",
"shimotsuke.tochigi.jp",
"shioya.tochigi.jp",
"takanezawa.tochigi.jp",
"tochigi.tochigi.jp",
"tsuga.tochigi.jp",
"ujiie.tochigi.jp",
"utsunomiya.tochigi.jp",
"yaita.tochigi.jp",
"aizumi.tokushima.jp",
"anan.tokushima.jp",
"ichiba.tokushima.jp",
"itano.tokushima.jp",
"kainan.tokushima.jp",
"komatsushima.tokushima.jp",
"matsushige.tokushima.jp",
"mima.tokushima.jp",
"minami.tokushima.jp",
"miyoshi.tokushima.jp",
"mugi.tokushima.jp",
"nakagawa.tokushima.jp",
"naruto.tokushima.jp",
"sanagochi.tokushima.jp",
"shishikui.tokushima.jp",
"tokushima.tokushima.jp",
"wajiki.tokushima.jp",
"adachi.tokyo.jp",
"akiruno.tokyo.jp",
"akishima.tokyo.jp",
"aogashima.tokyo.jp",
"arakawa.tokyo.jp",
"bunkyo.tokyo.jp",
"chiyoda.tokyo.jp",
"chofu.tokyo.jp",
"chuo.tokyo.jp",
"edogawa.tokyo.jp",
"fuchu.tokyo.jp",
"fussa.tokyo.jp",
"hachijo.tokyo.jp",
"hachioji.tokyo.jp",
"hamura.tokyo.jp",
"higashikurume.tokyo.jp",
"higashimurayama.tokyo.jp",
"higashiyamato.tokyo.jp",
"hino.tokyo.jp",
"hinode.tokyo.jp",
"hinohara.tokyo.jp",
"inagi.tokyo.jp",
"itabashi.tokyo.jp",
"katsushika.tokyo.jp",
"kita.tokyo.jp",
"kiyose.tokyo.jp",
"kodaira.tokyo.jp",
"koganei.tokyo.jp",
"kokubunji.tokyo.jp",
"komae.tokyo.jp",
"koto.tokyo.jp",
"kouzushima.tokyo.jp",
"kunitachi.tokyo.jp",
"machida.tokyo.jp",
"meguro.tokyo.jp",
"minato.tokyo.jp",
"mitaka.tokyo.jp",
"mizuho.tokyo.jp",
"musashimurayama.tokyo.jp",
"musashino.tokyo.jp",
"nakano.tokyo.jp",
"nerima.tokyo.jp",
"ogasawara.tokyo.jp",
"okutama.tokyo.jp",
"ome.tokyo.jp",
"oshima.tokyo.jp",
"ota.tokyo.jp",
"setagaya.tokyo.jp",
"shibuya.tokyo.jp",
"shinagawa.tokyo.jp",
"shinjuku.tokyo.jp",
"suginami.tokyo.jp",
"sumida.tokyo.jp",
"tachikawa.tokyo.jp",
"taito.tokyo.jp",
"tama.tokyo.jp",
"toshima.tokyo.jp",
"chizu.tottori.jp",
"hino.tottori.jp",
"kawahara.tottori.jp",
"koge.tottori.jp",
"kotoura.tottori.jp",
"misasa.tottori.jp",
"nanbu.tottori.jp",
"nichinan.tottori.jp",
"sakaiminato.tottori.jp",
"tottori.tottori.jp",
"wakasa.tottori.jp",
"yazu.tottori.jp",
"yonago.tottori.jp",
"asahi.toyama.jp",
"fuchu.toyama.jp",
"fukumitsu.toyama.jp",
"funahashi.toyama.jp",
"himi.toyama.jp",
"imizu.toyama.jp",
"inami.toyama.jp",
"johana.toyama.jp",
"kamiichi.toyama.jp",
"kurobe.toyama.jp",
"nakaniikawa.toyama.jp",
"namerikawa.toyama.jp",
"nanto.toyama.jp",
"nyuzen.toyama.jp",
"oyabe.toyama.jp",
"taira.toyama.jp",
"takaoka.toyama.jp",
"tateyama.toyama.jp",
"toga.toyama.jp",
"tonami.toyama.jp",
"toyama.toyama.jp",
"unazuki.toyama.jp",
"uozu.toyama.jp",
"yamada.toyama.jp",
"arida.wakayama.jp",
"aridagawa.wakayama.jp",
"gobo.wakayama.jp",
"hashimoto.wakayama.jp",
"hidaka.wakayama.jp",
"hirogawa.wakayama.jp",
"inami.wakayama.jp",
"iwade.wakayama.jp",
"kainan.wakayama.jp",
"kamitonda.wakayama.jp",
"katsuragi.wakayama.jp",
"kimino.wakayama.jp",
"kinokawa.wakayama.jp",
"kitayama.wakayama.jp",
"koya.wakayama.jp",
"koza.wakayama.jp",
"kozagawa.wakayama.jp",
"kudoyama.wakayama.jp",
"kushimoto.wakayama.jp",
"mihama.wakayama.jp",
"misato.wakayama.jp",
"nachikatsuura.wakayama.jp",
"shingu.wakayama.jp",
"shirahama.wakayama.jp",
"taiji.wakayama.jp",
"tanabe.wakayama.jp",
"wakayama.wakayama.jp",
"yuasa.wakayama.jp",
"yura.wakayama.jp",
"asahi.yamagata.jp",
"funagata.yamagata.jp",
"higashine.yamagata.jp",
"iide.yamagata.jp",
"kahoku.yamagata.jp",
"kaminoyama.yamagata.jp",
"kaneyama.yamagata.jp",
"kawanishi.yamagata.jp",
"mamurogawa.yamagata.jp",
"mikawa.yamagata.jp",
"murayama.yamagata.jp",
"nagai.yamagata.jp",
"nakayama.yamagata.jp",
"nanyo.yamagata.jp",
"nishikawa.yamagata.jp",
"obanazawa.yamagata.jp",
"oe.yamagata.jp",
"oguni.yamagata.jp",
"ohkura.yamagata.jp",
"oishida.yamagata.jp",
"sagae.yamagata.jp",
"sakata.yamagata.jp",
"sakegawa.yamagata.jp",
"shinjo.yamagata.jp",
"shirataka.yamagata.jp",
"shonai.yamagata.jp",
"takahata.yamagata.jp",
"tendo.yamagata.jp",
"tozawa.yamagata.jp",
"tsuruoka.yamagata.jp",
"yamagata.yamagata.jp",
"yamanobe.yamagata.jp",
"yonezawa.yamagata.jp",
"yuza.yamagata.jp",
"abu.yamaguchi.jp",
"hagi.yamaguchi.jp",
"hikari.yamaguchi.jp",
"hofu.yamaguchi.jp",
"iwakuni.yamaguchi.jp",
"kudamatsu.yamaguchi.jp",
"mitou.yamaguchi.jp",
"nagato.yamaguchi.jp",
"oshima.yamaguchi.jp",
"shimonoseki.yamaguchi.jp",
"shunan.yamaguchi.jp",
"tabuse.yamaguchi.jp",
"tokuyama.yamaguchi.jp",
"toyota.yamaguchi.jp",
"ube.yamaguchi.jp",
"yuu.yamaguchi.jp",
"chuo.yamanashi.jp",
"doshi.yamanashi.jp",
"fuefuki.yamanashi.jp",
"fujikawa.yamanashi.jp",
"fujikawaguchiko.yamanashi.jp",
"fujiyoshida.yamanashi.jp",
"hayakawa.yamanashi.jp",
"hokuto.yamanashi.jp",
"ichikawamisato.yamanashi.jp",
"kai.yamanashi.jp",
"kofu.yamanashi.jp",
"koshu.yamanashi.jp",
"kosuge.yamanashi.jp",
"minami-alps.yamanashi.jp",
"minobu.yamanashi.jp",
"nakamichi.yamanashi.jp",
"nanbu.yamanashi.jp",
"narusawa.yamanashi.jp",
"nirasaki.yamanashi.jp",
"nishikatsura.yamanashi.jp",
"oshino.yamanashi.jp",
"otsuki.yamanashi.jp",
"showa.yamanashi.jp",
"tabayama.yamanashi.jp",
"tsuru.yamanashi.jp",
"uenohara.yamanashi.jp",
"yamanakako.yamanashi.jp",
"yamanashi.yamanashi.jp",
"ke",
"ac.ke",
"co.ke",
"go.ke",
"info.ke",
"me.ke",
"mobi.ke",
"ne.ke",
"or.ke",
"sc.ke",
"kg",
"org.kg",
"net.kg",
"com.kg",
"edu.kg",
"gov.kg",
"mil.kg",
"*.kh",
"ki",
"edu.ki",
"biz.ki",
"net.ki",
"org.ki",
"gov.ki",
"info.ki",
"com.ki",
"km",
"org.km",
"nom.km",
"gov.km",
"prd.km",
"tm.km",
"edu.km",
"mil.km",
"ass.km",
"com.km",
"coop.km",
"asso.km",
"presse.km",
"medecin.km",
"notaires.km",
"pharmaciens.km",
"veterinaire.km",
"gouv.km",
"kn",
"net.kn",
"org.kn",
"edu.kn",
"gov.kn",
"kp",
"com.kp",
"edu.kp",
"gov.kp",
"org.kp",
"rep.kp",
"tra.kp",
"kr",
"ac.kr",
"co.kr",
"es.kr",
"go.kr",
"hs.kr",
"kg.kr",
"mil.kr",
"ms.kr",
"ne.kr",
"or.kr",
"pe.kr",
"re.kr",
"sc.kr",
"busan.kr",
"chungbuk.kr",
"chungnam.kr",
"daegu.kr",
"daejeon.kr",
"gangwon.kr",
"gwangju.kr",
"gyeongbuk.kr",
"gyeonggi.kr",
"gyeongnam.kr",
"incheon.kr",
"jeju.kr",
"jeonbuk.kr",
"jeonnam.kr",
"seoul.kr",
"ulsan.kr",
"kw",
"com.kw",
"edu.kw",
"emb.kw",
"gov.kw",
"ind.kw",
"net.kw",
"org.kw",
"ky",
"com.ky",
"edu.ky",
"net.ky",
"org.ky",
"kz",
"org.kz",
"edu.kz",
"net.kz",
"gov.kz",
"mil.kz",
"com.kz",
"la",
"int.la",
"net.la",
"info.la",
"edu.la",
"gov.la",
"per.la",
"com.la",
"org.la",
"lb",
"com.lb",
"edu.lb",
"gov.lb",
"net.lb",
"org.lb",
"lc",
"com.lc",
"net.lc",
"co.lc",
"org.lc",
"edu.lc",
"gov.lc",
"li",
"lk",
"gov.lk",
"sch.lk",
"net.lk",
"int.lk",
"com.lk",
"org.lk",
"edu.lk",
"ngo.lk",
"soc.lk",
"web.lk",
"ltd.lk",
"assn.lk",
"grp.lk",
"hotel.lk",
"ac.lk",
"lr",
"com.lr",
"edu.lr",
"gov.lr",
"org.lr",
"net.lr",
"ls",
"ac.ls",
"biz.ls",
"co.ls",
"edu.ls",
"gov.ls",
"info.ls",
"net.ls",
"org.ls",
"sc.ls",
"lt",
"gov.lt",
"lu",
"lv",
"com.lv",
"edu.lv",
"gov.lv",
"org.lv",
"mil.lv",
"id.lv",
"net.lv",
"asn.lv",
"conf.lv",
"ly",
"com.ly",
"net.ly",
"gov.ly",
"plc.ly",
"edu.ly",
"sch.ly",
"med.ly",
"org.ly",
"id.ly",
"ma",
"co.ma",
"net.ma",
"gov.ma",
"org.ma",
"ac.ma",
"press.ma",
"mc",
"tm.mc",
"asso.mc",
"md",
"me",
"co.me",
"net.me",
"org.me",
"edu.me",
"ac.me",
"gov.me",
"its.me",
"priv.me",
"mg",
"org.mg",
"nom.mg",
"gov.mg",
"prd.mg",
"tm.mg",
"edu.mg",
"mil.mg",
"com.mg",
"co.mg",
"mh",
"mil",
"mk",
"com.mk",
"org.mk",
"net.mk",
"edu.mk",
"gov.mk",
"inf.mk",
"name.mk",
"ml",
"com.ml",
"edu.ml",
"gouv.ml",
"gov.ml",
"net.ml",
"org.ml",
"presse.ml",
"*.mm",
"mn",
"gov.mn",
"edu.mn",
"org.mn",
"mo",
"com.mo",
"net.mo",
"org.mo",
"edu.mo",
"gov.mo",
"mobi",
"mp",
"mq",
"mr",
"gov.mr",
"ms",
"com.ms",
"edu.ms",
"gov.ms",
"net.ms",
"org.ms",
"mt",
"com.mt",
"edu.mt",
"net.mt",
"org.mt",
"mu",
"com.mu",
"net.mu",
"org.mu",
"gov.mu",
"ac.mu",
"co.mu",
"or.mu",
"museum",
"academy.museum",
"agriculture.museum",
"air.museum",
"airguard.museum",
"alabama.museum",
"alaska.museum",
"amber.museum",
"ambulance.museum",
"american.museum",
"americana.museum",
"americanantiques.museum",
"americanart.museum",
"amsterdam.museum",
"and.museum",
"annefrank.museum",
"anthro.museum",
"anthropology.museum",
"antiques.museum",
"aquarium.museum",
"arboretum.museum",
"archaeological.museum",
"archaeology.museum",
"architecture.museum",
"art.museum",
"artanddesign.museum",
"artcenter.museum",
"artdeco.museum",
"arteducation.museum",
"artgallery.museum",
"arts.museum",
"artsandcrafts.museum",
"asmatart.museum",
"assassination.museum",
"assisi.museum",
"association.museum",
"astronomy.museum",
"atlanta.museum",
"austin.museum",
"australia.museum",
"automotive.museum",
"aviation.museum",
"axis.museum",
"badajoz.museum",
"baghdad.museum",
"bahn.museum",
"bale.museum",
"baltimore.museum",
"barcelona.museum",
"baseball.museum",
"basel.museum",
"baths.museum",
"bauern.museum",
"beauxarts.museum",
"beeldengeluid.museum",
"bellevue.museum",
"bergbau.museum",
"berkeley.museum",
"berlin.museum",
"bern.museum",
"bible.museum",
"bilbao.museum",
"bill.museum",
"birdart.museum",
"birthplace.museum",
"bonn.museum",
"boston.museum",
"botanical.museum",
"botanicalgarden.museum",
"botanicgarden.museum",
"botany.museum",
"brandywinevalley.museum",
"brasil.museum",
"bristol.museum",
"british.museum",
"britishcolumbia.museum",
"broadcast.museum",
"brunel.museum",
"brussel.museum",
"brussels.museum",
"bruxelles.museum",
"building.museum",
"burghof.museum",
"bus.museum",
"bushey.museum",
"cadaques.museum",
"california.museum",
"cambridge.museum",
"can.museum",
"canada.museum",
"capebreton.museum",
"carrier.museum",
"cartoonart.museum",
"casadelamoneda.museum",
"castle.museum",
"castres.museum",
"celtic.museum",
"center.museum",
"chattanooga.museum",
"cheltenham.museum",
"chesapeakebay.museum",
"chicago.museum",
"children.museum",
"childrens.museum",
"childrensgarden.museum",
"chiropractic.museum",
"chocolate.museum",
"christiansburg.museum",
"cincinnati.museum",
"cinema.museum",
"circus.museum",
"civilisation.museum",
"civilization.museum",
"civilwar.museum",
"clinton.museum",
"clock.museum",
"coal.museum",
"coastaldefence.museum",
"cody.museum",
"coldwar.museum",
"collection.museum",
"colonialwilliamsburg.museum",
"coloradoplateau.museum",
"columbia.museum",
"columbus.museum",
"communication.museum",
"communications.museum",
"community.museum",
"computer.museum",
"computerhistory.museum",
"comunicações.museum",
"contemporary.museum",
"contemporaryart.museum",
"convent.museum",
"copenhagen.museum",
"corporation.museum",
"correios-e-telecomunicações.museum",
"corvette.museum",
"costume.museum",
"countryestate.museum",
"county.museum",
"crafts.museum",
"cranbrook.museum",
"creation.museum",
"cultural.museum",
"culturalcenter.museum",
"culture.museum",
"cyber.museum",
"cymru.museum",
"dali.museum",
"dallas.museum",
"database.museum",
"ddr.museum",
"decorativearts.museum",
"delaware.museum",
"delmenhorst.museum",
"denmark.museum",
"depot.museum",
"design.museum",
"detroit.museum",
"dinosaur.museum",
"discovery.museum",
"dolls.museum",
"donostia.museum",
"durham.museum",
"eastafrica.museum",
"eastcoast.museum",
"education.museum",
"educational.museum",
"egyptian.museum",
"eisenbahn.museum",
"elburg.museum",
"elvendrell.museum",
"embroidery.museum",
"encyclopedic.museum",
"england.museum",
"entomology.museum",
"environment.museum",
"environmentalconservation.museum",
"epilepsy.museum",
"essex.museum",
"estate.museum",
"ethnology.museum",
"exeter.museum",
"exhibition.museum",
"family.museum",
"farm.museum",
"farmequipment.museum",
"farmers.museum",
"farmstead.museum",
"field.museum",
"figueres.museum",
"filatelia.museum",
"film.museum",
"fineart.museum",
"finearts.museum",
"finland.museum",
"flanders.museum",
"florida.museum",
"force.museum",
"fortmissoula.museum",
"fortworth.museum",
"foundation.museum",
"francaise.museum",
"frankfurt.museum",
"franziskaner.museum",
"freemasonry.museum",
"freiburg.museum",
"fribourg.museum",
"frog.museum",
"fundacio.museum",
"furniture.museum",
"gallery.museum",
"garden.museum",
"gateway.museum",
"geelvinck.museum",
"gemological.museum",
"geology.museum",
"georgia.museum",
"giessen.museum",
"glas.museum",
"glass.museum",
"gorge.museum",
"grandrapids.museum",
"graz.museum",
"guernsey.museum",
"halloffame.museum",
"hamburg.museum",
"handson.museum",
"harvestcelebration.museum",
"hawaii.museum",
"health.museum",
"heimatunduhren.museum",
"hellas.museum",
"helsinki.museum",
"hembygdsforbund.museum",
"heritage.museum",
"histoire.museum",
"historical.museum",
"historicalsociety.museum",
"historichouses.museum",
"historisch.museum",
"historisches.museum",
"history.museum",
"historyofscience.museum",
"horology.museum",
"house.museum",
"humanities.museum",
"illustration.museum",
"imageandsound.museum",
"indian.museum",
"indiana.museum",
"indianapolis.museum",
"indianmarket.museum",
"intelligence.museum",
"interactive.museum",
"iraq.museum",
"iron.museum",
"isleofman.museum",
"jamison.museum",
"jefferson.museum",
"jerusalem.museum",
"jewelry.museum",
"jewish.museum",
"jewishart.museum",
"jfk.museum",
"journalism.museum",
"judaica.museum",
"judygarland.museum",
"juedisches.museum",
"juif.museum",
"karate.museum",
"karikatur.museum",
"kids.museum",
"koebenhavn.museum",
"koeln.museum",
"kunst.museum",
"kunstsammlung.museum",
"kunstunddesign.museum",
"labor.museum",
"labour.museum",
"lajolla.museum",
"lancashire.museum",
"landes.museum",
"lans.museum",
"läns.museum",
"larsson.museum",
"lewismiller.museum",
"lincoln.museum",
"linz.museum",
"living.museum",
"livinghistory.museum",
"localhistory.museum",
"london.museum",
"losangeles.museum",
"louvre.museum",
"loyalist.museum",
"lucerne.museum",
"luxembourg.museum",
"luzern.museum",
"mad.museum",
"madrid.museum",
"mallorca.museum",
"manchester.museum",
"mansion.museum",
"mansions.museum",
"manx.museum",
"marburg.museum",
"maritime.museum",
"maritimo.museum",
"maryland.museum",
"marylhurst.museum",
"media.museum",
"medical.museum",
"medizinhistorisches.museum",
"meeres.museum",
"memorial.museum",
"mesaverde.museum",
"michigan.museum",
"midatlantic.museum",
"military.museum",
"mill.museum",
"miners.museum",
"mining.museum",
"minnesota.museum",
"missile.museum",
"missoula.museum",
"modern.museum",
"moma.museum",
"money.museum",
"monmouth.museum",
"monticello.museum",
"montreal.museum",
"moscow.museum",
"motorcycle.museum",
"muenchen.museum",
"muenster.museum",
"mulhouse.museum",
"muncie.museum",
"museet.museum",
"museumcenter.museum",
"museumvereniging.museum",
"music.museum",
"national.museum",
"nationalfirearms.museum",
"nationalheritage.museum",
"nativeamerican.museum",
"naturalhistory.museum",
"naturalhistorymuseum.museum",
"naturalsciences.museum",
"nature.museum",
"naturhistorisches.museum",
"natuurwetenschappen.museum",
"naumburg.museum",
"naval.museum",
"nebraska.museum",
"neues.museum",
"newhampshire.museum",
"newjersey.museum",
"newmexico.museum",
"newport.museum",
"newspaper.museum",
"newyork.museum",
"niepce.museum",
"norfolk.museum",
"north.museum",
"nrw.museum",
"nyc.museum",
"nyny.museum",
"oceanographic.museum",
"oceanographique.museum",
"omaha.museum",
"online.museum",
"ontario.museum",
"openair.museum",
"oregon.museum",
"oregontrail.museum",
"otago.museum",
"oxford.museum",
"pacific.museum",
"paderborn.museum",
"palace.museum",
"paleo.museum",
"palmsprings.museum",
"panama.museum",
"paris.museum",
"pasadena.museum",
"pharmacy.museum",
"philadelphia.museum",
"philadelphiaarea.museum",
"philately.museum",
"phoenix.museum",
"photography.museum",
"pilots.museum",
"pittsburgh.museum",
"planetarium.museum",
"plantation.museum",
"plants.museum",
"plaza.museum",
"portal.museum",
"portland.museum",
"portlligat.museum",
"posts-and-telecommunications.museum",
"preservation.museum",
"presidio.museum",
"press.museum",
"project.museum",
"public.museum",
"pubol.museum",
"quebec.museum",
"railroad.museum",
"railway.museum",
"research.museum",
"resistance.museum",
"riodejaneiro.museum",
"rochester.museum",
"rockart.museum",
"roma.museum",
"russia.museum",
"saintlouis.museum",
"salem.museum",
"salvadordali.museum",
"salzburg.museum",
"sandiego.museum",
"sanfrancisco.museum",
"santabarbara.museum",
"santacruz.museum",
"santafe.museum",
"saskatchewan.museum",
"satx.museum",
"savannahga.museum",
"schlesisches.museum",
"schoenbrunn.museum",
"schokoladen.museum",
"school.museum",
"schweiz.museum",
"science.museum",
"scienceandhistory.museum",
"scienceandindustry.museum",
"sciencecenter.museum",
"sciencecenters.museum",
"science-fiction.museum",
"sciencehistory.museum",
"sciences.museum",
"sciencesnaturelles.museum",
"scotland.museum",
"seaport.museum",
"settlement.museum",
"settlers.museum",
"shell.museum",
"sherbrooke.museum",
"sibenik.museum",
"silk.museum",
"ski.museum",
"skole.museum",
"society.museum",
"sologne.museum",
"soundandvision.museum",
"southcarolina.museum",
"southwest.museum",
"space.museum",
"spy.museum",
"square.museum",
"stadt.museum",
"stalbans.museum",
"starnberg.museum",
"state.museum",
"stateofdelaware.museum",
"station.museum",
"steam.museum",
"steiermark.museum",
"stjohn.museum",
"stockholm.museum",
"stpetersburg.museum",
"stuttgart.museum",
"suisse.museum",
"surgeonshall.museum",
"surrey.museum",
"svizzera.museum",
"sweden.museum",
"sydney.museum",
"tank.museum",
"tcm.museum",
"technology.museum",
"telekommunikation.museum",
"television.museum",
"texas.museum",
"textile.museum",
"theater.museum",
"time.museum",
"timekeeping.museum",
"topology.museum",
"torino.museum",
"touch.museum",
"town.museum",
"transport.museum",
"tree.museum",
"trolley.museum",
"trust.museum",
"trustee.museum",
"uhren.museum",
"ulm.museum",
"undersea.museum",
"university.museum",
"usa.museum",
"usantiques.museum",
"usarts.museum",
"uscountryestate.museum",
"usculture.museum",
"usdecorativearts.museum",
"usgarden.museum",
"ushistory.museum",
"ushuaia.museum",
"uslivinghistory.museum",
"utah.museum",
"uvic.museum",
"valley.museum",
"vantaa.museum",
"versailles.museum",
"viking.museum",
"village.museum",
"virginia.museum",
"virtual.museum",
"virtuel.museum",
"vlaanderen.museum",
"volkenkunde.museum",
"wales.museum",
"wallonie.museum",
"war.museum",
"washingtondc.museum",
"watchandclock.museum",
"watch-and-clock.museum",
"western.museum",
"westfalen.museum",
"whaling.museum",
"wildlife.museum",
"williamsburg.museum",
"windmill.museum",
"workshop.museum",
"york.museum",
"yorkshire.museum",
"yosemite.museum",
"youth.museum",
"zoological.museum",
"zoology.museum",
"ירושלים.museum",
"иком.museum",
"mv",
"aero.mv",
"biz.mv",
"com.mv",
"coop.mv",
"edu.mv",
"gov.mv",
"info.mv",
"int.mv",
"mil.mv",
"museum.mv",
"name.mv",
"net.mv",
"org.mv",
"pro.mv",
"mw",
"ac.mw",
"biz.mw",
"co.mw",
"com.mw",
"coop.mw",
"edu.mw",
"gov.mw",
"int.mw",
"museum.mw",
"net.mw",
"org.mw",
"mx",
"com.mx",
"org.mx",
"gob.mx",
"edu.mx",
"net.mx",
"my",
"biz.my",
"com.my",
"edu.my",
"gov.my",
"mil.my",
"name.my",
"net.my",
"org.my",
"mz",
"ac.mz",
"adv.mz",
"co.mz",
"edu.mz",
"gov.mz",
"mil.mz",
"net.mz",
"org.mz",
"na",
"info.na",
"pro.na",
"name.na",
"school.na",
"or.na",
"dr.na",
"us.na",
"mx.na",
"ca.na",
"in.na",
"cc.na",
"tv.na",
"ws.na",
"mobi.na",
"co.na",
"com.na",
"org.na",
"name",
"nc",
"asso.nc",
"nom.nc",
"ne",
"net",
"nf",
"com.nf",
"net.nf",
"per.nf",
"rec.nf",
"web.nf",
"arts.nf",
"firm.nf",
"info.nf",
"other.nf",
"store.nf",
"ng",
"com.ng",
"edu.ng",
"gov.ng",
"i.ng",
"mil.ng",
"mobi.ng",
"name.ng",
"net.ng",
"org.ng",
"sch.ng",
"ni",
"ac.ni",
"biz.ni",
"co.ni",
"com.ni",
"edu.ni",
"gob.ni",
"in.ni",
"info.ni",
"int.ni",
"mil.ni",
"net.ni",
"nom.ni",
"org.ni",
"web.ni",
"nl",
"no",
"fhs.no",
"vgs.no",
"fylkesbibl.no",
"folkebibl.no",
"museum.no",
"idrett.no",
"priv.no",
"mil.no",
"stat.no",
"dep.no",
"kommune.no",
"herad.no",
"aa.no",
"ah.no",
"bu.no",
"fm.no",
"hl.no",
"hm.no",
"jan-mayen.no",
"mr.no",
"nl.no",
"nt.no",
"of.no",
"ol.no",
"oslo.no",
"rl.no",
"sf.no",
"st.no",
"svalbard.no",
"tm.no",
"tr.no",
"va.no",
"vf.no",
"gs.aa.no",
"gs.ah.no",
"gs.bu.no",
"gs.fm.no",
"gs.hl.no",
"gs.hm.no",
"gs.jan-mayen.no",
"gs.mr.no",
"gs.nl.no",
"gs.nt.no",
"gs.of.no",
"gs.ol.no",
"gs.oslo.no",
"gs.rl.no",
"gs.sf.no",
"gs.st.no",
"gs.svalbard.no",
"gs.tm.no",
"gs.tr.no",
"gs.va.no",
"gs.vf.no",
"akrehamn.no",
"åkrehamn.no",
"algard.no",
"ålgård.no",
"arna.no",
"brumunddal.no",
"bryne.no",
"bronnoysund.no",
"brønnøysund.no",
"drobak.no",
"drøbak.no",
"egersund.no",
"fetsund.no",
"floro.no",
"florø.no",
"fredrikstad.no",
"hokksund.no",
"honefoss.no",
"hønefoss.no",
"jessheim.no",
"jorpeland.no",
"jørpeland.no",
"kirkenes.no",
"kopervik.no",
"krokstadelva.no",
"langevag.no",
"langevåg.no",
"leirvik.no",
"mjondalen.no",
"mjøndalen.no",
"mo-i-rana.no",
"mosjoen.no",
"mosjøen.no",
"nesoddtangen.no",
"orkanger.no",
"osoyro.no",
"osøyro.no",
"raholt.no",
"råholt.no",
"sandnessjoen.no",
"sandnessjøen.no",
"skedsmokorset.no",
"slattum.no",
"spjelkavik.no",
"stathelle.no",
"stavern.no",
"stjordalshalsen.no",
"stjørdalshalsen.no",
"tananger.no",
"tranby.no",
"vossevangen.no",
"afjord.no",
"åfjord.no",
"agdenes.no",
"al.no",
"ål.no",
"alesund.no",
"ålesund.no",
"alstahaug.no",
"alta.no",
"áltá.no",
"alaheadju.no",
"álaheadju.no",
"alvdal.no",
"amli.no",
"åmli.no",
"amot.no",
"åmot.no",
"andebu.no",
"andoy.no",
"andøy.no",
"andasuolo.no",
"ardal.no",
"årdal.no",
"aremark.no",
"arendal.no",
"ås.no",
"aseral.no",
"åseral.no",
"asker.no",
"askim.no",
"askvoll.no",
"askoy.no",
"askøy.no",
"asnes.no",
"åsnes.no",
"audnedaln.no",
"aukra.no",
"aure.no",
"aurland.no",
"aurskog-holand.no",
"aurskog-høland.no",
"austevoll.no",
"austrheim.no",
"averoy.no",
"averøy.no",
"balestrand.no",
"ballangen.no",
"balat.no",
"bálát.no",
"balsfjord.no",
"bahccavuotna.no",
"báhccavuotna.no",
"bamble.no",
"bardu.no",
"beardu.no",
"beiarn.no",
"bajddar.no",
"bájddar.no",
"baidar.no",
"báidár.no",
"berg.no",
"bergen.no",
"berlevag.no",
"berlevåg.no",
"bearalvahki.no",
"bearalváhki.no",
"bindal.no",
"birkenes.no",
"bjarkoy.no",
"bjarkøy.no",
"bjerkreim.no",
"bjugn.no",
"bodo.no",
"bodø.no",
"badaddja.no",
"bådåddjå.no",
"budejju.no",
"bokn.no",
"bremanger.no",
"bronnoy.no",
"brønnøy.no",
"bygland.no",
"bykle.no",
"barum.no",
"bærum.no",
"bo.telemark.no",
"bø.telemark.no",
"bo.nordland.no",
"bø.nordland.no",
"bievat.no",
"bievát.no",
"bomlo.no",
"bømlo.no",
"batsfjord.no",
"båtsfjord.no",
"bahcavuotna.no",
"báhcavuotna.no",
"dovre.no",
"drammen.no",
"drangedal.no",
"dyroy.no",
"dyrøy.no",
"donna.no",
"dønna.no",
"eid.no",
"eidfjord.no",
"eidsberg.no",
"eidskog.no",
"eidsvoll.no",
"eigersund.no",
"elverum.no",
"enebakk.no",
"engerdal.no",
"etne.no",
"etnedal.no",
"evenes.no",
"evenassi.no",
"evenášši.no",
"evje-og-hornnes.no",
"farsund.no",
"fauske.no",
"fuossko.no",
"fuoisku.no",
"fedje.no",
"fet.no",
"finnoy.no",
"finnøy.no",
"fitjar.no",
"fjaler.no",
"fjell.no",
"flakstad.no",
"flatanger.no",
"flekkefjord.no",
"flesberg.no",
"flora.no",
"fla.no",
"flå.no",
"folldal.no",
"forsand.no",
"fosnes.no",
"frei.no",
"frogn.no",
"froland.no",
"frosta.no",
"frana.no",
"fræna.no",
"froya.no",
"frøya.no",
"fusa.no",
"fyresdal.no",
"forde.no",
"førde.no",
"gamvik.no",
"gangaviika.no",
"gáŋgaviika.no",
"gaular.no",
"gausdal.no",
"gildeskal.no",
"gildeskål.no",
"giske.no",
"gjemnes.no",
"gjerdrum.no",
"gjerstad.no",
"gjesdal.no",
"gjovik.no",
"gjøvik.no",
"gloppen.no",
"gol.no",
"gran.no",
"grane.no",
"granvin.no",
"gratangen.no",
"grimstad.no",
"grong.no",
"kraanghke.no",
"kråanghke.no",
"grue.no",
"gulen.no",
"hadsel.no",
"halden.no",
"halsa.no",
"hamar.no",
"hamaroy.no",
"habmer.no",
"hábmer.no",
"hapmir.no",
"hápmir.no",
"hammerfest.no",
"hammarfeasta.no",
"hámmárfeasta.no",
"haram.no",
"hareid.no",
"harstad.no",
"hasvik.no",
"aknoluokta.no",
"ákŋoluokta.no",
"hattfjelldal.no",
"aarborte.no",
"haugesund.no",
"hemne.no",
"hemnes.no",
"hemsedal.no",
"heroy.more-og-romsdal.no",
"herøy.møre-og-romsdal.no",
"heroy.nordland.no",
"herøy.nordland.no",
"hitra.no",
"hjartdal.no",
"hjelmeland.no",
"hobol.no",
"hobøl.no",
"hof.no",
"hol.no",
"hole.no",
"holmestrand.no",
"holtalen.no",
"holtålen.no",
"hornindal.no",
"horten.no",
"hurdal.no",
"hurum.no",
"hvaler.no",
"hyllestad.no",
"hagebostad.no",
"hægebostad.no",
"hoyanger.no",
"høyanger.no",
"hoylandet.no",
"høylandet.no",
"ha.no",
"hå.no",
"ibestad.no",
"inderoy.no",
"inderøy.no",
"iveland.no",
"jevnaker.no",
"jondal.no",
"jolster.no",
"jølster.no",
"karasjok.no",
"karasjohka.no",
"kárášjohka.no",
"karlsoy.no",
"galsa.no",
"gálsá.no",
"karmoy.no",
"karmøy.no",
"kautokeino.no",
"guovdageaidnu.no",
"klepp.no",
"klabu.no",
"klæbu.no",
"kongsberg.no",
"kongsvinger.no",
"kragero.no",
"kragerø.no",
"kristiansand.no",
"kristiansund.no",
"krodsherad.no",
"krødsherad.no",
"kvalsund.no",
"rahkkeravju.no",
"ráhkkerávju.no",
"kvam.no",
"kvinesdal.no",
"kvinnherad.no",
"kviteseid.no",
"kvitsoy.no",
"kvitsøy.no",
"kvafjord.no",
"kvæfjord.no",
"giehtavuoatna.no",
"kvanangen.no",
"kvænangen.no",
"navuotna.no",
"návuotna.no",
"kafjord.no",
"kåfjord.no",
"gaivuotna.no",
"gáivuotna.no",
"larvik.no",
"lavangen.no",
"lavagis.no",
"loabat.no",
"loabát.no",
"lebesby.no",
"davvesiida.no",
"leikanger.no",
"leirfjord.no",
"leka.no",
"leksvik.no",
"lenvik.no",
"leangaviika.no",
"leaŋgaviika.no",
"lesja.no",
"levanger.no",
"lier.no",
"lierne.no",
"lillehammer.no",
"lillesand.no",
"lindesnes.no",
"lindas.no",
"lindås.no",
"lom.no",
"loppa.no",
"lahppi.no",
"láhppi.no",
"lund.no",
"lunner.no",
"luroy.no",
"lurøy.no",
"luster.no",
"lyngdal.no",
"lyngen.no",
"ivgu.no",
"lardal.no",
"lerdal.no",
"lærdal.no",
"lodingen.no",
"lødingen.no",
"lorenskog.no",
"lørenskog.no",
"loten.no",
"løten.no",
"malvik.no",
"masoy.no",
"måsøy.no",
"muosat.no",
"muosát.no",
"mandal.no",
"marker.no",
"marnardal.no",
"masfjorden.no",
"meland.no",
"meldal.no",
"melhus.no",
"meloy.no",
"meløy.no",
"meraker.no",
"meråker.no",
"moareke.no",
"moåreke.no",
"midsund.no",
"midtre-gauldal.no",
"modalen.no",
"modum.no",
"molde.no",
"moskenes.no",
"moss.no",
"mosvik.no",
"malselv.no",
"målselv.no",
"malatvuopmi.no",
"málatvuopmi.no",
"namdalseid.no",
"aejrie.no",
"namsos.no",
"namsskogan.no",
"naamesjevuemie.no",
"nååmesjevuemie.no",
"laakesvuemie.no",
"nannestad.no",
"narvik.no",
"narviika.no",
"naustdal.no",
"nedre-eiker.no",
"nes.akershus.no",
"nes.buskerud.no",
"nesna.no",
"nesodden.no",
"nesseby.no",
"unjarga.no",
"unjárga.no",
"nesset.no",
"nissedal.no",
"nittedal.no",
"nord-aurdal.no",
"nord-fron.no",
"nord-odal.no",
"norddal.no",
"nordkapp.no",
"davvenjarga.no",
"davvenjárga.no",
"nordre-land.no",
"nordreisa.no",
"raisa.no",
"ráisa.no",
"nore-og-uvdal.no",
"notodden.no",
"naroy.no",
"nærøy.no",
"notteroy.no",
"nøtterøy.no",
"odda.no",
"oksnes.no",
"øksnes.no",
"oppdal.no",
"oppegard.no",
"oppegård.no",
"orkdal.no",
"orland.no",
"ørland.no",
"orskog.no",
"ørskog.no",
"orsta.no",
"ørsta.no",
"os.hedmark.no",
"os.hordaland.no",
"osen.no",
"osteroy.no",
"osterøy.no",
"ostre-toten.no",
"østre-toten.no",
"overhalla.no",
"ovre-eiker.no",
"øvre-eiker.no",
"oyer.no",
"øyer.no",
"oygarden.no",
"øygarden.no",
"oystre-slidre.no",
"øystre-slidre.no",
"porsanger.no",
"porsangu.no",
"porsáŋgu.no",
"porsgrunn.no",
"radoy.no",
"radøy.no",
"rakkestad.no",
"rana.no",
"ruovat.no",
"randaberg.no",
"rauma.no",
"rendalen.no",
"rennebu.no",
"rennesoy.no",
"rennesøy.no",
"rindal.no",
"ringebu.no",
"ringerike.no",
"ringsaker.no",
"rissa.no",
"risor.no",
"risør.no",
"roan.no",
"rollag.no",
"rygge.no",
"ralingen.no",
"rælingen.no",
"rodoy.no",
"rødøy.no",
"romskog.no",
"rømskog.no",
"roros.no",
"røros.no",
"rost.no",
"røst.no",
"royken.no",
"røyken.no",
"royrvik.no",
"røyrvik.no",
"rade.no",
"råde.no",
"salangen.no",
"siellak.no",
"saltdal.no",
"salat.no",
"sálát.no",
"sálat.no",
"samnanger.no",
"sande.more-og-romsdal.no",
"sande.møre-og-romsdal.no",
"sande.vestfold.no",
"sandefjord.no",
"sandnes.no",
"sandoy.no",
"sandøy.no",
"sarpsborg.no",
"sauda.no",
"sauherad.no",
"sel.no",
"selbu.no",
"selje.no",
"seljord.no",
"sigdal.no",
"siljan.no",
"sirdal.no",
"skaun.no",
"skedsmo.no",
"ski.no",
"skien.no",
"skiptvet.no",
"skjervoy.no",
"skjervøy.no",
"skierva.no",
"skiervá.no",
"skjak.no",
"skjåk.no",
"skodje.no",
"skanland.no",
"skånland.no",
"skanit.no",
"skánit.no",
"smola.no",
"smøla.no",
"snillfjord.no",
"snasa.no",
"snåsa.no",
"snoasa.no",
"snaase.no",
"snåase.no",
"sogndal.no",
"sokndal.no",
"sola.no",
"solund.no",
"songdalen.no",
"sortland.no",
"spydeberg.no",
"stange.no",
"stavanger.no",
"steigen.no",
"steinkjer.no",
"stjordal.no",
"stjørdal.no",
"stokke.no",
"stor-elvdal.no",
"stord.no",
"stordal.no",
"storfjord.no",
"omasvuotna.no",
"strand.no",
"stranda.no",
"stryn.no",
"sula.no",
"suldal.no",
"sund.no",
"sunndal.no",
"surnadal.no",
"sveio.no",
"svelvik.no",
"sykkylven.no",
"sogne.no",
"søgne.no",
"somna.no",
"sømna.no",
"sondre-land.no",
"søndre-land.no",
"sor-aurdal.no",
"sør-aurdal.no",
"sor-fron.no",
"sør-fron.no",
"sor-odal.no",
"sør-odal.no",
"sor-varanger.no",
"sør-varanger.no",
"matta-varjjat.no",
"mátta-várjjat.no",
"sorfold.no",
"sørfold.no",
"sorreisa.no",
"sørreisa.no",
"sorum.no",
"sørum.no",
"tana.no",
"deatnu.no",
"time.no",
"tingvoll.no",
"tinn.no",
"tjeldsund.no",
"dielddanuorri.no",
"tjome.no",
"tjøme.no",
"tokke.no",
"tolga.no",
"torsken.no",
"tranoy.no",
"tranøy.no",
"tromso.no",
"tromsø.no",
"tromsa.no",
"romsa.no",
"trondheim.no",
"troandin.no",
"trysil.no",
"trana.no",
"træna.no",
"trogstad.no",
"trøgstad.no",
"tvedestrand.no",
"tydal.no",
"tynset.no",
"tysfjord.no",
"divtasvuodna.no",
"divttasvuotna.no",
"tysnes.no",
"tysvar.no",
"tysvær.no",
"tonsberg.no",
"tønsberg.no",
"ullensaker.no",
"ullensvang.no",
"ulvik.no",
"utsira.no",
"vadso.no",
"vadsø.no",
"cahcesuolo.no",
"čáhcesuolo.no",
"vaksdal.no",
"valle.no",
"vang.no",
"vanylven.no",
"vardo.no",
"vardø.no",
"varggat.no",
"várggát.no",
"vefsn.no",
"vaapste.no",
"vega.no",
"vegarshei.no",
"vegårshei.no",
"vennesla.no",
"verdal.no",
"verran.no",
"vestby.no",
"vestnes.no",
"vestre-slidre.no",
"vestre-toten.no",
"vestvagoy.no",
"vestvågøy.no",
"vevelstad.no",
"vik.no",
"vikna.no",
"vindafjord.no",
"volda.no",
"voss.no",
"varoy.no",
"værøy.no",
"vagan.no",
"vågan.no",
"voagat.no",
"vagsoy.no",
"vågsøy.no",
"vaga.no",
"vågå.no",
"valer.ostfold.no",
"våler.østfold.no",
"valer.hedmark.no",
"våler.hedmark.no",
"*.np",
"nr",
"biz.nr",
"info.nr",
"gov.nr",
"edu.nr",
"org.nr",
"net.nr",
"com.nr",
"nu",
"nz",
"ac.nz",
"co.nz",
"cri.nz",
"geek.nz",
"gen.nz",
"govt.nz",
"health.nz",
"iwi.nz",
"kiwi.nz",
"maori.nz",
"mil.nz",
"māori.nz",
"net.nz",
"org.nz",
"parliament.nz",
"school.nz",
"om",
"co.om",
"com.om",
"edu.om",
"gov.om",
"med.om",
"museum.om",
"net.om",
"org.om",
"pro.om",
"onion",
"org",
"pa",
"ac.pa",
"gob.pa",
"com.pa",
"org.pa",
"sld.pa",
"edu.pa",
"net.pa",
"ing.pa",
"abo.pa",
"med.pa",
"nom.pa",
"pe",
"edu.pe",
"gob.pe",
"nom.pe",
"mil.pe",
"org.pe",
"com.pe",
"net.pe",
"pf",
"com.pf",
"org.pf",
"edu.pf",
"*.pg",
"ph",
"com.ph",
"net.ph",
"org.ph",
"gov.ph",
"edu.ph",
"ngo.ph",
"mil.ph",
"i.ph",
"pk",
"com.pk",
"net.pk",
"edu.pk",
"org.pk",
"fam.pk",
"biz.pk",
"web.pk",
"gov.pk",
"gob.pk",
"gok.pk",
"gon.pk",
"gop.pk",
"gos.pk",
"info.pk",
"pl",
"com.pl",
"net.pl",
"org.pl",
"aid.pl",
"agro.pl",
"atm.pl",
"auto.pl",
"biz.pl",
"edu.pl",
"gmina.pl",
"gsm.pl",
"info.pl",
"mail.pl",
"miasta.pl",
"media.pl",
"mil.pl",
"nieruchomosci.pl",
"nom.pl",
"pc.pl",
"powiat.pl",
"priv.pl",
"realestate.pl",
"rel.pl",
"sex.pl",
"shop.pl",
"sklep.pl",
"sos.pl",
"szkola.pl",
"targi.pl",
"tm.pl",
"tourism.pl",
"travel.pl",
"turystyka.pl",
"gov.pl",
"ap.gov.pl",
"ic.gov.pl",
"is.gov.pl",
"us.gov.pl",
"kmpsp.gov.pl",
"kppsp.gov.pl",
"kwpsp.gov.pl",
"psp.gov.pl",
"wskr.gov.pl",
"kwp.gov.pl",
"mw.gov.pl",
"ug.gov.pl",
"um.gov.pl",
"umig.gov.pl",
"ugim.gov.pl",
"upow.gov.pl",
"uw.gov.pl",
"starostwo.gov.pl",
"pa.gov.pl",
"po.gov.pl",
"psse.gov.pl",
"pup.gov.pl",
"rzgw.gov.pl",
"sa.gov.pl",
"so.gov.pl",
"sr.gov.pl",
"wsa.gov.pl",
"sko.gov.pl",
"uzs.gov.pl",
"wiih.gov.pl",
"winb.gov.pl",
"pinb.gov.pl",
"wios.gov.pl",
"witd.gov.pl",
"wzmiuw.gov.pl",
"piw.gov.pl",
"wiw.gov.pl",
"griw.gov.pl",
"wif.gov.pl",
"oum.gov.pl",
"sdn.gov.pl",
"zp.gov.pl",
"uppo.gov.pl",
"mup.gov.pl",
"wuoz.gov.pl",
"konsulat.gov.pl",
"oirm.gov.pl",
"augustow.pl",
"babia-gora.pl",
"bedzin.pl",
"beskidy.pl",
"bialowieza.pl",
"bialystok.pl",
"bielawa.pl",
"bieszczady.pl",
"boleslawiec.pl",
"bydgoszcz.pl",
"bytom.pl",
"cieszyn.pl",
"czeladz.pl",
"czest.pl",
"dlugoleka.pl",
"elblag.pl",
"elk.pl",
"glogow.pl",
"gniezno.pl",
"gorlice.pl",
"grajewo.pl",
"ilawa.pl",
"jaworzno.pl",
"jelenia-gora.pl",
"jgora.pl",
"kalisz.pl",
"kazimierz-dolny.pl",
"karpacz.pl",
"kartuzy.pl",
"kaszuby.pl",
"katowice.pl",
"kepno.pl",
"ketrzyn.pl",
"klodzko.pl",
"kobierzyce.pl",
"kolobrzeg.pl",
"konin.pl",
"konskowola.pl",
"kutno.pl",
"lapy.pl",
"lebork.pl",
"legnica.pl",
"lezajsk.pl",
"limanowa.pl",
"lomza.pl",
"lowicz.pl",
"lubin.pl",
"lukow.pl",
"malbork.pl",
"malopolska.pl",
"mazowsze.pl",
"mazury.pl",
"mielec.pl",
"mielno.pl",
"mragowo.pl",
"naklo.pl",
"nowaruda.pl",
"nysa.pl",
"olawa.pl",
"olecko.pl",
"olkusz.pl",
"olsztyn.pl",
"opoczno.pl",
"opole.pl",
"ostroda.pl",
"ostroleka.pl",
"ostrowiec.pl",
"ostrowwlkp.pl",
"pila.pl",
"pisz.pl",
"podhale.pl",
"podlasie.pl",
"polkowice.pl",
"pomorze.pl",
"pomorskie.pl",
"prochowice.pl",
"pruszkow.pl",
"przeworsk.pl",
"pulawy.pl",
"radom.pl",
"rawa-maz.pl",
"rybnik.pl",
"rzeszow.pl",
"sanok.pl",
"sejny.pl",
"slask.pl",
"slupsk.pl",
"sosnowiec.pl",
"stalowa-wola.pl",
"skoczow.pl",
"starachowice.pl",
"stargard.pl",
"suwalki.pl",
"swidnica.pl",
"swiebodzin.pl",
"swinoujscie.pl",
"szczecin.pl",
"szczytno.pl",
"tarnobrzeg.pl",
"tgory.pl",
"turek.pl",
"tychy.pl",
"ustka.pl",
"walbrzych.pl",
"warmia.pl",
"warszawa.pl",
"waw.pl",
"wegrow.pl",
"wielun.pl",
"wlocl.pl",
"wloclawek.pl",
"wodzislaw.pl",
"wolomin.pl",
"wroclaw.pl",
"zachpomor.pl",
"zagan.pl",
"zarow.pl",
"zgora.pl",
"zgorzelec.pl",
"pm",
"pn",
"gov.pn",
"co.pn",
"org.pn",
"edu.pn",
"net.pn",
"post",
"pr",
"com.pr",
"net.pr",
"org.pr",
"gov.pr",
"edu.pr",
"isla.pr",
"pro.pr",
"biz.pr",
"info.pr",
"name.pr",
"est.pr",
"prof.pr",
"ac.pr",
"pro",
"aaa.pro",
"aca.pro",
"acct.pro",
"avocat.pro",
"bar.pro",
"cpa.pro",
"eng.pro",
"jur.pro",
"law.pro",
"med.pro",
"recht.pro",
"ps",
"edu.ps",
"gov.ps",
"sec.ps",
"plo.ps",
"com.ps",
"org.ps",
"net.ps",
"pt",
"net.pt",
"gov.pt",
"org.pt",
"edu.pt",
"int.pt",
"publ.pt",
"com.pt",
"nome.pt",
"pw",
"co.pw",
"ne.pw",
"or.pw",
"ed.pw",
"go.pw",
"belau.pw",
"py",
"com.py",
"coop.py",
"edu.py",
"gov.py",
"mil.py",
"net.py",
"org.py",
"qa",
"com.qa",
"edu.qa",
"gov.qa",
"mil.qa",
"name.qa",
"net.qa",
"org.qa",
"sch.qa",
"re",
"asso.re",
"com.re",
"nom.re",
"ro",
"arts.ro",
"com.ro",
"firm.ro",
"info.ro",
"nom.ro",
"nt.ro",
"org.ro",
"rec.ro",
"store.ro",
"tm.ro",
"www.ro",
"rs",
"ac.rs",
"co.rs",
"edu.rs",
"gov.rs",
"in.rs",
"org.rs",
"ru",
"rw",
"ac.rw",
"co.rw",
"coop.rw",
"gov.rw",
"mil.rw",
"net.rw",
"org.rw",
"sa",
"com.sa",
"net.sa",
"org.sa",
"gov.sa",
"med.sa",
"pub.sa",
"edu.sa",
"sch.sa",
"sb",
"com.sb",
"edu.sb",
"gov.sb",
"net.sb",
"org.sb",
"sc",
"com.sc",
"gov.sc",
"net.sc",
"org.sc",
"edu.sc",
"sd",
"com.sd",
"net.sd",
"org.sd",
"edu.sd",
"med.sd",
"tv.sd",
"gov.sd",
"info.sd",
"se",
"a.se",
"ac.se",
"b.se",
"bd.se",
"brand.se",
"c.se",
"d.se",
"e.se",
"f.se",
"fh.se",
"fhsk.se",
"fhv.se",
"g.se",
"h.se",
"i.se",
"k.se",
"komforb.se",
"kommunalforbund.se",
"komvux.se",
"l.se",
"lanbib.se",
"m.se",
"n.se",
"naturbruksgymn.se",
"o.se",
"org.se",
"p.se",
"parti.se",
"pp.se",
"press.se",
"r.se",
"s.se",
"t.se",
"tm.se",
"u.se",
"w.se",
"x.se",
"y.se",
"z.se",
"sg",
"com.sg",
"net.sg",
"org.sg",
"gov.sg",
"edu.sg",
"per.sg",
"sh",
"com.sh",
"net.sh",
"gov.sh",
"org.sh",
"mil.sh",
"si",
"sj",
"sk",
"sl",
"com.sl",
"net.sl",
"edu.sl",
"gov.sl",
"org.sl",
"sm",
"sn",
"art.sn",
"com.sn",
"edu.sn",
"gouv.sn",
"org.sn",
"perso.sn",
"univ.sn",
"so",
"com.so",
"edu.so",
"gov.so",
"me.so",
"net.so",
"org.so",
"sr",
"ss",
"biz.ss",
"com.ss",
"edu.ss",
"gov.ss",
"me.ss",
"net.ss",
"org.ss",
"sch.ss",
"st",
"co.st",
"com.st",
"consulado.st",
"edu.st",
"embaixada.st",
"mil.st",
"net.st",
"org.st",
"principe.st",
"saotome.st",
"store.st",
"su",
"sv",
"com.sv",
"edu.sv",
"gob.sv",
"org.sv",
"red.sv",
"sx",
"gov.sx",
"sy",
"edu.sy",
"gov.sy",
"net.sy",
"mil.sy",
"com.sy",
"org.sy",
"sz",
"co.sz",
"ac.sz",
"org.sz",
"tc",
"td",
"tel",
"tf",
"tg",
"th",
"ac.th",
"co.th",
"go.th",
"in.th",
"mi.th",
"net.th",
"or.th",
"tj",
"ac.tj",
"biz.tj",
"co.tj",
"com.tj",
"edu.tj",
"go.tj",
"gov.tj",
"int.tj",
"mil.tj",
"name.tj",
"net.tj",
"nic.tj",
"org.tj",
"test.tj",
"web.tj",
"tk",
"tl",
"gov.tl",
"tm",
"com.tm",
"co.tm",
"org.tm",
"net.tm",
"nom.tm",
"gov.tm",
"mil.tm",
"edu.tm",
"tn",
"com.tn",
"ens.tn",
"fin.tn",
"gov.tn",
"ind.tn",
"info.tn",
"intl.tn",
"mincom.tn",
"nat.tn",
"net.tn",
"org.tn",
"perso.tn",
"tourism.tn",
"to",
"com.to",
"gov.to",
"net.to",
"org.to",
"edu.to",
"mil.to",
"tr",
"av.tr",
"bbs.tr",
"bel.tr",
"biz.tr",
"com.tr",
"dr.tr",
"edu.tr",
"gen.tr",
"gov.tr",
"info.tr",
"mil.tr",
"k12.tr",
"kep.tr",
"name.tr",
"net.tr",
"org.tr",
"pol.tr",
"tel.tr",
"tsk.tr",
"tv.tr",
"web.tr",
"nc.tr",
"gov.nc.tr",
"tt",
"co.tt",
"com.tt",
"org.tt",
"net.tt",
"biz.tt",
"info.tt",
"pro.tt",
"int.tt",
"coop.tt",
"jobs.tt",
"mobi.tt",
"travel.tt",
"museum.tt",
"aero.tt",
"name.tt",
"gov.tt",
"edu.tt",
"tv",
"tw",
"edu.tw",
"gov.tw",
"mil.tw",
"com.tw",
"net.tw",
"org.tw",
"idv.tw",
"game.tw",
"ebiz.tw",
"club.tw",
"網路.tw",
"組織.tw",
"商業.tw",
"tz",
"ac.tz",
"co.tz",
"go.tz",
"hotel.tz",
"info.tz",
"me.tz",
"mil.tz",
"mobi.tz",
"ne.tz",
"or.tz",
"sc.tz",
"tv.tz",
"ua",
"com.ua",
"edu.ua",
"gov.ua",
"in.ua",
"net.ua",
"org.ua",
"cherkassy.ua",
"cherkasy.ua",
"chernigov.ua",
"chernihiv.ua",
"chernivtsi.ua",
"chernovtsy.ua",
"ck.ua",
"cn.ua",
"cr.ua",
"crimea.ua",
"cv.ua",
"dn.ua",
"dnepropetrovsk.ua",
"dnipropetrovsk.ua",
"donetsk.ua",
"dp.ua",
"if.ua",
"ivano-frankivsk.ua",
"kh.ua",
"kharkiv.ua",
"kharkov.ua",
"kherson.ua",
"khmelnitskiy.ua",
"khmelnytskyi.ua",
"kiev.ua",
"kirovograd.ua",
"km.ua",
"kr.ua",
"krym.ua",
"ks.ua",
"kv.ua",
"kyiv.ua",
"lg.ua",
"lt.ua",
"lugansk.ua",
"lutsk.ua",
"lv.ua",
"lviv.ua",
"mk.ua",
"mykolaiv.ua",
"nikolaev.ua",
"od.ua",
"odesa.ua",
"odessa.ua",
"pl.ua",
"poltava.ua",
"rivne.ua",
"rovno.ua",
"rv.ua",
"sb.ua",
"sebastopol.ua",
"sevastopol.ua",
"sm.ua",
"sumy.ua",
"te.ua",
"ternopil.ua",
"uz.ua",
"uzhgorod.ua",
"vinnica.ua",
"vinnytsia.ua",
"vn.ua",
"volyn.ua",
"yalta.ua",
"zaporizhzhe.ua",
"zaporizhzhia.ua",
"zhitomir.ua",
"zhytomyr.ua",
"zp.ua",
"zt.ua",
"ug",
"co.ug",
"or.ug",
"ac.ug",
"sc.ug",
"go.ug",
"ne.ug",
"com.ug",
"org.ug",
"uk",
"ac.uk",
"co.uk",
"gov.uk",
"ltd.uk",
"me.uk",
"net.uk",
"nhs.uk",
"org.uk",
"plc.uk",
"police.uk",
"*.sch.uk",
"us",
"dni.us",
"fed.us",
"isa.us",
"kids.us",
"nsn.us",
"ak.us",
"al.us",
"ar.us",
"as.us",
"az.us",
"ca.us",
"co.us",
"ct.us",
"dc.us",
"de.us",
"fl.us",
"ga.us",
"gu.us",
"hi.us",
"ia.us",
"id.us",
"il.us",
"in.us",
"ks.us",
"ky.us",
"la.us",
"ma.us",
"md.us",
"me.us",
"mi.us",
"mn.us",
"mo.us",
"ms.us",
"mt.us",
"nc.us",
"nd.us",
"ne.us",
"nh.us",
"nj.us",
"nm.us",
"nv.us",
"ny.us",
"oh.us",
"ok.us",
"or.us",
"pa.us",
"pr.us",
"ri.us",
"sc.us",
"sd.us",
"tn.us",
"tx.us",
"ut.us",
"vi.us",
"vt.us",
"va.us",
"wa.us",
"wi.us",
"wv.us",
"wy.us",
"k12.ak.us",
"k12.al.us",
"k12.ar.us",
"k12.as.us",
"k12.az.us",
"k12.ca.us",
"k12.co.us",
"k12.ct.us",
"k12.dc.us",
"k12.de.us",
"k12.fl.us",
"k12.ga.us",
"k12.gu.us",
"k12.ia.us",
"k12.id.us",
"k12.il.us",
"k12.in.us",
"k12.ks.us",
"k12.ky.us",
"k12.la.us",
"k12.ma.us",
"k12.md.us",
"k12.me.us",
"k12.mi.us",
"k12.mn.us",
"k12.mo.us",
"k12.ms.us",
"k12.mt.us",
"k12.nc.us",
"k12.ne.us",
"k12.nh.us",
"k12.nj.us",
"k12.nm.us",
"k12.nv.us",
"k12.ny.us",
"k12.oh.us",
"k12.ok.us",
"k12.or.us",
"k12.pa.us",
"k12.pr.us",
"k12.sc.us",
"k12.tn.us",
"k12.tx.us",
"k12.ut.us",
"k12.vi.us",
"k12.vt.us",
"k12.va.us",
"k12.wa.us",
"k12.wi.us",
"k12.wy.us",
"cc.ak.us",
"cc.al.us",
"cc.ar.us",
"cc.as.us",
"cc.az.us",
"cc.ca.us",
"cc.co.us",
"cc.ct.us",
"cc.dc.us",
"cc.de.us",
"cc.fl.us",
"cc.ga.us",
"cc.gu.us",
"cc.hi.us",
"cc.ia.us",
"cc.id.us",
"cc.il.us",
"cc.in.us",
"cc.ks.us",
"cc.ky.us",
"cc.la.us",
"cc.ma.us",
"cc.md.us",
"cc.me.us",
"cc.mi.us",
"cc.mn.us",
"cc.mo.us",
"cc.ms.us",
"cc.mt.us",
"cc.nc.us",
"cc.nd.us",
"cc.ne.us",
"cc.nh.us",
"cc.nj.us",
"cc.nm.us",
"cc.nv.us",
"cc.ny.us",
"cc.oh.us",
"cc.ok.us",
"cc.or.us",
"cc.pa.us",
"cc.pr.us",
"cc.ri.us",
"cc.sc.us",
"cc.sd.us",
"cc.tn.us",
"cc.tx.us",
"cc.ut.us",
"cc.vi.us",
"cc.vt.us",
"cc.va.us",
"cc.wa.us",
"cc.wi.us",
"cc.wv.us",
"cc.wy.us",
"lib.ak.us",
"lib.al.us",
"lib.ar.us",
"lib.as.us",
"lib.az.us",
"lib.ca.us",
"lib.co.us",
"lib.ct.us",
"lib.dc.us",
"lib.fl.us",
"lib.ga.us",
"lib.gu.us",
"lib.hi.us",
"lib.ia.us",
"lib.id.us",
"lib.il.us",
"lib.in.us",
"lib.ks.us",
"lib.ky.us",
"lib.la.us",
"lib.ma.us",
"lib.md.us",
"lib.me.us",
"lib.mi.us",
"lib.mn.us",
"lib.mo.us",
"lib.ms.us",
"lib.mt.us",
"lib.nc.us",
"lib.nd.us",
"lib.ne.us",
"lib.nh.us",
"lib.nj.us",
"lib.nm.us",
"lib.nv.us",
"lib.ny.us",
"lib.oh.us",
"lib.ok.us",
"lib.or.us",
"lib.pa.us",
"lib.pr.us",
"lib.ri.us",
"lib.sc.us",
"lib.sd.us",
"lib.tn.us",
"lib.tx.us",
"lib.ut.us",
"lib.vi.us",
"lib.vt.us",
"lib.va.us",
"lib.wa.us",
"lib.wi.us",
"lib.wy.us",
"pvt.k12.ma.us",
"chtr.k12.ma.us",
"paroch.k12.ma.us",
"ann-arbor.mi.us",
"cog.mi.us",
"dst.mi.us",
"eaton.mi.us",
"gen.mi.us",
"mus.mi.us",
"tec.mi.us",
"washtenaw.mi.us",
"uy",
"com.uy",
"edu.uy",
"gub.uy",
"mil.uy",
"net.uy",
"org.uy",
"uz",
"co.uz",
"com.uz",
"net.uz",
"org.uz",
"va",
"vc",
"com.vc",
"net.vc",
"org.vc",
"gov.vc",
"mil.vc",
"edu.vc",
"ve",
"arts.ve",
"bib.ve",
"co.ve",
"com.ve",
"e12.ve",
"edu.ve",
"firm.ve",
"gob.ve",
"gov.ve",
"info.ve",
"int.ve",
"mil.ve",
"net.ve",
"nom.ve",
"org.ve",
"rar.ve",
"rec.ve",
"store.ve",
"tec.ve",
"web.ve",
"vg",
"vi",
"co.vi",
"com.vi",
"k12.vi",
"net.vi",
"org.vi",
"vn",
"com.vn",
"net.vn",
"org.vn",
"edu.vn",
"gov.vn",
"int.vn",
"ac.vn",
"biz.vn",
"info.vn",
"name.vn",
"pro.vn",
"health.vn",
"vu",
"com.vu",
"edu.vu",
"net.vu",
"org.vu",
"wf",
"ws",
"com.ws",
"net.ws",
"org.ws",
"gov.ws",
"edu.ws",
"yt",
"امارات",
"հայ",
"বাংলা",
"бг",
"البحرين",
"бел",
"中国",
"中國",
"الجزائر",
"مصر",
"ею",
"ευ",
"موريتانيا",
"გე",
"ελ",
"香港",
"公司.香港",
"教育.香港",
"政府.香港",
"個人.香港",
"網絡.香港",
"組織.香港",
"ಭಾರತ",
"ଭାରତ",
"ভাৰত",
"भारतम्",
"भारोत",
"ڀارت",
"ഭാരതം",
"भारत",
"بارت",
"بھارت",
"భారత్",
"ભારત",
"ਭਾਰਤ",
"ভারত",
"இந்தியா",
"ایران",
"ايران",
"عراق",
"الاردن",
"한국",
"қаз",
"ລາວ",
"ලංකා",
"இலங்கை",
"المغرب",
"мкд",
"мон",
"澳門",
"澳门",
"مليسيا",
"عمان",
"پاکستان",
"پاكستان",
"فلسطين",
"срб",
"пр.срб",
"орг.срб",
"обр.срб",
"од.срб",
"упр.срб",
"ак.срб",
"рф",
"قطر",
"السعودية",
"السعودیة",
"السعودیۃ",
"السعوديه",
"سودان",
"新加坡",
"சிங்கப்பூர்",
"سورية",
"سوريا",
"ไทย",
"ศึกษา.ไทย",
"ธุรกิจ.ไทย",
"รัฐบาล.ไทย",
"ทหาร.ไทย",
"เน็ต.ไทย",
"องค์กร.ไทย",
"تونس",
"台灣",
"台湾",
"臺灣",
"укр",
"اليمن",
"xxx",
"ye",
"com.ye",
"edu.ye",
"gov.ye",
"net.ye",
"mil.ye",
"org.ye",
"ac.za",
"agric.za",
"alt.za",
"co.za",
"edu.za",
"gov.za",
"grondar.za",
"law.za",
"mil.za",
"net.za",
"ngo.za",
"nic.za",
"nis.za",
"nom.za",
"org.za",
"school.za",
"tm.za",
"web.za",
"zm",
"ac.zm",
"biz.zm",
"co.zm",
"com.zm",
"edu.zm",
"gov.zm",
"info.zm",
"mil.zm",
"net.zm",
"org.zm",
"sch.zm",
"zw",
"ac.zw",
"co.zw",
"gov.zw",
"mil.zw",
"org.zw",
"aaa",
"aarp",
"abarth",
"abb",
"abbott",
"abbvie",
"abc",
"able",
"abogado",
"abudhabi",
"academy",
"accenture",
"accountant",
"accountants",
"aco",
"actor",
"adac",
"ads",
"adult",
"aeg",
"aetna",
"afl",
"africa",
"agakhan",
"agency",
"aig",
"airbus",
"airforce",
"airtel",
"akdn",
"alfaromeo",
"alibaba",
"alipay",
"allfinanz",
"allstate",
"ally",
"alsace",
"alstom",
"amazon",
"americanexpress",
"americanfamily",
"amex",
"amfam",
"amica",
"amsterdam",
"analytics",
"android",
"anquan",
"anz",
"aol",
"apartments",
"app",
"apple",
"aquarelle",
"arab",
"aramco",
"archi",
"army",
"art",
"arte",
"asda",
"associates",
"athleta",
"attorney",
"auction",
"audi",
"audible",
"audio",
"auspost",
"author",
"auto",
"autos",
"avianca",
"aws",
"axa",
"azure",
"baby",
"baidu",
"banamex",
"bananarepublic",
"band",
"bank",
"bar",
"barcelona",
"barclaycard",
"barclays",
"barefoot",
"bargains",
"baseball",
"basketball",
"bauhaus",
"bayern",
"bbc",
"bbt",
"bbva",
"bcg",
"bcn",
"beats",
"beauty",
"beer",
"bentley",
"berlin",
"best",
"bestbuy",
"bet",
"bharti",
"bible",
"bid",
"bike",
"bing",
"bingo",
"bio",
"black",
"blackfriday",
"blockbuster",
"blog",
"bloomberg",
"blue",
"bms",
"bmw",
"bnpparibas",
"boats",
"boehringer",
"bofa",
"bom",
"bond",
"boo",
"book",
"booking",
"bosch",
"bostik",
"boston",
"bot",
"boutique",
"box",
"bradesco",
"bridgestone",
"broadway",
"broker",
"brother",
"brussels",
"bugatti",
"build",
"builders",
"business",
"buy",
"buzz",
"bzh",
"cab",
"cafe",
"cal",
"call",
"calvinklein",
"cam",
"camera",
"camp",
"cancerresearch",
"canon",
"capetown",
"capital",
"capitalone",
"car",
"caravan",
"cards",
"care",
"career",
"careers",
"cars",
"casa",
"case",
"cash",
"casino",
"catering",
"catholic",
"cba",
"cbn",
"cbre",
"cbs",
"center",
"ceo",
"cern",
"cfa",
"cfd",
"chanel",
"channel",
"charity",
"chase",
"chat",
"cheap",
"chintai",
"christmas",
"chrome",
"church",
"cipriani",
"circle",
"cisco",
"citadel",
"citi",
"citic",
"city",
"cityeats",
"claims",
"cleaning",
"click",
"clinic",
"clinique",
"clothing",
"cloud",
"club",
"clubmed",
"coach",
"codes",
"coffee",
"college",
"cologne",
"comcast",
"commbank",
"community",
"company",
"compare",
"computer",
"comsec",
"condos",
"construction",
"consulting",
"contact",
"contractors",
"cooking",
"cookingchannel",
"cool",
"corsica",
"country",
"coupon",
"coupons",
"courses",
"cpa",
"credit",
"creditcard",
"creditunion",
"cricket",
"crown",
"crs",
"cruise",
"cruises",
"cuisinella",
"cymru",
"cyou",
"dabur",
"dad",
"dance",
"data",
"date",
"dating",
"datsun",
"day",
"dclk",
"dds",
"deal",
"dealer",
"deals",
"degree",
"delivery",
"dell",
"deloitte",
"delta",
"democrat",
"dental",
"dentist",
"desi",
"design",
"dev",
"dhl",
"diamonds",
"diet",
"digital",
"direct",
"directory",
"discount",
"discover",
"dish",
"diy",
"dnp",
"docs",
"doctor",
"dog",
"domains",
"dot",
"download",
"drive",
"dtv",
"dubai",
"dunlop",
"dupont",
"durban",
"dvag",
"dvr",
"earth",
"eat",
"eco",
"edeka",
"education",
"email",
"emerck",
"energy",
"engineer",
"engineering",
"enterprises",
"epson",
"equipment",
"ericsson",
"erni",
"esq",
"estate",
"etisalat",
"eurovision",
"eus",
"events",
"exchange",
"expert",
"exposed",
"express",
"extraspace",
"fage",
"fail",
"fairwinds",
"faith",
"family",
"fan",
"fans",
"farm",
"farmers",
"fashion",
"fast",
"fedex",
"feedback",
"ferrari",
"ferrero",
"fiat",
"fidelity",
"fido",
"film",
"final",
"finance",
"financial",
"fire",
"firestone",
"firmdale",
"fish",
"fishing",
"fit",
"fitness",
"flickr",
"flights",
"flir",
"florist",
"flowers",
"fly",
"foo",
"food",
"foodnetwork",
"football",
"ford",
"forex",
"forsale",
"forum",
"foundation",
"fox",
"free",
"fresenius",
"frl",
"frogans",
"frontdoor",
"frontier",
"ftr",
"fujitsu",
"fun",
"fund",
"furniture",
"futbol",
"fyi",
"gal",
"gallery",
"gallo",
"gallup",
"game",
"games",
"gap",
"garden",
"gay",
"gbiz",
"gdn",
"gea",
"gent",
"genting",
"george",
"ggee",
"gift",
"gifts",
"gives",
"giving",
"glass",
"gle",
"global",
"globo",
"gmail",
"gmbh",
"gmo",
"gmx",
"godaddy",
"gold",
"goldpoint",
"golf",
"goo",
"goodyear",
"goog",
"google",
"gop",
"got",
"grainger",
"graphics",
"gratis",
"green",
"gripe",
"grocery",
"group",
"guardian",
"gucci",
"guge",
"guide",
"guitars",
"guru",
"hair",
"hamburg",
"hangout",
"haus",
"hbo",
"hdfc",
"hdfcbank",
"health",
"healthcare",
"help",
"helsinki",
"here",
"hermes",
"hgtv",
"hiphop",
"hisamitsu",
"hitachi",
"hiv",
"hkt",
"hockey",
"holdings",
"holiday",
"homedepot",
"homegoods",
"homes",
"homesense",
"honda",
"horse",
"hospital",
"host",
"hosting",
"hot",
"hoteles",
"hotels",
"hotmail",
"house",
"how",
"hsbc",
"hughes",
"hyatt",
"hyundai",
"ibm",
"icbc",
"ice",
"icu",
"ieee",
"ifm",
"ikano",
"imamat",
"imdb",
"immo",
"immobilien",
"inc",
"industries",
"infiniti",
"ing",
"ink",
"institute",
"insurance",
"insure",
"international",
"intuit",
"investments",
"ipiranga",
"irish",
"ismaili",
"ist",
"istanbul",
"itau",
"itv",
"jaguar",
"java",
"jcb",
"jeep",
"jetzt",
"jewelry",
"jio",
"jll",
"jmp",
"jnj",
"joburg",
"jot",
"joy",
"jpmorgan",
"jprs",
"juegos",
"juniper",
"kaufen",
"kddi",
"kerryhotels",
"kerrylogistics",
"kerryproperties",
"kfh",
"kia",
"kids",
"kim",
"kinder",
"kindle",
"kitchen",
"kiwi",
"koeln",
"komatsu",
"kosher",
"kpmg",
"kpn",
"krd",
"kred",
"kuokgroup",
"kyoto",
"lacaixa",
"lamborghini",
"lamer",
"lancaster",
"lancia",
"land",
"landrover",
"lanxess",
"lasalle",
"lat",
"latino",
"latrobe",
"law",
"lawyer",
"lds",
"lease",
"leclerc",
"lefrak",
"legal",
"lego",
"lexus",
"lgbt",
"lidl",
"life",
"lifeinsurance",
"lifestyle",
"lighting",
"like",
"lilly",
"limited",
"limo",
"lincoln",
"linde",
"link",
"lipsy",
"live",
"living",
"llc",
"llp",
"loan",
"loans",
"locker",
"locus",
"loft",
"lol",
"london",
"lotte",
"lotto",
"love",
"lpl",
"lplfinancial",
"ltd",
"ltda",
"lundbeck",
"luxe",
"luxury",
"macys",
"madrid",
"maif",
"maison",
"makeup",
"man",
"management",
"mango",
"map",
"market",
"marketing",
"markets",
"marriott",
"marshalls",
"maserati",
"mattel",
"mba",
"mckinsey",
"med",
"media",
"meet",
"melbourne",
"meme",
"memorial",
"men",
"menu",
"merckmsd",
"miami",
"microsoft",
"mini",
"mint",
"mit",
"mitsubishi",
"mlb",
"mls",
"mma",
"mobile",
"moda",
"moe",
"moi",
"mom",
"monash",
"money",
"monster",
"mormon",
"mortgage",
"moscow",
"moto",
"motorcycles",
"mov",
"movie",
"msd",
"mtn",
"mtr",
"music",
"mutual",
"nab",
"nagoya",
"natura",
"navy",
"nba",
"nec",
"netbank",
"netflix",
"network",
"neustar",
"new",
"news",
"next",
"nextdirect",
"nexus",
"nfl",
"ngo",
"nhk",
"nico",
"nike",
"nikon",
"ninja",
"nissan",
"nissay",
"nokia",
"northwesternmutual",
"norton",
"now",
"nowruz",
"nowtv",
"nra",
"nrw",
"ntt",
"nyc",
"obi",
"observer",
"office",
"okinawa",
"olayan",
"olayangroup",
"oldnavy",
"ollo",
"omega",
"one",
"ong",
"onl",
"online",
"ooo",
"open",
"oracle",
"orange",
"organic",
"origins",
"osaka",
"otsuka",
"ott",
"ovh",
"page",
"panasonic",
"paris",
"pars",
"partners",
"parts",
"party",
"passagens",
"pay",
"pccw",
"pet",
"pfizer",
"pharmacy",
"phd",
"philips",
"phone",
"photo",
"photography",
"photos",
"physio",
"pics",
"pictet",
"pictures",
"pid",
"pin",
"ping",
"pink",
"pioneer",
"pizza",
"place",
"play",
"playstation",
"plumbing",
"plus",
"pnc",
"pohl",
"poker",
"politie",
"porn",
"pramerica",
"praxi",
"press",
"prime",
"prod",
"productions",
"prof",
"progressive",
"promo",
"properties",
"property",
"protection",
"pru",
"prudential",
"pub",
"pwc",
"qpon",
"quebec",
"quest",
"racing",
"radio",
"read",
"realestate",
"realtor",
"realty",
"recipes",
"red",
"redstone",
"redumbrella",
"rehab",
"reise",
"reisen",
"reit",
"reliance",
"ren",
"rent",
"rentals",
"repair",
"report",
"republican",
"rest",
"restaurant",
"review",
"reviews",
"rexroth",
"rich",
"richardli",
"ricoh",
"ril",
"rio",
"rip",
"rocher",
"rocks",
"rodeo",
"rogers",
"room",
"rsvp",
"rugby",
"ruhr",
"run",
"rwe",
"ryukyu",
"saarland",
"safe",
"safety",
"sakura",
"sale",
"salon",
"samsclub",
"samsung",
"sandvik",
"sandvikcoromant",
"sanofi",
"sap",
"sarl",
"sas",
"save",
"saxo",
"sbi",
"sbs",
"sca",
"scb",
"schaeffler",
"schmidt",
"scholarships",
"school",
"schule",
"schwarz",
"science",
"scot",
"search",
"seat",
"secure",
"security",
"seek",
"select",
"sener",
"services",
"ses",
"seven",
"sew",
"sex",
"sexy",
"sfr",
"shangrila",
"sharp",
"shaw",
"shell",
"shia",
"shiksha",
"shoes",
"shop",
"shopping",
"shouji",
"show",
"showtime",
"silk",
"sina",
"singles",
"site",
"ski",
"skin",
"sky",
"skype",
"sling",
"smart",
"smile",
"sncf",
"soccer",
"social",
"softbank",
"software",
"sohu",
"solar",
"solutions",
"song",
"sony",
"soy",
"spa",
"space",
"sport",
"spot",
"srl",
"stada",
"staples",
"star",
"statebank",
"statefarm",
"stc",
"stcgroup",
"stockholm",
"storage",
"store",
"stream",
"studio",
"study",
"style",
"sucks",
"supplies",
"supply",
"support",
"surf",
"surgery",
"suzuki",
"swatch",
"swiss",
"sydney",
"systems",
"tab",
"taipei",
"talk",
"taobao",
"target",
"tatamotors",
"tatar",
"tattoo",
"tax",
"taxi",
"tci",
"tdk",
"team",
"tech",
"technology",
"temasek",
"tennis",
"teva",
"thd",
"theater",
"theatre",
"tiaa",
"tickets",
"tienda",
"tiffany",
"tips",
"tires",
"tirol",
"tjmaxx",
"tjx",
"tkmaxx",
"tmall",
"today",
"tokyo",
"tools",
"top",
"toray",
"toshiba",
"total",
"tours",
"town",
"toyota",
"toys",
"trade",
"trading",
"training",
"travel",
"travelchannel",
"travelers",
"travelersinsurance",
"trust",
"trv",
"tube",
"tui",
"tunes",
"tushu",
"tvs",
"ubank",
"ubs",
"unicom",
"university",
"uno",
"uol",
"ups",
"vacations",
"vana",
"vanguard",
"vegas",
"ventures",
"verisign",
"versicherung",
"vet",
"viajes",
"video",
"vig",
"viking",
"villas",
"vin",
"vip",
"virgin",
"visa",
"vision",
"viva",
"vivo",
"vlaanderen",
"vodka",
"volkswagen",
"volvo",
"vote",
"voting",
"voto",
"voyage",
"vuelos",
"wales",
"walmart",
"walter",
"wang",
"wanggou",
"watch",
"watches",
"weather",
"weatherchannel",
"webcam",
"weber",
"website",
"wedding",
"weibo",
"weir",
"whoswho",
"wien",
"wiki",
"williamhill",
"win",
"windows",
"wine",
"winners",
"wme",
"wolterskluwer",
"woodside",
"work",
"works",
"world",
"wow",
"wtc",
"wtf",
"xbox",
"xerox",
"xfinity",
"xihuan",
"xin",
"कॉम",
"セール",
"佛山",
"慈善",
"集团",
"在线",
"点看",
"คอม",
"八卦",
"موقع",
"公益",
"公司",
"香格里拉",
"网站",
"移动",
"我爱你",
"москва",
"католик",
"онлайн",
"сайт",
"联通",
"קום",
"时尚",
"微博",
"淡马锡",
"ファッション",
"орг",
"नेट",
"ストア",
"アマゾン",
"삼성",
"商标",
"商店",
"商城",
"дети",
"ポイント",
"新闻",
"家電",
"كوم",
"中文网",
"中信",
"娱乐",
"谷歌",
"電訊盈科",
"购物",
"クラウド",
"通販",
"网店",
"संगठन",
"餐厅",
"网络",
"ком",
"亚马逊",
"诺基亚",
"食品",
"飞利浦",
"手机",
"ارامكو",
"العليان",
"اتصالات",
"بازار",
"ابوظبي",
"كاثوليك",
"همراه",
"닷컴",
"政府",
"شبكة",
"بيتك",
"عرب",
"机构",
"组织机构",
"健康",
"招聘",
"рус",
"大拿",
"みんな",
"グーグル",
"世界",
"書籍",
"网址",
"닷넷",
"コム",
"天主教",
"游戏",
"vermögensberater",
"vermögensberatung",
"企业",
"信息",
"嘉里大酒店",
"嘉里",
"广东",
"政务",
"xyz",
"yachts",
"yahoo",
"yamaxun",
"yandex",
"yodobashi",
"yoga",
"yokohama",
"you",
"youtube",
"yun",
"zappos",
"zara",
"zero",
"zip",
"zone",
"zuerich",
"cc.ua",
"inf.ua",
"ltd.ua",
"611.to",
"graphox.us",
"*.devcdnaccesso.com",
"adobeaemcloud.com",
"*.dev.adobeaemcloud.com",
"hlx.live",
"adobeaemcloud.net",
"hlx.page",
"hlx3.page",
"beep.pl",
"airkitapps.com",
"airkitapps-au.com",
"airkitapps.eu",
"aivencloud.com",
"barsy.ca",
"*.compute.estate",
"*.alces.network",
"kasserver.com",
"altervista.org",
"alwaysdata.net",
"cloudfront.net",
"*.compute.amazonaws.com",
"*.compute-1.amazonaws.com",
"*.compute.amazonaws.com.cn",
"us-east-1.amazonaws.com",
"cn-north-1.eb.amazonaws.com.cn",
"cn-northwest-1.eb.amazonaws.com.cn",
"elasticbeanstalk.com",
"ap-northeast-1.elasticbeanstalk.com",
"ap-northeast-2.elasticbeanstalk.com",
"ap-northeast-3.elasticbeanstalk.com",
"ap-south-1.elasticbeanstalk.com",
"ap-southeast-1.elasticbeanstalk.com",
"ap-southeast-2.elasticbeanstalk.com",
"ca-central-1.elasticbeanstalk.com",
"eu-central-1.elasticbeanstalk.com",
"eu-west-1.elasticbeanstalk.com",
"eu-west-2.elasticbeanstalk.com",
"eu-west-3.elasticbeanstalk.com",
"sa-east-1.elasticbeanstalk.com",
"us-east-1.elasticbeanstalk.com",
"us-east-2.elasticbeanstalk.com",
"us-gov-west-1.elasticbeanstalk.com",
"us-west-1.elasticbeanstalk.com",
"us-west-2.elasticbeanstalk.com",
"*.elb.amazonaws.com",
"*.elb.amazonaws.com.cn",
"awsglobalaccelerator.com",
"s3.amazonaws.com",
"s3-ap-northeast-1.amazonaws.com",
"s3-ap-northeast-2.amazonaws.com",
"s3-ap-south-1.amazonaws.com",
"s3-ap-southeast-1.amazonaws.com",
"s3-ap-southeast-2.amazonaws.com",
"s3-ca-central-1.amazonaws.com",
"s3-eu-central-1.amazonaws.com",
"s3-eu-west-1.amazonaws.com",
"s3-eu-west-2.amazonaws.com",
"s3-eu-west-3.amazonaws.com",
"s3-external-1.amazonaws.com",
"s3-fips-us-gov-west-1.amazonaws.com",
"s3-sa-east-1.amazonaws.com",
"s3-us-gov-west-1.amazonaws.com",
"s3-us-east-2.amazonaws.com",
"s3-us-west-1.amazonaws.com",
"s3-us-west-2.amazonaws.com",
"s3.ap-northeast-2.amazonaws.com",
"s3.ap-south-1.amazonaws.com",
"s3.cn-north-1.amazonaws.com.cn",
"s3.ca-central-1.amazonaws.com",
"s3.eu-central-1.amazonaws.com",
"s3.eu-west-2.amazonaws.com",
"s3.eu-west-3.amazonaws.com",
"s3.us-east-2.amazonaws.com",
"s3.dualstack.ap-northeast-1.amazonaws.com",
"s3.dualstack.ap-northeast-2.amazonaws.com",
"s3.dualstack.ap-south-1.amazonaws.com",
"s3.dualstack.ap-southeast-1.amazonaws.com",
"s3.dualstack.ap-southeast-2.amazonaws.com",
"s3.dualstack.ca-central-1.amazonaws.com",
"s3.dualstack.eu-central-1.amazonaws.com",
"s3.dualstack.eu-west-1.amazonaws.com",
"s3.dualstack.eu-west-2.amazonaws.com",
"s3.dualstack.eu-west-3.amazonaws.com",
"s3.dualstack.sa-east-1.amazonaws.com",
"s3.dualstack.us-east-1.amazonaws.com",
"s3.dualstack.us-east-2.amazonaws.com",
"s3-website-us-east-1.amazonaws.com",
"s3-website-us-west-1.amazonaws.com",
"s3-website-us-west-2.amazonaws.com",
"s3-website-ap-northeast-1.amazonaws.com",
"s3-website-ap-southeast-1.amazonaws.com",
"s3-website-ap-southeast-2.amazonaws.com",
"s3-website-eu-west-1.amazonaws.com",
"s3-website-sa-east-1.amazonaws.com",
"s3-website.ap-northeast-2.amazonaws.com",
"s3-website.ap-south-1.amazonaws.com",
"s3-website.ca-central-1.amazonaws.com",
"s3-website.eu-central-1.amazonaws.com",
"s3-website.eu-west-2.amazonaws.com",
"s3-website.eu-west-3.amazonaws.com",
"s3-website.us-east-2.amazonaws.com",
"t3l3p0rt.net",
"tele.amune.org",
"apigee.io",
"siiites.com",
"appspacehosted.com",
"appspaceusercontent.com",
"appudo.net",
"on-aptible.com",
"user.aseinet.ne.jp",
"gv.vc",
"d.gv.vc",
"user.party.eus",
"pimienta.org",
"poivron.org",
"potager.org",
"sweetpepper.org",
"myasustor.com",
"cdn.prod.atlassian-dev.net",
"translated.page",
"myfritz.net",
"onavstack.net",
"*.awdev.ca",
"*.advisor.ws",
"ecommerce-shop.pl",
"b-data.io",
"backplaneapp.io",
"balena-devices.com",
"rs.ba",
"*.banzai.cloud",
"app.banzaicloud.io",
"*.backyards.banzaicloud.io",
"base.ec",
"official.ec",
"buyshop.jp",
"fashionstore.jp",
"handcrafted.jp",
"kawaiishop.jp",
"supersale.jp",
"theshop.jp",
"shopselect.net",
"base.shop",
"*.beget.app",
"betainabox.com",
"bnr.la",
"bitbucket.io",
"blackbaudcdn.net",
"of.je",
"bluebite.io",
"boomla.net",
"boutir.com",
"boxfuse.io",
"square7.ch",
"bplaced.com",
"bplaced.de",
"square7.de",
"bplaced.net",
"square7.net",
"shop.brendly.rs",
"browsersafetymark.io",
"uk0.bigv.io",
"dh.bytemark.co.uk",
"vm.bytemark.co.uk",
"cafjs.com",
"mycd.eu",
"drr.ac",
"uwu.ai",
"carrd.co",
"crd.co",
"ju.mp",
"ae.org",
"br.com",
"cn.com",
"com.de",
"com.se",
"de.com",
"eu.com",
"gb.net",
"hu.net",
"jp.net",
"jpn.com",
"mex.com",
"ru.com",
"sa.com",
"se.net",
"uk.com",
"uk.net",
"us.com",
"za.bz",
"za.com",
"ar.com",
"hu.com",
"kr.com",
"no.com",
"qc.com",
"uy.com",
"africa.com",
"gr.com",
"in.net",
"web.in",
"us.org",
"co.com",
"aus.basketball",
"nz.basketball",
"radio.am",
"radio.fm",
"c.la",
"certmgr.org",
"cx.ua",
"discourse.group",
"discourse.team",
"cleverapps.io",
"clerk.app",
"clerkstage.app",
"*.lcl.dev",
"*.lclstage.dev",
"*.stg.dev",
"*.stgstage.dev",
"clickrising.net",
"c66.me",
"cloud66.ws",
"cloud66.zone",
"jdevcloud.com",
"wpdevcloud.com",
"cloudaccess.host",
"freesite.host",
"cloudaccess.net",
"cloudcontrolled.com",
"cloudcontrolapp.com",
"*.cloudera.site",
"pages.dev",
"trycloudflare.com",
"workers.dev",
"wnext.app",
"co.ca",
"*.otap.co",
"co.cz",
"c.cdn77.org",
"cdn77-ssl.net",
"r.cdn77.net",
"rsc.cdn77.org",
"ssl.origin.cdn77-secure.org",
"cloudns.asia",
"cloudns.biz",
"cloudns.club",
"cloudns.cc",
"cloudns.eu",
"cloudns.in",
"cloudns.info",
"cloudns.org",
"cloudns.pro",
"cloudns.pw",
"cloudns.us",
"cnpy.gdn",
"codeberg.page",
"co.nl",
"co.no",
"webhosting.be",
"hosting-cluster.nl",
"ac.ru",
"edu.ru",
"gov.ru",
"int.ru",
"mil.ru",
"test.ru",
"dyn.cosidns.de",
"dynamisches-dns.de",
"dnsupdater.de",
"internet-dns.de",
"l-o-g-i-n.de",
"dynamic-dns.info",
"feste-ip.net",
"knx-server.net",
"static-access.net",
"realm.cz",
"*.cryptonomic.net",
"cupcake.is",
"curv.dev",
"*.customer-oci.com",
"*.oci.customer-oci.com",
"*.ocp.customer-oci.com",
"*.ocs.customer-oci.com",
"cyon.link",
"cyon.site",
"fnwk.site",
"folionetwork.site",
"platform0.app",
"daplie.me",
"localhost.daplie.me",
"dattolocal.com",
"dattorelay.com",
"dattoweb.com",
"mydatto.com",
"dattolocal.net",
"mydatto.net",
"biz.dk",
"co.dk",
"firm.dk",
"reg.dk",
"store.dk",
"dyndns.dappnode.io",
"*.dapps.earth",
"*.bzz.dapps.earth",
"builtwithdark.com",
"demo.datadetect.com",
"instance.datadetect.com",
"edgestack.me",
"ddns5.com",
"debian.net",
"deno.dev",
"deno-staging.dev",
"dedyn.io",
"deta.app",
"deta.dev",
"*.rss.my.id",
"*.diher.solutions",
"discordsays.com",
"discordsez.com",
"jozi.biz",
"dnshome.de",
"online.th",
"shop.th",
"drayddns.com",
"shoparena.pl",
"dreamhosters.com",
"mydrobo.com",
"drud.io",
"drud.us",
"duckdns.org",
"bip.sh",
"bitbridge.net",
"dy.fi",
"tunk.org",
"dyndns-at-home.com",
"dyndns-at-work.com",
"dyndns-blog.com",
"dyndns-free.com",
"dyndns-home.com",
"dyndns-ip.com",
"dyndns-mail.com",
"dyndns-office.com",
"dyndns-pics.com",
"dyndns-remote.com",
"dyndns-server.com",
"dyndns-web.com",
"dyndns-wiki.com",
"dyndns-work.com",
"dyndns.biz",
"dyndns.info",
"dyndns.org",
"dyndns.tv",
"at-band-camp.net",
"ath.cx",
"barrel-of-knowledge.info",
"barrell-of-knowledge.info",
"better-than.tv",
"blogdns.com",
"blogdns.net",
"blogdns.org",
"blogsite.org",
"boldlygoingnowhere.org",
"broke-it.net",
"buyshouses.net",
"cechire.com",
"dnsalias.com",
"dnsalias.net",
"dnsalias.org",
"dnsdojo.com",
"dnsdojo.net",
"dnsdojo.org",
"does-it.net",
"doesntexist.com",
"doesntexist.org",
"dontexist.com",
"dontexist.net",
"dontexist.org",
"doomdns.com",
"doomdns.org",
"dvrdns.org",
"dyn-o-saur.com",
"dynalias.com",
"dynalias.net",
"dynalias.org",
"dynathome.net",
"dyndns.ws",
"endofinternet.net",
"endofinternet.org",
"endoftheinternet.org",
"est-a-la-maison.com",
"est-a-la-masion.com",
"est-le-patron.com",
"est-mon-blogueur.com",
"for-better.biz",
"for-more.biz",
"for-our.info",
"for-some.biz",
"for-the.biz",
"forgot.her.name",
"forgot.his.name",
"from-ak.com",
"from-al.com",
"from-ar.com",
"from-az.net",
"from-ca.com",
"from-co.net",
"from-ct.com",
"from-dc.com",
"from-de.com",
"from-fl.com",
"from-ga.com",
"from-hi.com",
"from-ia.com",
"from-id.com",
"from-il.com",
"from-in.com",
"from-ks.com",
"from-ky.com",
"from-la.net",
"from-ma.com",
"from-md.com",
"from-me.org",
"from-mi.com",
"from-mn.com",
"from-mo.com",
"from-ms.com",
"from-mt.com",
"from-nc.com",
"from-nd.com",
"from-ne.com",
"from-nh.com",
"from-nj.com",
"from-nm.com",
"from-nv.com",
"from-ny.net",
"from-oh.com",
"from-ok.com",
"from-or.com",
"from-pa.com",
"from-pr.com",
"from-ri.com",
"from-sc.com",
"from-sd.com",
"from-tn.com",
"from-tx.com",
"from-ut.com",
"from-va.com",
"from-vt.com",
"from-wa.com",
"from-wi.com",
"from-wv.com",
"from-wy.com",
"ftpaccess.cc",
"fuettertdasnetz.de",
"game-host.org",
"game-server.cc",
"getmyip.com",
"gets-it.net",
"go.dyndns.org",
"gotdns.com",
"gotdns.org",
"groks-the.info",
"groks-this.info",
"ham-radio-op.net",
"here-for-more.info",
"hobby-site.com",
"hobby-site.org",
"home.dyndns.org",
"homedns.org",
"homeftp.net",
"homeftp.org",
"homeip.net",
"homelinux.com",
"homelinux.net",
"homelinux.org",
"homeunix.com",
"homeunix.net",
"homeunix.org",
"iamallama.com",
"in-the-band.net",
"is-a-anarchist.com",
"is-a-blogger.com",
"is-a-bookkeeper.com",
"is-a-bruinsfan.org",
"is-a-bulls-fan.com",
"is-a-candidate.org",
"is-a-caterer.com",
"is-a-celticsfan.org",
"is-a-chef.com",
"is-a-chef.net",
"is-a-chef.org",
"is-a-conservative.com",
"is-a-cpa.com",
"is-a-cubicle-slave.com",
"is-a-democrat.com",
"is-a-designer.com",
"is-a-doctor.com",
"is-a-financialadvisor.com",
"is-a-geek.com",
"is-a-geek.net",
"is-a-geek.org",
"is-a-green.com",
"is-a-guru.com",
"is-a-hard-worker.com",
"is-a-hunter.com",
"is-a-knight.org",
"is-a-landscaper.com",
"is-a-lawyer.com",
"is-a-liberal.com",
"is-a-libertarian.com",
"is-a-linux-user.org",
"is-a-llama.com",
"is-a-musician.com",
"is-a-nascarfan.com",
"is-a-nurse.com",
"is-a-painter.com",
"is-a-patsfan.org",
"is-a-personaltrainer.com",
"is-a-photographer.com",
"is-a-player.com",
"is-a-republican.com",
"is-a-rockstar.com",
"is-a-socialist.com",
"is-a-soxfan.org",
"is-a-student.com",
"is-a-teacher.com",
"is-a-techie.com",
"is-a-therapist.com",
"is-an-accountant.com",
"is-an-actor.com",
"is-an-actress.com",
"is-an-anarchist.com",
"is-an-artist.com",
"is-an-engineer.com",
"is-an-entertainer.com",
"is-by.us",
"is-certified.com",
"is-found.org",
"is-gone.com",
"is-into-anime.com",
"is-into-cars.com",
"is-into-cartoons.com",
"is-into-games.com",
"is-leet.com",
"is-lost.org",
"is-not-certified.com",
"is-saved.org",
"is-slick.com",
"is-uberleet.com",
"is-very-bad.org",
"is-very-evil.org",
"is-very-good.org",
"is-very-nice.org",
"is-very-sweet.org",
"is-with-theband.com",
"isa-geek.com",
"isa-geek.net",
"isa-geek.org",
"isa-hockeynut.com",
"issmarterthanyou.com",
"isteingeek.de",
"istmein.de",
"kicks-ass.net",
"kicks-ass.org",
"knowsitall.info",
"land-4-sale.us",
"lebtimnetz.de",
"leitungsen.de",
"likes-pie.com",
"likescandy.com",
"merseine.nu",
"mine.nu",
"misconfused.org",
"mypets.ws",
"myphotos.cc",
"neat-url.com",
"office-on-the.net",
"on-the-web.tv",
"podzone.net",
"podzone.org",
"readmyblog.org",
"saves-the-whales.com",
"scrapper-site.net",
"scrapping.cc",
"selfip.biz",
"selfip.com",
"selfip.info",
"selfip.net",
"selfip.org",
"sells-for-less.com",
"sells-for-u.com",
"sells-it.net",
"sellsyourhome.org",
"servebbs.com",
"servebbs.net",
"servebbs.org",
"serveftp.net",
"serveftp.org",
"servegame.org",
"shacknet.nu",
"simple-url.com",
"space-to-rent.com",
"stuff-4-sale.org",
"stuff-4-sale.us",
"teaches-yoga.com",
"thruhere.net",
"traeumtgerade.de",
"webhop.biz",
"webhop.info",
"webhop.net",
"webhop.org",
"worse-than.tv",
"writesthisblog.com",
"ddnss.de",
"dyn.ddnss.de",
"dyndns.ddnss.de",
"dyndns1.de",
"dyn-ip24.de",
"home-webserver.de",
"dyn.home-webserver.de",
"myhome-server.de",
"ddnss.org",
"definima.net",
"definima.io",
"ondigitalocean.app",
"*.digitaloceanspaces.com",
"bci.dnstrace.pro",
"ddnsfree.com",
"ddnsgeek.com",
"giize.com",
"gleeze.com",
"kozow.com",
"loseyourip.com",
"ooguy.com",
"theworkpc.com",
"casacam.net",
"dynu.net",
"accesscam.org",
"camdvr.org",
"freeddns.org",
"mywire.org",
"webredirect.org",
"myddns.rocks",
"blogsite.xyz",
"dynv6.net",
"e4.cz",
"eero.online",
"eero-stage.online",
"elementor.cloud",
"elementor.cool",
"en-root.fr",
"mytuleap.com",
"tuleap-partners.com",
"encr.app",
"encoreapi.com",
"onred.one",
"staging.onred.one",
"eu.encoway.cloud",
"eu.org",
"al.eu.org",
"asso.eu.org",
"at.eu.org",
"au.eu.org",
"be.eu.org",
"bg.eu.org",
"ca.eu.org",
"cd.eu.org",
"ch.eu.org",
"cn.eu.org",
"cy.eu.org",
"cz.eu.org",
"de.eu.org",
"dk.eu.org",
"edu.eu.org",
"ee.eu.org",
"es.eu.org",
"fi.eu.org",
"fr.eu.org",
"gr.eu.org",
"hr.eu.org",
"hu.eu.org",
"ie.eu.org",
"il.eu.org",
"in.eu.org",
"int.eu.org",
"is.eu.org",
"it.eu.org",
"jp.eu.org",
"kr.eu.org",
"lt.eu.org",
"lu.eu.org",
"lv.eu.org",
"mc.eu.org",
"me.eu.org",
"mk.eu.org",
"mt.eu.org",
"my.eu.org",
"net.eu.org",
"ng.eu.org",
"nl.eu.org",
"no.eu.org",
"nz.eu.org",
"paris.eu.org",
"pl.eu.org",
"pt.eu.org",
"q-a.eu.org",
"ro.eu.org",
"ru.eu.org",
"se.eu.org",
"si.eu.org",
"sk.eu.org",
"tr.eu.org",
"uk.eu.org",
"us.eu.org",
"eurodir.ru",
"eu-1.evennode.com",
"eu-2.evennode.com",
"eu-3.evennode.com",
"eu-4.evennode.com",
"us-1.evennode.com",
"us-2.evennode.com",
"us-3.evennode.com",
"us-4.evennode.com",
"twmail.cc",
"twmail.net",
"twmail.org",
"mymailer.com.tw",
"url.tw",
"onfabrica.com",
"apps.fbsbx.com",
"ru.net",
"adygeya.ru",
"bashkiria.ru",
"bir.ru",
"cbg.ru",
"com.ru",
"dagestan.ru",
"grozny.ru",
"kalmykia.ru",
"kustanai.ru",
"marine.ru",
"mordovia.ru",
"msk.ru",
"mytis.ru",
"nalchik.ru",
"nov.ru",
"pyatigorsk.ru",
"spb.ru",
"vladikavkaz.ru",
"vladimir.ru",
"abkhazia.su",
"adygeya.su",
"aktyubinsk.su",
"arkhangelsk.su",
"armenia.su",
"ashgabad.su",
"azerbaijan.su",
"balashov.su",
"bashkiria.su",
"bryansk.su",
"bukhara.su",
"chimkent.su",
"dagestan.su",
"east-kazakhstan.su",
"exnet.su",
"georgia.su",
"grozny.su",
"ivanovo.su",
"jambyl.su",
"kalmykia.su",
"kaluga.su",
"karacol.su",
"karaganda.su",
"karelia.su",
"khakassia.su",
"krasnodar.su",
"kurgan.su",
"kustanai.su",
"lenug.su",
"mangyshlak.su",
"mordovia.su",
"msk.su",
"murmansk.su",
"nalchik.su",
"navoi.su",
"north-kazakhstan.su",
"nov.su",
"obninsk.su",
"penza.su",
"pokrovsk.su",
"sochi.su",
"spb.su",
"tashkent.su",
"termez.su",
"togliatti.su",
"troitsk.su",
"tselinograd.su",
"tula.su",
"tuva.su",
"vladikavkaz.su",
"vladimir.su",
"vologda.su",
"channelsdvr.net",
"u.channelsdvr.net",
"edgecompute.app",
"fastly-terrarium.com",
"fastlylb.net",
"map.fastlylb.net",
"freetls.fastly.net",
"map.fastly.net",
"a.prod.fastly.net",
"global.prod.fastly.net",
"a.ssl.fastly.net",
"b.ssl.fastly.net",
"global.ssl.fastly.net",
"fastvps-server.com",
"fastvps.host",
"myfast.host",
"fastvps.site",
"myfast.space",
"fedorainfracloud.org",
"fedorapeople.org",
"cloud.fedoraproject.org",
"app.os.fedoraproject.org",
"app.os.stg.fedoraproject.org",
"conn.uk",
"copro.uk",
"hosp.uk",
"mydobiss.com",
"fh-muenster.io",
"filegear.me",
"filegear-au.me",
"filegear-de.me",
"filegear-gb.me",
"filegear-ie.me",
"filegear-jp.me",
"filegear-sg.me",
"firebaseapp.com",
"fireweb.app",
"flap.id",
"onflashdrive.app",
"fldrv.com",
"fly.dev",
"edgeapp.net",
"shw.io",
"flynnhosting.net",
"forgeblocks.com",
"id.forgerock.io",
"framer.app",
"framercanvas.com",
"*.frusky.de",
"ravpage.co.il",
"0e.vc",
"freebox-os.com",
"freeboxos.com",
"fbx-os.fr",
"fbxos.fr",
"freebox-os.fr",
"freeboxos.fr",
"freedesktop.org",
"freemyip.com",
"wien.funkfeuer.at",
"*.futurecms.at",
"*.ex.futurecms.at",
"*.in.futurecms.at",
"futurehosting.at",
"futuremailing.at",
"*.ex.ortsinfo.at",
"*.kunden.ortsinfo.at",
"*.statics.cloud",
"independent-commission.uk",
"independent-inquest.uk",
"independent-inquiry.uk",
"independent-panel.uk",
"independent-review.uk",
"public-inquiry.uk",
"royal-commission.uk",
"campaign.gov.uk",
"service.gov.uk",
"api.gov.uk",
"gehirn.ne.jp",
"usercontent.jp",
"gentapps.com",
"gentlentapis.com",
"lab.ms",
"cdn-edges.net",
"ghost.io",
"gsj.bz",
"githubusercontent.com",
"githubpreview.dev",
"github.io",
"gitlab.io",
"gitapp.si",
"gitpage.si",
"glitch.me",
"nog.community",
"co.ro",
"shop.ro",
"lolipop.io",
"angry.jp",
"babyblue.jp",
"babymilk.jp",
"backdrop.jp",
"bambina.jp",
"bitter.jp",
"blush.jp",
"boo.jp",
"boy.jp",
"boyfriend.jp",
"but.jp",
"candypop.jp",
"capoo.jp",
"catfood.jp",
"cheap.jp",
"chicappa.jp",
"chillout.jp",
"chips.jp",
"chowder.jp",
"chu.jp",
"ciao.jp",
"cocotte.jp",
"coolblog.jp",
"cranky.jp",
"cutegirl.jp",
"daa.jp",
"deca.jp",
"deci.jp",
"digick.jp",
"egoism.jp",
"fakefur.jp",
"fem.jp",
"flier.jp",
"floppy.jp",
"fool.jp",
"frenchkiss.jp",
"girlfriend.jp",
"girly.jp",
"gloomy.jp",
"gonna.jp",
"greater.jp",
"hacca.jp",
"heavy.jp",
"her.jp",
"hiho.jp",
"hippy.jp",
"holy.jp",
"hungry.jp",
"icurus.jp",
"itigo.jp",
"jellybean.jp",
"kikirara.jp",
"kill.jp",
"kilo.jp",
"kuron.jp",
"littlestar.jp",
"lolipopmc.jp",
"lolitapunk.jp",
"lomo.jp",
"lovepop.jp",
"lovesick.jp",
"main.jp",
"mods.jp",
"mond.jp",
"mongolian.jp",
"moo.jp",
"namaste.jp",
"nikita.jp",
"nobushi.jp",
"noor.jp",
"oops.jp",
"parallel.jp",
"parasite.jp",
"pecori.jp",
"peewee.jp",
"penne.jp",
"pepper.jp",
"perma.jp",
"pigboat.jp",
"pinoko.jp",
"punyu.jp",
"pupu.jp",
"pussycat.jp",
"pya.jp",
"raindrop.jp",
"readymade.jp",
"sadist.jp",
"schoolbus.jp",
"secret.jp",
"staba.jp",
"stripper.jp",
"sub.jp",
"sunnyday.jp",
"thick.jp",
"tonkotsu.jp",
"under.jp",
"upper.jp",
"velvet.jp",
"verse.jp",
"versus.jp",
"vivian.jp",
"watson.jp",
"weblike.jp",
"whitesnow.jp",
"zombie.jp",
"heteml.net",
"cloudapps.digital",
"london.cloudapps.digital",
"pymnt.uk",
"homeoffice.gov.uk",
"ro.im",
"goip.de",
"run.app",
"a.run.app",
"web.app",
"*.0emm.com",
"appspot.com",
"*.r.appspot.com",
"codespot.com",
"googleapis.com",
"googlecode.com",
"pagespeedmobilizer.com",
"publishproxy.com",
"withgoogle.com",
"withyoutube.com",
"*.gateway.dev",
"cloud.goog",
"translate.goog",
"*.usercontent.goog",
"cloudfunctions.net",
"blogspot.ae",
"blogspot.al",
"blogspot.am",
"blogspot.ba",
"blogspot.be",
"blogspot.bg",
"blogspot.bj",
"blogspot.ca",
"blogspot.cf",
"blogspot.ch",
"blogspot.cl",
"blogspot.co.at",
"blogspot.co.id",
"blogspot.co.il",
"blogspot.co.ke",
"blogspot.co.nz",
"blogspot.co.uk",
"blogspot.co.za",
"blogspot.com",
"blogspot.com.ar",
"blogspot.com.au",
"blogspot.com.br",
"blogspot.com.by",
"blogspot.com.co",
"blogspot.com.cy",
"blogspot.com.ee",
"blogspot.com.eg",
"blogspot.com.es",
"blogspot.com.mt",
"blogspot.com.ng",
"blogspot.com.tr",
"blogspot.com.uy",
"blogspot.cv",
"blogspot.cz",
"blogspot.de",
"blogspot.dk",
"blogspot.fi",
"blogspot.fr",
"blogspot.gr",
"blogspot.hk",
"blogspot.hr",
"blogspot.hu",
"blogspot.ie",
"blogspot.in",
"blogspot.is",
"blogspot.it",
"blogspot.jp",
"blogspot.kr",
"blogspot.li",
"blogspot.lt",
"blogspot.lu",
"blogspot.md",
"blogspot.mk",
"blogspot.mr",
"blogspot.mx",
"blogspot.my",
"blogspot.nl",
"blogspot.no",
"blogspot.pe",
"blogspot.pt",
"blogspot.qa",
"blogspot.re",
"blogspot.ro",
"blogspot.rs",
"blogspot.ru",
"blogspot.se",
"blogspot.sg",
"blogspot.si",
"blogspot.sk",
"blogspot.sn",
"blogspot.td",
"blogspot.tw",
"blogspot.ug",
"blogspot.vn",
"goupile.fr",
"gov.nl",
"awsmppl.com",
"günstigbestellen.de",
"günstigliefern.de",
"fin.ci",
"free.hr",
"caa.li",
"ua.rs",
"conf.se",
"hs.zone",
"hs.run",
"hashbang.sh",
"hasura.app",
"hasura-app.io",
"pages.it.hs-heilbronn.de",
"hepforge.org",
"herokuapp.com",
"herokussl.com",
"ravendb.cloud",
"myravendb.com",
"ravendb.community",
"ravendb.me",
"development.run",
"ravendb.run",
"homesklep.pl",
"secaas.hk",
"hoplix.shop",
"orx.biz",
"biz.gl",
"col.ng",
"firm.ng",
"gen.ng",
"ltd.ng",
"ngo.ng",
"edu.scot",
"sch.so",
"hostyhosting.io",
"häkkinen.fi",
"*.moonscale.io",
"moonscale.net",
"iki.fi",
"ibxos.it",
"iliadboxos.it",
"impertrixcdn.com",
"impertrix.com",
"smushcdn.com",
"wphostedmail.com",
"wpmucdn.com",
"tempurl.host",
"wpmudev.host",
"dyn-berlin.de",
"in-berlin.de",
"in-brb.de",
"in-butter.de",
"in-dsl.de",
"in-dsl.net",
"in-dsl.org",
"in-vpn.de",
"in-vpn.net",
"in-vpn.org",
"biz.at",
"info.at",
"info.cx",
"ac.leg.br",
"al.leg.br",
"am.leg.br",
"ap.leg.br",
"ba.leg.br",
"ce.leg.br",
"df.leg.br",
"es.leg.br",
"go.leg.br",
"ma.leg.br",
"mg.leg.br",
"ms.leg.br",
"mt.leg.br",
"pa.leg.br",
"pb.leg.br",
"pe.leg.br",
"pi.leg.br",
"pr.leg.br",
"rj.leg.br",
"rn.leg.br",
"ro.leg.br",
"rr.leg.br",
"rs.leg.br",
"sc.leg.br",
"se.leg.br",
"sp.leg.br",
"to.leg.br",
"pixolino.com",
"na4u.ru",
"iopsys.se",
"ipifony.net",
"iservschule.de",
"mein-iserv.de",
"schulplattform.de",
"schulserver.de",
"test-iserv.de",
"iserv.dev",
"iobb.net",
"mel.cloudlets.com.au",
"cloud.interhostsolutions.be",
"users.scale.virtualcloud.com.br",
"mycloud.by",
"alp1.ae.flow.ch",
"appengine.flow.ch",
"es-1.axarnet.cloud",
"diadem.cloud",
"vip.jelastic.cloud",
"jele.cloud",
"it1.eur.aruba.jenv-aruba.cloud",
"it1.jenv-aruba.cloud",
"keliweb.cloud",
"cs.keliweb.cloud",
"oxa.cloud",
"tn.oxa.cloud",
"uk.oxa.cloud",
"primetel.cloud",
"uk.primetel.cloud",
"ca.reclaim.cloud",
"uk.reclaim.cloud",
"us.reclaim.cloud",
"ch.trendhosting.cloud",
"de.trendhosting.cloud",
"jele.club",
"amscompute.com",
"clicketcloud.com",
"dopaas.com",
"hidora.com",
"paas.hosted-by-previder.com",
"rag-cloud.hosteur.com",
"rag-cloud-ch.hosteur.com",
"jcloud.ik-server.com",
"jcloud-ver-jpc.ik-server.com",
"demo.jelastic.com",
"kilatiron.com",
"paas.massivegrid.com",
"jed.wafaicloud.com",
"lon.wafaicloud.com",
"ryd.wafaicloud.com",
"j.scaleforce.com.cy",
"jelastic.dogado.eu",
"fi.cloudplatform.fi",
"demo.datacenter.fi",
"paas.datacenter.fi",
"jele.host",
"mircloud.host",
"paas.beebyte.io",
"sekd1.beebyteapp.io",
"jele.io",
"cloud-fr1.unispace.io",
"jc.neen.it",
"cloud.jelastic.open.tim.it",
"jcloud.kz",
"upaas.kazteleport.kz",
"cloudjiffy.net",
"fra1-de.cloudjiffy.net",
"west1-us.cloudjiffy.net",
"jls-sto1.elastx.net",
"jls-sto2.elastx.net",
"jls-sto3.elastx.net",
"faststacks.net",
"fr-1.paas.massivegrid.net",
"lon-1.paas.massivegrid.net",
"lon-2.paas.massivegrid.net",
"ny-1.paas.massivegrid.net",
"ny-2.paas.massivegrid.net",
"sg-1.paas.massivegrid.net",
"jelastic.saveincloud.net",
"nordeste-idc.saveincloud.net",
"j.scaleforce.net",
"jelastic.tsukaeru.net",
"sdscloud.pl",
"unicloud.pl",
"mircloud.ru",
"jelastic.regruhosting.ru",
"enscaled.sg",
"jele.site",
"jelastic.team",
"orangecloud.tn",
"j.layershift.co.uk",
"phx.enscaled.us",
"mircloud.us",
"myjino.ru",
"*.hosting.myjino.ru",
"*.landing.myjino.ru",
"*.spectrum.myjino.ru",
"*.vps.myjino.ru",
"jotelulu.cloud",
"*.triton.zone",
"*.cns.joyent.com",
"js.org",
"kaas.gg",
"khplay.nl",
"ktistory.com",
"kapsi.fi",
"keymachine.de",
"kinghost.net",
"uni5.net",
"knightpoint.systems",
"koobin.events",
"oya.to",
"kuleuven.cloud",
"ezproxy.kuleuven.be",
"co.krd",
"edu.krd",
"krellian.net",
"webthings.io",
"git-repos.de",
"lcube-server.de",
"svn-repos.de",
"leadpages.co",
"lpages.co",
"lpusercontent.com",
"lelux.site",
"co.business",
"co.education",
"co.events",
"co.financial",
"co.network",
"co.place",
"co.technology",
"app.lmpm.com",
"linkyard.cloud",
"linkyard-cloud.ch",
"members.linode.com",
"*.nodebalancer.linode.com",
"*.linodeobjects.com",
"ip.linodeusercontent.com",
"we.bs",
"*.user.localcert.dev",
"localzone.xyz",
"loginline.app",
"loginline.dev",
"loginline.io",
"loginline.services",
"loginline.site",
"servers.run",
"lohmus.me",
"krasnik.pl",
"leczna.pl",
"lubartow.pl",
"lublin.pl",
"poniatowa.pl",
"swidnik.pl",
"glug.org.uk",
"lug.org.uk",
"lugs.org.uk",
"barsy.bg",
"barsy.co.uk",
"barsyonline.co.uk",
"barsycenter.com",
"barsyonline.com",
"barsy.club",
"barsy.de",
"barsy.eu",
"barsy.in",
"barsy.info",
"barsy.io",
"barsy.me",
"barsy.menu",
"barsy.mobi",
"barsy.net",
"barsy.online",
"barsy.org",
"barsy.pro",
"barsy.pub",
"barsy.ro",
"barsy.shop",
"barsy.site",
"barsy.support",
"barsy.uk",
"*.magentosite.cloud",
"mayfirst.info",
"mayfirst.org",
"hb.cldmail.ru",
"cn.vu",
"mazeplay.com",
"mcpe.me",
"mcdir.me",
"mcdir.ru",
"mcpre.ru",
"vps.mcdir.ru",
"mediatech.by",
"mediatech.dev",
"hra.health",
"miniserver.com",
"memset.net",
"messerli.app",
"*.cloud.metacentrum.cz",
"custom.metacentrum.cz",
"flt.cloud.muni.cz",
"usr.cloud.muni.cz",
"meteorapp.com",
"eu.meteorapp.com",
"co.pl",
"*.azurecontainer.io",
"azurewebsites.net",
"azure-mobile.net",
"cloudapp.net",
"azurestaticapps.net",
"1.azurestaticapps.net",
"centralus.azurestaticapps.net",
"eastasia.azurestaticapps.net",
"eastus2.azurestaticapps.net",
"westeurope.azurestaticapps.net",
"westus2.azurestaticapps.net",
"csx.cc",
"mintere.site",
"forte.id",
"mozilla-iot.org",
"bmoattachments.org",
"net.ru",
"org.ru",
"pp.ru",
"hostedpi.com",
"customer.mythic-beasts.com",
"caracal.mythic-beasts.com",
"fentiger.mythic-beasts.com",
"lynx.mythic-beasts.com",
"ocelot.mythic-beasts.com",
"oncilla.mythic-beasts.com",
"onza.mythic-beasts.com",
"sphinx.mythic-beasts.com",
"vs.mythic-beasts.com",
"x.mythic-beasts.com",
"yali.mythic-beasts.com",
"cust.retrosnub.co.uk",
"ui.nabu.casa",
"pony.club",
"of.fashion",
"in.london",
"of.london",
"from.marketing",
"with.marketing",
"for.men",
"repair.men",
"and.mom",
"for.mom",
"for.one",
"under.one",
"for.sale",
"that.win",
"from.work",
"to.work",
"cloud.nospamproxy.com",
"netlify.app",
"4u.com",
"ngrok.io",
"nh-serv.co.uk",
"nfshost.com",
"*.developer.app",
"noop.app",
"*.northflank.app",
"*.build.run",
"*.code.run",
"*.database.run",
"*.migration.run",
"noticeable.news",
"dnsking.ch",
"mypi.co",
"n4t.co",
"001www.com",
"ddnslive.com",
"myiphost.com",
"forumz.info",
"16-b.it",
"32-b.it",
"64-b.it",
"soundcast.me",
"tcp4.me",
"dnsup.net",
"hicam.net",
"now-dns.net",
"ownip.net",
"vpndns.net",
"dynserv.org",
"now-dns.org",
"x443.pw",
"now-dns.top",
"ntdll.top",
"freeddns.us",
"crafting.xyz",
"zapto.xyz",
"nsupdate.info",
"nerdpol.ovh",
"blogsyte.com",
"brasilia.me",
"cable-modem.org",
"ciscofreak.com",
"collegefan.org",
"couchpotatofries.org",
"damnserver.com",
"ddns.me",
"ditchyourip.com",
"dnsfor.me",
"dnsiskinky.com",
"dvrcam.info",
"dynns.com",
"eating-organic.net",
"fantasyleague.cc",
"geekgalaxy.com",
"golffan.us",
"health-carereform.com",
"homesecuritymac.com",
"homesecuritypc.com",
"hopto.me",
"ilovecollege.info",
"loginto.me",
"mlbfan.org",
"mmafan.biz",
"myactivedirectory.com",
"mydissent.net",
"myeffect.net",
"mymediapc.net",
"mypsx.net",
"mysecuritycamera.com",
"mysecuritycamera.net",
"mysecuritycamera.org",
"net-freaks.com",
"nflfan.org",
"nhlfan.net",
"no-ip.ca",
"no-ip.co.uk",
"no-ip.net",
"noip.us",
"onthewifi.com",
"pgafan.net",
"point2this.com",
"pointto.us",
"privatizehealthinsurance.net",
"quicksytes.com",
"read-books.org",
"securitytactics.com",
"serveexchange.com",
"servehumour.com",
"servep2p.com",
"servesarcasm.com",
"stufftoread.com",
"ufcfan.org",
"unusualperson.com",
"workisboring.com",
"3utilities.com",
"bounceme.net",
"ddns.net",
"ddnsking.com",
"gotdns.ch",
"hopto.org",
"myftp.biz",
"myftp.org",
"myvnc.com",
"no-ip.biz",
"no-ip.info",
"no-ip.org",
"noip.me",
"redirectme.net",
"servebeer.com",
"serveblog.net",
"servecounterstrike.com",
"serveftp.com",
"servegame.com",
"servehalflife.com",
"servehttp.com",
"serveirc.com",
"serveminecraft.net",
"servemp3.com",
"servepics.com",
"servequake.com",
"sytes.net",
"webhop.me",
"zapto.org",
"stage.nodeart.io",
"pcloud.host",
"nyc.mn",
"static.observableusercontent.com",
"cya.gg",
"omg.lol",
"cloudycluster.net",
"omniwe.site",
"service.one",
"nid.io",
"opensocial.site",
"opencraft.hosting",
"orsites.com",
"operaunite.com",
"tech.orange",
"authgear-staging.com",
"authgearapps.com",
"skygearapp.com",
"outsystemscloud.com",
"*.webpaas.ovh.net",
"*.hosting.ovh.net",
"ownprovider.com",
"own.pm",
"*.owo.codes",
"ox.rs",
"oy.lc",
"pgfog.com",
"pagefrontapp.com",
"pagexl.com",
"*.paywhirl.com",
"bar0.net",
"bar1.net",
"bar2.net",
"rdv.to",
"art.pl",
"gliwice.pl",
"krakow.pl",
"poznan.pl",
"wroc.pl",
"zakopane.pl",
"pantheonsite.io",
"gotpantheon.com",
"mypep.link",
"perspecta.cloud",
"lk3.ru",
"on-web.fr",
"bc.platform.sh",
"ent.platform.sh",
"eu.platform.sh",
"us.platform.sh",
"*.platformsh.site",
"*.tst.site",
"platter-app.com",
"platter-app.dev",
"platterp.us",
"pdns.page",
"plesk.page",
"pleskns.com",
"dyn53.io",
"onporter.run",
"co.bn",
"postman-echo.com",
"pstmn.io",
"mock.pstmn.io",
"httpbin.org",
"prequalifyme.today",
"xen.prgmr.com",
"priv.at",
"prvcy.page",
"*.dweb.link",
"protonet.io",
"chirurgiens-dentistes-en-france.fr",
"byen.site",
"pubtls.org",
"pythonanywhere.com",
"eu.pythonanywhere.com",
"qoto.io",
"qualifioapp.com",
"qbuser.com",
"cloudsite.builders",
"instances.spawn.cc",
"instantcloud.cn",
"ras.ru",
"qa2.com",
"qcx.io",
"*.sys.qcx.io",
"dev-myqnapcloud.com",
"alpha-myqnapcloud.com",
"myqnapcloud.com",
"*.quipelements.com",
"vapor.cloud",
"vaporcloud.io",
"rackmaze.com",
"rackmaze.net",
"g.vbrplsbx.io",
"*.on-k3s.io",
"*.on-rancher.cloud",
"*.on-rio.io",
"readthedocs.io",
"rhcloud.com",
"app.render.com",
"onrender.com",
"repl.co",
"id.repl.co",
"repl.run",
"resindevice.io",
"devices.resinstaging.io",
"hzc.io",
"wellbeingzone.eu",
"wellbeingzone.co.uk",
"adimo.co.uk",
"itcouldbewor.se",
"git-pages.rit.edu",
"rocky.page",
"биз.рус",
"ком.рус",
"крым.рус",
"мир.рус",
"мск.рус",
"орг.рус",
"самара.рус",
"сочи.рус",
"спб.рус",
"я.рус",
"*.builder.code.com",
"*.dev-builder.code.com",
"*.stg-builder.code.com",
"sandcats.io",
"logoip.de",
"logoip.com",
"fr-par-1.baremetal.scw.cloud",
"fr-par-2.baremetal.scw.cloud",
"nl-ams-1.baremetal.scw.cloud",
"fnc.fr-par.scw.cloud",
"functions.fnc.fr-par.scw.cloud",
"k8s.fr-par.scw.cloud",
"nodes.k8s.fr-par.scw.cloud",
"s3.fr-par.scw.cloud",
"s3-website.fr-par.scw.cloud",
"whm.fr-par.scw.cloud",
"priv.instances.scw.cloud",
"pub.instances.scw.cloud",
"k8s.scw.cloud",
"k8s.nl-ams.scw.cloud",
"nodes.k8s.nl-ams.scw.cloud",
"s3.nl-ams.scw.cloud",
"s3-website.nl-ams.scw.cloud",
"whm.nl-ams.scw.cloud",
"k8s.pl-waw.scw.cloud",
"nodes.k8s.pl-waw.scw.cloud",
"s3.pl-waw.scw.cloud",
"s3-website.pl-waw.scw.cloud",
"scalebook.scw.cloud",
"smartlabeling.scw.cloud",
"dedibox.fr",
"schokokeks.net",
"gov.scot",
"service.gov.scot",
"scrysec.com",
"firewall-gateway.com",
"firewall-gateway.de",
"my-gateway.de",
"my-router.de",
"spdns.de",
"spdns.eu",
"firewall-gateway.net",
"my-firewall.org",
"myfirewall.org",
"spdns.org",
"seidat.net",
"sellfy.store",
"senseering.net",
"minisite.ms",
"magnet.page",
"biz.ua",
"co.ua",
"pp.ua",
"shiftcrypto.dev",
"shiftcrypto.io",
"shiftedit.io",
"myshopblocks.com",
"myshopify.com",
"shopitsite.com",
"shopware.store",
"mo-siemens.io",
"1kapp.com",
"appchizi.com",
"applinzi.com",
"sinaapp.com",
"vipsinaapp.com",
"siteleaf.net",
"bounty-full.com",
"alpha.bounty-full.com",
"beta.bounty-full.com",
"small-web.org",
"vp4.me",
"try-snowplow.com",
"srht.site",
"stackhero-network.com",
"musician.io",
"novecore.site",
"static.land",
"dev.static.land",
"sites.static.land",
"storebase.store",
"vps-host.net",
"atl.jelastic.vps-host.net",
"njs.jelastic.vps-host.net",
"ric.jelastic.vps-host.net",
"playstation-cloud.com",
"apps.lair.io",
"*.stolos.io",
"spacekit.io",
"customer.speedpartner.de",
"myspreadshop.at",
"myspreadshop.com.au",
"myspreadshop.be",
"myspreadshop.ca",
"myspreadshop.ch",
"myspreadshop.com",
"myspreadshop.de",
"myspreadshop.dk",
"myspreadshop.es",
"myspreadshop.fi",
"myspreadshop.fr",
"myspreadshop.ie",
"myspreadshop.it",
"myspreadshop.net",
"myspreadshop.nl",
"myspreadshop.no",
"myspreadshop.pl",
"myspreadshop.se",
"myspreadshop.co.uk",
"api.stdlib.com",
"storj.farm",
"utwente.io",
"soc.srcf.net",
"user.srcf.net",
"temp-dns.com",
"supabase.co",
"supabase.in",
"supabase.net",
"su.paba.se",
"*.s5y.io",
"*.sensiosite.cloud",
"syncloud.it",
"dscloud.biz",
"direct.quickconnect.cn",
"dsmynas.com",
"familyds.com",
"diskstation.me",
"dscloud.me",
"i234.me",
"myds.me",
"synology.me",
"dscloud.mobi",
"dsmynas.net",
"familyds.net",
"dsmynas.org",
"familyds.org",
"vpnplus.to",
"direct.quickconnect.to",
"tabitorder.co.il",
"taifun-dns.de",
"beta.tailscale.net",
"ts.net",
"gda.pl",
"gdansk.pl",
"gdynia.pl",
"med.pl",
"sopot.pl",
"site.tb-hosting.com",
"edugit.io",
"s3.teckids.org",
"telebit.app",
"telebit.io",
"*.telebit.xyz",
"gwiddle.co.uk",
"*.firenet.ch",
"*.svc.firenet.ch",
"reservd.com",
"thingdustdata.com",
"cust.dev.thingdust.io",
"cust.disrec.thingdust.io",
"cust.prod.thingdust.io",
"cust.testing.thingdust.io",
"reservd.dev.thingdust.io",
"reservd.disrec.thingdust.io",
"reservd.testing.thingdust.io",
"tickets.io",
"arvo.network",
"azimuth.network",
"tlon.network",
"torproject.net",
"pages.torproject.net",
"bloxcms.com",
"townnews-staging.com",
"tbits.me",
"12hp.at",
"2ix.at",
"4lima.at",
"lima-city.at",
"12hp.ch",
"2ix.ch",
"4lima.ch",
"lima-city.ch",
"trafficplex.cloud",
"de.cool",
"12hp.de",
"2ix.de",
"4lima.de",
"lima-city.de",
"1337.pictures",
"clan.rip",
"lima-city.rocks",
"webspace.rocks",
"lima.zone",
"*.transurl.be",
"*.transurl.eu",
"*.transurl.nl",
"site.transip.me",
"tuxfamily.org",
"dd-dns.de",
"diskstation.eu",
"diskstation.org",
"dray-dns.de",
"draydns.de",
"dyn-vpn.de",
"dynvpn.de",
"mein-vigor.de",
"my-vigor.de",
"my-wan.de",
"syno-ds.de",
"synology-diskstation.de",
"synology-ds.de",
"typedream.app",
"pro.typeform.com",
"uber.space",
"*.uberspace.de",
"hk.com",
"hk.org",
"ltd.hk",
"inc.hk",
"name.pm",
"sch.tf",
"biz.wf",
"sch.wf",
"org.yt",
"virtualuser.de",
"virtual-user.de",
"upli.io",
"urown.cloud",
"dnsupdate.info",
"lib.de.us",
"2038.io",
"vercel.app",
"vercel.dev",
"now.sh",
"router.management",
"v-info.info",
"voorloper.cloud",
"neko.am",
"nyaa.am",
"be.ax",
"cat.ax",
"es.ax",
"eu.ax",
"gg.ax",
"mc.ax",
"us.ax",
"xy.ax",
"nl.ci",
"xx.gl",
"app.gp",
"blog.gt",
"de.gt",
"to.gt",
"be.gy",
"cc.hn",
"blog.kg",
"io.kg",
"jp.kg",
"tv.kg",
"uk.kg",
"us.kg",
"de.ls",
"at.md",
"de.md",
"jp.md",
"to.md",
"indie.porn",
"vxl.sh",
"ch.tc",
"me.tc",
"we.tc",
"nyan.to",
"at.vg",
"blog.vu",
"dev.vu",
"me.vu",
"v.ua",
"*.vultrobjects.com",
"wafflecell.com",
"*.webhare.dev",
"reserve-online.net",
"reserve-online.com",
"bookonline.app",
"hotelwithflight.com",
"wedeploy.io",
"wedeploy.me",
"wedeploy.sh",
"remotewd.com",
"pages.wiardweb.com",
"wmflabs.org",
"toolforge.org",
"wmcloud.org",
"panel.gg",
"daemon.panel.gg",
"messwithdns.com",
"woltlab-demo.com",
"myforum.community",
"community-pro.de",
"diskussionsbereich.de",
"community-pro.net",
"meinforum.net",
"affinitylottery.org.uk",
"raffleentry.org.uk",
"weeklylottery.org.uk",
"wpenginepowered.com",
"js.wpenginepowered.com",
"wixsite.com",
"editorx.io",
"half.host",
"xnbay.com",
"u2.xnbay.com",
"u2-local.xnbay.com",
"cistron.nl",
"demon.nl",
"xs4all.space",
"yandexcloud.net",
"storage.yandexcloud.net",
"website.yandexcloud.net",
"official.academy",
"yolasite.com",
"ybo.faith",
"yombo.me",
"homelink.one",
"ybo.party",
"ybo.review",
"ybo.science",
"ybo.trade",
"ynh.fr",
"nohost.me",
"noho.st",
"za.net",
"za.org",
"bss.design",
"basicserver.io",
"virtualserver.io",
"enterprisecloud.nu"
]
},{}],2:[function(require,module,exports){
/*eslint no-var:0, prefer-arrow-callback: 0, object-shorthand: 0 */
'use strict';


var Punycode = require('punycode');


var internals = {};


//
// Read rules from file.
//
internals.rules = require('./data/rules.json').map(function (rule) {

  return {
    rule: rule,
    suffix: rule.replace(/^(\*\.|\!)/, ''),
    punySuffix: -1,
    wildcard: rule.charAt(0) === '*',
    exception: rule.charAt(0) === '!'
  };
});


//
// Check is given string ends with `suffix`.
//
internals.endsWith = function (str, suffix) {

  return str.indexOf(suffix, str.length - suffix.length) !== -1;
};


//
// Find rule for a given domain.
//
internals.findRule = function (domain) {

  var punyDomain = Punycode.toASCII(domain);
  return internals.rules.reduce(function (memo, rule) {

    if (rule.punySuffix === -1){
      rule.punySuffix = Punycode.toASCII(rule.suffix);
    }
    if (!internals.endsWith(punyDomain, '.' + rule.punySuffix) && punyDomain !== rule.punySuffix) {
      return memo;
    }
    // This has been commented out as it never seems to run. This is because
    // sub tlds always appear after their parents and we never find a shorter
    // match.
    //if (memo) {
    //  var memoSuffix = Punycode.toASCII(memo.suffix);
    //  if (memoSuffix.length >= punySuffix.length) {
    //    return memo;
    //  }
    //}
    return rule;
  }, null);
};


//
// Error codes and messages.
//
exports.errorCodes = {
  DOMAIN_TOO_SHORT: 'Domain name too short.',
  DOMAIN_TOO_LONG: 'Domain name too long. It should be no more than 255 chars.',
  LABEL_STARTS_WITH_DASH: 'Domain name label can not start with a dash.',
  LABEL_ENDS_WITH_DASH: 'Domain name label can not end with a dash.',
  LABEL_TOO_LONG: 'Domain name label should be at most 63 chars long.',
  LABEL_TOO_SHORT: 'Domain name label should be at least 1 character long.',
  LABEL_INVALID_CHARS: 'Domain name label can only contain alphanumeric characters or dashes.'
};


//
// Validate domain name and throw if not valid.
//
// From wikipedia:
//
// Hostnames are composed of series of labels concatenated with dots, as are all
// domain names. Each label must be between 1 and 63 characters long, and the
// entire hostname (including the delimiting dots) has a maximum of 255 chars.
//
// Allowed chars:
//
// * `a-z`
// * `0-9`
// * `-` but not as a starting or ending character
// * `.` as a separator for the textual portions of a domain name
//
// * http://en.wikipedia.org/wiki/Domain_name
// * http://en.wikipedia.org/wiki/Hostname
//
internals.validate = function (input) {

  // Before we can validate we need to take care of IDNs with unicode chars.
  var ascii = Punycode.toASCII(input);

  if (ascii.length < 1) {
    return 'DOMAIN_TOO_SHORT';
  }
  if (ascii.length > 255) {
    return 'DOMAIN_TOO_LONG';
  }

  // Check each part's length and allowed chars.
  var labels = ascii.split('.');
  var label;

  for (var i = 0; i < labels.length; ++i) {
    label = labels[i];
    if (!label.length) {
      return 'LABEL_TOO_SHORT';
    }
    if (label.length > 63) {
      return 'LABEL_TOO_LONG';
    }
    if (label.charAt(0) === '-') {
      return 'LABEL_STARTS_WITH_DASH';
    }
    if (label.charAt(label.length - 1) === '-') {
      return 'LABEL_ENDS_WITH_DASH';
    }
    if (!/^[a-z0-9\-]+$/.test(label)) {
      return 'LABEL_INVALID_CHARS';
    }
  }
};


//
// Public API
//


//
// Parse domain.
//
exports.parse = function (input) {

  if (typeof input !== 'string') {
    throw new TypeError('Domain name must be a string.');
  }

  // Force domain to lowercase.
  var domain = input.slice(0).toLowerCase();

  // Handle FQDN.
  // TODO: Simply remove trailing dot?
  if (domain.charAt(domain.length - 1) === '.') {
    domain = domain.slice(0, domain.length - 1);
  }

  // Validate and sanitise input.
  var error = internals.validate(domain);
  if (error) {
    return {
      input: input,
      error: {
        message: exports.errorCodes[error],
        code: error
      }
    };
  }

  var parsed = {
    input: input,
    tld: null,
    sld: null,
    domain: null,
    subdomain: null,
    listed: false
  };

  var domainParts = domain.split('.');

  // Non-Internet TLD
  if (domainParts[domainParts.length - 1] === 'local') {
    return parsed;
  }

  var handlePunycode = function () {

    if (!/xn--/.test(domain)) {
      return parsed;
    }
    if (parsed.domain) {
      parsed.domain = Punycode.toASCII(parsed.domain);
    }
    if (parsed.subdomain) {
      parsed.subdomain = Punycode.toASCII(parsed.subdomain);
    }
    return parsed;
  };

  var rule = internals.findRule(domain);

  // Unlisted tld.
  if (!rule) {
    if (domainParts.length < 2) {
      return parsed;
    }
    parsed.tld = domainParts.pop();
    parsed.sld = domainParts.pop();
    parsed.domain = [parsed.sld, parsed.tld].join('.');
    if (domainParts.length) {
      parsed.subdomain = domainParts.pop();
    }
    return handlePunycode();
  }

  // At this point we know the public suffix is listed.
  parsed.listed = true;

  var tldParts = rule.suffix.split('.');
  var privateParts = domainParts.slice(0, domainParts.length - tldParts.length);

  if (rule.exception) {
    privateParts.push(tldParts.shift());
  }

  parsed.tld = tldParts.join('.');

  if (!privateParts.length) {
    return handlePunycode();
  }

  if (rule.wildcard) {
    tldParts.unshift(privateParts.pop());
    parsed.tld = tldParts.join('.');
  }

  if (!privateParts.length) {
    return handlePunycode();
  }

  parsed.sld = privateParts.pop();
  parsed.domain = [parsed.sld,  parsed.tld].join('.');

  if (privateParts.length) {
    parsed.subdomain = privateParts.join('.');
  }

  return handlePunycode();
};


//
// Get domain.
//
exports.get = function (domain) {

  if (!domain) {
    return null;
  }
  return exports.parse(domain).domain || null;
};


//
// Check whether domain belongs to a known public suffix.
//
exports.isValid = function (domain) {

  var parsed = exports.parse(domain);
  return Boolean(parsed.domain && parsed.listed);
};

},{"./data/rules.json":1,"punycode":3}],3:[function(require,module,exports){
(function (global){(function (){
/*! https://mths.be/punycode v1.4.1 by @mathias */
;(function(root) {

	/** Detect free variables */
	var freeExports = typeof exports == 'object' && exports &&
		!exports.nodeType && exports;
	var freeModule = typeof module == 'object' && module &&
		!module.nodeType && module;
	var freeGlobal = typeof global == 'object' && global;
	if (
		freeGlobal.global === freeGlobal ||
		freeGlobal.window === freeGlobal ||
		freeGlobal.self === freeGlobal
	) {
		root = freeGlobal;
	}

	/**
	 * The `punycode` object.
	 * @name punycode
	 * @type Object
	 */
	var punycode,

	/** Highest positive signed 32-bit float value */
	maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1

	/** Bootstring parameters */
	base = 36,
	tMin = 1,
	tMax = 26,
	skew = 38,
	damp = 700,
	initialBias = 72,
	initialN = 128, // 0x80
	delimiter = '-', // '\x2D'

	/** Regular expressions */
	regexPunycode = /^xn--/,
	regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars
	regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators

	/** Error messages */
	errors = {
		'overflow': 'Overflow: input needs wider integers to process',
		'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
		'invalid-input': 'Invalid input'
	},

	/** Convenience shortcuts */
	baseMinusTMin = base - tMin,
	floor = Math.floor,
	stringFromCharCode = String.fromCharCode,

	/** Temporary variable */
	key;

	/*--------------------------------------------------------------------------*/

	/**
	 * A generic error utility function.
	 * @private
	 * @param {String} type The error type.
	 * @returns {Error} Throws a `RangeError` with the applicable error message.
	 */
	function error(type) {
		throw new RangeError(errors[type]);
	}

	/**
	 * A generic `Array#map` utility function.
	 * @private
	 * @param {Array} array The array to iterate over.
	 * @param {Function} callback The function that gets called for every array
	 * item.
	 * @returns {Array} A new array of values returned by the callback function.
	 */
	function map(array, fn) {
		var length = array.length;
		var result = [];
		while (length--) {
			result[length] = fn(array[length]);
		}
		return result;
	}

	/**
	 * A simple `Array#map`-like wrapper to work with domain name strings or email
	 * addresses.
	 * @private
	 * @param {String} domain The domain name or email address.
	 * @param {Function} callback The function that gets called for every
	 * character.
	 * @returns {Array} A new string of characters returned by the callback
	 * function.
	 */
	function mapDomain(string, fn) {
		var parts = string.split('@');
		var result = '';
		if (parts.length > 1) {
			// In email addresses, only the domain name should be punycoded. Leave
			// the local part (i.e. everything up to `@`) intact.
			result = parts[0] + '@';
			string = parts[1];
		}
		// Avoid `split(regex)` for IE8 compatibility. See #17.
		string = string.replace(regexSeparators, '\x2E');
		var labels = string.split('.');
		var encoded = map(labels, fn).join('.');
		return result + encoded;
	}

	/**
	 * Creates an array containing the numeric code points of each Unicode
	 * character in the string. While JavaScript uses UCS-2 internally,
	 * this function will convert a pair of surrogate halves (each of which
	 * UCS-2 exposes as separate characters) into a single code point,
	 * matching UTF-16.
	 * @see `punycode.ucs2.encode`
	 * @see <https://mathiasbynens.be/notes/javascript-encoding>
	 * @memberOf punycode.ucs2
	 * @name decode
	 * @param {String} string The Unicode input string (UCS-2).
	 * @returns {Array} The new array of code points.
	 */
	function ucs2decode(string) {
		var output = [],
		    counter = 0,
		    length = string.length,
		    value,
		    extra;
		while (counter < length) {
			value = string.charCodeAt(counter++);
			if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
				// high surrogate, and there is a next character
				extra = string.charCodeAt(counter++);
				if ((extra & 0xFC00) == 0xDC00) { // low surrogate
					output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
				} else {
					// unmatched surrogate; only append this code unit, in case the next
					// code unit is the high surrogate of a surrogate pair
					output.push(value);
					counter--;
				}
			} else {
				output.push(value);
			}
		}
		return output;
	}

	/**
	 * Creates a string based on an array of numeric code points.
	 * @see `punycode.ucs2.decode`
	 * @memberOf punycode.ucs2
	 * @name encode
	 * @param {Array} codePoints The array of numeric code points.
	 * @returns {String} The new Unicode string (UCS-2).
	 */
	function ucs2encode(array) {
		return map(array, function(value) {
			var output = '';
			if (value > 0xFFFF) {
				value -= 0x10000;
				output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
				value = 0xDC00 | value & 0x3FF;
			}
			output += stringFromCharCode(value);
			return output;
		}).join('');
	}

	/**
	 * Converts a basic code point into a digit/integer.
	 * @see `digitToBasic()`
	 * @private
	 * @param {Number} codePoint The basic numeric code point value.
	 * @returns {Number} The numeric value of a basic code point (for use in
	 * representing integers) in the range `0` to `base - 1`, or `base` if
	 * the code point does not represent a value.
	 */
	function basicToDigit(codePoint) {
		if (codePoint - 48 < 10) {
			return codePoint - 22;
		}
		if (codePoint - 65 < 26) {
			return codePoint - 65;
		}
		if (codePoint - 97 < 26) {
			return codePoint - 97;
		}
		return base;
	}

	/**
	 * Converts a digit/integer into a basic code point.
	 * @see `basicToDigit()`
	 * @private
	 * @param {Number} digit The numeric value of a basic code point.
	 * @returns {Number} The basic code point whose value (when used for
	 * representing integers) is `digit`, which needs to be in the range
	 * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
	 * used; else, the lowercase form is used. The behavior is undefined
	 * if `flag` is non-zero and `digit` has no uppercase form.
	 */
	function digitToBasic(digit, flag) {
		//  0..25 map to ASCII a..z or A..Z
		// 26..35 map to ASCII 0..9
		return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
	}

	/**
	 * Bias adaptation function as per section 3.4 of RFC 3492.
	 * https://tools.ietf.org/html/rfc3492#section-3.4
	 * @private
	 */
	function adapt(delta, numPoints, firstTime) {
		var k = 0;
		delta = firstTime ? floor(delta / damp) : delta >> 1;
		delta += floor(delta / numPoints);
		for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {
			delta = floor(delta / baseMinusTMin);
		}
		return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
	}

	/**
	 * Converts a Punycode string of ASCII-only symbols to a string of Unicode
	 * symbols.
	 * @memberOf punycode
	 * @param {String} input The Punycode string of ASCII-only symbols.
	 * @returns {String} The resulting string of Unicode symbols.
	 */
	function decode(input) {
		// Don't use UCS-2
		var output = [],
		    inputLength = input.length,
		    out,
		    i = 0,
		    n = initialN,
		    bias = initialBias,
		    basic,
		    j,
		    index,
		    oldi,
		    w,
		    k,
		    digit,
		    t,
		    /** Cached calculation results */
		    baseMinusT;

		// Handle the basic code points: let `basic` be the number of input code
		// points before the last delimiter, or `0` if there is none, then copy
		// the first basic code points to the output.

		basic = input.lastIndexOf(delimiter);
		if (basic < 0) {
			basic = 0;
		}

		for (j = 0; j < basic; ++j) {
			// if it's not a basic code point
			if (input.charCodeAt(j) >= 0x80) {
				error('not-basic');
			}
			output.push(input.charCodeAt(j));
		}

		// Main decoding loop: start just after the last delimiter if any basic code
		// points were copied; start at the beginning otherwise.

		for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {

			// `index` is the index of the next character to be consumed.
			// Decode a generalized variable-length integer into `delta`,
			// which gets added to `i`. The overflow checking is easier
			// if we increase `i` as we go, then subtract off its starting
			// value at the end to obtain `delta`.
			for (oldi = i, w = 1, k = base; /* no condition */; k += base) {

				if (index >= inputLength) {
					error('invalid-input');
				}

				digit = basicToDigit(input.charCodeAt(index++));

				if (digit >= base || digit > floor((maxInt - i) / w)) {
					error('overflow');
				}

				i += digit * w;
				t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);

				if (digit < t) {
					break;
				}

				baseMinusT = base - t;
				if (w > floor(maxInt / baseMinusT)) {
					error('overflow');
				}

				w *= baseMinusT;

			}

			out = output.length + 1;
			bias = adapt(i - oldi, out, oldi == 0);

			// `i` was supposed to wrap around from `out` to `0`,
			// incrementing `n` each time, so we'll fix that now:
			if (floor(i / out) > maxInt - n) {
				error('overflow');
			}

			n += floor(i / out);
			i %= out;

			// Insert `n` at position `i` of the output
			output.splice(i++, 0, n);

		}

		return ucs2encode(output);
	}

	/**
	 * Converts a string of Unicode symbols (e.g. a domain name label) to a
	 * Punycode string of ASCII-only symbols.
	 * @memberOf punycode
	 * @param {String} input The string of Unicode symbols.
	 * @returns {String} The resulting Punycode string of ASCII-only symbols.
	 */
	function encode(input) {
		var n,
		    delta,
		    handledCPCount,
		    basicLength,
		    bias,
		    j,
		    m,
		    q,
		    k,
		    t,
		    currentValue,
		    output = [],
		    /** `inputLength` will hold the number of code points in `input`. */
		    inputLength,
		    /** Cached calculation results */
		    handledCPCountPlusOne,
		    baseMinusT,
		    qMinusT;

		// Convert the input in UCS-2 to Unicode
		input = ucs2decode(input);

		// Cache the length
		inputLength = input.length;

		// Initialize the state
		n = initialN;
		delta = 0;
		bias = initialBias;

		// Handle the basic code points
		for (j = 0; j < inputLength; ++j) {
			currentValue = input[j];
			if (currentValue < 0x80) {
				output.push(stringFromCharCode(currentValue));
			}
		}

		handledCPCount = basicLength = output.length;

		// `handledCPCount` is the number of code points that have been handled;
		// `basicLength` is the number of basic code points.

		// Finish the basic string - if it is not empty - with a delimiter
		if (basicLength) {
			output.push(delimiter);
		}

		// Main encoding loop:
		while (handledCPCount < inputLength) {

			// All non-basic code points < n have been handled already. Find the next
			// larger one:
			for (m = maxInt, j = 0; j < inputLength; ++j) {
				currentValue = input[j];
				if (currentValue >= n && currentValue < m) {
					m = currentValue;
				}
			}

			// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
			// but guard against overflow
			handledCPCountPlusOne = handledCPCount + 1;
			if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
				error('overflow');
			}

			delta += (m - n) * handledCPCountPlusOne;
			n = m;

			for (j = 0; j < inputLength; ++j) {
				currentValue = input[j];

				if (currentValue < n && ++delta > maxInt) {
					error('overflow');
				}

				if (currentValue == n) {
					// Represent delta as a generalized variable-length integer
					for (q = delta, k = base; /* no condition */; k += base) {
						t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
						if (q < t) {
							break;
						}
						qMinusT = q - t;
						baseMinusT = base - t;
						output.push(
							stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))
						);
						q = floor(qMinusT / baseMinusT);
					}

					output.push(stringFromCharCode(digitToBasic(q, 0)));
					bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
					delta = 0;
					++handledCPCount;
				}
			}

			++delta;
			++n;

		}
		return output.join('');
	}

	/**
	 * Converts a Punycode string representing a domain name or an email address
	 * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
	 * it doesn't matter if you call it on a string that has already been
	 * converted to Unicode.
	 * @memberOf punycode
	 * @param {String} input The Punycoded domain name or email address to
	 * convert to Unicode.
	 * @returns {String} The Unicode representation of the given Punycode
	 * string.
	 */
	function toUnicode(input) {
		return mapDomain(input, function(string) {
			return regexPunycode.test(string)
				? decode(string.slice(4).toLowerCase())
				: string;
		});
	}

	/**
	 * Converts a Unicode string representing a domain name or an email address to
	 * Punycode. Only the non-ASCII parts of the domain name will be converted,
	 * i.e. it doesn't matter if you call it with a domain that's already in
	 * ASCII.
	 * @memberOf punycode
	 * @param {String} input The domain name or email address to convert, as a
	 * Unicode string.
	 * @returns {String} The Punycode representation of the given domain name or
	 * email address.
	 */
	function toASCII(input) {
		return mapDomain(input, function(string) {
			return regexNonASCII.test(string)
				? 'xn--' + encode(string)
				: string;
		});
	}

	/*--------------------------------------------------------------------------*/

	/** Define the public API */
	punycode = {
		/**
		 * A string representing the current Punycode.js version number.
		 * @memberOf punycode
		 * @type String
		 */
		'version': '1.4.1',
		/**
		 * An object of methods to convert from JavaScript's internal character
		 * representation (UCS-2) to Unicode code points, and back.
		 * @see <https://mathiasbynens.be/notes/javascript-encoding>
		 * @memberOf punycode
		 * @type Object
		 */
		'ucs2': {
			'decode': ucs2decode,
			'encode': ucs2encode
		},
		'decode': decode,
		'encode': encode,
		'toASCII': toASCII,
		'toUnicode': toUnicode
	};

	/** Expose `punycode` */
	// Some AMD build optimizers, like r.js, check for specific condition patterns
	// like the following:
	if (
		typeof define == 'function' &&
		typeof define.amd == 'object' &&
		define.amd
	) {
		define('punycode', function() {
			return punycode;
		});
	} else if (freeExports && freeModule) {
		if (module.exports == freeExports) {
			// in Node.js, io.js, or RingoJS v0.8.0+
			freeModule.exports = punycode;
		} else {
			// in Narwhal or RingoJS v0.7.0-
			for (key in punycode) {
				punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);
			}
		}
	} else {
		// in Rhino or a web browser
		root.punycode = punycode;
	}

}(this));

}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{}]},{},[2])(2)
});
!function(a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a():"function"==typeof define&&define.amd?define([],a):("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).psl=a()}(function(){return function e(s,n,t){function m(o,a){if(!n[o]){if(!s[o]){var i="function"==typeof require&&require;if(!a&&i)return i(o,!0);if(u)return u(o,!0);throw(a=new Error("Cannot find module '"+o+"'")).code="MODULE_NOT_FOUND",a}i=n[o]={exports:{}},s[o][0].call(i.exports,function(a){return m(s[o][1][a]||a)},i,i.exports,e,s,n,t)}return n[o].exports}for(var u="function"==typeof require&&require,a=0;a<t.length;a++)m(t[a]);return m}({1:[function(a,o,i){o.exports=["ac","com.ac","edu.ac","gov.ac","net.ac","mil.ac","org.ac","ad","nom.ad","ae","co.ae","net.ae","org.ae","sch.ae","ac.ae","gov.ae","mil.ae","aero","accident-investigation.aero","accident-prevention.aero","aerobatic.aero","aeroclub.aero","aerodrome.aero","agents.aero","aircraft.aero","airline.aero","airport.aero","air-surveillance.aero","airtraffic.aero","air-traffic-control.aero","ambulance.aero","amusement.aero","association.aero","author.aero","ballooning.aero","broker.aero","caa.aero","cargo.aero","catering.aero","certification.aero","championship.aero","charter.aero","civilaviation.aero","club.aero","conference.aero","consultant.aero","consulting.aero","control.aero","council.aero","crew.aero","design.aero","dgca.aero","educator.aero","emergency.aero","engine.aero","engineer.aero","entertainment.aero","equipment.aero","exchange.aero","express.aero","federation.aero","flight.aero","fuel.aero","gliding.aero","government.aero","groundhandling.aero","group.aero","hanggliding.aero","homebuilt.aero","insurance.aero","journal.aero","journalist.aero","leasing.aero","logistics.aero","magazine.aero","maintenance.aero","media.aero","microlight.aero","modelling.aero","navigation.aero","parachuting.aero","paragliding.aero","passenger-association.aero","pilot.aero","press.aero","production.aero","recreation.aero","repbody.aero","res.aero","research.aero","rotorcraft.aero","safety.aero","scientist.aero","services.aero","show.aero","skydiving.aero","software.aero","student.aero","trader.aero","trading.aero","trainer.aero","union.aero","workinggroup.aero","works.aero","af","gov.af","com.af","org.af","net.af","edu.af","ag","com.ag","org.ag","net.ag","co.ag","nom.ag","ai","off.ai","com.ai","net.ai","org.ai","al","com.al","edu.al","gov.al","mil.al","net.al","org.al","am","co.am","com.am","commune.am","net.am","org.am","ao","ed.ao","gv.ao","og.ao","co.ao","pb.ao","it.ao","aq","ar","bet.ar","com.ar","coop.ar","edu.ar","gob.ar","gov.ar","int.ar","mil.ar","musica.ar","mutual.ar","net.ar","org.ar","senasa.ar","tur.ar","arpa","e164.arpa","in-addr.arpa","ip6.arpa","iris.arpa","uri.arpa","urn.arpa","as","gov.as","asia","at","ac.at","co.at","gv.at","or.at","sth.ac.at","au","com.au","net.au","org.au","edu.au","gov.au","asn.au","id.au","info.au","conf.au","oz.au","act.au","nsw.au","nt.au","qld.au","sa.au","tas.au","vic.au","wa.au","act.edu.au","catholic.edu.au","nsw.edu.au","nt.edu.au","qld.edu.au","sa.edu.au","tas.edu.au","vic.edu.au","wa.edu.au","qld.gov.au","sa.gov.au","tas.gov.au","vic.gov.au","wa.gov.au","schools.nsw.edu.au","aw","com.aw","ax","az","com.az","net.az","int.az","gov.az","org.az","edu.az","info.az","pp.az","mil.az","name.az","pro.az","biz.az","ba","com.ba","edu.ba","gov.ba","mil.ba","net.ba","org.ba","bb","biz.bb","co.bb","com.bb","edu.bb","gov.bb","info.bb","net.bb","org.bb","store.bb","tv.bb","*.bd","be","ac.be","bf","gov.bf","bg","a.bg","b.bg","c.bg","d.bg","e.bg","f.bg","g.bg","h.bg","i.bg","j.bg","k.bg","l.bg","m.bg","n.bg","o.bg","p.bg","q.bg","r.bg","s.bg","t.bg","u.bg","v.bg","w.bg","x.bg","y.bg","z.bg","0.bg","1.bg","2.bg","3.bg","4.bg","5.bg","6.bg","7.bg","8.bg","9.bg","bh","com.bh","edu.bh","net.bh","org.bh","gov.bh","bi","co.bi","com.bi","edu.bi","or.bi","org.bi","biz","bj","asso.bj","barreau.bj","gouv.bj","bm","com.bm","edu.bm","gov.bm","net.bm","org.bm","bn","com.bn","edu.bn","gov.bn","net.bn","org.bn","bo","com.bo","edu.bo","gob.bo","int.bo","org.bo","net.bo","mil.bo","tv.bo","web.bo","academia.bo","agro.bo","arte.bo","blog.bo","bolivia.bo","ciencia.bo","cooperativa.bo","democracia.bo","deporte.bo","ecologia.bo","economia.bo","empresa.bo","indigena.bo","industria.bo","info.bo","medicina.bo","movimiento.bo","musica.bo","natural.bo","nombre.bo","noticias.bo","patria.bo","politica.bo","profesional.bo","plurinacional.bo","pueblo.bo","revista.bo","salud.bo","tecnologia.bo","tksat.bo","transporte.bo","wiki.bo","br","9guacu.br","abc.br","adm.br","adv.br","agr.br","aju.br","am.br","anani.br","aparecida.br","app.br","arq.br","art.br","ato.br","b.br","barueri.br","belem.br","bhz.br","bib.br","bio.br","blog.br","bmd.br","boavista.br","bsb.br","campinagrande.br","campinas.br","caxias.br","cim.br","cng.br","cnt.br","com.br","contagem.br","coop.br","coz.br","cri.br","cuiaba.br","curitiba.br","def.br","des.br","det.br","dev.br","ecn.br","eco.br","edu.br","emp.br","enf.br","eng.br","esp.br","etc.br","eti.br","far.br","feira.br","flog.br","floripa.br","fm.br","fnd.br","fortal.br","fot.br","foz.br","fst.br","g12.br","geo.br","ggf.br","goiania.br","gov.br","ac.gov.br","al.gov.br","am.gov.br","ap.gov.br","ba.gov.br","ce.gov.br","df.gov.br","es.gov.br","go.gov.br","ma.gov.br","mg.gov.br","ms.gov.br","mt.gov.br","pa.gov.br","pb.gov.br","pe.gov.br","pi.gov.br","pr.gov.br","rj.gov.br","rn.gov.br","ro.gov.br","rr.gov.br","rs.gov.br","sc.gov.br","se.gov.br","sp.gov.br","to.gov.br","gru.br","imb.br","ind.br","inf.br","jab.br","jampa.br","jdf.br","joinville.br","jor.br","jus.br","leg.br","lel.br","log.br","londrina.br","macapa.br","maceio.br","manaus.br","maringa.br","mat.br","med.br","mil.br","morena.br","mp.br","mus.br","natal.br","net.br","niteroi.br","*.nom.br","not.br","ntr.br","odo.br","ong.br","org.br","osasco.br","palmas.br","poa.br","ppg.br","pro.br","psc.br","psi.br","pvh.br","qsl.br","radio.br","rec.br","recife.br","rep.br","ribeirao.br","rio.br","riobranco.br","riopreto.br","salvador.br","sampa.br","santamaria.br","santoandre.br","saobernardo.br","saogonca.br","seg.br","sjc.br","slg.br","slz.br","sorocaba.br","srv.br","taxi.br","tc.br","tec.br","teo.br","the.br","tmp.br","trd.br","tur.br","tv.br","udi.br","vet.br","vix.br","vlog.br","wiki.br","zlg.br","bs","com.bs","net.bs","org.bs","edu.bs","gov.bs","bt","com.bt","edu.bt","gov.bt","net.bt","org.bt","bv","bw","co.bw","org.bw","by","gov.by","mil.by","com.by","of.by","bz","com.bz","net.bz","org.bz","edu.bz","gov.bz","ca","ab.ca","bc.ca","mb.ca","nb.ca","nf.ca","nl.ca","ns.ca","nt.ca","nu.ca","on.ca","pe.ca","qc.ca","sk.ca","yk.ca","gc.ca","cat","cc","cd","gov.cd","cf","cg","ch","ci","org.ci","or.ci","com.ci","co.ci","edu.ci","ed.ci","ac.ci","net.ci","go.ci","asso.ci","aéroport.ci","int.ci","presse.ci","md.ci","gouv.ci","*.ck","!www.ck","cl","co.cl","gob.cl","gov.cl","mil.cl","cm","co.cm","com.cm","gov.cm","net.cm","cn","ac.cn","com.cn","edu.cn","gov.cn","net.cn","org.cn","mil.cn","公司.cn","网络.cn","網絡.cn","ah.cn","bj.cn","cq.cn","fj.cn","gd.cn","gs.cn","gz.cn","gx.cn","ha.cn","hb.cn","he.cn","hi.cn","hl.cn","hn.cn","jl.cn","js.cn","jx.cn","ln.cn","nm.cn","nx.cn","qh.cn","sc.cn","sd.cn","sh.cn","sn.cn","sx.cn","tj.cn","xj.cn","xz.cn","yn.cn","zj.cn","hk.cn","mo.cn","tw.cn","co","arts.co","com.co","edu.co","firm.co","gov.co","info.co","int.co","mil.co","net.co","nom.co","org.co","rec.co","web.co","com","coop","cr","ac.cr","co.cr","ed.cr","fi.cr","go.cr","or.cr","sa.cr","cu","com.cu","edu.cu","org.cu","net.cu","gov.cu","inf.cu","cv","com.cv","edu.cv","int.cv","nome.cv","org.cv","cw","com.cw","edu.cw","net.cw","org.cw","cx","gov.cx","cy","ac.cy","biz.cy","com.cy","ekloges.cy","gov.cy","ltd.cy","mil.cy","net.cy","org.cy","press.cy","pro.cy","tm.cy","cz","de","dj","dk","dm","com.dm","net.dm","org.dm","edu.dm","gov.dm","do","art.do","com.do","edu.do","gob.do","gov.do","mil.do","net.do","org.do","sld.do","web.do","dz","art.dz","asso.dz","com.dz","edu.dz","gov.dz","org.dz","net.dz","pol.dz","soc.dz","tm.dz","ec","com.ec","info.ec","net.ec","fin.ec","k12.ec","med.ec","pro.ec","org.ec","edu.ec","gov.ec","gob.ec","mil.ec","edu","ee","edu.ee","gov.ee","riik.ee","lib.ee","med.ee","com.ee","pri.ee","aip.ee","org.ee","fie.ee","eg","com.eg","edu.eg","eun.eg","gov.eg","mil.eg","name.eg","net.eg","org.eg","sci.eg","*.er","es","com.es","nom.es","org.es","gob.es","edu.es","et","com.et","gov.et","org.et","edu.et","biz.et","name.et","info.et","net.et","eu","fi","aland.fi","fj","ac.fj","biz.fj","com.fj","gov.fj","info.fj","mil.fj","name.fj","net.fj","org.fj","pro.fj","*.fk","com.fm","edu.fm","net.fm","org.fm","fm","fo","fr","asso.fr","com.fr","gouv.fr","nom.fr","prd.fr","tm.fr","aeroport.fr","avocat.fr","avoues.fr","cci.fr","chambagri.fr","chirurgiens-dentistes.fr","experts-comptables.fr","geometre-expert.fr","greta.fr","huissier-justice.fr","medecin.fr","notaires.fr","pharmacien.fr","port.fr","veterinaire.fr","ga","gb","edu.gd","gov.gd","gd","ge","com.ge","edu.ge","gov.ge","org.ge","mil.ge","net.ge","pvt.ge","gf","gg","co.gg","net.gg","org.gg","gh","com.gh","edu.gh","gov.gh","org.gh","mil.gh","gi","com.gi","ltd.gi","gov.gi","mod.gi","edu.gi","org.gi","gl","co.gl","com.gl","edu.gl","net.gl","org.gl","gm","gn","ac.gn","com.gn","edu.gn","gov.gn","org.gn","net.gn","gov","gp","com.gp","net.gp","mobi.gp","edu.gp","org.gp","asso.gp","gq","gr","com.gr","edu.gr","net.gr","org.gr","gov.gr","gs","gt","com.gt","edu.gt","gob.gt","ind.gt","mil.gt","net.gt","org.gt","gu","com.gu","edu.gu","gov.gu","guam.gu","info.gu","net.gu","org.gu","web.gu","gw","gy","co.gy","com.gy","edu.gy","gov.gy","net.gy","org.gy","hk","com.hk","edu.hk","gov.hk","idv.hk","net.hk","org.hk","公司.hk","教育.hk","敎育.hk","政府.hk","個人.hk","个��.hk","箇人.hk","網络.hk","网络.hk","组織.hk","網絡.hk","网絡.hk","组织.hk","組織.hk","組织.hk","hm","hn","com.hn","edu.hn","org.hn","net.hn","mil.hn","gob.hn","hr","iz.hr","from.hr","name.hr","com.hr","ht","com.ht","shop.ht","firm.ht","info.ht","adult.ht","net.ht","pro.ht","org.ht","med.ht","art.ht","coop.ht","pol.ht","asso.ht","edu.ht","rel.ht","gouv.ht","perso.ht","hu","co.hu","info.hu","org.hu","priv.hu","sport.hu","tm.hu","2000.hu","agrar.hu","bolt.hu","casino.hu","city.hu","erotica.hu","erotika.hu","film.hu","forum.hu","games.hu","hotel.hu","ingatlan.hu","jogasz.hu","konyvelo.hu","lakas.hu","media.hu","news.hu","reklam.hu","sex.hu","shop.hu","suli.hu","szex.hu","tozsde.hu","utazas.hu","video.hu","id","ac.id","biz.id","co.id","desa.id","go.id","mil.id","my.id","net.id","or.id","ponpes.id","sch.id","web.id","ie","gov.ie","il","ac.il","co.il","gov.il","idf.il","k12.il","muni.il","net.il","org.il","im","ac.im","co.im","com.im","ltd.co.im","net.im","org.im","plc.co.im","tt.im","tv.im","in","co.in","firm.in","net.in","org.in","gen.in","ind.in","nic.in","ac.in","edu.in","res.in","gov.in","mil.in","info","int","eu.int","io","com.io","iq","gov.iq","edu.iq","mil.iq","com.iq","org.iq","net.iq","ir","ac.ir","co.ir","gov.ir","id.ir","net.ir","org.ir","sch.ir","ایران.ir","ايران.ir","is","net.is","com.is","edu.is","gov.is","org.is","int.is","it","gov.it","edu.it","abr.it","abruzzo.it","aosta-valley.it","aostavalley.it","bas.it","basilicata.it","cal.it","calabria.it","cam.it","campania.it","emilia-romagna.it","emiliaromagna.it","emr.it","friuli-v-giulia.it","friuli-ve-giulia.it","friuli-vegiulia.it","friuli-venezia-giulia.it","friuli-veneziagiulia.it","friuli-vgiulia.it","friuliv-giulia.it","friulive-giulia.it","friulivegiulia.it","friulivenezia-giulia.it","friuliveneziagiulia.it","friulivgiulia.it","fvg.it","laz.it","lazio.it","lig.it","liguria.it","lom.it","lombardia.it","lombardy.it","lucania.it","mar.it","marche.it","mol.it","molise.it","piedmont.it","piemonte.it","pmn.it","pug.it","puglia.it","sar.it","sardegna.it","sardinia.it","sic.it","sicilia.it","sicily.it","taa.it","tos.it","toscana.it","trentin-sud-tirol.it","trentin-süd-tirol.it","trentin-sudtirol.it","trentin-südtirol.it","trentin-sued-tirol.it","trentin-suedtirol.it","trentino-a-adige.it","trentino-aadige.it","trentino-alto-adige.it","trentino-altoadige.it","trentino-s-tirol.it","trentino-stirol.it","trentino-sud-tirol.it","trentino-süd-tirol.it","trentino-sudtirol.it","trentino-südtirol.it","trentino-sued-tirol.it","trentino-suedtirol.it","trentino.it","trentinoa-adige.it","trentinoaadige.it","trentinoalto-adige.it","trentinoaltoadige.it","trentinos-tirol.it","trentinostirol.it","trentinosud-tirol.it","trentinosüd-tirol.it","trentinosudtirol.it","trentinosüdtirol.it","trentinosued-tirol.it","trentinosuedtirol.it","trentinsud-tirol.it","trentinsüd-tirol.it","trentinsudtirol.it","trentinsüdtirol.it","trentinsued-tirol.it","trentinsuedtirol.it","tuscany.it","umb.it","umbria.it","val-d-aosta.it","val-daosta.it","vald-aosta.it","valdaosta.it","valle-aosta.it","valle-d-aosta.it","valle-daosta.it","valleaosta.it","valled-aosta.it","valledaosta.it","vallee-aoste.it","vallée-aoste.it","vallee-d-aoste.it","vallée-d-aoste.it","valleeaoste.it","valléeaoste.it","valleedaoste.it","valléedaoste.it","vao.it","vda.it","ven.it","veneto.it","ag.it","agrigento.it","al.it","alessandria.it","alto-adige.it","altoadige.it","an.it","ancona.it","andria-barletta-trani.it","andria-trani-barletta.it","andriabarlettatrani.it","andriatranibarletta.it","ao.it","aosta.it","aoste.it","ap.it","aq.it","aquila.it","ar.it","arezzo.it","ascoli-piceno.it","ascolipiceno.it","asti.it","at.it","av.it","avellino.it","ba.it","balsan-sudtirol.it","balsan-südtirol.it","balsan-suedtirol.it","balsan.it","bari.it","barletta-trani-andria.it","barlettatraniandria.it","belluno.it","benevento.it","bergamo.it","bg.it","bi.it","biella.it","bl.it","bn.it","bo.it","bologna.it","bolzano-altoadige.it","bolzano.it","bozen-sudtirol.it","bozen-südtirol.it","bozen-suedtirol.it","bozen.it","br.it","brescia.it","brindisi.it","bs.it","bt.it","bulsan-sudtirol.it","bulsan-südtirol.it","bulsan-suedtirol.it","bulsan.it","bz.it","ca.it","cagliari.it","caltanissetta.it","campidano-medio.it","campidanomedio.it","campobasso.it","carbonia-iglesias.it","carboniaiglesias.it","carrara-massa.it","carraramassa.it","caserta.it","catania.it","catanzaro.it","cb.it","ce.it","cesena-forli.it","cesena-forlì.it","cesenaforli.it","cesenaforlì.it","ch.it","chieti.it","ci.it","cl.it","cn.it","co.it","como.it","cosenza.it","cr.it","cremona.it","crotone.it","cs.it","ct.it","cuneo.it","cz.it","dell-ogliastra.it","dellogliastra.it","en.it","enna.it","fc.it","fe.it","fermo.it","ferrara.it","fg.it","fi.it","firenze.it","florence.it","fm.it","foggia.it","forli-cesena.it","forlì-cesena.it","forlicesena.it","forlìcesena.it","fr.it","frosinone.it","ge.it","genoa.it","genova.it","go.it","gorizia.it","gr.it","grosseto.it","iglesias-carbonia.it","iglesiascarbonia.it","im.it","imperia.it","is.it","isernia.it","kr.it","la-spezia.it","laquila.it","laspezia.it","latina.it","lc.it","le.it","lecce.it","lecco.it","li.it","livorno.it","lo.it","lodi.it","lt.it","lu.it","lucca.it","macerata.it","mantova.it","massa-carrara.it","massacarrara.it","matera.it","mb.it","mc.it","me.it","medio-campidano.it","mediocampidano.it","messina.it","mi.it","milan.it","milano.it","mn.it","mo.it","modena.it","monza-brianza.it","monza-e-della-brianza.it","monza.it","monzabrianza.it","monzaebrianza.it","monzaedellabrianza.it","ms.it","mt.it","na.it","naples.it","napoli.it","no.it","novara.it","nu.it","nuoro.it","og.it","ogliastra.it","olbia-tempio.it","olbiatempio.it","or.it","oristano.it","ot.it","pa.it","padova.it","padua.it","palermo.it","parma.it","pavia.it","pc.it","pd.it","pe.it","perugia.it","pesaro-urbino.it","pesarourbino.it","pescara.it","pg.it","pi.it","piacenza.it","pisa.it","pistoia.it","pn.it","po.it","pordenone.it","potenza.it","pr.it","prato.it","pt.it","pu.it","pv.it","pz.it","ra.it","ragusa.it","ravenna.it","rc.it","re.it","reggio-calabria.it","reggio-emilia.it","reggiocalabria.it","reggioemilia.it","rg.it","ri.it","rieti.it","rimini.it","rm.it","rn.it","ro.it","roma.it","rome.it","rovigo.it","sa.it","salerno.it","sassari.it","savona.it","si.it","siena.it","siracusa.it","so.it","sondrio.it","sp.it","sr.it","ss.it","suedtirol.it","südtirol.it","sv.it","ta.it","taranto.it","te.it","tempio-olbia.it","tempioolbia.it","teramo.it","terni.it","tn.it","to.it","torino.it","tp.it","tr.it","trani-andria-barletta.it","trani-barletta-andria.it","traniandriabarletta.it","tranibarlettaandria.it","trapani.it","trento.it","treviso.it","trieste.it","ts.it","turin.it","tv.it","ud.it","udine.it","urbino-pesaro.it","urbinopesaro.it","va.it","varese.it","vb.it","vc.it","ve.it","venezia.it","venice.it","verbania.it","vercelli.it","verona.it","vi.it","vibo-valentia.it","vibovalentia.it","vicenza.it","viterbo.it","vr.it","vs.it","vt.it","vv.it","je","co.je","net.je","org.je","*.jm","jo","com.jo","org.jo","net.jo","edu.jo","sch.jo","gov.jo","mil.jo","name.jo","jobs","jp","ac.jp","ad.jp","co.jp","ed.jp","go.jp","gr.jp","lg.jp","ne.jp","or.jp","aichi.jp","akita.jp","aomori.jp","chiba.jp","ehime.jp","fukui.jp","fukuoka.jp","fukushima.jp","gifu.jp","gunma.jp","hiroshima.jp","hokkaido.jp","hyogo.jp","ibaraki.jp","ishikawa.jp","iwate.jp","kagawa.jp","kagoshima.jp","kanagawa.jp","kochi.jp","kumamoto.jp","kyoto.jp","mie.jp","miyagi.jp","miyazaki.jp","nagano.jp","nagasaki.jp","nara.jp","niigata.jp","oita.jp","okayama.jp","okinawa.jp","osaka.jp","saga.jp","saitama.jp","shiga.jp","shimane.jp","shizuoka.jp","tochigi.jp","tokushima.jp","tokyo.jp","tottori.jp","toyama.jp","wakayama.jp","yamagata.jp","yamaguchi.jp","yamanashi.jp","栃木.jp","愛知.jp","愛媛.jp","兵庫.jp","熊本.jp","茨城.jp","北海道.jp","千葉.jp","和歌山.jp","長崎.jp","長野.jp","新潟.jp","青森.jp","静岡.jp","東京.jp","石川.jp","埼玉.jp","三重.jp","京都.jp","佐賀.jp","大分.jp","大阪.jp","奈良.jp","宮城.jp","宮崎.jp","富山.jp","山口.jp","山形.jp","山梨.jp","岩手.jp","岐阜.jp","岡山.jp","島根.jp","広島.jp","徳島.jp","沖縄.jp","滋賀.jp","神奈川.jp","福井.jp","福岡.jp","福島.jp","秋田.jp","群馬.jp","香川.jp","高知.jp","鳥取.jp","鹿児島.jp","*.kawasaki.jp","*.kitakyushu.jp","*.kobe.jp","*.nagoya.jp","*.sapporo.jp","*.sendai.jp","*.yokohama.jp","!city.kawasaki.jp","!city.kitakyushu.jp","!city.kobe.jp","!city.nagoya.jp","!city.sapporo.jp","!city.sendai.jp","!city.yokohama.jp","aisai.aichi.jp","ama.aichi.jp","anjo.aichi.jp","asuke.aichi.jp","chiryu.aichi.jp","chita.aichi.jp","fuso.aichi.jp","gamagori.aichi.jp","handa.aichi.jp","hazu.aichi.jp","hekinan.aichi.jp","higashiura.aichi.jp","ichinomiya.aichi.jp","inazawa.aichi.jp","inuyama.aichi.jp","isshiki.aichi.jp","iwakura.aichi.jp","kanie.aichi.jp","kariya.aichi.jp","kasugai.aichi.jp","kira.aichi.jp","kiyosu.aichi.jp","komaki.aichi.jp","konan.aichi.jp","kota.aichi.jp","mihama.aichi.jp","miyoshi.aichi.jp","nishio.aichi.jp","nisshin.aichi.jp","obu.aichi.jp","oguchi.aichi.jp","oharu.aichi.jp","okazaki.aichi.jp","owariasahi.aichi.jp","seto.aichi.jp","shikatsu.aichi.jp","shinshiro.aichi.jp","shitara.aichi.jp","tahara.aichi.jp","takahama.aichi.jp","tobishima.aichi.jp","toei.aichi.jp","togo.aichi.jp","tokai.aichi.jp","tokoname.aichi.jp","toyoake.aichi.jp","toyohashi.aichi.jp","toyokawa.aichi.jp","toyone.aichi.jp","toyota.aichi.jp","tsushima.aichi.jp","yatomi.aichi.jp","akita.akita.jp","daisen.akita.jp","fujisato.akita.jp","gojome.akita.jp","hachirogata.akita.jp","happou.akita.jp","higashinaruse.akita.jp","honjo.akita.jp","honjyo.akita.jp","ikawa.akita.jp","kamikoani.akita.jp","kamioka.akita.jp","katagami.akita.jp","kazuno.akita.jp","kitaakita.akita.jp","kosaka.akita.jp","kyowa.akita.jp","misato.akita.jp","mitane.akita.jp","moriyoshi.akita.jp","nikaho.akita.jp","noshiro.akita.jp","odate.akita.jp","oga.akita.jp","ogata.akita.jp","semboku.akita.jp","yokote.akita.jp","yurihonjo.akita.jp","aomori.aomori.jp","gonohe.aomori.jp","hachinohe.aomori.jp","hashikami.aomori.jp","hiranai.aomori.jp","hirosaki.aomori.jp","itayanagi.aomori.jp","kuroishi.aomori.jp","misawa.aomori.jp","mutsu.aomori.jp","nakadomari.aomori.jp","noheji.aomori.jp","oirase.aomori.jp","owani.aomori.jp","rokunohe.aomori.jp","sannohe.aomori.jp","shichinohe.aomori.jp","shingo.aomori.jp","takko.aomori.jp","towada.aomori.jp","tsugaru.aomori.jp","tsuruta.aomori.jp","abiko.chiba.jp","asahi.chiba.jp","chonan.chiba.jp","chosei.chiba.jp","choshi.chiba.jp","chuo.chiba.jp","funabashi.chiba.jp","futtsu.chiba.jp","hanamigawa.chiba.jp","ichihara.chiba.jp","ichikawa.chiba.jp","ichinomiya.chiba.jp","inzai.chiba.jp","isumi.chiba.jp","kamagaya.chiba.jp","kamogawa.chiba.jp","kashiwa.chiba.jp","katori.chiba.jp","katsuura.chiba.jp","kimitsu.chiba.jp","kisarazu.chiba.jp","kozaki.chiba.jp","kujukuri.chiba.jp","kyonan.chiba.jp","matsudo.chiba.jp","midori.chiba.jp","mihama.chiba.jp","minamiboso.chiba.jp","mobara.chiba.jp","mutsuzawa.chiba.jp","nagara.chiba.jp","nagareyama.chiba.jp","narashino.chiba.jp","narita.chiba.jp","noda.chiba.jp","oamishirasato.chiba.jp","omigawa.chiba.jp","onjuku.chiba.jp","otaki.chiba.jp","sakae.chiba.jp","sakura.chiba.jp","shimofusa.chiba.jp","shirako.chiba.jp","shiroi.chiba.jp","shisui.chiba.jp","sodegaura.chiba.jp","sosa.chiba.jp","tako.chiba.jp","tateyama.chiba.jp","togane.chiba.jp","tohnosho.chiba.jp","tomisato.chiba.jp","urayasu.chiba.jp","yachimata.chiba.jp","yachiyo.chiba.jp","yokaichiba.chiba.jp","yokoshibahikari.chiba.jp","yotsukaido.chiba.jp","ainan.ehime.jp","honai.ehime.jp","ikata.ehime.jp","imabari.ehime.jp","iyo.ehime.jp","kamijima.ehime.jp","kihoku.ehime.jp","kumakogen.ehime.jp","masaki.ehime.jp","matsuno.ehime.jp","matsuyama.ehime.jp","namikata.ehime.jp","niihama.ehime.jp","ozu.ehime.jp","saijo.ehime.jp","seiyo.ehime.jp","shikokuchuo.ehime.jp","tobe.ehime.jp","toon.ehime.jp","uchiko.ehime.jp","uwajima.ehime.jp","yawatahama.ehime.jp","echizen.fukui.jp","eiheiji.fukui.jp","fukui.fukui.jp","ikeda.fukui.jp","katsuyama.fukui.jp","mihama.fukui.jp","minamiechizen.fukui.jp","obama.fukui.jp","ohi.fukui.jp","ono.fukui.jp","sabae.fukui.jp","sakai.fukui.jp","takahama.fukui.jp","tsuruga.fukui.jp","wakasa.fukui.jp","ashiya.fukuoka.jp","buzen.fukuoka.jp","chikugo.fukuoka.jp","chikuho.fukuoka.jp","chikujo.fukuoka.jp","chikushino.fukuoka.jp","chikuzen.fukuoka.jp","chuo.fukuoka.jp","dazaifu.fukuoka.jp","fukuchi.fukuoka.jp","hakata.fukuoka.jp","higashi.fukuoka.jp","hirokawa.fukuoka.jp","hisayama.fukuoka.jp","iizuka.fukuoka.jp","inatsuki.fukuoka.jp","kaho.fukuoka.jp","kasuga.fukuoka.jp","kasuya.fukuoka.jp","kawara.fukuoka.jp","keisen.fukuoka.jp","koga.fukuoka.jp","kurate.fukuoka.jp","kurogi.fukuoka.jp","kurume.fukuoka.jp","minami.fukuoka.jp","miyako.fukuoka.jp","miyama.fukuoka.jp","miyawaka.fukuoka.jp","mizumaki.fukuoka.jp","munakata.fukuoka.jp","nakagawa.fukuoka.jp","nakama.fukuoka.jp","nishi.fukuoka.jp","nogata.fukuoka.jp","ogori.fukuoka.jp","okagaki.fukuoka.jp","okawa.fukuoka.jp","oki.fukuoka.jp","omuta.fukuoka.jp","onga.fukuoka.jp","onojo.fukuoka.jp","oto.fukuoka.jp","saigawa.fukuoka.jp","sasaguri.fukuoka.jp","shingu.fukuoka.jp","shinyoshitomi.fukuoka.jp","shonai.fukuoka.jp","soeda.fukuoka.jp","sue.fukuoka.jp","tachiarai.fukuoka.jp","tagawa.fukuoka.jp","takata.fukuoka.jp","toho.fukuoka.jp","toyotsu.fukuoka.jp","tsuiki.fukuoka.jp","ukiha.fukuoka.jp","umi.fukuoka.jp","usui.fukuoka.jp","yamada.fukuoka.jp","yame.fukuoka.jp","yanagawa.fukuoka.jp","yukuhashi.fukuoka.jp","aizubange.fukushima.jp","aizumisato.fukushima.jp","aizuwakamatsu.fukushima.jp","asakawa.fukushima.jp","bandai.fukushima.jp","date.fukushima.jp","fukushima.fukushima.jp","furudono.fukushima.jp","futaba.fukushima.jp","hanawa.fukushima.jp","higashi.fukushima.jp","hirata.fukushima.jp","hirono.fukushima.jp","iitate.fukushima.jp","inawashiro.fukushima.jp","ishikawa.fukushima.jp","iwaki.fukushima.jp","izumizaki.fukushima.jp","kagamiishi.fukushima.jp","kaneyama.fukushima.jp","kawamata.fukushima.jp","kitakata.fukushima.jp","kitashiobara.fukushima.jp","koori.fukushima.jp","koriyama.fukushima.jp","kunimi.fukushima.jp","miharu.fukushima.jp","mishima.fukushima.jp","namie.fukushima.jp","nango.fukushima.jp","nishiaizu.fukushima.jp","nishigo.fukushima.jp","okuma.fukushima.jp","omotego.fukushima.jp","ono.fukushima.jp","otama.fukushima.jp","samegawa.fukushima.jp","shimogo.fukushima.jp","shirakawa.fukushima.jp","showa.fukushima.jp","soma.fukushima.jp","sukagawa.fukushima.jp","taishin.fukushima.jp","tamakawa.fukushima.jp","tanagura.fukushima.jp","tenei.fukushima.jp","yabuki.fukushima.jp","yamato.fukushima.jp","yamatsuri.fukushima.jp","yanaizu.fukushima.jp","yugawa.fukushima.jp","anpachi.gifu.jp","ena.gifu.jp","gifu.gifu.jp","ginan.gifu.jp","godo.gifu.jp","gujo.gifu.jp","hashima.gifu.jp","hichiso.gifu.jp","hida.gifu.jp","higashishirakawa.gifu.jp","ibigawa.gifu.jp","ikeda.gifu.jp","kakamigahara.gifu.jp","kani.gifu.jp","kasahara.gifu.jp","kasamatsu.gifu.jp","kawaue.gifu.jp","kitagata.gifu.jp","mino.gifu.jp","minokamo.gifu.jp","mitake.gifu.jp","mizunami.gifu.jp","motosu.gifu.jp","nakatsugawa.gifu.jp","ogaki.gifu.jp","sakahogi.gifu.jp","seki.gifu.jp","sekigahara.gifu.jp","shirakawa.gifu.jp","tajimi.gifu.jp","takayama.gifu.jp","tarui.gifu.jp","toki.gifu.jp","tomika.gifu.jp","wanouchi.gifu.jp","yamagata.gifu.jp","yaotsu.gifu.jp","yoro.gifu.jp","annaka.gunma.jp","chiyoda.gunma.jp","fujioka.gunma.jp","higashiagatsuma.gunma.jp","isesaki.gunma.jp","itakura.gunma.jp","kanna.gunma.jp","kanra.gunma.jp","katashina.gunma.jp","kawaba.gunma.jp","kiryu.gunma.jp","kusatsu.gunma.jp","maebashi.gunma.jp","meiwa.gunma.jp","midori.gunma.jp","minakami.gunma.jp","naganohara.gunma.jp","nakanojo.gunma.jp","nanmoku.gunma.jp","numata.gunma.jp","oizumi.gunma.jp","ora.gunma.jp","ota.gunma.jp","shibukawa.gunma.jp","shimonita.gunma.jp","shinto.gunma.jp","showa.gunma.jp","takasaki.gunma.jp","takayama.gunma.jp","tamamura.gunma.jp","tatebayashi.gunma.jp","tomioka.gunma.jp","tsukiyono.gunma.jp","tsumagoi.gunma.jp","ueno.gunma.jp","yoshioka.gunma.jp","asaminami.hiroshima.jp","daiwa.hiroshima.jp","etajima.hiroshima.jp","fuchu.hiroshima.jp","fukuyama.hiroshima.jp","hatsukaichi.hiroshima.jp","higashihiroshima.hiroshima.jp","hongo.hiroshima.jp","jinsekikogen.hiroshima.jp","kaita.hiroshima.jp","kui.hiroshima.jp","kumano.hiroshima.jp","kure.hiroshima.jp","mihara.hiroshima.jp","miyoshi.hiroshima.jp","naka.hiroshima.jp","onomichi.hiroshima.jp","osakikamijima.hiroshima.jp","otake.hiroshima.jp","saka.hiroshima.jp","sera.hiroshima.jp","seranishi.hiroshima.jp","shinichi.hiroshima.jp","shobara.hiroshima.jp","takehara.hiroshima.jp","abashiri.hokkaido.jp","abira.hokkaido.jp","aibetsu.hokkaido.jp","akabira.hokkaido.jp","akkeshi.hokkaido.jp","asahikawa.hokkaido.jp","ashibetsu.hokkaido.jp","ashoro.hokkaido.jp","assabu.hokkaido.jp","atsuma.hokkaido.jp","bibai.hokkaido.jp","biei.hokkaido.jp","bifuka.hokkaido.jp","bihoro.hokkaido.jp","biratori.hokkaido.jp","chippubetsu.hokkaido.jp","chitose.hokkaido.jp","date.hokkaido.jp","ebetsu.hokkaido.jp","embetsu.hokkaido.jp","eniwa.hokkaido.jp","erimo.hokkaido.jp","esan.hokkaido.jp","esashi.hokkaido.jp","fukagawa.hokkaido.jp","fukushima.hokkaido.jp","furano.hokkaido.jp","furubira.hokkaido.jp","haboro.hokkaido.jp","hakodate.hokkaido.jp","hamatonbetsu.hokkaido.jp","hidaka.hokkaido.jp","higashikagura.hokkaido.jp","higashikawa.hokkaido.jp","hiroo.hokkaido.jp","hokuryu.hokkaido.jp","hokuto.hokkaido.jp","honbetsu.hokkaido.jp","horokanai.hokkaido.jp","horonobe.hokkaido.jp","ikeda.hokkaido.jp","imakane.hokkaido.jp","ishikari.hokkaido.jp","iwamizawa.hokkaido.jp","iwanai.hokkaido.jp","kamifurano.hokkaido.jp","kamikawa.hokkaido.jp","kamishihoro.hokkaido.jp","kamisunagawa.hokkaido.jp","kamoenai.hokkaido.jp","kayabe.hokkaido.jp","kembuchi.hokkaido.jp","kikonai.hokkaido.jp","kimobetsu.hokkaido.jp","kitahiroshima.hokkaido.jp","kitami.hokkaido.jp","kiyosato.hokkaido.jp","koshimizu.hokkaido.jp","kunneppu.hokkaido.jp","kuriyama.hokkaido.jp","kuromatsunai.hokkaido.jp","kushiro.hokkaido.jp","kutchan.hokkaido.jp","kyowa.hokkaido.jp","mashike.hokkaido.jp","matsumae.hokkaido.jp","mikasa.hokkaido.jp","minamifurano.hokkaido.jp","mombetsu.hokkaido.jp","moseushi.hokkaido.jp","mukawa.hokkaido.jp","muroran.hokkaido.jp","naie.hokkaido.jp","nakagawa.hokkaido.jp","nakasatsunai.hokkaido.jp","nakatombetsu.hokkaido.jp","nanae.hokkaido.jp","nanporo.hokkaido.jp","nayoro.hokkaido.jp","nemuro.hokkaido.jp","niikappu.hokkaido.jp","niki.hokkaido.jp","nishiokoppe.hokkaido.jp","noboribetsu.hokkaido.jp","numata.hokkaido.jp","obihiro.hokkaido.jp","obira.hokkaido.jp","oketo.hokkaido.jp","okoppe.hokkaido.jp","otaru.hokkaido.jp","otobe.hokkaido.jp","otofuke.hokkaido.jp","otoineppu.hokkaido.jp","oumu.hokkaido.jp","ozora.hokkaido.jp","pippu.hokkaido.jp","rankoshi.hokkaido.jp","rebun.hokkaido.jp","rikubetsu.hokkaido.jp","rishiri.hokkaido.jp","rishirifuji.hokkaido.jp","saroma.hokkaido.jp","sarufutsu.hokkaido.jp","shakotan.hokkaido.jp","shari.hokkaido.jp","shibecha.hokkaido.jp","shibetsu.hokkaido.jp","shikabe.hokkaido.jp","shikaoi.hokkaido.jp","shimamaki.hokkaido.jp","shimizu.hokkaido.jp","shimokawa.hokkaido.jp","shinshinotsu.hokkaido.jp","shintoku.hokkaido.jp","shiranuka.hokkaido.jp","shiraoi.hokkaido.jp","shiriuchi.hokkaido.jp","sobetsu.hokkaido.jp","sunagawa.hokkaido.jp","taiki.hokkaido.jp","takasu.hokkaido.jp","takikawa.hokkaido.jp","takinoue.hokkaido.jp","teshikaga.hokkaido.jp","tobetsu.hokkaido.jp","tohma.hokkaido.jp","tomakomai.hokkaido.jp","tomari.hokkaido.jp","toya.hokkaido.jp","toyako.hokkaido.jp","toyotomi.hokkaido.jp","toyoura.hokkaido.jp","tsubetsu.hokkaido.jp","tsukigata.hokkaido.jp","urakawa.hokkaido.jp","urausu.hokkaido.jp","uryu.hokkaido.jp","utashinai.hokkaido.jp","wakkanai.hokkaido.jp","wassamu.hokkaido.jp","yakumo.hokkaido.jp","yoichi.hokkaido.jp","aioi.hyogo.jp","akashi.hyogo.jp","ako.hyogo.jp","amagasaki.hyogo.jp","aogaki.hyogo.jp","asago.hyogo.jp","ashiya.hyogo.jp","awaji.hyogo.jp","fukusaki.hyogo.jp","goshiki.hyogo.jp","harima.hyogo.jp","himeji.hyogo.jp","ichikawa.hyogo.jp","inagawa.hyogo.jp","itami.hyogo.jp","kakogawa.hyogo.jp","kamigori.hyogo.jp","kamikawa.hyogo.jp","kasai.hyogo.jp","kasuga.hyogo.jp","kawanishi.hyogo.jp","miki.hyogo.jp","minamiawaji.hyogo.jp","nishinomiya.hyogo.jp","nishiwaki.hyogo.jp","ono.hyogo.jp","sanda.hyogo.jp","sannan.hyogo.jp","sasayama.hyogo.jp","sayo.hyogo.jp","shingu.hyogo.jp","shinonsen.hyogo.jp","shiso.hyogo.jp","sumoto.hyogo.jp","taishi.hyogo.jp","taka.hyogo.jp","takarazuka.hyogo.jp","takasago.hyogo.jp","takino.hyogo.jp","tamba.hyogo.jp","tatsuno.hyogo.jp","toyooka.hyogo.jp","yabu.hyogo.jp","yashiro.hyogo.jp","yoka.hyogo.jp","yokawa.hyogo.jp","ami.ibaraki.jp","asahi.ibaraki.jp","bando.ibaraki.jp","chikusei.ibaraki.jp","daigo.ibaraki.jp","fujishiro.ibaraki.jp","hitachi.ibaraki.jp","hitachinaka.ibaraki.jp","hitachiomiya.ibaraki.jp","hitachiota.ibaraki.jp","ibaraki.ibaraki.jp","ina.ibaraki.jp","inashiki.ibaraki.jp","itako.ibaraki.jp","iwama.ibaraki.jp","joso.ibaraki.jp","kamisu.ibaraki.jp","kasama.ibaraki.jp","kashima.ibaraki.jp","kasumigaura.ibaraki.jp","koga.ibaraki.jp","miho.ibaraki.jp","mito.ibaraki.jp","moriya.ibaraki.jp","naka.ibaraki.jp","namegata.ibaraki.jp","oarai.ibaraki.jp","ogawa.ibaraki.jp","omitama.ibaraki.jp","ryugasaki.ibaraki.jp","sakai.ibaraki.jp","sakuragawa.ibaraki.jp","shimodate.ibaraki.jp","shimotsuma.ibaraki.jp","shirosato.ibaraki.jp","sowa.ibaraki.jp","suifu.ibaraki.jp","takahagi.ibaraki.jp","tamatsukuri.ibaraki.jp","tokai.ibaraki.jp","tomobe.ibaraki.jp","tone.ibaraki.jp","toride.ibaraki.jp","tsuchiura.ibaraki.jp","tsukuba.ibaraki.jp","uchihara.ibaraki.jp","ushiku.ibaraki.jp","yachiyo.ibaraki.jp","yamagata.ibaraki.jp","yawara.ibaraki.jp","yuki.ibaraki.jp","anamizu.ishikawa.jp","hakui.ishikawa.jp","hakusan.ishikawa.jp","kaga.ishikawa.jp","kahoku.ishikawa.jp","kanazawa.ishikawa.jp","kawakita.ishikawa.jp","komatsu.ishikawa.jp","nakanoto.ishikawa.jp","nanao.ishikawa.jp","nomi.ishikawa.jp","nonoichi.ishikawa.jp","noto.ishikawa.jp","shika.ishikawa.jp","suzu.ishikawa.jp","tsubata.ishikawa.jp","tsurugi.ishikawa.jp","uchinada.ishikawa.jp","wajima.ishikawa.jp","fudai.iwate.jp","fujisawa.iwate.jp","hanamaki.iwate.jp","hiraizumi.iwate.jp","hirono.iwate.jp","ichinohe.iwate.jp","ichinoseki.iwate.jp","iwaizumi.iwate.jp","iwate.iwate.jp","joboji.iwate.jp","kamaishi.iwate.jp","kanegasaki.iwate.jp","karumai.iwate.jp","kawai.iwate.jp","kitakami.iwate.jp","kuji.iwate.jp","kunohe.iwate.jp","kuzumaki.iwate.jp","miyako.iwate.jp","mizusawa.iwate.jp","morioka.iwate.jp","ninohe.iwate.jp","noda.iwate.jp","ofunato.iwate.jp","oshu.iwate.jp","otsuchi.iwate.jp","rikuzentakata.iwate.jp","shiwa.iwate.jp","shizukuishi.iwate.jp","sumita.iwate.jp","tanohata.iwate.jp","tono.iwate.jp","yahaba.iwate.jp","yamada.iwate.jp","ayagawa.kagawa.jp","higashikagawa.kagawa.jp","kanonji.kagawa.jp","kotohira.kagawa.jp","manno.kagawa.jp","marugame.kagawa.jp","mitoyo.kagawa.jp","naoshima.kagawa.jp","sanuki.kagawa.jp","tadotsu.kagawa.jp","takamatsu.kagawa.jp","tonosho.kagawa.jp","uchinomi.kagawa.jp","utazu.kagawa.jp","zentsuji.kagawa.jp","akune.kagoshima.jp","amami.kagoshima.jp","hioki.kagoshima.jp","isa.kagoshima.jp","isen.kagoshima.jp","izumi.kagoshima.jp","kagoshima.kagoshima.jp","kanoya.kagoshima.jp","kawanabe.kagoshima.jp","kinko.kagoshima.jp","kouyama.kagoshima.jp","makurazaki.kagoshima.jp","matsumoto.kagoshima.jp","minamitane.kagoshima.jp","nakatane.kagoshima.jp","nishinoomote.kagoshima.jp","satsumasendai.kagoshima.jp","soo.kagoshima.jp","tarumizu.kagoshima.jp","yusui.kagoshima.jp","aikawa.kanagawa.jp","atsugi.kanagawa.jp","ayase.kanagawa.jp","chigasaki.kanagawa.jp","ebina.kanagawa.jp","fujisawa.kanagawa.jp","hadano.kanagawa.jp","hakone.kanagawa.jp","hiratsuka.kanagawa.jp","isehara.kanagawa.jp","kaisei.kanagawa.jp","kamakura.kanagawa.jp","kiyokawa.kanagawa.jp","matsuda.kanagawa.jp","minamiashigara.kanagawa.jp","miura.kanagawa.jp","nakai.kanagawa.jp","ninomiya.kanagawa.jp","odawara.kanagawa.jp","oi.kanagawa.jp","oiso.kanagawa.jp","sagamihara.kanagawa.jp","samukawa.kanagawa.jp","tsukui.kanagawa.jp","yamakita.kanagawa.jp","yamato.kanagawa.jp","yokosuka.kanagawa.jp","yugawara.kanagawa.jp","zama.kanagawa.jp","zushi.kanagawa.jp","aki.kochi.jp","geisei.kochi.jp","hidaka.kochi.jp","higashitsuno.kochi.jp","ino.kochi.jp","kagami.kochi.jp","kami.kochi.jp","kitagawa.kochi.jp","kochi.kochi.jp","mihara.kochi.jp","motoyama.kochi.jp","muroto.kochi.jp","nahari.kochi.jp","nakamura.kochi.jp","nankoku.kochi.jp","nishitosa.kochi.jp","niyodogawa.kochi.jp","ochi.kochi.jp","okawa.kochi.jp","otoyo.kochi.jp","otsuki.kochi.jp","sakawa.kochi.jp","sukumo.kochi.jp","susaki.kochi.jp","tosa.kochi.jp","tosashimizu.kochi.jp","toyo.kochi.jp","tsuno.kochi.jp","umaji.kochi.jp","yasuda.kochi.jp","yusuhara.kochi.jp","amakusa.kumamoto.jp","arao.kumamoto.jp","aso.kumamoto.jp","choyo.kumamoto.jp","gyokuto.kumamoto.jp","kamiamakusa.kumamoto.jp","kikuchi.kumamoto.jp","kumamoto.kumamoto.jp","mashiki.kumamoto.jp","mifune.kumamoto.jp","minamata.kumamoto.jp","minamioguni.kumamoto.jp","nagasu.kumamoto.jp","nishihara.kumamoto.jp","oguni.kumamoto.jp","ozu.kumamoto.jp","sumoto.kumamoto.jp","takamori.kumamoto.jp","uki.kumamoto.jp","uto.kumamoto.jp","yamaga.kumamoto.jp","yamato.kumamoto.jp","yatsushiro.kumamoto.jp","ayabe.kyoto.jp","fukuchiyama.kyoto.jp","higashiyama.kyoto.jp","ide.kyoto.jp","ine.kyoto.jp","joyo.kyoto.jp","kameoka.kyoto.jp","kamo.kyoto.jp","kita.kyoto.jp","kizu.kyoto.jp","kumiyama.kyoto.jp","kyotamba.kyoto.jp","kyotanabe.kyoto.jp","kyotango.kyoto.jp","maizuru.kyoto.jp","minami.kyoto.jp","minamiyamashiro.kyoto.jp","miyazu.kyoto.jp","muko.kyoto.jp","nagaokakyo.kyoto.jp","nakagyo.kyoto.jp","nantan.kyoto.jp","oyamazaki.kyoto.jp","sakyo.kyoto.jp","seika.kyoto.jp","tanabe.kyoto.jp","uji.kyoto.jp","ujitawara.kyoto.jp","wazuka.kyoto.jp","yamashina.kyoto.jp","yawata.kyoto.jp","asahi.mie.jp","inabe.mie.jp","ise.mie.jp","kameyama.mie.jp","kawagoe.mie.jp","kiho.mie.jp","kisosaki.mie.jp","kiwa.mie.jp","komono.mie.jp","kumano.mie.jp","kuwana.mie.jp","matsusaka.mie.jp","meiwa.mie.jp","mihama.mie.jp","minamiise.mie.jp","misugi.mie.jp","miyama.mie.jp","nabari.mie.jp","shima.mie.jp","suzuka.mie.jp","tado.mie.jp","taiki.mie.jp","taki.mie.jp","tamaki.mie.jp","toba.mie.jp","tsu.mie.jp","udono.mie.jp","ureshino.mie.jp","watarai.mie.jp","yokkaichi.mie.jp","furukawa.miyagi.jp","higashimatsushima.miyagi.jp","ishinomaki.miyagi.jp","iwanuma.miyagi.jp","kakuda.miyagi.jp","kami.miyagi.jp","kawasaki.miyagi.jp","marumori.miyagi.jp","matsushima.miyagi.jp","minamisanriku.miyagi.jp","misato.miyagi.jp","murata.miyagi.jp","natori.miyagi.jp","ogawara.miyagi.jp","ohira.miyagi.jp","onagawa.miyagi.jp","osaki.miyagi.jp","rifu.miyagi.jp","semine.miyagi.jp","shibata.miyagi.jp","shichikashuku.miyagi.jp","shikama.miyagi.jp","shiogama.miyagi.jp","shiroishi.miyagi.jp","tagajo.miyagi.jp","taiwa.miyagi.jp","tome.miyagi.jp","tomiya.miyagi.jp","wakuya.miyagi.jp","watari.miyagi.jp","yamamoto.miyagi.jp","zao.miyagi.jp","aya.miyazaki.jp","ebino.miyazaki.jp","gokase.miyazaki.jp","hyuga.miyazaki.jp","kadogawa.miyazaki.jp","kawaminami.miyazaki.jp","kijo.miyazaki.jp","kitagawa.miyazaki.jp","kitakata.miyazaki.jp","kitaura.miyazaki.jp","kobayashi.miyazaki.jp","kunitomi.miyazaki.jp","kushima.miyazaki.jp","mimata.miyazaki.jp","miyakonojo.miyazaki.jp","miyazaki.miyazaki.jp","morotsuka.miyazaki.jp","nichinan.miyazaki.jp","nishimera.miyazaki.jp","nobeoka.miyazaki.jp","saito.miyazaki.jp","shiiba.miyazaki.jp","shintomi.miyazaki.jp","takaharu.miyazaki.jp","takanabe.miyazaki.jp","takazaki.miyazaki.jp","tsuno.miyazaki.jp","achi.nagano.jp","agematsu.nagano.jp","anan.nagano.jp","aoki.nagano.jp","asahi.nagano.jp","azumino.nagano.jp","chikuhoku.nagano.jp","chikuma.nagano.jp","chino.nagano.jp","fujimi.nagano.jp","hakuba.nagano.jp","hara.nagano.jp","hiraya.nagano.jp","iida.nagano.jp","iijima.nagano.jp","iiyama.nagano.jp","iizuna.nagano.jp","ikeda.nagano.jp","ikusaka.nagano.jp","ina.nagano.jp","karuizawa.nagano.jp","kawakami.nagano.jp","kiso.nagano.jp","kisofukushima.nagano.jp","kitaaiki.nagano.jp","komagane.nagano.jp","komoro.nagano.jp","matsukawa.nagano.jp","matsumoto.nagano.jp","miasa.nagano.jp","minamiaiki.nagano.jp","minamimaki.nagano.jp","minamiminowa.nagano.jp","minowa.nagano.jp","miyada.nagano.jp","miyota.nagano.jp","mochizuki.nagano.jp","nagano.nagano.jp","nagawa.nagano.jp","nagiso.nagano.jp","nakagawa.nagano.jp","nakano.nagano.jp","nozawaonsen.nagano.jp","obuse.nagano.jp","ogawa.nagano.jp","okaya.nagano.jp","omachi.nagano.jp","omi.nagano.jp","ookuwa.nagano.jp","ooshika.nagano.jp","otaki.nagano.jp","otari.nagano.jp","sakae.nagano.jp","sakaki.nagano.jp","saku.nagano.jp","sakuho.nagano.jp","shimosuwa.nagano.jp","shinanomachi.nagano.jp","shiojiri.nagano.jp","suwa.nagano.jp","suzaka.nagano.jp","takagi.nagano.jp","takamori.nagano.jp","takayama.nagano.jp","tateshina.nagano.jp","tatsuno.nagano.jp","togakushi.nagano.jp","togura.nagano.jp","tomi.nagano.jp","ueda.nagano.jp","wada.nagano.jp","yamagata.nagano.jp","yamanouchi.nagano.jp","yasaka.nagano.jp","yasuoka.nagano.jp","chijiwa.nagasaki.jp","futsu.nagasaki.jp","goto.nagasaki.jp","hasami.nagasaki.jp","hirado.nagasaki.jp","iki.nagasaki.jp","isahaya.nagasaki.jp","kawatana.nagasaki.jp","kuchinotsu.nagasaki.jp","matsuura.nagasaki.jp","nagasaki.nagasaki.jp","obama.nagasaki.jp","omura.nagasaki.jp","oseto.nagasaki.jp","saikai.nagasaki.jp","sasebo.nagasaki.jp","seihi.nagasaki.jp","shimabara.nagasaki.jp","shinkamigoto.nagasaki.jp","togitsu.nagasaki.jp","tsushima.nagasaki.jp","unzen.nagasaki.jp","ando.nara.jp","gose.nara.jp","heguri.nara.jp","higashiyoshino.nara.jp","ikaruga.nara.jp","ikoma.nara.jp","kamikitayama.nara.jp","kanmaki.nara.jp","kashiba.nara.jp","kashihara.nara.jp","katsuragi.nara.jp","kawai.nara.jp","kawakami.nara.jp","kawanishi.nara.jp","koryo.nara.jp","kurotaki.nara.jp","mitsue.nara.jp","miyake.nara.jp","nara.nara.jp","nosegawa.nara.jp","oji.nara.jp","ouda.nara.jp","oyodo.nara.jp","sakurai.nara.jp","sango.nara.jp","shimoichi.nara.jp","shimokitayama.nara.jp","shinjo.nara.jp","soni.nara.jp","takatori.nara.jp","tawaramoto.nara.jp","tenkawa.nara.jp","tenri.nara.jp","uda.nara.jp","yamatokoriyama.nara.jp","yamatotakada.nara.jp","yamazoe.nara.jp","yoshino.nara.jp","aga.niigata.jp","agano.niigata.jp","gosen.niigata.jp","itoigawa.niigata.jp","izumozaki.niigata.jp","joetsu.niigata.jp","kamo.niigata.jp","kariwa.niigata.jp","kashiwazaki.niigata.jp","minamiuonuma.niigata.jp","mitsuke.niigata.jp","muika.niigata.jp","murakami.niigata.jp","myoko.niigata.jp","nagaoka.niigata.jp","niigata.niigata.jp","ojiya.niigata.jp","omi.niigata.jp","sado.niigata.jp","sanjo.niigata.jp","seiro.niigata.jp","seirou.niigata.jp","sekikawa.niigata.jp","shibata.niigata.jp","tagami.niigata.jp","tainai.niigata.jp","tochio.niigata.jp","tokamachi.niigata.jp","tsubame.niigata.jp","tsunan.niigata.jp","uonuma.niigata.jp","yahiko.niigata.jp","yoita.niigata.jp","yuzawa.niigata.jp","beppu.oita.jp","bungoono.oita.jp","bungotakada.oita.jp","hasama.oita.jp","hiji.oita.jp","himeshima.oita.jp","hita.oita.jp","kamitsue.oita.jp","kokonoe.oita.jp","kuju.oita.jp","kunisaki.oita.jp","kusu.oita.jp","oita.oita.jp","saiki.oita.jp","taketa.oita.jp","tsukumi.oita.jp","usa.oita.jp","usuki.oita.jp","yufu.oita.jp","akaiwa.okayama.jp","asakuchi.okayama.jp","bizen.okayama.jp","hayashima.okayama.jp","ibara.okayama.jp","kagamino.okayama.jp","kasaoka.okayama.jp","kibichuo.okayama.jp","kumenan.okayama.jp","kurashiki.okayama.jp","maniwa.okayama.jp","misaki.okayama.jp","nagi.okayama.jp","niimi.okayama.jp","nishiawakura.okayama.jp","okayama.okayama.jp","satosho.okayama.jp","setouchi.okayama.jp","shinjo.okayama.jp","shoo.okayama.jp","soja.okayama.jp","takahashi.okayama.jp","tamano.okayama.jp","tsuyama.okayama.jp","wake.okayama.jp","yakage.okayama.jp","aguni.okinawa.jp","ginowan.okinawa.jp","ginoza.okinawa.jp","gushikami.okinawa.jp","haebaru.okinawa.jp","higashi.okinawa.jp","hirara.okinawa.jp","iheya.okinawa.jp","ishigaki.okinawa.jp","ishikawa.okinawa.jp","itoman.okinawa.jp","izena.okinawa.jp","kadena.okinawa.jp","kin.okinawa.jp","kitadaito.okinawa.jp","kitanakagusuku.okinawa.jp","kumejima.okinawa.jp","kunigami.okinawa.jp","minamidaito.okinawa.jp","motobu.okinawa.jp","nago.okinawa.jp","naha.okinawa.jp","nakagusuku.okinawa.jp","nakijin.okinawa.jp","nanjo.okinawa.jp","nishihara.okinawa.jp","ogimi.okinawa.jp","okinawa.okinawa.jp","onna.okinawa.jp","shimoji.okinawa.jp","taketomi.okinawa.jp","tarama.okinawa.jp","tokashiki.okinawa.jp","tomigusuku.okinawa.jp","tonaki.okinawa.jp","urasoe.okinawa.jp","uruma.okinawa.jp","yaese.okinawa.jp","yomitan.okinawa.jp","yonabaru.okinawa.jp","yonaguni.okinawa.jp","zamami.okinawa.jp","abeno.osaka.jp","chihayaakasaka.osaka.jp","chuo.osaka.jp","daito.osaka.jp","fujiidera.osaka.jp","habikino.osaka.jp","hannan.osaka.jp","higashiosaka.osaka.jp","higashisumiyoshi.osaka.jp","higashiyodogawa.osaka.jp","hirakata.osaka.jp","ibaraki.osaka.jp","ikeda.osaka.jp","izumi.osaka.jp","izumiotsu.osaka.jp","izumisano.osaka.jp","kadoma.osaka.jp","kaizuka.osaka.jp","kanan.osaka.jp","kashiwara.osaka.jp","katano.osaka.jp","kawachinagano.osaka.jp","kishiwada.osaka.jp","kita.osaka.jp","kumatori.osaka.jp","matsubara.osaka.jp","minato.osaka.jp","minoh.osaka.jp","misaki.osaka.jp","moriguchi.osaka.jp","neyagawa.osaka.jp","nishi.osaka.jp","nose.osaka.jp","osakasayama.osaka.jp","sakai.osaka.jp","sayama.osaka.jp","sennan.osaka.jp","settsu.osaka.jp","shijonawate.osaka.jp","shimamoto.osaka.jp","suita.osaka.jp","tadaoka.osaka.jp","taishi.osaka.jp","tajiri.osaka.jp","takaishi.osaka.jp","takatsuki.osaka.jp","tondabayashi.osaka.jp","toyonaka.osaka.jp","toyono.osaka.jp","yao.osaka.jp","ariake.saga.jp","arita.saga.jp","fukudomi.saga.jp","genkai.saga.jp","hamatama.saga.jp","hizen.saga.jp","imari.saga.jp","kamimine.saga.jp","kanzaki.saga.jp","karatsu.saga.jp","kashima.saga.jp","kitagata.saga.jp","kitahata.saga.jp","kiyama.saga.jp","kouhoku.saga.jp","kyuragi.saga.jp","nishiarita.saga.jp","ogi.saga.jp","omachi.saga.jp","ouchi.saga.jp","saga.saga.jp","shiroishi.saga.jp","taku.saga.jp","tara.saga.jp","tosu.saga.jp","yoshinogari.saga.jp","arakawa.saitama.jp","asaka.saitama.jp","chichibu.saitama.jp","fujimi.saitama.jp","fujimino.saitama.jp","fukaya.saitama.jp","hanno.saitama.jp","hanyu.saitama.jp","hasuda.saitama.jp","hatogaya.saitama.jp","hatoyama.saitama.jp","hidaka.saitama.jp","higashichichibu.saitama.jp","higashimatsuyama.saitama.jp","honjo.saitama.jp","ina.saitama.jp","iruma.saitama.jp","iwatsuki.saitama.jp","kamiizumi.saitama.jp","kamikawa.saitama.jp","kamisato.saitama.jp","kasukabe.saitama.jp","kawagoe.saitama.jp","kawaguchi.saitama.jp","kawajima.saitama.jp","kazo.saitama.jp","kitamoto.saitama.jp","koshigaya.saitama.jp","kounosu.saitama.jp","kuki.saitama.jp","kumagaya.saitama.jp","matsubushi.saitama.jp","minano.saitama.jp","misato.saitama.jp","miyashiro.saitama.jp","miyoshi.saitama.jp","moroyama.saitama.jp","nagatoro.saitama.jp","namegawa.saitama.jp","niiza.saitama.jp","ogano.saitama.jp","ogawa.saitama.jp","ogose.saitama.jp","okegawa.saitama.jp","omiya.saitama.jp","otaki.saitama.jp","ranzan.saitama.jp","ryokami.saitama.jp","saitama.saitama.jp","sakado.saitama.jp","satte.saitama.jp","sayama.saitama.jp","shiki.saitama.jp","shiraoka.saitama.jp","soka.saitama.jp","sugito.saitama.jp","toda.saitama.jp","tokigawa.saitama.jp","tokorozawa.saitama.jp","tsurugashima.saitama.jp","urawa.saitama.jp","warabi.saitama.jp","yashio.saitama.jp","yokoze.saitama.jp","yono.saitama.jp","yorii.saitama.jp","yoshida.saitama.jp","yoshikawa.saitama.jp","yoshimi.saitama.jp","aisho.shiga.jp","gamo.shiga.jp","higashiomi.shiga.jp","hikone.shiga.jp","koka.shiga.jp","konan.shiga.jp","kosei.shiga.jp","koto.shiga.jp","kusatsu.shiga.jp","maibara.shiga.jp","moriyama.shiga.jp","nagahama.shiga.jp","nishiazai.shiga.jp","notogawa.shiga.jp","omihachiman.shiga.jp","otsu.shiga.jp","ritto.shiga.jp","ryuoh.shiga.jp","takashima.shiga.jp","takatsuki.shiga.jp","torahime.shiga.jp","toyosato.shiga.jp","yasu.shiga.jp","akagi.shimane.jp","ama.shimane.jp","gotsu.shimane.jp","hamada.shimane.jp","higashiizumo.shimane.jp","hikawa.shimane.jp","hikimi.shimane.jp","izumo.shimane.jp","kakinoki.shimane.jp","masuda.shimane.jp","matsue.shimane.jp","misato.shimane.jp","nishinoshima.shimane.jp","ohda.shimane.jp","okinoshima.shimane.jp","okuizumo.shimane.jp","shimane.shimane.jp","tamayu.shimane.jp","tsuwano.shimane.jp","unnan.shimane.jp","yakumo.shimane.jp","yasugi.shimane.jp","yatsuka.shimane.jp","arai.shizuoka.jp","atami.shizuoka.jp","fuji.shizuoka.jp","fujieda.shizuoka.jp","fujikawa.shizuoka.jp","fujinomiya.shizuoka.jp","fukuroi.shizuoka.jp","gotemba.shizuoka.jp","haibara.shizuoka.jp","hamamatsu.shizuoka.jp","higashiizu.shizuoka.jp","ito.shizuoka.jp","iwata.shizuoka.jp","izu.shizuoka.jp","izunokuni.shizuoka.jp","kakegawa.shizuoka.jp","kannami.shizuoka.jp","kawanehon.shizuoka.jp","kawazu.shizuoka.jp","kikugawa.shizuoka.jp","kosai.shizuoka.jp","makinohara.shizuoka.jp","matsuzaki.shizuoka.jp","minamiizu.shizuoka.jp","mishima.shizuoka.jp","morimachi.shizuoka.jp","nishiizu.shizuoka.jp","numazu.shizuoka.jp","omaezaki.shizuoka.jp","shimada.shizuoka.jp","shimizu.shizuoka.jp","shimoda.shizuoka.jp","shizuoka.shizuoka.jp","susono.shizuoka.jp","yaizu.shizuoka.jp","yoshida.shizuoka.jp","ashikaga.tochigi.jp","bato.tochigi.jp","haga.tochigi.jp","ichikai.tochigi.jp","iwafune.tochigi.jp","kaminokawa.tochigi.jp","kanuma.tochigi.jp","karasuyama.tochigi.jp","kuroiso.tochigi.jp","mashiko.tochigi.jp","mibu.tochigi.jp","moka.tochigi.jp","motegi.tochigi.jp","nasu.tochigi.jp","nasushiobara.tochigi.jp","nikko.tochigi.jp","nishikata.tochigi.jp","nogi.tochigi.jp","ohira.tochigi.jp","ohtawara.tochigi.jp","oyama.tochigi.jp","sakura.tochigi.jp","sano.tochigi.jp","shimotsuke.tochigi.jp","shioya.tochigi.jp","takanezawa.tochigi.jp","tochigi.tochigi.jp","tsuga.tochigi.jp","ujiie.tochigi.jp","utsunomiya.tochigi.jp","yaita.tochigi.jp","aizumi.tokushima.jp","anan.tokushima.jp","ichiba.tokushima.jp","itano.tokushima.jp","kainan.tokushima.jp","komatsushima.tokushima.jp","matsushige.tokushima.jp","mima.tokushima.jp","minami.tokushima.jp","miyoshi.tokushima.jp","mugi.tokushima.jp","nakagawa.tokushima.jp","naruto.tokushima.jp","sanagochi.tokushima.jp","shishikui.tokushima.jp","tokushima.tokushima.jp","wajiki.tokushima.jp","adachi.tokyo.jp","akiruno.tokyo.jp","akishima.tokyo.jp","aogashima.tokyo.jp","arakawa.tokyo.jp","bunkyo.tokyo.jp","chiyoda.tokyo.jp","chofu.tokyo.jp","chuo.tokyo.jp","edogawa.tokyo.jp","fuchu.tokyo.jp","fussa.tokyo.jp","hachijo.tokyo.jp","hachioji.tokyo.jp","hamura.tokyo.jp","higashikurume.tokyo.jp","higashimurayama.tokyo.jp","higashiyamato.tokyo.jp","hino.tokyo.jp","hinode.tokyo.jp","hinohara.tokyo.jp","inagi.tokyo.jp","itabashi.tokyo.jp","katsushika.tokyo.jp","kita.tokyo.jp","kiyose.tokyo.jp","kodaira.tokyo.jp","koganei.tokyo.jp","kokubunji.tokyo.jp","komae.tokyo.jp","koto.tokyo.jp","kouzushima.tokyo.jp","kunitachi.tokyo.jp","machida.tokyo.jp","meguro.tokyo.jp","minato.tokyo.jp","mitaka.tokyo.jp","mizuho.tokyo.jp","musashimurayama.tokyo.jp","musashino.tokyo.jp","nakano.tokyo.jp","nerima.tokyo.jp","ogasawara.tokyo.jp","okutama.tokyo.jp","ome.tokyo.jp","oshima.tokyo.jp","ota.tokyo.jp","setagaya.tokyo.jp","shibuya.tokyo.jp","shinagawa.tokyo.jp","shinjuku.tokyo.jp","suginami.tokyo.jp","sumida.tokyo.jp","tachikawa.tokyo.jp","taito.tokyo.jp","tama.tokyo.jp","toshima.tokyo.jp","chizu.tottori.jp","hino.tottori.jp","kawahara.tottori.jp","koge.tottori.jp","kotoura.tottori.jp","misasa.tottori.jp","nanbu.tottori.jp","nichinan.tottori.jp","sakaiminato.tottori.jp","tottori.tottori.jp","wakasa.tottori.jp","yazu.tottori.jp","yonago.tottori.jp","asahi.toyama.jp","fuchu.toyama.jp","fukumitsu.toyama.jp","funahashi.toyama.jp","himi.toyama.jp","imizu.toyama.jp","inami.toyama.jp","johana.toyama.jp","kamiichi.toyama.jp","kurobe.toyama.jp","nakaniikawa.toyama.jp","namerikawa.toyama.jp","nanto.toyama.jp","nyuzen.toyama.jp","oyabe.toyama.jp","taira.toyama.jp","takaoka.toyama.jp","tateyama.toyama.jp","toga.toyama.jp","tonami.toyama.jp","toyama.toyama.jp","unazuki.toyama.jp","uozu.toyama.jp","yamada.toyama.jp","arida.wakayama.jp","aridagawa.wakayama.jp","gobo.wakayama.jp","hashimoto.wakayama.jp","hidaka.wakayama.jp","hirogawa.wakayama.jp","inami.wakayama.jp","iwade.wakayama.jp","kainan.wakayama.jp","kamitonda.wakayama.jp","katsuragi.wakayama.jp","kimino.wakayama.jp","kinokawa.wakayama.jp","kitayama.wakayama.jp","koya.wakayama.jp","koza.wakayama.jp","kozagawa.wakayama.jp","kudoyama.wakayama.jp","kushimoto.wakayama.jp","mihama.wakayama.jp","misato.wakayama.jp","nachikatsuura.wakayama.jp","shingu.wakayama.jp","shirahama.wakayama.jp","taiji.wakayama.jp","tanabe.wakayama.jp","wakayama.wakayama.jp","yuasa.wakayama.jp","yura.wakayama.jp","asahi.yamagata.jp","funagata.yamagata.jp","higashine.yamagata.jp","iide.yamagata.jp","kahoku.yamagata.jp","kaminoyama.yamagata.jp","kaneyama.yamagata.jp","kawanishi.yamagata.jp","mamurogawa.yamagata.jp","mikawa.yamagata.jp","murayama.yamagata.jp","nagai.yamagata.jp","nakayama.yamagata.jp","nanyo.yamagata.jp","nishikawa.yamagata.jp","obanazawa.yamagata.jp","oe.yamagata.jp","oguni.yamagata.jp","ohkura.yamagata.jp","oishida.yamagata.jp","sagae.yamagata.jp","sakata.yamagata.jp","sakegawa.yamagata.jp","shinjo.yamagata.jp","shirataka.yamagata.jp","shonai.yamagata.jp","takahata.yamagata.jp","tendo.yamagata.jp","tozawa.yamagata.jp","tsuruoka.yamagata.jp","yamagata.yamagata.jp","yamanobe.yamagata.jp","yonezawa.yamagata.jp","yuza.yamagata.jp","abu.yamaguchi.jp","hagi.yamaguchi.jp","hikari.yamaguchi.jp","hofu.yamaguchi.jp","iwakuni.yamaguchi.jp","kudamatsu.yamaguchi.jp","mitou.yamaguchi.jp","nagato.yamaguchi.jp","oshima.yamaguchi.jp","shimonoseki.yamaguchi.jp","shunan.yamaguchi.jp","tabuse.yamaguchi.jp","tokuyama.yamaguchi.jp","toyota.yamaguchi.jp","ube.yamaguchi.jp","yuu.yamaguchi.jp","chuo.yamanashi.jp","doshi.yamanashi.jp","fuefuki.yamanashi.jp","fujikawa.yamanashi.jp","fujikawaguchiko.yamanashi.jp","fujiyoshida.yamanashi.jp","hayakawa.yamanashi.jp","hokuto.yamanashi.jp","ichikawamisato.yamanashi.jp","kai.yamanashi.jp","kofu.yamanashi.jp","koshu.yamanashi.jp","kosuge.yamanashi.jp","minami-alps.yamanashi.jp","minobu.yamanashi.jp","nakamichi.yamanashi.jp","nanbu.yamanashi.jp","narusawa.yamanashi.jp","nirasaki.yamanashi.jp","nishikatsura.yamanashi.jp","oshino.yamanashi.jp","otsuki.yamanashi.jp","showa.yamanashi.jp","tabayama.yamanashi.jp","tsuru.yamanashi.jp","uenohara.yamanashi.jp","yamanakako.yamanashi.jp","yamanashi.yamanashi.jp","ke","ac.ke","co.ke","go.ke","info.ke","me.ke","mobi.ke","ne.ke","or.ke","sc.ke","kg","org.kg","net.kg","com.kg","edu.kg","gov.kg","mil.kg","*.kh","ki","edu.ki","biz.ki","net.ki","org.ki","gov.ki","info.ki","com.ki","km","org.km","nom.km","gov.km","prd.km","tm.km","edu.km","mil.km","ass.km","com.km","coop.km","asso.km","presse.km","medecin.km","notaires.km","pharmaciens.km","veterinaire.km","gouv.km","kn","net.kn","org.kn","edu.kn","gov.kn","kp","com.kp","edu.kp","gov.kp","org.kp","rep.kp","tra.kp","kr","ac.kr","co.kr","es.kr","go.kr","hs.kr","kg.kr","mil.kr","ms.kr","ne.kr","or.kr","pe.kr","re.kr","sc.kr","busan.kr","chungbuk.kr","chungnam.kr","daegu.kr","daejeon.kr","gangwon.kr","gwangju.kr","gyeongbuk.kr","gyeonggi.kr","gyeongnam.kr","incheon.kr","jeju.kr","jeonbuk.kr","jeonnam.kr","seoul.kr","ulsan.kr","kw","com.kw","edu.kw","emb.kw","gov.kw","ind.kw","net.kw","org.kw","ky","com.ky","edu.ky","net.ky","org.ky","kz","org.kz","edu.kz","net.kz","gov.kz","mil.kz","com.kz","la","int.la","net.la","info.la","edu.la","gov.la","per.la","com.la","org.la","lb","com.lb","edu.lb","gov.lb","net.lb","org.lb","lc","com.lc","net.lc","co.lc","org.lc","edu.lc","gov.lc","li","lk","gov.lk","sch.lk","net.lk","int.lk","com.lk","org.lk","edu.lk","ngo.lk","soc.lk","web.lk","ltd.lk","assn.lk","grp.lk","hotel.lk","ac.lk","lr","com.lr","edu.lr","gov.lr","org.lr","net.lr","ls","ac.ls","biz.ls","co.ls","edu.ls","gov.ls","info.ls","net.ls","org.ls","sc.ls","lt","gov.lt","lu","lv","com.lv","edu.lv","gov.lv","org.lv","mil.lv","id.lv","net.lv","asn.lv","conf.lv","ly","com.ly","net.ly","gov.ly","plc.ly","edu.ly","sch.ly","med.ly","org.ly","id.ly","ma","co.ma","net.ma","gov.ma","org.ma","ac.ma","press.ma","mc","tm.mc","asso.mc","md","me","co.me","net.me","org.me","edu.me","ac.me","gov.me","its.me","priv.me","mg","org.mg","nom.mg","gov.mg","prd.mg","tm.mg","edu.mg","mil.mg","com.mg","co.mg","mh","mil","mk","com.mk","org.mk","net.mk","edu.mk","gov.mk","inf.mk","name.mk","ml","com.ml","edu.ml","gouv.ml","gov.ml","net.ml","org.ml","presse.ml","*.mm","mn","gov.mn","edu.mn","org.mn","mo","com.mo","net.mo","org.mo","edu.mo","gov.mo","mobi","mp","mq","mr","gov.mr","ms","com.ms","edu.ms","gov.ms","net.ms","org.ms","mt","com.mt","edu.mt","net.mt","org.mt","mu","com.mu","net.mu","org.mu","gov.mu","ac.mu","co.mu","or.mu","museum","academy.museum","agriculture.museum","air.museum","airguard.museum","alabama.museum","alaska.museum","amber.museum","ambulance.museum","american.museum","americana.museum","americanantiques.museum","americanart.museum","amsterdam.museum","and.museum","annefrank.museum","anthro.museum","anthropology.museum","antiques.museum","aquarium.museum","arboretum.museum","archaeological.museum","archaeology.museum","architecture.museum","art.museum","artanddesign.museum","artcenter.museum","artdeco.museum","arteducation.museum","artgallery.museum","arts.museum","artsandcrafts.museum","asmatart.museum","assassination.museum","assisi.museum","association.museum","astronomy.museum","atlanta.museum","austin.museum","australia.museum","automotive.museum","aviation.museum","axis.museum","badajoz.museum","baghdad.museum","bahn.museum","bale.museum","baltimore.museum","barcelona.museum","baseball.museum","basel.museum","baths.museum","bauern.museum","beauxarts.museum","beeldengeluid.museum","bellevue.museum","bergbau.museum","berkeley.museum","berlin.museum","bern.museum","bible.museum","bilbao.museum","bill.museum","birdart.museum","birthplace.museum","bonn.museum","boston.museum","botanical.museum","botanicalgarden.museum","botanicgarden.museum","botany.museum","brandywinevalley.museum","brasil.museum","bristol.museum","british.museum","britishcolumbia.museum","broadcast.museum","brunel.museum","brussel.museum","brussels.museum","bruxelles.museum","building.museum","burghof.museum","bus.museum","bushey.museum","cadaques.museum","california.museum","cambridge.museum","can.museum","canada.museum","capebreton.museum","carrier.museum","cartoonart.museum","casadelamoneda.museum","castle.museum","castres.museum","celtic.museum","center.museum","chattanooga.museum","cheltenham.museum","chesapeakebay.museum","chicago.museum","children.museum","childrens.museum","childrensgarden.museum","chiropractic.museum","chocolate.museum","christiansburg.museum","cincinnati.museum","cinema.museum","circus.museum","civilisation.museum","civilization.museum","civilwar.museum","clinton.museum","clock.museum","coal.museum","coastaldefence.museum","cody.museum","coldwar.museum","collection.museum","colonialwilliamsburg.museum","coloradoplateau.museum","columbia.museum","columbus.museum","communication.museum","communications.museum","community.museum","computer.museum","computerhistory.museum","comunicações.museum","contemporary.museum","contemporaryart.museum","convent.museum","copenhagen.museum","corporation.museum","correios-e-telecomunicações.museum","corvette.museum","costume.museum","countryestate.museum","county.museum","crafts.museum","cranbrook.museum","creation.museum","cultural.museum","culturalcenter.museum","culture.museum","cyber.museum","cymru.museum","dali.museum","dallas.museum","database.museum","ddr.museum","decorativearts.museum","delaware.museum","delmenhorst.museum","denmark.museum","depot.museum","design.museum","detroit.museum","dinosaur.museum","discovery.museum","dolls.museum","donostia.museum","durham.museum","eastafrica.museum","eastcoast.museum","education.museum","educational.museum","egyptian.museum","eisenbahn.museum","elburg.museum","elvendrell.museum","embroidery.museum","encyclopedic.museum","england.museum","entomology.museum","environment.museum","environmentalconservation.museum","epilepsy.museum","essex.museum","estate.museum","ethnology.museum","exeter.museum","exhibition.museum","family.museum","farm.museum","farmequipment.museum","farmers.museum","farmstead.museum","field.museum","figueres.museum","filatelia.museum","film.museum","fineart.museum","finearts.museum","finland.museum","flanders.museum","florida.museum","force.museum","fortmissoula.museum","fortworth.museum","foundation.museum","francaise.museum","frankfurt.museum","franziskaner.museum","freemasonry.museum","freiburg.museum","fribourg.museum","frog.museum","fundacio.museum","furniture.museum","gallery.museum","garden.museum","gateway.museum","geelvinck.museum","gemological.museum","geology.museum","georgia.museum","giessen.museum","glas.museum","glass.museum","gorge.museum","grandrapids.museum","graz.museum","guernsey.museum","halloffame.museum","hamburg.museum","handson.museum","harvestcelebration.museum","hawaii.museum","health.museum","heimatunduhren.museum","hellas.museum","helsinki.museum","hembygdsforbund.museum","heritage.museum","histoire.museum","historical.museum","historicalsociety.museum","historichouses.museum","historisch.museum","historisches.museum","history.museum","historyofscience.museum","horology.museum","house.museum","humanities.museum","illustration.museum","imageandsound.museum","indian.museum","indiana.museum","indianapolis.museum","indianmarket.museum","intelligence.museum","interactive.museum","iraq.museum","iron.museum","isleofman.museum","jamison.museum","jefferson.museum","jerusalem.museum","jewelry.museum","jewish.museum","jewishart.museum","jfk.museum","journalism.museum","judaica.museum","judygarland.museum","juedisches.museum","juif.museum","karate.museum","karikatur.museum","kids.museum","koebenhavn.museum","koeln.museum","kunst.museum","kunstsammlung.museum","kunstunddesign.museum","labor.museum","labour.museum","lajolla.museum","lancashire.museum","landes.museum","lans.museum","läns.museum","larsson.museum","lewismiller.museum","lincoln.museum","linz.museum","living.museum","livinghistory.museum","localhistory.museum","london.museum","losangeles.museum","louvre.museum","loyalist.museum","lucerne.museum","luxembourg.museum","luzern.museum","mad.museum","madrid.museum","mallorca.museum","manchester.museum","mansion.museum","mansions.museum","manx.museum","marburg.museum","maritime.museum","maritimo.museum","maryland.museum","marylhurst.museum","media.museum","medical.museum","medizinhistorisches.museum","meeres.museum","memorial.museum","mesaverde.museum","michigan.museum","midatlantic.museum","military.museum","mill.museum","miners.museum","mining.museum","minnesota.museum","missile.museum","missoula.museum","modern.museum","moma.museum","money.museum","monmouth.museum","monticello.museum","montreal.museum","moscow.museum","motorcycle.museum","muenchen.museum","muenster.museum","mulhouse.museum","muncie.museum","museet.museum","museumcenter.museum","museumvereniging.museum","music.museum","national.museum","nationalfirearms.museum","nationalheritage.museum","nativeamerican.museum","naturalhistory.museum","naturalhistorymuseum.museum","naturalsciences.museum","nature.museum","naturhistorisches.museum","natuurwetenschappen.museum","naumburg.museum","naval.museum","nebraska.museum","neues.museum","newhampshire.museum","newjersey.museum","newmexico.museum","newport.museum","newspaper.museum","newyork.museum","niepce.museum","norfolk.museum","north.museum","nrw.museum","nyc.museum","nyny.museum","oceanographic.museum","oceanographique.museum","omaha.museum","online.museum","ontario.museum","openair.museum","oregon.museum","oregontrail.museum","otago.museum","oxford.museum","pacific.museum","paderborn.museum","palace.museum","paleo.museum","palmsprings.museum","panama.museum","paris.museum","pasadena.museum","pharmacy.museum","philadelphia.museum","philadelphiaarea.museum","philately.museum","phoenix.museum","photography.museum","pilots.museum","pittsburgh.museum","planetarium.museum","plantation.museum","plants.museum","plaza.museum","portal.museum","portland.museum","portlligat.museum","posts-and-telecommunications.museum","preservation.museum","presidio.museum","press.museum","project.museum","public.museum","pubol.museum","quebec.museum","railroad.museum","railway.museum","research.museum","resistance.museum","riodejaneiro.museum","rochester.museum","rockart.museum","roma.museum","russia.museum","saintlouis.museum","salem.museum","salvadordali.museum","salzburg.museum","sandiego.museum","sanfrancisco.museum","santabarbara.museum","santacruz.museum","santafe.museum","saskatchewan.museum","satx.museum","savannahga.museum","schlesisches.museum","schoenbrunn.museum","schokoladen.museum","school.museum","schweiz.museum","science.museum","scienceandhistory.museum","scienceandindustry.museum","sciencecenter.museum","sciencecenters.museum","science-fiction.museum","sciencehistory.museum","sciences.museum","sciencesnaturelles.museum","scotland.museum","seaport.museum","settlement.museum","settlers.museum","shell.museum","sherbrooke.museum","sibenik.museum","silk.museum","ski.museum","skole.museum","society.museum","sologne.museum","soundandvision.museum","southcarolina.museum","southwest.museum","space.museum","spy.museum","square.museum","stadt.museum","stalbans.museum","starnberg.museum","state.museum","stateofdelaware.museum","station.museum","steam.museum","steiermark.museum","stjohn.museum","stockholm.museum","stpetersburg.museum","stuttgart.museum","suisse.museum","surgeonshall.museum","surrey.museum","svizzera.museum","sweden.museum","sydney.museum","tank.museum","tcm.museum","technology.museum","telekommunikation.museum","television.museum","texas.museum","textile.museum","theater.museum","time.museum","timekeeping.museum","topology.museum","torino.museum","touch.museum","town.museum","transport.museum","tree.museum","trolley.museum","trust.museum","trustee.museum","uhren.museum","ulm.museum","undersea.museum","university.museum","usa.museum","usantiques.museum","usarts.museum","uscountryestate.museum","usculture.museum","usdecorativearts.museum","usgarden.museum","ushistory.museum","ushuaia.museum","uslivinghistory.museum","utah.museum","uvic.museum","valley.museum","vantaa.museum","versailles.museum","viking.museum","village.museum","virginia.museum","virtual.museum","virtuel.museum","vlaanderen.museum","volkenkunde.museum","wales.museum","wallonie.museum","war.museum","washingtondc.museum","watchandclock.museum","watch-and-clock.museum","western.museum","westfalen.museum","whaling.museum","wildlife.museum","williamsburg.museum","windmill.museum","workshop.museum","york.museum","yorkshire.museum","yosemite.museum","youth.museum","zoological.museum","zoology.museum","ירושלים.museum","иком.museum","mv","aero.mv","biz.mv","com.mv","coop.mv","edu.mv","gov.mv","info.mv","int.mv","mil.mv","museum.mv","name.mv","net.mv","org.mv","pro.mv","mw","ac.mw","biz.mw","co.mw","com.mw","coop.mw","edu.mw","gov.mw","int.mw","museum.mw","net.mw","org.mw","mx","com.mx","org.mx","gob.mx","edu.mx","net.mx","my","biz.my","com.my","edu.my","gov.my","mil.my","name.my","net.my","org.my","mz","ac.mz","adv.mz","co.mz","edu.mz","gov.mz","mil.mz","net.mz","org.mz","na","info.na","pro.na","name.na","school.na","or.na","dr.na","us.na","mx.na","ca.na","in.na","cc.na","tv.na","ws.na","mobi.na","co.na","com.na","org.na","name","nc","asso.nc","nom.nc","ne","net","nf","com.nf","net.nf","per.nf","rec.nf","web.nf","arts.nf","firm.nf","info.nf","other.nf","store.nf","ng","com.ng","edu.ng","gov.ng","i.ng","mil.ng","mobi.ng","name.ng","net.ng","org.ng","sch.ng","ni","ac.ni","biz.ni","co.ni","com.ni","edu.ni","gob.ni","in.ni","info.ni","int.ni","mil.ni","net.ni","nom.ni","org.ni","web.ni","nl","no","fhs.no","vgs.no","fylkesbibl.no","folkebibl.no","museum.no","idrett.no","priv.no","mil.no","stat.no","dep.no","kommune.no","herad.no","aa.no","ah.no","bu.no","fm.no","hl.no","hm.no","jan-mayen.no","mr.no","nl.no","nt.no","of.no","ol.no","oslo.no","rl.no","sf.no","st.no","svalbard.no","tm.no","tr.no","va.no","vf.no","gs.aa.no","gs.ah.no","gs.bu.no","gs.fm.no","gs.hl.no","gs.hm.no","gs.jan-mayen.no","gs.mr.no","gs.nl.no","gs.nt.no","gs.of.no","gs.ol.no","gs.oslo.no","gs.rl.no","gs.sf.no","gs.st.no","gs.svalbard.no","gs.tm.no","gs.tr.no","gs.va.no","gs.vf.no","akrehamn.no","åkrehamn.no","algard.no","ålgård.no","arna.no","brumunddal.no","bryne.no","bronnoysund.no","brønnøysund.no","drobak.no","drøbak.no","egersund.no","fetsund.no","floro.no","florø.no","fredrikstad.no","hokksund.no","honefoss.no","hønefoss.no","jessheim.no","jorpeland.no","jørpeland.no","kirkenes.no","kopervik.no","krokstadelva.no","langevag.no","langevåg.no","leirvik.no","mjondalen.no","mjøndalen.no","mo-i-rana.no","mosjoen.no","mosjøen.no","nesoddtangen.no","orkanger.no","osoyro.no","osøyro.no","raholt.no","råholt.no","sandnessjoen.no","sandnessjøen.no","skedsmokorset.no","slattum.no","spjelkavik.no","stathelle.no","stavern.no","stjordalshalsen.no","stjørdalshalsen.no","tananger.no","tranby.no","vossevangen.no","afjord.no","åfjord.no","agdenes.no","al.no","ål.no","alesund.no","ålesund.no","alstahaug.no","alta.no","áltá.no","alaheadju.no","álaheadju.no","alvdal.no","amli.no","åmli.no","amot.no","åmot.no","andebu.no","andoy.no","andøy.no","andasuolo.no","ardal.no","årdal.no","aremark.no","arendal.no","ås.no","aseral.no","åseral.no","asker.no","askim.no","askvoll.no","askoy.no","askøy.no","asnes.no","åsnes.no","audnedaln.no","aukra.no","aure.no","aurland.no","aurskog-holand.no","aurskog-høland.no","austevoll.no","austrheim.no","averoy.no","averøy.no","balestrand.no","ballangen.no","balat.no","bálát.no","balsfjord.no","bahccavuotna.no","báhccavuotna.no","bamble.no","bardu.no","beardu.no","beiarn.no","bajddar.no","bájddar.no","baidar.no","báidár.no","berg.no","bergen.no","berlevag.no","berlevåg.no","bearalvahki.no","bearalváhki.no","bindal.no","birkenes.no","bjarkoy.no","bjarkøy.no","bjerkreim.no","bjugn.no","bodo.no","bodø.no","badaddja.no","bådåddjå.no","budejju.no","bokn.no","bremanger.no","bronnoy.no","brønnøy.no","bygland.no","bykle.no","barum.no","bærum.no","bo.telemark.no","bø.telemark.no","bo.nordland.no","bø.nordland.no","bievat.no","bievát.no","bomlo.no","bømlo.no","batsfjord.no","båtsfjord.no","bahcavuotna.no","báhcavuotna.no","dovre.no","drammen.no","drangedal.no","dyroy.no","dyrøy.no","donna.no","dønna.no","eid.no","eidfjord.no","eidsberg.no","eidskog.no","eidsvoll.no","eigersund.no","elverum.no","enebakk.no","engerdal.no","etne.no","etnedal.no","evenes.no","evenassi.no","evenášši.no","evje-og-hornnes.no","farsund.no","fauske.no","fuossko.no","fuoisku.no","fedje.no","fet.no","finnoy.no","finnøy.no","fitjar.no","fjaler.no","fjell.no","flakstad.no","flatanger.no","flekkefjord.no","flesberg.no","flora.no","fla.no","flå.no","folldal.no","forsand.no","fosnes.no","frei.no","frogn.no","froland.no","frosta.no","frana.no","fræna.no","froya.no","frøya.no","fusa.no","fyresdal.no","forde.no","førde.no","gamvik.no","gangaviika.no","gáŋgaviika.no","gaular.no","gausdal.no","gildeskal.no","gildeskål.no","giske.no","gjemnes.no","gjerdrum.no","gjerstad.no","gjesdal.no","gjovik.no","gjøvik.no","gloppen.no","gol.no","gran.no","grane.no","granvin.no","gratangen.no","grimstad.no","grong.no","kraanghke.no","kråanghke.no","grue.no","gulen.no","hadsel.no","halden.no","halsa.no","hamar.no","hamaroy.no","habmer.no","hábmer.no","hapmir.no","hápmir.no","hammerfest.no","hammarfeasta.no","hámmárfeasta.no","haram.no","hareid.no","harstad.no","hasvik.no","aknoluokta.no","ákŋoluokta.no","hattfjelldal.no","aarborte.no","haugesund.no","hemne.no","hemnes.no","hemsedal.no","heroy.more-og-romsdal.no","herøy.møre-og-romsdal.no","heroy.nordland.no","herøy.nordland.no","hitra.no","hjartdal.no","hjelmeland.no","hobol.no","hobøl.no","hof.no","hol.no","hole.no","holmestrand.no","holtalen.no","holtålen.no","hornindal.no","horten.no","hurdal.no","hurum.no","hvaler.no","hyllestad.no","hagebostad.no","hægebostad.no","hoyanger.no","høyanger.no","hoylandet.no","høylandet.no","ha.no","hå.no","ibestad.no","inderoy.no","inderøy.no","iveland.no","jevnaker.no","jondal.no","jolster.no","jølster.no","karasjok.no","karasjohka.no","kárášjohka.no","karlsoy.no","galsa.no","gálsá.no","karmoy.no","karmøy.no","kautokeino.no","guovdageaidnu.no","klepp.no","klabu.no","klæbu.no","kongsberg.no","kongsvinger.no","kragero.no","kragerø.no","kristiansand.no","kristiansund.no","krodsherad.no","krødsherad.no","kvalsund.no","rahkkeravju.no","ráhkkerávju.no","kvam.no","kvinesdal.no","kvinnherad.no","kviteseid.no","kvitsoy.no","kvitsøy.no","kvafjord.no","kvæfjord.no","giehtavuoatna.no","kvanangen.no","kvænangen.no","navuotna.no","návuotna.no","kafjord.no","kåfjord.no","gaivuotna.no","gáivuotna.no","larvik.no","lavangen.no","lavagis.no","loabat.no","loabát.no","lebesby.no","davvesiida.no","leikanger.no","leirfjord.no","leka.no","leksvik.no","lenvik.no","leangaviika.no","leaŋgaviika.no","lesja.no","levanger.no","lier.no","lierne.no","lillehammer.no","lillesand.no","lindesnes.no","lindas.no","lindås.no","lom.no","loppa.no","lahppi.no","láhppi.no","lund.no","lunner.no","luroy.no","lurøy.no","luster.no","lyngdal.no","lyngen.no","ivgu.no","lardal.no","lerdal.no","lærdal.no","lodingen.no","lødingen.no","lorenskog.no","lørenskog.no","loten.no","løten.no","malvik.no","masoy.no","måsøy.no","muosat.no","muosát.no","mandal.no","marker.no","marnardal.no","masfjorden.no","meland.no","meldal.no","melhus.no","meloy.no","meløy.no","meraker.no","meråker.no","moareke.no","moåreke.no","midsund.no","midtre-gauldal.no","modalen.no","modum.no","molde.no","moskenes.no","moss.no","mosvik.no","malselv.no","målselv.no","malatvuopmi.no","málatvuopmi.no","namdalseid.no","aejrie.no","namsos.no","namsskogan.no","naamesjevuemie.no","nååmesjevuemie.no","laakesvuemie.no","nannestad.no","narvik.no","narviika.no","naustdal.no","nedre-eiker.no","nes.akershus.no","nes.buskerud.no","nesna.no","nesodden.no","nesseby.no","unjarga.no","unjárga.no","nesset.no","nissedal.no","nittedal.no","nord-aurdal.no","nord-fron.no","nord-odal.no","norddal.no","nordkapp.no","davvenjarga.no","davvenjárga.no","nordre-land.no","nordreisa.no","raisa.no","ráisa.no","nore-og-uvdal.no","notodden.no","naroy.no","nærøy.no","notteroy.no","nøtterøy.no","odda.no","oksnes.no","øksnes.no","oppdal.no","oppegard.no","oppegård.no","orkdal.no","orland.no","ørland.no","orskog.no","ørskog.no","orsta.no","ørsta.no","os.hedmark.no","os.hordaland.no","osen.no","osteroy.no","osterøy.no","ostre-toten.no","østre-toten.no","overhalla.no","ovre-eiker.no","øvre-eiker.no","oyer.no","øyer.no","oygarden.no","øygarden.no","oystre-slidre.no","øystre-slidre.no","porsanger.no","porsangu.no","porsáŋgu.no","porsgrunn.no","radoy.no","radøy.no","rakkestad.no","rana.no","ruovat.no","randaberg.no","rauma.no","rendalen.no","rennebu.no","rennesoy.no","rennesøy.no","rindal.no","ringebu.no","ringerike.no","ringsaker.no","rissa.no","risor.no","risør.no","roan.no","rollag.no","rygge.no","ralingen.no","rælingen.no","rodoy.no","rødøy.no","romskog.no","rømskog.no","roros.no","røros.no","rost.no","røst.no","royken.no","røyken.no","royrvik.no","røyrvik.no","rade.no","råde.no","salangen.no","siellak.no","saltdal.no","salat.no","sálát.no","sálat.no","samnanger.no","sande.more-og-romsdal.no","sande.møre-og-romsdal.no","sande.vestfold.no","sandefjord.no","sandnes.no","sandoy.no","sandøy.no","sarpsborg.no","sauda.no","sauherad.no","sel.no","selbu.no","selje.no","seljord.no","sigdal.no","siljan.no","sirdal.no","skaun.no","skedsmo.no","ski.no","skien.no","skiptvet.no","skjervoy.no","skjervøy.no","skierva.no","skiervá.no","skjak.no","skjåk.no","skodje.no","skanland.no","skånland.no","skanit.no","skánit.no","smola.no","smøla.no","snillfjord.no","snasa.no","snåsa.no","snoasa.no","snaase.no","snåase.no","sogndal.no","sokndal.no","sola.no","solund.no","songdalen.no","sortland.no","spydeberg.no","stange.no","stavanger.no","steigen.no","steinkjer.no","stjordal.no","stjørdal.no","stokke.no","stor-elvdal.no","stord.no","stordal.no","storfjord.no","omasvuotna.no","strand.no","stranda.no","stryn.no","sula.no","suldal.no","sund.no","sunndal.no","surnadal.no","sveio.no","svelvik.no","sykkylven.no","sogne.no","søgne.no","somna.no","sømna.no","sondre-land.no","søndre-land.no","sor-aurdal.no","sør-aurdal.no","sor-fron.no","sør-fron.no","sor-odal.no","sør-odal.no","sor-varanger.no","sør-varanger.no","matta-varjjat.no","mátta-várjjat.no","sorfold.no","sørfold.no","sorreisa.no","sørreisa.no","sorum.no","sørum.no","tana.no","deatnu.no","time.no","tingvoll.no","tinn.no","tjeldsund.no","dielddanuorri.no","tjome.no","tjøme.no","tokke.no","tolga.no","torsken.no","tranoy.no","tranøy.no","tromso.no","tromsø.no","tromsa.no","romsa.no","trondheim.no","troandin.no","trysil.no","trana.no","træna.no","trogstad.no","trøgstad.no","tvedestrand.no","tydal.no","tynset.no","tysfjord.no","divtasvuodna.no","divttasvuotna.no","tysnes.no","tysvar.no","tysvær.no","tonsberg.no","tønsberg.no","ullensaker.no","ullensvang.no","ulvik.no","utsira.no","vadso.no","vadsø.no","cahcesuolo.no","čáhcesuolo.no","vaksdal.no","valle.no","vang.no","vanylven.no","vardo.no","vardø.no","varggat.no","várggát.no","vefsn.no","vaapste.no","vega.no","vegarshei.no","vegårshei.no","vennesla.no","verdal.no","verran.no","vestby.no","vestnes.no","vestre-slidre.no","vestre-toten.no","vestvagoy.no","vestvågøy.no","vevelstad.no","vik.no","vikna.no","vindafjord.no","volda.no","voss.no","varoy.no","værøy.no","vagan.no","vågan.no","voagat.no","vagsoy.no","vågsøy.no","vaga.no","vågå.no","valer.ostfold.no","våler.østfold.no","valer.hedmark.no","våler.hedmark.no","*.np","nr","biz.nr","info.nr","gov.nr","edu.nr","org.nr","net.nr","com.nr","nu","nz","ac.nz","co.nz","cri.nz","geek.nz","gen.nz","govt.nz","health.nz","iwi.nz","kiwi.nz","maori.nz","mil.nz","māori.nz","net.nz","org.nz","parliament.nz","school.nz","om","co.om","com.om","edu.om","gov.om","med.om","museum.om","net.om","org.om","pro.om","onion","org","pa","ac.pa","gob.pa","com.pa","org.pa","sld.pa","edu.pa","net.pa","ing.pa","abo.pa","med.pa","nom.pa","pe","edu.pe","gob.pe","nom.pe","mil.pe","org.pe","com.pe","net.pe","pf","com.pf","org.pf","edu.pf","*.pg","ph","com.ph","net.ph","org.ph","gov.ph","edu.ph","ngo.ph","mil.ph","i.ph","pk","com.pk","net.pk","edu.pk","org.pk","fam.pk","biz.pk","web.pk","gov.pk","gob.pk","gok.pk","gon.pk","gop.pk","gos.pk","info.pk","pl","com.pl","net.pl","org.pl","aid.pl","agro.pl","atm.pl","auto.pl","biz.pl","edu.pl","gmina.pl","gsm.pl","info.pl","mail.pl","miasta.pl","media.pl","mil.pl","nieruchomosci.pl","nom.pl","pc.pl","powiat.pl","priv.pl","realestate.pl","rel.pl","sex.pl","shop.pl","sklep.pl","sos.pl","szkola.pl","targi.pl","tm.pl","tourism.pl","travel.pl","turystyka.pl","gov.pl","ap.gov.pl","ic.gov.pl","is.gov.pl","us.gov.pl","kmpsp.gov.pl","kppsp.gov.pl","kwpsp.gov.pl","psp.gov.pl","wskr.gov.pl","kwp.gov.pl","mw.gov.pl","ug.gov.pl","um.gov.pl","umig.gov.pl","ugim.gov.pl","upow.gov.pl","uw.gov.pl","starostwo.gov.pl","pa.gov.pl","po.gov.pl","psse.gov.pl","pup.gov.pl","rzgw.gov.pl","sa.gov.pl","so.gov.pl","sr.gov.pl","wsa.gov.pl","sko.gov.pl","uzs.gov.pl","wiih.gov.pl","winb.gov.pl","pinb.gov.pl","wios.gov.pl","witd.gov.pl","wzmiuw.gov.pl","piw.gov.pl","wiw.gov.pl","griw.gov.pl","wif.gov.pl","oum.gov.pl","sdn.gov.pl","zp.gov.pl","uppo.gov.pl","mup.gov.pl","wuoz.gov.pl","konsulat.gov.pl","oirm.gov.pl","augustow.pl","babia-gora.pl","bedzin.pl","beskidy.pl","bialowieza.pl","bialystok.pl","bielawa.pl","bieszczady.pl","boleslawiec.pl","bydgoszcz.pl","bytom.pl","cieszyn.pl","czeladz.pl","czest.pl","dlugoleka.pl","elblag.pl","elk.pl","glogow.pl","gniezno.pl","gorlice.pl","grajewo.pl","ilawa.pl","jaworzno.pl","jelenia-gora.pl","jgora.pl","kalisz.pl","kazimierz-dolny.pl","karpacz.pl","kartuzy.pl","kaszuby.pl","katowice.pl","kepno.pl","ketrzyn.pl","klodzko.pl","kobierzyce.pl","kolobrzeg.pl","konin.pl","konskowola.pl","kutno.pl","lapy.pl","lebork.pl","legnica.pl","lezajsk.pl","limanowa.pl","lomza.pl","lowicz.pl","lubin.pl","lukow.pl","malbork.pl","malopolska.pl","mazowsze.pl","mazury.pl","mielec.pl","mielno.pl","mragowo.pl","naklo.pl","nowaruda.pl","nysa.pl","olawa.pl","olecko.pl","olkusz.pl","olsztyn.pl","opoczno.pl","opole.pl","ostroda.pl","ostroleka.pl","ostrowiec.pl","ostrowwlkp.pl","pila.pl","pisz.pl","podhale.pl","podlasie.pl","polkowice.pl","pomorze.pl","pomorskie.pl","prochowice.pl","pruszkow.pl","przeworsk.pl","pulawy.pl","radom.pl","rawa-maz.pl","rybnik.pl","rzeszow.pl","sanok.pl","sejny.pl","slask.pl","slupsk.pl","sosnowiec.pl","stalowa-wola.pl","skoczow.pl","starachowice.pl","stargard.pl","suwalki.pl","swidnica.pl","swiebodzin.pl","swinoujscie.pl","szczecin.pl","szczytno.pl","tarnobrzeg.pl","tgory.pl","turek.pl","tychy.pl","ustka.pl","walbrzych.pl","warmia.pl","warszawa.pl","waw.pl","wegrow.pl","wielun.pl","wlocl.pl","wloclawek.pl","wodzislaw.pl","wolomin.pl","wroclaw.pl","zachpomor.pl","zagan.pl","zarow.pl","zgora.pl","zgorzelec.pl","pm","pn","gov.pn","co.pn","org.pn","edu.pn","net.pn","post","pr","com.pr","net.pr","org.pr","gov.pr","edu.pr","isla.pr","pro.pr","biz.pr","info.pr","name.pr","est.pr","prof.pr","ac.pr","pro","aaa.pro","aca.pro","acct.pro","avocat.pro","bar.pro","cpa.pro","eng.pro","jur.pro","law.pro","med.pro","recht.pro","ps","edu.ps","gov.ps","sec.ps","plo.ps","com.ps","org.ps","net.ps","pt","net.pt","gov.pt","org.pt","edu.pt","int.pt","publ.pt","com.pt","nome.pt","pw","co.pw","ne.pw","or.pw","ed.pw","go.pw","belau.pw","py","com.py","coop.py","edu.py","gov.py","mil.py","net.py","org.py","qa","com.qa","edu.qa","gov.qa","mil.qa","name.qa","net.qa","org.qa","sch.qa","re","asso.re","com.re","nom.re","ro","arts.ro","com.ro","firm.ro","info.ro","nom.ro","nt.ro","org.ro","rec.ro","store.ro","tm.ro","www.ro","rs","ac.rs","co.rs","edu.rs","gov.rs","in.rs","org.rs","ru","rw","ac.rw","co.rw","coop.rw","gov.rw","mil.rw","net.rw","org.rw","sa","com.sa","net.sa","org.sa","gov.sa","med.sa","pub.sa","edu.sa","sch.sa","sb","com.sb","edu.sb","gov.sb","net.sb","org.sb","sc","com.sc","gov.sc","net.sc","org.sc","edu.sc","sd","com.sd","net.sd","org.sd","edu.sd","med.sd","tv.sd","gov.sd","info.sd","se","a.se","ac.se","b.se","bd.se","brand.se","c.se","d.se","e.se","f.se","fh.se","fhsk.se","fhv.se","g.se","h.se","i.se","k.se","komforb.se","kommunalforbund.se","komvux.se","l.se","lanbib.se","m.se","n.se","naturbruksgymn.se","o.se","org.se","p.se","parti.se","pp.se","press.se","r.se","s.se","t.se","tm.se","u.se","w.se","x.se","y.se","z.se","sg","com.sg","net.sg","org.sg","gov.sg","edu.sg","per.sg","sh","com.sh","net.sh","gov.sh","org.sh","mil.sh","si","sj","sk","sl","com.sl","net.sl","edu.sl","gov.sl","org.sl","sm","sn","art.sn","com.sn","edu.sn","gouv.sn","org.sn","perso.sn","univ.sn","so","com.so","edu.so","gov.so","me.so","net.so","org.so","sr","ss","biz.ss","com.ss","edu.ss","gov.ss","me.ss","net.ss","org.ss","sch.ss","st","co.st","com.st","consulado.st","edu.st","embaixada.st","mil.st","net.st","org.st","principe.st","saotome.st","store.st","su","sv","com.sv","edu.sv","gob.sv","org.sv","red.sv","sx","gov.sx","sy","edu.sy","gov.sy","net.sy","mil.sy","com.sy","org.sy","sz","co.sz","ac.sz","org.sz","tc","td","tel","tf","tg","th","ac.th","co.th","go.th","in.th","mi.th","net.th","or.th","tj","ac.tj","biz.tj","co.tj","com.tj","edu.tj","go.tj","gov.tj","int.tj","mil.tj","name.tj","net.tj","nic.tj","org.tj","test.tj","web.tj","tk","tl","gov.tl","tm","com.tm","co.tm","org.tm","net.tm","nom.tm","gov.tm","mil.tm","edu.tm","tn","com.tn","ens.tn","fin.tn","gov.tn","ind.tn","info.tn","intl.tn","mincom.tn","nat.tn","net.tn","org.tn","perso.tn","tourism.tn","to","com.to","gov.to","net.to","org.to","edu.to","mil.to","tr","av.tr","bbs.tr","bel.tr","biz.tr","com.tr","dr.tr","edu.tr","gen.tr","gov.tr","info.tr","mil.tr","k12.tr","kep.tr","name.tr","net.tr","org.tr","pol.tr","tel.tr","tsk.tr","tv.tr","web.tr","nc.tr","gov.nc.tr","tt","co.tt","com.tt","org.tt","net.tt","biz.tt","info.tt","pro.tt","int.tt","coop.tt","jobs.tt","mobi.tt","travel.tt","museum.tt","aero.tt","name.tt","gov.tt","edu.tt","tv","tw","edu.tw","gov.tw","mil.tw","com.tw","net.tw","org.tw","idv.tw","game.tw","ebiz.tw","club.tw","網路.tw","組織.tw","商業.tw","tz","ac.tz","co.tz","go.tz","hotel.tz","info.tz","me.tz","mil.tz","mobi.tz","ne.tz","or.tz","sc.tz","tv.tz","ua","com.ua","edu.ua","gov.ua","in.ua","net.ua","org.ua","cherkassy.ua","cherkasy.ua","chernigov.ua","chernihiv.ua","chernivtsi.ua","chernovtsy.ua","ck.ua","cn.ua","cr.ua","crimea.ua","cv.ua","dn.ua","dnepropetrovsk.ua","dnipropetrovsk.ua","donetsk.ua","dp.ua","if.ua","ivano-frankivsk.ua","kh.ua","kharkiv.ua","kharkov.ua","kherson.ua","khmelnitskiy.ua","khmelnytskyi.ua","kiev.ua","kirovograd.ua","km.ua","kr.ua","krym.ua","ks.ua","kv.ua","kyiv.ua","lg.ua","lt.ua","lugansk.ua","lutsk.ua","lv.ua","lviv.ua","mk.ua","mykolaiv.ua","nikolaev.ua","od.ua","odesa.ua","odessa.ua","pl.ua","poltava.ua","rivne.ua","rovno.ua","rv.ua","sb.ua","sebastopol.ua","sevastopol.ua","sm.ua","sumy.ua","te.ua","ternopil.ua","uz.ua","uzhgorod.ua","vinnica.ua","vinnytsia.ua","vn.ua","volyn.ua","yalta.ua","zaporizhzhe.ua","zaporizhzhia.ua","zhitomir.ua","zhytomyr.ua","zp.ua","zt.ua","ug","co.ug","or.ug","ac.ug","sc.ug","go.ug","ne.ug","com.ug","org.ug","uk","ac.uk","co.uk","gov.uk","ltd.uk","me.uk","net.uk","nhs.uk","org.uk","plc.uk","police.uk","*.sch.uk","us","dni.us","fed.us","isa.us","kids.us","nsn.us","ak.us","al.us","ar.us","as.us","az.us","ca.us","co.us","ct.us","dc.us","de.us","fl.us","ga.us","gu.us","hi.us","ia.us","id.us","il.us","in.us","ks.us","ky.us","la.us","ma.us","md.us","me.us","mi.us","mn.us","mo.us","ms.us","mt.us","nc.us","nd.us","ne.us","nh.us","nj.us","nm.us","nv.us","ny.us","oh.us","ok.us","or.us","pa.us","pr.us","ri.us","sc.us","sd.us","tn.us","tx.us","ut.us","vi.us","vt.us","va.us","wa.us","wi.us","wv.us","wy.us","k12.ak.us","k12.al.us","k12.ar.us","k12.as.us","k12.az.us","k12.ca.us","k12.co.us","k12.ct.us","k12.dc.us","k12.de.us","k12.fl.us","k12.ga.us","k12.gu.us","k12.ia.us","k12.id.us","k12.il.us","k12.in.us","k12.ks.us","k12.ky.us","k12.la.us","k12.ma.us","k12.md.us","k12.me.us","k12.mi.us","k12.mn.us","k12.mo.us","k12.ms.us","k12.mt.us","k12.nc.us","k12.ne.us","k12.nh.us","k12.nj.us","k12.nm.us","k12.nv.us","k12.ny.us","k12.oh.us","k12.ok.us","k12.or.us","k12.pa.us","k12.pr.us","k12.sc.us","k12.tn.us","k12.tx.us","k12.ut.us","k12.vi.us","k12.vt.us","k12.va.us","k12.wa.us","k12.wi.us","k12.wy.us","cc.ak.us","cc.al.us","cc.ar.us","cc.as.us","cc.az.us","cc.ca.us","cc.co.us","cc.ct.us","cc.dc.us","cc.de.us","cc.fl.us","cc.ga.us","cc.gu.us","cc.hi.us","cc.ia.us","cc.id.us","cc.il.us","cc.in.us","cc.ks.us","cc.ky.us","cc.la.us","cc.ma.us","cc.md.us","cc.me.us","cc.mi.us","cc.mn.us","cc.mo.us","cc.ms.us","cc.mt.us","cc.nc.us","cc.nd.us","cc.ne.us","cc.nh.us","cc.nj.us","cc.nm.us","cc.nv.us","cc.ny.us","cc.oh.us","cc.ok.us","cc.or.us","cc.pa.us","cc.pr.us","cc.ri.us","cc.sc.us","cc.sd.us","cc.tn.us","cc.tx.us","cc.ut.us","cc.vi.us","cc.vt.us","cc.va.us","cc.wa.us","cc.wi.us","cc.wv.us","cc.wy.us","lib.ak.us","lib.al.us","lib.ar.us","lib.as.us","lib.az.us","lib.ca.us","lib.co.us","lib.ct.us","lib.dc.us","lib.fl.us","lib.ga.us","lib.gu.us","lib.hi.us","lib.ia.us","lib.id.us","lib.il.us","lib.in.us","lib.ks.us","lib.ky.us","lib.la.us","lib.ma.us","lib.md.us","lib.me.us","lib.mi.us","lib.mn.us","lib.mo.us","lib.ms.us","lib.mt.us","lib.nc.us","lib.nd.us","lib.ne.us","lib.nh.us","lib.nj.us","lib.nm.us","lib.nv.us","lib.ny.us","lib.oh.us","lib.ok.us","lib.or.us","lib.pa.us","lib.pr.us","lib.ri.us","lib.sc.us","lib.sd.us","lib.tn.us","lib.tx.us","lib.ut.us","lib.vi.us","lib.vt.us","lib.va.us","lib.wa.us","lib.wi.us","lib.wy.us","pvt.k12.ma.us","chtr.k12.ma.us","paroch.k12.ma.us","ann-arbor.mi.us","cog.mi.us","dst.mi.us","eaton.mi.us","gen.mi.us","mus.mi.us","tec.mi.us","washtenaw.mi.us","uy","com.uy","edu.uy","gub.uy","mil.uy","net.uy","org.uy","uz","co.uz","com.uz","net.uz","org.uz","va","vc","com.vc","net.vc","org.vc","gov.vc","mil.vc","edu.vc","ve","arts.ve","bib.ve","co.ve","com.ve","e12.ve","edu.ve","firm.ve","gob.ve","gov.ve","info.ve","int.ve","mil.ve","net.ve","nom.ve","org.ve","rar.ve","rec.ve","store.ve","tec.ve","web.ve","vg","vi","co.vi","com.vi","k12.vi","net.vi","org.vi","vn","com.vn","net.vn","org.vn","edu.vn","gov.vn","int.vn","ac.vn","biz.vn","info.vn","name.vn","pro.vn","health.vn","vu","com.vu","edu.vu","net.vu","org.vu","wf","ws","com.ws","net.ws","org.ws","gov.ws","edu.ws","yt","امارات","հայ","বাংলা","бг","البحرين","бел","中国","中國","الجزائر","مصر","ею","ευ","موريتانيا","გე","ελ","香港","公司.香港","教育.香港","政府.香港","個人.香港","網絡.香港","組織.香港","ಭಾರತ","ଭାରତ","ভাৰত","भारतम्","भारोत","ڀارت","ഭാരതം","भारत","بارت","بھارت","భారత్","ભારત","ਭਾਰਤ","ভারত","இந்தியா","ایران","ايران","عراق","الاردن","한국","қаз","ລາວ","ලංකා","இலங்கை","المغرب","мкд","мон","澳門","澳门","مليسيا","عمان","پاکستان","پاكستان","فلسطين","срб","пр.срб","орг.срб","обр.срб","од.срб","упр.срб","ак.срб","рф","قطر","السعودية","السعودیة","السعودیۃ","السعوديه","سودان","新加坡","சிங்கப்பூர்","سورية","سوريا","ไทย","ศึกษา.ไทย","ธุรกิจ.ไทย","รัฐบาล.ไทย","ทหาร.ไทย","เน็ต.ไทย","องค์กร.ไทย","تونس","台灣","台湾","臺灣","укр","اليمن","xxx","ye","com.ye","edu.ye","gov.ye","net.ye","mil.ye","org.ye","ac.za","agric.za","alt.za","co.za","edu.za","gov.za","grondar.za","law.za","mil.za","net.za","ngo.za","nic.za","nis.za","nom.za","org.za","school.za","tm.za","web.za","zm","ac.zm","biz.zm","co.zm","com.zm","edu.zm","gov.zm","info.zm","mil.zm","net.zm","org.zm","sch.zm","zw","ac.zw","co.zw","gov.zw","mil.zw","org.zw","aaa","aarp","abarth","abb","abbott","abbvie","abc","able","abogado","abudhabi","academy","accenture","accountant","accountants","aco","actor","adac","ads","adult","aeg","aetna","afl","africa","agakhan","agency","aig","airbus","airforce","airtel","akdn","alfaromeo","alibaba","alipay","allfinanz","allstate","ally","alsace","alstom","amazon","americanexpress","americanfamily","amex","amfam","amica","amsterdam","analytics","android","anquan","anz","aol","apartments","app","apple","aquarelle","arab","aramco","archi","army","art","arte","asda","associates","athleta","attorney","auction","audi","audible","audio","auspost","author","auto","autos","avianca","aws","axa","azure","baby","baidu","banamex","bananarepublic","band","bank","bar","barcelona","barclaycard","barclays","barefoot","bargains","baseball","basketball","bauhaus","bayern","bbc","bbt","bbva","bcg","bcn","beats","beauty","beer","bentley","berlin","best","bestbuy","bet","bharti","bible","bid","bike","bing","bingo","bio","black","blackfriday","blockbuster","blog","bloomberg","blue","bms","bmw","bnpparibas","boats","boehringer","bofa","bom","bond","boo","book","booking","bosch","bostik","boston","bot","boutique","box","bradesco","bridgestone","broadway","broker","brother","brussels","bugatti","build","builders","business","buy","buzz","bzh","cab","cafe","cal","call","calvinklein","cam","camera","camp","cancerresearch","canon","capetown","capital","capitalone","car","caravan","cards","care","career","careers","cars","casa","case","cash","casino","catering","catholic","cba","cbn","cbre","cbs","center","ceo","cern","cfa","cfd","chanel","channel","charity","chase","chat","cheap","chintai","christmas","chrome","church","cipriani","circle","cisco","citadel","citi","citic","city","cityeats","claims","cleaning","click","clinic","clinique","clothing","cloud","club","clubmed","coach","codes","coffee","college","cologne","comcast","commbank","community","company","compare","computer","comsec","condos","construction","consulting","contact","contractors","cooking","cookingchannel","cool","corsica","country","coupon","coupons","courses","cpa","credit","creditcard","creditunion","cricket","crown","crs","cruise","cruises","cuisinella","cymru","cyou","dabur","dad","dance","data","date","dating","datsun","day","dclk","dds","deal","dealer","deals","degree","delivery","dell","deloitte","delta","democrat","dental","dentist","desi","design","dev","dhl","diamonds","diet","digital","direct","directory","discount","discover","dish","diy","dnp","docs","doctor","dog","domains","dot","download","drive","dtv","dubai","dunlop","dupont","durban","dvag","dvr","earth","eat","eco","edeka","education","email","emerck","energy","engineer","engineering","enterprises","epson","equipment","ericsson","erni","esq","estate","etisalat","eurovision","eus","events","exchange","expert","exposed","express","extraspace","fage","fail","fairwinds","faith","family","fan","fans","farm","farmers","fashion","fast","fedex","feedback","ferrari","ferrero","fiat","fidelity","fido","film","final","finance","financial","fire","firestone","firmdale","fish","fishing","fit","fitness","flickr","flights","flir","florist","flowers","fly","foo","food","foodnetwork","football","ford","forex","forsale","forum","foundation","fox","free","fresenius","frl","frogans","frontdoor","frontier","ftr","fujitsu","fun","fund","furniture","futbol","fyi","gal","gallery","gallo","gallup","game","games","gap","garden","gay","gbiz","gdn","gea","gent","genting","george","ggee","gift","gifts","gives","giving","glass","gle","global","globo","gmail","gmbh","gmo","gmx","godaddy","gold","goldpoint","golf","goo","goodyear","goog","google","gop","got","grainger","graphics","gratis","green","gripe","grocery","group","guardian","gucci","guge","guide","guitars","guru","hair","hamburg","hangout","haus","hbo","hdfc","hdfcbank","health","healthcare","help","helsinki","here","hermes","hgtv","hiphop","hisamitsu","hitachi","hiv","hkt","hockey","holdings","holiday","homedepot","homegoods","homes","homesense","honda","horse","hospital","host","hosting","hot","hoteles","hotels","hotmail","house","how","hsbc","hughes","hyatt","hyundai","ibm","icbc","ice","icu","ieee","ifm","ikano","imamat","imdb","immo","immobilien","inc","industries","infiniti","ing","ink","institute","insurance","insure","international","intuit","investments","ipiranga","irish","ismaili","ist","istanbul","itau","itv","jaguar","java","jcb","jeep","jetzt","jewelry","jio","jll","jmp","jnj","joburg","jot","joy","jpmorgan","jprs","juegos","juniper","kaufen","kddi","kerryhotels","kerrylogistics","kerryproperties","kfh","kia","kids","kim","kinder","kindle","kitchen","kiwi","koeln","komatsu","kosher","kpmg","kpn","krd","kred","kuokgroup","kyoto","lacaixa","lamborghini","lamer","lancaster","lancia","land","landrover","lanxess","lasalle","lat","latino","latrobe","law","lawyer","lds","lease","leclerc","lefrak","legal","lego","lexus","lgbt","lidl","life","lifeinsurance","lifestyle","lighting","like","lilly","limited","limo","lincoln","linde","link","lipsy","live","living","llc","llp","loan","loans","locker","locus","loft","lol","london","lotte","lotto","love","lpl","lplfinancial","ltd","ltda","lundbeck","luxe","luxury","macys","madrid","maif","maison","makeup","man","management","mango","map","market","marketing","markets","marriott","marshalls","maserati","mattel","mba","mckinsey","med","media","meet","melbourne","meme","memorial","men","menu","merckmsd","miami","microsoft","mini","mint","mit","mitsubishi","mlb","mls","mma","mobile","moda","moe","moi","mom","monash","money","monster","mormon","mortgage","moscow","moto","motorcycles","mov","movie","msd","mtn","mtr","music","mutual","nab","nagoya","natura","navy","nba","nec","netbank","netflix","network","neustar","new","news","next","nextdirect","nexus","nfl","ngo","nhk","nico","nike","nikon","ninja","nissan","nissay","nokia","northwesternmutual","norton","now","nowruz","nowtv","nra","nrw","ntt","nyc","obi","observer","office","okinawa","olayan","olayangroup","oldnavy","ollo","omega","one","ong","onl","online","ooo","open","oracle","orange","organic","origins","osaka","otsuka","ott","ovh","page","panasonic","paris","pars","partners","parts","party","passagens","pay","pccw","pet","pfizer","pharmacy","phd","philips","phone","photo","photography","photos","physio","pics","pictet","pictures","pid","pin","ping","pink","pioneer","pizza","place","play","playstation","plumbing","plus","pnc","pohl","poker","politie","porn","pramerica","praxi","press","prime","prod","productions","prof","progressive","promo","properties","property","protection","pru","prudential","pub","pwc","qpon","quebec","quest","racing","radio","read","realestate","realtor","realty","recipes","red","redstone","redumbrella","rehab","reise","reisen","reit","reliance","ren","rent","rentals","repair","report","republican","rest","restaurant","review","reviews","rexroth","rich","richardli","ricoh","ril","rio","rip","rocher","rocks","rodeo","rogers","room","rsvp","rugby","ruhr","run","rwe","ryukyu","saarland","safe","safety","sakura","sale","salon","samsclub","samsung","sandvik","sandvikcoromant","sanofi","sap","sarl","sas","save","saxo","sbi","sbs","sca","scb","schaeffler","schmidt","scholarships","school","schule","schwarz","science","scot","search","seat","secure","security","seek","select","sener","services","ses","seven","sew","sex","sexy","sfr","shangrila","sharp","shaw","shell","shia","shiksha","shoes","shop","shopping","shouji","show","showtime","silk","sina","singles","site","ski","skin","sky","skype","sling","smart","smile","sncf","soccer","social","softbank","software","sohu","solar","solutions","song","sony","soy","spa","space","sport","spot","srl","stada","staples","star","statebank","statefarm","stc","stcgroup","stockholm","storage","store","stream","studio","study","style","sucks","supplies","supply","support","surf","surgery","suzuki","swatch","swiss","sydney","systems","tab","taipei","talk","taobao","target","tatamotors","tatar","tattoo","tax","taxi","tci","tdk","team","tech","technology","temasek","tennis","teva","thd","theater","theatre","tiaa","tickets","tienda","tiffany","tips","tires","tirol","tjmaxx","tjx","tkmaxx","tmall","today","tokyo","tools","top","toray","toshiba","total","tours","town","toyota","toys","trade","trading","training","travel","travelchannel","travelers","travelersinsurance","trust","trv","tube","tui","tunes","tushu","tvs","ubank","ubs","unicom","university","uno","uol","ups","vacations","vana","vanguard","vegas","ventures","verisign","versicherung","vet","viajes","video","vig","viking","villas","vin","vip","virgin","visa","vision","viva","vivo","vlaanderen","vodka","volkswagen","volvo","vote","voting","voto","voyage","vuelos","wales","walmart","walter","wang","wanggou","watch","watches","weather","weatherchannel","webcam","weber","website","wedding","weibo","weir","whoswho","wien","wiki","williamhill","win","windows","wine","winners","wme","wolterskluwer","woodside","work","works","world","wow","wtc","wtf","xbox","xerox","xfinity","xihuan","xin","कॉम","セール","佛山","慈善","集团","在线","点看","คอม","八卦","موقع","公益","公司","香格里拉","网站","移动","我爱你","москва","католик","онлайн","сайт","联通","קום","时尚","微博","淡马锡","ファッション","орг","नेट","ストア","アマゾン","삼성","商标","商店","商城","дети","ポイント","新闻","家電","كوم","中文网","中信","娱乐","谷歌","電訊盈科","购物","クラウド","通販","网店","संगठन","餐厅","网络","ком","亚马逊","诺基亚","食品","飞利浦","手机","ارامكو","العليان","اتصالات","بازار","ابوظبي","كاثوليك","همراه","닷컴","政府","شبكة","بيتك","عرب","机构","组织机构","健康","招聘","рус","大拿","みんな","グーグル","世界","書籍","网址","닷넷","コム","天主教","游戏","vermögensberater","vermögensberatung","企业","信息","嘉里大酒店","嘉里","广东","政务","xyz","yachts","yahoo","yamaxun","yandex","yodobashi","yoga","yokohama","you","youtube","yun","zappos","zara","zero","zip","zone","zuerich","cc.ua","inf.ua","ltd.ua","611.to","graphox.us","*.devcdnaccesso.com","adobeaemcloud.com","*.dev.adobeaemcloud.com","hlx.live","adobeaemcloud.net","hlx.page","hlx3.page","beep.pl","airkitapps.com","airkitapps-au.com","airkitapps.eu","aivencloud.com","barsy.ca","*.compute.estate","*.alces.network","kasserver.com","altervista.org","alwaysdata.net","cloudfront.net","*.compute.amazonaws.com","*.compute-1.amazonaws.com","*.compute.amazonaws.com.cn","us-east-1.amazonaws.com","cn-north-1.eb.amazonaws.com.cn","cn-northwest-1.eb.amazonaws.com.cn","elasticbeanstalk.com","ap-northeast-1.elasticbeanstalk.com","ap-northeast-2.elasticbeanstalk.com","ap-northeast-3.elasticbeanstalk.com","ap-south-1.elasticbeanstalk.com","ap-southeast-1.elasticbeanstalk.com","ap-southeast-2.elasticbeanstalk.com","ca-central-1.elasticbeanstalk.com","eu-central-1.elasticbeanstalk.com","eu-west-1.elasticbeanstalk.com","eu-west-2.elasticbeanstalk.com","eu-west-3.elasticbeanstalk.com","sa-east-1.elasticbeanstalk.com","us-east-1.elasticbeanstalk.com","us-east-2.elasticbeanstalk.com","us-gov-west-1.elasticbeanstalk.com","us-west-1.elasticbeanstalk.com","us-west-2.elasticbeanstalk.com","*.elb.amazonaws.com","*.elb.amazonaws.com.cn","awsglobalaccelerator.com","s3.amazonaws.com","s3-ap-northeast-1.amazonaws.com","s3-ap-northeast-2.amazonaws.com","s3-ap-south-1.amazonaws.com","s3-ap-southeast-1.amazonaws.com","s3-ap-southeast-2.amazonaws.com","s3-ca-central-1.amazonaws.com","s3-eu-central-1.amazonaws.com","s3-eu-west-1.amazonaws.com","s3-eu-west-2.amazonaws.com","s3-eu-west-3.amazonaws.com","s3-external-1.amazonaws.com","s3-fips-us-gov-west-1.amazonaws.com","s3-sa-east-1.amazonaws.com","s3-us-gov-west-1.amazonaws.com","s3-us-east-2.amazonaws.com","s3-us-west-1.amazonaws.com","s3-us-west-2.amazonaws.com","s3.ap-northeast-2.amazonaws.com","s3.ap-south-1.amazonaws.com","s3.cn-north-1.amazonaws.com.cn","s3.ca-central-1.amazonaws.com","s3.eu-central-1.amazonaws.com","s3.eu-west-2.amazonaws.com","s3.eu-west-3.amazonaws.com","s3.us-east-2.amazonaws.com","s3.dualstack.ap-northeast-1.amazonaws.com","s3.dualstack.ap-northeast-2.amazonaws.com","s3.dualstack.ap-south-1.amazonaws.com","s3.dualstack.ap-southeast-1.amazonaws.com","s3.dualstack.ap-southeast-2.amazonaws.com","s3.dualstack.ca-central-1.amazonaws.com","s3.dualstack.eu-central-1.amazonaws.com","s3.dualstack.eu-west-1.amazonaws.com","s3.dualstack.eu-west-2.amazonaws.com","s3.dualstack.eu-west-3.amazonaws.com","s3.dualstack.sa-east-1.amazonaws.com","s3.dualstack.us-east-1.amazonaws.com","s3.dualstack.us-east-2.amazonaws.com","s3-website-us-east-1.amazonaws.com","s3-website-us-west-1.amazonaws.com","s3-website-us-west-2.amazonaws.com","s3-website-ap-northeast-1.amazonaws.com","s3-website-ap-southeast-1.amazonaws.com","s3-website-ap-southeast-2.amazonaws.com","s3-website-eu-west-1.amazonaws.com","s3-website-sa-east-1.amazonaws.com","s3-website.ap-northeast-2.amazonaws.com","s3-website.ap-south-1.amazonaws.com","s3-website.ca-central-1.amazonaws.com","s3-website.eu-central-1.amazonaws.com","s3-website.eu-west-2.amazonaws.com","s3-website.eu-west-3.amazonaws.com","s3-website.us-east-2.amazonaws.com","t3l3p0rt.net","tele.amune.org","apigee.io","siiites.com","appspacehosted.com","appspaceusercontent.com","appudo.net","on-aptible.com","user.aseinet.ne.jp","gv.vc","d.gv.vc","user.party.eus","pimienta.org","poivron.org","potager.org","sweetpepper.org","myasustor.com","cdn.prod.atlassian-dev.net","translated.page","myfritz.net","onavstack.net","*.awdev.ca","*.advisor.ws","ecommerce-shop.pl","b-data.io","backplaneapp.io","balena-devices.com","rs.ba","*.banzai.cloud","app.banzaicloud.io","*.backyards.banzaicloud.io","base.ec","official.ec","buyshop.jp","fashionstore.jp","handcrafted.jp","kawaiishop.jp","supersale.jp","theshop.jp","shopselect.net","base.shop","*.beget.app","betainabox.com","bnr.la","bitbucket.io","blackbaudcdn.net","of.je","bluebite.io","boomla.net","boutir.com","boxfuse.io","square7.ch","bplaced.com","bplaced.de","square7.de","bplaced.net","square7.net","shop.brendly.rs","browsersafetymark.io","uk0.bigv.io","dh.bytemark.co.uk","vm.bytemark.co.uk","cafjs.com","mycd.eu","drr.ac","uwu.ai","carrd.co","crd.co","ju.mp","ae.org","br.com","cn.com","com.de","com.se","de.com","eu.com","gb.net","hu.net","jp.net","jpn.com","mex.com","ru.com","sa.com","se.net","uk.com","uk.net","us.com","za.bz","za.com","ar.com","hu.com","kr.com","no.com","qc.com","uy.com","africa.com","gr.com","in.net","web.in","us.org","co.com","aus.basketball","nz.basketball","radio.am","radio.fm","c.la","certmgr.org","cx.ua","discourse.group","discourse.team","cleverapps.io","clerk.app","clerkstage.app","*.lcl.dev","*.lclstage.dev","*.stg.dev","*.stgstage.dev","clickrising.net","c66.me","cloud66.ws","cloud66.zone","jdevcloud.com","wpdevcloud.com","cloudaccess.host","freesite.host","cloudaccess.net","cloudcontrolled.com","cloudcontrolapp.com","*.cloudera.site","pages.dev","trycloudflare.com","workers.dev","wnext.app","co.ca","*.otap.co","co.cz","c.cdn77.org","cdn77-ssl.net","r.cdn77.net","rsc.cdn77.org","ssl.origin.cdn77-secure.org","cloudns.asia","cloudns.biz","cloudns.club","cloudns.cc","cloudns.eu","cloudns.in","cloudns.info","cloudns.org","cloudns.pro","cloudns.pw","cloudns.us","cnpy.gdn","codeberg.page","co.nl","co.no","webhosting.be","hosting-cluster.nl","ac.ru","edu.ru","gov.ru","int.ru","mil.ru","test.ru","dyn.cosidns.de","dynamisches-dns.de","dnsupdater.de","internet-dns.de","l-o-g-i-n.de","dynamic-dns.info","feste-ip.net","knx-server.net","static-access.net","realm.cz","*.cryptonomic.net","cupcake.is","curv.dev","*.customer-oci.com","*.oci.customer-oci.com","*.ocp.customer-oci.com","*.ocs.customer-oci.com","cyon.link","cyon.site","fnwk.site","folionetwork.site","platform0.app","daplie.me","localhost.daplie.me","dattolocal.com","dattorelay.com","dattoweb.com","mydatto.com","dattolocal.net","mydatto.net","biz.dk","co.dk","firm.dk","reg.dk","store.dk","dyndns.dappnode.io","*.dapps.earth","*.bzz.dapps.earth","builtwithdark.com","demo.datadetect.com","instance.datadetect.com","edgestack.me","ddns5.com","debian.net","deno.dev","deno-staging.dev","dedyn.io","deta.app","deta.dev","*.rss.my.id","*.diher.solutions","discordsays.com","discordsez.com","jozi.biz","dnshome.de","online.th","shop.th","drayddns.com","shoparena.pl","dreamhosters.com","mydrobo.com","drud.io","drud.us","duckdns.org","bip.sh","bitbridge.net","dy.fi","tunk.org","dyndns-at-home.com","dyndns-at-work.com","dyndns-blog.com","dyndns-free.com","dyndns-home.com","dyndns-ip.com","dyndns-mail.com","dyndns-office.com","dyndns-pics.com","dyndns-remote.com","dyndns-server.com","dyndns-web.com","dyndns-wiki.com","dyndns-work.com","dyndns.biz","dyndns.info","dyndns.org","dyndns.tv","at-band-camp.net","ath.cx","barrel-of-knowledge.info","barrell-of-knowledge.info","better-than.tv","blogdns.com","blogdns.net","blogdns.org","blogsite.org","boldlygoingnowhere.org","broke-it.net","buyshouses.net","cechire.com","dnsalias.com","dnsalias.net","dnsalias.org","dnsdojo.com","dnsdojo.net","dnsdojo.org","does-it.net","doesntexist.com","doesntexist.org","dontexist.com","dontexist.net","dontexist.org","doomdns.com","doomdns.org","dvrdns.org","dyn-o-saur.com","dynalias.com","dynalias.net","dynalias.org","dynathome.net","dyndns.ws","endofinternet.net","endofinternet.org","endoftheinternet.org","est-a-la-maison.com","est-a-la-masion.com","est-le-patron.com","est-mon-blogueur.com","for-better.biz","for-more.biz","for-our.info","for-some.biz","for-the.biz","forgot.her.name","forgot.his.name","from-ak.com","from-al.com","from-ar.com","from-az.net","from-ca.com","from-co.net","from-ct.com","from-dc.com","from-de.com","from-fl.com","from-ga.com","from-hi.com","from-ia.com","from-id.com","from-il.com","from-in.com","from-ks.com","from-ky.com","from-la.net","from-ma.com","from-md.com","from-me.org","from-mi.com","from-mn.com","from-mo.com","from-ms.com","from-mt.com","from-nc.com","from-nd.com","from-ne.com","from-nh.com","from-nj.com","from-nm.com","from-nv.com","from-ny.net","from-oh.com","from-ok.com","from-or.com","from-pa.com","from-pr.com","from-ri.com","from-sc.com","from-sd.com","from-tn.com","from-tx.com","from-ut.com","from-va.com","from-vt.com","from-wa.com","from-wi.com","from-wv.com","from-wy.com","ftpaccess.cc","fuettertdasnetz.de","game-host.org","game-server.cc","getmyip.com","gets-it.net","go.dyndns.org","gotdns.com","gotdns.org","groks-the.info","groks-this.info","ham-radio-op.net","here-for-more.info","hobby-site.com","hobby-site.org","home.dyndns.org","homedns.org","homeftp.net","homeftp.org","homeip.net","homelinux.com","homelinux.net","homelinux.org","homeunix.com","homeunix.net","homeunix.org","iamallama.com","in-the-band.net","is-a-anarchist.com","is-a-blogger.com","is-a-bookkeeper.com","is-a-bruinsfan.org","is-a-bulls-fan.com","is-a-candidate.org","is-a-caterer.com","is-a-celticsfan.org","is-a-chef.com","is-a-chef.net","is-a-chef.org","is-a-conservative.com","is-a-cpa.com","is-a-cubicle-slave.com","is-a-democrat.com","is-a-designer.com","is-a-doctor.com","is-a-financialadvisor.com","is-a-geek.com","is-a-geek.net","is-a-geek.org","is-a-green.com","is-a-guru.com","is-a-hard-worker.com","is-a-hunter.com","is-a-knight.org","is-a-landscaper.com","is-a-lawyer.com","is-a-liberal.com","is-a-libertarian.com","is-a-linux-user.org","is-a-llama.com","is-a-musician.com","is-a-nascarfan.com","is-a-nurse.com","is-a-painter.com","is-a-patsfan.org","is-a-personaltrainer.com","is-a-photographer.com","is-a-player.com","is-a-republican.com","is-a-rockstar.com","is-a-socialist.com","is-a-soxfan.org","is-a-student.com","is-a-teacher.com","is-a-techie.com","is-a-therapist.com","is-an-accountant.com","is-an-actor.com","is-an-actress.com","is-an-anarchist.com","is-an-artist.com","is-an-engineer.com","is-an-entertainer.com","is-by.us","is-certified.com","is-found.org","is-gone.com","is-into-anime.com","is-into-cars.com","is-into-cartoons.com","is-into-games.com","is-leet.com","is-lost.org","is-not-certified.com","is-saved.org","is-slick.com","is-uberleet.com","is-very-bad.org","is-very-evil.org","is-very-good.org","is-very-nice.org","is-very-sweet.org","is-with-theband.com","isa-geek.com","isa-geek.net","isa-geek.org","isa-hockeynut.com","issmarterthanyou.com","isteingeek.de","istmein.de","kicks-ass.net","kicks-ass.org","knowsitall.info","land-4-sale.us","lebtimnetz.de","leitungsen.de","likes-pie.com","likescandy.com","merseine.nu","mine.nu","misconfused.org","mypets.ws","myphotos.cc","neat-url.com","office-on-the.net","on-the-web.tv","podzone.net","podzone.org","readmyblog.org","saves-the-whales.com","scrapper-site.net","scrapping.cc","selfip.biz","selfip.com","selfip.info","selfip.net","selfip.org","sells-for-less.com","sells-for-u.com","sells-it.net","sellsyourhome.org","servebbs.com","servebbs.net","servebbs.org","serveftp.net","serveftp.org","servegame.org","shacknet.nu","simple-url.com","space-to-rent.com","stuff-4-sale.org","stuff-4-sale.us","teaches-yoga.com","thruhere.net","traeumtgerade.de","webhop.biz","webhop.info","webhop.net","webhop.org","worse-than.tv","writesthisblog.com","ddnss.de","dyn.ddnss.de","dyndns.ddnss.de","dyndns1.de","dyn-ip24.de","home-webserver.de","dyn.home-webserver.de","myhome-server.de","ddnss.org","definima.net","definima.io","ondigitalocean.app","*.digitaloceanspaces.com","bci.dnstrace.pro","ddnsfree.com","ddnsgeek.com","giize.com","gleeze.com","kozow.com","loseyourip.com","ooguy.com","theworkpc.com","casacam.net","dynu.net","accesscam.org","camdvr.org","freeddns.org","mywire.org","webredirect.org","myddns.rocks","blogsite.xyz","dynv6.net","e4.cz","eero.online","eero-stage.online","elementor.cloud","elementor.cool","en-root.fr","mytuleap.com","tuleap-partners.com","encr.app","encoreapi.com","onred.one","staging.onred.one","eu.encoway.cloud","eu.org","al.eu.org","asso.eu.org","at.eu.org","au.eu.org","be.eu.org","bg.eu.org","ca.eu.org","cd.eu.org","ch.eu.org","cn.eu.org","cy.eu.org","cz.eu.org","de.eu.org","dk.eu.org","edu.eu.org","ee.eu.org","es.eu.org","fi.eu.org","fr.eu.org","gr.eu.org","hr.eu.org","hu.eu.org","ie.eu.org","il.eu.org","in.eu.org","int.eu.org","is.eu.org","it.eu.org","jp.eu.org","kr.eu.org","lt.eu.org","lu.eu.org","lv.eu.org","mc.eu.org","me.eu.org","mk.eu.org","mt.eu.org","my.eu.org","net.eu.org","ng.eu.org","nl.eu.org","no.eu.org","nz.eu.org","paris.eu.org","pl.eu.org","pt.eu.org","q-a.eu.org","ro.eu.org","ru.eu.org","se.eu.org","si.eu.org","sk.eu.org","tr.eu.org","uk.eu.org","us.eu.org","eurodir.ru","eu-1.evennode.com","eu-2.evennode.com","eu-3.evennode.com","eu-4.evennode.com","us-1.evennode.com","us-2.evennode.com","us-3.evennode.com","us-4.evennode.com","twmail.cc","twmail.net","twmail.org","mymailer.com.tw","url.tw","onfabrica.com","apps.fbsbx.com","ru.net","adygeya.ru","bashkiria.ru","bir.ru","cbg.ru","com.ru","dagestan.ru","grozny.ru","kalmykia.ru","kustanai.ru","marine.ru","mordovia.ru","msk.ru","mytis.ru","nalchik.ru","nov.ru","pyatigorsk.ru","spb.ru","vladikavkaz.ru","vladimir.ru","abkhazia.su","adygeya.su","aktyubinsk.su","arkhangelsk.su","armenia.su","ashgabad.su","azerbaijan.su","balashov.su","bashkiria.su","bryansk.su","bukhara.su","chimkent.su","dagestan.su","east-kazakhstan.su","exnet.su","georgia.su","grozny.su","ivanovo.su","jambyl.su","kalmykia.su","kaluga.su","karacol.su","karaganda.su","karelia.su","khakassia.su","krasnodar.su","kurgan.su","kustanai.su","lenug.su","mangyshlak.su","mordovia.su","msk.su","murmansk.su","nalchik.su","navoi.su","north-kazakhstan.su","nov.su","obninsk.su","penza.su","pokrovsk.su","sochi.su","spb.su","tashkent.su","termez.su","togliatti.su","troitsk.su","tselinograd.su","tula.su","tuva.su","vladikavkaz.su","vladimir.su","vologda.su","channelsdvr.net","u.channelsdvr.net","edgecompute.app","fastly-terrarium.com","fastlylb.net","map.fastlylb.net","freetls.fastly.net","map.fastly.net","a.prod.fastly.net","global.prod.fastly.net","a.ssl.fastly.net","b.ssl.fastly.net","global.ssl.fastly.net","fastvps-server.com","fastvps.host","myfast.host","fastvps.site","myfast.space","fedorainfracloud.org","fedorapeople.org","cloud.fedoraproject.org","app.os.fedoraproject.org","app.os.stg.fedoraproject.org","conn.uk","copro.uk","hosp.uk","mydobiss.com","fh-muenster.io","filegear.me","filegear-au.me","filegear-de.me","filegear-gb.me","filegear-ie.me","filegear-jp.me","filegear-sg.me","firebaseapp.com","fireweb.app","flap.id","onflashdrive.app","fldrv.com","fly.dev","edgeapp.net","shw.io","flynnhosting.net","forgeblocks.com","id.forgerock.io","framer.app","framercanvas.com","*.frusky.de","ravpage.co.il","0e.vc","freebox-os.com","freeboxos.com","fbx-os.fr","fbxos.fr","freebox-os.fr","freeboxos.fr","freedesktop.org","freemyip.com","wien.funkfeuer.at","*.futurecms.at","*.ex.futurecms.at","*.in.futurecms.at","futurehosting.at","futuremailing.at","*.ex.ortsinfo.at","*.kunden.ortsinfo.at","*.statics.cloud","independent-commission.uk","independent-inquest.uk","independent-inquiry.uk","independent-panel.uk","independent-review.uk","public-inquiry.uk","royal-commission.uk","campaign.gov.uk","service.gov.uk","api.gov.uk","gehirn.ne.jp","usercontent.jp","gentapps.com","gentlentapis.com","lab.ms","cdn-edges.net","ghost.io","gsj.bz","githubusercontent.com","githubpreview.dev","github.io","gitlab.io","gitapp.si","gitpage.si","glitch.me","nog.community","co.ro","shop.ro","lolipop.io","angry.jp","babyblue.jp","babymilk.jp","backdrop.jp","bambina.jp","bitter.jp","blush.jp","boo.jp","boy.jp","boyfriend.jp","but.jp","candypop.jp","capoo.jp","catfood.jp","cheap.jp","chicappa.jp","chillout.jp","chips.jp","chowder.jp","chu.jp","ciao.jp","cocotte.jp","coolblog.jp","cranky.jp","cutegirl.jp","daa.jp","deca.jp","deci.jp","digick.jp","egoism.jp","fakefur.jp","fem.jp","flier.jp","floppy.jp","fool.jp","frenchkiss.jp","girlfriend.jp","girly.jp","gloomy.jp","gonna.jp","greater.jp","hacca.jp","heavy.jp","her.jp","hiho.jp","hippy.jp","holy.jp","hungry.jp","icurus.jp","itigo.jp","jellybean.jp","kikirara.jp","kill.jp","kilo.jp","kuron.jp","littlestar.jp","lolipopmc.jp","lolitapunk.jp","lomo.jp","lovepop.jp","lovesick.jp","main.jp","mods.jp","mond.jp","mongolian.jp","moo.jp","namaste.jp","nikita.jp","nobushi.jp","noor.jp","oops.jp","parallel.jp","parasite.jp","pecori.jp","peewee.jp","penne.jp","pepper.jp","perma.jp","pigboat.jp","pinoko.jp","punyu.jp","pupu.jp","pussycat.jp","pya.jp","raindrop.jp","readymade.jp","sadist.jp","schoolbus.jp","secret.jp","staba.jp","stripper.jp","sub.jp","sunnyday.jp","thick.jp","tonkotsu.jp","under.jp","upper.jp","velvet.jp","verse.jp","versus.jp","vivian.jp","watson.jp","weblike.jp","whitesnow.jp","zombie.jp","heteml.net","cloudapps.digital","london.cloudapps.digital","pymnt.uk","homeoffice.gov.uk","ro.im","goip.de","run.app","a.run.app","web.app","*.0emm.com","appspot.com","*.r.appspot.com","codespot.com","googleapis.com","googlecode.com","pagespeedmobilizer.com","publishproxy.com","withgoogle.com","withyoutube.com","*.gateway.dev","cloud.goog","translate.goog","*.usercontent.goog","cloudfunctions.net","blogspot.ae","blogspot.al","blogspot.am","blogspot.ba","blogspot.be","blogspot.bg","blogspot.bj","blogspot.ca","blogspot.cf","blogspot.ch","blogspot.cl","blogspot.co.at","blogspot.co.id","blogspot.co.il","blogspot.co.ke","blogspot.co.nz","blogspot.co.uk","blogspot.co.za","blogspot.com","blogspot.com.ar","blogspot.com.au","blogspot.com.br","blogspot.com.by","blogspot.com.co","blogspot.com.cy","blogspot.com.ee","blogspot.com.eg","blogspot.com.es","blogspot.com.mt","blogspot.com.ng","blogspot.com.tr","blogspot.com.uy","blogspot.cv","blogspot.cz","blogspot.de","blogspot.dk","blogspot.fi","blogspot.fr","blogspot.gr","blogspot.hk","blogspot.hr","blogspot.hu","blogspot.ie","blogspot.in","blogspot.is","blogspot.it","blogspot.jp","blogspot.kr","blogspot.li","blogspot.lt","blogspot.lu","blogspot.md","blogspot.mk","blogspot.mr","blogspot.mx","blogspot.my","blogspot.nl","blogspot.no","blogspot.pe","blogspot.pt","blogspot.qa","blogspot.re","blogspot.ro","blogspot.rs","blogspot.ru","blogspot.se","blogspot.sg","blogspot.si","blogspot.sk","blogspot.sn","blogspot.td","blogspot.tw","blogspot.ug","blogspot.vn","goupile.fr","gov.nl","awsmppl.com","günstigbestellen.de","günstigliefern.de","fin.ci","free.hr","caa.li","ua.rs","conf.se","hs.zone","hs.run","hashbang.sh","hasura.app","hasura-app.io","pages.it.hs-heilbronn.de","hepforge.org","herokuapp.com","herokussl.com","ravendb.cloud","myravendb.com","ravendb.community","ravendb.me","development.run","ravendb.run","homesklep.pl","secaas.hk","hoplix.shop","orx.biz","biz.gl","col.ng","firm.ng","gen.ng","ltd.ng","ngo.ng","edu.scot","sch.so","hostyhosting.io","häkkinen.fi","*.moonscale.io","moonscale.net","iki.fi","ibxos.it","iliadboxos.it","impertrixcdn.com","impertrix.com","smushcdn.com","wphostedmail.com","wpmucdn.com","tempurl.host","wpmudev.host","dyn-berlin.de","in-berlin.de","in-brb.de","in-butter.de","in-dsl.de","in-dsl.net","in-dsl.org","in-vpn.de","in-vpn.net","in-vpn.org","biz.at","info.at","info.cx","ac.leg.br","al.leg.br","am.leg.br","ap.leg.br","ba.leg.br","ce.leg.br","df.leg.br","es.leg.br","go.leg.br","ma.leg.br","mg.leg.br","ms.leg.br","mt.leg.br","pa.leg.br","pb.leg.br","pe.leg.br","pi.leg.br","pr.leg.br","rj.leg.br","rn.leg.br","ro.leg.br","rr.leg.br","rs.leg.br","sc.leg.br","se.leg.br","sp.leg.br","to.leg.br","pixolino.com","na4u.ru","iopsys.se","ipifony.net","iservschule.de","mein-iserv.de","schulplattform.de","schulserver.de","test-iserv.de","iserv.dev","iobb.net","mel.cloudlets.com.au","cloud.interhostsolutions.be","users.scale.virtualcloud.com.br","mycloud.by","alp1.ae.flow.ch","appengine.flow.ch","es-1.axarnet.cloud","diadem.cloud","vip.jelastic.cloud","jele.cloud","it1.eur.aruba.jenv-aruba.cloud","it1.jenv-aruba.cloud","keliweb.cloud","cs.keliweb.cloud","oxa.cloud","tn.oxa.cloud","uk.oxa.cloud","primetel.cloud","uk.primetel.cloud","ca.reclaim.cloud","uk.reclaim.cloud","us.reclaim.cloud","ch.trendhosting.cloud","de.trendhosting.cloud","jele.club","amscompute.com","clicketcloud.com","dopaas.com","hidora.com","paas.hosted-by-previder.com","rag-cloud.hosteur.com","rag-cloud-ch.hosteur.com","jcloud.ik-server.com","jcloud-ver-jpc.ik-server.com","demo.jelastic.com","kilatiron.com","paas.massivegrid.com","jed.wafaicloud.com","lon.wafaicloud.com","ryd.wafaicloud.com","j.scaleforce.com.cy","jelastic.dogado.eu","fi.cloudplatform.fi","demo.datacenter.fi","paas.datacenter.fi","jele.host","mircloud.host","paas.beebyte.io","sekd1.beebyteapp.io","jele.io","cloud-fr1.unispace.io","jc.neen.it","cloud.jelastic.open.tim.it","jcloud.kz","upaas.kazteleport.kz","cloudjiffy.net","fra1-de.cloudjiffy.net","west1-us.cloudjiffy.net","jls-sto1.elastx.net","jls-sto2.elastx.net","jls-sto3.elastx.net","faststacks.net","fr-1.paas.massivegrid.net","lon-1.paas.massivegrid.net","lon-2.paas.massivegrid.net","ny-1.paas.massivegrid.net","ny-2.paas.massivegrid.net","sg-1.paas.massivegrid.net","jelastic.saveincloud.net","nordeste-idc.saveincloud.net","j.scaleforce.net","jelastic.tsukaeru.net","sdscloud.pl","unicloud.pl","mircloud.ru","jelastic.regruhosting.ru","enscaled.sg","jele.site","jelastic.team","orangecloud.tn","j.layershift.co.uk","phx.enscaled.us","mircloud.us","myjino.ru","*.hosting.myjino.ru","*.landing.myjino.ru","*.spectrum.myjino.ru","*.vps.myjino.ru","jotelulu.cloud","*.triton.zone","*.cns.joyent.com","js.org","kaas.gg","khplay.nl","ktistory.com","kapsi.fi","keymachine.de","kinghost.net","uni5.net","knightpoint.systems","koobin.events","oya.to","kuleuven.cloud","ezproxy.kuleuven.be","co.krd","edu.krd","krellian.net","webthings.io","git-repos.de","lcube-server.de","svn-repos.de","leadpages.co","lpages.co","lpusercontent.com","lelux.site","co.business","co.education","co.events","co.financial","co.network","co.place","co.technology","app.lmpm.com","linkyard.cloud","linkyard-cloud.ch","members.linode.com","*.nodebalancer.linode.com","*.linodeobjects.com","ip.linodeusercontent.com","we.bs","*.user.localcert.dev","localzone.xyz","loginline.app","loginline.dev","loginline.io","loginline.services","loginline.site","servers.run","lohmus.me","krasnik.pl","leczna.pl","lubartow.pl","lublin.pl","poniatowa.pl","swidnik.pl","glug.org.uk","lug.org.uk","lugs.org.uk","barsy.bg","barsy.co.uk","barsyonline.co.uk","barsycenter.com","barsyonline.com","barsy.club","barsy.de","barsy.eu","barsy.in","barsy.info","barsy.io","barsy.me","barsy.menu","barsy.mobi","barsy.net","barsy.online","barsy.org","barsy.pro","barsy.pub","barsy.ro","barsy.shop","barsy.site","barsy.support","barsy.uk","*.magentosite.cloud","mayfirst.info","mayfirst.org","hb.cldmail.ru","cn.vu","mazeplay.com","mcpe.me","mcdir.me","mcdir.ru","mcpre.ru","vps.mcdir.ru","mediatech.by","mediatech.dev","hra.health","miniserver.com","memset.net","messerli.app","*.cloud.metacentrum.cz","custom.metacentrum.cz","flt.cloud.muni.cz","usr.cloud.muni.cz","meteorapp.com","eu.meteorapp.com","co.pl","*.azurecontainer.io","azurewebsites.net","azure-mobile.net","cloudapp.net","azurestaticapps.net","1.azurestaticapps.net","centralus.azurestaticapps.net","eastasia.azurestaticapps.net","eastus2.azurestaticapps.net","westeurope.azurestaticapps.net","westus2.azurestaticapps.net","csx.cc","mintere.site","forte.id","mozilla-iot.org","bmoattachments.org","net.ru","org.ru","pp.ru","hostedpi.com","customer.mythic-beasts.com","caracal.mythic-beasts.com","fentiger.mythic-beasts.com","lynx.mythic-beasts.com","ocelot.mythic-beasts.com","oncilla.mythic-beasts.com","onza.mythic-beasts.com","sphinx.mythic-beasts.com","vs.mythic-beasts.com","x.mythic-beasts.com","yali.mythic-beasts.com","cust.retrosnub.co.uk","ui.nabu.casa","pony.club","of.fashion","in.london","of.london","from.marketing","with.marketing","for.men","repair.men","and.mom","for.mom","for.one","under.one","for.sale","that.win","from.work","to.work","cloud.nospamproxy.com","netlify.app","4u.com","ngrok.io","nh-serv.co.uk","nfshost.com","*.developer.app","noop.app","*.northflank.app","*.build.run","*.code.run","*.database.run","*.migration.run","noticeable.news","dnsking.ch","mypi.co","n4t.co","001www.com","ddnslive.com","myiphost.com","forumz.info","16-b.it","32-b.it","64-b.it","soundcast.me","tcp4.me","dnsup.net","hicam.net","now-dns.net","ownip.net","vpndns.net","dynserv.org","now-dns.org","x443.pw","now-dns.top","ntdll.top","freeddns.us","crafting.xyz","zapto.xyz","nsupdate.info","nerdpol.ovh","blogsyte.com","brasilia.me","cable-modem.org","ciscofreak.com","collegefan.org","couchpotatofries.org","damnserver.com","ddns.me","ditchyourip.com","dnsfor.me","dnsiskinky.com","dvrcam.info","dynns.com","eating-organic.net","fantasyleague.cc","geekgalaxy.com","golffan.us","health-carereform.com","homesecuritymac.com","homesecuritypc.com","hopto.me","ilovecollege.info","loginto.me","mlbfan.org","mmafan.biz","myactivedirectory.com","mydissent.net","myeffect.net","mymediapc.net","mypsx.net","mysecuritycamera.com","mysecuritycamera.net","mysecuritycamera.org","net-freaks.com","nflfan.org","nhlfan.net","no-ip.ca","no-ip.co.uk","no-ip.net","noip.us","onthewifi.com","pgafan.net","point2this.com","pointto.us","privatizehealthinsurance.net","quicksytes.com","read-books.org","securitytactics.com","serveexchange.com","servehumour.com","servep2p.com","servesarcasm.com","stufftoread.com","ufcfan.org","unusualperson.com","workisboring.com","3utilities.com","bounceme.net","ddns.net","ddnsking.com","gotdns.ch","hopto.org","myftp.biz","myftp.org","myvnc.com","no-ip.biz","no-ip.info","no-ip.org","noip.me","redirectme.net","servebeer.com","serveblog.net","servecounterstrike.com","serveftp.com","servegame.com","servehalflife.com","servehttp.com","serveirc.com","serveminecraft.net","servemp3.com","servepics.com","servequake.com","sytes.net","webhop.me","zapto.org","stage.nodeart.io","pcloud.host","nyc.mn","static.observableusercontent.com","cya.gg","omg.lol","cloudycluster.net","omniwe.site","service.one","nid.io","opensocial.site","opencraft.hosting","orsites.com","operaunite.com","tech.orange","authgear-staging.com","authgearapps.com","skygearapp.com","outsystemscloud.com","*.webpaas.ovh.net","*.hosting.ovh.net","ownprovider.com","own.pm","*.owo.codes","ox.rs","oy.lc","pgfog.com","pagefrontapp.com","pagexl.com","*.paywhirl.com","bar0.net","bar1.net","bar2.net","rdv.to","art.pl","gliwice.pl","krakow.pl","poznan.pl","wroc.pl","zakopane.pl","pantheonsite.io","gotpantheon.com","mypep.link","perspecta.cloud","lk3.ru","on-web.fr","bc.platform.sh","ent.platform.sh","eu.platform.sh","us.platform.sh","*.platformsh.site","*.tst.site","platter-app.com","platter-app.dev","platterp.us","pdns.page","plesk.page","pleskns.com","dyn53.io","onporter.run","co.bn","postman-echo.com","pstmn.io","mock.pstmn.io","httpbin.org","prequalifyme.today","xen.prgmr.com","priv.at","prvcy.page","*.dweb.link","protonet.io","chirurgiens-dentistes-en-france.fr","byen.site","pubtls.org","pythonanywhere.com","eu.pythonanywhere.com","qoto.io","qualifioapp.com","qbuser.com","cloudsite.builders","instances.spawn.cc","instantcloud.cn","ras.ru","qa2.com","qcx.io","*.sys.qcx.io","dev-myqnapcloud.com","alpha-myqnapcloud.com","myqnapcloud.com","*.quipelements.com","vapor.cloud","vaporcloud.io","rackmaze.com","rackmaze.net","g.vbrplsbx.io","*.on-k3s.io","*.on-rancher.cloud","*.on-rio.io","readthedocs.io","rhcloud.com","app.render.com","onrender.com","repl.co","id.repl.co","repl.run","resindevice.io","devices.resinstaging.io","hzc.io","wellbeingzone.eu","wellbeingzone.co.uk","adimo.co.uk","itcouldbewor.se","git-pages.rit.edu","rocky.page","биз.рус","ком.рус","крым.рус","мир.рус","мск.рус","орг.рус","самара.рус","сочи.рус","спб.рус","я.рус","*.builder.code.com","*.dev-builder.code.com","*.stg-builder.code.com","sandcats.io","logoip.de","logoip.com","fr-par-1.baremetal.scw.cloud","fr-par-2.baremetal.scw.cloud","nl-ams-1.baremetal.scw.cloud","fnc.fr-par.scw.cloud","functions.fnc.fr-par.scw.cloud","k8s.fr-par.scw.cloud","nodes.k8s.fr-par.scw.cloud","s3.fr-par.scw.cloud","s3-website.fr-par.scw.cloud","whm.fr-par.scw.cloud","priv.instances.scw.cloud","pub.instances.scw.cloud","k8s.scw.cloud","k8s.nl-ams.scw.cloud","nodes.k8s.nl-ams.scw.cloud","s3.nl-ams.scw.cloud","s3-website.nl-ams.scw.cloud","whm.nl-ams.scw.cloud","k8s.pl-waw.scw.cloud","nodes.k8s.pl-waw.scw.cloud","s3.pl-waw.scw.cloud","s3-website.pl-waw.scw.cloud","scalebook.scw.cloud","smartlabeling.scw.cloud","dedibox.fr","schokokeks.net","gov.scot","service.gov.scot","scrysec.com","firewall-gateway.com","firewall-gateway.de","my-gateway.de","my-router.de","spdns.de","spdns.eu","firewall-gateway.net","my-firewall.org","myfirewall.org","spdns.org","seidat.net","sellfy.store","senseering.net","minisite.ms","magnet.page","biz.ua","co.ua","pp.ua","shiftcrypto.dev","shiftcrypto.io","shiftedit.io","myshopblocks.com","myshopify.com","shopitsite.com","shopware.store","mo-siemens.io","1kapp.com","appchizi.com","applinzi.com","sinaapp.com","vipsinaapp.com","siteleaf.net","bounty-full.com","alpha.bounty-full.com","beta.bounty-full.com","small-web.org","vp4.me","try-snowplow.com","srht.site","stackhero-network.com","musician.io","novecore.site","static.land","dev.static.land","sites.static.land","storebase.store","vps-host.net","atl.jelastic.vps-host.net","njs.jelastic.vps-host.net","ric.jelastic.vps-host.net","playstation-cloud.com","apps.lair.io","*.stolos.io","spacekit.io","customer.speedpartner.de","myspreadshop.at","myspreadshop.com.au","myspreadshop.be","myspreadshop.ca","myspreadshop.ch","myspreadshop.com","myspreadshop.de","myspreadshop.dk","myspreadshop.es","myspreadshop.fi","myspreadshop.fr","myspreadshop.ie","myspreadshop.it","myspreadshop.net","myspreadshop.nl","myspreadshop.no","myspreadshop.pl","myspreadshop.se","myspreadshop.co.uk","api.stdlib.com","storj.farm","utwente.io","soc.srcf.net","user.srcf.net","temp-dns.com","supabase.co","supabase.in","supabase.net","su.paba.se","*.s5y.io","*.sensiosite.cloud","syncloud.it","dscloud.biz","direct.quickconnect.cn","dsmynas.com","familyds.com","diskstation.me","dscloud.me","i234.me","myds.me","synology.me","dscloud.mobi","dsmynas.net","familyds.net","dsmynas.org","familyds.org","vpnplus.to","direct.quickconnect.to","tabitorder.co.il","taifun-dns.de","beta.tailscale.net","ts.net","gda.pl","gdansk.pl","gdynia.pl","med.pl","sopot.pl","site.tb-hosting.com","edugit.io","s3.teckids.org","telebit.app","telebit.io","*.telebit.xyz","gwiddle.co.uk","*.firenet.ch","*.svc.firenet.ch","reservd.com","thingdustdata.com","cust.dev.thingdust.io","cust.disrec.thingdust.io","cust.prod.thingdust.io","cust.testing.thingdust.io","reservd.dev.thingdust.io","reservd.disrec.thingdust.io","reservd.testing.thingdust.io","tickets.io","arvo.network","azimuth.network","tlon.network","torproject.net","pages.torproject.net","bloxcms.com","townnews-staging.com","tbits.me","12hp.at","2ix.at","4lima.at","lima-city.at","12hp.ch","2ix.ch","4lima.ch","lima-city.ch","trafficplex.cloud","de.cool","12hp.de","2ix.de","4lima.de","lima-city.de","1337.pictures","clan.rip","lima-city.rocks","webspace.rocks","lima.zone","*.transurl.be","*.transurl.eu","*.transurl.nl","site.transip.me","tuxfamily.org","dd-dns.de","diskstation.eu","diskstation.org","dray-dns.de","draydns.de","dyn-vpn.de","dynvpn.de","mein-vigor.de","my-vigor.de","my-wan.de","syno-ds.de","synology-diskstation.de","synology-ds.de","typedream.app","pro.typeform.com","uber.space","*.uberspace.de","hk.com","hk.org","ltd.hk","inc.hk","name.pm","sch.tf","biz.wf","sch.wf","org.yt","virtualuser.de","virtual-user.de","upli.io","urown.cloud","dnsupdate.info","lib.de.us","2038.io","vercel.app","vercel.dev","now.sh","router.management","v-info.info","voorloper.cloud","neko.am","nyaa.am","be.ax","cat.ax","es.ax","eu.ax","gg.ax","mc.ax","us.ax","xy.ax","nl.ci","xx.gl","app.gp","blog.gt","de.gt","to.gt","be.gy","cc.hn","blog.kg","io.kg","jp.kg","tv.kg","uk.kg","us.kg","de.ls","at.md","de.md","jp.md","to.md","indie.porn","vxl.sh","ch.tc","me.tc","we.tc","nyan.to","at.vg","blog.vu","dev.vu","me.vu","v.ua","*.vultrobjects.com","wafflecell.com","*.webhare.dev","reserve-online.net","reserve-online.com","bookonline.app","hotelwithflight.com","wedeploy.io","wedeploy.me","wedeploy.sh","remotewd.com","pages.wiardweb.com","wmflabs.org","toolforge.org","wmcloud.org","panel.gg","daemon.panel.gg","messwithdns.com","woltlab-demo.com","myforum.community","community-pro.de","diskussionsbereich.de","community-pro.net","meinforum.net","affinitylottery.org.uk","raffleentry.org.uk","weeklylottery.org.uk","wpenginepowered.com","js.wpenginepowered.com","wixsite.com","editorx.io","half.host","xnbay.com","u2.xnbay.com","u2-local.xnbay.com","cistron.nl","demon.nl","xs4all.space","yandexcloud.net","storage.yandexcloud.net","website.yandexcloud.net","official.academy","yolasite.com","ybo.faith","yombo.me","homelink.one","ybo.party","ybo.review","ybo.science","ybo.trade","ynh.fr","nohost.me","noho.st","za.net","za.org","bss.design","basicserver.io","virtualserver.io","enterprisecloud.nu"]},{}],2:[function(a,o,t){"use strict";var m=a("punycode"),u={};u.rules=a("./data/rules.json").map(function(a){return{rule:a,suffix:a.replace(/^(\*\.|\!)/,""),punySuffix:-1,wildcard:"*"===a.charAt(0),exception:"!"===a.charAt(0)}}),u.endsWith=function(a,o){return-1!==a.indexOf(o,a.length-o.length)},u.findRule=function(a){var i=m.toASCII(a);return u.rules.reduce(function(a,o){return-1===o.punySuffix&&(o.punySuffix=m.toASCII(o.suffix)),u.endsWith(i,"."+o.punySuffix)||i===o.punySuffix?o:a},null)},t.errorCodes={DOMAIN_TOO_SHORT:"Domain name too short.",DOMAIN_TOO_LONG:"Domain name too long. It should be no more than 255 chars.",LABEL_STARTS_WITH_DASH:"Domain name label can not start with a dash.",LABEL_ENDS_WITH_DASH:"Domain name label can not end with a dash.",LABEL_TOO_LONG:"Domain name label should be at most 63 chars long.",LABEL_TOO_SHORT:"Domain name label should be at least 1 character long.",LABEL_INVALID_CHARS:"Domain name label can only contain alphanumeric characters or dashes."},u.validate=function(a){a=m.toASCII(a);if(a.length<1)return"DOMAIN_TOO_SHORT";if(255<a.length)return"DOMAIN_TOO_LONG";for(var o,i=a.split("."),e=0;e<i.length;++e){if(!(o=i[e]).length)return"LABEL_TOO_SHORT";if(63<o.length)return"LABEL_TOO_LONG";if("-"===o.charAt(0))return"LABEL_STARTS_WITH_DASH";if("-"===o.charAt(o.length-1))return"LABEL_ENDS_WITH_DASH";if(!/^[a-z0-9\-]+$/.test(o))return"LABEL_INVALID_CHARS"}},t.parse=function(a){if("string"!=typeof a)throw new TypeError("Domain name must be a string.");var o=a.slice(0).toLowerCase(),i=("."===o.charAt(o.length-1)&&(o=o.slice(0,o.length-1)),u.validate(o));if(i)return{input:a,error:{message:t.errorCodes[i],code:i}};var e={input:a,tld:null,sld:null,domain:null,subdomain:null,listed:!1},i=o.split(".");if("local"===i[i.length-1])return e;function s(){return/xn--/.test(o)&&(e.domain&&(e.domain=m.toASCII(e.domain)),e.subdomain&&(e.subdomain=m.toASCII(e.subdomain))),e}a=u.findRule(o);if(!a)return i.length<2?e:(e.tld=i.pop(),e.sld=i.pop(),e.domain=[e.sld,e.tld].join("."),i.length&&(e.subdomain=i.pop()),s());e.listed=!0;var n=a.suffix.split("."),i=i.slice(0,i.length-n.length);return a.exception&&i.push(n.shift()),e.tld=n.join("."),i.length&&(a.wildcard&&(n.unshift(i.pop()),e.tld=n.join(".")),i.length&&(e.sld=i.pop(),e.domain=[e.sld,e.tld].join("."),i.length&&(e.subdomain=i.join(".")))),s()},t.get=function(a){return a&&t.parse(a).domain||null},t.isValid=function(a){a=t.parse(a);return Boolean(a.domain&&a.listed)}},{"./data/rules.json":1,punycode:3}],3:[function(a,_,L){!function(O){!function(){var a=this,o="object"==typeof L&&L&&!L.nodeType&&L,i="object"==typeof _&&_&&!_.nodeType&&_,e="object"==typeof O&&O;e.global!==e&&e.window!==e&&e.self!==e||(a=e);var s,n,d=2147483647,j=36,b=26,t=38,m=700,u=/^xn--/,r=/[^\x20-\x7E]/,p=/[\x2E\u3002\uFF0E\uFF61]/g,c={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},l=j-1,y=Math.floor,f=String.fromCharCode;function v(a){throw new RangeError(c[a])}function k(a,o){for(var i=a.length,e=[];i--;)e[i]=o(a[i]);return e}function g(a,o){var i=a.split("@"),e="",i=(1<i.length&&(e=i[0]+"@",a=i[1]),(a=a.replace(p,".")).split("."));return e+k(i,o).join(".")}function w(a){for(var o,i,e=[],s=0,n=a.length;s<n;)55296<=(o=a.charCodeAt(s++))&&o<=56319&&s<n?56320==(64512&(i=a.charCodeAt(s++)))?e.push(((1023&o)<<10)+(1023&i)+65536):(e.push(o),s--):e.push(o);return e}function h(a){return k(a,function(a){var o="";return 65535<a&&(o+=f((a-=65536)>>>10&1023|55296),a=56320|1023&a),o+=f(a)}).join("")}function z(a,o){return a+22+75*(a<26)-((0!=o)<<5)}function x(a,o,i){var e=0;for(a=i?y(a/m):a>>1,a+=y(a/o);l*b>>1<a;e+=j)a=y(a/l);return y(e+(l+1)*a/(a+t))}function q(a){var o,i,e,s,n,t,m,u=[],r=a.length,p=0,c=128,l=72,k=a.lastIndexOf("-");for(k<0&&(k=0),i=0;i<k;++i)128<=a.charCodeAt(i)&&v("not-basic"),u.push(a.charCodeAt(i));for(e=0<k?k+1:0;e<r;){for(s=p,n=1,t=j;r<=e&&v("invalid-input"),m=a.charCodeAt(e++),(j<=(m=m-48<10?m-22:m-65<26?m-65:m-97<26?m-97:j)||m>y((d-p)/n))&&v("overflow"),p+=m*n,!(m<(m=t<=l?1:l+b<=t?b:t-l));t+=j)n>y(d/(m=j-m))&&v("overflow"),n*=m;l=x(p-s,o=u.length+1,0==s),y(p/o)>d-c&&v("overflow"),c+=y(p/o),p%=o,u.splice(p++,0,c)}return h(u)}function A(a){for(var o,i,e,s,n,t,m,u,r,p,c=[],l=(a=w(a)).length,k=128,g=72,h=o=0;h<l;++h)(m=a[h])<128&&c.push(f(m));for(i=e=c.length,e&&c.push("-");i<l;){for(s=d,h=0;h<l;++h)k<=(m=a[h])&&m<s&&(s=m);for(s-k>y((d-o)/(u=i+1))&&v("overflow"),o+=(s-k)*u,k=s,h=0;h<l;++h)if((m=a[h])<k&&++o>d&&v("overflow"),m==k){for(n=o,t=j;!(n<(r=t<=g?1:g+b<=t?b:t-g));t+=j)c.push(f(z(r+(p=n-r)%(r=j-r),0))),n=y(p/r);c.push(f(z(n,0))),g=x(o,u,i==e),o=0,++i}++o,++k}return c.join("")}if(s={version:"1.4.1",ucs2:{decode:w,encode:h},decode:q,encode:A,toASCII:function(a){return g(a,function(a){return r.test(a)?"xn--"+A(a):a})},toUnicode:function(a){return g(a,function(a){return u.test(a)?q(a.slice(4).toLowerCase()):a})}},o&&i)if(_.exports==o)i.exports=s;else for(n in s)s.hasOwnProperty(n)&&(o[n]=s[n]);else a.punycode=s}.call(this)}.call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[2])(2)});
[
"ac",
"com.ac",
"edu.ac",
"gov.ac",
"net.ac",
"mil.ac",
"org.ac",
"ad",
"nom.ad",
"ae",
"co.ae",
"net.ae",
"org.ae",
"sch.ae",
"ac.ae",
"gov.ae",
"mil.ae",
"aero",
"accident-investigation.aero",
"accident-prevention.aero",
"aerobatic.aero",
"aeroclub.aero",
"aerodrome.aero",
"agents.aero",
"aircraft.aero",
"airline.aero",
"airport.aero",
"air-surveillance.aero",
"airtraffic.aero",
"air-traffic-control.aero",
"ambulance.aero",
"amusement.aero",
"association.aero",
"author.aero",
"ballooning.aero",
"broker.aero",
"caa.aero",
"cargo.aero",
"catering.aero",
"certification.aero",
"championship.aero",
"charter.aero",
"civilaviation.aero",
"club.aero",
"conference.aero",
"consultant.aero",
"consulting.aero",
"control.aero",
"council.aero",
"crew.aero",
"design.aero",
"dgca.aero",
"educator.aero",
"emergency.aero",
"engine.aero",
"engineer.aero",
"entertainment.aero",
"equipment.aero",
"exchange.aero",
"express.aero",
"federation.aero",
"flight.aero",
"fuel.aero",
"gliding.aero",
"government.aero",
"groundhandling.aero",
"group.aero",
"hanggliding.aero",
"homebuilt.aero",
"insurance.aero",
"journal.aero",
"journalist.aero",
"leasing.aero",
"logistics.aero",
"magazine.aero",
"maintenance.aero",
"media.aero",
"microlight.aero",
"modelling.aero",
"navigation.aero",
"parachuting.aero",
"paragliding.aero",
"passenger-association.aero",
"pilot.aero",
"press.aero",
"production.aero",
"recreation.aero",
"repbody.aero",
"res.aero",
"research.aero",
"rotorcraft.aero",
"safety.aero",
"scientist.aero",
"services.aero",
"show.aero",
"skydiving.aero",
"software.aero",
"student.aero",
"trader.aero",
"trading.aero",
"trainer.aero",
"union.aero",
"workinggroup.aero",
"works.aero",
"af",
"gov.af",
"com.af",
"org.af",
"net.af",
"edu.af",
"ag",
"com.ag",
"org.ag",
"net.ag",
"co.ag",
"nom.ag",
"ai",
"off.ai",
"com.ai",
"net.ai",
"org.ai",
"al",
"com.al",
"edu.al",
"gov.al",
"mil.al",
"net.al",
"org.al",
"am",
"co.am",
"com.am",
"commune.am",
"net.am",
"org.am",
"ao",
"ed.ao",
"gv.ao",
"og.ao",
"co.ao",
"pb.ao",
"it.ao",
"aq",
"ar",
"bet.ar",
"com.ar",
"coop.ar",
"edu.ar",
"gob.ar",
"gov.ar",
"int.ar",
"mil.ar",
"musica.ar",
"mutual.ar",
"net.ar",
"org.ar",
"senasa.ar",
"tur.ar",
"arpa",
"e164.arpa",
"in-addr.arpa",
"ip6.arpa",
"iris.arpa",
"uri.arpa",
"urn.arpa",
"as",
"gov.as",
"asia",
"at",
"ac.at",
"co.at",
"gv.at",
"or.at",
"sth.ac.at",
"au",
"com.au",
"net.au",
"org.au",
"edu.au",
"gov.au",
"asn.au",
"id.au",
"info.au",
"conf.au",
"oz.au",
"act.au",
"nsw.au",
"nt.au",
"qld.au",
"sa.au",
"tas.au",
"vic.au",
"wa.au",
"act.edu.au",
"catholic.edu.au",
"nsw.edu.au",
"nt.edu.au",
"qld.edu.au",
"sa.edu.au",
"tas.edu.au",
"vic.edu.au",
"wa.edu.au",
"qld.gov.au",
"sa.gov.au",
"tas.gov.au",
"vic.gov.au",
"wa.gov.au",
"schools.nsw.edu.au",
"aw",
"com.aw",
"ax",
"az",
"com.az",
"net.az",
"int.az",
"gov.az",
"org.az",
"edu.az",
"info.az",
"pp.az",
"mil.az",
"name.az",
"pro.az",
"biz.az",
"ba",
"com.ba",
"edu.ba",
"gov.ba",
"mil.ba",
"net.ba",
"org.ba",
"bb",
"biz.bb",
"co.bb",
"com.bb",
"edu.bb",
"gov.bb",
"info.bb",
"net.bb",
"org.bb",
"store.bb",
"tv.bb",
"*.bd",
"be",
"ac.be",
"bf",
"gov.bf",
"bg",
"a.bg",
"b.bg",
"c.bg",
"d.bg",
"e.bg",
"f.bg",
"g.bg",
"h.bg",
"i.bg",
"j.bg",
"k.bg",
"l.bg",
"m.bg",
"n.bg",
"o.bg",
"p.bg",
"q.bg",
"r.bg",
"s.bg",
"t.bg",
"u.bg",
"v.bg",
"w.bg",
"x.bg",
"y.bg",
"z.bg",
"0.bg",
"1.bg",
"2.bg",
"3.bg",
"4.bg",
"5.bg",
"6.bg",
"7.bg",
"8.bg",
"9.bg",
"bh",
"com.bh",
"edu.bh",
"net.bh",
"org.bh",
"gov.bh",
"bi",
"co.bi",
"com.bi",
"edu.bi",
"or.bi",
"org.bi",
"biz",
"bj",
"asso.bj",
"barreau.bj",
"gouv.bj",
"bm",
"com.bm",
"edu.bm",
"gov.bm",
"net.bm",
"org.bm",
"bn",
"com.bn",
"edu.bn",
"gov.bn",
"net.bn",
"org.bn",
"bo",
"com.bo",
"edu.bo",
"gob.bo",
"int.bo",
"org.bo",
"net.bo",
"mil.bo",
"tv.bo",
"web.bo",
"academia.bo",
"agro.bo",
"arte.bo",
"blog.bo",
"bolivia.bo",
"ciencia.bo",
"cooperativa.bo",
"democracia.bo",
"deporte.bo",
"ecologia.bo",
"economia.bo",
"empresa.bo",
"indigena.bo",
"industria.bo",
"info.bo",
"medicina.bo",
"movimiento.bo",
"musica.bo",
"natural.bo",
"nombre.bo",
"noticias.bo",
"patria.bo",
"politica.bo",
"profesional.bo",
"plurinacional.bo",
"pueblo.bo",
"revista.bo",
"salud.bo",
"tecnologia.bo",
"tksat.bo",
"transporte.bo",
"wiki.bo",
"br",
"9guacu.br",
"abc.br",
"adm.br",
"adv.br",
"agr.br",
"aju.br",
"am.br",
"anani.br",
"aparecida.br",
"app.br",
"arq.br",
"art.br",
"ato.br",
"b.br",
"barueri.br",
"belem.br",
"bhz.br",
"bib.br",
"bio.br",
"blog.br",
"bmd.br",
"boavista.br",
"bsb.br",
"campinagrande.br",
"campinas.br",
"caxias.br",
"cim.br",
"cng.br",
"cnt.br",
"com.br",
"contagem.br",
"coop.br",
"coz.br",
"cri.br",
"cuiaba.br",
"curitiba.br",
"def.br",
"des.br",
"det.br",
"dev.br",
"ecn.br",
"eco.br",
"edu.br",
"emp.br",
"enf.br",
"eng.br",
"esp.br",
"etc.br",
"eti.br",
"far.br",
"feira.br",
"flog.br",
"floripa.br",
"fm.br",
"fnd.br",
"fortal.br",
"fot.br",
"foz.br",
"fst.br",
"g12.br",
"geo.br",
"ggf.br",
"goiania.br",
"gov.br",
"ac.gov.br",
"al.gov.br",
"am.gov.br",
"ap.gov.br",
"ba.gov.br",
"ce.gov.br",
"df.gov.br",
"es.gov.br",
"go.gov.br",
"ma.gov.br",
"mg.gov.br",
"ms.gov.br",
"mt.gov.br",
"pa.gov.br",
"pb.gov.br",
"pe.gov.br",
"pi.gov.br",
"pr.gov.br",
"rj.gov.br",
"rn.gov.br",
"ro.gov.br",
"rr.gov.br",
"rs.gov.br",
"sc.gov.br",
"se.gov.br",
"sp.gov.br",
"to.gov.br",
"gru.br",
"imb.br",
"ind.br",
"inf.br",
"jab.br",
"jampa.br",
"jdf.br",
"joinville.br",
"jor.br",
"jus.br",
"leg.br",
"lel.br",
"log.br",
"londrina.br",
"macapa.br",
"maceio.br",
"manaus.br",
"maringa.br",
"mat.br",
"med.br",
"mil.br",
"morena.br",
"mp.br",
"mus.br",
"natal.br",
"net.br",
"niteroi.br",
"*.nom.br",
"not.br",
"ntr.br",
"odo.br",
"ong.br",
"org.br",
"osasco.br",
"palmas.br",
"poa.br",
"ppg.br",
"pro.br",
"psc.br",
"psi.br",
"pvh.br",
"qsl.br",
"radio.br",
"rec.br",
"recife.br",
"rep.br",
"ribeirao.br",
"rio.br",
"riobranco.br",
"riopreto.br",
"salvador.br",
"sampa.br",
"santamaria.br",
"santoandre.br",
"saobernardo.br",
"saogonca.br",
"seg.br",
"sjc.br",
"slg.br",
"slz.br",
"sorocaba.br",
"srv.br",
"taxi.br",
"tc.br",
"tec.br",
"teo.br",
"the.br",
"tmp.br",
"trd.br",
"tur.br",
"tv.br",
"udi.br",
"vet.br",
"vix.br",
"vlog.br",
"wiki.br",
"zlg.br",
"bs",
"com.bs",
"net.bs",
"org.bs",
"edu.bs",
"gov.bs",
"bt",
"com.bt",
"edu.bt",
"gov.bt",
"net.bt",
"org.bt",
"bv",
"bw",
"co.bw",
"org.bw",
"by",
"gov.by",
"mil.by",
"com.by",
"of.by",
"bz",
"com.bz",
"net.bz",
"org.bz",
"edu.bz",
"gov.bz",
"ca",
"ab.ca",
"bc.ca",
"mb.ca",
"nb.ca",
"nf.ca",
"nl.ca",
"ns.ca",
"nt.ca",
"nu.ca",
"on.ca",
"pe.ca",
"qc.ca",
"sk.ca",
"yk.ca",
"gc.ca",
"cat",
"cc",
"cd",
"gov.cd",
"cf",
"cg",
"ch",
"ci",
"org.ci",
"or.ci",
"com.ci",
"co.ci",
"edu.ci",
"ed.ci",
"ac.ci",
"net.ci",
"go.ci",
"asso.ci",
"aéroport.ci",
"int.ci",
"presse.ci",
"md.ci",
"gouv.ci",
"*.ck",
"!www.ck",
"cl",
"co.cl",
"gob.cl",
"gov.cl",
"mil.cl",
"cm",
"co.cm",
"com.cm",
"gov.cm",
"net.cm",
"cn",
"ac.cn",
"com.cn",
"edu.cn",
"gov.cn",
"net.cn",
"org.cn",
"mil.cn",
"公司.cn",
"网络.cn",
"網絡.cn",
"ah.cn",
"bj.cn",
"cq.cn",
"fj.cn",
"gd.cn",
"gs.cn",
"gz.cn",
"gx.cn",
"ha.cn",
"hb.cn",
"he.cn",
"hi.cn",
"hl.cn",
"hn.cn",
"jl.cn",
"js.cn",
"jx.cn",
"ln.cn",
"nm.cn",
"nx.cn",
"qh.cn",
"sc.cn",
"sd.cn",
"sh.cn",
"sn.cn",
"sx.cn",
"tj.cn",
"xj.cn",
"xz.cn",
"yn.cn",
"zj.cn",
"hk.cn",
"mo.cn",
"tw.cn",
"co",
"arts.co",
"com.co",
"edu.co",
"firm.co",
"gov.co",
"info.co",
"int.co",
"mil.co",
"net.co",
"nom.co",
"org.co",
"rec.co",
"web.co",
"com",
"coop",
"cr",
"ac.cr",
"co.cr",
"ed.cr",
"fi.cr",
"go.cr",
"or.cr",
"sa.cr",
"cu",
"com.cu",
"edu.cu",
"org.cu",
"net.cu",
"gov.cu",
"inf.cu",
"cv",
"com.cv",
"edu.cv",
"int.cv",
"nome.cv",
"org.cv",
"cw",
"com.cw",
"edu.cw",
"net.cw",
"org.cw",
"cx",
"gov.cx",
"cy",
"ac.cy",
"biz.cy",
"com.cy",
"ekloges.cy",
"gov.cy",
"ltd.cy",
"mil.cy",
"net.cy",
"org.cy",
"press.cy",
"pro.cy",
"tm.cy",
"cz",
"de",
"dj",
"dk",
"dm",
"com.dm",
"net.dm",
"org.dm",
"edu.dm",
"gov.dm",
"do",
"art.do",
"com.do",
"edu.do",
"gob.do",
"gov.do",
"mil.do",
"net.do",
"org.do",
"sld.do",
"web.do",
"dz",
"art.dz",
"asso.dz",
"com.dz",
"edu.dz",
"gov.dz",
"org.dz",
"net.dz",
"pol.dz",
"soc.dz",
"tm.dz",
"ec",
"com.ec",
"info.ec",
"net.ec",
"fin.ec",
"k12.ec",
"med.ec",
"pro.ec",
"org.ec",
"edu.ec",
"gov.ec",
"gob.ec",
"mil.ec",
"edu",
"ee",
"edu.ee",
"gov.ee",
"riik.ee",
"lib.ee",
"med.ee",
"com.ee",
"pri.ee",
"aip.ee",
"org.ee",
"fie.ee",
"eg",
"com.eg",
"edu.eg",
"eun.eg",
"gov.eg",
"mil.eg",
"name.eg",
"net.eg",
"org.eg",
"sci.eg",
"*.er",
"es",
"com.es",
"nom.es",
"org.es",
"gob.es",
"edu.es",
"et",
"com.et",
"gov.et",
"org.et",
"edu.et",
"biz.et",
"name.et",
"info.et",
"net.et",
"eu",
"fi",
"aland.fi",
"fj",
"ac.fj",
"biz.fj",
"com.fj",
"gov.fj",
"info.fj",
"mil.fj",
"name.fj",
"net.fj",
"org.fj",
"pro.fj",
"*.fk",
"com.fm",
"edu.fm",
"net.fm",
"org.fm",
"fm",
"fo",
"fr",
"asso.fr",
"com.fr",
"gouv.fr",
"nom.fr",
"prd.fr",
"tm.fr",
"aeroport.fr",
"avocat.fr",
"avoues.fr",
"cci.fr",
"chambagri.fr",
"chirurgiens-dentistes.fr",
"experts-comptables.fr",
"geometre-expert.fr",
"greta.fr",
"huissier-justice.fr",
"medecin.fr",
"notaires.fr",
"pharmacien.fr",
"port.fr",
"veterinaire.fr",
"ga",
"gb",
"edu.gd",
"gov.gd",
"gd",
"ge",
"com.ge",
"edu.ge",
"gov.ge",
"org.ge",
"mil.ge",
"net.ge",
"pvt.ge",
"gf",
"gg",
"co.gg",
"net.gg",
"org.gg",
"gh",
"com.gh",
"edu.gh",
"gov.gh",
"org.gh",
"mil.gh",
"gi",
"com.gi",
"ltd.gi",
"gov.gi",
"mod.gi",
"edu.gi",
"org.gi",
"gl",
"co.gl",
"com.gl",
"edu.gl",
"net.gl",
"org.gl",
"gm",
"gn",
"ac.gn",
"com.gn",
"edu.gn",
"gov.gn",
"org.gn",
"net.gn",
"gov",
"gp",
"com.gp",
"net.gp",
"mobi.gp",
"edu.gp",
"org.gp",
"asso.gp",
"gq",
"gr",
"com.gr",
"edu.gr",
"net.gr",
"org.gr",
"gov.gr",
"gs",
"gt",
"com.gt",
"edu.gt",
"gob.gt",
"ind.gt",
"mil.gt",
"net.gt",
"org.gt",
"gu",
"com.gu",
"edu.gu",
"gov.gu",
"guam.gu",
"info.gu",
"net.gu",
"org.gu",
"web.gu",
"gw",
"gy",
"co.gy",
"com.gy",
"edu.gy",
"gov.gy",
"net.gy",
"org.gy",
"hk",
"com.hk",
"edu.hk",
"gov.hk",
"idv.hk",
"net.hk",
"org.hk",
"公司.hk",
"教育.hk",
"敎育.hk",
"政府.hk",
"個人.hk",
"个��.hk",
"箇人.hk",
"網络.hk",
"网络.hk",
"组織.hk",
"網絡.hk",
"网絡.hk",
"组织.hk",
"組織.hk",
"組织.hk",
"hm",
"hn",
"com.hn",
"edu.hn",
"org.hn",
"net.hn",
"mil.hn",
"gob.hn",
"hr",
"iz.hr",
"from.hr",
"name.hr",
"com.hr",
"ht",
"com.ht",
"shop.ht",
"firm.ht",
"info.ht",
"adult.ht",
"net.ht",
"pro.ht",
"org.ht",
"med.ht",
"art.ht",
"coop.ht",
"pol.ht",
"asso.ht",
"edu.ht",
"rel.ht",
"gouv.ht",
"perso.ht",
"hu",
"co.hu",
"info.hu",
"org.hu",
"priv.hu",
"sport.hu",
"tm.hu",
"2000.hu",
"agrar.hu",
"bolt.hu",
"casino.hu",
"city.hu",
"erotica.hu",
"erotika.hu",
"film.hu",
"forum.hu",
"games.hu",
"hotel.hu",
"ingatlan.hu",
"jogasz.hu",
"konyvelo.hu",
"lakas.hu",
"media.hu",
"news.hu",
"reklam.hu",
"sex.hu",
"shop.hu",
"suli.hu",
"szex.hu",
"tozsde.hu",
"utazas.hu",
"video.hu",
"id",
"ac.id",
"biz.id",
"co.id",
"desa.id",
"go.id",
"mil.id",
"my.id",
"net.id",
"or.id",
"ponpes.id",
"sch.id",
"web.id",
"ie",
"gov.ie",
"il",
"ac.il",
"co.il",
"gov.il",
"idf.il",
"k12.il",
"muni.il",
"net.il",
"org.il",
"im",
"ac.im",
"co.im",
"com.im",
"ltd.co.im",
"net.im",
"org.im",
"plc.co.im",
"tt.im",
"tv.im",
"in",
"co.in",
"firm.in",
"net.in",
"org.in",
"gen.in",
"ind.in",
"nic.in",
"ac.in",
"edu.in",
"res.in",
"gov.in",
"mil.in",
"info",
"int",
"eu.int",
"io",
"com.io",
"iq",
"gov.iq",
"edu.iq",
"mil.iq",
"com.iq",
"org.iq",
"net.iq",
"ir",
"ac.ir",
"co.ir",
"gov.ir",
"id.ir",
"net.ir",
"org.ir",
"sch.ir",
"ایران.ir",
"ايران.ir",
"is",
"net.is",
"com.is",
"edu.is",
"gov.is",
"org.is",
"int.is",
"it",
"gov.it",
"edu.it",
"abr.it",
"abruzzo.it",
"aosta-valley.it",
"aostavalley.it",
"bas.it",
"basilicata.it",
"cal.it",
"calabria.it",
"cam.it",
"campania.it",
"emilia-romagna.it",
"emiliaromagna.it",
"emr.it",
"friuli-v-giulia.it",
"friuli-ve-giulia.it",
"friuli-vegiulia.it",
"friuli-venezia-giulia.it",
"friuli-veneziagiulia.it",
"friuli-vgiulia.it",
"friuliv-giulia.it",
"friulive-giulia.it",
"friulivegiulia.it",
"friulivenezia-giulia.it",
"friuliveneziagiulia.it",
"friulivgiulia.it",
"fvg.it",
"laz.it",
"lazio.it",
"lig.it",
"liguria.it",
"lom.it",
"lombardia.it",
"lombardy.it",
"lucania.it",
"mar.it",
"marche.it",
"mol.it",
"molise.it",
"piedmont.it",
"piemonte.it",
"pmn.it",
"pug.it",
"puglia.it",
"sar.it",
"sardegna.it",
"sardinia.it",
"sic.it",
"sicilia.it",
"sicily.it",
"taa.it",
"tos.it",
"toscana.it",
"trentin-sud-tirol.it",
"trentin-süd-tirol.it",
"trentin-sudtirol.it",
"trentin-südtirol.it",
"trentin-sued-tirol.it",
"trentin-suedtirol.it",
"trentino-a-adige.it",
"trentino-aadige.it",
"trentino-alto-adige.it",
"trentino-altoadige.it",
"trentino-s-tirol.it",
"trentino-stirol.it",
"trentino-sud-tirol.it",
"trentino-süd-tirol.it",
"trentino-sudtirol.it",
"trentino-südtirol.it",
"trentino-sued-tirol.it",
"trentino-suedtirol.it",
"trentino.it",
"trentinoa-adige.it",
"trentinoaadige.it",
"trentinoalto-adige.it",
"trentinoaltoadige.it",
"trentinos-tirol.it",
"trentinostirol.it",
"trentinosud-tirol.it",
"trentinosüd-tirol.it",
"trentinosudtirol.it",
"trentinosüdtirol.it",
"trentinosued-tirol.it",
"trentinosuedtirol.it",
"trentinsud-tirol.it",
"trentinsüd-tirol.it",
"trentinsudtirol.it",
"trentinsüdtirol.it",
"trentinsued-tirol.it",
"trentinsuedtirol.it",
"tuscany.it",
"umb.it",
"umbria.it",
"val-d-aosta.it",
"val-daosta.it",
"vald-aosta.it",
"valdaosta.it",
"valle-aosta.it",
"valle-d-aosta.it",
"valle-daosta.it",
"valleaosta.it",
"valled-aosta.it",
"valledaosta.it",
"vallee-aoste.it",
"vallée-aoste.it",
"vallee-d-aoste.it",
"vallée-d-aoste.it",
"valleeaoste.it",
"valléeaoste.it",
"valleedaoste.it",
"valléedaoste.it",
"vao.it",
"vda.it",
"ven.it",
"veneto.it",
"ag.it",
"agrigento.it",
"al.it",
"alessandria.it",
"alto-adige.it",
"altoadige.it",
"an.it",
"ancona.it",
"andria-barletta-trani.it",
"andria-trani-barletta.it",
"andriabarlettatrani.it",
"andriatranibarletta.it",
"ao.it",
"aosta.it",
"aoste.it",
"ap.it",
"aq.it",
"aquila.it",
"ar.it",
"arezzo.it",
"ascoli-piceno.it",
"ascolipiceno.it",
"asti.it",
"at.it",
"av.it",
"avellino.it",
"ba.it",
"balsan-sudtirol.it",
"balsan-südtirol.it",
"balsan-suedtirol.it",
"balsan.it",
"bari.it",
"barletta-trani-andria.it",
"barlettatraniandria.it",
"belluno.it",
"benevento.it",
"bergamo.it",
"bg.it",
"bi.it",
"biella.it",
"bl.it",
"bn.it",
"bo.it",
"bologna.it",
"bolzano-altoadige.it",
"bolzano.it",
"bozen-sudtirol.it",
"bozen-südtirol.it",
"bozen-suedtirol.it",
"bozen.it",
"br.it",
"brescia.it",
"brindisi.it",
"bs.it",
"bt.it",
"bulsan-sudtirol.it",
"bulsan-südtirol.it",
"bulsan-suedtirol.it",
"bulsan.it",
"bz.it",
"ca.it",
"cagliari.it",
"caltanissetta.it",
"campidano-medio.it",
"campidanomedio.it",
"campobasso.it",
"carbonia-iglesias.it",
"carboniaiglesias.it",
"carrara-massa.it",
"carraramassa.it",
"caserta.it",
"catania.it",
"catanzaro.it",
"cb.it",
"ce.it",
"cesena-forli.it",
"cesena-forlì.it",
"cesenaforli.it",
"cesenaforlì.it",
"ch.it",
"chieti.it",
"ci.it",
"cl.it",
"cn.it",
"co.it",
"como.it",
"cosenza.it",
"cr.it",
"cremona.it",
"crotone.it",
"cs.it",
"ct.it",
"cuneo.it",
"cz.it",
"dell-ogliastra.it",
"dellogliastra.it",
"en.it",
"enna.it",
"fc.it",
"fe.it",
"fermo.it",
"ferrara.it",
"fg.it",
"fi.it",
"firenze.it",
"florence.it",
"fm.it",
"foggia.it",
"forli-cesena.it",
"forlì-cesena.it",
"forlicesena.it",
"forlìcesena.it",
"fr.it",
"frosinone.it",
"ge.it",
"genoa.it",
"genova.it",
"go.it",
"gorizia.it",
"gr.it",
"grosseto.it",
"iglesias-carbonia.it",
"iglesiascarbonia.it",
"im.it",
"imperia.it",
"is.it",
"isernia.it",
"kr.it",
"la-spezia.it",
"laquila.it",
"laspezia.it",
"latina.it",
"lc.it",
"le.it",
"lecce.it",
"lecco.it",
"li.it",
"livorno.it",
"lo.it",
"lodi.it",
"lt.it",
"lu.it",
"lucca.it",
"macerata.it",
"mantova.it",
"massa-carrara.it",
"massacarrara.it",
"matera.it",
"mb.it",
"mc.it",
"me.it",
"medio-campidano.it",
"mediocampidano.it",
"messina.it",
"mi.it",
"milan.it",
"milano.it",
"mn.it",
"mo.it",
"modena.it",
"monza-brianza.it",
"monza-e-della-brianza.it",
"monza.it",
"monzabrianza.it",
"monzaebrianza.it",
"monzaedellabrianza.it",
"ms.it",
"mt.it",
"na.it",
"naples.it",
"napoli.it",
"no.it",
"novara.it",
"nu.it",
"nuoro.it",
"og.it",
"ogliastra.it",
"olbia-tempio.it",
"olbiatempio.it",
"or.it",
"oristano.it",
"ot.it",
"pa.it",
"padova.it",
"padua.it",
"palermo.it",
"parma.it",
"pavia.it",
"pc.it",
"pd.it",
"pe.it",
"perugia.it",
"pesaro-urbino.it",
"pesarourbino.it",
"pescara.it",
"pg.it",
"pi.it",
"piacenza.it",
"pisa.it",
"pistoia.it",
"pn.it",
"po.it",
"pordenone.it",
"potenza.it",
"pr.it",
"prato.it",
"pt.it",
"pu.it",
"pv.it",
"pz.it",
"ra.it",
"ragusa.it",
"ravenna.it",
"rc.it",
"re.it",
"reggio-calabria.it",
"reggio-emilia.it",
"reggiocalabria.it",
"reggioemilia.it",
"rg.it",
"ri.it",
"rieti.it",
"rimini.it",
"rm.it",
"rn.it",
"ro.it",
"roma.it",
"rome.it",
"rovigo.it",
"sa.it",
"salerno.it",
"sassari.it",
"savona.it",
"si.it",
"siena.it",
"siracusa.it",
"so.it",
"sondrio.it",
"sp.it",
"sr.it",
"ss.it",
"suedtirol.it",
"südtirol.it",
"sv.it",
"ta.it",
"taranto.it",
"te.it",
"tempio-olbia.it",
"tempioolbia.it",
"teramo.it",
"terni.it",
"tn.it",
"to.it",
"torino.it",
"tp.it",
"tr.it",
"trani-andria-barletta.it",
"trani-barletta-andria.it",
"traniandriabarletta.it",
"tranibarlettaandria.it",
"trapani.it",
"trento.it",
"treviso.it",
"trieste.it",
"ts.it",
"turin.it",
"tv.it",
"ud.it",
"udine.it",
"urbino-pesaro.it",
"urbinopesaro.it",
"va.it",
"varese.it",
"vb.it",
"vc.it",
"ve.it",
"venezia.it",
"venice.it",
"verbania.it",
"vercelli.it",
"verona.it",
"vi.it",
"vibo-valentia.it",
"vibovalentia.it",
"vicenza.it",
"viterbo.it",
"vr.it",
"vs.it",
"vt.it",
"vv.it",
"je",
"co.je",
"net.je",
"org.je",
"*.jm",
"jo",
"com.jo",
"org.jo",
"net.jo",
"edu.jo",
"sch.jo",
"gov.jo",
"mil.jo",
"name.jo",
"jobs",
"jp",
"ac.jp",
"ad.jp",
"co.jp",
"ed.jp",
"go.jp",
"gr.jp",
"lg.jp",
"ne.jp",
"or.jp",
"aichi.jp",
"akita.jp",
"aomori.jp",
"chiba.jp",
"ehime.jp",
"fukui.jp",
"fukuoka.jp",
"fukushima.jp",
"gifu.jp",
"gunma.jp",
"hiroshima.jp",
"hokkaido.jp",
"hyogo.jp",
"ibaraki.jp",
"ishikawa.jp",
"iwate.jp",
"kagawa.jp",
"kagoshima.jp",
"kanagawa.jp",
"kochi.jp",
"kumamoto.jp",
"kyoto.jp",
"mie.jp",
"miyagi.jp",
"miyazaki.jp",
"nagano.jp",
"nagasaki.jp",
"nara.jp",
"niigata.jp",
"oita.jp",
"okayama.jp",
"okinawa.jp",
"osaka.jp",
"saga.jp",
"saitama.jp",
"shiga.jp",
"shimane.jp",
"shizuoka.jp",
"tochigi.jp",
"tokushima.jp",
"tokyo.jp",
"tottori.jp",
"toyama.jp",
"wakayama.jp",
"yamagata.jp",
"yamaguchi.jp",
"yamanashi.jp",
"栃木.jp",
"愛知.jp",
"愛媛.jp",
"兵庫.jp",
"熊本.jp",
"茨城.jp",
"北海道.jp",
"千葉.jp",
"和歌山.jp",
"長崎.jp",
"長野.jp",
"新潟.jp",
"青森.jp",
"静岡.jp",
"東京.jp",
"石川.jp",
"埼玉.jp",
"三重.jp",
"京都.jp",
"佐賀.jp",
"大分.jp",
"大阪.jp",
"奈良.jp",
"宮城.jp",
"宮崎.jp",
"富山.jp",
"山口.jp",
"山形.jp",
"山梨.jp",
"岩手.jp",
"岐阜.jp",
"岡山.jp",
"島根.jp",
"広島.jp",
"徳島.jp",
"沖縄.jp",
"滋賀.jp",
"神奈川.jp",
"福井.jp",
"福岡.jp",
"福島.jp",
"秋田.jp",
"群馬.jp",
"香川.jp",
"高知.jp",
"鳥取.jp",
"鹿児島.jp",
"*.kawasaki.jp",
"*.kitakyushu.jp",
"*.kobe.jp",
"*.nagoya.jp",
"*.sapporo.jp",
"*.sendai.jp",
"*.yokohama.jp",
"!city.kawasaki.jp",
"!city.kitakyushu.jp",
"!city.kobe.jp",
"!city.nagoya.jp",
"!city.sapporo.jp",
"!city.sendai.jp",
"!city.yokohama.jp",
"aisai.aichi.jp",
"ama.aichi.jp",
"anjo.aichi.jp",
"asuke.aichi.jp",
"chiryu.aichi.jp",
"chita.aichi.jp",
"fuso.aichi.jp",
"gamagori.aichi.jp",
"handa.aichi.jp",
"hazu.aichi.jp",
"hekinan.aichi.jp",
"higashiura.aichi.jp",
"ichinomiya.aichi.jp",
"inazawa.aichi.jp",
"inuyama.aichi.jp",
"isshiki.aichi.jp",
"iwakura.aichi.jp",
"kanie.aichi.jp",
"kariya.aichi.jp",
"kasugai.aichi.jp",
"kira.aichi.jp",
"kiyosu.aichi.jp",
"komaki.aichi.jp",
"konan.aichi.jp",
"kota.aichi.jp",
"mihama.aichi.jp",
"miyoshi.aichi.jp",
"nishio.aichi.jp",
"nisshin.aichi.jp",
"obu.aichi.jp",
"oguchi.aichi.jp",
"oharu.aichi.jp",
"okazaki.aichi.jp",
"owariasahi.aichi.jp",
"seto.aichi.jp",
"shikatsu.aichi.jp",
"shinshiro.aichi.jp",
"shitara.aichi.jp",
"tahara.aichi.jp",
"takahama.aichi.jp",
"tobishima.aichi.jp",
"toei.aichi.jp",
"togo.aichi.jp",
"tokai.aichi.jp",
"tokoname.aichi.jp",
"toyoake.aichi.jp",
"toyohashi.aichi.jp",
"toyokawa.aichi.jp",
"toyone.aichi.jp",
"toyota.aichi.jp",
"tsushima.aichi.jp",
"yatomi.aichi.jp",
"akita.akita.jp",
"daisen.akita.jp",
"fujisato.akita.jp",
"gojome.akita.jp",
"hachirogata.akita.jp",
"happou.akita.jp",
"higashinaruse.akita.jp",
"honjo.akita.jp",
"honjyo.akita.jp",
"ikawa.akita.jp",
"kamikoani.akita.jp",
"kamioka.akita.jp",
"katagami.akita.jp",
"kazuno.akita.jp",
"kitaakita.akita.jp",
"kosaka.akita.jp",
"kyowa.akita.jp",
"misato.akita.jp",
"mitane.akita.jp",
"moriyoshi.akita.jp",
"nikaho.akita.jp",
"noshiro.akita.jp",
"odate.akita.jp",
"oga.akita.jp",
"ogata.akita.jp",
"semboku.akita.jp",
"yokote.akita.jp",
"yurihonjo.akita.jp",
"aomori.aomori.jp",
"gonohe.aomori.jp",
"hachinohe.aomori.jp",
"hashikami.aomori.jp",
"hiranai.aomori.jp",
"hirosaki.aomori.jp",
"itayanagi.aomori.jp",
"kuroishi.aomori.jp",
"misawa.aomori.jp",
"mutsu.aomori.jp",
"nakadomari.aomori.jp",
"noheji.aomori.jp",
"oirase.aomori.jp",
"owani.aomori.jp",
"rokunohe.aomori.jp",
"sannohe.aomori.jp",
"shichinohe.aomori.jp",
"shingo.aomori.jp",
"takko.aomori.jp",
"towada.aomori.jp",
"tsugaru.aomori.jp",
"tsuruta.aomori.jp",
"abiko.chiba.jp",
"asahi.chiba.jp",
"chonan.chiba.jp",
"chosei.chiba.jp",
"choshi.chiba.jp",
"chuo.chiba.jp",
"funabashi.chiba.jp",
"futtsu.chiba.jp",
"hanamigawa.chiba.jp",
"ichihara.chiba.jp",
"ichikawa.chiba.jp",
"ichinomiya.chiba.jp",
"inzai.chiba.jp",
"isumi.chiba.jp",
"kamagaya.chiba.jp",
"kamogawa.chiba.jp",
"kashiwa.chiba.jp",
"katori.chiba.jp",
"katsuura.chiba.jp",
"kimitsu.chiba.jp",
"kisarazu.chiba.jp",
"kozaki.chiba.jp",
"kujukuri.chiba.jp",
"kyonan.chiba.jp",
"matsudo.chiba.jp",
"midori.chiba.jp",
"mihama.chiba.jp",
"minamiboso.chiba.jp",
"mobara.chiba.jp",
"mutsuzawa.chiba.jp",
"nagara.chiba.jp",
"nagareyama.chiba.jp",
"narashino.chiba.jp",
"narita.chiba.jp",
"noda.chiba.jp",
"oamishirasato.chiba.jp",
"omigawa.chiba.jp",
"onjuku.chiba.jp",
"otaki.chiba.jp",
"sakae.chiba.jp",
"sakura.chiba.jp",
"shimofusa.chiba.jp",
"shirako.chiba.jp",
"shiroi.chiba.jp",
"shisui.chiba.jp",
"sodegaura.chiba.jp",
"sosa.chiba.jp",
"tako.chiba.jp",
"tateyama.chiba.jp",
"togane.chiba.jp",
"tohnosho.chiba.jp",
"tomisato.chiba.jp",
"urayasu.chiba.jp",
"yachimata.chiba.jp",
"yachiyo.chiba.jp",
"yokaichiba.chiba.jp",
"yokoshibahikari.chiba.jp",
"yotsukaido.chiba.jp",
"ainan.ehime.jp",
"honai.ehime.jp",
"ikata.ehime.jp",
"imabari.ehime.jp",
"iyo.ehime.jp",
"kamijima.ehime.jp",
"kihoku.ehime.jp",
"kumakogen.ehime.jp",
"masaki.ehime.jp",
"matsuno.ehime.jp",
"matsuyama.ehime.jp",
"namikata.ehime.jp",
"niihama.ehime.jp",
"ozu.ehime.jp",
"saijo.ehime.jp",
"seiyo.ehime.jp",
"shikokuchuo.ehime.jp",
"tobe.ehime.jp",
"toon.ehime.jp",
"uchiko.ehime.jp",
"uwajima.ehime.jp",
"yawatahama.ehime.jp",
"echizen.fukui.jp",
"eiheiji.fukui.jp",
"fukui.fukui.jp",
"ikeda.fukui.jp",
"katsuyama.fukui.jp",
"mihama.fukui.jp",
"minamiechizen.fukui.jp",
"obama.fukui.jp",
"ohi.fukui.jp",
"ono.fukui.jp",
"sabae.fukui.jp",
"sakai.fukui.jp",
"takahama.fukui.jp",
"tsuruga.fukui.jp",
"wakasa.fukui.jp",
"ashiya.fukuoka.jp",
"buzen.fukuoka.jp",
"chikugo.fukuoka.jp",
"chikuho.fukuoka.jp",
"chikujo.fukuoka.jp",
"chikushino.fukuoka.jp",
"chikuzen.fukuoka.jp",
"chuo.fukuoka.jp",
"dazaifu.fukuoka.jp",
"fukuchi.fukuoka.jp",
"hakata.fukuoka.jp",
"higashi.fukuoka.jp",
"hirokawa.fukuoka.jp",
"hisayama.fukuoka.jp",
"iizuka.fukuoka.jp",
"inatsuki.fukuoka.jp",
"kaho.fukuoka.jp",
"kasuga.fukuoka.jp",
"kasuya.fukuoka.jp",
"kawara.fukuoka.jp",
"keisen.fukuoka.jp",
"koga.fukuoka.jp",
"kurate.fukuoka.jp",
"kurogi.fukuoka.jp",
"kurume.fukuoka.jp",
"minami.fukuoka.jp",
"miyako.fukuoka.jp",
"miyama.fukuoka.jp",
"miyawaka.fukuoka.jp",
"mizumaki.fukuoka.jp",
"munakata.fukuoka.jp",
"nakagawa.fukuoka.jp",
"nakama.fukuoka.jp",
"nishi.fukuoka.jp",
"nogata.fukuoka.jp",
"ogori.fukuoka.jp",
"okagaki.fukuoka.jp",
"okawa.fukuoka.jp",
"oki.fukuoka.jp",
"omuta.fukuoka.jp",
"onga.fukuoka.jp",
"onojo.fukuoka.jp",
"oto.fukuoka.jp",
"saigawa.fukuoka.jp",
"sasaguri.fukuoka.jp",
"shingu.fukuoka.jp",
"shinyoshitomi.fukuoka.jp",
"shonai.fukuoka.jp",
"soeda.fukuoka.jp",
"sue.fukuoka.jp",
"tachiarai.fukuoka.jp",
"tagawa.fukuoka.jp",
"takata.fukuoka.jp",
"toho.fukuoka.jp",
"toyotsu.fukuoka.jp",
"tsuiki.fukuoka.jp",
"ukiha.fukuoka.jp",
"umi.fukuoka.jp",
"usui.fukuoka.jp",
"yamada.fukuoka.jp",
"yame.fukuoka.jp",
"yanagawa.fukuoka.jp",
"yukuhashi.fukuoka.jp",
"aizubange.fukushima.jp",
"aizumisato.fukushima.jp",
"aizuwakamatsu.fukushima.jp",
"asakawa.fukushima.jp",
"bandai.fukushima.jp",
"date.fukushima.jp",
"fukushima.fukushima.jp",
"furudono.fukushima.jp",
"futaba.fukushima.jp",
"hanawa.fukushima.jp",
"higashi.fukushima.jp",
"hirata.fukushima.jp",
"hirono.fukushima.jp",
"iitate.fukushima.jp",
"inawashiro.fukushima.jp",
"ishikawa.fukushima.jp",
"iwaki.fukushima.jp",
"izumizaki.fukushima.jp",
"kagamiishi.fukushima.jp",
"kaneyama.fukushima.jp",
"kawamata.fukushima.jp",
"kitakata.fukushima.jp",
"kitashiobara.fukushima.jp",
"koori.fukushima.jp",
"koriyama.fukushima.jp",
"kunimi.fukushima.jp",
"miharu.fukushima.jp",
"mishima.fukushima.jp",
"namie.fukushima.jp",
"nango.fukushima.jp",
"nishiaizu.fukushima.jp",
"nishigo.fukushima.jp",
"okuma.fukushima.jp",
"omotego.fukushima.jp",
"ono.fukushima.jp",
"otama.fukushima.jp",
"samegawa.fukushima.jp",
"shimogo.fukushima.jp",
"shirakawa.fukushima.jp",
"showa.fukushima.jp",
"soma.fukushima.jp",
"sukagawa.fukushima.jp",
"taishin.fukushima.jp",
"tamakawa.fukushima.jp",
"tanagura.fukushima.jp",
"tenei.fukushima.jp",
"yabuki.fukushima.jp",
"yamato.fukushima.jp",
"yamatsuri.fukushima.jp",
"yanaizu.fukushima.jp",
"yugawa.fukushima.jp",
"anpachi.gifu.jp",
"ena.gifu.jp",
"gifu.gifu.jp",
"ginan.gifu.jp",
"godo.gifu.jp",
"gujo.gifu.jp",
"hashima.gifu.jp",
"hichiso.gifu.jp",
"hida.gifu.jp",
"higashishirakawa.gifu.jp",
"ibigawa.gifu.jp",
"ikeda.gifu.jp",
"kakamigahara.gifu.jp",
"kani.gifu.jp",
"kasahara.gifu.jp",
"kasamatsu.gifu.jp",
"kawaue.gifu.jp",
"kitagata.gifu.jp",
"mino.gifu.jp",
"minokamo.gifu.jp",
"mitake.gifu.jp",
"mizunami.gifu.jp",
"motosu.gifu.jp",
"nakatsugawa.gifu.jp",
"ogaki.gifu.jp",
"sakahogi.gifu.jp",
"seki.gifu.jp",
"sekigahara.gifu.jp",
"shirakawa.gifu.jp",
"tajimi.gifu.jp",
"takayama.gifu.jp",
"tarui.gifu.jp",
"toki.gifu.jp",
"tomika.gifu.jp",
"wanouchi.gifu.jp",
"yamagata.gifu.jp",
"yaotsu.gifu.jp",
"yoro.gifu.jp",
"annaka.gunma.jp",
"chiyoda.gunma.jp",
"fujioka.gunma.jp",
"higashiagatsuma.gunma.jp",
"isesaki.gunma.jp",
"itakura.gunma.jp",
"kanna.gunma.jp",
"kanra.gunma.jp",
"katashina.gunma.jp",
"kawaba.gunma.jp",
"kiryu.gunma.jp",
"kusatsu.gunma.jp",
"maebashi.gunma.jp",
"meiwa.gunma.jp",
"midori.gunma.jp",
"minakami.gunma.jp",
"naganohara.gunma.jp",
"nakanojo.gunma.jp",
"nanmoku.gunma.jp",
"numata.gunma.jp",
"oizumi.gunma.jp",
"ora.gunma.jp",
"ota.gunma.jp",
"shibukawa.gunma.jp",
"shimonita.gunma.jp",
"shinto.gunma.jp",
"showa.gunma.jp",
"takasaki.gunma.jp",
"takayama.gunma.jp",
"tamamura.gunma.jp",
"tatebayashi.gunma.jp",
"tomioka.gunma.jp",
"tsukiyono.gunma.jp",
"tsumagoi.gunma.jp",
"ueno.gunma.jp",
"yoshioka.gunma.jp",
"asaminami.hiroshima.jp",
"daiwa.hiroshima.jp",
"etajima.hiroshima.jp",
"fuchu.hiroshima.jp",
"fukuyama.hiroshima.jp",
"hatsukaichi.hiroshima.jp",
"higashihiroshima.hiroshima.jp",
"hongo.hiroshima.jp",
"jinsekikogen.hiroshima.jp",
"kaita.hiroshima.jp",
"kui.hiroshima.jp",
"kumano.hiroshima.jp",
"kure.hiroshima.jp",
"mihara.hiroshima.jp",
"miyoshi.hiroshima.jp",
"naka.hiroshima.jp",
"onomichi.hiroshima.jp",
"osakikamijima.hiroshima.jp",
"otake.hiroshima.jp",
"saka.hiroshima.jp",
"sera.hiroshima.jp",
"seranishi.hiroshima.jp",
"shinichi.hiroshima.jp",
"shobara.hiroshima.jp",
"takehara.hiroshima.jp",
"abashiri.hokkaido.jp",
"abira.hokkaido.jp",
"aibetsu.hokkaido.jp",
"akabira.hokkaido.jp",
"akkeshi.hokkaido.jp",
"asahikawa.hokkaido.jp",
"ashibetsu.hokkaido.jp",
"ashoro.hokkaido.jp",
"assabu.hokkaido.jp",
"atsuma.hokkaido.jp",
"bibai.hokkaido.jp",
"biei.hokkaido.jp",
"bifuka.hokkaido.jp",
"bihoro.hokkaido.jp",
"biratori.hokkaido.jp",
"chippubetsu.hokkaido.jp",
"chitose.hokkaido.jp",
"date.hokkaido.jp",
"ebetsu.hokkaido.jp",
"embetsu.hokkaido.jp",
"eniwa.hokkaido.jp",
"erimo.hokkaido.jp",
"esan.hokkaido.jp",
"esashi.hokkaido.jp",
"fukagawa.hokkaido.jp",
"fukushima.hokkaido.jp",
"furano.hokkaido.jp",
"furubira.hokkaido.jp",
"haboro.hokkaido.jp",
"hakodate.hokkaido.jp",
"hamatonbetsu.hokkaido.jp",
"hidaka.hokkaido.jp",
"higashikagura.hokkaido.jp",
"higashikawa.hokkaido.jp",
"hiroo.hokkaido.jp",
"hokuryu.hokkaido.jp",
"hokuto.hokkaido.jp",
"honbetsu.hokkaido.jp",
"horokanai.hokkaido.jp",
"horonobe.hokkaido.jp",
"ikeda.hokkaido.jp",
"imakane.hokkaido.jp",
"ishikari.hokkaido.jp",
"iwamizawa.hokkaido.jp",
"iwanai.hokkaido.jp",
"kamifurano.hokkaido.jp",
"kamikawa.hokkaido.jp",
"kamishihoro.hokkaido.jp",
"kamisunagawa.hokkaido.jp",
"kamoenai.hokkaido.jp",
"kayabe.hokkaido.jp",
"kembuchi.hokkaido.jp",
"kikonai.hokkaido.jp",
"kimobetsu.hokkaido.jp",
"kitahiroshima.hokkaido.jp",
"kitami.hokkaido.jp",
"kiyosato.hokkaido.jp",
"koshimizu.hokkaido.jp",
"kunneppu.hokkaido.jp",
"kuriyama.hokkaido.jp",
"kuromatsunai.hokkaido.jp",
"kushiro.hokkaido.jp",
"kutchan.hokkaido.jp",
"kyowa.hokkaido.jp",
"mashike.hokkaido.jp",
"matsumae.hokkaido.jp",
"mikasa.hokkaido.jp",
"minamifurano.hokkaido.jp",
"mombetsu.hokkaido.jp",
"moseushi.hokkaido.jp",
"mukawa.hokkaido.jp",
"muroran.hokkaido.jp",
"naie.hokkaido.jp",
"nakagawa.hokkaido.jp",
"nakasatsunai.hokkaido.jp",
"nakatombetsu.hokkaido.jp",
"nanae.hokkaido.jp",
"nanporo.hokkaido.jp",
"nayoro.hokkaido.jp",
"nemuro.hokkaido.jp",
"niikappu.hokkaido.jp",
"niki.hokkaido.jp",
"nishiokoppe.hokkaido.jp",
"noboribetsu.hokkaido.jp",
"numata.hokkaido.jp",
"obihiro.hokkaido.jp",
"obira.hokkaido.jp",
"oketo.hokkaido.jp",
"okoppe.hokkaido.jp",
"otaru.hokkaido.jp",
"otobe.hokkaido.jp",
"otofuke.hokkaido.jp",
"otoineppu.hokkaido.jp",
"oumu.hokkaido.jp",
"ozora.hokkaido.jp",
"pippu.hokkaido.jp",
"rankoshi.hokkaido.jp",
"rebun.hokkaido.jp",
"rikubetsu.hokkaido.jp",
"rishiri.hokkaido.jp",
"rishirifuji.hokkaido.jp",
"saroma.hokkaido.jp",
"sarufutsu.hokkaido.jp",
"shakotan.hokkaido.jp",
"shari.hokkaido.jp",
"shibecha.hokkaido.jp",
"shibetsu.hokkaido.jp",
"shikabe.hokkaido.jp",
"shikaoi.hokkaido.jp",
"shimamaki.hokkaido.jp",
"shimizu.hokkaido.jp",
"shimokawa.hokkaido.jp",
"shinshinotsu.hokkaido.jp",
"shintoku.hokkaido.jp",
"shiranuka.hokkaido.jp",
"shiraoi.hokkaido.jp",
"shiriuchi.hokkaido.jp",
"sobetsu.hokkaido.jp",
"sunagawa.hokkaido.jp",
"taiki.hokkaido.jp",
"takasu.hokkaido.jp",
"takikawa.hokkaido.jp",
"takinoue.hokkaido.jp",
"teshikaga.hokkaido.jp",
"tobetsu.hokkaido.jp",
"tohma.hokkaido.jp",
"tomakomai.hokkaido.jp",
"tomari.hokkaido.jp",
"toya.hokkaido.jp",
"toyako.hokkaido.jp",
"toyotomi.hokkaido.jp",
"toyoura.hokkaido.jp",
"tsubetsu.hokkaido.jp",
"tsukigata.hokkaido.jp",
"urakawa.hokkaido.jp",
"urausu.hokkaido.jp",
"uryu.hokkaido.jp",
"utashinai.hokkaido.jp",
"wakkanai.hokkaido.jp",
"wassamu.hokkaido.jp",
"yakumo.hokkaido.jp",
"yoichi.hokkaido.jp",
"aioi.hyogo.jp",
"akashi.hyogo.jp",
"ako.hyogo.jp",
"amagasaki.hyogo.jp",
"aogaki.hyogo.jp",
"asago.hyogo.jp",
"ashiya.hyogo.jp",
"awaji.hyogo.jp",
"fukusaki.hyogo.jp",
"goshiki.hyogo.jp",
"harima.hyogo.jp",
"himeji.hyogo.jp",
"ichikawa.hyogo.jp",
"inagawa.hyogo.jp",
"itami.hyogo.jp",
"kakogawa.hyogo.jp",
"kamigori.hyogo.jp",
"kamikawa.hyogo.jp",
"kasai.hyogo.jp",
"kasuga.hyogo.jp",
"kawanishi.hyogo.jp",
"miki.hyogo.jp",
"minamiawaji.hyogo.jp",
"nishinomiya.hyogo.jp",
"nishiwaki.hyogo.jp",
"ono.hyogo.jp",
"sanda.hyogo.jp",
"sannan.hyogo.jp",
"sasayama.hyogo.jp",
"sayo.hyogo.jp",
"shingu.hyogo.jp",
"shinonsen.hyogo.jp",
"shiso.hyogo.jp",
"sumoto.hyogo.jp",
"taishi.hyogo.jp",
"taka.hyogo.jp",
"takarazuka.hyogo.jp",
"takasago.hyogo.jp",
"takino.hyogo.jp",
"tamba.hyogo.jp",
"tatsuno.hyogo.jp",
"toyooka.hyogo.jp",
"yabu.hyogo.jp",
"yashiro.hyogo.jp",
"yoka.hyogo.jp",
"yokawa.hyogo.jp",
"ami.ibaraki.jp",
"asahi.ibaraki.jp",
"bando.ibaraki.jp",
"chikusei.ibaraki.jp",
"daigo.ibaraki.jp",
"fujishiro.ibaraki.jp",
"hitachi.ibaraki.jp",
"hitachinaka.ibaraki.jp",
"hitachiomiya.ibaraki.jp",
"hitachiota.ibaraki.jp",
"ibaraki.ibaraki.jp",
"ina.ibaraki.jp",
"inashiki.ibaraki.jp",
"itako.ibaraki.jp",
"iwama.ibaraki.jp",
"joso.ibaraki.jp",
"kamisu.ibaraki.jp",
"kasama.ibaraki.jp",
"kashima.ibaraki.jp",
"kasumigaura.ibaraki.jp",
"koga.ibaraki.jp",
"miho.ibaraki.jp",
"mito.ibaraki.jp",
"moriya.ibaraki.jp",
"naka.ibaraki.jp",
"namegata.ibaraki.jp",
"oarai.ibaraki.jp",
"ogawa.ibaraki.jp",
"omitama.ibaraki.jp",
"ryugasaki.ibaraki.jp",
"sakai.ibaraki.jp",
"sakuragawa.ibaraki.jp",
"shimodate.ibaraki.jp",
"shimotsuma.ibaraki.jp",
"shirosato.ibaraki.jp",
"sowa.ibaraki.jp",
"suifu.ibaraki.jp",
"takahagi.ibaraki.jp",
"tamatsukuri.ibaraki.jp",
"tokai.ibaraki.jp",
"tomobe.ibaraki.jp",
"tone.ibaraki.jp",
"toride.ibaraki.jp",
"tsuchiura.ibaraki.jp",
"tsukuba.ibaraki.jp",
"uchihara.ibaraki.jp",
"ushiku.ibaraki.jp",
"yachiyo.ibaraki.jp",
"yamagata.ibaraki.jp",
"yawara.ibaraki.jp",
"yuki.ibaraki.jp",
"anamizu.ishikawa.jp",
"hakui.ishikawa.jp",
"hakusan.ishikawa.jp",
"kaga.ishikawa.jp",
"kahoku.ishikawa.jp",
"kanazawa.ishikawa.jp",
"kawakita.ishikawa.jp",
"komatsu.ishikawa.jp",
"nakanoto.ishikawa.jp",
"nanao.ishikawa.jp",
"nomi.ishikawa.jp",
"nonoichi.ishikawa.jp",
"noto.ishikawa.jp",
"shika.ishikawa.jp",
"suzu.ishikawa.jp",
"tsubata.ishikawa.jp",
"tsurugi.ishikawa.jp",
"uchinada.ishikawa.jp",
"wajima.ishikawa.jp",
"fudai.iwate.jp",
"fujisawa.iwate.jp",
"hanamaki.iwate.jp",
"hiraizumi.iwate.jp",
"hirono.iwate.jp",
"ichinohe.iwate.jp",
"ichinoseki.iwate.jp",
"iwaizumi.iwate.jp",
"iwate.iwate.jp",
"joboji.iwate.jp",
"kamaishi.iwate.jp",
"kanegasaki.iwate.jp",
"karumai.iwate.jp",
"kawai.iwate.jp",
"kitakami.iwate.jp",
"kuji.iwate.jp",
"kunohe.iwate.jp",
"kuzumaki.iwate.jp",
"miyako.iwate.jp",
"mizusawa.iwate.jp",
"morioka.iwate.jp",
"ninohe.iwate.jp",
"noda.iwate.jp",
"ofunato.iwate.jp",
"oshu.iwate.jp",
"otsuchi.iwate.jp",
"rikuzentakata.iwate.jp",
"shiwa.iwate.jp",
"shizukuishi.iwate.jp",
"sumita.iwate.jp",
"tanohata.iwate.jp",
"tono.iwate.jp",
"yahaba.iwate.jp",
"yamada.iwate.jp",
"ayagawa.kagawa.jp",
"higashikagawa.kagawa.jp",
"kanonji.kagawa.jp",
"kotohira.kagawa.jp",
"manno.kagawa.jp",
"marugame.kagawa.jp",
"mitoyo.kagawa.jp",
"naoshima.kagawa.jp",
"sanuki.kagawa.jp",
"tadotsu.kagawa.jp",
"takamatsu.kagawa.jp",
"tonosho.kagawa.jp",
"uchinomi.kagawa.jp",
"utazu.kagawa.jp",
"zentsuji.kagawa.jp",
"akune.kagoshima.jp",
"amami.kagoshima.jp",
"hioki.kagoshima.jp",
"isa.kagoshima.jp",
"isen.kagoshima.jp",
"izumi.kagoshima.jp",
"kagoshima.kagoshima.jp",
"kanoya.kagoshima.jp",
"kawanabe.kagoshima.jp",
"kinko.kagoshima.jp",
"kouyama.kagoshima.jp",
"makurazaki.kagoshima.jp",
"matsumoto.kagoshima.jp",
"minamitane.kagoshima.jp",
"nakatane.kagoshima.jp",
"nishinoomote.kagoshima.jp",
"satsumasendai.kagoshima.jp",
"soo.kagoshima.jp",
"tarumizu.kagoshima.jp",
"yusui.kagoshima.jp",
"aikawa.kanagawa.jp",
"atsugi.kanagawa.jp",
"ayase.kanagawa.jp",
"chigasaki.kanagawa.jp",
"ebina.kanagawa.jp",
"fujisawa.kanagawa.jp",
"hadano.kanagawa.jp",
"hakone.kanagawa.jp",
"hiratsuka.kanagawa.jp",
"isehara.kanagawa.jp",
"kaisei.kanagawa.jp",
"kamakura.kanagawa.jp",
"kiyokawa.kanagawa.jp",
"matsuda.kanagawa.jp",
"minamiashigara.kanagawa.jp",
"miura.kanagawa.jp",
"nakai.kanagawa.jp",
"ninomiya.kanagawa.jp",
"odawara.kanagawa.jp",
"oi.kanagawa.jp",
"oiso.kanagawa.jp",
"sagamihara.kanagawa.jp",
"samukawa.kanagawa.jp",
"tsukui.kanagawa.jp",
"yamakita.kanagawa.jp",
"yamato.kanagawa.jp",
"yokosuka.kanagawa.jp",
"yugawara.kanagawa.jp",
"zama.kanagawa.jp",
"zushi.kanagawa.jp",
"aki.kochi.jp",
"geisei.kochi.jp",
"hidaka.kochi.jp",
"higashitsuno.kochi.jp",
"ino.kochi.jp",
"kagami.kochi.jp",
"kami.kochi.jp",
"kitagawa.kochi.jp",
"kochi.kochi.jp",
"mihara.kochi.jp",
"motoyama.kochi.jp",
"muroto.kochi.jp",
"nahari.kochi.jp",
"nakamura.kochi.jp",
"nankoku.kochi.jp",
"nishitosa.kochi.jp",
"niyodogawa.kochi.jp",
"ochi.kochi.jp",
"okawa.kochi.jp",
"otoyo.kochi.jp",
"otsuki.kochi.jp",
"sakawa.kochi.jp",
"sukumo.kochi.jp",
"susaki.kochi.jp",
"tosa.kochi.jp",
"tosashimizu.kochi.jp",
"toyo.kochi.jp",
"tsuno.kochi.jp",
"umaji.kochi.jp",
"yasuda.kochi.jp",
"yusuhara.kochi.jp",
"amakusa.kumamoto.jp",
"arao.kumamoto.jp",
"aso.kumamoto.jp",
"choyo.kumamoto.jp",
"gyokuto.kumamoto.jp",
"kamiamakusa.kumamoto.jp",
"kikuchi.kumamoto.jp",
"kumamoto.kumamoto.jp",
"mashiki.kumamoto.jp",
"mifune.kumamoto.jp",
"minamata.kumamoto.jp",
"minamioguni.kumamoto.jp",
"nagasu.kumamoto.jp",
"nishihara.kumamoto.jp",
"oguni.kumamoto.jp",
"ozu.kumamoto.jp",
"sumoto.kumamoto.jp",
"takamori.kumamoto.jp",
"uki.kumamoto.jp",
"uto.kumamoto.jp",
"yamaga.kumamoto.jp",
"yamato.kumamoto.jp",
"yatsushiro.kumamoto.jp",
"ayabe.kyoto.jp",
"fukuchiyama.kyoto.jp",
"higashiyama.kyoto.jp",
"ide.kyoto.jp",
"ine.kyoto.jp",
"joyo.kyoto.jp",
"kameoka.kyoto.jp",
"kamo.kyoto.jp",
"kita.kyoto.jp",
"kizu.kyoto.jp",
"kumiyama.kyoto.jp",
"kyotamba.kyoto.jp",
"kyotanabe.kyoto.jp",
"kyotango.kyoto.jp",
"maizuru.kyoto.jp",
"minami.kyoto.jp",
"minamiyamashiro.kyoto.jp",
"miyazu.kyoto.jp",
"muko.kyoto.jp",
"nagaokakyo.kyoto.jp",
"nakagyo.kyoto.jp",
"nantan.kyoto.jp",
"oyamazaki.kyoto.jp",
"sakyo.kyoto.jp",
"seika.kyoto.jp",
"tanabe.kyoto.jp",
"uji.kyoto.jp",
"ujitawara.kyoto.jp",
"wazuka.kyoto.jp",
"yamashina.kyoto.jp",
"yawata.kyoto.jp",
"asahi.mie.jp",
"inabe.mie.jp",
"ise.mie.jp",
"kameyama.mie.jp",
"kawagoe.mie.jp",
"kiho.mie.jp",
"kisosaki.mie.jp",
"kiwa.mie.jp",
"komono.mie.jp",
"kumano.mie.jp",
"kuwana.mie.jp",
"matsusaka.mie.jp",
"meiwa.mie.jp",
"mihama.mie.jp",
"minamiise.mie.jp",
"misugi.mie.jp",
"miyama.mie.jp",
"nabari.mie.jp",
"shima.mie.jp",
"suzuka.mie.jp",
"tado.mie.jp",
"taiki.mie.jp",
"taki.mie.jp",
"tamaki.mie.jp",
"toba.mie.jp",
"tsu.mie.jp",
"udono.mie.jp",
"ureshino.mie.jp",
"watarai.mie.jp",
"yokkaichi.mie.jp",
"furukawa.miyagi.jp",
"higashimatsushima.miyagi.jp",
"ishinomaki.miyagi.jp",
"iwanuma.miyagi.jp",
"kakuda.miyagi.jp",
"kami.miyagi.jp",
"kawasaki.miyagi.jp",
"marumori.miyagi.jp",
"matsushima.miyagi.jp",
"minamisanriku.miyagi.jp",
"misato.miyagi.jp",
"murata.miyagi.jp",
"natori.miyagi.jp",
"ogawara.miyagi.jp",
"ohira.miyagi.jp",
"onagawa.miyagi.jp",
"osaki.miyagi.jp",
"rifu.miyagi.jp",
"semine.miyagi.jp",
"shibata.miyagi.jp",
"shichikashuku.miyagi.jp",
"shikama.miyagi.jp",
"shiogama.miyagi.jp",
"shiroishi.miyagi.jp",
"tagajo.miyagi.jp",
"taiwa.miyagi.jp",
"tome.miyagi.jp",
"tomiya.miyagi.jp",
"wakuya.miyagi.jp",
"watari.miyagi.jp",
"yamamoto.miyagi.jp",
"zao.miyagi.jp",
"aya.miyazaki.jp",
"ebino.miyazaki.jp",
"gokase.miyazaki.jp",
"hyuga.miyazaki.jp",
"kadogawa.miyazaki.jp",
"kawaminami.miyazaki.jp",
"kijo.miyazaki.jp",
"kitagawa.miyazaki.jp",
"kitakata.miyazaki.jp",
"kitaura.miyazaki.jp",
"kobayashi.miyazaki.jp",
"kunitomi.miyazaki.jp",
"kushima.miyazaki.jp",
"mimata.miyazaki.jp",
"miyakonojo.miyazaki.jp",
"miyazaki.miyazaki.jp",
"morotsuka.miyazaki.jp",
"nichinan.miyazaki.jp",
"nishimera.miyazaki.jp",
"nobeoka.miyazaki.jp",
"saito.miyazaki.jp",
"shiiba.miyazaki.jp",
"shintomi.miyazaki.jp",
"takaharu.miyazaki.jp",
"takanabe.miyazaki.jp",
"takazaki.miyazaki.jp",
"tsuno.miyazaki.jp",
"achi.nagano.jp",
"agematsu.nagano.jp",
"anan.nagano.jp",
"aoki.nagano.jp",
"asahi.nagano.jp",
"azumino.nagano.jp",
"chikuhoku.nagano.jp",
"chikuma.nagano.jp",
"chino.nagano.jp",
"fujimi.nagano.jp",
"hakuba.nagano.jp",
"hara.nagano.jp",
"hiraya.nagano.jp",
"iida.nagano.jp",
"iijima.nagano.jp",
"iiyama.nagano.jp",
"iizuna.nagano.jp",
"ikeda.nagano.jp",
"ikusaka.nagano.jp",
"ina.nagano.jp",
"karuizawa.nagano.jp",
"kawakami.nagano.jp",
"kiso.nagano.jp",
"kisofukushima.nagano.jp",
"kitaaiki.nagano.jp",
"komagane.nagano.jp",
"komoro.nagano.jp",
"matsukawa.nagano.jp",
"matsumoto.nagano.jp",
"miasa.nagano.jp",
"minamiaiki.nagano.jp",
"minamimaki.nagano.jp",
"minamiminowa.nagano.jp",
"minowa.nagano.jp",
"miyada.nagano.jp",
"miyota.nagano.jp",
"mochizuki.nagano.jp",
"nagano.nagano.jp",
"nagawa.nagano.jp",
"nagiso.nagano.jp",
"nakagawa.nagano.jp",
"nakano.nagano.jp",
"nozawaonsen.nagano.jp",
"obuse.nagano.jp",
"ogawa.nagano.jp",
"okaya.nagano.jp",
"omachi.nagano.jp",
"omi.nagano.jp",
"ookuwa.nagano.jp",
"ooshika.nagano.jp",
"otaki.nagano.jp",
"otari.nagano.jp",
"sakae.nagano.jp",
"sakaki.nagano.jp",
"saku.nagano.jp",
"sakuho.nagano.jp",
"shimosuwa.nagano.jp",
"shinanomachi.nagano.jp",
"shiojiri.nagano.jp",
"suwa.nagano.jp",
"suzaka.nagano.jp",
"takagi.nagano.jp",
"takamori.nagano.jp",
"takayama.nagano.jp",
"tateshina.nagano.jp",
"tatsuno.nagano.jp",
"togakushi.nagano.jp",
"togura.nagano.jp",
"tomi.nagano.jp",
"ueda.nagano.jp",
"wada.nagano.jp",
"yamagata.nagano.jp",
"yamanouchi.nagano.jp",
"yasaka.nagano.jp",
"yasuoka.nagano.jp",
"chijiwa.nagasaki.jp",
"futsu.nagasaki.jp",
"goto.nagasaki.jp",
"hasami.nagasaki.jp",
"hirado.nagasaki.jp",
"iki.nagasaki.jp",
"isahaya.nagasaki.jp",
"kawatana.nagasaki.jp",
"kuchinotsu.nagasaki.jp",
"matsuura.nagasaki.jp",
"nagasaki.nagasaki.jp",
"obama.nagasaki.jp",
"omura.nagasaki.jp",
"oseto.nagasaki.jp",
"saikai.nagasaki.jp",
"sasebo.nagasaki.jp",
"seihi.nagasaki.jp",
"shimabara.nagasaki.jp",
"shinkamigoto.nagasaki.jp",
"togitsu.nagasaki.jp",
"tsushima.nagasaki.jp",
"unzen.nagasaki.jp",
"ando.nara.jp",
"gose.nara.jp",
"heguri.nara.jp",
"higashiyoshino.nara.jp",
"ikaruga.nara.jp",
"ikoma.nara.jp",
"kamikitayama.nara.jp",
"kanmaki.nara.jp",
"kashiba.nara.jp",
"kashihara.nara.jp",
"katsuragi.nara.jp",
"kawai.nara.jp",
"kawakami.nara.jp",
"kawanishi.nara.jp",
"koryo.nara.jp",
"kurotaki.nara.jp",
"mitsue.nara.jp",
"miyake.nara.jp",
"nara.nara.jp",
"nosegawa.nara.jp",
"oji.nara.jp",
"ouda.nara.jp",
"oyodo.nara.jp",
"sakurai.nara.jp",
"sango.nara.jp",
"shimoichi.nara.jp",
"shimokitayama.nara.jp",
"shinjo.nara.jp",
"soni.nara.jp",
"takatori.nara.jp",
"tawaramoto.nara.jp",
"tenkawa.nara.jp",
"tenri.nara.jp",
"uda.nara.jp",
"yamatokoriyama.nara.jp",
"yamatotakada.nara.jp",
"yamazoe.nara.jp",
"yoshino.nara.jp",
"aga.niigata.jp",
"agano.niigata.jp",
"gosen.niigata.jp",
"itoigawa.niigata.jp",
"izumozaki.niigata.jp",
"joetsu.niigata.jp",
"kamo.niigata.jp",
"kariwa.niigata.jp",
"kashiwazaki.niigata.jp",
"minamiuonuma.niigata.jp",
"mitsuke.niigata.jp",
"muika.niigata.jp",
"murakami.niigata.jp",
"myoko.niigata.jp",
"nagaoka.niigata.jp",
"niigata.niigata.jp",
"ojiya.niigata.jp",
"omi.niigata.jp",
"sado.niigata.jp",
"sanjo.niigata.jp",
"seiro.niigata.jp",
"seirou.niigata.jp",
"sekikawa.niigata.jp",
"shibata.niigata.jp",
"tagami.niigata.jp",
"tainai.niigata.jp",
"tochio.niigata.jp",
"tokamachi.niigata.jp",
"tsubame.niigata.jp",
"tsunan.niigata.jp",
"uonuma.niigata.jp",
"yahiko.niigata.jp",
"yoita.niigata.jp",
"yuzawa.niigata.jp",
"beppu.oita.jp",
"bungoono.oita.jp",
"bungotakada.oita.jp",
"hasama.oita.jp",
"hiji.oita.jp",
"himeshima.oita.jp",
"hita.oita.jp",
"kamitsue.oita.jp",
"kokonoe.oita.jp",
"kuju.oita.jp",
"kunisaki.oita.jp",
"kusu.oita.jp",
"oita.oita.jp",
"saiki.oita.jp",
"taketa.oita.jp",
"tsukumi.oita.jp",
"usa.oita.jp",
"usuki.oita.jp",
"yufu.oita.jp",
"akaiwa.okayama.jp",
"asakuchi.okayama.jp",
"bizen.okayama.jp",
"hayashima.okayama.jp",
"ibara.okayama.jp",
"kagamino.okayama.jp",
"kasaoka.okayama.jp",
"kibichuo.okayama.jp",
"kumenan.okayama.jp",
"kurashiki.okayama.jp",
"maniwa.okayama.jp",
"misaki.okayama.jp",
"nagi.okayama.jp",
"niimi.okayama.jp",
"nishiawakura.okayama.jp",
"okayama.okayama.jp",
"satosho.okayama.jp",
"setouchi.okayama.jp",
"shinjo.okayama.jp",
"shoo.okayama.jp",
"soja.okayama.jp",
"takahashi.okayama.jp",
"tamano.okayama.jp",
"tsuyama.okayama.jp",
"wake.okayama.jp",
"yakage.okayama.jp",
"aguni.okinawa.jp",
"ginowan.okinawa.jp",
"ginoza.okinawa.jp",
"gushikami.okinawa.jp",
"haebaru.okinawa.jp",
"higashi.okinawa.jp",
"hirara.okinawa.jp",
"iheya.okinawa.jp",
"ishigaki.okinawa.jp",
"ishikawa.okinawa.jp",
"itoman.okinawa.jp",
"izena.okinawa.jp",
"kadena.okinawa.jp",
"kin.okinawa.jp",
"kitadaito.okinawa.jp",
"kitanakagusuku.okinawa.jp",
"kumejima.okinawa.jp",
"kunigami.okinawa.jp",
"minamidaito.okinawa.jp",
"motobu.okinawa.jp",
"nago.okinawa.jp",
"naha.okinawa.jp",
"nakagusuku.okinawa.jp",
"nakijin.okinawa.jp",
"nanjo.okinawa.jp",
"nishihara.okinawa.jp",
"ogimi.okinawa.jp",
"okinawa.okinawa.jp",
"onna.okinawa.jp",
"shimoji.okinawa.jp",
"taketomi.okinawa.jp",
"tarama.okinawa.jp",
"tokashiki.okinawa.jp",
"tomigusuku.okinawa.jp",
"tonaki.okinawa.jp",
"urasoe.okinawa.jp",
"uruma.okinawa.jp",
"yaese.okinawa.jp",
"yomitan.okinawa.jp",
"yonabaru.okinawa.jp",
"yonaguni.okinawa.jp",
"zamami.okinawa.jp",
"abeno.osaka.jp",
"chihayaakasaka.osaka.jp",
"chuo.osaka.jp",
"daito.osaka.jp",
"fujiidera.osaka.jp",
"habikino.osaka.jp",
"hannan.osaka.jp",
"higashiosaka.osaka.jp",
"higashisumiyoshi.osaka.jp",
"higashiyodogawa.osaka.jp",
"hirakata.osaka.jp",
"ibaraki.osaka.jp",
"ikeda.osaka.jp",
"izumi.osaka.jp",
"izumiotsu.osaka.jp",
"izumisano.osaka.jp",
"kadoma.osaka.jp",
"kaizuka.osaka.jp",
"kanan.osaka.jp",
"kashiwara.osaka.jp",
"katano.osaka.jp",
"kawachinagano.osaka.jp",
"kishiwada.osaka.jp",
"kita.osaka.jp",
"kumatori.osaka.jp",
"matsubara.osaka.jp",
"minato.osaka.jp",
"minoh.osaka.jp",
"misaki.osaka.jp",
"moriguchi.osaka.jp",
"neyagawa.osaka.jp",
"nishi.osaka.jp",
"nose.osaka.jp",
"osakasayama.osaka.jp",
"sakai.osaka.jp",
"sayama.osaka.jp",
"sennan.osaka.jp",
"settsu.osaka.jp",
"shijonawate.osaka.jp",
"shimamoto.osaka.jp",
"suita.osaka.jp",
"tadaoka.osaka.jp",
"taishi.osaka.jp",
"tajiri.osaka.jp",
"takaishi.osaka.jp",
"takatsuki.osaka.jp",
"tondabayashi.osaka.jp",
"toyonaka.osaka.jp",
"toyono.osaka.jp",
"yao.osaka.jp",
"ariake.saga.jp",
"arita.saga.jp",
"fukudomi.saga.jp",
"genkai.saga.jp",
"hamatama.saga.jp",
"hizen.saga.jp",
"imari.saga.jp",
"kamimine.saga.jp",
"kanzaki.saga.jp",
"karatsu.saga.jp",
"kashima.saga.jp",
"kitagata.saga.jp",
"kitahata.saga.jp",
"kiyama.saga.jp",
"kouhoku.saga.jp",
"kyuragi.saga.jp",
"nishiarita.saga.jp",
"ogi.saga.jp",
"omachi.saga.jp",
"ouchi.saga.jp",
"saga.saga.jp",
"shiroishi.saga.jp",
"taku.saga.jp",
"tara.saga.jp",
"tosu.saga.jp",
"yoshinogari.saga.jp",
"arakawa.saitama.jp",
"asaka.saitama.jp",
"chichibu.saitama.jp",
"fujimi.saitama.jp",
"fujimino.saitama.jp",
"fukaya.saitama.jp",
"hanno.saitama.jp",
"hanyu.saitama.jp",
"hasuda.saitama.jp",
"hatogaya.saitama.jp",
"hatoyama.saitama.jp",
"hidaka.saitama.jp",
"higashichichibu.saitama.jp",
"higashimatsuyama.saitama.jp",
"honjo.saitama.jp",
"ina.saitama.jp",
"iruma.saitama.jp",
"iwatsuki.saitama.jp",
"kamiizumi.saitama.jp",
"kamikawa.saitama.jp",
"kamisato.saitama.jp",
"kasukabe.saitama.jp",
"kawagoe.saitama.jp",
"kawaguchi.saitama.jp",
"kawajima.saitama.jp",
"kazo.saitama.jp",
"kitamoto.saitama.jp",
"koshigaya.saitama.jp",
"kounosu.saitama.jp",
"kuki.saitama.jp",
"kumagaya.saitama.jp",
"matsubushi.saitama.jp",
"minano.saitama.jp",
"misato.saitama.jp",
"miyashiro.saitama.jp",
"miyoshi.saitama.jp",
"moroyama.saitama.jp",
"nagatoro.saitama.jp",
"namegawa.saitama.jp",
"niiza.saitama.jp",
"ogano.saitama.jp",
"ogawa.saitama.jp",
"ogose.saitama.jp",
"okegawa.saitama.jp",
"omiya.saitama.jp",
"otaki.saitama.jp",
"ranzan.saitama.jp",
"ryokami.saitama.jp",
"saitama.saitama.jp",
"sakado.saitama.jp",
"satte.saitama.jp",
"sayama.saitama.jp",
"shiki.saitama.jp",
"shiraoka.saitama.jp",
"soka.saitama.jp",
"sugito.saitama.jp",
"toda.saitama.jp",
"tokigawa.saitama.jp",
"tokorozawa.saitama.jp",
"tsurugashima.saitama.jp",
"urawa.saitama.jp",
"warabi.saitama.jp",
"yashio.saitama.jp",
"yokoze.saitama.jp",
"yono.saitama.jp",
"yorii.saitama.jp",
"yoshida.saitama.jp",
"yoshikawa.saitama.jp",
"yoshimi.saitama.jp",
"aisho.shiga.jp",
"gamo.shiga.jp",
"higashiomi.shiga.jp",
"hikone.shiga.jp",
"koka.shiga.jp",
"konan.shiga.jp",
"kosei.shiga.jp",
"koto.shiga.jp",
"kusatsu.shiga.jp",
"maibara.shiga.jp",
"moriyama.shiga.jp",
"nagahama.shiga.jp",
"nishiazai.shiga.jp",
"notogawa.shiga.jp",
"omihachiman.shiga.jp",
"otsu.shiga.jp",
"ritto.shiga.jp",
"ryuoh.shiga.jp",
"takashima.shiga.jp",
"takatsuki.shiga.jp",
"torahime.shiga.jp",
"toyosato.shiga.jp",
"yasu.shiga.jp",
"akagi.shimane.jp",
"ama.shimane.jp",
"gotsu.shimane.jp",
"hamada.shimane.jp",
"higashiizumo.shimane.jp",
"hikawa.shimane.jp",
"hikimi.shimane.jp",
"izumo.shimane.jp",
"kakinoki.shimane.jp",
"masuda.shimane.jp",
"matsue.shimane.jp",
"misato.shimane.jp",
"nishinoshima.shimane.jp",
"ohda.shimane.jp",
"okinoshima.shimane.jp",
"okuizumo.shimane.jp",
"shimane.shimane.jp",
"tamayu.shimane.jp",
"tsuwano.shimane.jp",
"unnan.shimane.jp",
"yakumo.shimane.jp",
"yasugi.shimane.jp",
"yatsuka.shimane.jp",
"arai.shizuoka.jp",
"atami.shizuoka.jp",
"fuji.shizuoka.jp",
"fujieda.shizuoka.jp",
"fujikawa.shizuoka.jp",
"fujinomiya.shizuoka.jp",
"fukuroi.shizuoka.jp",
"gotemba.shizuoka.jp",
"haibara.shizuoka.jp",
"hamamatsu.shizuoka.jp",
"higashiizu.shizuoka.jp",
"ito.shizuoka.jp",
"iwata.shizuoka.jp",
"izu.shizuoka.jp",
"izunokuni.shizuoka.jp",
"kakegawa.shizuoka.jp",
"kannami.shizuoka.jp",
"kawanehon.shizuoka.jp",
"kawazu.shizuoka.jp",
"kikugawa.shizuoka.jp",
"kosai.shizuoka.jp",
"makinohara.shizuoka.jp",
"matsuzaki.shizuoka.jp",
"minamiizu.shizuoka.jp",
"mishima.shizuoka.jp",
"morimachi.shizuoka.jp",
"nishiizu.shizuoka.jp",
"numazu.shizuoka.jp",
"omaezaki.shizuoka.jp",
"shimada.shizuoka.jp",
"shimizu.shizuoka.jp",
"shimoda.shizuoka.jp",
"shizuoka.shizuoka.jp",
"susono.shizuoka.jp",
"yaizu.shizuoka.jp",
"yoshida.shizuoka.jp",
"ashikaga.tochigi.jp",
"bato.tochigi.jp",
"haga.tochigi.jp",
"ichikai.tochigi.jp",
"iwafune.tochigi.jp",
"kaminokawa.tochigi.jp",
"kanuma.tochigi.jp",
"karasuyama.tochigi.jp",
"kuroiso.tochigi.jp",
"mashiko.tochigi.jp",
"mibu.tochigi.jp",
"moka.tochigi.jp",
"motegi.tochigi.jp",
"nasu.tochigi.jp",
"nasushiobara.tochigi.jp",
"nikko.tochigi.jp",
"nishikata.tochigi.jp",
"nogi.tochigi.jp",
"ohira.tochigi.jp",
"ohtawara.tochigi.jp",
"oyama.tochigi.jp",
"sakura.tochigi.jp",
"sano.tochigi.jp",
"shimotsuke.tochigi.jp",
"shioya.tochigi.jp",
"takanezawa.tochigi.jp",
"tochigi.tochigi.jp",
"tsuga.tochigi.jp",
"ujiie.tochigi.jp",
"utsunomiya.tochigi.jp",
"yaita.tochigi.jp",
"aizumi.tokushima.jp",
"anan.tokushima.jp",
"ichiba.tokushima.jp",
"itano.tokushima.jp",
"kainan.tokushima.jp",
"komatsushima.tokushima.jp",
"matsushige.tokushima.jp",
"mima.tokushima.jp",
"minami.tokushima.jp",
"miyoshi.tokushima.jp",
"mugi.tokushima.jp",
"nakagawa.tokushima.jp",
"naruto.tokushima.jp",
"sanagochi.tokushima.jp",
"shishikui.tokushima.jp",
"tokushima.tokushima.jp",
"wajiki.tokushima.jp",
"adachi.tokyo.jp",
"akiruno.tokyo.jp",
"akishima.tokyo.jp",
"aogashima.tokyo.jp",
"arakawa.tokyo.jp",
"bunkyo.tokyo.jp",
"chiyoda.tokyo.jp",
"chofu.tokyo.jp",
"chuo.tokyo.jp",
"edogawa.tokyo.jp",
"fuchu.tokyo.jp",
"fussa.tokyo.jp",
"hachijo.tokyo.jp",
"hachioji.tokyo.jp",
"hamura.tokyo.jp",
"higashikurume.tokyo.jp",
"higashimurayama.tokyo.jp",
"higashiyamato.tokyo.jp",
"hino.tokyo.jp",
"hinode.tokyo.jp",
"hinohara.tokyo.jp",
"inagi.tokyo.jp",
"itabashi.tokyo.jp",
"katsushika.tokyo.jp",
"kita.tokyo.jp",
"kiyose.tokyo.jp",
"kodaira.tokyo.jp",
"koganei.tokyo.jp",
"kokubunji.tokyo.jp",
"komae.tokyo.jp",
"koto.tokyo.jp",
"kouzushima.tokyo.jp",
"kunitachi.tokyo.jp",
"machida.tokyo.jp",
"meguro.tokyo.jp",
"minato.tokyo.jp",
"mitaka.tokyo.jp",
"mizuho.tokyo.jp",
"musashimurayama.tokyo.jp",
"musashino.tokyo.jp",
"nakano.tokyo.jp",
"nerima.tokyo.jp",
"ogasawara.tokyo.jp",
"okutama.tokyo.jp",
"ome.tokyo.jp",
"oshima.tokyo.jp",
"ota.tokyo.jp",
"setagaya.tokyo.jp",
"shibuya.tokyo.jp",
"shinagawa.tokyo.jp",
"shinjuku.tokyo.jp",
"suginami.tokyo.jp",
"sumida.tokyo.jp",
"tachikawa.tokyo.jp",
"taito.tokyo.jp",
"tama.tokyo.jp",
"toshima.tokyo.jp",
"chizu.tottori.jp",
"hino.tottori.jp",
"kawahara.tottori.jp",
"koge.tottori.jp",
"kotoura.tottori.jp",
"misasa.tottori.jp",
"nanbu.tottori.jp",
"nichinan.tottori.jp",
"sakaiminato.tottori.jp",
"tottori.tottori.jp",
"wakasa.tottori.jp",
"yazu.tottori.jp",
"yonago.tottori.jp",
"asahi.toyama.jp",
"fuchu.toyama.jp",
"fukumitsu.toyama.jp",
"funahashi.toyama.jp",
"himi.toyama.jp",
"imizu.toyama.jp",
"inami.toyama.jp",
"johana.toyama.jp",
"kamiichi.toyama.jp",
"kurobe.toyama.jp",
"nakaniikawa.toyama.jp",
"namerikawa.toyama.jp",
"nanto.toyama.jp",
"nyuzen.toyama.jp",
"oyabe.toyama.jp",
"taira.toyama.jp",
"takaoka.toyama.jp",
"tateyama.toyama.jp",
"toga.toyama.jp",
"tonami.toyama.jp",
"toyama.toyama.jp",
"unazuki.toyama.jp",
"uozu.toyama.jp",
"yamada.toyama.jp",
"arida.wakayama.jp",
"aridagawa.wakayama.jp",
"gobo.wakayama.jp",
"hashimoto.wakayama.jp",
"hidaka.wakayama.jp",
"hirogawa.wakayama.jp",
"inami.wakayama.jp",
"iwade.wakayama.jp",
"kainan.wakayama.jp",
"kamitonda.wakayama.jp",
"katsuragi.wakayama.jp",
"kimino.wakayama.jp",
"kinokawa.wakayama.jp",
"kitayama.wakayama.jp",
"koya.wakayama.jp",
"koza.wakayama.jp",
"kozagawa.wakayama.jp",
"kudoyama.wakayama.jp",
"kushimoto.wakayama.jp",
"mihama.wakayama.jp",
"misato.wakayama.jp",
"nachikatsuura.wakayama.jp",
"shingu.wakayama.jp",
"shirahama.wakayama.jp",
"taiji.wakayama.jp",
"tanabe.wakayama.jp",
"wakayama.wakayama.jp",
"yuasa.wakayama.jp",
"yura.wakayama.jp",
"asahi.yamagata.jp",
"funagata.yamagata.jp",
"higashine.yamagata.jp",
"iide.yamagata.jp",
"kahoku.yamagata.jp",
"kaminoyama.yamagata.jp",
"kaneyama.yamagata.jp",
"kawanishi.yamagata.jp",
"mamurogawa.yamagata.jp",
"mikawa.yamagata.jp",
"murayama.yamagata.jp",
"nagai.yamagata.jp",
"nakayama.yamagata.jp",
"nanyo.yamagata.jp",
"nishikawa.yamagata.jp",
"obanazawa.yamagata.jp",
"oe.yamagata.jp",
"oguni.yamagata.jp",
"ohkura.yamagata.jp",
"oishida.yamagata.jp",
"sagae.yamagata.jp",
"sakata.yamagata.jp",
"sakegawa.yamagata.jp",
"shinjo.yamagata.jp",
"shirataka.yamagata.jp",
"shonai.yamagata.jp",
"takahata.yamagata.jp",
"tendo.yamagata.jp",
"tozawa.yamagata.jp",
"tsuruoka.yamagata.jp",
"yamagata.yamagata.jp",
"yamanobe.yamagata.jp",
"yonezawa.yamagata.jp",
"yuza.yamagata.jp",
"abu.yamaguchi.jp",
"hagi.yamaguchi.jp",
"hikari.yamaguchi.jp",
"hofu.yamaguchi.jp",
"iwakuni.yamaguchi.jp",
"kudamatsu.yamaguchi.jp",
"mitou.yamaguchi.jp",
"nagato.yamaguchi.jp",
"oshima.yamaguchi.jp",
"shimonoseki.yamaguchi.jp",
"shunan.yamaguchi.jp",
"tabuse.yamaguchi.jp",
"tokuyama.yamaguchi.jp",
"toyota.yamaguchi.jp",
"ube.yamaguchi.jp",
"yuu.yamaguchi.jp",
"chuo.yamanashi.jp",
"doshi.yamanashi.jp",
"fuefuki.yamanashi.jp",
"fujikawa.yamanashi.jp",
"fujikawaguchiko.yamanashi.jp",
"fujiyoshida.yamanashi.jp",
"hayakawa.yamanashi.jp",
"hokuto.yamanashi.jp",
"ichikawamisato.yamanashi.jp",
"kai.yamanashi.jp",
"kofu.yamanashi.jp",
"koshu.yamanashi.jp",
"kosuge.yamanashi.jp",
"minami-alps.yamanashi.jp",
"minobu.yamanashi.jp",
"nakamichi.yamanashi.jp",
"nanbu.yamanashi.jp",
"narusawa.yamanashi.jp",
"nirasaki.yamanashi.jp",
"nishikatsura.yamanashi.jp",
"oshino.yamanashi.jp",
"otsuki.yamanashi.jp",
"showa.yamanashi.jp",
"tabayama.yamanashi.jp",
"tsuru.yamanashi.jp",
"uenohara.yamanashi.jp",
"yamanakako.yamanashi.jp",
"yamanashi.yamanashi.jp",
"ke",
"ac.ke",
"co.ke",
"go.ke",
"info.ke",
"me.ke",
"mobi.ke",
"ne.ke",
"or.ke",
"sc.ke",
"kg",
"org.kg",
"net.kg",
"com.kg",
"edu.kg",
"gov.kg",
"mil.kg",
"*.kh",
"ki",
"edu.ki",
"biz.ki",
"net.ki",
"org.ki",
"gov.ki",
"info.ki",
"com.ki",
"km",
"org.km",
"nom.km",
"gov.km",
"prd.km",
"tm.km",
"edu.km",
"mil.km",
"ass.km",
"com.km",
"coop.km",
"asso.km",
"presse.km",
"medecin.km",
"notaires.km",
"pharmaciens.km",
"veterinaire.km",
"gouv.km",
"kn",
"net.kn",
"org.kn",
"edu.kn",
"gov.kn",
"kp",
"com.kp",
"edu.kp",
"gov.kp",
"org.kp",
"rep.kp",
"tra.kp",
"kr",
"ac.kr",
"co.kr",
"es.kr",
"go.kr",
"hs.kr",
"kg.kr",
"mil.kr",
"ms.kr",
"ne.kr",
"or.kr",
"pe.kr",
"re.kr",
"sc.kr",
"busan.kr",
"chungbuk.kr",
"chungnam.kr",
"daegu.kr",
"daejeon.kr",
"gangwon.kr",
"gwangju.kr",
"gyeongbuk.kr",
"gyeonggi.kr",
"gyeongnam.kr",
"incheon.kr",
"jeju.kr",
"jeonbuk.kr",
"jeonnam.kr",
"seoul.kr",
"ulsan.kr",
"kw",
"com.kw",
"edu.kw",
"emb.kw",
"gov.kw",
"ind.kw",
"net.kw",
"org.kw",
"ky",
"com.ky",
"edu.ky",
"net.ky",
"org.ky",
"kz",
"org.kz",
"edu.kz",
"net.kz",
"gov.kz",
"mil.kz",
"com.kz",
"la",
"int.la",
"net.la",
"info.la",
"edu.la",
"gov.la",
"per.la",
"com.la",
"org.la",
"lb",
"com.lb",
"edu.lb",
"gov.lb",
"net.lb",
"org.lb",
"lc",
"com.lc",
"net.lc",
"co.lc",
"org.lc",
"edu.lc",
"gov.lc",
"li",
"lk",
"gov.lk",
"sch.lk",
"net.lk",
"int.lk",
"com.lk",
"org.lk",
"edu.lk",
"ngo.lk",
"soc.lk",
"web.lk",
"ltd.lk",
"assn.lk",
"grp.lk",
"hotel.lk",
"ac.lk",
"lr",
"com.lr",
"edu.lr",
"gov.lr",
"org.lr",
"net.lr",
"ls",
"ac.ls",
"biz.ls",
"co.ls",
"edu.ls",
"gov.ls",
"info.ls",
"net.ls",
"org.ls",
"sc.ls",
"lt",
"gov.lt",
"lu",
"lv",
"com.lv",
"edu.lv",
"gov.lv",
"org.lv",
"mil.lv",
"id.lv",
"net.lv",
"asn.lv",
"conf.lv",
"ly",
"com.ly",
"net.ly",
"gov.ly",
"plc.ly",
"edu.ly",
"sch.ly",
"med.ly",
"org.ly",
"id.ly",
"ma",
"co.ma",
"net.ma",
"gov.ma",
"org.ma",
"ac.ma",
"press.ma",
"mc",
"tm.mc",
"asso.mc",
"md",
"me",
"co.me",
"net.me",
"org.me",
"edu.me",
"ac.me",
"gov.me",
"its.me",
"priv.me",
"mg",
"org.mg",
"nom.mg",
"gov.mg",
"prd.mg",
"tm.mg",
"edu.mg",
"mil.mg",
"com.mg",
"co.mg",
"mh",
"mil",
"mk",
"com.mk",
"org.mk",
"net.mk",
"edu.mk",
"gov.mk",
"inf.mk",
"name.mk",
"ml",
"com.ml",
"edu.ml",
"gouv.ml",
"gov.ml",
"net.ml",
"org.ml",
"presse.ml",
"*.mm",
"mn",
"gov.mn",
"edu.mn",
"org.mn",
"mo",
"com.mo",
"net.mo",
"org.mo",
"edu.mo",
"gov.mo",
"mobi",
"mp",
"mq",
"mr",
"gov.mr",
"ms",
"com.ms",
"edu.ms",
"gov.ms",
"net.ms",
"org.ms",
"mt",
"com.mt",
"edu.mt",
"net.mt",
"org.mt",
"mu",
"com.mu",
"net.mu",
"org.mu",
"gov.mu",
"ac.mu",
"co.mu",
"or.mu",
"museum",
"academy.museum",
"agriculture.museum",
"air.museum",
"airguard.museum",
"alabama.museum",
"alaska.museum",
"amber.museum",
"ambulance.museum",
"american.museum",
"americana.museum",
"americanantiques.museum",
"americanart.museum",
"amsterdam.museum",
"and.museum",
"annefrank.museum",
"anthro.museum",
"anthropology.museum",
"antiques.museum",
"aquarium.museum",
"arboretum.museum",
"archaeological.museum",
"archaeology.museum",
"architecture.museum",
"art.museum",
"artanddesign.museum",
"artcenter.museum",
"artdeco.museum",
"arteducation.museum",
"artgallery.museum",
"arts.museum",
"artsandcrafts.museum",
"asmatart.museum",
"assassination.museum",
"assisi.museum",
"association.museum",
"astronomy.museum",
"atlanta.museum",
"austin.museum",
"australia.museum",
"automotive.museum",
"aviation.museum",
"axis.museum",
"badajoz.museum",
"baghdad.museum",
"bahn.museum",
"bale.museum",
"baltimore.museum",
"barcelona.museum",
"baseball.museum",
"basel.museum",
"baths.museum",
"bauern.museum",
"beauxarts.museum",
"beeldengeluid.museum",
"bellevue.museum",
"bergbau.museum",
"berkeley.museum",
"berlin.museum",
"bern.museum",
"bible.museum",
"bilbao.museum",
"bill.museum",
"birdart.museum",
"birthplace.museum",
"bonn.museum",
"boston.museum",
"botanical.museum",
"botanicalgarden.museum",
"botanicgarden.museum",
"botany.museum",
"brandywinevalley.museum",
"brasil.museum",
"bristol.museum",
"british.museum",
"britishcolumbia.museum",
"broadcast.museum",
"brunel.museum",
"brussel.museum",
"brussels.museum",
"bruxelles.museum",
"building.museum",
"burghof.museum",
"bus.museum",
"bushey.museum",
"cadaques.museum",
"california.museum",
"cambridge.museum",
"can.museum",
"canada.museum",
"capebreton.museum",
"carrier.museum",
"cartoonart.museum",
"casadelamoneda.museum",
"castle.museum",
"castres.museum",
"celtic.museum",
"center.museum",
"chattanooga.museum",
"cheltenham.museum",
"chesapeakebay.museum",
"chicago.museum",
"children.museum",
"childrens.museum",
"childrensgarden.museum",
"chiropractic.museum",
"chocolate.museum",
"christiansburg.museum",
"cincinnati.museum",
"cinema.museum",
"circus.museum",
"civilisation.museum",
"civilization.museum",
"civilwar.museum",
"clinton.museum",
"clock.museum",
"coal.museum",
"coastaldefence.museum",
"cody.museum",
"coldwar.museum",
"collection.museum",
"colonialwilliamsburg.museum",
"coloradoplateau.museum",
"columbia.museum",
"columbus.museum",
"communication.museum",
"communications.museum",
"community.museum",
"computer.museum",
"computerhistory.museum",
"comunicações.museum",
"contemporary.museum",
"contemporaryart.museum",
"convent.museum",
"copenhagen.museum",
"corporation.museum",
"correios-e-telecomunicações.museum",
"corvette.museum",
"costume.museum",
"countryestate.museum",
"county.museum",
"crafts.museum",
"cranbrook.museum",
"creation.museum",
"cultural.museum",
"culturalcenter.museum",
"culture.museum",
"cyber.museum",
"cymru.museum",
"dali.museum",
"dallas.museum",
"database.museum",
"ddr.museum",
"decorativearts.museum",
"delaware.museum",
"delmenhorst.museum",
"denmark.museum",
"depot.museum",
"design.museum",
"detroit.museum",
"dinosaur.museum",
"discovery.museum",
"dolls.museum",
"donostia.museum",
"durham.museum",
"eastafrica.museum",
"eastcoast.museum",
"education.museum",
"educational.museum",
"egyptian.museum",
"eisenbahn.museum",
"elburg.museum",
"elvendrell.museum",
"embroidery.museum",
"encyclopedic.museum",
"england.museum",
"entomology.museum",
"environment.museum",
"environmentalconservation.museum",
"epilepsy.museum",
"essex.museum",
"estate.museum",
"ethnology.museum",
"exeter.museum",
"exhibition.museum",
"family.museum",
"farm.museum",
"farmequipment.museum",
"farmers.museum",
"farmstead.museum",
"field.museum",
"figueres.museum",
"filatelia.museum",
"film.museum",
"fineart.museum",
"finearts.museum",
"finland.museum",
"flanders.museum",
"florida.museum",
"force.museum",
"fortmissoula.museum",
"fortworth.museum",
"foundation.museum",
"francaise.museum",
"frankfurt.museum",
"franziskaner.museum",
"freemasonry.museum",
"freiburg.museum",
"fribourg.museum",
"frog.museum",
"fundacio.museum",
"furniture.museum",
"gallery.museum",
"garden.museum",
"gateway.museum",
"geelvinck.museum",
"gemological.museum",
"geology.museum",
"georgia.museum",
"giessen.museum",
"glas.museum",
"glass.museum",
"gorge.museum",
"grandrapids.museum",
"graz.museum",
"guernsey.museum",
"halloffame.museum",
"hamburg.museum",
"handson.museum",
"harvestcelebration.museum",
"hawaii.museum",
"health.museum",
"heimatunduhren.museum",
"hellas.museum",
"helsinki.museum",
"hembygdsforbund.museum",
"heritage.museum",
"histoire.museum",
"historical.museum",
"historicalsociety.museum",
"historichouses.museum",
"historisch.museum",
"historisches.museum",
"history.museum",
"historyofscience.museum",
"horology.museum",
"house.museum",
"humanities.museum",
"illustration.museum",
"imageandsound.museum",
"indian.museum",
"indiana.museum",
"indianapolis.museum",
"indianmarket.museum",
"intelligence.museum",
"interactive.museum",
"iraq.museum",
"iron.museum",
"isleofman.museum",
"jamison.museum",
"jefferson.museum",
"jerusalem.museum",
"jewelry.museum",
"jewish.museum",
"jewishart.museum",
"jfk.museum",
"journalism.museum",
"judaica.museum",
"judygarland.museum",
"juedisches.museum",
"juif.museum",
"karate.museum",
"karikatur.museum",
"kids.museum",
"koebenhavn.museum",
"koeln.museum",
"kunst.museum",
"kunstsammlung.museum",
"kunstunddesign.museum",
"labor.museum",
"labour.museum",
"lajolla.museum",
"lancashire.museum",
"landes.museum",
"lans.museum",
"läns.museum",
"larsson.museum",
"lewismiller.museum",
"lincoln.museum",
"linz.museum",
"living.museum",
"livinghistory.museum",
"localhistory.museum",
"london.museum",
"losangeles.museum",
"louvre.museum",
"loyalist.museum",
"lucerne.museum",
"luxembourg.museum",
"luzern.museum",
"mad.museum",
"madrid.museum",
"mallorca.museum",
"manchester.museum",
"mansion.museum",
"mansions.museum",
"manx.museum",
"marburg.museum",
"maritime.museum",
"maritimo.museum",
"maryland.museum",
"marylhurst.museum",
"media.museum",
"medical.museum",
"medizinhistorisches.museum",
"meeres.museum",
"memorial.museum",
"mesaverde.museum",
"michigan.museum",
"midatlantic.museum",
"military.museum",
"mill.museum",
"miners.museum",
"mining.museum",
"minnesota.museum",
"missile.museum",
"missoula.museum",
"modern.museum",
"moma.museum",
"money.museum",
"monmouth.museum",
"monticello.museum",
"montreal.museum",
"moscow.museum",
"motorcycle.museum",
"muenchen.museum",
"muenster.museum",
"mulhouse.museum",
"muncie.museum",
"museet.museum",
"museumcenter.museum",
"museumvereniging.museum",
"music.museum",
"national.museum",
"nationalfirearms.museum",
"nationalheritage.museum",
"nativeamerican.museum",
"naturalhistory.museum",
"naturalhistorymuseum.museum",
"naturalsciences.museum",
"nature.museum",
"naturhistorisches.museum",
"natuurwetenschappen.museum",
"naumburg.museum",
"naval.museum",
"nebraska.museum",
"neues.museum",
"newhampshire.museum",
"newjersey.museum",
"newmexico.museum",
"newport.museum",
"newspaper.museum",
"newyork.museum",
"niepce.museum",
"norfolk.museum",
"north.museum",
"nrw.museum",
"nyc.museum",
"nyny.museum",
"oceanographic.museum",
"oceanographique.museum",
"omaha.museum",
"online.museum",
"ontario.museum",
"openair.museum",
"oregon.museum",
"oregontrail.museum",
"otago.museum",
"oxford.museum",
"pacific.museum",
"paderborn.museum",
"palace.museum",
"paleo.museum",
"palmsprings.museum",
"panama.museum",
"paris.museum",
"pasadena.museum",
"pharmacy.museum",
"philadelphia.museum",
"philadelphiaarea.museum",
"philately.museum",
"phoenix.museum",
"photography.museum",
"pilots.museum",
"pittsburgh.museum",
"planetarium.museum",
"plantation.museum",
"plants.museum",
"plaza.museum",
"portal.museum",
"portland.museum",
"portlligat.museum",
"posts-and-telecommunications.museum",
"preservation.museum",
"presidio.museum",
"press.museum",
"project.museum",
"public.museum",
"pubol.museum",
"quebec.museum",
"railroad.museum",
"railway.museum",
"research.museum",
"resistance.museum",
"riodejaneiro.museum",
"rochester.museum",
"rockart.museum",
"roma.museum",
"russia.museum",
"saintlouis.museum",
"salem.museum",
"salvadordali.museum",
"salzburg.museum",
"sandiego.museum",
"sanfrancisco.museum",
"santabarbara.museum",
"santacruz.museum",
"santafe.museum",
"saskatchewan.museum",
"satx.museum",
"savannahga.museum",
"schlesisches.museum",
"schoenbrunn.museum",
"schokoladen.museum",
"school.museum",
"schweiz.museum",
"science.museum",
"scienceandhistory.museum",
"scienceandindustry.museum",
"sciencecenter.museum",
"sciencecenters.museum",
"science-fiction.museum",
"sciencehistory.museum",
"sciences.museum",
"sciencesnaturelles.museum",
"scotland.museum",
"seaport.museum",
"settlement.museum",
"settlers.museum",
"shell.museum",
"sherbrooke.museum",
"sibenik.museum",
"silk.museum",
"ski.museum",
"skole.museum",
"society.museum",
"sologne.museum",
"soundandvision.museum",
"southcarolina.museum",
"southwest.museum",
"space.museum",
"spy.museum",
"square.museum",
"stadt.museum",
"stalbans.museum",
"starnberg.museum",
"state.museum",
"stateofdelaware.museum",
"station.museum",
"steam.museum",
"steiermark.museum",
"stjohn.museum",
"stockholm.museum",
"stpetersburg.museum",
"stuttgart.museum",
"suisse.museum",
"surgeonshall.museum",
"surrey.museum",
"svizzera.museum",
"sweden.museum",
"sydney.museum",
"tank.museum",
"tcm.museum",
"technology.museum",
"telekommunikation.museum",
"television.museum",
"texas.museum",
"textile.museum",
"theater.museum",
"time.museum",
"timekeeping.museum",
"topology.museum",
"torino.museum",
"touch.museum",
"town.museum",
"transport.museum",
"tree.museum",
"trolley.museum",
"trust.museum",
"trustee.museum",
"uhren.museum",
"ulm.museum",
"undersea.museum",
"university.museum",
"usa.museum",
"usantiques.museum",
"usarts.museum",
"uscountryestate.museum",
"usculture.museum",
"usdecorativearts.museum",
"usgarden.museum",
"ushistory.museum",
"ushuaia.museum",
"uslivinghistory.museum",
"utah.museum",
"uvic.museum",
"valley.museum",
"vantaa.museum",
"versailles.museum",
"viking.museum",
"village.museum",
"virginia.museum",
"virtual.museum",
"virtuel.museum",
"vlaanderen.museum",
"volkenkunde.museum",
"wales.museum",
"wallonie.museum",
"war.museum",
"washingtondc.museum",
"watchandclock.museum",
"watch-and-clock.museum",
"western.museum",
"westfalen.museum",
"whaling.museum",
"wildlife.museum",
"williamsburg.museum",
"windmill.museum",
"workshop.museum",
"york.museum",
"yorkshire.museum",
"yosemite.museum",
"youth.museum",
"zoological.museum",
"zoology.museum",
"ירושלים.museum",
"иком.museum",
"mv",
"aero.mv",
"biz.mv",
"com.mv",
"coop.mv",
"edu.mv",
"gov.mv",
"info.mv",
"int.mv",
"mil.mv",
"museum.mv",
"name.mv",
"net.mv",
"org.mv",
"pro.mv",
"mw",
"ac.mw",
"biz.mw",
"co.mw",
"com.mw",
"coop.mw",
"edu.mw",
"gov.mw",
"int.mw",
"museum.mw",
"net.mw",
"org.mw",
"mx",
"com.mx",
"org.mx",
"gob.mx",
"edu.mx",
"net.mx",
"my",
"biz.my",
"com.my",
"edu.my",
"gov.my",
"mil.my",
"name.my",
"net.my",
"org.my",
"mz",
"ac.mz",
"adv.mz",
"co.mz",
"edu.mz",
"gov.mz",
"mil.mz",
"net.mz",
"org.mz",
"na",
"info.na",
"pro.na",
"name.na",
"school.na",
"or.na",
"dr.na",
"us.na",
"mx.na",
"ca.na",
"in.na",
"cc.na",
"tv.na",
"ws.na",
"mobi.na",
"co.na",
"com.na",
"org.na",
"name",
"nc",
"asso.nc",
"nom.nc",
"ne",
"net",
"nf",
"com.nf",
"net.nf",
"per.nf",
"rec.nf",
"web.nf",
"arts.nf",
"firm.nf",
"info.nf",
"other.nf",
"store.nf",
"ng",
"com.ng",
"edu.ng",
"gov.ng",
"i.ng",
"mil.ng",
"mobi.ng",
"name.ng",
"net.ng",
"org.ng",
"sch.ng",
"ni",
"ac.ni",
"biz.ni",
"co.ni",
"com.ni",
"edu.ni",
"gob.ni",
"in.ni",
"info.ni",
"int.ni",
"mil.ni",
"net.ni",
"nom.ni",
"org.ni",
"web.ni",
"nl",
"no",
"fhs.no",
"vgs.no",
"fylkesbibl.no",
"folkebibl.no",
"museum.no",
"idrett.no",
"priv.no",
"mil.no",
"stat.no",
"dep.no",
"kommune.no",
"herad.no",
"aa.no",
"ah.no",
"bu.no",
"fm.no",
"hl.no",
"hm.no",
"jan-mayen.no",
"mr.no",
"nl.no",
"nt.no",
"of.no",
"ol.no",
"oslo.no",
"rl.no",
"sf.no",
"st.no",
"svalbard.no",
"tm.no",
"tr.no",
"va.no",
"vf.no",
"gs.aa.no",
"gs.ah.no",
"gs.bu.no",
"gs.fm.no",
"gs.hl.no",
"gs.hm.no",
"gs.jan-mayen.no",
"gs.mr.no",
"gs.nl.no",
"gs.nt.no",
"gs.of.no",
"gs.ol.no",
"gs.oslo.no",
"gs.rl.no",
"gs.sf.no",
"gs.st.no",
"gs.svalbard.no",
"gs.tm.no",
"gs.tr.no",
"gs.va.no",
"gs.vf.no",
"akrehamn.no",
"åkrehamn.no",
"algard.no",
"ålgård.no",
"arna.no",
"brumunddal.no",
"bryne.no",
"bronnoysund.no",
"brønnøysund.no",
"drobak.no",
"drøbak.no",
"egersund.no",
"fetsund.no",
"floro.no",
"florø.no",
"fredrikstad.no",
"hokksund.no",
"honefoss.no",
"hønefoss.no",
"jessheim.no",
"jorpeland.no",
"jørpeland.no",
"kirkenes.no",
"kopervik.no",
"krokstadelva.no",
"langevag.no",
"langevåg.no",
"leirvik.no",
"mjondalen.no",
"mjøndalen.no",
"mo-i-rana.no",
"mosjoen.no",
"mosjøen.no",
"nesoddtangen.no",
"orkanger.no",
"osoyro.no",
"osøyro.no",
"raholt.no",
"råholt.no",
"sandnessjoen.no",
"sandnessjøen.no",
"skedsmokorset.no",
"slattum.no",
"spjelkavik.no",
"stathelle.no",
"stavern.no",
"stjordalshalsen.no",
"stjørdalshalsen.no",
"tananger.no",
"tranby.no",
"vossevangen.no",
"afjord.no",
"åfjord.no",
"agdenes.no",
"al.no",
"ål.no",
"alesund.no",
"ålesund.no",
"alstahaug.no",
"alta.no",
"áltá.no",
"alaheadju.no",
"álaheadju.no",
"alvdal.no",
"amli.no",
"åmli.no",
"amot.no",
"åmot.no",
"andebu.no",
"andoy.no",
"andøy.no",
"andasuolo.no",
"ardal.no",
"årdal.no",
"aremark.no",
"arendal.no",
"ås.no",
"aseral.no",
"åseral.no",
"asker.no",
"askim.no",
"askvoll.no",
"askoy.no",
"askøy.no",
"asnes.no",
"åsnes.no",
"audnedaln.no",
"aukra.no",
"aure.no",
"aurland.no",
"aurskog-holand.no",
"aurskog-høland.no",
"austevoll.no",
"austrheim.no",
"averoy.no",
"averøy.no",
"balestrand.no",
"ballangen.no",
"balat.no",
"bálát.no",
"balsfjord.no",
"bahccavuotna.no",
"báhccavuotna.no",
"bamble.no",
"bardu.no",
"beardu.no",
"beiarn.no",
"bajddar.no",
"bájddar.no",
"baidar.no",
"báidár.no",
"berg.no",
"bergen.no",
"berlevag.no",
"berlevåg.no",
"bearalvahki.no",
"bearalváhki.no",
"bindal.no",
"birkenes.no",
"bjarkoy.no",
"bjarkøy.no",
"bjerkreim.no",
"bjugn.no",
"bodo.no",
"bodø.no",
"badaddja.no",
"bådåddjå.no",
"budejju.no",
"bokn.no",
"bremanger.no",
"bronnoy.no",
"brønnøy.no",
"bygland.no",
"bykle.no",
"barum.no",
"bærum.no",
"bo.telemark.no",
"bø.telemark.no",
"bo.nordland.no",
"bø.nordland.no",
"bievat.no",
"bievát.no",
"bomlo.no",
"bømlo.no",
"batsfjord.no",
"båtsfjord.no",
"bahcavuotna.no",
"báhcavuotna.no",
"dovre.no",
"drammen.no",
"drangedal.no",
"dyroy.no",
"dyrøy.no",
"donna.no",
"dønna.no",
"eid.no",
"eidfjord.no",
"eidsberg.no",
"eidskog.no",
"eidsvoll.no",
"eigersund.no",
"elverum.no",
"enebakk.no",
"engerdal.no",
"etne.no",
"etnedal.no",
"evenes.no",
"evenassi.no",
"evenášši.no",
"evje-og-hornnes.no",
"farsund.no",
"fauske.no",
"fuossko.no",
"fuoisku.no",
"fedje.no",
"fet.no",
"finnoy.no",
"finnøy.no",
"fitjar.no",
"fjaler.no",
"fjell.no",
"flakstad.no",
"flatanger.no",
"flekkefjord.no",
"flesberg.no",
"flora.no",
"fla.no",
"flå.no",
"folldal.no",
"forsand.no",
"fosnes.no",
"frei.no",
"frogn.no",
"froland.no",
"frosta.no",
"frana.no",
"fræna.no",
"froya.no",
"frøya.no",
"fusa.no",
"fyresdal.no",
"forde.no",
"førde.no",
"gamvik.no",
"gangaviika.no",
"gáŋgaviika.no",
"gaular.no",
"gausdal.no",
"gildeskal.no",
"gildeskål.no",
"giske.no",
"gjemnes.no",
"gjerdrum.no",
"gjerstad.no",
"gjesdal.no",
"gjovik.no",
"gjøvik.no",
"gloppen.no",
"gol.no",
"gran.no",
"grane.no",
"granvin.no",
"gratangen.no",
"grimstad.no",
"grong.no",
"kraanghke.no",
"kråanghke.no",
"grue.no",
"gulen.no",
"hadsel.no",
"halden.no",
"halsa.no",
"hamar.no",
"hamaroy.no",
"habmer.no",
"hábmer.no",
"hapmir.no",
"hápmir.no",
"hammerfest.no",
"hammarfeasta.no",
"hámmárfeasta.no",
"haram.no",
"hareid.no",
"harstad.no",
"hasvik.no",
"aknoluokta.no",
"ákŋoluokta.no",
"hattfjelldal.no",
"aarborte.no",
"haugesund.no",
"hemne.no",
"hemnes.no",
"hemsedal.no",
"heroy.more-og-romsdal.no",
"herøy.møre-og-romsdal.no",
"heroy.nordland.no",
"herøy.nordland.no",
"hitra.no",
"hjartdal.no",
"hjelmeland.no",
"hobol.no",
"hobøl.no",
"hof.no",
"hol.no",
"hole.no",
"holmestrand.no",
"holtalen.no",
"holtålen.no",
"hornindal.no",
"horten.no",
"hurdal.no",
"hurum.no",
"hvaler.no",
"hyllestad.no",
"hagebostad.no",
"hægebostad.no",
"hoyanger.no",
"høyanger.no",
"hoylandet.no",
"høylandet.no",
"ha.no",
"hå.no",
"ibestad.no",
"inderoy.no",
"inderøy.no",
"iveland.no",
"jevnaker.no",
"jondal.no",
"jolster.no",
"jølster.no",
"karasjok.no",
"karasjohka.no",
"kárášjohka.no",
"karlsoy.no",
"galsa.no",
"gálsá.no",
"karmoy.no",
"karmøy.no",
"kautokeino.no",
"guovdageaidnu.no",
"klepp.no",
"klabu.no",
"klæbu.no",
"kongsberg.no",
"kongsvinger.no",
"kragero.no",
"kragerø.no",
"kristiansand.no",
"kristiansund.no",
"krodsherad.no",
"krødsherad.no",
"kvalsund.no",
"rahkkeravju.no",
"ráhkkerávju.no",
"kvam.no",
"kvinesdal.no",
"kvinnherad.no",
"kviteseid.no",
"kvitsoy.no",
"kvitsøy.no",
"kvafjord.no",
"kvæfjord.no",
"giehtavuoatna.no",
"kvanangen.no",
"kvænangen.no",
"navuotna.no",
"návuotna.no",
"kafjord.no",
"kåfjord.no",
"gaivuotna.no",
"gáivuotna.no",
"larvik.no",
"lavangen.no",
"lavagis.no",
"loabat.no",
"loabát.no",
"lebesby.no",
"davvesiida.no",
"leikanger.no",
"leirfjord.no",
"leka.no",
"leksvik.no",
"lenvik.no",
"leangaviika.no",
"leaŋgaviika.no",
"lesja.no",
"levanger.no",
"lier.no",
"lierne.no",
"lillehammer.no",
"lillesand.no",
"lindesnes.no",
"lindas.no",
"lindås.no",
"lom.no",
"loppa.no",
"lahppi.no",
"láhppi.no",
"lund.no",
"lunner.no",
"luroy.no",
"lurøy.no",
"luster.no",
"lyngdal.no",
"lyngen.no",
"ivgu.no",
"lardal.no",
"lerdal.no",
"lærdal.no",
"lodingen.no",
"lødingen.no",
"lorenskog.no",
"lørenskog.no",
"loten.no",
"løten.no",
"malvik.no",
"masoy.no",
"måsøy.no",
"muosat.no",
"muosát.no",
"mandal.no",
"marker.no",
"marnardal.no",
"masfjorden.no",
"meland.no",
"meldal.no",
"melhus.no",
"meloy.no",
"meløy.no",
"meraker.no",
"meråker.no",
"moareke.no",
"moåreke.no",
"midsund.no",
"midtre-gauldal.no",
"modalen.no",
"modum.no",
"molde.no",
"moskenes.no",
"moss.no",
"mosvik.no",
"malselv.no",
"målselv.no",
"malatvuopmi.no",
"málatvuopmi.no",
"namdalseid.no",
"aejrie.no",
"namsos.no",
"namsskogan.no",
"naamesjevuemie.no",
"nååmesjevuemie.no",
"laakesvuemie.no",
"nannestad.no",
"narvik.no",
"narviika.no",
"naustdal.no",
"nedre-eiker.no",
"nes.akershus.no",
"nes.buskerud.no",
"nesna.no",
"nesodden.no",
"nesseby.no",
"unjarga.no",
"unjárga.no",
"nesset.no",
"nissedal.no",
"nittedal.no",
"nord-aurdal.no",
"nord-fron.no",
"nord-odal.no",
"norddal.no",
"nordkapp.no",
"davvenjarga.no",
"davvenjárga.no",
"nordre-land.no",
"nordreisa.no",
"raisa.no",
"ráisa.no",
"nore-og-uvdal.no",
"notodden.no",
"naroy.no",
"nærøy.no",
"notteroy.no",
"nøtterøy.no",
"odda.no",
"oksnes.no",
"øksnes.no",
"oppdal.no",
"oppegard.no",
"oppegård.no",
"orkdal.no",
"orland.no",
"ørland.no",
"orskog.no",
"ørskog.no",
"orsta.no",
"ørsta.no",
"os.hedmark.no",
"os.hordaland.no",
"osen.no",
"osteroy.no",
"osterøy.no",
"ostre-toten.no",
"østre-toten.no",
"overhalla.no",
"ovre-eiker.no",
"øvre-eiker.no",
"oyer.no",
"øyer.no",
"oygarden.no",
"øygarden.no",
"oystre-slidre.no",
"øystre-slidre.no",
"porsanger.no",
"porsangu.no",
"porsáŋgu.no",
"porsgrunn.no",
"radoy.no",
"radøy.no",
"rakkestad.no",
"rana.no",
"ruovat.no",
"randaberg.no",
"rauma.no",
"rendalen.no",
"rennebu.no",
"rennesoy.no",
"rennesøy.no",
"rindal.no",
"ringebu.no",
"ringerike.no",
"ringsaker.no",
"rissa.no",
"risor.no",
"risør.no",
"roan.no",
"rollag.no",
"rygge.no",
"ralingen.no",
"rælingen.no",
"rodoy.no",
"rødøy.no",
"romskog.no",
"rømskog.no",
"roros.no",
"røros.no",
"rost.no",
"røst.no",
"royken.no",
"røyken.no",
"royrvik.no",
"røyrvik.no",
"rade.no",
"råde.no",
"salangen.no",
"siellak.no",
"saltdal.no",
"salat.no",
"sálát.no",
"sálat.no",
"samnanger.no",
"sande.more-og-romsdal.no",
"sande.møre-og-romsdal.no",
"sande.vestfold.no",
"sandefjord.no",
"sandnes.no",
"sandoy.no",
"sandøy.no",
"sarpsborg.no",
"sauda.no",
"sauherad.no",
"sel.no",
"selbu.no",
"selje.no",
"seljord.no",
"sigdal.no",
"siljan.no",
"sirdal.no",
"skaun.no",
"skedsmo.no",
"ski.no",
"skien.no",
"skiptvet.no",
"skjervoy.no",
"skjervøy.no",
"skierva.no",
"skiervá.no",
"skjak.no",
"skjåk.no",
"skodje.no",
"skanland.no",
"skånland.no",
"skanit.no",
"skánit.no",
"smola.no",
"smøla.no",
"snillfjord.no",
"snasa.no",
"snåsa.no",
"snoasa.no",
"snaase.no",
"snåase.no",
"sogndal.no",
"sokndal.no",
"sola.no",
"solund.no",
"songdalen.no",
"sortland.no",
"spydeberg.no",
"stange.no",
"stavanger.no",
"steigen.no",
"steinkjer.no",
"stjordal.no",
"stjørdal.no",
"stokke.no",
"stor-elvdal.no",
"stord.no",
"stordal.no",
"storfjord.no",
"omasvuotna.no",
"strand.no",
"stranda.no",
"stryn.no",
"sula.no",
"suldal.no",
"sund.no",
"sunndal.no",
"surnadal.no",
"sveio.no",
"svelvik.no",
"sykkylven.no",
"sogne.no",
"søgne.no",
"somna.no",
"sømna.no",
"sondre-land.no",
"søndre-land.no",
"sor-aurdal.no",
"sør-aurdal.no",
"sor-fron.no",
"sør-fron.no",
"sor-odal.no",
"sør-odal.no",
"sor-varanger.no",
"sør-varanger.no",
"matta-varjjat.no",
"mátta-várjjat.no",
"sorfold.no",
"sørfold.no",
"sorreisa.no",
"sørreisa.no",
"sorum.no",
"sørum.no",
"tana.no",
"deatnu.no",
"time.no",
"tingvoll.no",
"tinn.no",
"tjeldsund.no",
"dielddanuorri.no",
"tjome.no",
"tjøme.no",
"tokke.no",
"tolga.no",
"torsken.no",
"tranoy.no",
"tranøy.no",
"tromso.no",
"tromsø.no",
"tromsa.no",
"romsa.no",
"trondheim.no",
"troandin.no",
"trysil.no",
"trana.no",
"træna.no",
"trogstad.no",
"trøgstad.no",
"tvedestrand.no",
"tydal.no",
"tynset.no",
"tysfjord.no",
"divtasvuodna.no",
"divttasvuotna.no",
"tysnes.no",
"tysvar.no",
"tysvær.no",
"tonsberg.no",
"tønsberg.no",
"ullensaker.no",
"ullensvang.no",
"ulvik.no",
"utsira.no",
"vadso.no",
"vadsø.no",
"cahcesuolo.no",
"čáhcesuolo.no",
"vaksdal.no",
"valle.no",
"vang.no",
"vanylven.no",
"vardo.no",
"vardø.no",
"varggat.no",
"várggát.no",
"vefsn.no",
"vaapste.no",
"vega.no",
"vegarshei.no",
"vegårshei.no",
"vennesla.no",
"verdal.no",
"verran.no",
"vestby.no",
"vestnes.no",
"vestre-slidre.no",
"vestre-toten.no",
"vestvagoy.no",
"vestvågøy.no",
"vevelstad.no",
"vik.no",
"vikna.no",
"vindafjord.no",
"volda.no",
"voss.no",
"varoy.no",
"værøy.no",
"vagan.no",
"vågan.no",
"voagat.no",
"vagsoy.no",
"vågsøy.no",
"vaga.no",
"vågå.no",
"valer.ostfold.no",
"våler.østfold.no",
"valer.hedmark.no",
"våler.hedmark.no",
"*.np",
"nr",
"biz.nr",
"info.nr",
"gov.nr",
"edu.nr",
"org.nr",
"net.nr",
"com.nr",
"nu",
"nz",
"ac.nz",
"co.nz",
"cri.nz",
"geek.nz",
"gen.nz",
"govt.nz",
"health.nz",
"iwi.nz",
"kiwi.nz",
"maori.nz",
"mil.nz",
"māori.nz",
"net.nz",
"org.nz",
"parliament.nz",
"school.nz",
"om",
"co.om",
"com.om",
"edu.om",
"gov.om",
"med.om",
"museum.om",
"net.om",
"org.om",
"pro.om",
"onion",
"org",
"pa",
"ac.pa",
"gob.pa",
"com.pa",
"org.pa",
"sld.pa",
"edu.pa",
"net.pa",
"ing.pa",
"abo.pa",
"med.pa",
"nom.pa",
"pe",
"edu.pe",
"gob.pe",
"nom.pe",
"mil.pe",
"org.pe",
"com.pe",
"net.pe",
"pf",
"com.pf",
"org.pf",
"edu.pf",
"*.pg",
"ph",
"com.ph",
"net.ph",
"org.ph",
"gov.ph",
"edu.ph",
"ngo.ph",
"mil.ph",
"i.ph",
"pk",
"com.pk",
"net.pk",
"edu.pk",
"org.pk",
"fam.pk",
"biz.pk",
"web.pk",
"gov.pk",
"gob.pk",
"gok.pk",
"gon.pk",
"gop.pk",
"gos.pk",
"info.pk",
"pl",
"com.pl",
"net.pl",
"org.pl",
"aid.pl",
"agro.pl",
"atm.pl",
"auto.pl",
"biz.pl",
"edu.pl",
"gmina.pl",
"gsm.pl",
"info.pl",
"mail.pl",
"miasta.pl",
"media.pl",
"mil.pl",
"nieruchomosci.pl",
"nom.pl",
"pc.pl",
"powiat.pl",
"priv.pl",
"realestate.pl",
"rel.pl",
"sex.pl",
"shop.pl",
"sklep.pl",
"sos.pl",
"szkola.pl",
"targi.pl",
"tm.pl",
"tourism.pl",
"travel.pl",
"turystyka.pl",
"gov.pl",
"ap.gov.pl",
"ic.gov.pl",
"is.gov.pl",
"us.gov.pl",
"kmpsp.gov.pl",
"kppsp.gov.pl",
"kwpsp.gov.pl",
"psp.gov.pl",
"wskr.gov.pl",
"kwp.gov.pl",
"mw.gov.pl",
"ug.gov.pl",
"um.gov.pl",
"umig.gov.pl",
"ugim.gov.pl",
"upow.gov.pl",
"uw.gov.pl",
"starostwo.gov.pl",
"pa.gov.pl",
"po.gov.pl",
"psse.gov.pl",
"pup.gov.pl",
"rzgw.gov.pl",
"sa.gov.pl",
"so.gov.pl",
"sr.gov.pl",
"wsa.gov.pl",
"sko.gov.pl",
"uzs.gov.pl",
"wiih.gov.pl",
"winb.gov.pl",
"pinb.gov.pl",
"wios.gov.pl",
"witd.gov.pl",
"wzmiuw.gov.pl",
"piw.gov.pl",
"wiw.gov.pl",
"griw.gov.pl",
"wif.gov.pl",
"oum.gov.pl",
"sdn.gov.pl",
"zp.gov.pl",
"uppo.gov.pl",
"mup.gov.pl",
"wuoz.gov.pl",
"konsulat.gov.pl",
"oirm.gov.pl",
"augustow.pl",
"babia-gora.pl",
"bedzin.pl",
"beskidy.pl",
"bialowieza.pl",
"bialystok.pl",
"bielawa.pl",
"bieszczady.pl",
"boleslawiec.pl",
"bydgoszcz.pl",
"bytom.pl",
"cieszyn.pl",
"czeladz.pl",
"czest.pl",
"dlugoleka.pl",
"elblag.pl",
"elk.pl",
"glogow.pl",
"gniezno.pl",
"gorlice.pl",
"grajewo.pl",
"ilawa.pl",
"jaworzno.pl",
"jelenia-gora.pl",
"jgora.pl",
"kalisz.pl",
"kazimierz-dolny.pl",
"karpacz.pl",
"kartuzy.pl",
"kaszuby.pl",
"katowice.pl",
"kepno.pl",
"ketrzyn.pl",
"klodzko.pl",
"kobierzyce.pl",
"kolobrzeg.pl",
"konin.pl",
"konskowola.pl",
"kutno.pl",
"lapy.pl",
"lebork.pl",
"legnica.pl",
"lezajsk.pl",
"limanowa.pl",
"lomza.pl",
"lowicz.pl",
"lubin.pl",
"lukow.pl",
"malbork.pl",
"malopolska.pl",
"mazowsze.pl",
"mazury.pl",
"mielec.pl",
"mielno.pl",
"mragowo.pl",
"naklo.pl",
"nowaruda.pl",
"nysa.pl",
"olawa.pl",
"olecko.pl",
"olkusz.pl",
"olsztyn.pl",
"opoczno.pl",
"opole.pl",
"ostroda.pl",
"ostroleka.pl",
"ostrowiec.pl",
"ostrowwlkp.pl",
"pila.pl",
"pisz.pl",
"podhale.pl",
"podlasie.pl",
"polkowice.pl",
"pomorze.pl",
"pomorskie.pl",
"prochowice.pl",
"pruszkow.pl",
"przeworsk.pl",
"pulawy.pl",
"radom.pl",
"rawa-maz.pl",
"rybnik.pl",
"rzeszow.pl",
"sanok.pl",
"sejny.pl",
"slask.pl",
"slupsk.pl",
"sosnowiec.pl",
"stalowa-wola.pl",
"skoczow.pl",
"starachowice.pl",
"stargard.pl",
"suwalki.pl",
"swidnica.pl",
"swiebodzin.pl",
"swinoujscie.pl",
"szczecin.pl",
"szczytno.pl",
"tarnobrzeg.pl",
"tgory.pl",
"turek.pl",
"tychy.pl",
"ustka.pl",
"walbrzych.pl",
"warmia.pl",
"warszawa.pl",
"waw.pl",
"wegrow.pl",
"wielun.pl",
"wlocl.pl",
"wloclawek.pl",
"wodzislaw.pl",
"wolomin.pl",
"wroclaw.pl",
"zachpomor.pl",
"zagan.pl",
"zarow.pl",
"zgora.pl",
"zgorzelec.pl",
"pm",
"pn",
"gov.pn",
"co.pn",
"org.pn",
"edu.pn",
"net.pn",
"post",
"pr",
"com.pr",
"net.pr",
"org.pr",
"gov.pr",
"edu.pr",
"isla.pr",
"pro.pr",
"biz.pr",
"info.pr",
"name.pr",
"est.pr",
"prof.pr",
"ac.pr",
"pro",
"aaa.pro",
"aca.pro",
"acct.pro",
"avocat.pro",
"bar.pro",
"cpa.pro",
"eng.pro",
"jur.pro",
"law.pro",
"med.pro",
"recht.pro",
"ps",
"edu.ps",
"gov.ps",
"sec.ps",
"plo.ps",
"com.ps",
"org.ps",
"net.ps",
"pt",
"net.pt",
"gov.pt",
"org.pt",
"edu.pt",
"int.pt",
"publ.pt",
"com.pt",
"nome.pt",
"pw",
"co.pw",
"ne.pw",
"or.pw",
"ed.pw",
"go.pw",
"belau.pw",
"py",
"com.py",
"coop.py",
"edu.py",
"gov.py",
"mil.py",
"net.py",
"org.py",
"qa",
"com.qa",
"edu.qa",
"gov.qa",
"mil.qa",
"name.qa",
"net.qa",
"org.qa",
"sch.qa",
"re",
"asso.re",
"com.re",
"nom.re",
"ro",
"arts.ro",
"com.ro",
"firm.ro",
"info.ro",
"nom.ro",
"nt.ro",
"org.ro",
"rec.ro",
"store.ro",
"tm.ro",
"www.ro",
"rs",
"ac.rs",
"co.rs",
"edu.rs",
"gov.rs",
"in.rs",
"org.rs",
"ru",
"rw",
"ac.rw",
"co.rw",
"coop.rw",
"gov.rw",
"mil.rw",
"net.rw",
"org.rw",
"sa",
"com.sa",
"net.sa",
"org.sa",
"gov.sa",
"med.sa",
"pub.sa",
"edu.sa",
"sch.sa",
"sb",
"com.sb",
"edu.sb",
"gov.sb",
"net.sb",
"org.sb",
"sc",
"com.sc",
"gov.sc",
"net.sc",
"org.sc",
"edu.sc",
"sd",
"com.sd",
"net.sd",
"org.sd",
"edu.sd",
"med.sd",
"tv.sd",
"gov.sd",
"info.sd",
"se",
"a.se",
"ac.se",
"b.se",
"bd.se",
"brand.se",
"c.se",
"d.se",
"e.se",
"f.se",
"fh.se",
"fhsk.se",
"fhv.se",
"g.se",
"h.se",
"i.se",
"k.se",
"komforb.se",
"kommunalforbund.se",
"komvux.se",
"l.se",
"lanbib.se",
"m.se",
"n.se",
"naturbruksgymn.se",
"o.se",
"org.se",
"p.se",
"parti.se",
"pp.se",
"press.se",
"r.se",
"s.se",
"t.se",
"tm.se",
"u.se",
"w.se",
"x.se",
"y.se",
"z.se",
"sg",
"com.sg",
"net.sg",
"org.sg",
"gov.sg",
"edu.sg",
"per.sg",
"sh",
"com.sh",
"net.sh",
"gov.sh",
"org.sh",
"mil.sh",
"si",
"sj",
"sk",
"sl",
"com.sl",
"net.sl",
"edu.sl",
"gov.sl",
"org.sl",
"sm",
"sn",
"art.sn",
"com.sn",
"edu.sn",
"gouv.sn",
"org.sn",
"perso.sn",
"univ.sn",
"so",
"com.so",
"edu.so",
"gov.so",
"me.so",
"net.so",
"org.so",
"sr",
"ss",
"biz.ss",
"com.ss",
"edu.ss",
"gov.ss",
"me.ss",
"net.ss",
"org.ss",
"sch.ss",
"st",
"co.st",
"com.st",
"consulado.st",
"edu.st",
"embaixada.st",
"mil.st",
"net.st",
"org.st",
"principe.st",
"saotome.st",
"store.st",
"su",
"sv",
"com.sv",
"edu.sv",
"gob.sv",
"org.sv",
"red.sv",
"sx",
"gov.sx",
"sy",
"edu.sy",
"gov.sy",
"net.sy",
"mil.sy",
"com.sy",
"org.sy",
"sz",
"co.sz",
"ac.sz",
"org.sz",
"tc",
"td",
"tel",
"tf",
"tg",
"th",
"ac.th",
"co.th",
"go.th",
"in.th",
"mi.th",
"net.th",
"or.th",
"tj",
"ac.tj",
"biz.tj",
"co.tj",
"com.tj",
"edu.tj",
"go.tj",
"gov.tj",
"int.tj",
"mil.tj",
"name.tj",
"net.tj",
"nic.tj",
"org.tj",
"test.tj",
"web.tj",
"tk",
"tl",
"gov.tl",
"tm",
"com.tm",
"co.tm",
"org.tm",
"net.tm",
"nom.tm",
"gov.tm",
"mil.tm",
"edu.tm",
"tn",
"com.tn",
"ens.tn",
"fin.tn",
"gov.tn",
"ind.tn",
"info.tn",
"intl.tn",
"mincom.tn",
"nat.tn",
"net.tn",
"org.tn",
"perso.tn",
"tourism.tn",
"to",
"com.to",
"gov.to",
"net.to",
"org.to",
"edu.to",
"mil.to",
"tr",
"av.tr",
"bbs.tr",
"bel.tr",
"biz.tr",
"com.tr",
"dr.tr",
"edu.tr",
"gen.tr",
"gov.tr",
"info.tr",
"mil.tr",
"k12.tr",
"kep.tr",
"name.tr",
"net.tr",
"org.tr",
"pol.tr",
"tel.tr",
"tsk.tr",
"tv.tr",
"web.tr",
"nc.tr",
"gov.nc.tr",
"tt",
"co.tt",
"com.tt",
"org.tt",
"net.tt",
"biz.tt",
"info.tt",
"pro.tt",
"int.tt",
"coop.tt",
"jobs.tt",
"mobi.tt",
"travel.tt",
"museum.tt",
"aero.tt",
"name.tt",
"gov.tt",
"edu.tt",
"tv",
"tw",
"edu.tw",
"gov.tw",
"mil.tw",
"com.tw",
"net.tw",
"org.tw",
"idv.tw",
"game.tw",
"ebiz.tw",
"club.tw",
"網路.tw",
"組織.tw",
"商業.tw",
"tz",
"ac.tz",
"co.tz",
"go.tz",
"hotel.tz",
"info.tz",
"me.tz",
"mil.tz",
"mobi.tz",
"ne.tz",
"or.tz",
"sc.tz",
"tv.tz",
"ua",
"com.ua",
"edu.ua",
"gov.ua",
"in.ua",
"net.ua",
"org.ua",
"cherkassy.ua",
"cherkasy.ua",
"chernigov.ua",
"chernihiv.ua",
"chernivtsi.ua",
"chernovtsy.ua",
"ck.ua",
"cn.ua",
"cr.ua",
"crimea.ua",
"cv.ua",
"dn.ua",
"dnepropetrovsk.ua",
"dnipropetrovsk.ua",
"donetsk.ua",
"dp.ua",
"if.ua",
"ivano-frankivsk.ua",
"kh.ua",
"kharkiv.ua",
"kharkov.ua",
"kherson.ua",
"khmelnitskiy.ua",
"khmelnytskyi.ua",
"kiev.ua",
"kirovograd.ua",
"km.ua",
"kr.ua",
"krym.ua",
"ks.ua",
"kv.ua",
"kyiv.ua",
"lg.ua",
"lt.ua",
"lugansk.ua",
"lutsk.ua",
"lv.ua",
"lviv.ua",
"mk.ua",
"mykolaiv.ua",
"nikolaev.ua",
"od.ua",
"odesa.ua",
"odessa.ua",
"pl.ua",
"poltava.ua",
"rivne.ua",
"rovno.ua",
"rv.ua",
"sb.ua",
"sebastopol.ua",
"sevastopol.ua",
"sm.ua",
"sumy.ua",
"te.ua",
"ternopil.ua",
"uz.ua",
"uzhgorod.ua",
"vinnica.ua",
"vinnytsia.ua",
"vn.ua",
"volyn.ua",
"yalta.ua",
"zaporizhzhe.ua",
"zaporizhzhia.ua",
"zhitomir.ua",
"zhytomyr.ua",
"zp.ua",
"zt.ua",
"ug",
"co.ug",
"or.ug",
"ac.ug",
"sc.ug",
"go.ug",
"ne.ug",
"com.ug",
"org.ug",
"uk",
"ac.uk",
"co.uk",
"gov.uk",
"ltd.uk",
"me.uk",
"net.uk",
"nhs.uk",
"org.uk",
"plc.uk",
"police.uk",
"*.sch.uk",
"us",
"dni.us",
"fed.us",
"isa.us",
"kids.us",
"nsn.us",
"ak.us",
"al.us",
"ar.us",
"as.us",
"az.us",
"ca.us",
"co.us",
"ct.us",
"dc.us",
"de.us",
"fl.us",
"ga.us",
"gu.us",
"hi.us",
"ia.us",
"id.us",
"il.us",
"in.us",
"ks.us",
"ky.us",
"la.us",
"ma.us",
"md.us",
"me.us",
"mi.us",
"mn.us",
"mo.us",
"ms.us",
"mt.us",
"nc.us",
"nd.us",
"ne.us",
"nh.us",
"nj.us",
"nm.us",
"nv.us",
"ny.us",
"oh.us",
"ok.us",
"or.us",
"pa.us",
"pr.us",
"ri.us",
"sc.us",
"sd.us",
"tn.us",
"tx.us",
"ut.us",
"vi.us",
"vt.us",
"va.us",
"wa.us",
"wi.us",
"wv.us",
"wy.us",
"k12.ak.us",
"k12.al.us",
"k12.ar.us",
"k12.as.us",
"k12.az.us",
"k12.ca.us",
"k12.co.us",
"k12.ct.us",
"k12.dc.us",
"k12.de.us",
"k12.fl.us",
"k12.ga.us",
"k12.gu.us",
"k12.ia.us",
"k12.id.us",
"k12.il.us",
"k12.in.us",
"k12.ks.us",
"k12.ky.us",
"k12.la.us",
"k12.ma.us",
"k12.md.us",
"k12.me.us",
"k12.mi.us",
"k12.mn.us",
"k12.mo.us",
"k12.ms.us",
"k12.mt.us",
"k12.nc.us",
"k12.ne.us",
"k12.nh.us",
"k12.nj.us",
"k12.nm.us",
"k12.nv.us",
"k12.ny.us",
"k12.oh.us",
"k12.ok.us",
"k12.or.us",
"k12.pa.us",
"k12.pr.us",
"k12.sc.us",
"k12.tn.us",
"k12.tx.us",
"k12.ut.us",
"k12.vi.us",
"k12.vt.us",
"k12.va.us",
"k12.wa.us",
"k12.wi.us",
"k12.wy.us",
"cc.ak.us",
"cc.al.us",
"cc.ar.us",
"cc.as.us",
"cc.az.us",
"cc.ca.us",
"cc.co.us",
"cc.ct.us",
"cc.dc.us",
"cc.de.us",
"cc.fl.us",
"cc.ga.us",
"cc.gu.us",
"cc.hi.us",
"cc.ia.us",
"cc.id.us",
"cc.il.us",
"cc.in.us",
"cc.ks.us",
"cc.ky.us",
"cc.la.us",
"cc.ma.us",
"cc.md.us",
"cc.me.us",
"cc.mi.us",
"cc.mn.us",
"cc.mo.us",
"cc.ms.us",
"cc.mt.us",
"cc.nc.us",
"cc.nd.us",
"cc.ne.us",
"cc.nh.us",
"cc.nj.us",
"cc.nm.us",
"cc.nv.us",
"cc.ny.us",
"cc.oh.us",
"cc.ok.us",
"cc.or.us",
"cc.pa.us",
"cc.pr.us",
"cc.ri.us",
"cc.sc.us",
"cc.sd.us",
"cc.tn.us",
"cc.tx.us",
"cc.ut.us",
"cc.vi.us",
"cc.vt.us",
"cc.va.us",
"cc.wa.us",
"cc.wi.us",
"cc.wv.us",
"cc.wy.us",
"lib.ak.us",
"lib.al.us",
"lib.ar.us",
"lib.as.us",
"lib.az.us",
"lib.ca.us",
"lib.co.us",
"lib.ct.us",
"lib.dc.us",
"lib.fl.us",
"lib.ga.us",
"lib.gu.us",
"lib.hi.us",
"lib.ia.us",
"lib.id.us",
"lib.il.us",
"lib.in.us",
"lib.ks.us",
"lib.ky.us",
"lib.la.us",
"lib.ma.us",
"lib.md.us",
"lib.me.us",
"lib.mi.us",
"lib.mn.us",
"lib.mo.us",
"lib.ms.us",
"lib.mt.us",
"lib.nc.us",
"lib.nd.us",
"lib.ne.us",
"lib.nh.us",
"lib.nj.us",
"lib.nm.us",
"lib.nv.us",
"lib.ny.us",
"lib.oh.us",
"lib.ok.us",
"lib.or.us",
"lib.pa.us",
"lib.pr.us",
"lib.ri.us",
"lib.sc.us",
"lib.sd.us",
"lib.tn.us",
"lib.tx.us",
"lib.ut.us",
"lib.vi.us",
"lib.vt.us",
"lib.va.us",
"lib.wa.us",
"lib.wi.us",
"lib.wy.us",
"pvt.k12.ma.us",
"chtr.k12.ma.us",
"paroch.k12.ma.us",
"ann-arbor.mi.us",
"cog.mi.us",
"dst.mi.us",
"eaton.mi.us",
"gen.mi.us",
"mus.mi.us",
"tec.mi.us",
"washtenaw.mi.us",
"uy",
"com.uy",
"edu.uy",
"gub.uy",
"mil.uy",
"net.uy",
"org.uy",
"uz",
"co.uz",
"com.uz",
"net.uz",
"org.uz",
"va",
"vc",
"com.vc",
"net.vc",
"org.vc",
"gov.vc",
"mil.vc",
"edu.vc",
"ve",
"arts.ve",
"bib.ve",
"co.ve",
"com.ve",
"e12.ve",
"edu.ve",
"firm.ve",
"gob.ve",
"gov.ve",
"info.ve",
"int.ve",
"mil.ve",
"net.ve",
"nom.ve",
"org.ve",
"rar.ve",
"rec.ve",
"store.ve",
"tec.ve",
"web.ve",
"vg",
"vi",
"co.vi",
"com.vi",
"k12.vi",
"net.vi",
"org.vi",
"vn",
"com.vn",
"net.vn",
"org.vn",
"edu.vn",
"gov.vn",
"int.vn",
"ac.vn",
"biz.vn",
"info.vn",
"name.vn",
"pro.vn",
"health.vn",
"vu",
"com.vu",
"edu.vu",
"net.vu",
"org.vu",
"wf",
"ws",
"com.ws",
"net.ws",
"org.ws",
"gov.ws",
"edu.ws",
"yt",
"امارات",
"հայ",
"বাংলা",
"бг",
"البحرين",
"бел",
"中国",
"中國",
"الجزائر",
"مصر",
"ею",
"ευ",
"موريتانيا",
"გე",
"ελ",
"香港",
"公司.香港",
"教育.香港",
"政府.香港",
"個人.香港",
"網絡.香港",
"組織.香港",
"ಭಾರತ",
"ଭାରତ",
"ভাৰত",
"भारतम्",
"भारोत",
"ڀارت",
"ഭാരതം",
"भारत",
"بارت",
"بھارت",
"భారత్",
"ભારત",
"ਭਾਰਤ",
"ভারত",
"இந்தியா",
"ایران",
"ايران",
"عراق",
"الاردن",
"한국",
"қаз",
"ລາວ",
"ලංකා",
"இலங்கை",
"المغرب",
"мкд",
"мон",
"澳門",
"澳门",
"مليسيا",
"عمان",
"پاکستان",
"پاكستان",
"فلسطين",
"срб",
"пр.срб",
"орг.срб",
"обр.срб",
"од.срб",
"упр.срб",
"ак.срб",
"рф",
"قطر",
"السعودية",
"السعودیة",
"السعودیۃ",
"السعوديه",
"سودان",
"新加坡",
"சிங்கப்பூர்",
"سورية",
"سوريا",
"ไทย",
"ศึกษา.ไทย",
"ธุรกิจ.ไทย",
"รัฐบาล.ไทย",
"ทหาร.ไทย",
"เน็ต.ไทย",
"องค์กร.ไทย",
"تونس",
"台灣",
"台湾",
"臺灣",
"укр",
"اليمن",
"xxx",
"ye",
"com.ye",
"edu.ye",
"gov.ye",
"net.ye",
"mil.ye",
"org.ye",
"ac.za",
"agric.za",
"alt.za",
"co.za",
"edu.za",
"gov.za",
"grondar.za",
"law.za",
"mil.za",
"net.za",
"ngo.za",
"nic.za",
"nis.za",
"nom.za",
"org.za",
"school.za",
"tm.za",
"web.za",
"zm",
"ac.zm",
"biz.zm",
"co.zm",
"com.zm",
"edu.zm",
"gov.zm",
"info.zm",
"mil.zm",
"net.zm",
"org.zm",
"sch.zm",
"zw",
"ac.zw",
"co.zw",
"gov.zw",
"mil.zw",
"org.zw",
"aaa",
"aarp",
"abarth",
"abb",
"abbott",
"abbvie",
"abc",
"able",
"abogado",
"abudhabi",
"academy",
"accenture",
"accountant",
"accountants",
"aco",
"actor",
"adac",
"ads",
"adult",
"aeg",
"aetna",
"afl",
"africa",
"agakhan",
"agency",
"aig",
"airbus",
"airforce",
"airtel",
"akdn",
"alfaromeo",
"alibaba",
"alipay",
"allfinanz",
"allstate",
"ally",
"alsace",
"alstom",
"amazon",
"americanexpress",
"americanfamily",
"amex",
"amfam",
"amica",
"amsterdam",
"analytics",
"android",
"anquan",
"anz",
"aol",
"apartments",
"app",
"apple",
"aquarelle",
"arab",
"aramco",
"archi",
"army",
"art",
"arte",
"asda",
"associates",
"athleta",
"attorney",
"auction",
"audi",
"audible",
"audio",
"auspost",
"author",
"auto",
"autos",
"avianca",
"aws",
"axa",
"azure",
"baby",
"baidu",
"banamex",
"bananarepublic",
"band",
"bank",
"bar",
"barcelona",
"barclaycard",
"barclays",
"barefoot",
"bargains",
"baseball",
"basketball",
"bauhaus",
"bayern",
"bbc",
"bbt",
"bbva",
"bcg",
"bcn",
"beats",
"beauty",
"beer",
"bentley",
"berlin",
"best",
"bestbuy",
"bet",
"bharti",
"bible",
"bid",
"bike",
"bing",
"bingo",
"bio",
"black",
"blackfriday",
"blockbuster",
"blog",
"bloomberg",
"blue",
"bms",
"bmw",
"bnpparibas",
"boats",
"boehringer",
"bofa",
"bom",
"bond",
"boo",
"book",
"booking",
"bosch",
"bostik",
"boston",
"bot",
"boutique",
"box",
"bradesco",
"bridgestone",
"broadway",
"broker",
"brother",
"brussels",
"bugatti",
"build",
"builders",
"business",
"buy",
"buzz",
"bzh",
"cab",
"cafe",
"cal",
"call",
"calvinklein",
"cam",
"camera",
"camp",
"cancerresearch",
"canon",
"capetown",
"capital",
"capitalone",
"car",
"caravan",
"cards",
"care",
"career",
"careers",
"cars",
"casa",
"case",
"cash",
"casino",
"catering",
"catholic",
"cba",
"cbn",
"cbre",
"cbs",
"center",
"ceo",
"cern",
"cfa",
"cfd",
"chanel",
"channel",
"charity",
"chase",
"chat",
"cheap",
"chintai",
"christmas",
"chrome",
"church",
"cipriani",
"circle",
"cisco",
"citadel",
"citi",
"citic",
"city",
"cityeats",
"claims",
"cleaning",
"click",
"clinic",
"clinique",
"clothing",
"cloud",
"club",
"clubmed",
"coach",
"codes",
"coffee",
"college",
"cologne",
"comcast",
"commbank",
"community",
"company",
"compare",
"computer",
"comsec",
"condos",
"construction",
"consulting",
"contact",
"contractors",
"cooking",
"cookingchannel",
"cool",
"corsica",
"country",
"coupon",
"coupons",
"courses",
"cpa",
"credit",
"creditcard",
"creditunion",
"cricket",
"crown",
"crs",
"cruise",
"cruises",
"cuisinella",
"cymru",
"cyou",
"dabur",
"dad",
"dance",
"data",
"date",
"dating",
"datsun",
"day",
"dclk",
"dds",
"deal",
"dealer",
"deals",
"degree",
"delivery",
"dell",
"deloitte",
"delta",
"democrat",
"dental",
"dentist",
"desi",
"design",
"dev",
"dhl",
"diamonds",
"diet",
"digital",
"direct",
"directory",
"discount",
"discover",
"dish",
"diy",
"dnp",
"docs",
"doctor",
"dog",
"domains",
"dot",
"download",
"drive",
"dtv",
"dubai",
"dunlop",
"dupont",
"durban",
"dvag",
"dvr",
"earth",
"eat",
"eco",
"edeka",
"education",
"email",
"emerck",
"energy",
"engineer",
"engineering",
"enterprises",
"epson",
"equipment",
"ericsson",
"erni",
"esq",
"estate",
"etisalat",
"eurovision",
"eus",
"events",
"exchange",
"expert",
"exposed",
"express",
"extraspace",
"fage",
"fail",
"fairwinds",
"faith",
"family",
"fan",
"fans",
"farm",
"farmers",
"fashion",
"fast",
"fedex",
"feedback",
"ferrari",
"ferrero",
"fiat",
"fidelity",
"fido",
"film",
"final",
"finance",
"financial",
"fire",
"firestone",
"firmdale",
"fish",
"fishing",
"fit",
"fitness",
"flickr",
"flights",
"flir",
"florist",
"flowers",
"fly",
"foo",
"food",
"foodnetwork",
"football",
"ford",
"forex",
"forsale",
"forum",
"foundation",
"fox",
"free",
"fresenius",
"frl",
"frogans",
"frontdoor",
"frontier",
"ftr",
"fujitsu",
"fun",
"fund",
"furniture",
"futbol",
"fyi",
"gal",
"gallery",
"gallo",
"gallup",
"game",
"games",
"gap",
"garden",
"gay",
"gbiz",
"gdn",
"gea",
"gent",
"genting",
"george",
"ggee",
"gift",
"gifts",
"gives",
"giving",
"glass",
"gle",
"global",
"globo",
"gmail",
"gmbh",
"gmo",
"gmx",
"godaddy",
"gold",
"goldpoint",
"golf",
"goo",
"goodyear",
"goog",
"google",
"gop",
"got",
"grainger",
"graphics",
"gratis",
"green",
"gripe",
"grocery",
"group",
"guardian",
"gucci",
"guge",
"guide",
"guitars",
"guru",
"hair",
"hamburg",
"hangout",
"haus",
"hbo",
"hdfc",
"hdfcbank",
"health",
"healthcare",
"help",
"helsinki",
"here",
"hermes",
"hgtv",
"hiphop",
"hisamitsu",
"hitachi",
"hiv",
"hkt",
"hockey",
"holdings",
"holiday",
"homedepot",
"homegoods",
"homes",
"homesense",
"honda",
"horse",
"hospital",
"host",
"hosting",
"hot",
"hoteles",
"hotels",
"hotmail",
"house",
"how",
"hsbc",
"hughes",
"hyatt",
"hyundai",
"ibm",
"icbc",
"ice",
"icu",
"ieee",
"ifm",
"ikano",
"imamat",
"imdb",
"immo",
"immobilien",
"inc",
"industries",
"infiniti",
"ing",
"ink",
"institute",
"insurance",
"insure",
"international",
"intuit",
"investments",
"ipiranga",
"irish",
"ismaili",
"ist",
"istanbul",
"itau",
"itv",
"jaguar",
"java",
"jcb",
"jeep",
"jetzt",
"jewelry",
"jio",
"jll",
"jmp",
"jnj",
"joburg",
"jot",
"joy",
"jpmorgan",
"jprs",
"juegos",
"juniper",
"kaufen",
"kddi",
"kerryhotels",
"kerrylogistics",
"kerryproperties",
"kfh",
"kia",
"kids",
"kim",
"kinder",
"kindle",
"kitchen",
"kiwi",
"koeln",
"komatsu",
"kosher",
"kpmg",
"kpn",
"krd",
"kred",
"kuokgroup",
"kyoto",
"lacaixa",
"lamborghini",
"lamer",
"lancaster",
"lancia",
"land",
"landrover",
"lanxess",
"lasalle",
"lat",
"latino",
"latrobe",
"law",
"lawyer",
"lds",
"lease",
"leclerc",
"lefrak",
"legal",
"lego",
"lexus",
"lgbt",
"lidl",
"life",
"lifeinsurance",
"lifestyle",
"lighting",
"like",
"lilly",
"limited",
"limo",
"lincoln",
"linde",
"link",
"lipsy",
"live",
"living",
"llc",
"llp",
"loan",
"loans",
"locker",
"locus",
"loft",
"lol",
"london",
"lotte",
"lotto",
"love",
"lpl",
"lplfinancial",
"ltd",
"ltda",
"lundbeck",
"luxe",
"luxury",
"macys",
"madrid",
"maif",
"maison",
"makeup",
"man",
"management",
"mango",
"map",
"market",
"marketing",
"markets",
"marriott",
"marshalls",
"maserati",
"mattel",
"mba",
"mckinsey",
"med",
"media",
"meet",
"melbourne",
"meme",
"memorial",
"men",
"menu",
"merckmsd",
"miami",
"microsoft",
"mini",
"mint",
"mit",
"mitsubishi",
"mlb",
"mls",
"mma",
"mobile",
"moda",
"moe",
"moi",
"mom",
"monash",
"money",
"monster",
"mormon",
"mortgage",
"moscow",
"moto",
"motorcycles",
"mov",
"movie",
"msd",
"mtn",
"mtr",
"music",
"mutual",
"nab",
"nagoya",
"natura",
"navy",
"nba",
"nec",
"netbank",
"netflix",
"network",
"neustar",
"new",
"news",
"next",
"nextdirect",
"nexus",
"nfl",
"ngo",
"nhk",
"nico",
"nike",
"nikon",
"ninja",
"nissan",
"nissay",
"nokia",
"northwesternmutual",
"norton",
"now",
"nowruz",
"nowtv",
"nra",
"nrw",
"ntt",
"nyc",
"obi",
"observer",
"office",
"okinawa",
"olayan",
"olayangroup",
"oldnavy",
"ollo",
"omega",
"one",
"ong",
"onl",
"online",
"ooo",
"open",
"oracle",
"orange",
"organic",
"origins",
"osaka",
"otsuka",
"ott",
"ovh",
"page",
"panasonic",
"paris",
"pars",
"partners",
"parts",
"party",
"passagens",
"pay",
"pccw",
"pet",
"pfizer",
"pharmacy",
"phd",
"philips",
"phone",
"photo",
"photography",
"photos",
"physio",
"pics",
"pictet",
"pictures",
"pid",
"pin",
"ping",
"pink",
"pioneer",
"pizza",
"place",
"play",
"playstation",
"plumbing",
"plus",
"pnc",
"pohl",
"poker",
"politie",
"porn",
"pramerica",
"praxi",
"press",
"prime",
"prod",
"productions",
"prof",
"progressive",
"promo",
"properties",
"property",
"protection",
"pru",
"prudential",
"pub",
"pwc",
"qpon",
"quebec",
"quest",
"racing",
"radio",
"read",
"realestate",
"realtor",
"realty",
"recipes",
"red",
"redstone",
"redumbrella",
"rehab",
"reise",
"reisen",
"reit",
"reliance",
"ren",
"rent",
"rentals",
"repair",
"report",
"republican",
"rest",
"restaurant",
"review",
"reviews",
"rexroth",
"rich",
"richardli",
"ricoh",
"ril",
"rio",
"rip",
"rocher",
"rocks",
"rodeo",
"rogers",
"room",
"rsvp",
"rugby",
"ruhr",
"run",
"rwe",
"ryukyu",
"saarland",
"safe",
"safety",
"sakura",
"sale",
"salon",
"samsclub",
"samsung",
"sandvik",
"sandvikcoromant",
"sanofi",
"sap",
"sarl",
"sas",
"save",
"saxo",
"sbi",
"sbs",
"sca",
"scb",
"schaeffler",
"schmidt",
"scholarships",
"school",
"schule",
"schwarz",
"science",
"scot",
"search",
"seat",
"secure",
"security",
"seek",
"select",
"sener",
"services",
"ses",
"seven",
"sew",
"sex",
"sexy",
"sfr",
"shangrila",
"sharp",
"shaw",
"shell",
"shia",
"shiksha",
"shoes",
"shop",
"shopping",
"shouji",
"show",
"showtime",
"silk",
"sina",
"singles",
"site",
"ski",
"skin",
"sky",
"skype",
"sling",
"smart",
"smile",
"sncf",
"soccer",
"social",
"softbank",
"software",
"sohu",
"solar",
"solutions",
"song",
"sony",
"soy",
"spa",
"space",
"sport",
"spot",
"srl",
"stada",
"staples",
"star",
"statebank",
"statefarm",
"stc",
"stcgroup",
"stockholm",
"storage",
"store",
"stream",
"studio",
"study",
"style",
"sucks",
"supplies",
"supply",
"support",
"surf",
"surgery",
"suzuki",
"swatch",
"swiss",
"sydney",
"systems",
"tab",
"taipei",
"talk",
"taobao",
"target",
"tatamotors",
"tatar",
"tattoo",
"tax",
"taxi",
"tci",
"tdk",
"team",
"tech",
"technology",
"temasek",
"tennis",
"teva",
"thd",
"theater",
"theatre",
"tiaa",
"tickets",
"tienda",
"tiffany",
"tips",
"tires",
"tirol",
"tjmaxx",
"tjx",
"tkmaxx",
"tmall",
"today",
"tokyo",
"tools",
"top",
"toray",
"toshiba",
"total",
"tours",
"town",
"toyota",
"toys",
"trade",
"trading",
"training",
"travel",
"travelchannel",
"travelers",
"travelersinsurance",
"trust",
"trv",
"tube",
"tui",
"tunes",
"tushu",
"tvs",
"ubank",
"ubs",
"unicom",
"university",
"uno",
"uol",
"ups",
"vacations",
"vana",
"vanguard",
"vegas",
"ventures",
"verisign",
"versicherung",
"vet",
"viajes",
"video",
"vig",
"viking",
"villas",
"vin",
"vip",
"virgin",
"visa",
"vision",
"viva",
"vivo",
"vlaanderen",
"vodka",
"volkswagen",
"volvo",
"vote",
"voting",
"voto",
"voyage",
"vuelos",
"wales",
"walmart",
"walter",
"wang",
"wanggou",
"watch",
"watches",
"weather",
"weatherchannel",
"webcam",
"weber",
"website",
"wedding",
"weibo",
"weir",
"whoswho",
"wien",
"wiki",
"williamhill",
"win",
"windows",
"wine",
"winners",
"wme",
"wolterskluwer",
"woodside",
"work",
"works",
"world",
"wow",
"wtc",
"wtf",
"xbox",
"xerox",
"xfinity",
"xihuan",
"xin",
"कॉम",
"セール",
"佛山",
"慈善",
"集团",
"在线",
"点看",
"คอม",
"八卦",
"موقع",
"公益",
"公司",
"香格里拉",
"网站",
"移动",
"我爱你",
"москва",
"католик",
"онлайн",
"сайт",
"联通",
"קום",
"时尚",
"微博",
"淡马锡",
"ファッション",
"орг",
"नेट",
"ストア",
"アマゾン",
"삼성",
"商标",
"商店",
"商城",
"дети",
"ポイント",
"新闻",
"家電",
"كوم",
"中文网",
"中信",
"娱乐",
"谷歌",
"電訊盈科",
"购物",
"クラウド",
"通販",
"网店",
"संगठन",
"餐厅",
"网络",
"ком",
"亚马逊",
"诺基亚",
"食品",
"飞利浦",
"手机",
"ارامكو",
"العليان",
"اتصالات",
"بازار",
"ابوظبي",
"كاثوليك",
"همراه",
"닷컴",
"政府",
"شبكة",
"بيتك",
"عرب",
"机构",
"组织机构",
"健康",
"招聘",
"рус",
"大拿",
"みんな",
"グーグル",
"世界",
"書籍",
"网址",
"닷넷",
"コム",
"天主教",
"游戏",
"vermögensberater",
"vermögensberatung",
"企业",
"信息",
"嘉里大酒店",
"嘉里",
"广东",
"政务",
"xyz",
"yachts",
"yahoo",
"yamaxun",
"yandex",
"yodobashi",
"yoga",
"yokohama",
"you",
"youtube",
"yun",
"zappos",
"zara",
"zero",
"zip",
"zone",
"zuerich",
"cc.ua",
"inf.ua",
"ltd.ua",
"611.to",
"graphox.us",
"*.devcdnaccesso.com",
"adobeaemcloud.com",
"*.dev.adobeaemcloud.com",
"hlx.live",
"adobeaemcloud.net",
"hlx.page",
"hlx3.page",
"beep.pl",
"airkitapps.com",
"airkitapps-au.com",
"airkitapps.eu",
"aivencloud.com",
"barsy.ca",
"*.compute.estate",
"*.alces.network",
"kasserver.com",
"altervista.org",
"alwaysdata.net",
"cloudfront.net",
"*.compute.amazonaws.com",
"*.compute-1.amazonaws.com",
"*.compute.amazonaws.com.cn",
"us-east-1.amazonaws.com",
"cn-north-1.eb.amazonaws.com.cn",
"cn-northwest-1.eb.amazonaws.com.cn",
"elasticbeanstalk.com",
"ap-northeast-1.elasticbeanstalk.com",
"ap-northeast-2.elasticbeanstalk.com",
"ap-northeast-3.elasticbeanstalk.com",
"ap-south-1.elasticbeanstalk.com",
"ap-southeast-1.elasticbeanstalk.com",
"ap-southeast-2.elasticbeanstalk.com",
"ca-central-1.elasticbeanstalk.com",
"eu-central-1.elasticbeanstalk.com",
"eu-west-1.elasticbeanstalk.com",
"eu-west-2.elasticbeanstalk.com",
"eu-west-3.elasticbeanstalk.com",
"sa-east-1.elasticbeanstalk.com",
"us-east-1.elasticbeanstalk.com",
"us-east-2.elasticbeanstalk.com",
"us-gov-west-1.elasticbeanstalk.com",
"us-west-1.elasticbeanstalk.com",
"us-west-2.elasticbeanstalk.com",
"*.elb.amazonaws.com",
"*.elb.amazonaws.com.cn",
"awsglobalaccelerator.com",
"s3.amazonaws.com",
"s3-ap-northeast-1.amazonaws.com",
"s3-ap-northeast-2.amazonaws.com",
"s3-ap-south-1.amazonaws.com",
"s3-ap-southeast-1.amazonaws.com",
"s3-ap-southeast-2.amazonaws.com",
"s3-ca-central-1.amazonaws.com",
"s3-eu-central-1.amazonaws.com",
"s3-eu-west-1.amazonaws.com",
"s3-eu-west-2.amazonaws.com",
"s3-eu-west-3.amazonaws.com",
"s3-external-1.amazonaws.com",
"s3-fips-us-gov-west-1.amazonaws.com",
"s3-sa-east-1.amazonaws.com",
"s3-us-gov-west-1.amazonaws.com",
"s3-us-east-2.amazonaws.com",
"s3-us-west-1.amazonaws.com",
"s3-us-west-2.amazonaws.com",
"s3.ap-northeast-2.amazonaws.com",
"s3.ap-south-1.amazonaws.com",
"s3.cn-north-1.amazonaws.com.cn",
"s3.ca-central-1.amazonaws.com",
"s3.eu-central-1.amazonaws.com",
"s3.eu-west-2.amazonaws.com",
"s3.eu-west-3.amazonaws.com",
"s3.us-east-2.amazonaws.com",
"s3.dualstack.ap-northeast-1.amazonaws.com",
"s3.dualstack.ap-northeast-2.amazonaws.com",
"s3.dualstack.ap-south-1.amazonaws.com",
"s3.dualstack.ap-southeast-1.amazonaws.com",
"s3.dualstack.ap-southeast-2.amazonaws.com",
"s3.dualstack.ca-central-1.amazonaws.com",
"s3.dualstack.eu-central-1.amazonaws.com",
"s3.dualstack.eu-west-1.amazonaws.com",
"s3.dualstack.eu-west-2.amazonaws.com",
"s3.dualstack.eu-west-3.amazonaws.com",
"s3.dualstack.sa-east-1.amazonaws.com",
"s3.dualstack.us-east-1.amazonaws.com",
"s3.dualstack.us-east-2.amazonaws.com",
"s3-website-us-east-1.amazonaws.com",
"s3-website-us-west-1.amazonaws.com",
"s3-website-us-west-2.amazonaws.com",
"s3-website-ap-northeast-1.amazonaws.com",
"s3-website-ap-southeast-1.amazonaws.com",
"s3-website-ap-southeast-2.amazonaws.com",
"s3-website-eu-west-1.amazonaws.com",
"s3-website-sa-east-1.amazonaws.com",
"s3-website.ap-northeast-2.amazonaws.com",
"s3-website.ap-south-1.amazonaws.com",
"s3-website.ca-central-1.amazonaws.com",
"s3-website.eu-central-1.amazonaws.com",
"s3-website.eu-west-2.amazonaws.com",
"s3-website.eu-west-3.amazonaws.com",
"s3-website.us-east-2.amazonaws.com",
"t3l3p0rt.net",
"tele.amune.org",
"apigee.io",
"siiites.com",
"appspacehosted.com",
"appspaceusercontent.com",
"appudo.net",
"on-aptible.com",
"user.aseinet.ne.jp",
"gv.vc",
"d.gv.vc",
"user.party.eus",
"pimienta.org",
"poivron.org",
"potager.org",
"sweetpepper.org",
"myasustor.com",
"cdn.prod.atlassian-dev.net",
"translated.page",
"myfritz.net",
"onavstack.net",
"*.awdev.ca",
"*.advisor.ws",
"ecommerce-shop.pl",
"b-data.io",
"backplaneapp.io",
"balena-devices.com",
"rs.ba",
"*.banzai.cloud",
"app.banzaicloud.io",
"*.backyards.banzaicloud.io",
"base.ec",
"official.ec",
"buyshop.jp",
"fashionstore.jp",
"handcrafted.jp",
"kawaiishop.jp",
"supersale.jp",
"theshop.jp",
"shopselect.net",
"base.shop",
"*.beget.app",
"betainabox.com",
"bnr.la",
"bitbucket.io",
"blackbaudcdn.net",
"of.je",
"bluebite.io",
"boomla.net",
"boutir.com",
"boxfuse.io",
"square7.ch",
"bplaced.com",
"bplaced.de",
"square7.de",
"bplaced.net",
"square7.net",
"shop.brendly.rs",
"browsersafetymark.io",
"uk0.bigv.io",
"dh.bytemark.co.uk",
"vm.bytemark.co.uk",
"cafjs.com",
"mycd.eu",
"drr.ac",
"uwu.ai",
"carrd.co",
"crd.co",
"ju.mp",
"ae.org",
"br.com",
"cn.com",
"com.de",
"com.se",
"de.com",
"eu.com",
"gb.net",
"hu.net",
"jp.net",
"jpn.com",
"mex.com",
"ru.com",
"sa.com",
"se.net",
"uk.com",
"uk.net",
"us.com",
"za.bz",
"za.com",
"ar.com",
"hu.com",
"kr.com",
"no.com",
"qc.com",
"uy.com",
"africa.com",
"gr.com",
"in.net",
"web.in",
"us.org",
"co.com",
"aus.basketball",
"nz.basketball",
"radio.am",
"radio.fm",
"c.la",
"certmgr.org",
"cx.ua",
"discourse.group",
"discourse.team",
"cleverapps.io",
"clerk.app",
"clerkstage.app",
"*.lcl.dev",
"*.lclstage.dev",
"*.stg.dev",
"*.stgstage.dev",
"clickrising.net",
"c66.me",
"cloud66.ws",
"cloud66.zone",
"jdevcloud.com",
"wpdevcloud.com",
"cloudaccess.host",
"freesite.host",
"cloudaccess.net",
"cloudcontrolled.com",
"cloudcontrolapp.com",
"*.cloudera.site",
"pages.dev",
"trycloudflare.com",
"workers.dev",
"wnext.app",
"co.ca",
"*.otap.co",
"co.cz",
"c.cdn77.org",
"cdn77-ssl.net",
"r.cdn77.net",
"rsc.cdn77.org",
"ssl.origin.cdn77-secure.org",
"cloudns.asia",
"cloudns.biz",
"cloudns.club",
"cloudns.cc",
"cloudns.eu",
"cloudns.in",
"cloudns.info",
"cloudns.org",
"cloudns.pro",
"cloudns.pw",
"cloudns.us",
"cnpy.gdn",
"codeberg.page",
"co.nl",
"co.no",
"webhosting.be",
"hosting-cluster.nl",
"ac.ru",
"edu.ru",
"gov.ru",
"int.ru",
"mil.ru",
"test.ru",
"dyn.cosidns.de",
"dynamisches-dns.de",
"dnsupdater.de",
"internet-dns.de",
"l-o-g-i-n.de",
"dynamic-dns.info",
"feste-ip.net",
"knx-server.net",
"static-access.net",
"realm.cz",
"*.cryptonomic.net",
"cupcake.is",
"curv.dev",
"*.customer-oci.com",
"*.oci.customer-oci.com",
"*.ocp.customer-oci.com",
"*.ocs.customer-oci.com",
"cyon.link",
"cyon.site",
"fnwk.site",
"folionetwork.site",
"platform0.app",
"daplie.me",
"localhost.daplie.me",
"dattolocal.com",
"dattorelay.com",
"dattoweb.com",
"mydatto.com",
"dattolocal.net",
"mydatto.net",
"biz.dk",
"co.dk",
"firm.dk",
"reg.dk",
"store.dk",
"dyndns.dappnode.io",
"*.dapps.earth",
"*.bzz.dapps.earth",
"builtwithdark.com",
"demo.datadetect.com",
"instance.datadetect.com",
"edgestack.me",
"ddns5.com",
"debian.net",
"deno.dev",
"deno-staging.dev",
"dedyn.io",
"deta.app",
"deta.dev",
"*.rss.my.id",
"*.diher.solutions",
"discordsays.com",
"discordsez.com",
"jozi.biz",
"dnshome.de",
"online.th",
"shop.th",
"drayddns.com",
"shoparena.pl",
"dreamhosters.com",
"mydrobo.com",
"drud.io",
"drud.us",
"duckdns.org",
"bip.sh",
"bitbridge.net",
"dy.fi",
"tunk.org",
"dyndns-at-home.com",
"dyndns-at-work.com",
"dyndns-blog.com",
"dyndns-free.com",
"dyndns-home.com",
"dyndns-ip.com",
"dyndns-mail.com",
"dyndns-office.com",
"dyndns-pics.com",
"dyndns-remote.com",
"dyndns-server.com",
"dyndns-web.com",
"dyndns-wiki.com",
"dyndns-work.com",
"dyndns.biz",
"dyndns.info",
"dyndns.org",
"dyndns.tv",
"at-band-camp.net",
"ath.cx",
"barrel-of-knowledge.info",
"barrell-of-knowledge.info",
"better-than.tv",
"blogdns.com",
"blogdns.net",
"blogdns.org",
"blogsite.org",
"boldlygoingnowhere.org",
"broke-it.net",
"buyshouses.net",
"cechire.com",
"dnsalias.com",
"dnsalias.net",
"dnsalias.org",
"dnsdojo.com",
"dnsdojo.net",
"dnsdojo.org",
"does-it.net",
"doesntexist.com",
"doesntexist.org",
"dontexist.com",
"dontexist.net",
"dontexist.org",
"doomdns.com",
"doomdns.org",
"dvrdns.org",
"dyn-o-saur.com",
"dynalias.com",
"dynalias.net",
"dynalias.org",
"dynathome.net",
"dyndns.ws",
"endofinternet.net",
"endofinternet.org",
"endoftheinternet.org",
"est-a-la-maison.com",
"est-a-la-masion.com",
"est-le-patron.com",
"est-mon-blogueur.com",
"for-better.biz",
"for-more.biz",
"for-our.info",
"for-some.biz",
"for-the.biz",
"forgot.her.name",
"forgot.his.name",
"from-ak.com",
"from-al.com",
"from-ar.com",
"from-az.net",
"from-ca.com",
"from-co.net",
"from-ct.com",
"from-dc.com",
"from-de.com",
"from-fl.com",
"from-ga.com",
"from-hi.com",
"from-ia.com",
"from-id.com",
"from-il.com",
"from-in.com",
"from-ks.com",
"from-ky.com",
"from-la.net",
"from-ma.com",
"from-md.com",
"from-me.org",
"from-mi.com",
"from-mn.com",
"from-mo.com",
"from-ms.com",
"from-mt.com",
"from-nc.com",
"from-nd.com",
"from-ne.com",
"from-nh.com",
"from-nj.com",
"from-nm.com",
"from-nv.com",
"from-ny.net",
"from-oh.com",
"from-ok.com",
"from-or.com",
"from-pa.com",
"from-pr.com",
"from-ri.com",
"from-sc.com",
"from-sd.com",
"from-tn.com",
"from-tx.com",
"from-ut.com",
"from-va.com",
"from-vt.com",
"from-wa.com",
"from-wi.com",
"from-wv.com",
"from-wy.com",
"ftpaccess.cc",
"fuettertdasnetz.de",
"game-host.org",
"game-server.cc",
"getmyip.com",
"gets-it.net",
"go.dyndns.org",
"gotdns.com",
"gotdns.org",
"groks-the.info",
"groks-this.info",
"ham-radio-op.net",
"here-for-more.info",
"hobby-site.com",
"hobby-site.org",
"home.dyndns.org",
"homedns.org",
"homeftp.net",
"homeftp.org",
"homeip.net",
"homelinux.com",
"homelinux.net",
"homelinux.org",
"homeunix.com",
"homeunix.net",
"homeunix.org",
"iamallama.com",
"in-the-band.net",
"is-a-anarchist.com",
"is-a-blogger.com",
"is-a-bookkeeper.com",
"is-a-bruinsfan.org",
"is-a-bulls-fan.com",
"is-a-candidate.org",
"is-a-caterer.com",
"is-a-celticsfan.org",
"is-a-chef.com",
"is-a-chef.net",
"is-a-chef.org",
"is-a-conservative.com",
"is-a-cpa.com",
"is-a-cubicle-slave.com",
"is-a-democrat.com",
"is-a-designer.com",
"is-a-doctor.com",
"is-a-financialadvisor.com",
"is-a-geek.com",
"is-a-geek.net",
"is-a-geek.org",
"is-a-green.com",
"is-a-guru.com",
"is-a-hard-worker.com",
"is-a-hunter.com",
"is-a-knight.org",
"is-a-landscaper.com",
"is-a-lawyer.com",
"is-a-liberal.com",
"is-a-libertarian.com",
"is-a-linux-user.org",
"is-a-llama.com",
"is-a-musician.com",
"is-a-nascarfan.com",
"is-a-nurse.com",
"is-a-painter.com",
"is-a-patsfan.org",
"is-a-personaltrainer.com",
"is-a-photographer.com",
"is-a-player.com",
"is-a-republican.com",
"is-a-rockstar.com",
"is-a-socialist.com",
"is-a-soxfan.org",
"is-a-student.com",
"is-a-teacher.com",
"is-a-techie.com",
"is-a-therapist.com",
"is-an-accountant.com",
"is-an-actor.com",
"is-an-actress.com",
"is-an-anarchist.com",
"is-an-artist.com",
"is-an-engineer.com",
"is-an-entertainer.com",
"is-by.us",
"is-certified.com",
"is-found.org",
"is-gone.com",
"is-into-anime.com",
"is-into-cars.com",
"is-into-cartoons.com",
"is-into-games.com",
"is-leet.com",
"is-lost.org",
"is-not-certified.com",
"is-saved.org",
"is-slick.com",
"is-uberleet.com",
"is-very-bad.org",
"is-very-evil.org",
"is-very-good.org",
"is-very-nice.org",
"is-very-sweet.org",
"is-with-theband.com",
"isa-geek.com",
"isa-geek.net",
"isa-geek.org",
"isa-hockeynut.com",
"issmarterthanyou.com",
"isteingeek.de",
"istmein.de",
"kicks-ass.net",
"kicks-ass.org",
"knowsitall.info",
"land-4-sale.us",
"lebtimnetz.de",
"leitungsen.de",
"likes-pie.com",
"likescandy.com",
"merseine.nu",
"mine.nu",
"misconfused.org",
"mypets.ws",
"myphotos.cc",
"neat-url.com",
"office-on-the.net",
"on-the-web.tv",
"podzone.net",
"podzone.org",
"readmyblog.org",
"saves-the-whales.com",
"scrapper-site.net",
"scrapping.cc",
"selfip.biz",
"selfip.com",
"selfip.info",
"selfip.net",
"selfip.org",
"sells-for-less.com",
"sells-for-u.com",
"sells-it.net",
"sellsyourhome.org",
"servebbs.com",
"servebbs.net",
"servebbs.org",
"serveftp.net",
"serveftp.org",
"servegame.org",
"shacknet.nu",
"simple-url.com",
"space-to-rent.com",
"stuff-4-sale.org",
"stuff-4-sale.us",
"teaches-yoga.com",
"thruhere.net",
"traeumtgerade.de",
"webhop.biz",
"webhop.info",
"webhop.net",
"webhop.org",
"worse-than.tv",
"writesthisblog.com",
"ddnss.de",
"dyn.ddnss.de",
"dyndns.ddnss.de",
"dyndns1.de",
"dyn-ip24.de",
"home-webserver.de",
"dyn.home-webserver.de",
"myhome-server.de",
"ddnss.org",
"definima.net",
"definima.io",
"ondigitalocean.app",
"*.digitaloceanspaces.com",
"bci.dnstrace.pro",
"ddnsfree.com",
"ddnsgeek.com",
"giize.com",
"gleeze.com",
"kozow.com",
"loseyourip.com",
"ooguy.com",
"theworkpc.com",
"casacam.net",
"dynu.net",
"accesscam.org",
"camdvr.org",
"freeddns.org",
"mywire.org",
"webredirect.org",
"myddns.rocks",
"blogsite.xyz",
"dynv6.net",
"e4.cz",
"eero.online",
"eero-stage.online",
"elementor.cloud",
"elementor.cool",
"en-root.fr",
"mytuleap.com",
"tuleap-partners.com",
"encr.app",
"encoreapi.com",
"onred.one",
"staging.onred.one",
"eu.encoway.cloud",
"eu.org",
"al.eu.org",
"asso.eu.org",
"at.eu.org",
"au.eu.org",
"be.eu.org",
"bg.eu.org",
"ca.eu.org",
"cd.eu.org",
"ch.eu.org",
"cn.eu.org",
"cy.eu.org",
"cz.eu.org",
"de.eu.org",
"dk.eu.org",
"edu.eu.org",
"ee.eu.org",
"es.eu.org",
"fi.eu.org",
"fr.eu.org",
"gr.eu.org",
"hr.eu.org",
"hu.eu.org",
"ie.eu.org",
"il.eu.org",
"in.eu.org",
"int.eu.org",
"is.eu.org",
"it.eu.org",
"jp.eu.org",
"kr.eu.org",
"lt.eu.org",
"lu.eu.org",
"lv.eu.org",
"mc.eu.org",
"me.eu.org",
"mk.eu.org",
"mt.eu.org",
"my.eu.org",
"net.eu.org",
"ng.eu.org",
"nl.eu.org",
"no.eu.org",
"nz.eu.org",
"paris.eu.org",
"pl.eu.org",
"pt.eu.org",
"q-a.eu.org",
"ro.eu.org",
"ru.eu.org",
"se.eu.org",
"si.eu.org",
"sk.eu.org",
"tr.eu.org",
"uk.eu.org",
"us.eu.org",
"eurodir.ru",
"eu-1.evennode.com",
"eu-2.evennode.com",
"eu-3.evennode.com",
"eu-4.evennode.com",
"us-1.evennode.com",
"us-2.evennode.com",
"us-3.evennode.com",
"us-4.evennode.com",
"twmail.cc",
"twmail.net",
"twmail.org",
"mymailer.com.tw",
"url.tw",
"onfabrica.com",
"apps.fbsbx.com",
"ru.net",
"adygeya.ru",
"bashkiria.ru",
"bir.ru",
"cbg.ru",
"com.ru",
"dagestan.ru",
"grozny.ru",
"kalmykia.ru",
"kustanai.ru",
"marine.ru",
"mordovia.ru",
"msk.ru",
"mytis.ru",
"nalchik.ru",
"nov.ru",
"pyatigorsk.ru",
"spb.ru",
"vladikavkaz.ru",
"vladimir.ru",
"abkhazia.su",
"adygeya.su",
"aktyubinsk.su",
"arkhangelsk.su",
"armenia.su",
"ashgabad.su",
"azerbaijan.su",
"balashov.su",
"bashkiria.su",
"bryansk.su",
"bukhara.su",
"chimkent.su",
"dagestan.su",
"east-kazakhstan.su",
"exnet.su",
"georgia.su",
"grozny.su",
"ivanovo.su",
"jambyl.su",
"kalmykia.su",
"kaluga.su",
"karacol.su",
"karaganda.su",
"karelia.su",
"khakassia.su",
"krasnodar.su",
"kurgan.su",
"kustanai.su",
"lenug.su",
"mangyshlak.su",
"mordovia.su",
"msk.su",
"murmansk.su",
"nalchik.su",
"navoi.su",
"north-kazakhstan.su",
"nov.su",
"obninsk.su",
"penza.su",
"pokrovsk.su",
"sochi.su",
"spb.su",
"tashkent.su",
"termez.su",
"togliatti.su",
"troitsk.su",
"tselinograd.su",
"tula.su",
"tuva.su",
"vladikavkaz.su",
"vladimir.su",
"vologda.su",
"channelsdvr.net",
"u.channelsdvr.net",
"edgecompute.app",
"fastly-terrarium.com",
"fastlylb.net",
"map.fastlylb.net",
"freetls.fastly.net",
"map.fastly.net",
"a.prod.fastly.net",
"global.prod.fastly.net",
"a.ssl.fastly.net",
"b.ssl.fastly.net",
"global.ssl.fastly.net",
"fastvps-server.com",
"fastvps.host",
"myfast.host",
"fastvps.site",
"myfast.space",
"fedorainfracloud.org",
"fedorapeople.org",
"cloud.fedoraproject.org",
"app.os.fedoraproject.org",
"app.os.stg.fedoraproject.org",
"conn.uk",
"copro.uk",
"hosp.uk",
"mydobiss.com",
"fh-muenster.io",
"filegear.me",
"filegear-au.me",
"filegear-de.me",
"filegear-gb.me",
"filegear-ie.me",
"filegear-jp.me",
"filegear-sg.me",
"firebaseapp.com",
"fireweb.app",
"flap.id",
"onflashdrive.app",
"fldrv.com",
"fly.dev",
"edgeapp.net",
"shw.io",
"flynnhosting.net",
"forgeblocks.com",
"id.forgerock.io",
"framer.app",
"framercanvas.com",
"*.frusky.de",
"ravpage.co.il",
"0e.vc",
"freebox-os.com",
"freeboxos.com",
"fbx-os.fr",
"fbxos.fr",
"freebox-os.fr",
"freeboxos.fr",
"freedesktop.org",
"freemyip.com",
"wien.funkfeuer.at",
"*.futurecms.at",
"*.ex.futurecms.at",
"*.in.futurecms.at",
"futurehosting.at",
"futuremailing.at",
"*.ex.ortsinfo.at",
"*.kunden.ortsinfo.at",
"*.statics.cloud",
"independent-commission.uk",
"independent-inquest.uk",
"independent-inquiry.uk",
"independent-panel.uk",
"independent-review.uk",
"public-inquiry.uk",
"royal-commission.uk",
"campaign.gov.uk",
"service.gov.uk",
"api.gov.uk",
"gehirn.ne.jp",
"usercontent.jp",
"gentapps.com",
"gentlentapis.com",
"lab.ms",
"cdn-edges.net",
"ghost.io",
"gsj.bz",
"githubusercontent.com",
"githubpreview.dev",
"github.io",
"gitlab.io",
"gitapp.si",
"gitpage.si",
"glitch.me",
"nog.community",
"co.ro",
"shop.ro",
"lolipop.io",
"angry.jp",
"babyblue.jp",
"babymilk.jp",
"backdrop.jp",
"bambina.jp",
"bitter.jp",
"blush.jp",
"boo.jp",
"boy.jp",
"boyfriend.jp",
"but.jp",
"candypop.jp",
"capoo.jp",
"catfood.jp",
"cheap.jp",
"chicappa.jp",
"chillout.jp",
"chips.jp",
"chowder.jp",
"chu.jp",
"ciao.jp",
"cocotte.jp",
"coolblog.jp",
"cranky.jp",
"cutegirl.jp",
"daa.jp",
"deca.jp",
"deci.jp",
"digick.jp",
"egoism.jp",
"fakefur.jp",
"fem.jp",
"flier.jp",
"floppy.jp",
"fool.jp",
"frenchkiss.jp",
"girlfriend.jp",
"girly.jp",
"gloomy.jp",
"gonna.jp",
"greater.jp",
"hacca.jp",
"heavy.jp",
"her.jp",
"hiho.jp",
"hippy.jp",
"holy.jp",
"hungry.jp",
"icurus.jp",
"itigo.jp",
"jellybean.jp",
"kikirara.jp",
"kill.jp",
"kilo.jp",
"kuron.jp",
"littlestar.jp",
"lolipopmc.jp",
"lolitapunk.jp",
"lomo.jp",
"lovepop.jp",
"lovesick.jp",
"main.jp",
"mods.jp",
"mond.jp",
"mongolian.jp",
"moo.jp",
"namaste.jp",
"nikita.jp",
"nobushi.jp",
"noor.jp",
"oops.jp",
"parallel.jp",
"parasite.jp",
"pecori.jp",
"peewee.jp",
"penne.jp",
"pepper.jp",
"perma.jp",
"pigboat.jp",
"pinoko.jp",
"punyu.jp",
"pupu.jp",
"pussycat.jp",
"pya.jp",
"raindrop.jp",
"readymade.jp",
"sadist.jp",
"schoolbus.jp",
"secret.jp",
"staba.jp",
"stripper.jp",
"sub.jp",
"sunnyday.jp",
"thick.jp",
"tonkotsu.jp",
"under.jp",
"upper.jp",
"velvet.jp",
"verse.jp",
"versus.jp",
"vivian.jp",
"watson.jp",
"weblike.jp",
"whitesnow.jp",
"zombie.jp",
"heteml.net",
"cloudapps.digital",
"london.cloudapps.digital",
"pymnt.uk",
"homeoffice.gov.uk",
"ro.im",
"goip.de",
"run.app",
"a.run.app",
"web.app",
"*.0emm.com",
"appspot.com",
"*.r.appspot.com",
"codespot.com",
"googleapis.com",
"googlecode.com",
"pagespeedmobilizer.com",
"publishproxy.com",
"withgoogle.com",
"withyoutube.com",
"*.gateway.dev",
"cloud.goog",
"translate.goog",
"*.usercontent.goog",
"cloudfunctions.net",
"blogspot.ae",
"blogspot.al",
"blogspot.am",
"blogspot.ba",
"blogspot.be",
"blogspot.bg",
"blogspot.bj",
"blogspot.ca",
"blogspot.cf",
"blogspot.ch",
"blogspot.cl",
"blogspot.co.at",
"blogspot.co.id",
"blogspot.co.il",
"blogspot.co.ke",
"blogspot.co.nz",
"blogspot.co.uk",
"blogspot.co.za",
"blogspot.com",
"blogspot.com.ar",
"blogspot.com.au",
"blogspot.com.br",
"blogspot.com.by",
"blogspot.com.co",
"blogspot.com.cy",
"blogspot.com.ee",
"blogspot.com.eg",
"blogspot.com.es",
"blogspot.com.mt",
"blogspot.com.ng",
"blogspot.com.tr",
"blogspot.com.uy",
"blogspot.cv",
"blogspot.cz",
"blogspot.de",
"blogspot.dk",
"blogspot.fi",
"blogspot.fr",
"blogspot.gr",
"blogspot.hk",
"blogspot.hr",
"blogspot.hu",
"blogspot.ie",
"blogspot.in",
"blogspot.is",
"blogspot.it",
"blogspot.jp",
"blogspot.kr",
"blogspot.li",
"blogspot.lt",
"blogspot.lu",
"blogspot.md",
"blogspot.mk",
"blogspot.mr",
"blogspot.mx",
"blogspot.my",
"blogspot.nl",
"blogspot.no",
"blogspot.pe",
"blogspot.pt",
"blogspot.qa",
"blogspot.re",
"blogspot.ro",
"blogspot.rs",
"blogspot.ru",
"blogspot.se",
"blogspot.sg",
"blogspot.si",
"blogspot.sk",
"blogspot.sn",
"blogspot.td",
"blogspot.tw",
"blogspot.ug",
"blogspot.vn",
"goupile.fr",
"gov.nl",
"awsmppl.com",
"günstigbestellen.de",
"günstigliefern.de",
"fin.ci",
"free.hr",
"caa.li",
"ua.rs",
"conf.se",
"hs.zone",
"hs.run",
"hashbang.sh",
"hasura.app",
"hasura-app.io",
"pages.it.hs-heilbronn.de",
"hepforge.org",
"herokuapp.com",
"herokussl.com",
"ravendb.cloud",
"myravendb.com",
"ravendb.community",
"ravendb.me",
"development.run",
"ravendb.run",
"homesklep.pl",
"secaas.hk",
"hoplix.shop",
"orx.biz",
"biz.gl",
"col.ng",
"firm.ng",
"gen.ng",
"ltd.ng",
"ngo.ng",
"edu.scot",
"sch.so",
"hostyhosting.io",
"häkkinen.fi",
"*.moonscale.io",
"moonscale.net",
"iki.fi",
"ibxos.it",
"iliadboxos.it",
"impertrixcdn.com",
"impertrix.com",
"smushcdn.com",
"wphostedmail.com",
"wpmucdn.com",
"tempurl.host",
"wpmudev.host",
"dyn-berlin.de",
"in-berlin.de",
"in-brb.de",
"in-butter.de",
"in-dsl.de",
"in-dsl.net",
"in-dsl.org",
"in-vpn.de",
"in-vpn.net",
"in-vpn.org",
"biz.at",
"info.at",
"info.cx",
"ac.leg.br",
"al.leg.br",
"am.leg.br",
"ap.leg.br",
"ba.leg.br",
"ce.leg.br",
"df.leg.br",
"es.leg.br",
"go.leg.br",
"ma.leg.br",
"mg.leg.br",
"ms.leg.br",
"mt.leg.br",
"pa.leg.br",
"pb.leg.br",
"pe.leg.br",
"pi.leg.br",
"pr.leg.br",
"rj.leg.br",
"rn.leg.br",
"ro.leg.br",
"rr.leg.br",
"rs.leg.br",
"sc.leg.br",
"se.leg.br",
"sp.leg.br",
"to.leg.br",
"pixolino.com",
"na4u.ru",
"iopsys.se",
"ipifony.net",
"iservschule.de",
"mein-iserv.de",
"schulplattform.de",
"schulserver.de",
"test-iserv.de",
"iserv.dev",
"iobb.net",
"mel.cloudlets.com.au",
"cloud.interhostsolutions.be",
"users.scale.virtualcloud.com.br",
"mycloud.by",
"alp1.ae.flow.ch",
"appengine.flow.ch",
"es-1.axarnet.cloud",
"diadem.cloud",
"vip.jelastic.cloud",
"jele.cloud",
"it1.eur.aruba.jenv-aruba.cloud",
"it1.jenv-aruba.cloud",
"keliweb.cloud",
"cs.keliweb.cloud",
"oxa.cloud",
"tn.oxa.cloud",
"uk.oxa.cloud",
"primetel.cloud",
"uk.primetel.cloud",
"ca.reclaim.cloud",
"uk.reclaim.cloud",
"us.reclaim.cloud",
"ch.trendhosting.cloud",
"de.trendhosting.cloud",
"jele.club",
"amscompute.com",
"clicketcloud.com",
"dopaas.com",
"hidora.com",
"paas.hosted-by-previder.com",
"rag-cloud.hosteur.com",
"rag-cloud-ch.hosteur.com",
"jcloud.ik-server.com",
"jcloud-ver-jpc.ik-server.com",
"demo.jelastic.com",
"kilatiron.com",
"paas.massivegrid.com",
"jed.wafaicloud.com",
"lon.wafaicloud.com",
"ryd.wafaicloud.com",
"j.scaleforce.com.cy",
"jelastic.dogado.eu",
"fi.cloudplatform.fi",
"demo.datacenter.fi",
"paas.datacenter.fi",
"jele.host",
"mircloud.host",
"paas.beebyte.io",
"sekd1.beebyteapp.io",
"jele.io",
"cloud-fr1.unispace.io",
"jc.neen.it",
"cloud.jelastic.open.tim.it",
"jcloud.kz",
"upaas.kazteleport.kz",
"cloudjiffy.net",
"fra1-de.cloudjiffy.net",
"west1-us.cloudjiffy.net",
"jls-sto1.elastx.net",
"jls-sto2.elastx.net",
"jls-sto3.elastx.net",
"faststacks.net",
"fr-1.paas.massivegrid.net",
"lon-1.paas.massivegrid.net",
"lon-2.paas.massivegrid.net",
"ny-1.paas.massivegrid.net",
"ny-2.paas.massivegrid.net",
"sg-1.paas.massivegrid.net",
"jelastic.saveincloud.net",
"nordeste-idc.saveincloud.net",
"j.scaleforce.net",
"jelastic.tsukaeru.net",
"sdscloud.pl",
"unicloud.pl",
"mircloud.ru",
"jelastic.regruhosting.ru",
"enscaled.sg",
"jele.site",
"jelastic.team",
"orangecloud.tn",
"j.layershift.co.uk",
"phx.enscaled.us",
"mircloud.us",
"myjino.ru",
"*.hosting.myjino.ru",
"*.landing.myjino.ru",
"*.spectrum.myjino.ru",
"*.vps.myjino.ru",
"jotelulu.cloud",
"*.triton.zone",
"*.cns.joyent.com",
"js.org",
"kaas.gg",
"khplay.nl",
"ktistory.com",
"kapsi.fi",
"keymachine.de",
"kinghost.net",
"uni5.net",
"knightpoint.systems",
"koobin.events",
"oya.to",
"kuleuven.cloud",
"ezproxy.kuleuven.be",
"co.krd",
"edu.krd",
"krellian.net",
"webthings.io",
"git-repos.de",
"lcube-server.de",
"svn-repos.de",
"leadpages.co",
"lpages.co",
"lpusercontent.com",
"lelux.site",
"co.business",
"co.education",
"co.events",
"co.financial",
"co.network",
"co.place",
"co.technology",
"app.lmpm.com",
"linkyard.cloud",
"linkyard-cloud.ch",
"members.linode.com",
"*.nodebalancer.linode.com",
"*.linodeobjects.com",
"ip.linodeusercontent.com",
"we.bs",
"*.user.localcert.dev",
"localzone.xyz",
"loginline.app",
"loginline.dev",
"loginline.io",
"loginline.services",
"loginline.site",
"servers.run",
"lohmus.me",
"krasnik.pl",
"leczna.pl",
"lubartow.pl",
"lublin.pl",
"poniatowa.pl",
"swidnik.pl",
"glug.org.uk",
"lug.org.uk",
"lugs.org.uk",
"barsy.bg",
"barsy.co.uk",
"barsyonline.co.uk",
"barsycenter.com",
"barsyonline.com",
"barsy.club",
"barsy.de",
"barsy.eu",
"barsy.in",
"barsy.info",
"barsy.io",
"barsy.me",
"barsy.menu",
"barsy.mobi",
"barsy.net",
"barsy.online",
"barsy.org",
"barsy.pro",
"barsy.pub",
"barsy.ro",
"barsy.shop",
"barsy.site",
"barsy.support",
"barsy.uk",
"*.magentosite.cloud",
"mayfirst.info",
"mayfirst.org",
"hb.cldmail.ru",
"cn.vu",
"mazeplay.com",
"mcpe.me",
"mcdir.me",
"mcdir.ru",
"mcpre.ru",
"vps.mcdir.ru",
"mediatech.by",
"mediatech.dev",
"hra.health",
"miniserver.com",
"memset.net",
"messerli.app",
"*.cloud.metacentrum.cz",
"custom.metacentrum.cz",
"flt.cloud.muni.cz",
"usr.cloud.muni.cz",
"meteorapp.com",
"eu.meteorapp.com",
"co.pl",
"*.azurecontainer.io",
"azurewebsites.net",
"azure-mobile.net",
"cloudapp.net",
"azurestaticapps.net",
"1.azurestaticapps.net",
"centralus.azurestaticapps.net",
"eastasia.azurestaticapps.net",
"eastus2.azurestaticapps.net",
"westeurope.azurestaticapps.net",
"westus2.azurestaticapps.net",
"csx.cc",
"mintere.site",
"forte.id",
"mozilla-iot.org",
"bmoattachments.org",
"net.ru",
"org.ru",
"pp.ru",
"hostedpi.com",
"customer.mythic-beasts.com",
"caracal.mythic-beasts.com",
"fentiger.mythic-beasts.com",
"lynx.mythic-beasts.com",
"ocelot.mythic-beasts.com",
"oncilla.mythic-beasts.com",
"onza.mythic-beasts.com",
"sphinx.mythic-beasts.com",
"vs.mythic-beasts.com",
"x.mythic-beasts.com",
"yali.mythic-beasts.com",
"cust.retrosnub.co.uk",
"ui.nabu.casa",
"pony.club",
"of.fashion",
"in.london",
"of.london",
"from.marketing",
"with.marketing",
"for.men",
"repair.men",
"and.mom",
"for.mom",
"for.one",
"under.one",
"for.sale",
"that.win",
"from.work",
"to.work",
"cloud.nospamproxy.com",
"netlify.app",
"4u.com",
"ngrok.io",
"nh-serv.co.uk",
"nfshost.com",
"*.developer.app",
"noop.app",
"*.northflank.app",
"*.build.run",
"*.code.run",
"*.database.run",
"*.migration.run",
"noticeable.news",
"dnsking.ch",
"mypi.co",
"n4t.co",
"001www.com",
"ddnslive.com",
"myiphost.com",
"forumz.info",
"16-b.it",
"32-b.it",
"64-b.it",
"soundcast.me",
"tcp4.me",
"dnsup.net",
"hicam.net",
"now-dns.net",
"ownip.net",
"vpndns.net",
"dynserv.org",
"now-dns.org",
"x443.pw",
"now-dns.top",
"ntdll.top",
"freeddns.us",
"crafting.xyz",
"zapto.xyz",
"nsupdate.info",
"nerdpol.ovh",
"blogsyte.com",
"brasilia.me",
"cable-modem.org",
"ciscofreak.com",
"collegefan.org",
"couchpotatofries.org",
"damnserver.com",
"ddns.me",
"ditchyourip.com",
"dnsfor.me",
"dnsiskinky.com",
"dvrcam.info",
"dynns.com",
"eating-organic.net",
"fantasyleague.cc",
"geekgalaxy.com",
"golffan.us",
"health-carereform.com",
"homesecuritymac.com",
"homesecuritypc.com",
"hopto.me",
"ilovecollege.info",
"loginto.me",
"mlbfan.org",
"mmafan.biz",
"myactivedirectory.com",
"mydissent.net",
"myeffect.net",
"mymediapc.net",
"mypsx.net",
"mysecuritycamera.com",
"mysecuritycamera.net",
"mysecuritycamera.org",
"net-freaks.com",
"nflfan.org",
"nhlfan.net",
"no-ip.ca",
"no-ip.co.uk",
"no-ip.net",
"noip.us",
"onthewifi.com",
"pgafan.net",
"point2this.com",
"pointto.us",
"privatizehealthinsurance.net",
"quicksytes.com",
"read-books.org",
"securitytactics.com",
"serveexchange.com",
"servehumour.com",
"servep2p.com",
"servesarcasm.com",
"stufftoread.com",
"ufcfan.org",
"unusualperson.com",
"workisboring.com",
"3utilities.com",
"bounceme.net",
"ddns.net",
"ddnsking.com",
"gotdns.ch",
"hopto.org",
"myftp.biz",
"myftp.org",
"myvnc.com",
"no-ip.biz",
"no-ip.info",
"no-ip.org",
"noip.me",
"redirectme.net",
"servebeer.com",
"serveblog.net",
"servecounterstrike.com",
"serveftp.com",
"servegame.com",
"servehalflife.com",
"servehttp.com",
"serveirc.com",
"serveminecraft.net",
"servemp3.com",
"servepics.com",
"servequake.com",
"sytes.net",
"webhop.me",
"zapto.org",
"stage.nodeart.io",
"pcloud.host",
"nyc.mn",
"static.observableusercontent.com",
"cya.gg",
"omg.lol",
"cloudycluster.net",
"omniwe.site",
"service.one",
"nid.io",
"opensocial.site",
"opencraft.hosting",
"orsites.com",
"operaunite.com",
"tech.orange",
"authgear-staging.com",
"authgearapps.com",
"skygearapp.com",
"outsystemscloud.com",
"*.webpaas.ovh.net",
"*.hosting.ovh.net",
"ownprovider.com",
"own.pm",
"*.owo.codes",
"ox.rs",
"oy.lc",
"pgfog.com",
"pagefrontapp.com",
"pagexl.com",
"*.paywhirl.com",
"bar0.net",
"bar1.net",
"bar2.net",
"rdv.to",
"art.pl",
"gliwice.pl",
"krakow.pl",
"poznan.pl",
"wroc.pl",
"zakopane.pl",
"pantheonsite.io",
"gotpantheon.com",
"mypep.link",
"perspecta.cloud",
"lk3.ru",
"on-web.fr",
"bc.platform.sh",
"ent.platform.sh",
"eu.platform.sh",
"us.platform.sh",
"*.platformsh.site",
"*.tst.site",
"platter-app.com",
"platter-app.dev",
"platterp.us",
"pdns.page",
"plesk.page",
"pleskns.com",
"dyn53.io",
"onporter.run",
"co.bn",
"postman-echo.com",
"pstmn.io",
"mock.pstmn.io",
"httpbin.org",
"prequalifyme.today",
"xen.prgmr.com",
"priv.at",
"prvcy.page",
"*.dweb.link",
"protonet.io",
"chirurgiens-dentistes-en-france.fr",
"byen.site",
"pubtls.org",
"pythonanywhere.com",
"eu.pythonanywhere.com",
"qoto.io",
"qualifioapp.com",
"qbuser.com",
"cloudsite.builders",
"instances.spawn.cc",
"instantcloud.cn",
"ras.ru",
"qa2.com",
"qcx.io",
"*.sys.qcx.io",
"dev-myqnapcloud.com",
"alpha-myqnapcloud.com",
"myqnapcloud.com",
"*.quipelements.com",
"vapor.cloud",
"vaporcloud.io",
"rackmaze.com",
"rackmaze.net",
"g.vbrplsbx.io",
"*.on-k3s.io",
"*.on-rancher.cloud",
"*.on-rio.io",
"readthedocs.io",
"rhcloud.com",
"app.render.com",
"onrender.com",
"repl.co",
"id.repl.co",
"repl.run",
"resindevice.io",
"devices.resinstaging.io",
"hzc.io",
"wellbeingzone.eu",
"wellbeingzone.co.uk",
"adimo.co.uk",
"itcouldbewor.se",
"git-pages.rit.edu",
"rocky.page",
"биз.рус",
"ком.рус",
"крым.рус",
"мир.рус",
"мск.рус",
"орг.рус",
"самара.рус",
"сочи.рус",
"спб.рус",
"я.рус",
"*.builder.code.com",
"*.dev-builder.code.com",
"*.stg-builder.code.com",
"sandcats.io",
"logoip.de",
"logoip.com",
"fr-par-1.baremetal.scw.cloud",
"fr-par-2.baremetal.scw.cloud",
"nl-ams-1.baremetal.scw.cloud",
"fnc.fr-par.scw.cloud",
"functions.fnc.fr-par.scw.cloud",
"k8s.fr-par.scw.cloud",
"nodes.k8s.fr-par.scw.cloud",
"s3.fr-par.scw.cloud",
"s3-website.fr-par.scw.cloud",
"whm.fr-par.scw.cloud",
"priv.instances.scw.cloud",
"pub.instances.scw.cloud",
"k8s.scw.cloud",
"k8s.nl-ams.scw.cloud",
"nodes.k8s.nl-ams.scw.cloud",
"s3.nl-ams.scw.cloud",
"s3-website.nl-ams.scw.cloud",
"whm.nl-ams.scw.cloud",
"k8s.pl-waw.scw.cloud",
"nodes.k8s.pl-waw.scw.cloud",
"s3.pl-waw.scw.cloud",
"s3-website.pl-waw.scw.cloud",
"scalebook.scw.cloud",
"smartlabeling.scw.cloud",
"dedibox.fr",
"schokokeks.net",
"gov.scot",
"service.gov.scot",
"scrysec.com",
"firewall-gateway.com",
"firewall-gateway.de",
"my-gateway.de",
"my-router.de",
"spdns.de",
"spdns.eu",
"firewall-gateway.net",
"my-firewall.org",
"myfirewall.org",
"spdns.org",
"seidat.net",
"sellfy.store",
"senseering.net",
"minisite.ms",
"magnet.page",
"biz.ua",
"co.ua",
"pp.ua",
"shiftcrypto.dev",
"shiftcrypto.io",
"shiftedit.io",
"myshopblocks.com",
"myshopify.com",
"shopitsite.com",
"shopware.store",
"mo-siemens.io",
"1kapp.com",
"appchizi.com",
"applinzi.com",
"sinaapp.com",
"vipsinaapp.com",
"siteleaf.net",
"bounty-full.com",
"alpha.bounty-full.com",
"beta.bounty-full.com",
"small-web.org",
"vp4.me",
"try-snowplow.com",
"srht.site",
"stackhero-network.com",
"musician.io",
"novecore.site",
"static.land",
"dev.static.land",
"sites.static.land",
"storebase.store",
"vps-host.net",
"atl.jelastic.vps-host.net",
"njs.jelastic.vps-host.net",
"ric.jelastic.vps-host.net",
"playstation-cloud.com",
"apps.lair.io",
"*.stolos.io",
"spacekit.io",
"customer.speedpartner.de",
"myspreadshop.at",
"myspreadshop.com.au",
"myspreadshop.be",
"myspreadshop.ca",
"myspreadshop.ch",
"myspreadshop.com",
"myspreadshop.de",
"myspreadshop.dk",
"myspreadshop.es",
"myspreadshop.fi",
"myspreadshop.fr",
"myspreadshop.ie",
"myspreadshop.it",
"myspreadshop.net",
"myspreadshop.nl",
"myspreadshop.no",
"myspreadshop.pl",
"myspreadshop.se",
"myspreadshop.co.uk",
"api.stdlib.com",
"storj.farm",
"utwente.io",
"soc.srcf.net",
"user.srcf.net",
"temp-dns.com",
"supabase.co",
"supabase.in",
"supabase.net",
"su.paba.se",
"*.s5y.io",
"*.sensiosite.cloud",
"syncloud.it",
"dscloud.biz",
"direct.quickconnect.cn",
"dsmynas.com",
"familyds.com",
"diskstation.me",
"dscloud.me",
"i234.me",
"myds.me",
"synology.me",
"dscloud.mobi",
"dsmynas.net",
"familyds.net",
"dsmynas.org",
"familyds.org",
"vpnplus.to",
"direct.quickconnect.to",
"tabitorder.co.il",
"taifun-dns.de",
"beta.tailscale.net",
"ts.net",
"gda.pl",
"gdansk.pl",
"gdynia.pl",
"med.pl",
"sopot.pl",
"site.tb-hosting.com",
"edugit.io",
"s3.teckids.org",
"telebit.app",
"telebit.io",
"*.telebit.xyz",
"gwiddle.co.uk",
"*.firenet.ch",
"*.svc.firenet.ch",
"reservd.com",
"thingdustdata.com",
"cust.dev.thingdust.io",
"cust.disrec.thingdust.io",
"cust.prod.thingdust.io",
"cust.testing.thingdust.io",
"reservd.dev.thingdust.io",
"reservd.disrec.thingdust.io",
"reservd.testing.thingdust.io",
"tickets.io",
"arvo.network",
"azimuth.network",
"tlon.network",
"torproject.net",
"pages.torproject.net",
"bloxcms.com",
"townnews-staging.com",
"tbits.me",
"12hp.at",
"2ix.at",
"4lima.at",
"lima-city.at",
"12hp.ch",
"2ix.ch",
"4lima.ch",
"lima-city.ch",
"trafficplex.cloud",
"de.cool",
"12hp.de",
"2ix.de",
"4lima.de",
"lima-city.de",
"1337.pictures",
"clan.rip",
"lima-city.rocks",
"webspace.rocks",
"lima.zone",
"*.transurl.be",
"*.transurl.eu",
"*.transurl.nl",
"site.transip.me",
"tuxfamily.org",
"dd-dns.de",
"diskstation.eu",
"diskstation.org",
"dray-dns.de",
"draydns.de",
"dyn-vpn.de",
"dynvpn.de",
"mein-vigor.de",
"my-vigor.de",
"my-wan.de",
"syno-ds.de",
"synology-diskstation.de",
"synology-ds.de",
"typedream.app",
"pro.typeform.com",
"uber.space",
"*.uberspace.de",
"hk.com",
"hk.org",
"ltd.hk",
"inc.hk",
"name.pm",
"sch.tf",
"biz.wf",
"sch.wf",
"org.yt",
"virtualuser.de",
"virtual-user.de",
"upli.io",
"urown.cloud",
"dnsupdate.info",
"lib.de.us",
"2038.io",
"vercel.app",
"vercel.dev",
"now.sh",
"router.management",
"v-info.info",
"voorloper.cloud",
"neko.am",
"nyaa.am",
"be.ax",
"cat.ax",
"es.ax",
"eu.ax",
"gg.ax",
"mc.ax",
"us.ax",
"xy.ax",
"nl.ci",
"xx.gl",
"app.gp",
"blog.gt",
"de.gt",
"to.gt",
"be.gy",
"cc.hn",
"blog.kg",
"io.kg",
"jp.kg",
"tv.kg",
"uk.kg",
"us.kg",
"de.ls",
"at.md",
"de.md",
"jp.md",
"to.md",
"indie.porn",
"vxl.sh",
"ch.tc",
"me.tc",
"we.tc",
"nyan.to",
"at.vg",
"blog.vu",
"dev.vu",
"me.vu",
"v.ua",
"*.vultrobjects.com",
"wafflecell.com",
"*.webhare.dev",
"reserve-online.net",
"reserve-online.com",
"bookonline.app",
"hotelwithflight.com",
"wedeploy.io",
"wedeploy.me",
"wedeploy.sh",
"remotewd.com",
"pages.wiardweb.com",
"wmflabs.org",
"toolforge.org",
"wmcloud.org",
"panel.gg",
"daemon.panel.gg",
"messwithdns.com",
"woltlab-demo.com",
"myforum.community",
"community-pro.de",
"diskussionsbereich.de",
"community-pro.net",
"meinforum.net",
"affinitylottery.org.uk",
"raffleentry.org.uk",
"weeklylottery.org.uk",
"wpenginepowered.com",
"js.wpenginepowered.com",
"wixsite.com",
"editorx.io",
"half.host",
"xnbay.com",
"u2.xnbay.com",
"u2-local.xnbay.com",
"cistron.nl",
"demon.nl",
"xs4all.space",
"yandexcloud.net",
"storage.yandexcloud.net",
"website.yandexcloud.net",
"official.academy",
"yolasite.com",
"ybo.faith",
"yombo.me",
"homelink.one",
"ybo.party",
"ybo.review",
"ybo.science",
"ybo.trade",
"ynh.fr",
"nohost.me",
"noho.st",
"za.net",
"za.org",
"bss.design",
"basicserver.io",
"virtualserver.io",
"enterprisecloud.nu"
]The MIT License (MIT)

Copyright (c) 2014 Mathias Buus

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

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

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.var once = require('once')
var eos = require('end-of-stream')
var fs = require('fs') // we only need fs to get the ReadStream and WriteStream prototypes

var noop = function () {}
var ancient = /^v?\.0/.test(process.version)

var isFn = function (fn) {
  return typeof fn === 'function'
}

var isFS = function (stream) {
  if (!ancient) return false // newer node version do not need to care about fs is a special way
  if (!fs) return false // browser
  return (stream instanceof (fs.ReadStream || noop) || stream instanceof (fs.WriteStream || noop)) && isFn(stream.close)
}

var isRequest = function (stream) {
  return stream.setHeader && isFn(stream.abort)
}

var destroyer = function (stream, reading, writing, callback) {
  callback = once(callback)

  var closed = false
  stream.on('close', function () {
    closed = true
  })

  eos(stream, {readable: reading, writable: writing}, function (err) {
    if (err) return callback(err)
    closed = true
    callback()
  })

  var destroyed = false
  return function (err) {
    if (closed) return
    if (destroyed) return
    destroyed = true

    if (isFS(stream)) return stream.close(noop) // use close for fs streams to avoid fd leaks
    if (isRequest(stream)) return stream.abort() // request.destroy just do .end - .abort is what we want

    if (isFn(stream.destroy)) return stream.destroy()

    callback(err || new Error('stream was destroyed'))
  }
}

var call = function (fn) {
  fn()
}

var pipe = function (from, to) {
  return from.pipe(to)
}

var pump = function () {
  var streams = Array.prototype.slice.call(arguments)
  var callback = isFn(streams[streams.length - 1] || noop) && streams.pop() || noop

  if (Array.isArray(streams[0])) streams = streams[0]
  if (streams.length < 2) throw new Error('pump requires two streams per minimum')

  var error
  var destroys = streams.map(function (stream, i) {
    var reading = i < streams.length - 1
    var writing = i > 0
    return destroyer(stream, reading, writing, function (err) {
      if (!error) error = err
      if (err) destroys.forEach(call)
      if (reading) return
      destroys.forEach(call)
      callback(error)
    })
  })

  return streams.reduce(pipe)
}

module.exports = pump
{
  "name": "pump",
  "version": "3.0.0",
  "repository": "git://github.com/mafintosh/pump.git",
  "license": "MIT",
  "description": "pipe streams together and close all of them if one of them closes",
  "browser": {
    "fs": false
  },
  "author": "Mathias Buus Madsen <mathiasbuus@gmail.com>",
  "dependencies": {
    "end-of-stream": "^1.1.0",
    "once": "^1.3.1"
  }
}var stream = require('stream')
var pump = require('./index')

var rs = new stream.Readable()
var ws = new stream.Writable()

rs._read = function (size) {
  this.push(Buffer(size).fill('abc'))
}

ws._write = function (chunk, encoding, cb) {
  setTimeout(function () {
    cb()
  }, 100)
}

var toHex = function () {
  var reverse = new (require('stream').Transform)()

  reverse._transform = function (chunk, enc, callback) {
    reverse.push(chunk.toString('hex'))
    callback()
  }

  return reverse
}

var wsClosed = false
var rsClosed = false
var callbackCalled = false

var check = function () {
  if (wsClosed && rsClosed && callbackCalled) {
    console.log('test-browser.js passes')
    clearTimeout(timeout)
  }
}

ws.on('finish', function () {
  wsClosed = true
  check()
})

rs.on('end', function () {
  rsClosed = true
  check()
})

var res = pump(rs, toHex(), toHex(), toHex(), ws, function () {
  callbackCalled = true
  check()
})

if (res !== ws) {
  throw new Error('should return last stream')
}

setTimeout(function () {
  rs.push(null)
  rs.emit('close')
}, 1000)

var timeout = setTimeout(function () {
  check()
  throw new Error('timeout')
}, 5000)
var pump = require('./index')

var rs = require('fs').createReadStream('/dev/random')
var ws = require('fs').createWriteStream('/dev/null')

var toHex = function () {
  var reverse = new (require('stream').Transform)()

  reverse._transform = function (chunk, enc, callback) {
    reverse.push(chunk.toString('hex'))
    callback()
  }

  return reverse
}

var wsClosed = false
var rsClosed = false
var callbackCalled = false

var check = function () {
  if (wsClosed && rsClosed && callbackCalled) {
    console.log('test-node.js passes')
    clearTimeout(timeout)
  }
}

ws.on('close', function () {
  wsClosed = true
  check()
})

rs.on('close', function () {
  rsClosed = true
  check()
})

var res = pump(rs, toHex(), toHex(), toHex(), ws, function () {
  callbackCalled = true
  check()
})

if (res !== ws) {
  throw new Error('should return last stream')
}

setTimeout(function () {
  rs.destroy()
}, 1000)

var timeout = setTimeout(function () {
  throw new Error('timeout')
}, 5000)
Copyright Mathias Bynens <https://mathiasbynens.be/>

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": "punycode",
  "version": "2.1.1",
  "description": "A robust Punycode converter that fully complies to RFC 3492 and RFC 5891, and works on nearly all JavaScript platforms.",
  "homepage": "https://mths.be/punycode",
  "main": "punycode.js",
  "jsnext:main": "punycode.es6.js",
  "module": "punycode.es6.js",
  "engines": {
    "node": ">=6"
  },
  "license": "MIT",
  "author": {
    "name": "Mathias Bynens",
    "url": "https://mathiasbynens.be/"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/bestiejs/punycode.js.git"
  },
  "files": [
    "LICENSE-MIT.txt",
    "punycode.js",
    "punycode.es6.js"
  ],
  "devDependencies": {
    "codecov": "^1.0.1",
    "istanbul": "^0.4.1",
    "mocha": "^2.5.3"
  }
}'use strict';

/** Highest positive signed 32-bit float value */
const maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1

/** Bootstring parameters */
const base = 36;
const tMin = 1;
const tMax = 26;
const skew = 38;
const damp = 700;
const initialBias = 72;
const initialN = 128; // 0x80
const delimiter = '-'; // '\x2D'

/** Regular expressions */
const regexPunycode = /^xn--/;
const regexNonASCII = /[^\0-\x7E]/; // non-ASCII chars
const regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; // RFC 3490 separators

/** Error messages */
const errors = {
	'overflow': 'Overflow: input needs wider integers to process',
	'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
	'invalid-input': 'Invalid input'
};

/** Convenience shortcuts */
const baseMinusTMin = base - tMin;
const floor = Math.floor;
const stringFromCharCode = String.fromCharCode;

/*--------------------------------------------------------------------------*/

/**
 * A generic error utility function.
 * @private
 * @param {String} type The error type.
 * @returns {Error} Throws a `RangeError` with the applicable error message.
 */
function error(type) {
	throw new RangeError(errors[type]);
}

/**
 * A generic `Array#map` utility function.
 * @private
 * @param {Array} array The array to iterate over.
 * @param {Function} callback The function that gets called for every array
 * item.
 * @returns {Array} A new array of values returned by the callback function.
 */
function map(array, fn) {
	const result = [];
	let length = array.length;
	while (length--) {
		result[length] = fn(array[length]);
	}
	return result;
}

/**
 * A simple `Array#map`-like wrapper to work with domain name strings or email
 * addresses.
 * @private
 * @param {String} domain The domain name or email address.
 * @param {Function} callback The function that gets called for every
 * character.
 * @returns {Array} A new string of characters returned by the callback
 * function.
 */
function mapDomain(string, fn) {
	const parts = string.split('@');
	let result = '';
	if (parts.length > 1) {
		// In email addresses, only the domain name should be punycoded. Leave
		// the local part (i.e. everything up to `@`) intact.
		result = parts[0] + '@';
		string = parts[1];
	}
	// Avoid `split(regex)` for IE8 compatibility. See #17.
	string = string.replace(regexSeparators, '\x2E');
	const labels = string.split('.');
	const encoded = map(labels, fn).join('.');
	return result + encoded;
}

/**
 * Creates an array containing the numeric code points of each Unicode
 * character in the string. While JavaScript uses UCS-2 internally,
 * this function will convert a pair of surrogate halves (each of which
 * UCS-2 exposes as separate characters) into a single code point,
 * matching UTF-16.
 * @see `punycode.ucs2.encode`
 * @see <https://mathiasbynens.be/notes/javascript-encoding>
 * @memberOf punycode.ucs2
 * @name decode
 * @param {String} string The Unicode input string (UCS-2).
 * @returns {Array} The new array of code points.
 */
function ucs2decode(string) {
	const output = [];
	let counter = 0;
	const length = string.length;
	while (counter < length) {
		const value = string.charCodeAt(counter++);
		if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
			// It's a high surrogate, and there is a next character.
			const extra = string.charCodeAt(counter++);
			if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.
				output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
			} else {
				// It's an unmatched surrogate; only append this code unit, in case the
				// next code unit is the high surrogate of a surrogate pair.
				output.push(value);
				counter--;
			}
		} else {
			output.push(value);
		}
	}
	return output;
}

/**
 * Creates a string based on an array of numeric code points.
 * @see `punycode.ucs2.decode`
 * @memberOf punycode.ucs2
 * @name encode
 * @param {Array} codePoints The array of numeric code points.
 * @returns {String} The new Unicode string (UCS-2).
 */
const ucs2encode = array => String.fromCodePoint(...array);

/**
 * Converts a basic code point into a digit/integer.
 * @see `digitToBasic()`
 * @private
 * @param {Number} codePoint The basic numeric code point value.
 * @returns {Number} The numeric value of a basic code point (for use in
 * representing integers) in the range `0` to `base - 1`, or `base` if
 * the code point does not represent a value.
 */
const basicToDigit = function(codePoint) {
	if (codePoint - 0x30 < 0x0A) {
		return codePoint - 0x16;
	}
	if (codePoint - 0x41 < 0x1A) {
		return codePoint - 0x41;
	}
	if (codePoint - 0x61 < 0x1A) {
		return codePoint - 0x61;
	}
	return base;
};

/**
 * Converts a digit/integer into a basic code point.
 * @see `basicToDigit()`
 * @private
 * @param {Number} digit The numeric value of a basic code point.
 * @returns {Number} The basic code point whose value (when used for
 * representing integers) is `digit`, which needs to be in the range
 * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
 * used; else, the lowercase form is used. The behavior is undefined
 * if `flag` is non-zero and `digit` has no uppercase form.
 */
const digitToBasic = function(digit, flag) {
	//  0..25 map to ASCII a..z or A..Z
	// 26..35 map to ASCII 0..9
	return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
};

/**
 * Bias adaptation function as per section 3.4 of RFC 3492.
 * https://tools.ietf.org/html/rfc3492#section-3.4
 * @private
 */
const adapt = function(delta, numPoints, firstTime) {
	let k = 0;
	delta = firstTime ? floor(delta / damp) : delta >> 1;
	delta += floor(delta / numPoints);
	for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {
		delta = floor(delta / baseMinusTMin);
	}
	return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
};

/**
 * Converts a Punycode string of ASCII-only symbols to a string of Unicode
 * symbols.
 * @memberOf punycode
 * @param {String} input The Punycode string of ASCII-only symbols.
 * @returns {String} The resulting string of Unicode symbols.
 */
const decode = function(input) {
	// Don't use UCS-2.
	const output = [];
	const inputLength = input.length;
	let i = 0;
	let n = initialN;
	let bias = initialBias;

	// Handle the basic code points: let `basic` be the number of input code
	// points before the last delimiter, or `0` if there is none, then copy
	// the first basic code points to the output.

	let basic = input.lastIndexOf(delimiter);
	if (basic < 0) {
		basic = 0;
	}

	for (let j = 0; j < basic; ++j) {
		// if it's not a basic code point
		if (input.charCodeAt(j) >= 0x80) {
			error('not-basic');
		}
		output.push(input.charCodeAt(j));
	}

	// Main decoding loop: start just after the last delimiter if any basic code
	// points were copied; start at the beginning otherwise.

	for (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {

		// `index` is the index of the next character to be consumed.
		// Decode a generalized variable-length integer into `delta`,
		// which gets added to `i`. The overflow checking is easier
		// if we increase `i` as we go, then subtract off its starting
		// value at the end to obtain `delta`.
		let oldi = i;
		for (let w = 1, k = base; /* no condition */; k += base) {

			if (index >= inputLength) {
				error('invalid-input');
			}

			const digit = basicToDigit(input.charCodeAt(index++));

			if (digit >= base || digit > floor((maxInt - i) / w)) {
				error('overflow');
			}

			i += digit * w;
			const t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);

			if (digit < t) {
				break;
			}

			const baseMinusT = base - t;
			if (w > floor(maxInt / baseMinusT)) {
				error('overflow');
			}

			w *= baseMinusT;

		}

		const out = output.length + 1;
		bias = adapt(i - oldi, out, oldi == 0);

		// `i` was supposed to wrap around from `out` to `0`,
		// incrementing `n` each time, so we'll fix that now:
		if (floor(i / out) > maxInt - n) {
			error('overflow');
		}

		n += floor(i / out);
		i %= out;

		// Insert `n` at position `i` of the output.
		output.splice(i++, 0, n);

	}

	return String.fromCodePoint(...output);
};

/**
 * Converts a string of Unicode symbols (e.g. a domain name label) to a
 * Punycode string of ASCII-only symbols.
 * @memberOf punycode
 * @param {String} input The string of Unicode symbols.
 * @returns {String} The resulting Punycode string of ASCII-only symbols.
 */
const encode = function(input) {
	const output = [];

	// Convert the input in UCS-2 to an array of Unicode code points.
	input = ucs2decode(input);

	// Cache the length.
	let inputLength = input.length;

	// Initialize the state.
	let n = initialN;
	let delta = 0;
	let bias = initialBias;

	// Handle the basic code points.
	for (const currentValue of input) {
		if (currentValue < 0x80) {
			output.push(stringFromCharCode(currentValue));
		}
	}

	let basicLength = output.length;
	let handledCPCount = basicLength;

	// `handledCPCount` is the number of code points that have been handled;
	// `basicLength` is the number of basic code points.

	// Finish the basic string with a delimiter unless it's empty.
	if (basicLength) {
		output.push(delimiter);
	}

	// Main encoding loop:
	while (handledCPCount < inputLength) {

		// All non-basic code points < n have been handled already. Find the next
		// larger one:
		let m = maxInt;
		for (const currentValue of input) {
			if (currentValue >= n && currentValue < m) {
				m = currentValue;
			}
		}

		// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
		// but guard against overflow.
		const handledCPCountPlusOne = handledCPCount + 1;
		if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
			error('overflow');
		}

		delta += (m - n) * handledCPCountPlusOne;
		n = m;

		for (const currentValue of input) {
			if (currentValue < n && ++delta > maxInt) {
				error('overflow');
			}
			if (currentValue == n) {
				// Represent delta as a generalized variable-length integer.
				let q = delta;
				for (let k = base; /* no condition */; k += base) {
					const t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
					if (q < t) {
						break;
					}
					const qMinusT = q - t;
					const baseMinusT = base - t;
					output.push(
						stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))
					);
					q = floor(qMinusT / baseMinusT);
				}

				output.push(stringFromCharCode(digitToBasic(q, 0)));
				bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
				delta = 0;
				++handledCPCount;
			}
		}

		++delta;
		++n;

	}
	return output.join('');
};

/**
 * Converts a Punycode string representing a domain name or an email address
 * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
 * it doesn't matter if you call it on a string that has already been
 * converted to Unicode.
 * @memberOf punycode
 * @param {String} input The Punycoded domain name or email address to
 * convert to Unicode.
 * @returns {String} The Unicode representation of the given Punycode
 * string.
 */
const toUnicode = function(input) {
	return mapDomain(input, function(string) {
		return regexPunycode.test(string)
			? decode(string.slice(4).toLowerCase())
			: string;
	});
};

/**
 * Converts a Unicode string representing a domain name or an email address to
 * Punycode. Only the non-ASCII parts of the domain name will be converted,
 * i.e. it doesn't matter if you call it with a domain that's already in
 * ASCII.
 * @memberOf punycode
 * @param {String} input The domain name or email address to convert, as a
 * Unicode string.
 * @returns {String} The Punycode representation of the given domain name or
 * email address.
 */
const toASCII = function(input) {
	return mapDomain(input, function(string) {
		return regexNonASCII.test(string)
			? 'xn--' + encode(string)
			: string;
	});
};

/*--------------------------------------------------------------------------*/

/** Define the public API */
const punycode = {
	/**
	 * A string representing the current Punycode.js version number.
	 * @memberOf punycode
	 * @type String
	 */
	'version': '2.1.0',
	/**
	 * An object of methods to convert from JavaScript's internal character
	 * representation (UCS-2) to Unicode code points, and back.
	 * @see <https://mathiasbynens.be/notes/javascript-encoding>
	 * @memberOf punycode
	 * @type Object
	 */
	'ucs2': {
		'decode': ucs2decode,
		'encode': ucs2encode
	},
	'decode': decode,
	'encode': encode,
	'toASCII': toASCII,
	'toUnicode': toUnicode
};

export { ucs2decode, ucs2encode, decode, encode, toASCII, toUnicode };
export default punycode;
'use strict';

/** Highest positive signed 32-bit float value */
const maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1

/** Bootstring parameters */
const base = 36;
const tMin = 1;
const tMax = 26;
const skew = 38;
const damp = 700;
const initialBias = 72;
const initialN = 128; // 0x80
const delimiter = '-'; // '\x2D'

/** Regular expressions */
const regexPunycode = /^xn--/;
const regexNonASCII = /[^\0-\x7E]/; // non-ASCII chars
const regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; // RFC 3490 separators

/** Error messages */
const errors = {
	'overflow': 'Overflow: input needs wider integers to process',
	'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
	'invalid-input': 'Invalid input'
};

/** Convenience shortcuts */
const baseMinusTMin = base - tMin;
const floor = Math.floor;
const stringFromCharCode = String.fromCharCode;

/*--------------------------------------------------------------------------*/

/**
 * A generic error utility function.
 * @private
 * @param {String} type The error type.
 * @returns {Error} Throws a `RangeError` with the applicable error message.
 */
function error(type) {
	throw new RangeError(errors[type]);
}

/**
 * A generic `Array#map` utility function.
 * @private
 * @param {Array} array The array to iterate over.
 * @param {Function} callback The function that gets called for every array
 * item.
 * @returns {Array} A new array of values returned by the callback function.
 */
function map(array, fn) {
	const result = [];
	let length = array.length;
	while (length--) {
		result[length] = fn(array[length]);
	}
	return result;
}

/**
 * A simple `Array#map`-like wrapper to work with domain name strings or email
 * addresses.
 * @private
 * @param {String} domain The domain name or email address.
 * @param {Function} callback The function that gets called for every
 * character.
 * @returns {Array} A new string of characters returned by the callback
 * function.
 */
function mapDomain(string, fn) {
	const parts = string.split('@');
	let result = '';
	if (parts.length > 1) {
		// In email addresses, only the domain name should be punycoded. Leave
		// the local part (i.e. everything up to `@`) intact.
		result = parts[0] + '@';
		string = parts[1];
	}
	// Avoid `split(regex)` for IE8 compatibility. See #17.
	string = string.replace(regexSeparators, '\x2E');
	const labels = string.split('.');
	const encoded = map(labels, fn).join('.');
	return result + encoded;
}

/**
 * Creates an array containing the numeric code points of each Unicode
 * character in the string. While JavaScript uses UCS-2 internally,
 * this function will convert a pair of surrogate halves (each of which
 * UCS-2 exposes as separate characters) into a single code point,
 * matching UTF-16.
 * @see `punycode.ucs2.encode`
 * @see <https://mathiasbynens.be/notes/javascript-encoding>
 * @memberOf punycode.ucs2
 * @name decode
 * @param {String} string The Unicode input string (UCS-2).
 * @returns {Array} The new array of code points.
 */
function ucs2decode(string) {
	const output = [];
	let counter = 0;
	const length = string.length;
	while (counter < length) {
		const value = string.charCodeAt(counter++);
		if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
			// It's a high surrogate, and there is a next character.
			const extra = string.charCodeAt(counter++);
			if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.
				output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
			} else {
				// It's an unmatched surrogate; only append this code unit, in case the
				// next code unit is the high surrogate of a surrogate pair.
				output.push(value);
				counter--;
			}
		} else {
			output.push(value);
		}
	}
	return output;
}

/**
 * Creates a string based on an array of numeric code points.
 * @see `punycode.ucs2.decode`
 * @memberOf punycode.ucs2
 * @name encode
 * @param {Array} codePoints The array of numeric code points.
 * @returns {String} The new Unicode string (UCS-2).
 */
const ucs2encode = array => String.fromCodePoint(...array);

/**
 * Converts a basic code point into a digit/integer.
 * @see `digitToBasic()`
 * @private
 * @param {Number} codePoint The basic numeric code point value.
 * @returns {Number} The numeric value of a basic code point (for use in
 * representing integers) in the range `0` to `base - 1`, or `base` if
 * the code point does not represent a value.
 */
const basicToDigit = function(codePoint) {
	if (codePoint - 0x30 < 0x0A) {
		return codePoint - 0x16;
	}
	if (codePoint - 0x41 < 0x1A) {
		return codePoint - 0x41;
	}
	if (codePoint - 0x61 < 0x1A) {
		return codePoint - 0x61;
	}
	return base;
};

/**
 * Converts a digit/integer into a basic code point.
 * @see `basicToDigit()`
 * @private
 * @param {Number} digit The numeric value of a basic code point.
 * @returns {Number} The basic code point whose value (when used for
 * representing integers) is `digit`, which needs to be in the range
 * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
 * used; else, the lowercase form is used. The behavior is undefined
 * if `flag` is non-zero and `digit` has no uppercase form.
 */
const digitToBasic = function(digit, flag) {
	//  0..25 map to ASCII a..z or A..Z
	// 26..35 map to ASCII 0..9
	return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
};

/**
 * Bias adaptation function as per section 3.4 of RFC 3492.
 * https://tools.ietf.org/html/rfc3492#section-3.4
 * @private
 */
const adapt = function(delta, numPoints, firstTime) {
	let k = 0;
	delta = firstTime ? floor(delta / damp) : delta >> 1;
	delta += floor(delta / numPoints);
	for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {
		delta = floor(delta / baseMinusTMin);
	}
	return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
};

/**
 * Converts a Punycode string of ASCII-only symbols to a string of Unicode
 * symbols.
 * @memberOf punycode
 * @param {String} input The Punycode string of ASCII-only symbols.
 * @returns {String} The resulting string of Unicode symbols.
 */
const decode = function(input) {
	// Don't use UCS-2.
	const output = [];
	const inputLength = input.length;
	let i = 0;
	let n = initialN;
	let bias = initialBias;

	// Handle the basic code points: let `basic` be the number of input code
	// points before the last delimiter, or `0` if there is none, then copy
	// the first basic code points to the output.

	let basic = input.lastIndexOf(delimiter);
	if (basic < 0) {
		basic = 0;
	}

	for (let j = 0; j < basic; ++j) {
		// if it's not a basic code point
		if (input.charCodeAt(j) >= 0x80) {
			error('not-basic');
		}
		output.push(input.charCodeAt(j));
	}

	// Main decoding loop: start just after the last delimiter if any basic code
	// points were copied; start at the beginning otherwise.

	for (let index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {

		// `index` is the index of the next character to be consumed.
		// Decode a generalized variable-length integer into `delta`,
		// which gets added to `i`. The overflow checking is easier
		// if we increase `i` as we go, then subtract off its starting
		// value at the end to obtain `delta`.
		let oldi = i;
		for (let w = 1, k = base; /* no condition */; k += base) {

			if (index >= inputLength) {
				error('invalid-input');
			}

			const digit = basicToDigit(input.charCodeAt(index++));

			if (digit >= base || digit > floor((maxInt - i) / w)) {
				error('overflow');
			}

			i += digit * w;
			const t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);

			if (digit < t) {
				break;
			}

			const baseMinusT = base - t;
			if (w > floor(maxInt / baseMinusT)) {
				error('overflow');
			}

			w *= baseMinusT;

		}

		const out = output.length + 1;
		bias = adapt(i - oldi, out, oldi == 0);

		// `i` was supposed to wrap around from `out` to `0`,
		// incrementing `n` each time, so we'll fix that now:
		if (floor(i / out) > maxInt - n) {
			error('overflow');
		}

		n += floor(i / out);
		i %= out;

		// Insert `n` at position `i` of the output.
		output.splice(i++, 0, n);

	}

	return String.fromCodePoint(...output);
};

/**
 * Converts a string of Unicode symbols (e.g. a domain name label) to a
 * Punycode string of ASCII-only symbols.
 * @memberOf punycode
 * @param {String} input The string of Unicode symbols.
 * @returns {String} The resulting Punycode string of ASCII-only symbols.
 */
const encode = function(input) {
	const output = [];

	// Convert the input in UCS-2 to an array of Unicode code points.
	input = ucs2decode(input);

	// Cache the length.
	let inputLength = input.length;

	// Initialize the state.
	let n = initialN;
	let delta = 0;
	let bias = initialBias;

	// Handle the basic code points.
	for (const currentValue of input) {
		if (currentValue < 0x80) {
			output.push(stringFromCharCode(currentValue));
		}
	}

	let basicLength = output.length;
	let handledCPCount = basicLength;

	// `handledCPCount` is the number of code points that have been handled;
	// `basicLength` is the number of basic code points.

	// Finish the basic string with a delimiter unless it's empty.
	if (basicLength) {
		output.push(delimiter);
	}

	// Main encoding loop:
	while (handledCPCount < inputLength) {

		// All non-basic code points < n have been handled already. Find the next
		// larger one:
		let m = maxInt;
		for (const currentValue of input) {
			if (currentValue >= n && currentValue < m) {
				m = currentValue;
			}
		}

		// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
		// but guard against overflow.
		const handledCPCountPlusOne = handledCPCount + 1;
		if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
			error('overflow');
		}

		delta += (m - n) * handledCPCountPlusOne;
		n = m;

		for (const currentValue of input) {
			if (currentValue < n && ++delta > maxInt) {
				error('overflow');
			}
			if (currentValue == n) {
				// Represent delta as a generalized variable-length integer.
				let q = delta;
				for (let k = base; /* no condition */; k += base) {
					const t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
					if (q < t) {
						break;
					}
					const qMinusT = q - t;
					const baseMinusT = base - t;
					output.push(
						stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))
					);
					q = floor(qMinusT / baseMinusT);
				}

				output.push(stringFromCharCode(digitToBasic(q, 0)));
				bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
				delta = 0;
				++handledCPCount;
			}
		}

		++delta;
		++n;

	}
	return output.join('');
};

/**
 * Converts a Punycode string representing a domain name or an email address
 * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
 * it doesn't matter if you call it on a string that has already been
 * converted to Unicode.
 * @memberOf punycode
 * @param {String} input The Punycoded domain name or email address to
 * convert to Unicode.
 * @returns {String} The Unicode representation of the given Punycode
 * string.
 */
const toUnicode = function(input) {
	return mapDomain(input, function(string) {
		return regexPunycode.test(string)
			? decode(string.slice(4).toLowerCase())
			: string;
	});
};

/**
 * Converts a Unicode string representing a domain name or an email address to
 * Punycode. Only the non-ASCII parts of the domain name will be converted,
 * i.e. it doesn't matter if you call it with a domain that's already in
 * ASCII.
 * @memberOf punycode
 * @param {String} input The domain name or email address to convert, as a
 * Unicode string.
 * @returns {String} The Punycode representation of the given domain name or
 * email address.
 */
const toASCII = function(input) {
	return mapDomain(input, function(string) {
		return regexNonASCII.test(string)
			? 'xn--' + encode(string)
			: string;
	});
};

/*--------------------------------------------------------------------------*/

/** Define the public API */
const punycode = {
	/**
	 * A string representing the current Punycode.js version number.
	 * @memberOf punycode
	 * @type String
	 */
	'version': '2.1.0',
	/**
	 * An object of methods to convert from JavaScript's internal character
	 * representation (UCS-2) to Unicode code points, and back.
	 * @see <https://mathiasbynens.be/notes/javascript-encoding>
	 * @memberOf punycode
	 * @type Object
	 */
	'ucs2': {
		'decode': ucs2decode,
		'encode': ucs2encode
	},
	'decode': decode,
	'encode': encode,
	'toASCII': toASCII,
	'toUnicode': toUnicode
};

module.exports = punycode;
root = true

[*]
indent_style = space
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 160
quote_type = single

[test/*]
max_line_length = off

[LICENSE.md]
indent_size = off

[*.md]
max_line_length = off

[*.json]
max_line_length = off

[Makefile]
max_line_length = off

[CHANGELOG.md]
indent_style = space
indent_size = 2

[LICENSE]
indent_size = 2
max_line_length = off

[coverage/**/*]
indent_size = off
indent_style = off
indent = off
max_line_length = off

[.nycrc]
indent_style = tab
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"lines": 86,
	"statements": 85.93,
	"functions": 82.43,
	"branches": 76.06,
	"exclude": [
		"coverage",
		"dist"
	]
}
BSD 3-Clause License

Copyright (c) 2014, Nathan LaFreniere and other [contributors](https://github.com/ljharb/qs/graphs/contributors)
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.

3. Neither the name of the copyright holder nor the names of its
   contributors may 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 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.
{
  "name": "qs",
  "description": "A querystring parser that supports nesting and arrays, with a depth limit",
  "homepage": "https://github.com/ljharb/qs",
  "version": "6.11.0",
  "repository": {
    "type": "git",
    "url": "https://github.com/ljharb/qs.git"
  },
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "main": "lib/index.js",
  "engines": {
    "node": ">=0.6"
  },
  "dependencies": {
    "side-channel": "^1.0.4"
  },
  "devDependencies": {
    "@ljharb/eslint-config": "^21.0.0",
    "aud": "^2.0.0",
    "browserify": "^16.5.2",
    "eclint": "^2.8.1",
    "eslint": "=8.8.0",
    "evalmd": "^0.0.19",
    "for-each": "^0.3.3",
    "has-symbols": "^1.0.3",
    "iconv-lite": "^0.5.1",
    "in-publish": "^2.0.1",
    "mkdirp": "^0.5.5",
    "npmignore": "^0.3.0",
    "nyc": "^10.3.2",
    "object-inspect": "^1.12.2",
    "qs-iconv": "^1.0.4",
    "safe-publish-latest": "^2.0.0",
    "safer-buffer": "^2.1.2",
    "tape": "^5.5.3"
  },
  "license": "BSD-3-Clause",
  "publishConfig": {
    "ignore": [
      "!dist/*",
      "bower.json",
      "component.json",
      ".github/workflows"
    ]
  }
}'use strict';

var replace = String.prototype.replace;
var percentTwenties = /%20/g;

var Format = {
    RFC1738: 'RFC1738',
    RFC3986: 'RFC3986'
};

module.exports = {
    'default': Format.RFC3986,
    formatters: {
        RFC1738: function (value) {
            return replace.call(value, percentTwenties, '+');
        },
        RFC3986: function (value) {
            return String(value);
        }
    },
    RFC1738: Format.RFC1738,
    RFC3986: Format.RFC3986
};
'use strict';

var stringify = require('./stringify');
var parse = require('./parse');
var formats = require('./formats');

module.exports = {
    formats: formats,
    parse: parse,
    stringify: stringify
};
'use strict';

var utils = require('./utils');

var has = Object.prototype.hasOwnProperty;
var isArray = Array.isArray;

var defaults = {
    allowDots: false,
    allowPrototypes: false,
    allowSparse: false,
    arrayLimit: 20,
    charset: 'utf-8',
    charsetSentinel: false,
    comma: false,
    decoder: utils.decode,
    delimiter: '&',
    depth: 5,
    ignoreQueryPrefix: false,
    interpretNumericEntities: false,
    parameterLimit: 1000,
    parseArrays: true,
    plainObjects: false,
    strictNullHandling: false
};

var interpretNumericEntities = function (str) {
    return str.replace(/&#(\d+);/g, function ($0, numberStr) {
        return String.fromCharCode(parseInt(numberStr, 10));
    });
};

var parseArrayValue = function (val, options) {
    if (val && typeof val === 'string' && options.comma && val.indexOf(',') > -1) {
        return val.split(',');
    }

    return val;
};

// This is what browsers will submit when the ✓ character occurs in an
// application/x-www-form-urlencoded body and the encoding of the page containing
// the form is iso-8859-1, or when the submitted form has an accept-charset
// attribute of iso-8859-1. Presumably also with other charsets that do not contain
// the ✓ character, such as us-ascii.
var isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('&#10003;')

// These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded.
var charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓')

var parseValues = function parseQueryStringValues(str, options) {
    var obj = {};
    var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str;
    var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit;
    var parts = cleanStr.split(options.delimiter, limit);
    var skipIndex = -1; // Keep track of where the utf8 sentinel was found
    var i;

    var charset = options.charset;
    if (options.charsetSentinel) {
        for (i = 0; i < parts.length; ++i) {
            if (parts[i].indexOf('utf8=') === 0) {
                if (parts[i] === charsetSentinel) {
                    charset = 'utf-8';
                } else if (parts[i] === isoSentinel) {
                    charset = 'iso-8859-1';
                }
                skipIndex = i;
                i = parts.length; // The eslint settings do not allow break;
            }
        }
    }

    for (i = 0; i < parts.length; ++i) {
        if (i === skipIndex) {
            continue;
        }
        var part = parts[i];

        var bracketEqualsPos = part.indexOf(']=');
        var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;

        var key, val;
        if (pos === -1) {
            key = options.decoder(part, defaults.decoder, charset, 'key');
            val = options.strictNullHandling ? null : '';
        } else {
            key = options.decoder(part.slice(0, pos), defaults.decoder, charset, 'key');
            val = utils.maybeMap(
                parseArrayValue(part.slice(pos + 1), options),
                function (encodedVal) {
                    return options.decoder(encodedVal, defaults.decoder, charset, 'value');
                }
            );
        }

        if (val && options.interpretNumericEntities && charset === 'iso-8859-1') {
            val = interpretNumericEntities(val);
        }

        if (part.indexOf('[]=') > -1) {
            val = isArray(val) ? [val] : val;
        }

        if (has.call(obj, key)) {
            obj[key] = utils.combine(obj[key], val);
        } else {
            obj[key] = val;
        }
    }

    return obj;
};

var parseObject = function (chain, val, options, valuesParsed) {
    var leaf = valuesParsed ? val : parseArrayValue(val, options);

    for (var i = chain.length - 1; i >= 0; --i) {
        var obj;
        var root = chain[i];

        if (root === '[]' && options.parseArrays) {
            obj = [].concat(leaf);
        } else {
            obj = options.plainObjects ? Object.create(null) : {};
            var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;
            var index = parseInt(cleanRoot, 10);
            if (!options.parseArrays && cleanRoot === '') {
                obj = { 0: leaf };
            } else if (
                !isNaN(index)
                && root !== cleanRoot
                && String(index) === cleanRoot
                && index >= 0
                && (options.parseArrays && index <= options.arrayLimit)
            ) {
                obj = [];
                obj[index] = leaf;
            } else if (cleanRoot !== '__proto__') {
                obj[cleanRoot] = leaf;
            }
        }

        leaf = obj;
    }

    return leaf;
};

var parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) {
    if (!givenKey) {
        return;
    }

    // Transform dot notation to bracket notation
    var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey;

    // The regex chunks

    var brackets = /(\[[^[\]]*])/;
    var child = /(\[[^[\]]*])/g;

    // Get the parent

    var segment = options.depth > 0 && brackets.exec(key);
    var parent = segment ? key.slice(0, segment.index) : key;

    // Stash the parent if it exists

    var keys = [];
    if (parent) {
        // If we aren't using plain objects, optionally prefix keys that would overwrite object prototype properties
        if (!options.plainObjects && has.call(Object.prototype, parent)) {
            if (!options.allowPrototypes) {
                return;
            }
        }

        keys.push(parent);
    }

    // Loop through children appending to the array until we hit depth

    var i = 0;
    while (options.depth > 0 && (segment = child.exec(key)) !== null && i < options.depth) {
        i += 1;
        if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) {
            if (!options.allowPrototypes) {
                return;
            }
        }
        keys.push(segment[1]);
    }

    // If there's a remainder, just add whatever is left

    if (segment) {
        keys.push('[' + key.slice(segment.index) + ']');
    }

    return parseObject(keys, val, options, valuesParsed);
};

var normalizeParseOptions = function normalizeParseOptions(opts) {
    if (!opts) {
        return defaults;
    }

    if (opts.decoder !== null && opts.decoder !== undefined && typeof opts.decoder !== 'function') {
        throw new TypeError('Decoder has to be a function.');
    }

    if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {
        throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');
    }
    var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset;

    return {
        allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots,
        allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes,
        allowSparse: typeof opts.allowSparse === 'boolean' ? opts.allowSparse : defaults.allowSparse,
        arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit,
        charset: charset,
        charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,
        comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma,
        decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder,
        delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter,
        // eslint-disable-next-line no-implicit-coercion, no-extra-parens
        depth: (typeof opts.depth === 'number' || opts.depth === false) ? +opts.depth : defaults.depth,
        ignoreQueryPrefix: opts.ignoreQueryPrefix === true,
        interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities,
        parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit,
        parseArrays: opts.parseArrays !== false,
        plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects,
        strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling
    };
};

module.exports = function (str, opts) {
    var options = normalizeParseOptions(opts);

    if (str === '' || str === null || typeof str === 'undefined') {
        return options.plainObjects ? Object.create(null) : {};
    }

    var tempObj = typeof str === 'string' ? parseValues(str, options) : str;
    var obj = options.plainObjects ? Object.create(null) : {};

    // Iterate over the keys and setup the new object

    var keys = Object.keys(tempObj);
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        var newObj = parseKeys(key, tempObj[key], options, typeof str === 'string');
        obj = utils.merge(obj, newObj, options);
    }

    if (options.allowSparse === true) {
        return obj;
    }

    return utils.compact(obj);
};
'use strict';

var getSideChannel = require('side-channel');
var utils = require('./utils');
var formats = require('./formats');
var has = Object.prototype.hasOwnProperty;

var arrayPrefixGenerators = {
    brackets: function brackets(prefix) {
        return prefix + '[]';
    },
    comma: 'comma',
    indices: function indices(prefix, key) {
        return prefix + '[' + key + ']';
    },
    repeat: function repeat(prefix) {
        return prefix;
    }
};

var isArray = Array.isArray;
var split = String.prototype.split;
var push = Array.prototype.push;
var pushToArray = function (arr, valueOrArray) {
    push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]);
};

var toISO = Date.prototype.toISOString;

var defaultFormat = formats['default'];
var defaults = {
    addQueryPrefix: false,
    allowDots: false,
    charset: 'utf-8',
    charsetSentinel: false,
    delimiter: '&',
    encode: true,
    encoder: utils.encode,
    encodeValuesOnly: false,
    format: defaultFormat,
    formatter: formats.formatters[defaultFormat],
    // deprecated
    indices: false,
    serializeDate: function serializeDate(date) {
        return toISO.call(date);
    },
    skipNulls: false,
    strictNullHandling: false
};

var isNonNullishPrimitive = function isNonNullishPrimitive(v) {
    return typeof v === 'string'
        || typeof v === 'number'
        || typeof v === 'boolean'
        || typeof v === 'symbol'
        || typeof v === 'bigint';
};

var sentinel = {};

var stringify = function stringify(
    object,
    prefix,
    generateArrayPrefix,
    commaRoundTrip,
    strictNullHandling,
    skipNulls,
    encoder,
    filter,
    sort,
    allowDots,
    serializeDate,
    format,
    formatter,
    encodeValuesOnly,
    charset,
    sideChannel
) {
    var obj = object;

    var tmpSc = sideChannel;
    var step = 0;
    var findFlag = false;
    while ((tmpSc = tmpSc.get(sentinel)) !== void undefined && !findFlag) {
        // Where object last appeared in the ref tree
        var pos = tmpSc.get(object);
        step += 1;
        if (typeof pos !== 'undefined') {
            if (pos === step) {
                throw new RangeError('Cyclic object value');
            } else {
                findFlag = true; // Break while
            }
        }
        if (typeof tmpSc.get(sentinel) === 'undefined') {
            step = 0;
        }
    }

    if (typeof filter === 'function') {
        obj = filter(prefix, obj);
    } else if (obj instanceof Date) {
        obj = serializeDate(obj);
    } else if (generateArrayPrefix === 'comma' && isArray(obj)) {
        obj = utils.maybeMap(obj, function (value) {
            if (value instanceof Date) {
                return serializeDate(value);
            }
            return value;
        });
    }

    if (obj === null) {
        if (strictNullHandling) {
            return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key', format) : prefix;
        }

        obj = '';
    }

    if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) {
        if (encoder) {
            var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset, 'key', format);
            if (generateArrayPrefix === 'comma' && encodeValuesOnly) {
                var valuesArray = split.call(String(obj), ',');
                var valuesJoined = '';
                for (var i = 0; i < valuesArray.length; ++i) {
                    valuesJoined += (i === 0 ? '' : ',') + formatter(encoder(valuesArray[i], defaults.encoder, charset, 'value', format));
                }
                return [formatter(keyValue) + (commaRoundTrip && isArray(obj) && valuesArray.length === 1 ? '[]' : '') + '=' + valuesJoined];
            }
            return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset, 'value', format))];
        }
        return [formatter(prefix) + '=' + formatter(String(obj))];
    }

    var values = [];

    if (typeof obj === 'undefined') {
        return values;
    }

    var objKeys;
    if (generateArrayPrefix === 'comma' && isArray(obj)) {
        // we need to join elements in
        objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }];
    } else if (isArray(filter)) {
        objKeys = filter;
    } else {
        var keys = Object.keys(obj);
        objKeys = sort ? keys.sort(sort) : keys;
    }

    var adjustedPrefix = commaRoundTrip && isArray(obj) && obj.length === 1 ? prefix + '[]' : prefix;

    for (var j = 0; j < objKeys.length; ++j) {
        var key = objKeys[j];
        var value = typeof key === 'object' && typeof key.value !== 'undefined' ? key.value : obj[key];

        if (skipNulls && value === null) {
            continue;
        }

        var keyPrefix = isArray(obj)
            ? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(adjustedPrefix, key) : adjustedPrefix
            : adjustedPrefix + (allowDots ? '.' + key : '[' + key + ']');

        sideChannel.set(object, step);
        var valueSideChannel = getSideChannel();
        valueSideChannel.set(sentinel, sideChannel);
        pushToArray(values, stringify(
            value,
            keyPrefix,
            generateArrayPrefix,
            commaRoundTrip,
            strictNullHandling,
            skipNulls,
            encoder,
            filter,
            sort,
            allowDots,
            serializeDate,
            format,
            formatter,
            encodeValuesOnly,
            charset,
            valueSideChannel
        ));
    }

    return values;
};

var normalizeStringifyOptions = function normalizeStringifyOptions(opts) {
    if (!opts) {
        return defaults;
    }

    if (opts.encoder !== null && typeof opts.encoder !== 'undefined' && typeof opts.encoder !== 'function') {
        throw new TypeError('Encoder has to be a function.');
    }

    var charset = opts.charset || defaults.charset;
    if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {
        throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');
    }

    var format = formats['default'];
    if (typeof opts.format !== 'undefined') {
        if (!has.call(formats.formatters, opts.format)) {
            throw new TypeError('Unknown format option provided.');
        }
        format = opts.format;
    }
    var formatter = formats.formatters[format];

    var filter = defaults.filter;
    if (typeof opts.filter === 'function' || isArray(opts.filter)) {
        filter = opts.filter;
    }

    return {
        addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix,
        allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots,
        charset: charset,
        charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,
        delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter,
        encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode,
        encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder,
        encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly,
        filter: filter,
        format: format,
        formatter: formatter,
        serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate,
        skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls,
        sort: typeof opts.sort === 'function' ? opts.sort : null,
        strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling
    };
};

module.exports = function (object, opts) {
    var obj = object;
    var options = normalizeStringifyOptions(opts);

    var objKeys;
    var filter;

    if (typeof options.filter === 'function') {
        filter = options.filter;
        obj = filter('', obj);
    } else if (isArray(options.filter)) {
        filter = options.filter;
        objKeys = filter;
    }

    var keys = [];

    if (typeof obj !== 'object' || obj === null) {
        return '';
    }

    var arrayFormat;
    if (opts && opts.arrayFormat in arrayPrefixGenerators) {
        arrayFormat = opts.arrayFormat;
    } else if (opts && 'indices' in opts) {
        arrayFormat = opts.indices ? 'indices' : 'repeat';
    } else {
        arrayFormat = 'indices';
    }

    var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];
    if (opts && 'commaRoundTrip' in opts && typeof opts.commaRoundTrip !== 'boolean') {
        throw new TypeError('`commaRoundTrip` must be a boolean, or absent');
    }
    var commaRoundTrip = generateArrayPrefix === 'comma' && opts && opts.commaRoundTrip;

    if (!objKeys) {
        objKeys = Object.keys(obj);
    }

    if (options.sort) {
        objKeys.sort(options.sort);
    }

    var sideChannel = getSideChannel();
    for (var i = 0; i < objKeys.length; ++i) {
        var key = objKeys[i];

        if (options.skipNulls && obj[key] === null) {
            continue;
        }
        pushToArray(keys, stringify(
            obj[key],
            key,
            generateArrayPrefix,
            commaRoundTrip,
            options.strictNullHandling,
            options.skipNulls,
            options.encode ? options.encoder : null,
            options.filter,
            options.sort,
            options.allowDots,
            options.serializeDate,
            options.format,
            options.formatter,
            options.encodeValuesOnly,
            options.charset,
            sideChannel
        ));
    }

    var joined = keys.join(options.delimiter);
    var prefix = options.addQueryPrefix === true ? '?' : '';

    if (options.charsetSentinel) {
        if (options.charset === 'iso-8859-1') {
            // encodeURIComponent('&#10003;'), the "numeric entity" representation of a checkmark
            prefix += 'utf8=%26%2310003%3B&';
        } else {
            // encodeURIComponent('✓')
            prefix += 'utf8=%E2%9C%93&';
        }
    }

    return joined.length > 0 ? prefix + joined : '';
};
'use strict';

var formats = require('./formats');

var has = Object.prototype.hasOwnProperty;
var isArray = Array.isArray;

var hexTable = (function () {
    var array = [];
    for (var i = 0; i < 256; ++i) {
        array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());
    }

    return array;
}());

var compactQueue = function compactQueue(queue) {
    while (queue.length > 1) {
        var item = queue.pop();
        var obj = item.obj[item.prop];

        if (isArray(obj)) {
            var compacted = [];

            for (var j = 0; j < obj.length; ++j) {
                if (typeof obj[j] !== 'undefined') {
                    compacted.push(obj[j]);
                }
            }

            item.obj[item.prop] = compacted;
        }
    }
};

var arrayToObject = function arrayToObject(source, options) {
    var obj = options && options.plainObjects ? Object.create(null) : {};
    for (var i = 0; i < source.length; ++i) {
        if (typeof source[i] !== 'undefined') {
            obj[i] = source[i];
        }
    }

    return obj;
};

var merge = function merge(target, source, options) {
    /* eslint no-param-reassign: 0 */
    if (!source) {
        return target;
    }

    if (typeof source !== 'object') {
        if (isArray(target)) {
            target.push(source);
        } else if (target && typeof target === 'object') {
            if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) {
                target[source] = true;
            }
        } else {
            return [target, source];
        }

        return target;
    }

    if (!target || typeof target !== 'object') {
        return [target].concat(source);
    }

    var mergeTarget = target;
    if (isArray(target) && !isArray(source)) {
        mergeTarget = arrayToObject(target, options);
    }

    if (isArray(target) && isArray(source)) {
        source.forEach(function (item, i) {
            if (has.call(target, i)) {
                var targetItem = target[i];
                if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') {
                    target[i] = merge(targetItem, item, options);
                } else {
                    target.push(item);
                }
            } else {
                target[i] = item;
            }
        });
        return target;
    }

    return Object.keys(source).reduce(function (acc, key) {
        var value = source[key];

        if (has.call(acc, key)) {
            acc[key] = merge(acc[key], value, options);
        } else {
            acc[key] = value;
        }
        return acc;
    }, mergeTarget);
};

var assign = function assignSingleSource(target, source) {
    return Object.keys(source).reduce(function (acc, key) {
        acc[key] = source[key];
        return acc;
    }, target);
};

var decode = function (str, decoder, charset) {
    var strWithoutPlus = str.replace(/\+/g, ' ');
    if (charset === 'iso-8859-1') {
        // unescape never throws, no try...catch needed:
        return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape);
    }
    // utf-8
    try {
        return decodeURIComponent(strWithoutPlus);
    } catch (e) {
        return strWithoutPlus;
    }
};

var encode = function encode(str, defaultEncoder, charset, kind, format) {
    // This code was originally written by Brian White (mscdex) for the io.js core querystring library.
    // It has been adapted here for stricter adherence to RFC 3986
    if (str.length === 0) {
        return str;
    }

    var string = str;
    if (typeof str === 'symbol') {
        string = Symbol.prototype.toString.call(str);
    } else if (typeof str !== 'string') {
        string = String(str);
    }

    if (charset === 'iso-8859-1') {
        return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) {
            return '%26%23' + parseInt($0.slice(2), 16) + '%3B';
        });
    }

    var out = '';
    for (var i = 0; i < string.length; ++i) {
        var c = string.charCodeAt(i);

        if (
            c === 0x2D // -
            || c === 0x2E // .
            || c === 0x5F // _
            || c === 0x7E // ~
            || (c >= 0x30 && c <= 0x39) // 0-9
            || (c >= 0x41 && c <= 0x5A) // a-z
            || (c >= 0x61 && c <= 0x7A) // A-Z
            || (format === formats.RFC1738 && (c === 0x28 || c === 0x29)) // ( )
        ) {
            out += string.charAt(i);
            continue;
        }

        if (c < 0x80) {
            out = out + hexTable[c];
            continue;
        }

        if (c < 0x800) {
            out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);
            continue;
        }

        if (c < 0xD800 || c >= 0xE000) {
            out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);
            continue;
        }

        i += 1;
        c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));
        /* eslint operator-linebreak: [2, "before"] */
        out += hexTable[0xF0 | (c >> 18)]
            + hexTable[0x80 | ((c >> 12) & 0x3F)]
            + hexTable[0x80 | ((c >> 6) & 0x3F)]
            + hexTable[0x80 | (c & 0x3F)];
    }

    return out;
};

var compact = function compact(value) {
    var queue = [{ obj: { o: value }, prop: 'o' }];
    var refs = [];

    for (var i = 0; i < queue.length; ++i) {
        var item = queue[i];
        var obj = item.obj[item.prop];

        var keys = Object.keys(obj);
        for (var j = 0; j < keys.length; ++j) {
            var key = keys[j];
            var val = obj[key];
            if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {
                queue.push({ obj: obj, prop: key });
                refs.push(val);
            }
        }
    }

    compactQueue(queue);

    return value;
};

var isRegExp = function isRegExp(obj) {
    return Object.prototype.toString.call(obj) === '[object RegExp]';
};

var isBuffer = function isBuffer(obj) {
    if (!obj || typeof obj !== 'object') {
        return false;
    }

    return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));
};

var combine = function combine(a, b) {
    return [].concat(a, b);
};

var maybeMap = function maybeMap(val, fn) {
    if (isArray(val)) {
        var mapped = [];
        for (var i = 0; i < val.length; i += 1) {
            mapped.push(fn(val[i]));
        }
        return mapped;
    }
    return fn(val);
};

module.exports = {
    arrayToObject: arrayToObject,
    assign: assign,
    combine: combine,
    compact: compact,
    decode: decode,
    encode: encode,
    isBuffer: isBuffer,
    isRegExp: isRegExp,
    maybeMap: maybeMap,
    merge: merge
};
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Qs = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
'use strict';

var replace = String.prototype.replace;
var percentTwenties = /%20/g;

var Format = {
    RFC1738: 'RFC1738',
    RFC3986: 'RFC3986'
};

module.exports = {
    'default': Format.RFC3986,
    formatters: {
        RFC1738: function (value) {
            return replace.call(value, percentTwenties, '+');
        },
        RFC3986: function (value) {
            return String(value);
        }
    },
    RFC1738: Format.RFC1738,
    RFC3986: Format.RFC3986
};

},{}],2:[function(require,module,exports){
'use strict';

var stringify = require('./stringify');
var parse = require('./parse');
var formats = require('./formats');

module.exports = {
    formats: formats,
    parse: parse,
    stringify: stringify
};

},{"./formats":1,"./parse":3,"./stringify":4}],3:[function(require,module,exports){
'use strict';

var utils = require('./utils');

var has = Object.prototype.hasOwnProperty;
var isArray = Array.isArray;

var defaults = {
    allowDots: false,
    allowPrototypes: false,
    allowSparse: false,
    arrayLimit: 20,
    charset: 'utf-8',
    charsetSentinel: false,
    comma: false,
    decoder: utils.decode,
    delimiter: '&',
    depth: 5,
    ignoreQueryPrefix: false,
    interpretNumericEntities: false,
    parameterLimit: 1000,
    parseArrays: true,
    plainObjects: false,
    strictNullHandling: false
};

var interpretNumericEntities = function (str) {
    return str.replace(/&#(\d+);/g, function ($0, numberStr) {
        return String.fromCharCode(parseInt(numberStr, 10));
    });
};

var parseArrayValue = function (val, options) {
    if (val && typeof val === 'string' && options.comma && val.indexOf(',') > -1) {
        return val.split(',');
    }

    return val;
};

// This is what browsers will submit when the ✓ character occurs in an
// application/x-www-form-urlencoded body and the encoding of the page containing
// the form is iso-8859-1, or when the submitted form has an accept-charset
// attribute of iso-8859-1. Presumably also with other charsets that do not contain
// the ✓ character, such as us-ascii.
var isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('&#10003;')

// These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded.
var charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓')

var parseValues = function parseQueryStringValues(str, options) {
    var obj = {};
    var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str;
    var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit;
    var parts = cleanStr.split(options.delimiter, limit);
    var skipIndex = -1; // Keep track of where the utf8 sentinel was found
    var i;

    var charset = options.charset;
    if (options.charsetSentinel) {
        for (i = 0; i < parts.length; ++i) {
            if (parts[i].indexOf('utf8=') === 0) {
                if (parts[i] === charsetSentinel) {
                    charset = 'utf-8';
                } else if (parts[i] === isoSentinel) {
                    charset = 'iso-8859-1';
                }
                skipIndex = i;
                i = parts.length; // The eslint settings do not allow break;
            }
        }
    }

    for (i = 0; i < parts.length; ++i) {
        if (i === skipIndex) {
            continue;
        }
        var part = parts[i];

        var bracketEqualsPos = part.indexOf(']=');
        var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;

        var key, val;
        if (pos === -1) {
            key = options.decoder(part, defaults.decoder, charset, 'key');
            val = options.strictNullHandling ? null : '';
        } else {
            key = options.decoder(part.slice(0, pos), defaults.decoder, charset, 'key');
            val = utils.maybeMap(
                parseArrayValue(part.slice(pos + 1), options),
                function (encodedVal) {
                    return options.decoder(encodedVal, defaults.decoder, charset, 'value');
                }
            );
        }

        if (val && options.interpretNumericEntities && charset === 'iso-8859-1') {
            val = interpretNumericEntities(val);
        }

        if (part.indexOf('[]=') > -1) {
            val = isArray(val) ? [val] : val;
        }

        if (has.call(obj, key)) {
            obj[key] = utils.combine(obj[key], val);
        } else {
            obj[key] = val;
        }
    }

    return obj;
};

var parseObject = function (chain, val, options, valuesParsed) {
    var leaf = valuesParsed ? val : parseArrayValue(val, options);

    for (var i = chain.length - 1; i >= 0; --i) {
        var obj;
        var root = chain[i];

        if (root === '[]' && options.parseArrays) {
            obj = [].concat(leaf);
        } else {
            obj = options.plainObjects ? Object.create(null) : {};
            var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;
            var index = parseInt(cleanRoot, 10);
            if (!options.parseArrays && cleanRoot === '') {
                obj = { 0: leaf };
            } else if (
                !isNaN(index)
                && root !== cleanRoot
                && String(index) === cleanRoot
                && index >= 0
                && (options.parseArrays && index <= options.arrayLimit)
            ) {
                obj = [];
                obj[index] = leaf;
            } else if (cleanRoot !== '__proto__') {
                obj[cleanRoot] = leaf;
            }
        }

        leaf = obj;
    }

    return leaf;
};

var parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) {
    if (!givenKey) {
        return;
    }

    // Transform dot notation to bracket notation
    var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey;

    // The regex chunks

    var brackets = /(\[[^[\]]*])/;
    var child = /(\[[^[\]]*])/g;

    // Get the parent

    var segment = options.depth > 0 && brackets.exec(key);
    var parent = segment ? key.slice(0, segment.index) : key;

    // Stash the parent if it exists

    var keys = [];
    if (parent) {
        // If we aren't using plain objects, optionally prefix keys that would overwrite object prototype properties
        if (!options.plainObjects && has.call(Object.prototype, parent)) {
            if (!options.allowPrototypes) {
                return;
            }
        }

        keys.push(parent);
    }

    // Loop through children appending to the array until we hit depth

    var i = 0;
    while (options.depth > 0 && (segment = child.exec(key)) !== null && i < options.depth) {
        i += 1;
        if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) {
            if (!options.allowPrototypes) {
                return;
            }
        }
        keys.push(segment[1]);
    }

    // If there's a remainder, just add whatever is left

    if (segment) {
        keys.push('[' + key.slice(segment.index) + ']');
    }

    return parseObject(keys, val, options, valuesParsed);
};

var normalizeParseOptions = function normalizeParseOptions(opts) {
    if (!opts) {
        return defaults;
    }

    if (opts.decoder !== null && opts.decoder !== undefined && typeof opts.decoder !== 'function') {
        throw new TypeError('Decoder has to be a function.');
    }

    if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {
        throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');
    }
    var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset;

    return {
        allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots,
        allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes,
        allowSparse: typeof opts.allowSparse === 'boolean' ? opts.allowSparse : defaults.allowSparse,
        arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit,
        charset: charset,
        charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,
        comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma,
        decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder,
        delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter,
        // eslint-disable-next-line no-implicit-coercion, no-extra-parens
        depth: (typeof opts.depth === 'number' || opts.depth === false) ? +opts.depth : defaults.depth,
        ignoreQueryPrefix: opts.ignoreQueryPrefix === true,
        interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities,
        parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit,
        parseArrays: opts.parseArrays !== false,
        plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects,
        strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling
    };
};

module.exports = function (str, opts) {
    var options = normalizeParseOptions(opts);

    if (str === '' || str === null || typeof str === 'undefined') {
        return options.plainObjects ? Object.create(null) : {};
    }

    var tempObj = typeof str === 'string' ? parseValues(str, options) : str;
    var obj = options.plainObjects ? Object.create(null) : {};

    // Iterate over the keys and setup the new object

    var keys = Object.keys(tempObj);
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        var newObj = parseKeys(key, tempObj[key], options, typeof str === 'string');
        obj = utils.merge(obj, newObj, options);
    }

    if (options.allowSparse === true) {
        return obj;
    }

    return utils.compact(obj);
};

},{"./utils":5}],4:[function(require,module,exports){
'use strict';

var getSideChannel = require('side-channel');
var utils = require('./utils');
var formats = require('./formats');
var has = Object.prototype.hasOwnProperty;

var arrayPrefixGenerators = {
    brackets: function brackets(prefix) {
        return prefix + '[]';
    },
    comma: 'comma',
    indices: function indices(prefix, key) {
        return prefix + '[' + key + ']';
    },
    repeat: function repeat(prefix) {
        return prefix;
    }
};

var isArray = Array.isArray;
var split = String.prototype.split;
var push = Array.prototype.push;
var pushToArray = function (arr, valueOrArray) {
    push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]);
};

var toISO = Date.prototype.toISOString;

var defaultFormat = formats['default'];
var defaults = {
    addQueryPrefix: false,
    allowDots: false,
    charset: 'utf-8',
    charsetSentinel: false,
    delimiter: '&',
    encode: true,
    encoder: utils.encode,
    encodeValuesOnly: false,
    format: defaultFormat,
    formatter: formats.formatters[defaultFormat],
    // deprecated
    indices: false,
    serializeDate: function serializeDate(date) {
        return toISO.call(date);
    },
    skipNulls: false,
    strictNullHandling: false
};

var isNonNullishPrimitive = function isNonNullishPrimitive(v) {
    return typeof v === 'string'
        || typeof v === 'number'
        || typeof v === 'boolean'
        || typeof v === 'symbol'
        || typeof v === 'bigint';
};

var sentinel = {};

var stringify = function stringify(
    object,
    prefix,
    generateArrayPrefix,
    commaRoundTrip,
    strictNullHandling,
    skipNulls,
    encoder,
    filter,
    sort,
    allowDots,
    serializeDate,
    format,
    formatter,
    encodeValuesOnly,
    charset,
    sideChannel
) {
    var obj = object;

    var tmpSc = sideChannel;
    var step = 0;
    var findFlag = false;
    while ((tmpSc = tmpSc.get(sentinel)) !== void undefined && !findFlag) {
        // Where object last appeared in the ref tree
        var pos = tmpSc.get(object);
        step += 1;
        if (typeof pos !== 'undefined') {
            if (pos === step) {
                throw new RangeError('Cyclic object value');
            } else {
                findFlag = true; // Break while
            }
        }
        if (typeof tmpSc.get(sentinel) === 'undefined') {
            step = 0;
        }
    }

    if (typeof filter === 'function') {
        obj = filter(prefix, obj);
    } else if (obj instanceof Date) {
        obj = serializeDate(obj);
    } else if (generateArrayPrefix === 'comma' && isArray(obj)) {
        obj = utils.maybeMap(obj, function (value) {
            if (value instanceof Date) {
                return serializeDate(value);
            }
            return value;
        });
    }

    if (obj === null) {
        if (strictNullHandling) {
            return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key', format) : prefix;
        }

        obj = '';
    }

    if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) {
        if (encoder) {
            var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset, 'key', format);
            if (generateArrayPrefix === 'comma' && encodeValuesOnly) {
                var valuesArray = split.call(String(obj), ',');
                var valuesJoined = '';
                for (var i = 0; i < valuesArray.length; ++i) {
                    valuesJoined += (i === 0 ? '' : ',') + formatter(encoder(valuesArray[i], defaults.encoder, charset, 'value', format));
                }
                return [formatter(keyValue) + (commaRoundTrip && isArray(obj) && valuesArray.length === 1 ? '[]' : '') + '=' + valuesJoined];
            }
            return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset, 'value', format))];
        }
        return [formatter(prefix) + '=' + formatter(String(obj))];
    }

    var values = [];

    if (typeof obj === 'undefined') {
        return values;
    }

    var objKeys;
    if (generateArrayPrefix === 'comma' && isArray(obj)) {
        // we need to join elements in
        objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }];
    } else if (isArray(filter)) {
        objKeys = filter;
    } else {
        var keys = Object.keys(obj);
        objKeys = sort ? keys.sort(sort) : keys;
    }

    var adjustedPrefix = commaRoundTrip && isArray(obj) && obj.length === 1 ? prefix + '[]' : prefix;

    for (var j = 0; j < objKeys.length; ++j) {
        var key = objKeys[j];
        var value = typeof key === 'object' && typeof key.value !== 'undefined' ? key.value : obj[key];

        if (skipNulls && value === null) {
            continue;
        }

        var keyPrefix = isArray(obj)
            ? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(adjustedPrefix, key) : adjustedPrefix
            : adjustedPrefix + (allowDots ? '.' + key : '[' + key + ']');

        sideChannel.set(object, step);
        var valueSideChannel = getSideChannel();
        valueSideChannel.set(sentinel, sideChannel);
        pushToArray(values, stringify(
            value,
            keyPrefix,
            generateArrayPrefix,
            commaRoundTrip,
            strictNullHandling,
            skipNulls,
            encoder,
            filter,
            sort,
            allowDots,
            serializeDate,
            format,
            formatter,
            encodeValuesOnly,
            charset,
            valueSideChannel
        ));
    }

    return values;
};

var normalizeStringifyOptions = function normalizeStringifyOptions(opts) {
    if (!opts) {
        return defaults;
    }

    if (opts.encoder !== null && typeof opts.encoder !== 'undefined' && typeof opts.encoder !== 'function') {
        throw new TypeError('Encoder has to be a function.');
    }

    var charset = opts.charset || defaults.charset;
    if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {
        throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');
    }

    var format = formats['default'];
    if (typeof opts.format !== 'undefined') {
        if (!has.call(formats.formatters, opts.format)) {
            throw new TypeError('Unknown format option provided.');
        }
        format = opts.format;
    }
    var formatter = formats.formatters[format];

    var filter = defaults.filter;
    if (typeof opts.filter === 'function' || isArray(opts.filter)) {
        filter = opts.filter;
    }

    return {
        addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix,
        allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots,
        charset: charset,
        charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,
        delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter,
        encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode,
        encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder,
        encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly,
        filter: filter,
        format: format,
        formatter: formatter,
        serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate,
        skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls,
        sort: typeof opts.sort === 'function' ? opts.sort : null,
        strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling
    };
};

module.exports = function (object, opts) {
    var obj = object;
    var options = normalizeStringifyOptions(opts);

    var objKeys;
    var filter;

    if (typeof options.filter === 'function') {
        filter = options.filter;
        obj = filter('', obj);
    } else if (isArray(options.filter)) {
        filter = options.filter;
        objKeys = filter;
    }

    var keys = [];

    if (typeof obj !== 'object' || obj === null) {
        return '';
    }

    var arrayFormat;
    if (opts && opts.arrayFormat in arrayPrefixGenerators) {
        arrayFormat = opts.arrayFormat;
    } else if (opts && 'indices' in opts) {
        arrayFormat = opts.indices ? 'indices' : 'repeat';
    } else {
        arrayFormat = 'indices';
    }

    var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];
    if (opts && 'commaRoundTrip' in opts && typeof opts.commaRoundTrip !== 'boolean') {
        throw new TypeError('`commaRoundTrip` must be a boolean, or absent');
    }
    var commaRoundTrip = generateArrayPrefix === 'comma' && opts && opts.commaRoundTrip;

    if (!objKeys) {
        objKeys = Object.keys(obj);
    }

    if (options.sort) {
        objKeys.sort(options.sort);
    }

    var sideChannel = getSideChannel();
    for (var i = 0; i < objKeys.length; ++i) {
        var key = objKeys[i];

        if (options.skipNulls && obj[key] === null) {
            continue;
        }
        pushToArray(keys, stringify(
            obj[key],
            key,
            generateArrayPrefix,
            commaRoundTrip,
            options.strictNullHandling,
            options.skipNulls,
            options.encode ? options.encoder : null,
            options.filter,
            options.sort,
            options.allowDots,
            options.serializeDate,
            options.format,
            options.formatter,
            options.encodeValuesOnly,
            options.charset,
            sideChannel
        ));
    }

    var joined = keys.join(options.delimiter);
    var prefix = options.addQueryPrefix === true ? '?' : '';

    if (options.charsetSentinel) {
        if (options.charset === 'iso-8859-1') {
            // encodeURIComponent('&#10003;'), the "numeric entity" representation of a checkmark
            prefix += 'utf8=%26%2310003%3B&';
        } else {
            // encodeURIComponent('✓')
            prefix += 'utf8=%E2%9C%93&';
        }
    }

    return joined.length > 0 ? prefix + joined : '';
};

},{"./formats":1,"./utils":5,"side-channel":16}],5:[function(require,module,exports){
'use strict';

var formats = require('./formats');

var has = Object.prototype.hasOwnProperty;
var isArray = Array.isArray;

var hexTable = (function () {
    var array = [];
    for (var i = 0; i < 256; ++i) {
        array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());
    }

    return array;
}());

var compactQueue = function compactQueue(queue) {
    while (queue.length > 1) {
        var item = queue.pop();
        var obj = item.obj[item.prop];

        if (isArray(obj)) {
            var compacted = [];

            for (var j = 0; j < obj.length; ++j) {
                if (typeof obj[j] !== 'undefined') {
                    compacted.push(obj[j]);
                }
            }

            item.obj[item.prop] = compacted;
        }
    }
};

var arrayToObject = function arrayToObject(source, options) {
    var obj = options && options.plainObjects ? Object.create(null) : {};
    for (var i = 0; i < source.length; ++i) {
        if (typeof source[i] !== 'undefined') {
            obj[i] = source[i];
        }
    }

    return obj;
};

var merge = function merge(target, source, options) {
    /* eslint no-param-reassign: 0 */
    if (!source) {
        return target;
    }

    if (typeof source !== 'object') {
        if (isArray(target)) {
            target.push(source);
        } else if (target && typeof target === 'object') {
            if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) {
                target[source] = true;
            }
        } else {
            return [target, source];
        }

        return target;
    }

    if (!target || typeof target !== 'object') {
        return [target].concat(source);
    }

    var mergeTarget = target;
    if (isArray(target) && !isArray(source)) {
        mergeTarget = arrayToObject(target, options);
    }

    if (isArray(target) && isArray(source)) {
        source.forEach(function (item, i) {
            if (has.call(target, i)) {
                var targetItem = target[i];
                if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') {
                    target[i] = merge(targetItem, item, options);
                } else {
                    target.push(item);
                }
            } else {
                target[i] = item;
            }
        });
        return target;
    }

    return Object.keys(source).reduce(function (acc, key) {
        var value = source[key];

        if (has.call(acc, key)) {
            acc[key] = merge(acc[key], value, options);
        } else {
            acc[key] = value;
        }
        return acc;
    }, mergeTarget);
};

var assign = function assignSingleSource(target, source) {
    return Object.keys(source).reduce(function (acc, key) {
        acc[key] = source[key];
        return acc;
    }, target);
};

var decode = function (str, decoder, charset) {
    var strWithoutPlus = str.replace(/\+/g, ' ');
    if (charset === 'iso-8859-1') {
        // unescape never throws, no try...catch needed:
        return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape);
    }
    // utf-8
    try {
        return decodeURIComponent(strWithoutPlus);
    } catch (e) {
        return strWithoutPlus;
    }
};

var encode = function encode(str, defaultEncoder, charset, kind, format) {
    // This code was originally written by Brian White (mscdex) for the io.js core querystring library.
    // It has been adapted here for stricter adherence to RFC 3986
    if (str.length === 0) {
        return str;
    }

    var string = str;
    if (typeof str === 'symbol') {
        string = Symbol.prototype.toString.call(str);
    } else if (typeof str !== 'string') {
        string = String(str);
    }

    if (charset === 'iso-8859-1') {
        return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) {
            return '%26%23' + parseInt($0.slice(2), 16) + '%3B';
        });
    }

    var out = '';
    for (var i = 0; i < string.length; ++i) {
        var c = string.charCodeAt(i);

        if (
            c === 0x2D // -
            || c === 0x2E // .
            || c === 0x5F // _
            || c === 0x7E // ~
            || (c >= 0x30 && c <= 0x39) // 0-9
            || (c >= 0x41 && c <= 0x5A) // a-z
            || (c >= 0x61 && c <= 0x7A) // A-Z
            || (format === formats.RFC1738 && (c === 0x28 || c === 0x29)) // ( )
        ) {
            out += string.charAt(i);
            continue;
        }

        if (c < 0x80) {
            out = out + hexTable[c];
            continue;
        }

        if (c < 0x800) {
            out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);
            continue;
        }

        if (c < 0xD800 || c >= 0xE000) {
            out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);
            continue;
        }

        i += 1;
        c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));
        /* eslint operator-linebreak: [2, "before"] */
        out += hexTable[0xF0 | (c >> 18)]
            + hexTable[0x80 | ((c >> 12) & 0x3F)]
            + hexTable[0x80 | ((c >> 6) & 0x3F)]
            + hexTable[0x80 | (c & 0x3F)];
    }

    return out;
};

var compact = function compact(value) {
    var queue = [{ obj: { o: value }, prop: 'o' }];
    var refs = [];

    for (var i = 0; i < queue.length; ++i) {
        var item = queue[i];
        var obj = item.obj[item.prop];

        var keys = Object.keys(obj);
        for (var j = 0; j < keys.length; ++j) {
            var key = keys[j];
            var val = obj[key];
            if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {
                queue.push({ obj: obj, prop: key });
                refs.push(val);
            }
        }
    }

    compactQueue(queue);

    return value;
};

var isRegExp = function isRegExp(obj) {
    return Object.prototype.toString.call(obj) === '[object RegExp]';
};

var isBuffer = function isBuffer(obj) {
    if (!obj || typeof obj !== 'object') {
        return false;
    }

    return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));
};

var combine = function combine(a, b) {
    return [].concat(a, b);
};

var maybeMap = function maybeMap(val, fn) {
    if (isArray(val)) {
        var mapped = [];
        for (var i = 0; i < val.length; i += 1) {
            mapped.push(fn(val[i]));
        }
        return mapped;
    }
    return fn(val);
};

module.exports = {
    arrayToObject: arrayToObject,
    assign: assign,
    combine: combine,
    compact: compact,
    decode: decode,
    encode: encode,
    isBuffer: isBuffer,
    isRegExp: isRegExp,
    maybeMap: maybeMap,
    merge: merge
};

},{"./formats":1}],6:[function(require,module,exports){

},{}],7:[function(require,module,exports){
'use strict';

var GetIntrinsic = require('get-intrinsic');

var callBind = require('./');

var $indexOf = callBind(GetIntrinsic('String.prototype.indexOf'));

module.exports = function callBoundIntrinsic(name, allowMissing) {
	var intrinsic = GetIntrinsic(name, !!allowMissing);
	if (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) {
		return callBind(intrinsic);
	}
	return intrinsic;
};

},{"./":8,"get-intrinsic":11}],8:[function(require,module,exports){
'use strict';

var bind = require('function-bind');
var GetIntrinsic = require('get-intrinsic');

var $apply = GetIntrinsic('%Function.prototype.apply%');
var $call = GetIntrinsic('%Function.prototype.call%');
var $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply);

var $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%', true);
var $defineProperty = GetIntrinsic('%Object.defineProperty%', true);
var $max = GetIntrinsic('%Math.max%');

if ($defineProperty) {
	try {
		$defineProperty({}, 'a', { value: 1 });
	} catch (e) {
		// IE 8 has a broken defineProperty
		$defineProperty = null;
	}
}

module.exports = function callBind(originalFunction) {
	var func = $reflectApply(bind, $call, arguments);
	if ($gOPD && $defineProperty) {
		var desc = $gOPD(func, 'length');
		if (desc.configurable) {
			// original length, plus the receiver, minus any additional arguments (after the receiver)
			$defineProperty(
				func,
				'length',
				{ value: 1 + $max(0, originalFunction.length - (arguments.length - 1)) }
			);
		}
	}
	return func;
};

var applyBind = function applyBind() {
	return $reflectApply(bind, $apply, arguments);
};

if ($defineProperty) {
	$defineProperty(module.exports, 'apply', { value: applyBind });
} else {
	module.exports.apply = applyBind;
}

},{"function-bind":10,"get-intrinsic":11}],9:[function(require,module,exports){
'use strict';

/* eslint no-invalid-this: 1 */

var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
var slice = Array.prototype.slice;
var toStr = Object.prototype.toString;
var funcType = '[object Function]';

module.exports = function bind(that) {
    var target = this;
    if (typeof target !== 'function' || toStr.call(target) !== funcType) {
        throw new TypeError(ERROR_MESSAGE + target);
    }
    var args = slice.call(arguments, 1);

    var bound;
    var binder = function () {
        if (this instanceof bound) {
            var result = target.apply(
                this,
                args.concat(slice.call(arguments))
            );
            if (Object(result) === result) {
                return result;
            }
            return this;
        } else {
            return target.apply(
                that,
                args.concat(slice.call(arguments))
            );
        }
    };

    var boundLength = Math.max(0, target.length - args.length);
    var boundArgs = [];
    for (var i = 0; i < boundLength; i++) {
        boundArgs.push('$' + i);
    }

    bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);

    if (target.prototype) {
        var Empty = function Empty() {};
        Empty.prototype = target.prototype;
        bound.prototype = new Empty();
        Empty.prototype = null;
    }

    return bound;
};

},{}],10:[function(require,module,exports){
'use strict';

var implementation = require('./implementation');

module.exports = Function.prototype.bind || implementation;

},{"./implementation":9}],11:[function(require,module,exports){
'use strict';

var undefined;

var $SyntaxError = SyntaxError;
var $Function = Function;
var $TypeError = TypeError;

// eslint-disable-next-line consistent-return
var getEvalledConstructor = function (expressionSyntax) {
	try {
		return $Function('"use strict"; return (' + expressionSyntax + ').constructor;')();
	} catch (e) {}
};

var $gOPD = Object.getOwnPropertyDescriptor;
if ($gOPD) {
	try {
		$gOPD({}, '');
	} catch (e) {
		$gOPD = null; // this is IE 8, which has a broken gOPD
	}
}

var throwTypeError = function () {
	throw new $TypeError();
};
var ThrowTypeError = $gOPD
	? (function () {
		try {
			// eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties
			arguments.callee; // IE 8 does not throw here
			return throwTypeError;
		} catch (calleeThrows) {
			try {
				// IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '')
				return $gOPD(arguments, 'callee').get;
			} catch (gOPDthrows) {
				return throwTypeError;
			}
		}
	}())
	: throwTypeError;

var hasSymbols = require('has-symbols')();

var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto

var needsEval = {};

var TypedArray = typeof Uint8Array === 'undefined' ? undefined : getProto(Uint8Array);

var INTRINSICS = {
	'%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError,
	'%Array%': Array,
	'%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,
	'%ArrayIteratorPrototype%': hasSymbols ? getProto([][Symbol.iterator]()) : undefined,
	'%AsyncFromSyncIteratorPrototype%': undefined,
	'%AsyncFunction%': needsEval,
	'%AsyncGenerator%': needsEval,
	'%AsyncGeneratorFunction%': needsEval,
	'%AsyncIteratorPrototype%': needsEval,
	'%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,
	'%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt,
	'%Boolean%': Boolean,
	'%DataView%': typeof DataView === 'undefined' ? undefined : DataView,
	'%Date%': Date,
	'%decodeURI%': decodeURI,
	'%decodeURIComponent%': decodeURIComponent,
	'%encodeURI%': encodeURI,
	'%encodeURIComponent%': encodeURIComponent,
	'%Error%': Error,
	'%eval%': eval, // eslint-disable-line no-eval
	'%EvalError%': EvalError,
	'%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,
	'%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,
	'%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry,
	'%Function%': $Function,
	'%GeneratorFunction%': needsEval,
	'%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,
	'%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,
	'%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,
	'%isFinite%': isFinite,
	'%isNaN%': isNaN,
	'%IteratorPrototype%': hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined,
	'%JSON%': typeof JSON === 'object' ? JSON : undefined,
	'%Map%': typeof Map === 'undefined' ? undefined : Map,
	'%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols ? undefined : getProto(new Map()[Symbol.iterator]()),
	'%Math%': Math,
	'%Number%': Number,
	'%Object%': Object,
	'%parseFloat%': parseFloat,
	'%parseInt%': parseInt,
	'%Promise%': typeof Promise === 'undefined' ? undefined : Promise,
	'%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,
	'%RangeError%': RangeError,
	'%ReferenceError%': ReferenceError,
	'%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,
	'%RegExp%': RegExp,
	'%Set%': typeof Set === 'undefined' ? undefined : Set,
	'%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols ? undefined : getProto(new Set()[Symbol.iterator]()),
	'%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,
	'%String%': String,
	'%StringIteratorPrototype%': hasSymbols ? getProto(''[Symbol.iterator]()) : undefined,
	'%Symbol%': hasSymbols ? Symbol : undefined,
	'%SyntaxError%': $SyntaxError,
	'%ThrowTypeError%': ThrowTypeError,
	'%TypedArray%': TypedArray,
	'%TypeError%': $TypeError,
	'%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,
	'%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,
	'%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,
	'%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,
	'%URIError%': URIError,
	'%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,
	'%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef,
	'%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet
};

var doEval = function doEval(name) {
	var value;
	if (name === '%AsyncFunction%') {
		value = getEvalledConstructor('async function () {}');
	} else if (name === '%GeneratorFunction%') {
		value = getEvalledConstructor('function* () {}');
	} else if (name === '%AsyncGeneratorFunction%') {
		value = getEvalledConstructor('async function* () {}');
	} else if (name === '%AsyncGenerator%') {
		var fn = doEval('%AsyncGeneratorFunction%');
		if (fn) {
			value = fn.prototype;
		}
	} else if (name === '%AsyncIteratorPrototype%') {
		var gen = doEval('%AsyncGenerator%');
		if (gen) {
			value = getProto(gen.prototype);
		}
	}

	INTRINSICS[name] = value;

	return value;
};

var LEGACY_ALIASES = {
	'%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'],
	'%ArrayPrototype%': ['Array', 'prototype'],
	'%ArrayProto_entries%': ['Array', 'prototype', 'entries'],
	'%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'],
	'%ArrayProto_keys%': ['Array', 'prototype', 'keys'],
	'%ArrayProto_values%': ['Array', 'prototype', 'values'],
	'%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'],
	'%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'],
	'%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'],
	'%BooleanPrototype%': ['Boolean', 'prototype'],
	'%DataViewPrototype%': ['DataView', 'prototype'],
	'%DatePrototype%': ['Date', 'prototype'],
	'%ErrorPrototype%': ['Error', 'prototype'],
	'%EvalErrorPrototype%': ['EvalError', 'prototype'],
	'%Float32ArrayPrototype%': ['Float32Array', 'prototype'],
	'%Float64ArrayPrototype%': ['Float64Array', 'prototype'],
	'%FunctionPrototype%': ['Function', 'prototype'],
	'%Generator%': ['GeneratorFunction', 'prototype'],
	'%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'],
	'%Int8ArrayPrototype%': ['Int8Array', 'prototype'],
	'%Int16ArrayPrototype%': ['Int16Array', 'prototype'],
	'%Int32ArrayPrototype%': ['Int32Array', 'prototype'],
	'%JSONParse%': ['JSON', 'parse'],
	'%JSONStringify%': ['JSON', 'stringify'],
	'%MapPrototype%': ['Map', 'prototype'],
	'%NumberPrototype%': ['Number', 'prototype'],
	'%ObjectPrototype%': ['Object', 'prototype'],
	'%ObjProto_toString%': ['Object', 'prototype', 'toString'],
	'%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'],
	'%PromisePrototype%': ['Promise', 'prototype'],
	'%PromiseProto_then%': ['Promise', 'prototype', 'then'],
	'%Promise_all%': ['Promise', 'all'],
	'%Promise_reject%': ['Promise', 'reject'],
	'%Promise_resolve%': ['Promise', 'resolve'],
	'%RangeErrorPrototype%': ['RangeError', 'prototype'],
	'%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'],
	'%RegExpPrototype%': ['RegExp', 'prototype'],
	'%SetPrototype%': ['Set', 'prototype'],
	'%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'],
	'%StringPrototype%': ['String', 'prototype'],
	'%SymbolPrototype%': ['Symbol', 'prototype'],
	'%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'],
	'%TypedArrayPrototype%': ['TypedArray', 'prototype'],
	'%TypeErrorPrototype%': ['TypeError', 'prototype'],
	'%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'],
	'%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'],
	'%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'],
	'%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'],
	'%URIErrorPrototype%': ['URIError', 'prototype'],
	'%WeakMapPrototype%': ['WeakMap', 'prototype'],
	'%WeakSetPrototype%': ['WeakSet', 'prototype']
};

var bind = require('function-bind');
var hasOwn = require('has');
var $concat = bind.call(Function.call, Array.prototype.concat);
var $spliceApply = bind.call(Function.apply, Array.prototype.splice);
var $replace = bind.call(Function.call, String.prototype.replace);
var $strSlice = bind.call(Function.call, String.prototype.slice);

/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */
var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g;
var reEscapeChar = /\\(\\)?/g; /** Used to match backslashes in property paths. */
var stringToPath = function stringToPath(string) {
	var first = $strSlice(string, 0, 1);
	var last = $strSlice(string, -1);
	if (first === '%' && last !== '%') {
		throw new $SyntaxError('invalid intrinsic syntax, expected closing `%`');
	} else if (last === '%' && first !== '%') {
		throw new $SyntaxError('invalid intrinsic syntax, expected opening `%`');
	}
	var result = [];
	$replace(string, rePropName, function (match, number, quote, subString) {
		result[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match;
	});
	return result;
};
/* end adaptation */

var getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {
	var intrinsicName = name;
	var alias;
	if (hasOwn(LEGACY_ALIASES, intrinsicName)) {
		alias = LEGACY_ALIASES[intrinsicName];
		intrinsicName = '%' + alias[0] + '%';
	}

	if (hasOwn(INTRINSICS, intrinsicName)) {
		var value = INTRINSICS[intrinsicName];
		if (value === needsEval) {
			value = doEval(intrinsicName);
		}
		if (typeof value === 'undefined' && !allowMissing) {
			throw new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');
		}

		return {
			alias: alias,
			name: intrinsicName,
			value: value
		};
	}

	throw new $SyntaxError('intrinsic ' + name + ' does not exist!');
};

module.exports = function GetIntrinsic(name, allowMissing) {
	if (typeof name !== 'string' || name.length === 0) {
		throw new $TypeError('intrinsic name must be a non-empty string');
	}
	if (arguments.length > 1 && typeof allowMissing !== 'boolean') {
		throw new $TypeError('"allowMissing" argument must be a boolean');
	}

	var parts = stringToPath(name);
	var intrinsicBaseName = parts.length > 0 ? parts[0] : '';

	var intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing);
	var intrinsicRealName = intrinsic.name;
	var value = intrinsic.value;
	var skipFurtherCaching = false;

	var alias = intrinsic.alias;
	if (alias) {
		intrinsicBaseName = alias[0];
		$spliceApply(parts, $concat([0, 1], alias));
	}

	for (var i = 1, isOwn = true; i < parts.length; i += 1) {
		var part = parts[i];
		var first = $strSlice(part, 0, 1);
		var last = $strSlice(part, -1);
		if (
			(
				(first === '"' || first === "'" || first === '`')
				|| (last === '"' || last === "'" || last === '`')
			)
			&& first !== last
		) {
			throw new $SyntaxError('property names with quotes must have matching quotes');
		}
		if (part === 'constructor' || !isOwn) {
			skipFurtherCaching = true;
		}

		intrinsicBaseName += '.' + part;
		intrinsicRealName = '%' + intrinsicBaseName + '%';

		if (hasOwn(INTRINSICS, intrinsicRealName)) {
			value = INTRINSICS[intrinsicRealName];
		} else if (value != null) {
			if (!(part in value)) {
				if (!allowMissing) {
					throw new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.');
				}
				return void undefined;
			}
			if ($gOPD && (i + 1) >= parts.length) {
				var desc = $gOPD(value, part);
				isOwn = !!desc;

				// By convention, when a data property is converted to an accessor
				// property to emulate a data property that does not suffer from
				// the override mistake, that accessor's getter is marked with
				// an `originalValue` property. Here, when we detect this, we
				// uphold the illusion by pretending to see that original data
				// property, i.e., returning the value rather than the getter
				// itself.
				if (isOwn && 'get' in desc && !('originalValue' in desc.get)) {
					value = desc.get;
				} else {
					value = value[part];
				}
			} else {
				isOwn = hasOwn(value, part);
				value = value[part];
			}

			if (isOwn && !skipFurtherCaching) {
				INTRINSICS[intrinsicRealName] = value;
			}
		}
	}
	return value;
};

},{"function-bind":10,"has":14,"has-symbols":12}],12:[function(require,module,exports){
'use strict';

var origSymbol = typeof Symbol !== 'undefined' && Symbol;
var hasSymbolSham = require('./shams');

module.exports = function hasNativeSymbols() {
	if (typeof origSymbol !== 'function') { return false; }
	if (typeof Symbol !== 'function') { return false; }
	if (typeof origSymbol('foo') !== 'symbol') { return false; }
	if (typeof Symbol('bar') !== 'symbol') { return false; }

	return hasSymbolSham();
};

},{"./shams":13}],13:[function(require,module,exports){
'use strict';

/* eslint complexity: [2, 18], max-statements: [2, 33] */
module.exports = function hasSymbols() {
	if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
	if (typeof Symbol.iterator === 'symbol') { return true; }

	var obj = {};
	var sym = Symbol('test');
	var symObj = Object(sym);
	if (typeof sym === 'string') { return false; }

	if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }
	if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }

	// temp disabled per https://github.com/ljharb/object.assign/issues/17
	// if (sym instanceof Symbol) { return false; }
	// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
	// if (!(symObj instanceof Symbol)) { return false; }

	// if (typeof Symbol.prototype.toString !== 'function') { return false; }
	// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }

	var symVal = 42;
	obj[sym] = symVal;
	for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop
	if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }

	if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }

	var syms = Object.getOwnPropertySymbols(obj);
	if (syms.length !== 1 || syms[0] !== sym) { return false; }

	if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }

	if (typeof Object.getOwnPropertyDescriptor === 'function') {
		var descriptor = Object.getOwnPropertyDescriptor(obj, sym);
		if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
	}

	return true;
};

},{}],14:[function(require,module,exports){
'use strict';

var bind = require('function-bind');

module.exports = bind.call(Function.call, Object.prototype.hasOwnProperty);

},{"function-bind":10}],15:[function(require,module,exports){
var hasMap = typeof Map === 'function' && Map.prototype;
var mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, 'size') : null;
var mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === 'function' ? mapSizeDescriptor.get : null;
var mapForEach = hasMap && Map.prototype.forEach;
var hasSet = typeof Set === 'function' && Set.prototype;
var setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, 'size') : null;
var setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === 'function' ? setSizeDescriptor.get : null;
var setForEach = hasSet && Set.prototype.forEach;
var hasWeakMap = typeof WeakMap === 'function' && WeakMap.prototype;
var weakMapHas = hasWeakMap ? WeakMap.prototype.has : null;
var hasWeakSet = typeof WeakSet === 'function' && WeakSet.prototype;
var weakSetHas = hasWeakSet ? WeakSet.prototype.has : null;
var hasWeakRef = typeof WeakRef === 'function' && WeakRef.prototype;
var weakRefDeref = hasWeakRef ? WeakRef.prototype.deref : null;
var booleanValueOf = Boolean.prototype.valueOf;
var objectToString = Object.prototype.toString;
var functionToString = Function.prototype.toString;
var $match = String.prototype.match;
var $slice = String.prototype.slice;
var $replace = String.prototype.replace;
var $toUpperCase = String.prototype.toUpperCase;
var $toLowerCase = String.prototype.toLowerCase;
var $test = RegExp.prototype.test;
var $concat = Array.prototype.concat;
var $join = Array.prototype.join;
var $arrSlice = Array.prototype.slice;
var $floor = Math.floor;
var bigIntValueOf = typeof BigInt === 'function' ? BigInt.prototype.valueOf : null;
var gOPS = Object.getOwnPropertySymbols;
var symToString = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? Symbol.prototype.toString : null;
var hasShammedSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'object';
// ie, `has-tostringtag/shams
var toStringTag = typeof Symbol === 'function' && Symbol.toStringTag && (typeof Symbol.toStringTag === hasShammedSymbols ? 'object' : 'symbol')
    ? Symbol.toStringTag
    : null;
var isEnumerable = Object.prototype.propertyIsEnumerable;

var gPO = (typeof Reflect === 'function' ? Reflect.getPrototypeOf : Object.getPrototypeOf) || (
    [].__proto__ === Array.prototype // eslint-disable-line no-proto
        ? function (O) {
            return O.__proto__; // eslint-disable-line no-proto
        }
        : null
);

function addNumericSeparator(num, str) {
    if (
        num === Infinity
        || num === -Infinity
        || num !== num
        || (num && num > -1000 && num < 1000)
        || $test.call(/e/, str)
    ) {
        return str;
    }
    var sepRegex = /[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;
    if (typeof num === 'number') {
        var int = num < 0 ? -$floor(-num) : $floor(num); // trunc(num)
        if (int !== num) {
            var intStr = String(int);
            var dec = $slice.call(str, intStr.length + 1);
            return $replace.call(intStr, sepRegex, '$&_') + '.' + $replace.call($replace.call(dec, /([0-9]{3})/g, '$&_'), /_$/, '');
        }
    }
    return $replace.call(str, sepRegex, '$&_');
}

var utilInspect = require('./util.inspect');
var inspectCustom = utilInspect.custom;
var inspectSymbol = isSymbol(inspectCustom) ? inspectCustom : null;

module.exports = function inspect_(obj, options, depth, seen) {
    var opts = options || {};

    if (has(opts, 'quoteStyle') && (opts.quoteStyle !== 'single' && opts.quoteStyle !== 'double')) {
        throw new TypeError('option "quoteStyle" must be "single" or "double"');
    }
    if (
        has(opts, 'maxStringLength') && (typeof opts.maxStringLength === 'number'
            ? opts.maxStringLength < 0 && opts.maxStringLength !== Infinity
            : opts.maxStringLength !== null
        )
    ) {
        throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');
    }
    var customInspect = has(opts, 'customInspect') ? opts.customInspect : true;
    if (typeof customInspect !== 'boolean' && customInspect !== 'symbol') {
        throw new TypeError('option "customInspect", if provided, must be `true`, `false`, or `\'symbol\'`');
    }

    if (
        has(opts, 'indent')
        && opts.indent !== null
        && opts.indent !== '\t'
        && !(parseInt(opts.indent, 10) === opts.indent && opts.indent > 0)
    ) {
        throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');
    }
    if (has(opts, 'numericSeparator') && typeof opts.numericSeparator !== 'boolean') {
        throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');
    }
    var numericSeparator = opts.numericSeparator;

    if (typeof obj === 'undefined') {
        return 'undefined';
    }
    if (obj === null) {
        return 'null';
    }
    if (typeof obj === 'boolean') {
        return obj ? 'true' : 'false';
    }

    if (typeof obj === 'string') {
        return inspectString(obj, opts);
    }
    if (typeof obj === 'number') {
        if (obj === 0) {
            return Infinity / obj > 0 ? '0' : '-0';
        }
        var str = String(obj);
        return numericSeparator ? addNumericSeparator(obj, str) : str;
    }
    if (typeof obj === 'bigint') {
        var bigIntStr = String(obj) + 'n';
        return numericSeparator ? addNumericSeparator(obj, bigIntStr) : bigIntStr;
    }

    var maxDepth = typeof opts.depth === 'undefined' ? 5 : opts.depth;
    if (typeof depth === 'undefined') { depth = 0; }
    if (depth >= maxDepth && maxDepth > 0 && typeof obj === 'object') {
        return isArray(obj) ? '[Array]' : '[Object]';
    }

    var indent = getIndent(opts, depth);

    if (typeof seen === 'undefined') {
        seen = [];
    } else if (indexOf(seen, obj) >= 0) {
        return '[Circular]';
    }

    function inspect(value, from, noIndent) {
        if (from) {
            seen = $arrSlice.call(seen);
            seen.push(from);
        }
        if (noIndent) {
            var newOpts = {
                depth: opts.depth
            };
            if (has(opts, 'quoteStyle')) {
                newOpts.quoteStyle = opts.quoteStyle;
            }
            return inspect_(value, newOpts, depth + 1, seen);
        }
        return inspect_(value, opts, depth + 1, seen);
    }

    if (typeof obj === 'function' && !isRegExp(obj)) { // in older engines, regexes are callable
        var name = nameOf(obj);
        var keys = arrObjKeys(obj, inspect);
        return '[Function' + (name ? ': ' + name : ' (anonymous)') + ']' + (keys.length > 0 ? ' { ' + $join.call(keys, ', ') + ' }' : '');
    }
    if (isSymbol(obj)) {
        var symString = hasShammedSymbols ? $replace.call(String(obj), /^(Symbol\(.*\))_[^)]*$/, '$1') : symToString.call(obj);
        return typeof obj === 'object' && !hasShammedSymbols ? markBoxed(symString) : symString;
    }
    if (isElement(obj)) {
        var s = '<' + $toLowerCase.call(String(obj.nodeName));
        var attrs = obj.attributes || [];
        for (var i = 0; i < attrs.length; i++) {
            s += ' ' + attrs[i].name + '=' + wrapQuotes(quote(attrs[i].value), 'double', opts);
        }
        s += '>';
        if (obj.childNodes && obj.childNodes.length) { s += '...'; }
        s += '</' + $toLowerCase.call(String(obj.nodeName)) + '>';
        return s;
    }
    if (isArray(obj)) {
        if (obj.length === 0) { return '[]'; }
        var xs = arrObjKeys(obj, inspect);
        if (indent && !singleLineValues(xs)) {
            return '[' + indentedJoin(xs, indent) + ']';
        }
        return '[ ' + $join.call(xs, ', ') + ' ]';
    }
    if (isError(obj)) {
        var parts = arrObjKeys(obj, inspect);
        if (!('cause' in Error.prototype) && 'cause' in obj && !isEnumerable.call(obj, 'cause')) {
            return '{ [' + String(obj) + '] ' + $join.call($concat.call('[cause]: ' + inspect(obj.cause), parts), ', ') + ' }';
        }
        if (parts.length === 0) { return '[' + String(obj) + ']'; }
        return '{ [' + String(obj) + '] ' + $join.call(parts, ', ') + ' }';
    }
    if (typeof obj === 'object' && customInspect) {
        if (inspectSymbol && typeof obj[inspectSymbol] === 'function' && utilInspect) {
            return utilInspect(obj, { depth: maxDepth - depth });
        } else if (customInspect !== 'symbol' && typeof obj.inspect === 'function') {
            return obj.inspect();
        }
    }
    if (isMap(obj)) {
        var mapParts = [];
        mapForEach.call(obj, function (value, key) {
            mapParts.push(inspect(key, obj, true) + ' => ' + inspect(value, obj));
        });
        return collectionOf('Map', mapSize.call(obj), mapParts, indent);
    }
    if (isSet(obj)) {
        var setParts = [];
        setForEach.call(obj, function (value) {
            setParts.push(inspect(value, obj));
        });
        return collectionOf('Set', setSize.call(obj), setParts, indent);
    }
    if (isWeakMap(obj)) {
        return weakCollectionOf('WeakMap');
    }
    if (isWeakSet(obj)) {
        return weakCollectionOf('WeakSet');
    }
    if (isWeakRef(obj)) {
        return weakCollectionOf('WeakRef');
    }
    if (isNumber(obj)) {
        return markBoxed(inspect(Number(obj)));
    }
    if (isBigInt(obj)) {
        return markBoxed(inspect(bigIntValueOf.call(obj)));
    }
    if (isBoolean(obj)) {
        return markBoxed(booleanValueOf.call(obj));
    }
    if (isString(obj)) {
        return markBoxed(inspect(String(obj)));
    }
    if (!isDate(obj) && !isRegExp(obj)) {
        var ys = arrObjKeys(obj, inspect);
        var isPlainObject = gPO ? gPO(obj) === Object.prototype : obj instanceof Object || obj.constructor === Object;
        var protoTag = obj instanceof Object ? '' : 'null prototype';
        var stringTag = !isPlainObject && toStringTag && Object(obj) === obj && toStringTag in obj ? $slice.call(toStr(obj), 8, -1) : protoTag ? 'Object' : '';
        var constructorTag = isPlainObject || typeof obj.constructor !== 'function' ? '' : obj.constructor.name ? obj.constructor.name + ' ' : '';
        var tag = constructorTag + (stringTag || protoTag ? '[' + $join.call($concat.call([], stringTag || [], protoTag || []), ': ') + '] ' : '');
        if (ys.length === 0) { return tag + '{}'; }
        if (indent) {
            return tag + '{' + indentedJoin(ys, indent) + '}';
        }
        return tag + '{ ' + $join.call(ys, ', ') + ' }';
    }
    return String(obj);
};

function wrapQuotes(s, defaultStyle, opts) {
    var quoteChar = (opts.quoteStyle || defaultStyle) === 'double' ? '"' : "'";
    return quoteChar + s + quoteChar;
}

function quote(s) {
    return $replace.call(String(s), /"/g, '&quot;');
}

function isArray(obj) { return toStr(obj) === '[object Array]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isDate(obj) { return toStr(obj) === '[object Date]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isRegExp(obj) { return toStr(obj) === '[object RegExp]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isError(obj) { return toStr(obj) === '[object Error]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isString(obj) { return toStr(obj) === '[object String]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isNumber(obj) { return toStr(obj) === '[object Number]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isBoolean(obj) { return toStr(obj) === '[object Boolean]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }

// Symbol and BigInt do have Symbol.toStringTag by spec, so that can't be used to eliminate false positives
function isSymbol(obj) {
    if (hasShammedSymbols) {
        return obj && typeof obj === 'object' && obj instanceof Symbol;
    }
    if (typeof obj === 'symbol') {
        return true;
    }
    if (!obj || typeof obj !== 'object' || !symToString) {
        return false;
    }
    try {
        symToString.call(obj);
        return true;
    } catch (e) {}
    return false;
}

function isBigInt(obj) {
    if (!obj || typeof obj !== 'object' || !bigIntValueOf) {
        return false;
    }
    try {
        bigIntValueOf.call(obj);
        return true;
    } catch (e) {}
    return false;
}

var hasOwn = Object.prototype.hasOwnProperty || function (key) { return key in this; };
function has(obj, key) {
    return hasOwn.call(obj, key);
}

function toStr(obj) {
    return objectToString.call(obj);
}

function nameOf(f) {
    if (f.name) { return f.name; }
    var m = $match.call(functionToString.call(f), /^function\s*([\w$]+)/);
    if (m) { return m[1]; }
    return null;
}

function indexOf(xs, x) {
    if (xs.indexOf) { return xs.indexOf(x); }
    for (var i = 0, l = xs.length; i < l; i++) {
        if (xs[i] === x) { return i; }
    }
    return -1;
}

function isMap(x) {
    if (!mapSize || !x || typeof x !== 'object') {
        return false;
    }
    try {
        mapSize.call(x);
        try {
            setSize.call(x);
        } catch (s) {
            return true;
        }
        return x instanceof Map; // core-js workaround, pre-v2.5.0
    } catch (e) {}
    return false;
}

function isWeakMap(x) {
    if (!weakMapHas || !x || typeof x !== 'object') {
        return false;
    }
    try {
        weakMapHas.call(x, weakMapHas);
        try {
            weakSetHas.call(x, weakSetHas);
        } catch (s) {
            return true;
        }
        return x instanceof WeakMap; // core-js workaround, pre-v2.5.0
    } catch (e) {}
    return false;
}

function isWeakRef(x) {
    if (!weakRefDeref || !x || typeof x !== 'object') {
        return false;
    }
    try {
        weakRefDeref.call(x);
        return true;
    } catch (e) {}
    return false;
}

function isSet(x) {
    if (!setSize || !x || typeof x !== 'object') {
        return false;
    }
    try {
        setSize.call(x);
        try {
            mapSize.call(x);
        } catch (m) {
            return true;
        }
        return x instanceof Set; // core-js workaround, pre-v2.5.0
    } catch (e) {}
    return false;
}

function isWeakSet(x) {
    if (!weakSetHas || !x || typeof x !== 'object') {
        return false;
    }
    try {
        weakSetHas.call(x, weakSetHas);
        try {
            weakMapHas.call(x, weakMapHas);
        } catch (s) {
            return true;
        }
        return x instanceof WeakSet; // core-js workaround, pre-v2.5.0
    } catch (e) {}
    return false;
}

function isElement(x) {
    if (!x || typeof x !== 'object') { return false; }
    if (typeof HTMLElement !== 'undefined' && x instanceof HTMLElement) {
        return true;
    }
    return typeof x.nodeName === 'string' && typeof x.getAttribute === 'function';
}

function inspectString(str, opts) {
    if (str.length > opts.maxStringLength) {
        var remaining = str.length - opts.maxStringLength;
        var trailer = '... ' + remaining + ' more character' + (remaining > 1 ? 's' : '');
        return inspectString($slice.call(str, 0, opts.maxStringLength), opts) + trailer;
    }
    // eslint-disable-next-line no-control-regex
    var s = $replace.call($replace.call(str, /(['\\])/g, '\\$1'), /[\x00-\x1f]/g, lowbyte);
    return wrapQuotes(s, 'single', opts);
}

function lowbyte(c) {
    var n = c.charCodeAt(0);
    var x = {
        8: 'b',
        9: 't',
        10: 'n',
        12: 'f',
        13: 'r'
    }[n];
    if (x) { return '\\' + x; }
    return '\\x' + (n < 0x10 ? '0' : '') + $toUpperCase.call(n.toString(16));
}

function markBoxed(str) {
    return 'Object(' + str + ')';
}

function weakCollectionOf(type) {
    return type + ' { ? }';
}

function collectionOf(type, size, entries, indent) {
    var joinedEntries = indent ? indentedJoin(entries, indent) : $join.call(entries, ', ');
    return type + ' (' + size + ') {' + joinedEntries + '}';
}

function singleLineValues(xs) {
    for (var i = 0; i < xs.length; i++) {
        if (indexOf(xs[i], '\n') >= 0) {
            return false;
        }
    }
    return true;
}

function getIndent(opts, depth) {
    var baseIndent;
    if (opts.indent === '\t') {
        baseIndent = '\t';
    } else if (typeof opts.indent === 'number' && opts.indent > 0) {
        baseIndent = $join.call(Array(opts.indent + 1), ' ');
    } else {
        return null;
    }
    return {
        base: baseIndent,
        prev: $join.call(Array(depth + 1), baseIndent)
    };
}

function indentedJoin(xs, indent) {
    if (xs.length === 0) { return ''; }
    var lineJoiner = '\n' + indent.prev + indent.base;
    return lineJoiner + $join.call(xs, ',' + lineJoiner) + '\n' + indent.prev;
}

function arrObjKeys(obj, inspect) {
    var isArr = isArray(obj);
    var xs = [];
    if (isArr) {
        xs.length = obj.length;
        for (var i = 0; i < obj.length; i++) {
            xs[i] = has(obj, i) ? inspect(obj[i], obj) : '';
        }
    }
    var syms = typeof gOPS === 'function' ? gOPS(obj) : [];
    var symMap;
    if (hasShammedSymbols) {
        symMap = {};
        for (var k = 0; k < syms.length; k++) {
            symMap['$' + syms[k]] = syms[k];
        }
    }

    for (var key in obj) { // eslint-disable-line no-restricted-syntax
        if (!has(obj, key)) { continue; } // eslint-disable-line no-restricted-syntax, no-continue
        if (isArr && String(Number(key)) === key && key < obj.length) { continue; } // eslint-disable-line no-restricted-syntax, no-continue
        if (hasShammedSymbols && symMap['$' + key] instanceof Symbol) {
            // this is to prevent shammed Symbols, which are stored as strings, from being included in the string key section
            continue; // eslint-disable-line no-restricted-syntax, no-continue
        } else if ($test.call(/[^\w$]/, key)) {
            xs.push(inspect(key, obj) + ': ' + inspect(obj[key], obj));
        } else {
            xs.push(key + ': ' + inspect(obj[key], obj));
        }
    }
    if (typeof gOPS === 'function') {
        for (var j = 0; j < syms.length; j++) {
            if (isEnumerable.call(obj, syms[j])) {
                xs.push('[' + inspect(syms[j]) + ']: ' + inspect(obj[syms[j]], obj));
            }
        }
    }
    return xs;
}

},{"./util.inspect":6}],16:[function(require,module,exports){
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');
var inspect = require('object-inspect');

var $TypeError = GetIntrinsic('%TypeError%');
var $WeakMap = GetIntrinsic('%WeakMap%', true);
var $Map = GetIntrinsic('%Map%', true);

var $weakMapGet = callBound('WeakMap.prototype.get', true);
var $weakMapSet = callBound('WeakMap.prototype.set', true);
var $weakMapHas = callBound('WeakMap.prototype.has', true);
var $mapGet = callBound('Map.prototype.get', true);
var $mapSet = callBound('Map.prototype.set', true);
var $mapHas = callBound('Map.prototype.has', true);

/*
 * This function traverses the list returning the node corresponding to the
 * given key.
 *
 * That node is also moved to the head of the list, so that if it's accessed
 * again we don't need to traverse the whole list. By doing so, all the recently
 * used nodes can be accessed relatively quickly.
 */
var listGetNode = function (list, key) { // eslint-disable-line consistent-return
	for (var prev = list, curr; (curr = prev.next) !== null; prev = curr) {
		if (curr.key === key) {
			prev.next = curr.next;
			curr.next = list.next;
			list.next = curr; // eslint-disable-line no-param-reassign
			return curr;
		}
	}
};

var listGet = function (objects, key) {
	var node = listGetNode(objects, key);
	return node && node.value;
};
var listSet = function (objects, key, value) {
	var node = listGetNode(objects, key);
	if (node) {
		node.value = value;
	} else {
		// Prepend the new node to the beginning of the list
		objects.next = { // eslint-disable-line no-param-reassign
			key: key,
			next: objects.next,
			value: value
		};
	}
};
var listHas = function (objects, key) {
	return !!listGetNode(objects, key);
};

module.exports = function getSideChannel() {
	var $wm;
	var $m;
	var $o;
	var channel = {
		assert: function (key) {
			if (!channel.has(key)) {
				throw new $TypeError('Side channel does not contain ' + inspect(key));
			}
		},
		get: function (key) { // eslint-disable-line consistent-return
			if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {
				if ($wm) {
					return $weakMapGet($wm, key);
				}
			} else if ($Map) {
				if ($m) {
					return $mapGet($m, key);
				}
			} else {
				if ($o) { // eslint-disable-line no-lonely-if
					return listGet($o, key);
				}
			}
		},
		has: function (key) {
			if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {
				if ($wm) {
					return $weakMapHas($wm, key);
				}
			} else if ($Map) {
				if ($m) {
					return $mapHas($m, key);
				}
			} else {
				if ($o) { // eslint-disable-line no-lonely-if
					return listHas($o, key);
				}
			}
			return false;
		},
		set: function (key, value) {
			if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {
				if (!$wm) {
					$wm = new $WeakMap();
				}
				$weakMapSet($wm, key, value);
			} else if ($Map) {
				if (!$m) {
					$m = new $Map();
				}
				$mapSet($m, key, value);
			} else {
				if (!$o) {
					/*
					 * Initialize the linked list as an empty node, so that we don't have
					 * to special-case handling of the first node: we can always refer to
					 * it as (previous node).next, instead of something like (list).head
					 */
					$o = { key: {}, next: null };
				}
				listSet($o, key, value);
			}
		}
	};
	return channel;
};

},{"call-bind/callBound":7,"get-intrinsic":11,"object-inspect":15}]},{},[2])(2)
});
# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/qs
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with a single custom sponsorship URL
The MIT License (MIT)

Copyright (c) 2013-2020 Scott Sauyet and Michael Hurley

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.
{
  "author": "Scott Sauyet <scott@sauyet.com> (scott.sauyet.com)",
  "name": "ramda",
  "description": "A practical functional library for JavaScript programmers.",
  "sideEffects": false,
  "version": "0.28.0",
  "homepage": "https://ramdajs.com/",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "git://github.com/ramda/ramda.git"
  },
  "funding": {
    "type": "opencollective",
    "url": "https://opencollective.com/ramda"
  },
  "main": "./src/index.js",
  "exports": {
    ".": {
      "require": "./src/index.js",
      "import": "./es/index.js",
      "default": "./src/index.js"
    },
    "./es/": "./es/",
    "./src/": "./src/",
    "./dist/": "./dist/"
  },
  "module": "./es/index.js",
  "unpkg": "dist/ramda.min.js",
  "jsdelivr": "dist/ramda.min.js",
  "files": [
    "es",
    "src",
    "dist"
  ],
  "dependencies": {},
  "devDependencies": {
    "@babel/cli": "^7.4.4",
    "@babel/core": "^7.4.5",
    "@babel/preset-env": "^7.7.4",
    "@babel/register": "^7.4.4",
    "@babel/types": "^7.4.4",
    "@rollup/plugin-babel": "^5.0.4",
    "babel-plugin-annotate-pure-calls": "^0.4.0",
    "babel-plugin-import-export-rename": "^1.0.1",
    "babelify": "^10.0.0",
    "benchmark": "~1.0.0",
    "browserify": "https://api.github.com/repos/browserify/browserify/tarball/9ff7c55cc67a7ddbc64f8e7270bcd75fcc72ce2f",
    "cli-table": "0.3.x",
    "cross-env": "^5.2.0",
    "dox": "latest",
    "envvar": "^2.0.0",
    "eslint": "^5.16.0",
    "eslint-plugin-import": "^2.21.2",
    "fast-check": "^2.12.0",
    "handlebars": ">=4.1.2",
    "js-yaml": "^3.13.1",
    "mocha": "^6.1.4",
    "nyc": "^15.0.1",
    "rimraf": "^2.6.3",
    "rollup": "^1.32.1",
    "rollup-plugin-uglify": "^6.0.4",
    "sanctuary": "0.7.x",
    "sinon": "^7.3.2",
    "testem": "^2.16.0",
    "xyz": "^3.0.0"
  }
}/**
 * A function that always returns `false`. Any passed in parameters are ignored.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Function
 * @sig * -> Boolean
 * @param {*}
 * @return {Boolean}
 * @see R.T
 * @example
 *
 *      R.F(); //=> false
 */
var F = function () {
  return false;
};

module.exports = F;/**
 * A function that always returns `true`. Any passed in parameters are ignored.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Function
 * @sig * -> Boolean
 * @param {*}
 * @return {Boolean}
 * @see R.F
 * @example
 *
 *      R.T(); //=> true
 */
var T = function () {
  return true;
};

module.exports = T;/**
 * A special placeholder value used to specify "gaps" within curried functions,
 * allowing partial application of any combination of arguments, regardless of
 * their positions.
 *
 * If `g` is a curried ternary function and `_` is `R.__`, the following are
 * equivalent:
 *
 *   - `g(1, 2, 3)`
 *   - `g(_, 2, 3)(1)`
 *   - `g(_, _, 3)(1)(2)`
 *   - `g(_, _, 3)(1, 2)`
 *   - `g(_, 2, _)(1, 3)`
 *   - `g(_, 2)(1)(3)`
 *   - `g(_, 2)(1, 3)`
 *   - `g(_, 2)(_, 3)(1)`
 *
 * @name __
 * @constant
 * @memberOf R
 * @since v0.6.0
 * @category Function
 * @example
 *
 *      const greet = R.replace('{name}', R.__, 'Hello, {name}!');
 *      greet('Alice'); //=> 'Hello, Alice!'
 */
module.exports = {
  '@@functional/placeholder': true
};var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Adds two values.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Math
 * @sig Number -> Number -> Number
 * @param {Number} a
 * @param {Number} b
 * @return {Number}
 * @see R.subtract
 * @example
 *
 *      R.add(2, 3);       //=>  5
 *      R.add(7)(10);      //=> 17
 */


var add =
/*#__PURE__*/
_curry2(function add(a, b) {
  return Number(a) + Number(b);
});

module.exports = add;var _concat =
/*#__PURE__*/
require("./internal/_concat.js");

var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var curryN =
/*#__PURE__*/
require("./curryN.js");
/**
 * Creates a new list iteration function from an existing one by adding two new
 * parameters to its callback function: the current index, and the entire list.
 *
 * This would turn, for instance, [`R.map`](#map) function into one that
 * more closely resembles `Array.prototype.map`. Note that this will only work
 * for functions in which the iteration callback function is the first
 * parameter, and where the list is the last parameter. (This latter might be
 * unimportant if the list parameter is not used.)
 *
 * @func
 * @memberOf R
 * @since v0.15.0
 * @category Function
 * @category List
 * @sig (((a ...) -> b) ... -> [a] -> *) -> (((a ..., Int, [a]) -> b) ... -> [a] -> *)
 * @param {Function} fn A list iteration function that does not pass index or list to its callback
 * @return {Function} An altered list iteration function that passes (item, index, list) to its callback
 * @example
 *
 *      const mapIndexed = R.addIndex(R.map);
 *      mapIndexed((val, idx) => idx + '-' + val, ['f', 'o', 'o', 'b', 'a', 'r']);
 *      //=> ['0-f', '1-o', '2-o', '3-b', '4-a', '5-r']
 */


var addIndex =
/*#__PURE__*/
_curry1(function addIndex(fn) {
  return curryN(fn.length, function () {
    var idx = 0;
    var origFn = arguments[0];
    var list = arguments[arguments.length - 1];
    var args = Array.prototype.slice.call(arguments, 0);

    args[0] = function () {
      var result = origFn.apply(this, _concat(arguments, [idx, list]));
      idx += 1;
      return result;
    };

    return fn.apply(this, args);
  });
});

module.exports = addIndex;var _concat =
/*#__PURE__*/
require("./internal/_concat.js");

var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");
/**
 * Applies a function to the value at the given index of an array, returning a
 * new copy of the array with the element at the given index replaced with the
 * result of the function application.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category List
 * @sig Number -> (a -> a) -> [a] -> [a]
 * @param {Number} idx The index.
 * @param {Function} fn The function to apply.
 * @param {Array|Arguments} list An array-like object whose value
 *        at the supplied index will be replaced.
 * @return {Array} A copy of the supplied array-like object with
 *         the element at index `idx` replaced with the value
 *         returned by applying `fn` to the existing element.
 * @see R.update
 * @example
 *
 *      R.adjust(1, R.toUpper, ['a', 'b', 'c', 'd']);      //=> ['a', 'B', 'c', 'd']
 *      R.adjust(-1, R.toUpper, ['a', 'b', 'c', 'd']);     //=> ['a', 'b', 'c', 'D']
 * @symb R.adjust(-1, f, [a, b]) = [a, f(b)]
 * @symb R.adjust(0, f, [a, b]) = [f(a), b]
 */


var adjust =
/*#__PURE__*/
_curry3(function adjust(idx, fn, list) {
  var len = list.length;

  if (idx >= len || idx < -len) {
    return list;
  }

  var _idx = (len + idx) % len;

  var _list = _concat(list);

  _list[_idx] = fn(list[_idx]);
  return _list;
});

module.exports = adjust;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _dispatchable =
/*#__PURE__*/
require("./internal/_dispatchable.js");

var _xall =
/*#__PURE__*/
require("./internal/_xall.js");
/**
 * Returns `true` if all elements of the list match the predicate, `false` if
 * there are any that don't.
 *
 * Dispatches to the `all` method of the second argument, if present.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> Boolean
 * @param {Function} fn The predicate function.
 * @param {Array} list The array to consider.
 * @return {Boolean} `true` if the predicate is satisfied by every element, `false`
 *         otherwise.
 * @see R.any, R.none, R.transduce
 * @example
 *
 *      const equals3 = R.equals(3);
 *      R.all(equals3)([3, 3, 3, 3]); //=> true
 *      R.all(equals3)([3, 3, 1, 3]); //=> false
 */


var all =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable(['all'], _xall, function all(fn, list) {
  var idx = 0;

  while (idx < list.length) {
    if (!fn(list[idx])) {
      return false;
    }

    idx += 1;
  }

  return true;
}));

module.exports = all;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var curryN =
/*#__PURE__*/
require("./curryN.js");

var max =
/*#__PURE__*/
require("./max.js");

var pluck =
/*#__PURE__*/
require("./pluck.js");

var reduce =
/*#__PURE__*/
require("./reduce.js");
/**
 * Takes a list of predicates and returns a predicate that returns true for a
 * given list of arguments if every one of the provided predicates is satisfied
 * by those arguments.
 *
 * The function returned is a curried function whose arity matches that of the
 * highest-arity predicate.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Logic
 * @sig [(*... -> Boolean)] -> (*... -> Boolean)
 * @param {Array} predicates An array of predicates to check
 * @return {Function} The combined predicate
 * @see R.anyPass
 * @example
 *
 *      const isQueen = R.propEq('rank', 'Q');
 *      const isSpade = R.propEq('suit', '♠︎');
 *      const isQueenOfSpades = R.allPass([isQueen, isSpade]);
 *
 *      isQueenOfSpades({rank: 'Q', suit: '♣︎'}); //=> false
 *      isQueenOfSpades({rank: 'Q', suit: '♠︎'}); //=> true
 */


var allPass =
/*#__PURE__*/
_curry1(function allPass(preds) {
  return curryN(reduce(max, 0, pluck('length', preds)), function () {
    var idx = 0;
    var len = preds.length;

    while (idx < len) {
      if (!preds[idx].apply(this, arguments)) {
        return false;
      }

      idx += 1;
    }

    return true;
  });
});

module.exports = allPass;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");
/**
 * Returns a function that always returns the given value. Note that for
 * non-primitives the value returned is a reference to the original value.
 *
 * This function is known as `const`, `constant`, or `K` (for K combinator) in
 * other languages and libraries.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig a -> (* -> a)
 * @param {*} val The value to wrap in a function
 * @return {Function} A Function :: * -> val.
 * @example
 *
 *      const t = R.always('Tee');
 *      t(); //=> 'Tee'
 */


var always =
/*#__PURE__*/
_curry1(function always(val) {
  return function () {
    return val;
  };
});

module.exports = always;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Returns the first argument if it is falsy, otherwise the second argument.
 * Acts as the boolean `and` statement if both inputs are `Boolean`s.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Logic
 * @sig a -> b -> a | b
 * @param {Any} a
 * @param {Any} b
 * @return {Any}
 * @see R.both, R.or
 * @example
 *
 *      R.and(true, true); //=> true
 *      R.and(true, false); //=> false
 *      R.and(false, true); //=> false
 *      R.and(false, false); //=> false
 */


var and =
/*#__PURE__*/
_curry2(function and(a, b) {
  return a && b;
});

module.exports = and;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _assertPromise =
/*#__PURE__*/
require("./internal/_assertPromise.js");
/**
 * Returns the result of applying the onSuccess function to the value inside
 * a successfully resolved promise. This is useful for working with promises
 * inside function compositions.
 *
 * @func
 * @memberOf R
 * @since v0.27.1
 * @category Function
 * @sig (a -> b) -> (Promise e a) -> (Promise e b)
 * @sig (a -> (Promise e b)) -> (Promise e a) -> (Promise e b)
 * @param {Function} onSuccess The function to apply. Can return a value or a promise of a value.
 * @param {Promise} p
 * @return {Promise} The result of calling `p.then(onSuccess)`
 * @see R.otherwise
 * @example
 *
 *      const makeQuery = email => ({ query: { email }});
 *      const fetchMember = request =>
 *        Promise.resolve({ firstName: 'Bob', lastName: 'Loblaw', id: 42 });
 *
 *      //getMemberName :: String -> Promise ({ firstName, lastName })
 *      const getMemberName = R.pipe(
 *        makeQuery,
 *        fetchMember,
 *        R.andThen(R.pick(['firstName', 'lastName']))
 *      );
 *
 *      getMemberName('bob@gmail.com').then(console.log);
 */


var andThen =
/*#__PURE__*/
_curry2(function andThen(f, p) {
  _assertPromise('andThen', p);

  return p.then(f);
});

module.exports = andThen;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _dispatchable =
/*#__PURE__*/
require("./internal/_dispatchable.js");

var _xany =
/*#__PURE__*/
require("./internal/_xany.js");
/**
 * Returns `true` if at least one of the elements of the list match the predicate,
 * `false` otherwise.
 *
 * Dispatches to the `any` method of the second argument, if present.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> Boolean
 * @param {Function} fn The predicate function.
 * @param {Array} list The array to consider.
 * @return {Boolean} `true` if the predicate is satisfied by at least one element, `false`
 *         otherwise.
 * @see R.all, R.none, R.transduce
 * @example
 *
 *      const lessThan0 = R.flip(R.lt)(0);
 *      const lessThan2 = R.flip(R.lt)(2);
 *      R.any(lessThan0)([1, 2]); //=> false
 *      R.any(lessThan2)([1, 2]); //=> true
 */


var any =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable(['any'], _xany, function any(fn, list) {
  var idx = 0;

  while (idx < list.length) {
    if (fn(list[idx])) {
      return true;
    }

    idx += 1;
  }

  return false;
}));

module.exports = any;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var curryN =
/*#__PURE__*/
require("./curryN.js");

var max =
/*#__PURE__*/
require("./max.js");

var pluck =
/*#__PURE__*/
require("./pluck.js");

var reduce =
/*#__PURE__*/
require("./reduce.js");
/**
 * Takes a list of predicates and returns a predicate that returns true for a
 * given list of arguments if at least one of the provided predicates is
 * satisfied by those arguments.
 *
 * The function returned is a curried function whose arity matches that of the
 * highest-arity predicate.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Logic
 * @sig [(*... -> Boolean)] -> (*... -> Boolean)
 * @param {Array} predicates An array of predicates to check
 * @return {Function} The combined predicate
 * @see R.allPass
 * @example
 *
 *      const isClub = R.propEq('suit', '♣');
 *      const isSpade = R.propEq('suit', '♠');
 *      const isBlackCard = R.anyPass([isClub, isSpade]);
 *
 *      isBlackCard({rank: '10', suit: '♣'}); //=> true
 *      isBlackCard({rank: 'Q', suit: '♠'}); //=> true
 *      isBlackCard({rank: 'Q', suit: '♦'}); //=> false
 */


var anyPass =
/*#__PURE__*/
_curry1(function anyPass(preds) {
  return curryN(reduce(max, 0, pluck('length', preds)), function () {
    var idx = 0;
    var len = preds.length;

    while (idx < len) {
      if (preds[idx].apply(this, arguments)) {
        return true;
      }

      idx += 1;
    }

    return false;
  });
});

module.exports = anyPass;var _concat =
/*#__PURE__*/
require("./internal/_concat.js");

var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _reduce =
/*#__PURE__*/
require("./internal/_reduce.js");

var map =
/*#__PURE__*/
require("./map.js");
/**
 * ap applies a list of functions to a list of values.
 *
 * Dispatches to the `ap` method of the second argument, if present. Also
 * treats curried functions as applicatives.
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category Function
 * @sig [a -> b] -> [a] -> [b]
 * @sig Apply f => f (a -> b) -> f a -> f b
 * @sig (r -> a -> b) -> (r -> a) -> (r -> b)
 * @param {*} applyF
 * @param {*} applyX
 * @return {*}
 * @example
 *
 *      R.ap([R.multiply(2), R.add(3)], [1,2,3]); //=> [2, 4, 6, 4, 5, 6]
 *      R.ap([R.concat('tasty '), R.toUpper], ['pizza', 'salad']); //=> ["tasty pizza", "tasty salad", "PIZZA", "SALAD"]
 *
 *      // R.ap can also be used as S combinator
 *      // when only two functions are passed
 *      R.ap(R.concat, R.toUpper)('Ramda') //=> 'RamdaRAMDA'
 * @symb R.ap([f, g], [a, b]) = [f(a), f(b), g(a), g(b)]
 */


var ap =
/*#__PURE__*/
_curry2(function ap(applyF, applyX) {
  return typeof applyX['fantasy-land/ap'] === 'function' ? applyX['fantasy-land/ap'](applyF) : typeof applyF.ap === 'function' ? applyF.ap(applyX) : typeof applyF === 'function' ? function (x) {
    return applyF(x)(applyX(x));
  } : _reduce(function (acc, f) {
    return _concat(acc, map(f, applyX));
  }, [], applyF);
});

module.exports = ap;var _aperture =
/*#__PURE__*/
require("./internal/_aperture.js");

var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _dispatchable =
/*#__PURE__*/
require("./internal/_dispatchable.js");

var _xaperture =
/*#__PURE__*/
require("./internal/_xaperture.js");
/**
 * Returns a new list, composed of n-tuples of consecutive elements. If `n` is
 * greater than the length of the list, an empty list is returned.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.12.0
 * @category List
 * @sig Number -> [a] -> [[a]]
 * @param {Number} n The size of the tuples to create
 * @param {Array} list The list to split into `n`-length tuples
 * @return {Array} The resulting list of `n`-length tuples
 * @see R.transduce
 * @example
 *
 *      R.aperture(2, [1, 2, 3, 4, 5]); //=> [[1, 2], [2, 3], [3, 4], [4, 5]]
 *      R.aperture(3, [1, 2, 3, 4, 5]); //=> [[1, 2, 3], [2, 3, 4], [3, 4, 5]]
 *      R.aperture(7, [1, 2, 3, 4, 5]); //=> []
 */


var aperture =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable([], _xaperture, _aperture));

module.exports = aperture;var _concat =
/*#__PURE__*/
require("./internal/_concat.js");

var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Returns a new list containing the contents of the given list, followed by
 * the given element.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig a -> [a] -> [a]
 * @param {*} el The element to add to the end of the new list.
 * @param {Array} list The list of elements to add a new item to.
 *        list.
 * @return {Array} A new list containing the elements of the old list followed by `el`.
 * @see R.prepend
 * @example
 *
 *      R.append('tests', ['write', 'more']); //=> ['write', 'more', 'tests']
 *      R.append('tests', []); //=> ['tests']
 *      R.append(['tests'], ['write', 'more']); //=> ['write', 'more', ['tests']]
 */


var append =
/*#__PURE__*/
_curry2(function append(el, list) {
  return _concat(list, [el]);
});

module.exports = append;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Applies function `fn` to the argument list `args`. This is useful for
 * creating a fixed-arity function from a variadic function. `fn` should be a
 * bound function if context is significant.
 *
 * @func
 * @memberOf R
 * @since v0.7.0
 * @category Function
 * @sig (*... -> a) -> [*] -> a
 * @param {Function} fn The function which will be called with `args`
 * @param {Array} args The arguments to call `fn` with
 * @return {*} result The result, equivalent to `fn(...args)`
 * @see R.call, R.unapply
 * @example
 *
 *      const nums = [1, 2, 3, -99, 42, 6, 7];
 *      R.apply(Math.max, nums); //=> 42
 * @symb R.apply(f, [a, b, c]) = f(a, b, c)
 */


var apply =
/*#__PURE__*/
_curry2(function apply(fn, args) {
  return fn.apply(this, args);
});

module.exports = apply;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var _isArray =
/*#__PURE__*/
require("./internal/_isArray.js");

var apply =
/*#__PURE__*/
require("./apply.js");

var curryN =
/*#__PURE__*/
require("./curryN.js");

var max =
/*#__PURE__*/
require("./max.js");

var pluck =
/*#__PURE__*/
require("./pluck.js");

var reduce =
/*#__PURE__*/
require("./reduce.js");

var keys =
/*#__PURE__*/
require("./keys.js");

var values =
/*#__PURE__*/
require("./values.js"); // Use custom mapValues function to avoid issues with specs that include a "map" key and R.map
// delegating calls to .map


function mapValues(fn, obj) {
  return _isArray(obj) ? obj.map(fn) : keys(obj).reduce(function (acc, key) {
    acc[key] = fn(obj[key]);
    return acc;
  }, {});
}
/**
 * Given a spec object recursively mapping properties to functions, creates a
 * function producing an object of the same structure, by mapping each property
 * to the result of calling its associated function with the supplied arguments.
 *
 * @func
 * @memberOf R
 * @since v0.20.0
 * @category Function
 * @sig {k: ((a, b, ..., m) -> v)} -> ((a, b, ..., m) -> {k: v})
 * @param {Object} spec an object recursively mapping properties to functions for
 *        producing the values for these properties.
 * @return {Function} A function that returns an object of the same structure
 * as `spec', with each property set to the value returned by calling its
 * associated function with the supplied arguments.
 * @see R.converge, R.juxt
 * @example
 *
 *      const getMetrics = R.applySpec({
 *        sum: R.add,
 *        nested: { mul: R.multiply }
 *      });
 *      getMetrics(2, 4); // => { sum: 6, nested: { mul: 8 } }
 * @symb R.applySpec({ x: f, y: { z: g } })(a, b) = { x: f(a, b), y: { z: g(a, b) } }
 */


var applySpec =
/*#__PURE__*/
_curry1(function applySpec(spec) {
  spec = mapValues(function (v) {
    return typeof v == 'function' ? v : applySpec(v);
  }, spec);
  return curryN(reduce(max, 0, pluck('length', values(spec))), function () {
    var args = arguments;
    return mapValues(function (f) {
      return apply(f, args);
    }, spec);
  });
});

module.exports = applySpec;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Takes a value and applies a function to it.
 *
 * This function is also known as the `thrush` combinator.
 *
 * @func
 * @memberOf R
 * @since v0.25.0
 * @category Function
 * @sig a -> (a -> b) -> b
 * @param {*} x The value
 * @param {Function} f The function to apply
 * @return {*} The result of applying `f` to `x`
 * @example
 *
 *      const t42 = R.applyTo(42);
 *      t42(R.identity); //=> 42
 *      t42(R.add(1)); //=> 43
 */


var applyTo =
/*#__PURE__*/
_curry2(function applyTo(x, f) {
  return f(x);
});

module.exports = applyTo;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");
/**
 * Makes an ascending comparator function out of a function that returns a value
 * that can be compared with `<` and `>`.
 *
 * @func
 * @memberOf R
 * @since v0.23.0
 * @category Function
 * @sig Ord b => (a -> b) -> a -> a -> Number
 * @param {Function} fn A function of arity one that returns a value that can be compared
 * @param {*} a The first item to be compared.
 * @param {*} b The second item to be compared.
 * @return {Number} `-1` if fn(a) < fn(b), `1` if fn(b) < fn(a), otherwise `0`
 * @see R.descend
 * @example
 *
 *      const byAge = R.ascend(R.prop('age'));
 *      const people = [
 *        { name: 'Emma', age: 70 },
 *        { name: 'Peter', age: 78 },
 *        { name: 'Mikhail', age: 62 },
 *      ];
 *      const peopleByYoungestFirst = R.sort(byAge, people);
 *        //=> [{ name: 'Mikhail', age: 62 },{ name: 'Emma', age: 70 }, { name: 'Peter', age: 78 }]
 */


var ascend =
/*#__PURE__*/
_curry3(function ascend(fn, a, b) {
  var aa = fn(a);
  var bb = fn(b);
  return aa < bb ? -1 : aa > bb ? 1 : 0;
});

module.exports = ascend;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");

var assocPath =
/*#__PURE__*/
require("./assocPath.js");
/**
 * Makes a shallow clone of an object, setting or overriding the specified
 * property with the given value. Note that this copies and flattens prototype
 * properties onto the new object as well. All non-primitive properties are
 * copied by reference.
 *
 * @func
 * @memberOf R
 * @since v0.8.0
 * @category Object
 * @typedefn Idx = String | Int
 * @sig Idx -> a -> {k: v} -> {k: v}
 * @param {String|Number} prop The property name to set
 * @param {*} val The new value
 * @param {Object} obj The object to clone
 * @return {Object} A new object equivalent to the original except for the changed property.
 * @see R.dissoc, R.pick
 * @example
 *
 *      R.assoc('c', 3, {a: 1, b: 2}); //=> {a: 1, b: 2, c: 3}
 */


var assoc =
/*#__PURE__*/
_curry3(function assoc(prop, val, obj) {
  return assocPath([prop], val, obj);
});

module.exports = assoc;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");

var _has =
/*#__PURE__*/
require("./internal/_has.js");

var _isInteger =
/*#__PURE__*/
require("./internal/_isInteger.js");

var _assoc =
/*#__PURE__*/
require("./internal/_assoc.js");

var isNil =
/*#__PURE__*/
require("./isNil.js");
/**
 * Makes a shallow clone of an object, setting or overriding the nodes required
 * to create the given path, and placing the specific value at the tail end of
 * that path. Note that this copies and flattens prototype properties onto the
 * new object as well. All non-primitive properties are copied by reference.
 *
 * @func
 * @memberOf R
 * @since v0.8.0
 * @category Object
 * @typedefn Idx = String | Int | Symbol
 * @sig [Idx] -> a -> {a} -> {a}
 * @param {Array} path the path to set
 * @param {*} val The new value
 * @param {Object} obj The object to clone
 * @return {Object} A new object equivalent to the original except along the specified path.
 * @see R.dissocPath
 * @example
 *
 *      R.assocPath(['a', 'b', 'c'], 42, {a: {b: {c: 0}}}); //=> {a: {b: {c: 42}}}
 *
 *      // Any missing or non-object keys in path will be overridden
 *      R.assocPath(['a', 'b', 'c'], 42, {a: 5}); //=> {a: {b: {c: 42}}}
 */


var assocPath =
/*#__PURE__*/
_curry3(function assocPath(path, val, obj) {
  if (path.length === 0) {
    return val;
  }

  var idx = path[0];

  if (path.length > 1) {
    var nextObj = !isNil(obj) && _has(idx, obj) ? obj[idx] : _isInteger(path[1]) ? [] : {};
    val = assocPath(Array.prototype.slice.call(path, 1), val, nextObj);
  }

  return _assoc(idx, val, obj);
});

module.exports = assocPath;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var nAry =
/*#__PURE__*/
require("./nAry.js");
/**
 * Wraps a function of any arity (including nullary) in a function that accepts
 * exactly 2 parameters. Any extraneous parameters will not be passed to the
 * supplied function.
 *
 * @func
 * @memberOf R
 * @since v0.2.0
 * @category Function
 * @sig (a -> b -> c -> ... -> z) -> ((a, b) -> z)
 * @param {Function} fn The function to wrap.
 * @return {Function} A new function wrapping `fn`. The new function is guaranteed to be of
 *         arity 2.
 * @see R.nAry, R.unary
 * @example
 *
 *      const takesThreeArgs = function(a, b, c) {
 *        return [a, b, c];
 *      };
 *      takesThreeArgs.length; //=> 3
 *      takesThreeArgs(1, 2, 3); //=> [1, 2, 3]
 *
 *      const takesTwoArgs = R.binary(takesThreeArgs);
 *      takesTwoArgs.length; //=> 2
 *      // Only 2 arguments are passed to the wrapped function
 *      takesTwoArgs(1, 2, 3); //=> [1, 2, undefined]
 * @symb R.binary(f)(a, b, c) = f(a, b)
 */


var binary =
/*#__PURE__*/
_curry1(function binary(fn) {
  return nAry(2, fn);
});

module.exports = binary;var _arity =
/*#__PURE__*/
require("./internal/_arity.js");

var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Creates a function that is bound to a context.
 * Note: `R.bind` does not provide the additional argument-binding capabilities of
 * [Function.prototype.bind](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind).
 *
 * @func
 * @memberOf R
 * @since v0.6.0
 * @category Function
 * @category Object
 * @sig (* -> *) -> {*} -> (* -> *)
 * @param {Function} fn The function to bind to context
 * @param {Object} thisObj The context to bind `fn` to
 * @return {Function} A function that will execute in the context of `thisObj`.
 * @see R.partial
 * @example
 *
 *      const log = R.bind(console.log, console);
 *      R.pipe(R.assoc('a', 2), R.tap(log), R.assoc('a', 3))({a: 1}); //=> {a: 3}
 *      // logs {a: 2}
 * @symb R.bind(f, o)(a, b) = f.call(o, a, b)
 */


var bind =
/*#__PURE__*/
_curry2(function bind(fn, thisObj) {
  return _arity(fn.length, function () {
    return fn.apply(thisObj, arguments);
  });
});

module.exports = bind;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _isFunction =
/*#__PURE__*/
require("./internal/_isFunction.js");

var and =
/*#__PURE__*/
require("./and.js");

var lift =
/*#__PURE__*/
require("./lift.js");
/**
 * A function which calls the two provided functions and returns the `&&`
 * of the results.
 * It returns the result of the first function if it is false-y and the result
 * of the second function otherwise. Note that this is short-circuited,
 * meaning that the second function will not be invoked if the first returns a
 * false-y value.
 *
 * In addition to functions, `R.both` also accepts any fantasy-land compatible
 * applicative functor.
 *
 * @func
 * @memberOf R
 * @since v0.12.0
 * @category Logic
 * @sig (*... -> Boolean) -> (*... -> Boolean) -> (*... -> Boolean)
 * @param {Function} f A predicate
 * @param {Function} g Another predicate
 * @return {Function} a function that applies its arguments to `f` and `g` and `&&`s their outputs together.
 * @see R.either, R.and
 * @example
 *
 *      const gt10 = R.gt(R.__, 10)
 *      const lt20 = R.lt(R.__, 20)
 *      const f = R.both(gt10, lt20);
 *      f(15); //=> true
 *      f(30); //=> false
 *
 *      R.both(Maybe.Just(false), Maybe.Just(55)); // => Maybe.Just(false)
 *      R.both([false, false, 'a'], [11]); //=> [false, false, 11]
 */


var both =
/*#__PURE__*/
_curry2(function both(f, g) {
  return _isFunction(f) ? function _both() {
    return f.apply(this, arguments) && g.apply(this, arguments);
  } : lift(and)(f, g);
});

module.exports = both;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");
/**
 * Returns the result of calling its first argument with the remaining
 * arguments. This is occasionally useful as a converging function for
 * [`R.converge`](#converge): the first branch can produce a function while the
 * remaining branches produce values to be passed to that function as its
 * arguments.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Function
 * @sig ((*... -> a), *...) -> a
 * @param {Function} fn The function to apply to the remaining arguments.
 * @param {...*} args Any number of positional arguments.
 * @return {*}
 * @see R.apply
 * @example
 *
 *      R.call(R.add, 1, 2); //=> 3
 *
 *      const indentN = R.pipe(
 *        R.repeat(' '),
 *        R.join(''),
 *        R.replace(/^(?!$)/gm)
 *      );
 *
 *      const format = R.converge(
 *        R.call,
 *        [
 *          R.pipe(R.prop('indent'), indentN),
 *          R.prop('value')
 *        ]
 *      );
 *
 *      format({indent: 2, value: 'foo\nbar\nbaz\n'}); //=> '  foo\n  bar\n  baz\n'
 * @symb R.call(f, a, b) = f(a, b)
 */


var call =
/*#__PURE__*/
_curry1(function call(fn) {
  return fn.apply(this, Array.prototype.slice.call(arguments, 1));
});

module.exports = call;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _dispatchable =
/*#__PURE__*/
require("./internal/_dispatchable.js");

var _makeFlat =
/*#__PURE__*/
require("./internal/_makeFlat.js");

var _xchain =
/*#__PURE__*/
require("./internal/_xchain.js");

var map =
/*#__PURE__*/
require("./map.js");
/**
 * `chain` maps a function over a list and concatenates the results. `chain`
 * is also known as `flatMap` in some libraries.
 *
 * Dispatches to the `chain` method of the second argument, if present,
 * according to the [FantasyLand Chain spec](https://github.com/fantasyland/fantasy-land#chain).
 *
 * If second argument is a function, `chain(f, g)(x)` is equivalent to `f(g(x), x)`.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category List
 * @sig Chain m => (a -> m b) -> m a -> m b
 * @param {Function} fn The function to map with
 * @param {Array} list The list to map over
 * @return {Array} The result of flat-mapping `list` with `fn`
 * @example
 *
 *      const duplicate = n => [n, n];
 *      R.chain(duplicate, [1, 2, 3]); //=> [1, 1, 2, 2, 3, 3]
 *
 *      R.chain(R.append, R.head)([1, 2, 3]); //=> [1, 2, 3, 1]
 */


var chain =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable(['fantasy-land/chain', 'chain'], _xchain, function chain(fn, monad) {
  if (typeof monad === 'function') {
    return function (x) {
      return fn(monad(x))(x);
    };
  }

  return _makeFlat(false)(map(fn, monad));
}));

module.exports = chain;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");
/**
 * Restricts a number to be within a range.
 *
 * Also works for other ordered types such as Strings and Dates.
 *
 * @func
 * @memberOf R
 * @since v0.20.0
 * @category Relation
 * @sig Ord a => a -> a -> a -> a
 * @param {Number} minimum The lower limit of the clamp (inclusive)
 * @param {Number} maximum The upper limit of the clamp (inclusive)
 * @param {Number} value Value to be clamped
 * @return {Number} Returns `minimum` when `val < minimum`, `maximum` when `val > maximum`, returns `val` otherwise
 * @example
 *
 *      R.clamp(1, 10, -5) // => 1
 *      R.clamp(1, 10, 15) // => 10
 *      R.clamp(1, 10, 4)  // => 4
 */


var clamp =
/*#__PURE__*/
_curry3(function clamp(min, max, value) {
  if (min > max) {
    throw new Error('min must not be greater than max in clamp(min, max, value)');
  }

  return value < min ? min : value > max ? max : value;
});

module.exports = clamp;var _clone =
/*#__PURE__*/
require("./internal/_clone.js");

var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");
/**
 * Creates a deep copy of the source that can be used in place of the source
 * object without retaining any references to it.
 * The source object may contain (nested) `Array`s and `Object`s,
 * `Number`s, `String`s, `Boolean`s and `Date`s.
 * `Function`s are assigned by reference rather than copied.
 *
 * Dispatches to a `clone` method if present.
 *
 * Note that if the source object has multiple nodes that share a reference,
 * the returned object will have the same structure, but the references will
 * be pointed to the location within the cloned value.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @sig {*} -> {*}
 * @param {*} value The object or array to clone
 * @return {*} A deeply cloned copy of `val`
 * @example
 *
 *      const objects = [{}, {}, {}];
 *      const objectsClone = R.clone(objects);
 *      objects === objectsClone; //=> false
 *      objects[0] === objectsClone[0]; //=> false
 */


var clone =
/*#__PURE__*/
_curry1(function clone(value) {
  return value != null && typeof value.clone === 'function' ? value.clone() : _clone(value, [], [], true);
});

module.exports = clone;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _reduce =
/*#__PURE__*/
require("./internal/_reduce.js");
/**
 * Splits a list into sub-lists, based on the result of calling a key-returning function on each element,
 * and grouping the results according to values returned.
 *
 * @func
 * @memberOf R
 * @since v0.28.0
 * @category List
 * @typedefn Idx = String | Int | Symbol
 * @sig Idx a => (b -> a) -> [b] -> [[b]]
 * @param {Function} fn Function :: a -> Idx
 * @param {Array} list The array to group
 * @return {Array}
 *    An array of arrays where each sub-array contains items for which
 *    the String-returning function has returned the same value.
 * @see R.groupBy, R.partition
 * @example
 *      R.collectBy(R.prop('type'), [
 *        {type: 'breakfast', item: '☕️'},
 *        {type: 'lunch', item: '🌯'},
 *        {type: 'dinner', item: '🍝'},
 *        {type: 'breakfast', item: '🥐'},
 *        {type: 'lunch', item: '🍕'}
 *      ]);
 *
 *      // [ [ {type: 'breakfast', item: '☕️'},
 *      //     {type: 'breakfast', item: '🥐'} ],
 *      //   [ {type: 'lunch', item: '🌯'},
 *      //     {type: 'lunch', item: '🍕'} ],
 *      //   [ {type: 'dinner', item: '🍝'} ] ]
 */


var collectBy =
/*#__PURE__*/
_curry2(function collectBy(fn, list) {
  var group = _reduce(function (o, x) {
    var tag = fn(x);

    if (o[tag] === undefined) {
      o[tag] = [];
    }

    o[tag].push(x);
    return o;
  }, {}, list);

  var newList = [];

  for (var tag in group) {
    newList.push(group[tag]);
  }

  return newList;
});

module.exports = collectBy;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");
/**
 * Makes a comparator function out of a function that reports whether the first
 * element is less than the second.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig ((a, b) -> Boolean) -> ((a, b) -> Number)
 * @param {Function} pred A predicate function of arity two which will return `true` if the first argument
 * is less than the second, `false` otherwise
 * @return {Function} A Function :: a -> b -> Int that returns `-1` if a < b, `1` if b < a, otherwise `0`
 * @example
 *
 *      const byAge = R.comparator((a, b) => a.age < b.age);
 *      const people = [
 *        { name: 'Emma', age: 70 },
 *        { name: 'Peter', age: 78 },
 *        { name: 'Mikhail', age: 62 },
 *      ];
 *      const peopleByIncreasingAge = R.sort(byAge, people);
 *        //=> [{ name: 'Mikhail', age: 62 },{ name: 'Emma', age: 70 }, { name: 'Peter', age: 78 }]
 */


var comparator =
/*#__PURE__*/
_curry1(function comparator(pred) {
  return function (a, b) {
    return pred(a, b) ? -1 : pred(b, a) ? 1 : 0;
  };
});

module.exports = comparator;var lift =
/*#__PURE__*/
require("./lift.js");

var not =
/*#__PURE__*/
require("./not.js");
/**
 * Takes a function `f` and returns a function `g` such that if called with the same arguments
 * when `f` returns a "truthy" value, `g` returns `false` and when `f` returns a "falsy" value `g` returns `true`.
 *
 * `R.complement` may be applied to any functor
 *
 * @func
 * @memberOf R
 * @since v0.12.0
 * @category Logic
 * @sig (*... -> *) -> (*... -> Boolean)
 * @param {Function} f
 * @return {Function}
 * @see R.not
 * @example
 *
 *      const isNotNil = R.complement(R.isNil);
 *      R.isNil(null); //=> true
 *      isNotNil(null); //=> false
 *      R.isNil(7); //=> false
 *      isNotNil(7); //=> true
 */


var complement =
/*#__PURE__*/
lift(not);
module.exports = complement;var pipe =
/*#__PURE__*/
require("./pipe.js");

var reverse =
/*#__PURE__*/
require("./reverse.js");
/**
 * Performs right-to-left function composition. The last argument may have
 * any arity; the remaining arguments must be unary.
 *
 * **Note:** The result of compose is not automatically curried.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig ((y -> z), (x -> y), ..., (o -> p), ((a, b, ..., n) -> o)) -> ((a, b, ..., n) -> z)
 * @param {...Function} ...functions The functions to compose
 * @return {Function}
 * @see R.pipe
 * @example
 *
 *      const classyGreeting = (firstName, lastName) => "The name's " + lastName + ", " + firstName + " " + lastName
 *      const yellGreeting = R.compose(R.toUpper, classyGreeting);
 *      yellGreeting('James', 'Bond'); //=> "THE NAME'S BOND, JAMES BOND"
 *
 *      R.compose(Math.abs, R.add(1), R.multiply(2))(-4) //=> 7
 *
 * @symb R.compose(f, g, h)(a, b) = f(g(h(a, b)))
 * @symb R.compose(f, g, h)(a)(b) = f(g(h(a)))(b)
 */


function compose() {
  if (arguments.length === 0) {
    throw new Error('compose requires at least one argument');
  }

  return pipe.apply(this, reverse(arguments));
}

module.exports = compose;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var pipeWith =
/*#__PURE__*/
require("./pipeWith.js");

var reverse =
/*#__PURE__*/
require("./reverse.js");
/**
 * Performs right-to-left function composition using transforming function. The last function may have
 * any arity; the remaining functions must be unary.
 *
 * **Note:** The result of composeWith is not automatically curried. Transforming function is not used
 * on the last argument.
 *
 * @func
 * @memberOf R
 * @since v0.26.0
 * @category Function
 * @sig ((* -> *), [(y -> z), (x -> y), ..., (o -> p), ((a, b, ..., n) -> o)]) -> ((a, b, ..., n) -> z)
 * @param {Function} transformer The transforming function
 * @param {Array} functions The functions to compose
 * @return {Function}
 * @see R.compose, R.pipeWith
 * @example
 *
 *      const composeWhileNotNil = R.composeWith((f, res) => R.isNil(res) ? res : f(res));
 *
 *      composeWhileNotNil([R.inc, R.prop('age')])({age: 1}) //=> 2
 *      composeWhileNotNil([R.inc, R.prop('age')])({}) //=> undefined
 *
 * @symb R.composeWith(f)([g, h, i])(...args) = f(g, f(h, i(...args)))
 */


var composeWith =
/*#__PURE__*/
_curry2(function composeWith(xf, list) {
  return pipeWith.apply(this, [xf, reverse(list)]);
});

module.exports = composeWith;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _isArray =
/*#__PURE__*/
require("./internal/_isArray.js");

var _isFunction =
/*#__PURE__*/
require("./internal/_isFunction.js");

var _isString =
/*#__PURE__*/
require("./internal/_isString.js");

var toString =
/*#__PURE__*/
require("./toString.js");
/**
 * Returns the result of concatenating the given lists or strings.
 *
 * Note: `R.concat` expects both arguments to be of the same type,
 * unlike the native `Array.prototype.concat` method. It will throw
 * an error if you `concat` an Array with a non-Array value.
 *
 * Dispatches to the `concat` method of the first argument, if present.
 * Can also concatenate two members of a [fantasy-land
 * compatible semigroup](https://github.com/fantasyland/fantasy-land#semigroup).
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig [a] -> [a] -> [a]
 * @sig String -> String -> String
 * @param {Array|String} firstList The first list
 * @param {Array|String} secondList The second list
 * @return {Array|String} A list consisting of the elements of `firstList` followed by the elements of
 * `secondList`.
 *
 * @example
 *
 *      R.concat('ABC', 'DEF'); // 'ABCDEF'
 *      R.concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3]
 *      R.concat([], []); //=> []
 */


var concat =
/*#__PURE__*/
_curry2(function concat(a, b) {
  if (_isArray(a)) {
    if (_isArray(b)) {
      return a.concat(b);
    }

    throw new TypeError(toString(b) + ' is not an array');
  }

  if (_isString(a)) {
    if (_isString(b)) {
      return a + b;
    }

    throw new TypeError(toString(b) + ' is not a string');
  }

  if (a != null && _isFunction(a['fantasy-land/concat'])) {
    return a['fantasy-land/concat'](b);
  }

  if (a != null && _isFunction(a.concat)) {
    return a.concat(b);
  }

  throw new TypeError(toString(a) + ' does not have a method named "concat" or "fantasy-land/concat"');
});

module.exports = concat;var _arity =
/*#__PURE__*/
require("./internal/_arity.js");

var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var map =
/*#__PURE__*/
require("./map.js");

var max =
/*#__PURE__*/
require("./max.js");

var reduce =
/*#__PURE__*/
require("./reduce.js");
/**
 * Returns a function, `fn`, which encapsulates `if/else, if/else, ...` logic.
 * `R.cond` takes a list of [predicate, transformer] pairs. All of the arguments
 * to `fn` are applied to each of the predicates in turn until one returns a
 * "truthy" value, at which point `fn` returns the result of applying its
 * arguments to the corresponding transformer. If none of the predicates
 * matches, `fn` returns undefined.
 *
 * **Please note**: This is not a direct substitute for a `switch` statement.
 * Remember that both elements of every pair passed to `cond` are *functions*,
 * and `cond` returns a function.
 *
 * @func
 * @memberOf R
 * @since v0.6.0
 * @category Logic
 * @sig [[(*... -> Boolean),(*... -> *)]] -> (*... -> *)
 * @param {Array} pairs A list of [predicate, transformer]
 * @return {Function}
 * @see R.ifElse, R.unless, R.when
 * @example
 *
 *      const fn = R.cond([
 *        [R.equals(0),   R.always('water freezes at 0°C')],
 *        [R.equals(100), R.always('water boils at 100°C')],
 *        [R.T,           temp => 'nothing special happens at ' + temp + '°C']
 *      ]);
 *      fn(0); //=> 'water freezes at 0°C'
 *      fn(50); //=> 'nothing special happens at 50°C'
 *      fn(100); //=> 'water boils at 100°C'
 */


var cond =
/*#__PURE__*/
_curry1(function cond(pairs) {
  var arity = reduce(max, 0, map(function (pair) {
    return pair[0].length;
  }, pairs));
  return _arity(arity, function () {
    var idx = 0;

    while (idx < pairs.length) {
      if (pairs[idx][0].apply(this, arguments)) {
        return pairs[idx][1].apply(this, arguments);
      }

      idx += 1;
    }
  });
});

module.exports = cond;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var constructN =
/*#__PURE__*/
require("./constructN.js");
/**
 * Wraps a constructor function inside a curried function that can be called
 * with the same arguments and returns the same type.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig (* -> {*}) -> (* -> {*})
 * @param {Function} fn The constructor function to wrap.
 * @return {Function} A wrapped, curried constructor function.
 * @see R.invoker
 * @example
 *
 *      // Constructor function
 *      function Animal(kind) {
 *        this.kind = kind;
 *      };
 *      Animal.prototype.sighting = function() {
 *        return "It's a " + this.kind + "!";
 *      }
 *
 *      const AnimalConstructor = R.construct(Animal)
 *
 *      // Notice we no longer need the 'new' keyword:
 *      AnimalConstructor('Pig'); //=> {"kind": "Pig", "sighting": function (){...}};
 *
 *      const animalTypes = ["Lion", "Tiger", "Bear"];
 *      const animalSighting = R.invoker(0, 'sighting');
 *      const sightNewAnimal = R.compose(animalSighting, AnimalConstructor);
 *      R.map(sightNewAnimal, animalTypes); //=> ["It's a Lion!", "It's a Tiger!", "It's a Bear!"]
 */


var construct =
/*#__PURE__*/
_curry1(function construct(Fn) {
  return constructN(Fn.length, Fn);
});

module.exports = construct;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var curry =
/*#__PURE__*/
require("./curry.js");

var nAry =
/*#__PURE__*/
require("./nAry.js");
/**
 * Wraps a constructor function inside a curried function that can be called
 * with the same arguments and returns the same type. The arity of the function
 * returned is specified to allow using variadic constructor functions.
 *
 * @func
 * @memberOf R
 * @since v0.4.0
 * @category Function
 * @sig Number -> (* -> {*}) -> (* -> {*})
 * @param {Number} n The arity of the constructor function.
 * @param {Function} Fn The constructor function to wrap.
 * @return {Function} A wrapped, curried constructor function.
 * @example
 *
 *      // Variadic Constructor function
 *      function Salad() {
 *        this.ingredients = arguments;
 *      }
 *
 *      Salad.prototype.recipe = function() {
 *        const instructions = R.map(ingredient => 'Add a dollop of ' + ingredient, this.ingredients);
 *        return R.join('\n', instructions);
 *      };
 *
 *      const ThreeLayerSalad = R.constructN(3, Salad);
 *
 *      // Notice we no longer need the 'new' keyword, and the constructor is curried for 3 arguments.
 *      const salad = ThreeLayerSalad('Mayonnaise')('Potato Chips')('Ketchup');
 *
 *      console.log(salad.recipe());
 *      // Add a dollop of Mayonnaise
 *      // Add a dollop of Potato Chips
 *      // Add a dollop of Ketchup
 */


var constructN =
/*#__PURE__*/
_curry2(function constructN(n, Fn) {
  if (n > 10) {
    throw new Error('Constructor with greater than ten arguments');
  }

  if (n === 0) {
    return function () {
      return new Fn();
    };
  }

  return curry(nAry(n, function ($0, $1, $2, $3, $4, $5, $6, $7, $8, $9) {
    switch (arguments.length) {
      case 1:
        return new Fn($0);

      case 2:
        return new Fn($0, $1);

      case 3:
        return new Fn($0, $1, $2);

      case 4:
        return new Fn($0, $1, $2, $3);

      case 5:
        return new Fn($0, $1, $2, $3, $4);

      case 6:
        return new Fn($0, $1, $2, $3, $4, $5);

      case 7:
        return new Fn($0, $1, $2, $3, $4, $5, $6);

      case 8:
        return new Fn($0, $1, $2, $3, $4, $5, $6, $7);

      case 9:
        return new Fn($0, $1, $2, $3, $4, $5, $6, $7, $8);

      case 10:
        return new Fn($0, $1, $2, $3, $4, $5, $6, $7, $8, $9);
    }
  }));
});

module.exports = constructN;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _map =
/*#__PURE__*/
require("./internal/_map.js");

var curryN =
/*#__PURE__*/
require("./curryN.js");

var max =
/*#__PURE__*/
require("./max.js");

var pluck =
/*#__PURE__*/
require("./pluck.js");

var reduce =
/*#__PURE__*/
require("./reduce.js");
/**
 * Accepts a converging function and a list of branching functions and returns
 * a new function. The arity of the new function is the same as the arity of
 * the longest branching function. When invoked, this new function is applied
 * to some arguments, and each branching function is applied to those same
 * arguments. The results of each branching function are passed as arguments
 * to the converging function to produce the return value.
 *
 * @func
 * @memberOf R
 * @since v0.4.2
 * @category Function
 * @sig ((x1, x2, ...) -> z) -> [((a, b, ...) -> x1), ((a, b, ...) -> x2), ...] -> (a -> b -> ... -> z)
 * @param {Function} after A function. `after` will be invoked with the return values of
 *        `fn1` and `fn2` as its arguments.
 * @param {Array} functions A list of functions.
 * @return {Function} A new function.
 * @see R.useWith
 * @example
 *
 *      const average = R.converge(R.divide, [R.sum, R.length])
 *      average([1, 2, 3, 4, 5, 6, 7]) //=> 4
 *
 *      const strangeConcat = R.converge(R.concat, [R.toUpper, R.toLower])
 *      strangeConcat("Yodel") //=> "YODELyodel"
 *
 * @symb R.converge(f, [g, h])(a, b) = f(g(a, b), h(a, b))
 */


var converge =
/*#__PURE__*/
_curry2(function converge(after, fns) {
  return curryN(reduce(max, 0, pluck('length', fns)), function () {
    var args = arguments;
    var context = this;
    return after.apply(context, _map(function (fn) {
      return fn.apply(context, args);
    }, fns));
  });
});

module.exports = converge;var _reduce =
/*#__PURE__*/
require("./internal/_reduce.js");

var curry =
/*#__PURE__*/
require("./curry.js");
/**
 * Returns the number of items in a given `list` matching the predicate `f`
 *
 * @func
 * @memberOf R
 * @since v0.28.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> Number
 * @param {Function} predicate to match items against
 * @return {Array} list of items to count in
 * @example
 *
 *      const even = x => x % 2 == 0;
 *
 *      R.count(even, [1, 2, 3, 4, 5]); // => 2
 *      R.map(R.count(even), [[1, 1, 1], [2, 3, 4, 5], [6]]); // => [0, 2, 1]
 */


var count =
/*#__PURE__*/
curry(function (pred, list) {
  return _reduce(function (a, e) {
    return pred(e) ? a + 1 : a;
  }, 0, list);
});
module.exports = count;var reduceBy =
/*#__PURE__*/
require("./reduceBy.js");
/**
 * Counts the elements of a list according to how many match each value of a
 * key generated by the supplied function. Returns an object mapping the keys
 * produced by `fn` to the number of occurrences in the list. Note that all
 * keys are coerced to strings because of how JavaScript objects work.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig (a -> String) -> [a] -> {*}
 * @param {Function} fn The function used to map values to keys.
 * @param {Array} list The list to count elements from.
 * @return {Object} An object mapping keys to number of occurrences in the list.
 * @example
 *
 *      const numbers = [1.0, 1.1, 1.2, 2.0, 3.0, 2.2];
 *      R.countBy(Math.floor)(numbers);    //=> {'1': 3, '2': 2, '3': 1}
 *
 *      const letters = ['a', 'b', 'A', 'a', 'B', 'c'];
 *      R.countBy(R.toLower)(letters);   //=> {'a': 3, 'b': 2, 'c': 1}
 */


var countBy =
/*#__PURE__*/
reduceBy(function (acc, elem) {
  return acc + 1;
}, 0);
module.exports = countBy;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var curryN =
/*#__PURE__*/
require("./curryN.js");
/**
 * Returns a curried equivalent of the provided function. The curried function
 * has two unusual capabilities. First, its arguments needn't be provided one
 * at a time. If `f` is a ternary function and `g` is `R.curry(f)`, the
 * following are equivalent:
 *
 *   - `g(1)(2)(3)`
 *   - `g(1)(2, 3)`
 *   - `g(1, 2)(3)`
 *   - `g(1, 2, 3)`
 *
 * Secondly, the special placeholder value [`R.__`](#__) may be used to specify
 * "gaps", allowing partial application of any combination of arguments,
 * regardless of their positions. If `g` is as above and `_` is [`R.__`](#__),
 * the following are equivalent:
 *
 *   - `g(1, 2, 3)`
 *   - `g(_, 2, 3)(1)`
 *   - `g(_, _, 3)(1)(2)`
 *   - `g(_, _, 3)(1, 2)`
 *   - `g(_, 2)(1)(3)`
 *   - `g(_, 2)(1, 3)`
 *   - `g(_, 2)(_, 3)(1)`
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig (* -> a) -> (* -> a)
 * @param {Function} fn The function to curry.
 * @return {Function} A new, curried function.
 * @see R.curryN, R.partial
 * @example
 *
 *      const addFourNumbers = (a, b, c, d) => a + b + c + d;
 *
 *      const curriedAddFourNumbers = R.curry(addFourNumbers);
 *      const f = curriedAddFourNumbers(1, 2);
 *      const g = f(3);
 *      g(4); //=> 10
 */


var curry =
/*#__PURE__*/
_curry1(function curry(fn) {
  return curryN(fn.length, fn);
});

module.exports = curry;var _arity =
/*#__PURE__*/
require("./internal/_arity.js");

var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _curryN =
/*#__PURE__*/
require("./internal/_curryN.js");
/**
 * Returns a curried equivalent of the provided function, with the specified
 * arity. The curried function has two unusual capabilities. First, its
 * arguments needn't be provided one at a time. If `g` is `R.curryN(3, f)`, the
 * following are equivalent:
 *
 *   - `g(1)(2)(3)`
 *   - `g(1)(2, 3)`
 *   - `g(1, 2)(3)`
 *   - `g(1, 2, 3)`
 *
 * Secondly, the special placeholder value [`R.__`](#__) may be used to specify
 * "gaps", allowing partial application of any combination of arguments,
 * regardless of their positions. If `g` is as above and `_` is [`R.__`](#__),
 * the following are equivalent:
 *
 *   - `g(1, 2, 3)`
 *   - `g(_, 2, 3)(1)`
 *   - `g(_, _, 3)(1)(2)`
 *   - `g(_, _, 3)(1, 2)`
 *   - `g(_, 2)(1)(3)`
 *   - `g(_, 2)(1, 3)`
 *   - `g(_, 2)(_, 3)(1)`
 *
 * @func
 * @memberOf R
 * @since v0.5.0
 * @category Function
 * @sig Number -> (* -> a) -> (* -> a)
 * @param {Number} length The arity for the returned function.
 * @param {Function} fn The function to curry.
 * @return {Function} A new, curried function.
 * @see R.curry
 * @example
 *
 *      const sumArgs = (...args) => R.sum(args);
 *
 *      const curriedAddFourNumbers = R.curryN(4, sumArgs);
 *      const f = curriedAddFourNumbers(1, 2);
 *      const g = f(3);
 *      g(4); //=> 10
 */


var curryN =
/*#__PURE__*/
_curry2(function curryN(length, fn) {
  if (length === 1) {
    return _curry1(fn);
  }

  return _arity(length, _curryN(length, [], fn));
});

module.exports = curryN;var add =
/*#__PURE__*/
require("./add.js");
/**
 * Decrements its argument.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Math
 * @sig Number -> Number
 * @param {Number} n
 * @return {Number} n - 1
 * @see R.inc
 * @example
 *
 *      R.dec(42); //=> 41
 */


var dec =
/*#__PURE__*/
add(-1);
module.exports = dec;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Returns the second argument if it is not `null`, `undefined` or `NaN`;
 * otherwise the first argument is returned.
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category Logic
 * @sig a -> b -> a | b
 * @param {a} default The default value.
 * @param {b} val `val` will be returned instead of `default` unless `val` is `null`, `undefined` or `NaN`.
 * @return {*} The second value if it is not `null`, `undefined` or `NaN`, otherwise the default value
 * @example
 *
 *      const defaultTo42 = R.defaultTo(42);
 *
 *      defaultTo42(null);  //=> 42
 *      defaultTo42(undefined);  //=> 42
 *      defaultTo42(false);  //=> false
 *      defaultTo42('Ramda');  //=> 'Ramda'
 *      // parseInt('string') results in NaN
 *      defaultTo42(parseInt('string')); //=> 42
 */


var defaultTo =
/*#__PURE__*/
_curry2(function defaultTo(d, v) {
  return v == null || v !== v ? d : v;
});

module.exports = defaultTo;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");
/**
 * Makes a descending comparator function out of a function that returns a value
 * that can be compared with `<` and `>`.
 *
 * @func
 * @memberOf R
 * @since v0.23.0
 * @category Function
 * @sig Ord b => (a -> b) -> a -> a -> Number
 * @param {Function} fn A function of arity one that returns a value that can be compared
 * @param {*} a The first item to be compared.
 * @param {*} b The second item to be compared.
 * @return {Number} `-1` if fn(a) > fn(b), `1` if fn(b) > fn(a), otherwise `0`
 * @see R.ascend
 * @example
 *
 *      const byAge = R.descend(R.prop('age'));
 *      const people = [
 *        { name: 'Emma', age: 70 },
 *        { name: 'Peter', age: 78 },
 *        { name: 'Mikhail', age: 62 },
 *      ];
 *      const peopleByOldestFirst = R.sort(byAge, people);
 *        //=> [{ name: 'Peter', age: 78 }, { name: 'Emma', age: 70 }, { name: 'Mikhail', age: 62 }]
 */


var descend =
/*#__PURE__*/
_curry3(function descend(fn, a, b) {
  var aa = fn(a);
  var bb = fn(b);
  return aa > bb ? -1 : aa < bb ? 1 : 0;
});

module.exports = descend;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _Set =
/*#__PURE__*/
require("./internal/_Set.js");
/**
 * Finds the set (i.e. no duplicates) of all elements in the first list not
 * contained in the second list. Objects and Arrays are compared in terms of
 * value equality, not reference equality.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig [*] -> [*] -> [*]
 * @param {Array} list1 The first list.
 * @param {Array} list2 The second list.
 * @return {Array} The elements in `list1` that are not in `list2`.
 * @see R.differenceWith, R.symmetricDifference, R.symmetricDifferenceWith, R.without
 * @example
 *
 *      R.difference([1,2,3,4], [7,6,5,4,3]); //=> [1,2]
 *      R.difference([7,6,5,4,3], [1,2,3,4]); //=> [7,6,5]
 *      R.difference([{a: 1}, {b: 2}], [{a: 1}, {c: 3}]) //=> [{b: 2}]
 */


var difference =
/*#__PURE__*/
_curry2(function difference(first, second) {
  var out = [];
  var idx = 0;
  var firstLen = first.length;
  var secondLen = second.length;
  var toFilterOut = new _Set();

  for (var i = 0; i < secondLen; i += 1) {
    toFilterOut.add(second[i]);
  }

  while (idx < firstLen) {
    if (toFilterOut.add(first[idx])) {
      out[out.length] = first[idx];
    }

    idx += 1;
  }

  return out;
});

module.exports = difference;var _includesWith =
/*#__PURE__*/
require("./internal/_includesWith.js");

var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");
/**
 * Finds the set (i.e. no duplicates) of all elements in the first list not
 * contained in the second list. Duplication is determined according to the
 * value returned by applying the supplied predicate to two list elements.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig ((a, a) -> Boolean) -> [a] -> [a] -> [a]
 * @param {Function} pred A predicate used to test whether two items are equal.
 * @param {Array} list1 The first list.
 * @param {Array} list2 The second list.
 * @return {Array} The elements in `list1` that are not in `list2`.
 * @see R.difference, R.symmetricDifference, R.symmetricDifferenceWith
 * @example
 *
 *      const cmp = (x, y) => x.a === y.a;
 *      const l1 = [{a: 1}, {a: 2}, {a: 3}];
 *      const l2 = [{a: 3}, {a: 4}];
 *      R.differenceWith(cmp, l1, l2); //=> [{a: 1}, {a: 2}]
 */


var differenceWith =
/*#__PURE__*/
_curry3(function differenceWith(pred, first, second) {
  var out = [];
  var idx = 0;
  var firstLen = first.length;

  while (idx < firstLen) {
    if (!_includesWith(pred, first[idx], second) && !_includesWith(pred, first[idx], out)) {
      out.push(first[idx]);
    }

    idx += 1;
  }

  return out;
});

module.exports = differenceWith;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var dissocPath =
/*#__PURE__*/
require("./dissocPath.js");
/**
 * Returns a new object that does not contain a `prop` property.
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category Object
 * @sig String -> {k: v} -> {k: v}
 * @param {String} prop The name of the property to dissociate
 * @param {Object} obj The object to clone
 * @return {Object} A new object equivalent to the original but without the specified property
 * @see R.assoc, R.omit
 * @example
 *
 *      R.dissoc('b', {a: 1, b: 2, c: 3}); //=> {a: 1, c: 3}
 */


var dissoc =
/*#__PURE__*/
_curry2(function dissoc(prop, obj) {
  return dissocPath([prop], obj);
});

module.exports = dissoc;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _dissoc =
/*#__PURE__*/
require("./internal/_dissoc.js");

var _isInteger =
/*#__PURE__*/
require("./internal/_isInteger.js");

var _isArray =
/*#__PURE__*/
require("./internal/_isArray.js");

var assoc =
/*#__PURE__*/
require("./assoc.js");
/**
 * Makes a shallow clone of an object. Note that this copies and flattens
 * prototype properties onto the new object as well. All non-primitive
 * properties are copied by reference.
 *
 * @private
 * @param {String|Integer} prop The prop operating
 * @param {Object|Array} obj The object to clone
 * @return {Object|Array} A new object equivalent to the original.
 */


function _shallowCloneObject(prop, obj) {
  if (_isInteger(prop) && _isArray(obj)) {
    return [].concat(obj);
  }

  var result = {};

  for (var p in obj) {
    result[p] = obj[p];
  }

  return result;
}
/**
 * Makes a shallow clone of an object, omitting the property at the given path.
 * Note that this copies and flattens prototype properties onto the new object
 * as well. All non-primitive properties are copied by reference.
 *
 * @func
 * @memberOf R
 * @since v0.11.0
 * @category Object
 * @typedefn Idx = String | Int | Symbol
 * @sig [Idx] -> {k: v} -> {k: v}
 * @param {Array} path The path to the value to omit
 * @param {Object} obj The object to clone
 * @return {Object} A new object without the property at path
 * @see R.assocPath
 * @example
 *
 *      R.dissocPath(['a', 'b', 'c'], {a: {b: {c: 42}}}); //=> {a: {b: {}}}
 */


var dissocPath =
/*#__PURE__*/
_curry2(function dissocPath(path, obj) {
  if (obj == null) {
    return obj;
  }

  switch (path.length) {
    case 0:
      return obj;

    case 1:
      return _dissoc(path[0], obj);

    default:
      var head = path[0];
      var tail = Array.prototype.slice.call(path, 1);

      if (obj[head] == null) {
        return _shallowCloneObject(head, obj);
      } else {
        return assoc(head, dissocPath(tail, obj[head]), obj);
      }

  }
});

module.exports = dissocPath;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Divides two numbers. Equivalent to `a / b`.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Math
 * @sig Number -> Number -> Number
 * @param {Number} a The first value.
 * @param {Number} b The second value.
 * @return {Number} The result of `a / b`.
 * @see R.multiply
 * @example
 *
 *      R.divide(71, 100); //=> 0.71
 *
 *      const half = R.divide(R.__, 2);
 *      half(42); //=> 21
 *
 *      const reciprocal = R.divide(1);
 *      reciprocal(4);   //=> 0.25
 */


var divide =
/*#__PURE__*/
_curry2(function divide(a, b) {
  return a / b;
});

module.exports = divide;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _dispatchable =
/*#__PURE__*/
require("./internal/_dispatchable.js");

var _xdrop =
/*#__PURE__*/
require("./internal/_xdrop.js");

var slice =
/*#__PURE__*/
require("./slice.js");
/**
 * Returns all but the first `n` elements of the given list, string, or
 * transducer/transformer (or object with a `drop` method).
 *
 * Dispatches to the `drop` method of the second argument, if present.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig Number -> [a] -> [a]
 * @sig Number -> String -> String
 * @param {Number} n
 * @param {*} list
 * @return {*} A copy of list without the first `n` elements
 * @see R.take, R.transduce, R.dropLast, R.dropWhile
 * @example
 *
 *      R.drop(1, ['foo', 'bar', 'baz']); //=> ['bar', 'baz']
 *      R.drop(2, ['foo', 'bar', 'baz']); //=> ['baz']
 *      R.drop(3, ['foo', 'bar', 'baz']); //=> []
 *      R.drop(4, ['foo', 'bar', 'baz']); //=> []
 *      R.drop(3, 'ramda');               //=> 'da'
 */


var drop =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable(['drop'], _xdrop, function drop(n, xs) {
  return slice(Math.max(0, n), Infinity, xs);
}));

module.exports = drop;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _dispatchable =
/*#__PURE__*/
require("./internal/_dispatchable.js");

var _dropLast =
/*#__PURE__*/
require("./internal/_dropLast.js");

var _xdropLast =
/*#__PURE__*/
require("./internal/_xdropLast.js");
/**
 * Returns a list containing all but the last `n` elements of the given `list`.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category List
 * @sig Number -> [a] -> [a]
 * @sig Number -> String -> String
 * @param {Number} n The number of elements of `list` to skip.
 * @param {Array} list The list of elements to consider.
 * @return {Array} A copy of the list with only the first `list.length - n` elements
 * @see R.takeLast, R.drop, R.dropWhile, R.dropLastWhile
 * @example
 *
 *      R.dropLast(1, ['foo', 'bar', 'baz']); //=> ['foo', 'bar']
 *      R.dropLast(2, ['foo', 'bar', 'baz']); //=> ['foo']
 *      R.dropLast(3, ['foo', 'bar', 'baz']); //=> []
 *      R.dropLast(4, ['foo', 'bar', 'baz']); //=> []
 *      R.dropLast(3, 'ramda');               //=> 'ra'
 */


var dropLast =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable([], _xdropLast, _dropLast));

module.exports = dropLast;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _dispatchable =
/*#__PURE__*/
require("./internal/_dispatchable.js");

var _dropLastWhile =
/*#__PURE__*/
require("./internal/_dropLastWhile.js");

var _xdropLastWhile =
/*#__PURE__*/
require("./internal/_xdropLastWhile.js");
/**
 * Returns a new list excluding all the tailing elements of a given list which
 * satisfy the supplied predicate function. It passes each value from the right
 * to the supplied predicate function, skipping elements until the predicate
 * function returns a `falsy` value. The predicate function is applied to one argument:
 * *(value)*.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> [a]
 * @sig (a -> Boolean) -> String -> String
 * @param {Function} predicate The function to be called on each element
 * @param {Array} xs The collection to iterate over.
 * @return {Array} A new array without any trailing elements that return `falsy` values from the `predicate`.
 * @see R.takeLastWhile, R.addIndex, R.drop, R.dropWhile
 * @example
 *
 *      const lteThree = x => x <= 3;
 *
 *      R.dropLastWhile(lteThree, [1, 2, 3, 4, 3, 2, 1]); //=> [1, 2, 3, 4]
 *
 *      R.dropLastWhile(x => x !== 'd' , 'Ramda'); //=> 'Ramd'
 */


var dropLastWhile =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable([], _xdropLastWhile, _dropLastWhile));

module.exports = dropLastWhile;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var _dispatchable =
/*#__PURE__*/
require("./internal/_dispatchable.js");

var _xdropRepeatsWith =
/*#__PURE__*/
require("./internal/_xdropRepeatsWith.js");

var dropRepeatsWith =
/*#__PURE__*/
require("./dropRepeatsWith.js");

var equals =
/*#__PURE__*/
require("./equals.js");
/**
 * Returns a new list without any consecutively repeating elements.
 * [`R.equals`](#equals) is used to determine equality.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category List
 * @sig [a] -> [a]
 * @param {Array} list The array to consider.
 * @return {Array} `list` without repeating elements.
 * @see R.transduce
 * @example
 *
 *     R.dropRepeats([1, 1, 1, 2, 3, 4, 4, 2, 2]); //=> [1, 2, 3, 4, 2]
 */


var dropRepeats =
/*#__PURE__*/
_curry1(
/*#__PURE__*/
_dispatchable([],
/*#__PURE__*/
_xdropRepeatsWith(equals),
/*#__PURE__*/
dropRepeatsWith(equals)));

module.exports = dropRepeats;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _dispatchable =
/*#__PURE__*/
require("./internal/_dispatchable.js");

var _xdropRepeatsWith =
/*#__PURE__*/
require("./internal/_xdropRepeatsWith.js");

var last =
/*#__PURE__*/
require("./last.js");
/**
 * Returns a new list without any consecutively repeating elements. Equality is
 * determined by applying the supplied predicate to each pair of consecutive elements. The
 * first element in a series of equal elements will be preserved.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category List
 * @sig ((a, a) -> Boolean) -> [a] -> [a]
 * @param {Function} pred A predicate used to test whether two items are equal.
 * @param {Array} list The array to consider.
 * @return {Array} `list` without repeating elements.
 * @see R.transduce
 * @example
 *
 *      const l = [1, -1, 1, 3, 4, -4, -4, -5, 5, 3, 3];
 *      R.dropRepeatsWith(R.eqBy(Math.abs), l); //=> [1, 3, 4, -5, 3]
 */


var dropRepeatsWith =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable([], _xdropRepeatsWith, function dropRepeatsWith(pred, list) {
  var result = [];
  var idx = 1;
  var len = list.length;

  if (len !== 0) {
    result[0] = list[0];

    while (idx < len) {
      if (!pred(last(result), list[idx])) {
        result[result.length] = list[idx];
      }

      idx += 1;
    }
  }

  return result;
}));

module.exports = dropRepeatsWith;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _dispatchable =
/*#__PURE__*/
require("./internal/_dispatchable.js");

var _xdropWhile =
/*#__PURE__*/
require("./internal/_xdropWhile.js");

var slice =
/*#__PURE__*/
require("./slice.js");
/**
 * Returns a new list excluding the leading elements of a given list which
 * satisfy the supplied predicate function. It passes each value to the supplied
 * predicate function, skipping elements while the predicate function returns
 * `true`. The predicate function is applied to one argument: *(value)*.
 *
 * Dispatches to the `dropWhile` method of the second argument, if present.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> [a]
 * @sig (a -> Boolean) -> String -> String
 * @param {Function} fn The function called per iteration.
 * @param {Array} xs The collection to iterate over.
 * @return {Array} A new array.
 * @see R.takeWhile, R.transduce, R.addIndex
 * @example
 *
 *      const lteTwo = x => x <= 2;
 *
 *      R.dropWhile(lteTwo, [1, 2, 3, 4, 3, 2, 1]); //=> [3, 4, 3, 2, 1]
 *
 *      R.dropWhile(x => x !== 'd' , 'Ramda'); //=> 'da'
 */


var dropWhile =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable(['dropWhile'], _xdropWhile, function dropWhile(pred, xs) {
  var idx = 0;
  var len = xs.length;

  while (idx < len && pred(xs[idx])) {
    idx += 1;
  }

  return slice(idx, Infinity, xs);
}));

module.exports = dropWhile;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _isFunction =
/*#__PURE__*/
require("./internal/_isFunction.js");

var lift =
/*#__PURE__*/
require("./lift.js");

var or =
/*#__PURE__*/
require("./or.js");
/**
 * A function wrapping calls to the two functions in an `||` operation,
 * returning the result of the first function if it is truth-y and the result
 * of the second function otherwise. Note that this is short-circuited,
 * meaning that the second function will not be invoked if the first returns a
 * truth-y value.
 *
 * In addition to functions, `R.either` also accepts any fantasy-land compatible
 * applicative functor.
 *
 * @func
 * @memberOf R
 * @since v0.12.0
 * @category Logic
 * @sig (*... -> Boolean) -> (*... -> Boolean) -> (*... -> Boolean)
 * @param {Function} f a predicate
 * @param {Function} g another predicate
 * @return {Function} a function that applies its arguments to `f` and `g` and `||`s their outputs together.
 * @see R.both, R.or
 * @example
 *
 *      const gt10 = x => x > 10;
 *      const even = x => x % 2 === 0;
 *      const f = R.either(gt10, even);
 *      f(101); //=> true
 *      f(8); //=> true
 *
 *      R.either(Maybe.Just(false), Maybe.Just(55)); // => Maybe.Just(55)
 *      R.either([false, false, 'a'], [11]) // => [11, 11, "a"]
 */


var either =
/*#__PURE__*/
_curry2(function either(f, g) {
  return _isFunction(f) ? function _either() {
    return f.apply(this, arguments) || g.apply(this, arguments);
  } : lift(or)(f, g);
});

module.exports = either;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var _isArguments =
/*#__PURE__*/
require("./internal/_isArguments.js");

var _isArray =
/*#__PURE__*/
require("./internal/_isArray.js");

var _isObject =
/*#__PURE__*/
require("./internal/_isObject.js");

var _isString =
/*#__PURE__*/
require("./internal/_isString.js");

var _isTypedArray =
/*#__PURE__*/
require("./internal/_isTypedArray.js");
/**
 * Returns the empty value of its argument's type. Ramda defines the empty
 * value of Array (`[]`), Object (`{}`), String (`''`),
 * TypedArray (`Uint8Array []`, `Float32Array []`, etc), and Arguments. Other
 * types are supported if they define `<Type>.empty`,
 * `<Type>.prototype.empty` or implement the
 * [FantasyLand Monoid spec](https://github.com/fantasyland/fantasy-land#monoid).
 *
 * Dispatches to the `empty` method of the first argument, if present.
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category Function
 * @sig a -> a
 * @param {*} x
 * @return {*}
 * @example
 *
 *      R.empty(Just(42));               //=> Nothing()
 *      R.empty([1, 2, 3]);              //=> []
 *      R.empty('unicorns');             //=> ''
 *      R.empty({x: 1, y: 2});           //=> {}
 *      R.empty(Uint8Array.from('123')); //=> Uint8Array []
 */


var empty =
/*#__PURE__*/
_curry1(function empty(x) {
  return x != null && typeof x['fantasy-land/empty'] === 'function' ? x['fantasy-land/empty']() : x != null && x.constructor != null && typeof x.constructor['fantasy-land/empty'] === 'function' ? x.constructor['fantasy-land/empty']() : x != null && typeof x.empty === 'function' ? x.empty() : x != null && x.constructor != null && typeof x.constructor.empty === 'function' ? x.constructor.empty() : _isArray(x) ? [] : _isString(x) ? '' : _isObject(x) ? {} : _isArguments(x) ? function () {
    return arguments;
  }() : _isTypedArray(x) ? x.constructor.from('') : void 0 // else
  ;
});

module.exports = empty;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var equals =
/*#__PURE__*/
require("./equals.js");

var takeLast =
/*#__PURE__*/
require("./takeLast.js");
/**
 * Checks if a list ends with the provided sublist.
 *
 * Similarly, checks if a string ends with the provided substring.
 *
 * @func
 * @memberOf R
 * @since v0.24.0
 * @category List
 * @sig [a] -> [a] -> Boolean
 * @sig String -> String -> Boolean
 * @param {*} suffix
 * @param {*} list
 * @return {Boolean}
 * @see R.startsWith
 * @example
 *
 *      R.endsWith('c', 'abc')                //=> true
 *      R.endsWith('b', 'abc')                //=> false
 *      R.endsWith(['c'], ['a', 'b', 'c'])    //=> true
 *      R.endsWith(['b'], ['a', 'b', 'c'])    //=> false
 */


var endsWith =
/*#__PURE__*/
_curry2(function (suffix, list) {
  return equals(takeLast(suffix.length, list), suffix);
});

module.exports = endsWith;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");

var equals =
/*#__PURE__*/
require("./equals.js");
/**
 * Takes a function and two values in its domain and returns `true` if the
 * values map to the same value in the codomain; `false` otherwise.
 *
 * @func
 * @memberOf R
 * @since v0.18.0
 * @category Relation
 * @sig (a -> b) -> a -> a -> Boolean
 * @param {Function} f
 * @param {*} x
 * @param {*} y
 * @return {Boolean}
 * @example
 *
 *      R.eqBy(Math.abs, 5, -5); //=> true
 */


var eqBy =
/*#__PURE__*/
_curry3(function eqBy(f, x, y) {
  return equals(f(x), f(y));
});

module.exports = eqBy;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");

var equals =
/*#__PURE__*/
require("./equals.js");
/**
 * Reports whether two objects have the same value, in [`R.equals`](#equals)
 * terms, for the specified property. Useful as a curried predicate.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @sig k -> {k: v} -> {k: v} -> Boolean
 * @param {String} prop The name of the property to compare
 * @param {Object} obj1
 * @param {Object} obj2
 * @return {Boolean}
 *
 * @example
 *
 *      const o1 = { a: 1, b: 2, c: 3, d: 4 };
 *      const o2 = { a: 10, b: 20, c: 3, d: 40 };
 *      R.eqProps('a', o1, o2); //=> false
 *      R.eqProps('c', o1, o2); //=> true
 */


var eqProps =
/*#__PURE__*/
_curry3(function eqProps(prop, obj1, obj2) {
  return equals(obj1[prop], obj2[prop]);
});

module.exports = eqProps;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _equals =
/*#__PURE__*/
require("./internal/_equals.js");
/**
 * Returns `true` if its arguments are equivalent, `false` otherwise. Handles
 * cyclical data structures.
 *
 * Dispatches symmetrically to the `equals` methods of both arguments, if
 * present.
 *
 * @func
 * @memberOf R
 * @since v0.15.0
 * @category Relation
 * @sig a -> b -> Boolean
 * @param {*} a
 * @param {*} b
 * @return {Boolean}
 * @example
 *
 *      R.equals(1, 1); //=> true
 *      R.equals(1, '1'); //=> false
 *      R.equals([1, 2, 3], [1, 2, 3]); //=> true
 *
 *      const a = {}; a.v = a;
 *      const b = {}; b.v = b;
 *      R.equals(a, b); //=> true
 */


var equals =
/*#__PURE__*/
_curry2(function equals(a, b) {
  return _equals(a, b, [], []);
});

module.exports = equals;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _isArray =
/*#__PURE__*/
require("./internal/_isArray.js");

var _isObject =
/*#__PURE__*/
require("./internal/_isObject.js");
/**
 * Creates a new object by recursively evolving a shallow copy of `object`,
 * according to the `transformation` functions. All non-primitive properties
 * are copied by reference.
 *
 * A `transformation` function will not be invoked if its corresponding key
 * does not exist in the evolved object.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Object
 * @sig {k: (v -> v)} -> {k: v} -> {k: v}
 * @param {Object} transformations The object specifying transformation functions to apply
 *        to the object.
 * @param {Object} object The object to be transformed.
 * @return {Object} The transformed object.
 * @example
 *
 *      const tomato = {firstName: '  Tomato ', data: {elapsed: 100, remaining: 1400}, id:123};
 *      const transformations = {
 *        firstName: R.trim,
 *        lastName: R.trim, // Will not get invoked.
 *        data: {elapsed: R.add(1), remaining: R.add(-1)}
 *      };
 *      R.evolve(transformations, tomato); //=> {firstName: 'Tomato', data: {elapsed: 101, remaining: 1399}, id:123}
 */


var evolve =
/*#__PURE__*/
_curry2(function evolve(transformations, object) {
  if (!_isObject(object) && !_isArray(object)) {
    return object;
  }

  var result = object instanceof Array ? [] : {};
  var transformation, key, type;

  for (key in object) {
    transformation = transformations[key];
    type = typeof transformation;
    result[key] = type === 'function' ? transformation(object[key]) : transformation && type === 'object' ? evolve(transformation, object[key]) : object[key];
  }

  return result;
});

module.exports = evolve;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _dispatchable =
/*#__PURE__*/
require("./internal/_dispatchable.js");

var _filter =
/*#__PURE__*/
require("./internal/_filter.js");

var _isObject =
/*#__PURE__*/
require("./internal/_isObject.js");

var _reduce =
/*#__PURE__*/
require("./internal/_reduce.js");

var _xfilter =
/*#__PURE__*/
require("./internal/_xfilter.js");

var keys =
/*#__PURE__*/
require("./keys.js");
/**
 * Takes a predicate and a `Filterable`, and returns a new filterable of the
 * same type containing the members of the given filterable which satisfy the
 * given predicate. Filterable objects include plain objects or any object
 * that has a filter method such as `Array`.
 *
 * Dispatches to the `filter` method of the second argument, if present.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig Filterable f => (a -> Boolean) -> f a -> f a
 * @param {Function} pred
 * @param {Array} filterable
 * @return {Array} Filterable
 * @see R.reject, R.transduce, R.addIndex
 * @example
 *
 *      const isEven = n => n % 2 === 0;
 *
 *      R.filter(isEven, [1, 2, 3, 4]); //=> [2, 4]
 *
 *      R.filter(isEven, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4}
 */


var filter =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable(['fantasy-land/filter', 'filter'], _xfilter, function (pred, filterable) {
  return _isObject(filterable) ? _reduce(function (acc, key) {
    if (pred(filterable[key])) {
      acc[key] = filterable[key];
    }

    return acc;
  }, {}, keys(filterable)) : // else
  _filter(pred, filterable);
}));

module.exports = filter;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _dispatchable =
/*#__PURE__*/
require("./internal/_dispatchable.js");

var _xfind =
/*#__PURE__*/
require("./internal/_xfind.js");
/**
 * Returns the first element of the list which matches the predicate, or
 * `undefined` if no element matches.
 *
 * Dispatches to the `find` method of the second argument, if present.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> a | undefined
 * @param {Function} fn The predicate function used to determine if the element is the
 *        desired one.
 * @param {Array} list The array to consider.
 * @return {Object} The element found, or `undefined`.
 * @see R.transduce
 * @example
 *
 *      const xs = [{a: 1}, {a: 2}, {a: 3}];
 *      R.find(R.propEq('a', 2))(xs); //=> {a: 2}
 *      R.find(R.propEq('a', 4))(xs); //=> undefined
 */


var find =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable(['find'], _xfind, function find(fn, list) {
  var idx = 0;
  var len = list.length;

  while (idx < len) {
    if (fn(list[idx])) {
      return list[idx];
    }

    idx += 1;
  }
}));

module.exports = find;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _dispatchable =
/*#__PURE__*/
require("./internal/_dispatchable.js");

var _xfindIndex =
/*#__PURE__*/
require("./internal/_xfindIndex.js");
/**
 * Returns the index of the first element of the list which matches the
 * predicate, or `-1` if no element matches.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.1
 * @category List
 * @sig (a -> Boolean) -> [a] -> Number
 * @param {Function} fn The predicate function used to determine if the element is the
 * desired one.
 * @param {Array} list The array to consider.
 * @return {Number} The index of the element found, or `-1`.
 * @see R.transduce, R.indexOf
 * @example
 *
 *      const xs = [{a: 1}, {a: 2}, {a: 3}];
 *      R.findIndex(R.propEq('a', 2))(xs); //=> 1
 *      R.findIndex(R.propEq('a', 4))(xs); //=> -1
 */


var findIndex =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable([], _xfindIndex, function findIndex(fn, list) {
  var idx = 0;
  var len = list.length;

  while (idx < len) {
    if (fn(list[idx])) {
      return idx;
    }

    idx += 1;
  }

  return -1;
}));

module.exports = findIndex;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _dispatchable =
/*#__PURE__*/
require("./internal/_dispatchable.js");

var _xfindLast =
/*#__PURE__*/
require("./internal/_xfindLast.js");
/**
 * Returns the last element of the list which matches the predicate, or
 * `undefined` if no element matches.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.1
 * @category List
 * @sig (a -> Boolean) -> [a] -> a | undefined
 * @param {Function} fn The predicate function used to determine if the element is the
 * desired one.
 * @param {Array} list The array to consider.
 * @return {Object} The element found, or `undefined`.
 * @see R.transduce
 * @example
 *
 *      const xs = [{a: 1, b: 0}, {a:1, b: 1}];
 *      R.findLast(R.propEq('a', 1))(xs); //=> {a: 1, b: 1}
 *      R.findLast(R.propEq('a', 4))(xs); //=> undefined
 */


var findLast =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable([], _xfindLast, function findLast(fn, list) {
  var idx = list.length - 1;

  while (idx >= 0) {
    if (fn(list[idx])) {
      return list[idx];
    }

    idx -= 1;
  }
}));

module.exports = findLast;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _dispatchable =
/*#__PURE__*/
require("./internal/_dispatchable.js");

var _xfindLastIndex =
/*#__PURE__*/
require("./internal/_xfindLastIndex.js");
/**
 * Returns the index of the last element of the list which matches the
 * predicate, or `-1` if no element matches.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.1
 * @category List
 * @sig (a -> Boolean) -> [a] -> Number
 * @param {Function} fn The predicate function used to determine if the element is the
 * desired one.
 * @param {Array} list The array to consider.
 * @return {Number} The index of the element found, or `-1`.
 * @see R.transduce, R.lastIndexOf
 * @example
 *
 *      const xs = [{a: 1, b: 0}, {a:1, b: 1}];
 *      R.findLastIndex(R.propEq('a', 1))(xs); //=> 1
 *      R.findLastIndex(R.propEq('a', 4))(xs); //=> -1
 */


var findLastIndex =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable([], _xfindLastIndex, function findLastIndex(fn, list) {
  var idx = list.length - 1;

  while (idx >= 0) {
    if (fn(list[idx])) {
      return idx;
    }

    idx -= 1;
  }

  return -1;
}));

module.exports = findLastIndex;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var _makeFlat =
/*#__PURE__*/
require("./internal/_makeFlat.js");
/**
 * Returns a new list by pulling every item out of it (and all its sub-arrays)
 * and putting them in a new array, depth-first.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig [a] -> [b]
 * @param {Array} list The array to consider.
 * @return {Array} The flattened list.
 * @see R.unnest
 * @example
 *
 *      R.flatten([1, 2, [3, 4], 5, [6, [7, 8, [9, [10, 11], 12]]]]);
 *      //=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
 */


var flatten =
/*#__PURE__*/
_curry1(
/*#__PURE__*/
_makeFlat(true));

module.exports = flatten;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var curryN =
/*#__PURE__*/
require("./curryN.js");
/**
 * Returns a new function much like the supplied one, except that the first two
 * arguments' order is reversed.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig ((a, b, c, ...) -> z) -> (b -> a -> c -> ... -> z)
 * @param {Function} fn The function to invoke with its first two parameters reversed.
 * @return {*} The result of invoking `fn` with its first two parameters' order reversed.
 * @example
 *
 *      const mergeThree = (a, b, c) => [].concat(a, b, c);
 *
 *      mergeThree(1, 2, 3); //=> [1, 2, 3]
 *
 *      R.flip(mergeThree)(1, 2, 3); //=> [2, 1, 3]
 * @symb R.flip(f)(a, b, c) = f(b, a, c)
 */


var flip =
/*#__PURE__*/
_curry1(function flip(fn) {
  return curryN(fn.length, function (a, b) {
    var args = Array.prototype.slice.call(arguments, 0);
    args[0] = b;
    args[1] = a;
    return fn.apply(this, args);
  });
});

module.exports = flip;var _checkForMethod =
/*#__PURE__*/
require("./internal/_checkForMethod.js");

var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Iterate over an input `list`, calling a provided function `fn` for each
 * element in the list.
 *
 * `fn` receives one argument: *(value)*.
 *
 * Note: `R.forEach` does not skip deleted or unassigned indices (sparse
 * arrays), unlike the native `Array.prototype.forEach` method. For more
 * details on this behavior, see:
 * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Description
 *
 * Also note that, unlike `Array.prototype.forEach`, Ramda's `forEach` returns
 * the original array. In some libraries this function is named `each`.
 *
 * Dispatches to the `forEach` method of the second argument, if present.
 *
 * @func
 * @memberOf R
 * @since v0.1.1
 * @category List
 * @sig (a -> *) -> [a] -> [a]
 * @param {Function} fn The function to invoke. Receives one argument, `value`.
 * @param {Array} list The list to iterate over.
 * @return {Array} The original list.
 * @see R.addIndex
 * @example
 *
 *      const printXPlusFive = x => console.log(x + 5);
 *      R.forEach(printXPlusFive, [1, 2, 3]); //=> [1, 2, 3]
 *      // logs 6
 *      // logs 7
 *      // logs 8
 * @symb R.forEach(f, [a, b, c]) = [a, b, c]
 */


var forEach =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_checkForMethod('forEach', function forEach(fn, list) {
  var len = list.length;
  var idx = 0;

  while (idx < len) {
    fn(list[idx]);
    idx += 1;
  }

  return list;
}));

module.exports = forEach;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var keys =
/*#__PURE__*/
require("./keys.js");
/**
 * Iterate over an input `object`, calling a provided function `fn` for each
 * key and value in the object.
 *
 * `fn` receives three argument: *(value, key, obj)*.
 *
 * @func
 * @memberOf R
 * @since v0.23.0
 * @category Object
 * @sig ((a, String, StrMap a) -> Any) -> StrMap a -> StrMap a
 * @param {Function} fn The function to invoke. Receives three argument, `value`, `key`, `obj`.
 * @param {Object} obj The object to iterate over.
 * @return {Object} The original object.
 * @example
 *
 *      const printKeyConcatValue = (value, key) => console.log(key + ':' + value);
 *      R.forEachObjIndexed(printKeyConcatValue, {x: 1, y: 2}); //=> {x: 1, y: 2}
 *      // logs x:1
 *      // logs y:2
 * @symb R.forEachObjIndexed(f, {x: a, y: b}) = {x: a, y: b}
 */


var forEachObjIndexed =
/*#__PURE__*/
_curry2(function forEachObjIndexed(fn, obj) {
  var keyList = keys(obj);
  var idx = 0;

  while (idx < keyList.length) {
    var key = keyList[idx];
    fn(obj[key], key, obj);
    idx += 1;
  }

  return obj;
});

module.exports = forEachObjIndexed;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");
/**
 * Creates a new object from a list key-value pairs. If a key appears in
 * multiple pairs, the rightmost pair is included in the object.
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category List
 * @sig [[k,v]] -> {k: v}
 * @param {Array} pairs An array of two-element arrays that will be the keys and values of the output object.
 * @return {Object} The object made by pairing up `keys` and `values`.
 * @see R.toPairs, R.pair
 * @example
 *
 *      R.fromPairs([['a', 1], ['b', 2], ['c', 3]]); //=> {a: 1, b: 2, c: 3}
 */


var fromPairs =
/*#__PURE__*/
_curry1(function fromPairs(pairs) {
  var result = {};
  var idx = 0;

  while (idx < pairs.length) {
    result[pairs[idx][0]] = pairs[idx][1];
    idx += 1;
  }

  return result;
});

module.exports = fromPairs;var _checkForMethod =
/*#__PURE__*/
require("./internal/_checkForMethod.js");

var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var reduceBy =
/*#__PURE__*/
require("./reduceBy.js");
/**
 * Splits a list into sub-lists stored in an object, based on the result of
 * calling a key-returning function on each element, and grouping the
 * results according to values returned.
 *
 * Dispatches to the `groupBy` method of the second argument, if present.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @typedefn Idx = String | Int | Symbol
 * @sig Idx a => (b -> a) -> [b] -> {a: [b]}
 * @param {Function} fn Function :: a -> Idx
 * @param {Array} list The array to group
 * @return {Object} An object with the output of `fn` for keys, mapped to arrays of elements
 *         that produced that key when passed to `fn`.
 * @see R.reduceBy, R.transduce, R.indexBy
 * @example
 *
 *      const byGrade = R.groupBy(function(student) {
 *        const score = student.score;
 *        return score < 65 ? 'F' :
 *               score < 70 ? 'D' :
 *               score < 80 ? 'C' :
 *               score < 90 ? 'B' : 'A';
 *      });
 *      const students = [{name: 'Abby', score: 84},
 *                      {name: 'Eddy', score: 58},
 *                      // ...
 *                      {name: 'Jack', score: 69}];
 *      byGrade(students);
 *      // {
 *      //   'A': [{name: 'Dianne', score: 99}],
 *      //   'B': [{name: 'Abby', score: 84}]
 *      //   // ...,
 *      //   'F': [{name: 'Eddy', score: 58}]
 *      // }
 */


var groupBy =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_checkForMethod('groupBy',
/*#__PURE__*/
reduceBy(function (acc, item) {
  acc.push(item);
  return acc;
}, [])));

module.exports = groupBy;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Takes a list and returns a list of lists where each sublist's elements are
 * all satisfied pairwise comparison according to the provided function.
 * Only adjacent elements are passed to the comparison function.
 *
 * @func
 * @memberOf R
 * @since v0.21.0
 * @category List
 * @sig ((a, a) → Boolean) → [a] → [[a]]
 * @param {Function} fn Function for determining whether two given (adjacent)
 *        elements should be in the same group
 * @param {Array} list The array to group. Also accepts a string, which will be
 *        treated as a list of characters.
 * @return {List} A list that contains sublists of elements,
 *         whose concatenations are equal to the original list.
 * @example
 *
 * R.groupWith(R.equals, [0, 1, 1, 2, 3, 5, 8, 13, 21])
 * //=> [[0], [1, 1], [2], [3], [5], [8], [13], [21]]
 *
 * R.groupWith((a, b) => a + 1 === b, [0, 1, 1, 2, 3, 5, 8, 13, 21])
 * //=> [[0, 1], [1, 2, 3], [5], [8], [13], [21]]
 *
 * R.groupWith((a, b) => a % 2 === b % 2, [0, 1, 1, 2, 3, 5, 8, 13, 21])
 * //=> [[0], [1, 1], [2], [3, 5], [8], [13, 21]]
 *
 * const isVowel = R.test(/^[aeiou]$/i);
 * R.groupWith(R.eqBy(isVowel), 'aestiou')
 * //=> ['ae', 'st', 'iou']
 */


var groupWith =
/*#__PURE__*/
_curry2(function (fn, list) {
  var res = [];
  var idx = 0;
  var len = list.length;

  while (idx < len) {
    var nextidx = idx + 1;

    while (nextidx < len && fn(list[nextidx - 1], list[nextidx])) {
      nextidx += 1;
    }

    res.push(list.slice(idx, nextidx));
    idx = nextidx;
  }

  return res;
});

module.exports = groupWith;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Returns `true` if the first argument is greater than the second; `false`
 * otherwise.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig Ord a => a -> a -> Boolean
 * @param {*} a
 * @param {*} b
 * @return {Boolean}
 * @see R.lt
 * @example
 *
 *      R.gt(2, 1); //=> true
 *      R.gt(2, 2); //=> false
 *      R.gt(2, 3); //=> false
 *      R.gt('a', 'z'); //=> false
 *      R.gt('z', 'a'); //=> true
 */


var gt =
/*#__PURE__*/
_curry2(function gt(a, b) {
  return a > b;
});

module.exports = gt;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Returns `true` if the first argument is greater than or equal to the second;
 * `false` otherwise.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig Ord a => a -> a -> Boolean
 * @param {Number} a
 * @param {Number} b
 * @return {Boolean}
 * @see R.lte
 * @example
 *
 *      R.gte(2, 1); //=> true
 *      R.gte(2, 2); //=> true
 *      R.gte(2, 3); //=> false
 *      R.gte('a', 'z'); //=> false
 *      R.gte('z', 'a'); //=> true
 */


var gte =
/*#__PURE__*/
_curry2(function gte(a, b) {
  return a >= b;
});

module.exports = gte;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var hasPath =
/*#__PURE__*/
require("./hasPath.js");
/**
 * Returns whether or not an object has an own property with the specified name
 *
 * @func
 * @memberOf R
 * @since v0.7.0
 * @category Object
 * @sig s -> {s: x} -> Boolean
 * @param {String} prop The name of the property to check for.
 * @param {Object} obj The object to query.
 * @return {Boolean} Whether the property exists.
 * @example
 *
 *      const hasName = R.has('name');
 *      hasName({name: 'alice'});   //=> true
 *      hasName({name: 'bob'});     //=> true
 *      hasName({});                //=> false
 *
 *      const point = {x: 0, y: 0};
 *      const pointHas = R.has(R.__, point);
 *      pointHas('x');  //=> true
 *      pointHas('y');  //=> true
 *      pointHas('z');  //=> false
 */


var has =
/*#__PURE__*/
_curry2(function has(prop, obj) {
  return hasPath([prop], obj);
});

module.exports = has;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var isNil =
/*#__PURE__*/
require("./isNil.js");
/**
 * Returns whether or not an object or its prototype chain has a property with
 * the specified name
 *
 * @func
 * @memberOf R
 * @since v0.7.0
 * @category Object
 * @sig s -> {s: x} -> Boolean
 * @param {String} prop The name of the property to check for.
 * @param {Object} obj The object to query.
 * @return {Boolean} Whether the property exists.
 * @example
 *
 *      function Rectangle(width, height) {
 *        this.width = width;
 *        this.height = height;
 *      }
 *      Rectangle.prototype.area = function() {
 *        return this.width * this.height;
 *      };
 *
 *      const square = new Rectangle(2, 2);
 *      R.hasIn('width', square);  //=> true
 *      R.hasIn('area', square);  //=> true
 */


var hasIn =
/*#__PURE__*/
_curry2(function hasIn(prop, obj) {
  if (isNil(obj)) {
    return false;
  }

  return prop in obj;
});

module.exports = hasIn;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _has =
/*#__PURE__*/
require("./internal/_has.js");

var isNil =
/*#__PURE__*/
require("./isNil.js");
/**
 * Returns whether or not a path exists in an object. Only the object's
 * own properties are checked.
 *
 * @func
 * @memberOf R
 * @since v0.26.0
 * @category Object
 * @typedefn Idx = String | Int | Symbol
 * @sig [Idx] -> {a} -> Boolean
 * @param {Array} path The path to use.
 * @param {Object} obj The object to check the path in.
 * @return {Boolean} Whether the path exists.
 * @see R.has
 * @example
 *
 *      R.hasPath(['a', 'b'], {a: {b: 2}});         // => true
 *      R.hasPath(['a', 'b'], {a: {b: undefined}}); // => true
 *      R.hasPath(['a', 'b'], {a: {c: 2}});         // => false
 *      R.hasPath(['a', 'b'], {});                  // => false
 */


var hasPath =
/*#__PURE__*/
_curry2(function hasPath(_path, obj) {
  if (_path.length === 0 || isNil(obj)) {
    return false;
  }

  var val = obj;
  var idx = 0;

  while (idx < _path.length) {
    if (!isNil(val) && _has(_path[idx], val)) {
      val = val[_path[idx]];
      idx += 1;
    } else {
      return false;
    }
  }

  return true;
});

module.exports = hasPath;var nth =
/*#__PURE__*/
require("./nth.js");
/**
 * Returns the first element of the given list or string. In some libraries
 * this function is named `first`.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig [a] -> a | Undefined
 * @sig String -> String
 * @param {Array|String} list
 * @return {*}
 * @see R.tail, R.init, R.last
 * @example
 *
 *      R.head(['fi', 'fo', 'fum']); //=> 'fi'
 *      R.head([]); //=> undefined
 *
 *      R.head('abc'); //=> 'a'
 *      R.head(''); //=> ''
 */


var head =
/*#__PURE__*/
nth(0);
module.exports = head;var _objectIs =
/*#__PURE__*/
require("./internal/_objectIs.js");

var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Returns true if its arguments are identical, false otherwise. Values are
 * identical if they reference the same memory. `NaN` is identical to `NaN`;
 * `0` and `-0` are not identical.
 *
 * Note this is merely a curried version of ES6 `Object.is`.
 *
 * @func
 * @memberOf R
 * @since v0.15.0
 * @category Relation
 * @sig a -> a -> Boolean
 * @param {*} a
 * @param {*} b
 * @return {Boolean}
 * @example
 *
 *      const o = {};
 *      R.identical(o, o); //=> true
 *      R.identical(1, 1); //=> true
 *      R.identical(1, '1'); //=> false
 *      R.identical([], []); //=> false
 *      R.identical(0, -0); //=> false
 *      R.identical(NaN, NaN); //=> true
 */


var identical =
/*#__PURE__*/
_curry2(_objectIs);

module.exports = identical;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var _identity =
/*#__PURE__*/
require("./internal/_identity.js");
/**
 * A function that does nothing but return the parameter supplied to it. Good
 * as a default or placeholder function.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig a -> a
 * @param {*} x The value to return.
 * @return {*} The input value, `x`.
 * @example
 *
 *      R.identity(1); //=> 1
 *
 *      const obj = {};
 *      R.identity(obj) === obj; //=> true
 * @symb R.identity(a) = a
 */


var identity =
/*#__PURE__*/
_curry1(_identity);

module.exports = identity;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");

var curryN =
/*#__PURE__*/
require("./curryN.js");
/**
 * Creates a function that will process either the `onTrue` or the `onFalse`
 * function depending upon the result of the `condition` predicate.
 *
 * @func
 * @memberOf R
 * @since v0.8.0
 * @category Logic
 * @sig (*... -> Boolean) -> (*... -> *) -> (*... -> *) -> (*... -> *)
 * @param {Function} condition A predicate function
 * @param {Function} onTrue A function to invoke when the `condition` evaluates to a truthy value.
 * @param {Function} onFalse A function to invoke when the `condition` evaluates to a falsy value.
 * @return {Function} A new function that will process either the `onTrue` or the `onFalse`
 *                    function depending upon the result of the `condition` predicate.
 * @see R.unless, R.when, R.cond
 * @example
 *
 *      const incCount = R.ifElse(
 *        R.has('count'),
 *        R.over(R.lensProp('count'), R.inc),
 *        R.assoc('count', 1)
 *      );
 *      incCount({ count: 1 }); //=> { count: 2 }
 *      incCount({});           //=> { count: 1 }
 */


var ifElse =
/*#__PURE__*/
_curry3(function ifElse(condition, onTrue, onFalse) {
  return curryN(Math.max(condition.length, onTrue.length, onFalse.length), function _ifElse() {
    return condition.apply(this, arguments) ? onTrue.apply(this, arguments) : onFalse.apply(this, arguments);
  });
});

module.exports = ifElse;var add =
/*#__PURE__*/
require("./add.js");
/**
 * Increments its argument.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Math
 * @sig Number -> Number
 * @param {Number} n
 * @return {Number} n + 1
 * @see R.dec
 * @example
 *
 *      R.inc(42); //=> 43
 */


var inc =
/*#__PURE__*/
add(1);
module.exports = inc;var _includes =
/*#__PURE__*/
require("./internal/_includes.js");

var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Returns `true` if the specified value is equal, in [`R.equals`](#equals)
 * terms, to at least one element of the given list; `false` otherwise.
 * Also works with strings.
 *
 * @func
 * @memberOf R
 * @since v0.26.0
 * @category List
 * @sig a -> [a] -> Boolean
 * @param {Object} a The item to compare against.
 * @param {Array} list The array to consider.
 * @return {Boolean} `true` if an equivalent item is in the list, `false` otherwise.
 * @see R.any
 * @example
 *
 *      R.includes(3, [1, 2, 3]); //=> true
 *      R.includes(4, [1, 2, 3]); //=> false
 *      R.includes({ name: 'Fred' }, [{ name: 'Fred' }]); //=> true
 *      R.includes([42], [[42]]); //=> true
 *      R.includes('ba', 'banana'); //=>true
 */


var includes =
/*#__PURE__*/
_curry2(_includes);

module.exports = includes;module.exports = {};
module.exports.F =
/*#__PURE__*/
require("./F.js");
module.exports.T =
/*#__PURE__*/
require("./T.js");
module.exports.__ =
/*#__PURE__*/
require("./__.js");
module.exports.add =
/*#__PURE__*/
require("./add.js");
module.exports.addIndex =
/*#__PURE__*/
require("./addIndex.js");
module.exports.adjust =
/*#__PURE__*/
require("./adjust.js");
module.exports.all =
/*#__PURE__*/
require("./all.js");
module.exports.allPass =
/*#__PURE__*/
require("./allPass.js");
module.exports.always =
/*#__PURE__*/
require("./always.js");
module.exports.and =
/*#__PURE__*/
require("./and.js");
module.exports.any =
/*#__PURE__*/
require("./any.js");
module.exports.anyPass =
/*#__PURE__*/
require("./anyPass.js");
module.exports.ap =
/*#__PURE__*/
require("./ap.js");
module.exports.aperture =
/*#__PURE__*/
require("./aperture.js");
module.exports.append =
/*#__PURE__*/
require("./append.js");
module.exports.apply =
/*#__PURE__*/
require("./apply.js");
module.exports.applySpec =
/*#__PURE__*/
require("./applySpec.js");
module.exports.applyTo =
/*#__PURE__*/
require("./applyTo.js");
module.exports.ascend =
/*#__PURE__*/
require("./ascend.js");
module.exports.assoc =
/*#__PURE__*/
require("./assoc.js");
module.exports.assocPath =
/*#__PURE__*/
require("./assocPath.js");
module.exports.binary =
/*#__PURE__*/
require("./binary.js");
module.exports.bind =
/*#__PURE__*/
require("./bind.js");
module.exports.both =
/*#__PURE__*/
require("./both.js");
module.exports.call =
/*#__PURE__*/
require("./call.js");
module.exports.chain =
/*#__PURE__*/
require("./chain.js");
module.exports.clamp =
/*#__PURE__*/
require("./clamp.js");
module.exports.clone =
/*#__PURE__*/
require("./clone.js");
module.exports.collectBy =
/*#__PURE__*/
require("./collectBy.js");
module.exports.comparator =
/*#__PURE__*/
require("./comparator.js");
module.exports.complement =
/*#__PURE__*/
require("./complement.js");
module.exports.compose =
/*#__PURE__*/
require("./compose.js");
module.exports.composeWith =
/*#__PURE__*/
require("./composeWith.js");
module.exports.concat =
/*#__PURE__*/
require("./concat.js");
module.exports.cond =
/*#__PURE__*/
require("./cond.js");
module.exports.construct =
/*#__PURE__*/
require("./construct.js");
module.exports.constructN =
/*#__PURE__*/
require("./constructN.js");
module.exports.converge =
/*#__PURE__*/
require("./converge.js");
module.exports.count =
/*#__PURE__*/
require("./count.js");
module.exports.countBy =
/*#__PURE__*/
require("./countBy.js");
module.exports.curry =
/*#__PURE__*/
require("./curry.js");
module.exports.curryN =
/*#__PURE__*/
require("./curryN.js");
module.exports.dec =
/*#__PURE__*/
require("./dec.js");
module.exports.defaultTo =
/*#__PURE__*/
require("./defaultTo.js");
module.exports.descend =
/*#__PURE__*/
require("./descend.js");
module.exports.difference =
/*#__PURE__*/
require("./difference.js");
module.exports.differenceWith =
/*#__PURE__*/
require("./differenceWith.js");
module.exports.dissoc =
/*#__PURE__*/
require("./dissoc.js");
module.exports.dissocPath =
/*#__PURE__*/
require("./dissocPath.js");
module.exports.divide =
/*#__PURE__*/
require("./divide.js");
module.exports.drop =
/*#__PURE__*/
require("./drop.js");
module.exports.dropLast =
/*#__PURE__*/
require("./dropLast.js");
module.exports.dropLastWhile =
/*#__PURE__*/
require("./dropLastWhile.js");
module.exports.dropRepeats =
/*#__PURE__*/
require("./dropRepeats.js");
module.exports.dropRepeatsWith =
/*#__PURE__*/
require("./dropRepeatsWith.js");
module.exports.dropWhile =
/*#__PURE__*/
require("./dropWhile.js");
module.exports.either =
/*#__PURE__*/
require("./either.js");
module.exports.empty =
/*#__PURE__*/
require("./empty.js");
module.exports.endsWith =
/*#__PURE__*/
require("./endsWith.js");
module.exports.eqBy =
/*#__PURE__*/
require("./eqBy.js");
module.exports.eqProps =
/*#__PURE__*/
require("./eqProps.js");
module.exports.equals =
/*#__PURE__*/
require("./equals.js");
module.exports.evolve =
/*#__PURE__*/
require("./evolve.js");
module.exports.filter =
/*#__PURE__*/
require("./filter.js");
module.exports.find =
/*#__PURE__*/
require("./find.js");
module.exports.findIndex =
/*#__PURE__*/
require("./findIndex.js");
module.exports.findLast =
/*#__PURE__*/
require("./findLast.js");
module.exports.findLastIndex =
/*#__PURE__*/
require("./findLastIndex.js");
module.exports.flatten =
/*#__PURE__*/
require("./flatten.js");
module.exports.flip =
/*#__PURE__*/
require("./flip.js");
module.exports.forEach =
/*#__PURE__*/
require("./forEach.js");
module.exports.forEachObjIndexed =
/*#__PURE__*/
require("./forEachObjIndexed.js");
module.exports.fromPairs =
/*#__PURE__*/
require("./fromPairs.js");
module.exports.groupBy =
/*#__PURE__*/
require("./groupBy.js");
module.exports.groupWith =
/*#__PURE__*/
require("./groupWith.js");
module.exports.gt =
/*#__PURE__*/
require("./gt.js");
module.exports.gte =
/*#__PURE__*/
require("./gte.js");
module.exports.has =
/*#__PURE__*/
require("./has.js");
module.exports.hasIn =
/*#__PURE__*/
require("./hasIn.js");
module.exports.hasPath =
/*#__PURE__*/
require("./hasPath.js");
module.exports.head =
/*#__PURE__*/
require("./head.js");
module.exports.identical =
/*#__PURE__*/
require("./identical.js");
module.exports.identity =
/*#__PURE__*/
require("./identity.js");
module.exports.ifElse =
/*#__PURE__*/
require("./ifElse.js");
module.exports.inc =
/*#__PURE__*/
require("./inc.js");
module.exports.includes =
/*#__PURE__*/
require("./includes.js");
module.exports.indexBy =
/*#__PURE__*/
require("./indexBy.js");
module.exports.indexOf =
/*#__PURE__*/
require("./indexOf.js");
module.exports.init =
/*#__PURE__*/
require("./init.js");
module.exports.innerJoin =
/*#__PURE__*/
require("./innerJoin.js");
module.exports.insert =
/*#__PURE__*/
require("./insert.js");
module.exports.insertAll =
/*#__PURE__*/
require("./insertAll.js");
module.exports.intersection =
/*#__PURE__*/
require("./intersection.js");
module.exports.intersperse =
/*#__PURE__*/
require("./intersperse.js");
module.exports.into =
/*#__PURE__*/
require("./into.js");
module.exports.invert =
/*#__PURE__*/
require("./invert.js");
module.exports.invertObj =
/*#__PURE__*/
require("./invertObj.js");
module.exports.invoker =
/*#__PURE__*/
require("./invoker.js");
module.exports.is =
/*#__PURE__*/
require("./is.js");
module.exports.isEmpty =
/*#__PURE__*/
require("./isEmpty.js");
module.exports.isNil =
/*#__PURE__*/
require("./isNil.js");
module.exports.join =
/*#__PURE__*/
require("./join.js");
module.exports.juxt =
/*#__PURE__*/
require("./juxt.js");
module.exports.keys =
/*#__PURE__*/
require("./keys.js");
module.exports.keysIn =
/*#__PURE__*/
require("./keysIn.js");
module.exports.last =
/*#__PURE__*/
require("./last.js");
module.exports.lastIndexOf =
/*#__PURE__*/
require("./lastIndexOf.js");
module.exports.length =
/*#__PURE__*/
require("./length.js");
module.exports.lens =
/*#__PURE__*/
require("./lens.js");
module.exports.lensIndex =
/*#__PURE__*/
require("./lensIndex.js");
module.exports.lensPath =
/*#__PURE__*/
require("./lensPath.js");
module.exports.lensProp =
/*#__PURE__*/
require("./lensProp.js");
module.exports.lift =
/*#__PURE__*/
require("./lift.js");
module.exports.liftN =
/*#__PURE__*/
require("./liftN.js");
module.exports.lt =
/*#__PURE__*/
require("./lt.js");
module.exports.lte =
/*#__PURE__*/
require("./lte.js");
module.exports.map =
/*#__PURE__*/
require("./map.js");
module.exports.mapAccum =
/*#__PURE__*/
require("./mapAccum.js");
module.exports.mapAccumRight =
/*#__PURE__*/
require("./mapAccumRight.js");
module.exports.mapObjIndexed =
/*#__PURE__*/
require("./mapObjIndexed.js");
module.exports.match =
/*#__PURE__*/
require("./match.js");
module.exports.mathMod =
/*#__PURE__*/
require("./mathMod.js");
module.exports.max =
/*#__PURE__*/
require("./max.js");
module.exports.maxBy =
/*#__PURE__*/
require("./maxBy.js");
module.exports.mean =
/*#__PURE__*/
require("./mean.js");
module.exports.median =
/*#__PURE__*/
require("./median.js");
module.exports.memoizeWith =
/*#__PURE__*/
require("./memoizeWith.js");
module.exports.mergeAll =
/*#__PURE__*/
require("./mergeAll.js");
module.exports.mergeDeepLeft =
/*#__PURE__*/
require("./mergeDeepLeft.js");
module.exports.mergeDeepRight =
/*#__PURE__*/
require("./mergeDeepRight.js");
module.exports.mergeDeepWith =
/*#__PURE__*/
require("./mergeDeepWith.js");
module.exports.mergeDeepWithKey =
/*#__PURE__*/
require("./mergeDeepWithKey.js");
module.exports.mergeLeft =
/*#__PURE__*/
require("./mergeLeft.js");
module.exports.mergeRight =
/*#__PURE__*/
require("./mergeRight.js");
module.exports.mergeWith =
/*#__PURE__*/
require("./mergeWith.js");
module.exports.mergeWithKey =
/*#__PURE__*/
require("./mergeWithKey.js");
module.exports.min =
/*#__PURE__*/
require("./min.js");
module.exports.minBy =
/*#__PURE__*/
require("./minBy.js");
module.exports.modify =
/*#__PURE__*/
require("./modify.js");
module.exports.modifyPath =
/*#__PURE__*/
require("./modifyPath.js");
module.exports.modulo =
/*#__PURE__*/
require("./modulo.js");
module.exports.move =
/*#__PURE__*/
require("./move.js");
module.exports.multiply =
/*#__PURE__*/
require("./multiply.js");
module.exports.nAry =
/*#__PURE__*/
require("./nAry.js");
module.exports.partialObject =
/*#__PURE__*/
require("./partialObject.js");
module.exports.negate =
/*#__PURE__*/
require("./negate.js");
module.exports.none =
/*#__PURE__*/
require("./none.js");
module.exports.not =
/*#__PURE__*/
require("./not.js");
module.exports.nth =
/*#__PURE__*/
require("./nth.js");
module.exports.nthArg =
/*#__PURE__*/
require("./nthArg.js");
module.exports.o =
/*#__PURE__*/
require("./o.js");
module.exports.objOf =
/*#__PURE__*/
require("./objOf.js");
module.exports.of =
/*#__PURE__*/
require("./of.js");
module.exports.omit =
/*#__PURE__*/
require("./omit.js");
module.exports.on =
/*#__PURE__*/
require("./on.js");
module.exports.once =
/*#__PURE__*/
require("./once.js");
module.exports.or =
/*#__PURE__*/
require("./or.js");
module.exports.otherwise =
/*#__PURE__*/
require("./otherwise.js");
module.exports.over =
/*#__PURE__*/
require("./over.js");
module.exports.pair =
/*#__PURE__*/
require("./pair.js");
module.exports.partial =
/*#__PURE__*/
require("./partial.js");
module.exports.partialRight =
/*#__PURE__*/
require("./partialRight.js");
module.exports.partition =
/*#__PURE__*/
require("./partition.js");
module.exports.path =
/*#__PURE__*/
require("./path.js");
module.exports.paths =
/*#__PURE__*/
require("./paths.js");
module.exports.pathEq =
/*#__PURE__*/
require("./pathEq.js");
module.exports.pathOr =
/*#__PURE__*/
require("./pathOr.js");
module.exports.pathSatisfies =
/*#__PURE__*/
require("./pathSatisfies.js");
module.exports.pick =
/*#__PURE__*/
require("./pick.js");
module.exports.pickAll =
/*#__PURE__*/
require("./pickAll.js");
module.exports.pickBy =
/*#__PURE__*/
require("./pickBy.js");
module.exports.pipe =
/*#__PURE__*/
require("./pipe.js");
module.exports.pipeWith =
/*#__PURE__*/
require("./pipeWith.js");
module.exports.pluck =
/*#__PURE__*/
require("./pluck.js");
module.exports.prepend =
/*#__PURE__*/
require("./prepend.js");
module.exports.product =
/*#__PURE__*/
require("./product.js");
module.exports.project =
/*#__PURE__*/
require("./project.js");
module.exports.promap =
/*#__PURE__*/
require("./promap.js");
module.exports.prop =
/*#__PURE__*/
require("./prop.js");
module.exports.propEq =
/*#__PURE__*/
require("./propEq.js");
module.exports.propIs =
/*#__PURE__*/
require("./propIs.js");
module.exports.propOr =
/*#__PURE__*/
require("./propOr.js");
module.exports.propSatisfies =
/*#__PURE__*/
require("./propSatisfies.js");
module.exports.props =
/*#__PURE__*/
require("./props.js");
module.exports.range =
/*#__PURE__*/
require("./range.js");
module.exports.reduce =
/*#__PURE__*/
require("./reduce.js");
module.exports.reduceBy =
/*#__PURE__*/
require("./reduceBy.js");
module.exports.reduceRight =
/*#__PURE__*/
require("./reduceRight.js");
module.exports.reduceWhile =
/*#__PURE__*/
require("./reduceWhile.js");
module.exports.reduced =
/*#__PURE__*/
require("./reduced.js");
module.exports.reject =
/*#__PURE__*/
require("./reject.js");
module.exports.remove =
/*#__PURE__*/
require("./remove.js");
module.exports.repeat =
/*#__PURE__*/
require("./repeat.js");
module.exports.replace =
/*#__PURE__*/
require("./replace.js");
module.exports.reverse =
/*#__PURE__*/
require("./reverse.js");
module.exports.scan =
/*#__PURE__*/
require("./scan.js");
module.exports.sequence =
/*#__PURE__*/
require("./sequence.js");
module.exports.set =
/*#__PURE__*/
require("./set.js");
module.exports.slice =
/*#__PURE__*/
require("./slice.js");
module.exports.sort =
/*#__PURE__*/
require("./sort.js");
module.exports.sortBy =
/*#__PURE__*/
require("./sortBy.js");
module.exports.sortWith =
/*#__PURE__*/
require("./sortWith.js");
module.exports.split =
/*#__PURE__*/
require("./split.js");
module.exports.splitAt =
/*#__PURE__*/
require("./splitAt.js");
module.exports.splitEvery =
/*#__PURE__*/
require("./splitEvery.js");
module.exports.splitWhen =
/*#__PURE__*/
require("./splitWhen.js");
module.exports.splitWhenever =
/*#__PURE__*/
require("./splitWhenever.js");
module.exports.startsWith =
/*#__PURE__*/
require("./startsWith.js");
module.exports.subtract =
/*#__PURE__*/
require("./subtract.js");
module.exports.sum =
/*#__PURE__*/
require("./sum.js");
module.exports.symmetricDifference =
/*#__PURE__*/
require("./symmetricDifference.js");
module.exports.symmetricDifferenceWith =
/*#__PURE__*/
require("./symmetricDifferenceWith.js");
module.exports.tail =
/*#__PURE__*/
require("./tail.js");
module.exports.take =
/*#__PURE__*/
require("./take.js");
module.exports.takeLast =
/*#__PURE__*/
require("./takeLast.js");
module.exports.takeLastWhile =
/*#__PURE__*/
require("./takeLastWhile.js");
module.exports.takeWhile =
/*#__PURE__*/
require("./takeWhile.js");
module.exports.tap =
/*#__PURE__*/
require("./tap.js");
module.exports.test =
/*#__PURE__*/
require("./test.js");
module.exports.andThen =
/*#__PURE__*/
require("./andThen.js");
module.exports.times =
/*#__PURE__*/
require("./times.js");
module.exports.toLower =
/*#__PURE__*/
require("./toLower.js");
module.exports.toPairs =
/*#__PURE__*/
require("./toPairs.js");
module.exports.toPairsIn =
/*#__PURE__*/
require("./toPairsIn.js");
module.exports.toString =
/*#__PURE__*/
require("./toString.js");
module.exports.toUpper =
/*#__PURE__*/
require("./toUpper.js");
module.exports.transduce =
/*#__PURE__*/
require("./transduce.js");
module.exports.transpose =
/*#__PURE__*/
require("./transpose.js");
module.exports.traverse =
/*#__PURE__*/
require("./traverse.js");
module.exports.trim =
/*#__PURE__*/
require("./trim.js");
module.exports.tryCatch =
/*#__PURE__*/
require("./tryCatch.js");
module.exports.type =
/*#__PURE__*/
require("./type.js");
module.exports.unapply =
/*#__PURE__*/
require("./unapply.js");
module.exports.unary =
/*#__PURE__*/
require("./unary.js");
module.exports.uncurryN =
/*#__PURE__*/
require("./uncurryN.js");
module.exports.unfold =
/*#__PURE__*/
require("./unfold.js");
module.exports.union =
/*#__PURE__*/
require("./union.js");
module.exports.unionWith =
/*#__PURE__*/
require("./unionWith.js");
module.exports.uniq =
/*#__PURE__*/
require("./uniq.js");
module.exports.uniqBy =
/*#__PURE__*/
require("./uniqBy.js");
module.exports.uniqWith =
/*#__PURE__*/
require("./uniqWith.js");
module.exports.unless =
/*#__PURE__*/
require("./unless.js");
module.exports.unnest =
/*#__PURE__*/
require("./unnest.js");
module.exports.until =
/*#__PURE__*/
require("./until.js");
module.exports.unwind =
/*#__PURE__*/
require("./unwind.js");
module.exports.update =
/*#__PURE__*/
require("./update.js");
module.exports.useWith =
/*#__PURE__*/
require("./useWith.js");
module.exports.values =
/*#__PURE__*/
require("./values.js");
module.exports.valuesIn =
/*#__PURE__*/
require("./valuesIn.js");
module.exports.view =
/*#__PURE__*/
require("./view.js");
module.exports.when =
/*#__PURE__*/
require("./when.js");
module.exports.where =
/*#__PURE__*/
require("./where.js");
module.exports.whereAny =
/*#__PURE__*/
require("./whereAny.js");
module.exports.whereEq =
/*#__PURE__*/
require("./whereEq.js");
module.exports.without =
/*#__PURE__*/
require("./without.js");
module.exports.xor =
/*#__PURE__*/
require("./xor.js");
module.exports.xprod =
/*#__PURE__*/
require("./xprod.js");
module.exports.zip =
/*#__PURE__*/
require("./zip.js");
module.exports.zipObj =
/*#__PURE__*/
require("./zipObj.js");
module.exports.zipWith =
/*#__PURE__*/
require("./zipWith.js");
module.exports.thunkify =
/*#__PURE__*/
require("./thunkify.js");var reduceBy =
/*#__PURE__*/
require("./reduceBy.js");
/**
 * Given a function that generates a key, turns a list of objects into an
 * object indexing the objects by the given key. Note that if multiple
 * objects generate the same value for the indexing key only the last value
 * will be included in the generated object.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category List
 * @typedefn Idx = String | Int | Symbol
 * @sig Idx a => (b -> a) -> [b] -> {a: b}
 * @param {Function} fn Function :: a -> Idx
 * @param {Array} array The array of objects to index
 * @return {Object} An object indexing each array element by the given property.
 * @see R.groupBy
 * @example
 *
 *      const list = [{id: 'xyz', title: 'A'}, {id: 'abc', title: 'B'}];
 *      R.indexBy(R.prop('id'), list);
 *      //=> {abc: {id: 'abc', title: 'B'}, xyz: {id: 'xyz', title: 'A'}}
 */


var indexBy =
/*#__PURE__*/
reduceBy(function (acc, elem) {
  return elem;
}, null);
module.exports = indexBy;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _indexOf =
/*#__PURE__*/
require("./internal/_indexOf.js");

var _isArray =
/*#__PURE__*/
require("./internal/_isArray.js");
/**
 * Returns the position of the first occurrence of an item in an array, or -1
 * if the item is not included in the array. [`R.equals`](#equals) is used to
 * determine equality.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig a -> [a] -> Number
 * @param {*} target The item to find.
 * @param {Array} xs The array to search in.
 * @return {Number} the index of the target, or -1 if the target is not found.
 * @see R.lastIndexOf, R.findIndex
 * @example
 *
 *      R.indexOf(3, [1,2,3,4]); //=> 2
 *      R.indexOf(10, [1,2,3,4]); //=> -1
 */


var indexOf =
/*#__PURE__*/
_curry2(function indexOf(target, xs) {
  return typeof xs.indexOf === 'function' && !_isArray(xs) ? xs.indexOf(target) : _indexOf(xs, target, 0);
});

module.exports = indexOf;var slice =
/*#__PURE__*/
require("./slice.js");
/**
 * Returns all but the last element of the given list or string.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category List
 * @sig [a] -> [a]
 * @sig String -> String
 * @param {*} list
 * @return {*}
 * @see R.last, R.head, R.tail
 * @example
 *
 *      R.init([1, 2, 3]);  //=> [1, 2]
 *      R.init([1, 2]);     //=> [1]
 *      R.init([1]);        //=> []
 *      R.init([]);         //=> []
 *
 *      R.init('abc');  //=> 'ab'
 *      R.init('ab');   //=> 'a'
 *      R.init('a');    //=> ''
 *      R.init('');     //=> ''
 */


var init =
/*#__PURE__*/
slice(0, -1);
module.exports = init;var _includesWith =
/*#__PURE__*/
require("./internal/_includesWith.js");

var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");

var _filter =
/*#__PURE__*/
require("./internal/_filter.js");
/**
 * Takes a predicate `pred`, a list `xs`, and a list `ys`, and returns a list
 * `xs'` comprising each of the elements of `xs` which is equal to one or more
 * elements of `ys` according to `pred`.
 *
 * `pred` must be a binary function expecting an element from each list.
 *
 * `xs`, `ys`, and `xs'` are treated as sets, semantically, so ordering should
 * not be significant, but since `xs'` is ordered the implementation guarantees
 * that its values are in the same order as they appear in `xs`. Duplicates are
 * not removed, so `xs'` may contain duplicates if `xs` contains duplicates.
 *
 * @func
 * @memberOf R
 * @since v0.24.0
 * @category Relation
 * @sig ((a, b) -> Boolean) -> [a] -> [b] -> [a]
 * @param {Function} pred
 * @param {Array} xs
 * @param {Array} ys
 * @return {Array}
 * @see R.intersection
 * @example
 *
 *      R.innerJoin(
 *        (record, id) => record.id === id,
 *        [{id: 824, name: 'Richie Furay'},
 *         {id: 956, name: 'Dewey Martin'},
 *         {id: 313, name: 'Bruce Palmer'},
 *         {id: 456, name: 'Stephen Stills'},
 *         {id: 177, name: 'Neil Young'}],
 *        [177, 456, 999]
 *      );
 *      //=> [{id: 456, name: 'Stephen Stills'}, {id: 177, name: 'Neil Young'}]
 */


var innerJoin =
/*#__PURE__*/
_curry3(function innerJoin(pred, xs, ys) {
  return _filter(function (x) {
    return _includesWith(pred, x, ys);
  }, xs);
});

module.exports = innerJoin;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");
/**
 * Inserts the supplied element into the list, at the specified `index`. _Note that

 * this is not destructive_: it returns a copy of the list with the changes.
 * <small>No lists have been harmed in the application of this function.</small>
 *
 * @func
 * @memberOf R
 * @since v0.2.2
 * @category List
 * @sig Number -> a -> [a] -> [a]
 * @param {Number} index The position to insert the element
 * @param {*} elt The element to insert into the Array
 * @param {Array} list The list to insert into
 * @return {Array} A new Array with `elt` inserted at `index`.
 * @example
 *
 *      R.insert(2, 'x', [1,2,3,4]); //=> [1,2,'x',3,4]
 */


var insert =
/*#__PURE__*/
_curry3(function insert(idx, elt, list) {
  idx = idx < list.length && idx >= 0 ? idx : list.length;
  var result = Array.prototype.slice.call(list, 0);
  result.splice(idx, 0, elt);
  return result;
});

module.exports = insert;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");
/**
 * Inserts the sub-list into the list, at the specified `index`. _Note that this is not
 * destructive_: it returns a copy of the list with the changes.
 * <small>No lists have been harmed in the application of this function.</small>
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category List
 * @sig Number -> [a] -> [a] -> [a]
 * @param {Number} index The position to insert the sub-list
 * @param {Array} elts The sub-list to insert into the Array
 * @param {Array} list The list to insert the sub-list into
 * @return {Array} A new Array with `elts` inserted starting at `index`.
 * @example
 *
 *      R.insertAll(2, ['x','y','z'], [1,2,3,4]); //=> [1,2,'x','y','z',3,4]
 */


var insertAll =
/*#__PURE__*/
_curry3(function insertAll(idx, elts, list) {
  idx = idx < list.length && idx >= 0 ? idx : list.length;
  return [].concat(Array.prototype.slice.call(list, 0, idx), elts, Array.prototype.slice.call(list, idx));
});

module.exports = insertAll;var _includes =
/*#__PURE__*/
require("./internal/_includes.js");

var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _filter =
/*#__PURE__*/
require("./internal/_filter.js");

var flip =
/*#__PURE__*/
require("./flip.js");

var uniq =
/*#__PURE__*/
require("./uniq.js");
/**
 * Combines two lists into a set (i.e. no duplicates) composed of those
 * elements common to both lists.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig [*] -> [*] -> [*]
 * @param {Array} list1 The first list.
 * @param {Array} list2 The second list.
 * @return {Array} The list of elements found in both `list1` and `list2`.
 * @see R.innerJoin
 * @example
 *
 *      R.intersection([1,2,3,4], [7,6,5,4,3]); //=> [4, 3]
 */


var intersection =
/*#__PURE__*/
_curry2(function intersection(list1, list2) {
  var lookupList, filteredList;

  if (list1.length > list2.length) {
    lookupList = list1;
    filteredList = list2;
  } else {
    lookupList = list2;
    filteredList = list1;
  }

  return uniq(_filter(flip(_includes)(lookupList), filteredList));
});

module.exports = intersection;var _checkForMethod =
/*#__PURE__*/
require("./internal/_checkForMethod.js");

var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Creates a new list with the separator interposed between elements.
 *
 * Dispatches to the `intersperse` method of the second argument, if present.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category List
 * @sig a -> [a] -> [a]
 * @param {*} separator The element to add to the list.
 * @param {Array} list The list to be interposed.
 * @return {Array} The new list.
 * @example
 *
 *      R.intersperse('a', ['b', 'n', 'n', 's']); //=> ['b', 'a', 'n', 'a', 'n', 'a', 's']
 */


var intersperse =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_checkForMethod('intersperse', function intersperse(separator, list) {
  var out = [];
  var idx = 0;
  var length = list.length;

  while (idx < length) {
    if (idx === length - 1) {
      out.push(list[idx]);
    } else {
      out.push(list[idx], separator);
    }

    idx += 1;
  }

  return out;
}));

module.exports = intersperse;var _clone =
/*#__PURE__*/
require("./internal/_clone.js");

var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");

var _isTransformer =
/*#__PURE__*/
require("./internal/_isTransformer.js");

var _reduce =
/*#__PURE__*/
require("./internal/_reduce.js");

var _stepCat =
/*#__PURE__*/
require("./internal/_stepCat.js");
/**
 * Transforms the items of the list with the transducer and appends the
 * transformed items to the accumulator using an appropriate iterator function
 * based on the accumulator type.
 *
 * The accumulator can be an array, string, object or a transformer. Iterated
 * items will be appended to arrays and concatenated to strings. Objects will
 * be merged directly or 2-item arrays will be merged as key, value pairs.
 *
 * The accumulator can also be a transformer object that provides a 2-arity
 * reducing iterator function, step, 0-arity initial value function, init, and
 * 1-arity result extraction function result. The step function is used as the
 * iterator function in reduce. The result function is used to convert the
 * final accumulator into the return type and in most cases is R.identity. The
 * init function is used to provide the initial accumulator.
 *
 * The iteration is performed with [`R.reduce`](#reduce) after initializing the
 * transducer.
 *
 * @func
 * @memberOf R
 * @since v0.12.0
 * @category List
 * @sig a -> (b -> b) -> [c] -> a
 * @param {*} acc The initial accumulator value.
 * @param {Function} xf The transducer function. Receives a transformer and returns a transformer.
 * @param {Array} list The list to iterate over.
 * @return {*} The final, accumulated value.
 * @see R.transduce
 * @example
 *
 *      const numbers = [1, 2, 3, 4];
 *      const transducer = R.compose(R.map(R.add(1)), R.take(2));
 *
 *      R.into([], transducer, numbers); //=> [2, 3]
 *
 *      const intoArray = R.into([]);
 *      intoArray(transducer, numbers); //=> [2, 3]
 */


var into =
/*#__PURE__*/
_curry3(function into(acc, xf, list) {
  return _isTransformer(acc) ? _reduce(xf(acc), acc['@@transducer/init'](), list) : _reduce(xf(_stepCat(acc)), _clone(acc, [], [], false), list);
});

module.exports = into;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var _has =
/*#__PURE__*/
require("./internal/_has.js");

var keys =
/*#__PURE__*/
require("./keys.js");
/**
 * Same as [`R.invertObj`](#invertObj), however this accounts for objects with
 * duplicate values by putting the values into an array.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Object
 * @sig {s: x} -> {x: [ s, ... ]}
 * @param {Object} obj The object or array to invert
 * @return {Object} out A new object with keys in an array.
 * @see R.invertObj
 * @example
 *
 *      const raceResultsByFirstName = {
 *        first: 'alice',
 *        second: 'jake',
 *        third: 'alice',
 *      };
 *      R.invert(raceResultsByFirstName);
 *      //=> { 'alice': ['first', 'third'], 'jake':['second'] }
 */


var invert =
/*#__PURE__*/
_curry1(function invert(obj) {
  var props = keys(obj);
  var len = props.length;
  var idx = 0;
  var out = {};

  while (idx < len) {
    var key = props[idx];
    var val = obj[key];
    var list = _has(val, out) ? out[val] : out[val] = [];
    list[list.length] = key;
    idx += 1;
  }

  return out;
});

module.exports = invert;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var keys =
/*#__PURE__*/
require("./keys.js");
/**
 * Returns a new object with the keys of the given object as values, and the
 * values of the given object, which are coerced to strings, as keys. Note
 * that the last key found is preferred when handling the same value.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Object
 * @sig {s: x} -> {x: s}
 * @param {Object} obj The object or array to invert
 * @return {Object} out A new object
 * @see R.invert
 * @example
 *
 *      const raceResults = {
 *        first: 'alice',
 *        second: 'jake'
 *      };
 *      R.invertObj(raceResults);
 *      //=> { 'alice': 'first', 'jake':'second' }
 *
 *      // Alternatively:
 *      const raceResults = ['alice', 'jake'];
 *      R.invertObj(raceResults);
 *      //=> { 'alice': '0', 'jake':'1' }
 */


var invertObj =
/*#__PURE__*/
_curry1(function invertObj(obj) {
  var props = keys(obj);
  var len = props.length;
  var idx = 0;
  var out = {};

  while (idx < len) {
    var key = props[idx];
    out[obj[key]] = key;
    idx += 1;
  }

  return out;
});

module.exports = invertObj;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _isFunction =
/*#__PURE__*/
require("./internal/_isFunction.js");

var curryN =
/*#__PURE__*/
require("./curryN.js");

var toString =
/*#__PURE__*/
require("./toString.js");
/**
 * Turns a named method with a specified arity into a function that can be
 * called directly supplied with arguments and a target object.
 *
 * The returned function is curried and accepts `arity + 1` parameters where
 * the final parameter is the target object.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig Number -> String -> (a -> b -> ... -> n -> Object -> *)
 * @param {Number} arity Number of arguments the returned function should take
 *        before the target object.
 * @param {String} method Name of any of the target object's methods to call.
 * @return {Function} A new curried function.
 * @see R.construct
 * @example
 *
 *      const sliceFrom = R.invoker(1, 'slice');
 *      sliceFrom(6, 'abcdefghijklm'); //=> 'ghijklm'
 *      const sliceFrom6 = R.invoker(2, 'slice')(6);
 *      sliceFrom6(8, 'abcdefghijklm'); //=> 'gh'
 *
 *      const dog = {
 *        speak: async () => 'Woof!'
 *      };
 *      const speak = R.invoker(0, 'speak');
 *      speak(dog).then(console.log) //~> 'Woof!'
 *
 * @symb R.invoker(0, 'method')(o) = o['method']()
 * @symb R.invoker(1, 'method')(a, o) = o['method'](a)
 * @symb R.invoker(2, 'method')(a, b, o) = o['method'](a, b)
 */


var invoker =
/*#__PURE__*/
_curry2(function invoker(arity, method) {
  return curryN(arity + 1, function () {
    var target = arguments[arity];

    if (target != null && _isFunction(target[method])) {
      return target[method].apply(target, Array.prototype.slice.call(arguments, 0, arity));
    }

    throw new TypeError(toString(target) + ' does not have a method named "' + method + '"');
  });
});

module.exports = invoker;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * See if an object (i.e. `val`) is an instance of the supplied constructor. This
 * function will check up the inheritance chain, if any.
 * If `val` was created using `Object.create`, `R.is(Object, val) === true`.
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category Type
 * @sig (* -> {*}) -> a -> Boolean
 * @param {Object} ctor A constructor
 * @param {*} val The value to test
 * @return {Boolean}
 * @example
 *
 *      R.is(Object, {}); //=> true
 *      R.is(Number, 1); //=> true
 *      R.is(Object, 1); //=> false
 *      R.is(String, 's'); //=> true
 *      R.is(String, new String('')); //=> true
 *      R.is(Object, new String('')); //=> true
 *      R.is(Object, 's'); //=> false
 *      R.is(Number, {}); //=> false
 */


var is =
/*#__PURE__*/
_curry2(function is(Ctor, val) {
  return val instanceof Ctor || val != null && (val.constructor === Ctor || Ctor.name === 'Object' && typeof val === 'object');
});

module.exports = is;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var empty =
/*#__PURE__*/
require("./empty.js");

var equals =
/*#__PURE__*/
require("./equals.js");
/**
 * Returns `true` if the given value is its type's empty value; `false`
 * otherwise.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Logic
 * @sig a -> Boolean
 * @param {*} x
 * @return {Boolean}
 * @see R.empty
 * @example
 *
 *      R.isEmpty([1, 2, 3]);           //=> false
 *      R.isEmpty([]);                  //=> true
 *      R.isEmpty('');                  //=> true
 *      R.isEmpty(null);                //=> false
 *      R.isEmpty({});                  //=> true
 *      R.isEmpty({length: 0});         //=> false
 *      R.isEmpty(Uint8Array.from('')); //=> true
 */


var isEmpty =
/*#__PURE__*/
_curry1(function isEmpty(x) {
  return x != null && equals(x, empty(x));
});

module.exports = isEmpty;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");
/**
 * Checks if the input value is `null` or `undefined`.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Type
 * @sig * -> Boolean
 * @param {*} x The value to test.
 * @return {Boolean} `true` if `x` is `undefined` or `null`, otherwise `false`.
 * @example
 *
 *      R.isNil(null); //=> true
 *      R.isNil(undefined); //=> true
 *      R.isNil(0); //=> false
 *      R.isNil([]); //=> false
 */


var isNil =
/*#__PURE__*/
_curry1(function isNil(x) {
  return x == null;
});

module.exports = isNil;var invoker =
/*#__PURE__*/
require("./invoker.js");
/**
 * Returns a string made by inserting the `separator` between each element and
 * concatenating all the elements into a single string.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig String -> [a] -> String
 * @param {Number|String} separator The string used to separate the elements.
 * @param {Array} xs The elements to join into a string.
 * @return {String} str The string made by concatenating `xs` with `separator`.
 * @see R.split
 * @example
 *
 *      const spacer = R.join(' ');
 *      spacer(['a', 2, 3.4]);   //=> 'a 2 3.4'
 *      R.join('|', [1, 2, 3]);    //=> '1|2|3'
 */


var join =
/*#__PURE__*/
invoker(1, 'join');
module.exports = join;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var converge =
/*#__PURE__*/
require("./converge.js");
/**
 * juxt applies a list of functions to a list of values.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category Function
 * @sig [(a, b, ..., m) -> n] -> ((a, b, ..., m) -> [n])
 * @param {Array} fns An array of functions
 * @return {Function} A function that returns a list of values after applying each of the original `fns` to its parameters.
 * @see R.applySpec
 * @example
 *
 *      const getRange = R.juxt([Math.min, Math.max]);
 *      getRange(3, 4, 9, -3); //=> [-3, 9]
 * @symb R.juxt([f, g, h])(a, b) = [f(a, b), g(a, b), h(a, b)]
 */


var juxt =
/*#__PURE__*/
_curry1(function juxt(fns) {
  return converge(function () {
    return Array.prototype.slice.call(arguments, 0);
  }, fns);
});

module.exports = juxt;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var _has =
/*#__PURE__*/
require("./internal/_has.js");

var _isArguments =
/*#__PURE__*/
require("./internal/_isArguments.js"); // cover IE < 9 keys issues


var hasEnumBug = !
/*#__PURE__*/
{
  toString: null
}.propertyIsEnumerable('toString');
var nonEnumerableProps = ['constructor', 'valueOf', 'isPrototypeOf', 'toString', 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; // Safari bug

var hasArgsEnumBug =
/*#__PURE__*/
function () {
  'use strict';

  return arguments.propertyIsEnumerable('length');
}();

var contains = function contains(list, item) {
  var idx = 0;

  while (idx < list.length) {
    if (list[idx] === item) {
      return true;
    }

    idx += 1;
  }

  return false;
};
/**
 * Returns a list containing the names of all the enumerable own properties of
 * the supplied object.
 * Note that the order of the output array is not guaranteed to be consistent
 * across different JS platforms.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @sig {k: v} -> [k]
 * @param {Object} obj The object to extract properties from
 * @return {Array} An array of the object's own properties.
 * @see R.keysIn, R.values, R.toPairs
 * @example
 *
 *      R.keys({a: 1, b: 2, c: 3}); //=> ['a', 'b', 'c']
 */


var keys = typeof Object.keys === 'function' && !hasArgsEnumBug ?
/*#__PURE__*/
_curry1(function keys(obj) {
  return Object(obj) !== obj ? [] : Object.keys(obj);
}) :
/*#__PURE__*/
_curry1(function keys(obj) {
  if (Object(obj) !== obj) {
    return [];
  }

  var prop, nIdx;
  var ks = [];

  var checkArgsLength = hasArgsEnumBug && _isArguments(obj);

  for (prop in obj) {
    if (_has(prop, obj) && (!checkArgsLength || prop !== 'length')) {
      ks[ks.length] = prop;
    }
  }

  if (hasEnumBug) {
    nIdx = nonEnumerableProps.length - 1;

    while (nIdx >= 0) {
      prop = nonEnumerableProps[nIdx];

      if (_has(prop, obj) && !contains(ks, prop)) {
        ks[ks.length] = prop;
      }

      nIdx -= 1;
    }
  }

  return ks;
});
module.exports = keys;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");
/**
 * Returns a list containing the names of all the properties of the supplied
 * object, including prototype properties.
 * Note that the order of the output array is not guaranteed to be consistent
 * across different JS platforms.
 *
 * @func
 * @memberOf R
 * @since v0.2.0
 * @category Object
 * @sig {k: v} -> [k]
 * @param {Object} obj The object to extract properties from
 * @return {Array} An array of the object's own and prototype properties.
 * @see R.keys, R.valuesIn
 * @example
 *
 *      const F = function() { this.x = 'X'; };
 *      F.prototype.y = 'Y';
 *      const f = new F();
 *      R.keysIn(f); //=> ['x', 'y']
 */


var keysIn =
/*#__PURE__*/
_curry1(function keysIn(obj) {
  var prop;
  var ks = [];

  for (prop in obj) {
    ks[ks.length] = prop;
  }

  return ks;
});

module.exports = keysIn;var nth =
/*#__PURE__*/
require("./nth.js");
/**
 * Returns the last element of the given list or string.
 *
 * @func
 * @memberOf R
 * @since v0.1.4
 * @category List
 * @sig [a] -> a | Undefined
 * @sig String -> String
 * @param {*} list
 * @return {*}
 * @see R.init, R.head, R.tail
 * @example
 *
 *      R.last(['fi', 'fo', 'fum']); //=> 'fum'
 *      R.last([]); //=> undefined
 *
 *      R.last('abc'); //=> 'c'
 *      R.last(''); //=> ''
 */


var last =
/*#__PURE__*/
nth(-1);
module.exports = last;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _isArray =
/*#__PURE__*/
require("./internal/_isArray.js");

var equals =
/*#__PURE__*/
require("./equals.js");
/**
 * Returns the position of the last occurrence of an item in an array, or -1 if
 * the item is not included in the array. [`R.equals`](#equals) is used to
 * determine equality.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig a -> [a] -> Number
 * @param {*} target The item to find.
 * @param {Array} xs The array to search in.
 * @return {Number} the index of the target, or -1 if the target is not found.
 * @see R.indexOf, R.findLastIndex
 * @example
 *
 *      R.lastIndexOf(3, [-1,3,3,0,1,2,3,4]); //=> 6
 *      R.lastIndexOf(10, [1,2,3,4]); //=> -1
 */


var lastIndexOf =
/*#__PURE__*/
_curry2(function lastIndexOf(target, xs) {
  if (typeof xs.lastIndexOf === 'function' && !_isArray(xs)) {
    return xs.lastIndexOf(target);
  } else {
    var idx = xs.length - 1;

    while (idx >= 0) {
      if (equals(xs[idx], target)) {
        return idx;
      }

      idx -= 1;
    }

    return -1;
  }
});

module.exports = lastIndexOf;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var _isNumber =
/*#__PURE__*/
require("./internal/_isNumber.js");
/**
 * Returns the number of elements in the array by returning `list.length`.
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category List
 * @sig [a] -> Number
 * @param {Array} list The array to inspect.
 * @return {Number} The length of the array.
 * @example
 *
 *      R.length([]); //=> 0
 *      R.length([1, 2, 3]); //=> 3
 */


var length =
/*#__PURE__*/
_curry1(function length(list) {
  return list != null && _isNumber(list.length) ? list.length : NaN;
});

module.exports = length;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var map =
/*#__PURE__*/
require("./map.js");
/**
 * Returns a lens for the given getter and setter functions. The getter "gets"
 * the value of the focus; the setter "sets" the value of the focus. The setter
 * should not mutate the data structure.
 *
 * @func
 * @memberOf R
 * @since v0.8.0
 * @category Object
 * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
 * @sig (s -> a) -> ((a, s) -> s) -> Lens s a
 * @param {Function} getter
 * @param {Function} setter
 * @return {Lens}
 * @see R.view, R.set, R.over, R.lensIndex, R.lensProp
 * @example
 *
 *      const xLens = R.lens(R.prop('x'), R.assoc('x'));
 *
 *      R.view(xLens, {x: 1, y: 2});            //=> 1
 *      R.set(xLens, 4, {x: 1, y: 2});          //=> {x: 4, y: 2}
 *      R.over(xLens, R.negate, {x: 1, y: 2});  //=> {x: -1, y: 2}
 */


var lens =
/*#__PURE__*/
_curry2(function lens(getter, setter) {
  return function (toFunctorFn) {
    return function (target) {
      return map(function (focus) {
        return setter(focus, target);
      }, toFunctorFn(getter(target)));
    };
  };
});

module.exports = lens;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var lens =
/*#__PURE__*/
require("./lens.js");

var nth =
/*#__PURE__*/
require("./nth.js");

var update =
/*#__PURE__*/
require("./update.js");
/**
 * Returns a lens whose focus is the specified index.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category Object
 * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
 * @sig Number -> Lens s a
 * @param {Number} n
 * @return {Lens}
 * @see R.view, R.set, R.over, R.nth
 * @example
 *
 *      const headLens = R.lensIndex(0);
 *
 *      R.view(headLens, ['a', 'b', 'c']);            //=> 'a'
 *      R.set(headLens, 'x', ['a', 'b', 'c']);        //=> ['x', 'b', 'c']
 *      R.over(headLens, R.toUpper, ['a', 'b', 'c']); //=> ['A', 'b', 'c']
 */


var lensIndex =
/*#__PURE__*/
_curry1(function lensIndex(n) {
  return lens(nth(n), update(n));
});

module.exports = lensIndex;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var assocPath =
/*#__PURE__*/
require("./assocPath.js");

var lens =
/*#__PURE__*/
require("./lens.js");

var path =
/*#__PURE__*/
require("./path.js");
/**
 * Returns a lens whose focus is the specified path.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category Object
 * @typedefn Idx = String | Int | Symbol
 * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
 * @sig [Idx] -> Lens s a
 * @param {Array} path The path to use.
 * @return {Lens}
 * @see R.view, R.set, R.over
 * @example
 *
 *      const xHeadYLens = R.lensPath(['x', 0, 'y']);
 *
 *      R.view(xHeadYLens, {x: [{y: 2, z: 3}, {y: 4, z: 5}]});
 *      //=> 2
 *      R.set(xHeadYLens, 1, {x: [{y: 2, z: 3}, {y: 4, z: 5}]});
 *      //=> {x: [{y: 1, z: 3}, {y: 4, z: 5}]}
 *      R.over(xHeadYLens, R.negate, {x: [{y: 2, z: 3}, {y: 4, z: 5}]});
 *      //=> {x: [{y: -2, z: 3}, {y: 4, z: 5}]}
 */


var lensPath =
/*#__PURE__*/
_curry1(function lensPath(p) {
  return lens(path(p), assocPath(p));
});

module.exports = lensPath;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var assoc =
/*#__PURE__*/
require("./assoc.js");

var lens =
/*#__PURE__*/
require("./lens.js");

var prop =
/*#__PURE__*/
require("./prop.js");
/**
 * Returns a lens whose focus is the specified property.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category Object
 * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
 * @sig String -> Lens s a
 * @param {String} k
 * @return {Lens}
 * @see R.view, R.set, R.over
 * @example
 *
 *      const xLens = R.lensProp('x');
 *
 *      R.view(xLens, {x: 1, y: 2});            //=> 1
 *      R.set(xLens, 4, {x: 1, y: 2});          //=> {x: 4, y: 2}
 *      R.over(xLens, R.negate, {x: 1, y: 2});  //=> {x: -1, y: 2}
 */


var lensProp =
/*#__PURE__*/
_curry1(function lensProp(k) {
  return lens(prop(k), assoc(k));
});

module.exports = lensProp;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var liftN =
/*#__PURE__*/
require("./liftN.js");
/**
 * "lifts" a function of arity >= 1 so that it may "map over" a list, Function or other
 * object that satisfies the [FantasyLand Apply spec](https://github.com/fantasyland/fantasy-land#apply).
 *
 * @func
 * @memberOf R
 * @since v0.7.0
 * @category Function
 * @sig (*... -> *) -> ([*]... -> [*])
 * @param {Function} fn The function to lift into higher context
 * @return {Function} The lifted function.
 * @see R.liftN
 * @example
 *
 *      const madd3 = R.lift((a, b, c) => a + b + c);
 *
 *      madd3([100, 200], [30, 40], [5, 6, 7]); //=> [135, 136, 137, 145, 146, 147, 235, 236, 237, 245, 246, 247]
 *
 *      const madd5 = R.lift((a, b, c, d, e) => a + b + c + d + e);
 *
 *      madd5([10, 20], [1], [2, 3], [4], [100, 200]); //=> [117, 217, 118, 218, 127, 227, 128, 228]
 */


var lift =
/*#__PURE__*/
_curry1(function lift(fn) {
  return liftN(fn.length, fn);
});

module.exports = lift;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _reduce =
/*#__PURE__*/
require("./internal/_reduce.js");

var ap =
/*#__PURE__*/
require("./ap.js");

var curryN =
/*#__PURE__*/
require("./curryN.js");

var map =
/*#__PURE__*/
require("./map.js");
/**
 * "lifts" a function to be the specified arity, so that it may "map over" that
 * many lists, Functions or other objects that satisfy the [FantasyLand Apply spec](https://github.com/fantasyland/fantasy-land#apply).
 *
 * @func
 * @memberOf R
 * @since v0.7.0
 * @category Function
 * @sig Number -> (*... -> *) -> ([*]... -> [*])
 * @param {Function} fn The function to lift into higher context
 * @return {Function} The lifted function.
 * @see R.lift, R.ap
 * @example
 *
 *      const madd3 = R.liftN(3, (...args) => R.sum(args));
 *      madd3([1,2,3], [1,2,3], [1]); //=> [3, 4, 5, 4, 5, 6, 5, 6, 7]
 */


var liftN =
/*#__PURE__*/
_curry2(function liftN(arity, fn) {
  var lifted = curryN(arity, fn);
  return curryN(arity, function () {
    return _reduce(ap, map(lifted, arguments[0]), Array.prototype.slice.call(arguments, 1));
  });
});

module.exports = liftN;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Returns `true` if the first argument is less than the second; `false`
 * otherwise.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig Ord a => a -> a -> Boolean
 * @param {*} a
 * @param {*} b
 * @return {Boolean}
 * @see R.gt
 * @example
 *
 *      R.lt(2, 1); //=> false
 *      R.lt(2, 2); //=> false
 *      R.lt(2, 3); //=> true
 *      R.lt('a', 'z'); //=> true
 *      R.lt('z', 'a'); //=> false
 */


var lt =
/*#__PURE__*/
_curry2(function lt(a, b) {
  return a < b;
});

module.exports = lt;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Returns `true` if the first argument is less than or equal to the second;
 * `false` otherwise.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig Ord a => a -> a -> Boolean
 * @param {Number} a
 * @param {Number} b
 * @return {Boolean}
 * @see R.gte
 * @example
 *
 *      R.lte(2, 1); //=> false
 *      R.lte(2, 2); //=> true
 *      R.lte(2, 3); //=> true
 *      R.lte('a', 'z'); //=> true
 *      R.lte('z', 'a'); //=> false
 */


var lte =
/*#__PURE__*/
_curry2(function lte(a, b) {
  return a <= b;
});

module.exports = lte;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _dispatchable =
/*#__PURE__*/
require("./internal/_dispatchable.js");

var _map =
/*#__PURE__*/
require("./internal/_map.js");

var _reduce =
/*#__PURE__*/
require("./internal/_reduce.js");

var _xmap =
/*#__PURE__*/
require("./internal/_xmap.js");

var curryN =
/*#__PURE__*/
require("./curryN.js");

var keys =
/*#__PURE__*/
require("./keys.js");
/**
 * Takes a function and
 * a [functor](https://github.com/fantasyland/fantasy-land#functor),
 * applies the function to each of the functor's values, and returns
 * a functor of the same shape.
 *
 * Ramda provides suitable `map` implementations for `Array` and `Object`,
 * so this function may be applied to `[1, 2, 3]` or `{x: 1, y: 2, z: 3}`.
 *
 * Dispatches to the `map` method of the second argument, if present.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * Also treats functions as functors and will compose them together.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig Functor f => (a -> b) -> f a -> f b
 * @param {Function} fn The function to be called on every element of the input `list`.
 * @param {Array} list The list to be iterated over.
 * @return {Array} The new list.
 * @see R.transduce, R.addIndex, R.pluck, R.project
 * @example
 *
 *      const double = x => x * 2;
 *
 *      R.map(double, [1, 2, 3]); //=> [2, 4, 6]
 *
 *      R.map(double, {x: 1, y: 2, z: 3}); //=> {x: 2, y: 4, z: 6}
 * @symb R.map(f, [a, b]) = [f(a), f(b)]
 * @symb R.map(f, { x: a, y: b }) = { x: f(a), y: f(b) }
 * @symb R.map(f, functor_o) = functor_o.map(f)
 */


var map =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable(['fantasy-land/map', 'map'], _xmap, function map(fn, functor) {
  switch (Object.prototype.toString.call(functor)) {
    case '[object Function]':
      return curryN(functor.length, function () {
        return fn.call(this, functor.apply(this, arguments));
      });

    case '[object Object]':
      return _reduce(function (acc, key) {
        acc[key] = fn(functor[key]);
        return acc;
      }, {}, keys(functor));

    default:
      return _map(fn, functor);
  }
}));

module.exports = map;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");
/**
 * The `mapAccum` function behaves like a combination of map and reduce; it
 * applies a function to each element of a list, passing an accumulating
 * parameter from left to right, and returning a final value of this
 * accumulator together with the new list.
 *
 * The iterator function receives two arguments, *acc* and *value*, and should
 * return a tuple *[acc, value]*.
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category List
 * @sig ((acc, x) -> (acc, y)) -> acc -> [x] -> (acc, [y])
 * @param {Function} fn The function to be called on every element of the input `list`.
 * @param {*} acc The accumulator value.
 * @param {Array} list The list to iterate over.
 * @return {*} The final, accumulated value.
 * @see R.scan, R.addIndex, R.mapAccumRight
 * @example
 *
 *      const digits = ['1', '2', '3', '4'];
 *      const appender = (a, b) => [a + b, a + b];
 *
 *      R.mapAccum(appender, 0, digits); //=> ['01234', ['01', '012', '0123', '01234']]
 * @symb R.mapAccum(f, a, [b, c, d]) = [
 *   f(f(f(a, b)[0], c)[0], d)[0],
 *   [
 *     f(a, b)[1],
 *     f(f(a, b)[0], c)[1],
 *     f(f(f(a, b)[0], c)[0], d)[1]
 *   ]
 * ]
 */


var mapAccum =
/*#__PURE__*/
_curry3(function mapAccum(fn, acc, list) {
  var idx = 0;
  var len = list.length;
  var result = [];
  var tuple = [acc];

  while (idx < len) {
    tuple = fn(tuple[0], list[idx]);
    result[idx] = tuple[1];
    idx += 1;
  }

  return [tuple[0], result];
});

module.exports = mapAccum;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");
/**
 * The `mapAccumRight` function behaves like a combination of map and reduce; it
 * applies a function to each element of a list, passing an accumulating
 * parameter from right to left, and returning a final value of this
 * accumulator together with the new list.
 *
 * Similar to [`mapAccum`](#mapAccum), except moves through the input list from
 * the right to the left.
 *
 * The iterator function receives two arguments, *acc* and *value*, and should
 * return a tuple *[acc, value]*.
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category List
 * @sig ((acc, x) -> (acc, y)) -> acc -> [x] -> (acc, [y])
 * @param {Function} fn The function to be called on every element of the input `list`.
 * @param {*} acc The accumulator value.
 * @param {Array} list The list to iterate over.
 * @return {*} The final, accumulated value.
 * @see R.addIndex, R.mapAccum
 * @example
 *
 *      const digits = ['1', '2', '3', '4'];
 *      const appender = (a, b) => [b + a, b + a];
 *
 *      R.mapAccumRight(appender, 5, digits); //=> ['12345', ['12345', '2345', '345', '45']]
 * @symb R.mapAccumRight(f, a, [b, c, d]) = [
 *   f(f(f(a, d)[0], c)[0], b)[0],
 *   [
 *     f(a, d)[1],
 *     f(f(a, d)[0], c)[1],
 *     f(f(f(a, d)[0], c)[0], b)[1]
 *   ]
 * ]
 */


var mapAccumRight =
/*#__PURE__*/
_curry3(function mapAccumRight(fn, acc, list) {
  var idx = list.length - 1;
  var result = [];
  var tuple = [acc];

  while (idx >= 0) {
    tuple = fn(tuple[0], list[idx]);
    result[idx] = tuple[1];
    idx -= 1;
  }

  return [tuple[0], result];
});

module.exports = mapAccumRight;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _reduce =
/*#__PURE__*/
require("./internal/_reduce.js");

var keys =
/*#__PURE__*/
require("./keys.js");
/**
 * An Object-specific version of [`map`](#map). The function is applied to three
 * arguments: *(value, key, obj)*. If only the value is significant, use
 * [`map`](#map) instead.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Object
 * @sig ((*, String, Object) -> *) -> Object -> Object
 * @param {Function} fn
 * @param {Object} obj
 * @return {Object}
 * @see R.map
 * @example
 *
 *      const xyz = { x: 1, y: 2, z: 3 };
 *      const prependKeyAndDouble = (num, key, obj) => key + (num * 2);
 *
 *      R.mapObjIndexed(prependKeyAndDouble, xyz); //=> { x: 'x2', y: 'y4', z: 'z6' }
 */


var mapObjIndexed =
/*#__PURE__*/
_curry2(function mapObjIndexed(fn, obj) {
  return _reduce(function (acc, key) {
    acc[key] = fn(obj[key], key, obj);
    return acc;
  }, {}, keys(obj));
});

module.exports = mapObjIndexed;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Tests a regular expression against a String. Note that this function will
 * return an empty array when there are no matches. This differs from
 * [`String.prototype.match`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match)
 * which returns `null` when there are no matches.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category String
 * @sig RegExp -> String -> [String | Undefined]
 * @param {RegExp} rx A regular expression.
 * @param {String} str The string to match against
 * @return {Array} The list of matches or empty array.
 * @see R.test
 * @example
 *
 *      R.match(/([a-z]a)/g, 'bananas'); //=> ['ba', 'na', 'na']
 *      R.match(/a/, 'b'); //=> []
 *      R.match(/a/, null); //=> TypeError: null does not have a method named "match"
 */


var match =
/*#__PURE__*/
_curry2(function match(rx, str) {
  return str.match(rx) || [];
});

module.exports = match;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _isInteger =
/*#__PURE__*/
require("./internal/_isInteger.js");
/**
 * `mathMod` behaves like the modulo operator should mathematically, unlike the
 * `%` operator (and by extension, [`R.modulo`](#modulo)). So while
 * `-17 % 5` is `-2`, `mathMod(-17, 5)` is `3`. `mathMod` requires Integer
 * arguments, and returns NaN when the modulus is zero or negative.
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category Math
 * @sig Number -> Number -> Number
 * @param {Number} m The dividend.
 * @param {Number} p the modulus.
 * @return {Number} The result of `b mod a`.
 * @see R.modulo
 * @example
 *
 *      R.mathMod(-17, 5);  //=> 3
 *      R.mathMod(17, 5);   //=> 2
 *      R.mathMod(17, -5);  //=> NaN
 *      R.mathMod(17, 0);   //=> NaN
 *      R.mathMod(17.2, 5); //=> NaN
 *      R.mathMod(17, 5.3); //=> NaN
 *
 *      const clock = R.mathMod(R.__, 12);
 *      clock(15); //=> 3
 *      clock(24); //=> 0
 *
 *      const seventeenMod = R.mathMod(17);
 *      seventeenMod(3);  //=> 2
 *      seventeenMod(4);  //=> 1
 *      seventeenMod(10); //=> 7
 */


var mathMod =
/*#__PURE__*/
_curry2(function mathMod(m, p) {
  if (!_isInteger(m)) {
    return NaN;
  }

  if (!_isInteger(p) || p < 1) {
    return NaN;
  }

  return (m % p + p) % p;
});

module.exports = mathMod;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Returns the larger of its two arguments.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig Ord a => a -> a -> a
 * @param {*} a
 * @param {*} b
 * @return {*}
 * @see R.maxBy, R.min
 * @example
 *
 *      R.max(789, 123); //=> 789
 *      R.max('a', 'b'); //=> 'b'
 */


var max =
/*#__PURE__*/
_curry2(function max(a, b) {
  return b > a ? b : a;
});

module.exports = max;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");
/**
 * Takes a function and two values, and returns whichever value produces the
 * larger result when passed to the provided function.
 *
 * @func
 * @memberOf R
 * @since v0.8.0
 * @category Relation
 * @sig Ord b => (a -> b) -> a -> a -> a
 * @param {Function} f
 * @param {*} a
 * @param {*} b
 * @return {*}
 * @see R.max, R.minBy
 * @example
 *
 *      //  square :: Number -> Number
 *      const square = n => n * n;
 *
 *      R.maxBy(square, -3, 2); //=> -3
 *
 *      R.reduce(R.maxBy(square), 0, [3, -5, 4, 1, -2]); //=> -5
 *      R.reduce(R.maxBy(square), 0, []); //=> 0
 */


var maxBy =
/*#__PURE__*/
_curry3(function maxBy(f, a, b) {
  return f(b) > f(a) ? b : a;
});

module.exports = maxBy;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var sum =
/*#__PURE__*/
require("./sum.js");
/**
 * Returns the mean of the given list of numbers.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category Math
 * @sig [Number] -> Number
 * @param {Array} list
 * @return {Number}
 * @see R.median
 * @example
 *
 *      R.mean([2, 7, 9]); //=> 6
 *      R.mean([]); //=> NaN
 */


var mean =
/*#__PURE__*/
_curry1(function mean(list) {
  return sum(list) / list.length;
});

module.exports = mean;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var mean =
/*#__PURE__*/
require("./mean.js");
/**
 * Returns the median of the given list of numbers.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category Math
 * @sig [Number] -> Number
 * @param {Array} list
 * @return {Number}
 * @see R.mean
 * @example
 *
 *      R.median([2, 9, 7]); //=> 7
 *      R.median([7, 2, 10, 9]); //=> 8
 *      R.median([]); //=> NaN
 */


var median =
/*#__PURE__*/
_curry1(function median(list) {
  var len = list.length;

  if (len === 0) {
    return NaN;
  }

  var width = 2 - len % 2;
  var idx = (len - width) / 2;
  return mean(Array.prototype.slice.call(list, 0).sort(function (a, b) {
    return a < b ? -1 : a > b ? 1 : 0;
  }).slice(idx, idx + width));
});

module.exports = median;var _arity =
/*#__PURE__*/
require("./internal/_arity.js");

var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _has =
/*#__PURE__*/
require("./internal/_has.js");
/**
 * Creates a new function that, when invoked, caches the result of calling `fn`
 * for a given argument set and returns the result. Subsequent calls to the
 * memoized `fn` with the same argument set will not result in an additional
 * call to `fn`; instead, the cached result for that set of arguments will be
 * returned.
 *
 * Care must be taken when implementing key generation to avoid key collision,
 * or if tracking references, memory leaks and mutating arguments.
 *
 * @func
 * @memberOf R
 * @since v0.24.0
 * @category Function
 * @sig (*... -> String) -> (*... -> a) -> (*... -> a)
 * @param {Function} fn The function to generate the cache key.
 * @param {Function} fn The function to memoize.
 * @return {Function} Memoized version of `fn`.
 * @example
 *
 *      let count = 0;
 *      const factorial = R.memoizeWith(Number, n => {
 *        count += 1;
 *        return R.product(R.range(1, n + 1));
 *      });
 *      factorial(5); //=> 120
 *      factorial(5); //=> 120
 *      factorial(5); //=> 120
 *      count; //=> 1
 */


var memoizeWith =
/*#__PURE__*/
_curry2(function memoizeWith(mFn, fn) {
  var cache = {};
  return _arity(fn.length, function () {
    var key = mFn.apply(this, arguments);

    if (!_has(key, cache)) {
      cache[key] = fn.apply(this, arguments);
    }

    return cache[key];
  });
});

module.exports = memoizeWith;var _objectAssign =
/*#__PURE__*/
require("./internal/_objectAssign.js");

var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");
/**
 * Creates one new object with the own properties from a list of objects.
 * If a key exists in more than one object, the value from the last
 * object it exists in will be used.
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category List
 * @sig [{k: v}] -> {k: v}
 * @param {Array} list An array of objects
 * @return {Object} A merged object.
 * @see R.reduce
 * @example
 *
 *      R.mergeAll([{foo:1},{bar:2},{baz:3}]); //=> {foo:1,bar:2,baz:3}
 *      R.mergeAll([{foo:1},{foo:2},{bar:2}]); //=> {foo:2,bar:2}
 * @symb R.mergeAll([{ x: 1 }, { y: 2 }, { z: 3 }]) = { x: 1, y: 2, z: 3 }
 */


var mergeAll =
/*#__PURE__*/
_curry1(function mergeAll(list) {
  return _objectAssign.apply(null, [{}].concat(list));
});

module.exports = mergeAll;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var mergeDeepWithKey =
/*#__PURE__*/
require("./mergeDeepWithKey.js");
/**
 * Creates a new object with the own properties of the first object merged with
 * the own properties of the second object. If a key exists in both objects:
 * - and both values are objects, the two values will be recursively merged
 * - otherwise the value from the first object will be used.
 *
 * @func
 * @memberOf R
 * @since v0.24.0
 * @category Object
 * @sig {a} -> {a} -> {a}
 * @param {Object} lObj
 * @param {Object} rObj
 * @return {Object}
 * @see R.merge, R.mergeDeepRight, R.mergeDeepWith, R.mergeDeepWithKey
 * @example
 *
 *      R.mergeDeepLeft({ name: 'fred', age: 10, contact: { email: 'moo@example.com' }},
 *                      { age: 40, contact: { email: 'baa@example.com' }});
 *      //=> { name: 'fred', age: 10, contact: { email: 'moo@example.com' }}
 */


var mergeDeepLeft =
/*#__PURE__*/
_curry2(function mergeDeepLeft(lObj, rObj) {
  return mergeDeepWithKey(function (k, lVal, rVal) {
    return lVal;
  }, lObj, rObj);
});

module.exports = mergeDeepLeft;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var mergeDeepWithKey =
/*#__PURE__*/
require("./mergeDeepWithKey.js");
/**
 * Creates a new object with the own properties of the first object merged with
 * the own properties of the second object. If a key exists in both objects:
 * - and both values are objects, the two values will be recursively merged
 * - otherwise the value from the second object will be used.
 *
 * @func
 * @memberOf R
 * @since v0.24.0
 * @category Object
 * @sig {a} -> {a} -> {a}
 * @param {Object} lObj
 * @param {Object} rObj
 * @return {Object}
 * @see R.merge, R.mergeDeepLeft, R.mergeDeepWith, R.mergeDeepWithKey
 * @example
 *
 *      R.mergeDeepRight({ name: 'fred', age: 10, contact: { email: 'moo@example.com' }},
 *                       { age: 40, contact: { email: 'baa@example.com' }});
 *      //=> { name: 'fred', age: 40, contact: { email: 'baa@example.com' }}
 */


var mergeDeepRight =
/*#__PURE__*/
_curry2(function mergeDeepRight(lObj, rObj) {
  return mergeDeepWithKey(function (k, lVal, rVal) {
    return rVal;
  }, lObj, rObj);
});

module.exports = mergeDeepRight;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");

var mergeDeepWithKey =
/*#__PURE__*/
require("./mergeDeepWithKey.js");
/**
 * Creates a new object with the own properties of the two provided objects.
 * If a key exists in both objects:
 * - and both associated values are also objects then the values will be
 *   recursively merged.
 * - otherwise the provided function is applied to associated values using the
 *   resulting value as the new value associated with the key.
 * If a key only exists in one object, the value will be associated with the key
 * of the resulting object.
 *
 * @func
 * @memberOf R
 * @since v0.24.0
 * @category Object
 * @sig ((a, a) -> a) -> {a} -> {a} -> {a}
 * @param {Function} fn
 * @param {Object} lObj
 * @param {Object} rObj
 * @return {Object}
 * @see R.mergeWith, R.mergeDeepWithKey
 * @example
 *
 *      R.mergeDeepWith(R.concat,
 *                      { a: true, c: { values: [10, 20] }},
 *                      { b: true, c: { values: [15, 35] }});
 *      //=> { a: true, b: true, c: { values: [10, 20, 15, 35] }}
 */


var mergeDeepWith =
/*#__PURE__*/
_curry3(function mergeDeepWith(fn, lObj, rObj) {
  return mergeDeepWithKey(function (k, lVal, rVal) {
    return fn(lVal, rVal);
  }, lObj, rObj);
});

module.exports = mergeDeepWith;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");

var _isObject =
/*#__PURE__*/
require("./internal/_isObject.js");

var mergeWithKey =
/*#__PURE__*/
require("./mergeWithKey.js");
/**
 * Creates a new object with the own properties of the two provided objects.
 * If a key exists in both objects:
 * - and both associated values are also objects then the values will be
 *   recursively merged.
 * - otherwise the provided function is applied to the key and associated values
 *   using the resulting value as the new value associated with the key.
 * If a key only exists in one object, the value will be associated with the key
 * of the resulting object.
 *
 * @func
 * @memberOf R
 * @since v0.24.0
 * @category Object
 * @sig ((String, a, a) -> a) -> {a} -> {a} -> {a}
 * @param {Function} fn
 * @param {Object} lObj
 * @param {Object} rObj
 * @return {Object}
 * @see R.mergeWithKey, R.mergeDeepWith
 * @example
 *
 *      let concatValues = (k, l, r) => k == 'values' ? R.concat(l, r) : r
 *      R.mergeDeepWithKey(concatValues,
 *                         { a: true, c: { thing: 'foo', values: [10, 20] }},
 *                         { b: true, c: { thing: 'bar', values: [15, 35] }});
 *      //=> { a: true, b: true, c: { thing: 'bar', values: [10, 20, 15, 35] }}
 */


var mergeDeepWithKey =
/*#__PURE__*/
_curry3(function mergeDeepWithKey(fn, lObj, rObj) {
  return mergeWithKey(function (k, lVal, rVal) {
    if (_isObject(lVal) && _isObject(rVal)) {
      return mergeDeepWithKey(fn, lVal, rVal);
    } else {
      return fn(k, lVal, rVal);
    }
  }, lObj, rObj);
});

module.exports = mergeDeepWithKey;var _objectAssign =
/*#__PURE__*/
require("./internal/_objectAssign.js");

var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Create a new object with the own properties of the first object merged with
 * the own properties of the second object. If a key exists in both objects,
 * the value from the first object will be used.
 *
 * @func
 * @memberOf R
 * @since v0.26.0
 * @category Object
 * @sig {k: v} -> {k: v} -> {k: v}
 * @param {Object} l
 * @param {Object} r
 * @return {Object}
 * @see R.mergeRight, R.mergeDeepLeft, R.mergeWith, R.mergeWithKey
 * @example
 *
 *      R.mergeLeft({ 'age': 40 }, { 'name': 'fred', 'age': 10 });
 *      //=> { 'name': 'fred', 'age': 40 }
 *
 *      const resetToDefault = R.mergeLeft({x: 0});
 *      resetToDefault({x: 5, y: 2}); //=> {x: 0, y: 2}
 * @symb R.mergeLeft(a, b) = {...b, ...a}
 */


var mergeLeft =
/*#__PURE__*/
_curry2(function mergeLeft(l, r) {
  return _objectAssign({}, r, l);
});

module.exports = mergeLeft;var _objectAssign =
/*#__PURE__*/
require("./internal/_objectAssign.js");

var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Create a new object with the own properties of the first object merged with
 * the own properties of the second object. If a key exists in both objects,
 * the value from the second object will be used.
 *
 * @func
 * @memberOf R
 * @since v0.26.0
 * @category Object
 * @sig {k: v} -> {k: v} -> {k: v}
 * @param {Object} l
 * @param {Object} r
 * @return {Object}
 * @see R.mergeLeft, R.mergeDeepRight, R.mergeWith, R.mergeWithKey
 * @example
 *
 *      R.mergeRight({ 'name': 'fred', 'age': 10 }, { 'age': 40 });
 *      //=> { 'name': 'fred', 'age': 40 }
 *
 *      const withDefaults = R.mergeRight({x: 0, y: 0});
 *      withDefaults({y: 2}); //=> {x: 0, y: 2}
 * @symb R.mergeRight(a, b) = {...a, ...b}
 */


var mergeRight =
/*#__PURE__*/
_curry2(function mergeRight(l, r) {
  return _objectAssign({}, l, r);
});

module.exports = mergeRight;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");

var mergeWithKey =
/*#__PURE__*/
require("./mergeWithKey.js");
/**
 * Creates a new object with the own properties of the two provided objects. If
 * a key exists in both objects, the provided function is applied to the values
 * associated with the key in each object, with the result being used as the
 * value associated with the key in the returned object.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category Object
 * @sig ((a, a) -> a) -> {a} -> {a} -> {a}
 * @param {Function} fn
 * @param {Object} l
 * @param {Object} r
 * @return {Object}
 * @see R.mergeDeepWith, R.merge, R.mergeWithKey
 * @example
 *
 *      R.mergeWith(R.concat,
 *                  { a: true, values: [10, 20] },
 *                  { b: true, values: [15, 35] });
 *      //=> { a: true, b: true, values: [10, 20, 15, 35] }
 */


var mergeWith =
/*#__PURE__*/
_curry3(function mergeWith(fn, l, r) {
  return mergeWithKey(function (_, _l, _r) {
    return fn(_l, _r);
  }, l, r);
});

module.exports = mergeWith;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");

var _has =
/*#__PURE__*/
require("./internal/_has.js");
/**
 * Creates a new object with the own properties of the two provided objects. If
 * a key exists in both objects, the provided function is applied to the key
 * and the values associated with the key in each object, with the result being
 * used as the value associated with the key in the returned object.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category Object
 * @sig ((String, a, a) -> a) -> {a} -> {a} -> {a}
 * @param {Function} fn
 * @param {Object} l
 * @param {Object} r
 * @return {Object}
 * @see R.mergeDeepWithKey, R.merge, R.mergeWith
 * @example
 *
 *      let concatValues = (k, l, r) => k == 'values' ? R.concat(l, r) : r
 *      R.mergeWithKey(concatValues,
 *                     { a: true, thing: 'foo', values: [10, 20] },
 *                     { b: true, thing: 'bar', values: [15, 35] });
 *      //=> { a: true, b: true, thing: 'bar', values: [10, 20, 15, 35] }
 * @symb R.mergeWithKey(f, { x: 1, y: 2 }, { y: 5, z: 3 }) = { x: 1, y: f('y', 2, 5), z: 3 }
 */


var mergeWithKey =
/*#__PURE__*/
_curry3(function mergeWithKey(fn, l, r) {
  var result = {};
  var k;

  for (k in l) {
    if (_has(k, l)) {
      result[k] = _has(k, r) ? fn(k, l[k], r[k]) : l[k];
    }
  }

  for (k in r) {
    if (_has(k, r) && !_has(k, result)) {
      result[k] = r[k];
    }
  }

  return result;
});

module.exports = mergeWithKey;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Returns the smaller of its two arguments.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig Ord a => a -> a -> a
 * @param {*} a
 * @param {*} b
 * @return {*}
 * @see R.minBy, R.max
 * @example
 *
 *      R.min(789, 123); //=> 123
 *      R.min('a', 'b'); //=> 'a'
 */


var min =
/*#__PURE__*/
_curry2(function min(a, b) {
  return b < a ? b : a;
});

module.exports = min;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");
/**
 * Takes a function and two values, and returns whichever value produces the
 * smaller result when passed to the provided function.
 *
 * @func
 * @memberOf R
 * @since v0.8.0
 * @category Relation
 * @sig Ord b => (a -> b) -> a -> a -> a
 * @param {Function} f
 * @param {*} a
 * @param {*} b
 * @return {*}
 * @see R.min, R.maxBy
 * @example
 *
 *      //  square :: Number -> Number
 *      const square = n => n * n;
 *
 *      R.minBy(square, -3, 2); //=> 2
 *
 *      R.reduce(R.minBy(square), Infinity, [3, -5, 4, 1, -2]); //=> 1
 *      R.reduce(R.minBy(square), Infinity, []); //=> Infinity
 */


var minBy =
/*#__PURE__*/
_curry3(function minBy(f, a, b) {
  return f(b) < f(a) ? b : a;
});

module.exports = minBy;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");

var modifyPath =
/*#__PURE__*/
require("./modifyPath.js");
/**
 * Creates a copy of the passed object by applying an `fn` function to the given `prop` property.
 *
 * The function will not be invoked, and the object will not change
 * if its corresponding property does not exist in the object.
 * All non-primitive properties are copied to the new object by reference.
 *
 * @func
 * @memberOf R
 * @since v0.28.0
 * @category Object
 * @sig Idx -> (v -> v) -> {k: v} -> {k: v}
 * @param {String|Number} prop The property to be modified.
 * @param {Function} fn The function to apply to the property.
 * @param {Object} object The object to be transformed.
 * @return {Object} The transformed object.
 * @example
 *
 *      const person = {name: 'James', age: 20, pets: ['dog', 'cat']};
 *      R.modify('age', R.add(1), person); //=> {name: 'James', age: 21, pets: ['dog', 'cat']}
 *      R.modify('pets', R.append('turtle'), person); //=> {name: 'James', age: 20, pets: ['dog', 'cat', 'turtle']}
 */


var modify =
/*#__PURE__*/
_curry3(function modify(prop, fn, object) {
  return modifyPath([prop], fn, object);
});

module.exports = modify;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");

var _isArray =
/*#__PURE__*/
require("./internal/_isArray.js");

var _isObject =
/*#__PURE__*/
require("./internal/_isObject.js");

var _has =
/*#__PURE__*/
require("./internal/_has.js");

var _assoc =
/*#__PURE__*/
require("./internal/_assoc.js");

var _modify =
/*#__PURE__*/
require("./internal/_modify.js");
/**
 * Creates a shallow clone of the passed object by applying an `fn` function
 * to the value at the given path.
 *
 * The function will not be invoked, and the object will not change
 * if its corresponding path does not exist in the object.
 * All non-primitive properties are copied to the new object by reference.
 *
 * @func
 * @memberOf R
 * @since v0.28.0
 * @category Object
 * @sig [Idx] -> (v -> v) -> {k: v} -> {k: v}
 * @param {Array} path The path to be modified.
 * @param {Function} fn The function to apply to the path.
 * @param {Object} object The object to be transformed.
 * @return {Object} The transformed object.
 * @example
 *
 *      const person = {name: 'James', address: { zipCode: '90216' }};
 *      R.modifyPath(['address', 'zipCode'], R.reverse, person); //=> {name: 'James', address: { zipCode: '61209' }}
 *
 *      // Can handle arrays too
 *      const person = {name: 'James', addresses: [{ zipCode: '90216' }]};
 *      R.modifyPath(['addresses', 0, 'zipCode'], R.reverse, person); //=> {name: 'James', addresses: [{ zipCode: '61209' }]}
 */


var modifyPath =
/*#__PURE__*/
_curry3(function modifyPath(path, fn, object) {
  if (!_isObject(object) && !_isArray(object) || path.length === 0) {
    return object;
  }

  var idx = path[0];

  if (!_has(idx, object)) {
    return object;
  }

  if (path.length === 1) {
    return _modify(idx, fn, object);
  }

  var val = modifyPath(Array.prototype.slice.call(path, 1), fn, object[idx]);

  if (val === object[idx]) {
    return object;
  }

  return _assoc(idx, val, object);
});

module.exports = modifyPath;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Divides the first parameter by the second and returns the remainder. Note
 * that this function preserves the JavaScript-style behavior for modulo. For
 * mathematical modulo see [`mathMod`](#mathMod).
 *
 * @func
 * @memberOf R
 * @since v0.1.1
 * @category Math
 * @sig Number -> Number -> Number
 * @param {Number} a The value to the divide.
 * @param {Number} b The pseudo-modulus
 * @return {Number} The result of `b % a`.
 * @see R.mathMod
 * @example
 *
 *      R.modulo(17, 3); //=> 2
 *      // JS behavior:
 *      R.modulo(-17, 3); //=> -2
 *      R.modulo(17, -3); //=> 2
 *
 *      const isOdd = R.modulo(R.__, 2);
 *      isOdd(42); //=> 0
 *      isOdd(21); //=> 1
 */


var modulo =
/*#__PURE__*/
_curry2(function modulo(a, b) {
  return a % b;
});

module.exports = modulo;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");
/**
 * Move an item, at index `from`, to index `to`, in a list of elements.
 * A new list will be created containing the new elements order.
 *
 * @func
 * @memberOf R
 * @since v0.27.1
 * @category List
 * @sig Number -> Number -> [a] -> [a]
 * @param {Number} from The source index
 * @param {Number} to The destination index
 * @param {Array} list The list which will serve to realise the move
 * @return {Array} The new list reordered
 * @example
 *
 *      R.move(0, 2, ['a', 'b', 'c', 'd', 'e', 'f']); //=> ['b', 'c', 'a', 'd', 'e', 'f']
 *      R.move(-1, 0, ['a', 'b', 'c', 'd', 'e', 'f']); //=> ['f', 'a', 'b', 'c', 'd', 'e'] list rotation
 */


var move =
/*#__PURE__*/
_curry3(function (from, to, list) {
  var length = list.length;
  var result = list.slice();
  var positiveFrom = from < 0 ? length + from : from;
  var positiveTo = to < 0 ? length + to : to;
  var item = result.splice(positiveFrom, 1);
  return positiveFrom < 0 || positiveFrom >= list.length || positiveTo < 0 || positiveTo >= list.length ? list : [].concat(result.slice(0, positiveTo)).concat(item).concat(result.slice(positiveTo, list.length));
});

module.exports = move;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Multiplies two numbers. Equivalent to `a * b` but curried.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Math
 * @sig Number -> Number -> Number
 * @param {Number} a The first value.
 * @param {Number} b The second value.
 * @return {Number} The result of `a * b`.
 * @see R.divide
 * @example
 *
 *      const double = R.multiply(2);
 *      const triple = R.multiply(3);
 *      double(3);       //=>  6
 *      triple(4);       //=> 12
 *      R.multiply(2, 5);  //=> 10
 */


var multiply =
/*#__PURE__*/
_curry2(function multiply(a, b) {
  return a * b;
});

module.exports = multiply;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Wraps a function of any arity (including nullary) in a function that accepts
 * exactly `n` parameters. Any extraneous parameters will not be passed to the
 * supplied function.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig Number -> (* -> a) -> (* -> a)
 * @param {Number} n The desired arity of the new function.
 * @param {Function} fn The function to wrap.
 * @return {Function} A new function wrapping `fn`. The new function is guaranteed to be of
 *         arity `n`.
 * @see R.binary, R.unary
 * @example
 *
 *      const takesTwoArgs = (a, b) => [a, b];
 *
 *      takesTwoArgs.length; //=> 2
 *      takesTwoArgs(1, 2); //=> [1, 2]
 *
 *      const takesOneArg = R.nAry(1, takesTwoArgs);
 *      takesOneArg.length; //=> 1
 *      // Only `n` arguments are passed to the wrapped function
 *      takesOneArg(1, 2); //=> [1, undefined]
 * @symb R.nAry(0, f)(a, b) = f()
 * @symb R.nAry(1, f)(a, b) = f(a)
 * @symb R.nAry(2, f)(a, b) = f(a, b)
 */


var nAry =
/*#__PURE__*/
_curry2(function nAry(n, fn) {
  switch (n) {
    case 0:
      return function () {
        return fn.call(this);
      };

    case 1:
      return function (a0) {
        return fn.call(this, a0);
      };

    case 2:
      return function (a0, a1) {
        return fn.call(this, a0, a1);
      };

    case 3:
      return function (a0, a1, a2) {
        return fn.call(this, a0, a1, a2);
      };

    case 4:
      return function (a0, a1, a2, a3) {
        return fn.call(this, a0, a1, a2, a3);
      };

    case 5:
      return function (a0, a1, a2, a3, a4) {
        return fn.call(this, a0, a1, a2, a3, a4);
      };

    case 6:
      return function (a0, a1, a2, a3, a4, a5) {
        return fn.call(this, a0, a1, a2, a3, a4, a5);
      };

    case 7:
      return function (a0, a1, a2, a3, a4, a5, a6) {
        return fn.call(this, a0, a1, a2, a3, a4, a5, a6);
      };

    case 8:
      return function (a0, a1, a2, a3, a4, a5, a6, a7) {
        return fn.call(this, a0, a1, a2, a3, a4, a5, a6, a7);
      };

    case 9:
      return function (a0, a1, a2, a3, a4, a5, a6, a7, a8) {
        return fn.call(this, a0, a1, a2, a3, a4, a5, a6, a7, a8);
      };

    case 10:
      return function (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) {
        return fn.call(this, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
      };

    default:
      throw new Error('First argument to nAry must be a non-negative integer no greater than ten');
  }
});

module.exports = nAry;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");
/**
 * Negates its argument.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Math
 * @sig Number -> Number
 * @param {Number} n
 * @return {Number}
 * @example
 *
 *      R.negate(42); //=> -42
 */


var negate =
/*#__PURE__*/
_curry1(function negate(n) {
  return -n;
});

module.exports = negate;var _complement =
/*#__PURE__*/
require("./internal/_complement.js");

var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var all =
/*#__PURE__*/
require("./all.js");
/**
 * Returns `true` if no elements of the list match the predicate, `false`
 * otherwise.
 *
 * Dispatches to the `all` method of the second argument, if present.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.12.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> Boolean
 * @param {Function} fn The predicate function.
 * @param {Array} list The array to consider.
 * @return {Boolean} `true` if the predicate is not satisfied by every element, `false` otherwise.
 * @see R.all, R.any
 * @example
 *
 *      const isEven = n => n % 2 === 0;
 *      const isOdd = n => n % 2 !== 0;
 *
 *      R.none(isEven, [1, 3, 5, 7, 9, 11]); //=> true
 *      R.none(isOdd, [1, 3, 5, 7, 8, 11]); //=> false
 */


var none =
/*#__PURE__*/
_curry2(function none(fn, input) {
  return all(_complement(fn), input);
});

module.exports = none;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");
/**
 * A function that returns the `!` of its argument. It will return `true` when
 * passed false-y value, and `false` when passed a truth-y one.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Logic
 * @sig * -> Boolean
 * @param {*} a any value
 * @return {Boolean} the logical inverse of passed argument.
 * @see R.complement
 * @example
 *
 *      R.not(true); //=> false
 *      R.not(false); //=> true
 *      R.not(0); //=> true
 *      R.not(1); //=> false
 */


var not =
/*#__PURE__*/
_curry1(function not(a) {
  return !a;
});

module.exports = not;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _isString =
/*#__PURE__*/
require("./internal/_isString.js");
/**
 * Returns the nth element of the given list or string. If n is negative the
 * element at index length + n is returned.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig Number -> [a] -> a | Undefined
 * @sig Number -> String -> String
 * @param {Number} offset
 * @param {*} list
 * @return {*}
 * @example
 *
 *      const list = ['foo', 'bar', 'baz', 'quux'];
 *      R.nth(1, list); //=> 'bar'
 *      R.nth(-1, list); //=> 'quux'
 *      R.nth(-99, list); //=> undefined
 *
 *      R.nth(2, 'abc'); //=> 'c'
 *      R.nth(3, 'abc'); //=> ''
 * @symb R.nth(-1, [a, b, c]) = c
 * @symb R.nth(0, [a, b, c]) = a
 * @symb R.nth(1, [a, b, c]) = b
 */


var nth =
/*#__PURE__*/
_curry2(function nth(offset, list) {
  var idx = offset < 0 ? list.length + offset : offset;
  return _isString(list) ? list.charAt(idx) : list[idx];
});

module.exports = nth;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var curryN =
/*#__PURE__*/
require("./curryN.js");

var nth =
/*#__PURE__*/
require("./nth.js");
/**
 * Returns a function which returns its nth argument.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Function
 * @sig Number -> *... -> *
 * @param {Number} n
 * @return {Function}
 * @example
 *
 *      R.nthArg(1)('a', 'b', 'c'); //=> 'b'
 *      R.nthArg(-1)('a', 'b', 'c'); //=> 'c'
 * @symb R.nthArg(-1)(a, b, c) = c
 * @symb R.nthArg(0)(a, b, c) = a
 * @symb R.nthArg(1)(a, b, c) = b
 */


var nthArg =
/*#__PURE__*/
_curry1(function nthArg(n) {
  var arity = n < 0 ? 1 : n + 1;
  return curryN(arity, function () {
    return nth(n, arguments);
  });
});

module.exports = nthArg;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");
/**
 * `o` is a curried composition function that returns a unary function.
 * Like [`compose`](#compose), `o` performs right-to-left function composition.
 * Unlike [`compose`](#compose), the rightmost function passed to `o` will be
 * invoked with only one argument. Also, unlike [`compose`](#compose), `o` is
 * limited to accepting only 2 unary functions. The name o was chosen because
 * of its similarity to the mathematical composition operator ∘.
 *
 * @func
 * @memberOf R
 * @since v0.24.0
 * @category Function
 * @sig (b -> c) -> (a -> b) -> a -> c
 * @param {Function} f
 * @param {Function} g
 * @return {Function}
 * @see R.compose, R.pipe
 * @example
 *
 *      const classyGreeting = name => "The name's " + name.last + ", " + name.first + " " + name.last
 *      const yellGreeting = R.o(R.toUpper, classyGreeting);
 *      yellGreeting({first: 'James', last: 'Bond'}); //=> "THE NAME'S BOND, JAMES BOND"
 *
 *      R.o(R.multiply(10), R.add(10))(-4) //=> 60
 *
 * @symb R.o(f, g, x) = f(g(x))
 */


var o =
/*#__PURE__*/
_curry3(function o(f, g, x) {
  return f(g(x));
});

module.exports = o;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Creates an object containing a single key:value pair.
 *
 * @func
 * @memberOf R
 * @since v0.18.0
 * @category Object
 * @sig String -> a -> {String:a}
 * @param {String} key
 * @param {*} val
 * @return {Object}
 * @see R.pair
 * @example
 *
 *      const matchPhrases = R.compose(
 *        R.objOf('must'),
 *        R.map(R.objOf('match_phrase'))
 *      );
 *      matchPhrases(['foo', 'bar', 'baz']); //=> {must: [{match_phrase: 'foo'}, {match_phrase: 'bar'}, {match_phrase: 'baz'}]}
 */


var objOf =
/*#__PURE__*/
_curry2(function objOf(key, val) {
  var obj = {};
  obj[key] = val;
  return obj;
});

module.exports = objOf;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var _of =
/*#__PURE__*/
require("./internal/_of.js");
/**
 * Returns a singleton array containing the value provided.
 *
 * Note this `of` is different from the ES6 `of`; See
 * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/of
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category Function
 * @sig a -> [a]
 * @param {*} x any value
 * @return {Array} An array wrapping `x`.
 * @example
 *
 *      R.of(null); //=> [null]
 *      R.of([42]); //=> [[42]]
 */


var of =
/*#__PURE__*/
_curry1(_of);

module.exports = of;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Returns a partial copy of an object omitting the keys specified.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @sig [String] -> {String: *} -> {String: *}
 * @param {Array} names an array of String property names to omit from the new object
 * @param {Object} obj The object to copy from
 * @return {Object} A new object with properties from `names` not on it.
 * @see R.pick
 * @example
 *
 *      R.omit(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, c: 3}
 */


var omit =
/*#__PURE__*/
_curry2(function omit(names, obj) {
  var result = {};
  var index = {};
  var idx = 0;
  var len = names.length;

  while (idx < len) {
    index[names[idx]] = 1;
    idx += 1;
  }

  for (var prop in obj) {
    if (!index.hasOwnProperty(prop)) {
      result[prop] = obj[prop];
    }
  }

  return result;
});

module.exports = omit;var curryN =
/*#__PURE__*/
require("./internal/_curryN.js");
/**
 * Takes a binary function `f`, a unary function `g`, and two values.
 * Applies `g` to each value, then applies the result of each to `f`.
 *
 * Also known as the P combinator.
 *
 * @func
 * @memberOf R
 * @since v0.28.0
 * @category Function
 * @sig ((a, a) -> b) -> (c -> a) -> c -> c -> b
 * @param {Function} f a binary function
 * @param {Function} g a unary function
 * @param {any} a any value
 * @param {any} b any value
 * @return {any} The result of `f`
 * @example
 *
 *      const eqBy = R.on((a, b) => a === b);
 *      eqBy(R.prop('a'), {b:0, a:1}, {a:1}) //=> true;
 *
 *      const containsInsensitive = R.on(R.contains, R.toLower);
 *      containsInsensitive('o', 'FOO'); //=> true
 * @symb R.on(f, g, a, b) = f(g(a), g(b))
 */


var on =
/*#__PURE__*/
curryN(4, [], function on(f, g, a, b) {
  return f(g(a), g(b));
});
module.exports = on;var _arity =
/*#__PURE__*/
require("./internal/_arity.js");

var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");
/**
 * Accepts a function `fn` and returns a function that guards invocation of
 * `fn` such that `fn` can only ever be called once, no matter how many times
 * the returned function is invoked. The first value calculated is returned in
 * subsequent invocations.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig (a... -> b) -> (a... -> b)
 * @param {Function} fn The function to wrap in a call-only-once wrapper.
 * @return {Function} The wrapped function.
 * @example
 *
 *      const addOneOnce = R.once(x => x + 1);
 *      addOneOnce(10); //=> 11
 *      addOneOnce(addOneOnce(50)); //=> 11
 */


var once =
/*#__PURE__*/
_curry1(function once(fn) {
  var called = false;
  var result;
  return _arity(fn.length, function () {
    if (called) {
      return result;
    }

    called = true;
    result = fn.apply(this, arguments);
    return result;
  });
});

module.exports = once;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Returns the first argument if it is truthy, otherwise the second argument.
 * Acts as the boolean `or` statement if both inputs are `Boolean`s.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Logic
 * @sig a -> b -> a | b
 * @param {Any} a
 * @param {Any} b
 * @return {Any}
 * @see R.either, R.and
 * @example
 *
 *      R.or(true, true); //=> true
 *      R.or(true, false); //=> true
 *      R.or(false, true); //=> true
 *      R.or(false, false); //=> false
 */


var or =
/*#__PURE__*/
_curry2(function or(a, b) {
  return a || b;
});

module.exports = or;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _assertPromise =
/*#__PURE__*/
require("./internal/_assertPromise.js");
/**
 * Returns the result of applying the onFailure function to the value inside
 * a failed promise. This is useful for handling rejected promises
 * inside function compositions.
 *
 * @func
 * @memberOf R
 * @since v0.26.0
 * @category Function
 * @sig (e -> b) -> (Promise e a) -> (Promise e b)
 * @sig (e -> (Promise f b)) -> (Promise e a) -> (Promise f b)
 * @param {Function} onFailure The function to apply. Can return a value or a promise of a value.
 * @param {Promise} p
 * @return {Promise} The result of calling `p.then(null, onFailure)`
 * @see R.andThen
 * @example
 *
 *      const failedFetch = id => Promise.reject('bad ID');
 *      const useDefault = () => ({ firstName: 'Bob', lastName: 'Loblaw' });
 *
 *      //recoverFromFailure :: String -> Promise ({ firstName, lastName })
 *      const recoverFromFailure = R.pipe(
 *        failedFetch,
 *        R.otherwise(useDefault),
 *        R.andThen(R.pick(['firstName', 'lastName'])),
 *      );
 *      recoverFromFailure(12345).then(console.log);
 */


var otherwise =
/*#__PURE__*/
_curry2(function otherwise(f, p) {
  _assertPromise('otherwise', p);

  return p.then(null, f);
});

module.exports = otherwise;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js"); // `Identity` is a functor that holds a single value, where `map` simply
// transforms the held value with the provided function.


var Identity = function (x) {
  return {
    value: x,
    map: function (f) {
      return Identity(f(x));
    }
  };
};
/**
 * Returns the result of "setting" the portion of the given data structure
 * focused by the given lens to the result of applying the given function to
 * the focused value.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category Object
 * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
 * @sig Lens s a -> (a -> a) -> s -> s
 * @param {Lens} lens
 * @param {*} v
 * @param {*} x
 * @return {*}
 * @see R.view, R.set, R.lens, R.lensIndex, R.lensProp, R.lensPath
 * @example
 *
 *      const headLens = R.lensIndex(0);
 *
 *      R.over(headLens, R.toUpper, ['foo', 'bar', 'baz']); //=> ['FOO', 'bar', 'baz']
 */


var over =
/*#__PURE__*/
_curry3(function over(lens, f, x) {
  // The value returned by the getter function is first transformed with `f`,
  // then set as the value of an `Identity`. This is then mapped over with the
  // setter function of the lens.
  return lens(function (y) {
    return Identity(f(y));
  })(x).value;
});

module.exports = over;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Takes two arguments, `fst` and `snd`, and returns `[fst, snd]`.
 *
 * @func
 * @memberOf R
 * @since v0.18.0
 * @category List
 * @sig a -> b -> (a,b)
 * @param {*} fst
 * @param {*} snd
 * @return {Array}
 * @see R.objOf, R.of
 * @example
 *
 *      R.pair('foo', 'bar'); //=> ['foo', 'bar']
 */


var pair =
/*#__PURE__*/
_curry2(function pair(fst, snd) {
  return [fst, snd];
});

module.exports = pair;var _concat =
/*#__PURE__*/
require("./internal/_concat.js");

var _createPartialApplicator =
/*#__PURE__*/
require("./internal/_createPartialApplicator.js");
/**
 * Takes a function `f` and a list of arguments, and returns a function `g`.
 * When applied, `g` returns the result of applying `f` to the arguments
 * provided initially followed by the arguments provided to `g`.
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category Function
 * @sig ((a, b, c, ..., n) -> x) -> [a, b, c, ...] -> ((d, e, f, ..., n) -> x)
 * @param {Function} f
 * @param {Array} args
 * @return {Function}
 * @see R.partialRight, R.curry
 * @example
 *
 *      const multiply2 = (a, b) => a * b;
 *      const double = R.partial(multiply2, [2]);
 *      double(3); //=> 6
 *
 *      const greet = (salutation, title, firstName, lastName) =>
 *        salutation + ', ' + title + ' ' + firstName + ' ' + lastName + '!';
 *
 *      const sayHello = R.partial(greet, ['Hello']);
 *      const sayHelloToMs = R.partial(sayHello, ['Ms.']);
 *      sayHelloToMs('Jane', 'Jones'); //=> 'Hello, Ms. Jane Jones!'
 * @symb R.partial(f, [a, b])(c, d) = f(a, b, c, d)
 */


var partial =
/*#__PURE__*/
_createPartialApplicator(_concat);

module.exports = partial;var mergeDeepRight =
/*#__PURE__*/
require("./mergeDeepRight.js");

var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Takes a function `f` and an object, and returns a function `g`.
 * When applied, `g` returns the result of applying `f` to the object
 * provided initially merged deeply (right) with the object provided as an argument to `g`.
 *
 * @func
 * @memberOf R
 * @since v0.28.0
 * @category Function
 * @sig (({ a, b, c, ..., n }) -> x) -> { a, b, c, ...} -> ({ d, e, f, ..., n } -> x)
 * @param {Function} f
 * @param {Object} props
 * @return {Function}
 * @see R.partial, R.partialRight, R.curry, R.mergeDeepRight
 * @example
 *
 *      const multiply2 = ({ a, b }) => a * b;
 *      const double = R.partialObject(multiply2, { a: 2 });
 *      double({ b: 2 }); //=> 4
 *
 *      const greet = ({ salutation, title, firstName, lastName }) =>
 *        salutation + ', ' + title + ' ' + firstName + ' ' + lastName + '!';
 *
 *      const sayHello = R.partialObject(greet, { salutation: 'Hello' });
 *      const sayHelloToMs = R.partialObject(sayHello, { title: 'Ms.' });
 *      sayHelloToMs({ firstName: 'Jane', lastName: 'Jones' }); //=> 'Hello, Ms. Jane Jones!'
 * @symb R.partialObject(f, { a, b })({ c, d }) = f({ a, b, c, d })
 */


module.exports =
/*#__PURE__*/
_curry2((f, o) => props => f.call(this, mergeDeepRight(o, props)));var _concat =
/*#__PURE__*/
require("./internal/_concat.js");

var _createPartialApplicator =
/*#__PURE__*/
require("./internal/_createPartialApplicator.js");

var flip =
/*#__PURE__*/
require("./flip.js");
/**
 * Takes a function `f` and a list of arguments, and returns a function `g`.
 * When applied, `g` returns the result of applying `f` to the arguments
 * provided to `g` followed by the arguments provided initially.
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category Function
 * @sig ((a, b, c, ..., n) -> x) -> [d, e, f, ..., n] -> ((a, b, c, ...) -> x)
 * @param {Function} f
 * @param {Array} args
 * @return {Function}
 * @see R.partial
 * @example
 *
 *      const greet = (salutation, title, firstName, lastName) =>
 *        salutation + ', ' + title + ' ' + firstName + ' ' + lastName + '!';
 *
 *      const greetMsJaneJones = R.partialRight(greet, ['Ms.', 'Jane', 'Jones']);
 *
 *      greetMsJaneJones('Hello'); //=> 'Hello, Ms. Jane Jones!'
 * @symb R.partialRight(f, [a, b])(c, d) = f(c, d, a, b)
 */


var partialRight =
/*#__PURE__*/
_createPartialApplicator(
/*#__PURE__*/
flip(_concat));

module.exports = partialRight;var filter =
/*#__PURE__*/
require("./filter.js");

var juxt =
/*#__PURE__*/
require("./juxt.js");

var reject =
/*#__PURE__*/
require("./reject.js");
/**
 * Takes a predicate and a list or other `Filterable` object and returns the
 * pair of filterable objects of the same type of elements which do and do not
 * satisfy, the predicate, respectively. Filterable objects include plain objects or any object
 * that has a filter method such as `Array`.
 *
 * @func
 * @memberOf R
 * @since v0.1.4
 * @category List
 * @sig Filterable f => (a -> Boolean) -> f a -> [f a, f a]
 * @param {Function} pred A predicate to determine which side the element belongs to.
 * @param {Array} filterable the list (or other filterable) to partition.
 * @return {Array} An array, containing first the subset of elements that satisfy the
 *         predicate, and second the subset of elements that do not satisfy.
 * @see R.filter, R.reject
 * @example
 *
 *      R.partition(R.includes('s'), ['sss', 'ttt', 'foo', 'bars']);
 *      // => [ [ 'sss', 'bars' ],  [ 'ttt', 'foo' ] ]
 *
 *      R.partition(R.includes('s'), { a: 'sss', b: 'ttt', foo: 'bars' });
 *      // => [ { a: 'sss', foo: 'bars' }, { b: 'ttt' }  ]
 */


var partition =
/*#__PURE__*/
juxt([filter, reject]);
module.exports = partition;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var paths =
/*#__PURE__*/
require("./paths.js");
/**
 * Retrieve the value at a given path.
 *
 * @func
 * @memberOf R
 * @since v0.2.0
 * @category Object
 * @typedefn Idx = String | Int | Symbol
 * @sig [Idx] -> {a} -> a | Undefined
 * @param {Array} path The path to use.
 * @param {Object} obj The object to retrieve the nested property from.
 * @return {*} The data at `path`.
 * @see R.prop, R.nth
 * @example
 *
 *      R.path(['a', 'b'], {a: {b: 2}}); //=> 2
 *      R.path(['a', 'b'], {c: {b: 2}}); //=> undefined
 *      R.path(['a', 'b', 0], {a: {b: [1, 2, 3]}}); //=> 1
 *      R.path(['a', 'b', -2], {a: {b: [1, 2, 3]}}); //=> 2
 */


var path =
/*#__PURE__*/
_curry2(function path(pathAr, obj) {
  return paths([pathAr], obj)[0];
});

module.exports = path;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");

var equals =
/*#__PURE__*/
require("./equals.js");

var path =
/*#__PURE__*/
require("./path.js");
/**
 * Determines whether a nested path on an object has a specific value, in
 * [`R.equals`](#equals) terms. Most likely used to filter a list.
 *
 * @func
 * @memberOf R
 * @since v0.7.0
 * @category Relation
 * @typedefn Idx = String | Int | Symbol
 * @sig [Idx] -> a -> {a} -> Boolean
 * @param {Array} path The path of the nested property to use
 * @param {*} val The value to compare the nested property with
 * @param {Object} obj The object to check the nested property in
 * @return {Boolean} `true` if the value equals the nested object property,
 *         `false` otherwise.
 * @example
 *
 *      const user1 = { address: { zipCode: 90210 } };
 *      const user2 = { address: { zipCode: 55555 } };
 *      const user3 = { name: 'Bob' };
 *      const users = [ user1, user2, user3 ];
 *      const isFamous = R.pathEq(['address', 'zipCode'], 90210);
 *      R.filter(isFamous, users); //=> [ user1 ]
 */


var pathEq =
/*#__PURE__*/
_curry3(function pathEq(_path, val, obj) {
  return equals(path(_path, obj), val);
});

module.exports = pathEq;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");

var defaultTo =
/*#__PURE__*/
require("./defaultTo.js");

var path =
/*#__PURE__*/
require("./path.js");
/**
 * If the given, non-null object has a value at the given path, returns the
 * value at that path. Otherwise returns the provided default value.
 *
 * @func
 * @memberOf R
 * @since v0.18.0
 * @category Object
 * @typedefn Idx = String | Int | Symbol
 * @sig a -> [Idx] -> {a} -> a
 * @param {*} d The default value.
 * @param {Array} p The path to use.
 * @param {Object} obj The object to retrieve the nested property from.
 * @return {*} The data at `path` of the supplied object or the default value.
 * @example
 *
 *      R.pathOr('N/A', ['a', 'b'], {a: {b: 2}}); //=> 2
 *      R.pathOr('N/A', ['a', 'b'], {c: {b: 2}}); //=> "N/A"
 */


var pathOr =
/*#__PURE__*/
_curry3(function pathOr(d, p, obj) {
  return defaultTo(d, path(p, obj));
});

module.exports = pathOr;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");

var path =
/*#__PURE__*/
require("./path.js");
/**
 * Returns `true` if the specified object property at given path satisfies the
 * given predicate; `false` otherwise.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category Logic
 * @typedefn Idx = String | Int | Symbol
 * @sig (a -> Boolean) -> [Idx] -> {a} -> Boolean
 * @param {Function} pred
 * @param {Array} propPath
 * @param {*} obj
 * @return {Boolean}
 * @see R.propSatisfies, R.path
 * @example
 *
 *      R.pathSatisfies(y => y > 0, ['x', 'y'], {x: {y: 2}}); //=> true
 *      R.pathSatisfies(R.is(Object), [], {x: {y: 2}}); //=> true
 */


var pathSatisfies =
/*#__PURE__*/
_curry3(function pathSatisfies(pred, propPath, obj) {
  return pred(path(propPath, obj));
});

module.exports = pathSatisfies;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _isInteger =
/*#__PURE__*/
require("./internal/_isInteger.js");

var nth =
/*#__PURE__*/
require("./nth.js");
/**
 * Retrieves the values at given paths of an object.
 *
 * @func
 * @memberOf R
 * @since v0.27.1
 * @category Object
 * @typedefn Idx = [String | Int | Symbol]
 * @sig [Idx] -> {a} -> [a | Undefined]
 * @param {Array} pathsArray The array of paths to be fetched.
 * @param {Object} obj The object to retrieve the nested properties from.
 * @return {Array} A list consisting of values at paths specified by "pathsArray".
 * @see R.path
 * @example
 *
 *      R.paths([['a', 'b'], ['p', 0, 'q']], {a: {b: 2}, p: [{q: 3}]}); //=> [2, 3]
 *      R.paths([['a', 'b'], ['p', 'r']], {a: {b: 2}, p: [{q: 3}]}); //=> [2, undefined]
 */


var paths =
/*#__PURE__*/
_curry2(function paths(pathsArray, obj) {
  return pathsArray.map(function (paths) {
    var val = obj;
    var idx = 0;
    var p;

    while (idx < paths.length) {
      if (val == null) {
        return;
      }

      p = paths[idx];
      val = _isInteger(p) ? nth(p, val) : val[p];
      idx += 1;
    }

    return val;
  });
});

module.exports = paths;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Returns a partial copy of an object containing only the keys specified. If
 * the key does not exist, the property is ignored.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @sig [k] -> {k: v} -> {k: v}
 * @param {Array} names an array of String property names to copy onto a new object
 * @param {Object} obj The object to copy from
 * @return {Object} A new object with only properties from `names` on it.
 * @see R.omit, R.props
 * @example
 *
 *      R.pick(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, d: 4}
 *      R.pick(['a', 'e', 'f'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1}
 */


var pick =
/*#__PURE__*/
_curry2(function pick(names, obj) {
  var result = {};
  var idx = 0;

  while (idx < names.length) {
    if (names[idx] in obj) {
      result[names[idx]] = obj[names[idx]];
    }

    idx += 1;
  }

  return result;
});

module.exports = pick;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Similar to `pick` except that this one includes a `key: undefined` pair for
 * properties that don't exist.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @sig [k] -> {k: v} -> {k: v}
 * @param {Array} names an array of String property names to copy onto a new object
 * @param {Object} obj The object to copy from
 * @return {Object} A new object with only properties from `names` on it.
 * @see R.pick
 * @example
 *
 *      R.pickAll(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, d: 4}
 *      R.pickAll(['a', 'e', 'f'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, e: undefined, f: undefined}
 */


var pickAll =
/*#__PURE__*/
_curry2(function pickAll(names, obj) {
  var result = {};
  var idx = 0;
  var len = names.length;

  while (idx < len) {
    var name = names[idx];
    result[name] = obj[name];
    idx += 1;
  }

  return result;
});

module.exports = pickAll;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Returns a partial copy of an object containing only the keys that satisfy
 * the supplied predicate.
 *
 * @func
 * @memberOf R
 * @since v0.8.0
 * @category Object
 * @sig ((v, k) -> Boolean) -> {k: v} -> {k: v}
 * @param {Function} pred A predicate to determine whether or not a key
 *        should be included on the output object.
 * @param {Object} obj The object to copy from
 * @return {Object} A new object with only properties that satisfy `pred`
 *         on it.
 * @see R.pick, R.filter
 * @example
 *
 *      const isUpperCase = (val, key) => key.toUpperCase() === key;
 *      R.pickBy(isUpperCase, {a: 1, b: 2, A: 3, B: 4}); //=> {A: 3, B: 4}
 */


var pickBy =
/*#__PURE__*/
_curry2(function pickBy(test, obj) {
  var result = {};

  for (var prop in obj) {
    if (test(obj[prop], prop, obj)) {
      result[prop] = obj[prop];
    }
  }

  return result;
});

module.exports = pickBy;var _arity =
/*#__PURE__*/
require("./internal/_arity.js");

var _pipe =
/*#__PURE__*/
require("./internal/_pipe.js");

var reduce =
/*#__PURE__*/
require("./reduce.js");

var tail =
/*#__PURE__*/
require("./tail.js");
/**
 * Performs left-to-right function composition. The first argument may have
 * any arity; the remaining arguments must be unary.
 *
 * In some libraries this function is named `sequence`.
 *
 * **Note:** The result of pipe is not automatically curried.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig (((a, b, ..., n) -> o), (o -> p), ..., (x -> y), (y -> z)) -> ((a, b, ..., n) -> z)
 * @param {...Function} functions
 * @return {Function}
 * @see R.compose
 * @example
 *
 *      const f = R.pipe(Math.pow, R.negate, R.inc);
 *
 *      f(3, 4); // -(3^4) + 1
 * @symb R.pipe(f, g, h)(a, b) = h(g(f(a, b)))
 * @symb R.pipe(f, g, h)(a)(b) = h(g(f(a)))(b)
 */


function pipe() {
  if (arguments.length === 0) {
    throw new Error('pipe requires at least one argument');
  }

  return _arity(arguments[0].length, reduce(_pipe, arguments[0], tail(arguments)));
}

module.exports = pipe;var _arity =
/*#__PURE__*/
require("./internal/_arity.js");

var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var head =
/*#__PURE__*/
require("./head.js");

var _reduce =
/*#__PURE__*/
require("./internal/_reduce.js");

var tail =
/*#__PURE__*/
require("./tail.js");

var identity =
/*#__PURE__*/
require("./identity.js");
/**
 * Performs left-to-right function composition using transforming function. The first function may have
 * any arity; the remaining functions must be unary.
 *
 * **Note:** The result of pipeWith is not automatically curried. Transforming function is not used on the
 * first argument.
 *
 * @func
 * @memberOf R
 * @since v0.26.0
 * @category Function
 * @sig ((* -> *), [((a, b, ..., n) -> o), (o -> p), ..., (x -> y), (y -> z)]) -> ((a, b, ..., n) -> z)
 * @param {Function} transformer The transforming function
 * @param {Array} functions The functions to pipe
 * @return {Function}
 * @see R.composeWith, R.pipe
 * @example
 *
 *      const pipeWhileNotNil = R.pipeWith((f, res) => R.isNil(res) ? res : f(res));
 *      const f = pipeWhileNotNil([Math.pow, R.negate, R.inc])
 *
 *      f(3, 4); // -(3^4) + 1
 * @symb R.pipeWith(f)([g, h, i])(...args) = f(i, f(h, g(...args)))
 */


var pipeWith =
/*#__PURE__*/
_curry2(function pipeWith(xf, list) {
  if (list.length <= 0) {
    return identity;
  }

  var headList = head(list);
  var tailList = tail(list);
  return _arity(headList.length, function () {
    return _reduce(function (result, f) {
      return xf.call(this, f, result);
    }, headList.apply(this, arguments), tailList);
  });
});

module.exports = pipeWith;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var map =
/*#__PURE__*/
require("./map.js");

var prop =
/*#__PURE__*/
require("./prop.js");
/**
 * Returns a new list by plucking the same named property off all objects in
 * the list supplied.
 *
 * `pluck` will work on
 * any [functor](https://github.com/fantasyland/fantasy-land#functor) in
 * addition to arrays, as it is equivalent to `R.map(R.prop(k), f)`.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig Functor f => k -> f {k: v} -> f v
 * @param {Number|String} key The key name to pluck off of each object.
 * @param {Array} f The array or functor to consider.
 * @return {Array} The list of values for the given key.
 * @see R.project, R.prop, R.props
 * @example
 *
 *      var getAges = R.pluck('age');
 *      getAges([{name: 'fred', age: 29}, {name: 'wilma', age: 27}]); //=> [29, 27]
 *
 *      R.pluck(0, [[1, 2], [3, 4]]);               //=> [1, 3]
 *      R.pluck('val', {a: {val: 3}, b: {val: 5}}); //=> {a: 3, b: 5}
 * @symb R.pluck('x', [{x: 1, y: 2}, {x: 3, y: 4}, {x: 5, y: 6}]) = [1, 3, 5]
 * @symb R.pluck(0, [[1, 2], [3, 4], [5, 6]]) = [1, 3, 5]
 */


var pluck =
/*#__PURE__*/
_curry2(function pluck(p, list) {
  return map(prop(p), list);
});

module.exports = pluck;var _concat =
/*#__PURE__*/
require("./internal/_concat.js");

var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Returns a new list with the given element at the front, followed by the
 * contents of the list.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig a -> [a] -> [a]
 * @param {*} el The item to add to the head of the output list.
 * @param {Array} list The array to add to the tail of the output list.
 * @return {Array} A new array.
 * @see R.append
 * @example
 *
 *      R.prepend('fee', ['fi', 'fo', 'fum']); //=> ['fee', 'fi', 'fo', 'fum']
 */


var prepend =
/*#__PURE__*/
_curry2(function prepend(el, list) {
  return _concat([el], list);
});

module.exports = prepend;var multiply =
/*#__PURE__*/
require("./multiply.js");

var reduce =
/*#__PURE__*/
require("./reduce.js");
/**
 * Multiplies together all the elements of a list.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Math
 * @sig [Number] -> Number
 * @param {Array} list An array of numbers
 * @return {Number} The product of all the numbers in the list.
 * @see R.reduce
 * @example
 *
 *      R.product([2,4,6,8,100,1]); //=> 38400
 */


var product =
/*#__PURE__*/
reduce(multiply, 1);
module.exports = product;var _map =
/*#__PURE__*/
require("./internal/_map.js");

var identity =
/*#__PURE__*/
require("./identity.js");

var pickAll =
/*#__PURE__*/
require("./pickAll.js");

var useWith =
/*#__PURE__*/
require("./useWith.js");
/**
 * Reasonable analog to SQL `select` statement.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @category Relation
 * @sig [k] -> [{k: v}] -> [{k: v}]
 * @param {Array} props The property names to project
 * @param {Array} objs The objects to query
 * @return {Array} An array of objects with just the `props` properties.
 * @see R.pluck, R.props, R.prop
 * @example
 *
 *      const abby = {name: 'Abby', age: 7, hair: 'blond', grade: 2};
 *      const fred = {name: 'Fred', age: 12, hair: 'brown', grade: 7};
 *      const kids = [abby, fred];
 *      R.project(['name', 'grade'], kids); //=> [{name: 'Abby', grade: 2}, {name: 'Fred', grade: 7}]
 */


var project =
/*#__PURE__*/
useWith(_map, [pickAll, identity]); // passing `identity` gives correct arity

module.exports = project;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");

var _dispatchable =
/*#__PURE__*/
require("./internal/_dispatchable.js");

var _promap =
/*#__PURE__*/
require("./internal/_promap.js");

var _xpromap =
/*#__PURE__*/
require("./internal/_xpromap.js");
/**
 * Takes two functions as pre- and post- processors respectively for a third function,
 * i.e. `promap(f, g, h)(x) === g(h(f(x)))`.
 *
 * Dispatches to the `promap` method of the third argument, if present,
 * according to the [FantasyLand Profunctor spec](https://github.com/fantasyland/fantasy-land#profunctor).
 *
 * Acts as a transducer if a transformer is given in profunctor position.
 *
 * @func
 * @memberOf R
 * @since v0.28.0
 * @category Function
 * @sig (a -> b) -> (c -> d) -> (b -> c) -> (a -> d)
 * @sig Profunctor p => (a -> b) -> (c -> d) -> p b c -> p a d
 * @param {Function} f The preprocessor function, a -> b
 * @param {Function} g The postprocessor function, c -> d
 * @param {Profunctor} profunctor The profunctor instance to be promapped, e.g. b -> c
 * @return {Profunctor} The new profunctor instance, e.g. a -> d
 * @see R.transduce
 * @example
 *
 *      const decodeChar = R.promap(s => s.charCodeAt(), String.fromCharCode, R.add(-8))
 *      const decodeString = R.promap(R.split(''), R.join(''), R.map(decodeChar))
 *      decodeString("ziuli") //=> "ramda"
 *
 * @symb R.promap(f, g, h) = x => g(h(f(x)))
 * @symb R.promap(f, g, profunctor) = profunctor.promap(f, g)
 */


var promap =
/*#__PURE__*/
_curry3(
/*#__PURE__*/
_dispatchable(['fantasy-land/promap', 'promap'], _xpromap, _promap));

module.exports = promap;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _isInteger =
/*#__PURE__*/
require("./internal/_isInteger.js");

var nth =
/*#__PURE__*/
require("./nth.js");
/**
 * Returns a function that when supplied an object returns the indicated
 * property of that object, if it exists.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @typedefn Idx = String | Int | Symbol
 * @sig Idx -> {s: a} -> a | Undefined
 * @param {String|Number} p The property name or array index
 * @param {Object} obj The object to query
 * @return {*} The value at `obj.p`.
 * @see R.path, R.props, R.pluck, R.project, R.nth
 * @example
 *
 *      R.prop('x', {x: 100}); //=> 100
 *      R.prop('x', {}); //=> undefined
 *      R.prop(0, [100]); //=> 100
 *      R.compose(R.inc, R.prop('x'))({ x: 3 }) //=> 4
 */


var prop =
/*#__PURE__*/
_curry2(function prop(p, obj) {
  if (obj == null) {
    return;
  }

  return _isInteger(p) ? nth(p, obj) : obj[p];
});

module.exports = prop;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");

var prop =
/*#__PURE__*/
require("./prop.js");

var equals =
/*#__PURE__*/
require("./equals.js");
/**
 * Returns `true` if the specified object property is equal, in
 * [`R.equals`](#equals) terms, to the given value; `false` otherwise.
 * You can test multiple properties with [`R.whereEq`](#whereEq).
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig String -> a -> Object -> Boolean
 * @param {String} name
 * @param {*} val
 * @param {*} obj
 * @return {Boolean}
 * @see R.whereEq, R.propSatisfies, R.equals
 * @example
 *
 *      const abby = {name: 'Abby', age: 7, hair: 'blond'};
 *      const fred = {name: 'Fred', age: 12, hair: 'brown'};
 *      const rusty = {name: 'Rusty', age: 10, hair: 'brown'};
 *      const alois = {name: 'Alois', age: 15, disposition: 'surly'};
 *      const kids = [abby, fred, rusty, alois];
 *      const hasBrownHair = R.propEq('hair', 'brown');
 *      R.filter(hasBrownHair, kids); //=> [fred, rusty]
 */


var propEq =
/*#__PURE__*/
_curry3(function propEq(name, val, obj) {
  return equals(val, prop(name, obj));
});

module.exports = propEq;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");

var prop =
/*#__PURE__*/
require("./prop.js");

var is =
/*#__PURE__*/
require("./is.js");
/**
 * Returns `true` if the specified object property is of the given type;
 * `false` otherwise.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category Type
 * @sig Type -> String -> Object -> Boolean
 * @param {Function} type
 * @param {String} name
 * @param {*} obj
 * @return {Boolean}
 * @see R.is, R.propSatisfies
 * @example
 *
 *      R.propIs(Number, 'x', {x: 1, y: 2});  //=> true
 *      R.propIs(Number, 'x', {x: 'foo'});    //=> false
 *      R.propIs(Number, 'x', {});            //=> false
 */


var propIs =
/*#__PURE__*/
_curry3(function propIs(type, name, obj) {
  return is(type, prop(name, obj));
});

module.exports = propIs;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");

var defaultTo =
/*#__PURE__*/
require("./defaultTo.js");

var prop =
/*#__PURE__*/
require("./prop.js");
/**
 * Return the specified property of the given non-null object if the property
 * is present and it's value is not `null`, `undefined` or `NaN`.
 *
 * Otherwise the first argument is returned.
 *
 * @func
 * @memberOf R
 * @since v0.6.0
 * @category Object
 * @sig a -> String -> Object -> a
 * @param {*} val The default value.
 * @param {String} p The name of the property to return.
 * @param {Object} obj The object to query.
 * @return {*} The value of given property of the supplied object or the default value.
 * @example
 *
 *      const alice = {
 *        name: 'ALICE',
 *        age: 101
 *      };
 *      const favorite = R.prop('favoriteLibrary');
 *      const favoriteWithDefault = R.propOr('Ramda', 'favoriteLibrary');
 *
 *      favorite(alice);  //=> undefined
 *      favoriteWithDefault(alice);  //=> 'Ramda'
 */


var propOr =
/*#__PURE__*/
_curry3(function propOr(val, p, obj) {
  return defaultTo(val, prop(p, obj));
});

module.exports = propOr;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");

var prop =
/*#__PURE__*/
require("./prop.js");
/**
 * Returns `true` if the specified object property satisfies the given
 * predicate; `false` otherwise. You can test multiple properties with
 * [`R.where`](#where).
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category Logic
 * @sig (a -> Boolean) -> String -> {String: a} -> Boolean
 * @param {Function} pred
 * @param {String} name
 * @param {*} obj
 * @return {Boolean}
 * @see R.where, R.propEq, R.propIs
 * @example
 *
 *      R.propSatisfies(x => x > 0, 'x', {x: 1, y: 2}); //=> true
 */


var propSatisfies =
/*#__PURE__*/
_curry3(function propSatisfies(pred, name, obj) {
  return pred(prop(name, obj));
});

module.exports = propSatisfies;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var path =
/*#__PURE__*/
require("./path.js");
/**
 * Acts as multiple `prop`: array of keys in, array of values out. Preserves
 * order.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @sig [k] -> {k: v} -> [v]
 * @param {Array} ps The property names to fetch
 * @param {Object} obj The object to query
 * @return {Array} The corresponding values or partially applied function.
 * @see R.prop, R.pluck, R.project
 * @example
 *
 *      R.props(['x', 'y'], {x: 1, y: 2}); //=> [1, 2]
 *      R.props(['c', 'a', 'b'], {b: 2, a: 1}); //=> [undefined, 1, 2]
 *
 *      const fullName = R.compose(R.join(' '), R.props(['first', 'last']));
 *      fullName({last: 'Bullet-Tooth', age: 33, first: 'Tony'}); //=> 'Tony Bullet-Tooth'
 */


var props =
/*#__PURE__*/
_curry2(function props(ps, obj) {
  return ps.map(function (p) {
    return path([p], obj);
  });
});

module.exports = props;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _isNumber =
/*#__PURE__*/
require("./internal/_isNumber.js");
/**
 * Returns a list of numbers from `from` (inclusive) to `to` (exclusive).
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig Number -> Number -> [Number]
 * @param {Number} from The first number in the list.
 * @param {Number} to One more than the last number in the list.
 * @return {Array} The list of numbers in the set `[a, b)`.
 * @example
 *
 *      R.range(1, 5);    //=> [1, 2, 3, 4]
 *      R.range(50, 53);  //=> [50, 51, 52]
 */


var range =
/*#__PURE__*/
_curry2(function range(from, to) {
  if (!(_isNumber(from) && _isNumber(to))) {
    throw new TypeError('Both arguments to range must be numbers');
  }

  var result = [];
  var n = from;

  while (n < to) {
    result.push(n);
    n += 1;
  }

  return result;
});

module.exports = range;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");

var _reduce =
/*#__PURE__*/
require("./internal/_reduce.js");
/**
 * Returns a single item by iterating through the list, successively calling
 * the iterator function and passing it an accumulator value and the current
 * value from the array, and then passing the result to the next call.
 *
 * The iterator function receives two values: *(acc, value)*. It may use
 * [`R.reduced`](#reduced) to shortcut the iteration.
 *
 * The arguments' order of [`reduceRight`](#reduceRight)'s iterator function
 * is *(value, acc)*.
 *
 * Note: `R.reduce` does not skip deleted or unassigned indices (sparse
 * arrays), unlike the native `Array.prototype.reduce` method. For more details
 * on this behavior, see:
 * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#Description
 *
 * Dispatches to the `reduce` method of the third argument, if present. When
 * doing so, it is up to the user to handle the [`R.reduced`](#reduced)
 * shortcuting, as this is not implemented by `reduce`.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig ((a, b) -> a) -> a -> [b] -> a
 * @param {Function} fn The iterator function. Receives two values, the accumulator and the
 *        current element from the array.
 * @param {*} acc The accumulator value.
 * @param {Array} list The list to iterate over.
 * @return {*} The final, accumulated value.
 * @see R.reduced, R.addIndex, R.reduceRight
 * @example
 *
 *      R.reduce(R.subtract, 0, [1, 2, 3, 4]) // => ((((0 - 1) - 2) - 3) - 4) = -10
 *      //          -               -10
 *      //         / \              / \
 *      //        -   4           -6   4
 *      //       / \              / \
 *      //      -   3   ==>     -3   3
 *      //     / \              / \
 *      //    -   2           -1   2
 *      //   / \              / \
 *      //  0   1            0   1
 *
 * @symb R.reduce(f, a, [b, c, d]) = f(f(f(a, b), c), d)
 */


var reduce =
/*#__PURE__*/
_curry3(_reduce);

module.exports = reduce;var _clone =
/*#__PURE__*/
require("./internal/_clone.js");

var _curryN =
/*#__PURE__*/
require("./internal/_curryN.js");

var _dispatchable =
/*#__PURE__*/
require("./internal/_dispatchable.js");

var _has =
/*#__PURE__*/
require("./internal/_has.js");

var _reduce =
/*#__PURE__*/
require("./internal/_reduce.js");

var _reduced =
/*#__PURE__*/
require("./internal/_reduced.js");

var _xreduceBy =
/*#__PURE__*/
require("./internal/_xreduceBy.js");
/**
 * Groups the elements of the list according to the result of calling
 * the String-returning function `keyFn` on each element and reduces the elements
 * of each group to a single value via the reducer function `valueFn`.
 *
 * The value function receives two values: *(acc, value)*. It may use
 * [`R.reduced`](#reduced) to short circuit the iteration.
 *
 * This function is basically a more general [`groupBy`](#groupBy) function.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.20.0
 * @category List
 * @sig ((a, b) -> a) -> a -> (b -> String) -> [b] -> {String: a}
 * @param {Function} valueFn The function that reduces the elements of each group to a single
 *        value. Receives two values, accumulator for a particular group and the current element.
 * @param {*} acc The (initial) accumulator value for each group.
 * @param {Function} keyFn The function that maps the list's element into a key.
 * @param {Array} list The array to group.
 * @return {Object} An object with the output of `keyFn` for keys, mapped to the output of
 *         `valueFn` for elements which produced that key when passed to `keyFn`.
 * @see R.groupBy, R.reduce, R.reduced
 * @example
 *
 *      const groupNames = (acc, {name}) => acc.concat(name)
 *      const toGrade = ({score}) =>
 *        score < 65 ? 'F' :
 *        score < 70 ? 'D' :
 *        score < 80 ? 'C' :
 *        score < 90 ? 'B' : 'A'
 *
 *      var students = [
 *        {name: 'Abby', score: 83},
 *        {name: 'Bart', score: 62},
 *        {name: 'Curt', score: 88},
 *        {name: 'Dora', score: 92},
 *      ]
 *
 *      reduceBy(groupNames, [], toGrade, students)
 *      //=> {"A": ["Dora"], "B": ["Abby", "Curt"], "F": ["Bart"]}
 */


var reduceBy =
/*#__PURE__*/
_curryN(4, [],
/*#__PURE__*/
_dispatchable([], _xreduceBy, function reduceBy(valueFn, valueAcc, keyFn, list) {
  return _reduce(function (acc, elt) {
    var key = keyFn(elt);
    var value = valueFn(_has(key, acc) ? acc[key] : _clone(valueAcc, [], [], false), elt);

    if (value && value['@@transducer/reduced']) {
      return _reduced(acc);
    }

    acc[key] = value;
    return acc;
  }, {}, list);
}));

module.exports = reduceBy;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");
/**
 * Returns a single item by iterating through the list, successively calling
 * the iterator function and passing it an accumulator value and the current
 * value from the array, and then passing the result to the next call.
 *
 * Similar to [`reduce`](#reduce), except moves through the input list from the
 * right to the left.
 *
 * The iterator function receives two values: *(value, acc)*, while the arguments'
 * order of `reduce`'s iterator function is *(acc, value)*. `reduceRight` may use [`reduced`](#reduced)
 * to short circuit the iteration.
 *
 * Note: `R.reduceRight` does not skip deleted or unassigned indices (sparse
 * arrays), unlike the native `Array.prototype.reduceRight` method. For more details
 * on this behavior, see:
 * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduceRight#Description
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig ((a, b) -> b) -> b -> [a] -> b
 * @param {Function} fn The iterator function. Receives two values, the current element from the array
 *        and the accumulator.
 * @param {*} acc The accumulator value.
 * @param {Array} list The list to iterate over.
 * @return {*} The final, accumulated value.
 * @see R.reduce, R.addIndex, R.reduced
 * @example
 *
 *      R.reduceRight(R.subtract, 0, [1, 2, 3, 4]) // => (1 - (2 - (3 - (4 - 0)))) = -2
 *      //    -               -2
 *      //   / \              / \
 *      //  1   -            1   3
 *      //     / \              / \
 *      //    2   -     ==>    2  -1
 *      //       / \              / \
 *      //      3   -            3   4
 *      //         / \              / \
 *      //        4   0            4   0
 *
 * @symb R.reduceRight(f, a, [b, c, d]) = f(b, f(c, f(d, a)))
 */


var reduceRight =
/*#__PURE__*/
_curry3(function reduceRight(fn, acc, list) {
  var idx = list.length - 1;

  while (idx >= 0) {
    acc = fn(list[idx], acc);

    if (acc && acc['@@transducer/reduced']) {
      acc = acc['@@transducer/value'];
      break;
    }

    idx -= 1;
  }

  return acc;
});

module.exports = reduceRight;var _curryN =
/*#__PURE__*/
require("./internal/_curryN.js");

var _reduce =
/*#__PURE__*/
require("./internal/_reduce.js");

var _reduced =
/*#__PURE__*/
require("./internal/_reduced.js");
/**
 * Like [`reduce`](#reduce), `reduceWhile` returns a single item by iterating
 * through the list, successively calling the iterator function. `reduceWhile`
 * also takes a predicate that is evaluated before each step. If the predicate
 * returns `false`, it "short-circuits" the iteration and returns the current
 * value of the accumulator. `reduceWhile` may alternatively be short-circuited
 * via [`reduced`](#reduced).
 *
 * @func
 * @memberOf R
 * @since v0.22.0
 * @category List
 * @sig ((a, b) -> Boolean) -> ((a, b) -> a) -> a -> [b] -> a
 * @param {Function} pred The predicate. It is passed the accumulator and the
 *        current element.
 * @param {Function} fn The iterator function. Receives two values, the
 *        accumulator and the current element.
 * @param {*} a The accumulator value.
 * @param {Array} list The list to iterate over.
 * @return {*} The final, accumulated value.
 * @see R.reduce, R.reduced
 * @example
 *
 *      const isOdd = (acc, x) => x % 2 !== 0;
 *      const xs = [1, 3, 5, 60, 777, 800];
 *      R.reduceWhile(isOdd, R.add, 0, xs); //=> 9
 *
 *      const ys = [2, 4, 6]
 *      R.reduceWhile(isOdd, R.add, 111, ys); //=> 111
 */


var reduceWhile =
/*#__PURE__*/
_curryN(4, [], function _reduceWhile(pred, fn, a, list) {
  return _reduce(function (acc, x) {
    return pred(acc, x) ? fn(acc, x) : _reduced(acc);
  }, a, list);
});

module.exports = reduceWhile;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var _reduced =
/*#__PURE__*/
require("./internal/_reduced.js");
/**
 * Returns a value wrapped to indicate that it is the final value of the reduce
 * and transduce functions. The returned value should be considered a black
 * box: the internal structure is not guaranteed to be stable.
 *
 * This optimization is available to the below functions:
 * - [`reduce`](#reduce)
 * - [`reduceWhile`](#reduceWhile)
 * - [`reduceBy`](#reduceBy)
 * - [`reduceRight`](#reduceRight)
 * - [`transduce`](#transduce)
 *
 * @func
 * @memberOf R
 * @since v0.15.0
 * @category List
 * @sig a -> *
 * @param {*} x The final value of the reduce.
 * @return {*} The wrapped value.
 * @see R.reduce, R.reduceWhile, R.reduceBy, R.reduceRight, R.transduce
 * @example
 *
 *     R.reduce(
 *       (acc, item) => item > 3 ? R.reduced(acc) : acc.concat(item),
 *       [],
 *       [1, 2, 3, 4, 5]) // [1, 2, 3]
 */


var reduced =
/*#__PURE__*/
_curry1(_reduced);

module.exports = reduced;var _complement =
/*#__PURE__*/
require("./internal/_complement.js");

var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var filter =
/*#__PURE__*/
require("./filter.js");
/**
 * The complement of [`filter`](#filter).
 *
 * Acts as a transducer if a transformer is given in list position. Filterable
 * objects include plain objects or any object that has a filter method such
 * as `Array`.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig Filterable f => (a -> Boolean) -> f a -> f a
 * @param {Function} pred
 * @param {Array} filterable
 * @return {Array}
 * @see R.filter, R.transduce, R.addIndex
 * @example
 *
 *      const isOdd = (n) => n % 2 !== 0;
 *
 *      R.reject(isOdd, [1, 2, 3, 4]); //=> [2, 4]
 *
 *      R.reject(isOdd, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4}
 */


var reject =
/*#__PURE__*/
_curry2(function reject(pred, filterable) {
  return filter(_complement(pred), filterable);
});

module.exports = reject;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");
/**
 * Removes the sub-list of `list` starting at index `start` and containing
 * `count` elements. _Note that this is not destructive_: it returns a copy of
 * the list with the changes.
 * <small>No lists have been harmed in the application of this function.</small>
 *
 * @func
 * @memberOf R
 * @since v0.2.2
 * @category List
 * @sig Number -> Number -> [a] -> [a]
 * @param {Number} start The position to start removing elements
 * @param {Number} count The number of elements to remove
 * @param {Array} list The list to remove from
 * @return {Array} A new Array with `count` elements from `start` removed.
 * @see R.without
 * @example
 *
 *      R.remove(2, 3, [1,2,3,4,5,6,7,8]); //=> [1,2,6,7,8]
 */


var remove =
/*#__PURE__*/
_curry3(function remove(start, count, list) {
  var result = Array.prototype.slice.call(list, 0);
  result.splice(start, count);
  return result;
});

module.exports = remove;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var always =
/*#__PURE__*/
require("./always.js");

var times =
/*#__PURE__*/
require("./times.js");
/**
 * Returns a fixed list of size `n` containing a specified identical value.
 *
 * @func
 * @memberOf R
 * @since v0.1.1
 * @category List
 * @sig a -> n -> [a]
 * @param {*} value The value to repeat.
 * @param {Number} n The desired size of the output list.
 * @return {Array} A new array containing `n` `value`s.
 * @see R.times
 * @example
 *
 *      R.repeat('hi', 5); //=> ['hi', 'hi', 'hi', 'hi', 'hi']
 *
 *      const obj = {};
 *      const repeatedObjs = R.repeat(obj, 5); //=> [{}, {}, {}, {}, {}]
 *      repeatedObjs[0] === repeatedObjs[1]; //=> true
 * @symb R.repeat(a, 0) = []
 * @symb R.repeat(a, 1) = [a]
 * @symb R.repeat(a, 2) = [a, a]
 */


var repeat =
/*#__PURE__*/
_curry2(function repeat(value, n) {
  return times(always(value), n);
});

module.exports = repeat;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");
/**
 * Replace a substring or regex match in a string with a replacement.
 *
 * The first two parameters correspond to the parameters of the
 * `String.prototype.replace()` function, so the second parameter can also be a
 * function.
 *
 * @func
 * @memberOf R
 * @since v0.7.0
 * @category String
 * @sig RegExp|String -> String -> String -> String
 * @param {RegExp|String} pattern A regular expression or a substring to match.
 * @param {String} replacement The string to replace the matches with.
 * @param {String} str The String to do the search and replacement in.
 * @return {String} The result.
 * @example
 *
 *      R.replace('foo', 'bar', 'foo foo foo'); //=> 'bar foo foo'
 *      R.replace(/foo/, 'bar', 'foo foo foo'); //=> 'bar foo foo'
 *
 *      // Use the "g" (global) flag to replace all occurrences:
 *      R.replace(/foo/g, 'bar', 'foo foo foo'); //=> 'bar bar bar'
 */


var replace =
/*#__PURE__*/
_curry3(function replace(regex, replacement, str) {
  return str.replace(regex, replacement);
});

module.exports = replace;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var _isString =
/*#__PURE__*/
require("./internal/_isString.js");
/**
 * Returns a new list or string with the elements or characters in reverse
 * order.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig [a] -> [a]
 * @sig String -> String
 * @param {Array|String} list
 * @return {Array|String}
 * @example
 *
 *      R.reverse([1, 2, 3]);  //=> [3, 2, 1]
 *      R.reverse([1, 2]);     //=> [2, 1]
 *      R.reverse([1]);        //=> [1]
 *      R.reverse([]);         //=> []
 *
 *      R.reverse('abc');      //=> 'cba'
 *      R.reverse('ab');       //=> 'ba'
 *      R.reverse('a');        //=> 'a'
 *      R.reverse('');         //=> ''
 */


var reverse =
/*#__PURE__*/
_curry1(function reverse(list) {
  return _isString(list) ? list.split('').reverse().join('') : Array.prototype.slice.call(list, 0).reverse();
});

module.exports = reverse;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");
/**
 * Scan is similar to [`reduce`](#reduce), but returns a list of successively
 * reduced values from the left
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category List
 * @sig ((a, b) -> a) -> a -> [b] -> [a]
 * @param {Function} fn The iterator function. Receives two values, the accumulator and the
 *        current element from the array
 * @param {*} acc The accumulator value.
 * @param {Array} list The list to iterate over.
 * @return {Array} A list of all intermediately reduced values.
 * @see R.reduce, R.mapAccum
 * @example
 *
 *      const numbers = [1, 2, 3, 4];
 *      const factorials = R.scan(R.multiply, 1, numbers); //=> [1, 1, 2, 6, 24]
 * @symb R.scan(f, a, [b, c]) = [a, f(a, b), f(f(a, b), c)]
 */


var scan =
/*#__PURE__*/
_curry3(function scan(fn, acc, list) {
  var idx = 0;
  var len = list.length;
  var result = [acc];

  while (idx < len) {
    acc = fn(acc, list[idx]);
    result[idx + 1] = acc;
    idx += 1;
  }

  return result;
});

module.exports = scan;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var ap =
/*#__PURE__*/
require("./ap.js");

var map =
/*#__PURE__*/
require("./map.js");

var prepend =
/*#__PURE__*/
require("./prepend.js");

var reduceRight =
/*#__PURE__*/
require("./reduceRight.js");
/**
 * Transforms a [Traversable](https://github.com/fantasyland/fantasy-land#traversable)
 * of [Applicative](https://github.com/fantasyland/fantasy-land#applicative) into an
 * Applicative of Traversable.
 *
 * Dispatches to the `sequence` method of the second argument, if present.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category List
 * @sig (Applicative f, Traversable t) => (a -> f a) -> t (f a) -> f (t a)
 * @param {Function} of
 * @param {*} traversable
 * @return {*}
 * @see R.traverse
 * @example
 *
 *      R.sequence(Maybe.of, [Just(1), Just(2), Just(3)]);   //=> Just([1, 2, 3])
 *      R.sequence(Maybe.of, [Just(1), Just(2), Nothing()]); //=> Nothing()
 *
 *      R.sequence(R.of, Just([1, 2, 3])); //=> [Just(1), Just(2), Just(3)]
 *      R.sequence(R.of, Nothing());       //=> [Nothing()]
 */


var sequence =
/*#__PURE__*/
_curry2(function sequence(of, traversable) {
  return typeof traversable.sequence === 'function' ? traversable.sequence(of) : reduceRight(function (x, acc) {
    return ap(map(prepend, x), acc);
  }, of([]), traversable);
});

module.exports = sequence;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");

var always =
/*#__PURE__*/
require("./always.js");

var over =
/*#__PURE__*/
require("./over.js");
/**
 * Returns the result of "setting" the portion of the given data structure
 * focused by the given lens to the given value.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category Object
 * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
 * @sig Lens s a -> a -> s -> s
 * @param {Lens} lens
 * @param {*} v
 * @param {*} x
 * @return {*}
 * @see R.view, R.over, R.lens, R.lensIndex, R.lensProp, R.lensPath
 * @example
 *
 *      const xLens = R.lensProp('x');
 *
 *      R.set(xLens, 4, {x: 1, y: 2});  //=> {x: 4, y: 2}
 *      R.set(xLens, 8, {x: 1, y: 2});  //=> {x: 8, y: 2}
 */


var set =
/*#__PURE__*/
_curry3(function set(lens, v, x) {
  return over(lens, always(v), x);
});

module.exports = set;var _checkForMethod =
/*#__PURE__*/
require("./internal/_checkForMethod.js");

var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");
/**
 * Returns the elements of the given list or string (or object with a `slice`
 * method) from `fromIndex` (inclusive) to `toIndex` (exclusive).
 *
 * Dispatches to the `slice` method of the third argument, if present.
 *
 * @func
 * @memberOf R
 * @since v0.1.4
 * @category List
 * @sig Number -> Number -> [a] -> [a]
 * @sig Number -> Number -> String -> String
 * @param {Number} fromIndex The start index (inclusive).
 * @param {Number} toIndex The end index (exclusive).
 * @param {*} list
 * @return {*}
 * @example
 *
 *      R.slice(1, 3, ['a', 'b', 'c', 'd']);        //=> ['b', 'c']
 *      R.slice(1, Infinity, ['a', 'b', 'c', 'd']); //=> ['b', 'c', 'd']
 *      R.slice(0, -1, ['a', 'b', 'c', 'd']);       //=> ['a', 'b', 'c']
 *      R.slice(-3, -1, ['a', 'b', 'c', 'd']);      //=> ['b', 'c']
 *      R.slice(0, 3, 'ramda');                     //=> 'ram'
 */


var slice =
/*#__PURE__*/
_curry3(
/*#__PURE__*/
_checkForMethod('slice', function slice(fromIndex, toIndex, list) {
  return Array.prototype.slice.call(list, fromIndex, toIndex);
}));

module.exports = slice;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Returns a copy of the list, sorted according to the comparator function,
 * which should accept two values at a time and return a negative number if the
 * first value is smaller, a positive number if it's larger, and zero if they
 * are equal. Please note that this is a **copy** of the list. It does not
 * modify the original.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig ((a, a) -> Number) -> [a] -> [a]
 * @param {Function} comparator A sorting function :: a -> b -> Int
 * @param {Array} list The list to sort
 * @return {Array} a new array with its elements sorted by the comparator function.
 * @see R.ascend, R.descend
 * @example
 *
 *      const diff = function(a, b) { return a - b; };
 *      R.sort(diff, [4,2,7,5]); //=> [2, 4, 5, 7]
 */


var sort =
/*#__PURE__*/
_curry2(function sort(comparator, list) {
  return Array.prototype.slice.call(list, 0).sort(comparator);
});

module.exports = sort;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Sorts the list according to the supplied function.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig Ord b => (a -> b) -> [a] -> [a]
 * @param {Function} fn
 * @param {Array} list The list to sort.
 * @return {Array} A new list sorted by the keys generated by `fn`.
 * @example
 *
 *      const sortByFirstItem = R.sortBy(R.prop(0));
 *      const pairs = [[-1, 1], [-2, 2], [-3, 3]];
 *      sortByFirstItem(pairs); //=> [[-3, 3], [-2, 2], [-1, 1]]
 *
 *      const sortByNameCaseInsensitive = R.sortBy(R.compose(R.toLower, R.prop('name')));
 *      const alice = {
 *        name: 'ALICE',
 *        age: 101
 *      };
 *      const bob = {
 *        name: 'Bob',
 *        age: -10
 *      };
 *      const clara = {
 *        name: 'clara',
 *        age: 314.159
 *      };
 *      const people = [clara, bob, alice];
 *      sortByNameCaseInsensitive(people); //=> [alice, bob, clara]
 */


var sortBy =
/*#__PURE__*/
_curry2(function sortBy(fn, list) {
  return Array.prototype.slice.call(list, 0).sort(function (a, b) {
    var aa = fn(a);
    var bb = fn(b);
    return aa < bb ? -1 : aa > bb ? 1 : 0;
  });
});

module.exports = sortBy;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Sorts a list according to a list of comparators.
 *
 * @func
 * @memberOf R
 * @since v0.23.0
 * @category Relation
 * @sig [(a, a) -> Number] -> [a] -> [a]
 * @param {Array} functions A list of comparator functions.
 * @param {Array} list The list to sort.
 * @return {Array} A new list sorted according to the comarator functions.
 * @see R.ascend, R.descend
 * @example
 *
 *      const alice = {
 *        name: 'alice',
 *        age: 40
 *      };
 *      const bob = {
 *        name: 'bob',
 *        age: 30
 *      };
 *      const clara = {
 *        name: 'clara',
 *        age: 40
 *      };
 *      const people = [clara, bob, alice];
 *      const ageNameSort = R.sortWith([
 *        R.descend(R.prop('age')),
 *        R.ascend(R.prop('name'))
 *      ]);
 *      ageNameSort(people); //=> [alice, clara, bob]
 */


var sortWith =
/*#__PURE__*/
_curry2(function sortWith(fns, list) {
  return Array.prototype.slice.call(list, 0).sort(function (a, b) {
    var result = 0;
    var i = 0;

    while (result === 0 && i < fns.length) {
      result = fns[i](a, b);
      i += 1;
    }

    return result;
  });
});

module.exports = sortWith;var invoker =
/*#__PURE__*/
require("./invoker.js");
/**
 * Splits a string into an array of strings based on the given
 * separator.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category String
 * @sig (String | RegExp) -> String -> [String]
 * @param {String|RegExp} sep The pattern.
 * @param {String} str The string to separate into an array.
 * @return {Array} The array of strings from `str` separated by `sep`.
 * @see R.join
 * @example
 *
 *      const pathComponents = R.split('/');
 *      R.tail(pathComponents('/usr/local/bin/node')); //=> ['usr', 'local', 'bin', 'node']
 *
 *      R.split('.', 'a.b.c.xyz.d'); //=> ['a', 'b', 'c', 'xyz', 'd']
 */


var split =
/*#__PURE__*/
invoker(1, 'split');
module.exports = split;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var length =
/*#__PURE__*/
require("./length.js");

var slice =
/*#__PURE__*/
require("./slice.js");
/**
 * Splits a given list or string at a given index.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category List
 * @sig Number -> [a] -> [[a], [a]]
 * @sig Number -> String -> [String, String]
 * @param {Number} index The index where the array/string is split.
 * @param {Array|String} array The array/string to be split.
 * @return {Array}
 * @example
 *
 *      R.splitAt(1, [1, 2, 3]);          //=> [[1], [2, 3]]
 *      R.splitAt(5, 'hello world');      //=> ['hello', ' world']
 *      R.splitAt(-1, 'foobar');          //=> ['fooba', 'r']
 */


var splitAt =
/*#__PURE__*/
_curry2(function splitAt(index, array) {
  return [slice(0, index, array), slice(index, length(array), array)];
});

module.exports = splitAt;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var slice =
/*#__PURE__*/
require("./slice.js");
/**
 * Splits a collection into slices of the specified length.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category List
 * @sig Number -> [a] -> [[a]]
 * @sig Number -> String -> [String]
 * @param {Number} n
 * @param {Array} list
 * @return {Array}
 * @example
 *
 *      R.splitEvery(3, [1, 2, 3, 4, 5, 6, 7]); //=> [[1, 2, 3], [4, 5, 6], [7]]
 *      R.splitEvery(3, 'foobarbaz'); //=> ['foo', 'bar', 'baz']
 */


var splitEvery =
/*#__PURE__*/
_curry2(function splitEvery(n, list) {
  if (n <= 0) {
    throw new Error('First argument to splitEvery must be a positive integer');
  }

  var result = [];
  var idx = 0;

  while (idx < list.length) {
    result.push(slice(idx, idx += n, list));
  }

  return result;
});

module.exports = splitEvery;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Takes a list and a predicate and returns a pair of lists with the following properties:
 *
 *  - the result of concatenating the two output lists is equivalent to the input list;
 *  - none of the elements of the first output list satisfies the predicate; and
 *  - if the second output list is non-empty, its first element satisfies the predicate.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> [[a], [a]]
 * @param {Function} pred The predicate that determines where the array is split.
 * @param {Array} list The array to be split.
 * @return {Array}
 * @example
 *
 *      R.splitWhen(R.equals(2), [1, 2, 3, 1, 2, 3]);   //=> [[1], [2, 3, 1, 2, 3]]
 */


var splitWhen =
/*#__PURE__*/
_curry2(function splitWhen(pred, list) {
  var idx = 0;
  var len = list.length;
  var prefix = [];

  while (idx < len && !pred(list[idx])) {
    prefix.push(list[idx]);
    idx += 1;
  }

  return [prefix, Array.prototype.slice.call(list, idx)];
});

module.exports = splitWhen;var _curryN =
/*#__PURE__*/
require("./internal/_curryN.js");
/**
 * Splits an array into slices on every occurrence of a value.
 *
 * @func
 * @memberOf R
 * @since v0.26.1
 * @category List
 * @sig (a -> Boolean) -> [a] -> [[a]]
 * @param {Function} pred The predicate that determines where the array is split.
 * @param {Array} list The array to be split.
 * @return {Array}
 * @example
 *
 *      R.splitWhenever(R.equals(2), [1, 2, 3, 2, 4, 5, 2, 6, 7]); //=> [[1], [3], [4, 5], [6, 7]]
 */


var splitWhenever =
/*#__PURE__*/
_curryN(2, [], function splitWhenever(pred, list) {
  var acc = [];
  var curr = [];

  for (var i = 0; i < list.length; i = i + 1) {
    if (!pred(list[i])) {
      curr.push(list[i]);
    }

    if ((i < list.length - 1 && pred(list[i + 1]) || i === list.length - 1) && curr.length > 0) {
      acc.push(curr);
      curr = [];
    }
  }

  return acc;
});

module.exports = splitWhenever;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var equals =
/*#__PURE__*/
require("./equals.js");

var take =
/*#__PURE__*/
require("./take.js");
/**
 * Checks if a list starts with the provided sublist.
 *
 * Similarly, checks if a string starts with the provided substring.
 *
 * @func
 * @memberOf R
 * @since v0.24.0
 * @category List
 * @sig [a] -> [a] -> Boolean
 * @sig String -> String -> Boolean
 * @param {*} prefix
 * @param {*} list
 * @return {Boolean}
 * @see R.endsWith
 * @example
 *
 *      R.startsWith('a', 'abc')                //=> true
 *      R.startsWith('b', 'abc')                //=> false
 *      R.startsWith(['a'], ['a', 'b', 'c'])    //=> true
 *      R.startsWith(['b'], ['a', 'b', 'c'])    //=> false
 */


var startsWith =
/*#__PURE__*/
_curry2(function (prefix, list) {
  return equals(take(prefix.length, list), prefix);
});

module.exports = startsWith;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Subtracts its second argument from its first argument.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Math
 * @sig Number -> Number -> Number
 * @param {Number} a The first value.
 * @param {Number} b The second value.
 * @return {Number} The result of `a - b`.
 * @see R.add
 * @example
 *
 *      R.subtract(10, 8); //=> 2
 *
 *      const minus5 = R.subtract(R.__, 5);
 *      minus5(17); //=> 12
 *
 *      const complementaryAngle = R.subtract(90);
 *      complementaryAngle(30); //=> 60
 *      complementaryAngle(72); //=> 18
 */


var subtract =
/*#__PURE__*/
_curry2(function subtract(a, b) {
  return Number(a) - Number(b);
});

module.exports = subtract;var add =
/*#__PURE__*/
require("./add.js");

var reduce =
/*#__PURE__*/
require("./reduce.js");
/**
 * Adds together all the elements of a list.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Math
 * @sig [Number] -> Number
 * @param {Array} list An array of numbers
 * @return {Number} The sum of all the numbers in the list.
 * @see R.reduce
 * @example
 *
 *      R.sum([2,4,6,8,100,1]); //=> 121
 */


var sum =
/*#__PURE__*/
reduce(add, 0);
module.exports = sum;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var concat =
/*#__PURE__*/
require("./concat.js");

var difference =
/*#__PURE__*/
require("./difference.js");
/**
 * Finds the set (i.e. no duplicates) of all elements contained in the first or
 * second list, but not both.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category Relation
 * @sig [*] -> [*] -> [*]
 * @param {Array} list1 The first list.
 * @param {Array} list2 The second list.
 * @return {Array} The elements in `list1` or `list2`, but not both.
 * @see R.symmetricDifferenceWith, R.difference, R.differenceWith
 * @example
 *
 *      R.symmetricDifference([1,2,3,4], [7,6,5,4,3]); //=> [1,2,7,6,5]
 *      R.symmetricDifference([7,6,5,4,3], [1,2,3,4]); //=> [7,6,5,1,2]
 */


var symmetricDifference =
/*#__PURE__*/
_curry2(function symmetricDifference(list1, list2) {
  return concat(difference(list1, list2), difference(list2, list1));
});

module.exports = symmetricDifference;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");

var concat =
/*#__PURE__*/
require("./concat.js");

var differenceWith =
/*#__PURE__*/
require("./differenceWith.js");
/**
 * Finds the set (i.e. no duplicates) of all elements contained in the first or
 * second list, but not both. Duplication is determined according to the value
 * returned by applying the supplied predicate to two list elements.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category Relation
 * @sig ((a, a) -> Boolean) -> [a] -> [a] -> [a]
 * @param {Function} pred A predicate used to test whether two items are equal.
 * @param {Array} list1 The first list.
 * @param {Array} list2 The second list.
 * @return {Array} The elements in `list1` or `list2`, but not both.
 * @see R.symmetricDifference, R.difference, R.differenceWith
 * @example
 *
 *      const eqA = R.eqBy(R.prop('a'));
 *      const l1 = [{a: 1}, {a: 2}, {a: 3}, {a: 4}];
 *      const l2 = [{a: 3}, {a: 4}, {a: 5}, {a: 6}];
 *      R.symmetricDifferenceWith(eqA, l1, l2); //=> [{a: 1}, {a: 2}, {a: 5}, {a: 6}]
 */


var symmetricDifferenceWith =
/*#__PURE__*/
_curry3(function symmetricDifferenceWith(pred, list1, list2) {
  return concat(differenceWith(pred, list1, list2), differenceWith(pred, list2, list1));
});

module.exports = symmetricDifferenceWith;var _checkForMethod =
/*#__PURE__*/
require("./internal/_checkForMethod.js");

var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var slice =
/*#__PURE__*/
require("./slice.js");
/**
 * Returns all but the first element of the given list or string (or object
 * with a `tail` method).
 *
 * Dispatches to the `slice` method of the first argument, if present.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig [a] -> [a]
 * @sig String -> String
 * @param {*} list
 * @return {*}
 * @see R.head, R.init, R.last
 * @example
 *
 *      R.tail([1, 2, 3]);  //=> [2, 3]
 *      R.tail([1, 2]);     //=> [2]
 *      R.tail([1]);        //=> []
 *      R.tail([]);         //=> []
 *
 *      R.tail('abc');  //=> 'bc'
 *      R.tail('ab');   //=> 'b'
 *      R.tail('a');    //=> ''
 *      R.tail('');     //=> ''
 */


var tail =
/*#__PURE__*/
_curry1(
/*#__PURE__*/
_checkForMethod('tail',
/*#__PURE__*/
slice(1, Infinity)));

module.exports = tail;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _dispatchable =
/*#__PURE__*/
require("./internal/_dispatchable.js");

var _xtake =
/*#__PURE__*/
require("./internal/_xtake.js");

var slice =
/*#__PURE__*/
require("./slice.js");
/**
 * Returns the first `n` elements of the given list, string, or
 * transducer/transformer (or object with a `take` method).
 *
 * Dispatches to the `take` method of the second argument, if present.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig Number -> [a] -> [a]
 * @sig Number -> String -> String
 * @param {Number} n
 * @param {*} list
 * @return {*}
 * @see R.drop
 * @example
 *
 *      R.take(1, ['foo', 'bar', 'baz']); //=> ['foo']
 *      R.take(2, ['foo', 'bar', 'baz']); //=> ['foo', 'bar']
 *      R.take(3, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz']
 *      R.take(4, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz']
 *      R.take(3, 'ramda');               //=> 'ram'
 *
 *      const personnel = [
 *        'Dave Brubeck',
 *        'Paul Desmond',
 *        'Eugene Wright',
 *        'Joe Morello',
 *        'Gerry Mulligan',
 *        'Bob Bates',
 *        'Joe Dodge',
 *        'Ron Crotty'
 *      ];
 *
 *      const takeFive = R.take(5);
 *      takeFive(personnel);
 *      //=> ['Dave Brubeck', 'Paul Desmond', 'Eugene Wright', 'Joe Morello', 'Gerry Mulligan']
 * @symb R.take(-1, [a, b]) = [a, b]
 * @symb R.take(0, [a, b]) = []
 * @symb R.take(1, [a, b]) = [a]
 * @symb R.take(2, [a, b]) = [a, b]
 */


var take =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable(['take'], _xtake, function take(n, xs) {
  return slice(0, n < 0 ? Infinity : n, xs);
}));

module.exports = take;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var drop =
/*#__PURE__*/
require("./drop.js");
/**
 * Returns a new list containing the last `n` elements of the given list.
 * If `n > list.length`, returns a list of `list.length` elements.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category List
 * @sig Number -> [a] -> [a]
 * @sig Number -> String -> String
 * @param {Number} n The number of elements to return.
 * @param {Array} xs The collection to consider.
 * @return {Array}
 * @see R.dropLast
 * @example
 *
 *      R.takeLast(1, ['foo', 'bar', 'baz']); //=> ['baz']
 *      R.takeLast(2, ['foo', 'bar', 'baz']); //=> ['bar', 'baz']
 *      R.takeLast(3, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz']
 *      R.takeLast(4, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz']
 *      R.takeLast(3, 'ramda');               //=> 'mda'
 */


var takeLast =
/*#__PURE__*/
_curry2(function takeLast(n, xs) {
  return drop(n >= 0 ? xs.length - n : 0, xs);
});

module.exports = takeLast;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var slice =
/*#__PURE__*/
require("./slice.js");
/**
 * Returns a new list containing the last `n` elements of a given list, passing
 * each value to the supplied predicate function, and terminating when the
 * predicate function returns `false`. Excludes the element that caused the
 * predicate function to fail. The predicate function is passed one argument:
 * *(value)*.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> [a]
 * @sig (a -> Boolean) -> String -> String
 * @param {Function} fn The function called per iteration.
 * @param {Array} xs The collection to iterate over.
 * @return {Array} A new array.
 * @see R.dropLastWhile, R.addIndex
 * @example
 *
 *      const isNotOne = x => x !== 1;
 *
 *      R.takeLastWhile(isNotOne, [1, 2, 3, 4]); //=> [2, 3, 4]
 *
 *      R.takeLastWhile(x => x !== 'R' , 'Ramda'); //=> 'amda'
 */


var takeLastWhile =
/*#__PURE__*/
_curry2(function takeLastWhile(fn, xs) {
  var idx = xs.length - 1;

  while (idx >= 0 && fn(xs[idx])) {
    idx -= 1;
  }

  return slice(idx + 1, Infinity, xs);
});

module.exports = takeLastWhile;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _dispatchable =
/*#__PURE__*/
require("./internal/_dispatchable.js");

var _xtakeWhile =
/*#__PURE__*/
require("./internal/_xtakeWhile.js");

var slice =
/*#__PURE__*/
require("./slice.js");
/**
 * Returns a new list containing the first `n` elements of a given list,
 * passing each value to the supplied predicate function, and terminating when
 * the predicate function returns `false`. Excludes the element that caused the
 * predicate function to fail. The predicate function is passed one argument:
 * *(value)*.
 *
 * Dispatches to the `takeWhile` method of the second argument, if present.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> [a]
 * @sig (a -> Boolean) -> String -> String
 * @param {Function} fn The function called per iteration.
 * @param {Array} xs The collection to iterate over.
 * @return {Array} A new array.
 * @see R.dropWhile, R.transduce, R.addIndex
 * @example
 *
 *      const isNotFour = x => x !== 4;
 *
 *      R.takeWhile(isNotFour, [1, 2, 3, 4, 3, 2, 1]); //=> [1, 2, 3]
 *
 *      R.takeWhile(x => x !== 'd' , 'Ramda'); //=> 'Ram'
 */


var takeWhile =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable(['takeWhile'], _xtakeWhile, function takeWhile(fn, xs) {
  var idx = 0;
  var len = xs.length;

  while (idx < len && fn(xs[idx])) {
    idx += 1;
  }

  return slice(0, idx, xs);
}));

module.exports = takeWhile;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _dispatchable =
/*#__PURE__*/
require("./internal/_dispatchable.js");

var _xtap =
/*#__PURE__*/
require("./internal/_xtap.js");
/**
 * Runs the given function with the supplied object, then returns the object.
 *
 * Acts as a transducer if a transformer is given as second parameter.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig (a -> *) -> a -> a
 * @param {Function} fn The function to call with `x`. The return value of `fn` will be thrown away.
 * @param {*} x
 * @return {*} `x`.
 * @example
 *
 *      const sayX = x => console.log('x is ' + x);
 *      R.tap(sayX, 100); //=> 100
 *      // logs 'x is 100'
 * @symb R.tap(f, a) = a
 */


var tap =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable([], _xtap, function tap(fn, x) {
  fn(x);
  return x;
}));

module.exports = tap;var _cloneRegExp =
/*#__PURE__*/
require("./internal/_cloneRegExp.js");

var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _isRegExp =
/*#__PURE__*/
require("./internal/_isRegExp.js");

var toString =
/*#__PURE__*/
require("./toString.js");
/**
 * Determines whether a given string matches a given regular expression.
 *
 * @func
 * @memberOf R
 * @since v0.12.0
 * @category String
 * @sig RegExp -> String -> Boolean
 * @param {RegExp} pattern
 * @param {String} str
 * @return {Boolean}
 * @see R.match
 * @example
 *
 *      R.test(/^x/, 'xyz'); //=> true
 *      R.test(/^y/, 'xyz'); //=> false
 */


var test =
/*#__PURE__*/
_curry2(function test(pattern, str) {
  if (!_isRegExp(pattern)) {
    throw new TypeError('‘test’ requires a value of type RegExp as its first argument; received ' + toString(pattern));
  }

  return _cloneRegExp(pattern).test(str);
});

module.exports = test;var curryN =
/*#__PURE__*/
require("./curryN.js");

var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");
/**
 * Creates a thunk out of a function. A thunk delays a calculation until
 * its result is needed, providing lazy evaluation of arguments.
 *
 * @func
 * @memberOf R
 * @since v0.26.0
 * @category Function
 * @sig ((a, b, ..., j) -> k) -> (a, b, ..., j) -> (() -> k)
 * @param {Function} fn A function to wrap in a thunk
 * @return {Function} Expects arguments for `fn` and returns a new function
 *  that, when called, applies those arguments to `fn`.
 * @see R.partial, R.partialRight
 * @example
 *
 *      R.thunkify(R.identity)(42)(); //=> 42
 *      R.thunkify((a, b) => a + b)(25, 17)(); //=> 42
 */


var thunkify =
/*#__PURE__*/
_curry1(function thunkify(fn) {
  return curryN(fn.length, function createThunk() {
    var fnArgs = arguments;
    return function invokeThunk() {
      return fn.apply(this, fnArgs);
    };
  });
});

module.exports = thunkify;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Calls an input function `n` times, returning an array containing the results
 * of those function calls.
 *
 * `fn` is passed one argument: The current value of `n`, which begins at `0`
 * and is gradually incremented to `n - 1`.
 *
 * @func
 * @memberOf R
 * @since v0.2.3
 * @category List
 * @sig (Number -> a) -> Number -> [a]
 * @param {Function} fn The function to invoke. Passed one argument, the current value of `n`.
 * @param {Number} n A value between `0` and `n - 1`. Increments after each function call.
 * @return {Array} An array containing the return values of all calls to `fn`.
 * @see R.repeat
 * @example
 *
 *      R.times(R.identity, 5); //=> [0, 1, 2, 3, 4]
 * @symb R.times(f, 0) = []
 * @symb R.times(f, 1) = [f(0)]
 * @symb R.times(f, 2) = [f(0), f(1)]
 */


var times =
/*#__PURE__*/
_curry2(function times(fn, n) {
  var len = Number(n);
  var idx = 0;
  var list;

  if (len < 0 || isNaN(len)) {
    throw new RangeError('n must be a non-negative number');
  }

  list = new Array(len);

  while (idx < len) {
    list[idx] = fn(idx);
    idx += 1;
  }

  return list;
});

module.exports = times;var invoker =
/*#__PURE__*/
require("./invoker.js");
/**
 * The lower case version of a string.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category String
 * @sig String -> String
 * @param {String} str The string to lower case.
 * @return {String} The lower case version of `str`.
 * @see R.toUpper
 * @example
 *
 *      R.toLower('XYZ'); //=> 'xyz'
 */


var toLower =
/*#__PURE__*/
invoker(0, 'toLowerCase');
module.exports = toLower;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var _has =
/*#__PURE__*/
require("./internal/_has.js");
/**
 * Converts an object into an array of key, value arrays. Only the object's
 * own properties are used.
 * Note that the order of the output array is not guaranteed to be consistent
 * across different JS platforms.
 *
 * @func
 * @memberOf R
 * @since v0.4.0
 * @category Object
 * @sig {String: *} -> [[String,*]]
 * @param {Object} obj The object to extract from
 * @return {Array} An array of key, value arrays from the object's own properties.
 * @see R.fromPairs, R.keys, R.values
 * @example
 *
 *      R.toPairs({a: 1, b: 2, c: 3}); //=> [['a', 1], ['b', 2], ['c', 3]]
 */


var toPairs =
/*#__PURE__*/
_curry1(function toPairs(obj) {
  var pairs = [];

  for (var prop in obj) {
    if (_has(prop, obj)) {
      pairs[pairs.length] = [prop, obj[prop]];
    }
  }

  return pairs;
});

module.exports = toPairs;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");
/**
 * Converts an object into an array of key, value arrays. The object's own
 * properties and prototype properties are used. Note that the order of the
 * output array is not guaranteed to be consistent across different JS
 * platforms.
 *
 * @func
 * @memberOf R
 * @since v0.4.0
 * @category Object
 * @sig {String: *} -> [[String,*]]
 * @param {Object} obj The object to extract from
 * @return {Array} An array of key, value arrays from the object's own
 *         and prototype properties.
 * @example
 *
 *      const F = function() { this.x = 'X'; };
 *      F.prototype.y = 'Y';
 *      const f = new F();
 *      R.toPairsIn(f); //=> [['x','X'], ['y','Y']]
 */


var toPairsIn =
/*#__PURE__*/
_curry1(function toPairsIn(obj) {
  var pairs = [];

  for (var prop in obj) {
    pairs[pairs.length] = [prop, obj[prop]];
  }

  return pairs;
});

module.exports = toPairsIn;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var _toString =
/*#__PURE__*/
require("./internal/_toString.js");
/**
 * Returns the string representation of the given value. `eval`'ing the output
 * should result in a value equivalent to the input value. Many of the built-in
 * `toString` methods do not satisfy this requirement.
 *
 * If the given value is an `[object Object]` with a `toString` method other
 * than `Object.prototype.toString`, this method is invoked with no arguments
 * to produce the return value. This means user-defined constructor functions
 * can provide a suitable `toString` method. For example:
 *
 *     function Point(x, y) {
 *       this.x = x;
 *       this.y = y;
 *     }
 *
 *     Point.prototype.toString = function() {
 *       return 'new Point(' + this.x + ', ' + this.y + ')';
 *     };
 *
 *     R.toString(new Point(1, 2)); //=> 'new Point(1, 2)'
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category String
 * @sig * -> String
 * @param {*} val
 * @return {String}
 * @example
 *
 *      R.toString(42); //=> '42'
 *      R.toString('abc'); //=> '"abc"'
 *      R.toString([1, 2, 3]); //=> '[1, 2, 3]'
 *      R.toString({foo: 1, bar: 2, baz: 3}); //=> '{"bar": 2, "baz": 3, "foo": 1}'
 *      R.toString(new Date('2001-02-03T04:05:06Z')); //=> 'new Date("2001-02-03T04:05:06.000Z")'
 */


var toString =
/*#__PURE__*/
_curry1(function toString(val) {
  return _toString(val, []);
});

module.exports = toString;var invoker =
/*#__PURE__*/
require("./invoker.js");
/**
 * The upper case version of a string.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category String
 * @sig String -> String
 * @param {String} str The string to upper case.
 * @return {String} The upper case version of `str`.
 * @see R.toLower
 * @example
 *
 *      R.toUpper('abc'); //=> 'ABC'
 */


var toUpper =
/*#__PURE__*/
invoker(0, 'toUpperCase');
module.exports = toUpper;var _reduce =
/*#__PURE__*/
require("./internal/_reduce.js");

var _xwrap =
/*#__PURE__*/
require("./internal/_xwrap.js");

var curryN =
/*#__PURE__*/
require("./curryN.js");
/**
 * Initializes a transducer using supplied iterator function. Returns a single
 * item by iterating through the list, successively calling the transformed
 * iterator function and passing it an accumulator value and the current value
 * from the array, and then passing the result to the next call.
 *
 * The iterator function receives two values: *(acc, value)*. It will be
 * wrapped as a transformer to initialize the transducer. A transformer can be
 * passed directly in place of an iterator function. In both cases, iteration
 * may be stopped early with the [`R.reduced`](#reduced) function.
 *
 * A transducer is a function that accepts a transformer and returns a
 * transformer and can be composed directly.
 *
 * A transformer is an object that provides a 2-arity reducing iterator
 * function, step, 0-arity initial value function, init, and 1-arity result
 * extraction function, result. The step function is used as the iterator
 * function in reduce. The result function is used to convert the final
 * accumulator into the return type and in most cases is
 * [`R.identity`](#identity). The init function can be used to provide an
 * initial accumulator, but is ignored by transduce.
 *
 * The iteration is performed with [`R.reduce`](#reduce) after initializing the transducer.
 *
 * @func
 * @memberOf R
 * @since v0.12.0
 * @category List
 * @sig (c -> c) -> ((a, b) -> a) -> a -> [b] -> a
 * @param {Function} xf The transducer function. Receives a transformer and returns a transformer.
 * @param {Function} fn The iterator function. Receives two values, the accumulator and the
 *        current element from the array. Wrapped as transformer, if necessary, and used to
 *        initialize the transducer
 * @param {*} acc The initial accumulator value.
 * @param {Array} list The list to iterate over.
 * @return {*} The final, accumulated value.
 * @see R.reduce, R.reduced, R.into
 * @example
 *
 *      const numbers = [1, 2, 3, 4];
 *      const transducer = R.compose(R.map(R.add(1)), R.take(2));
 *      R.transduce(transducer, R.flip(R.append), [], numbers); //=> [2, 3]
 *
 *      const isOdd = (x) => x % 2 !== 0;
 *      const firstOddTransducer = R.compose(R.filter(isOdd), R.take(1));
 *      R.transduce(firstOddTransducer, R.flip(R.append), [], R.range(0, 100)); //=> [1]
 */


var transduce =
/*#__PURE__*/
curryN(4, function transduce(xf, fn, acc, list) {
  return _reduce(xf(typeof fn === 'function' ? _xwrap(fn) : fn), acc, list);
});
module.exports = transduce;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");
/**
 * Transposes the rows and columns of a 2D list.
 * When passed a list of `n` lists of length `x`,
 * returns a list of `x` lists of length `n`.
 *
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category List
 * @sig [[a]] -> [[a]]
 * @param {Array} list A 2D list
 * @return {Array} A 2D list
 * @example
 *
 *      R.transpose([[1, 'a'], [2, 'b'], [3, 'c']]) //=> [[1, 2, 3], ['a', 'b', 'c']]
 *      R.transpose([[1, 2, 3], ['a', 'b', 'c']]) //=> [[1, 'a'], [2, 'b'], [3, 'c']]
 *
 *      // If some of the rows are shorter than the following rows, their elements are skipped:
 *      R.transpose([[10, 11], [20], [], [30, 31, 32]]) //=> [[10, 20, 30], [11, 31], [32]]
 * @symb R.transpose([[a], [b], [c]]) = [a, b, c]
 * @symb R.transpose([[a, b], [c, d]]) = [[a, c], [b, d]]
 * @symb R.transpose([[a, b], [c]]) = [[a, c], [b]]
 */


var transpose =
/*#__PURE__*/
_curry1(function transpose(outerlist) {
  var i = 0;
  var result = [];

  while (i < outerlist.length) {
    var innerlist = outerlist[i];
    var j = 0;

    while (j < innerlist.length) {
      if (typeof result[j] === 'undefined') {
        result[j] = [];
      }

      result[j].push(innerlist[j]);
      j += 1;
    }

    i += 1;
  }

  return result;
});

module.exports = transpose;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");

var map =
/*#__PURE__*/
require("./map.js");

var sequence =
/*#__PURE__*/
require("./sequence.js");
/**
 * Maps an [Applicative](https://github.com/fantasyland/fantasy-land#applicative)-returning
 * function over a [Traversable](https://github.com/fantasyland/fantasy-land#traversable),
 * then uses [`sequence`](#sequence) to transform the resulting Traversable of Applicative
 * into an Applicative of Traversable.
 *
 * Dispatches to the `traverse` method of the third argument, if present.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category List
 * @sig (Applicative f, Traversable t) => (a -> f a) -> (a -> f b) -> t a -> f (t b)
 * @param {Function} of
 * @param {Function} f
 * @param {*} traversable
 * @return {*}
 * @see R.sequence
 * @example
 *
 *      // Returns `Maybe.Nothing` if the given divisor is `0`
 *      const safeDiv = n => d => d === 0 ? Maybe.Nothing() : Maybe.Just(n / d)
 *
 *      R.traverse(Maybe.of, safeDiv(10), [2, 4, 5]); //=> Maybe.Just([5, 2.5, 2])
 *      R.traverse(Maybe.of, safeDiv(10), [2, 0, 5]); //=> Maybe.Nothing
 */


var traverse =
/*#__PURE__*/
_curry3(function traverse(of, f, traversable) {
  return typeof traversable['fantasy-land/traverse'] === 'function' ? traversable['fantasy-land/traverse'](f, of) : typeof traversable.traverse === 'function' ? traversable.traverse(f, of) : sequence(of, map(f, traversable));
});

module.exports = traverse;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var ws = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u2000\u2001\u2002\u2003' + '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028' + '\u2029\uFEFF';
var zeroWidth = '\u200b';
var hasProtoTrim = typeof String.prototype.trim === 'function';
/**
 * Removes (strips) whitespace from both ends of the string.
 *
 * @func
 * @memberOf R
 * @since v0.6.0
 * @category String
 * @sig String -> String
 * @param {String} str The string to trim.
 * @return {String} Trimmed version of `str`.
 * @example
 *
 *      R.trim('   xyz  '); //=> 'xyz'
 *      R.map(R.trim, R.split(',', 'x, y, z')); //=> ['x', 'y', 'z']
 */

var trim = !hasProtoTrim ||
/*#__PURE__*/
ws.trim() || !
/*#__PURE__*/
zeroWidth.trim() ?
/*#__PURE__*/
_curry1(function trim(str) {
  var beginRx = new RegExp('^[' + ws + '][' + ws + ']*');
  var endRx = new RegExp('[' + ws + '][' + ws + ']*$');
  return str.replace(beginRx, '').replace(endRx, '');
}) :
/*#__PURE__*/
_curry1(function trim(str) {
  return str.trim();
});
module.exports = trim;var _arity =
/*#__PURE__*/
require("./internal/_arity.js");

var _concat =
/*#__PURE__*/
require("./internal/_concat.js");

var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * `tryCatch` takes two functions, a `tryer` and a `catcher`. The returned
 * function evaluates the `tryer`; if it does not throw, it simply returns the
 * result. If the `tryer` *does* throw, the returned function evaluates the
 * `catcher` function and returns its result. Note that for effective
 * composition with this function, both the `tryer` and `catcher` functions
 * must return the same type of results.
 *
 * @func
 * @memberOf R
 * @since v0.20.0
 * @category Function
 * @sig (...x -> a) -> ((e, ...x) -> a) -> (...x -> a)
 * @param {Function} tryer The function that may throw.
 * @param {Function} catcher The function that will be evaluated if `tryer` throws.
 * @return {Function} A new function that will catch exceptions and send them to the catcher.
 * @example
 *
 *      R.tryCatch(R.prop('x'), R.F)({x: true}); //=> true
 *      R.tryCatch(() => { throw 'foo'}, R.always('caught'))('bar') // =>
 *      'caught'
 *      R.tryCatch(R.times(R.identity), R.always([]))('s') // => []
 *      R.tryCatch(() => { throw 'this is not a valid value'}, (err, value)=>({error : err,  value }))('bar') // => {'error': 'this is not a valid value', 'value': 'bar'}
 */


var tryCatch =
/*#__PURE__*/
_curry2(function _tryCatch(tryer, catcher) {
  return _arity(tryer.length, function () {
    try {
      return tryer.apply(this, arguments);
    } catch (e) {
      return catcher.apply(this, _concat([e], arguments));
    }
  });
});

module.exports = tryCatch;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");
/**
 * Gives a single-word string description of the (native) type of a value,
 * returning such answers as 'Object', 'Number', 'Array', or 'Null'. Does not
 * attempt to distinguish user Object types any further, reporting them all as
 * 'Object'.
 *
 * @func
 * @memberOf R
 * @since v0.8.0
 * @category Type
 * @sig (* -> {*}) -> String
 * @param {*} val The value to test
 * @return {String}
 * @example
 *
 *      R.type({}); //=> "Object"
 *      R.type(1); //=> "Number"
 *      R.type(false); //=> "Boolean"
 *      R.type('s'); //=> "String"
 *      R.type(null); //=> "Null"
 *      R.type([]); //=> "Array"
 *      R.type(/[A-z]/); //=> "RegExp"
 *      R.type(() => {}); //=> "Function"
 *      R.type(undefined); //=> "Undefined"
 */


var type =
/*#__PURE__*/
_curry1(function type(val) {
  return val === null ? 'Null' : val === undefined ? 'Undefined' : Object.prototype.toString.call(val).slice(8, -1);
});

module.exports = type;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");
/**
 * Takes a function `fn`, which takes a single array argument, and returns a
 * function which:
 *
 *   - takes any number of positional arguments;
 *   - passes these arguments to `fn` as an array; and
 *   - returns the result.
 *
 * In other words, `R.unapply` derives a variadic function from a function which
 * takes an array. `R.unapply` is the inverse of [`R.apply`](#apply).
 *
 * @func
 * @memberOf R
 * @since v0.8.0
 * @category Function
 * @sig ([*...] -> a) -> (*... -> a)
 * @param {Function} fn
 * @return {Function}
 * @see R.apply
 * @example
 *
 *      R.unapply(JSON.stringify)(1, 2, 3); //=> '[1,2,3]'
 * @symb R.unapply(f)(a, b) = f([a, b])
 */


var unapply =
/*#__PURE__*/
_curry1(function unapply(fn) {
  return function () {
    return fn(Array.prototype.slice.call(arguments, 0));
  };
});

module.exports = unapply;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var nAry =
/*#__PURE__*/
require("./nAry.js");
/**
 * Wraps a function of any arity (including nullary) in a function that accepts
 * exactly 1 parameter. Any extraneous parameters will not be passed to the
 * supplied function.
 *
 * @func
 * @memberOf R
 * @since v0.2.0
 * @category Function
 * @sig (a -> b -> c -> ... -> z) -> (a -> z)
 * @param {Function} fn The function to wrap.
 * @return {Function} A new function wrapping `fn`. The new function is guaranteed to be of
 *         arity 1.
 * @see R.binary, R.nAry
 * @example
 *
 *      const takesTwoArgs = function(a, b) {
 *        return [a, b];
 *      };
 *      takesTwoArgs.length; //=> 2
 *      takesTwoArgs(1, 2); //=> [1, 2]
 *
 *      const takesOneArg = R.unary(takesTwoArgs);
 *      takesOneArg.length; //=> 1
 *      // Only 1 argument is passed to the wrapped function
 *      takesOneArg(1, 2); //=> [1, undefined]
 * @symb R.unary(f)(a, b, c) = f(a)
 */


var unary =
/*#__PURE__*/
_curry1(function unary(fn) {
  return nAry(1, fn);
});

module.exports = unary;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var curryN =
/*#__PURE__*/
require("./curryN.js");
/**
 * Returns a function of arity `n` from a (manually) curried function.
 * Note that, the returned function is actually a ramda style
 * curryied function, which can accept one or more arguments in each
 * function calling.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category Function
 * @sig Number -> (a -> b -> c ... -> z) -> ((a -> b -> c ...) -> z)
 * @param {Number} length The arity for the returned function.
 * @param {Function} fn The function to uncurry.
 * @return {Function} A new function.
 * @see R.curry, R.curryN
 * @example
 *
 *      const addFour = a => b => c => d => a + b + c + d;
 *
 *      const uncurriedAddFour = R.uncurryN(4, addFour);
 *      uncurriedAddFour(1, 2, 3, 4); //=> 10
 */


var uncurryN =
/*#__PURE__*/
_curry2(function uncurryN(depth, fn) {
  return curryN(depth, function () {
    var currentDepth = 1;
    var value = fn;
    var idx = 0;
    var endIdx;

    while (currentDepth <= depth && typeof value === 'function') {
      endIdx = currentDepth === depth ? arguments.length : idx + value.length;
      value = value.apply(this, Array.prototype.slice.call(arguments, idx, endIdx));
      currentDepth += 1;
      idx = endIdx;
    }

    return value;
  });
});

module.exports = uncurryN;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Builds a list from a seed value. Accepts an iterator function, which returns
 * either false to stop iteration or an array of length 2 containing the value
 * to add to the resulting list and the seed to be used in the next call to the
 * iterator function.
 *
 * The iterator function receives one argument: *(seed)*.
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category List
 * @sig (a -> [b]) -> * -> [b]
 * @param {Function} fn The iterator function. receives one argument, `seed`, and returns
 *        either false to quit iteration or an array of length two to proceed. The element
 *        at index 0 of this array will be added to the resulting array, and the element
 *        at index 1 will be passed to the next call to `fn`.
 * @param {*} seed The seed value.
 * @return {Array} The final list.
 * @example
 *
 *      const f = n => n > 50 ? false : [-n, n + 10];
 *      R.unfold(f, 10); //=> [-10, -20, -30, -40, -50]
 * @symb R.unfold(f, x) = [f(x)[0], f(f(x)[1])[0], f(f(f(x)[1])[1])[0], ...]
 */


var unfold =
/*#__PURE__*/
_curry2(function unfold(fn, seed) {
  var pair = fn(seed);
  var result = [];

  while (pair && pair.length) {
    result[result.length] = pair[0];
    pair = fn(pair[1]);
  }

  return result;
});

module.exports = unfold;var _concat =
/*#__PURE__*/
require("./internal/_concat.js");

var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var compose =
/*#__PURE__*/
require("./compose.js");

var uniq =
/*#__PURE__*/
require("./uniq.js");
/**
 * Combines two lists into a set (i.e. no duplicates) composed of the elements
 * of each list.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig [*] -> [*] -> [*]
 * @param {Array} as The first list.
 * @param {Array} bs The second list.
 * @return {Array} The first and second lists concatenated, with
 *         duplicates removed.
 * @example
 *
 *      R.union([1, 2, 3], [2, 3, 4]); //=> [1, 2, 3, 4]
 */


var union =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
compose(uniq, _concat));

module.exports = union;var _concat =
/*#__PURE__*/
require("./internal/_concat.js");

var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");

var uniqWith =
/*#__PURE__*/
require("./uniqWith.js");
/**
 * Combines two lists into a set (i.e. no duplicates) composed of the elements
 * of each list. Duplication is determined according to the value returned by
 * applying the supplied predicate to two list elements. If an element exists
 * in both lists, the first element from the first list will be used.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig ((a, a) -> Boolean) -> [*] -> [*] -> [*]
 * @param {Function} pred A predicate used to test whether two items are equal.
 * @param {Array} list1 The first list.
 * @param {Array} list2 The second list.
 * @return {Array} The first and second lists concatenated, with
 *         duplicates removed.
 * @see R.union
 * @example
 *
 *      const l1 = [{a: 1}, {a: 2}];
 *      const l2 = [{a: 1}, {a: 4}];
 *      R.unionWith(R.eqBy(R.prop('a')), l1, l2); //=> [{a: 1}, {a: 2}, {a: 4}]
 */


var unionWith =
/*#__PURE__*/
_curry3(function unionWith(pred, list1, list2) {
  return uniqWith(pred, _concat(list1, list2));
});

module.exports = unionWith;var identity =
/*#__PURE__*/
require("./identity.js");

var uniqBy =
/*#__PURE__*/
require("./uniqBy.js");
/**
 * Returns a new list containing only one copy of each element in the original
 * list. [`R.equals`](#equals) is used to determine equality.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig [a] -> [a]
 * @param {Array} list The array to consider.
 * @return {Array} The list of unique items.
 * @example
 *
 *      R.uniq([1, 1, 2, 1]); //=> [1, 2]
 *      R.uniq([1, '1']);     //=> [1, '1']
 *      R.uniq([[42], [42]]); //=> [[42]]
 */


var uniq =
/*#__PURE__*/
uniqBy(identity);
module.exports = uniq;var _Set =
/*#__PURE__*/
require("./internal/_Set.js");

var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _dispatchable =
/*#__PURE__*/
require("./internal/_dispatchable.js");

var _xuniqBy =
/*#__PURE__*/
require("./internal/_xuniqBy.js");
/**
 * Returns a new list containing only one copy of each element in the original
 * list, based upon the value returned by applying the supplied function to
 * each list element. Prefers the first item if the supplied function produces
 * the same value on two items. [`R.equals`](#equals) is used for comparison.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category List
 * @sig (a -> b) -> [a] -> [a]
 * @param {Function} fn A function used to produce a value to use during comparisons.
 * @param {Array} list The array to consider.
 * @return {Array} The list of unique items.
 * @example
 *
 *      R.uniqBy(Math.abs, [-1, -5, 2, 10, 1, 2]); //=> [-1, -5, 2, 10]
 */


var uniqBy =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable([], _xuniqBy, function (fn, list) {
  var set = new _Set();
  var result = [];
  var idx = 0;
  var appliedItem, item;

  while (idx < list.length) {
    item = list[idx];
    appliedItem = fn(item);

    if (set.add(appliedItem)) {
      result.push(item);
    }

    idx += 1;
  }

  return result;
}));

module.exports = uniqBy;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _dispatchable =
/*#__PURE__*/
require("./internal/_dispatchable.js");

var _includesWith =
/*#__PURE__*/
require("./internal/_includesWith.js");

var _xuniqWith =
/*#__PURE__*/
require("./internal/_xuniqWith.js");
/**
 * Returns a new list containing only one copy of each element in the original
 * list, based upon the value returned by applying the supplied predicate to
 * two list elements. Prefers the first item if two items compare equal based
 * on the predicate.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.2.0
 * @category List
 * @sig ((a, a) -> Boolean) -> [a] -> [a]
 * @param {Function} pred A predicate used to test whether two items are equal.
 * @param {Array} list The array to consider.
 * @return {Array} The list of unique items.
 * @example
 *
 *      const strEq = R.eqBy(String);
 *      R.uniqWith(strEq)([1, '1', 2, 1]); //=> [1, 2]
 *      R.uniqWith(strEq)([{}, {}]);       //=> [{}]
 *      R.uniqWith(strEq)([1, '1', 1]);    //=> [1]
 *      R.uniqWith(strEq)(['1', 1, 1]);    //=> ['1']
 */


var uniqWith =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable([], _xuniqWith, function (pred, list) {
  var idx = 0;
  var len = list.length;
  var result = [];
  var item;

  while (idx < len) {
    item = list[idx];

    if (!_includesWith(pred, item, result)) {
      result[result.length] = item;
    }

    idx += 1;
  }

  return result;
}));

module.exports = uniqWith;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");
/**
 * Tests the final argument by passing it to the given predicate function. If
 * the predicate is not satisfied, the function will return the result of
 * calling the `whenFalseFn` function with the same argument. If the predicate
 * is satisfied, the argument is returned as is.
 *
 * @func
 * @memberOf R
 * @since v0.18.0
 * @category Logic
 * @sig (a -> Boolean) -> (a -> b) -> a -> a | b
 * @param {Function} pred        A predicate function
 * @param {Function} whenFalseFn A function to invoke when the `pred` evaluates
 *                               to a falsy value.
 * @param {*}        x           An object to test with the `pred` function and
 *                               pass to `whenFalseFn` if necessary.
 * @return {*} Either `x` or the result of applying `x` to `whenFalseFn`.
 * @see R.ifElse, R.when, R.cond
 * @example
 *
 *      let safeInc = R.unless(R.isNil, R.inc);
 *      safeInc(null); //=> null
 *      safeInc(1); //=> 2
 */


var unless =
/*#__PURE__*/
_curry3(function unless(pred, whenFalseFn, x) {
  return pred(x) ? x : whenFalseFn(x);
});

module.exports = unless;var _identity =
/*#__PURE__*/
require("./internal/_identity.js");

var chain =
/*#__PURE__*/
require("./chain.js");
/**
 * Shorthand for `R.chain(R.identity)`, which removes one level of nesting from
 * any [Chain](https://github.com/fantasyland/fantasy-land#chain).
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category List
 * @sig Chain c => c (c a) -> c a
 * @param {*} list
 * @return {*}
 * @see R.flatten, R.chain
 * @example
 *
 *      R.unnest([1, [2], [[3]]]); //=> [1, 2, [3]]
 *      R.unnest([[1, 2], [3, 4], [5, 6]]); //=> [1, 2, 3, 4, 5, 6]
 */


var unnest =
/*#__PURE__*/
chain(_identity);
module.exports = unnest;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");
/**
 * Takes a predicate, a transformation function, and an initial value,
 * and returns a value of the same type as the initial value.
 * It does so by applying the transformation until the predicate is satisfied,
 * at which point it returns the satisfactory value.
 *
 * @func
 * @memberOf R
 * @since v0.20.0
 * @category Logic
 * @sig (a -> Boolean) -> (a -> a) -> a -> a
 * @param {Function} pred A predicate function
 * @param {Function} fn The iterator function
 * @param {*} init Initial value
 * @return {*} Final value that satisfies predicate
 * @example
 *
 *      R.until(R.gt(R.__, 100), R.multiply(2))(1) // => 128
 */


var until =
/*#__PURE__*/
_curry3(function until(pred, fn, init) {
  var val = init;

  while (!pred(val)) {
    val = fn(val);
  }

  return val;
});

module.exports = until;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _isArray =
/*#__PURE__*/
require("./internal/_isArray.js");

var _map =
/*#__PURE__*/
require("./internal/_map.js");

var _assoc =
/*#__PURE__*/
require("./internal/_assoc.js");
/**
 *
 * Deconstructs an array field from the input documents to output a document for each element.
 * Each output document is the input document with the value of the array field replaced by the element.
 *
 * @func
 * @memberOf R
 * @since v0.28.0
 * @category Object
 * @sig String -> {k: [v]} -> [{k: v}]
 * @param {String} key The key to determine which property of the object should be unwind
 * @param {Object} object The object containing list under property named as key which is to unwind
 * @return {List} A new list of object containing the value of input key having list replaced by each element in the object.
 * @example
 *
 * R.unwind('hobbies', {
 *   name: 'alice',
 *   hobbies: ['Golf', 'Hacking'],
 *   colors: ['red', 'green'],
 * });
 * // [
 * //   { name: 'alice', hobbies: 'Golf', colors: ['red', 'green'] },
 * //   { name: 'alice', hobbies: 'Hacking', colors: ['red', 'green'] }
 * // ]
 */


var unwind =
/*#__PURE__*/
_curry2(function (key, object) {
  // If key is not in object or key is not as a list in object
  if (!(key in object && _isArray(object[key]))) {
    return [object];
  } // Map over object[key] which is a list and assoc each element with key


  return _map(function (item) {
    return _assoc(key, item, object);
  }, object[key]);
});

module.exports = unwind;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");

var adjust =
/*#__PURE__*/
require("./adjust.js");

var always =
/*#__PURE__*/
require("./always.js");
/**
 * Returns a new copy of the array with the element at the provided index
 * replaced with the given value.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category List
 * @sig Number -> a -> [a] -> [a]
 * @param {Number} idx The index to update.
 * @param {*} x The value to exist at the given index of the returned array.
 * @param {Array|Arguments} list The source array-like object to be updated.
 * @return {Array} A copy of `list` with the value at index `idx` replaced with `x`.
 * @see R.adjust
 * @example
 *
 *      R.update(1, '_', ['a', 'b', 'c']);      //=> ['a', '_', 'c']
 *      R.update(-1, '_', ['a', 'b', 'c']);     //=> ['a', 'b', '_']
 * @symb R.update(-1, a, [b, c]) = [b, a]
 * @symb R.update(0, a, [b, c]) = [a, c]
 * @symb R.update(1, a, [b, c]) = [b, a]
 */


var update =
/*#__PURE__*/
_curry3(function update(idx, x, list) {
  return adjust(idx, always(x), list);
});

module.exports = update;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var curryN =
/*#__PURE__*/
require("./curryN.js");
/**
 * Accepts a function `fn` and a list of transformer functions and returns a
 * new curried function. When the new function is invoked, it calls the
 * function `fn` with parameters consisting of the result of calling each
 * supplied handler on successive arguments to the new function.
 *
 * If more arguments are passed to the returned function than transformer
 * functions, those arguments are passed directly to `fn` as additional
 * parameters. If you expect additional arguments that don't need to be
 * transformed, although you can ignore them, it's best to pass an identity
 * function so that the new function reports the correct arity.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig ((x1, x2, ...) -> z) -> [(a -> x1), (b -> x2), ...] -> (a -> b -> ... -> z)
 * @param {Function} fn The function to wrap.
 * @param {Array} transformers A list of transformer functions
 * @return {Function} The wrapped function.
 * @see R.converge
 * @example
 *
 *      R.useWith(Math.pow, [R.identity, R.identity])(3, 4); //=> 81
 *      R.useWith(Math.pow, [R.identity, R.identity])(3)(4); //=> 81
 *      R.useWith(Math.pow, [R.dec, R.inc])(3, 4); //=> 32
 *      R.useWith(Math.pow, [R.dec, R.inc])(3)(4); //=> 32
 * @symb R.useWith(f, [g, h])(a, b) = f(g(a), h(b))
 */


var useWith =
/*#__PURE__*/
_curry2(function useWith(fn, transformers) {
  return curryN(transformers.length, function () {
    var args = [];
    var idx = 0;

    while (idx < transformers.length) {
      args.push(transformers[idx].call(this, arguments[idx]));
      idx += 1;
    }

    return fn.apply(this, args.concat(Array.prototype.slice.call(arguments, transformers.length)));
  });
});

module.exports = useWith;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");

var keys =
/*#__PURE__*/
require("./keys.js");
/**
 * Returns a list of all the enumerable own properties of the supplied object.
 * Note that the order of the output array is not guaranteed across different
 * JS platforms.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @sig {k: v} -> [v]
 * @param {Object} obj The object to extract values from
 * @return {Array} An array of the values of the object's own properties.
 * @see R.valuesIn, R.keys, R.toPairs
 * @example
 *
 *      R.values({a: 1, b: 2, c: 3}); //=> [1, 2, 3]
 */


var values =
/*#__PURE__*/
_curry1(function values(obj) {
  var props = keys(obj);
  var len = props.length;
  var vals = [];
  var idx = 0;

  while (idx < len) {
    vals[idx] = obj[props[idx]];
    idx += 1;
  }

  return vals;
});

module.exports = values;var _curry1 =
/*#__PURE__*/
require("./internal/_curry1.js");
/**
 * Returns a list of all the properties, including prototype properties, of the
 * supplied object.
 * Note that the order of the output array is not guaranteed to be consistent
 * across different JS platforms.
 *
 * @func
 * @memberOf R
 * @since v0.2.0
 * @category Object
 * @sig {k: v} -> [v]
 * @param {Object} obj The object to extract values from
 * @return {Array} An array of the values of the object's own and prototype properties.
 * @see R.values, R.keysIn
 * @example
 *
 *      const F = function() { this.x = 'X'; };
 *      F.prototype.y = 'Y';
 *      const f = new F();
 *      R.valuesIn(f); //=> ['X', 'Y']
 */


var valuesIn =
/*#__PURE__*/
_curry1(function valuesIn(obj) {
  var prop;
  var vs = [];

  for (prop in obj) {
    vs[vs.length] = obj[prop];
  }

  return vs;
});

module.exports = valuesIn;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js"); // `Const` is a functor that effectively ignores the function given to `map`.


var Const = function (x) {
  return {
    value: x,
    'fantasy-land/map': function () {
      return this;
    }
  };
};
/**
 * Returns a "view" of the given data structure, determined by the given lens.
 * The lens's focus determines which portion of the data structure is visible.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category Object
 * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
 * @sig Lens s a -> s -> a
 * @param {Lens} lens
 * @param {*} x
 * @return {*}
 * @see R.set, R.over, R.lens, R.lensIndex, R.lensProp, R.lensPath
 * @example
 *
 *      const xLens = R.lensProp('x');
 *
 *      R.view(xLens, {x: 1, y: 2});  //=> 1
 *      R.view(xLens, {x: 4, y: 2});  //=> 4
 */


var view =
/*#__PURE__*/
_curry2(function view(lens, x) {
  // Using `Const` effectively ignores the setter function of the `lens`,
  // leaving the value returned by the getter function unmodified.
  return lens(Const)(x).value;
});

module.exports = view;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");
/**
 * Tests the final argument by passing it to the given predicate function. If
 * the predicate is satisfied, the function will return the result of calling
 * the `whenTrueFn` function with the same argument. If the predicate is not
 * satisfied, the argument is returned as is.
 *
 * @func
 * @memberOf R
 * @since v0.18.0
 * @category Logic
 * @sig (a -> Boolean) -> (a -> b) -> a -> a | b
 * @param {Function} pred       A predicate function
 * @param {Function} whenTrueFn A function to invoke when the `condition`
 *                              evaluates to a truthy value.
 * @param {*}        x          An object to test with the `pred` function and
 *                              pass to `whenTrueFn` if necessary.
 * @return {*} Either `x` or the result of applying `x` to `whenTrueFn`.
 * @see R.ifElse, R.unless, R.cond
 * @example
 *
 *      // truncate :: String -> String
 *      const truncate = R.when(
 *        R.propSatisfies(R.gt(R.__, 10), 'length'),
 *        R.pipe(R.take(10), R.append('…'), R.join(''))
 *      );
 *      truncate('12345');         //=> '12345'
 *      truncate('0123456789ABC'); //=> '0123456789…'
 */


var when =
/*#__PURE__*/
_curry3(function when(pred, whenTrueFn, x) {
  return pred(x) ? whenTrueFn(x) : x;
});

module.exports = when;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _has =
/*#__PURE__*/
require("./internal/_has.js");
/**
 * Takes a spec object and a test object; returns true if the test satisfies
 * the spec. Each of the spec's own properties must be a predicate function.
 * Each predicate is applied to the value of the corresponding property of the
 * test object. `where` returns true if all the predicates return true, false
 * otherwise.
 *
 * `where` is well suited to declaratively expressing constraints for other
 * functions such as [`filter`](#filter) and [`find`](#find).
 *
 * @func
 * @memberOf R
 * @since v0.1.1
 * @category Object
 * @sig {String: (* -> Boolean)} -> {String: *} -> Boolean
 * @param {Object} spec
 * @param {Object} testObj
 * @return {Boolean}
 * @see R.propSatisfies, R.whereEq
 * @example
 *
 *      // pred :: Object -> Boolean
 *      const pred = R.where({
 *        a: R.equals('foo'),
 *        b: R.complement(R.equals('bar')),
 *        x: R.gt(R.__, 10),
 *        y: R.lt(R.__, 20)
 *      });
 *
 *      pred({a: 'foo', b: 'xxx', x: 11, y: 19}); //=> true
 *      pred({a: 'xxx', b: 'xxx', x: 11, y: 19}); //=> false
 *      pred({a: 'foo', b: 'bar', x: 11, y: 19}); //=> false
 *      pred({a: 'foo', b: 'xxx', x: 10, y: 19}); //=> false
 *      pred({a: 'foo', b: 'xxx', x: 11, y: 20}); //=> false
 */


var where =
/*#__PURE__*/
_curry2(function where(spec, testObj) {
  for (var prop in spec) {
    if (_has(prop, spec) && !spec[prop](testObj[prop])) {
      return false;
    }
  }

  return true;
});

module.exports = where;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var _has =
/*#__PURE__*/
require("./internal/_has.js");
/**
 * Takes a spec object and a test object; each of the spec's own properties must be a predicate function.
 * Each predicate is applied to the value of the corresponding property of the
 * test object. `whereAny` returns true if at least one of the predicates return true,
 * false otherwise.
 *
 * `whereAny` is well suited to declaratively expressing constraints for other
 * functions such as [`filter`](#filter) and [`find`](#find).
 *
 * @func
 * @memberOf R
 * @since v0.28.0
 * @category Object
 * @sig {String: (* -> Boolean)} -> {String: *} -> Boolean
 * @param {Object} spec
 * @param {Object} testObj
 * @return {Boolean}
 * @see R.propSatisfies, R.where
 * @example
 *
 *      // pred :: Object -> Boolean
 *      const pred = R.whereAny({
 *        a: R.equals('foo'),
 *        b: R.complement(R.equals('xxx')),
 *        x: R.gt(R.__, 10),
 *        y: R.lt(R.__, 20)
 *      });
 *
 *      pred({a: 'foo', b: 'xxx', x: 8, y: 34}); //=> true
 *      pred({a: 'xxx', b: 'xxx', x: 9, y: 21}); //=> false
 *      pred({a: 'bar', b: 'xxx', x: 10, y: 20}); //=> false
 *      pred({a: 'foo', b: 'bar', x: 10, y: 20}); //=> true
 *      pred({a: 'foo', b: 'xxx', x: 11, y: 20}); //=> true
 */


var whereAny =
/*#__PURE__*/
_curry2(function whereAny(spec, testObj) {
  for (var prop in spec) {
    if (_has(prop, spec) && spec[prop](testObj[prop])) {
      return true;
    }
  }

  return false;
});

module.exports = whereAny;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var equals =
/*#__PURE__*/
require("./equals.js");

var map =
/*#__PURE__*/
require("./map.js");

var where =
/*#__PURE__*/
require("./where.js");
/**
 * Takes a spec object and a test object; returns true if the test satisfies
 * the spec, false otherwise. An object satisfies the spec if, for each of the
 * spec's own properties, accessing that property of the object gives the same
 * value (in [`R.equals`](#equals) terms) as accessing that property of the
 * spec.
 *
 * `whereEq` is a specialization of [`where`](#where).
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category Object
 * @sig {String: *} -> {String: *} -> Boolean
 * @param {Object} spec
 * @param {Object} testObj
 * @return {Boolean}
 * @see R.propEq, R.where
 * @example
 *
 *      // pred :: Object -> Boolean
 *      const pred = R.whereEq({a: 1, b: 2});
 *
 *      pred({a: 1});              //=> false
 *      pred({a: 1, b: 2});        //=> true
 *      pred({a: 1, b: 2, c: 3});  //=> true
 *      pred({a: 1, b: 1});        //=> false
 */


var whereEq =
/*#__PURE__*/
_curry2(function whereEq(spec, testObj) {
  return where(map(equals, spec), testObj);
});

module.exports = whereEq;var _includes =
/*#__PURE__*/
require("./internal/_includes.js");

var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");

var flip =
/*#__PURE__*/
require("./flip.js");

var reject =
/*#__PURE__*/
require("./reject.js");
/**
 * Returns a new list without values in the first argument.
 * [`R.equals`](#equals) is used to determine equality.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category List
 * @sig [a] -> [a] -> [a]
 * @param {Array} list1 The values to be removed from `list2`.
 * @param {Array} list2 The array to remove values from.
 * @return {Array} The new array without values in `list1`.
 * @see R.transduce, R.difference, R.remove
 * @example
 *
 *      R.without([1, 2], [1, 2, 1, 3, 4]); //=> [3, 4]
 */


var without =
/*#__PURE__*/
_curry2(function (xs, list) {
  return reject(flip(_includes)(xs), list);
});

module.exports = without;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Exclusive disjunction logical operation.
 * Returns `true` if one of the arguments is truthy and the other is falsy.
 * Otherwise, it returns `false`.
 *
 * @func
 * @memberOf R
 * @since v0.27.1
 * @category Logic
 * @sig a -> b -> Boolean
 * @param {Any} a
 * @param {Any} b
 * @return {Boolean} true if one of the arguments is truthy and the other is falsy
 * @see R.or, R.and
 * @example
 *
 *      R.xor(true, true); //=> false
 *      R.xor(true, false); //=> true
 *      R.xor(false, true); //=> true
 *      R.xor(false, false); //=> false
 */


var xor =
/*#__PURE__*/
_curry2(function xor(a, b) {
  return Boolean(!a ^ !b);
});

module.exports = xor;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Creates a new list out of the two supplied by creating each possible pair
 * from the lists.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig [a] -> [b] -> [[a,b]]
 * @param {Array} as The first list.
 * @param {Array} bs The second list.
 * @return {Array} The list made by combining each possible pair from
 *         `as` and `bs` into pairs (`[a, b]`).
 * @example
 *
 *      R.xprod([1, 2], ['a', 'b']); //=> [[1, 'a'], [1, 'b'], [2, 'a'], [2, 'b']]
 * @symb R.xprod([a, b], [c, d]) = [[a, c], [a, d], [b, c], [b, d]]
 */


var xprod =
/*#__PURE__*/
_curry2(function xprod(a, b) {
  // = xprodWith(prepend); (takes about 3 times as long...)
  var idx = 0;
  var ilen = a.length;
  var j;
  var jlen = b.length;
  var result = [];

  while (idx < ilen) {
    j = 0;

    while (j < jlen) {
      result[result.length] = [a[idx], b[j]];
      j += 1;
    }

    idx += 1;
  }

  return result;
});

module.exports = xprod;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Creates a new list out of the two supplied by pairing up equally-positioned
 * items from both lists. The returned list is truncated to the length of the
 * shorter of the two input lists.
 * Note: `zip` is equivalent to `zipWith(function(a, b) { return [a, b] })`.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig [a] -> [b] -> [[a,b]]
 * @param {Array} list1 The first array to consider.
 * @param {Array} list2 The second array to consider.
 * @return {Array} The list made by pairing up same-indexed elements of `list1` and `list2`.
 * @example
 *
 *      R.zip([1, 2, 3], ['a', 'b', 'c']); //=> [[1, 'a'], [2, 'b'], [3, 'c']]
 * @symb R.zip([a, b, c], [d, e, f]) = [[a, d], [b, e], [c, f]]
 */


var zip =
/*#__PURE__*/
_curry2(function zip(a, b) {
  var rv = [];
  var idx = 0;
  var len = Math.min(a.length, b.length);

  while (idx < len) {
    rv[idx] = [a[idx], b[idx]];
    idx += 1;
  }

  return rv;
});

module.exports = zip;var _curry2 =
/*#__PURE__*/
require("./internal/_curry2.js");
/**
 * Creates a new object out of a list of keys and a list of values.
 * Key/value pairing is truncated to the length of the shorter of the two lists.
 * Note: `zipObj` is equivalent to `pipe(zip, fromPairs)`.
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category List
 * @sig [String] -> [*] -> {String: *}
 * @param {Array} keys The array that will be properties on the output object.
 * @param {Array} values The list of values on the output object.
 * @return {Object} The object made by pairing up same-indexed elements of `keys` and `values`.
 * @example
 *
 *      R.zipObj(['a', 'b', 'c'], [1, 2, 3]); //=> {a: 1, b: 2, c: 3}
 */


var zipObj =
/*#__PURE__*/
_curry2(function zipObj(keys, values) {
  var idx = 0;
  var len = Math.min(keys.length, values.length);
  var out = {};

  while (idx < len) {
    out[keys[idx]] = values[idx];
    idx += 1;
  }

  return out;
});

module.exports = zipObj;var _curry3 =
/*#__PURE__*/
require("./internal/_curry3.js");
/**
 * Creates a new list out of the two supplied by applying the function to each
 * equally-positioned pair in the lists. The returned list is truncated to the
 * length of the shorter of the two input lists.
 *
 * @function
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig ((a, b) -> c) -> [a] -> [b] -> [c]
 * @param {Function} fn The function used to combine the two elements into one value.
 * @param {Array} list1 The first array to consider.
 * @param {Array} list2 The second array to consider.
 * @return {Array} The list made by combining same-indexed elements of `list1` and `list2`
 *         using `fn`.
 * @example
 *
 *      const f = (x, y) => {
 *        // ...
 *      };
 *      R.zipWith(f, [1, 2, 3], ['a', 'b', 'c']);
 *      //=> [f(1, 'a'), f(2, 'b'), f(3, 'c')]
 * @symb R.zipWith(fn, [a, b, c], [d, e, f]) = [fn(a, d), fn(b, e), fn(c, f)]
 */


var zipWith =
/*#__PURE__*/
_curry3(function zipWith(fn, a, b) {
  var rv = [];
  var idx = 0;
  var len = Math.min(a.length, b.length);

  while (idx < len) {
    rv[idx] = fn(a[idx], b[idx]);
    idx += 1;
  }

  return rv;
});

module.exports = zipWith;var _includes =
/*#__PURE__*/
require("./_includes.js");

var _Set =
/*#__PURE__*/
function () {
  function _Set() {
    /* globals Set */
    this._nativeSet = typeof Set === 'function' ? new Set() : null;
    this._items = {};
  }

  // until we figure out why jsdoc chokes on this
  // @param item The item to add to the Set
  // @returns {boolean} true if the item did not exist prior, otherwise false
  //
  _Set.prototype.add = function (item) {
    return !hasOrAdd(item, true, this);
  }; //
  // @param item The item to check for existence in the Set
  // @returns {boolean} true if the item exists in the Set, otherwise false
  //


  _Set.prototype.has = function (item) {
    return hasOrAdd(item, false, this);
  }; //
  // Combines the logic for checking whether an item is a member of the set and
  // for adding a new item to the set.
  //
  // @param item       The item to check or add to the Set instance.
  // @param shouldAdd  If true, the item will be added to the set if it doesn't
  //                   already exist.
  // @param set        The set instance to check or add to.
  // @return {boolean} true if the item already existed, otherwise false.
  //


  return _Set;
}();

function hasOrAdd(item, shouldAdd, set) {
  var type = typeof item;
  var prevSize, newSize;

  switch (type) {
    case 'string':
    case 'number':
      // distinguish between +0 and -0
      if (item === 0 && 1 / item === -Infinity) {
        if (set._items['-0']) {
          return true;
        } else {
          if (shouldAdd) {
            set._items['-0'] = true;
          }

          return false;
        }
      } // these types can all utilise the native Set


      if (set._nativeSet !== null) {
        if (shouldAdd) {
          prevSize = set._nativeSet.size;

          set._nativeSet.add(item);

          newSize = set._nativeSet.size;
          return newSize === prevSize;
        } else {
          return set._nativeSet.has(item);
        }
      } else {
        if (!(type in set._items)) {
          if (shouldAdd) {
            set._items[type] = {};
            set._items[type][item] = true;
          }

          return false;
        } else if (item in set._items[type]) {
          return true;
        } else {
          if (shouldAdd) {
            set._items[type][item] = true;
          }

          return false;
        }
      }

    case 'boolean':
      // set._items['boolean'] holds a two element array
      // representing [ falseExists, trueExists ]
      if (type in set._items) {
        var bIdx = item ? 1 : 0;

        if (set._items[type][bIdx]) {
          return true;
        } else {
          if (shouldAdd) {
            set._items[type][bIdx] = true;
          }

          return false;
        }
      } else {
        if (shouldAdd) {
          set._items[type] = item ? [false, true] : [true, false];
        }

        return false;
      }

    case 'function':
      // compare functions for reference equality
      if (set._nativeSet !== null) {
        if (shouldAdd) {
          prevSize = set._nativeSet.size;

          set._nativeSet.add(item);

          newSize = set._nativeSet.size;
          return newSize === prevSize;
        } else {
          return set._nativeSet.has(item);
        }
      } else {
        if (!(type in set._items)) {
          if (shouldAdd) {
            set._items[type] = [item];
          }

          return false;
        }

        if (!_includes(item, set._items[type])) {
          if (shouldAdd) {
            set._items[type].push(item);
          }

          return false;
        }

        return true;
      }

    case 'undefined':
      if (set._items[type]) {
        return true;
      } else {
        if (shouldAdd) {
          set._items[type] = true;
        }

        return false;
      }

    case 'object':
      if (item === null) {
        if (!set._items['null']) {
          if (shouldAdd) {
            set._items['null'] = true;
          }

          return false;
        }

        return true;
      }

    /* falls through */

    default:
      // reduce the search size of heterogeneous sets by creating buckets
      // for each type.
      type = Object.prototype.toString.call(item);

      if (!(type in set._items)) {
        if (shouldAdd) {
          set._items[type] = [item];
        }

        return false;
      } // scan through all previously applied items


      if (!_includes(item, set._items[type])) {
        if (shouldAdd) {
          set._items[type].push(item);
        }

        return false;
      }

      return true;
  }
} // A simple Set type that honours R.equals semantics


module.exports = _Set;function _aperture(n, list) {
  var idx = 0;
  var limit = list.length - (n - 1);
  var acc = new Array(limit >= 0 ? limit : 0);

  while (idx < limit) {
    acc[idx] = Array.prototype.slice.call(list, idx, idx + n);
    idx += 1;
  }

  return acc;
}

module.exports = _aperture;function _arity(n, fn) {
  /* eslint-disable no-unused-vars */
  switch (n) {
    case 0:
      return function () {
        return fn.apply(this, arguments);
      };

    case 1:
      return function (a0) {
        return fn.apply(this, arguments);
      };

    case 2:
      return function (a0, a1) {
        return fn.apply(this, arguments);
      };

    case 3:
      return function (a0, a1, a2) {
        return fn.apply(this, arguments);
      };

    case 4:
      return function (a0, a1, a2, a3) {
        return fn.apply(this, arguments);
      };

    case 5:
      return function (a0, a1, a2, a3, a4) {
        return fn.apply(this, arguments);
      };

    case 6:
      return function (a0, a1, a2, a3, a4, a5) {
        return fn.apply(this, arguments);
      };

    case 7:
      return function (a0, a1, a2, a3, a4, a5, a6) {
        return fn.apply(this, arguments);
      };

    case 8:
      return function (a0, a1, a2, a3, a4, a5, a6, a7) {
        return fn.apply(this, arguments);
      };

    case 9:
      return function (a0, a1, a2, a3, a4, a5, a6, a7, a8) {
        return fn.apply(this, arguments);
      };

    case 10:
      return function (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) {
        return fn.apply(this, arguments);
      };

    default:
      throw new Error('First argument to _arity must be a non-negative integer no greater than ten');
  }
}

module.exports = _arity;function _arrayFromIterator(iter) {
  var list = [];
  var next;

  while (!(next = iter.next()).done) {
    list.push(next.value);
  }

  return list;
}

module.exports = _arrayFromIterator;var _isFunction =
/*#__PURE__*/
require("./_isFunction.js");

var _toString =
/*#__PURE__*/
require("./_toString.js");

function _assertPromise(name, p) {
  if (p == null || !_isFunction(p.then)) {
    throw new TypeError('`' + name + '` expected a Promise, received ' + _toString(p, []));
  }
}

module.exports = _assertPromise;var _isArray =
/*#__PURE__*/
require("./_isArray.js");

var _isInteger =
/*#__PURE__*/
require("./_isInteger.js");
/**
 * Makes a shallow clone of an object, setting or overriding the specified
 * property with the given value. Note that this copies and flattens prototype
 * properties onto the new object as well. All non-primitive properties are
 * copied by reference.
 *
 * @private
 * @param {String|Number} prop The property name to set
 * @param {*} val The new value
 * @param {Object|Array} obj The object to clone
 * @return {Object|Array} A new object equivalent to the original except for the changed property.
 */


function _assoc(prop, val, obj) {
  if (_isInteger(prop) && _isArray(obj)) {
    var arr = [].concat(obj);
    arr[prop] = val;
    return arr;
  }

  var result = {};

  for (var p in obj) {
    result[p] = obj[p];
  }

  result[prop] = val;
  return result;
}

module.exports = _assoc;var _isArray =
/*#__PURE__*/
require("./_isArray.js");
/**
 * This checks whether a function has a [methodname] function. If it isn't an
 * array it will execute that function otherwise it will default to the ramda
 * implementation.
 *
 * @private
 * @param {Function} fn ramda implementation
 * @param {String} methodname property to check for a custom implementation
 * @return {Object} Whatever the return value of the method is.
 */


function _checkForMethod(methodname, fn) {
  return function () {
    var length = arguments.length;

    if (length === 0) {
      return fn();
    }

    var obj = arguments[length - 1];
    return _isArray(obj) || typeof obj[methodname] !== 'function' ? fn.apply(this, arguments) : obj[methodname].apply(obj, Array.prototype.slice.call(arguments, 0, length - 1));
  };
}

module.exports = _checkForMethod;var _cloneRegExp =
/*#__PURE__*/
require("./_cloneRegExp.js");

var type =
/*#__PURE__*/
require("../type.js");
/**
 * Copies an object.
 *
 * @private
 * @param {*} value The value to be copied
 * @param {Array} refFrom Array containing the source references
 * @param {Array} refTo Array containing the copied source references
 * @param {Boolean} deep Whether or not to perform deep cloning.
 * @return {*} The copied value.
 */


function _clone(value, refFrom, refTo, deep) {
  var copy = function copy(copiedValue) {
    var len = refFrom.length;
    var idx = 0;

    while (idx < len) {
      if (value === refFrom[idx]) {
        return refTo[idx];
      }

      idx += 1;
    }

    refFrom[idx] = value;
    refTo[idx] = copiedValue;

    for (var key in value) {
      if (value.hasOwnProperty(key)) {
        copiedValue[key] = deep ? _clone(value[key], refFrom, refTo, true) : value[key];
      }
    }

    return copiedValue;
  };

  switch (type(value)) {
    case 'Object':
      return copy(Object.create(Object.getPrototypeOf(value)));

    case 'Array':
      return copy([]);

    case 'Date':
      return new Date(value.valueOf());

    case 'RegExp':
      return _cloneRegExp(value);

    case 'Int8Array':
    case 'Uint8Array':
    case 'Uint8ClampedArray':
    case 'Int16Array':
    case 'Uint16Array':
    case 'Int32Array':
    case 'Uint32Array':
    case 'Float32Array':
    case 'Float64Array':
    case 'BigInt64Array':
    case 'BigUint64Array':
      return value.slice();

    default:
      return value;
  }
}

module.exports = _clone;function _cloneRegExp(pattern) {
  return new RegExp(pattern.source, (pattern.global ? 'g' : '') + (pattern.ignoreCase ? 'i' : '') + (pattern.multiline ? 'm' : '') + (pattern.sticky ? 'y' : '') + (pattern.unicode ? 'u' : ''));
}

module.exports = _cloneRegExp;function _complement(f) {
  return function () {
    return !f.apply(this, arguments);
  };
}

module.exports = _complement;/**
 * Private `concat` function to merge two array-like objects.
 *
 * @private
 * @param {Array|Arguments} [set1=[]] An array-like object.
 * @param {Array|Arguments} [set2=[]] An array-like object.
 * @return {Array} A new, merged array.
 * @example
 *
 *      _concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3]
 */
function _concat(set1, set2) {
  set1 = set1 || [];
  set2 = set2 || [];
  var idx;
  var len1 = set1.length;
  var len2 = set2.length;
  var result = [];
  idx = 0;

  while (idx < len1) {
    result[result.length] = set1[idx];
    idx += 1;
  }

  idx = 0;

  while (idx < len2) {
    result[result.length] = set2[idx];
    idx += 1;
  }

  return result;
}

module.exports = _concat;var _arity =
/*#__PURE__*/
require("./_arity.js");

var _curry2 =
/*#__PURE__*/
require("./_curry2.js");

function _createPartialApplicator(concat) {
  return _curry2(function (fn, args) {
    return _arity(Math.max(0, fn.length - args.length), function () {
      return fn.apply(this, concat(args, arguments));
    });
  });
}

module.exports = _createPartialApplicator;var _isPlaceholder =
/*#__PURE__*/
require("./_isPlaceholder.js");
/**
 * Optimized internal one-arity curry function.
 *
 * @private
 * @category Function
 * @param {Function} fn The function to curry.
 * @return {Function} The curried function.
 */


function _curry1(fn) {
  return function f1(a) {
    if (arguments.length === 0 || _isPlaceholder(a)) {
      return f1;
    } else {
      return fn.apply(this, arguments);
    }
  };
}

module.exports = _curry1;var _curry1 =
/*#__PURE__*/
require("./_curry1.js");

var _isPlaceholder =
/*#__PURE__*/
require("./_isPlaceholder.js");
/**
 * Optimized internal two-arity curry function.
 *
 * @private
 * @category Function
 * @param {Function} fn The function to curry.
 * @return {Function} The curried function.
 */


function _curry2(fn) {
  return function f2(a, b) {
    switch (arguments.length) {
      case 0:
        return f2;

      case 1:
        return _isPlaceholder(a) ? f2 : _curry1(function (_b) {
          return fn(a, _b);
        });

      default:
        return _isPlaceholder(a) && _isPlaceholder(b) ? f2 : _isPlaceholder(a) ? _curry1(function (_a) {
          return fn(_a, b);
        }) : _isPlaceholder(b) ? _curry1(function (_b) {
          return fn(a, _b);
        }) : fn(a, b);
    }
  };
}

module.exports = _curry2;var _curry1 =
/*#__PURE__*/
require("./_curry1.js");

var _curry2 =
/*#__PURE__*/
require("./_curry2.js");

var _isPlaceholder =
/*#__PURE__*/
require("./_isPlaceholder.js");
/**
 * Optimized internal three-arity curry function.
 *
 * @private
 * @category Function
 * @param {Function} fn The function to curry.
 * @return {Function} The curried function.
 */


function _curry3(fn) {
  return function f3(a, b, c) {
    switch (arguments.length) {
      case 0:
        return f3;

      case 1:
        return _isPlaceholder(a) ? f3 : _curry2(function (_b, _c) {
          return fn(a, _b, _c);
        });

      case 2:
        return _isPlaceholder(a) && _isPlaceholder(b) ? f3 : _isPlaceholder(a) ? _curry2(function (_a, _c) {
          return fn(_a, b, _c);
        }) : _isPlaceholder(b) ? _curry2(function (_b, _c) {
          return fn(a, _b, _c);
        }) : _curry1(function (_c) {
          return fn(a, b, _c);
        });

      default:
        return _isPlaceholder(a) && _isPlaceholder(b) && _isPlaceholder(c) ? f3 : _isPlaceholder(a) && _isPlaceholder(b) ? _curry2(function (_a, _b) {
          return fn(_a, _b, c);
        }) : _isPlaceholder(a) && _isPlaceholder(c) ? _curry2(function (_a, _c) {
          return fn(_a, b, _c);
        }) : _isPlaceholder(b) && _isPlaceholder(c) ? _curry2(function (_b, _c) {
          return fn(a, _b, _c);
        }) : _isPlaceholder(a) ? _curry1(function (_a) {
          return fn(_a, b, c);
        }) : _isPlaceholder(b) ? _curry1(function (_b) {
          return fn(a, _b, c);
        }) : _isPlaceholder(c) ? _curry1(function (_c) {
          return fn(a, b, _c);
        }) : fn(a, b, c);
    }
  };
}

module.exports = _curry3;var _arity =
/*#__PURE__*/
require("./_arity.js");

var _isPlaceholder =
/*#__PURE__*/
require("./_isPlaceholder.js");
/**
 * Internal curryN function.
 *
 * @private
 * @category Function
 * @param {Number} length The arity of the curried function.
 * @param {Array} received An array of arguments received thus far.
 * @param {Function} fn The function to curry.
 * @return {Function} The curried function.
 */


function _curryN(length, received, fn) {
  return function () {
    var combined = [];
    var argsIdx = 0;
    var left = length;
    var combinedIdx = 0;

    while (combinedIdx < received.length || argsIdx < arguments.length) {
      var result;

      if (combinedIdx < received.length && (!_isPlaceholder(received[combinedIdx]) || argsIdx >= arguments.length)) {
        result = received[combinedIdx];
      } else {
        result = arguments[argsIdx];
        argsIdx += 1;
      }

      combined[combinedIdx] = result;

      if (!_isPlaceholder(result)) {
        left -= 1;
      }

      combinedIdx += 1;
    }

    return left <= 0 ? fn.apply(this, combined) : _arity(left, _curryN(length, combined, fn));
  };
}

module.exports = _curryN;var _isArray =
/*#__PURE__*/
require("./_isArray.js");

var _isTransformer =
/*#__PURE__*/
require("./_isTransformer.js");
/**
 * Returns a function that dispatches with different strategies based on the
 * object in list position (last argument). If it is an array, executes [fn].
 * Otherwise, if it has a function with one of the given method names, it will
 * execute that function (functor case). Otherwise, if it is a transformer,
 * uses transducer created by [transducerCreator] to return a new transformer
 * (transducer case).
 * Otherwise, it will default to executing [fn].
 *
 * @private
 * @param {Array} methodNames properties to check for a custom implementation
 * @param {Function} transducerCreator transducer factory if object is transformer
 * @param {Function} fn default ramda implementation
 * @return {Function} A function that dispatches on object in list position
 */


function _dispatchable(methodNames, transducerCreator, fn) {
  return function () {
    if (arguments.length === 0) {
      return fn();
    }

    var obj = arguments[arguments.length - 1];

    if (!_isArray(obj)) {
      var idx = 0;

      while (idx < methodNames.length) {
        if (typeof obj[methodNames[idx]] === 'function') {
          return obj[methodNames[idx]].apply(obj, Array.prototype.slice.call(arguments, 0, -1));
        }

        idx += 1;
      }

      if (_isTransformer(obj)) {
        var transducer = transducerCreator.apply(null, Array.prototype.slice.call(arguments, 0, -1));
        return transducer(obj);
      }
    }

    return fn.apply(this, arguments);
  };
}

module.exports = _dispatchable;var _isInteger =
/*#__PURE__*/
require("./_isInteger.js");

var _isArray =
/*#__PURE__*/
require("./_isArray.js");

var remove =
/*#__PURE__*/
require("../remove.js");
/**
 * Returns a new object that does not contain a `prop` property.
 *
 * @private
 * @param {String|Number} prop The name of the property to dissociate
 * @param {Object|Array} obj The object to clone
 * @return {Object} A new object equivalent to the original but without the specified property
 */


function _dissoc(prop, obj) {
  if (obj == null) {
    return obj;
  }

  if (_isInteger(prop) && _isArray(obj)) {
    return remove(prop, 1, obj);
  }

  var result = {};

  for (var p in obj) {
    result[p] = obj[p];
  }

  delete result[prop];
  return result;
}

module.exports = _dissoc;var take =
/*#__PURE__*/
require("../take.js");

function dropLast(n, xs) {
  return take(n < xs.length ? xs.length - n : 0, xs);
}

module.exports = dropLast;var slice =
/*#__PURE__*/
require("../slice.js");

function dropLastWhile(pred, xs) {
  var idx = xs.length - 1;

  while (idx >= 0 && pred(xs[idx])) {
    idx -= 1;
  }

  return slice(0, idx + 1, xs);
}

module.exports = dropLastWhile;var _arrayFromIterator =
/*#__PURE__*/
require("./_arrayFromIterator.js");

var _includesWith =
/*#__PURE__*/
require("./_includesWith.js");

var _functionName =
/*#__PURE__*/
require("./_functionName.js");

var _has =
/*#__PURE__*/
require("./_has.js");

var _objectIs =
/*#__PURE__*/
require("./_objectIs.js");

var keys =
/*#__PURE__*/
require("../keys.js");

var type =
/*#__PURE__*/
require("../type.js");
/**
 * private _uniqContentEquals function.
 * That function is checking equality of 2 iterator contents with 2 assumptions
 * - iterators lengths are the same
 * - iterators values are unique
 *
 * false-positive result will be returned for comparison of, e.g.
 * - [1,2,3] and [1,2,3,4]
 * - [1,1,1] and [1,2,3]
 * */


function _uniqContentEquals(aIterator, bIterator, stackA, stackB) {
  var a = _arrayFromIterator(aIterator);

  var b = _arrayFromIterator(bIterator);

  function eq(_a, _b) {
    return _equals(_a, _b, stackA.slice(), stackB.slice());
  } // if *a* array contains any element that is not included in *b*


  return !_includesWith(function (b, aItem) {
    return !_includesWith(eq, aItem, b);
  }, b, a);
}

function _equals(a, b, stackA, stackB) {
  if (_objectIs(a, b)) {
    return true;
  }

  var typeA = type(a);

  if (typeA !== type(b)) {
    return false;
  }

  if (typeof a['fantasy-land/equals'] === 'function' || typeof b['fantasy-land/equals'] === 'function') {
    return typeof a['fantasy-land/equals'] === 'function' && a['fantasy-land/equals'](b) && typeof b['fantasy-land/equals'] === 'function' && b['fantasy-land/equals'](a);
  }

  if (typeof a.equals === 'function' || typeof b.equals === 'function') {
    return typeof a.equals === 'function' && a.equals(b) && typeof b.equals === 'function' && b.equals(a);
  }

  switch (typeA) {
    case 'Arguments':
    case 'Array':
    case 'Object':
      if (typeof a.constructor === 'function' && _functionName(a.constructor) === 'Promise') {
        return a === b;
      }

      break;

    case 'Boolean':
    case 'Number':
    case 'String':
      if (!(typeof a === typeof b && _objectIs(a.valueOf(), b.valueOf()))) {
        return false;
      }

      break;

    case 'Date':
      if (!_objectIs(a.valueOf(), b.valueOf())) {
        return false;
      }

      break;

    case 'Error':
      return a.name === b.name && a.message === b.message;

    case 'RegExp':
      if (!(a.source === b.source && a.global === b.global && a.ignoreCase === b.ignoreCase && a.multiline === b.multiline && a.sticky === b.sticky && a.unicode === b.unicode)) {
        return false;
      }

      break;
  }

  var idx = stackA.length - 1;

  while (idx >= 0) {
    if (stackA[idx] === a) {
      return stackB[idx] === b;
    }

    idx -= 1;
  }

  switch (typeA) {
    case 'Map':
      if (a.size !== b.size) {
        return false;
      }

      return _uniqContentEquals(a.entries(), b.entries(), stackA.concat([a]), stackB.concat([b]));

    case 'Set':
      if (a.size !== b.size) {
        return false;
      }

      return _uniqContentEquals(a.values(), b.values(), stackA.concat([a]), stackB.concat([b]));

    case 'Arguments':
    case 'Array':
    case 'Object':
    case 'Boolean':
    case 'Number':
    case 'String':
    case 'Date':
    case 'Error':
    case 'RegExp':
    case 'Int8Array':
    case 'Uint8Array':
    case 'Uint8ClampedArray':
    case 'Int16Array':
    case 'Uint16Array':
    case 'Int32Array':
    case 'Uint32Array':
    case 'Float32Array':
    case 'Float64Array':
    case 'ArrayBuffer':
      break;

    default:
      // Values of other types are only equal if identical.
      return false;
  }

  var keysA = keys(a);

  if (keysA.length !== keys(b).length) {
    return false;
  }

  var extendedStackA = stackA.concat([a]);
  var extendedStackB = stackB.concat([b]);
  idx = keysA.length - 1;

  while (idx >= 0) {
    var key = keysA[idx];

    if (!(_has(key, b) && _equals(b[key], a[key], extendedStackA, extendedStackB))) {
      return false;
    }

    idx -= 1;
  }

  return true;
}

module.exports = _equals;function _filter(fn, list) {
  var idx = 0;
  var len = list.length;
  var result = [];

  while (idx < len) {
    if (fn(list[idx])) {
      result[result.length] = list[idx];
    }

    idx += 1;
  }

  return result;
}

module.exports = _filter;var _forceReduced =
/*#__PURE__*/
require("./_forceReduced.js");

var _isArrayLike =
/*#__PURE__*/
require("./_isArrayLike.js");

var _reduce =
/*#__PURE__*/
require("./_reduce.js");

var _xfBase =
/*#__PURE__*/
require("./_xfBase.js");

var preservingReduced = function (xf) {
  return {
    '@@transducer/init': _xfBase.init,
    '@@transducer/result': function (result) {
      return xf['@@transducer/result'](result);
    },
    '@@transducer/step': function (result, input) {
      var ret = xf['@@transducer/step'](result, input);
      return ret['@@transducer/reduced'] ? _forceReduced(ret) : ret;
    }
  };
};

var _flatCat = function _xcat(xf) {
  var rxf = preservingReduced(xf);
  return {
    '@@transducer/init': _xfBase.init,
    '@@transducer/result': function (result) {
      return rxf['@@transducer/result'](result);
    },
    '@@transducer/step': function (result, input) {
      return !_isArrayLike(input) ? _reduce(rxf, result, [input]) : _reduce(rxf, result, input);
    }
  };
};

module.exports = _flatCat;function _forceReduced(x) {
  return {
    '@@transducer/value': x,
    '@@transducer/reduced': true
  };
}

module.exports = _forceReduced;function _functionName(f) {
  // String(x => x) evaluates to "x => x", so the pattern may not match.
  var match = String(f).match(/^function (\w*)/);
  return match == null ? '' : match[1];
}

module.exports = _functionName;var _filter =
/*#__PURE__*/
require("./_filter.js");
/**
 * @private
 * @param {Function} fn The strategy for extracting function names from an object
 * @return {Function} A function that takes an object and returns an array of function names.
 */


function _functionsWith(fn) {
  return function (obj) {
    return _filter(function (key) {
      return typeof obj[key] === 'function';
    }, fn(obj));
  };
}

module.exports = _functionsWith;function _has(prop, obj) {
  return Object.prototype.hasOwnProperty.call(obj, prop);
}

module.exports = _has;function _identity(x) {
  return x;
}

module.exports = _identity;var _indexOf =
/*#__PURE__*/
require("./_indexOf.js");

function _includes(a, list) {
  return _indexOf(list, a, 0) >= 0;
}

module.exports = _includes;function _includesWith(pred, x, list) {
  var idx = 0;
  var len = list.length;

  while (idx < len) {
    if (pred(x, list[idx])) {
      return true;
    }

    idx += 1;
  }

  return false;
}

module.exports = _includesWith;var equals =
/*#__PURE__*/
require("../equals.js");

function _indexOf(list, a, idx) {
  var inf, item; // Array.prototype.indexOf doesn't exist below IE9

  if (typeof list.indexOf === 'function') {
    switch (typeof a) {
      case 'number':
        if (a === 0) {
          // manually crawl the list to distinguish between +0 and -0
          inf = 1 / a;

          while (idx < list.length) {
            item = list[idx];

            if (item === 0 && 1 / item === inf) {
              return idx;
            }

            idx += 1;
          }

          return -1;
        } else if (a !== a) {
          // NaN
          while (idx < list.length) {
            item = list[idx];

            if (typeof item === 'number' && item !== item) {
              return idx;
            }

            idx += 1;
          }

          return -1;
        } // non-zero numbers can utilise Set


        return list.indexOf(a, idx);
      // all these types can utilise Set

      case 'string':
      case 'boolean':
      case 'function':
      case 'undefined':
        return list.indexOf(a, idx);

      case 'object':
        if (a === null) {
          // null can utilise Set
          return list.indexOf(a, idx);
        }

    }
  } // anything else not covered above, defer to R.equals


  while (idx < list.length) {
    if (equals(list[idx], a)) {
      return idx;
    }

    idx += 1;
  }

  return -1;
}

module.exports = _indexOf;var _has =
/*#__PURE__*/
require("./_has.js");

var toString = Object.prototype.toString;

var _isArguments =
/*#__PURE__*/
function () {
  return toString.call(arguments) === '[object Arguments]' ? function _isArguments(x) {
    return toString.call(x) === '[object Arguments]';
  } : function _isArguments(x) {
    return _has('callee', x);
  };
}();

module.exports = _isArguments;/**
 * Tests whether or not an object is an array.
 *
 * @private
 * @param {*} val The object to test.
 * @return {Boolean} `true` if `val` is an array, `false` otherwise.
 * @example
 *
 *      _isArray([]); //=> true
 *      _isArray(null); //=> false
 *      _isArray({}); //=> false
 */
module.exports = Array.isArray || function _isArray(val) {
  return val != null && val.length >= 0 && Object.prototype.toString.call(val) === '[object Array]';
};var _curry1 =
/*#__PURE__*/
require("./_curry1.js");

var _isArray =
/*#__PURE__*/
require("./_isArray.js");

var _isString =
/*#__PURE__*/
require("./_isString.js");
/**
 * Tests whether or not an object is similar to an array.
 *
 * @private
 * @category Type
 * @category List
 * @sig * -> Boolean
 * @param {*} x The object to test.
 * @return {Boolean} `true` if `x` has a numeric length property and extreme indices defined; `false` otherwise.
 * @example
 *
 *      _isArrayLike([]); //=> true
 *      _isArrayLike(true); //=> false
 *      _isArrayLike({}); //=> false
 *      _isArrayLike({length: 10}); //=> false
 *      _isArrayLike({0: 'zero', 9: 'nine', length: 10}); //=> true
 *      _isArrayLike({nodeType: 1, length: 1}) // => false
 */


var _isArrayLike =
/*#__PURE__*/
_curry1(function isArrayLike(x) {
  if (_isArray(x)) {
    return true;
  }

  if (!x) {
    return false;
  }

  if (typeof x !== 'object') {
    return false;
  }

  if (_isString(x)) {
    return false;
  }

  if (x.length === 0) {
    return true;
  }

  if (x.length > 0) {
    return x.hasOwnProperty(0) && x.hasOwnProperty(x.length - 1);
  }

  return false;
});

module.exports = _isArrayLike;function _isFunction(x) {
  var type = Object.prototype.toString.call(x);
  return type === '[object Function]' || type === '[object AsyncFunction]' || type === '[object GeneratorFunction]' || type === '[object AsyncGeneratorFunction]';
}

module.exports = _isFunction;/**
 * Determine if the passed argument is an integer.
 *
 * @private
 * @param {*} n
 * @category Type
 * @return {Boolean}
 */
module.exports = Number.isInteger || function _isInteger(n) {
  return n << 0 === n;
};function _isNumber(x) {
  return Object.prototype.toString.call(x) === '[object Number]';
}

module.exports = _isNumber;function _isObject(x) {
  return Object.prototype.toString.call(x) === '[object Object]';
}

module.exports = _isObject;function _isPlaceholder(a) {
  return a != null && typeof a === 'object' && a['@@functional/placeholder'] === true;
}

module.exports = _isPlaceholder;function _isRegExp(x) {
  return Object.prototype.toString.call(x) === '[object RegExp]';
}

module.exports = _isRegExp;function _isString(x) {
  return Object.prototype.toString.call(x) === '[object String]';
}

module.exports = _isString;function _isTransformer(obj) {
  return obj != null && typeof obj['@@transducer/step'] === 'function';
}

module.exports = _isTransformer;/**
 * Tests whether or not an object is a typed array.
 *
 * @private
 * @param {*} val The object to test.
 * @return {Boolean} `true` if `val` is a typed array, `false` otherwise.
 * @example
 *
 *      _isTypedArray(new Uint8Array([])); //=> true
 *      _isTypedArray(new Float32Array([])); //=> true
 *      _isTypedArray([]); //=> false
 *      _isTypedArray(null); //=> false
 *      _isTypedArray({}); //=> false
 */
function _isTypedArray(val) {
  var type = Object.prototype.toString.call(val);
  return type === '[object Uint8ClampedArray]' || type === '[object Int8Array]' || type === '[object Uint8Array]' || type === '[object Int16Array]' || type === '[object Uint16Array]' || type === '[object Int32Array]' || type === '[object Uint32Array]' || type === '[object Float32Array]' || type === '[object Float64Array]' || type === '[object BigInt64Array]' || type === '[object BigUint64Array]';
}

module.exports = _isTypedArray;var _isArrayLike =
/*#__PURE__*/
require("./_isArrayLike.js");
/**
 * `_makeFlat` is a helper function that returns a one-level or fully recursive
 * function based on the flag passed in.
 *
 * @private
 */


function _makeFlat(recursive) {
  return function flatt(list) {
    var value, jlen, j;
    var result = [];
    var idx = 0;
    var ilen = list.length;

    while (idx < ilen) {
      if (_isArrayLike(list[idx])) {
        value = recursive ? flatt(list[idx]) : list[idx];
        j = 0;
        jlen = value.length;

        while (j < jlen) {
          result[result.length] = value[j];
          j += 1;
        }
      } else {
        result[result.length] = list[idx];
      }

      idx += 1;
    }

    return result;
  };
}

module.exports = _makeFlat;function _map(fn, functor) {
  var idx = 0;
  var len = functor.length;
  var result = Array(len);

  while (idx < len) {
    result[idx] = fn(functor[idx]);
    idx += 1;
  }

  return result;
}

module.exports = _map;var _isArray =
/*#__PURE__*/
require("./_isArray.js");

var _isInteger =
/*#__PURE__*/
require("./_isInteger.js");
/**
 * Makes a shallow clone of an object, applying the given fn to the specified
 * property with the given value. Note that this copies and flattens prototype
 * properties onto the new object as well. All non-primitive properties are
 * copied by reference.
 *
 * @private
 * @param {String|Number} prop The property name to set
 * @param {Function} fn The function to apply to the property
 * @param {Object|Array} obj The object to clone
 * @return {Object|Array} A new object equivalent to the original except for the changed property.
 */


function _modify(prop, fn, obj) {
  if (_isInteger(prop) && _isArray(obj)) {
    var arr = [].concat(obj);
    arr[prop] = fn(arr[prop]);
    return arr;
  }

  var result = {};

  for (var p in obj) {
    result[p] = obj[p];
  }

  result[prop] = fn(result[prop]);
  return result;
}

module.exports = _modify;var _has =
/*#__PURE__*/
require("./_has.js"); // Based on https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign


function _objectAssign(target) {
  if (target == null) {
    throw new TypeError('Cannot convert undefined or null to object');
  }

  var output = Object(target);
  var idx = 1;
  var length = arguments.length;

  while (idx < length) {
    var source = arguments[idx];

    if (source != null) {
      for (var nextKey in source) {
        if (_has(nextKey, source)) {
          output[nextKey] = source[nextKey];
        }
      }
    }

    idx += 1;
  }

  return output;
}

module.exports = typeof Object.assign === 'function' ? Object.assign : _objectAssign;// Based on https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
function _objectIs(a, b) {
  // SameValue algorithm
  if (a === b) {
    // Steps 1-5, 7-10
    // Steps 6.b-6.e: +0 != -0
    return a !== 0 || 1 / a === 1 / b;
  } else {
    // Step 6.a: NaN == NaN
    return a !== a && b !== b;
  }
}

module.exports = typeof Object.is === 'function' ? Object.is : _objectIs;function _of(x) {
  return [x];
}

module.exports = _of;function _pipe(f, g) {
  return function () {
    return g.call(this, f.apply(this, arguments));
  };
}

module.exports = _pipe;function _pipeP(f, g) {
  return function () {
    var ctx = this;
    return f.apply(ctx, arguments).then(function (x) {
      return g.call(ctx, x);
    });
  };
}

module.exports = _pipeP;function _promap(f, g, profunctor) {
  return function (x) {
    return g(profunctor(f(x)));
  };
}

module.exports = _promap;function _quote(s) {
  var escaped = s.replace(/\\/g, '\\\\').replace(/[\b]/g, '\\b') // \b matches word boundary; [\b] matches backspace
  .replace(/\f/g, '\\f').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\t/g, '\\t').replace(/\v/g, '\\v').replace(/\0/g, '\\0');
  return '"' + escaped.replace(/"/g, '\\"') + '"';
}

module.exports = _quote;var _isArrayLike =
/*#__PURE__*/
require("./_isArrayLike.js");

var _xwrap =
/*#__PURE__*/
require("./_xwrap.js");

var bind =
/*#__PURE__*/
require("../bind.js");

function _arrayReduce(xf, acc, list) {
  var idx = 0;
  var len = list.length;

  while (idx < len) {
    acc = xf['@@transducer/step'](acc, list[idx]);

    if (acc && acc['@@transducer/reduced']) {
      acc = acc['@@transducer/value'];
      break;
    }

    idx += 1;
  }

  return xf['@@transducer/result'](acc);
}

function _iterableReduce(xf, acc, iter) {
  var step = iter.next();

  while (!step.done) {
    acc = xf['@@transducer/step'](acc, step.value);

    if (acc && acc['@@transducer/reduced']) {
      acc = acc['@@transducer/value'];
      break;
    }

    step = iter.next();
  }

  return xf['@@transducer/result'](acc);
}

function _methodReduce(xf, acc, obj, methodName) {
  return xf['@@transducer/result'](obj[methodName](bind(xf['@@transducer/step'], xf), acc));
}

var symIterator = typeof Symbol !== 'undefined' ? Symbol.iterator : '@@iterator';

function _reduce(fn, acc, list) {
  if (typeof fn === 'function') {
    fn = _xwrap(fn);
  }

  if (_isArrayLike(list)) {
    return _arrayReduce(fn, acc, list);
  }

  if (typeof list['fantasy-land/reduce'] === 'function') {
    return _methodReduce(fn, acc, list, 'fantasy-land/reduce');
  }

  if (list[symIterator] != null) {
    return _iterableReduce(fn, acc, list[symIterator]());
  }

  if (typeof list.next === 'function') {
    return _iterableReduce(fn, acc, list);
  }

  if (typeof list.reduce === 'function') {
    return _methodReduce(fn, acc, list, 'reduce');
  }

  throw new TypeError('reduce: list must be array or iterable');
}

module.exports = _reduce;function _reduced(x) {
  return x && x['@@transducer/reduced'] ? x : {
    '@@transducer/value': x,
    '@@transducer/reduced': true
  };
}

module.exports = _reduced;var _objectAssign =
/*#__PURE__*/
require("./_objectAssign.js");

var _identity =
/*#__PURE__*/
require("./_identity.js");

var _isArrayLike =
/*#__PURE__*/
require("./_isArrayLike.js");

var _isTransformer =
/*#__PURE__*/
require("./_isTransformer.js");

var objOf =
/*#__PURE__*/
require("../objOf.js");

var _stepCatArray = {
  '@@transducer/init': Array,
  '@@transducer/step': function (xs, x) {
    xs.push(x);
    return xs;
  },
  '@@transducer/result': _identity
};
var _stepCatString = {
  '@@transducer/init': String,
  '@@transducer/step': function (a, b) {
    return a + b;
  },
  '@@transducer/result': _identity
};
var _stepCatObject = {
  '@@transducer/init': Object,
  '@@transducer/step': function (result, input) {
    return _objectAssign(result, _isArrayLike(input) ? objOf(input[0], input[1]) : input);
  },
  '@@transducer/result': _identity
};

function _stepCat(obj) {
  if (_isTransformer(obj)) {
    return obj;
  }

  if (_isArrayLike(obj)) {
    return _stepCatArray;
  }

  if (typeof obj === 'string') {
    return _stepCatString;
  }

  if (typeof obj === 'object') {
    return _stepCatObject;
  }

  throw new Error('Cannot create transformer for ' + obj);
}

module.exports = _stepCat;/**
 * Polyfill from <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString>.
 */
var pad = function pad(n) {
  return (n < 10 ? '0' : '') + n;
};

var _toISOString = typeof Date.prototype.toISOString === 'function' ? function _toISOString(d) {
  return d.toISOString();
} : function _toISOString(d) {
  return d.getUTCFullYear() + '-' + pad(d.getUTCMonth() + 1) + '-' + pad(d.getUTCDate()) + 'T' + pad(d.getUTCHours()) + ':' + pad(d.getUTCMinutes()) + ':' + pad(d.getUTCSeconds()) + '.' + (d.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) + 'Z';
};

module.exports = _toISOString;var _includes =
/*#__PURE__*/
require("./_includes.js");

var _map =
/*#__PURE__*/
require("./_map.js");

var _quote =
/*#__PURE__*/
require("./_quote.js");

var _toISOString =
/*#__PURE__*/
require("./_toISOString.js");

var keys =
/*#__PURE__*/
require("../keys.js");

var reject =
/*#__PURE__*/
require("../reject.js");

function _toString(x, seen) {
  var recur = function recur(y) {
    var xs = seen.concat([x]);
    return _includes(y, xs) ? '<Circular>' : _toString(y, xs);
  }; //  mapPairs :: (Object, [String]) -> [String]


  var mapPairs = function (obj, keys) {
    return _map(function (k) {
      return _quote(k) + ': ' + recur(obj[k]);
    }, keys.slice().sort());
  };

  switch (Object.prototype.toString.call(x)) {
    case '[object Arguments]':
      return '(function() { return arguments; }(' + _map(recur, x).join(', ') + '))';

    case '[object Array]':
      return '[' + _map(recur, x).concat(mapPairs(x, reject(function (k) {
        return /^\d+$/.test(k);
      }, keys(x)))).join(', ') + ']';

    case '[object Boolean]':
      return typeof x === 'object' ? 'new Boolean(' + recur(x.valueOf()) + ')' : x.toString();

    case '[object Date]':
      return 'new Date(' + (isNaN(x.valueOf()) ? recur(NaN) : _quote(_toISOString(x))) + ')';

    case '[object Null]':
      return 'null';

    case '[object Number]':
      return typeof x === 'object' ? 'new Number(' + recur(x.valueOf()) + ')' : 1 / x === -Infinity ? '-0' : x.toString(10);

    case '[object String]':
      return typeof x === 'object' ? 'new String(' + recur(x.valueOf()) + ')' : _quote(x);

    case '[object Undefined]':
      return 'undefined';

    default:
      if (typeof x.toString === 'function') {
        var repr = x.toString();

        if (repr !== '[object Object]') {
          return repr;
        }
      }

      return '{' + mapPairs(x, keys(x)).join(', ') + '}';
  }
}

module.exports = _toString;var _curry2 =
/*#__PURE__*/
require("./_curry2.js");

var _reduced =
/*#__PURE__*/
require("./_reduced.js");

var _xfBase =
/*#__PURE__*/
require("./_xfBase.js");

var XAll =
/*#__PURE__*/
function () {
  function XAll(f, xf) {
    this.xf = xf;
    this.f = f;
    this.all = true;
  }

  XAll.prototype['@@transducer/init'] = _xfBase.init;

  XAll.prototype['@@transducer/result'] = function (result) {
    if (this.all) {
      result = this.xf['@@transducer/step'](result, true);
    }

    return this.xf['@@transducer/result'](result);
  };

  XAll.prototype['@@transducer/step'] = function (result, input) {
    if (!this.f(input)) {
      this.all = false;
      result = _reduced(this.xf['@@transducer/step'](result, false));
    }

    return result;
  };

  return XAll;
}();

var _xall =
/*#__PURE__*/
_curry2(function _xall(f, xf) {
  return new XAll(f, xf);
});

module.exports = _xall;var _curry2 =
/*#__PURE__*/
require("./_curry2.js");

var _reduced =
/*#__PURE__*/
require("./_reduced.js");

var _xfBase =
/*#__PURE__*/
require("./_xfBase.js");

var XAny =
/*#__PURE__*/
function () {
  function XAny(f, xf) {
    this.xf = xf;
    this.f = f;
    this.any = false;
  }

  XAny.prototype['@@transducer/init'] = _xfBase.init;

  XAny.prototype['@@transducer/result'] = function (result) {
    if (!this.any) {
      result = this.xf['@@transducer/step'](result, false);
    }

    return this.xf['@@transducer/result'](result);
  };

  XAny.prototype['@@transducer/step'] = function (result, input) {
    if (this.f(input)) {
      this.any = true;
      result = _reduced(this.xf['@@transducer/step'](result, true));
    }

    return result;
  };

  return XAny;
}();

var _xany =
/*#__PURE__*/
_curry2(function _xany(f, xf) {
  return new XAny(f, xf);
});

module.exports = _xany;var _concat =
/*#__PURE__*/
require("./_concat.js");

var _curry2 =
/*#__PURE__*/
require("./_curry2.js");

var _xfBase =
/*#__PURE__*/
require("./_xfBase.js");

var XAperture =
/*#__PURE__*/
function () {
  function XAperture(n, xf) {
    this.xf = xf;
    this.pos = 0;
    this.full = false;
    this.acc = new Array(n);
  }

  XAperture.prototype['@@transducer/init'] = _xfBase.init;

  XAperture.prototype['@@transducer/result'] = function (result) {
    this.acc = null;
    return this.xf['@@transducer/result'](result);
  };

  XAperture.prototype['@@transducer/step'] = function (result, input) {
    this.store(input);
    return this.full ? this.xf['@@transducer/step'](result, this.getCopy()) : result;
  };

  XAperture.prototype.store = function (input) {
    this.acc[this.pos] = input;
    this.pos += 1;

    if (this.pos === this.acc.length) {
      this.pos = 0;
      this.full = true;
    }
  };

  XAperture.prototype.getCopy = function () {
    return _concat(Array.prototype.slice.call(this.acc, this.pos), Array.prototype.slice.call(this.acc, 0, this.pos));
  };

  return XAperture;
}();

var _xaperture =
/*#__PURE__*/
_curry2(function _xaperture(n, xf) {
  return new XAperture(n, xf);
});

module.exports = _xaperture;var _curry2 =
/*#__PURE__*/
require("./_curry2.js");

var _flatCat =
/*#__PURE__*/
require("./_flatCat.js");

var map =
/*#__PURE__*/
require("../map.js");

var _xchain =
/*#__PURE__*/
_curry2(function _xchain(f, xf) {
  return map(f, _flatCat(xf));
});

module.exports = _xchain;var _curry2 =
/*#__PURE__*/
require("./_curry2.js");

var _xfBase =
/*#__PURE__*/
require("./_xfBase.js");

var XDrop =
/*#__PURE__*/
function () {
  function XDrop(n, xf) {
    this.xf = xf;
    this.n = n;
  }

  XDrop.prototype['@@transducer/init'] = _xfBase.init;
  XDrop.prototype['@@transducer/result'] = _xfBase.result;

  XDrop.prototype['@@transducer/step'] = function (result, input) {
    if (this.n > 0) {
      this.n -= 1;
      return result;
    }

    return this.xf['@@transducer/step'](result, input);
  };

  return XDrop;
}();

var _xdrop =
/*#__PURE__*/
_curry2(function _xdrop(n, xf) {
  return new XDrop(n, xf);
});

module.exports = _xdrop;var _curry2 =
/*#__PURE__*/
require("./_curry2.js");

var _xfBase =
/*#__PURE__*/
require("./_xfBase.js");

var XDropLast =
/*#__PURE__*/
function () {
  function XDropLast(n, xf) {
    this.xf = xf;
    this.pos = 0;
    this.full = false;
    this.acc = new Array(n);
  }

  XDropLast.prototype['@@transducer/init'] = _xfBase.init;

  XDropLast.prototype['@@transducer/result'] = function (result) {
    this.acc = null;
    return this.xf['@@transducer/result'](result);
  };

  XDropLast.prototype['@@transducer/step'] = function (result, input) {
    if (this.full) {
      result = this.xf['@@transducer/step'](result, this.acc[this.pos]);
    }

    this.store(input);
    return result;
  };

  XDropLast.prototype.store = function (input) {
    this.acc[this.pos] = input;
    this.pos += 1;

    if (this.pos === this.acc.length) {
      this.pos = 0;
      this.full = true;
    }
  };

  return XDropLast;
}();

var _xdropLast =
/*#__PURE__*/
_curry2(function _xdropLast(n, xf) {
  return new XDropLast(n, xf);
});

module.exports = _xdropLast;var _curry2 =
/*#__PURE__*/
require("./_curry2.js");

var _reduce =
/*#__PURE__*/
require("./_reduce.js");

var _xfBase =
/*#__PURE__*/
require("./_xfBase.js");

var XDropLastWhile =
/*#__PURE__*/
function () {
  function XDropLastWhile(fn, xf) {
    this.f = fn;
    this.retained = [];
    this.xf = xf;
  }

  XDropLastWhile.prototype['@@transducer/init'] = _xfBase.init;

  XDropLastWhile.prototype['@@transducer/result'] = function (result) {
    this.retained = null;
    return this.xf['@@transducer/result'](result);
  };

  XDropLastWhile.prototype['@@transducer/step'] = function (result, input) {
    return this.f(input) ? this.retain(result, input) : this.flush(result, input);
  };

  XDropLastWhile.prototype.flush = function (result, input) {
    result = _reduce(this.xf['@@transducer/step'], result, this.retained);
    this.retained = [];
    return this.xf['@@transducer/step'](result, input);
  };

  XDropLastWhile.prototype.retain = function (result, input) {
    this.retained.push(input);
    return result;
  };

  return XDropLastWhile;
}();

var _xdropLastWhile =
/*#__PURE__*/
_curry2(function _xdropLastWhile(fn, xf) {
  return new XDropLastWhile(fn, xf);
});

module.exports = _xdropLastWhile;var _curry2 =
/*#__PURE__*/
require("./_curry2.js");

var _xfBase =
/*#__PURE__*/
require("./_xfBase.js");

var XDropRepeatsWith =
/*#__PURE__*/
function () {
  function XDropRepeatsWith(pred, xf) {
    this.xf = xf;
    this.pred = pred;
    this.lastValue = undefined;
    this.seenFirstValue = false;
  }

  XDropRepeatsWith.prototype['@@transducer/init'] = _xfBase.init;
  XDropRepeatsWith.prototype['@@transducer/result'] = _xfBase.result;

  XDropRepeatsWith.prototype['@@transducer/step'] = function (result, input) {
    var sameAsLast = false;

    if (!this.seenFirstValue) {
      this.seenFirstValue = true;
    } else if (this.pred(this.lastValue, input)) {
      sameAsLast = true;
    }

    this.lastValue = input;
    return sameAsLast ? result : this.xf['@@transducer/step'](result, input);
  };

  return XDropRepeatsWith;
}();

var _xdropRepeatsWith =
/*#__PURE__*/
_curry2(function _xdropRepeatsWith(pred, xf) {
  return new XDropRepeatsWith(pred, xf);
});

module.exports = _xdropRepeatsWith;var _curry2 =
/*#__PURE__*/
require("./_curry2.js");

var _xfBase =
/*#__PURE__*/
require("./_xfBase.js");

var XDropWhile =
/*#__PURE__*/
function () {
  function XDropWhile(f, xf) {
    this.xf = xf;
    this.f = f;
  }

  XDropWhile.prototype['@@transducer/init'] = _xfBase.init;
  XDropWhile.prototype['@@transducer/result'] = _xfBase.result;

  XDropWhile.prototype['@@transducer/step'] = function (result, input) {
    if (this.f) {
      if (this.f(input)) {
        return result;
      }

      this.f = null;
    }

    return this.xf['@@transducer/step'](result, input);
  };

  return XDropWhile;
}();

var _xdropWhile =
/*#__PURE__*/
_curry2(function _xdropWhile(f, xf) {
  return new XDropWhile(f, xf);
});

module.exports = _xdropWhile;module.exports = {
  init: function () {
    return this.xf['@@transducer/init']();
  },
  result: function (result) {
    return this.xf['@@transducer/result'](result);
  }
};var _curry2 =
/*#__PURE__*/
require("./_curry2.js");

var _xfBase =
/*#__PURE__*/
require("./_xfBase.js");

var XFilter =
/*#__PURE__*/
function () {
  function XFilter(f, xf) {
    this.xf = xf;
    this.f = f;
  }

  XFilter.prototype['@@transducer/init'] = _xfBase.init;
  XFilter.prototype['@@transducer/result'] = _xfBase.result;

  XFilter.prototype['@@transducer/step'] = function (result, input) {
    return this.f(input) ? this.xf['@@transducer/step'](result, input) : result;
  };

  return XFilter;
}();

var _xfilter =
/*#__PURE__*/
_curry2(function _xfilter(f, xf) {
  return new XFilter(f, xf);
});

module.exports = _xfilter;var _curry2 =
/*#__PURE__*/
require("./_curry2.js");

var _reduced =
/*#__PURE__*/
require("./_reduced.js");

var _xfBase =
/*#__PURE__*/
require("./_xfBase.js");

var XFind =
/*#__PURE__*/
function () {
  function XFind(f, xf) {
    this.xf = xf;
    this.f = f;
    this.found = false;
  }

  XFind.prototype['@@transducer/init'] = _xfBase.init;

  XFind.prototype['@@transducer/result'] = function (result) {
    if (!this.found) {
      result = this.xf['@@transducer/step'](result, void 0);
    }

    return this.xf['@@transducer/result'](result);
  };

  XFind.prototype['@@transducer/step'] = function (result, input) {
    if (this.f(input)) {
      this.found = true;
      result = _reduced(this.xf['@@transducer/step'](result, input));
    }

    return result;
  };

  return XFind;
}();

var _xfind =
/*#__PURE__*/
_curry2(function _xfind(f, xf) {
  return new XFind(f, xf);
});

module.exports = _xfind;var _curry2 =
/*#__PURE__*/
require("./_curry2.js");

var _reduced =
/*#__PURE__*/
require("./_reduced.js");

var _xfBase =
/*#__PURE__*/
require("./_xfBase.js");

var XFindIndex =
/*#__PURE__*/
function () {
  function XFindIndex(f, xf) {
    this.xf = xf;
    this.f = f;
    this.idx = -1;
    this.found = false;
  }

  XFindIndex.prototype['@@transducer/init'] = _xfBase.init;

  XFindIndex.prototype['@@transducer/result'] = function (result) {
    if (!this.found) {
      result = this.xf['@@transducer/step'](result, -1);
    }

    return this.xf['@@transducer/result'](result);
  };

  XFindIndex.prototype['@@transducer/step'] = function (result, input) {
    this.idx += 1;

    if (this.f(input)) {
      this.found = true;
      result = _reduced(this.xf['@@transducer/step'](result, this.idx));
    }

    return result;
  };

  return XFindIndex;
}();

var _xfindIndex =
/*#__PURE__*/
_curry2(function _xfindIndex(f, xf) {
  return new XFindIndex(f, xf);
});

module.exports = _xfindIndex;var _curry2 =
/*#__PURE__*/
require("./_curry2.js");

var _xfBase =
/*#__PURE__*/
require("./_xfBase.js");

var XFindLast =
/*#__PURE__*/
function () {
  function XFindLast(f, xf) {
    this.xf = xf;
    this.f = f;
  }

  XFindLast.prototype['@@transducer/init'] = _xfBase.init;

  XFindLast.prototype['@@transducer/result'] = function (result) {
    return this.xf['@@transducer/result'](this.xf['@@transducer/step'](result, this.last));
  };

  XFindLast.prototype['@@transducer/step'] = function (result, input) {
    if (this.f(input)) {
      this.last = input;
    }

    return result;
  };

  return XFindLast;
}();

var _xfindLast =
/*#__PURE__*/
_curry2(function _xfindLast(f, xf) {
  return new XFindLast(f, xf);
});

module.exports = _xfindLast;var _curry2 =
/*#__PURE__*/
require("./_curry2.js");

var _xfBase =
/*#__PURE__*/
require("./_xfBase.js");

var XFindLastIndex =
/*#__PURE__*/
function () {
  function XFindLastIndex(f, xf) {
    this.xf = xf;
    this.f = f;
    this.idx = -1;
    this.lastIdx = -1;
  }

  XFindLastIndex.prototype['@@transducer/init'] = _xfBase.init;

  XFindLastIndex.prototype['@@transducer/result'] = function (result) {
    return this.xf['@@transducer/result'](this.xf['@@transducer/step'](result, this.lastIdx));
  };

  XFindLastIndex.prototype['@@transducer/step'] = function (result, input) {
    this.idx += 1;

    if (this.f(input)) {
      this.lastIdx = this.idx;
    }

    return result;
  };

  return XFindLastIndex;
}();

var _xfindLastIndex =
/*#__PURE__*/
_curry2(function _xfindLastIndex(f, xf) {
  return new XFindLastIndex(f, xf);
});

module.exports = _xfindLastIndex;var _curry2 =
/*#__PURE__*/
require("./_curry2.js");

var _xfBase =
/*#__PURE__*/
require("./_xfBase.js");

var XMap =
/*#__PURE__*/
function () {
  function XMap(f, xf) {
    this.xf = xf;
    this.f = f;
  }

  XMap.prototype['@@transducer/init'] = _xfBase.init;
  XMap.prototype['@@transducer/result'] = _xfBase.result;

  XMap.prototype['@@transducer/step'] = function (result, input) {
    return this.xf['@@transducer/step'](result, this.f(input));
  };

  return XMap;
}();

var _xmap =
/*#__PURE__*/
_curry2(function _xmap(f, xf) {
  return new XMap(f, xf);
});

module.exports = _xmap;var _curry3 =
/*#__PURE__*/
require("./_curry3.js");

var _xfBase =
/*#__PURE__*/
require("./_xfBase.js");

var _promap =
/*#__PURE__*/
require("./_promap.js");

var XPromap =
/*#__PURE__*/
function () {
  function XPromap(f, g, xf) {
    this.xf = xf;
    this.f = f;
    this.g = g;
  }

  XPromap.prototype['@@transducer/init'] = _xfBase.init;
  XPromap.prototype['@@transducer/result'] = _xfBase.result;

  XPromap.prototype['@@transducer/step'] = function (result, input) {
    return this.xf['@@transducer/step'](result, _promap(this.f, this.g, input));
  };

  return XPromap;
}();

var _xpromap =
/*#__PURE__*/
_curry3(function _xpromap(f, g, xf) {
  return new XPromap(f, g, xf);
});

module.exports = _xpromap;var _curryN =
/*#__PURE__*/
require("./_curryN.js");

var _has =
/*#__PURE__*/
require("./_has.js");

var _xfBase =
/*#__PURE__*/
require("./_xfBase.js");

var XReduceBy =
/*#__PURE__*/
function () {
  function XReduceBy(valueFn, valueAcc, keyFn, xf) {
    this.valueFn = valueFn;
    this.valueAcc = valueAcc;
    this.keyFn = keyFn;
    this.xf = xf;
    this.inputs = {};
  }

  XReduceBy.prototype['@@transducer/init'] = _xfBase.init;

  XReduceBy.prototype['@@transducer/result'] = function (result) {
    var key;

    for (key in this.inputs) {
      if (_has(key, this.inputs)) {
        result = this.xf['@@transducer/step'](result, this.inputs[key]);

        if (result['@@transducer/reduced']) {
          result = result['@@transducer/value'];
          break;
        }
      }
    }

    this.inputs = null;
    return this.xf['@@transducer/result'](result);
  };

  XReduceBy.prototype['@@transducer/step'] = function (result, input) {
    var key = this.keyFn(input);
    this.inputs[key] = this.inputs[key] || [key, this.valueAcc];
    this.inputs[key][1] = this.valueFn(this.inputs[key][1], input);
    return result;
  };

  return XReduceBy;
}();

var _xreduceBy =
/*#__PURE__*/
_curryN(4, [], function _xreduceBy(valueFn, valueAcc, keyFn, xf) {
  return new XReduceBy(valueFn, valueAcc, keyFn, xf);
});

module.exports = _xreduceBy;var _curry2 =
/*#__PURE__*/
require("./_curry2.js");

var _reduced =
/*#__PURE__*/
require("./_reduced.js");

var _xfBase =
/*#__PURE__*/
require("./_xfBase.js");

var XTake =
/*#__PURE__*/
function () {
  function XTake(n, xf) {
    this.xf = xf;
    this.n = n;
    this.i = 0;
  }

  XTake.prototype['@@transducer/init'] = _xfBase.init;
  XTake.prototype['@@transducer/result'] = _xfBase.result;

  XTake.prototype['@@transducer/step'] = function (result, input) {
    this.i += 1;
    var ret = this.n === 0 ? result : this.xf['@@transducer/step'](result, input);
    return this.n >= 0 && this.i >= this.n ? _reduced(ret) : ret;
  };

  return XTake;
}();

var _xtake =
/*#__PURE__*/
_curry2(function _xtake(n, xf) {
  return new XTake(n, xf);
});

module.exports = _xtake;var _curry2 =
/*#__PURE__*/
require("./_curry2.js");

var _reduced =
/*#__PURE__*/
require("./_reduced.js");

var _xfBase =
/*#__PURE__*/
require("./_xfBase.js");

var XTakeWhile =
/*#__PURE__*/
function () {
  function XTakeWhile(f, xf) {
    this.xf = xf;
    this.f = f;
  }

  XTakeWhile.prototype['@@transducer/init'] = _xfBase.init;
  XTakeWhile.prototype['@@transducer/result'] = _xfBase.result;

  XTakeWhile.prototype['@@transducer/step'] = function (result, input) {
    return this.f(input) ? this.xf['@@transducer/step'](result, input) : _reduced(result);
  };

  return XTakeWhile;
}();

var _xtakeWhile =
/*#__PURE__*/
_curry2(function _xtakeWhile(f, xf) {
  return new XTakeWhile(f, xf);
});

module.exports = _xtakeWhile;var _curry2 =
/*#__PURE__*/
require("./_curry2.js");

var _xfBase =
/*#__PURE__*/
require("./_xfBase.js");

var XTap =
/*#__PURE__*/
function () {
  function XTap(f, xf) {
    this.xf = xf;
    this.f = f;
  }

  XTap.prototype['@@transducer/init'] = _xfBase.init;
  XTap.prototype['@@transducer/result'] = _xfBase.result;

  XTap.prototype['@@transducer/step'] = function (result, input) {
    this.f(input);
    return this.xf['@@transducer/step'](result, input);
  };

  return XTap;
}();

var _xtap =
/*#__PURE__*/
_curry2(function _xtap(f, xf) {
  return new XTap(f, xf);
});

module.exports = _xtap;var _curry2 =
/*#__PURE__*/
require("./_curry2.js");

var _Set =
/*#__PURE__*/
require("./_Set.js");

var _xfBase =
/*#__PURE__*/
require("./_xfBase.js");

var XUniqBy =
/*#__PURE__*/
function () {
  function XUniqBy(f, xf) {
    this.xf = xf;
    this.f = f;
    this.set = new _Set();
  }

  XUniqBy.prototype['@@transducer/init'] = _xfBase.init;
  XUniqBy.prototype['@@transducer/result'] = _xfBase.result;

  XUniqBy.prototype['@@transducer/step'] = function (result, input) {
    return this.set.add(this.f(input)) ? this.xf['@@transducer/step'](result, input) : result;
  };

  return XUniqBy;
}();

var _xuniqBy =
/*#__PURE__*/
_curry2(function _xuniqBy(f, xf) {
  return new XUniqBy(f, xf);
});

module.exports = _xuniqBy;var _curry2 =
/*#__PURE__*/
require("./_curry2.js");

var _includesWith =
/*#__PURE__*/
require("./_includesWith.js");

var _xfBase =
/*#__PURE__*/
require("./_xfBase.js");

var XUniqWith =
/*#__PURE__*/
function () {
  function XUniqWith(pred, xf) {
    this.xf = xf;
    this.pred = pred;
    this.items = [];
  }

  XUniqWith.prototype['@@transducer/init'] = _xfBase.init;
  XUniqWith.prototype['@@transducer/result'] = _xfBase.result;

  XUniqWith.prototype['@@transducer/step'] = function (result, input) {
    if (_includesWith(this.pred, input, this.items)) {
      return result;
    } else {
      this.items.push(input);
      return this.xf['@@transducer/step'](result, input);
    }
  };

  return XUniqWith;
}();

var _xuniqWith =
/*#__PURE__*/
_curry2(function _xuniqWith(pred, xf) {
  return new XUniqWith(pred, xf);
});

module.exports = _xuniqWith;var XWrap =
/*#__PURE__*/
function () {
  function XWrap(fn) {
    this.f = fn;
  }

  XWrap.prototype['@@transducer/init'] = function () {
    throw new Error('init not implemented on XWrap');
  };

  XWrap.prototype['@@transducer/result'] = function (acc) {
    return acc;
  };

  XWrap.prototype['@@transducer/step'] = function (acc, x) {
    return this.f(acc, x);
  };

  return XWrap;
}();

function _xwrap(fn) {
  return new XWrap(fn);
}

module.exports = _xwrap;/**
 * A function that always returns `false`. Any passed in parameters are ignored.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Function
 * @sig * -> Boolean
 * @param {*}
 * @return {Boolean}
 * @see R.T
 * @example
 *
 *      R.F(); //=> false
 */
var F = function () {
  return false;
};

export default F;/**
 * A function that always returns `true`. Any passed in parameters are ignored.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Function
 * @sig * -> Boolean
 * @param {*}
 * @return {Boolean}
 * @see R.F
 * @example
 *
 *      R.T(); //=> true
 */
var T = function () {
  return true;
};

export default T;/**
 * A special placeholder value used to specify "gaps" within curried functions,
 * allowing partial application of any combination of arguments, regardless of
 * their positions.
 *
 * If `g` is a curried ternary function and `_` is `R.__`, the following are
 * equivalent:
 *
 *   - `g(1, 2, 3)`
 *   - `g(_, 2, 3)(1)`
 *   - `g(_, _, 3)(1)(2)`
 *   - `g(_, _, 3)(1, 2)`
 *   - `g(_, 2, _)(1, 3)`
 *   - `g(_, 2)(1)(3)`
 *   - `g(_, 2)(1, 3)`
 *   - `g(_, 2)(_, 3)(1)`
 *
 * @name __
 * @constant
 * @memberOf R
 * @since v0.6.0
 * @category Function
 * @example
 *
 *      const greet = R.replace('{name}', R.__, 'Hello, {name}!');
 *      greet('Alice'); //=> 'Hello, Alice!'
 */
export default {
  '@@functional/placeholder': true
};import _curry2 from "./internal/_curry2.js";
/**
 * Adds two values.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Math
 * @sig Number -> Number -> Number
 * @param {Number} a
 * @param {Number} b
 * @return {Number}
 * @see R.subtract
 * @example
 *
 *      R.add(2, 3);       //=>  5
 *      R.add(7)(10);      //=> 17
 */

var add =
/*#__PURE__*/
_curry2(function add(a, b) {
  return Number(a) + Number(b);
});

export default add;import _concat from "./internal/_concat.js";
import _curry1 from "./internal/_curry1.js";
import curryN from "./curryN.js";
/**
 * Creates a new list iteration function from an existing one by adding two new
 * parameters to its callback function: the current index, and the entire list.
 *
 * This would turn, for instance, [`R.map`](#map) function into one that
 * more closely resembles `Array.prototype.map`. Note that this will only work
 * for functions in which the iteration callback function is the first
 * parameter, and where the list is the last parameter. (This latter might be
 * unimportant if the list parameter is not used.)
 *
 * @func
 * @memberOf R
 * @since v0.15.0
 * @category Function
 * @category List
 * @sig (((a ...) -> b) ... -> [a] -> *) -> (((a ..., Int, [a]) -> b) ... -> [a] -> *)
 * @param {Function} fn A list iteration function that does not pass index or list to its callback
 * @return {Function} An altered list iteration function that passes (item, index, list) to its callback
 * @example
 *
 *      const mapIndexed = R.addIndex(R.map);
 *      mapIndexed((val, idx) => idx + '-' + val, ['f', 'o', 'o', 'b', 'a', 'r']);
 *      //=> ['0-f', '1-o', '2-o', '3-b', '4-a', '5-r']
 */

var addIndex =
/*#__PURE__*/
_curry1(function addIndex(fn) {
  return curryN(fn.length, function () {
    var idx = 0;
    var origFn = arguments[0];
    var list = arguments[arguments.length - 1];
    var args = Array.prototype.slice.call(arguments, 0);

    args[0] = function () {
      var result = origFn.apply(this, _concat(arguments, [idx, list]));
      idx += 1;
      return result;
    };

    return fn.apply(this, args);
  });
});

export default addIndex;import _concat from "./internal/_concat.js";
import _curry3 from "./internal/_curry3.js";
/**
 * Applies a function to the value at the given index of an array, returning a
 * new copy of the array with the element at the given index replaced with the
 * result of the function application.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category List
 * @sig Number -> (a -> a) -> [a] -> [a]
 * @param {Number} idx The index.
 * @param {Function} fn The function to apply.
 * @param {Array|Arguments} list An array-like object whose value
 *        at the supplied index will be replaced.
 * @return {Array} A copy of the supplied array-like object with
 *         the element at index `idx` replaced with the value
 *         returned by applying `fn` to the existing element.
 * @see R.update
 * @example
 *
 *      R.adjust(1, R.toUpper, ['a', 'b', 'c', 'd']);      //=> ['a', 'B', 'c', 'd']
 *      R.adjust(-1, R.toUpper, ['a', 'b', 'c', 'd']);     //=> ['a', 'b', 'c', 'D']
 * @symb R.adjust(-1, f, [a, b]) = [a, f(b)]
 * @symb R.adjust(0, f, [a, b]) = [f(a), b]
 */

var adjust =
/*#__PURE__*/
_curry3(function adjust(idx, fn, list) {
  var len = list.length;

  if (idx >= len || idx < -len) {
    return list;
  }

  var _idx = (len + idx) % len;

  var _list = _concat(list);

  _list[_idx] = fn(list[_idx]);
  return _list;
});

export default adjust;import _curry2 from "./internal/_curry2.js";
import _dispatchable from "./internal/_dispatchable.js";
import _xall from "./internal/_xall.js";
/**
 * Returns `true` if all elements of the list match the predicate, `false` if
 * there are any that don't.
 *
 * Dispatches to the `all` method of the second argument, if present.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> Boolean
 * @param {Function} fn The predicate function.
 * @param {Array} list The array to consider.
 * @return {Boolean} `true` if the predicate is satisfied by every element, `false`
 *         otherwise.
 * @see R.any, R.none, R.transduce
 * @example
 *
 *      const equals3 = R.equals(3);
 *      R.all(equals3)([3, 3, 3, 3]); //=> true
 *      R.all(equals3)([3, 3, 1, 3]); //=> false
 */

var all =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable(['all'], _xall, function all(fn, list) {
  var idx = 0;

  while (idx < list.length) {
    if (!fn(list[idx])) {
      return false;
    }

    idx += 1;
  }

  return true;
}));

export default all;import _curry1 from "./internal/_curry1.js";
import curryN from "./curryN.js";
import max from "./max.js";
import pluck from "./pluck.js";
import reduce from "./reduce.js";
/**
 * Takes a list of predicates and returns a predicate that returns true for a
 * given list of arguments if every one of the provided predicates is satisfied
 * by those arguments.
 *
 * The function returned is a curried function whose arity matches that of the
 * highest-arity predicate.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Logic
 * @sig [(*... -> Boolean)] -> (*... -> Boolean)
 * @param {Array} predicates An array of predicates to check
 * @return {Function} The combined predicate
 * @see R.anyPass
 * @example
 *
 *      const isQueen = R.propEq('rank', 'Q');
 *      const isSpade = R.propEq('suit', '♠︎');
 *      const isQueenOfSpades = R.allPass([isQueen, isSpade]);
 *
 *      isQueenOfSpades({rank: 'Q', suit: '♣︎'}); //=> false
 *      isQueenOfSpades({rank: 'Q', suit: '♠︎'}); //=> true
 */

var allPass =
/*#__PURE__*/
_curry1(function allPass(preds) {
  return curryN(reduce(max, 0, pluck('length', preds)), function () {
    var idx = 0;
    var len = preds.length;

    while (idx < len) {
      if (!preds[idx].apply(this, arguments)) {
        return false;
      }

      idx += 1;
    }

    return true;
  });
});

export default allPass;import _curry1 from "./internal/_curry1.js";
/**
 * Returns a function that always returns the given value. Note that for
 * non-primitives the value returned is a reference to the original value.
 *
 * This function is known as `const`, `constant`, or `K` (for K combinator) in
 * other languages and libraries.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig a -> (* -> a)
 * @param {*} val The value to wrap in a function
 * @return {Function} A Function :: * -> val.
 * @example
 *
 *      const t = R.always('Tee');
 *      t(); //=> 'Tee'
 */

var always =
/*#__PURE__*/
_curry1(function always(val) {
  return function () {
    return val;
  };
});

export default always;import _curry2 from "./internal/_curry2.js";
/**
 * Returns the first argument if it is falsy, otherwise the second argument.
 * Acts as the boolean `and` statement if both inputs are `Boolean`s.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Logic
 * @sig a -> b -> a | b
 * @param {Any} a
 * @param {Any} b
 * @return {Any}
 * @see R.both, R.or
 * @example
 *
 *      R.and(true, true); //=> true
 *      R.and(true, false); //=> false
 *      R.and(false, true); //=> false
 *      R.and(false, false); //=> false
 */

var and =
/*#__PURE__*/
_curry2(function and(a, b) {
  return a && b;
});

export default and;import _curry2 from "./internal/_curry2.js";
import _assertPromise from "./internal/_assertPromise.js";
/**
 * Returns the result of applying the onSuccess function to the value inside
 * a successfully resolved promise. This is useful for working with promises
 * inside function compositions.
 *
 * @func
 * @memberOf R
 * @since v0.27.1
 * @category Function
 * @sig (a -> b) -> (Promise e a) -> (Promise e b)
 * @sig (a -> (Promise e b)) -> (Promise e a) -> (Promise e b)
 * @param {Function} onSuccess The function to apply. Can return a value or a promise of a value.
 * @param {Promise} p
 * @return {Promise} The result of calling `p.then(onSuccess)`
 * @see R.otherwise
 * @example
 *
 *      const makeQuery = email => ({ query: { email }});
 *      const fetchMember = request =>
 *        Promise.resolve({ firstName: 'Bob', lastName: 'Loblaw', id: 42 });
 *
 *      //getMemberName :: String -> Promise ({ firstName, lastName })
 *      const getMemberName = R.pipe(
 *        makeQuery,
 *        fetchMember,
 *        R.andThen(R.pick(['firstName', 'lastName']))
 *      );
 *
 *      getMemberName('bob@gmail.com').then(console.log);
 */

var andThen =
/*#__PURE__*/
_curry2(function andThen(f, p) {
  _assertPromise('andThen', p);

  return p.then(f);
});

export default andThen;import _curry2 from "./internal/_curry2.js";
import _dispatchable from "./internal/_dispatchable.js";
import _xany from "./internal/_xany.js";
/**
 * Returns `true` if at least one of the elements of the list match the predicate,
 * `false` otherwise.
 *
 * Dispatches to the `any` method of the second argument, if present.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> Boolean
 * @param {Function} fn The predicate function.
 * @param {Array} list The array to consider.
 * @return {Boolean} `true` if the predicate is satisfied by at least one element, `false`
 *         otherwise.
 * @see R.all, R.none, R.transduce
 * @example
 *
 *      const lessThan0 = R.flip(R.lt)(0);
 *      const lessThan2 = R.flip(R.lt)(2);
 *      R.any(lessThan0)([1, 2]); //=> false
 *      R.any(lessThan2)([1, 2]); //=> true
 */

var any =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable(['any'], _xany, function any(fn, list) {
  var idx = 0;

  while (idx < list.length) {
    if (fn(list[idx])) {
      return true;
    }

    idx += 1;
  }

  return false;
}));

export default any;import _curry1 from "./internal/_curry1.js";
import curryN from "./curryN.js";
import max from "./max.js";
import pluck from "./pluck.js";
import reduce from "./reduce.js";
/**
 * Takes a list of predicates and returns a predicate that returns true for a
 * given list of arguments if at least one of the provided predicates is
 * satisfied by those arguments.
 *
 * The function returned is a curried function whose arity matches that of the
 * highest-arity predicate.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Logic
 * @sig [(*... -> Boolean)] -> (*... -> Boolean)
 * @param {Array} predicates An array of predicates to check
 * @return {Function} The combined predicate
 * @see R.allPass
 * @example
 *
 *      const isClub = R.propEq('suit', '♣');
 *      const isSpade = R.propEq('suit', '♠');
 *      const isBlackCard = R.anyPass([isClub, isSpade]);
 *
 *      isBlackCard({rank: '10', suit: '♣'}); //=> true
 *      isBlackCard({rank: 'Q', suit: '♠'}); //=> true
 *      isBlackCard({rank: 'Q', suit: '♦'}); //=> false
 */

var anyPass =
/*#__PURE__*/
_curry1(function anyPass(preds) {
  return curryN(reduce(max, 0, pluck('length', preds)), function () {
    var idx = 0;
    var len = preds.length;

    while (idx < len) {
      if (preds[idx].apply(this, arguments)) {
        return true;
      }

      idx += 1;
    }

    return false;
  });
});

export default anyPass;import _concat from "./internal/_concat.js";
import _curry2 from "./internal/_curry2.js";
import _reduce from "./internal/_reduce.js";
import map from "./map.js";
/**
 * ap applies a list of functions to a list of values.
 *
 * Dispatches to the `ap` method of the second argument, if present. Also
 * treats curried functions as applicatives.
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category Function
 * @sig [a -> b] -> [a] -> [b]
 * @sig Apply f => f (a -> b) -> f a -> f b
 * @sig (r -> a -> b) -> (r -> a) -> (r -> b)
 * @param {*} applyF
 * @param {*} applyX
 * @return {*}
 * @example
 *
 *      R.ap([R.multiply(2), R.add(3)], [1,2,3]); //=> [2, 4, 6, 4, 5, 6]
 *      R.ap([R.concat('tasty '), R.toUpper], ['pizza', 'salad']); //=> ["tasty pizza", "tasty salad", "PIZZA", "SALAD"]
 *
 *      // R.ap can also be used as S combinator
 *      // when only two functions are passed
 *      R.ap(R.concat, R.toUpper)('Ramda') //=> 'RamdaRAMDA'
 * @symb R.ap([f, g], [a, b]) = [f(a), f(b), g(a), g(b)]
 */

var ap =
/*#__PURE__*/
_curry2(function ap(applyF, applyX) {
  return typeof applyX['fantasy-land/ap'] === 'function' ? applyX['fantasy-land/ap'](applyF) : typeof applyF.ap === 'function' ? applyF.ap(applyX) : typeof applyF === 'function' ? function (x) {
    return applyF(x)(applyX(x));
  } : _reduce(function (acc, f) {
    return _concat(acc, map(f, applyX));
  }, [], applyF);
});

export default ap;import _aperture from "./internal/_aperture.js";
import _curry2 from "./internal/_curry2.js";
import _dispatchable from "./internal/_dispatchable.js";
import _xaperture from "./internal/_xaperture.js";
/**
 * Returns a new list, composed of n-tuples of consecutive elements. If `n` is
 * greater than the length of the list, an empty list is returned.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.12.0
 * @category List
 * @sig Number -> [a] -> [[a]]
 * @param {Number} n The size of the tuples to create
 * @param {Array} list The list to split into `n`-length tuples
 * @return {Array} The resulting list of `n`-length tuples
 * @see R.transduce
 * @example
 *
 *      R.aperture(2, [1, 2, 3, 4, 5]); //=> [[1, 2], [2, 3], [3, 4], [4, 5]]
 *      R.aperture(3, [1, 2, 3, 4, 5]); //=> [[1, 2, 3], [2, 3, 4], [3, 4, 5]]
 *      R.aperture(7, [1, 2, 3, 4, 5]); //=> []
 */

var aperture =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable([], _xaperture, _aperture));

export default aperture;import _concat from "./internal/_concat.js";
import _curry2 from "./internal/_curry2.js";
/**
 * Returns a new list containing the contents of the given list, followed by
 * the given element.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig a -> [a] -> [a]
 * @param {*} el The element to add to the end of the new list.
 * @param {Array} list The list of elements to add a new item to.
 *        list.
 * @return {Array} A new list containing the elements of the old list followed by `el`.
 * @see R.prepend
 * @example
 *
 *      R.append('tests', ['write', 'more']); //=> ['write', 'more', 'tests']
 *      R.append('tests', []); //=> ['tests']
 *      R.append(['tests'], ['write', 'more']); //=> ['write', 'more', ['tests']]
 */

var append =
/*#__PURE__*/
_curry2(function append(el, list) {
  return _concat(list, [el]);
});

export default append;import _curry2 from "./internal/_curry2.js";
/**
 * Applies function `fn` to the argument list `args`. This is useful for
 * creating a fixed-arity function from a variadic function. `fn` should be a
 * bound function if context is significant.
 *
 * @func
 * @memberOf R
 * @since v0.7.0
 * @category Function
 * @sig (*... -> a) -> [*] -> a
 * @param {Function} fn The function which will be called with `args`
 * @param {Array} args The arguments to call `fn` with
 * @return {*} result The result, equivalent to `fn(...args)`
 * @see R.call, R.unapply
 * @example
 *
 *      const nums = [1, 2, 3, -99, 42, 6, 7];
 *      R.apply(Math.max, nums); //=> 42
 * @symb R.apply(f, [a, b, c]) = f(a, b, c)
 */

var apply =
/*#__PURE__*/
_curry2(function apply(fn, args) {
  return fn.apply(this, args);
});

export default apply;import _curry1 from "./internal/_curry1.js";
import _isArray from "./internal/_isArray.js";
import apply from "./apply.js";
import curryN from "./curryN.js";
import max from "./max.js";
import pluck from "./pluck.js";
import reduce from "./reduce.js";
import keys from "./keys.js";
import values from "./values.js"; // Use custom mapValues function to avoid issues with specs that include a "map" key and R.map
// delegating calls to .map

function mapValues(fn, obj) {
  return _isArray(obj) ? obj.map(fn) : keys(obj).reduce(function (acc, key) {
    acc[key] = fn(obj[key]);
    return acc;
  }, {});
}
/**
 * Given a spec object recursively mapping properties to functions, creates a
 * function producing an object of the same structure, by mapping each property
 * to the result of calling its associated function with the supplied arguments.
 *
 * @func
 * @memberOf R
 * @since v0.20.0
 * @category Function
 * @sig {k: ((a, b, ..., m) -> v)} -> ((a, b, ..., m) -> {k: v})
 * @param {Object} spec an object recursively mapping properties to functions for
 *        producing the values for these properties.
 * @return {Function} A function that returns an object of the same structure
 * as `spec', with each property set to the value returned by calling its
 * associated function with the supplied arguments.
 * @see R.converge, R.juxt
 * @example
 *
 *      const getMetrics = R.applySpec({
 *        sum: R.add,
 *        nested: { mul: R.multiply }
 *      });
 *      getMetrics(2, 4); // => { sum: 6, nested: { mul: 8 } }
 * @symb R.applySpec({ x: f, y: { z: g } })(a, b) = { x: f(a, b), y: { z: g(a, b) } }
 */


var applySpec =
/*#__PURE__*/
_curry1(function applySpec(spec) {
  spec = mapValues(function (v) {
    return typeof v == 'function' ? v : applySpec(v);
  }, spec);
  return curryN(reduce(max, 0, pluck('length', values(spec))), function () {
    var args = arguments;
    return mapValues(function (f) {
      return apply(f, args);
    }, spec);
  });
});

export default applySpec;import _curry2 from "./internal/_curry2.js";
/**
 * Takes a value and applies a function to it.
 *
 * This function is also known as the `thrush` combinator.
 *
 * @func
 * @memberOf R
 * @since v0.25.0
 * @category Function
 * @sig a -> (a -> b) -> b
 * @param {*} x The value
 * @param {Function} f The function to apply
 * @return {*} The result of applying `f` to `x`
 * @example
 *
 *      const t42 = R.applyTo(42);
 *      t42(R.identity); //=> 42
 *      t42(R.add(1)); //=> 43
 */

var applyTo =
/*#__PURE__*/
_curry2(function applyTo(x, f) {
  return f(x);
});

export default applyTo;import _curry3 from "./internal/_curry3.js";
/**
 * Makes an ascending comparator function out of a function that returns a value
 * that can be compared with `<` and `>`.
 *
 * @func
 * @memberOf R
 * @since v0.23.0
 * @category Function
 * @sig Ord b => (a -> b) -> a -> a -> Number
 * @param {Function} fn A function of arity one that returns a value that can be compared
 * @param {*} a The first item to be compared.
 * @param {*} b The second item to be compared.
 * @return {Number} `-1` if fn(a) < fn(b), `1` if fn(b) < fn(a), otherwise `0`
 * @see R.descend
 * @example
 *
 *      const byAge = R.ascend(R.prop('age'));
 *      const people = [
 *        { name: 'Emma', age: 70 },
 *        { name: 'Peter', age: 78 },
 *        { name: 'Mikhail', age: 62 },
 *      ];
 *      const peopleByYoungestFirst = R.sort(byAge, people);
 *        //=> [{ name: 'Mikhail', age: 62 },{ name: 'Emma', age: 70 }, { name: 'Peter', age: 78 }]
 */

var ascend =
/*#__PURE__*/
_curry3(function ascend(fn, a, b) {
  var aa = fn(a);
  var bb = fn(b);
  return aa < bb ? -1 : aa > bb ? 1 : 0;
});

export default ascend;import _curry3 from "./internal/_curry3.js";
import assocPath from "./assocPath.js";
/**
 * Makes a shallow clone of an object, setting or overriding the specified
 * property with the given value. Note that this copies and flattens prototype
 * properties onto the new object as well. All non-primitive properties are
 * copied by reference.
 *
 * @func
 * @memberOf R
 * @since v0.8.0
 * @category Object
 * @typedefn Idx = String | Int
 * @sig Idx -> a -> {k: v} -> {k: v}
 * @param {String|Number} prop The property name to set
 * @param {*} val The new value
 * @param {Object} obj The object to clone
 * @return {Object} A new object equivalent to the original except for the changed property.
 * @see R.dissoc, R.pick
 * @example
 *
 *      R.assoc('c', 3, {a: 1, b: 2}); //=> {a: 1, b: 2, c: 3}
 */

var assoc =
/*#__PURE__*/
_curry3(function assoc(prop, val, obj) {
  return assocPath([prop], val, obj);
});

export default assoc;import _curry3 from "./internal/_curry3.js";
import _has from "./internal/_has.js";
import _isInteger from "./internal/_isInteger.js";
import _assoc from "./internal/_assoc.js";
import isNil from "./isNil.js";
/**
 * Makes a shallow clone of an object, setting or overriding the nodes required
 * to create the given path, and placing the specific value at the tail end of
 * that path. Note that this copies and flattens prototype properties onto the
 * new object as well. All non-primitive properties are copied by reference.
 *
 * @func
 * @memberOf R
 * @since v0.8.0
 * @category Object
 * @typedefn Idx = String | Int | Symbol
 * @sig [Idx] -> a -> {a} -> {a}
 * @param {Array} path the path to set
 * @param {*} val The new value
 * @param {Object} obj The object to clone
 * @return {Object} A new object equivalent to the original except along the specified path.
 * @see R.dissocPath
 * @example
 *
 *      R.assocPath(['a', 'b', 'c'], 42, {a: {b: {c: 0}}}); //=> {a: {b: {c: 42}}}
 *
 *      // Any missing or non-object keys in path will be overridden
 *      R.assocPath(['a', 'b', 'c'], 42, {a: 5}); //=> {a: {b: {c: 42}}}
 */

var assocPath =
/*#__PURE__*/
_curry3(function assocPath(path, val, obj) {
  if (path.length === 0) {
    return val;
  }

  var idx = path[0];

  if (path.length > 1) {
    var nextObj = !isNil(obj) && _has(idx, obj) ? obj[idx] : _isInteger(path[1]) ? [] : {};
    val = assocPath(Array.prototype.slice.call(path, 1), val, nextObj);
  }

  return _assoc(idx, val, obj);
});

export default assocPath;import _curry1 from "./internal/_curry1.js";
import nAry from "./nAry.js";
/**
 * Wraps a function of any arity (including nullary) in a function that accepts
 * exactly 2 parameters. Any extraneous parameters will not be passed to the
 * supplied function.
 *
 * @func
 * @memberOf R
 * @since v0.2.0
 * @category Function
 * @sig (a -> b -> c -> ... -> z) -> ((a, b) -> z)
 * @param {Function} fn The function to wrap.
 * @return {Function} A new function wrapping `fn`. The new function is guaranteed to be of
 *         arity 2.
 * @see R.nAry, R.unary
 * @example
 *
 *      const takesThreeArgs = function(a, b, c) {
 *        return [a, b, c];
 *      };
 *      takesThreeArgs.length; //=> 3
 *      takesThreeArgs(1, 2, 3); //=> [1, 2, 3]
 *
 *      const takesTwoArgs = R.binary(takesThreeArgs);
 *      takesTwoArgs.length; //=> 2
 *      // Only 2 arguments are passed to the wrapped function
 *      takesTwoArgs(1, 2, 3); //=> [1, 2, undefined]
 * @symb R.binary(f)(a, b, c) = f(a, b)
 */

var binary =
/*#__PURE__*/
_curry1(function binary(fn) {
  return nAry(2, fn);
});

export default binary;import _arity from "./internal/_arity.js";
import _curry2 from "./internal/_curry2.js";
/**
 * Creates a function that is bound to a context.
 * Note: `R.bind` does not provide the additional argument-binding capabilities of
 * [Function.prototype.bind](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind).
 *
 * @func
 * @memberOf R
 * @since v0.6.0
 * @category Function
 * @category Object
 * @sig (* -> *) -> {*} -> (* -> *)
 * @param {Function} fn The function to bind to context
 * @param {Object} thisObj The context to bind `fn` to
 * @return {Function} A function that will execute in the context of `thisObj`.
 * @see R.partial
 * @example
 *
 *      const log = R.bind(console.log, console);
 *      R.pipe(R.assoc('a', 2), R.tap(log), R.assoc('a', 3))({a: 1}); //=> {a: 3}
 *      // logs {a: 2}
 * @symb R.bind(f, o)(a, b) = f.call(o, a, b)
 */

var bind =
/*#__PURE__*/
_curry2(function bind(fn, thisObj) {
  return _arity(fn.length, function () {
    return fn.apply(thisObj, arguments);
  });
});

export default bind;import _curry2 from "./internal/_curry2.js";
import _isFunction from "./internal/_isFunction.js";
import and from "./and.js";
import lift from "./lift.js";
/**
 * A function which calls the two provided functions and returns the `&&`
 * of the results.
 * It returns the result of the first function if it is false-y and the result
 * of the second function otherwise. Note that this is short-circuited,
 * meaning that the second function will not be invoked if the first returns a
 * false-y value.
 *
 * In addition to functions, `R.both` also accepts any fantasy-land compatible
 * applicative functor.
 *
 * @func
 * @memberOf R
 * @since v0.12.0
 * @category Logic
 * @sig (*... -> Boolean) -> (*... -> Boolean) -> (*... -> Boolean)
 * @param {Function} f A predicate
 * @param {Function} g Another predicate
 * @return {Function} a function that applies its arguments to `f` and `g` and `&&`s their outputs together.
 * @see R.either, R.and
 * @example
 *
 *      const gt10 = R.gt(R.__, 10)
 *      const lt20 = R.lt(R.__, 20)
 *      const f = R.both(gt10, lt20);
 *      f(15); //=> true
 *      f(30); //=> false
 *
 *      R.both(Maybe.Just(false), Maybe.Just(55)); // => Maybe.Just(false)
 *      R.both([false, false, 'a'], [11]); //=> [false, false, 11]
 */

var both =
/*#__PURE__*/
_curry2(function both(f, g) {
  return _isFunction(f) ? function _both() {
    return f.apply(this, arguments) && g.apply(this, arguments);
  } : lift(and)(f, g);
});

export default both;import _curry1 from "./internal/_curry1.js";
/**
 * Returns the result of calling its first argument with the remaining
 * arguments. This is occasionally useful as a converging function for
 * [`R.converge`](#converge): the first branch can produce a function while the
 * remaining branches produce values to be passed to that function as its
 * arguments.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Function
 * @sig ((*... -> a), *...) -> a
 * @param {Function} fn The function to apply to the remaining arguments.
 * @param {...*} args Any number of positional arguments.
 * @return {*}
 * @see R.apply
 * @example
 *
 *      R.call(R.add, 1, 2); //=> 3
 *
 *      const indentN = R.pipe(
 *        R.repeat(' '),
 *        R.join(''),
 *        R.replace(/^(?!$)/gm)
 *      );
 *
 *      const format = R.converge(
 *        R.call,
 *        [
 *          R.pipe(R.prop('indent'), indentN),
 *          R.prop('value')
 *        ]
 *      );
 *
 *      format({indent: 2, value: 'foo\nbar\nbaz\n'}); //=> '  foo\n  bar\n  baz\n'
 * @symb R.call(f, a, b) = f(a, b)
 */

var call =
/*#__PURE__*/
_curry1(function call(fn) {
  return fn.apply(this, Array.prototype.slice.call(arguments, 1));
});

export default call;import _curry2 from "./internal/_curry2.js";
import _dispatchable from "./internal/_dispatchable.js";
import _makeFlat from "./internal/_makeFlat.js";
import _xchain from "./internal/_xchain.js";
import map from "./map.js";
/**
 * `chain` maps a function over a list and concatenates the results. `chain`
 * is also known as `flatMap` in some libraries.
 *
 * Dispatches to the `chain` method of the second argument, if present,
 * according to the [FantasyLand Chain spec](https://github.com/fantasyland/fantasy-land#chain).
 *
 * If second argument is a function, `chain(f, g)(x)` is equivalent to `f(g(x), x)`.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category List
 * @sig Chain m => (a -> m b) -> m a -> m b
 * @param {Function} fn The function to map with
 * @param {Array} list The list to map over
 * @return {Array} The result of flat-mapping `list` with `fn`
 * @example
 *
 *      const duplicate = n => [n, n];
 *      R.chain(duplicate, [1, 2, 3]); //=> [1, 1, 2, 2, 3, 3]
 *
 *      R.chain(R.append, R.head)([1, 2, 3]); //=> [1, 2, 3, 1]
 */

var chain =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable(['fantasy-land/chain', 'chain'], _xchain, function chain(fn, monad) {
  if (typeof monad === 'function') {
    return function (x) {
      return fn(monad(x))(x);
    };
  }

  return _makeFlat(false)(map(fn, monad));
}));

export default chain;import _curry3 from "./internal/_curry3.js";
/**
 * Restricts a number to be within a range.
 *
 * Also works for other ordered types such as Strings and Dates.
 *
 * @func
 * @memberOf R
 * @since v0.20.0
 * @category Relation
 * @sig Ord a => a -> a -> a -> a
 * @param {Number} minimum The lower limit of the clamp (inclusive)
 * @param {Number} maximum The upper limit of the clamp (inclusive)
 * @param {Number} value Value to be clamped
 * @return {Number} Returns `minimum` when `val < minimum`, `maximum` when `val > maximum`, returns `val` otherwise
 * @example
 *
 *      R.clamp(1, 10, -5) // => 1
 *      R.clamp(1, 10, 15) // => 10
 *      R.clamp(1, 10, 4)  // => 4
 */

var clamp =
/*#__PURE__*/
_curry3(function clamp(min, max, value) {
  if (min > max) {
    throw new Error('min must not be greater than max in clamp(min, max, value)');
  }

  return value < min ? min : value > max ? max : value;
});

export default clamp;import _clone from "./internal/_clone.js";
import _curry1 from "./internal/_curry1.js";
/**
 * Creates a deep copy of the source that can be used in place of the source
 * object without retaining any references to it.
 * The source object may contain (nested) `Array`s and `Object`s,
 * `Number`s, `String`s, `Boolean`s and `Date`s.
 * `Function`s are assigned by reference rather than copied.
 *
 * Dispatches to a `clone` method if present.
 *
 * Note that if the source object has multiple nodes that share a reference,
 * the returned object will have the same structure, but the references will
 * be pointed to the location within the cloned value.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @sig {*} -> {*}
 * @param {*} value The object or array to clone
 * @return {*} A deeply cloned copy of `val`
 * @example
 *
 *      const objects = [{}, {}, {}];
 *      const objectsClone = R.clone(objects);
 *      objects === objectsClone; //=> false
 *      objects[0] === objectsClone[0]; //=> false
 */

var clone =
/*#__PURE__*/
_curry1(function clone(value) {
  return value != null && typeof value.clone === 'function' ? value.clone() : _clone(value, [], [], true);
});

export default clone;import _curry2 from "./internal/_curry2.js";
import _reduce from "./internal/_reduce.js";
/**
 * Splits a list into sub-lists, based on the result of calling a key-returning function on each element,
 * and grouping the results according to values returned.
 *
 * @func
 * @memberOf R
 * @since v0.28.0
 * @category List
 * @typedefn Idx = String | Int | Symbol
 * @sig Idx a => (b -> a) -> [b] -> [[b]]
 * @param {Function} fn Function :: a -> Idx
 * @param {Array} list The array to group
 * @return {Array}
 *    An array of arrays where each sub-array contains items for which
 *    the String-returning function has returned the same value.
 * @see R.groupBy, R.partition
 * @example
 *      R.collectBy(R.prop('type'), [
 *        {type: 'breakfast', item: '☕️'},
 *        {type: 'lunch', item: '🌯'},
 *        {type: 'dinner', item: '🍝'},
 *        {type: 'breakfast', item: '🥐'},
 *        {type: 'lunch', item: '🍕'}
 *      ]);
 *
 *      // [ [ {type: 'breakfast', item: '☕️'},
 *      //     {type: 'breakfast', item: '🥐'} ],
 *      //   [ {type: 'lunch', item: '🌯'},
 *      //     {type: 'lunch', item: '🍕'} ],
 *      //   [ {type: 'dinner', item: '🍝'} ] ]
 */

var collectBy =
/*#__PURE__*/
_curry2(function collectBy(fn, list) {
  var group = _reduce(function (o, x) {
    var tag = fn(x);

    if (o[tag] === undefined) {
      o[tag] = [];
    }

    o[tag].push(x);
    return o;
  }, {}, list);

  var newList = [];

  for (var tag in group) {
    newList.push(group[tag]);
  }

  return newList;
});

export default collectBy;import _curry1 from "./internal/_curry1.js";
/**
 * Makes a comparator function out of a function that reports whether the first
 * element is less than the second.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig ((a, b) -> Boolean) -> ((a, b) -> Number)
 * @param {Function} pred A predicate function of arity two which will return `true` if the first argument
 * is less than the second, `false` otherwise
 * @return {Function} A Function :: a -> b -> Int that returns `-1` if a < b, `1` if b < a, otherwise `0`
 * @example
 *
 *      const byAge = R.comparator((a, b) => a.age < b.age);
 *      const people = [
 *        { name: 'Emma', age: 70 },
 *        { name: 'Peter', age: 78 },
 *        { name: 'Mikhail', age: 62 },
 *      ];
 *      const peopleByIncreasingAge = R.sort(byAge, people);
 *        //=> [{ name: 'Mikhail', age: 62 },{ name: 'Emma', age: 70 }, { name: 'Peter', age: 78 }]
 */

var comparator =
/*#__PURE__*/
_curry1(function comparator(pred) {
  return function (a, b) {
    return pred(a, b) ? -1 : pred(b, a) ? 1 : 0;
  };
});

export default comparator;import lift from "./lift.js";
import not from "./not.js";
/**
 * Takes a function `f` and returns a function `g` such that if called with the same arguments
 * when `f` returns a "truthy" value, `g` returns `false` and when `f` returns a "falsy" value `g` returns `true`.
 *
 * `R.complement` may be applied to any functor
 *
 * @func
 * @memberOf R
 * @since v0.12.0
 * @category Logic
 * @sig (*... -> *) -> (*... -> Boolean)
 * @param {Function} f
 * @return {Function}
 * @see R.not
 * @example
 *
 *      const isNotNil = R.complement(R.isNil);
 *      R.isNil(null); //=> true
 *      isNotNil(null); //=> false
 *      R.isNil(7); //=> false
 *      isNotNil(7); //=> true
 */

var complement =
/*#__PURE__*/
lift(not);
export default complement;import pipe from "./pipe.js";
import reverse from "./reverse.js";
/**
 * Performs right-to-left function composition. The last argument may have
 * any arity; the remaining arguments must be unary.
 *
 * **Note:** The result of compose is not automatically curried.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig ((y -> z), (x -> y), ..., (o -> p), ((a, b, ..., n) -> o)) -> ((a, b, ..., n) -> z)
 * @param {...Function} ...functions The functions to compose
 * @return {Function}
 * @see R.pipe
 * @example
 *
 *      const classyGreeting = (firstName, lastName) => "The name's " + lastName + ", " + firstName + " " + lastName
 *      const yellGreeting = R.compose(R.toUpper, classyGreeting);
 *      yellGreeting('James', 'Bond'); //=> "THE NAME'S BOND, JAMES BOND"
 *
 *      R.compose(Math.abs, R.add(1), R.multiply(2))(-4) //=> 7
 *
 * @symb R.compose(f, g, h)(a, b) = f(g(h(a, b)))
 * @symb R.compose(f, g, h)(a)(b) = f(g(h(a)))(b)
 */

export default function compose() {
  if (arguments.length === 0) {
    throw new Error('compose requires at least one argument');
  }

  return pipe.apply(this, reverse(arguments));
}import _curry2 from "./internal/_curry2.js";
import pipeWith from "./pipeWith.js";
import reverse from "./reverse.js";
/**
 * Performs right-to-left function composition using transforming function. The last function may have
 * any arity; the remaining functions must be unary.
 *
 * **Note:** The result of composeWith is not automatically curried. Transforming function is not used
 * on the last argument.
 *
 * @func
 * @memberOf R
 * @since v0.26.0
 * @category Function
 * @sig ((* -> *), [(y -> z), (x -> y), ..., (o -> p), ((a, b, ..., n) -> o)]) -> ((a, b, ..., n) -> z)
 * @param {Function} transformer The transforming function
 * @param {Array} functions The functions to compose
 * @return {Function}
 * @see R.compose, R.pipeWith
 * @example
 *
 *      const composeWhileNotNil = R.composeWith((f, res) => R.isNil(res) ? res : f(res));
 *
 *      composeWhileNotNil([R.inc, R.prop('age')])({age: 1}) //=> 2
 *      composeWhileNotNil([R.inc, R.prop('age')])({}) //=> undefined
 *
 * @symb R.composeWith(f)([g, h, i])(...args) = f(g, f(h, i(...args)))
 */

var composeWith =
/*#__PURE__*/
_curry2(function composeWith(xf, list) {
  return pipeWith.apply(this, [xf, reverse(list)]);
});

export default composeWith;import _curry2 from "./internal/_curry2.js";
import _isArray from "./internal/_isArray.js";
import _isFunction from "./internal/_isFunction.js";
import _isString from "./internal/_isString.js";
import toString from "./toString.js";
/**
 * Returns the result of concatenating the given lists or strings.
 *
 * Note: `R.concat` expects both arguments to be of the same type,
 * unlike the native `Array.prototype.concat` method. It will throw
 * an error if you `concat` an Array with a non-Array value.
 *
 * Dispatches to the `concat` method of the first argument, if present.
 * Can also concatenate two members of a [fantasy-land
 * compatible semigroup](https://github.com/fantasyland/fantasy-land#semigroup).
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig [a] -> [a] -> [a]
 * @sig String -> String -> String
 * @param {Array|String} firstList The first list
 * @param {Array|String} secondList The second list
 * @return {Array|String} A list consisting of the elements of `firstList` followed by the elements of
 * `secondList`.
 *
 * @example
 *
 *      R.concat('ABC', 'DEF'); // 'ABCDEF'
 *      R.concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3]
 *      R.concat([], []); //=> []
 */

var concat =
/*#__PURE__*/
_curry2(function concat(a, b) {
  if (_isArray(a)) {
    if (_isArray(b)) {
      return a.concat(b);
    }

    throw new TypeError(toString(b) + ' is not an array');
  }

  if (_isString(a)) {
    if (_isString(b)) {
      return a + b;
    }

    throw new TypeError(toString(b) + ' is not a string');
  }

  if (a != null && _isFunction(a['fantasy-land/concat'])) {
    return a['fantasy-land/concat'](b);
  }

  if (a != null && _isFunction(a.concat)) {
    return a.concat(b);
  }

  throw new TypeError(toString(a) + ' does not have a method named "concat" or "fantasy-land/concat"');
});

export default concat;import _arity from "./internal/_arity.js";
import _curry1 from "./internal/_curry1.js";
import map from "./map.js";
import max from "./max.js";
import reduce from "./reduce.js";
/**
 * Returns a function, `fn`, which encapsulates `if/else, if/else, ...` logic.
 * `R.cond` takes a list of [predicate, transformer] pairs. All of the arguments
 * to `fn` are applied to each of the predicates in turn until one returns a
 * "truthy" value, at which point `fn` returns the result of applying its
 * arguments to the corresponding transformer. If none of the predicates
 * matches, `fn` returns undefined.
 *
 * **Please note**: This is not a direct substitute for a `switch` statement.
 * Remember that both elements of every pair passed to `cond` are *functions*,
 * and `cond` returns a function.
 *
 * @func
 * @memberOf R
 * @since v0.6.0
 * @category Logic
 * @sig [[(*... -> Boolean),(*... -> *)]] -> (*... -> *)
 * @param {Array} pairs A list of [predicate, transformer]
 * @return {Function}
 * @see R.ifElse, R.unless, R.when
 * @example
 *
 *      const fn = R.cond([
 *        [R.equals(0),   R.always('water freezes at 0°C')],
 *        [R.equals(100), R.always('water boils at 100°C')],
 *        [R.T,           temp => 'nothing special happens at ' + temp + '°C']
 *      ]);
 *      fn(0); //=> 'water freezes at 0°C'
 *      fn(50); //=> 'nothing special happens at 50°C'
 *      fn(100); //=> 'water boils at 100°C'
 */

var cond =
/*#__PURE__*/
_curry1(function cond(pairs) {
  var arity = reduce(max, 0, map(function (pair) {
    return pair[0].length;
  }, pairs));
  return _arity(arity, function () {
    var idx = 0;

    while (idx < pairs.length) {
      if (pairs[idx][0].apply(this, arguments)) {
        return pairs[idx][1].apply(this, arguments);
      }

      idx += 1;
    }
  });
});

export default cond;import _curry1 from "./internal/_curry1.js";
import constructN from "./constructN.js";
/**
 * Wraps a constructor function inside a curried function that can be called
 * with the same arguments and returns the same type.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig (* -> {*}) -> (* -> {*})
 * @param {Function} fn The constructor function to wrap.
 * @return {Function} A wrapped, curried constructor function.
 * @see R.invoker
 * @example
 *
 *      // Constructor function
 *      function Animal(kind) {
 *        this.kind = kind;
 *      };
 *      Animal.prototype.sighting = function() {
 *        return "It's a " + this.kind + "!";
 *      }
 *
 *      const AnimalConstructor = R.construct(Animal)
 *
 *      // Notice we no longer need the 'new' keyword:
 *      AnimalConstructor('Pig'); //=> {"kind": "Pig", "sighting": function (){...}};
 *
 *      const animalTypes = ["Lion", "Tiger", "Bear"];
 *      const animalSighting = R.invoker(0, 'sighting');
 *      const sightNewAnimal = R.compose(animalSighting, AnimalConstructor);
 *      R.map(sightNewAnimal, animalTypes); //=> ["It's a Lion!", "It's a Tiger!", "It's a Bear!"]
 */

var construct =
/*#__PURE__*/
_curry1(function construct(Fn) {
  return constructN(Fn.length, Fn);
});

export default construct;import _curry2 from "./internal/_curry2.js";
import curry from "./curry.js";
import nAry from "./nAry.js";
/**
 * Wraps a constructor function inside a curried function that can be called
 * with the same arguments and returns the same type. The arity of the function
 * returned is specified to allow using variadic constructor functions.
 *
 * @func
 * @memberOf R
 * @since v0.4.0
 * @category Function
 * @sig Number -> (* -> {*}) -> (* -> {*})
 * @param {Number} n The arity of the constructor function.
 * @param {Function} Fn The constructor function to wrap.
 * @return {Function} A wrapped, curried constructor function.
 * @example
 *
 *      // Variadic Constructor function
 *      function Salad() {
 *        this.ingredients = arguments;
 *      }
 *
 *      Salad.prototype.recipe = function() {
 *        const instructions = R.map(ingredient => 'Add a dollop of ' + ingredient, this.ingredients);
 *        return R.join('\n', instructions);
 *      };
 *
 *      const ThreeLayerSalad = R.constructN(3, Salad);
 *
 *      // Notice we no longer need the 'new' keyword, and the constructor is curried for 3 arguments.
 *      const salad = ThreeLayerSalad('Mayonnaise')('Potato Chips')('Ketchup');
 *
 *      console.log(salad.recipe());
 *      // Add a dollop of Mayonnaise
 *      // Add a dollop of Potato Chips
 *      // Add a dollop of Ketchup
 */

var constructN =
/*#__PURE__*/
_curry2(function constructN(n, Fn) {
  if (n > 10) {
    throw new Error('Constructor with greater than ten arguments');
  }

  if (n === 0) {
    return function () {
      return new Fn();
    };
  }

  return curry(nAry(n, function ($0, $1, $2, $3, $4, $5, $6, $7, $8, $9) {
    switch (arguments.length) {
      case 1:
        return new Fn($0);

      case 2:
        return new Fn($0, $1);

      case 3:
        return new Fn($0, $1, $2);

      case 4:
        return new Fn($0, $1, $2, $3);

      case 5:
        return new Fn($0, $1, $2, $3, $4);

      case 6:
        return new Fn($0, $1, $2, $3, $4, $5);

      case 7:
        return new Fn($0, $1, $2, $3, $4, $5, $6);

      case 8:
        return new Fn($0, $1, $2, $3, $4, $5, $6, $7);

      case 9:
        return new Fn($0, $1, $2, $3, $4, $5, $6, $7, $8);

      case 10:
        return new Fn($0, $1, $2, $3, $4, $5, $6, $7, $8, $9);
    }
  }));
});

export default constructN;import _curry2 from "./internal/_curry2.js";
import _map from "./internal/_map.js";
import curryN from "./curryN.js";
import max from "./max.js";
import pluck from "./pluck.js";
import reduce from "./reduce.js";
/**
 * Accepts a converging function and a list of branching functions and returns
 * a new function. The arity of the new function is the same as the arity of
 * the longest branching function. When invoked, this new function is applied
 * to some arguments, and each branching function is applied to those same
 * arguments. The results of each branching function are passed as arguments
 * to the converging function to produce the return value.
 *
 * @func
 * @memberOf R
 * @since v0.4.2
 * @category Function
 * @sig ((x1, x2, ...) -> z) -> [((a, b, ...) -> x1), ((a, b, ...) -> x2), ...] -> (a -> b -> ... -> z)
 * @param {Function} after A function. `after` will be invoked with the return values of
 *        `fn1` and `fn2` as its arguments.
 * @param {Array} functions A list of functions.
 * @return {Function} A new function.
 * @see R.useWith
 * @example
 *
 *      const average = R.converge(R.divide, [R.sum, R.length])
 *      average([1, 2, 3, 4, 5, 6, 7]) //=> 4
 *
 *      const strangeConcat = R.converge(R.concat, [R.toUpper, R.toLower])
 *      strangeConcat("Yodel") //=> "YODELyodel"
 *
 * @symb R.converge(f, [g, h])(a, b) = f(g(a, b), h(a, b))
 */

var converge =
/*#__PURE__*/
_curry2(function converge(after, fns) {
  return curryN(reduce(max, 0, pluck('length', fns)), function () {
    var args = arguments;
    var context = this;
    return after.apply(context, _map(function (fn) {
      return fn.apply(context, args);
    }, fns));
  });
});

export default converge;import _reduce from "./internal/_reduce.js";
import curry from "./curry.js";
/**
 * Returns the number of items in a given `list` matching the predicate `f`
 *
 * @func
 * @memberOf R
 * @since v0.28.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> Number
 * @param {Function} predicate to match items against
 * @return {Array} list of items to count in
 * @example
 *
 *      const even = x => x % 2 == 0;
 *
 *      R.count(even, [1, 2, 3, 4, 5]); // => 2
 *      R.map(R.count(even), [[1, 1, 1], [2, 3, 4, 5], [6]]); // => [0, 2, 1]
 */

var count =
/*#__PURE__*/
curry(function (pred, list) {
  return _reduce(function (a, e) {
    return pred(e) ? a + 1 : a;
  }, 0, list);
});
export default count;import reduceBy from "./reduceBy.js";
/**
 * Counts the elements of a list according to how many match each value of a
 * key generated by the supplied function. Returns an object mapping the keys
 * produced by `fn` to the number of occurrences in the list. Note that all
 * keys are coerced to strings because of how JavaScript objects work.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig (a -> String) -> [a] -> {*}
 * @param {Function} fn The function used to map values to keys.
 * @param {Array} list The list to count elements from.
 * @return {Object} An object mapping keys to number of occurrences in the list.
 * @example
 *
 *      const numbers = [1.0, 1.1, 1.2, 2.0, 3.0, 2.2];
 *      R.countBy(Math.floor)(numbers);    //=> {'1': 3, '2': 2, '3': 1}
 *
 *      const letters = ['a', 'b', 'A', 'a', 'B', 'c'];
 *      R.countBy(R.toLower)(letters);   //=> {'a': 3, 'b': 2, 'c': 1}
 */

var countBy =
/*#__PURE__*/
reduceBy(function (acc, elem) {
  return acc + 1;
}, 0);
export default countBy;import _curry1 from "./internal/_curry1.js";
import curryN from "./curryN.js";
/**
 * Returns a curried equivalent of the provided function. The curried function
 * has two unusual capabilities. First, its arguments needn't be provided one
 * at a time. If `f` is a ternary function and `g` is `R.curry(f)`, the
 * following are equivalent:
 *
 *   - `g(1)(2)(3)`
 *   - `g(1)(2, 3)`
 *   - `g(1, 2)(3)`
 *   - `g(1, 2, 3)`
 *
 * Secondly, the special placeholder value [`R.__`](#__) may be used to specify
 * "gaps", allowing partial application of any combination of arguments,
 * regardless of their positions. If `g` is as above and `_` is [`R.__`](#__),
 * the following are equivalent:
 *
 *   - `g(1, 2, 3)`
 *   - `g(_, 2, 3)(1)`
 *   - `g(_, _, 3)(1)(2)`
 *   - `g(_, _, 3)(1, 2)`
 *   - `g(_, 2)(1)(3)`
 *   - `g(_, 2)(1, 3)`
 *   - `g(_, 2)(_, 3)(1)`
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig (* -> a) -> (* -> a)
 * @param {Function} fn The function to curry.
 * @return {Function} A new, curried function.
 * @see R.curryN, R.partial
 * @example
 *
 *      const addFourNumbers = (a, b, c, d) => a + b + c + d;
 *
 *      const curriedAddFourNumbers = R.curry(addFourNumbers);
 *      const f = curriedAddFourNumbers(1, 2);
 *      const g = f(3);
 *      g(4); //=> 10
 */

var curry =
/*#__PURE__*/
_curry1(function curry(fn) {
  return curryN(fn.length, fn);
});

export default curry;import _arity from "./internal/_arity.js";
import _curry1 from "./internal/_curry1.js";
import _curry2 from "./internal/_curry2.js";
import _curryN from "./internal/_curryN.js";
/**
 * Returns a curried equivalent of the provided function, with the specified
 * arity. The curried function has two unusual capabilities. First, its
 * arguments needn't be provided one at a time. If `g` is `R.curryN(3, f)`, the
 * following are equivalent:
 *
 *   - `g(1)(2)(3)`
 *   - `g(1)(2, 3)`
 *   - `g(1, 2)(3)`
 *   - `g(1, 2, 3)`
 *
 * Secondly, the special placeholder value [`R.__`](#__) may be used to specify
 * "gaps", allowing partial application of any combination of arguments,
 * regardless of their positions. If `g` is as above and `_` is [`R.__`](#__),
 * the following are equivalent:
 *
 *   - `g(1, 2, 3)`
 *   - `g(_, 2, 3)(1)`
 *   - `g(_, _, 3)(1)(2)`
 *   - `g(_, _, 3)(1, 2)`
 *   - `g(_, 2)(1)(3)`
 *   - `g(_, 2)(1, 3)`
 *   - `g(_, 2)(_, 3)(1)`
 *
 * @func
 * @memberOf R
 * @since v0.5.0
 * @category Function
 * @sig Number -> (* -> a) -> (* -> a)
 * @param {Number} length The arity for the returned function.
 * @param {Function} fn The function to curry.
 * @return {Function} A new, curried function.
 * @see R.curry
 * @example
 *
 *      const sumArgs = (...args) => R.sum(args);
 *
 *      const curriedAddFourNumbers = R.curryN(4, sumArgs);
 *      const f = curriedAddFourNumbers(1, 2);
 *      const g = f(3);
 *      g(4); //=> 10
 */

var curryN =
/*#__PURE__*/
_curry2(function curryN(length, fn) {
  if (length === 1) {
    return _curry1(fn);
  }

  return _arity(length, _curryN(length, [], fn));
});

export default curryN;import add from "./add.js";
/**
 * Decrements its argument.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Math
 * @sig Number -> Number
 * @param {Number} n
 * @return {Number} n - 1
 * @see R.inc
 * @example
 *
 *      R.dec(42); //=> 41
 */

var dec =
/*#__PURE__*/
add(-1);
export default dec;import _curry2 from "./internal/_curry2.js";
/**
 * Returns the second argument if it is not `null`, `undefined` or `NaN`;
 * otherwise the first argument is returned.
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category Logic
 * @sig a -> b -> a | b
 * @param {a} default The default value.
 * @param {b} val `val` will be returned instead of `default` unless `val` is `null`, `undefined` or `NaN`.
 * @return {*} The second value if it is not `null`, `undefined` or `NaN`, otherwise the default value
 * @example
 *
 *      const defaultTo42 = R.defaultTo(42);
 *
 *      defaultTo42(null);  //=> 42
 *      defaultTo42(undefined);  //=> 42
 *      defaultTo42(false);  //=> false
 *      defaultTo42('Ramda');  //=> 'Ramda'
 *      // parseInt('string') results in NaN
 *      defaultTo42(parseInt('string')); //=> 42
 */

var defaultTo =
/*#__PURE__*/
_curry2(function defaultTo(d, v) {
  return v == null || v !== v ? d : v;
});

export default defaultTo;import _curry3 from "./internal/_curry3.js";
/**
 * Makes a descending comparator function out of a function that returns a value
 * that can be compared with `<` and `>`.
 *
 * @func
 * @memberOf R
 * @since v0.23.0
 * @category Function
 * @sig Ord b => (a -> b) -> a -> a -> Number
 * @param {Function} fn A function of arity one that returns a value that can be compared
 * @param {*} a The first item to be compared.
 * @param {*} b The second item to be compared.
 * @return {Number} `-1` if fn(a) > fn(b), `1` if fn(b) > fn(a), otherwise `0`
 * @see R.ascend
 * @example
 *
 *      const byAge = R.descend(R.prop('age'));
 *      const people = [
 *        { name: 'Emma', age: 70 },
 *        { name: 'Peter', age: 78 },
 *        { name: 'Mikhail', age: 62 },
 *      ];
 *      const peopleByOldestFirst = R.sort(byAge, people);
 *        //=> [{ name: 'Peter', age: 78 }, { name: 'Emma', age: 70 }, { name: 'Mikhail', age: 62 }]
 */

var descend =
/*#__PURE__*/
_curry3(function descend(fn, a, b) {
  var aa = fn(a);
  var bb = fn(b);
  return aa > bb ? -1 : aa < bb ? 1 : 0;
});

export default descend;import _curry2 from "./internal/_curry2.js";
import _Set from "./internal/_Set.js";
/**
 * Finds the set (i.e. no duplicates) of all elements in the first list not
 * contained in the second list. Objects and Arrays are compared in terms of
 * value equality, not reference equality.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig [*] -> [*] -> [*]
 * @param {Array} list1 The first list.
 * @param {Array} list2 The second list.
 * @return {Array} The elements in `list1` that are not in `list2`.
 * @see R.differenceWith, R.symmetricDifference, R.symmetricDifferenceWith, R.without
 * @example
 *
 *      R.difference([1,2,3,4], [7,6,5,4,3]); //=> [1,2]
 *      R.difference([7,6,5,4,3], [1,2,3,4]); //=> [7,6,5]
 *      R.difference([{a: 1}, {b: 2}], [{a: 1}, {c: 3}]) //=> [{b: 2}]
 */

var difference =
/*#__PURE__*/
_curry2(function difference(first, second) {
  var out = [];
  var idx = 0;
  var firstLen = first.length;
  var secondLen = second.length;
  var toFilterOut = new _Set();

  for (var i = 0; i < secondLen; i += 1) {
    toFilterOut.add(second[i]);
  }

  while (idx < firstLen) {
    if (toFilterOut.add(first[idx])) {
      out[out.length] = first[idx];
    }

    idx += 1;
  }

  return out;
});

export default difference;import _includesWith from "./internal/_includesWith.js";
import _curry3 from "./internal/_curry3.js";
/**
 * Finds the set (i.e. no duplicates) of all elements in the first list not
 * contained in the second list. Duplication is determined according to the
 * value returned by applying the supplied predicate to two list elements.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig ((a, a) -> Boolean) -> [a] -> [a] -> [a]
 * @param {Function} pred A predicate used to test whether two items are equal.
 * @param {Array} list1 The first list.
 * @param {Array} list2 The second list.
 * @return {Array} The elements in `list1` that are not in `list2`.
 * @see R.difference, R.symmetricDifference, R.symmetricDifferenceWith
 * @example
 *
 *      const cmp = (x, y) => x.a === y.a;
 *      const l1 = [{a: 1}, {a: 2}, {a: 3}];
 *      const l2 = [{a: 3}, {a: 4}];
 *      R.differenceWith(cmp, l1, l2); //=> [{a: 1}, {a: 2}]
 */

var differenceWith =
/*#__PURE__*/
_curry3(function differenceWith(pred, first, second) {
  var out = [];
  var idx = 0;
  var firstLen = first.length;

  while (idx < firstLen) {
    if (!_includesWith(pred, first[idx], second) && !_includesWith(pred, first[idx], out)) {
      out.push(first[idx]);
    }

    idx += 1;
  }

  return out;
});

export default differenceWith;import _curry2 from "./internal/_curry2.js";
import dissocPath from "./dissocPath.js";
/**
 * Returns a new object that does not contain a `prop` property.
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category Object
 * @sig String -> {k: v} -> {k: v}
 * @param {String} prop The name of the property to dissociate
 * @param {Object} obj The object to clone
 * @return {Object} A new object equivalent to the original but without the specified property
 * @see R.assoc, R.omit
 * @example
 *
 *      R.dissoc('b', {a: 1, b: 2, c: 3}); //=> {a: 1, c: 3}
 */

var dissoc =
/*#__PURE__*/
_curry2(function dissoc(prop, obj) {
  return dissocPath([prop], obj);
});

export default dissoc;import _curry2 from "./internal/_curry2.js";
import _dissoc from "./internal/_dissoc.js";
import _isInteger from "./internal/_isInteger.js";
import _isArray from "./internal/_isArray.js";
import assoc from "./assoc.js";
/**
 * Makes a shallow clone of an object. Note that this copies and flattens
 * prototype properties onto the new object as well. All non-primitive
 * properties are copied by reference.
 *
 * @private
 * @param {String|Integer} prop The prop operating
 * @param {Object|Array} obj The object to clone
 * @return {Object|Array} A new object equivalent to the original.
 */

function _shallowCloneObject(prop, obj) {
  if (_isInteger(prop) && _isArray(obj)) {
    return [].concat(obj);
  }

  var result = {};

  for (var p in obj) {
    result[p] = obj[p];
  }

  return result;
}
/**
 * Makes a shallow clone of an object, omitting the property at the given path.
 * Note that this copies and flattens prototype properties onto the new object
 * as well. All non-primitive properties are copied by reference.
 *
 * @func
 * @memberOf R
 * @since v0.11.0
 * @category Object
 * @typedefn Idx = String | Int | Symbol
 * @sig [Idx] -> {k: v} -> {k: v}
 * @param {Array} path The path to the value to omit
 * @param {Object} obj The object to clone
 * @return {Object} A new object without the property at path
 * @see R.assocPath
 * @example
 *
 *      R.dissocPath(['a', 'b', 'c'], {a: {b: {c: 42}}}); //=> {a: {b: {}}}
 */


var dissocPath =
/*#__PURE__*/
_curry2(function dissocPath(path, obj) {
  if (obj == null) {
    return obj;
  }

  switch (path.length) {
    case 0:
      return obj;

    case 1:
      return _dissoc(path[0], obj);

    default:
      var head = path[0];
      var tail = Array.prototype.slice.call(path, 1);

      if (obj[head] == null) {
        return _shallowCloneObject(head, obj);
      } else {
        return assoc(head, dissocPath(tail, obj[head]), obj);
      }

  }
});

export default dissocPath;import _curry2 from "./internal/_curry2.js";
/**
 * Divides two numbers. Equivalent to `a / b`.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Math
 * @sig Number -> Number -> Number
 * @param {Number} a The first value.
 * @param {Number} b The second value.
 * @return {Number} The result of `a / b`.
 * @see R.multiply
 * @example
 *
 *      R.divide(71, 100); //=> 0.71
 *
 *      const half = R.divide(R.__, 2);
 *      half(42); //=> 21
 *
 *      const reciprocal = R.divide(1);
 *      reciprocal(4);   //=> 0.25
 */

var divide =
/*#__PURE__*/
_curry2(function divide(a, b) {
  return a / b;
});

export default divide;import _curry2 from "./internal/_curry2.js";
import _dispatchable from "./internal/_dispatchable.js";
import _xdrop from "./internal/_xdrop.js";
import slice from "./slice.js";
/**
 * Returns all but the first `n` elements of the given list, string, or
 * transducer/transformer (or object with a `drop` method).
 *
 * Dispatches to the `drop` method of the second argument, if present.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig Number -> [a] -> [a]
 * @sig Number -> String -> String
 * @param {Number} n
 * @param {*} list
 * @return {*} A copy of list without the first `n` elements
 * @see R.take, R.transduce, R.dropLast, R.dropWhile
 * @example
 *
 *      R.drop(1, ['foo', 'bar', 'baz']); //=> ['bar', 'baz']
 *      R.drop(2, ['foo', 'bar', 'baz']); //=> ['baz']
 *      R.drop(3, ['foo', 'bar', 'baz']); //=> []
 *      R.drop(4, ['foo', 'bar', 'baz']); //=> []
 *      R.drop(3, 'ramda');               //=> 'da'
 */

var drop =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable(['drop'], _xdrop, function drop(n, xs) {
  return slice(Math.max(0, n), Infinity, xs);
}));

export default drop;import _curry2 from "./internal/_curry2.js";
import _dispatchable from "./internal/_dispatchable.js";
import _dropLast from "./internal/_dropLast.js";
import _xdropLast from "./internal/_xdropLast.js";
/**
 * Returns a list containing all but the last `n` elements of the given `list`.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category List
 * @sig Number -> [a] -> [a]
 * @sig Number -> String -> String
 * @param {Number} n The number of elements of `list` to skip.
 * @param {Array} list The list of elements to consider.
 * @return {Array} A copy of the list with only the first `list.length - n` elements
 * @see R.takeLast, R.drop, R.dropWhile, R.dropLastWhile
 * @example
 *
 *      R.dropLast(1, ['foo', 'bar', 'baz']); //=> ['foo', 'bar']
 *      R.dropLast(2, ['foo', 'bar', 'baz']); //=> ['foo']
 *      R.dropLast(3, ['foo', 'bar', 'baz']); //=> []
 *      R.dropLast(4, ['foo', 'bar', 'baz']); //=> []
 *      R.dropLast(3, 'ramda');               //=> 'ra'
 */

var dropLast =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable([], _xdropLast, _dropLast));

export default dropLast;import _curry2 from "./internal/_curry2.js";
import _dispatchable from "./internal/_dispatchable.js";
import _dropLastWhile from "./internal/_dropLastWhile.js";
import _xdropLastWhile from "./internal/_xdropLastWhile.js";
/**
 * Returns a new list excluding all the tailing elements of a given list which
 * satisfy the supplied predicate function. It passes each value from the right
 * to the supplied predicate function, skipping elements until the predicate
 * function returns a `falsy` value. The predicate function is applied to one argument:
 * *(value)*.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> [a]
 * @sig (a -> Boolean) -> String -> String
 * @param {Function} predicate The function to be called on each element
 * @param {Array} xs The collection to iterate over.
 * @return {Array} A new array without any trailing elements that return `falsy` values from the `predicate`.
 * @see R.takeLastWhile, R.addIndex, R.drop, R.dropWhile
 * @example
 *
 *      const lteThree = x => x <= 3;
 *
 *      R.dropLastWhile(lteThree, [1, 2, 3, 4, 3, 2, 1]); //=> [1, 2, 3, 4]
 *
 *      R.dropLastWhile(x => x !== 'd' , 'Ramda'); //=> 'Ramd'
 */

var dropLastWhile =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable([], _xdropLastWhile, _dropLastWhile));

export default dropLastWhile;import _curry1 from "./internal/_curry1.js";
import _dispatchable from "./internal/_dispatchable.js";
import _xdropRepeatsWith from "./internal/_xdropRepeatsWith.js";
import dropRepeatsWith from "./dropRepeatsWith.js";
import equals from "./equals.js";
/**
 * Returns a new list without any consecutively repeating elements.
 * [`R.equals`](#equals) is used to determine equality.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category List
 * @sig [a] -> [a]
 * @param {Array} list The array to consider.
 * @return {Array} `list` without repeating elements.
 * @see R.transduce
 * @example
 *
 *     R.dropRepeats([1, 1, 1, 2, 3, 4, 4, 2, 2]); //=> [1, 2, 3, 4, 2]
 */

var dropRepeats =
/*#__PURE__*/
_curry1(
/*#__PURE__*/
_dispatchable([],
/*#__PURE__*/
_xdropRepeatsWith(equals),
/*#__PURE__*/
dropRepeatsWith(equals)));

export default dropRepeats;import _curry2 from "./internal/_curry2.js";
import _dispatchable from "./internal/_dispatchable.js";
import _xdropRepeatsWith from "./internal/_xdropRepeatsWith.js";
import last from "./last.js";
/**
 * Returns a new list without any consecutively repeating elements. Equality is
 * determined by applying the supplied predicate to each pair of consecutive elements. The
 * first element in a series of equal elements will be preserved.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category List
 * @sig ((a, a) -> Boolean) -> [a] -> [a]
 * @param {Function} pred A predicate used to test whether two items are equal.
 * @param {Array} list The array to consider.
 * @return {Array} `list` without repeating elements.
 * @see R.transduce
 * @example
 *
 *      const l = [1, -1, 1, 3, 4, -4, -4, -5, 5, 3, 3];
 *      R.dropRepeatsWith(R.eqBy(Math.abs), l); //=> [1, 3, 4, -5, 3]
 */

var dropRepeatsWith =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable([], _xdropRepeatsWith, function dropRepeatsWith(pred, list) {
  var result = [];
  var idx = 1;
  var len = list.length;

  if (len !== 0) {
    result[0] = list[0];

    while (idx < len) {
      if (!pred(last(result), list[idx])) {
        result[result.length] = list[idx];
      }

      idx += 1;
    }
  }

  return result;
}));

export default dropRepeatsWith;import _curry2 from "./internal/_curry2.js";
import _dispatchable from "./internal/_dispatchable.js";
import _xdropWhile from "./internal/_xdropWhile.js";
import slice from "./slice.js";
/**
 * Returns a new list excluding the leading elements of a given list which
 * satisfy the supplied predicate function. It passes each value to the supplied
 * predicate function, skipping elements while the predicate function returns
 * `true`. The predicate function is applied to one argument: *(value)*.
 *
 * Dispatches to the `dropWhile` method of the second argument, if present.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> [a]
 * @sig (a -> Boolean) -> String -> String
 * @param {Function} fn The function called per iteration.
 * @param {Array} xs The collection to iterate over.
 * @return {Array} A new array.
 * @see R.takeWhile, R.transduce, R.addIndex
 * @example
 *
 *      const lteTwo = x => x <= 2;
 *
 *      R.dropWhile(lteTwo, [1, 2, 3, 4, 3, 2, 1]); //=> [3, 4, 3, 2, 1]
 *
 *      R.dropWhile(x => x !== 'd' , 'Ramda'); //=> 'da'
 */

var dropWhile =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable(['dropWhile'], _xdropWhile, function dropWhile(pred, xs) {
  var idx = 0;
  var len = xs.length;

  while (idx < len && pred(xs[idx])) {
    idx += 1;
  }

  return slice(idx, Infinity, xs);
}));

export default dropWhile;import _curry2 from "./internal/_curry2.js";
import _isFunction from "./internal/_isFunction.js";
import lift from "./lift.js";
import or from "./or.js";
/**
 * A function wrapping calls to the two functions in an `||` operation,
 * returning the result of the first function if it is truth-y and the result
 * of the second function otherwise. Note that this is short-circuited,
 * meaning that the second function will not be invoked if the first returns a
 * truth-y value.
 *
 * In addition to functions, `R.either` also accepts any fantasy-land compatible
 * applicative functor.
 *
 * @func
 * @memberOf R
 * @since v0.12.0
 * @category Logic
 * @sig (*... -> Boolean) -> (*... -> Boolean) -> (*... -> Boolean)
 * @param {Function} f a predicate
 * @param {Function} g another predicate
 * @return {Function} a function that applies its arguments to `f` and `g` and `||`s their outputs together.
 * @see R.both, R.or
 * @example
 *
 *      const gt10 = x => x > 10;
 *      const even = x => x % 2 === 0;
 *      const f = R.either(gt10, even);
 *      f(101); //=> true
 *      f(8); //=> true
 *
 *      R.either(Maybe.Just(false), Maybe.Just(55)); // => Maybe.Just(55)
 *      R.either([false, false, 'a'], [11]) // => [11, 11, "a"]
 */

var either =
/*#__PURE__*/
_curry2(function either(f, g) {
  return _isFunction(f) ? function _either() {
    return f.apply(this, arguments) || g.apply(this, arguments);
  } : lift(or)(f, g);
});

export default either;import _curry1 from "./internal/_curry1.js";
import _isArguments from "./internal/_isArguments.js";
import _isArray from "./internal/_isArray.js";
import _isObject from "./internal/_isObject.js";
import _isString from "./internal/_isString.js";
import _isTypedArray from "./internal/_isTypedArray.js";
/**
 * Returns the empty value of its argument's type. Ramda defines the empty
 * value of Array (`[]`), Object (`{}`), String (`''`),
 * TypedArray (`Uint8Array []`, `Float32Array []`, etc), and Arguments. Other
 * types are supported if they define `<Type>.empty`,
 * `<Type>.prototype.empty` or implement the
 * [FantasyLand Monoid spec](https://github.com/fantasyland/fantasy-land#monoid).
 *
 * Dispatches to the `empty` method of the first argument, if present.
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category Function
 * @sig a -> a
 * @param {*} x
 * @return {*}
 * @example
 *
 *      R.empty(Just(42));               //=> Nothing()
 *      R.empty([1, 2, 3]);              //=> []
 *      R.empty('unicorns');             //=> ''
 *      R.empty({x: 1, y: 2});           //=> {}
 *      R.empty(Uint8Array.from('123')); //=> Uint8Array []
 */

var empty =
/*#__PURE__*/
_curry1(function empty(x) {
  return x != null && typeof x['fantasy-land/empty'] === 'function' ? x['fantasy-land/empty']() : x != null && x.constructor != null && typeof x.constructor['fantasy-land/empty'] === 'function' ? x.constructor['fantasy-land/empty']() : x != null && typeof x.empty === 'function' ? x.empty() : x != null && x.constructor != null && typeof x.constructor.empty === 'function' ? x.constructor.empty() : _isArray(x) ? [] : _isString(x) ? '' : _isObject(x) ? {} : _isArguments(x) ? function () {
    return arguments;
  }() : _isTypedArray(x) ? x.constructor.from('') : void 0 // else
  ;
});

export default empty;import _curry2 from "./internal/_curry2.js";
import equals from "./equals.js";
import takeLast from "./takeLast.js";
/**
 * Checks if a list ends with the provided sublist.
 *
 * Similarly, checks if a string ends with the provided substring.
 *
 * @func
 * @memberOf R
 * @since v0.24.0
 * @category List
 * @sig [a] -> [a] -> Boolean
 * @sig String -> String -> Boolean
 * @param {*} suffix
 * @param {*} list
 * @return {Boolean}
 * @see R.startsWith
 * @example
 *
 *      R.endsWith('c', 'abc')                //=> true
 *      R.endsWith('b', 'abc')                //=> false
 *      R.endsWith(['c'], ['a', 'b', 'c'])    //=> true
 *      R.endsWith(['b'], ['a', 'b', 'c'])    //=> false
 */

var endsWith =
/*#__PURE__*/
_curry2(function (suffix, list) {
  return equals(takeLast(suffix.length, list), suffix);
});

export default endsWith;import _curry3 from "./internal/_curry3.js";
import equals from "./equals.js";
/**
 * Takes a function and two values in its domain and returns `true` if the
 * values map to the same value in the codomain; `false` otherwise.
 *
 * @func
 * @memberOf R
 * @since v0.18.0
 * @category Relation
 * @sig (a -> b) -> a -> a -> Boolean
 * @param {Function} f
 * @param {*} x
 * @param {*} y
 * @return {Boolean}
 * @example
 *
 *      R.eqBy(Math.abs, 5, -5); //=> true
 */

var eqBy =
/*#__PURE__*/
_curry3(function eqBy(f, x, y) {
  return equals(f(x), f(y));
});

export default eqBy;import _curry3 from "./internal/_curry3.js";
import equals from "./equals.js";
/**
 * Reports whether two objects have the same value, in [`R.equals`](#equals)
 * terms, for the specified property. Useful as a curried predicate.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @sig k -> {k: v} -> {k: v} -> Boolean
 * @param {String} prop The name of the property to compare
 * @param {Object} obj1
 * @param {Object} obj2
 * @return {Boolean}
 *
 * @example
 *
 *      const o1 = { a: 1, b: 2, c: 3, d: 4 };
 *      const o2 = { a: 10, b: 20, c: 3, d: 40 };
 *      R.eqProps('a', o1, o2); //=> false
 *      R.eqProps('c', o1, o2); //=> true
 */

var eqProps =
/*#__PURE__*/
_curry3(function eqProps(prop, obj1, obj2) {
  return equals(obj1[prop], obj2[prop]);
});

export default eqProps;import _curry2 from "./internal/_curry2.js";
import _equals from "./internal/_equals.js";
/**
 * Returns `true` if its arguments are equivalent, `false` otherwise. Handles
 * cyclical data structures.
 *
 * Dispatches symmetrically to the `equals` methods of both arguments, if
 * present.
 *
 * @func
 * @memberOf R
 * @since v0.15.0
 * @category Relation
 * @sig a -> b -> Boolean
 * @param {*} a
 * @param {*} b
 * @return {Boolean}
 * @example
 *
 *      R.equals(1, 1); //=> true
 *      R.equals(1, '1'); //=> false
 *      R.equals([1, 2, 3], [1, 2, 3]); //=> true
 *
 *      const a = {}; a.v = a;
 *      const b = {}; b.v = b;
 *      R.equals(a, b); //=> true
 */

var equals =
/*#__PURE__*/
_curry2(function equals(a, b) {
  return _equals(a, b, [], []);
});

export default equals;import _curry2 from "./internal/_curry2.js";
import _isArray from "./internal/_isArray.js";
import _isObject from "./internal/_isObject.js";
/**
 * Creates a new object by recursively evolving a shallow copy of `object`,
 * according to the `transformation` functions. All non-primitive properties
 * are copied by reference.
 *
 * A `transformation` function will not be invoked if its corresponding key
 * does not exist in the evolved object.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Object
 * @sig {k: (v -> v)} -> {k: v} -> {k: v}
 * @param {Object} transformations The object specifying transformation functions to apply
 *        to the object.
 * @param {Object} object The object to be transformed.
 * @return {Object} The transformed object.
 * @example
 *
 *      const tomato = {firstName: '  Tomato ', data: {elapsed: 100, remaining: 1400}, id:123};
 *      const transformations = {
 *        firstName: R.trim,
 *        lastName: R.trim, // Will not get invoked.
 *        data: {elapsed: R.add(1), remaining: R.add(-1)}
 *      };
 *      R.evolve(transformations, tomato); //=> {firstName: 'Tomato', data: {elapsed: 101, remaining: 1399}, id:123}
 */

var evolve =
/*#__PURE__*/
_curry2(function evolve(transformations, object) {
  if (!_isObject(object) && !_isArray(object)) {
    return object;
  }

  var result = object instanceof Array ? [] : {};
  var transformation, key, type;

  for (key in object) {
    transformation = transformations[key];
    type = typeof transformation;
    result[key] = type === 'function' ? transformation(object[key]) : transformation && type === 'object' ? evolve(transformation, object[key]) : object[key];
  }

  return result;
});

export default evolve;import _curry2 from "./internal/_curry2.js";
import _dispatchable from "./internal/_dispatchable.js";
import _filter from "./internal/_filter.js";
import _isObject from "./internal/_isObject.js";
import _reduce from "./internal/_reduce.js";
import _xfilter from "./internal/_xfilter.js";
import keys from "./keys.js";
/**
 * Takes a predicate and a `Filterable`, and returns a new filterable of the
 * same type containing the members of the given filterable which satisfy the
 * given predicate. Filterable objects include plain objects or any object
 * that has a filter method such as `Array`.
 *
 * Dispatches to the `filter` method of the second argument, if present.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig Filterable f => (a -> Boolean) -> f a -> f a
 * @param {Function} pred
 * @param {Array} filterable
 * @return {Array} Filterable
 * @see R.reject, R.transduce, R.addIndex
 * @example
 *
 *      const isEven = n => n % 2 === 0;
 *
 *      R.filter(isEven, [1, 2, 3, 4]); //=> [2, 4]
 *
 *      R.filter(isEven, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4}
 */

var filter =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable(['fantasy-land/filter', 'filter'], _xfilter, function (pred, filterable) {
  return _isObject(filterable) ? _reduce(function (acc, key) {
    if (pred(filterable[key])) {
      acc[key] = filterable[key];
    }

    return acc;
  }, {}, keys(filterable)) : // else
  _filter(pred, filterable);
}));

export default filter;import _curry2 from "./internal/_curry2.js";
import _dispatchable from "./internal/_dispatchable.js";
import _xfind from "./internal/_xfind.js";
/**
 * Returns the first element of the list which matches the predicate, or
 * `undefined` if no element matches.
 *
 * Dispatches to the `find` method of the second argument, if present.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> a | undefined
 * @param {Function} fn The predicate function used to determine if the element is the
 *        desired one.
 * @param {Array} list The array to consider.
 * @return {Object} The element found, or `undefined`.
 * @see R.transduce
 * @example
 *
 *      const xs = [{a: 1}, {a: 2}, {a: 3}];
 *      R.find(R.propEq('a', 2))(xs); //=> {a: 2}
 *      R.find(R.propEq('a', 4))(xs); //=> undefined
 */

var find =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable(['find'], _xfind, function find(fn, list) {
  var idx = 0;
  var len = list.length;

  while (idx < len) {
    if (fn(list[idx])) {
      return list[idx];
    }

    idx += 1;
  }
}));

export default find;import _curry2 from "./internal/_curry2.js";
import _dispatchable from "./internal/_dispatchable.js";
import _xfindIndex from "./internal/_xfindIndex.js";
/**
 * Returns the index of the first element of the list which matches the
 * predicate, or `-1` if no element matches.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.1
 * @category List
 * @sig (a -> Boolean) -> [a] -> Number
 * @param {Function} fn The predicate function used to determine if the element is the
 * desired one.
 * @param {Array} list The array to consider.
 * @return {Number} The index of the element found, or `-1`.
 * @see R.transduce, R.indexOf
 * @example
 *
 *      const xs = [{a: 1}, {a: 2}, {a: 3}];
 *      R.findIndex(R.propEq('a', 2))(xs); //=> 1
 *      R.findIndex(R.propEq('a', 4))(xs); //=> -1
 */

var findIndex =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable([], _xfindIndex, function findIndex(fn, list) {
  var idx = 0;
  var len = list.length;

  while (idx < len) {
    if (fn(list[idx])) {
      return idx;
    }

    idx += 1;
  }

  return -1;
}));

export default findIndex;import _curry2 from "./internal/_curry2.js";
import _dispatchable from "./internal/_dispatchable.js";
import _xfindLast from "./internal/_xfindLast.js";
/**
 * Returns the last element of the list which matches the predicate, or
 * `undefined` if no element matches.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.1
 * @category List
 * @sig (a -> Boolean) -> [a] -> a | undefined
 * @param {Function} fn The predicate function used to determine if the element is the
 * desired one.
 * @param {Array} list The array to consider.
 * @return {Object} The element found, or `undefined`.
 * @see R.transduce
 * @example
 *
 *      const xs = [{a: 1, b: 0}, {a:1, b: 1}];
 *      R.findLast(R.propEq('a', 1))(xs); //=> {a: 1, b: 1}
 *      R.findLast(R.propEq('a', 4))(xs); //=> undefined
 */

var findLast =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable([], _xfindLast, function findLast(fn, list) {
  var idx = list.length - 1;

  while (idx >= 0) {
    if (fn(list[idx])) {
      return list[idx];
    }

    idx -= 1;
  }
}));

export default findLast;import _curry2 from "./internal/_curry2.js";
import _dispatchable from "./internal/_dispatchable.js";
import _xfindLastIndex from "./internal/_xfindLastIndex.js";
/**
 * Returns the index of the last element of the list which matches the
 * predicate, or `-1` if no element matches.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.1
 * @category List
 * @sig (a -> Boolean) -> [a] -> Number
 * @param {Function} fn The predicate function used to determine if the element is the
 * desired one.
 * @param {Array} list The array to consider.
 * @return {Number} The index of the element found, or `-1`.
 * @see R.transduce, R.lastIndexOf
 * @example
 *
 *      const xs = [{a: 1, b: 0}, {a:1, b: 1}];
 *      R.findLastIndex(R.propEq('a', 1))(xs); //=> 1
 *      R.findLastIndex(R.propEq('a', 4))(xs); //=> -1
 */

var findLastIndex =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable([], _xfindLastIndex, function findLastIndex(fn, list) {
  var idx = list.length - 1;

  while (idx >= 0) {
    if (fn(list[idx])) {
      return idx;
    }

    idx -= 1;
  }

  return -1;
}));

export default findLastIndex;import _curry1 from "./internal/_curry1.js";
import _makeFlat from "./internal/_makeFlat.js";
/**
 * Returns a new list by pulling every item out of it (and all its sub-arrays)
 * and putting them in a new array, depth-first.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig [a] -> [b]
 * @param {Array} list The array to consider.
 * @return {Array} The flattened list.
 * @see R.unnest
 * @example
 *
 *      R.flatten([1, 2, [3, 4], 5, [6, [7, 8, [9, [10, 11], 12]]]]);
 *      //=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
 */

var flatten =
/*#__PURE__*/
_curry1(
/*#__PURE__*/
_makeFlat(true));

export default flatten;import _curry1 from "./internal/_curry1.js";
import curryN from "./curryN.js";
/**
 * Returns a new function much like the supplied one, except that the first two
 * arguments' order is reversed.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig ((a, b, c, ...) -> z) -> (b -> a -> c -> ... -> z)
 * @param {Function} fn The function to invoke with its first two parameters reversed.
 * @return {*} The result of invoking `fn` with its first two parameters' order reversed.
 * @example
 *
 *      const mergeThree = (a, b, c) => [].concat(a, b, c);
 *
 *      mergeThree(1, 2, 3); //=> [1, 2, 3]
 *
 *      R.flip(mergeThree)(1, 2, 3); //=> [2, 1, 3]
 * @symb R.flip(f)(a, b, c) = f(b, a, c)
 */

var flip =
/*#__PURE__*/
_curry1(function flip(fn) {
  return curryN(fn.length, function (a, b) {
    var args = Array.prototype.slice.call(arguments, 0);
    args[0] = b;
    args[1] = a;
    return fn.apply(this, args);
  });
});

export default flip;import _checkForMethod from "./internal/_checkForMethod.js";
import _curry2 from "./internal/_curry2.js";
/**
 * Iterate over an input `list`, calling a provided function `fn` for each
 * element in the list.
 *
 * `fn` receives one argument: *(value)*.
 *
 * Note: `R.forEach` does not skip deleted or unassigned indices (sparse
 * arrays), unlike the native `Array.prototype.forEach` method. For more
 * details on this behavior, see:
 * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Description
 *
 * Also note that, unlike `Array.prototype.forEach`, Ramda's `forEach` returns
 * the original array. In some libraries this function is named `each`.
 *
 * Dispatches to the `forEach` method of the second argument, if present.
 *
 * @func
 * @memberOf R
 * @since v0.1.1
 * @category List
 * @sig (a -> *) -> [a] -> [a]
 * @param {Function} fn The function to invoke. Receives one argument, `value`.
 * @param {Array} list The list to iterate over.
 * @return {Array} The original list.
 * @see R.addIndex
 * @example
 *
 *      const printXPlusFive = x => console.log(x + 5);
 *      R.forEach(printXPlusFive, [1, 2, 3]); //=> [1, 2, 3]
 *      // logs 6
 *      // logs 7
 *      // logs 8
 * @symb R.forEach(f, [a, b, c]) = [a, b, c]
 */

var forEach =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_checkForMethod('forEach', function forEach(fn, list) {
  var len = list.length;
  var idx = 0;

  while (idx < len) {
    fn(list[idx]);
    idx += 1;
  }

  return list;
}));

export default forEach;import _curry2 from "./internal/_curry2.js";
import keys from "./keys.js";
/**
 * Iterate over an input `object`, calling a provided function `fn` for each
 * key and value in the object.
 *
 * `fn` receives three argument: *(value, key, obj)*.
 *
 * @func
 * @memberOf R
 * @since v0.23.0
 * @category Object
 * @sig ((a, String, StrMap a) -> Any) -> StrMap a -> StrMap a
 * @param {Function} fn The function to invoke. Receives three argument, `value`, `key`, `obj`.
 * @param {Object} obj The object to iterate over.
 * @return {Object} The original object.
 * @example
 *
 *      const printKeyConcatValue = (value, key) => console.log(key + ':' + value);
 *      R.forEachObjIndexed(printKeyConcatValue, {x: 1, y: 2}); //=> {x: 1, y: 2}
 *      // logs x:1
 *      // logs y:2
 * @symb R.forEachObjIndexed(f, {x: a, y: b}) = {x: a, y: b}
 */

var forEachObjIndexed =
/*#__PURE__*/
_curry2(function forEachObjIndexed(fn, obj) {
  var keyList = keys(obj);
  var idx = 0;

  while (idx < keyList.length) {
    var key = keyList[idx];
    fn(obj[key], key, obj);
    idx += 1;
  }

  return obj;
});

export default forEachObjIndexed;import _curry1 from "./internal/_curry1.js";
/**
 * Creates a new object from a list key-value pairs. If a key appears in
 * multiple pairs, the rightmost pair is included in the object.
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category List
 * @sig [[k,v]] -> {k: v}
 * @param {Array} pairs An array of two-element arrays that will be the keys and values of the output object.
 * @return {Object} The object made by pairing up `keys` and `values`.
 * @see R.toPairs, R.pair
 * @example
 *
 *      R.fromPairs([['a', 1], ['b', 2], ['c', 3]]); //=> {a: 1, b: 2, c: 3}
 */

var fromPairs =
/*#__PURE__*/
_curry1(function fromPairs(pairs) {
  var result = {};
  var idx = 0;

  while (idx < pairs.length) {
    result[pairs[idx][0]] = pairs[idx][1];
    idx += 1;
  }

  return result;
});

export default fromPairs;import _checkForMethod from "./internal/_checkForMethod.js";
import _curry2 from "./internal/_curry2.js";
import reduceBy from "./reduceBy.js";
/**
 * Splits a list into sub-lists stored in an object, based on the result of
 * calling a key-returning function on each element, and grouping the
 * results according to values returned.
 *
 * Dispatches to the `groupBy` method of the second argument, if present.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @typedefn Idx = String | Int | Symbol
 * @sig Idx a => (b -> a) -> [b] -> {a: [b]}
 * @param {Function} fn Function :: a -> Idx
 * @param {Array} list The array to group
 * @return {Object} An object with the output of `fn` for keys, mapped to arrays of elements
 *         that produced that key when passed to `fn`.
 * @see R.reduceBy, R.transduce, R.indexBy
 * @example
 *
 *      const byGrade = R.groupBy(function(student) {
 *        const score = student.score;
 *        return score < 65 ? 'F' :
 *               score < 70 ? 'D' :
 *               score < 80 ? 'C' :
 *               score < 90 ? 'B' : 'A';
 *      });
 *      const students = [{name: 'Abby', score: 84},
 *                      {name: 'Eddy', score: 58},
 *                      // ...
 *                      {name: 'Jack', score: 69}];
 *      byGrade(students);
 *      // {
 *      //   'A': [{name: 'Dianne', score: 99}],
 *      //   'B': [{name: 'Abby', score: 84}]
 *      //   // ...,
 *      //   'F': [{name: 'Eddy', score: 58}]
 *      // }
 */

var groupBy =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_checkForMethod('groupBy',
/*#__PURE__*/
reduceBy(function (acc, item) {
  acc.push(item);
  return acc;
}, [])));

export default groupBy;import _curry2 from "./internal/_curry2.js";
/**
 * Takes a list and returns a list of lists where each sublist's elements are
 * all satisfied pairwise comparison according to the provided function.
 * Only adjacent elements are passed to the comparison function.
 *
 * @func
 * @memberOf R
 * @since v0.21.0
 * @category List
 * @sig ((a, a) → Boolean) → [a] → [[a]]
 * @param {Function} fn Function for determining whether two given (adjacent)
 *        elements should be in the same group
 * @param {Array} list The array to group. Also accepts a string, which will be
 *        treated as a list of characters.
 * @return {List} A list that contains sublists of elements,
 *         whose concatenations are equal to the original list.
 * @example
 *
 * R.groupWith(R.equals, [0, 1, 1, 2, 3, 5, 8, 13, 21])
 * //=> [[0], [1, 1], [2], [3], [5], [8], [13], [21]]
 *
 * R.groupWith((a, b) => a + 1 === b, [0, 1, 1, 2, 3, 5, 8, 13, 21])
 * //=> [[0, 1], [1, 2, 3], [5], [8], [13], [21]]
 *
 * R.groupWith((a, b) => a % 2 === b % 2, [0, 1, 1, 2, 3, 5, 8, 13, 21])
 * //=> [[0], [1, 1], [2], [3, 5], [8], [13, 21]]
 *
 * const isVowel = R.test(/^[aeiou]$/i);
 * R.groupWith(R.eqBy(isVowel), 'aestiou')
 * //=> ['ae', 'st', 'iou']
 */

var groupWith =
/*#__PURE__*/
_curry2(function (fn, list) {
  var res = [];
  var idx = 0;
  var len = list.length;

  while (idx < len) {
    var nextidx = idx + 1;

    while (nextidx < len && fn(list[nextidx - 1], list[nextidx])) {
      nextidx += 1;
    }

    res.push(list.slice(idx, nextidx));
    idx = nextidx;
  }

  return res;
});

export default groupWith;import _curry2 from "./internal/_curry2.js";
/**
 * Returns `true` if the first argument is greater than the second; `false`
 * otherwise.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig Ord a => a -> a -> Boolean
 * @param {*} a
 * @param {*} b
 * @return {Boolean}
 * @see R.lt
 * @example
 *
 *      R.gt(2, 1); //=> true
 *      R.gt(2, 2); //=> false
 *      R.gt(2, 3); //=> false
 *      R.gt('a', 'z'); //=> false
 *      R.gt('z', 'a'); //=> true
 */

var gt =
/*#__PURE__*/
_curry2(function gt(a, b) {
  return a > b;
});

export default gt;import _curry2 from "./internal/_curry2.js";
/**
 * Returns `true` if the first argument is greater than or equal to the second;
 * `false` otherwise.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig Ord a => a -> a -> Boolean
 * @param {Number} a
 * @param {Number} b
 * @return {Boolean}
 * @see R.lte
 * @example
 *
 *      R.gte(2, 1); //=> true
 *      R.gte(2, 2); //=> true
 *      R.gte(2, 3); //=> false
 *      R.gte('a', 'z'); //=> false
 *      R.gte('z', 'a'); //=> true
 */

var gte =
/*#__PURE__*/
_curry2(function gte(a, b) {
  return a >= b;
});

export default gte;import _curry2 from "./internal/_curry2.js";
import hasPath from "./hasPath.js";
/**
 * Returns whether or not an object has an own property with the specified name
 *
 * @func
 * @memberOf R
 * @since v0.7.0
 * @category Object
 * @sig s -> {s: x} -> Boolean
 * @param {String} prop The name of the property to check for.
 * @param {Object} obj The object to query.
 * @return {Boolean} Whether the property exists.
 * @example
 *
 *      const hasName = R.has('name');
 *      hasName({name: 'alice'});   //=> true
 *      hasName({name: 'bob'});     //=> true
 *      hasName({});                //=> false
 *
 *      const point = {x: 0, y: 0};
 *      const pointHas = R.has(R.__, point);
 *      pointHas('x');  //=> true
 *      pointHas('y');  //=> true
 *      pointHas('z');  //=> false
 */

var has =
/*#__PURE__*/
_curry2(function has(prop, obj) {
  return hasPath([prop], obj);
});

export default has;import _curry2 from "./internal/_curry2.js";
import isNil from "./isNil.js";
/**
 * Returns whether or not an object or its prototype chain has a property with
 * the specified name
 *
 * @func
 * @memberOf R
 * @since v0.7.0
 * @category Object
 * @sig s -> {s: x} -> Boolean
 * @param {String} prop The name of the property to check for.
 * @param {Object} obj The object to query.
 * @return {Boolean} Whether the property exists.
 * @example
 *
 *      function Rectangle(width, height) {
 *        this.width = width;
 *        this.height = height;
 *      }
 *      Rectangle.prototype.area = function() {
 *        return this.width * this.height;
 *      };
 *
 *      const square = new Rectangle(2, 2);
 *      R.hasIn('width', square);  //=> true
 *      R.hasIn('area', square);  //=> true
 */

var hasIn =
/*#__PURE__*/
_curry2(function hasIn(prop, obj) {
  if (isNil(obj)) {
    return false;
  }

  return prop in obj;
});

export default hasIn;import _curry2 from "./internal/_curry2.js";
import _has from "./internal/_has.js";
import isNil from "./isNil.js";
/**
 * Returns whether or not a path exists in an object. Only the object's
 * own properties are checked.
 *
 * @func
 * @memberOf R
 * @since v0.26.0
 * @category Object
 * @typedefn Idx = String | Int | Symbol
 * @sig [Idx] -> {a} -> Boolean
 * @param {Array} path The path to use.
 * @param {Object} obj The object to check the path in.
 * @return {Boolean} Whether the path exists.
 * @see R.has
 * @example
 *
 *      R.hasPath(['a', 'b'], {a: {b: 2}});         // => true
 *      R.hasPath(['a', 'b'], {a: {b: undefined}}); // => true
 *      R.hasPath(['a', 'b'], {a: {c: 2}});         // => false
 *      R.hasPath(['a', 'b'], {});                  // => false
 */

var hasPath =
/*#__PURE__*/
_curry2(function hasPath(_path, obj) {
  if (_path.length === 0 || isNil(obj)) {
    return false;
  }

  var val = obj;
  var idx = 0;

  while (idx < _path.length) {
    if (!isNil(val) && _has(_path[idx], val)) {
      val = val[_path[idx]];
      idx += 1;
    } else {
      return false;
    }
  }

  return true;
});

export default hasPath;import nth from "./nth.js";
/**
 * Returns the first element of the given list or string. In some libraries
 * this function is named `first`.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig [a] -> a | Undefined
 * @sig String -> String
 * @param {Array|String} list
 * @return {*}
 * @see R.tail, R.init, R.last
 * @example
 *
 *      R.head(['fi', 'fo', 'fum']); //=> 'fi'
 *      R.head([]); //=> undefined
 *
 *      R.head('abc'); //=> 'a'
 *      R.head(''); //=> ''
 */

var head =
/*#__PURE__*/
nth(0);
export default head;import _objectIs from "./internal/_objectIs.js";
import _curry2 from "./internal/_curry2.js";
/**
 * Returns true if its arguments are identical, false otherwise. Values are
 * identical if they reference the same memory. `NaN` is identical to `NaN`;
 * `0` and `-0` are not identical.
 *
 * Note this is merely a curried version of ES6 `Object.is`.
 *
 * @func
 * @memberOf R
 * @since v0.15.0
 * @category Relation
 * @sig a -> a -> Boolean
 * @param {*} a
 * @param {*} b
 * @return {Boolean}
 * @example
 *
 *      const o = {};
 *      R.identical(o, o); //=> true
 *      R.identical(1, 1); //=> true
 *      R.identical(1, '1'); //=> false
 *      R.identical([], []); //=> false
 *      R.identical(0, -0); //=> false
 *      R.identical(NaN, NaN); //=> true
 */

var identical =
/*#__PURE__*/
_curry2(_objectIs);

export default identical;import _curry1 from "./internal/_curry1.js";
import _identity from "./internal/_identity.js";
/**
 * A function that does nothing but return the parameter supplied to it. Good
 * as a default or placeholder function.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig a -> a
 * @param {*} x The value to return.
 * @return {*} The input value, `x`.
 * @example
 *
 *      R.identity(1); //=> 1
 *
 *      const obj = {};
 *      R.identity(obj) === obj; //=> true
 * @symb R.identity(a) = a
 */

var identity =
/*#__PURE__*/
_curry1(_identity);

export default identity;import _curry3 from "./internal/_curry3.js";
import curryN from "./curryN.js";
/**
 * Creates a function that will process either the `onTrue` or the `onFalse`
 * function depending upon the result of the `condition` predicate.
 *
 * @func
 * @memberOf R
 * @since v0.8.0
 * @category Logic
 * @sig (*... -> Boolean) -> (*... -> *) -> (*... -> *) -> (*... -> *)
 * @param {Function} condition A predicate function
 * @param {Function} onTrue A function to invoke when the `condition` evaluates to a truthy value.
 * @param {Function} onFalse A function to invoke when the `condition` evaluates to a falsy value.
 * @return {Function} A new function that will process either the `onTrue` or the `onFalse`
 *                    function depending upon the result of the `condition` predicate.
 * @see R.unless, R.when, R.cond
 * @example
 *
 *      const incCount = R.ifElse(
 *        R.has('count'),
 *        R.over(R.lensProp('count'), R.inc),
 *        R.assoc('count', 1)
 *      );
 *      incCount({ count: 1 }); //=> { count: 2 }
 *      incCount({});           //=> { count: 1 }
 */

var ifElse =
/*#__PURE__*/
_curry3(function ifElse(condition, onTrue, onFalse) {
  return curryN(Math.max(condition.length, onTrue.length, onFalse.length), function _ifElse() {
    return condition.apply(this, arguments) ? onTrue.apply(this, arguments) : onFalse.apply(this, arguments);
  });
});

export default ifElse;import add from "./add.js";
/**
 * Increments its argument.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Math
 * @sig Number -> Number
 * @param {Number} n
 * @return {Number} n + 1
 * @see R.dec
 * @example
 *
 *      R.inc(42); //=> 43
 */

var inc =
/*#__PURE__*/
add(1);
export default inc;import _includes from "./internal/_includes.js";
import _curry2 from "./internal/_curry2.js";
/**
 * Returns `true` if the specified value is equal, in [`R.equals`](#equals)
 * terms, to at least one element of the given list; `false` otherwise.
 * Also works with strings.
 *
 * @func
 * @memberOf R
 * @since v0.26.0
 * @category List
 * @sig a -> [a] -> Boolean
 * @param {Object} a The item to compare against.
 * @param {Array} list The array to consider.
 * @return {Boolean} `true` if an equivalent item is in the list, `false` otherwise.
 * @see R.any
 * @example
 *
 *      R.includes(3, [1, 2, 3]); //=> true
 *      R.includes(4, [1, 2, 3]); //=> false
 *      R.includes({ name: 'Fred' }, [{ name: 'Fred' }]); //=> true
 *      R.includes([42], [[42]]); //=> true
 *      R.includes('ba', 'banana'); //=>true
 */

var includes =
/*#__PURE__*/
_curry2(_includes);

export default includes;export { default as F } from "./F.js";
export { default as T } from "./T.js";
export { default as __ } from "./__.js";
export { default as add } from "./add.js";
export { default as addIndex } from "./addIndex.js";
export { default as adjust } from "./adjust.js";
export { default as all } from "./all.js";
export { default as allPass } from "./allPass.js";
export { default as always } from "./always.js";
export { default as and } from "./and.js";
export { default as any } from "./any.js";
export { default as anyPass } from "./anyPass.js";
export { default as ap } from "./ap.js";
export { default as aperture } from "./aperture.js";
export { default as append } from "./append.js";
export { default as apply } from "./apply.js";
export { default as applySpec } from "./applySpec.js";
export { default as applyTo } from "./applyTo.js";
export { default as ascend } from "./ascend.js";
export { default as assoc } from "./assoc.js";
export { default as assocPath } from "./assocPath.js";
export { default as binary } from "./binary.js";
export { default as bind } from "./bind.js";
export { default as both } from "./both.js";
export { default as call } from "./call.js";
export { default as chain } from "./chain.js";
export { default as clamp } from "./clamp.js";
export { default as clone } from "./clone.js";
export { default as collectBy } from "./collectBy.js";
export { default as comparator } from "./comparator.js";
export { default as complement } from "./complement.js";
export { default as compose } from "./compose.js";
export { default as composeWith } from "./composeWith.js";
export { default as concat } from "./concat.js";
export { default as cond } from "./cond.js";
export { default as construct } from "./construct.js";
export { default as constructN } from "./constructN.js";
export { default as converge } from "./converge.js";
export { default as count } from "./count.js";
export { default as countBy } from "./countBy.js";
export { default as curry } from "./curry.js";
export { default as curryN } from "./curryN.js";
export { default as dec } from "./dec.js";
export { default as defaultTo } from "./defaultTo.js";
export { default as descend } from "./descend.js";
export { default as difference } from "./difference.js";
export { default as differenceWith } from "./differenceWith.js";
export { default as dissoc } from "./dissoc.js";
export { default as dissocPath } from "./dissocPath.js";
export { default as divide } from "./divide.js";
export { default as drop } from "./drop.js";
export { default as dropLast } from "./dropLast.js";
export { default as dropLastWhile } from "./dropLastWhile.js";
export { default as dropRepeats } from "./dropRepeats.js";
export { default as dropRepeatsWith } from "./dropRepeatsWith.js";
export { default as dropWhile } from "./dropWhile.js";
export { default as either } from "./either.js";
export { default as empty } from "./empty.js";
export { default as endsWith } from "./endsWith.js";
export { default as eqBy } from "./eqBy.js";
export { default as eqProps } from "./eqProps.js";
export { default as equals } from "./equals.js";
export { default as evolve } from "./evolve.js";
export { default as filter } from "./filter.js";
export { default as find } from "./find.js";
export { default as findIndex } from "./findIndex.js";
export { default as findLast } from "./findLast.js";
export { default as findLastIndex } from "./findLastIndex.js";
export { default as flatten } from "./flatten.js";
export { default as flip } from "./flip.js";
export { default as forEach } from "./forEach.js";
export { default as forEachObjIndexed } from "./forEachObjIndexed.js";
export { default as fromPairs } from "./fromPairs.js";
export { default as groupBy } from "./groupBy.js";
export { default as groupWith } from "./groupWith.js";
export { default as gt } from "./gt.js";
export { default as gte } from "./gte.js";
export { default as has } from "./has.js";
export { default as hasIn } from "./hasIn.js";
export { default as hasPath } from "./hasPath.js";
export { default as head } from "./head.js";
export { default as identical } from "./identical.js";
export { default as identity } from "./identity.js";
export { default as ifElse } from "./ifElse.js";
export { default as inc } from "./inc.js";
export { default as includes } from "./includes.js";
export { default as indexBy } from "./indexBy.js";
export { default as indexOf } from "./indexOf.js";
export { default as init } from "./init.js";
export { default as innerJoin } from "./innerJoin.js";
export { default as insert } from "./insert.js";
export { default as insertAll } from "./insertAll.js";
export { default as intersection } from "./intersection.js";
export { default as intersperse } from "./intersperse.js";
export { default as into } from "./into.js";
export { default as invert } from "./invert.js";
export { default as invertObj } from "./invertObj.js";
export { default as invoker } from "./invoker.js";
export { default as is } from "./is.js";
export { default as isEmpty } from "./isEmpty.js";
export { default as isNil } from "./isNil.js";
export { default as join } from "./join.js";
export { default as juxt } from "./juxt.js";
export { default as keys } from "./keys.js";
export { default as keysIn } from "./keysIn.js";
export { default as last } from "./last.js";
export { default as lastIndexOf } from "./lastIndexOf.js";
export { default as length } from "./length.js";
export { default as lens } from "./lens.js";
export { default as lensIndex } from "./lensIndex.js";
export { default as lensPath } from "./lensPath.js";
export { default as lensProp } from "./lensProp.js";
export { default as lift } from "./lift.js";
export { default as liftN } from "./liftN.js";
export { default as lt } from "./lt.js";
export { default as lte } from "./lte.js";
export { default as map } from "./map.js";
export { default as mapAccum } from "./mapAccum.js";
export { default as mapAccumRight } from "./mapAccumRight.js";
export { default as mapObjIndexed } from "./mapObjIndexed.js";
export { default as match } from "./match.js";
export { default as mathMod } from "./mathMod.js";
export { default as max } from "./max.js";
export { default as maxBy } from "./maxBy.js";
export { default as mean } from "./mean.js";
export { default as median } from "./median.js";
export { default as memoizeWith } from "./memoizeWith.js";
export { default as mergeAll } from "./mergeAll.js";
export { default as mergeDeepLeft } from "./mergeDeepLeft.js";
export { default as mergeDeepRight } from "./mergeDeepRight.js";
export { default as mergeDeepWith } from "./mergeDeepWith.js";
export { default as mergeDeepWithKey } from "./mergeDeepWithKey.js";
export { default as mergeLeft } from "./mergeLeft.js";
export { default as mergeRight } from "./mergeRight.js";
export { default as mergeWith } from "./mergeWith.js";
export { default as mergeWithKey } from "./mergeWithKey.js";
export { default as min } from "./min.js";
export { default as minBy } from "./minBy.js";
export { default as modify } from "./modify.js";
export { default as modifyPath } from "./modifyPath.js";
export { default as modulo } from "./modulo.js";
export { default as move } from "./move.js";
export { default as multiply } from "./multiply.js";
export { default as nAry } from "./nAry.js";
export { default as partialObject } from "./partialObject.js";
export { default as negate } from "./negate.js";
export { default as none } from "./none.js";
export { default as not } from "./not.js";
export { default as nth } from "./nth.js";
export { default as nthArg } from "./nthArg.js";
export { default as o } from "./o.js";
export { default as objOf } from "./objOf.js";
export { default as of } from "./of.js";
export { default as omit } from "./omit.js";
export { default as on } from "./on.js";
export { default as once } from "./once.js";
export { default as or } from "./or.js";
export { default as otherwise } from "./otherwise.js";
export { default as over } from "./over.js";
export { default as pair } from "./pair.js";
export { default as partial } from "./partial.js";
export { default as partialRight } from "./partialRight.js";
export { default as partition } from "./partition.js";
export { default as path } from "./path.js";
export { default as paths } from "./paths.js";
export { default as pathEq } from "./pathEq.js";
export { default as pathOr } from "./pathOr.js";
export { default as pathSatisfies } from "./pathSatisfies.js";
export { default as pick } from "./pick.js";
export { default as pickAll } from "./pickAll.js";
export { default as pickBy } from "./pickBy.js";
export { default as pipe } from "./pipe.js";
export { default as pipeWith } from "./pipeWith.js";
export { default as pluck } from "./pluck.js";
export { default as prepend } from "./prepend.js";
export { default as product } from "./product.js";
export { default as project } from "./project.js";
export { default as promap } from "./promap.js";
export { default as prop } from "./prop.js";
export { default as propEq } from "./propEq.js";
export { default as propIs } from "./propIs.js";
export { default as propOr } from "./propOr.js";
export { default as propSatisfies } from "./propSatisfies.js";
export { default as props } from "./props.js";
export { default as range } from "./range.js";
export { default as reduce } from "./reduce.js";
export { default as reduceBy } from "./reduceBy.js";
export { default as reduceRight } from "./reduceRight.js";
export { default as reduceWhile } from "./reduceWhile.js";
export { default as reduced } from "./reduced.js";
export { default as reject } from "./reject.js";
export { default as remove } from "./remove.js";
export { default as repeat } from "./repeat.js";
export { default as replace } from "./replace.js";
export { default as reverse } from "./reverse.js";
export { default as scan } from "./scan.js";
export { default as sequence } from "./sequence.js";
export { default as set } from "./set.js";
export { default as slice } from "./slice.js";
export { default as sort } from "./sort.js";
export { default as sortBy } from "./sortBy.js";
export { default as sortWith } from "./sortWith.js";
export { default as split } from "./split.js";
export { default as splitAt } from "./splitAt.js";
export { default as splitEvery } from "./splitEvery.js";
export { default as splitWhen } from "./splitWhen.js";
export { default as splitWhenever } from "./splitWhenever.js";
export { default as startsWith } from "./startsWith.js";
export { default as subtract } from "./subtract.js";
export { default as sum } from "./sum.js";
export { default as symmetricDifference } from "./symmetricDifference.js";
export { default as symmetricDifferenceWith } from "./symmetricDifferenceWith.js";
export { default as tail } from "./tail.js";
export { default as take } from "./take.js";
export { default as takeLast } from "./takeLast.js";
export { default as takeLastWhile } from "./takeLastWhile.js";
export { default as takeWhile } from "./takeWhile.js";
export { default as tap } from "./tap.js";
export { default as test } from "./test.js";
export { default as andThen } from "./andThen.js";
export { default as times } from "./times.js";
export { default as toLower } from "./toLower.js";
export { default as toPairs } from "./toPairs.js";
export { default as toPairsIn } from "./toPairsIn.js";
export { default as toString } from "./toString.js";
export { default as toUpper } from "./toUpper.js";
export { default as transduce } from "./transduce.js";
export { default as transpose } from "./transpose.js";
export { default as traverse } from "./traverse.js";
export { default as trim } from "./trim.js";
export { default as tryCatch } from "./tryCatch.js";
export { default as type } from "./type.js";
export { default as unapply } from "./unapply.js";
export { default as unary } from "./unary.js";
export { default as uncurryN } from "./uncurryN.js";
export { default as unfold } from "./unfold.js";
export { default as union } from "./union.js";
export { default as unionWith } from "./unionWith.js";
export { default as uniq } from "./uniq.js";
export { default as uniqBy } from "./uniqBy.js";
export { default as uniqWith } from "./uniqWith.js";
export { default as unless } from "./unless.js";
export { default as unnest } from "./unnest.js";
export { default as until } from "./until.js";
export { default as unwind } from "./unwind.js";
export { default as update } from "./update.js";
export { default as useWith } from "./useWith.js";
export { default as values } from "./values.js";
export { default as valuesIn } from "./valuesIn.js";
export { default as view } from "./view.js";
export { default as when } from "./when.js";
export { default as where } from "./where.js";
export { default as whereAny } from "./whereAny.js";
export { default as whereEq } from "./whereEq.js";
export { default as without } from "./without.js";
export { default as xor } from "./xor.js";
export { default as xprod } from "./xprod.js";
export { default as zip } from "./zip.js";
export { default as zipObj } from "./zipObj.js";
export { default as zipWith } from "./zipWith.js";
export { default as thunkify } from "./thunkify.js";import reduceBy from "./reduceBy.js";
/**
 * Given a function that generates a key, turns a list of objects into an
 * object indexing the objects by the given key. Note that if multiple
 * objects generate the same value for the indexing key only the last value
 * will be included in the generated object.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category List
 * @typedefn Idx = String | Int | Symbol
 * @sig Idx a => (b -> a) -> [b] -> {a: b}
 * @param {Function} fn Function :: a -> Idx
 * @param {Array} array The array of objects to index
 * @return {Object} An object indexing each array element by the given property.
 * @see R.groupBy
 * @example
 *
 *      const list = [{id: 'xyz', title: 'A'}, {id: 'abc', title: 'B'}];
 *      R.indexBy(R.prop('id'), list);
 *      //=> {abc: {id: 'abc', title: 'B'}, xyz: {id: 'xyz', title: 'A'}}
 */

var indexBy =
/*#__PURE__*/
reduceBy(function (acc, elem) {
  return elem;
}, null);
export default indexBy;import _curry2 from "./internal/_curry2.js";
import _indexOf from "./internal/_indexOf.js";
import _isArray from "./internal/_isArray.js";
/**
 * Returns the position of the first occurrence of an item in an array, or -1
 * if the item is not included in the array. [`R.equals`](#equals) is used to
 * determine equality.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig a -> [a] -> Number
 * @param {*} target The item to find.
 * @param {Array} xs The array to search in.
 * @return {Number} the index of the target, or -1 if the target is not found.
 * @see R.lastIndexOf, R.findIndex
 * @example
 *
 *      R.indexOf(3, [1,2,3,4]); //=> 2
 *      R.indexOf(10, [1,2,3,4]); //=> -1
 */

var indexOf =
/*#__PURE__*/
_curry2(function indexOf(target, xs) {
  return typeof xs.indexOf === 'function' && !_isArray(xs) ? xs.indexOf(target) : _indexOf(xs, target, 0);
});

export default indexOf;import slice from "./slice.js";
/**
 * Returns all but the last element of the given list or string.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category List
 * @sig [a] -> [a]
 * @sig String -> String
 * @param {*} list
 * @return {*}
 * @see R.last, R.head, R.tail
 * @example
 *
 *      R.init([1, 2, 3]);  //=> [1, 2]
 *      R.init([1, 2]);     //=> [1]
 *      R.init([1]);        //=> []
 *      R.init([]);         //=> []
 *
 *      R.init('abc');  //=> 'ab'
 *      R.init('ab');   //=> 'a'
 *      R.init('a');    //=> ''
 *      R.init('');     //=> ''
 */

var init =
/*#__PURE__*/
slice(0, -1);
export default init;import _includesWith from "./internal/_includesWith.js";
import _curry3 from "./internal/_curry3.js";
import _filter from "./internal/_filter.js";
/**
 * Takes a predicate `pred`, a list `xs`, and a list `ys`, and returns a list
 * `xs'` comprising each of the elements of `xs` which is equal to one or more
 * elements of `ys` according to `pred`.
 *
 * `pred` must be a binary function expecting an element from each list.
 *
 * `xs`, `ys`, and `xs'` are treated as sets, semantically, so ordering should
 * not be significant, but since `xs'` is ordered the implementation guarantees
 * that its values are in the same order as they appear in `xs`. Duplicates are
 * not removed, so `xs'` may contain duplicates if `xs` contains duplicates.
 *
 * @func
 * @memberOf R
 * @since v0.24.0
 * @category Relation
 * @sig ((a, b) -> Boolean) -> [a] -> [b] -> [a]
 * @param {Function} pred
 * @param {Array} xs
 * @param {Array} ys
 * @return {Array}
 * @see R.intersection
 * @example
 *
 *      R.innerJoin(
 *        (record, id) => record.id === id,
 *        [{id: 824, name: 'Richie Furay'},
 *         {id: 956, name: 'Dewey Martin'},
 *         {id: 313, name: 'Bruce Palmer'},
 *         {id: 456, name: 'Stephen Stills'},
 *         {id: 177, name: 'Neil Young'}],
 *        [177, 456, 999]
 *      );
 *      //=> [{id: 456, name: 'Stephen Stills'}, {id: 177, name: 'Neil Young'}]
 */

var innerJoin =
/*#__PURE__*/
_curry3(function innerJoin(pred, xs, ys) {
  return _filter(function (x) {
    return _includesWith(pred, x, ys);
  }, xs);
});

export default innerJoin;import _curry3 from "./internal/_curry3.js";
/**
 * Inserts the supplied element into the list, at the specified `index`. _Note that

 * this is not destructive_: it returns a copy of the list with the changes.
 * <small>No lists have been harmed in the application of this function.</small>
 *
 * @func
 * @memberOf R
 * @since v0.2.2
 * @category List
 * @sig Number -> a -> [a] -> [a]
 * @param {Number} index The position to insert the element
 * @param {*} elt The element to insert into the Array
 * @param {Array} list The list to insert into
 * @return {Array} A new Array with `elt` inserted at `index`.
 * @example
 *
 *      R.insert(2, 'x', [1,2,3,4]); //=> [1,2,'x',3,4]
 */

var insert =
/*#__PURE__*/
_curry3(function insert(idx, elt, list) {
  idx = idx < list.length && idx >= 0 ? idx : list.length;
  var result = Array.prototype.slice.call(list, 0);
  result.splice(idx, 0, elt);
  return result;
});

export default insert;import _curry3 from "./internal/_curry3.js";
/**
 * Inserts the sub-list into the list, at the specified `index`. _Note that this is not
 * destructive_: it returns a copy of the list with the changes.
 * <small>No lists have been harmed in the application of this function.</small>
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category List
 * @sig Number -> [a] -> [a] -> [a]
 * @param {Number} index The position to insert the sub-list
 * @param {Array} elts The sub-list to insert into the Array
 * @param {Array} list The list to insert the sub-list into
 * @return {Array} A new Array with `elts` inserted starting at `index`.
 * @example
 *
 *      R.insertAll(2, ['x','y','z'], [1,2,3,4]); //=> [1,2,'x','y','z',3,4]
 */

var insertAll =
/*#__PURE__*/
_curry3(function insertAll(idx, elts, list) {
  idx = idx < list.length && idx >= 0 ? idx : list.length;
  return [].concat(Array.prototype.slice.call(list, 0, idx), elts, Array.prototype.slice.call(list, idx));
});

export default insertAll;import _includes from "./internal/_includes.js";
import _curry2 from "./internal/_curry2.js";
import _filter from "./internal/_filter.js";
import flip from "./flip.js";
import uniq from "./uniq.js";
/**
 * Combines two lists into a set (i.e. no duplicates) composed of those
 * elements common to both lists.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig [*] -> [*] -> [*]
 * @param {Array} list1 The first list.
 * @param {Array} list2 The second list.
 * @return {Array} The list of elements found in both `list1` and `list2`.
 * @see R.innerJoin
 * @example
 *
 *      R.intersection([1,2,3,4], [7,6,5,4,3]); //=> [4, 3]
 */

var intersection =
/*#__PURE__*/
_curry2(function intersection(list1, list2) {
  var lookupList, filteredList;

  if (list1.length > list2.length) {
    lookupList = list1;
    filteredList = list2;
  } else {
    lookupList = list2;
    filteredList = list1;
  }

  return uniq(_filter(flip(_includes)(lookupList), filteredList));
});

export default intersection;import _checkForMethod from "./internal/_checkForMethod.js";
import _curry2 from "./internal/_curry2.js";
/**
 * Creates a new list with the separator interposed between elements.
 *
 * Dispatches to the `intersperse` method of the second argument, if present.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category List
 * @sig a -> [a] -> [a]
 * @param {*} separator The element to add to the list.
 * @param {Array} list The list to be interposed.
 * @return {Array} The new list.
 * @example
 *
 *      R.intersperse('a', ['b', 'n', 'n', 's']); //=> ['b', 'a', 'n', 'a', 'n', 'a', 's']
 */

var intersperse =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_checkForMethod('intersperse', function intersperse(separator, list) {
  var out = [];
  var idx = 0;
  var length = list.length;

  while (idx < length) {
    if (idx === length - 1) {
      out.push(list[idx]);
    } else {
      out.push(list[idx], separator);
    }

    idx += 1;
  }

  return out;
}));

export default intersperse;import _clone from "./internal/_clone.js";
import _curry3 from "./internal/_curry3.js";
import _isTransformer from "./internal/_isTransformer.js";
import _reduce from "./internal/_reduce.js";
import _stepCat from "./internal/_stepCat.js";
/**
 * Transforms the items of the list with the transducer and appends the
 * transformed items to the accumulator using an appropriate iterator function
 * based on the accumulator type.
 *
 * The accumulator can be an array, string, object or a transformer. Iterated
 * items will be appended to arrays and concatenated to strings. Objects will
 * be merged directly or 2-item arrays will be merged as key, value pairs.
 *
 * The accumulator can also be a transformer object that provides a 2-arity
 * reducing iterator function, step, 0-arity initial value function, init, and
 * 1-arity result extraction function result. The step function is used as the
 * iterator function in reduce. The result function is used to convert the
 * final accumulator into the return type and in most cases is R.identity. The
 * init function is used to provide the initial accumulator.
 *
 * The iteration is performed with [`R.reduce`](#reduce) after initializing the
 * transducer.
 *
 * @func
 * @memberOf R
 * @since v0.12.0
 * @category List
 * @sig a -> (b -> b) -> [c] -> a
 * @param {*} acc The initial accumulator value.
 * @param {Function} xf The transducer function. Receives a transformer and returns a transformer.
 * @param {Array} list The list to iterate over.
 * @return {*} The final, accumulated value.
 * @see R.transduce
 * @example
 *
 *      const numbers = [1, 2, 3, 4];
 *      const transducer = R.compose(R.map(R.add(1)), R.take(2));
 *
 *      R.into([], transducer, numbers); //=> [2, 3]
 *
 *      const intoArray = R.into([]);
 *      intoArray(transducer, numbers); //=> [2, 3]
 */

var into =
/*#__PURE__*/
_curry3(function into(acc, xf, list) {
  return _isTransformer(acc) ? _reduce(xf(acc), acc['@@transducer/init'](), list) : _reduce(xf(_stepCat(acc)), _clone(acc, [], [], false), list);
});

export default into;import _curry1 from "./internal/_curry1.js";
import _has from "./internal/_has.js";
import keys from "./keys.js";
/**
 * Same as [`R.invertObj`](#invertObj), however this accounts for objects with
 * duplicate values by putting the values into an array.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Object
 * @sig {s: x} -> {x: [ s, ... ]}
 * @param {Object} obj The object or array to invert
 * @return {Object} out A new object with keys in an array.
 * @see R.invertObj
 * @example
 *
 *      const raceResultsByFirstName = {
 *        first: 'alice',
 *        second: 'jake',
 *        third: 'alice',
 *      };
 *      R.invert(raceResultsByFirstName);
 *      //=> { 'alice': ['first', 'third'], 'jake':['second'] }
 */

var invert =
/*#__PURE__*/
_curry1(function invert(obj) {
  var props = keys(obj);
  var len = props.length;
  var idx = 0;
  var out = {};

  while (idx < len) {
    var key = props[idx];
    var val = obj[key];
    var list = _has(val, out) ? out[val] : out[val] = [];
    list[list.length] = key;
    idx += 1;
  }

  return out;
});

export default invert;import _curry1 from "./internal/_curry1.js";
import keys from "./keys.js";
/**
 * Returns a new object with the keys of the given object as values, and the
 * values of the given object, which are coerced to strings, as keys. Note
 * that the last key found is preferred when handling the same value.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Object
 * @sig {s: x} -> {x: s}
 * @param {Object} obj The object or array to invert
 * @return {Object} out A new object
 * @see R.invert
 * @example
 *
 *      const raceResults = {
 *        first: 'alice',
 *        second: 'jake'
 *      };
 *      R.invertObj(raceResults);
 *      //=> { 'alice': 'first', 'jake':'second' }
 *
 *      // Alternatively:
 *      const raceResults = ['alice', 'jake'];
 *      R.invertObj(raceResults);
 *      //=> { 'alice': '0', 'jake':'1' }
 */

var invertObj =
/*#__PURE__*/
_curry1(function invertObj(obj) {
  var props = keys(obj);
  var len = props.length;
  var idx = 0;
  var out = {};

  while (idx < len) {
    var key = props[idx];
    out[obj[key]] = key;
    idx += 1;
  }

  return out;
});

export default invertObj;import _curry2 from "./internal/_curry2.js";
import _isFunction from "./internal/_isFunction.js";
import curryN from "./curryN.js";
import toString from "./toString.js";
/**
 * Turns a named method with a specified arity into a function that can be
 * called directly supplied with arguments and a target object.
 *
 * The returned function is curried and accepts `arity + 1` parameters where
 * the final parameter is the target object.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig Number -> String -> (a -> b -> ... -> n -> Object -> *)
 * @param {Number} arity Number of arguments the returned function should take
 *        before the target object.
 * @param {String} method Name of any of the target object's methods to call.
 * @return {Function} A new curried function.
 * @see R.construct
 * @example
 *
 *      const sliceFrom = R.invoker(1, 'slice');
 *      sliceFrom(6, 'abcdefghijklm'); //=> 'ghijklm'
 *      const sliceFrom6 = R.invoker(2, 'slice')(6);
 *      sliceFrom6(8, 'abcdefghijklm'); //=> 'gh'
 *
 *      const dog = {
 *        speak: async () => 'Woof!'
 *      };
 *      const speak = R.invoker(0, 'speak');
 *      speak(dog).then(console.log) //~> 'Woof!'
 *
 * @symb R.invoker(0, 'method')(o) = o['method']()
 * @symb R.invoker(1, 'method')(a, o) = o['method'](a)
 * @symb R.invoker(2, 'method')(a, b, o) = o['method'](a, b)
 */

var invoker =
/*#__PURE__*/
_curry2(function invoker(arity, method) {
  return curryN(arity + 1, function () {
    var target = arguments[arity];

    if (target != null && _isFunction(target[method])) {
      return target[method].apply(target, Array.prototype.slice.call(arguments, 0, arity));
    }

    throw new TypeError(toString(target) + ' does not have a method named "' + method + '"');
  });
});

export default invoker;import _curry2 from "./internal/_curry2.js";
/**
 * See if an object (i.e. `val`) is an instance of the supplied constructor. This
 * function will check up the inheritance chain, if any.
 * If `val` was created using `Object.create`, `R.is(Object, val) === true`.
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category Type
 * @sig (* -> {*}) -> a -> Boolean
 * @param {Object} ctor A constructor
 * @param {*} val The value to test
 * @return {Boolean}
 * @example
 *
 *      R.is(Object, {}); //=> true
 *      R.is(Number, 1); //=> true
 *      R.is(Object, 1); //=> false
 *      R.is(String, 's'); //=> true
 *      R.is(String, new String('')); //=> true
 *      R.is(Object, new String('')); //=> true
 *      R.is(Object, 's'); //=> false
 *      R.is(Number, {}); //=> false
 */

var is =
/*#__PURE__*/
_curry2(function is(Ctor, val) {
  return val instanceof Ctor || val != null && (val.constructor === Ctor || Ctor.name === 'Object' && typeof val === 'object');
});

export default is;import _curry1 from "./internal/_curry1.js";
import empty from "./empty.js";
import equals from "./equals.js";
/**
 * Returns `true` if the given value is its type's empty value; `false`
 * otherwise.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Logic
 * @sig a -> Boolean
 * @param {*} x
 * @return {Boolean}
 * @see R.empty
 * @example
 *
 *      R.isEmpty([1, 2, 3]);           //=> false
 *      R.isEmpty([]);                  //=> true
 *      R.isEmpty('');                  //=> true
 *      R.isEmpty(null);                //=> false
 *      R.isEmpty({});                  //=> true
 *      R.isEmpty({length: 0});         //=> false
 *      R.isEmpty(Uint8Array.from('')); //=> true
 */

var isEmpty =
/*#__PURE__*/
_curry1(function isEmpty(x) {
  return x != null && equals(x, empty(x));
});

export default isEmpty;import _curry1 from "./internal/_curry1.js";
/**
 * Checks if the input value is `null` or `undefined`.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Type
 * @sig * -> Boolean
 * @param {*} x The value to test.
 * @return {Boolean} `true` if `x` is `undefined` or `null`, otherwise `false`.
 * @example
 *
 *      R.isNil(null); //=> true
 *      R.isNil(undefined); //=> true
 *      R.isNil(0); //=> false
 *      R.isNil([]); //=> false
 */

var isNil =
/*#__PURE__*/
_curry1(function isNil(x) {
  return x == null;
});

export default isNil;import invoker from "./invoker.js";
/**
 * Returns a string made by inserting the `separator` between each element and
 * concatenating all the elements into a single string.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig String -> [a] -> String
 * @param {Number|String} separator The string used to separate the elements.
 * @param {Array} xs The elements to join into a string.
 * @return {String} str The string made by concatenating `xs` with `separator`.
 * @see R.split
 * @example
 *
 *      const spacer = R.join(' ');
 *      spacer(['a', 2, 3.4]);   //=> 'a 2 3.4'
 *      R.join('|', [1, 2, 3]);    //=> '1|2|3'
 */

var join =
/*#__PURE__*/
invoker(1, 'join');
export default join;import _curry1 from "./internal/_curry1.js";
import converge from "./converge.js";
/**
 * juxt applies a list of functions to a list of values.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category Function
 * @sig [(a, b, ..., m) -> n] -> ((a, b, ..., m) -> [n])
 * @param {Array} fns An array of functions
 * @return {Function} A function that returns a list of values after applying each of the original `fns` to its parameters.
 * @see R.applySpec
 * @example
 *
 *      const getRange = R.juxt([Math.min, Math.max]);
 *      getRange(3, 4, 9, -3); //=> [-3, 9]
 * @symb R.juxt([f, g, h])(a, b) = [f(a, b), g(a, b), h(a, b)]
 */

var juxt =
/*#__PURE__*/
_curry1(function juxt(fns) {
  return converge(function () {
    return Array.prototype.slice.call(arguments, 0);
  }, fns);
});

export default juxt;import _curry1 from "./internal/_curry1.js";
import _has from "./internal/_has.js";
import _isArguments from "./internal/_isArguments.js"; // cover IE < 9 keys issues

var hasEnumBug = !
/*#__PURE__*/
{
  toString: null
}.propertyIsEnumerable('toString');
var nonEnumerableProps = ['constructor', 'valueOf', 'isPrototypeOf', 'toString', 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; // Safari bug

var hasArgsEnumBug =
/*#__PURE__*/
function () {
  'use strict';

  return arguments.propertyIsEnumerable('length');
}();

var contains = function contains(list, item) {
  var idx = 0;

  while (idx < list.length) {
    if (list[idx] === item) {
      return true;
    }

    idx += 1;
  }

  return false;
};
/**
 * Returns a list containing the names of all the enumerable own properties of
 * the supplied object.
 * Note that the order of the output array is not guaranteed to be consistent
 * across different JS platforms.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @sig {k: v} -> [k]
 * @param {Object} obj The object to extract properties from
 * @return {Array} An array of the object's own properties.
 * @see R.keysIn, R.values, R.toPairs
 * @example
 *
 *      R.keys({a: 1, b: 2, c: 3}); //=> ['a', 'b', 'c']
 */


var keys = typeof Object.keys === 'function' && !hasArgsEnumBug ?
/*#__PURE__*/
_curry1(function keys(obj) {
  return Object(obj) !== obj ? [] : Object.keys(obj);
}) :
/*#__PURE__*/
_curry1(function keys(obj) {
  if (Object(obj) !== obj) {
    return [];
  }

  var prop, nIdx;
  var ks = [];

  var checkArgsLength = hasArgsEnumBug && _isArguments(obj);

  for (prop in obj) {
    if (_has(prop, obj) && (!checkArgsLength || prop !== 'length')) {
      ks[ks.length] = prop;
    }
  }

  if (hasEnumBug) {
    nIdx = nonEnumerableProps.length - 1;

    while (nIdx >= 0) {
      prop = nonEnumerableProps[nIdx];

      if (_has(prop, obj) && !contains(ks, prop)) {
        ks[ks.length] = prop;
      }

      nIdx -= 1;
    }
  }

  return ks;
});
export default keys;import _curry1 from "./internal/_curry1.js";
/**
 * Returns a list containing the names of all the properties of the supplied
 * object, including prototype properties.
 * Note that the order of the output array is not guaranteed to be consistent
 * across different JS platforms.
 *
 * @func
 * @memberOf R
 * @since v0.2.0
 * @category Object
 * @sig {k: v} -> [k]
 * @param {Object} obj The object to extract properties from
 * @return {Array} An array of the object's own and prototype properties.
 * @see R.keys, R.valuesIn
 * @example
 *
 *      const F = function() { this.x = 'X'; };
 *      F.prototype.y = 'Y';
 *      const f = new F();
 *      R.keysIn(f); //=> ['x', 'y']
 */

var keysIn =
/*#__PURE__*/
_curry1(function keysIn(obj) {
  var prop;
  var ks = [];

  for (prop in obj) {
    ks[ks.length] = prop;
  }

  return ks;
});

export default keysIn;import nth from "./nth.js";
/**
 * Returns the last element of the given list or string.
 *
 * @func
 * @memberOf R
 * @since v0.1.4
 * @category List
 * @sig [a] -> a | Undefined
 * @sig String -> String
 * @param {*} list
 * @return {*}
 * @see R.init, R.head, R.tail
 * @example
 *
 *      R.last(['fi', 'fo', 'fum']); //=> 'fum'
 *      R.last([]); //=> undefined
 *
 *      R.last('abc'); //=> 'c'
 *      R.last(''); //=> ''
 */

var last =
/*#__PURE__*/
nth(-1);
export default last;import _curry2 from "./internal/_curry2.js";
import _isArray from "./internal/_isArray.js";
import equals from "./equals.js";
/**
 * Returns the position of the last occurrence of an item in an array, or -1 if
 * the item is not included in the array. [`R.equals`](#equals) is used to
 * determine equality.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig a -> [a] -> Number
 * @param {*} target The item to find.
 * @param {Array} xs The array to search in.
 * @return {Number} the index of the target, or -1 if the target is not found.
 * @see R.indexOf, R.findLastIndex
 * @example
 *
 *      R.lastIndexOf(3, [-1,3,3,0,1,2,3,4]); //=> 6
 *      R.lastIndexOf(10, [1,2,3,4]); //=> -1
 */

var lastIndexOf =
/*#__PURE__*/
_curry2(function lastIndexOf(target, xs) {
  if (typeof xs.lastIndexOf === 'function' && !_isArray(xs)) {
    return xs.lastIndexOf(target);
  } else {
    var idx = xs.length - 1;

    while (idx >= 0) {
      if (equals(xs[idx], target)) {
        return idx;
      }

      idx -= 1;
    }

    return -1;
  }
});

export default lastIndexOf;import _curry1 from "./internal/_curry1.js";
import _isNumber from "./internal/_isNumber.js";
/**
 * Returns the number of elements in the array by returning `list.length`.
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category List
 * @sig [a] -> Number
 * @param {Array} list The array to inspect.
 * @return {Number} The length of the array.
 * @example
 *
 *      R.length([]); //=> 0
 *      R.length([1, 2, 3]); //=> 3
 */

var length =
/*#__PURE__*/
_curry1(function length(list) {
  return list != null && _isNumber(list.length) ? list.length : NaN;
});

export default length;import _curry2 from "./internal/_curry2.js";
import map from "./map.js";
/**
 * Returns a lens for the given getter and setter functions. The getter "gets"
 * the value of the focus; the setter "sets" the value of the focus. The setter
 * should not mutate the data structure.
 *
 * @func
 * @memberOf R
 * @since v0.8.0
 * @category Object
 * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
 * @sig (s -> a) -> ((a, s) -> s) -> Lens s a
 * @param {Function} getter
 * @param {Function} setter
 * @return {Lens}
 * @see R.view, R.set, R.over, R.lensIndex, R.lensProp
 * @example
 *
 *      const xLens = R.lens(R.prop('x'), R.assoc('x'));
 *
 *      R.view(xLens, {x: 1, y: 2});            //=> 1
 *      R.set(xLens, 4, {x: 1, y: 2});          //=> {x: 4, y: 2}
 *      R.over(xLens, R.negate, {x: 1, y: 2});  //=> {x: -1, y: 2}
 */

var lens =
/*#__PURE__*/
_curry2(function lens(getter, setter) {
  return function (toFunctorFn) {
    return function (target) {
      return map(function (focus) {
        return setter(focus, target);
      }, toFunctorFn(getter(target)));
    };
  };
});

export default lens;import _curry1 from "./internal/_curry1.js";
import lens from "./lens.js";
import nth from "./nth.js";
import update from "./update.js";
/**
 * Returns a lens whose focus is the specified index.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category Object
 * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
 * @sig Number -> Lens s a
 * @param {Number} n
 * @return {Lens}
 * @see R.view, R.set, R.over, R.nth
 * @example
 *
 *      const headLens = R.lensIndex(0);
 *
 *      R.view(headLens, ['a', 'b', 'c']);            //=> 'a'
 *      R.set(headLens, 'x', ['a', 'b', 'c']);        //=> ['x', 'b', 'c']
 *      R.over(headLens, R.toUpper, ['a', 'b', 'c']); //=> ['A', 'b', 'c']
 */

var lensIndex =
/*#__PURE__*/
_curry1(function lensIndex(n) {
  return lens(nth(n), update(n));
});

export default lensIndex;import _curry1 from "./internal/_curry1.js";
import assocPath from "./assocPath.js";
import lens from "./lens.js";
import path from "./path.js";
/**
 * Returns a lens whose focus is the specified path.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category Object
 * @typedefn Idx = String | Int | Symbol
 * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
 * @sig [Idx] -> Lens s a
 * @param {Array} path The path to use.
 * @return {Lens}
 * @see R.view, R.set, R.over
 * @example
 *
 *      const xHeadYLens = R.lensPath(['x', 0, 'y']);
 *
 *      R.view(xHeadYLens, {x: [{y: 2, z: 3}, {y: 4, z: 5}]});
 *      //=> 2
 *      R.set(xHeadYLens, 1, {x: [{y: 2, z: 3}, {y: 4, z: 5}]});
 *      //=> {x: [{y: 1, z: 3}, {y: 4, z: 5}]}
 *      R.over(xHeadYLens, R.negate, {x: [{y: 2, z: 3}, {y: 4, z: 5}]});
 *      //=> {x: [{y: -2, z: 3}, {y: 4, z: 5}]}
 */

var lensPath =
/*#__PURE__*/
_curry1(function lensPath(p) {
  return lens(path(p), assocPath(p));
});

export default lensPath;import _curry1 from "./internal/_curry1.js";
import assoc from "./assoc.js";
import lens from "./lens.js";
import prop from "./prop.js";
/**
 * Returns a lens whose focus is the specified property.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category Object
 * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
 * @sig String -> Lens s a
 * @param {String} k
 * @return {Lens}
 * @see R.view, R.set, R.over
 * @example
 *
 *      const xLens = R.lensProp('x');
 *
 *      R.view(xLens, {x: 1, y: 2});            //=> 1
 *      R.set(xLens, 4, {x: 1, y: 2});          //=> {x: 4, y: 2}
 *      R.over(xLens, R.negate, {x: 1, y: 2});  //=> {x: -1, y: 2}
 */

var lensProp =
/*#__PURE__*/
_curry1(function lensProp(k) {
  return lens(prop(k), assoc(k));
});

export default lensProp;import _curry1 from "./internal/_curry1.js";
import liftN from "./liftN.js";
/**
 * "lifts" a function of arity >= 1 so that it may "map over" a list, Function or other
 * object that satisfies the [FantasyLand Apply spec](https://github.com/fantasyland/fantasy-land#apply).
 *
 * @func
 * @memberOf R
 * @since v0.7.0
 * @category Function
 * @sig (*... -> *) -> ([*]... -> [*])
 * @param {Function} fn The function to lift into higher context
 * @return {Function} The lifted function.
 * @see R.liftN
 * @example
 *
 *      const madd3 = R.lift((a, b, c) => a + b + c);
 *
 *      madd3([100, 200], [30, 40], [5, 6, 7]); //=> [135, 136, 137, 145, 146, 147, 235, 236, 237, 245, 246, 247]
 *
 *      const madd5 = R.lift((a, b, c, d, e) => a + b + c + d + e);
 *
 *      madd5([10, 20], [1], [2, 3], [4], [100, 200]); //=> [117, 217, 118, 218, 127, 227, 128, 228]
 */

var lift =
/*#__PURE__*/
_curry1(function lift(fn) {
  return liftN(fn.length, fn);
});

export default lift;import _curry2 from "./internal/_curry2.js";
import _reduce from "./internal/_reduce.js";
import ap from "./ap.js";
import curryN from "./curryN.js";
import map from "./map.js";
/**
 * "lifts" a function to be the specified arity, so that it may "map over" that
 * many lists, Functions or other objects that satisfy the [FantasyLand Apply spec](https://github.com/fantasyland/fantasy-land#apply).
 *
 * @func
 * @memberOf R
 * @since v0.7.0
 * @category Function
 * @sig Number -> (*... -> *) -> ([*]... -> [*])
 * @param {Function} fn The function to lift into higher context
 * @return {Function} The lifted function.
 * @see R.lift, R.ap
 * @example
 *
 *      const madd3 = R.liftN(3, (...args) => R.sum(args));
 *      madd3([1,2,3], [1,2,3], [1]); //=> [3, 4, 5, 4, 5, 6, 5, 6, 7]
 */

var liftN =
/*#__PURE__*/
_curry2(function liftN(arity, fn) {
  var lifted = curryN(arity, fn);
  return curryN(arity, function () {
    return _reduce(ap, map(lifted, arguments[0]), Array.prototype.slice.call(arguments, 1));
  });
});

export default liftN;import _curry2 from "./internal/_curry2.js";
/**
 * Returns `true` if the first argument is less than the second; `false`
 * otherwise.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig Ord a => a -> a -> Boolean
 * @param {*} a
 * @param {*} b
 * @return {Boolean}
 * @see R.gt
 * @example
 *
 *      R.lt(2, 1); //=> false
 *      R.lt(2, 2); //=> false
 *      R.lt(2, 3); //=> true
 *      R.lt('a', 'z'); //=> true
 *      R.lt('z', 'a'); //=> false
 */

var lt =
/*#__PURE__*/
_curry2(function lt(a, b) {
  return a < b;
});

export default lt;import _curry2 from "./internal/_curry2.js";
/**
 * Returns `true` if the first argument is less than or equal to the second;
 * `false` otherwise.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig Ord a => a -> a -> Boolean
 * @param {Number} a
 * @param {Number} b
 * @return {Boolean}
 * @see R.gte
 * @example
 *
 *      R.lte(2, 1); //=> false
 *      R.lte(2, 2); //=> true
 *      R.lte(2, 3); //=> true
 *      R.lte('a', 'z'); //=> true
 *      R.lte('z', 'a'); //=> false
 */

var lte =
/*#__PURE__*/
_curry2(function lte(a, b) {
  return a <= b;
});

export default lte;import _curry2 from "./internal/_curry2.js";
import _dispatchable from "./internal/_dispatchable.js";
import _map from "./internal/_map.js";
import _reduce from "./internal/_reduce.js";
import _xmap from "./internal/_xmap.js";
import curryN from "./curryN.js";
import keys from "./keys.js";
/**
 * Takes a function and
 * a [functor](https://github.com/fantasyland/fantasy-land#functor),
 * applies the function to each of the functor's values, and returns
 * a functor of the same shape.
 *
 * Ramda provides suitable `map` implementations for `Array` and `Object`,
 * so this function may be applied to `[1, 2, 3]` or `{x: 1, y: 2, z: 3}`.
 *
 * Dispatches to the `map` method of the second argument, if present.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * Also treats functions as functors and will compose them together.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig Functor f => (a -> b) -> f a -> f b
 * @param {Function} fn The function to be called on every element of the input `list`.
 * @param {Array} list The list to be iterated over.
 * @return {Array} The new list.
 * @see R.transduce, R.addIndex, R.pluck, R.project
 * @example
 *
 *      const double = x => x * 2;
 *
 *      R.map(double, [1, 2, 3]); //=> [2, 4, 6]
 *
 *      R.map(double, {x: 1, y: 2, z: 3}); //=> {x: 2, y: 4, z: 6}
 * @symb R.map(f, [a, b]) = [f(a), f(b)]
 * @symb R.map(f, { x: a, y: b }) = { x: f(a), y: f(b) }
 * @symb R.map(f, functor_o) = functor_o.map(f)
 */

var map =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable(['fantasy-land/map', 'map'], _xmap, function map(fn, functor) {
  switch (Object.prototype.toString.call(functor)) {
    case '[object Function]':
      return curryN(functor.length, function () {
        return fn.call(this, functor.apply(this, arguments));
      });

    case '[object Object]':
      return _reduce(function (acc, key) {
        acc[key] = fn(functor[key]);
        return acc;
      }, {}, keys(functor));

    default:
      return _map(fn, functor);
  }
}));

export default map;import _curry3 from "./internal/_curry3.js";
/**
 * The `mapAccum` function behaves like a combination of map and reduce; it
 * applies a function to each element of a list, passing an accumulating
 * parameter from left to right, and returning a final value of this
 * accumulator together with the new list.
 *
 * The iterator function receives two arguments, *acc* and *value*, and should
 * return a tuple *[acc, value]*.
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category List
 * @sig ((acc, x) -> (acc, y)) -> acc -> [x] -> (acc, [y])
 * @param {Function} fn The function to be called on every element of the input `list`.
 * @param {*} acc The accumulator value.
 * @param {Array} list The list to iterate over.
 * @return {*} The final, accumulated value.
 * @see R.scan, R.addIndex, R.mapAccumRight
 * @example
 *
 *      const digits = ['1', '2', '3', '4'];
 *      const appender = (a, b) => [a + b, a + b];
 *
 *      R.mapAccum(appender, 0, digits); //=> ['01234', ['01', '012', '0123', '01234']]
 * @symb R.mapAccum(f, a, [b, c, d]) = [
 *   f(f(f(a, b)[0], c)[0], d)[0],
 *   [
 *     f(a, b)[1],
 *     f(f(a, b)[0], c)[1],
 *     f(f(f(a, b)[0], c)[0], d)[1]
 *   ]
 * ]
 */

var mapAccum =
/*#__PURE__*/
_curry3(function mapAccum(fn, acc, list) {
  var idx = 0;
  var len = list.length;
  var result = [];
  var tuple = [acc];

  while (idx < len) {
    tuple = fn(tuple[0], list[idx]);
    result[idx] = tuple[1];
    idx += 1;
  }

  return [tuple[0], result];
});

export default mapAccum;import _curry3 from "./internal/_curry3.js";
/**
 * The `mapAccumRight` function behaves like a combination of map and reduce; it
 * applies a function to each element of a list, passing an accumulating
 * parameter from right to left, and returning a final value of this
 * accumulator together with the new list.
 *
 * Similar to [`mapAccum`](#mapAccum), except moves through the input list from
 * the right to the left.
 *
 * The iterator function receives two arguments, *acc* and *value*, and should
 * return a tuple *[acc, value]*.
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category List
 * @sig ((acc, x) -> (acc, y)) -> acc -> [x] -> (acc, [y])
 * @param {Function} fn The function to be called on every element of the input `list`.
 * @param {*} acc The accumulator value.
 * @param {Array} list The list to iterate over.
 * @return {*} The final, accumulated value.
 * @see R.addIndex, R.mapAccum
 * @example
 *
 *      const digits = ['1', '2', '3', '4'];
 *      const appender = (a, b) => [b + a, b + a];
 *
 *      R.mapAccumRight(appender, 5, digits); //=> ['12345', ['12345', '2345', '345', '45']]
 * @symb R.mapAccumRight(f, a, [b, c, d]) = [
 *   f(f(f(a, d)[0], c)[0], b)[0],
 *   [
 *     f(a, d)[1],
 *     f(f(a, d)[0], c)[1],
 *     f(f(f(a, d)[0], c)[0], b)[1]
 *   ]
 * ]
 */

var mapAccumRight =
/*#__PURE__*/
_curry3(function mapAccumRight(fn, acc, list) {
  var idx = list.length - 1;
  var result = [];
  var tuple = [acc];

  while (idx >= 0) {
    tuple = fn(tuple[0], list[idx]);
    result[idx] = tuple[1];
    idx -= 1;
  }

  return [tuple[0], result];
});

export default mapAccumRight;import _curry2 from "./internal/_curry2.js";
import _reduce from "./internal/_reduce.js";
import keys from "./keys.js";
/**
 * An Object-specific version of [`map`](#map). The function is applied to three
 * arguments: *(value, key, obj)*. If only the value is significant, use
 * [`map`](#map) instead.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Object
 * @sig ((*, String, Object) -> *) -> Object -> Object
 * @param {Function} fn
 * @param {Object} obj
 * @return {Object}
 * @see R.map
 * @example
 *
 *      const xyz = { x: 1, y: 2, z: 3 };
 *      const prependKeyAndDouble = (num, key, obj) => key + (num * 2);
 *
 *      R.mapObjIndexed(prependKeyAndDouble, xyz); //=> { x: 'x2', y: 'y4', z: 'z6' }
 */

var mapObjIndexed =
/*#__PURE__*/
_curry2(function mapObjIndexed(fn, obj) {
  return _reduce(function (acc, key) {
    acc[key] = fn(obj[key], key, obj);
    return acc;
  }, {}, keys(obj));
});

export default mapObjIndexed;import _curry2 from "./internal/_curry2.js";
/**
 * Tests a regular expression against a String. Note that this function will
 * return an empty array when there are no matches. This differs from
 * [`String.prototype.match`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match)
 * which returns `null` when there are no matches.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category String
 * @sig RegExp -> String -> [String | Undefined]
 * @param {RegExp} rx A regular expression.
 * @param {String} str The string to match against
 * @return {Array} The list of matches or empty array.
 * @see R.test
 * @example
 *
 *      R.match(/([a-z]a)/g, 'bananas'); //=> ['ba', 'na', 'na']
 *      R.match(/a/, 'b'); //=> []
 *      R.match(/a/, null); //=> TypeError: null does not have a method named "match"
 */

var match =
/*#__PURE__*/
_curry2(function match(rx, str) {
  return str.match(rx) || [];
});

export default match;import _curry2 from "./internal/_curry2.js";
import _isInteger from "./internal/_isInteger.js";
/**
 * `mathMod` behaves like the modulo operator should mathematically, unlike the
 * `%` operator (and by extension, [`R.modulo`](#modulo)). So while
 * `-17 % 5` is `-2`, `mathMod(-17, 5)` is `3`. `mathMod` requires Integer
 * arguments, and returns NaN when the modulus is zero or negative.
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category Math
 * @sig Number -> Number -> Number
 * @param {Number} m The dividend.
 * @param {Number} p the modulus.
 * @return {Number} The result of `b mod a`.
 * @see R.modulo
 * @example
 *
 *      R.mathMod(-17, 5);  //=> 3
 *      R.mathMod(17, 5);   //=> 2
 *      R.mathMod(17, -5);  //=> NaN
 *      R.mathMod(17, 0);   //=> NaN
 *      R.mathMod(17.2, 5); //=> NaN
 *      R.mathMod(17, 5.3); //=> NaN
 *
 *      const clock = R.mathMod(R.__, 12);
 *      clock(15); //=> 3
 *      clock(24); //=> 0
 *
 *      const seventeenMod = R.mathMod(17);
 *      seventeenMod(3);  //=> 2
 *      seventeenMod(4);  //=> 1
 *      seventeenMod(10); //=> 7
 */

var mathMod =
/*#__PURE__*/
_curry2(function mathMod(m, p) {
  if (!_isInteger(m)) {
    return NaN;
  }

  if (!_isInteger(p) || p < 1) {
    return NaN;
  }

  return (m % p + p) % p;
});

export default mathMod;import _curry2 from "./internal/_curry2.js";
/**
 * Returns the larger of its two arguments.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig Ord a => a -> a -> a
 * @param {*} a
 * @param {*} b
 * @return {*}
 * @see R.maxBy, R.min
 * @example
 *
 *      R.max(789, 123); //=> 789
 *      R.max('a', 'b'); //=> 'b'
 */

var max =
/*#__PURE__*/
_curry2(function max(a, b) {
  return b > a ? b : a;
});

export default max;import _curry3 from "./internal/_curry3.js";
/**
 * Takes a function and two values, and returns whichever value produces the
 * larger result when passed to the provided function.
 *
 * @func
 * @memberOf R
 * @since v0.8.0
 * @category Relation
 * @sig Ord b => (a -> b) -> a -> a -> a
 * @param {Function} f
 * @param {*} a
 * @param {*} b
 * @return {*}
 * @see R.max, R.minBy
 * @example
 *
 *      //  square :: Number -> Number
 *      const square = n => n * n;
 *
 *      R.maxBy(square, -3, 2); //=> -3
 *
 *      R.reduce(R.maxBy(square), 0, [3, -5, 4, 1, -2]); //=> -5
 *      R.reduce(R.maxBy(square), 0, []); //=> 0
 */

var maxBy =
/*#__PURE__*/
_curry3(function maxBy(f, a, b) {
  return f(b) > f(a) ? b : a;
});

export default maxBy;import _curry1 from "./internal/_curry1.js";
import sum from "./sum.js";
/**
 * Returns the mean of the given list of numbers.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category Math
 * @sig [Number] -> Number
 * @param {Array} list
 * @return {Number}
 * @see R.median
 * @example
 *
 *      R.mean([2, 7, 9]); //=> 6
 *      R.mean([]); //=> NaN
 */

var mean =
/*#__PURE__*/
_curry1(function mean(list) {
  return sum(list) / list.length;
});

export default mean;import _curry1 from "./internal/_curry1.js";
import mean from "./mean.js";
/**
 * Returns the median of the given list of numbers.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category Math
 * @sig [Number] -> Number
 * @param {Array} list
 * @return {Number}
 * @see R.mean
 * @example
 *
 *      R.median([2, 9, 7]); //=> 7
 *      R.median([7, 2, 10, 9]); //=> 8
 *      R.median([]); //=> NaN
 */

var median =
/*#__PURE__*/
_curry1(function median(list) {
  var len = list.length;

  if (len === 0) {
    return NaN;
  }

  var width = 2 - len % 2;
  var idx = (len - width) / 2;
  return mean(Array.prototype.slice.call(list, 0).sort(function (a, b) {
    return a < b ? -1 : a > b ? 1 : 0;
  }).slice(idx, idx + width));
});

export default median;import _arity from "./internal/_arity.js";
import _curry2 from "./internal/_curry2.js";
import _has from "./internal/_has.js";
/**
 * Creates a new function that, when invoked, caches the result of calling `fn`
 * for a given argument set and returns the result. Subsequent calls to the
 * memoized `fn` with the same argument set will not result in an additional
 * call to `fn`; instead, the cached result for that set of arguments will be
 * returned.
 *
 * Care must be taken when implementing key generation to avoid key collision,
 * or if tracking references, memory leaks and mutating arguments.
 *
 * @func
 * @memberOf R
 * @since v0.24.0
 * @category Function
 * @sig (*... -> String) -> (*... -> a) -> (*... -> a)
 * @param {Function} fn The function to generate the cache key.
 * @param {Function} fn The function to memoize.
 * @return {Function} Memoized version of `fn`.
 * @example
 *
 *      let count = 0;
 *      const factorial = R.memoizeWith(Number, n => {
 *        count += 1;
 *        return R.product(R.range(1, n + 1));
 *      });
 *      factorial(5); //=> 120
 *      factorial(5); //=> 120
 *      factorial(5); //=> 120
 *      count; //=> 1
 */

var memoizeWith =
/*#__PURE__*/
_curry2(function memoizeWith(mFn, fn) {
  var cache = {};
  return _arity(fn.length, function () {
    var key = mFn.apply(this, arguments);

    if (!_has(key, cache)) {
      cache[key] = fn.apply(this, arguments);
    }

    return cache[key];
  });
});

export default memoizeWith;import _objectAssign from "./internal/_objectAssign.js";
import _curry1 from "./internal/_curry1.js";
/**
 * Creates one new object with the own properties from a list of objects.
 * If a key exists in more than one object, the value from the last
 * object it exists in will be used.
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category List
 * @sig [{k: v}] -> {k: v}
 * @param {Array} list An array of objects
 * @return {Object} A merged object.
 * @see R.reduce
 * @example
 *
 *      R.mergeAll([{foo:1},{bar:2},{baz:3}]); //=> {foo:1,bar:2,baz:3}
 *      R.mergeAll([{foo:1},{foo:2},{bar:2}]); //=> {foo:2,bar:2}
 * @symb R.mergeAll([{ x: 1 }, { y: 2 }, { z: 3 }]) = { x: 1, y: 2, z: 3 }
 */

var mergeAll =
/*#__PURE__*/
_curry1(function mergeAll(list) {
  return _objectAssign.apply(null, [{}].concat(list));
});

export default mergeAll;import _curry2 from "./internal/_curry2.js";
import mergeDeepWithKey from "./mergeDeepWithKey.js";
/**
 * Creates a new object with the own properties of the first object merged with
 * the own properties of the second object. If a key exists in both objects:
 * - and both values are objects, the two values will be recursively merged
 * - otherwise the value from the first object will be used.
 *
 * @func
 * @memberOf R
 * @since v0.24.0
 * @category Object
 * @sig {a} -> {a} -> {a}
 * @param {Object} lObj
 * @param {Object} rObj
 * @return {Object}
 * @see R.merge, R.mergeDeepRight, R.mergeDeepWith, R.mergeDeepWithKey
 * @example
 *
 *      R.mergeDeepLeft({ name: 'fred', age: 10, contact: { email: 'moo@example.com' }},
 *                      { age: 40, contact: { email: 'baa@example.com' }});
 *      //=> { name: 'fred', age: 10, contact: { email: 'moo@example.com' }}
 */

var mergeDeepLeft =
/*#__PURE__*/
_curry2(function mergeDeepLeft(lObj, rObj) {
  return mergeDeepWithKey(function (k, lVal, rVal) {
    return lVal;
  }, lObj, rObj);
});

export default mergeDeepLeft;import _curry2 from "./internal/_curry2.js";
import mergeDeepWithKey from "./mergeDeepWithKey.js";
/**
 * Creates a new object with the own properties of the first object merged with
 * the own properties of the second object. If a key exists in both objects:
 * - and both values are objects, the two values will be recursively merged
 * - otherwise the value from the second object will be used.
 *
 * @func
 * @memberOf R
 * @since v0.24.0
 * @category Object
 * @sig {a} -> {a} -> {a}
 * @param {Object} lObj
 * @param {Object} rObj
 * @return {Object}
 * @see R.merge, R.mergeDeepLeft, R.mergeDeepWith, R.mergeDeepWithKey
 * @example
 *
 *      R.mergeDeepRight({ name: 'fred', age: 10, contact: { email: 'moo@example.com' }},
 *                       { age: 40, contact: { email: 'baa@example.com' }});
 *      //=> { name: 'fred', age: 40, contact: { email: 'baa@example.com' }}
 */

var mergeDeepRight =
/*#__PURE__*/
_curry2(function mergeDeepRight(lObj, rObj) {
  return mergeDeepWithKey(function (k, lVal, rVal) {
    return rVal;
  }, lObj, rObj);
});

export default mergeDeepRight;import _curry3 from "./internal/_curry3.js";
import mergeDeepWithKey from "./mergeDeepWithKey.js";
/**
 * Creates a new object with the own properties of the two provided objects.
 * If a key exists in both objects:
 * - and both associated values are also objects then the values will be
 *   recursively merged.
 * - otherwise the provided function is applied to associated values using the
 *   resulting value as the new value associated with the key.
 * If a key only exists in one object, the value will be associated with the key
 * of the resulting object.
 *
 * @func
 * @memberOf R
 * @since v0.24.0
 * @category Object
 * @sig ((a, a) -> a) -> {a} -> {a} -> {a}
 * @param {Function} fn
 * @param {Object} lObj
 * @param {Object} rObj
 * @return {Object}
 * @see R.mergeWith, R.mergeDeepWithKey
 * @example
 *
 *      R.mergeDeepWith(R.concat,
 *                      { a: true, c: { values: [10, 20] }},
 *                      { b: true, c: { values: [15, 35] }});
 *      //=> { a: true, b: true, c: { values: [10, 20, 15, 35] }}
 */

var mergeDeepWith =
/*#__PURE__*/
_curry3(function mergeDeepWith(fn, lObj, rObj) {
  return mergeDeepWithKey(function (k, lVal, rVal) {
    return fn(lVal, rVal);
  }, lObj, rObj);
});

export default mergeDeepWith;import _curry3 from "./internal/_curry3.js";
import _isObject from "./internal/_isObject.js";
import mergeWithKey from "./mergeWithKey.js";
/**
 * Creates a new object with the own properties of the two provided objects.
 * If a key exists in both objects:
 * - and both associated values are also objects then the values will be
 *   recursively merged.
 * - otherwise the provided function is applied to the key and associated values
 *   using the resulting value as the new value associated with the key.
 * If a key only exists in one object, the value will be associated with the key
 * of the resulting object.
 *
 * @func
 * @memberOf R
 * @since v0.24.0
 * @category Object
 * @sig ((String, a, a) -> a) -> {a} -> {a} -> {a}
 * @param {Function} fn
 * @param {Object} lObj
 * @param {Object} rObj
 * @return {Object}
 * @see R.mergeWithKey, R.mergeDeepWith
 * @example
 *
 *      let concatValues = (k, l, r) => k == 'values' ? R.concat(l, r) : r
 *      R.mergeDeepWithKey(concatValues,
 *                         { a: true, c: { thing: 'foo', values: [10, 20] }},
 *                         { b: true, c: { thing: 'bar', values: [15, 35] }});
 *      //=> { a: true, b: true, c: { thing: 'bar', values: [10, 20, 15, 35] }}
 */

var mergeDeepWithKey =
/*#__PURE__*/
_curry3(function mergeDeepWithKey(fn, lObj, rObj) {
  return mergeWithKey(function (k, lVal, rVal) {
    if (_isObject(lVal) && _isObject(rVal)) {
      return mergeDeepWithKey(fn, lVal, rVal);
    } else {
      return fn(k, lVal, rVal);
    }
  }, lObj, rObj);
});

export default mergeDeepWithKey;import _objectAssign from "./internal/_objectAssign.js";
import _curry2 from "./internal/_curry2.js";
/**
 * Create a new object with the own properties of the first object merged with
 * the own properties of the second object. If a key exists in both objects,
 * the value from the first object will be used.
 *
 * @func
 * @memberOf R
 * @since v0.26.0
 * @category Object
 * @sig {k: v} -> {k: v} -> {k: v}
 * @param {Object} l
 * @param {Object} r
 * @return {Object}
 * @see R.mergeRight, R.mergeDeepLeft, R.mergeWith, R.mergeWithKey
 * @example
 *
 *      R.mergeLeft({ 'age': 40 }, { 'name': 'fred', 'age': 10 });
 *      //=> { 'name': 'fred', 'age': 40 }
 *
 *      const resetToDefault = R.mergeLeft({x: 0});
 *      resetToDefault({x: 5, y: 2}); //=> {x: 0, y: 2}
 * @symb R.mergeLeft(a, b) = {...b, ...a}
 */

var mergeLeft =
/*#__PURE__*/
_curry2(function mergeLeft(l, r) {
  return _objectAssign({}, r, l);
});

export default mergeLeft;import _objectAssign from "./internal/_objectAssign.js";
import _curry2 from "./internal/_curry2.js";
/**
 * Create a new object with the own properties of the first object merged with
 * the own properties of the second object. If a key exists in both objects,
 * the value from the second object will be used.
 *
 * @func
 * @memberOf R
 * @since v0.26.0
 * @category Object
 * @sig {k: v} -> {k: v} -> {k: v}
 * @param {Object} l
 * @param {Object} r
 * @return {Object}
 * @see R.mergeLeft, R.mergeDeepRight, R.mergeWith, R.mergeWithKey
 * @example
 *
 *      R.mergeRight({ 'name': 'fred', 'age': 10 }, { 'age': 40 });
 *      //=> { 'name': 'fred', 'age': 40 }
 *
 *      const withDefaults = R.mergeRight({x: 0, y: 0});
 *      withDefaults({y: 2}); //=> {x: 0, y: 2}
 * @symb R.mergeRight(a, b) = {...a, ...b}
 */

var mergeRight =
/*#__PURE__*/
_curry2(function mergeRight(l, r) {
  return _objectAssign({}, l, r);
});

export default mergeRight;import _curry3 from "./internal/_curry3.js";
import mergeWithKey from "./mergeWithKey.js";
/**
 * Creates a new object with the own properties of the two provided objects. If
 * a key exists in both objects, the provided function is applied to the values
 * associated with the key in each object, with the result being used as the
 * value associated with the key in the returned object.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category Object
 * @sig ((a, a) -> a) -> {a} -> {a} -> {a}
 * @param {Function} fn
 * @param {Object} l
 * @param {Object} r
 * @return {Object}
 * @see R.mergeDeepWith, R.merge, R.mergeWithKey
 * @example
 *
 *      R.mergeWith(R.concat,
 *                  { a: true, values: [10, 20] },
 *                  { b: true, values: [15, 35] });
 *      //=> { a: true, b: true, values: [10, 20, 15, 35] }
 */

var mergeWith =
/*#__PURE__*/
_curry3(function mergeWith(fn, l, r) {
  return mergeWithKey(function (_, _l, _r) {
    return fn(_l, _r);
  }, l, r);
});

export default mergeWith;import _curry3 from "./internal/_curry3.js";
import _has from "./internal/_has.js";
/**
 * Creates a new object with the own properties of the two provided objects. If
 * a key exists in both objects, the provided function is applied to the key
 * and the values associated with the key in each object, with the result being
 * used as the value associated with the key in the returned object.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category Object
 * @sig ((String, a, a) -> a) -> {a} -> {a} -> {a}
 * @param {Function} fn
 * @param {Object} l
 * @param {Object} r
 * @return {Object}
 * @see R.mergeDeepWithKey, R.merge, R.mergeWith
 * @example
 *
 *      let concatValues = (k, l, r) => k == 'values' ? R.concat(l, r) : r
 *      R.mergeWithKey(concatValues,
 *                     { a: true, thing: 'foo', values: [10, 20] },
 *                     { b: true, thing: 'bar', values: [15, 35] });
 *      //=> { a: true, b: true, thing: 'bar', values: [10, 20, 15, 35] }
 * @symb R.mergeWithKey(f, { x: 1, y: 2 }, { y: 5, z: 3 }) = { x: 1, y: f('y', 2, 5), z: 3 }
 */

var mergeWithKey =
/*#__PURE__*/
_curry3(function mergeWithKey(fn, l, r) {
  var result = {};
  var k;

  for (k in l) {
    if (_has(k, l)) {
      result[k] = _has(k, r) ? fn(k, l[k], r[k]) : l[k];
    }
  }

  for (k in r) {
    if (_has(k, r) && !_has(k, result)) {
      result[k] = r[k];
    }
  }

  return result;
});

export default mergeWithKey;import _curry2 from "./internal/_curry2.js";
/**
 * Returns the smaller of its two arguments.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig Ord a => a -> a -> a
 * @param {*} a
 * @param {*} b
 * @return {*}
 * @see R.minBy, R.max
 * @example
 *
 *      R.min(789, 123); //=> 123
 *      R.min('a', 'b'); //=> 'a'
 */

var min =
/*#__PURE__*/
_curry2(function min(a, b) {
  return b < a ? b : a;
});

export default min;import _curry3 from "./internal/_curry3.js";
/**
 * Takes a function and two values, and returns whichever value produces the
 * smaller result when passed to the provided function.
 *
 * @func
 * @memberOf R
 * @since v0.8.0
 * @category Relation
 * @sig Ord b => (a -> b) -> a -> a -> a
 * @param {Function} f
 * @param {*} a
 * @param {*} b
 * @return {*}
 * @see R.min, R.maxBy
 * @example
 *
 *      //  square :: Number -> Number
 *      const square = n => n * n;
 *
 *      R.minBy(square, -3, 2); //=> 2
 *
 *      R.reduce(R.minBy(square), Infinity, [3, -5, 4, 1, -2]); //=> 1
 *      R.reduce(R.minBy(square), Infinity, []); //=> Infinity
 */

var minBy =
/*#__PURE__*/
_curry3(function minBy(f, a, b) {
  return f(b) < f(a) ? b : a;
});

export default minBy;import _curry3 from "./internal/_curry3.js";
import modifyPath from "./modifyPath.js";
/**
 * Creates a copy of the passed object by applying an `fn` function to the given `prop` property.
 *
 * The function will not be invoked, and the object will not change
 * if its corresponding property does not exist in the object.
 * All non-primitive properties are copied to the new object by reference.
 *
 * @func
 * @memberOf R
 * @since v0.28.0
 * @category Object
 * @sig Idx -> (v -> v) -> {k: v} -> {k: v}
 * @param {String|Number} prop The property to be modified.
 * @param {Function} fn The function to apply to the property.
 * @param {Object} object The object to be transformed.
 * @return {Object} The transformed object.
 * @example
 *
 *      const person = {name: 'James', age: 20, pets: ['dog', 'cat']};
 *      R.modify('age', R.add(1), person); //=> {name: 'James', age: 21, pets: ['dog', 'cat']}
 *      R.modify('pets', R.append('turtle'), person); //=> {name: 'James', age: 20, pets: ['dog', 'cat', 'turtle']}
 */

var modify =
/*#__PURE__*/
_curry3(function modify(prop, fn, object) {
  return modifyPath([prop], fn, object);
});

export default modify;import _curry3 from "./internal/_curry3.js";
import _isArray from "./internal/_isArray.js";
import _isObject from "./internal/_isObject.js";
import _has from "./internal/_has.js";
import _assoc from "./internal/_assoc.js";
import _modify from "./internal/_modify.js";
/**
 * Creates a shallow clone of the passed object by applying an `fn` function
 * to the value at the given path.
 *
 * The function will not be invoked, and the object will not change
 * if its corresponding path does not exist in the object.
 * All non-primitive properties are copied to the new object by reference.
 *
 * @func
 * @memberOf R
 * @since v0.28.0
 * @category Object
 * @sig [Idx] -> (v -> v) -> {k: v} -> {k: v}
 * @param {Array} path The path to be modified.
 * @param {Function} fn The function to apply to the path.
 * @param {Object} object The object to be transformed.
 * @return {Object} The transformed object.
 * @example
 *
 *      const person = {name: 'James', address: { zipCode: '90216' }};
 *      R.modifyPath(['address', 'zipCode'], R.reverse, person); //=> {name: 'James', address: { zipCode: '61209' }}
 *
 *      // Can handle arrays too
 *      const person = {name: 'James', addresses: [{ zipCode: '90216' }]};
 *      R.modifyPath(['addresses', 0, 'zipCode'], R.reverse, person); //=> {name: 'James', addresses: [{ zipCode: '61209' }]}
 */

var modifyPath =
/*#__PURE__*/
_curry3(function modifyPath(path, fn, object) {
  if (!_isObject(object) && !_isArray(object) || path.length === 0) {
    return object;
  }

  var idx = path[0];

  if (!_has(idx, object)) {
    return object;
  }

  if (path.length === 1) {
    return _modify(idx, fn, object);
  }

  var val = modifyPath(Array.prototype.slice.call(path, 1), fn, object[idx]);

  if (val === object[idx]) {
    return object;
  }

  return _assoc(idx, val, object);
});

export default modifyPath;import _curry2 from "./internal/_curry2.js";
/**
 * Divides the first parameter by the second and returns the remainder. Note
 * that this function preserves the JavaScript-style behavior for modulo. For
 * mathematical modulo see [`mathMod`](#mathMod).
 *
 * @func
 * @memberOf R
 * @since v0.1.1
 * @category Math
 * @sig Number -> Number -> Number
 * @param {Number} a The value to the divide.
 * @param {Number} b The pseudo-modulus
 * @return {Number} The result of `b % a`.
 * @see R.mathMod
 * @example
 *
 *      R.modulo(17, 3); //=> 2
 *      // JS behavior:
 *      R.modulo(-17, 3); //=> -2
 *      R.modulo(17, -3); //=> 2
 *
 *      const isOdd = R.modulo(R.__, 2);
 *      isOdd(42); //=> 0
 *      isOdd(21); //=> 1
 */

var modulo =
/*#__PURE__*/
_curry2(function modulo(a, b) {
  return a % b;
});

export default modulo;import _curry3 from "./internal/_curry3.js";
/**
 * Move an item, at index `from`, to index `to`, in a list of elements.
 * A new list will be created containing the new elements order.
 *
 * @func
 * @memberOf R
 * @since v0.27.1
 * @category List
 * @sig Number -> Number -> [a] -> [a]
 * @param {Number} from The source index
 * @param {Number} to The destination index
 * @param {Array} list The list which will serve to realise the move
 * @return {Array} The new list reordered
 * @example
 *
 *      R.move(0, 2, ['a', 'b', 'c', 'd', 'e', 'f']); //=> ['b', 'c', 'a', 'd', 'e', 'f']
 *      R.move(-1, 0, ['a', 'b', 'c', 'd', 'e', 'f']); //=> ['f', 'a', 'b', 'c', 'd', 'e'] list rotation
 */

var move =
/*#__PURE__*/
_curry3(function (from, to, list) {
  var length = list.length;
  var result = list.slice();
  var positiveFrom = from < 0 ? length + from : from;
  var positiveTo = to < 0 ? length + to : to;
  var item = result.splice(positiveFrom, 1);
  return positiveFrom < 0 || positiveFrom >= list.length || positiveTo < 0 || positiveTo >= list.length ? list : [].concat(result.slice(0, positiveTo)).concat(item).concat(result.slice(positiveTo, list.length));
});

export default move;import _curry2 from "./internal/_curry2.js";
/**
 * Multiplies two numbers. Equivalent to `a * b` but curried.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Math
 * @sig Number -> Number -> Number
 * @param {Number} a The first value.
 * @param {Number} b The second value.
 * @return {Number} The result of `a * b`.
 * @see R.divide
 * @example
 *
 *      const double = R.multiply(2);
 *      const triple = R.multiply(3);
 *      double(3);       //=>  6
 *      triple(4);       //=> 12
 *      R.multiply(2, 5);  //=> 10
 */

var multiply =
/*#__PURE__*/
_curry2(function multiply(a, b) {
  return a * b;
});

export default multiply;import _curry2 from "./internal/_curry2.js";
/**
 * Wraps a function of any arity (including nullary) in a function that accepts
 * exactly `n` parameters. Any extraneous parameters will not be passed to the
 * supplied function.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig Number -> (* -> a) -> (* -> a)
 * @param {Number} n The desired arity of the new function.
 * @param {Function} fn The function to wrap.
 * @return {Function} A new function wrapping `fn`. The new function is guaranteed to be of
 *         arity `n`.
 * @see R.binary, R.unary
 * @example
 *
 *      const takesTwoArgs = (a, b) => [a, b];
 *
 *      takesTwoArgs.length; //=> 2
 *      takesTwoArgs(1, 2); //=> [1, 2]
 *
 *      const takesOneArg = R.nAry(1, takesTwoArgs);
 *      takesOneArg.length; //=> 1
 *      // Only `n` arguments are passed to the wrapped function
 *      takesOneArg(1, 2); //=> [1, undefined]
 * @symb R.nAry(0, f)(a, b) = f()
 * @symb R.nAry(1, f)(a, b) = f(a)
 * @symb R.nAry(2, f)(a, b) = f(a, b)
 */

var nAry =
/*#__PURE__*/
_curry2(function nAry(n, fn) {
  switch (n) {
    case 0:
      return function () {
        return fn.call(this);
      };

    case 1:
      return function (a0) {
        return fn.call(this, a0);
      };

    case 2:
      return function (a0, a1) {
        return fn.call(this, a0, a1);
      };

    case 3:
      return function (a0, a1, a2) {
        return fn.call(this, a0, a1, a2);
      };

    case 4:
      return function (a0, a1, a2, a3) {
        return fn.call(this, a0, a1, a2, a3);
      };

    case 5:
      return function (a0, a1, a2, a3, a4) {
        return fn.call(this, a0, a1, a2, a3, a4);
      };

    case 6:
      return function (a0, a1, a2, a3, a4, a5) {
        return fn.call(this, a0, a1, a2, a3, a4, a5);
      };

    case 7:
      return function (a0, a1, a2, a3, a4, a5, a6) {
        return fn.call(this, a0, a1, a2, a3, a4, a5, a6);
      };

    case 8:
      return function (a0, a1, a2, a3, a4, a5, a6, a7) {
        return fn.call(this, a0, a1, a2, a3, a4, a5, a6, a7);
      };

    case 9:
      return function (a0, a1, a2, a3, a4, a5, a6, a7, a8) {
        return fn.call(this, a0, a1, a2, a3, a4, a5, a6, a7, a8);
      };

    case 10:
      return function (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) {
        return fn.call(this, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
      };

    default:
      throw new Error('First argument to nAry must be a non-negative integer no greater than ten');
  }
});

export default nAry;import _curry1 from "./internal/_curry1.js";
/**
 * Negates its argument.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Math
 * @sig Number -> Number
 * @param {Number} n
 * @return {Number}
 * @example
 *
 *      R.negate(42); //=> -42
 */

var negate =
/*#__PURE__*/
_curry1(function negate(n) {
  return -n;
});

export default negate;import _complement from "./internal/_complement.js";
import _curry2 from "./internal/_curry2.js";
import all from "./all.js";
/**
 * Returns `true` if no elements of the list match the predicate, `false`
 * otherwise.
 *
 * Dispatches to the `all` method of the second argument, if present.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.12.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> Boolean
 * @param {Function} fn The predicate function.
 * @param {Array} list The array to consider.
 * @return {Boolean} `true` if the predicate is not satisfied by every element, `false` otherwise.
 * @see R.all, R.any
 * @example
 *
 *      const isEven = n => n % 2 === 0;
 *      const isOdd = n => n % 2 !== 0;
 *
 *      R.none(isEven, [1, 3, 5, 7, 9, 11]); //=> true
 *      R.none(isOdd, [1, 3, 5, 7, 8, 11]); //=> false
 */

var none =
/*#__PURE__*/
_curry2(function none(fn, input) {
  return all(_complement(fn), input);
});

export default none;import _curry1 from "./internal/_curry1.js";
/**
 * A function that returns the `!` of its argument. It will return `true` when
 * passed false-y value, and `false` when passed a truth-y one.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Logic
 * @sig * -> Boolean
 * @param {*} a any value
 * @return {Boolean} the logical inverse of passed argument.
 * @see R.complement
 * @example
 *
 *      R.not(true); //=> false
 *      R.not(false); //=> true
 *      R.not(0); //=> true
 *      R.not(1); //=> false
 */

var not =
/*#__PURE__*/
_curry1(function not(a) {
  return !a;
});

export default not;import _curry2 from "./internal/_curry2.js";
import _isString from "./internal/_isString.js";
/**
 * Returns the nth element of the given list or string. If n is negative the
 * element at index length + n is returned.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig Number -> [a] -> a | Undefined
 * @sig Number -> String -> String
 * @param {Number} offset
 * @param {*} list
 * @return {*}
 * @example
 *
 *      const list = ['foo', 'bar', 'baz', 'quux'];
 *      R.nth(1, list); //=> 'bar'
 *      R.nth(-1, list); //=> 'quux'
 *      R.nth(-99, list); //=> undefined
 *
 *      R.nth(2, 'abc'); //=> 'c'
 *      R.nth(3, 'abc'); //=> ''
 * @symb R.nth(-1, [a, b, c]) = c
 * @symb R.nth(0, [a, b, c]) = a
 * @symb R.nth(1, [a, b, c]) = b
 */

var nth =
/*#__PURE__*/
_curry2(function nth(offset, list) {
  var idx = offset < 0 ? list.length + offset : offset;
  return _isString(list) ? list.charAt(idx) : list[idx];
});

export default nth;import _curry1 from "./internal/_curry1.js";
import curryN from "./curryN.js";
import nth from "./nth.js";
/**
 * Returns a function which returns its nth argument.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category Function
 * @sig Number -> *... -> *
 * @param {Number} n
 * @return {Function}
 * @example
 *
 *      R.nthArg(1)('a', 'b', 'c'); //=> 'b'
 *      R.nthArg(-1)('a', 'b', 'c'); //=> 'c'
 * @symb R.nthArg(-1)(a, b, c) = c
 * @symb R.nthArg(0)(a, b, c) = a
 * @symb R.nthArg(1)(a, b, c) = b
 */

var nthArg =
/*#__PURE__*/
_curry1(function nthArg(n) {
  var arity = n < 0 ? 1 : n + 1;
  return curryN(arity, function () {
    return nth(n, arguments);
  });
});

export default nthArg;import _curry3 from "./internal/_curry3.js";
/**
 * `o` is a curried composition function that returns a unary function.
 * Like [`compose`](#compose), `o` performs right-to-left function composition.
 * Unlike [`compose`](#compose), the rightmost function passed to `o` will be
 * invoked with only one argument. Also, unlike [`compose`](#compose), `o` is
 * limited to accepting only 2 unary functions. The name o was chosen because
 * of its similarity to the mathematical composition operator ∘.
 *
 * @func
 * @memberOf R
 * @since v0.24.0
 * @category Function
 * @sig (b -> c) -> (a -> b) -> a -> c
 * @param {Function} f
 * @param {Function} g
 * @return {Function}
 * @see R.compose, R.pipe
 * @example
 *
 *      const classyGreeting = name => "The name's " + name.last + ", " + name.first + " " + name.last
 *      const yellGreeting = R.o(R.toUpper, classyGreeting);
 *      yellGreeting({first: 'James', last: 'Bond'}); //=> "THE NAME'S BOND, JAMES BOND"
 *
 *      R.o(R.multiply(10), R.add(10))(-4) //=> 60
 *
 * @symb R.o(f, g, x) = f(g(x))
 */

var o =
/*#__PURE__*/
_curry3(function o(f, g, x) {
  return f(g(x));
});

export default o;import _curry2 from "./internal/_curry2.js";
/**
 * Creates an object containing a single key:value pair.
 *
 * @func
 * @memberOf R
 * @since v0.18.0
 * @category Object
 * @sig String -> a -> {String:a}
 * @param {String} key
 * @param {*} val
 * @return {Object}
 * @see R.pair
 * @example
 *
 *      const matchPhrases = R.compose(
 *        R.objOf('must'),
 *        R.map(R.objOf('match_phrase'))
 *      );
 *      matchPhrases(['foo', 'bar', 'baz']); //=> {must: [{match_phrase: 'foo'}, {match_phrase: 'bar'}, {match_phrase: 'baz'}]}
 */

var objOf =
/*#__PURE__*/
_curry2(function objOf(key, val) {
  var obj = {};
  obj[key] = val;
  return obj;
});

export default objOf;import _curry1 from "./internal/_curry1.js";
import _of from "./internal/_of.js";
/**
 * Returns a singleton array containing the value provided.
 *
 * Note this `of` is different from the ES6 `of`; See
 * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/of
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category Function
 * @sig a -> [a]
 * @param {*} x any value
 * @return {Array} An array wrapping `x`.
 * @example
 *
 *      R.of(null); //=> [null]
 *      R.of([42]); //=> [[42]]
 */

var of =
/*#__PURE__*/
_curry1(_of);

export default of;import _curry2 from "./internal/_curry2.js";
/**
 * Returns a partial copy of an object omitting the keys specified.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @sig [String] -> {String: *} -> {String: *}
 * @param {Array} names an array of String property names to omit from the new object
 * @param {Object} obj The object to copy from
 * @return {Object} A new object with properties from `names` not on it.
 * @see R.pick
 * @example
 *
 *      R.omit(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, c: 3}
 */

var omit =
/*#__PURE__*/
_curry2(function omit(names, obj) {
  var result = {};
  var index = {};
  var idx = 0;
  var len = names.length;

  while (idx < len) {
    index[names[idx]] = 1;
    idx += 1;
  }

  for (var prop in obj) {
    if (!index.hasOwnProperty(prop)) {
      result[prop] = obj[prop];
    }
  }

  return result;
});

export default omit;import curryN from "./internal/_curryN.js";
/**
 * Takes a binary function `f`, a unary function `g`, and two values.
 * Applies `g` to each value, then applies the result of each to `f`.
 *
 * Also known as the P combinator.
 *
 * @func
 * @memberOf R
 * @since v0.28.0
 * @category Function
 * @sig ((a, a) -> b) -> (c -> a) -> c -> c -> b
 * @param {Function} f a binary function
 * @param {Function} g a unary function
 * @param {any} a any value
 * @param {any} b any value
 * @return {any} The result of `f`
 * @example
 *
 *      const eqBy = R.on((a, b) => a === b);
 *      eqBy(R.prop('a'), {b:0, a:1}, {a:1}) //=> true;
 *
 *      const containsInsensitive = R.on(R.contains, R.toLower);
 *      containsInsensitive('o', 'FOO'); //=> true
 * @symb R.on(f, g, a, b) = f(g(a), g(b))
 */

var on =
/*#__PURE__*/
curryN(4, [], function on(f, g, a, b) {
  return f(g(a), g(b));
});
export default on;import _arity from "./internal/_arity.js";
import _curry1 from "./internal/_curry1.js";
/**
 * Accepts a function `fn` and returns a function that guards invocation of
 * `fn` such that `fn` can only ever be called once, no matter how many times
 * the returned function is invoked. The first value calculated is returned in
 * subsequent invocations.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig (a... -> b) -> (a... -> b)
 * @param {Function} fn The function to wrap in a call-only-once wrapper.
 * @return {Function} The wrapped function.
 * @example
 *
 *      const addOneOnce = R.once(x => x + 1);
 *      addOneOnce(10); //=> 11
 *      addOneOnce(addOneOnce(50)); //=> 11
 */

var once =
/*#__PURE__*/
_curry1(function once(fn) {
  var called = false;
  var result;
  return _arity(fn.length, function () {
    if (called) {
      return result;
    }

    called = true;
    result = fn.apply(this, arguments);
    return result;
  });
});

export default once;import _curry2 from "./internal/_curry2.js";
/**
 * Returns the first argument if it is truthy, otherwise the second argument.
 * Acts as the boolean `or` statement if both inputs are `Boolean`s.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Logic
 * @sig a -> b -> a | b
 * @param {Any} a
 * @param {Any} b
 * @return {Any}
 * @see R.either, R.and
 * @example
 *
 *      R.or(true, true); //=> true
 *      R.or(true, false); //=> true
 *      R.or(false, true); //=> true
 *      R.or(false, false); //=> false
 */

var or =
/*#__PURE__*/
_curry2(function or(a, b) {
  return a || b;
});

export default or;import _curry2 from "./internal/_curry2.js";
import _assertPromise from "./internal/_assertPromise.js";
/**
 * Returns the result of applying the onFailure function to the value inside
 * a failed promise. This is useful for handling rejected promises
 * inside function compositions.
 *
 * @func
 * @memberOf R
 * @since v0.26.0
 * @category Function
 * @sig (e -> b) -> (Promise e a) -> (Promise e b)
 * @sig (e -> (Promise f b)) -> (Promise e a) -> (Promise f b)
 * @param {Function} onFailure The function to apply. Can return a value or a promise of a value.
 * @param {Promise} p
 * @return {Promise} The result of calling `p.then(null, onFailure)`
 * @see R.andThen
 * @example
 *
 *      const failedFetch = id => Promise.reject('bad ID');
 *      const useDefault = () => ({ firstName: 'Bob', lastName: 'Loblaw' });
 *
 *      //recoverFromFailure :: String -> Promise ({ firstName, lastName })
 *      const recoverFromFailure = R.pipe(
 *        failedFetch,
 *        R.otherwise(useDefault),
 *        R.andThen(R.pick(['firstName', 'lastName'])),
 *      );
 *      recoverFromFailure(12345).then(console.log);
 */

var otherwise =
/*#__PURE__*/
_curry2(function otherwise(f, p) {
  _assertPromise('otherwise', p);

  return p.then(null, f);
});

export default otherwise;import _curry3 from "./internal/_curry3.js"; // `Identity` is a functor that holds a single value, where `map` simply
// transforms the held value with the provided function.

var Identity = function (x) {
  return {
    value: x,
    map: function (f) {
      return Identity(f(x));
    }
  };
};
/**
 * Returns the result of "setting" the portion of the given data structure
 * focused by the given lens to the result of applying the given function to
 * the focused value.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category Object
 * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
 * @sig Lens s a -> (a -> a) -> s -> s
 * @param {Lens} lens
 * @param {*} v
 * @param {*} x
 * @return {*}
 * @see R.view, R.set, R.lens, R.lensIndex, R.lensProp, R.lensPath
 * @example
 *
 *      const headLens = R.lensIndex(0);
 *
 *      R.over(headLens, R.toUpper, ['foo', 'bar', 'baz']); //=> ['FOO', 'bar', 'baz']
 */


var over =
/*#__PURE__*/
_curry3(function over(lens, f, x) {
  // The value returned by the getter function is first transformed with `f`,
  // then set as the value of an `Identity`. This is then mapped over with the
  // setter function of the lens.
  return lens(function (y) {
    return Identity(f(y));
  })(x).value;
});

export default over;{"type":"module"}import _curry2 from "./internal/_curry2.js";
/**
 * Takes two arguments, `fst` and `snd`, and returns `[fst, snd]`.
 *
 * @func
 * @memberOf R
 * @since v0.18.0
 * @category List
 * @sig a -> b -> (a,b)
 * @param {*} fst
 * @param {*} snd
 * @return {Array}
 * @see R.objOf, R.of
 * @example
 *
 *      R.pair('foo', 'bar'); //=> ['foo', 'bar']
 */

var pair =
/*#__PURE__*/
_curry2(function pair(fst, snd) {
  return [fst, snd];
});

export default pair;import _concat from "./internal/_concat.js";
import _createPartialApplicator from "./internal/_createPartialApplicator.js";
/**
 * Takes a function `f` and a list of arguments, and returns a function `g`.
 * When applied, `g` returns the result of applying `f` to the arguments
 * provided initially followed by the arguments provided to `g`.
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category Function
 * @sig ((a, b, c, ..., n) -> x) -> [a, b, c, ...] -> ((d, e, f, ..., n) -> x)
 * @param {Function} f
 * @param {Array} args
 * @return {Function}
 * @see R.partialRight, R.curry
 * @example
 *
 *      const multiply2 = (a, b) => a * b;
 *      const double = R.partial(multiply2, [2]);
 *      double(3); //=> 6
 *
 *      const greet = (salutation, title, firstName, lastName) =>
 *        salutation + ', ' + title + ' ' + firstName + ' ' + lastName + '!';
 *
 *      const sayHello = R.partial(greet, ['Hello']);
 *      const sayHelloToMs = R.partial(sayHello, ['Ms.']);
 *      sayHelloToMs('Jane', 'Jones'); //=> 'Hello, Ms. Jane Jones!'
 * @symb R.partial(f, [a, b])(c, d) = f(a, b, c, d)
 */

var partial =
/*#__PURE__*/
_createPartialApplicator(_concat);

export default partial;import mergeDeepRight from "./mergeDeepRight.js";
import _curry2 from "./internal/_curry2.js";
/**
 * Takes a function `f` and an object, and returns a function `g`.
 * When applied, `g` returns the result of applying `f` to the object
 * provided initially merged deeply (right) with the object provided as an argument to `g`.
 *
 * @func
 * @memberOf R
 * @since v0.28.0
 * @category Function
 * @sig (({ a, b, c, ..., n }) -> x) -> { a, b, c, ...} -> ({ d, e, f, ..., n } -> x)
 * @param {Function} f
 * @param {Object} props
 * @return {Function}
 * @see R.partial, R.partialRight, R.curry, R.mergeDeepRight
 * @example
 *
 *      const multiply2 = ({ a, b }) => a * b;
 *      const double = R.partialObject(multiply2, { a: 2 });
 *      double({ b: 2 }); //=> 4
 *
 *      const greet = ({ salutation, title, firstName, lastName }) =>
 *        salutation + ', ' + title + ' ' + firstName + ' ' + lastName + '!';
 *
 *      const sayHello = R.partialObject(greet, { salutation: 'Hello' });
 *      const sayHelloToMs = R.partialObject(sayHello, { title: 'Ms.' });
 *      sayHelloToMs({ firstName: 'Jane', lastName: 'Jones' }); //=> 'Hello, Ms. Jane Jones!'
 * @symb R.partialObject(f, { a, b })({ c, d }) = f({ a, b, c, d })
 */

export default
/*#__PURE__*/
_curry2((f, o) => props => f.call(this, mergeDeepRight(o, props)));import _concat from "./internal/_concat.js";
import _createPartialApplicator from "./internal/_createPartialApplicator.js";
import flip from "./flip.js";
/**
 * Takes a function `f` and a list of arguments, and returns a function `g`.
 * When applied, `g` returns the result of applying `f` to the arguments
 * provided to `g` followed by the arguments provided initially.
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category Function
 * @sig ((a, b, c, ..., n) -> x) -> [d, e, f, ..., n] -> ((a, b, c, ...) -> x)
 * @param {Function} f
 * @param {Array} args
 * @return {Function}
 * @see R.partial
 * @example
 *
 *      const greet = (salutation, title, firstName, lastName) =>
 *        salutation + ', ' + title + ' ' + firstName + ' ' + lastName + '!';
 *
 *      const greetMsJaneJones = R.partialRight(greet, ['Ms.', 'Jane', 'Jones']);
 *
 *      greetMsJaneJones('Hello'); //=> 'Hello, Ms. Jane Jones!'
 * @symb R.partialRight(f, [a, b])(c, d) = f(c, d, a, b)
 */

var partialRight =
/*#__PURE__*/
_createPartialApplicator(
/*#__PURE__*/
flip(_concat));

export default partialRight;import filter from "./filter.js";
import juxt from "./juxt.js";
import reject from "./reject.js";
/**
 * Takes a predicate and a list or other `Filterable` object and returns the
 * pair of filterable objects of the same type of elements which do and do not
 * satisfy, the predicate, respectively. Filterable objects include plain objects or any object
 * that has a filter method such as `Array`.
 *
 * @func
 * @memberOf R
 * @since v0.1.4
 * @category List
 * @sig Filterable f => (a -> Boolean) -> f a -> [f a, f a]
 * @param {Function} pred A predicate to determine which side the element belongs to.
 * @param {Array} filterable the list (or other filterable) to partition.
 * @return {Array} An array, containing first the subset of elements that satisfy the
 *         predicate, and second the subset of elements that do not satisfy.
 * @see R.filter, R.reject
 * @example
 *
 *      R.partition(R.includes('s'), ['sss', 'ttt', 'foo', 'bars']);
 *      // => [ [ 'sss', 'bars' ],  [ 'ttt', 'foo' ] ]
 *
 *      R.partition(R.includes('s'), { a: 'sss', b: 'ttt', foo: 'bars' });
 *      // => [ { a: 'sss', foo: 'bars' }, { b: 'ttt' }  ]
 */

var partition =
/*#__PURE__*/
juxt([filter, reject]);
export default partition;import _curry2 from "./internal/_curry2.js";
import paths from "./paths.js";
/**
 * Retrieve the value at a given path.
 *
 * @func
 * @memberOf R
 * @since v0.2.0
 * @category Object
 * @typedefn Idx = String | Int | Symbol
 * @sig [Idx] -> {a} -> a | Undefined
 * @param {Array} path The path to use.
 * @param {Object} obj The object to retrieve the nested property from.
 * @return {*} The data at `path`.
 * @see R.prop, R.nth
 * @example
 *
 *      R.path(['a', 'b'], {a: {b: 2}}); //=> 2
 *      R.path(['a', 'b'], {c: {b: 2}}); //=> undefined
 *      R.path(['a', 'b', 0], {a: {b: [1, 2, 3]}}); //=> 1
 *      R.path(['a', 'b', -2], {a: {b: [1, 2, 3]}}); //=> 2
 */

var path =
/*#__PURE__*/
_curry2(function path(pathAr, obj) {
  return paths([pathAr], obj)[0];
});

export default path;import _curry3 from "./internal/_curry3.js";
import equals from "./equals.js";
import path from "./path.js";
/**
 * Determines whether a nested path on an object has a specific value, in
 * [`R.equals`](#equals) terms. Most likely used to filter a list.
 *
 * @func
 * @memberOf R
 * @since v0.7.0
 * @category Relation
 * @typedefn Idx = String | Int | Symbol
 * @sig [Idx] -> a -> {a} -> Boolean
 * @param {Array} path The path of the nested property to use
 * @param {*} val The value to compare the nested property with
 * @param {Object} obj The object to check the nested property in
 * @return {Boolean} `true` if the value equals the nested object property,
 *         `false` otherwise.
 * @example
 *
 *      const user1 = { address: { zipCode: 90210 } };
 *      const user2 = { address: { zipCode: 55555 } };
 *      const user3 = { name: 'Bob' };
 *      const users = [ user1, user2, user3 ];
 *      const isFamous = R.pathEq(['address', 'zipCode'], 90210);
 *      R.filter(isFamous, users); //=> [ user1 ]
 */

var pathEq =
/*#__PURE__*/
_curry3(function pathEq(_path, val, obj) {
  return equals(path(_path, obj), val);
});

export default pathEq;import _curry3 from "./internal/_curry3.js";
import defaultTo from "./defaultTo.js";
import path from "./path.js";
/**
 * If the given, non-null object has a value at the given path, returns the
 * value at that path. Otherwise returns the provided default value.
 *
 * @func
 * @memberOf R
 * @since v0.18.0
 * @category Object
 * @typedefn Idx = String | Int | Symbol
 * @sig a -> [Idx] -> {a} -> a
 * @param {*} d The default value.
 * @param {Array} p The path to use.
 * @param {Object} obj The object to retrieve the nested property from.
 * @return {*} The data at `path` of the supplied object or the default value.
 * @example
 *
 *      R.pathOr('N/A', ['a', 'b'], {a: {b: 2}}); //=> 2
 *      R.pathOr('N/A', ['a', 'b'], {c: {b: 2}}); //=> "N/A"
 */

var pathOr =
/*#__PURE__*/
_curry3(function pathOr(d, p, obj) {
  return defaultTo(d, path(p, obj));
});

export default pathOr;import _curry3 from "./internal/_curry3.js";
import path from "./path.js";
/**
 * Returns `true` if the specified object property at given path satisfies the
 * given predicate; `false` otherwise.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category Logic
 * @typedefn Idx = String | Int | Symbol
 * @sig (a -> Boolean) -> [Idx] -> {a} -> Boolean
 * @param {Function} pred
 * @param {Array} propPath
 * @param {*} obj
 * @return {Boolean}
 * @see R.propSatisfies, R.path
 * @example
 *
 *      R.pathSatisfies(y => y > 0, ['x', 'y'], {x: {y: 2}}); //=> true
 *      R.pathSatisfies(R.is(Object), [], {x: {y: 2}}); //=> true
 */

var pathSatisfies =
/*#__PURE__*/
_curry3(function pathSatisfies(pred, propPath, obj) {
  return pred(path(propPath, obj));
});

export default pathSatisfies;import _curry2 from "./internal/_curry2.js";
import _isInteger from "./internal/_isInteger.js";
import nth from "./nth.js";
/**
 * Retrieves the values at given paths of an object.
 *
 * @func
 * @memberOf R
 * @since v0.27.1
 * @category Object
 * @typedefn Idx = [String | Int | Symbol]
 * @sig [Idx] -> {a} -> [a | Undefined]
 * @param {Array} pathsArray The array of paths to be fetched.
 * @param {Object} obj The object to retrieve the nested properties from.
 * @return {Array} A list consisting of values at paths specified by "pathsArray".
 * @see R.path
 * @example
 *
 *      R.paths([['a', 'b'], ['p', 0, 'q']], {a: {b: 2}, p: [{q: 3}]}); //=> [2, 3]
 *      R.paths([['a', 'b'], ['p', 'r']], {a: {b: 2}, p: [{q: 3}]}); //=> [2, undefined]
 */

var paths =
/*#__PURE__*/
_curry2(function paths(pathsArray, obj) {
  return pathsArray.map(function (paths) {
    var val = obj;
    var idx = 0;
    var p;

    while (idx < paths.length) {
      if (val == null) {
        return;
      }

      p = paths[idx];
      val = _isInteger(p) ? nth(p, val) : val[p];
      idx += 1;
    }

    return val;
  });
});

export default paths;import _curry2 from "./internal/_curry2.js";
/**
 * Returns a partial copy of an object containing only the keys specified. If
 * the key does not exist, the property is ignored.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @sig [k] -> {k: v} -> {k: v}
 * @param {Array} names an array of String property names to copy onto a new object
 * @param {Object} obj The object to copy from
 * @return {Object} A new object with only properties from `names` on it.
 * @see R.omit, R.props
 * @example
 *
 *      R.pick(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, d: 4}
 *      R.pick(['a', 'e', 'f'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1}
 */

var pick =
/*#__PURE__*/
_curry2(function pick(names, obj) {
  var result = {};
  var idx = 0;

  while (idx < names.length) {
    if (names[idx] in obj) {
      result[names[idx]] = obj[names[idx]];
    }

    idx += 1;
  }

  return result;
});

export default pick;import _curry2 from "./internal/_curry2.js";
/**
 * Similar to `pick` except that this one includes a `key: undefined` pair for
 * properties that don't exist.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @sig [k] -> {k: v} -> {k: v}
 * @param {Array} names an array of String property names to copy onto a new object
 * @param {Object} obj The object to copy from
 * @return {Object} A new object with only properties from `names` on it.
 * @see R.pick
 * @example
 *
 *      R.pickAll(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, d: 4}
 *      R.pickAll(['a', 'e', 'f'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, e: undefined, f: undefined}
 */

var pickAll =
/*#__PURE__*/
_curry2(function pickAll(names, obj) {
  var result = {};
  var idx = 0;
  var len = names.length;

  while (idx < len) {
    var name = names[idx];
    result[name] = obj[name];
    idx += 1;
  }

  return result;
});

export default pickAll;import _curry2 from "./internal/_curry2.js";
/**
 * Returns a partial copy of an object containing only the keys that satisfy
 * the supplied predicate.
 *
 * @func
 * @memberOf R
 * @since v0.8.0
 * @category Object
 * @sig ((v, k) -> Boolean) -> {k: v} -> {k: v}
 * @param {Function} pred A predicate to determine whether or not a key
 *        should be included on the output object.
 * @param {Object} obj The object to copy from
 * @return {Object} A new object with only properties that satisfy `pred`
 *         on it.
 * @see R.pick, R.filter
 * @example
 *
 *      const isUpperCase = (val, key) => key.toUpperCase() === key;
 *      R.pickBy(isUpperCase, {a: 1, b: 2, A: 3, B: 4}); //=> {A: 3, B: 4}
 */

var pickBy =
/*#__PURE__*/
_curry2(function pickBy(test, obj) {
  var result = {};

  for (var prop in obj) {
    if (test(obj[prop], prop, obj)) {
      result[prop] = obj[prop];
    }
  }

  return result;
});

export default pickBy;import _arity from "./internal/_arity.js";
import _pipe from "./internal/_pipe.js";
import reduce from "./reduce.js";
import tail from "./tail.js";
/**
 * Performs left-to-right function composition. The first argument may have
 * any arity; the remaining arguments must be unary.
 *
 * In some libraries this function is named `sequence`.
 *
 * **Note:** The result of pipe is not automatically curried.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig (((a, b, ..., n) -> o), (o -> p), ..., (x -> y), (y -> z)) -> ((a, b, ..., n) -> z)
 * @param {...Function} functions
 * @return {Function}
 * @see R.compose
 * @example
 *
 *      const f = R.pipe(Math.pow, R.negate, R.inc);
 *
 *      f(3, 4); // -(3^4) + 1
 * @symb R.pipe(f, g, h)(a, b) = h(g(f(a, b)))
 * @symb R.pipe(f, g, h)(a)(b) = h(g(f(a)))(b)
 */

export default function pipe() {
  if (arguments.length === 0) {
    throw new Error('pipe requires at least one argument');
  }

  return _arity(arguments[0].length, reduce(_pipe, arguments[0], tail(arguments)));
}import _arity from "./internal/_arity.js";
import _curry2 from "./internal/_curry2.js";
import head from "./head.js";
import _reduce from "./internal/_reduce.js";
import tail from "./tail.js";
import identity from "./identity.js";
/**
 * Performs left-to-right function composition using transforming function. The first function may have
 * any arity; the remaining functions must be unary.
 *
 * **Note:** The result of pipeWith is not automatically curried. Transforming function is not used on the
 * first argument.
 *
 * @func
 * @memberOf R
 * @since v0.26.0
 * @category Function
 * @sig ((* -> *), [((a, b, ..., n) -> o), (o -> p), ..., (x -> y), (y -> z)]) -> ((a, b, ..., n) -> z)
 * @param {Function} transformer The transforming function
 * @param {Array} functions The functions to pipe
 * @return {Function}
 * @see R.composeWith, R.pipe
 * @example
 *
 *      const pipeWhileNotNil = R.pipeWith((f, res) => R.isNil(res) ? res : f(res));
 *      const f = pipeWhileNotNil([Math.pow, R.negate, R.inc])
 *
 *      f(3, 4); // -(3^4) + 1
 * @symb R.pipeWith(f)([g, h, i])(...args) = f(i, f(h, g(...args)))
 */

var pipeWith =
/*#__PURE__*/
_curry2(function pipeWith(xf, list) {
  if (list.length <= 0) {
    return identity;
  }

  var headList = head(list);
  var tailList = tail(list);
  return _arity(headList.length, function () {
    return _reduce(function (result, f) {
      return xf.call(this, f, result);
    }, headList.apply(this, arguments), tailList);
  });
});

export default pipeWith;import _curry2 from "./internal/_curry2.js";
import map from "./map.js";
import prop from "./prop.js";
/**
 * Returns a new list by plucking the same named property off all objects in
 * the list supplied.
 *
 * `pluck` will work on
 * any [functor](https://github.com/fantasyland/fantasy-land#functor) in
 * addition to arrays, as it is equivalent to `R.map(R.prop(k), f)`.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig Functor f => k -> f {k: v} -> f v
 * @param {Number|String} key The key name to pluck off of each object.
 * @param {Array} f The array or functor to consider.
 * @return {Array} The list of values for the given key.
 * @see R.project, R.prop, R.props
 * @example
 *
 *      var getAges = R.pluck('age');
 *      getAges([{name: 'fred', age: 29}, {name: 'wilma', age: 27}]); //=> [29, 27]
 *
 *      R.pluck(0, [[1, 2], [3, 4]]);               //=> [1, 3]
 *      R.pluck('val', {a: {val: 3}, b: {val: 5}}); //=> {a: 3, b: 5}
 * @symb R.pluck('x', [{x: 1, y: 2}, {x: 3, y: 4}, {x: 5, y: 6}]) = [1, 3, 5]
 * @symb R.pluck(0, [[1, 2], [3, 4], [5, 6]]) = [1, 3, 5]
 */

var pluck =
/*#__PURE__*/
_curry2(function pluck(p, list) {
  return map(prop(p), list);
});

export default pluck;import _concat from "./internal/_concat.js";
import _curry2 from "./internal/_curry2.js";
/**
 * Returns a new list with the given element at the front, followed by the
 * contents of the list.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig a -> [a] -> [a]
 * @param {*} el The item to add to the head of the output list.
 * @param {Array} list The array to add to the tail of the output list.
 * @return {Array} A new array.
 * @see R.append
 * @example
 *
 *      R.prepend('fee', ['fi', 'fo', 'fum']); //=> ['fee', 'fi', 'fo', 'fum']
 */

var prepend =
/*#__PURE__*/
_curry2(function prepend(el, list) {
  return _concat([el], list);
});

export default prepend;import multiply from "./multiply.js";
import reduce from "./reduce.js";
/**
 * Multiplies together all the elements of a list.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Math
 * @sig [Number] -> Number
 * @param {Array} list An array of numbers
 * @return {Number} The product of all the numbers in the list.
 * @see R.reduce
 * @example
 *
 *      R.product([2,4,6,8,100,1]); //=> 38400
 */

var product =
/*#__PURE__*/
reduce(multiply, 1);
export default product;import _map from "./internal/_map.js";
import identity from "./identity.js";
import pickAll from "./pickAll.js";
import useWith from "./useWith.js";
/**
 * Reasonable analog to SQL `select` statement.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @category Relation
 * @sig [k] -> [{k: v}] -> [{k: v}]
 * @param {Array} props The property names to project
 * @param {Array} objs The objects to query
 * @return {Array} An array of objects with just the `props` properties.
 * @see R.pluck, R.props, R.prop
 * @example
 *
 *      const abby = {name: 'Abby', age: 7, hair: 'blond', grade: 2};
 *      const fred = {name: 'Fred', age: 12, hair: 'brown', grade: 7};
 *      const kids = [abby, fred];
 *      R.project(['name', 'grade'], kids); //=> [{name: 'Abby', grade: 2}, {name: 'Fred', grade: 7}]
 */

var project =
/*#__PURE__*/
useWith(_map, [pickAll, identity]); // passing `identity` gives correct arity

export default project;import _curry3 from "./internal/_curry3.js";
import _dispatchable from "./internal/_dispatchable.js";
import _promap from "./internal/_promap.js";
import _xpromap from "./internal/_xpromap.js";
/**
 * Takes two functions as pre- and post- processors respectively for a third function,
 * i.e. `promap(f, g, h)(x) === g(h(f(x)))`.
 *
 * Dispatches to the `promap` method of the third argument, if present,
 * according to the [FantasyLand Profunctor spec](https://github.com/fantasyland/fantasy-land#profunctor).
 *
 * Acts as a transducer if a transformer is given in profunctor position.
 *
 * @func
 * @memberOf R
 * @since v0.28.0
 * @category Function
 * @sig (a -> b) -> (c -> d) -> (b -> c) -> (a -> d)
 * @sig Profunctor p => (a -> b) -> (c -> d) -> p b c -> p a d
 * @param {Function} f The preprocessor function, a -> b
 * @param {Function} g The postprocessor function, c -> d
 * @param {Profunctor} profunctor The profunctor instance to be promapped, e.g. b -> c
 * @return {Profunctor} The new profunctor instance, e.g. a -> d
 * @see R.transduce
 * @example
 *
 *      const decodeChar = R.promap(s => s.charCodeAt(), String.fromCharCode, R.add(-8))
 *      const decodeString = R.promap(R.split(''), R.join(''), R.map(decodeChar))
 *      decodeString("ziuli") //=> "ramda"
 *
 * @symb R.promap(f, g, h) = x => g(h(f(x)))
 * @symb R.promap(f, g, profunctor) = profunctor.promap(f, g)
 */

var promap =
/*#__PURE__*/
_curry3(
/*#__PURE__*/
_dispatchable(['fantasy-land/promap', 'promap'], _xpromap, _promap));

export default promap;import _curry2 from "./internal/_curry2.js";
import _isInteger from "./internal/_isInteger.js";
import nth from "./nth.js";
/**
 * Returns a function that when supplied an object returns the indicated
 * property of that object, if it exists.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @typedefn Idx = String | Int | Symbol
 * @sig Idx -> {s: a} -> a | Undefined
 * @param {String|Number} p The property name or array index
 * @param {Object} obj The object to query
 * @return {*} The value at `obj.p`.
 * @see R.path, R.props, R.pluck, R.project, R.nth
 * @example
 *
 *      R.prop('x', {x: 100}); //=> 100
 *      R.prop('x', {}); //=> undefined
 *      R.prop(0, [100]); //=> 100
 *      R.compose(R.inc, R.prop('x'))({ x: 3 }) //=> 4
 */

var prop =
/*#__PURE__*/
_curry2(function prop(p, obj) {
  if (obj == null) {
    return;
  }

  return _isInteger(p) ? nth(p, obj) : obj[p];
});

export default prop;import _curry3 from "./internal/_curry3.js";
import prop from "./prop.js";
import equals from "./equals.js";
/**
 * Returns `true` if the specified object property is equal, in
 * [`R.equals`](#equals) terms, to the given value; `false` otherwise.
 * You can test multiple properties with [`R.whereEq`](#whereEq).
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig String -> a -> Object -> Boolean
 * @param {String} name
 * @param {*} val
 * @param {*} obj
 * @return {Boolean}
 * @see R.whereEq, R.propSatisfies, R.equals
 * @example
 *
 *      const abby = {name: 'Abby', age: 7, hair: 'blond'};
 *      const fred = {name: 'Fred', age: 12, hair: 'brown'};
 *      const rusty = {name: 'Rusty', age: 10, hair: 'brown'};
 *      const alois = {name: 'Alois', age: 15, disposition: 'surly'};
 *      const kids = [abby, fred, rusty, alois];
 *      const hasBrownHair = R.propEq('hair', 'brown');
 *      R.filter(hasBrownHair, kids); //=> [fred, rusty]
 */

var propEq =
/*#__PURE__*/
_curry3(function propEq(name, val, obj) {
  return equals(val, prop(name, obj));
});

export default propEq;import _curry3 from "./internal/_curry3.js";
import prop from "./prop.js";
import is from "./is.js";
/**
 * Returns `true` if the specified object property is of the given type;
 * `false` otherwise.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category Type
 * @sig Type -> String -> Object -> Boolean
 * @param {Function} type
 * @param {String} name
 * @param {*} obj
 * @return {Boolean}
 * @see R.is, R.propSatisfies
 * @example
 *
 *      R.propIs(Number, 'x', {x: 1, y: 2});  //=> true
 *      R.propIs(Number, 'x', {x: 'foo'});    //=> false
 *      R.propIs(Number, 'x', {});            //=> false
 */

var propIs =
/*#__PURE__*/
_curry3(function propIs(type, name, obj) {
  return is(type, prop(name, obj));
});

export default propIs;import _curry3 from "./internal/_curry3.js";
import defaultTo from "./defaultTo.js";
import prop from "./prop.js";
/**
 * Return the specified property of the given non-null object if the property
 * is present and it's value is not `null`, `undefined` or `NaN`.
 *
 * Otherwise the first argument is returned.
 *
 * @func
 * @memberOf R
 * @since v0.6.0
 * @category Object
 * @sig a -> String -> Object -> a
 * @param {*} val The default value.
 * @param {String} p The name of the property to return.
 * @param {Object} obj The object to query.
 * @return {*} The value of given property of the supplied object or the default value.
 * @example
 *
 *      const alice = {
 *        name: 'ALICE',
 *        age: 101
 *      };
 *      const favorite = R.prop('favoriteLibrary');
 *      const favoriteWithDefault = R.propOr('Ramda', 'favoriteLibrary');
 *
 *      favorite(alice);  //=> undefined
 *      favoriteWithDefault(alice);  //=> 'Ramda'
 */

var propOr =
/*#__PURE__*/
_curry3(function propOr(val, p, obj) {
  return defaultTo(val, prop(p, obj));
});

export default propOr;import _curry3 from "./internal/_curry3.js";
import prop from "./prop.js";
/**
 * Returns `true` if the specified object property satisfies the given
 * predicate; `false` otherwise. You can test multiple properties with
 * [`R.where`](#where).
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category Logic
 * @sig (a -> Boolean) -> String -> {String: a} -> Boolean
 * @param {Function} pred
 * @param {String} name
 * @param {*} obj
 * @return {Boolean}
 * @see R.where, R.propEq, R.propIs
 * @example
 *
 *      R.propSatisfies(x => x > 0, 'x', {x: 1, y: 2}); //=> true
 */

var propSatisfies =
/*#__PURE__*/
_curry3(function propSatisfies(pred, name, obj) {
  return pred(prop(name, obj));
});

export default propSatisfies;import _curry2 from "./internal/_curry2.js";
import path from "./path.js";
/**
 * Acts as multiple `prop`: array of keys in, array of values out. Preserves
 * order.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @sig [k] -> {k: v} -> [v]
 * @param {Array} ps The property names to fetch
 * @param {Object} obj The object to query
 * @return {Array} The corresponding values or partially applied function.
 * @see R.prop, R.pluck, R.project
 * @example
 *
 *      R.props(['x', 'y'], {x: 1, y: 2}); //=> [1, 2]
 *      R.props(['c', 'a', 'b'], {b: 2, a: 1}); //=> [undefined, 1, 2]
 *
 *      const fullName = R.compose(R.join(' '), R.props(['first', 'last']));
 *      fullName({last: 'Bullet-Tooth', age: 33, first: 'Tony'}); //=> 'Tony Bullet-Tooth'
 */

var props =
/*#__PURE__*/
_curry2(function props(ps, obj) {
  return ps.map(function (p) {
    return path([p], obj);
  });
});

export default props;import _curry2 from "./internal/_curry2.js";
import _isNumber from "./internal/_isNumber.js";
/**
 * Returns a list of numbers from `from` (inclusive) to `to` (exclusive).
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig Number -> Number -> [Number]
 * @param {Number} from The first number in the list.
 * @param {Number} to One more than the last number in the list.
 * @return {Array} The list of numbers in the set `[a, b)`.
 * @example
 *
 *      R.range(1, 5);    //=> [1, 2, 3, 4]
 *      R.range(50, 53);  //=> [50, 51, 52]
 */

var range =
/*#__PURE__*/
_curry2(function range(from, to) {
  if (!(_isNumber(from) && _isNumber(to))) {
    throw new TypeError('Both arguments to range must be numbers');
  }

  var result = [];
  var n = from;

  while (n < to) {
    result.push(n);
    n += 1;
  }

  return result;
});

export default range;import _curry3 from "./internal/_curry3.js";
import _reduce from "./internal/_reduce.js";
/**
 * Returns a single item by iterating through the list, successively calling
 * the iterator function and passing it an accumulator value and the current
 * value from the array, and then passing the result to the next call.
 *
 * The iterator function receives two values: *(acc, value)*. It may use
 * [`R.reduced`](#reduced) to shortcut the iteration.
 *
 * The arguments' order of [`reduceRight`](#reduceRight)'s iterator function
 * is *(value, acc)*.
 *
 * Note: `R.reduce` does not skip deleted or unassigned indices (sparse
 * arrays), unlike the native `Array.prototype.reduce` method. For more details
 * on this behavior, see:
 * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#Description
 *
 * Dispatches to the `reduce` method of the third argument, if present. When
 * doing so, it is up to the user to handle the [`R.reduced`](#reduced)
 * shortcuting, as this is not implemented by `reduce`.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig ((a, b) -> a) -> a -> [b] -> a
 * @param {Function} fn The iterator function. Receives two values, the accumulator and the
 *        current element from the array.
 * @param {*} acc The accumulator value.
 * @param {Array} list The list to iterate over.
 * @return {*} The final, accumulated value.
 * @see R.reduced, R.addIndex, R.reduceRight
 * @example
 *
 *      R.reduce(R.subtract, 0, [1, 2, 3, 4]) // => ((((0 - 1) - 2) - 3) - 4) = -10
 *      //          -               -10
 *      //         / \              / \
 *      //        -   4           -6   4
 *      //       / \              / \
 *      //      -   3   ==>     -3   3
 *      //     / \              / \
 *      //    -   2           -1   2
 *      //   / \              / \
 *      //  0   1            0   1
 *
 * @symb R.reduce(f, a, [b, c, d]) = f(f(f(a, b), c), d)
 */

var reduce =
/*#__PURE__*/
_curry3(_reduce);

export default reduce;import _clone from "./internal/_clone.js";
import _curryN from "./internal/_curryN.js";
import _dispatchable from "./internal/_dispatchable.js";
import _has from "./internal/_has.js";
import _reduce from "./internal/_reduce.js";
import _reduced from "./internal/_reduced.js";
import _xreduceBy from "./internal/_xreduceBy.js";
/**
 * Groups the elements of the list according to the result of calling
 * the String-returning function `keyFn` on each element and reduces the elements
 * of each group to a single value via the reducer function `valueFn`.
 *
 * The value function receives two values: *(acc, value)*. It may use
 * [`R.reduced`](#reduced) to short circuit the iteration.
 *
 * This function is basically a more general [`groupBy`](#groupBy) function.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.20.0
 * @category List
 * @sig ((a, b) -> a) -> a -> (b -> String) -> [b] -> {String: a}
 * @param {Function} valueFn The function that reduces the elements of each group to a single
 *        value. Receives two values, accumulator for a particular group and the current element.
 * @param {*} acc The (initial) accumulator value for each group.
 * @param {Function} keyFn The function that maps the list's element into a key.
 * @param {Array} list The array to group.
 * @return {Object} An object with the output of `keyFn` for keys, mapped to the output of
 *         `valueFn` for elements which produced that key when passed to `keyFn`.
 * @see R.groupBy, R.reduce, R.reduced
 * @example
 *
 *      const groupNames = (acc, {name}) => acc.concat(name)
 *      const toGrade = ({score}) =>
 *        score < 65 ? 'F' :
 *        score < 70 ? 'D' :
 *        score < 80 ? 'C' :
 *        score < 90 ? 'B' : 'A'
 *
 *      var students = [
 *        {name: 'Abby', score: 83},
 *        {name: 'Bart', score: 62},
 *        {name: 'Curt', score: 88},
 *        {name: 'Dora', score: 92},
 *      ]
 *
 *      reduceBy(groupNames, [], toGrade, students)
 *      //=> {"A": ["Dora"], "B": ["Abby", "Curt"], "F": ["Bart"]}
 */

var reduceBy =
/*#__PURE__*/
_curryN(4, [],
/*#__PURE__*/
_dispatchable([], _xreduceBy, function reduceBy(valueFn, valueAcc, keyFn, list) {
  return _reduce(function (acc, elt) {
    var key = keyFn(elt);
    var value = valueFn(_has(key, acc) ? acc[key] : _clone(valueAcc, [], [], false), elt);

    if (value && value['@@transducer/reduced']) {
      return _reduced(acc);
    }

    acc[key] = value;
    return acc;
  }, {}, list);
}));

export default reduceBy;import _curry3 from "./internal/_curry3.js";
/**
 * Returns a single item by iterating through the list, successively calling
 * the iterator function and passing it an accumulator value and the current
 * value from the array, and then passing the result to the next call.
 *
 * Similar to [`reduce`](#reduce), except moves through the input list from the
 * right to the left.
 *
 * The iterator function receives two values: *(value, acc)*, while the arguments'
 * order of `reduce`'s iterator function is *(acc, value)*. `reduceRight` may use [`reduced`](#reduced)
 * to short circuit the iteration.
 *
 * Note: `R.reduceRight` does not skip deleted or unassigned indices (sparse
 * arrays), unlike the native `Array.prototype.reduceRight` method. For more details
 * on this behavior, see:
 * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduceRight#Description
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig ((a, b) -> b) -> b -> [a] -> b
 * @param {Function} fn The iterator function. Receives two values, the current element from the array
 *        and the accumulator.
 * @param {*} acc The accumulator value.
 * @param {Array} list The list to iterate over.
 * @return {*} The final, accumulated value.
 * @see R.reduce, R.addIndex, R.reduced
 * @example
 *
 *      R.reduceRight(R.subtract, 0, [1, 2, 3, 4]) // => (1 - (2 - (3 - (4 - 0)))) = -2
 *      //    -               -2
 *      //   / \              / \
 *      //  1   -            1   3
 *      //     / \              / \
 *      //    2   -     ==>    2  -1
 *      //       / \              / \
 *      //      3   -            3   4
 *      //         / \              / \
 *      //        4   0            4   0
 *
 * @symb R.reduceRight(f, a, [b, c, d]) = f(b, f(c, f(d, a)))
 */

var reduceRight =
/*#__PURE__*/
_curry3(function reduceRight(fn, acc, list) {
  var idx = list.length - 1;

  while (idx >= 0) {
    acc = fn(list[idx], acc);

    if (acc && acc['@@transducer/reduced']) {
      acc = acc['@@transducer/value'];
      break;
    }

    idx -= 1;
  }

  return acc;
});

export default reduceRight;import _curryN from "./internal/_curryN.js";
import _reduce from "./internal/_reduce.js";
import _reduced from "./internal/_reduced.js";
/**
 * Like [`reduce`](#reduce), `reduceWhile` returns a single item by iterating
 * through the list, successively calling the iterator function. `reduceWhile`
 * also takes a predicate that is evaluated before each step. If the predicate
 * returns `false`, it "short-circuits" the iteration and returns the current
 * value of the accumulator. `reduceWhile` may alternatively be short-circuited
 * via [`reduced`](#reduced).
 *
 * @func
 * @memberOf R
 * @since v0.22.0
 * @category List
 * @sig ((a, b) -> Boolean) -> ((a, b) -> a) -> a -> [b] -> a
 * @param {Function} pred The predicate. It is passed the accumulator and the
 *        current element.
 * @param {Function} fn The iterator function. Receives two values, the
 *        accumulator and the current element.
 * @param {*} a The accumulator value.
 * @param {Array} list The list to iterate over.
 * @return {*} The final, accumulated value.
 * @see R.reduce, R.reduced
 * @example
 *
 *      const isOdd = (acc, x) => x % 2 !== 0;
 *      const xs = [1, 3, 5, 60, 777, 800];
 *      R.reduceWhile(isOdd, R.add, 0, xs); //=> 9
 *
 *      const ys = [2, 4, 6]
 *      R.reduceWhile(isOdd, R.add, 111, ys); //=> 111
 */

var reduceWhile =
/*#__PURE__*/
_curryN(4, [], function _reduceWhile(pred, fn, a, list) {
  return _reduce(function (acc, x) {
    return pred(acc, x) ? fn(acc, x) : _reduced(acc);
  }, a, list);
});

export default reduceWhile;import _curry1 from "./internal/_curry1.js";
import _reduced from "./internal/_reduced.js";
/**
 * Returns a value wrapped to indicate that it is the final value of the reduce
 * and transduce functions. The returned value should be considered a black
 * box: the internal structure is not guaranteed to be stable.
 *
 * This optimization is available to the below functions:
 * - [`reduce`](#reduce)
 * - [`reduceWhile`](#reduceWhile)
 * - [`reduceBy`](#reduceBy)
 * - [`reduceRight`](#reduceRight)
 * - [`transduce`](#transduce)
 *
 * @func
 * @memberOf R
 * @since v0.15.0
 * @category List
 * @sig a -> *
 * @param {*} x The final value of the reduce.
 * @return {*} The wrapped value.
 * @see R.reduce, R.reduceWhile, R.reduceBy, R.reduceRight, R.transduce
 * @example
 *
 *     R.reduce(
 *       (acc, item) => item > 3 ? R.reduced(acc) : acc.concat(item),
 *       [],
 *       [1, 2, 3, 4, 5]) // [1, 2, 3]
 */

var reduced =
/*#__PURE__*/
_curry1(_reduced);

export default reduced;import _complement from "./internal/_complement.js";
import _curry2 from "./internal/_curry2.js";
import filter from "./filter.js";
/**
 * The complement of [`filter`](#filter).
 *
 * Acts as a transducer if a transformer is given in list position. Filterable
 * objects include plain objects or any object that has a filter method such
 * as `Array`.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig Filterable f => (a -> Boolean) -> f a -> f a
 * @param {Function} pred
 * @param {Array} filterable
 * @return {Array}
 * @see R.filter, R.transduce, R.addIndex
 * @example
 *
 *      const isOdd = (n) => n % 2 !== 0;
 *
 *      R.reject(isOdd, [1, 2, 3, 4]); //=> [2, 4]
 *
 *      R.reject(isOdd, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4}
 */

var reject =
/*#__PURE__*/
_curry2(function reject(pred, filterable) {
  return filter(_complement(pred), filterable);
});

export default reject;import _curry3 from "./internal/_curry3.js";
/**
 * Removes the sub-list of `list` starting at index `start` and containing
 * `count` elements. _Note that this is not destructive_: it returns a copy of
 * the list with the changes.
 * <small>No lists have been harmed in the application of this function.</small>
 *
 * @func
 * @memberOf R
 * @since v0.2.2
 * @category List
 * @sig Number -> Number -> [a] -> [a]
 * @param {Number} start The position to start removing elements
 * @param {Number} count The number of elements to remove
 * @param {Array} list The list to remove from
 * @return {Array} A new Array with `count` elements from `start` removed.
 * @see R.without
 * @example
 *
 *      R.remove(2, 3, [1,2,3,4,5,6,7,8]); //=> [1,2,6,7,8]
 */

var remove =
/*#__PURE__*/
_curry3(function remove(start, count, list) {
  var result = Array.prototype.slice.call(list, 0);
  result.splice(start, count);
  return result;
});

export default remove;import _curry2 from "./internal/_curry2.js";
import always from "./always.js";
import times from "./times.js";
/**
 * Returns a fixed list of size `n` containing a specified identical value.
 *
 * @func
 * @memberOf R
 * @since v0.1.1
 * @category List
 * @sig a -> n -> [a]
 * @param {*} value The value to repeat.
 * @param {Number} n The desired size of the output list.
 * @return {Array} A new array containing `n` `value`s.
 * @see R.times
 * @example
 *
 *      R.repeat('hi', 5); //=> ['hi', 'hi', 'hi', 'hi', 'hi']
 *
 *      const obj = {};
 *      const repeatedObjs = R.repeat(obj, 5); //=> [{}, {}, {}, {}, {}]
 *      repeatedObjs[0] === repeatedObjs[1]; //=> true
 * @symb R.repeat(a, 0) = []
 * @symb R.repeat(a, 1) = [a]
 * @symb R.repeat(a, 2) = [a, a]
 */

var repeat =
/*#__PURE__*/
_curry2(function repeat(value, n) {
  return times(always(value), n);
});

export default repeat;import _curry3 from "./internal/_curry3.js";
/**
 * Replace a substring or regex match in a string with a replacement.
 *
 * The first two parameters correspond to the parameters of the
 * `String.prototype.replace()` function, so the second parameter can also be a
 * function.
 *
 * @func
 * @memberOf R
 * @since v0.7.0
 * @category String
 * @sig RegExp|String -> String -> String -> String
 * @param {RegExp|String} pattern A regular expression or a substring to match.
 * @param {String} replacement The string to replace the matches with.
 * @param {String} str The String to do the search and replacement in.
 * @return {String} The result.
 * @example
 *
 *      R.replace('foo', 'bar', 'foo foo foo'); //=> 'bar foo foo'
 *      R.replace(/foo/, 'bar', 'foo foo foo'); //=> 'bar foo foo'
 *
 *      // Use the "g" (global) flag to replace all occurrences:
 *      R.replace(/foo/g, 'bar', 'foo foo foo'); //=> 'bar bar bar'
 */

var replace =
/*#__PURE__*/
_curry3(function replace(regex, replacement, str) {
  return str.replace(regex, replacement);
});

export default replace;import _curry1 from "./internal/_curry1.js";
import _isString from "./internal/_isString.js";
/**
 * Returns a new list or string with the elements or characters in reverse
 * order.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig [a] -> [a]
 * @sig String -> String
 * @param {Array|String} list
 * @return {Array|String}
 * @example
 *
 *      R.reverse([1, 2, 3]);  //=> [3, 2, 1]
 *      R.reverse([1, 2]);     //=> [2, 1]
 *      R.reverse([1]);        //=> [1]
 *      R.reverse([]);         //=> []
 *
 *      R.reverse('abc');      //=> 'cba'
 *      R.reverse('ab');       //=> 'ba'
 *      R.reverse('a');        //=> 'a'
 *      R.reverse('');         //=> ''
 */

var reverse =
/*#__PURE__*/
_curry1(function reverse(list) {
  return _isString(list) ? list.split('').reverse().join('') : Array.prototype.slice.call(list, 0).reverse();
});

export default reverse;import _curry3 from "./internal/_curry3.js";
/**
 * Scan is similar to [`reduce`](#reduce), but returns a list of successively
 * reduced values from the left
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category List
 * @sig ((a, b) -> a) -> a -> [b] -> [a]
 * @param {Function} fn The iterator function. Receives two values, the accumulator and the
 *        current element from the array
 * @param {*} acc The accumulator value.
 * @param {Array} list The list to iterate over.
 * @return {Array} A list of all intermediately reduced values.
 * @see R.reduce, R.mapAccum
 * @example
 *
 *      const numbers = [1, 2, 3, 4];
 *      const factorials = R.scan(R.multiply, 1, numbers); //=> [1, 1, 2, 6, 24]
 * @symb R.scan(f, a, [b, c]) = [a, f(a, b), f(f(a, b), c)]
 */

var scan =
/*#__PURE__*/
_curry3(function scan(fn, acc, list) {
  var idx = 0;
  var len = list.length;
  var result = [acc];

  while (idx < len) {
    acc = fn(acc, list[idx]);
    result[idx + 1] = acc;
    idx += 1;
  }

  return result;
});

export default scan;import _curry2 from "./internal/_curry2.js";
import ap from "./ap.js";
import map from "./map.js";
import prepend from "./prepend.js";
import reduceRight from "./reduceRight.js";
/**
 * Transforms a [Traversable](https://github.com/fantasyland/fantasy-land#traversable)
 * of [Applicative](https://github.com/fantasyland/fantasy-land#applicative) into an
 * Applicative of Traversable.
 *
 * Dispatches to the `sequence` method of the second argument, if present.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category List
 * @sig (Applicative f, Traversable t) => (a -> f a) -> t (f a) -> f (t a)
 * @param {Function} of
 * @param {*} traversable
 * @return {*}
 * @see R.traverse
 * @example
 *
 *      R.sequence(Maybe.of, [Just(1), Just(2), Just(3)]);   //=> Just([1, 2, 3])
 *      R.sequence(Maybe.of, [Just(1), Just(2), Nothing()]); //=> Nothing()
 *
 *      R.sequence(R.of, Just([1, 2, 3])); //=> [Just(1), Just(2), Just(3)]
 *      R.sequence(R.of, Nothing());       //=> [Nothing()]
 */

var sequence =
/*#__PURE__*/
_curry2(function sequence(of, traversable) {
  return typeof traversable.sequence === 'function' ? traversable.sequence(of) : reduceRight(function (x, acc) {
    return ap(map(prepend, x), acc);
  }, of([]), traversable);
});

export default sequence;import _curry3 from "./internal/_curry3.js";
import always from "./always.js";
import over from "./over.js";
/**
 * Returns the result of "setting" the portion of the given data structure
 * focused by the given lens to the given value.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category Object
 * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
 * @sig Lens s a -> a -> s -> s
 * @param {Lens} lens
 * @param {*} v
 * @param {*} x
 * @return {*}
 * @see R.view, R.over, R.lens, R.lensIndex, R.lensProp, R.lensPath
 * @example
 *
 *      const xLens = R.lensProp('x');
 *
 *      R.set(xLens, 4, {x: 1, y: 2});  //=> {x: 4, y: 2}
 *      R.set(xLens, 8, {x: 1, y: 2});  //=> {x: 8, y: 2}
 */

var set =
/*#__PURE__*/
_curry3(function set(lens, v, x) {
  return over(lens, always(v), x);
});

export default set;import _checkForMethod from "./internal/_checkForMethod.js";
import _curry3 from "./internal/_curry3.js";
/**
 * Returns the elements of the given list or string (or object with a `slice`
 * method) from `fromIndex` (inclusive) to `toIndex` (exclusive).
 *
 * Dispatches to the `slice` method of the third argument, if present.
 *
 * @func
 * @memberOf R
 * @since v0.1.4
 * @category List
 * @sig Number -> Number -> [a] -> [a]
 * @sig Number -> Number -> String -> String
 * @param {Number} fromIndex The start index (inclusive).
 * @param {Number} toIndex The end index (exclusive).
 * @param {*} list
 * @return {*}
 * @example
 *
 *      R.slice(1, 3, ['a', 'b', 'c', 'd']);        //=> ['b', 'c']
 *      R.slice(1, Infinity, ['a', 'b', 'c', 'd']); //=> ['b', 'c', 'd']
 *      R.slice(0, -1, ['a', 'b', 'c', 'd']);       //=> ['a', 'b', 'c']
 *      R.slice(-3, -1, ['a', 'b', 'c', 'd']);      //=> ['b', 'c']
 *      R.slice(0, 3, 'ramda');                     //=> 'ram'
 */

var slice =
/*#__PURE__*/
_curry3(
/*#__PURE__*/
_checkForMethod('slice', function slice(fromIndex, toIndex, list) {
  return Array.prototype.slice.call(list, fromIndex, toIndex);
}));

export default slice;import _curry2 from "./internal/_curry2.js";
/**
 * Returns a copy of the list, sorted according to the comparator function,
 * which should accept two values at a time and return a negative number if the
 * first value is smaller, a positive number if it's larger, and zero if they
 * are equal. Please note that this is a **copy** of the list. It does not
 * modify the original.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig ((a, a) -> Number) -> [a] -> [a]
 * @param {Function} comparator A sorting function :: a -> b -> Int
 * @param {Array} list The list to sort
 * @return {Array} a new array with its elements sorted by the comparator function.
 * @see R.ascend, R.descend
 * @example
 *
 *      const diff = function(a, b) { return a - b; };
 *      R.sort(diff, [4,2,7,5]); //=> [2, 4, 5, 7]
 */

var sort =
/*#__PURE__*/
_curry2(function sort(comparator, list) {
  return Array.prototype.slice.call(list, 0).sort(comparator);
});

export default sort;import _curry2 from "./internal/_curry2.js";
/**
 * Sorts the list according to the supplied function.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig Ord b => (a -> b) -> [a] -> [a]
 * @param {Function} fn
 * @param {Array} list The list to sort.
 * @return {Array} A new list sorted by the keys generated by `fn`.
 * @example
 *
 *      const sortByFirstItem = R.sortBy(R.prop(0));
 *      const pairs = [[-1, 1], [-2, 2], [-3, 3]];
 *      sortByFirstItem(pairs); //=> [[-3, 3], [-2, 2], [-1, 1]]
 *
 *      const sortByNameCaseInsensitive = R.sortBy(R.compose(R.toLower, R.prop('name')));
 *      const alice = {
 *        name: 'ALICE',
 *        age: 101
 *      };
 *      const bob = {
 *        name: 'Bob',
 *        age: -10
 *      };
 *      const clara = {
 *        name: 'clara',
 *        age: 314.159
 *      };
 *      const people = [clara, bob, alice];
 *      sortByNameCaseInsensitive(people); //=> [alice, bob, clara]
 */

var sortBy =
/*#__PURE__*/
_curry2(function sortBy(fn, list) {
  return Array.prototype.slice.call(list, 0).sort(function (a, b) {
    var aa = fn(a);
    var bb = fn(b);
    return aa < bb ? -1 : aa > bb ? 1 : 0;
  });
});

export default sortBy;import _curry2 from "./internal/_curry2.js";
/**
 * Sorts a list according to a list of comparators.
 *
 * @func
 * @memberOf R
 * @since v0.23.0
 * @category Relation
 * @sig [(a, a) -> Number] -> [a] -> [a]
 * @param {Array} functions A list of comparator functions.
 * @param {Array} list The list to sort.
 * @return {Array} A new list sorted according to the comarator functions.
 * @see R.ascend, R.descend
 * @example
 *
 *      const alice = {
 *        name: 'alice',
 *        age: 40
 *      };
 *      const bob = {
 *        name: 'bob',
 *        age: 30
 *      };
 *      const clara = {
 *        name: 'clara',
 *        age: 40
 *      };
 *      const people = [clara, bob, alice];
 *      const ageNameSort = R.sortWith([
 *        R.descend(R.prop('age')),
 *        R.ascend(R.prop('name'))
 *      ]);
 *      ageNameSort(people); //=> [alice, clara, bob]
 */

var sortWith =
/*#__PURE__*/
_curry2(function sortWith(fns, list) {
  return Array.prototype.slice.call(list, 0).sort(function (a, b) {
    var result = 0;
    var i = 0;

    while (result === 0 && i < fns.length) {
      result = fns[i](a, b);
      i += 1;
    }

    return result;
  });
});

export default sortWith;import invoker from "./invoker.js";
/**
 * Splits a string into an array of strings based on the given
 * separator.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category String
 * @sig (String | RegExp) -> String -> [String]
 * @param {String|RegExp} sep The pattern.
 * @param {String} str The string to separate into an array.
 * @return {Array} The array of strings from `str` separated by `sep`.
 * @see R.join
 * @example
 *
 *      const pathComponents = R.split('/');
 *      R.tail(pathComponents('/usr/local/bin/node')); //=> ['usr', 'local', 'bin', 'node']
 *
 *      R.split('.', 'a.b.c.xyz.d'); //=> ['a', 'b', 'c', 'xyz', 'd']
 */

var split =
/*#__PURE__*/
invoker(1, 'split');
export default split;import _curry2 from "./internal/_curry2.js";
import length from "./length.js";
import slice from "./slice.js";
/**
 * Splits a given list or string at a given index.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category List
 * @sig Number -> [a] -> [[a], [a]]
 * @sig Number -> String -> [String, String]
 * @param {Number} index The index where the array/string is split.
 * @param {Array|String} array The array/string to be split.
 * @return {Array}
 * @example
 *
 *      R.splitAt(1, [1, 2, 3]);          //=> [[1], [2, 3]]
 *      R.splitAt(5, 'hello world');      //=> ['hello', ' world']
 *      R.splitAt(-1, 'foobar');          //=> ['fooba', 'r']
 */

var splitAt =
/*#__PURE__*/
_curry2(function splitAt(index, array) {
  return [slice(0, index, array), slice(index, length(array), array)];
});

export default splitAt;import _curry2 from "./internal/_curry2.js";
import slice from "./slice.js";
/**
 * Splits a collection into slices of the specified length.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category List
 * @sig Number -> [a] -> [[a]]
 * @sig Number -> String -> [String]
 * @param {Number} n
 * @param {Array} list
 * @return {Array}
 * @example
 *
 *      R.splitEvery(3, [1, 2, 3, 4, 5, 6, 7]); //=> [[1, 2, 3], [4, 5, 6], [7]]
 *      R.splitEvery(3, 'foobarbaz'); //=> ['foo', 'bar', 'baz']
 */

var splitEvery =
/*#__PURE__*/
_curry2(function splitEvery(n, list) {
  if (n <= 0) {
    throw new Error('First argument to splitEvery must be a positive integer');
  }

  var result = [];
  var idx = 0;

  while (idx < list.length) {
    result.push(slice(idx, idx += n, list));
  }

  return result;
});

export default splitEvery;import _curry2 from "./internal/_curry2.js";
/**
 * Takes a list and a predicate and returns a pair of lists with the following properties:
 *
 *  - the result of concatenating the two output lists is equivalent to the input list;
 *  - none of the elements of the first output list satisfies the predicate; and
 *  - if the second output list is non-empty, its first element satisfies the predicate.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> [[a], [a]]
 * @param {Function} pred The predicate that determines where the array is split.
 * @param {Array} list The array to be split.
 * @return {Array}
 * @example
 *
 *      R.splitWhen(R.equals(2), [1, 2, 3, 1, 2, 3]);   //=> [[1], [2, 3, 1, 2, 3]]
 */

var splitWhen =
/*#__PURE__*/
_curry2(function splitWhen(pred, list) {
  var idx = 0;
  var len = list.length;
  var prefix = [];

  while (idx < len && !pred(list[idx])) {
    prefix.push(list[idx]);
    idx += 1;
  }

  return [prefix, Array.prototype.slice.call(list, idx)];
});

export default splitWhen;import _curryN from "./internal/_curryN.js";
/**
 * Splits an array into slices on every occurrence of a value.
 *
 * @func
 * @memberOf R
 * @since v0.26.1
 * @category List
 * @sig (a -> Boolean) -> [a] -> [[a]]
 * @param {Function} pred The predicate that determines where the array is split.
 * @param {Array} list The array to be split.
 * @return {Array}
 * @example
 *
 *      R.splitWhenever(R.equals(2), [1, 2, 3, 2, 4, 5, 2, 6, 7]); //=> [[1], [3], [4, 5], [6, 7]]
 */

var splitWhenever =
/*#__PURE__*/
_curryN(2, [], function splitWhenever(pred, list) {
  var acc = [];
  var curr = [];

  for (var i = 0; i < list.length; i = i + 1) {
    if (!pred(list[i])) {
      curr.push(list[i]);
    }

    if ((i < list.length - 1 && pred(list[i + 1]) || i === list.length - 1) && curr.length > 0) {
      acc.push(curr);
      curr = [];
    }
  }

  return acc;
});

export default splitWhenever;import _curry2 from "./internal/_curry2.js";
import equals from "./equals.js";
import take from "./take.js";
/**
 * Checks if a list starts with the provided sublist.
 *
 * Similarly, checks if a string starts with the provided substring.
 *
 * @func
 * @memberOf R
 * @since v0.24.0
 * @category List
 * @sig [a] -> [a] -> Boolean
 * @sig String -> String -> Boolean
 * @param {*} prefix
 * @param {*} list
 * @return {Boolean}
 * @see R.endsWith
 * @example
 *
 *      R.startsWith('a', 'abc')                //=> true
 *      R.startsWith('b', 'abc')                //=> false
 *      R.startsWith(['a'], ['a', 'b', 'c'])    //=> true
 *      R.startsWith(['b'], ['a', 'b', 'c'])    //=> false
 */

var startsWith =
/*#__PURE__*/
_curry2(function (prefix, list) {
  return equals(take(prefix.length, list), prefix);
});

export default startsWith;import _curry2 from "./internal/_curry2.js";
/**
 * Subtracts its second argument from its first argument.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Math
 * @sig Number -> Number -> Number
 * @param {Number} a The first value.
 * @param {Number} b The second value.
 * @return {Number} The result of `a - b`.
 * @see R.add
 * @example
 *
 *      R.subtract(10, 8); //=> 2
 *
 *      const minus5 = R.subtract(R.__, 5);
 *      minus5(17); //=> 12
 *
 *      const complementaryAngle = R.subtract(90);
 *      complementaryAngle(30); //=> 60
 *      complementaryAngle(72); //=> 18
 */

var subtract =
/*#__PURE__*/
_curry2(function subtract(a, b) {
  return Number(a) - Number(b);
});

export default subtract;import add from "./add.js";
import reduce from "./reduce.js";
/**
 * Adds together all the elements of a list.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Math
 * @sig [Number] -> Number
 * @param {Array} list An array of numbers
 * @return {Number} The sum of all the numbers in the list.
 * @see R.reduce
 * @example
 *
 *      R.sum([2,4,6,8,100,1]); //=> 121
 */

var sum =
/*#__PURE__*/
reduce(add, 0);
export default sum;import _curry2 from "./internal/_curry2.js";
import concat from "./concat.js";
import difference from "./difference.js";
/**
 * Finds the set (i.e. no duplicates) of all elements contained in the first or
 * second list, but not both.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category Relation
 * @sig [*] -> [*] -> [*]
 * @param {Array} list1 The first list.
 * @param {Array} list2 The second list.
 * @return {Array} The elements in `list1` or `list2`, but not both.
 * @see R.symmetricDifferenceWith, R.difference, R.differenceWith
 * @example
 *
 *      R.symmetricDifference([1,2,3,4], [7,6,5,4,3]); //=> [1,2,7,6,5]
 *      R.symmetricDifference([7,6,5,4,3], [1,2,3,4]); //=> [7,6,5,1,2]
 */

var symmetricDifference =
/*#__PURE__*/
_curry2(function symmetricDifference(list1, list2) {
  return concat(difference(list1, list2), difference(list2, list1));
});

export default symmetricDifference;import _curry3 from "./internal/_curry3.js";
import concat from "./concat.js";
import differenceWith from "./differenceWith.js";
/**
 * Finds the set (i.e. no duplicates) of all elements contained in the first or
 * second list, but not both. Duplication is determined according to the value
 * returned by applying the supplied predicate to two list elements.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category Relation
 * @sig ((a, a) -> Boolean) -> [a] -> [a] -> [a]
 * @param {Function} pred A predicate used to test whether two items are equal.
 * @param {Array} list1 The first list.
 * @param {Array} list2 The second list.
 * @return {Array} The elements in `list1` or `list2`, but not both.
 * @see R.symmetricDifference, R.difference, R.differenceWith
 * @example
 *
 *      const eqA = R.eqBy(R.prop('a'));
 *      const l1 = [{a: 1}, {a: 2}, {a: 3}, {a: 4}];
 *      const l2 = [{a: 3}, {a: 4}, {a: 5}, {a: 6}];
 *      R.symmetricDifferenceWith(eqA, l1, l2); //=> [{a: 1}, {a: 2}, {a: 5}, {a: 6}]
 */

var symmetricDifferenceWith =
/*#__PURE__*/
_curry3(function symmetricDifferenceWith(pred, list1, list2) {
  return concat(differenceWith(pred, list1, list2), differenceWith(pred, list2, list1));
});

export default symmetricDifferenceWith;import _checkForMethod from "./internal/_checkForMethod.js";
import _curry1 from "./internal/_curry1.js";
import slice from "./slice.js";
/**
 * Returns all but the first element of the given list or string (or object
 * with a `tail` method).
 *
 * Dispatches to the `slice` method of the first argument, if present.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig [a] -> [a]
 * @sig String -> String
 * @param {*} list
 * @return {*}
 * @see R.head, R.init, R.last
 * @example
 *
 *      R.tail([1, 2, 3]);  //=> [2, 3]
 *      R.tail([1, 2]);     //=> [2]
 *      R.tail([1]);        //=> []
 *      R.tail([]);         //=> []
 *
 *      R.tail('abc');  //=> 'bc'
 *      R.tail('ab');   //=> 'b'
 *      R.tail('a');    //=> ''
 *      R.tail('');     //=> ''
 */

var tail =
/*#__PURE__*/
_curry1(
/*#__PURE__*/
_checkForMethod('tail',
/*#__PURE__*/
slice(1, Infinity)));

export default tail;import _curry2 from "./internal/_curry2.js";
import _dispatchable from "./internal/_dispatchable.js";
import _xtake from "./internal/_xtake.js";
import slice from "./slice.js";
/**
 * Returns the first `n` elements of the given list, string, or
 * transducer/transformer (or object with a `take` method).
 *
 * Dispatches to the `take` method of the second argument, if present.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig Number -> [a] -> [a]
 * @sig Number -> String -> String
 * @param {Number} n
 * @param {*} list
 * @return {*}
 * @see R.drop
 * @example
 *
 *      R.take(1, ['foo', 'bar', 'baz']); //=> ['foo']
 *      R.take(2, ['foo', 'bar', 'baz']); //=> ['foo', 'bar']
 *      R.take(3, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz']
 *      R.take(4, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz']
 *      R.take(3, 'ramda');               //=> 'ram'
 *
 *      const personnel = [
 *        'Dave Brubeck',
 *        'Paul Desmond',
 *        'Eugene Wright',
 *        'Joe Morello',
 *        'Gerry Mulligan',
 *        'Bob Bates',
 *        'Joe Dodge',
 *        'Ron Crotty'
 *      ];
 *
 *      const takeFive = R.take(5);
 *      takeFive(personnel);
 *      //=> ['Dave Brubeck', 'Paul Desmond', 'Eugene Wright', 'Joe Morello', 'Gerry Mulligan']
 * @symb R.take(-1, [a, b]) = [a, b]
 * @symb R.take(0, [a, b]) = []
 * @symb R.take(1, [a, b]) = [a]
 * @symb R.take(2, [a, b]) = [a, b]
 */

var take =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable(['take'], _xtake, function take(n, xs) {
  return slice(0, n < 0 ? Infinity : n, xs);
}));

export default take;import _curry2 from "./internal/_curry2.js";
import drop from "./drop.js";
/**
 * Returns a new list containing the last `n` elements of the given list.
 * If `n > list.length`, returns a list of `list.length` elements.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category List
 * @sig Number -> [a] -> [a]
 * @sig Number -> String -> String
 * @param {Number} n The number of elements to return.
 * @param {Array} xs The collection to consider.
 * @return {Array}
 * @see R.dropLast
 * @example
 *
 *      R.takeLast(1, ['foo', 'bar', 'baz']); //=> ['baz']
 *      R.takeLast(2, ['foo', 'bar', 'baz']); //=> ['bar', 'baz']
 *      R.takeLast(3, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz']
 *      R.takeLast(4, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz']
 *      R.takeLast(3, 'ramda');               //=> 'mda'
 */

var takeLast =
/*#__PURE__*/
_curry2(function takeLast(n, xs) {
  return drop(n >= 0 ? xs.length - n : 0, xs);
});

export default takeLast;import _curry2 from "./internal/_curry2.js";
import slice from "./slice.js";
/**
 * Returns a new list containing the last `n` elements of a given list, passing
 * each value to the supplied predicate function, and terminating when the
 * predicate function returns `false`. Excludes the element that caused the
 * predicate function to fail. The predicate function is passed one argument:
 * *(value)*.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> [a]
 * @sig (a -> Boolean) -> String -> String
 * @param {Function} fn The function called per iteration.
 * @param {Array} xs The collection to iterate over.
 * @return {Array} A new array.
 * @see R.dropLastWhile, R.addIndex
 * @example
 *
 *      const isNotOne = x => x !== 1;
 *
 *      R.takeLastWhile(isNotOne, [1, 2, 3, 4]); //=> [2, 3, 4]
 *
 *      R.takeLastWhile(x => x !== 'R' , 'Ramda'); //=> 'amda'
 */

var takeLastWhile =
/*#__PURE__*/
_curry2(function takeLastWhile(fn, xs) {
  var idx = xs.length - 1;

  while (idx >= 0 && fn(xs[idx])) {
    idx -= 1;
  }

  return slice(idx + 1, Infinity, xs);
});

export default takeLastWhile;import _curry2 from "./internal/_curry2.js";
import _dispatchable from "./internal/_dispatchable.js";
import _xtakeWhile from "./internal/_xtakeWhile.js";
import slice from "./slice.js";
/**
 * Returns a new list containing the first `n` elements of a given list,
 * passing each value to the supplied predicate function, and terminating when
 * the predicate function returns `false`. Excludes the element that caused the
 * predicate function to fail. The predicate function is passed one argument:
 * *(value)*.
 *
 * Dispatches to the `takeWhile` method of the second argument, if present.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig (a -> Boolean) -> [a] -> [a]
 * @sig (a -> Boolean) -> String -> String
 * @param {Function} fn The function called per iteration.
 * @param {Array} xs The collection to iterate over.
 * @return {Array} A new array.
 * @see R.dropWhile, R.transduce, R.addIndex
 * @example
 *
 *      const isNotFour = x => x !== 4;
 *
 *      R.takeWhile(isNotFour, [1, 2, 3, 4, 3, 2, 1]); //=> [1, 2, 3]
 *
 *      R.takeWhile(x => x !== 'd' , 'Ramda'); //=> 'Ram'
 */

var takeWhile =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable(['takeWhile'], _xtakeWhile, function takeWhile(fn, xs) {
  var idx = 0;
  var len = xs.length;

  while (idx < len && fn(xs[idx])) {
    idx += 1;
  }

  return slice(0, idx, xs);
}));

export default takeWhile;import _curry2 from "./internal/_curry2.js";
import _dispatchable from "./internal/_dispatchable.js";
import _xtap from "./internal/_xtap.js";
/**
 * Runs the given function with the supplied object, then returns the object.
 *
 * Acts as a transducer if a transformer is given as second parameter.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig (a -> *) -> a -> a
 * @param {Function} fn The function to call with `x`. The return value of `fn` will be thrown away.
 * @param {*} x
 * @return {*} `x`.
 * @example
 *
 *      const sayX = x => console.log('x is ' + x);
 *      R.tap(sayX, 100); //=> 100
 *      // logs 'x is 100'
 * @symb R.tap(f, a) = a
 */

var tap =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable([], _xtap, function tap(fn, x) {
  fn(x);
  return x;
}));

export default tap;import _cloneRegExp from "./internal/_cloneRegExp.js";
import _curry2 from "./internal/_curry2.js";
import _isRegExp from "./internal/_isRegExp.js";
import toString from "./toString.js";
/**
 * Determines whether a given string matches a given regular expression.
 *
 * @func
 * @memberOf R
 * @since v0.12.0
 * @category String
 * @sig RegExp -> String -> Boolean
 * @param {RegExp} pattern
 * @param {String} str
 * @return {Boolean}
 * @see R.match
 * @example
 *
 *      R.test(/^x/, 'xyz'); //=> true
 *      R.test(/^y/, 'xyz'); //=> false
 */

var test =
/*#__PURE__*/
_curry2(function test(pattern, str) {
  if (!_isRegExp(pattern)) {
    throw new TypeError('‘test’ requires a value of type RegExp as its first argument; received ' + toString(pattern));
  }

  return _cloneRegExp(pattern).test(str);
});

export default test;import curryN from "./curryN.js";
import _curry1 from "./internal/_curry1.js";
/**
 * Creates a thunk out of a function. A thunk delays a calculation until
 * its result is needed, providing lazy evaluation of arguments.
 *
 * @func
 * @memberOf R
 * @since v0.26.0
 * @category Function
 * @sig ((a, b, ..., j) -> k) -> (a, b, ..., j) -> (() -> k)
 * @param {Function} fn A function to wrap in a thunk
 * @return {Function} Expects arguments for `fn` and returns a new function
 *  that, when called, applies those arguments to `fn`.
 * @see R.partial, R.partialRight
 * @example
 *
 *      R.thunkify(R.identity)(42)(); //=> 42
 *      R.thunkify((a, b) => a + b)(25, 17)(); //=> 42
 */

var thunkify =
/*#__PURE__*/
_curry1(function thunkify(fn) {
  return curryN(fn.length, function createThunk() {
    var fnArgs = arguments;
    return function invokeThunk() {
      return fn.apply(this, fnArgs);
    };
  });
});

export default thunkify;import _curry2 from "./internal/_curry2.js";
/**
 * Calls an input function `n` times, returning an array containing the results
 * of those function calls.
 *
 * `fn` is passed one argument: The current value of `n`, which begins at `0`
 * and is gradually incremented to `n - 1`.
 *
 * @func
 * @memberOf R
 * @since v0.2.3
 * @category List
 * @sig (Number -> a) -> Number -> [a]
 * @param {Function} fn The function to invoke. Passed one argument, the current value of `n`.
 * @param {Number} n A value between `0` and `n - 1`. Increments after each function call.
 * @return {Array} An array containing the return values of all calls to `fn`.
 * @see R.repeat
 * @example
 *
 *      R.times(R.identity, 5); //=> [0, 1, 2, 3, 4]
 * @symb R.times(f, 0) = []
 * @symb R.times(f, 1) = [f(0)]
 * @symb R.times(f, 2) = [f(0), f(1)]
 */

var times =
/*#__PURE__*/
_curry2(function times(fn, n) {
  var len = Number(n);
  var idx = 0;
  var list;

  if (len < 0 || isNaN(len)) {
    throw new RangeError('n must be a non-negative number');
  }

  list = new Array(len);

  while (idx < len) {
    list[idx] = fn(idx);
    idx += 1;
  }

  return list;
});

export default times;import invoker from "./invoker.js";
/**
 * The lower case version of a string.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category String
 * @sig String -> String
 * @param {String} str The string to lower case.
 * @return {String} The lower case version of `str`.
 * @see R.toUpper
 * @example
 *
 *      R.toLower('XYZ'); //=> 'xyz'
 */

var toLower =
/*#__PURE__*/
invoker(0, 'toLowerCase');
export default toLower;import _curry1 from "./internal/_curry1.js";
import _has from "./internal/_has.js";
/**
 * Converts an object into an array of key, value arrays. Only the object's
 * own properties are used.
 * Note that the order of the output array is not guaranteed to be consistent
 * across different JS platforms.
 *
 * @func
 * @memberOf R
 * @since v0.4.0
 * @category Object
 * @sig {String: *} -> [[String,*]]
 * @param {Object} obj The object to extract from
 * @return {Array} An array of key, value arrays from the object's own properties.
 * @see R.fromPairs, R.keys, R.values
 * @example
 *
 *      R.toPairs({a: 1, b: 2, c: 3}); //=> [['a', 1], ['b', 2], ['c', 3]]
 */

var toPairs =
/*#__PURE__*/
_curry1(function toPairs(obj) {
  var pairs = [];

  for (var prop in obj) {
    if (_has(prop, obj)) {
      pairs[pairs.length] = [prop, obj[prop]];
    }
  }

  return pairs;
});

export default toPairs;import _curry1 from "./internal/_curry1.js";
/**
 * Converts an object into an array of key, value arrays. The object's own
 * properties and prototype properties are used. Note that the order of the
 * output array is not guaranteed to be consistent across different JS
 * platforms.
 *
 * @func
 * @memberOf R
 * @since v0.4.0
 * @category Object
 * @sig {String: *} -> [[String,*]]
 * @param {Object} obj The object to extract from
 * @return {Array} An array of key, value arrays from the object's own
 *         and prototype properties.
 * @example
 *
 *      const F = function() { this.x = 'X'; };
 *      F.prototype.y = 'Y';
 *      const f = new F();
 *      R.toPairsIn(f); //=> [['x','X'], ['y','Y']]
 */

var toPairsIn =
/*#__PURE__*/
_curry1(function toPairsIn(obj) {
  var pairs = [];

  for (var prop in obj) {
    pairs[pairs.length] = [prop, obj[prop]];
  }

  return pairs;
});

export default toPairsIn;import _curry1 from "./internal/_curry1.js";
import _toString from "./internal/_toString.js";
/**
 * Returns the string representation of the given value. `eval`'ing the output
 * should result in a value equivalent to the input value. Many of the built-in
 * `toString` methods do not satisfy this requirement.
 *
 * If the given value is an `[object Object]` with a `toString` method other
 * than `Object.prototype.toString`, this method is invoked with no arguments
 * to produce the return value. This means user-defined constructor functions
 * can provide a suitable `toString` method. For example:
 *
 *     function Point(x, y) {
 *       this.x = x;
 *       this.y = y;
 *     }
 *
 *     Point.prototype.toString = function() {
 *       return 'new Point(' + this.x + ', ' + this.y + ')';
 *     };
 *
 *     R.toString(new Point(1, 2)); //=> 'new Point(1, 2)'
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category String
 * @sig * -> String
 * @param {*} val
 * @return {String}
 * @example
 *
 *      R.toString(42); //=> '42'
 *      R.toString('abc'); //=> '"abc"'
 *      R.toString([1, 2, 3]); //=> '[1, 2, 3]'
 *      R.toString({foo: 1, bar: 2, baz: 3}); //=> '{"bar": 2, "baz": 3, "foo": 1}'
 *      R.toString(new Date('2001-02-03T04:05:06Z')); //=> 'new Date("2001-02-03T04:05:06.000Z")'
 */

var toString =
/*#__PURE__*/
_curry1(function toString(val) {
  return _toString(val, []);
});

export default toString;import invoker from "./invoker.js";
/**
 * The upper case version of a string.
 *
 * @func
 * @memberOf R
 * @since v0.9.0
 * @category String
 * @sig String -> String
 * @param {String} str The string to upper case.
 * @return {String} The upper case version of `str`.
 * @see R.toLower
 * @example
 *
 *      R.toUpper('abc'); //=> 'ABC'
 */

var toUpper =
/*#__PURE__*/
invoker(0, 'toUpperCase');
export default toUpper;import _reduce from "./internal/_reduce.js";
import _xwrap from "./internal/_xwrap.js";
import curryN from "./curryN.js";
/**
 * Initializes a transducer using supplied iterator function. Returns a single
 * item by iterating through the list, successively calling the transformed
 * iterator function and passing it an accumulator value and the current value
 * from the array, and then passing the result to the next call.
 *
 * The iterator function receives two values: *(acc, value)*. It will be
 * wrapped as a transformer to initialize the transducer. A transformer can be
 * passed directly in place of an iterator function. In both cases, iteration
 * may be stopped early with the [`R.reduced`](#reduced) function.
 *
 * A transducer is a function that accepts a transformer and returns a
 * transformer and can be composed directly.
 *
 * A transformer is an object that provides a 2-arity reducing iterator
 * function, step, 0-arity initial value function, init, and 1-arity result
 * extraction function, result. The step function is used as the iterator
 * function in reduce. The result function is used to convert the final
 * accumulator into the return type and in most cases is
 * [`R.identity`](#identity). The init function can be used to provide an
 * initial accumulator, but is ignored by transduce.
 *
 * The iteration is performed with [`R.reduce`](#reduce) after initializing the transducer.
 *
 * @func
 * @memberOf R
 * @since v0.12.0
 * @category List
 * @sig (c -> c) -> ((a, b) -> a) -> a -> [b] -> a
 * @param {Function} xf The transducer function. Receives a transformer and returns a transformer.
 * @param {Function} fn The iterator function. Receives two values, the accumulator and the
 *        current element from the array. Wrapped as transformer, if necessary, and used to
 *        initialize the transducer
 * @param {*} acc The initial accumulator value.
 * @param {Array} list The list to iterate over.
 * @return {*} The final, accumulated value.
 * @see R.reduce, R.reduced, R.into
 * @example
 *
 *      const numbers = [1, 2, 3, 4];
 *      const transducer = R.compose(R.map(R.add(1)), R.take(2));
 *      R.transduce(transducer, R.flip(R.append), [], numbers); //=> [2, 3]
 *
 *      const isOdd = (x) => x % 2 !== 0;
 *      const firstOddTransducer = R.compose(R.filter(isOdd), R.take(1));
 *      R.transduce(firstOddTransducer, R.flip(R.append), [], R.range(0, 100)); //=> [1]
 */

var transduce =
/*#__PURE__*/
curryN(4, function transduce(xf, fn, acc, list) {
  return _reduce(xf(typeof fn === 'function' ? _xwrap(fn) : fn), acc, list);
});
export default transduce;import _curry1 from "./internal/_curry1.js";
/**
 * Transposes the rows and columns of a 2D list.
 * When passed a list of `n` lists of length `x`,
 * returns a list of `x` lists of length `n`.
 *
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category List
 * @sig [[a]] -> [[a]]
 * @param {Array} list A 2D list
 * @return {Array} A 2D list
 * @example
 *
 *      R.transpose([[1, 'a'], [2, 'b'], [3, 'c']]) //=> [[1, 2, 3], ['a', 'b', 'c']]
 *      R.transpose([[1, 2, 3], ['a', 'b', 'c']]) //=> [[1, 'a'], [2, 'b'], [3, 'c']]
 *
 *      // If some of the rows are shorter than the following rows, their elements are skipped:
 *      R.transpose([[10, 11], [20], [], [30, 31, 32]]) //=> [[10, 20, 30], [11, 31], [32]]
 * @symb R.transpose([[a], [b], [c]]) = [a, b, c]
 * @symb R.transpose([[a, b], [c, d]]) = [[a, c], [b, d]]
 * @symb R.transpose([[a, b], [c]]) = [[a, c], [b]]
 */

var transpose =
/*#__PURE__*/
_curry1(function transpose(outerlist) {
  var i = 0;
  var result = [];

  while (i < outerlist.length) {
    var innerlist = outerlist[i];
    var j = 0;

    while (j < innerlist.length) {
      if (typeof result[j] === 'undefined') {
        result[j] = [];
      }

      result[j].push(innerlist[j]);
      j += 1;
    }

    i += 1;
  }

  return result;
});

export default transpose;import _curry3 from "./internal/_curry3.js";
import map from "./map.js";
import sequence from "./sequence.js";
/**
 * Maps an [Applicative](https://github.com/fantasyland/fantasy-land#applicative)-returning
 * function over a [Traversable](https://github.com/fantasyland/fantasy-land#traversable),
 * then uses [`sequence`](#sequence) to transform the resulting Traversable of Applicative
 * into an Applicative of Traversable.
 *
 * Dispatches to the `traverse` method of the third argument, if present.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category List
 * @sig (Applicative f, Traversable t) => (a -> f a) -> (a -> f b) -> t a -> f (t b)
 * @param {Function} of
 * @param {Function} f
 * @param {*} traversable
 * @return {*}
 * @see R.sequence
 * @example
 *
 *      // Returns `Maybe.Nothing` if the given divisor is `0`
 *      const safeDiv = n => d => d === 0 ? Maybe.Nothing() : Maybe.Just(n / d)
 *
 *      R.traverse(Maybe.of, safeDiv(10), [2, 4, 5]); //=> Maybe.Just([5, 2.5, 2])
 *      R.traverse(Maybe.of, safeDiv(10), [2, 0, 5]); //=> Maybe.Nothing
 */

var traverse =
/*#__PURE__*/
_curry3(function traverse(of, f, traversable) {
  return typeof traversable['fantasy-land/traverse'] === 'function' ? traversable['fantasy-land/traverse'](f, of) : typeof traversable.traverse === 'function' ? traversable.traverse(f, of) : sequence(of, map(f, traversable));
});

export default traverse;import _curry1 from "./internal/_curry1.js";
var ws = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u2000\u2001\u2002\u2003' + '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028' + '\u2029\uFEFF';
var zeroWidth = '\u200b';
var hasProtoTrim = typeof String.prototype.trim === 'function';
/**
 * Removes (strips) whitespace from both ends of the string.
 *
 * @func
 * @memberOf R
 * @since v0.6.0
 * @category String
 * @sig String -> String
 * @param {String} str The string to trim.
 * @return {String} Trimmed version of `str`.
 * @example
 *
 *      R.trim('   xyz  '); //=> 'xyz'
 *      R.map(R.trim, R.split(',', 'x, y, z')); //=> ['x', 'y', 'z']
 */

var trim = !hasProtoTrim ||
/*#__PURE__*/
ws.trim() || !
/*#__PURE__*/
zeroWidth.trim() ?
/*#__PURE__*/
_curry1(function trim(str) {
  var beginRx = new RegExp('^[' + ws + '][' + ws + ']*');
  var endRx = new RegExp('[' + ws + '][' + ws + ']*$');
  return str.replace(beginRx, '').replace(endRx, '');
}) :
/*#__PURE__*/
_curry1(function trim(str) {
  return str.trim();
});
export default trim;import _arity from "./internal/_arity.js";
import _concat from "./internal/_concat.js";
import _curry2 from "./internal/_curry2.js";
/**
 * `tryCatch` takes two functions, a `tryer` and a `catcher`. The returned
 * function evaluates the `tryer`; if it does not throw, it simply returns the
 * result. If the `tryer` *does* throw, the returned function evaluates the
 * `catcher` function and returns its result. Note that for effective
 * composition with this function, both the `tryer` and `catcher` functions
 * must return the same type of results.
 *
 * @func
 * @memberOf R
 * @since v0.20.0
 * @category Function
 * @sig (...x -> a) -> ((e, ...x) -> a) -> (...x -> a)
 * @param {Function} tryer The function that may throw.
 * @param {Function} catcher The function that will be evaluated if `tryer` throws.
 * @return {Function} A new function that will catch exceptions and send them to the catcher.
 * @example
 *
 *      R.tryCatch(R.prop('x'), R.F)({x: true}); //=> true
 *      R.tryCatch(() => { throw 'foo'}, R.always('caught'))('bar') // =>
 *      'caught'
 *      R.tryCatch(R.times(R.identity), R.always([]))('s') // => []
 *      R.tryCatch(() => { throw 'this is not a valid value'}, (err, value)=>({error : err,  value }))('bar') // => {'error': 'this is not a valid value', 'value': 'bar'}
 */

var tryCatch =
/*#__PURE__*/
_curry2(function _tryCatch(tryer, catcher) {
  return _arity(tryer.length, function () {
    try {
      return tryer.apply(this, arguments);
    } catch (e) {
      return catcher.apply(this, _concat([e], arguments));
    }
  });
});

export default tryCatch;import _curry1 from "./internal/_curry1.js";
/**
 * Gives a single-word string description of the (native) type of a value,
 * returning such answers as 'Object', 'Number', 'Array', or 'Null'. Does not
 * attempt to distinguish user Object types any further, reporting them all as
 * 'Object'.
 *
 * @func
 * @memberOf R
 * @since v0.8.0
 * @category Type
 * @sig (* -> {*}) -> String
 * @param {*} val The value to test
 * @return {String}
 * @example
 *
 *      R.type({}); //=> "Object"
 *      R.type(1); //=> "Number"
 *      R.type(false); //=> "Boolean"
 *      R.type('s'); //=> "String"
 *      R.type(null); //=> "Null"
 *      R.type([]); //=> "Array"
 *      R.type(/[A-z]/); //=> "RegExp"
 *      R.type(() => {}); //=> "Function"
 *      R.type(undefined); //=> "Undefined"
 */

var type =
/*#__PURE__*/
_curry1(function type(val) {
  return val === null ? 'Null' : val === undefined ? 'Undefined' : Object.prototype.toString.call(val).slice(8, -1);
});

export default type;import _curry1 from "./internal/_curry1.js";
/**
 * Takes a function `fn`, which takes a single array argument, and returns a
 * function which:
 *
 *   - takes any number of positional arguments;
 *   - passes these arguments to `fn` as an array; and
 *   - returns the result.
 *
 * In other words, `R.unapply` derives a variadic function from a function which
 * takes an array. `R.unapply` is the inverse of [`R.apply`](#apply).
 *
 * @func
 * @memberOf R
 * @since v0.8.0
 * @category Function
 * @sig ([*...] -> a) -> (*... -> a)
 * @param {Function} fn
 * @return {Function}
 * @see R.apply
 * @example
 *
 *      R.unapply(JSON.stringify)(1, 2, 3); //=> '[1,2,3]'
 * @symb R.unapply(f)(a, b) = f([a, b])
 */

var unapply =
/*#__PURE__*/
_curry1(function unapply(fn) {
  return function () {
    return fn(Array.prototype.slice.call(arguments, 0));
  };
});

export default unapply;import _curry1 from "./internal/_curry1.js";
import nAry from "./nAry.js";
/**
 * Wraps a function of any arity (including nullary) in a function that accepts
 * exactly 1 parameter. Any extraneous parameters will not be passed to the
 * supplied function.
 *
 * @func
 * @memberOf R
 * @since v0.2.0
 * @category Function
 * @sig (a -> b -> c -> ... -> z) -> (a -> z)
 * @param {Function} fn The function to wrap.
 * @return {Function} A new function wrapping `fn`. The new function is guaranteed to be of
 *         arity 1.
 * @see R.binary, R.nAry
 * @example
 *
 *      const takesTwoArgs = function(a, b) {
 *        return [a, b];
 *      };
 *      takesTwoArgs.length; //=> 2
 *      takesTwoArgs(1, 2); //=> [1, 2]
 *
 *      const takesOneArg = R.unary(takesTwoArgs);
 *      takesOneArg.length; //=> 1
 *      // Only 1 argument is passed to the wrapped function
 *      takesOneArg(1, 2); //=> [1, undefined]
 * @symb R.unary(f)(a, b, c) = f(a)
 */

var unary =
/*#__PURE__*/
_curry1(function unary(fn) {
  return nAry(1, fn);
});

export default unary;import _curry2 from "./internal/_curry2.js";
import curryN from "./curryN.js";
/**
 * Returns a function of arity `n` from a (manually) curried function.
 * Note that, the returned function is actually a ramda style
 * curryied function, which can accept one or more arguments in each
 * function calling.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category Function
 * @sig Number -> (a -> b -> c ... -> z) -> ((a -> b -> c ...) -> z)
 * @param {Number} length The arity for the returned function.
 * @param {Function} fn The function to uncurry.
 * @return {Function} A new function.
 * @see R.curry, R.curryN
 * @example
 *
 *      const addFour = a => b => c => d => a + b + c + d;
 *
 *      const uncurriedAddFour = R.uncurryN(4, addFour);
 *      uncurriedAddFour(1, 2, 3, 4); //=> 10
 */

var uncurryN =
/*#__PURE__*/
_curry2(function uncurryN(depth, fn) {
  return curryN(depth, function () {
    var currentDepth = 1;
    var value = fn;
    var idx = 0;
    var endIdx;

    while (currentDepth <= depth && typeof value === 'function') {
      endIdx = currentDepth === depth ? arguments.length : idx + value.length;
      value = value.apply(this, Array.prototype.slice.call(arguments, idx, endIdx));
      currentDepth += 1;
      idx = endIdx;
    }

    return value;
  });
});

export default uncurryN;import _curry2 from "./internal/_curry2.js";
/**
 * Builds a list from a seed value. Accepts an iterator function, which returns
 * either false to stop iteration or an array of length 2 containing the value
 * to add to the resulting list and the seed to be used in the next call to the
 * iterator function.
 *
 * The iterator function receives one argument: *(seed)*.
 *
 * @func
 * @memberOf R
 * @since v0.10.0
 * @category List
 * @sig (a -> [b]) -> * -> [b]
 * @param {Function} fn The iterator function. receives one argument, `seed`, and returns
 *        either false to quit iteration or an array of length two to proceed. The element
 *        at index 0 of this array will be added to the resulting array, and the element
 *        at index 1 will be passed to the next call to `fn`.
 * @param {*} seed The seed value.
 * @return {Array} The final list.
 * @example
 *
 *      const f = n => n > 50 ? false : [-n, n + 10];
 *      R.unfold(f, 10); //=> [-10, -20, -30, -40, -50]
 * @symb R.unfold(f, x) = [f(x)[0], f(f(x)[1])[0], f(f(f(x)[1])[1])[0], ...]
 */

var unfold =
/*#__PURE__*/
_curry2(function unfold(fn, seed) {
  var pair = fn(seed);
  var result = [];

  while (pair && pair.length) {
    result[result.length] = pair[0];
    pair = fn(pair[1]);
  }

  return result;
});

export default unfold;import _concat from "./internal/_concat.js";
import _curry2 from "./internal/_curry2.js";
import compose from "./compose.js";
import uniq from "./uniq.js";
/**
 * Combines two lists into a set (i.e. no duplicates) composed of the elements
 * of each list.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig [*] -> [*] -> [*]
 * @param {Array} as The first list.
 * @param {Array} bs The second list.
 * @return {Array} The first and second lists concatenated, with
 *         duplicates removed.
 * @example
 *
 *      R.union([1, 2, 3], [2, 3, 4]); //=> [1, 2, 3, 4]
 */

var union =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
compose(uniq, _concat));

export default union;import _concat from "./internal/_concat.js";
import _curry3 from "./internal/_curry3.js";
import uniqWith from "./uniqWith.js";
/**
 * Combines two lists into a set (i.e. no duplicates) composed of the elements
 * of each list. Duplication is determined according to the value returned by
 * applying the supplied predicate to two list elements. If an element exists
 * in both lists, the first element from the first list will be used.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Relation
 * @sig ((a, a) -> Boolean) -> [*] -> [*] -> [*]
 * @param {Function} pred A predicate used to test whether two items are equal.
 * @param {Array} list1 The first list.
 * @param {Array} list2 The second list.
 * @return {Array} The first and second lists concatenated, with
 *         duplicates removed.
 * @see R.union
 * @example
 *
 *      const l1 = [{a: 1}, {a: 2}];
 *      const l2 = [{a: 1}, {a: 4}];
 *      R.unionWith(R.eqBy(R.prop('a')), l1, l2); //=> [{a: 1}, {a: 2}, {a: 4}]
 */

var unionWith =
/*#__PURE__*/
_curry3(function unionWith(pred, list1, list2) {
  return uniqWith(pred, _concat(list1, list2));
});

export default unionWith;import identity from "./identity.js";
import uniqBy from "./uniqBy.js";
/**
 * Returns a new list containing only one copy of each element in the original
 * list. [`R.equals`](#equals) is used to determine equality.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig [a] -> [a]
 * @param {Array} list The array to consider.
 * @return {Array} The list of unique items.
 * @example
 *
 *      R.uniq([1, 1, 2, 1]); //=> [1, 2]
 *      R.uniq([1, '1']);     //=> [1, '1']
 *      R.uniq([[42], [42]]); //=> [[42]]
 */

var uniq =
/*#__PURE__*/
uniqBy(identity);
export default uniq;import _Set from "./internal/_Set.js";
import _curry2 from "./internal/_curry2.js";
import _dispatchable from "./internal/_dispatchable.js";
import _xuniqBy from "./internal/_xuniqBy.js";
/**
 * Returns a new list containing only one copy of each element in the original
 * list, based upon the value returned by applying the supplied function to
 * each list element. Prefers the first item if the supplied function produces
 * the same value on two items. [`R.equals`](#equals) is used for comparison.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category List
 * @sig (a -> b) -> [a] -> [a]
 * @param {Function} fn A function used to produce a value to use during comparisons.
 * @param {Array} list The array to consider.
 * @return {Array} The list of unique items.
 * @example
 *
 *      R.uniqBy(Math.abs, [-1, -5, 2, 10, 1, 2]); //=> [-1, -5, 2, 10]
 */

var uniqBy =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable([], _xuniqBy, function (fn, list) {
  var set = new _Set();
  var result = [];
  var idx = 0;
  var appliedItem, item;

  while (idx < list.length) {
    item = list[idx];
    appliedItem = fn(item);

    if (set.add(appliedItem)) {
      result.push(item);
    }

    idx += 1;
  }

  return result;
}));

export default uniqBy;import _curry2 from "./internal/_curry2.js";
import _dispatchable from "./internal/_dispatchable.js";
import _includesWith from "./internal/_includesWith.js";
import _xuniqWith from "./internal/_xuniqWith.js";
/**
 * Returns a new list containing only one copy of each element in the original
 * list, based upon the value returned by applying the supplied predicate to
 * two list elements. Prefers the first item if two items compare equal based
 * on the predicate.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.2.0
 * @category List
 * @sig ((a, a) -> Boolean) -> [a] -> [a]
 * @param {Function} pred A predicate used to test whether two items are equal.
 * @param {Array} list The array to consider.
 * @return {Array} The list of unique items.
 * @example
 *
 *      const strEq = R.eqBy(String);
 *      R.uniqWith(strEq)([1, '1', 2, 1]); //=> [1, 2]
 *      R.uniqWith(strEq)([{}, {}]);       //=> [{}]
 *      R.uniqWith(strEq)([1, '1', 1]);    //=> [1]
 *      R.uniqWith(strEq)(['1', 1, 1]);    //=> ['1']
 */

var uniqWith =
/*#__PURE__*/
_curry2(
/*#__PURE__*/
_dispatchable([], _xuniqWith, function (pred, list) {
  var idx = 0;
  var len = list.length;
  var result = [];
  var item;

  while (idx < len) {
    item = list[idx];

    if (!_includesWith(pred, item, result)) {
      result[result.length] = item;
    }

    idx += 1;
  }

  return result;
}));

export default uniqWith;import _curry3 from "./internal/_curry3.js";
/**
 * Tests the final argument by passing it to the given predicate function. If
 * the predicate is not satisfied, the function will return the result of
 * calling the `whenFalseFn` function with the same argument. If the predicate
 * is satisfied, the argument is returned as is.
 *
 * @func
 * @memberOf R
 * @since v0.18.0
 * @category Logic
 * @sig (a -> Boolean) -> (a -> b) -> a -> a | b
 * @param {Function} pred        A predicate function
 * @param {Function} whenFalseFn A function to invoke when the `pred` evaluates
 *                               to a falsy value.
 * @param {*}        x           An object to test with the `pred` function and
 *                               pass to `whenFalseFn` if necessary.
 * @return {*} Either `x` or the result of applying `x` to `whenFalseFn`.
 * @see R.ifElse, R.when, R.cond
 * @example
 *
 *      let safeInc = R.unless(R.isNil, R.inc);
 *      safeInc(null); //=> null
 *      safeInc(1); //=> 2
 */

var unless =
/*#__PURE__*/
_curry3(function unless(pred, whenFalseFn, x) {
  return pred(x) ? x : whenFalseFn(x);
});

export default unless;import _identity from "./internal/_identity.js";
import chain from "./chain.js";
/**
 * Shorthand for `R.chain(R.identity)`, which removes one level of nesting from
 * any [Chain](https://github.com/fantasyland/fantasy-land#chain).
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category List
 * @sig Chain c => c (c a) -> c a
 * @param {*} list
 * @return {*}
 * @see R.flatten, R.chain
 * @example
 *
 *      R.unnest([1, [2], [[3]]]); //=> [1, 2, [3]]
 *      R.unnest([[1, 2], [3, 4], [5, 6]]); //=> [1, 2, 3, 4, 5, 6]
 */

var unnest =
/*#__PURE__*/
chain(_identity);
export default unnest;import _curry3 from "./internal/_curry3.js";
/**
 * Takes a predicate, a transformation function, and an initial value,
 * and returns a value of the same type as the initial value.
 * It does so by applying the transformation until the predicate is satisfied,
 * at which point it returns the satisfactory value.
 *
 * @func
 * @memberOf R
 * @since v0.20.0
 * @category Logic
 * @sig (a -> Boolean) -> (a -> a) -> a -> a
 * @param {Function} pred A predicate function
 * @param {Function} fn The iterator function
 * @param {*} init Initial value
 * @return {*} Final value that satisfies predicate
 * @example
 *
 *      R.until(R.gt(R.__, 100), R.multiply(2))(1) // => 128
 */

var until =
/*#__PURE__*/
_curry3(function until(pred, fn, init) {
  var val = init;

  while (!pred(val)) {
    val = fn(val);
  }

  return val;
});

export default until;import _curry2 from "./internal/_curry2.js";
import _isArray from "./internal/_isArray.js";
import _map from "./internal/_map.js";
import _assoc from "./internal/_assoc.js";
/**
 *
 * Deconstructs an array field from the input documents to output a document for each element.
 * Each output document is the input document with the value of the array field replaced by the element.
 *
 * @func
 * @memberOf R
 * @since v0.28.0
 * @category Object
 * @sig String -> {k: [v]} -> [{k: v}]
 * @param {String} key The key to determine which property of the object should be unwind
 * @param {Object} object The object containing list under property named as key which is to unwind
 * @return {List} A new list of object containing the value of input key having list replaced by each element in the object.
 * @example
 *
 * R.unwind('hobbies', {
 *   name: 'alice',
 *   hobbies: ['Golf', 'Hacking'],
 *   colors: ['red', 'green'],
 * });
 * // [
 * //   { name: 'alice', hobbies: 'Golf', colors: ['red', 'green'] },
 * //   { name: 'alice', hobbies: 'Hacking', colors: ['red', 'green'] }
 * // ]
 */

var unwind =
/*#__PURE__*/
_curry2(function (key, object) {
  // If key is not in object or key is not as a list in object
  if (!(key in object && _isArray(object[key]))) {
    return [object];
  } // Map over object[key] which is a list and assoc each element with key


  return _map(function (item) {
    return _assoc(key, item, object);
  }, object[key]);
});

export default unwind;import _curry3 from "./internal/_curry3.js";
import adjust from "./adjust.js";
import always from "./always.js";
/**
 * Returns a new copy of the array with the element at the provided index
 * replaced with the given value.
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category List
 * @sig Number -> a -> [a] -> [a]
 * @param {Number} idx The index to update.
 * @param {*} x The value to exist at the given index of the returned array.
 * @param {Array|Arguments} list The source array-like object to be updated.
 * @return {Array} A copy of `list` with the value at index `idx` replaced with `x`.
 * @see R.adjust
 * @example
 *
 *      R.update(1, '_', ['a', 'b', 'c']);      //=> ['a', '_', 'c']
 *      R.update(-1, '_', ['a', 'b', 'c']);     //=> ['a', 'b', '_']
 * @symb R.update(-1, a, [b, c]) = [b, a]
 * @symb R.update(0, a, [b, c]) = [a, c]
 * @symb R.update(1, a, [b, c]) = [b, a]
 */

var update =
/*#__PURE__*/
_curry3(function update(idx, x, list) {
  return adjust(idx, always(x), list);
});

export default update;import _curry2 from "./internal/_curry2.js";
import curryN from "./curryN.js";
/**
 * Accepts a function `fn` and a list of transformer functions and returns a
 * new curried function. When the new function is invoked, it calls the
 * function `fn` with parameters consisting of the result of calling each
 * supplied handler on successive arguments to the new function.
 *
 * If more arguments are passed to the returned function than transformer
 * functions, those arguments are passed directly to `fn` as additional
 * parameters. If you expect additional arguments that don't need to be
 * transformed, although you can ignore them, it's best to pass an identity
 * function so that the new function reports the correct arity.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Function
 * @sig ((x1, x2, ...) -> z) -> [(a -> x1), (b -> x2), ...] -> (a -> b -> ... -> z)
 * @param {Function} fn The function to wrap.
 * @param {Array} transformers A list of transformer functions
 * @return {Function} The wrapped function.
 * @see R.converge
 * @example
 *
 *      R.useWith(Math.pow, [R.identity, R.identity])(3, 4); //=> 81
 *      R.useWith(Math.pow, [R.identity, R.identity])(3)(4); //=> 81
 *      R.useWith(Math.pow, [R.dec, R.inc])(3, 4); //=> 32
 *      R.useWith(Math.pow, [R.dec, R.inc])(3)(4); //=> 32
 * @symb R.useWith(f, [g, h])(a, b) = f(g(a), h(b))
 */

var useWith =
/*#__PURE__*/
_curry2(function useWith(fn, transformers) {
  return curryN(transformers.length, function () {
    var args = [];
    var idx = 0;

    while (idx < transformers.length) {
      args.push(transformers[idx].call(this, arguments[idx]));
      idx += 1;
    }

    return fn.apply(this, args.concat(Array.prototype.slice.call(arguments, transformers.length)));
  });
});

export default useWith;import _curry1 from "./internal/_curry1.js";
import keys from "./keys.js";
/**
 * Returns a list of all the enumerable own properties of the supplied object.
 * Note that the order of the output array is not guaranteed across different
 * JS platforms.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category Object
 * @sig {k: v} -> [v]
 * @param {Object} obj The object to extract values from
 * @return {Array} An array of the values of the object's own properties.
 * @see R.valuesIn, R.keys, R.toPairs
 * @example
 *
 *      R.values({a: 1, b: 2, c: 3}); //=> [1, 2, 3]
 */

var values =
/*#__PURE__*/
_curry1(function values(obj) {
  var props = keys(obj);
  var len = props.length;
  var vals = [];
  var idx = 0;

  while (idx < len) {
    vals[idx] = obj[props[idx]];
    idx += 1;
  }

  return vals;
});

export default values;import _curry1 from "./internal/_curry1.js";
/**
 * Returns a list of all the properties, including prototype properties, of the
 * supplied object.
 * Note that the order of the output array is not guaranteed to be consistent
 * across different JS platforms.
 *
 * @func
 * @memberOf R
 * @since v0.2.0
 * @category Object
 * @sig {k: v} -> [v]
 * @param {Object} obj The object to extract values from
 * @return {Array} An array of the values of the object's own and prototype properties.
 * @see R.values, R.keysIn
 * @example
 *
 *      const F = function() { this.x = 'X'; };
 *      F.prototype.y = 'Y';
 *      const f = new F();
 *      R.valuesIn(f); //=> ['X', 'Y']
 */

var valuesIn =
/*#__PURE__*/
_curry1(function valuesIn(obj) {
  var prop;
  var vs = [];

  for (prop in obj) {
    vs[vs.length] = obj[prop];
  }

  return vs;
});

export default valuesIn;import _curry2 from "./internal/_curry2.js"; // `Const` is a functor that effectively ignores the function given to `map`.

var Const = function (x) {
  return {
    value: x,
    'fantasy-land/map': function () {
      return this;
    }
  };
};
/**
 * Returns a "view" of the given data structure, determined by the given lens.
 * The lens's focus determines which portion of the data structure is visible.
 *
 * @func
 * @memberOf R
 * @since v0.16.0
 * @category Object
 * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
 * @sig Lens s a -> s -> a
 * @param {Lens} lens
 * @param {*} x
 * @return {*}
 * @see R.set, R.over, R.lens, R.lensIndex, R.lensProp, R.lensPath
 * @example
 *
 *      const xLens = R.lensProp('x');
 *
 *      R.view(xLens, {x: 1, y: 2});  //=> 1
 *      R.view(xLens, {x: 4, y: 2});  //=> 4
 */


var view =
/*#__PURE__*/
_curry2(function view(lens, x) {
  // Using `Const` effectively ignores the setter function of the `lens`,
  // leaving the value returned by the getter function unmodified.
  return lens(Const)(x).value;
});

export default view;import _curry3 from "./internal/_curry3.js";
/**
 * Tests the final argument by passing it to the given predicate function. If
 * the predicate is satisfied, the function will return the result of calling
 * the `whenTrueFn` function with the same argument. If the predicate is not
 * satisfied, the argument is returned as is.
 *
 * @func
 * @memberOf R
 * @since v0.18.0
 * @category Logic
 * @sig (a -> Boolean) -> (a -> b) -> a -> a | b
 * @param {Function} pred       A predicate function
 * @param {Function} whenTrueFn A function to invoke when the `condition`
 *                              evaluates to a truthy value.
 * @param {*}        x          An object to test with the `pred` function and
 *                              pass to `whenTrueFn` if necessary.
 * @return {*} Either `x` or the result of applying `x` to `whenTrueFn`.
 * @see R.ifElse, R.unless, R.cond
 * @example
 *
 *      // truncate :: String -> String
 *      const truncate = R.when(
 *        R.propSatisfies(R.gt(R.__, 10), 'length'),
 *        R.pipe(R.take(10), R.append('…'), R.join(''))
 *      );
 *      truncate('12345');         //=> '12345'
 *      truncate('0123456789ABC'); //=> '0123456789…'
 */

var when =
/*#__PURE__*/
_curry3(function when(pred, whenTrueFn, x) {
  return pred(x) ? whenTrueFn(x) : x;
});

export default when;import _curry2 from "./internal/_curry2.js";
import _has from "./internal/_has.js";
/**
 * Takes a spec object and a test object; returns true if the test satisfies
 * the spec. Each of the spec's own properties must be a predicate function.
 * Each predicate is applied to the value of the corresponding property of the
 * test object. `where` returns true if all the predicates return true, false
 * otherwise.
 *
 * `where` is well suited to declaratively expressing constraints for other
 * functions such as [`filter`](#filter) and [`find`](#find).
 *
 * @func
 * @memberOf R
 * @since v0.1.1
 * @category Object
 * @sig {String: (* -> Boolean)} -> {String: *} -> Boolean
 * @param {Object} spec
 * @param {Object} testObj
 * @return {Boolean}
 * @see R.propSatisfies, R.whereEq
 * @example
 *
 *      // pred :: Object -> Boolean
 *      const pred = R.where({
 *        a: R.equals('foo'),
 *        b: R.complement(R.equals('bar')),
 *        x: R.gt(R.__, 10),
 *        y: R.lt(R.__, 20)
 *      });
 *
 *      pred({a: 'foo', b: 'xxx', x: 11, y: 19}); //=> true
 *      pred({a: 'xxx', b: 'xxx', x: 11, y: 19}); //=> false
 *      pred({a: 'foo', b: 'bar', x: 11, y: 19}); //=> false
 *      pred({a: 'foo', b: 'xxx', x: 10, y: 19}); //=> false
 *      pred({a: 'foo', b: 'xxx', x: 11, y: 20}); //=> false
 */

var where =
/*#__PURE__*/
_curry2(function where(spec, testObj) {
  for (var prop in spec) {
    if (_has(prop, spec) && !spec[prop](testObj[prop])) {
      return false;
    }
  }

  return true;
});

export default where;import _curry2 from "./internal/_curry2.js";
import _has from "./internal/_has.js";
/**
 * Takes a spec object and a test object; each of the spec's own properties must be a predicate function.
 * Each predicate is applied to the value of the corresponding property of the
 * test object. `whereAny` returns true if at least one of the predicates return true,
 * false otherwise.
 *
 * `whereAny` is well suited to declaratively expressing constraints for other
 * functions such as [`filter`](#filter) and [`find`](#find).
 *
 * @func
 * @memberOf R
 * @since v0.28.0
 * @category Object
 * @sig {String: (* -> Boolean)} -> {String: *} -> Boolean
 * @param {Object} spec
 * @param {Object} testObj
 * @return {Boolean}
 * @see R.propSatisfies, R.where
 * @example
 *
 *      // pred :: Object -> Boolean
 *      const pred = R.whereAny({
 *        a: R.equals('foo'),
 *        b: R.complement(R.equals('xxx')),
 *        x: R.gt(R.__, 10),
 *        y: R.lt(R.__, 20)
 *      });
 *
 *      pred({a: 'foo', b: 'xxx', x: 8, y: 34}); //=> true
 *      pred({a: 'xxx', b: 'xxx', x: 9, y: 21}); //=> false
 *      pred({a: 'bar', b: 'xxx', x: 10, y: 20}); //=> false
 *      pred({a: 'foo', b: 'bar', x: 10, y: 20}); //=> true
 *      pred({a: 'foo', b: 'xxx', x: 11, y: 20}); //=> true
 */

var whereAny =
/*#__PURE__*/
_curry2(function whereAny(spec, testObj) {
  for (var prop in spec) {
    if (_has(prop, spec) && spec[prop](testObj[prop])) {
      return true;
    }
  }

  return false;
});

export default whereAny;import _curry2 from "./internal/_curry2.js";
import equals from "./equals.js";
import map from "./map.js";
import where from "./where.js";
/**
 * Takes a spec object and a test object; returns true if the test satisfies
 * the spec, false otherwise. An object satisfies the spec if, for each of the
 * spec's own properties, accessing that property of the object gives the same
 * value (in [`R.equals`](#equals) terms) as accessing that property of the
 * spec.
 *
 * `whereEq` is a specialization of [`where`](#where).
 *
 * @func
 * @memberOf R
 * @since v0.14.0
 * @category Object
 * @sig {String: *} -> {String: *} -> Boolean
 * @param {Object} spec
 * @param {Object} testObj
 * @return {Boolean}
 * @see R.propEq, R.where
 * @example
 *
 *      // pred :: Object -> Boolean
 *      const pred = R.whereEq({a: 1, b: 2});
 *
 *      pred({a: 1});              //=> false
 *      pred({a: 1, b: 2});        //=> true
 *      pred({a: 1, b: 2, c: 3});  //=> true
 *      pred({a: 1, b: 1});        //=> false
 */

var whereEq =
/*#__PURE__*/
_curry2(function whereEq(spec, testObj) {
  return where(map(equals, spec), testObj);
});

export default whereEq;import _includes from "./internal/_includes.js";
import _curry2 from "./internal/_curry2.js";
import flip from "./flip.js";
import reject from "./reject.js";
/**
 * Returns a new list without values in the first argument.
 * [`R.equals`](#equals) is used to determine equality.
 *
 * Acts as a transducer if a transformer is given in list position.
 *
 * @func
 * @memberOf R
 * @since v0.19.0
 * @category List
 * @sig [a] -> [a] -> [a]
 * @param {Array} list1 The values to be removed from `list2`.
 * @param {Array} list2 The array to remove values from.
 * @return {Array} The new array without values in `list1`.
 * @see R.transduce, R.difference, R.remove
 * @example
 *
 *      R.without([1, 2], [1, 2, 1, 3, 4]); //=> [3, 4]
 */

var without =
/*#__PURE__*/
_curry2(function (xs, list) {
  return reject(flip(_includes)(xs), list);
});

export default without;import _curry2 from "./internal/_curry2.js";
/**
 * Exclusive disjunction logical operation.
 * Returns `true` if one of the arguments is truthy and the other is falsy.
 * Otherwise, it returns `false`.
 *
 * @func
 * @memberOf R
 * @since v0.27.1
 * @category Logic
 * @sig a -> b -> Boolean
 * @param {Any} a
 * @param {Any} b
 * @return {Boolean} true if one of the arguments is truthy and the other is falsy
 * @see R.or, R.and
 * @example
 *
 *      R.xor(true, true); //=> false
 *      R.xor(true, false); //=> true
 *      R.xor(false, true); //=> true
 *      R.xor(false, false); //=> false
 */

var xor =
/*#__PURE__*/
_curry2(function xor(a, b) {
  return Boolean(!a ^ !b);
});

export default xor;import _curry2 from "./internal/_curry2.js";
/**
 * Creates a new list out of the two supplied by creating each possible pair
 * from the lists.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig [a] -> [b] -> [[a,b]]
 * @param {Array} as The first list.
 * @param {Array} bs The second list.
 * @return {Array} The list made by combining each possible pair from
 *         `as` and `bs` into pairs (`[a, b]`).
 * @example
 *
 *      R.xprod([1, 2], ['a', 'b']); //=> [[1, 'a'], [1, 'b'], [2, 'a'], [2, 'b']]
 * @symb R.xprod([a, b], [c, d]) = [[a, c], [a, d], [b, c], [b, d]]
 */

var xprod =
/*#__PURE__*/
_curry2(function xprod(a, b) {
  // = xprodWith(prepend); (takes about 3 times as long...)
  var idx = 0;
  var ilen = a.length;
  var j;
  var jlen = b.length;
  var result = [];

  while (idx < ilen) {
    j = 0;

    while (j < jlen) {
      result[result.length] = [a[idx], b[j]];
      j += 1;
    }

    idx += 1;
  }

  return result;
});

export default xprod;import _curry2 from "./internal/_curry2.js";
/**
 * Creates a new list out of the two supplied by pairing up equally-positioned
 * items from both lists. The returned list is truncated to the length of the
 * shorter of the two input lists.
 * Note: `zip` is equivalent to `zipWith(function(a, b) { return [a, b] })`.
 *
 * @func
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig [a] -> [b] -> [[a,b]]
 * @param {Array} list1 The first array to consider.
 * @param {Array} list2 The second array to consider.
 * @return {Array} The list made by pairing up same-indexed elements of `list1` and `list2`.
 * @example
 *
 *      R.zip([1, 2, 3], ['a', 'b', 'c']); //=> [[1, 'a'], [2, 'b'], [3, 'c']]
 * @symb R.zip([a, b, c], [d, e, f]) = [[a, d], [b, e], [c, f]]
 */

var zip =
/*#__PURE__*/
_curry2(function zip(a, b) {
  var rv = [];
  var idx = 0;
  var len = Math.min(a.length, b.length);

  while (idx < len) {
    rv[idx] = [a[idx], b[idx]];
    idx += 1;
  }

  return rv;
});

export default zip;import _curry2 from "./internal/_curry2.js";
/**
 * Creates a new object out of a list of keys and a list of values.
 * Key/value pairing is truncated to the length of the shorter of the two lists.
 * Note: `zipObj` is equivalent to `pipe(zip, fromPairs)`.
 *
 * @func
 * @memberOf R
 * @since v0.3.0
 * @category List
 * @sig [String] -> [*] -> {String: *}
 * @param {Array} keys The array that will be properties on the output object.
 * @param {Array} values The list of values on the output object.
 * @return {Object} The object made by pairing up same-indexed elements of `keys` and `values`.
 * @example
 *
 *      R.zipObj(['a', 'b', 'c'], [1, 2, 3]); //=> {a: 1, b: 2, c: 3}
 */

var zipObj =
/*#__PURE__*/
_curry2(function zipObj(keys, values) {
  var idx = 0;
  var len = Math.min(keys.length, values.length);
  var out = {};

  while (idx < len) {
    out[keys[idx]] = values[idx];
    idx += 1;
  }

  return out;
});

export default zipObj;import _curry3 from "./internal/_curry3.js";
/**
 * Creates a new list out of the two supplied by applying the function to each
 * equally-positioned pair in the lists. The returned list is truncated to the
 * length of the shorter of the two input lists.
 *
 * @function
 * @memberOf R
 * @since v0.1.0
 * @category List
 * @sig ((a, b) -> c) -> [a] -> [b] -> [c]
 * @param {Function} fn The function used to combine the two elements into one value.
 * @param {Array} list1 The first array to consider.
 * @param {Array} list2 The second array to consider.
 * @return {Array} The list made by combining same-indexed elements of `list1` and `list2`
 *         using `fn`.
 * @example
 *
 *      const f = (x, y) => {
 *        // ...
 *      };
 *      R.zipWith(f, [1, 2, 3], ['a', 'b', 'c']);
 *      //=> [f(1, 'a'), f(2, 'b'), f(3, 'c')]
 * @symb R.zipWith(fn, [a, b, c], [d, e, f]) = [fn(a, d), fn(b, e), fn(c, f)]
 */

var zipWith =
/*#__PURE__*/
_curry3(function zipWith(fn, a, b) {
  var rv = [];
  var idx = 0;
  var len = Math.min(a.length, b.length);

  while (idx < len) {
    rv[idx] = fn(a[idx], b[idx]);
    idx += 1;
  }

  return rv;
});

export default zipWith;import _includes from "./_includes.js";

var _Set =
/*#__PURE__*/
function () {
  function _Set() {
    /* globals Set */
    this._nativeSet = typeof Set === 'function' ? new Set() : null;
    this._items = {};
  }

  // until we figure out why jsdoc chokes on this
  // @param item The item to add to the Set
  // @returns {boolean} true if the item did not exist prior, otherwise false
  //
  _Set.prototype.add = function (item) {
    return !hasOrAdd(item, true, this);
  }; //
  // @param item The item to check for existence in the Set
  // @returns {boolean} true if the item exists in the Set, otherwise false
  //


  _Set.prototype.has = function (item) {
    return hasOrAdd(item, false, this);
  }; //
  // Combines the logic for checking whether an item is a member of the set and
  // for adding a new item to the set.
  //
  // @param item       The item to check or add to the Set instance.
  // @param shouldAdd  If true, the item will be added to the set if it doesn't
  //                   already exist.
  // @param set        The set instance to check or add to.
  // @return {boolean} true if the item already existed, otherwise false.
  //


  return _Set;
}();

function hasOrAdd(item, shouldAdd, set) {
  var type = typeof item;
  var prevSize, newSize;

  switch (type) {
    case 'string':
    case 'number':
      // distinguish between +0 and -0
      if (item === 0 && 1 / item === -Infinity) {
        if (set._items['-0']) {
          return true;
        } else {
          if (shouldAdd) {
            set._items['-0'] = true;
          }

          return false;
        }
      } // these types can all utilise the native Set


      if (set._nativeSet !== null) {
        if (shouldAdd) {
          prevSize = set._nativeSet.size;

          set._nativeSet.add(item);

          newSize = set._nativeSet.size;
          return newSize === prevSize;
        } else {
          return set._nativeSet.has(item);
        }
      } else {
        if (!(type in set._items)) {
          if (shouldAdd) {
            set._items[type] = {};
            set._items[type][item] = true;
          }

          return false;
        } else if (item in set._items[type]) {
          return true;
        } else {
          if (shouldAdd) {
            set._items[type][item] = true;
          }

          return false;
        }
      }

    case 'boolean':
      // set._items['boolean'] holds a two element array
      // representing [ falseExists, trueExists ]
      if (type in set._items) {
        var bIdx = item ? 1 : 0;

        if (set._items[type][bIdx]) {
          return true;
        } else {
          if (shouldAdd) {
            set._items[type][bIdx] = true;
          }

          return false;
        }
      } else {
        if (shouldAdd) {
          set._items[type] = item ? [false, true] : [true, false];
        }

        return false;
      }

    case 'function':
      // compare functions for reference equality
      if (set._nativeSet !== null) {
        if (shouldAdd) {
          prevSize = set._nativeSet.size;

          set._nativeSet.add(item);

          newSize = set._nativeSet.size;
          return newSize === prevSize;
        } else {
          return set._nativeSet.has(item);
        }
      } else {
        if (!(type in set._items)) {
          if (shouldAdd) {
            set._items[type] = [item];
          }

          return false;
        }

        if (!_includes(item, set._items[type])) {
          if (shouldAdd) {
            set._items[type].push(item);
          }

          return false;
        }

        return true;
      }

    case 'undefined':
      if (set._items[type]) {
        return true;
      } else {
        if (shouldAdd) {
          set._items[type] = true;
        }

        return false;
      }

    case 'object':
      if (item === null) {
        if (!set._items['null']) {
          if (shouldAdd) {
            set._items['null'] = true;
          }

          return false;
        }

        return true;
      }

    /* falls through */

    default:
      // reduce the search size of heterogeneous sets by creating buckets
      // for each type.
      type = Object.prototype.toString.call(item);

      if (!(type in set._items)) {
        if (shouldAdd) {
          set._items[type] = [item];
        }

        return false;
      } // scan through all previously applied items


      if (!_includes(item, set._items[type])) {
        if (shouldAdd) {
          set._items[type].push(item);
        }

        return false;
      }

      return true;
  }
} // A simple Set type that honours R.equals semantics


export default _Set;export default function _aperture(n, list) {
  var idx = 0;
  var limit = list.length - (n - 1);
  var acc = new Array(limit >= 0 ? limit : 0);

  while (idx < limit) {
    acc[idx] = Array.prototype.slice.call(list, idx, idx + n);
    idx += 1;
  }

  return acc;
}export default function _arity(n, fn) {
  /* eslint-disable no-unused-vars */
  switch (n) {
    case 0:
      return function () {
        return fn.apply(this, arguments);
      };

    case 1:
      return function (a0) {
        return fn.apply(this, arguments);
      };

    case 2:
      return function (a0, a1) {
        return fn.apply(this, arguments);
      };

    case 3:
      return function (a0, a1, a2) {
        return fn.apply(this, arguments);
      };

    case 4:
      return function (a0, a1, a2, a3) {
        return fn.apply(this, arguments);
      };

    case 5:
      return function (a0, a1, a2, a3, a4) {
        return fn.apply(this, arguments);
      };

    case 6:
      return function (a0, a1, a2, a3, a4, a5) {
        return fn.apply(this, arguments);
      };

    case 7:
      return function (a0, a1, a2, a3, a4, a5, a6) {
        return fn.apply(this, arguments);
      };

    case 8:
      return function (a0, a1, a2, a3, a4, a5, a6, a7) {
        return fn.apply(this, arguments);
      };

    case 9:
      return function (a0, a1, a2, a3, a4, a5, a6, a7, a8) {
        return fn.apply(this, arguments);
      };

    case 10:
      return function (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) {
        return fn.apply(this, arguments);
      };

    default:
      throw new Error('First argument to _arity must be a non-negative integer no greater than ten');
  }
}export default function _arrayFromIterator(iter) {
  var list = [];
  var next;

  while (!(next = iter.next()).done) {
    list.push(next.value);
  }

  return list;
}import _isFunction from "./_isFunction.js";
import _toString from "./_toString.js";
export default function _assertPromise(name, p) {
  if (p == null || !_isFunction(p.then)) {
    throw new TypeError('`' + name + '` expected a Promise, received ' + _toString(p, []));
  }
}import _isArray from "./_isArray.js";
import _isInteger from "./_isInteger.js";
/**
 * Makes a shallow clone of an object, setting or overriding the specified
 * property with the given value. Note that this copies and flattens prototype
 * properties onto the new object as well. All non-primitive properties are
 * copied by reference.
 *
 * @private
 * @param {String|Number} prop The property name to set
 * @param {*} val The new value
 * @param {Object|Array} obj The object to clone
 * @return {Object|Array} A new object equivalent to the original except for the changed property.
 */

export default function _assoc(prop, val, obj) {
  if (_isInteger(prop) && _isArray(obj)) {
    var arr = [].concat(obj);
    arr[prop] = val;
    return arr;
  }

  var result = {};

  for (var p in obj) {
    result[p] = obj[p];
  }

  result[prop] = val;
  return result;
}import _isArray from "./_isArray.js";
/**
 * This checks whether a function has a [methodname] function. If it isn't an
 * array it will execute that function otherwise it will default to the ramda
 * implementation.
 *
 * @private
 * @param {Function} fn ramda implementation
 * @param {String} methodname property to check for a custom implementation
 * @return {Object} Whatever the return value of the method is.
 */

export default function _checkForMethod(methodname, fn) {
  return function () {
    var length = arguments.length;

    if (length === 0) {
      return fn();
    }

    var obj = arguments[length - 1];
    return _isArray(obj) || typeof obj[methodname] !== 'function' ? fn.apply(this, arguments) : obj[methodname].apply(obj, Array.prototype.slice.call(arguments, 0, length - 1));
  };
}import _cloneRegExp from "./_cloneRegExp.js";
import type from "../type.js";
/**
 * Copies an object.
 *
 * @private
 * @param {*} value The value to be copied
 * @param {Array} refFrom Array containing the source references
 * @param {Array} refTo Array containing the copied source references
 * @param {Boolean} deep Whether or not to perform deep cloning.
 * @return {*} The copied value.
 */

export default function _clone(value, refFrom, refTo, deep) {
  var copy = function copy(copiedValue) {
    var len = refFrom.length;
    var idx = 0;

    while (idx < len) {
      if (value === refFrom[idx]) {
        return refTo[idx];
      }

      idx += 1;
    }

    refFrom[idx] = value;
    refTo[idx] = copiedValue;

    for (var key in value) {
      if (value.hasOwnProperty(key)) {
        copiedValue[key] = deep ? _clone(value[key], refFrom, refTo, true) : value[key];
      }
    }

    return copiedValue;
  };

  switch (type(value)) {
    case 'Object':
      return copy(Object.create(Object.getPrototypeOf(value)));

    case 'Array':
      return copy([]);

    case 'Date':
      return new Date(value.valueOf());

    case 'RegExp':
      return _cloneRegExp(value);

    case 'Int8Array':
    case 'Uint8Array':
    case 'Uint8ClampedArray':
    case 'Int16Array':
    case 'Uint16Array':
    case 'Int32Array':
    case 'Uint32Array':
    case 'Float32Array':
    case 'Float64Array':
    case 'BigInt64Array':
    case 'BigUint64Array':
      return value.slice();

    default:
      return value;
  }
}export default function _cloneRegExp(pattern) {
  return new RegExp(pattern.source, (pattern.global ? 'g' : '') + (pattern.ignoreCase ? 'i' : '') + (pattern.multiline ? 'm' : '') + (pattern.sticky ? 'y' : '') + (pattern.unicode ? 'u' : ''));
}export default function _complement(f) {
  return function () {
    return !f.apply(this, arguments);
  };
}/**
 * Private `concat` function to merge two array-like objects.
 *
 * @private
 * @param {Array|Arguments} [set1=[]] An array-like object.
 * @param {Array|Arguments} [set2=[]] An array-like object.
 * @return {Array} A new, merged array.
 * @example
 *
 *      _concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3]
 */
export default function _concat(set1, set2) {
  set1 = set1 || [];
  set2 = set2 || [];
  var idx;
  var len1 = set1.length;
  var len2 = set2.length;
  var result = [];
  idx = 0;

  while (idx < len1) {
    result[result.length] = set1[idx];
    idx += 1;
  }

  idx = 0;

  while (idx < len2) {
    result[result.length] = set2[idx];
    idx += 1;
  }

  return result;
}import _arity from "./_arity.js";
import _curry2 from "./_curry2.js";
export default function _createPartialApplicator(concat) {
  return _curry2(function (fn, args) {
    return _arity(Math.max(0, fn.length - args.length), function () {
      return fn.apply(this, concat(args, arguments));
    });
  });
}import _isPlaceholder from "./_isPlaceholder.js";
/**
 * Optimized internal one-arity curry function.
 *
 * @private
 * @category Function
 * @param {Function} fn The function to curry.
 * @return {Function} The curried function.
 */

export default function _curry1(fn) {
  return function f1(a) {
    if (arguments.length === 0 || _isPlaceholder(a)) {
      return f1;
    } else {
      return fn.apply(this, arguments);
    }
  };
}import _curry1 from "./_curry1.js";
import _isPlaceholder from "./_isPlaceholder.js";
/**
 * Optimized internal two-arity curry function.
 *
 * @private
 * @category Function
 * @param {Function} fn The function to curry.
 * @return {Function} The curried function.
 */

export default function _curry2(fn) {
  return function f2(a, b) {
    switch (arguments.length) {
      case 0:
        return f2;

      case 1:
        return _isPlaceholder(a) ? f2 : _curry1(function (_b) {
          return fn(a, _b);
        });

      default:
        return _isPlaceholder(a) && _isPlaceholder(b) ? f2 : _isPlaceholder(a) ? _curry1(function (_a) {
          return fn(_a, b);
        }) : _isPlaceholder(b) ? _curry1(function (_b) {
          return fn(a, _b);
        }) : fn(a, b);
    }
  };
}import _curry1 from "./_curry1.js";
import _curry2 from "./_curry2.js";
import _isPlaceholder from "./_isPlaceholder.js";
/**
 * Optimized internal three-arity curry function.
 *
 * @private
 * @category Function
 * @param {Function} fn The function to curry.
 * @return {Function} The curried function.
 */

export default function _curry3(fn) {
  return function f3(a, b, c) {
    switch (arguments.length) {
      case 0:
        return f3;

      case 1:
        return _isPlaceholder(a) ? f3 : _curry2(function (_b, _c) {
          return fn(a, _b, _c);
        });

      case 2:
        return _isPlaceholder(a) && _isPlaceholder(b) ? f3 : _isPlaceholder(a) ? _curry2(function (_a, _c) {
          return fn(_a, b, _c);
        }) : _isPlaceholder(b) ? _curry2(function (_b, _c) {
          return fn(a, _b, _c);
        }) : _curry1(function (_c) {
          return fn(a, b, _c);
        });

      default:
        return _isPlaceholder(a) && _isPlaceholder(b) && _isPlaceholder(c) ? f3 : _isPlaceholder(a) && _isPlaceholder(b) ? _curry2(function (_a, _b) {
          return fn(_a, _b, c);
        }) : _isPlaceholder(a) && _isPlaceholder(c) ? _curry2(function (_a, _c) {
          return fn(_a, b, _c);
        }) : _isPlaceholder(b) && _isPlaceholder(c) ? _curry2(function (_b, _c) {
          return fn(a, _b, _c);
        }) : _isPlaceholder(a) ? _curry1(function (_a) {
          return fn(_a, b, c);
        }) : _isPlaceholder(b) ? _curry1(function (_b) {
          return fn(a, _b, c);
        }) : _isPlaceholder(c) ? _curry1(function (_c) {
          return fn(a, b, _c);
        }) : fn(a, b, c);
    }
  };
}import _arity from "./_arity.js";
import _isPlaceholder from "./_isPlaceholder.js";
/**
 * Internal curryN function.
 *
 * @private
 * @category Function
 * @param {Number} length The arity of the curried function.
 * @param {Array} received An array of arguments received thus far.
 * @param {Function} fn The function to curry.
 * @return {Function} The curried function.
 */

export default function _curryN(length, received, fn) {
  return function () {
    var combined = [];
    var argsIdx = 0;
    var left = length;
    var combinedIdx = 0;

    while (combinedIdx < received.length || argsIdx < arguments.length) {
      var result;

      if (combinedIdx < received.length && (!_isPlaceholder(received[combinedIdx]) || argsIdx >= arguments.length)) {
        result = received[combinedIdx];
      } else {
        result = arguments[argsIdx];
        argsIdx += 1;
      }

      combined[combinedIdx] = result;

      if (!_isPlaceholder(result)) {
        left -= 1;
      }

      combinedIdx += 1;
    }

    return left <= 0 ? fn.apply(this, combined) : _arity(left, _curryN(length, combined, fn));
  };
}import _isArray from "./_isArray.js";
import _isTransformer from "./_isTransformer.js";
/**
 * Returns a function that dispatches with different strategies based on the
 * object in list position (last argument). If it is an array, executes [fn].
 * Otherwise, if it has a function with one of the given method names, it will
 * execute that function (functor case). Otherwise, if it is a transformer,
 * uses transducer created by [transducerCreator] to return a new transformer
 * (transducer case).
 * Otherwise, it will default to executing [fn].
 *
 * @private
 * @param {Array} methodNames properties to check for a custom implementation
 * @param {Function} transducerCreator transducer factory if object is transformer
 * @param {Function} fn default ramda implementation
 * @return {Function} A function that dispatches on object in list position
 */

export default function _dispatchable(methodNames, transducerCreator, fn) {
  return function () {
    if (arguments.length === 0) {
      return fn();
    }

    var obj = arguments[arguments.length - 1];

    if (!_isArray(obj)) {
      var idx = 0;

      while (idx < methodNames.length) {
        if (typeof obj[methodNames[idx]] === 'function') {
          return obj[methodNames[idx]].apply(obj, Array.prototype.slice.call(arguments, 0, -1));
        }

        idx += 1;
      }

      if (_isTransformer(obj)) {
        var transducer = transducerCreator.apply(null, Array.prototype.slice.call(arguments, 0, -1));
        return transducer(obj);
      }
    }

    return fn.apply(this, arguments);
  };
}import _isInteger from "./_isInteger.js";
import _isArray from "./_isArray.js";
import remove from "../remove.js";
/**
 * Returns a new object that does not contain a `prop` property.
 *
 * @private
 * @param {String|Number} prop The name of the property to dissociate
 * @param {Object|Array} obj The object to clone
 * @return {Object} A new object equivalent to the original but without the specified property
 */

export default function _dissoc(prop, obj) {
  if (obj == null) {
    return obj;
  }

  if (_isInteger(prop) && _isArray(obj)) {
    return remove(prop, 1, obj);
  }

  var result = {};

  for (var p in obj) {
    result[p] = obj[p];
  }

  delete result[prop];
  return result;
}import take from "../take.js";
export default function dropLast(n, xs) {
  return take(n < xs.length ? xs.length - n : 0, xs);
}import slice from "../slice.js";
export default function dropLastWhile(pred, xs) {
  var idx = xs.length - 1;

  while (idx >= 0 && pred(xs[idx])) {
    idx -= 1;
  }

  return slice(0, idx + 1, xs);
}import _arrayFromIterator from "./_arrayFromIterator.js";
import _includesWith from "./_includesWith.js";
import _functionName from "./_functionName.js";
import _has from "./_has.js";
import _objectIs from "./_objectIs.js";
import keys from "../keys.js";
import type from "../type.js";
/**
 * private _uniqContentEquals function.
 * That function is checking equality of 2 iterator contents with 2 assumptions
 * - iterators lengths are the same
 * - iterators values are unique
 *
 * false-positive result will be returned for comparison of, e.g.
 * - [1,2,3] and [1,2,3,4]
 * - [1,1,1] and [1,2,3]
 * */

function _uniqContentEquals(aIterator, bIterator, stackA, stackB) {
  var a = _arrayFromIterator(aIterator);

  var b = _arrayFromIterator(bIterator);

  function eq(_a, _b) {
    return _equals(_a, _b, stackA.slice(), stackB.slice());
  } // if *a* array contains any element that is not included in *b*


  return !_includesWith(function (b, aItem) {
    return !_includesWith(eq, aItem, b);
  }, b, a);
}

export default function _equals(a, b, stackA, stackB) {
  if (_objectIs(a, b)) {
    return true;
  }

  var typeA = type(a);

  if (typeA !== type(b)) {
    return false;
  }

  if (typeof a['fantasy-land/equals'] === 'function' || typeof b['fantasy-land/equals'] === 'function') {
    return typeof a['fantasy-land/equals'] === 'function' && a['fantasy-land/equals'](b) && typeof b['fantasy-land/equals'] === 'function' && b['fantasy-land/equals'](a);
  }

  if (typeof a.equals === 'function' || typeof b.equals === 'function') {
    return typeof a.equals === 'function' && a.equals(b) && typeof b.equals === 'function' && b.equals(a);
  }

  switch (typeA) {
    case 'Arguments':
    case 'Array':
    case 'Object':
      if (typeof a.constructor === 'function' && _functionName(a.constructor) === 'Promise') {
        return a === b;
      }

      break;

    case 'Boolean':
    case 'Number':
    case 'String':
      if (!(typeof a === typeof b && _objectIs(a.valueOf(), b.valueOf()))) {
        return false;
      }

      break;

    case 'Date':
      if (!_objectIs(a.valueOf(), b.valueOf())) {
        return false;
      }

      break;

    case 'Error':
      return a.name === b.name && a.message === b.message;

    case 'RegExp':
      if (!(a.source === b.source && a.global === b.global && a.ignoreCase === b.ignoreCase && a.multiline === b.multiline && a.sticky === b.sticky && a.unicode === b.unicode)) {
        return false;
      }

      break;
  }

  var idx = stackA.length - 1;

  while (idx >= 0) {
    if (stackA[idx] === a) {
      return stackB[idx] === b;
    }

    idx -= 1;
  }

  switch (typeA) {
    case 'Map':
      if (a.size !== b.size) {
        return false;
      }

      return _uniqContentEquals(a.entries(), b.entries(), stackA.concat([a]), stackB.concat([b]));

    case 'Set':
      if (a.size !== b.size) {
        return false;
      }

      return _uniqContentEquals(a.values(), b.values(), stackA.concat([a]), stackB.concat([b]));

    case 'Arguments':
    case 'Array':
    case 'Object':
    case 'Boolean':
    case 'Number':
    case 'String':
    case 'Date':
    case 'Error':
    case 'RegExp':
    case 'Int8Array':
    case 'Uint8Array':
    case 'Uint8ClampedArray':
    case 'Int16Array':
    case 'Uint16Array':
    case 'Int32Array':
    case 'Uint32Array':
    case 'Float32Array':
    case 'Float64Array':
    case 'ArrayBuffer':
      break;

    default:
      // Values of other types are only equal if identical.
      return false;
  }

  var keysA = keys(a);

  if (keysA.length !== keys(b).length) {
    return false;
  }

  var extendedStackA = stackA.concat([a]);
  var extendedStackB = stackB.concat([b]);
  idx = keysA.length - 1;

  while (idx >= 0) {
    var key = keysA[idx];

    if (!(_has(key, b) && _equals(b[key], a[key], extendedStackA, extendedStackB))) {
      return false;
    }

    idx -= 1;
  }

  return true;
}export default function _filter(fn, list) {
  var idx = 0;
  var len = list.length;
  var result = [];

  while (idx < len) {
    if (fn(list[idx])) {
      result[result.length] = list[idx];
    }

    idx += 1;
  }

  return result;
}import _forceReduced from "./_forceReduced.js";
import _isArrayLike from "./_isArrayLike.js";
import _reduce from "./_reduce.js";
import _xfBase from "./_xfBase.js";

var preservingReduced = function (xf) {
  return {
    '@@transducer/init': _xfBase.init,
    '@@transducer/result': function (result) {
      return xf['@@transducer/result'](result);
    },
    '@@transducer/step': function (result, input) {
      var ret = xf['@@transducer/step'](result, input);
      return ret['@@transducer/reduced'] ? _forceReduced(ret) : ret;
    }
  };
};

var _flatCat = function _xcat(xf) {
  var rxf = preservingReduced(xf);
  return {
    '@@transducer/init': _xfBase.init,
    '@@transducer/result': function (result) {
      return rxf['@@transducer/result'](result);
    },
    '@@transducer/step': function (result, input) {
      return !_isArrayLike(input) ? _reduce(rxf, result, [input]) : _reduce(rxf, result, input);
    }
  };
};

export default _flatCat;export default function _forceReduced(x) {
  return {
    '@@transducer/value': x,
    '@@transducer/reduced': true
  };
}export default function _functionName(f) {
  // String(x => x) evaluates to "x => x", so the pattern may not match.
  var match = String(f).match(/^function (\w*)/);
  return match == null ? '' : match[1];
}import _filter from "./_filter.js";
/**
 * @private
 * @param {Function} fn The strategy for extracting function names from an object
 * @return {Function} A function that takes an object and returns an array of function names.
 */

export default function _functionsWith(fn) {
  return function (obj) {
    return _filter(function (key) {
      return typeof obj[key] === 'function';
    }, fn(obj));
  };
}export default function _has(prop, obj) {
  return Object.prototype.hasOwnProperty.call(obj, prop);
}export default function _identity(x) {
  return x;
}import _indexOf from "./_indexOf.js";
export default function _includes(a, list) {
  return _indexOf(list, a, 0) >= 0;
}export default function _includesWith(pred, x, list) {
  var idx = 0;
  var len = list.length;

  while (idx < len) {
    if (pred(x, list[idx])) {
      return true;
    }

    idx += 1;
  }

  return false;
}import equals from "../equals.js";
export default function _indexOf(list, a, idx) {
  var inf, item; // Array.prototype.indexOf doesn't exist below IE9

  if (typeof list.indexOf === 'function') {
    switch (typeof a) {
      case 'number':
        if (a === 0) {
          // manually crawl the list to distinguish between +0 and -0
          inf = 1 / a;

          while (idx < list.length) {
            item = list[idx];

            if (item === 0 && 1 / item === inf) {
              return idx;
            }

            idx += 1;
          }

          return -1;
        } else if (a !== a) {
          // NaN
          while (idx < list.length) {
            item = list[idx];

            if (typeof item === 'number' && item !== item) {
              return idx;
            }

            idx += 1;
          }

          return -1;
        } // non-zero numbers can utilise Set


        return list.indexOf(a, idx);
      // all these types can utilise Set

      case 'string':
      case 'boolean':
      case 'function':
      case 'undefined':
        return list.indexOf(a, idx);

      case 'object':
        if (a === null) {
          // null can utilise Set
          return list.indexOf(a, idx);
        }

    }
  } // anything else not covered above, defer to R.equals


  while (idx < list.length) {
    if (equals(list[idx], a)) {
      return idx;
    }

    idx += 1;
  }

  return -1;
}import _has from "./_has.js";
var toString = Object.prototype.toString;

var _isArguments =
/*#__PURE__*/
function () {
  return toString.call(arguments) === '[object Arguments]' ? function _isArguments(x) {
    return toString.call(x) === '[object Arguments]';
  } : function _isArguments(x) {
    return _has('callee', x);
  };
}();

export default _isArguments;/**
 * Tests whether or not an object is an array.
 *
 * @private
 * @param {*} val The object to test.
 * @return {Boolean} `true` if `val` is an array, `false` otherwise.
 * @example
 *
 *      _isArray([]); //=> true
 *      _isArray(null); //=> false
 *      _isArray({}); //=> false
 */
export default Array.isArray || function _isArray(val) {
  return val != null && val.length >= 0 && Object.prototype.toString.call(val) === '[object Array]';
};import _curry1 from "./_curry1.js";
import _isArray from "./_isArray.js";
import _isString from "./_isString.js";
/**
 * Tests whether or not an object is similar to an array.
 *
 * @private
 * @category Type
 * @category List
 * @sig * -> Boolean
 * @param {*} x The object to test.
 * @return {Boolean} `true` if `x` has a numeric length property and extreme indices defined; `false` otherwise.
 * @example
 *
 *      _isArrayLike([]); //=> true
 *      _isArrayLike(true); //=> false
 *      _isArrayLike({}); //=> false
 *      _isArrayLike({length: 10}); //=> false
 *      _isArrayLike({0: 'zero', 9: 'nine', length: 10}); //=> true
 *      _isArrayLike({nodeType: 1, length: 1}) // => false
 */

var _isArrayLike =
/*#__PURE__*/
_curry1(function isArrayLike(x) {
  if (_isArray(x)) {
    return true;
  }

  if (!x) {
    return false;
  }

  if (typeof x !== 'object') {
    return false;
  }

  if (_isString(x)) {
    return false;
  }

  if (x.length === 0) {
    return true;
  }

  if (x.length > 0) {
    return x.hasOwnProperty(0) && x.hasOwnProperty(x.length - 1);
  }

  return false;
});

export default _isArrayLike;export default function _isFunction(x) {
  var type = Object.prototype.toString.call(x);
  return type === '[object Function]' || type === '[object AsyncFunction]' || type === '[object GeneratorFunction]' || type === '[object AsyncGeneratorFunction]';
}/**
 * Determine if the passed argument is an integer.
 *
 * @private
 * @param {*} n
 * @category Type
 * @return {Boolean}
 */
export default Number.isInteger || function _isInteger(n) {
  return n << 0 === n;
};export default function _isNumber(x) {
  return Object.prototype.toString.call(x) === '[object Number]';
}export default function _isObject(x) {
  return Object.prototype.toString.call(x) === '[object Object]';
}export default function _isPlaceholder(a) {
  return a != null && typeof a === 'object' && a['@@functional/placeholder'] === true;
}export default function _isRegExp(x) {
  return Object.prototype.toString.call(x) === '[object RegExp]';
}export default function _isString(x) {
  return Object.prototype.toString.call(x) === '[object String]';
}export default function _isTransformer(obj) {
  return obj != null && typeof obj['@@transducer/step'] === 'function';
}/**
 * Tests whether or not an object is a typed array.
 *
 * @private
 * @param {*} val The object to test.
 * @return {Boolean} `true` if `val` is a typed array, `false` otherwise.
 * @example
 *
 *      _isTypedArray(new Uint8Array([])); //=> true
 *      _isTypedArray(new Float32Array([])); //=> true
 *      _isTypedArray([]); //=> false
 *      _isTypedArray(null); //=> false
 *      _isTypedArray({}); //=> false
 */
export default function _isTypedArray(val) {
  var type = Object.prototype.toString.call(val);
  return type === '[object Uint8ClampedArray]' || type === '[object Int8Array]' || type === '[object Uint8Array]' || type === '[object Int16Array]' || type === '[object Uint16Array]' || type === '[object Int32Array]' || type === '[object Uint32Array]' || type === '[object Float32Array]' || type === '[object Float64Array]' || type === '[object BigInt64Array]' || type === '[object BigUint64Array]';
}import _isArrayLike from "./_isArrayLike.js";
/**
 * `_makeFlat` is a helper function that returns a one-level or fully recursive
 * function based on the flag passed in.
 *
 * @private
 */

export default function _makeFlat(recursive) {
  return function flatt(list) {
    var value, jlen, j;
    var result = [];
    var idx = 0;
    var ilen = list.length;

    while (idx < ilen) {
      if (_isArrayLike(list[idx])) {
        value = recursive ? flatt(list[idx]) : list[idx];
        j = 0;
        jlen = value.length;

        while (j < jlen) {
          result[result.length] = value[j];
          j += 1;
        }
      } else {
        result[result.length] = list[idx];
      }

      idx += 1;
    }

    return result;
  };
}export default function _map(fn, functor) {
  var idx = 0;
  var len = functor.length;
  var result = Array(len);

  while (idx < len) {
    result[idx] = fn(functor[idx]);
    idx += 1;
  }

  return result;
}import _isArray from "./_isArray.js";
import _isInteger from "./_isInteger.js";
/**
 * Makes a shallow clone of an object, applying the given fn to the specified
 * property with the given value. Note that this copies and flattens prototype
 * properties onto the new object as well. All non-primitive properties are
 * copied by reference.
 *
 * @private
 * @param {String|Number} prop The property name to set
 * @param {Function} fn The function to apply to the property
 * @param {Object|Array} obj The object to clone
 * @return {Object|Array} A new object equivalent to the original except for the changed property.
 */

export default function _modify(prop, fn, obj) {
  if (_isInteger(prop) && _isArray(obj)) {
    var arr = [].concat(obj);
    arr[prop] = fn(arr[prop]);
    return arr;
  }

  var result = {};

  for (var p in obj) {
    result[p] = obj[p];
  }

  result[prop] = fn(result[prop]);
  return result;
}import _has from "./_has.js"; // Based on https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

function _objectAssign(target) {
  if (target == null) {
    throw new TypeError('Cannot convert undefined or null to object');
  }

  var output = Object(target);
  var idx = 1;
  var length = arguments.length;

  while (idx < length) {
    var source = arguments[idx];

    if (source != null) {
      for (var nextKey in source) {
        if (_has(nextKey, source)) {
          output[nextKey] = source[nextKey];
        }
      }
    }

    idx += 1;
  }

  return output;
}

export default typeof Object.assign === 'function' ? Object.assign : _objectAssign;// Based on https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
function _objectIs(a, b) {
  // SameValue algorithm
  if (a === b) {
    // Steps 1-5, 7-10
    // Steps 6.b-6.e: +0 != -0
    return a !== 0 || 1 / a === 1 / b;
  } else {
    // Step 6.a: NaN == NaN
    return a !== a && b !== b;
  }
}

export default typeof Object.is === 'function' ? Object.is : _objectIs;export default function _of(x) {
  return [x];
}export default function _pipe(f, g) {
  return function () {
    return g.call(this, f.apply(this, arguments));
  };
}export default function _pipeP(f, g) {
  return function () {
    var ctx = this;
    return f.apply(ctx, arguments).then(function (x) {
      return g.call(ctx, x);
    });
  };
}export default function _promap(f, g, profunctor) {
  return function (x) {
    return g(profunctor(f(x)));
  };
}export default function _quote(s) {
  var escaped = s.replace(/\\/g, '\\\\').replace(/[\b]/g, '\\b') // \b matches word boundary; [\b] matches backspace
  .replace(/\f/g, '\\f').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\t/g, '\\t').replace(/\v/g, '\\v').replace(/\0/g, '\\0');
  return '"' + escaped.replace(/"/g, '\\"') + '"';
}import _isArrayLike from "./_isArrayLike.js";
import _xwrap from "./_xwrap.js";
import bind from "../bind.js";

function _arrayReduce(xf, acc, list) {
  var idx = 0;
  var len = list.length;

  while (idx < len) {
    acc = xf['@@transducer/step'](acc, list[idx]);

    if (acc && acc['@@transducer/reduced']) {
      acc = acc['@@transducer/value'];
      break;
    }

    idx += 1;
  }

  return xf['@@transducer/result'](acc);
}

function _iterableReduce(xf, acc, iter) {
  var step = iter.next();

  while (!step.done) {
    acc = xf['@@transducer/step'](acc, step.value);

    if (acc && acc['@@transducer/reduced']) {
      acc = acc['@@transducer/value'];
      break;
    }

    step = iter.next();
  }

  return xf['@@transducer/result'](acc);
}

function _methodReduce(xf, acc, obj, methodName) {
  return xf['@@transducer/result'](obj[methodName](bind(xf['@@transducer/step'], xf), acc));
}

var symIterator = typeof Symbol !== 'undefined' ? Symbol.iterator : '@@iterator';
export default function _reduce(fn, acc, list) {
  if (typeof fn === 'function') {
    fn = _xwrap(fn);
  }

  if (_isArrayLike(list)) {
    return _arrayReduce(fn, acc, list);
  }

  if (typeof list['fantasy-land/reduce'] === 'function') {
    return _methodReduce(fn, acc, list, 'fantasy-land/reduce');
  }

  if (list[symIterator] != null) {
    return _iterableReduce(fn, acc, list[symIterator]());
  }

  if (typeof list.next === 'function') {
    return _iterableReduce(fn, acc, list);
  }

  if (typeof list.reduce === 'function') {
    return _methodReduce(fn, acc, list, 'reduce');
  }

  throw new TypeError('reduce: list must be array or iterable');
}export default function _reduced(x) {
  return x && x['@@transducer/reduced'] ? x : {
    '@@transducer/value': x,
    '@@transducer/reduced': true
  };
}import _objectAssign from "./_objectAssign.js";
import _identity from "./_identity.js";
import _isArrayLike from "./_isArrayLike.js";
import _isTransformer from "./_isTransformer.js";
import objOf from "../objOf.js";
var _stepCatArray = {
  '@@transducer/init': Array,
  '@@transducer/step': function (xs, x) {
    xs.push(x);
    return xs;
  },
  '@@transducer/result': _identity
};
var _stepCatString = {
  '@@transducer/init': String,
  '@@transducer/step': function (a, b) {
    return a + b;
  },
  '@@transducer/result': _identity
};
var _stepCatObject = {
  '@@transducer/init': Object,
  '@@transducer/step': function (result, input) {
    return _objectAssign(result, _isArrayLike(input) ? objOf(input[0], input[1]) : input);
  },
  '@@transducer/result': _identity
};
export default function _stepCat(obj) {
  if (_isTransformer(obj)) {
    return obj;
  }

  if (_isArrayLike(obj)) {
    return _stepCatArray;
  }

  if (typeof obj === 'string') {
    return _stepCatString;
  }

  if (typeof obj === 'object') {
    return _stepCatObject;
  }

  throw new Error('Cannot create transformer for ' + obj);
}/**
 * Polyfill from <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString>.
 */
var pad = function pad(n) {
  return (n < 10 ? '0' : '') + n;
};

var _toISOString = typeof Date.prototype.toISOString === 'function' ? function _toISOString(d) {
  return d.toISOString();
} : function _toISOString(d) {
  return d.getUTCFullYear() + '-' + pad(d.getUTCMonth() + 1) + '-' + pad(d.getUTCDate()) + 'T' + pad(d.getUTCHours()) + ':' + pad(d.getUTCMinutes()) + ':' + pad(d.getUTCSeconds()) + '.' + (d.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) + 'Z';
};

export default _toISOString;import _includes from "./_includes.js";
import _map from "./_map.js";
import _quote from "./_quote.js";
import _toISOString from "./_toISOString.js";
import keys from "../keys.js";
import reject from "../reject.js";
export default function _toString(x, seen) {
  var recur = function recur(y) {
    var xs = seen.concat([x]);
    return _includes(y, xs) ? '<Circular>' : _toString(y, xs);
  }; //  mapPairs :: (Object, [String]) -> [String]


  var mapPairs = function (obj, keys) {
    return _map(function (k) {
      return _quote(k) + ': ' + recur(obj[k]);
    }, keys.slice().sort());
  };

  switch (Object.prototype.toString.call(x)) {
    case '[object Arguments]':
      return '(function() { return arguments; }(' + _map(recur, x).join(', ') + '))';

    case '[object Array]':
      return '[' + _map(recur, x).concat(mapPairs(x, reject(function (k) {
        return /^\d+$/.test(k);
      }, keys(x)))).join(', ') + ']';

    case '[object Boolean]':
      return typeof x === 'object' ? 'new Boolean(' + recur(x.valueOf()) + ')' : x.toString();

    case '[object Date]':
      return 'new Date(' + (isNaN(x.valueOf()) ? recur(NaN) : _quote(_toISOString(x))) + ')';

    case '[object Null]':
      return 'null';

    case '[object Number]':
      return typeof x === 'object' ? 'new Number(' + recur(x.valueOf()) + ')' : 1 / x === -Infinity ? '-0' : x.toString(10);

    case '[object String]':
      return typeof x === 'object' ? 'new String(' + recur(x.valueOf()) + ')' : _quote(x);

    case '[object Undefined]':
      return 'undefined';

    default:
      if (typeof x.toString === 'function') {
        var repr = x.toString();

        if (repr !== '[object Object]') {
          return repr;
        }
      }

      return '{' + mapPairs(x, keys(x)).join(', ') + '}';
  }
}import _curry2 from "./_curry2.js";
import _reduced from "./_reduced.js";
import _xfBase from "./_xfBase.js";

var XAll =
/*#__PURE__*/
function () {
  function XAll(f, xf) {
    this.xf = xf;
    this.f = f;
    this.all = true;
  }

  XAll.prototype['@@transducer/init'] = _xfBase.init;

  XAll.prototype['@@transducer/result'] = function (result) {
    if (this.all) {
      result = this.xf['@@transducer/step'](result, true);
    }

    return this.xf['@@transducer/result'](result);
  };

  XAll.prototype['@@transducer/step'] = function (result, input) {
    if (!this.f(input)) {
      this.all = false;
      result = _reduced(this.xf['@@transducer/step'](result, false));
    }

    return result;
  };

  return XAll;
}();

var _xall =
/*#__PURE__*/
_curry2(function _xall(f, xf) {
  return new XAll(f, xf);
});

export default _xall;import _curry2 from "./_curry2.js";
import _reduced from "./_reduced.js";
import _xfBase from "./_xfBase.js";

var XAny =
/*#__PURE__*/
function () {
  function XAny(f, xf) {
    this.xf = xf;
    this.f = f;
    this.any = false;
  }

  XAny.prototype['@@transducer/init'] = _xfBase.init;

  XAny.prototype['@@transducer/result'] = function (result) {
    if (!this.any) {
      result = this.xf['@@transducer/step'](result, false);
    }

    return this.xf['@@transducer/result'](result);
  };

  XAny.prototype['@@transducer/step'] = function (result, input) {
    if (this.f(input)) {
      this.any = true;
      result = _reduced(this.xf['@@transducer/step'](result, true));
    }

    return result;
  };

  return XAny;
}();

var _xany =
/*#__PURE__*/
_curry2(function _xany(f, xf) {
  return new XAny(f, xf);
});

export default _xany;import _concat from "./_concat.js";
import _curry2 from "./_curry2.js";
import _xfBase from "./_xfBase.js";

var XAperture =
/*#__PURE__*/
function () {
  function XAperture(n, xf) {
    this.xf = xf;
    this.pos = 0;
    this.full = false;
    this.acc = new Array(n);
  }

  XAperture.prototype['@@transducer/init'] = _xfBase.init;

  XAperture.prototype['@@transducer/result'] = function (result) {
    this.acc = null;
    return this.xf['@@transducer/result'](result);
  };

  XAperture.prototype['@@transducer/step'] = function (result, input) {
    this.store(input);
    return this.full ? this.xf['@@transducer/step'](result, this.getCopy()) : result;
  };

  XAperture.prototype.store = function (input) {
    this.acc[this.pos] = input;
    this.pos += 1;

    if (this.pos === this.acc.length) {
      this.pos = 0;
      this.full = true;
    }
  };

  XAperture.prototype.getCopy = function () {
    return _concat(Array.prototype.slice.call(this.acc, this.pos), Array.prototype.slice.call(this.acc, 0, this.pos));
  };

  return XAperture;
}();

var _xaperture =
/*#__PURE__*/
_curry2(function _xaperture(n, xf) {
  return new XAperture(n, xf);
});

export default _xaperture;import _curry2 from "./_curry2.js";
import _flatCat from "./_flatCat.js";
import map from "../map.js";

var _xchain =
/*#__PURE__*/
_curry2(function _xchain(f, xf) {
  return map(f, _flatCat(xf));
});

export default _xchain;import _curry2 from "./_curry2.js";
import _xfBase from "./_xfBase.js";

var XDrop =
/*#__PURE__*/
function () {
  function XDrop(n, xf) {
    this.xf = xf;
    this.n = n;
  }

  XDrop.prototype['@@transducer/init'] = _xfBase.init;
  XDrop.prototype['@@transducer/result'] = _xfBase.result;

  XDrop.prototype['@@transducer/step'] = function (result, input) {
    if (this.n > 0) {
      this.n -= 1;
      return result;
    }

    return this.xf['@@transducer/step'](result, input);
  };

  return XDrop;
}();

var _xdrop =
/*#__PURE__*/
_curry2(function _xdrop(n, xf) {
  return new XDrop(n, xf);
});

export default _xdrop;import _curry2 from "./_curry2.js";
import _xfBase from "./_xfBase.js";

var XDropLast =
/*#__PURE__*/
function () {
  function XDropLast(n, xf) {
    this.xf = xf;
    this.pos = 0;
    this.full = false;
    this.acc = new Array(n);
  }

  XDropLast.prototype['@@transducer/init'] = _xfBase.init;

  XDropLast.prototype['@@transducer/result'] = function (result) {
    this.acc = null;
    return this.xf['@@transducer/result'](result);
  };

  XDropLast.prototype['@@transducer/step'] = function (result, input) {
    if (this.full) {
      result = this.xf['@@transducer/step'](result, this.acc[this.pos]);
    }

    this.store(input);
    return result;
  };

  XDropLast.prototype.store = function (input) {
    this.acc[this.pos] = input;
    this.pos += 1;

    if (this.pos === this.acc.length) {
      this.pos = 0;
      this.full = true;
    }
  };

  return XDropLast;
}();

var _xdropLast =
/*#__PURE__*/
_curry2(function _xdropLast(n, xf) {
  return new XDropLast(n, xf);
});

export default _xdropLast;import _curry2 from "./_curry2.js";
import _reduce from "./_reduce.js";
import _xfBase from "./_xfBase.js";

var XDropLastWhile =
/*#__PURE__*/
function () {
  function XDropLastWhile(fn, xf) {
    this.f = fn;
    this.retained = [];
    this.xf = xf;
  }

  XDropLastWhile.prototype['@@transducer/init'] = _xfBase.init;

  XDropLastWhile.prototype['@@transducer/result'] = function (result) {
    this.retained = null;
    return this.xf['@@transducer/result'](result);
  };

  XDropLastWhile.prototype['@@transducer/step'] = function (result, input) {
    return this.f(input) ? this.retain(result, input) : this.flush(result, input);
  };

  XDropLastWhile.prototype.flush = function (result, input) {
    result = _reduce(this.xf['@@transducer/step'], result, this.retained);
    this.retained = [];
    return this.xf['@@transducer/step'](result, input);
  };

  XDropLastWhile.prototype.retain = function (result, input) {
    this.retained.push(input);
    return result;
  };

  return XDropLastWhile;
}();

var _xdropLastWhile =
/*#__PURE__*/
_curry2(function _xdropLastWhile(fn, xf) {
  return new XDropLastWhile(fn, xf);
});

export default _xdropLastWhile;import _curry2 from "./_curry2.js";
import _xfBase from "./_xfBase.js";

var XDropRepeatsWith =
/*#__PURE__*/
function () {
  function XDropRepeatsWith(pred, xf) {
    this.xf = xf;
    this.pred = pred;
    this.lastValue = undefined;
    this.seenFirstValue = false;
  }

  XDropRepeatsWith.prototype['@@transducer/init'] = _xfBase.init;
  XDropRepeatsWith.prototype['@@transducer/result'] = _xfBase.result;

  XDropRepeatsWith.prototype['@@transducer/step'] = function (result, input) {
    var sameAsLast = false;

    if (!this.seenFirstValue) {
      this.seenFirstValue = true;
    } else if (this.pred(this.lastValue, input)) {
      sameAsLast = true;
    }

    this.lastValue = input;
    return sameAsLast ? result : this.xf['@@transducer/step'](result, input);
  };

  return XDropRepeatsWith;
}();

var _xdropRepeatsWith =
/*#__PURE__*/
_curry2(function _xdropRepeatsWith(pred, xf) {
  return new XDropRepeatsWith(pred, xf);
});

export default _xdropRepeatsWith;import _curry2 from "./_curry2.js";
import _xfBase from "./_xfBase.js";

var XDropWhile =
/*#__PURE__*/
function () {
  function XDropWhile(f, xf) {
    this.xf = xf;
    this.f = f;
  }

  XDropWhile.prototype['@@transducer/init'] = _xfBase.init;
  XDropWhile.prototype['@@transducer/result'] = _xfBase.result;

  XDropWhile.prototype['@@transducer/step'] = function (result, input) {
    if (this.f) {
      if (this.f(input)) {
        return result;
      }

      this.f = null;
    }

    return this.xf['@@transducer/step'](result, input);
  };

  return XDropWhile;
}();

var _xdropWhile =
/*#__PURE__*/
_curry2(function _xdropWhile(f, xf) {
  return new XDropWhile(f, xf);
});

export default _xdropWhile;export default {
  init: function () {
    return this.xf['@@transducer/init']();
  },
  result: function (result) {
    return this.xf['@@transducer/result'](result);
  }
};import _curry2 from "./_curry2.js";
import _xfBase from "./_xfBase.js";

var XFilter =
/*#__PURE__*/
function () {
  function XFilter(f, xf) {
    this.xf = xf;
    this.f = f;
  }

  XFilter.prototype['@@transducer/init'] = _xfBase.init;
  XFilter.prototype['@@transducer/result'] = _xfBase.result;

  XFilter.prototype['@@transducer/step'] = function (result, input) {
    return this.f(input) ? this.xf['@@transducer/step'](result, input) : result;
  };

  return XFilter;
}();

var _xfilter =
/*#__PURE__*/
_curry2(function _xfilter(f, xf) {
  return new XFilter(f, xf);
});

export default _xfilter;import _curry2 from "./_curry2.js";
import _reduced from "./_reduced.js";
import _xfBase from "./_xfBase.js";

var XFind =
/*#__PURE__*/
function () {
  function XFind(f, xf) {
    this.xf = xf;
    this.f = f;
    this.found = false;
  }

  XFind.prototype['@@transducer/init'] = _xfBase.init;

  XFind.prototype['@@transducer/result'] = function (result) {
    if (!this.found) {
      result = this.xf['@@transducer/step'](result, void 0);
    }

    return this.xf['@@transducer/result'](result);
  };

  XFind.prototype['@@transducer/step'] = function (result, input) {
    if (this.f(input)) {
      this.found = true;
      result = _reduced(this.xf['@@transducer/step'](result, input));
    }

    return result;
  };

  return XFind;
}();

var _xfind =
/*#__PURE__*/
_curry2(function _xfind(f, xf) {
  return new XFind(f, xf);
});

export default _xfind;import _curry2 from "./_curry2.js";
import _reduced from "./_reduced.js";
import _xfBase from "./_xfBase.js";

var XFindIndex =
/*#__PURE__*/
function () {
  function XFindIndex(f, xf) {
    this.xf = xf;
    this.f = f;
    this.idx = -1;
    this.found = false;
  }

  XFindIndex.prototype['@@transducer/init'] = _xfBase.init;

  XFindIndex.prototype['@@transducer/result'] = function (result) {
    if (!this.found) {
      result = this.xf['@@transducer/step'](result, -1);
    }

    return this.xf['@@transducer/result'](result);
  };

  XFindIndex.prototype['@@transducer/step'] = function (result, input) {
    this.idx += 1;

    if (this.f(input)) {
      this.found = true;
      result = _reduced(this.xf['@@transducer/step'](result, this.idx));
    }

    return result;
  };

  return XFindIndex;
}();

var _xfindIndex =
/*#__PURE__*/
_curry2(function _xfindIndex(f, xf) {
  return new XFindIndex(f, xf);
});

export default _xfindIndex;import _curry2 from "./_curry2.js";
import _xfBase from "./_xfBase.js";

var XFindLast =
/*#__PURE__*/
function () {
  function XFindLast(f, xf) {
    this.xf = xf;
    this.f = f;
  }

  XFindLast.prototype['@@transducer/init'] = _xfBase.init;

  XFindLast.prototype['@@transducer/result'] = function (result) {
    return this.xf['@@transducer/result'](this.xf['@@transducer/step'](result, this.last));
  };

  XFindLast.prototype['@@transducer/step'] = function (result, input) {
    if (this.f(input)) {
      this.last = input;
    }

    return result;
  };

  return XFindLast;
}();

var _xfindLast =
/*#__PURE__*/
_curry2(function _xfindLast(f, xf) {
  return new XFindLast(f, xf);
});

export default _xfindLast;import _curry2 from "./_curry2.js";
import _xfBase from "./_xfBase.js";

var XFindLastIndex =
/*#__PURE__*/
function () {
  function XFindLastIndex(f, xf) {
    this.xf = xf;
    this.f = f;
    this.idx = -1;
    this.lastIdx = -1;
  }

  XFindLastIndex.prototype['@@transducer/init'] = _xfBase.init;

  XFindLastIndex.prototype['@@transducer/result'] = function (result) {
    return this.xf['@@transducer/result'](this.xf['@@transducer/step'](result, this.lastIdx));
  };

  XFindLastIndex.prototype['@@transducer/step'] = function (result, input) {
    this.idx += 1;

    if (this.f(input)) {
      this.lastIdx = this.idx;
    }

    return result;
  };

  return XFindLastIndex;
}();

var _xfindLastIndex =
/*#__PURE__*/
_curry2(function _xfindLastIndex(f, xf) {
  return new XFindLastIndex(f, xf);
});

export default _xfindLastIndex;import _curry2 from "./_curry2.js";
import _xfBase from "./_xfBase.js";

var XMap =
/*#__PURE__*/
function () {
  function XMap(f, xf) {
    this.xf = xf;
    this.f = f;
  }

  XMap.prototype['@@transducer/init'] = _xfBase.init;
  XMap.prototype['@@transducer/result'] = _xfBase.result;

  XMap.prototype['@@transducer/step'] = function (result, input) {
    return this.xf['@@transducer/step'](result, this.f(input));
  };

  return XMap;
}();

var _xmap =
/*#__PURE__*/
_curry2(function _xmap(f, xf) {
  return new XMap(f, xf);
});

export default _xmap;import _curry3 from "./_curry3.js";
import _xfBase from "./_xfBase.js";
import _promap from "./_promap.js";

var XPromap =
/*#__PURE__*/
function () {
  function XPromap(f, g, xf) {
    this.xf = xf;
    this.f = f;
    this.g = g;
  }

  XPromap.prototype['@@transducer/init'] = _xfBase.init;
  XPromap.prototype['@@transducer/result'] = _xfBase.result;

  XPromap.prototype['@@transducer/step'] = function (result, input) {
    return this.xf['@@transducer/step'](result, _promap(this.f, this.g, input));
  };

  return XPromap;
}();

var _xpromap =
/*#__PURE__*/
_curry3(function _xpromap(f, g, xf) {
  return new XPromap(f, g, xf);
});

export default _xpromap;import _curryN from "./_curryN.js";
import _has from "./_has.js";
import _xfBase from "./_xfBase.js";

var XReduceBy =
/*#__PURE__*/
function () {
  function XReduceBy(valueFn, valueAcc, keyFn, xf) {
    this.valueFn = valueFn;
    this.valueAcc = valueAcc;
    this.keyFn = keyFn;
    this.xf = xf;
    this.inputs = {};
  }

  XReduceBy.prototype['@@transducer/init'] = _xfBase.init;

  XReduceBy.prototype['@@transducer/result'] = function (result) {
    var key;

    for (key in this.inputs) {
      if (_has(key, this.inputs)) {
        result = this.xf['@@transducer/step'](result, this.inputs[key]);

        if (result['@@transducer/reduced']) {
          result = result['@@transducer/value'];
          break;
        }
      }
    }

    this.inputs = null;
    return this.xf['@@transducer/result'](result);
  };

  XReduceBy.prototype['@@transducer/step'] = function (result, input) {
    var key = this.keyFn(input);
    this.inputs[key] = this.inputs[key] || [key, this.valueAcc];
    this.inputs[key][1] = this.valueFn(this.inputs[key][1], input);
    return result;
  };

  return XReduceBy;
}();

var _xreduceBy =
/*#__PURE__*/
_curryN(4, [], function _xreduceBy(valueFn, valueAcc, keyFn, xf) {
  return new XReduceBy(valueFn, valueAcc, keyFn, xf);
});

export default _xreduceBy;import _curry2 from "./_curry2.js";
import _reduced from "./_reduced.js";
import _xfBase from "./_xfBase.js";

var XTake =
/*#__PURE__*/
function () {
  function XTake(n, xf) {
    this.xf = xf;
    this.n = n;
    this.i = 0;
  }

  XTake.prototype['@@transducer/init'] = _xfBase.init;
  XTake.prototype['@@transducer/result'] = _xfBase.result;

  XTake.prototype['@@transducer/step'] = function (result, input) {
    this.i += 1;
    var ret = this.n === 0 ? result : this.xf['@@transducer/step'](result, input);
    return this.n >= 0 && this.i >= this.n ? _reduced(ret) : ret;
  };

  return XTake;
}();

var _xtake =
/*#__PURE__*/
_curry2(function _xtake(n, xf) {
  return new XTake(n, xf);
});

export default _xtake;import _curry2 from "./_curry2.js";
import _reduced from "./_reduced.js";
import _xfBase from "./_xfBase.js";

var XTakeWhile =
/*#__PURE__*/
function () {
  function XTakeWhile(f, xf) {
    this.xf = xf;
    this.f = f;
  }

  XTakeWhile.prototype['@@transducer/init'] = _xfBase.init;
  XTakeWhile.prototype['@@transducer/result'] = _xfBase.result;

  XTakeWhile.prototype['@@transducer/step'] = function (result, input) {
    return this.f(input) ? this.xf['@@transducer/step'](result, input) : _reduced(result);
  };

  return XTakeWhile;
}();

var _xtakeWhile =
/*#__PURE__*/
_curry2(function _xtakeWhile(f, xf) {
  return new XTakeWhile(f, xf);
});

export default _xtakeWhile;import _curry2 from "./_curry2.js";
import _xfBase from "./_xfBase.js";

var XTap =
/*#__PURE__*/
function () {
  function XTap(f, xf) {
    this.xf = xf;
    this.f = f;
  }

  XTap.prototype['@@transducer/init'] = _xfBase.init;
  XTap.prototype['@@transducer/result'] = _xfBase.result;

  XTap.prototype['@@transducer/step'] = function (result, input) {
    this.f(input);
    return this.xf['@@transducer/step'](result, input);
  };

  return XTap;
}();

var _xtap =
/*#__PURE__*/
_curry2(function _xtap(f, xf) {
  return new XTap(f, xf);
});

export default _xtap;import _curry2 from "./_curry2.js";
import _Set from "./_Set.js";
import _xfBase from "./_xfBase.js";

var XUniqBy =
/*#__PURE__*/
function () {
  function XUniqBy(f, xf) {
    this.xf = xf;
    this.f = f;
    this.set = new _Set();
  }

  XUniqBy.prototype['@@transducer/init'] = _xfBase.init;
  XUniqBy.prototype['@@transducer/result'] = _xfBase.result;

  XUniqBy.prototype['@@transducer/step'] = function (result, input) {
    return this.set.add(this.f(input)) ? this.xf['@@transducer/step'](result, input) : result;
  };

  return XUniqBy;
}();

var _xuniqBy =
/*#__PURE__*/
_curry2(function _xuniqBy(f, xf) {
  return new XUniqBy(f, xf);
});

export default _xuniqBy;import _curry2 from "./_curry2.js";
import _includesWith from "./_includesWith.js";
import _xfBase from "./_xfBase.js";

var XUniqWith =
/*#__PURE__*/
function () {
  function XUniqWith(pred, xf) {
    this.xf = xf;
    this.pred = pred;
    this.items = [];
  }

  XUniqWith.prototype['@@transducer/init'] = _xfBase.init;
  XUniqWith.prototype['@@transducer/result'] = _xfBase.result;

  XUniqWith.prototype['@@transducer/step'] = function (result, input) {
    if (_includesWith(this.pred, input, this.items)) {
      return result;
    } else {
      this.items.push(input);
      return this.xf['@@transducer/step'](result, input);
    }
  };

  return XUniqWith;
}();

var _xuniqWith =
/*#__PURE__*/
_curry2(function _xuniqWith(pred, xf) {
  return new XUniqWith(pred, xf);
});

export default _xuniqWith;var XWrap =
/*#__PURE__*/
function () {
  function XWrap(fn) {
    this.f = fn;
  }

  XWrap.prototype['@@transducer/init'] = function () {
    throw new Error('init not implemented on XWrap');
  };

  XWrap.prototype['@@transducer/result'] = function (acc) {
    return acc;
  };

  XWrap.prototype['@@transducer/step'] = function (acc, x) {
    return this.f(acc, x);
  };

  return XWrap;
}();

export default function _xwrap(fn) {
  return new XWrap(fn);
}//  Ramda v0.28.0
//  https://github.com/ramda/ramda
//  (c) 2013-2022 Scott Sauyet, Michael Hurley, and David Chambers
//  Ramda may be freely distributed under the MIT license.

(function (global, factory) {
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
  typeof define === 'function' && define.amd ? define(['exports'], factory) :
  (global = global || self, factory(global.R = {}));
}(this, (function (exports) { 'use strict';

  /**
   * A function that always returns `false`. Any passed in parameters are ignored.
   *
   * @func
   * @memberOf R
   * @since v0.9.0
   * @category Function
   * @sig * -> Boolean
   * @param {*}
   * @return {Boolean}
   * @see R.T
   * @example
   *
   *      R.F(); //=> false
   */
  var F = function F() {
    return false;
  };

  /**
   * A function that always returns `true`. Any passed in parameters are ignored.
   *
   * @func
   * @memberOf R
   * @since v0.9.0
   * @category Function
   * @sig * -> Boolean
   * @param {*}
   * @return {Boolean}
   * @see R.F
   * @example
   *
   *      R.T(); //=> true
   */
  var T = function T() {
    return true;
  };

  /**
   * A special placeholder value used to specify "gaps" within curried functions,
   * allowing partial application of any combination of arguments, regardless of
   * their positions.
   *
   * If `g` is a curried ternary function and `_` is `R.__`, the following are
   * equivalent:
   *
   *   - `g(1, 2, 3)`
   *   - `g(_, 2, 3)(1)`
   *   - `g(_, _, 3)(1)(2)`
   *   - `g(_, _, 3)(1, 2)`
   *   - `g(_, 2, _)(1, 3)`
   *   - `g(_, 2)(1)(3)`
   *   - `g(_, 2)(1, 3)`
   *   - `g(_, 2)(_, 3)(1)`
   *
   * @name __
   * @constant
   * @memberOf R
   * @since v0.6.0
   * @category Function
   * @example
   *
   *      const greet = R.replace('{name}', R.__, 'Hello, {name}!');
   *      greet('Alice'); //=> 'Hello, Alice!'
   */
  var __ = {
    '@@functional/placeholder': true
  };

  function _typeof(obj) {
    if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
      _typeof = function (obj) {
        return typeof obj;
      };
    } else {
      _typeof = function (obj) {
        return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
      };
    }

    return _typeof(obj);
  }

  function _isPlaceholder(a) {
    return a != null && _typeof(a) === 'object' && a['@@functional/placeholder'] === true;
  }

  /**
   * Optimized internal one-arity curry function.
   *
   * @private
   * @category Function
   * @param {Function} fn The function to curry.
   * @return {Function} The curried function.
   */

  function _curry1(fn) {
    return function f1(a) {
      if (arguments.length === 0 || _isPlaceholder(a)) {
        return f1;
      } else {
        return fn.apply(this, arguments);
      }
    };
  }

  /**
   * Optimized internal two-arity curry function.
   *
   * @private
   * @category Function
   * @param {Function} fn The function to curry.
   * @return {Function} The curried function.
   */

  function _curry2(fn) {
    return function f2(a, b) {
      switch (arguments.length) {
        case 0:
          return f2;

        case 1:
          return _isPlaceholder(a) ? f2 : _curry1(function (_b) {
            return fn(a, _b);
          });

        default:
          return _isPlaceholder(a) && _isPlaceholder(b) ? f2 : _isPlaceholder(a) ? _curry1(function (_a) {
            return fn(_a, b);
          }) : _isPlaceholder(b) ? _curry1(function (_b) {
            return fn(a, _b);
          }) : fn(a, b);
      }
    };
  }

  /**
   * Adds two values.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Math
   * @sig Number -> Number -> Number
   * @param {Number} a
   * @param {Number} b
   * @return {Number}
   * @see R.subtract
   * @example
   *
   *      R.add(2, 3);       //=>  5
   *      R.add(7)(10);      //=> 17
   */

  var add = _curry2(function add(a, b) {
    return Number(a) + Number(b);
  });

  /**
   * Private `concat` function to merge two array-like objects.
   *
   * @private
   * @param {Array|Arguments} [set1=[]] An array-like object.
   * @param {Array|Arguments} [set2=[]] An array-like object.
   * @return {Array} A new, merged array.
   * @example
   *
   *      _concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3]
   */
  function _concat(set1, set2) {
    set1 = set1 || [];
    set2 = set2 || [];
    var idx;
    var len1 = set1.length;
    var len2 = set2.length;
    var result = [];
    idx = 0;

    while (idx < len1) {
      result[result.length] = set1[idx];
      idx += 1;
    }

    idx = 0;

    while (idx < len2) {
      result[result.length] = set2[idx];
      idx += 1;
    }

    return result;
  }

  function _arity(n, fn) {
    /* eslint-disable no-unused-vars */
    switch (n) {
      case 0:
        return function () {
          return fn.apply(this, arguments);
        };

      case 1:
        return function (a0) {
          return fn.apply(this, arguments);
        };

      case 2:
        return function (a0, a1) {
          return fn.apply(this, arguments);
        };

      case 3:
        return function (a0, a1, a2) {
          return fn.apply(this, arguments);
        };

      case 4:
        return function (a0, a1, a2, a3) {
          return fn.apply(this, arguments);
        };

      case 5:
        return function (a0, a1, a2, a3, a4) {
          return fn.apply(this, arguments);
        };

      case 6:
        return function (a0, a1, a2, a3, a4, a5) {
          return fn.apply(this, arguments);
        };

      case 7:
        return function (a0, a1, a2, a3, a4, a5, a6) {
          return fn.apply(this, arguments);
        };

      case 8:
        return function (a0, a1, a2, a3, a4, a5, a6, a7) {
          return fn.apply(this, arguments);
        };

      case 9:
        return function (a0, a1, a2, a3, a4, a5, a6, a7, a8) {
          return fn.apply(this, arguments);
        };

      case 10:
        return function (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) {
          return fn.apply(this, arguments);
        };

      default:
        throw new Error('First argument to _arity must be a non-negative integer no greater than ten');
    }
  }

  /**
   * Internal curryN function.
   *
   * @private
   * @category Function
   * @param {Number} length The arity of the curried function.
   * @param {Array} received An array of arguments received thus far.
   * @param {Function} fn The function to curry.
   * @return {Function} The curried function.
   */

  function _curryN(length, received, fn) {
    return function () {
      var combined = [];
      var argsIdx = 0;
      var left = length;
      var combinedIdx = 0;

      while (combinedIdx < received.length || argsIdx < arguments.length) {
        var result;

        if (combinedIdx < received.length && (!_isPlaceholder(received[combinedIdx]) || argsIdx >= arguments.length)) {
          result = received[combinedIdx];
        } else {
          result = arguments[argsIdx];
          argsIdx += 1;
        }

        combined[combinedIdx] = result;

        if (!_isPlaceholder(result)) {
          left -= 1;
        }

        combinedIdx += 1;
      }

      return left <= 0 ? fn.apply(this, combined) : _arity(left, _curryN(length, combined, fn));
    };
  }

  /**
   * Returns a curried equivalent of the provided function, with the specified
   * arity. The curried function has two unusual capabilities. First, its
   * arguments needn't be provided one at a time. If `g` is `R.curryN(3, f)`, the
   * following are equivalent:
   *
   *   - `g(1)(2)(3)`
   *   - `g(1)(2, 3)`
   *   - `g(1, 2)(3)`
   *   - `g(1, 2, 3)`
   *
   * Secondly, the special placeholder value [`R.__`](#__) may be used to specify
   * "gaps", allowing partial application of any combination of arguments,
   * regardless of their positions. If `g` is as above and `_` is [`R.__`](#__),
   * the following are equivalent:
   *
   *   - `g(1, 2, 3)`
   *   - `g(_, 2, 3)(1)`
   *   - `g(_, _, 3)(1)(2)`
   *   - `g(_, _, 3)(1, 2)`
   *   - `g(_, 2)(1)(3)`
   *   - `g(_, 2)(1, 3)`
   *   - `g(_, 2)(_, 3)(1)`
   *
   * @func
   * @memberOf R
   * @since v0.5.0
   * @category Function
   * @sig Number -> (* -> a) -> (* -> a)
   * @param {Number} length The arity for the returned function.
   * @param {Function} fn The function to curry.
   * @return {Function} A new, curried function.
   * @see R.curry
   * @example
   *
   *      const sumArgs = (...args) => R.sum(args);
   *
   *      const curriedAddFourNumbers = R.curryN(4, sumArgs);
   *      const f = curriedAddFourNumbers(1, 2);
   *      const g = f(3);
   *      g(4); //=> 10
   */

  var curryN = _curry2(function curryN(length, fn) {
    if (length === 1) {
      return _curry1(fn);
    }

    return _arity(length, _curryN(length, [], fn));
  });

  /**
   * Creates a new list iteration function from an existing one by adding two new
   * parameters to its callback function: the current index, and the entire list.
   *
   * This would turn, for instance, [`R.map`](#map) function into one that
   * more closely resembles `Array.prototype.map`. Note that this will only work
   * for functions in which the iteration callback function is the first
   * parameter, and where the list is the last parameter. (This latter might be
   * unimportant if the list parameter is not used.)
   *
   * @func
   * @memberOf R
   * @since v0.15.0
   * @category Function
   * @category List
   * @sig (((a ...) -> b) ... -> [a] -> *) -> (((a ..., Int, [a]) -> b) ... -> [a] -> *)
   * @param {Function} fn A list iteration function that does not pass index or list to its callback
   * @return {Function} An altered list iteration function that passes (item, index, list) to its callback
   * @example
   *
   *      const mapIndexed = R.addIndex(R.map);
   *      mapIndexed((val, idx) => idx + '-' + val, ['f', 'o', 'o', 'b', 'a', 'r']);
   *      //=> ['0-f', '1-o', '2-o', '3-b', '4-a', '5-r']
   */

  var addIndex = _curry1(function addIndex(fn) {
    return curryN(fn.length, function () {
      var idx = 0;
      var origFn = arguments[0];
      var list = arguments[arguments.length - 1];
      var args = Array.prototype.slice.call(arguments, 0);

      args[0] = function () {
        var result = origFn.apply(this, _concat(arguments, [idx, list]));
        idx += 1;
        return result;
      };

      return fn.apply(this, args);
    });
  });

  /**
   * Optimized internal three-arity curry function.
   *
   * @private
   * @category Function
   * @param {Function} fn The function to curry.
   * @return {Function} The curried function.
   */

  function _curry3(fn) {
    return function f3(a, b, c) {
      switch (arguments.length) {
        case 0:
          return f3;

        case 1:
          return _isPlaceholder(a) ? f3 : _curry2(function (_b, _c) {
            return fn(a, _b, _c);
          });

        case 2:
          return _isPlaceholder(a) && _isPlaceholder(b) ? f3 : _isPlaceholder(a) ? _curry2(function (_a, _c) {
            return fn(_a, b, _c);
          }) : _isPlaceholder(b) ? _curry2(function (_b, _c) {
            return fn(a, _b, _c);
          }) : _curry1(function (_c) {
            return fn(a, b, _c);
          });

        default:
          return _isPlaceholder(a) && _isPlaceholder(b) && _isPlaceholder(c) ? f3 : _isPlaceholder(a) && _isPlaceholder(b) ? _curry2(function (_a, _b) {
            return fn(_a, _b, c);
          }) : _isPlaceholder(a) && _isPlaceholder(c) ? _curry2(function (_a, _c) {
            return fn(_a, b, _c);
          }) : _isPlaceholder(b) && _isPlaceholder(c) ? _curry2(function (_b, _c) {
            return fn(a, _b, _c);
          }) : _isPlaceholder(a) ? _curry1(function (_a) {
            return fn(_a, b, c);
          }) : _isPlaceholder(b) ? _curry1(function (_b) {
            return fn(a, _b, c);
          }) : _isPlaceholder(c) ? _curry1(function (_c) {
            return fn(a, b, _c);
          }) : fn(a, b, c);
      }
    };
  }

  /**
   * Applies a function to the value at the given index of an array, returning a
   * new copy of the array with the element at the given index replaced with the
   * result of the function application.
   *
   * @func
   * @memberOf R
   * @since v0.14.0
   * @category List
   * @sig Number -> (a -> a) -> [a] -> [a]
   * @param {Number} idx The index.
   * @param {Function} fn The function to apply.
   * @param {Array|Arguments} list An array-like object whose value
   *        at the supplied index will be replaced.
   * @return {Array} A copy of the supplied array-like object with
   *         the element at index `idx` replaced with the value
   *         returned by applying `fn` to the existing element.
   * @see R.update
   * @example
   *
   *      R.adjust(1, R.toUpper, ['a', 'b', 'c', 'd']);      //=> ['a', 'B', 'c', 'd']
   *      R.adjust(-1, R.toUpper, ['a', 'b', 'c', 'd']);     //=> ['a', 'b', 'c', 'D']
   * @symb R.adjust(-1, f, [a, b]) = [a, f(b)]
   * @symb R.adjust(0, f, [a, b]) = [f(a), b]
   */

  var adjust = _curry3(function adjust(idx, fn, list) {
    var len = list.length;

    if (idx >= len || idx < -len) {
      return list;
    }

    var _idx = (len + idx) % len;

    var _list = _concat(list);

    _list[_idx] = fn(list[_idx]);
    return _list;
  });

  /**
   * Tests whether or not an object is an array.
   *
   * @private
   * @param {*} val The object to test.
   * @return {Boolean} `true` if `val` is an array, `false` otherwise.
   * @example
   *
   *      _isArray([]); //=> true
   *      _isArray(null); //=> false
   *      _isArray({}); //=> false
   */
  var _isArray = Array.isArray || function _isArray(val) {
    return val != null && val.length >= 0 && Object.prototype.toString.call(val) === '[object Array]';
  };

  function _isTransformer(obj) {
    return obj != null && typeof obj['@@transducer/step'] === 'function';
  }

  /**
   * Returns a function that dispatches with different strategies based on the
   * object in list position (last argument). If it is an array, executes [fn].
   * Otherwise, if it has a function with one of the given method names, it will
   * execute that function (functor case). Otherwise, if it is a transformer,
   * uses transducer created by [transducerCreator] to return a new transformer
   * (transducer case).
   * Otherwise, it will default to executing [fn].
   *
   * @private
   * @param {Array} methodNames properties to check for a custom implementation
   * @param {Function} transducerCreator transducer factory if object is transformer
   * @param {Function} fn default ramda implementation
   * @return {Function} A function that dispatches on object in list position
   */

  function _dispatchable(methodNames, transducerCreator, fn) {
    return function () {
      if (arguments.length === 0) {
        return fn();
      }

      var obj = arguments[arguments.length - 1];

      if (!_isArray(obj)) {
        var idx = 0;

        while (idx < methodNames.length) {
          if (typeof obj[methodNames[idx]] === 'function') {
            return obj[methodNames[idx]].apply(obj, Array.prototype.slice.call(arguments, 0, -1));
          }

          idx += 1;
        }

        if (_isTransformer(obj)) {
          var transducer = transducerCreator.apply(null, Array.prototype.slice.call(arguments, 0, -1));
          return transducer(obj);
        }
      }

      return fn.apply(this, arguments);
    };
  }

  function _reduced(x) {
    return x && x['@@transducer/reduced'] ? x : {
      '@@transducer/value': x,
      '@@transducer/reduced': true
    };
  }

  var _xfBase = {
    init: function init() {
      return this.xf['@@transducer/init']();
    },
    result: function result(_result) {
      return this.xf['@@transducer/result'](_result);
    }
  };

  function XAll(f, xf) {
    this.xf = xf;
    this.f = f;
    this.all = true;
  }

  XAll.prototype['@@transducer/init'] = _xfBase.init;

  XAll.prototype['@@transducer/result'] = function (result) {
    if (this.all) {
      result = this.xf['@@transducer/step'](result, true);
    }

    return this.xf['@@transducer/result'](result);
  };

  XAll.prototype['@@transducer/step'] = function (result, input) {
    if (!this.f(input)) {
      this.all = false;
      result = _reduced(this.xf['@@transducer/step'](result, false));
    }

    return result;
  };

  var _xall = _curry2(function _xall(f, xf) {
    return new XAll(f, xf);
  });

  /**
   * Returns `true` if all elements of the list match the predicate, `false` if
   * there are any that don't.
   *
   * Dispatches to the `all` method of the second argument, if present.
   *
   * Acts as a transducer if a transformer is given in list position.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig (a -> Boolean) -> [a] -> Boolean
   * @param {Function} fn The predicate function.
   * @param {Array} list The array to consider.
   * @return {Boolean} `true` if the predicate is satisfied by every element, `false`
   *         otherwise.
   * @see R.any, R.none, R.transduce
   * @example
   *
   *      const equals3 = R.equals(3);
   *      R.all(equals3)([3, 3, 3, 3]); //=> true
   *      R.all(equals3)([3, 3, 1, 3]); //=> false
   */

  var all = _curry2(_dispatchable(['all'], _xall, function all(fn, list) {
    var idx = 0;

    while (idx < list.length) {
      if (!fn(list[idx])) {
        return false;
      }

      idx += 1;
    }

    return true;
  }));

  /**
   * Returns the larger of its two arguments.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Relation
   * @sig Ord a => a -> a -> a
   * @param {*} a
   * @param {*} b
   * @return {*}
   * @see R.maxBy, R.min
   * @example
   *
   *      R.max(789, 123); //=> 789
   *      R.max('a', 'b'); //=> 'b'
   */

  var max = _curry2(function max(a, b) {
    return b > a ? b : a;
  });

  function _map(fn, functor) {
    var idx = 0;
    var len = functor.length;
    var result = Array(len);

    while (idx < len) {
      result[idx] = fn(functor[idx]);
      idx += 1;
    }

    return result;
  }

  function _isString(x) {
    return Object.prototype.toString.call(x) === '[object String]';
  }

  /**
   * Tests whether or not an object is similar to an array.
   *
   * @private
   * @category Type
   * @category List
   * @sig * -> Boolean
   * @param {*} x The object to test.
   * @return {Boolean} `true` if `x` has a numeric length property and extreme indices defined; `false` otherwise.
   * @example
   *
   *      _isArrayLike([]); //=> true
   *      _isArrayLike(true); //=> false
   *      _isArrayLike({}); //=> false
   *      _isArrayLike({length: 10}); //=> false
   *      _isArrayLike({0: 'zero', 9: 'nine', length: 10}); //=> true
   *      _isArrayLike({nodeType: 1, length: 1}) // => false
   */

  var _isArrayLike = _curry1(function isArrayLike(x) {
    if (_isArray(x)) {
      return true;
    }

    if (!x) {
      return false;
    }

    if (_typeof(x) !== 'object') {
      return false;
    }

    if (_isString(x)) {
      return false;
    }

    if (x.length === 0) {
      return true;
    }

    if (x.length > 0) {
      return x.hasOwnProperty(0) && x.hasOwnProperty(x.length - 1);
    }

    return false;
  });

  function XWrap(fn) {
    this.f = fn;
  }

  XWrap.prototype['@@transducer/init'] = function () {
    throw new Error('init not implemented on XWrap');
  };

  XWrap.prototype['@@transducer/result'] = function (acc) {
    return acc;
  };

  XWrap.prototype['@@transducer/step'] = function (acc, x) {
    return this.f(acc, x);
  };

  function _xwrap(fn) {
    return new XWrap(fn);
  }

  /**
   * Creates a function that is bound to a context.
   * Note: `R.bind` does not provide the additional argument-binding capabilities of
   * [Function.prototype.bind](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind).
   *
   * @func
   * @memberOf R
   * @since v0.6.0
   * @category Function
   * @category Object
   * @sig (* -> *) -> {*} -> (* -> *)
   * @param {Function} fn The function to bind to context
   * @param {Object} thisObj The context to bind `fn` to
   * @return {Function} A function that will execute in the context of `thisObj`.
   * @see R.partial
   * @example
   *
   *      const log = R.bind(console.log, console);
   *      R.pipe(R.assoc('a', 2), R.tap(log), R.assoc('a', 3))({a: 1}); //=> {a: 3}
   *      // logs {a: 2}
   * @symb R.bind(f, o)(a, b) = f.call(o, a, b)
   */

  var bind = _curry2(function bind(fn, thisObj) {
    return _arity(fn.length, function () {
      return fn.apply(thisObj, arguments);
    });
  });

  function _arrayReduce(xf, acc, list) {
    var idx = 0;
    var len = list.length;

    while (idx < len) {
      acc = xf['@@transducer/step'](acc, list[idx]);

      if (acc && acc['@@transducer/reduced']) {
        acc = acc['@@transducer/value'];
        break;
      }

      idx += 1;
    }

    return xf['@@transducer/result'](acc);
  }

  function _iterableReduce(xf, acc, iter) {
    var step = iter.next();

    while (!step.done) {
      acc = xf['@@transducer/step'](acc, step.value);

      if (acc && acc['@@transducer/reduced']) {
        acc = acc['@@transducer/value'];
        break;
      }

      step = iter.next();
    }

    return xf['@@transducer/result'](acc);
  }

  function _methodReduce(xf, acc, obj, methodName) {
    return xf['@@transducer/result'](obj[methodName](bind(xf['@@transducer/step'], xf), acc));
  }

  var symIterator = typeof Symbol !== 'undefined' ? Symbol.iterator : '@@iterator';
  function _reduce(fn, acc, list) {
    if (typeof fn === 'function') {
      fn = _xwrap(fn);
    }

    if (_isArrayLike(list)) {
      return _arrayReduce(fn, acc, list);
    }

    if (typeof list['fantasy-land/reduce'] === 'function') {
      return _methodReduce(fn, acc, list, 'fantasy-land/reduce');
    }

    if (list[symIterator] != null) {
      return _iterableReduce(fn, acc, list[symIterator]());
    }

    if (typeof list.next === 'function') {
      return _iterableReduce(fn, acc, list);
    }

    if (typeof list.reduce === 'function') {
      return _methodReduce(fn, acc, list, 'reduce');
    }

    throw new TypeError('reduce: list must be array or iterable');
  }

  function XMap(f, xf) {
    this.xf = xf;
    this.f = f;
  }

  XMap.prototype['@@transducer/init'] = _xfBase.init;
  XMap.prototype['@@transducer/result'] = _xfBase.result;

  XMap.prototype['@@transducer/step'] = function (result, input) {
    return this.xf['@@transducer/step'](result, this.f(input));
  };

  var _xmap = _curry2(function _xmap(f, xf) {
    return new XMap(f, xf);
  });

  function _has(prop, obj) {
    return Object.prototype.hasOwnProperty.call(obj, prop);
  }

  var toString = Object.prototype.toString;

  var _isArguments = function () {
    return toString.call(arguments) === '[object Arguments]' ? function _isArguments(x) {
      return toString.call(x) === '[object Arguments]';
    } : function _isArguments(x) {
      return _has('callee', x);
    };
  }();

  var hasEnumBug = !{
    toString: null
  }.propertyIsEnumerable('toString');
  var nonEnumerableProps = ['constructor', 'valueOf', 'isPrototypeOf', 'toString', 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; // Safari bug

  var hasArgsEnumBug = function () {

    return arguments.propertyIsEnumerable('length');
  }();

  var contains = function contains(list, item) {
    var idx = 0;

    while (idx < list.length) {
      if (list[idx] === item) {
        return true;
      }

      idx += 1;
    }

    return false;
  };
  /**
   * Returns a list containing the names of all the enumerable own properties of
   * the supplied object.
   * Note that the order of the output array is not guaranteed to be consistent
   * across different JS platforms.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Object
   * @sig {k: v} -> [k]
   * @param {Object} obj The object to extract properties from
   * @return {Array} An array of the object's own properties.
   * @see R.keysIn, R.values, R.toPairs
   * @example
   *
   *      R.keys({a: 1, b: 2, c: 3}); //=> ['a', 'b', 'c']
   */


  var keys = typeof Object.keys === 'function' && !hasArgsEnumBug ? _curry1(function keys(obj) {
    return Object(obj) !== obj ? [] : Object.keys(obj);
  }) : _curry1(function keys(obj) {
    if (Object(obj) !== obj) {
      return [];
    }

    var prop, nIdx;
    var ks = [];

    var checkArgsLength = hasArgsEnumBug && _isArguments(obj);

    for (prop in obj) {
      if (_has(prop, obj) && (!checkArgsLength || prop !== 'length')) {
        ks[ks.length] = prop;
      }
    }

    if (hasEnumBug) {
      nIdx = nonEnumerableProps.length - 1;

      while (nIdx >= 0) {
        prop = nonEnumerableProps[nIdx];

        if (_has(prop, obj) && !contains(ks, prop)) {
          ks[ks.length] = prop;
        }

        nIdx -= 1;
      }
    }

    return ks;
  });

  /**
   * Takes a function and
   * a [functor](https://github.com/fantasyland/fantasy-land#functor),
   * applies the function to each of the functor's values, and returns
   * a functor of the same shape.
   *
   * Ramda provides suitable `map` implementations for `Array` and `Object`,
   * so this function may be applied to `[1, 2, 3]` or `{x: 1, y: 2, z: 3}`.
   *
   * Dispatches to the `map` method of the second argument, if present.
   *
   * Acts as a transducer if a transformer is given in list position.
   *
   * Also treats functions as functors and will compose them together.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig Functor f => (a -> b) -> f a -> f b
   * @param {Function} fn The function to be called on every element of the input `list`.
   * @param {Array} list The list to be iterated over.
   * @return {Array} The new list.
   * @see R.transduce, R.addIndex, R.pluck, R.project
   * @example
   *
   *      const double = x => x * 2;
   *
   *      R.map(double, [1, 2, 3]); //=> [2, 4, 6]
   *
   *      R.map(double, {x: 1, y: 2, z: 3}); //=> {x: 2, y: 4, z: 6}
   * @symb R.map(f, [a, b]) = [f(a), f(b)]
   * @symb R.map(f, { x: a, y: b }) = { x: f(a), y: f(b) }
   * @symb R.map(f, functor_o) = functor_o.map(f)
   */

  var map = _curry2(_dispatchable(['fantasy-land/map', 'map'], _xmap, function map(fn, functor) {
    switch (Object.prototype.toString.call(functor)) {
      case '[object Function]':
        return curryN(functor.length, function () {
          return fn.call(this, functor.apply(this, arguments));
        });

      case '[object Object]':
        return _reduce(function (acc, key) {
          acc[key] = fn(functor[key]);
          return acc;
        }, {}, keys(functor));

      default:
        return _map(fn, functor);
    }
  }));

  /**
   * Determine if the passed argument is an integer.
   *
   * @private
   * @param {*} n
   * @category Type
   * @return {Boolean}
   */
  var _isInteger = Number.isInteger || function _isInteger(n) {
    return n << 0 === n;
  };

  /**
   * Returns the nth element of the given list or string. If n is negative the
   * element at index length + n is returned.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig Number -> [a] -> a | Undefined
   * @sig Number -> String -> String
   * @param {Number} offset
   * @param {*} list
   * @return {*}
   * @example
   *
   *      const list = ['foo', 'bar', 'baz', 'quux'];
   *      R.nth(1, list); //=> 'bar'
   *      R.nth(-1, list); //=> 'quux'
   *      R.nth(-99, list); //=> undefined
   *
   *      R.nth(2, 'abc'); //=> 'c'
   *      R.nth(3, 'abc'); //=> ''
   * @symb R.nth(-1, [a, b, c]) = c
   * @symb R.nth(0, [a, b, c]) = a
   * @symb R.nth(1, [a, b, c]) = b
   */

  var nth = _curry2(function nth(offset, list) {
    var idx = offset < 0 ? list.length + offset : offset;
    return _isString(list) ? list.charAt(idx) : list[idx];
  });

  /**
   * Returns a function that when supplied an object returns the indicated
   * property of that object, if it exists.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Object
   * @typedefn Idx = String | Int | Symbol
   * @sig Idx -> {s: a} -> a | Undefined
   * @param {String|Number} p The property name or array index
   * @param {Object} obj The object to query
   * @return {*} The value at `obj.p`.
   * @see R.path, R.props, R.pluck, R.project, R.nth
   * @example
   *
   *      R.prop('x', {x: 100}); //=> 100
   *      R.prop('x', {}); //=> undefined
   *      R.prop(0, [100]); //=> 100
   *      R.compose(R.inc, R.prop('x'))({ x: 3 }) //=> 4
   */

  var prop = _curry2(function prop(p, obj) {
    if (obj == null) {
      return;
    }

    return _isInteger(p) ? nth(p, obj) : obj[p];
  });

  /**
   * Returns a new list by plucking the same named property off all objects in
   * the list supplied.
   *
   * `pluck` will work on
   * any [functor](https://github.com/fantasyland/fantasy-land#functor) in
   * addition to arrays, as it is equivalent to `R.map(R.prop(k), f)`.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig Functor f => k -> f {k: v} -> f v
   * @param {Number|String} key The key name to pluck off of each object.
   * @param {Array} f The array or functor to consider.
   * @return {Array} The list of values for the given key.
   * @see R.project, R.prop, R.props
   * @example
   *
   *      var getAges = R.pluck('age');
   *      getAges([{name: 'fred', age: 29}, {name: 'wilma', age: 27}]); //=> [29, 27]
   *
   *      R.pluck(0, [[1, 2], [3, 4]]);               //=> [1, 3]
   *      R.pluck('val', {a: {val: 3}, b: {val: 5}}); //=> {a: 3, b: 5}
   * @symb R.pluck('x', [{x: 1, y: 2}, {x: 3, y: 4}, {x: 5, y: 6}]) = [1, 3, 5]
   * @symb R.pluck(0, [[1, 2], [3, 4], [5, 6]]) = [1, 3, 5]
   */

  var pluck = _curry2(function pluck(p, list) {
    return map(prop(p), list);
  });

  /**
   * Returns a single item by iterating through the list, successively calling
   * the iterator function and passing it an accumulator value and the current
   * value from the array, and then passing the result to the next call.
   *
   * The iterator function receives two values: *(acc, value)*. It may use
   * [`R.reduced`](#reduced) to shortcut the iteration.
   *
   * The arguments' order of [`reduceRight`](#reduceRight)'s iterator function
   * is *(value, acc)*.
   *
   * Note: `R.reduce` does not skip deleted or unassigned indices (sparse
   * arrays), unlike the native `Array.prototype.reduce` method. For more details
   * on this behavior, see:
   * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#Description
   *
   * Dispatches to the `reduce` method of the third argument, if present. When
   * doing so, it is up to the user to handle the [`R.reduced`](#reduced)
   * shortcuting, as this is not implemented by `reduce`.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig ((a, b) -> a) -> a -> [b] -> a
   * @param {Function} fn The iterator function. Receives two values, the accumulator and the
   *        current element from the array.
   * @param {*} acc The accumulator value.
   * @param {Array} list The list to iterate over.
   * @return {*} The final, accumulated value.
   * @see R.reduced, R.addIndex, R.reduceRight
   * @example
   *
   *      R.reduce(R.subtract, 0, [1, 2, 3, 4]) // => ((((0 - 1) - 2) - 3) - 4) = -10
   *      //          -               -10
   *      //         / \              / \
   *      //        -   4           -6   4
   *      //       / \              / \
   *      //      -   3   ==>     -3   3
   *      //     / \              / \
   *      //    -   2           -1   2
   *      //   / \              / \
   *      //  0   1            0   1
   *
   * @symb R.reduce(f, a, [b, c, d]) = f(f(f(a, b), c), d)
   */

  var reduce = _curry3(_reduce);

  /**
   * Takes a list of predicates and returns a predicate that returns true for a
   * given list of arguments if every one of the provided predicates is satisfied
   * by those arguments.
   *
   * The function returned is a curried function whose arity matches that of the
   * highest-arity predicate.
   *
   * @func
   * @memberOf R
   * @since v0.9.0
   * @category Logic
   * @sig [(*... -> Boolean)] -> (*... -> Boolean)
   * @param {Array} predicates An array of predicates to check
   * @return {Function} The combined predicate
   * @see R.anyPass
   * @example
   *
   *      const isQueen = R.propEq('rank', 'Q');
   *      const isSpade = R.propEq('suit', '♠︎');
   *      const isQueenOfSpades = R.allPass([isQueen, isSpade]);
   *
   *      isQueenOfSpades({rank: 'Q', suit: '♣︎'}); //=> false
   *      isQueenOfSpades({rank: 'Q', suit: '♠︎'}); //=> true
   */

  var allPass = _curry1(function allPass(preds) {
    return curryN(reduce(max, 0, pluck('length', preds)), function () {
      var idx = 0;
      var len = preds.length;

      while (idx < len) {
        if (!preds[idx].apply(this, arguments)) {
          return false;
        }

        idx += 1;
      }

      return true;
    });
  });

  /**
   * Returns a function that always returns the given value. Note that for
   * non-primitives the value returned is a reference to the original value.
   *
   * This function is known as `const`, `constant`, or `K` (for K combinator) in
   * other languages and libraries.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Function
   * @sig a -> (* -> a)
   * @param {*} val The value to wrap in a function
   * @return {Function} A Function :: * -> val.
   * @example
   *
   *      const t = R.always('Tee');
   *      t(); //=> 'Tee'
   */

  var always = _curry1(function always(val) {
    return function () {
      return val;
    };
  });

  /**
   * Returns the first argument if it is falsy, otherwise the second argument.
   * Acts as the boolean `and` statement if both inputs are `Boolean`s.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Logic
   * @sig a -> b -> a | b
   * @param {Any} a
   * @param {Any} b
   * @return {Any}
   * @see R.both, R.or
   * @example
   *
   *      R.and(true, true); //=> true
   *      R.and(true, false); //=> false
   *      R.and(false, true); //=> false
   *      R.and(false, false); //=> false
   */

  var and = _curry2(function and(a, b) {
    return a && b;
  });

  function XAny(f, xf) {
    this.xf = xf;
    this.f = f;
    this.any = false;
  }

  XAny.prototype['@@transducer/init'] = _xfBase.init;

  XAny.prototype['@@transducer/result'] = function (result) {
    if (!this.any) {
      result = this.xf['@@transducer/step'](result, false);
    }

    return this.xf['@@transducer/result'](result);
  };

  XAny.prototype['@@transducer/step'] = function (result, input) {
    if (this.f(input)) {
      this.any = true;
      result = _reduced(this.xf['@@transducer/step'](result, true));
    }

    return result;
  };

  var _xany = _curry2(function _xany(f, xf) {
    return new XAny(f, xf);
  });

  /**
   * Returns `true` if at least one of the elements of the list match the predicate,
   * `false` otherwise.
   *
   * Dispatches to the `any` method of the second argument, if present.
   *
   * Acts as a transducer if a transformer is given in list position.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig (a -> Boolean) -> [a] -> Boolean
   * @param {Function} fn The predicate function.
   * @param {Array} list The array to consider.
   * @return {Boolean} `true` if the predicate is satisfied by at least one element, `false`
   *         otherwise.
   * @see R.all, R.none, R.transduce
   * @example
   *
   *      const lessThan0 = R.flip(R.lt)(0);
   *      const lessThan2 = R.flip(R.lt)(2);
   *      R.any(lessThan0)([1, 2]); //=> false
   *      R.any(lessThan2)([1, 2]); //=> true
   */

  var any = _curry2(_dispatchable(['any'], _xany, function any(fn, list) {
    var idx = 0;

    while (idx < list.length) {
      if (fn(list[idx])) {
        return true;
      }

      idx += 1;
    }

    return false;
  }));

  /**
   * Takes a list of predicates and returns a predicate that returns true for a
   * given list of arguments if at least one of the provided predicates is
   * satisfied by those arguments.
   *
   * The function returned is a curried function whose arity matches that of the
   * highest-arity predicate.
   *
   * @func
   * @memberOf R
   * @since v0.9.0
   * @category Logic
   * @sig [(*... -> Boolean)] -> (*... -> Boolean)
   * @param {Array} predicates An array of predicates to check
   * @return {Function} The combined predicate
   * @see R.allPass
   * @example
   *
   *      const isClub = R.propEq('suit', '♣');
   *      const isSpade = R.propEq('suit', '♠');
   *      const isBlackCard = R.anyPass([isClub, isSpade]);
   *
   *      isBlackCard({rank: '10', suit: '♣'}); //=> true
   *      isBlackCard({rank: 'Q', suit: '♠'}); //=> true
   *      isBlackCard({rank: 'Q', suit: '♦'}); //=> false
   */

  var anyPass = _curry1(function anyPass(preds) {
    return curryN(reduce(max, 0, pluck('length', preds)), function () {
      var idx = 0;
      var len = preds.length;

      while (idx < len) {
        if (preds[idx].apply(this, arguments)) {
          return true;
        }

        idx += 1;
      }

      return false;
    });
  });

  /**
   * ap applies a list of functions to a list of values.
   *
   * Dispatches to the `ap` method of the second argument, if present. Also
   * treats curried functions as applicatives.
   *
   * @func
   * @memberOf R
   * @since v0.3.0
   * @category Function
   * @sig [a -> b] -> [a] -> [b]
   * @sig Apply f => f (a -> b) -> f a -> f b
   * @sig (r -> a -> b) -> (r -> a) -> (r -> b)
   * @param {*} applyF
   * @param {*} applyX
   * @return {*}
   * @example
   *
   *      R.ap([R.multiply(2), R.add(3)], [1,2,3]); //=> [2, 4, 6, 4, 5, 6]
   *      R.ap([R.concat('tasty '), R.toUpper], ['pizza', 'salad']); //=> ["tasty pizza", "tasty salad", "PIZZA", "SALAD"]
   *
   *      // R.ap can also be used as S combinator
   *      // when only two functions are passed
   *      R.ap(R.concat, R.toUpper)('Ramda') //=> 'RamdaRAMDA'
   * @symb R.ap([f, g], [a, b]) = [f(a), f(b), g(a), g(b)]
   */

  var ap = _curry2(function ap(applyF, applyX) {
    return typeof applyX['fantasy-land/ap'] === 'function' ? applyX['fantasy-land/ap'](applyF) : typeof applyF.ap === 'function' ? applyF.ap(applyX) : typeof applyF === 'function' ? function (x) {
      return applyF(x)(applyX(x));
    } : _reduce(function (acc, f) {
      return _concat(acc, map(f, applyX));
    }, [], applyF);
  });

  function _aperture(n, list) {
    var idx = 0;
    var limit = list.length - (n - 1);
    var acc = new Array(limit >= 0 ? limit : 0);

    while (idx < limit) {
      acc[idx] = Array.prototype.slice.call(list, idx, idx + n);
      idx += 1;
    }

    return acc;
  }

  function XAperture(n, xf) {
    this.xf = xf;
    this.pos = 0;
    this.full = false;
    this.acc = new Array(n);
  }

  XAperture.prototype['@@transducer/init'] = _xfBase.init;

  XAperture.prototype['@@transducer/result'] = function (result) {
    this.acc = null;
    return this.xf['@@transducer/result'](result);
  };

  XAperture.prototype['@@transducer/step'] = function (result, input) {
    this.store(input);
    return this.full ? this.xf['@@transducer/step'](result, this.getCopy()) : result;
  };

  XAperture.prototype.store = function (input) {
    this.acc[this.pos] = input;
    this.pos += 1;

    if (this.pos === this.acc.length) {
      this.pos = 0;
      this.full = true;
    }
  };

  XAperture.prototype.getCopy = function () {
    return _concat(Array.prototype.slice.call(this.acc, this.pos), Array.prototype.slice.call(this.acc, 0, this.pos));
  };

  var _xaperture = _curry2(function _xaperture(n, xf) {
    return new XAperture(n, xf);
  });

  /**
   * Returns a new list, composed of n-tuples of consecutive elements. If `n` is
   * greater than the length of the list, an empty list is returned.
   *
   * Acts as a transducer if a transformer is given in list position.
   *
   * @func
   * @memberOf R
   * @since v0.12.0
   * @category List
   * @sig Number -> [a] -> [[a]]
   * @param {Number} n The size of the tuples to create
   * @param {Array} list The list to split into `n`-length tuples
   * @return {Array} The resulting list of `n`-length tuples
   * @see R.transduce
   * @example
   *
   *      R.aperture(2, [1, 2, 3, 4, 5]); //=> [[1, 2], [2, 3], [3, 4], [4, 5]]
   *      R.aperture(3, [1, 2, 3, 4, 5]); //=> [[1, 2, 3], [2, 3, 4], [3, 4, 5]]
   *      R.aperture(7, [1, 2, 3, 4, 5]); //=> []
   */

  var aperture = _curry2(_dispatchable([], _xaperture, _aperture));

  /**
   * Returns a new list containing the contents of the given list, followed by
   * the given element.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig a -> [a] -> [a]
   * @param {*} el The element to add to the end of the new list.
   * @param {Array} list The list of elements to add a new item to.
   *        list.
   * @return {Array} A new list containing the elements of the old list followed by `el`.
   * @see R.prepend
   * @example
   *
   *      R.append('tests', ['write', 'more']); //=> ['write', 'more', 'tests']
   *      R.append('tests', []); //=> ['tests']
   *      R.append(['tests'], ['write', 'more']); //=> ['write', 'more', ['tests']]
   */

  var append = _curry2(function append(el, list) {
    return _concat(list, [el]);
  });

  /**
   * Applies function `fn` to the argument list `args`. This is useful for
   * creating a fixed-arity function from a variadic function. `fn` should be a
   * bound function if context is significant.
   *
   * @func
   * @memberOf R
   * @since v0.7.0
   * @category Function
   * @sig (*... -> a) -> [*] -> a
   * @param {Function} fn The function which will be called with `args`
   * @param {Array} args The arguments to call `fn` with
   * @return {*} result The result, equivalent to `fn(...args)`
   * @see R.call, R.unapply
   * @example
   *
   *      const nums = [1, 2, 3, -99, 42, 6, 7];
   *      R.apply(Math.max, nums); //=> 42
   * @symb R.apply(f, [a, b, c]) = f(a, b, c)
   */

  var apply = _curry2(function apply(fn, args) {
    return fn.apply(this, args);
  });

  /**
   * Returns a list of all the enumerable own properties of the supplied object.
   * Note that the order of the output array is not guaranteed across different
   * JS platforms.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Object
   * @sig {k: v} -> [v]
   * @param {Object} obj The object to extract values from
   * @return {Array} An array of the values of the object's own properties.
   * @see R.valuesIn, R.keys, R.toPairs
   * @example
   *
   *      R.values({a: 1, b: 2, c: 3}); //=> [1, 2, 3]
   */

  var values = _curry1(function values(obj) {
    var props = keys(obj);
    var len = props.length;
    var vals = [];
    var idx = 0;

    while (idx < len) {
      vals[idx] = obj[props[idx]];
      idx += 1;
    }

    return vals;
  });

  // delegating calls to .map

  function mapValues(fn, obj) {
    return _isArray(obj) ? obj.map(fn) : keys(obj).reduce(function (acc, key) {
      acc[key] = fn(obj[key]);
      return acc;
    }, {});
  }
  /**
   * Given a spec object recursively mapping properties to functions, creates a
   * function producing an object of the same structure, by mapping each property
   * to the result of calling its associated function with the supplied arguments.
   *
   * @func
   * @memberOf R
   * @since v0.20.0
   * @category Function
   * @sig {k: ((a, b, ..., m) -> v)} -> ((a, b, ..., m) -> {k: v})
   * @param {Object} spec an object recursively mapping properties to functions for
   *        producing the values for these properties.
   * @return {Function} A function that returns an object of the same structure
   * as `spec', with each property set to the value returned by calling its
   * associated function with the supplied arguments.
   * @see R.converge, R.juxt
   * @example
   *
   *      const getMetrics = R.applySpec({
   *        sum: R.add,
   *        nested: { mul: R.multiply }
   *      });
   *      getMetrics(2, 4); // => { sum: 6, nested: { mul: 8 } }
   * @symb R.applySpec({ x: f, y: { z: g } })(a, b) = { x: f(a, b), y: { z: g(a, b) } }
   */


  var applySpec = _curry1(function applySpec(spec) {
    spec = mapValues(function (v) {
      return typeof v == 'function' ? v : applySpec(v);
    }, spec);
    return curryN(reduce(max, 0, pluck('length', values(spec))), function () {
      var args = arguments;
      return mapValues(function (f) {
        return apply(f, args);
      }, spec);
    });
  });

  /**
   * Takes a value and applies a function to it.
   *
   * This function is also known as the `thrush` combinator.
   *
   * @func
   * @memberOf R
   * @since v0.25.0
   * @category Function
   * @sig a -> (a -> b) -> b
   * @param {*} x The value
   * @param {Function} f The function to apply
   * @return {*} The result of applying `f` to `x`
   * @example
   *
   *      const t42 = R.applyTo(42);
   *      t42(R.identity); //=> 42
   *      t42(R.add(1)); //=> 43
   */

  var applyTo = _curry2(function applyTo(x, f) {
    return f(x);
  });

  /**
   * Makes an ascending comparator function out of a function that returns a value
   * that can be compared with `<` and `>`.
   *
   * @func
   * @memberOf R
   * @since v0.23.0
   * @category Function
   * @sig Ord b => (a -> b) -> a -> a -> Number
   * @param {Function} fn A function of arity one that returns a value that can be compared
   * @param {*} a The first item to be compared.
   * @param {*} b The second item to be compared.
   * @return {Number} `-1` if fn(a) < fn(b), `1` if fn(b) < fn(a), otherwise `0`
   * @see R.descend
   * @example
   *
   *      const byAge = R.ascend(R.prop('age'));
   *      const people = [
   *        { name: 'Emma', age: 70 },
   *        { name: 'Peter', age: 78 },
   *        { name: 'Mikhail', age: 62 },
   *      ];
   *      const peopleByYoungestFirst = R.sort(byAge, people);
   *        //=> [{ name: 'Mikhail', age: 62 },{ name: 'Emma', age: 70 }, { name: 'Peter', age: 78 }]
   */

  var ascend = _curry3(function ascend(fn, a, b) {
    var aa = fn(a);
    var bb = fn(b);
    return aa < bb ? -1 : aa > bb ? 1 : 0;
  });

  /**
   * Makes a shallow clone of an object, setting or overriding the specified
   * property with the given value. Note that this copies and flattens prototype
   * properties onto the new object as well. All non-primitive properties are
   * copied by reference.
   *
   * @private
   * @param {String|Number} prop The property name to set
   * @param {*} val The new value
   * @param {Object|Array} obj The object to clone
   * @return {Object|Array} A new object equivalent to the original except for the changed property.
   */

  function _assoc(prop, val, obj) {
    if (_isInteger(prop) && _isArray(obj)) {
      var arr = [].concat(obj);
      arr[prop] = val;
      return arr;
    }

    var result = {};

    for (var p in obj) {
      result[p] = obj[p];
    }

    result[prop] = val;
    return result;
  }

  /**
   * Checks if the input value is `null` or `undefined`.
   *
   * @func
   * @memberOf R
   * @since v0.9.0
   * @category Type
   * @sig * -> Boolean
   * @param {*} x The value to test.
   * @return {Boolean} `true` if `x` is `undefined` or `null`, otherwise `false`.
   * @example
   *
   *      R.isNil(null); //=> true
   *      R.isNil(undefined); //=> true
   *      R.isNil(0); //=> false
   *      R.isNil([]); //=> false
   */

  var isNil = _curry1(function isNil(x) {
    return x == null;
  });

  /**
   * Makes a shallow clone of an object, setting or overriding the nodes required
   * to create the given path, and placing the specific value at the tail end of
   * that path. Note that this copies and flattens prototype properties onto the
   * new object as well. All non-primitive properties are copied by reference.
   *
   * @func
   * @memberOf R
   * @since v0.8.0
   * @category Object
   * @typedefn Idx = String | Int | Symbol
   * @sig [Idx] -> a -> {a} -> {a}
   * @param {Array} path the path to set
   * @param {*} val The new value
   * @param {Object} obj The object to clone
   * @return {Object} A new object equivalent to the original except along the specified path.
   * @see R.dissocPath
   * @example
   *
   *      R.assocPath(['a', 'b', 'c'], 42, {a: {b: {c: 0}}}); //=> {a: {b: {c: 42}}}
   *
   *      // Any missing or non-object keys in path will be overridden
   *      R.assocPath(['a', 'b', 'c'], 42, {a: 5}); //=> {a: {b: {c: 42}}}
   */

  var assocPath = _curry3(function assocPath(path, val, obj) {
    if (path.length === 0) {
      return val;
    }

    var idx = path[0];

    if (path.length > 1) {
      var nextObj = !isNil(obj) && _has(idx, obj) ? obj[idx] : _isInteger(path[1]) ? [] : {};
      val = assocPath(Array.prototype.slice.call(path, 1), val, nextObj);
    }

    return _assoc(idx, val, obj);
  });

  /**
   * Makes a shallow clone of an object, setting or overriding the specified
   * property with the given value. Note that this copies and flattens prototype
   * properties onto the new object as well. All non-primitive properties are
   * copied by reference.
   *
   * @func
   * @memberOf R
   * @since v0.8.0
   * @category Object
   * @typedefn Idx = String | Int
   * @sig Idx -> a -> {k: v} -> {k: v}
   * @param {String|Number} prop The property name to set
   * @param {*} val The new value
   * @param {Object} obj The object to clone
   * @return {Object} A new object equivalent to the original except for the changed property.
   * @see R.dissoc, R.pick
   * @example
   *
   *      R.assoc('c', 3, {a: 1, b: 2}); //=> {a: 1, b: 2, c: 3}
   */

  var assoc = _curry3(function assoc(prop, val, obj) {
    return assocPath([prop], val, obj);
  });

  /**
   * Wraps a function of any arity (including nullary) in a function that accepts
   * exactly `n` parameters. Any extraneous parameters will not be passed to the
   * supplied function.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Function
   * @sig Number -> (* -> a) -> (* -> a)
   * @param {Number} n The desired arity of the new function.
   * @param {Function} fn The function to wrap.
   * @return {Function} A new function wrapping `fn`. The new function is guaranteed to be of
   *         arity `n`.
   * @see R.binary, R.unary
   * @example
   *
   *      const takesTwoArgs = (a, b) => [a, b];
   *
   *      takesTwoArgs.length; //=> 2
   *      takesTwoArgs(1, 2); //=> [1, 2]
   *
   *      const takesOneArg = R.nAry(1, takesTwoArgs);
   *      takesOneArg.length; //=> 1
   *      // Only `n` arguments are passed to the wrapped function
   *      takesOneArg(1, 2); //=> [1, undefined]
   * @symb R.nAry(0, f)(a, b) = f()
   * @symb R.nAry(1, f)(a, b) = f(a)
   * @symb R.nAry(2, f)(a, b) = f(a, b)
   */

  var nAry = _curry2(function nAry(n, fn) {
    switch (n) {
      case 0:
        return function () {
          return fn.call(this);
        };

      case 1:
        return function (a0) {
          return fn.call(this, a0);
        };

      case 2:
        return function (a0, a1) {
          return fn.call(this, a0, a1);
        };

      case 3:
        return function (a0, a1, a2) {
          return fn.call(this, a0, a1, a2);
        };

      case 4:
        return function (a0, a1, a2, a3) {
          return fn.call(this, a0, a1, a2, a3);
        };

      case 5:
        return function (a0, a1, a2, a3, a4) {
          return fn.call(this, a0, a1, a2, a3, a4);
        };

      case 6:
        return function (a0, a1, a2, a3, a4, a5) {
          return fn.call(this, a0, a1, a2, a3, a4, a5);
        };

      case 7:
        return function (a0, a1, a2, a3, a4, a5, a6) {
          return fn.call(this, a0, a1, a2, a3, a4, a5, a6);
        };

      case 8:
        return function (a0, a1, a2, a3, a4, a5, a6, a7) {
          return fn.call(this, a0, a1, a2, a3, a4, a5, a6, a7);
        };

      case 9:
        return function (a0, a1, a2, a3, a4, a5, a6, a7, a8) {
          return fn.call(this, a0, a1, a2, a3, a4, a5, a6, a7, a8);
        };

      case 10:
        return function (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) {
          return fn.call(this, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
        };

      default:
        throw new Error('First argument to nAry must be a non-negative integer no greater than ten');
    }
  });

  /**
   * Wraps a function of any arity (including nullary) in a function that accepts
   * exactly 2 parameters. Any extraneous parameters will not be passed to the
   * supplied function.
   *
   * @func
   * @memberOf R
   * @since v0.2.0
   * @category Function
   * @sig (a -> b -> c -> ... -> z) -> ((a, b) -> z)
   * @param {Function} fn The function to wrap.
   * @return {Function} A new function wrapping `fn`. The new function is guaranteed to be of
   *         arity 2.
   * @see R.nAry, R.unary
   * @example
   *
   *      const takesThreeArgs = function(a, b, c) {
   *        return [a, b, c];
   *      };
   *      takesThreeArgs.length; //=> 3
   *      takesThreeArgs(1, 2, 3); //=> [1, 2, 3]
   *
   *      const takesTwoArgs = R.binary(takesThreeArgs);
   *      takesTwoArgs.length; //=> 2
   *      // Only 2 arguments are passed to the wrapped function
   *      takesTwoArgs(1, 2, 3); //=> [1, 2, undefined]
   * @symb R.binary(f)(a, b, c) = f(a, b)
   */

  var binary = _curry1(function binary(fn) {
    return nAry(2, fn);
  });

  function _isFunction(x) {
    var type = Object.prototype.toString.call(x);
    return type === '[object Function]' || type === '[object AsyncFunction]' || type === '[object GeneratorFunction]' || type === '[object AsyncGeneratorFunction]';
  }

  /**
   * "lifts" a function to be the specified arity, so that it may "map over" that
   * many lists, Functions or other objects that satisfy the [FantasyLand Apply spec](https://github.com/fantasyland/fantasy-land#apply).
   *
   * @func
   * @memberOf R
   * @since v0.7.0
   * @category Function
   * @sig Number -> (*... -> *) -> ([*]... -> [*])
   * @param {Function} fn The function to lift into higher context
   * @return {Function} The lifted function.
   * @see R.lift, R.ap
   * @example
   *
   *      const madd3 = R.liftN(3, (...args) => R.sum(args));
   *      madd3([1,2,3], [1,2,3], [1]); //=> [3, 4, 5, 4, 5, 6, 5, 6, 7]
   */

  var liftN = _curry2(function liftN(arity, fn) {
    var lifted = curryN(arity, fn);
    return curryN(arity, function () {
      return _reduce(ap, map(lifted, arguments[0]), Array.prototype.slice.call(arguments, 1));
    });
  });

  /**
   * "lifts" a function of arity >= 1 so that it may "map over" a list, Function or other
   * object that satisfies the [FantasyLand Apply spec](https://github.com/fantasyland/fantasy-land#apply).
   *
   * @func
   * @memberOf R
   * @since v0.7.0
   * @category Function
   * @sig (*... -> *) -> ([*]... -> [*])
   * @param {Function} fn The function to lift into higher context
   * @return {Function} The lifted function.
   * @see R.liftN
   * @example
   *
   *      const madd3 = R.lift((a, b, c) => a + b + c);
   *
   *      madd3([100, 200], [30, 40], [5, 6, 7]); //=> [135, 136, 137, 145, 146, 147, 235, 236, 237, 245, 246, 247]
   *
   *      const madd5 = R.lift((a, b, c, d, e) => a + b + c + d + e);
   *
   *      madd5([10, 20], [1], [2, 3], [4], [100, 200]); //=> [117, 217, 118, 218, 127, 227, 128, 228]
   */

  var lift = _curry1(function lift(fn) {
    return liftN(fn.length, fn);
  });

  /**
   * A function which calls the two provided functions and returns the `&&`
   * of the results.
   * It returns the result of the first function if it is false-y and the result
   * of the second function otherwise. Note that this is short-circuited,
   * meaning that the second function will not be invoked if the first returns a
   * false-y value.
   *
   * In addition to functions, `R.both` also accepts any fantasy-land compatible
   * applicative functor.
   *
   * @func
   * @memberOf R
   * @since v0.12.0
   * @category Logic
   * @sig (*... -> Boolean) -> (*... -> Boolean) -> (*... -> Boolean)
   * @param {Function} f A predicate
   * @param {Function} g Another predicate
   * @return {Function} a function that applies its arguments to `f` and `g` and `&&`s their outputs together.
   * @see R.either, R.and
   * @example
   *
   *      const gt10 = R.gt(R.__, 10)
   *      const lt20 = R.lt(R.__, 20)
   *      const f = R.both(gt10, lt20);
   *      f(15); //=> true
   *      f(30); //=> false
   *
   *      R.both(Maybe.Just(false), Maybe.Just(55)); // => Maybe.Just(false)
   *      R.both([false, false, 'a'], [11]); //=> [false, false, 11]
   */

  var both = _curry2(function both(f, g) {
    return _isFunction(f) ? function _both() {
      return f.apply(this, arguments) && g.apply(this, arguments);
    } : lift(and)(f, g);
  });

  /**
   * Returns the result of calling its first argument with the remaining
   * arguments. This is occasionally useful as a converging function for
   * [`R.converge`](#converge): the first branch can produce a function while the
   * remaining branches produce values to be passed to that function as its
   * arguments.
   *
   * @func
   * @memberOf R
   * @since v0.9.0
   * @category Function
   * @sig ((*... -> a), *...) -> a
   * @param {Function} fn The function to apply to the remaining arguments.
   * @param {...*} args Any number of positional arguments.
   * @return {*}
   * @see R.apply
   * @example
   *
   *      R.call(R.add, 1, 2); //=> 3
   *
   *      const indentN = R.pipe(
   *        R.repeat(' '),
   *        R.join(''),
   *        R.replace(/^(?!$)/gm)
   *      );
   *
   *      const format = R.converge(
   *        R.call,
   *        [
   *          R.pipe(R.prop('indent'), indentN),
   *          R.prop('value')
   *        ]
   *      );
   *
   *      format({indent: 2, value: 'foo\nbar\nbaz\n'}); //=> '  foo\n  bar\n  baz\n'
   * @symb R.call(f, a, b) = f(a, b)
   */

  var call = _curry1(function call(fn) {
    return fn.apply(this, Array.prototype.slice.call(arguments, 1));
  });

  /**
   * `_makeFlat` is a helper function that returns a one-level or fully recursive
   * function based on the flag passed in.
   *
   * @private
   */

  function _makeFlat(recursive) {
    return function flatt(list) {
      var value, jlen, j;
      var result = [];
      var idx = 0;
      var ilen = list.length;

      while (idx < ilen) {
        if (_isArrayLike(list[idx])) {
          value = recursive ? flatt(list[idx]) : list[idx];
          j = 0;
          jlen = value.length;

          while (j < jlen) {
            result[result.length] = value[j];
            j += 1;
          }
        } else {
          result[result.length] = list[idx];
        }

        idx += 1;
      }

      return result;
    };
  }

  function _forceReduced(x) {
    return {
      '@@transducer/value': x,
      '@@transducer/reduced': true
    };
  }

  var preservingReduced = function preservingReduced(xf) {
    return {
      '@@transducer/init': _xfBase.init,
      '@@transducer/result': function transducerResult(result) {
        return xf['@@transducer/result'](result);
      },
      '@@transducer/step': function transducerStep(result, input) {
        var ret = xf['@@transducer/step'](result, input);
        return ret['@@transducer/reduced'] ? _forceReduced(ret) : ret;
      }
    };
  };

  var _flatCat = function _xcat(xf) {
    var rxf = preservingReduced(xf);
    return {
      '@@transducer/init': _xfBase.init,
      '@@transducer/result': function transducerResult(result) {
        return rxf['@@transducer/result'](result);
      },
      '@@transducer/step': function transducerStep(result, input) {
        return !_isArrayLike(input) ? _reduce(rxf, result, [input]) : _reduce(rxf, result, input);
      }
    };
  };

  var _xchain = _curry2(function _xchain(f, xf) {
    return map(f, _flatCat(xf));
  });

  /**
   * `chain` maps a function over a list and concatenates the results. `chain`
   * is also known as `flatMap` in some libraries.
   *
   * Dispatches to the `chain` method of the second argument, if present,
   * according to the [FantasyLand Chain spec](https://github.com/fantasyland/fantasy-land#chain).
   *
   * If second argument is a function, `chain(f, g)(x)` is equivalent to `f(g(x), x)`.
   *
   * Acts as a transducer if a transformer is given in list position.
   *
   * @func
   * @memberOf R
   * @since v0.3.0
   * @category List
   * @sig Chain m => (a -> m b) -> m a -> m b
   * @param {Function} fn The function to map with
   * @param {Array} list The list to map over
   * @return {Array} The result of flat-mapping `list` with `fn`
   * @example
   *
   *      const duplicate = n => [n, n];
   *      R.chain(duplicate, [1, 2, 3]); //=> [1, 1, 2, 2, 3, 3]
   *
   *      R.chain(R.append, R.head)([1, 2, 3]); //=> [1, 2, 3, 1]
   */

  var chain = _curry2(_dispatchable(['fantasy-land/chain', 'chain'], _xchain, function chain(fn, monad) {
    if (typeof monad === 'function') {
      return function (x) {
        return fn(monad(x))(x);
      };
    }

    return _makeFlat(false)(map(fn, monad));
  }));

  /**
   * Restricts a number to be within a range.
   *
   * Also works for other ordered types such as Strings and Dates.
   *
   * @func
   * @memberOf R
   * @since v0.20.0
   * @category Relation
   * @sig Ord a => a -> a -> a -> a
   * @param {Number} minimum The lower limit of the clamp (inclusive)
   * @param {Number} maximum The upper limit of the clamp (inclusive)
   * @param {Number} value Value to be clamped
   * @return {Number} Returns `minimum` when `val < minimum`, `maximum` when `val > maximum`, returns `val` otherwise
   * @example
   *
   *      R.clamp(1, 10, -5) // => 1
   *      R.clamp(1, 10, 15) // => 10
   *      R.clamp(1, 10, 4)  // => 4
   */

  var clamp = _curry3(function clamp(min, max, value) {
    if (min > max) {
      throw new Error('min must not be greater than max in clamp(min, max, value)');
    }

    return value < min ? min : value > max ? max : value;
  });

  function _cloneRegExp(pattern) {
    return new RegExp(pattern.source, (pattern.global ? 'g' : '') + (pattern.ignoreCase ? 'i' : '') + (pattern.multiline ? 'm' : '') + (pattern.sticky ? 'y' : '') + (pattern.unicode ? 'u' : ''));
  }

  /**
   * Gives a single-word string description of the (native) type of a value,
   * returning such answers as 'Object', 'Number', 'Array', or 'Null'. Does not
   * attempt to distinguish user Object types any further, reporting them all as
   * 'Object'.
   *
   * @func
   * @memberOf R
   * @since v0.8.0
   * @category Type
   * @sig (* -> {*}) -> String
   * @param {*} val The value to test
   * @return {String}
   * @example
   *
   *      R.type({}); //=> "Object"
   *      R.type(1); //=> "Number"
   *      R.type(false); //=> "Boolean"
   *      R.type('s'); //=> "String"
   *      R.type(null); //=> "Null"
   *      R.type([]); //=> "Array"
   *      R.type(/[A-z]/); //=> "RegExp"
   *      R.type(() => {}); //=> "Function"
   *      R.type(undefined); //=> "Undefined"
   */

  var type = _curry1(function type(val) {
    return val === null ? 'Null' : val === undefined ? 'Undefined' : Object.prototype.toString.call(val).slice(8, -1);
  });

  /**
   * Copies an object.
   *
   * @private
   * @param {*} value The value to be copied
   * @param {Array} refFrom Array containing the source references
   * @param {Array} refTo Array containing the copied source references
   * @param {Boolean} deep Whether or not to perform deep cloning.
   * @return {*} The copied value.
   */

  function _clone(value, refFrom, refTo, deep) {
    var copy = function copy(copiedValue) {
      var len = refFrom.length;
      var idx = 0;

      while (idx < len) {
        if (value === refFrom[idx]) {
          return refTo[idx];
        }

        idx += 1;
      }

      refFrom[idx] = value;
      refTo[idx] = copiedValue;

      for (var key in value) {
        if (value.hasOwnProperty(key)) {
          copiedValue[key] = deep ? _clone(value[key], refFrom, refTo, true) : value[key];
        }
      }

      return copiedValue;
    };

    switch (type(value)) {
      case 'Object':
        return copy(Object.create(Object.getPrototypeOf(value)));

      case 'Array':
        return copy([]);

      case 'Date':
        return new Date(value.valueOf());

      case 'RegExp':
        return _cloneRegExp(value);

      case 'Int8Array':
      case 'Uint8Array':
      case 'Uint8ClampedArray':
      case 'Int16Array':
      case 'Uint16Array':
      case 'Int32Array':
      case 'Uint32Array':
      case 'Float32Array':
      case 'Float64Array':
      case 'BigInt64Array':
      case 'BigUint64Array':
        return value.slice();

      default:
        return value;
    }
  }

  /**
   * Creates a deep copy of the source that can be used in place of the source
   * object without retaining any references to it.
   * The source object may contain (nested) `Array`s and `Object`s,
   * `Number`s, `String`s, `Boolean`s and `Date`s.
   * `Function`s are assigned by reference rather than copied.
   *
   * Dispatches to a `clone` method if present.
   *
   * Note that if the source object has multiple nodes that share a reference,
   * the returned object will have the same structure, but the references will
   * be pointed to the location within the cloned value.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Object
   * @sig {*} -> {*}
   * @param {*} value The object or array to clone
   * @return {*} A deeply cloned copy of `val`
   * @example
   *
   *      const objects = [{}, {}, {}];
   *      const objectsClone = R.clone(objects);
   *      objects === objectsClone; //=> false
   *      objects[0] === objectsClone[0]; //=> false
   */

  var clone = _curry1(function clone(value) {
    return value != null && typeof value.clone === 'function' ? value.clone() : _clone(value, [], [], true);
  });

  /**
   * Splits a list into sub-lists, based on the result of calling a key-returning function on each element,
   * and grouping the results according to values returned.
   *
   * @func
   * @memberOf R
   * @since v0.28.0
   * @category List
   * @typedefn Idx = String | Int | Symbol
   * @sig Idx a => (b -> a) -> [b] -> [[b]]
   * @param {Function} fn Function :: a -> Idx
   * @param {Array} list The array to group
   * @return {Array}
   *    An array of arrays where each sub-array contains items for which
   *    the String-returning function has returned the same value.
   * @see R.groupBy, R.partition
   * @example
   *      R.collectBy(R.prop('type'), [
   *        {type: 'breakfast', item: '☕️'},
   *        {type: 'lunch', item: '🌯'},
   *        {type: 'dinner', item: '🍝'},
   *        {type: 'breakfast', item: '🥐'},
   *        {type: 'lunch', item: '🍕'}
   *      ]);
   *
   *      // [ [ {type: 'breakfast', item: '☕️'},
   *      //     {type: 'breakfast', item: '🥐'} ],
   *      //   [ {type: 'lunch', item: '🌯'},
   *      //     {type: 'lunch', item: '🍕'} ],
   *      //   [ {type: 'dinner', item: '🍝'} ] ]
   */

  var collectBy = _curry2(function collectBy(fn, list) {
    var group = _reduce(function (o, x) {
      var tag = fn(x);

      if (o[tag] === undefined) {
        o[tag] = [];
      }

      o[tag].push(x);
      return o;
    }, {}, list);

    var newList = [];

    for (var tag in group) {
      newList.push(group[tag]);
    }

    return newList;
  });

  /**
   * Makes a comparator function out of a function that reports whether the first
   * element is less than the second.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Function
   * @sig ((a, b) -> Boolean) -> ((a, b) -> Number)
   * @param {Function} pred A predicate function of arity two which will return `true` if the first argument
   * is less than the second, `false` otherwise
   * @return {Function} A Function :: a -> b -> Int that returns `-1` if a < b, `1` if b < a, otherwise `0`
   * @example
   *
   *      const byAge = R.comparator((a, b) => a.age < b.age);
   *      const people = [
   *        { name: 'Emma', age: 70 },
   *        { name: 'Peter', age: 78 },
   *        { name: 'Mikhail', age: 62 },
   *      ];
   *      const peopleByIncreasingAge = R.sort(byAge, people);
   *        //=> [{ name: 'Mikhail', age: 62 },{ name: 'Emma', age: 70 }, { name: 'Peter', age: 78 }]
   */

  var comparator = _curry1(function comparator(pred) {
    return function (a, b) {
      return pred(a, b) ? -1 : pred(b, a) ? 1 : 0;
    };
  });

  /**
   * A function that returns the `!` of its argument. It will return `true` when
   * passed false-y value, and `false` when passed a truth-y one.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Logic
   * @sig * -> Boolean
   * @param {*} a any value
   * @return {Boolean} the logical inverse of passed argument.
   * @see R.complement
   * @example
   *
   *      R.not(true); //=> false
   *      R.not(false); //=> true
   *      R.not(0); //=> true
   *      R.not(1); //=> false
   */

  var not = _curry1(function not(a) {
    return !a;
  });

  /**
   * Takes a function `f` and returns a function `g` such that if called with the same arguments
   * when `f` returns a "truthy" value, `g` returns `false` and when `f` returns a "falsy" value `g` returns `true`.
   *
   * `R.complement` may be applied to any functor
   *
   * @func
   * @memberOf R
   * @since v0.12.0
   * @category Logic
   * @sig (*... -> *) -> (*... -> Boolean)
   * @param {Function} f
   * @return {Function}
   * @see R.not
   * @example
   *
   *      const isNotNil = R.complement(R.isNil);
   *      R.isNil(null); //=> true
   *      isNotNil(null); //=> false
   *      R.isNil(7); //=> false
   *      isNotNil(7); //=> true
   */

  var complement = lift(not);

  function _pipe(f, g) {
    return function () {
      return g.call(this, f.apply(this, arguments));
    };
  }

  /**
   * This checks whether a function has a [methodname] function. If it isn't an
   * array it will execute that function otherwise it will default to the ramda
   * implementation.
   *
   * @private
   * @param {Function} fn ramda implementation
   * @param {String} methodname property to check for a custom implementation
   * @return {Object} Whatever the return value of the method is.
   */

  function _checkForMethod(methodname, fn) {
    return function () {
      var length = arguments.length;

      if (length === 0) {
        return fn();
      }

      var obj = arguments[length - 1];
      return _isArray(obj) || typeof obj[methodname] !== 'function' ? fn.apply(this, arguments) : obj[methodname].apply(obj, Array.prototype.slice.call(arguments, 0, length - 1));
    };
  }

  /**
   * Returns the elements of the given list or string (or object with a `slice`
   * method) from `fromIndex` (inclusive) to `toIndex` (exclusive).
   *
   * Dispatches to the `slice` method of the third argument, if present.
   *
   * @func
   * @memberOf R
   * @since v0.1.4
   * @category List
   * @sig Number -> Number -> [a] -> [a]
   * @sig Number -> Number -> String -> String
   * @param {Number} fromIndex The start index (inclusive).
   * @param {Number} toIndex The end index (exclusive).
   * @param {*} list
   * @return {*}
   * @example
   *
   *      R.slice(1, 3, ['a', 'b', 'c', 'd']);        //=> ['b', 'c']
   *      R.slice(1, Infinity, ['a', 'b', 'c', 'd']); //=> ['b', 'c', 'd']
   *      R.slice(0, -1, ['a', 'b', 'c', 'd']);       //=> ['a', 'b', 'c']
   *      R.slice(-3, -1, ['a', 'b', 'c', 'd']);      //=> ['b', 'c']
   *      R.slice(0, 3, 'ramda');                     //=> 'ram'
   */

  var slice = _curry3(_checkForMethod('slice', function slice(fromIndex, toIndex, list) {
    return Array.prototype.slice.call(list, fromIndex, toIndex);
  }));

  /**
   * Returns all but the first element of the given list or string (or object
   * with a `tail` method).
   *
   * Dispatches to the `slice` method of the first argument, if present.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig [a] -> [a]
   * @sig String -> String
   * @param {*} list
   * @return {*}
   * @see R.head, R.init, R.last
   * @example
   *
   *      R.tail([1, 2, 3]);  //=> [2, 3]
   *      R.tail([1, 2]);     //=> [2]
   *      R.tail([1]);        //=> []
   *      R.tail([]);         //=> []
   *
   *      R.tail('abc');  //=> 'bc'
   *      R.tail('ab');   //=> 'b'
   *      R.tail('a');    //=> ''
   *      R.tail('');     //=> ''
   */

  var tail = _curry1(_checkForMethod('tail', slice(1, Infinity)));

  /**
   * Performs left-to-right function composition. The first argument may have
   * any arity; the remaining arguments must be unary.
   *
   * In some libraries this function is named `sequence`.
   *
   * **Note:** The result of pipe is not automatically curried.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Function
   * @sig (((a, b, ..., n) -> o), (o -> p), ..., (x -> y), (y -> z)) -> ((a, b, ..., n) -> z)
   * @param {...Function} functions
   * @return {Function}
   * @see R.compose
   * @example
   *
   *      const f = R.pipe(Math.pow, R.negate, R.inc);
   *
   *      f(3, 4); // -(3^4) + 1
   * @symb R.pipe(f, g, h)(a, b) = h(g(f(a, b)))
   * @symb R.pipe(f, g, h)(a)(b) = h(g(f(a)))(b)
   */

  function pipe() {
    if (arguments.length === 0) {
      throw new Error('pipe requires at least one argument');
    }

    return _arity(arguments[0].length, reduce(_pipe, arguments[0], tail(arguments)));
  }

  /**
   * Returns a new list or string with the elements or characters in reverse
   * order.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig [a] -> [a]
   * @sig String -> String
   * @param {Array|String} list
   * @return {Array|String}
   * @example
   *
   *      R.reverse([1, 2, 3]);  //=> [3, 2, 1]
   *      R.reverse([1, 2]);     //=> [2, 1]
   *      R.reverse([1]);        //=> [1]
   *      R.reverse([]);         //=> []
   *
   *      R.reverse('abc');      //=> 'cba'
   *      R.reverse('ab');       //=> 'ba'
   *      R.reverse('a');        //=> 'a'
   *      R.reverse('');         //=> ''
   */

  var reverse = _curry1(function reverse(list) {
    return _isString(list) ? list.split('').reverse().join('') : Array.prototype.slice.call(list, 0).reverse();
  });

  /**
   * Performs right-to-left function composition. The last argument may have
   * any arity; the remaining arguments must be unary.
   *
   * **Note:** The result of compose is not automatically curried.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Function
   * @sig ((y -> z), (x -> y), ..., (o -> p), ((a, b, ..., n) -> o)) -> ((a, b, ..., n) -> z)
   * @param {...Function} ...functions The functions to compose
   * @return {Function}
   * @see R.pipe
   * @example
   *
   *      const classyGreeting = (firstName, lastName) => "The name's " + lastName + ", " + firstName + " " + lastName
   *      const yellGreeting = R.compose(R.toUpper, classyGreeting);
   *      yellGreeting('James', 'Bond'); //=> "THE NAME'S BOND, JAMES BOND"
   *
   *      R.compose(Math.abs, R.add(1), R.multiply(2))(-4) //=> 7
   *
   * @symb R.compose(f, g, h)(a, b) = f(g(h(a, b)))
   * @symb R.compose(f, g, h)(a)(b) = f(g(h(a)))(b)
   */

  function compose() {
    if (arguments.length === 0) {
      throw new Error('compose requires at least one argument');
    }

    return pipe.apply(this, reverse(arguments));
  }

  /**
   * Returns the first element of the given list or string. In some libraries
   * this function is named `first`.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig [a] -> a | Undefined
   * @sig String -> String
   * @param {Array|String} list
   * @return {*}
   * @see R.tail, R.init, R.last
   * @example
   *
   *      R.head(['fi', 'fo', 'fum']); //=> 'fi'
   *      R.head([]); //=> undefined
   *
   *      R.head('abc'); //=> 'a'
   *      R.head(''); //=> ''
   */

  var head = nth(0);

  function _identity(x) {
    return x;
  }

  /**
   * A function that does nothing but return the parameter supplied to it. Good
   * as a default or placeholder function.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Function
   * @sig a -> a
   * @param {*} x The value to return.
   * @return {*} The input value, `x`.
   * @example
   *
   *      R.identity(1); //=> 1
   *
   *      const obj = {};
   *      R.identity(obj) === obj; //=> true
   * @symb R.identity(a) = a
   */

  var identity = _curry1(_identity);

  /**
   * Performs left-to-right function composition using transforming function. The first function may have
   * any arity; the remaining functions must be unary.
   *
   * **Note:** The result of pipeWith is not automatically curried. Transforming function is not used on the
   * first argument.
   *
   * @func
   * @memberOf R
   * @since v0.26.0
   * @category Function
   * @sig ((* -> *), [((a, b, ..., n) -> o), (o -> p), ..., (x -> y), (y -> z)]) -> ((a, b, ..., n) -> z)
   * @param {Function} transformer The transforming function
   * @param {Array} functions The functions to pipe
   * @return {Function}
   * @see R.composeWith, R.pipe
   * @example
   *
   *      const pipeWhileNotNil = R.pipeWith((f, res) => R.isNil(res) ? res : f(res));
   *      const f = pipeWhileNotNil([Math.pow, R.negate, R.inc])
   *
   *      f(3, 4); // -(3^4) + 1
   * @symb R.pipeWith(f)([g, h, i])(...args) = f(i, f(h, g(...args)))
   */

  var pipeWith = _curry2(function pipeWith(xf, list) {
    if (list.length <= 0) {
      return identity;
    }

    var headList = head(list);
    var tailList = tail(list);
    return _arity(headList.length, function () {
      return _reduce(function (result, f) {
        return xf.call(this, f, result);
      }, headList.apply(this, arguments), tailList);
    });
  });

  /**
   * Performs right-to-left function composition using transforming function. The last function may have
   * any arity; the remaining functions must be unary.
   *
   * **Note:** The result of composeWith is not automatically curried. Transforming function is not used
   * on the last argument.
   *
   * @func
   * @memberOf R
   * @since v0.26.0
   * @category Function
   * @sig ((* -> *), [(y -> z), (x -> y), ..., (o -> p), ((a, b, ..., n) -> o)]) -> ((a, b, ..., n) -> z)
   * @param {Function} transformer The transforming function
   * @param {Array} functions The functions to compose
   * @return {Function}
   * @see R.compose, R.pipeWith
   * @example
   *
   *      const composeWhileNotNil = R.composeWith((f, res) => R.isNil(res) ? res : f(res));
   *
   *      composeWhileNotNil([R.inc, R.prop('age')])({age: 1}) //=> 2
   *      composeWhileNotNil([R.inc, R.prop('age')])({}) //=> undefined
   *
   * @symb R.composeWith(f)([g, h, i])(...args) = f(g, f(h, i(...args)))
   */

  var composeWith = _curry2(function composeWith(xf, list) {
    return pipeWith.apply(this, [xf, reverse(list)]);
  });

  function _arrayFromIterator(iter) {
    var list = [];
    var next;

    while (!(next = iter.next()).done) {
      list.push(next.value);
    }

    return list;
  }

  function _includesWith(pred, x, list) {
    var idx = 0;
    var len = list.length;

    while (idx < len) {
      if (pred(x, list[idx])) {
        return true;
      }

      idx += 1;
    }

    return false;
  }

  function _functionName(f) {
    // String(x => x) evaluates to "x => x", so the pattern may not match.
    var match = String(f).match(/^function (\w*)/);
    return match == null ? '' : match[1];
  }

  // Based on https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
  function _objectIs(a, b) {
    // SameValue algorithm
    if (a === b) {
      // Steps 1-5, 7-10
      // Steps 6.b-6.e: +0 != -0
      return a !== 0 || 1 / a === 1 / b;
    } else {
      // Step 6.a: NaN == NaN
      return a !== a && b !== b;
    }
  }

  var _objectIs$1 = typeof Object.is === 'function' ? Object.is : _objectIs;

  /**
   * private _uniqContentEquals function.
   * That function is checking equality of 2 iterator contents with 2 assumptions
   * - iterators lengths are the same
   * - iterators values are unique
   *
   * false-positive result will be returned for comparison of, e.g.
   * - [1,2,3] and [1,2,3,4]
   * - [1,1,1] and [1,2,3]
   * */

  function _uniqContentEquals(aIterator, bIterator, stackA, stackB) {
    var a = _arrayFromIterator(aIterator);

    var b = _arrayFromIterator(bIterator);

    function eq(_a, _b) {
      return _equals(_a, _b, stackA.slice(), stackB.slice());
    } // if *a* array contains any element that is not included in *b*


    return !_includesWith(function (b, aItem) {
      return !_includesWith(eq, aItem, b);
    }, b, a);
  }

  function _equals(a, b, stackA, stackB) {
    if (_objectIs$1(a, b)) {
      return true;
    }

    var typeA = type(a);

    if (typeA !== type(b)) {
      return false;
    }

    if (typeof a['fantasy-land/equals'] === 'function' || typeof b['fantasy-land/equals'] === 'function') {
      return typeof a['fantasy-land/equals'] === 'function' && a['fantasy-land/equals'](b) && typeof b['fantasy-land/equals'] === 'function' && b['fantasy-land/equals'](a);
    }

    if (typeof a.equals === 'function' || typeof b.equals === 'function') {
      return typeof a.equals === 'function' && a.equals(b) && typeof b.equals === 'function' && b.equals(a);
    }

    switch (typeA) {
      case 'Arguments':
      case 'Array':
      case 'Object':
        if (typeof a.constructor === 'function' && _functionName(a.constructor) === 'Promise') {
          return a === b;
        }

        break;

      case 'Boolean':
      case 'Number':
      case 'String':
        if (!(_typeof(a) === _typeof(b) && _objectIs$1(a.valueOf(), b.valueOf()))) {
          return false;
        }

        break;

      case 'Date':
        if (!_objectIs$1(a.valueOf(), b.valueOf())) {
          return false;
        }

        break;

      case 'Error':
        return a.name === b.name && a.message === b.message;

      case 'RegExp':
        if (!(a.source === b.source && a.global === b.global && a.ignoreCase === b.ignoreCase && a.multiline === b.multiline && a.sticky === b.sticky && a.unicode === b.unicode)) {
          return false;
        }

        break;
    }

    var idx = stackA.length - 1;

    while (idx >= 0) {
      if (stackA[idx] === a) {
        return stackB[idx] === b;
      }

      idx -= 1;
    }

    switch (typeA) {
      case 'Map':
        if (a.size !== b.size) {
          return false;
        }

        return _uniqContentEquals(a.entries(), b.entries(), stackA.concat([a]), stackB.concat([b]));

      case 'Set':
        if (a.size !== b.size) {
          return false;
        }

        return _uniqContentEquals(a.values(), b.values(), stackA.concat([a]), stackB.concat([b]));

      case 'Arguments':
      case 'Array':
      case 'Object':
      case 'Boolean':
      case 'Number':
      case 'String':
      case 'Date':
      case 'Error':
      case 'RegExp':
      case 'Int8Array':
      case 'Uint8Array':
      case 'Uint8ClampedArray':
      case 'Int16Array':
      case 'Uint16Array':
      case 'Int32Array':
      case 'Uint32Array':
      case 'Float32Array':
      case 'Float64Array':
      case 'ArrayBuffer':
        break;

      default:
        // Values of other types are only equal if identical.
        return false;
    }

    var keysA = keys(a);

    if (keysA.length !== keys(b).length) {
      return false;
    }

    var extendedStackA = stackA.concat([a]);
    var extendedStackB = stackB.concat([b]);
    idx = keysA.length - 1;

    while (idx >= 0) {
      var key = keysA[idx];

      if (!(_has(key, b) && _equals(b[key], a[key], extendedStackA, extendedStackB))) {
        return false;
      }

      idx -= 1;
    }

    return true;
  }

  /**
   * Returns `true` if its arguments are equivalent, `false` otherwise. Handles
   * cyclical data structures.
   *
   * Dispatches symmetrically to the `equals` methods of both arguments, if
   * present.
   *
   * @func
   * @memberOf R
   * @since v0.15.0
   * @category Relation
   * @sig a -> b -> Boolean
   * @param {*} a
   * @param {*} b
   * @return {Boolean}
   * @example
   *
   *      R.equals(1, 1); //=> true
   *      R.equals(1, '1'); //=> false
   *      R.equals([1, 2, 3], [1, 2, 3]); //=> true
   *
   *      const a = {}; a.v = a;
   *      const b = {}; b.v = b;
   *      R.equals(a, b); //=> true
   */

  var equals = _curry2(function equals(a, b) {
    return _equals(a, b, [], []);
  });

  function _indexOf(list, a, idx) {
    var inf, item; // Array.prototype.indexOf doesn't exist below IE9

    if (typeof list.indexOf === 'function') {
      switch (_typeof(a)) {
        case 'number':
          if (a === 0) {
            // manually crawl the list to distinguish between +0 and -0
            inf = 1 / a;

            while (idx < list.length) {
              item = list[idx];

              if (item === 0 && 1 / item === inf) {
                return idx;
              }

              idx += 1;
            }

            return -1;
          } else if (a !== a) {
            // NaN
            while (idx < list.length) {
              item = list[idx];

              if (typeof item === 'number' && item !== item) {
                return idx;
              }

              idx += 1;
            }

            return -1;
          } // non-zero numbers can utilise Set


          return list.indexOf(a, idx);
        // all these types can utilise Set

        case 'string':
        case 'boolean':
        case 'function':
        case 'undefined':
          return list.indexOf(a, idx);

        case 'object':
          if (a === null) {
            // null can utilise Set
            return list.indexOf(a, idx);
          }

      }
    } // anything else not covered above, defer to R.equals


    while (idx < list.length) {
      if (equals(list[idx], a)) {
        return idx;
      }

      idx += 1;
    }

    return -1;
  }

  function _includes(a, list) {
    return _indexOf(list, a, 0) >= 0;
  }

  function _quote(s) {
    var escaped = s.replace(/\\/g, '\\\\').replace(/[\b]/g, '\\b') // \b matches word boundary; [\b] matches backspace
    .replace(/\f/g, '\\f').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\t/g, '\\t').replace(/\v/g, '\\v').replace(/\0/g, '\\0');
    return '"' + escaped.replace(/"/g, '\\"') + '"';
  }

  /**
   * Polyfill from <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString>.
   */
  var pad = function pad(n) {
    return (n < 10 ? '0' : '') + n;
  };

  var _toISOString = typeof Date.prototype.toISOString === 'function' ? function _toISOString(d) {
    return d.toISOString();
  } : function _toISOString(d) {
    return d.getUTCFullYear() + '-' + pad(d.getUTCMonth() + 1) + '-' + pad(d.getUTCDate()) + 'T' + pad(d.getUTCHours()) + ':' + pad(d.getUTCMinutes()) + ':' + pad(d.getUTCSeconds()) + '.' + (d.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) + 'Z';
  };

  function _complement(f) {
    return function () {
      return !f.apply(this, arguments);
    };
  }

  function _filter(fn, list) {
    var idx = 0;
    var len = list.length;
    var result = [];

    while (idx < len) {
      if (fn(list[idx])) {
        result[result.length] = list[idx];
      }

      idx += 1;
    }

    return result;
  }

  function _isObject(x) {
    return Object.prototype.toString.call(x) === '[object Object]';
  }

  function XFilter(f, xf) {
    this.xf = xf;
    this.f = f;
  }

  XFilter.prototype['@@transducer/init'] = _xfBase.init;
  XFilter.prototype['@@transducer/result'] = _xfBase.result;

  XFilter.prototype['@@transducer/step'] = function (result, input) {
    return this.f(input) ? this.xf['@@transducer/step'](result, input) : result;
  };

  var _xfilter = _curry2(function _xfilter(f, xf) {
    return new XFilter(f, xf);
  });

  /**
   * Takes a predicate and a `Filterable`, and returns a new filterable of the
   * same type containing the members of the given filterable which satisfy the
   * given predicate. Filterable objects include plain objects or any object
   * that has a filter method such as `Array`.
   *
   * Dispatches to the `filter` method of the second argument, if present.
   *
   * Acts as a transducer if a transformer is given in list position.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig Filterable f => (a -> Boolean) -> f a -> f a
   * @param {Function} pred
   * @param {Array} filterable
   * @return {Array} Filterable
   * @see R.reject, R.transduce, R.addIndex
   * @example
   *
   *      const isEven = n => n % 2 === 0;
   *
   *      R.filter(isEven, [1, 2, 3, 4]); //=> [2, 4]
   *
   *      R.filter(isEven, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4}
   */

  var filter = _curry2(_dispatchable(['fantasy-land/filter', 'filter'], _xfilter, function (pred, filterable) {
    return _isObject(filterable) ? _reduce(function (acc, key) {
      if (pred(filterable[key])) {
        acc[key] = filterable[key];
      }

      return acc;
    }, {}, keys(filterable)) : // else
    _filter(pred, filterable);
  }));

  /**
   * The complement of [`filter`](#filter).
   *
   * Acts as a transducer if a transformer is given in list position. Filterable
   * objects include plain objects or any object that has a filter method such
   * as `Array`.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig Filterable f => (a -> Boolean) -> f a -> f a
   * @param {Function} pred
   * @param {Array} filterable
   * @return {Array}
   * @see R.filter, R.transduce, R.addIndex
   * @example
   *
   *      const isOdd = (n) => n % 2 !== 0;
   *
   *      R.reject(isOdd, [1, 2, 3, 4]); //=> [2, 4]
   *
   *      R.reject(isOdd, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4}
   */

  var reject = _curry2(function reject(pred, filterable) {
    return filter(_complement(pred), filterable);
  });

  function _toString(x, seen) {
    var recur = function recur(y) {
      var xs = seen.concat([x]);
      return _includes(y, xs) ? '<Circular>' : _toString(y, xs);
    }; //  mapPairs :: (Object, [String]) -> [String]


    var mapPairs = function mapPairs(obj, keys) {
      return _map(function (k) {
        return _quote(k) + ': ' + recur(obj[k]);
      }, keys.slice().sort());
    };

    switch (Object.prototype.toString.call(x)) {
      case '[object Arguments]':
        return '(function() { return arguments; }(' + _map(recur, x).join(', ') + '))';

      case '[object Array]':
        return '[' + _map(recur, x).concat(mapPairs(x, reject(function (k) {
          return /^\d+$/.test(k);
        }, keys(x)))).join(', ') + ']';

      case '[object Boolean]':
        return _typeof(x) === 'object' ? 'new Boolean(' + recur(x.valueOf()) + ')' : x.toString();

      case '[object Date]':
        return 'new Date(' + (isNaN(x.valueOf()) ? recur(NaN) : _quote(_toISOString(x))) + ')';

      case '[object Null]':
        return 'null';

      case '[object Number]':
        return _typeof(x) === 'object' ? 'new Number(' + recur(x.valueOf()) + ')' : 1 / x === -Infinity ? '-0' : x.toString(10);

      case '[object String]':
        return _typeof(x) === 'object' ? 'new String(' + recur(x.valueOf()) + ')' : _quote(x);

      case '[object Undefined]':
        return 'undefined';

      default:
        if (typeof x.toString === 'function') {
          var repr = x.toString();

          if (repr !== '[object Object]') {
            return repr;
          }
        }

        return '{' + mapPairs(x, keys(x)).join(', ') + '}';
    }
  }

  /**
   * Returns the string representation of the given value. `eval`'ing the output
   * should result in a value equivalent to the input value. Many of the built-in
   * `toString` methods do not satisfy this requirement.
   *
   * If the given value is an `[object Object]` with a `toString` method other
   * than `Object.prototype.toString`, this method is invoked with no arguments
   * to produce the return value. This means user-defined constructor functions
   * can provide a suitable `toString` method. For example:
   *
   *     function Point(x, y) {
   *       this.x = x;
   *       this.y = y;
   *     }
   *
   *     Point.prototype.toString = function() {
   *       return 'new Point(' + this.x + ', ' + this.y + ')';
   *     };
   *
   *     R.toString(new Point(1, 2)); //=> 'new Point(1, 2)'
   *
   * @func
   * @memberOf R
   * @since v0.14.0
   * @category String
   * @sig * -> String
   * @param {*} val
   * @return {String}
   * @example
   *
   *      R.toString(42); //=> '42'
   *      R.toString('abc'); //=> '"abc"'
   *      R.toString([1, 2, 3]); //=> '[1, 2, 3]'
   *      R.toString({foo: 1, bar: 2, baz: 3}); //=> '{"bar": 2, "baz": 3, "foo": 1}'
   *      R.toString(new Date('2001-02-03T04:05:06Z')); //=> 'new Date("2001-02-03T04:05:06.000Z")'
   */

  var toString$1 = _curry1(function toString(val) {
    return _toString(val, []);
  });

  /**
   * Returns the result of concatenating the given lists or strings.
   *
   * Note: `R.concat` expects both arguments to be of the same type,
   * unlike the native `Array.prototype.concat` method. It will throw
   * an error if you `concat` an Array with a non-Array value.
   *
   * Dispatches to the `concat` method of the first argument, if present.
   * Can also concatenate two members of a [fantasy-land
   * compatible semigroup](https://github.com/fantasyland/fantasy-land#semigroup).
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig [a] -> [a] -> [a]
   * @sig String -> String -> String
   * @param {Array|String} firstList The first list
   * @param {Array|String} secondList The second list
   * @return {Array|String} A list consisting of the elements of `firstList` followed by the elements of
   * `secondList`.
   *
   * @example
   *
   *      R.concat('ABC', 'DEF'); // 'ABCDEF'
   *      R.concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3]
   *      R.concat([], []); //=> []
   */

  var concat = _curry2(function concat(a, b) {
    if (_isArray(a)) {
      if (_isArray(b)) {
        return a.concat(b);
      }

      throw new TypeError(toString$1(b) + ' is not an array');
    }

    if (_isString(a)) {
      if (_isString(b)) {
        return a + b;
      }

      throw new TypeError(toString$1(b) + ' is not a string');
    }

    if (a != null && _isFunction(a['fantasy-land/concat'])) {
      return a['fantasy-land/concat'](b);
    }

    if (a != null && _isFunction(a.concat)) {
      return a.concat(b);
    }

    throw new TypeError(toString$1(a) + ' does not have a method named "concat" or "fantasy-land/concat"');
  });

  /**
   * Returns a function, `fn`, which encapsulates `if/else, if/else, ...` logic.
   * `R.cond` takes a list of [predicate, transformer] pairs. All of the arguments
   * to `fn` are applied to each of the predicates in turn until one returns a
   * "truthy" value, at which point `fn` returns the result of applying its
   * arguments to the corresponding transformer. If none of the predicates
   * matches, `fn` returns undefined.
   *
   * **Please note**: This is not a direct substitute for a `switch` statement.
   * Remember that both elements of every pair passed to `cond` are *functions*,
   * and `cond` returns a function.
   *
   * @func
   * @memberOf R
   * @since v0.6.0
   * @category Logic
   * @sig [[(*... -> Boolean),(*... -> *)]] -> (*... -> *)
   * @param {Array} pairs A list of [predicate, transformer]
   * @return {Function}
   * @see R.ifElse, R.unless, R.when
   * @example
   *
   *      const fn = R.cond([
   *        [R.equals(0),   R.always('water freezes at 0°C')],
   *        [R.equals(100), R.always('water boils at 100°C')],
   *        [R.T,           temp => 'nothing special happens at ' + temp + '°C']
   *      ]);
   *      fn(0); //=> 'water freezes at 0°C'
   *      fn(50); //=> 'nothing special happens at 50°C'
   *      fn(100); //=> 'water boils at 100°C'
   */

  var cond = _curry1(function cond(pairs) {
    var arity = reduce(max, 0, map(function (pair) {
      return pair[0].length;
    }, pairs));
    return _arity(arity, function () {
      var idx = 0;

      while (idx < pairs.length) {
        if (pairs[idx][0].apply(this, arguments)) {
          return pairs[idx][1].apply(this, arguments);
        }

        idx += 1;
      }
    });
  });

  /**
   * Returns a curried equivalent of the provided function. The curried function
   * has two unusual capabilities. First, its arguments needn't be provided one
   * at a time. If `f` is a ternary function and `g` is `R.curry(f)`, the
   * following are equivalent:
   *
   *   - `g(1)(2)(3)`
   *   - `g(1)(2, 3)`
   *   - `g(1, 2)(3)`
   *   - `g(1, 2, 3)`
   *
   * Secondly, the special placeholder value [`R.__`](#__) may be used to specify
   * "gaps", allowing partial application of any combination of arguments,
   * regardless of their positions. If `g` is as above and `_` is [`R.__`](#__),
   * the following are equivalent:
   *
   *   - `g(1, 2, 3)`
   *   - `g(_, 2, 3)(1)`
   *   - `g(_, _, 3)(1)(2)`
   *   - `g(_, _, 3)(1, 2)`
   *   - `g(_, 2)(1)(3)`
   *   - `g(_, 2)(1, 3)`
   *   - `g(_, 2)(_, 3)(1)`
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Function
   * @sig (* -> a) -> (* -> a)
   * @param {Function} fn The function to curry.
   * @return {Function} A new, curried function.
   * @see R.curryN, R.partial
   * @example
   *
   *      const addFourNumbers = (a, b, c, d) => a + b + c + d;
   *
   *      const curriedAddFourNumbers = R.curry(addFourNumbers);
   *      const f = curriedAddFourNumbers(1, 2);
   *      const g = f(3);
   *      g(4); //=> 10
   */

  var curry = _curry1(function curry(fn) {
    return curryN(fn.length, fn);
  });

  /**
   * Wraps a constructor function inside a curried function that can be called
   * with the same arguments and returns the same type. The arity of the function
   * returned is specified to allow using variadic constructor functions.
   *
   * @func
   * @memberOf R
   * @since v0.4.0
   * @category Function
   * @sig Number -> (* -> {*}) -> (* -> {*})
   * @param {Number} n The arity of the constructor function.
   * @param {Function} Fn The constructor function to wrap.
   * @return {Function} A wrapped, curried constructor function.
   * @example
   *
   *      // Variadic Constructor function
   *      function Salad() {
   *        this.ingredients = arguments;
   *      }
   *
   *      Salad.prototype.recipe = function() {
   *        const instructions = R.map(ingredient => 'Add a dollop of ' + ingredient, this.ingredients);
   *        return R.join('\n', instructions);
   *      };
   *
   *      const ThreeLayerSalad = R.constructN(3, Salad);
   *
   *      // Notice we no longer need the 'new' keyword, and the constructor is curried for 3 arguments.
   *      const salad = ThreeLayerSalad('Mayonnaise')('Potato Chips')('Ketchup');
   *
   *      console.log(salad.recipe());
   *      // Add a dollop of Mayonnaise
   *      // Add a dollop of Potato Chips
   *      // Add a dollop of Ketchup
   */

  var constructN = _curry2(function constructN(n, Fn) {
    if (n > 10) {
      throw new Error('Constructor with greater than ten arguments');
    }

    if (n === 0) {
      return function () {
        return new Fn();
      };
    }

    return curry(nAry(n, function ($0, $1, $2, $3, $4, $5, $6, $7, $8, $9) {
      switch (arguments.length) {
        case 1:
          return new Fn($0);

        case 2:
          return new Fn($0, $1);

        case 3:
          return new Fn($0, $1, $2);

        case 4:
          return new Fn($0, $1, $2, $3);

        case 5:
          return new Fn($0, $1, $2, $3, $4);

        case 6:
          return new Fn($0, $1, $2, $3, $4, $5);

        case 7:
          return new Fn($0, $1, $2, $3, $4, $5, $6);

        case 8:
          return new Fn($0, $1, $2, $3, $4, $5, $6, $7);

        case 9:
          return new Fn($0, $1, $2, $3, $4, $5, $6, $7, $8);

        case 10:
          return new Fn($0, $1, $2, $3, $4, $5, $6, $7, $8, $9);
      }
    }));
  });

  /**
   * Wraps a constructor function inside a curried function that can be called
   * with the same arguments and returns the same type.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Function
   * @sig (* -> {*}) -> (* -> {*})
   * @param {Function} fn The constructor function to wrap.
   * @return {Function} A wrapped, curried constructor function.
   * @see R.invoker
   * @example
   *
   *      // Constructor function
   *      function Animal(kind) {
   *        this.kind = kind;
   *      };
   *      Animal.prototype.sighting = function() {
   *        return "It's a " + this.kind + "!";
   *      }
   *
   *      const AnimalConstructor = R.construct(Animal)
   *
   *      // Notice we no longer need the 'new' keyword:
   *      AnimalConstructor('Pig'); //=> {"kind": "Pig", "sighting": function (){...}};
   *
   *      const animalTypes = ["Lion", "Tiger", "Bear"];
   *      const animalSighting = R.invoker(0, 'sighting');
   *      const sightNewAnimal = R.compose(animalSighting, AnimalConstructor);
   *      R.map(sightNewAnimal, animalTypes); //=> ["It's a Lion!", "It's a Tiger!", "It's a Bear!"]
   */

  var construct = _curry1(function construct(Fn) {
    return constructN(Fn.length, Fn);
  });

  /**
   * Accepts a converging function and a list of branching functions and returns
   * a new function. The arity of the new function is the same as the arity of
   * the longest branching function. When invoked, this new function is applied
   * to some arguments, and each branching function is applied to those same
   * arguments. The results of each branching function are passed as arguments
   * to the converging function to produce the return value.
   *
   * @func
   * @memberOf R
   * @since v0.4.2
   * @category Function
   * @sig ((x1, x2, ...) -> z) -> [((a, b, ...) -> x1), ((a, b, ...) -> x2), ...] -> (a -> b -> ... -> z)
   * @param {Function} after A function. `after` will be invoked with the return values of
   *        `fn1` and `fn2` as its arguments.
   * @param {Array} functions A list of functions.
   * @return {Function} A new function.
   * @see R.useWith
   * @example
   *
   *      const average = R.converge(R.divide, [R.sum, R.length])
   *      average([1, 2, 3, 4, 5, 6, 7]) //=> 4
   *
   *      const strangeConcat = R.converge(R.concat, [R.toUpper, R.toLower])
   *      strangeConcat("Yodel") //=> "YODELyodel"
   *
   * @symb R.converge(f, [g, h])(a, b) = f(g(a, b), h(a, b))
   */

  var converge = _curry2(function converge(after, fns) {
    return curryN(reduce(max, 0, pluck('length', fns)), function () {
      var args = arguments;
      var context = this;
      return after.apply(context, _map(function (fn) {
        return fn.apply(context, args);
      }, fns));
    });
  });

  /**
   * Returns the number of items in a given `list` matching the predicate `f`
   *
   * @func
   * @memberOf R
   * @since v0.28.0
   * @category List
   * @sig (a -> Boolean) -> [a] -> Number
   * @param {Function} predicate to match items against
   * @return {Array} list of items to count in
   * @example
   *
   *      const even = x => x % 2 == 0;
   *
   *      R.count(even, [1, 2, 3, 4, 5]); // => 2
   *      R.map(R.count(even), [[1, 1, 1], [2, 3, 4, 5], [6]]); // => [0, 2, 1]
   */

  var count = curry(function (pred, list) {
    return _reduce(function (a, e) {
      return pred(e) ? a + 1 : a;
    }, 0, list);
  });

  function XReduceBy(valueFn, valueAcc, keyFn, xf) {
    this.valueFn = valueFn;
    this.valueAcc = valueAcc;
    this.keyFn = keyFn;
    this.xf = xf;
    this.inputs = {};
  }

  XReduceBy.prototype['@@transducer/init'] = _xfBase.init;

  XReduceBy.prototype['@@transducer/result'] = function (result) {
    var key;

    for (key in this.inputs) {
      if (_has(key, this.inputs)) {
        result = this.xf['@@transducer/step'](result, this.inputs[key]);

        if (result['@@transducer/reduced']) {
          result = result['@@transducer/value'];
          break;
        }
      }
    }

    this.inputs = null;
    return this.xf['@@transducer/result'](result);
  };

  XReduceBy.prototype['@@transducer/step'] = function (result, input) {
    var key = this.keyFn(input);
    this.inputs[key] = this.inputs[key] || [key, this.valueAcc];
    this.inputs[key][1] = this.valueFn(this.inputs[key][1], input);
    return result;
  };

  var _xreduceBy = _curryN(4, [], function _xreduceBy(valueFn, valueAcc, keyFn, xf) {
    return new XReduceBy(valueFn, valueAcc, keyFn, xf);
  });

  /**
   * Groups the elements of the list according to the result of calling
   * the String-returning function `keyFn` on each element and reduces the elements
   * of each group to a single value via the reducer function `valueFn`.
   *
   * The value function receives two values: *(acc, value)*. It may use
   * [`R.reduced`](#reduced) to short circuit the iteration.
   *
   * This function is basically a more general [`groupBy`](#groupBy) function.
   *
   * Acts as a transducer if a transformer is given in list position.
   *
   * @func
   * @memberOf R
   * @since v0.20.0
   * @category List
   * @sig ((a, b) -> a) -> a -> (b -> String) -> [b] -> {String: a}
   * @param {Function} valueFn The function that reduces the elements of each group to a single
   *        value. Receives two values, accumulator for a particular group and the current element.
   * @param {*} acc The (initial) accumulator value for each group.
   * @param {Function} keyFn The function that maps the list's element into a key.
   * @param {Array} list The array to group.
   * @return {Object} An object with the output of `keyFn` for keys, mapped to the output of
   *         `valueFn` for elements which produced that key when passed to `keyFn`.
   * @see R.groupBy, R.reduce, R.reduced
   * @example
   *
   *      const groupNames = (acc, {name}) => acc.concat(name)
   *      const toGrade = ({score}) =>
   *        score < 65 ? 'F' :
   *        score < 70 ? 'D' :
   *        score < 80 ? 'C' :
   *        score < 90 ? 'B' : 'A'
   *
   *      var students = [
   *        {name: 'Abby', score: 83},
   *        {name: 'Bart', score: 62},
   *        {name: 'Curt', score: 88},
   *        {name: 'Dora', score: 92},
   *      ]
   *
   *      reduceBy(groupNames, [], toGrade, students)
   *      //=> {"A": ["Dora"], "B": ["Abby", "Curt"], "F": ["Bart"]}
   */

  var reduceBy = _curryN(4, [], _dispatchable([], _xreduceBy, function reduceBy(valueFn, valueAcc, keyFn, list) {
    return _reduce(function (acc, elt) {
      var key = keyFn(elt);
      var value = valueFn(_has(key, acc) ? acc[key] : _clone(valueAcc, [], [], false), elt);

      if (value && value['@@transducer/reduced']) {
        return _reduced(acc);
      }

      acc[key] = value;
      return acc;
    }, {}, list);
  }));

  /**
   * Counts the elements of a list according to how many match each value of a
   * key generated by the supplied function. Returns an object mapping the keys
   * produced by `fn` to the number of occurrences in the list. Note that all
   * keys are coerced to strings because of how JavaScript objects work.
   *
   * Acts as a transducer if a transformer is given in list position.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Relation
   * @sig (a -> String) -> [a] -> {*}
   * @param {Function} fn The function used to map values to keys.
   * @param {Array} list The list to count elements from.
   * @return {Object} An object mapping keys to number of occurrences in the list.
   * @example
   *
   *      const numbers = [1.0, 1.1, 1.2, 2.0, 3.0, 2.2];
   *      R.countBy(Math.floor)(numbers);    //=> {'1': 3, '2': 2, '3': 1}
   *
   *      const letters = ['a', 'b', 'A', 'a', 'B', 'c'];
   *      R.countBy(R.toLower)(letters);   //=> {'a': 3, 'b': 2, 'c': 1}
   */

  var countBy = reduceBy(function (acc, elem) {
    return acc + 1;
  }, 0);

  /**
   * Decrements its argument.
   *
   * @func
   * @memberOf R
   * @since v0.9.0
   * @category Math
   * @sig Number -> Number
   * @param {Number} n
   * @return {Number} n - 1
   * @see R.inc
   * @example
   *
   *      R.dec(42); //=> 41
   */

  var dec = add(-1);

  /**
   * Returns the second argument if it is not `null`, `undefined` or `NaN`;
   * otherwise the first argument is returned.
   *
   * @func
   * @memberOf R
   * @since v0.10.0
   * @category Logic
   * @sig a -> b -> a | b
   * @param {a} default The default value.
   * @param {b} val `val` will be returned instead of `default` unless `val` is `null`, `undefined` or `NaN`.
   * @return {*} The second value if it is not `null`, `undefined` or `NaN`, otherwise the default value
   * @example
   *
   *      const defaultTo42 = R.defaultTo(42);
   *
   *      defaultTo42(null);  //=> 42
   *      defaultTo42(undefined);  //=> 42
   *      defaultTo42(false);  //=> false
   *      defaultTo42('Ramda');  //=> 'Ramda'
   *      // parseInt('string') results in NaN
   *      defaultTo42(parseInt('string')); //=> 42
   */

  var defaultTo = _curry2(function defaultTo(d, v) {
    return v == null || v !== v ? d : v;
  });

  /**
   * Makes a descending comparator function out of a function that returns a value
   * that can be compared with `<` and `>`.
   *
   * @func
   * @memberOf R
   * @since v0.23.0
   * @category Function
   * @sig Ord b => (a -> b) -> a -> a -> Number
   * @param {Function} fn A function of arity one that returns a value that can be compared
   * @param {*} a The first item to be compared.
   * @param {*} b The second item to be compared.
   * @return {Number} `-1` if fn(a) > fn(b), `1` if fn(b) > fn(a), otherwise `0`
   * @see R.ascend
   * @example
   *
   *      const byAge = R.descend(R.prop('age'));
   *      const people = [
   *        { name: 'Emma', age: 70 },
   *        { name: 'Peter', age: 78 },
   *        { name: 'Mikhail', age: 62 },
   *      ];
   *      const peopleByOldestFirst = R.sort(byAge, people);
   *        //=> [{ name: 'Peter', age: 78 }, { name: 'Emma', age: 70 }, { name: 'Mikhail', age: 62 }]
   */

  var descend = _curry3(function descend(fn, a, b) {
    var aa = fn(a);
    var bb = fn(b);
    return aa > bb ? -1 : aa < bb ? 1 : 0;
  });

  function _Set() {
    /* globals Set */
    this._nativeSet = typeof Set === 'function' ? new Set() : null;
    this._items = {};
  } // until we figure out why jsdoc chokes on this
  // @param item The item to add to the Set
  // @returns {boolean} true if the item did not exist prior, otherwise false
  //


  _Set.prototype.add = function (item) {
    return !hasOrAdd(item, true, this);
  }; //
  // @param item The item to check for existence in the Set
  // @returns {boolean} true if the item exists in the Set, otherwise false
  //


  _Set.prototype.has = function (item) {
    return hasOrAdd(item, false, this);
  }; //
  // Combines the logic for checking whether an item is a member of the set and
  // for adding a new item to the set.
  //
  // @param item       The item to check or add to the Set instance.
  // @param shouldAdd  If true, the item will be added to the set if it doesn't
  //                   already exist.
  // @param set        The set instance to check or add to.
  // @return {boolean} true if the item already existed, otherwise false.
  //


  function hasOrAdd(item, shouldAdd, set) {
    var type = _typeof(item);

    var prevSize, newSize;

    switch (type) {
      case 'string':
      case 'number':
        // distinguish between +0 and -0
        if (item === 0 && 1 / item === -Infinity) {
          if (set._items['-0']) {
            return true;
          } else {
            if (shouldAdd) {
              set._items['-0'] = true;
            }

            return false;
          }
        } // these types can all utilise the native Set


        if (set._nativeSet !== null) {
          if (shouldAdd) {
            prevSize = set._nativeSet.size;

            set._nativeSet.add(item);

            newSize = set._nativeSet.size;
            return newSize === prevSize;
          } else {
            return set._nativeSet.has(item);
          }
        } else {
          if (!(type in set._items)) {
            if (shouldAdd) {
              set._items[type] = {};
              set._items[type][item] = true;
            }

            return false;
          } else if (item in set._items[type]) {
            return true;
          } else {
            if (shouldAdd) {
              set._items[type][item] = true;
            }

            return false;
          }
        }

      case 'boolean':
        // set._items['boolean'] holds a two element array
        // representing [ falseExists, trueExists ]
        if (type in set._items) {
          var bIdx = item ? 1 : 0;

          if (set._items[type][bIdx]) {
            return true;
          } else {
            if (shouldAdd) {
              set._items[type][bIdx] = true;
            }

            return false;
          }
        } else {
          if (shouldAdd) {
            set._items[type] = item ? [false, true] : [true, false];
          }

          return false;
        }

      case 'function':
        // compare functions for reference equality
        if (set._nativeSet !== null) {
          if (shouldAdd) {
            prevSize = set._nativeSet.size;

            set._nativeSet.add(item);

            newSize = set._nativeSet.size;
            return newSize === prevSize;
          } else {
            return set._nativeSet.has(item);
          }
        } else {
          if (!(type in set._items)) {
            if (shouldAdd) {
              set._items[type] = [item];
            }

            return false;
          }

          if (!_includes(item, set._items[type])) {
            if (shouldAdd) {
              set._items[type].push(item);
            }

            return false;
          }

          return true;
        }

      case 'undefined':
        if (set._items[type]) {
          return true;
        } else {
          if (shouldAdd) {
            set._items[type] = true;
          }

          return false;
        }

      case 'object':
        if (item === null) {
          if (!set._items['null']) {
            if (shouldAdd) {
              set._items['null'] = true;
            }

            return false;
          }

          return true;
        }

      /* falls through */

      default:
        // reduce the search size of heterogeneous sets by creating buckets
        // for each type.
        type = Object.prototype.toString.call(item);

        if (!(type in set._items)) {
          if (shouldAdd) {
            set._items[type] = [item];
          }

          return false;
        } // scan through all previously applied items


        if (!_includes(item, set._items[type])) {
          if (shouldAdd) {
            set._items[type].push(item);
          }

          return false;
        }

        return true;
    }
  } // A simple Set type that honours R.equals semantics

  /**
   * Finds the set (i.e. no duplicates) of all elements in the first list not
   * contained in the second list. Objects and Arrays are compared in terms of
   * value equality, not reference equality.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Relation
   * @sig [*] -> [*] -> [*]
   * @param {Array} list1 The first list.
   * @param {Array} list2 The second list.
   * @return {Array} The elements in `list1` that are not in `list2`.
   * @see R.differenceWith, R.symmetricDifference, R.symmetricDifferenceWith, R.without
   * @example
   *
   *      R.difference([1,2,3,4], [7,6,5,4,3]); //=> [1,2]
   *      R.difference([7,6,5,4,3], [1,2,3,4]); //=> [7,6,5]
   *      R.difference([{a: 1}, {b: 2}], [{a: 1}, {c: 3}]) //=> [{b: 2}]
   */

  var difference = _curry2(function difference(first, second) {
    var out = [];
    var idx = 0;
    var firstLen = first.length;
    var secondLen = second.length;
    var toFilterOut = new _Set();

    for (var i = 0; i < secondLen; i += 1) {
      toFilterOut.add(second[i]);
    }

    while (idx < firstLen) {
      if (toFilterOut.add(first[idx])) {
        out[out.length] = first[idx];
      }

      idx += 1;
    }

    return out;
  });

  /**
   * Finds the set (i.e. no duplicates) of all elements in the first list not
   * contained in the second list. Duplication is determined according to the
   * value returned by applying the supplied predicate to two list elements.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Relation
   * @sig ((a, a) -> Boolean) -> [a] -> [a] -> [a]
   * @param {Function} pred A predicate used to test whether two items are equal.
   * @param {Array} list1 The first list.
   * @param {Array} list2 The second list.
   * @return {Array} The elements in `list1` that are not in `list2`.
   * @see R.difference, R.symmetricDifference, R.symmetricDifferenceWith
   * @example
   *
   *      const cmp = (x, y) => x.a === y.a;
   *      const l1 = [{a: 1}, {a: 2}, {a: 3}];
   *      const l2 = [{a: 3}, {a: 4}];
   *      R.differenceWith(cmp, l1, l2); //=> [{a: 1}, {a: 2}]
   */

  var differenceWith = _curry3(function differenceWith(pred, first, second) {
    var out = [];
    var idx = 0;
    var firstLen = first.length;

    while (idx < firstLen) {
      if (!_includesWith(pred, first[idx], second) && !_includesWith(pred, first[idx], out)) {
        out.push(first[idx]);
      }

      idx += 1;
    }

    return out;
  });

  /**
   * Removes the sub-list of `list` starting at index `start` and containing
   * `count` elements. _Note that this is not destructive_: it returns a copy of
   * the list with the changes.
   * <small>No lists have been harmed in the application of this function.</small>
   *
   * @func
   * @memberOf R
   * @since v0.2.2
   * @category List
   * @sig Number -> Number -> [a] -> [a]
   * @param {Number} start The position to start removing elements
   * @param {Number} count The number of elements to remove
   * @param {Array} list The list to remove from
   * @return {Array} A new Array with `count` elements from `start` removed.
   * @see R.without
   * @example
   *
   *      R.remove(2, 3, [1,2,3,4,5,6,7,8]); //=> [1,2,6,7,8]
   */

  var remove = _curry3(function remove(start, count, list) {
    var result = Array.prototype.slice.call(list, 0);
    result.splice(start, count);
    return result;
  });

  /**
   * Returns a new object that does not contain a `prop` property.
   *
   * @private
   * @param {String|Number} prop The name of the property to dissociate
   * @param {Object|Array} obj The object to clone
   * @return {Object} A new object equivalent to the original but without the specified property
   */

  function _dissoc(prop, obj) {
    if (obj == null) {
      return obj;
    }

    if (_isInteger(prop) && _isArray(obj)) {
      return remove(prop, 1, obj);
    }

    var result = {};

    for (var p in obj) {
      result[p] = obj[p];
    }

    delete result[prop];
    return result;
  }

  /**
   * Makes a shallow clone of an object. Note that this copies and flattens
   * prototype properties onto the new object as well. All non-primitive
   * properties are copied by reference.
   *
   * @private
   * @param {String|Integer} prop The prop operating
   * @param {Object|Array} obj The object to clone
   * @return {Object|Array} A new object equivalent to the original.
   */

  function _shallowCloneObject(prop, obj) {
    if (_isInteger(prop) && _isArray(obj)) {
      return [].concat(obj);
    }

    var result = {};

    for (var p in obj) {
      result[p] = obj[p];
    }

    return result;
  }
  /**
   * Makes a shallow clone of an object, omitting the property at the given path.
   * Note that this copies and flattens prototype properties onto the new object
   * as well. All non-primitive properties are copied by reference.
   *
   * @func
   * @memberOf R
   * @since v0.11.0
   * @category Object
   * @typedefn Idx = String | Int | Symbol
   * @sig [Idx] -> {k: v} -> {k: v}
   * @param {Array} path The path to the value to omit
   * @param {Object} obj The object to clone
   * @return {Object} A new object without the property at path
   * @see R.assocPath
   * @example
   *
   *      R.dissocPath(['a', 'b', 'c'], {a: {b: {c: 42}}}); //=> {a: {b: {}}}
   */


  var dissocPath = _curry2(function dissocPath(path, obj) {
    if (obj == null) {
      return obj;
    }

    switch (path.length) {
      case 0:
        return obj;

      case 1:
        return _dissoc(path[0], obj);

      default:
        var head = path[0];
        var tail = Array.prototype.slice.call(path, 1);

        if (obj[head] == null) {
          return _shallowCloneObject(head, obj);
        } else {
          return assoc(head, dissocPath(tail, obj[head]), obj);
        }

    }
  });

  /**
   * Returns a new object that does not contain a `prop` property.
   *
   * @func
   * @memberOf R
   * @since v0.10.0
   * @category Object
   * @sig String -> {k: v} -> {k: v}
   * @param {String} prop The name of the property to dissociate
   * @param {Object} obj The object to clone
   * @return {Object} A new object equivalent to the original but without the specified property
   * @see R.assoc, R.omit
   * @example
   *
   *      R.dissoc('b', {a: 1, b: 2, c: 3}); //=> {a: 1, c: 3}
   */

  var dissoc = _curry2(function dissoc(prop, obj) {
    return dissocPath([prop], obj);
  });

  /**
   * Divides two numbers. Equivalent to `a / b`.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Math
   * @sig Number -> Number -> Number
   * @param {Number} a The first value.
   * @param {Number} b The second value.
   * @return {Number} The result of `a / b`.
   * @see R.multiply
   * @example
   *
   *      R.divide(71, 100); //=> 0.71
   *
   *      const half = R.divide(R.__, 2);
   *      half(42); //=> 21
   *
   *      const reciprocal = R.divide(1);
   *      reciprocal(4);   //=> 0.25
   */

  var divide = _curry2(function divide(a, b) {
    return a / b;
  });

  function XDrop(n, xf) {
    this.xf = xf;
    this.n = n;
  }

  XDrop.prototype['@@transducer/init'] = _xfBase.init;
  XDrop.prototype['@@transducer/result'] = _xfBase.result;

  XDrop.prototype['@@transducer/step'] = function (result, input) {
    if (this.n > 0) {
      this.n -= 1;
      return result;
    }

    return this.xf['@@transducer/step'](result, input);
  };

  var _xdrop = _curry2(function _xdrop(n, xf) {
    return new XDrop(n, xf);
  });

  /**
   * Returns all but the first `n` elements of the given list, string, or
   * transducer/transformer (or object with a `drop` method).
   *
   * Dispatches to the `drop` method of the second argument, if present.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig Number -> [a] -> [a]
   * @sig Number -> String -> String
   * @param {Number} n
   * @param {*} list
   * @return {*} A copy of list without the first `n` elements
   * @see R.take, R.transduce, R.dropLast, R.dropWhile
   * @example
   *
   *      R.drop(1, ['foo', 'bar', 'baz']); //=> ['bar', 'baz']
   *      R.drop(2, ['foo', 'bar', 'baz']); //=> ['baz']
   *      R.drop(3, ['foo', 'bar', 'baz']); //=> []
   *      R.drop(4, ['foo', 'bar', 'baz']); //=> []
   *      R.drop(3, 'ramda');               //=> 'da'
   */

  var drop = _curry2(_dispatchable(['drop'], _xdrop, function drop(n, xs) {
    return slice(Math.max(0, n), Infinity, xs);
  }));

  function XTake(n, xf) {
    this.xf = xf;
    this.n = n;
    this.i = 0;
  }

  XTake.prototype['@@transducer/init'] = _xfBase.init;
  XTake.prototype['@@transducer/result'] = _xfBase.result;

  XTake.prototype['@@transducer/step'] = function (result, input) {
    this.i += 1;
    var ret = this.n === 0 ? result : this.xf['@@transducer/step'](result, input);
    return this.n >= 0 && this.i >= this.n ? _reduced(ret) : ret;
  };

  var _xtake = _curry2(function _xtake(n, xf) {
    return new XTake(n, xf);
  });

  /**
   * Returns the first `n` elements of the given list, string, or
   * transducer/transformer (or object with a `take` method).
   *
   * Dispatches to the `take` method of the second argument, if present.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig Number -> [a] -> [a]
   * @sig Number -> String -> String
   * @param {Number} n
   * @param {*} list
   * @return {*}
   * @see R.drop
   * @example
   *
   *      R.take(1, ['foo', 'bar', 'baz']); //=> ['foo']
   *      R.take(2, ['foo', 'bar', 'baz']); //=> ['foo', 'bar']
   *      R.take(3, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz']
   *      R.take(4, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz']
   *      R.take(3, 'ramda');               //=> 'ram'
   *
   *      const personnel = [
   *        'Dave Brubeck',
   *        'Paul Desmond',
   *        'Eugene Wright',
   *        'Joe Morello',
   *        'Gerry Mulligan',
   *        'Bob Bates',
   *        'Joe Dodge',
   *        'Ron Crotty'
   *      ];
   *
   *      const takeFive = R.take(5);
   *      takeFive(personnel);
   *      //=> ['Dave Brubeck', 'Paul Desmond', 'Eugene Wright', 'Joe Morello', 'Gerry Mulligan']
   * @symb R.take(-1, [a, b]) = [a, b]
   * @symb R.take(0, [a, b]) = []
   * @symb R.take(1, [a, b]) = [a]
   * @symb R.take(2, [a, b]) = [a, b]
   */

  var take = _curry2(_dispatchable(['take'], _xtake, function take(n, xs) {
    return slice(0, n < 0 ? Infinity : n, xs);
  }));

  function dropLast(n, xs) {
    return take(n < xs.length ? xs.length - n : 0, xs);
  }

  function XDropLast(n, xf) {
    this.xf = xf;
    this.pos = 0;
    this.full = false;
    this.acc = new Array(n);
  }

  XDropLast.prototype['@@transducer/init'] = _xfBase.init;

  XDropLast.prototype['@@transducer/result'] = function (result) {
    this.acc = null;
    return this.xf['@@transducer/result'](result);
  };

  XDropLast.prototype['@@transducer/step'] = function (result, input) {
    if (this.full) {
      result = this.xf['@@transducer/step'](result, this.acc[this.pos]);
    }

    this.store(input);
    return result;
  };

  XDropLast.prototype.store = function (input) {
    this.acc[this.pos] = input;
    this.pos += 1;

    if (this.pos === this.acc.length) {
      this.pos = 0;
      this.full = true;
    }
  };

  var _xdropLast = _curry2(function _xdropLast(n, xf) {
    return new XDropLast(n, xf);
  });

  /**
   * Returns a list containing all but the last `n` elements of the given `list`.
   *
   * Acts as a transducer if a transformer is given in list position.
   *
   * @func
   * @memberOf R
   * @since v0.16.0
   * @category List
   * @sig Number -> [a] -> [a]
   * @sig Number -> String -> String
   * @param {Number} n The number of elements of `list` to skip.
   * @param {Array} list The list of elements to consider.
   * @return {Array} A copy of the list with only the first `list.length - n` elements
   * @see R.takeLast, R.drop, R.dropWhile, R.dropLastWhile
   * @example
   *
   *      R.dropLast(1, ['foo', 'bar', 'baz']); //=> ['foo', 'bar']
   *      R.dropLast(2, ['foo', 'bar', 'baz']); //=> ['foo']
   *      R.dropLast(3, ['foo', 'bar', 'baz']); //=> []
   *      R.dropLast(4, ['foo', 'bar', 'baz']); //=> []
   *      R.dropLast(3, 'ramda');               //=> 'ra'
   */

  var dropLast$1 = _curry2(_dispatchable([], _xdropLast, dropLast));

  function dropLastWhile(pred, xs) {
    var idx = xs.length - 1;

    while (idx >= 0 && pred(xs[idx])) {
      idx -= 1;
    }

    return slice(0, idx + 1, xs);
  }

  function XDropLastWhile(fn, xf) {
    this.f = fn;
    this.retained = [];
    this.xf = xf;
  }

  XDropLastWhile.prototype['@@transducer/init'] = _xfBase.init;

  XDropLastWhile.prototype['@@transducer/result'] = function (result) {
    this.retained = null;
    return this.xf['@@transducer/result'](result);
  };

  XDropLastWhile.prototype['@@transducer/step'] = function (result, input) {
    return this.f(input) ? this.retain(result, input) : this.flush(result, input);
  };

  XDropLastWhile.prototype.flush = function (result, input) {
    result = _reduce(this.xf['@@transducer/step'], result, this.retained);
    this.retained = [];
    return this.xf['@@transducer/step'](result, input);
  };

  XDropLastWhile.prototype.retain = function (result, input) {
    this.retained.push(input);
    return result;
  };

  var _xdropLastWhile = _curry2(function _xdropLastWhile(fn, xf) {
    return new XDropLastWhile(fn, xf);
  });

  /**
   * Returns a new list excluding all the tailing elements of a given list which
   * satisfy the supplied predicate function. It passes each value from the right
   * to the supplied predicate function, skipping elements until the predicate
   * function returns a `falsy` value. The predicate function is applied to one argument:
   * *(value)*.
   *
   * Acts as a transducer if a transformer is given in list position.
   *
   * @func
   * @memberOf R
   * @since v0.16.0
   * @category List
   * @sig (a -> Boolean) -> [a] -> [a]
   * @sig (a -> Boolean) -> String -> String
   * @param {Function} predicate The function to be called on each element
   * @param {Array} xs The collection to iterate over.
   * @return {Array} A new array without any trailing elements that return `falsy` values from the `predicate`.
   * @see R.takeLastWhile, R.addIndex, R.drop, R.dropWhile
   * @example
   *
   *      const lteThree = x => x <= 3;
   *
   *      R.dropLastWhile(lteThree, [1, 2, 3, 4, 3, 2, 1]); //=> [1, 2, 3, 4]
   *
   *      R.dropLastWhile(x => x !== 'd' , 'Ramda'); //=> 'Ramd'
   */

  var dropLastWhile$1 = _curry2(_dispatchable([], _xdropLastWhile, dropLastWhile));

  function XDropRepeatsWith(pred, xf) {
    this.xf = xf;
    this.pred = pred;
    this.lastValue = undefined;
    this.seenFirstValue = false;
  }

  XDropRepeatsWith.prototype['@@transducer/init'] = _xfBase.init;
  XDropRepeatsWith.prototype['@@transducer/result'] = _xfBase.result;

  XDropRepeatsWith.prototype['@@transducer/step'] = function (result, input) {
    var sameAsLast = false;

    if (!this.seenFirstValue) {
      this.seenFirstValue = true;
    } else if (this.pred(this.lastValue, input)) {
      sameAsLast = true;
    }

    this.lastValue = input;
    return sameAsLast ? result : this.xf['@@transducer/step'](result, input);
  };

  var _xdropRepeatsWith = _curry2(function _xdropRepeatsWith(pred, xf) {
    return new XDropRepeatsWith(pred, xf);
  });

  /**
   * Returns the last element of the given list or string.
   *
   * @func
   * @memberOf R
   * @since v0.1.4
   * @category List
   * @sig [a] -> a | Undefined
   * @sig String -> String
   * @param {*} list
   * @return {*}
   * @see R.init, R.head, R.tail
   * @example
   *
   *      R.last(['fi', 'fo', 'fum']); //=> 'fum'
   *      R.last([]); //=> undefined
   *
   *      R.last('abc'); //=> 'c'
   *      R.last(''); //=> ''
   */

  var last = nth(-1);

  /**
   * Returns a new list without any consecutively repeating elements. Equality is
   * determined by applying the supplied predicate to each pair of consecutive elements. The
   * first element in a series of equal elements will be preserved.
   *
   * Acts as a transducer if a transformer is given in list position.
   *
   * @func
   * @memberOf R
   * @since v0.14.0
   * @category List
   * @sig ((a, a) -> Boolean) -> [a] -> [a]
   * @param {Function} pred A predicate used to test whether two items are equal.
   * @param {Array} list The array to consider.
   * @return {Array} `list` without repeating elements.
   * @see R.transduce
   * @example
   *
   *      const l = [1, -1, 1, 3, 4, -4, -4, -5, 5, 3, 3];
   *      R.dropRepeatsWith(R.eqBy(Math.abs), l); //=> [1, 3, 4, -5, 3]
   */

  var dropRepeatsWith = _curry2(_dispatchable([], _xdropRepeatsWith, function dropRepeatsWith(pred, list) {
    var result = [];
    var idx = 1;
    var len = list.length;

    if (len !== 0) {
      result[0] = list[0];

      while (idx < len) {
        if (!pred(last(result), list[idx])) {
          result[result.length] = list[idx];
        }

        idx += 1;
      }
    }

    return result;
  }));

  /**
   * Returns a new list without any consecutively repeating elements.
   * [`R.equals`](#equals) is used to determine equality.
   *
   * Acts as a transducer if a transformer is given in list position.
   *
   * @func
   * @memberOf R
   * @since v0.14.0
   * @category List
   * @sig [a] -> [a]
   * @param {Array} list The array to consider.
   * @return {Array} `list` without repeating elements.
   * @see R.transduce
   * @example
   *
   *     R.dropRepeats([1, 1, 1, 2, 3, 4, 4, 2, 2]); //=> [1, 2, 3, 4, 2]
   */

  var dropRepeats = _curry1(_dispatchable([], _xdropRepeatsWith(equals), dropRepeatsWith(equals)));

  function XDropWhile(f, xf) {
    this.xf = xf;
    this.f = f;
  }

  XDropWhile.prototype['@@transducer/init'] = _xfBase.init;
  XDropWhile.prototype['@@transducer/result'] = _xfBase.result;

  XDropWhile.prototype['@@transducer/step'] = function (result, input) {
    if (this.f) {
      if (this.f(input)) {
        return result;
      }

      this.f = null;
    }

    return this.xf['@@transducer/step'](result, input);
  };

  var _xdropWhile = _curry2(function _xdropWhile(f, xf) {
    return new XDropWhile(f, xf);
  });

  /**
   * Returns a new list excluding the leading elements of a given list which
   * satisfy the supplied predicate function. It passes each value to the supplied
   * predicate function, skipping elements while the predicate function returns
   * `true`. The predicate function is applied to one argument: *(value)*.
   *
   * Dispatches to the `dropWhile` method of the second argument, if present.
   *
   * Acts as a transducer if a transformer is given in list position.
   *
   * @func
   * @memberOf R
   * @since v0.9.0
   * @category List
   * @sig (a -> Boolean) -> [a] -> [a]
   * @sig (a -> Boolean) -> String -> String
   * @param {Function} fn The function called per iteration.
   * @param {Array} xs The collection to iterate over.
   * @return {Array} A new array.
   * @see R.takeWhile, R.transduce, R.addIndex
   * @example
   *
   *      const lteTwo = x => x <= 2;
   *
   *      R.dropWhile(lteTwo, [1, 2, 3, 4, 3, 2, 1]); //=> [3, 4, 3, 2, 1]
   *
   *      R.dropWhile(x => x !== 'd' , 'Ramda'); //=> 'da'
   */

  var dropWhile = _curry2(_dispatchable(['dropWhile'], _xdropWhile, function dropWhile(pred, xs) {
    var idx = 0;
    var len = xs.length;

    while (idx < len && pred(xs[idx])) {
      idx += 1;
    }

    return slice(idx, Infinity, xs);
  }));

  /**
   * Returns the first argument if it is truthy, otherwise the second argument.
   * Acts as the boolean `or` statement if both inputs are `Boolean`s.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Logic
   * @sig a -> b -> a | b
   * @param {Any} a
   * @param {Any} b
   * @return {Any}
   * @see R.either, R.and
   * @example
   *
   *      R.or(true, true); //=> true
   *      R.or(true, false); //=> true
   *      R.or(false, true); //=> true
   *      R.or(false, false); //=> false
   */

  var or = _curry2(function or(a, b) {
    return a || b;
  });

  /**
   * A function wrapping calls to the two functions in an `||` operation,
   * returning the result of the first function if it is truth-y and the result
   * of the second function otherwise. Note that this is short-circuited,
   * meaning that the second function will not be invoked if the first returns a
   * truth-y value.
   *
   * In addition to functions, `R.either` also accepts any fantasy-land compatible
   * applicative functor.
   *
   * @func
   * @memberOf R
   * @since v0.12.0
   * @category Logic
   * @sig (*... -> Boolean) -> (*... -> Boolean) -> (*... -> Boolean)
   * @param {Function} f a predicate
   * @param {Function} g another predicate
   * @return {Function} a function that applies its arguments to `f` and `g` and `||`s their outputs together.
   * @see R.both, R.or
   * @example
   *
   *      const gt10 = x => x > 10;
   *      const even = x => x % 2 === 0;
   *      const f = R.either(gt10, even);
   *      f(101); //=> true
   *      f(8); //=> true
   *
   *      R.either(Maybe.Just(false), Maybe.Just(55)); // => Maybe.Just(55)
   *      R.either([false, false, 'a'], [11]) // => [11, 11, "a"]
   */

  var either = _curry2(function either(f, g) {
    return _isFunction(f) ? function _either() {
      return f.apply(this, arguments) || g.apply(this, arguments);
    } : lift(or)(f, g);
  });

  /**
   * Tests whether or not an object is a typed array.
   *
   * @private
   * @param {*} val The object to test.
   * @return {Boolean} `true` if `val` is a typed array, `false` otherwise.
   * @example
   *
   *      _isTypedArray(new Uint8Array([])); //=> true
   *      _isTypedArray(new Float32Array([])); //=> true
   *      _isTypedArray([]); //=> false
   *      _isTypedArray(null); //=> false
   *      _isTypedArray({}); //=> false
   */
  function _isTypedArray(val) {
    var type = Object.prototype.toString.call(val);
    return type === '[object Uint8ClampedArray]' || type === '[object Int8Array]' || type === '[object Uint8Array]' || type === '[object Int16Array]' || type === '[object Uint16Array]' || type === '[object Int32Array]' || type === '[object Uint32Array]' || type === '[object Float32Array]' || type === '[object Float64Array]' || type === '[object BigInt64Array]' || type === '[object BigUint64Array]';
  }

  /**
   * Returns the empty value of its argument's type. Ramda defines the empty
   * value of Array (`[]`), Object (`{}`), String (`''`),
   * TypedArray (`Uint8Array []`, `Float32Array []`, etc), and Arguments. Other
   * types are supported if they define `<Type>.empty`,
   * `<Type>.prototype.empty` or implement the
   * [FantasyLand Monoid spec](https://github.com/fantasyland/fantasy-land#monoid).
   *
   * Dispatches to the `empty` method of the first argument, if present.
   *
   * @func
   * @memberOf R
   * @since v0.3.0
   * @category Function
   * @sig a -> a
   * @param {*} x
   * @return {*}
   * @example
   *
   *      R.empty(Just(42));               //=> Nothing()
   *      R.empty([1, 2, 3]);              //=> []
   *      R.empty('unicorns');             //=> ''
   *      R.empty({x: 1, y: 2});           //=> {}
   *      R.empty(Uint8Array.from('123')); //=> Uint8Array []
   */

  var empty = _curry1(function empty(x) {
    return x != null && typeof x['fantasy-land/empty'] === 'function' ? x['fantasy-land/empty']() : x != null && x.constructor != null && typeof x.constructor['fantasy-land/empty'] === 'function' ? x.constructor['fantasy-land/empty']() : x != null && typeof x.empty === 'function' ? x.empty() : x != null && x.constructor != null && typeof x.constructor.empty === 'function' ? x.constructor.empty() : _isArray(x) ? [] : _isString(x) ? '' : _isObject(x) ? {} : _isArguments(x) ? function () {
      return arguments;
    }() : _isTypedArray(x) ? x.constructor.from('') : void 0 // else
    ;
  });

  /**
   * Returns a new list containing the last `n` elements of the given list.
   * If `n > list.length`, returns a list of `list.length` elements.
   *
   * @func
   * @memberOf R
   * @since v0.16.0
   * @category List
   * @sig Number -> [a] -> [a]
   * @sig Number -> String -> String
   * @param {Number} n The number of elements to return.
   * @param {Array} xs The collection to consider.
   * @return {Array}
   * @see R.dropLast
   * @example
   *
   *      R.takeLast(1, ['foo', 'bar', 'baz']); //=> ['baz']
   *      R.takeLast(2, ['foo', 'bar', 'baz']); //=> ['bar', 'baz']
   *      R.takeLast(3, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz']
   *      R.takeLast(4, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz']
   *      R.takeLast(3, 'ramda');               //=> 'mda'
   */

  var takeLast = _curry2(function takeLast(n, xs) {
    return drop(n >= 0 ? xs.length - n : 0, xs);
  });

  /**
   * Checks if a list ends with the provided sublist.
   *
   * Similarly, checks if a string ends with the provided substring.
   *
   * @func
   * @memberOf R
   * @since v0.24.0
   * @category List
   * @sig [a] -> [a] -> Boolean
   * @sig String -> String -> Boolean
   * @param {*} suffix
   * @param {*} list
   * @return {Boolean}
   * @see R.startsWith
   * @example
   *
   *      R.endsWith('c', 'abc')                //=> true
   *      R.endsWith('b', 'abc')                //=> false
   *      R.endsWith(['c'], ['a', 'b', 'c'])    //=> true
   *      R.endsWith(['b'], ['a', 'b', 'c'])    //=> false
   */

  var endsWith = _curry2(function (suffix, list) {
    return equals(takeLast(suffix.length, list), suffix);
  });

  /**
   * Takes a function and two values in its domain and returns `true` if the
   * values map to the same value in the codomain; `false` otherwise.
   *
   * @func
   * @memberOf R
   * @since v0.18.0
   * @category Relation
   * @sig (a -> b) -> a -> a -> Boolean
   * @param {Function} f
   * @param {*} x
   * @param {*} y
   * @return {Boolean}
   * @example
   *
   *      R.eqBy(Math.abs, 5, -5); //=> true
   */

  var eqBy = _curry3(function eqBy(f, x, y) {
    return equals(f(x), f(y));
  });

  /**
   * Reports whether two objects have the same value, in [`R.equals`](#equals)
   * terms, for the specified property. Useful as a curried predicate.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Object
   * @sig k -> {k: v} -> {k: v} -> Boolean
   * @param {String} prop The name of the property to compare
   * @param {Object} obj1
   * @param {Object} obj2
   * @return {Boolean}
   *
   * @example
   *
   *      const o1 = { a: 1, b: 2, c: 3, d: 4 };
   *      const o2 = { a: 10, b: 20, c: 3, d: 40 };
   *      R.eqProps('a', o1, o2); //=> false
   *      R.eqProps('c', o1, o2); //=> true
   */

  var eqProps = _curry3(function eqProps(prop, obj1, obj2) {
    return equals(obj1[prop], obj2[prop]);
  });

  /**
   * Creates a new object by recursively evolving a shallow copy of `object`,
   * according to the `transformation` functions. All non-primitive properties
   * are copied by reference.
   *
   * A `transformation` function will not be invoked if its corresponding key
   * does not exist in the evolved object.
   *
   * @func
   * @memberOf R
   * @since v0.9.0
   * @category Object
   * @sig {k: (v -> v)} -> {k: v} -> {k: v}
   * @param {Object} transformations The object specifying transformation functions to apply
   *        to the object.
   * @param {Object} object The object to be transformed.
   * @return {Object} The transformed object.
   * @example
   *
   *      const tomato = {firstName: '  Tomato ', data: {elapsed: 100, remaining: 1400}, id:123};
   *      const transformations = {
   *        firstName: R.trim,
   *        lastName: R.trim, // Will not get invoked.
   *        data: {elapsed: R.add(1), remaining: R.add(-1)}
   *      };
   *      R.evolve(transformations, tomato); //=> {firstName: 'Tomato', data: {elapsed: 101, remaining: 1399}, id:123}
   */

  var evolve = _curry2(function evolve(transformations, object) {
    if (!_isObject(object) && !_isArray(object)) {
      return object;
    }

    var result = object instanceof Array ? [] : {};
    var transformation, key, type;

    for (key in object) {
      transformation = transformations[key];
      type = _typeof(transformation);
      result[key] = type === 'function' ? transformation(object[key]) : transformation && type === 'object' ? evolve(transformation, object[key]) : object[key];
    }

    return result;
  });

  function XFind(f, xf) {
    this.xf = xf;
    this.f = f;
    this.found = false;
  }

  XFind.prototype['@@transducer/init'] = _xfBase.init;

  XFind.prototype['@@transducer/result'] = function (result) {
    if (!this.found) {
      result = this.xf['@@transducer/step'](result, void 0);
    }

    return this.xf['@@transducer/result'](result);
  };

  XFind.prototype['@@transducer/step'] = function (result, input) {
    if (this.f(input)) {
      this.found = true;
      result = _reduced(this.xf['@@transducer/step'](result, input));
    }

    return result;
  };

  var _xfind = _curry2(function _xfind(f, xf) {
    return new XFind(f, xf);
  });

  /**
   * Returns the first element of the list which matches the predicate, or
   * `undefined` if no element matches.
   *
   * Dispatches to the `find` method of the second argument, if present.
   *
   * Acts as a transducer if a transformer is given in list position.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig (a -> Boolean) -> [a] -> a | undefined
   * @param {Function} fn The predicate function used to determine if the element is the
   *        desired one.
   * @param {Array} list The array to consider.
   * @return {Object} The element found, or `undefined`.
   * @see R.transduce
   * @example
   *
   *      const xs = [{a: 1}, {a: 2}, {a: 3}];
   *      R.find(R.propEq('a', 2))(xs); //=> {a: 2}
   *      R.find(R.propEq('a', 4))(xs); //=> undefined
   */

  var find = _curry2(_dispatchable(['find'], _xfind, function find(fn, list) {
    var idx = 0;
    var len = list.length;

    while (idx < len) {
      if (fn(list[idx])) {
        return list[idx];
      }

      idx += 1;
    }
  }));

  function XFindIndex(f, xf) {
    this.xf = xf;
    this.f = f;
    this.idx = -1;
    this.found = false;
  }

  XFindIndex.prototype['@@transducer/init'] = _xfBase.init;

  XFindIndex.prototype['@@transducer/result'] = function (result) {
    if (!this.found) {
      result = this.xf['@@transducer/step'](result, -1);
    }

    return this.xf['@@transducer/result'](result);
  };

  XFindIndex.prototype['@@transducer/step'] = function (result, input) {
    this.idx += 1;

    if (this.f(input)) {
      this.found = true;
      result = _reduced(this.xf['@@transducer/step'](result, this.idx));
    }

    return result;
  };

  var _xfindIndex = _curry2(function _xfindIndex(f, xf) {
    return new XFindIndex(f, xf);
  });

  /**
   * Returns the index of the first element of the list which matches the
   * predicate, or `-1` if no element matches.
   *
   * Acts as a transducer if a transformer is given in list position.
   *
   * @func
   * @memberOf R
   * @since v0.1.1
   * @category List
   * @sig (a -> Boolean) -> [a] -> Number
   * @param {Function} fn The predicate function used to determine if the element is the
   * desired one.
   * @param {Array} list The array to consider.
   * @return {Number} The index of the element found, or `-1`.
   * @see R.transduce, R.indexOf
   * @example
   *
   *      const xs = [{a: 1}, {a: 2}, {a: 3}];
   *      R.findIndex(R.propEq('a', 2))(xs); //=> 1
   *      R.findIndex(R.propEq('a', 4))(xs); //=> -1
   */

  var findIndex = _curry2(_dispatchable([], _xfindIndex, function findIndex(fn, list) {
    var idx = 0;
    var len = list.length;

    while (idx < len) {
      if (fn(list[idx])) {
        return idx;
      }

      idx += 1;
    }

    return -1;
  }));

  function XFindLast(f, xf) {
    this.xf = xf;
    this.f = f;
  }

  XFindLast.prototype['@@transducer/init'] = _xfBase.init;

  XFindLast.prototype['@@transducer/result'] = function (result) {
    return this.xf['@@transducer/result'](this.xf['@@transducer/step'](result, this.last));
  };

  XFindLast.prototype['@@transducer/step'] = function (result, input) {
    if (this.f(input)) {
      this.last = input;
    }

    return result;
  };

  var _xfindLast = _curry2(function _xfindLast(f, xf) {
    return new XFindLast(f, xf);
  });

  /**
   * Returns the last element of the list which matches the predicate, or
   * `undefined` if no element matches.
   *
   * Acts as a transducer if a transformer is given in list position.
   *
   * @func
   * @memberOf R
   * @since v0.1.1
   * @category List
   * @sig (a -> Boolean) -> [a] -> a | undefined
   * @param {Function} fn The predicate function used to determine if the element is the
   * desired one.
   * @param {Array} list The array to consider.
   * @return {Object} The element found, or `undefined`.
   * @see R.transduce
   * @example
   *
   *      const xs = [{a: 1, b: 0}, {a:1, b: 1}];
   *      R.findLast(R.propEq('a', 1))(xs); //=> {a: 1, b: 1}
   *      R.findLast(R.propEq('a', 4))(xs); //=> undefined
   */

  var findLast = _curry2(_dispatchable([], _xfindLast, function findLast(fn, list) {
    var idx = list.length - 1;

    while (idx >= 0) {
      if (fn(list[idx])) {
        return list[idx];
      }

      idx -= 1;
    }
  }));

  function XFindLastIndex(f, xf) {
    this.xf = xf;
    this.f = f;
    this.idx = -1;
    this.lastIdx = -1;
  }

  XFindLastIndex.prototype['@@transducer/init'] = _xfBase.init;

  XFindLastIndex.prototype['@@transducer/result'] = function (result) {
    return this.xf['@@transducer/result'](this.xf['@@transducer/step'](result, this.lastIdx));
  };

  XFindLastIndex.prototype['@@transducer/step'] = function (result, input) {
    this.idx += 1;

    if (this.f(input)) {
      this.lastIdx = this.idx;
    }

    return result;
  };

  var _xfindLastIndex = _curry2(function _xfindLastIndex(f, xf) {
    return new XFindLastIndex(f, xf);
  });

  /**
   * Returns the index of the last element of the list which matches the
   * predicate, or `-1` if no element matches.
   *
   * Acts as a transducer if a transformer is given in list position.
   *
   * @func
   * @memberOf R
   * @since v0.1.1
   * @category List
   * @sig (a -> Boolean) -> [a] -> Number
   * @param {Function} fn The predicate function used to determine if the element is the
   * desired one.
   * @param {Array} list The array to consider.
   * @return {Number} The index of the element found, or `-1`.
   * @see R.transduce, R.lastIndexOf
   * @example
   *
   *      const xs = [{a: 1, b: 0}, {a:1, b: 1}];
   *      R.findLastIndex(R.propEq('a', 1))(xs); //=> 1
   *      R.findLastIndex(R.propEq('a', 4))(xs); //=> -1
   */

  var findLastIndex = _curry2(_dispatchable([], _xfindLastIndex, function findLastIndex(fn, list) {
    var idx = list.length - 1;

    while (idx >= 0) {
      if (fn(list[idx])) {
        return idx;
      }

      idx -= 1;
    }

    return -1;
  }));

  /**
   * Returns a new list by pulling every item out of it (and all its sub-arrays)
   * and putting them in a new array, depth-first.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig [a] -> [b]
   * @param {Array} list The array to consider.
   * @return {Array} The flattened list.
   * @see R.unnest
   * @example
   *
   *      R.flatten([1, 2, [3, 4], 5, [6, [7, 8, [9, [10, 11], 12]]]]);
   *      //=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
   */

  var flatten = _curry1(_makeFlat(true));

  /**
   * Returns a new function much like the supplied one, except that the first two
   * arguments' order is reversed.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Function
   * @sig ((a, b, c, ...) -> z) -> (b -> a -> c -> ... -> z)
   * @param {Function} fn The function to invoke with its first two parameters reversed.
   * @return {*} The result of invoking `fn` with its first two parameters' order reversed.
   * @example
   *
   *      const mergeThree = (a, b, c) => [].concat(a, b, c);
   *
   *      mergeThree(1, 2, 3); //=> [1, 2, 3]
   *
   *      R.flip(mergeThree)(1, 2, 3); //=> [2, 1, 3]
   * @symb R.flip(f)(a, b, c) = f(b, a, c)
   */

  var flip = _curry1(function flip(fn) {
    return curryN(fn.length, function (a, b) {
      var args = Array.prototype.slice.call(arguments, 0);
      args[0] = b;
      args[1] = a;
      return fn.apply(this, args);
    });
  });

  /**
   * Iterate over an input `list`, calling a provided function `fn` for each
   * element in the list.
   *
   * `fn` receives one argument: *(value)*.
   *
   * Note: `R.forEach` does not skip deleted or unassigned indices (sparse
   * arrays), unlike the native `Array.prototype.forEach` method. For more
   * details on this behavior, see:
   * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Description
   *
   * Also note that, unlike `Array.prototype.forEach`, Ramda's `forEach` returns
   * the original array. In some libraries this function is named `each`.
   *
   * Dispatches to the `forEach` method of the second argument, if present.
   *
   * @func
   * @memberOf R
   * @since v0.1.1
   * @category List
   * @sig (a -> *) -> [a] -> [a]
   * @param {Function} fn The function to invoke. Receives one argument, `value`.
   * @param {Array} list The list to iterate over.
   * @return {Array} The original list.
   * @see R.addIndex
   * @example
   *
   *      const printXPlusFive = x => console.log(x + 5);
   *      R.forEach(printXPlusFive, [1, 2, 3]); //=> [1, 2, 3]
   *      // logs 6
   *      // logs 7
   *      // logs 8
   * @symb R.forEach(f, [a, b, c]) = [a, b, c]
   */

  var forEach = _curry2(_checkForMethod('forEach', function forEach(fn, list) {
    var len = list.length;
    var idx = 0;

    while (idx < len) {
      fn(list[idx]);
      idx += 1;
    }

    return list;
  }));

  /**
   * Iterate over an input `object`, calling a provided function `fn` for each
   * key and value in the object.
   *
   * `fn` receives three argument: *(value, key, obj)*.
   *
   * @func
   * @memberOf R
   * @since v0.23.0
   * @category Object
   * @sig ((a, String, StrMap a) -> Any) -> StrMap a -> StrMap a
   * @param {Function} fn The function to invoke. Receives three argument, `value`, `key`, `obj`.
   * @param {Object} obj The object to iterate over.
   * @return {Object} The original object.
   * @example
   *
   *      const printKeyConcatValue = (value, key) => console.log(key + ':' + value);
   *      R.forEachObjIndexed(printKeyConcatValue, {x: 1, y: 2}); //=> {x: 1, y: 2}
   *      // logs x:1
   *      // logs y:2
   * @symb R.forEachObjIndexed(f, {x: a, y: b}) = {x: a, y: b}
   */

  var forEachObjIndexed = _curry2(function forEachObjIndexed(fn, obj) {
    var keyList = keys(obj);
    var idx = 0;

    while (idx < keyList.length) {
      var key = keyList[idx];
      fn(obj[key], key, obj);
      idx += 1;
    }

    return obj;
  });

  /**
   * Creates a new object from a list key-value pairs. If a key appears in
   * multiple pairs, the rightmost pair is included in the object.
   *
   * @func
   * @memberOf R
   * @since v0.3.0
   * @category List
   * @sig [[k,v]] -> {k: v}
   * @param {Array} pairs An array of two-element arrays that will be the keys and values of the output object.
   * @return {Object} The object made by pairing up `keys` and `values`.
   * @see R.toPairs, R.pair
   * @example
   *
   *      R.fromPairs([['a', 1], ['b', 2], ['c', 3]]); //=> {a: 1, b: 2, c: 3}
   */

  var fromPairs = _curry1(function fromPairs(pairs) {
    var result = {};
    var idx = 0;

    while (idx < pairs.length) {
      result[pairs[idx][0]] = pairs[idx][1];
      idx += 1;
    }

    return result;
  });

  /**
   * Splits a list into sub-lists stored in an object, based on the result of
   * calling a key-returning function on each element, and grouping the
   * results according to values returned.
   *
   * Dispatches to the `groupBy` method of the second argument, if present.
   *
   * Acts as a transducer if a transformer is given in list position.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @typedefn Idx = String | Int | Symbol
   * @sig Idx a => (b -> a) -> [b] -> {a: [b]}
   * @param {Function} fn Function :: a -> Idx
   * @param {Array} list The array to group
   * @return {Object} An object with the output of `fn` for keys, mapped to arrays of elements
   *         that produced that key when passed to `fn`.
   * @see R.reduceBy, R.transduce, R.indexBy
   * @example
   *
   *      const byGrade = R.groupBy(function(student) {
   *        const score = student.score;
   *        return score < 65 ? 'F' :
   *               score < 70 ? 'D' :
   *               score < 80 ? 'C' :
   *               score < 90 ? 'B' : 'A';
   *      });
   *      const students = [{name: 'Abby', score: 84},
   *                      {name: 'Eddy', score: 58},
   *                      // ...
   *                      {name: 'Jack', score: 69}];
   *      byGrade(students);
   *      // {
   *      //   'A': [{name: 'Dianne', score: 99}],
   *      //   'B': [{name: 'Abby', score: 84}]
   *      //   // ...,
   *      //   'F': [{name: 'Eddy', score: 58}]
   *      // }
   */

  var groupBy = _curry2(_checkForMethod('groupBy', reduceBy(function (acc, item) {
    acc.push(item);
    return acc;
  }, [])));

  /**
   * Takes a list and returns a list of lists where each sublist's elements are
   * all satisfied pairwise comparison according to the provided function.
   * Only adjacent elements are passed to the comparison function.
   *
   * @func
   * @memberOf R
   * @since v0.21.0
   * @category List
   * @sig ((a, a) → Boolean) → [a] → [[a]]
   * @param {Function} fn Function for determining whether two given (adjacent)
   *        elements should be in the same group
   * @param {Array} list The array to group. Also accepts a string, which will be
   *        treated as a list of characters.
   * @return {List} A list that contains sublists of elements,
   *         whose concatenations are equal to the original list.
   * @example
   *
   * R.groupWith(R.equals, [0, 1, 1, 2, 3, 5, 8, 13, 21])
   * //=> [[0], [1, 1], [2], [3], [5], [8], [13], [21]]
   *
   * R.groupWith((a, b) => a + 1 === b, [0, 1, 1, 2, 3, 5, 8, 13, 21])
   * //=> [[0, 1], [1, 2, 3], [5], [8], [13], [21]]
   *
   * R.groupWith((a, b) => a % 2 === b % 2, [0, 1, 1, 2, 3, 5, 8, 13, 21])
   * //=> [[0], [1, 1], [2], [3, 5], [8], [13, 21]]
   *
   * const isVowel = R.test(/^[aeiou]$/i);
   * R.groupWith(R.eqBy(isVowel), 'aestiou')
   * //=> ['ae', 'st', 'iou']
   */

  var groupWith = _curry2(function (fn, list) {
    var res = [];
    var idx = 0;
    var len = list.length;

    while (idx < len) {
      var nextidx = idx + 1;

      while (nextidx < len && fn(list[nextidx - 1], list[nextidx])) {
        nextidx += 1;
      }

      res.push(list.slice(idx, nextidx));
      idx = nextidx;
    }

    return res;
  });

  /**
   * Returns `true` if the first argument is greater than the second; `false`
   * otherwise.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Relation
   * @sig Ord a => a -> a -> Boolean
   * @param {*} a
   * @param {*} b
   * @return {Boolean}
   * @see R.lt
   * @example
   *
   *      R.gt(2, 1); //=> true
   *      R.gt(2, 2); //=> false
   *      R.gt(2, 3); //=> false
   *      R.gt('a', 'z'); //=> false
   *      R.gt('z', 'a'); //=> true
   */

  var gt = _curry2(function gt(a, b) {
    return a > b;
  });

  /**
   * Returns `true` if the first argument is greater than or equal to the second;
   * `false` otherwise.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Relation
   * @sig Ord a => a -> a -> Boolean
   * @param {Number} a
   * @param {Number} b
   * @return {Boolean}
   * @see R.lte
   * @example
   *
   *      R.gte(2, 1); //=> true
   *      R.gte(2, 2); //=> true
   *      R.gte(2, 3); //=> false
   *      R.gte('a', 'z'); //=> false
   *      R.gte('z', 'a'); //=> true
   */

  var gte = _curry2(function gte(a, b) {
    return a >= b;
  });

  /**
   * Returns whether or not a path exists in an object. Only the object's
   * own properties are checked.
   *
   * @func
   * @memberOf R
   * @since v0.26.0
   * @category Object
   * @typedefn Idx = String | Int | Symbol
   * @sig [Idx] -> {a} -> Boolean
   * @param {Array} path The path to use.
   * @param {Object} obj The object to check the path in.
   * @return {Boolean} Whether the path exists.
   * @see R.has
   * @example
   *
   *      R.hasPath(['a', 'b'], {a: {b: 2}});         // => true
   *      R.hasPath(['a', 'b'], {a: {b: undefined}}); // => true
   *      R.hasPath(['a', 'b'], {a: {c: 2}});         // => false
   *      R.hasPath(['a', 'b'], {});                  // => false
   */

  var hasPath = _curry2(function hasPath(_path, obj) {
    if (_path.length === 0 || isNil(obj)) {
      return false;
    }

    var val = obj;
    var idx = 0;

    while (idx < _path.length) {
      if (!isNil(val) && _has(_path[idx], val)) {
        val = val[_path[idx]];
        idx += 1;
      } else {
        return false;
      }
    }

    return true;
  });

  /**
   * Returns whether or not an object has an own property with the specified name
   *
   * @func
   * @memberOf R
   * @since v0.7.0
   * @category Object
   * @sig s -> {s: x} -> Boolean
   * @param {String} prop The name of the property to check for.
   * @param {Object} obj The object to query.
   * @return {Boolean} Whether the property exists.
   * @example
   *
   *      const hasName = R.has('name');
   *      hasName({name: 'alice'});   //=> true
   *      hasName({name: 'bob'});     //=> true
   *      hasName({});                //=> false
   *
   *      const point = {x: 0, y: 0};
   *      const pointHas = R.has(R.__, point);
   *      pointHas('x');  //=> true
   *      pointHas('y');  //=> true
   *      pointHas('z');  //=> false
   */

  var has = _curry2(function has(prop, obj) {
    return hasPath([prop], obj);
  });

  /**
   * Returns whether or not an object or its prototype chain has a property with
   * the specified name
   *
   * @func
   * @memberOf R
   * @since v0.7.0
   * @category Object
   * @sig s -> {s: x} -> Boolean
   * @param {String} prop The name of the property to check for.
   * @param {Object} obj The object to query.
   * @return {Boolean} Whether the property exists.
   * @example
   *
   *      function Rectangle(width, height) {
   *        this.width = width;
   *        this.height = height;
   *      }
   *      Rectangle.prototype.area = function() {
   *        return this.width * this.height;
   *      };
   *
   *      const square = new Rectangle(2, 2);
   *      R.hasIn('width', square);  //=> true
   *      R.hasIn('area', square);  //=> true
   */

  var hasIn = _curry2(function hasIn(prop, obj) {
    if (isNil(obj)) {
      return false;
    }

    return prop in obj;
  });

  /**
   * Returns true if its arguments are identical, false otherwise. Values are
   * identical if they reference the same memory. `NaN` is identical to `NaN`;
   * `0` and `-0` are not identical.
   *
   * Note this is merely a curried version of ES6 `Object.is`.
   *
   * @func
   * @memberOf R
   * @since v0.15.0
   * @category Relation
   * @sig a -> a -> Boolean
   * @param {*} a
   * @param {*} b
   * @return {Boolean}
   * @example
   *
   *      const o = {};
   *      R.identical(o, o); //=> true
   *      R.identical(1, 1); //=> true
   *      R.identical(1, '1'); //=> false
   *      R.identical([], []); //=> false
   *      R.identical(0, -0); //=> false
   *      R.identical(NaN, NaN); //=> true
   */

  var identical = _curry2(_objectIs$1);

  /**
   * Creates a function that will process either the `onTrue` or the `onFalse`
   * function depending upon the result of the `condition` predicate.
   *
   * @func
   * @memberOf R
   * @since v0.8.0
   * @category Logic
   * @sig (*... -> Boolean) -> (*... -> *) -> (*... -> *) -> (*... -> *)
   * @param {Function} condition A predicate function
   * @param {Function} onTrue A function to invoke when the `condition` evaluates to a truthy value.
   * @param {Function} onFalse A function to invoke when the `condition` evaluates to a falsy value.
   * @return {Function} A new function that will process either the `onTrue` or the `onFalse`
   *                    function depending upon the result of the `condition` predicate.
   * @see R.unless, R.when, R.cond
   * @example
   *
   *      const incCount = R.ifElse(
   *        R.has('count'),
   *        R.over(R.lensProp('count'), R.inc),
   *        R.assoc('count', 1)
   *      );
   *      incCount({ count: 1 }); //=> { count: 2 }
   *      incCount({});           //=> { count: 1 }
   */

  var ifElse = _curry3(function ifElse(condition, onTrue, onFalse) {
    return curryN(Math.max(condition.length, onTrue.length, onFalse.length), function _ifElse() {
      return condition.apply(this, arguments) ? onTrue.apply(this, arguments) : onFalse.apply(this, arguments);
    });
  });

  /**
   * Increments its argument.
   *
   * @func
   * @memberOf R
   * @since v0.9.0
   * @category Math
   * @sig Number -> Number
   * @param {Number} n
   * @return {Number} n + 1
   * @see R.dec
   * @example
   *
   *      R.inc(42); //=> 43
   */

  var inc = add(1);

  /**
   * Returns `true` if the specified value is equal, in [`R.equals`](#equals)
   * terms, to at least one element of the given list; `false` otherwise.
   * Also works with strings.
   *
   * @func
   * @memberOf R
   * @since v0.26.0
   * @category List
   * @sig a -> [a] -> Boolean
   * @param {Object} a The item to compare against.
   * @param {Array} list The array to consider.
   * @return {Boolean} `true` if an equivalent item is in the list, `false` otherwise.
   * @see R.any
   * @example
   *
   *      R.includes(3, [1, 2, 3]); //=> true
   *      R.includes(4, [1, 2, 3]); //=> false
   *      R.includes({ name: 'Fred' }, [{ name: 'Fred' }]); //=> true
   *      R.includes([42], [[42]]); //=> true
   *      R.includes('ba', 'banana'); //=>true
   */

  var includes = _curry2(_includes);

  /**
   * Given a function that generates a key, turns a list of objects into an
   * object indexing the objects by the given key. Note that if multiple
   * objects generate the same value for the indexing key only the last value
   * will be included in the generated object.
   *
   * Acts as a transducer if a transformer is given in list position.
   *
   * @func
   * @memberOf R
   * @since v0.19.0
   * @category List
   * @typedefn Idx = String | Int | Symbol
   * @sig Idx a => (b -> a) -> [b] -> {a: b}
   * @param {Function} fn Function :: a -> Idx
   * @param {Array} array The array of objects to index
   * @return {Object} An object indexing each array element by the given property.
   * @see R.groupBy
   * @example
   *
   *      const list = [{id: 'xyz', title: 'A'}, {id: 'abc', title: 'B'}];
   *      R.indexBy(R.prop('id'), list);
   *      //=> {abc: {id: 'abc', title: 'B'}, xyz: {id: 'xyz', title: 'A'}}
   */

  var indexBy = reduceBy(function (acc, elem) {
    return elem;
  }, null);

  /**
   * Returns the position of the first occurrence of an item in an array, or -1
   * if the item is not included in the array. [`R.equals`](#equals) is used to
   * determine equality.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig a -> [a] -> Number
   * @param {*} target The item to find.
   * @param {Array} xs The array to search in.
   * @return {Number} the index of the target, or -1 if the target is not found.
   * @see R.lastIndexOf, R.findIndex
   * @example
   *
   *      R.indexOf(3, [1,2,3,4]); //=> 2
   *      R.indexOf(10, [1,2,3,4]); //=> -1
   */

  var indexOf = _curry2(function indexOf(target, xs) {
    return typeof xs.indexOf === 'function' && !_isArray(xs) ? xs.indexOf(target) : _indexOf(xs, target, 0);
  });

  /**
   * Returns all but the last element of the given list or string.
   *
   * @func
   * @memberOf R
   * @since v0.9.0
   * @category List
   * @sig [a] -> [a]
   * @sig String -> String
   * @param {*} list
   * @return {*}
   * @see R.last, R.head, R.tail
   * @example
   *
   *      R.init([1, 2, 3]);  //=> [1, 2]
   *      R.init([1, 2]);     //=> [1]
   *      R.init([1]);        //=> []
   *      R.init([]);         //=> []
   *
   *      R.init('abc');  //=> 'ab'
   *      R.init('ab');   //=> 'a'
   *      R.init('a');    //=> ''
   *      R.init('');     //=> ''
   */

  var init = slice(0, -1);

  /**
   * Takes a predicate `pred`, a list `xs`, and a list `ys`, and returns a list
   * `xs'` comprising each of the elements of `xs` which is equal to one or more
   * elements of `ys` according to `pred`.
   *
   * `pred` must be a binary function expecting an element from each list.
   *
   * `xs`, `ys`, and `xs'` are treated as sets, semantically, so ordering should
   * not be significant, but since `xs'` is ordered the implementation guarantees
   * that its values are in the same order as they appear in `xs`. Duplicates are
   * not removed, so `xs'` may contain duplicates if `xs` contains duplicates.
   *
   * @func
   * @memberOf R
   * @since v0.24.0
   * @category Relation
   * @sig ((a, b) -> Boolean) -> [a] -> [b] -> [a]
   * @param {Function} pred
   * @param {Array} xs
   * @param {Array} ys
   * @return {Array}
   * @see R.intersection
   * @example
   *
   *      R.innerJoin(
   *        (record, id) => record.id === id,
   *        [{id: 824, name: 'Richie Furay'},
   *         {id: 956, name: 'Dewey Martin'},
   *         {id: 313, name: 'Bruce Palmer'},
   *         {id: 456, name: 'Stephen Stills'},
   *         {id: 177, name: 'Neil Young'}],
   *        [177, 456, 999]
   *      );
   *      //=> [{id: 456, name: 'Stephen Stills'}, {id: 177, name: 'Neil Young'}]
   */

  var innerJoin = _curry3(function innerJoin(pred, xs, ys) {
    return _filter(function (x) {
      return _includesWith(pred, x, ys);
    }, xs);
  });

  /**
   * Inserts the supplied element into the list, at the specified `index`. _Note that

   * this is not destructive_: it returns a copy of the list with the changes.
   * <small>No lists have been harmed in the application of this function.</small>
   *
   * @func
   * @memberOf R
   * @since v0.2.2
   * @category List
   * @sig Number -> a -> [a] -> [a]
   * @param {Number} index The position to insert the element
   * @param {*} elt The element to insert into the Array
   * @param {Array} list The list to insert into
   * @return {Array} A new Array with `elt` inserted at `index`.
   * @example
   *
   *      R.insert(2, 'x', [1,2,3,4]); //=> [1,2,'x',3,4]
   */

  var insert = _curry3(function insert(idx, elt, list) {
    idx = idx < list.length && idx >= 0 ? idx : list.length;
    var result = Array.prototype.slice.call(list, 0);
    result.splice(idx, 0, elt);
    return result;
  });

  /**
   * Inserts the sub-list into the list, at the specified `index`. _Note that this is not
   * destructive_: it returns a copy of the list with the changes.
   * <small>No lists have been harmed in the application of this function.</small>
   *
   * @func
   * @memberOf R
   * @since v0.9.0
   * @category List
   * @sig Number -> [a] -> [a] -> [a]
   * @param {Number} index The position to insert the sub-list
   * @param {Array} elts The sub-list to insert into the Array
   * @param {Array} list The list to insert the sub-list into
   * @return {Array} A new Array with `elts` inserted starting at `index`.
   * @example
   *
   *      R.insertAll(2, ['x','y','z'], [1,2,3,4]); //=> [1,2,'x','y','z',3,4]
   */

  var insertAll = _curry3(function insertAll(idx, elts, list) {
    idx = idx < list.length && idx >= 0 ? idx : list.length;
    return [].concat(Array.prototype.slice.call(list, 0, idx), elts, Array.prototype.slice.call(list, idx));
  });

  function XUniqBy(f, xf) {
    this.xf = xf;
    this.f = f;
    this.set = new _Set();
  }

  XUniqBy.prototype['@@transducer/init'] = _xfBase.init;
  XUniqBy.prototype['@@transducer/result'] = _xfBase.result;

  XUniqBy.prototype['@@transducer/step'] = function (result, input) {
    return this.set.add(this.f(input)) ? this.xf['@@transducer/step'](result, input) : result;
  };

  var _xuniqBy = _curry2(function _xuniqBy(f, xf) {
    return new XUniqBy(f, xf);
  });

  /**
   * Returns a new list containing only one copy of each element in the original
   * list, based upon the value returned by applying the supplied function to
   * each list element. Prefers the first item if the supplied function produces
   * the same value on two items. [`R.equals`](#equals) is used for comparison.
   *
   * Acts as a transducer if a transformer is given in list position.
   *
   * @func
   * @memberOf R
   * @since v0.16.0
   * @category List
   * @sig (a -> b) -> [a] -> [a]
   * @param {Function} fn A function used to produce a value to use during comparisons.
   * @param {Array} list The array to consider.
   * @return {Array} The list of unique items.
   * @example
   *
   *      R.uniqBy(Math.abs, [-1, -5, 2, 10, 1, 2]); //=> [-1, -5, 2, 10]
   */

  var uniqBy = _curry2(_dispatchable([], _xuniqBy, function (fn, list) {
    var set = new _Set();
    var result = [];
    var idx = 0;
    var appliedItem, item;

    while (idx < list.length) {
      item = list[idx];
      appliedItem = fn(item);

      if (set.add(appliedItem)) {
        result.push(item);
      }

      idx += 1;
    }

    return result;
  }));

  /**
   * Returns a new list containing only one copy of each element in the original
   * list. [`R.equals`](#equals) is used to determine equality.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig [a] -> [a]
   * @param {Array} list The array to consider.
   * @return {Array} The list of unique items.
   * @example
   *
   *      R.uniq([1, 1, 2, 1]); //=> [1, 2]
   *      R.uniq([1, '1']);     //=> [1, '1']
   *      R.uniq([[42], [42]]); //=> [[42]]
   */

  var uniq = uniqBy(identity);

  /**
   * Combines two lists into a set (i.e. no duplicates) composed of those
   * elements common to both lists.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Relation
   * @sig [*] -> [*] -> [*]
   * @param {Array} list1 The first list.
   * @param {Array} list2 The second list.
   * @return {Array} The list of elements found in both `list1` and `list2`.
   * @see R.innerJoin
   * @example
   *
   *      R.intersection([1,2,3,4], [7,6,5,4,3]); //=> [4, 3]
   */

  var intersection = _curry2(function intersection(list1, list2) {
    var lookupList, filteredList;

    if (list1.length > list2.length) {
      lookupList = list1;
      filteredList = list2;
    } else {
      lookupList = list2;
      filteredList = list1;
    }

    return uniq(_filter(flip(_includes)(lookupList), filteredList));
  });

  /**
   * Creates a new list with the separator interposed between elements.
   *
   * Dispatches to the `intersperse` method of the second argument, if present.
   *
   * @func
   * @memberOf R
   * @since v0.14.0
   * @category List
   * @sig a -> [a] -> [a]
   * @param {*} separator The element to add to the list.
   * @param {Array} list The list to be interposed.
   * @return {Array} The new list.
   * @example
   *
   *      R.intersperse('a', ['b', 'n', 'n', 's']); //=> ['b', 'a', 'n', 'a', 'n', 'a', 's']
   */

  var intersperse = _curry2(_checkForMethod('intersperse', function intersperse(separator, list) {
    var out = [];
    var idx = 0;
    var length = list.length;

    while (idx < length) {
      if (idx === length - 1) {
        out.push(list[idx]);
      } else {
        out.push(list[idx], separator);
      }

      idx += 1;
    }

    return out;
  }));

  function _objectAssign(target) {
    if (target == null) {
      throw new TypeError('Cannot convert undefined or null to object');
    }

    var output = Object(target);
    var idx = 1;
    var length = arguments.length;

    while (idx < length) {
      var source = arguments[idx];

      if (source != null) {
        for (var nextKey in source) {
          if (_has(nextKey, source)) {
            output[nextKey] = source[nextKey];
          }
        }
      }

      idx += 1;
    }

    return output;
  }

  var _objectAssign$1 = typeof Object.assign === 'function' ? Object.assign : _objectAssign;

  /**
   * Creates an object containing a single key:value pair.
   *
   * @func
   * @memberOf R
   * @since v0.18.0
   * @category Object
   * @sig String -> a -> {String:a}
   * @param {String} key
   * @param {*} val
   * @return {Object}
   * @see R.pair
   * @example
   *
   *      const matchPhrases = R.compose(
   *        R.objOf('must'),
   *        R.map(R.objOf('match_phrase'))
   *      );
   *      matchPhrases(['foo', 'bar', 'baz']); //=> {must: [{match_phrase: 'foo'}, {match_phrase: 'bar'}, {match_phrase: 'baz'}]}
   */

  var objOf = _curry2(function objOf(key, val) {
    var obj = {};
    obj[key] = val;
    return obj;
  });

  var _stepCatArray = {
    '@@transducer/init': Array,
    '@@transducer/step': function transducerStep(xs, x) {
      xs.push(x);
      return xs;
    },
    '@@transducer/result': _identity
  };
  var _stepCatString = {
    '@@transducer/init': String,
    '@@transducer/step': function transducerStep(a, b) {
      return a + b;
    },
    '@@transducer/result': _identity
  };
  var _stepCatObject = {
    '@@transducer/init': Object,
    '@@transducer/step': function transducerStep(result, input) {
      return _objectAssign$1(result, _isArrayLike(input) ? objOf(input[0], input[1]) : input);
    },
    '@@transducer/result': _identity
  };
  function _stepCat(obj) {
    if (_isTransformer(obj)) {
      return obj;
    }

    if (_isArrayLike(obj)) {
      return _stepCatArray;
    }

    if (typeof obj === 'string') {
      return _stepCatString;
    }

    if (_typeof(obj) === 'object') {
      return _stepCatObject;
    }

    throw new Error('Cannot create transformer for ' + obj);
  }

  /**
   * Transforms the items of the list with the transducer and appends the
   * transformed items to the accumulator using an appropriate iterator function
   * based on the accumulator type.
   *
   * The accumulator can be an array, string, object or a transformer. Iterated
   * items will be appended to arrays and concatenated to strings. Objects will
   * be merged directly or 2-item arrays will be merged as key, value pairs.
   *
   * The accumulator can also be a transformer object that provides a 2-arity
   * reducing iterator function, step, 0-arity initial value function, init, and
   * 1-arity result extraction function result. The step function is used as the
   * iterator function in reduce. The result function is used to convert the
   * final accumulator into the return type and in most cases is R.identity. The
   * init function is used to provide the initial accumulator.
   *
   * The iteration is performed with [`R.reduce`](#reduce) after initializing the
   * transducer.
   *
   * @func
   * @memberOf R
   * @since v0.12.0
   * @category List
   * @sig a -> (b -> b) -> [c] -> a
   * @param {*} acc The initial accumulator value.
   * @param {Function} xf The transducer function. Receives a transformer and returns a transformer.
   * @param {Array} list The list to iterate over.
   * @return {*} The final, accumulated value.
   * @see R.transduce
   * @example
   *
   *      const numbers = [1, 2, 3, 4];
   *      const transducer = R.compose(R.map(R.add(1)), R.take(2));
   *
   *      R.into([], transducer, numbers); //=> [2, 3]
   *
   *      const intoArray = R.into([]);
   *      intoArray(transducer, numbers); //=> [2, 3]
   */

  var into = _curry3(function into(acc, xf, list) {
    return _isTransformer(acc) ? _reduce(xf(acc), acc['@@transducer/init'](), list) : _reduce(xf(_stepCat(acc)), _clone(acc, [], [], false), list);
  });

  /**
   * Same as [`R.invertObj`](#invertObj), however this accounts for objects with
   * duplicate values by putting the values into an array.
   *
   * @func
   * @memberOf R
   * @since v0.9.0
   * @category Object
   * @sig {s: x} -> {x: [ s, ... ]}
   * @param {Object} obj The object or array to invert
   * @return {Object} out A new object with keys in an array.
   * @see R.invertObj
   * @example
   *
   *      const raceResultsByFirstName = {
   *        first: 'alice',
   *        second: 'jake',
   *        third: 'alice',
   *      };
   *      R.invert(raceResultsByFirstName);
   *      //=> { 'alice': ['first', 'third'], 'jake':['second'] }
   */

  var invert = _curry1(function invert(obj) {
    var props = keys(obj);
    var len = props.length;
    var idx = 0;
    var out = {};

    while (idx < len) {
      var key = props[idx];
      var val = obj[key];
      var list = _has(val, out) ? out[val] : out[val] = [];
      list[list.length] = key;
      idx += 1;
    }

    return out;
  });

  /**
   * Returns a new object with the keys of the given object as values, and the
   * values of the given object, which are coerced to strings, as keys. Note
   * that the last key found is preferred when handling the same value.
   *
   * @func
   * @memberOf R
   * @since v0.9.0
   * @category Object
   * @sig {s: x} -> {x: s}
   * @param {Object} obj The object or array to invert
   * @return {Object} out A new object
   * @see R.invert
   * @example
   *
   *      const raceResults = {
   *        first: 'alice',
   *        second: 'jake'
   *      };
   *      R.invertObj(raceResults);
   *      //=> { 'alice': 'first', 'jake':'second' }
   *
   *      // Alternatively:
   *      const raceResults = ['alice', 'jake'];
   *      R.invertObj(raceResults);
   *      //=> { 'alice': '0', 'jake':'1' }
   */

  var invertObj = _curry1(function invertObj(obj) {
    var props = keys(obj);
    var len = props.length;
    var idx = 0;
    var out = {};

    while (idx < len) {
      var key = props[idx];
      out[obj[key]] = key;
      idx += 1;
    }

    return out;
  });

  /**
   * Turns a named method with a specified arity into a function that can be
   * called directly supplied with arguments and a target object.
   *
   * The returned function is curried and accepts `arity + 1` parameters where
   * the final parameter is the target object.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Function
   * @sig Number -> String -> (a -> b -> ... -> n -> Object -> *)
   * @param {Number} arity Number of arguments the returned function should take
   *        before the target object.
   * @param {String} method Name of any of the target object's methods to call.
   * @return {Function} A new curried function.
   * @see R.construct
   * @example
   *
   *      const sliceFrom = R.invoker(1, 'slice');
   *      sliceFrom(6, 'abcdefghijklm'); //=> 'ghijklm'
   *      const sliceFrom6 = R.invoker(2, 'slice')(6);
   *      sliceFrom6(8, 'abcdefghijklm'); //=> 'gh'
   *
   *      const dog = {
   *        speak: async () => 'Woof!'
   *      };
   *      const speak = R.invoker(0, 'speak');
   *      speak(dog).then(console.log) //~> 'Woof!'
   *
   * @symb R.invoker(0, 'method')(o) = o['method']()
   * @symb R.invoker(1, 'method')(a, o) = o['method'](a)
   * @symb R.invoker(2, 'method')(a, b, o) = o['method'](a, b)
   */

  var invoker = _curry2(function invoker(arity, method) {
    return curryN(arity + 1, function () {
      var target = arguments[arity];

      if (target != null && _isFunction(target[method])) {
        return target[method].apply(target, Array.prototype.slice.call(arguments, 0, arity));
      }

      throw new TypeError(toString$1(target) + ' does not have a method named "' + method + '"');
    });
  });

  /**
   * See if an object (i.e. `val`) is an instance of the supplied constructor. This
   * function will check up the inheritance chain, if any.
   * If `val` was created using `Object.create`, `R.is(Object, val) === true`.
   *
   * @func
   * @memberOf R
   * @since v0.3.0
   * @category Type
   * @sig (* -> {*}) -> a -> Boolean
   * @param {Object} ctor A constructor
   * @param {*} val The value to test
   * @return {Boolean}
   * @example
   *
   *      R.is(Object, {}); //=> true
   *      R.is(Number, 1); //=> true
   *      R.is(Object, 1); //=> false
   *      R.is(String, 's'); //=> true
   *      R.is(String, new String('')); //=> true
   *      R.is(Object, new String('')); //=> true
   *      R.is(Object, 's'); //=> false
   *      R.is(Number, {}); //=> false
   */

  var is = _curry2(function is(Ctor, val) {
    return val instanceof Ctor || val != null && (val.constructor === Ctor || Ctor.name === 'Object' && _typeof(val) === 'object');
  });

  /**
   * Returns `true` if the given value is its type's empty value; `false`
   * otherwise.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Logic
   * @sig a -> Boolean
   * @param {*} x
   * @return {Boolean}
   * @see R.empty
   * @example
   *
   *      R.isEmpty([1, 2, 3]);           //=> false
   *      R.isEmpty([]);                  //=> true
   *      R.isEmpty('');                  //=> true
   *      R.isEmpty(null);                //=> false
   *      R.isEmpty({});                  //=> true
   *      R.isEmpty({length: 0});         //=> false
   *      R.isEmpty(Uint8Array.from('')); //=> true
   */

  var isEmpty = _curry1(function isEmpty(x) {
    return x != null && equals(x, empty(x));
  });

  /**
   * Returns a string made by inserting the `separator` between each element and
   * concatenating all the elements into a single string.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig String -> [a] -> String
   * @param {Number|String} separator The string used to separate the elements.
   * @param {Array} xs The elements to join into a string.
   * @return {String} str The string made by concatenating `xs` with `separator`.
   * @see R.split
   * @example
   *
   *      const spacer = R.join(' ');
   *      spacer(['a', 2, 3.4]);   //=> 'a 2 3.4'
   *      R.join('|', [1, 2, 3]);    //=> '1|2|3'
   */

  var join = invoker(1, 'join');

  /**
   * juxt applies a list of functions to a list of values.
   *
   * @func
   * @memberOf R
   * @since v0.19.0
   * @category Function
   * @sig [(a, b, ..., m) -> n] -> ((a, b, ..., m) -> [n])
   * @param {Array} fns An array of functions
   * @return {Function} A function that returns a list of values after applying each of the original `fns` to its parameters.
   * @see R.applySpec
   * @example
   *
   *      const getRange = R.juxt([Math.min, Math.max]);
   *      getRange(3, 4, 9, -3); //=> [-3, 9]
   * @symb R.juxt([f, g, h])(a, b) = [f(a, b), g(a, b), h(a, b)]
   */

  var juxt = _curry1(function juxt(fns) {
    return converge(function () {
      return Array.prototype.slice.call(arguments, 0);
    }, fns);
  });

  /**
   * Returns a list containing the names of all the properties of the supplied
   * object, including prototype properties.
   * Note that the order of the output array is not guaranteed to be consistent
   * across different JS platforms.
   *
   * @func
   * @memberOf R
   * @since v0.2.0
   * @category Object
   * @sig {k: v} -> [k]
   * @param {Object} obj The object to extract properties from
   * @return {Array} An array of the object's own and prototype properties.
   * @see R.keys, R.valuesIn
   * @example
   *
   *      const F = function() { this.x = 'X'; };
   *      F.prototype.y = 'Y';
   *      const f = new F();
   *      R.keysIn(f); //=> ['x', 'y']
   */

  var keysIn = _curry1(function keysIn(obj) {
    var prop;
    var ks = [];

    for (prop in obj) {
      ks[ks.length] = prop;
    }

    return ks;
  });

  /**
   * Returns the position of the last occurrence of an item in an array, or -1 if
   * the item is not included in the array. [`R.equals`](#equals) is used to
   * determine equality.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig a -> [a] -> Number
   * @param {*} target The item to find.
   * @param {Array} xs The array to search in.
   * @return {Number} the index of the target, or -1 if the target is not found.
   * @see R.indexOf, R.findLastIndex
   * @example
   *
   *      R.lastIndexOf(3, [-1,3,3,0,1,2,3,4]); //=> 6
   *      R.lastIndexOf(10, [1,2,3,4]); //=> -1
   */

  var lastIndexOf = _curry2(function lastIndexOf(target, xs) {
    if (typeof xs.lastIndexOf === 'function' && !_isArray(xs)) {
      return xs.lastIndexOf(target);
    } else {
      var idx = xs.length - 1;

      while (idx >= 0) {
        if (equals(xs[idx], target)) {
          return idx;
        }

        idx -= 1;
      }

      return -1;
    }
  });

  function _isNumber(x) {
    return Object.prototype.toString.call(x) === '[object Number]';
  }

  /**
   * Returns the number of elements in the array by returning `list.length`.
   *
   * @func
   * @memberOf R
   * @since v0.3.0
   * @category List
   * @sig [a] -> Number
   * @param {Array} list The array to inspect.
   * @return {Number} The length of the array.
   * @example
   *
   *      R.length([]); //=> 0
   *      R.length([1, 2, 3]); //=> 3
   */

  var length = _curry1(function length(list) {
    return list != null && _isNumber(list.length) ? list.length : NaN;
  });

  /**
   * Returns a lens for the given getter and setter functions. The getter "gets"
   * the value of the focus; the setter "sets" the value of the focus. The setter
   * should not mutate the data structure.
   *
   * @func
   * @memberOf R
   * @since v0.8.0
   * @category Object
   * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
   * @sig (s -> a) -> ((a, s) -> s) -> Lens s a
   * @param {Function} getter
   * @param {Function} setter
   * @return {Lens}
   * @see R.view, R.set, R.over, R.lensIndex, R.lensProp
   * @example
   *
   *      const xLens = R.lens(R.prop('x'), R.assoc('x'));
   *
   *      R.view(xLens, {x: 1, y: 2});            //=> 1
   *      R.set(xLens, 4, {x: 1, y: 2});          //=> {x: 4, y: 2}
   *      R.over(xLens, R.negate, {x: 1, y: 2});  //=> {x: -1, y: 2}
   */

  var lens = _curry2(function lens(getter, setter) {
    return function (toFunctorFn) {
      return function (target) {
        return map(function (focus) {
          return setter(focus, target);
        }, toFunctorFn(getter(target)));
      };
    };
  });

  /**
   * Returns a new copy of the array with the element at the provided index
   * replaced with the given value.
   *
   * @func
   * @memberOf R
   * @since v0.14.0
   * @category List
   * @sig Number -> a -> [a] -> [a]
   * @param {Number} idx The index to update.
   * @param {*} x The value to exist at the given index of the returned array.
   * @param {Array|Arguments} list The source array-like object to be updated.
   * @return {Array} A copy of `list` with the value at index `idx` replaced with `x`.
   * @see R.adjust
   * @example
   *
   *      R.update(1, '_', ['a', 'b', 'c']);      //=> ['a', '_', 'c']
   *      R.update(-1, '_', ['a', 'b', 'c']);     //=> ['a', 'b', '_']
   * @symb R.update(-1, a, [b, c]) = [b, a]
   * @symb R.update(0, a, [b, c]) = [a, c]
   * @symb R.update(1, a, [b, c]) = [b, a]
   */

  var update = _curry3(function update(idx, x, list) {
    return adjust(idx, always(x), list);
  });

  /**
   * Returns a lens whose focus is the specified index.
   *
   * @func
   * @memberOf R
   * @since v0.14.0
   * @category Object
   * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
   * @sig Number -> Lens s a
   * @param {Number} n
   * @return {Lens}
   * @see R.view, R.set, R.over, R.nth
   * @example
   *
   *      const headLens = R.lensIndex(0);
   *
   *      R.view(headLens, ['a', 'b', 'c']);            //=> 'a'
   *      R.set(headLens, 'x', ['a', 'b', 'c']);        //=> ['x', 'b', 'c']
   *      R.over(headLens, R.toUpper, ['a', 'b', 'c']); //=> ['A', 'b', 'c']
   */

  var lensIndex = _curry1(function lensIndex(n) {
    return lens(nth(n), update(n));
  });

  /**
   * Retrieves the values at given paths of an object.
   *
   * @func
   * @memberOf R
   * @since v0.27.1
   * @category Object
   * @typedefn Idx = [String | Int | Symbol]
   * @sig [Idx] -> {a} -> [a | Undefined]
   * @param {Array} pathsArray The array of paths to be fetched.
   * @param {Object} obj The object to retrieve the nested properties from.
   * @return {Array} A list consisting of values at paths specified by "pathsArray".
   * @see R.path
   * @example
   *
   *      R.paths([['a', 'b'], ['p', 0, 'q']], {a: {b: 2}, p: [{q: 3}]}); //=> [2, 3]
   *      R.paths([['a', 'b'], ['p', 'r']], {a: {b: 2}, p: [{q: 3}]}); //=> [2, undefined]
   */

  var paths = _curry2(function paths(pathsArray, obj) {
    return pathsArray.map(function (paths) {
      var val = obj;
      var idx = 0;
      var p;

      while (idx < paths.length) {
        if (val == null) {
          return;
        }

        p = paths[idx];
        val = _isInteger(p) ? nth(p, val) : val[p];
        idx += 1;
      }

      return val;
    });
  });

  /**
   * Retrieve the value at a given path.
   *
   * @func
   * @memberOf R
   * @since v0.2.0
   * @category Object
   * @typedefn Idx = String | Int | Symbol
   * @sig [Idx] -> {a} -> a | Undefined
   * @param {Array} path The path to use.
   * @param {Object} obj The object to retrieve the nested property from.
   * @return {*} The data at `path`.
   * @see R.prop, R.nth
   * @example
   *
   *      R.path(['a', 'b'], {a: {b: 2}}); //=> 2
   *      R.path(['a', 'b'], {c: {b: 2}}); //=> undefined
   *      R.path(['a', 'b', 0], {a: {b: [1, 2, 3]}}); //=> 1
   *      R.path(['a', 'b', -2], {a: {b: [1, 2, 3]}}); //=> 2
   */

  var path = _curry2(function path(pathAr, obj) {
    return paths([pathAr], obj)[0];
  });

  /**
   * Returns a lens whose focus is the specified path.
   *
   * @func
   * @memberOf R
   * @since v0.19.0
   * @category Object
   * @typedefn Idx = String | Int | Symbol
   * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
   * @sig [Idx] -> Lens s a
   * @param {Array} path The path to use.
   * @return {Lens}
   * @see R.view, R.set, R.over
   * @example
   *
   *      const xHeadYLens = R.lensPath(['x', 0, 'y']);
   *
   *      R.view(xHeadYLens, {x: [{y: 2, z: 3}, {y: 4, z: 5}]});
   *      //=> 2
   *      R.set(xHeadYLens, 1, {x: [{y: 2, z: 3}, {y: 4, z: 5}]});
   *      //=> {x: [{y: 1, z: 3}, {y: 4, z: 5}]}
   *      R.over(xHeadYLens, R.negate, {x: [{y: 2, z: 3}, {y: 4, z: 5}]});
   *      //=> {x: [{y: -2, z: 3}, {y: 4, z: 5}]}
   */

  var lensPath = _curry1(function lensPath(p) {
    return lens(path(p), assocPath(p));
  });

  /**
   * Returns a lens whose focus is the specified property.
   *
   * @func
   * @memberOf R
   * @since v0.14.0
   * @category Object
   * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
   * @sig String -> Lens s a
   * @param {String} k
   * @return {Lens}
   * @see R.view, R.set, R.over
   * @example
   *
   *      const xLens = R.lensProp('x');
   *
   *      R.view(xLens, {x: 1, y: 2});            //=> 1
   *      R.set(xLens, 4, {x: 1, y: 2});          //=> {x: 4, y: 2}
   *      R.over(xLens, R.negate, {x: 1, y: 2});  //=> {x: -1, y: 2}
   */

  var lensProp = _curry1(function lensProp(k) {
    return lens(prop(k), assoc(k));
  });

  /**
   * Returns `true` if the first argument is less than the second; `false`
   * otherwise.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Relation
   * @sig Ord a => a -> a -> Boolean
   * @param {*} a
   * @param {*} b
   * @return {Boolean}
   * @see R.gt
   * @example
   *
   *      R.lt(2, 1); //=> false
   *      R.lt(2, 2); //=> false
   *      R.lt(2, 3); //=> true
   *      R.lt('a', 'z'); //=> true
   *      R.lt('z', 'a'); //=> false
   */

  var lt = _curry2(function lt(a, b) {
    return a < b;
  });

  /**
   * Returns `true` if the first argument is less than or equal to the second;
   * `false` otherwise.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Relation
   * @sig Ord a => a -> a -> Boolean
   * @param {Number} a
   * @param {Number} b
   * @return {Boolean}
   * @see R.gte
   * @example
   *
   *      R.lte(2, 1); //=> false
   *      R.lte(2, 2); //=> true
   *      R.lte(2, 3); //=> true
   *      R.lte('a', 'z'); //=> true
   *      R.lte('z', 'a'); //=> false
   */

  var lte = _curry2(function lte(a, b) {
    return a <= b;
  });

  /**
   * The `mapAccum` function behaves like a combination of map and reduce; it
   * applies a function to each element of a list, passing an accumulating
   * parameter from left to right, and returning a final value of this
   * accumulator together with the new list.
   *
   * The iterator function receives two arguments, *acc* and *value*, and should
   * return a tuple *[acc, value]*.
   *
   * @func
   * @memberOf R
   * @since v0.10.0
   * @category List
   * @sig ((acc, x) -> (acc, y)) -> acc -> [x] -> (acc, [y])
   * @param {Function} fn The function to be called on every element of the input `list`.
   * @param {*} acc The accumulator value.
   * @param {Array} list The list to iterate over.
   * @return {*} The final, accumulated value.
   * @see R.scan, R.addIndex, R.mapAccumRight
   * @example
   *
   *      const digits = ['1', '2', '3', '4'];
   *      const appender = (a, b) => [a + b, a + b];
   *
   *      R.mapAccum(appender, 0, digits); //=> ['01234', ['01', '012', '0123', '01234']]
   * @symb R.mapAccum(f, a, [b, c, d]) = [
   *   f(f(f(a, b)[0], c)[0], d)[0],
   *   [
   *     f(a, b)[1],
   *     f(f(a, b)[0], c)[1],
   *     f(f(f(a, b)[0], c)[0], d)[1]
   *   ]
   * ]
   */

  var mapAccum = _curry3(function mapAccum(fn, acc, list) {
    var idx = 0;
    var len = list.length;
    var result = [];
    var tuple = [acc];

    while (idx < len) {
      tuple = fn(tuple[0], list[idx]);
      result[idx] = tuple[1];
      idx += 1;
    }

    return [tuple[0], result];
  });

  /**
   * The `mapAccumRight` function behaves like a combination of map and reduce; it
   * applies a function to each element of a list, passing an accumulating
   * parameter from right to left, and returning a final value of this
   * accumulator together with the new list.
   *
   * Similar to [`mapAccum`](#mapAccum), except moves through the input list from
   * the right to the left.
   *
   * The iterator function receives two arguments, *acc* and *value*, and should
   * return a tuple *[acc, value]*.
   *
   * @func
   * @memberOf R
   * @since v0.10.0
   * @category List
   * @sig ((acc, x) -> (acc, y)) -> acc -> [x] -> (acc, [y])
   * @param {Function} fn The function to be called on every element of the input `list`.
   * @param {*} acc The accumulator value.
   * @param {Array} list The list to iterate over.
   * @return {*} The final, accumulated value.
   * @see R.addIndex, R.mapAccum
   * @example
   *
   *      const digits = ['1', '2', '3', '4'];
   *      const appender = (a, b) => [b + a, b + a];
   *
   *      R.mapAccumRight(appender, 5, digits); //=> ['12345', ['12345', '2345', '345', '45']]
   * @symb R.mapAccumRight(f, a, [b, c, d]) = [
   *   f(f(f(a, d)[0], c)[0], b)[0],
   *   [
   *     f(a, d)[1],
   *     f(f(a, d)[0], c)[1],
   *     f(f(f(a, d)[0], c)[0], b)[1]
   *   ]
   * ]
   */

  var mapAccumRight = _curry3(function mapAccumRight(fn, acc, list) {
    var idx = list.length - 1;
    var result = [];
    var tuple = [acc];

    while (idx >= 0) {
      tuple = fn(tuple[0], list[idx]);
      result[idx] = tuple[1];
      idx -= 1;
    }

    return [tuple[0], result];
  });

  /**
   * An Object-specific version of [`map`](#map). The function is applied to three
   * arguments: *(value, key, obj)*. If only the value is significant, use
   * [`map`](#map) instead.
   *
   * @func
   * @memberOf R
   * @since v0.9.0
   * @category Object
   * @sig ((*, String, Object) -> *) -> Object -> Object
   * @param {Function} fn
   * @param {Object} obj
   * @return {Object}
   * @see R.map
   * @example
   *
   *      const xyz = { x: 1, y: 2, z: 3 };
   *      const prependKeyAndDouble = (num, key, obj) => key + (num * 2);
   *
   *      R.mapObjIndexed(prependKeyAndDouble, xyz); //=> { x: 'x2', y: 'y4', z: 'z6' }
   */

  var mapObjIndexed = _curry2(function mapObjIndexed(fn, obj) {
    return _reduce(function (acc, key) {
      acc[key] = fn(obj[key], key, obj);
      return acc;
    }, {}, keys(obj));
  });

  /**
   * Tests a regular expression against a String. Note that this function will
   * return an empty array when there are no matches. This differs from
   * [`String.prototype.match`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match)
   * which returns `null` when there are no matches.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category String
   * @sig RegExp -> String -> [String | Undefined]
   * @param {RegExp} rx A regular expression.
   * @param {String} str The string to match against
   * @return {Array} The list of matches or empty array.
   * @see R.test
   * @example
   *
   *      R.match(/([a-z]a)/g, 'bananas'); //=> ['ba', 'na', 'na']
   *      R.match(/a/, 'b'); //=> []
   *      R.match(/a/, null); //=> TypeError: null does not have a method named "match"
   */

  var match = _curry2(function match(rx, str) {
    return str.match(rx) || [];
  });

  /**
   * `mathMod` behaves like the modulo operator should mathematically, unlike the
   * `%` operator (and by extension, [`R.modulo`](#modulo)). So while
   * `-17 % 5` is `-2`, `mathMod(-17, 5)` is `3`. `mathMod` requires Integer
   * arguments, and returns NaN when the modulus is zero or negative.
   *
   * @func
   * @memberOf R
   * @since v0.3.0
   * @category Math
   * @sig Number -> Number -> Number
   * @param {Number} m The dividend.
   * @param {Number} p the modulus.
   * @return {Number} The result of `b mod a`.
   * @see R.modulo
   * @example
   *
   *      R.mathMod(-17, 5);  //=> 3
   *      R.mathMod(17, 5);   //=> 2
   *      R.mathMod(17, -5);  //=> NaN
   *      R.mathMod(17, 0);   //=> NaN
   *      R.mathMod(17.2, 5); //=> NaN
   *      R.mathMod(17, 5.3); //=> NaN
   *
   *      const clock = R.mathMod(R.__, 12);
   *      clock(15); //=> 3
   *      clock(24); //=> 0
   *
   *      const seventeenMod = R.mathMod(17);
   *      seventeenMod(3);  //=> 2
   *      seventeenMod(4);  //=> 1
   *      seventeenMod(10); //=> 7
   */

  var mathMod = _curry2(function mathMod(m, p) {
    if (!_isInteger(m)) {
      return NaN;
    }

    if (!_isInteger(p) || p < 1) {
      return NaN;
    }

    return (m % p + p) % p;
  });

  /**
   * Takes a function and two values, and returns whichever value produces the
   * larger result when passed to the provided function.
   *
   * @func
   * @memberOf R
   * @since v0.8.0
   * @category Relation
   * @sig Ord b => (a -> b) -> a -> a -> a
   * @param {Function} f
   * @param {*} a
   * @param {*} b
   * @return {*}
   * @see R.max, R.minBy
   * @example
   *
   *      //  square :: Number -> Number
   *      const square = n => n * n;
   *
   *      R.maxBy(square, -3, 2); //=> -3
   *
   *      R.reduce(R.maxBy(square), 0, [3, -5, 4, 1, -2]); //=> -5
   *      R.reduce(R.maxBy(square), 0, []); //=> 0
   */

  var maxBy = _curry3(function maxBy(f, a, b) {
    return f(b) > f(a) ? b : a;
  });

  /**
   * Adds together all the elements of a list.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Math
   * @sig [Number] -> Number
   * @param {Array} list An array of numbers
   * @return {Number} The sum of all the numbers in the list.
   * @see R.reduce
   * @example
   *
   *      R.sum([2,4,6,8,100,1]); //=> 121
   */

  var sum = reduce(add, 0);

  /**
   * Returns the mean of the given list of numbers.
   *
   * @func
   * @memberOf R
   * @since v0.14.0
   * @category Math
   * @sig [Number] -> Number
   * @param {Array} list
   * @return {Number}
   * @see R.median
   * @example
   *
   *      R.mean([2, 7, 9]); //=> 6
   *      R.mean([]); //=> NaN
   */

  var mean = _curry1(function mean(list) {
    return sum(list) / list.length;
  });

  /**
   * Returns the median of the given list of numbers.
   *
   * @func
   * @memberOf R
   * @since v0.14.0
   * @category Math
   * @sig [Number] -> Number
   * @param {Array} list
   * @return {Number}
   * @see R.mean
   * @example
   *
   *      R.median([2, 9, 7]); //=> 7
   *      R.median([7, 2, 10, 9]); //=> 8
   *      R.median([]); //=> NaN
   */

  var median = _curry1(function median(list) {
    var len = list.length;

    if (len === 0) {
      return NaN;
    }

    var width = 2 - len % 2;
    var idx = (len - width) / 2;
    return mean(Array.prototype.slice.call(list, 0).sort(function (a, b) {
      return a < b ? -1 : a > b ? 1 : 0;
    }).slice(idx, idx + width));
  });

  /**
   * Creates a new function that, when invoked, caches the result of calling `fn`
   * for a given argument set and returns the result. Subsequent calls to the
   * memoized `fn` with the same argument set will not result in an additional
   * call to `fn`; instead, the cached result for that set of arguments will be
   * returned.
   *
   * Care must be taken when implementing key generation to avoid key collision,
   * or if tracking references, memory leaks and mutating arguments.
   *
   * @func
   * @memberOf R
   * @since v0.24.0
   * @category Function
   * @sig (*... -> String) -> (*... -> a) -> (*... -> a)
   * @param {Function} fn The function to generate the cache key.
   * @param {Function} fn The function to memoize.
   * @return {Function} Memoized version of `fn`.
   * @example
   *
   *      let count = 0;
   *      const factorial = R.memoizeWith(Number, n => {
   *        count += 1;
   *        return R.product(R.range(1, n + 1));
   *      });
   *      factorial(5); //=> 120
   *      factorial(5); //=> 120
   *      factorial(5); //=> 120
   *      count; //=> 1
   */

  var memoizeWith = _curry2(function memoizeWith(mFn, fn) {
    var cache = {};
    return _arity(fn.length, function () {
      var key = mFn.apply(this, arguments);

      if (!_has(key, cache)) {
        cache[key] = fn.apply(this, arguments);
      }

      return cache[key];
    });
  });

  /**
   * Creates one new object with the own properties from a list of objects.
   * If a key exists in more than one object, the value from the last
   * object it exists in will be used.
   *
   * @func
   * @memberOf R
   * @since v0.10.0
   * @category List
   * @sig [{k: v}] -> {k: v}
   * @param {Array} list An array of objects
   * @return {Object} A merged object.
   * @see R.reduce
   * @example
   *
   *      R.mergeAll([{foo:1},{bar:2},{baz:3}]); //=> {foo:1,bar:2,baz:3}
   *      R.mergeAll([{foo:1},{foo:2},{bar:2}]); //=> {foo:2,bar:2}
   * @symb R.mergeAll([{ x: 1 }, { y: 2 }, { z: 3 }]) = { x: 1, y: 2, z: 3 }
   */

  var mergeAll = _curry1(function mergeAll(list) {
    return _objectAssign$1.apply(null, [{}].concat(list));
  });

  /**
   * Creates a new object with the own properties of the two provided objects. If
   * a key exists in both objects, the provided function is applied to the key
   * and the values associated with the key in each object, with the result being
   * used as the value associated with the key in the returned object.
   *
   * @func
   * @memberOf R
   * @since v0.19.0
   * @category Object
   * @sig ((String, a, a) -> a) -> {a} -> {a} -> {a}
   * @param {Function} fn
   * @param {Object} l
   * @param {Object} r
   * @return {Object}
   * @see R.mergeDeepWithKey, R.merge, R.mergeWith
   * @example
   *
   *      let concatValues = (k, l, r) => k == 'values' ? R.concat(l, r) : r
   *      R.mergeWithKey(concatValues,
   *                     { a: true, thing: 'foo', values: [10, 20] },
   *                     { b: true, thing: 'bar', values: [15, 35] });
   *      //=> { a: true, b: true, thing: 'bar', values: [10, 20, 15, 35] }
   * @symb R.mergeWithKey(f, { x: 1, y: 2 }, { y: 5, z: 3 }) = { x: 1, y: f('y', 2, 5), z: 3 }
   */

  var mergeWithKey = _curry3(function mergeWithKey(fn, l, r) {
    var result = {};
    var k;

    for (k in l) {
      if (_has(k, l)) {
        result[k] = _has(k, r) ? fn(k, l[k], r[k]) : l[k];
      }
    }

    for (k in r) {
      if (_has(k, r) && !_has(k, result)) {
        result[k] = r[k];
      }
    }

    return result;
  });

  /**
   * Creates a new object with the own properties of the two provided objects.
   * If a key exists in both objects:
   * - and both associated values are also objects then the values will be
   *   recursively merged.
   * - otherwise the provided function is applied to the key and associated values
   *   using the resulting value as the new value associated with the key.
   * If a key only exists in one object, the value will be associated with the key
   * of the resulting object.
   *
   * @func
   * @memberOf R
   * @since v0.24.0
   * @category Object
   * @sig ((String, a, a) -> a) -> {a} -> {a} -> {a}
   * @param {Function} fn
   * @param {Object} lObj
   * @param {Object} rObj
   * @return {Object}
   * @see R.mergeWithKey, R.mergeDeepWith
   * @example
   *
   *      let concatValues = (k, l, r) => k == 'values' ? R.concat(l, r) : r
   *      R.mergeDeepWithKey(concatValues,
   *                         { a: true, c: { thing: 'foo', values: [10, 20] }},
   *                         { b: true, c: { thing: 'bar', values: [15, 35] }});
   *      //=> { a: true, b: true, c: { thing: 'bar', values: [10, 20, 15, 35] }}
   */

  var mergeDeepWithKey = _curry3(function mergeDeepWithKey(fn, lObj, rObj) {
    return mergeWithKey(function (k, lVal, rVal) {
      if (_isObject(lVal) && _isObject(rVal)) {
        return mergeDeepWithKey(fn, lVal, rVal);
      } else {
        return fn(k, lVal, rVal);
      }
    }, lObj, rObj);
  });

  /**
   * Creates a new object with the own properties of the first object merged with
   * the own properties of the second object. If a key exists in both objects:
   * - and both values are objects, the two values will be recursively merged
   * - otherwise the value from the first object will be used.
   *
   * @func
   * @memberOf R
   * @since v0.24.0
   * @category Object
   * @sig {a} -> {a} -> {a}
   * @param {Object} lObj
   * @param {Object} rObj
   * @return {Object}
   * @see R.merge, R.mergeDeepRight, R.mergeDeepWith, R.mergeDeepWithKey
   * @example
   *
   *      R.mergeDeepLeft({ name: 'fred', age: 10, contact: { email: 'moo@example.com' }},
   *                      { age: 40, contact: { email: 'baa@example.com' }});
   *      //=> { name: 'fred', age: 10, contact: { email: 'moo@example.com' }}
   */

  var mergeDeepLeft = _curry2(function mergeDeepLeft(lObj, rObj) {
    return mergeDeepWithKey(function (k, lVal, rVal) {
      return lVal;
    }, lObj, rObj);
  });

  /**
   * Creates a new object with the own properties of the first object merged with
   * the own properties of the second object. If a key exists in both objects:
   * - and both values are objects, the two values will be recursively merged
   * - otherwise the value from the second object will be used.
   *
   * @func
   * @memberOf R
   * @since v0.24.0
   * @category Object
   * @sig {a} -> {a} -> {a}
   * @param {Object} lObj
   * @param {Object} rObj
   * @return {Object}
   * @see R.merge, R.mergeDeepLeft, R.mergeDeepWith, R.mergeDeepWithKey
   * @example
   *
   *      R.mergeDeepRight({ name: 'fred', age: 10, contact: { email: 'moo@example.com' }},
   *                       { age: 40, contact: { email: 'baa@example.com' }});
   *      //=> { name: 'fred', age: 40, contact: { email: 'baa@example.com' }}
   */

  var mergeDeepRight = _curry2(function mergeDeepRight(lObj, rObj) {
    return mergeDeepWithKey(function (k, lVal, rVal) {
      return rVal;
    }, lObj, rObj);
  });

  /**
   * Creates a new object with the own properties of the two provided objects.
   * If a key exists in both objects:
   * - and both associated values are also objects then the values will be
   *   recursively merged.
   * - otherwise the provided function is applied to associated values using the
   *   resulting value as the new value associated with the key.
   * If a key only exists in one object, the value will be associated with the key
   * of the resulting object.
   *
   * @func
   * @memberOf R
   * @since v0.24.0
   * @category Object
   * @sig ((a, a) -> a) -> {a} -> {a} -> {a}
   * @param {Function} fn
   * @param {Object} lObj
   * @param {Object} rObj
   * @return {Object}
   * @see R.mergeWith, R.mergeDeepWithKey
   * @example
   *
   *      R.mergeDeepWith(R.concat,
   *                      { a: true, c: { values: [10, 20] }},
   *                      { b: true, c: { values: [15, 35] }});
   *      //=> { a: true, b: true, c: { values: [10, 20, 15, 35] }}
   */

  var mergeDeepWith = _curry3(function mergeDeepWith(fn, lObj, rObj) {
    return mergeDeepWithKey(function (k, lVal, rVal) {
      return fn(lVal, rVal);
    }, lObj, rObj);
  });

  /**
   * Create a new object with the own properties of the first object merged with
   * the own properties of the second object. If a key exists in both objects,
   * the value from the first object will be used.
   *
   * @func
   * @memberOf R
   * @since v0.26.0
   * @category Object
   * @sig {k: v} -> {k: v} -> {k: v}
   * @param {Object} l
   * @param {Object} r
   * @return {Object}
   * @see R.mergeRight, R.mergeDeepLeft, R.mergeWith, R.mergeWithKey
   * @example
   *
   *      R.mergeLeft({ 'age': 40 }, { 'name': 'fred', 'age': 10 });
   *      //=> { 'name': 'fred', 'age': 40 }
   *
   *      const resetToDefault = R.mergeLeft({x: 0});
   *      resetToDefault({x: 5, y: 2}); //=> {x: 0, y: 2}
   * @symb R.mergeLeft(a, b) = {...b, ...a}
   */

  var mergeLeft = _curry2(function mergeLeft(l, r) {
    return _objectAssign$1({}, r, l);
  });

  /**
   * Create a new object with the own properties of the first object merged with
   * the own properties of the second object. If a key exists in both objects,
   * the value from the second object will be used.
   *
   * @func
   * @memberOf R
   * @since v0.26.0
   * @category Object
   * @sig {k: v} -> {k: v} -> {k: v}
   * @param {Object} l
   * @param {Object} r
   * @return {Object}
   * @see R.mergeLeft, R.mergeDeepRight, R.mergeWith, R.mergeWithKey
   * @example
   *
   *      R.mergeRight({ 'name': 'fred', 'age': 10 }, { 'age': 40 });
   *      //=> { 'name': 'fred', 'age': 40 }
   *
   *      const withDefaults = R.mergeRight({x: 0, y: 0});
   *      withDefaults({y: 2}); //=> {x: 0, y: 2}
   * @symb R.mergeRight(a, b) = {...a, ...b}
   */

  var mergeRight = _curry2(function mergeRight(l, r) {
    return _objectAssign$1({}, l, r);
  });

  /**
   * Creates a new object with the own properties of the two provided objects. If
   * a key exists in both objects, the provided function is applied to the values
   * associated with the key in each object, with the result being used as the
   * value associated with the key in the returned object.
   *
   * @func
   * @memberOf R
   * @since v0.19.0
   * @category Object
   * @sig ((a, a) -> a) -> {a} -> {a} -> {a}
   * @param {Function} fn
   * @param {Object} l
   * @param {Object} r
   * @return {Object}
   * @see R.mergeDeepWith, R.merge, R.mergeWithKey
   * @example
   *
   *      R.mergeWith(R.concat,
   *                  { a: true, values: [10, 20] },
   *                  { b: true, values: [15, 35] });
   *      //=> { a: true, b: true, values: [10, 20, 15, 35] }
   */

  var mergeWith = _curry3(function mergeWith(fn, l, r) {
    return mergeWithKey(function (_, _l, _r) {
      return fn(_l, _r);
    }, l, r);
  });

  /**
   * Returns the smaller of its two arguments.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Relation
   * @sig Ord a => a -> a -> a
   * @param {*} a
   * @param {*} b
   * @return {*}
   * @see R.minBy, R.max
   * @example
   *
   *      R.min(789, 123); //=> 123
   *      R.min('a', 'b'); //=> 'a'
   */

  var min = _curry2(function min(a, b) {
    return b < a ? b : a;
  });

  /**
   * Takes a function and two values, and returns whichever value produces the
   * smaller result when passed to the provided function.
   *
   * @func
   * @memberOf R
   * @since v0.8.0
   * @category Relation
   * @sig Ord b => (a -> b) -> a -> a -> a
   * @param {Function} f
   * @param {*} a
   * @param {*} b
   * @return {*}
   * @see R.min, R.maxBy
   * @example
   *
   *      //  square :: Number -> Number
   *      const square = n => n * n;
   *
   *      R.minBy(square, -3, 2); //=> 2
   *
   *      R.reduce(R.minBy(square), Infinity, [3, -5, 4, 1, -2]); //=> 1
   *      R.reduce(R.minBy(square), Infinity, []); //=> Infinity
   */

  var minBy = _curry3(function minBy(f, a, b) {
    return f(b) < f(a) ? b : a;
  });

  /**
   * Makes a shallow clone of an object, applying the given fn to the specified
   * property with the given value. Note that this copies and flattens prototype
   * properties onto the new object as well. All non-primitive properties are
   * copied by reference.
   *
   * @private
   * @param {String|Number} prop The property name to set
   * @param {Function} fn The function to apply to the property
   * @param {Object|Array} obj The object to clone
   * @return {Object|Array} A new object equivalent to the original except for the changed property.
   */

  function _modify(prop, fn, obj) {
    if (_isInteger(prop) && _isArray(obj)) {
      var arr = [].concat(obj);
      arr[prop] = fn(arr[prop]);
      return arr;
    }

    var result = {};

    for (var p in obj) {
      result[p] = obj[p];
    }

    result[prop] = fn(result[prop]);
    return result;
  }

  /**
   * Creates a shallow clone of the passed object by applying an `fn` function
   * to the value at the given path.
   *
   * The function will not be invoked, and the object will not change
   * if its corresponding path does not exist in the object.
   * All non-primitive properties are copied to the new object by reference.
   *
   * @func
   * @memberOf R
   * @since v0.28.0
   * @category Object
   * @sig [Idx] -> (v -> v) -> {k: v} -> {k: v}
   * @param {Array} path The path to be modified.
   * @param {Function} fn The function to apply to the path.
   * @param {Object} object The object to be transformed.
   * @return {Object} The transformed object.
   * @example
   *
   *      const person = {name: 'James', address: { zipCode: '90216' }};
   *      R.modifyPath(['address', 'zipCode'], R.reverse, person); //=> {name: 'James', address: { zipCode: '61209' }}
   *
   *      // Can handle arrays too
   *      const person = {name: 'James', addresses: [{ zipCode: '90216' }]};
   *      R.modifyPath(['addresses', 0, 'zipCode'], R.reverse, person); //=> {name: 'James', addresses: [{ zipCode: '61209' }]}
   */

  var modifyPath = _curry3(function modifyPath(path, fn, object) {
    if (!_isObject(object) && !_isArray(object) || path.length === 0) {
      return object;
    }

    var idx = path[0];

    if (!_has(idx, object)) {
      return object;
    }

    if (path.length === 1) {
      return _modify(idx, fn, object);
    }

    var val = modifyPath(Array.prototype.slice.call(path, 1), fn, object[idx]);

    if (val === object[idx]) {
      return object;
    }

    return _assoc(idx, val, object);
  });

  /**
   * Creates a copy of the passed object by applying an `fn` function to the given `prop` property.
   *
   * The function will not be invoked, and the object will not change
   * if its corresponding property does not exist in the object.
   * All non-primitive properties are copied to the new object by reference.
   *
   * @func
   * @memberOf R
   * @since v0.28.0
   * @category Object
   * @sig Idx -> (v -> v) -> {k: v} -> {k: v}
   * @param {String|Number} prop The property to be modified.
   * @param {Function} fn The function to apply to the property.
   * @param {Object} object The object to be transformed.
   * @return {Object} The transformed object.
   * @example
   *
   *      const person = {name: 'James', age: 20, pets: ['dog', 'cat']};
   *      R.modify('age', R.add(1), person); //=> {name: 'James', age: 21, pets: ['dog', 'cat']}
   *      R.modify('pets', R.append('turtle'), person); //=> {name: 'James', age: 20, pets: ['dog', 'cat', 'turtle']}
   */

  var modify = _curry3(function modify(prop, fn, object) {
    return modifyPath([prop], fn, object);
  });

  /**
   * Divides the first parameter by the second and returns the remainder. Note
   * that this function preserves the JavaScript-style behavior for modulo. For
   * mathematical modulo see [`mathMod`](#mathMod).
   *
   * @func
   * @memberOf R
   * @since v0.1.1
   * @category Math
   * @sig Number -> Number -> Number
   * @param {Number} a The value to the divide.
   * @param {Number} b The pseudo-modulus
   * @return {Number} The result of `b % a`.
   * @see R.mathMod
   * @example
   *
   *      R.modulo(17, 3); //=> 2
   *      // JS behavior:
   *      R.modulo(-17, 3); //=> -2
   *      R.modulo(17, -3); //=> 2
   *
   *      const isOdd = R.modulo(R.__, 2);
   *      isOdd(42); //=> 0
   *      isOdd(21); //=> 1
   */

  var modulo = _curry2(function modulo(a, b) {
    return a % b;
  });

  /**
   * Move an item, at index `from`, to index `to`, in a list of elements.
   * A new list will be created containing the new elements order.
   *
   * @func
   * @memberOf R
   * @since v0.27.1
   * @category List
   * @sig Number -> Number -> [a] -> [a]
   * @param {Number} from The source index
   * @param {Number} to The destination index
   * @param {Array} list The list which will serve to realise the move
   * @return {Array} The new list reordered
   * @example
   *
   *      R.move(0, 2, ['a', 'b', 'c', 'd', 'e', 'f']); //=> ['b', 'c', 'a', 'd', 'e', 'f']
   *      R.move(-1, 0, ['a', 'b', 'c', 'd', 'e', 'f']); //=> ['f', 'a', 'b', 'c', 'd', 'e'] list rotation
   */

  var move = _curry3(function (from, to, list) {
    var length = list.length;
    var result = list.slice();
    var positiveFrom = from < 0 ? length + from : from;
    var positiveTo = to < 0 ? length + to : to;
    var item = result.splice(positiveFrom, 1);
    return positiveFrom < 0 || positiveFrom >= list.length || positiveTo < 0 || positiveTo >= list.length ? list : [].concat(result.slice(0, positiveTo)).concat(item).concat(result.slice(positiveTo, list.length));
  });

  /**
   * Multiplies two numbers. Equivalent to `a * b` but curried.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Math
   * @sig Number -> Number -> Number
   * @param {Number} a The first value.
   * @param {Number} b The second value.
   * @return {Number} The result of `a * b`.
   * @see R.divide
   * @example
   *
   *      const double = R.multiply(2);
   *      const triple = R.multiply(3);
   *      double(3);       //=>  6
   *      triple(4);       //=> 12
   *      R.multiply(2, 5);  //=> 10
   */

  var multiply = _curry2(function multiply(a, b) {
    return a * b;
  });

  var _this = undefined;
  /**
   * Takes a function `f` and an object, and returns a function `g`.
   * When applied, `g` returns the result of applying `f` to the object
   * provided initially merged deeply (right) with the object provided as an argument to `g`.
   *
   * @func
   * @memberOf R
   * @since v0.28.0
   * @category Function
   * @sig (({ a, b, c, ..., n }) -> x) -> { a, b, c, ...} -> ({ d, e, f, ..., n } -> x)
   * @param {Function} f
   * @param {Object} props
   * @return {Function}
   * @see R.partial, R.partialRight, R.curry, R.mergeDeepRight
   * @example
   *
   *      const multiply2 = ({ a, b }) => a * b;
   *      const double = R.partialObject(multiply2, { a: 2 });
   *      double({ b: 2 }); //=> 4
   *
   *      const greet = ({ salutation, title, firstName, lastName }) =>
   *        salutation + ', ' + title + ' ' + firstName + ' ' + lastName + '!';
   *
   *      const sayHello = R.partialObject(greet, { salutation: 'Hello' });
   *      const sayHelloToMs = R.partialObject(sayHello, { title: 'Ms.' });
   *      sayHelloToMs({ firstName: 'Jane', lastName: 'Jones' }); //=> 'Hello, Ms. Jane Jones!'
   * @symb R.partialObject(f, { a, b })({ c, d }) = f({ a, b, c, d })
   */

  var partialObject = _curry2(function (f, o) {
    return function (props) {
      return f.call(_this, mergeDeepRight(o, props));
    };
  });

  /**
   * Negates its argument.
   *
   * @func
   * @memberOf R
   * @since v0.9.0
   * @category Math
   * @sig Number -> Number
   * @param {Number} n
   * @return {Number}
   * @example
   *
   *      R.negate(42); //=> -42
   */

  var negate = _curry1(function negate(n) {
    return -n;
  });

  /**
   * Returns `true` if no elements of the list match the predicate, `false`
   * otherwise.
   *
   * Dispatches to the `all` method of the second argument, if present.
   *
   * Acts as a transducer if a transformer is given in list position.
   *
   * @func
   * @memberOf R
   * @since v0.12.0
   * @category List
   * @sig (a -> Boolean) -> [a] -> Boolean
   * @param {Function} fn The predicate function.
   * @param {Array} list The array to consider.
   * @return {Boolean} `true` if the predicate is not satisfied by every element, `false` otherwise.
   * @see R.all, R.any
   * @example
   *
   *      const isEven = n => n % 2 === 0;
   *      const isOdd = n => n % 2 !== 0;
   *
   *      R.none(isEven, [1, 3, 5, 7, 9, 11]); //=> true
   *      R.none(isOdd, [1, 3, 5, 7, 8, 11]); //=> false
   */

  var none = _curry2(function none(fn, input) {
    return all(_complement(fn), input);
  });

  /**
   * Returns a function which returns its nth argument.
   *
   * @func
   * @memberOf R
   * @since v0.9.0
   * @category Function
   * @sig Number -> *... -> *
   * @param {Number} n
   * @return {Function}
   * @example
   *
   *      R.nthArg(1)('a', 'b', 'c'); //=> 'b'
   *      R.nthArg(-1)('a', 'b', 'c'); //=> 'c'
   * @symb R.nthArg(-1)(a, b, c) = c
   * @symb R.nthArg(0)(a, b, c) = a
   * @symb R.nthArg(1)(a, b, c) = b
   */

  var nthArg = _curry1(function nthArg(n) {
    var arity = n < 0 ? 1 : n + 1;
    return curryN(arity, function () {
      return nth(n, arguments);
    });
  });

  /**
   * `o` is a curried composition function that returns a unary function.
   * Like [`compose`](#compose), `o` performs right-to-left function composition.
   * Unlike [`compose`](#compose), the rightmost function passed to `o` will be
   * invoked with only one argument. Also, unlike [`compose`](#compose), `o` is
   * limited to accepting only 2 unary functions. The name o was chosen because
   * of its similarity to the mathematical composition operator ∘.
   *
   * @func
   * @memberOf R
   * @since v0.24.0
   * @category Function
   * @sig (b -> c) -> (a -> b) -> a -> c
   * @param {Function} f
   * @param {Function} g
   * @return {Function}
   * @see R.compose, R.pipe
   * @example
   *
   *      const classyGreeting = name => "The name's " + name.last + ", " + name.first + " " + name.last
   *      const yellGreeting = R.o(R.toUpper, classyGreeting);
   *      yellGreeting({first: 'James', last: 'Bond'}); //=> "THE NAME'S BOND, JAMES BOND"
   *
   *      R.o(R.multiply(10), R.add(10))(-4) //=> 60
   *
   * @symb R.o(f, g, x) = f(g(x))
   */

  var o = _curry3(function o(f, g, x) {
    return f(g(x));
  });

  function _of(x) {
    return [x];
  }

  /**
   * Returns a singleton array containing the value provided.
   *
   * Note this `of` is different from the ES6 `of`; See
   * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/of
   *
   * @func
   * @memberOf R
   * @since v0.3.0
   * @category Function
   * @sig a -> [a]
   * @param {*} x any value
   * @return {Array} An array wrapping `x`.
   * @example
   *
   *      R.of(null); //=> [null]
   *      R.of([42]); //=> [[42]]
   */

  var of = _curry1(_of);

  /**
   * Returns a partial copy of an object omitting the keys specified.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Object
   * @sig [String] -> {String: *} -> {String: *}
   * @param {Array} names an array of String property names to omit from the new object
   * @param {Object} obj The object to copy from
   * @return {Object} A new object with properties from `names` not on it.
   * @see R.pick
   * @example
   *
   *      R.omit(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, c: 3}
   */

  var omit = _curry2(function omit(names, obj) {
    var result = {};
    var index = {};
    var idx = 0;
    var len = names.length;

    while (idx < len) {
      index[names[idx]] = 1;
      idx += 1;
    }

    for (var prop in obj) {
      if (!index.hasOwnProperty(prop)) {
        result[prop] = obj[prop];
      }
    }

    return result;
  });

  /**
   * Takes a binary function `f`, a unary function `g`, and two values.
   * Applies `g` to each value, then applies the result of each to `f`.
   *
   * Also known as the P combinator.
   *
   * @func
   * @memberOf R
   * @since v0.28.0
   * @category Function
   * @sig ((a, a) -> b) -> (c -> a) -> c -> c -> b
   * @param {Function} f a binary function
   * @param {Function} g a unary function
   * @param {any} a any value
   * @param {any} b any value
   * @return {any} The result of `f`
   * @example
   *
   *      const eqBy = R.on((a, b) => a === b);
   *      eqBy(R.prop('a'), {b:0, a:1}, {a:1}) //=> true;
   *
   *      const containsInsensitive = R.on(R.contains, R.toLower);
   *      containsInsensitive('o', 'FOO'); //=> true
   * @symb R.on(f, g, a, b) = f(g(a), g(b))
   */

  var on = _curryN(4, [], function on(f, g, a, b) {
    return f(g(a), g(b));
  });

  /**
   * Accepts a function `fn` and returns a function that guards invocation of
   * `fn` such that `fn` can only ever be called once, no matter how many times
   * the returned function is invoked. The first value calculated is returned in
   * subsequent invocations.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Function
   * @sig (a... -> b) -> (a... -> b)
   * @param {Function} fn The function to wrap in a call-only-once wrapper.
   * @return {Function} The wrapped function.
   * @example
   *
   *      const addOneOnce = R.once(x => x + 1);
   *      addOneOnce(10); //=> 11
   *      addOneOnce(addOneOnce(50)); //=> 11
   */

  var once = _curry1(function once(fn) {
    var called = false;
    var result;
    return _arity(fn.length, function () {
      if (called) {
        return result;
      }

      called = true;
      result = fn.apply(this, arguments);
      return result;
    });
  });

  function _assertPromise(name, p) {
    if (p == null || !_isFunction(p.then)) {
      throw new TypeError('`' + name + '` expected a Promise, received ' + _toString(p, []));
    }
  }

  /**
   * Returns the result of applying the onFailure function to the value inside
   * a failed promise. This is useful for handling rejected promises
   * inside function compositions.
   *
   * @func
   * @memberOf R
   * @since v0.26.0
   * @category Function
   * @sig (e -> b) -> (Promise e a) -> (Promise e b)
   * @sig (e -> (Promise f b)) -> (Promise e a) -> (Promise f b)
   * @param {Function} onFailure The function to apply. Can return a value or a promise of a value.
   * @param {Promise} p
   * @return {Promise} The result of calling `p.then(null, onFailure)`
   * @see R.andThen
   * @example
   *
   *      const failedFetch = id => Promise.reject('bad ID');
   *      const useDefault = () => ({ firstName: 'Bob', lastName: 'Loblaw' });
   *
   *      //recoverFromFailure :: String -> Promise ({ firstName, lastName })
   *      const recoverFromFailure = R.pipe(
   *        failedFetch,
   *        R.otherwise(useDefault),
   *        R.andThen(R.pick(['firstName', 'lastName'])),
   *      );
   *      recoverFromFailure(12345).then(console.log);
   */

  var otherwise = _curry2(function otherwise(f, p) {
    _assertPromise('otherwise', p);

    return p.then(null, f);
  });

  // transforms the held value with the provided function.

  var Identity = function Identity(x) {
    return {
      value: x,
      map: function map(f) {
        return Identity(f(x));
      }
    };
  };
  /**
   * Returns the result of "setting" the portion of the given data structure
   * focused by the given lens to the result of applying the given function to
   * the focused value.
   *
   * @func
   * @memberOf R
   * @since v0.16.0
   * @category Object
   * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
   * @sig Lens s a -> (a -> a) -> s -> s
   * @param {Lens} lens
   * @param {*} v
   * @param {*} x
   * @return {*}
   * @see R.view, R.set, R.lens, R.lensIndex, R.lensProp, R.lensPath
   * @example
   *
   *      const headLens = R.lensIndex(0);
   *
   *      R.over(headLens, R.toUpper, ['foo', 'bar', 'baz']); //=> ['FOO', 'bar', 'baz']
   */


  var over = _curry3(function over(lens, f, x) {
    // The value returned by the getter function is first transformed with `f`,
    // then set as the value of an `Identity`. This is then mapped over with the
    // setter function of the lens.
    return lens(function (y) {
      return Identity(f(y));
    })(x).value;
  });

  /**
   * Takes two arguments, `fst` and `snd`, and returns `[fst, snd]`.
   *
   * @func
   * @memberOf R
   * @since v0.18.0
   * @category List
   * @sig a -> b -> (a,b)
   * @param {*} fst
   * @param {*} snd
   * @return {Array}
   * @see R.objOf, R.of
   * @example
   *
   *      R.pair('foo', 'bar'); //=> ['foo', 'bar']
   */

  var pair = _curry2(function pair(fst, snd) {
    return [fst, snd];
  });

  function _createPartialApplicator(concat) {
    return _curry2(function (fn, args) {
      return _arity(Math.max(0, fn.length - args.length), function () {
        return fn.apply(this, concat(args, arguments));
      });
    });
  }

  /**
   * Takes a function `f` and a list of arguments, and returns a function `g`.
   * When applied, `g` returns the result of applying `f` to the arguments
   * provided initially followed by the arguments provided to `g`.
   *
   * @func
   * @memberOf R
   * @since v0.10.0
   * @category Function
   * @sig ((a, b, c, ..., n) -> x) -> [a, b, c, ...] -> ((d, e, f, ..., n) -> x)
   * @param {Function} f
   * @param {Array} args
   * @return {Function}
   * @see R.partialRight, R.curry
   * @example
   *
   *      const multiply2 = (a, b) => a * b;
   *      const double = R.partial(multiply2, [2]);
   *      double(3); //=> 6
   *
   *      const greet = (salutation, title, firstName, lastName) =>
   *        salutation + ', ' + title + ' ' + firstName + ' ' + lastName + '!';
   *
   *      const sayHello = R.partial(greet, ['Hello']);
   *      const sayHelloToMs = R.partial(sayHello, ['Ms.']);
   *      sayHelloToMs('Jane', 'Jones'); //=> 'Hello, Ms. Jane Jones!'
   * @symb R.partial(f, [a, b])(c, d) = f(a, b, c, d)
   */

  var partial = _createPartialApplicator(_concat);

  /**
   * Takes a function `f` and a list of arguments, and returns a function `g`.
   * When applied, `g` returns the result of applying `f` to the arguments
   * provided to `g` followed by the arguments provided initially.
   *
   * @func
   * @memberOf R
   * @since v0.10.0
   * @category Function
   * @sig ((a, b, c, ..., n) -> x) -> [d, e, f, ..., n] -> ((a, b, c, ...) -> x)
   * @param {Function} f
   * @param {Array} args
   * @return {Function}
   * @see R.partial
   * @example
   *
   *      const greet = (salutation, title, firstName, lastName) =>
   *        salutation + ', ' + title + ' ' + firstName + ' ' + lastName + '!';
   *
   *      const greetMsJaneJones = R.partialRight(greet, ['Ms.', 'Jane', 'Jones']);
   *
   *      greetMsJaneJones('Hello'); //=> 'Hello, Ms. Jane Jones!'
   * @symb R.partialRight(f, [a, b])(c, d) = f(c, d, a, b)
   */

  var partialRight = _createPartialApplicator(flip(_concat));

  /**
   * Takes a predicate and a list or other `Filterable` object and returns the
   * pair of filterable objects of the same type of elements which do and do not
   * satisfy, the predicate, respectively. Filterable objects include plain objects or any object
   * that has a filter method such as `Array`.
   *
   * @func
   * @memberOf R
   * @since v0.1.4
   * @category List
   * @sig Filterable f => (a -> Boolean) -> f a -> [f a, f a]
   * @param {Function} pred A predicate to determine which side the element belongs to.
   * @param {Array} filterable the list (or other filterable) to partition.
   * @return {Array} An array, containing first the subset of elements that satisfy the
   *         predicate, and second the subset of elements that do not satisfy.
   * @see R.filter, R.reject
   * @example
   *
   *      R.partition(R.includes('s'), ['sss', 'ttt', 'foo', 'bars']);
   *      // => [ [ 'sss', 'bars' ],  [ 'ttt', 'foo' ] ]
   *
   *      R.partition(R.includes('s'), { a: 'sss', b: 'ttt', foo: 'bars' });
   *      // => [ { a: 'sss', foo: 'bars' }, { b: 'ttt' }  ]
   */

  var partition = juxt([filter, reject]);

  /**
   * Determines whether a nested path on an object has a specific value, in
   * [`R.equals`](#equals) terms. Most likely used to filter a list.
   *
   * @func
   * @memberOf R
   * @since v0.7.0
   * @category Relation
   * @typedefn Idx = String | Int | Symbol
   * @sig [Idx] -> a -> {a} -> Boolean
   * @param {Array} path The path of the nested property to use
   * @param {*} val The value to compare the nested property with
   * @param {Object} obj The object to check the nested property in
   * @return {Boolean} `true` if the value equals the nested object property,
   *         `false` otherwise.
   * @example
   *
   *      const user1 = { address: { zipCode: 90210 } };
   *      const user2 = { address: { zipCode: 55555 } };
   *      const user3 = { name: 'Bob' };
   *      const users = [ user1, user2, user3 ];
   *      const isFamous = R.pathEq(['address', 'zipCode'], 90210);
   *      R.filter(isFamous, users); //=> [ user1 ]
   */

  var pathEq = _curry3(function pathEq(_path, val, obj) {
    return equals(path(_path, obj), val);
  });

  /**
   * If the given, non-null object has a value at the given path, returns the
   * value at that path. Otherwise returns the provided default value.
   *
   * @func
   * @memberOf R
   * @since v0.18.0
   * @category Object
   * @typedefn Idx = String | Int | Symbol
   * @sig a -> [Idx] -> {a} -> a
   * @param {*} d The default value.
   * @param {Array} p The path to use.
   * @param {Object} obj The object to retrieve the nested property from.
   * @return {*} The data at `path` of the supplied object or the default value.
   * @example
   *
   *      R.pathOr('N/A', ['a', 'b'], {a: {b: 2}}); //=> 2
   *      R.pathOr('N/A', ['a', 'b'], {c: {b: 2}}); //=> "N/A"
   */

  var pathOr = _curry3(function pathOr(d, p, obj) {
    return defaultTo(d, path(p, obj));
  });

  /**
   * Returns `true` if the specified object property at given path satisfies the
   * given predicate; `false` otherwise.
   *
   * @func
   * @memberOf R
   * @since v0.19.0
   * @category Logic
   * @typedefn Idx = String | Int | Symbol
   * @sig (a -> Boolean) -> [Idx] -> {a} -> Boolean
   * @param {Function} pred
   * @param {Array} propPath
   * @param {*} obj
   * @return {Boolean}
   * @see R.propSatisfies, R.path
   * @example
   *
   *      R.pathSatisfies(y => y > 0, ['x', 'y'], {x: {y: 2}}); //=> true
   *      R.pathSatisfies(R.is(Object), [], {x: {y: 2}}); //=> true
   */

  var pathSatisfies = _curry3(function pathSatisfies(pred, propPath, obj) {
    return pred(path(propPath, obj));
  });

  /**
   * Returns a partial copy of an object containing only the keys specified. If
   * the key does not exist, the property is ignored.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Object
   * @sig [k] -> {k: v} -> {k: v}
   * @param {Array} names an array of String property names to copy onto a new object
   * @param {Object} obj The object to copy from
   * @return {Object} A new object with only properties from `names` on it.
   * @see R.omit, R.props
   * @example
   *
   *      R.pick(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, d: 4}
   *      R.pick(['a', 'e', 'f'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1}
   */

  var pick = _curry2(function pick(names, obj) {
    var result = {};
    var idx = 0;

    while (idx < names.length) {
      if (names[idx] in obj) {
        result[names[idx]] = obj[names[idx]];
      }

      idx += 1;
    }

    return result;
  });

  /**
   * Similar to `pick` except that this one includes a `key: undefined` pair for
   * properties that don't exist.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Object
   * @sig [k] -> {k: v} -> {k: v}
   * @param {Array} names an array of String property names to copy onto a new object
   * @param {Object} obj The object to copy from
   * @return {Object} A new object with only properties from `names` on it.
   * @see R.pick
   * @example
   *
   *      R.pickAll(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, d: 4}
   *      R.pickAll(['a', 'e', 'f'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, e: undefined, f: undefined}
   */

  var pickAll = _curry2(function pickAll(names, obj) {
    var result = {};
    var idx = 0;
    var len = names.length;

    while (idx < len) {
      var name = names[idx];
      result[name] = obj[name];
      idx += 1;
    }

    return result;
  });

  /**
   * Returns a partial copy of an object containing only the keys that satisfy
   * the supplied predicate.
   *
   * @func
   * @memberOf R
   * @since v0.8.0
   * @category Object
   * @sig ((v, k) -> Boolean) -> {k: v} -> {k: v}
   * @param {Function} pred A predicate to determine whether or not a key
   *        should be included on the output object.
   * @param {Object} obj The object to copy from
   * @return {Object} A new object with only properties that satisfy `pred`
   *         on it.
   * @see R.pick, R.filter
   * @example
   *
   *      const isUpperCase = (val, key) => key.toUpperCase() === key;
   *      R.pickBy(isUpperCase, {a: 1, b: 2, A: 3, B: 4}); //=> {A: 3, B: 4}
   */

  var pickBy = _curry2(function pickBy(test, obj) {
    var result = {};

    for (var prop in obj) {
      if (test(obj[prop], prop, obj)) {
        result[prop] = obj[prop];
      }
    }

    return result;
  });

  /**
   * Returns a new list with the given element at the front, followed by the
   * contents of the list.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig a -> [a] -> [a]
   * @param {*} el The item to add to the head of the output list.
   * @param {Array} list The array to add to the tail of the output list.
   * @return {Array} A new array.
   * @see R.append
   * @example
   *
   *      R.prepend('fee', ['fi', 'fo', 'fum']); //=> ['fee', 'fi', 'fo', 'fum']
   */

  var prepend = _curry2(function prepend(el, list) {
    return _concat([el], list);
  });

  /**
   * Multiplies together all the elements of a list.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Math
   * @sig [Number] -> Number
   * @param {Array} list An array of numbers
   * @return {Number} The product of all the numbers in the list.
   * @see R.reduce
   * @example
   *
   *      R.product([2,4,6,8,100,1]); //=> 38400
   */

  var product = reduce(multiply, 1);

  /**
   * Accepts a function `fn` and a list of transformer functions and returns a
   * new curried function. When the new function is invoked, it calls the
   * function `fn` with parameters consisting of the result of calling each
   * supplied handler on successive arguments to the new function.
   *
   * If more arguments are passed to the returned function than transformer
   * functions, those arguments are passed directly to `fn` as additional
   * parameters. If you expect additional arguments that don't need to be
   * transformed, although you can ignore them, it's best to pass an identity
   * function so that the new function reports the correct arity.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Function
   * @sig ((x1, x2, ...) -> z) -> [(a -> x1), (b -> x2), ...] -> (a -> b -> ... -> z)
   * @param {Function} fn The function to wrap.
   * @param {Array} transformers A list of transformer functions
   * @return {Function} The wrapped function.
   * @see R.converge
   * @example
   *
   *      R.useWith(Math.pow, [R.identity, R.identity])(3, 4); //=> 81
   *      R.useWith(Math.pow, [R.identity, R.identity])(3)(4); //=> 81
   *      R.useWith(Math.pow, [R.dec, R.inc])(3, 4); //=> 32
   *      R.useWith(Math.pow, [R.dec, R.inc])(3)(4); //=> 32
   * @symb R.useWith(f, [g, h])(a, b) = f(g(a), h(b))
   */

  var useWith = _curry2(function useWith(fn, transformers) {
    return curryN(transformers.length, function () {
      var args = [];
      var idx = 0;

      while (idx < transformers.length) {
        args.push(transformers[idx].call(this, arguments[idx]));
        idx += 1;
      }

      return fn.apply(this, args.concat(Array.prototype.slice.call(arguments, transformers.length)));
    });
  });

  /**
   * Reasonable analog to SQL `select` statement.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Object
   * @category Relation
   * @sig [k] -> [{k: v}] -> [{k: v}]
   * @param {Array} props The property names to project
   * @param {Array} objs The objects to query
   * @return {Array} An array of objects with just the `props` properties.
   * @see R.pluck, R.props, R.prop
   * @example
   *
   *      const abby = {name: 'Abby', age: 7, hair: 'blond', grade: 2};
   *      const fred = {name: 'Fred', age: 12, hair: 'brown', grade: 7};
   *      const kids = [abby, fred];
   *      R.project(['name', 'grade'], kids); //=> [{name: 'Abby', grade: 2}, {name: 'Fred', grade: 7}]
   */

  var project = useWith(_map, [pickAll, identity]); // passing `identity` gives correct arity

  function _promap(f, g, profunctor) {
    return function (x) {
      return g(profunctor(f(x)));
    };
  }

  function XPromap(f, g, xf) {
    this.xf = xf;
    this.f = f;
    this.g = g;
  }

  XPromap.prototype['@@transducer/init'] = _xfBase.init;
  XPromap.prototype['@@transducer/result'] = _xfBase.result;

  XPromap.prototype['@@transducer/step'] = function (result, input) {
    return this.xf['@@transducer/step'](result, _promap(this.f, this.g, input));
  };

  var _xpromap = _curry3(function _xpromap(f, g, xf) {
    return new XPromap(f, g, xf);
  });

  /**
   * Takes two functions as pre- and post- processors respectively for a third function,
   * i.e. `promap(f, g, h)(x) === g(h(f(x)))`.
   *
   * Dispatches to the `promap` method of the third argument, if present,
   * according to the [FantasyLand Profunctor spec](https://github.com/fantasyland/fantasy-land#profunctor).
   *
   * Acts as a transducer if a transformer is given in profunctor position.
   *
   * @func
   * @memberOf R
   * @since v0.28.0
   * @category Function
   * @sig (a -> b) -> (c -> d) -> (b -> c) -> (a -> d)
   * @sig Profunctor p => (a -> b) -> (c -> d) -> p b c -> p a d
   * @param {Function} f The preprocessor function, a -> b
   * @param {Function} g The postprocessor function, c -> d
   * @param {Profunctor} profunctor The profunctor instance to be promapped, e.g. b -> c
   * @return {Profunctor} The new profunctor instance, e.g. a -> d
   * @see R.transduce
   * @example
   *
   *      const decodeChar = R.promap(s => s.charCodeAt(), String.fromCharCode, R.add(-8))
   *      const decodeString = R.promap(R.split(''), R.join(''), R.map(decodeChar))
   *      decodeString("ziuli") //=> "ramda"
   *
   * @symb R.promap(f, g, h) = x => g(h(f(x)))
   * @symb R.promap(f, g, profunctor) = profunctor.promap(f, g)
   */

  var promap = _curry3(_dispatchable(['fantasy-land/promap', 'promap'], _xpromap, _promap));

  /**
   * Returns `true` if the specified object property is equal, in
   * [`R.equals`](#equals) terms, to the given value; `false` otherwise.
   * You can test multiple properties with [`R.whereEq`](#whereEq).
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Relation
   * @sig String -> a -> Object -> Boolean
   * @param {String} name
   * @param {*} val
   * @param {*} obj
   * @return {Boolean}
   * @see R.whereEq, R.propSatisfies, R.equals
   * @example
   *
   *      const abby = {name: 'Abby', age: 7, hair: 'blond'};
   *      const fred = {name: 'Fred', age: 12, hair: 'brown'};
   *      const rusty = {name: 'Rusty', age: 10, hair: 'brown'};
   *      const alois = {name: 'Alois', age: 15, disposition: 'surly'};
   *      const kids = [abby, fred, rusty, alois];
   *      const hasBrownHair = R.propEq('hair', 'brown');
   *      R.filter(hasBrownHair, kids); //=> [fred, rusty]
   */

  var propEq = _curry3(function propEq(name, val, obj) {
    return equals(val, prop(name, obj));
  });

  /**
   * Returns `true` if the specified object property is of the given type;
   * `false` otherwise.
   *
   * @func
   * @memberOf R
   * @since v0.16.0
   * @category Type
   * @sig Type -> String -> Object -> Boolean
   * @param {Function} type
   * @param {String} name
   * @param {*} obj
   * @return {Boolean}
   * @see R.is, R.propSatisfies
   * @example
   *
   *      R.propIs(Number, 'x', {x: 1, y: 2});  //=> true
   *      R.propIs(Number, 'x', {x: 'foo'});    //=> false
   *      R.propIs(Number, 'x', {});            //=> false
   */

  var propIs = _curry3(function propIs(type, name, obj) {
    return is(type, prop(name, obj));
  });

  /**
   * Return the specified property of the given non-null object if the property
   * is present and it's value is not `null`, `undefined` or `NaN`.
   *
   * Otherwise the first argument is returned.
   *
   * @func
   * @memberOf R
   * @since v0.6.0
   * @category Object
   * @sig a -> String -> Object -> a
   * @param {*} val The default value.
   * @param {String} p The name of the property to return.
   * @param {Object} obj The object to query.
   * @return {*} The value of given property of the supplied object or the default value.
   * @example
   *
   *      const alice = {
   *        name: 'ALICE',
   *        age: 101
   *      };
   *      const favorite = R.prop('favoriteLibrary');
   *      const favoriteWithDefault = R.propOr('Ramda', 'favoriteLibrary');
   *
   *      favorite(alice);  //=> undefined
   *      favoriteWithDefault(alice);  //=> 'Ramda'
   */

  var propOr = _curry3(function propOr(val, p, obj) {
    return defaultTo(val, prop(p, obj));
  });

  /**
   * Returns `true` if the specified object property satisfies the given
   * predicate; `false` otherwise. You can test multiple properties with
   * [`R.where`](#where).
   *
   * @func
   * @memberOf R
   * @since v0.16.0
   * @category Logic
   * @sig (a -> Boolean) -> String -> {String: a} -> Boolean
   * @param {Function} pred
   * @param {String} name
   * @param {*} obj
   * @return {Boolean}
   * @see R.where, R.propEq, R.propIs
   * @example
   *
   *      R.propSatisfies(x => x > 0, 'x', {x: 1, y: 2}); //=> true
   */

  var propSatisfies = _curry3(function propSatisfies(pred, name, obj) {
    return pred(prop(name, obj));
  });

  /**
   * Acts as multiple `prop`: array of keys in, array of values out. Preserves
   * order.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Object
   * @sig [k] -> {k: v} -> [v]
   * @param {Array} ps The property names to fetch
   * @param {Object} obj The object to query
   * @return {Array} The corresponding values or partially applied function.
   * @see R.prop, R.pluck, R.project
   * @example
   *
   *      R.props(['x', 'y'], {x: 1, y: 2}); //=> [1, 2]
   *      R.props(['c', 'a', 'b'], {b: 2, a: 1}); //=> [undefined, 1, 2]
   *
   *      const fullName = R.compose(R.join(' '), R.props(['first', 'last']));
   *      fullName({last: 'Bullet-Tooth', age: 33, first: 'Tony'}); //=> 'Tony Bullet-Tooth'
   */

  var props = _curry2(function props(ps, obj) {
    return ps.map(function (p) {
      return path([p], obj);
    });
  });

  /**
   * Returns a list of numbers from `from` (inclusive) to `to` (exclusive).
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig Number -> Number -> [Number]
   * @param {Number} from The first number in the list.
   * @param {Number} to One more than the last number in the list.
   * @return {Array} The list of numbers in the set `[a, b)`.
   * @example
   *
   *      R.range(1, 5);    //=> [1, 2, 3, 4]
   *      R.range(50, 53);  //=> [50, 51, 52]
   */

  var range = _curry2(function range(from, to) {
    if (!(_isNumber(from) && _isNumber(to))) {
      throw new TypeError('Both arguments to range must be numbers');
    }

    var result = [];
    var n = from;

    while (n < to) {
      result.push(n);
      n += 1;
    }

    return result;
  });

  /**
   * Returns a single item by iterating through the list, successively calling
   * the iterator function and passing it an accumulator value and the current
   * value from the array, and then passing the result to the next call.
   *
   * Similar to [`reduce`](#reduce), except moves through the input list from the
   * right to the left.
   *
   * The iterator function receives two values: *(value, acc)*, while the arguments'
   * order of `reduce`'s iterator function is *(acc, value)*. `reduceRight` may use [`reduced`](#reduced)
   * to short circuit the iteration.
   *
   * Note: `R.reduceRight` does not skip deleted or unassigned indices (sparse
   * arrays), unlike the native `Array.prototype.reduceRight` method. For more details
   * on this behavior, see:
   * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduceRight#Description
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig ((a, b) -> b) -> b -> [a] -> b
   * @param {Function} fn The iterator function. Receives two values, the current element from the array
   *        and the accumulator.
   * @param {*} acc The accumulator value.
   * @param {Array} list The list to iterate over.
   * @return {*} The final, accumulated value.
   * @see R.reduce, R.addIndex, R.reduced
   * @example
   *
   *      R.reduceRight(R.subtract, 0, [1, 2, 3, 4]) // => (1 - (2 - (3 - (4 - 0)))) = -2
   *      //    -               -2
   *      //   / \              / \
   *      //  1   -            1   3
   *      //     / \              / \
   *      //    2   -     ==>    2  -1
   *      //       / \              / \
   *      //      3   -            3   4
   *      //         / \              / \
   *      //        4   0            4   0
   *
   * @symb R.reduceRight(f, a, [b, c, d]) = f(b, f(c, f(d, a)))
   */

  var reduceRight = _curry3(function reduceRight(fn, acc, list) {
    var idx = list.length - 1;

    while (idx >= 0) {
      acc = fn(list[idx], acc);

      if (acc && acc['@@transducer/reduced']) {
        acc = acc['@@transducer/value'];
        break;
      }

      idx -= 1;
    }

    return acc;
  });

  /**
   * Like [`reduce`](#reduce), `reduceWhile` returns a single item by iterating
   * through the list, successively calling the iterator function. `reduceWhile`
   * also takes a predicate that is evaluated before each step. If the predicate
   * returns `false`, it "short-circuits" the iteration and returns the current
   * value of the accumulator. `reduceWhile` may alternatively be short-circuited
   * via [`reduced`](#reduced).
   *
   * @func
   * @memberOf R
   * @since v0.22.0
   * @category List
   * @sig ((a, b) -> Boolean) -> ((a, b) -> a) -> a -> [b] -> a
   * @param {Function} pred The predicate. It is passed the accumulator and the
   *        current element.
   * @param {Function} fn The iterator function. Receives two values, the
   *        accumulator and the current element.
   * @param {*} a The accumulator value.
   * @param {Array} list The list to iterate over.
   * @return {*} The final, accumulated value.
   * @see R.reduce, R.reduced
   * @example
   *
   *      const isOdd = (acc, x) => x % 2 !== 0;
   *      const xs = [1, 3, 5, 60, 777, 800];
   *      R.reduceWhile(isOdd, R.add, 0, xs); //=> 9
   *
   *      const ys = [2, 4, 6]
   *      R.reduceWhile(isOdd, R.add, 111, ys); //=> 111
   */

  var reduceWhile = _curryN(4, [], function _reduceWhile(pred, fn, a, list) {
    return _reduce(function (acc, x) {
      return pred(acc, x) ? fn(acc, x) : _reduced(acc);
    }, a, list);
  });

  /**
   * Returns a value wrapped to indicate that it is the final value of the reduce
   * and transduce functions. The returned value should be considered a black
   * box: the internal structure is not guaranteed to be stable.
   *
   * This optimization is available to the below functions:
   * - [`reduce`](#reduce)
   * - [`reduceWhile`](#reduceWhile)
   * - [`reduceBy`](#reduceBy)
   * - [`reduceRight`](#reduceRight)
   * - [`transduce`](#transduce)
   *
   * @func
   * @memberOf R
   * @since v0.15.0
   * @category List
   * @sig a -> *
   * @param {*} x The final value of the reduce.
   * @return {*} The wrapped value.
   * @see R.reduce, R.reduceWhile, R.reduceBy, R.reduceRight, R.transduce
   * @example
   *
   *     R.reduce(
   *       (acc, item) => item > 3 ? R.reduced(acc) : acc.concat(item),
   *       [],
   *       [1, 2, 3, 4, 5]) // [1, 2, 3]
   */

  var reduced = _curry1(_reduced);

  /**
   * Calls an input function `n` times, returning an array containing the results
   * of those function calls.
   *
   * `fn` is passed one argument: The current value of `n`, which begins at `0`
   * and is gradually incremented to `n - 1`.
   *
   * @func
   * @memberOf R
   * @since v0.2.3
   * @category List
   * @sig (Number -> a) -> Number -> [a]
   * @param {Function} fn The function to invoke. Passed one argument, the current value of `n`.
   * @param {Number} n A value between `0` and `n - 1`. Increments after each function call.
   * @return {Array} An array containing the return values of all calls to `fn`.
   * @see R.repeat
   * @example
   *
   *      R.times(R.identity, 5); //=> [0, 1, 2, 3, 4]
   * @symb R.times(f, 0) = []
   * @symb R.times(f, 1) = [f(0)]
   * @symb R.times(f, 2) = [f(0), f(1)]
   */

  var times = _curry2(function times(fn, n) {
    var len = Number(n);
    var idx = 0;
    var list;

    if (len < 0 || isNaN(len)) {
      throw new RangeError('n must be a non-negative number');
    }

    list = new Array(len);

    while (idx < len) {
      list[idx] = fn(idx);
      idx += 1;
    }

    return list;
  });

  /**
   * Returns a fixed list of size `n` containing a specified identical value.
   *
   * @func
   * @memberOf R
   * @since v0.1.1
   * @category List
   * @sig a -> n -> [a]
   * @param {*} value The value to repeat.
   * @param {Number} n The desired size of the output list.
   * @return {Array} A new array containing `n` `value`s.
   * @see R.times
   * @example
   *
   *      R.repeat('hi', 5); //=> ['hi', 'hi', 'hi', 'hi', 'hi']
   *
   *      const obj = {};
   *      const repeatedObjs = R.repeat(obj, 5); //=> [{}, {}, {}, {}, {}]
   *      repeatedObjs[0] === repeatedObjs[1]; //=> true
   * @symb R.repeat(a, 0) = []
   * @symb R.repeat(a, 1) = [a]
   * @symb R.repeat(a, 2) = [a, a]
   */

  var repeat = _curry2(function repeat(value, n) {
    return times(always(value), n);
  });

  /**
   * Replace a substring or regex match in a string with a replacement.
   *
   * The first two parameters correspond to the parameters of the
   * `String.prototype.replace()` function, so the second parameter can also be a
   * function.
   *
   * @func
   * @memberOf R
   * @since v0.7.0
   * @category String
   * @sig RegExp|String -> String -> String -> String
   * @param {RegExp|String} pattern A regular expression or a substring to match.
   * @param {String} replacement The string to replace the matches with.
   * @param {String} str The String to do the search and replacement in.
   * @return {String} The result.
   * @example
   *
   *      R.replace('foo', 'bar', 'foo foo foo'); //=> 'bar foo foo'
   *      R.replace(/foo/, 'bar', 'foo foo foo'); //=> 'bar foo foo'
   *
   *      // Use the "g" (global) flag to replace all occurrences:
   *      R.replace(/foo/g, 'bar', 'foo foo foo'); //=> 'bar bar bar'
   */

  var replace = _curry3(function replace(regex, replacement, str) {
    return str.replace(regex, replacement);
  });

  /**
   * Scan is similar to [`reduce`](#reduce), but returns a list of successively
   * reduced values from the left
   *
   * @func
   * @memberOf R
   * @since v0.10.0
   * @category List
   * @sig ((a, b) -> a) -> a -> [b] -> [a]
   * @param {Function} fn The iterator function. Receives two values, the accumulator and the
   *        current element from the array
   * @param {*} acc The accumulator value.
   * @param {Array} list The list to iterate over.
   * @return {Array} A list of all intermediately reduced values.
   * @see R.reduce, R.mapAccum
   * @example
   *
   *      const numbers = [1, 2, 3, 4];
   *      const factorials = R.scan(R.multiply, 1, numbers); //=> [1, 1, 2, 6, 24]
   * @symb R.scan(f, a, [b, c]) = [a, f(a, b), f(f(a, b), c)]
   */

  var scan = _curry3(function scan(fn, acc, list) {
    var idx = 0;
    var len = list.length;
    var result = [acc];

    while (idx < len) {
      acc = fn(acc, list[idx]);
      result[idx + 1] = acc;
      idx += 1;
    }

    return result;
  });

  /**
   * Transforms a [Traversable](https://github.com/fantasyland/fantasy-land#traversable)
   * of [Applicative](https://github.com/fantasyland/fantasy-land#applicative) into an
   * Applicative of Traversable.
   *
   * Dispatches to the `sequence` method of the second argument, if present.
   *
   * @func
   * @memberOf R
   * @since v0.19.0
   * @category List
   * @sig (Applicative f, Traversable t) => (a -> f a) -> t (f a) -> f (t a)
   * @param {Function} of
   * @param {*} traversable
   * @return {*}
   * @see R.traverse
   * @example
   *
   *      R.sequence(Maybe.of, [Just(1), Just(2), Just(3)]);   //=> Just([1, 2, 3])
   *      R.sequence(Maybe.of, [Just(1), Just(2), Nothing()]); //=> Nothing()
   *
   *      R.sequence(R.of, Just([1, 2, 3])); //=> [Just(1), Just(2), Just(3)]
   *      R.sequence(R.of, Nothing());       //=> [Nothing()]
   */

  var sequence = _curry2(function sequence(of, traversable) {
    return typeof traversable.sequence === 'function' ? traversable.sequence(of) : reduceRight(function (x, acc) {
      return ap(map(prepend, x), acc);
    }, of([]), traversable);
  });

  /**
   * Returns the result of "setting" the portion of the given data structure
   * focused by the given lens to the given value.
   *
   * @func
   * @memberOf R
   * @since v0.16.0
   * @category Object
   * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
   * @sig Lens s a -> a -> s -> s
   * @param {Lens} lens
   * @param {*} v
   * @param {*} x
   * @return {*}
   * @see R.view, R.over, R.lens, R.lensIndex, R.lensProp, R.lensPath
   * @example
   *
   *      const xLens = R.lensProp('x');
   *
   *      R.set(xLens, 4, {x: 1, y: 2});  //=> {x: 4, y: 2}
   *      R.set(xLens, 8, {x: 1, y: 2});  //=> {x: 8, y: 2}
   */

  var set = _curry3(function set(lens, v, x) {
    return over(lens, always(v), x);
  });

  /**
   * Returns a copy of the list, sorted according to the comparator function,
   * which should accept two values at a time and return a negative number if the
   * first value is smaller, a positive number if it's larger, and zero if they
   * are equal. Please note that this is a **copy** of the list. It does not
   * modify the original.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig ((a, a) -> Number) -> [a] -> [a]
   * @param {Function} comparator A sorting function :: a -> b -> Int
   * @param {Array} list The list to sort
   * @return {Array} a new array with its elements sorted by the comparator function.
   * @see R.ascend, R.descend
   * @example
   *
   *      const diff = function(a, b) { return a - b; };
   *      R.sort(diff, [4,2,7,5]); //=> [2, 4, 5, 7]
   */

  var sort = _curry2(function sort(comparator, list) {
    return Array.prototype.slice.call(list, 0).sort(comparator);
  });

  /**
   * Sorts the list according to the supplied function.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Relation
   * @sig Ord b => (a -> b) -> [a] -> [a]
   * @param {Function} fn
   * @param {Array} list The list to sort.
   * @return {Array} A new list sorted by the keys generated by `fn`.
   * @example
   *
   *      const sortByFirstItem = R.sortBy(R.prop(0));
   *      const pairs = [[-1, 1], [-2, 2], [-3, 3]];
   *      sortByFirstItem(pairs); //=> [[-3, 3], [-2, 2], [-1, 1]]
   *
   *      const sortByNameCaseInsensitive = R.sortBy(R.compose(R.toLower, R.prop('name')));
   *      const alice = {
   *        name: 'ALICE',
   *        age: 101
   *      };
   *      const bob = {
   *        name: 'Bob',
   *        age: -10
   *      };
   *      const clara = {
   *        name: 'clara',
   *        age: 314.159
   *      };
   *      const people = [clara, bob, alice];
   *      sortByNameCaseInsensitive(people); //=> [alice, bob, clara]
   */

  var sortBy = _curry2(function sortBy(fn, list) {
    return Array.prototype.slice.call(list, 0).sort(function (a, b) {
      var aa = fn(a);
      var bb = fn(b);
      return aa < bb ? -1 : aa > bb ? 1 : 0;
    });
  });

  /**
   * Sorts a list according to a list of comparators.
   *
   * @func
   * @memberOf R
   * @since v0.23.0
   * @category Relation
   * @sig [(a, a) -> Number] -> [a] -> [a]
   * @param {Array} functions A list of comparator functions.
   * @param {Array} list The list to sort.
   * @return {Array} A new list sorted according to the comarator functions.
   * @see R.ascend, R.descend
   * @example
   *
   *      const alice = {
   *        name: 'alice',
   *        age: 40
   *      };
   *      const bob = {
   *        name: 'bob',
   *        age: 30
   *      };
   *      const clara = {
   *        name: 'clara',
   *        age: 40
   *      };
   *      const people = [clara, bob, alice];
   *      const ageNameSort = R.sortWith([
   *        R.descend(R.prop('age')),
   *        R.ascend(R.prop('name'))
   *      ]);
   *      ageNameSort(people); //=> [alice, clara, bob]
   */

  var sortWith = _curry2(function sortWith(fns, list) {
    return Array.prototype.slice.call(list, 0).sort(function (a, b) {
      var result = 0;
      var i = 0;

      while (result === 0 && i < fns.length) {
        result = fns[i](a, b);
        i += 1;
      }

      return result;
    });
  });

  /**
   * Splits a string into an array of strings based on the given
   * separator.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category String
   * @sig (String | RegExp) -> String -> [String]
   * @param {String|RegExp} sep The pattern.
   * @param {String} str The string to separate into an array.
   * @return {Array} The array of strings from `str` separated by `sep`.
   * @see R.join
   * @example
   *
   *      const pathComponents = R.split('/');
   *      R.tail(pathComponents('/usr/local/bin/node')); //=> ['usr', 'local', 'bin', 'node']
   *
   *      R.split('.', 'a.b.c.xyz.d'); //=> ['a', 'b', 'c', 'xyz', 'd']
   */

  var split = invoker(1, 'split');

  /**
   * Splits a given list or string at a given index.
   *
   * @func
   * @memberOf R
   * @since v0.19.0
   * @category List
   * @sig Number -> [a] -> [[a], [a]]
   * @sig Number -> String -> [String, String]
   * @param {Number} index The index where the array/string is split.
   * @param {Array|String} array The array/string to be split.
   * @return {Array}
   * @example
   *
   *      R.splitAt(1, [1, 2, 3]);          //=> [[1], [2, 3]]
   *      R.splitAt(5, 'hello world');      //=> ['hello', ' world']
   *      R.splitAt(-1, 'foobar');          //=> ['fooba', 'r']
   */

  var splitAt = _curry2(function splitAt(index, array) {
    return [slice(0, index, array), slice(index, length(array), array)];
  });

  /**
   * Splits a collection into slices of the specified length.
   *
   * @func
   * @memberOf R
   * @since v0.16.0
   * @category List
   * @sig Number -> [a] -> [[a]]
   * @sig Number -> String -> [String]
   * @param {Number} n
   * @param {Array} list
   * @return {Array}
   * @example
   *
   *      R.splitEvery(3, [1, 2, 3, 4, 5, 6, 7]); //=> [[1, 2, 3], [4, 5, 6], [7]]
   *      R.splitEvery(3, 'foobarbaz'); //=> ['foo', 'bar', 'baz']
   */

  var splitEvery = _curry2(function splitEvery(n, list) {
    if (n <= 0) {
      throw new Error('First argument to splitEvery must be a positive integer');
    }

    var result = [];
    var idx = 0;

    while (idx < list.length) {
      result.push(slice(idx, idx += n, list));
    }

    return result;
  });

  /**
   * Takes a list and a predicate and returns a pair of lists with the following properties:
   *
   *  - the result of concatenating the two output lists is equivalent to the input list;
   *  - none of the elements of the first output list satisfies the predicate; and
   *  - if the second output list is non-empty, its first element satisfies the predicate.
   *
   * @func
   * @memberOf R
   * @since v0.19.0
   * @category List
   * @sig (a -> Boolean) -> [a] -> [[a], [a]]
   * @param {Function} pred The predicate that determines where the array is split.
   * @param {Array} list The array to be split.
   * @return {Array}
   * @example
   *
   *      R.splitWhen(R.equals(2), [1, 2, 3, 1, 2, 3]);   //=> [[1], [2, 3, 1, 2, 3]]
   */

  var splitWhen = _curry2(function splitWhen(pred, list) {
    var idx = 0;
    var len = list.length;
    var prefix = [];

    while (idx < len && !pred(list[idx])) {
      prefix.push(list[idx]);
      idx += 1;
    }

    return [prefix, Array.prototype.slice.call(list, idx)];
  });

  /**
   * Splits an array into slices on every occurrence of a value.
   *
   * @func
   * @memberOf R
   * @since v0.26.1
   * @category List
   * @sig (a -> Boolean) -> [a] -> [[a]]
   * @param {Function} pred The predicate that determines where the array is split.
   * @param {Array} list The array to be split.
   * @return {Array}
   * @example
   *
   *      R.splitWhenever(R.equals(2), [1, 2, 3, 2, 4, 5, 2, 6, 7]); //=> [[1], [3], [4, 5], [6, 7]]
   */

  var splitWhenever = _curryN(2, [], function splitWhenever(pred, list) {
    var acc = [];
    var curr = [];

    for (var i = 0; i < list.length; i = i + 1) {
      if (!pred(list[i])) {
        curr.push(list[i]);
      }

      if ((i < list.length - 1 && pred(list[i + 1]) || i === list.length - 1) && curr.length > 0) {
        acc.push(curr);
        curr = [];
      }
    }

    return acc;
  });

  /**
   * Checks if a list starts with the provided sublist.
   *
   * Similarly, checks if a string starts with the provided substring.
   *
   * @func
   * @memberOf R
   * @since v0.24.0
   * @category List
   * @sig [a] -> [a] -> Boolean
   * @sig String -> String -> Boolean
   * @param {*} prefix
   * @param {*} list
   * @return {Boolean}
   * @see R.endsWith
   * @example
   *
   *      R.startsWith('a', 'abc')                //=> true
   *      R.startsWith('b', 'abc')                //=> false
   *      R.startsWith(['a'], ['a', 'b', 'c'])    //=> true
   *      R.startsWith(['b'], ['a', 'b', 'c'])    //=> false
   */

  var startsWith = _curry2(function (prefix, list) {
    return equals(take(prefix.length, list), prefix);
  });

  /**
   * Subtracts its second argument from its first argument.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Math
   * @sig Number -> Number -> Number
   * @param {Number} a The first value.
   * @param {Number} b The second value.
   * @return {Number} The result of `a - b`.
   * @see R.add
   * @example
   *
   *      R.subtract(10, 8); //=> 2
   *
   *      const minus5 = R.subtract(R.__, 5);
   *      minus5(17); //=> 12
   *
   *      const complementaryAngle = R.subtract(90);
   *      complementaryAngle(30); //=> 60
   *      complementaryAngle(72); //=> 18
   */

  var subtract = _curry2(function subtract(a, b) {
    return Number(a) - Number(b);
  });

  /**
   * Finds the set (i.e. no duplicates) of all elements contained in the first or
   * second list, but not both.
   *
   * @func
   * @memberOf R
   * @since v0.19.0
   * @category Relation
   * @sig [*] -> [*] -> [*]
   * @param {Array} list1 The first list.
   * @param {Array} list2 The second list.
   * @return {Array} The elements in `list1` or `list2`, but not both.
   * @see R.symmetricDifferenceWith, R.difference, R.differenceWith
   * @example
   *
   *      R.symmetricDifference([1,2,3,4], [7,6,5,4,3]); //=> [1,2,7,6,5]
   *      R.symmetricDifference([7,6,5,4,3], [1,2,3,4]); //=> [7,6,5,1,2]
   */

  var symmetricDifference = _curry2(function symmetricDifference(list1, list2) {
    return concat(difference(list1, list2), difference(list2, list1));
  });

  /**
   * Finds the set (i.e. no duplicates) of all elements contained in the first or
   * second list, but not both. Duplication is determined according to the value
   * returned by applying the supplied predicate to two list elements.
   *
   * @func
   * @memberOf R
   * @since v0.19.0
   * @category Relation
   * @sig ((a, a) -> Boolean) -> [a] -> [a] -> [a]
   * @param {Function} pred A predicate used to test whether two items are equal.
   * @param {Array} list1 The first list.
   * @param {Array} list2 The second list.
   * @return {Array} The elements in `list1` or `list2`, but not both.
   * @see R.symmetricDifference, R.difference, R.differenceWith
   * @example
   *
   *      const eqA = R.eqBy(R.prop('a'));
   *      const l1 = [{a: 1}, {a: 2}, {a: 3}, {a: 4}];
   *      const l2 = [{a: 3}, {a: 4}, {a: 5}, {a: 6}];
   *      R.symmetricDifferenceWith(eqA, l1, l2); //=> [{a: 1}, {a: 2}, {a: 5}, {a: 6}]
   */

  var symmetricDifferenceWith = _curry3(function symmetricDifferenceWith(pred, list1, list2) {
    return concat(differenceWith(pred, list1, list2), differenceWith(pred, list2, list1));
  });

  /**
   * Returns a new list containing the last `n` elements of a given list, passing
   * each value to the supplied predicate function, and terminating when the
   * predicate function returns `false`. Excludes the element that caused the
   * predicate function to fail. The predicate function is passed one argument:
   * *(value)*.
   *
   * @func
   * @memberOf R
   * @since v0.16.0
   * @category List
   * @sig (a -> Boolean) -> [a] -> [a]
   * @sig (a -> Boolean) -> String -> String
   * @param {Function} fn The function called per iteration.
   * @param {Array} xs The collection to iterate over.
   * @return {Array} A new array.
   * @see R.dropLastWhile, R.addIndex
   * @example
   *
   *      const isNotOne = x => x !== 1;
   *
   *      R.takeLastWhile(isNotOne, [1, 2, 3, 4]); //=> [2, 3, 4]
   *
   *      R.takeLastWhile(x => x !== 'R' , 'Ramda'); //=> 'amda'
   */

  var takeLastWhile = _curry2(function takeLastWhile(fn, xs) {
    var idx = xs.length - 1;

    while (idx >= 0 && fn(xs[idx])) {
      idx -= 1;
    }

    return slice(idx + 1, Infinity, xs);
  });

  function XTakeWhile(f, xf) {
    this.xf = xf;
    this.f = f;
  }

  XTakeWhile.prototype['@@transducer/init'] = _xfBase.init;
  XTakeWhile.prototype['@@transducer/result'] = _xfBase.result;

  XTakeWhile.prototype['@@transducer/step'] = function (result, input) {
    return this.f(input) ? this.xf['@@transducer/step'](result, input) : _reduced(result);
  };

  var _xtakeWhile = _curry2(function _xtakeWhile(f, xf) {
    return new XTakeWhile(f, xf);
  });

  /**
   * Returns a new list containing the first `n` elements of a given list,
   * passing each value to the supplied predicate function, and terminating when
   * the predicate function returns `false`. Excludes the element that caused the
   * predicate function to fail. The predicate function is passed one argument:
   * *(value)*.
   *
   * Dispatches to the `takeWhile` method of the second argument, if present.
   *
   * Acts as a transducer if a transformer is given in list position.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig (a -> Boolean) -> [a] -> [a]
   * @sig (a -> Boolean) -> String -> String
   * @param {Function} fn The function called per iteration.
   * @param {Array} xs The collection to iterate over.
   * @return {Array} A new array.
   * @see R.dropWhile, R.transduce, R.addIndex
   * @example
   *
   *      const isNotFour = x => x !== 4;
   *
   *      R.takeWhile(isNotFour, [1, 2, 3, 4, 3, 2, 1]); //=> [1, 2, 3]
   *
   *      R.takeWhile(x => x !== 'd' , 'Ramda'); //=> 'Ram'
   */

  var takeWhile = _curry2(_dispatchable(['takeWhile'], _xtakeWhile, function takeWhile(fn, xs) {
    var idx = 0;
    var len = xs.length;

    while (idx < len && fn(xs[idx])) {
      idx += 1;
    }

    return slice(0, idx, xs);
  }));

  function XTap(f, xf) {
    this.xf = xf;
    this.f = f;
  }

  XTap.prototype['@@transducer/init'] = _xfBase.init;
  XTap.prototype['@@transducer/result'] = _xfBase.result;

  XTap.prototype['@@transducer/step'] = function (result, input) {
    this.f(input);
    return this.xf['@@transducer/step'](result, input);
  };

  var _xtap = _curry2(function _xtap(f, xf) {
    return new XTap(f, xf);
  });

  /**
   * Runs the given function with the supplied object, then returns the object.
   *
   * Acts as a transducer if a transformer is given as second parameter.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Function
   * @sig (a -> *) -> a -> a
   * @param {Function} fn The function to call with `x`. The return value of `fn` will be thrown away.
   * @param {*} x
   * @return {*} `x`.
   * @example
   *
   *      const sayX = x => console.log('x is ' + x);
   *      R.tap(sayX, 100); //=> 100
   *      // logs 'x is 100'
   * @symb R.tap(f, a) = a
   */

  var tap = _curry2(_dispatchable([], _xtap, function tap(fn, x) {
    fn(x);
    return x;
  }));

  function _isRegExp(x) {
    return Object.prototype.toString.call(x) === '[object RegExp]';
  }

  /**
   * Determines whether a given string matches a given regular expression.
   *
   * @func
   * @memberOf R
   * @since v0.12.0
   * @category String
   * @sig RegExp -> String -> Boolean
   * @param {RegExp} pattern
   * @param {String} str
   * @return {Boolean}
   * @see R.match
   * @example
   *
   *      R.test(/^x/, 'xyz'); //=> true
   *      R.test(/^y/, 'xyz'); //=> false
   */

  var test = _curry2(function test(pattern, str) {
    if (!_isRegExp(pattern)) {
      throw new TypeError('‘test’ requires a value of type RegExp as its first argument; received ' + toString$1(pattern));
    }

    return _cloneRegExp(pattern).test(str);
  });

  /**
   * Returns the result of applying the onSuccess function to the value inside
   * a successfully resolved promise. This is useful for working with promises
   * inside function compositions.
   *
   * @func
   * @memberOf R
   * @since v0.27.1
   * @category Function
   * @sig (a -> b) -> (Promise e a) -> (Promise e b)
   * @sig (a -> (Promise e b)) -> (Promise e a) -> (Promise e b)
   * @param {Function} onSuccess The function to apply. Can return a value or a promise of a value.
   * @param {Promise} p
   * @return {Promise} The result of calling `p.then(onSuccess)`
   * @see R.otherwise
   * @example
   *
   *      const makeQuery = email => ({ query: { email }});
   *      const fetchMember = request =>
   *        Promise.resolve({ firstName: 'Bob', lastName: 'Loblaw', id: 42 });
   *
   *      //getMemberName :: String -> Promise ({ firstName, lastName })
   *      const getMemberName = R.pipe(
   *        makeQuery,
   *        fetchMember,
   *        R.andThen(R.pick(['firstName', 'lastName']))
   *      );
   *
   *      getMemberName('bob@gmail.com').then(console.log);
   */

  var andThen = _curry2(function andThen(f, p) {
    _assertPromise('andThen', p);

    return p.then(f);
  });

  /**
   * The lower case version of a string.
   *
   * @func
   * @memberOf R
   * @since v0.9.0
   * @category String
   * @sig String -> String
   * @param {String} str The string to lower case.
   * @return {String} The lower case version of `str`.
   * @see R.toUpper
   * @example
   *
   *      R.toLower('XYZ'); //=> 'xyz'
   */

  var toLower = invoker(0, 'toLowerCase');

  /**
   * Converts an object into an array of key, value arrays. Only the object's
   * own properties are used.
   * Note that the order of the output array is not guaranteed to be consistent
   * across different JS platforms.
   *
   * @func
   * @memberOf R
   * @since v0.4.0
   * @category Object
   * @sig {String: *} -> [[String,*]]
   * @param {Object} obj The object to extract from
   * @return {Array} An array of key, value arrays from the object's own properties.
   * @see R.fromPairs, R.keys, R.values
   * @example
   *
   *      R.toPairs({a: 1, b: 2, c: 3}); //=> [['a', 1], ['b', 2], ['c', 3]]
   */

  var toPairs = _curry1(function toPairs(obj) {
    var pairs = [];

    for (var prop in obj) {
      if (_has(prop, obj)) {
        pairs[pairs.length] = [prop, obj[prop]];
      }
    }

    return pairs;
  });

  /**
   * Converts an object into an array of key, value arrays. The object's own
   * properties and prototype properties are used. Note that the order of the
   * output array is not guaranteed to be consistent across different JS
   * platforms.
   *
   * @func
   * @memberOf R
   * @since v0.4.0
   * @category Object
   * @sig {String: *} -> [[String,*]]
   * @param {Object} obj The object to extract from
   * @return {Array} An array of key, value arrays from the object's own
   *         and prototype properties.
   * @example
   *
   *      const F = function() { this.x = 'X'; };
   *      F.prototype.y = 'Y';
   *      const f = new F();
   *      R.toPairsIn(f); //=> [['x','X'], ['y','Y']]
   */

  var toPairsIn = _curry1(function toPairsIn(obj) {
    var pairs = [];

    for (var prop in obj) {
      pairs[pairs.length] = [prop, obj[prop]];
    }

    return pairs;
  });

  /**
   * The upper case version of a string.
   *
   * @func
   * @memberOf R
   * @since v0.9.0
   * @category String
   * @sig String -> String
   * @param {String} str The string to upper case.
   * @return {String} The upper case version of `str`.
   * @see R.toLower
   * @example
   *
   *      R.toUpper('abc'); //=> 'ABC'
   */

  var toUpper = invoker(0, 'toUpperCase');

  /**
   * Initializes a transducer using supplied iterator function. Returns a single
   * item by iterating through the list, successively calling the transformed
   * iterator function and passing it an accumulator value and the current value
   * from the array, and then passing the result to the next call.
   *
   * The iterator function receives two values: *(acc, value)*. It will be
   * wrapped as a transformer to initialize the transducer. A transformer can be
   * passed directly in place of an iterator function. In both cases, iteration
   * may be stopped early with the [`R.reduced`](#reduced) function.
   *
   * A transducer is a function that accepts a transformer and returns a
   * transformer and can be composed directly.
   *
   * A transformer is an object that provides a 2-arity reducing iterator
   * function, step, 0-arity initial value function, init, and 1-arity result
   * extraction function, result. The step function is used as the iterator
   * function in reduce. The result function is used to convert the final
   * accumulator into the return type and in most cases is
   * [`R.identity`](#identity). The init function can be used to provide an
   * initial accumulator, but is ignored by transduce.
   *
   * The iteration is performed with [`R.reduce`](#reduce) after initializing the transducer.
   *
   * @func
   * @memberOf R
   * @since v0.12.0
   * @category List
   * @sig (c -> c) -> ((a, b) -> a) -> a -> [b] -> a
   * @param {Function} xf The transducer function. Receives a transformer and returns a transformer.
   * @param {Function} fn The iterator function. Receives two values, the accumulator and the
   *        current element from the array. Wrapped as transformer, if necessary, and used to
   *        initialize the transducer
   * @param {*} acc The initial accumulator value.
   * @param {Array} list The list to iterate over.
   * @return {*} The final, accumulated value.
   * @see R.reduce, R.reduced, R.into
   * @example
   *
   *      const numbers = [1, 2, 3, 4];
   *      const transducer = R.compose(R.map(R.add(1)), R.take(2));
   *      R.transduce(transducer, R.flip(R.append), [], numbers); //=> [2, 3]
   *
   *      const isOdd = (x) => x % 2 !== 0;
   *      const firstOddTransducer = R.compose(R.filter(isOdd), R.take(1));
   *      R.transduce(firstOddTransducer, R.flip(R.append), [], R.range(0, 100)); //=> [1]
   */

  var transduce = curryN(4, function transduce(xf, fn, acc, list) {
    return _reduce(xf(typeof fn === 'function' ? _xwrap(fn) : fn), acc, list);
  });

  /**
   * Transposes the rows and columns of a 2D list.
   * When passed a list of `n` lists of length `x`,
   * returns a list of `x` lists of length `n`.
   *
   *
   * @func
   * @memberOf R
   * @since v0.19.0
   * @category List
   * @sig [[a]] -> [[a]]
   * @param {Array} list A 2D list
   * @return {Array} A 2D list
   * @example
   *
   *      R.transpose([[1, 'a'], [2, 'b'], [3, 'c']]) //=> [[1, 2, 3], ['a', 'b', 'c']]
   *      R.transpose([[1, 2, 3], ['a', 'b', 'c']]) //=> [[1, 'a'], [2, 'b'], [3, 'c']]
   *
   *      // If some of the rows are shorter than the following rows, their elements are skipped:
   *      R.transpose([[10, 11], [20], [], [30, 31, 32]]) //=> [[10, 20, 30], [11, 31], [32]]
   * @symb R.transpose([[a], [b], [c]]) = [a, b, c]
   * @symb R.transpose([[a, b], [c, d]]) = [[a, c], [b, d]]
   * @symb R.transpose([[a, b], [c]]) = [[a, c], [b]]
   */

  var transpose = _curry1(function transpose(outerlist) {
    var i = 0;
    var result = [];

    while (i < outerlist.length) {
      var innerlist = outerlist[i];
      var j = 0;

      while (j < innerlist.length) {
        if (typeof result[j] === 'undefined') {
          result[j] = [];
        }

        result[j].push(innerlist[j]);
        j += 1;
      }

      i += 1;
    }

    return result;
  });

  /**
   * Maps an [Applicative](https://github.com/fantasyland/fantasy-land#applicative)-returning
   * function over a [Traversable](https://github.com/fantasyland/fantasy-land#traversable),
   * then uses [`sequence`](#sequence) to transform the resulting Traversable of Applicative
   * into an Applicative of Traversable.
   *
   * Dispatches to the `traverse` method of the third argument, if present.
   *
   * @func
   * @memberOf R
   * @since v0.19.0
   * @category List
   * @sig (Applicative f, Traversable t) => (a -> f a) -> (a -> f b) -> t a -> f (t b)
   * @param {Function} of
   * @param {Function} f
   * @param {*} traversable
   * @return {*}
   * @see R.sequence
   * @example
   *
   *      // Returns `Maybe.Nothing` if the given divisor is `0`
   *      const safeDiv = n => d => d === 0 ? Maybe.Nothing() : Maybe.Just(n / d)
   *
   *      R.traverse(Maybe.of, safeDiv(10), [2, 4, 5]); //=> Maybe.Just([5, 2.5, 2])
   *      R.traverse(Maybe.of, safeDiv(10), [2, 0, 5]); //=> Maybe.Nothing
   */

  var traverse = _curry3(function traverse(of, f, traversable) {
    return typeof traversable['fantasy-land/traverse'] === 'function' ? traversable['fantasy-land/traverse'](f, of) : typeof traversable.traverse === 'function' ? traversable.traverse(f, of) : sequence(of, map(f, traversable));
  });

  var ws = "\t\n\x0B\f\r \xA0\u1680\u2000\u2001\u2002\u2003" + "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" + "\u2029\uFEFF";
  var zeroWidth = "\u200B";
  var hasProtoTrim = typeof String.prototype.trim === 'function';
  /**
   * Removes (strips) whitespace from both ends of the string.
   *
   * @func
   * @memberOf R
   * @since v0.6.0
   * @category String
   * @sig String -> String
   * @param {String} str The string to trim.
   * @return {String} Trimmed version of `str`.
   * @example
   *
   *      R.trim('   xyz  '); //=> 'xyz'
   *      R.map(R.trim, R.split(',', 'x, y, z')); //=> ['x', 'y', 'z']
   */

  var trim = !hasProtoTrim || ws.trim() || !zeroWidth.trim() ? _curry1(function trim(str) {
    var beginRx = new RegExp('^[' + ws + '][' + ws + ']*');
    var endRx = new RegExp('[' + ws + '][' + ws + ']*$');
    return str.replace(beginRx, '').replace(endRx, '');
  }) : _curry1(function trim(str) {
    return str.trim();
  });

  /**
   * `tryCatch` takes two functions, a `tryer` and a `catcher`. The returned
   * function evaluates the `tryer`; if it does not throw, it simply returns the
   * result. If the `tryer` *does* throw, the returned function evaluates the
   * `catcher` function and returns its result. Note that for effective
   * composition with this function, both the `tryer` and `catcher` functions
   * must return the same type of results.
   *
   * @func
   * @memberOf R
   * @since v0.20.0
   * @category Function
   * @sig (...x -> a) -> ((e, ...x) -> a) -> (...x -> a)
   * @param {Function} tryer The function that may throw.
   * @param {Function} catcher The function that will be evaluated if `tryer` throws.
   * @return {Function} A new function that will catch exceptions and send them to the catcher.
   * @example
   *
   *      R.tryCatch(R.prop('x'), R.F)({x: true}); //=> true
   *      R.tryCatch(() => { throw 'foo'}, R.always('caught'))('bar') // =>
   *      'caught'
   *      R.tryCatch(R.times(R.identity), R.always([]))('s') // => []
   *      R.tryCatch(() => { throw 'this is not a valid value'}, (err, value)=>({error : err,  value }))('bar') // => {'error': 'this is not a valid value', 'value': 'bar'}
   */

  var tryCatch = _curry2(function _tryCatch(tryer, catcher) {
    return _arity(tryer.length, function () {
      try {
        return tryer.apply(this, arguments);
      } catch (e) {
        return catcher.apply(this, _concat([e], arguments));
      }
    });
  });

  /**
   * Takes a function `fn`, which takes a single array argument, and returns a
   * function which:
   *
   *   - takes any number of positional arguments;
   *   - passes these arguments to `fn` as an array; and
   *   - returns the result.
   *
   * In other words, `R.unapply` derives a variadic function from a function which
   * takes an array. `R.unapply` is the inverse of [`R.apply`](#apply).
   *
   * @func
   * @memberOf R
   * @since v0.8.0
   * @category Function
   * @sig ([*...] -> a) -> (*... -> a)
   * @param {Function} fn
   * @return {Function}
   * @see R.apply
   * @example
   *
   *      R.unapply(JSON.stringify)(1, 2, 3); //=> '[1,2,3]'
   * @symb R.unapply(f)(a, b) = f([a, b])
   */

  var unapply = _curry1(function unapply(fn) {
    return function () {
      return fn(Array.prototype.slice.call(arguments, 0));
    };
  });

  /**
   * Wraps a function of any arity (including nullary) in a function that accepts
   * exactly 1 parameter. Any extraneous parameters will not be passed to the
   * supplied function.
   *
   * @func
   * @memberOf R
   * @since v0.2.0
   * @category Function
   * @sig (a -> b -> c -> ... -> z) -> (a -> z)
   * @param {Function} fn The function to wrap.
   * @return {Function} A new function wrapping `fn`. The new function is guaranteed to be of
   *         arity 1.
   * @see R.binary, R.nAry
   * @example
   *
   *      const takesTwoArgs = function(a, b) {
   *        return [a, b];
   *      };
   *      takesTwoArgs.length; //=> 2
   *      takesTwoArgs(1, 2); //=> [1, 2]
   *
   *      const takesOneArg = R.unary(takesTwoArgs);
   *      takesOneArg.length; //=> 1
   *      // Only 1 argument is passed to the wrapped function
   *      takesOneArg(1, 2); //=> [1, undefined]
   * @symb R.unary(f)(a, b, c) = f(a)
   */

  var unary = _curry1(function unary(fn) {
    return nAry(1, fn);
  });

  /**
   * Returns a function of arity `n` from a (manually) curried function.
   * Note that, the returned function is actually a ramda style
   * curryied function, which can accept one or more arguments in each
   * function calling.
   *
   * @func
   * @memberOf R
   * @since v0.14.0
   * @category Function
   * @sig Number -> (a -> b -> c ... -> z) -> ((a -> b -> c ...) -> z)
   * @param {Number} length The arity for the returned function.
   * @param {Function} fn The function to uncurry.
   * @return {Function} A new function.
   * @see R.curry, R.curryN
   * @example
   *
   *      const addFour = a => b => c => d => a + b + c + d;
   *
   *      const uncurriedAddFour = R.uncurryN(4, addFour);
   *      uncurriedAddFour(1, 2, 3, 4); //=> 10
   */

  var uncurryN = _curry2(function uncurryN(depth, fn) {
    return curryN(depth, function () {
      var currentDepth = 1;
      var value = fn;
      var idx = 0;
      var endIdx;

      while (currentDepth <= depth && typeof value === 'function') {
        endIdx = currentDepth === depth ? arguments.length : idx + value.length;
        value = value.apply(this, Array.prototype.slice.call(arguments, idx, endIdx));
        currentDepth += 1;
        idx = endIdx;
      }

      return value;
    });
  });

  /**
   * Builds a list from a seed value. Accepts an iterator function, which returns
   * either false to stop iteration or an array of length 2 containing the value
   * to add to the resulting list and the seed to be used in the next call to the
   * iterator function.
   *
   * The iterator function receives one argument: *(seed)*.
   *
   * @func
   * @memberOf R
   * @since v0.10.0
   * @category List
   * @sig (a -> [b]) -> * -> [b]
   * @param {Function} fn The iterator function. receives one argument, `seed`, and returns
   *        either false to quit iteration or an array of length two to proceed. The element
   *        at index 0 of this array will be added to the resulting array, and the element
   *        at index 1 will be passed to the next call to `fn`.
   * @param {*} seed The seed value.
   * @return {Array} The final list.
   * @example
   *
   *      const f = n => n > 50 ? false : [-n, n + 10];
   *      R.unfold(f, 10); //=> [-10, -20, -30, -40, -50]
   * @symb R.unfold(f, x) = [f(x)[0], f(f(x)[1])[0], f(f(f(x)[1])[1])[0], ...]
   */

  var unfold = _curry2(function unfold(fn, seed) {
    var pair = fn(seed);
    var result = [];

    while (pair && pair.length) {
      result[result.length] = pair[0];
      pair = fn(pair[1]);
    }

    return result;
  });

  /**
   * Combines two lists into a set (i.e. no duplicates) composed of the elements
   * of each list.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Relation
   * @sig [*] -> [*] -> [*]
   * @param {Array} as The first list.
   * @param {Array} bs The second list.
   * @return {Array} The first and second lists concatenated, with
   *         duplicates removed.
   * @example
   *
   *      R.union([1, 2, 3], [2, 3, 4]); //=> [1, 2, 3, 4]
   */

  var union = _curry2(compose(uniq, _concat));

  function XUniqWith(pred, xf) {
    this.xf = xf;
    this.pred = pred;
    this.items = [];
  }

  XUniqWith.prototype['@@transducer/init'] = _xfBase.init;
  XUniqWith.prototype['@@transducer/result'] = _xfBase.result;

  XUniqWith.prototype['@@transducer/step'] = function (result, input) {
    if (_includesWith(this.pred, input, this.items)) {
      return result;
    } else {
      this.items.push(input);
      return this.xf['@@transducer/step'](result, input);
    }
  };

  var _xuniqWith = _curry2(function _xuniqWith(pred, xf) {
    return new XUniqWith(pred, xf);
  });

  /**
   * Returns a new list containing only one copy of each element in the original
   * list, based upon the value returned by applying the supplied predicate to
   * two list elements. Prefers the first item if two items compare equal based
   * on the predicate.
   *
   * Acts as a transducer if a transformer is given in list position.
   *
   * @func
   * @memberOf R
   * @since v0.2.0
   * @category List
   * @sig ((a, a) -> Boolean) -> [a] -> [a]
   * @param {Function} pred A predicate used to test whether two items are equal.
   * @param {Array} list The array to consider.
   * @return {Array} The list of unique items.
   * @example
   *
   *      const strEq = R.eqBy(String);
   *      R.uniqWith(strEq)([1, '1', 2, 1]); //=> [1, 2]
   *      R.uniqWith(strEq)([{}, {}]);       //=> [{}]
   *      R.uniqWith(strEq)([1, '1', 1]);    //=> [1]
   *      R.uniqWith(strEq)(['1', 1, 1]);    //=> ['1']
   */

  var uniqWith = _curry2(_dispatchable([], _xuniqWith, function (pred, list) {
    var idx = 0;
    var len = list.length;
    var result = [];
    var item;

    while (idx < len) {
      item = list[idx];

      if (!_includesWith(pred, item, result)) {
        result[result.length] = item;
      }

      idx += 1;
    }

    return result;
  }));

  /**
   * Combines two lists into a set (i.e. no duplicates) composed of the elements
   * of each list. Duplication is determined according to the value returned by
   * applying the supplied predicate to two list elements. If an element exists
   * in both lists, the first element from the first list will be used.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category Relation
   * @sig ((a, a) -> Boolean) -> [*] -> [*] -> [*]
   * @param {Function} pred A predicate used to test whether two items are equal.
   * @param {Array} list1 The first list.
   * @param {Array} list2 The second list.
   * @return {Array} The first and second lists concatenated, with
   *         duplicates removed.
   * @see R.union
   * @example
   *
   *      const l1 = [{a: 1}, {a: 2}];
   *      const l2 = [{a: 1}, {a: 4}];
   *      R.unionWith(R.eqBy(R.prop('a')), l1, l2); //=> [{a: 1}, {a: 2}, {a: 4}]
   */

  var unionWith = _curry3(function unionWith(pred, list1, list2) {
    return uniqWith(pred, _concat(list1, list2));
  });

  /**
   * Tests the final argument by passing it to the given predicate function. If
   * the predicate is not satisfied, the function will return the result of
   * calling the `whenFalseFn` function with the same argument. If the predicate
   * is satisfied, the argument is returned as is.
   *
   * @func
   * @memberOf R
   * @since v0.18.0
   * @category Logic
   * @sig (a -> Boolean) -> (a -> b) -> a -> a | b
   * @param {Function} pred        A predicate function
   * @param {Function} whenFalseFn A function to invoke when the `pred` evaluates
   *                               to a falsy value.
   * @param {*}        x           An object to test with the `pred` function and
   *                               pass to `whenFalseFn` if necessary.
   * @return {*} Either `x` or the result of applying `x` to `whenFalseFn`.
   * @see R.ifElse, R.when, R.cond
   * @example
   *
   *      let safeInc = R.unless(R.isNil, R.inc);
   *      safeInc(null); //=> null
   *      safeInc(1); //=> 2
   */

  var unless = _curry3(function unless(pred, whenFalseFn, x) {
    return pred(x) ? x : whenFalseFn(x);
  });

  /**
   * Shorthand for `R.chain(R.identity)`, which removes one level of nesting from
   * any [Chain](https://github.com/fantasyland/fantasy-land#chain).
   *
   * @func
   * @memberOf R
   * @since v0.3.0
   * @category List
   * @sig Chain c => c (c a) -> c a
   * @param {*} list
   * @return {*}
   * @see R.flatten, R.chain
   * @example
   *
   *      R.unnest([1, [2], [[3]]]); //=> [1, 2, [3]]
   *      R.unnest([[1, 2], [3, 4], [5, 6]]); //=> [1, 2, 3, 4, 5, 6]
   */

  var unnest = chain(_identity);

  /**
   * Takes a predicate, a transformation function, and an initial value,
   * and returns a value of the same type as the initial value.
   * It does so by applying the transformation until the predicate is satisfied,
   * at which point it returns the satisfactory value.
   *
   * @func
   * @memberOf R
   * @since v0.20.0
   * @category Logic
   * @sig (a -> Boolean) -> (a -> a) -> a -> a
   * @param {Function} pred A predicate function
   * @param {Function} fn The iterator function
   * @param {*} init Initial value
   * @return {*} Final value that satisfies predicate
   * @example
   *
   *      R.until(R.gt(R.__, 100), R.multiply(2))(1) // => 128
   */

  var until = _curry3(function until(pred, fn, init) {
    var val = init;

    while (!pred(val)) {
      val = fn(val);
    }

    return val;
  });

  /**
   *
   * Deconstructs an array field from the input documents to output a document for each element.
   * Each output document is the input document with the value of the array field replaced by the element.
   *
   * @func
   * @memberOf R
   * @since v0.28.0
   * @category Object
   * @sig String -> {k: [v]} -> [{k: v}]
   * @param {String} key The key to determine which property of the object should be unwind
   * @param {Object} object The object containing list under property named as key which is to unwind
   * @return {List} A new list of object containing the value of input key having list replaced by each element in the object.
   * @example
   *
   * R.unwind('hobbies', {
   *   name: 'alice',
   *   hobbies: ['Golf', 'Hacking'],
   *   colors: ['red', 'green'],
   * });
   * // [
   * //   { name: 'alice', hobbies: 'Golf', colors: ['red', 'green'] },
   * //   { name: 'alice', hobbies: 'Hacking', colors: ['red', 'green'] }
   * // ]
   */

  var unwind = _curry2(function (key, object) {
    // If key is not in object or key is not as a list in object
    if (!(key in object && _isArray(object[key]))) {
      return [object];
    } // Map over object[key] which is a list and assoc each element with key


    return _map(function (item) {
      return _assoc(key, item, object);
    }, object[key]);
  });

  /**
   * Returns a list of all the properties, including prototype properties, of the
   * supplied object.
   * Note that the order of the output array is not guaranteed to be consistent
   * across different JS platforms.
   *
   * @func
   * @memberOf R
   * @since v0.2.0
   * @category Object
   * @sig {k: v} -> [v]
   * @param {Object} obj The object to extract values from
   * @return {Array} An array of the values of the object's own and prototype properties.
   * @see R.values, R.keysIn
   * @example
   *
   *      const F = function() { this.x = 'X'; };
   *      F.prototype.y = 'Y';
   *      const f = new F();
   *      R.valuesIn(f); //=> ['X', 'Y']
   */

  var valuesIn = _curry1(function valuesIn(obj) {
    var prop;
    var vs = [];

    for (prop in obj) {
      vs[vs.length] = obj[prop];
    }

    return vs;
  });

  var Const = function Const(x) {
    return {
      value: x,
      'fantasy-land/map': function fantasyLandMap() {
        return this;
      }
    };
  };
  /**
   * Returns a "view" of the given data structure, determined by the given lens.
   * The lens's focus determines which portion of the data structure is visible.
   *
   * @func
   * @memberOf R
   * @since v0.16.0
   * @category Object
   * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
   * @sig Lens s a -> s -> a
   * @param {Lens} lens
   * @param {*} x
   * @return {*}
   * @see R.set, R.over, R.lens, R.lensIndex, R.lensProp, R.lensPath
   * @example
   *
   *      const xLens = R.lensProp('x');
   *
   *      R.view(xLens, {x: 1, y: 2});  //=> 1
   *      R.view(xLens, {x: 4, y: 2});  //=> 4
   */


  var view = _curry2(function view(lens, x) {
    // Using `Const` effectively ignores the setter function of the `lens`,
    // leaving the value returned by the getter function unmodified.
    return lens(Const)(x).value;
  });

  /**
   * Tests the final argument by passing it to the given predicate function. If
   * the predicate is satisfied, the function will return the result of calling
   * the `whenTrueFn` function with the same argument. If the predicate is not
   * satisfied, the argument is returned as is.
   *
   * @func
   * @memberOf R
   * @since v0.18.0
   * @category Logic
   * @sig (a -> Boolean) -> (a -> b) -> a -> a | b
   * @param {Function} pred       A predicate function
   * @param {Function} whenTrueFn A function to invoke when the `condition`
   *                              evaluates to a truthy value.
   * @param {*}        x          An object to test with the `pred` function and
   *                              pass to `whenTrueFn` if necessary.
   * @return {*} Either `x` or the result of applying `x` to `whenTrueFn`.
   * @see R.ifElse, R.unless, R.cond
   * @example
   *
   *      // truncate :: String -> String
   *      const truncate = R.when(
   *        R.propSatisfies(R.gt(R.__, 10), 'length'),
   *        R.pipe(R.take(10), R.append('…'), R.join(''))
   *      );
   *      truncate('12345');         //=> '12345'
   *      truncate('0123456789ABC'); //=> '0123456789…'
   */

  var when = _curry3(function when(pred, whenTrueFn, x) {
    return pred(x) ? whenTrueFn(x) : x;
  });

  /**
   * Takes a spec object and a test object; returns true if the test satisfies
   * the spec. Each of the spec's own properties must be a predicate function.
   * Each predicate is applied to the value of the corresponding property of the
   * test object. `where` returns true if all the predicates return true, false
   * otherwise.
   *
   * `where` is well suited to declaratively expressing constraints for other
   * functions such as [`filter`](#filter) and [`find`](#find).
   *
   * @func
   * @memberOf R
   * @since v0.1.1
   * @category Object
   * @sig {String: (* -> Boolean)} -> {String: *} -> Boolean
   * @param {Object} spec
   * @param {Object} testObj
   * @return {Boolean}
   * @see R.propSatisfies, R.whereEq
   * @example
   *
   *      // pred :: Object -> Boolean
   *      const pred = R.where({
   *        a: R.equals('foo'),
   *        b: R.complement(R.equals('bar')),
   *        x: R.gt(R.__, 10),
   *        y: R.lt(R.__, 20)
   *      });
   *
   *      pred({a: 'foo', b: 'xxx', x: 11, y: 19}); //=> true
   *      pred({a: 'xxx', b: 'xxx', x: 11, y: 19}); //=> false
   *      pred({a: 'foo', b: 'bar', x: 11, y: 19}); //=> false
   *      pred({a: 'foo', b: 'xxx', x: 10, y: 19}); //=> false
   *      pred({a: 'foo', b: 'xxx', x: 11, y: 20}); //=> false
   */

  var where = _curry2(function where(spec, testObj) {
    for (var prop in spec) {
      if (_has(prop, spec) && !spec[prop](testObj[prop])) {
        return false;
      }
    }

    return true;
  });

  /**
   * Takes a spec object and a test object; each of the spec's own properties must be a predicate function.
   * Each predicate is applied to the value of the corresponding property of the
   * test object. `whereAny` returns true if at least one of the predicates return true,
   * false otherwise.
   *
   * `whereAny` is well suited to declaratively expressing constraints for other
   * functions such as [`filter`](#filter) and [`find`](#find).
   *
   * @func
   * @memberOf R
   * @since v0.28.0
   * @category Object
   * @sig {String: (* -> Boolean)} -> {String: *} -> Boolean
   * @param {Object} spec
   * @param {Object} testObj
   * @return {Boolean}
   * @see R.propSatisfies, R.where
   * @example
   *
   *      // pred :: Object -> Boolean
   *      const pred = R.whereAny({
   *        a: R.equals('foo'),
   *        b: R.complement(R.equals('xxx')),
   *        x: R.gt(R.__, 10),
   *        y: R.lt(R.__, 20)
   *      });
   *
   *      pred({a: 'foo', b: 'xxx', x: 8, y: 34}); //=> true
   *      pred({a: 'xxx', b: 'xxx', x: 9, y: 21}); //=> false
   *      pred({a: 'bar', b: 'xxx', x: 10, y: 20}); //=> false
   *      pred({a: 'foo', b: 'bar', x: 10, y: 20}); //=> true
   *      pred({a: 'foo', b: 'xxx', x: 11, y: 20}); //=> true
   */

  var whereAny = _curry2(function whereAny(spec, testObj) {
    for (var prop in spec) {
      if (_has(prop, spec) && spec[prop](testObj[prop])) {
        return true;
      }
    }

    return false;
  });

  /**
   * Takes a spec object and a test object; returns true if the test satisfies
   * the spec, false otherwise. An object satisfies the spec if, for each of the
   * spec's own properties, accessing that property of the object gives the same
   * value (in [`R.equals`](#equals) terms) as accessing that property of the
   * spec.
   *
   * `whereEq` is a specialization of [`where`](#where).
   *
   * @func
   * @memberOf R
   * @since v0.14.0
   * @category Object
   * @sig {String: *} -> {String: *} -> Boolean
   * @param {Object} spec
   * @param {Object} testObj
   * @return {Boolean}
   * @see R.propEq, R.where
   * @example
   *
   *      // pred :: Object -> Boolean
   *      const pred = R.whereEq({a: 1, b: 2});
   *
   *      pred({a: 1});              //=> false
   *      pred({a: 1, b: 2});        //=> true
   *      pred({a: 1, b: 2, c: 3});  //=> true
   *      pred({a: 1, b: 1});        //=> false
   */

  var whereEq = _curry2(function whereEq(spec, testObj) {
    return where(map(equals, spec), testObj);
  });

  /**
   * Returns a new list without values in the first argument.
   * [`R.equals`](#equals) is used to determine equality.
   *
   * Acts as a transducer if a transformer is given in list position.
   *
   * @func
   * @memberOf R
   * @since v0.19.0
   * @category List
   * @sig [a] -> [a] -> [a]
   * @param {Array} list1 The values to be removed from `list2`.
   * @param {Array} list2 The array to remove values from.
   * @return {Array} The new array without values in `list1`.
   * @see R.transduce, R.difference, R.remove
   * @example
   *
   *      R.without([1, 2], [1, 2, 1, 3, 4]); //=> [3, 4]
   */

  var without = _curry2(function (xs, list) {
    return reject(flip(_includes)(xs), list);
  });

  /**
   * Exclusive disjunction logical operation.
   * Returns `true` if one of the arguments is truthy and the other is falsy.
   * Otherwise, it returns `false`.
   *
   * @func
   * @memberOf R
   * @since v0.27.1
   * @category Logic
   * @sig a -> b -> Boolean
   * @param {Any} a
   * @param {Any} b
   * @return {Boolean} true if one of the arguments is truthy and the other is falsy
   * @see R.or, R.and
   * @example
   *
   *      R.xor(true, true); //=> false
   *      R.xor(true, false); //=> true
   *      R.xor(false, true); //=> true
   *      R.xor(false, false); //=> false
   */

  var xor = _curry2(function xor(a, b) {
    return Boolean(!a ^ !b);
  });

  /**
   * Creates a new list out of the two supplied by creating each possible pair
   * from the lists.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig [a] -> [b] -> [[a,b]]
   * @param {Array} as The first list.
   * @param {Array} bs The second list.
   * @return {Array} The list made by combining each possible pair from
   *         `as` and `bs` into pairs (`[a, b]`).
   * @example
   *
   *      R.xprod([1, 2], ['a', 'b']); //=> [[1, 'a'], [1, 'b'], [2, 'a'], [2, 'b']]
   * @symb R.xprod([a, b], [c, d]) = [[a, c], [a, d], [b, c], [b, d]]
   */

  var xprod = _curry2(function xprod(a, b) {
    // = xprodWith(prepend); (takes about 3 times as long...)
    var idx = 0;
    var ilen = a.length;
    var j;
    var jlen = b.length;
    var result = [];

    while (idx < ilen) {
      j = 0;

      while (j < jlen) {
        result[result.length] = [a[idx], b[j]];
        j += 1;
      }

      idx += 1;
    }

    return result;
  });

  /**
   * Creates a new list out of the two supplied by pairing up equally-positioned
   * items from both lists. The returned list is truncated to the length of the
   * shorter of the two input lists.
   * Note: `zip` is equivalent to `zipWith(function(a, b) { return [a, b] })`.
   *
   * @func
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig [a] -> [b] -> [[a,b]]
   * @param {Array} list1 The first array to consider.
   * @param {Array} list2 The second array to consider.
   * @return {Array} The list made by pairing up same-indexed elements of `list1` and `list2`.
   * @example
   *
   *      R.zip([1, 2, 3], ['a', 'b', 'c']); //=> [[1, 'a'], [2, 'b'], [3, 'c']]
   * @symb R.zip([a, b, c], [d, e, f]) = [[a, d], [b, e], [c, f]]
   */

  var zip = _curry2(function zip(a, b) {
    var rv = [];
    var idx = 0;
    var len = Math.min(a.length, b.length);

    while (idx < len) {
      rv[idx] = [a[idx], b[idx]];
      idx += 1;
    }

    return rv;
  });

  /**
   * Creates a new object out of a list of keys and a list of values.
   * Key/value pairing is truncated to the length of the shorter of the two lists.
   * Note: `zipObj` is equivalent to `pipe(zip, fromPairs)`.
   *
   * @func
   * @memberOf R
   * @since v0.3.0
   * @category List
   * @sig [String] -> [*] -> {String: *}
   * @param {Array} keys The array that will be properties on the output object.
   * @param {Array} values The list of values on the output object.
   * @return {Object} The object made by pairing up same-indexed elements of `keys` and `values`.
   * @example
   *
   *      R.zipObj(['a', 'b', 'c'], [1, 2, 3]); //=> {a: 1, b: 2, c: 3}
   */

  var zipObj = _curry2(function zipObj(keys, values) {
    var idx = 0;
    var len = Math.min(keys.length, values.length);
    var out = {};

    while (idx < len) {
      out[keys[idx]] = values[idx];
      idx += 1;
    }

    return out;
  });

  /**
   * Creates a new list out of the two supplied by applying the function to each
   * equally-positioned pair in the lists. The returned list is truncated to the
   * length of the shorter of the two input lists.
   *
   * @function
   * @memberOf R
   * @since v0.1.0
   * @category List
   * @sig ((a, b) -> c) -> [a] -> [b] -> [c]
   * @param {Function} fn The function used to combine the two elements into one value.
   * @param {Array} list1 The first array to consider.
   * @param {Array} list2 The second array to consider.
   * @return {Array} The list made by combining same-indexed elements of `list1` and `list2`
   *         using `fn`.
   * @example
   *
   *      const f = (x, y) => {
   *        // ...
   *      };
   *      R.zipWith(f, [1, 2, 3], ['a', 'b', 'c']);
   *      //=> [f(1, 'a'), f(2, 'b'), f(3, 'c')]
   * @symb R.zipWith(fn, [a, b, c], [d, e, f]) = [fn(a, d), fn(b, e), fn(c, f)]
   */

  var zipWith = _curry3(function zipWith(fn, a, b) {
    var rv = [];
    var idx = 0;
    var len = Math.min(a.length, b.length);

    while (idx < len) {
      rv[idx] = fn(a[idx], b[idx]);
      idx += 1;
    }

    return rv;
  });

  /**
   * Creates a thunk out of a function. A thunk delays a calculation until
   * its result is needed, providing lazy evaluation of arguments.
   *
   * @func
   * @memberOf R
   * @since v0.26.0
   * @category Function
   * @sig ((a, b, ..., j) -> k) -> (a, b, ..., j) -> (() -> k)
   * @param {Function} fn A function to wrap in a thunk
   * @return {Function} Expects arguments for `fn` and returns a new function
   *  that, when called, applies those arguments to `fn`.
   * @see R.partial, R.partialRight
   * @example
   *
   *      R.thunkify(R.identity)(42)(); //=> 42
   *      R.thunkify((a, b) => a + b)(25, 17)(); //=> 42
   */

  var thunkify = _curry1(function thunkify(fn) {
    return curryN(fn.length, function createThunk() {
      var fnArgs = arguments;
      return function invokeThunk() {
        return fn.apply(this, fnArgs);
      };
    });
  });

  exports.F = F;
  exports.T = T;
  exports.__ = __;
  exports.add = add;
  exports.addIndex = addIndex;
  exports.adjust = adjust;
  exports.all = all;
  exports.allPass = allPass;
  exports.always = always;
  exports.and = and;
  exports.andThen = andThen;
  exports.any = any;
  exports.anyPass = anyPass;
  exports.ap = ap;
  exports.aperture = aperture;
  exports.append = append;
  exports.apply = apply;
  exports.applySpec = applySpec;
  exports.applyTo = applyTo;
  exports.ascend = ascend;
  exports.assoc = assoc;
  exports.assocPath = assocPath;
  exports.binary = binary;
  exports.bind = bind;
  exports.both = both;
  exports.call = call;
  exports.chain = chain;
  exports.clamp = clamp;
  exports.clone = clone;
  exports.collectBy = collectBy;
  exports.comparator = comparator;
  exports.complement = complement;
  exports.compose = compose;
  exports.composeWith = composeWith;
  exports.concat = concat;
  exports.cond = cond;
  exports.construct = construct;
  exports.constructN = constructN;
  exports.converge = converge;
  exports.count = count;
  exports.countBy = countBy;
  exports.curry = curry;
  exports.curryN = curryN;
  exports.dec = dec;
  exports.defaultTo = defaultTo;
  exports.descend = descend;
  exports.difference = difference;
  exports.differenceWith = differenceWith;
  exports.dissoc = dissoc;
  exports.dissocPath = dissocPath;
  exports.divide = divide;
  exports.drop = drop;
  exports.dropLast = dropLast$1;
  exports.dropLastWhile = dropLastWhile$1;
  exports.dropRepeats = dropRepeats;
  exports.dropRepeatsWith = dropRepeatsWith;
  exports.dropWhile = dropWhile;
  exports.either = either;
  exports.empty = empty;
  exports.endsWith = endsWith;
  exports.eqBy = eqBy;
  exports.eqProps = eqProps;
  exports.equals = equals;
  exports.evolve = evolve;
  exports.filter = filter;
  exports.find = find;
  exports.findIndex = findIndex;
  exports.findLast = findLast;
  exports.findLastIndex = findLastIndex;
  exports.flatten = flatten;
  exports.flip = flip;
  exports.forEach = forEach;
  exports.forEachObjIndexed = forEachObjIndexed;
  exports.fromPairs = fromPairs;
  exports.groupBy = groupBy;
  exports.groupWith = groupWith;
  exports.gt = gt;
  exports.gte = gte;
  exports.has = has;
  exports.hasIn = hasIn;
  exports.hasPath = hasPath;
  exports.head = head;
  exports.identical = identical;
  exports.identity = identity;
  exports.ifElse = ifElse;
  exports.inc = inc;
  exports.includes = includes;
  exports.indexBy = indexBy;
  exports.indexOf = indexOf;
  exports.init = init;
  exports.innerJoin = innerJoin;
  exports.insert = insert;
  exports.insertAll = insertAll;
  exports.intersection = intersection;
  exports.intersperse = intersperse;
  exports.into = into;
  exports.invert = invert;
  exports.invertObj = invertObj;
  exports.invoker = invoker;
  exports.is = is;
  exports.isEmpty = isEmpty;
  exports.isNil = isNil;
  exports.join = join;
  exports.juxt = juxt;
  exports.keys = keys;
  exports.keysIn = keysIn;
  exports.last = last;
  exports.lastIndexOf = lastIndexOf;
  exports.length = length;
  exports.lens = lens;
  exports.lensIndex = lensIndex;
  exports.lensPath = lensPath;
  exports.lensProp = lensProp;
  exports.lift = lift;
  exports.liftN = liftN;
  exports.lt = lt;
  exports.lte = lte;
  exports.map = map;
  exports.mapAccum = mapAccum;
  exports.mapAccumRight = mapAccumRight;
  exports.mapObjIndexed = mapObjIndexed;
  exports.match = match;
  exports.mathMod = mathMod;
  exports.max = max;
  exports.maxBy = maxBy;
  exports.mean = mean;
  exports.median = median;
  exports.memoizeWith = memoizeWith;
  exports.mergeAll = mergeAll;
  exports.mergeDeepLeft = mergeDeepLeft;
  exports.mergeDeepRight = mergeDeepRight;
  exports.mergeDeepWith = mergeDeepWith;
  exports.mergeDeepWithKey = mergeDeepWithKey;
  exports.mergeLeft = mergeLeft;
  exports.mergeRight = mergeRight;
  exports.mergeWith = mergeWith;
  exports.mergeWithKey = mergeWithKey;
  exports.min = min;
  exports.minBy = minBy;
  exports.modify = modify;
  exports.modifyPath = modifyPath;
  exports.modulo = modulo;
  exports.move = move;
  exports.multiply = multiply;
  exports.nAry = nAry;
  exports.negate = negate;
  exports.none = none;
  exports.not = not;
  exports.nth = nth;
  exports.nthArg = nthArg;
  exports.o = o;
  exports.objOf = objOf;
  exports.of = of;
  exports.omit = omit;
  exports.on = on;
  exports.once = once;
  exports.or = or;
  exports.otherwise = otherwise;
  exports.over = over;
  exports.pair = pair;
  exports.partial = partial;
  exports.partialObject = partialObject;
  exports.partialRight = partialRight;
  exports.partition = partition;
  exports.path = path;
  exports.pathEq = pathEq;
  exports.pathOr = pathOr;
  exports.pathSatisfies = pathSatisfies;
  exports.paths = paths;
  exports.pick = pick;
  exports.pickAll = pickAll;
  exports.pickBy = pickBy;
  exports.pipe = pipe;
  exports.pipeWith = pipeWith;
  exports.pluck = pluck;
  exports.prepend = prepend;
  exports.product = product;
  exports.project = project;
  exports.promap = promap;
  exports.prop = prop;
  exports.propEq = propEq;
  exports.propIs = propIs;
  exports.propOr = propOr;
  exports.propSatisfies = propSatisfies;
  exports.props = props;
  exports.range = range;
  exports.reduce = reduce;
  exports.reduceBy = reduceBy;
  exports.reduceRight = reduceRight;
  exports.reduceWhile = reduceWhile;
  exports.reduced = reduced;
  exports.reject = reject;
  exports.remove = remove;
  exports.repeat = repeat;
  exports.replace = replace;
  exports.reverse = reverse;
  exports.scan = scan;
  exports.sequence = sequence;
  exports.set = set;
  exports.slice = slice;
  exports.sort = sort;
  exports.sortBy = sortBy;
  exports.sortWith = sortWith;
  exports.split = split;
  exports.splitAt = splitAt;
  exports.splitEvery = splitEvery;
  exports.splitWhen = splitWhen;
  exports.splitWhenever = splitWhenever;
  exports.startsWith = startsWith;
  exports.subtract = subtract;
  exports.sum = sum;
  exports.symmetricDifference = symmetricDifference;
  exports.symmetricDifferenceWith = symmetricDifferenceWith;
  exports.tail = tail;
  exports.take = take;
  exports.takeLast = takeLast;
  exports.takeLastWhile = takeLastWhile;
  exports.takeWhile = takeWhile;
  exports.tap = tap;
  exports.test = test;
  exports.thunkify = thunkify;
  exports.times = times;
  exports.toLower = toLower;
  exports.toPairs = toPairs;
  exports.toPairsIn = toPairsIn;
  exports.toString = toString$1;
  exports.toUpper = toUpper;
  exports.transduce = transduce;
  exports.transpose = transpose;
  exports.traverse = traverse;
  exports.trim = trim;
  exports.tryCatch = tryCatch;
  exports.type = type;
  exports.unapply = unapply;
  exports.unary = unary;
  exports.uncurryN = uncurryN;
  exports.unfold = unfold;
  exports.union = union;
  exports.unionWith = unionWith;
  exports.uniq = uniq;
  exports.uniqBy = uniqBy;
  exports.uniqWith = uniqWith;
  exports.unless = unless;
  exports.unnest = unnest;
  exports.until = until;
  exports.unwind = unwind;
  exports.update = update;
  exports.useWith = useWith;
  exports.values = values;
  exports.valuesIn = valuesIn;
  exports.view = view;
  exports.when = when;
  exports.where = where;
  exports.whereAny = whereAny;
  exports.whereEq = whereEq;
  exports.without = without;
  exports.xor = xor;
  exports.xprod = xprod;
  exports.zip = zip;
  exports.zipObj = zipObj;
  exports.zipWith = zipWith;

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

})));
!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((t=t||self).R={})}(this,function(t){"use strict";function f(t){return(f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function a(t){return null!=t&&"object"===f(t)&&!0===t["@@functional/placeholder"]}function o(r){return function t(n){return 0===arguments.length||a(n)?t:r.apply(this,arguments)}}function n(e){return function t(n,r){switch(arguments.length){case 0:return t;case 1:return a(n)?t:o(function(t){return e(n,t)});default:return a(n)&&a(r)?t:a(n)?o(function(t){return e(t,r)}):a(r)?o(function(t){return e(n,t)}):e(n,r)}}}var r=n(function(t,n){return+t+ +n});function c(t,n){var r,e=(t=t||[]).length,u=(n=n||[]).length,i=[];for(r=0;r<e;)i[i.length]=t[r],r+=1;for(r=0;r<u;)i[i.length]=n[r],r+=1;return i}function s(t,f){switch(t){case 0:return function(){return f.apply(this,arguments)};case 1:return function(t){return f.apply(this,arguments)};case 2:return function(t,n){return f.apply(this,arguments)};case 3:return function(t,n,r){return f.apply(this,arguments)};case 4:return function(t,n,r,e){return f.apply(this,arguments)};case 5:return function(t,n,r,e,u){return f.apply(this,arguments)};case 6:return function(t,n,r,e,u,i){return f.apply(this,arguments)};case 7:return function(t,n,r,e,u,i,o){return f.apply(this,arguments)};case 8:return function(t,n,r,e,u,i,o,c){return f.apply(this,arguments)};case 9:return function(t,n,r,e,u,i,o,c,a){return f.apply(this,arguments)};case 10:return function(t,n,r,e,u,i,o,c,a,s){return f.apply(this,arguments)};default:throw Error("First argument to _arity must be a non-negative integer no greater than ten")}}function l(i,o,c){return function(){for(var t=[],n=0,r=i,e=0;e<o.length||n<arguments.length;){var u;o.length<=e||a(o[e])&&n<arguments.length?(u=arguments[n],n+=1):u=o[e],a(t[e]=u)||(r-=1),e+=1}return 0<r?s(r,l(i,t,c)):c.apply(this,t)}}var p=n(function(t,n){return 1===t?o(n):s(t,l(t,[],n))}),e=o(function(u){return p(u.length,function(){var n=0,r=arguments[0],e=arguments[arguments.length-1],t=Array.prototype.slice.call(arguments,0);return t[0]=function(){var t=r.apply(this,c(arguments,[n,e]));return n+=1,t},u.apply(this,t)})});function u(i){return function t(r,e,u){switch(arguments.length){case 0:return t;case 1:return a(r)?t:n(function(t,n){return i(r,t,n)});case 2:return a(r)&&a(e)?t:a(r)?n(function(t,n){return i(t,e,n)}):a(e)?n(function(t,n){return i(r,t,n)}):o(function(t){return i(r,e,t)});default:return a(r)&&a(e)&&a(u)?t:a(r)&&a(e)?n(function(t,n){return i(t,n,u)}):a(r)&&a(u)?n(function(t,n){return i(t,e,n)}):a(e)&&a(u)?n(function(t,n){return i(r,t,n)}):a(r)?o(function(t){return i(t,e,u)}):a(e)?o(function(t){return i(r,t,u)}):a(u)?o(function(t){return i(r,e,t)}):i(r,e,u)}}}var i=u(function(t,n,r){var e=r.length;if(e<=t||t<-e)return r;var u=(e+t)%e,i=c(r);return i[u]=n(r[u]),i}),h=Array.isArray||function(t){return null!=t&&0<=t.length&&"[object Array]"===Object.prototype.toString.call(t)};function y(t){return null!=t&&"function"==typeof t["@@transducer/step"]}function d(r,e,u){return function(){if(0===arguments.length)return u();var t=arguments[arguments.length-1];if(!h(t)){for(var n=0;n<r.length;){if("function"==typeof t[r[n]])return t[r[n]].apply(t,Array.prototype.slice.call(arguments,0,-1));n+=1}if(y(t))return e.apply(null,Array.prototype.slice.call(arguments,0,-1))(t)}return u.apply(this,arguments)}}function g(t){return t&&t["@@transducer/reduced"]?t:{"@@transducer/value":t,"@@transducer/reduced":!0}}var v={init:function(){return this.xf["@@transducer/init"]()},result:function(t){return this.xf["@@transducer/result"](t)}};function m(t,n){this.xf=n,this.f=t,this.all=!0}m.prototype["@@transducer/init"]=v.init,m.prototype["@@transducer/result"]=function(t){return this.all&&(t=this.xf["@@transducer/step"](t,!0)),this.xf["@@transducer/result"](t)},m.prototype["@@transducer/step"]=function(t,n){return this.f(n)||(this.all=!1,t=g(this.xf["@@transducer/step"](t,!1))),t};var b=n(d(["all"],n(function(t,n){return new m(t,n)}),function(t,n){for(var r=0;r<n.length;){if(!t(n[r]))return!1;r+=1}return!0})),x=n(function(t,n){return t<n?n:t});function w(t,n){for(var r=0,e=n.length,u=Array(e);r<e;)u[r]=t(n[r]),r+=1;return u}function j(t){return"[object String]"===Object.prototype.toString.call(t)}var A=o(function(t){return!!h(t)||!!t&&("object"===f(t)&&(!j(t)&&(0===t.length||0<t.length&&(t.hasOwnProperty(0)&&t.hasOwnProperty(t.length-1)))))});function O(t){this.f=t}function S(t){return new O(t)}O.prototype["@@transducer/init"]=function(){throw Error("init not implemented on XWrap")},O.prototype["@@transducer/result"]=function(t){return t},O.prototype["@@transducer/step"]=function(t,n){return this.f(t,n)};var E=n(function(t,n){return s(t.length,function(){return t.apply(n,arguments)})});function _(t,n,r){for(var e=r.next();!e.done;){if((n=t["@@transducer/step"](n,e.value))&&n["@@transducer/reduced"]){n=n["@@transducer/value"];break}e=r.next()}return t["@@transducer/result"](n)}function I(t,n,r,e){return t["@@transducer/result"](r[e](E(t["@@transducer/step"],t),n))}var k="undefined"!=typeof Symbol?Symbol.iterator:"@@iterator";function W(t,n,r){if("function"==typeof t&&(t=S(t)),A(r))return function(t,n,r){for(var e=0,u=r.length;e<u;){if((n=t["@@transducer/step"](n,r[e]))&&n["@@transducer/reduced"]){n=n["@@transducer/value"];break}e+=1}return t["@@transducer/result"](n)}(t,n,r);if("function"==typeof r["fantasy-land/reduce"])return I(t,n,r,"fantasy-land/reduce");if(null!=r[k])return _(t,n,r[k]());if("function"==typeof r.next)return _(t,n,r);if("function"==typeof r.reduce)return I(t,n,r,"reduce");throw new TypeError("reduce: list must be array or iterable")}function q(t,n){this.xf=n,this.f=t}q.prototype["@@transducer/init"]=v.init,q.prototype["@@transducer/result"]=v.result,q.prototype["@@transducer/step"]=function(t,n){return this.xf["@@transducer/step"](t,this.f(n))};var N=n(function(t,n){return new q(t,n)});function U(t,n){return Object.prototype.hasOwnProperty.call(n,t)}function F(t,n){for(var r=0;r<t.length;){if(t[r]===n)return!0;r+=1}return!1}var P=Object.prototype.toString,B=function(){return"[object Arguments]"===P.call(arguments)?function(t){return"[object Arguments]"===P.call(t)}:function(t){return U("callee",t)}}(),C=!{toString:null}.propertyIsEnumerable("toString"),T=["constructor","valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],R=function(){return arguments.propertyIsEnumerable("length")}(),D=o("function"!=typeof Object.keys||R?function(t){if(Object(t)!==t)return[];var n,r,e=[],u=R&&B(t);for(n in t)!U(n,t)||u&&"length"===n||(e[e.length]=n);if(C)for(r=T.length-1;0<=r;)U(n=T[r],t)&&!F(e,n)&&(e[e.length]=n),r-=1;return e}:function(t){return Object(t)!==t?[]:Object.keys(t)}),z=n(d(["fantasy-land/map","map"],N,function(r,e){switch(Object.prototype.toString.call(e)){case"[object Function]":return p(e.length,function(){return r.call(this,e.apply(this,arguments))});case"[object Object]":return W(function(t,n){return t[n]=r(e[n]),t},{},D(e));default:return w(r,e)}})),M=Number.isInteger||function(t){return t<<0===t},L=n(function(t,n){var r=t<0?n.length+t:t;return j(n)?n[0|r]:n[r]}),V=n(function(t,n){if(null!=n)return M(t)?L(t,n):n[t]}),G=n(function(t,n){return z(V(t),n)}),K=u(W),$=o(function(r){return p(K(x,0,G("length",r)),function(){for(var t=0,n=r.length;t<n;){if(!r[t].apply(this,arguments))return!1;t+=1}return!0})}),H=o(function(t){return function(){return t}}),J=n(function(t,n){return t&&n});function X(t,n){this.xf=n,this.f=t,this.any=!1}X.prototype["@@transducer/init"]=v.init,X.prototype["@@transducer/result"]=function(t){return this.any||(t=this.xf["@@transducer/step"](t,!1)),this.xf["@@transducer/result"](t)},X.prototype["@@transducer/step"]=function(t,n){return this.f(n)&&(this.any=!0,t=g(this.xf["@@transducer/step"](t,!0))),t};var Y=n(d(["any"],n(function(t,n){return new X(t,n)}),function(t,n){for(var r=0;r<n.length;){if(t(n[r]))return!0;r+=1}return!1})),Z=o(function(r){return p(K(x,0,G("length",r)),function(){for(var t=0,n=r.length;t<n;){if(r[t].apply(this,arguments))return!0;t+=1}return!1})}),Q=n(function(n,r){return"function"==typeof r["fantasy-land/ap"]?r["fantasy-land/ap"](n):"function"==typeof n.ap?n.ap(r):"function"==typeof n?function(t){return n(t)(r(t))}:W(function(t,n){return c(t,z(n,r))},[],n)});function tt(t,n){this.xf=n,this.pos=0,this.full=!1,this.acc=Array(t)}tt.prototype["@@transducer/init"]=v.init,tt.prototype["@@transducer/result"]=function(t){return this.acc=null,this.xf["@@transducer/result"](t)},tt.prototype["@@transducer/step"]=function(t,n){return this.store(n),this.full?this.xf["@@transducer/step"](t,this.getCopy()):t},tt.prototype.store=function(t){this.acc[this.pos]=t,this.pos+=1,this.pos===this.acc.length&&(this.pos=0,this.full=!0)},tt.prototype.getCopy=function(){return c(Array.prototype.slice.call(this.acc,this.pos),Array.prototype.slice.call(this.acc,0,this.pos))};var nt=n(d([],n(function(t,n){return new tt(t,n)}),function(t,n){for(var r=0,e=n.length-(t-1),u=Array(e<0?0:e);r<e;)u[r]=Array.prototype.slice.call(n,r,r+t),r+=1;return u})),rt=n(function(t,n){return c(n,[t])}),et=n(function(t,n){return t.apply(this,n)}),ut=o(function(t){for(var n=D(t),r=n.length,e=[],u=0;u<r;)e[u]=t[n[u]],u+=1;return e});function it(r,e){return h(e)?e.map(r):D(e).reduce(function(t,n){return t[n]=r(e[n]),t},{})}var ot=o(function n(t){return t=it(function(t){return"function"==typeof t?t:n(t)},t),p(K(x,0,G("length",ut(t))),function(){var n=arguments;return it(function(t){return et(t,n)},t)})}),ct=n(function(t,n){return n(t)}),at=u(function(t,n,r){var e=t(n),u=t(r);return e<u?-1:u<e?1:0});function st(t,n,r){if(M(t)&&h(r)){var e=[].concat(r);return e[t]=n,e}var u={};for(var i in r)u[i]=r[i];return u[t]=n,u}var ft=o(function(t){return null==t}),lt=u(function t(n,r,e){if(0===n.length)return r;var u=n[0];if(1<n.length){var i=!ft(e)&&U(u,e)?e[u]:M(n[1])?[]:{};r=t(Array.prototype.slice.call(n,1),r,i)}return st(u,r,e)}),pt=u(function(t,n,r){return lt([t],n,r)}),ht=n(function(t,f){switch(t){case 0:return function(){return f.call(this)};case 1:return function(t){return f.call(this,t)};case 2:return function(t,n){return f.call(this,t,n)};case 3:return function(t,n,r){return f.call(this,t,n,r)};case 4:return function(t,n,r,e){return f.call(this,t,n,r,e)};case 5:return function(t,n,r,e,u){return f.call(this,t,n,r,e,u)};case 6:return function(t,n,r,e,u,i){return f.call(this,t,n,r,e,u,i)};case 7:return function(t,n,r,e,u,i,o){return f.call(this,t,n,r,e,u,i,o)};case 8:return function(t,n,r,e,u,i,o,c){return f.call(this,t,n,r,e,u,i,o,c)};case 9:return function(t,n,r,e,u,i,o,c,a){return f.call(this,t,n,r,e,u,i,o,c,a)};case 10:return function(t,n,r,e,u,i,o,c,a,s){return f.call(this,t,n,r,e,u,i,o,c,a,s)};default:throw Error("First argument to nAry must be a non-negative integer no greater than ten")}}),yt=o(function(t){return ht(2,t)});function dt(t){var n=Object.prototype.toString.call(t);return"[object Function]"===n||"[object AsyncFunction]"===n||"[object GeneratorFunction]"===n||"[object AsyncGeneratorFunction]"===n}var gt=n(function(t,n){var r=p(t,n);return p(t,function(){return W(Q,z(r,arguments[0]),Array.prototype.slice.call(arguments,1))})}),vt=o(function(t){return gt(t.length,t)}),mt=n(function(t,n){return dt(t)?function(){return t.apply(this,arguments)&&n.apply(this,arguments)}:vt(J)(t,n)}),bt=o(function(t){return t.apply(this,Array.prototype.slice.call(arguments,1))});function xt(a){return function t(n){for(var r,e,u,i=[],o=0,c=n.length;o<c;){if(A(n[o]))for(u=0,e=(r=a?t(n[o]):n[o]).length;u<e;)i[i.length]=r[u],u+=1;else i[i.length]=n[o];o+=1}return i}}function wt(t){var r=function(e){return{"@@transducer/init":v.init,"@@transducer/result":function(t){return e["@@transducer/result"](t)},"@@transducer/step":function(t,n){var r=e["@@transducer/step"](t,n);return r["@@transducer/reduced"]?function(t){return{"@@transducer/value":t,"@@transducer/reduced":!0}}(r):r}}}(t);return{"@@transducer/init":v.init,"@@transducer/result":function(t){return r["@@transducer/result"](t)},"@@transducer/step":function(t,n){return A(n)?W(r,t,n):W(r,t,[n])}}}var jt=n(d(["fantasy-land/chain","chain"],n(function(t,n){return z(t,wt(n))}),function(n,r){return"function"==typeof r?function(t){return n(r(t))(t)}:xt(!1)(z(n,r))})),At=u(function(t,n,r){if(n<t)throw Error("min must not be greater than max in clamp(min, max, value)");return r<t?t:n<r?n:r});function Ot(t){return RegExp(t.source,(t.global?"g":"")+(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.sticky?"y":"")+(t.unicode?"u":""))}var St=o(function(t){return null===t?"Null":void 0===t?"Undefined":Object.prototype.toString.call(t).slice(8,-1)});function Et(u,i,o,c){function t(t){for(var n=i.length,r=0;r<n;){if(u===i[r])return o[r];r+=1}for(var e in i[r]=u,o[r]=t,u)u.hasOwnProperty(e)&&(t[e]=c?Et(u[e],i,o,!0):u[e]);return t}switch(St(u)){case"Object":return t(Object.create(Object.getPrototypeOf(u)));case"Array":return t([]);case"Date":return new Date(u.valueOf());case"RegExp":return Ot(u);case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"BigInt64Array":case"BigUint64Array":return u.slice();default:return u}}var _t=o(function(t){return null!=t&&"function"==typeof t.clone?t.clone():Et(t,[],[],!0)}),It=n(function(e,t){var n=W(function(t,n){var r=e(n);return void 0===t[r]&&(t[r]=[]),t[r].push(n),t},{},t),r=[];for(var u in n)r.push(n[u]);return r}),kt=o(function(r){return function(t,n){return r(t,n)?-1:r(n,t)?1:0}}),Wt=o(function(t){return!t}),qt=vt(Wt);function Nt(t,n){return function(){return n.call(this,t.apply(this,arguments))}}function Ut(r,e){return function(){var t=arguments.length;if(0===t)return e();var n=arguments[t-1];return h(n)||"function"!=typeof n[r]?e.apply(this,arguments):n[r].apply(n,Array.prototype.slice.call(arguments,0,t-1))}}var Ft=u(Ut("slice",function(t,n,r){return Array.prototype.slice.call(r,t,n)})),Pt=o(Ut("tail",Ft(1,1/0)));function Bt(){if(0===arguments.length)throw Error("pipe requires at least one argument");return s(arguments[0].length,K(Nt,arguments[0],Pt(arguments)))}var Ct=o(function(t){return j(t)?t.split("").reverse().join(""):Array.prototype.slice.call(t,0).reverse()});function Tt(){if(0===arguments.length)throw Error("compose requires at least one argument");return Bt.apply(this,Ct(arguments))}var Rt=L(0);function Dt(t){return t}var zt=o(Dt),Mt=n(function(r,t){if(t.length<=0)return zt;var n=Rt(t),e=Pt(t);return s(n.length,function(){return W(function(t,n){return r.call(this,n,t)},n.apply(this,arguments),e)})}),Lt=n(function(t,n){return Mt.call(this,t,Ct(n))});function Vt(t){for(var n,r=[];!(n=t.next()).done;)r.push(n.value);return r}function Gt(t,n,r){for(var e=0,u=r.length;e<u;){if(t(n,r[e]))return!0;e+=1}return!1}var Kt="function"==typeof Object.is?Object.is:function(t,n){return t===n?0!==t||1/t==1/n:t!=t&&n!=n};function $t(t,n,r,e){var u=Vt(t);function i(t,n){return Ht(t,n,r.slice(),e.slice())}return!Gt(function(t,n){return!Gt(i,n,t)},Vt(n),u)}function Ht(t,n,r,e){if(Kt(t,n))return!0;var u=St(t);if(u!==St(n))return!1;if("function"==typeof t["fantasy-land/equals"]||"function"==typeof n["fantasy-land/equals"])return"function"==typeof t["fantasy-land/equals"]&&t["fantasy-land/equals"](n)&&"function"==typeof n["fantasy-land/equals"]&&n["fantasy-land/equals"](t);if("function"==typeof t.equals||"function"==typeof n.equals)return"function"==typeof t.equals&&t.equals(n)&&"function"==typeof n.equals&&n.equals(t);switch(u){case"Arguments":case"Array":case"Object":if("function"==typeof t.constructor&&"Promise"===function(t){var n=(t+"").match(/^function (\w*)/);return null==n?"":n[1]}(t.constructor))return t===n;break;case"Boolean":case"Number":case"String":if(f(t)!==f(n)||!Kt(t.valueOf(),n.valueOf()))return!1;break;case"Date":if(!Kt(t.valueOf(),n.valueOf()))return!1;break;case"Error":return t.name===n.name&&t.message===n.message;case"RegExp":if(t.source!==n.source||t.global!==n.global||t.ignoreCase!==n.ignoreCase||t.multiline!==n.multiline||t.sticky!==n.sticky||t.unicode!==n.unicode)return!1}for(var i=r.length-1;0<=i;){if(r[i]===t)return e[i]===n;i-=1}switch(u){case"Map":return t.size===n.size&&$t(t.entries(),n.entries(),r.concat([t]),e.concat([n]));case"Set":return t.size===n.size&&$t(t.values(),n.values(),r.concat([t]),e.concat([n]));case"Arguments":case"Array":case"Object":case"Boolean":case"Number":case"String":case"Date":case"Error":case"RegExp":case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"ArrayBuffer":break;default:return!1}var o=D(t);if(o.length!==D(n).length)return!1;var c=r.concat([t]),a=e.concat([n]);for(i=o.length-1;0<=i;){var s=o[i];if(!U(s,n)||!Ht(n[s],t[s],c,a))return!1;i-=1}return!0}var Jt=n(function(t,n){return Ht(t,n,[],[])});function Xt(t,n,r){var e,u;if("function"==typeof t.indexOf)switch(f(n)){case"number":if(0===n){for(e=1/n;r<t.length;){if(0===(u=t[r])&&1/u==e)return r;r+=1}return-1}if(n==n)return t.indexOf(n,r);for(;r<t.length;){if("number"==typeof(u=t[r])&&u!=u)return r;r+=1}return-1;case"string":case"boolean":case"function":case"undefined":return t.indexOf(n,r);case"object":if(null===n)return t.indexOf(n,r)}for(;r<t.length;){if(Jt(t[r],n))return r;r+=1}return-1}function Yt(t,n){return 0<=Xt(n,t,0)}function Zt(t){return'"'+t.replace(/\\/g,"\\\\").replace(/[\b]/g,"\\b").replace(/\f/g,"\\f").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t").replace(/\v/g,"\\v").replace(/\0/g,"\\0").replace(/"/g,'\\"')+'"'}function Qt(t){return(t<10?"0":"")+t}var tn="function"==typeof Date.prototype.toISOString?function(t){return t.toISOString()}:function(t){return t.getUTCFullYear()+"-"+Qt(1+t.getUTCMonth())+"-"+Qt(t.getUTCDate())+"T"+Qt(t.getUTCHours())+":"+Qt(t.getUTCMinutes())+":"+Qt(t.getUTCSeconds())+"."+(t.getUTCMilliseconds()/1e3).toFixed(3).slice(2,5)+"Z"};function nn(t){return function(){return!t.apply(this,arguments)}}function rn(t,n){for(var r=0,e=n.length,u=[];r<e;)t(n[r])&&(u[u.length]=n[r]),r+=1;return u}function en(t){return"[object Object]"===Object.prototype.toString.call(t)}function un(t,n){this.xf=n,this.f=t}un.prototype["@@transducer/init"]=v.init,un.prototype["@@transducer/result"]=v.result,un.prototype["@@transducer/step"]=function(t,n){return this.f(n)?this.xf["@@transducer/step"](t,n):t};var on=n(d(["fantasy-land/filter","filter"],n(function(t,n){return new un(t,n)}),function(r,e){return en(e)?W(function(t,n){return r(e[n])&&(t[n]=e[n]),t},{},D(e)):rn(r,e)})),cn=n(function(t,n){return on(nn(t),n)});function an(r,e){function u(t){var n=e.concat([r]);return Yt(t,n)?"<Circular>":an(t,n)}function t(n,t){return w(function(t){return Zt(t)+": "+u(n[t])},t.slice().sort())}switch(Object.prototype.toString.call(r)){case"[object Arguments]":return"(function() { return arguments; }("+w(u,r).join(", ")+"))";case"[object Array]":return"["+w(u,r).concat(t(r,cn(function(t){return/^\d+$/.test(t)},D(r)))).join(", ")+"]";case"[object Boolean]":return"object"===f(r)?"new Boolean("+u(r.valueOf())+")":""+r;case"[object Date]":return"new Date("+(isNaN(r.valueOf())?u(NaN):Zt(tn(r)))+")";case"[object Null]":return"null";case"[object Number]":return"object"===f(r)?"new Number("+u(r.valueOf())+")":1/r==-1/0?"-0":r.toString(10);case"[object String]":return"object"===f(r)?"new String("+u(r.valueOf())+")":Zt(r);case"[object Undefined]":return"undefined";default:if("function"==typeof r.toString){var n=""+r;if("[object Object]"!=n)return n}return"{"+t(r,D(r)).join(", ")+"}"}}var sn=o(function(t){return an(t,[])}),fn=n(function(t,n){if(h(t)){if(h(n))return t.concat(n);throw new TypeError(sn(n)+" is not an array")}if(j(t)){if(j(n))return t+n;throw new TypeError(sn(n)+" is not a string")}if(null!=t&&dt(t["fantasy-land/concat"]))return t["fantasy-land/concat"](n);if(null!=t&&dt(t.concat))return t.concat(n);throw new TypeError(sn(t)+' does not have a method named "concat" or "fantasy-land/concat"')}),ln=o(function(n){return s(K(x,0,z(function(t){return t[0].length},n)),function(){for(var t=0;t<n.length;){if(n[t][0].apply(this,arguments))return n[t][1].apply(this,arguments);t+=1}})}),pn=o(function(t){return p(t.length,t)}),hn=n(function(t,f){if(10<t)throw Error("Constructor with greater than ten arguments");return 0===t?function(){return new f}:pn(ht(t,function(t,n,r,e,u,i,o,c,a,s){switch(arguments.length){case 1:return new f(t);case 2:return new f(t,n);case 3:return new f(t,n,r);case 4:return new f(t,n,r,e);case 5:return new f(t,n,r,e,u);case 6:return new f(t,n,r,e,u,i);case 7:return new f(t,n,r,e,u,i,o);case 8:return new f(t,n,r,e,u,i,o,c);case 9:return new f(t,n,r,e,u,i,o,c,a);case 10:return new f(t,n,r,e,u,i,o,c,a,s)}}))}),yn=o(function(t){return hn(t.length,t)}),dn=n(function(t,e){return p(K(x,0,G("length",e)),function(){var n=arguments,r=this;return t.apply(r,w(function(t){return t.apply(r,n)},e))})}),gn=pn(function(r,t){return W(function(t,n){return r(n)?t+1:t},0,t)});function vn(t,n,r,e){this.valueFn=t,this.valueAcc=n,this.keyFn=r,this.xf=e,this.inputs={}}vn.prototype["@@transducer/init"]=v.init,vn.prototype["@@transducer/result"]=function(t){var n;for(n in this.inputs)if(U(n,this.inputs)&&(t=this.xf["@@transducer/step"](t,this.inputs[n]))["@@transducer/reduced"]){t=t["@@transducer/value"];break}return this.inputs=null,this.xf["@@transducer/result"](t)},vn.prototype["@@transducer/step"]=function(t,n){var r=this.keyFn(n);return this.inputs[r]=this.inputs[r]||[r,this.valueAcc],this.inputs[r][1]=this.valueFn(this.inputs[r][1],n),t};var mn=l(4,[],d([],l(4,[],function(t,n,r,e){return new vn(t,n,r,e)}),function(u,i,o,t){return W(function(t,n){var r=o(n),e=u(U(r,t)?t[r]:Et(i,[],[],!1),n);return e&&e["@@transducer/reduced"]?g(t):(t[r]=e,t)},{},t)})),bn=mn(function(t,n){return t+1},0),xn=r(-1),wn=n(function(t,n){return null==n||n!=n?t:n}),jn=u(function(t,n,r){var e=t(n),u=t(r);return u<e?-1:e<u?1:0});function An(){this._nativeSet="function"==typeof Set?new Set:null,this._items={}}function On(t,n,r){var e,u=f(t);switch(u){case"string":case"number":return 0===t&&1/t==-1/0?!!r._items["-0"]||(n&&(r._items["-0"]=!0),!1):null!==r._nativeSet?n?(e=r._nativeSet.size,r._nativeSet.add(t),r._nativeSet.size===e):r._nativeSet.has(t):u in r._items?t in r._items[u]||(n&&(r._items[u][t]=!0),!1):(n&&(r._items[u]={},r._items[u][t]=!0),!1);case"boolean":if(u in r._items){var i=t?1:0;return!!r._items[u][i]||(n&&(r._items[u][i]=!0),!1)}return n&&(r._items[u]=t?[!1,!0]:[!0,!1]),!1;case"function":return null!==r._nativeSet?n?(e=r._nativeSet.size,r._nativeSet.add(t),r._nativeSet.size===e):r._nativeSet.has(t):u in r._items?!!Yt(t,r._items[u])||(n&&r._items[u].push(t),!1):(n&&(r._items[u]=[t]),!1);case"undefined":return!!r._items[u]||(n&&(r._items[u]=!0),!1);case"object":if(null===t)return!!r._items.null||(n&&(r._items.null=!0),!1);default:return(u=Object.prototype.toString.call(t))in r._items?!!Yt(t,r._items[u])||(n&&r._items[u].push(t),!1):(n&&(r._items[u]=[t]),!1)}}An.prototype.add=function(t){return!On(t,!0,this)},An.prototype.has=function(t){return On(t,!1,this)};var Sn=n(function(t,n){for(var r=[],e=0,u=t.length,i=n.length,o=new An,c=0;c<i;c+=1)o.add(n[c]);for(;e<u;)o.add(t[e])&&(r[r.length]=t[e]),e+=1;return r}),En=u(function(t,n,r){for(var e=[],u=0,i=n.length;u<i;)Gt(t,n[u],r)||Gt(t,n[u],e)||e.push(n[u]),u+=1;return e}),_n=u(function(t,n,r){var e=Array.prototype.slice.call(r,0);return e.splice(t,n),e});var In=n(function t(n,r){if(null==r)return r;switch(n.length){case 0:return r;case 1:return function(t,n){if(null==n)return n;if(M(t)&&h(n))return _n(t,1,n);var r={};for(var e in n)r[e]=n[e];return delete r[t],r}(n[0],r);default:var e=n[0],u=Array.prototype.slice.call(n,1);return null==r[e]?function(t,n){if(M(t)&&h(n))return[].concat(n);var r={};for(var e in n)r[e]=n[e];return r}(e,r):pt(e,t(u,r[e]),r)}}),kn=n(function(t,n){return In([t],n)}),Wn=n(function(t,n){return t/n});function qn(t,n){this.xf=n,this.n=t}qn.prototype["@@transducer/init"]=v.init,qn.prototype["@@transducer/result"]=v.result,qn.prototype["@@transducer/step"]=function(t,n){return 0<this.n?(this.n-=1,t):this.xf["@@transducer/step"](t,n)};var Nn=n(d(["drop"],n(function(t,n){return new qn(t,n)}),function(t,n){return Ft(Math.max(0,t),1/0,n)}));function Un(t,n){this.xf=n,this.n=t,this.i=0}Un.prototype["@@transducer/init"]=v.init,Un.prototype["@@transducer/result"]=v.result,Un.prototype["@@transducer/step"]=function(t,n){this.i+=1;var r=0===this.n?t:this.xf["@@transducer/step"](t,n);return this.n<0||this.i<this.n?r:g(r)};var Fn=n(d(["take"],n(function(t,n){return new Un(t,n)}),function(t,n){return Ft(0,t<0?1/0:t,n)}));function Pn(t,n){this.xf=n,this.pos=0,this.full=!1,this.acc=Array(t)}Pn.prototype["@@transducer/init"]=v.init,Pn.prototype["@@transducer/result"]=function(t){return this.acc=null,this.xf["@@transducer/result"](t)},Pn.prototype["@@transducer/step"]=function(t,n){return this.full&&(t=this.xf["@@transducer/step"](t,this.acc[this.pos])),this.store(n),t},Pn.prototype.store=function(t){this.acc[this.pos]=t,this.pos+=1,this.pos===this.acc.length&&(this.pos=0,this.full=!0)};var Bn=n(d([],n(function(t,n){return new Pn(t,n)}),function(t,n){return Fn(t<n.length?n.length-t:0,n)}));function Cn(t,n){this.f=t,this.retained=[],this.xf=n}Cn.prototype["@@transducer/init"]=v.init,Cn.prototype["@@transducer/result"]=function(t){return this.retained=null,this.xf["@@transducer/result"](t)},Cn.prototype["@@transducer/step"]=function(t,n){return this.f(n)?this.retain(t,n):this.flush(t,n)},Cn.prototype.flush=function(t,n){return t=W(this.xf["@@transducer/step"],t,this.retained),this.retained=[],this.xf["@@transducer/step"](t,n)},Cn.prototype.retain=function(t,n){return this.retained.push(n),t};var Tn=n(d([],n(function(t,n){return new Cn(t,n)}),function(t,n){for(var r=n.length-1;0<=r&&t(n[r]);)r-=1;return Ft(0,r+1,n)}));function Rn(t,n){this.xf=n,this.pred=t,this.lastValue=void 0,this.seenFirstValue=!1}Rn.prototype["@@transducer/init"]=v.init,Rn.prototype["@@transducer/result"]=v.result,Rn.prototype["@@transducer/step"]=function(t,n){var r=!1;return this.seenFirstValue?this.pred(this.lastValue,n)&&(r=!0):this.seenFirstValue=!0,this.lastValue=n,r?t:this.xf["@@transducer/step"](t,n)};var Dn=n(function(t,n){return new Rn(t,n)}),zn=L(-1),Mn=n(d([],Dn,function(t,n){var r=[],e=1,u=n.length;if(0!==u)for(r[0]=n[0];e<u;)t(zn(r),n[e])||(r[r.length]=n[e]),e+=1;return r})),Ln=o(d([],Dn(Jt),Mn(Jt)));function Vn(t,n){this.xf=n,this.f=t}Vn.prototype["@@transducer/init"]=v.init,Vn.prototype["@@transducer/result"]=v.result,Vn.prototype["@@transducer/step"]=function(t,n){if(this.f){if(this.f(n))return t;this.f=null}return this.xf["@@transducer/step"](t,n)};var Gn=n(d(["dropWhile"],n(function(t,n){return new Vn(t,n)}),function(t,n){for(var r=0,e=n.length;r<e&&t(n[r]);)r+=1;return Ft(r,1/0,n)})),Kn=n(function(t,n){return t||n}),$n=n(function(t,n){return dt(t)?function(){return t.apply(this,arguments)||n.apply(this,arguments)}:vt(Kn)(t,n)});var Hn=o(function(t){return null!=t&&"function"==typeof t["fantasy-land/empty"]?t["fantasy-land/empty"]():null!=t&&null!=t.constructor&&"function"==typeof t.constructor["fantasy-land/empty"]?t.constructor["fantasy-land/empty"]():null!=t&&"function"==typeof t.empty?t.empty():null!=t&&null!=t.constructor&&"function"==typeof t.constructor.empty?t.constructor.empty():h(t)?[]:j(t)?"":en(t)?{}:B(t)?function(){return arguments}():function(t){var n=Object.prototype.toString.call(t);return"[object Uint8ClampedArray]"===n||"[object Int8Array]"===n||"[object Uint8Array]"===n||"[object Int16Array]"===n||"[object Uint16Array]"===n||"[object Int32Array]"===n||"[object Uint32Array]"===n||"[object Float32Array]"===n||"[object Float64Array]"===n||"[object BigInt64Array]"===n||"[object BigUint64Array]"===n}(t)?t.constructor.from(""):void 0}),Jn=n(function(t,n){return Nn(t<0?0:n.length-t,n)}),Xn=n(function(t,n){return Jt(Jn(t.length,n),t)}),Yn=u(function(t,n,r){return Jt(t(n),t(r))}),Zn=u(function(t,n,r){return Jt(n[t],r[t])}),Qn=n(function t(n,r){if(!en(r)&&!h(r))return r;var e,u,i,o=r instanceof Array?[]:{};for(u in r)i=f(e=n[u]),o[u]="function"===i?e(r[u]):e&&"object"===i?t(e,r[u]):r[u];return o});function tr(t,n){this.xf=n,this.f=t,this.found=!1}tr.prototype["@@transducer/init"]=v.init,tr.prototype["@@transducer/result"]=function(t){return this.found||(t=this.xf["@@transducer/step"](t,void 0)),this.xf["@@transducer/result"](t)},tr.prototype["@@transducer/step"]=function(t,n){return this.f(n)&&(this.found=!0,t=g(this.xf["@@transducer/step"](t,n))),t};var nr=n(d(["find"],n(function(t,n){return new tr(t,n)}),function(t,n){for(var r=0,e=n.length;r<e;){if(t(n[r]))return n[r];r+=1}}));function rr(t,n){this.xf=n,this.f=t,this.idx=-1,this.found=!1}rr.prototype["@@transducer/init"]=v.init,rr.prototype["@@transducer/result"]=function(t){return this.found||(t=this.xf["@@transducer/step"](t,-1)),this.xf["@@transducer/result"](t)},rr.prototype["@@transducer/step"]=function(t,n){return this.idx+=1,this.f(n)&&(this.found=!0,t=g(this.xf["@@transducer/step"](t,this.idx))),t};var er=n(d([],n(function(t,n){return new rr(t,n)}),function(t,n){for(var r=0,e=n.length;r<e;){if(t(n[r]))return r;r+=1}return-1}));function ur(t,n){this.xf=n,this.f=t}ur.prototype["@@transducer/init"]=v.init,ur.prototype["@@transducer/result"]=function(t){return this.xf["@@transducer/result"](this.xf["@@transducer/step"](t,this.last))},ur.prototype["@@transducer/step"]=function(t,n){return this.f(n)&&(this.last=n),t};var ir=n(d([],n(function(t,n){return new ur(t,n)}),function(t,n){for(var r=n.length-1;0<=r;){if(t(n[r]))return n[r];r-=1}}));function or(t,n){this.xf=n,this.f=t,this.idx=-1,this.lastIdx=-1}or.prototype["@@transducer/init"]=v.init,or.prototype["@@transducer/result"]=function(t){return this.xf["@@transducer/result"](this.xf["@@transducer/step"](t,this.lastIdx))},or.prototype["@@transducer/step"]=function(t,n){return this.idx+=1,this.f(n)&&(this.lastIdx=this.idx),t};var cr=n(d([],n(function(t,n){return new or(t,n)}),function(t,n){for(var r=n.length-1;0<=r;){if(t(n[r]))return r;r-=1}return-1})),ar=o(xt(!0)),sr=o(function(e){return p(e.length,function(t,n){var r=Array.prototype.slice.call(arguments,0);return r[0]=n,r[1]=t,e.apply(this,r)})}),fr=n(Ut("forEach",function(t,n){for(var r=n.length,e=0;e<r;)t(n[e]),e+=1;return n})),lr=n(function(t,n){for(var r=D(n),e=0;e<r.length;){var u=r[e];t(n[u],u,n),e+=1}return n}),pr=o(function(t){for(var n={},r=0;r<t.length;)n[t[r][0]]=t[r][1],r+=1;return n}),hr=n(Ut("groupBy",mn(function(t,n){return t.push(n),t},[]))),yr=n(function(t,n){for(var r=[],e=0,u=n.length;e<u;){for(var i=e+1;i<u&&t(n[i-1],n[i]);)i+=1;r.push(n.slice(e,i)),e=i}return r}),dr=n(function(t,n){return n<t}),gr=n(function(t,n){return n<=t}),vr=n(function(t,n){if(0===t.length||ft(n))return!1;for(var r=n,e=0;e<t.length;){if(ft(r)||!U(t[e],r))return!1;r=r[t[e]],e+=1}return!0}),mr=n(function(t,n){return vr([t],n)}),br=n(function(t,n){return!ft(n)&&t in n}),xr=n(Kt),wr=u(function(t,n,r){return p(Math.max(t.length,n.length,r.length),function(){return t.apply(this,arguments)?n.apply(this,arguments):r.apply(this,arguments)})}),jr=r(1),Ar=n(Yt),Or=mn(function(t,n){return n},null),Sr=n(function(t,n){return"function"!=typeof n.indexOf||h(n)?Xt(n,t,0):n.indexOf(t)}),Er=Ft(0,-1),_r=u(function(n,t,r){return rn(function(t){return Gt(n,t,r)},t)}),Ir=u(function(t,n,r){t=t<r.length&&0<=t?t:r.length;var e=Array.prototype.slice.call(r,0);return e.splice(t,0,n),e}),kr=u(function(t,n,r){return[].concat(Array.prototype.slice.call(r,0,t=t<r.length&&0<=t?t:r.length),n,Array.prototype.slice.call(r,t))});function Wr(t,n){this.xf=n,this.f=t,this.set=new An}Wr.prototype["@@transducer/init"]=v.init,Wr.prototype["@@transducer/result"]=v.result,Wr.prototype["@@transducer/step"]=function(t,n){return this.set.add(this.f(n))?this.xf["@@transducer/step"](t,n):t};var qr=n(d([],n(function(t,n){return new Wr(t,n)}),function(t,n){for(var r,e,u=new An,i=[],o=0;o<n.length;)r=t(e=n[o]),u.add(r)&&i.push(e),o+=1;return i})),Nr=qr(zt),Ur=n(function(t,n){var r,e;return e=n.length<t.length?(r=t,n):(r=n,t),Nr(rn(sr(Yt)(r),e))}),Fr=n(Ut("intersperse",function(t,n){for(var r=[],e=0,u=n.length;e<u;)e===u-1?r.push(n[e]):r.push(n[e],t),e+=1;return r}));var Pr="function"==typeof Object.assign?Object.assign:function(t){if(null==t)throw new TypeError("Cannot convert undefined or null to object");for(var n=Object(t),r=1,e=arguments.length;r<e;){var u=arguments[r];if(null!=u)for(var i in u)U(i,u)&&(n[i]=u[i]);r+=1}return n},Br=n(function(t,n){var r={};return r[t]=n,r}),Cr={"@@transducer/init":Array,"@@transducer/step":function(t,n){return t.push(n),t},"@@transducer/result":Dt},Tr={"@@transducer/init":String,"@@transducer/step":function(t,n){return t+n},"@@transducer/result":Dt},Rr={"@@transducer/init":Object,"@@transducer/step":function(t,n){return Pr(t,A(n)?Br(n[0],n[1]):n)},"@@transducer/result":Dt};var Dr=u(function(t,n,r){return y(t)?W(n(t),t["@@transducer/init"](),r):W(n(function(t){if(y(t))return t;if(A(t))return Cr;if("string"==typeof t)return Tr;if("object"===f(t))return Rr;throw Error("Cannot create transformer for "+t)}(t)),Et(t,[],[],!1),r)}),zr=o(function(t){for(var n=D(t),r=n.length,e=0,u={};e<r;){var i=n[e],o=t[i],c=U(o,u)?u[o]:u[o]=[];c[c.length]=i,e+=1}return u}),Mr=o(function(t){for(var n=D(t),r=n.length,e=0,u={};e<r;){var i=n[e];u[t[i]]=i,e+=1}return u}),Lr=n(function(n,r){return p(n+1,function(){var t=arguments[n];if(null!=t&&dt(t[r]))return t[r].apply(t,Array.prototype.slice.call(arguments,0,n));throw new TypeError(sn(t)+' does not have a method named "'+r+'"')})}),Vr=n(function(t,n){return n instanceof t||null!=n&&(n.constructor===t||"Object"===t.name&&"object"===f(n))}),Gr=o(function(t){return null!=t&&Jt(t,Hn(t))}),Kr=Lr(1,"join"),$r=o(function(t){return dn(function(){return Array.prototype.slice.call(arguments,0)},t)}),Hr=o(function(t){var n,r=[];for(n in t)r[r.length]=n;return r}),Jr=n(function(t,n){if("function"!=typeof n.lastIndexOf||h(n)){for(var r=n.length-1;0<=r;){if(Jt(n[r],t))return r;r-=1}return-1}return n.lastIndexOf(t)});function Xr(t){return"[object Number]"===Object.prototype.toString.call(t)}var Yr=o(function(t){return null!=t&&Xr(t.length)?t.length:NaN}),Zr=n(function(r,e){return function(t){return function(n){return z(function(t){return e(t,n)},t(r(n)))}}}),Qr=u(function(t,n,r){return i(t,H(n),r)}),te=o(function(t){return Zr(L(t),Qr(t))}),ne=n(function(t,u){return t.map(function(t){for(var n,r=u,e=0;e<t.length;){if(null==r)return;r=M(n=t[e])?L(n,r):r[n],e+=1}return r})}),re=n(function(t,n){return ne([t],n)[0]}),ee=o(function(t){return Zr(re(t),lt(t))}),ue=o(function(t){return Zr(V(t),pt(t))}),ie=n(function(t,n){return t<n}),oe=n(function(t,n){return t<=n}),ce=u(function(t,n,r){for(var e=0,u=r.length,i=[],o=[n];e<u;)o=t(o[0],r[e]),i[e]=o[1],e+=1;return[o[0],i]}),ae=u(function(t,n,r){for(var e=r.length-1,u=[],i=[n];0<=e;)i=t(i[0],r[e]),u[e]=i[1],e-=1;return[i[0],u]}),se=n(function(r,e){return W(function(t,n){return t[n]=r(e[n],n,e),t},{},D(e))}),fe=n(function(t,n){return n.match(t)||[]}),le=n(function(t,n){return M(t)?!M(n)||n<1?NaN:(t%n+n)%n:NaN}),pe=u(function(t,n,r){return t(r)>t(n)?r:n}),he=K(r,0),ye=o(function(t){return he(t)/t.length}),de=o(function(t){var n=t.length;if(0===n)return NaN;var r=2-n%2,e=(n-r)/2;return ye(Array.prototype.slice.call(t,0).sort(function(t,n){return t<n?-1:n<t?1:0}).slice(e,e+r))}),ge=n(function(n,r){var e={};return s(r.length,function(){var t=n.apply(this,arguments);return U(t,e)||(e[t]=r.apply(this,arguments)),e[t]})}),ve=o(function(t){return Pr.apply(null,[{}].concat(t))}),me=u(function(t,n,r){var e,u={};for(e in n)U(e,n)&&(u[e]=U(e,r)?t(e,n[e],r[e]):n[e]);for(e in r)U(e,r)&&!U(e,u)&&(u[e]=r[e]);return u}),be=u(function e(u,t,n){return me(function(t,n,r){return en(n)&&en(r)?e(u,n,r):u(t,n,r)},t,n)}),xe=n(function(t,n){return be(function(t,n,r){return n},t,n)}),we=n(function(t,n){return be(function(t,n,r){return r},t,n)}),je=u(function(e,t,n){return be(function(t,n,r){return e(n,r)},t,n)}),Ae=n(function(t,n){return Pr({},n,t)}),Oe=n(function(t,n){return Pr({},t,n)}),Se=u(function(e,t,n){return me(function(t,n,r){return e(n,r)},t,n)}),Ee=n(function(t,n){return n<t?n:t}),_e=u(function(t,n,r){return t(r)<t(n)?r:n});var Ie=u(function t(n,r,e){if(!en(e)&&!h(e)||0===n.length)return e;var u=n[0];if(!U(u,e))return e;if(1===n.length)return function(t,n,r){if(M(t)&&h(r)){var e=[].concat(r);return e[t]=n(e[t]),e}var u={};for(var i in r)u[i]=r[i];return u[t]=n(u[t]),u}(u,r,e);var i=t(Array.prototype.slice.call(n,1),r,e[u]);return i===e[u]?e:st(u,i,e)}),ke=u(function(t,n,r){return Ie([t],n,r)}),We=n(function(t,n){return t%n}),qe=u(function(t,n,r){var e=r.length,u=r.slice(),i=t<0?e+t:t,o=n<0?e+n:n,c=u.splice(i,1);return i<0||r.length<=i||o<0||r.length<=o?r:[].concat(u.slice(0,o)).concat(c).concat(u.slice(o,r.length))}),Ne=n(function(t,n){return t*n}),Ue=n(function(n,r){return function(t){return n.call(void 0,we(r,t))}}),Fe=o(function(t){return-t}),Pe=n(function(t,n){return b(nn(t),n)}),Be=o(function(t){return p(t<0?1:t+1,function(){return L(t,arguments)})}),Ce=u(function(t,n,r){return t(n(r))});var Te=o(function(t){return[t]}),Re=n(function(t,n){for(var r={},e={},u=0,i=t.length;u<i;)u+=e[t[u]]=1;for(var o in n)e.hasOwnProperty(o)||(r[o]=n[o]);return r}),De=l(4,[],function(t,n,r,e){return t(n(r),n(e))}),ze=o(function(t){var n,r=!1;return s(t.length,function(){return r?n:(r=!0,n=t.apply(this,arguments))})});function Me(t,n){if(null==n||!dt(n.then))throw new TypeError("`"+t+"` expected a Promise, received "+an(n,[]))}var Le=n(function(t,n){return Me("otherwise",n),n.then(null,t)}),Ve=u(function(t,n,r){return t(function(t){return function n(r){return{value:r,map:function(t){return n(t(r))}}}(n(t))})(r).value}),Ge=n(function(t,n){return[t,n]});function Ke(r){return n(function(t,n){return s(Math.max(0,t.length-n.length),function(){return t.apply(this,r(n,arguments))})})}var $e=Ke(c),He=Ke(sr(c)),Je=$r([on,cn]),Xe=u(function(t,n,r){return Jt(re(t,r),n)}),Ye=u(function(t,n,r){return wn(t,re(n,r))}),Ze=u(function(t,n,r){return t(re(n,r))}),Qe=n(function(t,n){for(var r={},e=0;e<t.length;)t[e]in n&&(r[t[e]]=n[t[e]]),e+=1;return r}),tu=n(function(t,n){for(var r={},e=0,u=t.length;e<u;){var i=t[e];r[i]=n[i],e+=1}return r}),nu=n(function(t,n){var r={};for(var e in n)t(n[e],e,n)&&(r[e]=n[e]);return r}),ru=n(function(t,n){return c([t],n)}),eu=K(Ne,1),uu=n(function(r,e){return p(e.length,function(){for(var t=[],n=0;n<e.length;)t.push(e[n].call(this,arguments[n])),n+=1;return r.apply(this,t.concat(Array.prototype.slice.call(arguments,e.length)))})}),iu=uu(w,[tu,zt]);function ou(n,r,e){return function(t){return r(e(n(t)))}}function cu(t,n,r){this.xf=r,this.f=t,this.g=n}cu.prototype["@@transducer/init"]=v.init,cu.prototype["@@transducer/result"]=v.result,cu.prototype["@@transducer/step"]=function(t,n){return this.xf["@@transducer/step"](t,ou(this.f,this.g,n))};var au=u(d(["fantasy-land/promap","promap"],u(function(t,n,r){return new cu(t,n,r)}),ou)),su=u(function(t,n,r){return Jt(n,V(t,r))}),fu=u(function(t,n,r){return Vr(t,V(n,r))}),lu=u(function(t,n,r){return wn(t,V(n,r))}),pu=u(function(t,n,r){return t(V(n,r))}),hu=n(function(t,n){return t.map(function(t){return re([t],n)})}),yu=n(function(t,n){if(!Xr(t)||!Xr(n))throw new TypeError("Both arguments to range must be numbers");for(var r=[],e=t;e<n;)r.push(e),e+=1;return r}),du=u(function(t,n,r){for(var e=r.length-1;0<=e;){if((n=t(r[e],n))&&n["@@transducer/reduced"]){n=n["@@transducer/value"];break}e-=1}return n}),gu=l(4,[],function(r,e,t,n){return W(function(t,n){return r(t,n)?e(t,n):g(t)},t,n)}),vu=o(g),mu=n(function(t,n){var r,e=+n,u=0;if(e<0||isNaN(e))throw new RangeError("n must be a non-negative number");for(r=Array(e);u<e;)r[u]=t(u),u+=1;return r}),bu=n(function(t,n){return mu(H(t),n)}),xu=u(function(t,n,r){return r.replace(t,n)}),wu=u(function(t,n,r){for(var e=0,u=r.length,i=[n];e<u;)n=t(n,r[e]),i[e+1]=n,e+=1;return i}),ju=n(function(t,n){return"function"==typeof n.sequence?n.sequence(t):du(function(t,n){return Q(z(ru,t),n)},t([]),n)}),Au=u(function(t,n,r){return Ve(t,H(n),r)}),Ou=n(function(t,n){return Array.prototype.slice.call(n,0).sort(t)}),Su=n(function(u,t){return Array.prototype.slice.call(t,0).sort(function(t,n){var r=u(t),e=u(n);return r<e?-1:e<r?1:0})}),Eu=n(function(u,t){return Array.prototype.slice.call(t,0).sort(function(t,n){for(var r=0,e=0;0===r&&e<u.length;)r=u[e](t,n),e+=1;return r})}),_u=Lr(1,"split"),Iu=n(function(t,n){return[Ft(0,t,n),Ft(t,Yr(n),n)]}),ku=n(function(t,n){if(t<=0)throw Error("First argument to splitEvery must be a positive integer");for(var r=[],e=0;e<n.length;)r.push(Ft(e,e+=t,n));return r}),Wu=n(function(t,n){for(var r=0,e=n.length,u=[];r<e&&!t(n[r]);)u.push(n[r]),r+=1;return[u,Array.prototype.slice.call(n,r)]}),qu=l(2,[],function(t,n){for(var r=[],e=[],u=0;u<n.length;u+=1)t(n[u])||e.push(n[u]),(u<n.length-1&&t(n[u+1])||u===n.length-1)&&0<e.length&&(r.push(e),e=[]);return r}),Nu=n(function(t,n){return Jt(Fn(t.length,n),t)}),Uu=n(function(t,n){return+t-+n}),Fu=n(function(t,n){return fn(Sn(t,n),Sn(n,t))}),Pu=u(function(t,n,r){return fn(En(t,n,r),En(t,r,n))}),Bu=n(function(t,n){for(var r=n.length-1;0<=r&&t(n[r]);)r-=1;return Ft(r+1,1/0,n)});function Cu(t,n){this.xf=n,this.f=t}Cu.prototype["@@transducer/init"]=v.init,Cu.prototype["@@transducer/result"]=v.result,Cu.prototype["@@transducer/step"]=function(t,n){return this.f(n)?this.xf["@@transducer/step"](t,n):g(t)};var Tu=n(d(["takeWhile"],n(function(t,n){return new Cu(t,n)}),function(t,n){for(var r=0,e=n.length;r<e&&t(n[r]);)r+=1;return Ft(0,r,n)}));function Ru(t,n){this.xf=n,this.f=t}Ru.prototype["@@transducer/init"]=v.init,Ru.prototype["@@transducer/result"]=v.result,Ru.prototype["@@transducer/step"]=function(t,n){return this.f(n),this.xf["@@transducer/step"](t,n)};var Du=n(d([],n(function(t,n){return new Ru(t,n)}),function(t,n){return t(n),n}));var zu=n(function(t,n){if(!function(t){return"[object RegExp]"===Object.prototype.toString.call(t)}(t))throw new TypeError("‘test’ requires a value of type RegExp as its first argument; received "+sn(t));return Ot(t).test(n)}),Mu=n(function(t,n){return Me("andThen",n),n.then(t)}),Lu=Lr(0,"toLowerCase"),Vu=o(function(t){var n=[];for(var r in t)U(r,t)&&(n[n.length]=[r,t[r]]);return n}),Gu=o(function(t){var n=[];for(var r in t)n[n.length]=[r,t[r]];return n}),Ku=Lr(0,"toUpperCase"),$u=p(4,function(t,n,r,e){return W(t("function"==typeof n?S(n):n),r,e)}),Hu=o(function(t){for(var n=0,r=[];n<t.length;){for(var e=t[n],u=0;u<e.length;)void 0===r[u]&&(r[u]=[]),r[u].push(e[u]),u+=1;n+=1}return r}),Ju=u(function(t,n,r){return"function"==typeof r["fantasy-land/traverse"]?r["fantasy-land/traverse"](n,t):"function"==typeof r.traverse?r.traverse(n,t):ju(t,z(n,r))}),Xu="\t\n\v\f\r                　\u2028\u2029\ufeff",Yu=!("function"==typeof String.prototype.trim)||Xu.trim()?o(function(t){var n=RegExp("^["+Xu+"]["+Xu+"]*"),r=RegExp("["+Xu+"]["+Xu+"]*$");return t.replace(n,"").replace(r,"")}):o(function(t){return t.trim()}),Zu=n(function(t,n){return s(t.length,function(){try{return t.apply(this,arguments)}catch(t){return n.apply(this,c([t],arguments))}})}),Qu=o(function(t){return function(){return t(Array.prototype.slice.call(arguments,0))}}),ti=o(function(t){return ht(1,t)}),ni=n(function(u,i){return p(u,function(){for(var t,n=1,r=i,e=0;n<=u&&"function"==typeof r;)r=r.apply(this,Array.prototype.slice.call(arguments,e,t=n===u?arguments.length:e+r.length)),n+=1,e=t;return r})}),ri=n(function(t,n){for(var r=t(n),e=[];r&&r.length;)e[e.length]=r[0],r=t(r[1]);return e}),ei=n(Tt(Nr,c));function ui(t,n){this.xf=n,this.pred=t,this.items=[]}ui.prototype["@@transducer/init"]=v.init,ui.prototype["@@transducer/result"]=v.result,ui.prototype["@@transducer/step"]=function(t,n){return Gt(this.pred,n,this.items)?t:(this.items.push(n),this.xf["@@transducer/step"](t,n))};function ii(t){return{value:t,"fantasy-land/map":function(){return this}}}var oi=n(d([],n(function(t,n){return new ui(t,n)}),function(t,n){for(var r,e=0,u=n.length,i=[];e<u;)Gt(t,r=n[e],i)||(i[i.length]=r),e+=1;return i})),ci=u(function(t,n,r){return oi(t,c(n,r))}),ai=u(function(t,n,r){return t(r)?r:n(r)}),si=jt(Dt),fi=u(function(t,n,r){for(var e=r;!t(e);)e=n(e);return e}),li=n(function(n,r){return n in r&&h(r[n])?w(function(t){return st(n,t,r)},r[n]):[r]}),pi=o(function(t){var n,r=[];for(n in t)r[r.length]=t[n];return r}),hi=n(function(t,n){return t(ii)(n).value}),yi=u(function(t,n,r){return t(r)?n(r):r}),di=n(function(t,n){for(var r in t)if(U(r,t)&&!t[r](n[r]))return!1;return!0}),gi=n(function(t,n){for(var r in t)if(U(r,t)&&t[r](n[r]))return!0;return!1}),vi=n(function(t,n){return di(z(Jt,t),n)}),mi=n(function(t,n){return cn(sr(Yt)(t),n)}),bi=n(function(t,n){return!!(!t^!n)}),xi=n(function(t,n){for(var r,e=0,u=t.length,i=n.length,o=[];e<u;){for(r=0;r<i;)o[o.length]=[t[e],n[r]],r+=1;e+=1}return o}),wi=n(function(t,n){for(var r=[],e=0,u=Math.min(t.length,n.length);e<u;)r[e]=[t[e],n[e]],e+=1;return r}),ji=n(function(t,n){for(var r=0,e=Math.min(t.length,n.length),u={};r<e;)u[t[r]]=n[r],r+=1;return u}),Ai=u(function(t,n,r){for(var e=[],u=0,i=Math.min(n.length,r.length);u<i;)e[u]=t(n[u],r[u]),u+=1;return e}),Oi=o(function(n){return p(n.length,function(){var t=arguments;return function(){return n.apply(this,t)}})});t.F=function(){return!1},t.T=function(){return!0},t.__={"@@functional/placeholder":!0},t.add=r,t.addIndex=e,t.adjust=i,t.all=b,t.allPass=$,t.always=H,t.and=J,t.andThen=Mu,t.any=Y,t.anyPass=Z,t.ap=Q,t.aperture=nt,t.append=rt,t.apply=et,t.applySpec=ot,t.applyTo=ct,t.ascend=at,t.assoc=pt,t.assocPath=lt,t.binary=yt,t.bind=E,t.both=mt,t.call=bt,t.chain=jt,t.clamp=At,t.clone=_t,t.collectBy=It,t.comparator=kt,t.complement=qt,t.compose=Tt,t.composeWith=Lt,t.concat=fn,t.cond=ln,t.construct=yn,t.constructN=hn,t.converge=dn,t.count=gn,t.countBy=bn,t.curry=pn,t.curryN=p,t.dec=xn,t.defaultTo=wn,t.descend=jn,t.difference=Sn,t.differenceWith=En,t.dissoc=kn,t.dissocPath=In,t.divide=Wn,t.drop=Nn,t.dropLast=Bn,t.dropLastWhile=Tn,t.dropRepeats=Ln,t.dropRepeatsWith=Mn,t.dropWhile=Gn,t.either=$n,t.empty=Hn,t.endsWith=Xn,t.eqBy=Yn,t.eqProps=Zn,t.equals=Jt,t.evolve=Qn,t.filter=on,t.find=nr,t.findIndex=er,t.findLast=ir,t.findLastIndex=cr,t.flatten=ar,t.flip=sr,t.forEach=fr,t.forEachObjIndexed=lr,t.fromPairs=pr,t.groupBy=hr,t.groupWith=yr,t.gt=dr,t.gte=gr,t.has=mr,t.hasIn=br,t.hasPath=vr,t.head=Rt,t.identical=xr,t.identity=zt,t.ifElse=wr,t.inc=jr,t.includes=Ar,t.indexBy=Or,t.indexOf=Sr,t.init=Er,t.innerJoin=_r,t.insert=Ir,t.insertAll=kr,t.intersection=Ur,t.intersperse=Fr,t.into=Dr,t.invert=zr,t.invertObj=Mr,t.invoker=Lr,t.is=Vr,t.isEmpty=Gr,t.isNil=ft,t.join=Kr,t.juxt=$r,t.keys=D,t.keysIn=Hr,t.last=zn,t.lastIndexOf=Jr,t.length=Yr,t.lens=Zr,t.lensIndex=te,t.lensPath=ee,t.lensProp=ue,t.lift=vt,t.liftN=gt,t.lt=ie,t.lte=oe,t.map=z,t.mapAccum=ce,t.mapAccumRight=ae,t.mapObjIndexed=se,t.match=fe,t.mathMod=le,t.max=x,t.maxBy=pe,t.mean=ye,t.median=de,t.memoizeWith=ge,t.mergeAll=ve,t.mergeDeepLeft=xe,t.mergeDeepRight=we,t.mergeDeepWith=je,t.mergeDeepWithKey=be,t.mergeLeft=Ae,t.mergeRight=Oe,t.mergeWith=Se,t.mergeWithKey=me,t.min=Ee,t.minBy=_e,t.modify=ke,t.modifyPath=Ie,t.modulo=We,t.move=qe,t.multiply=Ne,t.nAry=ht,t.negate=Fe,t.none=Pe,t.not=Wt,t.nth=L,t.nthArg=Be,t.o=Ce,t.objOf=Br,t.of=Te,t.omit=Re,t.on=De,t.once=ze,t.or=Kn,t.otherwise=Le,t.over=Ve,t.pair=Ge,t.partial=$e,t.partialObject=Ue,t.partialRight=He,t.partition=Je,t.path=re,t.pathEq=Xe,t.pathOr=Ye,t.pathSatisfies=Ze,t.paths=ne,t.pick=Qe,t.pickAll=tu,t.pickBy=nu,t.pipe=Bt,t.pipeWith=Mt,t.pluck=G,t.prepend=ru,t.product=eu,t.project=iu,t.promap=au,t.prop=V,t.propEq=su,t.propIs=fu,t.propOr=lu,t.propSatisfies=pu,t.props=hu,t.range=yu,t.reduce=K,t.reduceBy=mn,t.reduceRight=du,t.reduceWhile=gu,t.reduced=vu,t.reject=cn,t.remove=_n,t.repeat=bu,t.replace=xu,t.reverse=Ct,t.scan=wu,t.sequence=ju,t.set=Au,t.slice=Ft,t.sort=Ou,t.sortBy=Su,t.sortWith=Eu,t.split=_u,t.splitAt=Iu,t.splitEvery=ku,t.splitWhen=Wu,t.splitWhenever=qu,t.startsWith=Nu,t.subtract=Uu,t.sum=he,t.symmetricDifference=Fu,t.symmetricDifferenceWith=Pu,t.tail=Pt,t.take=Fn,t.takeLast=Jn,t.takeLastWhile=Bu,t.takeWhile=Tu,t.tap=Du,t.test=zu,t.thunkify=Oi,t.times=mu,t.toLower=Lu,t.toPairs=Vu,t.toPairsIn=Gu,t.toString=sn,t.toUpper=Ku,t.transduce=$u,t.transpose=Hu,t.traverse=Ju,t.trim=Yu,t.tryCatch=Zu,t.type=St,t.unapply=Qu,t.unary=ti,t.uncurryN=ni,t.unfold=ri,t.union=ei,t.unionWith=ci,t.uniq=Nr,t.uniqBy=qr,t.uniqWith=oi,t.unless=ai,t.unnest=si,t.until=fi,t.unwind=li,t.update=Qr,t.useWith=uu,t.values=ut,t.valuesIn=pi,t.view=hi,t.when=yi,t.where=di,t.whereAny=gi,t.whereEq=vi,t.without=mi,t.xor=bi,t.xprod=xi,t.zip=wi,t.zipObj=ji,t.zipWith=Ai,Object.defineProperty(t,"__esModule",{value:!0})});
1.2.1 / 2019-05-10
==================

  * Improve error when `str` is not a string

1.2.0 / 2016-06-01
==================

  * Add `combine` option to combine overlapping ranges

1.1.0 / 2016-05-13
==================

  * Fix incorrectly returning -1 when there is at least one valid range
  * perf: remove internal function

1.0.3 / 2015-10-29
==================

  * perf: enable strict mode

1.0.2 / 2014-09-08
==================

  * Support Node.js 0.6

1.0.1 / 2014-09-07
==================

  * Move repository to jshttp

1.0.0 / 2013-12-11
==================

  * Add repository to package.json
  * Add MIT license

0.0.4 / 2012-06-17
==================

  * Change ret -1 for unsatisfiable and -2 when invalid

0.0.3 / 2012-06-17
==================

  * Fix last-byte-pos default to len - 1

0.0.2 / 2012-06-14
==================

  * Add `.type`

0.0.1 / 2012-06-11
==================

  * Initial release
(The MIT License)

Copyright (c) 2012-2014 TJ Holowaychuk <tj@vision-media.ca>
Copyright (c) 2015-2016 Douglas Christopher Wilson <doug@somethingdoug.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.
/*!
 * range-parser
 * Copyright(c) 2012-2014 TJ Holowaychuk
 * Copyright(c) 2015-2016 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module exports.
 * @public
 */

module.exports = rangeParser

/**
 * Parse "Range" header `str` relative to the given file `size`.
 *
 * @param {Number} size
 * @param {String} str
 * @param {Object} [options]
 * @return {Array}
 * @public
 */

function rangeParser (size, str, options) {
  if (typeof str !== 'string') {
    throw new TypeError('argument str must be a string')
  }

  var index = str.indexOf('=')

  if (index === -1) {
    return -2
  }

  // split the range string
  var arr = str.slice(index + 1).split(',')
  var ranges = []

  // add ranges type
  ranges.type = str.slice(0, index)

  // parse all ranges
  for (var i = 0; i < arr.length; i++) {
    var range = arr[i].split('-')
    var start = parseInt(range[0], 10)
    var end = parseInt(range[1], 10)

    // -nnn
    if (isNaN(start)) {
      start = size - end
      end = size - 1
    // nnn-
    } else if (isNaN(end)) {
      end = size - 1
    }

    // limit last-byte-pos to current length
    if (end > size - 1) {
      end = size - 1
    }

    // invalid or unsatisifiable
    if (isNaN(start) || isNaN(end) || start > end || start < 0) {
      continue
    }

    // add range
    ranges.push({
      start: start,
      end: end
    })
  }

  if (ranges.length < 1) {
    // unsatisifiable
    return -1
  }

  return options && options.combine
    ? combineRanges(ranges)
    : ranges
}

/**
 * Combine overlapping & adjacent ranges.
 * @private
 */

function combineRanges (ranges) {
  var ordered = ranges.map(mapWithIndex).sort(sortByRangeStart)

  for (var j = 0, i = 1; i < ordered.length; i++) {
    var range = ordered[i]
    var current = ordered[j]

    if (range.start > current.end + 1) {
      // next range
      ordered[++j] = range
    } else if (range.end > current.end) {
      // extend range
      current.end = range.end
      current.index = Math.min(current.index, range.index)
    }
  }

  // trim ordered array
  ordered.length = j + 1

  // generate combined range
  var combined = ordered.sort(sortByRangeIndex).map(mapWithoutIndex)

  // copy ranges type
  combined.type = ranges.type

  return combined
}

/**
 * Map function to add index value to ranges.
 * @private
 */

function mapWithIndex (range, index) {
  return {
    start: range.start,
    end: range.end,
    index: index
  }
}

/**
 * Map function to remove index value from ranges.
 * @private
 */

function mapWithoutIndex (range) {
  return {
    start: range.start,
    end: range.end
  }
}

/**
 * Sort function to sort ranges by index.
 * @private
 */

function sortByRangeIndex (a, b) {
  return a.index - b.index
}

/**
 * Sort function to sort ranges by start position.
 * @private
 */

function sortByRangeStart (a, b) {
  return a.start - b.start
}
{
  "name": "range-parser",
  "author": "TJ Holowaychuk <tj@vision-media.ca> (http://tjholowaychuk.com)",
  "description": "Range header field string parser",
  "version": "1.2.1",
  "license": "MIT",
  "repository": "jshttp/range-parser",
  "devDependencies": {
    "deep-equal": "1.0.1",
    "eslint": "5.16.0",
    "eslint-config-standard": "12.0.0",
    "eslint-plugin-markdown": "1.0.0",
    "eslint-plugin-import": "2.17.2",
    "eslint-plugin-node": "8.0.1",
    "eslint-plugin-promise": "4.1.1",
    "eslint-plugin-standard": "4.0.0",
    "mocha": "6.1.4",
    "nyc": "14.1.1"
  },
  "files": [
    "HISTORY.md",
    "LICENSE",
    "index.js"
  ],
  "engines": {
    "node": ">= 0.6"
  }
}2.5.1 / 2022-02-28
==================

  * Fix error on early async hooks implementations

2.5.0 / 2022-02-21
==================

  * Prevent loss of async hooks context
  * Prevent hanging when stream is not readable
  * deps: http-errors@2.0.0
    - deps: depd@2.0.0
    - deps: statuses@2.0.1

2.4.3 / 2022-02-14
==================

  * deps: bytes@3.1.2

2.4.2 / 2021-11-16
==================

  * deps: bytes@3.1.1
  * deps: http-errors@1.8.1
    - deps: setprototypeof@1.2.0
    - deps: toidentifier@1.0.1

2.4.1 / 2019-06-25
==================

  * deps: http-errors@1.7.3
    - deps: inherits@2.0.4

2.4.0 / 2019-04-17
==================

  * deps: bytes@3.1.0
    - Add petabyte (`pb`) support
  * deps: http-errors@1.7.2
    - Set constructor name when possible
    - deps: setprototypeof@1.1.1
    - deps: statuses@'>= 1.5.0 < 2'
  * deps: iconv-lite@0.4.24
    - Added encoding MIK

2.3.3 / 2018-05-08
==================

  * deps: http-errors@1.6.3
    - deps: depd@~1.1.2
    - deps: setprototypeof@1.1.0
    - deps: statuses@'>= 1.3.1 < 2'
  * deps: iconv-lite@0.4.23
    - Fix loading encoding with year appended
    - Fix deprecation warnings on Node.js 10+

2.3.2 / 2017-09-09
==================

  * deps: iconv-lite@0.4.19
    - Fix ISO-8859-1 regression
    - Update Windows-1255

2.3.1 / 2017-09-07
==================

  * deps: bytes@3.0.0
  * deps: http-errors@1.6.2
    - deps: depd@1.1.1
  * perf: skip buffer decoding on overage chunk

2.3.0 / 2017-08-04
==================

  * Add TypeScript definitions
  * Use `http-errors` for standard emitted errors
  * deps: bytes@2.5.0
  * deps: iconv-lite@0.4.18
    - Add support for React Native
    - Add a warning if not loaded as utf-8
    - Fix CESU-8 decoding in Node.js 8
    - Improve speed of ISO-8859-1 encoding

2.2.0 / 2017-01-02
==================

  * deps: iconv-lite@0.4.15
    - Added encoding MS-31J
    - Added encoding MS-932
    - Added encoding MS-936
    - Added encoding MS-949
    - Added encoding MS-950
    - Fix GBK/GB18030 handling of Euro character

2.1.7 / 2016-06-19
==================

  * deps: bytes@2.4.0
  * perf: remove double-cleanup on happy path

2.1.6 / 2016-03-07
==================

  * deps: bytes@2.3.0
    - Drop partial bytes on all parsed units
    - Fix parsing byte string that looks like hex

2.1.5 / 2015-11-30
==================

  * deps: bytes@2.2.0
  * deps: iconv-lite@0.4.13

2.1.4 / 2015-09-27
==================

  * Fix masking critical errors from `iconv-lite`
  * deps: iconv-lite@0.4.12
    - Fix CESU-8 decoding in Node.js 4.x

2.1.3 / 2015-09-12
==================

  * Fix sync callback when attaching data listener causes sync read
    - Node.js 0.10 compatibility issue

2.1.2 / 2015-07-05
==================

  * Fix error stack traces to skip `makeError`
  * deps: iconv-lite@0.4.11
    - Add encoding CESU-8

2.1.1 / 2015-06-14
==================

  * Use `unpipe` module for unpiping requests

2.1.0 / 2015-05-28
==================

  * deps: iconv-lite@0.4.10
    - Improved UTF-16 endianness detection
    - Leading BOM is now removed when decoding
    - The encoding UTF-16 without BOM now defaults to UTF-16LE when detection fails

2.0.2 / 2015-05-21
==================

  * deps: bytes@2.1.0
    - Slight optimizations

2.0.1 / 2015-05-10
==================

  * Fix a false-positive when unpiping in Node.js 0.8

2.0.0 / 2015-05-08
==================

  * Return a promise without callback instead of thunk
  * deps: bytes@2.0.1
    - units no longer case sensitive when parsing

1.3.4 / 2015-04-15
==================

  * Fix hanging callback if request aborts during read
  * deps: iconv-lite@0.4.8
    - Add encoding alias UNICODE-1-1-UTF-7

1.3.3 / 2015-02-08
==================

  * deps: iconv-lite@0.4.7
    - Gracefully support enumerables on `Object.prototype`

1.3.2 / 2015-01-20
==================

  * deps: iconv-lite@0.4.6
    - Fix rare aliases of single-byte encodings

1.3.1 / 2014-11-21
==================

  * deps: iconv-lite@0.4.5
    - Fix Windows-31J and X-SJIS encoding support

1.3.0 / 2014-07-20
==================

  * Fully unpipe the stream on error
    - Fixes `Cannot switch to old mode now` error on Node.js 0.10+

1.2.3 / 2014-07-20
==================

  * deps: iconv-lite@0.4.4
    - Added encoding UTF-7

1.2.2 / 2014-06-19
==================

  * Send invalid encoding error to callback

1.2.1 / 2014-06-15
==================

  * deps: iconv-lite@0.4.3
    - Added encodings UTF-16BE and UTF-16 with BOM

1.2.0 / 2014-06-13
==================

  * Passing string as `options` interpreted as encoding
  * Support all encodings from `iconv-lite`

1.1.7 / 2014-06-12
==================

  * use `string_decoder` module from npm

1.1.6 / 2014-05-27
==================

  * check encoding for old streams1
  * support node.js < 0.10.6

1.1.5 / 2014-05-14
==================

  * bump bytes

1.1.4 / 2014-04-19
==================

  * allow true as an option
  * bump bytes

1.1.3 / 2014-03-02
==================

  * fix case when length=null

1.1.2 / 2013-12-01
==================

  * be less strict on state.encoding check

1.1.1 / 2013-11-27
==================

  * add engines

1.1.0 / 2013-11-27
==================

  * add err.statusCode and err.type
  * allow for encoding option to be true
  * pause the stream instead of dumping on error
  * throw if the stream's encoding is set

1.0.1 / 2013-11-19
==================

  * dont support streams1, throw if dev set encoding

1.0.0 / 2013-11-17
==================

  * rename `expected` option to `length`

0.2.0 / 2013-11-15
==================

  * republish

0.1.1 / 2013-11-15
==================

  * use bytes

0.1.0 / 2013-11-11
==================

  * generator support

0.0.3 / 2013-10-10
==================

  * update repo

0.0.2 / 2013-09-14
==================

  * dump stream on bad headers
  * listen to events after defining received and buffers

0.0.1 / 2013-09-14
==================

  * Initial release
The MIT License (MIT)

Copyright (c) 2013-2014 Jonathan Ong <me@jongleberry.com>
Copyright (c) 2014-2022 Douglas Christopher Wilson <doug@somethingdoug.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.
# Security Policies and Procedures

## Reporting a Bug

The `raw-body` team and community take all security bugs seriously. Thank you
for improving the security of Express. We appreciate your efforts and
responsible disclosure and will make every effort to acknowledge your
contributions.

Report security bugs by emailing the current owners of `raw-body`. This information
can be found in the npm registry using the command `npm owner ls raw-body`.
If unsure or unable to get the information from the above, open an issue
in the [project issue tracker](https://github.com/stream-utils/raw-body/issues)
asking for the current contact information.

To ensure the timely response to your report, please ensure that the entirety
of the report is contained within the email body and not solely behind a web
link or an attachment.

At least one owner will acknowledge your email within 48 hours, and will send a
more detailed response within 48 hours indicating the next steps in handling
your report. After the initial reply to your report, the owners will
endeavor to keep you informed of the progress towards a fix and full
announcement, and may ask for additional information or guidance.
/*!
 * raw-body
 * Copyright(c) 2013-2014 Jonathan Ong
 * Copyright(c) 2014-2022 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module dependencies.
 * @private
 */

var asyncHooks = tryRequireAsyncHooks()
var bytes = require('bytes')
var createError = require('http-errors')
var iconv = require('iconv-lite')
var unpipe = require('unpipe')

/**
 * Module exports.
 * @public
 */

module.exports = getRawBody

/**
 * Module variables.
 * @private
 */

var ICONV_ENCODING_MESSAGE_REGEXP = /^Encoding not recognized: /

/**
 * Get the decoder for a given encoding.
 *
 * @param {string} encoding
 * @private
 */

function getDecoder (encoding) {
  if (!encoding) return null

  try {
    return iconv.getDecoder(encoding)
  } catch (e) {
    // error getting decoder
    if (!ICONV_ENCODING_MESSAGE_REGEXP.test(e.message)) throw e

    // the encoding was not found
    throw createError(415, 'specified encoding unsupported', {
      encoding: encoding,
      type: 'encoding.unsupported'
    })
  }
}

/**
 * Get the raw body of a stream (typically HTTP).
 *
 * @param {object} stream
 * @param {object|string|function} [options]
 * @param {function} [callback]
 * @public
 */

function getRawBody (stream, options, callback) {
  var done = callback
  var opts = options || {}

  if (options === true || typeof options === 'string') {
    // short cut for encoding
    opts = {
      encoding: options
    }
  }

  if (typeof options === 'function') {
    done = options
    opts = {}
  }

  // validate callback is a function, if provided
  if (done !== undefined && typeof done !== 'function') {
    throw new TypeError('argument callback must be a function')
  }

  // require the callback without promises
  if (!done && !global.Promise) {
    throw new TypeError('argument callback is required')
  }

  // get encoding
  var encoding = opts.encoding !== true
    ? opts.encoding
    : 'utf-8'

  // convert the limit to an integer
  var limit = bytes.parse(opts.limit)

  // convert the expected length to an integer
  var length = opts.length != null && !isNaN(opts.length)
    ? parseInt(opts.length, 10)
    : null

  if (done) {
    // classic callback style
    return readStream(stream, encoding, length, limit, wrap(done))
  }

  return new Promise(function executor (resolve, reject) {
    readStream(stream, encoding, length, limit, function onRead (err, buf) {
      if (err) return reject(err)
      resolve(buf)
    })
  })
}

/**
 * Halt a stream.
 *
 * @param {Object} stream
 * @private
 */

function halt (stream) {
  // unpipe everything from the stream
  unpipe(stream)

  // pause stream
  if (typeof stream.pause === 'function') {
    stream.pause()
  }
}

/**
 * Read the data from the stream.
 *
 * @param {object} stream
 * @param {string} encoding
 * @param {number} length
 * @param {number} limit
 * @param {function} callback
 * @public
 */

function readStream (stream, encoding, length, limit, callback) {
  var complete = false
  var sync = true

  // check the length and limit options.
  // note: we intentionally leave the stream paused,
  // so users should handle the stream themselves.
  if (limit !== null && length !== null && length > limit) {
    return done(createError(413, 'request entity too large', {
      expected: length,
      length: length,
      limit: limit,
      type: 'entity.too.large'
    }))
  }

  // streams1: assert request encoding is buffer.
  // streams2+: assert the stream encoding is buffer.
  //   stream._decoder: streams1
  //   state.encoding: streams2
  //   state.decoder: streams2, specifically < 0.10.6
  var state = stream._readableState
  if (stream._decoder || (state && (state.encoding || state.decoder))) {
    // developer error
    return done(createError(500, 'stream encoding should not be set', {
      type: 'stream.encoding.set'
    }))
  }

  if (typeof stream.readable !== 'undefined' && !stream.readable) {
    return done(createError(500, 'stream is not readable', {
      type: 'stream.not.readable'
    }))
  }

  var received = 0
  var decoder

  try {
    decoder = getDecoder(encoding)
  } catch (err) {
    return done(err)
  }

  var buffer = decoder
    ? ''
    : []

  // attach listeners
  stream.on('aborted', onAborted)
  stream.on('close', cleanup)
  stream.on('data', onData)
  stream.on('end', onEnd)
  stream.on('error', onEnd)

  // mark sync section complete
  sync = false

  function done () {
    var args = new Array(arguments.length)

    // copy arguments
    for (var i = 0; i < args.length; i++) {
      args[i] = arguments[i]
    }

    // mark complete
    complete = true

    if (sync) {
      process.nextTick(invokeCallback)
    } else {
      invokeCallback()
    }

    function invokeCallback () {
      cleanup()

      if (args[0]) {
        // halt the stream on error
        halt(stream)
      }

      callback.apply(null, args)
    }
  }

  function onAborted () {
    if (complete) return

    done(createError(400, 'request aborted', {
      code: 'ECONNABORTED',
      expected: length,
      length: length,
      received: received,
      type: 'request.aborted'
    }))
  }

  function onData (chunk) {
    if (complete) return

    received += chunk.length

    if (limit !== null && received > limit) {
      done(createError(413, 'request entity too large', {
        limit: limit,
        received: received,
        type: 'entity.too.large'
      }))
    } else if (decoder) {
      buffer += decoder.write(chunk)
    } else {
      buffer.push(chunk)
    }
  }

  function onEnd (err) {
    if (complete) return
    if (err) return done(err)

    if (length !== null && received !== length) {
      done(createError(400, 'request size did not match content length', {
        expected: length,
        length: length,
        received: received,
        type: 'request.size.invalid'
      }))
    } else {
      var string = decoder
        ? buffer + (decoder.end() || '')
        : Buffer.concat(buffer)
      done(null, string)
    }
  }

  function cleanup () {
    buffer = null

    stream.removeListener('aborted', onAborted)
    stream.removeListener('data', onData)
    stream.removeListener('end', onEnd)
    stream.removeListener('error', onEnd)
    stream.removeListener('close', cleanup)
  }
}

/**
 * Try to require async_hooks
 * @private
 */

function tryRequireAsyncHooks () {
  try {
    return require('async_hooks')
  } catch (e) {
    return {}
  }
}

/**
 * Wrap function with async resource, if possible.
 * AsyncResource.bind static method backported.
 * @private
 */

function wrap (fn) {
  var res

  // create anonymous resource
  if (asyncHooks.AsyncResource) {
    res = new asyncHooks.AsyncResource(fn.name || 'bound-anonymous-fn')
  }

  // incompatible node.js
  if (!res || !res.runInAsyncScope) {
    return fn
  }

  // return bound function
  return res.runInAsyncScope.bind(res, fn, null)
}
{
  "name": "raw-body",
  "description": "Get and validate the raw body of a readable stream.",
  "version": "2.5.1",
  "author": "Jonathan Ong <me@jongleberry.com> (http://jongleberry.com)",
  "license": "MIT",
  "repository": "stream-utils/raw-body",
  "dependencies": {
    "bytes": "3.1.2",
    "http-errors": "2.0.0",
    "iconv-lite": "0.4.24",
    "unpipe": "1.0.0"
  },
  "devDependencies": {
    "bluebird": "3.7.2",
    "eslint": "7.32.0",
    "eslint-config-standard": "14.1.1",
    "eslint-plugin-import": "2.25.4",
    "eslint-plugin-markdown": "2.2.1",
    "eslint-plugin-node": "11.1.0",
    "eslint-plugin-promise": "5.2.0",
    "eslint-plugin-standard": "4.1.0",
    "mocha": "9.2.1",
    "nyc": "15.1.0",
    "readable-stream": "2.3.7",
    "safe-buffer": "5.2.1"
  },
  "engines": {
    "node": ">= 0.8"
  },
  "files": [
    "HISTORY.md",
    "LICENSE",
    "README.md",
    "SECURITY.md",
    "index.d.ts",
    "index.js"
  ]
}Apache License, Version 2.0

Copyright (c) 2011 Dominic Tarr

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Copyright (c) 2013, Dominic Tarr
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 OWNER 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.

The views and conclusions contained in the software and documentation are those
of the authors and should not be interpreted as representing official policies, 
either expressed or implied, of the FreeBSD Project.
The MIT License

Copyright (c) 2011 Dominic Tarr

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.

// when this is loaded into the browser, 
// just use the defaults...

module.exports = function (name, defaults) {
  return defaults
}
#! /usr/bin/env node
var rc = require('./index')

console.log(JSON.stringify(rc(process.argv[2]), false, 2))
var cc   = require('./lib/utils')
var join = require('path').join
var deepExtend = require('deep-extend')
var etc = '/etc'
var win = process.platform === "win32"
var home = win
           ? process.env.USERPROFILE
           : process.env.HOME

module.exports = function (name, defaults, argv, parse) {
  if('string' !== typeof name)
    throw new Error('rc(name): name *must* be string')
  if(!argv)
    argv = require('minimist')(process.argv.slice(2))
  defaults = (
      'string' === typeof defaults
    ? cc.json(defaults) : defaults
    ) || {}

  parse = parse || cc.parse

  var env = cc.env(name + '_')

  var configs = [defaults]
  var configFiles = []
  function addConfigFile (file) {
    if (configFiles.indexOf(file) >= 0) return
    var fileConfig = cc.file(file)
    if (fileConfig) {
      configs.push(parse(fileConfig))
      configFiles.push(file)
    }
  }

  // which files do we look at?
  if (!win)
   [join(etc, name, 'config'),
    join(etc, name + 'rc')].forEach(addConfigFile)
  if (home)
   [join(home, '.config', name, 'config'),
    join(home, '.config', name),
    join(home, '.' + name, 'config'),
    join(home, '.' + name + 'rc')].forEach(addConfigFile)
  addConfigFile(cc.find('.'+name+'rc'))
  if (env.config) addConfigFile(env.config)
  if (argv.config) addConfigFile(argv.config)

  return deepExtend.apply(null, configs.concat([
    env,
    argv,
    configFiles.length ? {configs: configFiles, config: configFiles[configFiles.length - 1]} : undefined,
  ]))
}
{
  "name": "rc",
  "version": "1.2.8",
  "description": "hardwired configuration loader",
  "main": "index.js",
  "browser": "browser.js",
  "repository": {
    "type": "git",
    "url": "https://github.com/dominictarr/rc.git"
  },
  "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
  "bin": "./cli.js",
  "author": "Dominic Tarr <dominic.tarr@gmail.com> (dominictarr.com)",
  "dependencies": {
    "deep-extend": "^0.6.0",
    "ini": "~1.3.0",
    "minimist": "^1.2.0",
    "strip-json-comments": "~2.0.1"
  }
}'use strict';
var fs   = require('fs')
var ini  = require('ini')
var path = require('path')
var stripJsonComments = require('strip-json-comments')

var parse = exports.parse = function (content) {

  //if it ends in .json or starts with { then it must be json.
  //must be done this way, because ini accepts everything.
  //can't just try and parse it and let it throw if it's not ini.
  //everything is ini. even json with a syntax error.

  if(/^\s*{/.test(content))
    return JSON.parse(stripJsonComments(content))
  return ini.parse(content)

}

var file = exports.file = function () {
  var args = [].slice.call(arguments).filter(function (arg) { return arg != null })

  //path.join breaks if it's a not a string, so just skip this.
  for(var i in args)
    if('string' !== typeof args[i])
      return

  var file = path.join.apply(null, args)
  var content
  try {
    return fs.readFileSync(file,'utf-8')
  } catch (err) {
    return
  }
}

var json = exports.json = function () {
  var content = file.apply(null, arguments)
  return content ? parse(content) : null
}

var env = exports.env = function (prefix, env) {
  env = env || process.env
  var obj = {}
  var l = prefix.length
  for(var k in env) {
    if(k.toLowerCase().indexOf(prefix.toLowerCase()) === 0) {

      var keypath = k.substring(l).split('__')

      // Trim empty strings from keypath array
      var _emptyStringIndex
      while ((_emptyStringIndex=keypath.indexOf('')) > -1) {
        keypath.splice(_emptyStringIndex, 1)
      }

      var cursor = obj
      keypath.forEach(function _buildSubObj(_subkey,i){

        // (check for _subkey first so we ignore empty strings)
        // (check for cursor to avoid assignment to primitive objects)
        if (!_subkey || typeof cursor !== 'object')
          return

        // If this is the last key, just stuff the value in there
        // Assigns actual value from env variable to final key
        // (unless it's just an empty string- in that case use the last valid key)
        if (i === keypath.length-1)
          cursor[_subkey] = env[k]


        // Build sub-object if nothing already exists at the keypath
        if (cursor[_subkey] === undefined)
          cursor[_subkey] = {}

        // Increment cursor used to track the object at the current depth
        cursor = cursor[_subkey]

      })

    }

  }

  return obj
}

var find = exports.find = function () {
  var rel = path.join.apply(null, [].slice.call(arguments))

  function find(start, rel) {
    var file = path.join(start, rel)
    try {
      fs.statSync(file)
      return file
    } catch (err) {
      if(path.dirname(start) !== start) // root
        return find(path.dirname(start), rel)
    }
  }
  return find(process.cwd(), rel)
}


MIT License

Copyright (c) 2019-present Beier(Bill) Luo

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": "react-hook-form",
  "description": "Performant, flexible and extensible forms library for React Hooks",
  "version": "7.38.0",
  "main": "dist/index.cjs.js",
  "module": "dist/index.esm.mjs",
  "umd:main": "dist/index.umd.js",
  "unpkg": "dist/index.umd.js",
  "jsdelivr": "dist/index.umd.js",
  "jsnext:main": "dist/index.esm.mjs",
  "source": "src/index.ts",
  "types": "dist/index.d.ts",
  "sideEffects": false,
  "files": [
    "dist",
    "dist/__tests__"
  ],
  "exports": {
    "./package.json": "./package.json",
    ".": {
      "types": "./dist/index.d.ts",
      "import": "./dist/index.esm.mjs",
      "require": "./dist/index.cjs.js"
    }
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/react-hook-form/react-hook-form"
  },
  "homepage": "https://www.react-hook-form.com",
  "author": "<bluebill1049@hotmail.com>",
  "license": "MIT",
  "devDependencies": {
    "@microsoft/api-extractor": "^7.32.0",
    "@rollup/plugin-commonjs": "^22.0.2",
    "@rollup/plugin-node-resolve": "^14.1.0",
    "@swc/core": "^1.3.5",
    "@swc/jest": "^0.2.23",
    "@testing-library/jest-dom": "^5.16.5",
    "@testing-library/react": "^13.4.0",
    "@testing-library/react-hooks": "^8.0.1",
    "@types/jest": "^29.1.1",
    "@types/react": "^18.0.21",
    "@typescript-eslint/eslint-plugin": "^5.39.0",
    "@typescript-eslint/parser": "^5.39.0",
    "bundlewatch": "^0.3.3",
    "cypress": "10.9.0",
    "eslint": "^8.24.0",
    "eslint-config-prettier": "^8.5.0",
    "eslint-plugin-cypress": "^2.12.1",
    "eslint-plugin-prettier": "^4.2.1",
    "eslint-plugin-react": "^7.31.8",
    "eslint-plugin-react-hooks": "^4.6.0",
    "eslint-plugin-simple-import-sort": "^8.0.0",
    "husky": "^8.0.1",
    "jest": "^29.1.2",
    "jest-environment-jsdom": "^29.1.2",
    "jest-preview": "^0.3.1",
    "jest-watch-typeahead": "^2.2.0",
    "lint-staged": "^13.0.3",
    "prettier": "^2.7.1",
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "react-test-renderer": "^18.2.0",
    "rimraf": "^3.0.2",
    "rollup": "^2.79.1",
    "rollup-plugin-peer-deps-external": "^2.2.4",
    "rollup-plugin-sourcemaps": "^0.6.2",
    "rollup-plugin-terser": "^7.0.2",
    "rollup-plugin-typescript2": "^0.34.1",
    "tsd": "^0.24.1",
    "typescript": "^4.8.4"
  },
  "bundlewatch": {
    "files": [
      {
        "path": "./dist/index.cjs.js",
        "maxSize": "9.0 kB"
      }
    ]
  },
  "peerDependencies": {
    "react": "^16.8.0 || ^17 || ^18"
  },
  "lint-staged": {
    "*.{js,ts,tsx}": [
      "yarn lint:fix",
      "yarn prettier:fix"
    ],
    "*.{md,json,yml}": [
      "prettier --write"
    ]
  },
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  },
  "funding": {
    "type": "opencollective",
    "url": "https://opencollective.com/react-hook-form"
  },
  "engines": {
    "node": ">=12.22.0"
  },
  "packageManager": "yarn@1.22.15"
}"use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}Object.defineProperty(exports,"__esModule",{value:!0});var t=e(require("react")),r=e=>"checkbox"===e.type,s=e=>e instanceof Date,a=e=>null==e;const n=e=>"object"==typeof e;var i=e=>!a(e)&&!Array.isArray(e)&&n(e)&&!s(e),o=e=>i(e)&&e.target?r(e.target)?e.target.checked:e.target.value:e,u=(e,t)=>e.has((e=>e.substring(0,e.search(/\.\d+(\.|$)/))||e)(t)),l=e=>Array.isArray(e)?e.filter(Boolean):[],c=e=>void 0===e,d=(e,t,r)=>{if(!t||!i(e))return r;const s=l(t.split(/[,[\].]+?/)).reduce((e,t)=>a(e)?e:e[t],e);return c(s)||s===e?c(e[t])?r:e[t]:s};const f="blur",m="focusout",y="change",g="onBlur",h="onChange",p="onSubmit",_="onTouched",v="all",b="max",x="min",A="maxLength",F="minLength",V="pattern",w="required",S="validate",k=t.default.createContext(null),D=()=>t.default.useContext(k);var C=(e,t,r,s=!0)=>{const a={defaultValues:t._defaultValues};for(const n in e)Object.defineProperty(a,n,{get:()=>{const a=n;return t._proxyFormState[a]!==v&&(t._proxyFormState[a]=!s||v),r&&(r[a]=!0),e[a]}});return a},E=e=>i(e)&&!Object.keys(e).length,j=(e,t,r)=>{const{name:s,...a}=e;return E(a)||Object.keys(a).length>=Object.keys(t).length||Object.keys(a).find(e=>t[e]===(!r||v))},O=e=>Array.isArray(e)?e:[e],U=(e,t,r)=>r&&t?e===t:!e||!t||e===t||O(e).some(e=>e&&(e.startsWith(t)||t.startsWith(e)));function B(e){const r=t.default.useRef(e);r.current=e,t.default.useEffect(()=>{const t=!e.disabled&&r.current.subject.subscribe({next:r.current.callback});return()=>{t&&t.unsubscribe()}},[e.disabled])}function T(e){const r=D(),{control:s=r.control,disabled:a,name:n,exact:i}=e||{},[o,u]=t.default.useState(s._formState),l=t.default.useRef(!0),c=t.default.useRef({isDirty:!1,dirtyFields:!1,touchedFields:!1,isValidating:!1,isValid:!1,errors:!1}),d=t.default.useRef(n);return d.current=n,B({disabled:a,callback:t.default.useCallback(e=>l.current&&U(d.current,e.name,i)&&j(e,c.current)&&u({...s._formState,...e}),[s,i]),subject:s._subjects.state}),t.default.useEffect(()=>(l.current=!0,()=>{l.current=!1}),[]),C(o,s,c.current,!1)}var M=e=>"string"==typeof e,N=(e,t,r,s)=>{const a=Array.isArray(e);return M(e)?(s&&t.watch.add(e),d(r,e)):a?e.map(e=>(s&&t.watch.add(e),d(r,e))):(s&&(t.watchAll=!0),r)},L=e=>"function"==typeof e,R=e=>{for(const t in e)if(L(e[t]))return!0;return!1};function q(e){const r=D(),{control:s=r.control,name:a,defaultValue:n,disabled:o,exact:u}=e||{},l=t.default.useRef(a);l.current=a,B({disabled:o,subject:s._subjects.watch,callback:t.default.useCallback(e=>{if(U(l.current,e.name,u)){const t=N(l.current,s._names,e.values||s._formValues);f(c(l.current)||i(t)&&!R(t)?{...t}:Array.isArray(t)?[...t]:c(t)?n:t)}},[s,u,n])});const[d,f]=t.default.useState(c(n)?s._getWatch(a):n);return t.default.useEffect(()=>s._removeUnmounted()),d}function P(e){const r=D(),{name:s,control:a=r.control,shouldUnregister:n}=e,i=u(a._names.array,s),l=q({control:a,name:s,defaultValue:d(a._formValues,s,d(a._defaultValues,s,e.defaultValue)),exact:!0}),c=T({control:a,name:s}),m=t.default.useRef(a.register(s,{...e.rules,value:l}));return t.default.useEffect(()=>{const e=(e,t)=>{const r=d(a._fields,e);r&&(r._f.mount=t)};return e(s,!0),()=>{const t=a._options.shouldUnregister||n;(i?t&&!a._stateFlags.action:t)?a.unregister(s):e(s,!1)}},[s,a,i,n]),{field:{name:s,value:l,onChange:t.default.useCallback(e=>m.current.onChange({target:{value:o(e),name:s},type:y}),[s]),onBlur:t.default.useCallback(()=>m.current.onBlur({target:{value:d(a._formValues,s),name:s},type:f}),[s,a]),ref:e=>{const t=d(a._fields,s);t&&e&&(t._f.ref={focus:()=>e.focus(),select:()=>e.select(),setCustomValidity:t=>e.setCustomValidity(t),reportValidity:()=>e.reportValidity()})}},formState:c,fieldState:Object.defineProperties({},{invalid:{enumerable:!0,get:()=>!!d(c.errors,s)},isDirty:{enumerable:!0,get:()=>!!d(c.dirtyFields,s)},isTouched:{enumerable:!0,get:()=>!!d(c.touchedFields,s)},error:{enumerable:!0,get:()=>d(c.errors,s)}})}}var W=(e,t,r,s,a)=>t?{...r[e],types:{...r[e]&&r[e].types?r[e].types:{},[s]:a||!0}}:{},$=e=>/^\w*$/.test(e),I=e=>l(e.replace(/["|']|\]/g,"").split(/\.|\[/));function H(e,t,r){let s=-1;const a=$(t)?[t]:I(t),n=a.length,o=n-1;for(;++s<n;){const t=a[s];let n=r;if(s!==o){const r=e[t];n=i(r)||Array.isArray(r)?r:isNaN(+a[s+1])?{}:[]}e[t]=n,e=e[t]}return e}const z=(e,t,r)=>{for(const s of r||Object.keys(e)){const r=d(e,s);if(r){const{_f:e,...s}=r;if(e&&t(e.name)){if(e.ref.focus){e.ref.focus();break}if(e.refs&&e.refs[0].focus){e.refs[0].focus();break}}else i(s)&&z(s,t)}}};var G=()=>{const e="undefined"==typeof performance?Date.now():1e3*performance.now();return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{const r=(16*Math.random()+e)%16|0;return("x"==t?r:3&r|8).toString(16)})},J=(e,t,r={})=>r.shouldFocus||c(r.shouldFocus)?r.focusName||`${e}.${c(r.focusIndex)?t:r.focusIndex}.`:"",K=(e,t,r)=>!r&&(t.watchAll||t.watch.has(e)||[...t.watch].some(t=>e.startsWith(t)&&/^\.\w+/.test(e.slice(t.length)))),Q=(e,t,r)=>{const s=l(d(e,r));return H(s,"root",t[r]),H(e,r,s),e},X=e=>"boolean"==typeof e,Y=e=>"file"===e.type,Z=e=>M(e)||t.default.isValidElement(e),ee=e=>"radio"===e.type,te=e=>e instanceof RegExp;const re={value:!1,isValid:!1},se={value:!0,isValid:!0};var ae=e=>{if(Array.isArray(e)){if(e.length>1){const t=e.filter(e=>e&&e.checked&&!e.disabled).map(e=>e.value);return{value:t,isValid:!!t.length}}return e[0].checked&&!e[0].disabled?e[0].attributes&&!c(e[0].attributes.value)?c(e[0].value)||""===e[0].value?se:{value:e[0].value,isValid:!0}:se:re}return re};const ne={isValid:!1,value:null};var ie=e=>Array.isArray(e)?e.reduce((e,t)=>t&&t.checked&&!t.disabled?{isValid:!0,value:t.value}:e,ne):ne;function oe(e,t,r="validate"){if(Z(e)||Array.isArray(e)&&e.every(Z)||X(e)&&!e)return{type:r,message:Z(e)?e:"",ref:t}}var ue=e=>i(e)&&!te(e)?e:{value:e,message:""},le=async(e,t,s,n,o)=>{const{ref:u,refs:l,required:c,maxLength:d,minLength:f,min:m,max:y,pattern:g,validate:h,name:p,valueAsNumber:_,mount:v,disabled:k}=e._f;if(!v||k)return{};const D=l?l[0]:u,C=e=>{n&&D.reportValidity&&(D.setCustomValidity(X(e)?"":e||" "),D.reportValidity())},j={},O=ee(u),U=r(u),B=O||U,T=(_||Y(u))&&!u.value||""===t||Array.isArray(t)&&!t.length,N=W.bind(null,p,s,j),R=(e,t,r,s=A,a=F)=>{const n=e?t:r;j[p]={type:e?s:a,message:n,ref:u,...N(e?s:a,n)}};if(o?!Array.isArray(t)||!t.length:c&&(!B&&(T||a(t))||X(t)&&!t||U&&!ae(l).isValid||O&&!ie(l).isValid)){const{value:e,message:t}=Z(c)?{value:!!c,message:c}:ue(c);if(e&&(j[p]={type:w,message:t,ref:D,...N(w,t)},!s))return C(t),j}if(!(T||a(m)&&a(y))){let e,r;const n=ue(y),i=ue(m);if(a(t)||isNaN(t)){const s=u.valueAsDate||new Date(t),a=e=>new Date((new Date).toDateString()+" "+e),o="time"==u.type,l="week"==u.type;M(n.value)&&t&&(e=o?a(t)>a(n.value):l?t>n.value:s>new Date(n.value)),M(i.value)&&t&&(r=o?a(t)<a(i.value):l?t<i.value:s<new Date(i.value))}else{const s=u.valueAsNumber||(t?+t:t);a(n.value)||(e=s>n.value),a(i.value)||(r=s<i.value)}if((e||r)&&(R(!!e,n.message,i.message,b,x),!s))return C(j[p].message),j}if((d||f)&&!T&&(M(t)||o&&Array.isArray(t))){const e=ue(d),r=ue(f),n=!a(e.value)&&t.length>e.value,i=!a(r.value)&&t.length<r.value;if((n||i)&&(R(n,e.message,r.message),!s))return C(j[p].message),j}if(g&&!T&&M(t)){const{value:e,message:r}=ue(g);if(te(e)&&!t.match(e)&&(j[p]={type:V,message:r,ref:u,...N(V,r)},!s))return C(r),j}if(h)if(L(h)){const e=oe(await h(t),D);if(e&&(j[p]={...e,...N(S,e.message)},!s))return C(e.message),j}else if(i(h)){let e={};for(const r in h){if(!E(e)&&!s)break;const a=oe(await h[r](t),D,r);a&&(e={...a,...N(r,a.message)},C(a.message),s&&(j[p]=e))}if(!E(e)&&(j[p]={ref:D,...e},!s))return j}return C(!0),j};function ce(e,t){return[...e,...O(t)]}var de="undefined"!=typeof window&&void 0!==window.HTMLElement&&"undefined"!=typeof document;function fe(e){let t;const r=Array.isArray(e);if(e instanceof Date)t=new Date(e);else if(e instanceof Set)t=new Set(e);else{if(de&&(e instanceof Blob||e instanceof FileList)||!r&&!i(e))return e;if(t=r?[]:{},Array.isArray(e)||(e=>{const t=e.constructor&&e.constructor.prototype;return i(t)&&t.hasOwnProperty("isPrototypeOf")})(e))for(const r in e)t[r]=fe(e[r]);else t=e}return t}var me=e=>Array.isArray(e)?e.map(()=>{}):void 0,ye=e=>({isOnSubmit:!e||e===p,isOnBlur:e===g,isOnChange:e===h,isOnAll:e===v,isOnTouch:e===_});function ge(e,t,r){return[...e.slice(0,t),...O(r),...e.slice(t)]}var he=(e,t,r)=>Array.isArray(e)?(c(e[r])&&(e[r]=void 0),e.splice(r,0,e.splice(t,1)[0]),e):[];function pe(e,t){return[...O(t),...O(e)]}var _e=(e,t)=>c(t)?[]:function(e,t){let r=0;const s=[...e];for(const e of t)s.splice(e-r,1),r++;return l(s).length?s:[]}(e,O(t).sort((e,t)=>e-t)),ve=(e,t,r)=>{e[t]=[e[r],e[r]=e[t]][0]};function be(e){for(const t in e)if(!c(e[t]))return!1;return!0}function xe(e,t){const r=$(t)?[t]:I(t),s=1==r.length?e:function(e,t){const r=t.slice(0,-1).length;let s=0;for(;s<r;)e=c(e)?s++:e[t[s++]];return e}(e,r),a=r[r.length-1];let n;s&&delete s[a];for(let t=0;t<r.slice(0,-1).length;t++){let s,a=-1;const o=r.slice(0,-(t+1)),u=o.length-1;for(t>0&&(n=e);++a<o.length;){const t=o[a];s=s?s[t]:e[t],u===a&&(i(s)&&E(s)||Array.isArray(s)&&be(s))&&(n?delete n[t]:delete e[t]),n=s}}return e}var Ae=(e,t,r)=>(e[t]=r,e);function Fe(){let e=[];return{get observers(){return e},next:t=>{for(const r of e)r.next(t)},subscribe:t=>(e.push(t),{unsubscribe:()=>{e=e.filter(e=>e!==t)}}),unsubscribe:()=>{e=[]}}}var Ve=e=>a(e)||!n(e);function we(e,t){if(Ve(e)||Ve(t))return e===t;if(s(e)&&s(t))return e.getTime()===t.getTime();const r=Object.keys(e),a=Object.keys(t);if(r.length!==a.length)return!1;for(const n of r){const r=e[n];if(!a.includes(n))return!1;if("ref"!==n){const e=t[n];if(s(r)&&s(e)||i(r)&&i(e)||Array.isArray(r)&&Array.isArray(e)?!we(r,e):r!==e)return!1}}return!0}var Se=e=>{const t=e?e.ownerDocument:0;return e instanceof(t&&t.defaultView?t.defaultView.HTMLElement:HTMLElement)},ke=e=>"select-multiple"===e.type,De=e=>Se(e)&&e.isConnected;function Ce(e,t={}){const r=Array.isArray(e);if(i(e)||r)for(const r in e)Array.isArray(e[r])||i(e[r])&&!R(e[r])?(t[r]=Array.isArray(e[r])?[]:{},Ce(e[r],t[r])):a(e[r])||(t[r]=!0);return t}var Ee=(e,t)=>function e(t,r,s){const n=Array.isArray(t);if(i(t)||n)for(const n in t)Array.isArray(t[n])||i(t[n])&&!R(t[n])?c(r)||Ve(s[n])?s[n]=Array.isArray(t[n])?Ce(t[n],[]):{...Ce(t[n])}:e(t[n],a(r)?{}:r[n],s[n]):s[n]=!we(t[n],r[n]);return s}(e,t,Ce(t)),je=(e,{valueAsNumber:t,valueAsDate:r,setValueAs:s})=>c(e)?e:t?""===e?NaN:e?+e:e:r&&M(e)?new Date(e):s?s(e):e;function Oe(e){const t=e.ref;if(!(e.refs?e.refs.every(e=>e.disabled):t.disabled))return Y(t)?t.files:ee(t)?ie(e.refs).value:ke(t)?[...t.selectedOptions].map(({value:e})=>e):r(t)?ae(e.refs).value:je(c(t.value)?e.ref.value:t.value,e)}var Ue=e=>c(e)?void 0:te(e)?e.source:i(e)?te(e.value)?e.value.source:e.value:e;function Be(e,t,r){const s=d(e,r);if(s||$(r))return{error:s,name:r};const a=r.split(".");for(;a.length;){const s=a.join("."),n=d(t,s),i=d(e,s);if(n&&!Array.isArray(n)&&r!==s)return{name:r};if(i&&i.type)return{name:s,error:i};a.pop()}return{name:r}}const Te={mode:p,reValidateMode:h,shouldFocusError:!0};function Me(e={}){let t,n={...Te,...e},i={submitCount:0,isDirty:!1,isValidating:!1,isSubmitted:!1,isSubmitting:!1,isSubmitSuccessful:!1,isValid:!1,touchedFields:{},dirtyFields:{},errors:{}},y={},g=fe(n.defaultValues)||{},h=n.shouldUnregister?{}:fe(g),p={action:!1,mount:!1,watch:!1},_={mount:new Set,unMount:new Set,array:new Set,watch:new Set},b=0,x={};const A={isDirty:!1,dirtyFields:!1,touchedFields:!1,isValidating:!1,isValid:!1,errors:!1},F={watch:Fe(),array:Fe(),state:Fe()},V=ye(n.mode),w=ye(n.reValidateMode),S=n.criteriaMode===v,k=async e=>{let t=!1;return A.isValid&&(t=n.resolver?E((await U()).errors):await B(y,!0),e||t===i.isValid||(i.isValid=t,F.state.next({isValid:t}))),t},D=(e,t,r,s)=>{const a=d(y,e);if(a){const n=d(h,e,c(r)?d(g,e):r);c(n)||s&&s.defaultChecked||t?H(h,e,t?n:Oe(a._f)):q(e,n),p.mount&&k()}},C=(e,t,r,s,a)=>{let n=!1;const o={name:e},u=d(i.touchedFields,e);if(A.isDirty){const e=i.isDirty;i.isDirty=o.isDirty=T(),n=e!==o.isDirty}if(A.dirtyFields&&(!r||s)){const r=d(i.dirtyFields,e);we(d(g,e),t)?xe(i.dirtyFields,e):H(i.dirtyFields,e,!0),o.dirtyFields=i.dirtyFields,n=n||r!==d(i.dirtyFields,e)}return r&&!u&&(H(i.touchedFields,e,r),o.touchedFields=i.touchedFields,n=n||A.touchedFields&&u!==r),n&&a&&F.state.next(o),n?o:{}},j=async(r,s,a,n)=>{const o=d(i.errors,r),u=A.isValid&&i.isValid!==s;var l;if(e.delayError&&a?(l=()=>((e,t)=>{H(i.errors,e,t),F.state.next({errors:i.errors})})(r,a),t=e=>{clearTimeout(b),b=window.setTimeout(l,e)},t(e.delayError)):(clearTimeout(b),t=null,a?H(i.errors,r,a):xe(i.errors,r)),(a?!we(o,a):o)||!E(n)||u){const e={...n,...u?{isValid:s}:{},errors:i.errors,name:r};i={...i,...e},F.state.next(e)}x[r]--,A.isValidating&&!Object.values(x).some(e=>e)&&(F.state.next({isValidating:!1}),x={})},U=async e=>n.resolver?await n.resolver({...h},n.context,((e,t,r,s)=>{const a={};for(const r of e){const e=d(t,r);e&&H(a,r,e._f)}return{criteriaMode:r,names:[...e],fields:a,shouldUseNativeValidation:s}})(e||_.mount,y,n.criteriaMode,n.shouldUseNativeValidation)):{},B=async(e,t,r={valid:!0})=>{for(const s in e){const a=e[s];if(a){const{_f:e,...s}=a;if(e){const s=_.array.has(e.name),o=await le(a,d(h,e.name),S,n.shouldUseNativeValidation,s);if(o[e.name]&&(r.valid=!1,t))break;!t&&(d(o,e.name)?s?Q(i.errors,o,e.name):H(i.errors,e.name,o[e.name]):xe(i.errors,e.name))}s&&await B(s,t,r)}}return r.valid},T=(e,t)=>(e&&t&&H(h,e,t),!we(G(),g)),R=(e,t,r)=>{const s={...p.mount?h:c(t)?g:M(e)?{[e]:t}:t};return N(e,_,s,r)},q=(e,t,s={})=>{const n=d(y,e);let i=t;if(n){const s=n._f;s&&(!s.disabled&&H(h,e,je(t,s)),i=de&&Se(s.ref)&&a(t)?"":t,ke(s.ref)?[...s.ref.options].forEach(e=>e.selected=i.includes(e.value)):s.refs?r(s.ref)?s.refs.length>1?s.refs.forEach(e=>(!e.defaultChecked||!e.disabled)&&(e.checked=Array.isArray(i)?!!i.find(t=>t===e.value):i===e.value)):s.refs[0]&&(s.refs[0].checked=!!i):s.refs.forEach(e=>e.checked=e.value===i):Y(s.ref)?s.ref.value="":(s.ref.value=i,s.ref.type||F.watch.next({name:e})))}(s.shouldDirty||s.shouldTouch)&&C(e,i,s.shouldTouch,s.shouldDirty,!0),s.shouldValidate&&I(e)},P=(e,t,r)=>{for(const a in t){const n=t[a],i=`${e}.${a}`,o=d(y,i);!_.array.has(e)&&Ve(n)&&(!o||o._f)||s(n)?q(i,n,r):P(i,n,r)}},W=(e,t,r={})=>{const s=d(y,e),n=_.array.has(e),o=fe(t);H(h,e,o),n?(F.array.next({name:e,values:h}),(A.isDirty||A.dirtyFields)&&r.shouldDirty&&(i.dirtyFields=Ee(g,h),F.state.next({name:e,dirtyFields:i.dirtyFields,isDirty:T(e,o)}))):!s||s._f||a(o)?q(e,o,r):P(e,o,r),K(e,_)&&F.state.next({}),F.watch.next({name:e})},$=async e=>{const r=e.target;let s=r.name;const a=d(y,s);if(a){let l,c;const g=r.type?Oe(a._f):o(e),p=e.type===f||e.type===m,v=!((u=a._f).mount&&(u.required||u.min||u.max||u.maxLength||u.minLength||u.pattern||u.validate)||n.resolver||d(i.errors,s)||a._f.deps)||((e,t,r,s,a)=>!a.isOnAll&&(!r&&a.isOnTouch?!(t||e):(r?s.isOnBlur:a.isOnBlur)?!e:!(r?s.isOnChange:a.isOnChange)||e))(p,d(i.touchedFields,s),i.isSubmitted,w,V),b=K(s,_,p);H(h,s,g),p?(a._f.onBlur&&a._f.onBlur(e),t&&t(0)):a._f.onChange&&a._f.onChange(e);const A=C(s,g,p,!1),D=!E(A)||b;if(!p&&F.watch.next({name:s,type:e.type}),v)return D&&F.state.next({name:s,...b?{}:A});if(!p&&b&&F.state.next({}),x[s]=(x[s],1),F.state.next({isValidating:!0}),n.resolver){const{errors:e}=await U([s]),t=Be(i.errors,y,s),r=Be(e,y,t.name||s);l=r.error,s=r.name,c=E(e)}else l=(await le(a,d(h,s),S,n.shouldUseNativeValidation))[s],c=await k(!0);a._f.deps&&I(a._f.deps),j(s,c,l,A)}var u},I=async(e,t={})=>{let r,s;const a=O(e);if(F.state.next({isValidating:!0}),n.resolver){const t=await(async e=>{const{errors:t}=await U();if(e)for(const r of e){const e=d(t,r);e?H(i.errors,r,e):xe(i.errors,r)}else i.errors=t;return t})(c(e)?e:a);r=E(t),s=e?!a.some(e=>d(t,e)):r}else e?(s=(await Promise.all(a.map(async e=>{const t=d(y,e);return await B(t&&t._f?{[e]:t}:t)}))).every(Boolean),(s||i.isValid)&&k()):s=r=await B(y);return F.state.next({...!M(e)||A.isValid&&r!==i.isValid?{}:{name:e},...n.resolver||!e?{isValid:r}:{},errors:i.errors,isValidating:!1}),t.shouldFocus&&!s&&z(y,e=>e&&d(i.errors,e),e?a:_.mount),s},G=e=>{const t={...g,...p.mount?h:{}};return c(e)?t:M(e)?d(t,e):e.map(e=>d(t,e))},J=(e,t)=>({invalid:!!d((t||i).errors,e),isDirty:!!d((t||i).dirtyFields,e),isTouched:!!d((t||i).touchedFields,e),error:d((t||i).errors,e)}),Z=(e,t={})=>{for(const r of e?O(e):_.mount)_.mount.delete(r),_.array.delete(r),d(y,r)&&(t.keepValue||(xe(y,r),xe(h,r)),!t.keepError&&xe(i.errors,r),!t.keepDirty&&xe(i.dirtyFields,r),!t.keepTouched&&xe(i.touchedFields,r),!n.shouldUnregister&&!t.keepDefaultValue&&xe(g,r));F.watch.next({}),F.state.next({...i,...t.keepDirty?{isDirty:T()}:{}}),!t.keepIsValid&&k()},te=(e,t={})=>{let s=d(y,e);const a=X(t.disabled);return H(y,e,{...s||{},_f:{...s&&s._f?s._f:{ref:{name:e}},name:e,mount:!0,...t}}),_.mount.add(e),s?a&&H(h,e,t.disabled?void 0:d(h,e,Oe(s._f))):D(e,!0,t.value),{...a?{disabled:t.disabled}:{},...n.shouldUseNativeValidation?{required:!!t.required,min:Ue(t.min),max:Ue(t.max),minLength:Ue(t.minLength),maxLength:Ue(t.maxLength),pattern:Ue(t.pattern)}:{},name:e,onChange:$,onBlur:$,ref:a=>{if(a){te(e,t),s=d(y,e);const n=c(a.value)&&a.querySelectorAll&&a.querySelectorAll("input,select,textarea")[0]||a,i=(e=>ee(e)||r(e))(n),o=s._f.refs||[];if(i?o.find(e=>e===n):n===s._f.ref)return;H(y,e,{_f:{...s._f,...i?{refs:[...o.filter(De),n,...Array.isArray(d(g,e))?[{}]:[]],ref:{type:n.type,name:e}}:{ref:n}}}),D(e,!1,void 0,n)}else s=d(y,e,{}),s._f&&(s._f.mount=!1),(n.shouldUnregister||t.shouldUnregister)&&(!u(_.array,e)||!p.action)&&_.unMount.add(e)}}},re=()=>n.shouldFocusError&&z(y,e=>e&&d(i.errors,e),_.mount);return{control:{register:te,unregister:Z,getFieldState:J,_executeSchema:U,_focusError:re,_getWatch:R,_getDirty:T,_updateValid:k,_removeUnmounted:()=>{for(const e of _.unMount){const t=d(y,e);t&&(t._f.refs?t._f.refs.every(e=>!De(e)):!De(t._f.ref))&&Z(e)}_.unMount=new Set},_updateFieldArray:(e,t=[],r,s,a=!0,n=!0)=>{if(s&&r){if(p.action=!0,n&&Array.isArray(d(y,e))){const t=r(d(y,e),s.argA,s.argB);a&&H(y,e,t)}if(A.errors&&n&&Array.isArray(d(i.errors,e))){const t=r(d(i.errors,e),s.argA,s.argB);a&&H(i.errors,e,t),((e,t)=>{!l(d(e,t)).length&&xe(e,t)})(i.errors,e)}if(A.touchedFields&&n&&Array.isArray(d(i.touchedFields,e))){const t=r(d(i.touchedFields,e),s.argA,s.argB);a&&H(i.touchedFields,e,t)}A.dirtyFields&&(i.dirtyFields=Ee(g,h)),F.state.next({isDirty:T(e,t),dirtyFields:i.dirtyFields,errors:i.errors,isValid:i.isValid})}else H(h,e,t)},_getFieldArray:t=>l(d(p.mount?h:g,t,e.shouldUnregister?d(g,t,[]):[])),_subjects:F,_proxyFormState:A,get _fields(){return y},get _formValues(){return h},get _stateFlags(){return p},set _stateFlags(e){p=e},get _defaultValues(){return g},get _names(){return _},set _names(e){_=e},get _formState(){return i},set _formState(e){i=e},get _options(){return n},set _options(e){n={...n,...e}}},trigger:I,register:te,handleSubmit:(e,t)=>async r=>{r&&(r.preventDefault&&r.preventDefault(),r.persist&&r.persist());let s=!0,a=fe(h);F.state.next({isSubmitting:!0});try{if(n.resolver){const{errors:e,values:t}=await U();i.errors=e,a=t}else await B(y);E(i.errors)?(F.state.next({errors:{},isSubmitting:!0}),await e(a,r)):(t&&await t({...i.errors},r),re())}catch(e){throw s=!1,e}finally{i.isSubmitted=!0,F.state.next({isSubmitted:!0,isSubmitting:!1,isSubmitSuccessful:E(i.errors)&&s,submitCount:i.submitCount+1,errors:i.errors})}},watch:(e,t)=>L(e)?F.watch.subscribe({next:r=>e(R(void 0,t),r)}):R(e,t,!0),setValue:W,getValues:G,reset:(t,r)=>((t,r={})=>{const s=t||g,a=fe(s),n=t&&!E(t)?a:g;if(r.keepDefaultValues||(g=s),!r.keepValues){if(r.keepDirtyValues)for(const e of _.mount)d(i.dirtyFields,e)?H(n,e,d(h,e)):W(e,d(n,e));else{if(de&&c(t))for(const e of _.mount){const t=d(y,e);if(t&&t._f){const e=Array.isArray(t._f.refs)?t._f.refs[0]:t._f.ref;try{if(Se(e)){e.closest("form").reset();break}}catch(e){}}}y={}}h=e.shouldUnregister?r.keepDefaultValues?fe(g):{}:a,F.array.next({values:n}),F.watch.next({values:n})}_={mount:new Set,unMount:new Set,array:new Set,watch:new Set,watchAll:!1,focus:""},p.mount=!A.isValid||!!r.keepIsValid,p.watch=!!e.shouldUnregister,F.state.next({submitCount:r.keepSubmitCount?i.submitCount:0,isDirty:r.keepDirty||r.keepDirtyValues?i.isDirty:!(!r.keepDefaultValues||we(t,g)),isSubmitted:!!r.keepIsSubmitted&&i.isSubmitted,dirtyFields:r.keepDirty||r.keepDirtyValues?i.dirtyFields:r.keepDefaultValues&&t?Ee(g,t):{},touchedFields:r.keepTouched?i.touchedFields:{},errors:r.keepErrors?i.errors:{},isSubmitting:!1,isSubmitSuccessful:!1})})(L(t)?t(h):t,r),resetField:(e,t={})=>{d(y,e)&&(c(t.defaultValue)?W(e,d(g,e)):(W(e,t.defaultValue),H(g,e,t.defaultValue)),t.keepTouched||xe(i.touchedFields,e),t.keepDirty||(xe(i.dirtyFields,e),i.isDirty=t.defaultValue?T(e,d(g,e)):T()),t.keepError||(xe(i.errors,e),A.isValid&&k()),F.state.next({...i}))},clearErrors:e=>{e?O(e).forEach(e=>xe(i.errors,e)):i.errors={},F.state.next({errors:i.errors})},unregister:Z,setError:(e,t,r)=>{const s=(d(y,e,{_f:{}})._f||{}).ref;H(i.errors,e,{...t,ref:s}),F.state.next({name:e,errors:i.errors,isValid:!1}),r&&r.shouldFocus&&s&&s.focus&&s.focus()},setFocus:(e,t={})=>{const r=d(y,e),s=r&&r._f;if(s){const e=s.refs?s.refs[0]:s.ref;e.focus&&(e.focus(),t.shouldSelect&&e.select())}},getFieldState:J}}exports.Controller=e=>e.render(P(e)),exports.FormProvider=e=>{const{children:r,...s}=e;return t.default.createElement(k.Provider,{value:s},r)},exports.appendErrors=W,exports.get=d,exports.set=H,exports.useController=P,exports.useFieldArray=function(e){const r=D(),{control:s=r.control,name:a,keyName:n="id",shouldUnregister:i}=e,[o,u]=t.default.useState(s._getFieldArray(a)),l=t.default.useRef(s._getFieldArray(a).map(G)),c=t.default.useRef(o),f=t.default.useRef(a),m=t.default.useRef(!1);f.current=a,c.current=o,s._names.array.add(a),e.rules&&s.register(a,e.rules),B({callback:t.default.useCallback(({values:e,name:t})=>{if(t===f.current||!t){const t=d(e,f.current);Array.isArray(t)&&(u(t),l.current=t.map(G))}},[]),subject:s._subjects.array});const y=t.default.useCallback(e=>{m.current=!0,s._updateFieldArray(a,e)},[s,a]);return t.default.useEffect(()=>{if(s._stateFlags.action=!1,K(a,s._names)&&s._subjects.state.next({}),m.current&&(!ye(s._options.mode).isOnSubmit||s._formState.isSubmitted))if(s._options.resolver)s._executeSchema([a]).then(e=>{const t=d(e.errors,a),r=d(s._formState.errors,a);(r?!t&&r.type:t&&t.type)&&(t?H(s._formState.errors,a,t):xe(s._formState.errors,a),s._subjects.state.next({errors:s._formState.errors}))});else{const e=d(s._fields,a);e&&e._f&&le(e,d(s._formValues,a),s._options.criteriaMode===v,s._options.shouldUseNativeValidation,!0).then(e=>!E(e)&&s._subjects.state.next({errors:Q(s._formState.errors,e,a)}))}s._subjects.watch.next({name:a,values:s._formValues}),s._names.focus&&z(s._fields,e=>!!e&&e.startsWith(s._names.focus)),s._names.focus="",s._proxyFormState.isValid&&s._updateValid()},[o,a,s]),t.default.useEffect(()=>(!d(s._formValues,a)&&s._updateFieldArray(a),()=>{(s._options.shouldUnregister||i)&&s.unregister(a)}),[a,s,n,i]),{swap:t.default.useCallback((e,t)=>{const r=s._getFieldArray(a);ve(r,e,t),ve(l.current,e,t),y(r),u(r),s._updateFieldArray(a,r,ve,{argA:e,argB:t},!1)},[y,a,s]),move:t.default.useCallback((e,t)=>{const r=s._getFieldArray(a);he(r,e,t),he(l.current,e,t),y(r),u(r),s._updateFieldArray(a,r,he,{argA:e,argB:t},!1)},[y,a,s]),prepend:t.default.useCallback((e,t)=>{const r=O(fe(e)),n=pe(s._getFieldArray(a),r);s._names.focus=J(a,0,t),l.current=pe(l.current,r.map(G)),y(n),u(n),s._updateFieldArray(a,n,pe,{argA:me(e)})},[y,a,s]),append:t.default.useCallback((e,t)=>{const r=O(fe(e)),n=ce(s._getFieldArray(a),r);s._names.focus=J(a,n.length-1,t),l.current=ce(l.current,r.map(G)),y(n),u(n),s._updateFieldArray(a,n,ce,{argA:me(e)})},[y,a,s]),remove:t.default.useCallback(e=>{const t=_e(s._getFieldArray(a),e);l.current=_e(l.current,e),y(t),u(t),s._updateFieldArray(a,t,_e,{argA:e})},[y,a,s]),insert:t.default.useCallback((e,t,r)=>{const n=O(fe(t)),i=ge(s._getFieldArray(a),e,n);s._names.focus=J(a,e,r),l.current=ge(l.current,e,n.map(G)),y(i),u(i),s._updateFieldArray(a,i,ge,{argA:e,argB:me(t)})},[y,a,s]),update:t.default.useCallback((e,t)=>{const r=fe(t),n=Ae(s._getFieldArray(a),e,r);l.current=[...n].map((t,r)=>t&&r!==e?l.current[r]:G()),y(n),u([...n]),s._updateFieldArray(a,n,Ae,{argA:e,argB:r},!0,!1)},[y,a,s]),replace:t.default.useCallback(e=>{const t=O(fe(e));l.current=t.map(G),y([...t]),u([...t]),s._updateFieldArray(a,[...t],e=>e,{},!0,!1)},[y,a,s]),fields:t.default.useMemo(()=>o.map((e,t)=>({...e,[n]:l.current[t]||G()})),[o,n])}},exports.useForm=function(e={}){const r=t.default.useRef(),[s,a]=t.default.useState({isDirty:!1,isValidating:!1,isSubmitted:!1,isSubmitting:!1,isSubmitSuccessful:!1,isValid:!1,submitCount:0,dirtyFields:{},touchedFields:{},errors:{},defaultValues:e.defaultValues});r.current||(r.current={...Me(e),formState:s});const n=r.current.control;return n._options=e,B({subject:n._subjects.state,callback:t.default.useCallback(e=>{j(e,n._proxyFormState,!0)&&(n._formState={...n._formState,...e},a({...n._formState}))},[n])}),t.default.useEffect(()=>{n._stateFlags.mount||(n._proxyFormState.isValid&&n._updateValid(),n._stateFlags.mount=!0),n._stateFlags.watch&&(n._stateFlags.watch=!1,n._subjects.state.next({})),n._removeUnmounted()}),t.default.useEffect(()=>{s.submitCount&&n._focusError()},[n,s.submitCount]),r.current.formState=C(s,n),r.current},exports.useFormContext=D,exports.useFormState=T,exports.useWatch=q;
//# sourceMappingURL=index.cjs.js.map
import React from 'react';

var isCheckBoxInput = (element) => element.type === 'checkbox';

var isDateObject = (value) => value instanceof Date;

var isNullOrUndefined = (value) => value == null;

const isObjectType = (value) => typeof value === 'object';
var isObject = (value) => !isNullOrUndefined(value) &&
    !Array.isArray(value) &&
    isObjectType(value) &&
    !isDateObject(value);

var getEventValue = (event) => isObject(event) && event.target
    ? isCheckBoxInput(event.target)
        ? event.target.checked
        : event.target.value
    : event;

var getNodeParentName = (name) => name.substring(0, name.search(/\.\d+(\.|$)/)) || name;

var isNameInFieldArray = (names, name) => names.has(getNodeParentName(name));

var compact = (value) => Array.isArray(value) ? value.filter(Boolean) : [];

var isUndefined = (val) => val === undefined;

var get = (obj, path, defaultValue) => {
    if (!path || !isObject(obj)) {
        return defaultValue;
    }
    const result = compact(path.split(/[,[\].]+?/)).reduce((result, key) => isNullOrUndefined(result) ? result : result[key], obj);
    return isUndefined(result) || result === obj
        ? isUndefined(obj[path])
            ? defaultValue
            : obj[path]
        : result;
};

const EVENTS = {
    BLUR: 'blur',
    FOCUS_OUT: 'focusout',
    CHANGE: 'change',
};
const VALIDATION_MODE = {
    onBlur: 'onBlur',
    onChange: 'onChange',
    onSubmit: 'onSubmit',
    onTouched: 'onTouched',
    all: 'all',
};
const INPUT_VALIDATION_RULES = {
    max: 'max',
    min: 'min',
    maxLength: 'maxLength',
    minLength: 'minLength',
    pattern: 'pattern',
    required: 'required',
    validate: 'validate',
};

const HookFormContext = React.createContext(null);
/**
 * This custom hook allows you to access the form context. useFormContext is intended to be used in deeply nested structures, where it would become inconvenient to pass the context as a prop. To be used with {@link FormProvider}.
 *
 * @remarks
 * [API](https://react-hook-form.com/api/useformcontext) • [Demo](https://codesandbox.io/s/react-hook-form-v7-form-context-ytudi)
 *
 * @returns return all useForm methods
 *
 * @example
 * ```tsx
 * function App() {
 *   const methods = useForm();
 *   const onSubmit = data => console.log(data);
 *
 *   return (
 *     <FormProvider {...methods} >
 *       <form onSubmit={methods.handleSubmit(onSubmit)}>
 *         <NestedInput />
 *         <input type="submit" />
 *       </form>
 *     </FormProvider>
 *   );
 * }
 *
 *  function NestedInput() {
 *   const { register } = useFormContext(); // retrieve all hook methods
 *   return <input {...register("test")} />;
 * }
 * ```
 */
const useFormContext = () => React.useContext(HookFormContext);
/**
 * A provider component that propagates the `useForm` methods to all children components via [React Context](https://reactjs.org/docs/context.html) API. To be used with {@link useFormContext}.
 *
 * @remarks
 * [API](https://react-hook-form.com/api/useformcontext) • [Demo](https://codesandbox.io/s/react-hook-form-v7-form-context-ytudi)
 *
 * @param props - all useFrom methods
 *
 * @example
 * ```tsx
 * function App() {
 *   const methods = useForm();
 *   const onSubmit = data => console.log(data);
 *
 *   return (
 *     <FormProvider {...methods} >
 *       <form onSubmit={methods.handleSubmit(onSubmit)}>
 *         <NestedInput />
 *         <input type="submit" />
 *       </form>
 *     </FormProvider>
 *   );
 * }
 *
 *  function NestedInput() {
 *   const { register } = useFormContext(); // retrieve all hook methods
 *   return <input {...register("test")} />;
 * }
 * ```
 */
const FormProvider = (props) => {
    const { children, ...data } = props;
    return (React.createElement(HookFormContext.Provider, { value: data }, children));
};

var getProxyFormState = (formState, control, localProxyFormState, isRoot = true) => {
    const result = {
        defaultValues: control._defaultValues,
    };
    for (const key in formState) {
        Object.defineProperty(result, key, {
            get: () => {
                const _key = key;
                if (control._proxyFormState[_key] !== VALIDATION_MODE.all) {
                    control._proxyFormState[_key] = !isRoot || VALIDATION_MODE.all;
                }
                localProxyFormState && (localProxyFormState[_key] = true);
                return formState[_key];
            },
        });
    }
    return result;
};

var isEmptyObject = (value) => isObject(value) && !Object.keys(value).length;

var shouldRenderFormState = (formStateData, _proxyFormState, isRoot) => {
    const { name, ...formState } = formStateData;
    return (isEmptyObject(formState) ||
        Object.keys(formState).length >= Object.keys(_proxyFormState).length ||
        Object.keys(formState).find((key) => _proxyFormState[key] ===
            (!isRoot || VALIDATION_MODE.all)));
};

var convertToArrayPayload = (value) => (Array.isArray(value) ? value : [value]);

var shouldSubscribeByName = (name, signalName, exact) => exact && signalName
    ? name === signalName
    : !name ||
        !signalName ||
        name === signalName ||
        convertToArrayPayload(name).some((currentName) => currentName &&
            (currentName.startsWith(signalName) ||
                signalName.startsWith(currentName)));

function useSubscribe(props) {
    const _props = React.useRef(props);
    _props.current = props;
    React.useEffect(() => {
        const subscription = !props.disabled &&
            _props.current.subject.subscribe({
                next: _props.current.callback,
            });
        return () => {
            subscription && subscription.unsubscribe();
        };
    }, [props.disabled]);
}

/**
 * This custom hook allows you to subscribe to each form state, and isolate the re-render at the custom hook level. It has its scope in terms of form state subscription, so it would not affect other useFormState and useForm. Using this hook can reduce the re-render impact on large and complex form application.
 *
 * @remarks
 * [API](https://react-hook-form.com/api/useformstate) • [Demo](https://codesandbox.io/s/useformstate-75xly)
 *
 * @param props - include options on specify fields to subscribe. {@link UseFormStateReturn}
 *
 * @example
 * ```tsx
 * function App() {
 *   const { register, handleSubmit, control } = useForm({
 *     defaultValues: {
 *     firstName: "firstName"
 *   }});
 *   const { dirtyFields } = useFormState({
 *     control
 *   });
 *   const onSubmit = (data) => console.log(data);
 *
 *   return (
 *     <form onSubmit={handleSubmit(onSubmit)}>
 *       <input {...register("firstName")} placeholder="First Name" />
 *       {dirtyFields.firstName && <p>Field is dirty.</p>}
 *       <input type="submit" />
 *     </form>
 *   );
 * }
 * ```
 */
function useFormState(props) {
    const methods = useFormContext();
    const { control = methods.control, disabled, name, exact } = props || {};
    const [formState, updateFormState] = React.useState(control._formState);
    const _mounted = React.useRef(true);
    const _localProxyFormState = React.useRef({
        isDirty: false,
        dirtyFields: false,
        touchedFields: false,
        isValidating: false,
        isValid: false,
        errors: false,
    });
    const _name = React.useRef(name);
    _name.current = name;
    useSubscribe({
        disabled,
        callback: React.useCallback((value) => _mounted.current &&
            shouldSubscribeByName(_name.current, value.name, exact) &&
            shouldRenderFormState(value, _localProxyFormState.current) &&
            updateFormState({
                ...control._formState,
                ...value,
            }), [control, exact]),
        subject: control._subjects.state,
    });
    React.useEffect(() => {
        _mounted.current = true;
        return () => {
            _mounted.current = false;
        };
    }, []);
    return getProxyFormState(formState, control, _localProxyFormState.current, false);
}

var isString = (value) => typeof value === 'string';

var generateWatchOutput = (names, _names, formValues, isGlobal) => {
    const isArray = Array.isArray(names);
    if (isString(names)) {
        isGlobal && _names.watch.add(names);
        return get(formValues, names);
    }
    if (isArray) {
        return names.map((fieldName) => (isGlobal && _names.watch.add(fieldName),
            get(formValues, fieldName)));
    }
    isGlobal && (_names.watchAll = true);
    return formValues;
};

var isFunction = (value) => typeof value === 'function';

var objectHasFunction = (data) => {
    for (const key in data) {
        if (isFunction(data[key])) {
            return true;
        }
    }
    return false;
};

/**
 * Custom hook to subscribe to field change and isolate re-rendering at the component level.
 *
 * @remarks
 *
 * [API](https://react-hook-form.com/api/usewatch) • [Demo](https://codesandbox.io/s/react-hook-form-v7-ts-usewatch-h9i5e)
 *
 * @example
 * ```tsx
 * const { watch } = useForm();
 * const values = useWatch({
 *   name: "fieldName"
 *   control,
 * })
 * ```
 */
function useWatch(props) {
    const methods = useFormContext();
    const { control = methods.control, name, defaultValue, disabled, exact, } = props || {};
    const _name = React.useRef(name);
    _name.current = name;
    useSubscribe({
        disabled,
        subject: control._subjects.watch,
        callback: React.useCallback((formState) => {
            if (shouldSubscribeByName(_name.current, formState.name, exact)) {
                const fieldValues = generateWatchOutput(_name.current, control._names, formState.values || control._formValues);
                updateValue(isUndefined(_name.current) ||
                    (isObject(fieldValues) && !objectHasFunction(fieldValues))
                    ? { ...fieldValues }
                    : Array.isArray(fieldValues)
                        ? [...fieldValues]
                        : isUndefined(fieldValues)
                            ? defaultValue
                            : fieldValues);
            }
        }, [control, exact, defaultValue]),
    });
    const [value, updateValue] = React.useState(isUndefined(defaultValue)
        ? control._getWatch(name)
        : defaultValue);
    React.useEffect(() => control._removeUnmounted());
    return value;
}

/**
 * Custom hook to work with controlled component, this function provide you with both form and field level state. Re-render is isolated at the hook level.
 *
 * @remarks
 * [API](https://react-hook-form.com/api/usecontroller) • [Demo](https://codesandbox.io/s/usecontroller-0o8px)
 *
 * @param props - the path name to the form field value, and validation rules.
 *
 * @returns field properties, field and form state. {@link UseControllerReturn}
 *
 * @example
 * ```tsx
 * function Input(props) {
 *   const { field, fieldState, formState } = useController(props);
 *   return (
 *     <div>
 *       <input {...field} placeholder={props.name} />
 *       <p>{fieldState.isTouched && "Touched"}</p>
 *       <p>{formState.isSubmitted ? "submitted" : ""}</p>
 *     </div>
 *   );
 * }
 * ```
 */
function useController(props) {
    const methods = useFormContext();
    const { name, control = methods.control, shouldUnregister } = props;
    const isArrayField = isNameInFieldArray(control._names.array, name);
    const value = useWatch({
        control,
        name,
        defaultValue: get(control._formValues, name, get(control._defaultValues, name, props.defaultValue)),
        exact: true,
    });
    const formState = useFormState({
        control,
        name,
    });
    const _registerProps = React.useRef(control.register(name, {
        ...props.rules,
        value,
    }));
    React.useEffect(() => {
        const updateMounted = (name, value) => {
            const field = get(control._fields, name);
            if (field) {
                field._f.mount = value;
            }
        };
        updateMounted(name, true);
        return () => {
            const _shouldUnregisterField = control._options.shouldUnregister || shouldUnregister;
            (isArrayField
                ? _shouldUnregisterField && !control._stateFlags.action
                : _shouldUnregisterField)
                ? control.unregister(name)
                : updateMounted(name, false);
        };
    }, [name, control, isArrayField, shouldUnregister]);
    return {
        field: {
            name,
            value,
            onChange: React.useCallback((event) => _registerProps.current.onChange({
                target: {
                    value: getEventValue(event),
                    name: name,
                },
                type: EVENTS.CHANGE,
            }), [name]),
            onBlur: React.useCallback(() => _registerProps.current.onBlur({
                target: {
                    value: get(control._formValues, name),
                    name: name,
                },
                type: EVENTS.BLUR,
            }), [name, control]),
            ref: (elm) => {
                const field = get(control._fields, name);
                if (field && elm) {
                    field._f.ref = {
                        focus: () => elm.focus(),
                        select: () => elm.select(),
                        setCustomValidity: (message) => elm.setCustomValidity(message),
                        reportValidity: () => elm.reportValidity(),
                    };
                }
            },
        },
        formState,
        fieldState: Object.defineProperties({}, {
            invalid: {
                enumerable: true,
                get: () => !!get(formState.errors, name),
            },
            isDirty: {
                enumerable: true,
                get: () => !!get(formState.dirtyFields, name),
            },
            isTouched: {
                enumerable: true,
                get: () => !!get(formState.touchedFields, name),
            },
            error: {
                enumerable: true,
                get: () => get(formState.errors, name),
            },
        }),
    };
}

/**
 * Component based on `useController` hook to work with controlled component.
 *
 * @remarks
 * [API](https://react-hook-form.com/api/usecontroller/controller) • [Demo](https://codesandbox.io/s/react-hook-form-v6-controller-ts-jwyzw) • [Video](https://www.youtube.com/watch?v=N2UNk_UCVyA)
 *
 * @param props - the path name to the form field value, and validation rules.
 *
 * @returns provide field handler functions, field and form state.
 *
 * @example
 * ```tsx
 * function App() {
 *   const { control } = useForm<FormValues>({
 *     defaultValues: {
 *       test: ""
 *     }
 *   });
 *
 *   return (
 *     <form>
 *       <Controller
 *         control={control}
 *         name="test"
 *         render={({ field: { onChange, onBlur, value, ref }, formState, fieldState }) => (
 *           <>
 *             <input
 *               onChange={onChange} // send value to hook form
 *               onBlur={onBlur} // notify when input is touched
 *               value={value} // return updated value
 *               ref={ref} // set ref for focus management
 *             />
 *             <p>{formState.isSubmitted ? "submitted" : ""}</p>
 *             <p>{fieldState.isTouched ? "touched" : ""}</p>
 *           </>
 *         )}
 *       />
 *     </form>
 *   );
 * }
 * ```
 */
const Controller = (props) => props.render(useController(props));

var appendErrors = (name, validateAllFieldCriteria, errors, type, message) => validateAllFieldCriteria
    ? {
        ...errors[name],
        types: {
            ...(errors[name] && errors[name].types ? errors[name].types : {}),
            [type]: message || true,
        },
    }
    : {};

var isKey = (value) => /^\w*$/.test(value);

var stringToPath = (input) => compact(input.replace(/["|']|\]/g, '').split(/\.|\[/));

function set(object, path, value) {
    let index = -1;
    const tempPath = isKey(path) ? [path] : stringToPath(path);
    const length = tempPath.length;
    const lastIndex = length - 1;
    while (++index < length) {
        const key = tempPath[index];
        let newValue = value;
        if (index !== lastIndex) {
            const objValue = object[key];
            newValue =
                isObject(objValue) || Array.isArray(objValue)
                    ? objValue
                    : !isNaN(+tempPath[index + 1])
                        ? []
                        : {};
        }
        object[key] = newValue;
        object = object[key];
    }
    return object;
}

const focusFieldBy = (fields, callback, fieldsNames) => {
    for (const key of fieldsNames || Object.keys(fields)) {
        const field = get(fields, key);
        if (field) {
            const { _f, ...currentField } = field;
            if (_f && callback(_f.name)) {
                if (_f.ref.focus) {
                    _f.ref.focus();
                    break;
                }
                else if (_f.refs && _f.refs[0].focus) {
                    _f.refs[0].focus();
                    break;
                }
            }
            else if (isObject(currentField)) {
                focusFieldBy(currentField, callback);
            }
        }
    }
};

var generateId = () => {
    const d = typeof performance === 'undefined' ? Date.now() : performance.now() * 1000;
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
        const r = (Math.random() * 16 + d) % 16 | 0;
        return (c == 'x' ? r : (r & 0x3) | 0x8).toString(16);
    });
};

var getFocusFieldName = (name, index, options = {}) => options.shouldFocus || isUndefined(options.shouldFocus)
    ? options.focusName ||
        `${name}.${isUndefined(options.focusIndex) ? index : options.focusIndex}.`
    : '';

var isWatched = (name, _names, isBlurEvent) => !isBlurEvent &&
    (_names.watchAll ||
        _names.watch.has(name) ||
        [..._names.watch].some((watchName) => name.startsWith(watchName) &&
            /^\.\w+/.test(name.slice(watchName.length))));

var updateFieldArrayRootError = (errors, error, name) => {
    const fieldArrayErrors = compact(get(errors, name));
    set(fieldArrayErrors, 'root', error[name]);
    set(errors, name, fieldArrayErrors);
    return errors;
};

var isBoolean = (value) => typeof value === 'boolean';

var isFileInput = (element) => element.type === 'file';

var isMessage = (value) => isString(value) || React.isValidElement(value);

var isRadioInput = (element) => element.type === 'radio';

var isRegex = (value) => value instanceof RegExp;

const defaultResult = {
    value: false,
    isValid: false,
};
const validResult = { value: true, isValid: true };
var getCheckboxValue = (options) => {
    if (Array.isArray(options)) {
        if (options.length > 1) {
            const values = options
                .filter((option) => option && option.checked && !option.disabled)
                .map((option) => option.value);
            return { value: values, isValid: !!values.length };
        }
        return options[0].checked && !options[0].disabled
            ? // @ts-expect-error expected to work in the browser
                options[0].attributes && !isUndefined(options[0].attributes.value)
                    ? isUndefined(options[0].value) || options[0].value === ''
                        ? validResult
                        : { value: options[0].value, isValid: true }
                    : validResult
            : defaultResult;
    }
    return defaultResult;
};

const defaultReturn = {
    isValid: false,
    value: null,
};
var getRadioValue = (options) => Array.isArray(options)
    ? options.reduce((previous, option) => option && option.checked && !option.disabled
        ? {
            isValid: true,
            value: option.value,
        }
        : previous, defaultReturn)
    : defaultReturn;

function getValidateError(result, ref, type = 'validate') {
    if (isMessage(result) ||
        (Array.isArray(result) && result.every(isMessage)) ||
        (isBoolean(result) && !result)) {
        return {
            type,
            message: isMessage(result) ? result : '',
            ref,
        };
    }
}

var getValueAndMessage = (validationData) => isObject(validationData) && !isRegex(validationData)
    ? validationData
    : {
        value: validationData,
        message: '',
    };

var validateField = async (field, inputValue, validateAllFieldCriteria, shouldUseNativeValidation, isFieldArray) => {
    const { ref, refs, required, maxLength, minLength, min, max, pattern, validate, name, valueAsNumber, mount, disabled, } = field._f;
    if (!mount || disabled) {
        return {};
    }
    const inputRef = refs ? refs[0] : ref;
    const setCustomValidity = (message) => {
        if (shouldUseNativeValidation && inputRef.reportValidity) {
            inputRef.setCustomValidity(isBoolean(message) ? '' : message || ' ');
            inputRef.reportValidity();
        }
    };
    const error = {};
    const isRadio = isRadioInput(ref);
    const isCheckBox = isCheckBoxInput(ref);
    const isRadioOrCheckbox = isRadio || isCheckBox;
    const isEmpty = ((valueAsNumber || isFileInput(ref)) && !ref.value) ||
        inputValue === '' ||
        (Array.isArray(inputValue) && !inputValue.length);
    const appendErrorsCurry = appendErrors.bind(null, name, validateAllFieldCriteria, error);
    const getMinMaxMessage = (exceedMax, maxLengthMessage, minLengthMessage, maxType = INPUT_VALIDATION_RULES.maxLength, minType = INPUT_VALIDATION_RULES.minLength) => {
        const message = exceedMax ? maxLengthMessage : minLengthMessage;
        error[name] = {
            type: exceedMax ? maxType : minType,
            message,
            ref,
            ...appendErrorsCurry(exceedMax ? maxType : minType, message),
        };
    };
    if (isFieldArray
        ? !Array.isArray(inputValue) || !inputValue.length
        : required &&
            ((!isRadioOrCheckbox && (isEmpty || isNullOrUndefined(inputValue))) ||
                (isBoolean(inputValue) && !inputValue) ||
                (isCheckBox && !getCheckboxValue(refs).isValid) ||
                (isRadio && !getRadioValue(refs).isValid))) {
        const { value, message } = isMessage(required)
            ? { value: !!required, message: required }
            : getValueAndMessage(required);
        if (value) {
            error[name] = {
                type: INPUT_VALIDATION_RULES.required,
                message,
                ref: inputRef,
                ...appendErrorsCurry(INPUT_VALIDATION_RULES.required, message),
            };
            if (!validateAllFieldCriteria) {
                setCustomValidity(message);
                return error;
            }
        }
    }
    if (!isEmpty && (!isNullOrUndefined(min) || !isNullOrUndefined(max))) {
        let exceedMax;
        let exceedMin;
        const maxOutput = getValueAndMessage(max);
        const minOutput = getValueAndMessage(min);
        if (!isNullOrUndefined(inputValue) && !isNaN(inputValue)) {
            const valueNumber = ref.valueAsNumber ||
                (inputValue ? +inputValue : inputValue);
            if (!isNullOrUndefined(maxOutput.value)) {
                exceedMax = valueNumber > maxOutput.value;
            }
            if (!isNullOrUndefined(minOutput.value)) {
                exceedMin = valueNumber < minOutput.value;
            }
        }
        else {
            const valueDate = ref.valueAsDate || new Date(inputValue);
            const convertTimeToDate = (time) => new Date(new Date().toDateString() + ' ' + time);
            const isTime = ref.type == 'time';
            const isWeek = ref.type == 'week';
            if (isString(maxOutput.value) && inputValue) {
                exceedMax = isTime
                    ? convertTimeToDate(inputValue) > convertTimeToDate(maxOutput.value)
                    : isWeek
                        ? inputValue > maxOutput.value
                        : valueDate > new Date(maxOutput.value);
            }
            if (isString(minOutput.value) && inputValue) {
                exceedMin = isTime
                    ? convertTimeToDate(inputValue) < convertTimeToDate(minOutput.value)
                    : isWeek
                        ? inputValue < minOutput.value
                        : valueDate < new Date(minOutput.value);
            }
        }
        if (exceedMax || exceedMin) {
            getMinMaxMessage(!!exceedMax, maxOutput.message, minOutput.message, INPUT_VALIDATION_RULES.max, INPUT_VALIDATION_RULES.min);
            if (!validateAllFieldCriteria) {
                setCustomValidity(error[name].message);
                return error;
            }
        }
    }
    if ((maxLength || minLength) &&
        !isEmpty &&
        (isString(inputValue) || (isFieldArray && Array.isArray(inputValue)))) {
        const maxLengthOutput = getValueAndMessage(maxLength);
        const minLengthOutput = getValueAndMessage(minLength);
        const exceedMax = !isNullOrUndefined(maxLengthOutput.value) &&
            inputValue.length > maxLengthOutput.value;
        const exceedMin = !isNullOrUndefined(minLengthOutput.value) &&
            inputValue.length < minLengthOutput.value;
        if (exceedMax || exceedMin) {
            getMinMaxMessage(exceedMax, maxLengthOutput.message, minLengthOutput.message);
            if (!validateAllFieldCriteria) {
                setCustomValidity(error[name].message);
                return error;
            }
        }
    }
    if (pattern && !isEmpty && isString(inputValue)) {
        const { value: patternValue, message } = getValueAndMessage(pattern);
        if (isRegex(patternValue) && !inputValue.match(patternValue)) {
            error[name] = {
                type: INPUT_VALIDATION_RULES.pattern,
                message,
                ref,
                ...appendErrorsCurry(INPUT_VALIDATION_RULES.pattern, message),
            };
            if (!validateAllFieldCriteria) {
                setCustomValidity(message);
                return error;
            }
        }
    }
    if (validate) {
        if (isFunction(validate)) {
            const result = await validate(inputValue);
            const validateError = getValidateError(result, inputRef);
            if (validateError) {
                error[name] = {
                    ...validateError,
                    ...appendErrorsCurry(INPUT_VALIDATION_RULES.validate, validateError.message),
                };
                if (!validateAllFieldCriteria) {
                    setCustomValidity(validateError.message);
                    return error;
                }
            }
        }
        else if (isObject(validate)) {
            let validationResult = {};
            for (const key in validate) {
                if (!isEmptyObject(validationResult) && !validateAllFieldCriteria) {
                    break;
                }
                const validateError = getValidateError(await validate[key](inputValue), inputRef, key);
                if (validateError) {
                    validationResult = {
                        ...validateError,
                        ...appendErrorsCurry(key, validateError.message),
                    };
                    setCustomValidity(validateError.message);
                    if (validateAllFieldCriteria) {
                        error[name] = validationResult;
                    }
                }
            }
            if (!isEmptyObject(validationResult)) {
                error[name] = {
                    ref: inputRef,
                    ...validationResult,
                };
                if (!validateAllFieldCriteria) {
                    return error;
                }
            }
        }
    }
    setCustomValidity(true);
    return error;
};

function append(data, value) {
    return [...data, ...convertToArrayPayload(value)];
}

var isPlainObject = (tempObject) => {
    const prototypeCopy = tempObject.constructor && tempObject.constructor.prototype;
    return (isObject(prototypeCopy) && prototypeCopy.hasOwnProperty('isPrototypeOf'));
};

var isWeb = typeof window !== 'undefined' &&
    typeof window.HTMLElement !== 'undefined' &&
    typeof document !== 'undefined';

function cloneObject(data) {
    let copy;
    const isArray = Array.isArray(data);
    if (data instanceof Date) {
        copy = new Date(data);
    }
    else if (data instanceof Set) {
        copy = new Set(data);
    }
    else if (!(isWeb && (data instanceof Blob || data instanceof FileList)) &&
        (isArray || isObject(data))) {
        copy = isArray ? [] : {};
        if (!Array.isArray(data) && !isPlainObject(data)) {
            copy = data;
        }
        else {
            for (const key in data) {
                copy[key] = cloneObject(data[key]);
            }
        }
    }
    else {
        return data;
    }
    return copy;
}

var fillEmptyArray = (value) => Array.isArray(value) ? value.map(() => undefined) : undefined;

var getValidationModes = (mode) => ({
    isOnSubmit: !mode || mode === VALIDATION_MODE.onSubmit,
    isOnBlur: mode === VALIDATION_MODE.onBlur,
    isOnChange: mode === VALIDATION_MODE.onChange,
    isOnAll: mode === VALIDATION_MODE.all,
    isOnTouch: mode === VALIDATION_MODE.onTouched,
});

function insert(data, index, value) {
    return [
        ...data.slice(0, index),
        ...convertToArrayPayload(value),
        ...data.slice(index),
    ];
}

var moveArrayAt = (data, from, to) => {
    if (!Array.isArray(data)) {
        return [];
    }
    if (isUndefined(data[to])) {
        data[to] = undefined;
    }
    data.splice(to, 0, data.splice(from, 1)[0]);
    return data;
};

function prepend(data, value) {
    return [...convertToArrayPayload(value), ...convertToArrayPayload(data)];
}

function removeAtIndexes(data, indexes) {
    let i = 0;
    const temp = [...data];
    for (const index of indexes) {
        temp.splice(index - i, 1);
        i++;
    }
    return compact(temp).length ? temp : [];
}
var removeArrayAt = (data, index) => isUndefined(index)
    ? []
    : removeAtIndexes(data, convertToArrayPayload(index).sort((a, b) => a - b));

var swapArrayAt = (data, indexA, indexB) => {
    data[indexA] = [data[indexB], (data[indexB] = data[indexA])][0];
};

function baseGet(object, updatePath) {
    const length = updatePath.slice(0, -1).length;
    let index = 0;
    while (index < length) {
        object = isUndefined(object) ? index++ : object[updatePath[index++]];
    }
    return object;
}
function isEmptyArray(obj) {
    for (const key in obj) {
        if (!isUndefined(obj[key])) {
            return false;
        }
    }
    return true;
}
function unset(object, path) {
    const updatePath = isKey(path) ? [path] : stringToPath(path);
    const childObject = updatePath.length == 1 ? object : baseGet(object, updatePath);
    const key = updatePath[updatePath.length - 1];
    let previousObjRef;
    if (childObject) {
        delete childObject[key];
    }
    for (let k = 0; k < updatePath.slice(0, -1).length; k++) {
        let index = -1;
        let objectRef;
        const currentPaths = updatePath.slice(0, -(k + 1));
        const currentPathsLength = currentPaths.length - 1;
        if (k > 0) {
            previousObjRef = object;
        }
        while (++index < currentPaths.length) {
            const item = currentPaths[index];
            objectRef = objectRef ? objectRef[item] : object[item];
            if (currentPathsLength === index &&
                ((isObject(objectRef) && isEmptyObject(objectRef)) ||
                    (Array.isArray(objectRef) && isEmptyArray(objectRef)))) {
                previousObjRef ? delete previousObjRef[item] : delete object[item];
            }
            previousObjRef = objectRef;
        }
    }
    return object;
}

var updateAt = (fieldValues, index, value) => {
    fieldValues[index] = value;
    return fieldValues;
};

/**
 * A custom hook that exposes convenient methods to perform operations with a list of dynamic inputs that need to be appended, updated, removed etc. • [Demo](https://codesandbox.io/s/react-hook-form-usefieldarray-ssugn) • [Video](https://youtu.be/4MrbfGSFY2A)
 *
 * @remarks
 * [API](https://react-hook-form.com/api/usefieldarray) • [Demo](https://codesandbox.io/s/react-hook-form-usefieldarray-ssugn)
 *
 * @param props - useFieldArray props
 *
 * @returns methods - functions to manipulate with the Field Arrays (dynamic inputs) {@link UseFieldArrayReturn}
 *
 * @example
 * ```tsx
 * function App() {
 *   const { register, control, handleSubmit, reset, trigger, setError } = useForm({
 *     defaultValues: {
 *       test: []
 *     }
 *   });
 *   const { fields, append } = useFieldArray({
 *     control,
 *     name: "test"
 *   });
 *
 *   return (
 *     <form onSubmit={handleSubmit(data => console.log(data))}>
 *       {fields.map((item, index) => (
 *          <input key={item.id} {...register(`test.${index}.firstName`)}  />
 *       ))}
 *       <button type="button" onClick={() => append({ firstName: "bill" })}>
 *         append
 *       </button>
 *       <input type="submit" />
 *     </form>
 *   );
 * }
 * ```
 */
function useFieldArray(props) {
    const methods = useFormContext();
    const { control = methods.control, name, keyName = 'id', shouldUnregister, } = props;
    const [fields, setFields] = React.useState(control._getFieldArray(name));
    const ids = React.useRef(control._getFieldArray(name).map(generateId));
    const _fieldIds = React.useRef(fields);
    const _name = React.useRef(name);
    const _actioned = React.useRef(false);
    _name.current = name;
    _fieldIds.current = fields;
    control._names.array.add(name);
    props.rules &&
        control.register(name, props.rules);
    const callback = React.useCallback(({ values, name: fieldArrayName, }) => {
        if (fieldArrayName === _name.current || !fieldArrayName) {
            const fieldValues = get(values, _name.current);
            if (Array.isArray(fieldValues)) {
                setFields(fieldValues);
                ids.current = fieldValues.map(generateId);
            }
        }
    }, []);
    useSubscribe({
        callback,
        subject: control._subjects.array,
    });
    const updateValues = React.useCallback((updatedFieldArrayValues) => {
        _actioned.current = true;
        control._updateFieldArray(name, updatedFieldArrayValues);
    }, [control, name]);
    const append$1 = (value, options) => {
        const appendValue = convertToArrayPayload(cloneObject(value));
        const updatedFieldArrayValues = append(control._getFieldArray(name), appendValue);
        control._names.focus = getFocusFieldName(name, updatedFieldArrayValues.length - 1, options);
        ids.current = append(ids.current, appendValue.map(generateId));
        updateValues(updatedFieldArrayValues);
        setFields(updatedFieldArrayValues);
        control._updateFieldArray(name, updatedFieldArrayValues, append, {
            argA: fillEmptyArray(value),
        });
    };
    const prepend$1 = (value, options) => {
        const prependValue = convertToArrayPayload(cloneObject(value));
        const updatedFieldArrayValues = prepend(control._getFieldArray(name), prependValue);
        control._names.focus = getFocusFieldName(name, 0, options);
        ids.current = prepend(ids.current, prependValue.map(generateId));
        updateValues(updatedFieldArrayValues);
        setFields(updatedFieldArrayValues);
        control._updateFieldArray(name, updatedFieldArrayValues, prepend, {
            argA: fillEmptyArray(value),
        });
    };
    const remove = (index) => {
        const updatedFieldArrayValues = removeArrayAt(control._getFieldArray(name), index);
        ids.current = removeArrayAt(ids.current, index);
        updateValues(updatedFieldArrayValues);
        setFields(updatedFieldArrayValues);
        control._updateFieldArray(name, updatedFieldArrayValues, removeArrayAt, {
            argA: index,
        });
    };
    const insert$1 = (index, value, options) => {
        const insertValue = convertToArrayPayload(cloneObject(value));
        const updatedFieldArrayValues = insert(control._getFieldArray(name), index, insertValue);
        control._names.focus = getFocusFieldName(name, index, options);
        ids.current = insert(ids.current, index, insertValue.map(generateId));
        updateValues(updatedFieldArrayValues);
        setFields(updatedFieldArrayValues);
        control._updateFieldArray(name, updatedFieldArrayValues, insert, {
            argA: index,
            argB: fillEmptyArray(value),
        });
    };
    const swap = (indexA, indexB) => {
        const updatedFieldArrayValues = control._getFieldArray(name);
        swapArrayAt(updatedFieldArrayValues, indexA, indexB);
        swapArrayAt(ids.current, indexA, indexB);
        updateValues(updatedFieldArrayValues);
        setFields(updatedFieldArrayValues);
        control._updateFieldArray(name, updatedFieldArrayValues, swapArrayAt, {
            argA: indexA,
            argB: indexB,
        }, false);
    };
    const move = (from, to) => {
        const updatedFieldArrayValues = control._getFieldArray(name);
        moveArrayAt(updatedFieldArrayValues, from, to);
        moveArrayAt(ids.current, from, to);
        updateValues(updatedFieldArrayValues);
        setFields(updatedFieldArrayValues);
        control._updateFieldArray(name, updatedFieldArrayValues, moveArrayAt, {
            argA: from,
            argB: to,
        }, false);
    };
    const update = (index, value) => {
        const updateValue = cloneObject(value);
        const updatedFieldArrayValues = updateAt(control._getFieldArray(name), index, updateValue);
        ids.current = [...updatedFieldArrayValues].map((item, i) => !item || i === index ? generateId() : ids.current[i]);
        updateValues(updatedFieldArrayValues);
        setFields([...updatedFieldArrayValues]);
        control._updateFieldArray(name, updatedFieldArrayValues, updateAt, {
            argA: index,
            argB: updateValue,
        }, true, false);
    };
    const replace = (value) => {
        const updatedFieldArrayValues = convertToArrayPayload(cloneObject(value));
        ids.current = updatedFieldArrayValues.map(generateId);
        updateValues([...updatedFieldArrayValues]);
        setFields([...updatedFieldArrayValues]);
        control._updateFieldArray(name, [...updatedFieldArrayValues], (data) => data, {}, true, false);
    };
    React.useEffect(() => {
        control._stateFlags.action = false;
        isWatched(name, control._names) && control._subjects.state.next({});
        if (_actioned.current &&
            (!getValidationModes(control._options.mode).isOnSubmit ||
                control._formState.isSubmitted)) {
            if (control._options.resolver) {
                control._executeSchema([name]).then((result) => {
                    const error = get(result.errors, name);
                    const existingError = get(control._formState.errors, name);
                    if (existingError ? !error && existingError.type : error && error.type) {
                        error
                            ? set(control._formState.errors, name, error)
                            : unset(control._formState.errors, name);
                        control._subjects.state.next({
                            errors: control._formState.errors,
                        });
                    }
                });
            }
            else {
                const field = get(control._fields, name);
                if (field && field._f) {
                    validateField(field, get(control._formValues, name), control._options.criteriaMode === VALIDATION_MODE.all, control._options.shouldUseNativeValidation, true).then((error) => !isEmptyObject(error) &&
                        control._subjects.state.next({
                            errors: updateFieldArrayRootError(control._formState.errors, error, name),
                        }));
                }
            }
        }
        control._subjects.watch.next({
            name,
            values: control._formValues,
        });
        control._names.focus &&
            focusFieldBy(control._fields, (key) => !!key && key.startsWith(control._names.focus));
        control._names.focus = '';
        control._proxyFormState.isValid && control._updateValid();
    }, [fields, name, control]);
    React.useEffect(() => {
        !get(control._formValues, name) && control._updateFieldArray(name);
        return () => {
            (control._options.shouldUnregister || shouldUnregister) &&
                control.unregister(name);
        };
    }, [name, control, keyName, shouldUnregister]);
    return {
        swap: React.useCallback(swap, [updateValues, name, control]),
        move: React.useCallback(move, [updateValues, name, control]),
        prepend: React.useCallback(prepend$1, [updateValues, name, control]),
        append: React.useCallback(append$1, [updateValues, name, control]),
        remove: React.useCallback(remove, [updateValues, name, control]),
        insert: React.useCallback(insert$1, [updateValues, name, control]),
        update: React.useCallback(update, [updateValues, name, control]),
        replace: React.useCallback(replace, [updateValues, name, control]),
        fields: React.useMemo(() => fields.map((field, index) => ({
            ...field,
            [keyName]: ids.current[index] || generateId(),
        })), [fields, keyName]),
    };
}

function createSubject() {
    let _observers = [];
    const next = (value) => {
        for (const observer of _observers) {
            observer.next(value);
        }
    };
    const subscribe = (observer) => {
        _observers.push(observer);
        return {
            unsubscribe: () => {
                _observers = _observers.filter((o) => o !== observer);
            },
        };
    };
    const unsubscribe = () => {
        _observers = [];
    };
    return {
        get observers() {
            return _observers;
        },
        next,
        subscribe,
        unsubscribe,
    };
}

var isPrimitive = (value) => isNullOrUndefined(value) || !isObjectType(value);

function deepEqual(object1, object2) {
    if (isPrimitive(object1) || isPrimitive(object2)) {
        return object1 === object2;
    }
    if (isDateObject(object1) && isDateObject(object2)) {
        return object1.getTime() === object2.getTime();
    }
    const keys1 = Object.keys(object1);
    const keys2 = Object.keys(object2);
    if (keys1.length !== keys2.length) {
        return false;
    }
    for (const key of keys1) {
        const val1 = object1[key];
        if (!keys2.includes(key)) {
            return false;
        }
        if (key !== 'ref') {
            const val2 = object2[key];
            if ((isDateObject(val1) && isDateObject(val2)) ||
                (isObject(val1) && isObject(val2)) ||
                (Array.isArray(val1) && Array.isArray(val2))
                ? !deepEqual(val1, val2)
                : val1 !== val2) {
                return false;
            }
        }
    }
    return true;
}

var isHTMLElement = (value) => {
    const owner = value ? value.ownerDocument : 0;
    const ElementClass = owner && owner.defaultView ? owner.defaultView.HTMLElement : HTMLElement;
    return value instanceof ElementClass;
};

var isMultipleSelect = (element) => element.type === `select-multiple`;

var isRadioOrCheckbox = (ref) => isRadioInput(ref) || isCheckBoxInput(ref);

var live = (ref) => isHTMLElement(ref) && ref.isConnected;

function markFieldsDirty(data, fields = {}) {
    const isParentNodeArray = Array.isArray(data);
    if (isObject(data) || isParentNodeArray) {
        for (const key in data) {
            if (Array.isArray(data[key]) ||
                (isObject(data[key]) && !objectHasFunction(data[key]))) {
                fields[key] = Array.isArray(data[key]) ? [] : {};
                markFieldsDirty(data[key], fields[key]);
            }
            else if (!isNullOrUndefined(data[key])) {
                fields[key] = true;
            }
        }
    }
    return fields;
}
function getDirtyFieldsFromDefaultValues(data, formValues, dirtyFieldsFromValues) {
    const isParentNodeArray = Array.isArray(data);
    if (isObject(data) || isParentNodeArray) {
        for (const key in data) {
            if (Array.isArray(data[key]) ||
                (isObject(data[key]) && !objectHasFunction(data[key]))) {
                if (isUndefined(formValues) ||
                    isPrimitive(dirtyFieldsFromValues[key])) {
                    dirtyFieldsFromValues[key] = Array.isArray(data[key])
                        ? markFieldsDirty(data[key], [])
                        : { ...markFieldsDirty(data[key]) };
                }
                else {
                    getDirtyFieldsFromDefaultValues(data[key], isNullOrUndefined(formValues) ? {} : formValues[key], dirtyFieldsFromValues[key]);
                }
            }
            else {
                dirtyFieldsFromValues[key] = !deepEqual(data[key], formValues[key]);
            }
        }
    }
    return dirtyFieldsFromValues;
}
var getDirtyFields = (defaultValues, formValues) => getDirtyFieldsFromDefaultValues(defaultValues, formValues, markFieldsDirty(formValues));

var getFieldValueAs = (value, { valueAsNumber, valueAsDate, setValueAs }) => isUndefined(value)
    ? value
    : valueAsNumber
        ? value === ''
            ? NaN
            : value
                ? +value
                : value
        : valueAsDate && isString(value)
            ? new Date(value)
            : setValueAs
                ? setValueAs(value)
                : value;

function getFieldValue(_f) {
    const ref = _f.ref;
    if (_f.refs ? _f.refs.every((ref) => ref.disabled) : ref.disabled) {
        return;
    }
    if (isFileInput(ref)) {
        return ref.files;
    }
    if (isRadioInput(ref)) {
        return getRadioValue(_f.refs).value;
    }
    if (isMultipleSelect(ref)) {
        return [...ref.selectedOptions].map(({ value }) => value);
    }
    if (isCheckBoxInput(ref)) {
        return getCheckboxValue(_f.refs).value;
    }
    return getFieldValueAs(isUndefined(ref.value) ? _f.ref.value : ref.value, _f);
}

var getResolverOptions = (fieldsNames, _fields, criteriaMode, shouldUseNativeValidation) => {
    const fields = {};
    for (const name of fieldsNames) {
        const field = get(_fields, name);
        field && set(fields, name, field._f);
    }
    return {
        criteriaMode,
        names: [...fieldsNames],
        fields,
        shouldUseNativeValidation,
    };
};

var getRuleValue = (rule) => isUndefined(rule)
    ? undefined
    : isRegex(rule)
        ? rule.source
        : isObject(rule)
            ? isRegex(rule.value)
                ? rule.value.source
                : rule.value
            : rule;

var hasValidation = (options) => options.mount &&
    (options.required ||
        options.min ||
        options.max ||
        options.maxLength ||
        options.minLength ||
        options.pattern ||
        options.validate);

function schemaErrorLookup(errors, _fields, name) {
    const error = get(errors, name);
    if (error || isKey(name)) {
        return {
            error,
            name,
        };
    }
    const names = name.split('.');
    while (names.length) {
        const fieldName = names.join('.');
        const field = get(_fields, fieldName);
        const foundError = get(errors, fieldName);
        if (field && !Array.isArray(field) && name !== fieldName) {
            return { name };
        }
        if (foundError && foundError.type) {
            return {
                name: fieldName,
                error: foundError,
            };
        }
        names.pop();
    }
    return {
        name,
    };
}

var skipValidation = (isBlurEvent, isTouched, isSubmitted, reValidateMode, mode) => {
    if (mode.isOnAll) {
        return false;
    }
    else if (!isSubmitted && mode.isOnTouch) {
        return !(isTouched || isBlurEvent);
    }
    else if (isSubmitted ? reValidateMode.isOnBlur : mode.isOnBlur) {
        return !isBlurEvent;
    }
    else if (isSubmitted ? reValidateMode.isOnChange : mode.isOnChange) {
        return isBlurEvent;
    }
    return true;
};

var unsetEmptyArray = (ref, name) => !compact(get(ref, name)).length && unset(ref, name);

const defaultOptions = {
    mode: VALIDATION_MODE.onSubmit,
    reValidateMode: VALIDATION_MODE.onChange,
    shouldFocusError: true,
};
function createFormControl(props = {}) {
    let _options = {
        ...defaultOptions,
        ...props,
    };
    let _formState = {
        submitCount: 0,
        isDirty: false,
        isValidating: false,
        isSubmitted: false,
        isSubmitting: false,
        isSubmitSuccessful: false,
        isValid: false,
        touchedFields: {},
        dirtyFields: {},
        errors: {},
    };
    let _fields = {};
    let _defaultValues = cloneObject(_options.defaultValues) || {};
    let _formValues = _options.shouldUnregister
        ? {}
        : cloneObject(_defaultValues);
    let _stateFlags = {
        action: false,
        mount: false,
        watch: false,
    };
    let _names = {
        mount: new Set(),
        unMount: new Set(),
        array: new Set(),
        watch: new Set(),
    };
    let delayErrorCallback;
    let timer = 0;
    let validateFields = {};
    const _proxyFormState = {
        isDirty: false,
        dirtyFields: false,
        touchedFields: false,
        isValidating: false,
        isValid: false,
        errors: false,
    };
    const _subjects = {
        watch: createSubject(),
        array: createSubject(),
        state: createSubject(),
    };
    const validationModeBeforeSubmit = getValidationModes(_options.mode);
    const validationModeAfterSubmit = getValidationModes(_options.reValidateMode);
    const shouldDisplayAllAssociatedErrors = _options.criteriaMode === VALIDATION_MODE.all;
    const debounce = (callback) => (wait) => {
        clearTimeout(timer);
        timer = window.setTimeout(callback, wait);
    };
    const _updateValid = async (shouldSkipRender) => {
        let isValid = false;
        if (_proxyFormState.isValid) {
            isValid = _options.resolver
                ? isEmptyObject((await _executeSchema()).errors)
                : await executeBuiltInValidation(_fields, true);
            if (!shouldSkipRender && isValid !== _formState.isValid) {
                _formState.isValid = isValid;
                _subjects.state.next({
                    isValid,
                });
            }
        }
        return isValid;
    };
    const _updateFieldArray = (name, values = [], method, args, shouldSetValues = true, shouldUpdateFieldsAndState = true) => {
        if (args && method) {
            _stateFlags.action = true;
            if (shouldUpdateFieldsAndState && Array.isArray(get(_fields, name))) {
                const fieldValues = method(get(_fields, name), args.argA, args.argB);
                shouldSetValues && set(_fields, name, fieldValues);
            }
            if (_proxyFormState.errors &&
                shouldUpdateFieldsAndState &&
                Array.isArray(get(_formState.errors, name))) {
                const errors = method(get(_formState.errors, name), args.argA, args.argB);
                shouldSetValues && set(_formState.errors, name, errors);
                unsetEmptyArray(_formState.errors, name);
            }
            if (_proxyFormState.touchedFields &&
                shouldUpdateFieldsAndState &&
                Array.isArray(get(_formState.touchedFields, name))) {
                const touchedFields = method(get(_formState.touchedFields, name), args.argA, args.argB);
                shouldSetValues && set(_formState.touchedFields, name, touchedFields);
            }
            if (_proxyFormState.dirtyFields) {
                _formState.dirtyFields = getDirtyFields(_defaultValues, _formValues);
            }
            _subjects.state.next({
                isDirty: _getDirty(name, values),
                dirtyFields: _formState.dirtyFields,
                errors: _formState.errors,
                isValid: _formState.isValid,
            });
        }
        else {
            set(_formValues, name, values);
        }
    };
    const updateErrors = (name, error) => {
        set(_formState.errors, name, error);
        _subjects.state.next({
            errors: _formState.errors,
        });
    };
    const updateValidAndValue = (name, shouldSkipSetValueAs, value, ref) => {
        const field = get(_fields, name);
        if (field) {
            const defaultValue = get(_formValues, name, isUndefined(value) ? get(_defaultValues, name) : value);
            isUndefined(defaultValue) ||
                (ref && ref.defaultChecked) ||
                shouldSkipSetValueAs
                ? set(_formValues, name, shouldSkipSetValueAs ? defaultValue : getFieldValue(field._f))
                : setFieldValue(name, defaultValue);
            _stateFlags.mount && _updateValid();
        }
    };
    const updateTouchAndDirty = (name, fieldValue, isBlurEvent, shouldDirty, shouldRender) => {
        let isFieldDirty = false;
        const output = {
            name,
        };
        const isPreviousFieldTouched = get(_formState.touchedFields, name);
        if (_proxyFormState.isDirty) {
            const isPreviousFormDirty = _formState.isDirty;
            _formState.isDirty = output.isDirty = _getDirty();
            isFieldDirty = isPreviousFormDirty !== output.isDirty;
        }
        if (_proxyFormState.dirtyFields && (!isBlurEvent || shouldDirty)) {
            const isPreviousFieldDirty = get(_formState.dirtyFields, name);
            const isCurrentFieldPristine = deepEqual(get(_defaultValues, name), fieldValue);
            isCurrentFieldPristine
                ? unset(_formState.dirtyFields, name)
                : set(_formState.dirtyFields, name, true);
            output.dirtyFields = _formState.dirtyFields;
            isFieldDirty =
                isFieldDirty ||
                    isPreviousFieldDirty !== get(_formState.dirtyFields, name);
        }
        if (isBlurEvent && !isPreviousFieldTouched) {
            set(_formState.touchedFields, name, isBlurEvent);
            output.touchedFields = _formState.touchedFields;
            isFieldDirty =
                isFieldDirty ||
                    (_proxyFormState.touchedFields &&
                        isPreviousFieldTouched !== isBlurEvent);
        }
        isFieldDirty && shouldRender && _subjects.state.next(output);
        return isFieldDirty ? output : {};
    };
    const shouldRenderByError = async (name, isValid, error, fieldState) => {
        const previousFieldError = get(_formState.errors, name);
        const shouldUpdateValid = _proxyFormState.isValid && _formState.isValid !== isValid;
        if (props.delayError && error) {
            delayErrorCallback = debounce(() => updateErrors(name, error));
            delayErrorCallback(props.delayError);
        }
        else {
            clearTimeout(timer);
            delayErrorCallback = null;
            error
                ? set(_formState.errors, name, error)
                : unset(_formState.errors, name);
        }
        if ((error ? !deepEqual(previousFieldError, error) : previousFieldError) ||
            !isEmptyObject(fieldState) ||
            shouldUpdateValid) {
            const updatedFormState = {
                ...fieldState,
                ...(shouldUpdateValid ? { isValid } : {}),
                errors: _formState.errors,
                name,
            };
            _formState = {
                ..._formState,
                ...updatedFormState,
            };
            _subjects.state.next(updatedFormState);
        }
        validateFields[name]--;
        if (_proxyFormState.isValidating &&
            !Object.values(validateFields).some((v) => v)) {
            _subjects.state.next({
                isValidating: false,
            });
            validateFields = {};
        }
    };
    const _executeSchema = async (name) => _options.resolver
        ? await _options.resolver({ ..._formValues }, _options.context, getResolverOptions(name || _names.mount, _fields, _options.criteriaMode, _options.shouldUseNativeValidation))
        : {};
    const executeSchemaAndUpdateState = async (names) => {
        const { errors } = await _executeSchema();
        if (names) {
            for (const name of names) {
                const error = get(errors, name);
                error
                    ? set(_formState.errors, name, error)
                    : unset(_formState.errors, name);
            }
        }
        else {
            _formState.errors = errors;
        }
        return errors;
    };
    const executeBuiltInValidation = async (fields, shouldOnlyCheckValid, context = {
        valid: true,
    }) => {
        for (const name in fields) {
            const field = fields[name];
            if (field) {
                const { _f, ...fieldValue } = field;
                if (_f) {
                    const isFieldArrayRoot = _names.array.has(_f.name);
                    const fieldError = await validateField(field, get(_formValues, _f.name), shouldDisplayAllAssociatedErrors, _options.shouldUseNativeValidation, isFieldArrayRoot);
                    if (fieldError[_f.name]) {
                        context.valid = false;
                        if (shouldOnlyCheckValid) {
                            break;
                        }
                    }
                    !shouldOnlyCheckValid &&
                        (get(fieldError, _f.name)
                            ? isFieldArrayRoot
                                ? updateFieldArrayRootError(_formState.errors, fieldError, _f.name)
                                : set(_formState.errors, _f.name, fieldError[_f.name])
                            : unset(_formState.errors, _f.name));
                }
                fieldValue &&
                    (await executeBuiltInValidation(fieldValue, shouldOnlyCheckValid, context));
            }
        }
        return context.valid;
    };
    const _removeUnmounted = () => {
        for (const name of _names.unMount) {
            const field = get(_fields, name);
            field &&
                (field._f.refs
                    ? field._f.refs.every((ref) => !live(ref))
                    : !live(field._f.ref)) &&
                unregister(name);
        }
        _names.unMount = new Set();
    };
    const _getDirty = (name, data) => (name && data && set(_formValues, name, data),
        !deepEqual(getValues(), _defaultValues));
    const _getWatch = (names, defaultValue, isGlobal) => {
        const fieldValues = {
            ...(_stateFlags.mount
                ? _formValues
                : isUndefined(defaultValue)
                    ? _defaultValues
                    : isString(names)
                        ? { [names]: defaultValue }
                        : defaultValue),
        };
        return generateWatchOutput(names, _names, fieldValues, isGlobal);
    };
    const _getFieldArray = (name) => compact(get(_stateFlags.mount ? _formValues : _defaultValues, name, props.shouldUnregister ? get(_defaultValues, name, []) : []));
    const setFieldValue = (name, value, options = {}) => {
        const field = get(_fields, name);
        let fieldValue = value;
        if (field) {
            const fieldReference = field._f;
            if (fieldReference) {
                !fieldReference.disabled &&
                    set(_formValues, name, getFieldValueAs(value, fieldReference));
                fieldValue =
                    isWeb && isHTMLElement(fieldReference.ref) && isNullOrUndefined(value)
                        ? ''
                        : value;
                if (isMultipleSelect(fieldReference.ref)) {
                    [...fieldReference.ref.options].forEach((optionRef) => (optionRef.selected = fieldValue.includes(optionRef.value)));
                }
                else if (fieldReference.refs) {
                    if (isCheckBoxInput(fieldReference.ref)) {
                        fieldReference.refs.length > 1
                            ? fieldReference.refs.forEach((checkboxRef) => (!checkboxRef.defaultChecked || !checkboxRef.disabled) &&
                                (checkboxRef.checked = Array.isArray(fieldValue)
                                    ? !!fieldValue.find((data) => data === checkboxRef.value)
                                    : fieldValue === checkboxRef.value))
                            : fieldReference.refs[0] &&
                                (fieldReference.refs[0].checked = !!fieldValue);
                    }
                    else {
                        fieldReference.refs.forEach((radioRef) => (radioRef.checked = radioRef.value === fieldValue));
                    }
                }
                else if (isFileInput(fieldReference.ref)) {
                    fieldReference.ref.value = '';
                }
                else {
                    fieldReference.ref.value = fieldValue;
                    if (!fieldReference.ref.type) {
                        _subjects.watch.next({
                            name,
                        });
                    }
                }
            }
        }
        (options.shouldDirty || options.shouldTouch) &&
            updateTouchAndDirty(name, fieldValue, options.shouldTouch, options.shouldDirty, true);
        options.shouldValidate && trigger(name);
    };
    const setValues = (name, value, options) => {
        for (const fieldKey in value) {
            const fieldValue = value[fieldKey];
            const fieldName = `${name}.${fieldKey}`;
            const field = get(_fields, fieldName);
            (_names.array.has(name) ||
                !isPrimitive(fieldValue) ||
                (field && !field._f)) &&
                !isDateObject(fieldValue)
                ? setValues(fieldName, fieldValue, options)
                : setFieldValue(fieldName, fieldValue, options);
        }
    };
    const setValue = (name, value, options = {}) => {
        const field = get(_fields, name);
        const isFieldArray = _names.array.has(name);
        const cloneValue = cloneObject(value);
        set(_formValues, name, cloneValue);
        if (isFieldArray) {
            _subjects.array.next({
                name,
                values: _formValues,
            });
            if ((_proxyFormState.isDirty || _proxyFormState.dirtyFields) &&
                options.shouldDirty) {
                _formState.dirtyFields = getDirtyFields(_defaultValues, _formValues);
                _subjects.state.next({
                    name,
                    dirtyFields: _formState.dirtyFields,
                    isDirty: _getDirty(name, cloneValue),
                });
            }
        }
        else {
            field && !field._f && !isNullOrUndefined(cloneValue)
                ? setValues(name, cloneValue, options)
                : setFieldValue(name, cloneValue, options);
        }
        isWatched(name, _names) && _subjects.state.next({});
        _subjects.watch.next({
            name,
        });
    };
    const onChange = async (event) => {
        const target = event.target;
        let name = target.name;
        const field = get(_fields, name);
        if (field) {
            let error;
            let isValid;
            const fieldValue = target.type
                ? getFieldValue(field._f)
                : getEventValue(event);
            const isBlurEvent = event.type === EVENTS.BLUR || event.type === EVENTS.FOCUS_OUT;
            const shouldSkipValidation = (!hasValidation(field._f) &&
                !_options.resolver &&
                !get(_formState.errors, name) &&
                !field._f.deps) ||
                skipValidation(isBlurEvent, get(_formState.touchedFields, name), _formState.isSubmitted, validationModeAfterSubmit, validationModeBeforeSubmit);
            const watched = isWatched(name, _names, isBlurEvent);
            set(_formValues, name, fieldValue);
            if (isBlurEvent) {
                field._f.onBlur && field._f.onBlur(event);
                delayErrorCallback && delayErrorCallback(0);
            }
            else if (field._f.onChange) {
                field._f.onChange(event);
            }
            const fieldState = updateTouchAndDirty(name, fieldValue, isBlurEvent, false);
            const shouldRender = !isEmptyObject(fieldState) || watched;
            !isBlurEvent &&
                _subjects.watch.next({
                    name,
                    type: event.type,
                });
            if (shouldSkipValidation) {
                return (shouldRender &&
                    _subjects.state.next({ name, ...(watched ? {} : fieldState) }));
            }
            !isBlurEvent && watched && _subjects.state.next({});
            validateFields[name] = validateFields[name] ? +1 : 1;
            _subjects.state.next({
                isValidating: true,
            });
            if (_options.resolver) {
                const { errors } = await _executeSchema([name]);
                const previousErrorLookupResult = schemaErrorLookup(_formState.errors, _fields, name);
                const errorLookupResult = schemaErrorLookup(errors, _fields, previousErrorLookupResult.name || name);
                error = errorLookupResult.error;
                name = errorLookupResult.name;
                isValid = isEmptyObject(errors);
            }
            else {
                error = (await validateField(field, get(_formValues, name), shouldDisplayAllAssociatedErrors, _options.shouldUseNativeValidation))[name];
                isValid = await _updateValid(true);
            }
            field._f.deps &&
                trigger(field._f.deps);
            shouldRenderByError(name, isValid, error, fieldState);
        }
    };
    const trigger = async (name, options = {}) => {
        let isValid;
        let validationResult;
        const fieldNames = convertToArrayPayload(name);
        _subjects.state.next({
            isValidating: true,
        });
        if (_options.resolver) {
            const errors = await executeSchemaAndUpdateState(isUndefined(name) ? name : fieldNames);
            isValid = isEmptyObject(errors);
            validationResult = name
                ? !fieldNames.some((name) => get(errors, name))
                : isValid;
        }
        else if (name) {
            validationResult = (await Promise.all(fieldNames.map(async (fieldName) => {
                const field = get(_fields, fieldName);
                return await executeBuiltInValidation(field && field._f ? { [fieldName]: field } : field);
            }))).every(Boolean);
            !(!validationResult && !_formState.isValid) && _updateValid();
        }
        else {
            validationResult = isValid = await executeBuiltInValidation(_fields);
        }
        _subjects.state.next({
            ...(!isString(name) ||
                (_proxyFormState.isValid && isValid !== _formState.isValid)
                ? {}
                : { name }),
            ...(_options.resolver || !name ? { isValid } : {}),
            errors: _formState.errors,
            isValidating: false,
        });
        options.shouldFocus &&
            !validationResult &&
            focusFieldBy(_fields, (key) => key && get(_formState.errors, key), name ? fieldNames : _names.mount);
        return validationResult;
    };
    const getValues = (fieldNames) => {
        const values = {
            ..._defaultValues,
            ...(_stateFlags.mount ? _formValues : {}),
        };
        return isUndefined(fieldNames)
            ? values
            : isString(fieldNames)
                ? get(values, fieldNames)
                : fieldNames.map((name) => get(values, name));
    };
    const getFieldState = (name, formState) => ({
        invalid: !!get((formState || _formState).errors, name),
        isDirty: !!get((formState || _formState).dirtyFields, name),
        isTouched: !!get((formState || _formState).touchedFields, name),
        error: get((formState || _formState).errors, name),
    });
    const clearErrors = (name) => {
        name
            ? convertToArrayPayload(name).forEach((inputName) => unset(_formState.errors, inputName))
            : (_formState.errors = {});
        _subjects.state.next({
            errors: _formState.errors,
        });
    };
    const setError = (name, error, options) => {
        const ref = (get(_fields, name, { _f: {} })._f || {}).ref;
        set(_formState.errors, name, {
            ...error,
            ref,
        });
        _subjects.state.next({
            name,
            errors: _formState.errors,
            isValid: false,
        });
        options && options.shouldFocus && ref && ref.focus && ref.focus();
    };
    const watch = (name, defaultValue) => isFunction(name)
        ? _subjects.watch.subscribe({
            next: (info) => name(_getWatch(undefined, defaultValue), info),
        })
        : _getWatch(name, defaultValue, true);
    const unregister = (name, options = {}) => {
        for (const fieldName of name ? convertToArrayPayload(name) : _names.mount) {
            _names.mount.delete(fieldName);
            _names.array.delete(fieldName);
            if (get(_fields, fieldName)) {
                if (!options.keepValue) {
                    unset(_fields, fieldName);
                    unset(_formValues, fieldName);
                }
                !options.keepError && unset(_formState.errors, fieldName);
                !options.keepDirty && unset(_formState.dirtyFields, fieldName);
                !options.keepTouched && unset(_formState.touchedFields, fieldName);
                !_options.shouldUnregister &&
                    !options.keepDefaultValue &&
                    unset(_defaultValues, fieldName);
            }
        }
        _subjects.watch.next({});
        _subjects.state.next({
            ..._formState,
            ...(!options.keepDirty ? {} : { isDirty: _getDirty() }),
        });
        !options.keepIsValid && _updateValid();
    };
    const register = (name, options = {}) => {
        let field = get(_fields, name);
        const disabledIsDefined = isBoolean(options.disabled);
        set(_fields, name, {
            ...(field || {}),
            _f: {
                ...(field && field._f ? field._f : { ref: { name } }),
                name,
                mount: true,
                ...options,
            },
        });
        _names.mount.add(name);
        field
            ? disabledIsDefined &&
                set(_formValues, name, options.disabled
                    ? undefined
                    : get(_formValues, name, getFieldValue(field._f)))
            : updateValidAndValue(name, true, options.value);
        return {
            ...(disabledIsDefined ? { disabled: options.disabled } : {}),
            ...(_options.shouldUseNativeValidation
                ? {
                    required: !!options.required,
                    min: getRuleValue(options.min),
                    max: getRuleValue(options.max),
                    minLength: getRuleValue(options.minLength),
                    maxLength: getRuleValue(options.maxLength),
                    pattern: getRuleValue(options.pattern),
                }
                : {}),
            name,
            onChange,
            onBlur: onChange,
            ref: (ref) => {
                if (ref) {
                    register(name, options);
                    field = get(_fields, name);
                    const fieldRef = isUndefined(ref.value)
                        ? ref.querySelectorAll
                            ? ref.querySelectorAll('input,select,textarea')[0] || ref
                            : ref
                        : ref;
                    const radioOrCheckbox = isRadioOrCheckbox(fieldRef);
                    const refs = field._f.refs || [];
                    if (radioOrCheckbox
                        ? refs.find((option) => option === fieldRef)
                        : fieldRef === field._f.ref) {
                        return;
                    }
                    set(_fields, name, {
                        _f: {
                            ...field._f,
                            ...(radioOrCheckbox
                                ? {
                                    refs: [
                                        ...refs.filter(live),
                                        fieldRef,
                                        ...(!!Array.isArray(get(_defaultValues, name))
                                            ? [{}]
                                            : []),
                                    ],
                                    ref: { type: fieldRef.type, name },
                                }
                                : { ref: fieldRef }),
                        },
                    });
                    updateValidAndValue(name, false, undefined, fieldRef);
                }
                else {
                    field = get(_fields, name, {});
                    if (field._f) {
                        field._f.mount = false;
                    }
                    (_options.shouldUnregister || options.shouldUnregister) &&
                        !(isNameInFieldArray(_names.array, name) && _stateFlags.action) &&
                        _names.unMount.add(name);
                }
            },
        };
    };
    const _focusError = () => _options.shouldFocusError &&
        focusFieldBy(_fields, (key) => key && get(_formState.errors, key), _names.mount);
    const handleSubmit = (onValid, onInvalid) => async (e) => {
        if (e) {
            e.preventDefault && e.preventDefault();
            e.persist && e.persist();
        }
        let hasNoPromiseError = true;
        let fieldValues = cloneObject(_formValues);
        _subjects.state.next({
            isSubmitting: true,
        });
        try {
            if (_options.resolver) {
                const { errors, values } = await _executeSchema();
                _formState.errors = errors;
                fieldValues = values;
            }
            else {
                await executeBuiltInValidation(_fields);
            }
            if (isEmptyObject(_formState.errors)) {
                _subjects.state.next({
                    errors: {},
                    isSubmitting: true,
                });
                await onValid(fieldValues, e);
            }
            else {
                if (onInvalid) {
                    await onInvalid({ ..._formState.errors }, e);
                }
                _focusError();
            }
        }
        catch (err) {
            hasNoPromiseError = false;
            throw err;
        }
        finally {
            _formState.isSubmitted = true;
            _subjects.state.next({
                isSubmitted: true,
                isSubmitting: false,
                isSubmitSuccessful: isEmptyObject(_formState.errors) && hasNoPromiseError,
                submitCount: _formState.submitCount + 1,
                errors: _formState.errors,
            });
        }
    };
    const resetField = (name, options = {}) => {
        if (get(_fields, name)) {
            if (isUndefined(options.defaultValue)) {
                setValue(name, get(_defaultValues, name));
            }
            else {
                setValue(name, options.defaultValue);
                set(_defaultValues, name, options.defaultValue);
            }
            if (!options.keepTouched) {
                unset(_formState.touchedFields, name);
            }
            if (!options.keepDirty) {
                unset(_formState.dirtyFields, name);
                _formState.isDirty = options.defaultValue
                    ? _getDirty(name, get(_defaultValues, name))
                    : _getDirty();
            }
            if (!options.keepError) {
                unset(_formState.errors, name);
                _proxyFormState.isValid && _updateValid();
            }
            _subjects.state.next({ ..._formState });
        }
    };
    const _reset = (formValues, keepStateOptions = {}) => {
        const updatedValues = formValues || _defaultValues;
        const cloneUpdatedValues = cloneObject(updatedValues);
        const values = formValues && !isEmptyObject(formValues)
            ? cloneUpdatedValues
            : _defaultValues;
        if (!keepStateOptions.keepDefaultValues) {
            _defaultValues = updatedValues;
        }
        if (!keepStateOptions.keepValues) {
            if (keepStateOptions.keepDirtyValues) {
                for (const fieldName of _names.mount) {
                    get(_formState.dirtyFields, fieldName)
                        ? set(values, fieldName, get(_formValues, fieldName))
                        : setValue(fieldName, get(values, fieldName));
                }
            }
            else {
                if (isWeb && isUndefined(formValues)) {
                    for (const name of _names.mount) {
                        const field = get(_fields, name);
                        if (field && field._f) {
                            const fieldReference = Array.isArray(field._f.refs)
                                ? field._f.refs[0]
                                : field._f.ref;
                            try {
                                if (isHTMLElement(fieldReference)) {
                                    fieldReference.closest('form').reset();
                                    break;
                                }
                            }
                            catch (_a) { }
                        }
                    }
                }
                _fields = {};
            }
            _formValues = props.shouldUnregister
                ? keepStateOptions.keepDefaultValues
                    ? cloneObject(_defaultValues)
                    : {}
                : cloneUpdatedValues;
            _subjects.array.next({
                values,
            });
            _subjects.watch.next({
                values,
            });
        }
        _names = {
            mount: new Set(),
            unMount: new Set(),
            array: new Set(),
            watch: new Set(),
            watchAll: false,
            focus: '',
        };
        _stateFlags.mount =
            !_proxyFormState.isValid || !!keepStateOptions.keepIsValid;
        _stateFlags.watch = !!props.shouldUnregister;
        _subjects.state.next({
            submitCount: keepStateOptions.keepSubmitCount
                ? _formState.submitCount
                : 0,
            isDirty: keepStateOptions.keepDirty || keepStateOptions.keepDirtyValues
                ? _formState.isDirty
                : !!(keepStateOptions.keepDefaultValues &&
                    !deepEqual(formValues, _defaultValues)),
            isSubmitted: keepStateOptions.keepIsSubmitted
                ? _formState.isSubmitted
                : false,
            dirtyFields: keepStateOptions.keepDirty || keepStateOptions.keepDirtyValues
                ? _formState.dirtyFields
                : keepStateOptions.keepDefaultValues && formValues
                    ? getDirtyFields(_defaultValues, formValues)
                    : {},
            touchedFields: keepStateOptions.keepTouched
                ? _formState.touchedFields
                : {},
            errors: keepStateOptions.keepErrors ? _formState.errors : {},
            isSubmitting: false,
            isSubmitSuccessful: false,
        });
    };
    const reset = (formValues, keepStateOptions) => _reset(isFunction(formValues)
        ? formValues(_formValues)
        : formValues, keepStateOptions);
    const setFocus = (name, options = {}) => {
        const field = get(_fields, name);
        const fieldReference = field && field._f;
        if (fieldReference) {
            const fieldRef = fieldReference.refs
                ? fieldReference.refs[0]
                : fieldReference.ref;
            if (fieldRef.focus) {
                fieldRef.focus();
                options.shouldSelect && fieldRef.select();
            }
        }
    };
    return {
        control: {
            register,
            unregister,
            getFieldState,
            _executeSchema,
            _focusError,
            _getWatch,
            _getDirty,
            _updateValid,
            _removeUnmounted,
            _updateFieldArray,
            _getFieldArray,
            _subjects,
            _proxyFormState,
            get _fields() {
                return _fields;
            },
            get _formValues() {
                return _formValues;
            },
            get _stateFlags() {
                return _stateFlags;
            },
            set _stateFlags(value) {
                _stateFlags = value;
            },
            get _defaultValues() {
                return _defaultValues;
            },
            get _names() {
                return _names;
            },
            set _names(value) {
                _names = value;
            },
            get _formState() {
                return _formState;
            },
            set _formState(value) {
                _formState = value;
            },
            get _options() {
                return _options;
            },
            set _options(value) {
                _options = {
                    ..._options,
                    ...value,
                };
            },
        },
        trigger,
        register,
        handleSubmit,
        watch,
        setValue,
        getValues,
        reset,
        resetField,
        clearErrors,
        unregister,
        setError,
        setFocus,
        getFieldState,
    };
}

/**
 * Custom hook to manage the entire form.
 *
 * @remarks
 * [API](https://react-hook-form.com/api/useform) • [Demo](https://codesandbox.io/s/react-hook-form-get-started-ts-5ksmm) • [Video](https://www.youtube.com/watch?v=RkXv4AXXC_4)
 *
 * @param props - form configuration and validation parameters.
 *
 * @returns methods - individual functions to manage the form state. {@link UseFormReturn}
 *
 * @example
 * ```tsx
 * function App() {
 *   const { register, handleSubmit, watch, formState: { errors } } = useForm();
 *   const onSubmit = data => console.log(data);
 *
 *   console.log(watch("example"));
 *
 *   return (
 *     <form onSubmit={handleSubmit(onSubmit)}>
 *       <input defaultValue="test" {...register("example")} />
 *       <input {...register("exampleRequired", { required: true })} />
 *       {errors.exampleRequired && <span>This field is required</span>}
 *       <input type="submit" />
 *     </form>
 *   );
 * }
 * ```
 */
function useForm(props = {}) {
    const _formControl = React.useRef();
    const [formState, updateFormState] = React.useState({
        isDirty: false,
        isValidating: false,
        isSubmitted: false,
        isSubmitting: false,
        isSubmitSuccessful: false,
        isValid: false,
        submitCount: 0,
        dirtyFields: {},
        touchedFields: {},
        errors: {},
        defaultValues: props.defaultValues,
    });
    if (!_formControl.current) {
        _formControl.current = {
            ...createFormControl(props),
            formState,
        };
    }
    const control = _formControl.current.control;
    control._options = props;
    useSubscribe({
        subject: control._subjects.state,
        callback: React.useCallback((value) => {
            if (shouldRenderFormState(value, control._proxyFormState, true)) {
                control._formState = {
                    ...control._formState,
                    ...value,
                };
                updateFormState({ ...control._formState });
            }
        }, [control]),
    });
    React.useEffect(() => {
        if (!control._stateFlags.mount) {
            control._proxyFormState.isValid && control._updateValid();
            control._stateFlags.mount = true;
        }
        if (control._stateFlags.watch) {
            control._stateFlags.watch = false;
            control._subjects.state.next({});
        }
        control._removeUnmounted();
    });
    React.useEffect(() => {
        formState.submitCount && control._focusError();
    }, [control, formState.submitCount]);
    _formControl.current.formState = getProxyFormState(formState, control);
    return _formControl.current;
}

export { Controller, FormProvider, appendErrors, get, set, useController, useFieldArray, useForm, useFormContext, useFormState, useWatch };
//# sourceMappingURL=index.esm.mjs.map
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react")):"function"==typeof define&&define.amd?define(["exports","react"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).ReactHookForm={},e.React)}(this,(function(e,t){"use strict";function r(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var s=r(t),a=e=>"checkbox"===e.type,n=e=>e instanceof Date,i=e=>null==e;const o=e=>"object"==typeof e;var u=e=>!i(e)&&!Array.isArray(e)&&o(e)&&!n(e),l=e=>u(e)&&e.target?a(e.target)?e.target.checked:e.target.value:e,c=(e,t)=>e.has((e=>e.substring(0,e.search(/\.\d+(\.|$)/))||e)(t)),d=e=>Array.isArray(e)?e.filter(Boolean):[],f=e=>void 0===e,m=(e,t,r)=>{if(!t||!u(e))return r;const s=d(t.split(/[,[\].]+?/)).reduce((e,t)=>i(e)?e:e[t],e);return f(s)||s===e?f(e[t])?r:e[t]:s};const y="blur",g="focusout",h="change",p="onBlur",_="onChange",v="onSubmit",b="onTouched",A="all",x="max",F="min",V="maxLength",w="minLength",S="pattern",k="required",D="validate",C=s.default.createContext(null),j=()=>s.default.useContext(C);var E=(e,t,r,s=!0)=>{const a={defaultValues:t._defaultValues};for(const n in e)Object.defineProperty(a,n,{get:()=>{const a=n;return t._proxyFormState[a]!==A&&(t._proxyFormState[a]=!s||A),r&&(r[a]=!0),e[a]}});return a},O=e=>u(e)&&!Object.keys(e).length,T=(e,t,r)=>{const{name:s,...a}=e;return O(a)||Object.keys(a).length>=Object.keys(t).length||Object.keys(a).find(e=>t[e]===(!r||A))},U=e=>Array.isArray(e)?e:[e],B=(e,t,r)=>r&&t?e===t:!e||!t||e===t||U(e).some(e=>e&&(e.startsWith(t)||t.startsWith(e)));function M(e){const t=s.default.useRef(e);t.current=e,s.default.useEffect(()=>{const r=!e.disabled&&t.current.subject.subscribe({next:t.current.callback});return()=>{r&&r.unsubscribe()}},[e.disabled])}function N(e){const t=j(),{control:r=t.control,disabled:a,name:n,exact:i}=e||{},[o,u]=s.default.useState(r._formState),l=s.default.useRef(!0),c=s.default.useRef({isDirty:!1,dirtyFields:!1,touchedFields:!1,isValidating:!1,isValid:!1,errors:!1}),d=s.default.useRef(n);return d.current=n,M({disabled:a,callback:s.default.useCallback(e=>l.current&&B(d.current,e.name,i)&&T(e,c.current)&&u({...r._formState,...e}),[r,i]),subject:r._subjects.state}),s.default.useEffect(()=>(l.current=!0,()=>{l.current=!1}),[]),E(o,r,c.current,!1)}var L=e=>"string"==typeof e,R=(e,t,r,s)=>{const a=Array.isArray(e);return L(e)?(s&&t.watch.add(e),m(r,e)):a?e.map(e=>(s&&t.watch.add(e),m(r,e))):(s&&(t.watchAll=!0),r)},q=e=>"function"==typeof e,P=e=>{for(const t in e)if(q(e[t]))return!0;return!1};function W(e){const t=j(),{control:r=t.control,name:a,defaultValue:n,disabled:i,exact:o}=e||{},l=s.default.useRef(a);l.current=a,M({disabled:i,subject:r._subjects.watch,callback:s.default.useCallback(e=>{if(B(l.current,e.name,o)){const t=R(l.current,r._names,e.values||r._formValues);d(f(l.current)||u(t)&&!P(t)?{...t}:Array.isArray(t)?[...t]:f(t)?n:t)}},[r,o,n])});const[c,d]=s.default.useState(f(n)?r._getWatch(a):n);return s.default.useEffect(()=>r._removeUnmounted()),c}function $(e){const t=j(),{name:r,control:a=t.control,shouldUnregister:n}=e,i=c(a._names.array,r),o=W({control:a,name:r,defaultValue:m(a._formValues,r,m(a._defaultValues,r,e.defaultValue)),exact:!0}),u=N({control:a,name:r}),d=s.default.useRef(a.register(r,{...e.rules,value:o}));return s.default.useEffect(()=>{const e=(e,t)=>{const r=m(a._fields,e);r&&(r._f.mount=t)};return e(r,!0),()=>{const t=a._options.shouldUnregister||n;(i?t&&!a._stateFlags.action:t)?a.unregister(r):e(r,!1)}},[r,a,i,n]),{field:{name:r,value:o,onChange:s.default.useCallback(e=>d.current.onChange({target:{value:l(e),name:r},type:h}),[r]),onBlur:s.default.useCallback(()=>d.current.onBlur({target:{value:m(a._formValues,r),name:r},type:y}),[r,a]),ref:e=>{const t=m(a._fields,r);t&&e&&(t._f.ref={focus:()=>e.focus(),select:()=>e.select(),setCustomValidity:t=>e.setCustomValidity(t),reportValidity:()=>e.reportValidity()})}},formState:u,fieldState:Object.defineProperties({},{invalid:{enumerable:!0,get:()=>!!m(u.errors,r)},isDirty:{enumerable:!0,get:()=>!!m(u.dirtyFields,r)},isTouched:{enumerable:!0,get:()=>!!m(u.touchedFields,r)},error:{enumerable:!0,get:()=>m(u.errors,r)}})}}var I=(e,t,r,s,a)=>t?{...r[e],types:{...r[e]&&r[e].types?r[e].types:{},[s]:a||!0}}:{},H=e=>/^\w*$/.test(e),z=e=>d(e.replace(/["|']|\]/g,"").split(/\.|\[/));function G(e,t,r){let s=-1;const a=H(t)?[t]:z(t),n=a.length,i=n-1;for(;++s<n;){const t=a[s];let n=r;if(s!==i){const r=e[t];n=u(r)||Array.isArray(r)?r:isNaN(+a[s+1])?{}:[]}e[t]=n,e=e[t]}return e}const J=(e,t,r)=>{for(const s of r||Object.keys(e)){const r=m(e,s);if(r){const{_f:e,...s}=r;if(e&&t(e.name)){if(e.ref.focus){e.ref.focus();break}if(e.refs&&e.refs[0].focus){e.refs[0].focus();break}}else u(s)&&J(s,t)}}};var K=()=>{const e="undefined"==typeof performance?Date.now():1e3*performance.now();return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{const r=(16*Math.random()+e)%16|0;return("x"==t?r:3&r|8).toString(16)})},Q=(e,t,r={})=>r.shouldFocus||f(r.shouldFocus)?r.focusName||`${e}.${f(r.focusIndex)?t:r.focusIndex}.`:"",X=(e,t,r)=>!r&&(t.watchAll||t.watch.has(e)||[...t.watch].some(t=>e.startsWith(t)&&/^\.\w+/.test(e.slice(t.length)))),Y=(e,t,r)=>{const s=d(m(e,r));return G(s,"root",t[r]),G(e,r,s),e},Z=e=>"boolean"==typeof e,ee=e=>"file"===e.type,te=e=>L(e)||s.default.isValidElement(e),re=e=>"radio"===e.type,se=e=>e instanceof RegExp;const ae={value:!1,isValid:!1},ne={value:!0,isValid:!0};var ie=e=>{if(Array.isArray(e)){if(e.length>1){const t=e.filter(e=>e&&e.checked&&!e.disabled).map(e=>e.value);return{value:t,isValid:!!t.length}}return e[0].checked&&!e[0].disabled?e[0].attributes&&!f(e[0].attributes.value)?f(e[0].value)||""===e[0].value?ne:{value:e[0].value,isValid:!0}:ne:ae}return ae};const oe={isValid:!1,value:null};var ue=e=>Array.isArray(e)?e.reduce((e,t)=>t&&t.checked&&!t.disabled?{isValid:!0,value:t.value}:e,oe):oe;function le(e,t,r="validate"){if(te(e)||Array.isArray(e)&&e.every(te)||Z(e)&&!e)return{type:r,message:te(e)?e:"",ref:t}}var ce=e=>u(e)&&!se(e)?e:{value:e,message:""},de=async(e,t,r,s,n)=>{const{ref:o,refs:l,required:c,maxLength:d,minLength:f,min:m,max:y,pattern:g,validate:h,name:p,valueAsNumber:_,mount:v,disabled:b}=e._f;if(!v||b)return{};const A=l?l[0]:o,C=e=>{s&&A.reportValidity&&(A.setCustomValidity(Z(e)?"":e||" "),A.reportValidity())},j={},E=re(o),T=a(o),U=E||T,B=(_||ee(o))&&!o.value||""===t||Array.isArray(t)&&!t.length,M=I.bind(null,p,r,j),N=(e,t,r,s=V,a=w)=>{const n=e?t:r;j[p]={type:e?s:a,message:n,ref:o,...M(e?s:a,n)}};if(n?!Array.isArray(t)||!t.length:c&&(!U&&(B||i(t))||Z(t)&&!t||T&&!ie(l).isValid||E&&!ue(l).isValid)){const{value:e,message:t}=te(c)?{value:!!c,message:c}:ce(c);if(e&&(j[p]={type:k,message:t,ref:A,...M(k,t)},!r))return C(t),j}if(!(B||i(m)&&i(y))){let e,s;const a=ce(y),n=ce(m);if(i(t)||isNaN(t)){const r=o.valueAsDate||new Date(t),i=e=>new Date((new Date).toDateString()+" "+e),u="time"==o.type,l="week"==o.type;L(a.value)&&t&&(e=u?i(t)>i(a.value):l?t>a.value:r>new Date(a.value)),L(n.value)&&t&&(s=u?i(t)<i(n.value):l?t<n.value:r<new Date(n.value))}else{const r=o.valueAsNumber||(t?+t:t);i(a.value)||(e=r>a.value),i(n.value)||(s=r<n.value)}if((e||s)&&(N(!!e,a.message,n.message,x,F),!r))return C(j[p].message),j}if((d||f)&&!B&&(L(t)||n&&Array.isArray(t))){const e=ce(d),s=ce(f),a=!i(e.value)&&t.length>e.value,n=!i(s.value)&&t.length<s.value;if((a||n)&&(N(a,e.message,s.message),!r))return C(j[p].message),j}if(g&&!B&&L(t)){const{value:e,message:s}=ce(g);if(se(e)&&!t.match(e)&&(j[p]={type:S,message:s,ref:o,...M(S,s)},!r))return C(s),j}if(h)if(q(h)){const e=le(await h(t),A);if(e&&(j[p]={...e,...M(D,e.message)},!r))return C(e.message),j}else if(u(h)){let e={};for(const s in h){if(!O(e)&&!r)break;const a=le(await h[s](t),A,s);a&&(e={...a,...M(s,a.message)},C(a.message),r&&(j[p]=e))}if(!O(e)&&(j[p]={ref:A,...e},!r))return j}return C(!0),j};function fe(e,t){return[...e,...U(t)]}var me="undefined"!=typeof window&&void 0!==window.HTMLElement&&"undefined"!=typeof document;function ye(e){let t;const r=Array.isArray(e);if(e instanceof Date)t=new Date(e);else if(e instanceof Set)t=new Set(e);else{if(me&&(e instanceof Blob||e instanceof FileList)||!r&&!u(e))return e;if(t=r?[]:{},Array.isArray(e)||(e=>{const t=e.constructor&&e.constructor.prototype;return u(t)&&t.hasOwnProperty("isPrototypeOf")})(e))for(const r in e)t[r]=ye(e[r]);else t=e}return t}var ge=e=>Array.isArray(e)?e.map(()=>{}):void 0,he=e=>({isOnSubmit:!e||e===v,isOnBlur:e===p,isOnChange:e===_,isOnAll:e===A,isOnTouch:e===b});function pe(e,t,r){return[...e.slice(0,t),...U(r),...e.slice(t)]}var _e=(e,t,r)=>Array.isArray(e)?(f(e[r])&&(e[r]=void 0),e.splice(r,0,e.splice(t,1)[0]),e):[];function ve(e,t){return[...U(t),...U(e)]}var be=(e,t)=>f(t)?[]:function(e,t){let r=0;const s=[...e];for(const e of t)s.splice(e-r,1),r++;return d(s).length?s:[]}(e,U(t).sort((e,t)=>e-t)),Ae=(e,t,r)=>{e[t]=[e[r],e[r]=e[t]][0]};function xe(e){for(const t in e)if(!f(e[t]))return!1;return!0}function Fe(e,t){const r=H(t)?[t]:z(t),s=1==r.length?e:function(e,t){const r=t.slice(0,-1).length;let s=0;for(;s<r;)e=f(e)?s++:e[t[s++]];return e}(e,r),a=r[r.length-1];let n;s&&delete s[a];for(let t=0;t<r.slice(0,-1).length;t++){let s,a=-1;const i=r.slice(0,-(t+1)),o=i.length-1;for(t>0&&(n=e);++a<i.length;){const t=i[a];s=s?s[t]:e[t],o===a&&(u(s)&&O(s)||Array.isArray(s)&&xe(s))&&(n?delete n[t]:delete e[t]),n=s}}return e}var Ve=(e,t,r)=>(e[t]=r,e);function we(){let e=[];return{get observers(){return e},next:t=>{for(const r of e)r.next(t)},subscribe:t=>(e.push(t),{unsubscribe:()=>{e=e.filter(e=>e!==t)}}),unsubscribe:()=>{e=[]}}}var Se=e=>i(e)||!o(e);function ke(e,t){if(Se(e)||Se(t))return e===t;if(n(e)&&n(t))return e.getTime()===t.getTime();const r=Object.keys(e),s=Object.keys(t);if(r.length!==s.length)return!1;for(const a of r){const r=e[a];if(!s.includes(a))return!1;if("ref"!==a){const e=t[a];if(n(r)&&n(e)||u(r)&&u(e)||Array.isArray(r)&&Array.isArray(e)?!ke(r,e):r!==e)return!1}}return!0}var De=e=>{const t=e?e.ownerDocument:0;return e instanceof(t&&t.defaultView?t.defaultView.HTMLElement:HTMLElement)},Ce=e=>"select-multiple"===e.type,je=e=>De(e)&&e.isConnected;function Ee(e,t={}){const r=Array.isArray(e);if(u(e)||r)for(const r in e)Array.isArray(e[r])||u(e[r])&&!P(e[r])?(t[r]=Array.isArray(e[r])?[]:{},Ee(e[r],t[r])):i(e[r])||(t[r]=!0);return t}var Oe=(e,t)=>function e(t,r,s){const a=Array.isArray(t);if(u(t)||a)for(const a in t)Array.isArray(t[a])||u(t[a])&&!P(t[a])?f(r)||Se(s[a])?s[a]=Array.isArray(t[a])?Ee(t[a],[]):{...Ee(t[a])}:e(t[a],i(r)?{}:r[a],s[a]):s[a]=!ke(t[a],r[a]);return s}(e,t,Ee(t)),Te=(e,{valueAsNumber:t,valueAsDate:r,setValueAs:s})=>f(e)?e:t?""===e?NaN:e?+e:e:r&&L(e)?new Date(e):s?s(e):e;function Ue(e){const t=e.ref;if(!(e.refs?e.refs.every(e=>e.disabled):t.disabled))return ee(t)?t.files:re(t)?ue(e.refs).value:Ce(t)?[...t.selectedOptions].map(({value:e})=>e):a(t)?ie(e.refs).value:Te(f(t.value)?e.ref.value:t.value,e)}var Be=e=>f(e)?void 0:se(e)?e.source:u(e)?se(e.value)?e.value.source:e.value:e;function Me(e,t,r){const s=m(e,r);if(s||H(r))return{error:s,name:r};const a=r.split(".");for(;a.length;){const s=a.join("."),n=m(t,s),i=m(e,s);if(n&&!Array.isArray(n)&&r!==s)return{name:r};if(i&&i.type)return{name:s,error:i};a.pop()}return{name:r}}const Ne={mode:v,reValidateMode:_,shouldFocusError:!0};function Le(e={}){let t,r={...Ne,...e},s={submitCount:0,isDirty:!1,isValidating:!1,isSubmitted:!1,isSubmitting:!1,isSubmitSuccessful:!1,isValid:!1,touchedFields:{},dirtyFields:{},errors:{}},o={},u=ye(r.defaultValues)||{},h=r.shouldUnregister?{}:ye(u),p={action:!1,mount:!1,watch:!1},_={mount:new Set,unMount:new Set,array:new Set,watch:new Set},v=0,b={};const x={isDirty:!1,dirtyFields:!1,touchedFields:!1,isValidating:!1,isValid:!1,errors:!1},F={watch:we(),array:we(),state:we()},V=he(r.mode),w=he(r.reValidateMode),S=r.criteriaMode===A,k=async e=>{let t=!1;return x.isValid&&(t=r.resolver?O((await E()).errors):await T(o,!0),e||t===s.isValid||(s.isValid=t,F.state.next({isValid:t}))),t},D=(e,t,r,s)=>{const a=m(o,e);if(a){const n=m(h,e,f(r)?m(u,e):r);f(n)||s&&s.defaultChecked||t?G(h,e,t?n:Ue(a._f)):N(e,n),p.mount&&k()}},C=(e,t,r,a,n)=>{let i=!1;const o={name:e},l=m(s.touchedFields,e);if(x.isDirty){const e=s.isDirty;s.isDirty=o.isDirty=B(),i=e!==o.isDirty}if(x.dirtyFields&&(!r||a)){const r=m(s.dirtyFields,e);ke(m(u,e),t)?Fe(s.dirtyFields,e):G(s.dirtyFields,e,!0),o.dirtyFields=s.dirtyFields,i=i||r!==m(s.dirtyFields,e)}return r&&!l&&(G(s.touchedFields,e,r),o.touchedFields=s.touchedFields,i=i||x.touchedFields&&l!==r),i&&n&&F.state.next(o),i?o:{}},j=async(r,a,n,i)=>{const o=m(s.errors,r),u=x.isValid&&s.isValid!==a;var l;if(e.delayError&&n?(l=()=>((e,t)=>{G(s.errors,e,t),F.state.next({errors:s.errors})})(r,n),t=e=>{clearTimeout(v),v=window.setTimeout(l,e)},t(e.delayError)):(clearTimeout(v),t=null,n?G(s.errors,r,n):Fe(s.errors,r)),(n?!ke(o,n):o)||!O(i)||u){const e={...i,...u?{isValid:a}:{},errors:s.errors,name:r};s={...s,...e},F.state.next(e)}b[r]--,x.isValidating&&!Object.values(b).some(e=>e)&&(F.state.next({isValidating:!1}),b={})},E=async e=>r.resolver?await r.resolver({...h},r.context,((e,t,r,s)=>{const a={};for(const r of e){const e=m(t,r);e&&G(a,r,e._f)}return{criteriaMode:r,names:[...e],fields:a,shouldUseNativeValidation:s}})(e||_.mount,o,r.criteriaMode,r.shouldUseNativeValidation)):{},T=async(e,t,a={valid:!0})=>{for(const n in e){const i=e[n];if(i){const{_f:e,...n}=i;if(e){const n=_.array.has(e.name),o=await de(i,m(h,e.name),S,r.shouldUseNativeValidation,n);if(o[e.name]&&(a.valid=!1,t))break;!t&&(m(o,e.name)?n?Y(s.errors,o,e.name):G(s.errors,e.name,o[e.name]):Fe(s.errors,e.name))}n&&await T(n,t,a)}}return a.valid},B=(e,t)=>(e&&t&&G(h,e,t),!ke(H(),u)),M=(e,t,r)=>{const s={...p.mount?h:f(t)?u:L(e)?{[e]:t}:t};return R(e,_,s,r)},N=(e,t,r={})=>{const s=m(o,e);let n=t;if(s){const r=s._f;r&&(!r.disabled&&G(h,e,Te(t,r)),n=me&&De(r.ref)&&i(t)?"":t,Ce(r.ref)?[...r.ref.options].forEach(e=>e.selected=n.includes(e.value)):r.refs?a(r.ref)?r.refs.length>1?r.refs.forEach(e=>(!e.defaultChecked||!e.disabled)&&(e.checked=Array.isArray(n)?!!n.find(t=>t===e.value):n===e.value)):r.refs[0]&&(r.refs[0].checked=!!n):r.refs.forEach(e=>e.checked=e.value===n):ee(r.ref)?r.ref.value="":(r.ref.value=n,r.ref.type||F.watch.next({name:e})))}(r.shouldDirty||r.shouldTouch)&&C(e,n,r.shouldTouch,r.shouldDirty,!0),r.shouldValidate&&I(e)},P=(e,t,r)=>{for(const s in t){const a=t[s],i=`${e}.${s}`,u=m(o,i);!_.array.has(e)&&Se(a)&&(!u||u._f)||n(a)?N(i,a,r):P(i,a,r)}},W=(e,t,r={})=>{const a=m(o,e),n=_.array.has(e),l=ye(t);G(h,e,l),n?(F.array.next({name:e,values:h}),(x.isDirty||x.dirtyFields)&&r.shouldDirty&&(s.dirtyFields=Oe(u,h),F.state.next({name:e,dirtyFields:s.dirtyFields,isDirty:B(e,l)}))):!a||a._f||i(l)?N(e,l,r):P(e,l,r),X(e,_)&&F.state.next({}),F.watch.next({name:e})},$=async e=>{const a=e.target;let n=a.name;const i=m(o,n);if(i){let c,d;const f=a.type?Ue(i._f):l(e),p=e.type===y||e.type===g,v=!((u=i._f).mount&&(u.required||u.min||u.max||u.maxLength||u.minLength||u.pattern||u.validate)||r.resolver||m(s.errors,n)||i._f.deps)||((e,t,r,s,a)=>!a.isOnAll&&(!r&&a.isOnTouch?!(t||e):(r?s.isOnBlur:a.isOnBlur)?!e:!(r?s.isOnChange:a.isOnChange)||e))(p,m(s.touchedFields,n),s.isSubmitted,w,V),A=X(n,_,p);G(h,n,f),p?(i._f.onBlur&&i._f.onBlur(e),t&&t(0)):i._f.onChange&&i._f.onChange(e);const x=C(n,f,p,!1),D=!O(x)||A;if(!p&&F.watch.next({name:n,type:e.type}),v)return D&&F.state.next({name:n,...A?{}:x});if(!p&&A&&F.state.next({}),b[n]=(b[n],1),F.state.next({isValidating:!0}),r.resolver){const{errors:e}=await E([n]),t=Me(s.errors,o,n),r=Me(e,o,t.name||n);c=r.error,n=r.name,d=O(e)}else c=(await de(i,m(h,n),S,r.shouldUseNativeValidation))[n],d=await k(!0);i._f.deps&&I(i._f.deps),j(n,d,c,x)}var u},I=async(e,t={})=>{let a,n;const i=U(e);if(F.state.next({isValidating:!0}),r.resolver){const t=await(async e=>{const{errors:t}=await E();if(e)for(const r of e){const e=m(t,r);e?G(s.errors,r,e):Fe(s.errors,r)}else s.errors=t;return t})(f(e)?e:i);a=O(t),n=e?!i.some(e=>m(t,e)):a}else e?(n=(await Promise.all(i.map(async e=>{const t=m(o,e);return await T(t&&t._f?{[e]:t}:t)}))).every(Boolean),(n||s.isValid)&&k()):n=a=await T(o);return F.state.next({...!L(e)||x.isValid&&a!==s.isValid?{}:{name:e},...r.resolver||!e?{isValid:a}:{},errors:s.errors,isValidating:!1}),t.shouldFocus&&!n&&J(o,e=>e&&m(s.errors,e),e?i:_.mount),n},H=e=>{const t={...u,...p.mount?h:{}};return f(e)?t:L(e)?m(t,e):e.map(e=>m(t,e))},z=(e,t)=>({invalid:!!m((t||s).errors,e),isDirty:!!m((t||s).dirtyFields,e),isTouched:!!m((t||s).touchedFields,e),error:m((t||s).errors,e)}),K=(e,t={})=>{for(const a of e?U(e):_.mount)_.mount.delete(a),_.array.delete(a),m(o,a)&&(t.keepValue||(Fe(o,a),Fe(h,a)),!t.keepError&&Fe(s.errors,a),!t.keepDirty&&Fe(s.dirtyFields,a),!t.keepTouched&&Fe(s.touchedFields,a),!r.shouldUnregister&&!t.keepDefaultValue&&Fe(u,a));F.watch.next({}),F.state.next({...s,...t.keepDirty?{isDirty:B()}:{}}),!t.keepIsValid&&k()},Q=(e,t={})=>{let s=m(o,e);const n=Z(t.disabled);return G(o,e,{...s||{},_f:{...s&&s._f?s._f:{ref:{name:e}},name:e,mount:!0,...t}}),_.mount.add(e),s?n&&G(h,e,t.disabled?void 0:m(h,e,Ue(s._f))):D(e,!0,t.value),{...n?{disabled:t.disabled}:{},...r.shouldUseNativeValidation?{required:!!t.required,min:Be(t.min),max:Be(t.max),minLength:Be(t.minLength),maxLength:Be(t.maxLength),pattern:Be(t.pattern)}:{},name:e,onChange:$,onBlur:$,ref:n=>{if(n){Q(e,t),s=m(o,e);const r=f(n.value)&&n.querySelectorAll&&n.querySelectorAll("input,select,textarea")[0]||n,i=(e=>re(e)||a(e))(r),l=s._f.refs||[];if(i?l.find(e=>e===r):r===s._f.ref)return;G(o,e,{_f:{...s._f,...i?{refs:[...l.filter(je),r,...Array.isArray(m(u,e))?[{}]:[]],ref:{type:r.type,name:e}}:{ref:r}}}),D(e,!1,void 0,r)}else s=m(o,e,{}),s._f&&(s._f.mount=!1),(r.shouldUnregister||t.shouldUnregister)&&(!c(_.array,e)||!p.action)&&_.unMount.add(e)}}},te=()=>r.shouldFocusError&&J(o,e=>e&&m(s.errors,e),_.mount);return{control:{register:Q,unregister:K,getFieldState:z,_executeSchema:E,_focusError:te,_getWatch:M,_getDirty:B,_updateValid:k,_removeUnmounted:()=>{for(const e of _.unMount){const t=m(o,e);t&&(t._f.refs?t._f.refs.every(e=>!je(e)):!je(t._f.ref))&&K(e)}_.unMount=new Set},_updateFieldArray:(e,t=[],r,a,n=!0,i=!0)=>{if(a&&r){if(p.action=!0,i&&Array.isArray(m(o,e))){const t=r(m(o,e),a.argA,a.argB);n&&G(o,e,t)}if(x.errors&&i&&Array.isArray(m(s.errors,e))){const t=r(m(s.errors,e),a.argA,a.argB);n&&G(s.errors,e,t),((e,t)=>{!d(m(e,t)).length&&Fe(e,t)})(s.errors,e)}if(x.touchedFields&&i&&Array.isArray(m(s.touchedFields,e))){const t=r(m(s.touchedFields,e),a.argA,a.argB);n&&G(s.touchedFields,e,t)}x.dirtyFields&&(s.dirtyFields=Oe(u,h)),F.state.next({isDirty:B(e,t),dirtyFields:s.dirtyFields,errors:s.errors,isValid:s.isValid})}else G(h,e,t)},_getFieldArray:t=>d(m(p.mount?h:u,t,e.shouldUnregister?m(u,t,[]):[])),_subjects:F,_proxyFormState:x,get _fields(){return o},get _formValues(){return h},get _stateFlags(){return p},set _stateFlags(e){p=e},get _defaultValues(){return u},get _names(){return _},set _names(e){_=e},get _formState(){return s},set _formState(e){s=e},get _options(){return r},set _options(e){r={...r,...e}}},trigger:I,register:Q,handleSubmit:(e,t)=>async a=>{a&&(a.preventDefault&&a.preventDefault(),a.persist&&a.persist());let n=!0,i=ye(h);F.state.next({isSubmitting:!0});try{if(r.resolver){const{errors:e,values:t}=await E();s.errors=e,i=t}else await T(o);O(s.errors)?(F.state.next({errors:{},isSubmitting:!0}),await e(i,a)):(t&&await t({...s.errors},a),te())}catch(e){throw n=!1,e}finally{s.isSubmitted=!0,F.state.next({isSubmitted:!0,isSubmitting:!1,isSubmitSuccessful:O(s.errors)&&n,submitCount:s.submitCount+1,errors:s.errors})}},watch:(e,t)=>q(e)?F.watch.subscribe({next:r=>e(M(void 0,t),r)}):M(e,t,!0),setValue:W,getValues:H,reset:(t,r)=>((t,r={})=>{const a=t||u,n=ye(a),i=t&&!O(t)?n:u;if(r.keepDefaultValues||(u=a),!r.keepValues){if(r.keepDirtyValues)for(const e of _.mount)m(s.dirtyFields,e)?G(i,e,m(h,e)):W(e,m(i,e));else{if(me&&f(t))for(const e of _.mount){const t=m(o,e);if(t&&t._f){const e=Array.isArray(t._f.refs)?t._f.refs[0]:t._f.ref;try{if(De(e)){e.closest("form").reset();break}}catch(e){}}}o={}}h=e.shouldUnregister?r.keepDefaultValues?ye(u):{}:n,F.array.next({values:i}),F.watch.next({values:i})}_={mount:new Set,unMount:new Set,array:new Set,watch:new Set,watchAll:!1,focus:""},p.mount=!x.isValid||!!r.keepIsValid,p.watch=!!e.shouldUnregister,F.state.next({submitCount:r.keepSubmitCount?s.submitCount:0,isDirty:r.keepDirty||r.keepDirtyValues?s.isDirty:!(!r.keepDefaultValues||ke(t,u)),isSubmitted:!!r.keepIsSubmitted&&s.isSubmitted,dirtyFields:r.keepDirty||r.keepDirtyValues?s.dirtyFields:r.keepDefaultValues&&t?Oe(u,t):{},touchedFields:r.keepTouched?s.touchedFields:{},errors:r.keepErrors?s.errors:{},isSubmitting:!1,isSubmitSuccessful:!1})})(q(t)?t(h):t,r),resetField:(e,t={})=>{m(o,e)&&(f(t.defaultValue)?W(e,m(u,e)):(W(e,t.defaultValue),G(u,e,t.defaultValue)),t.keepTouched||Fe(s.touchedFields,e),t.keepDirty||(Fe(s.dirtyFields,e),s.isDirty=t.defaultValue?B(e,m(u,e)):B()),t.keepError||(Fe(s.errors,e),x.isValid&&k()),F.state.next({...s}))},clearErrors:e=>{e?U(e).forEach(e=>Fe(s.errors,e)):s.errors={},F.state.next({errors:s.errors})},unregister:K,setError:(e,t,r)=>{const a=(m(o,e,{_f:{}})._f||{}).ref;G(s.errors,e,{...t,ref:a}),F.state.next({name:e,errors:s.errors,isValid:!1}),r&&r.shouldFocus&&a&&a.focus&&a.focus()},setFocus:(e,t={})=>{const r=m(o,e),s=r&&r._f;if(s){const e=s.refs?s.refs[0]:s.ref;e.focus&&(e.focus(),t.shouldSelect&&e.select())}},getFieldState:z}}e.Controller=e=>e.render($(e)),e.FormProvider=e=>{const{children:t,...r}=e;return s.default.createElement(C.Provider,{value:r},t)},e.appendErrors=I,e.get=m,e.set=G,e.useController=$,e.useFieldArray=function(e){const t=j(),{control:r=t.control,name:a,keyName:n="id",shouldUnregister:i}=e,[o,u]=s.default.useState(r._getFieldArray(a)),l=s.default.useRef(r._getFieldArray(a).map(K)),c=s.default.useRef(o),d=s.default.useRef(a),f=s.default.useRef(!1);d.current=a,c.current=o,r._names.array.add(a),e.rules&&r.register(a,e.rules),M({callback:s.default.useCallback(({values:e,name:t})=>{if(t===d.current||!t){const t=m(e,d.current);Array.isArray(t)&&(u(t),l.current=t.map(K))}},[]),subject:r._subjects.array});const y=s.default.useCallback(e=>{f.current=!0,r._updateFieldArray(a,e)},[r,a]);return s.default.useEffect(()=>{if(r._stateFlags.action=!1,X(a,r._names)&&r._subjects.state.next({}),f.current&&(!he(r._options.mode).isOnSubmit||r._formState.isSubmitted))if(r._options.resolver)r._executeSchema([a]).then(e=>{const t=m(e.errors,a),s=m(r._formState.errors,a);(s?!t&&s.type:t&&t.type)&&(t?G(r._formState.errors,a,t):Fe(r._formState.errors,a),r._subjects.state.next({errors:r._formState.errors}))});else{const e=m(r._fields,a);e&&e._f&&de(e,m(r._formValues,a),r._options.criteriaMode===A,r._options.shouldUseNativeValidation,!0).then(e=>!O(e)&&r._subjects.state.next({errors:Y(r._formState.errors,e,a)}))}r._subjects.watch.next({name:a,values:r._formValues}),r._names.focus&&J(r._fields,e=>!!e&&e.startsWith(r._names.focus)),r._names.focus="",r._proxyFormState.isValid&&r._updateValid()},[o,a,r]),s.default.useEffect(()=>(!m(r._formValues,a)&&r._updateFieldArray(a),()=>{(r._options.shouldUnregister||i)&&r.unregister(a)}),[a,r,n,i]),{swap:s.default.useCallback((e,t)=>{const s=r._getFieldArray(a);Ae(s,e,t),Ae(l.current,e,t),y(s),u(s),r._updateFieldArray(a,s,Ae,{argA:e,argB:t},!1)},[y,a,r]),move:s.default.useCallback((e,t)=>{const s=r._getFieldArray(a);_e(s,e,t),_e(l.current,e,t),y(s),u(s),r._updateFieldArray(a,s,_e,{argA:e,argB:t},!1)},[y,a,r]),prepend:s.default.useCallback((e,t)=>{const s=U(ye(e)),n=ve(r._getFieldArray(a),s);r._names.focus=Q(a,0,t),l.current=ve(l.current,s.map(K)),y(n),u(n),r._updateFieldArray(a,n,ve,{argA:ge(e)})},[y,a,r]),append:s.default.useCallback((e,t)=>{const s=U(ye(e)),n=fe(r._getFieldArray(a),s);r._names.focus=Q(a,n.length-1,t),l.current=fe(l.current,s.map(K)),y(n),u(n),r._updateFieldArray(a,n,fe,{argA:ge(e)})},[y,a,r]),remove:s.default.useCallback(e=>{const t=be(r._getFieldArray(a),e);l.current=be(l.current,e),y(t),u(t),r._updateFieldArray(a,t,be,{argA:e})},[y,a,r]),insert:s.default.useCallback((e,t,s)=>{const n=U(ye(t)),i=pe(r._getFieldArray(a),e,n);r._names.focus=Q(a,e,s),l.current=pe(l.current,e,n.map(K)),y(i),u(i),r._updateFieldArray(a,i,pe,{argA:e,argB:ge(t)})},[y,a,r]),update:s.default.useCallback((e,t)=>{const s=ye(t),n=Ve(r._getFieldArray(a),e,s);l.current=[...n].map((t,r)=>t&&r!==e?l.current[r]:K()),y(n),u([...n]),r._updateFieldArray(a,n,Ve,{argA:e,argB:s},!0,!1)},[y,a,r]),replace:s.default.useCallback(e=>{const t=U(ye(e));l.current=t.map(K),y([...t]),u([...t]),r._updateFieldArray(a,[...t],e=>e,{},!0,!1)},[y,a,r]),fields:s.default.useMemo(()=>o.map((e,t)=>({...e,[n]:l.current[t]||K()})),[o,n])}},e.useForm=function(e={}){const t=s.default.useRef(),[r,a]=s.default.useState({isDirty:!1,isValidating:!1,isSubmitted:!1,isSubmitting:!1,isSubmitSuccessful:!1,isValid:!1,submitCount:0,dirtyFields:{},touchedFields:{},errors:{},defaultValues:e.defaultValues});t.current||(t.current={...Le(e),formState:r});const n=t.current.control;return n._options=e,M({subject:n._subjects.state,callback:s.default.useCallback(e=>{T(e,n._proxyFormState,!0)&&(n._formState={...n._formState,...e},a({...n._formState}))},[n])}),s.default.useEffect(()=>{n._stateFlags.mount||(n._proxyFormState.isValid&&n._updateValid(),n._stateFlags.mount=!0),n._stateFlags.watch&&(n._stateFlags.watch=!1,n._subjects.state.next({})),n._removeUnmounted()}),s.default.useEffect(()=>{r.submitCount&&n._focusError()},[n,r.submitCount]),t.current.formState=E(r,n),t.current},e.useFormContext=j,e.useFormState=N,e.useWatch=W,Object.defineProperty(e,"__esModule",{value:!0})}));
//# sourceMappingURL=index.umd.js.map
# Developer's Certificate of Origin 1.1

By making a contribution to this project, I certify that:

* (a) The contribution was created in whole or in part by me and I
  have the right to submit it under the open source license
  indicated in the file; or

* (b) The contribution is based upon previous work that, to the best
  of my knowledge, is covered under an appropriate open source
  license and I have the right under that license to submit that
  work with modifications, whether created in whole or in part
  by me, under the same open source license (unless I am
  permitted to submit under a different license), as indicated
  in the file; or

* (c) The contribution was provided directly to me by some other
  person who certified (a), (b) or (c) and I have not modified
  it.

* (d) I understand and agree that this project and the contribution
  are public and that a record of the contribution (including all
  personal information I submit with it, including my sign-off) is
  maintained indefinitely and may be redistributed consistent with
  this project or the open source license(s) involved.

## Moderation Policy

The [Node.js Moderation Policy] applies to this WG.

## Code of Conduct

The [Node.js Code of Conduct][] applies to this WG.

[Node.js Code of Conduct]:
https://github.com/nodejs/node/blob/master/CODE_OF_CONDUCT.md
[Node.js Moderation Policy]:
https://github.com/nodejs/TSC/blob/master/Moderation-Policy.md
### Streams Working Group

The Node.js Streams is jointly governed by a Working Group
(WG)
that is responsible for high-level guidance of the project.

The WG has final authority over this project including:

* Technical direction
* Project governance and process (including this policy)
* Contribution policy
* GitHub repository hosting
* Conduct guidelines
* Maintaining the list of additional Collaborators

For the current list of WG members, see the project
[README.md](./README.md#current-project-team-members).

### Collaborators

The readable-stream GitHub repository is
maintained by the WG and additional Collaborators who are added by the
WG on an ongoing basis.

Individuals making significant and valuable contributions are made
Collaborators and given commit-access to the project. These
individuals are identified by the WG and their addition as
Collaborators is discussed during the WG meeting.

_Note:_ If you make a significant contribution and are not considered
for commit-access log an issue or contact a WG member directly and it
will be brought up in the next WG meeting.

Modifications of the contents of the readable-stream repository are
made on
a collaborative basis. Anybody with a GitHub account may propose a
modification via pull request and it will be considered by the project
Collaborators. All pull requests must be reviewed and accepted by a
Collaborator with sufficient expertise who is able to take full
responsibility for the change. In the case of pull requests proposed
by an existing Collaborator, an additional Collaborator is required
for sign-off. Consensus should be sought if additional Collaborators
participate and there is disagreement around a particular
modification. See _Consensus Seeking Process_ below for further detail
on the consensus model used for governance.

Collaborators may opt to elevate significant or controversial
modifications, or modifications that have not found consensus to the
WG for discussion by assigning the ***WG-agenda*** tag to a pull
request or issue. The WG should serve as the final arbiter where
required.

For the current list of Collaborators, see the project
[README.md](./README.md#members).

### WG Membership

WG seats are not time-limited.  There is no fixed size of the WG.
However, the expected target is between 6 and 12, to ensure adequate
coverage of important areas of expertise, balanced with the ability to
make decisions efficiently.

There is no specific set of requirements or qualifications for WG
membership beyond these rules.

The WG may add additional members to the WG by unanimous consensus.

A WG member may be removed from the WG by voluntary resignation, or by
unanimous consensus of all other WG members.

Changes to WG membership should be posted in the agenda, and may be
suggested as any other agenda item (see "WG Meetings" below).

If an addition or removal is proposed during a meeting, and the full
WG is not in attendance to participate, then the addition or removal
is added to the agenda for the subsequent meeting.  This is to ensure
that all members are given the opportunity to participate in all
membership decisions.  If a WG member is unable to attend a meeting
where a planned membership decision is being made, then their consent
is assumed.

No more than 1/3 of the WG members may be affiliated with the same
employer.  If removal or resignation of a WG member, or a change of
employment by a WG member, creates a situation where more than 1/3 of
the WG membership shares an employer, then the situation must be
immediately remedied by the resignation or removal of one or more WG
members affiliated with the over-represented employer(s).

### WG Meetings

The WG meets occasionally on a Google Hangout On Air. A designated moderator
approved by the WG runs the meeting. Each meeting should be
published to YouTube.

Items are added to the WG agenda that are considered contentious or
are modifications of governance, contribution policy, WG membership,
or release process.

The intention of the agenda is not to approve or review all patches;
that should happen continuously on GitHub and be handled by the larger
group of Collaborators.

Any community member or contributor can ask that something be added to
the next meeting's agenda by logging a GitHub Issue. Any Collaborator,
WG member or the moderator can add the item to the agenda by adding
the ***WG-agenda*** tag to the issue.

Prior to each WG meeting the moderator will share the Agenda with
members of the WG. WG members can add any items they like to the
agenda at the beginning of each meeting. The moderator and the WG
cannot veto or remove items.

The WG may invite persons or representatives from certain projects to
participate in a non-voting capacity.

The moderator is responsible for summarizing the discussion of each
agenda item and sends it as a pull request after the meeting.

### Consensus Seeking Process

The WG follows a
[Consensus
Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making)
decision-making model.

When an agenda item has appeared to reach a consensus the moderator
will ask "Does anyone object?" as a final call for dissent from the
consensus.

If an agenda item cannot reach a consensus a WG member can call for
either a closing vote or a vote to table the issue to the next
meeting. The call for a vote must be seconded by a majority of the WG
or else the discussion will continue. Simple majority wins.

Note that changes to WG membership require a majority consensus.  See
"WG Membership" above.
Node.js is licensed for use as follows:

"""
Copyright Node.js contributors. All rights reserved.

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.
"""

This license applies to parts of Node.js originating from the
https://github.com/joyent/node repository:

"""
Copyright Joyent, Inc. and other Node contributors. All rights reserved.
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';

function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }

var codes = {};

function createErrorType(code, message, Base) {
  if (!Base) {
    Base = Error;
  }

  function getMessage(arg1, arg2, arg3) {
    if (typeof message === 'string') {
      return message;
    } else {
      return message(arg1, arg2, arg3);
    }
  }

  var NodeError =
  /*#__PURE__*/
  function (_Base) {
    _inheritsLoose(NodeError, _Base);

    function NodeError(arg1, arg2, arg3) {
      return _Base.call(this, getMessage(arg1, arg2, arg3)) || this;
    }

    return NodeError;
  }(Base);

  NodeError.prototype.name = Base.name;
  NodeError.prototype.code = code;
  codes[code] = NodeError;
} // https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js


function oneOf(expected, thing) {
  if (Array.isArray(expected)) {
    var len = expected.length;
    expected = expected.map(function (i) {
      return String(i);
    });

    if (len > 2) {
      return "one of ".concat(thing, " ").concat(expected.slice(0, len - 1).join(', '), ", or ") + expected[len - 1];
    } else if (len === 2) {
      return "one of ".concat(thing, " ").concat(expected[0], " or ").concat(expected[1]);
    } else {
      return "of ".concat(thing, " ").concat(expected[0]);
    }
  } else {
    return "of ".concat(thing, " ").concat(String(expected));
  }
} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith


function startsWith(str, search, pos) {
  return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search;
} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith


function endsWith(str, search, this_len) {
  if (this_len === undefined || this_len > str.length) {
    this_len = str.length;
  }

  return str.substring(this_len - search.length, this_len) === search;
} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes


function includes(str, search, start) {
  if (typeof start !== 'number') {
    start = 0;
  }

  if (start + search.length > str.length) {
    return false;
  } else {
    return str.indexOf(search, start) !== -1;
  }
}

createErrorType('ERR_INVALID_OPT_VALUE', function (name, value) {
  return 'The value "' + value + '" is invalid for option "' + name + '"';
}, TypeError);
createErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) {
  // determiner: 'must be' or 'must not be'
  var determiner;

  if (typeof expected === 'string' && startsWith(expected, 'not ')) {
    determiner = 'must not be';
    expected = expected.replace(/^not /, '');
  } else {
    determiner = 'must be';
  }

  var msg;

  if (endsWith(name, ' argument')) {
    // For cases like 'first argument'
    msg = "The ".concat(name, " ").concat(determiner, " ").concat(oneOf(expected, 'type'));
  } else {
    var type = includes(name, '.') ? 'property' : 'argument';
    msg = "The \"".concat(name, "\" ").concat(type, " ").concat(determiner, " ").concat(oneOf(expected, 'type'));
  }

  msg += ". Received type ".concat(typeof actual);
  return msg;
}, TypeError);
createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF');
createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) {
  return 'The ' + name + ' method is not implemented';
});
createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close');
createErrorType('ERR_STREAM_DESTROYED', function (name) {
  return 'Cannot call ' + name + ' after a stream was destroyed';
});
createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times');
createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable');
createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end');
createErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError);
createErrorType('ERR_UNKNOWN_ENCODING', function (arg) {
  return 'Unknown encoding: ' + arg;
}, TypeError);
createErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event');
module.exports.codes = codes;
'use strict';

const codes = {};

function createErrorType(code, message, Base) {
  if (!Base) {
    Base = Error
  }

  function getMessage (arg1, arg2, arg3) {
    if (typeof message === 'string') {
      return message
    } else {
      return message(arg1, arg2, arg3)
    }
  }

  class NodeError extends Base {
    constructor (arg1, arg2, arg3) {
      super(getMessage(arg1, arg2, arg3));
    }
  }

  NodeError.prototype.name = Base.name;
  NodeError.prototype.code = code;

  codes[code] = NodeError;
}

// https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js
function oneOf(expected, thing) {
  if (Array.isArray(expected)) {
    const len = expected.length;
    expected = expected.map((i) => String(i));
    if (len > 2) {
      return `one of ${thing} ${expected.slice(0, len - 1).join(', ')}, or ` +
             expected[len - 1];
    } else if (len === 2) {
      return `one of ${thing} ${expected[0]} or ${expected[1]}`;
    } else {
      return `of ${thing} ${expected[0]}`;
    }
  } else {
    return `of ${thing} ${String(expected)}`;
  }
}

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
function startsWith(str, search, pos) {
	return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search;
}

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
function endsWith(str, search, this_len) {
	if (this_len === undefined || this_len > str.length) {
		this_len = str.length;
	}
	return str.substring(this_len - search.length, this_len) === search;
}

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes
function includes(str, search, start) {
  if (typeof start !== 'number') {
    start = 0;
  }

  if (start + search.length > str.length) {
    return false;
  } else {
    return str.indexOf(search, start) !== -1;
  }
}

createErrorType('ERR_INVALID_OPT_VALUE', function (name, value) {
  return 'The value "' + value + '" is invalid for option "' + name + '"'
}, TypeError);
createErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) {
  // determiner: 'must be' or 'must not be'
  let determiner;
  if (typeof expected === 'string' && startsWith(expected, 'not ')) {
    determiner = 'must not be';
    expected = expected.replace(/^not /, '');
  } else {
    determiner = 'must be';
  }

  let msg;
  if (endsWith(name, ' argument')) {
    // For cases like 'first argument'
    msg = `The ${name} ${determiner} ${oneOf(expected, 'type')}`;
  } else {
    const type = includes(name, '.') ? 'property' : 'argument';
    msg = `The "${name}" ${type} ${determiner} ${oneOf(expected, 'type')}`;
  }

  msg += `. Received type ${typeof actual}`;
  return msg;
}, TypeError);
createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF');
createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) {
  return 'The ' + name + ' method is not implemented'
});
createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close');
createErrorType('ERR_STREAM_DESTROYED', function (name) {
  return 'Cannot call ' + name + ' after a stream was destroyed';
});
createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times');
createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable');
createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end');
createErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError);
createErrorType('ERR_UNKNOWN_ENCODING', function (arg) {
  return 'Unknown encoding: ' + arg
}, TypeError);
createErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event');

module.exports.codes = codes;
'use strict'

var experimentalWarnings = new Set();

function emitExperimentalWarning(feature) {
  if (experimentalWarnings.has(feature)) return;
  var msg = feature + ' is an experimental feature. This feature could ' +
       'change at any time';
  experimentalWarnings.add(feature);
  process.emitWarning(msg, 'ExperimentalWarning');
}

function noop() {}

module.exports.emitExperimentalWarning = process.emitWarning
  ? emitExperimentalWarning
  : noop;
{
  "name": "readable-stream",
  "version": "3.6.0",
  "description": "Streams3, a user-land copy of the stream library from Node.js",
  "main": "readable.js",
  "engines": {
    "node": ">= 6"
  },
  "dependencies": {
    "inherits": "^2.0.3",
    "string_decoder": "^1.1.1",
    "util-deprecate": "^1.0.1"
  },
  "devDependencies": {
    "@babel/cli": "^7.2.0",
    "@babel/core": "^7.2.0",
    "@babel/polyfill": "^7.0.0",
    "@babel/preset-env": "^7.2.0",
    "airtap": "0.0.9",
    "assert": "^1.4.0",
    "bl": "^2.0.0",
    "deep-strict-equal": "^0.2.0",
    "events.once": "^2.0.2",
    "glob": "^7.1.2",
    "gunzip-maybe": "^1.4.1",
    "hyperquest": "^2.1.3",
    "lolex": "^2.6.0",
    "nyc": "^11.0.0",
    "pump": "^3.0.0",
    "rimraf": "^2.6.2",
    "tap": "^12.0.0",
    "tape": "^4.9.0",
    "tar-fs": "^1.16.2",
    "util-promisify": "^2.1.0"
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/nodejs/readable-stream"
  },
  "browser": {
    "util": false,
    "worker_threads": false,
    "./errors": "./errors-browser.js",
    "./readable.js": "./readable-browser.js",
    "./lib/internal/streams/from.js": "./lib/internal/streams/from-browser.js",
    "./lib/internal/streams/stream.js": "./lib/internal/streams/stream-browser.js"
  },
  "license": "MIT"
}exports = module.exports = require('./lib/_stream_readable.js');
exports.Stream = exports;
exports.Readable = exports;
exports.Writable = require('./lib/_stream_writable.js');
exports.Duplex = require('./lib/_stream_duplex.js');
exports.Transform = require('./lib/_stream_transform.js');
exports.PassThrough = require('./lib/_stream_passthrough.js');
exports.finished = require('./lib/internal/streams/end-of-stream.js');
exports.pipeline = require('./lib/internal/streams/pipeline.js');
var Stream = require('stream');
if (process.env.READABLE_STREAM === 'disable' && Stream) {
  module.exports = Stream.Readable;
  Object.assign(module.exports, Stream);
  module.exports.Stream = Stream;
} else {
  exports = module.exports = require('./lib/_stream_readable.js');
  exports.Stream = Stream || exports;
  exports.Readable = exports;
  exports.Writable = require('./lib/_stream_writable.js');
  exports.Duplex = require('./lib/_stream_duplex.js');
  exports.Transform = require('./lib/_stream_transform.js');
  exports.PassThrough = require('./lib/_stream_passthrough.js');
  exports.finished = require('./lib/internal/streams/end-of-stream.js');
  exports.pipeline = require('./lib/internal/streams/pipeline.js');
}
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
// a duplex stream is just a stream that is both readable and writable.
// Since JS doesn't have multiple prototypal inheritance, this class
// prototypally inherits from Readable, and then parasitically from
// Writable.
'use strict';
/*<replacement>*/

var objectKeys = Object.keys || function (obj) {
  var keys = [];

  for (var key in obj) {
    keys.push(key);
  }

  return keys;
};
/*</replacement>*/


module.exports = Duplex;

var Readable = require('./_stream_readable');

var Writable = require('./_stream_writable');

require('inherits')(Duplex, Readable);

{
  // Allow the keys array to be GC'ed.
  var keys = objectKeys(Writable.prototype);

  for (var v = 0; v < keys.length; v++) {
    var method = keys[v];
    if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
  }
}

function Duplex(options) {
  if (!(this instanceof Duplex)) return new Duplex(options);
  Readable.call(this, options);
  Writable.call(this, options);
  this.allowHalfOpen = true;

  if (options) {
    if (options.readable === false) this.readable = false;
    if (options.writable === false) this.writable = false;

    if (options.allowHalfOpen === false) {
      this.allowHalfOpen = false;
      this.once('end', onend);
    }
  }
}

Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function get() {
    return this._writableState.highWaterMark;
  }
});
Object.defineProperty(Duplex.prototype, 'writableBuffer', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function get() {
    return this._writableState && this._writableState.getBuffer();
  }
});
Object.defineProperty(Duplex.prototype, 'writableLength', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function get() {
    return this._writableState.length;
  }
}); // the no-half-open enforcer

function onend() {
  // If the writable side ended, then we're ok.
  if (this._writableState.ended) return; // no more data can be written.
  // But allow more writes to happen in this tick.

  process.nextTick(onEndNT, this);
}

function onEndNT(self) {
  self.end();
}

Object.defineProperty(Duplex.prototype, 'destroyed', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function get() {
    if (this._readableState === undefined || this._writableState === undefined) {
      return false;
    }

    return this._readableState.destroyed && this._writableState.destroyed;
  },
  set: function set(value) {
    // we ignore the value if the stream
    // has not been initialized yet
    if (this._readableState === undefined || this._writableState === undefined) {
      return;
    } // backward compatibility, the user is explicitly
    // managing destroyed


    this._readableState.destroyed = value;
    this._writableState.destroyed = value;
  }
});// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
// a passthrough stream.
// basically just the most minimal sort of Transform stream.
// Every written chunk gets output as-is.
'use strict';

module.exports = PassThrough;

var Transform = require('./_stream_transform');

require('inherits')(PassThrough, Transform);

function PassThrough(options) {
  if (!(this instanceof PassThrough)) return new PassThrough(options);
  Transform.call(this, options);
}

PassThrough.prototype._transform = function (chunk, encoding, cb) {
  cb(null, chunk);
};// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
'use strict';

module.exports = Readable;
/*<replacement>*/

var Duplex;
/*</replacement>*/

Readable.ReadableState = ReadableState;
/*<replacement>*/

var EE = require('events').EventEmitter;

var EElistenerCount = function EElistenerCount(emitter, type) {
  return emitter.listeners(type).length;
};
/*</replacement>*/

/*<replacement>*/


var Stream = require('./internal/streams/stream');
/*</replacement>*/


var Buffer = require('buffer').Buffer;

var OurUint8Array = global.Uint8Array || function () {};

function _uint8ArrayToBuffer(chunk) {
  return Buffer.from(chunk);
}

function _isUint8Array(obj) {
  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
}
/*<replacement>*/


var debugUtil = require('util');

var debug;

if (debugUtil && debugUtil.debuglog) {
  debug = debugUtil.debuglog('stream');
} else {
  debug = function debug() {};
}
/*</replacement>*/


var BufferList = require('./internal/streams/buffer_list');

var destroyImpl = require('./internal/streams/destroy');

var _require = require('./internal/streams/state'),
    getHighWaterMark = _require.getHighWaterMark;

var _require$codes = require('../errors').codes,
    ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,
    ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF,
    ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
    ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; // Lazy loaded to improve the startup performance.


var StringDecoder;
var createReadableStreamAsyncIterator;
var from;

require('inherits')(Readable, Stream);

var errorOrDestroy = destroyImpl.errorOrDestroy;
var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];

function prependListener(emitter, event, fn) {
  // Sadly this is not cacheable as some libraries bundle their own
  // event emitter implementation with them.
  if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); // This is a hack to make sure that our error handler is attached before any
  // userland ones.  NEVER DO THIS. This is here only because this code needs
  // to continue to work with older versions of Node.js that do not include
  // the prependListener() method. The goal is to eventually remove this hack.

  if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
}

function ReadableState(options, stream, isDuplex) {
  Duplex = Duplex || require('./_stream_duplex');
  options = options || {}; // Duplex streams are both readable and writable, but share
  // the same options object.
  // However, some cases require setting options to different
  // values for the readable and the writable sides of the duplex stream.
  // These options can be provided separately as readableXXX and writableXXX.

  if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag. Used to make read(n) ignore n and to
  // make all the buffer merging and length checks go away

  this.objectMode = !!options.objectMode;
  if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer
  // Note: 0 is a valid value, means "don't call _read preemptively ever"

  this.highWaterMark = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex); // A linked list is used to store data chunks instead of an array because the
  // linked list can remove elements from the beginning faster than
  // array.shift()

  this.buffer = new BufferList();
  this.length = 0;
  this.pipes = null;
  this.pipesCount = 0;
  this.flowing = null;
  this.ended = false;
  this.endEmitted = false;
  this.reading = false; // a flag to be able to tell if the event 'readable'/'data' is emitted
  // immediately, or on a later tick.  We set this to true at first, because
  // any actions that shouldn't happen until "later" should generally also
  // not happen before the first read call.

  this.sync = true; // whenever we return null, then we set a flag to say
  // that we're awaiting a 'readable' event emission.

  this.needReadable = false;
  this.emittedReadable = false;
  this.readableListening = false;
  this.resumeScheduled = false;
  this.paused = true; // Should close be emitted on destroy. Defaults to true.

  this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'end' (and potentially 'finish')

  this.autoDestroy = !!options.autoDestroy; // has it been destroyed

  this.destroyed = false; // Crypto is kind of old and crusty.  Historically, its default string
  // encoding is 'binary' so we have to make this configurable.
  // Everything else in the universe uses 'utf8', though.

  this.defaultEncoding = options.defaultEncoding || 'utf8'; // the number of writers that are awaiting a drain event in .pipe()s

  this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled

  this.readingMore = false;
  this.decoder = null;
  this.encoding = null;

  if (options.encoding) {
    if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
    this.decoder = new StringDecoder(options.encoding);
    this.encoding = options.encoding;
  }
}

function Readable(options) {
  Duplex = Duplex || require('./_stream_duplex');
  if (!(this instanceof Readable)) return new Readable(options); // Checking for a Stream.Duplex instance is faster here instead of inside
  // the ReadableState constructor, at least with V8 6.5

  var isDuplex = this instanceof Duplex;
  this._readableState = new ReadableState(options, this, isDuplex); // legacy

  this.readable = true;

  if (options) {
    if (typeof options.read === 'function') this._read = options.read;
    if (typeof options.destroy === 'function') this._destroy = options.destroy;
  }

  Stream.call(this);
}

Object.defineProperty(Readable.prototype, 'destroyed', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function get() {
    if (this._readableState === undefined) {
      return false;
    }

    return this._readableState.destroyed;
  },
  set: function set(value) {
    // we ignore the value if the stream
    // has not been initialized yet
    if (!this._readableState) {
      return;
    } // backward compatibility, the user is explicitly
    // managing destroyed


    this._readableState.destroyed = value;
  }
});
Readable.prototype.destroy = destroyImpl.destroy;
Readable.prototype._undestroy = destroyImpl.undestroy;

Readable.prototype._destroy = function (err, cb) {
  cb(err);
}; // Manually shove something into the read() buffer.
// This returns true if the highWaterMark has not been hit yet,
// similar to how Writable.write() returns true if you should
// write() some more.


Readable.prototype.push = function (chunk, encoding) {
  var state = this._readableState;
  var skipChunkCheck;

  if (!state.objectMode) {
    if (typeof chunk === 'string') {
      encoding = encoding || state.defaultEncoding;

      if (encoding !== state.encoding) {
        chunk = Buffer.from(chunk, encoding);
        encoding = '';
      }

      skipChunkCheck = true;
    }
  } else {
    skipChunkCheck = true;
  }

  return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);
}; // Unshift should *always* be something directly out of read()


Readable.prototype.unshift = function (chunk) {
  return readableAddChunk(this, chunk, null, true, false);
};

function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
  debug('readableAddChunk', chunk);
  var state = stream._readableState;

  if (chunk === null) {
    state.reading = false;
    onEofChunk(stream, state);
  } else {
    var er;
    if (!skipChunkCheck) er = chunkInvalid(state, chunk);

    if (er) {
      errorOrDestroy(stream, er);
    } else if (state.objectMode || chunk && chunk.length > 0) {
      if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {
        chunk = _uint8ArrayToBuffer(chunk);
      }

      if (addToFront) {
        if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true);
      } else if (state.ended) {
        errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF());
      } else if (state.destroyed) {
        return false;
      } else {
        state.reading = false;

        if (state.decoder && !encoding) {
          chunk = state.decoder.write(chunk);
          if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);
        } else {
          addChunk(stream, state, chunk, false);
        }
      }
    } else if (!addToFront) {
      state.reading = false;
      maybeReadMore(stream, state);
    }
  } // We can push more data if we are below the highWaterMark.
  // Also, if we have no data yet, we can stand some more bytes.
  // This is to work around cases where hwm=0, such as the repl.


  return !state.ended && (state.length < state.highWaterMark || state.length === 0);
}

function addChunk(stream, state, chunk, addToFront) {
  if (state.flowing && state.length === 0 && !state.sync) {
    state.awaitDrain = 0;
    stream.emit('data', chunk);
  } else {
    // update the buffer info.
    state.length += state.objectMode ? 1 : chunk.length;
    if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
    if (state.needReadable) emitReadable(stream);
  }

  maybeReadMore(stream, state);
}

function chunkInvalid(state, chunk) {
  var er;

  if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
    er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk);
  }

  return er;
}

Readable.prototype.isPaused = function () {
  return this._readableState.flowing === false;
}; // backwards compatibility.


Readable.prototype.setEncoding = function (enc) {
  if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
  var decoder = new StringDecoder(enc);
  this._readableState.decoder = decoder; // If setEncoding(null), decoder.encoding equals utf8

  this._readableState.encoding = this._readableState.decoder.encoding; // Iterate over current buffer to convert already stored Buffers:

  var p = this._readableState.buffer.head;
  var content = '';

  while (p !== null) {
    content += decoder.write(p.data);
    p = p.next;
  }

  this._readableState.buffer.clear();

  if (content !== '') this._readableState.buffer.push(content);
  this._readableState.length = content.length;
  return this;
}; // Don't raise the hwm > 1GB


var MAX_HWM = 0x40000000;

function computeNewHighWaterMark(n) {
  if (n >= MAX_HWM) {
    // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE.
    n = MAX_HWM;
  } else {
    // Get the next highest power of 2 to prevent increasing hwm excessively in
    // tiny amounts
    n--;
    n |= n >>> 1;
    n |= n >>> 2;
    n |= n >>> 4;
    n |= n >>> 8;
    n |= n >>> 16;
    n++;
  }

  return n;
} // This function is designed to be inlinable, so please take care when making
// changes to the function body.


function howMuchToRead(n, state) {
  if (n <= 0 || state.length === 0 && state.ended) return 0;
  if (state.objectMode) return 1;

  if (n !== n) {
    // Only flow one buffer at a time
    if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
  } // If we're asking for more than the current hwm, then raise the hwm.


  if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
  if (n <= state.length) return n; // Don't have enough

  if (!state.ended) {
    state.needReadable = true;
    return 0;
  }

  return state.length;
} // you can override either this method, or the async _read(n) below.


Readable.prototype.read = function (n) {
  debug('read', n);
  n = parseInt(n, 10);
  var state = this._readableState;
  var nOrig = n;
  if (n !== 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we
  // already have a bunch of data in the buffer, then just trigger
  // the 'readable' event and move on.

  if (n === 0 && state.needReadable && ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)) {
    debug('read: emitReadable', state.length, state.ended);
    if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
    return null;
  }

  n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up.

  if (n === 0 && state.ended) {
    if (state.length === 0) endReadable(this);
    return null;
  } // All the actual chunk generation logic needs to be
  // *below* the call to _read.  The reason is that in certain
  // synthetic stream cases, such as passthrough streams, _read
  // may be a completely synchronous operation which may change
  // the state of the read buffer, providing enough data when
  // before there was *not* enough.
  //
  // So, the steps are:
  // 1. Figure out what the state of things will be after we do
  // a read from the buffer.
  //
  // 2. If that resulting state will trigger a _read, then call _read.
  // Note that this may be asynchronous, or synchronous.  Yes, it is
  // deeply ugly to write APIs this way, but that still doesn't mean
  // that the Readable class should behave improperly, as streams are
  // designed to be sync/async agnostic.
  // Take note if the _read call is sync or async (ie, if the read call
  // has returned yet), so that we know whether or not it's safe to emit
  // 'readable' etc.
  //
  // 3. Actually pull the requested chunks out of the buffer and return.
  // if we need a readable event, then we need to do some reading.


  var doRead = state.needReadable;
  debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some

  if (state.length === 0 || state.length - n < state.highWaterMark) {
    doRead = true;
    debug('length less than watermark', doRead);
  } // however, if we've ended, then there's no point, and if we're already
  // reading, then it's unnecessary.


  if (state.ended || state.reading) {
    doRead = false;
    debug('reading or ended', doRead);
  } else if (doRead) {
    debug('do read');
    state.reading = true;
    state.sync = true; // if the length is currently zero, then we *need* a readable event.

    if (state.length === 0) state.needReadable = true; // call internal read method

    this._read(state.highWaterMark);

    state.sync = false; // If _read pushed data synchronously, then `reading` will be false,
    // and we need to re-evaluate how much data we can return to the user.

    if (!state.reading) n = howMuchToRead(nOrig, state);
  }

  var ret;
  if (n > 0) ret = fromList(n, state);else ret = null;

  if (ret === null) {
    state.needReadable = state.length <= state.highWaterMark;
    n = 0;
  } else {
    state.length -= n;
    state.awaitDrain = 0;
  }

  if (state.length === 0) {
    // If we have nothing in the buffer, then we want to know
    // as soon as we *do* get something into the buffer.
    if (!state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick.

    if (nOrig !== n && state.ended) endReadable(this);
  }

  if (ret !== null) this.emit('data', ret);
  return ret;
};

function onEofChunk(stream, state) {
  debug('onEofChunk');
  if (state.ended) return;

  if (state.decoder) {
    var chunk = state.decoder.end();

    if (chunk && chunk.length) {
      state.buffer.push(chunk);
      state.length += state.objectMode ? 1 : chunk.length;
    }
  }

  state.ended = true;

  if (state.sync) {
    // if we are sync, wait until next tick to emit the data.
    // Otherwise we risk emitting data in the flow()
    // the readable code triggers during a read() call
    emitReadable(stream);
  } else {
    // emit 'readable' now to make sure it gets picked up.
    state.needReadable = false;

    if (!state.emittedReadable) {
      state.emittedReadable = true;
      emitReadable_(stream);
    }
  }
} // Don't emit readable right away in sync mode, because this can trigger
// another read() call => stack overflow.  This way, it might trigger
// a nextTick recursion warning, but that's not so bad.


function emitReadable(stream) {
  var state = stream._readableState;
  debug('emitReadable', state.needReadable, state.emittedReadable);
  state.needReadable = false;

  if (!state.emittedReadable) {
    debug('emitReadable', state.flowing);
    state.emittedReadable = true;
    process.nextTick(emitReadable_, stream);
  }
}

function emitReadable_(stream) {
  var state = stream._readableState;
  debug('emitReadable_', state.destroyed, state.length, state.ended);

  if (!state.destroyed && (state.length || state.ended)) {
    stream.emit('readable');
    state.emittedReadable = false;
  } // The stream needs another readable event if
  // 1. It is not flowing, as the flow mechanism will take
  //    care of it.
  // 2. It is not ended.
  // 3. It is below the highWaterMark, so we can schedule
  //    another readable later.


  state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark;
  flow(stream);
} // at this point, the user has presumably seen the 'readable' event,
// and called read() to consume some data.  that may have triggered
// in turn another _read(n) call, in which case reading = true if
// it's in progress.
// However, if we're not ended, or reading, and the length < hwm,
// then go ahead and try to read some more preemptively.


function maybeReadMore(stream, state) {
  if (!state.readingMore) {
    state.readingMore = true;
    process.nextTick(maybeReadMore_, stream, state);
  }
}

function maybeReadMore_(stream, state) {
  // Attempt to read more data if we should.
  //
  // The conditions for reading more data are (one of):
  // - Not enough data buffered (state.length < state.highWaterMark). The loop
  //   is responsible for filling the buffer with enough data if such data
  //   is available. If highWaterMark is 0 and we are not in the flowing mode
  //   we should _not_ attempt to buffer any extra data. We'll get more data
  //   when the stream consumer calls read() instead.
  // - No data in the buffer, and the stream is in flowing mode. In this mode
  //   the loop below is responsible for ensuring read() is called. Failing to
  //   call read here would abort the flow and there's no other mechanism for
  //   continuing the flow if the stream consumer has just subscribed to the
  //   'data' event.
  //
  // In addition to the above conditions to keep reading data, the following
  // conditions prevent the data from being read:
  // - The stream has ended (state.ended).
  // - There is already a pending 'read' operation (state.reading). This is a
  //   case where the the stream has called the implementation defined _read()
  //   method, but they are processing the call asynchronously and have _not_
  //   called push() with new data. In this case we skip performing more
  //   read()s. The execution ends in this method again after the _read() ends
  //   up calling push() with more data.
  while (!state.reading && !state.ended && (state.length < state.highWaterMark || state.flowing && state.length === 0)) {
    var len = state.length;
    debug('maybeReadMore read 0');
    stream.read(0);
    if (len === state.length) // didn't get any data, stop spinning.
      break;
  }

  state.readingMore = false;
} // abstract method.  to be overridden in specific implementation classes.
// call cb(er, data) where data is <= n in length.
// for virtual (non-string, non-buffer) streams, "length" is somewhat
// arbitrary, and perhaps not very meaningful.


Readable.prototype._read = function (n) {
  errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED('_read()'));
};

Readable.prototype.pipe = function (dest, pipeOpts) {
  var src = this;
  var state = this._readableState;

  switch (state.pipesCount) {
    case 0:
      state.pipes = dest;
      break;

    case 1:
      state.pipes = [state.pipes, dest];
      break;

    default:
      state.pipes.push(dest);
      break;
  }

  state.pipesCount += 1;
  debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
  var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
  var endFn = doEnd ? onend : unpipe;
  if (state.endEmitted) process.nextTick(endFn);else src.once('end', endFn);
  dest.on('unpipe', onunpipe);

  function onunpipe(readable, unpipeInfo) {
    debug('onunpipe');

    if (readable === src) {
      if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
        unpipeInfo.hasUnpiped = true;
        cleanup();
      }
    }
  }

  function onend() {
    debug('onend');
    dest.end();
  } // when the dest drains, it reduces the awaitDrain counter
  // on the source.  This would be more elegant with a .once()
  // handler in flow(), but adding and removing repeatedly is
  // too slow.


  var ondrain = pipeOnDrain(src);
  dest.on('drain', ondrain);
  var cleanedUp = false;

  function cleanup() {
    debug('cleanup'); // cleanup event handlers once the pipe is broken

    dest.removeListener('close', onclose);
    dest.removeListener('finish', onfinish);
    dest.removeListener('drain', ondrain);
    dest.removeListener('error', onerror);
    dest.removeListener('unpipe', onunpipe);
    src.removeListener('end', onend);
    src.removeListener('end', unpipe);
    src.removeListener('data', ondata);
    cleanedUp = true; // if the reader is waiting for a drain event from this
    // specific writer, then it would cause it to never start
    // flowing again.
    // So, if this is awaiting a drain, then we just call it now.
    // If we don't know, then assume that we are waiting for one.

    if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
  }

  src.on('data', ondata);

  function ondata(chunk) {
    debug('ondata');
    var ret = dest.write(chunk);
    debug('dest.write', ret);

    if (ret === false) {
      // If the user unpiped during `dest.write()`, it is possible
      // to get stuck in a permanently paused state if that write
      // also returned false.
      // => Check whether `dest` is still a piping destination.
      if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
        debug('false write response, pause', state.awaitDrain);
        state.awaitDrain++;
      }

      src.pause();
    }
  } // if the dest has an error, then stop piping into it.
  // however, don't suppress the throwing behavior for this.


  function onerror(er) {
    debug('onerror', er);
    unpipe();
    dest.removeListener('error', onerror);
    if (EElistenerCount(dest, 'error') === 0) errorOrDestroy(dest, er);
  } // Make sure our error handler is attached before userland ones.


  prependListener(dest, 'error', onerror); // Both close and finish should trigger unpipe, but only once.

  function onclose() {
    dest.removeListener('finish', onfinish);
    unpipe();
  }

  dest.once('close', onclose);

  function onfinish() {
    debug('onfinish');
    dest.removeListener('close', onclose);
    unpipe();
  }

  dest.once('finish', onfinish);

  function unpipe() {
    debug('unpipe');
    src.unpipe(dest);
  } // tell the dest that it's being piped to


  dest.emit('pipe', src); // start the flow if it hasn't been started already.

  if (!state.flowing) {
    debug('pipe resume');
    src.resume();
  }

  return dest;
};

function pipeOnDrain(src) {
  return function pipeOnDrainFunctionResult() {
    var state = src._readableState;
    debug('pipeOnDrain', state.awaitDrain);
    if (state.awaitDrain) state.awaitDrain--;

    if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
      state.flowing = true;
      flow(src);
    }
  };
}

Readable.prototype.unpipe = function (dest) {
  var state = this._readableState;
  var unpipeInfo = {
    hasUnpiped: false
  }; // if we're not piping anywhere, then do nothing.

  if (state.pipesCount === 0) return this; // just one destination.  most common case.

  if (state.pipesCount === 1) {
    // passed in one, but it's not the right one.
    if (dest && dest !== state.pipes) return this;
    if (!dest) dest = state.pipes; // got a match.

    state.pipes = null;
    state.pipesCount = 0;
    state.flowing = false;
    if (dest) dest.emit('unpipe', this, unpipeInfo);
    return this;
  } // slow case. multiple pipe destinations.


  if (!dest) {
    // remove all.
    var dests = state.pipes;
    var len = state.pipesCount;
    state.pipes = null;
    state.pipesCount = 0;
    state.flowing = false;

    for (var i = 0; i < len; i++) {
      dests[i].emit('unpipe', this, {
        hasUnpiped: false
      });
    }

    return this;
  } // try to find the right one.


  var index = indexOf(state.pipes, dest);
  if (index === -1) return this;
  state.pipes.splice(index, 1);
  state.pipesCount -= 1;
  if (state.pipesCount === 1) state.pipes = state.pipes[0];
  dest.emit('unpipe', this, unpipeInfo);
  return this;
}; // set up data events if they are asked for
// Ensure readable listeners eventually get something


Readable.prototype.on = function (ev, fn) {
  var res = Stream.prototype.on.call(this, ev, fn);
  var state = this._readableState;

  if (ev === 'data') {
    // update readableListening so that resume() may be a no-op
    // a few lines down. This is needed to support once('readable').
    state.readableListening = this.listenerCount('readable') > 0; // Try start flowing on next tick if stream isn't explicitly paused

    if (state.flowing !== false) this.resume();
  } else if (ev === 'readable') {
    if (!state.endEmitted && !state.readableListening) {
      state.readableListening = state.needReadable = true;
      state.flowing = false;
      state.emittedReadable = false;
      debug('on readable', state.length, state.reading);

      if (state.length) {
        emitReadable(this);
      } else if (!state.reading) {
        process.nextTick(nReadingNextTick, this);
      }
    }
  }

  return res;
};

Readable.prototype.addListener = Readable.prototype.on;

Readable.prototype.removeListener = function (ev, fn) {
  var res = Stream.prototype.removeListener.call(this, ev, fn);

  if (ev === 'readable') {
    // We need to check if there is someone still listening to
    // readable and reset the state. However this needs to happen
    // after readable has been emitted but before I/O (nextTick) to
    // support once('readable', fn) cycles. This means that calling
    // resume within the same tick will have no
    // effect.
    process.nextTick(updateReadableListening, this);
  }

  return res;
};

Readable.prototype.removeAllListeners = function (ev) {
  var res = Stream.prototype.removeAllListeners.apply(this, arguments);

  if (ev === 'readable' || ev === undefined) {
    // We need to check if there is someone still listening to
    // readable and reset the state. However this needs to happen
    // after readable has been emitted but before I/O (nextTick) to
    // support once('readable', fn) cycles. This means that calling
    // resume within the same tick will have no
    // effect.
    process.nextTick(updateReadableListening, this);
  }

  return res;
};

function updateReadableListening(self) {
  var state = self._readableState;
  state.readableListening = self.listenerCount('readable') > 0;

  if (state.resumeScheduled && !state.paused) {
    // flowing needs to be set to true now, otherwise
    // the upcoming resume will not flow.
    state.flowing = true; // crude way to check if we should resume
  } else if (self.listenerCount('data') > 0) {
    self.resume();
  }
}

function nReadingNextTick(self) {
  debug('readable nexttick read 0');
  self.read(0);
} // pause() and resume() are remnants of the legacy readable stream API
// If the user uses them, then switch into old mode.


Readable.prototype.resume = function () {
  var state = this._readableState;

  if (!state.flowing) {
    debug('resume'); // we flow only if there is no one listening
    // for readable, but we still have to call
    // resume()

    state.flowing = !state.readableListening;
    resume(this, state);
  }

  state.paused = false;
  return this;
};

function resume(stream, state) {
  if (!state.resumeScheduled) {
    state.resumeScheduled = true;
    process.nextTick(resume_, stream, state);
  }
}

function resume_(stream, state) {
  debug('resume', state.reading);

  if (!state.reading) {
    stream.read(0);
  }

  state.resumeScheduled = false;
  stream.emit('resume');
  flow(stream);
  if (state.flowing && !state.reading) stream.read(0);
}

Readable.prototype.pause = function () {
  debug('call pause flowing=%j', this._readableState.flowing);

  if (this._readableState.flowing !== false) {
    debug('pause');
    this._readableState.flowing = false;
    this.emit('pause');
  }

  this._readableState.paused = true;
  return this;
};

function flow(stream) {
  var state = stream._readableState;
  debug('flow', state.flowing);

  while (state.flowing && stream.read() !== null) {
    ;
  }
} // wrap an old-style stream as the async data source.
// This is *not* part of the readable stream interface.
// It is an ugly unfortunate mess of history.


Readable.prototype.wrap = function (stream) {
  var _this = this;

  var state = this._readableState;
  var paused = false;
  stream.on('end', function () {
    debug('wrapped end');

    if (state.decoder && !state.ended) {
      var chunk = state.decoder.end();
      if (chunk && chunk.length) _this.push(chunk);
    }

    _this.push(null);
  });
  stream.on('data', function (chunk) {
    debug('wrapped data');
    if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode

    if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;

    var ret = _this.push(chunk);

    if (!ret) {
      paused = true;
      stream.pause();
    }
  }); // proxy all the other methods.
  // important when wrapping filters and duplexes.

  for (var i in stream) {
    if (this[i] === undefined && typeof stream[i] === 'function') {
      this[i] = function methodWrap(method) {
        return function methodWrapReturnFunction() {
          return stream[method].apply(stream, arguments);
        };
      }(i);
    }
  } // proxy certain important events.


  for (var n = 0; n < kProxyEvents.length; n++) {
    stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));
  } // when we try to consume some more bytes, simply unpause the
  // underlying stream.


  this._read = function (n) {
    debug('wrapped _read', n);

    if (paused) {
      paused = false;
      stream.resume();
    }
  };

  return this;
};

if (typeof Symbol === 'function') {
  Readable.prototype[Symbol.asyncIterator] = function () {
    if (createReadableStreamAsyncIterator === undefined) {
      createReadableStreamAsyncIterator = require('./internal/streams/async_iterator');
    }

    return createReadableStreamAsyncIterator(this);
  };
}

Object.defineProperty(Readable.prototype, 'readableHighWaterMark', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function get() {
    return this._readableState.highWaterMark;
  }
});
Object.defineProperty(Readable.prototype, 'readableBuffer', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function get() {
    return this._readableState && this._readableState.buffer;
  }
});
Object.defineProperty(Readable.prototype, 'readableFlowing', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function get() {
    return this._readableState.flowing;
  },
  set: function set(state) {
    if (this._readableState) {
      this._readableState.flowing = state;
    }
  }
}); // exposed for testing purposes only.

Readable._fromList = fromList;
Object.defineProperty(Readable.prototype, 'readableLength', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function get() {
    return this._readableState.length;
  }
}); // Pluck off n bytes from an array of buffers.
// Length is the combined lengths of all the buffers in the list.
// This function is designed to be inlinable, so please take care when making
// changes to the function body.

function fromList(n, state) {
  // nothing buffered
  if (state.length === 0) return null;
  var ret;
  if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
    // read it all, truncate the list
    if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.first();else ret = state.buffer.concat(state.length);
    state.buffer.clear();
  } else {
    // read part of list
    ret = state.buffer.consume(n, state.decoder);
  }
  return ret;
}

function endReadable(stream) {
  var state = stream._readableState;
  debug('endReadable', state.endEmitted);

  if (!state.endEmitted) {
    state.ended = true;
    process.nextTick(endReadableNT, state, stream);
  }
}

function endReadableNT(state, stream) {
  debug('endReadableNT', state.endEmitted, state.length); // Check that we didn't get one last unshift.

  if (!state.endEmitted && state.length === 0) {
    state.endEmitted = true;
    stream.readable = false;
    stream.emit('end');

    if (state.autoDestroy) {
      // In case of duplex streams we need a way to detect
      // if the writable side is ready for autoDestroy as well
      var wState = stream._writableState;

      if (!wState || wState.autoDestroy && wState.finished) {
        stream.destroy();
      }
    }
  }
}

if (typeof Symbol === 'function') {
  Readable.from = function (iterable, opts) {
    if (from === undefined) {
      from = require('./internal/streams/from');
    }

    return from(Readable, iterable, opts);
  };
}

function indexOf(xs, x) {
  for (var i = 0, l = xs.length; i < l; i++) {
    if (xs[i] === x) return i;
  }

  return -1;
}// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
// a transform stream is a readable/writable stream where you do
// something with the data.  Sometimes it's called a "filter",
// but that's not a great name for it, since that implies a thing where
// some bits pass through, and others are simply ignored.  (That would
// be a valid example of a transform, of course.)
//
// While the output is causally related to the input, it's not a
// necessarily symmetric or synchronous transformation.  For example,
// a zlib stream might take multiple plain-text writes(), and then
// emit a single compressed chunk some time in the future.
//
// Here's how this works:
//
// The Transform stream has all the aspects of the readable and writable
// stream classes.  When you write(chunk), that calls _write(chunk,cb)
// internally, and returns false if there's a lot of pending writes
// buffered up.  When you call read(), that calls _read(n) until
// there's enough pending readable data buffered up.
//
// In a transform stream, the written data is placed in a buffer.  When
// _read(n) is called, it transforms the queued up data, calling the
// buffered _write cb's as it consumes chunks.  If consuming a single
// written chunk would result in multiple output chunks, then the first
// outputted bit calls the readcb, and subsequent chunks just go into
// the read buffer, and will cause it to emit 'readable' if necessary.
//
// This way, back-pressure is actually determined by the reading side,
// since _read has to be called to start processing a new chunk.  However,
// a pathological inflate type of transform can cause excessive buffering
// here.  For example, imagine a stream where every byte of input is
// interpreted as an integer from 0-255, and then results in that many
// bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in
// 1kb of data being output.  In this case, you could write a very small
// amount of input, and end up with a very large amount of output.  In
// such a pathological inflating mechanism, there'd be no way to tell
// the system to stop doing the transform.  A single 4MB write could
// cause the system to run out of memory.
//
// However, even in such a pathological case, only a single written chunk
// would be consumed, and then the rest would wait (un-transformed) until
// the results of the previous transformed chunk were consumed.
'use strict';

module.exports = Transform;

var _require$codes = require('../errors').codes,
    ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
    ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK,
    ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING,
    ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0;

var Duplex = require('./_stream_duplex');

require('inherits')(Transform, Duplex);

function afterTransform(er, data) {
  var ts = this._transformState;
  ts.transforming = false;
  var cb = ts.writecb;

  if (cb === null) {
    return this.emit('error', new ERR_MULTIPLE_CALLBACK());
  }

  ts.writechunk = null;
  ts.writecb = null;
  if (data != null) // single equals check for both `null` and `undefined`
    this.push(data);
  cb(er);
  var rs = this._readableState;
  rs.reading = false;

  if (rs.needReadable || rs.length < rs.highWaterMark) {
    this._read(rs.highWaterMark);
  }
}

function Transform(options) {
  if (!(this instanceof Transform)) return new Transform(options);
  Duplex.call(this, options);
  this._transformState = {
    afterTransform: afterTransform.bind(this),
    needTransform: false,
    transforming: false,
    writecb: null,
    writechunk: null,
    writeencoding: null
  }; // start out asking for a readable event once data is transformed.

  this._readableState.needReadable = true; // we have implemented the _read method, and done the other things
  // that Readable wants before the first _read call, so unset the
  // sync guard flag.

  this._readableState.sync = false;

  if (options) {
    if (typeof options.transform === 'function') this._transform = options.transform;
    if (typeof options.flush === 'function') this._flush = options.flush;
  } // When the writable side finishes, then flush out anything remaining.


  this.on('prefinish', prefinish);
}

function prefinish() {
  var _this = this;

  if (typeof this._flush === 'function' && !this._readableState.destroyed) {
    this._flush(function (er, data) {
      done(_this, er, data);
    });
  } else {
    done(this, null, null);
  }
}

Transform.prototype.push = function (chunk, encoding) {
  this._transformState.needTransform = false;
  return Duplex.prototype.push.call(this, chunk, encoding);
}; // This is the part where you do stuff!
// override this function in implementation classes.
// 'chunk' is an input chunk.
//
// Call `push(newChunk)` to pass along transformed output
// to the readable side.  You may call 'push' zero or more times.
//
// Call `cb(err)` when you are done with this chunk.  If you pass
// an error, then that'll put the hurt on the whole operation.  If you
// never call cb(), then you'll never get another chunk.


Transform.prototype._transform = function (chunk, encoding, cb) {
  cb(new ERR_METHOD_NOT_IMPLEMENTED('_transform()'));
};

Transform.prototype._write = function (chunk, encoding, cb) {
  var ts = this._transformState;
  ts.writecb = cb;
  ts.writechunk = chunk;
  ts.writeencoding = encoding;

  if (!ts.transforming) {
    var rs = this._readableState;
    if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
  }
}; // Doesn't matter what the args are here.
// _transform does all the work.
// That we got here means that the readable side wants more data.


Transform.prototype._read = function (n) {
  var ts = this._transformState;

  if (ts.writechunk !== null && !ts.transforming) {
    ts.transforming = true;

    this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
  } else {
    // mark that we need a transform, so that any data that comes in
    // will get processed, now that we've asked for it.
    ts.needTransform = true;
  }
};

Transform.prototype._destroy = function (err, cb) {
  Duplex.prototype._destroy.call(this, err, function (err2) {
    cb(err2);
  });
};

function done(stream, er, data) {
  if (er) return stream.emit('error', er);
  if (data != null) // single equals check for both `null` and `undefined`
    stream.push(data); // TODO(BridgeAR): Write a test for these two error cases
  // if there's nothing in the write buffer, then that means
  // that nothing more will ever be provided

  if (stream._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0();
  if (stream._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING();
  return stream.push(null);
}// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
// A bit simpler than readable streams.
// Implement an async ._write(chunk, encoding, cb), and it'll handle all
// the drain event emission and buffering.
'use strict';

module.exports = Writable;
/* <replacement> */

function WriteReq(chunk, encoding, cb) {
  this.chunk = chunk;
  this.encoding = encoding;
  this.callback = cb;
  this.next = null;
} // It seems a linked list but it is not
// there will be only 2 of these for each stream


function CorkedRequest(state) {
  var _this = this;

  this.next = null;
  this.entry = null;

  this.finish = function () {
    onCorkedFinish(_this, state);
  };
}
/* </replacement> */

/*<replacement>*/


var Duplex;
/*</replacement>*/

Writable.WritableState = WritableState;
/*<replacement>*/

var internalUtil = {
  deprecate: require('util-deprecate')
};
/*</replacement>*/

/*<replacement>*/

var Stream = require('./internal/streams/stream');
/*</replacement>*/


var Buffer = require('buffer').Buffer;

var OurUint8Array = global.Uint8Array || function () {};

function _uint8ArrayToBuffer(chunk) {
  return Buffer.from(chunk);
}

function _isUint8Array(obj) {
  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
}

var destroyImpl = require('./internal/streams/destroy');

var _require = require('./internal/streams/state'),
    getHighWaterMark = _require.getHighWaterMark;

var _require$codes = require('../errors').codes,
    ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,
    ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
    ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK,
    ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE,
    ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED,
    ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES,
    ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END,
    ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING;

var errorOrDestroy = destroyImpl.errorOrDestroy;

require('inherits')(Writable, Stream);

function nop() {}

function WritableState(options, stream, isDuplex) {
  Duplex = Duplex || require('./_stream_duplex');
  options = options || {}; // Duplex streams are both readable and writable, but share
  // the same options object.
  // However, some cases require setting options to different
  // values for the readable and the writable sides of the duplex stream,
  // e.g. options.readableObjectMode vs. options.writableObjectMode, etc.

  if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag to indicate whether or not this stream
  // contains buffers or objects.

  this.objectMode = !!options.objectMode;
  if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false
  // Note: 0 is a valid value, means that we always return false if
  // the entire buffer is not flushed immediately on write()

  this.highWaterMark = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex); // if _final has been called

  this.finalCalled = false; // drain event flag.

  this.needDrain = false; // at the start of calling end()

  this.ending = false; // when end() has been called, and returned

  this.ended = false; // when 'finish' is emitted

  this.finished = false; // has it been destroyed

  this.destroyed = false; // should we decode strings into buffers before passing to _write?
  // this is here so that some node-core streams can optimize string
  // handling at a lower level.

  var noDecode = options.decodeStrings === false;
  this.decodeStrings = !noDecode; // Crypto is kind of old and crusty.  Historically, its default string
  // encoding is 'binary' so we have to make this configurable.
  // Everything else in the universe uses 'utf8', though.

  this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement
  // of how much we're waiting to get pushed to some underlying
  // socket or file.

  this.length = 0; // a flag to see when we're in the middle of a write.

  this.writing = false; // when true all writes will be buffered until .uncork() call

  this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately,
  // or on a later tick.  We set this to true at first, because any
  // actions that shouldn't happen until "later" should generally also
  // not happen before the first write call.

  this.sync = true; // a flag to know if we're processing previously buffered items, which
  // may call the _write() callback in the same tick, so that we don't
  // end up in an overlapped onwrite situation.

  this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb)

  this.onwrite = function (er) {
    onwrite(stream, er);
  }; // the callback that the user supplies to write(chunk,encoding,cb)


  this.writecb = null; // the amount that is being written when _write is called.

  this.writelen = 0;
  this.bufferedRequest = null;
  this.lastBufferedRequest = null; // number of pending user-supplied write callbacks
  // this must be 0 before 'finish' can be emitted

  this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs
  // This is relevant for synchronous Transform streams

  this.prefinished = false; // True if the error was already emitted and should not be thrown again

  this.errorEmitted = false; // Should close be emitted on destroy. Defaults to true.

  this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'finish' (and potentially 'end')

  this.autoDestroy = !!options.autoDestroy; // count buffered requests

  this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always
  // one allocated and free to use, and we maintain at most two

  this.corkedRequestsFree = new CorkedRequest(this);
}

WritableState.prototype.getBuffer = function getBuffer() {
  var current = this.bufferedRequest;
  var out = [];

  while (current) {
    out.push(current);
    current = current.next;
  }

  return out;
};

(function () {
  try {
    Object.defineProperty(WritableState.prototype, 'buffer', {
      get: internalUtil.deprecate(function writableStateBufferGetter() {
        return this.getBuffer();
      }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')
    });
  } catch (_) {}
})(); // Test _writableState for inheritance to account for Duplex streams,
// whose prototype chain only points to Readable.


var realHasInstance;

if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {
  realHasInstance = Function.prototype[Symbol.hasInstance];
  Object.defineProperty(Writable, Symbol.hasInstance, {
    value: function value(object) {
      if (realHasInstance.call(this, object)) return true;
      if (this !== Writable) return false;
      return object && object._writableState instanceof WritableState;
    }
  });
} else {
  realHasInstance = function realHasInstance(object) {
    return object instanceof this;
  };
}

function Writable(options) {
  Duplex = Duplex || require('./_stream_duplex'); // Writable ctor is applied to Duplexes, too.
  // `realHasInstance` is necessary because using plain `instanceof`
  // would return false, as no `_writableState` property is attached.
  // Trying to use the custom `instanceof` for Writable here will also break the
  // Node.js LazyTransform implementation, which has a non-trivial getter for
  // `_writableState` that would lead to infinite recursion.
  // Checking for a Stream.Duplex instance is faster here instead of inside
  // the WritableState constructor, at least with V8 6.5

  var isDuplex = this instanceof Duplex;
  if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options);
  this._writableState = new WritableState(options, this, isDuplex); // legacy.

  this.writable = true;

  if (options) {
    if (typeof options.write === 'function') this._write = options.write;
    if (typeof options.writev === 'function') this._writev = options.writev;
    if (typeof options.destroy === 'function') this._destroy = options.destroy;
    if (typeof options.final === 'function') this._final = options.final;
  }

  Stream.call(this);
} // Otherwise people can pipe Writable streams, which is just wrong.


Writable.prototype.pipe = function () {
  errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE());
};

function writeAfterEnd(stream, cb) {
  var er = new ERR_STREAM_WRITE_AFTER_END(); // TODO: defer error events consistently everywhere, not just the cb

  errorOrDestroy(stream, er);
  process.nextTick(cb, er);
} // Checks that a user-supplied chunk is valid, especially for the particular
// mode the stream is in. Currently this means that `null` is never accepted
// and undefined/non-string values are only allowed in object mode.


function validChunk(stream, state, chunk, cb) {
  var er;

  if (chunk === null) {
    er = new ERR_STREAM_NULL_VALUES();
  } else if (typeof chunk !== 'string' && !state.objectMode) {
    er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk);
  }

  if (er) {
    errorOrDestroy(stream, er);
    process.nextTick(cb, er);
    return false;
  }

  return true;
}

Writable.prototype.write = function (chunk, encoding, cb) {
  var state = this._writableState;
  var ret = false;

  var isBuf = !state.objectMode && _isUint8Array(chunk);

  if (isBuf && !Buffer.isBuffer(chunk)) {
    chunk = _uint8ArrayToBuffer(chunk);
  }

  if (typeof encoding === 'function') {
    cb = encoding;
    encoding = null;
  }

  if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
  if (typeof cb !== 'function') cb = nop;
  if (state.ending) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {
    state.pendingcb++;
    ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);
  }
  return ret;
};

Writable.prototype.cork = function () {
  this._writableState.corked++;
};

Writable.prototype.uncork = function () {
  var state = this._writableState;

  if (state.corked) {
    state.corked--;
    if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
  }
};

Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
  // node::ParseEncoding() requires lower case.
  if (typeof encoding === 'string') encoding = encoding.toLowerCase();
  if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding);
  this._writableState.defaultEncoding = encoding;
  return this;
};

Object.defineProperty(Writable.prototype, 'writableBuffer', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function get() {
    return this._writableState && this._writableState.getBuffer();
  }
});

function decodeChunk(state, chunk, encoding) {
  if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
    chunk = Buffer.from(chunk, encoding);
  }

  return chunk;
}

Object.defineProperty(Writable.prototype, 'writableHighWaterMark', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function get() {
    return this._writableState.highWaterMark;
  }
}); // if we're already writing something, then just put this
// in the queue, and wait our turn.  Otherwise, call _write
// If we return false, then we need a drain event, so set that flag.

function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {
  if (!isBuf) {
    var newChunk = decodeChunk(state, chunk, encoding);

    if (chunk !== newChunk) {
      isBuf = true;
      encoding = 'buffer';
      chunk = newChunk;
    }
  }

  var len = state.objectMode ? 1 : chunk.length;
  state.length += len;
  var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false.

  if (!ret) state.needDrain = true;

  if (state.writing || state.corked) {
    var last = state.lastBufferedRequest;
    state.lastBufferedRequest = {
      chunk: chunk,
      encoding: encoding,
      isBuf: isBuf,
      callback: cb,
      next: null
    };

    if (last) {
      last.next = state.lastBufferedRequest;
    } else {
      state.bufferedRequest = state.lastBufferedRequest;
    }

    state.bufferedRequestCount += 1;
  } else {
    doWrite(stream, state, false, len, chunk, encoding, cb);
  }

  return ret;
}

function doWrite(stream, state, writev, len, chunk, encoding, cb) {
  state.writelen = len;
  state.writecb = cb;
  state.writing = true;
  state.sync = true;
  if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write'));else if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
  state.sync = false;
}

function onwriteError(stream, state, sync, er, cb) {
  --state.pendingcb;

  if (sync) {
    // defer the callback if we are being called synchronously
    // to avoid piling up things on the stack
    process.nextTick(cb, er); // this can emit finish, and it will always happen
    // after error

    process.nextTick(finishMaybe, stream, state);
    stream._writableState.errorEmitted = true;
    errorOrDestroy(stream, er);
  } else {
    // the caller expect this to happen before if
    // it is async
    cb(er);
    stream._writableState.errorEmitted = true;
    errorOrDestroy(stream, er); // this can emit finish, but finish must
    // always follow error

    finishMaybe(stream, state);
  }
}

function onwriteStateUpdate(state) {
  state.writing = false;
  state.writecb = null;
  state.length -= state.writelen;
  state.writelen = 0;
}

function onwrite(stream, er) {
  var state = stream._writableState;
  var sync = state.sync;
  var cb = state.writecb;
  if (typeof cb !== 'function') throw new ERR_MULTIPLE_CALLBACK();
  onwriteStateUpdate(state);
  if (er) onwriteError(stream, state, sync, er, cb);else {
    // Check if we're actually ready to finish, but don't emit yet
    var finished = needFinish(state) || stream.destroyed;

    if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
      clearBuffer(stream, state);
    }

    if (sync) {
      process.nextTick(afterWrite, stream, state, finished, cb);
    } else {
      afterWrite(stream, state, finished, cb);
    }
  }
}

function afterWrite(stream, state, finished, cb) {
  if (!finished) onwriteDrain(stream, state);
  state.pendingcb--;
  cb();
  finishMaybe(stream, state);
} // Must force callback to be called on nextTick, so that we don't
// emit 'drain' before the write() consumer gets the 'false' return
// value, and has a chance to attach a 'drain' listener.


function onwriteDrain(stream, state) {
  if (state.length === 0 && state.needDrain) {
    state.needDrain = false;
    stream.emit('drain');
  }
} // if there's something in the buffer waiting, then process it


function clearBuffer(stream, state) {
  state.bufferProcessing = true;
  var entry = state.bufferedRequest;

  if (stream._writev && entry && entry.next) {
    // Fast case, write everything using _writev()
    var l = state.bufferedRequestCount;
    var buffer = new Array(l);
    var holder = state.corkedRequestsFree;
    holder.entry = entry;
    var count = 0;
    var allBuffers = true;

    while (entry) {
      buffer[count] = entry;
      if (!entry.isBuf) allBuffers = false;
      entry = entry.next;
      count += 1;
    }

    buffer.allBuffers = allBuffers;
    doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is almost always async, defer these to save a bit of time
    // as the hot path ends with doWrite

    state.pendingcb++;
    state.lastBufferedRequest = null;

    if (holder.next) {
      state.corkedRequestsFree = holder.next;
      holder.next = null;
    } else {
      state.corkedRequestsFree = new CorkedRequest(state);
    }

    state.bufferedRequestCount = 0;
  } else {
    // Slow case, write chunks one-by-one
    while (entry) {
      var chunk = entry.chunk;
      var encoding = entry.encoding;
      var cb = entry.callback;
      var len = state.objectMode ? 1 : chunk.length;
      doWrite(stream, state, false, len, chunk, encoding, cb);
      entry = entry.next;
      state.bufferedRequestCount--; // if we didn't call the onwrite immediately, then
      // it means that we need to wait until it does.
      // also, that means that the chunk and cb are currently
      // being processed, so move the buffer counter past them.

      if (state.writing) {
        break;
      }
    }

    if (entry === null) state.lastBufferedRequest = null;
  }

  state.bufferedRequest = entry;
  state.bufferProcessing = false;
}

Writable.prototype._write = function (chunk, encoding, cb) {
  cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()'));
};

Writable.prototype._writev = null;

Writable.prototype.end = function (chunk, encoding, cb) {
  var state = this._writableState;

  if (typeof chunk === 'function') {
    cb = chunk;
    chunk = null;
    encoding = null;
  } else if (typeof encoding === 'function') {
    cb = encoding;
    encoding = null;
  }

  if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks

  if (state.corked) {
    state.corked = 1;
    this.uncork();
  } // ignore unnecessary end() calls.


  if (!state.ending) endWritable(this, state, cb);
  return this;
};

Object.defineProperty(Writable.prototype, 'writableLength', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function get() {
    return this._writableState.length;
  }
});

function needFinish(state) {
  return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
}

function callFinal(stream, state) {
  stream._final(function (err) {
    state.pendingcb--;

    if (err) {
      errorOrDestroy(stream, err);
    }

    state.prefinished = true;
    stream.emit('prefinish');
    finishMaybe(stream, state);
  });
}

function prefinish(stream, state) {
  if (!state.prefinished && !state.finalCalled) {
    if (typeof stream._final === 'function' && !state.destroyed) {
      state.pendingcb++;
      state.finalCalled = true;
      process.nextTick(callFinal, stream, state);
    } else {
      state.prefinished = true;
      stream.emit('prefinish');
    }
  }
}

function finishMaybe(stream, state) {
  var need = needFinish(state);

  if (need) {
    prefinish(stream, state);

    if (state.pendingcb === 0) {
      state.finished = true;
      stream.emit('finish');

      if (state.autoDestroy) {
        // In case of duplex streams we need a way to detect
        // if the readable side is ready for autoDestroy as well
        var rState = stream._readableState;

        if (!rState || rState.autoDestroy && rState.endEmitted) {
          stream.destroy();
        }
      }
    }
  }

  return need;
}

function endWritable(stream, state, cb) {
  state.ending = true;
  finishMaybe(stream, state);

  if (cb) {
    if (state.finished) process.nextTick(cb);else stream.once('finish', cb);
  }

  state.ended = true;
  stream.writable = false;
}

function onCorkedFinish(corkReq, state, err) {
  var entry = corkReq.entry;
  corkReq.entry = null;

  while (entry) {
    var cb = entry.callback;
    state.pendingcb--;
    cb(err);
    entry = entry.next;
  } // reuse the free corkReq.


  state.corkedRequestsFree.next = corkReq;
}

Object.defineProperty(Writable.prototype, 'destroyed', {
  // making it explicit this property is not enumerable
  // because otherwise some prototype manipulation in
  // userland will fail
  enumerable: false,
  get: function get() {
    if (this._writableState === undefined) {
      return false;
    }

    return this._writableState.destroyed;
  },
  set: function set(value) {
    // we ignore the value if the stream
    // has not been initialized yet
    if (!this._writableState) {
      return;
    } // backward compatibility, the user is explicitly
    // managing destroyed


    this._writableState.destroyed = value;
  }
});
Writable.prototype.destroy = destroyImpl.destroy;
Writable.prototype._undestroy = destroyImpl.undestroy;

Writable.prototype._destroy = function (err, cb) {
  cb(err);
};'use strict';

var _Object$setPrototypeO;

function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }

var finished = require('./end-of-stream');

var kLastResolve = Symbol('lastResolve');
var kLastReject = Symbol('lastReject');
var kError = Symbol('error');
var kEnded = Symbol('ended');
var kLastPromise = Symbol('lastPromise');
var kHandlePromise = Symbol('handlePromise');
var kStream = Symbol('stream');

function createIterResult(value, done) {
  return {
    value: value,
    done: done
  };
}

function readAndResolve(iter) {
  var resolve = iter[kLastResolve];

  if (resolve !== null) {
    var data = iter[kStream].read(); // we defer if data is null
    // we can be expecting either 'end' or
    // 'error'

    if (data !== null) {
      iter[kLastPromise] = null;
      iter[kLastResolve] = null;
      iter[kLastReject] = null;
      resolve(createIterResult(data, false));
    }
  }
}

function onReadable(iter) {
  // we wait for the next tick, because it might
  // emit an error with process.nextTick
  process.nextTick(readAndResolve, iter);
}

function wrapForNext(lastPromise, iter) {
  return function (resolve, reject) {
    lastPromise.then(function () {
      if (iter[kEnded]) {
        resolve(createIterResult(undefined, true));
        return;
      }

      iter[kHandlePromise](resolve, reject);
    }, reject);
  };
}

var AsyncIteratorPrototype = Object.getPrototypeOf(function () {});
var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = {
  get stream() {
    return this[kStream];
  },

  next: function next() {
    var _this = this;

    // if we have detected an error in the meanwhile
    // reject straight away
    var error = this[kError];

    if (error !== null) {
      return Promise.reject(error);
    }

    if (this[kEnded]) {
      return Promise.resolve(createIterResult(undefined, true));
    }

    if (this[kStream].destroyed) {
      // We need to defer via nextTick because if .destroy(err) is
      // called, the error will be emitted via nextTick, and
      // we cannot guarantee that there is no error lingering around
      // waiting to be emitted.
      return new Promise(function (resolve, reject) {
        process.nextTick(function () {
          if (_this[kError]) {
            reject(_this[kError]);
          } else {
            resolve(createIterResult(undefined, true));
          }
        });
      });
    } // if we have multiple next() calls
    // we will wait for the previous Promise to finish
    // this logic is optimized to support for await loops,
    // where next() is only called once at a time


    var lastPromise = this[kLastPromise];
    var promise;

    if (lastPromise) {
      promise = new Promise(wrapForNext(lastPromise, this));
    } else {
      // fast path needed to support multiple this.push()
      // without triggering the next() queue
      var data = this[kStream].read();

      if (data !== null) {
        return Promise.resolve(createIterResult(data, false));
      }

      promise = new Promise(this[kHandlePromise]);
    }

    this[kLastPromise] = promise;
    return promise;
  }
}, _defineProperty(_Object$setPrototypeO, Symbol.asyncIterator, function () {
  return this;
}), _defineProperty(_Object$setPrototypeO, "return", function _return() {
  var _this2 = this;

  // destroy(err, cb) is a private API
  // we can guarantee we have that here, because we control the
  // Readable class this is attached to
  return new Promise(function (resolve, reject) {
    _this2[kStream].destroy(null, function (err) {
      if (err) {
        reject(err);
        return;
      }

      resolve(createIterResult(undefined, true));
    });
  });
}), _Object$setPrototypeO), AsyncIteratorPrototype);

var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) {
  var _Object$create;

  var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, {
    value: stream,
    writable: true
  }), _defineProperty(_Object$create, kLastResolve, {
    value: null,
    writable: true
  }), _defineProperty(_Object$create, kLastReject, {
    value: null,
    writable: true
  }), _defineProperty(_Object$create, kError, {
    value: null,
    writable: true
  }), _defineProperty(_Object$create, kEnded, {
    value: stream._readableState.endEmitted,
    writable: true
  }), _defineProperty(_Object$create, kHandlePromise, {
    value: function value(resolve, reject) {
      var data = iterator[kStream].read();

      if (data) {
        iterator[kLastPromise] = null;
        iterator[kLastResolve] = null;
        iterator[kLastReject] = null;
        resolve(createIterResult(data, false));
      } else {
        iterator[kLastResolve] = resolve;
        iterator[kLastReject] = reject;
      }
    },
    writable: true
  }), _Object$create));
  iterator[kLastPromise] = null;
  finished(stream, function (err) {
    if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') {
      var reject = iterator[kLastReject]; // reject if we are waiting for data in the Promise
      // returned by next() and store the error

      if (reject !== null) {
        iterator[kLastPromise] = null;
        iterator[kLastResolve] = null;
        iterator[kLastReject] = null;
        reject(err);
      }

      iterator[kError] = err;
      return;
    }

    var resolve = iterator[kLastResolve];

    if (resolve !== null) {
      iterator[kLastPromise] = null;
      iterator[kLastResolve] = null;
      iterator[kLastReject] = null;
      resolve(createIterResult(undefined, true));
    }

    iterator[kEnded] = true;
  });
  stream.on('readable', onReadable.bind(null, iterator));
  return iterator;
};

module.exports = createReadableStreamAsyncIterator;'use strict';

function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }

function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }

function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var _require = require('buffer'),
    Buffer = _require.Buffer;

var _require2 = require('util'),
    inspect = _require2.inspect;

var custom = inspect && inspect.custom || 'inspect';

function copyBuffer(src, target, offset) {
  Buffer.prototype.copy.call(src, target, offset);
}

module.exports =
/*#__PURE__*/
function () {
  function BufferList() {
    _classCallCheck(this, BufferList);

    this.head = null;
    this.tail = null;
    this.length = 0;
  }

  _createClass(BufferList, [{
    key: "push",
    value: function push(v) {
      var entry = {
        data: v,
        next: null
      };
      if (this.length > 0) this.tail.next = entry;else this.head = entry;
      this.tail = entry;
      ++this.length;
    }
  }, {
    key: "unshift",
    value: function unshift(v) {
      var entry = {
        data: v,
        next: this.head
      };
      if (this.length === 0) this.tail = entry;
      this.head = entry;
      ++this.length;
    }
  }, {
    key: "shift",
    value: function shift() {
      if (this.length === 0) return;
      var ret = this.head.data;
      if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
      --this.length;
      return ret;
    }
  }, {
    key: "clear",
    value: function clear() {
      this.head = this.tail = null;
      this.length = 0;
    }
  }, {
    key: "join",
    value: function join(s) {
      if (this.length === 0) return '';
      var p = this.head;
      var ret = '' + p.data;

      while (p = p.next) {
        ret += s + p.data;
      }

      return ret;
    }
  }, {
    key: "concat",
    value: function concat(n) {
      if (this.length === 0) return Buffer.alloc(0);
      var ret = Buffer.allocUnsafe(n >>> 0);
      var p = this.head;
      var i = 0;

      while (p) {
        copyBuffer(p.data, ret, i);
        i += p.data.length;
        p = p.next;
      }

      return ret;
    } // Consumes a specified amount of bytes or characters from the buffered data.

  }, {
    key: "consume",
    value: function consume(n, hasStrings) {
      var ret;

      if (n < this.head.data.length) {
        // `slice` is the same for buffers and strings.
        ret = this.head.data.slice(0, n);
        this.head.data = this.head.data.slice(n);
      } else if (n === this.head.data.length) {
        // First chunk is a perfect match.
        ret = this.shift();
      } else {
        // Result spans more than one buffer.
        ret = hasStrings ? this._getString(n) : this._getBuffer(n);
      }

      return ret;
    }
  }, {
    key: "first",
    value: function first() {
      return this.head.data;
    } // Consumes a specified amount of characters from the buffered data.

  }, {
    key: "_getString",
    value: function _getString(n) {
      var p = this.head;
      var c = 1;
      var ret = p.data;
      n -= ret.length;

      while (p = p.next) {
        var str = p.data;
        var nb = n > str.length ? str.length : n;
        if (nb === str.length) ret += str;else ret += str.slice(0, n);
        n -= nb;

        if (n === 0) {
          if (nb === str.length) {
            ++c;
            if (p.next) this.head = p.next;else this.head = this.tail = null;
          } else {
            this.head = p;
            p.data = str.slice(nb);
          }

          break;
        }

        ++c;
      }

      this.length -= c;
      return ret;
    } // Consumes a specified amount of bytes from the buffered data.

  }, {
    key: "_getBuffer",
    value: function _getBuffer(n) {
      var ret = Buffer.allocUnsafe(n);
      var p = this.head;
      var c = 1;
      p.data.copy(ret);
      n -= p.data.length;

      while (p = p.next) {
        var buf = p.data;
        var nb = n > buf.length ? buf.length : n;
        buf.copy(ret, ret.length - n, 0, nb);
        n -= nb;

        if (n === 0) {
          if (nb === buf.length) {
            ++c;
            if (p.next) this.head = p.next;else this.head = this.tail = null;
          } else {
            this.head = p;
            p.data = buf.slice(nb);
          }

          break;
        }

        ++c;
      }

      this.length -= c;
      return ret;
    } // Make sure the linked list only shows the minimal necessary information.

  }, {
    key: custom,
    value: function value(_, options) {
      return inspect(this, _objectSpread({}, options, {
        // Only inspect one level.
        depth: 0,
        // It should not recurse.
        customInspect: false
      }));
    }
  }]);

  return BufferList;
}();'use strict'; // undocumented cb() API, needed for core, not for public API

function destroy(err, cb) {
  var _this = this;

  var readableDestroyed = this._readableState && this._readableState.destroyed;
  var writableDestroyed = this._writableState && this._writableState.destroyed;

  if (readableDestroyed || writableDestroyed) {
    if (cb) {
      cb(err);
    } else if (err) {
      if (!this._writableState) {
        process.nextTick(emitErrorNT, this, err);
      } else if (!this._writableState.errorEmitted) {
        this._writableState.errorEmitted = true;
        process.nextTick(emitErrorNT, this, err);
      }
    }

    return this;
  } // we set destroyed to true before firing error callbacks in order
  // to make it re-entrance safe in case destroy() is called within callbacks


  if (this._readableState) {
    this._readableState.destroyed = true;
  } // if this is a duplex stream mark the writable part as destroyed as well


  if (this._writableState) {
    this._writableState.destroyed = true;
  }

  this._destroy(err || null, function (err) {
    if (!cb && err) {
      if (!_this._writableState) {
        process.nextTick(emitErrorAndCloseNT, _this, err);
      } else if (!_this._writableState.errorEmitted) {
        _this._writableState.errorEmitted = true;
        process.nextTick(emitErrorAndCloseNT, _this, err);
      } else {
        process.nextTick(emitCloseNT, _this);
      }
    } else if (cb) {
      process.nextTick(emitCloseNT, _this);
      cb(err);
    } else {
      process.nextTick(emitCloseNT, _this);
    }
  });

  return this;
}

function emitErrorAndCloseNT(self, err) {
  emitErrorNT(self, err);
  emitCloseNT(self);
}

function emitCloseNT(self) {
  if (self._writableState && !self._writableState.emitClose) return;
  if (self._readableState && !self._readableState.emitClose) return;
  self.emit('close');
}

function undestroy() {
  if (this._readableState) {
    this._readableState.destroyed = false;
    this._readableState.reading = false;
    this._readableState.ended = false;
    this._readableState.endEmitted = false;
  }

  if (this._writableState) {
    this._writableState.destroyed = false;
    this._writableState.ended = false;
    this._writableState.ending = false;
    this._writableState.finalCalled = false;
    this._writableState.prefinished = false;
    this._writableState.finished = false;
    this._writableState.errorEmitted = false;
  }
}

function emitErrorNT(self, err) {
  self.emit('error', err);
}

function errorOrDestroy(stream, err) {
  // We have tests that rely on errors being emitted
  // in the same tick, so changing this is semver major.
  // For now when you opt-in to autoDestroy we allow
  // the error to be emitted nextTick. In a future
  // semver major update we should change the default to this.
  var rState = stream._readableState;
  var wState = stream._writableState;
  if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream.destroy(err);else stream.emit('error', err);
}

module.exports = {
  destroy: destroy,
  undestroy: undestroy,
  errorOrDestroy: errorOrDestroy
};// Ported from https://github.com/mafintosh/end-of-stream with
// permission from the author, Mathias Buus (@mafintosh).
'use strict';

var ERR_STREAM_PREMATURE_CLOSE = require('../../../errors').codes.ERR_STREAM_PREMATURE_CLOSE;

function once(callback) {
  var called = false;
  return function () {
    if (called) return;
    called = true;

    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
      args[_key] = arguments[_key];
    }

    callback.apply(this, args);
  };
}

function noop() {}

function isRequest(stream) {
  return stream.setHeader && typeof stream.abort === 'function';
}

function eos(stream, opts, callback) {
  if (typeof opts === 'function') return eos(stream, null, opts);
  if (!opts) opts = {};
  callback = once(callback || noop);
  var readable = opts.readable || opts.readable !== false && stream.readable;
  var writable = opts.writable || opts.writable !== false && stream.writable;

  var onlegacyfinish = function onlegacyfinish() {
    if (!stream.writable) onfinish();
  };

  var writableEnded = stream._writableState && stream._writableState.finished;

  var onfinish = function onfinish() {
    writable = false;
    writableEnded = true;
    if (!readable) callback.call(stream);
  };

  var readableEnded = stream._readableState && stream._readableState.endEmitted;

  var onend = function onend() {
    readable = false;
    readableEnded = true;
    if (!writable) callback.call(stream);
  };

  var onerror = function onerror(err) {
    callback.call(stream, err);
  };

  var onclose = function onclose() {
    var err;

    if (readable && !readableEnded) {
      if (!stream._readableState || !stream._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE();
      return callback.call(stream, err);
    }

    if (writable && !writableEnded) {
      if (!stream._writableState || !stream._writableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE();
      return callback.call(stream, err);
    }
  };

  var onrequest = function onrequest() {
    stream.req.on('finish', onfinish);
  };

  if (isRequest(stream)) {
    stream.on('complete', onfinish);
    stream.on('abort', onclose);
    if (stream.req) onrequest();else stream.on('request', onrequest);
  } else if (writable && !stream._writableState) {
    // legacy streams
    stream.on('end', onlegacyfinish);
    stream.on('close', onlegacyfinish);
  }

  stream.on('end', onend);
  stream.on('finish', onfinish);
  if (opts.error !== false) stream.on('error', onerror);
  stream.on('close', onclose);
  return function () {
    stream.removeListener('complete', onfinish);
    stream.removeListener('abort', onclose);
    stream.removeListener('request', onrequest);
    if (stream.req) stream.req.removeListener('finish', onfinish);
    stream.removeListener('end', onlegacyfinish);
    stream.removeListener('close', onlegacyfinish);
    stream.removeListener('finish', onfinish);
    stream.removeListener('end', onend);
    stream.removeListener('error', onerror);
    stream.removeListener('close', onclose);
  };
}

module.exports = eos;module.exports = function () {
  throw new Error('Readable.from is not available in the browser')
};
'use strict';

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }

function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }

function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }

function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }

function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }

var ERR_INVALID_ARG_TYPE = require('../../../errors').codes.ERR_INVALID_ARG_TYPE;

function from(Readable, iterable, opts) {
  var iterator;

  if (iterable && typeof iterable.next === 'function') {
    iterator = iterable;
  } else if (iterable && iterable[Symbol.asyncIterator]) iterator = iterable[Symbol.asyncIterator]();else if (iterable && iterable[Symbol.iterator]) iterator = iterable[Symbol.iterator]();else throw new ERR_INVALID_ARG_TYPE('iterable', ['Iterable'], iterable);

  var readable = new Readable(_objectSpread({
    objectMode: true
  }, opts)); // Reading boolean to protect against _read
  // being called before last iteration completion.

  var reading = false;

  readable._read = function () {
    if (!reading) {
      reading = true;
      next();
    }
  };

  function next() {
    return _next2.apply(this, arguments);
  }

  function _next2() {
    _next2 = _asyncToGenerator(function* () {
      try {
        var _ref = yield iterator.next(),
            value = _ref.value,
            done = _ref.done;

        if (done) {
          readable.push(null);
        } else if (readable.push((yield value))) {
          next();
        } else {
          reading = false;
        }
      } catch (err) {
        readable.destroy(err);
      }
    });
    return _next2.apply(this, arguments);
  }

  return readable;
}

module.exports = from;// Ported from https://github.com/mafintosh/pump with
// permission from the author, Mathias Buus (@mafintosh).
'use strict';

var eos;

function once(callback) {
  var called = false;
  return function () {
    if (called) return;
    called = true;
    callback.apply(void 0, arguments);
  };
}

var _require$codes = require('../../../errors').codes,
    ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS,
    ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED;

function noop(err) {
  // Rethrow the error if it exists to avoid swallowing it
  if (err) throw err;
}

function isRequest(stream) {
  return stream.setHeader && typeof stream.abort === 'function';
}

function destroyer(stream, reading, writing, callback) {
  callback = once(callback);
  var closed = false;
  stream.on('close', function () {
    closed = true;
  });
  if (eos === undefined) eos = require('./end-of-stream');
  eos(stream, {
    readable: reading,
    writable: writing
  }, function (err) {
    if (err) return callback(err);
    closed = true;
    callback();
  });
  var destroyed = false;
  return function (err) {
    if (closed) return;
    if (destroyed) return;
    destroyed = true; // request.destroy just do .end - .abort is what we want

    if (isRequest(stream)) return stream.abort();
    if (typeof stream.destroy === 'function') return stream.destroy();
    callback(err || new ERR_STREAM_DESTROYED('pipe'));
  };
}

function call(fn) {
  fn();
}

function pipe(from, to) {
  return from.pipe(to);
}

function popCallback(streams) {
  if (!streams.length) return noop;
  if (typeof streams[streams.length - 1] !== 'function') return noop;
  return streams.pop();
}

function pipeline() {
  for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) {
    streams[_key] = arguments[_key];
  }

  var callback = popCallback(streams);
  if (Array.isArray(streams[0])) streams = streams[0];

  if (streams.length < 2) {
    throw new ERR_MISSING_ARGS('streams');
  }

  var error;
  var destroys = streams.map(function (stream, i) {
    var reading = i < streams.length - 1;
    var writing = i > 0;
    return destroyer(stream, reading, writing, function (err) {
      if (!error) error = err;
      if (err) destroys.forEach(call);
      if (reading) return;
      destroys.forEach(call);
      callback(error);
    });
  });
  return streams.reduce(pipe);
}

module.exports = pipeline;'use strict';

var ERR_INVALID_OPT_VALUE = require('../../../errors').codes.ERR_INVALID_OPT_VALUE;

function highWaterMarkFrom(options, isDuplex, duplexKey) {
  return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null;
}

function getHighWaterMark(state, options, duplexKey, isDuplex) {
  var hwm = highWaterMarkFrom(options, isDuplex, duplexKey);

  if (hwm != null) {
    if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) {
      var name = isDuplex ? duplexKey : 'highWaterMark';
      throw new ERR_INVALID_OPT_VALUE(name, hwm);
    }

    return Math.floor(hwm);
  } // Default value


  return state.objectMode ? 16 : 16 * 1024;
}

module.exports = {
  getHighWaterMark: getHighWaterMark
};module.exports = require('events').EventEmitter;
module.exports = require('stream');
root = true

[*]
indent_style = tab;
insert_final_newline = true;
quote_type = auto;
space_after_anonymous_functions = true;
space_after_control_statements = true;
spaces_around_operators = true;
trim_trailing_whitespace = true;
spaces_in_brackets = false;
end_of_line = lf;

{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"exclude": [
		"coverage",
		"test"
	]
}
The MIT License (MIT)

Copyright (C) 2014 Jordan Harband

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';

require('./shim')();
'use strict';

var functionsHaveConfigurableNames = require('functions-have-names').functionsHaveConfigurableNames();

var $Object = Object;
var $TypeError = TypeError;

module.exports = function flags() {
	if (this != null && this !== $Object(this)) {
		throw new $TypeError('RegExp.prototype.flags getter called on non-object');
	}
	var result = '';
	if (this.hasIndices) {
		result += 'd';
	}
	if (this.global) {
		result += 'g';
	}
	if (this.ignoreCase) {
		result += 'i';
	}
	if (this.multiline) {
		result += 'm';
	}
	if (this.dotAll) {
		result += 's';
	}
	if (this.unicode) {
		result += 'u';
	}
	if (this.sticky) {
		result += 'y';
	}
	return result;
};

if (functionsHaveConfigurableNames && Object.defineProperty) {
	Object.defineProperty(module.exports, 'name', { value: 'get flags' });
}
'use strict';

var define = require('define-properties');
var callBind = require('call-bind');

var implementation = require('./implementation');
var getPolyfill = require('./polyfill');
var shim = require('./shim');

var flagsBound = callBind(getPolyfill());

define(flagsBound, {
	getPolyfill: getPolyfill,
	implementation: implementation,
	shim: shim
});

module.exports = flagsBound;
{
  "name": "regexp.prototype.flags",
  "version": "1.4.3",
  "author": "Jordan Harband <ljharb@gmail.com>",
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "description": "ES6 spec-compliant RegExp.prototype.flags shim.",
  "license": "MIT",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/es-shims/RegExp.prototype.flags.git"
  },
  "dependencies": {
    "call-bind": "^1.0.2",
    "define-properties": "^1.1.3",
    "functions-have-names": "^1.2.2"
  },
  "devDependencies": {
    "@es-shims/api": "^2.2.3",
    "@ljharb/eslint-config": "^21.0.0",
    "aud": "^2.0.0",
    "auto-changelog": "^2.4.0",
    "available-regexp-flags": "^1.0.0",
    "covert": "^1.1.1",
    "eclint": "^2.8.1",
    "eslint": "=8.8.0",
    "foreach": "^2.0.5",
    "has": "^1.0.3",
    "has-strict-mode": "^1.0.1",
    "nyc": "^10.3.2",
    "object-inspect": "^1.12.0",
    "safe-publish-latest": "^2.0.0",
    "tape": "^5.5.3"
  },
  "testling": {
    "files": "test/index.js",
    "browsers": [
      "iexplore/9.0..latest",
      "firefox/4.0..6.0",
      "firefox/15.0..latest",
      "firefox/nightly",
      "chrome/4.0..10.0",
      "chrome/20.0..latest",
      "chrome/canary",
      "opera/11.6..latest",
      "opera/next",
      "safari/5.0..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2"
    ]
  },
  "engines": {
    "node": ">= 0.4"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false,
    "hideCredit": true
  }
}'use strict';

var implementation = require('./implementation');

var supportsDescriptors = require('define-properties').supportsDescriptors;
var $gOPD = Object.getOwnPropertyDescriptor;

module.exports = function getPolyfill() {
	if (supportsDescriptors && (/a/mig).flags === 'gim') {
		var descriptor = $gOPD(RegExp.prototype, 'flags');
		if (
			descriptor
			&& typeof descriptor.get === 'function'
			&& typeof RegExp.prototype.dotAll === 'boolean'
			&& typeof RegExp.prototype.hasIndices === 'boolean'
		) {
			/* eslint getter-return: 0 */
			var calls = '';
			var o = {};
			Object.defineProperty(o, 'hasIndices', {
				get: function () {
					calls += 'd';
				}
			});
			Object.defineProperty(o, 'sticky', {
				get: function () {
					calls += 'y';
				}
			});
			if (calls === 'dy') {
				return descriptor.get;
			}
		}
	}
	return implementation;
};
'use strict';

var supportsDescriptors = require('define-properties').supportsDescriptors;
var getPolyfill = require('./polyfill');
var gOPD = Object.getOwnPropertyDescriptor;
var defineProperty = Object.defineProperty;
var TypeErr = TypeError;
var getProto = Object.getPrototypeOf;
var regex = /a/;

module.exports = function shimFlags() {
	if (!supportsDescriptors || !getProto) {
		throw new TypeErr('RegExp.prototype.flags requires a true ES5 environment that supports property descriptors');
	}
	var polyfill = getPolyfill();
	var proto = getProto(regex);
	var descriptor = gOPD(proto, 'flags');
	if (!descriptor || descriptor.get !== polyfill) {
		defineProperty(proto, 'flags', {
			configurable: true,
			enumerable: false,
			get: polyfill
		});
	}
	return polyfill;
};
The MIT License

Copyright (c) 2015-2016 Mick Hansen. http://mhansen.io

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 util = require('util');
var format = util.format;

function TimeoutError(message, err) {
  Error.call(this);
  Error.captureStackTrace(this, TimeoutError);
  this.name = 'TimeoutError';
  this.message = message;
  this.previous = err;
}

util.inherits(TimeoutError, Error);

function matches(match, err) {
  if (match === true) return true;
  if (typeof match === 'function') {
    try {
      if (err instanceof match) return true;
    } catch (_) {
      return !!match(err);
    }
  }
  if (match === err.toString()) return true;
  if (match === err.message) return true;
  return match instanceof RegExp
    && (match.test(err.message) || match.test(err.toString()));
}

module.exports = function retryAsPromised(callback, options) {
  if (!callback || !options) {
    throw new Error(
      'retry-as-promised must be passed a callback and a options set or a number'
    );
  }

  if (typeof options === 'number') {
    options = {
      max: options
    };
  }

  // Super cheap clone
  options = {
    $current: options.$current || 1,
    max: options.max,
    timeout: options.timeout || undefined,
    match: options.match || [],
    backoffBase: options.backoffBase === undefined ? 100 : options.backoffBase,
    backoffExponent: options.backoffExponent || 1.1,
    report: options.report || function () {},
    name: options.name || callback.name || 'unknown'
  };

  if (!Array.isArray(options.match)) options.match = [options.match];
  options.report('Trying ' + options.name + ' #' + options.$current + ' at ' + new Date().toLocaleTimeString(), options);

  return new Promise(function(resolve, reject) {
    var timeout, backoffTimeout, lastError;

    if (options.timeout) {
      timeout = setTimeout(function() {
        if (backoffTimeout) clearTimeout(backoffTimeout);
        reject(new TimeoutError(options.name + ' timed out', lastError));
      }, options.timeout);
    }

    Promise.resolve(callback({ current: options.$current }))
      .then(resolve)
      .then(function() {
        if (timeout) clearTimeout(timeout);
        if (backoffTimeout) clearTimeout(backoffTimeout);
      })
      .catch(function(err) {
        if (timeout) clearTimeout(timeout);
        if (backoffTimeout) clearTimeout(backoffTimeout);

        lastError = err;
        options.report((err && err.toString()) || err, options);

        // Should not retry if max has been reached
        var shouldRetry = options.$current < options.max;
        if (!shouldRetry) return reject(err);
        shouldRetry = options.match.length === 0 || options.match.some(function (match) {
          return matches(match, err)
        });
        if (!shouldRetry) return reject(err);

        var retryDelay = options.backoffBase * Math.pow(options.backoffExponent, options.$current - 1);

        // Do some accounting
        options.$current++;
        options.report(format('Retrying %s (%s)', options.name, options.$current), options);

        if (retryDelay) {
          // Use backoff function to ease retry rate
          options.report(format('Delaying retry of %s by %s', options.name, retryDelay), options);
          backoffTimeout = setTimeout(function() {
            retryAsPromised(callback, options)
              .then(resolve)
              .catch(reject);
          }, retryDelay);
        } else {
          retryAsPromised(callback, options)
            .then(resolve)
            .catch(reject);
        }
      });
  });
};

module.exports.TimeoutError = TimeoutError;
{
  "name": "retry-as-promised",
  "version": "5.0.0",
  "description": "Retry a failed promise",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "https://github.com/mickhansen/retry-as-promised.git"
  },
  "author": "Mick Hansen <maker@mhansen.io>",
  "license": "MIT",
  "homepage": "https://github.com/mickhansen/retry-as-promised",
  "dependencies": {},
  "files": [],
  "devDependencies": {
    "chai": "^4.2.0",
    "chai-as-promised": "^7.1.1",
    "cross-env": "^5.2.0",
    "mocha": "^9.1.3",
    "moment": "^2.10.6",
    "sinon": "^7.0.0",
    "sinon-chai": "^3.2.0"
  }
}Copyright 2019 "David Mark Clements <david.mark.clements@gmail.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.
'use strict'

module.exports = require('./index.js')()
'use strict'
module.exports = rfdc

function copyBuffer (cur) {
  if (cur instanceof Buffer) {
    return Buffer.from(cur)
  }

  return new cur.constructor(cur.buffer.slice(), cur.byteOffset, cur.length)
}

function rfdc (opts) {
  opts = opts || {}

  if (opts.circles) return rfdcCircles(opts)
  return opts.proto ? cloneProto : clone

  function cloneArray (a, fn) {
    var keys = Object.keys(a)
    var a2 = new Array(keys.length)
    for (var i = 0; i < keys.length; i++) {
      var k = keys[i]
      var cur = a[k]
      if (typeof cur !== 'object' || cur === null) {
        a2[k] = cur
      } else if (cur instanceof Date) {
        a2[k] = new Date(cur)
      } else if (ArrayBuffer.isView(cur)) {
        a2[k] = copyBuffer(cur)
      } else {
        a2[k] = fn(cur)
      }
    }
    return a2
  }

  function clone (o) {
    if (typeof o !== 'object' || o === null) return o
    if (o instanceof Date) return new Date(o)
    if (Array.isArray(o)) return cloneArray(o, clone)
    if (o instanceof Map) return new Map(cloneArray(Array.from(o), clone))
    if (o instanceof Set) return new Set(cloneArray(Array.from(o), clone))
    var o2 = {}
    for (var k in o) {
      if (Object.hasOwnProperty.call(o, k) === false) continue
      var cur = o[k]
      if (typeof cur !== 'object' || cur === null) {
        o2[k] = cur
      } else if (cur instanceof Date) {
        o2[k] = new Date(cur)
      } else if (cur instanceof Map) {
        o2[k] = new Map(cloneArray(Array.from(cur), clone))
      } else if (cur instanceof Set) {
        o2[k] = new Set(cloneArray(Array.from(cur), clone))
      } else if (ArrayBuffer.isView(cur)) {
        o2[k] = copyBuffer(cur)
      } else {
        o2[k] = clone(cur)
      }
    }
    return o2
  }

  function cloneProto (o) {
    if (typeof o !== 'object' || o === null) return o
    if (o instanceof Date) return new Date(o)
    if (Array.isArray(o)) return cloneArray(o, cloneProto)
    if (o instanceof Map) return new Map(cloneArray(Array.from(o), cloneProto))
    if (o instanceof Set) return new Set(cloneArray(Array.from(o), cloneProto))
    var o2 = {}
    for (var k in o) {
      var cur = o[k]
      if (typeof cur !== 'object' || cur === null) {
        o2[k] = cur
      } else if (cur instanceof Date) {
        o2[k] = new Date(cur)
      } else if (cur instanceof Map) {
        o2[k] = new Map(cloneArray(Array.from(cur), cloneProto))
      } else if (cur instanceof Set) {
        o2[k] = new Set(cloneArray(Array.from(cur), cloneProto))
      } else if (ArrayBuffer.isView(cur)) {
        o2[k] = copyBuffer(cur)
      } else {
        o2[k] = cloneProto(cur)
      }
    }
    return o2
  }
}

function rfdcCircles (opts) {
  var refs = []
  var refsNew = []

  return opts.proto ? cloneProto : clone

  function cloneArray (a, fn) {
    var keys = Object.keys(a)
    var a2 = new Array(keys.length)
    for (var i = 0; i < keys.length; i++) {
      var k = keys[i]
      var cur = a[k]
      if (typeof cur !== 'object' || cur === null) {
        a2[k] = cur
      } else if (cur instanceof Date) {
        a2[k] = new Date(cur)
      } else if (ArrayBuffer.isView(cur)) {
        a2[k] = copyBuffer(cur)
      } else {
        var index = refs.indexOf(cur)
        if (index !== -1) {
          a2[k] = refsNew[index]
        } else {
          a2[k] = fn(cur)
        }
      }
    }
    return a2
  }

  function clone (o) {
    if (typeof o !== 'object' || o === null) return o
    if (o instanceof Date) return new Date(o)
    if (Array.isArray(o)) return cloneArray(o, clone)
    if (o instanceof Map) return new Map(cloneArray(Array.from(o), clone))
    if (o instanceof Set) return new Set(cloneArray(Array.from(o), clone))
    var o2 = {}
    refs.push(o)
    refsNew.push(o2)
    for (var k in o) {
      if (Object.hasOwnProperty.call(o, k) === false) continue
      var cur = o[k]
      if (typeof cur !== 'object' || cur === null) {
        o2[k] = cur
      } else if (cur instanceof Date) {
        o2[k] = new Date(cur)
      } else if (cur instanceof Map) {
        o2[k] = new Map(cloneArray(Array.from(cur), clone))
      } else if (cur instanceof Set) {
        o2[k] = new Set(cloneArray(Array.from(cur), clone))
      } else if (ArrayBuffer.isView(cur)) {
        o2[k] = copyBuffer(cur)
      } else {
        var i = refs.indexOf(cur)
        if (i !== -1) {
          o2[k] = refsNew[i]
        } else {
          o2[k] = clone(cur)
        }
      }
    }
    refs.pop()
    refsNew.pop()
    return o2
  }

  function cloneProto (o) {
    if (typeof o !== 'object' || o === null) return o
    if (o instanceof Date) return new Date(o)
    if (Array.isArray(o)) return cloneArray(o, cloneProto)
    if (o instanceof Map) return new Map(cloneArray(Array.from(o), cloneProto))
    if (o instanceof Set) return new Set(cloneArray(Array.from(o), cloneProto))
    var o2 = {}
    refs.push(o)
    refsNew.push(o2)
    for (var k in o) {
      var cur = o[k]
      if (typeof cur !== 'object' || cur === null) {
        o2[k] = cur
      } else if (cur instanceof Date) {
        o2[k] = new Date(cur)
      } else if (cur instanceof Map) {
        o2[k] = new Map(cloneArray(Array.from(cur), cloneProto))
      } else if (cur instanceof Set) {
        o2[k] = new Set(cloneArray(Array.from(cur), cloneProto))
      } else if (ArrayBuffer.isView(cur)) {
        o2[k] = copyBuffer(cur)
      } else {
        var i = refs.indexOf(cur)
        if (i !== -1) {
          o2[k] = refsNew[i]
        } else {
          o2[k] = cloneProto(cur)
        }
      }
    }
    refs.pop()
    refsNew.pop()
    return o2
  }
}
import { expectType } from 'tsd';
import rfdc = require('.');

const clone = rfdc();

expectType<number>(clone(5));
expectType<{ lorem: string }>(clone({ lorem: "ipsum" }));
{
  "name": "rfdc",
  "version": "1.3.0",
  "description": "Really Fast Deep Clone",
  "main": "index.js",
  "exports": {
    ".": "./index.js",
    "./default": "./default.js"
  },
  "author": "David Mark Clements <david.clements@nearform.com>",
  "license": "MIT",
  "devDependencies": {
    "clone-deep": "^4.0.1",
    "codecov": "^3.4.0",
    "deep-copy": "^1.4.2",
    "fast-copy": "^1.2.1",
    "fastbench": "^1.0.1",
    "lodash.clonedeep": "^4.5.0",
    "standard": "^11.0.1",
    "tap": "^12.0.1",
    "tsd": "^0.7.4"
  },
  "directories": {
    "test": "test"
  },
  "dependencies": {},
  "repository": {
    "type": "git",
    "url": "git+https://github.com/davidmarkclements/rfdc.git"
  },
  "homepage": "https://github.com/davidmarkclements/rfdc#readme"
}name: CI

on: [push, pull_request]

jobs:
  test:
    runs-on: ${{ matrix.os }}

    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest]
        node-version: [8.x, 10.x, 12.x, 14.x]

    steps:
    - uses: actions/checkout@v2
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v1
      with:
        node-version: ${{ matrix.node-version }}
    - run: npm install
    - run: npm run ci
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

const rimraf = require('./')

const path = require('path')

const isRoot = arg => /^(\/|[a-zA-Z]:\\)$/.test(path.resolve(arg))
const filterOutRoot = arg => {
  const ok = preserveRoot === false || !isRoot(arg)
  if (!ok) {
    console.error(`refusing to remove ${arg}`)
    console.error('Set --no-preserve-root to allow this')
  }
  return ok
}

let help = false
let dashdash = false
let noglob = false
let preserveRoot = true
const args = process.argv.slice(2).filter(arg => {
  if (dashdash)
    return !!arg
  else if (arg === '--')
    dashdash = true
  else if (arg === '--no-glob' || arg === '-G')
    noglob = true
  else if (arg === '--glob' || arg === '-g')
    noglob = false
  else if (arg.match(/^(-+|\/)(h(elp)?|\?)$/))
    help = true
  else if (arg === '--preserve-root')
    preserveRoot = true
  else if (arg === '--no-preserve-root')
    preserveRoot = false
  else
    return !!arg
}).filter(arg => !preserveRoot || filterOutRoot(arg))

const go = n => {
  if (n >= args.length)
    return
  const options = noglob ? { glob: false } : {}
  rimraf(args[n], options, er => {
    if (er)
      throw er
    go(n+1)
  })
}

if (help || args.length === 0) {
  // If they didn't ask for help, then this is not a "success"
  const log = help ? console.log : console.error
  log('Usage: rimraf <path> [<path> ...]')
  log('')
  log('  Deletes all files and folders at "path" recursively.')
  log('')
  log('Options:')
  log('')
  log('  -h, --help          Display this usage info')
  log('  -G, --no-glob       Do not expand glob patterns in arguments')
  log('  -g, --glob          Expand glob patterns in arguments (default)')
  log('  --preserve-root     Do not remove \'/\' (default)')
  log('  --no-preserve-root  Do not treat \'/\' specially')
  log('  --                  Stop parsing flags')
  process.exit(help ? 0 : 1)
} else
  go(0)
{
  "name": "rimraf",
  "version": "3.0.2",
  "main": "rimraf.js",
  "description": "A deep deletion module for node (like `rm -rf`)",
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
  "license": "ISC",
  "repository": "git://github.com/isaacs/rimraf.git",
  "bin": "./bin.js",
  "dependencies": {
    "glob": "^7.1.3"
  },
  "files": [
    "LICENSE",
    "README.md",
    "bin.js",
    "rimraf.js"
  ],
  "devDependencies": {
    "mkdirp": "^0.5.1",
    "tap": "^12.1.1"
  },
  "funding": {
    "url": "https://github.com/sponsors/isaacs"
  }
}const assert = require("assert")
const path = require("path")
const fs = require("fs")
let glob = undefined
try {
  glob = require("glob")
} catch (_err) {
  // treat glob as optional.
}

const defaultGlobOpts = {
  nosort: true,
  silent: true
}

// for EMFILE handling
let timeout = 0

const isWindows = (process.platform === "win32")

const defaults = options => {
  const methods = [
    'unlink',
    'chmod',
    'stat',
    'lstat',
    'rmdir',
    'readdir'
  ]
  methods.forEach(m => {
    options[m] = options[m] || fs[m]
    m = m + 'Sync'
    options[m] = options[m] || fs[m]
  })

  options.maxBusyTries = options.maxBusyTries || 3
  options.emfileWait = options.emfileWait || 1000
  if (options.glob === false) {
    options.disableGlob = true
  }
  if (options.disableGlob !== true && glob === undefined) {
    throw Error('glob dependency not found, set `options.disableGlob = true` if intentional')
  }
  options.disableGlob = options.disableGlob || false
  options.glob = options.glob || defaultGlobOpts
}

const rimraf = (p, options, cb) => {
  if (typeof options === 'function') {
    cb = options
    options = {}
  }

  assert(p, 'rimraf: missing path')
  assert.equal(typeof p, 'string', 'rimraf: path should be a string')
  assert.equal(typeof cb, 'function', 'rimraf: callback function required')
  assert(options, 'rimraf: invalid options argument provided')
  assert.equal(typeof options, 'object', 'rimraf: options should be object')

  defaults(options)

  let busyTries = 0
  let errState = null
  let n = 0

  const next = (er) => {
    errState = errState || er
    if (--n === 0)
      cb(errState)
  }

  const afterGlob = (er, results) => {
    if (er)
      return cb(er)

    n = results.length
    if (n === 0)
      return cb()

    results.forEach(p => {
      const CB = (er) => {
        if (er) {
          if ((er.code === "EBUSY" || er.code === "ENOTEMPTY" || er.code === "EPERM") &&
              busyTries < options.maxBusyTries) {
            busyTries ++
            // try again, with the same exact callback as this one.
            return setTimeout(() => rimraf_(p, options, CB), busyTries * 100)
          }

          // this one won't happen if graceful-fs is used.
          if (er.code === "EMFILE" && timeout < options.emfileWait) {
            return setTimeout(() => rimraf_(p, options, CB), timeout ++)
          }

          // already gone
          if (er.code === "ENOENT") er = null
        }

        timeout = 0
        next(er)
      }
      rimraf_(p, options, CB)
    })
  }

  if (options.disableGlob || !glob.hasMagic(p))
    return afterGlob(null, [p])

  options.lstat(p, (er, stat) => {
    if (!er)
      return afterGlob(null, [p])

    glob(p, options.glob, afterGlob)
  })

}

// Two possible strategies.
// 1. Assume it's a file.  unlink it, then do the dir stuff on EPERM or EISDIR
// 2. Assume it's a directory.  readdir, then do the file stuff on ENOTDIR
//
// Both result in an extra syscall when you guess wrong.  However, there
// are likely far more normal files in the world than directories.  This
// is based on the assumption that a the average number of files per
// directory is >= 1.
//
// If anyone ever complains about this, then I guess the strategy could
// be made configurable somehow.  But until then, YAGNI.
const rimraf_ = (p, options, cb) => {
  assert(p)
  assert(options)
  assert(typeof cb === 'function')

  // sunos lets the root user unlink directories, which is... weird.
  // so we have to lstat here and make sure it's not a dir.
  options.lstat(p, (er, st) => {
    if (er && er.code === "ENOENT")
      return cb(null)

    // Windows can EPERM on stat.  Life is suffering.
    if (er && er.code === "EPERM" && isWindows)
      fixWinEPERM(p, options, er, cb)

    if (st && st.isDirectory())
      return rmdir(p, options, er, cb)

    options.unlink(p, er => {
      if (er) {
        if (er.code === "ENOENT")
          return cb(null)
        if (er.code === "EPERM")
          return (isWindows)
            ? fixWinEPERM(p, options, er, cb)
            : rmdir(p, options, er, cb)
        if (er.code === "EISDIR")
          return rmdir(p, options, er, cb)
      }
      return cb(er)
    })
  })
}

const fixWinEPERM = (p, options, er, cb) => {
  assert(p)
  assert(options)
  assert(typeof cb === 'function')

  options.chmod(p, 0o666, er2 => {
    if (er2)
      cb(er2.code === "ENOENT" ? null : er)
    else
      options.stat(p, (er3, stats) => {
        if (er3)
          cb(er3.code === "ENOENT" ? null : er)
        else if (stats.isDirectory())
          rmdir(p, options, er, cb)
        else
          options.unlink(p, cb)
      })
  })
}

const fixWinEPERMSync = (p, options, er) => {
  assert(p)
  assert(options)

  try {
    options.chmodSync(p, 0o666)
  } catch (er2) {
    if (er2.code === "ENOENT")
      return
    else
      throw er
  }

  let stats
  try {
    stats = options.statSync(p)
  } catch (er3) {
    if (er3.code === "ENOENT")
      return
    else
      throw er
  }

  if (stats.isDirectory())
    rmdirSync(p, options, er)
  else
    options.unlinkSync(p)
}

const rmdir = (p, options, originalEr, cb) => {
  assert(p)
  assert(options)
  assert(typeof cb === 'function')

  // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)
  // if we guessed wrong, and it's not a directory, then
  // raise the original error.
  options.rmdir(p, er => {
    if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM"))
      rmkids(p, options, cb)
    else if (er && er.code === "ENOTDIR")
      cb(originalEr)
    else
      cb(er)
  })
}

const rmkids = (p, options, cb) => {
  assert(p)
  assert(options)
  assert(typeof cb === 'function')

  options.readdir(p, (er, files) => {
    if (er)
      return cb(er)
    let n = files.length
    if (n === 0)
      return options.rmdir(p, cb)
    let errState
    files.forEach(f => {
      rimraf(path.join(p, f), options, er => {
        if (errState)
          return
        if (er)
          return cb(errState = er)
        if (--n === 0)
          options.rmdir(p, cb)
      })
    })
  })
}

// this looks simpler, and is strictly *faster*, but will
// tie up the JavaScript thread and fail on excessively
// deep directory trees.
const rimrafSync = (p, options) => {
  options = options || {}
  defaults(options)

  assert(p, 'rimraf: missing path')
  assert.equal(typeof p, 'string', 'rimraf: path should be a string')
  assert(options, 'rimraf: missing options')
  assert.equal(typeof options, 'object', 'rimraf: options should be object')

  let results

  if (options.disableGlob || !glob.hasMagic(p)) {
    results = [p]
  } else {
    try {
      options.lstatSync(p)
      results = [p]
    } catch (er) {
      results = glob.sync(p, options.glob)
    }
  }

  if (!results.length)
    return

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

    let st
    try {
      st = options.lstatSync(p)
    } catch (er) {
      if (er.code === "ENOENT")
        return

      // Windows can EPERM on stat.  Life is suffering.
      if (er.code === "EPERM" && isWindows)
        fixWinEPERMSync(p, options, er)
    }

    try {
      // sunos lets the root user unlink directories, which is... weird.
      if (st && st.isDirectory())
        rmdirSync(p, options, null)
      else
        options.unlinkSync(p)
    } catch (er) {
      if (er.code === "ENOENT")
        return
      if (er.code === "EPERM")
        return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er)
      if (er.code !== "EISDIR")
        throw er

      rmdirSync(p, options, er)
    }
  }
}

const rmdirSync = (p, options, originalEr) => {
  assert(p)
  assert(options)

  try {
    options.rmdirSync(p)
  } catch (er) {
    if (er.code === "ENOENT")
      return
    if (er.code === "ENOTDIR")
      throw originalEr
    if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")
      rmkidsSync(p, options)
  }
}

const rmkidsSync = (p, options) => {
  assert(p)
  assert(options)
  options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options))

  // We only end up here once we got ENOTEMPTY at least once, and
  // at this point, we are guaranteed to have removed all the kids.
  // So, we know that it won't be ENOENT or ENOTDIR or anything else.
  // try really hard to delete stuff on windows, because it has a
  // PROFOUNDLY annoying habit of not closing handles promptly when
  // files are deleted, resulting in spurious ENOTEMPTY errors.
  const retries = isWindows ? 100 : 1
  let i = 0
  do {
    let threw = true
    try {
      const ret = options.rmdirSync(p, options)
      threw = false
      return ret
    } finally {
      if (++i < retries && threw)
        continue
    }
  } while (true)
}

module.exports = rimraf
rimraf.sync = rimrafSync
# Contributor Covenant Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, gender identity and expression, level of experience,
education, socio-economic status, nationality, personal appearance, race,
religion, or sexual identity and orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment
include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or
  advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
  address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting Ben Lesh (ben@benlesh.com), Tracy Lee (tracy@thisdot.co) or OJ Kwon (kwon.ohjoong@gmail.com). All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html

[homepage]: https://www.contributor-covenant.org
                               Apache License
                         Version 2.0, January 2004
                      http://www.apache.org/licenses/

 TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

 1. Definitions.

    "License" shall mean the terms and conditions for use, reproduction,
    and distribution as defined by Sections 1 through 9 of this document.

    "Licensor" shall mean the copyright owner or entity authorized by
    the copyright owner that is granting the License.

    "Legal Entity" shall mean the union of the acting entity and all
    other entities that control, are controlled by, or are under common
    control with that entity. For the purposes of this definition,
    "control" means (i) the power, direct or indirect, to cause the
    direction or management of such entity, whether by contract or
    otherwise, or (ii) ownership of fifty percent (50%) or more of the
    outstanding shares, or (iii) beneficial ownership of such entity.

    "You" (or "Your") shall mean an individual or Legal Entity
    exercising permissions granted by this License.

    "Source" form shall mean the preferred form for making modifications,
    including but not limited to software source code, documentation
    source, and configuration files.

    "Object" form shall mean any form resulting from mechanical
    transformation or translation of a Source form, including but
    not limited to compiled object code, generated documentation,
    and conversions to other media types.

    "Work" shall mean the work of authorship, whether in Source or
    Object form, made available under the License, as indicated by a
    copyright notice that is included in or attached to the work
    (an example is provided in the Appendix below).

    "Derivative Works" shall mean any work, whether in Source or Object
    form, that is based on (or derived from) the Work and for which the
    editorial revisions, annotations, elaborations, or other modifications
    represent, as a whole, an original work of authorship. For the purposes
    of this License, Derivative Works shall not include works that remain
    separable from, or merely link (or bind by name) to the interfaces of,
    the Work and Derivative Works thereof.

    "Contribution" shall mean any work of authorship, including
    the original version of the Work and any modifications or additions
    to that Work or Derivative Works thereof, that is intentionally
    submitted to Licensor for inclusion in the Work by the copyright owner
    or by an individual or Legal Entity authorized to submit on behalf of
    the copyright owner. For the purposes of this definition, "submitted"
    means any form of electronic, verbal, or written communication sent
    to the Licensor or its representatives, including but not limited to
    communication on electronic mailing lists, source code control systems,
    and issue tracking systems that are managed by, or on behalf of, the
    Licensor for the purpose of discussing and improving the Work, but
    excluding communication that is conspicuously marked or otherwise
    designated in writing by the copyright owner as "Not a Contribution."

    "Contributor" shall mean Licensor and any individual or Legal Entity
    on behalf of whom a Contribution has been received by Licensor and
    subsequently incorporated within the Work.

 2. Grant of Copyright License. Subject to the terms and conditions of
    this License, each Contributor hereby grants to You a perpetual,
    worldwide, non-exclusive, no-charge, royalty-free, irrevocable
    copyright license to reproduce, prepare Derivative Works of,
    publicly display, publicly perform, sublicense, and distribute the
    Work and such Derivative Works in Source or Object form.

 3. Grant of Patent License. Subject to the terms and conditions of
    this License, each Contributor hereby grants to You a perpetual,
    worldwide, non-exclusive, no-charge, royalty-free, irrevocable
    (except as stated in this section) patent license to make, have made,
    use, offer to sell, sell, import, and otherwise transfer the Work,
    where such license applies only to those patent claims licensable
    by such Contributor that are necessarily infringed by their
    Contribution(s) alone or by combination of their Contribution(s)
    with the Work to which such Contribution(s) was submitted. If You
    institute patent litigation against any entity (including a
    cross-claim or counterclaim in a lawsuit) alleging that the Work
    or a Contribution incorporated within the Work constitutes direct
    or contributory patent infringement, then any patent licenses
    granted to You under this License for that Work shall terminate
    as of the date such litigation is filed.

 4. Redistribution. You may reproduce and distribute copies of the
    Work or Derivative Works thereof in any medium, with or without
    modifications, and in Source or Object form, provided that You
    meet the following conditions:

    (a) You must give any other recipients of the Work or
        Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices
        stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works
        that You distribute, all copyright, patent, trademark, and
        attribution notices from the Source form of the Work,
        excluding those notices that do not pertain to any part of
        the Derivative Works; and

    (d) If the Work includes a "NOTICE" text file as part of its
        distribution, then any Derivative Works that You distribute must
        include a readable copy of the attribution notices contained
        within such NOTICE file, excluding those notices that do not
        pertain to any part of the Derivative Works, in at least one
        of the following places: within a NOTICE text file distributed
        as part of the Derivative Works; within the Source form or
        documentation, if provided along with the Derivative Works; or,
        within a display generated by the Derivative Works, if and
        wherever such third-party notices normally appear. The contents
        of the NOTICE file are for informational purposes only and
        do not modify the License. You may add Your own attribution
        notices within Derivative Works that You distribute, alongside
        or as an addendum to the NOTICE text from the Work, provided
        that such additional attribution notices cannot be construed
        as modifying the License.

    You may add Your own copyright statement to Your modifications and
    may provide additional or different license terms and conditions
    for use, reproduction, or distribution of Your modifications, or
    for any such Derivative Works as a whole, provided Your use,
    reproduction, and distribution of the Work otherwise complies with
    the conditions stated in this License.

 5. Submission of Contributions. Unless You explicitly state otherwise,
    any Contribution intentionally submitted for inclusion in the Work
    by You to the Licensor shall be under the terms and conditions of
    this License, without any additional terms or conditions.
    Notwithstanding the above, nothing herein shall supersede or modify
    the terms of any separate license agreement you may have executed
    with Licensor regarding such Contributions.

 6. Trademarks. This License does not grant permission to use the trade
    names, trademarks, service marks, or product names of the Licensor,
    except as required for reasonable and customary use in describing the
    origin of the Work and reproducing the content of the NOTICE file.

 7. Disclaimer of Warranty. Unless required by applicable law or
    agreed to in writing, Licensor provides the Work (and each
    Contributor provides its Contributions) on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
    implied, including, without limitation, any warranties or conditions
    of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
    PARTICULAR PURPOSE. You are solely responsible for determining the
    appropriateness of using or redistributing the Work and assume any
    risks associated with Your exercise of permissions under this License.

 8. Limitation of Liability. In no event and under no legal theory,
    whether in tort (including negligence), contract, or otherwise,
    unless required by applicable law (such as deliberate and grossly
    negligent acts) or agreed to in writing, shall any Contributor be
    liable to You for damages, including any direct, indirect, special,
    incidental, or consequential damages of any character arising as a
    result of this License or out of the use or inability to use the
    Work (including but not limited to damages for loss of goodwill,
    work stoppage, computer failure or malfunction, or any and all
    other commercial damages or losses), even if such Contributor
    has been advised of the possibility of such damages.

 9. Accepting Warranty or Additional Liability. While redistributing
    the Work or Derivative Works thereof, You may choose to offer,
    and charge a fee for, acceptance of support, warranty, indemnity,
    or other liability obligations and/or rights consistent with this
    License. However, in accepting such obligations, You may act only
    on Your own behalf and on Your sole responsibility, not on behalf
    of any other Contributor, and only if You agree to indemnify,
    defend, and hold each Contributor harmless for any liability
    incurred by, or claims asserted against, such Contributor by reason
    of your accepting any such warranty or additional liability.

 END OF TERMS AND CONDITIONS

 APPENDIX: How to apply the Apache License to your work.

    To apply the Apache License to your work, attach the following
    boilerplate notice, with the fields enclosed by brackets "[]"
    replaced with your own identifying information. (Don't include
    the brackets!)  The text should be enclosed in the appropriate
    comment syntax for the file format. We also recommend that a
    file or class name and description of purpose be included on the
    same "printed page" as the copyright notice for easier
    identification within third-party archives.

 Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
{
  "name": "rxjs",
  "version": "7.5.6",
  "description": "Reactive Extensions for modern JavaScript",
  "main": "./dist/cjs/index.js",
  "module": "./dist/esm5/index.js",
  "es2015": "./dist/esm/index.js",
  "types": "index.d.ts",
  "typesVersions": {
    ">=4.2": {
      "*": [
        "dist/types/*"
      ]
    }
  },
  "sideEffects": false,
  "exports": {
    ".": {
      "types": "./dist/types/index.d.ts",
      "node": "./dist/cjs/index.js",
      "require": "./dist/cjs/index.js",
      "es2015": "./dist/esm/index.js",
      "default": "./dist/esm5/index.js"
    },
    "./ajax": {
      "types": "./dist/types/ajax/index.d.ts",
      "node": "./dist/cjs/ajax/index.js",
      "require": "./dist/cjs/ajax/index.js",
      "es2015": "./dist/esm/ajax/index.js",
      "default": "./dist/esm5/ajax/index.js"
    },
    "./fetch": {
      "types": "./dist/types/fetch/index.d.ts",
      "node": "./dist/cjs/fetch/index.js",
      "require": "./dist/cjs/fetch/index.js",
      "es2015": "./dist/esm/fetch/index.js",
      "default": "./dist/esm5/fetch/index.js"
    },
    "./operators": {
      "types": "./dist/types/operators/index.d.ts",
      "node": "./dist/cjs/operators/index.js",
      "require": "./dist/cjs/operators/index.js",
      "es2015": "./dist/esm/operators/index.js",
      "default": "./dist/esm5/operators/index.js"
    },
    "./testing": {
      "types": "./dist/types/testing/index.d.ts",
      "node": "./dist/cjs/testing/index.js",
      "require": "./dist/cjs/testing/index.js",
      "es2015": "./dist/esm/testing/index.js",
      "default": "./dist/esm5/testing/index.js"
    },
    "./webSocket": {
      "types": "./dist/types/webSocket/index.d.ts",
      "node": "./dist/cjs/webSocket/index.js",
      "require": "./dist/cjs/webSocket/index.js",
      "es2015": "./dist/esm/webSocket/index.js",
      "default": "./dist/esm5/webSocket/index.js"
    },
    "./internal/*": {
      "types": "./dist/types/internal/*.d.ts",
      "node": "./dist/cjs/internal/*.js",
      "require": "./dist/cjs/internal/*.js",
      "es2015": "./dist/esm/internal/*.js",
      "default": "./dist/esm5/internal/*.js"
    },
    "./package.json": "./package.json"
  },
  "config": {
    "commitizen": {
      "path": "cz-conventional-changelog"
    }
  },
  "lint-staged": {
    "*.js": "eslint --cache --fix",
    "(src|spec)/**/*.ts": [
      "tslint --fix",
      "prettier --write"
    ],
    "*.{js,css,md}": "prettier --write"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/reactivex/rxjs.git"
  },
  "author": "Ben Lesh <ben@benlesh.com>",
  "license": "Apache-2.0",
  "homepage": "https://rxjs.dev",
  "dependencies": {
    "tslib": "^2.1.0"
  },
  "devDependencies": {
    "@angular-devkit/build-optimizer": "0.4.6",
    "@angular-devkit/schematics": "^11.0.7",
    "@swc/core": "^1.2.128",
    "@swc/helpers": "^0.3.2",
    "@types/chai": "^4.2.11",
    "@types/lodash": "4.14.102",
    "@types/mocha": "^7.0.2",
    "@types/node": "^14.14.6",
    "@types/shelljs": "^0.8.8",
    "@types/sinon": "4.1.3",
    "@types/sinon-chai": "2.7.29",
    "@types/source-map": "^0.5.2",
    "@typescript-eslint/eslint-plugin": "^4.29.1",
    "@typescript-eslint/parser": "^4.29.1",
    "babel-polyfill": "6.26.0",
    "chai": "^4.2.0",
    "check-side-effects": "0.0.23",
    "color": "3.0.0",
    "colors": "1.1.2",
    "cross-env": "5.1.3",
    "cz-conventional-changelog": "1.2.0",
    "dependency-cruiser": "^9.12.0",
    "escape-string-regexp": "1.0.5",
    "eslint": "^7.8.1",
    "eslint-plugin-jasmine": "^2.10.1",
    "form-data": "^3.0.0",
    "fs-extra": "^8.1.0",
    "glob": "7.1.2",
    "google-closure-compiler-js": "20170218.0.0",
    "husky": "^4.2.5",
    "klaw-sync": "3.0.2",
    "lint-staged": "^10.2.11",
    "lodash": "^4.17.15",
    "minimist": "^1.2.5",
    "mocha": "^8.1.3",
    "nodemon": "^1.9.2",
    "npm-run-all": "4.1.2",
    "opn-cli": "3.1.0",
    "platform": "1.3.5",
    "prettier": "^2.5.1",
    "promise": "8.0.1",
    "rollup": "0.66.6",
    "rollup-plugin-alias": "1.4.0",
    "rollup-plugin-inject": "2.0.0",
    "rollup-plugin-node-resolve": "2.0.0",
    "shelljs": "^0.8.4",
    "shx": "^0.3.2",
    "sinon": "4.3.0",
    "sinon-chai": "2.14.0",
    "source-map-support": "0.5.3",
    "systemjs": "^0.21.0",
    "ts-api-guardian": "^0.5.0",
    "ts-node": "^9.1.1",
    "tslint": "^5.20.1",
    "tslint-config-prettier": "^1.18.0",
    "tslint-etc": "1.13.10",
    "tslint-no-toplevel-property-access": "0.0.2",
    "tslint-no-unused-expression-chai": "0.0.3",
    "typescript": "~4.2.0",
    "validate-commit-msg": "2.14.0",
    "web-streams-polyfill": "^3.0.2",
    "webpack": "^4.31.0"
  },
  "files": [
    "dist/bundles",
    "dist/cjs/**/!(*.tsbuildinfo)",
    "dist/esm/**/!(*.tsbuildinfo)",
    "dist/esm5/**/!(*.tsbuildinfo)",
    "dist/types/**/!(*.tsbuildinfo)",
    "ajax",
    "fetch",
    "operators",
    "testing",
    "webSocket",
    "src",
    "CHANGELOG.md",
    "CODE_OF_CONDUCT.md",
    "LICENSE.txt",
    "package.json",
    "README.md",
    "tsconfig.json"
  ],
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged",
      "commit-msg": "validate-commit-msg"
    }
  }
}{
  "compilerOptions": {
    "incremental": true,
    "removeComments": true,
    "preserveConstEnums": true,
    "sourceMap": true,
    "strict": true,
    "noImplicitReturns": true,
    "moduleResolution": "node",
    "stripInternal": true,
    "noEmit": true,
    "lib": [
      "esnext",
      "dom"
    ],
    "target": "esnext",
    "baseUrl": ".",
    "paths": {
      "rxjs": ["./src/index"],
      "rxjs/operators": ["./src/operators/index"],
      "rxjs/testing": ["./src/testing/index"],
      "rxjs/ajax": ["./src/ajax/index"],
      "rxjs/webSocket": ["./src/webSocket/index"],
      "rxjs/fetch": ["./src/fetch/index"],
      "rxjs/internal/*": ["./src/internal/*"]
    }
  }
}
{
  "name": "rxjs/webSocket",
  "types": "../dist/types/webSocket/index.d.ts",
  "main": "../dist/cjs/webSocket/index.js",
  "module": "../dist/esm5/webSocket/index.js",
  "es2015": "../dist/esm/webSocket/index.js",
  "sideEffects": false
}
{
  "name": "rxjs/testing",
  "types": "../dist/types/testing/index.d.ts",
  "main": "../dist/cjs/testing/index.js",
  "module": "../dist/esm5/testing/index.js",
  "es2015": "../dist/esm/testing/index.js",
  "sideEffects": false
}
(function (root, factory) {
  root.Rx = factory();
})(window || global || this, function () {
  return require('../dist/package/Rx');
});//////////////////////////////////////////////////////////
// Here we need to reference our other deep imports
// so VS code will figure out where they are
// see conversation here:
// https://github.com/microsoft/TypeScript/issues/43034
//////////////////////////////////////////////////////////

// tslint:disable: no-reference
// It's tempting to add references to all of the deep-import locations, but
// adding references to those that require DOM types breaks Node projects.
/// <reference path="./operators/index.ts" />
/// <reference path="./testing/index.ts" />
// tslint:enable: no-reference

/* Observable */
export { Observable } from './internal/Observable';
export { ConnectableObservable } from './internal/observable/ConnectableObservable';
export { GroupedObservable } from './internal/operators/groupBy';
export { Operator } from './internal/Operator';
export { observable } from './internal/symbol/observable';
export { animationFrames } from './internal/observable/dom/animationFrames';

/* Subjects */
export { Subject } from './internal/Subject';
export { BehaviorSubject } from './internal/BehaviorSubject';
export { ReplaySubject } from './internal/ReplaySubject';
export { AsyncSubject } from './internal/AsyncSubject';

/* Schedulers */
export { asap, asapScheduler } from './internal/scheduler/asap';
export { async, asyncScheduler } from './internal/scheduler/async';
export { queue, queueScheduler } from './internal/scheduler/queue';
export { animationFrame, animationFrameScheduler } from './internal/scheduler/animationFrame';
export { VirtualTimeScheduler, VirtualAction } from './internal/scheduler/VirtualTimeScheduler';
export { Scheduler } from './internal/Scheduler';

/* Subscription */
export { Subscription } from './internal/Subscription';
export { Subscriber } from './internal/Subscriber';

/* Notification */
export { Notification, NotificationKind } from './internal/Notification';

/* Utils */
export { pipe } from './internal/util/pipe';
export { noop } from './internal/util/noop';
export { identity } from './internal/util/identity';
export { isObservable } from './internal/util/isObservable';

/* Promise Conversion */
export { lastValueFrom } from './internal/lastValueFrom';
export { firstValueFrom } from './internal/firstValueFrom';

/* Error types */
export { ArgumentOutOfRangeError } from './internal/util/ArgumentOutOfRangeError';
export { EmptyError } from './internal/util/EmptyError';
export { NotFoundError } from './internal/util/NotFoundError';
export { ObjectUnsubscribedError } from './internal/util/ObjectUnsubscribedError';
export { SequenceError } from './internal/util/SequenceError';
export { TimeoutError } from './internal/operators/timeout';
export { UnsubscriptionError } from './internal/util/UnsubscriptionError';

/* Static observable creation exports */
export { bindCallback } from './internal/observable/bindCallback';
export { bindNodeCallback } from './internal/observable/bindNodeCallback';
export { combineLatest } from './internal/observable/combineLatest';
export { concat } from './internal/observable/concat';
export { connectable } from './internal/observable/connectable';
export { defer } from './internal/observable/defer';
export { empty } from './internal/observable/empty';
export { forkJoin } from './internal/observable/forkJoin';
export { from } from './internal/observable/from';
export { fromEvent } from './internal/observable/fromEvent';
export { fromEventPattern } from './internal/observable/fromEventPattern';
export { generate } from './internal/observable/generate';
export { iif } from './internal/observable/iif';
export { interval } from './internal/observable/interval';
export { merge } from './internal/observable/merge';
export { never } from './internal/observable/never';
export { of } from './internal/observable/of';
export { onErrorResumeNext } from './internal/observable/onErrorResumeNext';
export { pairs } from './internal/observable/pairs';
export { partition } from './internal/observable/partition';
export { race } from './internal/observable/race';
export { range } from './internal/observable/range';
export { throwError } from './internal/observable/throwError';
export { timer } from './internal/observable/timer';
export { using } from './internal/observable/using';
export { zip } from './internal/observable/zip';
export { scheduled } from './internal/scheduled/scheduled';

/* Constants */
export { EMPTY } from './internal/observable/empty';
export { NEVER } from './internal/observable/never';

/* Types */
export * from './internal/types';

/* Config */
export { config, GlobalConfig } from './internal/config';

/* Operators */
export { audit } from './internal/operators/audit';
export { auditTime } from './internal/operators/auditTime';
export { buffer } from './internal/operators/buffer';
export { bufferCount } from './internal/operators/bufferCount';
export { bufferTime } from './internal/operators/bufferTime';
export { bufferToggle } from './internal/operators/bufferToggle';
export { bufferWhen } from './internal/operators/bufferWhen';
export { catchError } from './internal/operators/catchError';
export { combineAll } from './internal/operators/combineAll';
export { combineLatestAll } from './internal/operators/combineLatestAll';
export { combineLatestWith } from './internal/operators/combineLatestWith';
export { concatAll } from './internal/operators/concatAll';
export { concatMap } from './internal/operators/concatMap';
export { concatMapTo } from './internal/operators/concatMapTo';
export { concatWith } from './internal/operators/concatWith';
export { connect, ConnectConfig } from './internal/operators/connect';
export { count } from './internal/operators/count';
export { debounce } from './internal/operators/debounce';
export { debounceTime } from './internal/operators/debounceTime';
export { defaultIfEmpty } from './internal/operators/defaultIfEmpty';
export { delay } from './internal/operators/delay';
export { delayWhen } from './internal/operators/delayWhen';
export { dematerialize } from './internal/operators/dematerialize';
export { distinct } from './internal/operators/distinct';
export { distinctUntilChanged } from './internal/operators/distinctUntilChanged';
export { distinctUntilKeyChanged } from './internal/operators/distinctUntilKeyChanged';
export { elementAt } from './internal/operators/elementAt';
export { endWith } from './internal/operators/endWith';
export { every } from './internal/operators/every';
export { exhaust } from './internal/operators/exhaust';
export { exhaustAll } from './internal/operators/exhaustAll';
export { exhaustMap } from './internal/operators/exhaustMap';
export { expand } from './internal/operators/expand';
export { filter } from './internal/operators/filter';
export { finalize } from './internal/operators/finalize';
export { find } from './internal/operators/find';
export { findIndex } from './internal/operators/findIndex';
export { first } from './internal/operators/first';
export { groupBy, BasicGroupByOptions, GroupByOptionsWithElement } from './internal/operators/groupBy';
export { ignoreElements } from './internal/operators/ignoreElements';
export { isEmpty } from './internal/operators/isEmpty';
export { last } from './internal/operators/last';
export { map } from './internal/operators/map';
export { mapTo } from './internal/operators/mapTo';
export { materialize } from './internal/operators/materialize';
export { max } from './internal/operators/max';
export { mergeAll } from './internal/operators/mergeAll';
export { flatMap } from './internal/operators/flatMap';
export { mergeMap } from './internal/operators/mergeMap';
export { mergeMapTo } from './internal/operators/mergeMapTo';
export { mergeScan } from './internal/operators/mergeScan';
export { mergeWith } from './internal/operators/mergeWith';
export { min } from './internal/operators/min';
export { multicast } from './internal/operators/multicast';
export { observeOn } from './internal/operators/observeOn';
export { pairwise } from './internal/operators/pairwise';
export { pluck } from './internal/operators/pluck';
export { publish } from './internal/operators/publish';
export { publishBehavior } from './internal/operators/publishBehavior';
export { publishLast } from './internal/operators/publishLast';
export { publishReplay } from './internal/operators/publishReplay';
export { raceWith } from './internal/operators/raceWith';
export { reduce } from './internal/operators/reduce';
export { repeat } from './internal/operators/repeat';
export { repeatWhen } from './internal/operators/repeatWhen';
export { retry, RetryConfig } from './internal/operators/retry';
export { retryWhen } from './internal/operators/retryWhen';
export { refCount } from './internal/operators/refCount';
export { sample } from './internal/operators/sample';
export { sampleTime } from './internal/operators/sampleTime';
export { scan } from './internal/operators/scan';
export { sequenceEqual } from './internal/operators/sequenceEqual';
export { share, ShareConfig } from './internal/operators/share';
export { shareReplay, ShareReplayConfig } from './internal/operators/shareReplay';
export { single } from './internal/operators/single';
export { skip } from './internal/operators/skip';
export { skipLast } from './internal/operators/skipLast';
export { skipUntil } from './internal/operators/skipUntil';
export { skipWhile } from './internal/operators/skipWhile';
export { startWith } from './internal/operators/startWith';
export { subscribeOn } from './internal/operators/subscribeOn';
export { switchAll } from './internal/operators/switchAll';
export { switchMap } from './internal/operators/switchMap';
export { switchMapTo } from './internal/operators/switchMapTo';
export { switchScan } from './internal/operators/switchScan';
export { take } from './internal/operators/take';
export { takeLast } from './internal/operators/takeLast';
export { takeUntil } from './internal/operators/takeUntil';
export { takeWhile } from './internal/operators/takeWhile';
export { tap } from './internal/operators/tap';
export { throttle, ThrottleConfig } from './internal/operators/throttle';
export { throttleTime } from './internal/operators/throttleTime';
export { throwIfEmpty } from './internal/operators/throwIfEmpty';
export { timeInterval } from './internal/operators/timeInterval';
export { timeout, TimeoutConfig, TimeoutInfo } from './internal/operators/timeout';
export { timeoutWith } from './internal/operators/timeoutWith';
export { timestamp } from './internal/operators/timestamp';
export { toArray } from './internal/operators/toArray';
export { window } from './internal/operators/window';
export { windowCount } from './internal/operators/windowCount';
export { windowTime } from './internal/operators/windowTime';
export { windowToggle } from './internal/operators/windowToggle';
export { windowWhen } from './internal/operators/windowWhen';
export { withLatestFrom } from './internal/operators/withLatestFrom';
export { zipAll } from './internal/operators/zipAll';
export { zipWith } from './internal/operators/zipWith';
{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "noEmit": false,
    "baseUrl": ".",
    "paths": {
      "rxjs": ["./"],
      "rxjs/*": ["./*"]
    }
  },
  "include": ["./**/*.ts"]
}
{
  "extends": "./tsconfig.base.json",
  "compilerOptions": {
    "module": "commonjs",
    "target": "es5",
    "downlevelIteration": true,
    "outDir": "../dist/cjs"
  },
  "exclude": ["./internal/umd.ts"]
}
{
  "extends": "./tsconfig.cjs.json",
  /**
   * this is pseudo config for test case's relative path resolution to `../src`, runs
   * cjs config once more instead of manual copying to utilize incremental build.
   */
  "compilerOptions": {
    "outDir": "../dist/src"
  }
}
{
  "extends": "./tsconfig.base.json",
  "compilerOptions": {
    "module": "esnext",
    "importHelpers": true,
    "target": "es2015",
    "outDir": "../dist/esm"
  }
}
{
  "extends": "./tsconfig.base.json",
  "compilerOptions": {
    "module": "esnext",
    "importHelpers": true,
    "target": "es5",
    "downlevelIteration": true,
    "outDir": "../dist/esm5"
  },
  "exclude": ["./internal/umd.ts"]
}
{
  "extends": "./tsconfig.esm5.json",
  "compilerOptions": {
    "outDir": "../dist/esm5_for_rollup",
    "noEmitHelpers": true
  },
  "exclude": []
}
{
  "extends": "./tsconfig.esm.json",
  "compilerOptions": {
    "composite": true,
    "module": "es2015",
    "target": "esnext",
    "removeComments": false,
    "declaration": true,
    "declarationMap": true,
    "declarationDir": "../dist/types",
    "emitDeclarationOnly": true
  },
  "exclude": ["./internal/umd.ts"]
}
{
  "extends": "./tsconfig.types.json",
  "compilerOptions": {
    "declarationDir": "../dist/types_spec",
    "stripInternal": false
  }
}
export { webSocket as webSocket } from '../internal/observable/dom/webSocket';
export { WebSocketSubject, WebSocketSubjectConfig } from '../internal/observable/dom/WebSocketSubject';
export { TestScheduler, RunHelpers } from '../internal/testing/TestScheduler';
/* Operator exports */
export { audit } from '../internal/operators/audit';
export { auditTime } from '../internal/operators/auditTime';
export { buffer } from '../internal/operators/buffer';
export { bufferCount } from '../internal/operators/bufferCount';
export { bufferTime } from '../internal/operators/bufferTime';
export { bufferToggle } from '../internal/operators/bufferToggle';
export { bufferWhen } from '../internal/operators/bufferWhen';
export { catchError } from '../internal/operators/catchError';
export { combineAll } from '../internal/operators/combineAll';
export { combineLatestAll } from '../internal/operators/combineLatestAll';
export { combineLatest } from '../internal/operators/combineLatest';
export { combineLatestWith } from '../internal/operators/combineLatestWith';
export { concat } from '../internal/operators/concat';
export { concatAll } from '../internal/operators/concatAll';
export { concatMap } from '../internal/operators/concatMap';
export { concatMapTo } from '../internal/operators/concatMapTo';
export { concatWith } from '../internal/operators/concatWith';
export { connect, ConnectConfig } from '../internal/operators/connect';
export { count } from '../internal/operators/count';
export { debounce } from '../internal/operators/debounce';
export { debounceTime } from '../internal/operators/debounceTime';
export { defaultIfEmpty } from '../internal/operators/defaultIfEmpty';
export { delay } from '../internal/operators/delay';
export { delayWhen } from '../internal/operators/delayWhen';
export { dematerialize } from '../internal/operators/dematerialize';
export { distinct } from '../internal/operators/distinct';
export { distinctUntilChanged } from '../internal/operators/distinctUntilChanged';
export { distinctUntilKeyChanged } from '../internal/operators/distinctUntilKeyChanged';
export { elementAt } from '../internal/operators/elementAt';
export { endWith } from '../internal/operators/endWith';
export { every } from '../internal/operators/every';
export { exhaust } from '../internal/operators/exhaust';
export { exhaustAll } from '../internal/operators/exhaustAll';
export { exhaustMap } from '../internal/operators/exhaustMap';
export { expand } from '../internal/operators/expand';
export { filter } from '../internal/operators/filter';
export { finalize } from '../internal/operators/finalize';
export { find } from '../internal/operators/find';
export { findIndex } from '../internal/operators/findIndex';
export { first } from '../internal/operators/first';
export { groupBy, BasicGroupByOptions, GroupByOptionsWithElement } from '../internal/operators/groupBy';
export { ignoreElements } from '../internal/operators/ignoreElements';
export { isEmpty } from '../internal/operators/isEmpty';
export { last } from '../internal/operators/last';
export { map } from '../internal/operators/map';
export { mapTo } from '../internal/operators/mapTo';
export { materialize } from '../internal/operators/materialize';
export { max } from '../internal/operators/max';
export { merge } from '../internal/operators/merge';
export { mergeAll } from '../internal/operators/mergeAll';
export { flatMap } from '../internal/operators/flatMap';
export { mergeMap } from '../internal/operators/mergeMap';
export { mergeMapTo } from '../internal/operators/mergeMapTo';
export { mergeScan } from '../internal/operators/mergeScan';
export { mergeWith } from '../internal/operators/mergeWith';
export { min } from '../internal/operators/min';
export { multicast } from '../internal/operators/multicast';
export { observeOn } from '../internal/operators/observeOn';
export { onErrorResumeNext } from '../internal/operators/onErrorResumeNext';
export { pairwise } from '../internal/operators/pairwise';
export { partition } from '../internal/operators/partition';
export { pluck } from '../internal/operators/pluck';
export { publish } from '../internal/operators/publish';
export { publishBehavior } from '../internal/operators/publishBehavior';
export { publishLast } from '../internal/operators/publishLast';
export { publishReplay } from '../internal/operators/publishReplay';
export { race } from '../internal/operators/race';
export { raceWith } from '../internal/operators/raceWith';
export { reduce } from '../internal/operators/reduce';
export { repeat } from '../internal/operators/repeat';
export { repeatWhen } from '../internal/operators/repeatWhen';
export { retry, RetryConfig } from '../internal/operators/retry';
export { retryWhen } from '../internal/operators/retryWhen';
export { refCount } from '../internal/operators/refCount';
export { sample } from '../internal/operators/sample';
export { sampleTime } from '../internal/operators/sampleTime';
export { scan } from '../internal/operators/scan';
export { sequenceEqual } from '../internal/operators/sequenceEqual';
export { share, ShareConfig } from '../internal/operators/share';
export { shareReplay, ShareReplayConfig } from '../internal/operators/shareReplay';
export { single } from '../internal/operators/single';
export { skip } from '../internal/operators/skip';
export { skipLast } from '../internal/operators/skipLast';
export { skipUntil } from '../internal/operators/skipUntil';
export { skipWhile } from '../internal/operators/skipWhile';
export { startWith } from '../internal/operators/startWith';
export { subscribeOn } from '../internal/operators/subscribeOn';
export { switchAll } from '../internal/operators/switchAll';
export { switchMap } from '../internal/operators/switchMap';
export { switchMapTo } from '../internal/operators/switchMapTo';
export { switchScan } from '../internal/operators/switchScan';
export { take } from '../internal/operators/take';
export { takeLast } from '../internal/operators/takeLast';
export { takeUntil } from '../internal/operators/takeUntil';
export { takeWhile } from '../internal/operators/takeWhile';
export { tap } from '../internal/operators/tap';
export { throttle, ThrottleConfig } from '../internal/operators/throttle';
export { throttleTime } from '../internal/operators/throttleTime';
export { throwIfEmpty } from '../internal/operators/throwIfEmpty';
export { timeInterval } from '../internal/operators/timeInterval';
export { timeout, TimeoutConfig, TimeoutInfo } from '../internal/operators/timeout';
export { timeoutWith } from '../internal/operators/timeoutWith';
export { timestamp } from '../internal/operators/timestamp';
export { toArray } from '../internal/operators/toArray';
export { window } from '../internal/operators/window';
export { windowCount } from '../internal/operators/windowCount';
export { windowTime } from '../internal/operators/windowTime';
export { windowToggle } from '../internal/operators/windowToggle';
export { windowWhen } from '../internal/operators/windowWhen';
export { withLatestFrom } from '../internal/operators/withLatestFrom';
export { zip } from '../internal/operators/zip';
export { zipAll } from '../internal/operators/zipAll';
export { zipWith } from '../internal/operators/zipWith';
/*
 * Note that we cannot apply the `internal` tag here because the declaration
 * needs to survive the `stripInternal` option. Otherwise, `AnyCatcher` will
 * be `any` in the `.d.ts` files.
 */
declare const anyCatcherSymbol: unique symbol;

/**
 * This is just a type that we're using to identify `any` being passed to
 * function overloads. This is used because of situations like {@link forkJoin},
 * where it could return an `Observable<T[]>` or an `Observable<{ [key: K]: T }>`,
 * so `forkJoin(any)` would mean we need to return `Observable<unknown>`.
 */
export type AnyCatcher = typeof anyCatcherSymbol;
import { Subject } from './Subject';
import { Subscriber } from './Subscriber';

/**
 * A variant of Subject that only emits a value when it completes. It will emit
 * its latest value to all its observers on completion.
 *
 * @class AsyncSubject<T>
 */
export class AsyncSubject<T> extends Subject<T> {
  private _value: T | null = null;
  private _hasValue = false;
  private _isComplete = false;

  /** @internal */
  protected _checkFinalizedStatuses(subscriber: Subscriber<T>) {
    const { hasError, _hasValue, _value, thrownError, isStopped, _isComplete } = this;
    if (hasError) {
      subscriber.error(thrownError);
    } else if (isStopped || _isComplete) {
      _hasValue && subscriber.next(_value!);
      subscriber.complete();
    }
  }

  next(value: T): void {
    if (!this.isStopped) {
      this._value = value;
      this._hasValue = true;
    }
  }

  complete(): void {
    const { _hasValue, _value, _isComplete } = this;
    if (!_isComplete) {
      this._isComplete = true;
      _hasValue && super.next(_value!);
      super.complete();
    }
  }
}
import { Subject } from './Subject';
import { Subscriber } from './Subscriber';
import { Subscription } from './Subscription';

/**
 * A variant of Subject that requires an initial value and emits its current
 * value whenever it is subscribed to.
 *
 * @class BehaviorSubject<T>
 */
export class BehaviorSubject<T> extends Subject<T> {
  constructor(private _value: T) {
    super();
  }

  get value(): T {
    return this.getValue();
  }

  /** @internal */
  protected _subscribe(subscriber: Subscriber<T>): Subscription {
    const subscription = super._subscribe(subscriber);
    !subscription.closed && subscriber.next(this._value);
    return subscription;
  }

  getValue(): T {
    const { hasError, thrownError, _value } = this;
    if (hasError) {
      throw thrownError;
    }
    this._throwIfClosed();
    return _value;
  }

  next(value: T): void {
    super.next((this._value = value));
  }
}
import { PartialObserver, ObservableNotification, CompleteNotification, NextNotification, ErrorNotification } from './types';
import { Observable } from './Observable';
import { EMPTY } from './observable/empty';
import { of } from './observable/of';
import { throwError } from './observable/throwError';
import { isFunction } from './util/isFunction';

// TODO: When this enum is removed, replace it with a type alias. See #4556.
/**
 * @deprecated Use a string literal instead. `NotificationKind` will be replaced with a type alias in v8.
 * It will not be replaced with a const enum as those are not compatible with isolated modules.
 */
export enum NotificationKind {
  NEXT = 'N',
  ERROR = 'E',
  COMPLETE = 'C',
}

/**
 * Represents a push-based event or value that an {@link Observable} can emit.
 * This class is particularly useful for operators that manage notifications,
 * like {@link materialize}, {@link dematerialize}, {@link observeOn}, and
 * others. Besides wrapping the actual delivered value, it also annotates it
 * with metadata of, for instance, what type of push message it is (`next`,
 * `error`, or `complete`).
 *
 * @see {@link materialize}
 * @see {@link dematerialize}
 * @see {@link observeOn}
 * @deprecated It is NOT recommended to create instances of `Notification` directly.
 * Rather, try to create POJOs matching the signature outlined in {@link ObservableNotification}.
 * For example: `{ kind: 'N', value: 1 }`, `{ kind: 'E', error: new Error('bad') }`, or `{ kind: 'C' }`.
 * Will be removed in v8.
 */
export class Notification<T> {
  /**
   * A value signifying that the notification will "next" if observed. In truth,
   * This is really synonymous with just checking `kind === "N"`.
   * @deprecated Will be removed in v8. Instead, just check to see if the value of `kind` is `"N"`.
   */
  readonly hasValue: boolean;

  /**
   * Creates a "Next" notification object.
   * @param kind Always `'N'`
   * @param value The value to notify with if observed.
   * @deprecated Internal implementation detail. Use {@link Notification#createNext createNext} instead.
   */
  constructor(kind: 'N', value?: T);
  /**
   * Creates an "Error" notification object.
   * @param kind Always `'E'`
   * @param value Always `undefined`
   * @param error The error to notify with if observed.
   * @deprecated Internal implementation detail. Use {@link Notification#createError createError} instead.
   */
  constructor(kind: 'E', value: undefined, error: any);
  /**
   * Creates a "completion" notification object.
   * @param kind Always `'C'`
   * @deprecated Internal implementation detail. Use {@link Notification#createComplete createComplete} instead.
   */
  constructor(kind: 'C');
  constructor(public readonly kind: 'N' | 'E' | 'C', public readonly value?: T, public readonly error?: any) {
    this.hasValue = kind === 'N';
  }

  /**
   * Executes the appropriate handler on a passed `observer` given the `kind` of notification.
   * If the handler is missing it will do nothing. Even if the notification is an error, if
   * there is no error handler on the observer, an error will not be thrown, it will noop.
   * @param observer The observer to notify.
   */
  observe(observer: PartialObserver<T>): void {
    return observeNotification(this as ObservableNotification<T>, observer);
  }

  /**
   * Executes a notification on the appropriate handler from a list provided.
   * If a handler is missing for the kind of notification, nothing is called
   * and no error is thrown, it will be a noop.
   * @param next A next handler
   * @param error An error handler
   * @param complete A complete handler
   * @deprecated Replaced with {@link Notification#observe observe}. Will be removed in v8.
   */
  do(next: (value: T) => void, error: (err: any) => void, complete: () => void): void;
  /**
   * Executes a notification on the appropriate handler from a list provided.
   * If a handler is missing for the kind of notification, nothing is called
   * and no error is thrown, it will be a noop.
   * @param next A next handler
   * @param error An error handler
   * @deprecated Replaced with {@link Notification#observe observe}. Will be removed in v8.
   */
  do(next: (value: T) => void, error: (err: any) => void): void;
  /**
   * Executes the next handler if the Notification is of `kind` `"N"`. Otherwise
   * this will not error, and it will be a noop.
   * @param next The next handler
   * @deprecated Replaced with {@link Notification#observe observe}. Will be removed in v8.
   */
  do(next: (value: T) => void): void;
  do(nextHandler: (value: T) => void, errorHandler?: (err: any) => void, completeHandler?: () => void): void {
    const { kind, value, error } = this;
    return kind === 'N' ? nextHandler?.(value!) : kind === 'E' ? errorHandler?.(error) : completeHandler?.();
  }

  /**
   * Executes a notification on the appropriate handler from a list provided.
   * If a handler is missing for the kind of notification, nothing is called
   * and no error is thrown, it will be a noop.
   * @param next A next handler
   * @param error An error handler
   * @param complete A complete handler
   * @deprecated Replaced with {@link Notification#observe observe}. Will be removed in v8.
   */
  accept(next: (value: T) => void, error: (err: any) => void, complete: () => void): void;
  /**
   * Executes a notification on the appropriate handler from a list provided.
   * If a handler is missing for the kind of notification, nothing is called
   * and no error is thrown, it will be a noop.
   * @param next A next handler
   * @param error An error handler
   * @deprecated Replaced with {@link Notification#observe observe}. Will be removed in v8.
   */
  accept(next: (value: T) => void, error: (err: any) => void): void;
  /**
   * Executes the next handler if the Notification is of `kind` `"N"`. Otherwise
   * this will not error, and it will be a noop.
   * @param next The next handler
   * @deprecated Replaced with {@link Notification#observe observe}. Will be removed in v8.
   */
  accept(next: (value: T) => void): void;

  /**
   * Executes the appropriate handler on a passed `observer` given the `kind` of notification.
   * If the handler is missing it will do nothing. Even if the notification is an error, if
   * there is no error handler on the observer, an error will not be thrown, it will noop.
   * @param observer The observer to notify.
   * @deprecated Replaced with {@link Notification#observe observe}. Will be removed in v8.
   */
  accept(observer: PartialObserver<T>): void;
  accept(nextOrObserver: PartialObserver<T> | ((value: T) => void), error?: (err: any) => void, complete?: () => void) {
    return isFunction((nextOrObserver as any)?.next)
      ? this.observe(nextOrObserver as PartialObserver<T>)
      : this.do(nextOrObserver as (value: T) => void, error as any, complete as any);
  }

  /**
   * Returns a simple Observable that just delivers the notification represented
   * by this Notification instance.
   *
   * @deprecated Will be removed in v8. To convert a `Notification` to an {@link Observable},
   * use {@link of} and {@link dematerialize}: `of(notification).pipe(dematerialize())`.
   */
  toObservable(): Observable<T> {
    const { kind, value, error } = this;
    // Select the observable to return by `kind`
    const result =
      kind === 'N'
        ? // Next kind. Return an observable of that value.
          of(value!)
        : //
        kind === 'E'
        ? // Error kind. Return an observable that emits the error.
          throwError(() => error)
        : //
        kind === 'C'
        ? // Completion kind. Kind is "C", return an observable that just completes.
          EMPTY
        : // Unknown kind, return falsy, so we error below.
          0;
    if (!result) {
      // TODO: consider removing this check. The only way to cause this would be to
      // use the Notification constructor directly in a way that is not type-safe.
      // and direct use of the Notification constructor is deprecated.
      throw new TypeError(`Unexpected notification kind ${kind}`);
    }
    return result;
  }

  private static completeNotification = new Notification('C') as Notification<never> & CompleteNotification;
  /**
   * A shortcut to create a Notification instance of the type `next` from a
   * given value.
   * @param {T} value The `next` value.
   * @return {Notification<T>} The "next" Notification representing the
   * argument.
   * @nocollapse
   * @deprecated It is NOT recommended to create instances of `Notification` directly.
   * Rather, try to create POJOs matching the signature outlined in {@link ObservableNotification}.
   * For example: `{ kind: 'N', value: 1 }`, `{ kind: 'E', error: new Error('bad') }`, or `{ kind: 'C' }`.
   * Will be removed in v8.
   */
  static createNext<T>(value: T) {
    return new Notification('N', value) as Notification<T> & NextNotification<T>;
  }

  /**
   * A shortcut to create a Notification instance of the type `error` from a
   * given error.
   * @param {any} [err] The `error` error.
   * @return {Notification<T>} The "error" Notification representing the
   * argument.
   * @nocollapse
   * @deprecated It is NOT recommended to create instances of `Notification` directly.
   * Rather, try to create POJOs matching the signature outlined in {@link ObservableNotification}.
   * For example: `{ kind: 'N', value: 1 }`, `{ kind: 'E', error: new Error('bad') }`, or `{ kind: 'C' }`.
   * Will be removed in v8.
   */
  static createError(err?: any) {
    return new Notification('E', undefined, err) as Notification<never> & ErrorNotification;
  }

  /**
   * A shortcut to create a Notification instance of the type `complete`.
   * @return {Notification<any>} The valueless "complete" Notification.
   * @nocollapse
   * @deprecated It is NOT recommended to create instances of `Notification` directly.
   * Rather, try to create POJOs matching the signature outlined in {@link ObservableNotification}.
   * For example: `{ kind: 'N', value: 1 }`, `{ kind: 'E', error: new Error('bad') }`, or `{ kind: 'C' }`.
   * Will be removed in v8.
   */
  static createComplete(): Notification<never> & CompleteNotification {
    return Notification.completeNotification;
  }
}

/**
 * Executes the appropriate handler on a passed `observer` given the `kind` of notification.
 * If the handler is missing it will do nothing. Even if the notification is an error, if
 * there is no error handler on the observer, an error will not be thrown, it will noop.
 * @param notification The notification object to observe.
 * @param observer The observer to notify.
 */
export function observeNotification<T>(notification: ObservableNotification<T>, observer: PartialObserver<T>) {
  const { kind, value, error } = notification as any;
  if (typeof kind !== 'string') {
    throw new TypeError('Invalid notification, missing "kind"');
  }
  kind === 'N' ? observer.next?.(value!) : kind === 'E' ? observer.error?.(error) : observer.complete?.();
}
import { CompleteNotification, NextNotification, ErrorNotification } from './types';

/**
 * A completion object optimized for memory use and created to be the
 * same "shape" as other notifications in v8.
 * @internal
 */
export const COMPLETE_NOTIFICATION = (() => createNotification('C', undefined, undefined) as CompleteNotification)();

/**
 * Internal use only. Creates an optimized error notification that is the same "shape"
 * as other notifications.
 * @internal
 */
export function errorNotification(error: any): ErrorNotification {
  return createNotification('E', undefined, error) as any;
}

/**
 * Internal use only. Creates an optimized next notification that is the same "shape"
 * as other notifications.
 * @internal
 */
export function nextNotification<T>(value: T) {
  return createNotification('N', value, undefined) as NextNotification<T>;
}

/**
 * Ensures that all notifications created internally have the same "shape" in v8.
 *
 * TODO: This is only exported to support a crazy legacy test in `groupBy`.
 * @internal
 */
export function createNotification(kind: 'N' | 'E' | 'C', value: any, error: any) {
  return {
    kind,
    value,
    error,
  };
}
import { Operator } from './Operator';
import { SafeSubscriber, Subscriber } from './Subscriber';
import { isSubscription, Subscription } from './Subscription';
import { TeardownLogic, OperatorFunction, Subscribable, Observer } from './types';
import { observable as Symbol_observable } from './symbol/observable';
import { pipeFromArray } from './util/pipe';
import { config } from './config';
import { isFunction } from './util/isFunction';
import { errorContext } from './util/errorContext';

/**
 * A representation of any set of values over any amount of time. This is the most basic building block
 * of RxJS.
 *
 * @class Observable<T>
 */
export class Observable<T> implements Subscribable<T> {
  /**
   * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.
   */
  source: Observable<any> | undefined;

  /**
   * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.
   */
  operator: Operator<any, T> | undefined;

  /**
   * @constructor
   * @param {Function} subscribe the function that is called when the Observable is
   * initially subscribed to. This function is given a Subscriber, to which new values
   * can be `next`ed, or an `error` method can be called to raise an error, or
   * `complete` can be called to notify of a successful completion.
   */
  constructor(subscribe?: (this: Observable<T>, subscriber: Subscriber<T>) => TeardownLogic) {
    if (subscribe) {
      this._subscribe = subscribe;
    }
  }

  // HACK: Since TypeScript inherits static properties too, we have to
  // fight against TypeScript here so Subject can have a different static create signature
  /**
   * Creates a new Observable by calling the Observable constructor
   * @owner Observable
   * @method create
   * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor
   * @return {Observable} a new observable
   * @nocollapse
   * @deprecated Use `new Observable()` instead. Will be removed in v8.
   */
  static create: (...args: any[]) => any = <T>(subscribe?: (subscriber: Subscriber<T>) => TeardownLogic) => {
    return new Observable<T>(subscribe);
  };

  /**
   * Creates a new Observable, with this Observable instance as the source, and the passed
   * operator defined as the new observable's operator.
   * @method lift
   * @param operator the operator defining the operation to take on the observable
   * @return a new observable with the Operator applied
   * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.
   * If you have implemented an operator using `lift`, it is recommended that you create an
   * operator by simply returning `new Observable()` directly. See "Creating new operators from
   * scratch" section here: https://rxjs.dev/guide/operators
   */
  lift<R>(operator?: Operator<T, R>): Observable<R> {
    const observable = new Observable<R>();
    observable.source = this;
    observable.operator = operator;
    return observable;
  }

  subscribe(observer?: Partial<Observer<T>>): Subscription;
  subscribe(next: (value: T) => void): Subscription;
  /** @deprecated Instead of passing separate callback arguments, use an observer argument. Signatures taking separate callback arguments will be removed in v8. Details: https://rxjs.dev/deprecations/subscribe-arguments */
  subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription;
  /**
   * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.
   *
   * <span class="informal">Use it when you have all these Observables, but still nothing is happening.</span>
   *
   * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It
   * might be for example a function that you passed to Observable's constructor, but most of the time it is
   * a library implementation, which defines what will be emitted by an Observable, and when it be will emitted. This means
   * that calling `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often
   * the thought.
   *
   * Apart from starting the execution of an Observable, this method allows you to listen for values
   * that an Observable emits, as well as for when it completes or errors. You can achieve this in two
   * of the following ways.
   *
   * The first way is creating an object that implements {@link Observer} interface. It should have methods
   * defined by that interface, but note that it should be just a regular JavaScript object, which you can create
   * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular, do
   * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also
   * that your object does not have to implement all methods. If you find yourself creating a method that doesn't
   * do anything, you can simply omit it. Note however, if the `error` method is not provided and an error happens,
   * it will be thrown asynchronously. Errors thrown asynchronously cannot be caught using `try`/`catch`. Instead,
   * use the {@link onUnhandledError} configuration option or use a runtime handler (like `window.onerror` or
   * `process.on('error)`) to be notified of unhandled errors. Because of this, it's recommended that you provide
   * an `error` method to avoid missing thrown errors.
   *
   * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.
   * This means you can provide three functions as arguments to `subscribe`, where the first function is equivalent
   * of a `next` method, the second of an `error` method and the third of a `complete` method. Just as in case of an Observer,
   * if you do not need to listen for something, you can omit a function by passing `undefined` or `null`,
   * since `subscribe` recognizes these functions by where they were placed in function call. When it comes
   * to the `error` function, as with an Observer, if not provided, errors emitted by an Observable will be thrown asynchronously.
   *
   * You can, however, subscribe with no parameters at all. This may be the case where you're not interested in terminal events
   * and you also handled emissions internally by using operators (e.g. using `tap`).
   *
   * Whichever style of calling `subscribe` you use, in both cases it returns a Subscription object.
   * This object allows you to call `unsubscribe` on it, which in turn will stop the work that an Observable does and will clean
   * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback
   * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.
   *
   * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.
   * It is an Observable itself that decides when these functions will be called. For example {@link of}
   * by default emits all its values synchronously. Always check documentation for how given Observable
   * will behave when subscribed and if its default behavior can be modified with a `scheduler`.
   *
   * #### Examples
   *
   * Subscribe with an {@link guide/observer Observer}
   *
   * ```ts
   * import { of } from 'rxjs';
   *
   * const sumObserver = {
   *   sum: 0,
   *   next(value) {
   *     console.log('Adding: ' + value);
   *     this.sum = this.sum + value;
   *   },
   *   error() {
   *     // We actually could just remove this method,
   *     // since we do not really care about errors right now.
   *   },
   *   complete() {
   *     console.log('Sum equals: ' + this.sum);
   *   }
   * };
   *
   * of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.
   *   .subscribe(sumObserver);
   *
   * // Logs:
   * // 'Adding: 1'
   * // 'Adding: 2'
   * // 'Adding: 3'
   * // 'Sum equals: 6'
   * ```
   *
   * Subscribe with functions ({@link deprecations/subscribe-arguments deprecated})
   *
   * ```ts
   * import { of } from 'rxjs'
   *
   * let sum = 0;
   *
   * of(1, 2, 3).subscribe(
   *   value => {
   *     console.log('Adding: ' + value);
   *     sum = sum + value;
   *   },
   *   undefined,
   *   () => console.log('Sum equals: ' + sum)
   * );
   *
   * // Logs:
   * // 'Adding: 1'
   * // 'Adding: 2'
   * // 'Adding: 3'
   * // 'Sum equals: 6'
   * ```
   *
   * Cancel a subscription
   *
   * ```ts
   * import { interval } from 'rxjs';
   *
   * const subscription = interval(1000).subscribe({
   *   next(num) {
   *     console.log(num)
   *   },
   *   complete() {
   *     // Will not be called, even when cancelling subscription.
   *     console.log('completed!');
   *   }
   * });
   *
   * setTimeout(() => {
   *   subscription.unsubscribe();
   *   console.log('unsubscribed!');
   * }, 2500);
   *
   * // Logs:
   * // 0 after 1s
   * // 1 after 2s
   * // 'unsubscribed!' after 2.5s
   * ```
   *
   * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,
   * or the first of three possible handlers, which is the handler for each value emitted from the subscribed
   * Observable.
   * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided,
   * the error will be thrown asynchronously as unhandled.
   * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion.
   * @return {Subscription} a subscription reference to the registered handlers
   * @method subscribe
   */
  subscribe(
    observerOrNext?: Partial<Observer<T>> | ((value: T) => void) | null,
    error?: ((error: any) => void) | null,
    complete?: (() => void) | null
  ): Subscription {
    const subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);

    errorContext(() => {
      const { operator, source } = this;
      subscriber.add(
        operator
          ? // We're dealing with a subscription in the
            // operator chain to one of our lifted operators.
            operator.call(subscriber, source)
          : source
          ? // If `source` has a value, but `operator` does not, something that
            // had intimate knowledge of our API, like our `Subject`, must have
            // set it. We're going to just call `_subscribe` directly.
            this._subscribe(subscriber)
          : // In all other cases, we're likely wrapping a user-provided initializer
            // function, so we need to catch errors and handle them appropriately.
            this._trySubscribe(subscriber)
      );
    });

    return subscriber;
  }

  /** @internal */
  protected _trySubscribe(sink: Subscriber<T>): TeardownLogic {
    try {
      return this._subscribe(sink);
    } catch (err) {
      // We don't need to return anything in this case,
      // because it's just going to try to `add()` to a subscription
      // above.
      sink.error(err);
    }
  }

  /**
   * Used as a NON-CANCELLABLE means of subscribing to an observable, for use with
   * APIs that expect promises, like `async/await`. You cannot unsubscribe from this.
   *
   * **WARNING**: Only use this with observables you *know* will complete. If the source
   * observable does not complete, you will end up with a promise that is hung up, and
   * potentially all of the state of an async function hanging out in memory. To avoid
   * this situation, look into adding something like {@link timeout}, {@link take},
   * {@link takeWhile}, or {@link takeUntil} amongst others.
   *
   * #### Example
   *
   * ```ts
   * import { interval, take } from 'rxjs';
   *
   * const source$ = interval(1000).pipe(take(4));
   *
   * async function getTotal() {
   *   let total = 0;
   *
   *   await source$.forEach(value => {
   *     total += value;
   *     console.log('observable -> ' + value);
   *   });
   *
   *   return total;
   * }
   *
   * getTotal().then(
   *   total => console.log('Total: ' + total)
   * );
   *
   * // Expected:
   * // 'observable -> 0'
   * // 'observable -> 1'
   * // 'observable -> 2'
   * // 'observable -> 3'
   * // 'Total: 6'
   * ```
   *
   * @param next a handler for each value emitted by the observable
   * @return a promise that either resolves on observable completion or
   *  rejects with the handled error
   */
  forEach(next: (value: T) => void): Promise<void>;

  /**
   * @param next a handler for each value emitted by the observable
   * @param promiseCtor a constructor function used to instantiate the Promise
   * @return a promise that either resolves on observable completion or
   *  rejects with the handled error
   * @deprecated Passing a Promise constructor will no longer be available
   * in upcoming versions of RxJS. This is because it adds weight to the library, for very
   * little benefit. If you need this functionality, it is recommended that you either
   * polyfill Promise, or you create an adapter to convert the returned native promise
   * to whatever promise implementation you wanted. Will be removed in v8.
   */
  forEach(next: (value: T) => void, promiseCtor: PromiseConstructorLike): Promise<void>;

  forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise<void> {
    promiseCtor = getPromiseCtor(promiseCtor);

    return new promiseCtor<void>((resolve, reject) => {
      const subscriber = new SafeSubscriber<T>({
        next: (value) => {
          try {
            next(value);
          } catch (err) {
            reject(err);
            subscriber.unsubscribe();
          }
        },
        error: reject,
        complete: resolve,
      });
      this.subscribe(subscriber);
    }) as Promise<void>;
  }

  /** @internal */
  protected _subscribe(subscriber: Subscriber<any>): TeardownLogic {
    return this.source?.subscribe(subscriber);
  }

  /**
   * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable
   * @method Symbol.observable
   * @return {Observable} this instance of the observable
   */
  [Symbol_observable]() {
    return this;
  }

  /* tslint:disable:max-line-length */
  pipe(): Observable<T>;
  pipe<A>(op1: OperatorFunction<T, A>): Observable<A>;
  pipe<A, B>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>): Observable<B>;
  pipe<A, B, C>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>): Observable<C>;
  pipe<A, B, C, D>(
    op1: OperatorFunction<T, A>,
    op2: OperatorFunction<A, B>,
    op3: OperatorFunction<B, C>,
    op4: OperatorFunction<C, D>
  ): Observable<D>;
  pipe<A, B, C, D, E>(
    op1: OperatorFunction<T, A>,
    op2: OperatorFunction<A, B>,
    op3: OperatorFunction<B, C>,
    op4: OperatorFunction<C, D>,
    op5: OperatorFunction<D, E>
  ): Observable<E>;
  pipe<A, B, C, D, E, F>(
    op1: OperatorFunction<T, A>,
    op2: OperatorFunction<A, B>,
    op3: OperatorFunction<B, C>,
    op4: OperatorFunction<C, D>,
    op5: OperatorFunction<D, E>,
    op6: OperatorFunction<E, F>
  ): Observable<F>;
  pipe<A, B, C, D, E, F, G>(
    op1: OperatorFunction<T, A>,
    op2: OperatorFunction<A, B>,
    op3: OperatorFunction<B, C>,
    op4: OperatorFunction<C, D>,
    op5: OperatorFunction<D, E>,
    op6: OperatorFunction<E, F>,
    op7: OperatorFunction<F, G>
  ): Observable<G>;
  pipe<A, B, C, D, E, F, G, H>(
    op1: OperatorFunction<T, A>,
    op2: OperatorFunction<A, B>,
    op3: OperatorFunction<B, C>,
    op4: OperatorFunction<C, D>,
    op5: OperatorFunction<D, E>,
    op6: OperatorFunction<E, F>,
    op7: OperatorFunction<F, G>,
    op8: OperatorFunction<G, H>
  ): Observable<H>;
  pipe<A, B, C, D, E, F, G, H, I>(
    op1: OperatorFunction<T, A>,
    op2: OperatorFunction<A, B>,
    op3: OperatorFunction<B, C>,
    op4: OperatorFunction<C, D>,
    op5: OperatorFunction<D, E>,
    op6: OperatorFunction<E, F>,
    op7: OperatorFunction<F, G>,
    op8: OperatorFunction<G, H>,
    op9: OperatorFunction<H, I>
  ): Observable<I>;
  pipe<A, B, C, D, E, F, G, H, I>(
    op1: OperatorFunction<T, A>,
    op2: OperatorFunction<A, B>,
    op3: OperatorFunction<B, C>,
    op4: OperatorFunction<C, D>,
    op5: OperatorFunction<D, E>,
    op6: OperatorFunction<E, F>,
    op7: OperatorFunction<F, G>,
    op8: OperatorFunction<G, H>,
    op9: OperatorFunction<H, I>,
    ...operations: OperatorFunction<any, any>[]
  ): Observable<unknown>;
  /* tslint:enable:max-line-length */

  /**
   * Used to stitch together functional operators into a chain.
   * @method pipe
   * @return {Observable} the Observable result of all of the operators having
   * been called in the order they were passed in.
   *
   * ## Example
   *
   * ```ts
   * import { interval, filter, map, scan } from 'rxjs';
   *
   * interval(1000)
   *   .pipe(
   *     filter(x => x % 2 === 0),
   *     map(x => x + x),
   *     scan((acc, x) => acc + x)
   *   )
   *   .subscribe(x => console.log(x));
   * ```
   */
  pipe(...operations: OperatorFunction<any, any>[]): Observable<any> {
    return pipeFromArray(operations)(this);
  }

  /* tslint:disable:max-line-length */
  /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */
  toPromise(): Promise<T | undefined>;
  /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */
  toPromise(PromiseCtor: typeof Promise): Promise<T | undefined>;
  /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */
  toPromise(PromiseCtor: PromiseConstructorLike): Promise<T | undefined>;
  /* tslint:enable:max-line-length */

  /**
   * Subscribe to this Observable and get a Promise resolving on
   * `complete` with the last emission (if any).
   *
   * **WARNING**: Only use this with observables you *know* will complete. If the source
   * observable does not complete, you will end up with a promise that is hung up, and
   * potentially all of the state of an async function hanging out in memory. To avoid
   * this situation, look into adding something like {@link timeout}, {@link take},
   * {@link takeWhile}, or {@link takeUntil} amongst others.
   *
   * @method toPromise
   * @param [promiseCtor] a constructor function used to instantiate
   * the Promise
   * @return A Promise that resolves with the last value emit, or
   * rejects on an error. If there were no emissions, Promise
   * resolves with undefined.
   * @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise
   */
  toPromise(promiseCtor?: PromiseConstructorLike): Promise<T | undefined> {
    promiseCtor = getPromiseCtor(promiseCtor);

    return new promiseCtor((resolve, reject) => {
      let value: T | undefined;
      this.subscribe(
        (x: T) => (value = x),
        (err: any) => reject(err),
        () => resolve(value)
      );
    }) as Promise<T | undefined>;
  }
}

/**
 * Decides between a passed promise constructor from consuming code,
 * A default configured promise constructor, and the native promise
 * constructor and returns it. If nothing can be found, it will throw
 * an error.
 * @param promiseCtor The optional promise constructor to passed by consuming code
 */
function getPromiseCtor(promiseCtor: PromiseConstructorLike | undefined) {
  return promiseCtor ?? config.Promise ?? Promise;
}

function isObserver<T>(value: any): value is Observer<T> {
  return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);
}

function isSubscriber<T>(value: any): value is Subscriber<T> {
  return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));
}
import { Subscriber } from './Subscriber';
import { TeardownLogic } from './types';

/***
 * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.
 */
export interface Operator<T, R> {
  call(subscriber: Subscriber<R>, source: any): TeardownLogic;
}
import { Subject } from './Subject';
import { TimestampProvider } from './types';
import { Subscriber } from './Subscriber';
import { Subscription } from './Subscription';
import { dateTimestampProvider } from './scheduler/dateTimestampProvider';

/**
 * A variant of {@link Subject} that "replays" old values to new subscribers by emitting them when they first subscribe.
 *
 * `ReplaySubject` has an internal buffer that will store a specified number of values that it has observed. Like `Subject`,
 * `ReplaySubject` "observes" values by having them passed to its `next` method. When it observes a value, it will store that
 * value for a time determined by the configuration of the `ReplaySubject`, as passed to its constructor.
 *
 * When a new subscriber subscribes to the `ReplaySubject` instance, it will synchronously emit all values in its buffer in
 * a First-In-First-Out (FIFO) manner. The `ReplaySubject` will also complete, if it has observed completion; and it will
 * error if it has observed an error.
 *
 * There are two main configuration items to be concerned with:
 *
 * 1. `bufferSize` - This will determine how many items are stored in the buffer, defaults to infinite.
 * 2. `windowTime` - The amount of time to hold a value in the buffer before removing it from the buffer.
 *
 * Both configurations may exist simultaneously. So if you would like to buffer a maximum of 3 values, as long as the values
 * are less than 2 seconds old, you could do so with a `new ReplaySubject(3, 2000)`.
 *
 * ### Differences with BehaviorSubject
 *
 * `BehaviorSubject` is similar to `new ReplaySubject(1)`, with a couple fo exceptions:
 *
 * 1. `BehaviorSubject` comes "primed" with a single value upon construction.
 * 2. `ReplaySubject` will replay values, even after observing an error, where `BehaviorSubject` will not.
 *
 * @see {@link Subject}
 * @see {@link BehaviorSubject}
 * @see {@link shareReplay}
 */
export class ReplaySubject<T> extends Subject<T> {
  private _buffer: (T | number)[] = [];
  private _infiniteTimeWindow = true;

  /**
   * @param bufferSize The size of the buffer to replay on subscription
   * @param windowTime The amount of time the buffered items will say buffered
   * @param timestampProvider An object with a `now()` method that provides the current timestamp. This is used to
   * calculate the amount of time something has been buffered.
   */
  constructor(
    private _bufferSize = Infinity,
    private _windowTime = Infinity,
    private _timestampProvider: TimestampProvider = dateTimestampProvider
  ) {
    super();
    this._infiniteTimeWindow = _windowTime === Infinity;
    this._bufferSize = Math.max(1, _bufferSize);
    this._windowTime = Math.max(1, _windowTime);
  }

  next(value: T): void {
    const { isStopped, _buffer, _infiniteTimeWindow, _timestampProvider, _windowTime } = this;
    if (!isStopped) {
      _buffer.push(value);
      !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);
    }
    this._trimBuffer();
    super.next(value);
  }

  /** @internal */
  protected _subscribe(subscriber: Subscriber<T>): Subscription {
    this._throwIfClosed();
    this._trimBuffer();

    const subscription = this._innerSubscribe(subscriber);

    const { _infiniteTimeWindow, _buffer } = this;
    // We use a copy here, so reentrant code does not mutate our array while we're
    // emitting it to a new subscriber.
    const copy = _buffer.slice();
    for (let i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {
      subscriber.next(copy[i] as T);
    }

    this._checkFinalizedStatuses(subscriber);

    return subscription;
  }

  private _trimBuffer() {
    const { _bufferSize, _timestampProvider, _buffer, _infiniteTimeWindow } = this;
    // If we don't have an infinite buffer size, and we're over the length,
    // use splice to truncate the old buffer values off. Note that we have to
    // double the size for instances where we're not using an infinite time window
    // because we're storing the values and the timestamps in the same array.
    const adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;
    _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);

    // Now, if we're not in an infinite time window, remove all values where the time is
    // older than what is allowed.
    if (!_infiniteTimeWindow) {
      const now = _timestampProvider.now();
      let last = 0;
      // Search the array for the first timestamp that isn't expired and
      // truncate the buffer up to that point.
      for (let i = 1; i < _buffer.length && (_buffer[i] as number) <= now; i += 2) {
        last = i;
      }
      last && _buffer.splice(0, last + 1);
    }
  }
}
import { Action } from './scheduler/Action';
import { Subscription } from './Subscription';
import { SchedulerLike, SchedulerAction } from './types';
import { dateTimestampProvider } from './scheduler/dateTimestampProvider';

/**
 * An execution context and a data structure to order tasks and schedule their
 * execution. Provides a notion of (potentially virtual) time, through the
 * `now()` getter method.
 *
 * Each unit of work in a Scheduler is called an `Action`.
 *
 * ```ts
 * class Scheduler {
 *   now(): number;
 *   schedule(work, delay?, state?): Subscription;
 * }
 * ```
 *
 * @class Scheduler
 * @deprecated Scheduler is an internal implementation detail of RxJS, and
 * should not be used directly. Rather, create your own class and implement
 * {@link SchedulerLike}. Will be made internal in v8.
 */
export class Scheduler implements SchedulerLike {
  public static now: () => number = dateTimestampProvider.now;

  constructor(private schedulerActionCtor: typeof Action, now: () => number = Scheduler.now) {
    this.now = now;
  }

  /**
   * A getter method that returns a number representing the current time
   * (at the time this function was called) according to the scheduler's own
   * internal clock.
   * @return {number} A number that represents the current time. May or may not
   * have a relation to wall-clock time. May or may not refer to a time unit
   * (e.g. milliseconds).
   */
  public now: () => number;

  /**
   * Schedules a function, `work`, for execution. May happen at some point in
   * the future, according to the `delay` parameter, if specified. May be passed
   * some context object, `state`, which will be passed to the `work` function.
   *
   * The given arguments will be processed an stored as an Action object in a
   * queue of actions.
   *
   * @param {function(state: ?T): ?Subscription} work A function representing a
   * task, or some unit of work to be executed by the Scheduler.
   * @param {number} [delay] Time to wait before executing the work, where the
   * time unit is implicit and defined by the Scheduler itself.
   * @param {T} [state] Some contextual data that the `work` function uses when
   * called by the Scheduler.
   * @return {Subscription} A subscription in order to be able to unsubscribe
   * the scheduled work.
   */
  public schedule<T>(work: (this: SchedulerAction<T>, state?: T) => void, delay: number = 0, state?: T): Subscription {
    return new this.schedulerActionCtor<T>(this, work).schedule(state, delay);
  }
}
import { Operator } from './Operator';
import { Observable } from './Observable';
import { Subscriber } from './Subscriber';
import { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';
import { Observer, SubscriptionLike, TeardownLogic } from './types';
import { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';
import { arrRemove } from './util/arrRemove';
import { errorContext } from './util/errorContext';

/**
 * A Subject is a special type of Observable that allows values to be
 * multicasted to many Observers. Subjects are like EventEmitters.
 *
 * Every Subject is an Observable and an Observer. You can subscribe to a
 * Subject, and you can call next to feed values as well as error and complete.
 */
export class Subject<T> extends Observable<T> implements SubscriptionLike {
  closed = false;

  private currentObservers: Observer<T>[] | null = null;

  /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */
  observers: Observer<T>[] = [];
  /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */
  isStopped = false;
  /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */
  hasError = false;
  /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */
  thrownError: any = null;

  /**
   * Creates a "subject" by basically gluing an observer to an observable.
   *
   * @nocollapse
   * @deprecated Recommended you do not use. Will be removed at some point in the future. Plans for replacement still under discussion.
   */
  static create: (...args: any[]) => any = <T>(destination: Observer<T>, source: Observable<T>): AnonymousSubject<T> => {
    return new AnonymousSubject<T>(destination, source);
  };

  constructor() {
    // NOTE: This must be here to obscure Observable's constructor.
    super();
  }

  /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */
  lift<R>(operator: Operator<T, R>): Observable<R> {
    const subject = new AnonymousSubject(this, this);
    subject.operator = operator as any;
    return subject as any;
  }

  /** @internal */
  protected _throwIfClosed() {
    if (this.closed) {
      throw new ObjectUnsubscribedError();
    }
  }

  next(value: T) {
    errorContext(() => {
      this._throwIfClosed();
      if (!this.isStopped) {
        if (!this.currentObservers) {
          this.currentObservers = Array.from(this.observers);
        }
        for (const observer of this.currentObservers) {
          observer.next(value);
        }
      }
    });
  }

  error(err: any) {
    errorContext(() => {
      this._throwIfClosed();
      if (!this.isStopped) {
        this.hasError = this.isStopped = true;
        this.thrownError = err;
        const { observers } = this;
        while (observers.length) {
          observers.shift()!.error(err);
        }
      }
    });
  }

  complete() {
    errorContext(() => {
      this._throwIfClosed();
      if (!this.isStopped) {
        this.isStopped = true;
        const { observers } = this;
        while (observers.length) {
          observers.shift()!.complete();
        }
      }
    });
  }

  unsubscribe() {
    this.isStopped = this.closed = true;
    this.observers = this.currentObservers = null!;
  }

  get observed() {
    return this.observers?.length > 0;
  }

  /** @internal */
  protected _trySubscribe(subscriber: Subscriber<T>): TeardownLogic {
    this._throwIfClosed();
    return super._trySubscribe(subscriber);
  }

  /** @internal */
  protected _subscribe(subscriber: Subscriber<T>): Subscription {
    this._throwIfClosed();
    this._checkFinalizedStatuses(subscriber);
    return this._innerSubscribe(subscriber);
  }

  /** @internal */
  protected _innerSubscribe(subscriber: Subscriber<any>) {
    const { hasError, isStopped, observers } = this;
    if (hasError || isStopped) {
      return EMPTY_SUBSCRIPTION;
    }
    this.currentObservers = null;
    observers.push(subscriber);
    return new Subscription(() => {
      this.currentObservers = null;
      arrRemove(observers, subscriber);
    });
  }

  /** @internal */
  protected _checkFinalizedStatuses(subscriber: Subscriber<any>) {
    const { hasError, thrownError, isStopped } = this;
    if (hasError) {
      subscriber.error(thrownError);
    } else if (isStopped) {
      subscriber.complete();
    }
  }

  /**
   * Creates a new Observable with this Subject as the source. You can do this
   * to create customize Observer-side logic of the Subject and conceal it from
   * code that uses the Observable.
   * @return {Observable} Observable that the Subject casts to
   */
  asObservable(): Observable<T> {
    const observable: any = new Observable<T>();
    observable.source = this;
    return observable;
  }
}

/**
 * @class AnonymousSubject<T>
 */
export class AnonymousSubject<T> extends Subject<T> {
  constructor(
    /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */
    public destination?: Observer<T>,
    source?: Observable<T>
  ) {
    super();
    this.source = source;
  }

  next(value: T) {
    this.destination?.next?.(value);
  }

  error(err: any) {
    this.destination?.error?.(err);
  }

  complete() {
    this.destination?.complete?.();
  }

  /** @internal */
  protected _subscribe(subscriber: Subscriber<T>): Subscription {
    return this.source?.subscribe(subscriber) ?? EMPTY_SUBSCRIPTION;
  }
}
import { isFunction } from './util/isFunction';
import { Observer, ObservableNotification } from './types';
import { isSubscription, Subscription } from './Subscription';
import { config } from './config';
import { reportUnhandledError } from './util/reportUnhandledError';
import { noop } from './util/noop';
import { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';
import { timeoutProvider } from './scheduler/timeoutProvider';
import { captureError } from './util/errorContext';

/**
 * Implements the {@link Observer} interface and extends the
 * {@link Subscription} class. While the {@link Observer} is the public API for
 * consuming the values of an {@link Observable}, all Observers get converted to
 * a Subscriber, in order to provide Subscription-like capabilities such as
 * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for
 * implementing operators, but it is rarely used as a public API.
 *
 * @class Subscriber<T>
 */
export class Subscriber<T> extends Subscription implements Observer<T> {
  /**
   * A static factory for a Subscriber, given a (potentially partial) definition
   * of an Observer.
   * @param next The `next` callback of an Observer.
   * @param error The `error` callback of an
   * Observer.
   * @param complete The `complete` callback of an
   * Observer.
   * @return A Subscriber wrapping the (partially defined)
   * Observer represented by the given arguments.
   * @nocollapse
   * @deprecated Do not use. Will be removed in v8. There is no replacement for this
   * method, and there is no reason to be creating instances of `Subscriber` directly.
   * If you have a specific use case, please file an issue.
   */
  static create<T>(next?: (x?: T) => void, error?: (e?: any) => void, complete?: () => void): Subscriber<T> {
    return new SafeSubscriber(next, error, complete);
  }

  /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */
  protected isStopped: boolean = false;
  /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */
  protected destination: Subscriber<any> | Observer<any>; // this `any` is the escape hatch to erase extra type param (e.g. R)

  /**
   * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.
   * There is no reason to directly create an instance of Subscriber. This type is exported for typings reasons.
   */
  constructor(destination?: Subscriber<any> | Observer<any>) {
    super();
    if (destination) {
      this.destination = destination;
      // Automatically chain subscriptions together here.
      // if destination is a Subscription, then it is a Subscriber.
      if (isSubscription(destination)) {
        destination.add(this);
      }
    } else {
      this.destination = EMPTY_OBSERVER;
    }
  }

  /**
   * The {@link Observer} callback to receive notifications of type `next` from
   * the Observable, with a value. The Observable may call this method 0 or more
   * times.
   * @param {T} [value] The `next` value.
   * @return {void}
   */
  next(value?: T): void {
    if (this.isStopped) {
      handleStoppedNotification(nextNotification(value), this);
    } else {
      this._next(value!);
    }
  }

  /**
   * The {@link Observer} callback to receive notifications of type `error` from
   * the Observable, with an attached `Error`. Notifies the Observer that
   * the Observable has experienced an error condition.
   * @param {any} [err] The `error` exception.
   * @return {void}
   */
  error(err?: any): void {
    if (this.isStopped) {
      handleStoppedNotification(errorNotification(err), this);
    } else {
      this.isStopped = true;
      this._error(err);
    }
  }

  /**
   * The {@link Observer} callback to receive a valueless notification of type
   * `complete` from the Observable. Notifies the Observer that the Observable
   * has finished sending push-based notifications.
   * @return {void}
   */
  complete(): void {
    if (this.isStopped) {
      handleStoppedNotification(COMPLETE_NOTIFICATION, this);
    } else {
      this.isStopped = true;
      this._complete();
    }
  }

  unsubscribe(): void {
    if (!this.closed) {
      this.isStopped = true;
      super.unsubscribe();
      this.destination = null!;
    }
  }

  protected _next(value: T): void {
    this.destination.next(value);
  }

  protected _error(err: any): void {
    try {
      this.destination.error(err);
    } finally {
      this.unsubscribe();
    }
  }

  protected _complete(): void {
    try {
      this.destination.complete();
    } finally {
      this.unsubscribe();
    }
  }
}

/**
 * This bind is captured here because we want to be able to have
 * compatibility with monoid libraries that tend to use a method named
 * `bind`. In particular, a library called Monio requires this.
 */
const _bind = Function.prototype.bind;

function bind<Fn extends (...args: any[]) => any>(fn: Fn, thisArg: any): Fn {
  return _bind.call(fn, thisArg);
}

/**
 * Internal optimization only, DO NOT EXPOSE.
 * @internal
 */
class ConsumerObserver<T> implements Observer<T> {
  constructor(private partialObserver: Partial<Observer<T>>) {}

  next(value: T): void {
    const { partialObserver } = this;
    if (partialObserver.next) {
      try {
        partialObserver.next(value);
      } catch (error) {
        handleUnhandledError(error);
      }
    }
  }

  error(err: any): void {
    const { partialObserver } = this;
    if (partialObserver.error) {
      try {
        partialObserver.error(err);
      } catch (error) {
        handleUnhandledError(error);
      }
    } else {
      handleUnhandledError(err);
    }
  }

  complete(): void {
    const { partialObserver } = this;
    if (partialObserver.complete) {
      try {
        partialObserver.complete();
      } catch (error) {
        handleUnhandledError(error);
      }
    }
  }
}

export class SafeSubscriber<T> extends Subscriber<T> {
  constructor(
    observerOrNext?: Partial<Observer<T>> | ((value: T) => void) | null,
    error?: ((e?: any) => void) | null,
    complete?: (() => void) | null
  ) {
    super();

    let partialObserver: Partial<Observer<T>>;
    if (isFunction(observerOrNext) || !observerOrNext) {
      // The first argument is a function, not an observer. The next
      // two arguments *could* be observers, or they could be empty.
      partialObserver = {
        next: (observerOrNext ?? undefined) as (((value: T) => void) | undefined),
        error: error ?? undefined,
        complete: complete ?? undefined,
      };
    } else {
      // The first argument is a partial observer.
      let context: any;
      if (this && config.useDeprecatedNextContext) {
        // This is a deprecated path that made `this.unsubscribe()` available in
        // next handler functions passed to subscribe. This only exists behind a flag
        // now, as it is *very* slow.
        context = Object.create(observerOrNext);
        context.unsubscribe = () => this.unsubscribe();
        partialObserver = {
          next: observerOrNext.next && bind(observerOrNext.next, context),
          error: observerOrNext.error && bind(observerOrNext.error, context),
          complete: observerOrNext.complete && bind(observerOrNext.complete, context),
        };
      } else {
        // The "normal" path. Just use the partial observer directly.
        partialObserver = observerOrNext;
      }
    }

    // Wrap the partial observer to ensure it's a full observer, and
    // make sure proper error handling is accounted for.
    this.destination = new ConsumerObserver(partialObserver);
  }
}

function handleUnhandledError(error: any) {
  if (config.useDeprecatedSynchronousErrorHandling) {
    captureError(error);
  } else {
    // Ideal path, we report this as an unhandled error,
    // which is thrown on a new call stack.
    reportUnhandledError(error);
  }
}

/**
 * An error handler used when no error handler was supplied
 * to the SafeSubscriber -- meaning no error handler was supplied
 * do the `subscribe` call on our observable.
 * @param err The error to handle
 */
function defaultErrorHandler(err: any) {
  throw err;
}

/**
 * A handler for notifications that cannot be sent to a stopped subscriber.
 * @param notification The notification being sent
 * @param subscriber The stopped subscriber
 */
function handleStoppedNotification(notification: ObservableNotification<any>, subscriber: Subscriber<any>) {
  const { onStoppedNotification } = config;
  onStoppedNotification && timeoutProvider.setTimeout(() => onStoppedNotification(notification, subscriber));
}

/**
 * The observer used as a stub for subscriptions where the user did not
 * pass any arguments to `subscribe`. Comes with the default error handling
 * behavior.
 */
export const EMPTY_OBSERVER: Readonly<Observer<any>> & { closed: true } = {
  closed: true,
  next: noop,
  error: defaultErrorHandler,
  complete: noop,
};
import { isFunction } from './util/isFunction';
import { UnsubscriptionError } from './util/UnsubscriptionError';
import { SubscriptionLike, TeardownLogic, Unsubscribable } from './types';
import { arrRemove } from './util/arrRemove';

/**
 * Represents a disposable resource, such as the execution of an Observable. A
 * Subscription has one important method, `unsubscribe`, that takes no argument
 * and just disposes the resource held by the subscription.
 *
 * Additionally, subscriptions may be grouped together through the `add()`
 * method, which will attach a child Subscription to the current Subscription.
 * When a Subscription is unsubscribed, all its children (and its grandchildren)
 * will be unsubscribed as well.
 *
 * @class Subscription
 */
export class Subscription implements SubscriptionLike {
  /** @nocollapse */
  public static EMPTY = (() => {
    const empty = new Subscription();
    empty.closed = true;
    return empty;
  })();

  /**
   * A flag to indicate whether this Subscription has already been unsubscribed.
   */
  public closed = false;

  private _parentage: Subscription[] | Subscription | null = null;

  /**
   * The list of registered finalizers to execute upon unsubscription. Adding and removing from this
   * list occurs in the {@link #add} and {@link #remove} methods.
   */
  private _finalizers: Exclude<TeardownLogic, void>[] | null = null;

  /**
   * @param initialTeardown A function executed first as part of the finalization
   * process that is kicked off when {@link #unsubscribe} is called.
   */
  constructor(private initialTeardown?: () => void) {}

  /**
   * Disposes the resources held by the subscription. May, for instance, cancel
   * an ongoing Observable execution or cancel any other type of work that
   * started when the Subscription was created.
   * @return {void}
   */
  unsubscribe(): void {
    let errors: any[] | undefined;

    if (!this.closed) {
      this.closed = true;

      // Remove this from it's parents.
      const { _parentage } = this;
      if (_parentage) {
        this._parentage = null;
        if (Array.isArray(_parentage)) {
          for (const parent of _parentage) {
            parent.remove(this);
          }
        } else {
          _parentage.remove(this);
        }
      }

      const { initialTeardown: initialFinalizer } = this;
      if (isFunction(initialFinalizer)) {
        try {
          initialFinalizer();
        } catch (e) {
          errors = e instanceof UnsubscriptionError ? e.errors : [e];
        }
      }

      const { _finalizers } = this;
      if (_finalizers) {
        this._finalizers = null;
        for (const finalizer of _finalizers) {
          try {
            execFinalizer(finalizer);
          } catch (err) {
            errors = errors ?? [];
            if (err instanceof UnsubscriptionError) {
              errors = [...errors, ...err.errors];
            } else {
              errors.push(err);
            }
          }
        }
      }

      if (errors) {
        throw new UnsubscriptionError(errors);
      }
    }
  }

  /**
   * Adds a finalizer to this subscription, so that finalization will be unsubscribed/called
   * when this subscription is unsubscribed. If this subscription is already {@link #closed},
   * because it has already been unsubscribed, then whatever finalizer is passed to it
   * will automatically be executed (unless the finalizer itself is also a closed subscription).
   *
   * Closed Subscriptions cannot be added as finalizers to any subscription. Adding a closed
   * subscription to a any subscription will result in no operation. (A noop).
   *
   * Adding a subscription to itself, or adding `null` or `undefined` will not perform any
   * operation at all. (A noop).
   *
   * `Subscription` instances that are added to this instance will automatically remove themselves
   * if they are unsubscribed. Functions and {@link Unsubscribable} objects that you wish to remove
   * will need to be removed manually with {@link #remove}
   *
   * @param teardown The finalization logic to add to this subscription.
   */
  add(teardown: TeardownLogic): void {
    // Only add the finalizer if it's not undefined
    // and don't add a subscription to itself.
    if (teardown && teardown !== this) {
      if (this.closed) {
        // If this subscription is already closed,
        // execute whatever finalizer is handed to it automatically.
        execFinalizer(teardown);
      } else {
        if (teardown instanceof Subscription) {
          // We don't add closed subscriptions, and we don't add the same subscription
          // twice. Subscription unsubscribe is idempotent.
          if (teardown.closed || teardown._hasParent(this)) {
            return;
          }
          teardown._addParent(this);
        }
        (this._finalizers = this._finalizers ?? []).push(teardown);
      }
    }
  }

  /**
   * Checks to see if a this subscription already has a particular parent.
   * This will signal that this subscription has already been added to the parent in question.
   * @param parent the parent to check for
   */
  private _hasParent(parent: Subscription) {
    const { _parentage } = this;
    return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));
  }

  /**
   * Adds a parent to this subscription so it can be removed from the parent if it
   * unsubscribes on it's own.
   *
   * NOTE: THIS ASSUMES THAT {@link _hasParent} HAS ALREADY BEEN CHECKED.
   * @param parent The parent subscription to add
   */
  private _addParent(parent: Subscription) {
    const { _parentage } = this;
    this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;
  }

  /**
   * Called on a child when it is removed via {@link #remove}.
   * @param parent The parent to remove
   */
  private _removeParent(parent: Subscription) {
    const { _parentage } = this;
    if (_parentage === parent) {
      this._parentage = null;
    } else if (Array.isArray(_parentage)) {
      arrRemove(_parentage, parent);
    }
  }

  /**
   * Removes a finalizer from this subscription that was previously added with the {@link #add} method.
   *
   * Note that `Subscription` instances, when unsubscribed, will automatically remove themselves
   * from every other `Subscription` they have been added to. This means that using the `remove` method
   * is not a common thing and should be used thoughtfully.
   *
   * If you add the same finalizer instance of a function or an unsubscribable object to a `Subcription` instance
   * more than once, you will need to call `remove` the same number of times to remove all instances.
   *
   * All finalizer instances are removed to free up memory upon unsubscription.
   *
   * @param teardown The finalizer to remove from this subscription
   */
  remove(teardown: Exclude<TeardownLogic, void>): void {
    const { _finalizers } = this;
    _finalizers && arrRemove(_finalizers, teardown);

    if (teardown instanceof Subscription) {
      teardown._removeParent(this);
    }
  }
}

export const EMPTY_SUBSCRIPTION = Subscription.EMPTY;

export function isSubscription(value: any): value is Subscription {
  return (
    value instanceof Subscription ||
    (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe))
  );
}

function execFinalizer(finalizer: Unsubscribable | (() => void)) {
  if (isFunction(finalizer)) {
    finalizer();
  } else {
    finalizer.unsubscribe();
  }
}
import { Subscriber } from './Subscriber';
import { ObservableNotification } from './types';

/**
 * The {@link GlobalConfig} object for RxJS. It is used to configure things
 * like how to react on unhandled errors.
 */
export const config: GlobalConfig = {
  onUnhandledError: null,
  onStoppedNotification: null,
  Promise: undefined,
  useDeprecatedSynchronousErrorHandling: false,
  useDeprecatedNextContext: false,
};

/**
 * The global configuration object for RxJS, used to configure things
 * like how to react on unhandled errors. Accessible via {@link config}
 * object.
 */
export interface GlobalConfig {
  /**
   * A registration point for unhandled errors from RxJS. These are errors that
   * cannot were not handled by consuming code in the usual subscription path. For
   * example, if you have this configured, and you subscribe to an observable without
   * providing an error handler, errors from that subscription will end up here. This
   * will _always_ be called asynchronously on another job in the runtime. This is because
   * we do not want errors thrown in this user-configured handler to interfere with the
   * behavior of the library.
   */
  onUnhandledError: ((err: any) => void) | null;

  /**
   * A registration point for notifications that cannot be sent to subscribers because they
   * have completed, errored or have been explicitly unsubscribed. By default, next, complete
   * and error notifications sent to stopped subscribers are noops. However, sometimes callers
   * might want a different behavior. For example, with sources that attempt to report errors
   * to stopped subscribers, a caller can configure RxJS to throw an unhandled error instead.
   * This will _always_ be called asynchronously on another job in the runtime. This is because
   * we do not want errors thrown in this user-configured handler to interfere with the
   * behavior of the library.
   */
  onStoppedNotification: ((notification: ObservableNotification<any>, subscriber: Subscriber<any>) => void) | null;

  /**
   * The promise constructor used by default for {@link Observable#toPromise toPromise} and {@link Observable#forEach forEach}
   * methods.
   *
   * @deprecated As of version 8, RxJS will no longer support this sort of injection of a
   * Promise constructor. If you need a Promise implementation other than native promises,
   * please polyfill/patch Promise as you see appropriate. Will be removed in v8.
   */
  Promise?: PromiseConstructorLike;

  /**
   * If true, turns on synchronous error rethrowing, which is a deprecated behavior
   * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe
   * call in a try/catch block. It also enables producer interference, a nasty bug
   * where a multicast can be broken for all observers by a downstream consumer with
   * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BUY TIME
   * FOR MIGRATION REASONS.
   *
   * @deprecated As of version 8, RxJS will no longer support synchronous throwing
   * of unhandled errors. All errors will be thrown on a separate call stack to prevent bad
   * behaviors described above. Will be removed in v8.
   */
  useDeprecatedSynchronousErrorHandling: boolean;

  /**
   * If true, enables an as-of-yet undocumented feature from v5: The ability to access
   * `unsubscribe()` via `this` context in `next` functions created in observers passed
   * to `subscribe`.
   *
   * This is being removed because the performance was severely problematic, and it could also cause
   * issues when types other than POJOs are passed to subscribe as subscribers, as they will likely have
   * their `this` context overwritten.
   *
   * @deprecated As of version 8, RxJS will no longer support altering the
   * context of next functions provided as part of an observer to Subscribe. Instead,
   * you will have access to a subscription or a signal or token that will allow you to do things like
   * unsubscribe and test closed status. Will be removed in v8.
   */
  useDeprecatedNextContext: boolean;
}
import { Observable } from './Observable';
import { EmptyError } from './util/EmptyError';
import { SafeSubscriber } from './Subscriber';

export interface FirstValueFromConfig<T> {
  defaultValue: T;
}

export function firstValueFrom<T, D>(source: Observable<T>, config: FirstValueFromConfig<D>): Promise<T | D>;
export function firstValueFrom<T>(source: Observable<T>): Promise<T>;

/**
 * Converts an observable to a promise by subscribing to the observable,
 * and returning a promise that will resolve as soon as the first value
 * arrives from the observable. The subscription will then be closed.
 *
 * If the observable stream completes before any values were emitted, the
 * returned promise will reject with {@link EmptyError} or will resolve
 * with the default value if a default was specified.
 *
 * If the observable stream emits an error, the returned promise will reject
 * with that error.
 *
 * **WARNING**: Only use this with observables you *know* will emit at least one value,
 * *OR* complete. If the source observable does not emit one value or complete, you will
 * end up with a promise that is hung up, and potentially all of the state of an
 * async function hanging out in memory. To avoid this situation, look into adding
 * something like {@link timeout}, {@link take}, {@link takeWhile}, or {@link takeUntil}
 * amongst others.
 *
 * ## Example
 *
 * Wait for the first value from a stream and emit it from a promise in
 * an async function
 *
 * ```ts
 * import { interval, firstValueFrom } from 'rxjs';
 *
 * async function execute() {
 *   const source$ = interval(2000);
 *   const firstNumber = await firstValueFrom(source$);
 *   console.log(`The first number is ${ firstNumber }`);
 * }
 *
 * execute();
 *
 * // Expected output:
 * // 'The first number is 0'
 * ```
 *
 * @see {@link lastValueFrom}
 *
 * @param source the observable to convert to a promise
 * @param config a configuration object to define the `defaultValue` to use if the source completes without emitting a value
 */
export function firstValueFrom<T, D>(source: Observable<T>, config?: FirstValueFromConfig<D>): Promise<T | D> {
  const hasConfig = typeof config === 'object';
  return new Promise<T | D>((resolve, reject) => {
    const subscriber = new SafeSubscriber<T>({
      next: (value) => {
        resolve(value);
        subscriber.unsubscribe();
      },
      error: reject,
      complete: () => {
        if (hasConfig) {
          resolve(config!.defaultValue);
        } else {
          reject(new EmptyError());
        }
      },
    });
    source.subscribe(subscriber);
  });
}
import { Observable } from './Observable';
import { EmptyError } from './util/EmptyError';

export interface LastValueFromConfig<T> {
  defaultValue: T;
}

export function lastValueFrom<T, D>(source: Observable<T>, config: LastValueFromConfig<D>): Promise<T | D>;
export function lastValueFrom<T>(source: Observable<T>): Promise<T>;

/**
 * Converts an observable to a promise by subscribing to the observable,
 * waiting for it to complete, and resolving the returned promise with the
 * last value from the observed stream.
 *
 * If the observable stream completes before any values were emitted, the
 * returned promise will reject with {@link EmptyError} or will resolve
 * with the default value if a default was specified.
 *
 * If the observable stream emits an error, the returned promise will reject
 * with that error.
 *
 * **WARNING**: Only use this with observables you *know* will complete. If the source
 * observable does not complete, you will end up with a promise that is hung up, and
 * potentially all of the state of an async function hanging out in memory. To avoid
 * this situation, look into adding something like {@link timeout}, {@link take},
 * {@link takeWhile}, or {@link takeUntil} amongst others.
 *
 * ## Example
 *
 * Wait for the last value from a stream and emit it from a promise in
 * an async function
 *
 * ```ts
 * import { interval, take, lastValueFrom } from 'rxjs';
 *
 * async function execute() {
 *   const source$ = interval(2000).pipe(take(10));
 *   const finalNumber = await lastValueFrom(source$);
 *   console.log(`The final number is ${ finalNumber }`);
 * }
 *
 * execute();
 *
 * // Expected output:
 * // 'The final number is 9'
 * ```
 *
 * @see {@link firstValueFrom}
 *
 * @param source the observable to convert to a promise
 * @param config a configuration object to define the `defaultValue` to use if the source completes without emitting a value
 */
export function lastValueFrom<T, D>(source: Observable<T>, config?: LastValueFromConfig<D>): Promise<T | D> {
  const hasConfig = typeof config === 'object';
  return new Promise<T | D>((resolve, reject) => {
    let _hasValue = false;
    let _value: T;
    source.subscribe({
      next: (value) => {
        _value = value;
        _hasValue = true;
      },
      error: reject,
      complete: () => {
        if (_hasValue) {
          resolve(_value);
        } else if (hasConfig) {
          resolve(config!.defaultValue);
        } else {
          reject(new EmptyError());
        }
      },
    });
  });
}
// https://github.com/microsoft/TypeScript/issues/40462#issuecomment-689879308
/// <reference lib="esnext.asynciterable" />

import { Observable } from './Observable';
import { Subscription } from './Subscription';

/**
 * Note: This will add Symbol.observable globally for all TypeScript users,
 * however, we are no longer polyfilling Symbol.observable
 */
declare global {
  interface SymbolConstructor {
    readonly observable: symbol;
  }
}

/** OPERATOR INTERFACES */

export interface UnaryFunction<T, R> {
  (source: T): R;
}

export interface OperatorFunction<T, R> extends UnaryFunction<Observable<T>, Observable<R>> {}

export type FactoryOrValue<T> = T | (() => T);

export interface MonoTypeOperatorFunction<T> extends OperatorFunction<T, T> {}

/**
 * A value and the time at which it was emitted.
 *
 * Emitted by the `timestamp` operator
 *
 * @see {@link timestamp}
 */
export interface Timestamp<T> {
  value: T;
  /**
   * The timestamp. By default, this is in epoch milliseconds.
   * Could vary based on the timestamp provider passed to the operator.
   */
  timestamp: number;
}

/**
 * A value emitted and the amount of time since the last value was emitted.
 *
 * Emitted by the `timeInterval` operator.
 *
 * @see {@link timeInterval}
 */
export interface TimeInterval<T> {
  value: T;

  /**
   * The amount of time between this value's emission and the previous value's emission.
   * If this is the first emitted value, then it will be the amount of time since subscription
   * started.
   */
  interval: number;
}

/** SUBSCRIPTION INTERFACES */

export interface Unsubscribable {
  unsubscribe(): void;
}

export type TeardownLogic = Subscription | Unsubscribable | (() => void) | void;

export interface SubscriptionLike extends Unsubscribable {
  unsubscribe(): void;
  readonly closed: boolean;
}

/**
 * @deprecated Do not use. Most likely you want to use `ObservableInput`. Will be removed in v8.
 */
export type SubscribableOrPromise<T> = Subscribable<T> | Subscribable<never> | PromiseLike<T> | InteropObservable<T>;

/** OBSERVABLE INTERFACES */

export interface Subscribable<T> {
  subscribe(observer: Partial<Observer<T>>): Unsubscribable;
}

/**
 * Valid types that can be converted to observables.
 */
export type ObservableInput<T> =
  | Observable<T>
  | InteropObservable<T>
  | AsyncIterable<T>
  | PromiseLike<T>
  | ArrayLike<T>
  | Iterable<T>
  | ReadableStreamLike<T>;

/**
 * @deprecated Renamed to {@link InteropObservable }. Will be removed in v8.
 */
export type ObservableLike<T> = InteropObservable<T>;

/**
 * An object that implements the `Symbol.observable` interface.
 */
export interface InteropObservable<T> {
  [Symbol.observable]: () => Subscribable<T>;
}

/** NOTIFICATIONS */

/**
 * A notification representing a "next" from an observable.
 * Can be used with {@link dematerialize}.
 */
export interface NextNotification<T> {
  /** The kind of notification. Always "N" */
  kind: 'N';
  /** The value of the notification. */
  value: T;
}

/**
 * A notification representing an "error" from an observable.
 * Can be used with {@link dematerialize}.
 */
export interface ErrorNotification {
  /** The kind of notification. Always "E" */
  kind: 'E';
  error: any;
}

/**
 * A notification representing a "completion" from an observable.
 * Can be used with {@link dematerialize}.
 */
export interface CompleteNotification {
  kind: 'C';
}

/**
 * Valid observable notification types.
 */
export type ObservableNotification<T> = NextNotification<T> | ErrorNotification | CompleteNotification;

/** OBSERVER INTERFACES */

export interface NextObserver<T> {
  closed?: boolean;
  next: (value: T) => void;
  error?: (err: any) => void;
  complete?: () => void;
}

export interface ErrorObserver<T> {
  closed?: boolean;
  next?: (value: T) => void;
  error: (err: any) => void;
  complete?: () => void;
}

export interface CompletionObserver<T> {
  closed?: boolean;
  next?: (value: T) => void;
  error?: (err: any) => void;
  complete: () => void;
}

export type PartialObserver<T> = NextObserver<T> | ErrorObserver<T> | CompletionObserver<T>;

export interface Observer<T> {
  next: (value: T) => void;
  error: (err: any) => void;
  complete: () => void;
}

export interface SubjectLike<T> extends Observer<T>, Subscribable<T> {}

/** SCHEDULER INTERFACES */

export interface SchedulerLike extends TimestampProvider {
  schedule<T>(work: (this: SchedulerAction<T>, state: T) => void, delay: number, state: T): Subscription;
  schedule<T>(work: (this: SchedulerAction<T>, state?: T) => void, delay: number, state?: T): Subscription;
  schedule<T>(work: (this: SchedulerAction<T>, state?: T) => void, delay?: number, state?: T): Subscription;
}

export interface SchedulerAction<T> extends Subscription {
  schedule(state?: T, delay?: number): Subscription;
}

/**
 * This is a type that provides a method to allow RxJS to create a numeric timestamp
 */
export interface TimestampProvider {
  /**
   * Returns a timestamp as a number.
   *
   * This is used by types like `ReplaySubject` or operators like `timestamp` to calculate
   * the amount of time passed between events.
   */
  now(): number;
}

/**
 * Extracts the type from an `ObservableInput<any>`. If you have
 * `O extends ObservableInput<any>` and you pass in `Observable<number>`, or
 * `Promise<number>`, etc, it will type as `number`.
 */
export type ObservedValueOf<O> = O extends ObservableInput<infer T> ? T : never;

/**
 * Extracts a union of element types from an `ObservableInput<any>[]`.
 * If you have `O extends ObservableInput<any>[]` and you pass in
 * `Observable<string>[]` or `Promise<string>[]` you would get
 * back a type of `string`.
 * If you pass in `[Observable<string>, Observable<number>]` you would
 * get back a type of `string | number`.
 */
export type ObservedValueUnionFromArray<X> = X extends Array<ObservableInput<infer T>> ? T : never;

/**
 * @deprecated Renamed to {@link ObservedValueUnionFromArray}. Will be removed in v8.
 */
export type ObservedValuesFromArray<X> = ObservedValueUnionFromArray<X>;

/**
 * Extracts a tuple of element types from an `ObservableInput<any>[]`.
 * If you have `O extends ObservableInput<any>[]` and you pass in
 * `[Observable<string>, Observable<number>]` you would get back a type
 * of `[string, number]`.
 */
export type ObservedValueTupleFromArray<X> = { [K in keyof X]: ObservedValueOf<X[K]> };

/**
 * Used to infer types from arguments to functions like {@link forkJoin}.
 * So that you can have `forkJoin([Observable<A>, PromiseLike<B>]): Observable<[A, B]>`
 * et al.
 */
export type ObservableInputTuple<T> = {
  [K in keyof T]: ObservableInput<T[K]>;
};

/**
 * Constructs a new tuple with the specified type at the head.
 * If you declare `Cons<A, [B, C]>` you will get back `[A, B, C]`.
 */
export type Cons<X, Y extends readonly any[]> = ((arg: X, ...rest: Y) => any) extends (...args: infer U) => any ? U : never;

/**
 * Extracts the head of a tuple.
 * If you declare `Head<[A, B, C]>` you will get back `A`.
 */
export type Head<X extends readonly any[]> = ((...args: X) => any) extends (arg: infer U, ...rest: any[]) => any ? U : never;

/**
 * Extracts the tail of a tuple.
 * If you declare `Tail<[A, B, C]>` you will get back `[B, C]`.
 */
export type Tail<X extends readonly any[]> = ((...args: X) => any) extends (arg: any, ...rest: infer U) => any ? U : never;

/**
 * Extracts the generic value from an Array type.
 * If you have `T extends Array<any>`, and pass a `string[]` to it,
 * `ValueFromArray<T>` will return the actual type of `string`.
 */
export type ValueFromArray<A extends readonly unknown[]> = A extends Array<infer T> ? T : never;

/**
 * Gets the value type from an {@link ObservableNotification}, if possible.
 */
export type ValueFromNotification<T> = T extends { kind: 'N' | 'E' | 'C' }
  ? T extends NextNotification<any>
    ? T extends { value: infer V }
      ? V
      : undefined
    : never
  : never;

/**
 * A simple type to represent a gamut of "falsy" values... with a notable exception:
 * `NaN` is "falsy" however, it is not and cannot be typed via TypeScript. See
 * comments here: https://github.com/microsoft/TypeScript/issues/28682#issuecomment-707142417
 */
export type Falsy = null | undefined | false | 0 | -0 | 0n | '';

export type TruthyTypesOf<T> = T extends Falsy ? never : T;

// We shouldn't rely on this type definition being available globally yet since it's
// not necessarily available in every TS environment.
interface ReadableStreamDefaultReaderLike<T> {
  // HACK: As of TS 4.2.2, The provided types for the iterator results of a `ReadableStreamDefaultReader`
  // are significantly different enough from `IteratorResult` as to cause compilation errors.
  // The type at the time is `ReadableStreamDefaultReadResult`.
  read(): PromiseLike<
    | {
        done: false;
        value: T;
      }
    | { done: true; value?: undefined }
  >;
  releaseLock(): void;
}

/**
 * The base signature RxJS will look for to identify and use
 * a [ReadableStream](https://streams.spec.whatwg.org/#rs-class)
 * as an {@link ObservableInput} source.
 */
export interface ReadableStreamLike<T> {
  getReader(): ReadableStreamDefaultReaderLike<T>;
}

/**
 * An observable with a `connect` method that is used to create a subscription
 * to an underlying source, connecting it with all consumers via a multicast.
 */
export interface Connectable<T> extends Observable<T> {
  /**
   * (Idempotent) Calling this method will connect the underlying source observable to all subscribed consumers
   * through an underlying {@link Subject}.
   * @returns A subscription, that when unsubscribed, will "disconnect" the source from the connector subject,
   * severing notifications to all consumers.
   */
  connect(): Subscription;
}
/*
  NOTE: This is the global export file for rxjs v6 and higher.
 */

/* rxjs */
export * from '../index';

/* rxjs.operators */
import * as _operators from '../operators/index';
export const operators = _operators;

/* rxjs.testing */
import * as _testing from '../testing/index';
export const testing = _testing;

/* rxjs.ajax */
import * as _ajax from '../ajax/index';
export const ajax = _ajax;

/* rxjs.webSocket */
import * as _webSocket from '../webSocket/index';
export const webSocket = _webSocket;

/* rxjs.fetch */
import * as _fetch from '../fetch/index';
export const fetch = _fetch;
import { createErrorClass } from './createErrorClass';

export interface ArgumentOutOfRangeError extends Error {}

export interface ArgumentOutOfRangeErrorCtor {
  /**
   * @deprecated Internal implementation detail. Do not construct error instances.
   * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269
   */
  new (): ArgumentOutOfRangeError;
}

/**
 * An error thrown when an element was queried at a certain index of an
 * Observable, but no such index or position exists in that sequence.
 *
 * @see {@link elementAt}
 * @see {@link take}
 * @see {@link takeLast}
 *
 * @class ArgumentOutOfRangeError
 */
export const ArgumentOutOfRangeError: ArgumentOutOfRangeErrorCtor = createErrorClass(
  (_super) =>
    function ArgumentOutOfRangeErrorImpl(this: any) {
      _super(this);
      this.name = 'ArgumentOutOfRangeError';
      this.message = 'argument out of range';
    }
);
import { createErrorClass } from './createErrorClass';

export interface EmptyError extends Error {}

export interface EmptyErrorCtor {
  /**
   * @deprecated Internal implementation detail. Do not construct error instances.
   * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269
   */
  new (): EmptyError;
}

/**
 * An error thrown when an Observable or a sequence was queried but has no
 * elements.
 *
 * @see {@link first}
 * @see {@link last}
 * @see {@link single}
 * @see {@link firstValueFrom}
 * @see {@link lastValueFrom}
 *
 * @class EmptyError
 */
export const EmptyError: EmptyErrorCtor = createErrorClass((_super) => function EmptyErrorImpl(this: any) {
  _super(this);
  this.name = 'EmptyError';
  this.message = 'no elements in sequence';
});
let nextHandle = 1;
// The promise needs to be created lazily otherwise it won't be patched by Zones
let resolved: Promise<any>;
const activeHandles: { [key: number]: any } = {};

/**
 * Finds the handle in the list of active handles, and removes it.
 * Returns `true` if found, `false` otherwise. Used both to clear
 * Immediate scheduled tasks, and to identify if a task should be scheduled.
 */
function findAndClearHandle(handle: number): boolean {
  if (handle in activeHandles) {
    delete activeHandles[handle];
    return true;
  }
  return false;
}

/**
 * Helper functions to schedule and unschedule microtasks.
 */
export const Immediate = {
  setImmediate(cb: () => void): number {
    const handle = nextHandle++;
    activeHandles[handle] = true;
    if (!resolved) {
      resolved = Promise.resolve();
    }
    resolved.then(() => findAndClearHandle(handle) && cb());
    return handle;
  },

  clearImmediate(handle: number): void {
    findAndClearHandle(handle);
  },
};

/**
 * Used for internal testing purposes only. Do not export from library.
 */
export const TestTools = {
  pending() {
    return Object.keys(activeHandles).length;
  }
};
import { createErrorClass } from './createErrorClass';

export interface NotFoundError extends Error {}

export interface NotFoundErrorCtor {
  /**
   * @deprecated Internal implementation detail. Do not construct error instances.
   * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269
   */
  new (message: string): NotFoundError;
}

/**
 * An error thrown when a value or values are missing from an
 * observable sequence.
 *
 * @see {@link operators/single}
 *
 * @class NotFoundError
 */
export const NotFoundError: NotFoundErrorCtor = createErrorClass(
  (_super) =>
    function NotFoundErrorImpl(this: any, message: string) {
      _super(this);
      this.name = 'NotFoundError';
      this.message = message;
    }
);
import { createErrorClass } from './createErrorClass';

export interface ObjectUnsubscribedError extends Error {}

export interface ObjectUnsubscribedErrorCtor {
  /**
   * @deprecated Internal implementation detail. Do not construct error instances.
   * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269
   */
  new (): ObjectUnsubscribedError;
}

/**
 * An error thrown when an action is invalid because the object has been
 * unsubscribed.
 *
 * @see {@link Subject}
 * @see {@link BehaviorSubject}
 *
 * @class ObjectUnsubscribedError
 */
export const ObjectUnsubscribedError: ObjectUnsubscribedErrorCtor = createErrorClass(
  (_super) =>
    function ObjectUnsubscribedErrorImpl(this: any) {
      _super(this);
      this.name = 'ObjectUnsubscribedError';
      this.message = 'object unsubscribed';
    }
);
import { createErrorClass } from './createErrorClass';

export interface SequenceError extends Error {}

export interface SequenceErrorCtor {
  /**
   * @deprecated Internal implementation detail. Do not construct error instances.
   * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269
   */
  new (message: string): SequenceError;
}

/**
 * An error thrown when something is wrong with the sequence of
 * values arriving on the observable.
 *
 * @see {@link operators/single}
 *
 * @class SequenceError
 */
export const SequenceError: SequenceErrorCtor = createErrorClass(
  (_super) =>
    function SequenceErrorImpl(this: any, message: string) {
      _super(this);
      this.name = 'SequenceError';
      this.message = message;
    }
);
import { createErrorClass } from './createErrorClass';

export interface UnsubscriptionError extends Error {
  readonly errors: any[];
}

export interface UnsubscriptionErrorCtor {
  /**
   * @deprecated Internal implementation detail. Do not construct error instances.
   * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269
   */
  new (errors: any[]): UnsubscriptionError;
}

/**
 * An error thrown when one or more errors have occurred during the
 * `unsubscribe` of a {@link Subscription}.
 */
export const UnsubscriptionError: UnsubscriptionErrorCtor = createErrorClass(
  (_super) =>
    function UnsubscriptionErrorImpl(this: any, errors: (Error | string)[]) {
      _super(this);
      this.message = errors
        ? `${errors.length} errors occurred during unsubscription:
${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\n  ')}`
        : '';
      this.name = 'UnsubscriptionError';
      this.errors = errors;
    }
);
export function applyMixins(derivedCtor: any, baseCtors: any[]) {
  for (let i = 0, len = baseCtors.length; i < len; i++) {
    const baseCtor = baseCtors[i];
    const propertyKeys = Object.getOwnPropertyNames(baseCtor.prototype);
    for (let j = 0, len2 = propertyKeys.length; j < len2; j++) {
      const name = propertyKeys[j];
      derivedCtor.prototype[name] = baseCtor.prototype[name];
    }
  }
}import { SchedulerLike } from '../types';
import { isFunction } from './isFunction';
import { isScheduler } from './isScheduler';

function last<T>(arr: T[]): T | undefined {
  return arr[arr.length - 1];
}

export function popResultSelector(args: any[]): ((...args: unknown[]) => unknown) | undefined {
  return isFunction(last(args)) ? args.pop() : undefined;
}

export function popScheduler(args: any[]): SchedulerLike | undefined {
  return isScheduler(last(args)) ? args.pop() : undefined;
}

export function popNumber(args: any[], defaultValue: number): number {
  return typeof last(args) === 'number' ? args.pop()! : defaultValue;
}
const { isArray } = Array;
const { getPrototypeOf, prototype: objectProto, keys: getKeys } = Object;

/**
 * Used in functions where either a list of arguments, a single array of arguments, or a
 * dictionary of arguments can be returned. Returns an object with an `args` property with
 * the arguments in an array, if it is a dictionary, it will also return the `keys` in another
 * property.
 */
export function argsArgArrayOrObject<T, O extends Record<string, T>>(args: T[] | [O] | [T[]]): { args: T[]; keys: string[] | null } {
  if (args.length === 1) {
    const first = args[0];
    if (isArray(first)) {
      return { args: first, keys: null };
    }
    if (isPOJO(first)) {
      const keys = getKeys(first);
      return {
        args: keys.map((key) => first[key]),
        keys,
      };
    }
  }

  return { args: args as T[], keys: null };
}

function isPOJO(obj: any): obj is object {
  return obj && typeof obj === 'object' && getPrototypeOf(obj) === objectProto;
}
const { isArray } = Array;

/**
 * Used in operators and functions that accept either a list of arguments, or an array of arguments
 * as a single argument.
 */
export function argsOrArgArray<T>(args: (T | T[])[]): T[] {
  return args.length === 1 && isArray(args[0]) ? args[0] : (args as T[]);
}
/**
 * Removes an item from an array, mutating it.
 * @param arr The array to remove the item from
 * @param item The item to remove
 */
export function arrRemove<T>(arr: T[] | undefined | null, item: T) {
  if (arr) {
    const index = arr.indexOf(item);
    0 <= index && arr.splice(index, 1);
  }
}
/**
 * Used to create Error subclasses until the community moves away from ES5.
 *
 * This is because compiling from TypeScript down to ES5 has issues with subclassing Errors
 * as well as other built-in types: https://github.com/Microsoft/TypeScript/issues/12123
 *
 * @param createImpl A factory function to create the actual constructor implementation. The returned
 * function should be a named function that calls `_super` internally.
 */
export function createErrorClass<T>(createImpl: (_super: any) => any): T {
  const _super = (instance: any) => {
    Error.call(instance);
    instance.stack = new Error().stack;
  };

  const ctorFunc = createImpl(_super);
  ctorFunc.prototype = Object.create(Error.prototype);
  ctorFunc.prototype.constructor = ctorFunc;
  return ctorFunc;
}
export function createObject(keys: string[], values: any[]) {
  return keys.reduce((result, key, i) => ((result[key] = values[i]), result), {} as any);
}
import { config } from '../config';

let context: { errorThrown: boolean; error: any } | null = null;

/**
 * Handles dealing with errors for super-gross mode. Creates a context, in which
 * any synchronously thrown errors will be passed to {@link captureError}. Which
 * will record the error such that it will be rethrown after the call back is complete.
 * TODO: Remove in v8
 * @param cb An immediately executed function.
 */
export function errorContext(cb: () => void) {
  if (config.useDeprecatedSynchronousErrorHandling) {
    const isRoot = !context;
    if (isRoot) {
      context = { errorThrown: false, error: null };
    }
    cb();
    if (isRoot) {
      const { errorThrown, error } = context!;
      context = null;
      if (errorThrown) {
        throw error;
      }
    }
  } else {
    // This is the general non-deprecated path for everyone that
    // isn't crazy enough to use super-gross mode (useDeprecatedSynchronousErrorHandling)
    cb();
  }
}

/**
 * Captures errors only in super-gross mode.
 * @param err the error to capture
 */
export function captureError(err: any) {
  if (config.useDeprecatedSynchronousErrorHandling && context) {
    context.errorThrown = true;
    context.error = err;
  }
}
import { Subscription } from '../Subscription';
import { SchedulerAction, SchedulerLike } from '../types';

export function executeSchedule(
  parentSubscription: Subscription,
  scheduler: SchedulerLike,
  work: () => void,
  delay: number,
  repeat: true
): void;
export function executeSchedule(
  parentSubscription: Subscription,
  scheduler: SchedulerLike,
  work: () => void,
  delay?: number,
  repeat?: false
): Subscription;

export function executeSchedule(
  parentSubscription: Subscription,
  scheduler: SchedulerLike,
  work: () => void,
  delay = 0,
  repeat = false
): Subscription | void {
  const scheduleSubscription = scheduler.schedule(function (this: SchedulerAction<any>) {
    work();
    if (repeat) {
      parentSubscription.add(this.schedule(null, delay));
    } else {
      this.unsubscribe();
    }
  }, delay);

  parentSubscription.add(scheduleSubscription);

  if (!repeat) {
    // Because user-land scheduler implementations are unlikely to properly reuse
    // Actions for repeat scheduling, we can't trust that the returned subscription
    // will control repeat subscription scenarios. So we're trying to avoid using them
    // incorrectly within this library.
    return scheduleSubscription;
  }
}
/**
 * This function takes one parameter and just returns it. Simply put,
 * this is like `<T>(x: T): T => x`.
 *
 * ## Examples
 *
 * This is useful in some cases when using things like `mergeMap`
 *
 * ```ts
 * import { interval, take, map, range, mergeMap, identity } from 'rxjs';
 *
 * const source$ = interval(1000).pipe(take(5));
 *
 * const result$ = source$.pipe(
 *   map(i => range(i)),
 *   mergeMap(identity) // same as mergeMap(x => x)
 * );
 *
 * result$.subscribe({
 *   next: console.log
 * });
 * ```
 *
 * Or when you want to selectively apply an operator
 *
 * ```ts
 * import { interval, take, identity } from 'rxjs';
 *
 * const shouldLimit = () => Math.random() < 0.5;
 *
 * const source$ = interval(1000);
 *
 * const result$ = source$.pipe(shouldLimit() ? take(5) : identity);
 *
 * result$.subscribe({
 *   next: console.log
 * });
 * ```
 *
 * @param x Any value that is returned by this function
 * @returns The value passed as the first parameter to this function
 */
export function identity<T>(x: T): T {
  return x;
}
export const isArrayLike = (<T>(x: any): x is ArrayLike<T> => x && typeof x.length === 'number' && typeof x !== 'function');import { isFunction } from './isFunction';

export function isAsyncIterable<T>(obj: any): obj is AsyncIterable<T> {
  return Symbol.asyncIterator && isFunction(obj?.[Symbol.asyncIterator]);
}
/**
 * Checks to see if a value is not only a `Date` object,
 * but a *valid* `Date` object that can be converted to a
 * number. For example, `new Date('blah')` is indeed an
 * `instanceof Date`, however it cannot be converted to a
 * number.
 */
export function isValidDate(value: any): value is Date {
  return value instanceof Date && !isNaN(value as any);
}
/**
 * Returns true if the object is a function.
 * @param value The value to check
 */
export function isFunction(value: any): value is (...args: any[]) => any {
  return typeof value === 'function';
}
import { InteropObservable } from '../types';
import { observable as Symbol_observable } from '../symbol/observable';
import { isFunction } from './isFunction';

/** Identifies an input as being Observable (but not necessary an Rx Observable) */
export function isInteropObservable(input: any): input is InteropObservable<any> {
  return isFunction(input[Symbol_observable]);
}
import { iterator as Symbol_iterator } from '../symbol/iterator';
import { isFunction } from './isFunction';

/** Identifies an input as being an Iterable */
export function isIterable(input: any): input is Iterable<any> {
  return isFunction(input?.[Symbol_iterator]);
}
/** prettier */
import { Observable } from '../Observable';
import { isFunction } from './isFunction';

/**
 * Tests to see if the object is an RxJS {@link Observable}
 * @param obj the object to test
 */
export function isObservable(obj: any): obj is Observable<unknown> {
  // The !! is to ensure that this publicly exposed function returns
  // `false` if something like `null` or `0` is passed.
  return !!obj && (obj instanceof Observable || (isFunction(obj.lift) && isFunction(obj.subscribe)));
}
import { isFunction } from "./isFunction";

/**
 * Tests to see if the object is "thennable".
 * @param value the object to test
 */
export function isPromise(value: any): value is PromiseLike<any> {
  return isFunction(value?.then);
}
import { ReadableStreamLike } from '../types';
import { isFunction } from './isFunction';

export async function* readableStreamLikeToAsyncGenerator<T>(readableStream: ReadableStreamLike<T>): AsyncGenerator<T> {
  const reader = readableStream.getReader();
  try {
    while (true) {
      const { value, done } = await reader.read();
      if (done) {
        return;
      }
      yield value!;
    }
  } finally {
    reader.releaseLock();
  }
}

export function isReadableStreamLike<T>(obj: any): obj is ReadableStreamLike<T> {
  // We don't want to use instanceof checks because they would return
  // false for instances from another Realm, like an <iframe>.
  return isFunction(obj?.getReader);
}
import { SchedulerLike } from '../types';
import { isFunction } from './isFunction';

export function isScheduler(value: any): value is SchedulerLike {
  return value && isFunction(value.schedule);
}
import { Observable } from '../Observable';
import { Subscriber } from '../Subscriber';
import { OperatorFunction } from '../types';
import { isFunction } from './isFunction';

/**
 * Used to determine if an object is an Observable with a lift function.
 */
export function hasLift(source: any): source is { lift: InstanceType<typeof Observable>['lift'] } {
  return isFunction(source?.lift);
}

/**
 * Creates an `OperatorFunction`. Used to define operators throughout the library in a concise way.
 * @param init The logic to connect the liftedSource to the subscriber at the moment of subscription.
 */
export function operate<T, R>(
  init: (liftedSource: Observable<T>, subscriber: Subscriber<R>) => (() => void) | void
): OperatorFunction<T, R> {
  return (source: Observable<T>) => {
    if (hasLift(source)) {
      return source.lift(function (this: Subscriber<R>, liftedSource: Observable<T>) {
        try {
          return init(liftedSource, this);
        } catch (err) {
          this.error(err);
        }
      });
    }
    throw new TypeError('Unable to lift unknown Observable type');
  };
}
import { OperatorFunction } from "../types";
import { map } from "../operators/map";

const { isArray } = Array;

function callOrApply<T, R>(fn: ((...values: T[]) => R), args: T|T[]): R {
    return isArray(args) ? fn(...args) : fn(args);
}

/**
 * Used in several -- mostly deprecated -- situations where we need to 
 * apply a list of arguments or a single argument to a result selector.
 */
export function mapOneOrManyArgs<T, R>(fn: ((...values: T[]) => R)): OperatorFunction<T|T[], R> {
    return map(args => callOrApply(fn, args))
}/* tslint:disable:no-empty */
export function noop() { }
export function not<T>(pred: (value: T, index: number) => boolean, thisArg: any): (value: T, index: number) => boolean {
  return (value: T, index: number) => !pred.call(thisArg, value, index); 
}import { identity } from './identity';
import { UnaryFunction } from '../types';

export function pipe(): typeof identity;
export function pipe<T, A>(fn1: UnaryFunction<T, A>): UnaryFunction<T, A>;
export function pipe<T, A, B>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>): UnaryFunction<T, B>;
export function pipe<T, A, B, C>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>, fn3: UnaryFunction<B, C>): UnaryFunction<T, C>;
export function pipe<T, A, B, C, D>(
  fn1: UnaryFunction<T, A>,
  fn2: UnaryFunction<A, B>,
  fn3: UnaryFunction<B, C>,
  fn4: UnaryFunction<C, D>
): UnaryFunction<T, D>;
export function pipe<T, A, B, C, D, E>(
  fn1: UnaryFunction<T, A>,
  fn2: UnaryFunction<A, B>,
  fn3: UnaryFunction<B, C>,
  fn4: UnaryFunction<C, D>,
  fn5: UnaryFunction<D, E>
): UnaryFunction<T, E>;
export function pipe<T, A, B, C, D, E, F>(
  fn1: UnaryFunction<T, A>,
  fn2: UnaryFunction<A, B>,
  fn3: UnaryFunction<B, C>,
  fn4: UnaryFunction<C, D>,
  fn5: UnaryFunction<D, E>,
  fn6: UnaryFunction<E, F>
): UnaryFunction<T, F>;
export function pipe<T, A, B, C, D, E, F, G>(
  fn1: UnaryFunction<T, A>,
  fn2: UnaryFunction<A, B>,
  fn3: UnaryFunction<B, C>,
  fn4: UnaryFunction<C, D>,
  fn5: UnaryFunction<D, E>,
  fn6: UnaryFunction<E, F>,
  fn7: UnaryFunction<F, G>
): UnaryFunction<T, G>;
export function pipe<T, A, B, C, D, E, F, G, H>(
  fn1: UnaryFunction<T, A>,
  fn2: UnaryFunction<A, B>,
  fn3: UnaryFunction<B, C>,
  fn4: UnaryFunction<C, D>,
  fn5: UnaryFunction<D, E>,
  fn6: UnaryFunction<E, F>,
  fn7: UnaryFunction<F, G>,
  fn8: UnaryFunction<G, H>
): UnaryFunction<T, H>;
export function pipe<T, A, B, C, D, E, F, G, H, I>(
  fn1: UnaryFunction<T, A>,
  fn2: UnaryFunction<A, B>,
  fn3: UnaryFunction<B, C>,
  fn4: UnaryFunction<C, D>,
  fn5: UnaryFunction<D, E>,
  fn6: UnaryFunction<E, F>,
  fn7: UnaryFunction<F, G>,
  fn8: UnaryFunction<G, H>,
  fn9: UnaryFunction<H, I>
): UnaryFunction<T, I>;
export function pipe<T, A, B, C, D, E, F, G, H, I>(
  fn1: UnaryFunction<T, A>,
  fn2: UnaryFunction<A, B>,
  fn3: UnaryFunction<B, C>,
  fn4: UnaryFunction<C, D>,
  fn5: UnaryFunction<D, E>,
  fn6: UnaryFunction<E, F>,
  fn7: UnaryFunction<F, G>,
  fn8: UnaryFunction<G, H>,
  fn9: UnaryFunction<H, I>,
  ...fns: UnaryFunction<any, any>[]
): UnaryFunction<T, unknown>;

/**
 * pipe() can be called on one or more functions, each of which can take one argument ("UnaryFunction")
 * and uses it to return a value.
 * It returns a function that takes one argument, passes it to the first UnaryFunction, and then
 * passes the result to the next one, passes that result to the next one, and so on.  
 */
export function pipe(...fns: Array<UnaryFunction<any, any>>): UnaryFunction<any, any> {
  return pipeFromArray(fns);
}

/** @internal */
export function pipeFromArray<T, R>(fns: Array<UnaryFunction<T, R>>): UnaryFunction<T, R> {
  if (fns.length === 0) {
    return identity as UnaryFunction<any, any>;
  }

  if (fns.length === 1) {
    return fns[0];
  }

  return function piped(input: T): R {
    return fns.reduce((prev: any, fn: UnaryFunction<T, R>) => fn(prev), input as any);
  };
}
import { config } from '../config';
import { timeoutProvider } from '../scheduler/timeoutProvider';

/**
 * Handles an error on another job either with the user-configured {@link onUnhandledError},
 * or by throwing it on that new job so it can be picked up by `window.onerror`, `process.on('error')`, etc.
 *
 * This should be called whenever there is an error that is out-of-band with the subscription
 * or when an error hits a terminal boundary of the subscription and no error handler was provided.
 *
 * @param err the error to report
 */
export function reportUnhandledError(err: any) {
  timeoutProvider.setTimeout(() => {
    const { onUnhandledError } = config;
    if (onUnhandledError) {
      // Execute the user-configured error handler.
      onUnhandledError(err);
    } else {
      // Throw so it is picked up by the runtime's uncaught error mechanism.
      throw err;
    }
  });
}
import { Subscriber } from '../Subscriber';

/**
 * Subscribes to an ArrayLike with a subscriber
 * @param array The array or array-like to subscribe to
 */
export const subscribeToArray = <T>(array: ArrayLike<T>) => (subscriber: Subscriber<T>) => {
  for (let i = 0, len = array.length; i < len && !subscriber.closed; i++) {
    subscriber.next(array[i]);
  }
  subscriber.complete();
};
/**
 * Creates the TypeError to throw if an invalid object is passed to `from` or `scheduled`.
 * @param input The object that was passed.
 */
export function createInvalidObservableTypeError(input: any) {
  // TODO: We should create error codes that can be looked up, so this can be less verbose.
  return new TypeError(
    `You provided ${
      input !== null && typeof input === 'object' ? 'an invalid object' : `'${input}'`
    } where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`
  );
}
// Instead of using any - or another less-than-ideal type - to workaround a
// TypeScript problem or bug, create a type alias and use that instead.
// Wherever possible, use a TypeScript issue number in the type - something
// like TS_18757 - or use a descriptive name and leave a detailed comment
// alongside the type alias.

export {}
import { Observable } from '../Observable';
import { Subscription } from '../Subscription';
import { Scheduler } from '../Scheduler';
import { TestMessage } from './TestMessage';
import { SubscriptionLog } from './SubscriptionLog';
import { SubscriptionLoggable } from './SubscriptionLoggable';
import { applyMixins } from '../util/applyMixins';
import { Subscriber } from '../Subscriber';
import { observeNotification } from '../Notification';

export class ColdObservable<T> extends Observable<T> implements SubscriptionLoggable {
  public subscriptions: SubscriptionLog[] = [];
  scheduler: Scheduler;
  // @ts-ignore: Property has no initializer and is not definitely assigned
  logSubscribedFrame: () => number;
  // @ts-ignore: Property has no initializer and is not definitely assigned
  logUnsubscribedFrame: (index: number) => void;

  constructor(public messages: TestMessage[], scheduler: Scheduler) {
    super(function (this: Observable<T>, subscriber: Subscriber<any>) {
      const observable: ColdObservable<T> = this as any;
      const index = observable.logSubscribedFrame();
      const subscription = new Subscription();
      subscription.add(
        new Subscription(() => {
          observable.logUnsubscribedFrame(index);
        })
      );
      observable.scheduleMessages(subscriber);
      return subscription;
    });
    this.scheduler = scheduler;
  }

  scheduleMessages(subscriber: Subscriber<any>) {
    const messagesLength = this.messages.length;
    for (let i = 0; i < messagesLength; i++) {
      const message = this.messages[i];
      subscriber.add(
        this.scheduler.schedule(
          (state) => {
            const { message: { notification }, subscriber: destination } = state!;
            observeNotification(notification, destination);
          },
          message.frame,
          { message, subscriber }
        )
      );
    }
  }
}
applyMixins(ColdObservable, [SubscriptionLoggable]);
import { Subject } from '../Subject';
import { Subscriber } from '../Subscriber';
import { Subscription } from '../Subscription';
import { Scheduler } from '../Scheduler';
import { TestMessage } from './TestMessage';
import { SubscriptionLog } from './SubscriptionLog';
import { SubscriptionLoggable } from './SubscriptionLoggable';
import { applyMixins } from '../util/applyMixins';
import { observeNotification } from '../Notification';

export class HotObservable<T> extends Subject<T> implements SubscriptionLoggable {
  public subscriptions: SubscriptionLog[] = [];
  scheduler: Scheduler;
  // @ts-ignore: Property has no initializer and is not definitely assigned
  logSubscribedFrame: () => number;
  // @ts-ignore: Property has no initializer and is not definitely assigned
  logUnsubscribedFrame: (index: number) => void;

  constructor(public messages: TestMessage[], scheduler: Scheduler) {
    super();
    this.scheduler = scheduler;
  }

  /** @internal */
  protected _subscribe(subscriber: Subscriber<any>): Subscription {
    const subject: HotObservable<T> = this;
    const index = subject.logSubscribedFrame();
    const subscription = new Subscription();
    subscription.add(
      new Subscription(() => {
        subject.logUnsubscribedFrame(index);
      })
    );
    subscription.add(super._subscribe(subscriber));
    return subscription;
  }

  setup() {
    const subject = this;
    const messagesLength = subject.messages.length;
    /* tslint:disable:no-var-keyword */
    for (let i = 0; i < messagesLength; i++) {
      (() => {
        const { notification, frame } = subject.messages[i];
        /* tslint:enable */
        subject.scheduler.schedule(() => {
          observeNotification(notification, subject);
        }, frame);
      })();
    }
  }
}
applyMixins(HotObservable, [SubscriptionLoggable]);
export class SubscriptionLog {
  constructor(public subscribedFrame: number,
              public unsubscribedFrame: number = Infinity) {
  }
}import { Scheduler } from '../Scheduler';
import { SubscriptionLog } from './SubscriptionLog';

export class SubscriptionLoggable {
  public subscriptions: SubscriptionLog[] = [];
  // @ts-ignore: Property has no initializer and is not definitely assigned
  scheduler: Scheduler;

  logSubscribedFrame(): number {
    this.subscriptions.push(new SubscriptionLog(this.scheduler.now()));
    return this.subscriptions.length - 1;
  }

  logUnsubscribedFrame(index: number) {
    const subscriptionLogs = this.subscriptions;
    const oldSubscriptionLog = subscriptionLogs[index];
    subscriptionLogs[index] = new SubscriptionLog(
      oldSubscriptionLog.subscribedFrame,
      this.scheduler.now()
    );
  }
}
import { ObservableNotification } from '../types';

export interface TestMessage {
  frame: number;
  notification: ObservableNotification<any>;
  isGhost?: boolean;
}
import { Observable } from '../Observable';
import { ColdObservable } from './ColdObservable';
import { HotObservable } from './HotObservable';
import { TestMessage } from './TestMessage';
import { SubscriptionLog } from './SubscriptionLog';
import { Subscription } from '../Subscription';
import { VirtualTimeScheduler, VirtualAction } from '../scheduler/VirtualTimeScheduler';
import { ObservableNotification } from '../types';
import { COMPLETE_NOTIFICATION, errorNotification, nextNotification } from '../NotificationFactories';
import { dateTimestampProvider } from '../scheduler/dateTimestampProvider';
import { performanceTimestampProvider } from '../scheduler/performanceTimestampProvider';
import { animationFrameProvider } from '../scheduler/animationFrameProvider';
import type { TimerHandle } from '../scheduler/timerHandle';
import { immediateProvider } from '../scheduler/immediateProvider';
import { intervalProvider } from '../scheduler/intervalProvider';
import { timeoutProvider } from '../scheduler/timeoutProvider';

const defaultMaxFrame: number = 750;

export interface RunHelpers {
  cold: typeof TestScheduler.prototype.createColdObservable;
  hot: typeof TestScheduler.prototype.createHotObservable;
  flush: typeof TestScheduler.prototype.flush;
  time: typeof TestScheduler.prototype.createTime;
  expectObservable: typeof TestScheduler.prototype.expectObservable;
  expectSubscriptions: typeof TestScheduler.prototype.expectSubscriptions;
  animate: (marbles: string) => void;
}

interface FlushableTest {
  ready: boolean;
  actual?: any[];
  expected?: any[];
}

export type observableToBeFn = (marbles: string, values?: any, errorValue?: any) => void;
export type subscriptionLogsToBeFn = (marbles: string | string[]) => void;

export class TestScheduler extends VirtualTimeScheduler {
  /**
   * The number of virtual time units each character in a marble diagram represents. If
   * the test scheduler is being used in "run mode", via the `run` method, this is temporarly
   * set to `1` for the duration of the `run` block, then set back to whatever value it was.
   * @nocollapse
   */
  static frameTimeFactor = 10;

  /**
   * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.
   */
  public readonly hotObservables: HotObservable<any>[] = [];

  /**
   * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.
   */
  public readonly coldObservables: ColdObservable<any>[] = [];

  /**
   * Test meta data to be processed during `flush()`
   */
  private flushTests: FlushableTest[] = [];

  /**
   * Indicates whether the TestScheduler instance is operating in "run mode",
   * meaning it's processing a call to `run()`
   */
  private runMode = false;

  /**
   *
   * @param assertDeepEqual A function to set up your assertion for your test harness
   */
  constructor(public assertDeepEqual: (actual: any, expected: any) => boolean | void) {
    super(VirtualAction, defaultMaxFrame);
  }

  createTime(marbles: string): number {
    const indexOf = this.runMode ? marbles.trim().indexOf('|') : marbles.indexOf('|');
    if (indexOf === -1) {
      throw new Error('marble diagram for time should have a completion marker "|"');
    }
    return indexOf * TestScheduler.frameTimeFactor;
  }

  /**
   * @param marbles A diagram in the marble DSL. Letters map to keys in `values` if provided.
   * @param values Values to use for the letters in `marbles`. If ommitted, the letters themselves are used.
   * @param error The error to use for the `#` marble (if present).
   */
  createColdObservable<T = string>(marbles: string, values?: { [marble: string]: T }, error?: any): ColdObservable<T> {
    if (marbles.indexOf('^') !== -1) {
      throw new Error('cold observable cannot have subscription offset "^"');
    }
    if (marbles.indexOf('!') !== -1) {
      throw new Error('cold observable cannot have unsubscription marker "!"');
    }
    const messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);
    const cold = new ColdObservable<T>(messages, this);
    this.coldObservables.push(cold);
    return cold;
  }

  /**
   * @param marbles A diagram in the marble DSL. Letters map to keys in `values` if provided.
   * @param values Values to use for the letters in `marbles`. If ommitted, the letters themselves are used.
   * @param error The error to use for the `#` marble (if present).
   */
  createHotObservable<T = string>(marbles: string, values?: { [marble: string]: T }, error?: any): HotObservable<T> {
    if (marbles.indexOf('!') !== -1) {
      throw new Error('hot observable cannot have unsubscription marker "!"');
    }
    const messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);
    const subject = new HotObservable<T>(messages, this);
    this.hotObservables.push(subject);
    return subject;
  }

  private materializeInnerObservable(observable: Observable<any>, outerFrame: number): TestMessage[] {
    const messages: TestMessage[] = [];
    observable.subscribe({
      next: (value) => {
        messages.push({ frame: this.frame - outerFrame, notification: nextNotification(value) });
      },
      error: (error) => {
        messages.push({ frame: this.frame - outerFrame, notification: errorNotification(error) });
      },
      complete: () => {
        messages.push({ frame: this.frame - outerFrame, notification: COMPLETE_NOTIFICATION });
      },
    });
    return messages;
  }

  expectObservable<T>(observable: Observable<T>, subscriptionMarbles: string | null = null) {
    const actual: TestMessage[] = [];
    const flushTest: FlushableTest = { actual, ready: false };
    const subscriptionParsed = TestScheduler.parseMarblesAsSubscriptions(subscriptionMarbles, this.runMode);
    const subscriptionFrame = subscriptionParsed.subscribedFrame === Infinity ? 0 : subscriptionParsed.subscribedFrame;
    const unsubscriptionFrame = subscriptionParsed.unsubscribedFrame;
    let subscription: Subscription;

    this.schedule(() => {
      subscription = observable.subscribe({
        next: (x) => {
          // Support Observable-of-Observables
          const value = x instanceof Observable ? this.materializeInnerObservable(x, this.frame) : x;
          actual.push({ frame: this.frame, notification: nextNotification(value) });
        },
        error: (error) => {
          actual.push({ frame: this.frame, notification: errorNotification(error) });
        },
        complete: () => {
          actual.push({ frame: this.frame, notification: COMPLETE_NOTIFICATION });
        },
      });
    }, subscriptionFrame);

    if (unsubscriptionFrame !== Infinity) {
      this.schedule(() => subscription.unsubscribe(), unsubscriptionFrame);
    }

    this.flushTests.push(flushTest);
    const { runMode } = this;

    return {
      toBe(marbles: string, values?: any, errorValue?: any) {
        flushTest.ready = true;
        flushTest.expected = TestScheduler.parseMarbles(marbles, values, errorValue, true, runMode);
      },
      toEqual: (other: Observable<T>) => {
        flushTest.ready = true;
        flushTest.expected = [];
        this.schedule(() => {
          subscription = other.subscribe({
            next: (x) => {
              // Support Observable-of-Observables
              const value = x instanceof Observable ? this.materializeInnerObservable(x, this.frame) : x;
              flushTest.expected!.push({ frame: this.frame, notification: nextNotification(value) });
            },
            error: (error) => {
              flushTest.expected!.push({ frame: this.frame, notification: errorNotification(error) });
            },
            complete: () => {
              flushTest.expected!.push({ frame: this.frame, notification: COMPLETE_NOTIFICATION });
            },
          });
        }, subscriptionFrame);
      },
    };
  }

  expectSubscriptions(actualSubscriptionLogs: SubscriptionLog[]): { toBe: subscriptionLogsToBeFn } {
    const flushTest: FlushableTest = { actual: actualSubscriptionLogs, ready: false };
    this.flushTests.push(flushTest);
    const { runMode } = this;
    return {
      toBe(marblesOrMarblesArray: string | string[]) {
        const marblesArray: string[] = typeof marblesOrMarblesArray === 'string' ? [marblesOrMarblesArray] : marblesOrMarblesArray;
        flushTest.ready = true;
        flushTest.expected = marblesArray
          .map((marbles) => TestScheduler.parseMarblesAsSubscriptions(marbles, runMode))
          .filter((marbles) => marbles.subscribedFrame !== Infinity);
      },
    };
  }

  flush() {
    const hotObservables = this.hotObservables;
    while (hotObservables.length > 0) {
      hotObservables.shift()!.setup();
    }

    super.flush();

    this.flushTests = this.flushTests.filter((test) => {
      if (test.ready) {
        this.assertDeepEqual(test.actual, test.expected);
        return false;
      }
      return true;
    });
  }

  /** @nocollapse */
  static parseMarblesAsSubscriptions(marbles: string | null, runMode = false): SubscriptionLog {
    if (typeof marbles !== 'string') {
      return new SubscriptionLog(Infinity);
    }
    // Spreading the marbles into an array leverages ES2015's support for emoji
    // characters when iterating strings.
    const characters = [...marbles];
    const len = characters.length;
    let groupStart = -1;
    let subscriptionFrame = Infinity;
    let unsubscriptionFrame = Infinity;
    let frame = 0;

    for (let i = 0; i < len; i++) {
      let nextFrame = frame;
      const advanceFrameBy = (count: number) => {
        nextFrame += count * this.frameTimeFactor;
      };
      const c = characters[i];
      switch (c) {
        case ' ':
          // Whitespace no longer advances time
          if (!runMode) {
            advanceFrameBy(1);
          }
          break;
        case '-':
          advanceFrameBy(1);
          break;
        case '(':
          groupStart = frame;
          advanceFrameBy(1);
          break;
        case ')':
          groupStart = -1;
          advanceFrameBy(1);
          break;
        case '^':
          if (subscriptionFrame !== Infinity) {
            throw new Error("found a second subscription point '^' in a " + 'subscription marble diagram. There can only be one.');
          }
          subscriptionFrame = groupStart > -1 ? groupStart : frame;
          advanceFrameBy(1);
          break;
        case '!':
          if (unsubscriptionFrame !== Infinity) {
            throw new Error("found a second unsubscription point '!' in a " + 'subscription marble diagram. There can only be one.');
          }
          unsubscriptionFrame = groupStart > -1 ? groupStart : frame;
          break;
        default:
          // time progression syntax
          if (runMode && c.match(/^[0-9]$/)) {
            // Time progression must be preceded by at least one space
            // if it's not at the beginning of the diagram
            if (i === 0 || characters[i - 1] === ' ') {
              const buffer = characters.slice(i).join('');
              const match = buffer.match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);
              if (match) {
                i += match[0].length - 1;
                const duration = parseFloat(match[1]);
                const unit = match[2];
                let durationInMs: number;

                switch (unit) {
                  case 'ms':
                    durationInMs = duration;
                    break;
                  case 's':
                    durationInMs = duration * 1000;
                    break;
                  case 'm':
                    durationInMs = duration * 1000 * 60;
                    break;
                  default:
                    break;
                }

                advanceFrameBy(durationInMs! / this.frameTimeFactor);
                break;
              }
            }
          }

          throw new Error("there can only be '^' and '!' markers in a " + "subscription marble diagram. Found instead '" + c + "'.");
      }

      frame = nextFrame;
    }

    if (unsubscriptionFrame < 0) {
      return new SubscriptionLog(subscriptionFrame);
    } else {
      return new SubscriptionLog(subscriptionFrame, unsubscriptionFrame);
    }
  }

  /** @nocollapse */
  static parseMarbles(
    marbles: string,
    values?: any,
    errorValue?: any,
    materializeInnerObservables: boolean = false,
    runMode = false
  ): TestMessage[] {
    if (marbles.indexOf('!') !== -1) {
      throw new Error('conventional marble diagrams cannot have the ' + 'unsubscription marker "!"');
    }
    // Spreading the marbles into an array leverages ES2015's support for emoji
    // characters when iterating strings.
    const characters = [...marbles];
    const len = characters.length;
    const testMessages: TestMessage[] = [];
    const subIndex = runMode ? marbles.replace(/^[ ]+/, '').indexOf('^') : marbles.indexOf('^');
    let frame = subIndex === -1 ? 0 : subIndex * -this.frameTimeFactor;
    const getValue =
      typeof values !== 'object'
        ? (x: any) => x
        : (x: any) => {
            // Support Observable-of-Observables
            if (materializeInnerObservables && values[x] instanceof ColdObservable) {
              return values[x].messages;
            }
            return values[x];
          };
    let groupStart = -1;

    for (let i = 0; i < len; i++) {
      let nextFrame = frame;
      const advanceFrameBy = (count: number) => {
        nextFrame += count * this.frameTimeFactor;
      };

      let notification: ObservableNotification<any> | undefined;
      const c = characters[i];
      switch (c) {
        case ' ':
          // Whitespace no longer advances time
          if (!runMode) {
            advanceFrameBy(1);
          }
          break;
        case '-':
          advanceFrameBy(1);
          break;
        case '(':
          groupStart = frame;
          advanceFrameBy(1);
          break;
        case ')':
          groupStart = -1;
          advanceFrameBy(1);
          break;
        case '|':
          notification = COMPLETE_NOTIFICATION;
          advanceFrameBy(1);
          break;
        case '^':
          advanceFrameBy(1);
          break;
        case '#':
          notification = errorNotification(errorValue || 'error');
          advanceFrameBy(1);
          break;
        default:
          // Might be time progression syntax, or a value literal
          if (runMode && c.match(/^[0-9]$/)) {
            // Time progression must be preceded by at least one space
            // if it's not at the beginning of the diagram
            if (i === 0 || characters[i - 1] === ' ') {
              const buffer = characters.slice(i).join('');
              const match = buffer.match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);
              if (match) {
                i += match[0].length - 1;
                const duration = parseFloat(match[1]);
                const unit = match[2];
                let durationInMs: number;

                switch (unit) {
                  case 'ms':
                    durationInMs = duration;
                    break;
                  case 's':
                    durationInMs = duration * 1000;
                    break;
                  case 'm':
                    durationInMs = duration * 1000 * 60;
                    break;
                  default:
                    break;
                }

                advanceFrameBy(durationInMs! / this.frameTimeFactor);
                break;
              }
            }
          }

          notification = nextNotification(getValue(c));
          advanceFrameBy(1);
          break;
      }

      if (notification) {
        testMessages.push({ frame: groupStart > -1 ? groupStart : frame, notification });
      }

      frame = nextFrame;
    }
    return testMessages;
  }

  private createAnimator() {
    if (!this.runMode) {
      throw new Error('animate() must only be used in run mode');
    }

    // The TestScheduler assigns a delegate to the provider that's used for
    // requestAnimationFrame (rAF). The delegate works in conjunction with the
    // animate run helper to coordinate the invocation of any rAF callbacks,
    // that are effected within tests, with the animation frames specified by
    // the test's author - in the marbles that are passed to the animate run
    // helper. This allows the test's author to write deterministic tests and
    // gives the author full control over when - or if - animation frames are
    // 'painted'.

    let lastHandle = 0;
    let map: Map<number, FrameRequestCallback> | undefined;

    const delegate = {
      requestAnimationFrame(callback: FrameRequestCallback) {
        if (!map) {
          throw new Error('animate() was not called within run()');
        }
        const handle = ++lastHandle;
        map.set(handle, callback);
        return handle;
      },
      cancelAnimationFrame(handle: number) {
        if (!map) {
          throw new Error('animate() was not called within run()');
        }
        map.delete(handle);
      },
    };

    const animate = (marbles: string) => {
      if (map) {
        throw new Error('animate() must not be called more than once within run()');
      }
      if (/[|#]/.test(marbles)) {
        throw new Error('animate() must not complete or error');
      }
      map = new Map<number, FrameRequestCallback>();
      const messages = TestScheduler.parseMarbles(marbles, undefined, undefined, undefined, true);
      for (const message of messages) {
        this.schedule(() => {
          const now = this.now();
          // Capture the callbacks within the queue and clear the queue
          // before enumerating the callbacks, as callbacks might
          // reschedule themselves. (And, yeah, we're using a Map to represent
          // the queue, but the values are guaranteed to be returned in
          // insertion order, so it's all good. Trust me, I've read the docs.)
          const callbacks = Array.from(map!.values());
          map!.clear();
          for (const callback of callbacks) {
            callback(now);
          }
        }, message.frame);
      }
    };

    return { animate, delegate };
  }

  private createDelegates() {
    // When in run mode, the TestScheduler provides alternate implementations
    // of set/clearImmediate and set/clearInterval. These implementations are
    // consumed by the scheduler implementations via the providers. This is
    // done to effect deterministic asap and async scheduler behavior so that
    // all of the schedulers are testable in 'run mode'. Prior to v7,
    // delegation occurred at the scheduler level. That is, the asap and
    // animation frame schedulers were identical in behavior to the async
    // scheduler. Now, when in run mode, asap actions are prioritized over
    // async actions and animation frame actions are coordinated using the
    // animate run helper.

    let lastHandle = 0;
    const scheduleLookup = new Map<
      TimerHandle,
      {
        due: number;
        duration: number;
        handle: TimerHandle;
        handler: () => void;
        subscription: Subscription;
        type: 'immediate' | 'interval' | 'timeout';
      }
    >();

    const run = () => {
      // Whenever a scheduled run is executed, it must run a single immediate
      // or interval action - with immediate actions being prioritized over
      // interval and timeout actions.
      const now = this.now();
      const scheduledRecords = Array.from(scheduleLookup.values());
      const scheduledRecordsDue = scheduledRecords.filter(({ due }) => due <= now);
      const dueImmediates = scheduledRecordsDue.filter(({ type }) => type === 'immediate');
      if (dueImmediates.length > 0) {
        const { handle, handler } = dueImmediates[0];
        scheduleLookup.delete(handle);
        handler();
        return;
      }
      const dueIntervals = scheduledRecordsDue.filter(({ type }) => type === 'interval');
      if (dueIntervals.length > 0) {
        const firstDueInterval = dueIntervals[0];
        const { duration, handler } = firstDueInterval;
        firstDueInterval.due = now + duration;
        // The interval delegate must behave like setInterval, so run needs to
        // be rescheduled. This will continue until the clearInterval delegate
        // unsubscribes and deletes the handle from the map.
        firstDueInterval.subscription = this.schedule(run, duration);
        handler();
        return;
      }
      const dueTimeouts = scheduledRecordsDue.filter(({ type }) => type === 'timeout');
      if (dueTimeouts.length > 0) {
        const { handle, handler } = dueTimeouts[0];
        scheduleLookup.delete(handle);
        handler();
        return;
      }
      throw new Error('Expected a due immediate or interval');
    };

    // The following objects are the delegates that replace conventional
    // runtime implementations with TestScheduler implementations.
    //
    // The immediate delegate is depended upon by the asapScheduler.
    //
    // The interval delegate is depended upon by the asyncScheduler.
    //
    // The timeout delegate is not depended upon by any scheduler, but it's
    // included here because the onUnhandledError and onStoppedNotification
    // configuration points use setTimeout to avoid producer interference. It's
    // inclusion allows for the testing of these configuration points.

    const immediate = {
      setImmediate: (handler: () => void) => {
        const handle = ++lastHandle;
        scheduleLookup.set(handle, {
          due: this.now(),
          duration: 0,
          handle,
          handler,
          subscription: this.schedule(run, 0),
          type: 'immediate',
        });
        return handle;
      },
      clearImmediate: (handle: TimerHandle) => {
        const value = scheduleLookup.get(handle);
        if (value) {
          value.subscription.unsubscribe();
          scheduleLookup.delete(handle);
        }
      },
    };

    const interval = {
      setInterval: (handler: () => void, duration = 0) => {
        const handle = ++lastHandle;
        scheduleLookup.set(handle, {
          due: this.now() + duration,
          duration,
          handle,
          handler,
          subscription: this.schedule(run, duration),
          type: 'interval',
        });
        return handle;
      },
      clearInterval: (handle: TimerHandle) => {
        const value = scheduleLookup.get(handle);
        if (value) {
          value.subscription.unsubscribe();
          scheduleLookup.delete(handle);
        }
      },
    };

    const timeout = {
      setTimeout: (handler: () => void, duration = 0) => {
        const handle = ++lastHandle;
        scheduleLookup.set(handle, {
          due: this.now() + duration,
          duration,
          handle,
          handler,
          subscription: this.schedule(run, duration),
          type: 'timeout',
        });
        return handle;
      },
      clearTimeout: (handle: TimerHandle) => {
        const value = scheduleLookup.get(handle);
        if (value) {
          value.subscription.unsubscribe();
          scheduleLookup.delete(handle);
        }
      },
    };

    return { immediate, interval, timeout };
  }

  /**
   * The `run` method performs the test in 'run mode' - in which schedulers
   * used within the test automatically delegate to the `TestScheduler`. That
   * is, in 'run mode' there is no need to explicitly pass a `TestScheduler`
   * instance to observable creators or operators.
   *
   * @see {@link /guide/testing/marble-testing}
   */
  run<T>(callback: (helpers: RunHelpers) => T): T {
    const prevFrameTimeFactor = TestScheduler.frameTimeFactor;
    const prevMaxFrames = this.maxFrames;

    TestScheduler.frameTimeFactor = 1;
    this.maxFrames = Infinity;
    this.runMode = true;

    const animator = this.createAnimator();
    const delegates = this.createDelegates();

    animationFrameProvider.delegate = animator.delegate;
    dateTimestampProvider.delegate = this;
    immediateProvider.delegate = delegates.immediate;
    intervalProvider.delegate = delegates.interval;
    timeoutProvider.delegate = delegates.timeout;
    performanceTimestampProvider.delegate = this;

    const helpers: RunHelpers = {
      cold: this.createColdObservable.bind(this),
      hot: this.createHotObservable.bind(this),
      flush: this.flush.bind(this),
      time: this.createTime.bind(this),
      expectObservable: this.expectObservable.bind(this),
      expectSubscriptions: this.expectSubscriptions.bind(this),
      animate: animator.animate,
    };
    try {
      const ret = callback(helpers);
      this.flush();
      return ret;
    } finally {
      TestScheduler.frameTimeFactor = prevFrameTimeFactor;
      this.maxFrames = prevMaxFrames;
      this.runMode = false;
      animationFrameProvider.delegate = undefined;
      dateTimestampProvider.delegate = undefined;
      immediateProvider.delegate = undefined;
      intervalProvider.delegate = undefined;
      timeoutProvider.delegate = undefined;
      performanceTimestampProvider.delegate = undefined;
    }
  }
}
export function getSymbolIterator(): symbol {
  if (typeof Symbol !== 'function' || !Symbol.iterator) {
    return '@@iterator' as any;
  }

  return Symbol.iterator;
}

export const iterator = getSymbolIterator();
/** Symbol.observable or a string "@@observable". Used for interop */
export const observable: string | symbol = (() => (typeof Symbol === 'function' && Symbol.observable) || '@@observable')();
import { Scheduler } from '../Scheduler';
import { Subscription } from '../Subscription';
import { SchedulerAction } from '../types';

/**
 * A unit of work to be executed in a `scheduler`. An action is typically
 * created from within a {@link SchedulerLike} and an RxJS user does not need to concern
 * themselves about creating and manipulating an Action.
 *
 * ```ts
 * class Action<T> extends Subscription {
 *   new (scheduler: Scheduler, work: (state?: T) => void);
 *   schedule(state?: T, delay: number = 0): Subscription;
 * }
 * ```
 *
 * @class Action<T>
 */
export class Action<T> extends Subscription {
  constructor(scheduler: Scheduler, work: (this: SchedulerAction<T>, state?: T) => void) {
    super();
  }
  /**
   * Schedules this action on its parent {@link SchedulerLike} for execution. May be passed
   * some context object, `state`. May happen at some point in the future,
   * according to the `delay` parameter, if specified.
   * @param {T} [state] Some contextual data that the `work` function uses when
   * called by the Scheduler.
   * @param {number} [delay] Time to wait before executing the work, where the
   * time unit is implicit and defined by the Scheduler.
   * @return {void}
   */
  public schedule(state?: T, delay: number = 0): Subscription {
    return this;
  }
}
import { AsyncAction } from './AsyncAction';
import { AnimationFrameScheduler } from './AnimationFrameScheduler';
import { SchedulerAction } from '../types';
import { animationFrameProvider } from './animationFrameProvider';

export class AnimationFrameAction<T> extends AsyncAction<T> {
  constructor(protected scheduler: AnimationFrameScheduler, protected work: (this: SchedulerAction<T>, state?: T) => void) {
    super(scheduler, work);
  }

  protected requestAsyncId(scheduler: AnimationFrameScheduler, id?: any, delay: number = 0): any {
    // If delay is greater than 0, request as an async action.
    if (delay !== null && delay > 0) {
      return super.requestAsyncId(scheduler, id, delay);
    }
    // Push the action to the end of the scheduler queue.
    scheduler.actions.push(this);
    // If an animation frame has already been requested, don't request another
    // one. If an animation frame hasn't been requested yet, request one. Return
    // the current animation frame request id.
    return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(() => scheduler.flush(undefined)));
  }
  protected recycleAsyncId(scheduler: AnimationFrameScheduler, id?: any, delay: number = 0): any {
    // If delay exists and is greater than 0, or if the delay is null (the
    // action wasn't rescheduled) but was originally scheduled as an async
    // action, then recycle as an async action.
    if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {
      return super.recycleAsyncId(scheduler, id, delay);
    }
    // If the scheduler queue has no remaining actions with the same async id,
    // cancel the requested animation frame and set the scheduled flag to
    // undefined so the next AnimationFrameAction will request its own.
    if (!scheduler.actions.some((action) => action.id === id)) {
      animationFrameProvider.cancelAnimationFrame(id);
      scheduler._scheduled = undefined;
    }
    // Return undefined so the action knows to request a new async id if it's rescheduled.
    return undefined;
  }
}
import { AsyncAction } from './AsyncAction';
import { AsyncScheduler } from './AsyncScheduler';

export class AnimationFrameScheduler extends AsyncScheduler {
  public flush(action?: AsyncAction<any>): void {
    this._active = true;
    // The async id that effects a call to flush is stored in _scheduled.
    // Before executing an action, it's necessary to check the action's async
    // id to determine whether it's supposed to be executed in the current
    // flush.
    // Previous implementations of this method used a count to determine this,
    // but that was unsound, as actions that are unsubscribed - i.e. cancelled -
    // are removed from the actions array and that can shift actions that are
    // scheduled to be executed in a subsequent flush into positions at which
    // they are executed within the current flush.
    const flushId = this._scheduled;
    this._scheduled = undefined;

    const { actions } = this;
    let error: any;
    action = action || actions.shift()!;

    do {
      if ((error = action.execute(action.state, action.delay))) {
        break;
      }
    } while ((action = actions[0]) && action.id === flushId && actions.shift());

    this._active = false;

    if (error) {
      while ((action = actions[0]) && action.id === flushId && actions.shift()) {
        action.unsubscribe();
      }
      throw error;
    }
  }
}
import { AsyncAction } from './AsyncAction';
import { AsapScheduler } from './AsapScheduler';
import { SchedulerAction } from '../types';
import { immediateProvider } from './immediateProvider';

export class AsapAction<T> extends AsyncAction<T> {
  constructor(protected scheduler: AsapScheduler, protected work: (this: SchedulerAction<T>, state?: T) => void) {
    super(scheduler, work);
  }

  protected requestAsyncId(scheduler: AsapScheduler, id?: any, delay: number = 0): any {
    // If delay is greater than 0, request as an async action.
    if (delay !== null && delay > 0) {
      return super.requestAsyncId(scheduler, id, delay);
    }
    // Push the action to the end of the scheduler queue.
    scheduler.actions.push(this);
    // If a microtask has already been scheduled, don't schedule another
    // one. If a microtask hasn't been scheduled yet, schedule one now. Return
    // the current scheduled microtask id.
    return scheduler._scheduled || (scheduler._scheduled = immediateProvider.setImmediate(scheduler.flush.bind(scheduler, undefined)));
  }
  protected recycleAsyncId(scheduler: AsapScheduler, id?: any, delay: number = 0): any {
    // If delay exists and is greater than 0, or if the delay is null (the
    // action wasn't rescheduled) but was originally scheduled as an async
    // action, then recycle as an async action.
    if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {
      return super.recycleAsyncId(scheduler, id, delay);
    }
    // If the scheduler queue has no remaining actions with the same async id,
    // cancel the requested microtask and set the scheduled flag to undefined
    // so the next AsapAction will request its own.
    if (!scheduler.actions.some((action) => action.id === id)) {
      immediateProvider.clearImmediate(id);
      scheduler._scheduled = undefined;
    }
    // Return undefined so the action knows to request a new async id if it's rescheduled.
    return undefined;
  }
}
import { AsyncAction } from './AsyncAction';
import { AsyncScheduler } from './AsyncScheduler';

export class AsapScheduler extends AsyncScheduler {
  public flush(action?: AsyncAction<any>): void {
    this._active = true;
    // The async id that effects a call to flush is stored in _scheduled.
    // Before executing an action, it's necessary to check the action's async
    // id to determine whether it's supposed to be executed in the current
    // flush.
    // Previous implementations of this method used a count to determine this,
    // but that was unsound, as actions that are unsubscribed - i.e. cancelled -
    // are removed from the actions array and that can shift actions that are
    // scheduled to be executed in a subsequent flush into positions at which
    // they are executed within the current flush.
    const flushId = this._scheduled;
    this._scheduled = undefined;

    const { actions } = this;
    let error: any;
    action = action || actions.shift()!;

    do {
      if ((error = action.execute(action.state, action.delay))) {
        break;
      }
    } while ((action = actions[0]) && action.id === flushId && actions.shift());

    this._active = false;

    if (error) {
      while ((action = actions[0]) && action.id === flushId && actions.shift()) {
        action.unsubscribe();
      }
      throw error;
    }
  }
}
import { Action } from './Action';
import { SchedulerAction } from '../types';
import { Subscription } from '../Subscription';
import { AsyncScheduler } from './AsyncScheduler';
import { intervalProvider } from './intervalProvider';
import { arrRemove } from '../util/arrRemove';

export class AsyncAction<T> extends Action<T> {
  public id: any;
  public state?: T;
  // @ts-ignore: Property has no initializer and is not definitely assigned
  public delay: number;
  protected pending: boolean = false;

  constructor(protected scheduler: AsyncScheduler, protected work: (this: SchedulerAction<T>, state?: T) => void) {
    super(scheduler, work);
  }

  public schedule(state?: T, delay: number = 0): Subscription {
    if (this.closed) {
      return this;
    }

    // Always replace the current state with the new state.
    this.state = state;

    const id = this.id;
    const scheduler = this.scheduler;

    //
    // Important implementation note:
    //
    // Actions only execute once by default, unless rescheduled from within the
    // scheduled callback. This allows us to implement single and repeat
    // actions via the same code path, without adding API surface area, as well
    // as mimic traditional recursion but across asynchronous boundaries.
    //
    // However, JS runtimes and timers distinguish between intervals achieved by
    // serial `setTimeout` calls vs. a single `setInterval` call. An interval of
    // serial `setTimeout` calls can be individually delayed, which delays
    // scheduling the next `setTimeout`, and so on. `setInterval` attempts to
    // guarantee the interval callback will be invoked more precisely to the
    // interval period, regardless of load.
    //
    // Therefore, we use `setInterval` to schedule single and repeat actions.
    // If the action reschedules itself with the same delay, the interval is not
    // canceled. If the action doesn't reschedule, or reschedules with a
    // different delay, the interval will be canceled after scheduled callback
    // execution.
    //
    if (id != null) {
      this.id = this.recycleAsyncId(scheduler, id, delay);
    }

    // Set the pending flag indicating that this action has been scheduled, or
    // has recursively rescheduled itself.
    this.pending = true;

    this.delay = delay;
    // If this action has already an async Id, don't request a new one.
    this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);

    return this;
  }

  protected requestAsyncId(scheduler: AsyncScheduler, _id?: any, delay: number = 0): any {
    return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);
  }

  protected recycleAsyncId(_scheduler: AsyncScheduler, id: any, delay: number | null = 0): any {
    // If this action is rescheduled with the same delay time, don't clear the interval id.
    if (delay != null && this.delay === delay && this.pending === false) {
      return id;
    }
    // Otherwise, if the action's delay time is different from the current delay,
    // or the action has been rescheduled before it's executed, clear the interval id
    intervalProvider.clearInterval(id);
    return undefined;
  }

  /**
   * Immediately executes this action and the `work` it contains.
   * @return {any}
   */
  public execute(state: T, delay: number): any {
    if (this.closed) {
      return new Error('executing a cancelled action');
    }

    this.pending = false;
    const error = this._execute(state, delay);
    if (error) {
      return error;
    } else if (this.pending === false && this.id != null) {
      // Dequeue if the action didn't reschedule itself. Don't call
      // unsubscribe(), because the action could reschedule later.
      // For example:
      // ```
      // scheduler.schedule(function doWork(counter) {
      //   /* ... I'm a busy worker bee ... */
      //   var originalAction = this;
      //   /* wait 100ms before rescheduling the action */
      //   setTimeout(function () {
      //     originalAction.schedule(counter + 1);
      //   }, 100);
      // }, 1000);
      // ```
      this.id = this.recycleAsyncId(this.scheduler, this.id, null);
    }
  }

  protected _execute(state: T, _delay: number): any {
    let errored: boolean = false;
    let errorValue: any;
    try {
      this.work(state);
    } catch (e) {
      errored = true;
      // HACK: Since code elsewhere is relying on the "truthiness" of the
      // return here, we can't have it return "" or 0 or false.
      // TODO: Clean this up when we refactor schedulers mid-version-8 or so.
      errorValue = e ? e : new Error('Scheduled action threw falsy error');
    }
    if (errored) {
      this.unsubscribe();
      return errorValue;
    }
  }

  unsubscribe() {
    if (!this.closed) {
      const { id, scheduler } = this;
      const { actions } = scheduler;

      this.work = this.state = this.scheduler = null!;
      this.pending = false;

      arrRemove(actions, this);
      if (id != null) {
        this.id = this.recycleAsyncId(scheduler, id, null);
      }

      this.delay = null!;
      super.unsubscribe();
    }
  }
}
import { Scheduler } from '../Scheduler';
import { Action } from './Action';
import { AsyncAction } from './AsyncAction';

export class AsyncScheduler extends Scheduler {
  public actions: Array<AsyncAction<any>> = [];
  /**
   * A flag to indicate whether the Scheduler is currently executing a batch of
   * queued actions.
   * @type {boolean}
   * @internal
   */
  public _active: boolean = false;
  /**
   * An internal ID used to track the latest asynchronous task such as those
   * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and
   * others.
   * @type {any}
   * @internal
   */
  public _scheduled: any = undefined;

  constructor(SchedulerAction: typeof Action, now: () => number = Scheduler.now) {
    super(SchedulerAction, now);
  }

  public flush(action: AsyncAction<any>): void {
    const { actions } = this;

    if (this._active) {
      actions.push(action);
      return;
    }

    let error: any;
    this._active = true;

    do {
      if ((error = action.execute(action.state, action.delay))) {
        break;
      }
    } while ((action = actions.shift()!)); // exhaust the scheduler queue

    this._active = false;

    if (error) {
      while ((action = actions.shift()!)) {
        action.unsubscribe();
      }
      throw error;
    }
  }
}
import { AsyncAction } from './AsyncAction';
import { Subscription } from '../Subscription';
import { QueueScheduler } from './QueueScheduler';
import { SchedulerAction } from '../types';

export class QueueAction<T> extends AsyncAction<T> {

  constructor(protected scheduler: QueueScheduler,
              protected work: (this: SchedulerAction<T>, state?: T) => void) {
    super(scheduler, work);
  }

  public schedule(state?: T, delay: number = 0): Subscription {
    if (delay > 0) {
      return super.schedule(state, delay);
    }
    this.delay = delay;
    this.state = state;
    this.scheduler.flush(this);
    return this;
  }

  public execute(state: T, delay: number): any {
    return (delay > 0 || this.closed) ?
      super.execute(state, delay) :
      this._execute(state, delay) ;
  }

  protected requestAsyncId(scheduler: QueueScheduler, id?: any, delay: number = 0): any {
    // If delay exists and is greater than 0, or if the delay is null (the
    // action wasn't rescheduled) but was originally scheduled as an async
    // action, then recycle as an async action.

    if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {
      return super.requestAsyncId(scheduler, id, delay);
    }
    // Otherwise flush the scheduler starting with this action.
    return scheduler.flush(this);
  }
}
import { AsyncScheduler } from './AsyncScheduler';

export class QueueScheduler extends AsyncScheduler {
}
import { AsyncAction } from './AsyncAction';
import { Subscription } from '../Subscription';
import { AsyncScheduler } from './AsyncScheduler';
import { SchedulerAction } from '../types';

export class VirtualTimeScheduler extends AsyncScheduler {
  /** @deprecated Not used in VirtualTimeScheduler directly. Will be removed in v8. */
  static frameTimeFactor = 10;

  /**
   * The current frame for the state of the virtual scheduler instance. The the difference
   * between two "frames" is synonymous with the passage of "virtual time units". So if
   * you record `scheduler.frame` to be `1`, then later, observe `scheduler.frame` to be at `11`,
   * that means `10` virtual time units have passed.
   */
  public frame: number = 0;

  /**
   * Used internally to examine the current virtual action index being processed.
   * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.
   */
  public index: number = -1;

  /**
   * This creates an instance of a `VirtualTimeScheduler`. Experts only. The signature of
   * this constructor is likely to change in the long run.
   *
   * @param schedulerActionCtor The type of Action to initialize when initializing actions during scheduling.
   * @param maxFrames The maximum number of frames to process before stopping. Used to prevent endless flush cycles.
   */
  constructor(schedulerActionCtor: typeof AsyncAction = VirtualAction as any, public maxFrames: number = Infinity) {
    super(schedulerActionCtor, () => this.frame);
  }

  /**
   * Prompt the Scheduler to execute all of its queued actions, therefore
   * clearing its queue.
   * @return {void}
   */
  public flush(): void {
    const { actions, maxFrames } = this;
    let error: any;
    let action: AsyncAction<any> | undefined;

    while ((action = actions[0]) && action.delay <= maxFrames) {
      actions.shift();
      this.frame = action.delay;

      if ((error = action.execute(action.state, action.delay))) {
        break;
      }
    }

    if (error) {
      while ((action = actions.shift())) {
        action.unsubscribe();
      }
      throw error;
    }
  }
}

export class VirtualAction<T> extends AsyncAction<T> {
  protected active: boolean = true;

  constructor(
    protected scheduler: VirtualTimeScheduler,
    protected work: (this: SchedulerAction<T>, state?: T) => void,
    protected index: number = (scheduler.index += 1)
  ) {
    super(scheduler, work);
    this.index = scheduler.index = index;
  }

  public schedule(state?: T, delay: number = 0): Subscription {
    if (Number.isFinite(delay)) {
      if (!this.id) {
        return super.schedule(state, delay);
      }
      this.active = false;
      // If an action is rescheduled, we save allocations by mutating its state,
      // pushing it to the end of the scheduler queue, and recycling the action.
      // But since the VirtualTimeScheduler is used for testing, VirtualActions
      // must be immutable so they can be inspected later.
      const action = new VirtualAction(this.scheduler, this.work);
      this.add(action);
      return action.schedule(state, delay);
    } else {
      // If someone schedules something with Infinity, it'll never happen. So we
      // don't even schedule it.
      return Subscription.EMPTY;
    }
  }

  protected requestAsyncId(scheduler: VirtualTimeScheduler, id?: any, delay: number = 0): any {
    this.delay = scheduler.frame + delay;
    const { actions } = scheduler;
    actions.push(this);
    (actions as Array<VirtualAction<T>>).sort(VirtualAction.sortActions);
    return true;
  }

  protected recycleAsyncId(scheduler: VirtualTimeScheduler, id?: any, delay: number = 0): any {
    return undefined;
  }

  protected _execute(state: T, delay: number): any {
    if (this.active === true) {
      return super._execute(state, delay);
    }
  }

  private static sortActions<T>(a: VirtualAction<T>, b: VirtualAction<T>) {
    if (a.delay === b.delay) {
      if (a.index === b.index) {
        return 0;
      } else if (a.index > b.index) {
        return 1;
      } else {
        return -1;
      }
    } else if (a.delay > b.delay) {
      return 1;
    } else {
      return -1;
    }
  }
}
import { AnimationFrameAction } from './AnimationFrameAction';
import { AnimationFrameScheduler } from './AnimationFrameScheduler';

/**
 *
 * Animation Frame Scheduler
 *
 * <span class="informal">Perform task when `window.requestAnimationFrame` would fire</span>
 *
 * When `animationFrame` scheduler is used with delay, it will fall back to {@link asyncScheduler} scheduler
 * behaviour.
 *
 * Without delay, `animationFrame` scheduler can be used to create smooth browser animations.
 * It makes sure scheduled task will happen just before next browser content repaint,
 * thus performing animations as efficiently as possible.
 *
 * ## Example
 * Schedule div height animation
 * ```ts
 * // html: <div style="background: #0ff;"></div>
 * import { animationFrameScheduler } from 'rxjs';
 *
 * const div = document.querySelector('div');
 *
 * animationFrameScheduler.schedule(function(height) {
 *   div.style.height = height + "px";
 *
 *   this.schedule(height + 1);  // `this` references currently executing Action,
 *                               // which we reschedule with new state
 * }, 0, 0);
 *
 * // You will see a div element growing in height
 * ```
 */

export const animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);

/**
 * @deprecated Renamed to {@link animationFrameScheduler}. Will be removed in v8.
 */
export const animationFrame = animationFrameScheduler;
import { Subscription } from '../Subscription';

interface AnimationFrameProvider {
  schedule(callback: FrameRequestCallback): Subscription;
  requestAnimationFrame: typeof requestAnimationFrame;
  cancelAnimationFrame: typeof cancelAnimationFrame;
  delegate:
    | {
        requestAnimationFrame: typeof requestAnimationFrame;
        cancelAnimationFrame: typeof cancelAnimationFrame;
      }
    | undefined;
}

export const animationFrameProvider: AnimationFrameProvider = {
  // When accessing the delegate, use the variable rather than `this` so that
  // the functions can be called without being bound to the provider.
  schedule(callback) {
    let request = requestAnimationFrame;
    let cancel: typeof cancelAnimationFrame | undefined = cancelAnimationFrame;
    const { delegate } = animationFrameProvider;
    if (delegate) {
      request = delegate.requestAnimationFrame;
      cancel = delegate.cancelAnimationFrame;
    }
    const handle = request((timestamp) => {
      // Clear the cancel function. The request has been fulfilled, so
      // attempting to cancel the request upon unsubscription would be
      // pointless.
      cancel = undefined;
      callback(timestamp);
    });
    return new Subscription(() => cancel?.(handle));
  },
  requestAnimationFrame(...args) {
    const { delegate } = animationFrameProvider;
    return (delegate?.requestAnimationFrame || requestAnimationFrame)(...args);
  },
  cancelAnimationFrame(...args) {
    const { delegate } = animationFrameProvider;
    return (delegate?.cancelAnimationFrame || cancelAnimationFrame)(...args);
  },
  delegate: undefined,
};
import { AsapAction } from './AsapAction';
import { AsapScheduler } from './AsapScheduler';

/**
 *
 * Asap Scheduler
 *
 * <span class="informal">Perform task as fast as it can be performed asynchronously</span>
 *
 * `asap` scheduler behaves the same as {@link asyncScheduler} scheduler when you use it to delay task
 * in time. If however you set delay to `0`, `asap` will wait for current synchronously executing
 * code to end and then it will try to execute given task as fast as possible.
 *
 * `asap` scheduler will do its best to minimize time between end of currently executing code
 * and start of scheduled task. This makes it best candidate for performing so called "deferring".
 * Traditionally this was achieved by calling `setTimeout(deferredTask, 0)`, but that technique involves
 * some (although minimal) unwanted delay.
 *
 * Note that using `asap` scheduler does not necessarily mean that your task will be first to process
 * after currently executing code. In particular, if some task was also scheduled with `asap` before,
 * that task will execute first. That being said, if you need to schedule task asynchronously, but
 * as soon as possible, `asap` scheduler is your best bet.
 *
 * ## Example
 * Compare async and asap scheduler<
 * ```ts
 * import { asapScheduler, asyncScheduler } from 'rxjs';
 *
 * asyncScheduler.schedule(() => console.log('async')); // scheduling 'async' first...
 * asapScheduler.schedule(() => console.log('asap'));
 *
 * // Logs:
 * // "asap"
 * // "async"
 * // ... but 'asap' goes first!
 * ```
 */

export const asapScheduler = new AsapScheduler(AsapAction);

/**
 * @deprecated Renamed to {@link asapScheduler}. Will be removed in v8.
 */
export const asap = asapScheduler;
import { AsyncAction } from './AsyncAction';
import { AsyncScheduler } from './AsyncScheduler';

/**
 *
 * Async Scheduler
 *
 * <span class="informal">Schedule task as if you used setTimeout(task, duration)</span>
 *
 * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript
 * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating
 * in intervals.
 *
 * If you just want to "defer" task, that is to perform it right after currently
 * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),
 * better choice will be the {@link asapScheduler} scheduler.
 *
 * ## Examples
 * Use async scheduler to delay task
 * ```ts
 * import { asyncScheduler } from 'rxjs';
 *
 * const task = () => console.log('it works!');
 *
 * asyncScheduler.schedule(task, 2000);
 *
 * // After 2 seconds logs:
 * // "it works!"
 * ```
 *
 * Use async scheduler to repeat task in intervals
 * ```ts
 * import { asyncScheduler } from 'rxjs';
 *
 * function task(state) {
 *   console.log(state);
 *   this.schedule(state + 1, 1000); // `this` references currently executing Action,
 *                                   // which we reschedule with new state and delay
 * }
 *
 * asyncScheduler.schedule(task, 3000, 0);
 *
 * // Logs:
 * // 0 after 3s
 * // 1 after 4s
 * // 2 after 5s
 * // 3 after 6s
 * ```
 */

export const asyncScheduler = new AsyncScheduler(AsyncAction);

/**
 * @deprecated Renamed to {@link asyncScheduler}. Will be removed in v8.
 */
export const async = asyncScheduler;
import { TimestampProvider } from '../types';

interface DateTimestampProvider extends TimestampProvider {
  delegate: TimestampProvider | undefined;
}

export const dateTimestampProvider: DateTimestampProvider = {
  now() {
    // Use the variable rather than `this` so that the function can be called
    // without being bound to the provider.
    return (dateTimestampProvider.delegate || Date).now();
  },
  delegate: undefined,
};
import { Immediate } from '../util/Immediate';
import type { TimerHandle } from './timerHandle';
const { setImmediate, clearImmediate } = Immediate;

type SetImmediateFunction = (handler: () => void, ...args: any[]) => TimerHandle;
type ClearImmediateFunction = (handle: TimerHandle) => void;

interface ImmediateProvider {
  setImmediate: SetImmediateFunction;
  clearImmediate: ClearImmediateFunction;
  delegate:
    | {
        setImmediate: SetImmediateFunction;
        clearImmediate: ClearImmediateFunction;
      }
    | undefined;
}

export const immediateProvider: ImmediateProvider = {
  // When accessing the delegate, use the variable rather than `this` so that
  // the functions can be called without being bound to the provider.
  setImmediate(...args) {
    const { delegate } = immediateProvider;
    return (delegate?.setImmediate || setImmediate)(...args);
  },
  clearImmediate(handle) {
    const { delegate } = immediateProvider;
    return (delegate?.clearImmediate || clearImmediate)(handle as any);
  },
  delegate: undefined,
};
import type { TimerHandle } from './timerHandle';
type SetIntervalFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;
type ClearIntervalFunction = (handle: TimerHandle) => void;

interface IntervalProvider {
  setInterval: SetIntervalFunction;
  clearInterval: ClearIntervalFunction;
  delegate:
    | {
        setInterval: SetIntervalFunction;
        clearInterval: ClearIntervalFunction;
      }
    | undefined;
}

export const intervalProvider: IntervalProvider = {
  // When accessing the delegate, use the variable rather than `this` so that
  // the functions can be called without being bound to the provider.
  setInterval(handler: () => void, timeout?: number, ...args) {
    const { delegate } = intervalProvider;
    if (delegate?.setInterval) {
      return delegate.setInterval(handler, timeout, ...args);
    }
    return setInterval(handler, timeout, ...args);
  },
  clearInterval(handle) {
    const { delegate } = intervalProvider;
    return (delegate?.clearInterval || clearInterval)(handle as any);
  },
  delegate: undefined,
};
import { TimestampProvider } from '../types';

interface PerformanceTimestampProvider extends TimestampProvider {
  delegate: TimestampProvider | undefined;
}

export const performanceTimestampProvider: PerformanceTimestampProvider = {
  now() {
    // Use the variable rather than `this` so that the function can be called
    // without being bound to the provider.
    return (performanceTimestampProvider.delegate || performance).now();
  },
  delegate: undefined,
};
import { QueueAction } from './QueueAction';
import { QueueScheduler } from './QueueScheduler';

/**
 *
 * Queue Scheduler
 *
 * <span class="informal">Put every next task on a queue, instead of executing it immediately</span>
 *
 * `queue` scheduler, when used with delay, behaves the same as {@link asyncScheduler} scheduler.
 *
 * When used without delay, it schedules given task synchronously - executes it right when
 * it is scheduled. However when called recursively, that is when inside the scheduled task,
 * another task is scheduled with queue scheduler, instead of executing immediately as well,
 * that task will be put on a queue and wait for current one to finish.
 *
 * This means that when you execute task with `queue` scheduler, you are sure it will end
 * before any other task scheduled with that scheduler will start.
 *
 * ## Examples
 * Schedule recursively first, then do something
 * ```ts
 * import { queueScheduler } from 'rxjs';
 *
 * queueScheduler.schedule(() => {
 *   queueScheduler.schedule(() => console.log('second')); // will not happen now, but will be put on a queue
 *
 *   console.log('first');
 * });
 *
 * // Logs:
 * // "first"
 * // "second"
 * ```
 *
 * Reschedule itself recursively
 * ```ts
 * import { queueScheduler } from 'rxjs';
 *
 * queueScheduler.schedule(function(state) {
 *   if (state !== 0) {
 *     console.log('before', state);
 *     this.schedule(state - 1); // `this` references currently executing Action,
 *                               // which we reschedule with new state
 *     console.log('after', state);
 *   }
 * }, 0, 3);
 *
 * // In scheduler that runs recursively, you would expect:
 * // "before", 3
 * // "before", 2
 * // "before", 1
 * // "after", 1
 * // "after", 2
 * // "after", 3
 *
 * // But with queue it logs:
 * // "before", 3
 * // "after", 3
 * // "before", 2
 * // "after", 2
 * // "before", 1
 * // "after", 1
 * ```
 */

export const queueScheduler = new QueueScheduler(QueueAction);

/**
 * @deprecated Renamed to {@link queueScheduler}. Will be removed in v8.
 */
export const queue = queueScheduler;
import type { TimerHandle } from './timerHandle';
type SetTimeoutFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;
type ClearTimeoutFunction = (handle: TimerHandle) => void;

interface TimeoutProvider {
  setTimeout: SetTimeoutFunction;
  clearTimeout: ClearTimeoutFunction;
  delegate:
    | {
        setTimeout: SetTimeoutFunction;
        clearTimeout: ClearTimeoutFunction;
      }
    | undefined;
}

export const timeoutProvider: TimeoutProvider = {
  // When accessing the delegate, use the variable rather than `this` so that
  // the functions can be called without being bound to the provider.
  setTimeout(handler: () => void, timeout?: number, ...args) {
    const { delegate } = timeoutProvider;
    if (delegate?.setTimeout) {
      return delegate.setTimeout(handler, timeout, ...args);
    }
    return setTimeout(handler, timeout, ...args);
  },
  clearTimeout(handle) {
    const { delegate } = timeoutProvider;
    return (delegate?.clearTimeout || clearTimeout)(handle as any);
  },
  delegate: undefined,
};
export type TimerHandle = number | NodeJS.Timeout;
import { Observable } from '../Observable';
import { SchedulerLike } from '../types';

export function scheduleArray<T>(input: ArrayLike<T>, scheduler: SchedulerLike) {
  return new Observable<T>((subscriber) => {
    // The current array index.
    let i = 0;
    // Start iterating over the array like on a schedule.
    return scheduler.schedule(function () {
      if (i === input.length) {
        // If we have hit the end of the array like in the
        // previous job, we can complete.
        subscriber.complete();
      } else {
        // Otherwise let's next the value at the current index,
        // then increment our index.
        subscriber.next(input[i++]);
        // If the last emission didn't cause us to close the subscriber
        // (via take or some side effect), reschedule the job and we'll
        // make another pass.
        if (!subscriber.closed) {
          this.schedule();
        }
      }
    });
  });
}
import { SchedulerLike } from '../types';
import { Observable } from '../Observable';
import { executeSchedule } from '../util/executeSchedule';

export function scheduleAsyncIterable<T>(input: AsyncIterable<T>, scheduler: SchedulerLike) {
  if (!input) {
    throw new Error('Iterable cannot be null');
  }
  return new Observable<T>((subscriber) => {
    executeSchedule(subscriber, scheduler, () => {
      const iterator = input[Symbol.asyncIterator]();
      executeSchedule(
        subscriber,
        scheduler,
        () => {
          iterator.next().then((result) => {
            if (result.done) {
              // This will remove the subscriptions from
              // the parent subscription.
              subscriber.complete();
            } else {
              subscriber.next(result.value);
            }
          });
        },
        0,
        true
      );
    });
  });
}
import { Observable } from '../Observable';
import { SchedulerLike } from '../types';
import { iterator as Symbol_iterator } from '../symbol/iterator';
import { isFunction } from '../util/isFunction';
import { executeSchedule } from '../util/executeSchedule';

/**
 * Used in {@link scheduled} to create an observable from an Iterable.
 * @param input The iterable to create an observable from
 * @param scheduler The scheduler to use
 */
export function scheduleIterable<T>(input: Iterable<T>, scheduler: SchedulerLike) {
  return new Observable<T>((subscriber) => {
    let iterator: Iterator<T, T>;

    // Schedule the initial creation of the iterator from
    // the iterable. This is so the code in the iterable is
    // not called until the scheduled job fires.
    executeSchedule(subscriber, scheduler, () => {
      // Create the iterator.
      iterator = (input as any)[Symbol_iterator]();

      executeSchedule(
        subscriber,
        scheduler,
        () => {
          let value: T;
          let done: boolean | undefined;
          try {
            // Pull the value out of the iterator
            ({ value, done } = iterator.next());
          } catch (err) {
            // We got an error while pulling from the iterator
            subscriber.error(err);
            return;
          }

          if (done) {
            // If it is "done" we just complete. This mimics the
            // behavior of JavaScript's `for..of` consumption of
            // iterables, which will not emit the value from an iterator
            // result of `{ done: true: value: 'here' }`.
            subscriber.complete();
          } else {
            // The iterable is not done, emit the value.
            subscriber.next(value);
          }
        },
        0,
        true
      );
    });

    // During finalization, if we see this iterator has a `return` method,
    // then we know it is a Generator, and not just an Iterator. So we call
    // the `return()` function. This will ensure that any `finally { }` blocks
    // inside of the generator we can hit will be hit properly.
    return () => isFunction(iterator?.return) && iterator.return();
  });
}
import { innerFrom } from '../observable/innerFrom';
import { observeOn } from '../operators/observeOn';
import { subscribeOn } from '../operators/subscribeOn';
import { InteropObservable, SchedulerLike } from '../types';

export function scheduleObservable<T>(input: InteropObservable<T>, scheduler: SchedulerLike) {
  return innerFrom(input).pipe(subscribeOn(scheduler), observeOn(scheduler));
}
import { innerFrom } from '../observable/innerFrom';
import { observeOn } from '../operators/observeOn';
import { subscribeOn } from '../operators/subscribeOn';
import { SchedulerLike } from '../types';

export function schedulePromise<T>(input: PromiseLike<T>, scheduler: SchedulerLike) {
  return innerFrom(input).pipe(subscribeOn(scheduler), observeOn(scheduler));
}
import { SchedulerLike, ReadableStreamLike } from '../types';
import { Observable } from '../Observable';
import { scheduleAsyncIterable } from './scheduleAsyncIterable';
import { readableStreamLikeToAsyncGenerator } from '../util/isReadableStreamLike';

export function scheduleReadableStreamLike<T>(input: ReadableStreamLike<T>, scheduler: SchedulerLike): Observable<T> {
  return scheduleAsyncIterable(readableStreamLikeToAsyncGenerator(input), scheduler);
}
import { scheduleObservable } from './scheduleObservable';
import { schedulePromise } from './schedulePromise';
import { scheduleArray } from './scheduleArray';
import { scheduleIterable } from './scheduleIterable';
import { scheduleAsyncIterable } from './scheduleAsyncIterable';
import { isInteropObservable } from '../util/isInteropObservable';
import { isPromise } from '../util/isPromise';
import { isArrayLike } from '../util/isArrayLike';
import { isIterable } from '../util/isIterable';
import { ObservableInput, SchedulerLike } from '../types';
import { Observable } from '../Observable';
import { isAsyncIterable } from '../util/isAsyncIterable';
import { createInvalidObservableTypeError } from '../util/throwUnobservableError';
import { isReadableStreamLike } from '../util/isReadableStreamLike';
import { scheduleReadableStreamLike } from './scheduleReadableStreamLike';

/**
 * Converts from a common {@link ObservableInput} type to an observable where subscription and emissions
 * are scheduled on the provided scheduler.
 *
 * @see {@link from}
 * @see {@link of}
 *
 * @param input The observable, array, promise, iterable, etc you would like to schedule
 * @param scheduler The scheduler to use to schedule the subscription and emissions from
 * the returned observable.
 */
export function scheduled<T>(input: ObservableInput<T>, scheduler: SchedulerLike): Observable<T> {
  if (input != null) {
    if (isInteropObservable(input)) {
      return scheduleObservable(input, scheduler);
    }
    if (isArrayLike(input)) {
      return scheduleArray(input, scheduler);
    }
    if (isPromise(input)) {
      return schedulePromise(input, scheduler);
    }
    if (isAsyncIterable(input)) {
      return scheduleAsyncIterable(input, scheduler);
    }
    if (isIterable(input)) {
      return scheduleIterable(input, scheduler);
    }
    if (isReadableStreamLike(input)) {
      return scheduleReadableStreamLike(input, scheduler);
    }
  }
  throw createInvalidObservableTypeError(input);
}
import { Subscriber } from '../Subscriber';

/**
 * Creates an instance of an `OperatorSubscriber`.
 * @param destination The downstream subscriber.
 * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any
 * error that occurs in this function is caught and sent to the `error` method of this subscriber.
 * @param onError Handles errors from the subscription, any errors that occur in this handler are caught
 * and send to the `destination` error handler.
 * @param onComplete Handles completion notification from the subscription. Any errors that occur in
 * this handler are sent to the `destination` error handler.
 * @param onFinalize Additional teardown logic here. This will only be called on teardown if the
 * subscriber itself is not already closed. This is called after all other teardown logic is executed.
 */
export function createOperatorSubscriber<T>(
  destination: Subscriber<any>,
  onNext?: (value: T) => void,
  onComplete?: () => void,
  onError?: (err: any) => void,
  onFinalize?: () => void
): Subscriber<T> {
  return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);
}

/**
 * A generic helper for allowing operators to be created with a Subscriber and
 * use closures to capture necessary state from the operator function itself.
 */
export class OperatorSubscriber<T> extends Subscriber<T> {
  /**
   * Creates an instance of an `OperatorSubscriber`.
   * @param destination The downstream subscriber.
   * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any
   * error that occurs in this function is caught and sent to the `error` method of this subscriber.
   * @param onError Handles errors from the subscription, any errors that occur in this handler are caught
   * and send to the `destination` error handler.
   * @param onComplete Handles completion notification from the subscription. Any errors that occur in
   * this handler are sent to the `destination` error handler.
   * @param onFinalize Additional finalization logic here. This will only be called on finalization if the
   * subscriber itself is not already closed. This is called after all other finalization logic is executed.
   * @param shouldUnsubscribe An optional check to see if an unsubscribe call should truly unsubscribe.
   * NOTE: This currently **ONLY** exists to support the strange behavior of {@link groupBy}, where unsubscription
   * to the resulting observable does not actually disconnect from the source if there are active subscriptions
   * to any grouped observable. (DO NOT EXPOSE OR USE EXTERNALLY!!!)
   */
  constructor(
    destination: Subscriber<any>,
    onNext?: (value: T) => void,
    onComplete?: () => void,
    onError?: (err: any) => void,
    private onFinalize?: () => void,
    private shouldUnsubscribe?: () => boolean
  ) {
    // It's important - for performance reasons - that all of this class's
    // members are initialized and that they are always initialized in the same
    // order. This will ensure that all OperatorSubscriber instances have the
    // same hidden class in V8. This, in turn, will help keep the number of
    // hidden classes involved in property accesses within the base class as
    // low as possible. If the number of hidden classes involved exceeds four,
    // the property accesses will become megamorphic and performance penalties
    // will be incurred - i.e. inline caches won't be used.
    //
    // The reasons for ensuring all instances have the same hidden class are
    // further discussed in this blog post from Benedikt Meurer:
    // https://benediktmeurer.de/2018/03/23/impact-of-polymorphism-on-component-based-frameworks-like-react/
    super(destination);
    this._next = onNext
      ? function (this: OperatorSubscriber<T>, value: T) {
          try {
            onNext(value);
          } catch (err) {
            destination.error(err);
          }
        }
      : super._next;
    this._error = onError
      ? function (this: OperatorSubscriber<T>, err: any) {
          try {
            onError(err);
          } catch (err) {
            // Send any errors that occur down stream.
            destination.error(err);
          } finally {
            // Ensure finalization.
            this.unsubscribe();
          }
        }
      : super._error;
    this._complete = onComplete
      ? function (this: OperatorSubscriber<T>) {
          try {
            onComplete();
          } catch (err) {
            // Send any errors that occur down stream.
            destination.error(err);
          } finally {
            // Ensure finalization.
            this.unsubscribe();
          }
        }
      : super._complete;
  }

  unsubscribe() {
    if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {
      const { closed } = this;
      super.unsubscribe();
      // Execute additional teardown if we have any and we didn't already do so.
      !closed && this.onFinalize?.();
    }
  }
}
import { Subscriber } from '../Subscriber';
import { MonoTypeOperatorFunction, ObservableInput } from '../types';

import { operate } from '../util/lift';
import { innerFrom } from '../observable/innerFrom';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Ignores source values for a duration determined by another Observable, then
 * emits the most recent value from the source Observable, then repeats this
 * process.
 *
 * <span class="informal">It's like {@link auditTime}, but the silencing
 * duration is determined by a second Observable.</span>
 *
 * ![](audit.svg)
 *
 * `audit` is similar to `throttle`, but emits the last value from the silenced
 * time window, instead of the first value. `audit` emits the most recent value
 * from the source Observable on the output Observable as soon as its internal
 * timer becomes disabled, and ignores source values while the timer is enabled.
 * Initially, the timer is disabled. As soon as the first source value arrives,
 * the timer is enabled by calling the `durationSelector` function with the
 * source value, which returns the "duration" Observable. When the duration
 * Observable emits a value, the timer is disabled, then the most
 * recent source value is emitted on the output Observable, and this process
 * repeats for the next source value.
 *
 * ## Example
 *
 * Emit clicks at a rate of at most one click per second
 *
 * ```ts
 * import { fromEvent, audit, interval } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(audit(ev => interval(1000)));
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link auditTime}
 * @see {@link debounce}
 * @see {@link delayWhen}
 * @see {@link sample}
 * @see {@link throttle}
 *
 * @param durationSelector A function
 * that receives a value from the source Observable, for computing the silencing
 * duration, returned as an Observable or a Promise.
 * @return A function that returns an Observable that performs rate-limiting of
 * emissions from the source Observable.
 */
export function audit<T>(durationSelector: (value: T) => ObservableInput<any>): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    let hasValue = false;
    let lastValue: T | null = null;
    let durationSubscriber: Subscriber<any> | null = null;
    let isComplete = false;

    const endDuration = () => {
      durationSubscriber?.unsubscribe();
      durationSubscriber = null;
      if (hasValue) {
        hasValue = false;
        const value = lastValue!;
        lastValue = null;
        subscriber.next(value);
      }
      isComplete && subscriber.complete();
    };

    const cleanupDuration = () => {
      durationSubscriber = null;
      isComplete && subscriber.complete();
    };

    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => {
          hasValue = true;
          lastValue = value;
          if (!durationSubscriber) {
            innerFrom(durationSelector(value)).subscribe(
              (durationSubscriber = createOperatorSubscriber(subscriber, endDuration, cleanupDuration))
            );
          }
        },
        () => {
          isComplete = true;
          (!hasValue || !durationSubscriber || durationSubscriber.closed) && subscriber.complete();
        }
      )
    );
  });
}
import { asyncScheduler } from '../scheduler/async';
import { audit } from './audit';
import { timer } from '../observable/timer';
import { MonoTypeOperatorFunction, SchedulerLike } from '../types';

/**
 * Ignores source values for `duration` milliseconds, then emits the most recent
 * value from the source Observable, then repeats this process.
 *
 * <span class="informal">When it sees a source value, it ignores that plus
 * the next ones for `duration` milliseconds, and then it emits the most recent
 * value from the source.</span>
 *
 * ![](auditTime.png)
 *
 * `auditTime` is similar to `throttleTime`, but emits the last value from the
 * silenced time window, instead of the first value. `auditTime` emits the most
 * recent value from the source Observable on the output Observable as soon as
 * its internal timer becomes disabled, and ignores source values while the
 * timer is enabled. Initially, the timer is disabled. As soon as the first
 * source value arrives, the timer is enabled. After `duration` milliseconds (or
 * the time unit determined internally by the optional `scheduler`) has passed,
 * the timer is disabled, then the most recent source value is emitted on the
 * output Observable, and this process repeats for the next source value.
 * Optionally takes a {@link SchedulerLike} for managing timers.
 *
 * ## Example
 *
 * Emit clicks at a rate of at most one click per second
 *
 * ```ts
 * import { fromEvent, auditTime } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(auditTime(1000));
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link audit}
 * @see {@link debounceTime}
 * @see {@link delay}
 * @see {@link sampleTime}
 * @see {@link throttleTime}
 *
 * @param {number} duration Time to wait before emitting the most recent source
 * value, measured in milliseconds or the time unit determined internally
 * by the optional `scheduler`.
 * @param {SchedulerLike} [scheduler=async] The {@link SchedulerLike} to use for
 * managing the timers that handle the rate-limiting behavior.
 * @return A function that returns an Observable that performs rate-limiting of
 * emissions from the source Observable.
 */
export function auditTime<T>(duration: number, scheduler: SchedulerLike = asyncScheduler): MonoTypeOperatorFunction<T> {
  return audit(() => timer(duration, scheduler));
}
import { Observable } from '../Observable';
import { OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { noop } from '../util/noop';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Buffers the source Observable values until `closingNotifier` emits.
 *
 * <span class="informal">Collects values from the past as an array, and emits
 * that array only when another Observable emits.</span>
 *
 * ![](buffer.png)
 *
 * Buffers the incoming Observable values until the given `closingNotifier`
 * Observable emits a value, at which point it emits the buffer on the output
 * Observable and starts a new buffer internally, awaiting the next time
 * `closingNotifier` emits.
 *
 * ## Example
 *
 * On every click, emit array of most recent interval events
 *
 * ```ts
 * import { fromEvent, interval, buffer } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const intervalEvents = interval(1000);
 * const buffered = intervalEvents.pipe(buffer(clicks));
 * buffered.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link bufferCount}
 * @see {@link bufferTime}
 * @see {@link bufferToggle}
 * @see {@link bufferWhen}
 * @see {@link window}
 *
 * @param {Observable<any>} closingNotifier An Observable that signals the
 * buffer to be emitted on the output Observable.
 * @return A function that returns an Observable of buffers, which are arrays
 * of values.
 */
export function buffer<T>(closingNotifier: Observable<any>): OperatorFunction<T, T[]> {
  return operate((source, subscriber) => {
    // The current buffered values.
    let currentBuffer: T[] = [];

    // Subscribe to our source.
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => currentBuffer.push(value),
        () => {
          subscriber.next(currentBuffer);
          subscriber.complete();
        }
      )
    );

    // Subscribe to the closing notifier.
    closingNotifier.subscribe(
      createOperatorSubscriber(
        subscriber,
        () => {
          // Start a new buffer and emit the previous one.
          const b = currentBuffer;
          currentBuffer = [];
          subscriber.next(b);
        },
        noop
      )
    );

    return () => {
      // Ensure buffered values are released on finalization.
      currentBuffer = null!;
    };
  });
}
import { OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { arrRemove } from '../util/arrRemove';

/**
 * Buffers the source Observable values until the size hits the maximum
 * `bufferSize` given.
 *
 * <span class="informal">Collects values from the past as an array, and emits
 * that array only when its size reaches `bufferSize`.</span>
 *
 * ![](bufferCount.png)
 *
 * Buffers a number of values from the source Observable by `bufferSize` then
 * emits the buffer and clears it, and starts a new buffer each
 * `startBufferEvery` values. If `startBufferEvery` is not provided or is
 * `null`, then new buffers are started immediately at the start of the source
 * and when each buffer closes and is emitted.
 *
 * ## Examples
 *
 * Emit the last two click events as an array
 *
 * ```ts
 * import { fromEvent, bufferCount } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const buffered = clicks.pipe(bufferCount(2));
 * buffered.subscribe(x => console.log(x));
 * ```
 *
 * On every click, emit the last two click events as an array
 *
 * ```ts
 * import { fromEvent, bufferCount } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const buffered = clicks.pipe(bufferCount(2, 1));
 * buffered.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link buffer}
 * @see {@link bufferTime}
 * @see {@link bufferToggle}
 * @see {@link bufferWhen}
 * @see {@link pairwise}
 * @see {@link windowCount}
 *
 * @param {number} bufferSize The maximum size of the buffer emitted.
 * @param {number} [startBufferEvery] Interval at which to start a new buffer.
 * For example if `startBufferEvery` is `2`, then a new buffer will be started
 * on every other value from the source. A new buffer is started at the
 * beginning of the source by default.
 * @return A function that returns an Observable of arrays of buffered values.
 */
export function bufferCount<T>(bufferSize: number, startBufferEvery: number | null = null): OperatorFunction<T, T[]> {
  // If no `startBufferEvery` value was supplied, then we're
  // opening and closing on the bufferSize itself.
  startBufferEvery = startBufferEvery ?? bufferSize;

  return operate((source, subscriber) => {
    let buffers: T[][] = [];
    let count = 0;

    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => {
          let toEmit: T[][] | null = null;

          // Check to see if we need to start a buffer.
          // This will start one at the first value, and then
          // a new one every N after that.
          if (count++ % startBufferEvery! === 0) {
            buffers.push([]);
          }

          // Push our value into our active buffers.
          for (const buffer of buffers) {
            buffer.push(value);
            // Check to see if we're over the bufferSize
            // if we are, record it so we can emit it later.
            // If we emitted it now and removed it, it would
            // mutate the `buffers` array while we're looping
            // over it.
            if (bufferSize <= buffer.length) {
              toEmit = toEmit ?? [];
              toEmit.push(buffer);
            }
          }

          if (toEmit) {
            // We have found some buffers that are over the
            // `bufferSize`. Emit them, and remove them from our
            // buffers list.
            for (const buffer of toEmit) {
              arrRemove(buffers, buffer);
              subscriber.next(buffer);
            }
          }
        },
        () => {
          // When the source completes, emit all of our
          // active buffers.
          for (const buffer of buffers) {
            subscriber.next(buffer);
          }
          subscriber.complete();
        },
        // Pass all errors through to consumer.
        undefined,
        () => {
          // Clean up our memory when we finalize
          buffers = null!;
        }
      )
    );
  });
}
import { Subscription } from '../Subscription';
import { OperatorFunction, SchedulerLike } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { arrRemove } from '../util/arrRemove';
import { asyncScheduler } from '../scheduler/async';
import { popScheduler } from '../util/args';
import { executeSchedule } from '../util/executeSchedule';

/* tslint:disable:max-line-length */
export function bufferTime<T>(bufferTimeSpan: number, scheduler?: SchedulerLike): OperatorFunction<T, T[]>;
export function bufferTime<T>(
  bufferTimeSpan: number,
  bufferCreationInterval: number | null | undefined,
  scheduler?: SchedulerLike
): OperatorFunction<T, T[]>;
export function bufferTime<T>(
  bufferTimeSpan: number,
  bufferCreationInterval: number | null | undefined,
  maxBufferSize: number,
  scheduler?: SchedulerLike
): OperatorFunction<T, T[]>;
/* tslint:enable:max-line-length */

/**
 * Buffers the source Observable values for a specific time period.
 *
 * <span class="informal">Collects values from the past as an array, and emits
 * those arrays periodically in time.</span>
 *
 * ![](bufferTime.png)
 *
 * Buffers values from the source for a specific time duration `bufferTimeSpan`.
 * Unless the optional argument `bufferCreationInterval` is given, it emits and
 * resets the buffer every `bufferTimeSpan` milliseconds. If
 * `bufferCreationInterval` is given, this operator opens the buffer every
 * `bufferCreationInterval` milliseconds and closes (emits and resets) the
 * buffer every `bufferTimeSpan` milliseconds. When the optional argument
 * `maxBufferSize` is specified, the buffer will be closed either after
 * `bufferTimeSpan` milliseconds or when it contains `maxBufferSize` elements.
 *
 * ## Examples
 *
 * Every second, emit an array of the recent click events
 *
 * ```ts
 * import { fromEvent, bufferTime } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const buffered = clicks.pipe(bufferTime(1000));
 * buffered.subscribe(x => console.log(x));
 * ```
 *
 * Every 5 seconds, emit the click events from the next 2 seconds
 *
 * ```ts
 * import { fromEvent, bufferTime } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const buffered = clicks.pipe(bufferTime(2000, 5000));
 * buffered.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link buffer}
 * @see {@link bufferCount}
 * @see {@link bufferToggle}
 * @see {@link bufferWhen}
 * @see {@link windowTime}
 *
 * @param {number} bufferTimeSpan The amount of time to fill each buffer array.
 * @param {number} [bufferCreationInterval] The interval at which to start new
 * buffers.
 * @param {number} [maxBufferSize] The maximum buffer size.
 * @param {SchedulerLike} [scheduler=async] The scheduler on which to schedule the
 * intervals that determine buffer boundaries.
 * @return A function that returns an Observable of arrays of buffered values.
 */
export function bufferTime<T>(bufferTimeSpan: number, ...otherArgs: any[]): OperatorFunction<T, T[]> {
  const scheduler = popScheduler(otherArgs) ?? asyncScheduler;
  const bufferCreationInterval = (otherArgs[0] as number) ?? null;
  const maxBufferSize = (otherArgs[1] as number) || Infinity;

  return operate((source, subscriber) => {
    // The active buffers, their related subscriptions, and removal functions.
    let bufferRecords: { buffer: T[]; subs: Subscription }[] | null = [];
    // If true, it means that every time we emit a buffer, we want to start a new buffer
    // this is only really used for when *just* the buffer time span is passed.
    let restartOnEmit = false;

    /**
     * Does the work of emitting the buffer from the record, ensuring that the
     * record is removed before the emission so reentrant code (from some custom scheduling, perhaps)
     * does not alter the buffer. Also checks to see if a new buffer needs to be started
     * after the emit.
     */
    const emit = (record: { buffer: T[]; subs: Subscription }) => {
      const { buffer, subs } = record;
      subs.unsubscribe();
      arrRemove(bufferRecords, record);
      subscriber.next(buffer);
      restartOnEmit && startBuffer();
    };

    /**
     * Called every time we start a new buffer. This does
     * the work of scheduling a job at the requested bufferTimeSpan
     * that will emit the buffer (if it's not unsubscribed before then).
     */
    const startBuffer = () => {
      if (bufferRecords) {
        const subs = new Subscription();
        subscriber.add(subs);
        const buffer: T[] = [];
        const record = {
          buffer,
          subs,
        };
        bufferRecords.push(record);
        executeSchedule(subs, scheduler, () => emit(record), bufferTimeSpan);
      }
    };

    if (bufferCreationInterval !== null && bufferCreationInterval >= 0) {
      // The user passed both a bufferTimeSpan (required), and a creation interval
      // That means we need to start new buffers on the interval, and those buffers need
      // to wait the required time span before emitting.
      executeSchedule(subscriber, scheduler, startBuffer, bufferCreationInterval, true);
    } else {
      restartOnEmit = true;
    }

    startBuffer();

    const bufferTimeSubscriber = createOperatorSubscriber(
      subscriber,
      (value: T) => {
        // Copy the records, so if we need to remove one we
        // don't mutate the array. It's hard, but not impossible to
        // set up a buffer time that could mutate the array and
        // cause issues here.
        const recordsCopy = bufferRecords!.slice();
        for (const record of recordsCopy) {
          // Loop over all buffers and
          const { buffer } = record;
          buffer.push(value);
          // If the buffer is over the max size, we need to emit it.
          maxBufferSize <= buffer.length && emit(record);
        }
      },
      () => {
        // The source completed, emit all of the active
        // buffers we have before we complete.
        while (bufferRecords?.length) {
          subscriber.next(bufferRecords.shift()!.buffer);
        }
        bufferTimeSubscriber?.unsubscribe();
        subscriber.complete();
        subscriber.unsubscribe();
      },
      // Pass all errors through to consumer.
      undefined,
      // Clean up
      () => (bufferRecords = null)
    );

    source.subscribe(bufferTimeSubscriber);
  });
}
import { Subscription } from '../Subscription';
import { OperatorFunction, ObservableInput } from '../types';
import { operate } from '../util/lift';
import { innerFrom } from '../observable/innerFrom';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { noop } from '../util/noop';
import { arrRemove } from '../util/arrRemove';

/**
 * Buffers the source Observable values starting from an emission from
 * `openings` and ending when the output of `closingSelector` emits.
 *
 * <span class="informal">Collects values from the past as an array. Starts
 * collecting only when `opening` emits, and calls the `closingSelector`
 * function to get an Observable that tells when to close the buffer.</span>
 *
 * ![](bufferToggle.png)
 *
 * Buffers values from the source by opening the buffer via signals from an
 * Observable provided to `openings`, and closing and sending the buffers when
 * a Subscribable or Promise returned by the `closingSelector` function emits.
 *
 * ## Example
 *
 * Every other second, emit the click events from the next 500ms
 *
 * ```ts
 * import { fromEvent, interval, bufferToggle, EMPTY } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const openings = interval(1000);
 * const buffered = clicks.pipe(bufferToggle(openings, i =>
 *   i % 2 ? interval(500) : EMPTY
 * ));
 * buffered.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link buffer}
 * @see {@link bufferCount}
 * @see {@link bufferTime}
 * @see {@link bufferWhen}
 * @see {@link windowToggle}
 *
 * @param openings A Subscribable or Promise of notifications to start new
 * buffers.
 * @param closingSelector A function that takes
 * the value emitted by the `openings` observable and returns a Subscribable or Promise,
 * which, when it emits, signals that the associated buffer should be emitted
 * and cleared.
 * @return A function that returns an Observable of arrays of buffered values.
 */
export function bufferToggle<T, O>(
  openings: ObservableInput<O>,
  closingSelector: (value: O) => ObservableInput<any>
): OperatorFunction<T, T[]> {
  return operate((source, subscriber) => {
    const buffers: T[][] = [];

    // Subscribe to the openings notifier first
    innerFrom(openings).subscribe(
      createOperatorSubscriber(
        subscriber,
        (openValue) => {
          const buffer: T[] = [];
          buffers.push(buffer);
          // We use this composite subscription, so that
          // when the closing notifier emits, we can tear it down.
          const closingSubscription = new Subscription();

          const emitBuffer = () => {
            arrRemove(buffers, buffer);
            subscriber.next(buffer);
            closingSubscription.unsubscribe();
          };

          // The line below will add the subscription to the parent subscriber *and* the closing subscription.
          closingSubscription.add(innerFrom(closingSelector(openValue)).subscribe(createOperatorSubscriber(subscriber, emitBuffer, noop)));
        },
        noop
      )
    );

    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => {
          // Value from our source. Add it to all pending buffers.
          for (const buffer of buffers) {
            buffer.push(value);
          }
        },
        () => {
          // Source complete. Emit all pending buffers.
          while (buffers.length > 0) {
            subscriber.next(buffers.shift()!);
          }
          subscriber.complete();
        }
      )
    );
  });
}
import { Subscriber } from '../Subscriber';
import { ObservableInput, OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { noop } from '../util/noop';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';

/**
 * Buffers the source Observable values, using a factory function of closing
 * Observables to determine when to close, emit, and reset the buffer.
 *
 * <span class="informal">Collects values from the past as an array. When it
 * starts collecting values, it calls a function that returns an Observable that
 * tells when to close the buffer and restart collecting.</span>
 *
 * ![](bufferWhen.svg)
 *
 * Opens a buffer immediately, then closes the buffer when the observable
 * returned by calling `closingSelector` function emits a value. When it closes
 * the buffer, it immediately opens a new buffer and repeats the process.
 *
 * ## Example
 *
 * Emit an array of the last clicks every [1-5] random seconds
 *
 * ```ts
 * import { fromEvent, bufferWhen, interval } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const buffered = clicks.pipe(
 *   bufferWhen(() => interval(1000 + Math.random() * 4000))
 * );
 * buffered.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link buffer}
 * @see {@link bufferCount}
 * @see {@link bufferTime}
 * @see {@link bufferToggle}
 * @see {@link windowWhen}
 *
 * @param {function(): Observable} closingSelector A function that takes no
 * arguments and returns an Observable that signals buffer closure.
 * @return A function that returns an Observable of arrays of buffered values.
 */
export function bufferWhen<T>(closingSelector: () => ObservableInput<any>): OperatorFunction<T, T[]> {
  return operate((source, subscriber) => {
    // The buffer we keep and emit.
    let buffer: T[] | null = null;
    // A reference to the subscriber used to subscribe to
    // the closing notifier. We need to hold this so we can
    // end the subscription after the first notification.
    let closingSubscriber: Subscriber<T> | null = null;

    // Ends the previous closing notifier subscription, so it
    // terminates after the first emission, then emits
    // the current buffer  if there is one, starts a new buffer, and starts a
    // new closing notifier.
    const openBuffer = () => {
      // Make sure to finalize the closing subscription, we only cared
      // about one notification.
      closingSubscriber?.unsubscribe();
      // emit the buffer if we have one, and start a new buffer.
      const b = buffer;
      buffer = [];
      b && subscriber.next(b);

      // Get a new closing notifier and subscribe to it.
      innerFrom(closingSelector()).subscribe((closingSubscriber = createOperatorSubscriber(subscriber, openBuffer, noop)));
    };

    // Start the first buffer.
    openBuffer();

    // Subscribe to our source.
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        // Add every new value to the current buffer.
        (value) => buffer?.push(value),
        // When we complete, emit the buffer if we have one,
        // then complete the result.
        () => {
          buffer && subscriber.next(buffer);
          subscriber.complete();
        },
        // Pass all errors through to consumer.
        undefined,
        // Release memory on finalization
        () => (buffer = closingSubscriber = null!)
      )
    );
  });
}
import { Observable } from '../Observable';

import { ObservableInput, OperatorFunction, ObservedValueOf } from '../types';
import { Subscription } from '../Subscription';
import { innerFrom } from '../observable/innerFrom';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { operate } from '../util/lift';

/* tslint:disable:max-line-length */
export function catchError<T, O extends ObservableInput<any>>(
  selector: (err: any, caught: Observable<T>) => O
): OperatorFunction<T, T | ObservedValueOf<O>>;
/* tslint:enable:max-line-length */

/**
 * Catches errors on the observable to be handled by returning a new observable or throwing an error.
 *
 * <span class="informal">
 * It only listens to the error channel and ignores notifications.
 * Handles errors from the source observable, and maps them to a new observable.
 * The error may also be rethrown, or a new error can be thrown to emit an error from the result.
 * </span>
 *
 * ![](catch.png)
 *
 * This operator handles errors, but forwards along all other events to the resulting observable.
 * If the source observable terminates with an error, it will map that error to a new observable,
 * subscribe to it, and forward all of its events to the resulting observable.
 *
 * ## Examples
 *
 * Continue with a different Observable when there's an error
 *
 * ```ts
 * import { of, map, catchError } from 'rxjs';
 *
 * of(1, 2, 3, 4, 5)
 *   .pipe(
 *     map(n => {
 *       if (n === 4) {
 *         throw 'four!';
 *       }
 *       return n;
 *     }),
 *     catchError(err => of('I', 'II', 'III', 'IV', 'V'))
 *   )
 *   .subscribe(x => console.log(x));
 *   // 1, 2, 3, I, II, III, IV, V
 * ```
 *
 * Retry the caught source Observable again in case of error, similar to `retry()` operator
 *
 * ```ts
 * import { of, map, catchError, take } from 'rxjs';
 *
 * of(1, 2, 3, 4, 5)
 *   .pipe(
 *     map(n => {
 *       if (n === 4) {
 *         throw 'four!';
 *       }
 *       return n;
 *     }),
 *     catchError((err, caught) => caught),
 *     take(30)
 *   )
 *   .subscribe(x => console.log(x));
 *   // 1, 2, 3, 1, 2, 3, ...
 * ```
 *
 * Throw a new error when the source Observable throws an error
 *
 * ```ts
 * import { of, map, catchError } from 'rxjs';
 *
 * of(1, 2, 3, 4, 5)
 *   .pipe(
 *     map(n => {
 *       if (n === 4) {
 *         throw 'four!';
 *       }
 *       return n;
 *     }),
 *     catchError(err => {
 *       throw 'error in source. Details: ' + err;
 *     })
 *   )
 *   .subscribe({
 *     next: x => console.log(x),
 *     error: err => console.log(err)
 *   });
 *   // 1, 2, 3, error in source. Details: four!
 * ```
 *
 * @see {@link onErrorResumeNext}
 * @see {@link repeat}
 * @see {@link repeatWhen}
 * @see {@link retry }
 * @see {@link retryWhen}
 *
 * @param {function} selector a function that takes as arguments `err`, which is the error, and `caught`, which
 * is the source observable, in case you'd like to "retry" that observable by returning it again. Whatever observable
 * is returned by the `selector` will be used to continue the observable chain.
 * @return A function that returns an Observable that originates from either
 * the source or the Observable returned by the `selector` function.
 */
export function catchError<T, O extends ObservableInput<any>>(
  selector: (err: any, caught: Observable<T>) => O
): OperatorFunction<T, T | ObservedValueOf<O>> {
  return operate((source, subscriber) => {
    let innerSub: Subscription | null = null;
    let syncUnsub = false;
    let handledResult: Observable<ObservedValueOf<O>>;

    innerSub = source.subscribe(
      createOperatorSubscriber(subscriber, undefined, undefined, (err) => {
        handledResult = innerFrom(selector(err, catchError(selector)(source)));
        if (innerSub) {
          innerSub.unsubscribe();
          innerSub = null;
          handledResult.subscribe(subscriber);
        } else {
          // We don't have an innerSub yet, that means the error was synchronous
          // because the subscribe call hasn't returned yet.
          syncUnsub = true;
        }
      })
    );

    if (syncUnsub) {
      // We have a synchronous error, we need to make sure to
      // finalize right away. This ensures that callbacks in the `finalize` operator are called
      // at the right time, and that finalization occurs at the expected
      // time between the source error and the subscription to the
      // next observable.
      innerSub.unsubscribe();
      innerSub = null;
      handledResult!.subscribe(subscriber);
    }
  });
}
import { combineLatestAll } from './combineLatestAll';

/**
 * @deprecated Renamed to {@link combineLatestAll}. Will be removed in v8.
 */
export const combineAll = combineLatestAll;
import { combineLatestInit } from '../observable/combineLatest';
import { ObservableInput, ObservableInputTuple, OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { argsOrArgArray } from '../util/argsOrArgArray';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';
import { pipe } from '../util/pipe';
import { popResultSelector } from '../util/args';

/** @deprecated Replaced with {@link combineLatestWith}. Will be removed in v8. */
export function combineLatest<T, A extends readonly unknown[], R>(
  sources: [...ObservableInputTuple<A>],
  project: (...values: [T, ...A]) => R
): OperatorFunction<T, R>;
/** @deprecated Replaced with {@link combineLatestWith}. Will be removed in v8. */
export function combineLatest<T, A extends readonly unknown[], R>(sources: [...ObservableInputTuple<A>]): OperatorFunction<T, [T, ...A]>;

/** @deprecated Replaced with {@link combineLatestWith}. Will be removed in v8. */
export function combineLatest<T, A extends readonly unknown[], R>(
  ...sourcesAndProject: [...ObservableInputTuple<A>, (...values: [T, ...A]) => R]
): OperatorFunction<T, R>;
/** @deprecated Replaced with {@link combineLatestWith}. Will be removed in v8. */
export function combineLatest<T, A extends readonly unknown[], R>(...sources: [...ObservableInputTuple<A>]): OperatorFunction<T, [T, ...A]>;

/**
 * @deprecated Replaced with {@link combineLatestWith}. Will be removed in v8.
 */
export function combineLatest<T, R>(...args: (ObservableInput<any> | ((...values: any[]) => R))[]): OperatorFunction<T, unknown> {
  const resultSelector = popResultSelector(args);
  return resultSelector
    ? pipe(combineLatest(...(args as Array<ObservableInput<any>>)), mapOneOrManyArgs(resultSelector))
    : operate((source, subscriber) => {
        combineLatestInit([source, ...argsOrArgArray(args)])(subscriber);
      });
}
import { combineLatest } from '../observable/combineLatest';
import { OperatorFunction, ObservableInput } from '../types';
import { joinAllInternals } from './joinAllInternals';

export function combineLatestAll<T>(): OperatorFunction<ObservableInput<T>, T[]>;
export function combineLatestAll<T>(): OperatorFunction<any, T[]>;
export function combineLatestAll<T, R>(project: (...values: T[]) => R): OperatorFunction<ObservableInput<T>, R>;
export function combineLatestAll<R>(project: (...values: Array<any>) => R): OperatorFunction<any, R>;

/**
 * Flattens an Observable-of-Observables by applying {@link combineLatest} when the Observable-of-Observables completes.
 *
 * `combineLatestAll` takes an Observable of Observables, and collects all Observables from it. Once the outer Observable completes,
 * it subscribes to all collected Observables and combines their values using the {@link combineLatest} strategy, such that:
 *
 * * Every time an inner Observable emits, the output Observable emits
 * * When the returned observable emits, it emits all of the latest values by:
 *    * If a `project` function is provided, it is called with each recent value from each inner Observable in whatever order they
 *      arrived, and the result of the `project` function is what is emitted by the output Observable.
 *    * If there is no `project` function, an array of all the most recent values is emitted by the output Observable.
 *
 * ## Example
 *
 * Map two click events to a finite interval Observable, then apply `combineLatestAll`
 *
 * ```ts
 * import { fromEvent, map, interval, take, combineLatestAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const higherOrder = clicks.pipe(
 *   map(() => interval(Math.random() * 2000).pipe(take(3))),
 *   take(2)
 * );
 * const result = higherOrder.pipe(combineLatestAll());
 *
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link combineLatest}
 * @see {@link combineLatestWith}
 * @see {@link mergeAll}
 *
 * @param project optional function to map the most recent values from each inner Observable into a new result.
 * Takes each of the most recent values from each collected inner Observable as arguments, in order.
 * @return A function that returns an Observable that flattens Observables
 * emitted by the source Observable.
 */
export function combineLatestAll<R>(project?: (...values: Array<any>) => R) {
  return joinAllInternals(combineLatest, project);
}
import { ObservableInputTuple, OperatorFunction, Cons } from '../types';
import { combineLatest } from './combineLatest';

/**
 * Create an observable that combines the latest values from all passed observables and the source
 * into arrays and emits them.
 *
 * Returns an observable, that when subscribed to, will subscribe to the source observable and all
 * sources provided as arguments. Once all sources emit at least one value, all of the latest values
 * will be emitted as an array. After that, every time any source emits a value, all of the latest values
 * will be emitted as an array.
 *
 * This is a useful operator for eagerly calculating values based off of changed inputs.
 *
 * ## Example
 *
 * Simple concatenation of values from two inputs
 *
 * ```ts
 * import { fromEvent, combineLatestWith, map } from 'rxjs';
 *
 * // Setup: Add two inputs to the page
 * const input1 = document.createElement('input');
 * document.body.appendChild(input1);
 * const input2 = document.createElement('input');
 * document.body.appendChild(input2);
 *
 * // Get streams of changes
 * const input1Changes$ = fromEvent(input1, 'change');
 * const input2Changes$ = fromEvent(input2, 'change');
 *
 * // Combine the changes by adding them together
 * input1Changes$.pipe(
 *   combineLatestWith(input2Changes$),
 *   map(([e1, e2]) => (<HTMLInputElement>e1.target).value + ' - ' + (<HTMLInputElement>e2.target).value)
 * )
 * .subscribe(x => console.log(x));
 * ```
 *
 * @param otherSources the other sources to subscribe to.
 * @return A function that returns an Observable that emits the latest
 * emissions from both source and provided Observables.
 */
export function combineLatestWith<T, A extends readonly unknown[]>(
  ...otherSources: [...ObservableInputTuple<A>]
): OperatorFunction<T, Cons<T, A>> {
  return combineLatest(...otherSources);
}
import { ObservableInputTuple, OperatorFunction, SchedulerLike } from '../types';
import { operate } from '../util/lift';
import { concatAll } from './concatAll';
import { popScheduler } from '../util/args';
import { from } from '../observable/from';

/** @deprecated Replaced with {@link concatWith}. Will be removed in v8. */
export function concat<T, A extends readonly unknown[]>(...sources: [...ObservableInputTuple<A>]): OperatorFunction<T, T | A[number]>;
/** @deprecated Replaced with {@link concatWith}. Will be removed in v8. */
export function concat<T, A extends readonly unknown[]>(
  ...sourcesAndScheduler: [...ObservableInputTuple<A>, SchedulerLike]
): OperatorFunction<T, T | A[number]>;

/**
 * @deprecated Replaced with {@link concatWith}. Will be removed in v8.
 */
export function concat<T, R>(...args: any[]): OperatorFunction<T, R> {
  const scheduler = popScheduler(args);
  return operate((source, subscriber) => {
    concatAll()(from([source, ...args], scheduler)).subscribe(subscriber);
  });
}
import { mergeAll } from './mergeAll';
import { OperatorFunction, ObservableInput, ObservedValueOf } from '../types';

/**
 * Converts a higher-order Observable into a first-order Observable by
 * concatenating the inner Observables in order.
 *
 * <span class="informal">Flattens an Observable-of-Observables by putting one
 * inner Observable after the other.</span>
 *
 * ![](concatAll.svg)
 *
 * Joins every Observable emitted by the source (a higher-order Observable), in
 * a serial fashion. It subscribes to each inner Observable only after the
 * previous inner Observable has completed, and merges all of their values into
 * the returned observable.
 *
 * __Warning:__ If the source Observable emits Observables quickly and
 * endlessly, and the inner Observables it emits generally complete slower than
 * the source emits, you can run into memory issues as the incoming Observables
 * collect in an unbounded buffer.
 *
 * Note: `concatAll` is equivalent to `mergeAll` with concurrency parameter set
 * to `1`.
 *
 * ## Example
 *
 * For each click event, tick every second from 0 to 3, with no concurrency
 *
 * ```ts
 * import { fromEvent, map, interval, take, concatAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const higherOrder = clicks.pipe(
 *   map(() => interval(1000).pipe(take(4)))
 * );
 * const firstOrder = higherOrder.pipe(concatAll());
 * firstOrder.subscribe(x => console.log(x));
 *
 * // Results in the following:
 * // (results are not concurrent)
 * // For every click on the "document" it will emit values 0 to 3 spaced
 * // on a 1000ms interval
 * // one click = 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3
 * ```
 *
 * @see {@link combineLatestAll}
 * @see {@link concat}
 * @see {@link concatMap}
 * @see {@link concatMapTo}
 * @see {@link exhaustAll}
 * @see {@link mergeAll}
 * @see {@link switchAll}
 * @see {@link switchMap}
 * @see {@link zipAll}
 *
 * @return A function that returns an Observable emitting values from all the
 * inner Observables concatenated.
 */
export function concatAll<O extends ObservableInput<any>>(): OperatorFunction<O, ObservedValueOf<O>> {
  return mergeAll(1);
}
import { mergeMap } from './mergeMap';
import { ObservableInput, OperatorFunction, ObservedValueOf } from '../types';
import { isFunction } from '../util/isFunction';

/* tslint:disable:max-line-length */
export function concatMap<T, O extends ObservableInput<any>>(
  project: (value: T, index: number) => O
): OperatorFunction<T, ObservedValueOf<O>>;
/** @deprecated The `resultSelector` parameter will be removed in v8. Use an inner `map` instead. Details: https://rxjs.dev/deprecations/resultSelector */
export function concatMap<T, O extends ObservableInput<any>>(
  project: (value: T, index: number) => O,
  resultSelector: undefined
): OperatorFunction<T, ObservedValueOf<O>>;
/** @deprecated The `resultSelector` parameter will be removed in v8. Use an inner `map` instead. Details: https://rxjs.dev/deprecations/resultSelector */
export function concatMap<T, R, O extends ObservableInput<any>>(
  project: (value: T, index: number) => O,
  resultSelector: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R
): OperatorFunction<T, R>;
/* tslint:enable:max-line-length */

/**
 * Projects each source value to an Observable which is merged in the output
 * Observable, in a serialized fashion waiting for each one to complete before
 * merging the next.
 *
 * <span class="informal">Maps each value to an Observable, then flattens all of
 * these inner Observables using {@link concatAll}.</span>
 *
 * ![](concatMap.png)
 *
 * Returns an Observable that emits items based on applying a function that you
 * supply to each item emitted by the source Observable, where that function
 * returns an (so-called "inner") Observable. Each new inner Observable is
 * concatenated with the previous inner Observable.
 *
 * __Warning:__ if source values arrive endlessly and faster than their
 * corresponding inner Observables can complete, it will result in memory issues
 * as inner Observables amass in an unbounded buffer waiting for their turn to
 * be subscribed to.
 *
 * Note: `concatMap` is equivalent to `mergeMap` with concurrency parameter set
 * to `1`.
 *
 * ## Example
 *
 * For each click event, tick every second from 0 to 3, with no concurrency
 *
 * ```ts
 * import { fromEvent, concatMap, interval, take } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(
 *   concatMap(ev => interval(1000).pipe(take(4)))
 * );
 * result.subscribe(x => console.log(x));
 *
 * // Results in the following:
 * // (results are not concurrent)
 * // For every click on the "document" it will emit values 0 to 3 spaced
 * // on a 1000ms interval
 * // one click = 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3
 * ```
 *
 * @see {@link concat}
 * @see {@link concatAll}
 * @see {@link concatMapTo}
 * @see {@link exhaustMap}
 * @see {@link mergeMap}
 * @see {@link switchMap}
 *
 * @param {function(value: T, ?index: number): ObservableInput} project A function
 * that, when applied to an item emitted by the source Observable, returns an
 * Observable.
 * @return A function that returns an Observable that emits the result of
 * applying the projection function (and the optional deprecated
 * `resultSelector`) to each item emitted by the source Observable and taking
 * values from each projected inner Observable sequentially.
 */
export function concatMap<T, R, O extends ObservableInput<any>>(
  project: (value: T, index: number) => O,
  resultSelector?: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R
): OperatorFunction<T, ObservedValueOf<O> | R> {
  return isFunction(resultSelector) ? mergeMap(project, resultSelector, 1) : mergeMap(project, 1);
}
import { concatMap } from './concatMap';
import { ObservableInput, OperatorFunction, ObservedValueOf } from '../types';
import { isFunction } from '../util/isFunction';

/** @deprecated Will be removed in v9. Use {@link concatMap} instead: `concatMap(() => result)` */
export function concatMapTo<O extends ObservableInput<unknown>>(observable: O): OperatorFunction<unknown, ObservedValueOf<O>>;
/** @deprecated The `resultSelector` parameter will be removed in v8. Use an inner `map` instead. Details: https://rxjs.dev/deprecations/resultSelector */
export function concatMapTo<O extends ObservableInput<unknown>>(
  observable: O,
  resultSelector: undefined
): OperatorFunction<unknown, ObservedValueOf<O>>;
/** @deprecated The `resultSelector` parameter will be removed in v8. Use an inner `map` instead. Details: https://rxjs.dev/deprecations/resultSelector */
export function concatMapTo<T, R, O extends ObservableInput<unknown>>(
  observable: O,
  resultSelector: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R
): OperatorFunction<T, R>;

/**
 * Projects each source value to the same Observable which is merged multiple
 * times in a serialized fashion on the output Observable.
 *
 * <span class="informal">It's like {@link concatMap}, but maps each value
 * always to the same inner Observable.</span>
 *
 * ![](concatMapTo.png)
 *
 * Maps each source value to the given Observable `innerObservable` regardless
 * of the source value, and then flattens those resulting Observables into one
 * single Observable, which is the output Observable. Each new `innerObservable`
 * instance emitted on the output Observable is concatenated with the previous
 * `innerObservable` instance.
 *
 * __Warning:__ if source values arrive endlessly and faster than their
 * corresponding inner Observables can complete, it will result in memory issues
 * as inner Observables amass in an unbounded buffer waiting for their turn to
 * be subscribed to.
 *
 * Note: `concatMapTo` is equivalent to `mergeMapTo` with concurrency parameter
 * set to `1`.
 *
 * ## Example
 *
 * For each click event, tick every second from 0 to 3, with no concurrency
 *
 * ```ts
 * import { fromEvent, concatMapTo, interval, take } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(
 *   concatMapTo(interval(1000).pipe(take(4)))
 * );
 * result.subscribe(x => console.log(x));
 *
 * // Results in the following:
 * // (results are not concurrent)
 * // For every click on the "document" it will emit values 0 to 3 spaced
 * // on a 1000ms interval
 * // one click = 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3
 * ```
 *
 * @see {@link concat}
 * @see {@link concatAll}
 * @see {@link concatMap}
 * @see {@link mergeMapTo}
 * @see {@link switchMapTo}
 *
 * @param {ObservableInput} innerObservable An Observable to replace each value from
 * the source Observable.
 * @return A function that returns an Observable of values merged together by
 * joining the passed Observable with itself, one after the other, for each
 * value emitted from the source.
 * @deprecated Will be removed in v9. Use {@link concatMap} instead: `concatMap(() => result)`
 */
export function concatMapTo<T, R, O extends ObservableInput<unknown>>(
  innerObservable: O,
  resultSelector?: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R
): OperatorFunction<T, ObservedValueOf<O> | R> {
  return isFunction(resultSelector) ? concatMap(() => innerObservable, resultSelector) : concatMap(() => innerObservable);
}
import { ObservableInputTuple, OperatorFunction } from '../types';
import { concat } from './concat';

/**
 * Emits all of the values from the source observable, then, once it completes, subscribes
 * to each observable source provided, one at a time, emitting all of their values, and not subscribing
 * to the next one until it completes.
 *
 * `concat(a$, b$, c$)` is the same as `a$.pipe(concatWith(b$, c$))`.
 *
 * ## Example
 *
 * Listen for one mouse click, then listen for all mouse moves.
 *
 * ```ts
 * import { fromEvent, map, take, concatWith } from 'rxjs';
 *
 * const clicks$ = fromEvent(document, 'click');
 * const moves$ = fromEvent(document, 'mousemove');
 *
 * clicks$.pipe(
 *   map(() => 'click'),
 *   take(1),
 *   concatWith(
 *     moves$.pipe(
 *       map(() => 'move')
 *     )
 *   )
 * )
 * .subscribe(x => console.log(x));
 *
 * // 'click'
 * // 'move'
 * // 'move'
 * // 'move'
 * // ...
 * ```
 *
 * @param otherSources Other observable sources to subscribe to, in sequence, after the original source is complete.
 * @return A function that returns an Observable that concatenates
 * subscriptions to the source and provided Observables subscribing to the next
 * only once the current subscription completes.
 */
export function concatWith<T, A extends readonly unknown[]>(
  ...otherSources: [...ObservableInputTuple<A>]
): OperatorFunction<T, T | A[number]> {
  return concat(...otherSources);
}
import { OperatorFunction, ObservableInput, ObservedValueOf, SubjectLike } from '../types';
import { Observable } from '../Observable';
import { Subject } from '../Subject';
import { innerFrom } from '../observable/innerFrom';
import { operate } from '../util/lift';
import { fromSubscribable } from '../observable/fromSubscribable';

/**
 * An object used to configure {@link connect} operator.
 */
export interface ConnectConfig<T> {
  /**
   * A factory function used to create the Subject through which the source
   * is multicast. By default, this creates a {@link Subject}.
   */
  connector: () => SubjectLike<T>;
}

/**
 * The default configuration for `connect`.
 */
const DEFAULT_CONFIG: ConnectConfig<unknown> = {
  connector: () => new Subject<unknown>(),
};

/**
 * Creates an observable by multicasting the source within a function that
 * allows the developer to define the usage of the multicast prior to connection.
 *
 * This is particularly useful if the observable source you wish to multicast could
 * be synchronous or asynchronous. This sets it apart from {@link share}, which, in the
 * case of totally synchronous sources will fail to share a single subscription with
 * multiple consumers, as by the time the subscription to the result of {@link share}
 * has returned, if the source is synchronous its internal reference count will jump from
 * 0 to 1 back to 0 and reset.
 *
 * To use `connect`, you provide a `selector` function that will give you
 * a multicast observable that is not yet connected. You then use that multicast observable
 * to create a resulting observable that, when subscribed, will set up your multicast. This is
 * generally, but not always, accomplished with {@link merge}.
 *
 * Note that using a {@link takeUntil} inside of `connect`'s `selector` _might_ mean you were looking
 * to use the {@link takeWhile} operator instead.
 *
 * When you subscribe to the result of `connect`, the `selector` function will be called. After
 * the `selector` function returns, the observable it returns will be subscribed to, _then_ the
 * multicast will be connected to the source.
 *
 * ## Example
 *
 * Sharing a totally synchronous observable
 *
 * ```ts
 * import { of, tap, connect, merge, map, filter } from 'rxjs';
 *
 * const source$ = of(1, 2, 3, 4, 5).pipe(
 *   tap({
 *     subscribe: () => console.log('subscription started'),
 *     next: n => console.log(`source emitted ${ n }`)
 *   })
 * );
 *
 * source$.pipe(
 *   // Notice in here we're merging 3 subscriptions to `shared$`.
 *   connect(shared$ => merge(
 *     shared$.pipe(map(n => `all ${ n }`)),
 *     shared$.pipe(filter(n => n % 2 === 0), map(n => `even ${ n }`)),
 *     shared$.pipe(filter(n => n % 2 === 1), map(n => `odd ${ n }`))
 *   ))
 * )
 * .subscribe(console.log);
 *
 * // Expected output: (notice only one subscription)
 * 'subscription started'
 * 'source emitted 1'
 * 'all 1'
 * 'odd 1'
 * 'source emitted 2'
 * 'all 2'
 * 'even 2'
 * 'source emitted 3'
 * 'all 3'
 * 'odd 3'
 * 'source emitted 4'
 * 'all 4'
 * 'even 4'
 * 'source emitted 5'
 * 'all 5'
 * 'odd 5'
 * ```
 *
 * @param selector A function used to set up the multicast. Gives you a multicast observable
 * that is not yet connected. With that, you're expected to create and return
 * and Observable, that when subscribed to, will utilize the multicast observable.
 * After this function is executed -- and its return value subscribed to -- the
 * operator will subscribe to the source, and the connection will be made.
 * @param config The configuration object for `connect`.
 */
export function connect<T, O extends ObservableInput<unknown>>(
  selector: (shared: Observable<T>) => O,
  config: ConnectConfig<T> = DEFAULT_CONFIG
): OperatorFunction<T, ObservedValueOf<O>> {
  const { connector } = config;
  return operate((source, subscriber) => {
    const subject = connector();
    innerFrom(selector(fromSubscribable(subject))).subscribe(subscriber);
    subscriber.add(source.subscribe(subject));
  });
}
import { OperatorFunction } from '../types';
import { reduce } from './reduce';

/**
 * Counts the number of emissions on the source and emits that number when the
 * source completes.
 *
 * <span class="informal">Tells how many values were emitted, when the source
 * completes.</span>
 *
 * ![](count.png)
 *
 * `count` transforms an Observable that emits values into an Observable that
 * emits a single value that represents the number of values emitted by the
 * source Observable. If the source Observable terminates with an error, `count`
 * will pass this error notification along without emitting a value first. If
 * the source Observable does not terminate at all, `count` will neither emit
 * a value nor terminate. This operator takes an optional `predicate` function
 * as argument, in which case the output emission will represent the number of
 * source values that matched `true` with the `predicate`.
 *
 * ## Examples
 *
 * Counts how many seconds have passed before the first click happened
 *
 * ```ts
 * import { interval, fromEvent, takeUntil, count } from 'rxjs';
 *
 * const seconds = interval(1000);
 * const clicks = fromEvent(document, 'click');
 * const secondsBeforeClick = seconds.pipe(takeUntil(clicks));
 * const result = secondsBeforeClick.pipe(count());
 * result.subscribe(x => console.log(x));
 * ```
 *
 * Counts how many odd numbers are there between 1 and 7
 *
 * ```ts
 * import { range, count } from 'rxjs';
 *
 * const numbers = range(1, 7);
 * const result = numbers.pipe(count(i => i % 2 === 1));
 * result.subscribe(x => console.log(x));
 * // Results in:
 * // 4
 * ```
 *
 * @see {@link max}
 * @see {@link min}
 * @see {@link reduce}
 *
 * @param predicate A function that is used to analyze the value and the index and
 * determine whether or not to increment the count. Return `true` to increment the count,
 * and return `false` to keep the count the same.
 * If the predicate is not provided, every value will be counted.
 * @return A function that returns an Observable that emits one number that
 * represents the count of emissions.
 */
export function count<T>(predicate?: (value: T, index: number) => boolean): OperatorFunction<T, number> {
  return reduce((total, value, i) => (!predicate || predicate(value, i) ? total + 1 : total), 0);
}
import { Subscriber } from '../Subscriber';
import { MonoTypeOperatorFunction, ObservableInput } from '../types';
import { operate } from '../util/lift';
import { noop } from '../util/noop';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';

/**
 * Emits a notification from the source Observable only after a particular time span
 * determined by another Observable has passed without another source emission.
 *
 * <span class="informal">It's like {@link debounceTime}, but the time span of
 * emission silence is determined by a second Observable.</span>
 *
 * ![](debounce.svg)
 *
 * `debounce` delays notifications emitted by the source Observable, but drops previous
 * pending delayed emissions if a new notification arrives on the source Observable.
 * This operator keeps track of the most recent notification from the source
 * Observable, and spawns a duration Observable by calling the
 * `durationSelector` function. The notification is emitted only when the duration
 * Observable emits a next notification, and if no other notification was emitted on
 * the source Observable since the duration Observable was spawned. If a new
 * notification appears before the duration Observable emits, the previous notification will
 * not be emitted and a new duration is scheduled from `durationSelector` is scheduled.
 * If the completing event happens during the scheduled duration the last cached notification
 * is emitted before the completion event is forwarded to the output observable.
 * If the error event happens during the scheduled duration or after it only the error event is
 * forwarded to the output observable. The cache notification is not emitted in this case.
 *
 * Like {@link debounceTime}, this is a rate-limiting operator, and also a
 * delay-like operator since output emissions do not necessarily occur at the
 * same time as they did on the source Observable.
 *
 * ## Example
 *
 * Emit the most recent click after a burst of clicks
 *
 * ```ts
 * import { fromEvent, scan, debounce, interval } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(
 *   scan(i => ++i, 1),
 *   debounce(i => interval(200 * i))
 * );
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link audit}
 * @see {@link auditTime}
 * @see {@link debounceTime}
 * @see {@link delay}
 * @see {@link sample}
 * @see {@link sampleTime}
 * @see {@link throttle}
 * @see {@link throttleTime}
 *
 * @param durationSelector A function
 * that receives a value from the source Observable, for computing the timeout
 * duration for each source value, returned as an Observable or a Promise.
 * @return A function that returns an Observable that delays the emissions of
 * the source Observable by the specified duration Observable returned by
 * `durationSelector`, and may drop some values if they occur too frequently.
 */
export function debounce<T>(durationSelector: (value: T) => ObservableInput<any>): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    let hasValue = false;
    let lastValue: T | null = null;
    // The subscriber/subscription for the current debounce, if there is one.
    let durationSubscriber: Subscriber<any> | null = null;

    const emit = () => {
      // Unsubscribe any current debounce subscription we have,
      // we only cared about the first notification from it, and we
      // want to clean that subscription up as soon as possible.
      durationSubscriber?.unsubscribe();
      durationSubscriber = null;
      if (hasValue) {
        // We have a value! Free up memory first, then emit the value.
        hasValue = false;
        const value = lastValue!;
        lastValue = null;
        subscriber.next(value);
      }
    };

    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value: T) => {
          // Cancel any pending debounce duration. We don't
          // need to null it out here yet tho, because we're just going
          // to create another one in a few lines.
          durationSubscriber?.unsubscribe();
          hasValue = true;
          lastValue = value;
          // Capture our duration subscriber, so we can unsubscribe it when we're notified
          // and we're going to emit the value.
          durationSubscriber = createOperatorSubscriber(subscriber, emit, noop);
          // Subscribe to the duration.
          innerFrom(durationSelector(value)).subscribe(durationSubscriber);
        },
        () => {
          // Source completed.
          // Emit any pending debounced values then complete
          emit();
          subscriber.complete();
        },
        // Pass all errors through to consumer
        undefined,
        () => {
          // Finalization.
          lastValue = durationSubscriber = null;
        }
      )
    );
  });
}
import { asyncScheduler } from '../scheduler/async';
import { Subscription } from '../Subscription';
import { MonoTypeOperatorFunction, SchedulerAction, SchedulerLike } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Emits a notification from the source Observable only after a particular time span
 * has passed without another source emission.
 *
 * <span class="informal">It's like {@link delay}, but passes only the most
 * recent notification from each burst of emissions.</span>
 *
 * ![](debounceTime.png)
 *
 * `debounceTime` delays notifications emitted by the source Observable, but drops
 * previous pending delayed emissions if a new notification arrives on the source
 * Observable. This operator keeps track of the most recent notification from the
 * source Observable, and emits that only when `dueTime` has passed
 * without any other notification appearing on the source Observable. If a new value
 * appears before `dueTime` silence occurs, the previous notification will be dropped
 * and will not be emitted and a new `dueTime` is scheduled.
 * If the completing event happens during `dueTime` the last cached notification
 * is emitted before the completion event is forwarded to the output observable.
 * If the error event happens during `dueTime` or after it only the error event is
 * forwarded to the output observable. The cache notification is not emitted in this case.
 *
 * This is a rate-limiting operator, because it is impossible for more than one
 * notification to be emitted in any time window of duration `dueTime`, but it is also
 * a delay-like operator since output emissions do not occur at the same time as
 * they did on the source Observable. Optionally takes a {@link SchedulerLike} for
 * managing timers.
 *
 * ## Example
 *
 * Emit the most recent click after a burst of clicks
 *
 * ```ts
 * import { fromEvent, debounceTime } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(debounceTime(1000));
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link audit}
 * @see {@link auditTime}
 * @see {@link debounce}
 * @see {@link sample}
 * @see {@link sampleTime}
 * @see {@link throttle}
 * @see {@link throttleTime}
 *
 * @param {number} dueTime The timeout duration in milliseconds (or the time
 * unit determined internally by the optional `scheduler`) for the window of
 * time required to wait for emission silence before emitting the most recent
 * source value.
 * @param {SchedulerLike} [scheduler=async] The {@link SchedulerLike} to use for
 * managing the timers that handle the timeout for each value.
 * @return A function that returns an Observable that delays the emissions of
 * the source Observable by the specified `dueTime`, and may drop some values
 * if they occur too frequently.
 */
export function debounceTime<T>(dueTime: number, scheduler: SchedulerLike = asyncScheduler): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    let activeTask: Subscription | null = null;
    let lastValue: T | null = null;
    let lastTime: number | null = null;

    const emit = () => {
      if (activeTask) {
        // We have a value! Free up memory first, then emit the value.
        activeTask.unsubscribe();
        activeTask = null;
        const value = lastValue!;
        lastValue = null;
        subscriber.next(value);
      }
    };
    function emitWhenIdle(this: SchedulerAction<unknown>) {
      // This is called `dueTime` after the first value
      // but we might have received new values during this window!

      const targetTime = lastTime! + dueTime;
      const now = scheduler.now();
      if (now < targetTime) {
        // On that case, re-schedule to the new target
        activeTask = this.schedule(undefined, targetTime - now);
        subscriber.add(activeTask);
        return;
      }

      emit();
    }

    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value: T) => {
          lastValue = value;
          lastTime = scheduler.now();

          // Only set up a task if it's not already up
          if (!activeTask) {
            activeTask = scheduler.schedule(emitWhenIdle, dueTime);
            subscriber.add(activeTask);
          }
        },
        () => {
          // Source completed.
          // Emit any pending debounced values then complete
          emit();
          subscriber.complete();
        },
        // Pass all errors through to consumer.
        undefined,
        () => {
          // Finalization.
          lastValue = activeTask = null;
        }
      )
    );
  });
}
import { OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Emits a given value if the source Observable completes without emitting any
 * `next` value, otherwise mirrors the source Observable.
 *
 * <span class="informal">If the source Observable turns out to be empty, then
 * this operator will emit a default value.</span>
 *
 * ![](defaultIfEmpty.png)
 *
 * `defaultIfEmpty` emits the values emitted by the source Observable or a
 * specified default value if the source Observable is empty (completes without
 * having emitted any `next` value).
 *
 * ## Example
 *
 * If no clicks happen in 5 seconds, then emit 'no clicks'
 *
 * ```ts
 * import { fromEvent, takeUntil, interval, defaultIfEmpty } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const clicksBeforeFive = clicks.pipe(takeUntil(interval(5000)));
 * const result = clicksBeforeFive.pipe(defaultIfEmpty('no clicks'));
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link empty}
 * @see {@link last}
 *
 * @param defaultValue The default value used if the source
 * Observable is empty.
 * @return A function that returns an Observable that emits either the
 * specified `defaultValue` if the source Observable emits no items, or the
 * values emitted by the source Observable.
 */
export function defaultIfEmpty<T, R>(defaultValue: R): OperatorFunction<T, T | R> {
  return operate((source, subscriber) => {
    let hasValue = false;
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => {
          hasValue = true;
          subscriber.next(value);
        },
        () => {
          if (!hasValue) {
            subscriber.next(defaultValue!);
          }
          subscriber.complete();
        }
      )
    );
  });
}
import { asyncScheduler } from '../scheduler/async';
import { MonoTypeOperatorFunction, SchedulerLike } from '../types';
import { delayWhen } from './delayWhen';
import { timer } from '../observable/timer';

/**
 * Delays the emission of items from the source Observable by a given timeout or
 * until a given Date.
 *
 * <span class="informal">Time shifts each item by some specified amount of
 * milliseconds.</span>
 *
 * ![](delay.svg)
 *
 * If the delay argument is a Number, this operator time shifts the source
 * Observable by that amount of time expressed in milliseconds. The relative
 * time intervals between the values are preserved.
 *
 * If the delay argument is a Date, this operator time shifts the start of the
 * Observable execution until the given date occurs.
 *
 * ## Examples
 *
 * Delay each click by one second
 *
 * ```ts
 * import { fromEvent, delay } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const delayedClicks = clicks.pipe(delay(1000)); // each click emitted after 1 second
 * delayedClicks.subscribe(x => console.log(x));
 * ```
 *
 * Delay all clicks until a future date happens
 *
 * ```ts
 * import { fromEvent, delay } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const date = new Date('March 15, 2050 12:00:00'); // in the future
 * const delayedClicks = clicks.pipe(delay(date)); // click emitted only after that date
 * delayedClicks.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link delayWhen}
 * @see {@link throttle}
 * @see {@link throttleTime}
 * @see {@link debounce}
 * @see {@link debounceTime}
 * @see {@link sample}
 * @see {@link sampleTime}
 * @see {@link audit}
 * @see {@link auditTime}
 *
 * @param {number|Date} due The delay duration in milliseconds (a `number`) or
 * a `Date` until which the emission of the source items is delayed.
 * @param {SchedulerLike} [scheduler=async] The {@link SchedulerLike} to use for
 * managing the timers that handle the time-shift for each item.
 * @return A function that returns an Observable that delays the emissions of
 * the source Observable by the specified timeout or Date.
 */
export function delay<T>(due: number | Date, scheduler: SchedulerLike = asyncScheduler): MonoTypeOperatorFunction<T> {
  const duration = timer(due, scheduler);
  return delayWhen(() => duration);
}
import { Observable } from '../Observable';
import { MonoTypeOperatorFunction } from '../types';
import { concat } from '../observable/concat';
import { take } from './take';
import { ignoreElements } from './ignoreElements';
import { mapTo } from './mapTo';
import { mergeMap } from './mergeMap';

/** @deprecated The `subscriptionDelay` parameter will be removed in v8. */
export function delayWhen<T>(
  delayDurationSelector: (value: T, index: number) => Observable<any>,
  subscriptionDelay: Observable<any>
): MonoTypeOperatorFunction<T>;
export function delayWhen<T>(delayDurationSelector: (value: T, index: number) => Observable<any>): MonoTypeOperatorFunction<T>;

/**
 * Delays the emission of items from the source Observable by a given time span
 * determined by the emissions of another Observable.
 *
 * <span class="informal">It's like {@link delay}, but the time span of the
 * delay duration is determined by a second Observable.</span>
 *
 * ![](delayWhen.png)
 *
 * `delayWhen` time shifts each emitted value from the source Observable by a
 * time span determined by another Observable. When the source emits a value,
 * the `delayDurationSelector` function is called with the source value as
 * argument, and should return an Observable, called the "duration" Observable.
 * The source value is emitted on the output Observable only when the duration
 * Observable emits a value or completes.
 * The completion of the notifier triggering the emission of the source value
 * is deprecated behavior and will be removed in future versions.
 *
 * Optionally, `delayWhen` takes a second argument, `subscriptionDelay`, which
 * is an Observable. When `subscriptionDelay` emits its first value or
 * completes, the source Observable is subscribed to and starts behaving like
 * described in the previous paragraph. If `subscriptionDelay` is not provided,
 * `delayWhen` will subscribe to the source Observable as soon as the output
 * Observable is subscribed.
 *
 * ## Example
 *
 * Delay each click by a random amount of time, between 0 and 5 seconds
 *
 * ```ts
 * import { fromEvent, delayWhen, interval } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const delayedClicks = clicks.pipe(
 *   delayWhen(() => interval(Math.random() * 5000))
 * );
 * delayedClicks.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link delay}
 * @see {@link throttle}
 * @see {@link throttleTime}
 * @see {@link debounce}
 * @see {@link debounceTime}
 * @see {@link sample}
 * @see {@link sampleTime}
 * @see {@link audit}
 * @see {@link auditTime}
 *
 * @param {function(value: T, index: number): Observable} delayDurationSelector A function that
 * returns an Observable for each value emitted by the source Observable, which
 * is then used to delay the emission of that item on the output Observable
 * until the Observable returned from this function emits a value.
 * @param {Observable} subscriptionDelay An Observable that triggers the
 * subscription to the source Observable once it emits any value.
 * @return A function that returns an Observable that delays the emissions of
 * the source Observable by an amount of time specified by the Observable
 * returned by `delayDurationSelector`.
 */
export function delayWhen<T>(
  delayDurationSelector: (value: T, index: number) => Observable<any>,
  subscriptionDelay?: Observable<any>
): MonoTypeOperatorFunction<T> {
  if (subscriptionDelay) {
    // DEPRECATED PATH
    return (source: Observable<T>) =>
      concat(subscriptionDelay.pipe(take(1), ignoreElements()), source.pipe(delayWhen(delayDurationSelector)));
  }

  return mergeMap((value, index) => delayDurationSelector(value, index).pipe(take(1), mapTo(value)));
}
import { observeNotification } from '../Notification';
import { OperatorFunction, ObservableNotification, ValueFromNotification } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Converts an Observable of {@link ObservableNotification} objects into the emissions
 * that they represent.
 *
 * <span class="informal">Unwraps {@link ObservableNotification} objects as actual `next`,
 * `error` and `complete` emissions. The opposite of {@link materialize}.</span>
 *
 * ![](dematerialize.png)
 *
 * `dematerialize` is assumed to operate an Observable that only emits
 * {@link ObservableNotification} objects as `next` emissions, and does not emit any
 * `error`. Such Observable is the output of a `materialize` operation. Those
 * notifications are then unwrapped using the metadata they contain, and emitted
 * as `next`, `error`, and `complete` on the output Observable.
 *
 * Use this operator in conjunction with {@link materialize}.
 *
 * ## Example
 *
 * Convert an Observable of Notifications to an actual Observable
 *
 * ```ts
 * import { NextNotification, ErrorNotification, of, dematerialize } from 'rxjs';
 *
 * const notifA: NextNotification<string> = { kind: 'N', value: 'A' };
 * const notifB: NextNotification<string> = { kind: 'N', value: 'B' };
 * const notifE: ErrorNotification = { kind: 'E', error: new TypeError('x.toUpperCase is not a function') };
 *
 * const materialized = of(notifA, notifB, notifE);
 *
 * const upperCase = materialized.pipe(dematerialize());
 * upperCase.subscribe({
 *   next: x => console.log(x),
 *   error: e => console.error(e)
 * });
 *
 * // Results in:
 * // A
 * // B
 * // TypeError: x.toUpperCase is not a function
 * ```
 *
 * @see {@link materialize}
 *
 * @return A function that returns an Observable that emits items and
 * notifications embedded in Notification objects emitted by the source
 * Observable.
 */
export function dematerialize<N extends ObservableNotification<any>>(): OperatorFunction<N, ValueFromNotification<N>> {
  return operate((source, subscriber) => {
    source.subscribe(createOperatorSubscriber(subscriber, (notification) => observeNotification(notification, subscriber)));
  });
}
import { Observable } from '../Observable';
import { MonoTypeOperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { noop } from '../util/noop';

/**
 * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from previous items.
 *
 * If a `keySelector` function is provided, then it will project each value from the source observable into a new value that it will
 * check for equality with previously projected values. If the `keySelector` function is not provided, it will use each value from the
 * source observable directly with an equality check against previous values.
 *
 * In JavaScript runtimes that support `Set`, this operator will use a `Set` to improve performance of the distinct value checking.
 *
 * In other runtimes, this operator will use a minimal implementation of `Set` that relies on an `Array` and `indexOf` under the
 * hood, so performance will degrade as more values are checked for distinction. Even in newer browsers, a long-running `distinct`
 * use might result in memory leaks. To help alleviate this in some scenarios, an optional `flushes` parameter is also provided so
 * that the internal `Set` can be "flushed", basically clearing it of values.
 *
 * ## Examples
 *
 * A simple example with numbers
 *
 * ```ts
 * import { of, distinct } from 'rxjs';
 *
 * of(1, 1, 2, 2, 2, 1, 2, 3, 4, 3, 2, 1)
 *   .pipe(distinct())
 *   .subscribe(x => console.log(x));
 *
 * // Outputs
 * // 1
 * // 2
 * // 3
 * // 4
 * ```
 *
 * An example using the `keySelector` function
 *
 * ```ts
 * import { of, distinct } from 'rxjs';
 *
 * of(
 *   { age: 4, name: 'Foo'},
 *   { age: 7, name: 'Bar'},
 *   { age: 5, name: 'Foo'}
 * )
 * .pipe(distinct(({ name }) => name))
 * .subscribe(x => console.log(x));
 *
 * // Outputs
 * // { age: 4, name: 'Foo' }
 * // { age: 7, name: 'Bar' }
 * ```
 * @see {@link distinctUntilChanged}
 * @see {@link distinctUntilKeyChanged}
 *
 * @param {function} [keySelector] Optional function to select which value you want to check as distinct.
 * @param {Observable} [flushes] Optional Observable for flushing the internal HashSet of the operator.
 * @return A function that returns an Observable that emits items from the
 * source Observable with distinct values.
 */
export function distinct<T, K>(keySelector?: (value: T) => K, flushes?: Observable<any>): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    const distinctKeys = new Set();
    source.subscribe(
      createOperatorSubscriber(subscriber, (value) => {
        const key = keySelector ? keySelector(value) : value;
        if (!distinctKeys.has(key)) {
          distinctKeys.add(key);
          subscriber.next(value);
        }
      })
    );

    flushes?.subscribe(createOperatorSubscriber(subscriber, () => distinctKeys.clear(), noop));
  });
}
import { MonoTypeOperatorFunction } from '../types';
import { identity } from '../util/identity';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

export function distinctUntilChanged<T>(comparator?: (previous: T, current: T) => boolean): MonoTypeOperatorFunction<T>;
export function distinctUntilChanged<T, K>(
  comparator: (previous: K, current: K) => boolean,
  keySelector: (value: T) => K
): MonoTypeOperatorFunction<T>;

/**
 * Returns a result {@link Observable} that emits all values pushed by the source observable if they
 * are distinct in comparison to the last value the result observable emitted.
 *
 * When provided without parameters or with the first parameter (`{@link distinctUntilChanged#comparator comparator}`),
 * it behaves like this:
 *
 * 1. It will always emit the first value from the source.
 * 2. For all subsequent values pushed by the source, they will be compared to the previously emitted values
 *    using the provided `comparator` or an `===` equality check.
 * 3. If the value pushed by the source is determined to be unequal by this check, that value is emitted and
 *    becomes the new "previously emitted value" internally.
 *
 * When the second parameter (`{@link distinctUntilChanged#keySelector keySelector}`) is provided, the behavior
 * changes:
 *
 * 1. It will always emit the first value from the source.
 * 2. The `keySelector` will be run against all values, including the first value.
 * 3. For all values after the first, the selected key will be compared against the key selected from
 *    the previously emitted value using the `comparator`.
 * 4. If the keys are determined to be unequal by this check, the value (not the key), is emitted
 *    and the selected key from that value is saved for future comparisons against other keys.
 *
 * ## Examples
 *
 * A very basic example with no `{@link distinctUntilChanged#comparator comparator}`. Note that `1` is emitted more than once,
 * because it's distinct in comparison to the _previously emitted_ value,
 * not in comparison to _all other emitted values_.
 *
 * ```ts
 * import { of, distinctUntilChanged } from 'rxjs';
 *
 * of(1, 1, 1, 2, 2, 2, 1, 1, 3, 3)
 *   .pipe(distinctUntilChanged())
 *   .subscribe(console.log);
 * // Logs: 1, 2, 1, 3
 * ```
 *
 * With a `{@link distinctUntilChanged#comparator comparator}`, you can do custom comparisons. Let's say
 * you only want to emit a value when all of its components have
 * changed:
 *
 * ```ts
 * import { of, distinctUntilChanged } from 'rxjs';
 *
 * const totallyDifferentBuilds$ = of(
 *   { engineVersion: '1.1.0', transmissionVersion: '1.2.0' },
 *   { engineVersion: '1.1.0', transmissionVersion: '1.4.0' },
 *   { engineVersion: '1.3.0', transmissionVersion: '1.4.0' },
 *   { engineVersion: '1.3.0', transmissionVersion: '1.5.0' },
 *   { engineVersion: '2.0.0', transmissionVersion: '1.5.0' }
 * ).pipe(
 *   distinctUntilChanged((prev, curr) => {
 *     return (
 *       prev.engineVersion === curr.engineVersion ||
 *       prev.transmissionVersion === curr.transmissionVersion
 *     );
 *   })
 * );
 *
 * totallyDifferentBuilds$.subscribe(console.log);
 *
 * // Logs:
 * // { engineVersion: '1.1.0', transmissionVersion: '1.2.0' }
 * // { engineVersion: '1.3.0', transmissionVersion: '1.4.0' }
 * // { engineVersion: '2.0.0', transmissionVersion: '1.5.0' }
 * ```
 *
 * You can also provide a custom `{@link distinctUntilChanged#comparator comparator}` to check that emitted
 * changes are only in one direction. Let's say you only want to get
 * the next record temperature:
 *
 * ```ts
 * import { of, distinctUntilChanged } from 'rxjs';
 *
 * const temps$ = of(30, 31, 20, 34, 33, 29, 35, 20);
 *
 * const recordHighs$ = temps$.pipe(
 *   distinctUntilChanged((prevHigh, temp) => {
 *     // If the current temp is less than
 *     // or the same as the previous record,
 *     // the record hasn't changed.
 *     return temp <= prevHigh;
 *   })
 * );
 *
 * recordHighs$.subscribe(console.log);
 * // Logs: 30, 31, 34, 35
 * ```
 *
 * Selecting update events only when the `updatedBy` field shows
 * the account changed hands.
 *
 * ```ts
 * import { of, distinctUntilChanged } from 'rxjs';
 *
 * // A stream of updates to a given account
 * const accountUpdates$ = of(
 *   { updatedBy: 'blesh', data: [] },
 *   { updatedBy: 'blesh', data: [] },
 *   { updatedBy: 'ncjamieson', data: [] },
 *   { updatedBy: 'ncjamieson', data: [] },
 *   { updatedBy: 'blesh', data: [] }
 * );
 *
 * // We only want the events where it changed hands
 * const changedHands$ = accountUpdates$.pipe(
 *   distinctUntilChanged(undefined, update => update.updatedBy)
 * );
 *
 * changedHands$.subscribe(console.log);
 * // Logs:
 * // { updatedBy: 'blesh', data: Array[0] }
 * // { updatedBy: 'ncjamieson', data: Array[0] }
 * // { updatedBy: 'blesh', data: Array[0] }
 * ```
 *
 * @see {@link distinct}
 * @see {@link distinctUntilKeyChanged}
 *
 * @param comparator A function used to compare the previous and current keys for
 * equality. Defaults to a `===` check.
 * @param keySelector Used to select a key value to be passed to the `comparator`.
 *
 * @return A function that returns an Observable that emits items from the
 * source Observable with distinct values.
 */
export function distinctUntilChanged<T, K>(
  comparator?: (previous: K, current: K) => boolean,
  keySelector: (value: T) => K = identity as (value: T) => K
): MonoTypeOperatorFunction<T> {
  // We've been allowing `null` do be passed as the `compare`, so we can't do
  // a default value for the parameter, because that will only work
  // for `undefined`.
  comparator = comparator ?? defaultCompare;

  return operate((source, subscriber) => {
    // The previous key, used to compare against keys selected
    // from new arrivals to determine "distinctiveness".
    let previousKey: K;
    // Whether or not this is the first value we've gotten.
    let first = true;

    source.subscribe(
      createOperatorSubscriber(subscriber, (value) => {
        // We always call the key selector.
        const currentKey = keySelector(value);

        // If it's the first value, we always emit it.
        // Otherwise, we compare this key to the previous key, and
        // if the comparer returns false, we emit.
        if (first || !comparator!(previousKey, currentKey)) {
          // Update our state *before* we emit the value
          // as emission can be the source of re-entrant code
          // in functional libraries like this. We only really
          // need to do this if it's the first value, or if the
          // key we're tracking in previous needs to change.
          first = false;
          previousKey = currentKey;

          // Emit the value!
          subscriber.next(value);
        }
      })
    );
  });
}

function defaultCompare(a: any, b: any) {
  return a === b;
}
import { distinctUntilChanged } from './distinctUntilChanged';
import { MonoTypeOperatorFunction } from '../types';

/* tslint:disable:max-line-length */
export function distinctUntilKeyChanged<T>(key: keyof T): MonoTypeOperatorFunction<T>;
export function distinctUntilKeyChanged<T, K extends keyof T>(key: K, compare: (x: T[K], y: T[K]) => boolean): MonoTypeOperatorFunction<T>;
/* tslint:enable:max-line-length */

/**
 * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from the previous item,
 * using a property accessed by using the key provided to check if the two items are distinct.
 *
 * If a comparator function is provided, then it will be called for each item to test for whether or not that value should be emitted.
 *
 * If a comparator function is not provided, an equality check is used by default.
 *
 * ## Examples
 *
 * An example comparing the name of persons
 *
 * ```ts
 * import { of, distinctUntilKeyChanged } from 'rxjs';
 *
 * of(
 *   { age: 4, name: 'Foo' },
 *   { age: 7, name: 'Bar' },
 *   { age: 5, name: 'Foo' },
 *   { age: 6, name: 'Foo' }
 * ).pipe(
 *   distinctUntilKeyChanged('name')
 * )
 * .subscribe(x => console.log(x));
 *
 * // displays:
 * // { age: 4, name: 'Foo' }
 * // { age: 7, name: 'Bar' }
 * // { age: 5, name: 'Foo' }
 * ```
 *
 * An example comparing the first letters of the name
 *
 * ```ts
 * import { of, distinctUntilKeyChanged } from 'rxjs';
 *
 * of(
 *   { age: 4, name: 'Foo1' },
 *   { age: 7, name: 'Bar' },
 *   { age: 5, name: 'Foo2' },
 *   { age: 6, name: 'Foo3' }
 * ).pipe(
 *   distinctUntilKeyChanged('name', (x, y) => x.substring(0, 3) === y.substring(0, 3))
 * )
 * .subscribe(x => console.log(x));
 *
 * // displays:
 * // { age: 4, name: 'Foo1' }
 * // { age: 7, name: 'Bar' }
 * // { age: 5, name: 'Foo2' }
 * ```
 *
 * @see {@link distinct}
 * @see {@link distinctUntilChanged}
 *
 * @param {string} key String key for object property lookup on each item.
 * @param {function} [compare] Optional comparison function called to test if an item is distinct from the previous item in the source.
 * @return A function that returns an Observable that emits items from the
 * source Observable with distinct values based on the key specified.
 */
export function distinctUntilKeyChanged<T, K extends keyof T>(key: K, compare?: (x: T[K], y: T[K]) => boolean): MonoTypeOperatorFunction<T> {
  return distinctUntilChanged((x: T, y: T) => compare ? compare(x[key], y[key]) : x[key] === y[key]);
}
import { ArgumentOutOfRangeError } from '../util/ArgumentOutOfRangeError';
import { Observable } from '../Observable';
import { OperatorFunction } from '../types';
import { filter } from './filter';
import { throwIfEmpty } from './throwIfEmpty';
import { defaultIfEmpty } from './defaultIfEmpty';
import { take } from './take';

/**
 * Emits the single value at the specified `index` in a sequence of emissions
 * from the source Observable.
 *
 * <span class="informal">Emits only the i-th value, then completes.</span>
 *
 * ![](elementAt.png)
 *
 * `elementAt` returns an Observable that emits the item at the specified
 * `index` in the source Observable, or a default value if that `index` is out
 * of range and the `default` argument is provided. If the `default` argument is
 * not given and the `index` is out of range, the output Observable will emit an
 * `ArgumentOutOfRangeError` error.
 *
 * ## Example
 *
 * Emit only the third click event
 *
 * ```ts
 * import { fromEvent, elementAt } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(elementAt(2));
 * result.subscribe(x => console.log(x));
 *
 * // Results in:
 * // click 1 = nothing
 * // click 2 = nothing
 * // click 3 = MouseEvent object logged to console
 * ```
 *
 * @see {@link first}
 * @see {@link last}
 * @see {@link skip}
 * @see {@link single}
 * @see {@link take}
 *
 * @throws {ArgumentOutOfRangeError} When using `elementAt(i)`, it delivers an
 * ArgumentOutOfRangeError to the Observer's `error` callback if `i < 0` or the
 * Observable has completed before emitting the i-th `next` notification.
 *
 * @param {number} index Is the number `i` for the i-th source emission that has
 * happened since the subscription, starting from the number `0`.
 * @param {T} [defaultValue] The default value returned for missing indices.
 * @return A function that returns an Observable that emits a single item, if
 * it is found. Otherwise, it will emit the default value if given. If not, it
 * emits an error.
 */
export function elementAt<T, D = T>(index: number, defaultValue?: D): OperatorFunction<T, T | D> {
  if (index < 0) {
    throw new ArgumentOutOfRangeError();
  }
  const hasDefaultValue = arguments.length >= 2;
  return (source: Observable<T>) =>
    source.pipe(
      filter((v, i) => i === index),
      take(1),
      hasDefaultValue ? defaultIfEmpty(defaultValue!) : throwIfEmpty(() => new ArgumentOutOfRangeError())
    );
}
/** prettier */
import { Observable } from '../Observable';
import { concat } from '../observable/concat';
import { of } from '../observable/of';
import { MonoTypeOperatorFunction, SchedulerLike, OperatorFunction, ValueFromArray } from '../types';

/** @deprecated The `scheduler` parameter will be removed in v8. Use `scheduled` and `concatAll`. Details: https://rxjs.dev/deprecations/scheduler-argument */
export function endWith<T>(scheduler: SchedulerLike): MonoTypeOperatorFunction<T>;
/** @deprecated The `scheduler` parameter will be removed in v8. Use `scheduled` and `concatAll`. Details: https://rxjs.dev/deprecations/scheduler-argument */
export function endWith<T, A extends unknown[] = T[]>(
  ...valuesAndScheduler: [...A, SchedulerLike]
): OperatorFunction<T, T | ValueFromArray<A>>;

export function endWith<T, A extends unknown[] = T[]>(...values: A): OperatorFunction<T, T | ValueFromArray<A>>;

/**
 * Returns an observable that will emit all values from the source, then synchronously emit
 * the provided value(s) immediately after the source completes.
 *
 * NOTE: Passing a last argument of a Scheduler is _deprecated_, and may result in incorrect
 * types in TypeScript.
 *
 * This is useful for knowing when an observable ends. Particularly when paired with an
 * operator like {@link takeUntil}
 *
 * ![](endWith.png)
 *
 * ## Example
 *
 * Emit values to know when an interval starts and stops. The interval will
 * stop when a user clicks anywhere on the document.
 *
 * ```ts
 * import { interval, map, fromEvent, startWith, takeUntil, endWith } from 'rxjs';
 *
 * const ticker$ = interval(5000).pipe(
 *   map(() => 'tick')
 * );
 *
 * const documentClicks$ = fromEvent(document, 'click');
 *
 * ticker$.pipe(
 *   startWith('interval started'),
 *   takeUntil(documentClicks$),
 *   endWith('interval ended by click')
 * )
 * .subscribe(x => console.log(x));
 *
 * // Result (assuming a user clicks after 15 seconds)
 * // 'interval started'
 * // 'tick'
 * // 'tick'
 * // 'tick'
 * // 'interval ended by click'
 * ```
 *
 * @see {@link startWith}
 * @see {@link concat}
 * @see {@link takeUntil}
 *
 * @param values Items you want the modified Observable to emit last.
 * @return A function that returns an Observable that emits all values from the
 * source, then synchronously emits the provided value(s) immediately after the
 * source completes.
 */
export function endWith<T>(...values: Array<T | SchedulerLike>): MonoTypeOperatorFunction<T> {
  return (source: Observable<T>) => concat(source, of(...values)) as Observable<T>;
}
import { Observable } from '../Observable';
import { Falsy, OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

export function every<T>(predicate: BooleanConstructor): OperatorFunction<T, Exclude<T, Falsy> extends never ? false : boolean>;
/** @deprecated Use a closure instead of a `thisArg`. Signatures accepting a `thisArg` will be removed in v8. */
export function every<T>(
  predicate: BooleanConstructor,
  thisArg: any
): OperatorFunction<T, Exclude<T, Falsy> extends never ? false : boolean>;
/** @deprecated Use a closure instead of a `thisArg`. Signatures accepting a `thisArg` will be removed in v8. */
export function every<T, A>(
  predicate: (this: A, value: T, index: number, source: Observable<T>) => boolean,
  thisArg: A
): OperatorFunction<T, boolean>;
export function every<T>(predicate: (value: T, index: number, source: Observable<T>) => boolean): OperatorFunction<T, boolean>;

/**
 * Returns an Observable that emits whether or not every item of the source satisfies the condition specified.
 *
 * <span class="informal">If all values pass predicate before the source completes, emits true before completion,
 * otherwise emit false, then complete.</span>
 *
 * ![](every.png)
 *
 * ## Example
 *
 * A simple example emitting true if all elements are less than 5, false otherwise
 *
 * ```ts
 * import { of, every } from 'rxjs';
 *
 * of(1, 2, 3, 4, 5, 6)
 *   .pipe(every(x => x < 5))
 *   .subscribe(x => console.log(x)); // -> false
 * ```
 *
 * @param {function} predicate A function for determining if an item meets a specified condition.
 * @param {any} [thisArg] Optional object to use for `this` in the callback.
 * @return A function that returns an Observable of booleans that determines if
 * all items of the source Observable meet the condition specified.
 */
export function every<T>(
  predicate: (value: T, index: number, source: Observable<T>) => boolean,
  thisArg?: any
): OperatorFunction<T, boolean> {
  return operate((source, subscriber) => {
    let index = 0;
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => {
          if (!predicate.call(thisArg, value, index++, source)) {
            subscriber.next(false);
            subscriber.complete();
          }
        },
        () => {
          subscriber.next(true);
          subscriber.complete();
        }
      )
    );
  });
}
import { exhaustAll } from './exhaustAll';

/**
 * @deprecated Renamed to {@link exhaustAll}. Will be removed in v8.
 */
export const exhaust = exhaustAll;
import { OperatorFunction, ObservableInput, ObservedValueOf } from '../types';
import { exhaustMap } from './exhaustMap';
import { identity } from '../util/identity';

/**
 * Converts a higher-order Observable into a first-order Observable by dropping
 * inner Observables while the previous inner Observable has not yet completed.
 *
 * <span class="informal">Flattens an Observable-of-Observables by dropping the
 * next inner Observables while the current inner is still executing.</span>
 *
 * ![](exhaust.png)
 *
 * `exhaustAll` subscribes to an Observable that emits Observables, also known as a
 * higher-order Observable. Each time it observes one of these emitted inner
 * Observables, the output Observable begins emitting the items emitted by that
 * inner Observable. So far, it behaves like {@link mergeAll}. However,
 * `exhaustAll` ignores every new inner Observable if the previous Observable has
 * not yet completed. Once that one completes, it will accept and flatten the
 * next inner Observable and repeat this process.
 *
 * ## Example
 *
 * Run a finite timer for each click, only if there is no currently active timer
 *
 * ```ts
 * import { fromEvent, map, interval, take, exhaustAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const higherOrder = clicks.pipe(
 *   map(() => interval(1000).pipe(take(5)))
 * );
 * const result = higherOrder.pipe(exhaustAll());
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link combineLatestAll}
 * @see {@link concatAll}
 * @see {@link switchAll}
 * @see {@link switchMap}
 * @see {@link mergeAll}
 * @see {@link exhaustMap}
 * @see {@link zipAll}
 *
 * @return A function that returns an Observable that takes a source of
 * Observables and propagates the first Observable exclusively until it
 * completes before subscribing to the next.
 */
export function exhaustAll<O extends ObservableInput<any>>(): OperatorFunction<O, ObservedValueOf<O>> {
  return exhaustMap(identity);
}
import { Observable } from '../Observable';
import { Subscriber } from '../Subscriber';
import { ObservableInput, OperatorFunction, ObservedValueOf } from '../types';
import { map } from './map';
import { innerFrom } from '../observable/innerFrom';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/* tslint:disable:max-line-length */
export function exhaustMap<T, O extends ObservableInput<any>>(
  project: (value: T, index: number) => O
): OperatorFunction<T, ObservedValueOf<O>>;
/** @deprecated The `resultSelector` parameter will be removed in v8. Use an inner `map` instead. Details: https://rxjs.dev/deprecations/resultSelector */
export function exhaustMap<T, O extends ObservableInput<any>>(
  project: (value: T, index: number) => O,
  resultSelector: undefined
): OperatorFunction<T, ObservedValueOf<O>>;
/** @deprecated The `resultSelector` parameter will be removed in v8. Use an inner `map` instead. Details: https://rxjs.dev/deprecations/resultSelector */
export function exhaustMap<T, I, R>(
  project: (value: T, index: number) => ObservableInput<I>,
  resultSelector: (outerValue: T, innerValue: I, outerIndex: number, innerIndex: number) => R
): OperatorFunction<T, R>;
/* tslint:enable:max-line-length */

/**
 * Projects each source value to an Observable which is merged in the output
 * Observable only if the previous projected Observable has completed.
 *
 * <span class="informal">Maps each value to an Observable, then flattens all of
 * these inner Observables using {@link exhaust}.</span>
 *
 * ![](exhaustMap.png)
 *
 * Returns an Observable that emits items based on applying a function that you
 * supply to each item emitted by the source Observable, where that function
 * returns an (so-called "inner") Observable. When it projects a source value to
 * an Observable, the output Observable begins emitting the items emitted by
 * that projected Observable. However, `exhaustMap` ignores every new projected
 * Observable if the previous projected Observable has not yet completed. Once
 * that one completes, it will accept and flatten the next projected Observable
 * and repeat this process.
 *
 * ## Example
 *
 * Run a finite timer for each click, only if there is no currently active timer
 *
 * ```ts
 * import { fromEvent, exhaustMap, interval, take } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(
 *   exhaustMap(() => interval(1000).pipe(take(5)))
 * );
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link concatMap}
 * @see {@link exhaust}
 * @see {@link mergeMap}
 * @see {@link switchMap}
 *
 * @param {function(value: T, ?index: number): ObservableInput} project A function
 * that, when applied to an item emitted by the source Observable, returns an
 * Observable.
 * @return A function that returns an Observable containing projected
 * Observables of each item of the source, ignoring projected Observables that
 * start before their preceding Observable has completed.
 */
export function exhaustMap<T, R, O extends ObservableInput<any>>(
  project: (value: T, index: number) => O,
  resultSelector?: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R
): OperatorFunction<T, ObservedValueOf<O> | R> {
  if (resultSelector) {
    // DEPRECATED PATH
    return (source: Observable<T>) =>
      source.pipe(exhaustMap((a, i) => innerFrom(project(a, i)).pipe(map((b: any, ii: any) => resultSelector(a, b, i, ii)))));
  }
  return operate((source, subscriber) => {
    let index = 0;
    let innerSub: Subscriber<T> | null = null;
    let isComplete = false;
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (outerValue) => {
          if (!innerSub) {
            innerSub = createOperatorSubscriber(subscriber, undefined, () => {
              innerSub = null;
              isComplete && subscriber.complete();
            });
            innerFrom(project(outerValue, index++)).subscribe(innerSub);
          }
        },
        () => {
          isComplete = true;
          !innerSub && subscriber.complete();
        }
      )
    );
  });
}
import { OperatorFunction, ObservableInput, ObservedValueOf, SchedulerLike } from '../types';
import { operate } from '../util/lift';
import { mergeInternals } from './mergeInternals';

/* tslint:disable:max-line-length */
export function expand<T, O extends ObservableInput<unknown>>(
  project: (value: T, index: number) => O,
  concurrent?: number,
  scheduler?: SchedulerLike
): OperatorFunction<T, ObservedValueOf<O>>;
/**
 * @deprecated The `scheduler` parameter will be removed in v8. If you need to schedule the inner subscription,
 * use `subscribeOn` within the projection function: `expand((value) => fn(value).pipe(subscribeOn(scheduler)))`.
 * Details: Details: https://rxjs.dev/deprecations/scheduler-argument
 */
export function expand<T, O extends ObservableInput<unknown>>(
  project: (value: T, index: number) => O,
  concurrent: number | undefined,
  scheduler: SchedulerLike
): OperatorFunction<T, ObservedValueOf<O>>;
/* tslint:enable:max-line-length */

/**
 * Recursively projects each source value to an Observable which is merged in
 * the output Observable.
 *
 * <span class="informal">It's similar to {@link mergeMap}, but applies the
 * projection function to every source value as well as every output value.
 * It's recursive.</span>
 *
 * ![](expand.png)
 *
 * Returns an Observable that emits items based on applying a function that you
 * supply to each item emitted by the source Observable, where that function
 * returns an Observable, and then merging those resulting Observables and
 * emitting the results of this merger. *Expand* will re-emit on the output
 * Observable every source value. Then, each output value is given to the
 * `project` function which returns an inner Observable to be merged on the
 * output Observable. Those output values resulting from the projection are also
 * given to the `project` function to produce new output values. This is how
 * *expand* behaves recursively.
 *
 * ## Example
 *
 * Start emitting the powers of two on every click, at most 10 of them
 *
 * ```ts
 * import { fromEvent, map, expand, of, delay, take } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const powersOfTwo = clicks.pipe(
 *   map(() => 1),
 *   expand(x => of(2 * x).pipe(delay(1000))),
 *   take(10)
 * );
 * powersOfTwo.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link mergeMap}
 * @see {@link mergeScan}
 *
 * @param {function(value: T, index: number) => Observable} project A function
 * that, when applied to an item emitted by the source or the output Observable,
 * returns an Observable.
 * @param {number} [concurrent=Infinity] Maximum number of input
 * Observables being subscribed to concurrently.
 * @param {SchedulerLike} [scheduler=null] The {@link SchedulerLike} to use for subscribing to
 * each projected inner Observable.
 * @return A function that returns an Observable that emits the source values
 * and also result of applying the projection function to each value emitted on
 * the output Observable and merging the results of the Observables obtained
 * from this transformation.
 */
export function expand<T, O extends ObservableInput<unknown>>(
  project: (value: T, index: number) => O,
  concurrent = Infinity,
  scheduler?: SchedulerLike
): OperatorFunction<T, ObservedValueOf<O>> {
  concurrent = (concurrent || 0) < 1 ? Infinity : concurrent;
  return operate((source, subscriber) =>
    mergeInternals(
      // General merge params
      source,
      subscriber,
      project,
      concurrent,

      // onBeforeNext
      undefined,

      // Expand-specific
      true, // Use expand path
      scheduler // Inner subscription scheduler
    )
  );
}
import { OperatorFunction, MonoTypeOperatorFunction, TruthyTypesOf } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/** @deprecated Use a closure instead of a `thisArg`. Signatures accepting a `thisArg` will be removed in v8. */
export function filter<T, S extends T, A>(predicate: (this: A, value: T, index: number) => value is S, thisArg: A): OperatorFunction<T, S>;
export function filter<T, S extends T>(predicate: (value: T, index: number) => value is S): OperatorFunction<T, S>;
export function filter<T>(predicate: BooleanConstructor): OperatorFunction<T, TruthyTypesOf<T>>;
/** @deprecated Use a closure instead of a `thisArg`. Signatures accepting a `thisArg` will be removed in v8. */
export function filter<T, A>(predicate: (this: A, value: T, index: number) => boolean, thisArg: A): MonoTypeOperatorFunction<T>;
export function filter<T>(predicate: (value: T, index: number) => boolean): MonoTypeOperatorFunction<T>;

/**
 * Filter items emitted by the source Observable by only emitting those that
 * satisfy a specified predicate.
 *
 * <span class="informal">Like
 * [Array.prototype.filter()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter),
 * it only emits a value from the source if it passes a criterion function.</span>
 *
 * ![](filter.png)
 *
 * Similar to the well-known `Array.prototype.filter` method, this operator
 * takes values from the source Observable, passes them through a `predicate`
 * function and only emits those values that yielded `true`.
 *
 * ## Example
 *
 * Emit only click events whose target was a DIV element
 *
 * ```ts
 * import { fromEvent, filter } from 'rxjs';
 *
 * const div = document.createElement('div');
 * div.style.cssText = 'width: 200px; height: 200px; background: #09c;';
 * document.body.appendChild(div);
 *
 * const clicks = fromEvent(document, 'click');
 * const clicksOnDivs = clicks.pipe(filter(ev => (<HTMLElement>ev.target).tagName === 'DIV'));
 * clicksOnDivs.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link distinct}
 * @see {@link distinctUntilChanged}
 * @see {@link distinctUntilKeyChanged}
 * @see {@link ignoreElements}
 * @see {@link partition}
 * @see {@link skip}
 *
 * @param predicate A function that
 * evaluates each value emitted by the source Observable. If it returns `true`,
 * the value is emitted, if `false` the value is not passed to the output
 * Observable. The `index` parameter is the number `i` for the i-th source
 * emission that has happened since the subscription, starting from the number
 * `0`.
 * @param thisArg An optional argument to determine the value of `this`
 * in the `predicate` function.
 * @return A function that returns an Observable that emits items from the
 * source Observable that satisfy the specified `predicate`.
 */
export function filter<T>(predicate: (value: T, index: number) => boolean, thisArg?: any): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    // An index passed to our predicate function on each call.
    let index = 0;

    // Subscribe to the source, all errors and completions are
    // forwarded to the consumer.
    source.subscribe(
      // Call the predicate with the appropriate `this` context,
      // if the predicate returns `true`, then send the value
      // to the consumer.
      createOperatorSubscriber(subscriber, (value) => predicate.call(thisArg, value, index++) && subscriber.next(value))
    );
  });
}
import { MonoTypeOperatorFunction } from '../types';
import { operate } from '../util/lift';

/**
 * Returns an Observable that mirrors the source Observable, but will call a specified function when
 * the source terminates on complete or error.
 * The specified function will also be called when the subscriber explicitly unsubscribes.
 *
 * ## Examples
 *
 * Execute callback function when the observable completes
 *
 * ```ts
 * import { interval, take, finalize } from 'rxjs';
 *
 * // emit value in sequence every 1 second
 * const source = interval(1000);
 * const example = source.pipe(
 *   take(5), //take only the first 5 values
 *   finalize(() => console.log('Sequence complete')) // Execute when the observable completes
 * );
 * const subscribe = example.subscribe(val => console.log(val));
 *
 * // results:
 * // 0
 * // 1
 * // 2
 * // 3
 * // 4
 * // 'Sequence complete'
 * ```
 *
 * Execute callback function when the subscriber explicitly unsubscribes
 *
 * ```ts
 * import { interval, finalize, tap, noop, timer } from 'rxjs';
 *
 * const source = interval(100).pipe(
 *   finalize(() => console.log('[finalize] Called')),
 *   tap({
 *     next: () => console.log('[next] Called'),
 *     error: () => console.log('[error] Not called'),
 *     complete: () => console.log('[tap complete] Not called')
 *   })
 * );
 *
 * const sub = source.subscribe({
 *   next: x => console.log(x),
 *   error: noop,
 *   complete: () => console.log('[complete] Not called')
 * });
 *
 * timer(150).subscribe(() => sub.unsubscribe());
 *
 * // results:
 * // '[next] Called'
 * // 0
 * // '[finalize] Called'
 * ```
 *
 * @param {function} callback Function to be called when source terminates.
 * @return A function that returns an Observable that mirrors the source, but
 * will call the specified function on termination.
 */
export function finalize<T>(callback: () => void): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    // TODO: This try/finally was only added for `useDeprecatedSynchronousErrorHandling`.
    // REMOVE THIS WHEN THAT HOT GARBAGE IS REMOVED IN V8.
    try {
      source.subscribe(subscriber);
    } finally {
      subscriber.add(callback);
    }
  });
}
import { Observable } from '../Observable';
import { Subscriber } from '../Subscriber';
import { OperatorFunction, TruthyTypesOf } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

export function find<T>(predicate: BooleanConstructor): OperatorFunction<T, TruthyTypesOf<T>>;
/** @deprecated Use a closure instead of a `thisArg`. Signatures accepting a `thisArg` will be removed in v8. */
export function find<T, S extends T, A>(
  predicate: (this: A, value: T, index: number, source: Observable<T>) => value is S,
  thisArg: A
): OperatorFunction<T, S | undefined>;
export function find<T, S extends T>(
  predicate: (value: T, index: number, source: Observable<T>) => value is S
): OperatorFunction<T, S | undefined>;
/** @deprecated Use a closure instead of a `thisArg`. Signatures accepting a `thisArg` will be removed in v8. */
export function find<T, A>(
  predicate: (this: A, value: T, index: number, source: Observable<T>) => boolean,
  thisArg: A
): OperatorFunction<T, T | undefined>;
export function find<T>(predicate: (value: T, index: number, source: Observable<T>) => boolean): OperatorFunction<T, T | undefined>;
/**
 * Emits only the first value emitted by the source Observable that meets some
 * condition.
 *
 * <span class="informal">Finds the first value that passes some test and emits
 * that.</span>
 *
 * ![](find.png)
 *
 * `find` searches for the first item in the source Observable that matches the
 * specified condition embodied by the `predicate`, and returns the first
 * occurrence in the source. Unlike {@link first}, the `predicate` is required
 * in `find`, and does not emit an error if a valid value is not found
 * (emits `undefined` instead).
 *
 * ## Example
 *
 * Find and emit the first click that happens on a DIV element
 *
 * ```ts
 * import { fromEvent, find } from 'rxjs';
 *
 * const div = document.createElement('div');
 * div.style.cssText = 'width: 200px; height: 200px; background: #09c;';
 * document.body.appendChild(div);
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(find(ev => (<HTMLElement>ev.target).tagName === 'DIV'));
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link filter}
 * @see {@link first}
 * @see {@link findIndex}
 * @see {@link take}
 *
 * @param {function(value: T, index: number, source: Observable<T>): boolean} predicate
 * A function called with each item to test for condition matching.
 * @param {any} [thisArg] An optional argument to determine the value of `this`
 * in the `predicate` function.
 * @return A function that returns an Observable that emits the first item that
 * matches the condition.
 */
export function find<T>(
  predicate: (value: T, index: number, source: Observable<T>) => boolean,
  thisArg?: any
): OperatorFunction<T, T | undefined> {
  return operate(createFind(predicate, thisArg, 'value'));
}

export function createFind<T>(
  predicate: (value: T, index: number, source: Observable<T>) => boolean,
  thisArg: any,
  emit: 'value' | 'index'
) {
  const findIndex = emit === 'index';
  return (source: Observable<T>, subscriber: Subscriber<any>) => {
    let index = 0;
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => {
          const i = index++;
          if (predicate.call(thisArg, value, i, source)) {
            subscriber.next(findIndex ? i : value);
            subscriber.complete();
          }
        },
        () => {
          subscriber.next(findIndex ? -1 : undefined);
          subscriber.complete();
        }
      )
    );
  };
}
import { Observable } from '../Observable';
import { Falsy, OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createFind } from './find';

export function findIndex<T>(predicate: BooleanConstructor): OperatorFunction<T, T extends Falsy ? -1 : number>;
/** @deprecated Use a closure instead of a `thisArg`. Signatures accepting a `thisArg` will be removed in v8. */
export function findIndex<T>(predicate: BooleanConstructor, thisArg: any): OperatorFunction<T, T extends Falsy ? -1 : number>;
/** @deprecated Use a closure instead of a `thisArg`. Signatures accepting a `thisArg` will be removed in v8. */
export function findIndex<T, A>(
  predicate: (this: A, value: T, index: number, source: Observable<T>) => boolean,
  thisArg: A
): OperatorFunction<T, number>;
export function findIndex<T>(predicate: (value: T, index: number, source: Observable<T>) => boolean): OperatorFunction<T, number>;

/**
 * Emits only the index of the first value emitted by the source Observable that
 * meets some condition.
 *
 * <span class="informal">It's like {@link find}, but emits the index of the
 * found value, not the value itself.</span>
 *
 * ![](findIndex.png)
 *
 * `findIndex` searches for the first item in the source Observable that matches
 * the specified condition embodied by the `predicate`, and returns the
 * (zero-based) index of the first occurrence in the source. Unlike
 * {@link first}, the `predicate` is required in `findIndex`, and does not emit
 * an error if a valid value is not found.
 *
 * ## Example
 *
 * Emit the index of first click that happens on a DIV element
 *
 * ```ts
 * import { fromEvent, findIndex } from 'rxjs';
 *
 * const div = document.createElement('div');
 * div.style.cssText = 'width: 200px; height: 200px; background: #09c;';
 * document.body.appendChild(div);
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(findIndex(ev => (<HTMLElement>ev.target).tagName === 'DIV'));
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link filter}
 * @see {@link find}
 * @see {@link first}
 * @see {@link take}
 *
 * @param {function(value: T, index: number, source: Observable<T>): boolean} predicate
 * A function called with each item to test for condition matching.
 * @param {any} [thisArg] An optional argument to determine the value of `this`
 * in the `predicate` function.
 * @return A function that returns an Observable that emits the index of the
 * first item that matches the condition.
 */
export function findIndex<T>(
  predicate: (value: T, index: number, source: Observable<T>) => boolean,
  thisArg?: any
): OperatorFunction<T, number> {
  return operate(createFind(predicate, thisArg, 'index'));
}
import { Observable } from '../Observable';
import { EmptyError } from '../util/EmptyError';
import { OperatorFunction, TruthyTypesOf } from '../types';
import { filter } from './filter';
import { take } from './take';
import { defaultIfEmpty } from './defaultIfEmpty';
import { throwIfEmpty } from './throwIfEmpty';
import { identity } from '../util/identity';

export function first<T, D = T>(predicate?: null, defaultValue?: D): OperatorFunction<T, T | D>;
export function first<T>(predicate: BooleanConstructor): OperatorFunction<T, TruthyTypesOf<T>>;
export function first<T, D>(predicate: BooleanConstructor, defaultValue: D): OperatorFunction<T, TruthyTypesOf<T> | D>;
export function first<T, S extends T>(
  predicate: (value: T, index: number, source: Observable<T>) => value is S,
  defaultValue?: S
): OperatorFunction<T, S>;
export function first<T, S extends T, D>(
  predicate: (value: T, index: number, source: Observable<T>) => value is S,
  defaultValue: D
): OperatorFunction<T, S | D>;
export function first<T, D = T>(
  predicate: (value: T, index: number, source: Observable<T>) => boolean,
  defaultValue?: D
): OperatorFunction<T, T | D>;

/**
 * Emits only the first value (or the first value that meets some condition)
 * emitted by the source Observable.
 *
 * <span class="informal">Emits only the first value. Or emits only the first
 * value that passes some test.</span>
 *
 * ![](first.png)
 *
 * If called with no arguments, `first` emits the first value of the source
 * Observable, then completes. If called with a `predicate` function, `first`
 * emits the first value of the source that matches the specified condition. Throws an error if
 * `defaultValue` was not provided and a matching element is not found.
 *
 * ## Examples
 *
 * Emit only the first click that happens on the DOM
 *
 * ```ts
 * import { fromEvent, first } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(first());
 * result.subscribe(x => console.log(x));
 * ```
 *
 * Emits the first click that happens on a DIV
 *
 * ```ts
 * import { fromEvent, first } from 'rxjs';
 *
 * const div = document.createElement('div');
 * div.style.cssText = 'width: 200px; height: 200px; background: #09c;';
 * document.body.appendChild(div);
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(first(ev => (<HTMLElement>ev.target).tagName === 'DIV'));
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link filter}
 * @see {@link find}
 * @see {@link take}
 *
 * @throws {EmptyError} Delivers an EmptyError to the Observer's `error`
 * callback if the Observable completes before any `next` notification was sent.
 * This is how `first()` is different from {@link take}(1) which completes instead.
 *
 * @param {function(value: T, index: number, source: Observable<T>): boolean} [predicate]
 * An optional function called with each item to test for condition matching.
 * @param {D} [defaultValue] The default value emitted in case no valid value
 * was found on the source.
 * @return A function that returns an Observable that emits the first item that
 * matches the condition.
 */
export function first<T, D>(
  predicate?: ((value: T, index: number, source: Observable<T>) => boolean) | null,
  defaultValue?: D
): OperatorFunction<T, T | D> {
  const hasDefaultValue = arguments.length >= 2;
  return (source: Observable<T>) =>
    source.pipe(
      predicate ? filter((v, i) => predicate(v, i, source)) : identity,
      take(1),
      hasDefaultValue ? defaultIfEmpty(defaultValue!) : throwIfEmpty(() => new EmptyError())
    );
}
import { mergeMap } from './mergeMap';

/**
 * @deprecated Renamed to {@link mergeMap}. Will be removed in v8.
 */
export const flatMap = mergeMap;
import { Observable } from '../Observable';
import { innerFrom } from '../observable/innerFrom';
import { Subject } from '../Subject';
import { ObservableInput, Observer, OperatorFunction, SubjectLike } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber, OperatorSubscriber } from './OperatorSubscriber';

export interface BasicGroupByOptions<K, T> {
  element?: undefined;
  duration?: (grouped: GroupedObservable<K, T>) => ObservableInput<any>;
  connector?: () => SubjectLike<T>;
}

export interface GroupByOptionsWithElement<K, E, T> {
  element: (value: T) => E;
  duration?: (grouped: GroupedObservable<K, E>) => ObservableInput<any>;
  connector?: () => SubjectLike<E>;
}

export function groupBy<T, K>(key: (value: T) => K, options: BasicGroupByOptions<K, T>): OperatorFunction<T, GroupedObservable<K, T>>;

export function groupBy<T, K, E>(
  key: (value: T) => K,
  options: GroupByOptionsWithElement<K, E, T>
): OperatorFunction<T, GroupedObservable<K, E>>;

export function groupBy<T, K extends T>(
  key: (value: T) => value is K
): OperatorFunction<T, GroupedObservable<true, K> | GroupedObservable<false, Exclude<T, K>>>;

export function groupBy<T, K>(key: (value: T) => K): OperatorFunction<T, GroupedObservable<K, T>>;

/**
 * @deprecated use the options parameter instead.
 */
export function groupBy<T, K>(
  key: (value: T) => K,
  element: void,
  duration: (grouped: GroupedObservable<K, T>) => Observable<any>
): OperatorFunction<T, GroupedObservable<K, T>>;

/**
 * @deprecated use the options parameter instead.
 */
export function groupBy<T, K, R>(
  key: (value: T) => K,
  element?: (value: T) => R,
  duration?: (grouped: GroupedObservable<K, R>) => Observable<any>
): OperatorFunction<T, GroupedObservable<K, R>>;

/**
 * Groups the items emitted by an Observable according to a specified criterion,
 * and emits these grouped items as `GroupedObservables`, one
 * {@link GroupedObservable} per group.
 *
 * ![](groupBy.png)
 *
 * When the Observable emits an item, a key is computed for this item with the key function.
 *
 * If a {@link GroupedObservable} for this key exists, this {@link GroupedObservable} emits. Otherwise, a new
 * {@link GroupedObservable} for this key is created and emits.
 *
 * A {@link GroupedObservable} represents values belonging to the same group represented by a common key. The common
 * key is available as the `key` field of a {@link GroupedObservable} instance.
 *
 * The elements emitted by {@link GroupedObservable}s are by default the items emitted by the Observable, or elements
 * returned by the element function.
 *
 * ## Examples
 *
 * Group objects by `id` and return as array
 *
 * ```ts
 * import { of, groupBy, mergeMap, reduce } from 'rxjs';
 *
 * of(
 *   { id: 1, name: 'JavaScript' },
 *   { id: 2, name: 'Parcel' },
 *   { id: 2, name: 'webpack' },
 *   { id: 1, name: 'TypeScript' },
 *   { id: 3, name: 'TSLint' }
 * ).pipe(
 *   groupBy(p => p.id),
 *   mergeMap(group$ => group$.pipe(reduce((acc, cur) => [...acc, cur], [])))
 * )
 * .subscribe(p => console.log(p));
 *
 * // displays:
 * // [{ id: 1, name: 'JavaScript' }, { id: 1, name: 'TypeScript'}]
 * // [{ id: 2, name: 'Parcel' }, { id: 2, name: 'webpack'}]
 * // [{ id: 3, name: 'TSLint' }]
 * ```
 *
 * Pivot data on the `id` field
 *
 * ```ts
 * import { of, groupBy, mergeMap, reduce, map } from 'rxjs';
 *
 * of(
 *   { id: 1, name: 'JavaScript' },
 *   { id: 2, name: 'Parcel' },
 *   { id: 2, name: 'webpack' },
 *   { id: 1, name: 'TypeScript' },
 *   { id: 3, name: 'TSLint' }
 * ).pipe(
 *   groupBy(p => p.id, { element: p => p.name }),
 *   mergeMap(group$ => group$.pipe(reduce((acc, cur) => [...acc, cur], [`${ group$.key }`]))),
 *   map(arr => ({ id: parseInt(arr[0], 10), values: arr.slice(1) }))
 * )
 * .subscribe(p => console.log(p));
 *
 * // displays:
 * // { id: 1, values: [ 'JavaScript', 'TypeScript' ] }
 * // { id: 2, values: [ 'Parcel', 'webpack' ] }
 * // { id: 3, values: [ 'TSLint' ] }
 * ```
 *
 * @param key A function that extracts the key
 * for each item.
 * @param element A function that extracts the
 * return element for each item.
 * @param duration
 * A function that returns an Observable to determine how long each group should
 * exist.
 * @param connector Factory function to create an
 * intermediate Subject through which grouped elements are emitted.
 * @return A function that returns an Observable that emits GroupedObservables,
 * each of which corresponds to a unique key value and each of which emits
 * those items from the source Observable that share that key value.
 *
 * @deprecated Use the options parameter instead.
 */
export function groupBy<T, K, R>(
  key: (value: T) => K,
  element?: (value: T) => R,
  duration?: (grouped: GroupedObservable<K, R>) => Observable<any>,
  connector?: () => Subject<R>
): OperatorFunction<T, GroupedObservable<K, R>>;

// Impl
export function groupBy<T, K, R>(
  keySelector: (value: T) => K,
  elementOrOptions?: ((value: any) => any) | void | BasicGroupByOptions<K, T> | GroupByOptionsWithElement<K, R, T>,
  duration?: (grouped: GroupedObservable<any, any>) => ObservableInput<any>,
  connector?: () => SubjectLike<any>
): OperatorFunction<T, GroupedObservable<K, R>> {
  return operate((source, subscriber) => {
    let element: ((value: any) => any) | void;
    if (!elementOrOptions || typeof elementOrOptions === 'function') {
      element = elementOrOptions as ((value: any) => any);
    } else {
      ({ duration, element, connector } = elementOrOptions);
    }

    // A lookup for the groups that we have so far.
    const groups = new Map<K, SubjectLike<any>>();

    // Used for notifying all groups and the subscriber in the same way.
    const notify = (cb: (group: Observer<any>) => void) => {
      groups.forEach(cb);
      cb(subscriber);
    };

    // Used to handle errors from the source, AND errors that occur during the
    // next call from the source.
    const handleError = (err: any) => notify((consumer) => consumer.error(err));

    // The number of actively subscribed groups
    let activeGroups = 0;

    // Whether or not teardown was attempted on this subscription.
    let teardownAttempted = false;

    // Capturing a reference to this, because we need a handle to it
    // in `createGroupedObservable` below. This is what we use to
    // subscribe to our source observable. This sometimes needs to be unsubscribed
    // out-of-band with our `subscriber` which is the downstream subscriber, or destination,
    // in cases where a user unsubscribes from the main resulting subscription, but
    // still has groups from this subscription subscribed and would expect values from it
    // Consider:  `source.pipe(groupBy(fn), take(2))`.
    const groupBySourceSubscriber = new OperatorSubscriber(
      subscriber,
      (value: T) => {
        // Because we have to notify all groups of any errors that occur in here,
        // we have to add our own try/catch to ensure that those errors are propagated.
        // OperatorSubscriber will only send the error to the main subscriber.
        try {
          const key = keySelector(value);

          let group = groups.get(key);
          if (!group) {
            // Create our group subject
            groups.set(key, (group = connector ? connector() : new Subject<any>()));

            // Emit the grouped observable. Note that we can't do a simple `asObservable()` here,
            // because the grouped observable has special semantics around reference counting
            // to ensure we don't sever our connection to the source prematurely.
            const grouped = createGroupedObservable(key, group);
            subscriber.next(grouped);

            if (duration) {
              const durationSubscriber = createOperatorSubscriber(
                // Providing the group here ensures that it is disposed of -- via `unsubscribe` --
                // wnen the duration subscription is torn down. That is important, because then
                // if someone holds a handle to the grouped observable and tries to subscribe to it
                // after the connection to the source has been severed, they will get an
                // `ObjectUnsubscribedError` and know they can't possibly get any notifications.
                group as any,
                () => {
                  // Our duration notified! We can complete the group.
                  // The group will be removed from the map in the finalization phase.
                  group!.complete();
                  durationSubscriber?.unsubscribe();
                },
                // Completions are also sent to the group, but just the group.
                undefined,
                // Errors on the duration subscriber are sent to the group
                // but only the group. They are not sent to the main subscription.
                undefined,
                // Finalization: Remove this group from our map.
                () => groups.delete(key)
              );

              // Start our duration notifier.
              groupBySourceSubscriber.add(innerFrom(duration(grouped)).subscribe(durationSubscriber));
            }
          }

          // Send the value to our group.
          group.next(element ? element(value) : value);
        } catch (err) {
          handleError(err);
        }
      },
      // Source completes.
      () => notify((consumer) => consumer.complete()),
      // Error from the source.
      handleError,
      // Free up memory.
      // When the source subscription is _finally_ torn down, release the subjects and keys
      // in our groups Map, they may be quite large and we don't want to keep them around if we
      // don't have to.
      () => groups.clear(),
      () => {
        teardownAttempted = true;
        // We only kill our subscription to the source if we have
        // no active groups. As stated above, consider this scenario:
        // source$.pipe(groupBy(fn), take(2)).
        return activeGroups === 0;
      }
    );

    // Subscribe to the source
    source.subscribe(groupBySourceSubscriber);

    /**
     * Creates the actual grouped observable returned.
     * @param key The key of the group
     * @param groupSubject The subject that fuels the group
     */
    function createGroupedObservable(key: K, groupSubject: SubjectLike<any>) {
      const result: any = new Observable<T>((groupSubscriber) => {
        activeGroups++;
        const innerSub = groupSubject.subscribe(groupSubscriber);
        return () => {
          innerSub.unsubscribe();
          // We can kill the subscription to our source if we now have no more
          // active groups subscribed, and a finalization was already attempted on
          // the source.
          --activeGroups === 0 && teardownAttempted && groupBySourceSubscriber.unsubscribe();
        };
      });
      result.key = key;
      return result;
    }
  });
}

/**
 * An observable of values that is the emitted by the result of a {@link groupBy} operator,
 * contains a `key` property for the grouping.
 */
export interface GroupedObservable<K, T> extends Observable<T> {
  /**
   * The key value for the grouped notifications.
   */
  readonly key: K;
}
import { OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { noop } from '../util/noop';

/**
 * Ignores all items emitted by the source Observable and only passes calls of `complete` or `error`.
 *
 * ![](ignoreElements.png)
 *
 * The `ignoreElements` operator suppresses all items emitted by the source Observable,
 * but allows its termination notification (either `error` or `complete`) to pass through unchanged.
 *
 * If you do not care about the items being emitted by an Observable, but you do want to be notified
 * when it completes or when it terminates with an error, you can apply the `ignoreElements` operator
 * to the Observable, which will ensure that it will never call its observers’ `next` handlers.
 *
 * ## Example
 *
 * Ignore all `next` emissions from the source
 *
 * ```ts
 * import { of, ignoreElements } from 'rxjs';
 *
 * of('you', 'talking', 'to', 'me')
 *   .pipe(ignoreElements())
 *   .subscribe({
 *     next: word => console.log(word),
 *     error: err => console.log('error:', err),
 *     complete: () => console.log('the end'),
 *   });
 *
 * // result:
 * // 'the end'
 * ```
 *
 * @return A function that returns an empty Observable that only calls
 * `complete` or `error`, based on which one is called by the source
 * Observable.
 */
export function ignoreElements(): OperatorFunction<unknown, never> {
  return operate((source, subscriber) => {
    source.subscribe(createOperatorSubscriber(subscriber, noop));
  });
}
import { OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Emits `false` if the input Observable emits any values, or emits `true` if the
 * input Observable completes without emitting any values.
 *
 * <span class="informal">Tells whether any values are emitted by an Observable.</span>
 *
 * ![](isEmpty.png)
 *
 * `isEmpty` transforms an Observable that emits values into an Observable that
 * emits a single boolean value representing whether or not any values were
 * emitted by the source Observable. As soon as the source Observable emits a
 * value, `isEmpty` will emit a `false` and complete.  If the source Observable
 * completes having not emitted anything, `isEmpty` will emit a `true` and
 * complete.
 *
 * A similar effect could be achieved with {@link count}, but `isEmpty` can emit
 * a `false` value sooner.
 *
 * ## Examples
 *
 * Emit `false` for a non-empty Observable
 *
 * ```ts
 * import { Subject, isEmpty } from 'rxjs';
 *
 * const source = new Subject<string>();
 * const result = source.pipe(isEmpty());
 *
 * source.subscribe(x => console.log(x));
 * result.subscribe(x => console.log(x));
 *
 * source.next('a');
 * source.next('b');
 * source.next('c');
 * source.complete();
 *
 * // Outputs
 * // 'a'
 * // false
 * // 'b'
 * // 'c'
 * ```
 *
 * Emit `true` for an empty Observable
 *
 * ```ts
 * import { EMPTY, isEmpty } from 'rxjs';
 *
 * const result = EMPTY.pipe(isEmpty());
 * result.subscribe(x => console.log(x));
 *
 * // Outputs
 * // true
 * ```
 *
 * @see {@link count}
 * @see {@link EMPTY}
 *
 * @return A function that returns an Observable that emits boolean value
 * indicating whether the source Observable was empty or not.
 */
export function isEmpty<T>(): OperatorFunction<T, boolean> {
  return operate((source, subscriber) => {
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        () => {
          subscriber.next(false);
          subscriber.complete();
        },
        () => {
          subscriber.next(true);
          subscriber.complete();
        }
      )
    );
  });
}
import { Observable } from '../Observable';
import { ObservableInput, OperatorFunction } from '../types';
import { identity } from '../util/identity';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';
import { pipe } from '../util/pipe';
import { mergeMap } from './mergeMap';
import { toArray } from './toArray';

/**
 * Collects all of the inner sources from source observable. Then, once the
 * source completes, joins the values using the given static.
 *
 * This is used for {@link combineLatestAll} and {@link zipAll} which both have the
 * same behavior of collecting all inner observables, then operating on them.
 *
 * @param joinFn The type of static join to apply to the sources collected
 * @param project The projection function to apply to the values, if any
 */
export function joinAllInternals<T, R>(joinFn: (sources: ObservableInput<T>[]) => Observable<T>, project?: (...args: any[]) => R) {
  return pipe(
    // Collect all inner sources into an array, and emit them when the
    // source completes.
    toArray() as OperatorFunction<ObservableInput<T>, ObservableInput<T>[]>,
    // Run the join function on the collected array of inner sources.
    mergeMap((sources) => joinFn(sources)),
    // If a projection function was supplied, apply it to each result.
    project ? mapOneOrManyArgs(project) : (identity as any)
  );
}
import { Observable } from '../Observable';
import { EmptyError } from '../util/EmptyError';
import { OperatorFunction, TruthyTypesOf } from '../types';
import { filter } from './filter';
import { takeLast } from './takeLast';
import { throwIfEmpty } from './throwIfEmpty';
import { defaultIfEmpty } from './defaultIfEmpty';
import { identity } from '../util/identity';

export function last<T>(predicate: BooleanConstructor): OperatorFunction<T, TruthyTypesOf<T>>;
export function last<T, D>(predicate: BooleanConstructor, defaultValue: D): OperatorFunction<T, TruthyTypesOf<T> | D>;
export function last<T, D = T>(predicate?: null, defaultValue?: D): OperatorFunction<T, T | D>;
export function last<T, S extends T>(
  predicate: (value: T, index: number, source: Observable<T>) => value is S,
  defaultValue?: S
): OperatorFunction<T, S>;
export function last<T, D = T>(
  predicate: (value: T, index: number, source: Observable<T>) => boolean,
  defaultValue?: D
): OperatorFunction<T, T | D>;

/**
 * Returns an Observable that emits only the last item emitted by the source Observable.
 * It optionally takes a predicate function as a parameter, in which case, rather than emitting
 * the last item from the source Observable, the resulting Observable will emit the last item
 * from the source Observable that satisfies the predicate.
 *
 * ![](last.png)
 *
 * It will throw an error if the source completes without notification or one that matches the predicate. It
 * returns the last value or if a predicate is provided last value that matches the predicate. It returns the
 * given default value if no notification is emitted or matches the predicate.
 *
 * ## Examples
 *
 * Last alphabet from the sequence
 *
 * ```ts
 * import { from, last } from 'rxjs';
 *
 * const source = from(['x', 'y', 'z']);
 * const result = source.pipe(last());
 *
 * result.subscribe(value => console.log(`Last alphabet: ${ value }`));
 *
 * // Outputs
 * // Last alphabet: z
 * ```
 *
 * Default value when the value in the predicate is not matched
 *
 * ```ts
 * import { from, last } from 'rxjs';
 *
 * const source = from(['x', 'y', 'z']);
 * const result = source.pipe(last(char => char === 'a', 'not found'));
 *
 * result.subscribe(value => console.log(`'a' is ${ value }.`));
 *
 * // Outputs
 * // 'a' is not found.
 * ```
 *
 * @see {@link skip}
 * @see {@link skipUntil}
 * @see {@link skipLast}
 * @see {@link skipWhile}
 *
 * @throws {EmptyError} Delivers an EmptyError to the Observer's `error`
 * callback if the Observable completes before any `next` notification was sent.
 * @param {function} [predicate] - The condition any source emitted item has to satisfy.
 * @param {any} [defaultValue] - An optional default value to provide if last
 * predicate isn't met or no values were emitted.
 * @return A function that returns an Observable that emits only the last item
 * satisfying the given condition from the source, or a NoSuchElementException
 * if no such items are emitted.
 * @throws - Throws if no items that match the predicate are emitted by the source Observable.
 */
export function last<T, D>(
  predicate?: ((value: T, index: number, source: Observable<T>) => boolean) | null,
  defaultValue?: D
): OperatorFunction<T, T | D> {
  const hasDefaultValue = arguments.length >= 2;
  return (source: Observable<T>) =>
    source.pipe(
      predicate ? filter((v, i) => predicate(v, i, source)) : identity,
      takeLast(1),
      hasDefaultValue ? defaultIfEmpty(defaultValue!) : throwIfEmpty(() => new EmptyError())
    );
}
import { OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

export function map<T, R>(project: (value: T, index: number) => R): OperatorFunction<T, R>;
/** @deprecated Use a closure instead of a `thisArg`. Signatures accepting a `thisArg` will be removed in v8. */
export function map<T, R, A>(project: (this: A, value: T, index: number) => R, thisArg: A): OperatorFunction<T, R>;

/**
 * Applies a given `project` function to each value emitted by the source
 * Observable, and emits the resulting values as an Observable.
 *
 * <span class="informal">Like [Array.prototype.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map),
 * it passes each source value through a transformation function to get
 * corresponding output values.</span>
 *
 * ![](map.png)
 *
 * Similar to the well known `Array.prototype.map` function, this operator
 * applies a projection to each value and emits that projection in the output
 * Observable.
 *
 * ## Example
 *
 * Map every click to the `clientX` position of that click
 *
 * ```ts
 * import { fromEvent, map } from 'rxjs';
 *
 * const clicks = fromEvent<PointerEvent>(document, 'click');
 * const positions = clicks.pipe(map(ev => ev.clientX));
 *
 * positions.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link mapTo}
 * @see {@link pluck}
 *
 * @param {function(value: T, index: number): R} project The function to apply
 * to each `value` emitted by the source Observable. The `index` parameter is
 * the number `i` for the i-th emission that has happened since the
 * subscription, starting from the number `0`.
 * @param {any} [thisArg] An optional argument to define what `this` is in the
 * `project` function.
 * @return A function that returns an Observable that emits the values from the
 * source Observable transformed by the given `project` function.
 */
export function map<T, R>(project: (value: T, index: number) => R, thisArg?: any): OperatorFunction<T, R> {
  return operate((source, subscriber) => {
    // The index of the value from the source. Used with projection.
    let index = 0;
    // Subscribe to the source, all errors and completions are sent along
    // to the consumer.
    source.subscribe(
      createOperatorSubscriber(subscriber, (value: T) => {
        // Call the projection function with the appropriate this context,
        // and send the resulting value to the consumer.
        subscriber.next(project.call(thisArg, value, index++));
      })
    );
  });
}
import { OperatorFunction } from '../types';
import { map } from './map';

/** @deprecated To be removed in v9. Use {@link map} instead: `map(() => value)`. */
export function mapTo<R>(value: R): OperatorFunction<unknown, R>;
/**
 * @deprecated Do not specify explicit type parameters. Signatures with type parameters
 * that cannot be inferred will be removed in v8. `mapTo` itself will be removed in v9,
 * use {@link map} instead: `map(() => value)`.
 * */
export function mapTo<T, R>(value: R): OperatorFunction<T, R>;

/**
 * Emits the given constant value on the output Observable every time the source
 * Observable emits a value.
 *
 * <span class="informal">Like {@link map}, but it maps every source value to
 * the same output value every time.</span>
 *
 * ![](mapTo.png)
 *
 * Takes a constant `value` as argument, and emits that whenever the source
 * Observable emits a value. In other words, ignores the actual source value,
 * and simply uses the emission moment to know when to emit the given `value`.
 *
 * ## Example
 *
 * Map every click to the string `'Hi'`
 *
 * ```ts
 * import { fromEvent, mapTo } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const greetings = clicks.pipe(mapTo('Hi'));
 *
 * greetings.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link map}
 *
 * @param value The value to map each source value to.
 * @return A function that returns an Observable that emits the given `value`
 * every time the source Observable emits.
 * @deprecated To be removed in v9. Use {@link map} instead: `map(() => value)`.
 */
export function mapTo<R>(value: R): OperatorFunction<unknown, R> {
  return map(() => value);
}
import { Notification } from '../Notification';
import { OperatorFunction, ObservableNotification } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Represents all of the notifications from the source Observable as `next`
 * emissions marked with their original types within {@link Notification}
 * objects.
 *
 * <span class="informal">Wraps `next`, `error` and `complete` emissions in
 * {@link Notification} objects, emitted as `next` on the output Observable.
 * </span>
 *
 * ![](materialize.png)
 *
 * `materialize` returns an Observable that emits a `next` notification for each
 * `next`, `error`, or `complete` emission of the source Observable. When the
 * source Observable emits `complete`, the output Observable will emit `next` as
 * a Notification of type "complete", and then it will emit `complete` as well.
 * When the source Observable emits `error`, the output will emit `next` as a
 * Notification of type "error", and then `complete`.
 *
 * This operator is useful for producing metadata of the source Observable, to
 * be consumed as `next` emissions. Use it in conjunction with
 * {@link dematerialize}.
 *
 * ## Example
 *
 * Convert a faulty Observable to an Observable of Notifications
 *
 * ```ts
 * import { of, materialize, map } from 'rxjs';
 *
 * const letters = of('a', 'b', 13, 'd');
 * const upperCase = letters.pipe(map((x: any) => x.toUpperCase()));
 * const materialized = upperCase.pipe(materialize());
 *
 * materialized.subscribe(x => console.log(x));
 *
 * // Results in the following:
 * // - Notification { kind: 'N', value: 'A', error: undefined, hasValue: true }
 * // - Notification { kind: 'N', value: 'B', error: undefined, hasValue: true }
 * // - Notification { kind: 'E', value: undefined, error: TypeError { message: x.toUpperCase is not a function }, hasValue: false }
 * ```
 *
 * @see {@link Notification}
 * @see {@link dematerialize}
 *
 * @return A function that returns an Observable that emits
 * {@link Notification} objects that wrap the original emissions from the
 * source Observable with metadata.
 */
export function materialize<T>(): OperatorFunction<T, Notification<T> & ObservableNotification<T>> {
  return operate((source, subscriber) => {
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => {
          subscriber.next(Notification.createNext(value));
        },
        () => {
          subscriber.next(Notification.createComplete());
          subscriber.complete();
        },
        (err) => {
          subscriber.next(Notification.createError(err));
          subscriber.complete();
        }
      )
    );
  });
}
import { reduce } from './reduce';
import { MonoTypeOperatorFunction } from '../types';
import { isFunction } from '../util/isFunction';

/**
 * The Max operator operates on an Observable that emits numbers (or items that can be compared with a provided function),
 * and when source Observable completes it emits a single item: the item with the largest value.
 *
 * ![](max.png)
 *
 * ## Examples
 *
 * Get the maximal value of a series of numbers
 *
 * ```ts
 * import { of, max } from 'rxjs';
 *
 * of(5, 4, 7, 2, 8)
 *   .pipe(max())
 *   .subscribe(x => console.log(x));
 *
 * // Outputs
 * // 8
 * ```
 *
 * Use a comparer function to get the maximal item
 *
 * ```ts
 * import { of, max } from 'rxjs';
 *
 * of(
 *   { age: 7, name: 'Foo' },
 *   { age: 5, name: 'Bar' },
 *   { age: 9, name: 'Beer' }
 * ).pipe(
 *   max((a, b) => a.age < b.age ? -1 : 1)
 * )
 * .subscribe(x => console.log(x.name));
 *
 * // Outputs
 * // 'Beer'
 * ```
 *
 * @see {@link min}
 *
 * @param {Function} [comparer] - Optional comparer function that it will use instead of its default to compare the
 * value of two items.
 * @return A function that returns an Observable that emits item with the
 * largest value.
 */
export function max<T>(comparer?: (x: T, y: T) => number): MonoTypeOperatorFunction<T> {
  return reduce(isFunction(comparer) ? (x, y) => (comparer(x, y) > 0 ? x : y) : (x, y) => (x > y ? x : y));
}
import { ObservableInput, ObservableInputTuple, OperatorFunction, SchedulerLike } from '../types';
import { operate } from '../util/lift';
import { argsOrArgArray } from '../util/argsOrArgArray';
import { mergeAll } from './mergeAll';
import { popNumber, popScheduler } from '../util/args';
import { from } from '../observable/from';

/** @deprecated Replaced with {@link mergeWith}. Will be removed in v8. */
export function merge<T, A extends readonly unknown[]>(...sources: [...ObservableInputTuple<A>]): OperatorFunction<T, T | A[number]>;
/** @deprecated Replaced with {@link mergeWith}. Will be removed in v8. */
export function merge<T, A extends readonly unknown[]>(
  ...sourcesAndConcurrency: [...ObservableInputTuple<A>, number]
): OperatorFunction<T, T | A[number]>;
/** @deprecated Replaced with {@link mergeWith}. Will be removed in v8. */
export function merge<T, A extends readonly unknown[]>(
  ...sourcesAndScheduler: [...ObservableInputTuple<A>, SchedulerLike]
): OperatorFunction<T, T | A[number]>;
/** @deprecated Replaced with {@link mergeWith}. Will be removed in v8. */
export function merge<T, A extends readonly unknown[]>(
  ...sourcesAndConcurrencyAndScheduler: [...ObservableInputTuple<A>, number, SchedulerLike]
): OperatorFunction<T, T | A[number]>;

export function merge<T>(...args: unknown[]): OperatorFunction<T, unknown> {
  const scheduler = popScheduler(args);
  const concurrent = popNumber(args, Infinity);
  args = argsOrArgArray(args);

  return operate((source, subscriber) => {
    mergeAll(concurrent)(from([source, ...(args as ObservableInput<T>[])], scheduler)).subscribe(subscriber);
  });
}
import { mergeMap } from './mergeMap';
import { identity } from '../util/identity';
import { OperatorFunction, ObservableInput, ObservedValueOf } from '../types';

/**
 * Converts a higher-order Observable into a first-order Observable which
 * concurrently delivers all values that are emitted on the inner Observables.
 *
 * <span class="informal">Flattens an Observable-of-Observables.</span>
 *
 * ![](mergeAll.png)
 *
 * `mergeAll` subscribes to an Observable that emits Observables, also known as
 * a higher-order Observable. Each time it observes one of these emitted inner
 * Observables, it subscribes to that and delivers all the values from the
 * inner Observable on the output Observable. The output Observable only
 * completes once all inner Observables have completed. Any error delivered by
 * a inner Observable will be immediately emitted on the output Observable.
 *
 * ## Examples
 *
 * Spawn a new interval Observable for each click event, and blend their outputs as one Observable
 *
 * ```ts
 * import { fromEvent, map, interval, mergeAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const higherOrder = clicks.pipe(map(() => interval(1000)));
 * const firstOrder = higherOrder.pipe(mergeAll());
 *
 * firstOrder.subscribe(x => console.log(x));
 * ```
 *
 * Count from 0 to 9 every second for each click, but only allow 2 concurrent timers
 *
 * ```ts
 * import { fromEvent, map, interval, take, mergeAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const higherOrder = clicks.pipe(
 *   map(() => interval(1000).pipe(take(10)))
 * );
 * const firstOrder = higherOrder.pipe(mergeAll(2));
 *
 * firstOrder.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link combineLatestAll}
 * @see {@link concatAll}
 * @see {@link exhaustAll}
 * @see {@link merge}
 * @see {@link mergeMap}
 * @see {@link mergeMapTo}
 * @see {@link mergeScan}
 * @see {@link switchAll}
 * @see {@link switchMap}
 * @see {@link zipAll}
 *
 * @param {number} [concurrent=Infinity] Maximum number of inner
 * Observables being subscribed to concurrently.
 * @return A function that returns an Observable that emits values coming from
 * all the inner Observables emitted by the source Observable.
 */
export function mergeAll<O extends ObservableInput<any>>(concurrent: number = Infinity): OperatorFunction<O, ObservedValueOf<O>> {
  return mergeMap(identity, concurrent);
}
import { Observable } from '../Observable';
import { innerFrom } from '../observable/innerFrom';
import { Subscriber } from '../Subscriber';
import { ObservableInput, SchedulerLike } from '../types';
import { executeSchedule } from '../util/executeSchedule';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * A process embodying the general "merge" strategy. This is used in
 * `mergeMap` and `mergeScan` because the logic is otherwise nearly identical.
 * @param source The original source observable
 * @param subscriber The consumer subscriber
 * @param project The projection function to get our inner sources
 * @param concurrent The number of concurrent inner subscriptions
 * @param onBeforeNext Additional logic to apply before nexting to our consumer
 * @param expand If `true` this will perform an "expand" strategy, which differs only
 * in that it recurses, and the inner subscription must be schedule-able.
 * @param innerSubScheduler A scheduler to use to schedule inner subscriptions,
 * this is to support the expand strategy, mostly, and should be deprecated
 */
export function mergeInternals<T, R>(
  source: Observable<T>,
  subscriber: Subscriber<R>,
  project: (value: T, index: number) => ObservableInput<R>,
  concurrent: number,
  onBeforeNext?: (innerValue: R) => void,
  expand?: boolean,
  innerSubScheduler?: SchedulerLike,
  additionalFinalizer?: () => void
) {
  // Buffered values, in the event of going over our concurrency limit
  const buffer: T[] = [];
  // The number of active inner subscriptions.
  let active = 0;
  // An index to pass to our accumulator function
  let index = 0;
  // Whether or not the outer source has completed.
  let isComplete = false;

  /**
   * Checks to see if we can complete our result or not.
   */
  const checkComplete = () => {
    // If the outer has completed, and nothing is left in the buffer,
    // and we don't have any active inner subscriptions, then we can
    // Emit the state and complete.
    if (isComplete && !buffer.length && !active) {
      subscriber.complete();
    }
  };

  // If we're under our concurrency limit, just start the inner subscription, otherwise buffer and wait.
  const outerNext = (value: T) => (active < concurrent ? doInnerSub(value) : buffer.push(value));

  const doInnerSub = (value: T) => {
    // If we're expanding, we need to emit the outer values and the inner values
    // as the inners will "become outers" in a way as they are recursively fed
    // back to the projection mechanism.
    expand && subscriber.next(value as any);

    // Increment the number of active subscriptions so we can track it
    // against our concurrency limit later.
    active++;

    // A flag used to show that the inner observable completed.
    // This is checked during finalization to see if we should
    // move to the next item in the buffer, if there is on.
    let innerComplete = false;

    // Start our inner subscription.
    innerFrom(project(value, index++)).subscribe(
      createOperatorSubscriber(
        subscriber,
        (innerValue) => {
          // `mergeScan` has additional handling here. For example
          // taking the inner value and updating state.
          onBeforeNext?.(innerValue);

          if (expand) {
            // If we're expanding, then just recurse back to our outer
            // handler. It will emit the value first thing.
            outerNext(innerValue as any);
          } else {
            // Otherwise, emit the inner value.
            subscriber.next(innerValue);
          }
        },
        () => {
          // Flag that we have completed, so we know to check the buffer
          // during finalization.
          innerComplete = true;
        },
        // Errors are passed to the destination.
        undefined,
        () => {
          // During finalization, if the inner completed (it wasn't errored or
          // cancelled), then we want to try the next item in the buffer if
          // there is one.
          if (innerComplete) {
            // We have to wrap this in a try/catch because it happens during
            // finalization, possibly asynchronously, and we want to pass
            // any errors that happen (like in a projection function) to
            // the outer Subscriber.
            try {
              // INNER SOURCE COMPLETE
              // Decrement the active count to ensure that the next time
              // we try to call `doInnerSub`, the number is accurate.
              active--;
              // If we have more values in the buffer, try to process those
              // Note that this call will increment `active` ahead of the
              // next conditional, if there were any more inner subscriptions
              // to start.
              while (buffer.length && active < concurrent) {
                const bufferedValue = buffer.shift()!;
                // Particularly for `expand`, we need to check to see if a scheduler was provided
                // for when we want to start our inner subscription. Otherwise, we just start
                // are next inner subscription.
                if (innerSubScheduler) {
                  executeSchedule(subscriber, innerSubScheduler, () => doInnerSub(bufferedValue));
                } else {
                  doInnerSub(bufferedValue);
                }
              }
              // Check to see if we can complete, and complete if so.
              checkComplete();
            } catch (err) {
              subscriber.error(err);
            }
          }
        }
      )
    );
  };

  // Subscribe to our source observable.
  source.subscribe(
    createOperatorSubscriber(subscriber, outerNext, () => {
      // Outer completed, make a note of it, and check to see if we can complete everything.
      isComplete = true;
      checkComplete();
    })
  );

  // Additional finalization (for when the destination is torn down).
  // Other finalization is added implicitly via subscription above.
  return () => {
    additionalFinalizer?.();
  };
}
import { ObservableInput, OperatorFunction, ObservedValueOf } from '../types';
import { map } from './map';
import { innerFrom } from '../observable/innerFrom';
import { operate } from '../util/lift';
import { mergeInternals } from './mergeInternals';
import { isFunction } from '../util/isFunction';

/* tslint:disable:max-line-length */
export function mergeMap<T, O extends ObservableInput<any>>(
  project: (value: T, index: number) => O,
  concurrent?: number
): OperatorFunction<T, ObservedValueOf<O>>;
/** @deprecated The `resultSelector` parameter will be removed in v8. Use an inner `map` instead. Details: https://rxjs.dev/deprecations/resultSelector */
export function mergeMap<T, O extends ObservableInput<any>>(
  project: (value: T, index: number) => O,
  resultSelector: undefined,
  concurrent?: number
): OperatorFunction<T, ObservedValueOf<O>>;
/** @deprecated The `resultSelector` parameter will be removed in v8. Use an inner `map` instead. Details: https://rxjs.dev/deprecations/resultSelector */
export function mergeMap<T, R, O extends ObservableInput<any>>(
  project: (value: T, index: number) => O,
  resultSelector: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R,
  concurrent?: number
): OperatorFunction<T, R>;
/* tslint:enable:max-line-length */

/**
 * Projects each source value to an Observable which is merged in the output
 * Observable.
 *
 * <span class="informal">Maps each value to an Observable, then flattens all of
 * these inner Observables using {@link mergeAll}.</span>
 *
 * ![](mergeMap.png)
 *
 * Returns an Observable that emits items based on applying a function that you
 * supply to each item emitted by the source Observable, where that function
 * returns an Observable, and then merging those resulting Observables and
 * emitting the results of this merger.
 *
 * ## Example
 *
 * Map and flatten each letter to an Observable ticking every 1 second
 *
 * ```ts
 * import { of, mergeMap, interval, map } from 'rxjs';
 *
 * const letters = of('a', 'b', 'c');
 * const result = letters.pipe(
 *   mergeMap(x => interval(1000).pipe(map(i => x + i)))
 * );
 *
 * result.subscribe(x => console.log(x));
 *
 * // Results in the following:
 * // a0
 * // b0
 * // c0
 * // a1
 * // b1
 * // c1
 * // continues to list a, b, c every second with respective ascending integers
 * ```
 *
 * @see {@link concatMap}
 * @see {@link exhaustMap}
 * @see {@link merge}
 * @see {@link mergeAll}
 * @see {@link mergeMapTo}
 * @see {@link mergeScan}
 * @see {@link switchMap}
 *
 * @param {function(value: T, ?index: number): ObservableInput} project A function
 * that, when applied to an item emitted by the source Observable, returns an
 * Observable.
 * @param {number} [concurrent=Infinity] Maximum number of input
 * Observables being subscribed to concurrently.
 * @return A function that returns an Observable that emits the result of
 * applying the projection function (and the optional deprecated
 * `resultSelector`) to each item emitted by the source Observable and merging
 * the results of the Observables obtained from this transformation.
 */
export function mergeMap<T, R, O extends ObservableInput<any>>(
  project: (value: T, index: number) => O,
  resultSelector?: ((outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R) | number,
  concurrent: number = Infinity
): OperatorFunction<T, ObservedValueOf<O> | R> {
  if (isFunction(resultSelector)) {
    // DEPRECATED PATH
    return mergeMap((a, i) => map((b: any, ii: number) => resultSelector(a, b, i, ii))(innerFrom(project(a, i))), concurrent);
  } else if (typeof resultSelector === 'number') {
    concurrent = resultSelector;
  }

  return operate((source, subscriber) => mergeInternals(source, subscriber, project, concurrent));
}
import { OperatorFunction, ObservedValueOf, ObservableInput } from '../types';
import { mergeMap } from './mergeMap';
import { isFunction } from '../util/isFunction';

/** @deprecated Will be removed in v9. Use {@link mergeMap} instead: `mergeMap(() => result)` */
export function mergeMapTo<O extends ObservableInput<unknown>>(
  innerObservable: O,
  concurrent?: number
): OperatorFunction<unknown, ObservedValueOf<O>>;
/**
 * @deprecated The `resultSelector` parameter will be removed in v8. Use an inner `map` instead.
 * Details: https://rxjs.dev/deprecations/resultSelector
 */
export function mergeMapTo<T, R, O extends ObservableInput<unknown>>(
  innerObservable: O,
  resultSelector: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R,
  concurrent?: number
): OperatorFunction<T, R>;
/* tslint:enable:max-line-length */

/**
 * Projects each source value to the same Observable which is merged multiple
 * times in the output Observable.
 *
 * <span class="informal">It's like {@link mergeMap}, but maps each value always
 * to the same inner Observable.</span>
 *
 * ![](mergeMapTo.png)
 *
 * Maps each source value to the given Observable `innerObservable` regardless
 * of the source value, and then merges those resulting Observables into one
 * single Observable, which is the output Observable.
 *
 * ## Example
 *
 * For each click event, start an interval Observable ticking every 1 second
 *
 * ```ts
 * import { fromEvent, mergeMapTo, interval } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(mergeMapTo(interval(1000)));
 *
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link concatMapTo}
 * @see {@link merge}
 * @see {@link mergeAll}
 * @see {@link mergeMap}
 * @see {@link mergeScan}
 * @see {@link switchMapTo}
 *
 * @param {ObservableInput} innerObservable An Observable to replace each value from
 * the source Observable.
 * @param {number} [concurrent=Infinity] Maximum number of input
 * Observables being subscribed to concurrently.
 * @return A function that returns an Observable that emits items from the
 * given `innerObservable`.
 * @deprecated Will be removed in v9. Use {@link mergeMap} instead: `mergeMap(() => result)`
 */
export function mergeMapTo<T, R, O extends ObservableInput<unknown>>(
  innerObservable: O,
  resultSelector?: ((outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R) | number,
  concurrent: number = Infinity
): OperatorFunction<T, ObservedValueOf<O> | R> {
  if (isFunction(resultSelector)) {
    return mergeMap(() => innerObservable, resultSelector, concurrent);
  }
  if (typeof resultSelector === 'number') {
    concurrent = resultSelector;
  }
  return mergeMap(() => innerObservable, concurrent);
}
import { ObservableInput, OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { mergeInternals } from './mergeInternals';

/**
 * Applies an accumulator function over the source Observable where the
 * accumulator function itself returns an Observable, then each intermediate
 * Observable returned is merged into the output Observable.
 *
 * <span class="informal">It's like {@link scan}, but the Observables returned
 * by the accumulator are merged into the outer Observable.</span>
 *
 * The first parameter of the `mergeScan` is an `accumulator` function which is
 * being called every time the source Observable emits a value. `mergeScan` will
 * subscribe to the value returned by the `accumulator` function and will emit
 * values to the subscriber emitted by inner Observable.
 *
 * The `accumulator` function is being called with three parameters passed to it:
 * `acc`, `value` and `index`. The `acc` parameter is used as the state parameter
 * whose value is initially set to the `seed` parameter (the second parameter
 * passed to the `mergeScan` operator).
 *
 * `mergeScan` internally keeps the value of the `acc` parameter: as long as the
 * source Observable emits without inner Observable emitting, the `acc` will be
 * set to `seed`. The next time the inner Observable emits a value, `mergeScan`
 * will internally remember it and it will be passed to the `accumulator`
 * function as `acc` parameter the next time source emits.
 *
 * The `value` parameter of the `accumulator` function is the value emitted by the
 * source Observable, while the `index` is a number which represent the order of the
 * current emission by the source Observable. It starts with 0.
 *
 * The last parameter to the `mergeScan` is the `concurrent` value which defaults
 * to Infinity. It represents the maximum number of inner Observable subscriptions
 * at a time.
 *
 * ## Example
 *
 * Count the number of click events
 *
 * ```ts
 * import { fromEvent, map, mergeScan, of } from 'rxjs';
 *
 * const click$ = fromEvent(document, 'click');
 * const one$ = click$.pipe(map(() => 1));
 * const seed = 0;
 * const count$ = one$.pipe(
 *   mergeScan((acc, one) => of(acc + one), seed)
 * );
 *
 * count$.subscribe(x => console.log(x));
 *
 * // Results:
 * // 1
 * // 2
 * // 3
 * // 4
 * // ...and so on for each click
 * ```
 *
 * @see {@link scan}
 * @see {@link switchScan}
 *
 * @param {function(acc: R, value: T): Observable<R>} accumulator
 * The accumulator function called on each source value.
 * @param seed The initial accumulation value.
 * @param {number} [concurrent=Infinity] Maximum number of
 * input Observables being subscribed to concurrently.
 * @return A function that returns an Observable of the accumulated values.
 */
export function mergeScan<T, R>(
  accumulator: (acc: R, value: T, index: number) => ObservableInput<R>,
  seed: R,
  concurrent = Infinity
): OperatorFunction<T, R> {
  return operate((source, subscriber) => {
    // The accumulated state.
    let state = seed;

    return mergeInternals(
      source,
      subscriber,
      (value, index) => accumulator(state, value, index),
      concurrent,
      (value) => {
        state = value;
      },
      false,
      undefined,
      () => (state = null!)
    );
  });
}
import { ObservableInputTuple, OperatorFunction } from '../types';
import { merge } from './merge';

/**
 * Merge the values from all observables to a single observable result.
 *
 * Creates an observable, that when subscribed to, subscribes to the source
 * observable, and all other sources provided as arguments. All values from
 * every source are emitted from the resulting subscription.
 *
 * When all sources complete, the resulting observable will complete.
 *
 * When any source errors, the resulting observable will error.
 *
 * ## Example
 *
 * Joining all outputs from multiple user input event streams
 *
 * ```ts
 * import { fromEvent, map, mergeWith } from 'rxjs';
 *
 * const clicks$ = fromEvent(document, 'click').pipe(map(() => 'click'));
 * const mousemoves$ = fromEvent(document, 'mousemove').pipe(map(() => 'mousemove'));
 * const dblclicks$ = fromEvent(document, 'dblclick').pipe(map(() => 'dblclick'));
 *
 * mousemoves$
 *   .pipe(mergeWith(clicks$, dblclicks$))
 *   .subscribe(x => console.log(x));
 *
 * // result (assuming user interactions)
 * // 'mousemove'
 * // 'mousemove'
 * // 'mousemove'
 * // 'click'
 * // 'click'
 * // 'dblclick'
 * ```
 *
 * @see {@link merge}
 *
 * @param otherSources the sources to combine the current source with.
 * @return A function that returns an Observable that merges the values from
 * all given Observables.
 */
export function mergeWith<T, A extends readonly unknown[]>(
  ...otherSources: [...ObservableInputTuple<A>]
): OperatorFunction<T, T | A[number]> {
  return merge(...otherSources);
}
import { reduce } from './reduce';
import { MonoTypeOperatorFunction } from '../types';
import { isFunction } from '../util/isFunction';

/**
 * The Min operator operates on an Observable that emits numbers (or items that can be compared with a provided function),
 * and when source Observable completes it emits a single item: the item with the smallest value.
 *
 * ![](min.png)
 *
 * ## Examples
 *
 * Get the minimal value of a series of numbers
 *
 * ```ts
 * import { of, min } from 'rxjs';
 *
 * of(5, 4, 7, 2, 8)
 *   .pipe(min())
 *   .subscribe(x => console.log(x));
 *
 * // Outputs
 * // 2
 * ```
 *
 * Use a comparer function to get the minimal item
 *
 * ```ts
 * import { of, min } from 'rxjs';
 *
 * of(
 *   { age: 7, name: 'Foo' },
 *   { age: 5, name: 'Bar' },
 *   { age: 9, name: 'Beer' }
 * ).pipe(
 *   min((a, b) => a.age < b.age ? -1 : 1)
 * )
 * .subscribe(x => console.log(x.name));
 *
 * // Outputs
 * // 'Bar'
 * ```
 *
 * @see {@link max}
 *
 * @param {Function} [comparer] - Optional comparer function that it will use instead of its default to compare the
 * value of two items.
 * @return A function that returns an Observable that emits item with the
 * smallest value.
 */
export function min<T>(comparer?: (x: T, y: T) => number): MonoTypeOperatorFunction<T> {
  return reduce(isFunction(comparer) ? (x, y) => (comparer(x, y) < 0 ? x : y) : (x, y) => (x < y ? x : y));
}
import { Subject } from '../Subject';
import { Observable } from '../Observable';
import { ConnectableObservable } from '../observable/ConnectableObservable';
import { OperatorFunction, UnaryFunction, ObservedValueOf, ObservableInput } from '../types';
import { isFunction } from '../util/isFunction';
import { connect } from './connect';

/**
 * An operator that creates a {@link ConnectableObservable}, that when connected,
 * with the `connect` method, will use the provided subject to multicast the values
 * from the source to all consumers.
 *
 * @param subject The subject to multicast through.
 * @return A function that returns a {@link ConnectableObservable}
 * @deprecated Will be removed in v8. To create a connectable observable, use {@link connectable}.
 * If you're using {@link refCount} after `multicast`, use the {@link share} operator instead.
 * `multicast(subject), refCount()` is equivalent to
 * `share({ connector: () => subject, resetOnError: false, resetOnComplete: false, resetOnRefCountZero: false })`.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function multicast<T>(subject: Subject<T>): UnaryFunction<Observable<T>, ConnectableObservable<T>>;

/**
 * Because this is deprecated in favor of the {@link connect} operator, and was otherwise poorly documented,
 * rather than duplicate the effort of documenting the same behavior, please see documentation for the
 * {@link connect} operator.
 *
 * @param subject The subject used to multicast.
 * @param selector A setup function to setup the multicast
 * @return A function that returns an observable that mirrors the observable returned by the selector.
 * @deprecated Will be removed in v8. Use the {@link connect} operator instead.
 * `multicast(subject, selector)` is equivalent to
 * `connect(selector, { connector: () => subject })`.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function multicast<T, O extends ObservableInput<any>>(
  subject: Subject<T>,
  selector: (shared: Observable<T>) => O
): OperatorFunction<T, ObservedValueOf<O>>;

/**
 * An operator that creates a {@link ConnectableObservable}, that when connected,
 * with the `connect` method, will use the provided subject to multicast the values
 * from the source to all consumers.
 *
 * @param subjectFactory A factory that will be called to create the subject. Passing a function here
 * will cause the underlying subject to be "reset" on error, completion, or refCounted unsubscription of
 * the source.
 * @return A function that returns a {@link ConnectableObservable}
 * @deprecated Will be removed in v8. To create a connectable observable, use {@link connectable}.
 * If you're using {@link refCount} after `multicast`, use the {@link share} operator instead.
 * `multicast(() => new BehaviorSubject('test')), refCount()` is equivalent to
 * `share({ connector: () => new BehaviorSubject('test') })`.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function multicast<T>(subjectFactory: () => Subject<T>): UnaryFunction<Observable<T>, ConnectableObservable<T>>;

/**
 * Because this is deprecated in favor of the {@link connect} operator, and was otherwise poorly documented,
 * rather than duplicate the effort of documenting the same behavior, please see documentation for the
 * {@link connect} operator.
 *
 * @param subjectFactory A factory that creates the subject used to multicast.
 * @param selector A function to setup the multicast and select the output.
 * @return A function that returns an observable that mirrors the observable returned by the selector.
 * @deprecated Will be removed in v8. Use the {@link connect} operator instead.
 * `multicast(subjectFactory, selector)` is equivalent to
 * `connect(selector, { connector: subjectFactory })`.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function multicast<T, O extends ObservableInput<any>>(
  subjectFactory: () => Subject<T>,
  selector: (shared: Observable<T>) => O
): OperatorFunction<T, ObservedValueOf<O>>;

/**
 * @deprecated Will be removed in v8. Use the {@link connectable} observable, the {@link connect} operator or the
 * {@link share} operator instead. See the overloads below for equivalent replacement examples of this operator's
 * behaviors.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function multicast<T, R>(
  subjectOrSubjectFactory: Subject<T> | (() => Subject<T>),
  selector?: (source: Observable<T>) => Observable<R>
): OperatorFunction<T, R> {
  const subjectFactory = isFunction(subjectOrSubjectFactory) ? subjectOrSubjectFactory : () => subjectOrSubjectFactory;

  if (isFunction(selector)) {
    // If a selector function is provided, then we're a "normal" operator that isn't
    // going to return a ConnectableObservable. We can use `connect` to do what we
    // need to do.
    return connect(selector, {
      connector: subjectFactory,
    });
  }

  return (source: Observable<T>) => new ConnectableObservable<any>(source, subjectFactory);
}
/** @prettier */
import { MonoTypeOperatorFunction, SchedulerLike } from '../types';
import { executeSchedule } from '../util/executeSchedule';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Re-emits all notifications from source Observable with specified scheduler.
 *
 * <span class="informal">Ensure a specific scheduler is used, from outside of an Observable.</span>
 *
 * `observeOn` is an operator that accepts a scheduler as a first parameter, which will be used to reschedule
 * notifications emitted by the source Observable. It might be useful, if you do not have control over
 * internal scheduler of a given Observable, but want to control when its values are emitted nevertheless.
 *
 * Returned Observable emits the same notifications (nexted values, complete and error events) as the source Observable,
 * but rescheduled with provided scheduler. Note that this doesn't mean that source Observables internal
 * scheduler will be replaced in any way. Original scheduler still will be used, but when the source Observable emits
 * notification, it will be immediately scheduled again - this time with scheduler passed to `observeOn`.
 * An anti-pattern would be calling `observeOn` on Observable that emits lots of values synchronously, to split
 * that emissions into asynchronous chunks. For this to happen, scheduler would have to be passed into the source
 * Observable directly (usually into the operator that creates it). `observeOn` simply delays notifications a
 * little bit more, to ensure that they are emitted at expected moments.
 *
 * As a matter of fact, `observeOn` accepts second parameter, which specifies in milliseconds with what delay notifications
 * will be emitted. The main difference between {@link delay} operator and `observeOn` is that `observeOn`
 * will delay all notifications - including error notifications - while `delay` will pass through error
 * from source Observable immediately when it is emitted. In general it is highly recommended to use `delay` operator
 * for any kind of delaying of values in the stream, while using `observeOn` to specify which scheduler should be used
 * for notification emissions in general.
 *
 * ## Example
 *
 * Ensure values in subscribe are called just before browser repaint
 *
 * ```ts
 * import { interval, observeOn, animationFrameScheduler } from 'rxjs';
 *
 * const someDiv = document.createElement('div');
 * someDiv.style.cssText = 'width: 200px;background: #09c';
 * document.body.appendChild(someDiv);
 * const intervals = interval(10);      // Intervals are scheduled
 *                                      // with async scheduler by default...
 * intervals.pipe(
 *   observeOn(animationFrameScheduler) // ...but we will observe on animationFrame
 * )                                    // scheduler to ensure smooth animation.
 * .subscribe(val => {
 *   someDiv.style.height = val + 'px';
 * });
 * ```
 *
 * @see {@link delay}
 *
 * @param scheduler Scheduler that will be used to reschedule notifications from source Observable.
 * @param delay Number of milliseconds that states with what delay every notification should be rescheduled.
 * @return A function that returns an Observable that emits the same
 * notifications as the source Observable, but with provided scheduler.
 */
export function observeOn<T>(scheduler: SchedulerLike, delay = 0): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => executeSchedule(subscriber, scheduler, () => subscriber.next(value), delay),
        () => executeSchedule(subscriber, scheduler, () => subscriber.complete(), delay),
        (err) => executeSchedule(subscriber, scheduler, () => subscriber.error(err), delay)
      )
    );
  });
}
import { Observable } from '../Observable';
import { ObservableInputTuple, OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { innerFrom } from '../observable/innerFrom';
import { argsOrArgArray } from '../util/argsOrArgArray';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { noop } from '../util/noop';

export function onErrorResumeNext<T, A extends readonly unknown[]>(
  sources: [...ObservableInputTuple<A>]
): OperatorFunction<T, T | A[number]>;
export function onErrorResumeNext<T, A extends readonly unknown[]>(
  ...sources: [...ObservableInputTuple<A>]
): OperatorFunction<T, T | A[number]>;

/**
 * When any of the provided Observable emits an complete or error notification, it immediately subscribes to the next one
 * that was passed.
 *
 * <span class="informal">Execute series of Observables, subscribes to next one on error or complete.</span>
 *
 * ![](onErrorResumeNext.png)
 *
 * `onErrorResumeNext` is an operator that accepts a series of Observables, provided either directly as
 * arguments or as an array. If no single Observable is provided, returned Observable will simply behave the same
 * as the source.
 *
 * `onErrorResumeNext` returns an Observable that starts by subscribing and re-emitting values from the source Observable.
 * When its stream of values ends - no matter if Observable completed or emitted an error - `onErrorResumeNext`
 * will subscribe to the first Observable that was passed as an argument to the method. It will start re-emitting
 * its values as well and - again - when that stream ends, `onErrorResumeNext` will proceed to subscribing yet another
 * Observable in provided series, no matter if previous Observable completed or ended with an error. This will
 * be happening until there is no more Observables left in the series, at which point returned Observable will
 * complete - even if the last subscribed stream ended with an error.
 *
 * `onErrorResumeNext` can be therefore thought of as version of {@link concat} operator, which is more permissive
 * when it comes to the errors emitted by its input Observables. While `concat` subscribes to the next Observable
 * in series only if previous one successfully completed, `onErrorResumeNext` subscribes even if it ended with
 * an error.
 *
 * Note that you do not get any access to errors emitted by the Observables. In particular do not
 * expect these errors to appear in error callback passed to {@link Observable#subscribe}. If you want to take
 * specific actions based on what error was emitted by an Observable, you should try out {@link catchError} instead.
 *
 *
 * ## Example
 *
 * Subscribe to the next Observable after map fails
 *
 * ```ts
 * import { of, onErrorResumeNext, map } from 'rxjs';
 *
 * of(1, 2, 3, 0)
 *   .pipe(
 *     map(x => {
 *       if (x === 0) {
 *         throw Error();
 *       }
 *
 *       return 10 / x;
 *     }),
 *     onErrorResumeNext(of(1, 2, 3))
 *   )
 *   .subscribe({
 *     next: val => console.log(val),
 *     error: err => console.log(err),          // Will never be called.
 *     complete: () => console.log('that\'s it!')
 *   });
 *
 * // Logs:
 * // 10
 * // 5
 * // 3.3333333333333335
 * // 1
 * // 2
 * // 3
 * // 'that's it!'
 * ```
 *
 * @see {@link concat}
 * @see {@link catchError}
 *
 * @param {...ObservableInput} sources Observables passed either directly or as an array.
 * @return A function that returns an Observable that emits values from source
 * Observable, but - if it errors - subscribes to the next passed Observable
 * and so on, until it completes or runs out of Observables.
 */
export function onErrorResumeNext<T, A extends readonly unknown[]>(
  ...sources: [[...ObservableInputTuple<A>]] | [...ObservableInputTuple<A>]
): OperatorFunction<T, T | A[number]> {
  // For some reason, TS 4.1 RC gets the inference wrong here and infers the
  // result to be `A[number][]` - completely dropping the ObservableInput part
  // of the type. This makes no sense whatsoever. As a workaround, the type is
  // asserted explicitly.
  const nextSources = argsOrArgArray(sources) as unknown as ObservableInputTuple<A>;

  return operate((source, subscriber) => {
    const remaining = [source, ...nextSources];
    const subscribeNext = () => {
      if (!subscriber.closed) {
        if (remaining.length > 0) {
          let nextSource: Observable<A[number]>;
          try {
            nextSource = innerFrom(remaining.shift()!);
          } catch (err) {
            subscribeNext();
            return;
          }

          // Here we have to use one of our Subscribers, or it does not wire up
          // The `closed` property of upstream Subscribers synchronously, that
          // would result in situation were we could not stop a synchronous firehose
          // with something like `take(3)`.
          const innerSub = createOperatorSubscriber(subscriber, undefined, noop, noop);
          nextSource.subscribe(innerSub);
          innerSub.add(subscribeNext);
        } else {
          subscriber.complete();
        }
      }
    };

    subscribeNext();
  });
}
import { OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Groups pairs of consecutive emissions together and emits them as an array of
 * two values.
 *
 * <span class="informal">Puts the current value and previous value together as
 * an array, and emits that.</span>
 *
 * ![](pairwise.png)
 *
 * The Nth emission from the source Observable will cause the output Observable
 * to emit an array [(N-1)th, Nth] of the previous and the current value, as a
 * pair. For this reason, `pairwise` emits on the second and subsequent
 * emissions from the source Observable, but not on the first emission, because
 * there is no previous value in that case.
 *
 * ## Example
 *
 * On every click (starting from the second), emit the relative distance to the previous click
 *
 * ```ts
 * import { fromEvent, pairwise, map } from 'rxjs';
 *
 * const clicks = fromEvent<PointerEvent>(document, 'click');
 * const pairs = clicks.pipe(pairwise());
 * const distance = pairs.pipe(
 *   map(([first, second]) => {
 *     const x0 = first.clientX;
 *     const y0 = first.clientY;
 *     const x1 = second.clientX;
 *     const y1 = second.clientY;
 *     return Math.sqrt(Math.pow(x0 - x1, 2) + Math.pow(y0 - y1, 2));
 *   })
 * );
 *
 * distance.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link buffer}
 * @see {@link bufferCount}
 *
 * @return A function that returns an Observable of pairs (as arrays) of
 * consecutive values from the source Observable.
 */
export function pairwise<T>(): OperatorFunction<T, [T, T]> {
  return operate((source, subscriber) => {
    let prev: T;
    let hasPrev = false;
    source.subscribe(
      createOperatorSubscriber(subscriber, (value) => {
        const p = prev;
        prev = value;
        hasPrev && subscriber.next([p, value]);
        hasPrev = true;
      })
    );
  });
}
import { not } from '../util/not';
import { filter } from './filter';
import { Observable } from '../Observable';
import { UnaryFunction } from '../types';

/**
 * Splits the source Observable into two, one with values that satisfy a
 * predicate, and another with values that don't satisfy the predicate.
 *
 * <span class="informal">It's like {@link filter}, but returns two Observables:
 * one like the output of {@link filter}, and the other with values that did not
 * pass the condition.</span>
 *
 * ![](partition.png)
 *
 * `partition` outputs an array with two Observables that partition the values
 * from the source Observable through the given `predicate` function. The first
 * Observable in that array emits source values for which the predicate argument
 * returns true. The second Observable emits source values for which the
 * predicate returns false. The first behaves like {@link filter} and the second
 * behaves like {@link filter} with the predicate negated.
 *
 * ## Example
 *
 * Partition click events into those on DIV elements and those elsewhere
 *
 * ```ts
 * import { fromEvent } from 'rxjs';
 * import { partition } from 'rxjs/operators';
 *
 * const div = document.createElement('div');
 * div.style.cssText = 'width: 200px; height: 200px; background: #09c;';
 * document.body.appendChild(div);
 *
 * const clicks = fromEvent(document, 'click');
 * const [clicksOnDivs, clicksElsewhere] = clicks.pipe(partition(ev => (<HTMLElement>ev.target).tagName === 'DIV'));
 *
 * clicksOnDivs.subscribe(x => console.log('DIV clicked: ', x));
 * clicksElsewhere.subscribe(x => console.log('Other clicked: ', x));
 * ```
 *
 * @see {@link filter}
 *
 * @param {function(value: T, index: number): boolean} predicate A function that
 * evaluates each value emitted by the source Observable. If it returns `true`,
 * the value is emitted on the first Observable in the returned array, if
 * `false` the value is emitted on the second Observable in the array. The
 * `index` parameter is the number `i` for the i-th source emission that has
 * happened since the subscription, starting from the number `0`.
 * @param {any} [thisArg] An optional argument to determine the value of `this`
 * in the `predicate` function.
 * @return A function that returns an array with two Observables: one with
 * values that passed the predicate, and another with values that did not pass
 * the predicate.
 * @deprecated Replaced with the `partition` static creation function. Will be removed in v8.
 */
export function partition<T>(
  predicate: (value: T, index: number) => boolean,
  thisArg?: any
): UnaryFunction<Observable<T>, [Observable<T>, Observable<T>]> {
  return (source: Observable<T>) =>
    [filter(predicate, thisArg)(source), filter(not(predicate, thisArg))(source)] as [Observable<T>, Observable<T>];
}
import { map } from './map';
import { OperatorFunction } from '../types';

/* tslint:disable:max-line-length */
/** @deprecated Use {@link map} and optional chaining: `pluck('foo', 'bar')` is `map(x => x?.foo?.bar)`. Will be removed in v8. */
export function pluck<T, K1 extends keyof T>(k1: K1): OperatorFunction<T, T[K1]>;
/** @deprecated Use {@link map} and optional chaining: `pluck('foo', 'bar')` is `map(x => x?.foo?.bar)`. Will be removed in v8. */
export function pluck<T, K1 extends keyof T, K2 extends keyof T[K1]>(k1: K1, k2: K2): OperatorFunction<T, T[K1][K2]>;
/** @deprecated Use {@link map} and optional chaining: `pluck('foo', 'bar')` is `map(x => x?.foo?.bar)`. Will be removed in v8. */
export function pluck<T, K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2]>(
  k1: K1,
  k2: K2,
  k3: K3
): OperatorFunction<T, T[K1][K2][K3]>;
/** @deprecated Use {@link map} and optional chaining: `pluck('foo', 'bar')` is `map(x => x?.foo?.bar)`. Will be removed in v8. */
export function pluck<T, K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3]>(
  k1: K1,
  k2: K2,
  k3: K3,
  k4: K4
): OperatorFunction<T, T[K1][K2][K3][K4]>;
/** @deprecated Use {@link map} and optional chaining: `pluck('foo', 'bar')` is `map(x => x?.foo?.bar)`. Will be removed in v8. */
export function pluck<
  T,
  K1 extends keyof T,
  K2 extends keyof T[K1],
  K3 extends keyof T[K1][K2],
  K4 extends keyof T[K1][K2][K3],
  K5 extends keyof T[K1][K2][K3][K4]
>(k1: K1, k2: K2, k3: K3, k4: K4, k5: K5): OperatorFunction<T, T[K1][K2][K3][K4][K5]>;
/** @deprecated Use {@link map} and optional chaining: `pluck('foo', 'bar')` is `map(x => x?.foo?.bar)`. Will be removed in v8. */
export function pluck<
  T,
  K1 extends keyof T,
  K2 extends keyof T[K1],
  K3 extends keyof T[K1][K2],
  K4 extends keyof T[K1][K2][K3],
  K5 extends keyof T[K1][K2][K3][K4],
  K6 extends keyof T[K1][K2][K3][K4][K5]
>(k1: K1, k2: K2, k3: K3, k4: K4, k5: K5, k6: K6): OperatorFunction<T, T[K1][K2][K3][K4][K5][K6]>;
/** @deprecated Use {@link map} and optional chaining: `pluck('foo', 'bar')` is `map(x => x?.foo?.bar)`. Will be removed in v8. */
export function pluck<
  T,
  K1 extends keyof T,
  K2 extends keyof T[K1],
  K3 extends keyof T[K1][K2],
  K4 extends keyof T[K1][K2][K3],
  K5 extends keyof T[K1][K2][K3][K4],
  K6 extends keyof T[K1][K2][K3][K4][K5]
>(k1: K1, k2: K2, k3: K3, k4: K4, k5: K5, k6: K6, ...rest: string[]): OperatorFunction<T, unknown>;
/** @deprecated Use {@link map} and optional chaining: `pluck('foo', 'bar')` is `map(x => x?.foo?.bar)`. Will be removed in v8. */
export function pluck<T>(...properties: string[]): OperatorFunction<T, unknown>;
/* tslint:enable:max-line-length */

/**
 * Maps each source value to its specified nested property.
 *
 * <span class="informal">Like {@link map}, but meant only for picking one of
 * the nested properties of every emitted value.</span>
 *
 * ![](pluck.png)
 *
 * Given a list of strings or numbers describing a path to a property, retrieves
 * the value of a specified nested property from all values in the source
 * Observable. If a property can't be resolved, it will return `undefined` for
 * that value.
 *
 * ## Example
 *
 * Map every click to the tagName of the clicked target element
 *
 * ```ts
 * import { fromEvent, pluck } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const tagNames = clicks.pipe(pluck('target', 'tagName'));
 *
 * tagNames.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link map}
 *
 * @param properties The nested properties to pluck from each source
 * value.
 * @return A function that returns an Observable of property values from the
 * source values.
 * @deprecated Use {@link map} and optional chaining: `pluck('foo', 'bar')` is `map(x => x?.foo?.bar)`. Will be removed in v8.
 */
export function pluck<T, R>(...properties: Array<string | number | symbol>): OperatorFunction<T, R> {
  const length = properties.length;
  if (length === 0) {
    throw new Error('list of properties cannot be empty.');
  }
  return map((x) => {
    let currentProp: any = x;
    for (let i = 0; i < length; i++) {
      const p = currentProp?.[properties[i]];
      if (typeof p !== 'undefined') {
        currentProp = p;
      } else {
        return undefined;
      }
    }
    return currentProp;
  });
}
import { Observable } from '../Observable';
import { Subject } from '../Subject';
import { multicast } from './multicast';
import { ConnectableObservable } from '../observable/ConnectableObservable';
import { MonoTypeOperatorFunction, OperatorFunction, UnaryFunction, ObservableInput, ObservedValueOf } from '../types';
import { connect } from './connect';

/**
 * Returns a connectable observable that, when connected, will multicast
 * all values through a single underlying {@link Subject} instance.
 *
 * @deprecated Will be removed in v8. To create a connectable observable, use {@link connectable}.
 * `source.pipe(publish())` is equivalent to
 * `connectable(source, { connector: () => new Subject(), resetOnDisconnect: false })`.
 * If you're using {@link refCount} after `publish`, use {@link share} operator instead.
 * `source.pipe(publish(), refCount())` is equivalent to
 * `source.pipe(share({ resetOnError: false, resetOnComplete: false, resetOnRefCountZero: false }))`.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function publish<T>(): UnaryFunction<Observable<T>, ConnectableObservable<T>>;

/**
 * Returns an observable, that when subscribed to, creates an underlying {@link Subject},
 * provides an observable view of it to a `selector` function, takes the observable result of
 * that selector function and subscribes to it, sending its values to the consumer, _then_ connects
 * the subject to the original source.
 *
 * @param selector A function used to setup multicasting prior to automatic connection.
 *
 * @deprecated Will be removed in v8. Use the {@link connect} operator instead.
 * `publish(selector)` is equivalent to `connect(selector)`.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function publish<T, O extends ObservableInput<any>>(selector: (shared: Observable<T>) => O): OperatorFunction<T, ObservedValueOf<O>>;

/**
 * Returns a ConnectableObservable, which is a variety of Observable that waits until its connect method is called
 * before it begins emitting items to those Observers that have subscribed to it.
 *
 * <span class="informal">Makes a cold Observable hot</span>
 *
 * ![](publish.png)
 *
 * ## Examples
 *
 * Make `source$` hot by applying `publish` operator, then merge each inner observable into a single one
 * and subscribe
 *
 * ```ts
 * import { zip, interval, of, map, publish, merge, tap } from 'rxjs';
 *
 * const source$ = zip(interval(2000), of(1, 2, 3, 4, 5, 6, 7, 8, 9))
 *   .pipe(map(([, number]) => number));
 *
 * source$
 *   .pipe(
 *     publish(multicasted$ =>
 *       merge(
 *         multicasted$.pipe(tap(x => console.log('Stream 1:', x))),
 *         multicasted$.pipe(tap(x => console.log('Stream 2:', x))),
 *         multicasted$.pipe(tap(x => console.log('Stream 3:', x)))
 *       )
 *     )
 *   )
 *   .subscribe();
 *
 * // Results every two seconds
 * // Stream 1: 1
 * // Stream 2: 1
 * // Stream 3: 1
 * // ...
 * // Stream 1: 9
 * // Stream 2: 9
 * // Stream 3: 9
 * ```
 *
 * @see {@link publishLast}
 * @see {@link publishReplay}
 * @see {@link publishBehavior}
 *
 * @param {Function} [selector] - Optional selector function which can use the multicasted source sequence as many times
 * as needed, without causing multiple subscriptions to the source sequence.
 * Subscribers to the given source will receive all notifications of the source from the time of the subscription on.
 * @return A function that returns a ConnectableObservable that upon connection
 * causes the source Observable to emit items to its Observers.
 * @deprecated Will be removed in v8. Use the {@link connectable} observable, the {@link connect} operator or the
 * {@link share} operator instead. See the overloads below for equivalent replacement examples of this operator's
 * behaviors.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function publish<T, R>(selector?: OperatorFunction<T, R>): MonoTypeOperatorFunction<T> | OperatorFunction<T, R> {
  return selector ? (source) => connect(selector)(source) : (source) => multicast(new Subject<T>())(source);
}
import { Observable } from '../Observable';
import { BehaviorSubject } from '../BehaviorSubject';
import { ConnectableObservable } from '../observable/ConnectableObservable';
import { UnaryFunction } from '../types';

/**
 * Creates a {@link ConnectableObservable} that utilizes a {@link BehaviorSubject}.
 *
 * @param initialValue The initial value passed to the {@link BehaviorSubject}.
 * @return A function that returns a {@link ConnectableObservable}
 * @deprecated Will be removed in v8. To create a connectable observable that uses a
 * {@link BehaviorSubject} under the hood, use {@link connectable}.
 * `source.pipe(publishBehavior(initValue))` is equivalent to
 * `connectable(source, { connector: () => new BehaviorSubject(initValue), resetOnDisconnect: false })`.
 * If you're using {@link refCount} after `publishBehavior`, use the {@link share} operator instead.
 * `source.pipe(publishBehavior(initValue), refCount())` is equivalent to
 * `source.pipe(share({ connector: () => new BehaviorSubject(initValue), resetOnError: false, resetOnComplete: false, resetOnRefCountZero: false  }))`.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function publishBehavior<T>(initialValue: T): UnaryFunction<Observable<T>, ConnectableObservable<T>> {
  // Note that this has *never* supported the selector function.
  return (source) => {
    const subject = new BehaviorSubject<T>(initialValue);
    return new ConnectableObservable(source, () => subject);
  };
}
import { Observable } from '../Observable';
import { AsyncSubject } from '../AsyncSubject';
import { ConnectableObservable } from '../observable/ConnectableObservable';
import { UnaryFunction } from '../types';

/**
 * Returns a connectable observable sequence that shares a single subscription to the
 * underlying sequence containing only the last notification.
 *
 * ![](publishLast.png)
 *
 * Similar to {@link publish}, but it waits until the source observable completes and stores
 * the last emitted value.
 * Similarly to {@link publishReplay} and {@link publishBehavior}, this keeps storing the last
 * value even if it has no more subscribers. If subsequent subscriptions happen, they will
 * immediately get that last stored value and complete.
 *
 * ## Example
 *
 * ```ts
 * import { ConnectableObservable, interval, publishLast, tap, take } from 'rxjs';
 *
 * const connectable = <ConnectableObservable<number>>interval(1000)
 *   .pipe(
 *     tap(x => console.log('side effect', x)),
 *     take(3),
 *     publishLast()
 *   );
 *
 * connectable.subscribe({
 *   next: x => console.log('Sub. A', x),
 *   error: err => console.log('Sub. A Error', err),
 *   complete: () => console.log('Sub. A Complete')
 * });
 *
 * connectable.subscribe({
 *   next: x => console.log('Sub. B', x),
 *   error: err => console.log('Sub. B Error', err),
 *   complete: () => console.log('Sub. B Complete')
 * });
 *
 * connectable.connect();
 *
 * // Results:
 * // 'side effect 0'   - after one second
 * // 'side effect 1'   - after two seconds
 * // 'side effect 2'   - after three seconds
 * // 'Sub. A 2'        - immediately after 'side effect 2'
 * // 'Sub. B 2'
 * // 'Sub. A Complete'
 * // 'Sub. B Complete'
 * ```
 *
 * @see {@link ConnectableObservable}
 * @see {@link publish}
 * @see {@link publishReplay}
 * @see {@link publishBehavior}
 *
 * @return A function that returns an Observable that emits elements of a
 * sequence produced by multicasting the source sequence.
 * @deprecated Will be removed in v8. To create a connectable observable with an
 * {@link AsyncSubject} under the hood, use {@link connectable}.
 * `source.pipe(publishLast())` is equivalent to
 * `connectable(source, { connector: () => new AsyncSubject(), resetOnDisconnect: false })`.
 * If you're using {@link refCount} after `publishLast`, use the {@link share} operator instead.
 * `source.pipe(publishLast(), refCount())` is equivalent to
 * `source.pipe(share({ connector: () => new AsyncSubject(), resetOnError: false, resetOnComplete: false, resetOnRefCountZero: false }))`.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function publishLast<T>(): UnaryFunction<Observable<T>, ConnectableObservable<T>> {
  // Note that this has *never* supported a selector function like `publish` and `publishReplay`.
  return (source) => {
    const subject = new AsyncSubject<T>();
    return new ConnectableObservable(source, () => subject);
  };
}
import { Observable } from '../Observable';
import { ReplaySubject } from '../ReplaySubject';
import { multicast } from './multicast';
import { MonoTypeOperatorFunction, OperatorFunction, TimestampProvider, ObservableInput, ObservedValueOf } from '../types';
import { isFunction } from '../util/isFunction';

/**
 * Creates a {@link ConnectableObservable} that uses a {@link ReplaySubject}
 * internally.
 *
 * @param bufferSize The buffer size for the underlying {@link ReplaySubject}.
 * @param windowTime The window time for the underlying {@link ReplaySubject}.
 * @param timestampProvider The timestamp provider for the underlying {@link ReplaySubject}.
 * @deprecated Will be removed in v8. To create a connectable observable that uses a
 * {@link ReplaySubject} under the hood, use {@link connectable}.
 * `source.pipe(publishReplay(size, time, scheduler))` is equivalent to
 * `connectable(source, { connector: () => new ReplaySubject(size, time, scheduler), resetOnDisconnect: false })`.
 * If you're using {@link refCount} after `publishReplay`, use the {@link share} operator instead.
 * `publishReplay(size, time, scheduler), refCount()` is equivalent to
 * `share({ connector: () => new ReplaySubject(size, time, scheduler), resetOnError: false, resetOnComplete: false, resetOnRefCountZero: false })`.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function publishReplay<T>(
  bufferSize?: number,
  windowTime?: number,
  timestampProvider?: TimestampProvider
): MonoTypeOperatorFunction<T>;

/**
 * Creates an observable, that when subscribed to, will create a {@link ReplaySubject},
 * and pass an observable from it (using [asObservable](api/index/class/Subject#asObservable)) to
 * the `selector` function, which then returns an observable that is subscribed to before
 * "connecting" the source to the internal `ReplaySubject`.
 *
 * Since this is deprecated, for additional details see the documentation for {@link connect}.
 *
 * @param bufferSize The buffer size for the underlying {@link ReplaySubject}.
 * @param windowTime The window time for the underlying {@link ReplaySubject}.
 * @param selector A function used to setup the multicast.
 * @param timestampProvider The timestamp provider for the underlying {@link ReplaySubject}.
 * @deprecated Will be removed in v8. Use the {@link connect} operator instead.
 * `source.pipe(publishReplay(size, window, selector, scheduler))` is equivalent to
 * `source.pipe(connect(selector, { connector: () => new ReplaySubject(size, window, scheduler) }))`.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function publishReplay<T, O extends ObservableInput<any>>(
  bufferSize: number | undefined,
  windowTime: number | undefined,
  selector: (shared: Observable<T>) => O,
  timestampProvider?: TimestampProvider
): OperatorFunction<T, ObservedValueOf<O>>;

/**
 * Creates a {@link ConnectableObservable} that uses a {@link ReplaySubject}
 * internally.
 *
 * @param bufferSize The buffer size for the underlying {@link ReplaySubject}.
 * @param windowTime The window time for the underlying {@link ReplaySubject}.
 * @param selector Passing `undefined` here determines that this operator will return a {@link ConnectableObservable}.
 * @param timestampProvider The timestamp provider for the underlying {@link ReplaySubject}.
 * @deprecated Will be removed in v8. To create a connectable observable that uses a
 * {@link ReplaySubject} under the hood, use {@link connectable}.
 * `source.pipe(publishReplay(size, time, scheduler))` is equivalent to
 * `connectable(source, { connector: () => new ReplaySubject(size, time, scheduler), resetOnDisconnect: false })`.
 * If you're using {@link refCount} after `publishReplay`, use the {@link share} operator instead.
 * `publishReplay(size, time, scheduler), refCount()` is equivalent to
 * `share({ connector: () => new ReplaySubject(size, time, scheduler), resetOnError: false, resetOnComplete: false, resetOnRefCountZero: false })`.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function publishReplay<T, O extends ObservableInput<any>>(
  bufferSize: number | undefined,
  windowTime: number | undefined,
  selector: undefined,
  timestampProvider: TimestampProvider
): OperatorFunction<T, ObservedValueOf<O>>;

/**
 * @deprecated Will be removed in v8. Use the {@link connectable} observable, the {@link connect} operator or the
 * {@link share} operator instead. See the overloads below for equivalent replacement examples of this operator's
 * behaviors.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function publishReplay<T, R>(
  bufferSize?: number,
  windowTime?: number,
  selectorOrScheduler?: TimestampProvider | OperatorFunction<T, R>,
  timestampProvider?: TimestampProvider
) {
  if (selectorOrScheduler && !isFunction(selectorOrScheduler)) {
    timestampProvider = selectorOrScheduler;
  }
  const selector = isFunction(selectorOrScheduler) ? selectorOrScheduler : undefined;
  // Note, we're passing `selector!` here, because at runtime, `undefined` is an acceptable argument
  // but it makes our TypeScript signature for `multicast` unhappy (as it should, because it's gross).
  return (source: Observable<T>) => multicast(new ReplaySubject<T>(bufferSize, windowTime, timestampProvider), selector!)(source);
}
import { ObservableInputTuple, OperatorFunction } from '../types';
import { argsOrArgArray } from '../util/argsOrArgArray';
import { raceWith } from './raceWith';

/** @deprecated Replaced with {@link raceWith}. Will be removed in v8. */
export function race<T, A extends readonly unknown[]>(otherSources: [...ObservableInputTuple<A>]): OperatorFunction<T, T | A[number]>;
/** @deprecated Replaced with {@link raceWith}. Will be removed in v8. */
export function race<T, A extends readonly unknown[]>(...otherSources: [...ObservableInputTuple<A>]): OperatorFunction<T, T | A[number]>;

/**
 * Returns an Observable that mirrors the first source Observable to emit a next,
 * error or complete notification from the combination of this Observable and supplied Observables.
 * @param args Sources used to race for which Observable emits first.
 * @return A function that returns an Observable that mirrors the output of the
 * first Observable to emit an item.
 * @deprecated Replaced with {@link raceWith}. Will be removed in v8.
 */
export function race<T>(...args: any[]): OperatorFunction<T, unknown> {
  return raceWith(...argsOrArgArray(args));
}
import { OperatorFunction, ObservableInputTuple } from '../types';
import { raceInit } from '../observable/race';
import { operate } from '../util/lift';
import { identity } from '../util/identity';

/**
 * Creates an Observable that mirrors the first source Observable to emit a next,
 * error or complete notification from the combination of the Observable to which
 * the operator is applied and supplied Observables.
 *
 * ## Example
 *
 * ```ts
 * import { interval, map, raceWith } from 'rxjs';
 *
 * const obs1 = interval(7000).pipe(map(() => 'slow one'));
 * const obs2 = interval(3000).pipe(map(() => 'fast one'));
 * const obs3 = interval(5000).pipe(map(() => 'medium one'));
 *
 * obs1
 *   .pipe(raceWith(obs2, obs3))
 *   .subscribe(winner => console.log(winner));
 *
 * // Outputs
 * // a series of 'fast one'
 * ```
 *
 * @param otherSources Sources used to race for which Observable emits first.
 * @return A function that returns an Observable that mirrors the output of the
 * first Observable to emit an item.
 */
export function raceWith<T, A extends readonly unknown[]>(
  ...otherSources: [...ObservableInputTuple<A>]
): OperatorFunction<T, T | A[number]> {
  return !otherSources.length
    ? identity
    : operate((source, subscriber) => {
        raceInit<T | A[number]>([source, ...otherSources])(subscriber);
      });
}
import { scanInternals } from './scanInternals';
import { OperatorFunction } from '../types';
import { operate } from '../util/lift';

export function reduce<V, A = V>(accumulator: (acc: A | V, value: V, index: number) => A): OperatorFunction<V, V | A>;
export function reduce<V, A>(accumulator: (acc: A, value: V, index: number) => A, seed: A): OperatorFunction<V, A>;
export function reduce<V, A, S = A>(accumulator: (acc: A | S, value: V, index: number) => A, seed: S): OperatorFunction<V, A>;

/**
 * Applies an accumulator function over the source Observable, and returns the
 * accumulated result when the source completes, given an optional seed value.
 *
 * <span class="informal">Combines together all values emitted on the source,
 * using an accumulator function that knows how to join a new source value into
 * the accumulation from the past.</span>
 *
 * ![](reduce.png)
 *
 * Like
 * [Array.prototype.reduce()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce),
 * `reduce` applies an `accumulator` function against an accumulation and each
 * value of the source Observable (from the past) to reduce it to a single
 * value, emitted on the output Observable. Note that `reduce` will only emit
 * one value, only when the source Observable completes. It is equivalent to
 * applying operator {@link scan} followed by operator {@link last}.
 *
 * Returns an Observable that applies a specified `accumulator` function to each
 * item emitted by the source Observable. If a `seed` value is specified, then
 * that value will be used as the initial value for the accumulator. If no seed
 * value is specified, the first item of the source is used as the seed.
 *
 * ## Example
 *
 * Count the number of click events that happened in 5 seconds
 *
 * ```ts
 * import { fromEvent, takeUntil, interval, map, reduce } from 'rxjs';
 *
 * const clicksInFiveSeconds = fromEvent(document, 'click')
 *   .pipe(takeUntil(interval(5000)));
 *
 * const ones = clicksInFiveSeconds.pipe(map(() => 1));
 * const seed = 0;
 * const count = ones.pipe(reduce((acc, one) => acc + one, seed));
 *
 * count.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link count}
 * @see {@link expand}
 * @see {@link mergeScan}
 * @see {@link scan}
 *
 * @param {function(acc: A, value: V, index: number): A} accumulator The accumulator function
 * called on each source value.
 * @param {A} [seed] The initial accumulation value.
 * @return A function that returns an Observable that emits a single value that
 * is the result of accumulating the values emitted by the source Observable.
 */
export function reduce<V, A>(accumulator: (acc: V | A, value: V, index: number) => A, seed?: any): OperatorFunction<V, V | A> {
  return operate(scanInternals(accumulator, seed, arguments.length >= 2, false, true));
}
import { ConnectableObservable } from '../observable/ConnectableObservable';
import { Subscription } from '../Subscription';
import { MonoTypeOperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Make a {@link ConnectableObservable} behave like a ordinary observable and automates the way
 * you can connect to it.
 *
 * Internally it counts the subscriptions to the observable and subscribes (only once) to the source if
 * the number of subscriptions is larger than 0. If the number of subscriptions is smaller than 1, it
 * unsubscribes from the source. This way you can make sure that everything before the *published*
 * refCount has only a single subscription independently of the number of subscribers to the target
 * observable.
 *
 * Note that using the {@link share} operator is exactly the same as using the `multicast(() => new Subject())` operator
 * (making the observable hot) and the *refCount* operator in a sequence.
 *
 * ![](refCount.png)
 *
 * ## Example
 *
 * In the following example there are two intervals turned into connectable observables
 * by using the *publish* operator. The first one uses the *refCount* operator, the
 * second one does not use it. You will notice that a connectable observable does nothing
 * until you call its connect function.
 *
 * ```ts
 * import { interval, tap, publish, refCount } from 'rxjs';
 *
 * // Turn the interval observable into a ConnectableObservable (hot)
 * const refCountInterval = interval(400).pipe(
 *   tap(num => console.log(`refCount ${ num }`)),
 *   publish(),
 *   refCount()
 * );
 *
 * const publishedInterval = interval(400).pipe(
 *   tap(num => console.log(`publish ${ num }`)),
 *   publish()
 * );
 *
 * refCountInterval.subscribe();
 * refCountInterval.subscribe();
 * // 'refCount 0' -----> 'refCount 1' -----> etc
 * // All subscriptions will receive the same value and the tap (and
 * // every other operator) before the `publish` operator will be executed
 * // only once per event independently of the number of subscriptions.
 *
 * publishedInterval.subscribe();
 * // Nothing happens until you call .connect() on the observable.
 * ```
 *
 * @return A function that returns an Observable that automates the connection
 * to ConnectableObservable.
 * @see {@link ConnectableObservable}
 * @see {@link share}
 * @see {@link publish}
 * @deprecated Replaced with the {@link share} operator. How `share` is used
 * will depend on the connectable observable you created just prior to the
 * `refCount` operator.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export function refCount<T>(): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    let connection: Subscription | null = null;

    (source as any)._refCount++;

    const refCounter = createOperatorSubscriber(subscriber, undefined, undefined, undefined, () => {
      if (!source || (source as any)._refCount <= 0 || 0 < --(source as any)._refCount) {
        connection = null;
        return;
      }

      ///
      // Compare the local RefCountSubscriber's connection Subscription to the
      // connection Subscription on the shared ConnectableObservable. In cases
      // where the ConnectableObservable source synchronously emits values, and
      // the RefCountSubscriber's downstream Observers synchronously unsubscribe,
      // execution continues to here before the RefCountOperator has a chance to
      // supply the RefCountSubscriber with the shared connection Subscription.
      // For example:
      // ```
      // range(0, 10).pipe(
      //   publish(),
      //   refCount(),
      //   take(5),
      // )
      // .subscribe();
      // ```
      // In order to account for this case, RefCountSubscriber should only dispose
      // the ConnectableObservable's shared connection Subscription if the
      // connection Subscription exists, *and* either:
      //   a. RefCountSubscriber doesn't have a reference to the shared connection
      //      Subscription yet, or,
      //   b. RefCountSubscriber's connection Subscription reference is identical
      //      to the shared connection Subscription
      ///

      const sharedConnection = (source as any)._connection;
      const conn = connection;
      connection = null;

      if (sharedConnection && (!conn || sharedConnection === conn)) {
        sharedConnection.unsubscribe();
      }

      subscriber.unsubscribe();
    });

    source.subscribe(refCounter);

    if (!refCounter.closed) {
      connection = (source as ConnectableObservable<T>).connect();
    }
  });
}
import { Subscription } from '../Subscription';
import { EMPTY } from '../observable/empty';
import { operate } from '../util/lift';
import { MonoTypeOperatorFunction, ObservableInput } from '../types';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';
import { timer } from '../observable/timer';

export interface RepeatConfig {
  /**
   * The number of times to repeat the source. Defaults to `Infinity`.
   */
  count?: number;

  /**
   * If a `number`, will delay the repeat of the source by that number of milliseconds.
   * If a function, it will provide the number of times the source has been subscribed to,
   * and the return value should be a valid observable input that will notify when the source
   * should be repeated. If the notifier observable is empty, the result will complete.
   */
  delay?: number | ((count: number) => ObservableInput<any>);
}

/**
 * Returns an Observable that will resubscribe to the source stream when the source stream completes.
 *
 * <span class="informal">Repeats all values emitted on the source. It's like {@link retry}, but for non error cases.</span>
 *
 * ![](repeat.png)
 *
 * Repeat will output values from a source until the source completes, then it will resubscribe to the
 * source a specified number of times, with a specified delay. Repeat can be particularly useful in
 * combination with closing operators like {@link take}, {@link takeUntil}, {@link first}, or {@link takeWhile},
 * as it can be used to restart a source again from scratch.
 *
 * Repeat is very similar to {@link retry}, where {@link retry} will resubscribe to the source in the error case, but
 * `repeat` will resubscribe if the source completes.
 *
 * Note that `repeat` will _not_ catch errors. Use {@link retry} for that.
 *
 * - `repeat(0)` returns an empty observable
 * - `repeat()` will repeat forever
 * - `repeat({ delay: 200 })` will repeat forever, with a delay of 200ms between repetitions.
 * - `repeat({ count: 2, delay: 400 })` will repeat twice, with a delay of 400ms between repetitions.
 * - `repeat({ delay: (count) => timer(count * 1000) })` will repeat forever, but will have a delay that grows by one second for each repetition.
 *
 * ## Example
 *
 * Repeat a message stream
 *
 * ```ts
 * import { of, repeat } from 'rxjs';
 *
 * const source = of('Repeat message');
 * const result = source.pipe(repeat(3));
 *
 * result.subscribe(x => console.log(x));
 *
 * // Results
 * // 'Repeat message'
 * // 'Repeat message'
 * // 'Repeat message'
 * ```
 *
 * Repeat 3 values, 2 times
 *
 * ```ts
 * import { interval, take, repeat } from 'rxjs';
 *
 * const source = interval(1000);
 * const result = source.pipe(take(3), repeat(2));
 *
 * result.subscribe(x => console.log(x));
 *
 * // Results every second
 * // 0
 * // 1
 * // 2
 * // 0
 * // 1
 * // 2
 * ```
 *
 * Defining two complex repeats with delays on the same source.
 * Note that the second repeat cannot be called until the first
 * repeat as exhausted it's count.
 *
 * ```ts
 * import { defer, of, repeat } from 'rxjs';
 *
 * const source = defer(() => {
 *    return of(`Hello, it is ${new Date()}`)
 * });
 *
 * source.pipe(
 *    // Repeat 3 times with a delay of 1 second between repetitions
 *    repeat({
 *      count: 3,
 *      delay: 1000,
 *    }),
 *
 *    // *Then* repeat forever, but with an exponential step-back
 *    // maxing out at 1 minute.
 *    repeat({
 *      delay: (count) => timer(Math.min(60000, 2 ^ count * 1000))
 *    })
 * )
 * ```
 *
 * @see {@link repeatWhen}
 * @see {@link retry}
 *
 * @param count The number of times the source Observable items are repeated, a count of 0 will yield
 * an empty Observable.
 */
export function repeat<T>(countOrConfig?: number | RepeatConfig): MonoTypeOperatorFunction<T> {
  let count = Infinity;
  let delay: RepeatConfig['delay'];

  if (countOrConfig != null) {
    if (typeof countOrConfig === 'object') {
      ({ count = Infinity, delay } = countOrConfig);
    } else {
      count = countOrConfig;
    }
  }

  return count <= 0
    ? () => EMPTY
    : operate((source, subscriber) => {
        let soFar = 0;
        let sourceSub: Subscription | null;

        const resubscribe = () => {
          sourceSub?.unsubscribe();
          sourceSub = null;
          if (delay != null) {
            const notifier = typeof delay === 'number' ? timer(delay) : innerFrom(delay(soFar));
            const notifierSubscriber = createOperatorSubscriber(subscriber, () => {
              notifierSubscriber.unsubscribe();
              subscribeToSource();
            });
            notifier.subscribe(notifierSubscriber);
          } else {
            subscribeToSource();
          }
        };

        const subscribeToSource = () => {
          let syncUnsub = false;
          sourceSub = source.subscribe(
            createOperatorSubscriber(subscriber, undefined, () => {
              if (++soFar < count) {
                if (sourceSub) {
                  resubscribe();
                } else {
                  syncUnsub = true;
                }
              } else {
                subscriber.complete();
              }
            })
          );

          if (syncUnsub) {
            resubscribe();
          }
        };

        subscribeToSource();
      });
}
import { Observable } from '../Observable';
import { Subject } from '../Subject';
import { Subscription } from '../Subscription';

import { MonoTypeOperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Returns an Observable that mirrors the source Observable with the exception of a `complete`. If the source
 * Observable calls `complete`, this method will emit to the Observable returned from `notifier`. If that Observable
 * calls `complete` or `error`, then this method will call `complete` or `error` on the child subscription. Otherwise
 * this method will resubscribe to the source Observable.
 *
 * ![](repeatWhen.png)
 *
 * ## Example
 *
 * Repeat a message stream on click
 *
 * ```ts
 * import { of, fromEvent, repeatWhen } from 'rxjs';
 *
 * const source = of('Repeat message');
 * const documentClick$ = fromEvent(document, 'click');
 *
 * const result = source.pipe(repeatWhen(() => documentClick$));
 *
 * result.subscribe(data => console.log(data))
 * ```
 *
 * @see {@link repeat}
 * @see {@link retry}
 * @see {@link retryWhen}
 *
 * @param {function(notifications: Observable): Observable} notifier - Receives an Observable of notifications with
 * which a user can `complete` or `error`, aborting the repetition.
 * @return A function that returns an Observable that that mirrors the source
 * Observable with the exception of a `complete`.
 * @deprecated Will be removed in v9 or v10. Use {@link repeat}'s `delay` option instead.
 */
export function repeatWhen<T>(notifier: (notifications: Observable<void>) => Observable<any>): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    let innerSub: Subscription | null;
    let syncResub = false;
    let completions$: Subject<void>;
    let isNotifierComplete = false;
    let isMainComplete = false;

    /**
     * Checks to see if we can complete the result, completes it, and returns `true` if it was completed.
     */
    const checkComplete = () => isMainComplete && isNotifierComplete && (subscriber.complete(), true);
    /**
     * Gets the subject to send errors through. If it doesn't exist,
     * we know we need to setup the notifier.
     */
    const getCompletionSubject = () => {
      if (!completions$) {
        completions$ = new Subject();

        // If the call to `notifier` throws, it will be caught by the OperatorSubscriber
        // In the main subscription -- in `subscribeForRepeatWhen`.
        notifier(completions$).subscribe(
          createOperatorSubscriber(
            subscriber,
            () => {
              if (innerSub) {
                subscribeForRepeatWhen();
              } else {
                // If we don't have an innerSub yet, that's because the inner subscription
                // call hasn't even returned yet. We've arrived here synchronously.
                // So we flag that we want to resub, such that we can ensure finalization
                // happens before we resubscribe.
                syncResub = true;
              }
            },
            () => {
              isNotifierComplete = true;
              checkComplete();
            }
          )
        );
      }
      return completions$;
    };

    const subscribeForRepeatWhen = () => {
      isMainComplete = false;

      innerSub = source.subscribe(
        createOperatorSubscriber(subscriber, undefined, () => {
          isMainComplete = true;
          // Check to see if we are complete, and complete if so.
          // If we are not complete. Get the subject. This calls the `notifier` function.
          // If that function fails, it will throw and `.next()` will not be reached on this
          // line. The thrown error is caught by the _complete handler in this
          // `OperatorSubscriber` and handled appropriately.
          !checkComplete() && getCompletionSubject().next();
        })
      );

      if (syncResub) {
        // Ensure that the inner subscription is torn down before
        // moving on to the next subscription in the synchronous case.
        // If we don't do this here, all inner subscriptions will not be
        // torn down until the entire observable is done.
        innerSub.unsubscribe();
        // It is important to null this out. Not only to free up memory, but
        // to make sure code above knows we are in a subscribing state to
        // handle synchronous resubscription.
        innerSub = null;
        // We may need to do this multiple times, so reset the flags.
        syncResub = false;
        // Resubscribe
        subscribeForRepeatWhen();
      }
    };

    // Start the subscription
    subscribeForRepeatWhen();
  });
}
import { MonoTypeOperatorFunction, ObservableInput } from '../types';
import { operate } from '../util/lift';
import { Subscription } from '../Subscription';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { identity } from '../util/identity';
import { timer } from '../observable/timer';
import { innerFrom } from '../observable/innerFrom';

/**
 * The {@link retry} operator configuration object. `retry` either accepts a `number`
 * or an object described by this interface.
 */
export interface RetryConfig {
  /**
   * The maximum number of times to retry. If `count` is omitted, `retry` will try to
   * resubscribe on errors infinite number of times.
   */
  count?: number;
  /**
   * The number of milliseconds to delay before retrying, OR a function to
   * return a notifier for delaying. If a function is given, that function should
   * return a notifier that, when it emits will retry the source. If the notifier
   * completes _without_ emitting, the resulting observable will complete without error,
   * if the notifier errors, the error will be pushed to the result.
   */
  delay?: number | ((error: any, retryCount: number) => ObservableInput<any>);
  /**
   * Whether or not to reset the retry counter when the retried subscription
   * emits its first value.
   */
  resetOnSuccess?: boolean;
}

export function retry<T>(count?: number): MonoTypeOperatorFunction<T>;
export function retry<T>(config: RetryConfig): MonoTypeOperatorFunction<T>;

/**
 * Returns an Observable that mirrors the source Observable with the exception of an `error`.
 *
 * If the source Observable calls `error`, this method will resubscribe to the source Observable for a maximum of
 * `count` resubscriptions rather than propagating the `error` call.
 *
 * ![](retry.png)
 *
 * The number of retries is determined by the `count` parameter. It can be set either by passing a number to
 * `retry` function or by setting `count` property when `retry` is configured using {@link RetryConfig}. If
 * `count` is omitted, `retry` will try to resubscribe on errors infinite number of times.
 *
 * Any and all items emitted by the source Observable will be emitted by the resulting Observable, even those
 * emitted during failed subscriptions. For example, if an Observable fails at first but emits `[1, 2]` then
 * succeeds the second time and emits: `[1, 2, 3, 4, 5, complete]` then the complete stream of emissions and
 * notifications would be: `[1, 2, 1, 2, 3, 4, 5, complete]`.
 *
 * ## Example
 *
 * ```ts
 * import { interval, mergeMap, throwError, of, retry } from 'rxjs';
 *
 * const source = interval(1000);
 * const result = source.pipe(
 *   mergeMap(val => val > 5 ? throwError(() => 'Error!') : of(val)),
 *   retry(2) // retry 2 times on error
 * );
 *
 * result.subscribe({
 *   next: value => console.log(value),
 *   error: err => console.log(`${ err }: Retried 2 times then quit!`)
 * });
 *
 * // Output:
 * // 0..1..2..3..4..5..
 * // 0..1..2..3..4..5..
 * // 0..1..2..3..4..5..
 * // 'Error!: Retried 2 times then quit!'
 * ```
 *
 * @see {@link retryWhen}
 *
 * @param configOrCount - Either number of retry attempts before failing or a {@link RetryConfig} object.
 * @return A function that returns an Observable that will resubscribe to the
 * source stream when the source stream errors, at most `count` times.
 */
export function retry<T>(configOrCount: number | RetryConfig = Infinity): MonoTypeOperatorFunction<T> {
  let config: RetryConfig;
  if (configOrCount && typeof configOrCount === 'object') {
    config = configOrCount;
  } else {
    config = {
      count: configOrCount as number,
    };
  }
  const { count = Infinity, delay, resetOnSuccess: resetOnSuccess = false } = config;

  return count <= 0
    ? identity
    : operate((source, subscriber) => {
        let soFar = 0;
        let innerSub: Subscription | null;
        const subscribeForRetry = () => {
          let syncUnsub = false;
          innerSub = source.subscribe(
            createOperatorSubscriber(
              subscriber,
              (value) => {
                // If we're resetting on success
                if (resetOnSuccess) {
                  soFar = 0;
                }
                subscriber.next(value);
              },
              // Completions are passed through to consumer.
              undefined,
              (err) => {
                if (soFar++ < count) {
                  // We are still under our retry count
                  const resub = () => {
                    if (innerSub) {
                      innerSub.unsubscribe();
                      innerSub = null;
                      subscribeForRetry();
                    } else {
                      syncUnsub = true;
                    }
                  };

                  if (delay != null) {
                    // The user specified a retry delay.
                    // They gave us a number, use a timer, otherwise, it's a function,
                    // and we're going to call it to get a notifier.
                    const notifier = typeof delay === 'number' ? timer(delay) : innerFrom(delay(err, soFar));
                    const notifierSubscriber = createOperatorSubscriber(
                      subscriber,
                      () => {
                        // After we get the first notification, we
                        // unsubscribe from the notifer, because we don't want anymore
                        // and we resubscribe to the source.
                        notifierSubscriber.unsubscribe();
                        resub();
                      },
                      () => {
                        // The notifier completed without emitting.
                        // The author is telling us they want to complete.
                        subscriber.complete();
                      }
                    );
                    notifier.subscribe(notifierSubscriber);
                  } else {
                    // There was no notifier given. Just resub immediately.
                    resub();
                  }
                } else {
                  // We're past our maximum number of retries.
                  // Just send along the error.
                  subscriber.error(err);
                }
              }
            )
          );
          if (syncUnsub) {
            innerSub.unsubscribe();
            innerSub = null;
            subscribeForRetry();
          }
        };
        subscribeForRetry();
      });
}
import { Observable } from '../Observable';
import { Subject } from '../Subject';
import { Subscription } from '../Subscription';

import { MonoTypeOperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Returns an Observable that mirrors the source Observable with the exception of an `error`. If the source Observable
 * calls `error`, this method will emit the Throwable that caused the error to the Observable returned from `notifier`.
 * If that Observable calls `complete` or `error` then this method will call `complete` or `error` on the child
 * subscription. Otherwise this method will resubscribe to the source Observable.
 *
 * ![](retryWhen.png)
 *
 * Retry an observable sequence on error based on custom criteria.
 *
 * ## Example
 *
 * ```ts
 * import { interval, map, retryWhen, tap, delayWhen, timer } from 'rxjs';
 *
 * const source = interval(1000);
 * const result = source.pipe(
 *   map(value => {
 *     if (value > 5) {
 *       // error will be picked up by retryWhen
 *       throw value;
 *     }
 *     return value;
 *   }),
 *   retryWhen(errors =>
 *     errors.pipe(
 *       // log error message
 *       tap(value => console.log(`Value ${ value } was too high!`)),
 *       // restart in 5 seconds
 *       delayWhen(value => timer(value * 1000))
 *     )
 *   )
 * );
 *
 * result.subscribe(value => console.log(value));
 *
 * // results:
 * // 0
 * // 1
 * // 2
 * // 3
 * // 4
 * // 5
 * // 'Value 6 was too high!'
 * // - Wait 5 seconds then repeat
 * ```
 *
 * @see {@link retry}
 *
 * @param {function(errors: Observable): Observable} notifier - Receives an Observable of notifications with which a
 * user can `complete` or `error`, aborting the retry.
 * @return A function that returns an Observable that mirrors the source
 * Observable with the exception of an `error`.
 * @deprecated Will be removed in v9 or v10, use {@link retry}'s `delay` option instead.
 */
export function retryWhen<T>(notifier: (errors: Observable<any>) => Observable<any>): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    let innerSub: Subscription | null;
    let syncResub = false;
    let errors$: Subject<any>;

    const subscribeForRetryWhen = () => {
      innerSub = source.subscribe(
        createOperatorSubscriber(subscriber, undefined, undefined, (err) => {
          if (!errors$) {
            errors$ = new Subject();
            notifier(errors$).subscribe(
              createOperatorSubscriber(subscriber, () =>
                // If we have an innerSub, this was an asynchronous call, kick off the retry.
                // Otherwise, if we don't have an innerSub yet, that's because the inner subscription
                // call hasn't even returned yet. We've arrived here synchronously.
                // So we flag that we want to resub, such that we can ensure finalization
                // happens before we resubscribe.
                innerSub ? subscribeForRetryWhen() : (syncResub = true)
              )
            );
          }
          if (errors$) {
            // We have set up the notifier without error.
            errors$.next(err);
          }
        })
      );

      if (syncResub) {
        // Ensure that the inner subscription is torn down before
        // moving on to the next subscription in the synchronous case.
        // If we don't do this here, all inner subscriptions will not be
        // torn down until the entire observable is done.
        innerSub.unsubscribe();
        innerSub = null;
        // We may need to do this multiple times, so reset the flag.
        syncResub = false;
        // Resubscribe
        subscribeForRetryWhen();
      }
    };

    // Start the subscription
    subscribeForRetryWhen();
  });
}
import { Observable } from '../Observable';
import { MonoTypeOperatorFunction } from '../types';
import { operate } from '../util/lift';
import { noop } from '../util/noop';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Emits the most recently emitted value from the source Observable whenever
 * another Observable, the `notifier`, emits.
 *
 * <span class="informal">It's like {@link sampleTime}, but samples whenever
 * the `notifier` Observable emits something.</span>
 *
 * ![](sample.png)
 *
 * Whenever the `notifier` Observable emits a value, `sample`
 * looks at the source Observable and emits whichever value it has most recently
 * emitted since the previous sampling, unless the source has not emitted
 * anything since the previous sampling. The `notifier` is subscribed to as soon
 * as the output Observable is subscribed.
 *
 * ## Example
 *
 * On every click, sample the most recent `seconds` timer
 *
 * ```ts
 * import { fromEvent, interval, sample } from 'rxjs';
 *
 * const seconds = interval(1000);
 * const clicks = fromEvent(document, 'click');
 * const result = seconds.pipe(sample(clicks));
 *
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link audit}
 * @see {@link debounce}
 * @see {@link sampleTime}
 * @see {@link throttle}
 *
 * @param notifier The Observable to use for sampling the
 * source Observable.
 * @return A function that returns an Observable that emits the results of
 * sampling the values emitted by the source Observable whenever the notifier
 * Observable emits value or completes.
 */
export function sample<T>(notifier: Observable<any>): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    let hasValue = false;
    let lastValue: T | null = null;
    source.subscribe(
      createOperatorSubscriber(subscriber, (value) => {
        hasValue = true;
        lastValue = value;
      })
    );
    notifier.subscribe(
      createOperatorSubscriber(
        subscriber,
        () => {
          if (hasValue) {
            hasValue = false;
            const value = lastValue!;
            lastValue = null;
            subscriber.next(value);
          }
        },
        noop
      )
    );
  });
}
import { asyncScheduler } from '../scheduler/async';
import { MonoTypeOperatorFunction, SchedulerLike } from '../types';
import { sample } from './sample';
import { interval } from '../observable/interval';

/**
 * Emits the most recently emitted value from the source Observable within
 * periodic time intervals.
 *
 * <span class="informal">Samples the source Observable at periodic time
 * intervals, emitting what it samples.</span>
 *
 * ![](sampleTime.png)
 *
 * `sampleTime` periodically looks at the source Observable and emits whichever
 * value it has most recently emitted since the previous sampling, unless the
 * source has not emitted anything since the previous sampling. The sampling
 * happens periodically in time every `period` milliseconds (or the time unit
 * defined by the optional `scheduler` argument). The sampling starts as soon as
 * the output Observable is subscribed.
 *
 * ## Example
 *
 * Every second, emit the most recent click at most once
 *
 * ```ts
 * import { fromEvent, sampleTime } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(sampleTime(1000));
 *
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link auditTime}
 * @see {@link debounceTime}
 * @see {@link delay}
 * @see {@link sample}
 * @see {@link throttleTime}
 *
 * @param {number} period The sampling period expressed in milliseconds or the
 * time unit determined internally by the optional `scheduler`.
 * @param {SchedulerLike} [scheduler=async] The {@link SchedulerLike} to use for
 * managing the timers that handle the sampling.
 * @return A function that returns an Observable that emits the results of
 * sampling the values emitted by the source Observable at the specified time
 * interval.
 */
export function sampleTime<T>(period: number, scheduler: SchedulerLike = asyncScheduler): MonoTypeOperatorFunction<T> {
  return sample(interval(period, scheduler));
}
import { OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { scanInternals } from './scanInternals';

export function scan<V, A = V>(accumulator: (acc: A | V, value: V, index: number) => A): OperatorFunction<V, V | A>;
export function scan<V, A>(accumulator: (acc: A, value: V, index: number) => A, seed: A): OperatorFunction<V, A>;
export function scan<V, A, S>(accumulator: (acc: A | S, value: V, index: number) => A, seed: S): OperatorFunction<V, A>;

// TODO: link to a "redux pattern" section in the guide (location TBD)

/**
 * Useful for encapsulating and managing state. Applies an accumulator (or "reducer function")
 * to each value from the source after an initial state is established -- either via
 * a `seed` value (second argument), or from the first value from the source.
 *
 * <span class="informal">It's like {@link reduce}, but emits the current
 * accumulation state after each update</span>
 *
 * ![](scan.png)
 *
 * This operator maintains an internal state and emits it after processing each value as follows:
 *
 * 1. First value arrives
 *   - If a `seed` value was supplied (as the second argument to `scan`), let `state = seed` and `value = firstValue`.
 *   - If NO `seed` value was supplied (no second argument), let `state = firstValue` and go to 3.
 * 2. Let `state = accumulator(state, value)`.
 *   - If an error is thrown by `accumulator`, notify the consumer of an error. The process ends.
 * 3. Emit `state`.
 * 4. Next value arrives, let `value = nextValue`, go to 2.
 *
 * ## Examples
 *
 * An average of previous numbers. This example shows how
 * not providing a `seed` can prime the stream with the
 * first value from the source.
 *
 * ```ts
 * import { of, scan, map } from 'rxjs';
 *
 * const numbers$ = of(1, 2, 3);
 *
 * numbers$
 *   .pipe(
 *     // Get the sum of the numbers coming in.
 *     scan((total, n) => total + n),
 *     // Get the average by dividing the sum by the total number
 *     // received so var (which is 1 more than the zero-based index).
 *     map((sum, index) => sum / (index + 1))
 *   )
 *   .subscribe(console.log);
 * ```
 *
 * The Fibonacci sequence. This example shows how you can use
 * a seed to prime accumulation process. Also... you know... Fibonacci.
 * So important to like, computers and stuff that its whiteboarded
 * in job interviews. Now you can show them the Rx version! (Please don't, haha)
 *
 * ```ts
 * import { interval, scan, map, startWith } from 'rxjs';
 *
 * const firstTwoFibs = [0, 1];
 * // An endless stream of Fibonacci numbers.
 * const fibonacci$ = interval(1000).pipe(
 *   // Scan to get the fibonacci numbers (after 0, 1)
 *   scan(([a, b]) => [b, a + b], firstTwoFibs),
 *   // Get the second number in the tuple, it's the one you calculated
 *   map(([, n]) => n),
 *   // Start with our first two digits :)
 *   startWith(...firstTwoFibs)
 * );
 *
 * fibonacci$.subscribe(console.log);
 * ```
 *
 * @see {@link expand}
 * @see {@link mergeScan}
 * @see {@link reduce}
 * @see {@link switchScan}
 *
 * @param accumulator A "reducer function". This will be called for each value after an initial state is
 * acquired.
 * @param seed The initial state. If this is not provided, the first value from the source will
 * be used as the initial state, and emitted without going through the accumulator. All subsequent values
 * will be processed by the accumulator function. If this is provided, all values will go through
 * the accumulator function.
 * @return A function that returns an Observable of the accumulated values.
 */
export function scan<V, A, S>(accumulator: (acc: V | A | S, value: V, index: number) => A, seed?: S): OperatorFunction<V, V | A> {
  // providing a seed of `undefined` *should* be valid and trigger
  // hasSeed! so don't use `seed !== undefined` checks!
  // For this reason, we have to check it here at the original call site
  // otherwise inside Operator/Subscriber we won't know if `undefined`
  // means they didn't provide anything or if they literally provided `undefined`
  return operate(scanInternals(accumulator, seed as S, arguments.length >= 2, true));
}
import { Observable } from '../Observable';
import { Subscriber } from '../Subscriber';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * A basic scan operation. This is used for `scan` and `reduce`.
 * @param accumulator The accumulator to use
 * @param seed The seed value for the state to accumulate
 * @param hasSeed Whether or not a seed was provided
 * @param emitOnNext Whether or not to emit the state on next
 * @param emitBeforeComplete Whether or not to emit the before completion
 */

export function scanInternals<V, A, S>(
  accumulator: (acc: V | A | S, value: V, index: number) => A,
  seed: S,
  hasSeed: boolean,
  emitOnNext: boolean,
  emitBeforeComplete?: undefined | true
) {
  return (source: Observable<V>, subscriber: Subscriber<any>) => {
    // Whether or not we have state yet. This will only be
    // false before the first value arrives if we didn't get
    // a seed value.
    let hasState = hasSeed;
    // The state that we're tracking, starting with the seed,
    // if there is one, and then updated by the return value
    // from the accumulator on each emission.
    let state: any = seed;
    // An index to pass to the accumulator function.
    let index = 0;

    // Subscribe to our source. All errors and completions are passed through.
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => {
          // Always increment the index.
          const i = index++;
          // Set the state
          state = hasState
            ? // We already have state, so we can get the new state from the accumulator
              accumulator(state, value, i)
            : // We didn't have state yet, a seed value was not provided, so

              // we set the state to the first value, and mark that we have state now
              ((hasState = true), value);

          // Maybe send it to the consumer.
          emitOnNext && subscriber.next(state);
        },
        // If an onComplete was given, call it, otherwise
        // just pass through the complete notification to the consumer.
        emitBeforeComplete &&
          (() => {
            hasState && subscriber.next(state);
            subscriber.complete();
          })
      )
    );
  };
}
import { Observable } from '../Observable';

import { OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Compares all values of two observables in sequence using an optional comparator function
 * and returns an observable of a single boolean value representing whether or not the two sequences
 * are equal.
 *
 * <span class="informal">Checks to see of all values emitted by both observables are equal, in order.</span>
 *
 * ![](sequenceEqual.png)
 *
 * `sequenceEqual` subscribes to two observables and buffers incoming values from each observable. Whenever either
 * observable emits a value, the value is buffered and the buffers are shifted and compared from the bottom
 * up; If any value pair doesn't match, the returned observable will emit `false` and complete. If one of the
 * observables completes, the operator will wait for the other observable to complete; If the other
 * observable emits before completing, the returned observable will emit `false` and complete. If one observable never
 * completes or emits after the other completes, the returned observable will never complete.
 *
 * ## Example
 *
 * Figure out if the Konami code matches
 *
 * ```ts
 * import { from, fromEvent, map, bufferCount, mergeMap, sequenceEqual } from 'rxjs';
 *
 * const codes = from([
 *   'ArrowUp',
 *   'ArrowUp',
 *   'ArrowDown',
 *   'ArrowDown',
 *   'ArrowLeft',
 *   'ArrowRight',
 *   'ArrowLeft',
 *   'ArrowRight',
 *   'KeyB',
 *   'KeyA',
 *   'Enter', // no start key, clearly.
 * ]);
 *
 * const keys = fromEvent<KeyboardEvent>(document, 'keyup').pipe(map(e => e.code));
 * const matches = keys.pipe(
 *   bufferCount(11, 1),
 *   mergeMap(last11 => from(last11).pipe(sequenceEqual(codes)))
 * );
 * matches.subscribe(matched => console.log('Successful cheat at Contra? ', matched));
 * ```
 *
 * @see {@link combineLatest}
 * @see {@link zip}
 * @see {@link withLatestFrom}
 *
 * @param {Observable} compareTo The observable sequence to compare the source sequence to.
 * @param {function} [comparator] An optional function to compare each value pair
 * @return A function that returns an Observable that emits a single boolean
 * value representing whether or not the values emitted by the source
 * Observable and provided Observable were equal in sequence.
 */
export function sequenceEqual<T>(
  compareTo: Observable<T>,
  comparator: (a: T, b: T) => boolean = (a, b) => a === b
): OperatorFunction<T, boolean> {
  return operate((source, subscriber) => {
    // The state for the source observable
    const aState = createState<T>();
    // The state for the compareTo observable;
    const bState = createState<T>();

    /** A utility to emit and complete */
    const emit = (isEqual: boolean) => {
      subscriber.next(isEqual);
      subscriber.complete();
    };

    /**
     * Creates a subscriber that subscribes to one of the sources, and compares its collected
     * state -- `selfState` -- to the other source's collected state -- `otherState`. This
     * is used for both streams.
     */
    const createSubscriber = (selfState: SequenceState<T>, otherState: SequenceState<T>) => {
      const sequenceEqualSubscriber = createOperatorSubscriber(
        subscriber,
        (a: T) => {
          const { buffer, complete } = otherState;
          if (buffer.length === 0) {
            // If there's no values in the other buffer
            // and the other stream is complete, we know
            // this isn't a match, because we got one more value.
            // Otherwise, we push onto our buffer, so when the other
            // stream emits, it can pull this value off our buffer and check it
            // at the appropriate time.
            complete ? emit(false) : selfState.buffer.push(a);
          } else {
            // If the other stream *does* have values in it's buffer,
            // pull the oldest one off so we can compare it to what we
            // just got. If it wasn't a match, emit `false` and complete.
            !comparator(a, buffer.shift()!) && emit(false);
          }
        },
        () => {
          // Or observable completed
          selfState.complete = true;
          const { complete, buffer } = otherState;
          // If the other observable is also complete, and there's
          // still stuff left in their buffer, it doesn't match, if their
          // buffer is empty, then it does match. This is because we can't
          // possibly get more values here anymore.
          complete && emit(buffer.length === 0);
          // Be sure to clean up our stream as soon as possible if we can.
          sequenceEqualSubscriber?.unsubscribe();
        }
      );

      return sequenceEqualSubscriber;
    };

    // Subscribe to each source.
    source.subscribe(createSubscriber(aState, bState));
    compareTo.subscribe(createSubscriber(bState, aState));
  });
}

/**
 * A simple structure for the data used to test each sequence
 */
interface SequenceState<T> {
  /** A temporary store for arrived values before they are checked */
  buffer: T[];
  /** Whether or not the sequence source has completed. */
  complete: boolean;
}

/**
 * Creates a simple structure that is used to represent
 * data used to test each sequence.
 */
function createState<T>(): SequenceState<T> {
  return {
    buffer: [],
    complete: false,
  };
}
import { Observable } from '../Observable';
import { innerFrom } from '../observable/innerFrom';
import { Subject } from '../Subject';
import { SafeSubscriber } from '../Subscriber';
import { Subscription } from '../Subscription';
import { MonoTypeOperatorFunction, SubjectLike } from '../types';
import { operate } from '../util/lift';

export interface ShareConfig<T> {
  /**
   * The factory used to create the subject that will connect the source observable to
   * multicast consumers.
   */
  connector?: () => SubjectLike<T>;
  /**
   * If true, the resulting observable will reset internal state on error from source and return to a "cold" state. This
   * allows the resulting observable to be "retried" in the event of an error.
   * If false, when an error comes from the source it will push the error into the connecting subject, and the subject
   * will remain the connecting subject, meaning the resulting observable will not go "cold" again, and subsequent retries
   * or resubscriptions will resubscribe to that same subject. In all cases, RxJS subjects will emit the same error again, however
   * {@link ReplaySubject} will also push its buffered values before pushing the error.
   * It is also possible to pass a notifier factory returning an observable instead which grants more fine-grained
   * control over how and when the reset should happen. This allows behaviors like conditional or delayed resets.
   */
  resetOnError?: boolean | ((error: any) => Observable<any>);
  /**
   * If true, the resulting observable will reset internal state on completion from source and return to a "cold" state. This
   * allows the resulting observable to be "repeated" after it is done.
   * If false, when the source completes, it will push the completion through the connecting subject, and the subject
   * will remain the connecting subject, meaning the resulting observable will not go "cold" again, and subsequent repeats
   * or resubscriptions will resubscribe to that same subject.
   * It is also possible to pass a notifier factory returning an observable instead which grants more fine-grained
   * control over how and when the reset should happen. This allows behaviors like conditional or delayed resets.
   */
  resetOnComplete?: boolean | (() => Observable<any>);
  /**
   * If true, when the number of subscribers to the resulting observable reaches zero due to those subscribers unsubscribing, the
   * internal state will be reset and the resulting observable will return to a "cold" state. This means that the next
   * time the resulting observable is subscribed to, a new subject will be created and the source will be subscribed to
   * again.
   * If false, when the number of subscribers to the resulting observable reaches zero due to unsubscription, the subject
   * will remain connected to the source, and new subscriptions to the result will be connected through that same subject.
   * It is also possible to pass a notifier factory returning an observable instead which grants more fine-grained
   * control over how and when the reset should happen. This allows behaviors like conditional or delayed resets.
   */
  resetOnRefCountZero?: boolean | (() => Observable<any>);
}

export function share<T>(): MonoTypeOperatorFunction<T>;

export function share<T>(options: ShareConfig<T>): MonoTypeOperatorFunction<T>;

/**
 * Returns a new Observable that multicasts (shares) the original Observable. As long as there is at least one
 * Subscriber this Observable will be subscribed and emitting data. When all subscribers have unsubscribed it will
 * unsubscribe from the source Observable. Because the Observable is multicasting it makes the stream `hot`.
 * This is an alias for `multicast(() => new Subject()), refCount()`.
 *
 * The subscription to the underlying source Observable can be reset (unsubscribe and resubscribe for new subscribers),
 * if the subscriber count to the shared observable drops to 0, or if the source Observable errors or completes. It is
 * possible to use notifier factories for the resets to allow for behaviors like conditional or delayed resets. Please
 * note that resetting on error or complete of the source Observable does not behave like a transparent retry or restart
 * of the source because the error or complete will be forwarded to all subscribers and their subscription will be
 * closed. Only new subscribers after a reset on error or complete happened will cause a fresh subscription to the
 * source. To achieve transparent retries or restarts pipe the source through appropriate operators before sharing.
 *
 * ![](share.png)
 *
 * ## Example
 *
 * Generate new multicast Observable from the `source` Observable value
 *
 * ```ts
 * import { interval, tap, map, take, share } from 'rxjs';
 *
 * const source = interval(1000).pipe(
 *   tap(x => console.log('Processing: ', x)),
 *   map(x => x * x),
 *   take(6),
 *   share()
 * );
 *
 * source.subscribe(x => console.log('subscription 1: ', x));
 * source.subscribe(x => console.log('subscription 2: ', x));
 *
 * // Logs:
 * // Processing: 0
 * // subscription 1: 0
 * // subscription 2: 0
 * // Processing: 1
 * // subscription 1: 1
 * // subscription 2: 1
 * // Processing: 2
 * // subscription 1: 4
 * // subscription 2: 4
 * // Processing: 3
 * // subscription 1: 9
 * // subscription 2: 9
 * // Processing: 4
 * // subscription 1: 16
 * // subscription 2: 16
 * // Processing: 5
 * // subscription 1: 25
 * // subscription 2: 25
 * ```
 *
 * ## Example with notifier factory: Delayed reset
 *
 * ```ts
 * import { interval, take, share, timer } from 'rxjs';
 *
 * const source = interval(1000).pipe(
 *   take(3),
 *   share({
 *     resetOnRefCountZero: () => timer(1000)
 *   })
 * );
 *
 * const subscriptionOne = source.subscribe(x => console.log('subscription 1: ', x));
 * setTimeout(() => subscriptionOne.unsubscribe(), 1300);
 *
 * setTimeout(() => source.subscribe(x => console.log('subscription 2: ', x)), 1700);
 *
 * setTimeout(() => source.subscribe(x => console.log('subscription 3: ', x)), 5000);
 *
 * // Logs:
 * // subscription 1:  0
 * // (subscription 1 unsubscribes here)
 * // (subscription 2 subscribes here ~400ms later, source was not reset)
 * // subscription 2:  1
 * // subscription 2:  2
 * // (subscription 2 unsubscribes here)
 * // (subscription 3 subscribes here ~2000ms later, source did reset before)
 * // subscription 3:  0
 * // subscription 3:  1
 * // subscription 3:  2
 * ```
 *
 * @see {@link shareReplay}
 *
 * @return A function that returns an Observable that mirrors the source.
 */
export function share<T>(options: ShareConfig<T> = {}): MonoTypeOperatorFunction<T> {
  const { connector = () => new Subject<T>(), resetOnError = true, resetOnComplete = true, resetOnRefCountZero = true } = options;
  // It's necessary to use a wrapper here, as the _operator_ must be
  // referentially transparent. Otherwise, it cannot be used in calls to the
  // static `pipe` function - to create a partial pipeline.
  //
  // The _operator function_ - the function returned by the _operator_ - will
  // not be referentially transparent - as it shares its source - but the
  // _operator function_ is called when the complete pipeline is composed via a
  // call to a source observable's `pipe` method - not when the static `pipe`
  // function is called.
  return (wrapperSource) => {
    let connection: SafeSubscriber<T> | undefined;
    let resetConnection: Subscription | undefined;
    let subject: SubjectLike<T> | undefined;
    let refCount = 0;
    let hasCompleted = false;
    let hasErrored = false;

    const cancelReset = () => {
      resetConnection?.unsubscribe();
      resetConnection = undefined;
    };
    // Used to reset the internal state to a "cold"
    // state, as though it had never been subscribed to.
    const reset = () => {
      cancelReset();
      connection = subject = undefined;
      hasCompleted = hasErrored = false;
    };
    const resetAndUnsubscribe = () => {
      // We need to capture the connection before
      // we reset (if we need to reset).
      const conn = connection;
      reset();
      conn?.unsubscribe();
    };

    return operate<T, T>((source, subscriber) => {
      refCount++;
      if (!hasErrored && !hasCompleted) {
        cancelReset();
      }

      // Create the subject if we don't have one yet. Grab a local reference to
      // it as well, which avoids non-null assertations when using it and, if we
      // connect to it now, then error/complete need a reference after it was
      // reset.
      const dest = (subject = subject ?? connector());

      // Add the finalization directly to the subscriber - instead of returning it -
      // so that the handling of the subscriber's unsubscription will be wired
      // up _before_ the subscription to the source occurs. This is done so that
      // the assignment to the source connection's `closed` property will be seen
      // by synchronous firehose sources.
      subscriber.add(() => {
        refCount--;

        // If we're resetting on refCount === 0, and it's 0, we only want to do
        // that on "unsubscribe", really. Resetting on error or completion is a different
        // configuration.
        if (refCount === 0 && !hasErrored && !hasCompleted) {
          resetConnection = handleReset(resetAndUnsubscribe, resetOnRefCountZero);
        }
      });

      // The following line adds the subscription to the subscriber passed.
      // Basically, `subscriber === dest.subscribe(subscriber)` is `true`.
      dest.subscribe(subscriber);

      if (
        !connection &&
        // Check this shareReplay is still activate - it can be reset to 0
        // and be "unsubscribed" _before_ it actually subscribes.
        // If we were to subscribe then, it'd leak and get stuck.
        refCount > 0
      ) {
        // We need to create a subscriber here - rather than pass an observer and
        // assign the returned subscription to connection - because it's possible
        // for reentrant subscriptions to the shared observable to occur and in
        // those situations we want connection to be already-assigned so that we
        // don't create another connection to the source.
        connection = new SafeSubscriber({
          next: (value) => dest.next(value),
          error: (err) => {
            hasErrored = true;
            cancelReset();
            resetConnection = handleReset(reset, resetOnError, err);
            dest.error(err);
          },
          complete: () => {
            hasCompleted = true;
            cancelReset();
            resetConnection = handleReset(reset, resetOnComplete);
            dest.complete();
          },
        });
        innerFrom(source).subscribe(connection);
      }
    })(wrapperSource);
  };
}

function handleReset<T extends unknown[] = never[]>(
  reset: () => void,
  on: boolean | ((...args: T) => Observable<any>),
  ...args: T
): Subscription | undefined {
  if (on === true) {
    reset();
    return;
  }

  if (on === false) {
    return;
  }

  const onSubscriber = new SafeSubscriber({
    next: () => {
      onSubscriber.unsubscribe();
      reset();
    },
  });

  return on(...args).subscribe(onSubscriber);
}
import { ReplaySubject } from '../ReplaySubject';
import { MonoTypeOperatorFunction, SchedulerLike } from '../types';
import { share } from './share';

export interface ShareReplayConfig {
  bufferSize?: number;
  windowTime?: number;
  refCount: boolean;
  scheduler?: SchedulerLike;
}

export function shareReplay<T>(config: ShareReplayConfig): MonoTypeOperatorFunction<T>;
export function shareReplay<T>(bufferSize?: number, windowTime?: number, scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;

/**
 * Share source and replay specified number of emissions on subscription.
 *
 * This operator is a specialization of `replay` that connects to a source observable
 * and multicasts through a `ReplaySubject` constructed with the specified arguments.
 * A successfully completed source will stay cached in the `shareReplayed observable` forever,
 * but an errored source can be retried.
 *
 * ## Why use shareReplay?
 * You generally want to use `shareReplay` when you have side-effects or taxing computations
 * that you do not wish to be executed amongst multiple subscribers.
 * It may also be valuable in situations where you know you will have late subscribers to
 * a stream that need access to previously emitted values.
 * This ability to replay values on subscription is what differentiates {@link share} and `shareReplay`.
 *
 * ![](shareReplay.png)
 *
 * ## Reference counting
 * By default `shareReplay` will use `refCount` of false, meaning that it will _not_ unsubscribe the
 * source when the reference counter drops to zero, i.e. the inner `ReplaySubject` will _not_ be unsubscribed
 * (and potentially run for ever).
 * This is the default as it is expected that `shareReplay` is often used to keep around expensive to setup
 * observables which we want to keep running instead of having to do the expensive setup again.
 *
 * As of RXJS version 6.4.0 a new overload signature was added to allow for manual control over what
 * happens when the operators internal reference counter drops to zero.
 * If `refCount` is true, the source will be unsubscribed from once the reference count drops to zero, i.e.
 * the inner `ReplaySubject` will be unsubscribed. All new subscribers will receive value emissions from a
 * new `ReplaySubject` which in turn will cause a new subscription to the source observable.
 *
 * ## Examples
 *
 * Example with a third subscriber coming late to the party
 *
 * ```ts
 * import { interval, take, shareReplay } from 'rxjs';
 *
 * const shared$ = interval(2000).pipe(
 *   take(6),
 *   shareReplay(3)
 * );
 *
 * shared$.subscribe(x => console.log('sub A: ', x));
 * shared$.subscribe(y => console.log('sub B: ', y));
 *
 * setTimeout(() => {
 *   shared$.subscribe(y => console.log('sub C: ', y));
 * }, 11000);
 *
 * // Logs:
 * // (after ~2000 ms)
 * // sub A: 0
 * // sub B: 0
 * // (after ~4000 ms)
 * // sub A: 1
 * // sub B: 1
 * // (after ~6000 ms)
 * // sub A: 2
 * // sub B: 2
 * // (after ~8000 ms)
 * // sub A: 3
 * // sub B: 3
 * // (after ~10000 ms)
 * // sub A: 4
 * // sub B: 4
 * // (after ~11000 ms, sub C gets the last 3 values)
 * // sub C: 2
 * // sub C: 3
 * // sub C: 4
 * // (after ~12000 ms)
 * // sub A: 5
 * // sub B: 5
 * // sub C: 5
 * ```
 *
 * Example for `refCount` usage
 *
 * ```ts
 * import { Observable, tap, interval, shareReplay, take } from 'rxjs';
 *
 * const log = <T>(name: string, source: Observable<T>) => source.pipe(
 *   tap({
 *     subscribe: () => console.log(`${ name }: subscribed`),
 *     next: value => console.log(`${ name }: ${ value }`),
 *     complete: () => console.log(`${ name }: completed`),
 *     finalize: () => console.log(`${ name }: unsubscribed`)
 *   })
 * );
 *
 * const obs$ = log('source', interval(1000));
 *
 * const shared$ = log('shared', obs$.pipe(
 *   shareReplay({ bufferSize: 1, refCount: true }),
 *   take(2)
 * ));
 *
 * shared$.subscribe(x => console.log('sub A: ', x));
 * shared$.subscribe(y => console.log('sub B: ', y));
 *
 * // PRINTS:
 * // shared: subscribed <-- reference count = 1
 * // source: subscribed
 * // shared: subscribed <-- reference count = 2
 * // source: 0
 * // shared: 0
 * // sub A: 0
 * // shared: 0
 * // sub B: 0
 * // source: 1
 * // shared: 1
 * // sub A: 1
 * // shared: completed <-- take(2) completes the subscription for sub A
 * // shared: unsubscribed <-- reference count = 1
 * // shared: 1
 * // sub B: 1
 * // shared: completed <-- take(2) completes the subscription for sub B
 * // shared: unsubscribed <-- reference count = 0
 * // source: unsubscribed <-- replaySubject unsubscribes from source observable because the reference count dropped to 0 and refCount is true
 *
 * // In case of refCount being false, the unsubscribe is never called on the source and the source would keep on emitting, even if no subscribers
 * // are listening.
 * // source: 2
 * // source: 3
 * // source: 4
 * // ...
 * ```
 *
 * @see {@link publish}
 * @see {@link share}
 * @see {@link publishReplay}
 *
 * @param {Number} [bufferSize=Infinity] Maximum element count of the replay buffer.
 * @param {Number} [windowTime=Infinity] Maximum time length of the replay buffer in milliseconds.
 * @param {Scheduler} [scheduler] Scheduler where connected observers within the selector function
 * will be invoked on.
 * @return A function that returns an Observable sequence that contains the
 * elements of a sequence produced by multicasting the source sequence within a
 * selector function.
 */
export function shareReplay<T>(
  configOrBufferSize?: ShareReplayConfig | number,
  windowTime?: number,
  scheduler?: SchedulerLike
): MonoTypeOperatorFunction<T> {
  let bufferSize: number;
  let refCount = false;
  if (configOrBufferSize && typeof configOrBufferSize === 'object') {
    ({ bufferSize = Infinity, windowTime = Infinity, refCount = false, scheduler } = configOrBufferSize);
  } else {
    bufferSize = (configOrBufferSize ?? Infinity) as number;
  }
  return share<T>({
    connector: () => new ReplaySubject(bufferSize, windowTime, scheduler),
    resetOnError: true,
    resetOnComplete: false,
    resetOnRefCountZero: refCount,
  });
}
import { Observable } from '../Observable';
import { EmptyError } from '../util/EmptyError';

import { MonoTypeOperatorFunction, OperatorFunction, TruthyTypesOf } from '../types';
import { SequenceError } from '../util/SequenceError';
import { NotFoundError } from '../util/NotFoundError';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

export function single<T>(predicate: BooleanConstructor): OperatorFunction<T, TruthyTypesOf<T>>;
export function single<T>(predicate?: (value: T, index: number, source: Observable<T>) => boolean): MonoTypeOperatorFunction<T>;

/**
 * Returns an observable that asserts that only one value is
 * emitted from the observable that matches the predicate. If no
 * predicate is provided, then it will assert that the observable
 * only emits one value.
 *
 * In the event that the observable is empty, it will throw an
 * {@link EmptyError}.
 *
 * In the event that two values are found that match the predicate,
 * or when there are two values emitted and no predicate, it will
 * throw a {@link SequenceError}
 *
 * In the event that no values match the predicate, if one is provided,
 * it will throw a {@link NotFoundError}
 *
 * ## Example
 *
 * Expect only `name` beginning with `'B'`
 *
 * ```ts
 * import { of, single } from 'rxjs';
 *
 * const source1 = of(
 *  { name: 'Ben' },
 *  { name: 'Tracy' },
 *  { name: 'Laney' },
 *  { name: 'Lily' }
 * );
 *
 * source1
 *   .pipe(single(x => x.name.startsWith('B')))
 *   .subscribe(x => console.log(x));
 * // Emits 'Ben'
 *
 *
 * const source2 = of(
 *  { name: 'Ben' },
 *  { name: 'Tracy' },
 *  { name: 'Bradley' },
 *  { name: 'Lincoln' }
 * );
 *
 * source2
 *   .pipe(single(x => x.name.startsWith('B')))
 *   .subscribe({ error: err => console.error(err) });
 * // Error emitted: SequenceError('Too many values match')
 *
 *
 * const source3 = of(
 *  { name: 'Laney' },
 *  { name: 'Tracy' },
 *  { name: 'Lily' },
 *  { name: 'Lincoln' }
 * );
 *
 * source3
 *   .pipe(single(x => x.name.startsWith('B')))
 *   .subscribe({ error: err => console.error(err) });
 * // Error emitted: NotFoundError('No values match')
 * ```
 *
 * @see {@link first}
 * @see {@link find}
 * @see {@link findIndex}
 * @see {@link elementAt}
 *
 * @throws {NotFoundError} Delivers an NotFoundError to the Observer's `error`
 * callback if the Observable completes before any `next` notification was sent.
 * @throws {SequenceError} Delivers a SequenceError if more than one value is emitted that matches the
 * provided predicate. If no predicate is provided, will deliver a SequenceError if more
 * than one value comes from the source
 * @param {Function} predicate - A predicate function to evaluate items emitted by the source Observable.
 * @return A function that returns an Observable that emits the single item
 * emitted by the source Observable that matches the predicate.
 */
export function single<T>(predicate?: (value: T, index: number, source: Observable<T>) => boolean): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    let hasValue = false;
    let singleValue: T;
    let seenValue = false;
    let index = 0;
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => {
          seenValue = true;
          if (!predicate || predicate(value, index++, source)) {
            hasValue && subscriber.error(new SequenceError('Too many matching values'));
            hasValue = true;
            singleValue = value;
          }
        },
        () => {
          if (hasValue) {
            subscriber.next(singleValue);
            subscriber.complete();
          } else {
            subscriber.error(seenValue ? new NotFoundError('No matching values') : new EmptyError());
          }
        }
      )
    );
  });
}
import { MonoTypeOperatorFunction } from '../types';
import { filter } from './filter';

/**
 * Returns an Observable that skips the first `count` items emitted by the source Observable.
 *
 * ![](skip.png)
 *
 * Skips the values until the sent notifications are equal or less than provided skip count. It raises
 * an error if skip count is equal or more than the actual number of emits and source raises an error.
 *
 * ## Example
 *
 * Skip the values before the emission
 *
 * ```ts
 * import { interval, skip } from 'rxjs';
 *
 * // emit every half second
 * const source = interval(500);
 * // skip the first 10 emitted values
 * const result = source.pipe(skip(10));
 *
 * result.subscribe(value => console.log(value));
 * // output: 10...11...12...13...
 * ```
 *
 * @see {@link last}
 * @see {@link skipWhile}
 * @see {@link skipUntil}
 * @see {@link skipLast}
 *
 * @param {Number} count - The number of times, items emitted by source Observable should be skipped.
 * @return A function that returns an Observable that skips the first `count`
 * values emitted by the source Observable.
 */
export function skip<T>(count: number): MonoTypeOperatorFunction<T> {
  return filter((_, index) => count <= index);
}
import { MonoTypeOperatorFunction } from '../types';
import { identity } from '../util/identity';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Skip a specified number of values before the completion of an observable.
 *
 * ![](skipLast.png)
 *
 * Returns an observable that will emit values as soon as it can, given a number of
 * skipped values. For example, if you `skipLast(3)` on a source, when the source
 * emits its fourth value, the first value the source emitted will finally be emitted
 * from the returned observable, as it is no longer part of what needs to be skipped.
 *
 * All values emitted by the result of `skipLast(N)` will be delayed by `N` emissions,
 * as each value is held in a buffer until enough values have been emitted that that
 * the buffered value may finally be sent to the consumer.
 *
 * After subscribing, unsubscribing will not result in the emission of the buffered
 * skipped values.
 *
 * ## Example
 *
 * Skip the last 2 values of an observable with many values
 *
 * ```ts
 * import { of, skipLast } from 'rxjs';
 *
 * const numbers = of(1, 2, 3, 4, 5);
 * const skipLastTwo = numbers.pipe(skipLast(2));
 * skipLastTwo.subscribe(x => console.log(x));
 *
 * // Results in:
 * // 1 2 3
 * // (4 and 5 are skipped)
 * ```
 *
 * @see {@link skip}
 * @see {@link skipUntil}
 * @see {@link skipWhile}
 * @see {@link take}
 *
 * @param skipCount Number of elements to skip from the end of the source Observable.
 * @return A function that returns an Observable that skips the last `count`
 * values emitted by the source Observable.
 */
export function skipLast<T>(skipCount: number): MonoTypeOperatorFunction<T> {
  return skipCount <= 0
    ? // For skipCounts less than or equal to zero, we are just mirroring the source.
      identity
    : operate((source, subscriber) => {
        // A ring buffer to hold the values while we wait to see
        // if we can emit it or it's part of the "skipped" last values.
        // Note that it is the _same size_ as the skip count.
        let ring: T[] = new Array(skipCount);
        // The number of values seen so far. This is used to get
        // the index of the current value when it arrives.
        let seen = 0;
        source.subscribe(
          createOperatorSubscriber(subscriber, (value) => {
            // Get the index of the value we have right now
            // relative to all other values we've seen, then
            // increment `seen`. This ensures we've moved to
            // the next slot in our ring buffer.
            const valueIndex = seen++;
            if (valueIndex < skipCount) {
              // If we haven't seen enough values to fill our buffer yet,
              // Then we aren't to a number of seen values where we can
              // emit anything, so let's just start by filling the ring buffer.
              ring[valueIndex] = value;
            } else {
              // We are traversing over the ring array in such
              // a way that when we get to the end, we loop back
              // and go to the start.
              const index = valueIndex % skipCount;
              // Pull the oldest value out so we can emit it,
              // and stuff the new value in it's place.
              const oldValue = ring[index];
              ring[index] = value;
              // Emit the old value. It is important that this happens
              // after we swap the value in the buffer, if it happens
              // before we swap the value in the buffer, then a synchronous
              // source can get the buffer out of whack.
              subscriber.next(oldValue);
            }
          })
        );

        return () => {
          // Release our values in memory
          ring = null!;
        };
      });
}
import { Observable } from '../Observable';
import { MonoTypeOperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';
import { noop } from '../util/noop';

/**
 * Returns an Observable that skips items emitted by the source Observable until a second Observable emits an item.
 *
 * The `skipUntil` operator causes the observable stream to skip the emission of values until the passed in observable emits the first value.
 * This can be particularly useful in combination with user interactions, responses of http requests or waiting for specific times to pass by.
 *
 * ![](skipUntil.png)
 *
 * Internally the `skipUntil` operator subscribes to the passed in observable (in the following called *notifier*) in order to recognize the emission
 * of its first value. When this happens, the operator unsubscribes from the *notifier* and starts emitting the values of the *source*
 * observable. It will never let the *source* observable emit any values if the *notifier* completes or throws an error without emitting
 * a value before.
 *
 * ## Example
 *
 * In the following example, all emitted values of the interval observable are skipped until the user clicks anywhere within the page
 *
 * ```ts
 * import { interval, fromEvent, skipUntil } from 'rxjs';
 *
 * const intervalObservable = interval(1000);
 * const click = fromEvent(document, 'click');
 *
 * const emitAfterClick = intervalObservable.pipe(
 *   skipUntil(click)
 * );
 * // clicked at 4.6s. output: 5...6...7...8........ or
 * // clicked at 7.3s. output: 8...9...10..11.......
 * emitAfterClick.subscribe(value => console.log(value));
 * ```
 *
 * @see {@link last}
 * @see {@link skip}
 * @see {@link skipWhile}
 * @see {@link skipLast}
 *
 * @param {Observable} notifier - The second Observable that has to emit an item before the source Observable's elements begin to
 * be mirrored by the resulting Observable.
 * @return A function that returns an Observable that skips items from the
 * source Observable until the second Observable emits an item, then emits the
 * remaining items.
 */
export function skipUntil<T>(notifier: Observable<any>): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    let taking = false;

    const skipSubscriber = createOperatorSubscriber(
      subscriber,
      () => {
        skipSubscriber?.unsubscribe();
        taking = true;
      },
      noop
    );

    innerFrom(notifier).subscribe(skipSubscriber);

    source.subscribe(createOperatorSubscriber(subscriber, (value) => taking && subscriber.next(value)));
  });
}
import { Falsy, MonoTypeOperatorFunction, OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

export function skipWhile<T>(predicate: BooleanConstructor): OperatorFunction<T, Extract<T, Falsy> extends never ? never : T>;
export function skipWhile<T>(predicate: (value: T, index: number) => true): OperatorFunction<T, never>;
export function skipWhile<T>(predicate: (value: T, index: number) => boolean): MonoTypeOperatorFunction<T>;

/**
 * Returns an Observable that skips all items emitted by the source Observable as long as a specified condition holds
 * true, but emits all further source items as soon as the condition becomes false.
 *
 * ![](skipWhile.png)
 *
 * Skips all the notifications with a truthy predicate. It will not skip the notifications when the predicate is falsy.
 * It can also be skipped using index. Once the predicate is true, it will not be called again.
 *
 * ## Example
 *
 * Skip some super heroes
 *
 * ```ts
 * import { from, skipWhile } from 'rxjs';
 *
 * const source = from(['Green Arrow', 'SuperMan', 'Flash', 'SuperGirl', 'Black Canary'])
 * // Skip the heroes until SuperGirl
 * const example = source.pipe(skipWhile(hero => hero !== 'SuperGirl'));
 * // output: SuperGirl, Black Canary
 * example.subscribe(femaleHero => console.log(femaleHero));
 * ```
 *
 * Skip values from the array until index 5
 *
 * ```ts
 * import { from, skipWhile } from 'rxjs';
 *
 * const source = from([1, 2, 3, 4, 5, 6, 7, 9, 10]);
 * const example = source.pipe(skipWhile((_, i) => i !== 5));
 * // output: 6, 7, 9, 10
 * example.subscribe(value => console.log(value));
 * ```
 *
 * @see {@link last}
 * @see {@link skip}
 * @see {@link skipUntil}
 * @see {@link skipLast}
 *
 * @param {Function} predicate - A function to test each item emitted from the source Observable.
 * @return A function that returns an Observable that begins emitting items
 * emitted by the source Observable when the specified predicate becomes false.
 */
export function skipWhile<T>(predicate: (value: T, index: number) => boolean): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    let taking = false;
    let index = 0;
    source.subscribe(
      createOperatorSubscriber(subscriber, (value) => (taking || (taking = !predicate(value, index++))) && subscriber.next(value))
    );
  });
}
import { concat } from '../observable/concat';
import { OperatorFunction, SchedulerLike, ValueFromArray } from '../types';
import { popScheduler } from '../util/args';
import { operate } from '../util/lift';

// Devs are more likely to pass null or undefined than they are a scheduler
// without accompanying values. To make things easier for (naughty) devs who
// use the `strictNullChecks: false` TypeScript compiler option, these
// overloads with explicit null and undefined values are included.

export function startWith<T>(value: null): OperatorFunction<T, T | null>;
export function startWith<T>(value: undefined): OperatorFunction<T, T | undefined>;

/** @deprecated The `scheduler` parameter will be removed in v8. Use `scheduled` and `concatAll`. Details: https://rxjs.dev/deprecations/scheduler-argument */
export function startWith<T, A extends readonly unknown[] = T[]>(
  ...valuesAndScheduler: [...A, SchedulerLike]
): OperatorFunction<T, T | ValueFromArray<A>>;
export function startWith<T, A extends readonly unknown[] = T[]>(...values: A): OperatorFunction<T, T | ValueFromArray<A>>;

/**
 * Returns an observable that, at the moment of subscription, will synchronously emit all
 * values provided to this operator, then subscribe to the source and mirror all of its emissions
 * to subscribers.
 *
 * This is a useful way to know when subscription has occurred on an existing observable.
 *
 * <span class="informal">First emits its arguments in order, and then any
 * emissions from the source.</span>
 *
 * ![](startWith.png)
 *
 * ## Examples
 *
 * Emit a value when a timer starts.
 *
 * ```ts
 * import { timer, map, startWith } from 'rxjs';
 *
 * timer(1000)
 *   .pipe(
 *     map(() => 'timer emit'),
 *     startWith('timer start')
 *   )
 *   .subscribe(x => console.log(x));
 *
 * // results:
 * // 'timer start'
 * // 'timer emit'
 * ```
 *
 * @param values Items you want the modified Observable to emit first.
 * @return A function that returns an Observable that synchronously emits
 * provided values before subscribing to the source Observable.
 *
 * @see {@link endWith}
 * @see {@link finalize}
 * @see {@link concat}
 */
export function startWith<T, D>(...values: D[]): OperatorFunction<T, T | D> {
  const scheduler = popScheduler(values);
  return operate((source, subscriber) => {
    // Here we can't pass `undefined` as a scheduler, because if we did, the
    // code inside of `concat` would be confused by the `undefined`, and treat it
    // like an invalid observable. So we have to split it two different ways.
    (scheduler ? concat(values, source, scheduler) : concat(values, source)).subscribe(subscriber);
  });
}
import { MonoTypeOperatorFunction, SchedulerLike } from '../types';
import { operate } from '../util/lift';

/**
 * Asynchronously subscribes Observers to this Observable on the specified {@link SchedulerLike}.
 *
 * With `subscribeOn` you can decide what type of scheduler a specific Observable will be using when it is subscribed to.
 *
 * Schedulers control the speed and order of emissions to observers from an Observable stream.
 *
 * ![](subscribeOn.png)
 *
 * ## Example
 *
 * Given the following code:
 *
 * ```ts
 * import { of, merge } from 'rxjs';
 *
 * const a = of(1, 2, 3);
 * const b = of(4, 5, 6);
 *
 * merge(a, b).subscribe(console.log);
 *
 * // Outputs
 * // 1
 * // 2
 * // 3
 * // 4
 * // 5
 * // 6
 * ```
 *
 * Both Observable `a` and `b` will emit their values directly and synchronously once they are subscribed to.
 *
 * If we instead use the `subscribeOn` operator declaring that we want to use the {@link asyncScheduler} for values emitted by Observable `a`:
 *
 * ```ts
 * import { of, subscribeOn, asyncScheduler, merge } from 'rxjs';
 *
 * const a = of(1, 2, 3).pipe(subscribeOn(asyncScheduler));
 * const b = of(4, 5, 6);
 *
 * merge(a, b).subscribe(console.log);
 *
 * // Outputs
 * // 4
 * // 5
 * // 6
 * // 1
 * // 2
 * // 3
 * ```
 *
 * The reason for this is that Observable `b` emits its values directly and synchronously like before
 * but the emissions from `a` are scheduled on the event loop because we are now using the {@link asyncScheduler} for that specific Observable.
 *
 * @param scheduler The {@link SchedulerLike} to perform subscription actions on.
 * @param delay A delay to pass to the scheduler to delay subscriptions
 * @return A function that returns an Observable modified so that its
 * subscriptions happen on the specified {@link SchedulerLike}.
 */
export function subscribeOn<T>(scheduler: SchedulerLike, delay: number = 0): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    subscriber.add(scheduler.schedule(() => source.subscribe(subscriber), delay));
  });
}
import { OperatorFunction, ObservableInput, ObservedValueOf } from '../types';
import { switchMap } from './switchMap';
import { identity } from '../util/identity';

/**
 * Converts a higher-order Observable into a first-order Observable
 * producing values only from the most recent observable sequence
 *
 * <span class="informal">Flattens an Observable-of-Observables.</span>
 *
 * ![](switchAll.png)
 *
 * `switchAll` subscribes to a source that is an observable of observables, also known as a
 * "higher-order observable" (or `Observable<Observable<T>>`). It subscribes to the most recently
 * provided "inner observable" emitted by the source, unsubscribing from any previously subscribed
 * to inner observable, such that only the most recent inner observable may be subscribed to at
 * any point in time. The resulting observable returned by `switchAll` will only complete if the
 * source observable completes, *and* any currently subscribed to inner observable also has completed,
 * if there are any.
 *
 * ## Examples
 *
 * Spawn a new interval observable for each click event, but for every new
 * click, cancel the previous interval and subscribe to the new one
 *
 * ```ts
 * import { fromEvent, tap, map, interval, switchAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click').pipe(tap(() => console.log('click')));
 * const source = clicks.pipe(map(() => interval(1000)));
 *
 * source
 *   .pipe(switchAll())
 *   .subscribe(x => console.log(x));
 *
 * // Output
 * // click
 * // 0
 * // 1
 * // 2
 * // 3
 * // ...
 * // click
 * // 0
 * // 1
 * // 2
 * // ...
 * // click
 * // ...
 * ```
 *
 * @see {@link combineLatestAll}
 * @see {@link concatAll}
 * @see {@link exhaustAll}
 * @see {@link switchMap}
 * @see {@link switchMapTo}
 * @see {@link mergeAll}
 *
 * @return A function that returns an Observable that converts a higher-order
 * Observable into a first-order Observable producing values only from the most
 * recent Observable sequence.
 */
export function switchAll<O extends ObservableInput<any>>(): OperatorFunction<O, ObservedValueOf<O>> {
  return switchMap(identity);
}
import { Subscriber } from '../Subscriber';
import { ObservableInput, OperatorFunction, ObservedValueOf } from '../types';
import { innerFrom } from '../observable/innerFrom';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/* tslint:disable:max-line-length */
export function switchMap<T, O extends ObservableInput<any>>(
  project: (value: T, index: number) => O
): OperatorFunction<T, ObservedValueOf<O>>;
/** @deprecated The `resultSelector` parameter will be removed in v8. Use an inner `map` instead. Details: https://rxjs.dev/deprecations/resultSelector */
export function switchMap<T, O extends ObservableInput<any>>(
  project: (value: T, index: number) => O,
  resultSelector: undefined
): OperatorFunction<T, ObservedValueOf<O>>;
/** @deprecated The `resultSelector` parameter will be removed in v8. Use an inner `map` instead. Details: https://rxjs.dev/deprecations/resultSelector */
export function switchMap<T, R, O extends ObservableInput<any>>(
  project: (value: T, index: number) => O,
  resultSelector: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R
): OperatorFunction<T, R>;
/* tslint:enable:max-line-length */

/**
 * Projects each source value to an Observable which is merged in the output
 * Observable, emitting values only from the most recently projected Observable.
 *
 * <span class="informal">Maps each value to an Observable, then flattens all of
 * these inner Observables.</span>
 *
 * ![](switchMap.png)
 *
 * Returns an Observable that emits items based on applying a function that you
 * supply to each item emitted by the source Observable, where that function
 * returns an (so-called "inner") Observable. Each time it observes one of these
 * inner Observables, the output Observable begins emitting the items emitted by
 * that inner Observable. When a new inner Observable is emitted, `switchMap`
 * stops emitting items from the earlier-emitted inner Observable and begins
 * emitting items from the new one. It continues to behave like this for
 * subsequent inner Observables.
 *
 * ## Example
 *
 * Generate new Observable according to source Observable values
 *
 * ```ts
 * import { of, switchMap } from 'rxjs';
 *
 * const switched = of(1, 2, 3).pipe(switchMap(x => of(x, x ** 2, x ** 3)));
 * switched.subscribe(x => console.log(x));
 * // outputs
 * // 1
 * // 1
 * // 1
 * // 2
 * // 4
 * // 8
 * // 3
 * // 9
 * // 27
 * ```
 *
 * Restart an interval Observable on every click event
 *
 * ```ts
 * import { fromEvent, switchMap, interval } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(switchMap(() => interval(1000)));
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link concatMap}
 * @see {@link exhaustMap}
 * @see {@link mergeMap}
 * @see {@link switchAll}
 * @see {@link switchMapTo}
 *
 * @param {function(value: T, index: number): ObservableInput} project A function
 * that, when applied to an item emitted by the source Observable, returns an
 * Observable.
 * @return A function that returns an Observable that emits the result of
 * applying the projection function (and the optional deprecated
 * `resultSelector`) to each item emitted by the source Observable and taking
 * only the values from the most recently projected inner Observable.
 */
export function switchMap<T, R, O extends ObservableInput<any>>(
  project: (value: T, index: number) => O,
  resultSelector?: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R
): OperatorFunction<T, ObservedValueOf<O> | R> {
  return operate((source, subscriber) => {
    let innerSubscriber: Subscriber<ObservedValueOf<O>> | null = null;
    let index = 0;
    // Whether or not the source subscription has completed
    let isComplete = false;

    // We only complete the result if the source is complete AND we don't have an active inner subscription.
    // This is called both when the source completes and when the inners complete.
    const checkComplete = () => isComplete && !innerSubscriber && subscriber.complete();

    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => {
          // Cancel the previous inner subscription if there was one
          innerSubscriber?.unsubscribe();
          let innerIndex = 0;
          const outerIndex = index++;
          // Start the next inner subscription
          innerFrom(project(value, outerIndex)).subscribe(
            (innerSubscriber = createOperatorSubscriber(
              subscriber,
              // When we get a new inner value, next it through. Note that this is
              // handling the deprecate result selector here. This is because with this architecture
              // it ends up being smaller than using the map operator.
              (innerValue) => subscriber.next(resultSelector ? resultSelector(value, innerValue, outerIndex, innerIndex++) : innerValue),
              () => {
                // The inner has completed. Null out the inner subcriber to
                // free up memory and to signal that we have no inner subscription
                // currently.
                innerSubscriber = null!;
                checkComplete();
              }
            ))
          );
        },
        () => {
          isComplete = true;
          checkComplete();
        }
      )
    );
  });
}
import { switchMap } from './switchMap';
import { ObservableInput, OperatorFunction, ObservedValueOf } from '../types';
import { isFunction } from '../util/isFunction';

/** @deprecated Will be removed in v9. Use {@link switchMap} instead: `switchMap(() => result)` */
export function switchMapTo<O extends ObservableInput<unknown>>(observable: O): OperatorFunction<unknown, ObservedValueOf<O>>;
/** @deprecated The `resultSelector` parameter will be removed in v8. Use an inner `map` instead. Details: https://rxjs.dev/deprecations/resultSelector */
export function switchMapTo<O extends ObservableInput<unknown>>(
  observable: O,
  resultSelector: undefined
): OperatorFunction<unknown, ObservedValueOf<O>>;
/** @deprecated The `resultSelector` parameter will be removed in v8. Use an inner `map` instead. Details: https://rxjs.dev/deprecations/resultSelector */
export function switchMapTo<T, R, O extends ObservableInput<unknown>>(
  observable: O,
  resultSelector: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R
): OperatorFunction<T, R>;

/**
 * Projects each source value to the same Observable which is flattened multiple
 * times with {@link switchMap} in the output Observable.
 *
 * <span class="informal">It's like {@link switchMap}, but maps each value
 * always to the same inner Observable.</span>
 *
 * ![](switchMapTo.png)
 *
 * Maps each source value to the given Observable `innerObservable` regardless
 * of the source value, and then flattens those resulting Observables into one
 * single Observable, which is the output Observable. The output Observables
 * emits values only from the most recently emitted instance of
 * `innerObservable`.
 *
 * ## Example
 *
 * Restart an interval Observable on every click event
 *
 * ```ts
 * import { fromEvent, switchMapTo, interval } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(switchMapTo(interval(1000)));
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link concatMapTo}
 * @see {@link switchAll}
 * @see {@link switchMap}
 * @see {@link mergeMapTo}
 *
 * @param {ObservableInput} innerObservable An Observable to replace each value from
 * the source Observable.
 * @return A function that returns an Observable that emits items from the
 * given `innerObservable` (and optionally transformed through the deprecated
 * `resultSelector`) every time a value is emitted on the source Observable,
 * and taking only the values from the most recently projected inner
 * Observable.
 * @deprecated Will be removed in v9. Use {@link switchMap} instead: `switchMap(() => result)`
 */
export function switchMapTo<T, R, O extends ObservableInput<unknown>>(
  innerObservable: O,
  resultSelector?: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R
): OperatorFunction<T, ObservedValueOf<O> | R> {
  return isFunction(resultSelector) ? switchMap(() => innerObservable, resultSelector) : switchMap(() => innerObservable);
}
import { ObservableInput, ObservedValueOf, OperatorFunction } from '../types';
import { switchMap } from './switchMap';
import { operate } from '../util/lift';

// TODO: Generate a marble diagram for these docs.

/**
 * Applies an accumulator function over the source Observable where the
 * accumulator function itself returns an Observable, emitting values
 * only from the most recently returned Observable.
 *
 * <span class="informal">It's like {@link mergeScan}, but only the most recent
 * Observable returned by the accumulator is merged into the outer Observable.</span>
 *
 * @see {@link scan}
 * @see {@link mergeScan}
 * @see {@link switchMap}
 *
 * @param accumulator
 * The accumulator function called on each source value.
 * @param seed The initial accumulation value.
 * @return A function that returns an observable of the accumulated values.
 */
export function switchScan<T, R, O extends ObservableInput<any>>(
  accumulator: (acc: R, value: T, index: number) => O,
  seed: R
): OperatorFunction<T, ObservedValueOf<O>> {
  return operate((source, subscriber) => {
    // The state we will keep up to date to pass into our
    // accumulator function at each new value from the source.
    let state = seed;

    // Use `switchMap` on our `source` to do the work of creating
    // this operator. Note the backwards order here of `switchMap()(source)`
    // to avoid needing to use `pipe` unnecessarily
    switchMap(
      // On each value from the source, call the accumulator with
      // our previous state, the value and the index.
      (value: T, index) => accumulator(state, value, index),
      // Using the deprecated result selector here as a dirty trick
      // to update our state with the flattened value.
      (_, innerValue) => ((state = innerValue), innerValue)
    )(source).subscribe(subscriber);

    return () => {
      // Release state on finalization
      state = null!;
    };
  });
}
import { MonoTypeOperatorFunction } from '../types';
import { EMPTY } from '../observable/empty';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Emits only the first `count` values emitted by the source Observable.
 *
 * <span class="informal">Takes the first `count` values from the source, then
 * completes.</span>
 *
 * ![](take.png)
 *
 * `take` returns an Observable that emits only the first `count` values emitted
 * by the source Observable. If the source emits fewer than `count` values then
 * all of its values are emitted. After that, it completes, regardless if the
 * source completes.
 *
 * ## Example
 *
 * Take the first 5 seconds of an infinite 1-second interval Observable
 *
 * ```ts
 * import { interval, take } from 'rxjs';
 *
 * const intervalCount = interval(1000);
 * const takeFive = intervalCount.pipe(take(5));
 * takeFive.subscribe(x => console.log(x));
 *
 * // Logs:
 * // 0
 * // 1
 * // 2
 * // 3
 * // 4
 * ```
 *
 * @see {@link takeLast}
 * @see {@link takeUntil}
 * @see {@link takeWhile}
 * @see {@link skip}
 *
 * @param count The maximum number of `next` values to emit.
 * @return A function that returns an Observable that emits only the first
 * `count` values emitted by the source Observable, or all of the values from
 * the source if the source emits fewer than `count` values.
 */
export function take<T>(count: number): MonoTypeOperatorFunction<T> {
  return count <= 0
    ? // If we are taking no values, that's empty.
      () => EMPTY
    : operate((source, subscriber) => {
        let seen = 0;
        source.subscribe(
          createOperatorSubscriber(subscriber, (value) => {
            // Increment the number of values we have seen,
            // then check it against the allowed count to see
            // if we are still letting values through.
            if (++seen <= count) {
              subscriber.next(value);
              // If we have met or passed our allowed count,
              // we need to complete. We have to do <= here,
              // because re-entrant code will increment `seen` twice.
              if (count <= seen) {
                subscriber.complete();
              }
            }
          })
        );
      });
}
import { EMPTY } from '../observable/empty';
import { MonoTypeOperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Waits for the source to complete, then emits the last N values from the source,
 * as specified by the `count` argument.
 *
 * ![](takeLast.png)
 *
 * `takeLast` results in an observable that will hold values up to `count` values in memory,
 * until the source completes. It then pushes all values in memory to the consumer, in the
 * order they were received from the source, then notifies the consumer that it is
 * complete.
 *
 * If for some reason the source completes before the `count` supplied to `takeLast` is reached,
 * all values received until that point are emitted, and then completion is notified.
 *
 * **Warning**: Using `takeLast` with an observable that never completes will result
 * in an observable that never emits a value.
 *
 * ## Example
 *
 * Take the last 3 values of an Observable with many values
 *
 * ```ts
 * import { range, takeLast } from 'rxjs';
 *
 * const many = range(1, 100);
 * const lastThree = many.pipe(takeLast(3));
 * lastThree.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link take}
 * @see {@link takeUntil}
 * @see {@link takeWhile}
 * @see {@link skip}
 *
 * @param count The maximum number of values to emit from the end of
 * the sequence of values emitted by the source Observable.
 * @return A function that returns an Observable that emits at most the last
 * `count` values emitted by the source Observable.
 */
export function takeLast<T>(count: number): MonoTypeOperatorFunction<T> {
  return count <= 0
    ? () => EMPTY
    : operate((source, subscriber) => {
        // This buffer will hold the values we are going to emit
        // when the source completes. Since we only want to take the
        // last N values, we can't emit until we're sure we're not getting
        // any more values.
        let buffer: T[] = [];
        source.subscribe(
          createOperatorSubscriber(
            subscriber,
            (value) => {
              // Add the most recent value onto the end of our buffer.
              buffer.push(value);
              // If our buffer is now larger than the number of values we
              // want to take, we remove the oldest value from the buffer.
              count < buffer.length && buffer.shift();
            },
            () => {
              // The source completed, we now know what are last values
              // are, emit them in the order they were received.
              for (const value of buffer) {
                subscriber.next(value);
              }
              subscriber.complete();
            },
            // Errors are passed through to the consumer
            undefined,
            () => {
              // During finalization release the values in our buffer.
              buffer = null!;
            }
          )
        );
      });
}
import { MonoTypeOperatorFunction, ObservableInput } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';
import { noop } from '../util/noop';

/**
 * Emits the values emitted by the source Observable until a `notifier`
 * Observable emits a value.
 *
 * <span class="informal">Lets values pass until a second Observable,
 * `notifier`, emits a value. Then, it completes.</span>
 *
 * ![](takeUntil.png)
 *
 * `takeUntil` subscribes and begins mirroring the source Observable. It also
 * monitors a second Observable, `notifier` that you provide. If the `notifier`
 * emits a value, the output Observable stops mirroring the source Observable
 * and completes. If the `notifier` doesn't emit any value and completes
 * then `takeUntil` will pass all values.
 *
 * ## Example
 *
 * Tick every second until the first click happens
 *
 * ```ts
 * import { interval, fromEvent, takeUntil } from 'rxjs';
 *
 * const source = interval(1000);
 * const clicks = fromEvent(document, 'click');
 * const result = source.pipe(takeUntil(clicks));
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link take}
 * @see {@link takeLast}
 * @see {@link takeWhile}
 * @see {@link skip}
 *
 * @param {Observable} notifier The Observable whose first emitted value will
 * cause the output Observable of `takeUntil` to stop emitting values from the
 * source Observable.
 * @return A function that returns an Observable that emits the values from the
 * source Observable until `notifier` emits its first value.
 */
export function takeUntil<T>(notifier: ObservableInput<any>): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    innerFrom(notifier).subscribe(createOperatorSubscriber(subscriber, () => subscriber.complete(), noop));
    !subscriber.closed && source.subscribe(subscriber);
  });
}
import { OperatorFunction, MonoTypeOperatorFunction, TruthyTypesOf } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

export function takeWhile<T>(predicate: BooleanConstructor, inclusive: true): MonoTypeOperatorFunction<T>;
export function takeWhile<T>(predicate: BooleanConstructor, inclusive: false): OperatorFunction<T, TruthyTypesOf<T>>;
export function takeWhile<T>(predicate: BooleanConstructor): OperatorFunction<T, TruthyTypesOf<T>>;
export function takeWhile<T, S extends T>(predicate: (value: T, index: number) => value is S): OperatorFunction<T, S>;
export function takeWhile<T, S extends T>(predicate: (value: T, index: number) => value is S, inclusive: false): OperatorFunction<T, S>;
export function takeWhile<T>(predicate: (value: T, index: number) => boolean, inclusive?: boolean): MonoTypeOperatorFunction<T>;

/**
 * Emits values emitted by the source Observable so long as each value satisfies
 * the given `predicate`, and then completes as soon as this `predicate` is not
 * satisfied.
 *
 * <span class="informal">Takes values from the source only while they pass the
 * condition given. When the first value does not satisfy, it completes.</span>
 *
 * ![](takeWhile.png)
 *
 * `takeWhile` subscribes and begins mirroring the source Observable. Each value
 * emitted on the source is given to the `predicate` function which returns a
 * boolean, representing a condition to be satisfied by the source values. The
 * output Observable emits the source values until such time as the `predicate`
 * returns false, at which point `takeWhile` stops mirroring the source
 * Observable and completes the output Observable.
 *
 * ## Example
 *
 * Emit click events only while the clientX property is greater than 200
 *
 * ```ts
 * import { fromEvent, takeWhile } from 'rxjs';
 *
 * const clicks = fromEvent<PointerEvent>(document, 'click');
 * const result = clicks.pipe(takeWhile(ev => ev.clientX > 200));
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link take}
 * @see {@link takeLast}
 * @see {@link takeUntil}
 * @see {@link skip}
 *
 * @param {function(value: T, index: number): boolean} predicate A function that
 * evaluates a value emitted by the source Observable and returns a boolean.
 * Also takes the (zero-based) index as the second argument.
 * @param {boolean} inclusive When set to `true` the value that caused
 * `predicate` to return `false` will also be emitted.
 * @return A function that returns an Observable that emits values from the
 * source Observable so long as each value satisfies the condition defined by
 * the `predicate`, then completes.
 */
export function takeWhile<T>(predicate: (value: T, index: number) => boolean, inclusive = false): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    let index = 0;
    source.subscribe(
      createOperatorSubscriber(subscriber, (value) => {
        const result = predicate(value, index++);
        (result || inclusive) && subscriber.next(value);
        !result && subscriber.complete();
      })
    );
  });
}
import { MonoTypeOperatorFunction, Observer } from '../types';
import { isFunction } from '../util/isFunction';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { identity } from '../util/identity';

export interface TapObserver<T> extends Observer<T> {
  subscribe: () => void;
  unsubscribe: () => void;
  finalize: () => void;
}

export function tap<T>(observer?: Partial<TapObserver<T>>): MonoTypeOperatorFunction<T>;
export function tap<T>(next: (value: T) => void): MonoTypeOperatorFunction<T>;
/** @deprecated Instead of passing separate callback arguments, use an observer argument. Signatures taking separate callback arguments will be removed in v8. Details: https://rxjs.dev/deprecations/subscribe-arguments */
export function tap<T>(
  next?: ((value: T) => void) | null,
  error?: ((error: any) => void) | null,
  complete?: (() => void) | null
): MonoTypeOperatorFunction<T>;

/**
 * Used to perform side-effects for notifications from the source observable
 *
 * <span class="informal">Used when you want to affect outside state with a notification without altering the notification</span>
 *
 * ![](tap.png)
 *
 * Tap is designed to allow the developer a designated place to perform side effects. While you _could_ perform side-effects
 * inside of a `map` or a `mergeMap`, that would make their mapping functions impure, which isn't always a big deal, but will
 * make it so you can't do things like memoize those functions. The `tap` operator is designed solely for such side-effects to
 * help you remove side-effects from other operations.
 *
 * For any notification, next, error, or complete, `tap` will call the appropriate callback you have provided to it, via a function
 * reference, or a partial observer, then pass that notification down the stream.
 *
 * The observable returned by `tap` is an exact mirror of the source, with one exception: Any error that occurs -- synchronously -- in a handler
 * provided to `tap` will be emitted as an error from the returned observable.
 *
 * > Be careful! You can mutate objects as they pass through the `tap` operator's handlers.
 *
 * The most common use of `tap` is actually for debugging. You can place a `tap(console.log)` anywhere
 * in your observable `pipe`, log out the notifications as they are emitted by the source returned by the previous
 * operation.
 *
 * ## Examples
 *
 * Check a random number before it is handled. Below is an observable that will use a random number between 0 and 1,
 * and emit `'big'` or `'small'` depending on the size of that number. But we wanted to log what the original number
 * was, so we have added a `tap(console.log)`.
 *
 * ```ts
 * import { of, tap, map } from 'rxjs';
 *
 * of(Math.random()).pipe(
 *   tap(console.log),
 *   map(n => n > 0.5 ? 'big' : 'small')
 * ).subscribe(console.log);
 * ```
 *
 * Using `tap` to analyze a value and force an error. Below is an observable where in our system we only
 * want to emit numbers 3 or less we get from another source. We can force our observable to error
 * using `tap`.
 *
 * ```ts
 * import { of, tap } from 'rxjs';
 *
 * const source = of(1, 2, 3, 4, 5);
 *
 * source.pipe(
 *   tap(n => {
 *     if (n > 3) {
 *       throw new TypeError(`Value ${ n } is greater than 3`);
 *     }
 *   })
 * )
 * .subscribe({ next: console.log, error: err => console.log(err.message) });
 * ```
 *
 * We want to know when an observable completes before moving on to the next observable. The system
 * below will emit a random series of `'X'` characters from 3 different observables in sequence. The
 * only way we know when one observable completes and moves to the next one, in this case, is because
 * we have added a `tap` with the side effect of logging to console.
 *
 * ```ts
 * import { of, concatMap, interval, take, map, tap } from 'rxjs';
 *
 * of(1, 2, 3).pipe(
 *   concatMap(n => interval(1000).pipe(
 *     take(Math.round(Math.random() * 10)),
 *     map(() => 'X'),
 *     tap({ complete: () => console.log(`Done with ${ n }`) })
 *   ))
 * )
 * .subscribe(console.log);
 * ```
 *
 * @see {@link finalize}
 * @see {@link Observable#subscribe}
 *
 * @param observerOrNext A next handler or partial observer
 * @param error An error handler
 * @param complete A completion handler
 * @return A function that returns an Observable identical to the source, but
 * runs the specified Observer or callback(s) for each item.
 */
export function tap<T>(
  observerOrNext?: Partial<TapObserver<T>> | ((value: T) => void) | null,
  error?: ((e: any) => void) | null,
  complete?: (() => void) | null
): MonoTypeOperatorFunction<T> {
  // We have to check to see not only if next is a function,
  // but if error or complete were passed. This is because someone
  // could technically call tap like `tap(null, fn)` or `tap(null, null, fn)`.
  const tapObserver =
    isFunction(observerOrNext) || error || complete
      ? // tslint:disable-next-line: no-object-literal-type-assertion
        ({ next: observerOrNext as Exclude<typeof observerOrNext, Partial<TapObserver<T>>>, error, complete } as Partial<TapObserver<T>>)
      : observerOrNext;

  return tapObserver
    ? operate((source, subscriber) => {
        tapObserver.subscribe?.();
        let isUnsub = true;
        source.subscribe(
          createOperatorSubscriber(
            subscriber,
            (value) => {
              tapObserver.next?.(value);
              subscriber.next(value);
            },
            () => {
              isUnsub = false;
              tapObserver.complete?.();
              subscriber.complete();
            },
            (err) => {
              isUnsub = false;
              tapObserver.error?.(err);
              subscriber.error(err);
            },
            () => {
              if (isUnsub) {
                tapObserver.unsubscribe?.();
              }
              tapObserver.finalize?.();
            }
          )
        );
      })
    : // Tap was called with no valid tap observer or handler
      // (e.g. `tap(null, null, null)` or `tap(null)` or `tap()`)
      // so we're going to just mirror the source.
      identity;
}
import { Subscription } from '../Subscription';

import { MonoTypeOperatorFunction, ObservableInput } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';

export interface ThrottleConfig {
  leading?: boolean;
  trailing?: boolean;
}

export const defaultThrottleConfig: ThrottleConfig = {
  leading: true,
  trailing: false,
};

/**
 * Emits a value from the source Observable, then ignores subsequent source
 * values for a duration determined by another Observable, then repeats this
 * process.
 *
 * <span class="informal">It's like {@link throttleTime}, but the silencing
 * duration is determined by a second Observable.</span>
 *
 * ![](throttle.svg)
 *
 * `throttle` emits the source Observable values on the output Observable
 * when its internal timer is disabled, and ignores source values when the timer
 * is enabled. Initially, the timer is disabled. As soon as the first source
 * value arrives, it is forwarded to the output Observable, and then the timer
 * is enabled by calling the `durationSelector` function with the source value,
 * which returns the "duration" Observable. When the duration Observable emits a
 * value, the timer is disabled, and this process repeats for the
 * next source value.
 *
 * ## Example
 *
 * Emit clicks at a rate of at most one click per second
 *
 * ```ts
 * import { fromEvent, throttle, interval } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(throttle(() => interval(1000)));
 *
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link audit}
 * @see {@link debounce}
 * @see {@link delayWhen}
 * @see {@link sample}
 * @see {@link throttleTime}
 *
 * @param durationSelector A function
 * that receives a value from the source Observable, for computing the silencing
 * duration for each source value, returned as an Observable or a Promise.
 * @param config a configuration object to define `leading` and `trailing` behavior. Defaults
 * to `{ leading: true, trailing: false }`.
 * @return A function that returns an Observable that performs the throttle
 * operation to limit the rate of emissions from the source.
 */
export function throttle<T>(
  durationSelector: (value: T) => ObservableInput<any>,
  config: ThrottleConfig = defaultThrottleConfig
): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    const { leading, trailing } = config;
    let hasValue = false;
    let sendValue: T | null = null;
    let throttled: Subscription | null = null;
    let isComplete = false;

    const endThrottling = () => {
      throttled?.unsubscribe();
      throttled = null;
      if (trailing) {
        send();
        isComplete && subscriber.complete();
      }
    };

    const cleanupThrottling = () => {
      throttled = null;
      isComplete && subscriber.complete();
    };

    const startThrottle = (value: T) =>
      (throttled = innerFrom(durationSelector(value)).subscribe(createOperatorSubscriber(subscriber, endThrottling, cleanupThrottling)));

    const send = () => {
      if (hasValue) {
        // Ensure we clear out our value and hasValue flag
        // before we emit, otherwise reentrant code can cause
        // issues here.
        hasValue = false;
        const value = sendValue!;
        sendValue = null;
        // Emit the value.
        subscriber.next(value);
        !isComplete && startThrottle(value);
      }
    };

    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        // Regarding the presence of throttled.closed in the following
        // conditions, if a synchronous duration selector is specified - weird,
        // but legal - an already-closed subscription will be assigned to
        // throttled, so the subscription's closed property needs to be checked,
        // too.
        (value) => {
          hasValue = true;
          sendValue = value;
          !(throttled && !throttled.closed) && (leading ? send() : startThrottle(value));
        },
        () => {
          isComplete = true;
          !(trailing && hasValue && throttled && !throttled.closed) && subscriber.complete();
        }
      )
    );
  });
}
import { asyncScheduler } from '../scheduler/async';
import { defaultThrottleConfig, throttle } from './throttle';
import { MonoTypeOperatorFunction, SchedulerLike } from '../types';
import { timer } from '../observable/timer';

/**
 * Emits a value from the source Observable, then ignores subsequent source
 * values for `duration` milliseconds, then repeats this process.
 *
 * <span class="informal">Lets a value pass, then ignores source values for the
 * next `duration` milliseconds.</span>
 *
 * ![](throttleTime.png)
 *
 * `throttleTime` emits the source Observable values on the output Observable
 * when its internal timer is disabled, and ignores source values when the timer
 * is enabled. Initially, the timer is disabled. As soon as the first source
 * value arrives, it is forwarded to the output Observable, and then the timer
 * is enabled. After `duration` milliseconds (or the time unit determined
 * internally by the optional `scheduler`) has passed, the timer is disabled,
 * and this process repeats for the next source value. Optionally takes a
 * {@link SchedulerLike} for managing timers.
 *
 * ## Examples
 *
 * ### Limit click rate
 *
 * Emit clicks at a rate of at most one click per second
 *
 * ```ts
 * import { fromEvent, throttleTime } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(throttleTime(1000));
 *
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link auditTime}
 * @see {@link debounceTime}
 * @see {@link delay}
 * @see {@link sampleTime}
 * @see {@link throttle}
 *
 * @param duration Time to wait before emitting another value after
 * emitting the last value, measured in milliseconds or the time unit determined
 * internally by the optional `scheduler`.
 * @param scheduler The {@link SchedulerLike} to use for
 * managing the timers that handle the throttling. Defaults to {@link asyncScheduler}.
 * @param config a configuration object to define `leading` and
 * `trailing` behavior. Defaults to `{ leading: true, trailing: false }`.
 * @return A function that returns an Observable that performs the throttle
 * operation to limit the rate of emissions from the source.
 */
export function throttleTime<T>(
  duration: number,
  scheduler: SchedulerLike = asyncScheduler,
  config = defaultThrottleConfig
): MonoTypeOperatorFunction<T> {
  const duration$ = timer(duration, scheduler);
  return throttle(() => duration$, config);
}
import { EmptyError } from '../util/EmptyError';
import { MonoTypeOperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * If the source observable completes without emitting a value, it will emit
 * an error. The error will be created at that time by the optional
 * `errorFactory` argument, otherwise, the error will be {@link EmptyError}.
 *
 * ![](throwIfEmpty.png)
 *
 * ## Example
 *
 * Throw an error if the document wasn't clicked within 1 second
 *
 * ```ts
 * import { fromEvent, takeUntil, timer, throwIfEmpty } from 'rxjs';
 *
 * const click$ = fromEvent(document, 'click');
 *
 * click$.pipe(
 *   takeUntil(timer(1000)),
 *   throwIfEmpty(() => new Error('The document was not clicked within 1 second'))
 * )
 * .subscribe({
 *   next() {
 *    console.log('The document was clicked');
 *   },
 *   error(err) {
 *     console.error(err.message);
 *   }
 * });
 * ```
 *
 * @param errorFactory A factory function called to produce the
 * error to be thrown when the source observable completes without emitting a
 * value.
 * @return A function that returns an Observable that throws an error if the
 * source Observable completed without emitting.
 */
export function throwIfEmpty<T>(errorFactory: () => any = defaultErrorFactory): MonoTypeOperatorFunction<T> {
  return operate((source, subscriber) => {
    let hasValue = false;
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => {
          hasValue = true;
          subscriber.next(value);
        },
        () => (hasValue ? subscriber.complete() : subscriber.error(errorFactory()))
      )
    );
  });
}

function defaultErrorFactory() {
  return new EmptyError();
}
import { asyncScheduler } from '../scheduler/async';
import { SchedulerLike, OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Emits an object containing the current value, and the time that has
 * passed between emitting the current value and the previous value, which is
 * calculated by using the provided `scheduler`'s `now()` method to retrieve
 * the current time at each emission, then calculating the difference. The `scheduler`
 * defaults to {@link asyncScheduler}, so by default, the `interval` will be in
 * milliseconds.
 *
 * <span class="informal">Convert an Observable that emits items into one that
 * emits indications of the amount of time elapsed between those emissions.</span>
 *
 * ![](timeInterval.png)
 *
 * ## Example
 *
 * Emit interval between current value with the last value
 *
 * ```ts
 * import { interval, timeInterval } from 'rxjs';
 *
 * const seconds = interval(1000);
 *
 * seconds
 *   .pipe(timeInterval())
 *   .subscribe(value => console.log(value));
 *
 * // NOTE: The values will never be this precise,
 * // intervals created with `interval` or `setInterval`
 * // are non-deterministic.
 *
 * // { value: 0, interval: 1000 }
 * // { value: 1, interval: 1000 }
 * // { value: 2, interval: 1000 }
 * ```
 *
 * @param {SchedulerLike} [scheduler] Scheduler used to get the current time.
 * @return A function that returns an Observable that emits information about
 * value and interval.
 */
export function timeInterval<T>(scheduler: SchedulerLike = asyncScheduler): OperatorFunction<T, TimeInterval<T>> {
  return operate((source, subscriber) => {
    let last = scheduler.now();
    source.subscribe(
      createOperatorSubscriber(subscriber, (value) => {
        const now = scheduler.now();
        const interval = now - last;
        last = now;
        subscriber.next(new TimeInterval(value, interval));
      })
    );
  });
}

// TODO(benlesh): make this an interface, export the interface, but not the implemented class,
// there's no reason users should be manually creating this type.

export class TimeInterval<T> {
  /**
   * @deprecated Internal implementation detail, do not construct directly. Will be made an interface in v8.
   */
  constructor(public value: T, public interval: number) {}
}
import { asyncScheduler } from '../scheduler/async';
import { MonoTypeOperatorFunction, SchedulerLike, OperatorFunction, ObservableInput, ObservedValueOf } from '../types';
import { isValidDate } from '../util/isDate';
import { Subscription } from '../Subscription';
import { operate } from '../util/lift';
import { Observable } from '../Observable';
import { innerFrom } from '../observable/innerFrom';
import { createErrorClass } from '../util/createErrorClass';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { executeSchedule } from '../util/executeSchedule';

export interface TimeoutConfig<T, O extends ObservableInput<unknown> = ObservableInput<T>, M = unknown> {
  /**
   * The time allowed between values from the source before timeout is triggered.
   */
  each?: number;

  /**
   * The relative time as a `number` in milliseconds, or a specific time as a `Date` object,
   * by which the first value must arrive from the source before timeout is triggered.
   */
  first?: number | Date;

  /**
   * The scheduler to use with time-related operations within this operator. Defaults to {@link asyncScheduler}
   */
  scheduler?: SchedulerLike;

  /**
   * A factory used to create observable to switch to when timeout occurs. Provides
   * a {@link TimeoutInfo} about the source observable's emissions and what delay or
   * exact time triggered the timeout.
   */
  with?: (info: TimeoutInfo<T, M>) => O;

  /**
   * Optional additional metadata you can provide to code that handles
   * the timeout, will be provided through the {@link TimeoutError}.
   * This can be used to help identify the source of a timeout or pass along
   * other information related to the timeout.
   */
  meta?: M;
}

export interface TimeoutInfo<T, M = unknown> {
  /** Optional metadata that was provided to the timeout configuration. */
  readonly meta: M;
  /** The number of messages seen before the timeout */
  readonly seen: number;
  /** The last message seen */
  readonly lastValue: T | null;
}

/**
 * An error emitted when a timeout occurs.
 */
export interface TimeoutError<T = unknown, M = unknown> extends Error {
  /**
   * The information provided to the error by the timeout
   * operation that created the error. Will be `null` if
   * used directly in non-RxJS code with an empty constructor.
   * (Note that using this constructor directly is not recommended,
   * you should create your own errors)
   */
  info: TimeoutInfo<T, M> | null;
}

export interface TimeoutErrorCtor {
  /**
   * @deprecated Internal implementation detail. Do not construct error instances.
   * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269
   */
  new <T = unknown, M = unknown>(info?: TimeoutInfo<T, M>): TimeoutError<T, M>;
}

/**
 * An error thrown by the {@link timeout} operator.
 *
 * Provided so users can use as a type and do quality comparisons.
 * We recommend you do not subclass this or create instances of this class directly.
 * If you have need of a error representing a timeout, you should
 * create your own error class and use that.
 *
 * @see {@link timeout}
 *
 * @class TimeoutError
 */
export const TimeoutError: TimeoutErrorCtor = createErrorClass(
  (_super) =>
    function TimeoutErrorImpl(this: any, info: TimeoutInfo<any> | null = null) {
      _super(this);
      this.message = 'Timeout has occurred';
      this.name = 'TimeoutError';
      this.info = info;
    }
);

/**
 * If `with` is provided, this will return an observable that will switch to a different observable if the source
 * does not push values within the specified time parameters.
 *
 * <span class="informal">The most flexible option for creating a timeout behavior.</span>
 *
 * The first thing to know about the configuration is if you do not provide a `with` property to the configuration,
 * when timeout conditions are met, this operator will emit a {@link TimeoutError}. Otherwise, it will use the factory
 * function provided by `with`, and switch your subscription to the result of that. Timeout conditions are provided by
 * the settings in `first` and `each`.
 *
 * The `first` property can be either a `Date` for a specific time, a `number` for a time period relative to the
 * point of subscription, or it can be skipped. This property is to check timeout conditions for the arrival of
 * the first value from the source _only_. The timings of all subsequent values  from the source will be checked
 * against the time period provided by `each`, if it was provided.
 *
 * The `each` property can be either a `number` or skipped. If a value for `each` is provided, it represents the amount of
 * time the resulting observable will wait between the arrival of values from the source before timing out. Note that if
 * `first` is _not_ provided, the value from `each` will be used to check timeout conditions for the arrival of the first
 * value and all subsequent values. If `first` _is_ provided, `each` will only be use to check all values after the first.
 *
 * ## Examples
 *
 * Emit a custom error if there is too much time between values
 *
 * ```ts
 * import { interval, timeout, throwError } from 'rxjs';
 *
 * class CustomTimeoutError extends Error {
 *   constructor() {
 *     super('It was too slow');
 *     this.name = 'CustomTimeoutError';
 *   }
 * }
 *
 * const slow$ = interval(900);
 *
 * slow$.pipe(
 *   timeout({
 *     each: 1000,
 *     with: () => throwError(() => new CustomTimeoutError())
 *   })
 * )
 * .subscribe({
 *   error: console.error
 * });
 * ```
 *
 * Switch to a faster observable if your source is slow.
 *
 * ```ts
 * import { interval, timeout } from 'rxjs';
 *
 * const slow$ = interval(900);
 * const fast$ = interval(500);
 *
 * slow$.pipe(
 *   timeout({
 *     each: 1000,
 *     with: () => fast$,
 *   })
 * )
 * .subscribe(console.log);
 * ```
 * @param config The configuration for the timeout.
 */
export function timeout<T, O extends ObservableInput<unknown>, M = unknown>(
  config: TimeoutConfig<T, O, M> & { with: (info: TimeoutInfo<T, M>) => O }
): OperatorFunction<T, T | ObservedValueOf<O>>;

/**
 * Returns an observable that will error or switch to a different observable if the source does not push values
 * within the specified time parameters.
 *
 * <span class="informal">The most flexible option for creating a timeout behavior.</span>
 *
 * The first thing to know about the configuration is if you do not provide a `with` property to the configuration,
 * when timeout conditions are met, this operator will emit a {@link TimeoutError}. Otherwise, it will use the factory
 * function provided by `with`, and switch your subscription to the result of that. Timeout conditions are provided by
 * the settings in `first` and `each`.
 *
 * The `first` property can be either a `Date` for a specific time, a `number` for a time period relative to the
 * point of subscription, or it can be skipped. This property is to check timeout conditions for the arrival of
 * the first value from the source _only_. The timings of all subsequent values  from the source will be checked
 * against the time period provided by `each`, if it was provided.
 *
 * The `each` property can be either a `number` or skipped. If a value for `each` is provided, it represents the amount of
 * time the resulting observable will wait between the arrival of values from the source before timing out. Note that if
 * `first` is _not_ provided, the value from `each` will be used to check timeout conditions for the arrival of the first
 * value and all subsequent values. If `first` _is_ provided, `each` will only be use to check all values after the first.
 *
 * ### Handling TimeoutErrors
 *
 * If no `with` property was provided, subscriptions to the resulting observable may emit an error of {@link TimeoutError}.
 * The timeout error provides useful information you can examine when you're handling the error. The most common way to handle
 * the error would be with {@link catchError}, although you could use {@link tap} or just the error handler in your `subscribe` call
 * directly, if your error handling is only a side effect (such as notifying the user, or logging).
 *
 * In this case, you would check the error for `instanceof TimeoutError` to validate that the error was indeed from `timeout`, and
 * not from some other source. If it's not from `timeout`, you should probably rethrow it if you're in a `catchError`.
 *
 * ## Examples
 *
 * Emit a {@link TimeoutError} if the first value, and _only_ the first value, does not arrive within 5 seconds
 *
 * ```ts
 * import { interval, timeout } from 'rxjs';
 *
 * // A random interval that lasts between 0 and 10 seconds per tick
 * const source$ = interval(Math.round(Math.random() * 10_000));
 *
 * source$.pipe(
 *   timeout({ first: 5_000 })
 * )
 * .subscribe({
 *   next: console.log,
 *   error: console.error
 * });
 * ```
 *
 * Emit a {@link TimeoutError} if the source waits longer than 5 seconds between any two values or the first value
 * and subscription.
 *
 * ```ts
 * import { timer, timeout, expand } from 'rxjs';
 *
 * const getRandomTime = () => Math.round(Math.random() * 10_000);
 *
 * // An observable that waits a random amount of time between each delivered value
 * const source$ = timer(getRandomTime())
 *   .pipe(expand(() => timer(getRandomTime())));
 *
 * source$
 *   .pipe(timeout({ each: 5_000 }))
 *   .subscribe({
 *     next: console.log,
 *     error: console.error
 *   });
 * ```
 *
 * Emit a {@link TimeoutError} if the source does not emit before 7 seconds, _or_ if the source waits longer than
 * 5 seconds between any two values after the first.
 *
 * ```ts
 * import { timer, timeout, expand } from 'rxjs';
 *
 * const getRandomTime = () => Math.round(Math.random() * 10_000);
 *
 * // An observable that waits a random amount of time between each delivered value
 * const source$ = timer(getRandomTime())
 *   .pipe(expand(() => timer(getRandomTime())));
 *
 * source$
 *   .pipe(timeout({ first: 7_000, each: 5_000 }))
 *   .subscribe({
 *     next: console.log,
 *     error: console.error
 *   });
 * ```
 */
export function timeout<T, M = unknown>(config: Omit<TimeoutConfig<T, any, M>, 'with'>): OperatorFunction<T, T>;

/**
 * Returns an observable that will error if the source does not push its first value before the specified time passed as a `Date`.
 * This is functionally the same as `timeout({ first: someDate })`.
 *
 * <span class="informal">Errors if the first value doesn't show up before the given date and time</span>
 *
 * ![](timeout.png)
 *
 * @param first The date to at which the resulting observable will timeout if the source observable
 * does not emit at least one value.
 * @param scheduler The scheduler to use. Defaults to {@link asyncScheduler}.
 */
export function timeout<T>(first: Date, scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;

/**
 * Returns an observable that will error if the source does not push a value within the specified time in milliseconds.
 * This is functionally the same as `timeout({ each: milliseconds })`.
 *
 * <span class="informal">Errors if it waits too long between any value</span>
 *
 * ![](timeout.png)
 *
 * @param each The time allowed between each pushed value from the source before the resulting observable
 * will timeout.
 * @param scheduler The scheduler to use. Defaults to {@link asyncScheduler}.
 */
export function timeout<T>(each: number, scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;

/**
 *
 * Errors if Observable does not emit a value in given time span.
 *
 * <span class="informal">Timeouts on Observable that doesn't emit values fast enough.</span>
 *
 * ![](timeout.png)
 *
 * @see {@link timeoutWith}
 *
 * @return A function that returns an Observable that mirrors behaviour of the
 * source Observable, unless timeout happens when it throws an error.
 */
export function timeout<T, O extends ObservableInput<any>, M>(
  config: number | Date | TimeoutConfig<T, O, M>,
  schedulerArg?: SchedulerLike
): OperatorFunction<T, T | ObservedValueOf<O>> {
  // Intentionally terse code.
  // If the first argument is a valid `Date`, then we use it as the `first` config.
  // Otherwise, if the first argument is a `number`, then we use it as the `each` config.
  // Otherwise, it can be assumed the first argument is the configuration object itself, and
  // we destructure that into what we're going to use, setting important defaults as we do.
  // NOTE: The default for `scheduler` will be the `scheduler` argument if it exists, or
  // it will default to the `asyncScheduler`.
  const {
    first,
    each,
    with: _with = timeoutErrorFactory,
    scheduler = schedulerArg ?? asyncScheduler,
    meta = null!,
  } = (isValidDate(config) ? { first: config } : typeof config === 'number' ? { each: config } : config) as TimeoutConfig<T, O, M>;

  if (first == null && each == null) {
    // Ensure timeout was provided at runtime.
    throw new TypeError('No timeout provided.');
  }

  return operate((source, subscriber) => {
    // This subscription encapsulates our subscription to the
    // source for this operator. We're capturing it separately,
    // because if there is a `with` observable to fail over to,
    // we want to unsubscribe from our original subscription, and
    // hand of the subscription to that one.
    let originalSourceSubscription: Subscription;
    // The subscription for our timeout timer. This changes
    // every time get get a new value.
    let timerSubscription: Subscription;
    // A bit of state we pass to our with and error factories to
    // tell what the last value we saw was.
    let lastValue: T | null = null;
    // A bit of state we pass to the with and error factories to
    // tell how many values we have seen so far.
    let seen = 0;
    const startTimer = (delay: number) => {
      timerSubscription = executeSchedule(
        subscriber,
        scheduler,
        () => {
          try {
            originalSourceSubscription.unsubscribe();
            innerFrom(
              _with!({
                meta,
                lastValue,
                seen,
              })
            ).subscribe(subscriber);
          } catch (err) {
            subscriber.error(err);
          }
        },
        delay
      );
    };

    originalSourceSubscription = source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value: T) => {
          // clear the timer so we can emit and start another one.
          timerSubscription?.unsubscribe();
          seen++;
          // Emit
          subscriber.next((lastValue = value));
          // null | undefined are both < 0. Thanks, JavaScript.
          each! > 0 && startTimer(each!);
        },
        undefined,
        undefined,
        () => {
          if (!timerSubscription?.closed) {
            timerSubscription?.unsubscribe();
          }
          // Be sure not to hold the last value in memory after unsubscription
          // it could be quite large.
          lastValue = null;
        }
      )
    );

    // Intentionally terse code.
    // If we've `seen` a value, that means the "first" clause was met already, if it existed.
    //   it also means that a timer was already started for "each" (in the next handler above).
    // If `first` was provided, and it's a number, then use it.
    // If `first` was provided and it's not a number, it's a Date, and we get the difference between it and "now".
    // If `first` was not provided at all, then our first timer will be the value from `each`.
    !seen && startTimer(first != null ? (typeof first === 'number' ? first : +first - scheduler!.now()) : each!);
  });
}

/**
 * The default function to use to emit an error when timeout occurs and a `with` function
 * is not specified.
 * @param info The information about the timeout to pass along to the error
 */
function timeoutErrorFactory(info: TimeoutInfo<any>): Observable<never> {
  throw new TimeoutError(info);
}
import { async } from '../scheduler/async';
import { isValidDate } from '../util/isDate';
import { ObservableInput, OperatorFunction, SchedulerLike } from '../types';
import { timeout } from './timeout';

/** @deprecated Replaced with {@link timeout}. Instead of `timeoutWith(someDate, a$, scheduler)`, use the configuration object
 * `timeout({ first: someDate, with: () => a$, scheduler })`. Will be removed in v8. */
export function timeoutWith<T, R>(dueBy: Date, switchTo: ObservableInput<R>, scheduler?: SchedulerLike): OperatorFunction<T, T | R>;
/** @deprecated Replaced with {@link timeout}. Instead of `timeoutWith(100, a$, scheduler)`, use the configuration object
 *  `timeout({ each: 100, with: () => a$, scheduler })`. Will be removed in v8. */
export function timeoutWith<T, R>(waitFor: number, switchTo: ObservableInput<R>, scheduler?: SchedulerLike): OperatorFunction<T, T | R>;

/**
 * When the passed timespan elapses before the source emits any given value, it will unsubscribe from the source,
 * and switch the subscription to another observable.
 *
 * <span class="informal">Used to switch to a different observable if your source is being slow.</span>
 *
 * Useful in cases where:
 *
 * - You want to switch to a different source that may be faster.
 * - You want to notify a user that the data stream is slow.
 * - You want to emit a custom error rather than the {@link TimeoutError} emitted
 *   by the default usage of {@link timeout}.
 *
 * If the first parameter is passed as Date and the time of the Date arrives before the first value arrives from the source,
 * it will unsubscribe from the source and switch the subscription to another observable.
 *
 * <span class="informal">Use Date object to switch to a different observable if the first value doesn't arrive by a specific time.</span>
 *
 * Can be used to set a timeout only for the first value, however it's recommended to use the {@link timeout} operator with
 * the `first` configuration to get the same effect.
 *
 * ## Examples
 *
 * Fallback to a faster observable
 *
 * ```ts
 * import { interval, timeoutWith } from 'rxjs';
 *
 * const slow$ = interval(1000);
 * const faster$ = interval(500);
 *
 * slow$
 *   .pipe(timeoutWith(900, faster$))
 *   .subscribe(console.log);
 * ```
 *
 * Emit your own custom timeout error
 *
 * ```ts
 * import { interval, timeoutWith, throwError } from 'rxjs';
 *
 * class CustomTimeoutError extends Error {
 *   constructor() {
 *     super('It was too slow');
 *     this.name = 'CustomTimeoutError';
 *   }
 * }
 *
 * const slow$ = interval(1000);
 *
 * slow$
 *   .pipe(timeoutWith(900, throwError(() => new CustomTimeoutError())))
 *   .subscribe({
 *     error: err => console.error(err.message)
 *   });
 * ```
 *
 * @see {@link timeout}
 *
 * @param due When passed a number, used as the time (in milliseconds) allowed between each value from the source before timeout
 * is triggered. When passed a Date, used as the exact time at which the timeout will be triggered if the first value does not arrive.
 * @param withObservable The observable to switch to when timeout occurs.
 * @param scheduler The scheduler to use with time-related operations within this operator. Defaults to {@link asyncScheduler}
 * @return A function that returns an Observable that mirrors behaviour of the
 * source Observable, unless timeout happens when it starts emitting values
 * from the `ObservableInput` passed as a second parameter.
 * @deprecated Replaced with {@link timeout}. Instead of `timeoutWith(100, a$, scheduler)`, use {@link timeout} with the configuration
 * object: `timeout({ each: 100, with: () => a$, scheduler })`. Instead of `timeoutWith(someDate, a$, scheduler)`, use {@link timeout}
 * with the configuration object: `timeout({ first: someDate, with: () => a$, scheduler })`. Will be removed in v8.
 */
export function timeoutWith<T, R>(
  due: number | Date,
  withObservable: ObservableInput<R>,
  scheduler?: SchedulerLike
): OperatorFunction<T, T | R> {
  let first: number | Date | undefined;
  let each: number | undefined;
  let _with: () => ObservableInput<R>;
  scheduler = scheduler ?? async;

  if (isValidDate(due)) {
    first = due;
  } else if (typeof due === 'number') {
    each = due;
  }

  if (withObservable) {
    _with = () => withObservable;
  } else {
    throw new TypeError('No observable provided to switch to');
  }

  if (first == null && each == null) {
    // Ensure timeout was provided at runtime.
    throw new TypeError('No timeout provided.');
  }

  return timeout<T, ObservableInput<R>>({
    first,
    each,
    scheduler,
    with: _with,
  });
}
import { OperatorFunction, TimestampProvider, Timestamp } from '../types';
import { dateTimestampProvider } from '../scheduler/dateTimestampProvider';
import { map } from './map';

/**
 * Attaches a timestamp to each item emitted by an observable indicating when it was emitted
 *
 * The `timestamp` operator maps the *source* observable stream to an object of type
 * `{value: T, timestamp: R}`. The properties are generically typed. The `value` property contains the value
 * and type of the *source* observable. The `timestamp` is generated by the schedulers `now` function. By
 * default, it uses the `asyncScheduler` which simply returns `Date.now()` (milliseconds since 1970/01/01
 * 00:00:00:000) and therefore is of type `number`.
 *
 * ![](timestamp.png)
 *
 * ## Example
 *
 * In this example there is a timestamp attached to the document's click events
 *
 * ```ts
 * import { fromEvent, timestamp } from 'rxjs';
 *
 * const clickWithTimestamp = fromEvent(document, 'click').pipe(
 *   timestamp()
 * );
 *
 * // Emits data of type { value: PointerEvent, timestamp: number }
 * clickWithTimestamp.subscribe(data => {
 *   console.log(data);
 * });
 * ```
 *
 * @param timestampProvider An object with a `now()` method used to get the current timestamp.
 * @return A function that returns an Observable that attaches a timestamp to
 * each item emitted by the source Observable indicating when it was emitted.
 */
export function timestamp<T>(timestampProvider: TimestampProvider = dateTimestampProvider): OperatorFunction<T, Timestamp<T>> {
  return map((value: T) => ({ value, timestamp: timestampProvider.now() }));
}
import { reduce } from './reduce';
import { OperatorFunction } from '../types';
import { operate } from '../util/lift';

const arrReducer = (arr: any[], value: any) => (arr.push(value), arr);

/**
 * Collects all source emissions and emits them as an array when the source completes.
 *
 * <span class="informal">Get all values inside an array when the source completes</span>
 *
 * ![](toArray.png)
 *
 * `toArray` will wait until the source Observable completes before emitting
 * the array containing all emissions. When the source Observable errors no
 * array will be emitted.
 *
 * ## Example
 *
 * ```ts
 * import { interval, take, toArray } from 'rxjs';
 *
 * const source = interval(1000);
 * const example = source.pipe(
 *   take(10),
 *   toArray()
 * );
 *
 * example.subscribe(value => console.log(value));
 *
 * // output: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 * ```
 *
 * @return A function that returns an Observable that emits an array of items
 * emitted by the source Observable when source completes.
 */
export function toArray<T>(): OperatorFunction<T, T[]> {
  // Because arrays are mutable, and we're mutating the array in this
  // reducer process, we have to escapulate the creation of the initial
  // array within this `operate` function.
  return operate((source, subscriber) => {
    reduce(arrReducer, [] as T[])(source).subscribe(subscriber);
  });
}
import { Observable } from '../Observable';
import { OperatorFunction } from '../types';
import { Subject } from '../Subject';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { noop } from '../util/noop';

/**
 * Branch out the source Observable values as a nested Observable whenever
 * `windowBoundaries` emits.
 *
 * <span class="informal">It's like {@link buffer}, but emits a nested Observable
 * instead of an array.</span>
 *
 * ![](window.png)
 *
 * Returns an Observable that emits windows of items it collects from the source
 * Observable. The output Observable emits connected, non-overlapping
 * windows. It emits the current window and opens a new one whenever the
 * Observable `windowBoundaries` emits an item. Because each window is an
 * Observable, the output is a higher-order Observable.
 *
 * ## Example
 *
 * In every window of 1 second each, emit at most 2 click events
 *
 * ```ts
 * import { fromEvent, interval, window, map, take, mergeAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const sec = interval(1000);
 * const result = clicks.pipe(
 *   window(sec),
 *   map(win => win.pipe(take(2))), // take at most 2 emissions from each window
 *   mergeAll()                     // flatten the Observable-of-Observables
 * );
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link windowCount}
 * @see {@link windowTime}
 * @see {@link windowToggle}
 * @see {@link windowWhen}
 * @see {@link buffer}
 *
 * @param {Observable<any>} windowBoundaries An Observable that completes the
 * previous window and starts a new window.
 * @return A function that returns an Observable of windows, which are
 * Observables emitting values of the source Observable.
 */
export function window<T>(windowBoundaries: Observable<any>): OperatorFunction<T, Observable<T>> {
  return operate((source, subscriber) => {
    let windowSubject: Subject<T> = new Subject<T>();

    subscriber.next(windowSubject.asObservable());

    const errorHandler = (err: any) => {
      windowSubject.error(err);
      subscriber.error(err);
    };

    // Subscribe to our source
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => windowSubject?.next(value),
        () => {
          windowSubject.complete();
          subscriber.complete();
        },
        errorHandler
      )
    );

    // Subscribe to the window boundaries.
    windowBoundaries.subscribe(
      createOperatorSubscriber(
        subscriber,
        () => {
          windowSubject.complete();
          subscriber.next((windowSubject = new Subject()));
        },
        noop,
        errorHandler
      )
    );

    return () => {
      // Unsubscribing the subject ensures that anyone who has captured
      // a reference to this window that tries to use it after it can
      // no longer get values from the source will get an ObjectUnsubscribedError.
      windowSubject?.unsubscribe();
      windowSubject = null!;
    };
  });
}
import { Observable } from '../Observable';
import { Subject } from '../Subject';
import { OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';

/**
 * Branch out the source Observable values as a nested Observable with each
 * nested Observable emitting at most `windowSize` values.
 *
 * <span class="informal">It's like {@link bufferCount}, but emits a nested
 * Observable instead of an array.</span>
 *
 * ![](windowCount.png)
 *
 * Returns an Observable that emits windows of items it collects from the source
 * Observable. The output Observable emits windows every `startWindowEvery`
 * items, each containing no more than `windowSize` items. When the source
 * Observable completes or encounters an error, the output Observable emits
 * the current window and propagates the notification from the source
 * Observable. If `startWindowEvery` is not provided, then new windows are
 * started immediately at the start of the source and when each window completes
 * with size `windowSize`.
 *
 * ## Examples
 *
 * Ignore every 3rd click event, starting from the first one
 *
 * ```ts
 * import { fromEvent, windowCount, map, skip, mergeAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(
 *   windowCount(3),
 *   map(win => win.pipe(skip(1))), // skip first of every 3 clicks
 *   mergeAll()                     // flatten the Observable-of-Observables
 * );
 * result.subscribe(x => console.log(x));
 * ```
 *
 * Ignore every 3rd click event, starting from the third one
 *
 * ```ts
 * import { fromEvent, windowCount, mergeAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(
 *   windowCount(2, 3),
 *   mergeAll() // flatten the Observable-of-Observables
 * );
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link window}
 * @see {@link windowTime}
 * @see {@link windowToggle}
 * @see {@link windowWhen}
 * @see {@link bufferCount}
 *
 * @param {number} windowSize The maximum number of values emitted by each
 * window.
 * @param {number} [startWindowEvery] Interval at which to start a new window.
 * For example if `startWindowEvery` is `2`, then a new window will be started
 * on every other value from the source. A new window is started at the
 * beginning of the source by default.
 * @return A function that returns an Observable of windows, which in turn are
 * Observable of values.
 */
export function windowCount<T>(windowSize: number, startWindowEvery: number = 0): OperatorFunction<T, Observable<T>> {
  const startEvery = startWindowEvery > 0 ? startWindowEvery : windowSize;

  return operate((source, subscriber) => {
    let windows = [new Subject<T>()];
    let starts: number[] = [];
    let count = 0;

    // Open the first window.
    subscriber.next(windows[0].asObservable());

    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value: T) => {
          // Emit the value through all current windows.
          // We don't need to create a new window yet, we
          // do that as soon as we close one.
          for (const window of windows) {
            window.next(value);
          }
          // Here we're using the size of the window array to figure
          // out if the oldest window has emitted enough values. We can do this
          // because the size of the window array is a function of the values
          // seen by the subscription. If it's time to close it, we complete
          // it and remove it.
          const c = count - windowSize + 1;
          if (c >= 0 && c % startEvery === 0) {
            windows.shift()!.complete();
          }

          // Look to see if the next count tells us it's time to open a new window.
          // TODO: We need to figure out if this really makes sense. We're technically
          // emitting windows *before* we have a value to emit them for. It's probably
          // more expected that we should be emitting the window when the start
          // count is reached -- not before.
          if (++count % startEvery === 0) {
            const window = new Subject<T>();
            windows.push(window);
            subscriber.next(window.asObservable());
          }
        },
        () => {
          while (windows.length > 0) {
            windows.shift()!.complete();
          }
          subscriber.complete();
        },
        (err) => {
          while (windows.length > 0) {
            windows.shift()!.error(err);
          }
          subscriber.error(err);
        },
        () => {
          starts = null!;
          windows = null!;
        }
      )
    );
  });
}
import { Subject } from '../Subject';
import { asyncScheduler } from '../scheduler/async';
import { Observable } from '../Observable';
import { Subscription } from '../Subscription';
import { Observer, OperatorFunction, SchedulerLike } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { arrRemove } from '../util/arrRemove';
import { popScheduler } from '../util/args';
import { executeSchedule } from '../util/executeSchedule';

export function windowTime<T>(windowTimeSpan: number, scheduler?: SchedulerLike): OperatorFunction<T, Observable<T>>;
export function windowTime<T>(
  windowTimeSpan: number,
  windowCreationInterval: number,
  scheduler?: SchedulerLike
): OperatorFunction<T, Observable<T>>;
export function windowTime<T>(
  windowTimeSpan: number,
  windowCreationInterval: number | null | void,
  maxWindowSize: number,
  scheduler?: SchedulerLike
): OperatorFunction<T, Observable<T>>;

/**
 * Branch out the source Observable values as a nested Observable periodically
 * in time.
 *
 * <span class="informal">It's like {@link bufferTime}, but emits a nested
 * Observable instead of an array.</span>
 *
 * ![](windowTime.png)
 *
 * Returns an Observable that emits windows of items it collects from the source
 * Observable. The output Observable starts a new window periodically, as
 * determined by the `windowCreationInterval` argument. It emits each window
 * after a fixed timespan, specified by the `windowTimeSpan` argument. When the
 * source Observable completes or encounters an error, the output Observable
 * emits the current window and propagates the notification from the source
 * Observable. If `windowCreationInterval` is not provided, the output
 * Observable starts a new window when the previous window of duration
 * `windowTimeSpan` completes. If `maxWindowCount` is provided, each window
 * will emit at most fixed number of values. Window will complete immediately
 * after emitting last value and next one still will open as specified by
 * `windowTimeSpan` and `windowCreationInterval` arguments.
 *
 * ## Examples
 *
 * In every window of 1 second each, emit at most 2 click events
 *
 * ```ts
 * import { fromEvent, windowTime, map, take, mergeAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(
 *   windowTime(1000),
 *   map(win => win.pipe(take(2))), // take at most 2 emissions from each window
 *   mergeAll()                     // flatten the Observable-of-Observables
 * );
 * result.subscribe(x => console.log(x));
 * ```
 *
 * Every 5 seconds start a window 1 second long, and emit at most 2 click events per window
 *
 * ```ts
 * import { fromEvent, windowTime, map, take, mergeAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(
 *   windowTime(1000, 5000),
 *   map(win => win.pipe(take(2))), // take at most 2 emissions from each window
 *   mergeAll()                     // flatten the Observable-of-Observables
 * );
 * result.subscribe(x => console.log(x));
 * ```
 *
 * Same as example above but with `maxWindowCount` instead of `take`
 *
 * ```ts
 * import { fromEvent, windowTime, mergeAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(
 *   windowTime(1000, 5000, 2), // take at most 2 emissions from each window
 *   mergeAll()                 // flatten the Observable-of-Observables
 * );
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link window}
 * @see {@link windowCount}
 * @see {@link windowToggle}
 * @see {@link windowWhen}
 * @see {@link bufferTime}
 *
 * @param windowTimeSpan The amount of time, in milliseconds, to fill each window.
 * @param windowCreationInterval The interval at which to start new
 * windows.
 * @param maxWindowSize Max number of
 * values each window can emit before completion.
 * @param scheduler The scheduler on which to schedule the
 * intervals that determine window boundaries.
 * @return A function that returns an Observable of windows, which in turn are
 * Observables.
 */
export function windowTime<T>(windowTimeSpan: number, ...otherArgs: any[]): OperatorFunction<T, Observable<T>> {
  const scheduler = popScheduler(otherArgs) ?? asyncScheduler;
  const windowCreationInterval = (otherArgs[0] as number) ?? null;
  const maxWindowSize = (otherArgs[1] as number) || Infinity;

  return operate((source, subscriber) => {
    // The active windows, their related subscriptions, and removal functions.
    let windowRecords: WindowRecord<T>[] | null = [];
    // If true, it means that every time we close a window, we want to start a new window.
    // This is only really used for when *just* the time span is passed.
    let restartOnClose = false;

    const closeWindow = (record: { window: Subject<T>; subs: Subscription }) => {
      const { window, subs } = record;
      window.complete();
      subs.unsubscribe();
      arrRemove(windowRecords, record);
      restartOnClose && startWindow();
    };

    /**
     * Called every time we start a new window. This also does
     * the work of scheduling the job to close the window.
     */
    const startWindow = () => {
      if (windowRecords) {
        const subs = new Subscription();
        subscriber.add(subs);
        const window = new Subject<T>();
        const record = {
          window,
          subs,
          seen: 0,
        };
        windowRecords.push(record);
        subscriber.next(window.asObservable());
        executeSchedule(subs, scheduler, () => closeWindow(record), windowTimeSpan);
      }
    };

    if (windowCreationInterval !== null && windowCreationInterval >= 0) {
      // The user passed both a windowTimeSpan (required), and a creation interval
      // That means we need to start new window on the interval, and those windows need
      // to wait the required time span before completing.
      executeSchedule(subscriber, scheduler, startWindow, windowCreationInterval, true);
    } else {
      restartOnClose = true;
    }

    startWindow();

    /**
     * We need to loop over a copy of the window records several times in this operator.
     * This is to save bytes over the wire more than anything.
     * The reason we copy the array is that reentrant code could mutate the array while
     * we are iterating over it.
     */
    const loop = (cb: (record: WindowRecord<T>) => void) => windowRecords!.slice().forEach(cb);

    /**
     * Used to notify all of the windows and the subscriber in the same way
     * in the error and complete handlers.
     */
    const terminate = (cb: (consumer: Observer<any>) => void) => {
      loop(({ window }) => cb(window));
      cb(subscriber);
      subscriber.unsubscribe();
    };

    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value: T) => {
          // Notify all windows of the value.
          loop((record) => {
            record.window.next(value);
            // If the window is over the max size, we need to close it.
            maxWindowSize <= ++record.seen && closeWindow(record);
          });
        },
        // Complete the windows and the downstream subscriber and clean up.
        () => terminate((consumer) => consumer.complete()),
        // Notify the windows and the downstream subscriber of the error and clean up.
        (err) => terminate((consumer) => consumer.error(err))
      )
    );

    // Additional finalization. This will be called when the
    // destination tears down. Other finalizations are registered implicitly
    // above via subscription.
    return () => {
      // Ensure that the buffer is released.
      windowRecords = null!;
    };
  });
}

interface WindowRecord<T> {
  seen: number;
  window: Subject<T>;
  subs: Subscription;
}
import { Observable } from '../Observable';
import { Subject } from '../Subject';
import { Subscription } from '../Subscription';
import { ObservableInput, OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { innerFrom } from '../observable/innerFrom';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { noop } from '../util/noop';
import { arrRemove } from '../util/arrRemove';

/**
 * Branch out the source Observable values as a nested Observable starting from
 * an emission from `openings` and ending when the output of `closingSelector`
 * emits.
 *
 * <span class="informal">It's like {@link bufferToggle}, but emits a nested
 * Observable instead of an array.</span>
 *
 * ![](windowToggle.png)
 *
 * Returns an Observable that emits windows of items it collects from the source
 * Observable. The output Observable emits windows that contain those items
 * emitted by the source Observable between the time when the `openings`
 * Observable emits an item and when the Observable returned by
 * `closingSelector` emits an item.
 *
 * ## Example
 *
 * Every other second, emit the click events from the next 500ms
 *
 * ```ts
 * import { fromEvent, interval, windowToggle, EMPTY, mergeAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const openings = interval(1000);
 * const result = clicks.pipe(
 *   windowToggle(openings, i => i % 2 ? interval(500) : EMPTY),
 *   mergeAll()
 * );
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link window}
 * @see {@link windowCount}
 * @see {@link windowTime}
 * @see {@link windowWhen}
 * @see {@link bufferToggle}
 *
 * @param {Observable<O>} openings An observable of notifications to start new
 * windows.
 * @param {function(value: O): Observable} closingSelector A function that takes
 * the value emitted by the `openings` observable and returns an Observable,
 * which, when it emits a next notification, signals that the
 * associated window should complete.
 * @return A function that returns an Observable of windows, which in turn are
 * Observables.
 */
export function windowToggle<T, O>(
  openings: ObservableInput<O>,
  closingSelector: (openValue: O) => ObservableInput<any>
): OperatorFunction<T, Observable<T>> {
  return operate((source, subscriber) => {
    const windows: Subject<T>[] = [];

    const handleError = (err: any) => {
      while (0 < windows.length) {
        windows.shift()!.error(err);
      }
      subscriber.error(err);
    };

    innerFrom(openings).subscribe(
      createOperatorSubscriber(
        subscriber,
        (openValue) => {
          const window = new Subject<T>();
          windows.push(window);
          const closingSubscription = new Subscription();
          const closeWindow = () => {
            arrRemove(windows, window);
            window.complete();
            closingSubscription.unsubscribe();
          };

          let closingNotifier: Observable<any>;
          try {
            closingNotifier = innerFrom(closingSelector(openValue));
          } catch (err) {
            handleError(err);
            return;
          }

          subscriber.next(window.asObservable());

          closingSubscription.add(closingNotifier.subscribe(createOperatorSubscriber(subscriber, closeWindow, noop, handleError)));
        },
        noop
      )
    );

    // Subcribe to the source to get things started.
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value: T) => {
          // Copy the windows array before we emit to
          // make sure we don't have issues with reentrant code.
          const windowsCopy = windows.slice();
          for (const window of windowsCopy) {
            window.next(value);
          }
        },
        () => {
          // Complete all of our windows before we complete.
          while (0 < windows.length) {
            windows.shift()!.complete();
          }
          subscriber.complete();
        },
        handleError,
        () => {
          // Add this finalization so that all window subjects are
          // disposed of. This way, if a user tries to subscribe
          // to a window *after* the outer subscription has been unsubscribed,
          // they will get an error, instead of waiting forever to
          // see if a value arrives.
          while (0 < windows.length) {
            windows.shift()!.unsubscribe();
          }
        }
      )
    );
  });
}
import { Subscriber } from '../Subscriber';
import { Observable } from '../Observable';
import { Subject } from '../Subject';
import { ObservableInput, OperatorFunction } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';

/**
 * Branch out the source Observable values as a nested Observable using a
 * factory function of closing Observables to determine when to start a new
 * window.
 *
 * <span class="informal">It's like {@link bufferWhen}, but emits a nested
 * Observable instead of an array.</span>
 *
 * ![](windowWhen.png)
 *
 * Returns an Observable that emits windows of items it collects from the source
 * Observable. The output Observable emits connected, non-overlapping windows.
 * It emits the current window and opens a new one whenever the Observable
 * produced by the specified `closingSelector` function emits an item. The first
 * window is opened immediately when subscribing to the output Observable.
 *
 * ## Example
 *
 * Emit only the first two clicks events in every window of [1-5] random seconds
 *
 * ```ts
 * import { fromEvent, windowWhen, interval, map, take, mergeAll } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const result = clicks.pipe(
 *   windowWhen(() => interval(1000 + Math.random() * 4000)),
 *   map(win => win.pipe(take(2))), // take at most 2 emissions from each window
 *   mergeAll()                     // flatten the Observable-of-Observables
 * );
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link window}
 * @see {@link windowCount}
 * @see {@link windowTime}
 * @see {@link windowToggle}
 * @see {@link bufferWhen}
 *
 * @param {function(): Observable} closingSelector A function that takes no
 * arguments and returns an Observable that signals (on either `next` or
 * `complete`) when to close the previous window and start a new one.
 * @return A function that returns an Observable of windows, which in turn are
 * Observables.
 */
export function windowWhen<T>(closingSelector: () => ObservableInput<any>): OperatorFunction<T, Observable<T>> {
  return operate((source, subscriber) => {
    let window: Subject<T> | null;
    let closingSubscriber: Subscriber<any> | undefined;

    /**
     * When we get an error, we have to notify both the
     * destiation subscriber and the window.
     */
    const handleError = (err: any) => {
      window!.error(err);
      subscriber.error(err);
    };

    /**
     * Called every time we need to open a window.
     * Recursive, as it will start the closing notifier, which
     * inevitably *should* call openWindow -- but may not if
     * it is a "never" observable.
     */
    const openWindow = () => {
      // We need to clean up our closing subscription,
      // we only cared about the first next or complete notification.
      closingSubscriber?.unsubscribe();

      // Close our window before starting a new one.
      window?.complete();

      // Start the new window.
      window = new Subject<T>();
      subscriber.next(window.asObservable());

      // Get our closing notifier.
      let closingNotifier: Observable<any>;
      try {
        closingNotifier = innerFrom(closingSelector());
      } catch (err) {
        handleError(err);
        return;
      }

      // Subscribe to the closing notifier, be sure
      // to capture the subscriber (aka Subscription)
      // so we can clean it up when we close the window
      // and open a new one.
      closingNotifier.subscribe((closingSubscriber = createOperatorSubscriber(subscriber, openWindow, openWindow, handleError)));
    };

    // Start the first window.
    openWindow();

    // Subscribe to the source
    source.subscribe(
      createOperatorSubscriber(
        subscriber,
        (value) => window!.next(value),
        () => {
          // The source completed, close the window and complete.
          window!.complete();
          subscriber.complete();
        },
        handleError,
        () => {
          // Be sure to clean up our closing subscription
          // when this tears down.
          closingSubscriber?.unsubscribe();
          window = null!;
        }
      )
    );
  });
}
import { OperatorFunction, ObservableInputTuple } from '../types';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';
import { identity } from '../util/identity';
import { noop } from '../util/noop';
import { popResultSelector } from '../util/args';

export function withLatestFrom<T, O extends unknown[]>(...inputs: [...ObservableInputTuple<O>]): OperatorFunction<T, [T, ...O]>;

export function withLatestFrom<T, O extends unknown[], R>(
  ...inputs: [...ObservableInputTuple<O>, (...value: [T, ...O]) => R]
): OperatorFunction<T, R>;

/**
 * Combines the source Observable with other Observables to create an Observable
 * whose values are calculated from the latest values of each, only when the
 * source emits.
 *
 * <span class="informal">Whenever the source Observable emits a value, it
 * computes a formula using that value plus the latest values from other input
 * Observables, then emits the output of that formula.</span>
 *
 * ![](withLatestFrom.png)
 *
 * `withLatestFrom` combines each value from the source Observable (the
 * instance) with the latest values from the other input Observables only when
 * the source emits a value, optionally using a `project` function to determine
 * the value to be emitted on the output Observable. All input Observables must
 * emit at least one value before the output Observable will emit a value.
 *
 * ## Example
 *
 * On every click event, emit an array with the latest timer event plus the click event
 *
 * ```ts
 * import { fromEvent, interval, withLatestFrom } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const timer = interval(1000);
 * const result = clicks.pipe(withLatestFrom(timer));
 * result.subscribe(x => console.log(x));
 * ```
 *
 * @see {@link combineLatest}
 *
 * @param {ObservableInput} other An input Observable to combine with the source
 * Observable. More than one input Observables may be given as argument.
 * @param {Function} [project] Projection function for combining values
 * together. Receives all values in order of the Observables passed, where the
 * first parameter is a value from the source Observable. (e.g.
 * `a.pipe(withLatestFrom(b, c), map(([a1, b1, c1]) => a1 + b1 + c1))`). If this is not
 * passed, arrays will be emitted on the output Observable.
 * @return A function that returns an Observable of projected values from the
 * most recent values from each input Observable, or an array of the most
 * recent values from each input Observable.
 */
export function withLatestFrom<T, R>(...inputs: any[]): OperatorFunction<T, R | any[]> {
  const project = popResultSelector(inputs) as ((...args: any[]) => R) | undefined;

  return operate((source, subscriber) => {
    const len = inputs.length;
    const otherValues = new Array(len);
    // An array of whether or not the other sources have emitted. Matched with them by index.
    // TODO: At somepoint, we should investigate the performance implications here, and look
    // into using a `Set()` and checking the `size` to see if we're ready.
    let hasValue = inputs.map(() => false);
    // Flipped true when we have at least one value from all other sources and
    // we are ready to start emitting values.
    let ready = false;

    // Other sources. Note that here we are not checking `subscriber.closed`,
    // this causes all inputs to be subscribed to, even if nothing can be emitted
    // from them. This is an important distinction because subscription constitutes
    // a side-effect.
    for (let i = 0; i < len; i++) {
      innerFrom(inputs[i]).subscribe(
        createOperatorSubscriber(
          subscriber,
          (value) => {
            otherValues[i] = value;
            if (!ready && !hasValue[i]) {
              // If we're not ready yet, flag to show this observable has emitted.
              hasValue[i] = true;
              // Intentionally terse code.
              // If all of our other observables have emitted, set `ready` to `true`,
              // so we know we can start emitting values, then clean up the `hasValue` array,
              // because we don't need it anymore.
              (ready = hasValue.every(identity)) && (hasValue = null!);
            }
          },
          // Completing one of the other sources has
          // no bearing on the completion of our result.
          noop
        )
      );
    }

    // Source subscription
    source.subscribe(
      createOperatorSubscriber(subscriber, (value) => {
        if (ready) {
          // We have at least one value from the other sources. Go ahead and emit.
          const values = [value, ...otherValues];
          subscriber.next(project ? project(...values) : values);
        }
      })
    );
  });
}
import { zip as zipStatic } from '../observable/zip';
import { ObservableInput, ObservableInputTuple, OperatorFunction, Cons } from '../types';
import { operate } from '../util/lift';

/** @deprecated Replaced with {@link zipWith}. Will be removed in v8. */
export function zip<T, A extends readonly unknown[]>(otherInputs: [...ObservableInputTuple<A>]): OperatorFunction<T, Cons<T, A>>;
/** @deprecated Replaced with {@link zipWith}. Will be removed in v8. */
export function zip<T, A extends readonly unknown[], R>(
  otherInputsAndProject: [...ObservableInputTuple<A>],
  project: (...values: Cons<T, A>) => R
): OperatorFunction<T, R>;
/** @deprecated Replaced with {@link zipWith}. Will be removed in v8. */
export function zip<T, A extends readonly unknown[]>(...otherInputs: [...ObservableInputTuple<A>]): OperatorFunction<T, Cons<T, A>>;
/** @deprecated Replaced with {@link zipWith}. Will be removed in v8. */
export function zip<T, A extends readonly unknown[], R>(
  ...otherInputsAndProject: [...ObservableInputTuple<A>, (...values: Cons<T, A>) => R]
): OperatorFunction<T, R>;

/**
 * @deprecated Replaced with {@link zipWith}. Will be removed in v8.
 */
export function zip<T, R>(...sources: Array<ObservableInput<any> | ((...values: Array<any>) => R)>): OperatorFunction<T, any> {
  return operate((source, subscriber) => {
    zipStatic(source as ObservableInput<any>, ...(sources as Array<ObservableInput<any>>)).subscribe(subscriber);
  });
}
import { OperatorFunction, ObservableInput } from '../types';
import { zip } from '../observable/zip';
import { joinAllInternals } from './joinAllInternals';

/**
 * Collects all observable inner sources from the source, once the source completes,
 * it will subscribe to all inner sources, combining their values by index and emitting
 * them.
 *
 * @see {@link zipWith}
 * @see {@link zip}
 */
export function zipAll<T>(): OperatorFunction<ObservableInput<T>, T[]>;
export function zipAll<T>(): OperatorFunction<any, T[]>;
export function zipAll<T, R>(project: (...values: T[]) => R): OperatorFunction<ObservableInput<T>, R>;
export function zipAll<R>(project: (...values: Array<any>) => R): OperatorFunction<any, R>;

export function zipAll<T, R>(project?: (...values: T[]) => R) {
  return joinAllInternals(zip, project);
}
import { ObservableInputTuple, OperatorFunction, Cons } from '../types';
import { zip } from './zip';

/**
 * Subscribes to the source, and the observable inputs provided as arguments, and combines their values, by index, into arrays.
 *
 * What is meant by "combine by index": The first value from each will be made into a single array, then emitted,
 * then the second value from each will be combined into a single array and emitted, then the third value
 * from each will be combined into a single array and emitted, and so on.
 *
 * This will continue until it is no longer able to combine values of the same index into an array.
 *
 * After the last value from any one completed source is emitted in an array, the resulting observable will complete,
 * as there is no way to continue "zipping" values together by index.
 *
 * Use-cases for this operator are limited. There are memory concerns if one of the streams is emitting
 * values at a much faster rate than the others. Usage should likely be limited to streams that emit
 * at a similar pace, or finite streams of known length.
 *
 * In many cases, authors want `combineLatestWith` and not `zipWith`.
 *
 * @param otherInputs other observable inputs to collate values from.
 * @return A function that returns an Observable that emits items by index
 * combined from the source Observable and provided Observables, in form of an
 * array.
 */
export function zipWith<T, A extends readonly unknown[]>(...otherInputs: [...ObservableInputTuple<A>]): OperatorFunction<T, Cons<T, A>> {
  return zip(...otherInputs);
}
import { Subject } from '../Subject';
import { Observable } from '../Observable';
import { Subscriber } from '../Subscriber';
import { Subscription } from '../Subscription';
import { refCount as higherOrderRefCount } from '../operators/refCount';
import { createOperatorSubscriber } from '../operators/OperatorSubscriber';
import { hasLift } from '../util/lift';

/**
 * @class ConnectableObservable<T>
 * @deprecated Will be removed in v8. Use {@link connectable} to create a connectable observable.
 * If you are using the `refCount` method of `ConnectableObservable`, use the {@link share} operator
 * instead.
 * Details: https://rxjs.dev/deprecations/multicasting
 */
export class ConnectableObservable<T> extends Observable<T> {
  protected _subject: Subject<T> | null = null;
  protected _refCount: number = 0;
  protected _connection: Subscription | null = null;

  /**
   * @param source The source observable
   * @param subjectFactory The factory that creates the subject used internally.
   * @deprecated Will be removed in v8. Use {@link connectable} to create a connectable observable.
   * `new ConnectableObservable(source, factory)` is equivalent to
   * `connectable(source, { connector: factory })`.
   * When the `refCount()` method is needed, the {@link share} operator should be used instead:
   * `new ConnectableObservable(source, factory).refCount()` is equivalent to
   * `source.pipe(share({ connector: factory }))`.
   * Details: https://rxjs.dev/deprecations/multicasting
   */
  constructor(public source: Observable<T>, protected subjectFactory: () => Subject<T>) {
    super();
    // If we have lift, monkey patch that here. This is done so custom observable
    // types will compose through multicast. Otherwise the resulting observable would
    // simply be an instance of `ConnectableObservable`.
    if (hasLift(source)) {
      this.lift = source.lift;
    }
  }

  /** @internal */
  protected _subscribe(subscriber: Subscriber<T>) {
    return this.getSubject().subscribe(subscriber);
  }

  protected getSubject(): Subject<T> {
    const subject = this._subject;
    if (!subject || subject.isStopped) {
      this._subject = this.subjectFactory();
    }
    return this._subject!;
  }

  protected _teardown() {
    this._refCount = 0;
    const { _connection } = this;
    this._subject = this._connection = null;
    _connection?.unsubscribe();
  }

  /**
   * @deprecated {@link ConnectableObservable} will be removed in v8. Use {@link connectable} instead.
   * Details: https://rxjs.dev/deprecations/multicasting
   */
  connect(): Subscription {
    let connection = this._connection;
    if (!connection) {
      connection = this._connection = new Subscription();
      const subject = this.getSubject();
      connection.add(
        this.source.subscribe(
          createOperatorSubscriber(
            subject as any,
            undefined,
            () => {
              this._teardown();
              subject.complete();
            },
            (err) => {
              this._teardown();
              subject.error(err);
            },
            () => this._teardown()
          )
        )
      );

      if (connection.closed) {
        this._connection = null;
        connection = Subscription.EMPTY;
      }
    }
    return connection;
  }

  /**
   * @deprecated {@link ConnectableObservable} will be removed in v8. Use the {@link share} operator instead.
   * Details: https://rxjs.dev/deprecations/multicasting
   */
  refCount(): Observable<T> {
    return higherOrderRefCount()(this) as Observable<T>;
  }
}
/* @prettier */
import { SchedulerLike } from '../types';
import { Observable } from '../Observable';
import { bindCallbackInternals } from './bindCallbackInternals';

export function bindCallback(
  callbackFunc: (...args: any[]) => void,
  resultSelector: (...args: any[]) => any,
  scheduler?: SchedulerLike
): (...args: any[]) => Observable<any>;

// args is the arguments array and we push the callback on the rest tuple since the rest parameter must be last (only item) in a parameter list
export function bindCallback<A extends readonly unknown[], R extends readonly unknown[]>(
  callbackFunc: (...args: [...A, (...res: R) => void]) => void,
  schedulerLike?: SchedulerLike
): (...arg: A) => Observable<R extends [] ? void : R extends [any] ? R[0] : R>;

/**
 * Converts a callback API to a function that returns an Observable.
 *
 * <span class="informal">Give it a function `f` of type `f(x, callback)` and
 * it will return a function `g` that when called as `g(x)` will output an
 * Observable.</span>
 *
 * `bindCallback` is not an operator because its input and output are not
 * Observables. The input is a function `func` with some parameters. The
 * last parameter must be a callback function that `func` calls when it is
 * done.
 *
 * The output of `bindCallback` is a function that takes the same parameters
 * as `func`, except the last one (the callback). When the output function
 * is called with arguments it will return an Observable. If function `func`
 * calls its callback with one argument, the Observable will emit that value.
 * If on the other hand the callback is called with multiple values the resulting
 * Observable will emit an array with said values as arguments.
 *
 * It is **very important** to remember that input function `func` is not called
 * when the output function is, but rather when the Observable returned by the output
 * function is subscribed. This means if `func` makes an AJAX request, that request
 * will be made every time someone subscribes to the resulting Observable, but not before.
 *
 * The last optional parameter - `scheduler` - can be used to control when the call
 * to `func` happens after someone subscribes to Observable, as well as when results
 * passed to callback will be emitted. By default, the subscription to an Observable calls `func`
 * synchronously, but using {@link asyncScheduler} as the last parameter will defer the call to `func`,
 * just like wrapping the call in `setTimeout` with a timeout of `0` would. If you were to use the async Scheduler
 * and call `subscribe` on the output Observable, all function calls that are currently executing
 * will end before `func` is invoked.
 *
 * By default, results passed to the callback are emitted immediately after `func` invokes the callback.
 * In particular, if the callback is called synchronously, then the subscription of the resulting Observable
 * will call the `next` function synchronously as well.  If you want to defer that call,
 * you may use {@link asyncScheduler} just as before.  This means that by using `Scheduler.async` you can
 * ensure that `func` always calls its callback asynchronously, thus avoiding terrifying Zalgo.
 *
 * Note that the Observable created by the output function will always emit a single value
 * and then complete immediately. If `func` calls the callback multiple times, values from subsequent
 * calls will not appear in the stream. If you need to listen for multiple calls,
 *  you probably want to use {@link fromEvent} or {@link fromEventPattern} instead.
 *
 * If `func` depends on some context (`this` property) and is not already bound, the context of `func`
 * will be the context that the output function has at call time. In particular, if `func`
 * is called as a method of some objec and if `func` is not already bound, in order to preserve the context
 * it is recommended that the context of the output function is set to that object as well.
 *
 * If the input function calls its callback in the "node style" (i.e. first argument to callback is
 * optional error parameter signaling whether the call failed or not), {@link bindNodeCallback}
 * provides convenient error handling and probably is a better choice.
 * `bindCallback` will treat such functions the same as any other and error parameters
 * (whether passed or not) will always be interpreted as regular callback argument.
 *
 * ## Examples
 *
 * ### Convert jQuery's getJSON to an Observable API
 * ```ts
 * import { bindCallback } from 'rxjs';
 * import * as jQuery from 'jquery';
 *
 * // Suppose we have jQuery.getJSON('/my/url', callback)
 * const getJSONAsObservable = bindCallback(jQuery.getJSON);
 * const result = getJSONAsObservable('/my/url');
 * result.subscribe(x => console.log(x), e => console.error(e));
 * ```
 *
 * ### Receive an array of arguments passed to a callback
 * ```ts
 * import { bindCallback } from 'rxjs';
 *
 * const someFunction = (cb) => {
 *   cb(5, 'some string', {someProperty: 'someValue'})
 * };
 *
 * const boundSomeFunction = bindCallback(someFunction);
 * boundSomeFunction(12, 10).subscribe(values => {
 *   console.log(values); // [22, 2]
 * });
 * ```
 *
 * ### Compare behaviour with and without async Scheduler
 * ```ts
 * import { bindCallback, asyncScheduler } from 'rxjs';
 *
 * function iCallMyCallbackSynchronously(cb) {
 *   cb();
 * }
 *
 * const boundSyncFn = bindCallback(iCallMyCallbackSynchronously);
 * const boundAsyncFn = bindCallback(iCallMyCallbackSynchronously, null, asyncScheduler);
 *
 * boundSyncFn().subscribe(() => console.log('I was sync!'));
 * boundAsyncFn().subscribe(() => console.log('I was async!'));
 * console.log('This happened...');
 *
 * // Logs:
 * // I was sync!
 * // This happened...
 * // I was async!
 * ```
 *
 * ### Use bindCallback on an object method
 * ```ts
 * import { bindCallback } from 'rxjs';
 *
 * const boundMethod = bindCallback(someObject.methodWithCallback);
 * boundMethod
 *   .call(someObject) // make sure methodWithCallback has access to someObject
 *   .subscribe(subscriber);
 * ```
 *
 * @see {@link bindNodeCallback}
 * @see {@link from}
 *
 * @param {function} func A function with a callback as the last parameter.
 * @param {SchedulerLike} [scheduler] The scheduler on which to schedule the
 * callbacks.
 * @return {function(...params: *): Observable} A function which returns the
 * Observable that delivers the same values the callback would deliver.
 */
export function bindCallback(
  callbackFunc: (...args: [...any[], (...res: any) => void]) => void,
  resultSelector?: ((...args: any[]) => any) | SchedulerLike,
  scheduler?: SchedulerLike
): (...args: any[]) => Observable<unknown> {
  return bindCallbackInternals(false, callbackFunc, resultSelector, scheduler);
}
import { SchedulerLike } from '../types';
import { isScheduler } from '../util/isScheduler';
import { Observable } from '../Observable';
import { subscribeOn } from '../operators/subscribeOn';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';
import { observeOn } from '../operators/observeOn';
import { AsyncSubject } from '../AsyncSubject';

export function bindCallbackInternals(
  isNodeStyle: boolean,
  callbackFunc: any,
  resultSelector?: any,
  scheduler?: SchedulerLike
): (...args: any[]) => Observable<unknown> {
  if (resultSelector) {
    if (isScheduler(resultSelector)) {
      scheduler = resultSelector;
    } else {
      // The user provided a result selector.
      return function (this: any, ...args: any[]) {
        return (bindCallbackInternals(isNodeStyle, callbackFunc, scheduler) as any)
          .apply(this, args)
          .pipe(mapOneOrManyArgs(resultSelector as any));
      };
    }
  }

  // If a scheduler was passed, use our `subscribeOn` and `observeOn` operators
  // to compose that behavior for the user.
  if (scheduler) {
    return function (this: any, ...args: any[]) {
      return (bindCallbackInternals(isNodeStyle, callbackFunc) as any)
        .apply(this, args)
        .pipe(subscribeOn(scheduler!), observeOn(scheduler!));
    };
  }

  return function (this: any, ...args: any[]): Observable<any> {
    // We're using AsyncSubject, because it emits when it completes,
    // and it will play the value to all late-arriving subscribers.
    const subject = new AsyncSubject<any>();

    // If this is true, then we haven't called our function yet.
    let uninitialized = true;
    return new Observable((subscriber) => {
      // Add our subscriber to the subject.
      const subs = subject.subscribe(subscriber);

      if (uninitialized) {
        uninitialized = false;
        // We're going to execute the bound function
        // This bit is to signal that we are hitting the callback asychronously.
        // Because we don't have any anti-"Zalgo" gaurantees with whatever
        // function we are handed, we use this bit to figure out whether or not
        // we are getting hit in a callback synchronously during our call.
        let isAsync = false;

        // This is used to signal that the callback completed synchronously.
        let isComplete = false;

        // Call our function that has a callback. If at any time during this
        // call, an error is thrown, it will be caught by the Observable
        // subscription process and sent to the consumer.
        callbackFunc.apply(
          // Pass the appropriate `this` context.
          this,
          [
            // Pass the arguments.
            ...args,
            // And our callback handler.
            (...results: any[]) => {
              if (isNodeStyle) {
                // If this is a node callback, shift the first value off of the
                // results and check it, as it is the error argument. By shifting,
                // we leave only the argument(s) we want to pass to the consumer.
                const err = results.shift();
                if (err != null) {
                  subject.error(err);
                  // If we've errored, we can stop processing this function
                  // as there's nothing else to do. Just return to escape.
                  return;
                }
              }
              // If we have one argument, notify the consumer
              // of it as a single value, otherwise, if there's more than one, pass
              // them as an array. Note that if there are no arguments, `undefined`
              // will be emitted.
              subject.next(1 < results.length ? results : results[0]);
              // Flip this flag, so we know we can complete it in the synchronous
              // case below.
              isComplete = true;
              // If we're not asynchronous, we need to defer the `complete` call
              // until after the call to the function is over. This is because an
              // error could be thrown in the function after it calls our callback,
              // and if that is the case, if we complete here, we are unable to notify
              // the consumer than an error occured.
              if (isAsync) {
                subject.complete();
              }
            },
          ]
        );
        // If we flipped `isComplete` during the call, we resolved synchronously,
        // notify complete, because we skipped it in the callback to wait
        // to make sure there were no errors during the call.
        if (isComplete) {
          subject.complete();
        }

        // We're no longer synchronous. If the callback is called at this point
        // we can notify complete on the spot.
        isAsync = true;
      }

      // Return the subscription fron adding our subscriber to the subject.
      return subs;
    });
  };
}
/* @prettier */
import { Observable } from '../Observable';
import { SchedulerLike } from '../types';
import { bindCallbackInternals } from './bindCallbackInternals';

export function bindNodeCallback(
  callbackFunc: (...args: any[]) => void,
  resultSelector: (...args: any[]) => any,
  scheduler?: SchedulerLike
): (...args: any[]) => Observable<any>;

// args is the arguments array and we push the callback on the rest tuple since the rest parameter must be last (only item) in a parameter list
export function bindNodeCallback<A extends readonly unknown[], R extends readonly unknown[]>(
  callbackFunc: (...args: [...A, (err: any, ...res: R) => void]) => void,
  schedulerLike?: SchedulerLike
): (...arg: A) => Observable<R extends [] ? void : R extends [any] ? R[0] : R>;

/**
 * Converts a Node.js-style callback API to a function that returns an
 * Observable.
 *
 * <span class="informal">It's just like {@link bindCallback}, but the
 * callback is expected to be of type `callback(error, result)`.</span>
 *
 * `bindNodeCallback` is not an operator because its input and output are not
 * Observables. The input is a function `func` with some parameters, but the
 * last parameter must be a callback function that `func` calls when it is
 * done. The callback function is expected to follow Node.js conventions,
 * where the first argument to the callback is an error object, signaling
 * whether call was successful. If that object is passed to callback, it means
 * something went wrong.
 *
 * The output of `bindNodeCallback` is a function that takes the same
 * parameters as `func`, except the last one (the callback). When the output
 * function is called with arguments, it will return an Observable.
 * If `func` calls its callback with error parameter present, Observable will
 * error with that value as well. If error parameter is not passed, Observable will emit
 * second parameter. If there are more parameters (third and so on),
 * Observable will emit an array with all arguments, except first error argument.
 *
 * Note that `func` will not be called at the same time output function is,
 * but rather whenever resulting Observable is subscribed. By default call to
 * `func` will happen synchronously after subscription, but that can be changed
 * with proper `scheduler` provided as optional third parameter. {@link SchedulerLike}
 * can also control when values from callback will be emitted by Observable.
 * To find out more, check out documentation for {@link bindCallback}, where
 * {@link SchedulerLike} works exactly the same.
 *
 * As in {@link bindCallback}, context (`this` property) of input function will be set to context
 * of returned function, when it is called.
 *
 * After Observable emits value, it will complete immediately. This means
 * even if `func` calls callback again, values from second and consecutive
 * calls will never appear on the stream. If you need to handle functions
 * that call callbacks multiple times, check out {@link fromEvent} or
 * {@link fromEventPattern} instead.
 *
 * Note that `bindNodeCallback` can be used in non-Node.js environments as well.
 * "Node.js-style" callbacks are just a convention, so if you write for
 * browsers or any other environment and API you use implements that callback style,
 * `bindNodeCallback` can be safely used on that API functions as well.
 *
 * Remember that Error object passed to callback does not have to be an instance
 * of JavaScript built-in `Error` object. In fact, it does not even have to an object.
 * Error parameter of callback function is interpreted as "present", when value
 * of that parameter is truthy. It could be, for example, non-zero number, non-empty
 * string or boolean `true`. In all of these cases resulting Observable would error
 * with that value. This means usually regular style callbacks will fail very often when
 * `bindNodeCallback` is used. If your Observable errors much more often then you
 * would expect, check if callback really is called in Node.js-style and, if not,
 * switch to {@link bindCallback} instead.
 *
 * Note that even if error parameter is technically present in callback, but its value
 * is falsy, it still won't appear in array emitted by Observable.
 *
 * ## Examples
 * ###  Read a file from the filesystem and get the data as an Observable
 * ```ts
 * import * as fs from 'fs';
 * const readFileAsObservable = bindNodeCallback(fs.readFile);
 * const result = readFileAsObservable('./roadNames.txt', 'utf8');
 * result.subscribe(x => console.log(x), e => console.error(e));
 * ```
 *
 * ### Use on function calling callback with multiple arguments
 * ```ts
 * someFunction((err, a, b) => {
 *   console.log(err); // null
 *   console.log(a); // 5
 *   console.log(b); // "some string"
 * });
 * const boundSomeFunction = bindNodeCallback(someFunction);
 * boundSomeFunction()
 * .subscribe(value => {
 *   console.log(value); // [5, "some string"]
 * });
 * ```
 *
 * ### Use on function calling callback in regular style
 * ```ts
 * someFunction(a => {
 *   console.log(a); // 5
 * });
 * const boundSomeFunction = bindNodeCallback(someFunction);
 * boundSomeFunction()
 * .subscribe(
 *   value => {}             // never gets called
 *   err => console.log(err) // 5
 * );
 * ```
 *
 * @see {@link bindCallback}
 * @see {@link from}
 *
 * @param {function} func Function with a Node.js-style callback as the last parameter.
 * @param {SchedulerLike} [scheduler] The scheduler on which to schedule the
 * callbacks.
 * @return {function(...params: *): Observable} A function which returns the
 * Observable that delivers the same values the Node.js callback would
 * deliver.
 */
export function bindNodeCallback(
  callbackFunc: (...args: [...any[], (err: any, ...res: any) => void]) => void,
  resultSelector?: ((...args: any[]) => any) | SchedulerLike,
  scheduler?: SchedulerLike
): (...args: any[]) => Observable<any> {
  return bindCallbackInternals(true, callbackFunc, resultSelector, scheduler);
}
import { Observable } from '../Observable';
import { ObservableInput, SchedulerLike, ObservedValueOf, ObservableInputTuple } from '../types';
import { argsArgArrayOrObject } from '../util/argsArgArrayOrObject';
import { Subscriber } from '../Subscriber';
import { from } from './from';
import { identity } from '../util/identity';
import { Subscription } from '../Subscription';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';
import { popResultSelector, popScheduler } from '../util/args';
import { createObject } from '../util/createObject';
import { createOperatorSubscriber } from '../operators/OperatorSubscriber';
import { AnyCatcher } from '../AnyCatcher';
import { executeSchedule } from '../util/executeSchedule';

// combineLatest(any)
// We put this first because we need to catch cases where the user has supplied
// _exactly `any`_ as the argument. Since `any` literally matches _anything_,
// we don't want it to randomly hit one of the other type signatures below,
// as we have no idea at build-time what type we should be returning when given an any.

/**
 * You have passed `any` here, we can't figure out if it is
 * an array or an object, so you're getting `unknown`. Use better types.
 * @param arg Something typed as `any`
 */
export function combineLatest<T extends AnyCatcher>(arg: T): Observable<unknown>;

// combineLatest([a, b, c])
export function combineLatest(sources: []): Observable<never>;
export function combineLatest<A extends readonly unknown[]>(sources: readonly [...ObservableInputTuple<A>]): Observable<A>;
/** @deprecated The `scheduler` parameter will be removed in v8. Use `scheduled` and `combineLatestAll`. Details: https://rxjs.dev/deprecations/scheduler-argument */
export function combineLatest<A extends readonly unknown[], R>(
  sources: readonly [...ObservableInputTuple<A>],
  resultSelector: (...values: A) => R,
  scheduler: SchedulerLike
): Observable<R>;
export function combineLatest<A extends readonly unknown[], R>(
  sources: readonly [...ObservableInputTuple<A>],
  resultSelector: (...values: A) => R
): Observable<R>;
/** @deprecated The `scheduler` parameter will be removed in v8. Use `scheduled` and `combineLatestAll`. Details: https://rxjs.dev/deprecations/scheduler-argument */
export function combineLatest<A extends readonly unknown[]>(
  sources: readonly [...ObservableInputTuple<A>],
  scheduler: SchedulerLike
): Observable<A>;

// combineLatest(a, b, c)
/** @deprecated Pass an array of sources instead. The rest-parameters signature will be removed in v8. Details: https://rxjs.dev/deprecations/array-argument */
export function combineLatest<A extends readonly unknown[]>(...sources: [...ObservableInputTuple<A>]): Observable<A>;
/** @deprecated The `scheduler` parameter will be removed in v8. Use `scheduled` and `combineLatestAll`. Details: https://rxjs.dev/deprecations/scheduler-argument */
export function combineLatest<A extends readonly unknown[], R>(
  ...sourcesAndResultSelectorAndScheduler: [...ObservableInputTuple<A>, (...values: A) => R, SchedulerLike]
): Observable<R>;
/** @deprecated Pass an array of sources instead. The rest-parameters signature will be removed in v8. Details: https://rxjs.dev/deprecations/array-argument */
export function combineLatest<A extends readonly unknown[], R>(
  ...sourcesAndResultSelector: [...ObservableInputTuple<A>, (...values: A) => R]
): Observable<R>;
/** @deprecated The `scheduler` parameter will be removed in v8. Use `scheduled` and `combineLatestAll`. Details: https://rxjs.dev/deprecations/scheduler-argument */
export function combineLatest<A extends readonly unknown[]>(
  ...sourcesAndScheduler: [...ObservableInputTuple<A>, SchedulerLike]
): Observable<A>;

// combineLatest({a, b, c})
export function combineLatest(sourcesObject: { [K in any]: never }): Observable<never>;
export function combineLatest<T extends Record<string, ObservableInput<any>>>(
  sourcesObject: T
): Observable<{ [K in keyof T]: ObservedValueOf<T[K]> }>;

/**
 * Combines multiple Observables to create an Observable whose values are
 * calculated from the latest values of each of its input Observables.
 *
 * <span class="informal">Whenever any input Observable emits a value, it
 * computes a formula using the latest values from all the inputs, then emits
 * the output of that formula.</span>
 *
 * ![](combineLatest.png)
 *
 * `combineLatest` combines the values from all the Observables passed in the
 * observables array. This is done by subscribing to each Observable in order and,
 * whenever any Observable emits, collecting an array of the most recent
 * values from each Observable. So if you pass `n` Observables to this operator,
 * the returned Observable will always emit an array of `n` values, in an order
 * corresponding to the order of the passed Observables (the value from the first Observable
 * will be at index 0 of the array and so on).
 *
 * Static version of `combineLatest` accepts an array of Observables. Note that an array of
 * Observables is a good choice, if you don't know beforehand how many Observables
 * you will combine. Passing an empty array will result in an Observable that
 * completes immediately.
 *
 * To ensure the output array always has the same length, `combineLatest` will
 * actually wait for all input Observables to emit at least once,
 * before it starts emitting results. This means if some Observable emits
 * values before other Observables started emitting, all these values but the last
 * will be lost. On the other hand, if some Observable does not emit a value but
 * completes, resulting Observable will complete at the same moment without
 * emitting anything, since it will now be impossible to include a value from the
 * completed Observable in the resulting array. Also, if some input Observable does
 * not emit any value and never completes, `combineLatest` will also never emit
 * and never complete, since, again, it will wait for all streams to emit some
 * value.
 *
 * If at least one Observable was passed to `combineLatest` and all passed Observables
 * emitted something, the resulting Observable will complete when all combined
 * streams complete. So even if some Observable completes, the result of
 * `combineLatest` will still emit values when other Observables do. In case
 * of a completed Observable, its value from now on will always be the last
 * emitted value. On the other hand, if any Observable errors, `combineLatest`
 * will error immediately as well, and all other Observables will be unsubscribed.
 *
 * ## Examples
 *
 * Combine two timer Observables
 *
 * ```ts
 * import { timer, combineLatest } from 'rxjs';
 *
 * const firstTimer = timer(0, 1000); // emit 0, 1, 2... after every second, starting from now
 * const secondTimer = timer(500, 1000); // emit 0, 1, 2... after every second, starting 0,5s from now
 * const combinedTimers = combineLatest([firstTimer, secondTimer]);
 * combinedTimers.subscribe(value => console.log(value));
 * // Logs
 * // [0, 0] after 0.5s
 * // [1, 0] after 1s
 * // [1, 1] after 1.5s
 * // [2, 1] after 2s
 * ```
 *
 * Combine a dictionary of Observables
 *
 * ```ts
 * import { of, delay, startWith, combineLatest } from 'rxjs';
 *
 * const observables = {
 *   a: of(1).pipe(delay(1000), startWith(0)),
 *   b: of(5).pipe(delay(5000), startWith(0)),
 *   c: of(10).pipe(delay(10000), startWith(0))
 * };
 * const combined = combineLatest(observables);
 * combined.subscribe(value => console.log(value));
 * // Logs
 * // { a: 0, b: 0, c: 0 } immediately
 * // { a: 1, b: 0, c: 0 } after 1s
 * // { a: 1, b: 5, c: 0 } after 5s
 * // { a: 1, b: 5, c: 10 } after 10s
 * ```
 *
 * Combine an array of Observables
 *
 * ```ts
 * import { of, delay, startWith, combineLatest } from 'rxjs';
 *
 * const observables = [1, 5, 10].map(
 *   n => of(n).pipe(
 *     delay(n * 1000), // emit 0 and then emit n after n seconds
 *     startWith(0)
 *   )
 * );
 * const combined = combineLatest(observables);
 * combined.subscribe(value => console.log(value));
 * // Logs
 * // [0, 0, 0] immediately
 * // [1, 0, 0] after 1s
 * // [1, 5, 0] after 5s
 * // [1, 5, 10] after 10s
 * ```
 *
 * Use map operator to dynamically calculate the Body-Mass Index
 *
 * ```ts
 * import { of, combineLatest, map } from 'rxjs';
 *
 * const weight = of(70, 72, 76, 79, 75);
 * const height = of(1.76, 1.77, 1.78);
 * const bmi = combineLatest([weight, height]).pipe(
 *   map(([w, h]) => w / (h * h)),
 * );
 * bmi.subscribe(x => console.log('BMI is ' + x));
 *
 * // With output to console:
 * // BMI is 24.212293388429753
 * // BMI is 23.93948099205209
 * // BMI is 23.671253629592222
 * ```
 *
 * @see {@link combineLatestAll}
 * @see {@link merge}
 * @see {@link withLatestFrom}
 *
 * @param {ObservableInput} [observables] An array of input Observables to combine with each other.
 * An array of Observables must be given as the first argument.
 * @param {function} [project] An optional function to project the values from
 * the combined latest values into a new value on the output Observable.
 * @param {SchedulerLike} [scheduler=null] The {@link SchedulerLike} to use for subscribing to
 * each input Observable.
 * @return {Observable} An Observable of projected values from the most recent
 * values from each input Observable, or an array of the most recent values from
 * each input Observable.
 */
export function combineLatest<O extends ObservableInput<any>, R>(...args: any[]): Observable<R> | Observable<ObservedValueOf<O>[]> {
  const scheduler = popScheduler(args);
  const resultSelector = popResultSelector(args);

  const { args: observables, keys } = argsArgArrayOrObject(args);

  if (observables.length === 0) {
    // If no observables are passed, or someone has passed an ampty array
    // of observables, or even an empty object POJO, we need to just
    // complete (EMPTY), but we have to honor the scheduler provided if any.
    return from([], scheduler as any);
  }

  const result = new Observable<ObservedValueOf<O>[]>(
    combineLatestInit(
      observables as ObservableInput<ObservedValueOf<O>>[],
      scheduler,
      keys
        ? // A handler for scrubbing the array of args into a dictionary.
          (values) => createObject(keys, values)
        : // A passthrough to just return the array
          identity
    )
  );

  return resultSelector ? (result.pipe(mapOneOrManyArgs(resultSelector)) as Observable<R>) : result;
}

export function combineLatestInit(
  observables: ObservableInput<any>[],
  scheduler?: SchedulerLike,
  valueTransform: (values: any[]) => any = identity
) {
  return (subscriber: Subscriber<any>) => {
    // The outer subscription. We're capturing this in a function
    // because we may have to schedule it.
    maybeSchedule(
      scheduler,
      () => {
        const { length } = observables;
        // A store for the values each observable has emitted so far. We match observable to value on index.
        const values = new Array(length);
        // The number of currently active subscriptions, as they complete, we decrement this number to see if
        // we are all done combining values, so we can complete the result.
        let active = length;
        // The number of inner sources that still haven't emitted the first value
        // We need to track this because all sources need to emit one value in order
        // to start emitting values.
        let remainingFirstValues = length;
        // The loop to kick off subscription. We're keying everything on index `i` to relate the observables passed
        // in to the slot in the output array or the key in the array of keys in the output dictionary.
        for (let i = 0; i < length; i++) {
          maybeSchedule(
            scheduler,
            () => {
              const source = from(observables[i], scheduler as any);
              let hasFirstValue = false;
              source.subscribe(
                createOperatorSubscriber(
                  subscriber,
                  (value) => {
                    // When we get a value, record it in our set of values.
                    values[i] = value;
                    if (!hasFirstValue) {
                      // If this is our first value, record that.
                      hasFirstValue = true;
                      remainingFirstValues--;
                    }
                    if (!remainingFirstValues) {
                      // We're not waiting for any more
                      // first values, so we can emit!
                      subscriber.next(valueTransform(values.slice()));
                    }
                  },
                  () => {
                    if (!--active) {
                      // We only complete the result if we have no more active
                      // inner observables.
                      subscriber.complete();
                    }
                  }
                )
              );
            },
            subscriber
          );
        }
      },
      subscriber
    );
  };
}

/**
 * A small utility to handle the couple of locations where we want to schedule if a scheduler was provided,
 * but we don't if there was no scheduler.
 */
function maybeSchedule(scheduler: SchedulerLike | undefined, execute: () => void, subscription: Subscription) {
  if (scheduler) {
    executeSchedule(subscription, scheduler, execute);
  } else {
    execute();
  }
}
import { Observable } from '../Observable';
import { ObservableInputTuple, SchedulerLike } from '../types';
import { concatAll } from '../operators/concatAll';
import { popScheduler } from '../util/args';
import { from } from './from';

export function concat<T extends readonly unknown[]>(...inputs: [...ObservableInputTuple<T>]): Observable<T[number]>;
export function concat<T extends readonly unknown[]>(
  ...inputsAndScheduler: [...ObservableInputTuple<T>, SchedulerLike]
): Observable<T[number]>;

/**
 * Creates an output Observable which sequentially emits all values from the first given
 * Observable and then moves on to the next.
 *
 * <span class="informal">Concatenates multiple Observables together by
 * sequentially emitting their values, one Observable after the other.</span>
 *
 * ![](concat.png)
 *
 * `concat` joins multiple Observables together, by subscribing to them one at a time and
 * merging their results into the output Observable. You can pass either an array of
 * Observables, or put them directly as arguments. Passing an empty array will result
 * in Observable that completes immediately.
 *
 * `concat` will subscribe to first input Observable and emit all its values, without
 * changing or affecting them in any way. When that Observable completes, it will
 * subscribe to then next Observable passed and, again, emit its values. This will be
 * repeated, until the operator runs out of Observables. When last input Observable completes,
 * `concat` will complete as well. At any given moment only one Observable passed to operator
 * emits values. If you would like to emit values from passed Observables concurrently, check out
 * {@link merge} instead, especially with optional `concurrent` parameter. As a matter of fact,
 * `concat` is an equivalent of `merge` operator with `concurrent` parameter set to `1`.
 *
 * Note that if some input Observable never completes, `concat` will also never complete
 * and Observables following the one that did not complete will never be subscribed. On the other
 * hand, if some Observable simply completes immediately after it is subscribed, it will be
 * invisible for `concat`, which will just move on to the next Observable.
 *
 * If any Observable in chain errors, instead of passing control to the next Observable,
 * `concat` will error immediately as well. Observables that would be subscribed after
 * the one that emitted error, never will.
 *
 * If you pass to `concat` the same Observable many times, its stream of values
 * will be "replayed" on every subscription, which means you can repeat given Observable
 * as many times as you like. If passing the same Observable to `concat` 1000 times becomes tedious,
 * you can always use {@link repeat}.
 *
 * ## Examples
 *
 * Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10
 *
 * ```ts
 * import { interval, take, range, concat } from 'rxjs';
 *
 * const timer = interval(1000).pipe(take(4));
 * const sequence = range(1, 10);
 * const result = concat(timer, sequence);
 * result.subscribe(x => console.log(x));
 *
 * // results in:
 * // 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 -immediate-> 1 ... 10
 * ```
 *
 * Concatenate 3 Observables
 *
 * ```ts
 * import { interval, take, concat } from 'rxjs';
 *
 * const timer1 = interval(1000).pipe(take(10));
 * const timer2 = interval(2000).pipe(take(6));
 * const timer3 = interval(500).pipe(take(10));
 *
 * const result = concat(timer1, timer2, timer3);
 * result.subscribe(x => console.log(x));
 *
 * // results in the following:
 * // (Prints to console sequentially)
 * // -1000ms-> 0 -1000ms-> 1 -1000ms-> ... 9
 * // -2000ms-> 0 -2000ms-> 1 -2000ms-> ... 5
 * // -500ms-> 0 -500ms-> 1 -500ms-> ... 9
 * ```
 *
 * Concatenate the same Observable to repeat it
 *
 * ```ts
 * import { interval, take, concat } from 'rxjs';
 *
 * const timer = interval(1000).pipe(take(2));
 *
 * concat(timer, timer) // concatenating the same Observable!
 *   .subscribe({
 *     next: value => console.log(value),
 *     complete: () => console.log('...and it is done!')
 *   });
 *
 * // Logs:
 * // 0 after 1s
 * // 1 after 2s
 * // 0 after 3s
 * // 1 after 4s
 * // '...and it is done!' also after 4s
 * ```
 *
 * @see {@link concatAll}
 * @see {@link concatMap}
 * @see {@link concatMapTo}
 * @see {@link startWith}
 * @see {@link endWith}
 *
 * @param args Input Observables to concatenate.
 */
export function concat(...args: any[]): Observable<unknown> {
  return concatAll()(from(args, popScheduler(args)));
}
import { Connectable, ObservableInput, SubjectLike } from '../types';
import { Subject } from '../Subject';
import { Subscription } from '../Subscription';
import { Observable } from '../Observable';
import { defer } from './defer';

export interface ConnectableConfig<T> {
  /**
   * A factory function used to create the Subject through which the source
   * is multicast. By default this creates a {@link Subject}.
   */
  connector: () => SubjectLike<T>;
  /**
   * If true, the resulting observable will reset internal state upon disconnetion
   * and return to a "cold" state. This allows the resulting observable to be
   * reconnected.
   * If false, upon disconnection, the connecting subject will remain the
   * connecting subject, meaning the resulting observable will not go "cold" again,
   * and subsequent repeats or resubscriptions will resubscribe to that same subject.
   */
  resetOnDisconnect?: boolean;
}

/**
 * The default configuration for `connectable`.
 */
const DEFAULT_CONFIG: ConnectableConfig<unknown> = {
  connector: () => new Subject<unknown>(),
  resetOnDisconnect: true,
};

/**
 * Creates an observable that multicasts once `connect()` is called on it.
 *
 * @param source The observable source to make connectable.
 * @param config The configuration object for `connectable`.
 * @returns A "connectable" observable, that has a `connect()` method, that you must call to
 * connect the source to all consumers through the subject provided as the connector.
 */
export function connectable<T>(source: ObservableInput<T>, config: ConnectableConfig<T> = DEFAULT_CONFIG): Connectable<T> {
  // The subscription representing the connection.
  let connection: Subscription | null = null;
  const { connector, resetOnDisconnect = true } = config;
  let subject = connector();

  const result: any = new Observable<T>((subscriber) => {
    return subject.subscribe(subscriber);
  });

  // Define the `connect` function. This is what users must call
  // in order to "connect" the source to the subject that is
  // multicasting it.
  result.connect = () => {
    if (!connection || connection.closed) {
      connection = defer(() => source).subscribe(subject);
      if (resetOnDisconnect) {
        connection.add(() => (subject = connector()));
      }
    }
    return connection;
  };

  return result;
}
import { Observable } from '../Observable';
import { ObservedValueOf, ObservableInput } from '../types';
import { innerFrom } from './innerFrom';

/**
 * Creates an Observable that, on subscribe, calls an Observable factory to
 * make an Observable for each new Observer.
 *
 * <span class="informal">Creates the Observable lazily, that is, only when it
 * is subscribed.
 * </span>
 *
 * ![](defer.png)
 *
 * `defer` allows you to create an Observable only when the Observer
 * subscribes. It waits until an Observer subscribes to it, calls the given
 * factory function to get an Observable -- where a factory function typically
 * generates a new Observable -- and subscribes the Observer to this Observable.
 * In case the factory function returns a falsy value, then EMPTY is used as
 * Observable instead. Last but not least, an exception during the factory
 * function call is transferred to the Observer by calling `error`.
 *
 * ## Example
 *
 * Subscribe to either an Observable of clicks or an Observable of interval, at random
 *
 * ```ts
 * import { defer, fromEvent, interval } from 'rxjs';
 *
 * const clicksOrInterval = defer(() => {
 *   return Math.random() > 0.5
 *     ? fromEvent(document, 'click')
 *     : interval(1000);
 * });
 * clicksOrInterval.subscribe(x => console.log(x));
 *
 * // Results in the following behavior:
 * // If the result of Math.random() is greater than 0.5 it will listen
 * // for clicks anywhere on the "document"; when document is clicked it
 * // will log a MouseEvent object to the console. If the result is less
 * // than 0.5 it will emit ascending numbers, one every second(1000ms).
 * ```
 *
 * @see {@link Observable}
 *
 * @param {function(): ObservableInput} observableFactory The Observable
 * factory function to invoke for each Observer that subscribes to the output
 * Observable. May also return a Promise, which will be converted on the fly
 * to an Observable.
 * @return {Observable} An Observable whose Observers' subscriptions trigger
 * an invocation of the given Observable factory function.
 */
export function defer<R extends ObservableInput<any>>(observableFactory: () => R): Observable<ObservedValueOf<R>> {
  return new Observable<ObservedValueOf<R>>((subscriber) => {
    innerFrom(observableFactory()).subscribe(subscriber);
  });
}
import { Observable } from '../Observable';
import { SchedulerLike } from '../types';

/**
 * A simple Observable that emits no items to the Observer and immediately
 * emits a complete notification.
 *
 * <span class="informal">Just emits 'complete', and nothing else.</span>
 *
 * ![](empty.png)
 *
 * A simple Observable that only emits the complete notification. It can be used
 * for composing with other Observables, such as in a {@link mergeMap}.
 *
 * ## Examples
 *
 * Log complete notification
 *
 * ```ts
 * import { EMPTY } from 'rxjs';
 *
 * EMPTY.subscribe({
 *   next: () => console.log('Next'),
 *   complete: () => console.log('Complete!')
 * });
 *
 * // Outputs
 * // Complete!
 * ```
 *
 * Emit the number 7, then complete
 *
 * ```ts
 * import { EMPTY, startWith } from 'rxjs';
 *
 * const result = EMPTY.pipe(startWith(7));
 * result.subscribe(x => console.log(x));
 *
 * // Outputs
 * // 7
 * ```
 *
 * Map and flatten only odd numbers to the sequence `'a'`, `'b'`, `'c'`
 *
 * ```ts
 * import { interval, mergeMap, of, EMPTY } from 'rxjs';
 *
 * const interval$ = interval(1000);
 * const result = interval$.pipe(
 *   mergeMap(x => x % 2 === 1 ? of('a', 'b', 'c') : EMPTY),
 * );
 * result.subscribe(x => console.log(x));
 *
 * // Results in the following to the console:
 * // x is equal to the count on the interval, e.g. (0, 1, 2, 3, ...)
 * // x will occur every 1000ms
 * // if x % 2 is equal to 1, print a, b, c (each on its own)
 * // if x % 2 is not equal to 1, nothing will be output
 * ```
 *
 * @see {@link Observable}
 * @see {@link NEVER}
 * @see {@link of}
 * @see {@link throwError}
 */
export const EMPTY = new Observable<never>((subscriber) => subscriber.complete());

/**
 * @param scheduler A {@link SchedulerLike} to use for scheduling
 * the emission of the complete notification.
 * @deprecated Replaced with the {@link EMPTY} constant or {@link scheduled} (e.g. `scheduled([], scheduler)`). Will be removed in v8.
 */
export function empty(scheduler?: SchedulerLike) {
  return scheduler ? emptyScheduled(scheduler) : EMPTY;
}

function emptyScheduled(scheduler: SchedulerLike) {
  return new Observable<never>((subscriber) => scheduler.schedule(() => subscriber.complete()));
}
import { Observable } from '../Observable';
import { ObservedValueOf, ObservableInputTuple, ObservableInput } from '../types';
import { argsArgArrayOrObject } from '../util/argsArgArrayOrObject';
import { innerFrom } from './innerFrom';
import { popResultSelector } from '../util/args';
import { createOperatorSubscriber } from '../operators/OperatorSubscriber';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';
import { createObject } from '../util/createObject';
import { AnyCatcher } from '../AnyCatcher';

// forkJoin(any)
// We put this first because we need to catch cases where the user has supplied
// _exactly `any`_ as the argument. Since `any` literally matches _anything_,
// we don't want it to randomly hit one of the other type signatures below,
// as we have no idea at build-time what type we should be returning when given an any.

/**
 * You have passed `any` here, we can't figure out if it is
 * an array or an object, so you're getting `unknown`. Use better types.
 * @param arg Something typed as `any`
 */
export function forkJoin<T extends AnyCatcher>(arg: T): Observable<unknown>;

// forkJoin(null | undefined)
export function forkJoin(scheduler: null | undefined): Observable<never>;

// forkJoin([a, b, c])
export function forkJoin(sources: readonly []): Observable<never>;
export function forkJoin<A extends readonly unknown[]>(sources: readonly [...ObservableInputTuple<A>]): Observable<A>;
export function forkJoin<A extends readonly unknown[], R>(
  sources: readonly [...ObservableInputTuple<A>],
  resultSelector: (...values: A) => R
): Observable<R>;

// forkJoin(a, b, c)
/** @deprecated Pass an array of sources instead. The rest-parameters signature will be removed in v8. Details: https://rxjs.dev/deprecations/array-argument */
export function forkJoin<A extends readonly unknown[]>(...sources: [...ObservableInputTuple<A>]): Observable<A>;
/** @deprecated Pass an array of sources instead. The rest-parameters signature will be removed in v8. Details: https://rxjs.dev/deprecations/array-argument */
export function forkJoin<A extends readonly unknown[], R>(
  ...sourcesAndResultSelector: [...ObservableInputTuple<A>, (...values: A) => R]
): Observable<R>;

// forkJoin({a, b, c})
export function forkJoin(sourcesObject: { [K in any]: never }): Observable<never>;
export function forkJoin<T extends Record<string, ObservableInput<any>>>(
  sourcesObject: T
): Observable<{ [K in keyof T]: ObservedValueOf<T[K]> }>;

/**
 * Accepts an `Array` of {@link ObservableInput} or a dictionary `Object` of {@link ObservableInput} and returns
 * an {@link Observable} that emits either an array of values in the exact same order as the passed array,
 * or a dictionary of values in the same shape as the passed dictionary.
 *
 * <span class="informal">Wait for Observables to complete and then combine last values they emitted;
 * complete immediately if an empty array is passed.</span>
 *
 * ![](forkJoin.png)
 *
 * `forkJoin` is an operator that takes any number of input observables which can be passed either as an array
 * or a dictionary of input observables. If no input observables are provided (e.g. an empty array is passed),
 * then the resulting stream will complete immediately.
 *
 * `forkJoin` will wait for all passed observables to emit and complete and then it will emit an array or an object with last
 * values from corresponding observables.
 *
 * If you pass an array of `n` observables to the operator, then the resulting
 * array will have `n` values, where the first value is the last one emitted by the first observable,
 * second value is the last one emitted by the second observable and so on.
 *
 * If you pass a dictionary of observables to the operator, then the resulting
 * objects will have the same keys as the dictionary passed, with their last values they have emitted
 * located at the corresponding key.
 *
 * That means `forkJoin` will not emit more than once and it will complete after that. If you need to emit combined
 * values not only at the end of the lifecycle of passed observables, but also throughout it, try out {@link combineLatest}
 * or {@link zip} instead.
 *
 * In order for the resulting array to have the same length as the number of input observables, whenever any of
 * the given observables completes without emitting any value, `forkJoin` will complete at that moment as well
 * and it will not emit anything either, even if it already has some last values from other observables.
 * Conversely, if there is an observable that never completes, `forkJoin` will never complete either,
 * unless at any point some other observable completes without emitting a value, which brings us back to
 * the previous case. Overall, in order for `forkJoin` to emit a value, all given observables
 * have to emit something at least once and complete.
 *
 * If any given observable errors at some point, `forkJoin` will error as well and immediately unsubscribe
 * from the other observables.
 *
 * Optionally `forkJoin` accepts a `resultSelector` function, that will be called with values which normally
 * would land in the emitted array. Whatever is returned by the `resultSelector`, will appear in the output
 * observable instead. This means that the default `resultSelector` can be thought of as a function that takes
 * all its arguments and puts them into an array. Note that the `resultSelector` will be called only
 * when `forkJoin` is supposed to emit a result.
 *
 * ## Examples
 *
 * Use `forkJoin` with a dictionary of observable inputs
 *
 * ```ts
 * import { forkJoin, of, timer } from 'rxjs';
 *
 * const observable = forkJoin({
 *   foo: of(1, 2, 3, 4),
 *   bar: Promise.resolve(8),
 *   baz: timer(4000)
 * });
 * observable.subscribe({
 *  next: value => console.log(value),
 *  complete: () => console.log('This is how it ends!'),
 * });
 *
 * // Logs:
 * // { foo: 4, bar: 8, baz: 0 } after 4 seconds
 * // 'This is how it ends!' immediately after
 * ```
 *
 * Use `forkJoin` with an array of observable inputs
 *
 * ```ts
 * import { forkJoin, of, timer } from 'rxjs';
 *
 * const observable = forkJoin([
 *   of(1, 2, 3, 4),
 *   Promise.resolve(8),
 *   timer(4000)
 * ]);
 * observable.subscribe({
 *  next: value => console.log(value),
 *  complete: () => console.log('This is how it ends!'),
 * });
 *
 * // Logs:
 * // [4, 8, 0] after 4 seconds
 * // 'This is how it ends!' immediately after
 * ```
 *
 * @see {@link combineLatest}
 * @see {@link zip}
 *
 * @param {...ObservableInput} args Any number of Observables provided either as an array or as an arguments
 * passed directly to the operator.
 * @param {function} [project] Function that takes values emitted by input Observables and returns value
 * that will appear in resulting Observable instead of default array.
 * @return {Observable} Observable emitting either an array of last values emitted by passed Observables
 * or value from project function.
 */
export function forkJoin(...args: any[]): Observable<any> {
  const resultSelector = popResultSelector(args);
  const { args: sources, keys } = argsArgArrayOrObject(args);
  const result = new Observable((subscriber) => {
    const { length } = sources;
    if (!length) {
      subscriber.complete();
      return;
    }
    const values = new Array(length);
    let remainingCompletions = length;
    let remainingEmissions = length;
    for (let sourceIndex = 0; sourceIndex < length; sourceIndex++) {
      let hasValue = false;
      innerFrom(sources[sourceIndex]).subscribe(
        createOperatorSubscriber(
          subscriber,
          (value) => {
            if (!hasValue) {
              hasValue = true;
              remainingEmissions--;
            }
            values[sourceIndex] = value;
          },
          () => remainingCompletions--,
          undefined,
          () => {
            if (!remainingCompletions || !hasValue) {
              if (!remainingEmissions) {
                subscriber.next(keys ? createObject(keys, values) : values);
              }
              subscriber.complete();
            }
          }
        )
      );
    }
  });
  return resultSelector ? result.pipe(mapOneOrManyArgs(resultSelector)) : result;
}
import { Observable } from '../Observable';
import { ObservableInput, SchedulerLike, ObservedValueOf } from '../types';
import { scheduled } from '../scheduled/scheduled';
import { innerFrom } from './innerFrom';

export function from<O extends ObservableInput<any>>(input: O): Observable<ObservedValueOf<O>>;
/** @deprecated The `scheduler` parameter will be removed in v8. Use `scheduled`. Details: https://rxjs.dev/deprecations/scheduler-argument */
export function from<O extends ObservableInput<any>>(input: O, scheduler: SchedulerLike | undefined): Observable<ObservedValueOf<O>>;

/**
 * Creates an Observable from an Array, an array-like object, a Promise, an iterable object, or an Observable-like object.
 *
 * <span class="informal">Converts almost anything to an Observable.</span>
 *
 * ![](from.png)
 *
 * `from` converts various other objects and data types into Observables. It also converts a Promise, an array-like, or an
 * <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#iterable" target="_blank">iterable</a>
 * object into an Observable that emits the items in that promise, array, or iterable. A String, in this context, is treated
 * as an array of characters. Observable-like objects (contains a function named with the ES2015 Symbol for Observable) can also be
 * converted through this operator.
 *
 * ## Examples
 *
 * Converts an array to an Observable
 *
 * ```ts
 * import { from } from 'rxjs';
 *
 * const array = [10, 20, 30];
 * const result = from(array);
 *
 * result.subscribe(x => console.log(x));
 *
 * // Logs:
 * // 10
 * // 20
 * // 30
 * ```
 *
 * Convert an infinite iterable (from a generator) to an Observable
 *
 * ```ts
 * import { from, take } from 'rxjs';
 *
 * function* generateDoubles(seed) {
 *    let i = seed;
 *    while (true) {
 *      yield i;
 *      i = 2 * i; // double it
 *    }
 * }
 *
 * const iterator = generateDoubles(3);
 * const result = from(iterator).pipe(take(10));
 *
 * result.subscribe(x => console.log(x));
 *
 * // Logs:
 * // 3
 * // 6
 * // 12
 * // 24
 * // 48
 * // 96
 * // 192
 * // 384
 * // 768
 * // 1536
 * ```
 *
 * With `asyncScheduler`
 *
 * ```ts
 * import { from, asyncScheduler } from 'rxjs';
 *
 * console.log('start');
 *
 * const array = [10, 20, 30];
 * const result = from(array, asyncScheduler);
 *
 * result.subscribe(x => console.log(x));
 *
 * console.log('end');
 *
 * // Logs:
 * // 'start'
 * // 'end'
 * // 10
 * // 20
 * // 30
 * ```
 *
 * @see {@link fromEvent}
 * @see {@link fromEventPattern}
 *
 * @param {ObservableInput<T>} A subscription object, a Promise, an Observable-like,
 * an Array, an iterable, or an array-like object to be converted.
 * @param {SchedulerLike} An optional {@link SchedulerLike} on which to schedule the emission of values.
 * @return {Observable<T>}
 */
export function from<T>(input: ObservableInput<T>, scheduler?: SchedulerLike): Observable<T> {
  return scheduler ? scheduled(input, scheduler) : innerFrom(input);
}
import { innerFrom } from '../observable/innerFrom';
import { Observable } from '../Observable';
import { mergeMap } from '../operators/mergeMap';
import { isArrayLike } from '../util/isArrayLike';
import { isFunction } from '../util/isFunction';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';

// These constants are used to create handler registry functions using array mapping below.
const nodeEventEmitterMethods = ['addListener', 'removeListener'] as const;
const eventTargetMethods = ['addEventListener', 'removeEventListener'] as const;
const jqueryMethods = ['on', 'off'] as const;

export interface NodeStyleEventEmitter {
  addListener(eventName: string | symbol, handler: NodeEventHandler): this;
  removeListener(eventName: string | symbol, handler: NodeEventHandler): this;
}

export type NodeEventHandler = (...args: any[]) => void;

// For APIs that implement `addListener` and `removeListener` methods that may
// not use the same arguments or return EventEmitter values
// such as React Native
export interface NodeCompatibleEventEmitter {
  addListener(eventName: string, handler: NodeEventHandler): void | {};
  removeListener(eventName: string, handler: NodeEventHandler): void | {};
}

// Use handler types like those in @types/jquery. See:
// https://github.com/DefinitelyTyped/DefinitelyTyped/blob/847731ba1d7fa6db6b911c0e43aa0afe596e7723/types/jquery/misc.d.ts#L6395
export interface JQueryStyleEventEmitter<TContext, T> {
  on(eventName: string, handler: (this: TContext, t: T, ...args: any[]) => any): void;
  off(eventName: string, handler: (this: TContext, t: T, ...args: any[]) => any): void;
}

export interface EventListenerObject<E> {
  handleEvent(evt: E): void;
}

export interface HasEventTargetAddRemove<E> {
  addEventListener(
    type: string,
    listener: ((evt: E) => void) | EventListenerObject<E> | null,
    options?: boolean | AddEventListenerOptions
  ): void;
  removeEventListener(
    type: string,
    listener: ((evt: E) => void) | EventListenerObject<E> | null,
    options?: EventListenerOptions | boolean
  ): void;
}

export interface EventListenerOptions {
  capture?: boolean;
  passive?: boolean;
  once?: boolean;
}

export interface AddEventListenerOptions extends EventListenerOptions {
  once?: boolean;
  passive?: boolean;
}

export function fromEvent<T>(target: HasEventTargetAddRemove<T> | ArrayLike<HasEventTargetAddRemove<T>>, eventName: string): Observable<T>;
export function fromEvent<T, R>(
  target: HasEventTargetAddRemove<T> | ArrayLike<HasEventTargetAddRemove<T>>,
  eventName: string,
  resultSelector: (event: T) => R
): Observable<R>;
export function fromEvent<T>(
  target: HasEventTargetAddRemove<T> | ArrayLike<HasEventTargetAddRemove<T>>,
  eventName: string,
  options: EventListenerOptions
): Observable<T>;
export function fromEvent<T, R>(
  target: HasEventTargetAddRemove<T> | ArrayLike<HasEventTargetAddRemove<T>>,
  eventName: string,
  options: EventListenerOptions,
  resultSelector: (event: T) => R
): Observable<R>;

export function fromEvent(target: NodeStyleEventEmitter | ArrayLike<NodeStyleEventEmitter>, eventName: string): Observable<unknown>;
/** @deprecated Do not specify explicit type parameters. Signatures with type parameters that cannot be inferred will be removed in v8. */
export function fromEvent<T>(target: NodeStyleEventEmitter | ArrayLike<NodeStyleEventEmitter>, eventName: string): Observable<T>;
export function fromEvent<R>(
  target: NodeStyleEventEmitter | ArrayLike<NodeStyleEventEmitter>,
  eventName: string,
  resultSelector: (...args: any[]) => R
): Observable<R>;

export function fromEvent(
  target: NodeCompatibleEventEmitter | ArrayLike<NodeCompatibleEventEmitter>,
  eventName: string
): Observable<unknown>;
/** @deprecated Do not specify explicit type parameters. Signatures with type parameters that cannot be inferred will be removed in v8. */
export function fromEvent<T>(target: NodeCompatibleEventEmitter | ArrayLike<NodeCompatibleEventEmitter>, eventName: string): Observable<T>;
export function fromEvent<R>(
  target: NodeCompatibleEventEmitter | ArrayLike<NodeCompatibleEventEmitter>,
  eventName: string,
  resultSelector: (...args: any[]) => R
): Observable<R>;

export function fromEvent<T>(
  target: JQueryStyleEventEmitter<any, T> | ArrayLike<JQueryStyleEventEmitter<any, T>>,
  eventName: string
): Observable<T>;
export function fromEvent<T, R>(
  target: JQueryStyleEventEmitter<any, T> | ArrayLike<JQueryStyleEventEmitter<any, T>>,
  eventName: string,
  resultSelector: (value: T, ...args: any[]) => R
): Observable<R>;

/**
 * Creates an Observable that emits events of a specific type coming from the
 * given event target.
 *
 * <span class="informal">Creates an Observable from DOM events, or Node.js
 * EventEmitter events or others.</span>
 *
 * ![](fromEvent.png)
 *
 * `fromEvent` accepts as a first argument event target, which is an object with methods
 * for registering event handler functions. As a second argument it takes string that indicates
 * type of event we want to listen for. `fromEvent` supports selected types of event targets,
 * which are described in detail below. If your event target does not match any of the ones listed,
 * you should use {@link fromEventPattern}, which can be used on arbitrary APIs.
 * When it comes to APIs supported by `fromEvent`, their methods for adding and removing event
 * handler functions have different names, but they all accept a string describing event type
 * and function itself, which will be called whenever said event happens.
 *
 * Every time resulting Observable is subscribed, event handler function will be registered
 * to event target on given event type. When that event fires, value
 * passed as a first argument to registered function will be emitted by output Observable.
 * When Observable is unsubscribed, function will be unregistered from event target.
 *
 * Note that if event target calls registered function with more than one argument, second
 * and following arguments will not appear in resulting stream. In order to get access to them,
 * you can pass to `fromEvent` optional project function, which will be called with all arguments
 * passed to event handler. Output Observable will then emit value returned by project function,
 * instead of the usual value.
 *
 * Remember that event targets listed below are checked via duck typing. It means that
 * no matter what kind of object you have and no matter what environment you work in,
 * you can safely use `fromEvent` on that object if it exposes described methods (provided
 * of course they behave as was described above). So for example if Node.js library exposes
 * event target which has the same method names as DOM EventTarget, `fromEvent` is still
 * a good choice.
 *
 * If the API you use is more callback then event handler oriented (subscribed
 * callback function fires only once and thus there is no need to manually
 * unregister it), you should use {@link bindCallback} or {@link bindNodeCallback}
 * instead.
 *
 * `fromEvent` supports following types of event targets:
 *
 * **DOM EventTarget**
 *
 * This is an object with `addEventListener` and `removeEventListener` methods.
 *
 * In the browser, `addEventListener` accepts - apart from event type string and event
 * handler function arguments - optional third parameter, which is either an object or boolean,
 * both used for additional configuration how and when passed function will be called. When
 * `fromEvent` is used with event target of that type, you can provide this values
 * as third parameter as well.
 *
 * **Node.js EventEmitter**
 *
 * An object with `addListener` and `removeListener` methods.
 *
 * **JQuery-style event target**
 *
 * An object with `on` and `off` methods
 *
 * **DOM NodeList**
 *
 * List of DOM Nodes, returned for example by `document.querySelectorAll` or `Node.childNodes`.
 *
 * Although this collection is not event target in itself, `fromEvent` will iterate over all Nodes
 * it contains and install event handler function in every of them. When returned Observable
 * is unsubscribed, function will be removed from all Nodes.
 *
 * **DOM HtmlCollection**
 *
 * Just as in case of NodeList it is a collection of DOM nodes. Here as well event handler function is
 * installed and removed in each of elements.
 *
 *
 * ## Examples
 *
 * Emit clicks happening on the DOM document
 *
 * ```ts
 * import { fromEvent } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * clicks.subscribe(x => console.log(x));
 *
 * // Results in:
 * // MouseEvent object logged to console every time a click
 * // occurs on the document.
 * ```
 *
 * Use `addEventListener` with capture option
 *
 * ```ts
 * import { fromEvent } from 'rxjs';
 *
 * const clicksInDocument = fromEvent(document, 'click', true); // note optional configuration parameter
 *                                                              // which will be passed to addEventListener
 * const clicksInDiv = fromEvent(someDivInDocument, 'click');
 *
 * clicksInDocument.subscribe(() => console.log('document'));
 * clicksInDiv.subscribe(() => console.log('div'));
 *
 * // By default events bubble UP in DOM tree, so normally
 * // when we would click on div in document
 * // "div" would be logged first and then "document".
 * // Since we specified optional `capture` option, document
 * // will catch event when it goes DOWN DOM tree, so console
 * // will log "document" and then "div".
 * ```
 *
 * @see {@link bindCallback}
 * @see {@link bindNodeCallback}
 * @see {@link fromEventPattern}
 *
 * @param {FromEventTarget<T>} target The DOM EventTarget, Node.js
 * EventEmitter, JQuery-like event target, NodeList or HTMLCollection to attach the event handler to.
 * @param {string} eventName The event name of interest, being emitted by the
 * `target`.
 * @param {EventListenerOptions} [options] Options to pass through to addEventListener
 * @return {Observable<T>}
 */
export function fromEvent<T>(
  target: any,
  eventName: string,
  options?: EventListenerOptions | ((...args: any[]) => T),
  resultSelector?: (...args: any[]) => T
): Observable<T> {
  if (isFunction(options)) {
    resultSelector = options;
    options = undefined;
  }
  if (resultSelector) {
    return fromEvent<T>(target, eventName, options as EventListenerOptions).pipe(mapOneOrManyArgs(resultSelector));
  }

  // Figure out our add and remove methods. In order to do this,
  // we are going to analyze the target in a preferred order, if
  // the target matches a given signature, we take the two "add" and "remove"
  // method names and apply them to a map to create opposite versions of the
  // same function. This is because they all operate in duplicate pairs,
  // `addListener(name, handler)`, `removeListener(name, handler)`, for example.
  // The call only differs by method name, as to whether or not you're adding or removing.
  const [add, remove] =
    // If it is an EventTarget, we need to use a slightly different method than the other two patterns.
    isEventTarget(target)
      ? eventTargetMethods.map((methodName) => (handler: any) => target[methodName](eventName, handler, options as EventListenerOptions))
      : // In all other cases, the call pattern is identical with the exception of the method names.
      isNodeStyleEventEmitter(target)
      ? nodeEventEmitterMethods.map(toCommonHandlerRegistry(target, eventName))
      : isJQueryStyleEventEmitter(target)
      ? jqueryMethods.map(toCommonHandlerRegistry(target, eventName))
      : [];

  // If add is falsy, it's because we didn't match a pattern above.
  // Check to see if it is an ArrayLike, because if it is, we want to
  // try to apply fromEvent to all of it's items. We do this check last,
  // because there are may be some types that are both ArrayLike *and* implement
  // event registry points, and we'd rather delegate to that when possible.
  if (!add) {
    if (isArrayLike(target)) {
      return mergeMap((subTarget: any) => fromEvent(subTarget, eventName, options as EventListenerOptions))(
        innerFrom(target)
      ) as Observable<T>;
    }
  }

  // If add is falsy and we made it here, it's because we didn't
  // match any valid target objects above.
  if (!add) {
    throw new TypeError('Invalid event target');
  }

  return new Observable<T>((subscriber) => {
    // The handler we are going to register. Forwards the event object, by itself, or
    // an array of arguments to the event handler, if there is more than one argument,
    // to the consumer.
    const handler = (...args: any[]) => subscriber.next(1 < args.length ? args : args[0]);
    // Do the work of adding the handler to the target.
    add(handler);
    // When we finalize, we want to remove the handler and free up memory.
    return () => remove!(handler);
  });
}

/**
 * Used to create `add` and `remove` functions to register and unregister event handlers
 * from a target in the most common handler pattern, where there are only two arguments.
 * (e.g.  `on(name, fn)`, `off(name, fn)`, `addListener(name, fn)`, or `removeListener(name, fn)`)
 * @param target The target we're calling methods on
 * @param eventName The event name for the event we're creating register or unregister functions for
 */
function toCommonHandlerRegistry(target: any, eventName: string) {
  return (methodName: string) => (handler: any) => target[methodName](eventName, handler);
}

/**
 * Checks to see if the target implements the required node-style EventEmitter methods
 * for adding and removing event handlers.
 * @param target the object to check
 */
function isNodeStyleEventEmitter(target: any): target is NodeStyleEventEmitter {
  return isFunction(target.addListener) && isFunction(target.removeListener);
}

/**
 * Checks to see if the target implements the required jQuery-style EventEmitter methods
 * for adding and removing event handlers.
 * @param target the object to check
 */
function isJQueryStyleEventEmitter(target: any): target is JQueryStyleEventEmitter<any, any> {
  return isFunction(target.on) && isFunction(target.off);
}

/**
 * Checks to see if the target implements the required EventTarget methods
 * for adding and removing event handlers.
 * @param target the object to check
 */
function isEventTarget(target: any): target is HasEventTargetAddRemove<any> {
  return isFunction(target.addEventListener) && isFunction(target.removeEventListener);
}
import { Observable } from '../Observable';
import { isFunction } from '../util/isFunction';
import { NodeEventHandler } from './fromEvent';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';

/* tslint:disable:max-line-length */
export function fromEventPattern<T>(
  addHandler: (handler: NodeEventHandler) => any,
  removeHandler?: (handler: NodeEventHandler, signal?: any) => void
): Observable<T>;
export function fromEventPattern<T>(
  addHandler: (handler: NodeEventHandler) => any,
  removeHandler?: (handler: NodeEventHandler, signal?: any) => void,
  resultSelector?: (...args: any[]) => T
): Observable<T>;
/* tslint:enable:max-line-length */

/**
 * Creates an Observable from an arbitrary API for registering event handlers.
 *
 * <span class="informal">When that method for adding event handler was something {@link fromEvent}
 * was not prepared for.</span>
 *
 * ![](fromEventPattern.png)
 *
 * `fromEventPattern` allows you to convert into an Observable any API that supports registering handler functions
 * for events. It is similar to {@link fromEvent}, but far
 * more flexible. In fact, all use cases of {@link fromEvent} could be easily handled by
 * `fromEventPattern` (although in slightly more verbose way).
 *
 * This operator accepts as a first argument an `addHandler` function, which will be injected with
 * handler parameter. That handler is actually an event handler function that you now can pass
 * to API expecting it. `addHandler` will be called whenever Observable
 * returned by the operator is subscribed, so registering handler in API will not
 * necessarily happen when `fromEventPattern` is called.
 *
 * After registration, every time an event that we listen to happens,
 * Observable returned by `fromEventPattern` will emit value that event handler
 * function was called with. Note that if event handler was called with more
 * than one argument, second and following arguments will not appear in the Observable.
 *
 * If API you are using allows to unregister event handlers as well, you can pass to `fromEventPattern`
 * another function - `removeHandler` - as a second parameter. It will be injected
 * with the same handler function as before, which now you can use to unregister
 * it from the API. `removeHandler` will be called when consumer of resulting Observable
 * unsubscribes from it.
 *
 * In some APIs unregistering is actually handled differently. Method registering an event handler
 * returns some kind of token, which is later used to identify which function should
 * be unregistered or it itself has method that unregisters event handler.
 * If that is the case with your API, make sure token returned
 * by registering method is returned by `addHandler`. Then it will be passed
 * as a second argument to `removeHandler`, where you will be able to use it.
 *
 * If you need access to all event handler parameters (not only the first one),
 * or you need to transform them in any way, you can call `fromEventPattern` with optional
 * third parameter - project function which will accept all arguments passed to
 * event handler when it is called. Whatever is returned from project function will appear on
 * resulting stream instead of usual event handlers first argument. This means
 * that default project can be thought of as function that takes its first parameter
 * and ignores the rest.
 *
 * ## Examples
 *
 * Emits clicks happening on the DOM document
 *
 * ```ts
 * import { fromEventPattern } from 'rxjs';
 *
 * function addClickHandler(handler) {
 *   document.addEventListener('click', handler);
 * }
 *
 * function removeClickHandler(handler) {
 *   document.removeEventListener('click', handler);
 * }
 *
 * const clicks = fromEventPattern(
 *   addClickHandler,
 *   removeClickHandler
 * );
 * clicks.subscribe(x => console.log(x));
 *
 * // Whenever you click anywhere in the browser, DOM MouseEvent
 * // object will be logged.
 * ```
 *
 * Use with API that returns cancellation token
 *
 * ```ts
 * import { fromEventPattern } from 'rxjs';
 *
 * const token = someAPI.registerEventHandler(function() {});
 * someAPI.unregisterEventHandler(token); // this APIs cancellation method accepts
 *                                        // not handler itself, but special token.
 *
 * const someAPIObservable = fromEventPattern(
 *   function(handler) { return someAPI.registerEventHandler(handler); }, // Note that we return the token here...
 *   function(handler, token) { someAPI.unregisterEventHandler(token); }  // ...to then use it here.
 * );
 * ```
 *
 * Use with project function
 *
 * ```ts
 * import { fromEventPattern } from 'rxjs';
 *
 * someAPI.registerEventHandler((eventType, eventMessage) => {
 *   console.log(eventType, eventMessage); // Logs 'EVENT_TYPE' 'EVENT_MESSAGE' to console.
 * });
 *
 * const someAPIObservable = fromEventPattern(
 *   handler => someAPI.registerEventHandler(handler),
 *   handler => someAPI.unregisterEventHandler(handler)
 *   (eventType, eventMessage) => eventType + ' --- ' + eventMessage // without that function only 'EVENT_TYPE'
 * );                                                                // would be emitted by the Observable
 *
 * someAPIObservable.subscribe(value => console.log(value));
 *
 * // Logs:
 * // 'EVENT_TYPE --- EVENT_MESSAGE'
 * ```
 *
 * @see {@link fromEvent}
 * @see {@link bindCallback}
 * @see {@link bindNodeCallback}
 *
 * @param {function(handler: Function): any} addHandler A function that takes
 * a `handler` function as argument and attaches it somehow to the actual
 * source of events.
 * @param {function(handler: Function, token?: any): void} [removeHandler] A function that
 * takes a `handler` function as an argument and removes it from the event source. If `addHandler`
 * returns some kind of token, `removeHandler` function will have it as a second parameter.
 * @param {function(...args: any): T} [project] A function to
 * transform results. It takes the arguments from the event handler and
 * should return a single value.
 * @return {Observable<T>} Observable which, when an event happens, emits first parameter
 * passed to registered event handler. Alternatively it emits whatever project function returns
 * at that moment.
 */
export function fromEventPattern<T>(
  addHandler: (handler: NodeEventHandler) => any,
  removeHandler?: (handler: NodeEventHandler, signal?: any) => void,
  resultSelector?: (...args: any[]) => T
): Observable<T | T[]> {
  if (resultSelector) {
    return fromEventPattern<T>(addHandler, removeHandler).pipe(mapOneOrManyArgs(resultSelector));
  }

  return new Observable<T | T[]>((subscriber) => {
    const handler = (...e: T[]) => subscriber.next(e.length === 1 ? e[0] : e);
    const retValue = addHandler(handler);
    return isFunction(removeHandler) ? () => removeHandler(handler, retValue) : undefined;
  });
}
import { Observable } from '../Observable';
import { Subscriber } from '../Subscriber';
import { Subscribable } from '../types';

/**
 * Used to convert a subscribable to an observable.
 *
 * Currently, this is only used within internals.
 *
 * TODO: Discuss ObservableInput supporting "Subscribable".
 * https://github.com/ReactiveX/rxjs/issues/5909
 *
 * @param subscribable A subscribable
 */
export function fromSubscribable<T>(subscribable: Subscribable<T>) {
  return new Observable((subscriber: Subscriber<T>) => subscribable.subscribe(subscriber));
}
import { Observable } from '../Observable';
import { identity } from '../util/identity';
import { ObservableInput, SchedulerLike } from '../types';
import { isScheduler } from '../util/isScheduler';
import { defer } from './defer';
import { scheduleIterable } from '../scheduled/scheduleIterable';

type ConditionFunc<S> = (state: S) => boolean;
type IterateFunc<S> = (state: S) => S;
type ResultFunc<S, T> = (state: S) => T;

export interface GenerateBaseOptions<S> {
  /**
   * Initial state.
   */
  initialState: S;
  /**
   * Condition function that accepts state and returns boolean.
   * When it returns false, the generator stops.
   * If not specified, a generator never stops.
   */
  condition?: ConditionFunc<S>;
  /**
   * Iterate function that accepts state and returns new state.
   */
  iterate: IterateFunc<S>;
  /**
   * SchedulerLike to use for generation process.
   * By default, a generator starts immediately.
   */
  scheduler?: SchedulerLike;
}

export interface GenerateOptions<T, S> extends GenerateBaseOptions<S> {
  /**
   * Result selection function that accepts state and returns a value to emit.
   */
  resultSelector: ResultFunc<S, T>;
}

/**
 * Generates an observable sequence by running a state-driven loop
 * producing the sequence's elements, using the specified scheduler
 * to send out observer messages.
 *
 * ![](generate.png)
 *
 * ## Examples
 *
 * Produces sequence of numbers
 *
 * ```ts
 * import { generate } from 'rxjs';
 *
 * const result = generate(0, x => x < 3, x => x + 1, x => x);
 *
 * result.subscribe(x => console.log(x));
 *
 * // Logs:
 * // 0
 * // 1
 * // 2
 * ```
 *
 * Use `asapScheduler`
 *
 * ```ts
 * import { generate, asapScheduler } from 'rxjs';
 *
 * const result = generate(1, x => x < 5, x => x * 2, x => x + 1, asapScheduler);
 *
 * result.subscribe(x => console.log(x));
 *
 * // Logs:
 * // 2
 * // 3
 * // 5
 * ```
 *
 * @see {@link from}
 * @see {@link Observable}
 *
 * @param {S} initialState Initial state.
 * @param {function (state: S): boolean} condition Condition to terminate generation (upon returning false).
 * @param {function (state: S): S} iterate Iteration step function.
 * @param {function (state: S): T} resultSelector Selector function for results produced in the sequence. (deprecated)
 * @param {SchedulerLike} [scheduler] A {@link SchedulerLike} on which to run the generator loop. If not provided, defaults to emit immediately.
 * @returns {Observable<T>} The generated sequence.
 * @deprecated Instead of passing separate arguments, use the options argument. Signatures taking separate arguments will be removed in v8.
 */
export function generate<T, S>(
  initialState: S,
  condition: ConditionFunc<S>,
  iterate: IterateFunc<S>,
  resultSelector: ResultFunc<S, T>,
  scheduler?: SchedulerLike
): Observable<T>;

/**
 * Generates an Observable by running a state-driven loop
 * that emits an element on each iteration.
 *
 * <span class="informal">Use it instead of nexting values in a for loop.</span>
 *
 * ![](generate.png)
 *
 * `generate` allows you to create a stream of values generated with a loop very similar to
 * a traditional for loop. The first argument of `generate` is a beginning value. The second argument
 * is a function that accepts this value and tests if some condition still holds. If it does,
 * then the loop continues, if not, it stops. The third value is a function which takes the
 * previously defined value and modifies it in some way on each iteration. Note how these three parameters
 * are direct equivalents of three expressions in a traditional for loop: the first expression
 * initializes some state (for example, a numeric index), the second tests if the loop can perform the next
 * iteration (for example, if the index is lower than 10) and the third states how the defined value
 * will be modified on every step (for example, the index will be incremented by one).
 *
 * Return value of a `generate` operator is an Observable that on each loop iteration
 * emits a value. First of all, the condition function is ran. If it returns true, then the Observable
 * emits the currently stored value (initial value at the first iteration) and finally updates
 * that value with iterate function. If at some point the condition returns false, then the Observable
 * completes at that moment.
 *
 * Optionally you can pass a fourth parameter to `generate` - a result selector function which allows you
 * to immediately map the value that would normally be emitted by an Observable.
 *
 * If you find three anonymous functions in `generate` call hard to read, you can provide
 * a single object to the operator instead where the object has the properties: `initialState`,
 * `condition`, `iterate` and `resultSelector`, which should have respective values that you
 * would normally pass to `generate`. `resultSelector` is still optional, but that form
 * of calling `generate` allows you to omit `condition` as well. If you omit it, that means
 * condition always holds, or in other words the resulting Observable will never complete.
 *
 * Both forms of `generate` can optionally accept a scheduler. In case of a multi-parameter call,
 * scheduler simply comes as a last argument (no matter if there is a `resultSelector`
 * function or not). In case of a single-parameter call, you can provide it as a
 * `scheduler` property on the object passed to the operator. In both cases, a scheduler decides when
 * the next iteration of the loop will happen and therefore when the next value will be emitted
 * by the Observable. For example, to ensure that each value is pushed to the Observer
 * on a separate task in the event loop, you could use the `async` scheduler. Note that
 * by default (when no scheduler is passed) values are simply emitted synchronously.
 *
 *
 * ## Examples
 *
 * Use with condition and iterate functions
 *
 * ```ts
 * import { generate } from 'rxjs';
 *
 * const result = generate(0, x => x < 3, x => x + 1);
 *
 * result.subscribe({
 *   next: value => console.log(value),
 *   complete: () => console.log('Complete!')
 * });
 *
 * // Logs:
 * // 0
 * // 1
 * // 2
 * // 'Complete!'
 * ```
 *
 * Use with condition, iterate and resultSelector functions
 *
 * ```ts
 * import { generate } from 'rxjs';
 *
 * const result = generate(0, x => x < 3, x => x + 1, x => x * 1000);
 *
 * result.subscribe({
 *   next: value => console.log(value),
 *   complete: () => console.log('Complete!')
 * });
 *
 * // Logs:
 * // 0
 * // 1000
 * // 2000
 * // 'Complete!'
 * ```
 *
 * Use with options object
 *
 * ```ts
 * import { generate } from 'rxjs';
 *
 * const result = generate({
 *   initialState: 0,
 *   condition(value) { return value < 3; },
 *   iterate(value) { return value + 1; },
 *   resultSelector(value) { return value * 1000; }
 * });
 *
 * result.subscribe({
 *   next: value => console.log(value),
 *   complete: () => console.log('Complete!')
 * });
 *
 * // Logs:
 * // 0
 * // 1000
 * // 2000
 * // 'Complete!'
 * ```
 *
 * Use options object without condition function
 *
 * ```ts
 * import { generate } from 'rxjs';
 *
 * const result = generate({
 *   initialState: 0,
 *   iterate(value) { return value + 1; },
 *   resultSelector(value) { return value * 1000; }
 * });
 *
 * result.subscribe({
 *   next: value => console.log(value),
 *   complete: () => console.log('Complete!') // This will never run
 * });
 *
 * // Logs:
 * // 0
 * // 1000
 * // 2000
 * // 3000
 * // ...and never stops.
 * ```
 *
 * @see {@link from}
 *
 * @param {S} initialState Initial state.
 * @param {function (state: S): boolean} condition Condition to terminate generation (upon returning false).
 * @param {function (state: S): S} iterate Iteration step function.
 * @param {function (state: S): T} [resultSelector] Selector function for results produced in the sequence.
 * @param {Scheduler} [scheduler] A {@link Scheduler} on which to run the generator loop. If not provided, defaults to emitting immediately.
 * @return {Observable<T>} The generated sequence.
 * @deprecated Instead of passing separate arguments, use the options argument. Signatures taking separate arguments will be removed in v8.
 */
export function generate<S>(
  initialState: S,
  condition: ConditionFunc<S>,
  iterate: IterateFunc<S>,
  scheduler?: SchedulerLike
): Observable<S>;

/**
 * Generates an observable sequence by running a state-driven loop
 * producing the sequence's elements, using the specified scheduler
 * to send out observer messages.
 * The overload accepts options object that might contain initial state, iterate,
 * condition and scheduler.
 *
 * ![](generate.png)
 *
 * ## Examples
 *
 * Use options object with condition function
 *
 * ```ts
 * import { generate } from 'rxjs';
 *
 * const result = generate({
 *   initialState: 0,
 *   condition: x => x < 3,
 *   iterate: x => x + 1
 * });
 *
 * result.subscribe({
 *   next: value => console.log(value),
 *   complete: () => console.log('Complete!')
 * });
 *
 * // Logs:
 * // 0
 * // 1
 * // 2
 * // 'Complete!'
 * ```
 *
 * @see {@link from}
 * @see {@link Observable}
 *
 * @param {GenerateBaseOptions<S>} options Object that must contain initialState, iterate and might contain condition and scheduler.
 * @returns {Observable<S>} The generated sequence.
 */
export function generate<S>(options: GenerateBaseOptions<S>): Observable<S>;

/**
 * Generates an observable sequence by running a state-driven loop
 * producing the sequence's elements, using the specified scheduler
 * to send out observer messages.
 * The overload accepts options object that might contain initial state, iterate,
 * condition, result selector and scheduler.
 *
 * ![](generate.png)
 *
 * ## Examples
 *
 * Use options object with condition and iterate function
 *
 * ```ts
 * import { generate } from 'rxjs';
 *
 * const result = generate({
 *   initialState: 0,
 *   condition: x => x < 3,
 *   iterate: x => x + 1,
 *   resultSelector: x => x
 * });
 *
 * result.subscribe({
 *   next: value => console.log(value),
 *   complete: () => console.log('Complete!')
 * });
 *
 * // Logs:
 * // 0
 * // 1
 * // 2
 * // 'Complete!'
 * ```
 *
 * @see {@link from}
 * @see {@link Observable}
 *
 * @param {GenerateOptions<T, S>} options Object that must contain initialState, iterate, resultSelector and might contain condition and scheduler.
 * @returns {Observable<T>} The generated sequence.
 */
export function generate<T, S>(options: GenerateOptions<T, S>): Observable<T>;

export function generate<T, S>(
  initialStateOrOptions: S | GenerateOptions<T, S>,
  condition?: ConditionFunc<S>,
  iterate?: IterateFunc<S>,
  resultSelectorOrScheduler?: ResultFunc<S, T> | SchedulerLike,
  scheduler?: SchedulerLike
): Observable<T> {
  let resultSelector: ResultFunc<S, T>;
  let initialState: S;

  // TODO: Remove this as we move away from deprecated signatures
  // and move towards a configuration object argument.
  if (arguments.length === 1) {
    // If we only have one argument, we can assume it is a configuration object.
    // Note that folks not using TypeScript may trip over this.
    ({
      initialState,
      condition,
      iterate,
      resultSelector = identity as ResultFunc<S, T>,
      scheduler,
    } = initialStateOrOptions as GenerateOptions<T, S>);
  } else {
    // Deprecated arguments path. Figure out what the user
    // passed and set it here.
    initialState = initialStateOrOptions as S;
    if (!resultSelectorOrScheduler || isScheduler(resultSelectorOrScheduler)) {
      resultSelector = identity as ResultFunc<S, T>;
      scheduler = resultSelectorOrScheduler as SchedulerLike;
    } else {
      resultSelector = resultSelectorOrScheduler as ResultFunc<S, T>;
    }
  }

  // The actual generator used to "generate" values.
  function* gen() {
    for (let state = initialState; !condition || condition(state); state = iterate!(state)) {
      yield resultSelector(state);
    }
  }

  // We use `defer` because we want to defer the creation of the iterator from the iterable.
  return defer(
    (scheduler
      ? // If a scheduler was provided, use `scheduleIterable` to ensure that iteration/generation
        // happens on the scheduler.
        () => scheduleIterable(gen(), scheduler!)
      : // Otherwise, if there's no scheduler, we can just use the generator function directly in
        // `defer` and executing it will return the generator (which is iterable).
        gen) as () => ObservableInput<T>
  );
}
import { Observable } from '../Observable';
import { defer } from './defer';
import { ObservableInput } from '../types';

/**
 * Checks a boolean at subscription time, and chooses between one of two observable sources
 *
 * `iif` expects a function that returns a boolean (the `condition` function), and two sources,
 * the `trueResult` and the `falseResult`, and returns an Observable.
 *
 * At the moment of subscription, the `condition` function is called. If the result is `true`, the
 * subscription will be to the source passed as the `trueResult`, otherwise, the subscription will be
 * to the source passed as the `falseResult`.
 *
 * If you need to check more than two options to choose between more than one observable, have a look at the {@link defer} creation method.
 *
 * ## Examples
 *
 * Change at runtime which Observable will be subscribed
 *
 * ```ts
 * import { iif, of } from 'rxjs';
 *
 * let subscribeToFirst;
 * const firstOrSecond = iif(
 *   () => subscribeToFirst,
 *   of('first'),
 *   of('second')
 * );
 *
 * subscribeToFirst = true;
 * firstOrSecond.subscribe(value => console.log(value));
 *
 * // Logs:
 * // 'first'
 *
 * subscribeToFirst = false;
 * firstOrSecond.subscribe(value => console.log(value));
 *
 * // Logs:
 * // 'second'
 * ```
 *
 * Control access to an Observable
 *
 * ```ts
 * import { iif, of, EMPTY } from 'rxjs';
 *
 * let accessGranted;
 * const observableIfYouHaveAccess = iif(
 *   () => accessGranted,
 *   of('It seems you have an access...'),
 *   EMPTY
 * );
 *
 * accessGranted = true;
 * observableIfYouHaveAccess.subscribe({
 *   next: value => console.log(value),
 *   complete: () => console.log('The end')
 * });
 *
 * // Logs:
 * // 'It seems you have an access...'
 * // 'The end'
 *
 * accessGranted = false;
 * observableIfYouHaveAccess.subscribe({
 *   next: value => console.log(value),
 *   complete: () => console.log('The end')
 * });
 *
 * // Logs:
 * // 'The end'
 * ```
 *
 * @see {@link defer}
 *
 * @param condition Condition which Observable should be chosen.
 * @param trueResult An Observable that will be subscribed if condition is true.
 * @param falseResult An Observable that will be subscribed if condition is false.
 * @return An observable that proxies to `trueResult` or `falseResult`, depending on the result of the `condition` function.
 */
export function iif<T, F>(condition: () => boolean, trueResult: ObservableInput<T>, falseResult: ObservableInput<F>): Observable<T | F> {
  return defer(() => (condition() ? trueResult : falseResult));
}
import { isArrayLike } from '../util/isArrayLike';
import { isPromise } from '../util/isPromise';
import { Observable } from '../Observable';
import { ObservableInput, ObservedValueOf, ReadableStreamLike } from '../types';
import { isInteropObservable } from '../util/isInteropObservable';
import { isAsyncIterable } from '../util/isAsyncIterable';
import { createInvalidObservableTypeError } from '../util/throwUnobservableError';
import { isIterable } from '../util/isIterable';
import { isReadableStreamLike, readableStreamLikeToAsyncGenerator } from '../util/isReadableStreamLike';
import { Subscriber } from '../Subscriber';
import { isFunction } from '../util/isFunction';
import { reportUnhandledError } from '../util/reportUnhandledError';
import { observable as Symbol_observable } from '../symbol/observable';

export function innerFrom<O extends ObservableInput<any>>(input: O): Observable<ObservedValueOf<O>>;
export function innerFrom<T>(input: ObservableInput<T>): Observable<T> {
  if (input instanceof Observable) {
    return input;
  }
  if (input != null) {
    if (isInteropObservable(input)) {
      return fromInteropObservable(input);
    }
    if (isArrayLike(input)) {
      return fromArrayLike(input);
    }
    if (isPromise(input)) {
      return fromPromise(input);
    }
    if (isAsyncIterable(input)) {
      return fromAsyncIterable(input);
    }
    if (isIterable(input)) {
      return fromIterable(input);
    }
    if (isReadableStreamLike(input)) {
      return fromReadableStreamLike(input);
    }
  }

  throw createInvalidObservableTypeError(input);
}

/**
 * Creates an RxJS Observable from an object that implements `Symbol.observable`.
 * @param obj An object that properly implements `Symbol.observable`.
 */
export function fromInteropObservable<T>(obj: any) {
  return new Observable((subscriber: Subscriber<T>) => {
    const obs = obj[Symbol_observable]();
    if (isFunction(obs.subscribe)) {
      return obs.subscribe(subscriber);
    }
    // Should be caught by observable subscribe function error handling.
    throw new TypeError('Provided object does not correctly implement Symbol.observable');
  });
}

/**
 * Synchronously emits the values of an array like and completes.
 * This is exported because there are creation functions and operators that need to
 * make direct use of the same logic, and there's no reason to make them run through
 * `from` conditionals because we *know* they're dealing with an array.
 * @param array The array to emit values from
 */
export function fromArrayLike<T>(array: ArrayLike<T>) {
  return new Observable((subscriber: Subscriber<T>) => {
    // Loop over the array and emit each value. Note two things here:
    // 1. We're making sure that the subscriber is not closed on each loop.
    //    This is so we don't continue looping over a very large array after
    //    something like a `take`, `takeWhile`, or other synchronous unsubscription
    //    has already unsubscribed.
    // 2. In this form, reentrant code can alter that array we're looping over.
    //    This is a known issue, but considered an edge case. The alternative would
    //    be to copy the array before executing the loop, but this has
    //    performance implications.
    for (let i = 0; i < array.length && !subscriber.closed; i++) {
      subscriber.next(array[i]);
    }
    subscriber.complete();
  });
}

export function fromPromise<T>(promise: PromiseLike<T>) {
  return new Observable((subscriber: Subscriber<T>) => {
    promise
      .then(
        (value) => {
          if (!subscriber.closed) {
            subscriber.next(value);
            subscriber.complete();
          }
        },
        (err: any) => subscriber.error(err)
      )
      .then(null, reportUnhandledError);
  });
}

export function fromIterable<T>(iterable: Iterable<T>) {
  return new Observable((subscriber: Subscriber<T>) => {
    for (const value of iterable) {
      subscriber.next(value);
      if (subscriber.closed) {
        return;
      }
    }
    subscriber.complete();
  });
}

export function fromAsyncIterable<T>(asyncIterable: AsyncIterable<T>) {
  return new Observable((subscriber: Subscriber<T>) => {
    process(asyncIterable, subscriber).catch((err) => subscriber.error(err));
  });
}

export function fromReadableStreamLike<T>(readableStream: ReadableStreamLike<T>) {
  return fromAsyncIterable(readableStreamLikeToAsyncGenerator(readableStream));
}

async function process<T>(asyncIterable: AsyncIterable<T>, subscriber: Subscriber<T>) {
  for await (const value of asyncIterable) {
    subscriber.next(value);
    // A side-effect may have closed our subscriber,
    // check before the next iteration.
    if (subscriber.closed) {
      return;
    }
  }
  subscriber.complete();
}
import { Observable } from '../Observable';
import { asyncScheduler } from '../scheduler/async';
import { SchedulerLike } from '../types';
import { timer } from './timer';

/**
 * Creates an Observable that emits sequential numbers every specified
 * interval of time, on a specified {@link SchedulerLike}.
 *
 * <span class="informal">Emits incremental numbers periodically in time.</span>
 *
 * ![](interval.png)
 *
 * `interval` returns an Observable that emits an infinite sequence of
 * ascending integers, with a constant interval of time of your choosing
 * between those emissions. The first emission is not sent immediately, but
 * only after the first period has passed. By default, this operator uses the
 * `async` {@link SchedulerLike} to provide a notion of time, but you may pass any
 * {@link SchedulerLike} to it.
 *
 * ## Example
 *
 * Emits ascending numbers, one every second (1000ms) up to the number 3
 *
 * ```ts
 * import { interval, take } from 'rxjs';
 *
 * const numbers = interval(1000);
 *
 * const takeFourNumbers = numbers.pipe(take(4));
 *
 * takeFourNumbers.subscribe(x => console.log('Next: ', x));
 *
 * // Logs:
 * // Next: 0
 * // Next: 1
 * // Next: 2
 * // Next: 3
 * ```
 *
 * @see {@link timer}
 * @see {@link delay}
 *
 * @param {number} [period=0] The interval size in milliseconds (by default)
 * or the time unit determined by the scheduler's clock.
 * @param {SchedulerLike} [scheduler=async] The {@link SchedulerLike} to use for scheduling
 * the emission of values, and providing a notion of "time".
 * @return {Observable} An Observable that emits a sequential number each time
 * interval.
 */
export function interval(period = 0, scheduler: SchedulerLike = asyncScheduler): Observable<number> {
  if (period < 0) {
    // We cannot schedule an interval in the past.
    period = 0;
  }

  return timer(period, period, scheduler);
}
import { Observable } from '../Observable';
import { ObservableInput, ObservableInputTuple, SchedulerLike } from '../types';
import { mergeAll } from '../operators/mergeAll';
import { innerFrom } from './innerFrom';
import { EMPTY } from './empty';
import { popNumber, popScheduler } from '../util/args';
import { from } from './from';

export function merge<A extends readonly unknown[]>(...sources: [...ObservableInputTuple<A>]): Observable<A[number]>;
export function merge<A extends readonly unknown[]>(...sourcesAndConcurrency: [...ObservableInputTuple<A>, number?]): Observable<A[number]>;
/** @deprecated The `scheduler` parameter will be removed in v8. Use `scheduled` and `mergeAll`. Details: https://rxjs.dev/deprecations/scheduler-argument */
export function merge<A extends readonly unknown[]>(
  ...sourcesAndScheduler: [...ObservableInputTuple<A>, SchedulerLike?]
): Observable<A[number]>;
/** @deprecated The `scheduler` parameter will be removed in v8. Use `scheduled` and `mergeAll`. Details: https://rxjs.dev/deprecations/scheduler-argument */
export function merge<A extends readonly unknown[]>(
  ...sourcesAndConcurrencyAndScheduler: [...ObservableInputTuple<A>, number?, SchedulerLike?]
): Observable<A[number]>;

/**
 * Creates an output Observable which concurrently emits all values from every
 * given input Observable.
 *
 * <span class="informal">Flattens multiple Observables together by blending
 * their values into one Observable.</span>
 *
 * ![](merge.png)
 *
 * `merge` subscribes to each given input Observable (as arguments), and simply
 * forwards (without doing any transformation) all the values from all the input
 * Observables to the output Observable. The output Observable only completes
 * once all input Observables have completed. Any error delivered by an input
 * Observable will be immediately emitted on the output Observable.
 *
 * ## Examples
 *
 * Merge together two Observables: 1s interval and clicks
 *
 * ```ts
 * import { merge, fromEvent, interval } from 'rxjs';
 *
 * const clicks = fromEvent(document, 'click');
 * const timer = interval(1000);
 * const clicksOrTimer = merge(clicks, timer);
 * clicksOrTimer.subscribe(x => console.log(x));
 *
 * // Results in the following:
 * // timer will emit ascending values, one every second(1000ms) to console
 * // clicks logs MouseEvents to console everytime the "document" is clicked
 * // Since the two streams are merged you see these happening
 * // as they occur.
 * ```
 *
 * Merge together 3 Observables, but run only 2 concurrently
 *
 * ```ts
 * import { interval, take, merge } from 'rxjs';
 *
 * const timer1 = interval(1000).pipe(take(10));
 * const timer2 = interval(2000).pipe(take(6));
 * const timer3 = interval(500).pipe(take(10));
 *
 * const concurrent = 2; // the argument
 * const merged = merge(timer1, timer2, timer3, concurrent);
 * merged.subscribe(x => console.log(x));
 *
 * // Results in the following:
 * // - First timer1 and timer2 will run concurrently
 * // - timer1 will emit a value every 1000ms for 10 iterations
 * // - timer2 will emit a value every 2000ms for 6 iterations
 * // - after timer1 hits its max iteration, timer2 will
 * //   continue, and timer3 will start to run concurrently with timer2
 * // - when timer2 hits its max iteration it terminates, and
 * //   timer3 will continue to emit a value every 500ms until it is complete
 * ```
 *
 * @see {@link mergeAll}
 * @see {@link mergeMap}
 * @see {@link mergeMapTo}
 * @see {@link mergeScan}
 *
 * @param {...ObservableInput} observables Input Observables to merge together.
 * @param {number} [concurrent=Infinity] Maximum number of input
 * Observables being subscribed to concurrently.
 * @param {SchedulerLike} [scheduler=null] The {@link SchedulerLike} to use for managing
 * concurrency of input Observables.
 * @return {Observable} an Observable that emits items that are the result of
 * every input Observable.
 */
export function merge(...args: (ObservableInput<unknown> | number | SchedulerLike)[]): Observable<unknown> {
  const scheduler = popScheduler(args);
  const concurrent = popNumber(args, Infinity);
  const sources = args as ObservableInput<unknown>[];
  return !sources.length
    ? // No source provided
      EMPTY
    : sources.length === 1
    ? // One source? Just return it.
      innerFrom(sources[0])
    : // Merge all sources
      mergeAll(concurrent)(from(sources, scheduler));
}
import { Observable } from '../Observable';
import { noop } from '../util/noop';

/**
 * An Observable that emits no items to the Observer and never completes.
 *
 * ![](never.png)
 *
 * A simple Observable that emits neither values nor errors nor the completion
 * notification. It can be used for testing purposes or for composing with other
 * Observables. Please note that by never emitting a complete notification, this
 * Observable keeps the subscription from being disposed automatically.
 * Subscriptions need to be manually disposed.
 *
 * ##  Example
 *
 * Emit the number 7, then never emit anything else (not even complete)
 *
 * ```ts
 * import { NEVER, startWith } from 'rxjs';
 *
 * const info = () => console.log('Will not be called');
 *
 * const result = NEVER.pipe(startWith(7));
 * result.subscribe({
 *   next: x => console.log(x),
 *   error: info,
 *   complete: info
 * });
 * ```
 *
 * @see {@link Observable}
 * @see {@link EMPTY}
 * @see {@link of}
 * @see {@link throwError}
 */
export const NEVER = new Observable<never>(noop);

/**
 * @deprecated Replaced with the {@link NEVER} constant. Will be removed in v8.
 */
export function never() {
  return NEVER;
}
import { SchedulerLike, ValueFromArray } from '../types';
import { Observable } from '../Observable';
import { popScheduler } from '../util/args';
import { from } from './from';

// Devs are more likely to pass null or undefined than they are a scheduler
// without accompanying values. To make things easier for (naughty) devs who
// use the `strictNullChecks: false` TypeScript compiler option, these
// overloads with explicit null and undefined values are included.

export function of(value: null): Observable<null>;
export function of(value: undefined): Observable<undefined>;

/** @deprecated The `scheduler` parameter will be removed in v8. Use `scheduled`. Details: https://rxjs.dev/deprecations/scheduler-argument */
export function of(scheduler: SchedulerLike): Observable<never>;
/** @deprecated The `scheduler` parameter will be removed in v8. Use `scheduled`. Details: https://rxjs.dev/deprecations/scheduler-argument */
export function of<A extends readonly unknown[]>(...valuesAndScheduler: [...A, SchedulerLike]): Observable<ValueFromArray<A>>;

export function of(): Observable<never>;
/** @deprecated Do not specify explicit type parameters. Signatures with type parameters that cannot be inferred will be removed in v8. */
export function of<T>(): Observable<T>;
export function of<T>(value: T): Observable<T>;
export function of<A extends readonly unknown[]>(...values: A): Observable<ValueFromArray<A>>;

/**
 * Converts the arguments to an observable sequence.
 *
 * <span class="informal">Each argument becomes a `next` notification.</span>
 *
 * ![](of.png)
 *
 * Unlike {@link from}, it does not do any flattening and emits each argument in whole
 * as a separate `next` notification.
 *
 * ## Examples
 *
 * Emit the values `10, 20, 30`
 *
 * ```ts
 * import { of } from 'rxjs';
 *
 * of(10, 20, 30)
 *   .subscribe({
 *     next: value => console.log('next:', value),
 *     error: err => console.log('error:', err),
 *     complete: () => console.log('the end'),
 *   });
 *
 * // Outputs
 * // next: 10
 * // next: 20
 * // next: 30
 * // the end
 * ```
 *
 * Emit the array `[1, 2, 3]`
 *
 * ```ts
 * import { of } from 'rxjs';
 *
 * of([1, 2, 3])
 *   .subscribe({
 *     next: value => console.log('next:', value),
 *     error: err => console.log('error:', err),
 *     complete: () => console.log('the end'),
 *   });
 *
 * // Outputs
 * // next: [1, 2, 3]
 * // the end
 * ```
 *
 * @see {@link from}
 * @see {@link range}
 *
 * @param {...T} values A comma separated list of arguments you want to be emitted
 * @return {Observable} An Observable that emits the arguments
 * described above and then completes.
 */
export function of<T>(...args: Array<T | SchedulerLike>): Observable<T> {
  const scheduler = popScheduler(args);
  return from(args as T[], scheduler);
}
import { Observable } from '../Observable';
import { ObservableInputTuple } from '../types';
import { EMPTY } from './empty';
import { onErrorResumeNext as onErrorResumeNextWith } from '../operators/onErrorResumeNext';
import { argsOrArgArray } from '../util/argsOrArgArray';

/* tslint:disable:max-line-length */
export function onErrorResumeNext<A extends readonly unknown[]>(sources: [...ObservableInputTuple<A>]): Observable<A[number]>;
export function onErrorResumeNext<A extends readonly unknown[]>(...sources: [...ObservableInputTuple<A>]): Observable<A[number]>;

/* tslint:enable:max-line-length */

/**
 * When any of the provided Observable emits a complete or an error notification, it immediately subscribes to the next one
 * that was passed.
 *
 * <span class="informal">Execute series of Observables no matter what, even if it means swallowing errors.</span>
 *
 * ![](onErrorResumeNext.png)
 *
 * `onErrorResumeNext` will subscribe to each observable source it is provided, in order.
 * If the source it's subscribed to emits an error or completes, it will move to the next source
 * without error.
 *
 * If `onErrorResumeNext` is provided no arguments, or a single, empty array, it will return {@link EMPTY}.
 *
 * `onErrorResumeNext` is basically {@link concat}, only it will continue, even if one of its
 * sources emits an error.
 *
 * Note that there is no way to handle any errors thrown by sources via the result of
 * `onErrorResumeNext`. If you want to handle errors thrown in any given source, you can
 * always use the {@link catchError} operator on them before passing them into `onErrorResumeNext`.
 *
 * ## Example
 *
 * Subscribe to the next Observable after map fails
 *
 * ```ts
 * import { onErrorResumeNext, of, map } from 'rxjs';
 *
 * onErrorResumeNext(
 *   of(1, 2, 3, 0).pipe(
 *     map(x => {
 *       if (x === 0) {
 *         throw Error();
 *       }
 *       return 10 / x;
 *     })
 *   ),
 *   of(1, 2, 3)
 * )
 * .subscribe({
 *   next: value => console.log(value),
 *   error: err => console.log(err),     // Will never be called.
 *   complete: () => console.log('done')
 * });
 *
 * // Logs:
 * // 10
 * // 5
 * // 3.3333333333333335
 * // 1
 * // 2
 * // 3
 * // 'done'
 * ```
 *
 * @see {@link concat}
 * @see {@link catchError}
 *
 * @param {...ObservableInput} sources Observables (or anything that *is* observable) passed either directly or as an array.
 * @return {Observable} An Observable that concatenates all sources, one after the other,
 * ignoring all errors, such that any error causes it to move on to the next source.
 */
export function onErrorResumeNext<A extends readonly unknown[]>(
  ...sources: [[...ObservableInputTuple<A>]] | [...ObservableInputTuple<A>]
): Observable<A[number]> {
  return onErrorResumeNextWith(argsOrArgArray(sources))(EMPTY);
}
import { Observable } from '../Observable';
import { SchedulerLike } from '../types';
import { from } from './from';

/**
 * @deprecated Use `from(Object.entries(obj))` instead. Will be removed in v8.
 */
export function pairs<T>(arr: readonly T[], scheduler?: SchedulerLike): Observable<[string, T]>;
/**
 * @deprecated Use `from(Object.entries(obj))` instead. Will be removed in v8.
 */
export function pairs<O extends Record<string, unknown>>(obj: O, scheduler?: SchedulerLike): Observable<[keyof O, O[keyof O]]>;
/**
 * @deprecated Use `from(Object.entries(obj))` instead. Will be removed in v8.
 */
export function pairs<T>(iterable: Iterable<T>, scheduler?: SchedulerLike): Observable<[string, T]>;
/**
 * @deprecated Use `from(Object.entries(obj))` instead. Will be removed in v8.
 */
export function pairs(
  n: number | bigint | boolean | ((...args: any[]) => any) | symbol,
  scheduler?: SchedulerLike
): Observable<[never, never]>;

/**
 * Convert an object into an Observable of `[key, value]` pairs.
 *
 * <span class="informal">Turn entries of an object into a stream.</span>
 *
 * ![](pairs.png)
 *
 * `pairs` takes an arbitrary object and returns an Observable that emits arrays. Each
 * emitted array has exactly two elements - the first is a key from the object
 * and the second is a value corresponding to that key. Keys are extracted from
 * an object via `Object.keys` function, which means that they will be only
 * enumerable keys that are present on an object directly - not ones inherited
 * via prototype chain.
 *
 * By default, these arrays are emitted synchronously. To change that you can
 * pass a {@link SchedulerLike} as a second argument to `pairs`.
 *
 * ## Example
 *
 * Converts an object to an Observable
 *
 * ```ts
 * import { pairs } from 'rxjs';
 *
 * const obj = {
 *   foo: 42,
 *   bar: 56,
 *   baz: 78
 * };
 *
 * pairs(obj).subscribe({
 *   next: value => console.log(value),
 *   complete: () => console.log('Complete!')
 * });
 *
 * // Logs:
 * // ['foo', 42]
 * // ['bar', 56]
 * // ['baz', 78]
 * // 'Complete!'
 * ```
 *
 * ### Object.entries required
 *
 * In IE, you will need to polyfill `Object.entries` in order to use this.
 * [MDN has a polyfill here](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries)
 *
 * @param {Object} obj The object to inspect and turn into an
 * Observable sequence.
 * @param {Scheduler} [scheduler] An optional IScheduler to schedule
 * when resulting Observable will emit values.
 * @returns {(Observable<Array<string|T>>)} An observable sequence of
 * [key, value] pairs from the object.
 * @deprecated Use `from(Object.entries(obj))` instead. Will be removed in v8.
 */
export function pairs(obj: any, scheduler?: SchedulerLike) {
  return from(Object.entries(obj), scheduler as any);
}
import { not } from '../util/not';
import { filter } from '../operators/filter';
import { ObservableInput } from '../types';
import { Observable } from '../Observable';
import { innerFrom } from './innerFrom';

/** @deprecated Use a closure instead of a `thisArg`. Signatures accepting a `thisArg` will be removed in v8. */
export function partition<T, U extends T, A>(
  source: ObservableInput<T>,
  predicate: (this: A, value: T, index: number) => value is U,
  thisArg: A
): [Observable<U>, Observable<Exclude<T, U>>];
export function partition<T, U extends T>(
  source: ObservableInput<T>,
  predicate: (value: T, index: number) => value is U
): [Observable<U>, Observable<Exclude<T, U>>];

/** @deprecated Use a closure instead of a `thisArg`. Signatures accepting a `thisArg` will be removed in v8. */
export function partition<T, A>(
  source: ObservableInput<T>,
  predicate: (this: A, value: T, index: number) => boolean,
  thisArg: A
): [Observable<T>, Observable<T>];
export function partition<T>(source: ObservableInput<T>, predicate: (value: T, index: number) => boolean): [Observable<T>, Observable<T>];

/**
 * Splits the source Observable into two, one with values that satisfy a
 * predicate, and another with values that don't satisfy the predicate.
 *
 * <span class="informal">It's like {@link filter}, but returns two Observables:
 * one like the output of {@link filter}, and the other with values that did not
 * pass the condition.</span>
 *
 * ![](partition.png)
 *
 * `partition` outputs an array with two Observables that partition the values
 * from the source Observable through the given `predicate` function. The first
 * Observable in that array emits source values for which the predicate argument
 * returns true. The second Observable emits source values for which the
 * predicate returns false. The first behaves like {@link filter} and the second
 * behaves like {@link filter} with the predicate negated.
 *
 * ## Example
 *
 * Partition a set of numbers into odds and evens observables
 *
 * ```ts
 * import { of, partition } from 'rxjs';
 *
 * const observableValues = of(1, 2, 3, 4, 5, 6);
 * const [evens$, odds$] = partition(observableValues, value => value % 2 === 0);
 *
 * odds$.subscribe(x => console.log('odds', x));
 * evens$.subscribe(x => console.log('evens', x));
 *
 * // Logs:
 * // odds 1
 * // odds 3
 * // odds 5
 * // evens 2
 * // evens 4
 * // evens 6
 * ```
 *
 * @see {@link filter}
 *
 * @param {function(value: T, index: number): boolean} predicate A function that
 * evaluates each value emitted by the source Observable. If it returns `true`,
 * the value is emitted on the first Observable in the returned array, if
 * `false` the value is emitted on the second Observable in the array. The
 * `index` parameter is the number `i` for the i-th source emission that has
 * happened since the subscription, starting from the number `0`.
 * @param {any} [thisArg] An optional argument to determine the value of `this`
 * in the `predicate` function.
 * @return {[Observable<T>, Observable<T>]} An array with two Observables: one
 * with values that passed the predicate, and another with values that did not
 * pass the predicate.
 */
export function partition<T>(
  source: ObservableInput<T>,
  predicate: (this: any, value: T, index: number) => boolean,
  thisArg?: any
): [Observable<T>, Observable<T>] {
  return [filter(predicate, thisArg)(innerFrom(source)), filter(not(predicate, thisArg))(innerFrom(source))] as [
    Observable<T>,
    Observable<T>
  ];
}
import { Observable } from '../Observable';
import { innerFrom } from './innerFrom';
import { Subscription } from '../Subscription';
import { ObservableInput, ObservableInputTuple } from '../types';
import { argsOrArgArray } from '../util/argsOrArgArray';
import { createOperatorSubscriber } from '../operators/OperatorSubscriber';
import { Subscriber } from '../Subscriber';

export function race<T extends readonly unknown[]>(inputs: [...ObservableInputTuple<T>]): Observable<T[number]>;
export function race<T extends readonly unknown[]>(...inputs: [...ObservableInputTuple<T>]): Observable<T[number]>;

/**
 * Returns an observable that mirrors the first source observable to emit an item.
 *
 * ![](race.png)
 *
 * `race` returns an observable, that when subscribed to, subscribes to all source observables immediately.
 * As soon as one of the source observables emits a value, the result unsubscribes from the other sources.
 * The resulting observable will forward all notifications, including error and completion, from the "winning"
 * source observable.
 *
 * If one of the used source observable throws an errors before a first notification
 * the race operator will also throw an error, no matter if another source observable
 * could potentially win the race.
 *
 * `race` can be useful for selecting the response from the fastest network connection for
 * HTTP or WebSockets. `race` can also be useful for switching observable context based on user
 * input.
 *
 * ## Example
 *
 * Subscribes to the observable that was the first to start emitting.
 *
 * ```ts
 * import { interval, map, race } from 'rxjs';
 *
 * const obs1 = interval(7000).pipe(map(() => 'slow one'));
 * const obs2 = interval(3000).pipe(map(() => 'fast one'));
 * const obs3 = interval(5000).pipe(map(() => 'medium one'));
 *
 * race(obs1, obs2, obs3)
 *   .subscribe(winner => console.log(winner));
 *
 * // Outputs
 * // a series of 'fast one'
 * ```
 *
 * @param {...Observables} ...observables sources used to race for which Observable emits first.
 * @return {Observable} an Observable that mirrors the output of the first Observable to emit an item.
 */
export function race<T>(...sources: (ObservableInput<T> | ObservableInput<T>[])[]): Observable<any> {
  sources = argsOrArgArray(sources);
  // If only one source was passed, just return it. Otherwise return the race.
  return sources.length === 1 ? innerFrom(sources[0] as ObservableInput<T>) : new Observable<T>(raceInit(sources as ObservableInput<T>[]));
}

/**
 * An observable initializer function for both the static version and the
 * operator version of race.
 * @param sources The sources to race
 */
export function raceInit<T>(sources: ObservableInput<T>[]) {
  return (subscriber: Subscriber<T>) => {
    let subscriptions: Subscription[] = [];

    // Subscribe to all of the sources. Note that we are checking `subscriptions` here
    // Is is an array of all actively "racing" subscriptions, and it is `null` after the
    // race has been won. So, if we have racer that synchronously "wins", this loop will
    // stop before it subscribes to any more.
    for (let i = 0; subscriptions && !subscriber.closed && i < sources.length; i++) {
      subscriptions.push(
        innerFrom(sources[i] as ObservableInput<T>).subscribe(
          createOperatorSubscriber(subscriber, (value) => {
            if (subscriptions) {
              // We're still racing, but we won! So unsubscribe
              // all other subscriptions that we have, except this one.
              for (let s = 0; s < subscriptions.length; s++) {
                s !== i && subscriptions[s].unsubscribe();
              }
              subscriptions = null!;
            }
            subscriber.next(value);
          })
        )
      );
    }
  };
}
import { SchedulerLike } from '../types';
import { Observable } from '../Observable';
import { EMPTY } from './empty';

export function range(start: number, count?: number): Observable<number>;

/**
 * @deprecated The `scheduler` parameter will be removed in v8. Use `range(start, count).pipe(observeOn(scheduler))` instead. Details: Details: https://rxjs.dev/deprecations/scheduler-argument
 */
export function range(start: number, count: number | undefined, scheduler: SchedulerLike): Observable<number>;

/**
 * Creates an Observable that emits a sequence of numbers within a specified
 * range.
 *
 * <span class="informal">Emits a sequence of numbers in a range.</span>
 *
 * ![](range.png)
 *
 * `range` operator emits a range of sequential integers, in order, where you
 * select the `start` of the range and its `length`. By default, uses no
 * {@link SchedulerLike} and just delivers the notifications synchronously, but may use
 * an optional {@link SchedulerLike} to regulate those deliveries.
 *
 * ## Example
 *
 * Produce a range of numbers
 *
 * ```ts
 * import { range } from 'rxjs';
 *
 * const numbers = range(1, 3);
 *
 * numbers.subscribe({
 *   next: value => console.log(value),
 *   complete: () => console.log('Complete!')
 * });
 *
 * // Logs:
 * // 1
 * // 2
 * // 3
 * // 'Complete!'
 * ```
 *
 * @see {@link timer}
 * @see {@link interval}
 *
 * @param {number} [start=0] The value of the first integer in the sequence.
 * @param {number} count The number of sequential integers to generate.
 * @param {SchedulerLike} [scheduler] A {@link SchedulerLike} to use for scheduling
 * the emissions of the notifications.
 * @return {Observable} An Observable of numbers that emits a finite range of
 * sequential integers.
 */
export function range(start: number, count?: number, scheduler?: SchedulerLike): Observable<number> {
  if (count == null) {
    // If one argument was passed, it's the count, not the start.
    count = start;
    start = 0;
  }

  if (count <= 0) {
    // No count? We're going nowhere. Return EMPTY.
    return EMPTY;
  }

  // Where the range should stop.
  const end = count + start;

  return new Observable(
    scheduler
      ? // The deprecated scheduled path.
        (subscriber) => {
          let n = start;
          return scheduler.schedule(function () {
            if (n < end) {
              subscriber.next(n++);
              this.schedule();
            } else {
              subscriber.complete();
            }
          });
        }
      : // Standard synchronous range.
        (subscriber) => {
          let n = start;
          while (n < end && !subscriber.closed) {
            subscriber.next(n++);
          }
          subscriber.complete();
        }
  );
}
import { Observable } from '../Observable';
import { Subscriber } from '../Subscriber';
import { SchedulerLike } from '../types';
import { isFunction } from '../util/isFunction';

/**
 * Creates an observable that will create an error instance and push it to the consumer as an error
 * immediately upon subscription.
 *
 * <span class="informal">Just errors and does nothing else</span>
 *
 * ![](throw.png)
 *
 * This creation function is useful for creating an observable that will create an error and error every
 * time it is subscribed to. Generally, inside of most operators when you might want to return an errored
 * observable, this is unnecessary. In most cases, such as in the inner return of {@link concatMap},
 * {@link mergeMap}, {@link defer}, and many others, you can simply throw the error, and RxJS will pick
 * that up and notify the consumer of the error.
 *
 * ## Example
 *
 * Create a simple observable that will create a new error with a timestamp and log it
 * and the message every time you subscribe to it
 *
 * ```ts
 * import { throwError } from 'rxjs';
 *
 * let errorCount = 0;
 *
 * const errorWithTimestamp$ = throwError(() => {
 *   const error: any = new Error(`This is error number ${ ++errorCount }`);
 *   error.timestamp = Date.now();
 *   return error;
 * });
 *
 * errorWithTimestamp$.subscribe({
 *   error: err => console.log(err.timestamp, err.message)
 * });
 *
 * errorWithTimestamp$.subscribe({
 *   error: err => console.log(err.timestamp, err.message)
 * });
 *
 * // Logs the timestamp and a new error message for each subscription
 * ```
 *
 * ### Unnecessary usage
 *
 * Using `throwError` inside of an operator or creation function
 * with a callback, is usually not necessary
 *
 * ```ts
 * import { of, concatMap, timer, throwError } from 'rxjs';
 *
 * const delays$ = of(1000, 2000, Infinity, 3000);
 *
 * delays$.pipe(
 *   concatMap(ms => {
 *     if (ms < 10000) {
 *       return timer(ms);
 *     } else {
 *       // This is probably overkill.
 *       return throwError(() => new Error(`Invalid time ${ ms }`));
 *     }
 *   })
 * )
 * .subscribe({
 *   next: console.log,
 *   error: console.error
 * });
 * ```
 *
 * You can just throw the error instead
 *
 * ```ts
 * import { of, concatMap, timer } from 'rxjs';
 *
 * const delays$ = of(1000, 2000, Infinity, 3000);
 *
 * delays$.pipe(
 *   concatMap(ms => {
 *     if (ms < 10000) {
 *       return timer(ms);
 *     } else {
 *       // Cleaner and easier to read for most folks.
 *       throw new Error(`Invalid time ${ ms }`);
 *     }
 *   })
 * )
 * .subscribe({
 *   next: console.log,
 *   error: console.error
 * });
 * ```
 *
 * @param errorFactory A factory function that will create the error instance that is pushed.
 */
export function throwError(errorFactory: () => any): Observable<never>;

/**
 * Returns an observable that will error with the specified error immediately upon subscription.
 *
 * @param error The error instance to emit
 * @deprecated Support for passing an error value will be removed in v8. Instead, pass a factory function to `throwError(() => new Error('test'))`. This is
 * because it will create the error at the moment it should be created and capture a more appropriate stack trace. If
 * for some reason you need to create the error ahead of time, you can still do that: `const err = new Error('test'); throwError(() => err);`.
 */
export function throwError(error: any): Observable<never>;

/**
 * Notifies the consumer of an error using a given scheduler by scheduling it at delay `0` upon subscription.
 *
 * @param errorOrErrorFactory An error instance or error factory
 * @param scheduler A scheduler to use to schedule the error notification
 * @deprecated The `scheduler` parameter will be removed in v8.
 * Use `throwError` in combination with {@link observeOn}: `throwError(() => new Error('test')).pipe(observeOn(scheduler));`.
 * Details: https://rxjs.dev/deprecations/scheduler-argument
 */
export function throwError(errorOrErrorFactory: any, scheduler: SchedulerLike): Observable<never>;

export function throwError(errorOrErrorFactory: any, scheduler?: SchedulerLike): Observable<never> {
  const errorFactory = isFunction(errorOrErrorFactory) ? errorOrErrorFactory : () => errorOrErrorFactory;
  const init = (subscriber: Subscriber<never>) => subscriber.error(errorFactory());
  return new Observable(scheduler ? (subscriber) => scheduler.schedule(init as any, 0, subscriber) : init);
}
import { Observable } from '../Observable';
import { SchedulerLike } from '../types';
import { async as asyncScheduler } from '../scheduler/async';
import { isScheduler } from '../util/isScheduler';
import { isValidDate } from '../util/isDate';

/**
 * Creates an observable that will wait for a specified time period, or exact date, before
 * emitting the number 0.
 *
 * <span class="informal">Used to emit a notification after a delay.</span>
 *
 * This observable is useful for creating delays in code, or racing against other values
 * for ad-hoc timeouts.
 *
 * The `delay` is specified by default in milliseconds, however providing a custom scheduler could
 * create a different behavior.
 *
 * ## Examples
 *
 * Wait 3 seconds and start another observable
 *
 * You might want to use `timer` to delay subscription to an
 * observable by a set amount of time. Here we use a timer with
 * {@link concatMapTo} or {@link concatMap} in order to wait
 * a few seconds and start a subscription to a source.
 *
 * ```ts
 * import { of, timer, concatMap } from 'rxjs';
 *
 * // This could be any observable
 * const source = of(1, 2, 3);
 *
 * timer(3000)
 *   .pipe(concatMap(() => source))
 *   .subscribe(console.log);
 * ```
 *
 * Take all values until the start of the next minute
 *
 * Using a `Date` as the trigger for the first emission, you can
 * do things like wait until midnight to fire an event, or in this case,
 * wait until a new minute starts (chosen so the example wouldn't take
 * too long to run) in order to stop watching a stream. Leveraging
 * {@link takeUntil}.
 *
 * ```ts
 * import { interval, takeUntil, timer } from 'rxjs';
 *
 * // Build a Date object that marks the
 * // next minute.
 * const currentDate = new Date();
 * const startOfNextMinute = new Date(
 *   currentDate.getFullYear(),
 *   currentDate.getMonth(),
 *   currentDate.getDate(),
 *   currentDate.getHours(),
 *   currentDate.getMinutes() + 1
 * );
 *
 * // This could be any observable stream
 * const source = interval(1000);
 *
 * const result = source.pipe(
 *   takeUntil(timer(startOfNextMinute))
 * );
 *
 * result.subscribe(console.log);
 * ```
 *
 * ### Known Limitations
 *
 * - The {@link asyncScheduler} uses `setTimeout` which has limitations for how far in the future it can be scheduled.
 *
 * - If a `scheduler` is provided that returns a timestamp other than an epoch from `now()`, and
 * a `Date` object is passed to the `dueTime` argument, the calculation for when the first emission
 * should occur will be incorrect. In this case, it would be best to do your own calculations
 * ahead of time, and pass a `number` in as the `dueTime`.
 *
 * @param due If a `number`, the amount of time in milliseconds to wait before emitting.
 * If a `Date`, the exact time at which to emit.
 * @param scheduler The scheduler to use to schedule the delay. Defaults to {@link asyncScheduler}.
 */
export function timer(due: number | Date, scheduler?: SchedulerLike): Observable<0>;

/**
 * Creates an observable that starts an interval after a specified delay, emitting incrementing numbers -- starting at `0` --
 * on each interval after words.
 *
 * The `delay` and `intervalDuration` are specified by default in milliseconds, however providing a custom scheduler could
 * create a different behavior.
 *
 * ## Example
 *
 * ### Start an interval that starts right away
 *
 * Since {@link interval} waits for the passed delay before starting,
 * sometimes that's not ideal. You may want to start an interval immediately.
 * `timer` works well for this. Here we have both side-by-side so you can
 * see them in comparison.
 *
 * Note that this observable will never complete.
 *
 * ```ts
 * import { timer, interval } from 'rxjs';
 *
 * timer(0, 1000).subscribe(n => console.log('timer', n));
 * interval(1000).subscribe(n => console.log('interval', n));
 * ```
 *
 * ### Known Limitations
 *
 * - The {@link asyncScheduler} uses `setTimeout` which has limitations for how far in the future it can be scheduled.
 *
 * - If a `scheduler` is provided that returns a timestamp other than an epoch from `now()`, and
 * a `Date` object is passed to the `dueTime` argument, the calculation for when the first emission
 * should occur will be incorrect. In this case, it would be best to do your own calculations
 * ahead of time, and pass a `number` in as the `startDue`.
 * @param startDue If a `number`, is the time to wait before starting the interval.
 * If a `Date`, is the exact time at which to start the interval.
 * @param intervalDuration The delay between each value emitted in the interval. Passing a
 * negative number here will result in immediate completion after the first value is emitted, as though
 * no `intervalDuration` was passed at all.
 * @param scheduler The scheduler to use to schedule the delay. Defaults to {@link asyncScheduler}.
 */
export function timer(startDue: number | Date, intervalDuration: number, scheduler?: SchedulerLike): Observable<number>;

/**
 * @deprecated The signature allowing `undefined` to be passed for `intervalDuration` will be removed in v8. Use the `timer(dueTime, scheduler?)` signature instead.
 */
export function timer(dueTime: number | Date, unused: undefined, scheduler?: SchedulerLike): Observable<0>;

export function timer(
  dueTime: number | Date = 0,
  intervalOrScheduler?: number | SchedulerLike,
  scheduler: SchedulerLike = asyncScheduler
): Observable<number> {
  // Since negative intervalDuration is treated as though no
  // interval was specified at all, we start with a negative number.
  let intervalDuration = -1;

  if (intervalOrScheduler != null) {
    // If we have a second argument, and it's a scheduler,
    // override the scheduler we had defaulted. Otherwise,
    // it must be an interval.
    if (isScheduler(intervalOrScheduler)) {
      scheduler = intervalOrScheduler;
    } else {
      // Note that this *could* be negative, in which case
      // it's like not passing an intervalDuration at all.
      intervalDuration = intervalOrScheduler;
    }
  }

  return new Observable((subscriber) => {
    // If a valid date is passed, calculate how long to wait before
    // executing the first value... otherwise, if it's a number just schedule
    // that many milliseconds (or scheduler-specified unit size) in the future.
    let due = isValidDate(dueTime) ? +dueTime - scheduler!.now() : dueTime;

    if (due < 0) {
      // Ensure we don't schedule in the future.
      due = 0;
    }

    // The incrementing value we emit.
    let n = 0;

    // Start the timer.
    return scheduler.schedule(function () {
      if (!subscriber.closed) {
        // Emit the next value and increment.
        subscriber.next(n++);

        if (0 <= intervalDuration) {
          // If we have a interval after the initial timer,
          // reschedule with the period.
          this.schedule(undefined, intervalDuration);
        } else {
          // We didn't have an interval. So just complete.
          subscriber.complete();
        }
      }
    }, due);
  });
}
import { Observable } from '../Observable';
import { Unsubscribable, ObservableInput, ObservedValueOf } from '../types';
import { innerFrom } from './innerFrom';
import { EMPTY } from './empty';

/**
 * Creates an Observable that uses a resource which will be disposed at the same time as the Observable.
 *
 * <span class="informal">Use it when you catch yourself cleaning up after an Observable.</span>
 *
 * `using` is a factory operator, which accepts two functions. First function returns a disposable resource.
 * It can be an arbitrary object that implements `unsubscribe` method. Second function will be injected with
 * that object and should return an Observable. That Observable can use resource object during its execution.
 * Both functions passed to `using` will be called every time someone subscribes - neither an Observable nor
 * resource object will be shared in any way between subscriptions.
 *
 * When Observable returned by `using` is subscribed, Observable returned from the second function will be subscribed
 * as well. All its notifications (nexted values, completion and error events) will be emitted unchanged by the output
 * Observable. If however someone unsubscribes from the Observable or source Observable completes or errors by itself,
 * the `unsubscribe` method on resource object will be called. This can be used to do any necessary clean up, which
 * otherwise would have to be handled by hand. Note that complete or error notifications are not emitted when someone
 * cancels subscription to an Observable via `unsubscribe`, so `using` can be used as a hook, allowing you to make
 * sure that all resources which need to exist during an Observable execution will be disposed at appropriate time.
 *
 * @see {@link defer}
 *
 * @param {function(): ISubscription} resourceFactory A function which creates any resource object
 * that implements `unsubscribe` method.
 * @param {function(resource: ISubscription): Observable<T>} observableFactory A function which
 * creates an Observable, that can use injected resource object.
 * @return {Observable<T>} An Observable that behaves the same as Observable returned by `observableFactory`, but
 * which - when completed, errored or unsubscribed - will also call `unsubscribe` on created resource object.
 */
export function using<T extends ObservableInput<any>>(
  resourceFactory: () => Unsubscribable | void,
  observableFactory: (resource: Unsubscribable | void) => T | void
): Observable<ObservedValueOf<T>> {
  return new Observable<ObservedValueOf<T>>((subscriber) => {
    const resource = resourceFactory();
    const result = observableFactory(resource);
    const source = result ? innerFrom(result) : EMPTY;
    source.subscribe(subscriber);
    return () => {
      // NOTE: Optional chaining did not work here.
      // Related TS Issue: https://github.com/microsoft/TypeScript/issues/40818
      if (resource) {
        resource.unsubscribe();
      }
    };
  });
}
import { Observable } from '../Observable';
import { ObservableInputTuple } from '../types';
import { innerFrom } from './innerFrom';
import { argsOrArgArray } from '../util/argsOrArgArray';
import { EMPTY } from './empty';
import { createOperatorSubscriber } from '../operators/OperatorSubscriber';
import { popResultSelector } from '../util/args';

export function zip<A extends readonly unknown[]>(sources: [...ObservableInputTuple<A>]): Observable<A>;
export function zip<A extends readonly unknown[], R>(
  sources: [...ObservableInputTuple<A>],
  resultSelector: (...values: A) => R
): Observable<R>;
export function zip<A extends readonly unknown[]>(...sources: [...ObservableInputTuple<A>]): Observable<A>;
export function zip<A extends readonly unknown[], R>(
  ...sourcesAndResultSelector: [...ObservableInputTuple<A>, (...values: A) => R]
): Observable<R>;

/**
 * Combines multiple Observables to create an Observable whose values are calculated from the values, in order, of each
 * of its input Observables.
 *
 * If the last parameter is a function, this function is used to compute the created value from the input values.
 * Otherwise, an array of the input values is returned.
 *
 * ## Example
 *
 * Combine age and name from different sources
 *
 * ```ts
 * import { of, zip, map } from 'rxjs';
 *
 * const age$ = of(27, 25, 29);
 * const name$ = of('Foo', 'Bar', 'Beer');
 * const isDev$ = of(true, true, false);
 *
 * zip(age$, name$, isDev$).pipe(
 *   map(([age, name, isDev]) => ({ age, name, isDev }))
 * )
 * .subscribe(x => console.log(x));
 *
 * // Outputs
 * // { age: 27, name: 'Foo', isDev: true }
 * // { age: 25, name: 'Bar', isDev: true }
 * // { age: 29, name: 'Beer', isDev: false }
 * ```
 *
 * @param sources
 * @return {Observable<R>}
 */
export function zip(...args: unknown[]): Observable<unknown> {
  const resultSelector = popResultSelector(args);

  const sources = argsOrArgArray(args) as Observable<unknown>[];

  return sources.length
    ? new Observable<unknown[]>((subscriber) => {
        // A collection of buffers of values from each source.
        // Keyed by the same index with which the sources were passed in.
        let buffers: unknown[][] = sources.map(() => []);

        // An array of flags of whether or not the sources have completed.
        // This is used to check to see if we should complete the result.
        // Keyed by the same index with which the sources were passed in.
        let completed = sources.map(() => false);

        // When everything is done, release the arrays above.
        subscriber.add(() => {
          buffers = completed = null!;
        });

        // Loop over our sources and subscribe to each one. The index `i` is
        // especially important here, because we use it in closures below to
        // access the related buffers and completion properties
        for (let sourceIndex = 0; !subscriber.closed && sourceIndex < sources.length; sourceIndex++) {
          innerFrom(sources[sourceIndex]).subscribe(
            createOperatorSubscriber(
              subscriber,
              (value) => {
                buffers[sourceIndex].push(value);
                // if every buffer has at least one value in it, then we
                // can shift out the oldest value from each buffer and emit
                // them as an array.
                if (buffers.every((buffer) => buffer.length)) {
                  const result: any = buffers.map((buffer) => buffer.shift()!);
                  // Emit the array. If theres' a result selector, use that.
                  subscriber.next(resultSelector ? resultSelector(...result) : result);
                  // If any one of the sources is both complete and has an empty buffer
                  // then we complete the result. This is because we cannot possibly have
                  // any more values to zip together.
                  if (buffers.some((buffer, i) => !buffer.length && completed[i])) {
                    subscriber.complete();
                  }
                }
              },
              () => {
                // This source completed. Mark it as complete so we can check it later
                // if we have to.
                completed[sourceIndex] = true;
                // But, if this complete source has nothing in its buffer, then we
                // can complete the result, because we can't possibly have any more
                // values from this to zip together with the other values.
                !buffers[sourceIndex].length && subscriber.complete();
              }
            )
          );
        }

        // When everything is done, release the arrays above.
        return () => {
          buffers = completed = null!;
        };
      })
    : EMPTY;
}
import { Subject, AnonymousSubject } from '../../Subject';
import { Subscriber } from '../../Subscriber';
import { Observable } from '../../Observable';
import { Subscription } from '../../Subscription';
import { Operator } from '../../Operator';
import { ReplaySubject } from '../../ReplaySubject';
import { Observer, NextObserver } from '../../types';

/**
 * WebSocketSubjectConfig is a plain Object that allows us to make our
 * webSocket configurable.
 *
 * <span class="informal">Provides flexibility to {@link webSocket}</span>
 *
 * It defines a set of properties to provide custom behavior in specific
 * moments of the socket's lifecycle. When the connection opens we can
 * use `openObserver`, when the connection is closed `closeObserver`, if we
 * are interested in listening for data coming from server: `deserializer`,
 * which allows us to customize the deserialization strategy of data before passing it
 * to the socket client. By default, `deserializer` is going to apply `JSON.parse` to each message coming
 * from the Server.
 *
 * ## Examples
 *
 * **deserializer**, the default for this property is `JSON.parse` but since there are just two options
 * for incoming data, either be text or binarydata. We can apply a custom deserialization strategy
 * or just simply skip the default behaviour.
 *
 * ```ts
 * import { webSocket } from 'rxjs/webSocket';
 *
 * const wsSubject = webSocket({
 *   url: 'ws://localhost:8081',
 *   //Apply any transformation of your choice.
 *   deserializer: ({ data }) => data
 * });
 *
 * wsSubject.subscribe(console.log);
 *
 * // Let's suppose we have this on the Server: ws.send('This is a msg from the server')
 * //output
 * //
 * // This is a msg from the server
 * ```
 *
 * **serializer** allows us to apply custom serialization strategy but for the outgoing messages.
 *
 * ```ts
 * import { webSocket } from 'rxjs/webSocket';
 *
 * const wsSubject = webSocket({
 *   url: 'ws://localhost:8081',
 *   // Apply any transformation of your choice.
 *   serializer: msg => JSON.stringify({ channel: 'webDevelopment', msg: msg })
 * });
 *
 * wsSubject.subscribe(() => subject.next('msg to the server'));
 *
 * // Let's suppose we have this on the Server:
 * //   ws.on('message', msg => console.log);
 * //   ws.send('This is a msg from the server');
 * // output at server side:
 * //
 * // {"channel":"webDevelopment","msg":"msg to the server"}
 * ```
 *
 * **closeObserver** allows us to set a custom error when an error raises up.
 *
 * ```ts
 * import { webSocket } from 'rxjs/webSocket';
 *
 * const wsSubject = webSocket({
 *   url: 'ws://localhost:8081',
 *   closeObserver: {
 *     next() {
 *       const customError = { code: 6666, reason: 'Custom evil reason' }
 *       console.log(`code: ${ customError.code }, reason: ${ customError.reason }`);
 *     }
 *   }
 * });
 *
 * // output
 * // code: 6666, reason: Custom evil reason
 * ```
 *
 * **openObserver**, Let's say we need to make some kind of init task before sending/receiving msgs to the
 * webSocket or sending notification that the connection was successful, this is when
 * openObserver is useful for.
 *
 * ```ts
 * import { webSocket } from 'rxjs/webSocket';
 *
 * const wsSubject = webSocket({
 *   url: 'ws://localhost:8081',
 *   openObserver: {
 *     next: () => {
 *       console.log('Connection ok');
 *     }
 *   }
 * });
 *
 * // output
 * // Connection ok
 * ```
 */
export interface WebSocketSubjectConfig<T> {
  /** The url of the socket server to connect to */
  url: string;
  /** The protocol to use to connect */
  protocol?: string | Array<string>;
  /** @deprecated Will be removed in v8. Use {@link deserializer} instead. */
  resultSelector?: (e: MessageEvent) => T;
  /**
   * A serializer used to create messages from passed values before the
   * messages are sent to the server. Defaults to JSON.stringify.
   */
  serializer?: (value: T) => WebSocketMessage;
  /**
   * A deserializer used for messages arriving on the socket from the
   * server. Defaults to JSON.parse.
   */
  deserializer?: (e: MessageEvent) => T;
  /**
   * An Observer that watches when open events occur on the underlying web socket.
   */
  openObserver?: NextObserver<Event>;
  /**
   * An Observer that watches when close events occur on the underlying web socket
   */
  closeObserver?: NextObserver<CloseEvent>;
  /**
   * An Observer that watches when a close is about to occur due to
   * unsubscription.
   */
  closingObserver?: NextObserver<void>;
  /**
   * A WebSocket constructor to use. This is useful for situations like using a
   * WebSocket impl in Node (WebSocket is a DOM API), or for mocking a WebSocket
   * for testing purposes
   */
  WebSocketCtor?: { new (url: string, protocols?: string | string[]): WebSocket };
  /** Sets the `binaryType` property of the underlying WebSocket. */
  binaryType?: 'blob' | 'arraybuffer';
}

const DEFAULT_WEBSOCKET_CONFIG: WebSocketSubjectConfig<any> = {
  url: '',
  deserializer: (e: MessageEvent) => JSON.parse(e.data),
  serializer: (value: any) => JSON.stringify(value),
};

const WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT =
  'WebSocketSubject.error must be called with an object with an error code, and an optional reason: { code: number, reason: string }';

export type WebSocketMessage = string | ArrayBuffer | Blob | ArrayBufferView;

export class WebSocketSubject<T> extends AnonymousSubject<T> {
  // @ts-ignore: Property has no initializer and is not definitely assigned
  private _config: WebSocketSubjectConfig<T>;

  /** @internal */
  // @ts-ignore: Property has no initializer and is not definitely assigned
  _output: Subject<T>;

  private _socket: WebSocket | null = null;

  constructor(urlConfigOrSource: string | WebSocketSubjectConfig<T> | Observable<T>, destination?: Observer<T>) {
    super();
    if (urlConfigOrSource instanceof Observable) {
      this.destination = destination;
      this.source = urlConfigOrSource as Observable<T>;
    } else {
      const config = (this._config = { ...DEFAULT_WEBSOCKET_CONFIG });
      this._output = new Subject<T>();
      if (typeof urlConfigOrSource === 'string') {
        config.url = urlConfigOrSource;
      } else {
        for (const key in urlConfigOrSource) {
          if (urlConfigOrSource.hasOwnProperty(key)) {
            (config as any)[key] = (urlConfigOrSource as any)[key];
          }
        }
      }

      if (!config.WebSocketCtor && WebSocket) {
        config.WebSocketCtor = WebSocket;
      } else if (!config.WebSocketCtor) {
        throw new Error('no WebSocket constructor can be found');
      }
      this.destination = new ReplaySubject();
    }
  }

  /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */
  lift<R>(operator: Operator<T, R>): WebSocketSubject<R> {
    const sock = new WebSocketSubject<R>(this._config as WebSocketSubjectConfig<any>, this.destination as any);
    sock.operator = operator;
    sock.source = this;
    return sock;
  }

  private _resetState() {
    this._socket = null;
    if (!this.source) {
      this.destination = new ReplaySubject();
    }
    this._output = new Subject<T>();
  }

  /**
   * Creates an {@link Observable}, that when subscribed to, sends a message,
   * defined by the `subMsg` function, to the server over the socket to begin a
   * subscription to data over that socket. Once data arrives, the
   * `messageFilter` argument will be used to select the appropriate data for
   * the resulting Observable. When finalization occurs, either due to
   * unsubscription, completion, or error, a message defined by the `unsubMsg`
   * argument will be sent to the server over the WebSocketSubject.
   *
   * @param subMsg A function to generate the subscription message to be sent to
   * the server. This will still be processed by the serializer in the
   * WebSocketSubject's config. (Which defaults to JSON serialization)
   * @param unsubMsg A function to generate the unsubscription message to be
   * sent to the server at finalization. This will still be processed by the
   * serializer in the WebSocketSubject's config.
   * @param messageFilter A predicate for selecting the appropriate messages
   * from the server for the output stream.
   */
  multiplex(subMsg: () => any, unsubMsg: () => any, messageFilter: (value: T) => boolean) {
    const self = this;
    return new Observable((observer: Observer<T>) => {
      try {
        self.next(subMsg());
      } catch (err) {
        observer.error(err);
      }

      const subscription = self.subscribe({
        next: (x) => {
          try {
            if (messageFilter(x)) {
              observer.next(x);
            }
          } catch (err) {
            observer.error(err);
          }
        },
        error: (err) => observer.error(err),
        complete: () => observer.complete(),
      });

      return () => {
        try {
          self.next(unsubMsg());
        } catch (err) {
          observer.error(err);
        }
        subscription.unsubscribe();
      };
    });
  }

  private _connectSocket() {
    const { WebSocketCtor, protocol, url, binaryType } = this._config;
    const observer = this._output;

    let socket: WebSocket | null = null;
    try {
      socket = protocol ? new WebSocketCtor!(url, protocol) : new WebSocketCtor!(url);
      this._socket = socket;
      if (binaryType) {
        this._socket.binaryType = binaryType;
      }
    } catch (e) {
      observer.error(e);
      return;
    }

    const subscription = new Subscription(() => {
      this._socket = null;
      if (socket && socket.readyState === 1) {
        socket.close();
      }
    });

    socket.onopen = (evt: Event) => {
      const { _socket } = this;
      if (!_socket) {
        socket!.close();
        this._resetState();
        return;
      }
      const { openObserver } = this._config;
      if (openObserver) {
        openObserver.next(evt);
      }

      const queue = this.destination;

      this.destination = Subscriber.create<T>(
        (x) => {
          if (socket!.readyState === 1) {
            try {
              const { serializer } = this._config;
              socket!.send(serializer!(x!));
            } catch (e) {
              this.destination!.error(e);
            }
          }
        },
        (err) => {
          const { closingObserver } = this._config;
          if (closingObserver) {
            closingObserver.next(undefined);
          }
          if (err && err.code) {
            socket!.close(err.code, err.reason);
          } else {
            observer.error(new TypeError(WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT));
          }
          this._resetState();
        },
        () => {
          const { closingObserver } = this._config;
          if (closingObserver) {
            closingObserver.next(undefined);
          }
          socket!.close();
          this._resetState();
        }
      ) as Subscriber<any>;

      if (queue && queue instanceof ReplaySubject) {
        subscription.add((queue as ReplaySubject<T>).subscribe(this.destination));
      }
    };

    socket.onerror = (e: Event) => {
      this._resetState();
      observer.error(e);
    };

    socket.onclose = (e: CloseEvent) => {
      if (socket === this._socket) {
        this._resetState();
      }
      const { closeObserver } = this._config;
      if (closeObserver) {
        closeObserver.next(e);
      }
      if (e.wasClean) {
        observer.complete();
      } else {
        observer.error(e);
      }
    };

    socket.onmessage = (e: MessageEvent) => {
      try {
        const { deserializer } = this._config;
        observer.next(deserializer!(e));
      } catch (err) {
        observer.error(err);
      }
    };
  }

  /** @internal */
  protected _subscribe(subscriber: Subscriber<T>): Subscription {
    const { source } = this;
    if (source) {
      return source.subscribe(subscriber);
    }
    if (!this._socket) {
      this._connectSocket();
    }
    this._output.subscribe(subscriber);
    subscriber.add(() => {
      const { _socket } = this;
      if (this._output.observers.length === 0) {
        if (_socket && (_socket.readyState === 1 || _socket.readyState === 0)) {
          _socket.close();
        }
        this._resetState();
      }
    });
    return subscriber;
  }

  unsubscribe() {
    const { _socket } = this;
    if (_socket && (_socket.readyState === 1 || _socket.readyState === 0)) {
      _socket.close();
    }
    this._resetState();
    super.unsubscribe();
  }
}
import { Observable } from '../../Observable';
import { Subscription } from '../../Subscription';
import { TimestampProvider } from '../../types';
import { performanceTimestampProvider } from '../../scheduler/performanceTimestampProvider';
import { animationFrameProvider } from '../../scheduler/animationFrameProvider';

/**
 * An observable of animation frames
 *
 * Emits the amount of time elapsed since subscription and the timestamp on each animation frame.
 * Defaults to milliseconds provided to the requestAnimationFrame's callback. Does not end on its own.
 *
 * Every subscription will start a separate animation loop. Since animation frames are always scheduled
 * by the browser to occur directly before a repaint, scheduling more than one animation frame synchronously
 * should not be much different or have more overhead than looping over an array of events during
 * a single animation frame. However, if for some reason the developer would like to ensure the
 * execution of animation-related handlers are all executed during the same task by the engine,
 * the `share` operator can be used.
 *
 * This is useful for setting up animations with RxJS.
 *
 * ## Examples
 *
 * Tweening a div to move it on the screen
 *
 * ```ts
 * import { animationFrames, map, takeWhile, endWith } from 'rxjs';
 *
 * function tween(start: number, end: number, duration: number) {
 *   const diff = end - start;
 *   return animationFrames().pipe(
 *     // Figure out what percentage of time has passed
 *     map(({ elapsed }) => elapsed / duration),
 *     // Take the vector while less than 100%
 *     takeWhile(v => v < 1),
 *     // Finish with 100%
 *     endWith(1),
 *     // Calculate the distance traveled between start and end
 *     map(v => v * diff + start)
 *   );
 * }
 *
 * // Setup a div for us to move around
 * const div = document.createElement('div');
 * document.body.appendChild(div);
 * div.style.position = 'absolute';
 * div.style.width = '40px';
 * div.style.height = '40px';
 * div.style.backgroundColor = 'lime';
 * div.style.transform = 'translate3d(10px, 0, 0)';
 *
 * tween(10, 200, 4000).subscribe(x => {
 *   div.style.transform = `translate3d(${ x }px, 0, 0)`;
 * });
 * ```
 *
 * Providing a custom timestamp provider
 *
 * ```ts
 * import { animationFrames, TimestampProvider } from 'rxjs';
 *
 * // A custom timestamp provider
 * let now = 0;
 * const customTSProvider: TimestampProvider = {
 *   now() { return now++; }
 * };
 *
 * const source$ = animationFrames(customTSProvider);
 *
 * // Log increasing numbers 0...1...2... on every animation frame.
 * source$.subscribe(({ elapsed }) => console.log(elapsed));
 * ```
 *
 * @param timestampProvider An object with a `now` method that provides a numeric timestamp
 */
export function animationFrames(timestampProvider?: TimestampProvider) {
  return timestampProvider ? animationFramesFactory(timestampProvider) : DEFAULT_ANIMATION_FRAMES;
}

/**
 * Does the work of creating the observable for `animationFrames`.
 * @param timestampProvider The timestamp provider to use to create the observable
 */
function animationFramesFactory(timestampProvider?: TimestampProvider) {
  const { schedule } = animationFrameProvider;
  return new Observable<{ timestamp: number; elapsed: number }>((subscriber) => {
    const subscription = new Subscription();
    // If no timestamp provider is specified, use performance.now() - as it
    // will return timestamps 'compatible' with those passed to the run
    // callback and won't be affected by NTP adjustments, etc.
    const provider = timestampProvider || performanceTimestampProvider;
    // Capture the start time upon subscription, as the run callback can remain
    // queued for a considerable period of time and the elapsed time should
    // represent the time elapsed since subscription - not the time since the
    // first rendered animation frame.
    const start = provider.now();
    const run = (timestamp: DOMHighResTimeStamp | number) => {
      // Use the provider's timestamp to calculate the elapsed time. Note that
      // this means - if the caller hasn't passed a provider - that
      // performance.now() will be used instead of the timestamp that was
      // passed to the run callback. The reason for this is that the timestamp
      // passed to the callback can be earlier than the start time, as it
      // represents the time at which the browser decided it would render any
      // queued frames - and that time can be earlier the captured start time.
      const now = provider.now();
      subscriber.next({
        timestamp: timestampProvider ? now : timestamp,
        elapsed: now - start,
      });
      if (!subscriber.closed) {
        subscription.add(schedule(run));
      }
    };
    subscription.add(schedule(run));
    return subscription;
  });
}

/**
 * In the common case, where the timestamp provided by the rAF API is used,
 * we use this shared observable to reduce overhead.
 */
const DEFAULT_ANIMATION_FRAMES = animationFramesFactory();
import { createOperatorSubscriber } from '../../operators/OperatorSubscriber';
import { Observable } from '../../Observable';
import { innerFrom } from '../../observable/innerFrom';
import { ObservableInput } from '../../types';

export function fromFetch<T>(
  input: string | Request,
  init: RequestInit & {
    selector: (response: Response) => ObservableInput<T>;
  }
): Observable<T>;

export function fromFetch(input: string | Request, init?: RequestInit): Observable<Response>;

/**
 * Uses [the Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) to
 * make an HTTP request.
 *
 * **WARNING** Parts of the fetch API are still experimental. `AbortController` is
 * required for this implementation to work and use cancellation appropriately.
 *
 * Will automatically set up an internal [AbortController](https://developer.mozilla.org/en-US/docs/Web/API/AbortController)
 * in order to finalize the internal `fetch` when the subscription tears down.
 *
 * If a `signal` is provided via the `init` argument, it will behave like it usually does with
 * `fetch`. If the provided `signal` aborts, the error that `fetch` normally rejects with
 * in that scenario will be emitted as an error from the observable.
 *
 * ## Examples
 *
 * Basic use
 *
 * ```ts
 * import { fromFetch } from 'rxjs/fetch';
 * import { switchMap, of, catchError } from 'rxjs';
 *
 * const data$ = fromFetch('https://api.github.com/users?per_page=5').pipe(
 *   switchMap(response => {
 *     if (response.ok) {
 *       // OK return data
 *       return response.json();
 *     } else {
 *       // Server is returning a status requiring the client to try something else.
 *       return of({ error: true, message: `Error ${ response.status }` });
 *     }
 *   }),
 *   catchError(err => {
 *     // Network or other error, handle appropriately
 *     console.error(err);
 *     return of({ error: true, message: err.message })
 *   })
 * );
 *
 * data$.subscribe({
 *   next: result => console.log(result),
 *   complete: () => console.log('done')
 * });
 * ```
 *
 * ### Use with Chunked Transfer Encoding
 *
 * With HTTP responses that use [chunked transfer encoding](https://tools.ietf.org/html/rfc7230#section-3.3.1),
 * the promise returned by `fetch` will resolve as soon as the response's headers are
 * received.
 *
 * That means the `fromFetch` observable will emit a `Response` - and will
 * then complete - before the body is received. When one of the methods on the
 * `Response` - like `text()` or `json()` - is called, the returned promise will not
 * resolve until the entire body has been received. Unsubscribing from any observable
 * that uses the promise as an observable input will not abort the request.
 *
 * To facilitate aborting the retrieval of responses that use chunked transfer encoding,
 * a `selector` can be specified via the `init` parameter:
 *
 * ```ts
 * import { of } from 'rxjs';
 * import { fromFetch } from 'rxjs/fetch';
 *
 * const data$ = fromFetch('https://api.github.com/users?per_page=5', {
 *   selector: response => response.json()
 * });
 *
 * data$.subscribe({
 *   next: result => console.log(result),
 *   complete: () => console.log('done')
 * });
 * ```
 *
 * @param input The resource you would like to fetch. Can be a url or a request object.
 * @param initWithSelector A configuration object for the fetch.
 * [See MDN for more details](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)
 * @returns An Observable, that when subscribed to, performs an HTTP request using the native `fetch`
 * function. The {@link Subscription} is tied to an `AbortController` for the fetch.
 */
export function fromFetch<T>(
  input: string | Request,
  initWithSelector: RequestInit & {
    selector?: (response: Response) => ObservableInput<T>;
  } = {}
): Observable<Response | T> {
  const { selector, ...init } = initWithSelector;
  return new Observable<Response | T>((subscriber) => {
    // Our controller for aborting this fetch.
    // Any externally provided AbortSignal will have to call
    // abort on this controller when signaled, because the
    // signal from this controller is what is being passed to `fetch`.
    const controller = new AbortController();
    const { signal } = controller;
    // This flag exists to make sure we don't `abort()` the fetch upon tearing down
    // this observable after emitting a Response. Aborting in such circumstances
    // would also abort subsequent methods - like `json()` - that could be called
    // on the Response. Consider: `fromFetch().pipe(take(1), mergeMap(res => res.json()))`
    let abortable = true;

    // If the user provided an init configuration object,
    // let's process it and chain our abort signals, if necessary.
    // If a signal is provided, just have it finalized. It's a cancellation token, basically.
    const { signal: outerSignal } = init;
    if (outerSignal) {
      if (outerSignal.aborted) {
        controller.abort();
      } else {
        // We got an AbortSignal from the arguments passed into `fromFetch`.
        // We need to wire up our AbortController to abort when this signal aborts.
        const outerSignalHandler = () => {
          if (!signal.aborted) {
            controller.abort();
          }
        };
        outerSignal.addEventListener('abort', outerSignalHandler);
        subscriber.add(() => outerSignal.removeEventListener('abort', outerSignalHandler));
      }
    }

    // The initialization object passed to `fetch` as the second
    // argument. This ferries in important information, including our
    // AbortSignal. Create a new init, so we don't accidentally mutate the
    // passed init, or reassign it. This is because the init passed in
    // is shared between each subscription to the result.
    const perSubscriberInit: RequestInit = { ...init, signal };

    const handleError = (err: any) => {
      abortable = false;
      subscriber.error(err);
    };

    fetch(input, perSubscriberInit)
      .then((response) => {
        if (selector) {
          // If we have a selector function, use it to project our response.
          // Note that any error that comes from our selector will be
          // sent to the promise `catch` below and handled.
          innerFrom(selector(response)).subscribe(
            createOperatorSubscriber(
              subscriber,
              // Values are passed through to the subscriber
              undefined,
              // The projected response is complete.
              () => {
                abortable = false;
                subscriber.complete();
              },
              handleError
            )
          );
        } else {
          abortable = false;
          subscriber.next(response);
          subscriber.complete();
        }
      })
      .catch(handleError);

    return () => {
      if (abortable) {
        controller.abort();
      }
    };
  });
}
import { WebSocketSubject, WebSocketSubjectConfig } from './WebSocketSubject';

/**
 * Wrapper around the w3c-compatible WebSocket object provided by the browser.
 *
 * <span class="informal">{@link Subject} that communicates with a server via WebSocket</span>
 *
 * `webSocket` is a factory function that produces a `WebSocketSubject`,
 * which can be used to make WebSocket connection with an arbitrary endpoint.
 * `webSocket` accepts as an argument either a string with url of WebSocket endpoint, or an
 * {@link WebSocketSubjectConfig} object for providing additional configuration, as
 * well as Observers for tracking lifecycle of WebSocket connection.
 *
 * When `WebSocketSubject` is subscribed, it attempts to make a socket connection,
 * unless there is one made already. This means that many subscribers will always listen
 * on the same socket, thus saving resources. If however, two instances are made of `WebSocketSubject`,
 * even if these two were provided with the same url, they will attempt to make separate
 * connections. When consumer of a `WebSocketSubject` unsubscribes, socket connection is closed,
 * only if there are no more subscribers still listening. If after some time a consumer starts
 * subscribing again, connection is reestablished.
 *
 * Once connection is made, whenever a new message comes from the server, `WebSocketSubject` will emit that
 * message as a value in the stream. By default, a message from the socket is parsed via `JSON.parse`. If you
 * want to customize how deserialization is handled (if at all), you can provide custom `resultSelector`
 * function in {@link WebSocketSubject}. When connection closes, stream will complete, provided it happened without
 * any errors. If at any point (starting, maintaining or closing a connection) there is an error,
 * stream will also error with whatever WebSocket API has thrown.
 *
 * By virtue of being a {@link Subject}, `WebSocketSubject` allows for receiving and sending messages from the server. In order
 * to communicate with a connected endpoint, use `next`, `error` and `complete` methods. `next` sends a value to the server, so bear in mind
 * that this value will not be serialized beforehand. Because of This, `JSON.stringify` will have to be called on a value by hand,
 * before calling `next` with a result. Note also that if at the moment of nexting value
 * there is no socket connection (for example no one is subscribing), those values will be buffered, and sent when connection
 * is finally established. `complete` method closes socket connection. `error` does the same,
 * as well as notifying the server that something went wrong via status code and string with details of what happened.
 * Since status code is required in WebSocket API, `WebSocketSubject` does not allow, like regular `Subject`,
 * arbitrary values being passed to the `error` method. It needs to be called with an object that has `code`
 * property with status code number and optional `reason` property with string describing details
 * of an error.
 *
 * Calling `next` does not affect subscribers of `WebSocketSubject` - they have no
 * information that something was sent to the server (unless of course the server
 * responds somehow to a message). On the other hand, since calling `complete` triggers
 * an attempt to close socket connection. If that connection is closed without any errors, stream will
 * complete, thus notifying all subscribers. And since calling `error` closes
 * socket connection as well, just with a different status code for the server, if closing itself proceeds
 * without errors, subscribed Observable will not error, as one might expect, but complete as usual. In both cases
 * (calling `complete` or `error`), if process of closing socket connection results in some errors, *then* stream
 * will error.
 *
 * **Multiplexing**
 *
 * `WebSocketSubject` has an additional operator, not found in other Subjects. It is called `multiplex` and it is
 * used to simulate opening several socket connections, while in reality maintaining only one.
 * For example, an application has both chat panel and real-time notifications about sport news. Since these are two distinct functions,
 * it would make sense to have two separate connections for each. Perhaps there could even be two separate services with WebSocket
 * endpoints, running on separate machines with only GUI combining them together. Having a socket connection
 * for each functionality could become too resource expensive. It is a common pattern to have single
 * WebSocket endpoint that acts as a gateway for the other services (in this case chat and sport news services).
 * Even though there is a single connection in a client app, having the ability to manipulate streams as if it
 * were two separate sockets is desirable. This eliminates manually registering and unregistering in a gateway for
 * given service and filter out messages of interest. This is exactly what `multiplex` method is for.
 *
 * Method accepts three parameters. First two are functions returning subscription and unsubscription messages
 * respectively. These are messages that will be sent to the server, whenever consumer of resulting Observable
 * subscribes and unsubscribes. Server can use them to verify that some kind of messages should start or stop
 * being forwarded to the client. In case of the above example application, after getting subscription message with proper identifier,
 * gateway server can decide that it should connect to real sport news service and start forwarding messages from it.
 * Note that both messages will be sent as returned by the functions, they are by default serialized using JSON.stringify, just
 * as messages pushed via `next`. Also bear in mind that these messages will be sent on *every* subscription and
 * unsubscription. This is potentially dangerous, because one consumer of an Observable may unsubscribe and the server
 * might stop sending messages, since it got unsubscription message. This needs to be handled
 * on the server or using {@link publish} on a Observable returned from 'multiplex'.
 *
 * Last argument to `multiplex` is a `messageFilter` function which should return a boolean. It is used to filter out messages
 * sent by the server to only those that belong to simulated WebSocket stream. For example, server might mark these
 * messages with some kind of string identifier on a message object and `messageFilter` would return `true`
 * if there is such identifier on an object emitted by the socket. Messages which returns `false` in `messageFilter` are simply skipped,
 * and are not passed down the stream.
 *
 * Return value of `multiplex` is an Observable with messages incoming from emulated socket connection. Note that this
 * is not a `WebSocketSubject`, so calling `next` or `multiplex` again will fail. For pushing values to the
 * server, use root `WebSocketSubject`.
 *
 * ## Examples
 *
 * Listening for messages from the server
 *
 * ```ts
 * import { webSocket } from 'rxjs/webSocket';
 *
 * const subject = webSocket('ws://localhost:8081');
 *
 * subject.subscribe({
 *   next: msg => console.log('message received: ' + msg), // Called whenever there is a message from the server.
 *   error: err => console.log(err), // Called if at any point WebSocket API signals some kind of error.
 *   complete: () => console.log('complete') // Called when connection is closed (for whatever reason).
 *  });
 * ```
 *
 * Pushing messages to the server
 *
 * ```ts
 * import { webSocket } from 'rxjs/webSocket';
 *
 * const subject = webSocket('ws://localhost:8081');
 *
 * subject.subscribe();
 * // Note that at least one consumer has to subscribe to the created subject - otherwise "nexted" values will be just buffered and not sent,
 * // since no connection was established!
 *
 * subject.next({ message: 'some message' });
 * // This will send a message to the server once a connection is made. Remember value is serialized with JSON.stringify by default!
 *
 * subject.complete(); // Closes the connection.
 *
 * subject.error({ code: 4000, reason: 'I think our app just broke!' });
 * // Also closes the connection, but let's the server know that this closing is caused by some error.
 * ```
 *
 * Multiplexing WebSocket
 *
 * ```ts
 * import { webSocket } from 'rxjs/webSocket';
 *
 * const subject = webSocket('ws://localhost:8081');
 *
 * const observableA = subject.multiplex(
 *   () => ({ subscribe: 'A' }), // When server gets this message, it will start sending messages for 'A'...
 *   () => ({ unsubscribe: 'A' }), // ...and when gets this one, it will stop.
 *   message => message.type === 'A' // If the function returns `true` message is passed down the stream. Skipped if the function returns false.
 * );
 *
 * const observableB = subject.multiplex( // And the same goes for 'B'.
 *   () => ({ subscribe: 'B' }),
 *   () => ({ unsubscribe: 'B' }),
 *   message => message.type === 'B'
 * );
 *
 * const subA = observableA.subscribe(messageForA => console.log(messageForA));
 * // At this moment WebSocket connection is established. Server gets '{"subscribe": "A"}' message and starts sending messages for 'A',
 * // which we log here.
 *
 * const subB = observableB.subscribe(messageForB => console.log(messageForB));
 * // Since we already have a connection, we just send '{"subscribe": "B"}' message to the server. It starts sending messages for 'B',
 * // which we log here.
 *
 * subB.unsubscribe();
 * // Message '{"unsubscribe": "B"}' is sent to the server, which stops sending 'B' messages.
 *
 * subA.unsubscribe();
 * // Message '{"unsubscribe": "A"}' makes the server stop sending messages for 'A'. Since there is no more subscribers to root Subject,
 * // socket connection closes.
 * ```
 *
 * @param {string|WebSocketSubjectConfig} urlConfigOrSource The WebSocket endpoint as an url or an object with
 * configuration and additional Observers.
 * @return {WebSocketSubject} Subject which allows to both send and receive messages via WebSocket connection.
 */
export function webSocket<T>(urlConfigOrSource: string | WebSocketSubjectConfig<T>): WebSocketSubject<T> {
  return new WebSocketSubject<T>(urlConfigOrSource);
}
import { AjaxRequest, AjaxResponseType } from './types';
import { getXHRResponse } from './getXHRResponse';

/**
 * A normalized response from an AJAX request. To get the data from the response,
 * you will want to read the `response` property.
 *
 * - DO NOT create instances of this class directly.
 * - DO NOT subclass this class.
 *
 * It is advised not to hold this object in memory, as it has a reference to
 * the original XHR used to make the request, as well as properties containing
 * request and response data.
 *
 * @see {@link ajax}
 * @see {@link AjaxConfig}
 */
export class AjaxResponse<T> {
  /** The HTTP status code */
  readonly status: number;

  /**
   * The response data, if any. Note that this will automatically be converted to the proper type
   */
  readonly response: T;

  /**
   * The responseType set on the request. (For example: `""`, `"arraybuffer"`, `"blob"`, `"document"`, `"json"`, or `"text"`)
   * @deprecated There isn't much reason to examine this. It's the same responseType set (or defaulted) on the ajax config.
   * If you really need to examine this value, you can check it on the `request` or the `xhr`. Will be removed in v8.
   */
  readonly responseType: XMLHttpRequestResponseType;

  /**
   * The total number of bytes loaded so far. To be used with {@link total} while
   * calculating progress. (You will want to set {@link includeDownloadProgress} or
   * {@link includeDownloadProgress})
   */
  readonly loaded: number;

  /**
   * The total number of bytes to be loaded. To be used with {@link loaded} while
   * calculating progress. (You will want to set {@link includeDownloadProgress} or
   * {@link includeDownloadProgress})
   */
  readonly total: number;

  /**
   * A dictionary of the response headers.
   */
  readonly responseHeaders: Record<string, string>;

  /**
   * A normalized response from an AJAX request. To get the data from the response,
   * you will want to read the `response` property.
   *
   * - DO NOT create instances of this class directly.
   * - DO NOT subclass this class.
   *
   * @param originalEvent The original event object from the XHR `onload` event.
   * @param xhr The `XMLHttpRequest` object used to make the request. This is useful for examining status code, etc.
   * @param request The request settings used to make the HTTP request.
   * @param type The type of the event emitted by the {@link ajax} Observable
   */
  constructor(
    /**
     * The original event object from the raw XHR event.
     */
    public readonly originalEvent: ProgressEvent,
    /**
     * The XMLHttpRequest object used to make the request.
     * NOTE: It is advised not to hold this in memory, as it will retain references to all of it's event handlers
     * and many other things related to the request.
     */
    public readonly xhr: XMLHttpRequest,
    /**
     * The request parameters used to make the HTTP request.
     */
    public readonly request: AjaxRequest,
    /**
     * The event type. This can be used to discern between different events
     * if you're using progress events with {@link includeDownloadProgress} or
     * {@link includeUploadProgress} settings in {@link AjaxConfig}.
     *
     * The event type consists of two parts: the {@link AjaxDirection} and the
     * the event type. Merged with `_`, they form the `type` string. The
     * direction can be an `upload` or a `download` direction, while an event can
     * be `loadstart`, `progress` or `load`.
     *
     * `download_load` is the type of event when download has finished and the
     * response is available.
     */
    public readonly type: AjaxResponseType = 'download_load'
  ) {
    const { status, responseType } = xhr;
    this.status = status ?? 0;
    this.responseType = responseType ?? '';

    // Parse the response headers in advance for the user. There's really
    // not a great way to get all of them. So we need to parse the header string
    // we get back. It comes in a simple enough format:
    //
    // header-name: value here
    // content-type: application/json
    // other-header-here: some, other, values, or, whatever
    const allHeaders = xhr.getAllResponseHeaders();
    this.responseHeaders = allHeaders
      ? // Split the header text into lines
        allHeaders.split('\n').reduce((headers: Record<string, string>, line) => {
          // Split the lines on the first ": " as
          // "key: value". Note that the value could
          // technically have a ": " in it.
          const index = line.indexOf(': ');
          headers[line.slice(0, index)] = line.slice(index + 2);
          return headers;
        }, {})
      : {};

    this.response = getXHRResponse(xhr);
    const { loaded, total } = originalEvent;
    this.loaded = loaded;
    this.total = total;
  }
}
import { map } from '../operators/map';
import { Observable } from '../Observable';
import { AjaxConfig, AjaxRequest, AjaxDirection, ProgressEventType } from './types';
import { AjaxResponse } from './AjaxResponse';
import { AjaxTimeoutError, AjaxError } from './errors';

export interface AjaxCreationMethod {
  /**
   * Creates an observable that will perform an AJAX request using the
   * [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) in
   * global scope by default.
   *
   * This is the most configurable option, and the basis for all other AJAX calls in the library.
   *
   * ## Example
   *
   * ```ts
   * import { ajax } from 'rxjs/ajax';
   * import { map, catchError, of } from 'rxjs';
   *
   * const obs$ = ajax({
   *   method: 'GET',
   *   url: 'https://api.github.com/users?per_page=5',
   *   responseType: 'json'
   * }).pipe(
   *   map(userResponse => console.log('users: ', userResponse)),
   *   catchError(error => {
   *     console.log('error: ', error);
   *     return of(error);
   *   })
   * );
   * ```
   */
  <T>(config: AjaxConfig): Observable<AjaxResponse<T>>;

  /**
   * Perform an HTTP GET using the
   * [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) in
   * global scope. Defaults to a `responseType` of `"json"`.
   *
   * ## Example
   *
   * ```ts
   * import { ajax } from 'rxjs/ajax';
   * import { map, catchError, of } from 'rxjs';
   *
   * const obs$ = ajax('https://api.github.com/users?per_page=5').pipe(
   *   map(userResponse => console.log('users: ', userResponse)),
   *   catchError(error => {
   *     console.log('error: ', error);
   *     return of(error);
   *   })
   * );
   * ```
   */
  <T>(url: string): Observable<AjaxResponse<T>>;

  /**
   * Performs an HTTP GET using the
   * [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) in
   * global scope by default, and a `responseType` of `"json"`.
   *
   * @param url The URL to get the resource from
   * @param headers Optional headers. Case-Insensitive.
   */
  get<T>(url: string, headers?: Record<string, string>): Observable<AjaxResponse<T>>;

  /**
   * Performs an HTTP POST using the
   * [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) in
   * global scope by default, and a `responseType` of `"json"`.
   *
   * Before sending the value passed to the `body` argument, it is automatically serialized
   * based on the specified `responseType`. By default, a JavaScript object will be serialized
   * to JSON. A `responseType` of `application/x-www-form-urlencoded` will flatten any provided
   * dictionary object to a url-encoded string.
   *
   * @param url The URL to get the resource from
   * @param body The content to send. The body is automatically serialized.
   * @param headers Optional headers. Case-Insensitive.
   */
  post<T>(url: string, body?: any, headers?: Record<string, string>): Observable<AjaxResponse<T>>;

  /**
   * Performs an HTTP PUT using the
   * [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) in
   * global scope by default, and a `responseType` of `"json"`.
   *
   * Before sending the value passed to the `body` argument, it is automatically serialized
   * based on the specified `responseType`. By default, a JavaScript object will be serialized
   * to JSON. A `responseType` of `application/x-www-form-urlencoded` will flatten any provided
   * dictionary object to a url-encoded string.
   *
   * @param url The URL to get the resource from
   * @param body The content to send. The body is automatically serialized.
   * @param headers Optional headers. Case-Insensitive.
   */
  put<T>(url: string, body?: any, headers?: Record<string, string>): Observable<AjaxResponse<T>>;

  /**
   * Performs an HTTP PATCH using the
   * [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) in
   * global scope by default, and a `responseType` of `"json"`.
   *
   * Before sending the value passed to the `body` argument, it is automatically serialized
   * based on the specified `responseType`. By default, a JavaScript object will be serialized
   * to JSON. A `responseType` of `application/x-www-form-urlencoded` will flatten any provided
   * dictionary object to a url-encoded string.
   *
   * @param url The URL to get the resource from
   * @param body The content to send. The body is automatically serialized.
   * @param headers Optional headers. Case-Insensitive.
   */
  patch<T>(url: string, body?: any, headers?: Record<string, string>): Observable<AjaxResponse<T>>;

  /**
   * Performs an HTTP DELETE using the
   * [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) in
   * global scope by default, and a `responseType` of `"json"`.
   *
   * @param url The URL to get the resource from
   * @param headers Optional headers. Case-Insensitive.
   */
  delete<T>(url: string, headers?: Record<string, string>): Observable<AjaxResponse<T>>;

  /**
   * Performs an HTTP GET using the
   * [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) in
   * global scope by default, and returns the hydrated JavaScript object from the
   * response.
   *
   * @param url The URL to get the resource from
   * @param headers Optional headers. Case-Insensitive.
   */
  getJSON<T>(url: string, headers?: Record<string, string>): Observable<T>;
}

function ajaxGet<T>(url: string, headers?: Record<string, string>): Observable<AjaxResponse<T>> {
  return ajax({ method: 'GET', url, headers });
}

function ajaxPost<T>(url: string, body?: any, headers?: Record<string, string>): Observable<AjaxResponse<T>> {
  return ajax({ method: 'POST', url, body, headers });
}

function ajaxDelete<T>(url: string, headers?: Record<string, string>): Observable<AjaxResponse<T>> {
  return ajax({ method: 'DELETE', url, headers });
}

function ajaxPut<T>(url: string, body?: any, headers?: Record<string, string>): Observable<AjaxResponse<T>> {
  return ajax({ method: 'PUT', url, body, headers });
}

function ajaxPatch<T>(url: string, body?: any, headers?: Record<string, string>): Observable<AjaxResponse<T>> {
  return ajax({ method: 'PATCH', url, body, headers });
}

const mapResponse = map((x: AjaxResponse<any>) => x.response);

function ajaxGetJSON<T>(url: string, headers?: Record<string, string>): Observable<T> {
  return mapResponse(
    ajax<T>({
      method: 'GET',
      url,
      headers,
    })
  );
}

/**
 * There is an ajax operator on the Rx object.
 *
 * It creates an observable for an Ajax request with either a request object with
 * url, headers, etc or a string for a URL.
 *
 * ## Examples
 *
 * Using `ajax()` to fetch the response object that is being returned from API
 *
 * ```ts
 * import { ajax } from 'rxjs/ajax';
 * import { map, catchError, of } from 'rxjs';
 *
 * const obs$ = ajax('https://api.github.com/users?per_page=5').pipe(
 *   map(userResponse => console.log('users: ', userResponse)),
 *   catchError(error => {
 *     console.log('error: ', error);
 *     return of(error);
 *   })
 * );
 *
 * obs$.subscribe({
 *   next: value => console.log(value),
 *   error: err => console.log(err)
 * });
 * ```
 *
 * Using `ajax.getJSON()` to fetch data from API
 *
 * ```ts
 * import { ajax } from 'rxjs/ajax';
 * import { map, catchError, of } from 'rxjs';
 *
 * const obs$ = ajax.getJSON('https://api.github.com/users?per_page=5').pipe(
 *   map(userResponse => console.log('users: ', userResponse)),
 *   catchError(error => {
 *     console.log('error: ', error);
 *     return of(error);
 *   })
 * );
 *
 * obs$.subscribe({
 *   next: value => console.log(value),
 *   error: err => console.log(err)
 * });
 * ```
 *
 * Using `ajax()` with object as argument and method POST with a two seconds delay
 *
 * ```ts
 * import { ajax } from 'rxjs/ajax';
 * import { map, catchError, of } from 'rxjs';
 *
 * const users = ajax({
 *   url: 'https://httpbin.org/delay/2',
 *   method: 'POST',
 *   headers: {
 *     'Content-Type': 'application/json',
 *     'rxjs-custom-header': 'Rxjs'
 *   },
 *   body: {
 *     rxjs: 'Hello World!'
 *   }
 * }).pipe(
 *   map(response => console.log('response: ', response)),
 *   catchError(error => {
 *     console.log('error: ', error);
 *     return of(error);
 *   })
 * );
 *
 * users.subscribe({
 *   next: value => console.log(value),
 *   error: err => console.log(err)
 * });
 * ```
 *
 * Using `ajax()` to fetch. An error object that is being returned from the request
 *
 * ```ts
 * import { ajax } from 'rxjs/ajax';
 * import { map, catchError, of } from 'rxjs';
 *
 * const obs$ = ajax('https://api.github.com/404').pipe(
 *   map(userResponse => console.log('users: ', userResponse)),
 *   catchError(error => {
 *     console.log('error: ', error);
 *     return of(error);
 *   })
 * );
 *
 * obs$.subscribe({
 *   next: value => console.log(value),
 *   error: err => console.log(err)
 * });
 * ```
 */
export const ajax: AjaxCreationMethod = (() => {
  const create = <T>(urlOrConfig: string | AjaxConfig) => {
    const config: AjaxConfig =
      typeof urlOrConfig === 'string'
        ? {
            url: urlOrConfig,
          }
        : urlOrConfig;
    return fromAjax<T>(config);
  };

  create.get = ajaxGet;
  create.post = ajaxPost;
  create.delete = ajaxDelete;
  create.put = ajaxPut;
  create.patch = ajaxPatch;
  create.getJSON = ajaxGetJSON;

  return create;
})();

const UPLOAD = 'upload';
const DOWNLOAD = 'download';
const LOADSTART = 'loadstart';
const PROGRESS = 'progress';
const LOAD = 'load';

export function fromAjax<T>(init: AjaxConfig): Observable<AjaxResponse<T>> {
  return new Observable((destination) => {
    const config = {
      // Defaults
      async: true,
      crossDomain: false,
      withCredentials: false,
      method: 'GET',
      timeout: 0,
      responseType: 'json' as XMLHttpRequestResponseType,

      ...init,
    };

    const { queryParams, body: configuredBody, headers: configuredHeaders } = config;

    let url = config.url;
    if (!url) {
      throw new TypeError('url is required');
    }

    if (queryParams) {
      let searchParams: URLSearchParams;
      if (url.includes('?')) {
        // If the user has passed a URL with a querystring already in it,
        // we need to combine them. So we're going to split it. There
        // should only be one `?` in a valid URL.
        const parts = url.split('?');
        if (2 < parts.length) {
          throw new TypeError('invalid url');
        }
        // Add the passed queryParams to the params already in the url provided.
        searchParams = new URLSearchParams(parts[1]);
        // queryParams is converted to any because the runtime is *much* more permissive than
        // the types are.
        new URLSearchParams(queryParams as any).forEach((value, key) => searchParams.set(key, value));
        // We have to do string concatenation here, because `new URL(url)` does
        // not like relative URLs like `/this` without a base url, which we can't
        // specify, nor can we assume `location` will exist, because of node.
        url = parts[0] + '?' + searchParams;
      } else {
        // There is no pre-existing querystring, so we can just use URLSearchParams
        // to convert the passed queryParams into the proper format and encodings.
        // queryParams is converted to any because the runtime is *much* more permissive than
        // the types are.
        searchParams = new URLSearchParams(queryParams as any);
        url = url + '?' + searchParams;
      }
    }

    // Normalize the headers. We're going to make them all lowercase, since
    // Headers are case insensitive by design. This makes it easier to verify
    // that we aren't setting or sending duplicates.
    const headers: Record<string, any> = {};
    if (configuredHeaders) {
      for (const key in configuredHeaders) {
        if (configuredHeaders.hasOwnProperty(key)) {
          headers[key.toLowerCase()] = configuredHeaders[key];
        }
      }
    }

    const crossDomain = config.crossDomain;

    // Set the x-requested-with header. This is a non-standard header that has
    // come to be a de facto standard for HTTP requests sent by libraries and frameworks
    // using XHR. However, we DO NOT want to set this if it is a CORS request. This is
    // because sometimes this header can cause issues with CORS. To be clear,
    // None of this is necessary, it's only being set because it's "the thing libraries do"
    // Starting back as far as JQuery, and continuing with other libraries such as Angular 1,
    // Axios, et al.
    if (!crossDomain && !('x-requested-with' in headers)) {
      headers['x-requested-with'] = 'XMLHttpRequest';
    }

    // Allow users to provide their XSRF cookie name and the name of a custom header to use to
    // send the cookie.
    const { withCredentials, xsrfCookieName, xsrfHeaderName } = config;
    if ((withCredentials || !crossDomain) && xsrfCookieName && xsrfHeaderName) {
      const xsrfCookie = document?.cookie.match(new RegExp(`(^|;\\s*)(${xsrfCookieName})=([^;]*)`))?.pop() ?? '';
      if (xsrfCookie) {
        headers[xsrfHeaderName] = xsrfCookie;
      }
    }

    // Examine the body and determine whether or not to serialize it
    // and set the content-type in `headers`, if we're able.
    const body = extractContentTypeAndMaybeSerializeBody(configuredBody, headers);

    // The final request settings.
    const _request: Readonly<AjaxRequest> = {
      ...config,

      // Set values we ensured above
      url,
      headers,
      body,
    };

    let xhr: XMLHttpRequest;

    // Create our XHR so we can get started.
    xhr = init.createXHR ? init.createXHR() : new XMLHttpRequest();

    {
      ///////////////////////////////////////////////////
      // set up the events before open XHR
      // https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest
      // You need to add the event listeners before calling open() on the request.
      // Otherwise the progress events will not fire.
      ///////////////////////////////////////////////////

      const { progressSubscriber, includeDownloadProgress = false, includeUploadProgress = false } = init;

      /**
       * Wires up an event handler that will emit an error when fired. Used
       * for timeout and abort events.
       * @param type The type of event we're treating as an error
       * @param errorFactory A function that creates the type of error to emit.
       */
      const addErrorEvent = (type: string, errorFactory: () => any) => {
        xhr.addEventListener(type, () => {
          const error = errorFactory();
          progressSubscriber?.error?.(error);
          destination.error(error);
        });
      };

      // If the request times out, handle errors appropriately.
      addErrorEvent('timeout', () => new AjaxTimeoutError(xhr, _request));

      // If the request aborts (due to a network disconnection or the like), handle
      // it as an error.
      addErrorEvent('abort', () => new AjaxError('aborted', xhr, _request));

      /**
       * Creates a response object to emit to the consumer.
       * @param direction the direction related to the event. Prefixes the event `type` in the
       * `AjaxResponse` object with "upload_" for events related to uploading and "download_"
       * for events related to downloading.
       * @param event the actual event object.
       */
      const createResponse = (direction: AjaxDirection, event: ProgressEvent) =>
        new AjaxResponse<T>(event, xhr, _request, `${direction}_${event.type as ProgressEventType}` as const);

      /**
       * Wires up an event handler that emits a Response object to the consumer, used for
       * all events that emit responses, loadstart, progress, and load.
       * Note that download load handling is a bit different below, because it has
       * more logic it needs to run.
       * @param target The target, either the XHR itself or the Upload object.
       * @param type The type of event to wire up
       * @param direction The "direction", used to prefix the response object that is
       * emitted to the consumer. (e.g. "upload_" or "download_")
       */
      const addProgressEvent = (target: any, type: string, direction: AjaxDirection) => {
        target.addEventListener(type, (event: ProgressEvent) => {
          destination.next(createResponse(direction, event));
        });
      };

      if (includeUploadProgress) {
        [LOADSTART, PROGRESS, LOAD].forEach((type) => addProgressEvent(xhr.upload, type, UPLOAD));
      }

      if (progressSubscriber) {
        [LOADSTART, PROGRESS].forEach((type) => xhr.upload.addEventListener(type, (e: any) => progressSubscriber?.next?.(e)));
      }

      if (includeDownloadProgress) {
        [LOADSTART, PROGRESS].forEach((type) => addProgressEvent(xhr, type, DOWNLOAD));
      }

      const emitError = (status?: number) => {
        const msg = 'ajax error' + (status ? ' ' + status : '');
        destination.error(new AjaxError(msg, xhr, _request));
      };

      xhr.addEventListener('error', (e) => {
        progressSubscriber?.error?.(e);
        emitError();
      });

      xhr.addEventListener(LOAD, (event) => {
        const { status } = xhr;
        // 4xx and 5xx should error (https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)
        if (status < 400) {
          progressSubscriber?.complete?.();

          let response: AjaxResponse<T>;
          try {
            // This can throw in IE, because we end up needing to do a JSON.parse
            // of the response in some cases to produce object we'd expect from
            // modern browsers.
            response = createResponse(DOWNLOAD, event);
          } catch (err) {
            destination.error(err);
            return;
          }

          destination.next(response);
          destination.complete();
        } else {
          progressSubscriber?.error?.(event);
          emitError(status);
        }
      });
    }

    const { user, method, async } = _request;
    // open XHR
    if (user) {
      xhr.open(method, url, async, user, _request.password);
    } else {
      xhr.open(method, url, async);
    }

    // timeout, responseType and withCredentials can be set once the XHR is open
    if (async) {
      xhr.timeout = _request.timeout;
      xhr.responseType = _request.responseType;
    }

    if ('withCredentials' in xhr) {
      xhr.withCredentials = _request.withCredentials;
    }

    // set headers
    for (const key in headers) {
      if (headers.hasOwnProperty(key)) {
        xhr.setRequestHeader(key, headers[key]);
      }
    }

    // finally send the request
    if (body) {
      xhr.send(body);
    } else {
      xhr.send();
    }

    return () => {
      if (xhr && xhr.readyState !== 4 /*XHR done*/) {
        xhr.abort();
      }
    };
  });
}

/**
 * Examines the body to determine if we need to serialize it for them or not.
 * If the body is a type that XHR handles natively, we just allow it through,
 * otherwise, if the body is something that *we* can serialize for the user,
 * we will serialize it, and attempt to set the `content-type` header, if it's
 * not already set.
 * @param body The body passed in by the user
 * @param headers The normalized headers
 */
function extractContentTypeAndMaybeSerializeBody(body: any, headers: Record<string, string>) {
  if (
    !body ||
    typeof body === 'string' ||
    isFormData(body) ||
    isURLSearchParams(body) ||
    isArrayBuffer(body) ||
    isFile(body) ||
    isBlob(body) ||
    isReadableStream(body)
  ) {
    // The XHR instance itself can handle serializing these, and set the content-type for us
    // so we don't need to do that. https://xhr.spec.whatwg.org/#the-send()-method
    return body;
  }

  if (isArrayBufferView(body)) {
    // This is a typed array (e.g. Float32Array or Uint8Array), or a DataView.
    // XHR can handle this one too: https://fetch.spec.whatwg.org/#concept-bodyinit-extract
    return body.buffer;
  }

  if (typeof body === 'object') {
    // If we have made it here, this is an object, probably a POJO, and we'll try
    // to serialize it for them. If this doesn't work, it will throw, obviously, which
    // is okay. The workaround for users would be to manually set the body to their own
    // serialized string (accounting for circular references or whatever), then set
    // the content-type manually as well.
    headers['content-type'] = headers['content-type'] ?? 'application/json;charset=utf-8';
    return JSON.stringify(body);
  }

  // If we've gotten past everything above, this is something we don't quite know how to
  // handle. Throw an error. This will be caught and emitted from the observable.
  throw new TypeError('Unknown body type');
}

const _toString = Object.prototype.toString;

function toStringCheck(obj: any, name: string): boolean {
  return _toString.call(obj) === `[object ${name}]`;
}

function isArrayBuffer(body: any): body is ArrayBuffer {
  return toStringCheck(body, 'ArrayBuffer');
}

function isFile(body: any): body is File {
  return toStringCheck(body, 'File');
}

function isBlob(body: any): body is Blob {
  return toStringCheck(body, 'Blob');
}

function isArrayBufferView(body: any): body is ArrayBufferView {
  return typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView(body);
}

function isFormData(body: any): body is FormData {
  return typeof FormData !== 'undefined' && body instanceof FormData;
}

function isURLSearchParams(body: any): body is URLSearchParams {
  return typeof URLSearchParams !== 'undefined' && body instanceof URLSearchParams;
}

function isReadableStream(body: any): body is ReadableStream {
  return typeof ReadableStream !== 'undefined' && body instanceof ReadableStream;
}
import { AjaxRequest } from './types';
import { getXHRResponse } from './getXHRResponse';
import { createErrorClass } from '../util/createErrorClass';

/**
 * A normalized AJAX error.
 *
 * @see {@link ajax}
 *
 * @class AjaxError
 */
export interface AjaxError extends Error {
  /**
   * The XHR instance associated with the error.
   */
  xhr: XMLHttpRequest;

  /**
   * The AjaxRequest associated with the error.
   */
  request: AjaxRequest;

  /**
   * The HTTP status code, if the request has completed. If not,
   * it is set to `0`.
   */
  status: number;

  /**
   * The responseType (e.g. 'json', 'arraybuffer', or 'xml').
   */
  responseType: XMLHttpRequestResponseType;

  /**
   * The response data.
   */
  response: any;
}

export interface AjaxErrorCtor {
  /**
   * @deprecated Internal implementation detail. Do not construct error instances.
   * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269
   */
  new (message: string, xhr: XMLHttpRequest, request: AjaxRequest): AjaxError;
}

/**
 * Thrown when an error occurs during an AJAX request.
 * This is only exported because it is useful for checking to see if an error
 * is an `instanceof AjaxError`. DO NOT create new instances of `AjaxError` with
 * the constructor.
 *
 * @class AjaxError
 * @see {@link ajax}
 */
export const AjaxError: AjaxErrorCtor = createErrorClass(
  (_super) =>
    function AjaxErrorImpl(this: any, message: string, xhr: XMLHttpRequest, request: AjaxRequest) {
      this.message = message;
      this.name = 'AjaxError';
      this.xhr = xhr;
      this.request = request;
      this.status = xhr.status;
      this.responseType = xhr.responseType;
      let response: any;
      try {
        // This can throw in IE, because we have to do a JSON.parse of
        // the response in some cases to get the expected response property.
        response = getXHRResponse(xhr);
      } catch (err) {
        response = xhr.responseText;
      }
      this.response = response;
    }
);

export interface AjaxTimeoutError extends AjaxError {}

export interface AjaxTimeoutErrorCtor {
  /**
   * @deprecated Internal implementation detail. Do not construct error instances.
   * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269
   */
  new (xhr: XMLHttpRequest, request: AjaxRequest): AjaxTimeoutError;
}

/**
 * Thrown when an AJAX request times out. Not to be confused with {@link TimeoutError}.
 *
 * This is exported only because it is useful for checking to see if errors are an
 * `instanceof AjaxTimeoutError`. DO NOT use the constructor to create an instance of
 * this type.
 *
 * @class AjaxTimeoutError
 * @see {@link ajax}
 */
export const AjaxTimeoutError: AjaxTimeoutErrorCtor = (() => {
  function AjaxTimeoutErrorImpl(this: any, xhr: XMLHttpRequest, request: AjaxRequest) {
    AjaxError.call(this, 'ajax timeout', xhr, request);
    this.name = 'AjaxTimeoutError';
    return this;
  }
  AjaxTimeoutErrorImpl.prototype = Object.create(AjaxError.prototype);
  return AjaxTimeoutErrorImpl;
})() as any;
/**
 * Gets what should be in the `response` property of the XHR. However,
 * since we still support the final versions of IE, we need to do a little
 * checking here to make sure that we get the right thing back. Conquentally,
 * we need to do a JSON.parse() in here, which *could* throw if the response
 * isn't valid JSON.
 *
 * This is used both in creating an AjaxResponse, and in creating certain errors
 * that we throw, so we can give the user whatever was in the response property.
 *
 * @param xhr The XHR to examine the response of
 */
export function getXHRResponse(xhr: XMLHttpRequest) {
  switch (xhr.responseType) {
    case 'json': {
      if ('response' in xhr) {
        return xhr.response;
      } else {
        // IE
        const ieXHR: any = xhr;
        return JSON.parse(ieXHR.responseText);
      }
    }
    case 'document':
      return xhr.responseXML;
    case 'text':
    default: {
      if ('response' in xhr) {
        return xhr.response;
      } else {
        // IE
        const ieXHR: any = xhr;
        return ieXHR.responseText;
      }
    }
  }
}
import { PartialObserver } from '../types';

/**
 * Valid Ajax direction types. Prefixes the event `type` in the
 * {@link AjaxResponse} object with "upload_" for events related
 * to uploading and "download_" for events related to downloading.
 */
export type AjaxDirection = 'upload' | 'download';

export type ProgressEventType = 'loadstart' | 'progress' | 'load';

export type AjaxResponseType = `${AjaxDirection}_${ProgressEventType}`;

/**
 * The object containing values RxJS used to make the HTTP request.
 *
 * This is provided in {@link AjaxError} instances as the `request`
 * object.
 */
export interface AjaxRequest {
  /**
   * The URL requested.
   */
  url: string;

  /**
   * The body to send over the HTTP request.
   */
  body?: any;

  /**
   * The HTTP method used to make the HTTP request.
   */
  method: string;

  /**
   * Whether or not the request was made asynchronously.
   */
  async: boolean;

  /**
   * The headers sent over the HTTP request.
   */
  headers: Readonly<Record<string, any>>;

  /**
   * The timeout value used for the HTTP request.
   * Note: this is only honored if the request is asynchronous (`async` is `true`).
   */
  timeout: number;

  /**
   * The user credentials user name sent with the HTTP request.
   */
  user?: string;

  /**
   * The user credentials password sent with the HTTP request.
   */
  password?: string;

  /**
   * Whether or not the request was a CORS request.
   */
  crossDomain: boolean;

  /**
   * Whether or not a CORS request was sent with credentials.
   * If `false`, will also ignore cookies in the CORS response.
   */
  withCredentials: boolean;

  /**
   * The [`responseType`](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseType) set before sending the request.
   */
  responseType: XMLHttpRequestResponseType;
}

/**
 * Configuration for the {@link ajax} creation function.
 */
export interface AjaxConfig {
  /** The address of the resource to request via HTTP. */
  url: string;

  /**
   * The body of the HTTP request to send.
   *
   * This is serialized, by default, based off of the value of the `"content-type"` header.
   * For example, if the `"content-type"` is `"application/json"`, the body will be serialized
   * as JSON. If the `"content-type"` is `"application/x-www-form-urlencoded"`, whatever object passed
   * to the body will be serialized as URL, using key-value pairs based off of the keys and values of the object.
   * In all other cases, the body will be passed directly.
   */
  body?: any;

  /**
   * Whether or not to send the request asynchronously. Defaults to `true`.
   * If set to `false`, this will block the thread until the AJAX request responds.
   */
  async?: boolean;

  /**
   * The HTTP Method to use for the request. Defaults to "GET".
   */
  method?: string;

  /**
   * The HTTP headers to apply.
   *
   * Note that, by default, RxJS will add the following headers under certain conditions:
   *
   * 1. If the `"content-type"` header is **NOT** set, and the `body` is [`FormData`](https://developer.mozilla.org/en-US/docs/Web/API/FormData),
   *    a `"content-type"` of `"application/x-www-form-urlencoded; charset=UTF-8"` will be set automatically.
   * 2. If the `"x-requested-with"` header is **NOT** set, and the `crossDomain` configuration property is **NOT** explicitly set to `true`,
   *    (meaning it is not a CORS request), a `"x-requested-with"` header with a value of `"XMLHttpRequest"` will be set automatically.
   *    This header is generally meaningless, and is set by libraries and frameworks using `XMLHttpRequest` to make HTTP requests.
   */
  headers?: Readonly<Record<string, any>>;

  /**
   * The time to wait before causing the underlying XMLHttpRequest to timeout. This is only honored if the
   * `async` configuration setting is unset or set to `true`. Defaults to `0`, which is idiomatic for "never timeout".
   */
  timeout?: number;

  /** The user credentials user name to send with the HTTP request */
  user?: string;

  /** The user credentials password to send with the HTTP request*/
  password?: string;

  /**
   * Whether or not to send the HTTP request as a CORS request.
   * Defaults to `false`.
   *
   * @deprecated Will be removed in version 8. Cross domain requests and what creates a cross
   * domain request, are dictated by the browser, and a boolean that forces it to be cross domain
   * does not make sense. If you need to force cross domain, make sure you're making a secure request,
   * then add a custom header to the request or use `withCredentials`. For more information on what
   * triggers a cross domain request, see the [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials).
   * In particular, the section on [Simple Requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Simple_requests) is useful
   * for understanding when CORS will not be used.
   */
  crossDomain?: boolean;

  /**
   * To send user credentials in a CORS request, set to `true`. To exclude user credentials from
   * a CORS request, _OR_ when cookies are to be ignored by the CORS response, set to `false`.
   *
   * Defaults to `false`.
   */
  withCredentials?: boolean;

  /**
   * The name of your site's XSRF cookie.
   */
  xsrfCookieName?: string;

  /**
   * The name of a custom header that you can use to send your XSRF cookie.
   */
  xsrfHeaderName?: string;

  /**
   * Can be set to change the response type.
   * Valid values are `"arraybuffer"`, `"blob"`, `"document"`, `"json"`, and `"text"`.
   * Note that the type of `"document"` (such as an XML document) is ignored if the global context is
   * not `Window`.
   *
   * Defaults to `"json"`.
   */
  responseType?: XMLHttpRequestResponseType;

  /**
   * An optional factory used to create the XMLHttpRequest object used to make the AJAX request.
   * This is useful in environments that lack `XMLHttpRequest`, or in situations where you
   * wish to override the default `XMLHttpRequest` for some reason.
   *
   * If not provided, the `XMLHttpRequest` in global scope will be used.
   *
   * NOTE: This AJAX implementation relies on the built-in serialization and setting
   * of Content-Type headers that is provided by standards-compliant XMLHttpRequest implementations,
   * be sure any implementation you use meets that standard.
   */
  createXHR?: () => XMLHttpRequest;

  /**
   * An observer for watching the upload progress of an HTTP request. Will
   * emit progress events, and completes on the final upload load event, will error for
   * any XHR error or timeout.
   *
   * This will **not** error for errored status codes. Rather, it will always _complete_ when
   * the HTTP response comes back.
   *
   * @deprecated If you're looking for progress events, use {@link includeDownloadProgress} and
   * {@link includeUploadProgress} instead. Will be removed in v8.
   */
  progressSubscriber?: PartialObserver<ProgressEvent>;

  /**
   * If `true`, will emit all download progress and load complete events as {@link AjaxResponse}
   * from the observable. The final download event will also be emitted as a {@link AjaxResponse}.
   *
   * If both this and {@link includeUploadProgress} are `false`, then only the {@link AjaxResponse} will
   * be emitted from the resulting observable.
   */
  includeDownloadProgress?: boolean;

  /**
   * If `true`, will emit all upload progress and load complete events as {@link AjaxResponse}
   * from the observable. The final download event will also be emitted as a {@link AjaxResponse}.
   *
   * If both this and {@link includeDownloadProgress} are `false`, then only the {@link AjaxResponse} will
   * be emitted from the resulting observable.
   */
  includeUploadProgress?: boolean;

  /**
   * Query string parameters to add to the URL in the request.
   * <em>This will require a polyfill for `URL` and `URLSearchParams` in Internet Explorer!</em>
   *
   * Accepts either a query string, a `URLSearchParams` object, a dictionary of key/value pairs, or an
   * array of key/value entry tuples. (Essentially, it takes anything that `new URLSearchParams` would normally take).
   *
   * If, for some reason you have a query string in the `url` argument, this will append to the query string in the url,
   * but it will also overwrite the value of any keys that are an exact match. In other words, a url of `/test?a=1&b=2`,
   * with queryParams of `{ b: 5, c: 6 }` will result in a url of roughly `/test?a=1&b=5&c=6`.
   */
  queryParams?:
    | string
    | URLSearchParams
    | Record<string, string | number | boolean | string[] | number[] | boolean[]>
    | [string, string | number | boolean | string[] | number[] | boolean[]][];
}
export { fromFetch } from '../internal/observable/dom/fetch';
export { ajax } from '../internal/ajax/ajax';
export { AjaxError, AjaxTimeoutError } from '../internal/ajax/errors';
export { AjaxResponse } from '../internal/ajax/AjaxResponse';
export { AjaxRequest, AjaxConfig, AjaxDirection } from '../internal/ajax/types';
{
  "name": "rxjs/operators",
  "types": "../dist/types/operators/index.d.ts",
  "main": "../dist/cjs/operators/index.js",
  "module": "../dist/esm5/operators/index.js",
  "es2015": "../dist/esm/operators/index.js",
  "sideEffects": false
}
{
  "name": "rxjs/fetch",
  "types": "../dist/types/fetch/index.d.ts",
  "main": "../dist/cjs/fetch/index.js",
  "module": "../dist/esm5/fetch/index.js",
  "es2015": "../dist/esm/fetch/index.js",
  "sideEffects": false
}
export { Observable } from './internal/Observable';
export { ConnectableObservable } from './internal/observable/ConnectableObservable';
export { observable } from './internal/symbol/observable';
export { animationFrames } from './internal/observable/dom/animationFrames';
export { Subject } from './internal/Subject';
export { BehaviorSubject } from './internal/BehaviorSubject';
export { ReplaySubject } from './internal/ReplaySubject';
export { AsyncSubject } from './internal/AsyncSubject';
export { asap, asapScheduler } from './internal/scheduler/asap';
export { async, asyncScheduler } from './internal/scheduler/async';
export { queue, queueScheduler } from './internal/scheduler/queue';
export { animationFrame, animationFrameScheduler } from './internal/scheduler/animationFrame';
export { VirtualTimeScheduler, VirtualAction } from './internal/scheduler/VirtualTimeScheduler';
export { Scheduler } from './internal/Scheduler';
export { Subscription } from './internal/Subscription';
export { Subscriber } from './internal/Subscriber';
export { Notification, NotificationKind } from './internal/Notification';
export { pipe } from './internal/util/pipe';
export { noop } from './internal/util/noop';
export { identity } from './internal/util/identity';
export { isObservable } from './internal/util/isObservable';
export { lastValueFrom } from './internal/lastValueFrom';
export { firstValueFrom } from './internal/firstValueFrom';
export { ArgumentOutOfRangeError } from './internal/util/ArgumentOutOfRangeError';
export { EmptyError } from './internal/util/EmptyError';
export { NotFoundError } from './internal/util/NotFoundError';
export { ObjectUnsubscribedError } from './internal/util/ObjectUnsubscribedError';
export { SequenceError } from './internal/util/SequenceError';
export { TimeoutError } from './internal/operators/timeout';
export { UnsubscriptionError } from './internal/util/UnsubscriptionError';
export { bindCallback } from './internal/observable/bindCallback';
export { bindNodeCallback } from './internal/observable/bindNodeCallback';
export { combineLatest } from './internal/observable/combineLatest';
export { concat } from './internal/observable/concat';
export { connectable } from './internal/observable/connectable';
export { defer } from './internal/observable/defer';
export { empty } from './internal/observable/empty';
export { forkJoin } from './internal/observable/forkJoin';
export { from } from './internal/observable/from';
export { fromEvent } from './internal/observable/fromEvent';
export { fromEventPattern } from './internal/observable/fromEventPattern';
export { generate } from './internal/observable/generate';
export { iif } from './internal/observable/iif';
export { interval } from './internal/observable/interval';
export { merge } from './internal/observable/merge';
export { never } from './internal/observable/never';
export { of } from './internal/observable/of';
export { onErrorResumeNext } from './internal/observable/onErrorResumeNext';
export { pairs } from './internal/observable/pairs';
export { partition } from './internal/observable/partition';
export { race } from './internal/observable/race';
export { range } from './internal/observable/range';
export { throwError } from './internal/observable/throwError';
export { timer } from './internal/observable/timer';
export { using } from './internal/observable/using';
export { zip } from './internal/observable/zip';
export { scheduled } from './internal/scheduled/scheduled';
export { EMPTY } from './internal/observable/empty';
export { NEVER } from './internal/observable/never';
export * from './internal/types';
export { config } from './internal/config';
export { audit } from './internal/operators/audit';
export { auditTime } from './internal/operators/auditTime';
export { buffer } from './internal/operators/buffer';
export { bufferCount } from './internal/operators/bufferCount';
export { bufferTime } from './internal/operators/bufferTime';
export { bufferToggle } from './internal/operators/bufferToggle';
export { bufferWhen } from './internal/operators/bufferWhen';
export { catchError } from './internal/operators/catchError';
export { combineAll } from './internal/operators/combineAll';
export { combineLatestAll } from './internal/operators/combineLatestAll';
export { combineLatestWith } from './internal/operators/combineLatestWith';
export { concatAll } from './internal/operators/concatAll';
export { concatMap } from './internal/operators/concatMap';
export { concatMapTo } from './internal/operators/concatMapTo';
export { concatWith } from './internal/operators/concatWith';
export { connect } from './internal/operators/connect';
export { count } from './internal/operators/count';
export { debounce } from './internal/operators/debounce';
export { debounceTime } from './internal/operators/debounceTime';
export { defaultIfEmpty } from './internal/operators/defaultIfEmpty';
export { delay } from './internal/operators/delay';
export { delayWhen } from './internal/operators/delayWhen';
export { dematerialize } from './internal/operators/dematerialize';
export { distinct } from './internal/operators/distinct';
export { distinctUntilChanged } from './internal/operators/distinctUntilChanged';
export { distinctUntilKeyChanged } from './internal/operators/distinctUntilKeyChanged';
export { elementAt } from './internal/operators/elementAt';
export { endWith } from './internal/operators/endWith';
export { every } from './internal/operators/every';
export { exhaust } from './internal/operators/exhaust';
export { exhaustAll } from './internal/operators/exhaustAll';
export { exhaustMap } from './internal/operators/exhaustMap';
export { expand } from './internal/operators/expand';
export { filter } from './internal/operators/filter';
export { finalize } from './internal/operators/finalize';
export { find } from './internal/operators/find';
export { findIndex } from './internal/operators/findIndex';
export { first } from './internal/operators/first';
export { groupBy } from './internal/operators/groupBy';
export { ignoreElements } from './internal/operators/ignoreElements';
export { isEmpty } from './internal/operators/isEmpty';
export { last } from './internal/operators/last';
export { map } from './internal/operators/map';
export { mapTo } from './internal/operators/mapTo';
export { materialize } from './internal/operators/materialize';
export { max } from './internal/operators/max';
export { mergeAll } from './internal/operators/mergeAll';
export { flatMap } from './internal/operators/flatMap';
export { mergeMap } from './internal/operators/mergeMap';
export { mergeMapTo } from './internal/operators/mergeMapTo';
export { mergeScan } from './internal/operators/mergeScan';
export { mergeWith } from './internal/operators/mergeWith';
export { min } from './internal/operators/min';
export { multicast } from './internal/operators/multicast';
export { observeOn } from './internal/operators/observeOn';
export { pairwise } from './internal/operators/pairwise';
export { pluck } from './internal/operators/pluck';
export { publish } from './internal/operators/publish';
export { publishBehavior } from './internal/operators/publishBehavior';
export { publishLast } from './internal/operators/publishLast';
export { publishReplay } from './internal/operators/publishReplay';
export { raceWith } from './internal/operators/raceWith';
export { reduce } from './internal/operators/reduce';
export { repeat } from './internal/operators/repeat';
export { repeatWhen } from './internal/operators/repeatWhen';
export { retry } from './internal/operators/retry';
export { retryWhen } from './internal/operators/retryWhen';
export { refCount } from './internal/operators/refCount';
export { sample } from './internal/operators/sample';
export { sampleTime } from './internal/operators/sampleTime';
export { scan } from './internal/operators/scan';
export { sequenceEqual } from './internal/operators/sequenceEqual';
export { share } from './internal/operators/share';
export { shareReplay } from './internal/operators/shareReplay';
export { single } from './internal/operators/single';
export { skip } from './internal/operators/skip';
export { skipLast } from './internal/operators/skipLast';
export { skipUntil } from './internal/operators/skipUntil';
export { skipWhile } from './internal/operators/skipWhile';
export { startWith } from './internal/operators/startWith';
export { subscribeOn } from './internal/operators/subscribeOn';
export { switchAll } from './internal/operators/switchAll';
export { switchMap } from './internal/operators/switchMap';
export { switchMapTo } from './internal/operators/switchMapTo';
export { switchScan } from './internal/operators/switchScan';
export { take } from './internal/operators/take';
export { takeLast } from './internal/operators/takeLast';
export { takeUntil } from './internal/operators/takeUntil';
export { takeWhile } from './internal/operators/takeWhile';
export { tap } from './internal/operators/tap';
export { throttle } from './internal/operators/throttle';
export { throttleTime } from './internal/operators/throttleTime';
export { throwIfEmpty } from './internal/operators/throwIfEmpty';
export { timeInterval } from './internal/operators/timeInterval';
export { timeout } from './internal/operators/timeout';
export { timeoutWith } from './internal/operators/timeoutWith';
export { timestamp } from './internal/operators/timestamp';
export { toArray } from './internal/operators/toArray';
export { window } from './internal/operators/window';
export { windowCount } from './internal/operators/windowCount';
export { windowTime } from './internal/operators/windowTime';
export { windowToggle } from './internal/operators/windowToggle';
export { windowWhen } from './internal/operators/windowWhen';
export { withLatestFrom } from './internal/operators/withLatestFrom';
export { zipAll } from './internal/operators/zipAll';
export { zipWith } from './internal/operators/zipWith';
//# sourceMappingURL=index.js.mapexport { webSocket as webSocket } from '../internal/observable/dom/webSocket';
export { WebSocketSubject } from '../internal/observable/dom/WebSocketSubject';
//# sourceMappingURL=index.js.mapexport { TestScheduler } from '../internal/testing/TestScheduler';
//# sourceMappingURL=index.js.mapexport { audit } from '../internal/operators/audit';
export { auditTime } from '../internal/operators/auditTime';
export { buffer } from '../internal/operators/buffer';
export { bufferCount } from '../internal/operators/bufferCount';
export { bufferTime } from '../internal/operators/bufferTime';
export { bufferToggle } from '../internal/operators/bufferToggle';
export { bufferWhen } from '../internal/operators/bufferWhen';
export { catchError } from '../internal/operators/catchError';
export { combineAll } from '../internal/operators/combineAll';
export { combineLatestAll } from '../internal/operators/combineLatestAll';
export { combineLatest } from '../internal/operators/combineLatest';
export { combineLatestWith } from '../internal/operators/combineLatestWith';
export { concat } from '../internal/operators/concat';
export { concatAll } from '../internal/operators/concatAll';
export { concatMap } from '../internal/operators/concatMap';
export { concatMapTo } from '../internal/operators/concatMapTo';
export { concatWith } from '../internal/operators/concatWith';
export { connect } from '../internal/operators/connect';
export { count } from '../internal/operators/count';
export { debounce } from '../internal/operators/debounce';
export { debounceTime } from '../internal/operators/debounceTime';
export { defaultIfEmpty } from '../internal/operators/defaultIfEmpty';
export { delay } from '../internal/operators/delay';
export { delayWhen } from '../internal/operators/delayWhen';
export { dematerialize } from '../internal/operators/dematerialize';
export { distinct } from '../internal/operators/distinct';
export { distinctUntilChanged } from '../internal/operators/distinctUntilChanged';
export { distinctUntilKeyChanged } from '../internal/operators/distinctUntilKeyChanged';
export { elementAt } from '../internal/operators/elementAt';
export { endWith } from '../internal/operators/endWith';
export { every } from '../internal/operators/every';
export { exhaust } from '../internal/operators/exhaust';
export { exhaustAll } from '../internal/operators/exhaustAll';
export { exhaustMap } from '../internal/operators/exhaustMap';
export { expand } from '../internal/operators/expand';
export { filter } from '../internal/operators/filter';
export { finalize } from '../internal/operators/finalize';
export { find } from '../internal/operators/find';
export { findIndex } from '../internal/operators/findIndex';
export { first } from '../internal/operators/first';
export { groupBy } from '../internal/operators/groupBy';
export { ignoreElements } from '../internal/operators/ignoreElements';
export { isEmpty } from '../internal/operators/isEmpty';
export { last } from '../internal/operators/last';
export { map } from '../internal/operators/map';
export { mapTo } from '../internal/operators/mapTo';
export { materialize } from '../internal/operators/materialize';
export { max } from '../internal/operators/max';
export { merge } from '../internal/operators/merge';
export { mergeAll } from '../internal/operators/mergeAll';
export { flatMap } from '../internal/operators/flatMap';
export { mergeMap } from '../internal/operators/mergeMap';
export { mergeMapTo } from '../internal/operators/mergeMapTo';
export { mergeScan } from '../internal/operators/mergeScan';
export { mergeWith } from '../internal/operators/mergeWith';
export { min } from '../internal/operators/min';
export { multicast } from '../internal/operators/multicast';
export { observeOn } from '../internal/operators/observeOn';
export { onErrorResumeNext } from '../internal/operators/onErrorResumeNext';
export { pairwise } from '../internal/operators/pairwise';
export { partition } from '../internal/operators/partition';
export { pluck } from '../internal/operators/pluck';
export { publish } from '../internal/operators/publish';
export { publishBehavior } from '../internal/operators/publishBehavior';
export { publishLast } from '../internal/operators/publishLast';
export { publishReplay } from '../internal/operators/publishReplay';
export { race } from '../internal/operators/race';
export { raceWith } from '../internal/operators/raceWith';
export { reduce } from '../internal/operators/reduce';
export { repeat } from '../internal/operators/repeat';
export { repeatWhen } from '../internal/operators/repeatWhen';
export { retry } from '../internal/operators/retry';
export { retryWhen } from '../internal/operators/retryWhen';
export { refCount } from '../internal/operators/refCount';
export { sample } from '../internal/operators/sample';
export { sampleTime } from '../internal/operators/sampleTime';
export { scan } from '../internal/operators/scan';
export { sequenceEqual } from '../internal/operators/sequenceEqual';
export { share } from '../internal/operators/share';
export { shareReplay } from '../internal/operators/shareReplay';
export { single } from '../internal/operators/single';
export { skip } from '../internal/operators/skip';
export { skipLast } from '../internal/operators/skipLast';
export { skipUntil } from '../internal/operators/skipUntil';
export { skipWhile } from '../internal/operators/skipWhile';
export { startWith } from '../internal/operators/startWith';
export { subscribeOn } from '../internal/operators/subscribeOn';
export { switchAll } from '../internal/operators/switchAll';
export { switchMap } from '../internal/operators/switchMap';
export { switchMapTo } from '../internal/operators/switchMapTo';
export { switchScan } from '../internal/operators/switchScan';
export { take } from '../internal/operators/take';
export { takeLast } from '../internal/operators/takeLast';
export { takeUntil } from '../internal/operators/takeUntil';
export { takeWhile } from '../internal/operators/takeWhile';
export { tap } from '../internal/operators/tap';
export { throttle } from '../internal/operators/throttle';
export { throttleTime } from '../internal/operators/throttleTime';
export { throwIfEmpty } from '../internal/operators/throwIfEmpty';
export { timeInterval } from '../internal/operators/timeInterval';
export { timeout } from '../internal/operators/timeout';
export { timeoutWith } from '../internal/operators/timeoutWith';
export { timestamp } from '../internal/operators/timestamp';
export { toArray } from '../internal/operators/toArray';
export { window } from '../internal/operators/window';
export { windowCount } from '../internal/operators/windowCount';
export { windowTime } from '../internal/operators/windowTime';
export { windowToggle } from '../internal/operators/windowToggle';
export { windowWhen } from '../internal/operators/windowWhen';
export { withLatestFrom } from '../internal/operators/withLatestFrom';
export { zip } from '../internal/operators/zip';
export { zipAll } from '../internal/operators/zipAll';
export { zipWith } from '../internal/operators/zipWith';
//# sourceMappingURL=index.js.mapexport {};
//# sourceMappingURL=AnyCatcher.js.mapimport { __extends } from "tslib";
import { Subject } from './Subject';
var AsyncSubject = (function (_super) {
    __extends(AsyncSubject, _super);
    function AsyncSubject() {
        var _this = _super !== null && _super.apply(this, arguments) || this;
        _this._value = null;
        _this._hasValue = false;
        _this._isComplete = false;
        return _this;
    }
    AsyncSubject.prototype._checkFinalizedStatuses = function (subscriber) {
        var _a = this, hasError = _a.hasError, _hasValue = _a._hasValue, _value = _a._value, thrownError = _a.thrownError, isStopped = _a.isStopped, _isComplete = _a._isComplete;
        if (hasError) {
            subscriber.error(thrownError);
        }
        else if (isStopped || _isComplete) {
            _hasValue && subscriber.next(_value);
            subscriber.complete();
        }
    };
    AsyncSubject.prototype.next = function (value) {
        if (!this.isStopped) {
            this._value = value;
            this._hasValue = true;
        }
    };
    AsyncSubject.prototype.complete = function () {
        var _a = this, _hasValue = _a._hasValue, _value = _a._value, _isComplete = _a._isComplete;
        if (!_isComplete) {
            this._isComplete = true;
            _hasValue && _super.prototype.next.call(this, _value);
            _super.prototype.complete.call(this);
        }
    };
    return AsyncSubject;
}(Subject));
export { AsyncSubject };
//# sourceMappingURL=AsyncSubject.js.mapimport { __extends } from "tslib";
import { Subject } from './Subject';
var BehaviorSubject = (function (_super) {
    __extends(BehaviorSubject, _super);
    function BehaviorSubject(_value) {
        var _this = _super.call(this) || this;
        _this._value = _value;
        return _this;
    }
    Object.defineProperty(BehaviorSubject.prototype, "value", {
        get: function () {
            return this.getValue();
        },
        enumerable: false,
        configurable: true
    });
    BehaviorSubject.prototype._subscribe = function (subscriber) {
        var subscription = _super.prototype._subscribe.call(this, subscriber);
        !subscription.closed && subscriber.next(this._value);
        return subscription;
    };
    BehaviorSubject.prototype.getValue = function () {
        var _a = this, hasError = _a.hasError, thrownError = _a.thrownError, _value = _a._value;
        if (hasError) {
            throw thrownError;
        }
        this._throwIfClosed();
        return _value;
    };
    BehaviorSubject.prototype.next = function (value) {
        _super.prototype.next.call(this, (this._value = value));
    };
    return BehaviorSubject;
}(Subject));
export { BehaviorSubject };
//# sourceMappingURL=BehaviorSubject.js.mapimport { EMPTY } from './observable/empty';
import { of } from './observable/of';
import { throwError } from './observable/throwError';
import { isFunction } from './util/isFunction';
export var NotificationKind;
(function (NotificationKind) {
    NotificationKind["NEXT"] = "N";
    NotificationKind["ERROR"] = "E";
    NotificationKind["COMPLETE"] = "C";
})(NotificationKind || (NotificationKind = {}));
var Notification = (function () {
    function Notification(kind, value, error) {
        this.kind = kind;
        this.value = value;
        this.error = error;
        this.hasValue = kind === 'N';
    }
    Notification.prototype.observe = function (observer) {
        return observeNotification(this, observer);
    };
    Notification.prototype.do = function (nextHandler, errorHandler, completeHandler) {
        var _a = this, kind = _a.kind, value = _a.value, error = _a.error;
        return kind === 'N' ? nextHandler === null || nextHandler === void 0 ? void 0 : nextHandler(value) : kind === 'E' ? errorHandler === null || errorHandler === void 0 ? void 0 : errorHandler(error) : completeHandler === null || completeHandler === void 0 ? void 0 : completeHandler();
    };
    Notification.prototype.accept = function (nextOrObserver, error, complete) {
        var _a;
        return isFunction((_a = nextOrObserver) === null || _a === void 0 ? void 0 : _a.next)
            ? this.observe(nextOrObserver)
            : this.do(nextOrObserver, error, complete);
    };
    Notification.prototype.toObservable = function () {
        var _a = this, kind = _a.kind, value = _a.value, error = _a.error;
        var result = kind === 'N'
            ?
                of(value)
            :
                kind === 'E'
                    ?
                        throwError(function () { return error; })
                    :
                        kind === 'C'
                            ?
                                EMPTY
                            :
                                0;
        if (!result) {
            throw new TypeError("Unexpected notification kind " + kind);
        }
        return result;
    };
    Notification.createNext = function (value) {
        return new Notification('N', value);
    };
    Notification.createError = function (err) {
        return new Notification('E', undefined, err);
    };
    Notification.createComplete = function () {
        return Notification.completeNotification;
    };
    Notification.completeNotification = new Notification('C');
    return Notification;
}());
export { Notification };
export function observeNotification(notification, observer) {
    var _a, _b, _c;
    var _d = notification, kind = _d.kind, value = _d.value, error = _d.error;
    if (typeof kind !== 'string') {
        throw new TypeError('Invalid notification, missing "kind"');
    }
    kind === 'N' ? (_a = observer.next) === null || _a === void 0 ? void 0 : _a.call(observer, value) : kind === 'E' ? (_b = observer.error) === null || _b === void 0 ? void 0 : _b.call(observer, error) : (_c = observer.complete) === null || _c === void 0 ? void 0 : _c.call(observer);
}
//# sourceMappingURL=Notification.js.mapexport var COMPLETE_NOTIFICATION = (function () { return createNotification('C', undefined, undefined); })();
export function errorNotification(error) {
    return createNotification('E', undefined, error);
}
export function nextNotification(value) {
    return createNotification('N', value, undefined);
}
export function createNotification(kind, value, error) {
    return {
        kind: kind,
        value: value,
        error: error,
    };
}
//# sourceMappingURL=NotificationFactories.js.mapimport { SafeSubscriber, Subscriber } from './Subscriber';
import { isSubscription } from './Subscription';
import { observable as Symbol_observable } from './symbol/observable';
import { pipeFromArray } from './util/pipe';
import { config } from './config';
import { isFunction } from './util/isFunction';
import { errorContext } from './util/errorContext';
var Observable = (function () {
    function Observable(subscribe) {
        if (subscribe) {
            this._subscribe = subscribe;
        }
    }
    Observable.prototype.lift = function (operator) {
        var observable = new Observable();
        observable.source = this;
        observable.operator = operator;
        return observable;
    };
    Observable.prototype.subscribe = function (observerOrNext, error, complete) {
        var _this = this;
        var subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);
        errorContext(function () {
            var _a = _this, operator = _a.operator, source = _a.source;
            subscriber.add(operator
                ?
                    operator.call(subscriber, source)
                : source
                    ?
                        _this._subscribe(subscriber)
                    :
                        _this._trySubscribe(subscriber));
        });
        return subscriber;
    };
    Observable.prototype._trySubscribe = function (sink) {
        try {
            return this._subscribe(sink);
        }
        catch (err) {
            sink.error(err);
        }
    };
    Observable.prototype.forEach = function (next, promiseCtor) {
        var _this = this;
        promiseCtor = getPromiseCtor(promiseCtor);
        return new promiseCtor(function (resolve, reject) {
            var subscriber = new SafeSubscriber({
                next: function (value) {
                    try {
                        next(value);
                    }
                    catch (err) {
                        reject(err);
                        subscriber.unsubscribe();
                    }
                },
                error: reject,
                complete: resolve,
            });
            _this.subscribe(subscriber);
        });
    };
    Observable.prototype._subscribe = function (subscriber) {
        var _a;
        return (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber);
    };
    Observable.prototype[Symbol_observable] = function () {
        return this;
    };
    Observable.prototype.pipe = function () {
        var operations = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            operations[_i] = arguments[_i];
        }
        return pipeFromArray(operations)(this);
    };
    Observable.prototype.toPromise = function (promiseCtor) {
        var _this = this;
        promiseCtor = getPromiseCtor(promiseCtor);
        return new promiseCtor(function (resolve, reject) {
            var value;
            _this.subscribe(function (x) { return (value = x); }, function (err) { return reject(err); }, function () { return resolve(value); });
        });
    };
    Observable.create = function (subscribe) {
        return new Observable(subscribe);
    };
    return Observable;
}());
export { Observable };
function getPromiseCtor(promiseCtor) {
    var _a;
    return (_a = promiseCtor !== null && promiseCtor !== void 0 ? promiseCtor : config.Promise) !== null && _a !== void 0 ? _a : Promise;
}
function isObserver(value) {
    return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);
}
function isSubscriber(value) {
    return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));
}
//# sourceMappingURL=Observable.js.mapexport {};
//# sourceMappingURL=Operator.js.mapimport { __extends } from "tslib";
import { Subject } from './Subject';
import { dateTimestampProvider } from './scheduler/dateTimestampProvider';
var ReplaySubject = (function (_super) {
    __extends(ReplaySubject, _super);
    function ReplaySubject(_bufferSize, _windowTime, _timestampProvider) {
        if (_bufferSize === void 0) { _bufferSize = Infinity; }
        if (_windowTime === void 0) { _windowTime = Infinity; }
        if (_timestampProvider === void 0) { _timestampProvider = dateTimestampProvider; }
        var _this = _super.call(this) || this;
        _this._bufferSize = _bufferSize;
        _this._windowTime = _windowTime;
        _this._timestampProvider = _timestampProvider;
        _this._buffer = [];
        _this._infiniteTimeWindow = true;
        _this._infiniteTimeWindow = _windowTime === Infinity;
        _this._bufferSize = Math.max(1, _bufferSize);
        _this._windowTime = Math.max(1, _windowTime);
        return _this;
    }
    ReplaySubject.prototype.next = function (value) {
        var _a = this, isStopped = _a.isStopped, _buffer = _a._buffer, _infiniteTimeWindow = _a._infiniteTimeWindow, _timestampProvider = _a._timestampProvider, _windowTime = _a._windowTime;
        if (!isStopped) {
            _buffer.push(value);
            !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);
        }
        this._trimBuffer();
        _super.prototype.next.call(this, value);
    };
    ReplaySubject.prototype._subscribe = function (subscriber) {
        this._throwIfClosed();
        this._trimBuffer();
        var subscription = this._innerSubscribe(subscriber);
        var _a = this, _infiniteTimeWindow = _a._infiniteTimeWindow, _buffer = _a._buffer;
        var copy = _buffer.slice();
        for (var i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {
            subscriber.next(copy[i]);
        }
        this._checkFinalizedStatuses(subscriber);
        return subscription;
    };
    ReplaySubject.prototype._trimBuffer = function () {
        var _a = this, _bufferSize = _a._bufferSize, _timestampProvider = _a._timestampProvider, _buffer = _a._buffer, _infiniteTimeWindow = _a._infiniteTimeWindow;
        var adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;
        _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);
        if (!_infiniteTimeWindow) {
            var now = _timestampProvider.now();
            var last = 0;
            for (var i = 1; i < _buffer.length && _buffer[i] <= now; i += 2) {
                last = i;
            }
            last && _buffer.splice(0, last + 1);
        }
    };
    return ReplaySubject;
}(Subject));
export { ReplaySubject };
//# sourceMappingURL=ReplaySubject.js.mapimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';
var Scheduler = (function () {
    function Scheduler(schedulerActionCtor, now) {
        if (now === void 0) { now = Scheduler.now; }
        this.schedulerActionCtor = schedulerActionCtor;
        this.now = now;
    }
    Scheduler.prototype.schedule = function (work, delay, state) {
        if (delay === void 0) { delay = 0; }
        return new this.schedulerActionCtor(this, work).schedule(state, delay);
    };
    Scheduler.now = dateTimestampProvider.now;
    return Scheduler;
}());
export { Scheduler };
//# sourceMappingURL=Scheduler.js.mapimport { __extends, __values } from "tslib";
import { Observable } from './Observable';
import { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';
import { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';
import { arrRemove } from './util/arrRemove';
import { errorContext } from './util/errorContext';
var Subject = (function (_super) {
    __extends(Subject, _super);
    function Subject() {
        var _this = _super.call(this) || this;
        _this.closed = false;
        _this.currentObservers = null;
        _this.observers = [];
        _this.isStopped = false;
        _this.hasError = false;
        _this.thrownError = null;
        return _this;
    }
    Subject.prototype.lift = function (operator) {
        var subject = new AnonymousSubject(this, this);
        subject.operator = operator;
        return subject;
    };
    Subject.prototype._throwIfClosed = function () {
        if (this.closed) {
            throw new ObjectUnsubscribedError();
        }
    };
    Subject.prototype.next = function (value) {
        var _this = this;
        errorContext(function () {
            var e_1, _a;
            _this._throwIfClosed();
            if (!_this.isStopped) {
                if (!_this.currentObservers) {
                    _this.currentObservers = Array.from(_this.observers);
                }
                try {
                    for (var _b = __values(_this.currentObservers), _c = _b.next(); !_c.done; _c = _b.next()) {
                        var observer = _c.value;
                        observer.next(value);
                    }
                }
                catch (e_1_1) { e_1 = { error: e_1_1 }; }
                finally {
                    try {
                        if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
                    }
                    finally { if (e_1) throw e_1.error; }
                }
            }
        });
    };
    Subject.prototype.error = function (err) {
        var _this = this;
        errorContext(function () {
            _this._throwIfClosed();
            if (!_this.isStopped) {
                _this.hasError = _this.isStopped = true;
                _this.thrownError = err;
                var observers = _this.observers;
                while (observers.length) {
                    observers.shift().error(err);
                }
            }
        });
    };
    Subject.prototype.complete = function () {
        var _this = this;
        errorContext(function () {
            _this._throwIfClosed();
            if (!_this.isStopped) {
                _this.isStopped = true;
                var observers = _this.observers;
                while (observers.length) {
                    observers.shift().complete();
                }
            }
        });
    };
    Subject.prototype.unsubscribe = function () {
        this.isStopped = this.closed = true;
        this.observers = this.currentObservers = null;
    };
    Object.defineProperty(Subject.prototype, "observed", {
        get: function () {
            var _a;
            return ((_a = this.observers) === null || _a === void 0 ? void 0 : _a.length) > 0;
        },
        enumerable: false,
        configurable: true
    });
    Subject.prototype._trySubscribe = function (subscriber) {
        this._throwIfClosed();
        return _super.prototype._trySubscribe.call(this, subscriber);
    };
    Subject.prototype._subscribe = function (subscriber) {
        this._throwIfClosed();
        this._checkFinalizedStatuses(subscriber);
        return this._innerSubscribe(subscriber);
    };
    Subject.prototype._innerSubscribe = function (subscriber) {
        var _this = this;
        var _a = this, hasError = _a.hasError, isStopped = _a.isStopped, observers = _a.observers;
        if (hasError || isStopped) {
            return EMPTY_SUBSCRIPTION;
        }
        this.currentObservers = null;
        observers.push(subscriber);
        return new Subscription(function () {
            _this.currentObservers = null;
            arrRemove(observers, subscriber);
        });
    };
    Subject.prototype._checkFinalizedStatuses = function (subscriber) {
        var _a = this, hasError = _a.hasError, thrownError = _a.thrownError, isStopped = _a.isStopped;
        if (hasError) {
            subscriber.error(thrownError);
        }
        else if (isStopped) {
            subscriber.complete();
        }
    };
    Subject.prototype.asObservable = function () {
        var observable = new Observable();
        observable.source = this;
        return observable;
    };
    Subject.create = function (destination, source) {
        return new AnonymousSubject(destination, source);
    };
    return Subject;
}(Observable));
export { Subject };
var AnonymousSubject = (function (_super) {
    __extends(AnonymousSubject, _super);
    function AnonymousSubject(destination, source) {
        var _this = _super.call(this) || this;
        _this.destination = destination;
        _this.source = source;
        return _this;
    }
    AnonymousSubject.prototype.next = function (value) {
        var _a, _b;
        (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.next) === null || _b === void 0 ? void 0 : _b.call(_a, value);
    };
    AnonymousSubject.prototype.error = function (err) {
        var _a, _b;
        (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.error) === null || _b === void 0 ? void 0 : _b.call(_a, err);
    };
    AnonymousSubject.prototype.complete = function () {
        var _a, _b;
        (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.complete) === null || _b === void 0 ? void 0 : _b.call(_a);
    };
    AnonymousSubject.prototype._subscribe = function (subscriber) {
        var _a, _b;
        return (_b = (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber)) !== null && _b !== void 0 ? _b : EMPTY_SUBSCRIPTION;
    };
    return AnonymousSubject;
}(Subject));
export { AnonymousSubject };
//# sourceMappingURL=Subject.js.mapimport { __extends } from "tslib";
import { isFunction } from './util/isFunction';
import { isSubscription, Subscription } from './Subscription';
import { config } from './config';
import { reportUnhandledError } from './util/reportUnhandledError';
import { noop } from './util/noop';
import { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';
import { timeoutProvider } from './scheduler/timeoutProvider';
import { captureError } from './util/errorContext';
var Subscriber = (function (_super) {
    __extends(Subscriber, _super);
    function Subscriber(destination) {
        var _this = _super.call(this) || this;
        _this.isStopped = false;
        if (destination) {
            _this.destination = destination;
            if (isSubscription(destination)) {
                destination.add(_this);
            }
        }
        else {
            _this.destination = EMPTY_OBSERVER;
        }
        return _this;
    }
    Subscriber.create = function (next, error, complete) {
        return new SafeSubscriber(next, error, complete);
    };
    Subscriber.prototype.next = function (value) {
        if (this.isStopped) {
            handleStoppedNotification(nextNotification(value), this);
        }
        else {
            this._next(value);
        }
    };
    Subscriber.prototype.error = function (err) {
        if (this.isStopped) {
            handleStoppedNotification(errorNotification(err), this);
        }
        else {
            this.isStopped = true;
            this._error(err);
        }
    };
    Subscriber.prototype.complete = function () {
        if (this.isStopped) {
            handleStoppedNotification(COMPLETE_NOTIFICATION, this);
        }
        else {
            this.isStopped = true;
            this._complete();
        }
    };
    Subscriber.prototype.unsubscribe = function () {
        if (!this.closed) {
            this.isStopped = true;
            _super.prototype.unsubscribe.call(this);
            this.destination = null;
        }
    };
    Subscriber.prototype._next = function (value) {
        this.destination.next(value);
    };
    Subscriber.prototype._error = function (err) {
        try {
            this.destination.error(err);
        }
        finally {
            this.unsubscribe();
        }
    };
    Subscriber.prototype._complete = function () {
        try {
            this.destination.complete();
        }
        finally {
            this.unsubscribe();
        }
    };
    return Subscriber;
}(Subscription));
export { Subscriber };
var _bind = Function.prototype.bind;
function bind(fn, thisArg) {
    return _bind.call(fn, thisArg);
}
var ConsumerObserver = (function () {
    function ConsumerObserver(partialObserver) {
        this.partialObserver = partialObserver;
    }
    ConsumerObserver.prototype.next = function (value) {
        var partialObserver = this.partialObserver;
        if (partialObserver.next) {
            try {
                partialObserver.next(value);
            }
            catch (error) {
                handleUnhandledError(error);
            }
        }
    };
    ConsumerObserver.prototype.error = function (err) {
        var partialObserver = this.partialObserver;
        if (partialObserver.error) {
            try {
                partialObserver.error(err);
            }
            catch (error) {
                handleUnhandledError(error);
            }
        }
        else {
            handleUnhandledError(err);
        }
    };
    ConsumerObserver.prototype.complete = function () {
        var partialObserver = this.partialObserver;
        if (partialObserver.complete) {
            try {
                partialObserver.complete();
            }
            catch (error) {
                handleUnhandledError(error);
            }
        }
    };
    return ConsumerObserver;
}());
var SafeSubscriber = (function (_super) {
    __extends(SafeSubscriber, _super);
    function SafeSubscriber(observerOrNext, error, complete) {
        var _this = _super.call(this) || this;
        var partialObserver;
        if (isFunction(observerOrNext) || !observerOrNext) {
            partialObserver = {
                next: (observerOrNext !== null && observerOrNext !== void 0 ? observerOrNext : undefined),
                error: error !== null && error !== void 0 ? error : undefined,
                complete: complete !== null && complete !== void 0 ? complete : undefined,
            };
        }
        else {
            var context_1;
            if (_this && config.useDeprecatedNextContext) {
                context_1 = Object.create(observerOrNext);
                context_1.unsubscribe = function () { return _this.unsubscribe(); };
                partialObserver = {
                    next: observerOrNext.next && bind(observerOrNext.next, context_1),
                    error: observerOrNext.error && bind(observerOrNext.error, context_1),
                    complete: observerOrNext.complete && bind(observerOrNext.complete, context_1),
                };
            }
            else {
                partialObserver = observerOrNext;
            }
        }
        _this.destination = new ConsumerObserver(partialObserver);
        return _this;
    }
    return SafeSubscriber;
}(Subscriber));
export { SafeSubscriber };
function handleUnhandledError(error) {
    if (config.useDeprecatedSynchronousErrorHandling) {
        captureError(error);
    }
    else {
        reportUnhandledError(error);
    }
}
function defaultErrorHandler(err) {
    throw err;
}
function handleStoppedNotification(notification, subscriber) {
    var onStoppedNotification = config.onStoppedNotification;
    onStoppedNotification && timeoutProvider.setTimeout(function () { return onStoppedNotification(notification, subscriber); });
}
export var EMPTY_OBSERVER = {
    closed: true,
    next: noop,
    error: defaultErrorHandler,
    complete: noop,
};
//# sourceMappingURL=Subscriber.js.mapimport { __read, __spreadArray, __values } from "tslib";
import { isFunction } from './util/isFunction';
import { UnsubscriptionError } from './util/UnsubscriptionError';
import { arrRemove } from './util/arrRemove';
var Subscription = (function () {
    function Subscription(initialTeardown) {
        this.initialTeardown = initialTeardown;
        this.closed = false;
        this._parentage = null;
        this._finalizers = null;
    }
    Subscription.prototype.unsubscribe = function () {
        var e_1, _a, e_2, _b;
        var errors;
        if (!this.closed) {
            this.closed = true;
            var _parentage = this._parentage;
            if (_parentage) {
                this._parentage = null;
                if (Array.isArray(_parentage)) {
                    try {
                        for (var _parentage_1 = __values(_parentage), _parentage_1_1 = _parentage_1.next(); !_parentage_1_1.done; _parentage_1_1 = _parentage_1.next()) {
                            var parent_1 = _parentage_1_1.value;
                            parent_1.remove(this);
                        }
                    }
                    catch (e_1_1) { e_1 = { error: e_1_1 }; }
                    finally {
                        try {
                            if (_parentage_1_1 && !_parentage_1_1.done && (_a = _parentage_1.return)) _a.call(_parentage_1);
                        }
                        finally { if (e_1) throw e_1.error; }
                    }
                }
                else {
                    _parentage.remove(this);
                }
            }
            var initialFinalizer = this.initialTeardown;
            if (isFunction(initialFinalizer)) {
                try {
                    initialFinalizer();
                }
                catch (e) {
                    errors = e instanceof UnsubscriptionError ? e.errors : [e];
                }
            }
            var _finalizers = this._finalizers;
            if (_finalizers) {
                this._finalizers = null;
                try {
                    for (var _finalizers_1 = __values(_finalizers), _finalizers_1_1 = _finalizers_1.next(); !_finalizers_1_1.done; _finalizers_1_1 = _finalizers_1.next()) {
                        var finalizer = _finalizers_1_1.value;
                        try {
                            execFinalizer(finalizer);
                        }
                        catch (err) {
                            errors = errors !== null && errors !== void 0 ? errors : [];
                            if (err instanceof UnsubscriptionError) {
                                errors = __spreadArray(__spreadArray([], __read(errors)), __read(err.errors));
                            }
                            else {
                                errors.push(err);
                            }
                        }
                    }
                }
                catch (e_2_1) { e_2 = { error: e_2_1 }; }
                finally {
                    try {
                        if (_finalizers_1_1 && !_finalizers_1_1.done && (_b = _finalizers_1.return)) _b.call(_finalizers_1);
                    }
                    finally { if (e_2) throw e_2.error; }
                }
            }
            if (errors) {
                throw new UnsubscriptionError(errors);
            }
        }
    };
    Subscription.prototype.add = function (teardown) {
        var _a;
        if (teardown && teardown !== this) {
            if (this.closed) {
                execFinalizer(teardown);
            }
            else {
                if (teardown instanceof Subscription) {
                    if (teardown.closed || teardown._hasParent(this)) {
                        return;
                    }
                    teardown._addParent(this);
                }
                (this._finalizers = (_a = this._finalizers) !== null && _a !== void 0 ? _a : []).push(teardown);
            }
        }
    };
    Subscription.prototype._hasParent = function (parent) {
        var _parentage = this._parentage;
        return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));
    };
    Subscription.prototype._addParent = function (parent) {
        var _parentage = this._parentage;
        this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;
    };
    Subscription.prototype._removeParent = function (parent) {
        var _parentage = this._parentage;
        if (_parentage === parent) {
            this._parentage = null;
        }
        else if (Array.isArray(_parentage)) {
            arrRemove(_parentage, parent);
        }
    };
    Subscription.prototype.remove = function (teardown) {
        var _finalizers = this._finalizers;
        _finalizers && arrRemove(_finalizers, teardown);
        if (teardown instanceof Subscription) {
            teardown._removeParent(this);
        }
    };
    Subscription.EMPTY = (function () {
        var empty = new Subscription();
        empty.closed = true;
        return empty;
    })();
    return Subscription;
}());
export { Subscription };
export var EMPTY_SUBSCRIPTION = Subscription.EMPTY;
export function isSubscription(value) {
    return (value instanceof Subscription ||
        (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe)));
}
function execFinalizer(finalizer) {
    if (isFunction(finalizer)) {
        finalizer();
    }
    else {
        finalizer.unsubscribe();
    }
}
//# sourceMappingURL=Subscription.js.mapexport var config = {
    onUnhandledError: null,
    onStoppedNotification: null,
    Promise: undefined,
    useDeprecatedSynchronousErrorHandling: false,
    useDeprecatedNextContext: false,
};
//# sourceMappingURL=config.js.mapimport { EmptyError } from './util/EmptyError';
import { SafeSubscriber } from './Subscriber';
export function firstValueFrom(source, config) {
    var hasConfig = typeof config === 'object';
    return new Promise(function (resolve, reject) {
        var subscriber = new SafeSubscriber({
            next: function (value) {
                resolve(value);
                subscriber.unsubscribe();
            },
            error: reject,
            complete: function () {
                if (hasConfig) {
                    resolve(config.defaultValue);
                }
                else {
                    reject(new EmptyError());
                }
            },
        });
        source.subscribe(subscriber);
    });
}
//# sourceMappingURL=firstValueFrom.js.mapimport { EmptyError } from './util/EmptyError';
export function lastValueFrom(source, config) {
    var hasConfig = typeof config === 'object';
    return new Promise(function (resolve, reject) {
        var _hasValue = false;
        var _value;
        source.subscribe({
            next: function (value) {
                _value = value;
                _hasValue = true;
            },
            error: reject,
            complete: function () {
                if (_hasValue) {
                    resolve(_value);
                }
                else if (hasConfig) {
                    resolve(config.defaultValue);
                }
                else {
                    reject(new EmptyError());
                }
            },
        });
    });
}
//# sourceMappingURL=lastValueFrom.js.mapexport {};
//# sourceMappingURL=types.js.mapimport { createErrorClass } from './createErrorClass';
export var ArgumentOutOfRangeError = createErrorClass(function (_super) {
    return function ArgumentOutOfRangeErrorImpl() {
        _super(this);
        this.name = 'ArgumentOutOfRangeError';
        this.message = 'argument out of range';
    };
});
//# sourceMappingURL=ArgumentOutOfRangeError.js.mapimport { createErrorClass } from './createErrorClass';
export var EmptyError = createErrorClass(function (_super) { return function EmptyErrorImpl() {
    _super(this);
    this.name = 'EmptyError';
    this.message = 'no elements in sequence';
}; });
//# sourceMappingURL=EmptyError.js.mapvar nextHandle = 1;
var resolved;
var activeHandles = {};
function findAndClearHandle(handle) {
    if (handle in activeHandles) {
        delete activeHandles[handle];
        return true;
    }
    return false;
}
export var Immediate = {
    setImmediate: function (cb) {
        var handle = nextHandle++;
        activeHandles[handle] = true;
        if (!resolved) {
            resolved = Promise.resolve();
        }
        resolved.then(function () { return findAndClearHandle(handle) && cb(); });
        return handle;
    },
    clearImmediate: function (handle) {
        findAndClearHandle(handle);
    },
};
export var TestTools = {
    pending: function () {
        return Object.keys(activeHandles).length;
    }
};
//# sourceMappingURL=Immediate.js.mapimport { createErrorClass } from './createErrorClass';
export var NotFoundError = createErrorClass(function (_super) {
    return function NotFoundErrorImpl(message) {
        _super(this);
        this.name = 'NotFoundError';
        this.message = message;
    };
});
//# sourceMappingURL=NotFoundError.js.mapimport { createErrorClass } from './createErrorClass';
export var ObjectUnsubscribedError = createErrorClass(function (_super) {
    return function ObjectUnsubscribedErrorImpl() {
        _super(this);
        this.name = 'ObjectUnsubscribedError';
        this.message = 'object unsubscribed';
    };
});
//# sourceMappingURL=ObjectUnsubscribedError.js.mapimport { createErrorClass } from './createErrorClass';
export var SequenceError = createErrorClass(function (_super) {
    return function SequenceErrorImpl(message) {
        _super(this);
        this.name = 'SequenceError';
        this.message = message;
    };
});
//# sourceMappingURL=SequenceError.js.mapimport { createErrorClass } from './createErrorClass';
export var UnsubscriptionError = createErrorClass(function (_super) {
    return function UnsubscriptionErrorImpl(errors) {
        _super(this);
        this.message = errors
            ? errors.length + " errors occurred during unsubscription:\n" + errors.map(function (err, i) { return i + 1 + ") " + err.toString(); }).join('\n  ')
            : '';
        this.name = 'UnsubscriptionError';
        this.errors = errors;
    };
});
//# sourceMappingURL=UnsubscriptionError.js.mapexport function applyMixins(derivedCtor, baseCtors) {
    for (var i = 0, len = baseCtors.length; i < len; i++) {
        var baseCtor = baseCtors[i];
        var propertyKeys = Object.getOwnPropertyNames(baseCtor.prototype);
        for (var j = 0, len2 = propertyKeys.length; j < len2; j++) {
            var name_1 = propertyKeys[j];
            derivedCtor.prototype[name_1] = baseCtor.prototype[name_1];
        }
    }
}
//# sourceMappingURL=applyMixins.js.mapimport { isFunction } from './isFunction';
import { isScheduler } from './isScheduler';
function last(arr) {
    return arr[arr.length - 1];
}
export function popResultSelector(args) {
    return isFunction(last(args)) ? args.pop() : undefined;
}
export function popScheduler(args) {
    return isScheduler(last(args)) ? args.pop() : undefined;
}
export function popNumber(args, defaultValue) {
    return typeof last(args) === 'number' ? args.pop() : defaultValue;
}
//# sourceMappingURL=args.js.mapvar isArray = Array.isArray;
var getPrototypeOf = Object.getPrototypeOf, objectProto = Object.prototype, getKeys = Object.keys;
export function argsArgArrayOrObject(args) {
    if (args.length === 1) {
        var first_1 = args[0];
        if (isArray(first_1)) {
            return { args: first_1, keys: null };
        }
        if (isPOJO(first_1)) {
            var keys = getKeys(first_1);
            return {
                args: keys.map(function (key) { return first_1[key]; }),
                keys: keys,
            };
        }
    }
    return { args: args, keys: null };
}
function isPOJO(obj) {
    return obj && typeof obj === 'object' && getPrototypeOf(obj) === objectProto;
}
//# sourceMappingURL=argsArgArrayOrObject.js.mapvar isArray = Array.isArray;
export function argsOrArgArray(args) {
    return args.length === 1 && isArray(args[0]) ? args[0] : args;
}
//# sourceMappingURL=argsOrArgArray.js.mapexport function arrRemove(arr, item) {
    if (arr) {
        var index = arr.indexOf(item);
        0 <= index && arr.splice(index, 1);
    }
}
//# sourceMappingURL=arrRemove.js.mapexport function createErrorClass(createImpl) {
    var _super = function (instance) {
        Error.call(instance);
        instance.stack = new Error().stack;
    };
    var ctorFunc = createImpl(_super);
    ctorFunc.prototype = Object.create(Error.prototype);
    ctorFunc.prototype.constructor = ctorFunc;
    return ctorFunc;
}
//# sourceMappingURL=createErrorClass.js.mapexport function createObject(keys, values) {
    return keys.reduce(function (result, key, i) { return ((result[key] = values[i]), result); }, {});
}
//# sourceMappingURL=createObject.js.mapimport { config } from '../config';
var context = null;
export function errorContext(cb) {
    if (config.useDeprecatedSynchronousErrorHandling) {
        var isRoot = !context;
        if (isRoot) {
            context = { errorThrown: false, error: null };
        }
        cb();
        if (isRoot) {
            var _a = context, errorThrown = _a.errorThrown, error = _a.error;
            context = null;
            if (errorThrown) {
                throw error;
            }
        }
    }
    else {
        cb();
    }
}
export function captureError(err) {
    if (config.useDeprecatedSynchronousErrorHandling && context) {
        context.errorThrown = true;
        context.error = err;
    }
}
//# sourceMappingURL=errorContext.js.mapexport function executeSchedule(parentSubscription, scheduler, work, delay, repeat) {
    if (delay === void 0) { delay = 0; }
    if (repeat === void 0) { repeat = false; }
    var scheduleSubscription = scheduler.schedule(function () {
        work();
        if (repeat) {
            parentSubscription.add(this.schedule(null, delay));
        }
        else {
            this.unsubscribe();
        }
    }, delay);
    parentSubscription.add(scheduleSubscription);
    if (!repeat) {
        return scheduleSubscription;
    }
}
//# sourceMappingURL=executeSchedule.js.mapexport function identity(x) {
    return x;
}
//# sourceMappingURL=identity.js.mapexport var isArrayLike = (function (x) { return x && typeof x.length === 'number' && typeof x !== 'function'; });
//# sourceMappingURL=isArrayLike.js.mapimport { isFunction } from './isFunction';
export function isAsyncIterable(obj) {
    return Symbol.asyncIterator && isFunction(obj === null || obj === void 0 ? void 0 : obj[Symbol.asyncIterator]);
}
//# sourceMappingURL=isAsyncIterable.js.mapexport function isValidDate(value) {
    return value instanceof Date && !isNaN(value);
}
//# sourceMappingURL=isDate.js.mapexport function isFunction(value) {
    return typeof value === 'function';
}
//# sourceMappingURL=isFunction.js.mapimport { observable as Symbol_observable } from '../symbol/observable';
import { isFunction } from './isFunction';
export function isInteropObservable(input) {
    return isFunction(input[Symbol_observable]);
}
//# sourceMappingURL=isInteropObservable.js.mapimport { iterator as Symbol_iterator } from '../symbol/iterator';
import { isFunction } from './isFunction';
export function isIterable(input) {
    return isFunction(input === null || input === void 0 ? void 0 : input[Symbol_iterator]);
}
//# sourceMappingURL=isIterable.js.mapimport { Observable } from '../Observable';
import { isFunction } from './isFunction';
export function isObservable(obj) {
    return !!obj && (obj instanceof Observable || (isFunction(obj.lift) && isFunction(obj.subscribe)));
}
//# sourceMappingURL=isObservable.js.mapimport { isFunction } from "./isFunction";
export function isPromise(value) {
    return isFunction(value === null || value === void 0 ? void 0 : value.then);
}
//# sourceMappingURL=isPromise.js.mapimport { __asyncGenerator, __await, __generator } from "tslib";
import { isFunction } from './isFunction';
export function readableStreamLikeToAsyncGenerator(readableStream) {
    return __asyncGenerator(this, arguments, function readableStreamLikeToAsyncGenerator_1() {
        var reader, _a, value, done;
        return __generator(this, function (_b) {
            switch (_b.label) {
                case 0:
                    reader = readableStream.getReader();
                    _b.label = 1;
                case 1:
                    _b.trys.push([1, , 9, 10]);
                    _b.label = 2;
                case 2:
                    if (!true) return [3, 8];
                    return [4, __await(reader.read())];
                case 3:
                    _a = _b.sent(), value = _a.value, done = _a.done;
                    if (!done) return [3, 5];
                    return [4, __await(void 0)];
                case 4: return [2, _b.sent()];
                case 5: return [4, __await(value)];
                case 6: return [4, _b.sent()];
                case 7:
                    _b.sent();
                    return [3, 2];
                case 8: return [3, 10];
                case 9:
                    reader.releaseLock();
                    return [7];
                case 10: return [2];
            }
        });
    });
}
export function isReadableStreamLike(obj) {
    return isFunction(obj === null || obj === void 0 ? void 0 : obj.getReader);
}
//# sourceMappingURL=isReadableStreamLike.js.mapimport { isFunction } from './isFunction';
export function isScheduler(value) {
    return value && isFunction(value.schedule);
}
//# sourceMappingURL=isScheduler.js.mapimport { isFunction } from './isFunction';
export function hasLift(source) {
    return isFunction(source === null || source === void 0 ? void 0 : source.lift);
}
export function operate(init) {
    return function (source) {
        if (hasLift(source)) {
            return source.lift(function (liftedSource) {
                try {
                    return init(liftedSource, this);
                }
                catch (err) {
                    this.error(err);
                }
            });
        }
        throw new TypeError('Unable to lift unknown Observable type');
    };
}
//# sourceMappingURL=lift.js.mapimport { __read, __spreadArray } from "tslib";
import { map } from "../operators/map";
var isArray = Array.isArray;
function callOrApply(fn, args) {
    return isArray(args) ? fn.apply(void 0, __spreadArray([], __read(args))) : fn(args);
}
export function mapOneOrManyArgs(fn) {
    return map(function (args) { return callOrApply(fn, args); });
}
//# sourceMappingURL=mapOneOrManyArgs.js.mapexport function noop() { }
//# sourceMappingURL=noop.js.mapexport function not(pred, thisArg) {
    return function (value, index) { return !pred.call(thisArg, value, index); };
}
//# sourceMappingURL=not.js.mapimport { identity } from './identity';
export function pipe() {
    var fns = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        fns[_i] = arguments[_i];
    }
    return pipeFromArray(fns);
}
export function pipeFromArray(fns) {
    if (fns.length === 0) {
        return identity;
    }
    if (fns.length === 1) {
        return fns[0];
    }
    return function piped(input) {
        return fns.reduce(function (prev, fn) { return fn(prev); }, input);
    };
}
//# sourceMappingURL=pipe.js.mapimport { config } from '../config';
import { timeoutProvider } from '../scheduler/timeoutProvider';
export function reportUnhandledError(err) {
    timeoutProvider.setTimeout(function () {
        var onUnhandledError = config.onUnhandledError;
        if (onUnhandledError) {
            onUnhandledError(err);
        }
        else {
            throw err;
        }
    });
}
//# sourceMappingURL=reportUnhandledError.js.mapexport var subscribeToArray = function (array) { return function (subscriber) {
    for (var i = 0, len = array.length; i < len && !subscriber.closed; i++) {
        subscriber.next(array[i]);
    }
    subscriber.complete();
}; };
//# sourceMappingURL=subscribeToArray.js.mapexport function createInvalidObservableTypeError(input) {
    return new TypeError("You provided " + (input !== null && typeof input === 'object' ? 'an invalid object' : "'" + input + "'") + " where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.");
}
//# sourceMappingURL=throwUnobservableError.js.mapexport {};
//# sourceMappingURL=workarounds.js.mapimport { __extends } from "tslib";
import { Observable } from '../Observable';
import { Subscription } from '../Subscription';
import { SubscriptionLoggable } from './SubscriptionLoggable';
import { applyMixins } from '../util/applyMixins';
import { observeNotification } from '../Notification';
var ColdObservable = (function (_super) {
    __extends(ColdObservable, _super);
    function ColdObservable(messages, scheduler) {
        var _this = _super.call(this, function (subscriber) {
            var observable = this;
            var index = observable.logSubscribedFrame();
            var subscription = new Subscription();
            subscription.add(new Subscription(function () {
                observable.logUnsubscribedFrame(index);
            }));
            observable.scheduleMessages(subscriber);
            return subscription;
        }) || this;
        _this.messages = messages;
        _this.subscriptions = [];
        _this.scheduler = scheduler;
        return _this;
    }
    ColdObservable.prototype.scheduleMessages = function (subscriber) {
        var messagesLength = this.messages.length;
        for (var i = 0; i < messagesLength; i++) {
            var message = this.messages[i];
            subscriber.add(this.scheduler.schedule(function (state) {
                var _a = state, notification = _a.message.notification, destination = _a.subscriber;
                observeNotification(notification, destination);
            }, message.frame, { message: message, subscriber: subscriber }));
        }
    };
    return ColdObservable;
}(Observable));
export { ColdObservable };
applyMixins(ColdObservable, [SubscriptionLoggable]);
//# sourceMappingURL=ColdObservable.js.mapimport { __extends } from "tslib";
import { Subject } from '../Subject';
import { Subscription } from '../Subscription';
import { SubscriptionLoggable } from './SubscriptionLoggable';
import { applyMixins } from '../util/applyMixins';
import { observeNotification } from '../Notification';
var HotObservable = (function (_super) {
    __extends(HotObservable, _super);
    function HotObservable(messages, scheduler) {
        var _this = _super.call(this) || this;
        _this.messages = messages;
        _this.subscriptions = [];
        _this.scheduler = scheduler;
        return _this;
    }
    HotObservable.prototype._subscribe = function (subscriber) {
        var subject = this;
        var index = subject.logSubscribedFrame();
        var subscription = new Subscription();
        subscription.add(new Subscription(function () {
            subject.logUnsubscribedFrame(index);
        }));
        subscription.add(_super.prototype._subscribe.call(this, subscriber));
        return subscription;
    };
    HotObservable.prototype.setup = function () {
        var subject = this;
        var messagesLength = subject.messages.length;
        var _loop_1 = function (i) {
            (function () {
                var _a = subject.messages[i], notification = _a.notification, frame = _a.frame;
                subject.scheduler.schedule(function () {
                    observeNotification(notification, subject);
                }, frame);
            })();
        };
        for (var i = 0; i < messagesLength; i++) {
            _loop_1(i);
        }
    };
    return HotObservable;
}(Subject));
export { HotObservable };
applyMixins(HotObservable, [SubscriptionLoggable]);
//# sourceMappingURL=HotObservable.js.mapvar SubscriptionLog = (function () {
    function SubscriptionLog(subscribedFrame, unsubscribedFrame) {
        if (unsubscribedFrame === void 0) { unsubscribedFrame = Infinity; }
        this.subscribedFrame = subscribedFrame;
        this.unsubscribedFrame = unsubscribedFrame;
    }
    return SubscriptionLog;
}());
export { SubscriptionLog };
//# sourceMappingURL=SubscriptionLog.js.mapimport { SubscriptionLog } from './SubscriptionLog';
var SubscriptionLoggable = (function () {
    function SubscriptionLoggable() {
        this.subscriptions = [];
    }
    SubscriptionLoggable.prototype.logSubscribedFrame = function () {
        this.subscriptions.push(new SubscriptionLog(this.scheduler.now()));
        return this.subscriptions.length - 1;
    };
    SubscriptionLoggable.prototype.logUnsubscribedFrame = function (index) {
        var subscriptionLogs = this.subscriptions;
        var oldSubscriptionLog = subscriptionLogs[index];
        subscriptionLogs[index] = new SubscriptionLog(oldSubscriptionLog.subscribedFrame, this.scheduler.now());
    };
    return SubscriptionLoggable;
}());
export { SubscriptionLoggable };
//# sourceMappingURL=SubscriptionLoggable.js.mapexport {};
//# sourceMappingURL=TestMessage.js.mapimport { __extends, __read, __spreadArray, __values } from "tslib";
import { Observable } from '../Observable';
import { ColdObservable } from './ColdObservable';
import { HotObservable } from './HotObservable';
import { SubscriptionLog } from './SubscriptionLog';
import { VirtualTimeScheduler, VirtualAction } from '../scheduler/VirtualTimeScheduler';
import { COMPLETE_NOTIFICATION, errorNotification, nextNotification } from '../NotificationFactories';
import { dateTimestampProvider } from '../scheduler/dateTimestampProvider';
import { performanceTimestampProvider } from '../scheduler/performanceTimestampProvider';
import { animationFrameProvider } from '../scheduler/animationFrameProvider';
import { immediateProvider } from '../scheduler/immediateProvider';
import { intervalProvider } from '../scheduler/intervalProvider';
import { timeoutProvider } from '../scheduler/timeoutProvider';
var defaultMaxFrame = 750;
var TestScheduler = (function (_super) {
    __extends(TestScheduler, _super);
    function TestScheduler(assertDeepEqual) {
        var _this = _super.call(this, VirtualAction, defaultMaxFrame) || this;
        _this.assertDeepEqual = assertDeepEqual;
        _this.hotObservables = [];
        _this.coldObservables = [];
        _this.flushTests = [];
        _this.runMode = false;
        return _this;
    }
    TestScheduler.prototype.createTime = function (marbles) {
        var indexOf = this.runMode ? marbles.trim().indexOf('|') : marbles.indexOf('|');
        if (indexOf === -1) {
            throw new Error('marble diagram for time should have a completion marker "|"');
        }
        return indexOf * TestScheduler.frameTimeFactor;
    };
    TestScheduler.prototype.createColdObservable = function (marbles, values, error) {
        if (marbles.indexOf('^') !== -1) {
            throw new Error('cold observable cannot have subscription offset "^"');
        }
        if (marbles.indexOf('!') !== -1) {
            throw new Error('cold observable cannot have unsubscription marker "!"');
        }
        var messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);
        var cold = new ColdObservable(messages, this);
        this.coldObservables.push(cold);
        return cold;
    };
    TestScheduler.prototype.createHotObservable = function (marbles, values, error) {
        if (marbles.indexOf('!') !== -1) {
            throw new Error('hot observable cannot have unsubscription marker "!"');
        }
        var messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);
        var subject = new HotObservable(messages, this);
        this.hotObservables.push(subject);
        return subject;
    };
    TestScheduler.prototype.materializeInnerObservable = function (observable, outerFrame) {
        var _this = this;
        var messages = [];
        observable.subscribe({
            next: function (value) {
                messages.push({ frame: _this.frame - outerFrame, notification: nextNotification(value) });
            },
            error: function (error) {
                messages.push({ frame: _this.frame - outerFrame, notification: errorNotification(error) });
            },
            complete: function () {
                messages.push({ frame: _this.frame - outerFrame, notification: COMPLETE_NOTIFICATION });
            },
        });
        return messages;
    };
    TestScheduler.prototype.expectObservable = function (observable, subscriptionMarbles) {
        var _this = this;
        if (subscriptionMarbles === void 0) { subscriptionMarbles = null; }
        var actual = [];
        var flushTest = { actual: actual, ready: false };
        var subscriptionParsed = TestScheduler.parseMarblesAsSubscriptions(subscriptionMarbles, this.runMode);
        var subscriptionFrame = subscriptionParsed.subscribedFrame === Infinity ? 0 : subscriptionParsed.subscribedFrame;
        var unsubscriptionFrame = subscriptionParsed.unsubscribedFrame;
        var subscription;
        this.schedule(function () {
            subscription = observable.subscribe({
                next: function (x) {
                    var value = x instanceof Observable ? _this.materializeInnerObservable(x, _this.frame) : x;
                    actual.push({ frame: _this.frame, notification: nextNotification(value) });
                },
                error: function (error) {
                    actual.push({ frame: _this.frame, notification: errorNotification(error) });
                },
                complete: function () {
                    actual.push({ frame: _this.frame, notification: COMPLETE_NOTIFICATION });
                },
            });
        }, subscriptionFrame);
        if (unsubscriptionFrame !== Infinity) {
            this.schedule(function () { return subscription.unsubscribe(); }, unsubscriptionFrame);
        }
        this.flushTests.push(flushTest);
        var runMode = this.runMode;
        return {
            toBe: function (marbles, values, errorValue) {
                flushTest.ready = true;
                flushTest.expected = TestScheduler.parseMarbles(marbles, values, errorValue, true, runMode);
            },
            toEqual: function (other) {
                flushTest.ready = true;
                flushTest.expected = [];
                _this.schedule(function () {
                    subscription = other.subscribe({
                        next: function (x) {
                            var value = x instanceof Observable ? _this.materializeInnerObservable(x, _this.frame) : x;
                            flushTest.expected.push({ frame: _this.frame, notification: nextNotification(value) });
                        },
                        error: function (error) {
                            flushTest.expected.push({ frame: _this.frame, notification: errorNotification(error) });
                        },
                        complete: function () {
                            flushTest.expected.push({ frame: _this.frame, notification: COMPLETE_NOTIFICATION });
                        },
                    });
                }, subscriptionFrame);
            },
        };
    };
    TestScheduler.prototype.expectSubscriptions = function (actualSubscriptionLogs) {
        var flushTest = { actual: actualSubscriptionLogs, ready: false };
        this.flushTests.push(flushTest);
        var runMode = this.runMode;
        return {
            toBe: function (marblesOrMarblesArray) {
                var marblesArray = typeof marblesOrMarblesArray === 'string' ? [marblesOrMarblesArray] : marblesOrMarblesArray;
                flushTest.ready = true;
                flushTest.expected = marblesArray
                    .map(function (marbles) { return TestScheduler.parseMarblesAsSubscriptions(marbles, runMode); })
                    .filter(function (marbles) { return marbles.subscribedFrame !== Infinity; });
            },
        };
    };
    TestScheduler.prototype.flush = function () {
        var _this = this;
        var hotObservables = this.hotObservables;
        while (hotObservables.length > 0) {
            hotObservables.shift().setup();
        }
        _super.prototype.flush.call(this);
        this.flushTests = this.flushTests.filter(function (test) {
            if (test.ready) {
                _this.assertDeepEqual(test.actual, test.expected);
                return false;
            }
            return true;
        });
    };
    TestScheduler.parseMarblesAsSubscriptions = function (marbles, runMode) {
        var _this = this;
        if (runMode === void 0) { runMode = false; }
        if (typeof marbles !== 'string') {
            return new SubscriptionLog(Infinity);
        }
        var characters = __spreadArray([], __read(marbles));
        var len = characters.length;
        var groupStart = -1;
        var subscriptionFrame = Infinity;
        var unsubscriptionFrame = Infinity;
        var frame = 0;
        var _loop_1 = function (i) {
            var nextFrame = frame;
            var advanceFrameBy = function (count) {
                nextFrame += count * _this.frameTimeFactor;
            };
            var c = characters[i];
            switch (c) {
                case ' ':
                    if (!runMode) {
                        advanceFrameBy(1);
                    }
                    break;
                case '-':
                    advanceFrameBy(1);
                    break;
                case '(':
                    groupStart = frame;
                    advanceFrameBy(1);
                    break;
                case ')':
                    groupStart = -1;
                    advanceFrameBy(1);
                    break;
                case '^':
                    if (subscriptionFrame !== Infinity) {
                        throw new Error("found a second subscription point '^' in a " + 'subscription marble diagram. There can only be one.');
                    }
                    subscriptionFrame = groupStart > -1 ? groupStart : frame;
                    advanceFrameBy(1);
                    break;
                case '!':
                    if (unsubscriptionFrame !== Infinity) {
                        throw new Error("found a second unsubscription point '!' in a " + 'subscription marble diagram. There can only be one.');
                    }
                    unsubscriptionFrame = groupStart > -1 ? groupStart : frame;
                    break;
                default:
                    if (runMode && c.match(/^[0-9]$/)) {
                        if (i === 0 || characters[i - 1] === ' ') {
                            var buffer = characters.slice(i).join('');
                            var match = buffer.match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);
                            if (match) {
                                i += match[0].length - 1;
                                var duration = parseFloat(match[1]);
                                var unit = match[2];
                                var durationInMs = void 0;
                                switch (unit) {
                                    case 'ms':
                                        durationInMs = duration;
                                        break;
                                    case 's':
                                        durationInMs = duration * 1000;
                                        break;
                                    case 'm':
                                        durationInMs = duration * 1000 * 60;
                                        break;
                                    default:
                                        break;
                                }
                                advanceFrameBy(durationInMs / this_1.frameTimeFactor);
                                break;
                            }
                        }
                    }
                    throw new Error("there can only be '^' and '!' markers in a " + "subscription marble diagram. Found instead '" + c + "'.");
            }
            frame = nextFrame;
            out_i_1 = i;
        };
        var this_1 = this, out_i_1;
        for (var i = 0; i < len; i++) {
            _loop_1(i);
            i = out_i_1;
        }
        if (unsubscriptionFrame < 0) {
            return new SubscriptionLog(subscriptionFrame);
        }
        else {
            return new SubscriptionLog(subscriptionFrame, unsubscriptionFrame);
        }
    };
    TestScheduler.parseMarbles = function (marbles, values, errorValue, materializeInnerObservables, runMode) {
        var _this = this;
        if (materializeInnerObservables === void 0) { materializeInnerObservables = false; }
        if (runMode === void 0) { runMode = false; }
        if (marbles.indexOf('!') !== -1) {
            throw new Error('conventional marble diagrams cannot have the ' + 'unsubscription marker "!"');
        }
        var characters = __spreadArray([], __read(marbles));
        var len = characters.length;
        var testMessages = [];
        var subIndex = runMode ? marbles.replace(/^[ ]+/, '').indexOf('^') : marbles.indexOf('^');
        var frame = subIndex === -1 ? 0 : subIndex * -this.frameTimeFactor;
        var getValue = typeof values !== 'object'
            ? function (x) { return x; }
            : function (x) {
                if (materializeInnerObservables && values[x] instanceof ColdObservable) {
                    return values[x].messages;
                }
                return values[x];
            };
        var groupStart = -1;
        var _loop_2 = function (i) {
            var nextFrame = frame;
            var advanceFrameBy = function (count) {
                nextFrame += count * _this.frameTimeFactor;
            };
            var notification = void 0;
            var c = characters[i];
            switch (c) {
                case ' ':
                    if (!runMode) {
                        advanceFrameBy(1);
                    }
                    break;
                case '-':
                    advanceFrameBy(1);
                    break;
                case '(':
                    groupStart = frame;
                    advanceFrameBy(1);
                    break;
                case ')':
                    groupStart = -1;
                    advanceFrameBy(1);
                    break;
                case '|':
                    notification = COMPLETE_NOTIFICATION;
                    advanceFrameBy(1);
                    break;
                case '^':
                    advanceFrameBy(1);
                    break;
                case '#':
                    notification = errorNotification(errorValue || 'error');
                    advanceFrameBy(1);
                    break;
                default:
                    if (runMode && c.match(/^[0-9]$/)) {
                        if (i === 0 || characters[i - 1] === ' ') {
                            var buffer = characters.slice(i).join('');
                            var match = buffer.match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);
                            if (match) {
                                i += match[0].length - 1;
                                var duration = parseFloat(match[1]);
                                var unit = match[2];
                                var durationInMs = void 0;
                                switch (unit) {
                                    case 'ms':
                                        durationInMs = duration;
                                        break;
                                    case 's':
                                        durationInMs = duration * 1000;
                                        break;
                                    case 'm':
                                        durationInMs = duration * 1000 * 60;
                                        break;
                                    default:
                                        break;
                                }
                                advanceFrameBy(durationInMs / this_2.frameTimeFactor);
                                break;
                            }
                        }
                    }
                    notification = nextNotification(getValue(c));
                    advanceFrameBy(1);
                    break;
            }
            if (notification) {
                testMessages.push({ frame: groupStart > -1 ? groupStart : frame, notification: notification });
            }
            frame = nextFrame;
            out_i_2 = i;
        };
        var this_2 = this, out_i_2;
        for (var i = 0; i < len; i++) {
            _loop_2(i);
            i = out_i_2;
        }
        return testMessages;
    };
    TestScheduler.prototype.createAnimator = function () {
        var _this = this;
        if (!this.runMode) {
            throw new Error('animate() must only be used in run mode');
        }
        var lastHandle = 0;
        var map;
        var delegate = {
            requestAnimationFrame: function (callback) {
                if (!map) {
                    throw new Error('animate() was not called within run()');
                }
                var handle = ++lastHandle;
                map.set(handle, callback);
                return handle;
            },
            cancelAnimationFrame: function (handle) {
                if (!map) {
                    throw new Error('animate() was not called within run()');
                }
                map.delete(handle);
            },
        };
        var animate = function (marbles) {
            var e_1, _a;
            if (map) {
                throw new Error('animate() must not be called more than once within run()');
            }
            if (/[|#]/.test(marbles)) {
                throw new Error('animate() must not complete or error');
            }
            map = new Map();
            var messages = TestScheduler.parseMarbles(marbles, undefined, undefined, undefined, true);
            try {
                for (var messages_1 = __values(messages), messages_1_1 = messages_1.next(); !messages_1_1.done; messages_1_1 = messages_1.next()) {
                    var message = messages_1_1.value;
                    _this.schedule(function () {
                        var e_2, _a;
                        var now = _this.now();
                        var callbacks = Array.from(map.values());
                        map.clear();
                        try {
                            for (var callbacks_1 = (e_2 = void 0, __values(callbacks)), callbacks_1_1 = callbacks_1.next(); !callbacks_1_1.done; callbacks_1_1 = callbacks_1.next()) {
                                var callback = callbacks_1_1.value;
                                callback(now);
                            }
                        }
                        catch (e_2_1) { e_2 = { error: e_2_1 }; }
                        finally {
                            try {
                                if (callbacks_1_1 && !callbacks_1_1.done && (_a = callbacks_1.return)) _a.call(callbacks_1);
                            }
                            finally { if (e_2) throw e_2.error; }
                        }
                    }, message.frame);
                }
            }
            catch (e_1_1) { e_1 = { error: e_1_1 }; }
            finally {
                try {
                    if (messages_1_1 && !messages_1_1.done && (_a = messages_1.return)) _a.call(messages_1);
                }
                finally { if (e_1) throw e_1.error; }
            }
        };
        return { animate: animate, delegate: delegate };
    };
    TestScheduler.prototype.createDelegates = function () {
        var _this = this;
        var lastHandle = 0;
        var scheduleLookup = new Map();
        var run = function () {
            var now = _this.now();
            var scheduledRecords = Array.from(scheduleLookup.values());
            var scheduledRecordsDue = scheduledRecords.filter(function (_a) {
                var due = _a.due;
                return due <= now;
            });
            var dueImmediates = scheduledRecordsDue.filter(function (_a) {
                var type = _a.type;
                return type === 'immediate';
            });
            if (dueImmediates.length > 0) {
                var _a = dueImmediates[0], handle = _a.handle, handler = _a.handler;
                scheduleLookup.delete(handle);
                handler();
                return;
            }
            var dueIntervals = scheduledRecordsDue.filter(function (_a) {
                var type = _a.type;
                return type === 'interval';
            });
            if (dueIntervals.length > 0) {
                var firstDueInterval = dueIntervals[0];
                var duration = firstDueInterval.duration, handler = firstDueInterval.handler;
                firstDueInterval.due = now + duration;
                firstDueInterval.subscription = _this.schedule(run, duration);
                handler();
                return;
            }
            var dueTimeouts = scheduledRecordsDue.filter(function (_a) {
                var type = _a.type;
                return type === 'timeout';
            });
            if (dueTimeouts.length > 0) {
                var _b = dueTimeouts[0], handle = _b.handle, handler = _b.handler;
                scheduleLookup.delete(handle);
                handler();
                return;
            }
            throw new Error('Expected a due immediate or interval');
        };
        var immediate = {
            setImmediate: function (handler) {
                var handle = ++lastHandle;
                scheduleLookup.set(handle, {
                    due: _this.now(),
                    duration: 0,
                    handle: handle,
                    handler: handler,
                    subscription: _this.schedule(run, 0),
                    type: 'immediate',
                });
                return handle;
            },
            clearImmediate: function (handle) {
                var value = scheduleLookup.get(handle);
                if (value) {
                    value.subscription.unsubscribe();
                    scheduleLookup.delete(handle);
                }
            },
        };
        var interval = {
            setInterval: function (handler, duration) {
                if (duration === void 0) { duration = 0; }
                var handle = ++lastHandle;
                scheduleLookup.set(handle, {
                    due: _this.now() + duration,
                    duration: duration,
                    handle: handle,
                    handler: handler,
                    subscription: _this.schedule(run, duration),
                    type: 'interval',
                });
                return handle;
            },
            clearInterval: function (handle) {
                var value = scheduleLookup.get(handle);
                if (value) {
                    value.subscription.unsubscribe();
                    scheduleLookup.delete(handle);
                }
            },
        };
        var timeout = {
            setTimeout: function (handler, duration) {
                if (duration === void 0) { duration = 0; }
                var handle = ++lastHandle;
                scheduleLookup.set(handle, {
                    due: _this.now() + duration,
                    duration: duration,
                    handle: handle,
                    handler: handler,
                    subscription: _this.schedule(run, duration),
                    type: 'timeout',
                });
                return handle;
            },
            clearTimeout: function (handle) {
                var value = scheduleLookup.get(handle);
                if (value) {
                    value.subscription.unsubscribe();
                    scheduleLookup.delete(handle);
                }
            },
        };
        return { immediate: immediate, interval: interval, timeout: timeout };
    };
    TestScheduler.prototype.run = function (callback) {
        var prevFrameTimeFactor = TestScheduler.frameTimeFactor;
        var prevMaxFrames = this.maxFrames;
        TestScheduler.frameTimeFactor = 1;
        this.maxFrames = Infinity;
        this.runMode = true;
        var animator = this.createAnimator();
        var delegates = this.createDelegates();
        animationFrameProvider.delegate = animator.delegate;
        dateTimestampProvider.delegate = this;
        immediateProvider.delegate = delegates.immediate;
        intervalProvider.delegate = delegates.interval;
        timeoutProvider.delegate = delegates.timeout;
        performanceTimestampProvider.delegate = this;
        var helpers = {
            cold: this.createColdObservable.bind(this),
            hot: this.createHotObservable.bind(this),
            flush: this.flush.bind(this),
            time: this.createTime.bind(this),
            expectObservable: this.expectObservable.bind(this),
            expectSubscriptions: this.expectSubscriptions.bind(this),
            animate: animator.animate,
        };
        try {
            var ret = callback(helpers);
            this.flush();
            return ret;
        }
        finally {
            TestScheduler.frameTimeFactor = prevFrameTimeFactor;
            this.maxFrames = prevMaxFrames;
            this.runMode = false;
            animationFrameProvider.delegate = undefined;
            dateTimestampProvider.delegate = undefined;
            immediateProvider.delegate = undefined;
            intervalProvider.delegate = undefined;
            timeoutProvider.delegate = undefined;
            performanceTimestampProvider.delegate = undefined;
        }
    };
    TestScheduler.frameTimeFactor = 10;
    return TestScheduler;
}(VirtualTimeScheduler));
export { TestScheduler };
//# sourceMappingURL=TestScheduler.js.mapexport function getSymbolIterator() {
    if (typeof Symbol !== 'function' || !Symbol.iterator) {
        return '@@iterator';
    }
    return Symbol.iterator;
}
export var iterator = getSymbolIterator();
//# sourceMappingURL=iterator.js.mapexport var observable = (function () { return (typeof Symbol === 'function' && Symbol.observable) || '@@observable'; })();
//# sourceMappingURL=observable.js.mapimport { __extends } from "tslib";
import { Subscription } from '../Subscription';
var Action = (function (_super) {
    __extends(Action, _super);
    function Action(scheduler, work) {
        return _super.call(this) || this;
    }
    Action.prototype.schedule = function (state, delay) {
        if (delay === void 0) { delay = 0; }
        return this;
    };
    return Action;
}(Subscription));
export { Action };
//# sourceMappingURL=Action.js.mapimport { __extends } from "tslib";
import { AsyncAction } from './AsyncAction';
import { animationFrameProvider } from './animationFrameProvider';
var AnimationFrameAction = (function (_super) {
    __extends(AnimationFrameAction, _super);
    function AnimationFrameAction(scheduler, work) {
        var _this = _super.call(this, scheduler, work) || this;
        _this.scheduler = scheduler;
        _this.work = work;
        return _this;
    }
    AnimationFrameAction.prototype.requestAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        if (delay !== null && delay > 0) {
            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
        }
        scheduler.actions.push(this);
        return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(function () { return scheduler.flush(undefined); }));
    };
    AnimationFrameAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {
            return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);
        }
        if (!scheduler.actions.some(function (action) { return action.id === id; })) {
            animationFrameProvider.cancelAnimationFrame(id);
            scheduler._scheduled = undefined;
        }
        return undefined;
    };
    return AnimationFrameAction;
}(AsyncAction));
export { AnimationFrameAction };
//# sourceMappingURL=AnimationFrameAction.js.mapimport { __extends } from "tslib";
import { AsyncScheduler } from './AsyncScheduler';
var AnimationFrameScheduler = (function (_super) {
    __extends(AnimationFrameScheduler, _super);
    function AnimationFrameScheduler() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    AnimationFrameScheduler.prototype.flush = function (action) {
        this._active = true;
        var flushId = this._scheduled;
        this._scheduled = undefined;
        var actions = this.actions;
        var error;
        action = action || actions.shift();
        do {
            if ((error = action.execute(action.state, action.delay))) {
                break;
            }
        } while ((action = actions[0]) && action.id === flushId && actions.shift());
        this._active = false;
        if (error) {
            while ((action = actions[0]) && action.id === flushId && actions.shift()) {
                action.unsubscribe();
            }
            throw error;
        }
    };
    return AnimationFrameScheduler;
}(AsyncScheduler));
export { AnimationFrameScheduler };
//# sourceMappingURL=AnimationFrameScheduler.js.mapimport { __extends } from "tslib";
import { AsyncAction } from './AsyncAction';
import { immediateProvider } from './immediateProvider';
var AsapAction = (function (_super) {
    __extends(AsapAction, _super);
    function AsapAction(scheduler, work) {
        var _this = _super.call(this, scheduler, work) || this;
        _this.scheduler = scheduler;
        _this.work = work;
        return _this;
    }
    AsapAction.prototype.requestAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        if (delay !== null && delay > 0) {
            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
        }
        scheduler.actions.push(this);
        return scheduler._scheduled || (scheduler._scheduled = immediateProvider.setImmediate(scheduler.flush.bind(scheduler, undefined)));
    };
    AsapAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {
            return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);
        }
        if (!scheduler.actions.some(function (action) { return action.id === id; })) {
            immediateProvider.clearImmediate(id);
            scheduler._scheduled = undefined;
        }
        return undefined;
    };
    return AsapAction;
}(AsyncAction));
export { AsapAction };
//# sourceMappingURL=AsapAction.js.mapimport { __extends } from "tslib";
import { AsyncScheduler } from './AsyncScheduler';
var AsapScheduler = (function (_super) {
    __extends(AsapScheduler, _super);
    function AsapScheduler() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    AsapScheduler.prototype.flush = function (action) {
        this._active = true;
        var flushId = this._scheduled;
        this._scheduled = undefined;
        var actions = this.actions;
        var error;
        action = action || actions.shift();
        do {
            if ((error = action.execute(action.state, action.delay))) {
                break;
            }
        } while ((action = actions[0]) && action.id === flushId && actions.shift());
        this._active = false;
        if (error) {
            while ((action = actions[0]) && action.id === flushId && actions.shift()) {
                action.unsubscribe();
            }
            throw error;
        }
    };
    return AsapScheduler;
}(AsyncScheduler));
export { AsapScheduler };
//# sourceMappingURL=AsapScheduler.js.mapimport { __extends } from "tslib";
import { Action } from './Action';
import { intervalProvider } from './intervalProvider';
import { arrRemove } from '../util/arrRemove';
var AsyncAction = (function (_super) {
    __extends(AsyncAction, _super);
    function AsyncAction(scheduler, work) {
        var _this = _super.call(this, scheduler, work) || this;
        _this.scheduler = scheduler;
        _this.work = work;
        _this.pending = false;
        return _this;
    }
    AsyncAction.prototype.schedule = function (state, delay) {
        if (delay === void 0) { delay = 0; }
        if (this.closed) {
            return this;
        }
        this.state = state;
        var id = this.id;
        var scheduler = this.scheduler;
        if (id != null) {
            this.id = this.recycleAsyncId(scheduler, id, delay);
        }
        this.pending = true;
        this.delay = delay;
        this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);
        return this;
    };
    AsyncAction.prototype.requestAsyncId = function (scheduler, _id, delay) {
        if (delay === void 0) { delay = 0; }
        return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);
    };
    AsyncAction.prototype.recycleAsyncId = function (_scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        if (delay != null && this.delay === delay && this.pending === false) {
            return id;
        }
        intervalProvider.clearInterval(id);
        return undefined;
    };
    AsyncAction.prototype.execute = function (state, delay) {
        if (this.closed) {
            return new Error('executing a cancelled action');
        }
        this.pending = false;
        var error = this._execute(state, delay);
        if (error) {
            return error;
        }
        else if (this.pending === false && this.id != null) {
            this.id = this.recycleAsyncId(this.scheduler, this.id, null);
        }
    };
    AsyncAction.prototype._execute = function (state, _delay) {
        var errored = false;
        var errorValue;
        try {
            this.work(state);
        }
        catch (e) {
            errored = true;
            errorValue = e ? e : new Error('Scheduled action threw falsy error');
        }
        if (errored) {
            this.unsubscribe();
            return errorValue;
        }
    };
    AsyncAction.prototype.unsubscribe = function () {
        if (!this.closed) {
            var _a = this, id = _a.id, scheduler = _a.scheduler;
            var actions = scheduler.actions;
            this.work = this.state = this.scheduler = null;
            this.pending = false;
            arrRemove(actions, this);
            if (id != null) {
                this.id = this.recycleAsyncId(scheduler, id, null);
            }
            this.delay = null;
            _super.prototype.unsubscribe.call(this);
        }
    };
    return AsyncAction;
}(Action));
export { AsyncAction };
//# sourceMappingURL=AsyncAction.js.mapimport { __extends } from "tslib";
import { Scheduler } from '../Scheduler';
var AsyncScheduler = (function (_super) {
    __extends(AsyncScheduler, _super);
    function AsyncScheduler(SchedulerAction, now) {
        if (now === void 0) { now = Scheduler.now; }
        var _this = _super.call(this, SchedulerAction, now) || this;
        _this.actions = [];
        _this._active = false;
        _this._scheduled = undefined;
        return _this;
    }
    AsyncScheduler.prototype.flush = function (action) {
        var actions = this.actions;
        if (this._active) {
            actions.push(action);
            return;
        }
        var error;
        this._active = true;
        do {
            if ((error = action.execute(action.state, action.delay))) {
                break;
            }
        } while ((action = actions.shift()));
        this._active = false;
        if (error) {
            while ((action = actions.shift())) {
                action.unsubscribe();
            }
            throw error;
        }
    };
    return AsyncScheduler;
}(Scheduler));
export { AsyncScheduler };
//# sourceMappingURL=AsyncScheduler.js.mapimport { __extends } from "tslib";
import { AsyncAction } from './AsyncAction';
var QueueAction = (function (_super) {
    __extends(QueueAction, _super);
    function QueueAction(scheduler, work) {
        var _this = _super.call(this, scheduler, work) || this;
        _this.scheduler = scheduler;
        _this.work = work;
        return _this;
    }
    QueueAction.prototype.schedule = function (state, delay) {
        if (delay === void 0) { delay = 0; }
        if (delay > 0) {
            return _super.prototype.schedule.call(this, state, delay);
        }
        this.delay = delay;
        this.state = state;
        this.scheduler.flush(this);
        return this;
    };
    QueueAction.prototype.execute = function (state, delay) {
        return (delay > 0 || this.closed) ?
            _super.prototype.execute.call(this, state, delay) :
            this._execute(state, delay);
    };
    QueueAction.prototype.requestAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {
            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
        }
        return scheduler.flush(this);
    };
    return QueueAction;
}(AsyncAction));
export { QueueAction };
//# sourceMappingURL=QueueAction.js.mapimport { __extends } from "tslib";
import { AsyncScheduler } from './AsyncScheduler';
var QueueScheduler = (function (_super) {
    __extends(QueueScheduler, _super);
    function QueueScheduler() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    return QueueScheduler;
}(AsyncScheduler));
export { QueueScheduler };
//# sourceMappingURL=QueueScheduler.js.mapimport { __extends } from "tslib";
import { AsyncAction } from './AsyncAction';
import { Subscription } from '../Subscription';
import { AsyncScheduler } from './AsyncScheduler';
var VirtualTimeScheduler = (function (_super) {
    __extends(VirtualTimeScheduler, _super);
    function VirtualTimeScheduler(schedulerActionCtor, maxFrames) {
        if (schedulerActionCtor === void 0) { schedulerActionCtor = VirtualAction; }
        if (maxFrames === void 0) { maxFrames = Infinity; }
        var _this = _super.call(this, schedulerActionCtor, function () { return _this.frame; }) || this;
        _this.maxFrames = maxFrames;
        _this.frame = 0;
        _this.index = -1;
        return _this;
    }
    VirtualTimeScheduler.prototype.flush = function () {
        var _a = this, actions = _a.actions, maxFrames = _a.maxFrames;
        var error;
        var action;
        while ((action = actions[0]) && action.delay <= maxFrames) {
            actions.shift();
            this.frame = action.delay;
            if ((error = action.execute(action.state, action.delay))) {
                break;
            }
        }
        if (error) {
            while ((action = actions.shift())) {
                action.unsubscribe();
            }
            throw error;
        }
    };
    VirtualTimeScheduler.frameTimeFactor = 10;
    return VirtualTimeScheduler;
}(AsyncScheduler));
export { VirtualTimeScheduler };
var VirtualAction = (function (_super) {
    __extends(VirtualAction, _super);
    function VirtualAction(scheduler, work, index) {
        if (index === void 0) { index = (scheduler.index += 1); }
        var _this = _super.call(this, scheduler, work) || this;
        _this.scheduler = scheduler;
        _this.work = work;
        _this.index = index;
        _this.active = true;
        _this.index = scheduler.index = index;
        return _this;
    }
    VirtualAction.prototype.schedule = function (state, delay) {
        if (delay === void 0) { delay = 0; }
        if (Number.isFinite(delay)) {
            if (!this.id) {
                return _super.prototype.schedule.call(this, state, delay);
            }
            this.active = false;
            var action = new VirtualAction(this.scheduler, this.work);
            this.add(action);
            return action.schedule(state, delay);
        }
        else {
            return Subscription.EMPTY;
        }
    };
    VirtualAction.prototype.requestAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        this.delay = scheduler.frame + delay;
        var actions = scheduler.actions;
        actions.push(this);
        actions.sort(VirtualAction.sortActions);
        return true;
    };
    VirtualAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        return undefined;
    };
    VirtualAction.prototype._execute = function (state, delay) {
        if (this.active === true) {
            return _super.prototype._execute.call(this, state, delay);
        }
    };
    VirtualAction.sortActions = function (a, b) {
        if (a.delay === b.delay) {
            if (a.index === b.index) {
                return 0;
            }
            else if (a.index > b.index) {
                return 1;
            }
            else {
                return -1;
            }
        }
        else if (a.delay > b.delay) {
            return 1;
        }
        else {
            return -1;
        }
    };
    return VirtualAction;
}(AsyncAction));
export { VirtualAction };
//# sourceMappingURL=VirtualTimeScheduler.js.mapimport { AnimationFrameAction } from './AnimationFrameAction';
import { AnimationFrameScheduler } from './AnimationFrameScheduler';
export var animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);
export var animationFrame = animationFrameScheduler;
//# sourceMappingURL=animationFrame.js.mapimport { __read, __spreadArray } from "tslib";
import { Subscription } from '../Subscription';
export var animationFrameProvider = {
    schedule: function (callback) {
        var request = requestAnimationFrame;
        var cancel = cancelAnimationFrame;
        var delegate = animationFrameProvider.delegate;
        if (delegate) {
            request = delegate.requestAnimationFrame;
            cancel = delegate.cancelAnimationFrame;
        }
        var handle = request(function (timestamp) {
            cancel = undefined;
            callback(timestamp);
        });
        return new Subscription(function () { return cancel === null || cancel === void 0 ? void 0 : cancel(handle); });
    },
    requestAnimationFrame: function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        var delegate = animationFrameProvider.delegate;
        return ((delegate === null || delegate === void 0 ? void 0 : delegate.requestAnimationFrame) || requestAnimationFrame).apply(void 0, __spreadArray([], __read(args)));
    },
    cancelAnimationFrame: function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        var delegate = animationFrameProvider.delegate;
        return ((delegate === null || delegate === void 0 ? void 0 : delegate.cancelAnimationFrame) || cancelAnimationFrame).apply(void 0, __spreadArray([], __read(args)));
    },
    delegate: undefined,
};
//# sourceMappingURL=animationFrameProvider.js.mapimport { AsapAction } from './AsapAction';
import { AsapScheduler } from './AsapScheduler';
export var asapScheduler = new AsapScheduler(AsapAction);
export var asap = asapScheduler;
//# sourceMappingURL=asap.js.mapimport { AsyncAction } from './AsyncAction';
import { AsyncScheduler } from './AsyncScheduler';
export var asyncScheduler = new AsyncScheduler(AsyncAction);
export var async = asyncScheduler;
//# sourceMappingURL=async.js.mapexport var dateTimestampProvider = {
    now: function () {
        return (dateTimestampProvider.delegate || Date).now();
    },
    delegate: undefined,
};
//# sourceMappingURL=dateTimestampProvider.js.mapimport { __read, __spreadArray } from "tslib";
import { Immediate } from '../util/Immediate';
var setImmediate = Immediate.setImmediate, clearImmediate = Immediate.clearImmediate;
export var immediateProvider = {
    setImmediate: function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        var delegate = immediateProvider.delegate;
        return ((delegate === null || delegate === void 0 ? void 0 : delegate.setImmediate) || setImmediate).apply(void 0, __spreadArray([], __read(args)));
    },
    clearImmediate: function (handle) {
        var delegate = immediateProvider.delegate;
        return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearImmediate) || clearImmediate)(handle);
    },
    delegate: undefined,
};
//# sourceMappingURL=immediateProvider.js.mapimport { __read, __spreadArray } from "tslib";
export var intervalProvider = {
    setInterval: function (handler, timeout) {
        var args = [];
        for (var _i = 2; _i < arguments.length; _i++) {
            args[_i - 2] = arguments[_i];
        }
        var delegate = intervalProvider.delegate;
        if (delegate === null || delegate === void 0 ? void 0 : delegate.setInterval) {
            return delegate.setInterval.apply(delegate, __spreadArray([handler, timeout], __read(args)));
        }
        return setInterval.apply(void 0, __spreadArray([handler, timeout], __read(args)));
    },
    clearInterval: function (handle) {
        var delegate = intervalProvider.delegate;
        return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearInterval) || clearInterval)(handle);
    },
    delegate: undefined,
};
//# sourceMappingURL=intervalProvider.js.mapexport var performanceTimestampProvider = {
    now: function () {
        return (performanceTimestampProvider.delegate || performance).now();
    },
    delegate: undefined,
};
//# sourceMappingURL=performanceTimestampProvider.js.mapimport { QueueAction } from './QueueAction';
import { QueueScheduler } from './QueueScheduler';
export var queueScheduler = new QueueScheduler(QueueAction);
export var queue = queueScheduler;
//# sourceMappingURL=queue.js.mapimport { __read, __spreadArray } from "tslib";
export var timeoutProvider = {
    setTimeout: function (handler, timeout) {
        var args = [];
        for (var _i = 2; _i < arguments.length; _i++) {
            args[_i - 2] = arguments[_i];
        }
        var delegate = timeoutProvider.delegate;
        if (delegate === null || delegate === void 0 ? void 0 : delegate.setTimeout) {
            return delegate.setTimeout.apply(delegate, __spreadArray([handler, timeout], __read(args)));
        }
        return setTimeout.apply(void 0, __spreadArray([handler, timeout], __read(args)));
    },
    clearTimeout: function (handle) {
        var delegate = timeoutProvider.delegate;
        return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearTimeout) || clearTimeout)(handle);
    },
    delegate: undefined,
};
//# sourceMappingURL=timeoutProvider.js.mapexport {};
//# sourceMappingURL=timerHandle.js.mapimport { Observable } from '../Observable';
export function scheduleArray(input, scheduler) {
    return new Observable(function (subscriber) {
        var i = 0;
        return scheduler.schedule(function () {
            if (i === input.length) {
                subscriber.complete();
            }
            else {
                subscriber.next(input[i++]);
                if (!subscriber.closed) {
                    this.schedule();
                }
            }
        });
    });
}
//# sourceMappingURL=scheduleArray.js.mapimport { Observable } from '../Observable';
import { executeSchedule } from '../util/executeSchedule';
export function scheduleAsyncIterable(input, scheduler) {
    if (!input) {
        throw new Error('Iterable cannot be null');
    }
    return new Observable(function (subscriber) {
        executeSchedule(subscriber, scheduler, function () {
            var iterator = input[Symbol.asyncIterator]();
            executeSchedule(subscriber, scheduler, function () {
                iterator.next().then(function (result) {
                    if (result.done) {
                        subscriber.complete();
                    }
                    else {
                        subscriber.next(result.value);
                    }
                });
            }, 0, true);
        });
    });
}
//# sourceMappingURL=scheduleAsyncIterable.js.mapimport { Observable } from '../Observable';
import { iterator as Symbol_iterator } from '../symbol/iterator';
import { isFunction } from '../util/isFunction';
import { executeSchedule } from '../util/executeSchedule';
export function scheduleIterable(input, scheduler) {
    return new Observable(function (subscriber) {
        var iterator;
        executeSchedule(subscriber, scheduler, function () {
            iterator = input[Symbol_iterator]();
            executeSchedule(subscriber, scheduler, function () {
                var _a;
                var value;
                var done;
                try {
                    (_a = iterator.next(), value = _a.value, done = _a.done);
                }
                catch (err) {
                    subscriber.error(err);
                    return;
                }
                if (done) {
                    subscriber.complete();
                }
                else {
                    subscriber.next(value);
                }
            }, 0, true);
        });
        return function () { return isFunction(iterator === null || iterator === void 0 ? void 0 : iterator.return) && iterator.return(); };
    });
}
//# sourceMappingURL=scheduleIterable.js.mapimport { innerFrom } from '../observable/innerFrom';
import { observeOn } from '../operators/observeOn';
import { subscribeOn } from '../operators/subscribeOn';
export function scheduleObservable(input, scheduler) {
    return innerFrom(input).pipe(subscribeOn(scheduler), observeOn(scheduler));
}
//# sourceMappingURL=scheduleObservable.js.mapimport { innerFrom } from '../observable/innerFrom';
import { observeOn } from '../operators/observeOn';
import { subscribeOn } from '../operators/subscribeOn';
export function schedulePromise(input, scheduler) {
    return innerFrom(input).pipe(subscribeOn(scheduler), observeOn(scheduler));
}
//# sourceMappingURL=schedulePromise.js.mapimport { scheduleAsyncIterable } from './scheduleAsyncIterable';
import { readableStreamLikeToAsyncGenerator } from '../util/isReadableStreamLike';
export function scheduleReadableStreamLike(input, scheduler) {
    return scheduleAsyncIterable(readableStreamLikeToAsyncGenerator(input), scheduler);
}
//# sourceMappingURL=scheduleReadableStreamLike.js.mapimport { scheduleObservable } from './scheduleObservable';
import { schedulePromise } from './schedulePromise';
import { scheduleArray } from './scheduleArray';
import { scheduleIterable } from './scheduleIterable';
import { scheduleAsyncIterable } from './scheduleAsyncIterable';
import { isInteropObservable } from '../util/isInteropObservable';
import { isPromise } from '../util/isPromise';
import { isArrayLike } from '../util/isArrayLike';
import { isIterable } from '../util/isIterable';
import { isAsyncIterable } from '../util/isAsyncIterable';
import { createInvalidObservableTypeError } from '../util/throwUnobservableError';
import { isReadableStreamLike } from '../util/isReadableStreamLike';
import { scheduleReadableStreamLike } from './scheduleReadableStreamLike';
export function scheduled(input, scheduler) {
    if (input != null) {
        if (isInteropObservable(input)) {
            return scheduleObservable(input, scheduler);
        }
        if (isArrayLike(input)) {
            return scheduleArray(input, scheduler);
        }
        if (isPromise(input)) {
            return schedulePromise(input, scheduler);
        }
        if (isAsyncIterable(input)) {
            return scheduleAsyncIterable(input, scheduler);
        }
        if (isIterable(input)) {
            return scheduleIterable(input, scheduler);
        }
        if (isReadableStreamLike(input)) {
            return scheduleReadableStreamLike(input, scheduler);
        }
    }
    throw createInvalidObservableTypeError(input);
}
//# sourceMappingURL=scheduled.js.mapimport { __extends } from "tslib";
import { Subscriber } from '../Subscriber';
export function createOperatorSubscriber(destination, onNext, onComplete, onError, onFinalize) {
    return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);
}
var OperatorSubscriber = (function (_super) {
    __extends(OperatorSubscriber, _super);
    function OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize, shouldUnsubscribe) {
        var _this = _super.call(this, destination) || this;
        _this.onFinalize = onFinalize;
        _this.shouldUnsubscribe = shouldUnsubscribe;
        _this._next = onNext
            ? function (value) {
                try {
                    onNext(value);
                }
                catch (err) {
                    destination.error(err);
                }
            }
            : _super.prototype._next;
        _this._error = onError
            ? function (err) {
                try {
                    onError(err);
                }
                catch (err) {
                    destination.error(err);
                }
                finally {
                    this.unsubscribe();
                }
            }
            : _super.prototype._error;
        _this._complete = onComplete
            ? function () {
                try {
                    onComplete();
                }
                catch (err) {
                    destination.error(err);
                }
                finally {
                    this.unsubscribe();
                }
            }
            : _super.prototype._complete;
        return _this;
    }
    OperatorSubscriber.prototype.unsubscribe = function () {
        var _a;
        if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {
            var closed_1 = this.closed;
            _super.prototype.unsubscribe.call(this);
            !closed_1 && ((_a = this.onFinalize) === null || _a === void 0 ? void 0 : _a.call(this));
        }
    };
    return OperatorSubscriber;
}(Subscriber));
export { OperatorSubscriber };
//# sourceMappingURL=OperatorSubscriber.js.mapimport { operate } from '../util/lift';
import { innerFrom } from '../observable/innerFrom';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function audit(durationSelector) {
    return operate(function (source, subscriber) {
        var hasValue = false;
        var lastValue = null;
        var durationSubscriber = null;
        var isComplete = false;
        var endDuration = function () {
            durationSubscriber === null || durationSubscriber === void 0 ? void 0 : durationSubscriber.unsubscribe();
            durationSubscriber = null;
            if (hasValue) {
                hasValue = false;
                var value = lastValue;
                lastValue = null;
                subscriber.next(value);
            }
            isComplete && subscriber.complete();
        };
        var cleanupDuration = function () {
            durationSubscriber = null;
            isComplete && subscriber.complete();
        };
        source.subscribe(createOperatorSubscriber(subscriber, function (value) {
            hasValue = true;
            lastValue = value;
            if (!durationSubscriber) {
                innerFrom(durationSelector(value)).subscribe((durationSubscriber = createOperatorSubscriber(subscriber, endDuration, cleanupDuration)));
            }
        }, function () {
            isComplete = true;
            (!hasValue || !durationSubscriber || durationSubscriber.closed) && subscriber.complete();
        }));
    });
}
//# sourceMappingURL=audit.js.mapimport { asyncScheduler } from '../scheduler/async';
import { audit } from './audit';
import { timer } from '../observable/timer';
export function auditTime(duration, scheduler) {
    if (scheduler === void 0) { scheduler = asyncScheduler; }
    return audit(function () { return timer(duration, scheduler); });
}
//# sourceMappingURL=auditTime.js.mapimport { operate } from '../util/lift';
import { noop } from '../util/noop';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function buffer(closingNotifier) {
    return operate(function (source, subscriber) {
        var currentBuffer = [];
        source.subscribe(createOperatorSubscriber(subscriber, function (value) { return currentBuffer.push(value); }, function () {
            subscriber.next(currentBuffer);
            subscriber.complete();
        }));
        closingNotifier.subscribe(createOperatorSubscriber(subscriber, function () {
            var b = currentBuffer;
            currentBuffer = [];
            subscriber.next(b);
        }, noop));
        return function () {
            currentBuffer = null;
        };
    });
}
//# sourceMappingURL=buffer.js.mapimport { __values } from "tslib";
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { arrRemove } from '../util/arrRemove';
export function bufferCount(bufferSize, startBufferEvery) {
    if (startBufferEvery === void 0) { startBufferEvery = null; }
    startBufferEvery = startBufferEvery !== null && startBufferEvery !== void 0 ? startBufferEvery : bufferSize;
    return operate(function (source, subscriber) {
        var buffers = [];
        var count = 0;
        source.subscribe(createOperatorSubscriber(subscriber, function (value) {
            var e_1, _a, e_2, _b;
            var toEmit = null;
            if (count++ % startBufferEvery === 0) {
                buffers.push([]);
            }
            try {
                for (var buffers_1 = __values(buffers), buffers_1_1 = buffers_1.next(); !buffers_1_1.done; buffers_1_1 = buffers_1.next()) {
                    var buffer = buffers_1_1.value;
                    buffer.push(value);
                    if (bufferSize <= buffer.length) {
                        toEmit = toEmit !== null && toEmit !== void 0 ? toEmit : [];
                        toEmit.push(buffer);
                    }
                }
            }
            catch (e_1_1) { e_1 = { error: e_1_1 }; }
            finally {
                try {
                    if (buffers_1_1 && !buffers_1_1.done && (_a = buffers_1.return)) _a.call(buffers_1);
                }
                finally { if (e_1) throw e_1.error; }
            }
            if (toEmit) {
                try {
                    for (var toEmit_1 = __values(toEmit), toEmit_1_1 = toEmit_1.next(); !toEmit_1_1.done; toEmit_1_1 = toEmit_1.next()) {
                        var buffer = toEmit_1_1.value;
                        arrRemove(buffers, buffer);
                        subscriber.next(buffer);
                    }
                }
                catch (e_2_1) { e_2 = { error: e_2_1 }; }
                finally {
                    try {
                        if (toEmit_1_1 && !toEmit_1_1.done && (_b = toEmit_1.return)) _b.call(toEmit_1);
                    }
                    finally { if (e_2) throw e_2.error; }
                }
            }
        }, function () {
            var e_3, _a;
            try {
                for (var buffers_2 = __values(buffers), buffers_2_1 = buffers_2.next(); !buffers_2_1.done; buffers_2_1 = buffers_2.next()) {
                    var buffer = buffers_2_1.value;
                    subscriber.next(buffer);
                }
            }
            catch (e_3_1) { e_3 = { error: e_3_1 }; }
            finally {
                try {
                    if (buffers_2_1 && !buffers_2_1.done && (_a = buffers_2.return)) _a.call(buffers_2);
                }
                finally { if (e_3) throw e_3.error; }
            }
            subscriber.complete();
        }, undefined, function () {
            buffers = null;
        }));
    });
}
//# sourceMappingURL=bufferCount.js.mapimport { __values } from "tslib";
import { Subscription } from '../Subscription';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { arrRemove } from '../util/arrRemove';
import { asyncScheduler } from '../scheduler/async';
import { popScheduler } from '../util/args';
import { executeSchedule } from '../util/executeSchedule';
export function bufferTime(bufferTimeSpan) {
    var _a, _b;
    var otherArgs = [];
    for (var _i = 1; _i < arguments.length; _i++) {
        otherArgs[_i - 1] = arguments[_i];
    }
    var scheduler = (_a = popScheduler(otherArgs)) !== null && _a !== void 0 ? _a : asyncScheduler;
    var bufferCreationInterval = (_b = otherArgs[0]) !== null && _b !== void 0 ? _b : null;
    var maxBufferSize = otherArgs[1] || Infinity;
    return operate(function (source, subscriber) {
        var bufferRecords = [];
        var restartOnEmit = false;
        var emit = function (record) {
            var buffer = record.buffer, subs = record.subs;
            subs.unsubscribe();
            arrRemove(bufferRecords, record);
            subscriber.next(buffer);
            restartOnEmit && startBuffer();
        };
        var startBuffer = function () {
            if (bufferRecords) {
                var subs = new Subscription();
                subscriber.add(subs);
                var buffer = [];
                var record_1 = {
                    buffer: buffer,
                    subs: subs,
                };
                bufferRecords.push(record_1);
                executeSchedule(subs, scheduler, function () { return emit(record_1); }, bufferTimeSpan);
            }
        };
        if (bufferCreationInterval !== null && bufferCreationInterval >= 0) {
            executeSchedule(subscriber, scheduler, startBuffer, bufferCreationInterval, true);
        }
        else {
            restartOnEmit = true;
        }
        startBuffer();
        var bufferTimeSubscriber = createOperatorSubscriber(subscriber, function (value) {
            var e_1, _a;
            var recordsCopy = bufferRecords.slice();
            try {
                for (var recordsCopy_1 = __values(recordsCopy), recordsCopy_1_1 = recordsCopy_1.next(); !recordsCopy_1_1.done; recordsCopy_1_1 = recordsCopy_1.next()) {
                    var record = recordsCopy_1_1.value;
                    var buffer = record.buffer;
                    buffer.push(value);
                    maxBufferSize <= buffer.length && emit(record);
                }
            }
            catch (e_1_1) { e_1 = { error: e_1_1 }; }
            finally {
                try {
                    if (recordsCopy_1_1 && !recordsCopy_1_1.done && (_a = recordsCopy_1.return)) _a.call(recordsCopy_1);
                }
                finally { if (e_1) throw e_1.error; }
            }
        }, function () {
            while (bufferRecords === null || bufferRecords === void 0 ? void 0 : bufferRecords.length) {
                subscriber.next(bufferRecords.shift().buffer);
            }
            bufferTimeSubscriber === null || bufferTimeSubscriber === void 0 ? void 0 : bufferTimeSubscriber.unsubscribe();
            subscriber.complete();
            subscriber.unsubscribe();
        }, undefined, function () { return (bufferRecords = null); });
        source.subscribe(bufferTimeSubscriber);
    });
}
//# sourceMappingURL=bufferTime.js.mapimport { __values } from "tslib";
import { Subscription } from '../Subscription';
import { operate } from '../util/lift';
import { innerFrom } from '../observable/innerFrom';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { noop } from '../util/noop';
import { arrRemove } from '../util/arrRemove';
export function bufferToggle(openings, closingSelector) {
    return operate(function (source, subscriber) {
        var buffers = [];
        innerFrom(openings).subscribe(createOperatorSubscriber(subscriber, function (openValue) {
            var buffer = [];
            buffers.push(buffer);
            var closingSubscription = new Subscription();
            var emitBuffer = function () {
                arrRemove(buffers, buffer);
                subscriber.next(buffer);
                closingSubscription.unsubscribe();
            };
            closingSubscription.add(innerFrom(closingSelector(openValue)).subscribe(createOperatorSubscriber(subscriber, emitBuffer, noop)));
        }, noop));
        source.subscribe(createOperatorSubscriber(subscriber, function (value) {
            var e_1, _a;
            try {
                for (var buffers_1 = __values(buffers), buffers_1_1 = buffers_1.next(); !buffers_1_1.done; buffers_1_1 = buffers_1.next()) {
                    var buffer = buffers_1_1.value;
                    buffer.push(value);
                }
            }
            catch (e_1_1) { e_1 = { error: e_1_1 }; }
            finally {
                try {
                    if (buffers_1_1 && !buffers_1_1.done && (_a = buffers_1.return)) _a.call(buffers_1);
                }
                finally { if (e_1) throw e_1.error; }
            }
        }, function () {
            while (buffers.length > 0) {
                subscriber.next(buffers.shift());
            }
            subscriber.complete();
        }));
    });
}
//# sourceMappingURL=bufferToggle.js.mapimport { operate } from '../util/lift';
import { noop } from '../util/noop';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';
export function bufferWhen(closingSelector) {
    return operate(function (source, subscriber) {
        var buffer = null;
        var closingSubscriber = null;
        var openBuffer = function () {
            closingSubscriber === null || closingSubscriber === void 0 ? void 0 : closingSubscriber.unsubscribe();
            var b = buffer;
            buffer = [];
            b && subscriber.next(b);
            innerFrom(closingSelector()).subscribe((closingSubscriber = createOperatorSubscriber(subscriber, openBuffer, noop)));
        };
        openBuffer();
        source.subscribe(createOperatorSubscriber(subscriber, function (value) { return buffer === null || buffer === void 0 ? void 0 : buffer.push(value); }, function () {
            buffer && subscriber.next(buffer);
            subscriber.complete();
        }, undefined, function () { return (buffer = closingSubscriber = null); }));
    });
}
//# sourceMappingURL=bufferWhen.js.mapimport { innerFrom } from '../observable/innerFrom';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { operate } from '../util/lift';
export function catchError(selector) {
    return operate(function (source, subscriber) {
        var innerSub = null;
        var syncUnsub = false;
        var handledResult;
        innerSub = source.subscribe(createOperatorSubscriber(subscriber, undefined, undefined, function (err) {
            handledResult = innerFrom(selector(err, catchError(selector)(source)));
            if (innerSub) {
                innerSub.unsubscribe();
                innerSub = null;
                handledResult.subscribe(subscriber);
            }
            else {
                syncUnsub = true;
            }
        }));
        if (syncUnsub) {
            innerSub.unsubscribe();
            innerSub = null;
            handledResult.subscribe(subscriber);
        }
    });
}
//# sourceMappingURL=catchError.js.mapimport { combineLatestAll } from './combineLatestAll';
export var combineAll = combineLatestAll;
//# sourceMappingURL=combineAll.js.mapimport { __read, __spreadArray } from "tslib";
import { combineLatestInit } from '../observable/combineLatest';
import { operate } from '../util/lift';
import { argsOrArgArray } from '../util/argsOrArgArray';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';
import { pipe } from '../util/pipe';
import { popResultSelector } from '../util/args';
export function combineLatest() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var resultSelector = popResultSelector(args);
    return resultSelector
        ? pipe(combineLatest.apply(void 0, __spreadArray([], __read(args))), mapOneOrManyArgs(resultSelector))
        : operate(function (source, subscriber) {
            combineLatestInit(__spreadArray([source], __read(argsOrArgArray(args))))(subscriber);
        });
}
//# sourceMappingURL=combineLatest.js.mapimport { combineLatest } from '../observable/combineLatest';
import { joinAllInternals } from './joinAllInternals';
export function combineLatestAll(project) {
    return joinAllInternals(combineLatest, project);
}
//# sourceMappingURL=combineLatestAll.js.mapimport { __read, __spreadArray } from "tslib";
import { combineLatest } from './combineLatest';
export function combineLatestWith() {
    var otherSources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        otherSources[_i] = arguments[_i];
    }
    return combineLatest.apply(void 0, __spreadArray([], __read(otherSources)));
}
//# sourceMappingURL=combineLatestWith.js.mapimport { __read, __spreadArray } from "tslib";
import { operate } from '../util/lift';
import { concatAll } from './concatAll';
import { popScheduler } from '../util/args';
import { from } from '../observable/from';
export function concat() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var scheduler = popScheduler(args);
    return operate(function (source, subscriber) {
        concatAll()(from(__spreadArray([source], __read(args)), scheduler)).subscribe(subscriber);
    });
}
//# sourceMappingURL=concat.js.mapimport { mergeAll } from './mergeAll';
export function concatAll() {
    return mergeAll(1);
}
//# sourceMappingURL=concatAll.js.mapimport { mergeMap } from './mergeMap';
import { isFunction } from '../util/isFunction';
export function concatMap(project, resultSelector) {
    return isFunction(resultSelector) ? mergeMap(project, resultSelector, 1) : mergeMap(project, 1);
}
//# sourceMappingURL=concatMap.js.mapimport { concatMap } from './concatMap';
import { isFunction } from '../util/isFunction';
export function concatMapTo(innerObservable, resultSelector) {
    return isFunction(resultSelector) ? concatMap(function () { return innerObservable; }, resultSelector) : concatMap(function () { return innerObservable; });
}
//# sourceMappingURL=concatMapTo.js.mapimport { __read, __spreadArray } from "tslib";
import { concat } from './concat';
export function concatWith() {
    var otherSources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        otherSources[_i] = arguments[_i];
    }
    return concat.apply(void 0, __spreadArray([], __read(otherSources)));
}
//# sourceMappingURL=concatWith.js.mapimport { Subject } from '../Subject';
import { innerFrom } from '../observable/innerFrom';
import { operate } from '../util/lift';
import { fromSubscribable } from '../observable/fromSubscribable';
var DEFAULT_CONFIG = {
    connector: function () { return new Subject(); },
};
export function connect(selector, config) {
    if (config === void 0) { config = DEFAULT_CONFIG; }
    var connector = config.connector;
    return operate(function (source, subscriber) {
        var subject = connector();
        innerFrom(selector(fromSubscribable(subject))).subscribe(subscriber);
        subscriber.add(source.subscribe(subject));
    });
}
//# sourceMappingURL=connect.js.mapimport { reduce } from './reduce';
export function count(predicate) {
    return reduce(function (total, value, i) { return (!predicate || predicate(value, i) ? total + 1 : total); }, 0);
}
//# sourceMappingURL=count.js.mapimport { operate } from '../util/lift';
import { noop } from '../util/noop';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';
export function debounce(durationSelector) {
    return operate(function (source, subscriber) {
        var hasValue = false;
        var lastValue = null;
        var durationSubscriber = null;
        var emit = function () {
            durationSubscriber === null || durationSubscriber === void 0 ? void 0 : durationSubscriber.unsubscribe();
            durationSubscriber = null;
            if (hasValue) {
                hasValue = false;
                var value = lastValue;
                lastValue = null;
                subscriber.next(value);
            }
        };
        source.subscribe(createOperatorSubscriber(subscriber, function (value) {
            durationSubscriber === null || durationSubscriber === void 0 ? void 0 : durationSubscriber.unsubscribe();
            hasValue = true;
            lastValue = value;
            durationSubscriber = createOperatorSubscriber(subscriber, emit, noop);
            innerFrom(durationSelector(value)).subscribe(durationSubscriber);
        }, function () {
            emit();
            subscriber.complete();
        }, undefined, function () {
            lastValue = durationSubscriber = null;
        }));
    });
}
//# sourceMappingURL=debounce.js.mapimport { asyncScheduler } from '../scheduler/async';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function debounceTime(dueTime, scheduler) {
    if (scheduler === void 0) { scheduler = asyncScheduler; }
    return operate(function (source, subscriber) {
        var activeTask = null;
        var lastValue = null;
        var lastTime = null;
        var emit = function () {
            if (activeTask) {
                activeTask.unsubscribe();
                activeTask = null;
                var value = lastValue;
                lastValue = null;
                subscriber.next(value);
            }
        };
        function emitWhenIdle() {
            var targetTime = lastTime + dueTime;
            var now = scheduler.now();
            if (now < targetTime) {
                activeTask = this.schedule(undefined, targetTime - now);
                subscriber.add(activeTask);
                return;
            }
            emit();
        }
        source.subscribe(createOperatorSubscriber(subscriber, function (value) {
            lastValue = value;
            lastTime = scheduler.now();
            if (!activeTask) {
                activeTask = scheduler.schedule(emitWhenIdle, dueTime);
                subscriber.add(activeTask);
            }
        }, function () {
            emit();
            subscriber.complete();
        }, undefined, function () {
            lastValue = activeTask = null;
        }));
    });
}
//# sourceMappingURL=debounceTime.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function defaultIfEmpty(defaultValue) {
    return operate(function (source, subscriber) {
        var hasValue = false;
        source.subscribe(createOperatorSubscriber(subscriber, function (value) {
            hasValue = true;
            subscriber.next(value);
        }, function () {
            if (!hasValue) {
                subscriber.next(defaultValue);
            }
            subscriber.complete();
        }));
    });
}
//# sourceMappingURL=defaultIfEmpty.js.mapimport { asyncScheduler } from '../scheduler/async';
import { delayWhen } from './delayWhen';
import { timer } from '../observable/timer';
export function delay(due, scheduler) {
    if (scheduler === void 0) { scheduler = asyncScheduler; }
    var duration = timer(due, scheduler);
    return delayWhen(function () { return duration; });
}
//# sourceMappingURL=delay.js.mapimport { concat } from '../observable/concat';
import { take } from './take';
import { ignoreElements } from './ignoreElements';
import { mapTo } from './mapTo';
import { mergeMap } from './mergeMap';
export function delayWhen(delayDurationSelector, subscriptionDelay) {
    if (subscriptionDelay) {
        return function (source) {
            return concat(subscriptionDelay.pipe(take(1), ignoreElements()), source.pipe(delayWhen(delayDurationSelector)));
        };
    }
    return mergeMap(function (value, index) { return delayDurationSelector(value, index).pipe(take(1), mapTo(value)); });
}
//# sourceMappingURL=delayWhen.js.mapimport { observeNotification } from '../Notification';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function dematerialize() {
    return operate(function (source, subscriber) {
        source.subscribe(createOperatorSubscriber(subscriber, function (notification) { return observeNotification(notification, subscriber); }));
    });
}
//# sourceMappingURL=dematerialize.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { noop } from '../util/noop';
export function distinct(keySelector, flushes) {
    return operate(function (source, subscriber) {
        var distinctKeys = new Set();
        source.subscribe(createOperatorSubscriber(subscriber, function (value) {
            var key = keySelector ? keySelector(value) : value;
            if (!distinctKeys.has(key)) {
                distinctKeys.add(key);
                subscriber.next(value);
            }
        }));
        flushes === null || flushes === void 0 ? void 0 : flushes.subscribe(createOperatorSubscriber(subscriber, function () { return distinctKeys.clear(); }, noop));
    });
}
//# sourceMappingURL=distinct.js.mapimport { identity } from '../util/identity';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function distinctUntilChanged(comparator, keySelector) {
    if (keySelector === void 0) { keySelector = identity; }
    comparator = comparator !== null && comparator !== void 0 ? comparator : defaultCompare;
    return operate(function (source, subscriber) {
        var previousKey;
        var first = true;
        source.subscribe(createOperatorSubscriber(subscriber, function (value) {
            var currentKey = keySelector(value);
            if (first || !comparator(previousKey, currentKey)) {
                first = false;
                previousKey = currentKey;
                subscriber.next(value);
            }
        }));
    });
}
function defaultCompare(a, b) {
    return a === b;
}
//# sourceMappingURL=distinctUntilChanged.js.mapimport { distinctUntilChanged } from './distinctUntilChanged';
export function distinctUntilKeyChanged(key, compare) {
    return distinctUntilChanged(function (x, y) { return compare ? compare(x[key], y[key]) : x[key] === y[key]; });
}
//# sourceMappingURL=distinctUntilKeyChanged.js.mapimport { ArgumentOutOfRangeError } from '../util/ArgumentOutOfRangeError';
import { filter } from './filter';
import { throwIfEmpty } from './throwIfEmpty';
import { defaultIfEmpty } from './defaultIfEmpty';
import { take } from './take';
export function elementAt(index, defaultValue) {
    if (index < 0) {
        throw new ArgumentOutOfRangeError();
    }
    var hasDefaultValue = arguments.length >= 2;
    return function (source) {
        return source.pipe(filter(function (v, i) { return i === index; }), take(1), hasDefaultValue ? defaultIfEmpty(defaultValue) : throwIfEmpty(function () { return new ArgumentOutOfRangeError(); }));
    };
}
//# sourceMappingURL=elementAt.js.mapimport { __read, __spreadArray } from "tslib";
import { concat } from '../observable/concat';
import { of } from '../observable/of';
export function endWith() {
    var values = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        values[_i] = arguments[_i];
    }
    return function (source) { return concat(source, of.apply(void 0, __spreadArray([], __read(values)))); };
}
//# sourceMappingURL=endWith.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function every(predicate, thisArg) {
    return operate(function (source, subscriber) {
        var index = 0;
        source.subscribe(createOperatorSubscriber(subscriber, function (value) {
            if (!predicate.call(thisArg, value, index++, source)) {
                subscriber.next(false);
                subscriber.complete();
            }
        }, function () {
            subscriber.next(true);
            subscriber.complete();
        }));
    });
}
//# sourceMappingURL=every.js.mapimport { exhaustAll } from './exhaustAll';
export var exhaust = exhaustAll;
//# sourceMappingURL=exhaust.js.mapimport { exhaustMap } from './exhaustMap';
import { identity } from '../util/identity';
export function exhaustAll() {
    return exhaustMap(identity);
}
//# sourceMappingURL=exhaustAll.js.mapimport { map } from './map';
import { innerFrom } from '../observable/innerFrom';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function exhaustMap(project, resultSelector) {
    if (resultSelector) {
        return function (source) {
            return source.pipe(exhaustMap(function (a, i) { return innerFrom(project(a, i)).pipe(map(function (b, ii) { return resultSelector(a, b, i, ii); })); }));
        };
    }
    return operate(function (source, subscriber) {
        var index = 0;
        var innerSub = null;
        var isComplete = false;
        source.subscribe(createOperatorSubscriber(subscriber, function (outerValue) {
            if (!innerSub) {
                innerSub = createOperatorSubscriber(subscriber, undefined, function () {
                    innerSub = null;
                    isComplete && subscriber.complete();
                });
                innerFrom(project(outerValue, index++)).subscribe(innerSub);
            }
        }, function () {
            isComplete = true;
            !innerSub && subscriber.complete();
        }));
    });
}
//# sourceMappingURL=exhaustMap.js.mapimport { operate } from '../util/lift';
import { mergeInternals } from './mergeInternals';
export function expand(project, concurrent, scheduler) {
    if (concurrent === void 0) { concurrent = Infinity; }
    concurrent = (concurrent || 0) < 1 ? Infinity : concurrent;
    return operate(function (source, subscriber) {
        return mergeInternals(source, subscriber, project, concurrent, undefined, true, scheduler);
    });
}
//# sourceMappingURL=expand.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function filter(predicate, thisArg) {
    return operate(function (source, subscriber) {
        var index = 0;
        source.subscribe(createOperatorSubscriber(subscriber, function (value) { return predicate.call(thisArg, value, index++) && subscriber.next(value); }));
    });
}
//# sourceMappingURL=filter.js.mapimport { operate } from '../util/lift';
export function finalize(callback) {
    return operate(function (source, subscriber) {
        try {
            source.subscribe(subscriber);
        }
        finally {
            subscriber.add(callback);
        }
    });
}
//# sourceMappingURL=finalize.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function find(predicate, thisArg) {
    return operate(createFind(predicate, thisArg, 'value'));
}
export function createFind(predicate, thisArg, emit) {
    var findIndex = emit === 'index';
    return function (source, subscriber) {
        var index = 0;
        source.subscribe(createOperatorSubscriber(subscriber, function (value) {
            var i = index++;
            if (predicate.call(thisArg, value, i, source)) {
                subscriber.next(findIndex ? i : value);
                subscriber.complete();
            }
        }, function () {
            subscriber.next(findIndex ? -1 : undefined);
            subscriber.complete();
        }));
    };
}
//# sourceMappingURL=find.js.mapimport { operate } from '../util/lift';
import { createFind } from './find';
export function findIndex(predicate, thisArg) {
    return operate(createFind(predicate, thisArg, 'index'));
}
//# sourceMappingURL=findIndex.js.mapimport { EmptyError } from '../util/EmptyError';
import { filter } from './filter';
import { take } from './take';
import { defaultIfEmpty } from './defaultIfEmpty';
import { throwIfEmpty } from './throwIfEmpty';
import { identity } from '../util/identity';
export function first(predicate, defaultValue) {
    var hasDefaultValue = arguments.length >= 2;
    return function (source) {
        return source.pipe(predicate ? filter(function (v, i) { return predicate(v, i, source); }) : identity, take(1), hasDefaultValue ? defaultIfEmpty(defaultValue) : throwIfEmpty(function () { return new EmptyError(); }));
    };
}
//# sourceMappingURL=first.js.mapimport { mergeMap } from './mergeMap';
export var flatMap = mergeMap;
//# sourceMappingURL=flatMap.js.mapimport { Observable } from '../Observable';
import { innerFrom } from '../observable/innerFrom';
import { Subject } from '../Subject';
import { operate } from '../util/lift';
import { createOperatorSubscriber, OperatorSubscriber } from './OperatorSubscriber';
export function groupBy(keySelector, elementOrOptions, duration, connector) {
    return operate(function (source, subscriber) {
        var element;
        if (!elementOrOptions || typeof elementOrOptions === 'function') {
            element = elementOrOptions;
        }
        else {
            (duration = elementOrOptions.duration, element = elementOrOptions.element, connector = elementOrOptions.connector);
        }
        var groups = new Map();
        var notify = function (cb) {
            groups.forEach(cb);
            cb(subscriber);
        };
        var handleError = function (err) { return notify(function (consumer) { return consumer.error(err); }); };
        var activeGroups = 0;
        var teardownAttempted = false;
        var groupBySourceSubscriber = new OperatorSubscriber(subscriber, function (value) {
            try {
                var key_1 = keySelector(value);
                var group_1 = groups.get(key_1);
                if (!group_1) {
                    groups.set(key_1, (group_1 = connector ? connector() : new Subject()));
                    var grouped = createGroupedObservable(key_1, group_1);
                    subscriber.next(grouped);
                    if (duration) {
                        var durationSubscriber_1 = createOperatorSubscriber(group_1, function () {
                            group_1.complete();
                            durationSubscriber_1 === null || durationSubscriber_1 === void 0 ? void 0 : durationSubscriber_1.unsubscribe();
                        }, undefined, undefined, function () { return groups.delete(key_1); });
                        groupBySourceSubscriber.add(innerFrom(duration(grouped)).subscribe(durationSubscriber_1));
                    }
                }
                group_1.next(element ? element(value) : value);
            }
            catch (err) {
                handleError(err);
            }
        }, function () { return notify(function (consumer) { return consumer.complete(); }); }, handleError, function () { return groups.clear(); }, function () {
            teardownAttempted = true;
            return activeGroups === 0;
        });
        source.subscribe(groupBySourceSubscriber);
        function createGroupedObservable(key, groupSubject) {
            var result = new Observable(function (groupSubscriber) {
                activeGroups++;
                var innerSub = groupSubject.subscribe(groupSubscriber);
                return function () {
                    innerSub.unsubscribe();
                    --activeGroups === 0 && teardownAttempted && groupBySourceSubscriber.unsubscribe();
                };
            });
            result.key = key;
            return result;
        }
    });
}
//# sourceMappingURL=groupBy.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { noop } from '../util/noop';
export function ignoreElements() {
    return operate(function (source, subscriber) {
        source.subscribe(createOperatorSubscriber(subscriber, noop));
    });
}
//# sourceMappingURL=ignoreElements.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function isEmpty() {
    return operate(function (source, subscriber) {
        source.subscribe(createOperatorSubscriber(subscriber, function () {
            subscriber.next(false);
            subscriber.complete();
        }, function () {
            subscriber.next(true);
            subscriber.complete();
        }));
    });
}
//# sourceMappingURL=isEmpty.js.mapimport { identity } from '../util/identity';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';
import { pipe } from '../util/pipe';
import { mergeMap } from './mergeMap';
import { toArray } from './toArray';
export function joinAllInternals(joinFn, project) {
    return pipe(toArray(), mergeMap(function (sources) { return joinFn(sources); }), project ? mapOneOrManyArgs(project) : identity);
}
//# sourceMappingURL=joinAllInternals.js.mapimport { EmptyError } from '../util/EmptyError';
import { filter } from './filter';
import { takeLast } from './takeLast';
import { throwIfEmpty } from './throwIfEmpty';
import { defaultIfEmpty } from './defaultIfEmpty';
import { identity } from '../util/identity';
export function last(predicate, defaultValue) {
    var hasDefaultValue = arguments.length >= 2;
    return function (source) {
        return source.pipe(predicate ? filter(function (v, i) { return predicate(v, i, source); }) : identity, takeLast(1), hasDefaultValue ? defaultIfEmpty(defaultValue) : throwIfEmpty(function () { return new EmptyError(); }));
    };
}
//# sourceMappingURL=last.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function map(project, thisArg) {
    return operate(function (source, subscriber) {
        var index = 0;
        source.subscribe(createOperatorSubscriber(subscriber, function (value) {
            subscriber.next(project.call(thisArg, value, index++));
        }));
    });
}
//# sourceMappingURL=map.js.mapimport { map } from './map';
export function mapTo(value) {
    return map(function () { return value; });
}
//# sourceMappingURL=mapTo.js.mapimport { Notification } from '../Notification';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function materialize() {
    return operate(function (source, subscriber) {
        source.subscribe(createOperatorSubscriber(subscriber, function (value) {
            subscriber.next(Notification.createNext(value));
        }, function () {
            subscriber.next(Notification.createComplete());
            subscriber.complete();
        }, function (err) {
            subscriber.next(Notification.createError(err));
            subscriber.complete();
        }));
    });
}
//# sourceMappingURL=materialize.js.mapimport { reduce } from './reduce';
import { isFunction } from '../util/isFunction';
export function max(comparer) {
    return reduce(isFunction(comparer) ? function (x, y) { return (comparer(x, y) > 0 ? x : y); } : function (x, y) { return (x > y ? x : y); });
}
//# sourceMappingURL=max.js.mapimport { __read, __spreadArray } from "tslib";
import { operate } from '../util/lift';
import { argsOrArgArray } from '../util/argsOrArgArray';
import { mergeAll } from './mergeAll';
import { popNumber, popScheduler } from '../util/args';
import { from } from '../observable/from';
export function merge() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var scheduler = popScheduler(args);
    var concurrent = popNumber(args, Infinity);
    args = argsOrArgArray(args);
    return operate(function (source, subscriber) {
        mergeAll(concurrent)(from(__spreadArray([source], __read(args)), scheduler)).subscribe(subscriber);
    });
}
//# sourceMappingURL=merge.js.mapimport { mergeMap } from './mergeMap';
import { identity } from '../util/identity';
export function mergeAll(concurrent) {
    if (concurrent === void 0) { concurrent = Infinity; }
    return mergeMap(identity, concurrent);
}
//# sourceMappingURL=mergeAll.js.mapimport { innerFrom } from '../observable/innerFrom';
import { executeSchedule } from '../util/executeSchedule';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function mergeInternals(source, subscriber, project, concurrent, onBeforeNext, expand, innerSubScheduler, additionalFinalizer) {
    var buffer = [];
    var active = 0;
    var index = 0;
    var isComplete = false;
    var checkComplete = function () {
        if (isComplete && !buffer.length && !active) {
            subscriber.complete();
        }
    };
    var outerNext = function (value) { return (active < concurrent ? doInnerSub(value) : buffer.push(value)); };
    var doInnerSub = function (value) {
        expand && subscriber.next(value);
        active++;
        var innerComplete = false;
        innerFrom(project(value, index++)).subscribe(createOperatorSubscriber(subscriber, function (innerValue) {
            onBeforeNext === null || onBeforeNext === void 0 ? void 0 : onBeforeNext(innerValue);
            if (expand) {
                outerNext(innerValue);
            }
            else {
                subscriber.next(innerValue);
            }
        }, function () {
            innerComplete = true;
        }, undefined, function () {
            if (innerComplete) {
                try {
                    active--;
                    var _loop_1 = function () {
                        var bufferedValue = buffer.shift();
                        if (innerSubScheduler) {
                            executeSchedule(subscriber, innerSubScheduler, function () { return doInnerSub(bufferedValue); });
                        }
                        else {
                            doInnerSub(bufferedValue);
                        }
                    };
                    while (buffer.length && active < concurrent) {
                        _loop_1();
                    }
                    checkComplete();
                }
                catch (err) {
                    subscriber.error(err);
                }
            }
        }));
    };
    source.subscribe(createOperatorSubscriber(subscriber, outerNext, function () {
        isComplete = true;
        checkComplete();
    }));
    return function () {
        additionalFinalizer === null || additionalFinalizer === void 0 ? void 0 : additionalFinalizer();
    };
}
//# sourceMappingURL=mergeInternals.js.mapimport { map } from './map';
import { innerFrom } from '../observable/innerFrom';
import { operate } from '../util/lift';
import { mergeInternals } from './mergeInternals';
import { isFunction } from '../util/isFunction';
export function mergeMap(project, resultSelector, concurrent) {
    if (concurrent === void 0) { concurrent = Infinity; }
    if (isFunction(resultSelector)) {
        return mergeMap(function (a, i) { return map(function (b, ii) { return resultSelector(a, b, i, ii); })(innerFrom(project(a, i))); }, concurrent);
    }
    else if (typeof resultSelector === 'number') {
        concurrent = resultSelector;
    }
    return operate(function (source, subscriber) { return mergeInternals(source, subscriber, project, concurrent); });
}
//# sourceMappingURL=mergeMap.js.mapimport { mergeMap } from './mergeMap';
import { isFunction } from '../util/isFunction';
export function mergeMapTo(innerObservable, resultSelector, concurrent) {
    if (concurrent === void 0) { concurrent = Infinity; }
    if (isFunction(resultSelector)) {
        return mergeMap(function () { return innerObservable; }, resultSelector, concurrent);
    }
    if (typeof resultSelector === 'number') {
        concurrent = resultSelector;
    }
    return mergeMap(function () { return innerObservable; }, concurrent);
}
//# sourceMappingURL=mergeMapTo.js.mapimport { operate } from '../util/lift';
import { mergeInternals } from './mergeInternals';
export function mergeScan(accumulator, seed, concurrent) {
    if (concurrent === void 0) { concurrent = Infinity; }
    return operate(function (source, subscriber) {
        var state = seed;
        return mergeInternals(source, subscriber, function (value, index) { return accumulator(state, value, index); }, concurrent, function (value) {
            state = value;
        }, false, undefined, function () { return (state = null); });
    });
}
//# sourceMappingURL=mergeScan.js.mapimport { __read, __spreadArray } from "tslib";
import { merge } from './merge';
export function mergeWith() {
    var otherSources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        otherSources[_i] = arguments[_i];
    }
    return merge.apply(void 0, __spreadArray([], __read(otherSources)));
}
//# sourceMappingURL=mergeWith.js.mapimport { reduce } from './reduce';
import { isFunction } from '../util/isFunction';
export function min(comparer) {
    return reduce(isFunction(comparer) ? function (x, y) { return (comparer(x, y) < 0 ? x : y); } : function (x, y) { return (x < y ? x : y); });
}
//# sourceMappingURL=min.js.mapimport { ConnectableObservable } from '../observable/ConnectableObservable';
import { isFunction } from '../util/isFunction';
import { connect } from './connect';
export function multicast(subjectOrSubjectFactory, selector) {
    var subjectFactory = isFunction(subjectOrSubjectFactory) ? subjectOrSubjectFactory : function () { return subjectOrSubjectFactory; };
    if (isFunction(selector)) {
        return connect(selector, {
            connector: subjectFactory,
        });
    }
    return function (source) { return new ConnectableObservable(source, subjectFactory); };
}
//# sourceMappingURL=multicast.js.mapimport { executeSchedule } from '../util/executeSchedule';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function observeOn(scheduler, delay) {
    if (delay === void 0) { delay = 0; }
    return operate(function (source, subscriber) {
        source.subscribe(createOperatorSubscriber(subscriber, function (value) { return executeSchedule(subscriber, scheduler, function () { return subscriber.next(value); }, delay); }, function () { return executeSchedule(subscriber, scheduler, function () { return subscriber.complete(); }, delay); }, function (err) { return executeSchedule(subscriber, scheduler, function () { return subscriber.error(err); }, delay); }));
    });
}
//# sourceMappingURL=observeOn.js.mapimport { __read, __spreadArray } from "tslib";
import { operate } from '../util/lift';
import { innerFrom } from '../observable/innerFrom';
import { argsOrArgArray } from '../util/argsOrArgArray';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { noop } from '../util/noop';
export function onErrorResumeNext() {
    var sources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        sources[_i] = arguments[_i];
    }
    var nextSources = argsOrArgArray(sources);
    return operate(function (source, subscriber) {
        var remaining = __spreadArray([source], __read(nextSources));
        var subscribeNext = function () {
            if (!subscriber.closed) {
                if (remaining.length > 0) {
                    var nextSource = void 0;
                    try {
                        nextSource = innerFrom(remaining.shift());
                    }
                    catch (err) {
                        subscribeNext();
                        return;
                    }
                    var innerSub = createOperatorSubscriber(subscriber, undefined, noop, noop);
                    nextSource.subscribe(innerSub);
                    innerSub.add(subscribeNext);
                }
                else {
                    subscriber.complete();
                }
            }
        };
        subscribeNext();
    });
}
//# sourceMappingURL=onErrorResumeNext.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function pairwise() {
    return operate(function (source, subscriber) {
        var prev;
        var hasPrev = false;
        source.subscribe(createOperatorSubscriber(subscriber, function (value) {
            var p = prev;
            prev = value;
            hasPrev && subscriber.next([p, value]);
            hasPrev = true;
        }));
    });
}
//# sourceMappingURL=pairwise.js.mapimport { not } from '../util/not';
import { filter } from './filter';
export function partition(predicate, thisArg) {
    return function (source) {
        return [filter(predicate, thisArg)(source), filter(not(predicate, thisArg))(source)];
    };
}
//# sourceMappingURL=partition.js.mapimport { map } from './map';
export function pluck() {
    var properties = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        properties[_i] = arguments[_i];
    }
    var length = properties.length;
    if (length === 0) {
        throw new Error('list of properties cannot be empty.');
    }
    return map(function (x) {
        var currentProp = x;
        for (var i = 0; i < length; i++) {
            var p = currentProp === null || currentProp === void 0 ? void 0 : currentProp[properties[i]];
            if (typeof p !== 'undefined') {
                currentProp = p;
            }
            else {
                return undefined;
            }
        }
        return currentProp;
    });
}
//# sourceMappingURL=pluck.js.mapimport { Subject } from '../Subject';
import { multicast } from './multicast';
import { connect } from './connect';
export function publish(selector) {
    return selector ? function (source) { return connect(selector)(source); } : function (source) { return multicast(new Subject())(source); };
}
//# sourceMappingURL=publish.js.mapimport { BehaviorSubject } from '../BehaviorSubject';
import { ConnectableObservable } from '../observable/ConnectableObservable';
export function publishBehavior(initialValue) {
    return function (source) {
        var subject = new BehaviorSubject(initialValue);
        return new ConnectableObservable(source, function () { return subject; });
    };
}
//# sourceMappingURL=publishBehavior.js.mapimport { AsyncSubject } from '../AsyncSubject';
import { ConnectableObservable } from '../observable/ConnectableObservable';
export function publishLast() {
    return function (source) {
        var subject = new AsyncSubject();
        return new ConnectableObservable(source, function () { return subject; });
    };
}
//# sourceMappingURL=publishLast.js.mapimport { ReplaySubject } from '../ReplaySubject';
import { multicast } from './multicast';
import { isFunction } from '../util/isFunction';
export function publishReplay(bufferSize, windowTime, selectorOrScheduler, timestampProvider) {
    if (selectorOrScheduler && !isFunction(selectorOrScheduler)) {
        timestampProvider = selectorOrScheduler;
    }
    var selector = isFunction(selectorOrScheduler) ? selectorOrScheduler : undefined;
    return function (source) { return multicast(new ReplaySubject(bufferSize, windowTime, timestampProvider), selector)(source); };
}
//# sourceMappingURL=publishReplay.js.mapimport { __read, __spreadArray } from "tslib";
import { argsOrArgArray } from '../util/argsOrArgArray';
import { raceWith } from './raceWith';
export function race() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    return raceWith.apply(void 0, __spreadArray([], __read(argsOrArgArray(args))));
}
//# sourceMappingURL=race.js.mapimport { __read, __spreadArray } from "tslib";
import { raceInit } from '../observable/race';
import { operate } from '../util/lift';
import { identity } from '../util/identity';
export function raceWith() {
    var otherSources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        otherSources[_i] = arguments[_i];
    }
    return !otherSources.length
        ? identity
        : operate(function (source, subscriber) {
            raceInit(__spreadArray([source], __read(otherSources)))(subscriber);
        });
}
//# sourceMappingURL=raceWith.js.mapimport { scanInternals } from './scanInternals';
import { operate } from '../util/lift';
export function reduce(accumulator, seed) {
    return operate(scanInternals(accumulator, seed, arguments.length >= 2, false, true));
}
//# sourceMappingURL=reduce.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function refCount() {
    return operate(function (source, subscriber) {
        var connection = null;
        source._refCount++;
        var refCounter = createOperatorSubscriber(subscriber, undefined, undefined, undefined, function () {
            if (!source || source._refCount <= 0 || 0 < --source._refCount) {
                connection = null;
                return;
            }
            var sharedConnection = source._connection;
            var conn = connection;
            connection = null;
            if (sharedConnection && (!conn || sharedConnection === conn)) {
                sharedConnection.unsubscribe();
            }
            subscriber.unsubscribe();
        });
        source.subscribe(refCounter);
        if (!refCounter.closed) {
            connection = source.connect();
        }
    });
}
//# sourceMappingURL=refCount.js.mapimport { EMPTY } from '../observable/empty';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';
import { timer } from '../observable/timer';
export function repeat(countOrConfig) {
    var _a;
    var count = Infinity;
    var delay;
    if (countOrConfig != null) {
        if (typeof countOrConfig === 'object') {
            (_a = countOrConfig.count, count = _a === void 0 ? Infinity : _a, delay = countOrConfig.delay);
        }
        else {
            count = countOrConfig;
        }
    }
    return count <= 0
        ? function () { return EMPTY; }
        : operate(function (source, subscriber) {
            var soFar = 0;
            var sourceSub;
            var resubscribe = function () {
                sourceSub === null || sourceSub === void 0 ? void 0 : sourceSub.unsubscribe();
                sourceSub = null;
                if (delay != null) {
                    var notifier = typeof delay === 'number' ? timer(delay) : innerFrom(delay(soFar));
                    var notifierSubscriber_1 = createOperatorSubscriber(subscriber, function () {
                        notifierSubscriber_1.unsubscribe();
                        subscribeToSource();
                    });
                    notifier.subscribe(notifierSubscriber_1);
                }
                else {
                    subscribeToSource();
                }
            };
            var subscribeToSource = function () {
                var syncUnsub = false;
                sourceSub = source.subscribe(createOperatorSubscriber(subscriber, undefined, function () {
                    if (++soFar < count) {
                        if (sourceSub) {
                            resubscribe();
                        }
                        else {
                            syncUnsub = true;
                        }
                    }
                    else {
                        subscriber.complete();
                    }
                }));
                if (syncUnsub) {
                    resubscribe();
                }
            };
            subscribeToSource();
        });
}
//# sourceMappingURL=repeat.js.mapimport { Subject } from '../Subject';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function repeatWhen(notifier) {
    return operate(function (source, subscriber) {
        var innerSub;
        var syncResub = false;
        var completions$;
        var isNotifierComplete = false;
        var isMainComplete = false;
        var checkComplete = function () { return isMainComplete && isNotifierComplete && (subscriber.complete(), true); };
        var getCompletionSubject = function () {
            if (!completions$) {
                completions$ = new Subject();
                notifier(completions$).subscribe(createOperatorSubscriber(subscriber, function () {
                    if (innerSub) {
                        subscribeForRepeatWhen();
                    }
                    else {
                        syncResub = true;
                    }
                }, function () {
                    isNotifierComplete = true;
                    checkComplete();
                }));
            }
            return completions$;
        };
        var subscribeForRepeatWhen = function () {
            isMainComplete = false;
            innerSub = source.subscribe(createOperatorSubscriber(subscriber, undefined, function () {
                isMainComplete = true;
                !checkComplete() && getCompletionSubject().next();
            }));
            if (syncResub) {
                innerSub.unsubscribe();
                innerSub = null;
                syncResub = false;
                subscribeForRepeatWhen();
            }
        };
        subscribeForRepeatWhen();
    });
}
//# sourceMappingURL=repeatWhen.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { identity } from '../util/identity';
import { timer } from '../observable/timer';
import { innerFrom } from '../observable/innerFrom';
export function retry(configOrCount) {
    if (configOrCount === void 0) { configOrCount = Infinity; }
    var config;
    if (configOrCount && typeof configOrCount === 'object') {
        config = configOrCount;
    }
    else {
        config = {
            count: configOrCount,
        };
    }
    var _a = config.count, count = _a === void 0 ? Infinity : _a, delay = config.delay, _b = config.resetOnSuccess, resetOnSuccess = _b === void 0 ? false : _b;
    return count <= 0
        ? identity
        : operate(function (source, subscriber) {
            var soFar = 0;
            var innerSub;
            var subscribeForRetry = function () {
                var syncUnsub = false;
                innerSub = source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                    if (resetOnSuccess) {
                        soFar = 0;
                    }
                    subscriber.next(value);
                }, undefined, function (err) {
                    if (soFar++ < count) {
                        var resub_1 = function () {
                            if (innerSub) {
                                innerSub.unsubscribe();
                                innerSub = null;
                                subscribeForRetry();
                            }
                            else {
                                syncUnsub = true;
                            }
                        };
                        if (delay != null) {
                            var notifier = typeof delay === 'number' ? timer(delay) : innerFrom(delay(err, soFar));
                            var notifierSubscriber_1 = createOperatorSubscriber(subscriber, function () {
                                notifierSubscriber_1.unsubscribe();
                                resub_1();
                            }, function () {
                                subscriber.complete();
                            });
                            notifier.subscribe(notifierSubscriber_1);
                        }
                        else {
                            resub_1();
                        }
                    }
                    else {
                        subscriber.error(err);
                    }
                }));
                if (syncUnsub) {
                    innerSub.unsubscribe();
                    innerSub = null;
                    subscribeForRetry();
                }
            };
            subscribeForRetry();
        });
}
//# sourceMappingURL=retry.js.mapimport { Subject } from '../Subject';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function retryWhen(notifier) {
    return operate(function (source, subscriber) {
        var innerSub;
        var syncResub = false;
        var errors$;
        var subscribeForRetryWhen = function () {
            innerSub = source.subscribe(createOperatorSubscriber(subscriber, undefined, undefined, function (err) {
                if (!errors$) {
                    errors$ = new Subject();
                    notifier(errors$).subscribe(createOperatorSubscriber(subscriber, function () {
                        return innerSub ? subscribeForRetryWhen() : (syncResub = true);
                    }));
                }
                if (errors$) {
                    errors$.next(err);
                }
            }));
            if (syncResub) {
                innerSub.unsubscribe();
                innerSub = null;
                syncResub = false;
                subscribeForRetryWhen();
            }
        };
        subscribeForRetryWhen();
    });
}
//# sourceMappingURL=retryWhen.js.mapimport { operate } from '../util/lift';
import { noop } from '../util/noop';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function sample(notifier) {
    return operate(function (source, subscriber) {
        var hasValue = false;
        var lastValue = null;
        source.subscribe(createOperatorSubscriber(subscriber, function (value) {
            hasValue = true;
            lastValue = value;
        }));
        notifier.subscribe(createOperatorSubscriber(subscriber, function () {
            if (hasValue) {
                hasValue = false;
                var value = lastValue;
                lastValue = null;
                subscriber.next(value);
            }
        }, noop));
    });
}
//# sourceMappingURL=sample.js.mapimport { asyncScheduler } from '../scheduler/async';
import { sample } from './sample';
import { interval } from '../observable/interval';
export function sampleTime(period, scheduler) {
    if (scheduler === void 0) { scheduler = asyncScheduler; }
    return sample(interval(period, scheduler));
}
//# sourceMappingURL=sampleTime.js.mapimport { operate } from '../util/lift';
import { scanInternals } from './scanInternals';
export function scan(accumulator, seed) {
    return operate(scanInternals(accumulator, seed, arguments.length >= 2, true));
}
//# sourceMappingURL=scan.js.mapimport { createOperatorSubscriber } from './OperatorSubscriber';
export function scanInternals(accumulator, seed, hasSeed, emitOnNext, emitBeforeComplete) {
    return function (source, subscriber) {
        var hasState = hasSeed;
        var state = seed;
        var index = 0;
        source.subscribe(createOperatorSubscriber(subscriber, function (value) {
            var i = index++;
            state = hasState
                ?
                    accumulator(state, value, i)
                :
                    ((hasState = true), value);
            emitOnNext && subscriber.next(state);
        }, emitBeforeComplete &&
            (function () {
                hasState && subscriber.next(state);
                subscriber.complete();
            })));
    };
}
//# sourceMappingURL=scanInternals.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function sequenceEqual(compareTo, comparator) {
    if (comparator === void 0) { comparator = function (a, b) { return a === b; }; }
    return operate(function (source, subscriber) {
        var aState = createState();
        var bState = createState();
        var emit = function (isEqual) {
            subscriber.next(isEqual);
            subscriber.complete();
        };
        var createSubscriber = function (selfState, otherState) {
            var sequenceEqualSubscriber = createOperatorSubscriber(subscriber, function (a) {
                var buffer = otherState.buffer, complete = otherState.complete;
                if (buffer.length === 0) {
                    complete ? emit(false) : selfState.buffer.push(a);
                }
                else {
                    !comparator(a, buffer.shift()) && emit(false);
                }
            }, function () {
                selfState.complete = true;
                var complete = otherState.complete, buffer = otherState.buffer;
                complete && emit(buffer.length === 0);
                sequenceEqualSubscriber === null || sequenceEqualSubscriber === void 0 ? void 0 : sequenceEqualSubscriber.unsubscribe();
            });
            return sequenceEqualSubscriber;
        };
        source.subscribe(createSubscriber(aState, bState));
        compareTo.subscribe(createSubscriber(bState, aState));
    });
}
function createState() {
    return {
        buffer: [],
        complete: false,
    };
}
//# sourceMappingURL=sequenceEqual.js.mapimport { __read, __spreadArray } from "tslib";
import { innerFrom } from '../observable/innerFrom';
import { Subject } from '../Subject';
import { SafeSubscriber } from '../Subscriber';
import { operate } from '../util/lift';
export function share(options) {
    if (options === void 0) { options = {}; }
    var _a = options.connector, connector = _a === void 0 ? function () { return new Subject(); } : _a, _b = options.resetOnError, resetOnError = _b === void 0 ? true : _b, _c = options.resetOnComplete, resetOnComplete = _c === void 0 ? true : _c, _d = options.resetOnRefCountZero, resetOnRefCountZero = _d === void 0 ? true : _d;
    return function (wrapperSource) {
        var connection;
        var resetConnection;
        var subject;
        var refCount = 0;
        var hasCompleted = false;
        var hasErrored = false;
        var cancelReset = function () {
            resetConnection === null || resetConnection === void 0 ? void 0 : resetConnection.unsubscribe();
            resetConnection = undefined;
        };
        var reset = function () {
            cancelReset();
            connection = subject = undefined;
            hasCompleted = hasErrored = false;
        };
        var resetAndUnsubscribe = function () {
            var conn = connection;
            reset();
            conn === null || conn === void 0 ? void 0 : conn.unsubscribe();
        };
        return operate(function (source, subscriber) {
            refCount++;
            if (!hasErrored && !hasCompleted) {
                cancelReset();
            }
            var dest = (subject = subject !== null && subject !== void 0 ? subject : connector());
            subscriber.add(function () {
                refCount--;
                if (refCount === 0 && !hasErrored && !hasCompleted) {
                    resetConnection = handleReset(resetAndUnsubscribe, resetOnRefCountZero);
                }
            });
            dest.subscribe(subscriber);
            if (!connection &&
                refCount > 0) {
                connection = new SafeSubscriber({
                    next: function (value) { return dest.next(value); },
                    error: function (err) {
                        hasErrored = true;
                        cancelReset();
                        resetConnection = handleReset(reset, resetOnError, err);
                        dest.error(err);
                    },
                    complete: function () {
                        hasCompleted = true;
                        cancelReset();
                        resetConnection = handleReset(reset, resetOnComplete);
                        dest.complete();
                    },
                });
                innerFrom(source).subscribe(connection);
            }
        })(wrapperSource);
    };
}
function handleReset(reset, on) {
    var args = [];
    for (var _i = 2; _i < arguments.length; _i++) {
        args[_i - 2] = arguments[_i];
    }
    if (on === true) {
        reset();
        return;
    }
    if (on === false) {
        return;
    }
    var onSubscriber = new SafeSubscriber({
        next: function () {
            onSubscriber.unsubscribe();
            reset();
        },
    });
    return on.apply(void 0, __spreadArray([], __read(args))).subscribe(onSubscriber);
}
//# sourceMappingURL=share.js.mapimport { ReplaySubject } from '../ReplaySubject';
import { share } from './share';
export function shareReplay(configOrBufferSize, windowTime, scheduler) {
    var _a, _b, _c;
    var bufferSize;
    var refCount = false;
    if (configOrBufferSize && typeof configOrBufferSize === 'object') {
        (_a = configOrBufferSize.bufferSize, bufferSize = _a === void 0 ? Infinity : _a, _b = configOrBufferSize.windowTime, windowTime = _b === void 0 ? Infinity : _b, _c = configOrBufferSize.refCount, refCount = _c === void 0 ? false : _c, scheduler = configOrBufferSize.scheduler);
    }
    else {
        bufferSize = (configOrBufferSize !== null && configOrBufferSize !== void 0 ? configOrBufferSize : Infinity);
    }
    return share({
        connector: function () { return new ReplaySubject(bufferSize, windowTime, scheduler); },
        resetOnError: true,
        resetOnComplete: false,
        resetOnRefCountZero: refCount,
    });
}
//# sourceMappingURL=shareReplay.js.mapimport { EmptyError } from '../util/EmptyError';
import { SequenceError } from '../util/SequenceError';
import { NotFoundError } from '../util/NotFoundError';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function single(predicate) {
    return operate(function (source, subscriber) {
        var hasValue = false;
        var singleValue;
        var seenValue = false;
        var index = 0;
        source.subscribe(createOperatorSubscriber(subscriber, function (value) {
            seenValue = true;
            if (!predicate || predicate(value, index++, source)) {
                hasValue && subscriber.error(new SequenceError('Too many matching values'));
                hasValue = true;
                singleValue = value;
            }
        }, function () {
            if (hasValue) {
                subscriber.next(singleValue);
                subscriber.complete();
            }
            else {
                subscriber.error(seenValue ? new NotFoundError('No matching values') : new EmptyError());
            }
        }));
    });
}
//# sourceMappingURL=single.js.mapimport { filter } from './filter';
export function skip(count) {
    return filter(function (_, index) { return count <= index; });
}
//# sourceMappingURL=skip.js.mapimport { identity } from '../util/identity';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function skipLast(skipCount) {
    return skipCount <= 0
        ?
            identity
        : operate(function (source, subscriber) {
            var ring = new Array(skipCount);
            var seen = 0;
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                var valueIndex = seen++;
                if (valueIndex < skipCount) {
                    ring[valueIndex] = value;
                }
                else {
                    var index = valueIndex % skipCount;
                    var oldValue = ring[index];
                    ring[index] = value;
                    subscriber.next(oldValue);
                }
            }));
            return function () {
                ring = null;
            };
        });
}
//# sourceMappingURL=skipLast.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';
import { noop } from '../util/noop';
export function skipUntil(notifier) {
    return operate(function (source, subscriber) {
        var taking = false;
        var skipSubscriber = createOperatorSubscriber(subscriber, function () {
            skipSubscriber === null || skipSubscriber === void 0 ? void 0 : skipSubscriber.unsubscribe();
            taking = true;
        }, noop);
        innerFrom(notifier).subscribe(skipSubscriber);
        source.subscribe(createOperatorSubscriber(subscriber, function (value) { return taking && subscriber.next(value); }));
    });
}
//# sourceMappingURL=skipUntil.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function skipWhile(predicate) {
    return operate(function (source, subscriber) {
        var taking = false;
        var index = 0;
        source.subscribe(createOperatorSubscriber(subscriber, function (value) { return (taking || (taking = !predicate(value, index++))) && subscriber.next(value); }));
    });
}
//# sourceMappingURL=skipWhile.js.mapimport { concat } from '../observable/concat';
import { popScheduler } from '../util/args';
import { operate } from '../util/lift';
export function startWith() {
    var values = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        values[_i] = arguments[_i];
    }
    var scheduler = popScheduler(values);
    return operate(function (source, subscriber) {
        (scheduler ? concat(values, source, scheduler) : concat(values, source)).subscribe(subscriber);
    });
}
//# sourceMappingURL=startWith.js.mapimport { operate } from '../util/lift';
export function subscribeOn(scheduler, delay) {
    if (delay === void 0) { delay = 0; }
    return operate(function (source, subscriber) {
        subscriber.add(scheduler.schedule(function () { return source.subscribe(subscriber); }, delay));
    });
}
//# sourceMappingURL=subscribeOn.js.mapimport { switchMap } from './switchMap';
import { identity } from '../util/identity';
export function switchAll() {
    return switchMap(identity);
}
//# sourceMappingURL=switchAll.js.mapimport { innerFrom } from '../observable/innerFrom';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function switchMap(project, resultSelector) {
    return operate(function (source, subscriber) {
        var innerSubscriber = null;
        var index = 0;
        var isComplete = false;
        var checkComplete = function () { return isComplete && !innerSubscriber && subscriber.complete(); };
        source.subscribe(createOperatorSubscriber(subscriber, function (value) {
            innerSubscriber === null || innerSubscriber === void 0 ? void 0 : innerSubscriber.unsubscribe();
            var innerIndex = 0;
            var outerIndex = index++;
            innerFrom(project(value, outerIndex)).subscribe((innerSubscriber = createOperatorSubscriber(subscriber, function (innerValue) { return subscriber.next(resultSelector ? resultSelector(value, innerValue, outerIndex, innerIndex++) : innerValue); }, function () {
                innerSubscriber = null;
                checkComplete();
            })));
        }, function () {
            isComplete = true;
            checkComplete();
        }));
    });
}
//# sourceMappingURL=switchMap.js.mapimport { switchMap } from './switchMap';
import { isFunction } from '../util/isFunction';
export function switchMapTo(innerObservable, resultSelector) {
    return isFunction(resultSelector) ? switchMap(function () { return innerObservable; }, resultSelector) : switchMap(function () { return innerObservable; });
}
//# sourceMappingURL=switchMapTo.js.mapimport { switchMap } from './switchMap';
import { operate } from '../util/lift';
export function switchScan(accumulator, seed) {
    return operate(function (source, subscriber) {
        var state = seed;
        switchMap(function (value, index) { return accumulator(state, value, index); }, function (_, innerValue) { return ((state = innerValue), innerValue); })(source).subscribe(subscriber);
        return function () {
            state = null;
        };
    });
}
//# sourceMappingURL=switchScan.js.mapimport { EMPTY } from '../observable/empty';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function take(count) {
    return count <= 0
        ?
            function () { return EMPTY; }
        : operate(function (source, subscriber) {
            var seen = 0;
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                if (++seen <= count) {
                    subscriber.next(value);
                    if (count <= seen) {
                        subscriber.complete();
                    }
                }
            }));
        });
}
//# sourceMappingURL=take.js.mapimport { __values } from "tslib";
import { EMPTY } from '../observable/empty';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function takeLast(count) {
    return count <= 0
        ? function () { return EMPTY; }
        : operate(function (source, subscriber) {
            var buffer = [];
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                buffer.push(value);
                count < buffer.length && buffer.shift();
            }, function () {
                var e_1, _a;
                try {
                    for (var buffer_1 = __values(buffer), buffer_1_1 = buffer_1.next(); !buffer_1_1.done; buffer_1_1 = buffer_1.next()) {
                        var value = buffer_1_1.value;
                        subscriber.next(value);
                    }
                }
                catch (e_1_1) { e_1 = { error: e_1_1 }; }
                finally {
                    try {
                        if (buffer_1_1 && !buffer_1_1.done && (_a = buffer_1.return)) _a.call(buffer_1);
                    }
                    finally { if (e_1) throw e_1.error; }
                }
                subscriber.complete();
            }, undefined, function () {
                buffer = null;
            }));
        });
}
//# sourceMappingURL=takeLast.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';
import { noop } from '../util/noop';
export function takeUntil(notifier) {
    return operate(function (source, subscriber) {
        innerFrom(notifier).subscribe(createOperatorSubscriber(subscriber, function () { return subscriber.complete(); }, noop));
        !subscriber.closed && source.subscribe(subscriber);
    });
}
//# sourceMappingURL=takeUntil.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function takeWhile(predicate, inclusive) {
    if (inclusive === void 0) { inclusive = false; }
    return operate(function (source, subscriber) {
        var index = 0;
        source.subscribe(createOperatorSubscriber(subscriber, function (value) {
            var result = predicate(value, index++);
            (result || inclusive) && subscriber.next(value);
            !result && subscriber.complete();
        }));
    });
}
//# sourceMappingURL=takeWhile.js.mapimport { isFunction } from '../util/isFunction';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { identity } from '../util/identity';
export function tap(observerOrNext, error, complete) {
    var tapObserver = isFunction(observerOrNext) || error || complete
        ?
            { next: observerOrNext, error: error, complete: complete }
        : observerOrNext;
    return tapObserver
        ? operate(function (source, subscriber) {
            var _a;
            (_a = tapObserver.subscribe) === null || _a === void 0 ? void 0 : _a.call(tapObserver);
            var isUnsub = true;
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                var _a;
                (_a = tapObserver.next) === null || _a === void 0 ? void 0 : _a.call(tapObserver, value);
                subscriber.next(value);
            }, function () {
                var _a;
                isUnsub = false;
                (_a = tapObserver.complete) === null || _a === void 0 ? void 0 : _a.call(tapObserver);
                subscriber.complete();
            }, function (err) {
                var _a;
                isUnsub = false;
                (_a = tapObserver.error) === null || _a === void 0 ? void 0 : _a.call(tapObserver, err);
                subscriber.error(err);
            }, function () {
                var _a, _b;
                if (isUnsub) {
                    (_a = tapObserver.unsubscribe) === null || _a === void 0 ? void 0 : _a.call(tapObserver);
                }
                (_b = tapObserver.finalize) === null || _b === void 0 ? void 0 : _b.call(tapObserver);
            }));
        })
        :
            identity;
}
//# sourceMappingURL=tap.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';
export var defaultThrottleConfig = {
    leading: true,
    trailing: false,
};
export function throttle(durationSelector, config) {
    if (config === void 0) { config = defaultThrottleConfig; }
    return operate(function (source, subscriber) {
        var leading = config.leading, trailing = config.trailing;
        var hasValue = false;
        var sendValue = null;
        var throttled = null;
        var isComplete = false;
        var endThrottling = function () {
            throttled === null || throttled === void 0 ? void 0 : throttled.unsubscribe();
            throttled = null;
            if (trailing) {
                send();
                isComplete && subscriber.complete();
            }
        };
        var cleanupThrottling = function () {
            throttled = null;
            isComplete && subscriber.complete();
        };
        var startThrottle = function (value) {
            return (throttled = innerFrom(durationSelector(value)).subscribe(createOperatorSubscriber(subscriber, endThrottling, cleanupThrottling)));
        };
        var send = function () {
            if (hasValue) {
                hasValue = false;
                var value = sendValue;
                sendValue = null;
                subscriber.next(value);
                !isComplete && startThrottle(value);
            }
        };
        source.subscribe(createOperatorSubscriber(subscriber, function (value) {
            hasValue = true;
            sendValue = value;
            !(throttled && !throttled.closed) && (leading ? send() : startThrottle(value));
        }, function () {
            isComplete = true;
            !(trailing && hasValue && throttled && !throttled.closed) && subscriber.complete();
        }));
    });
}
//# sourceMappingURL=throttle.js.mapimport { asyncScheduler } from '../scheduler/async';
import { defaultThrottleConfig, throttle } from './throttle';
import { timer } from '../observable/timer';
export function throttleTime(duration, scheduler, config) {
    if (scheduler === void 0) { scheduler = asyncScheduler; }
    if (config === void 0) { config = defaultThrottleConfig; }
    var duration$ = timer(duration, scheduler);
    return throttle(function () { return duration$; }, config);
}
//# sourceMappingURL=throttleTime.js.mapimport { EmptyError } from '../util/EmptyError';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function throwIfEmpty(errorFactory) {
    if (errorFactory === void 0) { errorFactory = defaultErrorFactory; }
    return operate(function (source, subscriber) {
        var hasValue = false;
        source.subscribe(createOperatorSubscriber(subscriber, function (value) {
            hasValue = true;
            subscriber.next(value);
        }, function () { return (hasValue ? subscriber.complete() : subscriber.error(errorFactory())); }));
    });
}
function defaultErrorFactory() {
    return new EmptyError();
}
//# sourceMappingURL=throwIfEmpty.js.mapimport { asyncScheduler } from '../scheduler/async';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function timeInterval(scheduler) {
    if (scheduler === void 0) { scheduler = asyncScheduler; }
    return operate(function (source, subscriber) {
        var last = scheduler.now();
        source.subscribe(createOperatorSubscriber(subscriber, function (value) {
            var now = scheduler.now();
            var interval = now - last;
            last = now;
            subscriber.next(new TimeInterval(value, interval));
        }));
    });
}
var TimeInterval = (function () {
    function TimeInterval(value, interval) {
        this.value = value;
        this.interval = interval;
    }
    return TimeInterval;
}());
export { TimeInterval };
//# sourceMappingURL=timeInterval.js.mapimport { asyncScheduler } from '../scheduler/async';
import { isValidDate } from '../util/isDate';
import { operate } from '../util/lift';
import { innerFrom } from '../observable/innerFrom';
import { createErrorClass } from '../util/createErrorClass';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { executeSchedule } from '../util/executeSchedule';
export var TimeoutError = createErrorClass(function (_super) {
    return function TimeoutErrorImpl(info) {
        if (info === void 0) { info = null; }
        _super(this);
        this.message = 'Timeout has occurred';
        this.name = 'TimeoutError';
        this.info = info;
    };
});
export function timeout(config, schedulerArg) {
    var _a = (isValidDate(config) ? { first: config } : typeof config === 'number' ? { each: config } : config), first = _a.first, each = _a.each, _b = _a.with, _with = _b === void 0 ? timeoutErrorFactory : _b, _c = _a.scheduler, scheduler = _c === void 0 ? schedulerArg !== null && schedulerArg !== void 0 ? schedulerArg : asyncScheduler : _c, _d = _a.meta, meta = _d === void 0 ? null : _d;
    if (first == null && each == null) {
        throw new TypeError('No timeout provided.');
    }
    return operate(function (source, subscriber) {
        var originalSourceSubscription;
        var timerSubscription;
        var lastValue = null;
        var seen = 0;
        var startTimer = function (delay) {
            timerSubscription = executeSchedule(subscriber, scheduler, function () {
                try {
                    originalSourceSubscription.unsubscribe();
                    innerFrom(_with({
                        meta: meta,
                        lastValue: lastValue,
                        seen: seen,
                    })).subscribe(subscriber);
                }
                catch (err) {
                    subscriber.error(err);
                }
            }, delay);
        };
        originalSourceSubscription = source.subscribe(createOperatorSubscriber(subscriber, function (value) {
            timerSubscription === null || timerSubscription === void 0 ? void 0 : timerSubscription.unsubscribe();
            seen++;
            subscriber.next((lastValue = value));
            each > 0 && startTimer(each);
        }, undefined, undefined, function () {
            if (!(timerSubscription === null || timerSubscription === void 0 ? void 0 : timerSubscription.closed)) {
                timerSubscription === null || timerSubscription === void 0 ? void 0 : timerSubscription.unsubscribe();
            }
            lastValue = null;
        }));
        !seen && startTimer(first != null ? (typeof first === 'number' ? first : +first - scheduler.now()) : each);
    });
}
function timeoutErrorFactory(info) {
    throw new TimeoutError(info);
}
//# sourceMappingURL=timeout.js.mapimport { async } from '../scheduler/async';
import { isValidDate } from '../util/isDate';
import { timeout } from './timeout';
export function timeoutWith(due, withObservable, scheduler) {
    var first;
    var each;
    var _with;
    scheduler = scheduler !== null && scheduler !== void 0 ? scheduler : async;
    if (isValidDate(due)) {
        first = due;
    }
    else if (typeof due === 'number') {
        each = due;
    }
    if (withObservable) {
        _with = function () { return withObservable; };
    }
    else {
        throw new TypeError('No observable provided to switch to');
    }
    if (first == null && each == null) {
        throw new TypeError('No timeout provided.');
    }
    return timeout({
        first: first,
        each: each,
        scheduler: scheduler,
        with: _with,
    });
}
//# sourceMappingURL=timeoutWith.js.mapimport { dateTimestampProvider } from '../scheduler/dateTimestampProvider';
import { map } from './map';
export function timestamp(timestampProvider) {
    if (timestampProvider === void 0) { timestampProvider = dateTimestampProvider; }
    return map(function (value) { return ({ value: value, timestamp: timestampProvider.now() }); });
}
//# sourceMappingURL=timestamp.js.mapimport { reduce } from './reduce';
import { operate } from '../util/lift';
var arrReducer = function (arr, value) { return (arr.push(value), arr); };
export function toArray() {
    return operate(function (source, subscriber) {
        reduce(arrReducer, [])(source).subscribe(subscriber);
    });
}
//# sourceMappingURL=toArray.js.mapimport { Subject } from '../Subject';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { noop } from '../util/noop';
export function window(windowBoundaries) {
    return operate(function (source, subscriber) {
        var windowSubject = new Subject();
        subscriber.next(windowSubject.asObservable());
        var errorHandler = function (err) {
            windowSubject.error(err);
            subscriber.error(err);
        };
        source.subscribe(createOperatorSubscriber(subscriber, function (value) { return windowSubject === null || windowSubject === void 0 ? void 0 : windowSubject.next(value); }, function () {
            windowSubject.complete();
            subscriber.complete();
        }, errorHandler));
        windowBoundaries.subscribe(createOperatorSubscriber(subscriber, function () {
            windowSubject.complete();
            subscriber.next((windowSubject = new Subject()));
        }, noop, errorHandler));
        return function () {
            windowSubject === null || windowSubject === void 0 ? void 0 : windowSubject.unsubscribe();
            windowSubject = null;
        };
    });
}
//# sourceMappingURL=window.js.mapimport { __values } from "tslib";
import { Subject } from '../Subject';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function windowCount(windowSize, startWindowEvery) {
    if (startWindowEvery === void 0) { startWindowEvery = 0; }
    var startEvery = startWindowEvery > 0 ? startWindowEvery : windowSize;
    return operate(function (source, subscriber) {
        var windows = [new Subject()];
        var starts = [];
        var count = 0;
        subscriber.next(windows[0].asObservable());
        source.subscribe(createOperatorSubscriber(subscriber, function (value) {
            var e_1, _a;
            try {
                for (var windows_1 = __values(windows), windows_1_1 = windows_1.next(); !windows_1_1.done; windows_1_1 = windows_1.next()) {
                    var window_1 = windows_1_1.value;
                    window_1.next(value);
                }
            }
            catch (e_1_1) { e_1 = { error: e_1_1 }; }
            finally {
                try {
                    if (windows_1_1 && !windows_1_1.done && (_a = windows_1.return)) _a.call(windows_1);
                }
                finally { if (e_1) throw e_1.error; }
            }
            var c = count - windowSize + 1;
            if (c >= 0 && c % startEvery === 0) {
                windows.shift().complete();
            }
            if (++count % startEvery === 0) {
                var window_2 = new Subject();
                windows.push(window_2);
                subscriber.next(window_2.asObservable());
            }
        }, function () {
            while (windows.length > 0) {
                windows.shift().complete();
            }
            subscriber.complete();
        }, function (err) {
            while (windows.length > 0) {
                windows.shift().error(err);
            }
            subscriber.error(err);
        }, function () {
            starts = null;
            windows = null;
        }));
    });
}
//# sourceMappingURL=windowCount.js.mapimport { Subject } from '../Subject';
import { asyncScheduler } from '../scheduler/async';
import { Subscription } from '../Subscription';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { arrRemove } from '../util/arrRemove';
import { popScheduler } from '../util/args';
import { executeSchedule } from '../util/executeSchedule';
export function windowTime(windowTimeSpan) {
    var _a, _b;
    var otherArgs = [];
    for (var _i = 1; _i < arguments.length; _i++) {
        otherArgs[_i - 1] = arguments[_i];
    }
    var scheduler = (_a = popScheduler(otherArgs)) !== null && _a !== void 0 ? _a : asyncScheduler;
    var windowCreationInterval = (_b = otherArgs[0]) !== null && _b !== void 0 ? _b : null;
    var maxWindowSize = otherArgs[1] || Infinity;
    return operate(function (source, subscriber) {
        var windowRecords = [];
        var restartOnClose = false;
        var closeWindow = function (record) {
            var window = record.window, subs = record.subs;
            window.complete();
            subs.unsubscribe();
            arrRemove(windowRecords, record);
            restartOnClose && startWindow();
        };
        var startWindow = function () {
            if (windowRecords) {
                var subs = new Subscription();
                subscriber.add(subs);
                var window_1 = new Subject();
                var record_1 = {
                    window: window_1,
                    subs: subs,
                    seen: 0,
                };
                windowRecords.push(record_1);
                subscriber.next(window_1.asObservable());
                executeSchedule(subs, scheduler, function () { return closeWindow(record_1); }, windowTimeSpan);
            }
        };
        if (windowCreationInterval !== null && windowCreationInterval >= 0) {
            executeSchedule(subscriber, scheduler, startWindow, windowCreationInterval, true);
        }
        else {
            restartOnClose = true;
        }
        startWindow();
        var loop = function (cb) { return windowRecords.slice().forEach(cb); };
        var terminate = function (cb) {
            loop(function (_a) {
                var window = _a.window;
                return cb(window);
            });
            cb(subscriber);
            subscriber.unsubscribe();
        };
        source.subscribe(createOperatorSubscriber(subscriber, function (value) {
            loop(function (record) {
                record.window.next(value);
                maxWindowSize <= ++record.seen && closeWindow(record);
            });
        }, function () { return terminate(function (consumer) { return consumer.complete(); }); }, function (err) { return terminate(function (consumer) { return consumer.error(err); }); }));
        return function () {
            windowRecords = null;
        };
    });
}
//# sourceMappingURL=windowTime.js.mapimport { __values } from "tslib";
import { Subject } from '../Subject';
import { Subscription } from '../Subscription';
import { operate } from '../util/lift';
import { innerFrom } from '../observable/innerFrom';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { noop } from '../util/noop';
import { arrRemove } from '../util/arrRemove';
export function windowToggle(openings, closingSelector) {
    return operate(function (source, subscriber) {
        var windows = [];
        var handleError = function (err) {
            while (0 < windows.length) {
                windows.shift().error(err);
            }
            subscriber.error(err);
        };
        innerFrom(openings).subscribe(createOperatorSubscriber(subscriber, function (openValue) {
            var window = new Subject();
            windows.push(window);
            var closingSubscription = new Subscription();
            var closeWindow = function () {
                arrRemove(windows, window);
                window.complete();
                closingSubscription.unsubscribe();
            };
            var closingNotifier;
            try {
                closingNotifier = innerFrom(closingSelector(openValue));
            }
            catch (err) {
                handleError(err);
                return;
            }
            subscriber.next(window.asObservable());
            closingSubscription.add(closingNotifier.subscribe(createOperatorSubscriber(subscriber, closeWindow, noop, handleError)));
        }, noop));
        source.subscribe(createOperatorSubscriber(subscriber, function (value) {
            var e_1, _a;
            var windowsCopy = windows.slice();
            try {
                for (var windowsCopy_1 = __values(windowsCopy), windowsCopy_1_1 = windowsCopy_1.next(); !windowsCopy_1_1.done; windowsCopy_1_1 = windowsCopy_1.next()) {
                    var window_1 = windowsCopy_1_1.value;
                    window_1.next(value);
                }
            }
            catch (e_1_1) { e_1 = { error: e_1_1 }; }
            finally {
                try {
                    if (windowsCopy_1_1 && !windowsCopy_1_1.done && (_a = windowsCopy_1.return)) _a.call(windowsCopy_1);
                }
                finally { if (e_1) throw e_1.error; }
            }
        }, function () {
            while (0 < windows.length) {
                windows.shift().complete();
            }
            subscriber.complete();
        }, handleError, function () {
            while (0 < windows.length) {
                windows.shift().unsubscribe();
            }
        }));
    });
}
//# sourceMappingURL=windowToggle.js.mapimport { Subject } from '../Subject';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';
export function windowWhen(closingSelector) {
    return operate(function (source, subscriber) {
        var window;
        var closingSubscriber;
        var handleError = function (err) {
            window.error(err);
            subscriber.error(err);
        };
        var openWindow = function () {
            closingSubscriber === null || closingSubscriber === void 0 ? void 0 : closingSubscriber.unsubscribe();
            window === null || window === void 0 ? void 0 : window.complete();
            window = new Subject();
            subscriber.next(window.asObservable());
            var closingNotifier;
            try {
                closingNotifier = innerFrom(closingSelector());
            }
            catch (err) {
                handleError(err);
                return;
            }
            closingNotifier.subscribe((closingSubscriber = createOperatorSubscriber(subscriber, openWindow, openWindow, handleError)));
        };
        openWindow();
        source.subscribe(createOperatorSubscriber(subscriber, function (value) { return window.next(value); }, function () {
            window.complete();
            subscriber.complete();
        }, handleError, function () {
            closingSubscriber === null || closingSubscriber === void 0 ? void 0 : closingSubscriber.unsubscribe();
            window = null;
        }));
    });
}
//# sourceMappingURL=windowWhen.js.mapimport { __read, __spreadArray } from "tslib";
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';
import { identity } from '../util/identity';
import { noop } from '../util/noop';
import { popResultSelector } from '../util/args';
export function withLatestFrom() {
    var inputs = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        inputs[_i] = arguments[_i];
    }
    var project = popResultSelector(inputs);
    return operate(function (source, subscriber) {
        var len = inputs.length;
        var otherValues = new Array(len);
        var hasValue = inputs.map(function () { return false; });
        var ready = false;
        var _loop_1 = function (i) {
            innerFrom(inputs[i]).subscribe(createOperatorSubscriber(subscriber, function (value) {
                otherValues[i] = value;
                if (!ready && !hasValue[i]) {
                    hasValue[i] = true;
                    (ready = hasValue.every(identity)) && (hasValue = null);
                }
            }, noop));
        };
        for (var i = 0; i < len; i++) {
            _loop_1(i);
        }
        source.subscribe(createOperatorSubscriber(subscriber, function (value) {
            if (ready) {
                var values = __spreadArray([value], __read(otherValues));
                subscriber.next(project ? project.apply(void 0, __spreadArray([], __read(values))) : values);
            }
        }));
    });
}
//# sourceMappingURL=withLatestFrom.js.mapimport { __read, __spreadArray } from "tslib";
import { zip as zipStatic } from '../observable/zip';
import { operate } from '../util/lift';
export function zip() {
    var sources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        sources[_i] = arguments[_i];
    }
    return operate(function (source, subscriber) {
        zipStatic.apply(void 0, __spreadArray([source], __read(sources))).subscribe(subscriber);
    });
}
//# sourceMappingURL=zip.js.mapimport { zip } from '../observable/zip';
import { joinAllInternals } from './joinAllInternals';
export function zipAll(project) {
    return joinAllInternals(zip, project);
}
//# sourceMappingURL=zipAll.js.mapimport { __read, __spreadArray } from "tslib";
import { zip } from './zip';
export function zipWith() {
    var otherInputs = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        otherInputs[_i] = arguments[_i];
    }
    return zip.apply(void 0, __spreadArray([], __read(otherInputs)));
}
//# sourceMappingURL=zipWith.js.mapimport { __extends } from "tslib";
import { Observable } from '../Observable';
import { Subscription } from '../Subscription';
import { refCount as higherOrderRefCount } from '../operators/refCount';
import { createOperatorSubscriber } from '../operators/OperatorSubscriber';
import { hasLift } from '../util/lift';
var ConnectableObservable = (function (_super) {
    __extends(ConnectableObservable, _super);
    function ConnectableObservable(source, subjectFactory) {
        var _this = _super.call(this) || this;
        _this.source = source;
        _this.subjectFactory = subjectFactory;
        _this._subject = null;
        _this._refCount = 0;
        _this._connection = null;
        if (hasLift(source)) {
            _this.lift = source.lift;
        }
        return _this;
    }
    ConnectableObservable.prototype._subscribe = function (subscriber) {
        return this.getSubject().subscribe(subscriber);
    };
    ConnectableObservable.prototype.getSubject = function () {
        var subject = this._subject;
        if (!subject || subject.isStopped) {
            this._subject = this.subjectFactory();
        }
        return this._subject;
    };
    ConnectableObservable.prototype._teardown = function () {
        this._refCount = 0;
        var _connection = this._connection;
        this._subject = this._connection = null;
        _connection === null || _connection === void 0 ? void 0 : _connection.unsubscribe();
    };
    ConnectableObservable.prototype.connect = function () {
        var _this = this;
        var connection = this._connection;
        if (!connection) {
            connection = this._connection = new Subscription();
            var subject_1 = this.getSubject();
            connection.add(this.source.subscribe(createOperatorSubscriber(subject_1, undefined, function () {
                _this._teardown();
                subject_1.complete();
            }, function (err) {
                _this._teardown();
                subject_1.error(err);
            }, function () { return _this._teardown(); })));
            if (connection.closed) {
                this._connection = null;
                connection = Subscription.EMPTY;
            }
        }
        return connection;
    };
    ConnectableObservable.prototype.refCount = function () {
        return higherOrderRefCount()(this);
    };
    return ConnectableObservable;
}(Observable));
export { ConnectableObservable };
//# sourceMappingURL=ConnectableObservable.js.mapimport { bindCallbackInternals } from './bindCallbackInternals';
export function bindCallback(callbackFunc, resultSelector, scheduler) {
    return bindCallbackInternals(false, callbackFunc, resultSelector, scheduler);
}
//# sourceMappingURL=bindCallback.js.mapimport { __read, __spreadArray } from "tslib";
import { isScheduler } from '../util/isScheduler';
import { Observable } from '../Observable';
import { subscribeOn } from '../operators/subscribeOn';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';
import { observeOn } from '../operators/observeOn';
import { AsyncSubject } from '../AsyncSubject';
export function bindCallbackInternals(isNodeStyle, callbackFunc, resultSelector, scheduler) {
    if (resultSelector) {
        if (isScheduler(resultSelector)) {
            scheduler = resultSelector;
        }
        else {
            return function () {
                var args = [];
                for (var _i = 0; _i < arguments.length; _i++) {
                    args[_i] = arguments[_i];
                }
                return bindCallbackInternals(isNodeStyle, callbackFunc, scheduler)
                    .apply(this, args)
                    .pipe(mapOneOrManyArgs(resultSelector));
            };
        }
    }
    if (scheduler) {
        return function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            return bindCallbackInternals(isNodeStyle, callbackFunc)
                .apply(this, args)
                .pipe(subscribeOn(scheduler), observeOn(scheduler));
        };
    }
    return function () {
        var _this = this;
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        var subject = new AsyncSubject();
        var uninitialized = true;
        return new Observable(function (subscriber) {
            var subs = subject.subscribe(subscriber);
            if (uninitialized) {
                uninitialized = false;
                var isAsync_1 = false;
                var isComplete_1 = false;
                callbackFunc.apply(_this, __spreadArray(__spreadArray([], __read(args)), [
                    function () {
                        var results = [];
                        for (var _i = 0; _i < arguments.length; _i++) {
                            results[_i] = arguments[_i];
                        }
                        if (isNodeStyle) {
                            var err = results.shift();
                            if (err != null) {
                                subject.error(err);
                                return;
                            }
                        }
                        subject.next(1 < results.length ? results : results[0]);
                        isComplete_1 = true;
                        if (isAsync_1) {
                            subject.complete();
                        }
                    },
                ]));
                if (isComplete_1) {
                    subject.complete();
                }
                isAsync_1 = true;
            }
            return subs;
        });
    };
}
//# sourceMappingURL=bindCallbackInternals.js.mapimport { bindCallbackInternals } from './bindCallbackInternals';
export function bindNodeCallback(callbackFunc, resultSelector, scheduler) {
    return bindCallbackInternals(true, callbackFunc, resultSelector, scheduler);
}
//# sourceMappingURL=bindNodeCallback.js.mapimport { Observable } from '../Observable';
import { argsArgArrayOrObject } from '../util/argsArgArrayOrObject';
import { from } from './from';
import { identity } from '../util/identity';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';
import { popResultSelector, popScheduler } from '../util/args';
import { createObject } from '../util/createObject';
import { createOperatorSubscriber } from '../operators/OperatorSubscriber';
import { executeSchedule } from '../util/executeSchedule';
export function combineLatest() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var scheduler = popScheduler(args);
    var resultSelector = popResultSelector(args);
    var _a = argsArgArrayOrObject(args), observables = _a.args, keys = _a.keys;
    if (observables.length === 0) {
        return from([], scheduler);
    }
    var result = new Observable(combineLatestInit(observables, scheduler, keys
        ?
            function (values) { return createObject(keys, values); }
        :
            identity));
    return resultSelector ? result.pipe(mapOneOrManyArgs(resultSelector)) : result;
}
export function combineLatestInit(observables, scheduler, valueTransform) {
    if (valueTransform === void 0) { valueTransform = identity; }
    return function (subscriber) {
        maybeSchedule(scheduler, function () {
            var length = observables.length;
            var values = new Array(length);
            var active = length;
            var remainingFirstValues = length;
            var _loop_1 = function (i) {
                maybeSchedule(scheduler, function () {
                    var source = from(observables[i], scheduler);
                    var hasFirstValue = false;
                    source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                        values[i] = value;
                        if (!hasFirstValue) {
                            hasFirstValue = true;
                            remainingFirstValues--;
                        }
                        if (!remainingFirstValues) {
                            subscriber.next(valueTransform(values.slice()));
                        }
                    }, function () {
                        if (!--active) {
                            subscriber.complete();
                        }
                    }));
                }, subscriber);
            };
            for (var i = 0; i < length; i++) {
                _loop_1(i);
            }
        }, subscriber);
    };
}
function maybeSchedule(scheduler, execute, subscription) {
    if (scheduler) {
        executeSchedule(subscription, scheduler, execute);
    }
    else {
        execute();
    }
}
//# sourceMappingURL=combineLatest.js.mapimport { concatAll } from '../operators/concatAll';
import { popScheduler } from '../util/args';
import { from } from './from';
export function concat() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    return concatAll()(from(args, popScheduler(args)));
}
//# sourceMappingURL=concat.js.mapimport { Subject } from '../Subject';
import { Observable } from '../Observable';
import { defer } from './defer';
var DEFAULT_CONFIG = {
    connector: function () { return new Subject(); },
    resetOnDisconnect: true,
};
export function connectable(source, config) {
    if (config === void 0) { config = DEFAULT_CONFIG; }
    var connection = null;
    var connector = config.connector, _a = config.resetOnDisconnect, resetOnDisconnect = _a === void 0 ? true : _a;
    var subject = connector();
    var result = new Observable(function (subscriber) {
        return subject.subscribe(subscriber);
    });
    result.connect = function () {
        if (!connection || connection.closed) {
            connection = defer(function () { return source; }).subscribe(subject);
            if (resetOnDisconnect) {
                connection.add(function () { return (subject = connector()); });
            }
        }
        return connection;
    };
    return result;
}
//# sourceMappingURL=connectable.js.mapimport { Observable } from '../Observable';
import { innerFrom } from './innerFrom';
export function defer(observableFactory) {
    return new Observable(function (subscriber) {
        innerFrom(observableFactory()).subscribe(subscriber);
    });
}
//# sourceMappingURL=defer.js.mapimport { Observable } from '../Observable';
export var EMPTY = new Observable(function (subscriber) { return subscriber.complete(); });
export function empty(scheduler) {
    return scheduler ? emptyScheduled(scheduler) : EMPTY;
}
function emptyScheduled(scheduler) {
    return new Observable(function (subscriber) { return scheduler.schedule(function () { return subscriber.complete(); }); });
}
//# sourceMappingURL=empty.js.mapimport { Observable } from '../Observable';
import { argsArgArrayOrObject } from '../util/argsArgArrayOrObject';
import { innerFrom } from './innerFrom';
import { popResultSelector } from '../util/args';
import { createOperatorSubscriber } from '../operators/OperatorSubscriber';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';
import { createObject } from '../util/createObject';
export function forkJoin() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var resultSelector = popResultSelector(args);
    var _a = argsArgArrayOrObject(args), sources = _a.args, keys = _a.keys;
    var result = new Observable(function (subscriber) {
        var length = sources.length;
        if (!length) {
            subscriber.complete();
            return;
        }
        var values = new Array(length);
        var remainingCompletions = length;
        var remainingEmissions = length;
        var _loop_1 = function (sourceIndex) {
            var hasValue = false;
            innerFrom(sources[sourceIndex]).subscribe(createOperatorSubscriber(subscriber, function (value) {
                if (!hasValue) {
                    hasValue = true;
                    remainingEmissions--;
                }
                values[sourceIndex] = value;
            }, function () { return remainingCompletions--; }, undefined, function () {
                if (!remainingCompletions || !hasValue) {
                    if (!remainingEmissions) {
                        subscriber.next(keys ? createObject(keys, values) : values);
                    }
                    subscriber.complete();
                }
            }));
        };
        for (var sourceIndex = 0; sourceIndex < length; sourceIndex++) {
            _loop_1(sourceIndex);
        }
    });
    return resultSelector ? result.pipe(mapOneOrManyArgs(resultSelector)) : result;
}
//# sourceMappingURL=forkJoin.js.mapimport { scheduled } from '../scheduled/scheduled';
import { innerFrom } from './innerFrom';
export function from(input, scheduler) {
    return scheduler ? scheduled(input, scheduler) : innerFrom(input);
}
//# sourceMappingURL=from.js.mapimport { __read } from "tslib";
import { innerFrom } from '../observable/innerFrom';
import { Observable } from '../Observable';
import { mergeMap } from '../operators/mergeMap';
import { isArrayLike } from '../util/isArrayLike';
import { isFunction } from '../util/isFunction';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';
var nodeEventEmitterMethods = ['addListener', 'removeListener'];
var eventTargetMethods = ['addEventListener', 'removeEventListener'];
var jqueryMethods = ['on', 'off'];
export function fromEvent(target, eventName, options, resultSelector) {
    if (isFunction(options)) {
        resultSelector = options;
        options = undefined;
    }
    if (resultSelector) {
        return fromEvent(target, eventName, options).pipe(mapOneOrManyArgs(resultSelector));
    }
    var _a = __read(isEventTarget(target)
        ? eventTargetMethods.map(function (methodName) { return function (handler) { return target[methodName](eventName, handler, options); }; })
        :
            isNodeStyleEventEmitter(target)
                ? nodeEventEmitterMethods.map(toCommonHandlerRegistry(target, eventName))
                : isJQueryStyleEventEmitter(target)
                    ? jqueryMethods.map(toCommonHandlerRegistry(target, eventName))
                    : [], 2), add = _a[0], remove = _a[1];
    if (!add) {
        if (isArrayLike(target)) {
            return mergeMap(function (subTarget) { return fromEvent(subTarget, eventName, options); })(innerFrom(target));
        }
    }
    if (!add) {
        throw new TypeError('Invalid event target');
    }
    return new Observable(function (subscriber) {
        var handler = function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            return subscriber.next(1 < args.length ? args : args[0]);
        };
        add(handler);
        return function () { return remove(handler); };
    });
}
function toCommonHandlerRegistry(target, eventName) {
    return function (methodName) { return function (handler) { return target[methodName](eventName, handler); }; };
}
function isNodeStyleEventEmitter(target) {
    return isFunction(target.addListener) && isFunction(target.removeListener);
}
function isJQueryStyleEventEmitter(target) {
    return isFunction(target.on) && isFunction(target.off);
}
function isEventTarget(target) {
    return isFunction(target.addEventListener) && isFunction(target.removeEventListener);
}
//# sourceMappingURL=fromEvent.js.mapimport { Observable } from '../Observable';
import { isFunction } from '../util/isFunction';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';
export function fromEventPattern(addHandler, removeHandler, resultSelector) {
    if (resultSelector) {
        return fromEventPattern(addHandler, removeHandler).pipe(mapOneOrManyArgs(resultSelector));
    }
    return new Observable(function (subscriber) {
        var handler = function () {
            var e = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                e[_i] = arguments[_i];
            }
            return subscriber.next(e.length === 1 ? e[0] : e);
        };
        var retValue = addHandler(handler);
        return isFunction(removeHandler) ? function () { return removeHandler(handler, retValue); } : undefined;
    });
}
//# sourceMappingURL=fromEventPattern.js.mapimport { Observable } from '../Observable';
export function fromSubscribable(subscribable) {
    return new Observable(function (subscriber) { return subscribable.subscribe(subscriber); });
}
//# sourceMappingURL=fromSubscribable.js.mapimport { __generator } from "tslib";
import { identity } from '../util/identity';
import { isScheduler } from '../util/isScheduler';
import { defer } from './defer';
import { scheduleIterable } from '../scheduled/scheduleIterable';
export function generate(initialStateOrOptions, condition, iterate, resultSelectorOrScheduler, scheduler) {
    var _a, _b;
    var resultSelector;
    var initialState;
    if (arguments.length === 1) {
        (_a = initialStateOrOptions, initialState = _a.initialState, condition = _a.condition, iterate = _a.iterate, _b = _a.resultSelector, resultSelector = _b === void 0 ? identity : _b, scheduler = _a.scheduler);
    }
    else {
        initialState = initialStateOrOptions;
        if (!resultSelectorOrScheduler || isScheduler(resultSelectorOrScheduler)) {
            resultSelector = identity;
            scheduler = resultSelectorOrScheduler;
        }
        else {
            resultSelector = resultSelectorOrScheduler;
        }
    }
    function gen() {
        var state;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    state = initialState;
                    _a.label = 1;
                case 1:
                    if (!(!condition || condition(state))) return [3, 4];
                    return [4, resultSelector(state)];
                case 2:
                    _a.sent();
                    _a.label = 3;
                case 3:
                    state = iterate(state);
                    return [3, 1];
                case 4: return [2];
            }
        });
    }
    return defer((scheduler
        ?
            function () { return scheduleIterable(gen(), scheduler); }
        :
            gen));
}
//# sourceMappingURL=generate.js.mapimport { defer } from './defer';
export function iif(condition, trueResult, falseResult) {
    return defer(function () { return (condition() ? trueResult : falseResult); });
}
//# sourceMappingURL=iif.js.mapimport { __asyncValues, __awaiter, __generator, __values } from "tslib";
import { isArrayLike } from '../util/isArrayLike';
import { isPromise } from '../util/isPromise';
import { Observable } from '../Observable';
import { isInteropObservable } from '../util/isInteropObservable';
import { isAsyncIterable } from '../util/isAsyncIterable';
import { createInvalidObservableTypeError } from '../util/throwUnobservableError';
import { isIterable } from '../util/isIterable';
import { isReadableStreamLike, readableStreamLikeToAsyncGenerator } from '../util/isReadableStreamLike';
import { isFunction } from '../util/isFunction';
import { reportUnhandledError } from '../util/reportUnhandledError';
import { observable as Symbol_observable } from '../symbol/observable';
export function innerFrom(input) {
    if (input instanceof Observable) {
        return input;
    }
    if (input != null) {
        if (isInteropObservable(input)) {
            return fromInteropObservable(input);
        }
        if (isArrayLike(input)) {
            return fromArrayLike(input);
        }
        if (isPromise(input)) {
            return fromPromise(input);
        }
        if (isAsyncIterable(input)) {
            return fromAsyncIterable(input);
        }
        if (isIterable(input)) {
            return fromIterable(input);
        }
        if (isReadableStreamLike(input)) {
            return fromReadableStreamLike(input);
        }
    }
    throw createInvalidObservableTypeError(input);
}
export function fromInteropObservable(obj) {
    return new Observable(function (subscriber) {
        var obs = obj[Symbol_observable]();
        if (isFunction(obs.subscribe)) {
            return obs.subscribe(subscriber);
        }
        throw new TypeError('Provided object does not correctly implement Symbol.observable');
    });
}
export function fromArrayLike(array) {
    return new Observable(function (subscriber) {
        for (var i = 0; i < array.length && !subscriber.closed; i++) {
            subscriber.next(array[i]);
        }
        subscriber.complete();
    });
}
export function fromPromise(promise) {
    return new Observable(function (subscriber) {
        promise
            .then(function (value) {
            if (!subscriber.closed) {
                subscriber.next(value);
                subscriber.complete();
            }
        }, function (err) { return subscriber.error(err); })
            .then(null, reportUnhandledError);
    });
}
export function fromIterable(iterable) {
    return new Observable(function (subscriber) {
        var e_1, _a;
        try {
            for (var iterable_1 = __values(iterable), iterable_1_1 = iterable_1.next(); !iterable_1_1.done; iterable_1_1 = iterable_1.next()) {
                var value = iterable_1_1.value;
                subscriber.next(value);
                if (subscriber.closed) {
                    return;
                }
            }
        }
        catch (e_1_1) { e_1 = { error: e_1_1 }; }
        finally {
            try {
                if (iterable_1_1 && !iterable_1_1.done && (_a = iterable_1.return)) _a.call(iterable_1);
            }
            finally { if (e_1) throw e_1.error; }
        }
        subscriber.complete();
    });
}
export function fromAsyncIterable(asyncIterable) {
    return new Observable(function (subscriber) {
        process(asyncIterable, subscriber).catch(function (err) { return subscriber.error(err); });
    });
}
export function fromReadableStreamLike(readableStream) {
    return fromAsyncIterable(readableStreamLikeToAsyncGenerator(readableStream));
}
function process(asyncIterable, subscriber) {
    var asyncIterable_1, asyncIterable_1_1;
    var e_2, _a;
    return __awaiter(this, void 0, void 0, function () {
        var value, e_2_1;
        return __generator(this, function (_b) {
            switch (_b.label) {
                case 0:
                    _b.trys.push([0, 5, 6, 11]);
                    asyncIterable_1 = __asyncValues(asyncIterable);
                    _b.label = 1;
                case 1: return [4, asyncIterable_1.next()];
                case 2:
                    if (!(asyncIterable_1_1 = _b.sent(), !asyncIterable_1_1.done)) return [3, 4];
                    value = asyncIterable_1_1.value;
                    subscriber.next(value);
                    if (subscriber.closed) {
                        return [2];
                    }
                    _b.label = 3;
                case 3: return [3, 1];
                case 4: return [3, 11];
                case 5:
                    e_2_1 = _b.sent();
                    e_2 = { error: e_2_1 };
                    return [3, 11];
                case 6:
                    _b.trys.push([6, , 9, 10]);
                    if (!(asyncIterable_1_1 && !asyncIterable_1_1.done && (_a = asyncIterable_1.return))) return [3, 8];
                    return [4, _a.call(asyncIterable_1)];
                case 7:
                    _b.sent();
                    _b.label = 8;
                case 8: return [3, 10];
                case 9:
                    if (e_2) throw e_2.error;
                    return [7];
                case 10: return [7];
                case 11:
                    subscriber.complete();
                    return [2];
            }
        });
    });
}
//# sourceMappingURL=innerFrom.js.mapimport { asyncScheduler } from '../scheduler/async';
import { timer } from './timer';
export function interval(period, scheduler) {
    if (period === void 0) { period = 0; }
    if (scheduler === void 0) { scheduler = asyncScheduler; }
    if (period < 0) {
        period = 0;
    }
    return timer(period, period, scheduler);
}
//# sourceMappingURL=interval.js.mapimport { mergeAll } from '../operators/mergeAll';
import { innerFrom } from './innerFrom';
import { EMPTY } from './empty';
import { popNumber, popScheduler } from '../util/args';
import { from } from './from';
export function merge() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var scheduler = popScheduler(args);
    var concurrent = popNumber(args, Infinity);
    var sources = args;
    return !sources.length
        ?
            EMPTY
        : sources.length === 1
            ?
                innerFrom(sources[0])
            :
                mergeAll(concurrent)(from(sources, scheduler));
}
//# sourceMappingURL=merge.js.mapimport { Observable } from '../Observable';
import { noop } from '../util/noop';
export var NEVER = new Observable(noop);
export function never() {
    return NEVER;
}
//# sourceMappingURL=never.js.mapimport { popScheduler } from '../util/args';
import { from } from './from';
export function of() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var scheduler = popScheduler(args);
    return from(args, scheduler);
}
//# sourceMappingURL=of.js.mapimport { EMPTY } from './empty';
import { onErrorResumeNext as onErrorResumeNextWith } from '../operators/onErrorResumeNext';
import { argsOrArgArray } from '../util/argsOrArgArray';
export function onErrorResumeNext() {
    var sources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        sources[_i] = arguments[_i];
    }
    return onErrorResumeNextWith(argsOrArgArray(sources))(EMPTY);
}
//# sourceMappingURL=onErrorResumeNext.js.mapimport { from } from './from';
export function pairs(obj, scheduler) {
    return from(Object.entries(obj), scheduler);
}
//# sourceMappingURL=pairs.js.mapimport { not } from '../util/not';
import { filter } from '../operators/filter';
import { innerFrom } from './innerFrom';
export function partition(source, predicate, thisArg) {
    return [filter(predicate, thisArg)(innerFrom(source)), filter(not(predicate, thisArg))(innerFrom(source))];
}
//# sourceMappingURL=partition.js.mapimport { Observable } from '../Observable';
import { innerFrom } from './innerFrom';
import { argsOrArgArray } from '../util/argsOrArgArray';
import { createOperatorSubscriber } from '../operators/OperatorSubscriber';
export function race() {
    var sources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        sources[_i] = arguments[_i];
    }
    sources = argsOrArgArray(sources);
    return sources.length === 1 ? innerFrom(sources[0]) : new Observable(raceInit(sources));
}
export function raceInit(sources) {
    return function (subscriber) {
        var subscriptions = [];
        var _loop_1 = function (i) {
            subscriptions.push(innerFrom(sources[i]).subscribe(createOperatorSubscriber(subscriber, function (value) {
                if (subscriptions) {
                    for (var s = 0; s < subscriptions.length; s++) {
                        s !== i && subscriptions[s].unsubscribe();
                    }
                    subscriptions = null;
                }
                subscriber.next(value);
            })));
        };
        for (var i = 0; subscriptions && !subscriber.closed && i < sources.length; i++) {
            _loop_1(i);
        }
    };
}
//# sourceMappingURL=race.js.mapimport { Observable } from '../Observable';
import { EMPTY } from './empty';
export function range(start, count, scheduler) {
    if (count == null) {
        count = start;
        start = 0;
    }
    if (count <= 0) {
        return EMPTY;
    }
    var end = count + start;
    return new Observable(scheduler
        ?
            function (subscriber) {
                var n = start;
                return scheduler.schedule(function () {
                    if (n < end) {
                        subscriber.next(n++);
                        this.schedule();
                    }
                    else {
                        subscriber.complete();
                    }
                });
            }
        :
            function (subscriber) {
                var n = start;
                while (n < end && !subscriber.closed) {
                    subscriber.next(n++);
                }
                subscriber.complete();
            });
}
//# sourceMappingURL=range.js.mapimport { Observable } from '../Observable';
import { isFunction } from '../util/isFunction';
export function throwError(errorOrErrorFactory, scheduler) {
    var errorFactory = isFunction(errorOrErrorFactory) ? errorOrErrorFactory : function () { return errorOrErrorFactory; };
    var init = function (subscriber) { return subscriber.error(errorFactory()); };
    return new Observable(scheduler ? function (subscriber) { return scheduler.schedule(init, 0, subscriber); } : init);
}
//# sourceMappingURL=throwError.js.mapimport { Observable } from '../Observable';
import { async as asyncScheduler } from '../scheduler/async';
import { isScheduler } from '../util/isScheduler';
import { isValidDate } from '../util/isDate';
export function timer(dueTime, intervalOrScheduler, scheduler) {
    if (dueTime === void 0) { dueTime = 0; }
    if (scheduler === void 0) { scheduler = asyncScheduler; }
    var intervalDuration = -1;
    if (intervalOrScheduler != null) {
        if (isScheduler(intervalOrScheduler)) {
            scheduler = intervalOrScheduler;
        }
        else {
            intervalDuration = intervalOrScheduler;
        }
    }
    return new Observable(function (subscriber) {
        var due = isValidDate(dueTime) ? +dueTime - scheduler.now() : dueTime;
        if (due < 0) {
            due = 0;
        }
        var n = 0;
        return scheduler.schedule(function () {
            if (!subscriber.closed) {
                subscriber.next(n++);
                if (0 <= intervalDuration) {
                    this.schedule(undefined, intervalDuration);
                }
                else {
                    subscriber.complete();
                }
            }
        }, due);
    });
}
//# sourceMappingURL=timer.js.mapimport { Observable } from '../Observable';
import { innerFrom } from './innerFrom';
import { EMPTY } from './empty';
export function using(resourceFactory, observableFactory) {
    return new Observable(function (subscriber) {
        var resource = resourceFactory();
        var result = observableFactory(resource);
        var source = result ? innerFrom(result) : EMPTY;
        source.subscribe(subscriber);
        return function () {
            if (resource) {
                resource.unsubscribe();
            }
        };
    });
}
//# sourceMappingURL=using.js.mapimport { __read, __spreadArray } from "tslib";
import { Observable } from '../Observable';
import { innerFrom } from './innerFrom';
import { argsOrArgArray } from '../util/argsOrArgArray';
import { EMPTY } from './empty';
import { createOperatorSubscriber } from '../operators/OperatorSubscriber';
import { popResultSelector } from '../util/args';
export function zip() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var resultSelector = popResultSelector(args);
    var sources = argsOrArgArray(args);
    return sources.length
        ? new Observable(function (subscriber) {
            var buffers = sources.map(function () { return []; });
            var completed = sources.map(function () { return false; });
            subscriber.add(function () {
                buffers = completed = null;
            });
            var _loop_1 = function (sourceIndex) {
                innerFrom(sources[sourceIndex]).subscribe(createOperatorSubscriber(subscriber, function (value) {
                    buffers[sourceIndex].push(value);
                    if (buffers.every(function (buffer) { return buffer.length; })) {
                        var result = buffers.map(function (buffer) { return buffer.shift(); });
                        subscriber.next(resultSelector ? resultSelector.apply(void 0, __spreadArray([], __read(result))) : result);
                        if (buffers.some(function (buffer, i) { return !buffer.length && completed[i]; })) {
                            subscriber.complete();
                        }
                    }
                }, function () {
                    completed[sourceIndex] = true;
                    !buffers[sourceIndex].length && subscriber.complete();
                }));
            };
            for (var sourceIndex = 0; !subscriber.closed && sourceIndex < sources.length; sourceIndex++) {
                _loop_1(sourceIndex);
            }
            return function () {
                buffers = completed = null;
            };
        })
        : EMPTY;
}
//# sourceMappingURL=zip.js.mapimport { __assign, __extends } from "tslib";
import { Subject, AnonymousSubject } from '../../Subject';
import { Subscriber } from '../../Subscriber';
import { Observable } from '../../Observable';
import { Subscription } from '../../Subscription';
import { ReplaySubject } from '../../ReplaySubject';
var DEFAULT_WEBSOCKET_CONFIG = {
    url: '',
    deserializer: function (e) { return JSON.parse(e.data); },
    serializer: function (value) { return JSON.stringify(value); },
};
var WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT = 'WebSocketSubject.error must be called with an object with an error code, and an optional reason: { code: number, reason: string }';
var WebSocketSubject = (function (_super) {
    __extends(WebSocketSubject, _super);
    function WebSocketSubject(urlConfigOrSource, destination) {
        var _this = _super.call(this) || this;
        _this._socket = null;
        if (urlConfigOrSource instanceof Observable) {
            _this.destination = destination;
            _this.source = urlConfigOrSource;
        }
        else {
            var config = (_this._config = __assign({}, DEFAULT_WEBSOCKET_CONFIG));
            _this._output = new Subject();
            if (typeof urlConfigOrSource === 'string') {
                config.url = urlConfigOrSource;
            }
            else {
                for (var key in urlConfigOrSource) {
                    if (urlConfigOrSource.hasOwnProperty(key)) {
                        config[key] = urlConfigOrSource[key];
                    }
                }
            }
            if (!config.WebSocketCtor && WebSocket) {
                config.WebSocketCtor = WebSocket;
            }
            else if (!config.WebSocketCtor) {
                throw new Error('no WebSocket constructor can be found');
            }
            _this.destination = new ReplaySubject();
        }
        return _this;
    }
    WebSocketSubject.prototype.lift = function (operator) {
        var sock = new WebSocketSubject(this._config, this.destination);
        sock.operator = operator;
        sock.source = this;
        return sock;
    };
    WebSocketSubject.prototype._resetState = function () {
        this._socket = null;
        if (!this.source) {
            this.destination = new ReplaySubject();
        }
        this._output = new Subject();
    };
    WebSocketSubject.prototype.multiplex = function (subMsg, unsubMsg, messageFilter) {
        var self = this;
        return new Observable(function (observer) {
            try {
                self.next(subMsg());
            }
            catch (err) {
                observer.error(err);
            }
            var subscription = self.subscribe({
                next: function (x) {
                    try {
                        if (messageFilter(x)) {
                            observer.next(x);
                        }
                    }
                    catch (err) {
                        observer.error(err);
                    }
                },
                error: function (err) { return observer.error(err); },
                complete: function () { return observer.complete(); },
            });
            return function () {
                try {
                    self.next(unsubMsg());
                }
                catch (err) {
                    observer.error(err);
                }
                subscription.unsubscribe();
            };
        });
    };
    WebSocketSubject.prototype._connectSocket = function () {
        var _this = this;
        var _a = this._config, WebSocketCtor = _a.WebSocketCtor, protocol = _a.protocol, url = _a.url, binaryType = _a.binaryType;
        var observer = this._output;
        var socket = null;
        try {
            socket = protocol ? new WebSocketCtor(url, protocol) : new WebSocketCtor(url);
            this._socket = socket;
            if (binaryType) {
                this._socket.binaryType = binaryType;
            }
        }
        catch (e) {
            observer.error(e);
            return;
        }
        var subscription = new Subscription(function () {
            _this._socket = null;
            if (socket && socket.readyState === 1) {
                socket.close();
            }
        });
        socket.onopen = function (evt) {
            var _socket = _this._socket;
            if (!_socket) {
                socket.close();
                _this._resetState();
                return;
            }
            var openObserver = _this._config.openObserver;
            if (openObserver) {
                openObserver.next(evt);
            }
            var queue = _this.destination;
            _this.destination = Subscriber.create(function (x) {
                if (socket.readyState === 1) {
                    try {
                        var serializer = _this._config.serializer;
                        socket.send(serializer(x));
                    }
                    catch (e) {
                        _this.destination.error(e);
                    }
                }
            }, function (err) {
                var closingObserver = _this._config.closingObserver;
                if (closingObserver) {
                    closingObserver.next(undefined);
                }
                if (err && err.code) {
                    socket.close(err.code, err.reason);
                }
                else {
                    observer.error(new TypeError(WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT));
                }
                _this._resetState();
            }, function () {
                var closingObserver = _this._config.closingObserver;
                if (closingObserver) {
                    closingObserver.next(undefined);
                }
                socket.close();
                _this._resetState();
            });
            if (queue && queue instanceof ReplaySubject) {
                subscription.add(queue.subscribe(_this.destination));
            }
        };
        socket.onerror = function (e) {
            _this._resetState();
            observer.error(e);
        };
        socket.onclose = function (e) {
            if (socket === _this._socket) {
                _this._resetState();
            }
            var closeObserver = _this._config.closeObserver;
            if (closeObserver) {
                closeObserver.next(e);
            }
            if (e.wasClean) {
                observer.complete();
            }
            else {
                observer.error(e);
            }
        };
        socket.onmessage = function (e) {
            try {
                var deserializer = _this._config.deserializer;
                observer.next(deserializer(e));
            }
            catch (err) {
                observer.error(err);
            }
        };
    };
    WebSocketSubject.prototype._subscribe = function (subscriber) {
        var _this = this;
        var source = this.source;
        if (source) {
            return source.subscribe(subscriber);
        }
        if (!this._socket) {
            this._connectSocket();
        }
        this._output.subscribe(subscriber);
        subscriber.add(function () {
            var _socket = _this._socket;
            if (_this._output.observers.length === 0) {
                if (_socket && (_socket.readyState === 1 || _socket.readyState === 0)) {
                    _socket.close();
                }
                _this._resetState();
            }
        });
        return subscriber;
    };
    WebSocketSubject.prototype.unsubscribe = function () {
        var _socket = this._socket;
        if (_socket && (_socket.readyState === 1 || _socket.readyState === 0)) {
            _socket.close();
        }
        this._resetState();
        _super.prototype.unsubscribe.call(this);
    };
    return WebSocketSubject;
}(AnonymousSubject));
export { WebSocketSubject };
//# sourceMappingURL=WebSocketSubject.js.mapimport { Observable } from '../../Observable';
import { Subscription } from '../../Subscription';
import { performanceTimestampProvider } from '../../scheduler/performanceTimestampProvider';
import { animationFrameProvider } from '../../scheduler/animationFrameProvider';
export function animationFrames(timestampProvider) {
    return timestampProvider ? animationFramesFactory(timestampProvider) : DEFAULT_ANIMATION_FRAMES;
}
function animationFramesFactory(timestampProvider) {
    var schedule = animationFrameProvider.schedule;
    return new Observable(function (subscriber) {
        var subscription = new Subscription();
        var provider = timestampProvider || performanceTimestampProvider;
        var start = provider.now();
        var run = function (timestamp) {
            var now = provider.now();
            subscriber.next({
                timestamp: timestampProvider ? now : timestamp,
                elapsed: now - start,
            });
            if (!subscriber.closed) {
                subscription.add(schedule(run));
            }
        };
        subscription.add(schedule(run));
        return subscription;
    });
}
var DEFAULT_ANIMATION_FRAMES = animationFramesFactory();
//# sourceMappingURL=animationFrames.js.mapimport { __assign, __rest } from "tslib";
import { createOperatorSubscriber } from '../../operators/OperatorSubscriber';
import { Observable } from '../../Observable';
import { innerFrom } from '../../observable/innerFrom';
export function fromFetch(input, initWithSelector) {
    if (initWithSelector === void 0) { initWithSelector = {}; }
    var selector = initWithSelector.selector, init = __rest(initWithSelector, ["selector"]);
    return new Observable(function (subscriber) {
        var controller = new AbortController();
        var signal = controller.signal;
        var abortable = true;
        var outerSignal = init.signal;
        if (outerSignal) {
            if (outerSignal.aborted) {
                controller.abort();
            }
            else {
                var outerSignalHandler_1 = function () {
                    if (!signal.aborted) {
                        controller.abort();
                    }
                };
                outerSignal.addEventListener('abort', outerSignalHandler_1);
                subscriber.add(function () { return outerSignal.removeEventListener('abort', outerSignalHandler_1); });
            }
        }
        var perSubscriberInit = __assign(__assign({}, init), { signal: signal });
        var handleError = function (err) {
            abortable = false;
            subscriber.error(err);
        };
        fetch(input, perSubscriberInit)
            .then(function (response) {
            if (selector) {
                innerFrom(selector(response)).subscribe(createOperatorSubscriber(subscriber, undefined, function () {
                    abortable = false;
                    subscriber.complete();
                }, handleError));
            }
            else {
                abortable = false;
                subscriber.next(response);
                subscriber.complete();
            }
        })
            .catch(handleError);
        return function () {
            if (abortable) {
                controller.abort();
            }
        };
    });
}
//# sourceMappingURL=fetch.js.mapimport { WebSocketSubject } from './WebSocketSubject';
export function webSocket(urlConfigOrSource) {
    return new WebSocketSubject(urlConfigOrSource);
}
//# sourceMappingURL=webSocket.js.mapimport { getXHRResponse } from './getXHRResponse';
var AjaxResponse = (function () {
    function AjaxResponse(originalEvent, xhr, request, type) {
        if (type === void 0) { type = 'download_load'; }
        this.originalEvent = originalEvent;
        this.xhr = xhr;
        this.request = request;
        this.type = type;
        var status = xhr.status, responseType = xhr.responseType;
        this.status = status !== null && status !== void 0 ? status : 0;
        this.responseType = responseType !== null && responseType !== void 0 ? responseType : '';
        var allHeaders = xhr.getAllResponseHeaders();
        this.responseHeaders = allHeaders
            ?
                allHeaders.split('\n').reduce(function (headers, line) {
                    var index = line.indexOf(': ');
                    headers[line.slice(0, index)] = line.slice(index + 2);
                    return headers;
                }, {})
            : {};
        this.response = getXHRResponse(xhr);
        var loaded = originalEvent.loaded, total = originalEvent.total;
        this.loaded = loaded;
        this.total = total;
    }
    return AjaxResponse;
}());
export { AjaxResponse };
//# sourceMappingURL=AjaxResponse.js.mapimport { __assign } from "tslib";
import { map } from '../operators/map';
import { Observable } from '../Observable';
import { AjaxResponse } from './AjaxResponse';
import { AjaxTimeoutError, AjaxError } from './errors';
function ajaxGet(url, headers) {
    return ajax({ method: 'GET', url: url, headers: headers });
}
function ajaxPost(url, body, headers) {
    return ajax({ method: 'POST', url: url, body: body, headers: headers });
}
function ajaxDelete(url, headers) {
    return ajax({ method: 'DELETE', url: url, headers: headers });
}
function ajaxPut(url, body, headers) {
    return ajax({ method: 'PUT', url: url, body: body, headers: headers });
}
function ajaxPatch(url, body, headers) {
    return ajax({ method: 'PATCH', url: url, body: body, headers: headers });
}
var mapResponse = map(function (x) { return x.response; });
function ajaxGetJSON(url, headers) {
    return mapResponse(ajax({
        method: 'GET',
        url: url,
        headers: headers,
    }));
}
export var ajax = (function () {
    var create = function (urlOrConfig) {
        var config = typeof urlOrConfig === 'string'
            ? {
                url: urlOrConfig,
            }
            : urlOrConfig;
        return fromAjax(config);
    };
    create.get = ajaxGet;
    create.post = ajaxPost;
    create.delete = ajaxDelete;
    create.put = ajaxPut;
    create.patch = ajaxPatch;
    create.getJSON = ajaxGetJSON;
    return create;
})();
var UPLOAD = 'upload';
var DOWNLOAD = 'download';
var LOADSTART = 'loadstart';
var PROGRESS = 'progress';
var LOAD = 'load';
export function fromAjax(init) {
    return new Observable(function (destination) {
        var _a, _b;
        var config = __assign({ async: true, crossDomain: false, withCredentials: false, method: 'GET', timeout: 0, responseType: 'json' }, init);
        var queryParams = config.queryParams, configuredBody = config.body, configuredHeaders = config.headers;
        var url = config.url;
        if (!url) {
            throw new TypeError('url is required');
        }
        if (queryParams) {
            var searchParams_1;
            if (url.includes('?')) {
                var parts = url.split('?');
                if (2 < parts.length) {
                    throw new TypeError('invalid url');
                }
                searchParams_1 = new URLSearchParams(parts[1]);
                new URLSearchParams(queryParams).forEach(function (value, key) { return searchParams_1.set(key, value); });
                url = parts[0] + '?' + searchParams_1;
            }
            else {
                searchParams_1 = new URLSearchParams(queryParams);
                url = url + '?' + searchParams_1;
            }
        }
        var headers = {};
        if (configuredHeaders) {
            for (var key in configuredHeaders) {
                if (configuredHeaders.hasOwnProperty(key)) {
                    headers[key.toLowerCase()] = configuredHeaders[key];
                }
            }
        }
        var crossDomain = config.crossDomain;
        if (!crossDomain && !('x-requested-with' in headers)) {
            headers['x-requested-with'] = 'XMLHttpRequest';
        }
        var withCredentials = config.withCredentials, xsrfCookieName = config.xsrfCookieName, xsrfHeaderName = config.xsrfHeaderName;
        if ((withCredentials || !crossDomain) && xsrfCookieName && xsrfHeaderName) {
            var xsrfCookie = (_b = (_a = document === null || document === void 0 ? void 0 : document.cookie.match(new RegExp("(^|;\\s*)(" + xsrfCookieName + ")=([^;]*)"))) === null || _a === void 0 ? void 0 : _a.pop()) !== null && _b !== void 0 ? _b : '';
            if (xsrfCookie) {
                headers[xsrfHeaderName] = xsrfCookie;
            }
        }
        var body = extractContentTypeAndMaybeSerializeBody(configuredBody, headers);
        var _request = __assign(__assign({}, config), { url: url,
            headers: headers,
            body: body });
        var xhr;
        xhr = init.createXHR ? init.createXHR() : new XMLHttpRequest();
        {
            var progressSubscriber_1 = init.progressSubscriber, _c = init.includeDownloadProgress, includeDownloadProgress = _c === void 0 ? false : _c, _d = init.includeUploadProgress, includeUploadProgress = _d === void 0 ? false : _d;
            var addErrorEvent = function (type, errorFactory) {
                xhr.addEventListener(type, function () {
                    var _a;
                    var error = errorFactory();
                    (_a = progressSubscriber_1 === null || progressSubscriber_1 === void 0 ? void 0 : progressSubscriber_1.error) === null || _a === void 0 ? void 0 : _a.call(progressSubscriber_1, error);
                    destination.error(error);
                });
            };
            addErrorEvent('timeout', function () { return new AjaxTimeoutError(xhr, _request); });
            addErrorEvent('abort', function () { return new AjaxError('aborted', xhr, _request); });
            var createResponse_1 = function (direction, event) {
                return new AjaxResponse(event, xhr, _request, direction + "_" + event.type);
            };
            var addProgressEvent_1 = function (target, type, direction) {
                target.addEventListener(type, function (event) {
                    destination.next(createResponse_1(direction, event));
                });
            };
            if (includeUploadProgress) {
                [LOADSTART, PROGRESS, LOAD].forEach(function (type) { return addProgressEvent_1(xhr.upload, type, UPLOAD); });
            }
            if (progressSubscriber_1) {
                [LOADSTART, PROGRESS].forEach(function (type) { return xhr.upload.addEventListener(type, function (e) { var _a; return (_a = progressSubscriber_1 === null || progressSubscriber_1 === void 0 ? void 0 : progressSubscriber_1.next) === null || _a === void 0 ? void 0 : _a.call(progressSubscriber_1, e); }); });
            }
            if (includeDownloadProgress) {
                [LOADSTART, PROGRESS].forEach(function (type) { return addProgressEvent_1(xhr, type, DOWNLOAD); });
            }
            var emitError_1 = function (status) {
                var msg = 'ajax error' + (status ? ' ' + status : '');
                destination.error(new AjaxError(msg, xhr, _request));
            };
            xhr.addEventListener('error', function (e) {
                var _a;
                (_a = progressSubscriber_1 === null || progressSubscriber_1 === void 0 ? void 0 : progressSubscriber_1.error) === null || _a === void 0 ? void 0 : _a.call(progressSubscriber_1, e);
                emitError_1();
            });
            xhr.addEventListener(LOAD, function (event) {
                var _a, _b;
                var status = xhr.status;
                if (status < 400) {
                    (_a = progressSubscriber_1 === null || progressSubscriber_1 === void 0 ? void 0 : progressSubscriber_1.complete) === null || _a === void 0 ? void 0 : _a.call(progressSubscriber_1);
                    var response = void 0;
                    try {
                        response = createResponse_1(DOWNLOAD, event);
                    }
                    catch (err) {
                        destination.error(err);
                        return;
                    }
                    destination.next(response);
                    destination.complete();
                }
                else {
                    (_b = progressSubscriber_1 === null || progressSubscriber_1 === void 0 ? void 0 : progressSubscriber_1.error) === null || _b === void 0 ? void 0 : _b.call(progressSubscriber_1, event);
                    emitError_1(status);
                }
            });
        }
        var user = _request.user, method = _request.method, async = _request.async;
        if (user) {
            xhr.open(method, url, async, user, _request.password);
        }
        else {
            xhr.open(method, url, async);
        }
        if (async) {
            xhr.timeout = _request.timeout;
            xhr.responseType = _request.responseType;
        }
        if ('withCredentials' in xhr) {
            xhr.withCredentials = _request.withCredentials;
        }
        for (var key in headers) {
            if (headers.hasOwnProperty(key)) {
                xhr.setRequestHeader(key, headers[key]);
            }
        }
        if (body) {
            xhr.send(body);
        }
        else {
            xhr.send();
        }
        return function () {
            if (xhr && xhr.readyState !== 4) {
                xhr.abort();
            }
        };
    });
}
function extractContentTypeAndMaybeSerializeBody(body, headers) {
    var _a;
    if (!body ||
        typeof body === 'string' ||
        isFormData(body) ||
        isURLSearchParams(body) ||
        isArrayBuffer(body) ||
        isFile(body) ||
        isBlob(body) ||
        isReadableStream(body)) {
        return body;
    }
    if (isArrayBufferView(body)) {
        return body.buffer;
    }
    if (typeof body === 'object') {
        headers['content-type'] = (_a = headers['content-type']) !== null && _a !== void 0 ? _a : 'application/json;charset=utf-8';
        return JSON.stringify(body);
    }
    throw new TypeError('Unknown body type');
}
var _toString = Object.prototype.toString;
function toStringCheck(obj, name) {
    return _toString.call(obj) === "[object " + name + "]";
}
function isArrayBuffer(body) {
    return toStringCheck(body, 'ArrayBuffer');
}
function isFile(body) {
    return toStringCheck(body, 'File');
}
function isBlob(body) {
    return toStringCheck(body, 'Blob');
}
function isArrayBufferView(body) {
    return typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView(body);
}
function isFormData(body) {
    return typeof FormData !== 'undefined' && body instanceof FormData;
}
function isURLSearchParams(body) {
    return typeof URLSearchParams !== 'undefined' && body instanceof URLSearchParams;
}
function isReadableStream(body) {
    return typeof ReadableStream !== 'undefined' && body instanceof ReadableStream;
}
//# sourceMappingURL=ajax.js.mapimport { getXHRResponse } from './getXHRResponse';
import { createErrorClass } from '../util/createErrorClass';
export var AjaxError = createErrorClass(function (_super) {
    return function AjaxErrorImpl(message, xhr, request) {
        this.message = message;
        this.name = 'AjaxError';
        this.xhr = xhr;
        this.request = request;
        this.status = xhr.status;
        this.responseType = xhr.responseType;
        var response;
        try {
            response = getXHRResponse(xhr);
        }
        catch (err) {
            response = xhr.responseText;
        }
        this.response = response;
    };
});
export var AjaxTimeoutError = (function () {
    function AjaxTimeoutErrorImpl(xhr, request) {
        AjaxError.call(this, 'ajax timeout', xhr, request);
        this.name = 'AjaxTimeoutError';
        return this;
    }
    AjaxTimeoutErrorImpl.prototype = Object.create(AjaxError.prototype);
    return AjaxTimeoutErrorImpl;
})();
//# sourceMappingURL=errors.js.mapexport function getXHRResponse(xhr) {
    switch (xhr.responseType) {
        case 'json': {
            if ('response' in xhr) {
                return xhr.response;
            }
            else {
                var ieXHR = xhr;
                return JSON.parse(ieXHR.responseText);
            }
        }
        case 'document':
            return xhr.responseXML;
        case 'text':
        default: {
            if ('response' in xhr) {
                return xhr.response;
            }
            else {
                var ieXHR = xhr;
                return ieXHR.responseText;
            }
        }
    }
}
//# sourceMappingURL=getXHRResponse.js.mapexport {};
//# sourceMappingURL=types.js.mapexport { fromFetch } from '../internal/observable/dom/fetch';
//# sourceMappingURL=index.js.mapexport { ajax } from '../internal/ajax/ajax';
export { AjaxError, AjaxTimeoutError } from '../internal/ajax/errors';
export { AjaxResponse } from '../internal/ajax/AjaxResponse';
//# sourceMappingURL=index.js.mapexport { Observable } from './internal/Observable';
export { ConnectableObservable } from './internal/observable/ConnectableObservable';
export { observable } from './internal/symbol/observable';
export { animationFrames } from './internal/observable/dom/animationFrames';
export { Subject } from './internal/Subject';
export { BehaviorSubject } from './internal/BehaviorSubject';
export { ReplaySubject } from './internal/ReplaySubject';
export { AsyncSubject } from './internal/AsyncSubject';
export { asap, asapScheduler } from './internal/scheduler/asap';
export { async, asyncScheduler } from './internal/scheduler/async';
export { queue, queueScheduler } from './internal/scheduler/queue';
export { animationFrame, animationFrameScheduler } from './internal/scheduler/animationFrame';
export { VirtualTimeScheduler, VirtualAction } from './internal/scheduler/VirtualTimeScheduler';
export { Scheduler } from './internal/Scheduler';
export { Subscription } from './internal/Subscription';
export { Subscriber } from './internal/Subscriber';
export { Notification, NotificationKind } from './internal/Notification';
export { pipe } from './internal/util/pipe';
export { noop } from './internal/util/noop';
export { identity } from './internal/util/identity';
export { isObservable } from './internal/util/isObservable';
export { lastValueFrom } from './internal/lastValueFrom';
export { firstValueFrom } from './internal/firstValueFrom';
export { ArgumentOutOfRangeError } from './internal/util/ArgumentOutOfRangeError';
export { EmptyError } from './internal/util/EmptyError';
export { NotFoundError } from './internal/util/NotFoundError';
export { ObjectUnsubscribedError } from './internal/util/ObjectUnsubscribedError';
export { SequenceError } from './internal/util/SequenceError';
export { TimeoutError } from './internal/operators/timeout';
export { UnsubscriptionError } from './internal/util/UnsubscriptionError';
export { bindCallback } from './internal/observable/bindCallback';
export { bindNodeCallback } from './internal/observable/bindNodeCallback';
export { combineLatest } from './internal/observable/combineLatest';
export { concat } from './internal/observable/concat';
export { connectable } from './internal/observable/connectable';
export { defer } from './internal/observable/defer';
export { empty } from './internal/observable/empty';
export { forkJoin } from './internal/observable/forkJoin';
export { from } from './internal/observable/from';
export { fromEvent } from './internal/observable/fromEvent';
export { fromEventPattern } from './internal/observable/fromEventPattern';
export { generate } from './internal/observable/generate';
export { iif } from './internal/observable/iif';
export { interval } from './internal/observable/interval';
export { merge } from './internal/observable/merge';
export { never } from './internal/observable/never';
export { of } from './internal/observable/of';
export { onErrorResumeNext } from './internal/observable/onErrorResumeNext';
export { pairs } from './internal/observable/pairs';
export { partition } from './internal/observable/partition';
export { race } from './internal/observable/race';
export { range } from './internal/observable/range';
export { throwError } from './internal/observable/throwError';
export { timer } from './internal/observable/timer';
export { using } from './internal/observable/using';
export { zip } from './internal/observable/zip';
export { scheduled } from './internal/scheduled/scheduled';
export { EMPTY } from './internal/observable/empty';
export { NEVER } from './internal/observable/never';
export * from './internal/types';
export { config } from './internal/config';
export { audit } from './internal/operators/audit';
export { auditTime } from './internal/operators/auditTime';
export { buffer } from './internal/operators/buffer';
export { bufferCount } from './internal/operators/bufferCount';
export { bufferTime } from './internal/operators/bufferTime';
export { bufferToggle } from './internal/operators/bufferToggle';
export { bufferWhen } from './internal/operators/bufferWhen';
export { catchError } from './internal/operators/catchError';
export { combineAll } from './internal/operators/combineAll';
export { combineLatestAll } from './internal/operators/combineLatestAll';
export { combineLatestWith } from './internal/operators/combineLatestWith';
export { concatAll } from './internal/operators/concatAll';
export { concatMap } from './internal/operators/concatMap';
export { concatMapTo } from './internal/operators/concatMapTo';
export { concatWith } from './internal/operators/concatWith';
export { connect } from './internal/operators/connect';
export { count } from './internal/operators/count';
export { debounce } from './internal/operators/debounce';
export { debounceTime } from './internal/operators/debounceTime';
export { defaultIfEmpty } from './internal/operators/defaultIfEmpty';
export { delay } from './internal/operators/delay';
export { delayWhen } from './internal/operators/delayWhen';
export { dematerialize } from './internal/operators/dematerialize';
export { distinct } from './internal/operators/distinct';
export { distinctUntilChanged } from './internal/operators/distinctUntilChanged';
export { distinctUntilKeyChanged } from './internal/operators/distinctUntilKeyChanged';
export { elementAt } from './internal/operators/elementAt';
export { endWith } from './internal/operators/endWith';
export { every } from './internal/operators/every';
export { exhaust } from './internal/operators/exhaust';
export { exhaustAll } from './internal/operators/exhaustAll';
export { exhaustMap } from './internal/operators/exhaustMap';
export { expand } from './internal/operators/expand';
export { filter } from './internal/operators/filter';
export { finalize } from './internal/operators/finalize';
export { find } from './internal/operators/find';
export { findIndex } from './internal/operators/findIndex';
export { first } from './internal/operators/first';
export { groupBy } from './internal/operators/groupBy';
export { ignoreElements } from './internal/operators/ignoreElements';
export { isEmpty } from './internal/operators/isEmpty';
export { last } from './internal/operators/last';
export { map } from './internal/operators/map';
export { mapTo } from './internal/operators/mapTo';
export { materialize } from './internal/operators/materialize';
export { max } from './internal/operators/max';
export { mergeAll } from './internal/operators/mergeAll';
export { flatMap } from './internal/operators/flatMap';
export { mergeMap } from './internal/operators/mergeMap';
export { mergeMapTo } from './internal/operators/mergeMapTo';
export { mergeScan } from './internal/operators/mergeScan';
export { mergeWith } from './internal/operators/mergeWith';
export { min } from './internal/operators/min';
export { multicast } from './internal/operators/multicast';
export { observeOn } from './internal/operators/observeOn';
export { pairwise } from './internal/operators/pairwise';
export { pluck } from './internal/operators/pluck';
export { publish } from './internal/operators/publish';
export { publishBehavior } from './internal/operators/publishBehavior';
export { publishLast } from './internal/operators/publishLast';
export { publishReplay } from './internal/operators/publishReplay';
export { raceWith } from './internal/operators/raceWith';
export { reduce } from './internal/operators/reduce';
export { repeat } from './internal/operators/repeat';
export { repeatWhen } from './internal/operators/repeatWhen';
export { retry } from './internal/operators/retry';
export { retryWhen } from './internal/operators/retryWhen';
export { refCount } from './internal/operators/refCount';
export { sample } from './internal/operators/sample';
export { sampleTime } from './internal/operators/sampleTime';
export { scan } from './internal/operators/scan';
export { sequenceEqual } from './internal/operators/sequenceEqual';
export { share } from './internal/operators/share';
export { shareReplay } from './internal/operators/shareReplay';
export { single } from './internal/operators/single';
export { skip } from './internal/operators/skip';
export { skipLast } from './internal/operators/skipLast';
export { skipUntil } from './internal/operators/skipUntil';
export { skipWhile } from './internal/operators/skipWhile';
export { startWith } from './internal/operators/startWith';
export { subscribeOn } from './internal/operators/subscribeOn';
export { switchAll } from './internal/operators/switchAll';
export { switchMap } from './internal/operators/switchMap';
export { switchMapTo } from './internal/operators/switchMapTo';
export { switchScan } from './internal/operators/switchScan';
export { take } from './internal/operators/take';
export { takeLast } from './internal/operators/takeLast';
export { takeUntil } from './internal/operators/takeUntil';
export { takeWhile } from './internal/operators/takeWhile';
export { tap } from './internal/operators/tap';
export { throttle } from './internal/operators/throttle';
export { throttleTime } from './internal/operators/throttleTime';
export { throwIfEmpty } from './internal/operators/throwIfEmpty';
export { timeInterval } from './internal/operators/timeInterval';
export { timeout } from './internal/operators/timeout';
export { timeoutWith } from './internal/operators/timeoutWith';
export { timestamp } from './internal/operators/timestamp';
export { toArray } from './internal/operators/toArray';
export { window } from './internal/operators/window';
export { windowCount } from './internal/operators/windowCount';
export { windowTime } from './internal/operators/windowTime';
export { windowToggle } from './internal/operators/windowToggle';
export { windowWhen } from './internal/operators/windowWhen';
export { withLatestFrom } from './internal/operators/withLatestFrom';
export { zipAll } from './internal/operators/zipAll';
export { zipWith } from './internal/operators/zipWith';
//# sourceMappingURL=index.js.mapexport { webSocket as webSocket } from '../internal/observable/dom/webSocket';
export { WebSocketSubject } from '../internal/observable/dom/WebSocketSubject';
//# sourceMappingURL=index.js.mapexport { TestScheduler } from '../internal/testing/TestScheduler';
//# sourceMappingURL=index.js.mapexport { audit } from '../internal/operators/audit';
export { auditTime } from '../internal/operators/auditTime';
export { buffer } from '../internal/operators/buffer';
export { bufferCount } from '../internal/operators/bufferCount';
export { bufferTime } from '../internal/operators/bufferTime';
export { bufferToggle } from '../internal/operators/bufferToggle';
export { bufferWhen } from '../internal/operators/bufferWhen';
export { catchError } from '../internal/operators/catchError';
export { combineAll } from '../internal/operators/combineAll';
export { combineLatestAll } from '../internal/operators/combineLatestAll';
export { combineLatest } from '../internal/operators/combineLatest';
export { combineLatestWith } from '../internal/operators/combineLatestWith';
export { concat } from '../internal/operators/concat';
export { concatAll } from '../internal/operators/concatAll';
export { concatMap } from '../internal/operators/concatMap';
export { concatMapTo } from '../internal/operators/concatMapTo';
export { concatWith } from '../internal/operators/concatWith';
export { connect } from '../internal/operators/connect';
export { count } from '../internal/operators/count';
export { debounce } from '../internal/operators/debounce';
export { debounceTime } from '../internal/operators/debounceTime';
export { defaultIfEmpty } from '../internal/operators/defaultIfEmpty';
export { delay } from '../internal/operators/delay';
export { delayWhen } from '../internal/operators/delayWhen';
export { dematerialize } from '../internal/operators/dematerialize';
export { distinct } from '../internal/operators/distinct';
export { distinctUntilChanged } from '../internal/operators/distinctUntilChanged';
export { distinctUntilKeyChanged } from '../internal/operators/distinctUntilKeyChanged';
export { elementAt } from '../internal/operators/elementAt';
export { endWith } from '../internal/operators/endWith';
export { every } from '../internal/operators/every';
export { exhaust } from '../internal/operators/exhaust';
export { exhaustAll } from '../internal/operators/exhaustAll';
export { exhaustMap } from '../internal/operators/exhaustMap';
export { expand } from '../internal/operators/expand';
export { filter } from '../internal/operators/filter';
export { finalize } from '../internal/operators/finalize';
export { find } from '../internal/operators/find';
export { findIndex } from '../internal/operators/findIndex';
export { first } from '../internal/operators/first';
export { groupBy } from '../internal/operators/groupBy';
export { ignoreElements } from '../internal/operators/ignoreElements';
export { isEmpty } from '../internal/operators/isEmpty';
export { last } from '../internal/operators/last';
export { map } from '../internal/operators/map';
export { mapTo } from '../internal/operators/mapTo';
export { materialize } from '../internal/operators/materialize';
export { max } from '../internal/operators/max';
export { merge } from '../internal/operators/merge';
export { mergeAll } from '../internal/operators/mergeAll';
export { flatMap } from '../internal/operators/flatMap';
export { mergeMap } from '../internal/operators/mergeMap';
export { mergeMapTo } from '../internal/operators/mergeMapTo';
export { mergeScan } from '../internal/operators/mergeScan';
export { mergeWith } from '../internal/operators/mergeWith';
export { min } from '../internal/operators/min';
export { multicast } from '../internal/operators/multicast';
export { observeOn } from '../internal/operators/observeOn';
export { onErrorResumeNext } from '../internal/operators/onErrorResumeNext';
export { pairwise } from '../internal/operators/pairwise';
export { partition } from '../internal/operators/partition';
export { pluck } from '../internal/operators/pluck';
export { publish } from '../internal/operators/publish';
export { publishBehavior } from '../internal/operators/publishBehavior';
export { publishLast } from '../internal/operators/publishLast';
export { publishReplay } from '../internal/operators/publishReplay';
export { race } from '../internal/operators/race';
export { raceWith } from '../internal/operators/raceWith';
export { reduce } from '../internal/operators/reduce';
export { repeat } from '../internal/operators/repeat';
export { repeatWhen } from '../internal/operators/repeatWhen';
export { retry } from '../internal/operators/retry';
export { retryWhen } from '../internal/operators/retryWhen';
export { refCount } from '../internal/operators/refCount';
export { sample } from '../internal/operators/sample';
export { sampleTime } from '../internal/operators/sampleTime';
export { scan } from '../internal/operators/scan';
export { sequenceEqual } from '../internal/operators/sequenceEqual';
export { share } from '../internal/operators/share';
export { shareReplay } from '../internal/operators/shareReplay';
export { single } from '../internal/operators/single';
export { skip } from '../internal/operators/skip';
export { skipLast } from '../internal/operators/skipLast';
export { skipUntil } from '../internal/operators/skipUntil';
export { skipWhile } from '../internal/operators/skipWhile';
export { startWith } from '../internal/operators/startWith';
export { subscribeOn } from '../internal/operators/subscribeOn';
export { switchAll } from '../internal/operators/switchAll';
export { switchMap } from '../internal/operators/switchMap';
export { switchMapTo } from '../internal/operators/switchMapTo';
export { switchScan } from '../internal/operators/switchScan';
export { take } from '../internal/operators/take';
export { takeLast } from '../internal/operators/takeLast';
export { takeUntil } from '../internal/operators/takeUntil';
export { takeWhile } from '../internal/operators/takeWhile';
export { tap } from '../internal/operators/tap';
export { throttle } from '../internal/operators/throttle';
export { throttleTime } from '../internal/operators/throttleTime';
export { throwIfEmpty } from '../internal/operators/throwIfEmpty';
export { timeInterval } from '../internal/operators/timeInterval';
export { timeout } from '../internal/operators/timeout';
export { timeoutWith } from '../internal/operators/timeoutWith';
export { timestamp } from '../internal/operators/timestamp';
export { toArray } from '../internal/operators/toArray';
export { window } from '../internal/operators/window';
export { windowCount } from '../internal/operators/windowCount';
export { windowTime } from '../internal/operators/windowTime';
export { windowToggle } from '../internal/operators/windowToggle';
export { windowWhen } from '../internal/operators/windowWhen';
export { withLatestFrom } from '../internal/operators/withLatestFrom';
export { zip } from '../internal/operators/zip';
export { zipAll } from '../internal/operators/zipAll';
export { zipWith } from '../internal/operators/zipWith';
//# sourceMappingURL=index.js.mapexport {};
//# sourceMappingURL=AnyCatcher.js.mapimport { Subject } from './Subject';
export class AsyncSubject extends Subject {
    constructor() {
        super(...arguments);
        this._value = null;
        this._hasValue = false;
        this._isComplete = false;
    }
    _checkFinalizedStatuses(subscriber) {
        const { hasError, _hasValue, _value, thrownError, isStopped, _isComplete } = this;
        if (hasError) {
            subscriber.error(thrownError);
        }
        else if (isStopped || _isComplete) {
            _hasValue && subscriber.next(_value);
            subscriber.complete();
        }
    }
    next(value) {
        if (!this.isStopped) {
            this._value = value;
            this._hasValue = true;
        }
    }
    complete() {
        const { _hasValue, _value, _isComplete } = this;
        if (!_isComplete) {
            this._isComplete = true;
            _hasValue && super.next(_value);
            super.complete();
        }
    }
}
//# sourceMappingURL=AsyncSubject.js.mapimport { Subject } from './Subject';
export class BehaviorSubject extends Subject {
    constructor(_value) {
        super();
        this._value = _value;
    }
    get value() {
        return this.getValue();
    }
    _subscribe(subscriber) {
        const subscription = super._subscribe(subscriber);
        !subscription.closed && subscriber.next(this._value);
        return subscription;
    }
    getValue() {
        const { hasError, thrownError, _value } = this;
        if (hasError) {
            throw thrownError;
        }
        this._throwIfClosed();
        return _value;
    }
    next(value) {
        super.next((this._value = value));
    }
}
//# sourceMappingURL=BehaviorSubject.js.mapimport { EMPTY } from './observable/empty';
import { of } from './observable/of';
import { throwError } from './observable/throwError';
import { isFunction } from './util/isFunction';
export var NotificationKind;
(function (NotificationKind) {
    NotificationKind["NEXT"] = "N";
    NotificationKind["ERROR"] = "E";
    NotificationKind["COMPLETE"] = "C";
})(NotificationKind || (NotificationKind = {}));
export class Notification {
    constructor(kind, value, error) {
        this.kind = kind;
        this.value = value;
        this.error = error;
        this.hasValue = kind === 'N';
    }
    observe(observer) {
        return observeNotification(this, observer);
    }
    do(nextHandler, errorHandler, completeHandler) {
        const { kind, value, error } = this;
        return kind === 'N' ? nextHandler === null || nextHandler === void 0 ? void 0 : nextHandler(value) : kind === 'E' ? errorHandler === null || errorHandler === void 0 ? void 0 : errorHandler(error) : completeHandler === null || completeHandler === void 0 ? void 0 : completeHandler();
    }
    accept(nextOrObserver, error, complete) {
        var _a;
        return isFunction((_a = nextOrObserver) === null || _a === void 0 ? void 0 : _a.next)
            ? this.observe(nextOrObserver)
            : this.do(nextOrObserver, error, complete);
    }
    toObservable() {
        const { kind, value, error } = this;
        const result = kind === 'N'
            ?
                of(value)
            :
                kind === 'E'
                    ?
                        throwError(() => error)
                    :
                        kind === 'C'
                            ?
                                EMPTY
                            :
                                0;
        if (!result) {
            throw new TypeError(`Unexpected notification kind ${kind}`);
        }
        return result;
    }
    static createNext(value) {
        return new Notification('N', value);
    }
    static createError(err) {
        return new Notification('E', undefined, err);
    }
    static createComplete() {
        return Notification.completeNotification;
    }
}
Notification.completeNotification = new Notification('C');
export function observeNotification(notification, observer) {
    var _a, _b, _c;
    const { kind, value, error } = notification;
    if (typeof kind !== 'string') {
        throw new TypeError('Invalid notification, missing "kind"');
    }
    kind === 'N' ? (_a = observer.next) === null || _a === void 0 ? void 0 : _a.call(observer, value) : kind === 'E' ? (_b = observer.error) === null || _b === void 0 ? void 0 : _b.call(observer, error) : (_c = observer.complete) === null || _c === void 0 ? void 0 : _c.call(observer);
}
//# sourceMappingURL=Notification.js.mapexport const COMPLETE_NOTIFICATION = (() => createNotification('C', undefined, undefined))();
export function errorNotification(error) {
    return createNotification('E', undefined, error);
}
export function nextNotification(value) {
    return createNotification('N', value, undefined);
}
export function createNotification(kind, value, error) {
    return {
        kind,
        value,
        error,
    };
}
//# sourceMappingURL=NotificationFactories.js.mapimport { SafeSubscriber, Subscriber } from './Subscriber';
import { isSubscription } from './Subscription';
import { observable as Symbol_observable } from './symbol/observable';
import { pipeFromArray } from './util/pipe';
import { config } from './config';
import { isFunction } from './util/isFunction';
import { errorContext } from './util/errorContext';
export class Observable {
    constructor(subscribe) {
        if (subscribe) {
            this._subscribe = subscribe;
        }
    }
    lift(operator) {
        const observable = new Observable();
        observable.source = this;
        observable.operator = operator;
        return observable;
    }
    subscribe(observerOrNext, error, complete) {
        const subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);
        errorContext(() => {
            const { operator, source } = this;
            subscriber.add(operator
                ?
                    operator.call(subscriber, source)
                : source
                    ?
                        this._subscribe(subscriber)
                    :
                        this._trySubscribe(subscriber));
        });
        return subscriber;
    }
    _trySubscribe(sink) {
        try {
            return this._subscribe(sink);
        }
        catch (err) {
            sink.error(err);
        }
    }
    forEach(next, promiseCtor) {
        promiseCtor = getPromiseCtor(promiseCtor);
        return new promiseCtor((resolve, reject) => {
            const subscriber = new SafeSubscriber({
                next: (value) => {
                    try {
                        next(value);
                    }
                    catch (err) {
                        reject(err);
                        subscriber.unsubscribe();
                    }
                },
                error: reject,
                complete: resolve,
            });
            this.subscribe(subscriber);
        });
    }
    _subscribe(subscriber) {
        var _a;
        return (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber);
    }
    [Symbol_observable]() {
        return this;
    }
    pipe(...operations) {
        return pipeFromArray(operations)(this);
    }
    toPromise(promiseCtor) {
        promiseCtor = getPromiseCtor(promiseCtor);
        return new promiseCtor((resolve, reject) => {
            let value;
            this.subscribe((x) => (value = x), (err) => reject(err), () => resolve(value));
        });
    }
}
Observable.create = (subscribe) => {
    return new Observable(subscribe);
};
function getPromiseCtor(promiseCtor) {
    var _a;
    return (_a = promiseCtor !== null && promiseCtor !== void 0 ? promiseCtor : config.Promise) !== null && _a !== void 0 ? _a : Promise;
}
function isObserver(value) {
    return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);
}
function isSubscriber(value) {
    return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));
}
//# sourceMappingURL=Observable.js.mapexport {};
//# sourceMappingURL=Operator.js.mapimport { Subject } from './Subject';
import { dateTimestampProvider } from './scheduler/dateTimestampProvider';
export class ReplaySubject extends Subject {
    constructor(_bufferSize = Infinity, _windowTime = Infinity, _timestampProvider = dateTimestampProvider) {
        super();
        this._bufferSize = _bufferSize;
        this._windowTime = _windowTime;
        this._timestampProvider = _timestampProvider;
        this._buffer = [];
        this._infiniteTimeWindow = true;
        this._infiniteTimeWindow = _windowTime === Infinity;
        this._bufferSize = Math.max(1, _bufferSize);
        this._windowTime = Math.max(1, _windowTime);
    }
    next(value) {
        const { isStopped, _buffer, _infiniteTimeWindow, _timestampProvider, _windowTime } = this;
        if (!isStopped) {
            _buffer.push(value);
            !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);
        }
        this._trimBuffer();
        super.next(value);
    }
    _subscribe(subscriber) {
        this._throwIfClosed();
        this._trimBuffer();
        const subscription = this._innerSubscribe(subscriber);
        const { _infiniteTimeWindow, _buffer } = this;
        const copy = _buffer.slice();
        for (let i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {
            subscriber.next(copy[i]);
        }
        this._checkFinalizedStatuses(subscriber);
        return subscription;
    }
    _trimBuffer() {
        const { _bufferSize, _timestampProvider, _buffer, _infiniteTimeWindow } = this;
        const adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;
        _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);
        if (!_infiniteTimeWindow) {
            const now = _timestampProvider.now();
            let last = 0;
            for (let i = 1; i < _buffer.length && _buffer[i] <= now; i += 2) {
                last = i;
            }
            last && _buffer.splice(0, last + 1);
        }
    }
}
//# sourceMappingURL=ReplaySubject.js.mapimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';
export class Scheduler {
    constructor(schedulerActionCtor, now = Scheduler.now) {
        this.schedulerActionCtor = schedulerActionCtor;
        this.now = now;
    }
    schedule(work, delay = 0, state) {
        return new this.schedulerActionCtor(this, work).schedule(state, delay);
    }
}
Scheduler.now = dateTimestampProvider.now;
//# sourceMappingURL=Scheduler.js.mapimport { Observable } from './Observable';
import { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';
import { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';
import { arrRemove } from './util/arrRemove';
import { errorContext } from './util/errorContext';
export class Subject extends Observable {
    constructor() {
        super();
        this.closed = false;
        this.currentObservers = null;
        this.observers = [];
        this.isStopped = false;
        this.hasError = false;
        this.thrownError = null;
    }
    lift(operator) {
        const subject = new AnonymousSubject(this, this);
        subject.operator = operator;
        return subject;
    }
    _throwIfClosed() {
        if (this.closed) {
            throw new ObjectUnsubscribedError();
        }
    }
    next(value) {
        errorContext(() => {
            this._throwIfClosed();
            if (!this.isStopped) {
                if (!this.currentObservers) {
                    this.currentObservers = Array.from(this.observers);
                }
                for (const observer of this.currentObservers) {
                    observer.next(value);
                }
            }
        });
    }
    error(err) {
        errorContext(() => {
            this._throwIfClosed();
            if (!this.isStopped) {
                this.hasError = this.isStopped = true;
                this.thrownError = err;
                const { observers } = this;
                while (observers.length) {
                    observers.shift().error(err);
                }
            }
        });
    }
    complete() {
        errorContext(() => {
            this._throwIfClosed();
            if (!this.isStopped) {
                this.isStopped = true;
                const { observers } = this;
                while (observers.length) {
                    observers.shift().complete();
                }
            }
        });
    }
    unsubscribe() {
        this.isStopped = this.closed = true;
        this.observers = this.currentObservers = null;
    }
    get observed() {
        var _a;
        return ((_a = this.observers) === null || _a === void 0 ? void 0 : _a.length) > 0;
    }
    _trySubscribe(subscriber) {
        this._throwIfClosed();
        return super._trySubscribe(subscriber);
    }
    _subscribe(subscriber) {
        this._throwIfClosed();
        this._checkFinalizedStatuses(subscriber);
        return this._innerSubscribe(subscriber);
    }
    _innerSubscribe(subscriber) {
        const { hasError, isStopped, observers } = this;
        if (hasError || isStopped) {
            return EMPTY_SUBSCRIPTION;
        }
        this.currentObservers = null;
        observers.push(subscriber);
        return new Subscription(() => {
            this.currentObservers = null;
            arrRemove(observers, subscriber);
        });
    }
    _checkFinalizedStatuses(subscriber) {
        const { hasError, thrownError, isStopped } = this;
        if (hasError) {
            subscriber.error(thrownError);
        }
        else if (isStopped) {
            subscriber.complete();
        }
    }
    asObservable() {
        const observable = new Observable();
        observable.source = this;
        return observable;
    }
}
Subject.create = (destination, source) => {
    return new AnonymousSubject(destination, source);
};
export class AnonymousSubject extends Subject {
    constructor(destination, source) {
        super();
        this.destination = destination;
        this.source = source;
    }
    next(value) {
        var _a, _b;
        (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.next) === null || _b === void 0 ? void 0 : _b.call(_a, value);
    }
    error(err) {
        var _a, _b;
        (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.error) === null || _b === void 0 ? void 0 : _b.call(_a, err);
    }
    complete() {
        var _a, _b;
        (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.complete) === null || _b === void 0 ? void 0 : _b.call(_a);
    }
    _subscribe(subscriber) {
        var _a, _b;
        return (_b = (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber)) !== null && _b !== void 0 ? _b : EMPTY_SUBSCRIPTION;
    }
}
//# sourceMappingURL=Subject.js.mapimport { isFunction } from './util/isFunction';
import { isSubscription, Subscription } from './Subscription';
import { config } from './config';
import { reportUnhandledError } from './util/reportUnhandledError';
import { noop } from './util/noop';
import { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';
import { timeoutProvider } from './scheduler/timeoutProvider';
import { captureError } from './util/errorContext';
export class Subscriber extends Subscription {
    constructor(destination) {
        super();
        this.isStopped = false;
        if (destination) {
            this.destination = destination;
            if (isSubscription(destination)) {
                destination.add(this);
            }
        }
        else {
            this.destination = EMPTY_OBSERVER;
        }
    }
    static create(next, error, complete) {
        return new SafeSubscriber(next, error, complete);
    }
    next(value) {
        if (this.isStopped) {
            handleStoppedNotification(nextNotification(value), this);
        }
        else {
            this._next(value);
        }
    }
    error(err) {
        if (this.isStopped) {
            handleStoppedNotification(errorNotification(err), this);
        }
        else {
            this.isStopped = true;
            this._error(err);
        }
    }
    complete() {
        if (this.isStopped) {
            handleStoppedNotification(COMPLETE_NOTIFICATION, this);
        }
        else {
            this.isStopped = true;
            this._complete();
        }
    }
    unsubscribe() {
        if (!this.closed) {
            this.isStopped = true;
            super.unsubscribe();
            this.destination = null;
        }
    }
    _next(value) {
        this.destination.next(value);
    }
    _error(err) {
        try {
            this.destination.error(err);
        }
        finally {
            this.unsubscribe();
        }
    }
    _complete() {
        try {
            this.destination.complete();
        }
        finally {
            this.unsubscribe();
        }
    }
}
const _bind = Function.prototype.bind;
function bind(fn, thisArg) {
    return _bind.call(fn, thisArg);
}
class ConsumerObserver {
    constructor(partialObserver) {
        this.partialObserver = partialObserver;
    }
    next(value) {
        const { partialObserver } = this;
        if (partialObserver.next) {
            try {
                partialObserver.next(value);
            }
            catch (error) {
                handleUnhandledError(error);
            }
        }
    }
    error(err) {
        const { partialObserver } = this;
        if (partialObserver.error) {
            try {
                partialObserver.error(err);
            }
            catch (error) {
                handleUnhandledError(error);
            }
        }
        else {
            handleUnhandledError(err);
        }
    }
    complete() {
        const { partialObserver } = this;
        if (partialObserver.complete) {
            try {
                partialObserver.complete();
            }
            catch (error) {
                handleUnhandledError(error);
            }
        }
    }
}
export class SafeSubscriber extends Subscriber {
    constructor(observerOrNext, error, complete) {
        super();
        let partialObserver;
        if (isFunction(observerOrNext) || !observerOrNext) {
            partialObserver = {
                next: (observerOrNext !== null && observerOrNext !== void 0 ? observerOrNext : undefined),
                error: error !== null && error !== void 0 ? error : undefined,
                complete: complete !== null && complete !== void 0 ? complete : undefined,
            };
        }
        else {
            let context;
            if (this && config.useDeprecatedNextContext) {
                context = Object.create(observerOrNext);
                context.unsubscribe = () => this.unsubscribe();
                partialObserver = {
                    next: observerOrNext.next && bind(observerOrNext.next, context),
                    error: observerOrNext.error && bind(observerOrNext.error, context),
                    complete: observerOrNext.complete && bind(observerOrNext.complete, context),
                };
            }
            else {
                partialObserver = observerOrNext;
            }
        }
        this.destination = new ConsumerObserver(partialObserver);
    }
}
function handleUnhandledError(error) {
    if (config.useDeprecatedSynchronousErrorHandling) {
        captureError(error);
    }
    else {
        reportUnhandledError(error);
    }
}
function defaultErrorHandler(err) {
    throw err;
}
function handleStoppedNotification(notification, subscriber) {
    const { onStoppedNotification } = config;
    onStoppedNotification && timeoutProvider.setTimeout(() => onStoppedNotification(notification, subscriber));
}
export const EMPTY_OBSERVER = {
    closed: true,
    next: noop,
    error: defaultErrorHandler,
    complete: noop,
};
//# sourceMappingURL=Subscriber.js.mapimport { isFunction } from './util/isFunction';
import { UnsubscriptionError } from './util/UnsubscriptionError';
import { arrRemove } from './util/arrRemove';
export class Subscription {
    constructor(initialTeardown) {
        this.initialTeardown = initialTeardown;
        this.closed = false;
        this._parentage = null;
        this._finalizers = null;
    }
    unsubscribe() {
        let errors;
        if (!this.closed) {
            this.closed = true;
            const { _parentage } = this;
            if (_parentage) {
                this._parentage = null;
                if (Array.isArray(_parentage)) {
                    for (const parent of _parentage) {
                        parent.remove(this);
                    }
                }
                else {
                    _parentage.remove(this);
                }
            }
            const { initialTeardown: initialFinalizer } = this;
            if (isFunction(initialFinalizer)) {
                try {
                    initialFinalizer();
                }
                catch (e) {
                    errors = e instanceof UnsubscriptionError ? e.errors : [e];
                }
            }
            const { _finalizers } = this;
            if (_finalizers) {
                this._finalizers = null;
                for (const finalizer of _finalizers) {
                    try {
                        execFinalizer(finalizer);
                    }
                    catch (err) {
                        errors = errors !== null && errors !== void 0 ? errors : [];
                        if (err instanceof UnsubscriptionError) {
                            errors = [...errors, ...err.errors];
                        }
                        else {
                            errors.push(err);
                        }
                    }
                }
            }
            if (errors) {
                throw new UnsubscriptionError(errors);
            }
        }
    }
    add(teardown) {
        var _a;
        if (teardown && teardown !== this) {
            if (this.closed) {
                execFinalizer(teardown);
            }
            else {
                if (teardown instanceof Subscription) {
                    if (teardown.closed || teardown._hasParent(this)) {
                        return;
                    }
                    teardown._addParent(this);
                }
                (this._finalizers = (_a = this._finalizers) !== null && _a !== void 0 ? _a : []).push(teardown);
            }
        }
    }
    _hasParent(parent) {
        const { _parentage } = this;
        return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));
    }
    _addParent(parent) {
        const { _parentage } = this;
        this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;
    }
    _removeParent(parent) {
        const { _parentage } = this;
        if (_parentage === parent) {
            this._parentage = null;
        }
        else if (Array.isArray(_parentage)) {
            arrRemove(_parentage, parent);
        }
    }
    remove(teardown) {
        const { _finalizers } = this;
        _finalizers && arrRemove(_finalizers, teardown);
        if (teardown instanceof Subscription) {
            teardown._removeParent(this);
        }
    }
}
Subscription.EMPTY = (() => {
    const empty = new Subscription();
    empty.closed = true;
    return empty;
})();
export const EMPTY_SUBSCRIPTION = Subscription.EMPTY;
export function isSubscription(value) {
    return (value instanceof Subscription ||
        (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe)));
}
function execFinalizer(finalizer) {
    if (isFunction(finalizer)) {
        finalizer();
    }
    else {
        finalizer.unsubscribe();
    }
}
//# sourceMappingURL=Subscription.js.mapexport const config = {
    onUnhandledError: null,
    onStoppedNotification: null,
    Promise: undefined,
    useDeprecatedSynchronousErrorHandling: false,
    useDeprecatedNextContext: false,
};
//# sourceMappingURL=config.js.mapimport { EmptyError } from './util/EmptyError';
import { SafeSubscriber } from './Subscriber';
export function firstValueFrom(source, config) {
    const hasConfig = typeof config === 'object';
    return new Promise((resolve, reject) => {
        const subscriber = new SafeSubscriber({
            next: (value) => {
                resolve(value);
                subscriber.unsubscribe();
            },
            error: reject,
            complete: () => {
                if (hasConfig) {
                    resolve(config.defaultValue);
                }
                else {
                    reject(new EmptyError());
                }
            },
        });
        source.subscribe(subscriber);
    });
}
//# sourceMappingURL=firstValueFrom.js.mapimport { EmptyError } from './util/EmptyError';
export function lastValueFrom(source, config) {
    const hasConfig = typeof config === 'object';
    return new Promise((resolve, reject) => {
        let _hasValue = false;
        let _value;
        source.subscribe({
            next: (value) => {
                _value = value;
                _hasValue = true;
            },
            error: reject,
            complete: () => {
                if (_hasValue) {
                    resolve(_value);
                }
                else if (hasConfig) {
                    resolve(config.defaultValue);
                }
                else {
                    reject(new EmptyError());
                }
            },
        });
    });
}
//# sourceMappingURL=lastValueFrom.js.mapexport {};
//# sourceMappingURL=types.js.mapexport * from '../index';
import * as _operators from '../operators/index';
export const operators = _operators;
import * as _testing from '../testing/index';
export const testing = _testing;
import * as _ajax from '../ajax/index';
export const ajax = _ajax;
import * as _webSocket from '../webSocket/index';
export const webSocket = _webSocket;
import * as _fetch from '../fetch/index';
export const fetch = _fetch;
//# sourceMappingURL=umd.js.mapimport { createErrorClass } from './createErrorClass';
export const ArgumentOutOfRangeError = createErrorClass((_super) => function ArgumentOutOfRangeErrorImpl() {
    _super(this);
    this.name = 'ArgumentOutOfRangeError';
    this.message = 'argument out of range';
});
//# sourceMappingURL=ArgumentOutOfRangeError.js.mapimport { createErrorClass } from './createErrorClass';
export const EmptyError = createErrorClass((_super) => function EmptyErrorImpl() {
    _super(this);
    this.name = 'EmptyError';
    this.message = 'no elements in sequence';
});
//# sourceMappingURL=EmptyError.js.maplet nextHandle = 1;
let resolved;
const activeHandles = {};
function findAndClearHandle(handle) {
    if (handle in activeHandles) {
        delete activeHandles[handle];
        return true;
    }
    return false;
}
export const Immediate = {
    setImmediate(cb) {
        const handle = nextHandle++;
        activeHandles[handle] = true;
        if (!resolved) {
            resolved = Promise.resolve();
        }
        resolved.then(() => findAndClearHandle(handle) && cb());
        return handle;
    },
    clearImmediate(handle) {
        findAndClearHandle(handle);
    },
};
export const TestTools = {
    pending() {
        return Object.keys(activeHandles).length;
    }
};
//# sourceMappingURL=Immediate.js.mapimport { createErrorClass } from './createErrorClass';
export const NotFoundError = createErrorClass((_super) => function NotFoundErrorImpl(message) {
    _super(this);
    this.name = 'NotFoundError';
    this.message = message;
});
//# sourceMappingURL=NotFoundError.js.mapimport { createErrorClass } from './createErrorClass';
export const ObjectUnsubscribedError = createErrorClass((_super) => function ObjectUnsubscribedErrorImpl() {
    _super(this);
    this.name = 'ObjectUnsubscribedError';
    this.message = 'object unsubscribed';
});
//# sourceMappingURL=ObjectUnsubscribedError.js.mapimport { createErrorClass } from './createErrorClass';
export const SequenceError = createErrorClass((_super) => function SequenceErrorImpl(message) {
    _super(this);
    this.name = 'SequenceError';
    this.message = message;
});
//# sourceMappingURL=SequenceError.js.mapimport { createErrorClass } from './createErrorClass';
export const UnsubscriptionError = createErrorClass((_super) => function UnsubscriptionErrorImpl(errors) {
    _super(this);
    this.message = errors
        ? `${errors.length} errors occurred during unsubscription:
${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\n  ')}`
        : '';
    this.name = 'UnsubscriptionError';
    this.errors = errors;
});
//# sourceMappingURL=UnsubscriptionError.js.mapexport function applyMixins(derivedCtor, baseCtors) {
    for (let i = 0, len = baseCtors.length; i < len; i++) {
        const baseCtor = baseCtors[i];
        const propertyKeys = Object.getOwnPropertyNames(baseCtor.prototype);
        for (let j = 0, len2 = propertyKeys.length; j < len2; j++) {
            const name = propertyKeys[j];
            derivedCtor.prototype[name] = baseCtor.prototype[name];
        }
    }
}
//# sourceMappingURL=applyMixins.js.mapimport { isFunction } from './isFunction';
import { isScheduler } from './isScheduler';
function last(arr) {
    return arr[arr.length - 1];
}
export function popResultSelector(args) {
    return isFunction(last(args)) ? args.pop() : undefined;
}
export function popScheduler(args) {
    return isScheduler(last(args)) ? args.pop() : undefined;
}
export function popNumber(args, defaultValue) {
    return typeof last(args) === 'number' ? args.pop() : defaultValue;
}
//# sourceMappingURL=args.js.mapconst { isArray } = Array;
const { getPrototypeOf, prototype: objectProto, keys: getKeys } = Object;
export function argsArgArrayOrObject(args) {
    if (args.length === 1) {
        const first = args[0];
        if (isArray(first)) {
            return { args: first, keys: null };
        }
        if (isPOJO(first)) {
            const keys = getKeys(first);
            return {
                args: keys.map((key) => first[key]),
                keys,
            };
        }
    }
    return { args: args, keys: null };
}
function isPOJO(obj) {
    return obj && typeof obj === 'object' && getPrototypeOf(obj) === objectProto;
}
//# sourceMappingURL=argsArgArrayOrObject.js.mapconst { isArray } = Array;
export function argsOrArgArray(args) {
    return args.length === 1 && isArray(args[0]) ? args[0] : args;
}
//# sourceMappingURL=argsOrArgArray.js.mapexport function arrRemove(arr, item) {
    if (arr) {
        const index = arr.indexOf(item);
        0 <= index && arr.splice(index, 1);
    }
}
//# sourceMappingURL=arrRemove.js.mapexport function createErrorClass(createImpl) {
    const _super = (instance) => {
        Error.call(instance);
        instance.stack = new Error().stack;
    };
    const ctorFunc = createImpl(_super);
    ctorFunc.prototype = Object.create(Error.prototype);
    ctorFunc.prototype.constructor = ctorFunc;
    return ctorFunc;
}
//# sourceMappingURL=createErrorClass.js.mapexport function createObject(keys, values) {
    return keys.reduce((result, key, i) => ((result[key] = values[i]), result), {});
}
//# sourceMappingURL=createObject.js.mapimport { config } from '../config';
let context = null;
export function errorContext(cb) {
    if (config.useDeprecatedSynchronousErrorHandling) {
        const isRoot = !context;
        if (isRoot) {
            context = { errorThrown: false, error: null };
        }
        cb();
        if (isRoot) {
            const { errorThrown, error } = context;
            context = null;
            if (errorThrown) {
                throw error;
            }
        }
    }
    else {
        cb();
    }
}
export function captureError(err) {
    if (config.useDeprecatedSynchronousErrorHandling && context) {
        context.errorThrown = true;
        context.error = err;
    }
}
//# sourceMappingURL=errorContext.js.mapexport function executeSchedule(parentSubscription, scheduler, work, delay = 0, repeat = false) {
    const scheduleSubscription = scheduler.schedule(function () {
        work();
        if (repeat) {
            parentSubscription.add(this.schedule(null, delay));
        }
        else {
            this.unsubscribe();
        }
    }, delay);
    parentSubscription.add(scheduleSubscription);
    if (!repeat) {
        return scheduleSubscription;
    }
}
//# sourceMappingURL=executeSchedule.js.mapexport function identity(x) {
    return x;
}
//# sourceMappingURL=identity.js.mapexport const isArrayLike = ((x) => x && typeof x.length === 'number' && typeof x !== 'function');
//# sourceMappingURL=isArrayLike.js.mapimport { isFunction } from './isFunction';
export function isAsyncIterable(obj) {
    return Symbol.asyncIterator && isFunction(obj === null || obj === void 0 ? void 0 : obj[Symbol.asyncIterator]);
}
//# sourceMappingURL=isAsyncIterable.js.mapexport function isValidDate(value) {
    return value instanceof Date && !isNaN(value);
}
//# sourceMappingURL=isDate.js.mapexport function isFunction(value) {
    return typeof value === 'function';
}
//# sourceMappingURL=isFunction.js.mapimport { observable as Symbol_observable } from '../symbol/observable';
import { isFunction } from './isFunction';
export function isInteropObservable(input) {
    return isFunction(input[Symbol_observable]);
}
//# sourceMappingURL=isInteropObservable.js.mapimport { iterator as Symbol_iterator } from '../symbol/iterator';
import { isFunction } from './isFunction';
export function isIterable(input) {
    return isFunction(input === null || input === void 0 ? void 0 : input[Symbol_iterator]);
}
//# sourceMappingURL=isIterable.js.mapimport { Observable } from '../Observable';
import { isFunction } from './isFunction';
export function isObservable(obj) {
    return !!obj && (obj instanceof Observable || (isFunction(obj.lift) && isFunction(obj.subscribe)));
}
//# sourceMappingURL=isObservable.js.mapimport { isFunction } from "./isFunction";
export function isPromise(value) {
    return isFunction(value === null || value === void 0 ? void 0 : value.then);
}
//# sourceMappingURL=isPromise.js.mapimport { __asyncGenerator, __await } from "tslib";
import { isFunction } from './isFunction';
export function readableStreamLikeToAsyncGenerator(readableStream) {
    return __asyncGenerator(this, arguments, function* readableStreamLikeToAsyncGenerator_1() {
        const reader = readableStream.getReader();
        try {
            while (true) {
                const { value, done } = yield __await(reader.read());
                if (done) {
                    return yield __await(void 0);
                }
                yield yield __await(value);
            }
        }
        finally {
            reader.releaseLock();
        }
    });
}
export function isReadableStreamLike(obj) {
    return isFunction(obj === null || obj === void 0 ? void 0 : obj.getReader);
}
//# sourceMappingURL=isReadableStreamLike.js.mapimport { isFunction } from './isFunction';
export function isScheduler(value) {
    return value && isFunction(value.schedule);
}
//# sourceMappingURL=isScheduler.js.mapimport { isFunction } from './isFunction';
export function hasLift(source) {
    return isFunction(source === null || source === void 0 ? void 0 : source.lift);
}
export function operate(init) {
    return (source) => {
        if (hasLift(source)) {
            return source.lift(function (liftedSource) {
                try {
                    return init(liftedSource, this);
                }
                catch (err) {
                    this.error(err);
                }
            });
        }
        throw new TypeError('Unable to lift unknown Observable type');
    };
}
//# sourceMappingURL=lift.js.mapimport { map } from "../operators/map";
const { isArray } = Array;
function callOrApply(fn, args) {
    return isArray(args) ? fn(...args) : fn(args);
}
export function mapOneOrManyArgs(fn) {
    return map(args => callOrApply(fn, args));
}
//# sourceMappingURL=mapOneOrManyArgs.js.mapexport function noop() { }
//# sourceMappingURL=noop.js.mapexport function not(pred, thisArg) {
    return (value, index) => !pred.call(thisArg, value, index);
}
//# sourceMappingURL=not.js.mapimport { identity } from './identity';
export function pipe(...fns) {
    return pipeFromArray(fns);
}
export function pipeFromArray(fns) {
    if (fns.length === 0) {
        return identity;
    }
    if (fns.length === 1) {
        return fns[0];
    }
    return function piped(input) {
        return fns.reduce((prev, fn) => fn(prev), input);
    };
}
//# sourceMappingURL=pipe.js.mapimport { config } from '../config';
import { timeoutProvider } from '../scheduler/timeoutProvider';
export function reportUnhandledError(err) {
    timeoutProvider.setTimeout(() => {
        const { onUnhandledError } = config;
        if (onUnhandledError) {
            onUnhandledError(err);
        }
        else {
            throw err;
        }
    });
}
//# sourceMappingURL=reportUnhandledError.js.mapexport const subscribeToArray = (array) => (subscriber) => {
    for (let i = 0, len = array.length; i < len && !subscriber.closed; i++) {
        subscriber.next(array[i]);
    }
    subscriber.complete();
};
//# sourceMappingURL=subscribeToArray.js.mapexport function createInvalidObservableTypeError(input) {
    return new TypeError(`You provided ${input !== null && typeof input === 'object' ? 'an invalid object' : `'${input}'`} where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`);
}
//# sourceMappingURL=throwUnobservableError.js.mapexport {};
//# sourceMappingURL=workarounds.js.mapimport { Observable } from '../Observable';
import { Subscription } from '../Subscription';
import { SubscriptionLoggable } from './SubscriptionLoggable';
import { applyMixins } from '../util/applyMixins';
import { observeNotification } from '../Notification';
export class ColdObservable extends Observable {
    constructor(messages, scheduler) {
        super(function (subscriber) {
            const observable = this;
            const index = observable.logSubscribedFrame();
            const subscription = new Subscription();
            subscription.add(new Subscription(() => {
                observable.logUnsubscribedFrame(index);
            }));
            observable.scheduleMessages(subscriber);
            return subscription;
        });
        this.messages = messages;
        this.subscriptions = [];
        this.scheduler = scheduler;
    }
    scheduleMessages(subscriber) {
        const messagesLength = this.messages.length;
        for (let i = 0; i < messagesLength; i++) {
            const message = this.messages[i];
            subscriber.add(this.scheduler.schedule((state) => {
                const { message: { notification }, subscriber: destination } = state;
                observeNotification(notification, destination);
            }, message.frame, { message, subscriber }));
        }
    }
}
applyMixins(ColdObservable, [SubscriptionLoggable]);
//# sourceMappingURL=ColdObservable.js.mapimport { Subject } from '../Subject';
import { Subscription } from '../Subscription';
import { SubscriptionLoggable } from './SubscriptionLoggable';
import { applyMixins } from '../util/applyMixins';
import { observeNotification } from '../Notification';
export class HotObservable extends Subject {
    constructor(messages, scheduler) {
        super();
        this.messages = messages;
        this.subscriptions = [];
        this.scheduler = scheduler;
    }
    _subscribe(subscriber) {
        const subject = this;
        const index = subject.logSubscribedFrame();
        const subscription = new Subscription();
        subscription.add(new Subscription(() => {
            subject.logUnsubscribedFrame(index);
        }));
        subscription.add(super._subscribe(subscriber));
        return subscription;
    }
    setup() {
        const subject = this;
        const messagesLength = subject.messages.length;
        for (let i = 0; i < messagesLength; i++) {
            (() => {
                const { notification, frame } = subject.messages[i];
                subject.scheduler.schedule(() => {
                    observeNotification(notification, subject);
                }, frame);
            })();
        }
    }
}
applyMixins(HotObservable, [SubscriptionLoggable]);
//# sourceMappingURL=HotObservable.js.mapexport class SubscriptionLog {
    constructor(subscribedFrame, unsubscribedFrame = Infinity) {
        this.subscribedFrame = subscribedFrame;
        this.unsubscribedFrame = unsubscribedFrame;
    }
}
//# sourceMappingURL=SubscriptionLog.js.mapimport { SubscriptionLog } from './SubscriptionLog';
export class SubscriptionLoggable {
    constructor() {
        this.subscriptions = [];
    }
    logSubscribedFrame() {
        this.subscriptions.push(new SubscriptionLog(this.scheduler.now()));
        return this.subscriptions.length - 1;
    }
    logUnsubscribedFrame(index) {
        const subscriptionLogs = this.subscriptions;
        const oldSubscriptionLog = subscriptionLogs[index];
        subscriptionLogs[index] = new SubscriptionLog(oldSubscriptionLog.subscribedFrame, this.scheduler.now());
    }
}
//# sourceMappingURL=SubscriptionLoggable.js.mapexport {};
//# sourceMappingURL=TestMessage.js.mapimport { Observable } from '../Observable';
import { ColdObservable } from './ColdObservable';
import { HotObservable } from './HotObservable';
import { SubscriptionLog } from './SubscriptionLog';
import { VirtualTimeScheduler, VirtualAction } from '../scheduler/VirtualTimeScheduler';
import { COMPLETE_NOTIFICATION, errorNotification, nextNotification } from '../NotificationFactories';
import { dateTimestampProvider } from '../scheduler/dateTimestampProvider';
import { performanceTimestampProvider } from '../scheduler/performanceTimestampProvider';
import { animationFrameProvider } from '../scheduler/animationFrameProvider';
import { immediateProvider } from '../scheduler/immediateProvider';
import { intervalProvider } from '../scheduler/intervalProvider';
import { timeoutProvider } from '../scheduler/timeoutProvider';
const defaultMaxFrame = 750;
export class TestScheduler extends VirtualTimeScheduler {
    constructor(assertDeepEqual) {
        super(VirtualAction, defaultMaxFrame);
        this.assertDeepEqual = assertDeepEqual;
        this.hotObservables = [];
        this.coldObservables = [];
        this.flushTests = [];
        this.runMode = false;
    }
    createTime(marbles) {
        const indexOf = this.runMode ? marbles.trim().indexOf('|') : marbles.indexOf('|');
        if (indexOf === -1) {
            throw new Error('marble diagram for time should have a completion marker "|"');
        }
        return indexOf * TestScheduler.frameTimeFactor;
    }
    createColdObservable(marbles, values, error) {
        if (marbles.indexOf('^') !== -1) {
            throw new Error('cold observable cannot have subscription offset "^"');
        }
        if (marbles.indexOf('!') !== -1) {
            throw new Error('cold observable cannot have unsubscription marker "!"');
        }
        const messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);
        const cold = new ColdObservable(messages, this);
        this.coldObservables.push(cold);
        return cold;
    }
    createHotObservable(marbles, values, error) {
        if (marbles.indexOf('!') !== -1) {
            throw new Error('hot observable cannot have unsubscription marker "!"');
        }
        const messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);
        const subject = new HotObservable(messages, this);
        this.hotObservables.push(subject);
        return subject;
    }
    materializeInnerObservable(observable, outerFrame) {
        const messages = [];
        observable.subscribe({
            next: (value) => {
                messages.push({ frame: this.frame - outerFrame, notification: nextNotification(value) });
            },
            error: (error) => {
                messages.push({ frame: this.frame - outerFrame, notification: errorNotification(error) });
            },
            complete: () => {
                messages.push({ frame: this.frame - outerFrame, notification: COMPLETE_NOTIFICATION });
            },
        });
        return messages;
    }
    expectObservable(observable, subscriptionMarbles = null) {
        const actual = [];
        const flushTest = { actual, ready: false };
        const subscriptionParsed = TestScheduler.parseMarblesAsSubscriptions(subscriptionMarbles, this.runMode);
        const subscriptionFrame = subscriptionParsed.subscribedFrame === Infinity ? 0 : subscriptionParsed.subscribedFrame;
        const unsubscriptionFrame = subscriptionParsed.unsubscribedFrame;
        let subscription;
        this.schedule(() => {
            subscription = observable.subscribe({
                next: (x) => {
                    const value = x instanceof Observable ? this.materializeInnerObservable(x, this.frame) : x;
                    actual.push({ frame: this.frame, notification: nextNotification(value) });
                },
                error: (error) => {
                    actual.push({ frame: this.frame, notification: errorNotification(error) });
                },
                complete: () => {
                    actual.push({ frame: this.frame, notification: COMPLETE_NOTIFICATION });
                },
            });
        }, subscriptionFrame);
        if (unsubscriptionFrame !== Infinity) {
            this.schedule(() => subscription.unsubscribe(), unsubscriptionFrame);
        }
        this.flushTests.push(flushTest);
        const { runMode } = this;
        return {
            toBe(marbles, values, errorValue) {
                flushTest.ready = true;
                flushTest.expected = TestScheduler.parseMarbles(marbles, values, errorValue, true, runMode);
            },
            toEqual: (other) => {
                flushTest.ready = true;
                flushTest.expected = [];
                this.schedule(() => {
                    subscription = other.subscribe({
                        next: (x) => {
                            const value = x instanceof Observable ? this.materializeInnerObservable(x, this.frame) : x;
                            flushTest.expected.push({ frame: this.frame, notification: nextNotification(value) });
                        },
                        error: (error) => {
                            flushTest.expected.push({ frame: this.frame, notification: errorNotification(error) });
                        },
                        complete: () => {
                            flushTest.expected.push({ frame: this.frame, notification: COMPLETE_NOTIFICATION });
                        },
                    });
                }, subscriptionFrame);
            },
        };
    }
    expectSubscriptions(actualSubscriptionLogs) {
        const flushTest = { actual: actualSubscriptionLogs, ready: false };
        this.flushTests.push(flushTest);
        const { runMode } = this;
        return {
            toBe(marblesOrMarblesArray) {
                const marblesArray = typeof marblesOrMarblesArray === 'string' ? [marblesOrMarblesArray] : marblesOrMarblesArray;
                flushTest.ready = true;
                flushTest.expected = marblesArray
                    .map((marbles) => TestScheduler.parseMarblesAsSubscriptions(marbles, runMode))
                    .filter((marbles) => marbles.subscribedFrame !== Infinity);
            },
        };
    }
    flush() {
        const hotObservables = this.hotObservables;
        while (hotObservables.length > 0) {
            hotObservables.shift().setup();
        }
        super.flush();
        this.flushTests = this.flushTests.filter((test) => {
            if (test.ready) {
                this.assertDeepEqual(test.actual, test.expected);
                return false;
            }
            return true;
        });
    }
    static parseMarblesAsSubscriptions(marbles, runMode = false) {
        if (typeof marbles !== 'string') {
            return new SubscriptionLog(Infinity);
        }
        const characters = [...marbles];
        const len = characters.length;
        let groupStart = -1;
        let subscriptionFrame = Infinity;
        let unsubscriptionFrame = Infinity;
        let frame = 0;
        for (let i = 0; i < len; i++) {
            let nextFrame = frame;
            const advanceFrameBy = (count) => {
                nextFrame += count * this.frameTimeFactor;
            };
            const c = characters[i];
            switch (c) {
                case ' ':
                    if (!runMode) {
                        advanceFrameBy(1);
                    }
                    break;
                case '-':
                    advanceFrameBy(1);
                    break;
                case '(':
                    groupStart = frame;
                    advanceFrameBy(1);
                    break;
                case ')':
                    groupStart = -1;
                    advanceFrameBy(1);
                    break;
                case '^':
                    if (subscriptionFrame !== Infinity) {
                        throw new Error("found a second subscription point '^' in a " + 'subscription marble diagram. There can only be one.');
                    }
                    subscriptionFrame = groupStart > -1 ? groupStart : frame;
                    advanceFrameBy(1);
                    break;
                case '!':
                    if (unsubscriptionFrame !== Infinity) {
                        throw new Error("found a second unsubscription point '!' in a " + 'subscription marble diagram. There can only be one.');
                    }
                    unsubscriptionFrame = groupStart > -1 ? groupStart : frame;
                    break;
                default:
                    if (runMode && c.match(/^[0-9]$/)) {
                        if (i === 0 || characters[i - 1] === ' ') {
                            const buffer = characters.slice(i).join('');
                            const match = buffer.match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);
                            if (match) {
                                i += match[0].length - 1;
                                const duration = parseFloat(match[1]);
                                const unit = match[2];
                                let durationInMs;
                                switch (unit) {
                                    case 'ms':
                                        durationInMs = duration;
                                        break;
                                    case 's':
                                        durationInMs = duration * 1000;
                                        break;
                                    case 'm':
                                        durationInMs = duration * 1000 * 60;
                                        break;
                                    default:
                                        break;
                                }
                                advanceFrameBy(durationInMs / this.frameTimeFactor);
                                break;
                            }
                        }
                    }
                    throw new Error("there can only be '^' and '!' markers in a " + "subscription marble diagram. Found instead '" + c + "'.");
            }
            frame = nextFrame;
        }
        if (unsubscriptionFrame < 0) {
            return new SubscriptionLog(subscriptionFrame);
        }
        else {
            return new SubscriptionLog(subscriptionFrame, unsubscriptionFrame);
        }
    }
    static parseMarbles(marbles, values, errorValue, materializeInnerObservables = false, runMode = false) {
        if (marbles.indexOf('!') !== -1) {
            throw new Error('conventional marble diagrams cannot have the ' + 'unsubscription marker "!"');
        }
        const characters = [...marbles];
        const len = characters.length;
        const testMessages = [];
        const subIndex = runMode ? marbles.replace(/^[ ]+/, '').indexOf('^') : marbles.indexOf('^');
        let frame = subIndex === -1 ? 0 : subIndex * -this.frameTimeFactor;
        const getValue = typeof values !== 'object'
            ? (x) => x
            : (x) => {
                if (materializeInnerObservables && values[x] instanceof ColdObservable) {
                    return values[x].messages;
                }
                return values[x];
            };
        let groupStart = -1;
        for (let i = 0; i < len; i++) {
            let nextFrame = frame;
            const advanceFrameBy = (count) => {
                nextFrame += count * this.frameTimeFactor;
            };
            let notification;
            const c = characters[i];
            switch (c) {
                case ' ':
                    if (!runMode) {
                        advanceFrameBy(1);
                    }
                    break;
                case '-':
                    advanceFrameBy(1);
                    break;
                case '(':
                    groupStart = frame;
                    advanceFrameBy(1);
                    break;
                case ')':
                    groupStart = -1;
                    advanceFrameBy(1);
                    break;
                case '|':
                    notification = COMPLETE_NOTIFICATION;
                    advanceFrameBy(1);
                    break;
                case '^':
                    advanceFrameBy(1);
                    break;
                case '#':
                    notification = errorNotification(errorValue || 'error');
                    advanceFrameBy(1);
                    break;
                default:
                    if (runMode && c.match(/^[0-9]$/)) {
                        if (i === 0 || characters[i - 1] === ' ') {
                            const buffer = characters.slice(i).join('');
                            const match = buffer.match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);
                            if (match) {
                                i += match[0].length - 1;
                                const duration = parseFloat(match[1]);
                                const unit = match[2];
                                let durationInMs;
                                switch (unit) {
                                    case 'ms':
                                        durationInMs = duration;
                                        break;
                                    case 's':
                                        durationInMs = duration * 1000;
                                        break;
                                    case 'm':
                                        durationInMs = duration * 1000 * 60;
                                        break;
                                    default:
                                        break;
                                }
                                advanceFrameBy(durationInMs / this.frameTimeFactor);
                                break;
                            }
                        }
                    }
                    notification = nextNotification(getValue(c));
                    advanceFrameBy(1);
                    break;
            }
            if (notification) {
                testMessages.push({ frame: groupStart > -1 ? groupStart : frame, notification });
            }
            frame = nextFrame;
        }
        return testMessages;
    }
    createAnimator() {
        if (!this.runMode) {
            throw new Error('animate() must only be used in run mode');
        }
        let lastHandle = 0;
        let map;
        const delegate = {
            requestAnimationFrame(callback) {
                if (!map) {
                    throw new Error('animate() was not called within run()');
                }
                const handle = ++lastHandle;
                map.set(handle, callback);
                return handle;
            },
            cancelAnimationFrame(handle) {
                if (!map) {
                    throw new Error('animate() was not called within run()');
                }
                map.delete(handle);
            },
        };
        const animate = (marbles) => {
            if (map) {
                throw new Error('animate() must not be called more than once within run()');
            }
            if (/[|#]/.test(marbles)) {
                throw new Error('animate() must not complete or error');
            }
            map = new Map();
            const messages = TestScheduler.parseMarbles(marbles, undefined, undefined, undefined, true);
            for (const message of messages) {
                this.schedule(() => {
                    const now = this.now();
                    const callbacks = Array.from(map.values());
                    map.clear();
                    for (const callback of callbacks) {
                        callback(now);
                    }
                }, message.frame);
            }
        };
        return { animate, delegate };
    }
    createDelegates() {
        let lastHandle = 0;
        const scheduleLookup = new Map();
        const run = () => {
            const now = this.now();
            const scheduledRecords = Array.from(scheduleLookup.values());
            const scheduledRecordsDue = scheduledRecords.filter(({ due }) => due <= now);
            const dueImmediates = scheduledRecordsDue.filter(({ type }) => type === 'immediate');
            if (dueImmediates.length > 0) {
                const { handle, handler } = dueImmediates[0];
                scheduleLookup.delete(handle);
                handler();
                return;
            }
            const dueIntervals = scheduledRecordsDue.filter(({ type }) => type === 'interval');
            if (dueIntervals.length > 0) {
                const firstDueInterval = dueIntervals[0];
                const { duration, handler } = firstDueInterval;
                firstDueInterval.due = now + duration;
                firstDueInterval.subscription = this.schedule(run, duration);
                handler();
                return;
            }
            const dueTimeouts = scheduledRecordsDue.filter(({ type }) => type === 'timeout');
            if (dueTimeouts.length > 0) {
                const { handle, handler } = dueTimeouts[0];
                scheduleLookup.delete(handle);
                handler();
                return;
            }
            throw new Error('Expected a due immediate or interval');
        };
        const immediate = {
            setImmediate: (handler) => {
                const handle = ++lastHandle;
                scheduleLookup.set(handle, {
                    due: this.now(),
                    duration: 0,
                    handle,
                    handler,
                    subscription: this.schedule(run, 0),
                    type: 'immediate',
                });
                return handle;
            },
            clearImmediate: (handle) => {
                const value = scheduleLookup.get(handle);
                if (value) {
                    value.subscription.unsubscribe();
                    scheduleLookup.delete(handle);
                }
            },
        };
        const interval = {
            setInterval: (handler, duration = 0) => {
                const handle = ++lastHandle;
                scheduleLookup.set(handle, {
                    due: this.now() + duration,
                    duration,
                    handle,
                    handler,
                    subscription: this.schedule(run, duration),
                    type: 'interval',
                });
                return handle;
            },
            clearInterval: (handle) => {
                const value = scheduleLookup.get(handle);
                if (value) {
                    value.subscription.unsubscribe();
                    scheduleLookup.delete(handle);
                }
            },
        };
        const timeout = {
            setTimeout: (handler, duration = 0) => {
                const handle = ++lastHandle;
                scheduleLookup.set(handle, {
                    due: this.now() + duration,
                    duration,
                    handle,
                    handler,
                    subscription: this.schedule(run, duration),
                    type: 'timeout',
                });
                return handle;
            },
            clearTimeout: (handle) => {
                const value = scheduleLookup.get(handle);
                if (value) {
                    value.subscription.unsubscribe();
                    scheduleLookup.delete(handle);
                }
            },
        };
        return { immediate, interval, timeout };
    }
    run(callback) {
        const prevFrameTimeFactor = TestScheduler.frameTimeFactor;
        const prevMaxFrames = this.maxFrames;
        TestScheduler.frameTimeFactor = 1;
        this.maxFrames = Infinity;
        this.runMode = true;
        const animator = this.createAnimator();
        const delegates = this.createDelegates();
        animationFrameProvider.delegate = animator.delegate;
        dateTimestampProvider.delegate = this;
        immediateProvider.delegate = delegates.immediate;
        intervalProvider.delegate = delegates.interval;
        timeoutProvider.delegate = delegates.timeout;
        performanceTimestampProvider.delegate = this;
        const helpers = {
            cold: this.createColdObservable.bind(this),
            hot: this.createHotObservable.bind(this),
            flush: this.flush.bind(this),
            time: this.createTime.bind(this),
            expectObservable: this.expectObservable.bind(this),
            expectSubscriptions: this.expectSubscriptions.bind(this),
            animate: animator.animate,
        };
        try {
            const ret = callback(helpers);
            this.flush();
            return ret;
        }
        finally {
            TestScheduler.frameTimeFactor = prevFrameTimeFactor;
            this.maxFrames = prevMaxFrames;
            this.runMode = false;
            animationFrameProvider.delegate = undefined;
            dateTimestampProvider.delegate = undefined;
            immediateProvider.delegate = undefined;
            intervalProvider.delegate = undefined;
            timeoutProvider.delegate = undefined;
            performanceTimestampProvider.delegate = undefined;
        }
    }
}
TestScheduler.frameTimeFactor = 10;
//# sourceMappingURL=TestScheduler.js.mapexport function getSymbolIterator() {
    if (typeof Symbol !== 'function' || !Symbol.iterator) {
        return '@@iterator';
    }
    return Symbol.iterator;
}
export const iterator = getSymbolIterator();
//# sourceMappingURL=iterator.js.mapexport const observable = (() => (typeof Symbol === 'function' && Symbol.observable) || '@@observable')();
//# sourceMappingURL=observable.js.mapimport { Subscription } from '../Subscription';
export class Action extends Subscription {
    constructor(scheduler, work) {
        super();
    }
    schedule(state, delay = 0) {
        return this;
    }
}
//# sourceMappingURL=Action.js.mapimport { AsyncAction } from './AsyncAction';
import { animationFrameProvider } from './animationFrameProvider';
export class AnimationFrameAction extends AsyncAction {
    constructor(scheduler, work) {
        super(scheduler, work);
        this.scheduler = scheduler;
        this.work = work;
    }
    requestAsyncId(scheduler, id, delay = 0) {
        if (delay !== null && delay > 0) {
            return super.requestAsyncId(scheduler, id, delay);
        }
        scheduler.actions.push(this);
        return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(() => scheduler.flush(undefined)));
    }
    recycleAsyncId(scheduler, id, delay = 0) {
        if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {
            return super.recycleAsyncId(scheduler, id, delay);
        }
        if (!scheduler.actions.some((action) => action.id === id)) {
            animationFrameProvider.cancelAnimationFrame(id);
            scheduler._scheduled = undefined;
        }
        return undefined;
    }
}
//# sourceMappingURL=AnimationFrameAction.js.mapimport { AsyncScheduler } from './AsyncScheduler';
export class AnimationFrameScheduler extends AsyncScheduler {
    flush(action) {
        this._active = true;
        const flushId = this._scheduled;
        this._scheduled = undefined;
        const { actions } = this;
        let error;
        action = action || actions.shift();
        do {
            if ((error = action.execute(action.state, action.delay))) {
                break;
            }
        } while ((action = actions[0]) && action.id === flushId && actions.shift());
        this._active = false;
        if (error) {
            while ((action = actions[0]) && action.id === flushId && actions.shift()) {
                action.unsubscribe();
            }
            throw error;
        }
    }
}
//# sourceMappingURL=AnimationFrameScheduler.js.mapimport { AsyncAction } from './AsyncAction';
import { immediateProvider } from './immediateProvider';
export class AsapAction extends AsyncAction {
    constructor(scheduler, work) {
        super(scheduler, work);
        this.scheduler = scheduler;
        this.work = work;
    }
    requestAsyncId(scheduler, id, delay = 0) {
        if (delay !== null && delay > 0) {
            return super.requestAsyncId(scheduler, id, delay);
        }
        scheduler.actions.push(this);
        return scheduler._scheduled || (scheduler._scheduled = immediateProvider.setImmediate(scheduler.flush.bind(scheduler, undefined)));
    }
    recycleAsyncId(scheduler, id, delay = 0) {
        if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {
            return super.recycleAsyncId(scheduler, id, delay);
        }
        if (!scheduler.actions.some((action) => action.id === id)) {
            immediateProvider.clearImmediate(id);
            scheduler._scheduled = undefined;
        }
        return undefined;
    }
}
//# sourceMappingURL=AsapAction.js.mapimport { AsyncScheduler } from './AsyncScheduler';
export class AsapScheduler extends AsyncScheduler {
    flush(action) {
        this._active = true;
        const flushId = this._scheduled;
        this._scheduled = undefined;
        const { actions } = this;
        let error;
        action = action || actions.shift();
        do {
            if ((error = action.execute(action.state, action.delay))) {
                break;
            }
        } while ((action = actions[0]) && action.id === flushId && actions.shift());
        this._active = false;
        if (error) {
            while ((action = actions[0]) && action.id === flushId && actions.shift()) {
                action.unsubscribe();
            }
            throw error;
        }
    }
}
//# sourceMappingURL=AsapScheduler.js.mapimport { Action } from './Action';
import { intervalProvider } from './intervalProvider';
import { arrRemove } from '../util/arrRemove';
export class AsyncAction extends Action {
    constructor(scheduler, work) {
        super(scheduler, work);
        this.scheduler = scheduler;
        this.work = work;
        this.pending = false;
    }
    schedule(state, delay = 0) {
        if (this.closed) {
            return this;
        }
        this.state = state;
        const id = this.id;
        const scheduler = this.scheduler;
        if (id != null) {
            this.id = this.recycleAsyncId(scheduler, id, delay);
        }
        this.pending = true;
        this.delay = delay;
        this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);
        return this;
    }
    requestAsyncId(scheduler, _id, delay = 0) {
        return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);
    }
    recycleAsyncId(_scheduler, id, delay = 0) {
        if (delay != null && this.delay === delay && this.pending === false) {
            return id;
        }
        intervalProvider.clearInterval(id);
        return undefined;
    }
    execute(state, delay) {
        if (this.closed) {
            return new Error('executing a cancelled action');
        }
        this.pending = false;
        const error = this._execute(state, delay);
        if (error) {
            return error;
        }
        else if (this.pending === false && this.id != null) {
            this.id = this.recycleAsyncId(this.scheduler, this.id, null);
        }
    }
    _execute(state, _delay) {
        let errored = false;
        let errorValue;
        try {
            this.work(state);
        }
        catch (e) {
            errored = true;
            errorValue = e ? e : new Error('Scheduled action threw falsy error');
        }
        if (errored) {
            this.unsubscribe();
            return errorValue;
        }
    }
    unsubscribe() {
        if (!this.closed) {
            const { id, scheduler } = this;
            const { actions } = scheduler;
            this.work = this.state = this.scheduler = null;
            this.pending = false;
            arrRemove(actions, this);
            if (id != null) {
                this.id = this.recycleAsyncId(scheduler, id, null);
            }
            this.delay = null;
            super.unsubscribe();
        }
    }
}
//# sourceMappingURL=AsyncAction.js.mapimport { Scheduler } from '../Scheduler';
export class AsyncScheduler extends Scheduler {
    constructor(SchedulerAction, now = Scheduler.now) {
        super(SchedulerAction, now);
        this.actions = [];
        this._active = false;
        this._scheduled = undefined;
    }
    flush(action) {
        const { actions } = this;
        if (this._active) {
            actions.push(action);
            return;
        }
        let error;
        this._active = true;
        do {
            if ((error = action.execute(action.state, action.delay))) {
                break;
            }
        } while ((action = actions.shift()));
        this._active = false;
        if (error) {
            while ((action = actions.shift())) {
                action.unsubscribe();
            }
            throw error;
        }
    }
}
//# sourceMappingURL=AsyncScheduler.js.mapimport { AsyncAction } from './AsyncAction';
export class QueueAction extends AsyncAction {
    constructor(scheduler, work) {
        super(scheduler, work);
        this.scheduler = scheduler;
        this.work = work;
    }
    schedule(state, delay = 0) {
        if (delay > 0) {
            return super.schedule(state, delay);
        }
        this.delay = delay;
        this.state = state;
        this.scheduler.flush(this);
        return this;
    }
    execute(state, delay) {
        return (delay > 0 || this.closed) ?
            super.execute(state, delay) :
            this._execute(state, delay);
    }
    requestAsyncId(scheduler, id, delay = 0) {
        if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {
            return super.requestAsyncId(scheduler, id, delay);
        }
        return scheduler.flush(this);
    }
}
//# sourceMappingURL=QueueAction.js.mapimport { AsyncScheduler } from './AsyncScheduler';
export class QueueScheduler extends AsyncScheduler {
}
//# sourceMappingURL=QueueScheduler.js.mapimport { AsyncAction } from './AsyncAction';
import { Subscription } from '../Subscription';
import { AsyncScheduler } from './AsyncScheduler';
export class VirtualTimeScheduler extends AsyncScheduler {
    constructor(schedulerActionCtor = VirtualAction, maxFrames = Infinity) {
        super(schedulerActionCtor, () => this.frame);
        this.maxFrames = maxFrames;
        this.frame = 0;
        this.index = -1;
    }
    flush() {
        const { actions, maxFrames } = this;
        let error;
        let action;
        while ((action = actions[0]) && action.delay <= maxFrames) {
            actions.shift();
            this.frame = action.delay;
            if ((error = action.execute(action.state, action.delay))) {
                break;
            }
        }
        if (error) {
            while ((action = actions.shift())) {
                action.unsubscribe();
            }
            throw error;
        }
    }
}
VirtualTimeScheduler.frameTimeFactor = 10;
export class VirtualAction extends AsyncAction {
    constructor(scheduler, work, index = (scheduler.index += 1)) {
        super(scheduler, work);
        this.scheduler = scheduler;
        this.work = work;
        this.index = index;
        this.active = true;
        this.index = scheduler.index = index;
    }
    schedule(state, delay = 0) {
        if (Number.isFinite(delay)) {
            if (!this.id) {
                return super.schedule(state, delay);
            }
            this.active = false;
            const action = new VirtualAction(this.scheduler, this.work);
            this.add(action);
            return action.schedule(state, delay);
        }
        else {
            return Subscription.EMPTY;
        }
    }
    requestAsyncId(scheduler, id, delay = 0) {
        this.delay = scheduler.frame + delay;
        const { actions } = scheduler;
        actions.push(this);
        actions.sort(VirtualAction.sortActions);
        return true;
    }
    recycleAsyncId(scheduler, id, delay = 0) {
        return undefined;
    }
    _execute(state, delay) {
        if (this.active === true) {
            return super._execute(state, delay);
        }
    }
    static sortActions(a, b) {
        if (a.delay === b.delay) {
            if (a.index === b.index) {
                return 0;
            }
            else if (a.index > b.index) {
                return 1;
            }
            else {
                return -1;
            }
        }
        else if (a.delay > b.delay) {
            return 1;
        }
        else {
            return -1;
        }
    }
}
//# sourceMappingURL=VirtualTimeScheduler.js.mapimport { AnimationFrameAction } from './AnimationFrameAction';
import { AnimationFrameScheduler } from './AnimationFrameScheduler';
export const animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);
export const animationFrame = animationFrameScheduler;
//# sourceMappingURL=animationFrame.js.mapimport { Subscription } from '../Subscription';
export const animationFrameProvider = {
    schedule(callback) {
        let request = requestAnimationFrame;
        let cancel = cancelAnimationFrame;
        const { delegate } = animationFrameProvider;
        if (delegate) {
            request = delegate.requestAnimationFrame;
            cancel = delegate.cancelAnimationFrame;
        }
        const handle = request((timestamp) => {
            cancel = undefined;
            callback(timestamp);
        });
        return new Subscription(() => cancel === null || cancel === void 0 ? void 0 : cancel(handle));
    },
    requestAnimationFrame(...args) {
        const { delegate } = animationFrameProvider;
        return ((delegate === null || delegate === void 0 ? void 0 : delegate.requestAnimationFrame) || requestAnimationFrame)(...args);
    },
    cancelAnimationFrame(...args) {
        const { delegate } = animationFrameProvider;
        return ((delegate === null || delegate === void 0 ? void 0 : delegate.cancelAnimationFrame) || cancelAnimationFrame)(...args);
    },
    delegate: undefined,
};
//# sourceMappingURL=animationFrameProvider.js.mapimport { AsapAction } from './AsapAction';
import { AsapScheduler } from './AsapScheduler';
export const asapScheduler = new AsapScheduler(AsapAction);
export const asap = asapScheduler;
//# sourceMappingURL=asap.js.mapimport { AsyncAction } from './AsyncAction';
import { AsyncScheduler } from './AsyncScheduler';
export const asyncScheduler = new AsyncScheduler(AsyncAction);
export const async = asyncScheduler;
//# sourceMappingURL=async.js.mapexport const dateTimestampProvider = {
    now() {
        return (dateTimestampProvider.delegate || Date).now();
    },
    delegate: undefined,
};
//# sourceMappingURL=dateTimestampProvider.js.mapimport { Immediate } from '../util/Immediate';
const { setImmediate, clearImmediate } = Immediate;
export const immediateProvider = {
    setImmediate(...args) {
        const { delegate } = immediateProvider;
        return ((delegate === null || delegate === void 0 ? void 0 : delegate.setImmediate) || setImmediate)(...args);
    },
    clearImmediate(handle) {
        const { delegate } = immediateProvider;
        return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearImmediate) || clearImmediate)(handle);
    },
    delegate: undefined,
};
//# sourceMappingURL=immediateProvider.js.mapexport const intervalProvider = {
    setInterval(handler, timeout, ...args) {
        const { delegate } = intervalProvider;
        if (delegate === null || delegate === void 0 ? void 0 : delegate.setInterval) {
            return delegate.setInterval(handler, timeout, ...args);
        }
        return setInterval(handler, timeout, ...args);
    },
    clearInterval(handle) {
        const { delegate } = intervalProvider;
        return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearInterval) || clearInterval)(handle);
    },
    delegate: undefined,
};
//# sourceMappingURL=intervalProvider.js.mapexport const performanceTimestampProvider = {
    now() {
        return (performanceTimestampProvider.delegate || performance).now();
    },
    delegate: undefined,
};
//# sourceMappingURL=performanceTimestampProvider.js.mapimport { QueueAction } from './QueueAction';
import { QueueScheduler } from './QueueScheduler';
export const queueScheduler = new QueueScheduler(QueueAction);
export const queue = queueScheduler;
//# sourceMappingURL=queue.js.mapexport const timeoutProvider = {
    setTimeout(handler, timeout, ...args) {
        const { delegate } = timeoutProvider;
        if (delegate === null || delegate === void 0 ? void 0 : delegate.setTimeout) {
            return delegate.setTimeout(handler, timeout, ...args);
        }
        return setTimeout(handler, timeout, ...args);
    },
    clearTimeout(handle) {
        const { delegate } = timeoutProvider;
        return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearTimeout) || clearTimeout)(handle);
    },
    delegate: undefined,
};
//# sourceMappingURL=timeoutProvider.js.mapexport {};
//# sourceMappingURL=timerHandle.js.mapimport { Observable } from '../Observable';
export function scheduleArray(input, scheduler) {
    return new Observable((subscriber) => {
        let i = 0;
        return scheduler.schedule(function () {
            if (i === input.length) {
                subscriber.complete();
            }
            else {
                subscriber.next(input[i++]);
                if (!subscriber.closed) {
                    this.schedule();
                }
            }
        });
    });
}
//# sourceMappingURL=scheduleArray.js.mapimport { Observable } from '../Observable';
import { executeSchedule } from '../util/executeSchedule';
export function scheduleAsyncIterable(input, scheduler) {
    if (!input) {
        throw new Error('Iterable cannot be null');
    }
    return new Observable((subscriber) => {
        executeSchedule(subscriber, scheduler, () => {
            const iterator = input[Symbol.asyncIterator]();
            executeSchedule(subscriber, scheduler, () => {
                iterator.next().then((result) => {
                    if (result.done) {
                        subscriber.complete();
                    }
                    else {
                        subscriber.next(result.value);
                    }
                });
            }, 0, true);
        });
    });
}
//# sourceMappingURL=scheduleAsyncIterable.js.mapimport { Observable } from '../Observable';
import { iterator as Symbol_iterator } from '../symbol/iterator';
import { isFunction } from '../util/isFunction';
import { executeSchedule } from '../util/executeSchedule';
export function scheduleIterable(input, scheduler) {
    return new Observable((subscriber) => {
        let iterator;
        executeSchedule(subscriber, scheduler, () => {
            iterator = input[Symbol_iterator]();
            executeSchedule(subscriber, scheduler, () => {
                let value;
                let done;
                try {
                    ({ value, done } = iterator.next());
                }
                catch (err) {
                    subscriber.error(err);
                    return;
                }
                if (done) {
                    subscriber.complete();
                }
                else {
                    subscriber.next(value);
                }
            }, 0, true);
        });
        return () => isFunction(iterator === null || iterator === void 0 ? void 0 : iterator.return) && iterator.return();
    });
}
//# sourceMappingURL=scheduleIterable.js.mapimport { innerFrom } from '../observable/innerFrom';
import { observeOn } from '../operators/observeOn';
import { subscribeOn } from '../operators/subscribeOn';
export function scheduleObservable(input, scheduler) {
    return innerFrom(input).pipe(subscribeOn(scheduler), observeOn(scheduler));
}
//# sourceMappingURL=scheduleObservable.js.mapimport { innerFrom } from '../observable/innerFrom';
import { observeOn } from '../operators/observeOn';
import { subscribeOn } from '../operators/subscribeOn';
export function schedulePromise(input, scheduler) {
    return innerFrom(input).pipe(subscribeOn(scheduler), observeOn(scheduler));
}
//# sourceMappingURL=schedulePromise.js.mapimport { scheduleAsyncIterable } from './scheduleAsyncIterable';
import { readableStreamLikeToAsyncGenerator } from '../util/isReadableStreamLike';
export function scheduleReadableStreamLike(input, scheduler) {
    return scheduleAsyncIterable(readableStreamLikeToAsyncGenerator(input), scheduler);
}
//# sourceMappingURL=scheduleReadableStreamLike.js.mapimport { scheduleObservable } from './scheduleObservable';
import { schedulePromise } from './schedulePromise';
import { scheduleArray } from './scheduleArray';
import { scheduleIterable } from './scheduleIterable';
import { scheduleAsyncIterable } from './scheduleAsyncIterable';
import { isInteropObservable } from '../util/isInteropObservable';
import { isPromise } from '../util/isPromise';
import { isArrayLike } from '../util/isArrayLike';
import { isIterable } from '../util/isIterable';
import { isAsyncIterable } from '../util/isAsyncIterable';
import { createInvalidObservableTypeError } from '../util/throwUnobservableError';
import { isReadableStreamLike } from '../util/isReadableStreamLike';
import { scheduleReadableStreamLike } from './scheduleReadableStreamLike';
export function scheduled(input, scheduler) {
    if (input != null) {
        if (isInteropObservable(input)) {
            return scheduleObservable(input, scheduler);
        }
        if (isArrayLike(input)) {
            return scheduleArray(input, scheduler);
        }
        if (isPromise(input)) {
            return schedulePromise(input, scheduler);
        }
        if (isAsyncIterable(input)) {
            return scheduleAsyncIterable(input, scheduler);
        }
        if (isIterable(input)) {
            return scheduleIterable(input, scheduler);
        }
        if (isReadableStreamLike(input)) {
            return scheduleReadableStreamLike(input, scheduler);
        }
    }
    throw createInvalidObservableTypeError(input);
}
//# sourceMappingURL=scheduled.js.mapimport { Subscriber } from '../Subscriber';
export function createOperatorSubscriber(destination, onNext, onComplete, onError, onFinalize) {
    return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);
}
export class OperatorSubscriber extends Subscriber {
    constructor(destination, onNext, onComplete, onError, onFinalize, shouldUnsubscribe) {
        super(destination);
        this.onFinalize = onFinalize;
        this.shouldUnsubscribe = shouldUnsubscribe;
        this._next = onNext
            ? function (value) {
                try {
                    onNext(value);
                }
                catch (err) {
                    destination.error(err);
                }
            }
            : super._next;
        this._error = onError
            ? function (err) {
                try {
                    onError(err);
                }
                catch (err) {
                    destination.error(err);
                }
                finally {
                    this.unsubscribe();
                }
            }
            : super._error;
        this._complete = onComplete
            ? function () {
                try {
                    onComplete();
                }
                catch (err) {
                    destination.error(err);
                }
                finally {
                    this.unsubscribe();
                }
            }
            : super._complete;
    }
    unsubscribe() {
        var _a;
        if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {
            const { closed } = this;
            super.unsubscribe();
            !closed && ((_a = this.onFinalize) === null || _a === void 0 ? void 0 : _a.call(this));
        }
    }
}
//# sourceMappingURL=OperatorSubscriber.js.mapimport { operate } from '../util/lift';
import { innerFrom } from '../observable/innerFrom';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function audit(durationSelector) {
    return operate((source, subscriber) => {
        let hasValue = false;
        let lastValue = null;
        let durationSubscriber = null;
        let isComplete = false;
        const endDuration = () => {
            durationSubscriber === null || durationSubscriber === void 0 ? void 0 : durationSubscriber.unsubscribe();
            durationSubscriber = null;
            if (hasValue) {
                hasValue = false;
                const value = lastValue;
                lastValue = null;
                subscriber.next(value);
            }
            isComplete && subscriber.complete();
        };
        const cleanupDuration = () => {
            durationSubscriber = null;
            isComplete && subscriber.complete();
        };
        source.subscribe(createOperatorSubscriber(subscriber, (value) => {
            hasValue = true;
            lastValue = value;
            if (!durationSubscriber) {
                innerFrom(durationSelector(value)).subscribe((durationSubscriber = createOperatorSubscriber(subscriber, endDuration, cleanupDuration)));
            }
        }, () => {
            isComplete = true;
            (!hasValue || !durationSubscriber || durationSubscriber.closed) && subscriber.complete();
        }));
    });
}
//# sourceMappingURL=audit.js.mapimport { asyncScheduler } from '../scheduler/async';
import { audit } from './audit';
import { timer } from '../observable/timer';
export function auditTime(duration, scheduler = asyncScheduler) {
    return audit(() => timer(duration, scheduler));
}
//# sourceMappingURL=auditTime.js.mapimport { operate } from '../util/lift';
import { noop } from '../util/noop';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function buffer(closingNotifier) {
    return operate((source, subscriber) => {
        let currentBuffer = [];
        source.subscribe(createOperatorSubscriber(subscriber, (value) => currentBuffer.push(value), () => {
            subscriber.next(currentBuffer);
            subscriber.complete();
        }));
        closingNotifier.subscribe(createOperatorSubscriber(subscriber, () => {
            const b = currentBuffer;
            currentBuffer = [];
            subscriber.next(b);
        }, noop));
        return () => {
            currentBuffer = null;
        };
    });
}
//# sourceMappingURL=buffer.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { arrRemove } from '../util/arrRemove';
export function bufferCount(bufferSize, startBufferEvery = null) {
    startBufferEvery = startBufferEvery !== null && startBufferEvery !== void 0 ? startBufferEvery : bufferSize;
    return operate((source, subscriber) => {
        let buffers = [];
        let count = 0;
        source.subscribe(createOperatorSubscriber(subscriber, (value) => {
            let toEmit = null;
            if (count++ % startBufferEvery === 0) {
                buffers.push([]);
            }
            for (const buffer of buffers) {
                buffer.push(value);
                if (bufferSize <= buffer.length) {
                    toEmit = toEmit !== null && toEmit !== void 0 ? toEmit : [];
                    toEmit.push(buffer);
                }
            }
            if (toEmit) {
                for (const buffer of toEmit) {
                    arrRemove(buffers, buffer);
                    subscriber.next(buffer);
                }
            }
        }, () => {
            for (const buffer of buffers) {
                subscriber.next(buffer);
            }
            subscriber.complete();
        }, undefined, () => {
            buffers = null;
        }));
    });
}
//# sourceMappingURL=bufferCount.js.mapimport { Subscription } from '../Subscription';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { arrRemove } from '../util/arrRemove';
import { asyncScheduler } from '../scheduler/async';
import { popScheduler } from '../util/args';
import { executeSchedule } from '../util/executeSchedule';
export function bufferTime(bufferTimeSpan, ...otherArgs) {
    var _a, _b;
    const scheduler = (_a = popScheduler(otherArgs)) !== null && _a !== void 0 ? _a : asyncScheduler;
    const bufferCreationInterval = (_b = otherArgs[0]) !== null && _b !== void 0 ? _b : null;
    const maxBufferSize = otherArgs[1] || Infinity;
    return operate((source, subscriber) => {
        let bufferRecords = [];
        let restartOnEmit = false;
        const emit = (record) => {
            const { buffer, subs } = record;
            subs.unsubscribe();
            arrRemove(bufferRecords, record);
            subscriber.next(buffer);
            restartOnEmit && startBuffer();
        };
        const startBuffer = () => {
            if (bufferRecords) {
                const subs = new Subscription();
                subscriber.add(subs);
                const buffer = [];
                const record = {
                    buffer,
                    subs,
                };
                bufferRecords.push(record);
                executeSchedule(subs, scheduler, () => emit(record), bufferTimeSpan);
            }
        };
        if (bufferCreationInterval !== null && bufferCreationInterval >= 0) {
            executeSchedule(subscriber, scheduler, startBuffer, bufferCreationInterval, true);
        }
        else {
            restartOnEmit = true;
        }
        startBuffer();
        const bufferTimeSubscriber = createOperatorSubscriber(subscriber, (value) => {
            const recordsCopy = bufferRecords.slice();
            for (const record of recordsCopy) {
                const { buffer } = record;
                buffer.push(value);
                maxBufferSize <= buffer.length && emit(record);
            }
        }, () => {
            while (bufferRecords === null || bufferRecords === void 0 ? void 0 : bufferRecords.length) {
                subscriber.next(bufferRecords.shift().buffer);
            }
            bufferTimeSubscriber === null || bufferTimeSubscriber === void 0 ? void 0 : bufferTimeSubscriber.unsubscribe();
            subscriber.complete();
            subscriber.unsubscribe();
        }, undefined, () => (bufferRecords = null));
        source.subscribe(bufferTimeSubscriber);
    });
}
//# sourceMappingURL=bufferTime.js.mapimport { Subscription } from '../Subscription';
import { operate } from '../util/lift';
import { innerFrom } from '../observable/innerFrom';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { noop } from '../util/noop';
import { arrRemove } from '../util/arrRemove';
export function bufferToggle(openings, closingSelector) {
    return operate((source, subscriber) => {
        const buffers = [];
        innerFrom(openings).subscribe(createOperatorSubscriber(subscriber, (openValue) => {
            const buffer = [];
            buffers.push(buffer);
            const closingSubscription = new Subscription();
            const emitBuffer = () => {
                arrRemove(buffers, buffer);
                subscriber.next(buffer);
                closingSubscription.unsubscribe();
            };
            closingSubscription.add(innerFrom(closingSelector(openValue)).subscribe(createOperatorSubscriber(subscriber, emitBuffer, noop)));
        }, noop));
        source.subscribe(createOperatorSubscriber(subscriber, (value) => {
            for (const buffer of buffers) {
                buffer.push(value);
            }
        }, () => {
            while (buffers.length > 0) {
                subscriber.next(buffers.shift());
            }
            subscriber.complete();
        }));
    });
}
//# sourceMappingURL=bufferToggle.js.mapimport { operate } from '../util/lift';
import { noop } from '../util/noop';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';
export function bufferWhen(closingSelector) {
    return operate((source, subscriber) => {
        let buffer = null;
        let closingSubscriber = null;
        const openBuffer = () => {
            closingSubscriber === null || closingSubscriber === void 0 ? void 0 : closingSubscriber.unsubscribe();
            const b = buffer;
            buffer = [];
            b && subscriber.next(b);
            innerFrom(closingSelector()).subscribe((closingSubscriber = createOperatorSubscriber(subscriber, openBuffer, noop)));
        };
        openBuffer();
        source.subscribe(createOperatorSubscriber(subscriber, (value) => buffer === null || buffer === void 0 ? void 0 : buffer.push(value), () => {
            buffer && subscriber.next(buffer);
            subscriber.complete();
        }, undefined, () => (buffer = closingSubscriber = null)));
    });
}
//# sourceMappingURL=bufferWhen.js.mapimport { innerFrom } from '../observable/innerFrom';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { operate } from '../util/lift';
export function catchError(selector) {
    return operate((source, subscriber) => {
        let innerSub = null;
        let syncUnsub = false;
        let handledResult;
        innerSub = source.subscribe(createOperatorSubscriber(subscriber, undefined, undefined, (err) => {
            handledResult = innerFrom(selector(err, catchError(selector)(source)));
            if (innerSub) {
                innerSub.unsubscribe();
                innerSub = null;
                handledResult.subscribe(subscriber);
            }
            else {
                syncUnsub = true;
            }
        }));
        if (syncUnsub) {
            innerSub.unsubscribe();
            innerSub = null;
            handledResult.subscribe(subscriber);
        }
    });
}
//# sourceMappingURL=catchError.js.mapimport { combineLatestAll } from './combineLatestAll';
export const combineAll = combineLatestAll;
//# sourceMappingURL=combineAll.js.mapimport { combineLatestInit } from '../observable/combineLatest';
import { operate } from '../util/lift';
import { argsOrArgArray } from '../util/argsOrArgArray';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';
import { pipe } from '../util/pipe';
import { popResultSelector } from '../util/args';
export function combineLatest(...args) {
    const resultSelector = popResultSelector(args);
    return resultSelector
        ? pipe(combineLatest(...args), mapOneOrManyArgs(resultSelector))
        : operate((source, subscriber) => {
            combineLatestInit([source, ...argsOrArgArray(args)])(subscriber);
        });
}
//# sourceMappingURL=combineLatest.js.mapimport { combineLatest } from '../observable/combineLatest';
import { joinAllInternals } from './joinAllInternals';
export function combineLatestAll(project) {
    return joinAllInternals(combineLatest, project);
}
//# sourceMappingURL=combineLatestAll.js.mapimport { combineLatest } from './combineLatest';
export function combineLatestWith(...otherSources) {
    return combineLatest(...otherSources);
}
//# sourceMappingURL=combineLatestWith.js.mapimport { operate } from '../util/lift';
import { concatAll } from './concatAll';
import { popScheduler } from '../util/args';
import { from } from '../observable/from';
export function concat(...args) {
    const scheduler = popScheduler(args);
    return operate((source, subscriber) => {
        concatAll()(from([source, ...args], scheduler)).subscribe(subscriber);
    });
}
//# sourceMappingURL=concat.js.mapimport { mergeAll } from './mergeAll';
export function concatAll() {
    return mergeAll(1);
}
//# sourceMappingURL=concatAll.js.mapimport { mergeMap } from './mergeMap';
import { isFunction } from '../util/isFunction';
export function concatMap(project, resultSelector) {
    return isFunction(resultSelector) ? mergeMap(project, resultSelector, 1) : mergeMap(project, 1);
}
//# sourceMappingURL=concatMap.js.mapimport { concatMap } from './concatMap';
import { isFunction } from '../util/isFunction';
export function concatMapTo(innerObservable, resultSelector) {
    return isFunction(resultSelector) ? concatMap(() => innerObservable, resultSelector) : concatMap(() => innerObservable);
}
//# sourceMappingURL=concatMapTo.js.mapimport { concat } from './concat';
export function concatWith(...otherSources) {
    return concat(...otherSources);
}
//# sourceMappingURL=concatWith.js.mapimport { Subject } from '../Subject';
import { innerFrom } from '../observable/innerFrom';
import { operate } from '../util/lift';
import { fromSubscribable } from '../observable/fromSubscribable';
const DEFAULT_CONFIG = {
    connector: () => new Subject(),
};
export function connect(selector, config = DEFAULT_CONFIG) {
    const { connector } = config;
    return operate((source, subscriber) => {
        const subject = connector();
        innerFrom(selector(fromSubscribable(subject))).subscribe(subscriber);
        subscriber.add(source.subscribe(subject));
    });
}
//# sourceMappingURL=connect.js.mapimport { reduce } from './reduce';
export function count(predicate) {
    return reduce((total, value, i) => (!predicate || predicate(value, i) ? total + 1 : total), 0);
}
//# sourceMappingURL=count.js.mapimport { operate } from '../util/lift';
import { noop } from '../util/noop';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';
export function debounce(durationSelector) {
    return operate((source, subscriber) => {
        let hasValue = false;
        let lastValue = null;
        let durationSubscriber = null;
        const emit = () => {
            durationSubscriber === null || durationSubscriber === void 0 ? void 0 : durationSubscriber.unsubscribe();
            durationSubscriber = null;
            if (hasValue) {
                hasValue = false;
                const value = lastValue;
                lastValue = null;
                subscriber.next(value);
            }
        };
        source.subscribe(createOperatorSubscriber(subscriber, (value) => {
            durationSubscriber === null || durationSubscriber === void 0 ? void 0 : durationSubscriber.unsubscribe();
            hasValue = true;
            lastValue = value;
            durationSubscriber = createOperatorSubscriber(subscriber, emit, noop);
            innerFrom(durationSelector(value)).subscribe(durationSubscriber);
        }, () => {
            emit();
            subscriber.complete();
        }, undefined, () => {
            lastValue = durationSubscriber = null;
        }));
    });
}
//# sourceMappingURL=debounce.js.mapimport { asyncScheduler } from '../scheduler/async';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function debounceTime(dueTime, scheduler = asyncScheduler) {
    return operate((source, subscriber) => {
        let activeTask = null;
        let lastValue = null;
        let lastTime = null;
        const emit = () => {
            if (activeTask) {
                activeTask.unsubscribe();
                activeTask = null;
                const value = lastValue;
                lastValue = null;
                subscriber.next(value);
            }
        };
        function emitWhenIdle() {
            const targetTime = lastTime + dueTime;
            const now = scheduler.now();
            if (now < targetTime) {
                activeTask = this.schedule(undefined, targetTime - now);
                subscriber.add(activeTask);
                return;
            }
            emit();
        }
        source.subscribe(createOperatorSubscriber(subscriber, (value) => {
            lastValue = value;
            lastTime = scheduler.now();
            if (!activeTask) {
                activeTask = scheduler.schedule(emitWhenIdle, dueTime);
                subscriber.add(activeTask);
            }
        }, () => {
            emit();
            subscriber.complete();
        }, undefined, () => {
            lastValue = activeTask = null;
        }));
    });
}
//# sourceMappingURL=debounceTime.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function defaultIfEmpty(defaultValue) {
    return operate((source, subscriber) => {
        let hasValue = false;
        source.subscribe(createOperatorSubscriber(subscriber, (value) => {
            hasValue = true;
            subscriber.next(value);
        }, () => {
            if (!hasValue) {
                subscriber.next(defaultValue);
            }
            subscriber.complete();
        }));
    });
}
//# sourceMappingURL=defaultIfEmpty.js.mapimport { asyncScheduler } from '../scheduler/async';
import { delayWhen } from './delayWhen';
import { timer } from '../observable/timer';
export function delay(due, scheduler = asyncScheduler) {
    const duration = timer(due, scheduler);
    return delayWhen(() => duration);
}
//# sourceMappingURL=delay.js.mapimport { concat } from '../observable/concat';
import { take } from './take';
import { ignoreElements } from './ignoreElements';
import { mapTo } from './mapTo';
import { mergeMap } from './mergeMap';
export function delayWhen(delayDurationSelector, subscriptionDelay) {
    if (subscriptionDelay) {
        return (source) => concat(subscriptionDelay.pipe(take(1), ignoreElements()), source.pipe(delayWhen(delayDurationSelector)));
    }
    return mergeMap((value, index) => delayDurationSelector(value, index).pipe(take(1), mapTo(value)));
}
//# sourceMappingURL=delayWhen.js.mapimport { observeNotification } from '../Notification';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function dematerialize() {
    return operate((source, subscriber) => {
        source.subscribe(createOperatorSubscriber(subscriber, (notification) => observeNotification(notification, subscriber)));
    });
}
//# sourceMappingURL=dematerialize.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { noop } from '../util/noop';
export function distinct(keySelector, flushes) {
    return operate((source, subscriber) => {
        const distinctKeys = new Set();
        source.subscribe(createOperatorSubscriber(subscriber, (value) => {
            const key = keySelector ? keySelector(value) : value;
            if (!distinctKeys.has(key)) {
                distinctKeys.add(key);
                subscriber.next(value);
            }
        }));
        flushes === null || flushes === void 0 ? void 0 : flushes.subscribe(createOperatorSubscriber(subscriber, () => distinctKeys.clear(), noop));
    });
}
//# sourceMappingURL=distinct.js.mapimport { identity } from '../util/identity';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function distinctUntilChanged(comparator, keySelector = identity) {
    comparator = comparator !== null && comparator !== void 0 ? comparator : defaultCompare;
    return operate((source, subscriber) => {
        let previousKey;
        let first = true;
        source.subscribe(createOperatorSubscriber(subscriber, (value) => {
            const currentKey = keySelector(value);
            if (first || !comparator(previousKey, currentKey)) {
                first = false;
                previousKey = currentKey;
                subscriber.next(value);
            }
        }));
    });
}
function defaultCompare(a, b) {
    return a === b;
}
//# sourceMappingURL=distinctUntilChanged.js.mapimport { distinctUntilChanged } from './distinctUntilChanged';
export function distinctUntilKeyChanged(key, compare) {
    return distinctUntilChanged((x, y) => compare ? compare(x[key], y[key]) : x[key] === y[key]);
}
//# sourceMappingURL=distinctUntilKeyChanged.js.mapimport { ArgumentOutOfRangeError } from '../util/ArgumentOutOfRangeError';
import { filter } from './filter';
import { throwIfEmpty } from './throwIfEmpty';
import { defaultIfEmpty } from './defaultIfEmpty';
import { take } from './take';
export function elementAt(index, defaultValue) {
    if (index < 0) {
        throw new ArgumentOutOfRangeError();
    }
    const hasDefaultValue = arguments.length >= 2;
    return (source) => source.pipe(filter((v, i) => i === index), take(1), hasDefaultValue ? defaultIfEmpty(defaultValue) : throwIfEmpty(() => new ArgumentOutOfRangeError()));
}
//# sourceMappingURL=elementAt.js.mapimport { concat } from '../observable/concat';
import { of } from '../observable/of';
export function endWith(...values) {
    return (source) => concat(source, of(...values));
}
//# sourceMappingURL=endWith.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function every(predicate, thisArg) {
    return operate((source, subscriber) => {
        let index = 0;
        source.subscribe(createOperatorSubscriber(subscriber, (value) => {
            if (!predicate.call(thisArg, value, index++, source)) {
                subscriber.next(false);
                subscriber.complete();
            }
        }, () => {
            subscriber.next(true);
            subscriber.complete();
        }));
    });
}
//# sourceMappingURL=every.js.mapimport { exhaustAll } from './exhaustAll';
export const exhaust = exhaustAll;
//# sourceMappingURL=exhaust.js.mapimport { exhaustMap } from './exhaustMap';
import { identity } from '../util/identity';
export function exhaustAll() {
    return exhaustMap(identity);
}
//# sourceMappingURL=exhaustAll.js.mapimport { map } from './map';
import { innerFrom } from '../observable/innerFrom';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function exhaustMap(project, resultSelector) {
    if (resultSelector) {
        return (source) => source.pipe(exhaustMap((a, i) => innerFrom(project(a, i)).pipe(map((b, ii) => resultSelector(a, b, i, ii)))));
    }
    return operate((source, subscriber) => {
        let index = 0;
        let innerSub = null;
        let isComplete = false;
        source.subscribe(createOperatorSubscriber(subscriber, (outerValue) => {
            if (!innerSub) {
                innerSub = createOperatorSubscriber(subscriber, undefined, () => {
                    innerSub = null;
                    isComplete && subscriber.complete();
                });
                innerFrom(project(outerValue, index++)).subscribe(innerSub);
            }
        }, () => {
            isComplete = true;
            !innerSub && subscriber.complete();
        }));
    });
}
//# sourceMappingURL=exhaustMap.js.mapimport { operate } from '../util/lift';
import { mergeInternals } from './mergeInternals';
export function expand(project, concurrent = Infinity, scheduler) {
    concurrent = (concurrent || 0) < 1 ? Infinity : concurrent;
    return operate((source, subscriber) => mergeInternals(source, subscriber, project, concurrent, undefined, true, scheduler));
}
//# sourceMappingURL=expand.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function filter(predicate, thisArg) {
    return operate((source, subscriber) => {
        let index = 0;
        source.subscribe(createOperatorSubscriber(subscriber, (value) => predicate.call(thisArg, value, index++) && subscriber.next(value)));
    });
}
//# sourceMappingURL=filter.js.mapimport { operate } from '../util/lift';
export function finalize(callback) {
    return operate((source, subscriber) => {
        try {
            source.subscribe(subscriber);
        }
        finally {
            subscriber.add(callback);
        }
    });
}
//# sourceMappingURL=finalize.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function find(predicate, thisArg) {
    return operate(createFind(predicate, thisArg, 'value'));
}
export function createFind(predicate, thisArg, emit) {
    const findIndex = emit === 'index';
    return (source, subscriber) => {
        let index = 0;
        source.subscribe(createOperatorSubscriber(subscriber, (value) => {
            const i = index++;
            if (predicate.call(thisArg, value, i, source)) {
                subscriber.next(findIndex ? i : value);
                subscriber.complete();
            }
        }, () => {
            subscriber.next(findIndex ? -1 : undefined);
            subscriber.complete();
        }));
    };
}
//# sourceMappingURL=find.js.mapimport { operate } from '../util/lift';
import { createFind } from './find';
export function findIndex(predicate, thisArg) {
    return operate(createFind(predicate, thisArg, 'index'));
}
//# sourceMappingURL=findIndex.js.mapimport { EmptyError } from '../util/EmptyError';
import { filter } from './filter';
import { take } from './take';
import { defaultIfEmpty } from './defaultIfEmpty';
import { throwIfEmpty } from './throwIfEmpty';
import { identity } from '../util/identity';
export function first(predicate, defaultValue) {
    const hasDefaultValue = arguments.length >= 2;
    return (source) => source.pipe(predicate ? filter((v, i) => predicate(v, i, source)) : identity, take(1), hasDefaultValue ? defaultIfEmpty(defaultValue) : throwIfEmpty(() => new EmptyError()));
}
//# sourceMappingURL=first.js.mapimport { mergeMap } from './mergeMap';
export const flatMap = mergeMap;
//# sourceMappingURL=flatMap.js.mapimport { Observable } from '../Observable';
import { innerFrom } from '../observable/innerFrom';
import { Subject } from '../Subject';
import { operate } from '../util/lift';
import { createOperatorSubscriber, OperatorSubscriber } from './OperatorSubscriber';
export function groupBy(keySelector, elementOrOptions, duration, connector) {
    return operate((source, subscriber) => {
        let element;
        if (!elementOrOptions || typeof elementOrOptions === 'function') {
            element = elementOrOptions;
        }
        else {
            ({ duration, element, connector } = elementOrOptions);
        }
        const groups = new Map();
        const notify = (cb) => {
            groups.forEach(cb);
            cb(subscriber);
        };
        const handleError = (err) => notify((consumer) => consumer.error(err));
        let activeGroups = 0;
        let teardownAttempted = false;
        const groupBySourceSubscriber = new OperatorSubscriber(subscriber, (value) => {
            try {
                const key = keySelector(value);
                let group = groups.get(key);
                if (!group) {
                    groups.set(key, (group = connector ? connector() : new Subject()));
                    const grouped = createGroupedObservable(key, group);
                    subscriber.next(grouped);
                    if (duration) {
                        const durationSubscriber = createOperatorSubscriber(group, () => {
                            group.complete();
                            durationSubscriber === null || durationSubscriber === void 0 ? void 0 : durationSubscriber.unsubscribe();
                        }, undefined, undefined, () => groups.delete(key));
                        groupBySourceSubscriber.add(innerFrom(duration(grouped)).subscribe(durationSubscriber));
                    }
                }
                group.next(element ? element(value) : value);
            }
            catch (err) {
                handleError(err);
            }
        }, () => notify((consumer) => consumer.complete()), handleError, () => groups.clear(), () => {
            teardownAttempted = true;
            return activeGroups === 0;
        });
        source.subscribe(groupBySourceSubscriber);
        function createGroupedObservable(key, groupSubject) {
            const result = new Observable((groupSubscriber) => {
                activeGroups++;
                const innerSub = groupSubject.subscribe(groupSubscriber);
                return () => {
                    innerSub.unsubscribe();
                    --activeGroups === 0 && teardownAttempted && groupBySourceSubscriber.unsubscribe();
                };
            });
            result.key = key;
            return result;
        }
    });
}
//# sourceMappingURL=groupBy.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { noop } from '../util/noop';
export function ignoreElements() {
    return operate((source, subscriber) => {
        source.subscribe(createOperatorSubscriber(subscriber, noop));
    });
}
//# sourceMappingURL=ignoreElements.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function isEmpty() {
    return operate((source, subscriber) => {
        source.subscribe(createOperatorSubscriber(subscriber, () => {
            subscriber.next(false);
            subscriber.complete();
        }, () => {
            subscriber.next(true);
            subscriber.complete();
        }));
    });
}
//# sourceMappingURL=isEmpty.js.mapimport { identity } from '../util/identity';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';
import { pipe } from '../util/pipe';
import { mergeMap } from './mergeMap';
import { toArray } from './toArray';
export function joinAllInternals(joinFn, project) {
    return pipe(toArray(), mergeMap((sources) => joinFn(sources)), project ? mapOneOrManyArgs(project) : identity);
}
//# sourceMappingURL=joinAllInternals.js.mapimport { EmptyError } from '../util/EmptyError';
import { filter } from './filter';
import { takeLast } from './takeLast';
import { throwIfEmpty } from './throwIfEmpty';
import { defaultIfEmpty } from './defaultIfEmpty';
import { identity } from '../util/identity';
export function last(predicate, defaultValue) {
    const hasDefaultValue = arguments.length >= 2;
    return (source) => source.pipe(predicate ? filter((v, i) => predicate(v, i, source)) : identity, takeLast(1), hasDefaultValue ? defaultIfEmpty(defaultValue) : throwIfEmpty(() => new EmptyError()));
}
//# sourceMappingURL=last.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function map(project, thisArg) {
    return operate((source, subscriber) => {
        let index = 0;
        source.subscribe(createOperatorSubscriber(subscriber, (value) => {
            subscriber.next(project.call(thisArg, value, index++));
        }));
    });
}
//# sourceMappingURL=map.js.mapimport { map } from './map';
export function mapTo(value) {
    return map(() => value);
}
//# sourceMappingURL=mapTo.js.mapimport { Notification } from '../Notification';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function materialize() {
    return operate((source, subscriber) => {
        source.subscribe(createOperatorSubscriber(subscriber, (value) => {
            subscriber.next(Notification.createNext(value));
        }, () => {
            subscriber.next(Notification.createComplete());
            subscriber.complete();
        }, (err) => {
            subscriber.next(Notification.createError(err));
            subscriber.complete();
        }));
    });
}
//# sourceMappingURL=materialize.js.mapimport { reduce } from './reduce';
import { isFunction } from '../util/isFunction';
export function max(comparer) {
    return reduce(isFunction(comparer) ? (x, y) => (comparer(x, y) > 0 ? x : y) : (x, y) => (x > y ? x : y));
}
//# sourceMappingURL=max.js.mapimport { operate } from '../util/lift';
import { argsOrArgArray } from '../util/argsOrArgArray';
import { mergeAll } from './mergeAll';
import { popNumber, popScheduler } from '../util/args';
import { from } from '../observable/from';
export function merge(...args) {
    const scheduler = popScheduler(args);
    const concurrent = popNumber(args, Infinity);
    args = argsOrArgArray(args);
    return operate((source, subscriber) => {
        mergeAll(concurrent)(from([source, ...args], scheduler)).subscribe(subscriber);
    });
}
//# sourceMappingURL=merge.js.mapimport { mergeMap } from './mergeMap';
import { identity } from '../util/identity';
export function mergeAll(concurrent = Infinity) {
    return mergeMap(identity, concurrent);
}
//# sourceMappingURL=mergeAll.js.mapimport { innerFrom } from '../observable/innerFrom';
import { executeSchedule } from '../util/executeSchedule';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function mergeInternals(source, subscriber, project, concurrent, onBeforeNext, expand, innerSubScheduler, additionalFinalizer) {
    const buffer = [];
    let active = 0;
    let index = 0;
    let isComplete = false;
    const checkComplete = () => {
        if (isComplete && !buffer.length && !active) {
            subscriber.complete();
        }
    };
    const outerNext = (value) => (active < concurrent ? doInnerSub(value) : buffer.push(value));
    const doInnerSub = (value) => {
        expand && subscriber.next(value);
        active++;
        let innerComplete = false;
        innerFrom(project(value, index++)).subscribe(createOperatorSubscriber(subscriber, (innerValue) => {
            onBeforeNext === null || onBeforeNext === void 0 ? void 0 : onBeforeNext(innerValue);
            if (expand) {
                outerNext(innerValue);
            }
            else {
                subscriber.next(innerValue);
            }
        }, () => {
            innerComplete = true;
        }, undefined, () => {
            if (innerComplete) {
                try {
                    active--;
                    while (buffer.length && active < concurrent) {
                        const bufferedValue = buffer.shift();
                        if (innerSubScheduler) {
                            executeSchedule(subscriber, innerSubScheduler, () => doInnerSub(bufferedValue));
                        }
                        else {
                            doInnerSub(bufferedValue);
                        }
                    }
                    checkComplete();
                }
                catch (err) {
                    subscriber.error(err);
                }
            }
        }));
    };
    source.subscribe(createOperatorSubscriber(subscriber, outerNext, () => {
        isComplete = true;
        checkComplete();
    }));
    return () => {
        additionalFinalizer === null || additionalFinalizer === void 0 ? void 0 : additionalFinalizer();
    };
}
//# sourceMappingURL=mergeInternals.js.mapimport { map } from './map';
import { innerFrom } from '../observable/innerFrom';
import { operate } from '../util/lift';
import { mergeInternals } from './mergeInternals';
import { isFunction } from '../util/isFunction';
export function mergeMap(project, resultSelector, concurrent = Infinity) {
    if (isFunction(resultSelector)) {
        return mergeMap((a, i) => map((b, ii) => resultSelector(a, b, i, ii))(innerFrom(project(a, i))), concurrent);
    }
    else if (typeof resultSelector === 'number') {
        concurrent = resultSelector;
    }
    return operate((source, subscriber) => mergeInternals(source, subscriber, project, concurrent));
}
//# sourceMappingURL=mergeMap.js.mapimport { mergeMap } from './mergeMap';
import { isFunction } from '../util/isFunction';
export function mergeMapTo(innerObservable, resultSelector, concurrent = Infinity) {
    if (isFunction(resultSelector)) {
        return mergeMap(() => innerObservable, resultSelector, concurrent);
    }
    if (typeof resultSelector === 'number') {
        concurrent = resultSelector;
    }
    return mergeMap(() => innerObservable, concurrent);
}
//# sourceMappingURL=mergeMapTo.js.mapimport { operate } from '../util/lift';
import { mergeInternals } from './mergeInternals';
export function mergeScan(accumulator, seed, concurrent = Infinity) {
    return operate((source, subscriber) => {
        let state = seed;
        return mergeInternals(source, subscriber, (value, index) => accumulator(state, value, index), concurrent, (value) => {
            state = value;
        }, false, undefined, () => (state = null));
    });
}
//# sourceMappingURL=mergeScan.js.mapimport { merge } from './merge';
export function mergeWith(...otherSources) {
    return merge(...otherSources);
}
//# sourceMappingURL=mergeWith.js.mapimport { reduce } from './reduce';
import { isFunction } from '../util/isFunction';
export function min(comparer) {
    return reduce(isFunction(comparer) ? (x, y) => (comparer(x, y) < 0 ? x : y) : (x, y) => (x < y ? x : y));
}
//# sourceMappingURL=min.js.mapimport { ConnectableObservable } from '../observable/ConnectableObservable';
import { isFunction } from '../util/isFunction';
import { connect } from './connect';
export function multicast(subjectOrSubjectFactory, selector) {
    const subjectFactory = isFunction(subjectOrSubjectFactory) ? subjectOrSubjectFactory : () => subjectOrSubjectFactory;
    if (isFunction(selector)) {
        return connect(selector, {
            connector: subjectFactory,
        });
    }
    return (source) => new ConnectableObservable(source, subjectFactory);
}
//# sourceMappingURL=multicast.js.mapimport { executeSchedule } from '../util/executeSchedule';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function observeOn(scheduler, delay = 0) {
    return operate((source, subscriber) => {
        source.subscribe(createOperatorSubscriber(subscriber, (value) => executeSchedule(subscriber, scheduler, () => subscriber.next(value), delay), () => executeSchedule(subscriber, scheduler, () => subscriber.complete(), delay), (err) => executeSchedule(subscriber, scheduler, () => subscriber.error(err), delay)));
    });
}
//# sourceMappingURL=observeOn.js.mapimport { operate } from '../util/lift';
import { innerFrom } from '../observable/innerFrom';
import { argsOrArgArray } from '../util/argsOrArgArray';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { noop } from '../util/noop';
export function onErrorResumeNext(...sources) {
    const nextSources = argsOrArgArray(sources);
    return operate((source, subscriber) => {
        const remaining = [source, ...nextSources];
        const subscribeNext = () => {
            if (!subscriber.closed) {
                if (remaining.length > 0) {
                    let nextSource;
                    try {
                        nextSource = innerFrom(remaining.shift());
                    }
                    catch (err) {
                        subscribeNext();
                        return;
                    }
                    const innerSub = createOperatorSubscriber(subscriber, undefined, noop, noop);
                    nextSource.subscribe(innerSub);
                    innerSub.add(subscribeNext);
                }
                else {
                    subscriber.complete();
                }
            }
        };
        subscribeNext();
    });
}
//# sourceMappingURL=onErrorResumeNext.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function pairwise() {
    return operate((source, subscriber) => {
        let prev;
        let hasPrev = false;
        source.subscribe(createOperatorSubscriber(subscriber, (value) => {
            const p = prev;
            prev = value;
            hasPrev && subscriber.next([p, value]);
            hasPrev = true;
        }));
    });
}
//# sourceMappingURL=pairwise.js.mapimport { not } from '../util/not';
import { filter } from './filter';
export function partition(predicate, thisArg) {
    return (source) => [filter(predicate, thisArg)(source), filter(not(predicate, thisArg))(source)];
}
//# sourceMappingURL=partition.js.mapimport { map } from './map';
export function pluck(...properties) {
    const length = properties.length;
    if (length === 0) {
        throw new Error('list of properties cannot be empty.');
    }
    return map((x) => {
        let currentProp = x;
        for (let i = 0; i < length; i++) {
            const p = currentProp === null || currentProp === void 0 ? void 0 : currentProp[properties[i]];
            if (typeof p !== 'undefined') {
                currentProp = p;
            }
            else {
                return undefined;
            }
        }
        return currentProp;
    });
}
//# sourceMappingURL=pluck.js.mapimport { Subject } from '../Subject';
import { multicast } from './multicast';
import { connect } from './connect';
export function publish(selector) {
    return selector ? (source) => connect(selector)(source) : (source) => multicast(new Subject())(source);
}
//# sourceMappingURL=publish.js.mapimport { BehaviorSubject } from '../BehaviorSubject';
import { ConnectableObservable } from '../observable/ConnectableObservable';
export function publishBehavior(initialValue) {
    return (source) => {
        const subject = new BehaviorSubject(initialValue);
        return new ConnectableObservable(source, () => subject);
    };
}
//# sourceMappingURL=publishBehavior.js.mapimport { AsyncSubject } from '../AsyncSubject';
import { ConnectableObservable } from '../observable/ConnectableObservable';
export function publishLast() {
    return (source) => {
        const subject = new AsyncSubject();
        return new ConnectableObservable(source, () => subject);
    };
}
//# sourceMappingURL=publishLast.js.mapimport { ReplaySubject } from '../ReplaySubject';
import { multicast } from './multicast';
import { isFunction } from '../util/isFunction';
export function publishReplay(bufferSize, windowTime, selectorOrScheduler, timestampProvider) {
    if (selectorOrScheduler && !isFunction(selectorOrScheduler)) {
        timestampProvider = selectorOrScheduler;
    }
    const selector = isFunction(selectorOrScheduler) ? selectorOrScheduler : undefined;
    return (source) => multicast(new ReplaySubject(bufferSize, windowTime, timestampProvider), selector)(source);
}
//# sourceMappingURL=publishReplay.js.mapimport { argsOrArgArray } from '../util/argsOrArgArray';
import { raceWith } from './raceWith';
export function race(...args) {
    return raceWith(...argsOrArgArray(args));
}
//# sourceMappingURL=race.js.mapimport { raceInit } from '../observable/race';
import { operate } from '../util/lift';
import { identity } from '../util/identity';
export function raceWith(...otherSources) {
    return !otherSources.length
        ? identity
        : operate((source, subscriber) => {
            raceInit([source, ...otherSources])(subscriber);
        });
}
//# sourceMappingURL=raceWith.js.mapimport { scanInternals } from './scanInternals';
import { operate } from '../util/lift';
export function reduce(accumulator, seed) {
    return operate(scanInternals(accumulator, seed, arguments.length >= 2, false, true));
}
//# sourceMappingURL=reduce.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function refCount() {
    return operate((source, subscriber) => {
        let connection = null;
        source._refCount++;
        const refCounter = createOperatorSubscriber(subscriber, undefined, undefined, undefined, () => {
            if (!source || source._refCount <= 0 || 0 < --source._refCount) {
                connection = null;
                return;
            }
            const sharedConnection = source._connection;
            const conn = connection;
            connection = null;
            if (sharedConnection && (!conn || sharedConnection === conn)) {
                sharedConnection.unsubscribe();
            }
            subscriber.unsubscribe();
        });
        source.subscribe(refCounter);
        if (!refCounter.closed) {
            connection = source.connect();
        }
    });
}
//# sourceMappingURL=refCount.js.mapimport { EMPTY } from '../observable/empty';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';
import { timer } from '../observable/timer';
export function repeat(countOrConfig) {
    let count = Infinity;
    let delay;
    if (countOrConfig != null) {
        if (typeof countOrConfig === 'object') {
            ({ count = Infinity, delay } = countOrConfig);
        }
        else {
            count = countOrConfig;
        }
    }
    return count <= 0
        ? () => EMPTY
        : operate((source, subscriber) => {
            let soFar = 0;
            let sourceSub;
            const resubscribe = () => {
                sourceSub === null || sourceSub === void 0 ? void 0 : sourceSub.unsubscribe();
                sourceSub = null;
                if (delay != null) {
                    const notifier = typeof delay === 'number' ? timer(delay) : innerFrom(delay(soFar));
                    const notifierSubscriber = createOperatorSubscriber(subscriber, () => {
                        notifierSubscriber.unsubscribe();
                        subscribeToSource();
                    });
                    notifier.subscribe(notifierSubscriber);
                }
                else {
                    subscribeToSource();
                }
            };
            const subscribeToSource = () => {
                let syncUnsub = false;
                sourceSub = source.subscribe(createOperatorSubscriber(subscriber, undefined, () => {
                    if (++soFar < count) {
                        if (sourceSub) {
                            resubscribe();
                        }
                        else {
                            syncUnsub = true;
                        }
                    }
                    else {
                        subscriber.complete();
                    }
                }));
                if (syncUnsub) {
                    resubscribe();
                }
            };
            subscribeToSource();
        });
}
//# sourceMappingURL=repeat.js.mapimport { Subject } from '../Subject';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function repeatWhen(notifier) {
    return operate((source, subscriber) => {
        let innerSub;
        let syncResub = false;
        let completions$;
        let isNotifierComplete = false;
        let isMainComplete = false;
        const checkComplete = () => isMainComplete && isNotifierComplete && (subscriber.complete(), true);
        const getCompletionSubject = () => {
            if (!completions$) {
                completions$ = new Subject();
                notifier(completions$).subscribe(createOperatorSubscriber(subscriber, () => {
                    if (innerSub) {
                        subscribeForRepeatWhen();
                    }
                    else {
                        syncResub = true;
                    }
                }, () => {
                    isNotifierComplete = true;
                    checkComplete();
                }));
            }
            return completions$;
        };
        const subscribeForRepeatWhen = () => {
            isMainComplete = false;
            innerSub = source.subscribe(createOperatorSubscriber(subscriber, undefined, () => {
                isMainComplete = true;
                !checkComplete() && getCompletionSubject().next();
            }));
            if (syncResub) {
                innerSub.unsubscribe();
                innerSub = null;
                syncResub = false;
                subscribeForRepeatWhen();
            }
        };
        subscribeForRepeatWhen();
    });
}
//# sourceMappingURL=repeatWhen.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { identity } from '../util/identity';
import { timer } from '../observable/timer';
import { innerFrom } from '../observable/innerFrom';
export function retry(configOrCount = Infinity) {
    let config;
    if (configOrCount && typeof configOrCount === 'object') {
        config = configOrCount;
    }
    else {
        config = {
            count: configOrCount,
        };
    }
    const { count = Infinity, delay, resetOnSuccess: resetOnSuccess = false } = config;
    return count <= 0
        ? identity
        : operate((source, subscriber) => {
            let soFar = 0;
            let innerSub;
            const subscribeForRetry = () => {
                let syncUnsub = false;
                innerSub = source.subscribe(createOperatorSubscriber(subscriber, (value) => {
                    if (resetOnSuccess) {
                        soFar = 0;
                    }
                    subscriber.next(value);
                }, undefined, (err) => {
                    if (soFar++ < count) {
                        const resub = () => {
                            if (innerSub) {
                                innerSub.unsubscribe();
                                innerSub = null;
                                subscribeForRetry();
                            }
                            else {
                                syncUnsub = true;
                            }
                        };
                        if (delay != null) {
                            const notifier = typeof delay === 'number' ? timer(delay) : innerFrom(delay(err, soFar));
                            const notifierSubscriber = createOperatorSubscriber(subscriber, () => {
                                notifierSubscriber.unsubscribe();
                                resub();
                            }, () => {
                                subscriber.complete();
                            });
                            notifier.subscribe(notifierSubscriber);
                        }
                        else {
                            resub();
                        }
                    }
                    else {
                        subscriber.error(err);
                    }
                }));
                if (syncUnsub) {
                    innerSub.unsubscribe();
                    innerSub = null;
                    subscribeForRetry();
                }
            };
            subscribeForRetry();
        });
}
//# sourceMappingURL=retry.js.mapimport { Subject } from '../Subject';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function retryWhen(notifier) {
    return operate((source, subscriber) => {
        let innerSub;
        let syncResub = false;
        let errors$;
        const subscribeForRetryWhen = () => {
            innerSub = source.subscribe(createOperatorSubscriber(subscriber, undefined, undefined, (err) => {
                if (!errors$) {
                    errors$ = new Subject();
                    notifier(errors$).subscribe(createOperatorSubscriber(subscriber, () => innerSub ? subscribeForRetryWhen() : (syncResub = true)));
                }
                if (errors$) {
                    errors$.next(err);
                }
            }));
            if (syncResub) {
                innerSub.unsubscribe();
                innerSub = null;
                syncResub = false;
                subscribeForRetryWhen();
            }
        };
        subscribeForRetryWhen();
    });
}
//# sourceMappingURL=retryWhen.js.mapimport { operate } from '../util/lift';
import { noop } from '../util/noop';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function sample(notifier) {
    return operate((source, subscriber) => {
        let hasValue = false;
        let lastValue = null;
        source.subscribe(createOperatorSubscriber(subscriber, (value) => {
            hasValue = true;
            lastValue = value;
        }));
        notifier.subscribe(createOperatorSubscriber(subscriber, () => {
            if (hasValue) {
                hasValue = false;
                const value = lastValue;
                lastValue = null;
                subscriber.next(value);
            }
        }, noop));
    });
}
//# sourceMappingURL=sample.js.mapimport { asyncScheduler } from '../scheduler/async';
import { sample } from './sample';
import { interval } from '../observable/interval';
export function sampleTime(period, scheduler = asyncScheduler) {
    return sample(interval(period, scheduler));
}
//# sourceMappingURL=sampleTime.js.mapimport { operate } from '../util/lift';
import { scanInternals } from './scanInternals';
export function scan(accumulator, seed) {
    return operate(scanInternals(accumulator, seed, arguments.length >= 2, true));
}
//# sourceMappingURL=scan.js.mapimport { createOperatorSubscriber } from './OperatorSubscriber';
export function scanInternals(accumulator, seed, hasSeed, emitOnNext, emitBeforeComplete) {
    return (source, subscriber) => {
        let hasState = hasSeed;
        let state = seed;
        let index = 0;
        source.subscribe(createOperatorSubscriber(subscriber, (value) => {
            const i = index++;
            state = hasState
                ?
                    accumulator(state, value, i)
                :
                    ((hasState = true), value);
            emitOnNext && subscriber.next(state);
        }, emitBeforeComplete &&
            (() => {
                hasState && subscriber.next(state);
                subscriber.complete();
            })));
    };
}
//# sourceMappingURL=scanInternals.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function sequenceEqual(compareTo, comparator = (a, b) => a === b) {
    return operate((source, subscriber) => {
        const aState = createState();
        const bState = createState();
        const emit = (isEqual) => {
            subscriber.next(isEqual);
            subscriber.complete();
        };
        const createSubscriber = (selfState, otherState) => {
            const sequenceEqualSubscriber = createOperatorSubscriber(subscriber, (a) => {
                const { buffer, complete } = otherState;
                if (buffer.length === 0) {
                    complete ? emit(false) : selfState.buffer.push(a);
                }
                else {
                    !comparator(a, buffer.shift()) && emit(false);
                }
            }, () => {
                selfState.complete = true;
                const { complete, buffer } = otherState;
                complete && emit(buffer.length === 0);
                sequenceEqualSubscriber === null || sequenceEqualSubscriber === void 0 ? void 0 : sequenceEqualSubscriber.unsubscribe();
            });
            return sequenceEqualSubscriber;
        };
        source.subscribe(createSubscriber(aState, bState));
        compareTo.subscribe(createSubscriber(bState, aState));
    });
}
function createState() {
    return {
        buffer: [],
        complete: false,
    };
}
//# sourceMappingURL=sequenceEqual.js.mapimport { innerFrom } from '../observable/innerFrom';
import { Subject } from '../Subject';
import { SafeSubscriber } from '../Subscriber';
import { operate } from '../util/lift';
export function share(options = {}) {
    const { connector = () => new Subject(), resetOnError = true, resetOnComplete = true, resetOnRefCountZero = true } = options;
    return (wrapperSource) => {
        let connection;
        let resetConnection;
        let subject;
        let refCount = 0;
        let hasCompleted = false;
        let hasErrored = false;
        const cancelReset = () => {
            resetConnection === null || resetConnection === void 0 ? void 0 : resetConnection.unsubscribe();
            resetConnection = undefined;
        };
        const reset = () => {
            cancelReset();
            connection = subject = undefined;
            hasCompleted = hasErrored = false;
        };
        const resetAndUnsubscribe = () => {
            const conn = connection;
            reset();
            conn === null || conn === void 0 ? void 0 : conn.unsubscribe();
        };
        return operate((source, subscriber) => {
            refCount++;
            if (!hasErrored && !hasCompleted) {
                cancelReset();
            }
            const dest = (subject = subject !== null && subject !== void 0 ? subject : connector());
            subscriber.add(() => {
                refCount--;
                if (refCount === 0 && !hasErrored && !hasCompleted) {
                    resetConnection = handleReset(resetAndUnsubscribe, resetOnRefCountZero);
                }
            });
            dest.subscribe(subscriber);
            if (!connection &&
                refCount > 0) {
                connection = new SafeSubscriber({
                    next: (value) => dest.next(value),
                    error: (err) => {
                        hasErrored = true;
                        cancelReset();
                        resetConnection = handleReset(reset, resetOnError, err);
                        dest.error(err);
                    },
                    complete: () => {
                        hasCompleted = true;
                        cancelReset();
                        resetConnection = handleReset(reset, resetOnComplete);
                        dest.complete();
                    },
                });
                innerFrom(source).subscribe(connection);
            }
        })(wrapperSource);
    };
}
function handleReset(reset, on, ...args) {
    if (on === true) {
        reset();
        return;
    }
    if (on === false) {
        return;
    }
    const onSubscriber = new SafeSubscriber({
        next: () => {
            onSubscriber.unsubscribe();
            reset();
        },
    });
    return on(...args).subscribe(onSubscriber);
}
//# sourceMappingURL=share.js.mapimport { ReplaySubject } from '../ReplaySubject';
import { share } from './share';
export function shareReplay(configOrBufferSize, windowTime, scheduler) {
    let bufferSize;
    let refCount = false;
    if (configOrBufferSize && typeof configOrBufferSize === 'object') {
        ({ bufferSize = Infinity, windowTime = Infinity, refCount = false, scheduler } = configOrBufferSize);
    }
    else {
        bufferSize = (configOrBufferSize !== null && configOrBufferSize !== void 0 ? configOrBufferSize : Infinity);
    }
    return share({
        connector: () => new ReplaySubject(bufferSize, windowTime, scheduler),
        resetOnError: true,
        resetOnComplete: false,
        resetOnRefCountZero: refCount,
    });
}
//# sourceMappingURL=shareReplay.js.mapimport { EmptyError } from '../util/EmptyError';
import { SequenceError } from '../util/SequenceError';
import { NotFoundError } from '../util/NotFoundError';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function single(predicate) {
    return operate((source, subscriber) => {
        let hasValue = false;
        let singleValue;
        let seenValue = false;
        let index = 0;
        source.subscribe(createOperatorSubscriber(subscriber, (value) => {
            seenValue = true;
            if (!predicate || predicate(value, index++, source)) {
                hasValue && subscriber.error(new SequenceError('Too many matching values'));
                hasValue = true;
                singleValue = value;
            }
        }, () => {
            if (hasValue) {
                subscriber.next(singleValue);
                subscriber.complete();
            }
            else {
                subscriber.error(seenValue ? new NotFoundError('No matching values') : new EmptyError());
            }
        }));
    });
}
//# sourceMappingURL=single.js.mapimport { filter } from './filter';
export function skip(count) {
    return filter((_, index) => count <= index);
}
//# sourceMappingURL=skip.js.mapimport { identity } from '../util/identity';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function skipLast(skipCount) {
    return skipCount <= 0
        ?
            identity
        : operate((source, subscriber) => {
            let ring = new Array(skipCount);
            let seen = 0;
            source.subscribe(createOperatorSubscriber(subscriber, (value) => {
                const valueIndex = seen++;
                if (valueIndex < skipCount) {
                    ring[valueIndex] = value;
                }
                else {
                    const index = valueIndex % skipCount;
                    const oldValue = ring[index];
                    ring[index] = value;
                    subscriber.next(oldValue);
                }
            }));
            return () => {
                ring = null;
            };
        });
}
//# sourceMappingURL=skipLast.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';
import { noop } from '../util/noop';
export function skipUntil(notifier) {
    return operate((source, subscriber) => {
        let taking = false;
        const skipSubscriber = createOperatorSubscriber(subscriber, () => {
            skipSubscriber === null || skipSubscriber === void 0 ? void 0 : skipSubscriber.unsubscribe();
            taking = true;
        }, noop);
        innerFrom(notifier).subscribe(skipSubscriber);
        source.subscribe(createOperatorSubscriber(subscriber, (value) => taking && subscriber.next(value)));
    });
}
//# sourceMappingURL=skipUntil.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function skipWhile(predicate) {
    return operate((source, subscriber) => {
        let taking = false;
        let index = 0;
        source.subscribe(createOperatorSubscriber(subscriber, (value) => (taking || (taking = !predicate(value, index++))) && subscriber.next(value)));
    });
}
//# sourceMappingURL=skipWhile.js.mapimport { concat } from '../observable/concat';
import { popScheduler } from '../util/args';
import { operate } from '../util/lift';
export function startWith(...values) {
    const scheduler = popScheduler(values);
    return operate((source, subscriber) => {
        (scheduler ? concat(values, source, scheduler) : concat(values, source)).subscribe(subscriber);
    });
}
//# sourceMappingURL=startWith.js.mapimport { operate } from '../util/lift';
export function subscribeOn(scheduler, delay = 0) {
    return operate((source, subscriber) => {
        subscriber.add(scheduler.schedule(() => source.subscribe(subscriber), delay));
    });
}
//# sourceMappingURL=subscribeOn.js.mapimport { switchMap } from './switchMap';
import { identity } from '../util/identity';
export function switchAll() {
    return switchMap(identity);
}
//# sourceMappingURL=switchAll.js.mapimport { innerFrom } from '../observable/innerFrom';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function switchMap(project, resultSelector) {
    return operate((source, subscriber) => {
        let innerSubscriber = null;
        let index = 0;
        let isComplete = false;
        const checkComplete = () => isComplete && !innerSubscriber && subscriber.complete();
        source.subscribe(createOperatorSubscriber(subscriber, (value) => {
            innerSubscriber === null || innerSubscriber === void 0 ? void 0 : innerSubscriber.unsubscribe();
            let innerIndex = 0;
            const outerIndex = index++;
            innerFrom(project(value, outerIndex)).subscribe((innerSubscriber = createOperatorSubscriber(subscriber, (innerValue) => subscriber.next(resultSelector ? resultSelector(value, innerValue, outerIndex, innerIndex++) : innerValue), () => {
                innerSubscriber = null;
                checkComplete();
            })));
        }, () => {
            isComplete = true;
            checkComplete();
        }));
    });
}
//# sourceMappingURL=switchMap.js.mapimport { switchMap } from './switchMap';
import { isFunction } from '../util/isFunction';
export function switchMapTo(innerObservable, resultSelector) {
    return isFunction(resultSelector) ? switchMap(() => innerObservable, resultSelector) : switchMap(() => innerObservable);
}
//# sourceMappingURL=switchMapTo.js.mapimport { switchMap } from './switchMap';
import { operate } from '../util/lift';
export function switchScan(accumulator, seed) {
    return operate((source, subscriber) => {
        let state = seed;
        switchMap((value, index) => accumulator(state, value, index), (_, innerValue) => ((state = innerValue), innerValue))(source).subscribe(subscriber);
        return () => {
            state = null;
        };
    });
}
//# sourceMappingURL=switchScan.js.mapimport { EMPTY } from '../observable/empty';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function take(count) {
    return count <= 0
        ?
            () => EMPTY
        : operate((source, subscriber) => {
            let seen = 0;
            source.subscribe(createOperatorSubscriber(subscriber, (value) => {
                if (++seen <= count) {
                    subscriber.next(value);
                    if (count <= seen) {
                        subscriber.complete();
                    }
                }
            }));
        });
}
//# sourceMappingURL=take.js.mapimport { EMPTY } from '../observable/empty';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function takeLast(count) {
    return count <= 0
        ? () => EMPTY
        : operate((source, subscriber) => {
            let buffer = [];
            source.subscribe(createOperatorSubscriber(subscriber, (value) => {
                buffer.push(value);
                count < buffer.length && buffer.shift();
            }, () => {
                for (const value of buffer) {
                    subscriber.next(value);
                }
                subscriber.complete();
            }, undefined, () => {
                buffer = null;
            }));
        });
}
//# sourceMappingURL=takeLast.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';
import { noop } from '../util/noop';
export function takeUntil(notifier) {
    return operate((source, subscriber) => {
        innerFrom(notifier).subscribe(createOperatorSubscriber(subscriber, () => subscriber.complete(), noop));
        !subscriber.closed && source.subscribe(subscriber);
    });
}
//# sourceMappingURL=takeUntil.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function takeWhile(predicate, inclusive = false) {
    return operate((source, subscriber) => {
        let index = 0;
        source.subscribe(createOperatorSubscriber(subscriber, (value) => {
            const result = predicate(value, index++);
            (result || inclusive) && subscriber.next(value);
            !result && subscriber.complete();
        }));
    });
}
//# sourceMappingURL=takeWhile.js.mapimport { isFunction } from '../util/isFunction';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { identity } from '../util/identity';
export function tap(observerOrNext, error, complete) {
    const tapObserver = isFunction(observerOrNext) || error || complete
        ?
            { next: observerOrNext, error, complete }
        : observerOrNext;
    return tapObserver
        ? operate((source, subscriber) => {
            var _a;
            (_a = tapObserver.subscribe) === null || _a === void 0 ? void 0 : _a.call(tapObserver);
            let isUnsub = true;
            source.subscribe(createOperatorSubscriber(subscriber, (value) => {
                var _a;
                (_a = tapObserver.next) === null || _a === void 0 ? void 0 : _a.call(tapObserver, value);
                subscriber.next(value);
            }, () => {
                var _a;
                isUnsub = false;
                (_a = tapObserver.complete) === null || _a === void 0 ? void 0 : _a.call(tapObserver);
                subscriber.complete();
            }, (err) => {
                var _a;
                isUnsub = false;
                (_a = tapObserver.error) === null || _a === void 0 ? void 0 : _a.call(tapObserver, err);
                subscriber.error(err);
            }, () => {
                var _a, _b;
                if (isUnsub) {
                    (_a = tapObserver.unsubscribe) === null || _a === void 0 ? void 0 : _a.call(tapObserver);
                }
                (_b = tapObserver.finalize) === null || _b === void 0 ? void 0 : _b.call(tapObserver);
            }));
        })
        :
            identity;
}
//# sourceMappingURL=tap.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';
export const defaultThrottleConfig = {
    leading: true,
    trailing: false,
};
export function throttle(durationSelector, config = defaultThrottleConfig) {
    return operate((source, subscriber) => {
        const { leading, trailing } = config;
        let hasValue = false;
        let sendValue = null;
        let throttled = null;
        let isComplete = false;
        const endThrottling = () => {
            throttled === null || throttled === void 0 ? void 0 : throttled.unsubscribe();
            throttled = null;
            if (trailing) {
                send();
                isComplete && subscriber.complete();
            }
        };
        const cleanupThrottling = () => {
            throttled = null;
            isComplete && subscriber.complete();
        };
        const startThrottle = (value) => (throttled = innerFrom(durationSelector(value)).subscribe(createOperatorSubscriber(subscriber, endThrottling, cleanupThrottling)));
        const send = () => {
            if (hasValue) {
                hasValue = false;
                const value = sendValue;
                sendValue = null;
                subscriber.next(value);
                !isComplete && startThrottle(value);
            }
        };
        source.subscribe(createOperatorSubscriber(subscriber, (value) => {
            hasValue = true;
            sendValue = value;
            !(throttled && !throttled.closed) && (leading ? send() : startThrottle(value));
        }, () => {
            isComplete = true;
            !(trailing && hasValue && throttled && !throttled.closed) && subscriber.complete();
        }));
    });
}
//# sourceMappingURL=throttle.js.mapimport { asyncScheduler } from '../scheduler/async';
import { defaultThrottleConfig, throttle } from './throttle';
import { timer } from '../observable/timer';
export function throttleTime(duration, scheduler = asyncScheduler, config = defaultThrottleConfig) {
    const duration$ = timer(duration, scheduler);
    return throttle(() => duration$, config);
}
//# sourceMappingURL=throttleTime.js.mapimport { EmptyError } from '../util/EmptyError';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function throwIfEmpty(errorFactory = defaultErrorFactory) {
    return operate((source, subscriber) => {
        let hasValue = false;
        source.subscribe(createOperatorSubscriber(subscriber, (value) => {
            hasValue = true;
            subscriber.next(value);
        }, () => (hasValue ? subscriber.complete() : subscriber.error(errorFactory()))));
    });
}
function defaultErrorFactory() {
    return new EmptyError();
}
//# sourceMappingURL=throwIfEmpty.js.mapimport { asyncScheduler } from '../scheduler/async';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function timeInterval(scheduler = asyncScheduler) {
    return operate((source, subscriber) => {
        let last = scheduler.now();
        source.subscribe(createOperatorSubscriber(subscriber, (value) => {
            const now = scheduler.now();
            const interval = now - last;
            last = now;
            subscriber.next(new TimeInterval(value, interval));
        }));
    });
}
export class TimeInterval {
    constructor(value, interval) {
        this.value = value;
        this.interval = interval;
    }
}
//# sourceMappingURL=timeInterval.js.mapimport { asyncScheduler } from '../scheduler/async';
import { isValidDate } from '../util/isDate';
import { operate } from '../util/lift';
import { innerFrom } from '../observable/innerFrom';
import { createErrorClass } from '../util/createErrorClass';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { executeSchedule } from '../util/executeSchedule';
export const TimeoutError = createErrorClass((_super) => function TimeoutErrorImpl(info = null) {
    _super(this);
    this.message = 'Timeout has occurred';
    this.name = 'TimeoutError';
    this.info = info;
});
export function timeout(config, schedulerArg) {
    const { first, each, with: _with = timeoutErrorFactory, scheduler = schedulerArg !== null && schedulerArg !== void 0 ? schedulerArg : asyncScheduler, meta = null, } = (isValidDate(config) ? { first: config } : typeof config === 'number' ? { each: config } : config);
    if (first == null && each == null) {
        throw new TypeError('No timeout provided.');
    }
    return operate((source, subscriber) => {
        let originalSourceSubscription;
        let timerSubscription;
        let lastValue = null;
        let seen = 0;
        const startTimer = (delay) => {
            timerSubscription = executeSchedule(subscriber, scheduler, () => {
                try {
                    originalSourceSubscription.unsubscribe();
                    innerFrom(_with({
                        meta,
                        lastValue,
                        seen,
                    })).subscribe(subscriber);
                }
                catch (err) {
                    subscriber.error(err);
                }
            }, delay);
        };
        originalSourceSubscription = source.subscribe(createOperatorSubscriber(subscriber, (value) => {
            timerSubscription === null || timerSubscription === void 0 ? void 0 : timerSubscription.unsubscribe();
            seen++;
            subscriber.next((lastValue = value));
            each > 0 && startTimer(each);
        }, undefined, undefined, () => {
            if (!(timerSubscription === null || timerSubscription === void 0 ? void 0 : timerSubscription.closed)) {
                timerSubscription === null || timerSubscription === void 0 ? void 0 : timerSubscription.unsubscribe();
            }
            lastValue = null;
        }));
        !seen && startTimer(first != null ? (typeof first === 'number' ? first : +first - scheduler.now()) : each);
    });
}
function timeoutErrorFactory(info) {
    throw new TimeoutError(info);
}
//# sourceMappingURL=timeout.js.mapimport { async } from '../scheduler/async';
import { isValidDate } from '../util/isDate';
import { timeout } from './timeout';
export function timeoutWith(due, withObservable, scheduler) {
    let first;
    let each;
    let _with;
    scheduler = scheduler !== null && scheduler !== void 0 ? scheduler : async;
    if (isValidDate(due)) {
        first = due;
    }
    else if (typeof due === 'number') {
        each = due;
    }
    if (withObservable) {
        _with = () => withObservable;
    }
    else {
        throw new TypeError('No observable provided to switch to');
    }
    if (first == null && each == null) {
        throw new TypeError('No timeout provided.');
    }
    return timeout({
        first,
        each,
        scheduler,
        with: _with,
    });
}
//# sourceMappingURL=timeoutWith.js.mapimport { dateTimestampProvider } from '../scheduler/dateTimestampProvider';
import { map } from './map';
export function timestamp(timestampProvider = dateTimestampProvider) {
    return map((value) => ({ value, timestamp: timestampProvider.now() }));
}
//# sourceMappingURL=timestamp.js.mapimport { reduce } from './reduce';
import { operate } from '../util/lift';
const arrReducer = (arr, value) => (arr.push(value), arr);
export function toArray() {
    return operate((source, subscriber) => {
        reduce(arrReducer, [])(source).subscribe(subscriber);
    });
}
//# sourceMappingURL=toArray.js.mapimport { Subject } from '../Subject';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { noop } from '../util/noop';
export function window(windowBoundaries) {
    return operate((source, subscriber) => {
        let windowSubject = new Subject();
        subscriber.next(windowSubject.asObservable());
        const errorHandler = (err) => {
            windowSubject.error(err);
            subscriber.error(err);
        };
        source.subscribe(createOperatorSubscriber(subscriber, (value) => windowSubject === null || windowSubject === void 0 ? void 0 : windowSubject.next(value), () => {
            windowSubject.complete();
            subscriber.complete();
        }, errorHandler));
        windowBoundaries.subscribe(createOperatorSubscriber(subscriber, () => {
            windowSubject.complete();
            subscriber.next((windowSubject = new Subject()));
        }, noop, errorHandler));
        return () => {
            windowSubject === null || windowSubject === void 0 ? void 0 : windowSubject.unsubscribe();
            windowSubject = null;
        };
    });
}
//# sourceMappingURL=window.js.mapimport { Subject } from '../Subject';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
export function windowCount(windowSize, startWindowEvery = 0) {
    const startEvery = startWindowEvery > 0 ? startWindowEvery : windowSize;
    return operate((source, subscriber) => {
        let windows = [new Subject()];
        let starts = [];
        let count = 0;
        subscriber.next(windows[0].asObservable());
        source.subscribe(createOperatorSubscriber(subscriber, (value) => {
            for (const window of windows) {
                window.next(value);
            }
            const c = count - windowSize + 1;
            if (c >= 0 && c % startEvery === 0) {
                windows.shift().complete();
            }
            if (++count % startEvery === 0) {
                const window = new Subject();
                windows.push(window);
                subscriber.next(window.asObservable());
            }
        }, () => {
            while (windows.length > 0) {
                windows.shift().complete();
            }
            subscriber.complete();
        }, (err) => {
            while (windows.length > 0) {
                windows.shift().error(err);
            }
            subscriber.error(err);
        }, () => {
            starts = null;
            windows = null;
        }));
    });
}
//# sourceMappingURL=windowCount.js.mapimport { Subject } from '../Subject';
import { asyncScheduler } from '../scheduler/async';
import { Subscription } from '../Subscription';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { arrRemove } from '../util/arrRemove';
import { popScheduler } from '../util/args';
import { executeSchedule } from '../util/executeSchedule';
export function windowTime(windowTimeSpan, ...otherArgs) {
    var _a, _b;
    const scheduler = (_a = popScheduler(otherArgs)) !== null && _a !== void 0 ? _a : asyncScheduler;
    const windowCreationInterval = (_b = otherArgs[0]) !== null && _b !== void 0 ? _b : null;
    const maxWindowSize = otherArgs[1] || Infinity;
    return operate((source, subscriber) => {
        let windowRecords = [];
        let restartOnClose = false;
        const closeWindow = (record) => {
            const { window, subs } = record;
            window.complete();
            subs.unsubscribe();
            arrRemove(windowRecords, record);
            restartOnClose && startWindow();
        };
        const startWindow = () => {
            if (windowRecords) {
                const subs = new Subscription();
                subscriber.add(subs);
                const window = new Subject();
                const record = {
                    window,
                    subs,
                    seen: 0,
                };
                windowRecords.push(record);
                subscriber.next(window.asObservable());
                executeSchedule(subs, scheduler, () => closeWindow(record), windowTimeSpan);
            }
        };
        if (windowCreationInterval !== null && windowCreationInterval >= 0) {
            executeSchedule(subscriber, scheduler, startWindow, windowCreationInterval, true);
        }
        else {
            restartOnClose = true;
        }
        startWindow();
        const loop = (cb) => windowRecords.slice().forEach(cb);
        const terminate = (cb) => {
            loop(({ window }) => cb(window));
            cb(subscriber);
            subscriber.unsubscribe();
        };
        source.subscribe(createOperatorSubscriber(subscriber, (value) => {
            loop((record) => {
                record.window.next(value);
                maxWindowSize <= ++record.seen && closeWindow(record);
            });
        }, () => terminate((consumer) => consumer.complete()), (err) => terminate((consumer) => consumer.error(err))));
        return () => {
            windowRecords = null;
        };
    });
}
//# sourceMappingURL=windowTime.js.mapimport { Subject } from '../Subject';
import { Subscription } from '../Subscription';
import { operate } from '../util/lift';
import { innerFrom } from '../observable/innerFrom';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { noop } from '../util/noop';
import { arrRemove } from '../util/arrRemove';
export function windowToggle(openings, closingSelector) {
    return operate((source, subscriber) => {
        const windows = [];
        const handleError = (err) => {
            while (0 < windows.length) {
                windows.shift().error(err);
            }
            subscriber.error(err);
        };
        innerFrom(openings).subscribe(createOperatorSubscriber(subscriber, (openValue) => {
            const window = new Subject();
            windows.push(window);
            const closingSubscription = new Subscription();
            const closeWindow = () => {
                arrRemove(windows, window);
                window.complete();
                closingSubscription.unsubscribe();
            };
            let closingNotifier;
            try {
                closingNotifier = innerFrom(closingSelector(openValue));
            }
            catch (err) {
                handleError(err);
                return;
            }
            subscriber.next(window.asObservable());
            closingSubscription.add(closingNotifier.subscribe(createOperatorSubscriber(subscriber, closeWindow, noop, handleError)));
        }, noop));
        source.subscribe(createOperatorSubscriber(subscriber, (value) => {
            const windowsCopy = windows.slice();
            for (const window of windowsCopy) {
                window.next(value);
            }
        }, () => {
            while (0 < windows.length) {
                windows.shift().complete();
            }
            subscriber.complete();
        }, handleError, () => {
            while (0 < windows.length) {
                windows.shift().unsubscribe();
            }
        }));
    });
}
//# sourceMappingURL=windowToggle.js.mapimport { Subject } from '../Subject';
import { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';
export function windowWhen(closingSelector) {
    return operate((source, subscriber) => {
        let window;
        let closingSubscriber;
        const handleError = (err) => {
            window.error(err);
            subscriber.error(err);
        };
        const openWindow = () => {
            closingSubscriber === null || closingSubscriber === void 0 ? void 0 : closingSubscriber.unsubscribe();
            window === null || window === void 0 ? void 0 : window.complete();
            window = new Subject();
            subscriber.next(window.asObservable());
            let closingNotifier;
            try {
                closingNotifier = innerFrom(closingSelector());
            }
            catch (err) {
                handleError(err);
                return;
            }
            closingNotifier.subscribe((closingSubscriber = createOperatorSubscriber(subscriber, openWindow, openWindow, handleError)));
        };
        openWindow();
        source.subscribe(createOperatorSubscriber(subscriber, (value) => window.next(value), () => {
            window.complete();
            subscriber.complete();
        }, handleError, () => {
            closingSubscriber === null || closingSubscriber === void 0 ? void 0 : closingSubscriber.unsubscribe();
            window = null;
        }));
    });
}
//# sourceMappingURL=windowWhen.js.mapimport { operate } from '../util/lift';
import { createOperatorSubscriber } from './OperatorSubscriber';
import { innerFrom } from '../observable/innerFrom';
import { identity } from '../util/identity';
import { noop } from '../util/noop';
import { popResultSelector } from '../util/args';
export function withLatestFrom(...inputs) {
    const project = popResultSelector(inputs);
    return operate((source, subscriber) => {
        const len = inputs.length;
        const otherValues = new Array(len);
        let hasValue = inputs.map(() => false);
        let ready = false;
        for (let i = 0; i < len; i++) {
            innerFrom(inputs[i]).subscribe(createOperatorSubscriber(subscriber, (value) => {
                otherValues[i] = value;
                if (!ready && !hasValue[i]) {
                    hasValue[i] = true;
                    (ready = hasValue.every(identity)) && (hasValue = null);
                }
            }, noop));
        }
        source.subscribe(createOperatorSubscriber(subscriber, (value) => {
            if (ready) {
                const values = [value, ...otherValues];
                subscriber.next(project ? project(...values) : values);
            }
        }));
    });
}
//# sourceMappingURL=withLatestFrom.js.mapimport { zip as zipStatic } from '../observable/zip';
import { operate } from '../util/lift';
export function zip(...sources) {
    return operate((source, subscriber) => {
        zipStatic(source, ...sources).subscribe(subscriber);
    });
}
//# sourceMappingURL=zip.js.mapimport { zip } from '../observable/zip';
import { joinAllInternals } from './joinAllInternals';
export function zipAll(project) {
    return joinAllInternals(zip, project);
}
//# sourceMappingURL=zipAll.js.mapimport { zip } from './zip';
export function zipWith(...otherInputs) {
    return zip(...otherInputs);
}
//# sourceMappingURL=zipWith.js.mapimport { Observable } from '../Observable';
import { Subscription } from '../Subscription';
import { refCount as higherOrderRefCount } from '../operators/refCount';
import { createOperatorSubscriber } from '../operators/OperatorSubscriber';
import { hasLift } from '../util/lift';
export class ConnectableObservable extends Observable {
    constructor(source, subjectFactory) {
        super();
        this.source = source;
        this.subjectFactory = subjectFactory;
        this._subject = null;
        this._refCount = 0;
        this._connection = null;
        if (hasLift(source)) {
            this.lift = source.lift;
        }
    }
    _subscribe(subscriber) {
        return this.getSubject().subscribe(subscriber);
    }
    getSubject() {
        const subject = this._subject;
        if (!subject || subject.isStopped) {
            this._subject = this.subjectFactory();
        }
        return this._subject;
    }
    _teardown() {
        this._refCount = 0;
        const { _connection } = this;
        this._subject = this._connection = null;
        _connection === null || _connection === void 0 ? void 0 : _connection.unsubscribe();
    }
    connect() {
        let connection = this._connection;
        if (!connection) {
            connection = this._connection = new Subscription();
            const subject = this.getSubject();
            connection.add(this.source.subscribe(createOperatorSubscriber(subject, undefined, () => {
                this._teardown();
                subject.complete();
            }, (err) => {
                this._teardown();
                subject.error(err);
            }, () => this._teardown())));
            if (connection.closed) {
                this._connection = null;
                connection = Subscription.EMPTY;
            }
        }
        return connection;
    }
    refCount() {
        return higherOrderRefCount()(this);
    }
}
//# sourceMappingURL=ConnectableObservable.js.mapimport { bindCallbackInternals } from './bindCallbackInternals';
export function bindCallback(callbackFunc, resultSelector, scheduler) {
    return bindCallbackInternals(false, callbackFunc, resultSelector, scheduler);
}
//# sourceMappingURL=bindCallback.js.mapimport { isScheduler } from '../util/isScheduler';
import { Observable } from '../Observable';
import { subscribeOn } from '../operators/subscribeOn';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';
import { observeOn } from '../operators/observeOn';
import { AsyncSubject } from '../AsyncSubject';
export function bindCallbackInternals(isNodeStyle, callbackFunc, resultSelector, scheduler) {
    if (resultSelector) {
        if (isScheduler(resultSelector)) {
            scheduler = resultSelector;
        }
        else {
            return function (...args) {
                return bindCallbackInternals(isNodeStyle, callbackFunc, scheduler)
                    .apply(this, args)
                    .pipe(mapOneOrManyArgs(resultSelector));
            };
        }
    }
    if (scheduler) {
        return function (...args) {
            return bindCallbackInternals(isNodeStyle, callbackFunc)
                .apply(this, args)
                .pipe(subscribeOn(scheduler), observeOn(scheduler));
        };
    }
    return function (...args) {
        const subject = new AsyncSubject();
        let uninitialized = true;
        return new Observable((subscriber) => {
            const subs = subject.subscribe(subscriber);
            if (uninitialized) {
                uninitialized = false;
                let isAsync = false;
                let isComplete = false;
                callbackFunc.apply(this, [
                    ...args,
                    (...results) => {
                        if (isNodeStyle) {
                            const err = results.shift();
                            if (err != null) {
                                subject.error(err);
                                return;
                            }
                        }
                        subject.next(1 < results.length ? results : results[0]);
                        isComplete = true;
                        if (isAsync) {
                            subject.complete();
                        }
                    },
                ]);
                if (isComplete) {
                    subject.complete();
                }
                isAsync = true;
            }
            return subs;
        });
    };
}
//# sourceMappingURL=bindCallbackInternals.js.mapimport { bindCallbackInternals } from './bindCallbackInternals';
export function bindNodeCallback(callbackFunc, resultSelector, scheduler) {
    return bindCallbackInternals(true, callbackFunc, resultSelector, scheduler);
}
//# sourceMappingURL=bindNodeCallback.js.mapimport { Observable } from '../Observable';
import { argsArgArrayOrObject } from '../util/argsArgArrayOrObject';
import { from } from './from';
import { identity } from '../util/identity';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';
import { popResultSelector, popScheduler } from '../util/args';
import { createObject } from '../util/createObject';
import { createOperatorSubscriber } from '../operators/OperatorSubscriber';
import { executeSchedule } from '../util/executeSchedule';
export function combineLatest(...args) {
    const scheduler = popScheduler(args);
    const resultSelector = popResultSelector(args);
    const { args: observables, keys } = argsArgArrayOrObject(args);
    if (observables.length === 0) {
        return from([], scheduler);
    }
    const result = new Observable(combineLatestInit(observables, scheduler, keys
        ?
            (values) => createObject(keys, values)
        :
            identity));
    return resultSelector ? result.pipe(mapOneOrManyArgs(resultSelector)) : result;
}
export function combineLatestInit(observables, scheduler, valueTransform = identity) {
    return (subscriber) => {
        maybeSchedule(scheduler, () => {
            const { length } = observables;
            const values = new Array(length);
            let active = length;
            let remainingFirstValues = length;
            for (let i = 0; i < length; i++) {
                maybeSchedule(scheduler, () => {
                    const source = from(observables[i], scheduler);
                    let hasFirstValue = false;
                    source.subscribe(createOperatorSubscriber(subscriber, (value) => {
                        values[i] = value;
                        if (!hasFirstValue) {
                            hasFirstValue = true;
                            remainingFirstValues--;
                        }
                        if (!remainingFirstValues) {
                            subscriber.next(valueTransform(values.slice()));
                        }
                    }, () => {
                        if (!--active) {
                            subscriber.complete();
                        }
                    }));
                }, subscriber);
            }
        }, subscriber);
    };
}
function maybeSchedule(scheduler, execute, subscription) {
    if (scheduler) {
        executeSchedule(subscription, scheduler, execute);
    }
    else {
        execute();
    }
}
//# sourceMappingURL=combineLatest.js.mapimport { concatAll } from '../operators/concatAll';
import { popScheduler } from '../util/args';
import { from } from './from';
export function concat(...args) {
    return concatAll()(from(args, popScheduler(args)));
}
//# sourceMappingURL=concat.js.mapimport { Subject } from '../Subject';
import { Observable } from '../Observable';
import { defer } from './defer';
const DEFAULT_CONFIG = {
    connector: () => new Subject(),
    resetOnDisconnect: true,
};
export function connectable(source, config = DEFAULT_CONFIG) {
    let connection = null;
    const { connector, resetOnDisconnect = true } = config;
    let subject = connector();
    const result = new Observable((subscriber) => {
        return subject.subscribe(subscriber);
    });
    result.connect = () => {
        if (!connection || connection.closed) {
            connection = defer(() => source).subscribe(subject);
            if (resetOnDisconnect) {
                connection.add(() => (subject = connector()));
            }
        }
        return connection;
    };
    return result;
}
//# sourceMappingURL=connectable.js.mapimport { Observable } from '../Observable';
import { innerFrom } from './innerFrom';
export function defer(observableFactory) {
    return new Observable((subscriber) => {
        innerFrom(observableFactory()).subscribe(subscriber);
    });
}
//# sourceMappingURL=defer.js.mapimport { Observable } from '../Observable';
export const EMPTY = new Observable((subscriber) => subscriber.complete());
export function empty(scheduler) {
    return scheduler ? emptyScheduled(scheduler) : EMPTY;
}
function emptyScheduled(scheduler) {
    return new Observable((subscriber) => scheduler.schedule(() => subscriber.complete()));
}
//# sourceMappingURL=empty.js.mapimport { Observable } from '../Observable';
import { argsArgArrayOrObject } from '../util/argsArgArrayOrObject';
import { innerFrom } from './innerFrom';
import { popResultSelector } from '../util/args';
import { createOperatorSubscriber } from '../operators/OperatorSubscriber';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';
import { createObject } from '../util/createObject';
export function forkJoin(...args) {
    const resultSelector = popResultSelector(args);
    const { args: sources, keys } = argsArgArrayOrObject(args);
    const result = new Observable((subscriber) => {
        const { length } = sources;
        if (!length) {
            subscriber.complete();
            return;
        }
        const values = new Array(length);
        let remainingCompletions = length;
        let remainingEmissions = length;
        for (let sourceIndex = 0; sourceIndex < length; sourceIndex++) {
            let hasValue = false;
            innerFrom(sources[sourceIndex]).subscribe(createOperatorSubscriber(subscriber, (value) => {
                if (!hasValue) {
                    hasValue = true;
                    remainingEmissions--;
                }
                values[sourceIndex] = value;
            }, () => remainingCompletions--, undefined, () => {
                if (!remainingCompletions || !hasValue) {
                    if (!remainingEmissions) {
                        subscriber.next(keys ? createObject(keys, values) : values);
                    }
                    subscriber.complete();
                }
            }));
        }
    });
    return resultSelector ? result.pipe(mapOneOrManyArgs(resultSelector)) : result;
}
//# sourceMappingURL=forkJoin.js.mapimport { scheduled } from '../scheduled/scheduled';
import { innerFrom } from './innerFrom';
export function from(input, scheduler) {
    return scheduler ? scheduled(input, scheduler) : innerFrom(input);
}
//# sourceMappingURL=from.js.mapimport { innerFrom } from '../observable/innerFrom';
import { Observable } from '../Observable';
import { mergeMap } from '../operators/mergeMap';
import { isArrayLike } from '../util/isArrayLike';
import { isFunction } from '../util/isFunction';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';
const nodeEventEmitterMethods = ['addListener', 'removeListener'];
const eventTargetMethods = ['addEventListener', 'removeEventListener'];
const jqueryMethods = ['on', 'off'];
export function fromEvent(target, eventName, options, resultSelector) {
    if (isFunction(options)) {
        resultSelector = options;
        options = undefined;
    }
    if (resultSelector) {
        return fromEvent(target, eventName, options).pipe(mapOneOrManyArgs(resultSelector));
    }
    const [add, remove] = isEventTarget(target)
        ? eventTargetMethods.map((methodName) => (handler) => target[methodName](eventName, handler, options))
        :
            isNodeStyleEventEmitter(target)
                ? nodeEventEmitterMethods.map(toCommonHandlerRegistry(target, eventName))
                : isJQueryStyleEventEmitter(target)
                    ? jqueryMethods.map(toCommonHandlerRegistry(target, eventName))
                    : [];
    if (!add) {
        if (isArrayLike(target)) {
            return mergeMap((subTarget) => fromEvent(subTarget, eventName, options))(innerFrom(target));
        }
    }
    if (!add) {
        throw new TypeError('Invalid event target');
    }
    return new Observable((subscriber) => {
        const handler = (...args) => subscriber.next(1 < args.length ? args : args[0]);
        add(handler);
        return () => remove(handler);
    });
}
function toCommonHandlerRegistry(target, eventName) {
    return (methodName) => (handler) => target[methodName](eventName, handler);
}
function isNodeStyleEventEmitter(target) {
    return isFunction(target.addListener) && isFunction(target.removeListener);
}
function isJQueryStyleEventEmitter(target) {
    return isFunction(target.on) && isFunction(target.off);
}
function isEventTarget(target) {
    return isFunction(target.addEventListener) && isFunction(target.removeEventListener);
}
//# sourceMappingURL=fromEvent.js.mapimport { Observable } from '../Observable';
import { isFunction } from '../util/isFunction';
import { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';
export function fromEventPattern(addHandler, removeHandler, resultSelector) {
    if (resultSelector) {
        return fromEventPattern(addHandler, removeHandler).pipe(mapOneOrManyArgs(resultSelector));
    }
    return new Observable((subscriber) => {
        const handler = (...e) => subscriber.next(e.length === 1 ? e[0] : e);
        const retValue = addHandler(handler);
        return isFunction(removeHandler) ? () => removeHandler(handler, retValue) : undefined;
    });
}
//# sourceMappingURL=fromEventPattern.js.mapimport { Observable } from '../Observable';
export function fromSubscribable(subscribable) {
    return new Observable((subscriber) => subscribable.subscribe(subscriber));
}
//# sourceMappingURL=fromSubscribable.js.mapimport { identity } from '../util/identity';
import { isScheduler } from '../util/isScheduler';
import { defer } from './defer';
import { scheduleIterable } from '../scheduled/scheduleIterable';
export function generate(initialStateOrOptions, condition, iterate, resultSelectorOrScheduler, scheduler) {
    let resultSelector;
    let initialState;
    if (arguments.length === 1) {
        ({
            initialState,
            condition,
            iterate,
            resultSelector = identity,
            scheduler,
        } = initialStateOrOptions);
    }
    else {
        initialState = initialStateOrOptions;
        if (!resultSelectorOrScheduler || isScheduler(resultSelectorOrScheduler)) {
            resultSelector = identity;
            scheduler = resultSelectorOrScheduler;
        }
        else {
            resultSelector = resultSelectorOrScheduler;
        }
    }
    function* gen() {
        for (let state = initialState; !condition || condition(state); state = iterate(state)) {
            yield resultSelector(state);
        }
    }
    return defer((scheduler
        ?
            () => scheduleIterable(gen(), scheduler)
        :
            gen));
}
//# sourceMappingURL=generate.js.mapimport { defer } from './defer';
export function iif(condition, trueResult, falseResult) {
    return defer(() => (condition() ? trueResult : falseResult));
}
//# sourceMappingURL=iif.js.mapimport { __asyncValues, __awaiter } from "tslib";
import { isArrayLike } from '../util/isArrayLike';
import { isPromise } from '../util/isPromise';
import { Observable } from '../Observable';
import { isInteropObservable } from '../util/isInteropObservable';
import { isAsyncIterable } from '../util/isAsyncIterable';
import { createInvalidObservableTypeError } from '../util/throwUnobservableError';
import { isIterable } from '../util/isIterable';
import { isReadableStreamLike, readableStreamLikeToAsyncGenerator } from '../util/isReadableStreamLike';
import { isFunction } from '../util/isFunction';
import { reportUnhandledError } from '../util/reportUnhandledError';
import { observable as Symbol_observable } from '../symbol/observable';
export function innerFrom(input) {
    if (input instanceof Observable) {
        return input;
    }
    if (input != null) {
        if (isInteropObservable(input)) {
            return fromInteropObservable(input);
        }
        if (isArrayLike(input)) {
            return fromArrayLike(input);
        }
        if (isPromise(input)) {
            return fromPromise(input);
        }
        if (isAsyncIterable(input)) {
            return fromAsyncIterable(input);
        }
        if (isIterable(input)) {
            return fromIterable(input);
        }
        if (isReadableStreamLike(input)) {
            return fromReadableStreamLike(input);
        }
    }
    throw createInvalidObservableTypeError(input);
}
export function fromInteropObservable(obj) {
    return new Observable((subscriber) => {
        const obs = obj[Symbol_observable]();
        if (isFunction(obs.subscribe)) {
            return obs.subscribe(subscriber);
        }
        throw new TypeError('Provided object does not correctly implement Symbol.observable');
    });
}
export function fromArrayLike(array) {
    return new Observable((subscriber) => {
        for (let i = 0; i < array.length && !subscriber.closed; i++) {
            subscriber.next(array[i]);
        }
        subscriber.complete();
    });
}
export function fromPromise(promise) {
    return new Observable((subscriber) => {
        promise
            .then((value) => {
            if (!subscriber.closed) {
                subscriber.next(value);
                subscriber.complete();
            }
        }, (err) => subscriber.error(err))
            .then(null, reportUnhandledError);
    });
}
export function fromIterable(iterable) {
    return new Observable((subscriber) => {
        for (const value of iterable) {
            subscriber.next(value);
            if (subscriber.closed) {
                return;
            }
        }
        subscriber.complete();
    });
}
export function fromAsyncIterable(asyncIterable) {
    return new Observable((subscriber) => {
        process(asyncIterable, subscriber).catch((err) => subscriber.error(err));
    });
}
export function fromReadableStreamLike(readableStream) {
    return fromAsyncIterable(readableStreamLikeToAsyncGenerator(readableStream));
}
function process(asyncIterable, subscriber) {
    var asyncIterable_1, asyncIterable_1_1;
    var e_1, _a;
    return __awaiter(this, void 0, void 0, function* () {
        try {
            for (asyncIterable_1 = __asyncValues(asyncIterable); asyncIterable_1_1 = yield asyncIterable_1.next(), !asyncIterable_1_1.done;) {
                const value = asyncIterable_1_1.value;
                subscriber.next(value);
                if (subscriber.closed) {
                    return;
                }
            }
        }
        catch (e_1_1) { e_1 = { error: e_1_1 }; }
        finally {
            try {
                if (asyncIterable_1_1 && !asyncIterable_1_1.done && (_a = asyncIterable_1.return)) yield _a.call(asyncIterable_1);
            }
            finally { if (e_1) throw e_1.error; }
        }
        subscriber.complete();
    });
}
//# sourceMappingURL=innerFrom.js.mapimport { asyncScheduler } from '../scheduler/async';
import { timer } from './timer';
export function interval(period = 0, scheduler = asyncScheduler) {
    if (period < 0) {
        period = 0;
    }
    return timer(period, period, scheduler);
}
//# sourceMappingURL=interval.js.mapimport { mergeAll } from '../operators/mergeAll';
import { innerFrom } from './innerFrom';
import { EMPTY } from './empty';
import { popNumber, popScheduler } from '../util/args';
import { from } from './from';
export function merge(...args) {
    const scheduler = popScheduler(args);
    const concurrent = popNumber(args, Infinity);
    const sources = args;
    return !sources.length
        ?
            EMPTY
        : sources.length === 1
            ?
                innerFrom(sources[0])
            :
                mergeAll(concurrent)(from(sources, scheduler));
}
//# sourceMappingURL=merge.js.mapimport { Observable } from '../Observable';
import { noop } from '../util/noop';
export const NEVER = new Observable(noop);
export function never() {
    return NEVER;
}
//# sourceMappingURL=never.js.mapimport { popScheduler } from '../util/args';
import { from } from './from';
export function of(...args) {
    const scheduler = popScheduler(args);
    return from(args, scheduler);
}
//# sourceMappingURL=of.js.mapimport { EMPTY } from './empty';
import { onErrorResumeNext as onErrorResumeNextWith } from '../operators/onErrorResumeNext';
import { argsOrArgArray } from '../util/argsOrArgArray';
export function onErrorResumeNext(...sources) {
    return onErrorResumeNextWith(argsOrArgArray(sources))(EMPTY);
}
//# sourceMappingURL=onErrorResumeNext.js.mapimport { from } from './from';
export function pairs(obj, scheduler) {
    return from(Object.entries(obj), scheduler);
}
//# sourceMappingURL=pairs.js.mapimport { not } from '../util/not';
import { filter } from '../operators/filter';
import { innerFrom } from './innerFrom';
export function partition(source, predicate, thisArg) {
    return [filter(predicate, thisArg)(innerFrom(source)), filter(not(predicate, thisArg))(innerFrom(source))];
}
//# sourceMappingURL=partition.js.mapimport { Observable } from '../Observable';
import { innerFrom } from './innerFrom';
import { argsOrArgArray } from '../util/argsOrArgArray';
import { createOperatorSubscriber } from '../operators/OperatorSubscriber';
export function race(...sources) {
    sources = argsOrArgArray(sources);
    return sources.length === 1 ? innerFrom(sources[0]) : new Observable(raceInit(sources));
}
export function raceInit(sources) {
    return (subscriber) => {
        let subscriptions = [];
        for (let i = 0; subscriptions && !subscriber.closed && i < sources.length; i++) {
            subscriptions.push(innerFrom(sources[i]).subscribe(createOperatorSubscriber(subscriber, (value) => {
                if (subscriptions) {
                    for (let s = 0; s < subscriptions.length; s++) {
                        s !== i && subscriptions[s].unsubscribe();
                    }
                    subscriptions = null;
                }
                subscriber.next(value);
            })));
        }
    };
}
//# sourceMappingURL=race.js.mapimport { Observable } from '../Observable';
import { EMPTY } from './empty';
export function range(start, count, scheduler) {
    if (count == null) {
        count = start;
        start = 0;
    }
    if (count <= 0) {
        return EMPTY;
    }
    const end = count + start;
    return new Observable(scheduler
        ?
            (subscriber) => {
                let n = start;
                return scheduler.schedule(function () {
                    if (n < end) {
                        subscriber.next(n++);
                        this.schedule();
                    }
                    else {
                        subscriber.complete();
                    }
                });
            }
        :
            (subscriber) => {
                let n = start;
                while (n < end && !subscriber.closed) {
                    subscriber.next(n++);
                }
                subscriber.complete();
            });
}
//# sourceMappingURL=range.js.mapimport { Observable } from '../Observable';
import { isFunction } from '../util/isFunction';
export function throwError(errorOrErrorFactory, scheduler) {
    const errorFactory = isFunction(errorOrErrorFactory) ? errorOrErrorFactory : () => errorOrErrorFactory;
    const init = (subscriber) => subscriber.error(errorFactory());
    return new Observable(scheduler ? (subscriber) => scheduler.schedule(init, 0, subscriber) : init);
}
//# sourceMappingURL=throwError.js.mapimport { Observable } from '../Observable';
import { async as asyncScheduler } from '../scheduler/async';
import { isScheduler } from '../util/isScheduler';
import { isValidDate } from '../util/isDate';
export function timer(dueTime = 0, intervalOrScheduler, scheduler = asyncScheduler) {
    let intervalDuration = -1;
    if (intervalOrScheduler != null) {
        if (isScheduler(intervalOrScheduler)) {
            scheduler = intervalOrScheduler;
        }
        else {
            intervalDuration = intervalOrScheduler;
        }
    }
    return new Observable((subscriber) => {
        let due = isValidDate(dueTime) ? +dueTime - scheduler.now() : dueTime;
        if (due < 0) {
            due = 0;
        }
        let n = 0;
        return scheduler.schedule(function () {
            if (!subscriber.closed) {
                subscriber.next(n++);
                if (0 <= intervalDuration) {
                    this.schedule(undefined, intervalDuration);
                }
                else {
                    subscriber.complete();
                }
            }
        }, due);
    });
}
//# sourceMappingURL=timer.js.mapimport { Observable } from '../Observable';
import { innerFrom } from './innerFrom';
import { EMPTY } from './empty';
export function using(resourceFactory, observableFactory) {
    return new Observable((subscriber) => {
        const resource = resourceFactory();
        const result = observableFactory(resource);
        const source = result ? innerFrom(result) : EMPTY;
        source.subscribe(subscriber);
        return () => {
            if (resource) {
                resource.unsubscribe();
            }
        };
    });
}
//# sourceMappingURL=using.js.mapimport { Observable } from '../Observable';
import { innerFrom } from './innerFrom';
import { argsOrArgArray } from '../util/argsOrArgArray';
import { EMPTY } from './empty';
import { createOperatorSubscriber } from '../operators/OperatorSubscriber';
import { popResultSelector } from '../util/args';
export function zip(...args) {
    const resultSelector = popResultSelector(args);
    const sources = argsOrArgArray(args);
    return sources.length
        ? new Observable((subscriber) => {
            let buffers = sources.map(() => []);
            let completed = sources.map(() => false);
            subscriber.add(() => {
                buffers = completed = null;
            });
            for (let sourceIndex = 0; !subscriber.closed && sourceIndex < sources.length; sourceIndex++) {
                innerFrom(sources[sourceIndex]).subscribe(createOperatorSubscriber(subscriber, (value) => {
                    buffers[sourceIndex].push(value);
                    if (buffers.every((buffer) => buffer.length)) {
                        const result = buffers.map((buffer) => buffer.shift());
                        subscriber.next(resultSelector ? resultSelector(...result) : result);
                        if (buffers.some((buffer, i) => !buffer.length && completed[i])) {
                            subscriber.complete();
                        }
                    }
                }, () => {
                    completed[sourceIndex] = true;
                    !buffers[sourceIndex].length && subscriber.complete();
                }));
            }
            return () => {
                buffers = completed = null;
            };
        })
        : EMPTY;
}
//# sourceMappingURL=zip.js.mapimport { Subject, AnonymousSubject } from '../../Subject';
import { Subscriber } from '../../Subscriber';
import { Observable } from '../../Observable';
import { Subscription } from '../../Subscription';
import { ReplaySubject } from '../../ReplaySubject';
const DEFAULT_WEBSOCKET_CONFIG = {
    url: '',
    deserializer: (e) => JSON.parse(e.data),
    serializer: (value) => JSON.stringify(value),
};
const WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT = 'WebSocketSubject.error must be called with an object with an error code, and an optional reason: { code: number, reason: string }';
export class WebSocketSubject extends AnonymousSubject {
    constructor(urlConfigOrSource, destination) {
        super();
        this._socket = null;
        if (urlConfigOrSource instanceof Observable) {
            this.destination = destination;
            this.source = urlConfigOrSource;
        }
        else {
            const config = (this._config = Object.assign({}, DEFAULT_WEBSOCKET_CONFIG));
            this._output = new Subject();
            if (typeof urlConfigOrSource === 'string') {
                config.url = urlConfigOrSource;
            }
            else {
                for (const key in urlConfigOrSource) {
                    if (urlConfigOrSource.hasOwnProperty(key)) {
                        config[key] = urlConfigOrSource[key];
                    }
                }
            }
            if (!config.WebSocketCtor && WebSocket) {
                config.WebSocketCtor = WebSocket;
            }
            else if (!config.WebSocketCtor) {
                throw new Error('no WebSocket constructor can be found');
            }
            this.destination = new ReplaySubject();
        }
    }
    lift(operator) {
        const sock = new WebSocketSubject(this._config, this.destination);
        sock.operator = operator;
        sock.source = this;
        return sock;
    }
    _resetState() {
        this._socket = null;
        if (!this.source) {
            this.destination = new ReplaySubject();
        }
        this._output = new Subject();
    }
    multiplex(subMsg, unsubMsg, messageFilter) {
        const self = this;
        return new Observable((observer) => {
            try {
                self.next(subMsg());
            }
            catch (err) {
                observer.error(err);
            }
            const subscription = self.subscribe({
                next: (x) => {
                    try {
                        if (messageFilter(x)) {
                            observer.next(x);
                        }
                    }
                    catch (err) {
                        observer.error(err);
                    }
                },
                error: (err) => observer.error(err),
                complete: () => observer.complete(),
            });
            return () => {
                try {
                    self.next(unsubMsg());
                }
                catch (err) {
                    observer.error(err);
                }
                subscription.unsubscribe();
            };
        });
    }
    _connectSocket() {
        const { WebSocketCtor, protocol, url, binaryType } = this._config;
        const observer = this._output;
        let socket = null;
        try {
            socket = protocol ? new WebSocketCtor(url, protocol) : new WebSocketCtor(url);
            this._socket = socket;
            if (binaryType) {
                this._socket.binaryType = binaryType;
            }
        }
        catch (e) {
            observer.error(e);
            return;
        }
        const subscription = new Subscription(() => {
            this._socket = null;
            if (socket && socket.readyState === 1) {
                socket.close();
            }
        });
        socket.onopen = (evt) => {
            const { _socket } = this;
            if (!_socket) {
                socket.close();
                this._resetState();
                return;
            }
            const { openObserver } = this._config;
            if (openObserver) {
                openObserver.next(evt);
            }
            const queue = this.destination;
            this.destination = Subscriber.create((x) => {
                if (socket.readyState === 1) {
                    try {
                        const { serializer } = this._config;
                        socket.send(serializer(x));
                    }
                    catch (e) {
                        this.destination.error(e);
                    }
                }
            }, (err) => {
                const { closingObserver } = this._config;
                if (closingObserver) {
                    closingObserver.next(undefined);
                }
                if (err && err.code) {
                    socket.close(err.code, err.reason);
                }
                else {
                    observer.error(new TypeError(WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT));
                }
                this._resetState();
            }, () => {
                const { closingObserver } = this._config;
                if (closingObserver) {
                    closingObserver.next(undefined);
                }
                socket.close();
                this._resetState();
            });
            if (queue && queue instanceof ReplaySubject) {
                subscription.add(queue.subscribe(this.destination));
            }
        };
        socket.onerror = (e) => {
            this._resetState();
            observer.error(e);
        };
        socket.onclose = (e) => {
            if (socket === this._socket) {
                this._resetState();
            }
            const { closeObserver } = this._config;
            if (closeObserver) {
                closeObserver.next(e);
            }
            if (e.wasClean) {
                observer.complete();
            }
            else {
                observer.error(e);
            }
        };
        socket.onmessage = (e) => {
            try {
                const { deserializer } = this._config;
                observer.next(deserializer(e));
            }
            catch (err) {
                observer.error(err);
            }
        };
    }
    _subscribe(subscriber) {
        const { source } = this;
        if (source) {
            return source.subscribe(subscriber);
        }
        if (!this._socket) {
            this._connectSocket();
        }
        this._output.subscribe(subscriber);
        subscriber.add(() => {
            const { _socket } = this;
            if (this._output.observers.length === 0) {
                if (_socket && (_socket.readyState === 1 || _socket.readyState === 0)) {
                    _socket.close();
                }
                this._resetState();
            }
        });
        return subscriber;
    }
    unsubscribe() {
        const { _socket } = this;
        if (_socket && (_socket.readyState === 1 || _socket.readyState === 0)) {
            _socket.close();
        }
        this._resetState();
        super.unsubscribe();
    }
}
//# sourceMappingURL=WebSocketSubject.js.mapimport { Observable } from '../../Observable';
import { Subscription } from '../../Subscription';
import { performanceTimestampProvider } from '../../scheduler/performanceTimestampProvider';
import { animationFrameProvider } from '../../scheduler/animationFrameProvider';
export function animationFrames(timestampProvider) {
    return timestampProvider ? animationFramesFactory(timestampProvider) : DEFAULT_ANIMATION_FRAMES;
}
function animationFramesFactory(timestampProvider) {
    const { schedule } = animationFrameProvider;
    return new Observable((subscriber) => {
        const subscription = new Subscription();
        const provider = timestampProvider || performanceTimestampProvider;
        const start = provider.now();
        const run = (timestamp) => {
            const now = provider.now();
            subscriber.next({
                timestamp: timestampProvider ? now : timestamp,
                elapsed: now - start,
            });
            if (!subscriber.closed) {
                subscription.add(schedule(run));
            }
        };
        subscription.add(schedule(run));
        return subscription;
    });
}
const DEFAULT_ANIMATION_FRAMES = animationFramesFactory();
//# sourceMappingURL=animationFrames.js.mapimport { __rest } from "tslib";
import { createOperatorSubscriber } from '../../operators/OperatorSubscriber';
import { Observable } from '../../Observable';
import { innerFrom } from '../../observable/innerFrom';
export function fromFetch(input, initWithSelector = {}) {
    const { selector } = initWithSelector, init = __rest(initWithSelector, ["selector"]);
    return new Observable((subscriber) => {
        const controller = new AbortController();
        const { signal } = controller;
        let abortable = true;
        const { signal: outerSignal } = init;
        if (outerSignal) {
            if (outerSignal.aborted) {
                controller.abort();
            }
            else {
                const outerSignalHandler = () => {
                    if (!signal.aborted) {
                        controller.abort();
                    }
                };
                outerSignal.addEventListener('abort', outerSignalHandler);
                subscriber.add(() => outerSignal.removeEventListener('abort', outerSignalHandler));
            }
        }
        const perSubscriberInit = Object.assign(Object.assign({}, init), { signal });
        const handleError = (err) => {
            abortable = false;
            subscriber.error(err);
        };
        fetch(input, perSubscriberInit)
            .then((response) => {
            if (selector) {
                innerFrom(selector(response)).subscribe(createOperatorSubscriber(subscriber, undefined, () => {
                    abortable = false;
                    subscriber.complete();
                }, handleError));
            }
            else {
                abortable = false;
                subscriber.next(response);
                subscriber.complete();
            }
        })
            .catch(handleError);
        return () => {
            if (abortable) {
                controller.abort();
            }
        };
    });
}
//# sourceMappingURL=fetch.js.mapimport { WebSocketSubject } from './WebSocketSubject';
export function webSocket(urlConfigOrSource) {
    return new WebSocketSubject(urlConfigOrSource);
}
//# sourceMappingURL=webSocket.js.mapimport { getXHRResponse } from './getXHRResponse';
export class AjaxResponse {
    constructor(originalEvent, xhr, request, type = 'download_load') {
        this.originalEvent = originalEvent;
        this.xhr = xhr;
        this.request = request;
        this.type = type;
        const { status, responseType } = xhr;
        this.status = status !== null && status !== void 0 ? status : 0;
        this.responseType = responseType !== null && responseType !== void 0 ? responseType : '';
        const allHeaders = xhr.getAllResponseHeaders();
        this.responseHeaders = allHeaders
            ?
                allHeaders.split('\n').reduce((headers, line) => {
                    const index = line.indexOf(': ');
                    headers[line.slice(0, index)] = line.slice(index + 2);
                    return headers;
                }, {})
            : {};
        this.response = getXHRResponse(xhr);
        const { loaded, total } = originalEvent;
        this.loaded = loaded;
        this.total = total;
    }
}
//# sourceMappingURL=AjaxResponse.js.mapimport { map } from '../operators/map';
import { Observable } from '../Observable';
import { AjaxResponse } from './AjaxResponse';
import { AjaxTimeoutError, AjaxError } from './errors';
function ajaxGet(url, headers) {
    return ajax({ method: 'GET', url, headers });
}
function ajaxPost(url, body, headers) {
    return ajax({ method: 'POST', url, body, headers });
}
function ajaxDelete(url, headers) {
    return ajax({ method: 'DELETE', url, headers });
}
function ajaxPut(url, body, headers) {
    return ajax({ method: 'PUT', url, body, headers });
}
function ajaxPatch(url, body, headers) {
    return ajax({ method: 'PATCH', url, body, headers });
}
const mapResponse = map((x) => x.response);
function ajaxGetJSON(url, headers) {
    return mapResponse(ajax({
        method: 'GET',
        url,
        headers,
    }));
}
export const ajax = (() => {
    const create = (urlOrConfig) => {
        const config = typeof urlOrConfig === 'string'
            ? {
                url: urlOrConfig,
            }
            : urlOrConfig;
        return fromAjax(config);
    };
    create.get = ajaxGet;
    create.post = ajaxPost;
    create.delete = ajaxDelete;
    create.put = ajaxPut;
    create.patch = ajaxPatch;
    create.getJSON = ajaxGetJSON;
    return create;
})();
const UPLOAD = 'upload';
const DOWNLOAD = 'download';
const LOADSTART = 'loadstart';
const PROGRESS = 'progress';
const LOAD = 'load';
export function fromAjax(init) {
    return new Observable((destination) => {
        var _a, _b;
        const config = Object.assign({ async: true, crossDomain: false, withCredentials: false, method: 'GET', timeout: 0, responseType: 'json' }, init);
        const { queryParams, body: configuredBody, headers: configuredHeaders } = config;
        let url = config.url;
        if (!url) {
            throw new TypeError('url is required');
        }
        if (queryParams) {
            let searchParams;
            if (url.includes('?')) {
                const parts = url.split('?');
                if (2 < parts.length) {
                    throw new TypeError('invalid url');
                }
                searchParams = new URLSearchParams(parts[1]);
                new URLSearchParams(queryParams).forEach((value, key) => searchParams.set(key, value));
                url = parts[0] + '?' + searchParams;
            }
            else {
                searchParams = new URLSearchParams(queryParams);
                url = url + '?' + searchParams;
            }
        }
        const headers = {};
        if (configuredHeaders) {
            for (const key in configuredHeaders) {
                if (configuredHeaders.hasOwnProperty(key)) {
                    headers[key.toLowerCase()] = configuredHeaders[key];
                }
            }
        }
        const crossDomain = config.crossDomain;
        if (!crossDomain && !('x-requested-with' in headers)) {
            headers['x-requested-with'] = 'XMLHttpRequest';
        }
        const { withCredentials, xsrfCookieName, xsrfHeaderName } = config;
        if ((withCredentials || !crossDomain) && xsrfCookieName && xsrfHeaderName) {
            const xsrfCookie = (_b = (_a = document === null || document === void 0 ? void 0 : document.cookie.match(new RegExp(`(^|;\\s*)(${xsrfCookieName})=([^;]*)`))) === null || _a === void 0 ? void 0 : _a.pop()) !== null && _b !== void 0 ? _b : '';
            if (xsrfCookie) {
                headers[xsrfHeaderName] = xsrfCookie;
            }
        }
        const body = extractContentTypeAndMaybeSerializeBody(configuredBody, headers);
        const _request = Object.assign(Object.assign({}, config), { url,
            headers,
            body });
        let xhr;
        xhr = init.createXHR ? init.createXHR() : new XMLHttpRequest();
        {
            const { progressSubscriber, includeDownloadProgress = false, includeUploadProgress = false } = init;
            const addErrorEvent = (type, errorFactory) => {
                xhr.addEventListener(type, () => {
                    var _a;
                    const error = errorFactory();
                    (_a = progressSubscriber === null || progressSubscriber === void 0 ? void 0 : progressSubscriber.error) === null || _a === void 0 ? void 0 : _a.call(progressSubscriber, error);
                    destination.error(error);
                });
            };
            addErrorEvent('timeout', () => new AjaxTimeoutError(xhr, _request));
            addErrorEvent('abort', () => new AjaxError('aborted', xhr, _request));
            const createResponse = (direction, event) => new AjaxResponse(event, xhr, _request, `${direction}_${event.type}`);
            const addProgressEvent = (target, type, direction) => {
                target.addEventListener(type, (event) => {
                    destination.next(createResponse(direction, event));
                });
            };
            if (includeUploadProgress) {
                [LOADSTART, PROGRESS, LOAD].forEach((type) => addProgressEvent(xhr.upload, type, UPLOAD));
            }
            if (progressSubscriber) {
                [LOADSTART, PROGRESS].forEach((type) => xhr.upload.addEventListener(type, (e) => { var _a; return (_a = progressSubscriber === null || progressSubscriber === void 0 ? void 0 : progressSubscriber.next) === null || _a === void 0 ? void 0 : _a.call(progressSubscriber, e); }));
            }
            if (includeDownloadProgress) {
                [LOADSTART, PROGRESS].forEach((type) => addProgressEvent(xhr, type, DOWNLOAD));
            }
            const emitError = (status) => {
                const msg = 'ajax error' + (status ? ' ' + status : '');
                destination.error(new AjaxError(msg, xhr, _request));
            };
            xhr.addEventListener('error', (e) => {
                var _a;
                (_a = progressSubscriber === null || progressSubscriber === void 0 ? void 0 : progressSubscriber.error) === null || _a === void 0 ? void 0 : _a.call(progressSubscriber, e);
                emitError();
            });
            xhr.addEventListener(LOAD, (event) => {
                var _a, _b;
                const { status } = xhr;
                if (status < 400) {
                    (_a = progressSubscriber === null || progressSubscriber === void 0 ? void 0 : progressSubscriber.complete) === null || _a === void 0 ? void 0 : _a.call(progressSubscriber);
                    let response;
                    try {
                        response = createResponse(DOWNLOAD, event);
                    }
                    catch (err) {
                        destination.error(err);
                        return;
                    }
                    destination.next(response);
                    destination.complete();
                }
                else {
                    (_b = progressSubscriber === null || progressSubscriber === void 0 ? void 0 : progressSubscriber.error) === null || _b === void 0 ? void 0 : _b.call(progressSubscriber, event);
                    emitError(status);
                }
            });
        }
        const { user, method, async } = _request;
        if (user) {
            xhr.open(method, url, async, user, _request.password);
        }
        else {
            xhr.open(method, url, async);
        }
        if (async) {
            xhr.timeout = _request.timeout;
            xhr.responseType = _request.responseType;
        }
        if ('withCredentials' in xhr) {
            xhr.withCredentials = _request.withCredentials;
        }
        for (const key in headers) {
            if (headers.hasOwnProperty(key)) {
                xhr.setRequestHeader(key, headers[key]);
            }
        }
        if (body) {
            xhr.send(body);
        }
        else {
            xhr.send();
        }
        return () => {
            if (xhr && xhr.readyState !== 4) {
                xhr.abort();
            }
        };
    });
}
function extractContentTypeAndMaybeSerializeBody(body, headers) {
    var _a;
    if (!body ||
        typeof body === 'string' ||
        isFormData(body) ||
        isURLSearchParams(body) ||
        isArrayBuffer(body) ||
        isFile(body) ||
        isBlob(body) ||
        isReadableStream(body)) {
        return body;
    }
    if (isArrayBufferView(body)) {
        return body.buffer;
    }
    if (typeof body === 'object') {
        headers['content-type'] = (_a = headers['content-type']) !== null && _a !== void 0 ? _a : 'application/json;charset=utf-8';
        return JSON.stringify(body);
    }
    throw new TypeError('Unknown body type');
}
const _toString = Object.prototype.toString;
function toStringCheck(obj, name) {
    return _toString.call(obj) === `[object ${name}]`;
}
function isArrayBuffer(body) {
    return toStringCheck(body, 'ArrayBuffer');
}
function isFile(body) {
    return toStringCheck(body, 'File');
}
function isBlob(body) {
    return toStringCheck(body, 'Blob');
}
function isArrayBufferView(body) {
    return typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView(body);
}
function isFormData(body) {
    return typeof FormData !== 'undefined' && body instanceof FormData;
}
function isURLSearchParams(body) {
    return typeof URLSearchParams !== 'undefined' && body instanceof URLSearchParams;
}
function isReadableStream(body) {
    return typeof ReadableStream !== 'undefined' && body instanceof ReadableStream;
}
//# sourceMappingURL=ajax.js.mapimport { getXHRResponse } from './getXHRResponse';
import { createErrorClass } from '../util/createErrorClass';
export const AjaxError = createErrorClass((_super) => function AjaxErrorImpl(message, xhr, request) {
    this.message = message;
    this.name = 'AjaxError';
    this.xhr = xhr;
    this.request = request;
    this.status = xhr.status;
    this.responseType = xhr.responseType;
    let response;
    try {
        response = getXHRResponse(xhr);
    }
    catch (err) {
        response = xhr.responseText;
    }
    this.response = response;
});
export const AjaxTimeoutError = (() => {
    function AjaxTimeoutErrorImpl(xhr, request) {
        AjaxError.call(this, 'ajax timeout', xhr, request);
        this.name = 'AjaxTimeoutError';
        return this;
    }
    AjaxTimeoutErrorImpl.prototype = Object.create(AjaxError.prototype);
    return AjaxTimeoutErrorImpl;
})();
//# sourceMappingURL=errors.js.mapexport function getXHRResponse(xhr) {
    switch (xhr.responseType) {
        case 'json': {
            if ('response' in xhr) {
                return xhr.response;
            }
            else {
                const ieXHR = xhr;
                return JSON.parse(ieXHR.responseText);
            }
        }
        case 'document':
            return xhr.responseXML;
        case 'text':
        default: {
            if ('response' in xhr) {
                return xhr.response;
            }
            else {
                const ieXHR = xhr;
                return ieXHR.responseText;
            }
        }
    }
}
//# sourceMappingURL=getXHRResponse.js.mapexport {};
//# sourceMappingURL=types.js.mapexport { fromFetch } from '../internal/observable/dom/fetch';
//# sourceMappingURL=index.js.mapexport { ajax } from '../internal/ajax/ajax';
export { AjaxError, AjaxTimeoutError } from '../internal/ajax/errors';
export { AjaxResponse } from '../internal/ajax/AjaxResponse';
//# sourceMappingURL=index.js.map"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.interval = exports.iif = exports.generate = exports.fromEventPattern = exports.fromEvent = exports.from = exports.forkJoin = exports.empty = exports.defer = exports.connectable = exports.concat = exports.combineLatest = exports.bindNodeCallback = exports.bindCallback = exports.UnsubscriptionError = exports.TimeoutError = exports.SequenceError = exports.ObjectUnsubscribedError = exports.NotFoundError = exports.EmptyError = exports.ArgumentOutOfRangeError = exports.firstValueFrom = exports.lastValueFrom = exports.isObservable = exports.identity = exports.noop = exports.pipe = exports.NotificationKind = exports.Notification = exports.Subscriber = exports.Subscription = exports.Scheduler = exports.VirtualAction = exports.VirtualTimeScheduler = exports.animationFrameScheduler = exports.animationFrame = exports.queueScheduler = exports.queue = exports.asyncScheduler = exports.async = exports.asapScheduler = exports.asap = exports.AsyncSubject = exports.ReplaySubject = exports.BehaviorSubject = exports.Subject = exports.animationFrames = exports.observable = exports.ConnectableObservable = exports.Observable = void 0;
exports.filter = exports.expand = exports.exhaustMap = exports.exhaustAll = exports.exhaust = exports.every = exports.endWith = exports.elementAt = exports.distinctUntilKeyChanged = exports.distinctUntilChanged = exports.distinct = exports.dematerialize = exports.delayWhen = exports.delay = exports.defaultIfEmpty = exports.debounceTime = exports.debounce = exports.count = exports.connect = exports.concatWith = exports.concatMapTo = exports.concatMap = exports.concatAll = exports.combineLatestWith = exports.combineLatestAll = exports.combineAll = exports.catchError = exports.bufferWhen = exports.bufferToggle = exports.bufferTime = exports.bufferCount = exports.buffer = exports.auditTime = exports.audit = exports.config = exports.NEVER = exports.EMPTY = exports.scheduled = exports.zip = exports.using = exports.timer = exports.throwError = exports.range = exports.race = exports.partition = exports.pairs = exports.onErrorResumeNext = exports.of = exports.never = exports.merge = void 0;
exports.switchMapTo = exports.switchMap = exports.switchAll = exports.subscribeOn = exports.startWith = exports.skipWhile = exports.skipUntil = exports.skipLast = exports.skip = exports.single = exports.shareReplay = exports.share = exports.sequenceEqual = exports.scan = exports.sampleTime = exports.sample = exports.refCount = exports.retryWhen = exports.retry = exports.repeatWhen = exports.repeat = exports.reduce = exports.raceWith = exports.publishReplay = exports.publishLast = exports.publishBehavior = exports.publish = exports.pluck = exports.pairwise = exports.observeOn = exports.multicast = exports.min = exports.mergeWith = exports.mergeScan = exports.mergeMapTo = exports.mergeMap = exports.flatMap = exports.mergeAll = exports.max = exports.materialize = exports.mapTo = exports.map = exports.last = exports.isEmpty = exports.ignoreElements = exports.groupBy = exports.first = exports.findIndex = exports.find = exports.finalize = void 0;
exports.zipWith = exports.zipAll = exports.withLatestFrom = exports.windowWhen = exports.windowToggle = exports.windowTime = exports.windowCount = exports.window = exports.toArray = exports.timestamp = exports.timeoutWith = exports.timeout = exports.timeInterval = exports.throwIfEmpty = exports.throttleTime = exports.throttle = exports.tap = exports.takeWhile = exports.takeUntil = exports.takeLast = exports.take = exports.switchScan = void 0;
var Observable_1 = require("./internal/Observable");
Object.defineProperty(exports, "Observable", { enumerable: true, get: function () { return Observable_1.Observable; } });
var ConnectableObservable_1 = require("./internal/observable/ConnectableObservable");
Object.defineProperty(exports, "ConnectableObservable", { enumerable: true, get: function () { return ConnectableObservable_1.ConnectableObservable; } });
var observable_1 = require("./internal/symbol/observable");
Object.defineProperty(exports, "observable", { enumerable: true, get: function () { return observable_1.observable; } });
var animationFrames_1 = require("./internal/observable/dom/animationFrames");
Object.defineProperty(exports, "animationFrames", { enumerable: true, get: function () { return animationFrames_1.animationFrames; } });
var Subject_1 = require("./internal/Subject");
Object.defineProperty(exports, "Subject", { enumerable: true, get: function () { return Subject_1.Subject; } });
var BehaviorSubject_1 = require("./internal/BehaviorSubject");
Object.defineProperty(exports, "BehaviorSubject", { enumerable: true, get: function () { return BehaviorSubject_1.BehaviorSubject; } });
var ReplaySubject_1 = require("./internal/ReplaySubject");
Object.defineProperty(exports, "ReplaySubject", { enumerable: true, get: function () { return ReplaySubject_1.ReplaySubject; } });
var AsyncSubject_1 = require("./internal/AsyncSubject");
Object.defineProperty(exports, "AsyncSubject", { enumerable: true, get: function () { return AsyncSubject_1.AsyncSubject; } });
var asap_1 = require("./internal/scheduler/asap");
Object.defineProperty(exports, "asap", { enumerable: true, get: function () { return asap_1.asap; } });
Object.defineProperty(exports, "asapScheduler", { enumerable: true, get: function () { return asap_1.asapScheduler; } });
var async_1 = require("./internal/scheduler/async");
Object.defineProperty(exports, "async", { enumerable: true, get: function () { return async_1.async; } });
Object.defineProperty(exports, "asyncScheduler", { enumerable: true, get: function () { return async_1.asyncScheduler; } });
var queue_1 = require("./internal/scheduler/queue");
Object.defineProperty(exports, "queue", { enumerable: true, get: function () { return queue_1.queue; } });
Object.defineProperty(exports, "queueScheduler", { enumerable: true, get: function () { return queue_1.queueScheduler; } });
var animationFrame_1 = require("./internal/scheduler/animationFrame");
Object.defineProperty(exports, "animationFrame", { enumerable: true, get: function () { return animationFrame_1.animationFrame; } });
Object.defineProperty(exports, "animationFrameScheduler", { enumerable: true, get: function () { return animationFrame_1.animationFrameScheduler; } });
var VirtualTimeScheduler_1 = require("./internal/scheduler/VirtualTimeScheduler");
Object.defineProperty(exports, "VirtualTimeScheduler", { enumerable: true, get: function () { return VirtualTimeScheduler_1.VirtualTimeScheduler; } });
Object.defineProperty(exports, "VirtualAction", { enumerable: true, get: function () { return VirtualTimeScheduler_1.VirtualAction; } });
var Scheduler_1 = require("./internal/Scheduler");
Object.defineProperty(exports, "Scheduler", { enumerable: true, get: function () { return Scheduler_1.Scheduler; } });
var Subscription_1 = require("./internal/Subscription");
Object.defineProperty(exports, "Subscription", { enumerable: true, get: function () { return Subscription_1.Subscription; } });
var Subscriber_1 = require("./internal/Subscriber");
Object.defineProperty(exports, "Subscriber", { enumerable: true, get: function () { return Subscriber_1.Subscriber; } });
var Notification_1 = require("./internal/Notification");
Object.defineProperty(exports, "Notification", { enumerable: true, get: function () { return Notification_1.Notification; } });
Object.defineProperty(exports, "NotificationKind", { enumerable: true, get: function () { return Notification_1.NotificationKind; } });
var pipe_1 = require("./internal/util/pipe");
Object.defineProperty(exports, "pipe", { enumerable: true, get: function () { return pipe_1.pipe; } });
var noop_1 = require("./internal/util/noop");
Object.defineProperty(exports, "noop", { enumerable: true, get: function () { return noop_1.noop; } });
var identity_1 = require("./internal/util/identity");
Object.defineProperty(exports, "identity", { enumerable: true, get: function () { return identity_1.identity; } });
var isObservable_1 = require("./internal/util/isObservable");
Object.defineProperty(exports, "isObservable", { enumerable: true, get: function () { return isObservable_1.isObservable; } });
var lastValueFrom_1 = require("./internal/lastValueFrom");
Object.defineProperty(exports, "lastValueFrom", { enumerable: true, get: function () { return lastValueFrom_1.lastValueFrom; } });
var firstValueFrom_1 = require("./internal/firstValueFrom");
Object.defineProperty(exports, "firstValueFrom", { enumerable: true, get: function () { return firstValueFrom_1.firstValueFrom; } });
var ArgumentOutOfRangeError_1 = require("./internal/util/ArgumentOutOfRangeError");
Object.defineProperty(exports, "ArgumentOutOfRangeError", { enumerable: true, get: function () { return ArgumentOutOfRangeError_1.ArgumentOutOfRangeError; } });
var EmptyError_1 = require("./internal/util/EmptyError");
Object.defineProperty(exports, "EmptyError", { enumerable: true, get: function () { return EmptyError_1.EmptyError; } });
var NotFoundError_1 = require("./internal/util/NotFoundError");
Object.defineProperty(exports, "NotFoundError", { enumerable: true, get: function () { return NotFoundError_1.NotFoundError; } });
var ObjectUnsubscribedError_1 = require("./internal/util/ObjectUnsubscribedError");
Object.defineProperty(exports, "ObjectUnsubscribedError", { enumerable: true, get: function () { return ObjectUnsubscribedError_1.ObjectUnsubscribedError; } });
var SequenceError_1 = require("./internal/util/SequenceError");
Object.defineProperty(exports, "SequenceError", { enumerable: true, get: function () { return SequenceError_1.SequenceError; } });
var timeout_1 = require("./internal/operators/timeout");
Object.defineProperty(exports, "TimeoutError", { enumerable: true, get: function () { return timeout_1.TimeoutError; } });
var UnsubscriptionError_1 = require("./internal/util/UnsubscriptionError");
Object.defineProperty(exports, "UnsubscriptionError", { enumerable: true, get: function () { return UnsubscriptionError_1.UnsubscriptionError; } });
var bindCallback_1 = require("./internal/observable/bindCallback");
Object.defineProperty(exports, "bindCallback", { enumerable: true, get: function () { return bindCallback_1.bindCallback; } });
var bindNodeCallback_1 = require("./internal/observable/bindNodeCallback");
Object.defineProperty(exports, "bindNodeCallback", { enumerable: true, get: function () { return bindNodeCallback_1.bindNodeCallback; } });
var combineLatest_1 = require("./internal/observable/combineLatest");
Object.defineProperty(exports, "combineLatest", { enumerable: true, get: function () { return combineLatest_1.combineLatest; } });
var concat_1 = require("./internal/observable/concat");
Object.defineProperty(exports, "concat", { enumerable: true, get: function () { return concat_1.concat; } });
var connectable_1 = require("./internal/observable/connectable");
Object.defineProperty(exports, "connectable", { enumerable: true, get: function () { return connectable_1.connectable; } });
var defer_1 = require("./internal/observable/defer");
Object.defineProperty(exports, "defer", { enumerable: true, get: function () { return defer_1.defer; } });
var empty_1 = require("./internal/observable/empty");
Object.defineProperty(exports, "empty", { enumerable: true, get: function () { return empty_1.empty; } });
var forkJoin_1 = require("./internal/observable/forkJoin");
Object.defineProperty(exports, "forkJoin", { enumerable: true, get: function () { return forkJoin_1.forkJoin; } });
var from_1 = require("./internal/observable/from");
Object.defineProperty(exports, "from", { enumerable: true, get: function () { return from_1.from; } });
var fromEvent_1 = require("./internal/observable/fromEvent");
Object.defineProperty(exports, "fromEvent", { enumerable: true, get: function () { return fromEvent_1.fromEvent; } });
var fromEventPattern_1 = require("./internal/observable/fromEventPattern");
Object.defineProperty(exports, "fromEventPattern", { enumerable: true, get: function () { return fromEventPattern_1.fromEventPattern; } });
var generate_1 = require("./internal/observable/generate");
Object.defineProperty(exports, "generate", { enumerable: true, get: function () { return generate_1.generate; } });
var iif_1 = require("./internal/observable/iif");
Object.defineProperty(exports, "iif", { enumerable: true, get: function () { return iif_1.iif; } });
var interval_1 = require("./internal/observable/interval");
Object.defineProperty(exports, "interval", { enumerable: true, get: function () { return interval_1.interval; } });
var merge_1 = require("./internal/observable/merge");
Object.defineProperty(exports, "merge", { enumerable: true, get: function () { return merge_1.merge; } });
var never_1 = require("./internal/observable/never");
Object.defineProperty(exports, "never", { enumerable: true, get: function () { return never_1.never; } });
var of_1 = require("./internal/observable/of");
Object.defineProperty(exports, "of", { enumerable: true, get: function () { return of_1.of; } });
var onErrorResumeNext_1 = require("./internal/observable/onErrorResumeNext");
Object.defineProperty(exports, "onErrorResumeNext", { enumerable: true, get: function () { return onErrorResumeNext_1.onErrorResumeNext; } });
var pairs_1 = require("./internal/observable/pairs");
Object.defineProperty(exports, "pairs", { enumerable: true, get: function () { return pairs_1.pairs; } });
var partition_1 = require("./internal/observable/partition");
Object.defineProperty(exports, "partition", { enumerable: true, get: function () { return partition_1.partition; } });
var race_1 = require("./internal/observable/race");
Object.defineProperty(exports, "race", { enumerable: true, get: function () { return race_1.race; } });
var range_1 = require("./internal/observable/range");
Object.defineProperty(exports, "range", { enumerable: true, get: function () { return range_1.range; } });
var throwError_1 = require("./internal/observable/throwError");
Object.defineProperty(exports, "throwError", { enumerable: true, get: function () { return throwError_1.throwError; } });
var timer_1 = require("./internal/observable/timer");
Object.defineProperty(exports, "timer", { enumerable: true, get: function () { return timer_1.timer; } });
var using_1 = require("./internal/observable/using");
Object.defineProperty(exports, "using", { enumerable: true, get: function () { return using_1.using; } });
var zip_1 = require("./internal/observable/zip");
Object.defineProperty(exports, "zip", { enumerable: true, get: function () { return zip_1.zip; } });
var scheduled_1 = require("./internal/scheduled/scheduled");
Object.defineProperty(exports, "scheduled", { enumerable: true, get: function () { return scheduled_1.scheduled; } });
var empty_2 = require("./internal/observable/empty");
Object.defineProperty(exports, "EMPTY", { enumerable: true, get: function () { return empty_2.EMPTY; } });
var never_2 = require("./internal/observable/never");
Object.defineProperty(exports, "NEVER", { enumerable: true, get: function () { return never_2.NEVER; } });
__exportStar(require("./internal/types"), exports);
var config_1 = require("./internal/config");
Object.defineProperty(exports, "config", { enumerable: true, get: function () { return config_1.config; } });
var audit_1 = require("./internal/operators/audit");
Object.defineProperty(exports, "audit", { enumerable: true, get: function () { return audit_1.audit; } });
var auditTime_1 = require("./internal/operators/auditTime");
Object.defineProperty(exports, "auditTime", { enumerable: true, get: function () { return auditTime_1.auditTime; } });
var buffer_1 = require("./internal/operators/buffer");
Object.defineProperty(exports, "buffer", { enumerable: true, get: function () { return buffer_1.buffer; } });
var bufferCount_1 = require("./internal/operators/bufferCount");
Object.defineProperty(exports, "bufferCount", { enumerable: true, get: function () { return bufferCount_1.bufferCount; } });
var bufferTime_1 = require("./internal/operators/bufferTime");
Object.defineProperty(exports, "bufferTime", { enumerable: true, get: function () { return bufferTime_1.bufferTime; } });
var bufferToggle_1 = require("./internal/operators/bufferToggle");
Object.defineProperty(exports, "bufferToggle", { enumerable: true, get: function () { return bufferToggle_1.bufferToggle; } });
var bufferWhen_1 = require("./internal/operators/bufferWhen");
Object.defineProperty(exports, "bufferWhen", { enumerable: true, get: function () { return bufferWhen_1.bufferWhen; } });
var catchError_1 = require("./internal/operators/catchError");
Object.defineProperty(exports, "catchError", { enumerable: true, get: function () { return catchError_1.catchError; } });
var combineAll_1 = require("./internal/operators/combineAll");
Object.defineProperty(exports, "combineAll", { enumerable: true, get: function () { return combineAll_1.combineAll; } });
var combineLatestAll_1 = require("./internal/operators/combineLatestAll");
Object.defineProperty(exports, "combineLatestAll", { enumerable: true, get: function () { return combineLatestAll_1.combineLatestAll; } });
var combineLatestWith_1 = require("./internal/operators/combineLatestWith");
Object.defineProperty(exports, "combineLatestWith", { enumerable: true, get: function () { return combineLatestWith_1.combineLatestWith; } });
var concatAll_1 = require("./internal/operators/concatAll");
Object.defineProperty(exports, "concatAll", { enumerable: true, get: function () { return concatAll_1.concatAll; } });
var concatMap_1 = require("./internal/operators/concatMap");
Object.defineProperty(exports, "concatMap", { enumerable: true, get: function () { return concatMap_1.concatMap; } });
var concatMapTo_1 = require("./internal/operators/concatMapTo");
Object.defineProperty(exports, "concatMapTo", { enumerable: true, get: function () { return concatMapTo_1.concatMapTo; } });
var concatWith_1 = require("./internal/operators/concatWith");
Object.defineProperty(exports, "concatWith", { enumerable: true, get: function () { return concatWith_1.concatWith; } });
var connect_1 = require("./internal/operators/connect");
Object.defineProperty(exports, "connect", { enumerable: true, get: function () { return connect_1.connect; } });
var count_1 = require("./internal/operators/count");
Object.defineProperty(exports, "count", { enumerable: true, get: function () { return count_1.count; } });
var debounce_1 = require("./internal/operators/debounce");
Object.defineProperty(exports, "debounce", { enumerable: true, get: function () { return debounce_1.debounce; } });
var debounceTime_1 = require("./internal/operators/debounceTime");
Object.defineProperty(exports, "debounceTime", { enumerable: true, get: function () { return debounceTime_1.debounceTime; } });
var defaultIfEmpty_1 = require("./internal/operators/defaultIfEmpty");
Object.defineProperty(exports, "defaultIfEmpty", { enumerable: true, get: function () { return defaultIfEmpty_1.defaultIfEmpty; } });
var delay_1 = require("./internal/operators/delay");
Object.defineProperty(exports, "delay", { enumerable: true, get: function () { return delay_1.delay; } });
var delayWhen_1 = require("./internal/operators/delayWhen");
Object.defineProperty(exports, "delayWhen", { enumerable: true, get: function () { return delayWhen_1.delayWhen; } });
var dematerialize_1 = require("./internal/operators/dematerialize");
Object.defineProperty(exports, "dematerialize", { enumerable: true, get: function () { return dematerialize_1.dematerialize; } });
var distinct_1 = require("./internal/operators/distinct");
Object.defineProperty(exports, "distinct", { enumerable: true, get: function () { return distinct_1.distinct; } });
var distinctUntilChanged_1 = require("./internal/operators/distinctUntilChanged");
Object.defineProperty(exports, "distinctUntilChanged", { enumerable: true, get: function () { return distinctUntilChanged_1.distinctUntilChanged; } });
var distinctUntilKeyChanged_1 = require("./internal/operators/distinctUntilKeyChanged");
Object.defineProperty(exports, "distinctUntilKeyChanged", { enumerable: true, get: function () { return distinctUntilKeyChanged_1.distinctUntilKeyChanged; } });
var elementAt_1 = require("./internal/operators/elementAt");
Object.defineProperty(exports, "elementAt", { enumerable: true, get: function () { return elementAt_1.elementAt; } });
var endWith_1 = require("./internal/operators/endWith");
Object.defineProperty(exports, "endWith", { enumerable: true, get: function () { return endWith_1.endWith; } });
var every_1 = require("./internal/operators/every");
Object.defineProperty(exports, "every", { enumerable: true, get: function () { return every_1.every; } });
var exhaust_1 = require("./internal/operators/exhaust");
Object.defineProperty(exports, "exhaust", { enumerable: true, get: function () { return exhaust_1.exhaust; } });
var exhaustAll_1 = require("./internal/operators/exhaustAll");
Object.defineProperty(exports, "exhaustAll", { enumerable: true, get: function () { return exhaustAll_1.exhaustAll; } });
var exhaustMap_1 = require("./internal/operators/exhaustMap");
Object.defineProperty(exports, "exhaustMap", { enumerable: true, get: function () { return exhaustMap_1.exhaustMap; } });
var expand_1 = require("./internal/operators/expand");
Object.defineProperty(exports, "expand", { enumerable: true, get: function () { return expand_1.expand; } });
var filter_1 = require("./internal/operators/filter");
Object.defineProperty(exports, "filter", { enumerable: true, get: function () { return filter_1.filter; } });
var finalize_1 = require("./internal/operators/finalize");
Object.defineProperty(exports, "finalize", { enumerable: true, get: function () { return finalize_1.finalize; } });
var find_1 = require("./internal/operators/find");
Object.defineProperty(exports, "find", { enumerable: true, get: function () { return find_1.find; } });
var findIndex_1 = require("./internal/operators/findIndex");
Object.defineProperty(exports, "findIndex", { enumerable: true, get: function () { return findIndex_1.findIndex; } });
var first_1 = require("./internal/operators/first");
Object.defineProperty(exports, "first", { enumerable: true, get: function () { return first_1.first; } });
var groupBy_1 = require("./internal/operators/groupBy");
Object.defineProperty(exports, "groupBy", { enumerable: true, get: function () { return groupBy_1.groupBy; } });
var ignoreElements_1 = require("./internal/operators/ignoreElements");
Object.defineProperty(exports, "ignoreElements", { enumerable: true, get: function () { return ignoreElements_1.ignoreElements; } });
var isEmpty_1 = require("./internal/operators/isEmpty");
Object.defineProperty(exports, "isEmpty", { enumerable: true, get: function () { return isEmpty_1.isEmpty; } });
var last_1 = require("./internal/operators/last");
Object.defineProperty(exports, "last", { enumerable: true, get: function () { return last_1.last; } });
var map_1 = require("./internal/operators/map");
Object.defineProperty(exports, "map", { enumerable: true, get: function () { return map_1.map; } });
var mapTo_1 = require("./internal/operators/mapTo");
Object.defineProperty(exports, "mapTo", { enumerable: true, get: function () { return mapTo_1.mapTo; } });
var materialize_1 = require("./internal/operators/materialize");
Object.defineProperty(exports, "materialize", { enumerable: true, get: function () { return materialize_1.materialize; } });
var max_1 = require("./internal/operators/max");
Object.defineProperty(exports, "max", { enumerable: true, get: function () { return max_1.max; } });
var mergeAll_1 = require("./internal/operators/mergeAll");
Object.defineProperty(exports, "mergeAll", { enumerable: true, get: function () { return mergeAll_1.mergeAll; } });
var flatMap_1 = require("./internal/operators/flatMap");
Object.defineProperty(exports, "flatMap", { enumerable: true, get: function () { return flatMap_1.flatMap; } });
var mergeMap_1 = require("./internal/operators/mergeMap");
Object.defineProperty(exports, "mergeMap", { enumerable: true, get: function () { return mergeMap_1.mergeMap; } });
var mergeMapTo_1 = require("./internal/operators/mergeMapTo");
Object.defineProperty(exports, "mergeMapTo", { enumerable: true, get: function () { return mergeMapTo_1.mergeMapTo; } });
var mergeScan_1 = require("./internal/operators/mergeScan");
Object.defineProperty(exports, "mergeScan", { enumerable: true, get: function () { return mergeScan_1.mergeScan; } });
var mergeWith_1 = require("./internal/operators/mergeWith");
Object.defineProperty(exports, "mergeWith", { enumerable: true, get: function () { return mergeWith_1.mergeWith; } });
var min_1 = require("./internal/operators/min");
Object.defineProperty(exports, "min", { enumerable: true, get: function () { return min_1.min; } });
var multicast_1 = require("./internal/operators/multicast");
Object.defineProperty(exports, "multicast", { enumerable: true, get: function () { return multicast_1.multicast; } });
var observeOn_1 = require("./internal/operators/observeOn");
Object.defineProperty(exports, "observeOn", { enumerable: true, get: function () { return observeOn_1.observeOn; } });
var pairwise_1 = require("./internal/operators/pairwise");
Object.defineProperty(exports, "pairwise", { enumerable: true, get: function () { return pairwise_1.pairwise; } });
var pluck_1 = require("./internal/operators/pluck");
Object.defineProperty(exports, "pluck", { enumerable: true, get: function () { return pluck_1.pluck; } });
var publish_1 = require("./internal/operators/publish");
Object.defineProperty(exports, "publish", { enumerable: true, get: function () { return publish_1.publish; } });
var publishBehavior_1 = require("./internal/operators/publishBehavior");
Object.defineProperty(exports, "publishBehavior", { enumerable: true, get: function () { return publishBehavior_1.publishBehavior; } });
var publishLast_1 = require("./internal/operators/publishLast");
Object.defineProperty(exports, "publishLast", { enumerable: true, get: function () { return publishLast_1.publishLast; } });
var publishReplay_1 = require("./internal/operators/publishReplay");
Object.defineProperty(exports, "publishReplay", { enumerable: true, get: function () { return publishReplay_1.publishReplay; } });
var raceWith_1 = require("./internal/operators/raceWith");
Object.defineProperty(exports, "raceWith", { enumerable: true, get: function () { return raceWith_1.raceWith; } });
var reduce_1 = require("./internal/operators/reduce");
Object.defineProperty(exports, "reduce", { enumerable: true, get: function () { return reduce_1.reduce; } });
var repeat_1 = require("./internal/operators/repeat");
Object.defineProperty(exports, "repeat", { enumerable: true, get: function () { return repeat_1.repeat; } });
var repeatWhen_1 = require("./internal/operators/repeatWhen");
Object.defineProperty(exports, "repeatWhen", { enumerable: true, get: function () { return repeatWhen_1.repeatWhen; } });
var retry_1 = require("./internal/operators/retry");
Object.defineProperty(exports, "retry", { enumerable: true, get: function () { return retry_1.retry; } });
var retryWhen_1 = require("./internal/operators/retryWhen");
Object.defineProperty(exports, "retryWhen", { enumerable: true, get: function () { return retryWhen_1.retryWhen; } });
var refCount_1 = require("./internal/operators/refCount");
Object.defineProperty(exports, "refCount", { enumerable: true, get: function () { return refCount_1.refCount; } });
var sample_1 = require("./internal/operators/sample");
Object.defineProperty(exports, "sample", { enumerable: true, get: function () { return sample_1.sample; } });
var sampleTime_1 = require("./internal/operators/sampleTime");
Object.defineProperty(exports, "sampleTime", { enumerable: true, get: function () { return sampleTime_1.sampleTime; } });
var scan_1 = require("./internal/operators/scan");
Object.defineProperty(exports, "scan", { enumerable: true, get: function () { return scan_1.scan; } });
var sequenceEqual_1 = require("./internal/operators/sequenceEqual");
Object.defineProperty(exports, "sequenceEqual", { enumerable: true, get: function () { return sequenceEqual_1.sequenceEqual; } });
var share_1 = require("./internal/operators/share");
Object.defineProperty(exports, "share", { enumerable: true, get: function () { return share_1.share; } });
var shareReplay_1 = require("./internal/operators/shareReplay");
Object.defineProperty(exports, "shareReplay", { enumerable: true, get: function () { return shareReplay_1.shareReplay; } });
var single_1 = require("./internal/operators/single");
Object.defineProperty(exports, "single", { enumerable: true, get: function () { return single_1.single; } });
var skip_1 = require("./internal/operators/skip");
Object.defineProperty(exports, "skip", { enumerable: true, get: function () { return skip_1.skip; } });
var skipLast_1 = require("./internal/operators/skipLast");
Object.defineProperty(exports, "skipLast", { enumerable: true, get: function () { return skipLast_1.skipLast; } });
var skipUntil_1 = require("./internal/operators/skipUntil");
Object.defineProperty(exports, "skipUntil", { enumerable: true, get: function () { return skipUntil_1.skipUntil; } });
var skipWhile_1 = require("./internal/operators/skipWhile");
Object.defineProperty(exports, "skipWhile", { enumerable: true, get: function () { return skipWhile_1.skipWhile; } });
var startWith_1 = require("./internal/operators/startWith");
Object.defineProperty(exports, "startWith", { enumerable: true, get: function () { return startWith_1.startWith; } });
var subscribeOn_1 = require("./internal/operators/subscribeOn");
Object.defineProperty(exports, "subscribeOn", { enumerable: true, get: function () { return subscribeOn_1.subscribeOn; } });
var switchAll_1 = require("./internal/operators/switchAll");
Object.defineProperty(exports, "switchAll", { enumerable: true, get: function () { return switchAll_1.switchAll; } });
var switchMap_1 = require("./internal/operators/switchMap");
Object.defineProperty(exports, "switchMap", { enumerable: true, get: function () { return switchMap_1.switchMap; } });
var switchMapTo_1 = require("./internal/operators/switchMapTo");
Object.defineProperty(exports, "switchMapTo", { enumerable: true, get: function () { return switchMapTo_1.switchMapTo; } });
var switchScan_1 = require("./internal/operators/switchScan");
Object.defineProperty(exports, "switchScan", { enumerable: true, get: function () { return switchScan_1.switchScan; } });
var take_1 = require("./internal/operators/take");
Object.defineProperty(exports, "take", { enumerable: true, get: function () { return take_1.take; } });
var takeLast_1 = require("./internal/operators/takeLast");
Object.defineProperty(exports, "takeLast", { enumerable: true, get: function () { return takeLast_1.takeLast; } });
var takeUntil_1 = require("./internal/operators/takeUntil");
Object.defineProperty(exports, "takeUntil", { enumerable: true, get: function () { return takeUntil_1.takeUntil; } });
var takeWhile_1 = require("./internal/operators/takeWhile");
Object.defineProperty(exports, "takeWhile", { enumerable: true, get: function () { return takeWhile_1.takeWhile; } });
var tap_1 = require("./internal/operators/tap");
Object.defineProperty(exports, "tap", { enumerable: true, get: function () { return tap_1.tap; } });
var throttle_1 = require("./internal/operators/throttle");
Object.defineProperty(exports, "throttle", { enumerable: true, get: function () { return throttle_1.throttle; } });
var throttleTime_1 = require("./internal/operators/throttleTime");
Object.defineProperty(exports, "throttleTime", { enumerable: true, get: function () { return throttleTime_1.throttleTime; } });
var throwIfEmpty_1 = require("./internal/operators/throwIfEmpty");
Object.defineProperty(exports, "throwIfEmpty", { enumerable: true, get: function () { return throwIfEmpty_1.throwIfEmpty; } });
var timeInterval_1 = require("./internal/operators/timeInterval");
Object.defineProperty(exports, "timeInterval", { enumerable: true, get: function () { return timeInterval_1.timeInterval; } });
var timeout_2 = require("./internal/operators/timeout");
Object.defineProperty(exports, "timeout", { enumerable: true, get: function () { return timeout_2.timeout; } });
var timeoutWith_1 = require("./internal/operators/timeoutWith");
Object.defineProperty(exports, "timeoutWith", { enumerable: true, get: function () { return timeoutWith_1.timeoutWith; } });
var timestamp_1 = require("./internal/operators/timestamp");
Object.defineProperty(exports, "timestamp", { enumerable: true, get: function () { return timestamp_1.timestamp; } });
var toArray_1 = require("./internal/operators/toArray");
Object.defineProperty(exports, "toArray", { enumerable: true, get: function () { return toArray_1.toArray; } });
var window_1 = require("./internal/operators/window");
Object.defineProperty(exports, "window", { enumerable: true, get: function () { return window_1.window; } });
var windowCount_1 = require("./internal/operators/windowCount");
Object.defineProperty(exports, "windowCount", { enumerable: true, get: function () { return windowCount_1.windowCount; } });
var windowTime_1 = require("./internal/operators/windowTime");
Object.defineProperty(exports, "windowTime", { enumerable: true, get: function () { return windowTime_1.windowTime; } });
var windowToggle_1 = require("./internal/operators/windowToggle");
Object.defineProperty(exports, "windowToggle", { enumerable: true, get: function () { return windowToggle_1.windowToggle; } });
var windowWhen_1 = require("./internal/operators/windowWhen");
Object.defineProperty(exports, "windowWhen", { enumerable: true, get: function () { return windowWhen_1.windowWhen; } });
var withLatestFrom_1 = require("./internal/operators/withLatestFrom");
Object.defineProperty(exports, "withLatestFrom", { enumerable: true, get: function () { return withLatestFrom_1.withLatestFrom; } });
var zipAll_1 = require("./internal/operators/zipAll");
Object.defineProperty(exports, "zipAll", { enumerable: true, get: function () { return zipAll_1.zipAll; } });
var zipWith_1 = require("./internal/operators/zipWith");
Object.defineProperty(exports, "zipWith", { enumerable: true, get: function () { return zipWith_1.zipWith; } });
//# sourceMappingURL=index.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.WebSocketSubject = exports.webSocket = void 0;
var webSocket_1 = require("../internal/observable/dom/webSocket");
Object.defineProperty(exports, "webSocket", { enumerable: true, get: function () { return webSocket_1.webSocket; } });
var WebSocketSubject_1 = require("../internal/observable/dom/WebSocketSubject");
Object.defineProperty(exports, "WebSocketSubject", { enumerable: true, get: function () { return WebSocketSubject_1.WebSocketSubject; } });
//# sourceMappingURL=index.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TestScheduler = void 0;
var TestScheduler_1 = require("../internal/testing/TestScheduler");
Object.defineProperty(exports, "TestScheduler", { enumerable: true, get: function () { return TestScheduler_1.TestScheduler; } });
//# sourceMappingURL=index.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.mergeAll = exports.merge = exports.max = exports.materialize = exports.mapTo = exports.map = exports.last = exports.isEmpty = exports.ignoreElements = exports.groupBy = exports.first = exports.findIndex = exports.find = exports.finalize = exports.filter = exports.expand = exports.exhaustMap = exports.exhaustAll = exports.exhaust = exports.every = exports.endWith = exports.elementAt = exports.distinctUntilKeyChanged = exports.distinctUntilChanged = exports.distinct = exports.dematerialize = exports.delayWhen = exports.delay = exports.defaultIfEmpty = exports.debounceTime = exports.debounce = exports.count = exports.connect = exports.concatWith = exports.concatMapTo = exports.concatMap = exports.concatAll = exports.concat = exports.combineLatestWith = exports.combineLatest = exports.combineLatestAll = exports.combineAll = exports.catchError = exports.bufferWhen = exports.bufferToggle = exports.bufferTime = exports.bufferCount = exports.buffer = exports.auditTime = exports.audit = void 0;
exports.timeInterval = exports.throwIfEmpty = exports.throttleTime = exports.throttle = exports.tap = exports.takeWhile = exports.takeUntil = exports.takeLast = exports.take = exports.switchScan = exports.switchMapTo = exports.switchMap = exports.switchAll = exports.subscribeOn = exports.startWith = exports.skipWhile = exports.skipUntil = exports.skipLast = exports.skip = exports.single = exports.shareReplay = exports.share = exports.sequenceEqual = exports.scan = exports.sampleTime = exports.sample = exports.refCount = exports.retryWhen = exports.retry = exports.repeatWhen = exports.repeat = exports.reduce = exports.raceWith = exports.race = exports.publishReplay = exports.publishLast = exports.publishBehavior = exports.publish = exports.pluck = exports.partition = exports.pairwise = exports.onErrorResumeNext = exports.observeOn = exports.multicast = exports.min = exports.mergeWith = exports.mergeScan = exports.mergeMapTo = exports.mergeMap = exports.flatMap = void 0;
exports.zipWith = exports.zipAll = exports.zip = exports.withLatestFrom = exports.windowWhen = exports.windowToggle = exports.windowTime = exports.windowCount = exports.window = exports.toArray = exports.timestamp = exports.timeoutWith = exports.timeout = void 0;
var audit_1 = require("../internal/operators/audit");
Object.defineProperty(exports, "audit", { enumerable: true, get: function () { return audit_1.audit; } });
var auditTime_1 = require("../internal/operators/auditTime");
Object.defineProperty(exports, "auditTime", { enumerable: true, get: function () { return auditTime_1.auditTime; } });
var buffer_1 = require("../internal/operators/buffer");
Object.defineProperty(exports, "buffer", { enumerable: true, get: function () { return buffer_1.buffer; } });
var bufferCount_1 = require("../internal/operators/bufferCount");
Object.defineProperty(exports, "bufferCount", { enumerable: true, get: function () { return bufferCount_1.bufferCount; } });
var bufferTime_1 = require("../internal/operators/bufferTime");
Object.defineProperty(exports, "bufferTime", { enumerable: true, get: function () { return bufferTime_1.bufferTime; } });
var bufferToggle_1 = require("../internal/operators/bufferToggle");
Object.defineProperty(exports, "bufferToggle", { enumerable: true, get: function () { return bufferToggle_1.bufferToggle; } });
var bufferWhen_1 = require("../internal/operators/bufferWhen");
Object.defineProperty(exports, "bufferWhen", { enumerable: true, get: function () { return bufferWhen_1.bufferWhen; } });
var catchError_1 = require("../internal/operators/catchError");
Object.defineProperty(exports, "catchError", { enumerable: true, get: function () { return catchError_1.catchError; } });
var combineAll_1 = require("../internal/operators/combineAll");
Object.defineProperty(exports, "combineAll", { enumerable: true, get: function () { return combineAll_1.combineAll; } });
var combineLatestAll_1 = require("../internal/operators/combineLatestAll");
Object.defineProperty(exports, "combineLatestAll", { enumerable: true, get: function () { return combineLatestAll_1.combineLatestAll; } });
var combineLatest_1 = require("../internal/operators/combineLatest");
Object.defineProperty(exports, "combineLatest", { enumerable: true, get: function () { return combineLatest_1.combineLatest; } });
var combineLatestWith_1 = require("../internal/operators/combineLatestWith");
Object.defineProperty(exports, "combineLatestWith", { enumerable: true, get: function () { return combineLatestWith_1.combineLatestWith; } });
var concat_1 = require("../internal/operators/concat");
Object.defineProperty(exports, "concat", { enumerable: true, get: function () { return concat_1.concat; } });
var concatAll_1 = require("../internal/operators/concatAll");
Object.defineProperty(exports, "concatAll", { enumerable: true, get: function () { return concatAll_1.concatAll; } });
var concatMap_1 = require("../internal/operators/concatMap");
Object.defineProperty(exports, "concatMap", { enumerable: true, get: function () { return concatMap_1.concatMap; } });
var concatMapTo_1 = require("../internal/operators/concatMapTo");
Object.defineProperty(exports, "concatMapTo", { enumerable: true, get: function () { return concatMapTo_1.concatMapTo; } });
var concatWith_1 = require("../internal/operators/concatWith");
Object.defineProperty(exports, "concatWith", { enumerable: true, get: function () { return concatWith_1.concatWith; } });
var connect_1 = require("../internal/operators/connect");
Object.defineProperty(exports, "connect", { enumerable: true, get: function () { return connect_1.connect; } });
var count_1 = require("../internal/operators/count");
Object.defineProperty(exports, "count", { enumerable: true, get: function () { return count_1.count; } });
var debounce_1 = require("../internal/operators/debounce");
Object.defineProperty(exports, "debounce", { enumerable: true, get: function () { return debounce_1.debounce; } });
var debounceTime_1 = require("../internal/operators/debounceTime");
Object.defineProperty(exports, "debounceTime", { enumerable: true, get: function () { return debounceTime_1.debounceTime; } });
var defaultIfEmpty_1 = require("../internal/operators/defaultIfEmpty");
Object.defineProperty(exports, "defaultIfEmpty", { enumerable: true, get: function () { return defaultIfEmpty_1.defaultIfEmpty; } });
var delay_1 = require("../internal/operators/delay");
Object.defineProperty(exports, "delay", { enumerable: true, get: function () { return delay_1.delay; } });
var delayWhen_1 = require("../internal/operators/delayWhen");
Object.defineProperty(exports, "delayWhen", { enumerable: true, get: function () { return delayWhen_1.delayWhen; } });
var dematerialize_1 = require("../internal/operators/dematerialize");
Object.defineProperty(exports, "dematerialize", { enumerable: true, get: function () { return dematerialize_1.dematerialize; } });
var distinct_1 = require("../internal/operators/distinct");
Object.defineProperty(exports, "distinct", { enumerable: true, get: function () { return distinct_1.distinct; } });
var distinctUntilChanged_1 = require("../internal/operators/distinctUntilChanged");
Object.defineProperty(exports, "distinctUntilChanged", { enumerable: true, get: function () { return distinctUntilChanged_1.distinctUntilChanged; } });
var distinctUntilKeyChanged_1 = require("../internal/operators/distinctUntilKeyChanged");
Object.defineProperty(exports, "distinctUntilKeyChanged", { enumerable: true, get: function () { return distinctUntilKeyChanged_1.distinctUntilKeyChanged; } });
var elementAt_1 = require("../internal/operators/elementAt");
Object.defineProperty(exports, "elementAt", { enumerable: true, get: function () { return elementAt_1.elementAt; } });
var endWith_1 = require("../internal/operators/endWith");
Object.defineProperty(exports, "endWith", { enumerable: true, get: function () { return endWith_1.endWith; } });
var every_1 = require("../internal/operators/every");
Object.defineProperty(exports, "every", { enumerable: true, get: function () { return every_1.every; } });
var exhaust_1 = require("../internal/operators/exhaust");
Object.defineProperty(exports, "exhaust", { enumerable: true, get: function () { return exhaust_1.exhaust; } });
var exhaustAll_1 = require("../internal/operators/exhaustAll");
Object.defineProperty(exports, "exhaustAll", { enumerable: true, get: function () { return exhaustAll_1.exhaustAll; } });
var exhaustMap_1 = require("../internal/operators/exhaustMap");
Object.defineProperty(exports, "exhaustMap", { enumerable: true, get: function () { return exhaustMap_1.exhaustMap; } });
var expand_1 = require("../internal/operators/expand");
Object.defineProperty(exports, "expand", { enumerable: true, get: function () { return expand_1.expand; } });
var filter_1 = require("../internal/operators/filter");
Object.defineProperty(exports, "filter", { enumerable: true, get: function () { return filter_1.filter; } });
var finalize_1 = require("../internal/operators/finalize");
Object.defineProperty(exports, "finalize", { enumerable: true, get: function () { return finalize_1.finalize; } });
var find_1 = require("../internal/operators/find");
Object.defineProperty(exports, "find", { enumerable: true, get: function () { return find_1.find; } });
var findIndex_1 = require("../internal/operators/findIndex");
Object.defineProperty(exports, "findIndex", { enumerable: true, get: function () { return findIndex_1.findIndex; } });
var first_1 = require("../internal/operators/first");
Object.defineProperty(exports, "first", { enumerable: true, get: function () { return first_1.first; } });
var groupBy_1 = require("../internal/operators/groupBy");
Object.defineProperty(exports, "groupBy", { enumerable: true, get: function () { return groupBy_1.groupBy; } });
var ignoreElements_1 = require("../internal/operators/ignoreElements");
Object.defineProperty(exports, "ignoreElements", { enumerable: true, get: function () { return ignoreElements_1.ignoreElements; } });
var isEmpty_1 = require("../internal/operators/isEmpty");
Object.defineProperty(exports, "isEmpty", { enumerable: true, get: function () { return isEmpty_1.isEmpty; } });
var last_1 = require("../internal/operators/last");
Object.defineProperty(exports, "last", { enumerable: true, get: function () { return last_1.last; } });
var map_1 = require("../internal/operators/map");
Object.defineProperty(exports, "map", { enumerable: true, get: function () { return map_1.map; } });
var mapTo_1 = require("../internal/operators/mapTo");
Object.defineProperty(exports, "mapTo", { enumerable: true, get: function () { return mapTo_1.mapTo; } });
var materialize_1 = require("../internal/operators/materialize");
Object.defineProperty(exports, "materialize", { enumerable: true, get: function () { return materialize_1.materialize; } });
var max_1 = require("../internal/operators/max");
Object.defineProperty(exports, "max", { enumerable: true, get: function () { return max_1.max; } });
var merge_1 = require("../internal/operators/merge");
Object.defineProperty(exports, "merge", { enumerable: true, get: function () { return merge_1.merge; } });
var mergeAll_1 = require("../internal/operators/mergeAll");
Object.defineProperty(exports, "mergeAll", { enumerable: true, get: function () { return mergeAll_1.mergeAll; } });
var flatMap_1 = require("../internal/operators/flatMap");
Object.defineProperty(exports, "flatMap", { enumerable: true, get: function () { return flatMap_1.flatMap; } });
var mergeMap_1 = require("../internal/operators/mergeMap");
Object.defineProperty(exports, "mergeMap", { enumerable: true, get: function () { return mergeMap_1.mergeMap; } });
var mergeMapTo_1 = require("../internal/operators/mergeMapTo");
Object.defineProperty(exports, "mergeMapTo", { enumerable: true, get: function () { return mergeMapTo_1.mergeMapTo; } });
var mergeScan_1 = require("../internal/operators/mergeScan");
Object.defineProperty(exports, "mergeScan", { enumerable: true, get: function () { return mergeScan_1.mergeScan; } });
var mergeWith_1 = require("../internal/operators/mergeWith");
Object.defineProperty(exports, "mergeWith", { enumerable: true, get: function () { return mergeWith_1.mergeWith; } });
var min_1 = require("../internal/operators/min");
Object.defineProperty(exports, "min", { enumerable: true, get: function () { return min_1.min; } });
var multicast_1 = require("../internal/operators/multicast");
Object.defineProperty(exports, "multicast", { enumerable: true, get: function () { return multicast_1.multicast; } });
var observeOn_1 = require("../internal/operators/observeOn");
Object.defineProperty(exports, "observeOn", { enumerable: true, get: function () { return observeOn_1.observeOn; } });
var onErrorResumeNext_1 = require("../internal/operators/onErrorResumeNext");
Object.defineProperty(exports, "onErrorResumeNext", { enumerable: true, get: function () { return onErrorResumeNext_1.onErrorResumeNext; } });
var pairwise_1 = require("../internal/operators/pairwise");
Object.defineProperty(exports, "pairwise", { enumerable: true, get: function () { return pairwise_1.pairwise; } });
var partition_1 = require("../internal/operators/partition");
Object.defineProperty(exports, "partition", { enumerable: true, get: function () { return partition_1.partition; } });
var pluck_1 = require("../internal/operators/pluck");
Object.defineProperty(exports, "pluck", { enumerable: true, get: function () { return pluck_1.pluck; } });
var publish_1 = require("../internal/operators/publish");
Object.defineProperty(exports, "publish", { enumerable: true, get: function () { return publish_1.publish; } });
var publishBehavior_1 = require("../internal/operators/publishBehavior");
Object.defineProperty(exports, "publishBehavior", { enumerable: true, get: function () { return publishBehavior_1.publishBehavior; } });
var publishLast_1 = require("../internal/operators/publishLast");
Object.defineProperty(exports, "publishLast", { enumerable: true, get: function () { return publishLast_1.publishLast; } });
var publishReplay_1 = require("../internal/operators/publishReplay");
Object.defineProperty(exports, "publishReplay", { enumerable: true, get: function () { return publishReplay_1.publishReplay; } });
var race_1 = require("../internal/operators/race");
Object.defineProperty(exports, "race", { enumerable: true, get: function () { return race_1.race; } });
var raceWith_1 = require("../internal/operators/raceWith");
Object.defineProperty(exports, "raceWith", { enumerable: true, get: function () { return raceWith_1.raceWith; } });
var reduce_1 = require("../internal/operators/reduce");
Object.defineProperty(exports, "reduce", { enumerable: true, get: function () { return reduce_1.reduce; } });
var repeat_1 = require("../internal/operators/repeat");
Object.defineProperty(exports, "repeat", { enumerable: true, get: function () { return repeat_1.repeat; } });
var repeatWhen_1 = require("../internal/operators/repeatWhen");
Object.defineProperty(exports, "repeatWhen", { enumerable: true, get: function () { return repeatWhen_1.repeatWhen; } });
var retry_1 = require("../internal/operators/retry");
Object.defineProperty(exports, "retry", { enumerable: true, get: function () { return retry_1.retry; } });
var retryWhen_1 = require("../internal/operators/retryWhen");
Object.defineProperty(exports, "retryWhen", { enumerable: true, get: function () { return retryWhen_1.retryWhen; } });
var refCount_1 = require("../internal/operators/refCount");
Object.defineProperty(exports, "refCount", { enumerable: true, get: function () { return refCount_1.refCount; } });
var sample_1 = require("../internal/operators/sample");
Object.defineProperty(exports, "sample", { enumerable: true, get: function () { return sample_1.sample; } });
var sampleTime_1 = require("../internal/operators/sampleTime");
Object.defineProperty(exports, "sampleTime", { enumerable: true, get: function () { return sampleTime_1.sampleTime; } });
var scan_1 = require("../internal/operators/scan");
Object.defineProperty(exports, "scan", { enumerable: true, get: function () { return scan_1.scan; } });
var sequenceEqual_1 = require("../internal/operators/sequenceEqual");
Object.defineProperty(exports, "sequenceEqual", { enumerable: true, get: function () { return sequenceEqual_1.sequenceEqual; } });
var share_1 = require("../internal/operators/share");
Object.defineProperty(exports, "share", { enumerable: true, get: function () { return share_1.share; } });
var shareReplay_1 = require("../internal/operators/shareReplay");
Object.defineProperty(exports, "shareReplay", { enumerable: true, get: function () { return shareReplay_1.shareReplay; } });
var single_1 = require("../internal/operators/single");
Object.defineProperty(exports, "single", { enumerable: true, get: function () { return single_1.single; } });
var skip_1 = require("../internal/operators/skip");
Object.defineProperty(exports, "skip", { enumerable: true, get: function () { return skip_1.skip; } });
var skipLast_1 = require("../internal/operators/skipLast");
Object.defineProperty(exports, "skipLast", { enumerable: true, get: function () { return skipLast_1.skipLast; } });
var skipUntil_1 = require("../internal/operators/skipUntil");
Object.defineProperty(exports, "skipUntil", { enumerable: true, get: function () { return skipUntil_1.skipUntil; } });
var skipWhile_1 = require("../internal/operators/skipWhile");
Object.defineProperty(exports, "skipWhile", { enumerable: true, get: function () { return skipWhile_1.skipWhile; } });
var startWith_1 = require("../internal/operators/startWith");
Object.defineProperty(exports, "startWith", { enumerable: true, get: function () { return startWith_1.startWith; } });
var subscribeOn_1 = require("../internal/operators/subscribeOn");
Object.defineProperty(exports, "subscribeOn", { enumerable: true, get: function () { return subscribeOn_1.subscribeOn; } });
var switchAll_1 = require("../internal/operators/switchAll");
Object.defineProperty(exports, "switchAll", { enumerable: true, get: function () { return switchAll_1.switchAll; } });
var switchMap_1 = require("../internal/operators/switchMap");
Object.defineProperty(exports, "switchMap", { enumerable: true, get: function () { return switchMap_1.switchMap; } });
var switchMapTo_1 = require("../internal/operators/switchMapTo");
Object.defineProperty(exports, "switchMapTo", { enumerable: true, get: function () { return switchMapTo_1.switchMapTo; } });
var switchScan_1 = require("../internal/operators/switchScan");
Object.defineProperty(exports, "switchScan", { enumerable: true, get: function () { return switchScan_1.switchScan; } });
var take_1 = require("../internal/operators/take");
Object.defineProperty(exports, "take", { enumerable: true, get: function () { return take_1.take; } });
var takeLast_1 = require("../internal/operators/takeLast");
Object.defineProperty(exports, "takeLast", { enumerable: true, get: function () { return takeLast_1.takeLast; } });
var takeUntil_1 = require("../internal/operators/takeUntil");
Object.defineProperty(exports, "takeUntil", { enumerable: true, get: function () { return takeUntil_1.takeUntil; } });
var takeWhile_1 = require("../internal/operators/takeWhile");
Object.defineProperty(exports, "takeWhile", { enumerable: true, get: function () { return takeWhile_1.takeWhile; } });
var tap_1 = require("../internal/operators/tap");
Object.defineProperty(exports, "tap", { enumerable: true, get: function () { return tap_1.tap; } });
var throttle_1 = require("../internal/operators/throttle");
Object.defineProperty(exports, "throttle", { enumerable: true, get: function () { return throttle_1.throttle; } });
var throttleTime_1 = require("../internal/operators/throttleTime");
Object.defineProperty(exports, "throttleTime", { enumerable: true, get: function () { return throttleTime_1.throttleTime; } });
var throwIfEmpty_1 = require("../internal/operators/throwIfEmpty");
Object.defineProperty(exports, "throwIfEmpty", { enumerable: true, get: function () { return throwIfEmpty_1.throwIfEmpty; } });
var timeInterval_1 = require("../internal/operators/timeInterval");
Object.defineProperty(exports, "timeInterval", { enumerable: true, get: function () { return timeInterval_1.timeInterval; } });
var timeout_1 = require("../internal/operators/timeout");
Object.defineProperty(exports, "timeout", { enumerable: true, get: function () { return timeout_1.timeout; } });
var timeoutWith_1 = require("../internal/operators/timeoutWith");
Object.defineProperty(exports, "timeoutWith", { enumerable: true, get: function () { return timeoutWith_1.timeoutWith; } });
var timestamp_1 = require("../internal/operators/timestamp");
Object.defineProperty(exports, "timestamp", { enumerable: true, get: function () { return timestamp_1.timestamp; } });
var toArray_1 = require("../internal/operators/toArray");
Object.defineProperty(exports, "toArray", { enumerable: true, get: function () { return toArray_1.toArray; } });
var window_1 = require("../internal/operators/window");
Object.defineProperty(exports, "window", { enumerable: true, get: function () { return window_1.window; } });
var windowCount_1 = require("../internal/operators/windowCount");
Object.defineProperty(exports, "windowCount", { enumerable: true, get: function () { return windowCount_1.windowCount; } });
var windowTime_1 = require("../internal/operators/windowTime");
Object.defineProperty(exports, "windowTime", { enumerable: true, get: function () { return windowTime_1.windowTime; } });
var windowToggle_1 = require("../internal/operators/windowToggle");
Object.defineProperty(exports, "windowToggle", { enumerable: true, get: function () { return windowToggle_1.windowToggle; } });
var windowWhen_1 = require("../internal/operators/windowWhen");
Object.defineProperty(exports, "windowWhen", { enumerable: true, get: function () { return windowWhen_1.windowWhen; } });
var withLatestFrom_1 = require("../internal/operators/withLatestFrom");
Object.defineProperty(exports, "withLatestFrom", { enumerable: true, get: function () { return withLatestFrom_1.withLatestFrom; } });
var zip_1 = require("../internal/operators/zip");
Object.defineProperty(exports, "zip", { enumerable: true, get: function () { return zip_1.zip; } });
var zipAll_1 = require("../internal/operators/zipAll");
Object.defineProperty(exports, "zipAll", { enumerable: true, get: function () { return zipAll_1.zipAll; } });
var zipWith_1 = require("../internal/operators/zipWith");
Object.defineProperty(exports, "zipWith", { enumerable: true, get: function () { return zipWith_1.zipWith; } });
//# sourceMappingURL=index.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=AnyCatcher.js.map"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.AsyncSubject = void 0;
var Subject_1 = require("./Subject");
var AsyncSubject = (function (_super) {
    __extends(AsyncSubject, _super);
    function AsyncSubject() {
        var _this = _super !== null && _super.apply(this, arguments) || this;
        _this._value = null;
        _this._hasValue = false;
        _this._isComplete = false;
        return _this;
    }
    AsyncSubject.prototype._checkFinalizedStatuses = function (subscriber) {
        var _a = this, hasError = _a.hasError, _hasValue = _a._hasValue, _value = _a._value, thrownError = _a.thrownError, isStopped = _a.isStopped, _isComplete = _a._isComplete;
        if (hasError) {
            subscriber.error(thrownError);
        }
        else if (isStopped || _isComplete) {
            _hasValue && subscriber.next(_value);
            subscriber.complete();
        }
    };
    AsyncSubject.prototype.next = function (value) {
        if (!this.isStopped) {
            this._value = value;
            this._hasValue = true;
        }
    };
    AsyncSubject.prototype.complete = function () {
        var _a = this, _hasValue = _a._hasValue, _value = _a._value, _isComplete = _a._isComplete;
        if (!_isComplete) {
            this._isComplete = true;
            _hasValue && _super.prototype.next.call(this, _value);
            _super.prototype.complete.call(this);
        }
    };
    return AsyncSubject;
}(Subject_1.Subject));
exports.AsyncSubject = AsyncSubject;
//# sourceMappingURL=AsyncSubject.js.map"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.BehaviorSubject = void 0;
var Subject_1 = require("./Subject");
var BehaviorSubject = (function (_super) {
    __extends(BehaviorSubject, _super);
    function BehaviorSubject(_value) {
        var _this = _super.call(this) || this;
        _this._value = _value;
        return _this;
    }
    Object.defineProperty(BehaviorSubject.prototype, "value", {
        get: function () {
            return this.getValue();
        },
        enumerable: false,
        configurable: true
    });
    BehaviorSubject.prototype._subscribe = function (subscriber) {
        var subscription = _super.prototype._subscribe.call(this, subscriber);
        !subscription.closed && subscriber.next(this._value);
        return subscription;
    };
    BehaviorSubject.prototype.getValue = function () {
        var _a = this, hasError = _a.hasError, thrownError = _a.thrownError, _value = _a._value;
        if (hasError) {
            throw thrownError;
        }
        this._throwIfClosed();
        return _value;
    };
    BehaviorSubject.prototype.next = function (value) {
        _super.prototype.next.call(this, (this._value = value));
    };
    return BehaviorSubject;
}(Subject_1.Subject));
exports.BehaviorSubject = BehaviorSubject;
//# sourceMappingURL=BehaviorSubject.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.observeNotification = exports.Notification = exports.NotificationKind = void 0;
var empty_1 = require("./observable/empty");
var of_1 = require("./observable/of");
var throwError_1 = require("./observable/throwError");
var isFunction_1 = require("./util/isFunction");
var NotificationKind;
(function (NotificationKind) {
    NotificationKind["NEXT"] = "N";
    NotificationKind["ERROR"] = "E";
    NotificationKind["COMPLETE"] = "C";
})(NotificationKind = exports.NotificationKind || (exports.NotificationKind = {}));
var Notification = (function () {
    function Notification(kind, value, error) {
        this.kind = kind;
        this.value = value;
        this.error = error;
        this.hasValue = kind === 'N';
    }
    Notification.prototype.observe = function (observer) {
        return observeNotification(this, observer);
    };
    Notification.prototype.do = function (nextHandler, errorHandler, completeHandler) {
        var _a = this, kind = _a.kind, value = _a.value, error = _a.error;
        return kind === 'N' ? nextHandler === null || nextHandler === void 0 ? void 0 : nextHandler(value) : kind === 'E' ? errorHandler === null || errorHandler === void 0 ? void 0 : errorHandler(error) : completeHandler === null || completeHandler === void 0 ? void 0 : completeHandler();
    };
    Notification.prototype.accept = function (nextOrObserver, error, complete) {
        var _a;
        return isFunction_1.isFunction((_a = nextOrObserver) === null || _a === void 0 ? void 0 : _a.next)
            ? this.observe(nextOrObserver)
            : this.do(nextOrObserver, error, complete);
    };
    Notification.prototype.toObservable = function () {
        var _a = this, kind = _a.kind, value = _a.value, error = _a.error;
        var result = kind === 'N'
            ?
                of_1.of(value)
            :
                kind === 'E'
                    ?
                        throwError_1.throwError(function () { return error; })
                    :
                        kind === 'C'
                            ?
                                empty_1.EMPTY
                            :
                                0;
        if (!result) {
            throw new TypeError("Unexpected notification kind " + kind);
        }
        return result;
    };
    Notification.createNext = function (value) {
        return new Notification('N', value);
    };
    Notification.createError = function (err) {
        return new Notification('E', undefined, err);
    };
    Notification.createComplete = function () {
        return Notification.completeNotification;
    };
    Notification.completeNotification = new Notification('C');
    return Notification;
}());
exports.Notification = Notification;
function observeNotification(notification, observer) {
    var _a, _b, _c;
    var _d = notification, kind = _d.kind, value = _d.value, error = _d.error;
    if (typeof kind !== 'string') {
        throw new TypeError('Invalid notification, missing "kind"');
    }
    kind === 'N' ? (_a = observer.next) === null || _a === void 0 ? void 0 : _a.call(observer, value) : kind === 'E' ? (_b = observer.error) === null || _b === void 0 ? void 0 : _b.call(observer, error) : (_c = observer.complete) === null || _c === void 0 ? void 0 : _c.call(observer);
}
exports.observeNotification = observeNotification;
//# sourceMappingURL=Notification.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createNotification = exports.nextNotification = exports.errorNotification = exports.COMPLETE_NOTIFICATION = void 0;
exports.COMPLETE_NOTIFICATION = (function () { return createNotification('C', undefined, undefined); })();
function errorNotification(error) {
    return createNotification('E', undefined, error);
}
exports.errorNotification = errorNotification;
function nextNotification(value) {
    return createNotification('N', value, undefined);
}
exports.nextNotification = nextNotification;
function createNotification(kind, value, error) {
    return {
        kind: kind,
        value: value,
        error: error,
    };
}
exports.createNotification = createNotification;
//# sourceMappingURL=NotificationFactories.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Observable = void 0;
var Subscriber_1 = require("./Subscriber");
var Subscription_1 = require("./Subscription");
var observable_1 = require("./symbol/observable");
var pipe_1 = require("./util/pipe");
var config_1 = require("./config");
var isFunction_1 = require("./util/isFunction");
var errorContext_1 = require("./util/errorContext");
var Observable = (function () {
    function Observable(subscribe) {
        if (subscribe) {
            this._subscribe = subscribe;
        }
    }
    Observable.prototype.lift = function (operator) {
        var observable = new Observable();
        observable.source = this;
        observable.operator = operator;
        return observable;
    };
    Observable.prototype.subscribe = function (observerOrNext, error, complete) {
        var _this = this;
        var subscriber = isSubscriber(observerOrNext) ? observerOrNext : new Subscriber_1.SafeSubscriber(observerOrNext, error, complete);
        errorContext_1.errorContext(function () {
            var _a = _this, operator = _a.operator, source = _a.source;
            subscriber.add(operator
                ?
                    operator.call(subscriber, source)
                : source
                    ?
                        _this._subscribe(subscriber)
                    :
                        _this._trySubscribe(subscriber));
        });
        return subscriber;
    };
    Observable.prototype._trySubscribe = function (sink) {
        try {
            return this._subscribe(sink);
        }
        catch (err) {
            sink.error(err);
        }
    };
    Observable.prototype.forEach = function (next, promiseCtor) {
        var _this = this;
        promiseCtor = getPromiseCtor(promiseCtor);
        return new promiseCtor(function (resolve, reject) {
            var subscriber = new Subscriber_1.SafeSubscriber({
                next: function (value) {
                    try {
                        next(value);
                    }
                    catch (err) {
                        reject(err);
                        subscriber.unsubscribe();
                    }
                },
                error: reject,
                complete: resolve,
            });
            _this.subscribe(subscriber);
        });
    };
    Observable.prototype._subscribe = function (subscriber) {
        var _a;
        return (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber);
    };
    Observable.prototype[observable_1.observable] = function () {
        return this;
    };
    Observable.prototype.pipe = function () {
        var operations = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            operations[_i] = arguments[_i];
        }
        return pipe_1.pipeFromArray(operations)(this);
    };
    Observable.prototype.toPromise = function (promiseCtor) {
        var _this = this;
        promiseCtor = getPromiseCtor(promiseCtor);
        return new promiseCtor(function (resolve, reject) {
            var value;
            _this.subscribe(function (x) { return (value = x); }, function (err) { return reject(err); }, function () { return resolve(value); });
        });
    };
    Observable.create = function (subscribe) {
        return new Observable(subscribe);
    };
    return Observable;
}());
exports.Observable = Observable;
function getPromiseCtor(promiseCtor) {
    var _a;
    return (_a = promiseCtor !== null && promiseCtor !== void 0 ? promiseCtor : config_1.config.Promise) !== null && _a !== void 0 ? _a : Promise;
}
function isObserver(value) {
    return value && isFunction_1.isFunction(value.next) && isFunction_1.isFunction(value.error) && isFunction_1.isFunction(value.complete);
}
function isSubscriber(value) {
    return (value && value instanceof Subscriber_1.Subscriber) || (isObserver(value) && Subscription_1.isSubscription(value));
}
//# sourceMappingURL=Observable.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=Operator.js.map"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.ReplaySubject = void 0;
var Subject_1 = require("./Subject");
var dateTimestampProvider_1 = require("./scheduler/dateTimestampProvider");
var ReplaySubject = (function (_super) {
    __extends(ReplaySubject, _super);
    function ReplaySubject(_bufferSize, _windowTime, _timestampProvider) {
        if (_bufferSize === void 0) { _bufferSize = Infinity; }
        if (_windowTime === void 0) { _windowTime = Infinity; }
        if (_timestampProvider === void 0) { _timestampProvider = dateTimestampProvider_1.dateTimestampProvider; }
        var _this = _super.call(this) || this;
        _this._bufferSize = _bufferSize;
        _this._windowTime = _windowTime;
        _this._timestampProvider = _timestampProvider;
        _this._buffer = [];
        _this._infiniteTimeWindow = true;
        _this._infiniteTimeWindow = _windowTime === Infinity;
        _this._bufferSize = Math.max(1, _bufferSize);
        _this._windowTime = Math.max(1, _windowTime);
        return _this;
    }
    ReplaySubject.prototype.next = function (value) {
        var _a = this, isStopped = _a.isStopped, _buffer = _a._buffer, _infiniteTimeWindow = _a._infiniteTimeWindow, _timestampProvider = _a._timestampProvider, _windowTime = _a._windowTime;
        if (!isStopped) {
            _buffer.push(value);
            !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);
        }
        this._trimBuffer();
        _super.prototype.next.call(this, value);
    };
    ReplaySubject.prototype._subscribe = function (subscriber) {
        this._throwIfClosed();
        this._trimBuffer();
        var subscription = this._innerSubscribe(subscriber);
        var _a = this, _infiniteTimeWindow = _a._infiniteTimeWindow, _buffer = _a._buffer;
        var copy = _buffer.slice();
        for (var i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {
            subscriber.next(copy[i]);
        }
        this._checkFinalizedStatuses(subscriber);
        return subscription;
    };
    ReplaySubject.prototype._trimBuffer = function () {
        var _a = this, _bufferSize = _a._bufferSize, _timestampProvider = _a._timestampProvider, _buffer = _a._buffer, _infiniteTimeWindow = _a._infiniteTimeWindow;
        var adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;
        _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);
        if (!_infiniteTimeWindow) {
            var now = _timestampProvider.now();
            var last = 0;
            for (var i = 1; i < _buffer.length && _buffer[i] <= now; i += 2) {
                last = i;
            }
            last && _buffer.splice(0, last + 1);
        }
    };
    return ReplaySubject;
}(Subject_1.Subject));
exports.ReplaySubject = ReplaySubject;
//# sourceMappingURL=ReplaySubject.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Scheduler = void 0;
var dateTimestampProvider_1 = require("./scheduler/dateTimestampProvider");
var Scheduler = (function () {
    function Scheduler(schedulerActionCtor, now) {
        if (now === void 0) { now = Scheduler.now; }
        this.schedulerActionCtor = schedulerActionCtor;
        this.now = now;
    }
    Scheduler.prototype.schedule = function (work, delay, state) {
        if (delay === void 0) { delay = 0; }
        return new this.schedulerActionCtor(this, work).schedule(state, delay);
    };
    Scheduler.now = dateTimestampProvider_1.dateTimestampProvider.now;
    return Scheduler;
}());
exports.Scheduler = Scheduler;
//# sourceMappingURL=Scheduler.js.map"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
var __values = (this && this.__values) || function(o) {
    var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
    if (m) return m.call(o);
    if (o && typeof o.length === "number") return {
        next: function () {
            if (o && i >= o.length) o = void 0;
            return { value: o && o[i++], done: !o };
        }
    };
    throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AnonymousSubject = exports.Subject = void 0;
var Observable_1 = require("./Observable");
var Subscription_1 = require("./Subscription");
var ObjectUnsubscribedError_1 = require("./util/ObjectUnsubscribedError");
var arrRemove_1 = require("./util/arrRemove");
var errorContext_1 = require("./util/errorContext");
var Subject = (function (_super) {
    __extends(Subject, _super);
    function Subject() {
        var _this = _super.call(this) || this;
        _this.closed = false;
        _this.currentObservers = null;
        _this.observers = [];
        _this.isStopped = false;
        _this.hasError = false;
        _this.thrownError = null;
        return _this;
    }
    Subject.prototype.lift = function (operator) {
        var subject = new AnonymousSubject(this, this);
        subject.operator = operator;
        return subject;
    };
    Subject.prototype._throwIfClosed = function () {
        if (this.closed) {
            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
        }
    };
    Subject.prototype.next = function (value) {
        var _this = this;
        errorContext_1.errorContext(function () {
            var e_1, _a;
            _this._throwIfClosed();
            if (!_this.isStopped) {
                if (!_this.currentObservers) {
                    _this.currentObservers = Array.from(_this.observers);
                }
                try {
                    for (var _b = __values(_this.currentObservers), _c = _b.next(); !_c.done; _c = _b.next()) {
                        var observer = _c.value;
                        observer.next(value);
                    }
                }
                catch (e_1_1) { e_1 = { error: e_1_1 }; }
                finally {
                    try {
                        if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
                    }
                    finally { if (e_1) throw e_1.error; }
                }
            }
        });
    };
    Subject.prototype.error = function (err) {
        var _this = this;
        errorContext_1.errorContext(function () {
            _this._throwIfClosed();
            if (!_this.isStopped) {
                _this.hasError = _this.isStopped = true;
                _this.thrownError = err;
                var observers = _this.observers;
                while (observers.length) {
                    observers.shift().error(err);
                }
            }
        });
    };
    Subject.prototype.complete = function () {
        var _this = this;
        errorContext_1.errorContext(function () {
            _this._throwIfClosed();
            if (!_this.isStopped) {
                _this.isStopped = true;
                var observers = _this.observers;
                while (observers.length) {
                    observers.shift().complete();
                }
            }
        });
    };
    Subject.prototype.unsubscribe = function () {
        this.isStopped = this.closed = true;
        this.observers = this.currentObservers = null;
    };
    Object.defineProperty(Subject.prototype, "observed", {
        get: function () {
            var _a;
            return ((_a = this.observers) === null || _a === void 0 ? void 0 : _a.length) > 0;
        },
        enumerable: false,
        configurable: true
    });
    Subject.prototype._trySubscribe = function (subscriber) {
        this._throwIfClosed();
        return _super.prototype._trySubscribe.call(this, subscriber);
    };
    Subject.prototype._subscribe = function (subscriber) {
        this._throwIfClosed();
        this._checkFinalizedStatuses(subscriber);
        return this._innerSubscribe(subscriber);
    };
    Subject.prototype._innerSubscribe = function (subscriber) {
        var _this = this;
        var _a = this, hasError = _a.hasError, isStopped = _a.isStopped, observers = _a.observers;
        if (hasError || isStopped) {
            return Subscription_1.EMPTY_SUBSCRIPTION;
        }
        this.currentObservers = null;
        observers.push(subscriber);
        return new Subscription_1.Subscription(function () {
            _this.currentObservers = null;
            arrRemove_1.arrRemove(observers, subscriber);
        });
    };
    Subject.prototype._checkFinalizedStatuses = function (subscriber) {
        var _a = this, hasError = _a.hasError, thrownError = _a.thrownError, isStopped = _a.isStopped;
        if (hasError) {
            subscriber.error(thrownError);
        }
        else if (isStopped) {
            subscriber.complete();
        }
    };
    Subject.prototype.asObservable = function () {
        var observable = new Observable_1.Observable();
        observable.source = this;
        return observable;
    };
    Subject.create = function (destination, source) {
        return new AnonymousSubject(destination, source);
    };
    return Subject;
}(Observable_1.Observable));
exports.Subject = Subject;
var AnonymousSubject = (function (_super) {
    __extends(AnonymousSubject, _super);
    function AnonymousSubject(destination, source) {
        var _this = _super.call(this) || this;
        _this.destination = destination;
        _this.source = source;
        return _this;
    }
    AnonymousSubject.prototype.next = function (value) {
        var _a, _b;
        (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.next) === null || _b === void 0 ? void 0 : _b.call(_a, value);
    };
    AnonymousSubject.prototype.error = function (err) {
        var _a, _b;
        (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.error) === null || _b === void 0 ? void 0 : _b.call(_a, err);
    };
    AnonymousSubject.prototype.complete = function () {
        var _a, _b;
        (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.complete) === null || _b === void 0 ? void 0 : _b.call(_a);
    };
    AnonymousSubject.prototype._subscribe = function (subscriber) {
        var _a, _b;
        return (_b = (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber)) !== null && _b !== void 0 ? _b : Subscription_1.EMPTY_SUBSCRIPTION;
    };
    return AnonymousSubject;
}(Subject));
exports.AnonymousSubject = AnonymousSubject;
//# sourceMappingURL=Subject.js.map"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.EMPTY_OBSERVER = exports.SafeSubscriber = exports.Subscriber = void 0;
var isFunction_1 = require("./util/isFunction");
var Subscription_1 = require("./Subscription");
var config_1 = require("./config");
var reportUnhandledError_1 = require("./util/reportUnhandledError");
var noop_1 = require("./util/noop");
var NotificationFactories_1 = require("./NotificationFactories");
var timeoutProvider_1 = require("./scheduler/timeoutProvider");
var errorContext_1 = require("./util/errorContext");
var Subscriber = (function (_super) {
    __extends(Subscriber, _super);
    function Subscriber(destination) {
        var _this = _super.call(this) || this;
        _this.isStopped = false;
        if (destination) {
            _this.destination = destination;
            if (Subscription_1.isSubscription(destination)) {
                destination.add(_this);
            }
        }
        else {
            _this.destination = exports.EMPTY_OBSERVER;
        }
        return _this;
    }
    Subscriber.create = function (next, error, complete) {
        return new SafeSubscriber(next, error, complete);
    };
    Subscriber.prototype.next = function (value) {
        if (this.isStopped) {
            handleStoppedNotification(NotificationFactories_1.nextNotification(value), this);
        }
        else {
            this._next(value);
        }
    };
    Subscriber.prototype.error = function (err) {
        if (this.isStopped) {
            handleStoppedNotification(NotificationFactories_1.errorNotification(err), this);
        }
        else {
            this.isStopped = true;
            this._error(err);
        }
    };
    Subscriber.prototype.complete = function () {
        if (this.isStopped) {
            handleStoppedNotification(NotificationFactories_1.COMPLETE_NOTIFICATION, this);
        }
        else {
            this.isStopped = true;
            this._complete();
        }
    };
    Subscriber.prototype.unsubscribe = function () {
        if (!this.closed) {
            this.isStopped = true;
            _super.prototype.unsubscribe.call(this);
            this.destination = null;
        }
    };
    Subscriber.prototype._next = function (value) {
        this.destination.next(value);
    };
    Subscriber.prototype._error = function (err) {
        try {
            this.destination.error(err);
        }
        finally {
            this.unsubscribe();
        }
    };
    Subscriber.prototype._complete = function () {
        try {
            this.destination.complete();
        }
        finally {
            this.unsubscribe();
        }
    };
    return Subscriber;
}(Subscription_1.Subscription));
exports.Subscriber = Subscriber;
var _bind = Function.prototype.bind;
function bind(fn, thisArg) {
    return _bind.call(fn, thisArg);
}
var ConsumerObserver = (function () {
    function ConsumerObserver(partialObserver) {
        this.partialObserver = partialObserver;
    }
    ConsumerObserver.prototype.next = function (value) {
        var partialObserver = this.partialObserver;
        if (partialObserver.next) {
            try {
                partialObserver.next(value);
            }
            catch (error) {
                handleUnhandledError(error);
            }
        }
    };
    ConsumerObserver.prototype.error = function (err) {
        var partialObserver = this.partialObserver;
        if (partialObserver.error) {
            try {
                partialObserver.error(err);
            }
            catch (error) {
                handleUnhandledError(error);
            }
        }
        else {
            handleUnhandledError(err);
        }
    };
    ConsumerObserver.prototype.complete = function () {
        var partialObserver = this.partialObserver;
        if (partialObserver.complete) {
            try {
                partialObserver.complete();
            }
            catch (error) {
                handleUnhandledError(error);
            }
        }
    };
    return ConsumerObserver;
}());
var SafeSubscriber = (function (_super) {
    __extends(SafeSubscriber, _super);
    function SafeSubscriber(observerOrNext, error, complete) {
        var _this = _super.call(this) || this;
        var partialObserver;
        if (isFunction_1.isFunction(observerOrNext) || !observerOrNext) {
            partialObserver = {
                next: (observerOrNext !== null && observerOrNext !== void 0 ? observerOrNext : undefined),
                error: error !== null && error !== void 0 ? error : undefined,
                complete: complete !== null && complete !== void 0 ? complete : undefined,
            };
        }
        else {
            var context_1;
            if (_this && config_1.config.useDeprecatedNextContext) {
                context_1 = Object.create(observerOrNext);
                context_1.unsubscribe = function () { return _this.unsubscribe(); };
                partialObserver = {
                    next: observerOrNext.next && bind(observerOrNext.next, context_1),
                    error: observerOrNext.error && bind(observerOrNext.error, context_1),
                    complete: observerOrNext.complete && bind(observerOrNext.complete, context_1),
                };
            }
            else {
                partialObserver = observerOrNext;
            }
        }
        _this.destination = new ConsumerObserver(partialObserver);
        return _this;
    }
    return SafeSubscriber;
}(Subscriber));
exports.SafeSubscriber = SafeSubscriber;
function handleUnhandledError(error) {
    if (config_1.config.useDeprecatedSynchronousErrorHandling) {
        errorContext_1.captureError(error);
    }
    else {
        reportUnhandledError_1.reportUnhandledError(error);
    }
}
function defaultErrorHandler(err) {
    throw err;
}
function handleStoppedNotification(notification, subscriber) {
    var onStoppedNotification = config_1.config.onStoppedNotification;
    onStoppedNotification && timeoutProvider_1.timeoutProvider.setTimeout(function () { return onStoppedNotification(notification, subscriber); });
}
exports.EMPTY_OBSERVER = {
    closed: true,
    next: noop_1.noop,
    error: defaultErrorHandler,
    complete: noop_1.noop,
};
//# sourceMappingURL=Subscriber.js.map"use strict";
var __values = (this && this.__values) || function(o) {
    var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
    if (m) return m.call(o);
    if (o && typeof o.length === "number") return {
        next: function () {
            if (o && i >= o.length) o = void 0;
            return { value: o && o[i++], done: !o };
        }
    };
    throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.isSubscription = exports.EMPTY_SUBSCRIPTION = exports.Subscription = void 0;
var isFunction_1 = require("./util/isFunction");
var UnsubscriptionError_1 = require("./util/UnsubscriptionError");
var arrRemove_1 = require("./util/arrRemove");
var Subscription = (function () {
    function Subscription(initialTeardown) {
        this.initialTeardown = initialTeardown;
        this.closed = false;
        this._parentage = null;
        this._finalizers = null;
    }
    Subscription.prototype.unsubscribe = function () {
        var e_1, _a, e_2, _b;
        var errors;
        if (!this.closed) {
            this.closed = true;
            var _parentage = this._parentage;
            if (_parentage) {
                this._parentage = null;
                if (Array.isArray(_parentage)) {
                    try {
                        for (var _parentage_1 = __values(_parentage), _parentage_1_1 = _parentage_1.next(); !_parentage_1_1.done; _parentage_1_1 = _parentage_1.next()) {
                            var parent_1 = _parentage_1_1.value;
                            parent_1.remove(this);
                        }
                    }
                    catch (e_1_1) { e_1 = { error: e_1_1 }; }
                    finally {
                        try {
                            if (_parentage_1_1 && !_parentage_1_1.done && (_a = _parentage_1.return)) _a.call(_parentage_1);
                        }
                        finally { if (e_1) throw e_1.error; }
                    }
                }
                else {
                    _parentage.remove(this);
                }
            }
            var initialFinalizer = this.initialTeardown;
            if (isFunction_1.isFunction(initialFinalizer)) {
                try {
                    initialFinalizer();
                }
                catch (e) {
                    errors = e instanceof UnsubscriptionError_1.UnsubscriptionError ? e.errors : [e];
                }
            }
            var _finalizers = this._finalizers;
            if (_finalizers) {
                this._finalizers = null;
                try {
                    for (var _finalizers_1 = __values(_finalizers), _finalizers_1_1 = _finalizers_1.next(); !_finalizers_1_1.done; _finalizers_1_1 = _finalizers_1.next()) {
                        var finalizer = _finalizers_1_1.value;
                        try {
                            execFinalizer(finalizer);
                        }
                        catch (err) {
                            errors = errors !== null && errors !== void 0 ? errors : [];
                            if (err instanceof UnsubscriptionError_1.UnsubscriptionError) {
                                errors = __spreadArray(__spreadArray([], __read(errors)), __read(err.errors));
                            }
                            else {
                                errors.push(err);
                            }
                        }
                    }
                }
                catch (e_2_1) { e_2 = { error: e_2_1 }; }
                finally {
                    try {
                        if (_finalizers_1_1 && !_finalizers_1_1.done && (_b = _finalizers_1.return)) _b.call(_finalizers_1);
                    }
                    finally { if (e_2) throw e_2.error; }
                }
            }
            if (errors) {
                throw new UnsubscriptionError_1.UnsubscriptionError(errors);
            }
        }
    };
    Subscription.prototype.add = function (teardown) {
        var _a;
        if (teardown && teardown !== this) {
            if (this.closed) {
                execFinalizer(teardown);
            }
            else {
                if (teardown instanceof Subscription) {
                    if (teardown.closed || teardown._hasParent(this)) {
                        return;
                    }
                    teardown._addParent(this);
                }
                (this._finalizers = (_a = this._finalizers) !== null && _a !== void 0 ? _a : []).push(teardown);
            }
        }
    };
    Subscription.prototype._hasParent = function (parent) {
        var _parentage = this._parentage;
        return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));
    };
    Subscription.prototype._addParent = function (parent) {
        var _parentage = this._parentage;
        this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;
    };
    Subscription.prototype._removeParent = function (parent) {
        var _parentage = this._parentage;
        if (_parentage === parent) {
            this._parentage = null;
        }
        else if (Array.isArray(_parentage)) {
            arrRemove_1.arrRemove(_parentage, parent);
        }
    };
    Subscription.prototype.remove = function (teardown) {
        var _finalizers = this._finalizers;
        _finalizers && arrRemove_1.arrRemove(_finalizers, teardown);
        if (teardown instanceof Subscription) {
            teardown._removeParent(this);
        }
    };
    Subscription.EMPTY = (function () {
        var empty = new Subscription();
        empty.closed = true;
        return empty;
    })();
    return Subscription;
}());
exports.Subscription = Subscription;
exports.EMPTY_SUBSCRIPTION = Subscription.EMPTY;
function isSubscription(value) {
    return (value instanceof Subscription ||
        (value && 'closed' in value && isFunction_1.isFunction(value.remove) && isFunction_1.isFunction(value.add) && isFunction_1.isFunction(value.unsubscribe)));
}
exports.isSubscription = isSubscription;
function execFinalizer(finalizer) {
    if (isFunction_1.isFunction(finalizer)) {
        finalizer();
    }
    else {
        finalizer.unsubscribe();
    }
}
//# sourceMappingURL=Subscription.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.config = void 0;
exports.config = {
    onUnhandledError: null,
    onStoppedNotification: null,
    Promise: undefined,
    useDeprecatedSynchronousErrorHandling: false,
    useDeprecatedNextContext: false,
};
//# sourceMappingURL=config.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.firstValueFrom = void 0;
var EmptyError_1 = require("./util/EmptyError");
var Subscriber_1 = require("./Subscriber");
function firstValueFrom(source, config) {
    var hasConfig = typeof config === 'object';
    return new Promise(function (resolve, reject) {
        var subscriber = new Subscriber_1.SafeSubscriber({
            next: function (value) {
                resolve(value);
                subscriber.unsubscribe();
            },
            error: reject,
            complete: function () {
                if (hasConfig) {
                    resolve(config.defaultValue);
                }
                else {
                    reject(new EmptyError_1.EmptyError());
                }
            },
        });
        source.subscribe(subscriber);
    });
}
exports.firstValueFrom = firstValueFrom;
//# sourceMappingURL=firstValueFrom.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.lastValueFrom = void 0;
var EmptyError_1 = require("./util/EmptyError");
function lastValueFrom(source, config) {
    var hasConfig = typeof config === 'object';
    return new Promise(function (resolve, reject) {
        var _hasValue = false;
        var _value;
        source.subscribe({
            next: function (value) {
                _value = value;
                _hasValue = true;
            },
            error: reject,
            complete: function () {
                if (_hasValue) {
                    resolve(_value);
                }
                else if (hasConfig) {
                    resolve(config.defaultValue);
                }
                else {
                    reject(new EmptyError_1.EmptyError());
                }
            },
        });
    });
}
exports.lastValueFrom = lastValueFrom;
//# sourceMappingURL=lastValueFrom.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=types.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ArgumentOutOfRangeError = void 0;
var createErrorClass_1 = require("./createErrorClass");
exports.ArgumentOutOfRangeError = createErrorClass_1.createErrorClass(function (_super) {
    return function ArgumentOutOfRangeErrorImpl() {
        _super(this);
        this.name = 'ArgumentOutOfRangeError';
        this.message = 'argument out of range';
    };
});
//# sourceMappingURL=ArgumentOutOfRangeError.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.EmptyError = void 0;
var createErrorClass_1 = require("./createErrorClass");
exports.EmptyError = createErrorClass_1.createErrorClass(function (_super) { return function EmptyErrorImpl() {
    _super(this);
    this.name = 'EmptyError';
    this.message = 'no elements in sequence';
}; });
//# sourceMappingURL=EmptyError.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TestTools = exports.Immediate = void 0;
var nextHandle = 1;
var resolved;
var activeHandles = {};
function findAndClearHandle(handle) {
    if (handle in activeHandles) {
        delete activeHandles[handle];
        return true;
    }
    return false;
}
exports.Immediate = {
    setImmediate: function (cb) {
        var handle = nextHandle++;
        activeHandles[handle] = true;
        if (!resolved) {
            resolved = Promise.resolve();
        }
        resolved.then(function () { return findAndClearHandle(handle) && cb(); });
        return handle;
    },
    clearImmediate: function (handle) {
        findAndClearHandle(handle);
    },
};
exports.TestTools = {
    pending: function () {
        return Object.keys(activeHandles).length;
    }
};
//# sourceMappingURL=Immediate.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.NotFoundError = void 0;
var createErrorClass_1 = require("./createErrorClass");
exports.NotFoundError = createErrorClass_1.createErrorClass(function (_super) {
    return function NotFoundErrorImpl(message) {
        _super(this);
        this.name = 'NotFoundError';
        this.message = message;
    };
});
//# sourceMappingURL=NotFoundError.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ObjectUnsubscribedError = void 0;
var createErrorClass_1 = require("./createErrorClass");
exports.ObjectUnsubscribedError = createErrorClass_1.createErrorClass(function (_super) {
    return function ObjectUnsubscribedErrorImpl() {
        _super(this);
        this.name = 'ObjectUnsubscribedError';
        this.message = 'object unsubscribed';
    };
});
//# sourceMappingURL=ObjectUnsubscribedError.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SequenceError = void 0;
var createErrorClass_1 = require("./createErrorClass");
exports.SequenceError = createErrorClass_1.createErrorClass(function (_super) {
    return function SequenceErrorImpl(message) {
        _super(this);
        this.name = 'SequenceError';
        this.message = message;
    };
});
//# sourceMappingURL=SequenceError.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.UnsubscriptionError = void 0;
var createErrorClass_1 = require("./createErrorClass");
exports.UnsubscriptionError = createErrorClass_1.createErrorClass(function (_super) {
    return function UnsubscriptionErrorImpl(errors) {
        _super(this);
        this.message = errors
            ? errors.length + " errors occurred during unsubscription:\n" + errors.map(function (err, i) { return i + 1 + ") " + err.toString(); }).join('\n  ')
            : '';
        this.name = 'UnsubscriptionError';
        this.errors = errors;
    };
});
//# sourceMappingURL=UnsubscriptionError.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.applyMixins = void 0;
function applyMixins(derivedCtor, baseCtors) {
    for (var i = 0, len = baseCtors.length; i < len; i++) {
        var baseCtor = baseCtors[i];
        var propertyKeys = Object.getOwnPropertyNames(baseCtor.prototype);
        for (var j = 0, len2 = propertyKeys.length; j < len2; j++) {
            var name_1 = propertyKeys[j];
            derivedCtor.prototype[name_1] = baseCtor.prototype[name_1];
        }
    }
}
exports.applyMixins = applyMixins;
//# sourceMappingURL=applyMixins.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.popNumber = exports.popScheduler = exports.popResultSelector = void 0;
var isFunction_1 = require("./isFunction");
var isScheduler_1 = require("./isScheduler");
function last(arr) {
    return arr[arr.length - 1];
}
function popResultSelector(args) {
    return isFunction_1.isFunction(last(args)) ? args.pop() : undefined;
}
exports.popResultSelector = popResultSelector;
function popScheduler(args) {
    return isScheduler_1.isScheduler(last(args)) ? args.pop() : undefined;
}
exports.popScheduler = popScheduler;
function popNumber(args, defaultValue) {
    return typeof last(args) === 'number' ? args.pop() : defaultValue;
}
exports.popNumber = popNumber;
//# sourceMappingURL=args.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.argsArgArrayOrObject = void 0;
var isArray = Array.isArray;
var getPrototypeOf = Object.getPrototypeOf, objectProto = Object.prototype, getKeys = Object.keys;
function argsArgArrayOrObject(args) {
    if (args.length === 1) {
        var first_1 = args[0];
        if (isArray(first_1)) {
            return { args: first_1, keys: null };
        }
        if (isPOJO(first_1)) {
            var keys = getKeys(first_1);
            return {
                args: keys.map(function (key) { return first_1[key]; }),
                keys: keys,
            };
        }
    }
    return { args: args, keys: null };
}
exports.argsArgArrayOrObject = argsArgArrayOrObject;
function isPOJO(obj) {
    return obj && typeof obj === 'object' && getPrototypeOf(obj) === objectProto;
}
//# sourceMappingURL=argsArgArrayOrObject.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.argsOrArgArray = void 0;
var isArray = Array.isArray;
function argsOrArgArray(args) {
    return args.length === 1 && isArray(args[0]) ? args[0] : args;
}
exports.argsOrArgArray = argsOrArgArray;
//# sourceMappingURL=argsOrArgArray.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.arrRemove = void 0;
function arrRemove(arr, item) {
    if (arr) {
        var index = arr.indexOf(item);
        0 <= index && arr.splice(index, 1);
    }
}
exports.arrRemove = arrRemove;
//# sourceMappingURL=arrRemove.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createErrorClass = void 0;
function createErrorClass(createImpl) {
    var _super = function (instance) {
        Error.call(instance);
        instance.stack = new Error().stack;
    };
    var ctorFunc = createImpl(_super);
    ctorFunc.prototype = Object.create(Error.prototype);
    ctorFunc.prototype.constructor = ctorFunc;
    return ctorFunc;
}
exports.createErrorClass = createErrorClass;
//# sourceMappingURL=createErrorClass.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createObject = void 0;
function createObject(keys, values) {
    return keys.reduce(function (result, key, i) { return ((result[key] = values[i]), result); }, {});
}
exports.createObject = createObject;
//# sourceMappingURL=createObject.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.captureError = exports.errorContext = void 0;
var config_1 = require("../config");
var context = null;
function errorContext(cb) {
    if (config_1.config.useDeprecatedSynchronousErrorHandling) {
        var isRoot = !context;
        if (isRoot) {
            context = { errorThrown: false, error: null };
        }
        cb();
        if (isRoot) {
            var _a = context, errorThrown = _a.errorThrown, error = _a.error;
            context = null;
            if (errorThrown) {
                throw error;
            }
        }
    }
    else {
        cb();
    }
}
exports.errorContext = errorContext;
function captureError(err) {
    if (config_1.config.useDeprecatedSynchronousErrorHandling && context) {
        context.errorThrown = true;
        context.error = err;
    }
}
exports.captureError = captureError;
//# sourceMappingURL=errorContext.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.executeSchedule = void 0;
function executeSchedule(parentSubscription, scheduler, work, delay, repeat) {
    if (delay === void 0) { delay = 0; }
    if (repeat === void 0) { repeat = false; }
    var scheduleSubscription = scheduler.schedule(function () {
        work();
        if (repeat) {
            parentSubscription.add(this.schedule(null, delay));
        }
        else {
            this.unsubscribe();
        }
    }, delay);
    parentSubscription.add(scheduleSubscription);
    if (!repeat) {
        return scheduleSubscription;
    }
}
exports.executeSchedule = executeSchedule;
//# sourceMappingURL=executeSchedule.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.identity = void 0;
function identity(x) {
    return x;
}
exports.identity = identity;
//# sourceMappingURL=identity.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isArrayLike = void 0;
exports.isArrayLike = (function (x) { return x && typeof x.length === 'number' && typeof x !== 'function'; });
//# sourceMappingURL=isArrayLike.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isAsyncIterable = void 0;
var isFunction_1 = require("./isFunction");
function isAsyncIterable(obj) {
    return Symbol.asyncIterator && isFunction_1.isFunction(obj === null || obj === void 0 ? void 0 : obj[Symbol.asyncIterator]);
}
exports.isAsyncIterable = isAsyncIterable;
//# sourceMappingURL=isAsyncIterable.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isValidDate = void 0;
function isValidDate(value) {
    return value instanceof Date && !isNaN(value);
}
exports.isValidDate = isValidDate;
//# sourceMappingURL=isDate.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isFunction = void 0;
function isFunction(value) {
    return typeof value === 'function';
}
exports.isFunction = isFunction;
//# sourceMappingURL=isFunction.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isInteropObservable = void 0;
var observable_1 = require("../symbol/observable");
var isFunction_1 = require("./isFunction");
function isInteropObservable(input) {
    return isFunction_1.isFunction(input[observable_1.observable]);
}
exports.isInteropObservable = isInteropObservable;
//# sourceMappingURL=isInteropObservable.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isIterable = void 0;
var iterator_1 = require("../symbol/iterator");
var isFunction_1 = require("./isFunction");
function isIterable(input) {
    return isFunction_1.isFunction(input === null || input === void 0 ? void 0 : input[iterator_1.iterator]);
}
exports.isIterable = isIterable;
//# sourceMappingURL=isIterable.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isObservable = void 0;
var Observable_1 = require("../Observable");
var isFunction_1 = require("./isFunction");
function isObservable(obj) {
    return !!obj && (obj instanceof Observable_1.Observable || (isFunction_1.isFunction(obj.lift) && isFunction_1.isFunction(obj.subscribe)));
}
exports.isObservable = isObservable;
//# sourceMappingURL=isObservable.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isPromise = void 0;
var isFunction_1 = require("./isFunction");
function isPromise(value) {
    return isFunction_1.isFunction(value === null || value === void 0 ? void 0 : value.then);
}
exports.isPromise = isPromise;
//# sourceMappingURL=isPromise.js.map"use strict";
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
    var g = generator.apply(thisArg, _arguments || []), i, q = [];
    return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
    function fulfill(value) { resume("next", value); }
    function reject(value) { resume("throw", value); }
    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.isReadableStreamLike = exports.readableStreamLikeToAsyncGenerator = void 0;
var isFunction_1 = require("./isFunction");
function readableStreamLikeToAsyncGenerator(readableStream) {
    return __asyncGenerator(this, arguments, function readableStreamLikeToAsyncGenerator_1() {
        var reader, _a, value, done;
        return __generator(this, function (_b) {
            switch (_b.label) {
                case 0:
                    reader = readableStream.getReader();
                    _b.label = 1;
                case 1:
                    _b.trys.push([1, , 9, 10]);
                    _b.label = 2;
                case 2:
                    if (!true) return [3, 8];
                    return [4, __await(reader.read())];
                case 3:
                    _a = _b.sent(), value = _a.value, done = _a.done;
                    if (!done) return [3, 5];
                    return [4, __await(void 0)];
                case 4: return [2, _b.sent()];
                case 5: return [4, __await(value)];
                case 6: return [4, _b.sent()];
                case 7:
                    _b.sent();
                    return [3, 2];
                case 8: return [3, 10];
                case 9:
                    reader.releaseLock();
                    return [7];
                case 10: return [2];
            }
        });
    });
}
exports.readableStreamLikeToAsyncGenerator = readableStreamLikeToAsyncGenerator;
function isReadableStreamLike(obj) {
    return isFunction_1.isFunction(obj === null || obj === void 0 ? void 0 : obj.getReader);
}
exports.isReadableStreamLike = isReadableStreamLike;
//# sourceMappingURL=isReadableStreamLike.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isScheduler = void 0;
var isFunction_1 = require("./isFunction");
function isScheduler(value) {
    return value && isFunction_1.isFunction(value.schedule);
}
exports.isScheduler = isScheduler;
//# sourceMappingURL=isScheduler.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.operate = exports.hasLift = void 0;
var isFunction_1 = require("./isFunction");
function hasLift(source) {
    return isFunction_1.isFunction(source === null || source === void 0 ? void 0 : source.lift);
}
exports.hasLift = hasLift;
function operate(init) {
    return function (source) {
        if (hasLift(source)) {
            return source.lift(function (liftedSource) {
                try {
                    return init(liftedSource, this);
                }
                catch (err) {
                    this.error(err);
                }
            });
        }
        throw new TypeError('Unable to lift unknown Observable type');
    };
}
exports.operate = operate;
//# sourceMappingURL=lift.js.map"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.mapOneOrManyArgs = void 0;
var map_1 = require("../operators/map");
var isArray = Array.isArray;
function callOrApply(fn, args) {
    return isArray(args) ? fn.apply(void 0, __spreadArray([], __read(args))) : fn(args);
}
function mapOneOrManyArgs(fn) {
    return map_1.map(function (args) { return callOrApply(fn, args); });
}
exports.mapOneOrManyArgs = mapOneOrManyArgs;
//# sourceMappingURL=mapOneOrManyArgs.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.noop = void 0;
function noop() { }
exports.noop = noop;
//# sourceMappingURL=noop.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.not = void 0;
function not(pred, thisArg) {
    return function (value, index) { return !pred.call(thisArg, value, index); };
}
exports.not = not;
//# sourceMappingURL=not.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.pipeFromArray = exports.pipe = void 0;
var identity_1 = require("./identity");
function pipe() {
    var fns = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        fns[_i] = arguments[_i];
    }
    return pipeFromArray(fns);
}
exports.pipe = pipe;
function pipeFromArray(fns) {
    if (fns.length === 0) {
        return identity_1.identity;
    }
    if (fns.length === 1) {
        return fns[0];
    }
    return function piped(input) {
        return fns.reduce(function (prev, fn) { return fn(prev); }, input);
    };
}
exports.pipeFromArray = pipeFromArray;
//# sourceMappingURL=pipe.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.reportUnhandledError = void 0;
var config_1 = require("../config");
var timeoutProvider_1 = require("../scheduler/timeoutProvider");
function reportUnhandledError(err) {
    timeoutProvider_1.timeoutProvider.setTimeout(function () {
        var onUnhandledError = config_1.config.onUnhandledError;
        if (onUnhandledError) {
            onUnhandledError(err);
        }
        else {
            throw err;
        }
    });
}
exports.reportUnhandledError = reportUnhandledError;
//# sourceMappingURL=reportUnhandledError.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.subscribeToArray = void 0;
var subscribeToArray = function (array) { return function (subscriber) {
    for (var i = 0, len = array.length; i < len && !subscriber.closed; i++) {
        subscriber.next(array[i]);
    }
    subscriber.complete();
}; };
exports.subscribeToArray = subscribeToArray;
//# sourceMappingURL=subscribeToArray.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createInvalidObservableTypeError = void 0;
function createInvalidObservableTypeError(input) {
    return new TypeError("You provided " + (input !== null && typeof input === 'object' ? 'an invalid object' : "'" + input + "'") + " where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.");
}
exports.createInvalidObservableTypeError = createInvalidObservableTypeError;
//# sourceMappingURL=throwUnobservableError.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=workarounds.js.map"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.ColdObservable = void 0;
var Observable_1 = require("../Observable");
var Subscription_1 = require("../Subscription");
var SubscriptionLoggable_1 = require("./SubscriptionLoggable");
var applyMixins_1 = require("../util/applyMixins");
var Notification_1 = require("../Notification");
var ColdObservable = (function (_super) {
    __extends(ColdObservable, _super);
    function ColdObservable(messages, scheduler) {
        var _this = _super.call(this, function (subscriber) {
            var observable = this;
            var index = observable.logSubscribedFrame();
            var subscription = new Subscription_1.Subscription();
            subscription.add(new Subscription_1.Subscription(function () {
                observable.logUnsubscribedFrame(index);
            }));
            observable.scheduleMessages(subscriber);
            return subscription;
        }) || this;
        _this.messages = messages;
        _this.subscriptions = [];
        _this.scheduler = scheduler;
        return _this;
    }
    ColdObservable.prototype.scheduleMessages = function (subscriber) {
        var messagesLength = this.messages.length;
        for (var i = 0; i < messagesLength; i++) {
            var message = this.messages[i];
            subscriber.add(this.scheduler.schedule(function (state) {
                var _a = state, notification = _a.message.notification, destination = _a.subscriber;
                Notification_1.observeNotification(notification, destination);
            }, message.frame, { message: message, subscriber: subscriber }));
        }
    };
    return ColdObservable;
}(Observable_1.Observable));
exports.ColdObservable = ColdObservable;
applyMixins_1.applyMixins(ColdObservable, [SubscriptionLoggable_1.SubscriptionLoggable]);
//# sourceMappingURL=ColdObservable.js.map"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.HotObservable = void 0;
var Subject_1 = require("../Subject");
var Subscription_1 = require("../Subscription");
var SubscriptionLoggable_1 = require("./SubscriptionLoggable");
var applyMixins_1 = require("../util/applyMixins");
var Notification_1 = require("../Notification");
var HotObservable = (function (_super) {
    __extends(HotObservable, _super);
    function HotObservable(messages, scheduler) {
        var _this = _super.call(this) || this;
        _this.messages = messages;
        _this.subscriptions = [];
        _this.scheduler = scheduler;
        return _this;
    }
    HotObservable.prototype._subscribe = function (subscriber) {
        var subject = this;
        var index = subject.logSubscribedFrame();
        var subscription = new Subscription_1.Subscription();
        subscription.add(new Subscription_1.Subscription(function () {
            subject.logUnsubscribedFrame(index);
        }));
        subscription.add(_super.prototype._subscribe.call(this, subscriber));
        return subscription;
    };
    HotObservable.prototype.setup = function () {
        var subject = this;
        var messagesLength = subject.messages.length;
        var _loop_1 = function (i) {
            (function () {
                var _a = subject.messages[i], notification = _a.notification, frame = _a.frame;
                subject.scheduler.schedule(function () {
                    Notification_1.observeNotification(notification, subject);
                }, frame);
            })();
        };
        for (var i = 0; i < messagesLength; i++) {
            _loop_1(i);
        }
    };
    return HotObservable;
}(Subject_1.Subject));
exports.HotObservable = HotObservable;
applyMixins_1.applyMixins(HotObservable, [SubscriptionLoggable_1.SubscriptionLoggable]);
//# sourceMappingURL=HotObservable.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SubscriptionLog = void 0;
var SubscriptionLog = (function () {
    function SubscriptionLog(subscribedFrame, unsubscribedFrame) {
        if (unsubscribedFrame === void 0) { unsubscribedFrame = Infinity; }
        this.subscribedFrame = subscribedFrame;
        this.unsubscribedFrame = unsubscribedFrame;
    }
    return SubscriptionLog;
}());
exports.SubscriptionLog = SubscriptionLog;
//# sourceMappingURL=SubscriptionLog.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SubscriptionLoggable = void 0;
var SubscriptionLog_1 = require("./SubscriptionLog");
var SubscriptionLoggable = (function () {
    function SubscriptionLoggable() {
        this.subscriptions = [];
    }
    SubscriptionLoggable.prototype.logSubscribedFrame = function () {
        this.subscriptions.push(new SubscriptionLog_1.SubscriptionLog(this.scheduler.now()));
        return this.subscriptions.length - 1;
    };
    SubscriptionLoggable.prototype.logUnsubscribedFrame = function (index) {
        var subscriptionLogs = this.subscriptions;
        var oldSubscriptionLog = subscriptionLogs[index];
        subscriptionLogs[index] = new SubscriptionLog_1.SubscriptionLog(oldSubscriptionLog.subscribedFrame, this.scheduler.now());
    };
    return SubscriptionLoggable;
}());
exports.SubscriptionLoggable = SubscriptionLoggable;
//# sourceMappingURL=SubscriptionLoggable.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=TestMessage.js.map"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
var __values = (this && this.__values) || function(o) {
    var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
    if (m) return m.call(o);
    if (o && typeof o.length === "number") return {
        next: function () {
            if (o && i >= o.length) o = void 0;
            return { value: o && o[i++], done: !o };
        }
    };
    throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TestScheduler = void 0;
var Observable_1 = require("../Observable");
var ColdObservable_1 = require("./ColdObservable");
var HotObservable_1 = require("./HotObservable");
var SubscriptionLog_1 = require("./SubscriptionLog");
var VirtualTimeScheduler_1 = require("../scheduler/VirtualTimeScheduler");
var NotificationFactories_1 = require("../NotificationFactories");
var dateTimestampProvider_1 = require("../scheduler/dateTimestampProvider");
var performanceTimestampProvider_1 = require("../scheduler/performanceTimestampProvider");
var animationFrameProvider_1 = require("../scheduler/animationFrameProvider");
var immediateProvider_1 = require("../scheduler/immediateProvider");
var intervalProvider_1 = require("../scheduler/intervalProvider");
var timeoutProvider_1 = require("../scheduler/timeoutProvider");
var defaultMaxFrame = 750;
var TestScheduler = (function (_super) {
    __extends(TestScheduler, _super);
    function TestScheduler(assertDeepEqual) {
        var _this = _super.call(this, VirtualTimeScheduler_1.VirtualAction, defaultMaxFrame) || this;
        _this.assertDeepEqual = assertDeepEqual;
        _this.hotObservables = [];
        _this.coldObservables = [];
        _this.flushTests = [];
        _this.runMode = false;
        return _this;
    }
    TestScheduler.prototype.createTime = function (marbles) {
        var indexOf = this.runMode ? marbles.trim().indexOf('|') : marbles.indexOf('|');
        if (indexOf === -1) {
            throw new Error('marble diagram for time should have a completion marker "|"');
        }
        return indexOf * TestScheduler.frameTimeFactor;
    };
    TestScheduler.prototype.createColdObservable = function (marbles, values, error) {
        if (marbles.indexOf('^') !== -1) {
            throw new Error('cold observable cannot have subscription offset "^"');
        }
        if (marbles.indexOf('!') !== -1) {
            throw new Error('cold observable cannot have unsubscription marker "!"');
        }
        var messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);
        var cold = new ColdObservable_1.ColdObservable(messages, this);
        this.coldObservables.push(cold);
        return cold;
    };
    TestScheduler.prototype.createHotObservable = function (marbles, values, error) {
        if (marbles.indexOf('!') !== -1) {
            throw new Error('hot observable cannot have unsubscription marker "!"');
        }
        var messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);
        var subject = new HotObservable_1.HotObservable(messages, this);
        this.hotObservables.push(subject);
        return subject;
    };
    TestScheduler.prototype.materializeInnerObservable = function (observable, outerFrame) {
        var _this = this;
        var messages = [];
        observable.subscribe({
            next: function (value) {
                messages.push({ frame: _this.frame - outerFrame, notification: NotificationFactories_1.nextNotification(value) });
            },
            error: function (error) {
                messages.push({ frame: _this.frame - outerFrame, notification: NotificationFactories_1.errorNotification(error) });
            },
            complete: function () {
                messages.push({ frame: _this.frame - outerFrame, notification: NotificationFactories_1.COMPLETE_NOTIFICATION });
            },
        });
        return messages;
    };
    TestScheduler.prototype.expectObservable = function (observable, subscriptionMarbles) {
        var _this = this;
        if (subscriptionMarbles === void 0) { subscriptionMarbles = null; }
        var actual = [];
        var flushTest = { actual: actual, ready: false };
        var subscriptionParsed = TestScheduler.parseMarblesAsSubscriptions(subscriptionMarbles, this.runMode);
        var subscriptionFrame = subscriptionParsed.subscribedFrame === Infinity ? 0 : subscriptionParsed.subscribedFrame;
        var unsubscriptionFrame = subscriptionParsed.unsubscribedFrame;
        var subscription;
        this.schedule(function () {
            subscription = observable.subscribe({
                next: function (x) {
                    var value = x instanceof Observable_1.Observable ? _this.materializeInnerObservable(x, _this.frame) : x;
                    actual.push({ frame: _this.frame, notification: NotificationFactories_1.nextNotification(value) });
                },
                error: function (error) {
                    actual.push({ frame: _this.frame, notification: NotificationFactories_1.errorNotification(error) });
                },
                complete: function () {
                    actual.push({ frame: _this.frame, notification: NotificationFactories_1.COMPLETE_NOTIFICATION });
                },
            });
        }, subscriptionFrame);
        if (unsubscriptionFrame !== Infinity) {
            this.schedule(function () { return subscription.unsubscribe(); }, unsubscriptionFrame);
        }
        this.flushTests.push(flushTest);
        var runMode = this.runMode;
        return {
            toBe: function (marbles, values, errorValue) {
                flushTest.ready = true;
                flushTest.expected = TestScheduler.parseMarbles(marbles, values, errorValue, true, runMode);
            },
            toEqual: function (other) {
                flushTest.ready = true;
                flushTest.expected = [];
                _this.schedule(function () {
                    subscription = other.subscribe({
                        next: function (x) {
                            var value = x instanceof Observable_1.Observable ? _this.materializeInnerObservable(x, _this.frame) : x;
                            flushTest.expected.push({ frame: _this.frame, notification: NotificationFactories_1.nextNotification(value) });
                        },
                        error: function (error) {
                            flushTest.expected.push({ frame: _this.frame, notification: NotificationFactories_1.errorNotification(error) });
                        },
                        complete: function () {
                            flushTest.expected.push({ frame: _this.frame, notification: NotificationFactories_1.COMPLETE_NOTIFICATION });
                        },
                    });
                }, subscriptionFrame);
            },
        };
    };
    TestScheduler.prototype.expectSubscriptions = function (actualSubscriptionLogs) {
        var flushTest = { actual: actualSubscriptionLogs, ready: false };
        this.flushTests.push(flushTest);
        var runMode = this.runMode;
        return {
            toBe: function (marblesOrMarblesArray) {
                var marblesArray = typeof marblesOrMarblesArray === 'string' ? [marblesOrMarblesArray] : marblesOrMarblesArray;
                flushTest.ready = true;
                flushTest.expected = marblesArray
                    .map(function (marbles) { return TestScheduler.parseMarblesAsSubscriptions(marbles, runMode); })
                    .filter(function (marbles) { return marbles.subscribedFrame !== Infinity; });
            },
        };
    };
    TestScheduler.prototype.flush = function () {
        var _this = this;
        var hotObservables = this.hotObservables;
        while (hotObservables.length > 0) {
            hotObservables.shift().setup();
        }
        _super.prototype.flush.call(this);
        this.flushTests = this.flushTests.filter(function (test) {
            if (test.ready) {
                _this.assertDeepEqual(test.actual, test.expected);
                return false;
            }
            return true;
        });
    };
    TestScheduler.parseMarblesAsSubscriptions = function (marbles, runMode) {
        var _this = this;
        if (runMode === void 0) { runMode = false; }
        if (typeof marbles !== 'string') {
            return new SubscriptionLog_1.SubscriptionLog(Infinity);
        }
        var characters = __spreadArray([], __read(marbles));
        var len = characters.length;
        var groupStart = -1;
        var subscriptionFrame = Infinity;
        var unsubscriptionFrame = Infinity;
        var frame = 0;
        var _loop_1 = function (i) {
            var nextFrame = frame;
            var advanceFrameBy = function (count) {
                nextFrame += count * _this.frameTimeFactor;
            };
            var c = characters[i];
            switch (c) {
                case ' ':
                    if (!runMode) {
                        advanceFrameBy(1);
                    }
                    break;
                case '-':
                    advanceFrameBy(1);
                    break;
                case '(':
                    groupStart = frame;
                    advanceFrameBy(1);
                    break;
                case ')':
                    groupStart = -1;
                    advanceFrameBy(1);
                    break;
                case '^':
                    if (subscriptionFrame !== Infinity) {
                        throw new Error("found a second subscription point '^' in a " + 'subscription marble diagram. There can only be one.');
                    }
                    subscriptionFrame = groupStart > -1 ? groupStart : frame;
                    advanceFrameBy(1);
                    break;
                case '!':
                    if (unsubscriptionFrame !== Infinity) {
                        throw new Error("found a second unsubscription point '!' in a " + 'subscription marble diagram. There can only be one.');
                    }
                    unsubscriptionFrame = groupStart > -1 ? groupStart : frame;
                    break;
                default:
                    if (runMode && c.match(/^[0-9]$/)) {
                        if (i === 0 || characters[i - 1] === ' ') {
                            var buffer = characters.slice(i).join('');
                            var match = buffer.match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);
                            if (match) {
                                i += match[0].length - 1;
                                var duration = parseFloat(match[1]);
                                var unit = match[2];
                                var durationInMs = void 0;
                                switch (unit) {
                                    case 'ms':
                                        durationInMs = duration;
                                        break;
                                    case 's':
                                        durationInMs = duration * 1000;
                                        break;
                                    case 'm':
                                        durationInMs = duration * 1000 * 60;
                                        break;
                                    default:
                                        break;
                                }
                                advanceFrameBy(durationInMs / this_1.frameTimeFactor);
                                break;
                            }
                        }
                    }
                    throw new Error("there can only be '^' and '!' markers in a " + "subscription marble diagram. Found instead '" + c + "'.");
            }
            frame = nextFrame;
            out_i_1 = i;
        };
        var this_1 = this, out_i_1;
        for (var i = 0; i < len; i++) {
            _loop_1(i);
            i = out_i_1;
        }
        if (unsubscriptionFrame < 0) {
            return new SubscriptionLog_1.SubscriptionLog(subscriptionFrame);
        }
        else {
            return new SubscriptionLog_1.SubscriptionLog(subscriptionFrame, unsubscriptionFrame);
        }
    };
    TestScheduler.parseMarbles = function (marbles, values, errorValue, materializeInnerObservables, runMode) {
        var _this = this;
        if (materializeInnerObservables === void 0) { materializeInnerObservables = false; }
        if (runMode === void 0) { runMode = false; }
        if (marbles.indexOf('!') !== -1) {
            throw new Error('conventional marble diagrams cannot have the ' + 'unsubscription marker "!"');
        }
        var characters = __spreadArray([], __read(marbles));
        var len = characters.length;
        var testMessages = [];
        var subIndex = runMode ? marbles.replace(/^[ ]+/, '').indexOf('^') : marbles.indexOf('^');
        var frame = subIndex === -1 ? 0 : subIndex * -this.frameTimeFactor;
        var getValue = typeof values !== 'object'
            ? function (x) { return x; }
            : function (x) {
                if (materializeInnerObservables && values[x] instanceof ColdObservable_1.ColdObservable) {
                    return values[x].messages;
                }
                return values[x];
            };
        var groupStart = -1;
        var _loop_2 = function (i) {
            var nextFrame = frame;
            var advanceFrameBy = function (count) {
                nextFrame += count * _this.frameTimeFactor;
            };
            var notification = void 0;
            var c = characters[i];
            switch (c) {
                case ' ':
                    if (!runMode) {
                        advanceFrameBy(1);
                    }
                    break;
                case '-':
                    advanceFrameBy(1);
                    break;
                case '(':
                    groupStart = frame;
                    advanceFrameBy(1);
                    break;
                case ')':
                    groupStart = -1;
                    advanceFrameBy(1);
                    break;
                case '|':
                    notification = NotificationFactories_1.COMPLETE_NOTIFICATION;
                    advanceFrameBy(1);
                    break;
                case '^':
                    advanceFrameBy(1);
                    break;
                case '#':
                    notification = NotificationFactories_1.errorNotification(errorValue || 'error');
                    advanceFrameBy(1);
                    break;
                default:
                    if (runMode && c.match(/^[0-9]$/)) {
                        if (i === 0 || characters[i - 1] === ' ') {
                            var buffer = characters.slice(i).join('');
                            var match = buffer.match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);
                            if (match) {
                                i += match[0].length - 1;
                                var duration = parseFloat(match[1]);
                                var unit = match[2];
                                var durationInMs = void 0;
                                switch (unit) {
                                    case 'ms':
                                        durationInMs = duration;
                                        break;
                                    case 's':
                                        durationInMs = duration * 1000;
                                        break;
                                    case 'm':
                                        durationInMs = duration * 1000 * 60;
                                        break;
                                    default:
                                        break;
                                }
                                advanceFrameBy(durationInMs / this_2.frameTimeFactor);
                                break;
                            }
                        }
                    }
                    notification = NotificationFactories_1.nextNotification(getValue(c));
                    advanceFrameBy(1);
                    break;
            }
            if (notification) {
                testMessages.push({ frame: groupStart > -1 ? groupStart : frame, notification: notification });
            }
            frame = nextFrame;
            out_i_2 = i;
        };
        var this_2 = this, out_i_2;
        for (var i = 0; i < len; i++) {
            _loop_2(i);
            i = out_i_2;
        }
        return testMessages;
    };
    TestScheduler.prototype.createAnimator = function () {
        var _this = this;
        if (!this.runMode) {
            throw new Error('animate() must only be used in run mode');
        }
        var lastHandle = 0;
        var map;
        var delegate = {
            requestAnimationFrame: function (callback) {
                if (!map) {
                    throw new Error('animate() was not called within run()');
                }
                var handle = ++lastHandle;
                map.set(handle, callback);
                return handle;
            },
            cancelAnimationFrame: function (handle) {
                if (!map) {
                    throw new Error('animate() was not called within run()');
                }
                map.delete(handle);
            },
        };
        var animate = function (marbles) {
            var e_1, _a;
            if (map) {
                throw new Error('animate() must not be called more than once within run()');
            }
            if (/[|#]/.test(marbles)) {
                throw new Error('animate() must not complete or error');
            }
            map = new Map();
            var messages = TestScheduler.parseMarbles(marbles, undefined, undefined, undefined, true);
            try {
                for (var messages_1 = __values(messages), messages_1_1 = messages_1.next(); !messages_1_1.done; messages_1_1 = messages_1.next()) {
                    var message = messages_1_1.value;
                    _this.schedule(function () {
                        var e_2, _a;
                        var now = _this.now();
                        var callbacks = Array.from(map.values());
                        map.clear();
                        try {
                            for (var callbacks_1 = (e_2 = void 0, __values(callbacks)), callbacks_1_1 = callbacks_1.next(); !callbacks_1_1.done; callbacks_1_1 = callbacks_1.next()) {
                                var callback = callbacks_1_1.value;
                                callback(now);
                            }
                        }
                        catch (e_2_1) { e_2 = { error: e_2_1 }; }
                        finally {
                            try {
                                if (callbacks_1_1 && !callbacks_1_1.done && (_a = callbacks_1.return)) _a.call(callbacks_1);
                            }
                            finally { if (e_2) throw e_2.error; }
                        }
                    }, message.frame);
                }
            }
            catch (e_1_1) { e_1 = { error: e_1_1 }; }
            finally {
                try {
                    if (messages_1_1 && !messages_1_1.done && (_a = messages_1.return)) _a.call(messages_1);
                }
                finally { if (e_1) throw e_1.error; }
            }
        };
        return { animate: animate, delegate: delegate };
    };
    TestScheduler.prototype.createDelegates = function () {
        var _this = this;
        var lastHandle = 0;
        var scheduleLookup = new Map();
        var run = function () {
            var now = _this.now();
            var scheduledRecords = Array.from(scheduleLookup.values());
            var scheduledRecordsDue = scheduledRecords.filter(function (_a) {
                var due = _a.due;
                return due <= now;
            });
            var dueImmediates = scheduledRecordsDue.filter(function (_a) {
                var type = _a.type;
                return type === 'immediate';
            });
            if (dueImmediates.length > 0) {
                var _a = dueImmediates[0], handle = _a.handle, handler = _a.handler;
                scheduleLookup.delete(handle);
                handler();
                return;
            }
            var dueIntervals = scheduledRecordsDue.filter(function (_a) {
                var type = _a.type;
                return type === 'interval';
            });
            if (dueIntervals.length > 0) {
                var firstDueInterval = dueIntervals[0];
                var duration = firstDueInterval.duration, handler = firstDueInterval.handler;
                firstDueInterval.due = now + duration;
                firstDueInterval.subscription = _this.schedule(run, duration);
                handler();
                return;
            }
            var dueTimeouts = scheduledRecordsDue.filter(function (_a) {
                var type = _a.type;
                return type === 'timeout';
            });
            if (dueTimeouts.length > 0) {
                var _b = dueTimeouts[0], handle = _b.handle, handler = _b.handler;
                scheduleLookup.delete(handle);
                handler();
                return;
            }
            throw new Error('Expected a due immediate or interval');
        };
        var immediate = {
            setImmediate: function (handler) {
                var handle = ++lastHandle;
                scheduleLookup.set(handle, {
                    due: _this.now(),
                    duration: 0,
                    handle: handle,
                    handler: handler,
                    subscription: _this.schedule(run, 0),
                    type: 'immediate',
                });
                return handle;
            },
            clearImmediate: function (handle) {
                var value = scheduleLookup.get(handle);
                if (value) {
                    value.subscription.unsubscribe();
                    scheduleLookup.delete(handle);
                }
            },
        };
        var interval = {
            setInterval: function (handler, duration) {
                if (duration === void 0) { duration = 0; }
                var handle = ++lastHandle;
                scheduleLookup.set(handle, {
                    due: _this.now() + duration,
                    duration: duration,
                    handle: handle,
                    handler: handler,
                    subscription: _this.schedule(run, duration),
                    type: 'interval',
                });
                return handle;
            },
            clearInterval: function (handle) {
                var value = scheduleLookup.get(handle);
                if (value) {
                    value.subscription.unsubscribe();
                    scheduleLookup.delete(handle);
                }
            },
        };
        var timeout = {
            setTimeout: function (handler, duration) {
                if (duration === void 0) { duration = 0; }
                var handle = ++lastHandle;
                scheduleLookup.set(handle, {
                    due: _this.now() + duration,
                    duration: duration,
                    handle: handle,
                    handler: handler,
                    subscription: _this.schedule(run, duration),
                    type: 'timeout',
                });
                return handle;
            },
            clearTimeout: function (handle) {
                var value = scheduleLookup.get(handle);
                if (value) {
                    value.subscription.unsubscribe();
                    scheduleLookup.delete(handle);
                }
            },
        };
        return { immediate: immediate, interval: interval, timeout: timeout };
    };
    TestScheduler.prototype.run = function (callback) {
        var prevFrameTimeFactor = TestScheduler.frameTimeFactor;
        var prevMaxFrames = this.maxFrames;
        TestScheduler.frameTimeFactor = 1;
        this.maxFrames = Infinity;
        this.runMode = true;
        var animator = this.createAnimator();
        var delegates = this.createDelegates();
        animationFrameProvider_1.animationFrameProvider.delegate = animator.delegate;
        dateTimestampProvider_1.dateTimestampProvider.delegate = this;
        immediateProvider_1.immediateProvider.delegate = delegates.immediate;
        intervalProvider_1.intervalProvider.delegate = delegates.interval;
        timeoutProvider_1.timeoutProvider.delegate = delegates.timeout;
        performanceTimestampProvider_1.performanceTimestampProvider.delegate = this;
        var helpers = {
            cold: this.createColdObservable.bind(this),
            hot: this.createHotObservable.bind(this),
            flush: this.flush.bind(this),
            time: this.createTime.bind(this),
            expectObservable: this.expectObservable.bind(this),
            expectSubscriptions: this.expectSubscriptions.bind(this),
            animate: animator.animate,
        };
        try {
            var ret = callback(helpers);
            this.flush();
            return ret;
        }
        finally {
            TestScheduler.frameTimeFactor = prevFrameTimeFactor;
            this.maxFrames = prevMaxFrames;
            this.runMode = false;
            animationFrameProvider_1.animationFrameProvider.delegate = undefined;
            dateTimestampProvider_1.dateTimestampProvider.delegate = undefined;
            immediateProvider_1.immediateProvider.delegate = undefined;
            intervalProvider_1.intervalProvider.delegate = undefined;
            timeoutProvider_1.timeoutProvider.delegate = undefined;
            performanceTimestampProvider_1.performanceTimestampProvider.delegate = undefined;
        }
    };
    TestScheduler.frameTimeFactor = 10;
    return TestScheduler;
}(VirtualTimeScheduler_1.VirtualTimeScheduler));
exports.TestScheduler = TestScheduler;
//# sourceMappingURL=TestScheduler.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.iterator = exports.getSymbolIterator = void 0;
function getSymbolIterator() {
    if (typeof Symbol !== 'function' || !Symbol.iterator) {
        return '@@iterator';
    }
    return Symbol.iterator;
}
exports.getSymbolIterator = getSymbolIterator;
exports.iterator = getSymbolIterator();
//# sourceMappingURL=iterator.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.observable = void 0;
exports.observable = (function () { return (typeof Symbol === 'function' && Symbol.observable) || '@@observable'; })();
//# sourceMappingURL=observable.js.map"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.Action = void 0;
var Subscription_1 = require("../Subscription");
var Action = (function (_super) {
    __extends(Action, _super);
    function Action(scheduler, work) {
        return _super.call(this) || this;
    }
    Action.prototype.schedule = function (state, delay) {
        if (delay === void 0) { delay = 0; }
        return this;
    };
    return Action;
}(Subscription_1.Subscription));
exports.Action = Action;
//# sourceMappingURL=Action.js.map"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.AnimationFrameAction = void 0;
var AsyncAction_1 = require("./AsyncAction");
var animationFrameProvider_1 = require("./animationFrameProvider");
var AnimationFrameAction = (function (_super) {
    __extends(AnimationFrameAction, _super);
    function AnimationFrameAction(scheduler, work) {
        var _this = _super.call(this, scheduler, work) || this;
        _this.scheduler = scheduler;
        _this.work = work;
        return _this;
    }
    AnimationFrameAction.prototype.requestAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        if (delay !== null && delay > 0) {
            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
        }
        scheduler.actions.push(this);
        return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider_1.animationFrameProvider.requestAnimationFrame(function () { return scheduler.flush(undefined); }));
    };
    AnimationFrameAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {
            return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);
        }
        if (!scheduler.actions.some(function (action) { return action.id === id; })) {
            animationFrameProvider_1.animationFrameProvider.cancelAnimationFrame(id);
            scheduler._scheduled = undefined;
        }
        return undefined;
    };
    return AnimationFrameAction;
}(AsyncAction_1.AsyncAction));
exports.AnimationFrameAction = AnimationFrameAction;
//# sourceMappingURL=AnimationFrameAction.js.map"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.AnimationFrameScheduler = void 0;
var AsyncScheduler_1 = require("./AsyncScheduler");
var AnimationFrameScheduler = (function (_super) {
    __extends(AnimationFrameScheduler, _super);
    function AnimationFrameScheduler() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    AnimationFrameScheduler.prototype.flush = function (action) {
        this._active = true;
        var flushId = this._scheduled;
        this._scheduled = undefined;
        var actions = this.actions;
        var error;
        action = action || actions.shift();
        do {
            if ((error = action.execute(action.state, action.delay))) {
                break;
            }
        } while ((action = actions[0]) && action.id === flushId && actions.shift());
        this._active = false;
        if (error) {
            while ((action = actions[0]) && action.id === flushId && actions.shift()) {
                action.unsubscribe();
            }
            throw error;
        }
    };
    return AnimationFrameScheduler;
}(AsyncScheduler_1.AsyncScheduler));
exports.AnimationFrameScheduler = AnimationFrameScheduler;
//# sourceMappingURL=AnimationFrameScheduler.js.map"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.AsapAction = void 0;
var AsyncAction_1 = require("./AsyncAction");
var immediateProvider_1 = require("./immediateProvider");
var AsapAction = (function (_super) {
    __extends(AsapAction, _super);
    function AsapAction(scheduler, work) {
        var _this = _super.call(this, scheduler, work) || this;
        _this.scheduler = scheduler;
        _this.work = work;
        return _this;
    }
    AsapAction.prototype.requestAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        if (delay !== null && delay > 0) {
            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
        }
        scheduler.actions.push(this);
        return scheduler._scheduled || (scheduler._scheduled = immediateProvider_1.immediateProvider.setImmediate(scheduler.flush.bind(scheduler, undefined)));
    };
    AsapAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {
            return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);
        }
        if (!scheduler.actions.some(function (action) { return action.id === id; })) {
            immediateProvider_1.immediateProvider.clearImmediate(id);
            scheduler._scheduled = undefined;
        }
        return undefined;
    };
    return AsapAction;
}(AsyncAction_1.AsyncAction));
exports.AsapAction = AsapAction;
//# sourceMappingURL=AsapAction.js.map"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.AsapScheduler = void 0;
var AsyncScheduler_1 = require("./AsyncScheduler");
var AsapScheduler = (function (_super) {
    __extends(AsapScheduler, _super);
    function AsapScheduler() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    AsapScheduler.prototype.flush = function (action) {
        this._active = true;
        var flushId = this._scheduled;
        this._scheduled = undefined;
        var actions = this.actions;
        var error;
        action = action || actions.shift();
        do {
            if ((error = action.execute(action.state, action.delay))) {
                break;
            }
        } while ((action = actions[0]) && action.id === flushId && actions.shift());
        this._active = false;
        if (error) {
            while ((action = actions[0]) && action.id === flushId && actions.shift()) {
                action.unsubscribe();
            }
            throw error;
        }
    };
    return AsapScheduler;
}(AsyncScheduler_1.AsyncScheduler));
exports.AsapScheduler = AsapScheduler;
//# sourceMappingURL=AsapScheduler.js.map"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.AsyncAction = void 0;
var Action_1 = require("./Action");
var intervalProvider_1 = require("./intervalProvider");
var arrRemove_1 = require("../util/arrRemove");
var AsyncAction = (function (_super) {
    __extends(AsyncAction, _super);
    function AsyncAction(scheduler, work) {
        var _this = _super.call(this, scheduler, work) || this;
        _this.scheduler = scheduler;
        _this.work = work;
        _this.pending = false;
        return _this;
    }
    AsyncAction.prototype.schedule = function (state, delay) {
        if (delay === void 0) { delay = 0; }
        if (this.closed) {
            return this;
        }
        this.state = state;
        var id = this.id;
        var scheduler = this.scheduler;
        if (id != null) {
            this.id = this.recycleAsyncId(scheduler, id, delay);
        }
        this.pending = true;
        this.delay = delay;
        this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);
        return this;
    };
    AsyncAction.prototype.requestAsyncId = function (scheduler, _id, delay) {
        if (delay === void 0) { delay = 0; }
        return intervalProvider_1.intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);
    };
    AsyncAction.prototype.recycleAsyncId = function (_scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        if (delay != null && this.delay === delay && this.pending === false) {
            return id;
        }
        intervalProvider_1.intervalProvider.clearInterval(id);
        return undefined;
    };
    AsyncAction.prototype.execute = function (state, delay) {
        if (this.closed) {
            return new Error('executing a cancelled action');
        }
        this.pending = false;
        var error = this._execute(state, delay);
        if (error) {
            return error;
        }
        else if (this.pending === false && this.id != null) {
            this.id = this.recycleAsyncId(this.scheduler, this.id, null);
        }
    };
    AsyncAction.prototype._execute = function (state, _delay) {
        var errored = false;
        var errorValue;
        try {
            this.work(state);
        }
        catch (e) {
            errored = true;
            errorValue = e ? e : new Error('Scheduled action threw falsy error');
        }
        if (errored) {
            this.unsubscribe();
            return errorValue;
        }
    };
    AsyncAction.prototype.unsubscribe = function () {
        if (!this.closed) {
            var _a = this, id = _a.id, scheduler = _a.scheduler;
            var actions = scheduler.actions;
            this.work = this.state = this.scheduler = null;
            this.pending = false;
            arrRemove_1.arrRemove(actions, this);
            if (id != null) {
                this.id = this.recycleAsyncId(scheduler, id, null);
            }
            this.delay = null;
            _super.prototype.unsubscribe.call(this);
        }
    };
    return AsyncAction;
}(Action_1.Action));
exports.AsyncAction = AsyncAction;
//# sourceMappingURL=AsyncAction.js.map"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.AsyncScheduler = void 0;
var Scheduler_1 = require("../Scheduler");
var AsyncScheduler = (function (_super) {
    __extends(AsyncScheduler, _super);
    function AsyncScheduler(SchedulerAction, now) {
        if (now === void 0) { now = Scheduler_1.Scheduler.now; }
        var _this = _super.call(this, SchedulerAction, now) || this;
        _this.actions = [];
        _this._active = false;
        _this._scheduled = undefined;
        return _this;
    }
    AsyncScheduler.prototype.flush = function (action) {
        var actions = this.actions;
        if (this._active) {
            actions.push(action);
            return;
        }
        var error;
        this._active = true;
        do {
            if ((error = action.execute(action.state, action.delay))) {
                break;
            }
        } while ((action = actions.shift()));
        this._active = false;
        if (error) {
            while ((action = actions.shift())) {
                action.unsubscribe();
            }
            throw error;
        }
    };
    return AsyncScheduler;
}(Scheduler_1.Scheduler));
exports.AsyncScheduler = AsyncScheduler;
//# sourceMappingURL=AsyncScheduler.js.map"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.QueueAction = void 0;
var AsyncAction_1 = require("./AsyncAction");
var QueueAction = (function (_super) {
    __extends(QueueAction, _super);
    function QueueAction(scheduler, work) {
        var _this = _super.call(this, scheduler, work) || this;
        _this.scheduler = scheduler;
        _this.work = work;
        return _this;
    }
    QueueAction.prototype.schedule = function (state, delay) {
        if (delay === void 0) { delay = 0; }
        if (delay > 0) {
            return _super.prototype.schedule.call(this, state, delay);
        }
        this.delay = delay;
        this.state = state;
        this.scheduler.flush(this);
        return this;
    };
    QueueAction.prototype.execute = function (state, delay) {
        return (delay > 0 || this.closed) ?
            _super.prototype.execute.call(this, state, delay) :
            this._execute(state, delay);
    };
    QueueAction.prototype.requestAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {
            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
        }
        return scheduler.flush(this);
    };
    return QueueAction;
}(AsyncAction_1.AsyncAction));
exports.QueueAction = QueueAction;
//# sourceMappingURL=QueueAction.js.map"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.QueueScheduler = void 0;
var AsyncScheduler_1 = require("./AsyncScheduler");
var QueueScheduler = (function (_super) {
    __extends(QueueScheduler, _super);
    function QueueScheduler() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    return QueueScheduler;
}(AsyncScheduler_1.AsyncScheduler));
exports.QueueScheduler = QueueScheduler;
//# sourceMappingURL=QueueScheduler.js.map"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.VirtualAction = exports.VirtualTimeScheduler = void 0;
var AsyncAction_1 = require("./AsyncAction");
var Subscription_1 = require("../Subscription");
var AsyncScheduler_1 = require("./AsyncScheduler");
var VirtualTimeScheduler = (function (_super) {
    __extends(VirtualTimeScheduler, _super);
    function VirtualTimeScheduler(schedulerActionCtor, maxFrames) {
        if (schedulerActionCtor === void 0) { schedulerActionCtor = VirtualAction; }
        if (maxFrames === void 0) { maxFrames = Infinity; }
        var _this = _super.call(this, schedulerActionCtor, function () { return _this.frame; }) || this;
        _this.maxFrames = maxFrames;
        _this.frame = 0;
        _this.index = -1;
        return _this;
    }
    VirtualTimeScheduler.prototype.flush = function () {
        var _a = this, actions = _a.actions, maxFrames = _a.maxFrames;
        var error;
        var action;
        while ((action = actions[0]) && action.delay <= maxFrames) {
            actions.shift();
            this.frame = action.delay;
            if ((error = action.execute(action.state, action.delay))) {
                break;
            }
        }
        if (error) {
            while ((action = actions.shift())) {
                action.unsubscribe();
            }
            throw error;
        }
    };
    VirtualTimeScheduler.frameTimeFactor = 10;
    return VirtualTimeScheduler;
}(AsyncScheduler_1.AsyncScheduler));
exports.VirtualTimeScheduler = VirtualTimeScheduler;
var VirtualAction = (function (_super) {
    __extends(VirtualAction, _super);
    function VirtualAction(scheduler, work, index) {
        if (index === void 0) { index = (scheduler.index += 1); }
        var _this = _super.call(this, scheduler, work) || this;
        _this.scheduler = scheduler;
        _this.work = work;
        _this.index = index;
        _this.active = true;
        _this.index = scheduler.index = index;
        return _this;
    }
    VirtualAction.prototype.schedule = function (state, delay) {
        if (delay === void 0) { delay = 0; }
        if (Number.isFinite(delay)) {
            if (!this.id) {
                return _super.prototype.schedule.call(this, state, delay);
            }
            this.active = false;
            var action = new VirtualAction(this.scheduler, this.work);
            this.add(action);
            return action.schedule(state, delay);
        }
        else {
            return Subscription_1.Subscription.EMPTY;
        }
    };
    VirtualAction.prototype.requestAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        this.delay = scheduler.frame + delay;
        var actions = scheduler.actions;
        actions.push(this);
        actions.sort(VirtualAction.sortActions);
        return true;
    };
    VirtualAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
        if (delay === void 0) { delay = 0; }
        return undefined;
    };
    VirtualAction.prototype._execute = function (state, delay) {
        if (this.active === true) {
            return _super.prototype._execute.call(this, state, delay);
        }
    };
    VirtualAction.sortActions = function (a, b) {
        if (a.delay === b.delay) {
            if (a.index === b.index) {
                return 0;
            }
            else if (a.index > b.index) {
                return 1;
            }
            else {
                return -1;
            }
        }
        else if (a.delay > b.delay) {
            return 1;
        }
        else {
            return -1;
        }
    };
    return VirtualAction;
}(AsyncAction_1.AsyncAction));
exports.VirtualAction = VirtualAction;
//# sourceMappingURL=VirtualTimeScheduler.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.animationFrame = exports.animationFrameScheduler = void 0;
var AnimationFrameAction_1 = require("./AnimationFrameAction");
var AnimationFrameScheduler_1 = require("./AnimationFrameScheduler");
exports.animationFrameScheduler = new AnimationFrameScheduler_1.AnimationFrameScheduler(AnimationFrameAction_1.AnimationFrameAction);
exports.animationFrame = exports.animationFrameScheduler;
//# sourceMappingURL=animationFrame.js.map"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.animationFrameProvider = void 0;
var Subscription_1 = require("../Subscription");
exports.animationFrameProvider = {
    schedule: function (callback) {
        var request = requestAnimationFrame;
        var cancel = cancelAnimationFrame;
        var delegate = exports.animationFrameProvider.delegate;
        if (delegate) {
            request = delegate.requestAnimationFrame;
            cancel = delegate.cancelAnimationFrame;
        }
        var handle = request(function (timestamp) {
            cancel = undefined;
            callback(timestamp);
        });
        return new Subscription_1.Subscription(function () { return cancel === null || cancel === void 0 ? void 0 : cancel(handle); });
    },
    requestAnimationFrame: function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        var delegate = exports.animationFrameProvider.delegate;
        return ((delegate === null || delegate === void 0 ? void 0 : delegate.requestAnimationFrame) || requestAnimationFrame).apply(void 0, __spreadArray([], __read(args)));
    },
    cancelAnimationFrame: function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        var delegate = exports.animationFrameProvider.delegate;
        return ((delegate === null || delegate === void 0 ? void 0 : delegate.cancelAnimationFrame) || cancelAnimationFrame).apply(void 0, __spreadArray([], __read(args)));
    },
    delegate: undefined,
};
//# sourceMappingURL=animationFrameProvider.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.asap = exports.asapScheduler = void 0;
var AsapAction_1 = require("./AsapAction");
var AsapScheduler_1 = require("./AsapScheduler");
exports.asapScheduler = new AsapScheduler_1.AsapScheduler(AsapAction_1.AsapAction);
exports.asap = exports.asapScheduler;
//# sourceMappingURL=asap.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.async = exports.asyncScheduler = void 0;
var AsyncAction_1 = require("./AsyncAction");
var AsyncScheduler_1 = require("./AsyncScheduler");
exports.asyncScheduler = new AsyncScheduler_1.AsyncScheduler(AsyncAction_1.AsyncAction);
exports.async = exports.asyncScheduler;
//# sourceMappingURL=async.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.dateTimestampProvider = void 0;
exports.dateTimestampProvider = {
    now: function () {
        return (exports.dateTimestampProvider.delegate || Date).now();
    },
    delegate: undefined,
};
//# sourceMappingURL=dateTimestampProvider.js.map"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.immediateProvider = void 0;
var Immediate_1 = require("../util/Immediate");
var setImmediate = Immediate_1.Immediate.setImmediate, clearImmediate = Immediate_1.Immediate.clearImmediate;
exports.immediateProvider = {
    setImmediate: function () {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        var delegate = exports.immediateProvider.delegate;
        return ((delegate === null || delegate === void 0 ? void 0 : delegate.setImmediate) || setImmediate).apply(void 0, __spreadArray([], __read(args)));
    },
    clearImmediate: function (handle) {
        var delegate = exports.immediateProvider.delegate;
        return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearImmediate) || clearImmediate)(handle);
    },
    delegate: undefined,
};
//# sourceMappingURL=immediateProvider.js.map"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.intervalProvider = void 0;
exports.intervalProvider = {
    setInterval: function (handler, timeout) {
        var args = [];
        for (var _i = 2; _i < arguments.length; _i++) {
            args[_i - 2] = arguments[_i];
        }
        var delegate = exports.intervalProvider.delegate;
        if (delegate === null || delegate === void 0 ? void 0 : delegate.setInterval) {
            return delegate.setInterval.apply(delegate, __spreadArray([handler, timeout], __read(args)));
        }
        return setInterval.apply(void 0, __spreadArray([handler, timeout], __read(args)));
    },
    clearInterval: function (handle) {
        var delegate = exports.intervalProvider.delegate;
        return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearInterval) || clearInterval)(handle);
    },
    delegate: undefined,
};
//# sourceMappingURL=intervalProvider.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.performanceTimestampProvider = void 0;
exports.performanceTimestampProvider = {
    now: function () {
        return (exports.performanceTimestampProvider.delegate || performance).now();
    },
    delegate: undefined,
};
//# sourceMappingURL=performanceTimestampProvider.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.queue = exports.queueScheduler = void 0;
var QueueAction_1 = require("./QueueAction");
var QueueScheduler_1 = require("./QueueScheduler");
exports.queueScheduler = new QueueScheduler_1.QueueScheduler(QueueAction_1.QueueAction);
exports.queue = exports.queueScheduler;
//# sourceMappingURL=queue.js.map"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.timeoutProvider = void 0;
exports.timeoutProvider = {
    setTimeout: function (handler, timeout) {
        var args = [];
        for (var _i = 2; _i < arguments.length; _i++) {
            args[_i - 2] = arguments[_i];
        }
        var delegate = exports.timeoutProvider.delegate;
        if (delegate === null || delegate === void 0 ? void 0 : delegate.setTimeout) {
            return delegate.setTimeout.apply(delegate, __spreadArray([handler, timeout], __read(args)));
        }
        return setTimeout.apply(void 0, __spreadArray([handler, timeout], __read(args)));
    },
    clearTimeout: function (handle) {
        var delegate = exports.timeoutProvider.delegate;
        return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearTimeout) || clearTimeout)(handle);
    },
    delegate: undefined,
};
//# sourceMappingURL=timeoutProvider.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=timerHandle.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.scheduleArray = void 0;
var Observable_1 = require("../Observable");
function scheduleArray(input, scheduler) {
    return new Observable_1.Observable(function (subscriber) {
        var i = 0;
        return scheduler.schedule(function () {
            if (i === input.length) {
                subscriber.complete();
            }
            else {
                subscriber.next(input[i++]);
                if (!subscriber.closed) {
                    this.schedule();
                }
            }
        });
    });
}
exports.scheduleArray = scheduleArray;
//# sourceMappingURL=scheduleArray.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.scheduleAsyncIterable = void 0;
var Observable_1 = require("../Observable");
var executeSchedule_1 = require("../util/executeSchedule");
function scheduleAsyncIterable(input, scheduler) {
    if (!input) {
        throw new Error('Iterable cannot be null');
    }
    return new Observable_1.Observable(function (subscriber) {
        executeSchedule_1.executeSchedule(subscriber, scheduler, function () {
            var iterator = input[Symbol.asyncIterator]();
            executeSchedule_1.executeSchedule(subscriber, scheduler, function () {
                iterator.next().then(function (result) {
                    if (result.done) {
                        subscriber.complete();
                    }
                    else {
                        subscriber.next(result.value);
                    }
                });
            }, 0, true);
        });
    });
}
exports.scheduleAsyncIterable = scheduleAsyncIterable;
//# sourceMappingURL=scheduleAsyncIterable.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.scheduleIterable = void 0;
var Observable_1 = require("../Observable");
var iterator_1 = require("../symbol/iterator");
var isFunction_1 = require("../util/isFunction");
var executeSchedule_1 = require("../util/executeSchedule");
function scheduleIterable(input, scheduler) {
    return new Observable_1.Observable(function (subscriber) {
        var iterator;
        executeSchedule_1.executeSchedule(subscriber, scheduler, function () {
            iterator = input[iterator_1.iterator]();
            executeSchedule_1.executeSchedule(subscriber, scheduler, function () {
                var _a;
                var value;
                var done;
                try {
                    (_a = iterator.next(), value = _a.value, done = _a.done);
                }
                catch (err) {
                    subscriber.error(err);
                    return;
                }
                if (done) {
                    subscriber.complete();
                }
                else {
                    subscriber.next(value);
                }
            }, 0, true);
        });
        return function () { return isFunction_1.isFunction(iterator === null || iterator === void 0 ? void 0 : iterator.return) && iterator.return(); };
    });
}
exports.scheduleIterable = scheduleIterable;
//# sourceMappingURL=scheduleIterable.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.scheduleObservable = void 0;
var innerFrom_1 = require("../observable/innerFrom");
var observeOn_1 = require("../operators/observeOn");
var subscribeOn_1 = require("../operators/subscribeOn");
function scheduleObservable(input, scheduler) {
    return innerFrom_1.innerFrom(input).pipe(subscribeOn_1.subscribeOn(scheduler), observeOn_1.observeOn(scheduler));
}
exports.scheduleObservable = scheduleObservable;
//# sourceMappingURL=scheduleObservable.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.schedulePromise = void 0;
var innerFrom_1 = require("../observable/innerFrom");
var observeOn_1 = require("../operators/observeOn");
var subscribeOn_1 = require("../operators/subscribeOn");
function schedulePromise(input, scheduler) {
    return innerFrom_1.innerFrom(input).pipe(subscribeOn_1.subscribeOn(scheduler), observeOn_1.observeOn(scheduler));
}
exports.schedulePromise = schedulePromise;
//# sourceMappingURL=schedulePromise.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.scheduleReadableStreamLike = void 0;
var scheduleAsyncIterable_1 = require("./scheduleAsyncIterable");
var isReadableStreamLike_1 = require("../util/isReadableStreamLike");
function scheduleReadableStreamLike(input, scheduler) {
    return scheduleAsyncIterable_1.scheduleAsyncIterable(isReadableStreamLike_1.readableStreamLikeToAsyncGenerator(input), scheduler);
}
exports.scheduleReadableStreamLike = scheduleReadableStreamLike;
//# sourceMappingURL=scheduleReadableStreamLike.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.scheduled = void 0;
var scheduleObservable_1 = require("./scheduleObservable");
var schedulePromise_1 = require("./schedulePromise");
var scheduleArray_1 = require("./scheduleArray");
var scheduleIterable_1 = require("./scheduleIterable");
var scheduleAsyncIterable_1 = require("./scheduleAsyncIterable");
var isInteropObservable_1 = require("../util/isInteropObservable");
var isPromise_1 = require("../util/isPromise");
var isArrayLike_1 = require("../util/isArrayLike");
var isIterable_1 = require("../util/isIterable");
var isAsyncIterable_1 = require("../util/isAsyncIterable");
var throwUnobservableError_1 = require("../util/throwUnobservableError");
var isReadableStreamLike_1 = require("../util/isReadableStreamLike");
var scheduleReadableStreamLike_1 = require("./scheduleReadableStreamLike");
function scheduled(input, scheduler) {
    if (input != null) {
        if (isInteropObservable_1.isInteropObservable(input)) {
            return scheduleObservable_1.scheduleObservable(input, scheduler);
        }
        if (isArrayLike_1.isArrayLike(input)) {
            return scheduleArray_1.scheduleArray(input, scheduler);
        }
        if (isPromise_1.isPromise(input)) {
            return schedulePromise_1.schedulePromise(input, scheduler);
        }
        if (isAsyncIterable_1.isAsyncIterable(input)) {
            return scheduleAsyncIterable_1.scheduleAsyncIterable(input, scheduler);
        }
        if (isIterable_1.isIterable(input)) {
            return scheduleIterable_1.scheduleIterable(input, scheduler);
        }
        if (isReadableStreamLike_1.isReadableStreamLike(input)) {
            return scheduleReadableStreamLike_1.scheduleReadableStreamLike(input, scheduler);
        }
    }
    throw throwUnobservableError_1.createInvalidObservableTypeError(input);
}
exports.scheduled = scheduled;
//# sourceMappingURL=scheduled.js.map"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.OperatorSubscriber = exports.createOperatorSubscriber = void 0;
var Subscriber_1 = require("../Subscriber");
function createOperatorSubscriber(destination, onNext, onComplete, onError, onFinalize) {
    return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);
}
exports.createOperatorSubscriber = createOperatorSubscriber;
var OperatorSubscriber = (function (_super) {
    __extends(OperatorSubscriber, _super);
    function OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize, shouldUnsubscribe) {
        var _this = _super.call(this, destination) || this;
        _this.onFinalize = onFinalize;
        _this.shouldUnsubscribe = shouldUnsubscribe;
        _this._next = onNext
            ? function (value) {
                try {
                    onNext(value);
                }
                catch (err) {
                    destination.error(err);
                }
            }
            : _super.prototype._next;
        _this._error = onError
            ? function (err) {
                try {
                    onError(err);
                }
                catch (err) {
                    destination.error(err);
                }
                finally {
                    this.unsubscribe();
                }
            }
            : _super.prototype._error;
        _this._complete = onComplete
            ? function () {
                try {
                    onComplete();
                }
                catch (err) {
                    destination.error(err);
                }
                finally {
                    this.unsubscribe();
                }
            }
            : _super.prototype._complete;
        return _this;
    }
    OperatorSubscriber.prototype.unsubscribe = function () {
        var _a;
        if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {
            var closed_1 = this.closed;
            _super.prototype.unsubscribe.call(this);
            !closed_1 && ((_a = this.onFinalize) === null || _a === void 0 ? void 0 : _a.call(this));
        }
    };
    return OperatorSubscriber;
}(Subscriber_1.Subscriber));
exports.OperatorSubscriber = OperatorSubscriber;
//# sourceMappingURL=OperatorSubscriber.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.audit = void 0;
var lift_1 = require("../util/lift");
var innerFrom_1 = require("../observable/innerFrom");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function audit(durationSelector) {
    return lift_1.operate(function (source, subscriber) {
        var hasValue = false;
        var lastValue = null;
        var durationSubscriber = null;
        var isComplete = false;
        var endDuration = function () {
            durationSubscriber === null || durationSubscriber === void 0 ? void 0 : durationSubscriber.unsubscribe();
            durationSubscriber = null;
            if (hasValue) {
                hasValue = false;
                var value = lastValue;
                lastValue = null;
                subscriber.next(value);
            }
            isComplete && subscriber.complete();
        };
        var cleanupDuration = function () {
            durationSubscriber = null;
            isComplete && subscriber.complete();
        };
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            hasValue = true;
            lastValue = value;
            if (!durationSubscriber) {
                innerFrom_1.innerFrom(durationSelector(value)).subscribe((durationSubscriber = OperatorSubscriber_1.createOperatorSubscriber(subscriber, endDuration, cleanupDuration)));
            }
        }, function () {
            isComplete = true;
            (!hasValue || !durationSubscriber || durationSubscriber.closed) && subscriber.complete();
        }));
    });
}
exports.audit = audit;
//# sourceMappingURL=audit.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.auditTime = void 0;
var async_1 = require("../scheduler/async");
var audit_1 = require("./audit");
var timer_1 = require("../observable/timer");
function auditTime(duration, scheduler) {
    if (scheduler === void 0) { scheduler = async_1.asyncScheduler; }
    return audit_1.audit(function () { return timer_1.timer(duration, scheduler); });
}
exports.auditTime = auditTime;
//# sourceMappingURL=auditTime.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.buffer = void 0;
var lift_1 = require("../util/lift");
var noop_1 = require("../util/noop");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function buffer(closingNotifier) {
    return lift_1.operate(function (source, subscriber) {
        var currentBuffer = [];
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) { return currentBuffer.push(value); }, function () {
            subscriber.next(currentBuffer);
            subscriber.complete();
        }));
        closingNotifier.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function () {
            var b = currentBuffer;
            currentBuffer = [];
            subscriber.next(b);
        }, noop_1.noop));
        return function () {
            currentBuffer = null;
        };
    });
}
exports.buffer = buffer;
//# sourceMappingURL=buffer.js.map"use strict";
var __values = (this && this.__values) || function(o) {
    var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
    if (m) return m.call(o);
    if (o && typeof o.length === "number") return {
        next: function () {
            if (o && i >= o.length) o = void 0;
            return { value: o && o[i++], done: !o };
        }
    };
    throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.bufferCount = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var arrRemove_1 = require("../util/arrRemove");
function bufferCount(bufferSize, startBufferEvery) {
    if (startBufferEvery === void 0) { startBufferEvery = null; }
    startBufferEvery = startBufferEvery !== null && startBufferEvery !== void 0 ? startBufferEvery : bufferSize;
    return lift_1.operate(function (source, subscriber) {
        var buffers = [];
        var count = 0;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            var e_1, _a, e_2, _b;
            var toEmit = null;
            if (count++ % startBufferEvery === 0) {
                buffers.push([]);
            }
            try {
                for (var buffers_1 = __values(buffers), buffers_1_1 = buffers_1.next(); !buffers_1_1.done; buffers_1_1 = buffers_1.next()) {
                    var buffer = buffers_1_1.value;
                    buffer.push(value);
                    if (bufferSize <= buffer.length) {
                        toEmit = toEmit !== null && toEmit !== void 0 ? toEmit : [];
                        toEmit.push(buffer);
                    }
                }
            }
            catch (e_1_1) { e_1 = { error: e_1_1 }; }
            finally {
                try {
                    if (buffers_1_1 && !buffers_1_1.done && (_a = buffers_1.return)) _a.call(buffers_1);
                }
                finally { if (e_1) throw e_1.error; }
            }
            if (toEmit) {
                try {
                    for (var toEmit_1 = __values(toEmit), toEmit_1_1 = toEmit_1.next(); !toEmit_1_1.done; toEmit_1_1 = toEmit_1.next()) {
                        var buffer = toEmit_1_1.value;
                        arrRemove_1.arrRemove(buffers, buffer);
                        subscriber.next(buffer);
                    }
                }
                catch (e_2_1) { e_2 = { error: e_2_1 }; }
                finally {
                    try {
                        if (toEmit_1_1 && !toEmit_1_1.done && (_b = toEmit_1.return)) _b.call(toEmit_1);
                    }
                    finally { if (e_2) throw e_2.error; }
                }
            }
        }, function () {
            var e_3, _a;
            try {
                for (var buffers_2 = __values(buffers), buffers_2_1 = buffers_2.next(); !buffers_2_1.done; buffers_2_1 = buffers_2.next()) {
                    var buffer = buffers_2_1.value;
                    subscriber.next(buffer);
                }
            }
            catch (e_3_1) { e_3 = { error: e_3_1 }; }
            finally {
                try {
                    if (buffers_2_1 && !buffers_2_1.done && (_a = buffers_2.return)) _a.call(buffers_2);
                }
                finally { if (e_3) throw e_3.error; }
            }
            subscriber.complete();
        }, undefined, function () {
            buffers = null;
        }));
    });
}
exports.bufferCount = bufferCount;
//# sourceMappingURL=bufferCount.js.map"use strict";
var __values = (this && this.__values) || function(o) {
    var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
    if (m) return m.call(o);
    if (o && typeof o.length === "number") return {
        next: function () {
            if (o && i >= o.length) o = void 0;
            return { value: o && o[i++], done: !o };
        }
    };
    throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.bufferTime = void 0;
var Subscription_1 = require("../Subscription");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var arrRemove_1 = require("../util/arrRemove");
var async_1 = require("../scheduler/async");
var args_1 = require("../util/args");
var executeSchedule_1 = require("../util/executeSchedule");
function bufferTime(bufferTimeSpan) {
    var _a, _b;
    var otherArgs = [];
    for (var _i = 1; _i < arguments.length; _i++) {
        otherArgs[_i - 1] = arguments[_i];
    }
    var scheduler = (_a = args_1.popScheduler(otherArgs)) !== null && _a !== void 0 ? _a : async_1.asyncScheduler;
    var bufferCreationInterval = (_b = otherArgs[0]) !== null && _b !== void 0 ? _b : null;
    var maxBufferSize = otherArgs[1] || Infinity;
    return lift_1.operate(function (source, subscriber) {
        var bufferRecords = [];
        var restartOnEmit = false;
        var emit = function (record) {
            var buffer = record.buffer, subs = record.subs;
            subs.unsubscribe();
            arrRemove_1.arrRemove(bufferRecords, record);
            subscriber.next(buffer);
            restartOnEmit && startBuffer();
        };
        var startBuffer = function () {
            if (bufferRecords) {
                var subs = new Subscription_1.Subscription();
                subscriber.add(subs);
                var buffer = [];
                var record_1 = {
                    buffer: buffer,
                    subs: subs,
                };
                bufferRecords.push(record_1);
                executeSchedule_1.executeSchedule(subs, scheduler, function () { return emit(record_1); }, bufferTimeSpan);
            }
        };
        if (bufferCreationInterval !== null && bufferCreationInterval >= 0) {
            executeSchedule_1.executeSchedule(subscriber, scheduler, startBuffer, bufferCreationInterval, true);
        }
        else {
            restartOnEmit = true;
        }
        startBuffer();
        var bufferTimeSubscriber = OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            var e_1, _a;
            var recordsCopy = bufferRecords.slice();
            try {
                for (var recordsCopy_1 = __values(recordsCopy), recordsCopy_1_1 = recordsCopy_1.next(); !recordsCopy_1_1.done; recordsCopy_1_1 = recordsCopy_1.next()) {
                    var record = recordsCopy_1_1.value;
                    var buffer = record.buffer;
                    buffer.push(value);
                    maxBufferSize <= buffer.length && emit(record);
                }
            }
            catch (e_1_1) { e_1 = { error: e_1_1 }; }
            finally {
                try {
                    if (recordsCopy_1_1 && !recordsCopy_1_1.done && (_a = recordsCopy_1.return)) _a.call(recordsCopy_1);
                }
                finally { if (e_1) throw e_1.error; }
            }
        }, function () {
            while (bufferRecords === null || bufferRecords === void 0 ? void 0 : bufferRecords.length) {
                subscriber.next(bufferRecords.shift().buffer);
            }
            bufferTimeSubscriber === null || bufferTimeSubscriber === void 0 ? void 0 : bufferTimeSubscriber.unsubscribe();
            subscriber.complete();
            subscriber.unsubscribe();
        }, undefined, function () { return (bufferRecords = null); });
        source.subscribe(bufferTimeSubscriber);
    });
}
exports.bufferTime = bufferTime;
//# sourceMappingURL=bufferTime.js.map"use strict";
var __values = (this && this.__values) || function(o) {
    var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
    if (m) return m.call(o);
    if (o && typeof o.length === "number") return {
        next: function () {
            if (o && i >= o.length) o = void 0;
            return { value: o && o[i++], done: !o };
        }
    };
    throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.bufferToggle = void 0;
var Subscription_1 = require("../Subscription");
var lift_1 = require("../util/lift");
var innerFrom_1 = require("../observable/innerFrom");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var noop_1 = require("../util/noop");
var arrRemove_1 = require("../util/arrRemove");
function bufferToggle(openings, closingSelector) {
    return lift_1.operate(function (source, subscriber) {
        var buffers = [];
        innerFrom_1.innerFrom(openings).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (openValue) {
            var buffer = [];
            buffers.push(buffer);
            var closingSubscription = new Subscription_1.Subscription();
            var emitBuffer = function () {
                arrRemove_1.arrRemove(buffers, buffer);
                subscriber.next(buffer);
                closingSubscription.unsubscribe();
            };
            closingSubscription.add(innerFrom_1.innerFrom(closingSelector(openValue)).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, emitBuffer, noop_1.noop)));
        }, noop_1.noop));
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            var e_1, _a;
            try {
                for (var buffers_1 = __values(buffers), buffers_1_1 = buffers_1.next(); !buffers_1_1.done; buffers_1_1 = buffers_1.next()) {
                    var buffer = buffers_1_1.value;
                    buffer.push(value);
                }
            }
            catch (e_1_1) { e_1 = { error: e_1_1 }; }
            finally {
                try {
                    if (buffers_1_1 && !buffers_1_1.done && (_a = buffers_1.return)) _a.call(buffers_1);
                }
                finally { if (e_1) throw e_1.error; }
            }
        }, function () {
            while (buffers.length > 0) {
                subscriber.next(buffers.shift());
            }
            subscriber.complete();
        }));
    });
}
exports.bufferToggle = bufferToggle;
//# sourceMappingURL=bufferToggle.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.bufferWhen = void 0;
var lift_1 = require("../util/lift");
var noop_1 = require("../util/noop");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var innerFrom_1 = require("../observable/innerFrom");
function bufferWhen(closingSelector) {
    return lift_1.operate(function (source, subscriber) {
        var buffer = null;
        var closingSubscriber = null;
        var openBuffer = function () {
            closingSubscriber === null || closingSubscriber === void 0 ? void 0 : closingSubscriber.unsubscribe();
            var b = buffer;
            buffer = [];
            b && subscriber.next(b);
            innerFrom_1.innerFrom(closingSelector()).subscribe((closingSubscriber = OperatorSubscriber_1.createOperatorSubscriber(subscriber, openBuffer, noop_1.noop)));
        };
        openBuffer();
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) { return buffer === null || buffer === void 0 ? void 0 : buffer.push(value); }, function () {
            buffer && subscriber.next(buffer);
            subscriber.complete();
        }, undefined, function () { return (buffer = closingSubscriber = null); }));
    });
}
exports.bufferWhen = bufferWhen;
//# sourceMappingURL=bufferWhen.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.catchError = void 0;
var innerFrom_1 = require("../observable/innerFrom");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var lift_1 = require("../util/lift");
function catchError(selector) {
    return lift_1.operate(function (source, subscriber) {
        var innerSub = null;
        var syncUnsub = false;
        var handledResult;
        innerSub = source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, undefined, undefined, function (err) {
            handledResult = innerFrom_1.innerFrom(selector(err, catchError(selector)(source)));
            if (innerSub) {
                innerSub.unsubscribe();
                innerSub = null;
                handledResult.subscribe(subscriber);
            }
            else {
                syncUnsub = true;
            }
        }));
        if (syncUnsub) {
            innerSub.unsubscribe();
            innerSub = null;
            handledResult.subscribe(subscriber);
        }
    });
}
exports.catchError = catchError;
//# sourceMappingURL=catchError.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.combineAll = void 0;
var combineLatestAll_1 = require("./combineLatestAll");
exports.combineAll = combineLatestAll_1.combineLatestAll;
//# sourceMappingURL=combineAll.js.map"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.combineLatest = void 0;
var combineLatest_1 = require("../observable/combineLatest");
var lift_1 = require("../util/lift");
var argsOrArgArray_1 = require("../util/argsOrArgArray");
var mapOneOrManyArgs_1 = require("../util/mapOneOrManyArgs");
var pipe_1 = require("../util/pipe");
var args_1 = require("../util/args");
function combineLatest() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var resultSelector = args_1.popResultSelector(args);
    return resultSelector
        ? pipe_1.pipe(combineLatest.apply(void 0, __spreadArray([], __read(args))), mapOneOrManyArgs_1.mapOneOrManyArgs(resultSelector))
        : lift_1.operate(function (source, subscriber) {
            combineLatest_1.combineLatestInit(__spreadArray([source], __read(argsOrArgArray_1.argsOrArgArray(args))))(subscriber);
        });
}
exports.combineLatest = combineLatest;
//# sourceMappingURL=combineLatest.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.combineLatestAll = void 0;
var combineLatest_1 = require("../observable/combineLatest");
var joinAllInternals_1 = require("./joinAllInternals");
function combineLatestAll(project) {
    return joinAllInternals_1.joinAllInternals(combineLatest_1.combineLatest, project);
}
exports.combineLatestAll = combineLatestAll;
//# sourceMappingURL=combineLatestAll.js.map"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.combineLatestWith = void 0;
var combineLatest_1 = require("./combineLatest");
function combineLatestWith() {
    var otherSources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        otherSources[_i] = arguments[_i];
    }
    return combineLatest_1.combineLatest.apply(void 0, __spreadArray([], __read(otherSources)));
}
exports.combineLatestWith = combineLatestWith;
//# sourceMappingURL=combineLatestWith.js.map"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.concat = void 0;
var lift_1 = require("../util/lift");
var concatAll_1 = require("./concatAll");
var args_1 = require("../util/args");
var from_1 = require("../observable/from");
function concat() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var scheduler = args_1.popScheduler(args);
    return lift_1.operate(function (source, subscriber) {
        concatAll_1.concatAll()(from_1.from(__spreadArray([source], __read(args)), scheduler)).subscribe(subscriber);
    });
}
exports.concat = concat;
//# sourceMappingURL=concat.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.concatAll = void 0;
var mergeAll_1 = require("./mergeAll");
function concatAll() {
    return mergeAll_1.mergeAll(1);
}
exports.concatAll = concatAll;
//# sourceMappingURL=concatAll.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.concatMap = void 0;
var mergeMap_1 = require("./mergeMap");
var isFunction_1 = require("../util/isFunction");
function concatMap(project, resultSelector) {
    return isFunction_1.isFunction(resultSelector) ? mergeMap_1.mergeMap(project, resultSelector, 1) : mergeMap_1.mergeMap(project, 1);
}
exports.concatMap = concatMap;
//# sourceMappingURL=concatMap.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.concatMapTo = void 0;
var concatMap_1 = require("./concatMap");
var isFunction_1 = require("../util/isFunction");
function concatMapTo(innerObservable, resultSelector) {
    return isFunction_1.isFunction(resultSelector) ? concatMap_1.concatMap(function () { return innerObservable; }, resultSelector) : concatMap_1.concatMap(function () { return innerObservable; });
}
exports.concatMapTo = concatMapTo;
//# sourceMappingURL=concatMapTo.js.map"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.concatWith = void 0;
var concat_1 = require("./concat");
function concatWith() {
    var otherSources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        otherSources[_i] = arguments[_i];
    }
    return concat_1.concat.apply(void 0, __spreadArray([], __read(otherSources)));
}
exports.concatWith = concatWith;
//# sourceMappingURL=concatWith.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.connect = void 0;
var Subject_1 = require("../Subject");
var innerFrom_1 = require("../observable/innerFrom");
var lift_1 = require("../util/lift");
var fromSubscribable_1 = require("../observable/fromSubscribable");
var DEFAULT_CONFIG = {
    connector: function () { return new Subject_1.Subject(); },
};
function connect(selector, config) {
    if (config === void 0) { config = DEFAULT_CONFIG; }
    var connector = config.connector;
    return lift_1.operate(function (source, subscriber) {
        var subject = connector();
        innerFrom_1.innerFrom(selector(fromSubscribable_1.fromSubscribable(subject))).subscribe(subscriber);
        subscriber.add(source.subscribe(subject));
    });
}
exports.connect = connect;
//# sourceMappingURL=connect.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.count = void 0;
var reduce_1 = require("./reduce");
function count(predicate) {
    return reduce_1.reduce(function (total, value, i) { return (!predicate || predicate(value, i) ? total + 1 : total); }, 0);
}
exports.count = count;
//# sourceMappingURL=count.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.debounce = void 0;
var lift_1 = require("../util/lift");
var noop_1 = require("../util/noop");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var innerFrom_1 = require("../observable/innerFrom");
function debounce(durationSelector) {
    return lift_1.operate(function (source, subscriber) {
        var hasValue = false;
        var lastValue = null;
        var durationSubscriber = null;
        var emit = function () {
            durationSubscriber === null || durationSubscriber === void 0 ? void 0 : durationSubscriber.unsubscribe();
            durationSubscriber = null;
            if (hasValue) {
                hasValue = false;
                var value = lastValue;
                lastValue = null;
                subscriber.next(value);
            }
        };
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            durationSubscriber === null || durationSubscriber === void 0 ? void 0 : durationSubscriber.unsubscribe();
            hasValue = true;
            lastValue = value;
            durationSubscriber = OperatorSubscriber_1.createOperatorSubscriber(subscriber, emit, noop_1.noop);
            innerFrom_1.innerFrom(durationSelector(value)).subscribe(durationSubscriber);
        }, function () {
            emit();
            subscriber.complete();
        }, undefined, function () {
            lastValue = durationSubscriber = null;
        }));
    });
}
exports.debounce = debounce;
//# sourceMappingURL=debounce.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.debounceTime = void 0;
var async_1 = require("../scheduler/async");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function debounceTime(dueTime, scheduler) {
    if (scheduler === void 0) { scheduler = async_1.asyncScheduler; }
    return lift_1.operate(function (source, subscriber) {
        var activeTask = null;
        var lastValue = null;
        var lastTime = null;
        var emit = function () {
            if (activeTask) {
                activeTask.unsubscribe();
                activeTask = null;
                var value = lastValue;
                lastValue = null;
                subscriber.next(value);
            }
        };
        function emitWhenIdle() {
            var targetTime = lastTime + dueTime;
            var now = scheduler.now();
            if (now < targetTime) {
                activeTask = this.schedule(undefined, targetTime - now);
                subscriber.add(activeTask);
                return;
            }
            emit();
        }
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            lastValue = value;
            lastTime = scheduler.now();
            if (!activeTask) {
                activeTask = scheduler.schedule(emitWhenIdle, dueTime);
                subscriber.add(activeTask);
            }
        }, function () {
            emit();
            subscriber.complete();
        }, undefined, function () {
            lastValue = activeTask = null;
        }));
    });
}
exports.debounceTime = debounceTime;
//# sourceMappingURL=debounceTime.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.defaultIfEmpty = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function defaultIfEmpty(defaultValue) {
    return lift_1.operate(function (source, subscriber) {
        var hasValue = false;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            hasValue = true;
            subscriber.next(value);
        }, function () {
            if (!hasValue) {
                subscriber.next(defaultValue);
            }
            subscriber.complete();
        }));
    });
}
exports.defaultIfEmpty = defaultIfEmpty;
//# sourceMappingURL=defaultIfEmpty.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.delay = void 0;
var async_1 = require("../scheduler/async");
var delayWhen_1 = require("./delayWhen");
var timer_1 = require("../observable/timer");
function delay(due, scheduler) {
    if (scheduler === void 0) { scheduler = async_1.asyncScheduler; }
    var duration = timer_1.timer(due, scheduler);
    return delayWhen_1.delayWhen(function () { return duration; });
}
exports.delay = delay;
//# sourceMappingURL=delay.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.delayWhen = void 0;
var concat_1 = require("../observable/concat");
var take_1 = require("./take");
var ignoreElements_1 = require("./ignoreElements");
var mapTo_1 = require("./mapTo");
var mergeMap_1 = require("./mergeMap");
function delayWhen(delayDurationSelector, subscriptionDelay) {
    if (subscriptionDelay) {
        return function (source) {
            return concat_1.concat(subscriptionDelay.pipe(take_1.take(1), ignoreElements_1.ignoreElements()), source.pipe(delayWhen(delayDurationSelector)));
        };
    }
    return mergeMap_1.mergeMap(function (value, index) { return delayDurationSelector(value, index).pipe(take_1.take(1), mapTo_1.mapTo(value)); });
}
exports.delayWhen = delayWhen;
//# sourceMappingURL=delayWhen.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.dematerialize = void 0;
var Notification_1 = require("../Notification");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function dematerialize() {
    return lift_1.operate(function (source, subscriber) {
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (notification) { return Notification_1.observeNotification(notification, subscriber); }));
    });
}
exports.dematerialize = dematerialize;
//# sourceMappingURL=dematerialize.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.distinct = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var noop_1 = require("../util/noop");
function distinct(keySelector, flushes) {
    return lift_1.operate(function (source, subscriber) {
        var distinctKeys = new Set();
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            var key = keySelector ? keySelector(value) : value;
            if (!distinctKeys.has(key)) {
                distinctKeys.add(key);
                subscriber.next(value);
            }
        }));
        flushes === null || flushes === void 0 ? void 0 : flushes.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function () { return distinctKeys.clear(); }, noop_1.noop));
    });
}
exports.distinct = distinct;
//# sourceMappingURL=distinct.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.distinctUntilChanged = void 0;
var identity_1 = require("../util/identity");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function distinctUntilChanged(comparator, keySelector) {
    if (keySelector === void 0) { keySelector = identity_1.identity; }
    comparator = comparator !== null && comparator !== void 0 ? comparator : defaultCompare;
    return lift_1.operate(function (source, subscriber) {
        var previousKey;
        var first = true;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            var currentKey = keySelector(value);
            if (first || !comparator(previousKey, currentKey)) {
                first = false;
                previousKey = currentKey;
                subscriber.next(value);
            }
        }));
    });
}
exports.distinctUntilChanged = distinctUntilChanged;
function defaultCompare(a, b) {
    return a === b;
}
//# sourceMappingURL=distinctUntilChanged.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.distinctUntilKeyChanged = void 0;
var distinctUntilChanged_1 = require("./distinctUntilChanged");
function distinctUntilKeyChanged(key, compare) {
    return distinctUntilChanged_1.distinctUntilChanged(function (x, y) { return compare ? compare(x[key], y[key]) : x[key] === y[key]; });
}
exports.distinctUntilKeyChanged = distinctUntilKeyChanged;
//# sourceMappingURL=distinctUntilKeyChanged.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.elementAt = void 0;
var ArgumentOutOfRangeError_1 = require("../util/ArgumentOutOfRangeError");
var filter_1 = require("./filter");
var throwIfEmpty_1 = require("./throwIfEmpty");
var defaultIfEmpty_1 = require("./defaultIfEmpty");
var take_1 = require("./take");
function elementAt(index, defaultValue) {
    if (index < 0) {
        throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError();
    }
    var hasDefaultValue = arguments.length >= 2;
    return function (source) {
        return source.pipe(filter_1.filter(function (v, i) { return i === index; }), take_1.take(1), hasDefaultValue ? defaultIfEmpty_1.defaultIfEmpty(defaultValue) : throwIfEmpty_1.throwIfEmpty(function () { return new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError(); }));
    };
}
exports.elementAt = elementAt;
//# sourceMappingURL=elementAt.js.map"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.endWith = void 0;
var concat_1 = require("../observable/concat");
var of_1 = require("../observable/of");
function endWith() {
    var values = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        values[_i] = arguments[_i];
    }
    return function (source) { return concat_1.concat(source, of_1.of.apply(void 0, __spreadArray([], __read(values)))); };
}
exports.endWith = endWith;
//# sourceMappingURL=endWith.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.every = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function every(predicate, thisArg) {
    return lift_1.operate(function (source, subscriber) {
        var index = 0;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            if (!predicate.call(thisArg, value, index++, source)) {
                subscriber.next(false);
                subscriber.complete();
            }
        }, function () {
            subscriber.next(true);
            subscriber.complete();
        }));
    });
}
exports.every = every;
//# sourceMappingURL=every.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.exhaust = void 0;
var exhaustAll_1 = require("./exhaustAll");
exports.exhaust = exhaustAll_1.exhaustAll;
//# sourceMappingURL=exhaust.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.exhaustAll = void 0;
var exhaustMap_1 = require("./exhaustMap");
var identity_1 = require("../util/identity");
function exhaustAll() {
    return exhaustMap_1.exhaustMap(identity_1.identity);
}
exports.exhaustAll = exhaustAll;
//# sourceMappingURL=exhaustAll.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.exhaustMap = void 0;
var map_1 = require("./map");
var innerFrom_1 = require("../observable/innerFrom");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function exhaustMap(project, resultSelector) {
    if (resultSelector) {
        return function (source) {
            return source.pipe(exhaustMap(function (a, i) { return innerFrom_1.innerFrom(project(a, i)).pipe(map_1.map(function (b, ii) { return resultSelector(a, b, i, ii); })); }));
        };
    }
    return lift_1.operate(function (source, subscriber) {
        var index = 0;
        var innerSub = null;
        var isComplete = false;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (outerValue) {
            if (!innerSub) {
                innerSub = OperatorSubscriber_1.createOperatorSubscriber(subscriber, undefined, function () {
                    innerSub = null;
                    isComplete && subscriber.complete();
                });
                innerFrom_1.innerFrom(project(outerValue, index++)).subscribe(innerSub);
            }
        }, function () {
            isComplete = true;
            !innerSub && subscriber.complete();
        }));
    });
}
exports.exhaustMap = exhaustMap;
//# sourceMappingURL=exhaustMap.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.expand = void 0;
var lift_1 = require("../util/lift");
var mergeInternals_1 = require("./mergeInternals");
function expand(project, concurrent, scheduler) {
    if (concurrent === void 0) { concurrent = Infinity; }
    concurrent = (concurrent || 0) < 1 ? Infinity : concurrent;
    return lift_1.operate(function (source, subscriber) {
        return mergeInternals_1.mergeInternals(source, subscriber, project, concurrent, undefined, true, scheduler);
    });
}
exports.expand = expand;
//# sourceMappingURL=expand.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.filter = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function filter(predicate, thisArg) {
    return lift_1.operate(function (source, subscriber) {
        var index = 0;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) { return predicate.call(thisArg, value, index++) && subscriber.next(value); }));
    });
}
exports.filter = filter;
//# sourceMappingURL=filter.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.finalize = void 0;
var lift_1 = require("../util/lift");
function finalize(callback) {
    return lift_1.operate(function (source, subscriber) {
        try {
            source.subscribe(subscriber);
        }
        finally {
            subscriber.add(callback);
        }
    });
}
exports.finalize = finalize;
//# sourceMappingURL=finalize.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createFind = exports.find = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function find(predicate, thisArg) {
    return lift_1.operate(createFind(predicate, thisArg, 'value'));
}
exports.find = find;
function createFind(predicate, thisArg, emit) {
    var findIndex = emit === 'index';
    return function (source, subscriber) {
        var index = 0;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            var i = index++;
            if (predicate.call(thisArg, value, i, source)) {
                subscriber.next(findIndex ? i : value);
                subscriber.complete();
            }
        }, function () {
            subscriber.next(findIndex ? -1 : undefined);
            subscriber.complete();
        }));
    };
}
exports.createFind = createFind;
//# sourceMappingURL=find.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.findIndex = void 0;
var lift_1 = require("../util/lift");
var find_1 = require("./find");
function findIndex(predicate, thisArg) {
    return lift_1.operate(find_1.createFind(predicate, thisArg, 'index'));
}
exports.findIndex = findIndex;
//# sourceMappingURL=findIndex.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.first = void 0;
var EmptyError_1 = require("../util/EmptyError");
var filter_1 = require("./filter");
var take_1 = require("./take");
var defaultIfEmpty_1 = require("./defaultIfEmpty");
var throwIfEmpty_1 = require("./throwIfEmpty");
var identity_1 = require("../util/identity");
function first(predicate, defaultValue) {
    var hasDefaultValue = arguments.length >= 2;
    return function (source) {
        return source.pipe(predicate ? filter_1.filter(function (v, i) { return predicate(v, i, source); }) : identity_1.identity, take_1.take(1), hasDefaultValue ? defaultIfEmpty_1.defaultIfEmpty(defaultValue) : throwIfEmpty_1.throwIfEmpty(function () { return new EmptyError_1.EmptyError(); }));
    };
}
exports.first = first;
//# sourceMappingURL=first.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.flatMap = void 0;
var mergeMap_1 = require("./mergeMap");
exports.flatMap = mergeMap_1.mergeMap;
//# sourceMappingURL=flatMap.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.groupBy = void 0;
var Observable_1 = require("../Observable");
var innerFrom_1 = require("../observable/innerFrom");
var Subject_1 = require("../Subject");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function groupBy(keySelector, elementOrOptions, duration, connector) {
    return lift_1.operate(function (source, subscriber) {
        var element;
        if (!elementOrOptions || typeof elementOrOptions === 'function') {
            element = elementOrOptions;
        }
        else {
            (duration = elementOrOptions.duration, element = elementOrOptions.element, connector = elementOrOptions.connector);
        }
        var groups = new Map();
        var notify = function (cb) {
            groups.forEach(cb);
            cb(subscriber);
        };
        var handleError = function (err) { return notify(function (consumer) { return consumer.error(err); }); };
        var activeGroups = 0;
        var teardownAttempted = false;
        var groupBySourceSubscriber = new OperatorSubscriber_1.OperatorSubscriber(subscriber, function (value) {
            try {
                var key_1 = keySelector(value);
                var group_1 = groups.get(key_1);
                if (!group_1) {
                    groups.set(key_1, (group_1 = connector ? connector() : new Subject_1.Subject()));
                    var grouped = createGroupedObservable(key_1, group_1);
                    subscriber.next(grouped);
                    if (duration) {
                        var durationSubscriber_1 = OperatorSubscriber_1.createOperatorSubscriber(group_1, function () {
                            group_1.complete();
                            durationSubscriber_1 === null || durationSubscriber_1 === void 0 ? void 0 : durationSubscriber_1.unsubscribe();
                        }, undefined, undefined, function () { return groups.delete(key_1); });
                        groupBySourceSubscriber.add(innerFrom_1.innerFrom(duration(grouped)).subscribe(durationSubscriber_1));
                    }
                }
                group_1.next(element ? element(value) : value);
            }
            catch (err) {
                handleError(err);
            }
        }, function () { return notify(function (consumer) { return consumer.complete(); }); }, handleError, function () { return groups.clear(); }, function () {
            teardownAttempted = true;
            return activeGroups === 0;
        });
        source.subscribe(groupBySourceSubscriber);
        function createGroupedObservable(key, groupSubject) {
            var result = new Observable_1.Observable(function (groupSubscriber) {
                activeGroups++;
                var innerSub = groupSubject.subscribe(groupSubscriber);
                return function () {
                    innerSub.unsubscribe();
                    --activeGroups === 0 && teardownAttempted && groupBySourceSubscriber.unsubscribe();
                };
            });
            result.key = key;
            return result;
        }
    });
}
exports.groupBy = groupBy;
//# sourceMappingURL=groupBy.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ignoreElements = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var noop_1 = require("../util/noop");
function ignoreElements() {
    return lift_1.operate(function (source, subscriber) {
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, noop_1.noop));
    });
}
exports.ignoreElements = ignoreElements;
//# sourceMappingURL=ignoreElements.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isEmpty = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function isEmpty() {
    return lift_1.operate(function (source, subscriber) {
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function () {
            subscriber.next(false);
            subscriber.complete();
        }, function () {
            subscriber.next(true);
            subscriber.complete();
        }));
    });
}
exports.isEmpty = isEmpty;
//# sourceMappingURL=isEmpty.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.joinAllInternals = void 0;
var identity_1 = require("../util/identity");
var mapOneOrManyArgs_1 = require("../util/mapOneOrManyArgs");
var pipe_1 = require("../util/pipe");
var mergeMap_1 = require("./mergeMap");
var toArray_1 = require("./toArray");
function joinAllInternals(joinFn, project) {
    return pipe_1.pipe(toArray_1.toArray(), mergeMap_1.mergeMap(function (sources) { return joinFn(sources); }), project ? mapOneOrManyArgs_1.mapOneOrManyArgs(project) : identity_1.identity);
}
exports.joinAllInternals = joinAllInternals;
//# sourceMappingURL=joinAllInternals.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.last = void 0;
var EmptyError_1 = require("../util/EmptyError");
var filter_1 = require("./filter");
var takeLast_1 = require("./takeLast");
var throwIfEmpty_1 = require("./throwIfEmpty");
var defaultIfEmpty_1 = require("./defaultIfEmpty");
var identity_1 = require("../util/identity");
function last(predicate, defaultValue) {
    var hasDefaultValue = arguments.length >= 2;
    return function (source) {
        return source.pipe(predicate ? filter_1.filter(function (v, i) { return predicate(v, i, source); }) : identity_1.identity, takeLast_1.takeLast(1), hasDefaultValue ? defaultIfEmpty_1.defaultIfEmpty(defaultValue) : throwIfEmpty_1.throwIfEmpty(function () { return new EmptyError_1.EmptyError(); }));
    };
}
exports.last = last;
//# sourceMappingURL=last.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.map = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function map(project, thisArg) {
    return lift_1.operate(function (source, subscriber) {
        var index = 0;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            subscriber.next(project.call(thisArg, value, index++));
        }));
    });
}
exports.map = map;
//# sourceMappingURL=map.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.mapTo = void 0;
var map_1 = require("./map");
function mapTo(value) {
    return map_1.map(function () { return value; });
}
exports.mapTo = mapTo;
//# sourceMappingURL=mapTo.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.materialize = void 0;
var Notification_1 = require("../Notification");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function materialize() {
    return lift_1.operate(function (source, subscriber) {
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            subscriber.next(Notification_1.Notification.createNext(value));
        }, function () {
            subscriber.next(Notification_1.Notification.createComplete());
            subscriber.complete();
        }, function (err) {
            subscriber.next(Notification_1.Notification.createError(err));
            subscriber.complete();
        }));
    });
}
exports.materialize = materialize;
//# sourceMappingURL=materialize.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.max = void 0;
var reduce_1 = require("./reduce");
var isFunction_1 = require("../util/isFunction");
function max(comparer) {
    return reduce_1.reduce(isFunction_1.isFunction(comparer) ? function (x, y) { return (comparer(x, y) > 0 ? x : y); } : function (x, y) { return (x > y ? x : y); });
}
exports.max = max;
//# sourceMappingURL=max.js.map"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.merge = void 0;
var lift_1 = require("../util/lift");
var argsOrArgArray_1 = require("../util/argsOrArgArray");
var mergeAll_1 = require("./mergeAll");
var args_1 = require("../util/args");
var from_1 = require("../observable/from");
function merge() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var scheduler = args_1.popScheduler(args);
    var concurrent = args_1.popNumber(args, Infinity);
    args = argsOrArgArray_1.argsOrArgArray(args);
    return lift_1.operate(function (source, subscriber) {
        mergeAll_1.mergeAll(concurrent)(from_1.from(__spreadArray([source], __read(args)), scheduler)).subscribe(subscriber);
    });
}
exports.merge = merge;
//# sourceMappingURL=merge.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.mergeAll = void 0;
var mergeMap_1 = require("./mergeMap");
var identity_1 = require("../util/identity");
function mergeAll(concurrent) {
    if (concurrent === void 0) { concurrent = Infinity; }
    return mergeMap_1.mergeMap(identity_1.identity, concurrent);
}
exports.mergeAll = mergeAll;
//# sourceMappingURL=mergeAll.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.mergeInternals = void 0;
var innerFrom_1 = require("../observable/innerFrom");
var executeSchedule_1 = require("../util/executeSchedule");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function mergeInternals(source, subscriber, project, concurrent, onBeforeNext, expand, innerSubScheduler, additionalFinalizer) {
    var buffer = [];
    var active = 0;
    var index = 0;
    var isComplete = false;
    var checkComplete = function () {
        if (isComplete && !buffer.length && !active) {
            subscriber.complete();
        }
    };
    var outerNext = function (value) { return (active < concurrent ? doInnerSub(value) : buffer.push(value)); };
    var doInnerSub = function (value) {
        expand && subscriber.next(value);
        active++;
        var innerComplete = false;
        innerFrom_1.innerFrom(project(value, index++)).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (innerValue) {
            onBeforeNext === null || onBeforeNext === void 0 ? void 0 : onBeforeNext(innerValue);
            if (expand) {
                outerNext(innerValue);
            }
            else {
                subscriber.next(innerValue);
            }
        }, function () {
            innerComplete = true;
        }, undefined, function () {
            if (innerComplete) {
                try {
                    active--;
                    var _loop_1 = function () {
                        var bufferedValue = buffer.shift();
                        if (innerSubScheduler) {
                            executeSchedule_1.executeSchedule(subscriber, innerSubScheduler, function () { return doInnerSub(bufferedValue); });
                        }
                        else {
                            doInnerSub(bufferedValue);
                        }
                    };
                    while (buffer.length && active < concurrent) {
                        _loop_1();
                    }
                    checkComplete();
                }
                catch (err) {
                    subscriber.error(err);
                }
            }
        }));
    };
    source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, outerNext, function () {
        isComplete = true;
        checkComplete();
    }));
    return function () {
        additionalFinalizer === null || additionalFinalizer === void 0 ? void 0 : additionalFinalizer();
    };
}
exports.mergeInternals = mergeInternals;
//# sourceMappingURL=mergeInternals.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.mergeMap = void 0;
var map_1 = require("./map");
var innerFrom_1 = require("../observable/innerFrom");
var lift_1 = require("../util/lift");
var mergeInternals_1 = require("./mergeInternals");
var isFunction_1 = require("../util/isFunction");
function mergeMap(project, resultSelector, concurrent) {
    if (concurrent === void 0) { concurrent = Infinity; }
    if (isFunction_1.isFunction(resultSelector)) {
        return mergeMap(function (a, i) { return map_1.map(function (b, ii) { return resultSelector(a, b, i, ii); })(innerFrom_1.innerFrom(project(a, i))); }, concurrent);
    }
    else if (typeof resultSelector === 'number') {
        concurrent = resultSelector;
    }
    return lift_1.operate(function (source, subscriber) { return mergeInternals_1.mergeInternals(source, subscriber, project, concurrent); });
}
exports.mergeMap = mergeMap;
//# sourceMappingURL=mergeMap.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.mergeMapTo = void 0;
var mergeMap_1 = require("./mergeMap");
var isFunction_1 = require("../util/isFunction");
function mergeMapTo(innerObservable, resultSelector, concurrent) {
    if (concurrent === void 0) { concurrent = Infinity; }
    if (isFunction_1.isFunction(resultSelector)) {
        return mergeMap_1.mergeMap(function () { return innerObservable; }, resultSelector, concurrent);
    }
    if (typeof resultSelector === 'number') {
        concurrent = resultSelector;
    }
    return mergeMap_1.mergeMap(function () { return innerObservable; }, concurrent);
}
exports.mergeMapTo = mergeMapTo;
//# sourceMappingURL=mergeMapTo.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.mergeScan = void 0;
var lift_1 = require("../util/lift");
var mergeInternals_1 = require("./mergeInternals");
function mergeScan(accumulator, seed, concurrent) {
    if (concurrent === void 0) { concurrent = Infinity; }
    return lift_1.operate(function (source, subscriber) {
        var state = seed;
        return mergeInternals_1.mergeInternals(source, subscriber, function (value, index) { return accumulator(state, value, index); }, concurrent, function (value) {
            state = value;
        }, false, undefined, function () { return (state = null); });
    });
}
exports.mergeScan = mergeScan;
//# sourceMappingURL=mergeScan.js.map"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.mergeWith = void 0;
var merge_1 = require("./merge");
function mergeWith() {
    var otherSources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        otherSources[_i] = arguments[_i];
    }
    return merge_1.merge.apply(void 0, __spreadArray([], __read(otherSources)));
}
exports.mergeWith = mergeWith;
//# sourceMappingURL=mergeWith.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.min = void 0;
var reduce_1 = require("./reduce");
var isFunction_1 = require("../util/isFunction");
function min(comparer) {
    return reduce_1.reduce(isFunction_1.isFunction(comparer) ? function (x, y) { return (comparer(x, y) < 0 ? x : y); } : function (x, y) { return (x < y ? x : y); });
}
exports.min = min;
//# sourceMappingURL=min.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.multicast = void 0;
var ConnectableObservable_1 = require("../observable/ConnectableObservable");
var isFunction_1 = require("../util/isFunction");
var connect_1 = require("./connect");
function multicast(subjectOrSubjectFactory, selector) {
    var subjectFactory = isFunction_1.isFunction(subjectOrSubjectFactory) ? subjectOrSubjectFactory : function () { return subjectOrSubjectFactory; };
    if (isFunction_1.isFunction(selector)) {
        return connect_1.connect(selector, {
            connector: subjectFactory,
        });
    }
    return function (source) { return new ConnectableObservable_1.ConnectableObservable(source, subjectFactory); };
}
exports.multicast = multicast;
//# sourceMappingURL=multicast.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.observeOn = void 0;
var executeSchedule_1 = require("../util/executeSchedule");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function observeOn(scheduler, delay) {
    if (delay === void 0) { delay = 0; }
    return lift_1.operate(function (source, subscriber) {
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) { return executeSchedule_1.executeSchedule(subscriber, scheduler, function () { return subscriber.next(value); }, delay); }, function () { return executeSchedule_1.executeSchedule(subscriber, scheduler, function () { return subscriber.complete(); }, delay); }, function (err) { return executeSchedule_1.executeSchedule(subscriber, scheduler, function () { return subscriber.error(err); }, delay); }));
    });
}
exports.observeOn = observeOn;
//# sourceMappingURL=observeOn.js.map"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.onErrorResumeNext = void 0;
var lift_1 = require("../util/lift");
var innerFrom_1 = require("../observable/innerFrom");
var argsOrArgArray_1 = require("../util/argsOrArgArray");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var noop_1 = require("../util/noop");
function onErrorResumeNext() {
    var sources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        sources[_i] = arguments[_i];
    }
    var nextSources = argsOrArgArray_1.argsOrArgArray(sources);
    return lift_1.operate(function (source, subscriber) {
        var remaining = __spreadArray([source], __read(nextSources));
        var subscribeNext = function () {
            if (!subscriber.closed) {
                if (remaining.length > 0) {
                    var nextSource = void 0;
                    try {
                        nextSource = innerFrom_1.innerFrom(remaining.shift());
                    }
                    catch (err) {
                        subscribeNext();
                        return;
                    }
                    var innerSub = OperatorSubscriber_1.createOperatorSubscriber(subscriber, undefined, noop_1.noop, noop_1.noop);
                    nextSource.subscribe(innerSub);
                    innerSub.add(subscribeNext);
                }
                else {
                    subscriber.complete();
                }
            }
        };
        subscribeNext();
    });
}
exports.onErrorResumeNext = onErrorResumeNext;
//# sourceMappingURL=onErrorResumeNext.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.pairwise = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function pairwise() {
    return lift_1.operate(function (source, subscriber) {
        var prev;
        var hasPrev = false;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            var p = prev;
            prev = value;
            hasPrev && subscriber.next([p, value]);
            hasPrev = true;
        }));
    });
}
exports.pairwise = pairwise;
//# sourceMappingURL=pairwise.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.partition = void 0;
var not_1 = require("../util/not");
var filter_1 = require("./filter");
function partition(predicate, thisArg) {
    return function (source) {
        return [filter_1.filter(predicate, thisArg)(source), filter_1.filter(not_1.not(predicate, thisArg))(source)];
    };
}
exports.partition = partition;
//# sourceMappingURL=partition.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.pluck = void 0;
var map_1 = require("./map");
function pluck() {
    var properties = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        properties[_i] = arguments[_i];
    }
    var length = properties.length;
    if (length === 0) {
        throw new Error('list of properties cannot be empty.');
    }
    return map_1.map(function (x) {
        var currentProp = x;
        for (var i = 0; i < length; i++) {
            var p = currentProp === null || currentProp === void 0 ? void 0 : currentProp[properties[i]];
            if (typeof p !== 'undefined') {
                currentProp = p;
            }
            else {
                return undefined;
            }
        }
        return currentProp;
    });
}
exports.pluck = pluck;
//# sourceMappingURL=pluck.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.publish = void 0;
var Subject_1 = require("../Subject");
var multicast_1 = require("./multicast");
var connect_1 = require("./connect");
function publish(selector) {
    return selector ? function (source) { return connect_1.connect(selector)(source); } : function (source) { return multicast_1.multicast(new Subject_1.Subject())(source); };
}
exports.publish = publish;
//# sourceMappingURL=publish.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.publishBehavior = void 0;
var BehaviorSubject_1 = require("../BehaviorSubject");
var ConnectableObservable_1 = require("../observable/ConnectableObservable");
function publishBehavior(initialValue) {
    return function (source) {
        var subject = new BehaviorSubject_1.BehaviorSubject(initialValue);
        return new ConnectableObservable_1.ConnectableObservable(source, function () { return subject; });
    };
}
exports.publishBehavior = publishBehavior;
//# sourceMappingURL=publishBehavior.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.publishLast = void 0;
var AsyncSubject_1 = require("../AsyncSubject");
var ConnectableObservable_1 = require("../observable/ConnectableObservable");
function publishLast() {
    return function (source) {
        var subject = new AsyncSubject_1.AsyncSubject();
        return new ConnectableObservable_1.ConnectableObservable(source, function () { return subject; });
    };
}
exports.publishLast = publishLast;
//# sourceMappingURL=publishLast.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.publishReplay = void 0;
var ReplaySubject_1 = require("../ReplaySubject");
var multicast_1 = require("./multicast");
var isFunction_1 = require("../util/isFunction");
function publishReplay(bufferSize, windowTime, selectorOrScheduler, timestampProvider) {
    if (selectorOrScheduler && !isFunction_1.isFunction(selectorOrScheduler)) {
        timestampProvider = selectorOrScheduler;
    }
    var selector = isFunction_1.isFunction(selectorOrScheduler) ? selectorOrScheduler : undefined;
    return function (source) { return multicast_1.multicast(new ReplaySubject_1.ReplaySubject(bufferSize, windowTime, timestampProvider), selector)(source); };
}
exports.publishReplay = publishReplay;
//# sourceMappingURL=publishReplay.js.map"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.race = void 0;
var argsOrArgArray_1 = require("../util/argsOrArgArray");
var raceWith_1 = require("./raceWith");
function race() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    return raceWith_1.raceWith.apply(void 0, __spreadArray([], __read(argsOrArgArray_1.argsOrArgArray(args))));
}
exports.race = race;
//# sourceMappingURL=race.js.map"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.raceWith = void 0;
var race_1 = require("../observable/race");
var lift_1 = require("../util/lift");
var identity_1 = require("../util/identity");
function raceWith() {
    var otherSources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        otherSources[_i] = arguments[_i];
    }
    return !otherSources.length
        ? identity_1.identity
        : lift_1.operate(function (source, subscriber) {
            race_1.raceInit(__spreadArray([source], __read(otherSources)))(subscriber);
        });
}
exports.raceWith = raceWith;
//# sourceMappingURL=raceWith.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.reduce = void 0;
var scanInternals_1 = require("./scanInternals");
var lift_1 = require("../util/lift");
function reduce(accumulator, seed) {
    return lift_1.operate(scanInternals_1.scanInternals(accumulator, seed, arguments.length >= 2, false, true));
}
exports.reduce = reduce;
//# sourceMappingURL=reduce.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.refCount = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function refCount() {
    return lift_1.operate(function (source, subscriber) {
        var connection = null;
        source._refCount++;
        var refCounter = OperatorSubscriber_1.createOperatorSubscriber(subscriber, undefined, undefined, undefined, function () {
            if (!source || source._refCount <= 0 || 0 < --source._refCount) {
                connection = null;
                return;
            }
            var sharedConnection = source._connection;
            var conn = connection;
            connection = null;
            if (sharedConnection && (!conn || sharedConnection === conn)) {
                sharedConnection.unsubscribe();
            }
            subscriber.unsubscribe();
        });
        source.subscribe(refCounter);
        if (!refCounter.closed) {
            connection = source.connect();
        }
    });
}
exports.refCount = refCount;
//# sourceMappingURL=refCount.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.repeat = void 0;
var empty_1 = require("../observable/empty");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var innerFrom_1 = require("../observable/innerFrom");
var timer_1 = require("../observable/timer");
function repeat(countOrConfig) {
    var _a;
    var count = Infinity;
    var delay;
    if (countOrConfig != null) {
        if (typeof countOrConfig === 'object') {
            (_a = countOrConfig.count, count = _a === void 0 ? Infinity : _a, delay = countOrConfig.delay);
        }
        else {
            count = countOrConfig;
        }
    }
    return count <= 0
        ? function () { return empty_1.EMPTY; }
        : lift_1.operate(function (source, subscriber) {
            var soFar = 0;
            var sourceSub;
            var resubscribe = function () {
                sourceSub === null || sourceSub === void 0 ? void 0 : sourceSub.unsubscribe();
                sourceSub = null;
                if (delay != null) {
                    var notifier = typeof delay === 'number' ? timer_1.timer(delay) : innerFrom_1.innerFrom(delay(soFar));
                    var notifierSubscriber_1 = OperatorSubscriber_1.createOperatorSubscriber(subscriber, function () {
                        notifierSubscriber_1.unsubscribe();
                        subscribeToSource();
                    });
                    notifier.subscribe(notifierSubscriber_1);
                }
                else {
                    subscribeToSource();
                }
            };
            var subscribeToSource = function () {
                var syncUnsub = false;
                sourceSub = source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, undefined, function () {
                    if (++soFar < count) {
                        if (sourceSub) {
                            resubscribe();
                        }
                        else {
                            syncUnsub = true;
                        }
                    }
                    else {
                        subscriber.complete();
                    }
                }));
                if (syncUnsub) {
                    resubscribe();
                }
            };
            subscribeToSource();
        });
}
exports.repeat = repeat;
//# sourceMappingURL=repeat.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.repeatWhen = void 0;
var Subject_1 = require("../Subject");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function repeatWhen(notifier) {
    return lift_1.operate(function (source, subscriber) {
        var innerSub;
        var syncResub = false;
        var completions$;
        var isNotifierComplete = false;
        var isMainComplete = false;
        var checkComplete = function () { return isMainComplete && isNotifierComplete && (subscriber.complete(), true); };
        var getCompletionSubject = function () {
            if (!completions$) {
                completions$ = new Subject_1.Subject();
                notifier(completions$).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function () {
                    if (innerSub) {
                        subscribeForRepeatWhen();
                    }
                    else {
                        syncResub = true;
                    }
                }, function () {
                    isNotifierComplete = true;
                    checkComplete();
                }));
            }
            return completions$;
        };
        var subscribeForRepeatWhen = function () {
            isMainComplete = false;
            innerSub = source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, undefined, function () {
                isMainComplete = true;
                !checkComplete() && getCompletionSubject().next();
            }));
            if (syncResub) {
                innerSub.unsubscribe();
                innerSub = null;
                syncResub = false;
                subscribeForRepeatWhen();
            }
        };
        subscribeForRepeatWhen();
    });
}
exports.repeatWhen = repeatWhen;
//# sourceMappingURL=repeatWhen.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.retry = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var identity_1 = require("../util/identity");
var timer_1 = require("../observable/timer");
var innerFrom_1 = require("../observable/innerFrom");
function retry(configOrCount) {
    if (configOrCount === void 0) { configOrCount = Infinity; }
    var config;
    if (configOrCount && typeof configOrCount === 'object') {
        config = configOrCount;
    }
    else {
        config = {
            count: configOrCount,
        };
    }
    var _a = config.count, count = _a === void 0 ? Infinity : _a, delay = config.delay, _b = config.resetOnSuccess, resetOnSuccess = _b === void 0 ? false : _b;
    return count <= 0
        ? identity_1.identity
        : lift_1.operate(function (source, subscriber) {
            var soFar = 0;
            var innerSub;
            var subscribeForRetry = function () {
                var syncUnsub = false;
                innerSub = source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
                    if (resetOnSuccess) {
                        soFar = 0;
                    }
                    subscriber.next(value);
                }, undefined, function (err) {
                    if (soFar++ < count) {
                        var resub_1 = function () {
                            if (innerSub) {
                                innerSub.unsubscribe();
                                innerSub = null;
                                subscribeForRetry();
                            }
                            else {
                                syncUnsub = true;
                            }
                        };
                        if (delay != null) {
                            var notifier = typeof delay === 'number' ? timer_1.timer(delay) : innerFrom_1.innerFrom(delay(err, soFar));
                            var notifierSubscriber_1 = OperatorSubscriber_1.createOperatorSubscriber(subscriber, function () {
                                notifierSubscriber_1.unsubscribe();
                                resub_1();
                            }, function () {
                                subscriber.complete();
                            });
                            notifier.subscribe(notifierSubscriber_1);
                        }
                        else {
                            resub_1();
                        }
                    }
                    else {
                        subscriber.error(err);
                    }
                }));
                if (syncUnsub) {
                    innerSub.unsubscribe();
                    innerSub = null;
                    subscribeForRetry();
                }
            };
            subscribeForRetry();
        });
}
exports.retry = retry;
//# sourceMappingURL=retry.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.retryWhen = void 0;
var Subject_1 = require("../Subject");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function retryWhen(notifier) {
    return lift_1.operate(function (source, subscriber) {
        var innerSub;
        var syncResub = false;
        var errors$;
        var subscribeForRetryWhen = function () {
            innerSub = source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, undefined, undefined, function (err) {
                if (!errors$) {
                    errors$ = new Subject_1.Subject();
                    notifier(errors$).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function () {
                        return innerSub ? subscribeForRetryWhen() : (syncResub = true);
                    }));
                }
                if (errors$) {
                    errors$.next(err);
                }
            }));
            if (syncResub) {
                innerSub.unsubscribe();
                innerSub = null;
                syncResub = false;
                subscribeForRetryWhen();
            }
        };
        subscribeForRetryWhen();
    });
}
exports.retryWhen = retryWhen;
//# sourceMappingURL=retryWhen.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.sample = void 0;
var lift_1 = require("../util/lift");
var noop_1 = require("../util/noop");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function sample(notifier) {
    return lift_1.operate(function (source, subscriber) {
        var hasValue = false;
        var lastValue = null;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            hasValue = true;
            lastValue = value;
        }));
        notifier.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function () {
            if (hasValue) {
                hasValue = false;
                var value = lastValue;
                lastValue = null;
                subscriber.next(value);
            }
        }, noop_1.noop));
    });
}
exports.sample = sample;
//# sourceMappingURL=sample.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.sampleTime = void 0;
var async_1 = require("../scheduler/async");
var sample_1 = require("./sample");
var interval_1 = require("../observable/interval");
function sampleTime(period, scheduler) {
    if (scheduler === void 0) { scheduler = async_1.asyncScheduler; }
    return sample_1.sample(interval_1.interval(period, scheduler));
}
exports.sampleTime = sampleTime;
//# sourceMappingURL=sampleTime.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.scan = void 0;
var lift_1 = require("../util/lift");
var scanInternals_1 = require("./scanInternals");
function scan(accumulator, seed) {
    return lift_1.operate(scanInternals_1.scanInternals(accumulator, seed, arguments.length >= 2, true));
}
exports.scan = scan;
//# sourceMappingURL=scan.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.scanInternals = void 0;
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function scanInternals(accumulator, seed, hasSeed, emitOnNext, emitBeforeComplete) {
    return function (source, subscriber) {
        var hasState = hasSeed;
        var state = seed;
        var index = 0;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            var i = index++;
            state = hasState
                ?
                    accumulator(state, value, i)
                :
                    ((hasState = true), value);
            emitOnNext && subscriber.next(state);
        }, emitBeforeComplete &&
            (function () {
                hasState && subscriber.next(state);
                subscriber.complete();
            })));
    };
}
exports.scanInternals = scanInternals;
//# sourceMappingURL=scanInternals.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.sequenceEqual = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function sequenceEqual(compareTo, comparator) {
    if (comparator === void 0) { comparator = function (a, b) { return a === b; }; }
    return lift_1.operate(function (source, subscriber) {
        var aState = createState();
        var bState = createState();
        var emit = function (isEqual) {
            subscriber.next(isEqual);
            subscriber.complete();
        };
        var createSubscriber = function (selfState, otherState) {
            var sequenceEqualSubscriber = OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (a) {
                var buffer = otherState.buffer, complete = otherState.complete;
                if (buffer.length === 0) {
                    complete ? emit(false) : selfState.buffer.push(a);
                }
                else {
                    !comparator(a, buffer.shift()) && emit(false);
                }
            }, function () {
                selfState.complete = true;
                var complete = otherState.complete, buffer = otherState.buffer;
                complete && emit(buffer.length === 0);
                sequenceEqualSubscriber === null || sequenceEqualSubscriber === void 0 ? void 0 : sequenceEqualSubscriber.unsubscribe();
            });
            return sequenceEqualSubscriber;
        };
        source.subscribe(createSubscriber(aState, bState));
        compareTo.subscribe(createSubscriber(bState, aState));
    });
}
exports.sequenceEqual = sequenceEqual;
function createState() {
    return {
        buffer: [],
        complete: false,
    };
}
//# sourceMappingURL=sequenceEqual.js.map"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.share = void 0;
var innerFrom_1 = require("../observable/innerFrom");
var Subject_1 = require("../Subject");
var Subscriber_1 = require("../Subscriber");
var lift_1 = require("../util/lift");
function share(options) {
    if (options === void 0) { options = {}; }
    var _a = options.connector, connector = _a === void 0 ? function () { return new Subject_1.Subject(); } : _a, _b = options.resetOnError, resetOnError = _b === void 0 ? true : _b, _c = options.resetOnComplete, resetOnComplete = _c === void 0 ? true : _c, _d = options.resetOnRefCountZero, resetOnRefCountZero = _d === void 0 ? true : _d;
    return function (wrapperSource) {
        var connection;
        var resetConnection;
        var subject;
        var refCount = 0;
        var hasCompleted = false;
        var hasErrored = false;
        var cancelReset = function () {
            resetConnection === null || resetConnection === void 0 ? void 0 : resetConnection.unsubscribe();
            resetConnection = undefined;
        };
        var reset = function () {
            cancelReset();
            connection = subject = undefined;
            hasCompleted = hasErrored = false;
        };
        var resetAndUnsubscribe = function () {
            var conn = connection;
            reset();
            conn === null || conn === void 0 ? void 0 : conn.unsubscribe();
        };
        return lift_1.operate(function (source, subscriber) {
            refCount++;
            if (!hasErrored && !hasCompleted) {
                cancelReset();
            }
            var dest = (subject = subject !== null && subject !== void 0 ? subject : connector());
            subscriber.add(function () {
                refCount--;
                if (refCount === 0 && !hasErrored && !hasCompleted) {
                    resetConnection = handleReset(resetAndUnsubscribe, resetOnRefCountZero);
                }
            });
            dest.subscribe(subscriber);
            if (!connection &&
                refCount > 0) {
                connection = new Subscriber_1.SafeSubscriber({
                    next: function (value) { return dest.next(value); },
                    error: function (err) {
                        hasErrored = true;
                        cancelReset();
                        resetConnection = handleReset(reset, resetOnError, err);
                        dest.error(err);
                    },
                    complete: function () {
                        hasCompleted = true;
                        cancelReset();
                        resetConnection = handleReset(reset, resetOnComplete);
                        dest.complete();
                    },
                });
                innerFrom_1.innerFrom(source).subscribe(connection);
            }
        })(wrapperSource);
    };
}
exports.share = share;
function handleReset(reset, on) {
    var args = [];
    for (var _i = 2; _i < arguments.length; _i++) {
        args[_i - 2] = arguments[_i];
    }
    if (on === true) {
        reset();
        return;
    }
    if (on === false) {
        return;
    }
    var onSubscriber = new Subscriber_1.SafeSubscriber({
        next: function () {
            onSubscriber.unsubscribe();
            reset();
        },
    });
    return on.apply(void 0, __spreadArray([], __read(args))).subscribe(onSubscriber);
}
//# sourceMappingURL=share.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.shareReplay = void 0;
var ReplaySubject_1 = require("../ReplaySubject");
var share_1 = require("./share");
function shareReplay(configOrBufferSize, windowTime, scheduler) {
    var _a, _b, _c;
    var bufferSize;
    var refCount = false;
    if (configOrBufferSize && typeof configOrBufferSize === 'object') {
        (_a = configOrBufferSize.bufferSize, bufferSize = _a === void 0 ? Infinity : _a, _b = configOrBufferSize.windowTime, windowTime = _b === void 0 ? Infinity : _b, _c = configOrBufferSize.refCount, refCount = _c === void 0 ? false : _c, scheduler = configOrBufferSize.scheduler);
    }
    else {
        bufferSize = (configOrBufferSize !== null && configOrBufferSize !== void 0 ? configOrBufferSize : Infinity);
    }
    return share_1.share({
        connector: function () { return new ReplaySubject_1.ReplaySubject(bufferSize, windowTime, scheduler); },
        resetOnError: true,
        resetOnComplete: false,
        resetOnRefCountZero: refCount,
    });
}
exports.shareReplay = shareReplay;
//# sourceMappingURL=shareReplay.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.single = void 0;
var EmptyError_1 = require("../util/EmptyError");
var SequenceError_1 = require("../util/SequenceError");
var NotFoundError_1 = require("../util/NotFoundError");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function single(predicate) {
    return lift_1.operate(function (source, subscriber) {
        var hasValue = false;
        var singleValue;
        var seenValue = false;
        var index = 0;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            seenValue = true;
            if (!predicate || predicate(value, index++, source)) {
                hasValue && subscriber.error(new SequenceError_1.SequenceError('Too many matching values'));
                hasValue = true;
                singleValue = value;
            }
        }, function () {
            if (hasValue) {
                subscriber.next(singleValue);
                subscriber.complete();
            }
            else {
                subscriber.error(seenValue ? new NotFoundError_1.NotFoundError('No matching values') : new EmptyError_1.EmptyError());
            }
        }));
    });
}
exports.single = single;
//# sourceMappingURL=single.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.skip = void 0;
var filter_1 = require("./filter");
function skip(count) {
    return filter_1.filter(function (_, index) { return count <= index; });
}
exports.skip = skip;
//# sourceMappingURL=skip.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.skipLast = void 0;
var identity_1 = require("../util/identity");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function skipLast(skipCount) {
    return skipCount <= 0
        ?
            identity_1.identity
        : lift_1.operate(function (source, subscriber) {
            var ring = new Array(skipCount);
            var seen = 0;
            source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
                var valueIndex = seen++;
                if (valueIndex < skipCount) {
                    ring[valueIndex] = value;
                }
                else {
                    var index = valueIndex % skipCount;
                    var oldValue = ring[index];
                    ring[index] = value;
                    subscriber.next(oldValue);
                }
            }));
            return function () {
                ring = null;
            };
        });
}
exports.skipLast = skipLast;
//# sourceMappingURL=skipLast.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.skipUntil = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var innerFrom_1 = require("../observable/innerFrom");
var noop_1 = require("../util/noop");
function skipUntil(notifier) {
    return lift_1.operate(function (source, subscriber) {
        var taking = false;
        var skipSubscriber = OperatorSubscriber_1.createOperatorSubscriber(subscriber, function () {
            skipSubscriber === null || skipSubscriber === void 0 ? void 0 : skipSubscriber.unsubscribe();
            taking = true;
        }, noop_1.noop);
        innerFrom_1.innerFrom(notifier).subscribe(skipSubscriber);
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) { return taking && subscriber.next(value); }));
    });
}
exports.skipUntil = skipUntil;
//# sourceMappingURL=skipUntil.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.skipWhile = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function skipWhile(predicate) {
    return lift_1.operate(function (source, subscriber) {
        var taking = false;
        var index = 0;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) { return (taking || (taking = !predicate(value, index++))) && subscriber.next(value); }));
    });
}
exports.skipWhile = skipWhile;
//# sourceMappingURL=skipWhile.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.startWith = void 0;
var concat_1 = require("../observable/concat");
var args_1 = require("../util/args");
var lift_1 = require("../util/lift");
function startWith() {
    var values = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        values[_i] = arguments[_i];
    }
    var scheduler = args_1.popScheduler(values);
    return lift_1.operate(function (source, subscriber) {
        (scheduler ? concat_1.concat(values, source, scheduler) : concat_1.concat(values, source)).subscribe(subscriber);
    });
}
exports.startWith = startWith;
//# sourceMappingURL=startWith.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.subscribeOn = void 0;
var lift_1 = require("../util/lift");
function subscribeOn(scheduler, delay) {
    if (delay === void 0) { delay = 0; }
    return lift_1.operate(function (source, subscriber) {
        subscriber.add(scheduler.schedule(function () { return source.subscribe(subscriber); }, delay));
    });
}
exports.subscribeOn = subscribeOn;
//# sourceMappingURL=subscribeOn.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.switchAll = void 0;
var switchMap_1 = require("./switchMap");
var identity_1 = require("../util/identity");
function switchAll() {
    return switchMap_1.switchMap(identity_1.identity);
}
exports.switchAll = switchAll;
//# sourceMappingURL=switchAll.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.switchMap = void 0;
var innerFrom_1 = require("../observable/innerFrom");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function switchMap(project, resultSelector) {
    return lift_1.operate(function (source, subscriber) {
        var innerSubscriber = null;
        var index = 0;
        var isComplete = false;
        var checkComplete = function () { return isComplete && !innerSubscriber && subscriber.complete(); };
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            innerSubscriber === null || innerSubscriber === void 0 ? void 0 : innerSubscriber.unsubscribe();
            var innerIndex = 0;
            var outerIndex = index++;
            innerFrom_1.innerFrom(project(value, outerIndex)).subscribe((innerSubscriber = OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (innerValue) { return subscriber.next(resultSelector ? resultSelector(value, innerValue, outerIndex, innerIndex++) : innerValue); }, function () {
                innerSubscriber = null;
                checkComplete();
            })));
        }, function () {
            isComplete = true;
            checkComplete();
        }));
    });
}
exports.switchMap = switchMap;
//# sourceMappingURL=switchMap.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.switchMapTo = void 0;
var switchMap_1 = require("./switchMap");
var isFunction_1 = require("../util/isFunction");
function switchMapTo(innerObservable, resultSelector) {
    return isFunction_1.isFunction(resultSelector) ? switchMap_1.switchMap(function () { return innerObservable; }, resultSelector) : switchMap_1.switchMap(function () { return innerObservable; });
}
exports.switchMapTo = switchMapTo;
//# sourceMappingURL=switchMapTo.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.switchScan = void 0;
var switchMap_1 = require("./switchMap");
var lift_1 = require("../util/lift");
function switchScan(accumulator, seed) {
    return lift_1.operate(function (source, subscriber) {
        var state = seed;
        switchMap_1.switchMap(function (value, index) { return accumulator(state, value, index); }, function (_, innerValue) { return ((state = innerValue), innerValue); })(source).subscribe(subscriber);
        return function () {
            state = null;
        };
    });
}
exports.switchScan = switchScan;
//# sourceMappingURL=switchScan.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.take = void 0;
var empty_1 = require("../observable/empty");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function take(count) {
    return count <= 0
        ?
            function () { return empty_1.EMPTY; }
        : lift_1.operate(function (source, subscriber) {
            var seen = 0;
            source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
                if (++seen <= count) {
                    subscriber.next(value);
                    if (count <= seen) {
                        subscriber.complete();
                    }
                }
            }));
        });
}
exports.take = take;
//# sourceMappingURL=take.js.map"use strict";
var __values = (this && this.__values) || function(o) {
    var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
    if (m) return m.call(o);
    if (o && typeof o.length === "number") return {
        next: function () {
            if (o && i >= o.length) o = void 0;
            return { value: o && o[i++], done: !o };
        }
    };
    throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.takeLast = void 0;
var empty_1 = require("../observable/empty");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function takeLast(count) {
    return count <= 0
        ? function () { return empty_1.EMPTY; }
        : lift_1.operate(function (source, subscriber) {
            var buffer = [];
            source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
                buffer.push(value);
                count < buffer.length && buffer.shift();
            }, function () {
                var e_1, _a;
                try {
                    for (var buffer_1 = __values(buffer), buffer_1_1 = buffer_1.next(); !buffer_1_1.done; buffer_1_1 = buffer_1.next()) {
                        var value = buffer_1_1.value;
                        subscriber.next(value);
                    }
                }
                catch (e_1_1) { e_1 = { error: e_1_1 }; }
                finally {
                    try {
                        if (buffer_1_1 && !buffer_1_1.done && (_a = buffer_1.return)) _a.call(buffer_1);
                    }
                    finally { if (e_1) throw e_1.error; }
                }
                subscriber.complete();
            }, undefined, function () {
                buffer = null;
            }));
        });
}
exports.takeLast = takeLast;
//# sourceMappingURL=takeLast.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.takeUntil = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var innerFrom_1 = require("../observable/innerFrom");
var noop_1 = require("../util/noop");
function takeUntil(notifier) {
    return lift_1.operate(function (source, subscriber) {
        innerFrom_1.innerFrom(notifier).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function () { return subscriber.complete(); }, noop_1.noop));
        !subscriber.closed && source.subscribe(subscriber);
    });
}
exports.takeUntil = takeUntil;
//# sourceMappingURL=takeUntil.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.takeWhile = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function takeWhile(predicate, inclusive) {
    if (inclusive === void 0) { inclusive = false; }
    return lift_1.operate(function (source, subscriber) {
        var index = 0;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            var result = predicate(value, index++);
            (result || inclusive) && subscriber.next(value);
            !result && subscriber.complete();
        }));
    });
}
exports.takeWhile = takeWhile;
//# sourceMappingURL=takeWhile.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.tap = void 0;
var isFunction_1 = require("../util/isFunction");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var identity_1 = require("../util/identity");
function tap(observerOrNext, error, complete) {
    var tapObserver = isFunction_1.isFunction(observerOrNext) || error || complete
        ?
            { next: observerOrNext, error: error, complete: complete }
        : observerOrNext;
    return tapObserver
        ? lift_1.operate(function (source, subscriber) {
            var _a;
            (_a = tapObserver.subscribe) === null || _a === void 0 ? void 0 : _a.call(tapObserver);
            var isUnsub = true;
            source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
                var _a;
                (_a = tapObserver.next) === null || _a === void 0 ? void 0 : _a.call(tapObserver, value);
                subscriber.next(value);
            }, function () {
                var _a;
                isUnsub = false;
                (_a = tapObserver.complete) === null || _a === void 0 ? void 0 : _a.call(tapObserver);
                subscriber.complete();
            }, function (err) {
                var _a;
                isUnsub = false;
                (_a = tapObserver.error) === null || _a === void 0 ? void 0 : _a.call(tapObserver, err);
                subscriber.error(err);
            }, function () {
                var _a, _b;
                if (isUnsub) {
                    (_a = tapObserver.unsubscribe) === null || _a === void 0 ? void 0 : _a.call(tapObserver);
                }
                (_b = tapObserver.finalize) === null || _b === void 0 ? void 0 : _b.call(tapObserver);
            }));
        })
        :
            identity_1.identity;
}
exports.tap = tap;
//# sourceMappingURL=tap.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.throttle = exports.defaultThrottleConfig = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var innerFrom_1 = require("../observable/innerFrom");
exports.defaultThrottleConfig = {
    leading: true,
    trailing: false,
};
function throttle(durationSelector, config) {
    if (config === void 0) { config = exports.defaultThrottleConfig; }
    return lift_1.operate(function (source, subscriber) {
        var leading = config.leading, trailing = config.trailing;
        var hasValue = false;
        var sendValue = null;
        var throttled = null;
        var isComplete = false;
        var endThrottling = function () {
            throttled === null || throttled === void 0 ? void 0 : throttled.unsubscribe();
            throttled = null;
            if (trailing) {
                send();
                isComplete && subscriber.complete();
            }
        };
        var cleanupThrottling = function () {
            throttled = null;
            isComplete && subscriber.complete();
        };
        var startThrottle = function (value) {
            return (throttled = innerFrom_1.innerFrom(durationSelector(value)).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, endThrottling, cleanupThrottling)));
        };
        var send = function () {
            if (hasValue) {
                hasValue = false;
                var value = sendValue;
                sendValue = null;
                subscriber.next(value);
                !isComplete && startThrottle(value);
            }
        };
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            hasValue = true;
            sendValue = value;
            !(throttled && !throttled.closed) && (leading ? send() : startThrottle(value));
        }, function () {
            isComplete = true;
            !(trailing && hasValue && throttled && !throttled.closed) && subscriber.complete();
        }));
    });
}
exports.throttle = throttle;
//# sourceMappingURL=throttle.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.throttleTime = void 0;
var async_1 = require("../scheduler/async");
var throttle_1 = require("./throttle");
var timer_1 = require("../observable/timer");
function throttleTime(duration, scheduler, config) {
    if (scheduler === void 0) { scheduler = async_1.asyncScheduler; }
    if (config === void 0) { config = throttle_1.defaultThrottleConfig; }
    var duration$ = timer_1.timer(duration, scheduler);
    return throttle_1.throttle(function () { return duration$; }, config);
}
exports.throttleTime = throttleTime;
//# sourceMappingURL=throttleTime.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.throwIfEmpty = void 0;
var EmptyError_1 = require("../util/EmptyError");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function throwIfEmpty(errorFactory) {
    if (errorFactory === void 0) { errorFactory = defaultErrorFactory; }
    return lift_1.operate(function (source, subscriber) {
        var hasValue = false;
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            hasValue = true;
            subscriber.next(value);
        }, function () { return (hasValue ? subscriber.complete() : subscriber.error(errorFactory())); }));
    });
}
exports.throwIfEmpty = throwIfEmpty;
function defaultErrorFactory() {
    return new EmptyError_1.EmptyError();
}
//# sourceMappingURL=throwIfEmpty.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TimeInterval = exports.timeInterval = void 0;
var async_1 = require("../scheduler/async");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function timeInterval(scheduler) {
    if (scheduler === void 0) { scheduler = async_1.asyncScheduler; }
    return lift_1.operate(function (source, subscriber) {
        var last = scheduler.now();
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            var now = scheduler.now();
            var interval = now - last;
            last = now;
            subscriber.next(new TimeInterval(value, interval));
        }));
    });
}
exports.timeInterval = timeInterval;
var TimeInterval = (function () {
    function TimeInterval(value, interval) {
        this.value = value;
        this.interval = interval;
    }
    return TimeInterval;
}());
exports.TimeInterval = TimeInterval;
//# sourceMappingURL=timeInterval.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.timeout = exports.TimeoutError = void 0;
var async_1 = require("../scheduler/async");
var isDate_1 = require("../util/isDate");
var lift_1 = require("../util/lift");
var innerFrom_1 = require("../observable/innerFrom");
var createErrorClass_1 = require("../util/createErrorClass");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var executeSchedule_1 = require("../util/executeSchedule");
exports.TimeoutError = createErrorClass_1.createErrorClass(function (_super) {
    return function TimeoutErrorImpl(info) {
        if (info === void 0) { info = null; }
        _super(this);
        this.message = 'Timeout has occurred';
        this.name = 'TimeoutError';
        this.info = info;
    };
});
function timeout(config, schedulerArg) {
    var _a = (isDate_1.isValidDate(config) ? { first: config } : typeof config === 'number' ? { each: config } : config), first = _a.first, each = _a.each, _b = _a.with, _with = _b === void 0 ? timeoutErrorFactory : _b, _c = _a.scheduler, scheduler = _c === void 0 ? schedulerArg !== null && schedulerArg !== void 0 ? schedulerArg : async_1.asyncScheduler : _c, _d = _a.meta, meta = _d === void 0 ? null : _d;
    if (first == null && each == null) {
        throw new TypeError('No timeout provided.');
    }
    return lift_1.operate(function (source, subscriber) {
        var originalSourceSubscription;
        var timerSubscription;
        var lastValue = null;
        var seen = 0;
        var startTimer = function (delay) {
            timerSubscription = executeSchedule_1.executeSchedule(subscriber, scheduler, function () {
                try {
                    originalSourceSubscription.unsubscribe();
                    innerFrom_1.innerFrom(_with({
                        meta: meta,
                        lastValue: lastValue,
                        seen: seen,
                    })).subscribe(subscriber);
                }
                catch (err) {
                    subscriber.error(err);
                }
            }, delay);
        };
        originalSourceSubscription = source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            timerSubscription === null || timerSubscription === void 0 ? void 0 : timerSubscription.unsubscribe();
            seen++;
            subscriber.next((lastValue = value));
            each > 0 && startTimer(each);
        }, undefined, undefined, function () {
            if (!(timerSubscription === null || timerSubscription === void 0 ? void 0 : timerSubscription.closed)) {
                timerSubscription === null || timerSubscription === void 0 ? void 0 : timerSubscription.unsubscribe();
            }
            lastValue = null;
        }));
        !seen && startTimer(first != null ? (typeof first === 'number' ? first : +first - scheduler.now()) : each);
    });
}
exports.timeout = timeout;
function timeoutErrorFactory(info) {
    throw new exports.TimeoutError(info);
}
//# sourceMappingURL=timeout.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.timeoutWith = void 0;
var async_1 = require("../scheduler/async");
var isDate_1 = require("../util/isDate");
var timeout_1 = require("./timeout");
function timeoutWith(due, withObservable, scheduler) {
    var first;
    var each;
    var _with;
    scheduler = scheduler !== null && scheduler !== void 0 ? scheduler : async_1.async;
    if (isDate_1.isValidDate(due)) {
        first = due;
    }
    else if (typeof due === 'number') {
        each = due;
    }
    if (withObservable) {
        _with = function () { return withObservable; };
    }
    else {
        throw new TypeError('No observable provided to switch to');
    }
    if (first == null && each == null) {
        throw new TypeError('No timeout provided.');
    }
    return timeout_1.timeout({
        first: first,
        each: each,
        scheduler: scheduler,
        with: _with,
    });
}
exports.timeoutWith = timeoutWith;
//# sourceMappingURL=timeoutWith.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.timestamp = void 0;
var dateTimestampProvider_1 = require("../scheduler/dateTimestampProvider");
var map_1 = require("./map");
function timestamp(timestampProvider) {
    if (timestampProvider === void 0) { timestampProvider = dateTimestampProvider_1.dateTimestampProvider; }
    return map_1.map(function (value) { return ({ value: value, timestamp: timestampProvider.now() }); });
}
exports.timestamp = timestamp;
//# sourceMappingURL=timestamp.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.toArray = void 0;
var reduce_1 = require("./reduce");
var lift_1 = require("../util/lift");
var arrReducer = function (arr, value) { return (arr.push(value), arr); };
function toArray() {
    return lift_1.operate(function (source, subscriber) {
        reduce_1.reduce(arrReducer, [])(source).subscribe(subscriber);
    });
}
exports.toArray = toArray;
//# sourceMappingURL=toArray.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.window = void 0;
var Subject_1 = require("../Subject");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var noop_1 = require("../util/noop");
function window(windowBoundaries) {
    return lift_1.operate(function (source, subscriber) {
        var windowSubject = new Subject_1.Subject();
        subscriber.next(windowSubject.asObservable());
        var errorHandler = function (err) {
            windowSubject.error(err);
            subscriber.error(err);
        };
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) { return windowSubject === null || windowSubject === void 0 ? void 0 : windowSubject.next(value); }, function () {
            windowSubject.complete();
            subscriber.complete();
        }, errorHandler));
        windowBoundaries.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function () {
            windowSubject.complete();
            subscriber.next((windowSubject = new Subject_1.Subject()));
        }, noop_1.noop, errorHandler));
        return function () {
            windowSubject === null || windowSubject === void 0 ? void 0 : windowSubject.unsubscribe();
            windowSubject = null;
        };
    });
}
exports.window = window;
//# sourceMappingURL=window.js.map"use strict";
var __values = (this && this.__values) || function(o) {
    var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
    if (m) return m.call(o);
    if (o && typeof o.length === "number") return {
        next: function () {
            if (o && i >= o.length) o = void 0;
            return { value: o && o[i++], done: !o };
        }
    };
    throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.windowCount = void 0;
var Subject_1 = require("../Subject");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
function windowCount(windowSize, startWindowEvery) {
    if (startWindowEvery === void 0) { startWindowEvery = 0; }
    var startEvery = startWindowEvery > 0 ? startWindowEvery : windowSize;
    return lift_1.operate(function (source, subscriber) {
        var windows = [new Subject_1.Subject()];
        var starts = [];
        var count = 0;
        subscriber.next(windows[0].asObservable());
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            var e_1, _a;
            try {
                for (var windows_1 = __values(windows), windows_1_1 = windows_1.next(); !windows_1_1.done; windows_1_1 = windows_1.next()) {
                    var window_1 = windows_1_1.value;
                    window_1.next(value);
                }
            }
            catch (e_1_1) { e_1 = { error: e_1_1 }; }
            finally {
                try {
                    if (windows_1_1 && !windows_1_1.done && (_a = windows_1.return)) _a.call(windows_1);
                }
                finally { if (e_1) throw e_1.error; }
            }
            var c = count - windowSize + 1;
            if (c >= 0 && c % startEvery === 0) {
                windows.shift().complete();
            }
            if (++count % startEvery === 0) {
                var window_2 = new Subject_1.Subject();
                windows.push(window_2);
                subscriber.next(window_2.asObservable());
            }
        }, function () {
            while (windows.length > 0) {
                windows.shift().complete();
            }
            subscriber.complete();
        }, function (err) {
            while (windows.length > 0) {
                windows.shift().error(err);
            }
            subscriber.error(err);
        }, function () {
            starts = null;
            windows = null;
        }));
    });
}
exports.windowCount = windowCount;
//# sourceMappingURL=windowCount.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.windowTime = void 0;
var Subject_1 = require("../Subject");
var async_1 = require("../scheduler/async");
var Subscription_1 = require("../Subscription");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var arrRemove_1 = require("../util/arrRemove");
var args_1 = require("../util/args");
var executeSchedule_1 = require("../util/executeSchedule");
function windowTime(windowTimeSpan) {
    var _a, _b;
    var otherArgs = [];
    for (var _i = 1; _i < arguments.length; _i++) {
        otherArgs[_i - 1] = arguments[_i];
    }
    var scheduler = (_a = args_1.popScheduler(otherArgs)) !== null && _a !== void 0 ? _a : async_1.asyncScheduler;
    var windowCreationInterval = (_b = otherArgs[0]) !== null && _b !== void 0 ? _b : null;
    var maxWindowSize = otherArgs[1] || Infinity;
    return lift_1.operate(function (source, subscriber) {
        var windowRecords = [];
        var restartOnClose = false;
        var closeWindow = function (record) {
            var window = record.window, subs = record.subs;
            window.complete();
            subs.unsubscribe();
            arrRemove_1.arrRemove(windowRecords, record);
            restartOnClose && startWindow();
        };
        var startWindow = function () {
            if (windowRecords) {
                var subs = new Subscription_1.Subscription();
                subscriber.add(subs);
                var window_1 = new Subject_1.Subject();
                var record_1 = {
                    window: window_1,
                    subs: subs,
                    seen: 0,
                };
                windowRecords.push(record_1);
                subscriber.next(window_1.asObservable());
                executeSchedule_1.executeSchedule(subs, scheduler, function () { return closeWindow(record_1); }, windowTimeSpan);
            }
        };
        if (windowCreationInterval !== null && windowCreationInterval >= 0) {
            executeSchedule_1.executeSchedule(subscriber, scheduler, startWindow, windowCreationInterval, true);
        }
        else {
            restartOnClose = true;
        }
        startWindow();
        var loop = function (cb) { return windowRecords.slice().forEach(cb); };
        var terminate = function (cb) {
            loop(function (_a) {
                var window = _a.window;
                return cb(window);
            });
            cb(subscriber);
            subscriber.unsubscribe();
        };
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            loop(function (record) {
                record.window.next(value);
                maxWindowSize <= ++record.seen && closeWindow(record);
            });
        }, function () { return terminate(function (consumer) { return consumer.complete(); }); }, function (err) { return terminate(function (consumer) { return consumer.error(err); }); }));
        return function () {
            windowRecords = null;
        };
    });
}
exports.windowTime = windowTime;
//# sourceMappingURL=windowTime.js.map"use strict";
var __values = (this && this.__values) || function(o) {
    var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
    if (m) return m.call(o);
    if (o && typeof o.length === "number") return {
        next: function () {
            if (o && i >= o.length) o = void 0;
            return { value: o && o[i++], done: !o };
        }
    };
    throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.windowToggle = void 0;
var Subject_1 = require("../Subject");
var Subscription_1 = require("../Subscription");
var lift_1 = require("../util/lift");
var innerFrom_1 = require("../observable/innerFrom");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var noop_1 = require("../util/noop");
var arrRemove_1 = require("../util/arrRemove");
function windowToggle(openings, closingSelector) {
    return lift_1.operate(function (source, subscriber) {
        var windows = [];
        var handleError = function (err) {
            while (0 < windows.length) {
                windows.shift().error(err);
            }
            subscriber.error(err);
        };
        innerFrom_1.innerFrom(openings).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (openValue) {
            var window = new Subject_1.Subject();
            windows.push(window);
            var closingSubscription = new Subscription_1.Subscription();
            var closeWindow = function () {
                arrRemove_1.arrRemove(windows, window);
                window.complete();
                closingSubscription.unsubscribe();
            };
            var closingNotifier;
            try {
                closingNotifier = innerFrom_1.innerFrom(closingSelector(openValue));
            }
            catch (err) {
                handleError(err);
                return;
            }
            subscriber.next(window.asObservable());
            closingSubscription.add(closingNotifier.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, closeWindow, noop_1.noop, handleError)));
        }, noop_1.noop));
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            var e_1, _a;
            var windowsCopy = windows.slice();
            try {
                for (var windowsCopy_1 = __values(windowsCopy), windowsCopy_1_1 = windowsCopy_1.next(); !windowsCopy_1_1.done; windowsCopy_1_1 = windowsCopy_1.next()) {
                    var window_1 = windowsCopy_1_1.value;
                    window_1.next(value);
                }
            }
            catch (e_1_1) { e_1 = { error: e_1_1 }; }
            finally {
                try {
                    if (windowsCopy_1_1 && !windowsCopy_1_1.done && (_a = windowsCopy_1.return)) _a.call(windowsCopy_1);
                }
                finally { if (e_1) throw e_1.error; }
            }
        }, function () {
            while (0 < windows.length) {
                windows.shift().complete();
            }
            subscriber.complete();
        }, handleError, function () {
            while (0 < windows.length) {
                windows.shift().unsubscribe();
            }
        }));
    });
}
exports.windowToggle = windowToggle;
//# sourceMappingURL=windowToggle.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.windowWhen = void 0;
var Subject_1 = require("../Subject");
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var innerFrom_1 = require("../observable/innerFrom");
function windowWhen(closingSelector) {
    return lift_1.operate(function (source, subscriber) {
        var window;
        var closingSubscriber;
        var handleError = function (err) {
            window.error(err);
            subscriber.error(err);
        };
        var openWindow = function () {
            closingSubscriber === null || closingSubscriber === void 0 ? void 0 : closingSubscriber.unsubscribe();
            window === null || window === void 0 ? void 0 : window.complete();
            window = new Subject_1.Subject();
            subscriber.next(window.asObservable());
            var closingNotifier;
            try {
                closingNotifier = innerFrom_1.innerFrom(closingSelector());
            }
            catch (err) {
                handleError(err);
                return;
            }
            closingNotifier.subscribe((closingSubscriber = OperatorSubscriber_1.createOperatorSubscriber(subscriber, openWindow, openWindow, handleError)));
        };
        openWindow();
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) { return window.next(value); }, function () {
            window.complete();
            subscriber.complete();
        }, handleError, function () {
            closingSubscriber === null || closingSubscriber === void 0 ? void 0 : closingSubscriber.unsubscribe();
            window = null;
        }));
    });
}
exports.windowWhen = windowWhen;
//# sourceMappingURL=windowWhen.js.map"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.withLatestFrom = void 0;
var lift_1 = require("../util/lift");
var OperatorSubscriber_1 = require("./OperatorSubscriber");
var innerFrom_1 = require("../observable/innerFrom");
var identity_1 = require("../util/identity");
var noop_1 = require("../util/noop");
var args_1 = require("../util/args");
function withLatestFrom() {
    var inputs = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        inputs[_i] = arguments[_i];
    }
    var project = args_1.popResultSelector(inputs);
    return lift_1.operate(function (source, subscriber) {
        var len = inputs.length;
        var otherValues = new Array(len);
        var hasValue = inputs.map(function () { return false; });
        var ready = false;
        var _loop_1 = function (i) {
            innerFrom_1.innerFrom(inputs[i]).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
                otherValues[i] = value;
                if (!ready && !hasValue[i]) {
                    hasValue[i] = true;
                    (ready = hasValue.every(identity_1.identity)) && (hasValue = null);
                }
            }, noop_1.noop));
        };
        for (var i = 0; i < len; i++) {
            _loop_1(i);
        }
        source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
            if (ready) {
                var values = __spreadArray([value], __read(otherValues));
                subscriber.next(project ? project.apply(void 0, __spreadArray([], __read(values))) : values);
            }
        }));
    });
}
exports.withLatestFrom = withLatestFrom;
//# sourceMappingURL=withLatestFrom.js.map"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.zip = void 0;
var zip_1 = require("../observable/zip");
var lift_1 = require("../util/lift");
function zip() {
    var sources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        sources[_i] = arguments[_i];
    }
    return lift_1.operate(function (source, subscriber) {
        zip_1.zip.apply(void 0, __spreadArray([source], __read(sources))).subscribe(subscriber);
    });
}
exports.zip = zip;
//# sourceMappingURL=zip.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.zipAll = void 0;
var zip_1 = require("../observable/zip");
var joinAllInternals_1 = require("./joinAllInternals");
function zipAll(project) {
    return joinAllInternals_1.joinAllInternals(zip_1.zip, project);
}
exports.zipAll = zipAll;
//# sourceMappingURL=zipAll.js.map"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.zipWith = void 0;
var zip_1 = require("./zip");
function zipWith() {
    var otherInputs = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        otherInputs[_i] = arguments[_i];
    }
    return zip_1.zip.apply(void 0, __spreadArray([], __read(otherInputs)));
}
exports.zipWith = zipWith;
//# sourceMappingURL=zipWith.js.map"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.ConnectableObservable = void 0;
var Observable_1 = require("../Observable");
var Subscription_1 = require("../Subscription");
var refCount_1 = require("../operators/refCount");
var OperatorSubscriber_1 = require("../operators/OperatorSubscriber");
var lift_1 = require("../util/lift");
var ConnectableObservable = (function (_super) {
    __extends(ConnectableObservable, _super);
    function ConnectableObservable(source, subjectFactory) {
        var _this = _super.call(this) || this;
        _this.source = source;
        _this.subjectFactory = subjectFactory;
        _this._subject = null;
        _this._refCount = 0;
        _this._connection = null;
        if (lift_1.hasLift(source)) {
            _this.lift = source.lift;
        }
        return _this;
    }
    ConnectableObservable.prototype._subscribe = function (subscriber) {
        return this.getSubject().subscribe(subscriber);
    };
    ConnectableObservable.prototype.getSubject = function () {
        var subject = this._subject;
        if (!subject || subject.isStopped) {
            this._subject = this.subjectFactory();
        }
        return this._subject;
    };
    ConnectableObservable.prototype._teardown = function () {
        this._refCount = 0;
        var _connection = this._connection;
        this._subject = this._connection = null;
        _connection === null || _connection === void 0 ? void 0 : _connection.unsubscribe();
    };
    ConnectableObservable.prototype.connect = function () {
        var _this = this;
        var connection = this._connection;
        if (!connection) {
            connection = this._connection = new Subscription_1.Subscription();
            var subject_1 = this.getSubject();
            connection.add(this.source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subject_1, undefined, function () {
                _this._teardown();
                subject_1.complete();
            }, function (err) {
                _this._teardown();
                subject_1.error(err);
            }, function () { return _this._teardown(); })));
            if (connection.closed) {
                this._connection = null;
                connection = Subscription_1.Subscription.EMPTY;
            }
        }
        return connection;
    };
    ConnectableObservable.prototype.refCount = function () {
        return refCount_1.refCount()(this);
    };
    return ConnectableObservable;
}(Observable_1.Observable));
exports.ConnectableObservable = ConnectableObservable;
//# sourceMappingURL=ConnectableObservable.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.bindCallback = void 0;
var bindCallbackInternals_1 = require("./bindCallbackInternals");
function bindCallback(callbackFunc, resultSelector, scheduler) {
    return bindCallbackInternals_1.bindCallbackInternals(false, callbackFunc, resultSelector, scheduler);
}
exports.bindCallback = bindCallback;
//# sourceMappingURL=bindCallback.js.map"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.bindCallbackInternals = void 0;
var isScheduler_1 = require("../util/isScheduler");
var Observable_1 = require("../Observable");
var subscribeOn_1 = require("../operators/subscribeOn");
var mapOneOrManyArgs_1 = require("../util/mapOneOrManyArgs");
var observeOn_1 = require("../operators/observeOn");
var AsyncSubject_1 = require("../AsyncSubject");
function bindCallbackInternals(isNodeStyle, callbackFunc, resultSelector, scheduler) {
    if (resultSelector) {
        if (isScheduler_1.isScheduler(resultSelector)) {
            scheduler = resultSelector;
        }
        else {
            return function () {
                var args = [];
                for (var _i = 0; _i < arguments.length; _i++) {
                    args[_i] = arguments[_i];
                }
                return bindCallbackInternals(isNodeStyle, callbackFunc, scheduler)
                    .apply(this, args)
                    .pipe(mapOneOrManyArgs_1.mapOneOrManyArgs(resultSelector));
            };
        }
    }
    if (scheduler) {
        return function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            return bindCallbackInternals(isNodeStyle, callbackFunc)
                .apply(this, args)
                .pipe(subscribeOn_1.subscribeOn(scheduler), observeOn_1.observeOn(scheduler));
        };
    }
    return function () {
        var _this = this;
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        var subject = new AsyncSubject_1.AsyncSubject();
        var uninitialized = true;
        return new Observable_1.Observable(function (subscriber) {
            var subs = subject.subscribe(subscriber);
            if (uninitialized) {
                uninitialized = false;
                var isAsync_1 = false;
                var isComplete_1 = false;
                callbackFunc.apply(_this, __spreadArray(__spreadArray([], __read(args)), [
                    function () {
                        var results = [];
                        for (var _i = 0; _i < arguments.length; _i++) {
                            results[_i] = arguments[_i];
                        }
                        if (isNodeStyle) {
                            var err = results.shift();
                            if (err != null) {
                                subject.error(err);
                                return;
                            }
                        }
                        subject.next(1 < results.length ? results : results[0]);
                        isComplete_1 = true;
                        if (isAsync_1) {
                            subject.complete();
                        }
                    },
                ]));
                if (isComplete_1) {
                    subject.complete();
                }
                isAsync_1 = true;
            }
            return subs;
        });
    };
}
exports.bindCallbackInternals = bindCallbackInternals;
//# sourceMappingURL=bindCallbackInternals.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.bindNodeCallback = void 0;
var bindCallbackInternals_1 = require("./bindCallbackInternals");
function bindNodeCallback(callbackFunc, resultSelector, scheduler) {
    return bindCallbackInternals_1.bindCallbackInternals(true, callbackFunc, resultSelector, scheduler);
}
exports.bindNodeCallback = bindNodeCallback;
//# sourceMappingURL=bindNodeCallback.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.combineLatestInit = exports.combineLatest = void 0;
var Observable_1 = require("../Observable");
var argsArgArrayOrObject_1 = require("../util/argsArgArrayOrObject");
var from_1 = require("./from");
var identity_1 = require("../util/identity");
var mapOneOrManyArgs_1 = require("../util/mapOneOrManyArgs");
var args_1 = require("../util/args");
var createObject_1 = require("../util/createObject");
var OperatorSubscriber_1 = require("../operators/OperatorSubscriber");
var executeSchedule_1 = require("../util/executeSchedule");
function combineLatest() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var scheduler = args_1.popScheduler(args);
    var resultSelector = args_1.popResultSelector(args);
    var _a = argsArgArrayOrObject_1.argsArgArrayOrObject(args), observables = _a.args, keys = _a.keys;
    if (observables.length === 0) {
        return from_1.from([], scheduler);
    }
    var result = new Observable_1.Observable(combineLatestInit(observables, scheduler, keys
        ?
            function (values) { return createObject_1.createObject(keys, values); }
        :
            identity_1.identity));
    return resultSelector ? result.pipe(mapOneOrManyArgs_1.mapOneOrManyArgs(resultSelector)) : result;
}
exports.combineLatest = combineLatest;
function combineLatestInit(observables, scheduler, valueTransform) {
    if (valueTransform === void 0) { valueTransform = identity_1.identity; }
    return function (subscriber) {
        maybeSchedule(scheduler, function () {
            var length = observables.length;
            var values = new Array(length);
            var active = length;
            var remainingFirstValues = length;
            var _loop_1 = function (i) {
                maybeSchedule(scheduler, function () {
                    var source = from_1.from(observables[i], scheduler);
                    var hasFirstValue = false;
                    source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
                        values[i] = value;
                        if (!hasFirstValue) {
                            hasFirstValue = true;
                            remainingFirstValues--;
                        }
                        if (!remainingFirstValues) {
                            subscriber.next(valueTransform(values.slice()));
                        }
                    }, function () {
                        if (!--active) {
                            subscriber.complete();
                        }
                    }));
                }, subscriber);
            };
            for (var i = 0; i < length; i++) {
                _loop_1(i);
            }
        }, subscriber);
    };
}
exports.combineLatestInit = combineLatestInit;
function maybeSchedule(scheduler, execute, subscription) {
    if (scheduler) {
        executeSchedule_1.executeSchedule(subscription, scheduler, execute);
    }
    else {
        execute();
    }
}
//# sourceMappingURL=combineLatest.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.concat = void 0;
var concatAll_1 = require("../operators/concatAll");
var args_1 = require("../util/args");
var from_1 = require("./from");
function concat() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    return concatAll_1.concatAll()(from_1.from(args, args_1.popScheduler(args)));
}
exports.concat = concat;
//# sourceMappingURL=concat.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.connectable = void 0;
var Subject_1 = require("../Subject");
var Observable_1 = require("../Observable");
var defer_1 = require("./defer");
var DEFAULT_CONFIG = {
    connector: function () { return new Subject_1.Subject(); },
    resetOnDisconnect: true,
};
function connectable(source, config) {
    if (config === void 0) { config = DEFAULT_CONFIG; }
    var connection = null;
    var connector = config.connector, _a = config.resetOnDisconnect, resetOnDisconnect = _a === void 0 ? true : _a;
    var subject = connector();
    var result = new Observable_1.Observable(function (subscriber) {
        return subject.subscribe(subscriber);
    });
    result.connect = function () {
        if (!connection || connection.closed) {
            connection = defer_1.defer(function () { return source; }).subscribe(subject);
            if (resetOnDisconnect) {
                connection.add(function () { return (subject = connector()); });
            }
        }
        return connection;
    };
    return result;
}
exports.connectable = connectable;
//# sourceMappingURL=connectable.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.defer = void 0;
var Observable_1 = require("../Observable");
var innerFrom_1 = require("./innerFrom");
function defer(observableFactory) {
    return new Observable_1.Observable(function (subscriber) {
        innerFrom_1.innerFrom(observableFactory()).subscribe(subscriber);
    });
}
exports.defer = defer;
//# sourceMappingURL=defer.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.empty = exports.EMPTY = void 0;
var Observable_1 = require("../Observable");
exports.EMPTY = new Observable_1.Observable(function (subscriber) { return subscriber.complete(); });
function empty(scheduler) {
    return scheduler ? emptyScheduled(scheduler) : exports.EMPTY;
}
exports.empty = empty;
function emptyScheduled(scheduler) {
    return new Observable_1.Observable(function (subscriber) { return scheduler.schedule(function () { return subscriber.complete(); }); });
}
//# sourceMappingURL=empty.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.forkJoin = void 0;
var Observable_1 = require("../Observable");
var argsArgArrayOrObject_1 = require("../util/argsArgArrayOrObject");
var innerFrom_1 = require("./innerFrom");
var args_1 = require("../util/args");
var OperatorSubscriber_1 = require("../operators/OperatorSubscriber");
var mapOneOrManyArgs_1 = require("../util/mapOneOrManyArgs");
var createObject_1 = require("../util/createObject");
function forkJoin() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var resultSelector = args_1.popResultSelector(args);
    var _a = argsArgArrayOrObject_1.argsArgArrayOrObject(args), sources = _a.args, keys = _a.keys;
    var result = new Observable_1.Observable(function (subscriber) {
        var length = sources.length;
        if (!length) {
            subscriber.complete();
            return;
        }
        var values = new Array(length);
        var remainingCompletions = length;
        var remainingEmissions = length;
        var _loop_1 = function (sourceIndex) {
            var hasValue = false;
            innerFrom_1.innerFrom(sources[sourceIndex]).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
                if (!hasValue) {
                    hasValue = true;
                    remainingEmissions--;
                }
                values[sourceIndex] = value;
            }, function () { return remainingCompletions--; }, undefined, function () {
                if (!remainingCompletions || !hasValue) {
                    if (!remainingEmissions) {
                        subscriber.next(keys ? createObject_1.createObject(keys, values) : values);
                    }
                    subscriber.complete();
                }
            }));
        };
        for (var sourceIndex = 0; sourceIndex < length; sourceIndex++) {
            _loop_1(sourceIndex);
        }
    });
    return resultSelector ? result.pipe(mapOneOrManyArgs_1.mapOneOrManyArgs(resultSelector)) : result;
}
exports.forkJoin = forkJoin;
//# sourceMappingURL=forkJoin.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.from = void 0;
var scheduled_1 = require("../scheduled/scheduled");
var innerFrom_1 = require("./innerFrom");
function from(input, scheduler) {
    return scheduler ? scheduled_1.scheduled(input, scheduler) : innerFrom_1.innerFrom(input);
}
exports.from = from;
//# sourceMappingURL=from.js.map"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.fromEvent = void 0;
var innerFrom_1 = require("../observable/innerFrom");
var Observable_1 = require("../Observable");
var mergeMap_1 = require("../operators/mergeMap");
var isArrayLike_1 = require("../util/isArrayLike");
var isFunction_1 = require("../util/isFunction");
var mapOneOrManyArgs_1 = require("../util/mapOneOrManyArgs");
var nodeEventEmitterMethods = ['addListener', 'removeListener'];
var eventTargetMethods = ['addEventListener', 'removeEventListener'];
var jqueryMethods = ['on', 'off'];
function fromEvent(target, eventName, options, resultSelector) {
    if (isFunction_1.isFunction(options)) {
        resultSelector = options;
        options = undefined;
    }
    if (resultSelector) {
        return fromEvent(target, eventName, options).pipe(mapOneOrManyArgs_1.mapOneOrManyArgs(resultSelector));
    }
    var _a = __read(isEventTarget(target)
        ? eventTargetMethods.map(function (methodName) { return function (handler) { return target[methodName](eventName, handler, options); }; })
        :
            isNodeStyleEventEmitter(target)
                ? nodeEventEmitterMethods.map(toCommonHandlerRegistry(target, eventName))
                : isJQueryStyleEventEmitter(target)
                    ? jqueryMethods.map(toCommonHandlerRegistry(target, eventName))
                    : [], 2), add = _a[0], remove = _a[1];
    if (!add) {
        if (isArrayLike_1.isArrayLike(target)) {
            return mergeMap_1.mergeMap(function (subTarget) { return fromEvent(subTarget, eventName, options); })(innerFrom_1.innerFrom(target));
        }
    }
    if (!add) {
        throw new TypeError('Invalid event target');
    }
    return new Observable_1.Observable(function (subscriber) {
        var handler = function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            return subscriber.next(1 < args.length ? args : args[0]);
        };
        add(handler);
        return function () { return remove(handler); };
    });
}
exports.fromEvent = fromEvent;
function toCommonHandlerRegistry(target, eventName) {
    return function (methodName) { return function (handler) { return target[methodName](eventName, handler); }; };
}
function isNodeStyleEventEmitter(target) {
    return isFunction_1.isFunction(target.addListener) && isFunction_1.isFunction(target.removeListener);
}
function isJQueryStyleEventEmitter(target) {
    return isFunction_1.isFunction(target.on) && isFunction_1.isFunction(target.off);
}
function isEventTarget(target) {
    return isFunction_1.isFunction(target.addEventListener) && isFunction_1.isFunction(target.removeEventListener);
}
//# sourceMappingURL=fromEvent.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.fromEventPattern = void 0;
var Observable_1 = require("../Observable");
var isFunction_1 = require("../util/isFunction");
var mapOneOrManyArgs_1 = require("../util/mapOneOrManyArgs");
function fromEventPattern(addHandler, removeHandler, resultSelector) {
    if (resultSelector) {
        return fromEventPattern(addHandler, removeHandler).pipe(mapOneOrManyArgs_1.mapOneOrManyArgs(resultSelector));
    }
    return new Observable_1.Observable(function (subscriber) {
        var handler = function () {
            var e = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                e[_i] = arguments[_i];
            }
            return subscriber.next(e.length === 1 ? e[0] : e);
        };
        var retValue = addHandler(handler);
        return isFunction_1.isFunction(removeHandler) ? function () { return removeHandler(handler, retValue); } : undefined;
    });
}
exports.fromEventPattern = fromEventPattern;
//# sourceMappingURL=fromEventPattern.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.fromSubscribable = void 0;
var Observable_1 = require("../Observable");
function fromSubscribable(subscribable) {
    return new Observable_1.Observable(function (subscriber) { return subscribable.subscribe(subscriber); });
}
exports.fromSubscribable = fromSubscribable;
//# sourceMappingURL=fromSubscribable.js.map"use strict";
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.generate = void 0;
var identity_1 = require("../util/identity");
var isScheduler_1 = require("../util/isScheduler");
var defer_1 = require("./defer");
var scheduleIterable_1 = require("../scheduled/scheduleIterable");
function generate(initialStateOrOptions, condition, iterate, resultSelectorOrScheduler, scheduler) {
    var _a, _b;
    var resultSelector;
    var initialState;
    if (arguments.length === 1) {
        (_a = initialStateOrOptions, initialState = _a.initialState, condition = _a.condition, iterate = _a.iterate, _b = _a.resultSelector, resultSelector = _b === void 0 ? identity_1.identity : _b, scheduler = _a.scheduler);
    }
    else {
        initialState = initialStateOrOptions;
        if (!resultSelectorOrScheduler || isScheduler_1.isScheduler(resultSelectorOrScheduler)) {
            resultSelector = identity_1.identity;
            scheduler = resultSelectorOrScheduler;
        }
        else {
            resultSelector = resultSelectorOrScheduler;
        }
    }
    function gen() {
        var state;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    state = initialState;
                    _a.label = 1;
                case 1:
                    if (!(!condition || condition(state))) return [3, 4];
                    return [4, resultSelector(state)];
                case 2:
                    _a.sent();
                    _a.label = 3;
                case 3:
                    state = iterate(state);
                    return [3, 1];
                case 4: return [2];
            }
        });
    }
    return defer_1.defer((scheduler
        ?
            function () { return scheduleIterable_1.scheduleIterable(gen(), scheduler); }
        :
            gen));
}
exports.generate = generate;
//# sourceMappingURL=generate.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.iif = void 0;
var defer_1 = require("./defer");
function iif(condition, trueResult, falseResult) {
    return defer_1.defer(function () { return (condition() ? trueResult : falseResult); });
}
exports.iif = iif;
//# sourceMappingURL=iif.js.map"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
var __asyncValues = (this && this.__asyncValues) || function (o) {
    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
    var m = o[Symbol.asyncIterator], i;
    return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
};
var __values = (this && this.__values) || function(o) {
    var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
    if (m) return m.call(o);
    if (o && typeof o.length === "number") return {
        next: function () {
            if (o && i >= o.length) o = void 0;
            return { value: o && o[i++], done: !o };
        }
    };
    throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.fromReadableStreamLike = exports.fromAsyncIterable = exports.fromIterable = exports.fromPromise = exports.fromArrayLike = exports.fromInteropObservable = exports.innerFrom = void 0;
var isArrayLike_1 = require("../util/isArrayLike");
var isPromise_1 = require("../util/isPromise");
var Observable_1 = require("../Observable");
var isInteropObservable_1 = require("../util/isInteropObservable");
var isAsyncIterable_1 = require("../util/isAsyncIterable");
var throwUnobservableError_1 = require("../util/throwUnobservableError");
var isIterable_1 = require("../util/isIterable");
var isReadableStreamLike_1 = require("../util/isReadableStreamLike");
var isFunction_1 = require("../util/isFunction");
var reportUnhandledError_1 = require("../util/reportUnhandledError");
var observable_1 = require("../symbol/observable");
function innerFrom(input) {
    if (input instanceof Observable_1.Observable) {
        return input;
    }
    if (input != null) {
        if (isInteropObservable_1.isInteropObservable(input)) {
            return fromInteropObservable(input);
        }
        if (isArrayLike_1.isArrayLike(input)) {
            return fromArrayLike(input);
        }
        if (isPromise_1.isPromise(input)) {
            return fromPromise(input);
        }
        if (isAsyncIterable_1.isAsyncIterable(input)) {
            return fromAsyncIterable(input);
        }
        if (isIterable_1.isIterable(input)) {
            return fromIterable(input);
        }
        if (isReadableStreamLike_1.isReadableStreamLike(input)) {
            return fromReadableStreamLike(input);
        }
    }
    throw throwUnobservableError_1.createInvalidObservableTypeError(input);
}
exports.innerFrom = innerFrom;
function fromInteropObservable(obj) {
    return new Observable_1.Observable(function (subscriber) {
        var obs = obj[observable_1.observable]();
        if (isFunction_1.isFunction(obs.subscribe)) {
            return obs.subscribe(subscriber);
        }
        throw new TypeError('Provided object does not correctly implement Symbol.observable');
    });
}
exports.fromInteropObservable = fromInteropObservable;
function fromArrayLike(array) {
    return new Observable_1.Observable(function (subscriber) {
        for (var i = 0; i < array.length && !subscriber.closed; i++) {
            subscriber.next(array[i]);
        }
        subscriber.complete();
    });
}
exports.fromArrayLike = fromArrayLike;
function fromPromise(promise) {
    return new Observable_1.Observable(function (subscriber) {
        promise
            .then(function (value) {
            if (!subscriber.closed) {
                subscriber.next(value);
                subscriber.complete();
            }
        }, function (err) { return subscriber.error(err); })
            .then(null, reportUnhandledError_1.reportUnhandledError);
    });
}
exports.fromPromise = fromPromise;
function fromIterable(iterable) {
    return new Observable_1.Observable(function (subscriber) {
        var e_1, _a;
        try {
            for (var iterable_1 = __values(iterable), iterable_1_1 = iterable_1.next(); !iterable_1_1.done; iterable_1_1 = iterable_1.next()) {
                var value = iterable_1_1.value;
                subscriber.next(value);
                if (subscriber.closed) {
                    return;
                }
            }
        }
        catch (e_1_1) { e_1 = { error: e_1_1 }; }
        finally {
            try {
                if (iterable_1_1 && !iterable_1_1.done && (_a = iterable_1.return)) _a.call(iterable_1);
            }
            finally { if (e_1) throw e_1.error; }
        }
        subscriber.complete();
    });
}
exports.fromIterable = fromIterable;
function fromAsyncIterable(asyncIterable) {
    return new Observable_1.Observable(function (subscriber) {
        process(asyncIterable, subscriber).catch(function (err) { return subscriber.error(err); });
    });
}
exports.fromAsyncIterable = fromAsyncIterable;
function fromReadableStreamLike(readableStream) {
    return fromAsyncIterable(isReadableStreamLike_1.readableStreamLikeToAsyncGenerator(readableStream));
}
exports.fromReadableStreamLike = fromReadableStreamLike;
function process(asyncIterable, subscriber) {
    var asyncIterable_1, asyncIterable_1_1;
    var e_2, _a;
    return __awaiter(this, void 0, void 0, function () {
        var value, e_2_1;
        return __generator(this, function (_b) {
            switch (_b.label) {
                case 0:
                    _b.trys.push([0, 5, 6, 11]);
                    asyncIterable_1 = __asyncValues(asyncIterable);
                    _b.label = 1;
                case 1: return [4, asyncIterable_1.next()];
                case 2:
                    if (!(asyncIterable_1_1 = _b.sent(), !asyncIterable_1_1.done)) return [3, 4];
                    value = asyncIterable_1_1.value;
                    subscriber.next(value);
                    if (subscriber.closed) {
                        return [2];
                    }
                    _b.label = 3;
                case 3: return [3, 1];
                case 4: return [3, 11];
                case 5:
                    e_2_1 = _b.sent();
                    e_2 = { error: e_2_1 };
                    return [3, 11];
                case 6:
                    _b.trys.push([6, , 9, 10]);
                    if (!(asyncIterable_1_1 && !asyncIterable_1_1.done && (_a = asyncIterable_1.return))) return [3, 8];
                    return [4, _a.call(asyncIterable_1)];
                case 7:
                    _b.sent();
                    _b.label = 8;
                case 8: return [3, 10];
                case 9:
                    if (e_2) throw e_2.error;
                    return [7];
                case 10: return [7];
                case 11:
                    subscriber.complete();
                    return [2];
            }
        });
    });
}
//# sourceMappingURL=innerFrom.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.interval = void 0;
var async_1 = require("../scheduler/async");
var timer_1 = require("./timer");
function interval(period, scheduler) {
    if (period === void 0) { period = 0; }
    if (scheduler === void 0) { scheduler = async_1.asyncScheduler; }
    if (period < 0) {
        period = 0;
    }
    return timer_1.timer(period, period, scheduler);
}
exports.interval = interval;
//# sourceMappingURL=interval.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.merge = void 0;
var mergeAll_1 = require("../operators/mergeAll");
var innerFrom_1 = require("./innerFrom");
var empty_1 = require("./empty");
var args_1 = require("../util/args");
var from_1 = require("./from");
function merge() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var scheduler = args_1.popScheduler(args);
    var concurrent = args_1.popNumber(args, Infinity);
    var sources = args;
    return !sources.length
        ?
            empty_1.EMPTY
        : sources.length === 1
            ?
                innerFrom_1.innerFrom(sources[0])
            :
                mergeAll_1.mergeAll(concurrent)(from_1.from(sources, scheduler));
}
exports.merge = merge;
//# sourceMappingURL=merge.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.never = exports.NEVER = void 0;
var Observable_1 = require("../Observable");
var noop_1 = require("../util/noop");
exports.NEVER = new Observable_1.Observable(noop_1.noop);
function never() {
    return exports.NEVER;
}
exports.never = never;
//# sourceMappingURL=never.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.of = void 0;
var args_1 = require("../util/args");
var from_1 = require("./from");
function of() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var scheduler = args_1.popScheduler(args);
    return from_1.from(args, scheduler);
}
exports.of = of;
//# sourceMappingURL=of.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.onErrorResumeNext = void 0;
var empty_1 = require("./empty");
var onErrorResumeNext_1 = require("../operators/onErrorResumeNext");
var argsOrArgArray_1 = require("../util/argsOrArgArray");
function onErrorResumeNext() {
    var sources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        sources[_i] = arguments[_i];
    }
    return onErrorResumeNext_1.onErrorResumeNext(argsOrArgArray_1.argsOrArgArray(sources))(empty_1.EMPTY);
}
exports.onErrorResumeNext = onErrorResumeNext;
//# sourceMappingURL=onErrorResumeNext.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.pairs = void 0;
var from_1 = require("./from");
function pairs(obj, scheduler) {
    return from_1.from(Object.entries(obj), scheduler);
}
exports.pairs = pairs;
//# sourceMappingURL=pairs.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.partition = void 0;
var not_1 = require("../util/not");
var filter_1 = require("../operators/filter");
var innerFrom_1 = require("./innerFrom");
function partition(source, predicate, thisArg) {
    return [filter_1.filter(predicate, thisArg)(innerFrom_1.innerFrom(source)), filter_1.filter(not_1.not(predicate, thisArg))(innerFrom_1.innerFrom(source))];
}
exports.partition = partition;
//# sourceMappingURL=partition.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.raceInit = exports.race = void 0;
var Observable_1 = require("../Observable");
var innerFrom_1 = require("./innerFrom");
var argsOrArgArray_1 = require("../util/argsOrArgArray");
var OperatorSubscriber_1 = require("../operators/OperatorSubscriber");
function race() {
    var sources = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        sources[_i] = arguments[_i];
    }
    sources = argsOrArgArray_1.argsOrArgArray(sources);
    return sources.length === 1 ? innerFrom_1.innerFrom(sources[0]) : new Observable_1.Observable(raceInit(sources));
}
exports.race = race;
function raceInit(sources) {
    return function (subscriber) {
        var subscriptions = [];
        var _loop_1 = function (i) {
            subscriptions.push(innerFrom_1.innerFrom(sources[i]).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
                if (subscriptions) {
                    for (var s = 0; s < subscriptions.length; s++) {
                        s !== i && subscriptions[s].unsubscribe();
                    }
                    subscriptions = null;
                }
                subscriber.next(value);
            })));
        };
        for (var i = 0; subscriptions && !subscriber.closed && i < sources.length; i++) {
            _loop_1(i);
        }
    };
}
exports.raceInit = raceInit;
//# sourceMappingURL=race.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.range = void 0;
var Observable_1 = require("../Observable");
var empty_1 = require("./empty");
function range(start, count, scheduler) {
    if (count == null) {
        count = start;
        start = 0;
    }
    if (count <= 0) {
        return empty_1.EMPTY;
    }
    var end = count + start;
    return new Observable_1.Observable(scheduler
        ?
            function (subscriber) {
                var n = start;
                return scheduler.schedule(function () {
                    if (n < end) {
                        subscriber.next(n++);
                        this.schedule();
                    }
                    else {
                        subscriber.complete();
                    }
                });
            }
        :
            function (subscriber) {
                var n = start;
                while (n < end && !subscriber.closed) {
                    subscriber.next(n++);
                }
                subscriber.complete();
            });
}
exports.range = range;
//# sourceMappingURL=range.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.throwError = void 0;
var Observable_1 = require("../Observable");
var isFunction_1 = require("../util/isFunction");
function throwError(errorOrErrorFactory, scheduler) {
    var errorFactory = isFunction_1.isFunction(errorOrErrorFactory) ? errorOrErrorFactory : function () { return errorOrErrorFactory; };
    var init = function (subscriber) { return subscriber.error(errorFactory()); };
    return new Observable_1.Observable(scheduler ? function (subscriber) { return scheduler.schedule(init, 0, subscriber); } : init);
}
exports.throwError = throwError;
//# sourceMappingURL=throwError.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.timer = void 0;
var Observable_1 = require("../Observable");
var async_1 = require("../scheduler/async");
var isScheduler_1 = require("../util/isScheduler");
var isDate_1 = require("../util/isDate");
function timer(dueTime, intervalOrScheduler, scheduler) {
    if (dueTime === void 0) { dueTime = 0; }
    if (scheduler === void 0) { scheduler = async_1.async; }
    var intervalDuration = -1;
    if (intervalOrScheduler != null) {
        if (isScheduler_1.isScheduler(intervalOrScheduler)) {
            scheduler = intervalOrScheduler;
        }
        else {
            intervalDuration = intervalOrScheduler;
        }
    }
    return new Observable_1.Observable(function (subscriber) {
        var due = isDate_1.isValidDate(dueTime) ? +dueTime - scheduler.now() : dueTime;
        if (due < 0) {
            due = 0;
        }
        var n = 0;
        return scheduler.schedule(function () {
            if (!subscriber.closed) {
                subscriber.next(n++);
                if (0 <= intervalDuration) {
                    this.schedule(undefined, intervalDuration);
                }
                else {
                    subscriber.complete();
                }
            }
        }, due);
    });
}
exports.timer = timer;
//# sourceMappingURL=timer.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.using = void 0;
var Observable_1 = require("../Observable");
var innerFrom_1 = require("./innerFrom");
var empty_1 = require("./empty");
function using(resourceFactory, observableFactory) {
    return new Observable_1.Observable(function (subscriber) {
        var resource = resourceFactory();
        var result = observableFactory(resource);
        var source = result ? innerFrom_1.innerFrom(result) : empty_1.EMPTY;
        source.subscribe(subscriber);
        return function () {
            if (resource) {
                resource.unsubscribe();
            }
        };
    });
}
exports.using = using;
//# sourceMappingURL=using.js.map"use strict";
var __read = (this && this.__read) || function (o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.zip = void 0;
var Observable_1 = require("../Observable");
var innerFrom_1 = require("./innerFrom");
var argsOrArgArray_1 = require("../util/argsOrArgArray");
var empty_1 = require("./empty");
var OperatorSubscriber_1 = require("../operators/OperatorSubscriber");
var args_1 = require("../util/args");
function zip() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    var resultSelector = args_1.popResultSelector(args);
    var sources = argsOrArgArray_1.argsOrArgArray(args);
    return sources.length
        ? new Observable_1.Observable(function (subscriber) {
            var buffers = sources.map(function () { return []; });
            var completed = sources.map(function () { return false; });
            subscriber.add(function () {
                buffers = completed = null;
            });
            var _loop_1 = function (sourceIndex) {
                innerFrom_1.innerFrom(sources[sourceIndex]).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) {
                    buffers[sourceIndex].push(value);
                    if (buffers.every(function (buffer) { return buffer.length; })) {
                        var result = buffers.map(function (buffer) { return buffer.shift(); });
                        subscriber.next(resultSelector ? resultSelector.apply(void 0, __spreadArray([], __read(result))) : result);
                        if (buffers.some(function (buffer, i) { return !buffer.length && completed[i]; })) {
                            subscriber.complete();
                        }
                    }
                }, function () {
                    completed[sourceIndex] = true;
                    !buffers[sourceIndex].length && subscriber.complete();
                }));
            };
            for (var sourceIndex = 0; !subscriber.closed && sourceIndex < sources.length; sourceIndex++) {
                _loop_1(sourceIndex);
            }
            return function () {
                buffers = completed = null;
            };
        })
        : empty_1.EMPTY;
}
exports.zip = zip;
//# sourceMappingURL=zip.js.map"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
var __assign = (this && this.__assign) || function () {
    __assign = Object.assign || function(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
            s = arguments[i];
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
                t[p] = s[p];
        }
        return t;
    };
    return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.WebSocketSubject = void 0;
var Subject_1 = require("../../Subject");
var Subscriber_1 = require("../../Subscriber");
var Observable_1 = require("../../Observable");
var Subscription_1 = require("../../Subscription");
var ReplaySubject_1 = require("../../ReplaySubject");
var DEFAULT_WEBSOCKET_CONFIG = {
    url: '',
    deserializer: function (e) { return JSON.parse(e.data); },
    serializer: function (value) { return JSON.stringify(value); },
};
var WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT = 'WebSocketSubject.error must be called with an object with an error code, and an optional reason: { code: number, reason: string }';
var WebSocketSubject = (function (_super) {
    __extends(WebSocketSubject, _super);
    function WebSocketSubject(urlConfigOrSource, destination) {
        var _this = _super.call(this) || this;
        _this._socket = null;
        if (urlConfigOrSource instanceof Observable_1.Observable) {
            _this.destination = destination;
            _this.source = urlConfigOrSource;
        }
        else {
            var config = (_this._config = __assign({}, DEFAULT_WEBSOCKET_CONFIG));
            _this._output = new Subject_1.Subject();
            if (typeof urlConfigOrSource === 'string') {
                config.url = urlConfigOrSource;
            }
            else {
                for (var key in urlConfigOrSource) {
                    if (urlConfigOrSource.hasOwnProperty(key)) {
                        config[key] = urlConfigOrSource[key];
                    }
                }
            }
            if (!config.WebSocketCtor && WebSocket) {
                config.WebSocketCtor = WebSocket;
            }
            else if (!config.WebSocketCtor) {
                throw new Error('no WebSocket constructor can be found');
            }
            _this.destination = new ReplaySubject_1.ReplaySubject();
        }
        return _this;
    }
    WebSocketSubject.prototype.lift = function (operator) {
        var sock = new WebSocketSubject(this._config, this.destination);
        sock.operator = operator;
        sock.source = this;
        return sock;
    };
    WebSocketSubject.prototype._resetState = function () {
        this._socket = null;
        if (!this.source) {
            this.destination = new ReplaySubject_1.ReplaySubject();
        }
        this._output = new Subject_1.Subject();
    };
    WebSocketSubject.prototype.multiplex = function (subMsg, unsubMsg, messageFilter) {
        var self = this;
        return new Observable_1.Observable(function (observer) {
            try {
                self.next(subMsg());
            }
            catch (err) {
                observer.error(err);
            }
            var subscription = self.subscribe({
                next: function (x) {
                    try {
                        if (messageFilter(x)) {
                            observer.next(x);
                        }
                    }
                    catch (err) {
                        observer.error(err);
                    }
                },
                error: function (err) { return observer.error(err); },
                complete: function () { return observer.complete(); },
            });
            return function () {
                try {
                    self.next(unsubMsg());
                }
                catch (err) {
                    observer.error(err);
                }
                subscription.unsubscribe();
            };
        });
    };
    WebSocketSubject.prototype._connectSocket = function () {
        var _this = this;
        var _a = this._config, WebSocketCtor = _a.WebSocketCtor, protocol = _a.protocol, url = _a.url, binaryType = _a.binaryType;
        var observer = this._output;
        var socket = null;
        try {
            socket = protocol ? new WebSocketCtor(url, protocol) : new WebSocketCtor(url);
            this._socket = socket;
            if (binaryType) {
                this._socket.binaryType = binaryType;
            }
        }
        catch (e) {
            observer.error(e);
            return;
        }
        var subscription = new Subscription_1.Subscription(function () {
            _this._socket = null;
            if (socket && socket.readyState === 1) {
                socket.close();
            }
        });
        socket.onopen = function (evt) {
            var _socket = _this._socket;
            if (!_socket) {
                socket.close();
                _this._resetState();
                return;
            }
            var openObserver = _this._config.openObserver;
            if (openObserver) {
                openObserver.next(evt);
            }
            var queue = _this.destination;
            _this.destination = Subscriber_1.Subscriber.create(function (x) {
                if (socket.readyState === 1) {
                    try {
                        var serializer = _this._config.serializer;
                        socket.send(serializer(x));
                    }
                    catch (e) {
                        _this.destination.error(e);
                    }
                }
            }, function (err) {
                var closingObserver = _this._config.closingObserver;
                if (closingObserver) {
                    closingObserver.next(undefined);
                }
                if (err && err.code) {
                    socket.close(err.code, err.reason);
                }
                else {
                    observer.error(new TypeError(WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT));
                }
                _this._resetState();
            }, function () {
                var closingObserver = _this._config.closingObserver;
                if (closingObserver) {
                    closingObserver.next(undefined);
                }
                socket.close();
                _this._resetState();
            });
            if (queue && queue instanceof ReplaySubject_1.ReplaySubject) {
                subscription.add(queue.subscribe(_this.destination));
            }
        };
        socket.onerror = function (e) {
            _this._resetState();
            observer.error(e);
        };
        socket.onclose = function (e) {
            if (socket === _this._socket) {
                _this._resetState();
            }
            var closeObserver = _this._config.closeObserver;
            if (closeObserver) {
                closeObserver.next(e);
            }
            if (e.wasClean) {
                observer.complete();
            }
            else {
                observer.error(e);
            }
        };
        socket.onmessage = function (e) {
            try {
                var deserializer = _this._config.deserializer;
                observer.next(deserializer(e));
            }
            catch (err) {
                observer.error(err);
            }
        };
    };
    WebSocketSubject.prototype._subscribe = function (subscriber) {
        var _this = this;
        var source = this.source;
        if (source) {
            return source.subscribe(subscriber);
        }
        if (!this._socket) {
            this._connectSocket();
        }
        this._output.subscribe(subscriber);
        subscriber.add(function () {
            var _socket = _this._socket;
            if (_this._output.observers.length === 0) {
                if (_socket && (_socket.readyState === 1 || _socket.readyState === 0)) {
                    _socket.close();
                }
                _this._resetState();
            }
        });
        return subscriber;
    };
    WebSocketSubject.prototype.unsubscribe = function () {
        var _socket = this._socket;
        if (_socket && (_socket.readyState === 1 || _socket.readyState === 0)) {
            _socket.close();
        }
        this._resetState();
        _super.prototype.unsubscribe.call(this);
    };
    return WebSocketSubject;
}(Subject_1.AnonymousSubject));
exports.WebSocketSubject = WebSocketSubject;
//# sourceMappingURL=WebSocketSubject.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.animationFrames = void 0;
var Observable_1 = require("../../Observable");
var Subscription_1 = require("../../Subscription");
var performanceTimestampProvider_1 = require("../../scheduler/performanceTimestampProvider");
var animationFrameProvider_1 = require("../../scheduler/animationFrameProvider");
function animationFrames(timestampProvider) {
    return timestampProvider ? animationFramesFactory(timestampProvider) : DEFAULT_ANIMATION_FRAMES;
}
exports.animationFrames = animationFrames;
function animationFramesFactory(timestampProvider) {
    var schedule = animationFrameProvider_1.animationFrameProvider.schedule;
    return new Observable_1.Observable(function (subscriber) {
        var subscription = new Subscription_1.Subscription();
        var provider = timestampProvider || performanceTimestampProvider_1.performanceTimestampProvider;
        var start = provider.now();
        var run = function (timestamp) {
            var now = provider.now();
            subscriber.next({
                timestamp: timestampProvider ? now : timestamp,
                elapsed: now - start,
            });
            if (!subscriber.closed) {
                subscription.add(schedule(run));
            }
        };
        subscription.add(schedule(run));
        return subscription;
    });
}
var DEFAULT_ANIMATION_FRAMES = animationFramesFactory();
//# sourceMappingURL=animationFrames.js.map"use strict";
var __assign = (this && this.__assign) || function () {
    __assign = Object.assign || function(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
            s = arguments[i];
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
                t[p] = s[p];
        }
        return t;
    };
    return __assign.apply(this, arguments);
};
var __rest = (this && this.__rest) || function (s, e) {
    var t = {};
    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
        t[p] = s[p];
    if (s != null && typeof Object.getOwnPropertySymbols === "function")
        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
                t[p[i]] = s[p[i]];
        }
    return t;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.fromFetch = void 0;
var OperatorSubscriber_1 = require("../../operators/OperatorSubscriber");
var Observable_1 = require("../../Observable");
var innerFrom_1 = require("../../observable/innerFrom");
function fromFetch(input, initWithSelector) {
    if (initWithSelector === void 0) { initWithSelector = {}; }
    var selector = initWithSelector.selector, init = __rest(initWithSelector, ["selector"]);
    return new Observable_1.Observable(function (subscriber) {
        var controller = new AbortController();
        var signal = controller.signal;
        var abortable = true;
        var outerSignal = init.signal;
        if (outerSignal) {
            if (outerSignal.aborted) {
                controller.abort();
            }
            else {
                var outerSignalHandler_1 = function () {
                    if (!signal.aborted) {
                        controller.abort();
                    }
                };
                outerSignal.addEventListener('abort', outerSignalHandler_1);
                subscriber.add(function () { return outerSignal.removeEventListener('abort', outerSignalHandler_1); });
            }
        }
        var perSubscriberInit = __assign(__assign({}, init), { signal: signal });
        var handleError = function (err) {
            abortable = false;
            subscriber.error(err);
        };
        fetch(input, perSubscriberInit)
            .then(function (response) {
            if (selector) {
                innerFrom_1.innerFrom(selector(response)).subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, undefined, function () {
                    abortable = false;
                    subscriber.complete();
                }, handleError));
            }
            else {
                abortable = false;
                subscriber.next(response);
                subscriber.complete();
            }
        })
            .catch(handleError);
        return function () {
            if (abortable) {
                controller.abort();
            }
        };
    });
}
exports.fromFetch = fromFetch;
//# sourceMappingURL=fetch.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.webSocket = void 0;
var WebSocketSubject_1 = require("./WebSocketSubject");
function webSocket(urlConfigOrSource) {
    return new WebSocketSubject_1.WebSocketSubject(urlConfigOrSource);
}
exports.webSocket = webSocket;
//# sourceMappingURL=webSocket.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AjaxResponse = void 0;
var getXHRResponse_1 = require("./getXHRResponse");
var AjaxResponse = (function () {
    function AjaxResponse(originalEvent, xhr, request, type) {
        if (type === void 0) { type = 'download_load'; }
        this.originalEvent = originalEvent;
        this.xhr = xhr;
        this.request = request;
        this.type = type;
        var status = xhr.status, responseType = xhr.responseType;
        this.status = status !== null && status !== void 0 ? status : 0;
        this.responseType = responseType !== null && responseType !== void 0 ? responseType : '';
        var allHeaders = xhr.getAllResponseHeaders();
        this.responseHeaders = allHeaders
            ?
                allHeaders.split('\n').reduce(function (headers, line) {
                    var index = line.indexOf(': ');
                    headers[line.slice(0, index)] = line.slice(index + 2);
                    return headers;
                }, {})
            : {};
        this.response = getXHRResponse_1.getXHRResponse(xhr);
        var loaded = originalEvent.loaded, total = originalEvent.total;
        this.loaded = loaded;
        this.total = total;
    }
    return AjaxResponse;
}());
exports.AjaxResponse = AjaxResponse;
//# sourceMappingURL=AjaxResponse.js.map"use strict";
var __assign = (this && this.__assign) || function () {
    __assign = Object.assign || function(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
            s = arguments[i];
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
                t[p] = s[p];
        }
        return t;
    };
    return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.fromAjax = exports.ajax = void 0;
var map_1 = require("../operators/map");
var Observable_1 = require("../Observable");
var AjaxResponse_1 = require("./AjaxResponse");
var errors_1 = require("./errors");
function ajaxGet(url, headers) {
    return exports.ajax({ method: 'GET', url: url, headers: headers });
}
function ajaxPost(url, body, headers) {
    return exports.ajax({ method: 'POST', url: url, body: body, headers: headers });
}
function ajaxDelete(url, headers) {
    return exports.ajax({ method: 'DELETE', url: url, headers: headers });
}
function ajaxPut(url, body, headers) {
    return exports.ajax({ method: 'PUT', url: url, body: body, headers: headers });
}
function ajaxPatch(url, body, headers) {
    return exports.ajax({ method: 'PATCH', url: url, body: body, headers: headers });
}
var mapResponse = map_1.map(function (x) { return x.response; });
function ajaxGetJSON(url, headers) {
    return mapResponse(exports.ajax({
        method: 'GET',
        url: url,
        headers: headers,
    }));
}
exports.ajax = (function () {
    var create = function (urlOrConfig) {
        var config = typeof urlOrConfig === 'string'
            ? {
                url: urlOrConfig,
            }
            : urlOrConfig;
        return fromAjax(config);
    };
    create.get = ajaxGet;
    create.post = ajaxPost;
    create.delete = ajaxDelete;
    create.put = ajaxPut;
    create.patch = ajaxPatch;
    create.getJSON = ajaxGetJSON;
    return create;
})();
var UPLOAD = 'upload';
var DOWNLOAD = 'download';
var LOADSTART = 'loadstart';
var PROGRESS = 'progress';
var LOAD = 'load';
function fromAjax(init) {
    return new Observable_1.Observable(function (destination) {
        var _a, _b;
        var config = __assign({ async: true, crossDomain: false, withCredentials: false, method: 'GET', timeout: 0, responseType: 'json' }, init);
        var queryParams = config.queryParams, configuredBody = config.body, configuredHeaders = config.headers;
        var url = config.url;
        if (!url) {
            throw new TypeError('url is required');
        }
        if (queryParams) {
            var searchParams_1;
            if (url.includes('?')) {
                var parts = url.split('?');
                if (2 < parts.length) {
                    throw new TypeError('invalid url');
                }
                searchParams_1 = new URLSearchParams(parts[1]);
                new URLSearchParams(queryParams).forEach(function (value, key) { return searchParams_1.set(key, value); });
                url = parts[0] + '?' + searchParams_1;
            }
            else {
                searchParams_1 = new URLSearchParams(queryParams);
                url = url + '?' + searchParams_1;
            }
        }
        var headers = {};
        if (configuredHeaders) {
            for (var key in configuredHeaders) {
                if (configuredHeaders.hasOwnProperty(key)) {
                    headers[key.toLowerCase()] = configuredHeaders[key];
                }
            }
        }
        var crossDomain = config.crossDomain;
        if (!crossDomain && !('x-requested-with' in headers)) {
            headers['x-requested-with'] = 'XMLHttpRequest';
        }
        var withCredentials = config.withCredentials, xsrfCookieName = config.xsrfCookieName, xsrfHeaderName = config.xsrfHeaderName;
        if ((withCredentials || !crossDomain) && xsrfCookieName && xsrfHeaderName) {
            var xsrfCookie = (_b = (_a = document === null || document === void 0 ? void 0 : document.cookie.match(new RegExp("(^|;\\s*)(" + xsrfCookieName + ")=([^;]*)"))) === null || _a === void 0 ? void 0 : _a.pop()) !== null && _b !== void 0 ? _b : '';
            if (xsrfCookie) {
                headers[xsrfHeaderName] = xsrfCookie;
            }
        }
        var body = extractContentTypeAndMaybeSerializeBody(configuredBody, headers);
        var _request = __assign(__assign({}, config), { url: url,
            headers: headers,
            body: body });
        var xhr;
        xhr = init.createXHR ? init.createXHR() : new XMLHttpRequest();
        {
            var progressSubscriber_1 = init.progressSubscriber, _c = init.includeDownloadProgress, includeDownloadProgress = _c === void 0 ? false : _c, _d = init.includeUploadProgress, includeUploadProgress = _d === void 0 ? false : _d;
            var addErrorEvent = function (type, errorFactory) {
                xhr.addEventListener(type, function () {
                    var _a;
                    var error = errorFactory();
                    (_a = progressSubscriber_1 === null || progressSubscriber_1 === void 0 ? void 0 : progressSubscriber_1.error) === null || _a === void 0 ? void 0 : _a.call(progressSubscriber_1, error);
                    destination.error(error);
                });
            };
            addErrorEvent('timeout', function () { return new errors_1.AjaxTimeoutError(xhr, _request); });
            addErrorEvent('abort', function () { return new errors_1.AjaxError('aborted', xhr, _request); });
            var createResponse_1 = function (direction, event) {
                return new AjaxResponse_1.AjaxResponse(event, xhr, _request, direction + "_" + event.type);
            };
            var addProgressEvent_1 = function (target, type, direction) {
                target.addEventListener(type, function (event) {
                    destination.next(createResponse_1(direction, event));
                });
            };
            if (includeUploadProgress) {
                [LOADSTART, PROGRESS, LOAD].forEach(function (type) { return addProgressEvent_1(xhr.upload, type, UPLOAD); });
            }
            if (progressSubscriber_1) {
                [LOADSTART, PROGRESS].forEach(function (type) { return xhr.upload.addEventListener(type, function (e) { var _a; return (_a = progressSubscriber_1 === null || progressSubscriber_1 === void 0 ? void 0 : progressSubscriber_1.next) === null || _a === void 0 ? void 0 : _a.call(progressSubscriber_1, e); }); });
            }
            if (includeDownloadProgress) {
                [LOADSTART, PROGRESS].forEach(function (type) { return addProgressEvent_1(xhr, type, DOWNLOAD); });
            }
            var emitError_1 = function (status) {
                var msg = 'ajax error' + (status ? ' ' + status : '');
                destination.error(new errors_1.AjaxError(msg, xhr, _request));
            };
            xhr.addEventListener('error', function (e) {
                var _a;
                (_a = progressSubscriber_1 === null || progressSubscriber_1 === void 0 ? void 0 : progressSubscriber_1.error) === null || _a === void 0 ? void 0 : _a.call(progressSubscriber_1, e);
                emitError_1();
            });
            xhr.addEventListener(LOAD, function (event) {
                var _a, _b;
                var status = xhr.status;
                if (status < 400) {
                    (_a = progressSubscriber_1 === null || progressSubscriber_1 === void 0 ? void 0 : progressSubscriber_1.complete) === null || _a === void 0 ? void 0 : _a.call(progressSubscriber_1);
                    var response = void 0;
                    try {
                        response = createResponse_1(DOWNLOAD, event);
                    }
                    catch (err) {
                        destination.error(err);
                        return;
                    }
                    destination.next(response);
                    destination.complete();
                }
                else {
                    (_b = progressSubscriber_1 === null || progressSubscriber_1 === void 0 ? void 0 : progressSubscriber_1.error) === null || _b === void 0 ? void 0 : _b.call(progressSubscriber_1, event);
                    emitError_1(status);
                }
            });
        }
        var user = _request.user, method = _request.method, async = _request.async;
        if (user) {
            xhr.open(method, url, async, user, _request.password);
        }
        else {
            xhr.open(method, url, async);
        }
        if (async) {
            xhr.timeout = _request.timeout;
            xhr.responseType = _request.responseType;
        }
        if ('withCredentials' in xhr) {
            xhr.withCredentials = _request.withCredentials;
        }
        for (var key in headers) {
            if (headers.hasOwnProperty(key)) {
                xhr.setRequestHeader(key, headers[key]);
            }
        }
        if (body) {
            xhr.send(body);
        }
        else {
            xhr.send();
        }
        return function () {
            if (xhr && xhr.readyState !== 4) {
                xhr.abort();
            }
        };
    });
}
exports.fromAjax = fromAjax;
function extractContentTypeAndMaybeSerializeBody(body, headers) {
    var _a;
    if (!body ||
        typeof body === 'string' ||
        isFormData(body) ||
        isURLSearchParams(body) ||
        isArrayBuffer(body) ||
        isFile(body) ||
        isBlob(body) ||
        isReadableStream(body)) {
        return body;
    }
    if (isArrayBufferView(body)) {
        return body.buffer;
    }
    if (typeof body === 'object') {
        headers['content-type'] = (_a = headers['content-type']) !== null && _a !== void 0 ? _a : 'application/json;charset=utf-8';
        return JSON.stringify(body);
    }
    throw new TypeError('Unknown body type');
}
var _toString = Object.prototype.toString;
function toStringCheck(obj, name) {
    return _toString.call(obj) === "[object " + name + "]";
}
function isArrayBuffer(body) {
    return toStringCheck(body, 'ArrayBuffer');
}
function isFile(body) {
    return toStringCheck(body, 'File');
}
function isBlob(body) {
    return toStringCheck(body, 'Blob');
}
function isArrayBufferView(body) {
    return typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView(body);
}
function isFormData(body) {
    return typeof FormData !== 'undefined' && body instanceof FormData;
}
function isURLSearchParams(body) {
    return typeof URLSearchParams !== 'undefined' && body instanceof URLSearchParams;
}
function isReadableStream(body) {
    return typeof ReadableStream !== 'undefined' && body instanceof ReadableStream;
}
//# sourceMappingURL=ajax.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AjaxTimeoutError = exports.AjaxError = void 0;
var getXHRResponse_1 = require("./getXHRResponse");
var createErrorClass_1 = require("../util/createErrorClass");
exports.AjaxError = createErrorClass_1.createErrorClass(function (_super) {
    return function AjaxErrorImpl(message, xhr, request) {
        this.message = message;
        this.name = 'AjaxError';
        this.xhr = xhr;
        this.request = request;
        this.status = xhr.status;
        this.responseType = xhr.responseType;
        var response;
        try {
            response = getXHRResponse_1.getXHRResponse(xhr);
        }
        catch (err) {
            response = xhr.responseText;
        }
        this.response = response;
    };
});
exports.AjaxTimeoutError = (function () {
    function AjaxTimeoutErrorImpl(xhr, request) {
        exports.AjaxError.call(this, 'ajax timeout', xhr, request);
        this.name = 'AjaxTimeoutError';
        return this;
    }
    AjaxTimeoutErrorImpl.prototype = Object.create(exports.AjaxError.prototype);
    return AjaxTimeoutErrorImpl;
})();
//# sourceMappingURL=errors.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getXHRResponse = void 0;
function getXHRResponse(xhr) {
    switch (xhr.responseType) {
        case 'json': {
            if ('response' in xhr) {
                return xhr.response;
            }
            else {
                var ieXHR = xhr;
                return JSON.parse(ieXHR.responseText);
            }
        }
        case 'document':
            return xhr.responseXML;
        case 'text':
        default: {
            if ('response' in xhr) {
                return xhr.response;
            }
            else {
                var ieXHR = xhr;
                return ieXHR.responseText;
            }
        }
    }
}
exports.getXHRResponse = getXHRResponse;
//# sourceMappingURL=getXHRResponse.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//# sourceMappingURL=types.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.fromFetch = void 0;
var fetch_1 = require("../internal/observable/dom/fetch");
Object.defineProperty(exports, "fromFetch", { enumerable: true, get: function () { return fetch_1.fromFetch; } });
//# sourceMappingURL=index.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AjaxResponse = exports.AjaxTimeoutError = exports.AjaxError = exports.ajax = void 0;
var ajax_1 = require("../internal/ajax/ajax");
Object.defineProperty(exports, "ajax", { enumerable: true, get: function () { return ajax_1.ajax; } });
var errors_1 = require("../internal/ajax/errors");
Object.defineProperty(exports, "AjaxError", { enumerable: true, get: function () { return errors_1.AjaxError; } });
Object.defineProperty(exports, "AjaxTimeoutError", { enumerable: true, get: function () { return errors_1.AjaxTimeoutError; } });
var AjaxResponse_1 = require("../internal/ajax/AjaxResponse");
Object.defineProperty(exports, "AjaxResponse", { enumerable: true, get: function () { return AjaxResponse_1.AjaxResponse; } });
//# sourceMappingURL=index.js.map/**
  @license
                                 Apache License
                         Version 2.0, January 2004
                      http://www.apache.org/licenses/

 TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

 1. Definitions.

    "License" shall mean the terms and conditions for use, reproduction,
    and distribution as defined by Sections 1 through 9 of this document.

    "Licensor" shall mean the copyright owner or entity authorized by
    the copyright owner that is granting the License.

    "Legal Entity" shall mean the union of the acting entity and all
    other entities that control, are controlled by, or are under common
    control with that entity. For the purposes of this definition,
    "control" means (i) the power, direct or indirect, to cause the
    direction or management of such entity, whether by contract or
    otherwise, or (ii) ownership of fifty percent (50%) or more of the
    outstanding shares, or (iii) beneficial ownership of such entity.

    "You" (or "Your") shall mean an individual or Legal Entity
    exercising permissions granted by this License.

    "Source" form shall mean the preferred form for making modifications,
    including but not limited to software source code, documentation
    source, and configuration files.

    "Object" form shall mean any form resulting from mechanical
    transformation or translation of a Source form, including but
    not limited to compiled object code, generated documentation,
    and conversions to other media types.

    "Work" shall mean the work of authorship, whether in Source or
    Object form, made available under the License, as indicated by a
    copyright notice that is included in or attached to the work
    (an example is provided in the Appendix below).

    "Derivative Works" shall mean any work, whether in Source or Object
    form, that is based on (or derived from) the Work and for which the
    editorial revisions, annotations, elaborations, or other modifications
    represent, as a whole, an original work of authorship. For the purposes
    of this License, Derivative Works shall not include works that remain
    separable from, or merely link (or bind by name) to the interfaces of,
    the Work and Derivative Works thereof.

    "Contribution" shall mean any work of authorship, including
    the original version of the Work and any modifications or additions
    to that Work or Derivative Works thereof, that is intentionally
    submitted to Licensor for inclusion in the Work by the copyright owner
    or by an individual or Legal Entity authorized to submit on behalf of
    the copyright owner. For the purposes of this definition, "submitted"
    means any form of electronic, verbal, or written communication sent
    to the Licensor or its representatives, including but not limited to
    communication on electronic mailing lists, source code control systems,
    and issue tracking systems that are managed by, or on behalf of, the
    Licensor for the purpose of discussing and improving the Work, but
    excluding communication that is conspicuously marked or otherwise
    designated in writing by the copyright owner as "Not a Contribution."

    "Contributor" shall mean Licensor and any individual or Legal Entity
    on behalf of whom a Contribution has been received by Licensor and
    subsequently incorporated within the Work.

 2. Grant of Copyright License. Subject to the terms and conditions of
    this License, each Contributor hereby grants to You a perpetual,
    worldwide, non-exclusive, no-charge, royalty-free, irrevocable
    copyright license to reproduce, prepare Derivative Works of,
    publicly display, publicly perform, sublicense, and distribute the
    Work and such Derivative Works in Source or Object form.

 3. Grant of Patent License. Subject to the terms and conditions of
    this License, each Contributor hereby grants to You a perpetual,
    worldwide, non-exclusive, no-charge, royalty-free, irrevocable
    (except as stated in this section) patent license to make, have made,
    use, offer to sell, sell, import, and otherwise transfer the Work,
    where such license applies only to those patent claims licensable
    by such Contributor that are necessarily infringed by their
    Contribution(s) alone or by combination of their Contribution(s)
    with the Work to which such Contribution(s) was submitted. If You
    institute patent litigation against any entity (including a
    cross-claim or counterclaim in a lawsuit) alleging that the Work
    or a Contribution incorporated within the Work constitutes direct
    or contributory patent infringement, then any patent licenses
    granted to You under this License for that Work shall terminate
    as of the date such litigation is filed.

 4. Redistribution. You may reproduce and distribute copies of the
    Work or Derivative Works thereof in any medium, with or without
    modifications, and in Source or Object form, provided that You
    meet the following conditions:

    (a) You must give any other recipients of the Work or
        Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices
        stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works
        that You distribute, all copyright, patent, trademark, and
        attribution notices from the Source form of the Work,
        excluding those notices that do not pertain to any part of
        the Derivative Works; and

    (d) If the Work includes a "NOTICE" text file as part of its
        distribution, then any Derivative Works that You distribute must
        include a readable copy of the attribution notices contained
        within such NOTICE file, excluding those notices that do not
        pertain to any part of the Derivative Works, in at least one
        of the following places: within a NOTICE text file distributed
        as part of the Derivative Works; within the Source form or
        documentation, if provided along with the Derivative Works; or,
        within a display generated by the Derivative Works, if and
        wherever such third-party notices normally appear. The contents
        of the NOTICE file are for informational purposes only and
        do not modify the License. You may add Your own attribution
        notices within Derivative Works that You distribute, alongside
        or as an addendum to the NOTICE text from the Work, provided
        that such additional attribution notices cannot be construed
        as modifying the License.

    You may add Your own copyright statement to Your modifications and
    may provide additional or different license terms and conditions
    for use, reproduction, or distribution of Your modifications, or
    for any such Derivative Works as a whole, provided Your use,
    reproduction, and distribution of the Work otherwise complies with
    the conditions stated in this License.

 5. Submission of Contributions. Unless You explicitly state otherwise,
    any Contribution intentionally submitted for inclusion in the Work
    by You to the Licensor shall be under the terms and conditions of
    this License, without any additional terms or conditions.
    Notwithstanding the above, nothing herein shall supersede or modify
    the terms of any separate license agreement you may have executed
    with Licensor regarding such Contributions.

 6. Trademarks. This License does not grant permission to use the trade
    names, trademarks, service marks, or product names of the Licensor,
    except as required for reasonable and customary use in describing the
    origin of the Work and reproducing the content of the NOTICE file.

 7. Disclaimer of Warranty. Unless required by applicable law or
    agreed to in writing, Licensor provides the Work (and each
    Contributor provides its Contributions) on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
    implied, including, without limitation, any warranties or conditions
    of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
    PARTICULAR PURPOSE. You are solely responsible for determining the
    appropriateness of using or redistributing the Work and assume any
    risks associated with Your exercise of permissions under this License.

 8. Limitation of Liability. In no event and under no legal theory,
    whether in tort (including negligence), contract, or otherwise,
    unless required by applicable law (such as deliberate and grossly
    negligent acts) or agreed to in writing, shall any Contributor be
    liable to You for damages, including any direct, indirect, special,
    incidental, or consequential damages of any character arising as a
    result of this License or out of the use or inability to use the
    Work (including but not limited to damages for loss of goodwill,
    work stoppage, computer failure or malfunction, or any and all
    other commercial damages or losses), even if such Contributor
    has been advised of the possibility of such damages.

 9. Accepting Warranty or Additional Liability. While redistributing
    the Work or Derivative Works thereof, You may choose to offer,
    and charge a fee for, acceptance of support, warranty, indemnity,
    or other liability obligations and/or rights consistent with this
    License. However, in accepting such obligations, You may act only
    on Your own behalf and on Your sole responsibility, not on behalf
    of any other Contributor, and only if You agree to indemnify,
    defend, and hold each Contributor harmless for any liability
    incurred by, or claims asserted against, such Contributor by reason
    of your accepting any such warranty or additional liability.

 END OF TERMS AND CONDITIONS

 APPENDIX: How to apply the Apache License to your work.

    To apply the Apache License to your work, attach the following
    boilerplate notice, with the fields enclosed by brackets "[]"
    replaced with your own identifying information. (Don't include
    the brackets!)  The text should be enclosed in the appropriate
    comment syntax for the file format. We also recommend that a
    file or class name and description of purpose be included on the
    same "printed page" as the copyright notice for easier
    identification within third-party archives.

 Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 

 **/
/**
  @license
                                 Apache License
                         Version 2.0, January 2004
                      http://www.apache.org/licenses/

 TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

 1. Definitions.

    "License" shall mean the terms and conditions for use, reproduction,
    and distribution as defined by Sections 1 through 9 of this document.

    "Licensor" shall mean the copyright owner or entity authorized by
    the copyright owner that is granting the License.

    "Legal Entity" shall mean the union of the acting entity and all
    other entities that control, are controlled by, or are under common
    control with that entity. For the purposes of this definition,
    "control" means (i) the power, direct or indirect, to cause the
    direction or management of such entity, whether by contract or
    otherwise, or (ii) ownership of fifty percent (50%) or more of the
    outstanding shares, or (iii) beneficial ownership of such entity.

    "You" (or "Your") shall mean an individual or Legal Entity
    exercising permissions granted by this License.

    "Source" form shall mean the preferred form for making modifications,
    including but not limited to software source code, documentation
    source, and configuration files.

    "Object" form shall mean any form resulting from mechanical
    transformation or translation of a Source form, including but
    not limited to compiled object code, generated documentation,
    and conversions to other media types.

    "Work" shall mean the work of authorship, whether in Source or
    Object form, made available under the License, as indicated by a
    copyright notice that is included in or attached to the work
    (an example is provided in the Appendix below).

    "Derivative Works" shall mean any work, whether in Source or Object
    form, that is based on (or derived from) the Work and for which the
    editorial revisions, annotations, elaborations, or other modifications
    represent, as a whole, an original work of authorship. For the purposes
    of this License, Derivative Works shall not include works that remain
    separable from, or merely link (or bind by name) to the interfaces of,
    the Work and Derivative Works thereof.

    "Contribution" shall mean any work of authorship, including
    the original version of the Work and any modifications or additions
    to that Work or Derivative Works thereof, that is intentionally
    submitted to Licensor for inclusion in the Work by the copyright owner
    or by an individual or Legal Entity authorized to submit on behalf of
    the copyright owner. For the purposes of this definition, "submitted"
    means any form of electronic, verbal, or written communication sent
    to the Licensor or its representatives, including but not limited to
    communication on electronic mailing lists, source code control systems,
    and issue tracking systems that are managed by, or on behalf of, the
    Licensor for the purpose of discussing and improving the Work, but
    excluding communication that is conspicuously marked or otherwise
    designated in writing by the copyright owner as "Not a Contribution."

    "Contributor" shall mean Licensor and any individual or Legal Entity
    on behalf of whom a Contribution has been received by Licensor and
    subsequently incorporated within the Work.

 2. Grant of Copyright License. Subject to the terms and conditions of
    this License, each Contributor hereby grants to You a perpetual,
    worldwide, non-exclusive, no-charge, royalty-free, irrevocable
    copyright license to reproduce, prepare Derivative Works of,
    publicly display, publicly perform, sublicense, and distribute the
    Work and such Derivative Works in Source or Object form.

 3. Grant of Patent License. Subject to the terms and conditions of
    this License, each Contributor hereby grants to You a perpetual,
    worldwide, non-exclusive, no-charge, royalty-free, irrevocable
    (except as stated in this section) patent license to make, have made,
    use, offer to sell, sell, import, and otherwise transfer the Work,
    where such license applies only to those patent claims licensable
    by such Contributor that are necessarily infringed by their
    Contribution(s) alone or by combination of their Contribution(s)
    with the Work to which such Contribution(s) was submitted. If You
    institute patent litigation against any entity (including a
    cross-claim or counterclaim in a lawsuit) alleging that the Work
    or a Contribution incorporated within the Work constitutes direct
    or contributory patent infringement, then any patent licenses
    granted to You under this License for that Work shall terminate
    as of the date such litigation is filed.

 4. Redistribution. You may reproduce and distribute copies of the
    Work or Derivative Works thereof in any medium, with or without
    modifications, and in Source or Object form, provided that You
    meet the following conditions:

    (a) You must give any other recipients of the Work or
        Derivative Works a copy of this License; and

    (b) You must cause any modified files to carry prominent notices
        stating that You changed the files; and

    (c) You must retain, in the Source form of any Derivative Works
        that You distribute, all copyright, patent, trademark, and
        attribution notices from the Source form of the Work,
        excluding those notices that do not pertain to any part of
        the Derivative Works; and

    (d) If the Work includes a "NOTICE" text file as part of its
        distribution, then any Derivative Works that You distribute must
        include a readable copy of the attribution notices contained
        within such NOTICE file, excluding those notices that do not
        pertain to any part of the Derivative Works, in at least one
        of the following places: within a NOTICE text file distributed
        as part of the Derivative Works; within the Source form or
        documentation, if provided along with the Derivative Works; or,
        within a display generated by the Derivative Works, if and
        wherever such third-party notices normally appear. The contents
        of the NOTICE file are for informational purposes only and
        do not modify the License. You may add Your own attribution
        notices within Derivative Works that You distribute, alongside
        or as an addendum to the NOTICE text from the Work, provided
        that such additional attribution notices cannot be construed
        as modifying the License.

    You may add Your own copyright statement to Your modifications and
    may provide additional or different license terms and conditions
    for use, reproduction, or distribution of Your modifications, or
    for any such Derivative Works as a whole, provided Your use,
    reproduction, and distribution of the Work otherwise complies with
    the conditions stated in this License.

 5. Submission of Contributions. Unless You explicitly state otherwise,
    any Contribution intentionally submitted for inclusion in the Work
    by You to the Licensor shall be under the terms and conditions of
    this License, without any additional terms or conditions.
    Notwithstanding the above, nothing herein shall supersede or modify
    the terms of any separate license agreement you may have executed
    with Licensor regarding such Contributions.

 6. Trademarks. This License does not grant permission to use the trade
    names, trademarks, service marks, or product names of the Licensor,
    except as required for reasonable and customary use in describing the
    origin of the Work and reproducing the content of the NOTICE file.

 7. Disclaimer of Warranty. Unless required by applicable law or
    agreed to in writing, Licensor provides the Work (and each
    Contributor provides its Contributions) on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
    implied, including, without limitation, any warranties or conditions
    of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
    PARTICULAR PURPOSE. You are solely responsible for determining the
    appropriateness of using or redistributing the Work and assume any
    risks associated with Your exercise of permissions under this License.

 8. Limitation of Liability. In no event and under no legal theory,
    whether in tort (including negligence), contract, or otherwise,
    unless required by applicable law (such as deliberate and grossly
    negligent acts) or agreed to in writing, shall any Contributor be
    liable to You for damages, including any direct, indirect, special,
    incidental, or consequential damages of any character arising as a
    result of this License or out of the use or inability to use the
    Work (including but not limited to damages for loss of goodwill,
    work stoppage, computer failure or malfunction, or any and all
    other commercial damages or losses), even if such Contributor
    has been advised of the possibility of such damages.

 9. Accepting Warranty or Additional Liability. While redistributing
    the Work or Derivative Works thereof, You may choose to offer,
    and charge a fee for, acceptance of support, warranty, indemnity,
    or other liability obligations and/or rights consistent with this
    License. However, in accepting such obligations, You may act only
    on Your own behalf and on Your sole responsibility, not on behalf
    of any other Contributor, and only if You agree to indemnify,
    defend, and hold each Contributor harmless for any liability
    incurred by, or claims asserted against, such Contributor by reason
    of your accepting any such warranty or additional liability.

 END OF TERMS AND CONDITIONS

 APPENDIX: How to apply the Apache License to your work.

    To apply the Apache License to your work, attach the following
    boilerplate notice, with the fields enclosed by brackets "[]"
    replaced with your own identifying information. (Don't include
    the brackets!)  The text should be enclosed in the appropriate
    comment syntax for the file format. We also recommend that a
    file or class name and description of purpose be included on the
    same "printed page" as the copyright notice for easier
    identification within third-party archives.

 Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 

 **/
(function (global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
    typeof define === 'function' && define.amd ? define('rxjs', ['exports'], factory) :
    (factory((global.rxjs = {})));
}(this, (function (exports) { 'use strict';

    /*! *****************************************************************************
    Copyright (c) Microsoft Corporation.

    Permission to use, copy, modify, and/or distribute this software for any
    purpose with or without fee is hereby granted.

    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.
    ***************************************************************************** */
    /* global Reflect, Promise */

    var extendStatics = function(d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };

    function __extends(d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    }

    var __assign = function() {
        __assign = Object.assign || function __assign(t) {
            for (var s, i = 1, n = arguments.length; i < n; i++) {
                s = arguments[i];
                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
            }
            return t;
        };
        return __assign.apply(this, arguments);
    };

    function __rest(s, e) {
        var t = {};
        for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
            t[p] = s[p];
        if (s != null && typeof Object.getOwnPropertySymbols === "function")
            for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
                if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
                    t[p[i]] = s[p[i]];
            }
        return t;
    }

    function __awaiter(thisArg, _arguments, P, generator) {
        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
        return new (P || (P = Promise))(function (resolve, reject) {
            function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
            function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
            step((generator = generator.apply(thisArg, _arguments || [])).next());
        });
    }

    function __generator(thisArg, body) {
        var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
        return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
        function verb(n) { return function (v) { return step([n, v]); }; }
        function step(op) {
            if (f) throw new TypeError("Generator is already executing.");
            while (_) try {
                if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
                if (y = 0, t) op = [op[0] & 2, t.value];
                switch (op[0]) {
                    case 0: case 1: t = op; break;
                    case 4: _.label++; return { value: op[1], done: false };
                    case 5: _.label++; y = op[1]; op = [0]; continue;
                    case 7: op = _.ops.pop(); _.trys.pop(); continue;
                    default:
                        if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                        if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                        if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                        if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                        if (t[2]) _.ops.pop();
                        _.trys.pop(); continue;
                }
                op = body.call(thisArg, _);
            } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
            if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
        }
    }

    function __values(o) {
        var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
        if (m) return m.call(o);
        if (o && typeof o.length === "number") return {
            next: function () {
                if (o && i >= o.length) o = void 0;
                return { value: o && o[i++], done: !o };
            }
        };
        throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
    }

    function __read(o, n) {
        var m = typeof Symbol === "function" && o[Symbol.iterator];
        if (!m) return o;
        var i = m.call(o), r, ar = [], e;
        try {
            while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
        }
        catch (error) { e = { error: error }; }
        finally {
            try {
                if (r && !r.done && (m = i["return"])) m.call(i);
            }
            finally { if (e) throw e.error; }
        }
        return ar;
    }

    function __spreadArray(to, from, pack) {
        if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
            if (ar || !(i in from)) {
                if (!ar) ar = Array.prototype.slice.call(from, 0, i);
                ar[i] = from[i];
            }
        }
        return to.concat(ar || Array.prototype.slice.call(from));
    }

    function __await(v) {
        return this instanceof __await ? (this.v = v, this) : new __await(v);
    }

    function __asyncGenerator(thisArg, _arguments, generator) {
        if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
        var g = generator.apply(thisArg, _arguments || []), i, q = [];
        return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
        function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
        function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
        function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
        function fulfill(value) { resume("next", value); }
        function reject(value) { resume("throw", value); }
        function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
    }

    function __asyncValues(o) {
        if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
        var m = o[Symbol.asyncIterator], i;
        return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
        function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
        function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
    }

    function isFunction(value) {
        return typeof value === 'function';
    }

    function createErrorClass(createImpl) {
        var _super = function (instance) {
            Error.call(instance);
            instance.stack = new Error().stack;
        };
        var ctorFunc = createImpl(_super);
        ctorFunc.prototype = Object.create(Error.prototype);
        ctorFunc.prototype.constructor = ctorFunc;
        return ctorFunc;
    }

    var UnsubscriptionError = createErrorClass(function (_super) {
        return function UnsubscriptionErrorImpl(errors) {
            _super(this);
            this.message = errors
                ? errors.length + " errors occurred during unsubscription:\n" + errors.map(function (err, i) { return i + 1 + ") " + err.toString(); }).join('\n  ')
                : '';
            this.name = 'UnsubscriptionError';
            this.errors = errors;
        };
    });

    function arrRemove(arr, item) {
        if (arr) {
            var index = arr.indexOf(item);
            0 <= index && arr.splice(index, 1);
        }
    }

    var Subscription = (function () {
        function Subscription(initialTeardown) {
            this.initialTeardown = initialTeardown;
            this.closed = false;
            this._parentage = null;
            this._finalizers = null;
        }
        Subscription.prototype.unsubscribe = function () {
            var e_1, _a, e_2, _b;
            var errors;
            if (!this.closed) {
                this.closed = true;
                var _parentage = this._parentage;
                if (_parentage) {
                    this._parentage = null;
                    if (Array.isArray(_parentage)) {
                        try {
                            for (var _parentage_1 = __values(_parentage), _parentage_1_1 = _parentage_1.next(); !_parentage_1_1.done; _parentage_1_1 = _parentage_1.next()) {
                                var parent_1 = _parentage_1_1.value;
                                parent_1.remove(this);
                            }
                        }
                        catch (e_1_1) { e_1 = { error: e_1_1 }; }
                        finally {
                            try {
                                if (_parentage_1_1 && !_parentage_1_1.done && (_a = _parentage_1.return)) _a.call(_parentage_1);
                            }
                            finally { if (e_1) throw e_1.error; }
                        }
                    }
                    else {
                        _parentage.remove(this);
                    }
                }
                var initialFinalizer = this.initialTeardown;
                if (isFunction(initialFinalizer)) {
                    try {
                        initialFinalizer();
                    }
                    catch (e) {
                        errors = e instanceof UnsubscriptionError ? e.errors : [e];
                    }
                }
                var _finalizers = this._finalizers;
                if (_finalizers) {
                    this._finalizers = null;
                    try {
                        for (var _finalizers_1 = __values(_finalizers), _finalizers_1_1 = _finalizers_1.next(); !_finalizers_1_1.done; _finalizers_1_1 = _finalizers_1.next()) {
                            var finalizer = _finalizers_1_1.value;
                            try {
                                execFinalizer(finalizer);
                            }
                            catch (err) {
                                errors = errors !== null && errors !== void 0 ? errors : [];
                                if (err instanceof UnsubscriptionError) {
                                    errors = __spreadArray(__spreadArray([], __read(errors)), __read(err.errors));
                                }
                                else {
                                    errors.push(err);
                                }
                            }
                        }
                    }
                    catch (e_2_1) { e_2 = { error: e_2_1 }; }
                    finally {
                        try {
                            if (_finalizers_1_1 && !_finalizers_1_1.done && (_b = _finalizers_1.return)) _b.call(_finalizers_1);
                        }
                        finally { if (e_2) throw e_2.error; }
                    }
                }
                if (errors) {
                    throw new UnsubscriptionError(errors);
                }
            }
        };
        Subscription.prototype.add = function (teardown) {
            var _a;
            if (teardown && teardown !== this) {
                if (this.closed) {
                    execFinalizer(teardown);
                }
                else {
                    if (teardown instanceof Subscription) {
                        if (teardown.closed || teardown._hasParent(this)) {
                            return;
                        }
                        teardown._addParent(this);
                    }
                    (this._finalizers = (_a = this._finalizers) !== null && _a !== void 0 ? _a : []).push(teardown);
                }
            }
        };
        Subscription.prototype._hasParent = function (parent) {
            var _parentage = this._parentage;
            return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));
        };
        Subscription.prototype._addParent = function (parent) {
            var _parentage = this._parentage;
            this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;
        };
        Subscription.prototype._removeParent = function (parent) {
            var _parentage = this._parentage;
            if (_parentage === parent) {
                this._parentage = null;
            }
            else if (Array.isArray(_parentage)) {
                arrRemove(_parentage, parent);
            }
        };
        Subscription.prototype.remove = function (teardown) {
            var _finalizers = this._finalizers;
            _finalizers && arrRemove(_finalizers, teardown);
            if (teardown instanceof Subscription) {
                teardown._removeParent(this);
            }
        };
        Subscription.EMPTY = (function () {
            var empty = new Subscription();
            empty.closed = true;
            return empty;
        })();
        return Subscription;
    }());
    var EMPTY_SUBSCRIPTION = Subscription.EMPTY;
    function isSubscription(value) {
        return (value instanceof Subscription ||
            (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe)));
    }
    function execFinalizer(finalizer) {
        if (isFunction(finalizer)) {
            finalizer();
        }
        else {
            finalizer.unsubscribe();
        }
    }

    var config = {
        onUnhandledError: null,
        onStoppedNotification: null,
        Promise: undefined,
        useDeprecatedSynchronousErrorHandling: false,
        useDeprecatedNextContext: false,
    };

    var timeoutProvider = {
        setTimeout: function (handler, timeout) {
            var args = [];
            for (var _i = 2; _i < arguments.length; _i++) {
                args[_i - 2] = arguments[_i];
            }
            var delegate = timeoutProvider.delegate;
            if (delegate === null || delegate === void 0 ? void 0 : delegate.setTimeout) {
                return delegate.setTimeout.apply(delegate, __spreadArray([handler, timeout], __read(args)));
            }
            return setTimeout.apply(void 0, __spreadArray([handler, timeout], __read(args)));
        },
        clearTimeout: function (handle) {
            var delegate = timeoutProvider.delegate;
            return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearTimeout) || clearTimeout)(handle);
        },
        delegate: undefined,
    };

    function reportUnhandledError(err) {
        timeoutProvider.setTimeout(function () {
            var onUnhandledError = config.onUnhandledError;
            if (onUnhandledError) {
                onUnhandledError(err);
            }
            else {
                throw err;
            }
        });
    }

    function noop() { }

    var COMPLETE_NOTIFICATION = (function () { return createNotification('C', undefined, undefined); })();
    function errorNotification(error) {
        return createNotification('E', undefined, error);
    }
    function nextNotification(value) {
        return createNotification('N', value, undefined);
    }
    function createNotification(kind, value, error) {
        return {
            kind: kind,
            value: value,
            error: error,
        };
    }

    var context = null;
    function errorContext(cb) {
        if (config.useDeprecatedSynchronousErrorHandling) {
            var isRoot = !context;
            if (isRoot) {
                context = { errorThrown: false, error: null };
            }
            cb();
            if (isRoot) {
                var _a = context, errorThrown = _a.errorThrown, error = _a.error;
                context = null;
                if (errorThrown) {
                    throw error;
                }
            }
        }
        else {
            cb();
        }
    }
    function captureError(err) {
        if (config.useDeprecatedSynchronousErrorHandling && context) {
            context.errorThrown = true;
            context.error = err;
        }
    }

    var Subscriber = (function (_super) {
        __extends(Subscriber, _super);
        function Subscriber(destination) {
            var _this = _super.call(this) || this;
            _this.isStopped = false;
            if (destination) {
                _this.destination = destination;
                if (isSubscription(destination)) {
                    destination.add(_this);
                }
            }
            else {
                _this.destination = EMPTY_OBSERVER;
            }
            return _this;
        }
        Subscriber.create = function (next, error, complete) {
            return new SafeSubscriber(next, error, complete);
        };
        Subscriber.prototype.next = function (value) {
            if (this.isStopped) {
                handleStoppedNotification(nextNotification(value), this);
            }
            else {
                this._next(value);
            }
        };
        Subscriber.prototype.error = function (err) {
            if (this.isStopped) {
                handleStoppedNotification(errorNotification(err), this);
            }
            else {
                this.isStopped = true;
                this._error(err);
            }
        };
        Subscriber.prototype.complete = function () {
            if (this.isStopped) {
                handleStoppedNotification(COMPLETE_NOTIFICATION, this);
            }
            else {
                this.isStopped = true;
                this._complete();
            }
        };
        Subscriber.prototype.unsubscribe = function () {
            if (!this.closed) {
                this.isStopped = true;
                _super.prototype.unsubscribe.call(this);
                this.destination = null;
            }
        };
        Subscriber.prototype._next = function (value) {
            this.destination.next(value);
        };
        Subscriber.prototype._error = function (err) {
            try {
                this.destination.error(err);
            }
            finally {
                this.unsubscribe();
            }
        };
        Subscriber.prototype._complete = function () {
            try {
                this.destination.complete();
            }
            finally {
                this.unsubscribe();
            }
        };
        return Subscriber;
    }(Subscription));
    var _bind = Function.prototype.bind;
    function bind(fn, thisArg) {
        return _bind.call(fn, thisArg);
    }
    var ConsumerObserver = (function () {
        function ConsumerObserver(partialObserver) {
            this.partialObserver = partialObserver;
        }
        ConsumerObserver.prototype.next = function (value) {
            var partialObserver = this.partialObserver;
            if (partialObserver.next) {
                try {
                    partialObserver.next(value);
                }
                catch (error) {
                    handleUnhandledError(error);
                }
            }
        };
        ConsumerObserver.prototype.error = function (err) {
            var partialObserver = this.partialObserver;
            if (partialObserver.error) {
                try {
                    partialObserver.error(err);
                }
                catch (error) {
                    handleUnhandledError(error);
                }
            }
            else {
                handleUnhandledError(err);
            }
        };
        ConsumerObserver.prototype.complete = function () {
            var partialObserver = this.partialObserver;
            if (partialObserver.complete) {
                try {
                    partialObserver.complete();
                }
                catch (error) {
                    handleUnhandledError(error);
                }
            }
        };
        return ConsumerObserver;
    }());
    var SafeSubscriber = (function (_super) {
        __extends(SafeSubscriber, _super);
        function SafeSubscriber(observerOrNext, error, complete) {
            var _this = _super.call(this) || this;
            var partialObserver;
            if (isFunction(observerOrNext) || !observerOrNext) {
                partialObserver = {
                    next: (observerOrNext !== null && observerOrNext !== void 0 ? observerOrNext : undefined),
                    error: error !== null && error !== void 0 ? error : undefined,
                    complete: complete !== null && complete !== void 0 ? complete : undefined,
                };
            }
            else {
                var context_1;
                if (_this && config.useDeprecatedNextContext) {
                    context_1 = Object.create(observerOrNext);
                    context_1.unsubscribe = function () { return _this.unsubscribe(); };
                    partialObserver = {
                        next: observerOrNext.next && bind(observerOrNext.next, context_1),
                        error: observerOrNext.error && bind(observerOrNext.error, context_1),
                        complete: observerOrNext.complete && bind(observerOrNext.complete, context_1),
                    };
                }
                else {
                    partialObserver = observerOrNext;
                }
            }
            _this.destination = new ConsumerObserver(partialObserver);
            return _this;
        }
        return SafeSubscriber;
    }(Subscriber));
    function handleUnhandledError(error) {
        if (config.useDeprecatedSynchronousErrorHandling) {
            captureError(error);
        }
        else {
            reportUnhandledError(error);
        }
    }
    function defaultErrorHandler(err) {
        throw err;
    }
    function handleStoppedNotification(notification, subscriber) {
        var onStoppedNotification = config.onStoppedNotification;
        onStoppedNotification && timeoutProvider.setTimeout(function () { return onStoppedNotification(notification, subscriber); });
    }
    var EMPTY_OBSERVER = {
        closed: true,
        next: noop,
        error: defaultErrorHandler,
        complete: noop,
    };

    var observable = (function () { return (typeof Symbol === 'function' && Symbol.observable) || '@@observable'; })();

    function identity(x) {
        return x;
    }

    function pipe() {
        var fns = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            fns[_i] = arguments[_i];
        }
        return pipeFromArray(fns);
    }
    function pipeFromArray(fns) {
        if (fns.length === 0) {
            return identity;
        }
        if (fns.length === 1) {
            return fns[0];
        }
        return function piped(input) {
            return fns.reduce(function (prev, fn) { return fn(prev); }, input);
        };
    }

    var Observable = (function () {
        function Observable(subscribe) {
            if (subscribe) {
                this._subscribe = subscribe;
            }
        }
        Observable.prototype.lift = function (operator) {
            var observable$$1 = new Observable();
            observable$$1.source = this;
            observable$$1.operator = operator;
            return observable$$1;
        };
        Observable.prototype.subscribe = function (observerOrNext, error, complete) {
            var _this = this;
            var subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);
            errorContext(function () {
                var _a = _this, operator = _a.operator, source = _a.source;
                subscriber.add(operator
                    ?
                        operator.call(subscriber, source)
                    : source
                        ?
                            _this._subscribe(subscriber)
                        :
                            _this._trySubscribe(subscriber));
            });
            return subscriber;
        };
        Observable.prototype._trySubscribe = function (sink) {
            try {
                return this._subscribe(sink);
            }
            catch (err) {
                sink.error(err);
            }
        };
        Observable.prototype.forEach = function (next, promiseCtor) {
            var _this = this;
            promiseCtor = getPromiseCtor(promiseCtor);
            return new promiseCtor(function (resolve, reject) {
                var subscriber = new SafeSubscriber({
                    next: function (value) {
                        try {
                            next(value);
                        }
                        catch (err) {
                            reject(err);
                            subscriber.unsubscribe();
                        }
                    },
                    error: reject,
                    complete: resolve,
                });
                _this.subscribe(subscriber);
            });
        };
        Observable.prototype._subscribe = function (subscriber) {
            var _a;
            return (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber);
        };
        Observable.prototype[observable] = function () {
            return this;
        };
        Observable.prototype.pipe = function () {
            var operations = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                operations[_i] = arguments[_i];
            }
            return pipeFromArray(operations)(this);
        };
        Observable.prototype.toPromise = function (promiseCtor) {
            var _this = this;
            promiseCtor = getPromiseCtor(promiseCtor);
            return new promiseCtor(function (resolve, reject) {
                var value;
                _this.subscribe(function (x) { return (value = x); }, function (err) { return reject(err); }, function () { return resolve(value); });
            });
        };
        Observable.create = function (subscribe) {
            return new Observable(subscribe);
        };
        return Observable;
    }());
    function getPromiseCtor(promiseCtor) {
        var _a;
        return (_a = promiseCtor !== null && promiseCtor !== void 0 ? promiseCtor : config.Promise) !== null && _a !== void 0 ? _a : Promise;
    }
    function isObserver(value) {
        return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);
    }
    function isSubscriber(value) {
        return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));
    }

    function hasLift(source) {
        return isFunction(source === null || source === void 0 ? void 0 : source.lift);
    }
    function operate(init) {
        return function (source) {
            if (hasLift(source)) {
                return source.lift(function (liftedSource) {
                    try {
                        return init(liftedSource, this);
                    }
                    catch (err) {
                        this.error(err);
                    }
                });
            }
            throw new TypeError('Unable to lift unknown Observable type');
        };
    }

    function createOperatorSubscriber(destination, onNext, onComplete, onError, onFinalize) {
        return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);
    }
    var OperatorSubscriber = (function (_super) {
        __extends(OperatorSubscriber, _super);
        function OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize, shouldUnsubscribe) {
            var _this = _super.call(this, destination) || this;
            _this.onFinalize = onFinalize;
            _this.shouldUnsubscribe = shouldUnsubscribe;
            _this._next = onNext
                ? function (value) {
                    try {
                        onNext(value);
                    }
                    catch (err) {
                        destination.error(err);
                    }
                }
                : _super.prototype._next;
            _this._error = onError
                ? function (err) {
                    try {
                        onError(err);
                    }
                    catch (err) {
                        destination.error(err);
                    }
                    finally {
                        this.unsubscribe();
                    }
                }
                : _super.prototype._error;
            _this._complete = onComplete
                ? function () {
                    try {
                        onComplete();
                    }
                    catch (err) {
                        destination.error(err);
                    }
                    finally {
                        this.unsubscribe();
                    }
                }
                : _super.prototype._complete;
            return _this;
        }
        OperatorSubscriber.prototype.unsubscribe = function () {
            var _a;
            if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {
                var closed_1 = this.closed;
                _super.prototype.unsubscribe.call(this);
                !closed_1 && ((_a = this.onFinalize) === null || _a === void 0 ? void 0 : _a.call(this));
            }
        };
        return OperatorSubscriber;
    }(Subscriber));

    function refCount() {
        return operate(function (source, subscriber) {
            var connection = null;
            source._refCount++;
            var refCounter = createOperatorSubscriber(subscriber, undefined, undefined, undefined, function () {
                if (!source || source._refCount <= 0 || 0 < --source._refCount) {
                    connection = null;
                    return;
                }
                var sharedConnection = source._connection;
                var conn = connection;
                connection = null;
                if (sharedConnection && (!conn || sharedConnection === conn)) {
                    sharedConnection.unsubscribe();
                }
                subscriber.unsubscribe();
            });
            source.subscribe(refCounter);
            if (!refCounter.closed) {
                connection = source.connect();
            }
        });
    }

    var ConnectableObservable = (function (_super) {
        __extends(ConnectableObservable, _super);
        function ConnectableObservable(source, subjectFactory) {
            var _this = _super.call(this) || this;
            _this.source = source;
            _this.subjectFactory = subjectFactory;
            _this._subject = null;
            _this._refCount = 0;
            _this._connection = null;
            if (hasLift(source)) {
                _this.lift = source.lift;
            }
            return _this;
        }
        ConnectableObservable.prototype._subscribe = function (subscriber) {
            return this.getSubject().subscribe(subscriber);
        };
        ConnectableObservable.prototype.getSubject = function () {
            var subject = this._subject;
            if (!subject || subject.isStopped) {
                this._subject = this.subjectFactory();
            }
            return this._subject;
        };
        ConnectableObservable.prototype._teardown = function () {
            this._refCount = 0;
            var _connection = this._connection;
            this._subject = this._connection = null;
            _connection === null || _connection === void 0 ? void 0 : _connection.unsubscribe();
        };
        ConnectableObservable.prototype.connect = function () {
            var _this = this;
            var connection = this._connection;
            if (!connection) {
                connection = this._connection = new Subscription();
                var subject_1 = this.getSubject();
                connection.add(this.source.subscribe(createOperatorSubscriber(subject_1, undefined, function () {
                    _this._teardown();
                    subject_1.complete();
                }, function (err) {
                    _this._teardown();
                    subject_1.error(err);
                }, function () { return _this._teardown(); })));
                if (connection.closed) {
                    this._connection = null;
                    connection = Subscription.EMPTY;
                }
            }
            return connection;
        };
        ConnectableObservable.prototype.refCount = function () {
            return refCount()(this);
        };
        return ConnectableObservable;
    }(Observable));

    var performanceTimestampProvider = {
        now: function () {
            return (performanceTimestampProvider.delegate || performance).now();
        },
        delegate: undefined,
    };

    var animationFrameProvider = {
        schedule: function (callback) {
            var request = requestAnimationFrame;
            var cancel = cancelAnimationFrame;
            var delegate = animationFrameProvider.delegate;
            if (delegate) {
                request = delegate.requestAnimationFrame;
                cancel = delegate.cancelAnimationFrame;
            }
            var handle = request(function (timestamp) {
                cancel = undefined;
                callback(timestamp);
            });
            return new Subscription(function () { return cancel === null || cancel === void 0 ? void 0 : cancel(handle); });
        },
        requestAnimationFrame: function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            var delegate = animationFrameProvider.delegate;
            return ((delegate === null || delegate === void 0 ? void 0 : delegate.requestAnimationFrame) || requestAnimationFrame).apply(void 0, __spreadArray([], __read(args)));
        },
        cancelAnimationFrame: function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            var delegate = animationFrameProvider.delegate;
            return ((delegate === null || delegate === void 0 ? void 0 : delegate.cancelAnimationFrame) || cancelAnimationFrame).apply(void 0, __spreadArray([], __read(args)));
        },
        delegate: undefined,
    };

    function animationFrames(timestampProvider) {
        return timestampProvider ? animationFramesFactory(timestampProvider) : DEFAULT_ANIMATION_FRAMES;
    }
    function animationFramesFactory(timestampProvider) {
        var schedule = animationFrameProvider.schedule;
        return new Observable(function (subscriber) {
            var subscription = new Subscription();
            var provider = timestampProvider || performanceTimestampProvider;
            var start = provider.now();
            var run = function (timestamp) {
                var now = provider.now();
                subscriber.next({
                    timestamp: timestampProvider ? now : timestamp,
                    elapsed: now - start,
                });
                if (!subscriber.closed) {
                    subscription.add(schedule(run));
                }
            };
            subscription.add(schedule(run));
            return subscription;
        });
    }
    var DEFAULT_ANIMATION_FRAMES = animationFramesFactory();

    var ObjectUnsubscribedError = createErrorClass(function (_super) {
        return function ObjectUnsubscribedErrorImpl() {
            _super(this);
            this.name = 'ObjectUnsubscribedError';
            this.message = 'object unsubscribed';
        };
    });

    var Subject = (function (_super) {
        __extends(Subject, _super);
        function Subject() {
            var _this = _super.call(this) || this;
            _this.closed = false;
            _this.currentObservers = null;
            _this.observers = [];
            _this.isStopped = false;
            _this.hasError = false;
            _this.thrownError = null;
            return _this;
        }
        Subject.prototype.lift = function (operator) {
            var subject = new AnonymousSubject(this, this);
            subject.operator = operator;
            return subject;
        };
        Subject.prototype._throwIfClosed = function () {
            if (this.closed) {
                throw new ObjectUnsubscribedError();
            }
        };
        Subject.prototype.next = function (value) {
            var _this = this;
            errorContext(function () {
                var e_1, _a;
                _this._throwIfClosed();
                if (!_this.isStopped) {
                    if (!_this.currentObservers) {
                        _this.currentObservers = Array.from(_this.observers);
                    }
                    try {
                        for (var _b = __values(_this.currentObservers), _c = _b.next(); !_c.done; _c = _b.next()) {
                            var observer = _c.value;
                            observer.next(value);
                        }
                    }
                    catch (e_1_1) { e_1 = { error: e_1_1 }; }
                    finally {
                        try {
                            if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
                        }
                        finally { if (e_1) throw e_1.error; }
                    }
                }
            });
        };
        Subject.prototype.error = function (err) {
            var _this = this;
            errorContext(function () {
                _this._throwIfClosed();
                if (!_this.isStopped) {
                    _this.hasError = _this.isStopped = true;
                    _this.thrownError = err;
                    var observers = _this.observers;
                    while (observers.length) {
                        observers.shift().error(err);
                    }
                }
            });
        };
        Subject.prototype.complete = function () {
            var _this = this;
            errorContext(function () {
                _this._throwIfClosed();
                if (!_this.isStopped) {
                    _this.isStopped = true;
                    var observers = _this.observers;
                    while (observers.length) {
                        observers.shift().complete();
                    }
                }
            });
        };
        Subject.prototype.unsubscribe = function () {
            this.isStopped = this.closed = true;
            this.observers = this.currentObservers = null;
        };
        Object.defineProperty(Subject.prototype, "observed", {
            get: function () {
                var _a;
                return ((_a = this.observers) === null || _a === void 0 ? void 0 : _a.length) > 0;
            },
            enumerable: false,
            configurable: true
        });
        Subject.prototype._trySubscribe = function (subscriber) {
            this._throwIfClosed();
            return _super.prototype._trySubscribe.call(this, subscriber);
        };
        Subject.prototype._subscribe = function (subscriber) {
            this._throwIfClosed();
            this._checkFinalizedStatuses(subscriber);
            return this._innerSubscribe(subscriber);
        };
        Subject.prototype._innerSubscribe = function (subscriber) {
            var _this = this;
            var _a = this, hasError = _a.hasError, isStopped = _a.isStopped, observers = _a.observers;
            if (hasError || isStopped) {
                return EMPTY_SUBSCRIPTION;
            }
            this.currentObservers = null;
            observers.push(subscriber);
            return new Subscription(function () {
                _this.currentObservers = null;
                arrRemove(observers, subscriber);
            });
        };
        Subject.prototype._checkFinalizedStatuses = function (subscriber) {
            var _a = this, hasError = _a.hasError, thrownError = _a.thrownError, isStopped = _a.isStopped;
            if (hasError) {
                subscriber.error(thrownError);
            }
            else if (isStopped) {
                subscriber.complete();
            }
        };
        Subject.prototype.asObservable = function () {
            var observable = new Observable();
            observable.source = this;
            return observable;
        };
        Subject.create = function (destination, source) {
            return new AnonymousSubject(destination, source);
        };
        return Subject;
    }(Observable));
    var AnonymousSubject = (function (_super) {
        __extends(AnonymousSubject, _super);
        function AnonymousSubject(destination, source) {
            var _this = _super.call(this) || this;
            _this.destination = destination;
            _this.source = source;
            return _this;
        }
        AnonymousSubject.prototype.next = function (value) {
            var _a, _b;
            (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.next) === null || _b === void 0 ? void 0 : _b.call(_a, value);
        };
        AnonymousSubject.prototype.error = function (err) {
            var _a, _b;
            (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.error) === null || _b === void 0 ? void 0 : _b.call(_a, err);
        };
        AnonymousSubject.prototype.complete = function () {
            var _a, _b;
            (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.complete) === null || _b === void 0 ? void 0 : _b.call(_a);
        };
        AnonymousSubject.prototype._subscribe = function (subscriber) {
            var _a, _b;
            return (_b = (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber)) !== null && _b !== void 0 ? _b : EMPTY_SUBSCRIPTION;
        };
        return AnonymousSubject;
    }(Subject));

    var BehaviorSubject = (function (_super) {
        __extends(BehaviorSubject, _super);
        function BehaviorSubject(_value) {
            var _this = _super.call(this) || this;
            _this._value = _value;
            return _this;
        }
        Object.defineProperty(BehaviorSubject.prototype, "value", {
            get: function () {
                return this.getValue();
            },
            enumerable: false,
            configurable: true
        });
        BehaviorSubject.prototype._subscribe = function (subscriber) {
            var subscription = _super.prototype._subscribe.call(this, subscriber);
            !subscription.closed && subscriber.next(this._value);
            return subscription;
        };
        BehaviorSubject.prototype.getValue = function () {
            var _a = this, hasError = _a.hasError, thrownError = _a.thrownError, _value = _a._value;
            if (hasError) {
                throw thrownError;
            }
            this._throwIfClosed();
            return _value;
        };
        BehaviorSubject.prototype.next = function (value) {
            _super.prototype.next.call(this, (this._value = value));
        };
        return BehaviorSubject;
    }(Subject));

    var dateTimestampProvider = {
        now: function () {
            return (dateTimestampProvider.delegate || Date).now();
        },
        delegate: undefined,
    };

    var ReplaySubject = (function (_super) {
        __extends(ReplaySubject, _super);
        function ReplaySubject(_bufferSize, _windowTime, _timestampProvider) {
            if (_bufferSize === void 0) { _bufferSize = Infinity; }
            if (_windowTime === void 0) { _windowTime = Infinity; }
            if (_timestampProvider === void 0) { _timestampProvider = dateTimestampProvider; }
            var _this = _super.call(this) || this;
            _this._bufferSize = _bufferSize;
            _this._windowTime = _windowTime;
            _this._timestampProvider = _timestampProvider;
            _this._buffer = [];
            _this._infiniteTimeWindow = true;
            _this._infiniteTimeWindow = _windowTime === Infinity;
            _this._bufferSize = Math.max(1, _bufferSize);
            _this._windowTime = Math.max(1, _windowTime);
            return _this;
        }
        ReplaySubject.prototype.next = function (value) {
            var _a = this, isStopped = _a.isStopped, _buffer = _a._buffer, _infiniteTimeWindow = _a._infiniteTimeWindow, _timestampProvider = _a._timestampProvider, _windowTime = _a._windowTime;
            if (!isStopped) {
                _buffer.push(value);
                !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);
            }
            this._trimBuffer();
            _super.prototype.next.call(this, value);
        };
        ReplaySubject.prototype._subscribe = function (subscriber) {
            this._throwIfClosed();
            this._trimBuffer();
            var subscription = this._innerSubscribe(subscriber);
            var _a = this, _infiniteTimeWindow = _a._infiniteTimeWindow, _buffer = _a._buffer;
            var copy = _buffer.slice();
            for (var i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {
                subscriber.next(copy[i]);
            }
            this._checkFinalizedStatuses(subscriber);
            return subscription;
        };
        ReplaySubject.prototype._trimBuffer = function () {
            var _a = this, _bufferSize = _a._bufferSize, _timestampProvider = _a._timestampProvider, _buffer = _a._buffer, _infiniteTimeWindow = _a._infiniteTimeWindow;
            var adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;
            _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);
            if (!_infiniteTimeWindow) {
                var now = _timestampProvider.now();
                var last = 0;
                for (var i = 1; i < _buffer.length && _buffer[i] <= now; i += 2) {
                    last = i;
                }
                last && _buffer.splice(0, last + 1);
            }
        };
        return ReplaySubject;
    }(Subject));

    var AsyncSubject = (function (_super) {
        __extends(AsyncSubject, _super);
        function AsyncSubject() {
            var _this = _super !== null && _super.apply(this, arguments) || this;
            _this._value = null;
            _this._hasValue = false;
            _this._isComplete = false;
            return _this;
        }
        AsyncSubject.prototype._checkFinalizedStatuses = function (subscriber) {
            var _a = this, hasError = _a.hasError, _hasValue = _a._hasValue, _value = _a._value, thrownError = _a.thrownError, isStopped = _a.isStopped, _isComplete = _a._isComplete;
            if (hasError) {
                subscriber.error(thrownError);
            }
            else if (isStopped || _isComplete) {
                _hasValue && subscriber.next(_value);
                subscriber.complete();
            }
        };
        AsyncSubject.prototype.next = function (value) {
            if (!this.isStopped) {
                this._value = value;
                this._hasValue = true;
            }
        };
        AsyncSubject.prototype.complete = function () {
            var _a = this, _hasValue = _a._hasValue, _value = _a._value, _isComplete = _a._isComplete;
            if (!_isComplete) {
                this._isComplete = true;
                _hasValue && _super.prototype.next.call(this, _value);
                _super.prototype.complete.call(this);
            }
        };
        return AsyncSubject;
    }(Subject));

    var Action = (function (_super) {
        __extends(Action, _super);
        function Action(scheduler, work) {
            return _super.call(this) || this;
        }
        Action.prototype.schedule = function (state, delay) {
            if (delay === void 0) { delay = 0; }
            return this;
        };
        return Action;
    }(Subscription));

    var intervalProvider = {
        setInterval: function (handler, timeout) {
            var args = [];
            for (var _i = 2; _i < arguments.length; _i++) {
                args[_i - 2] = arguments[_i];
            }
            var delegate = intervalProvider.delegate;
            if (delegate === null || delegate === void 0 ? void 0 : delegate.setInterval) {
                return delegate.setInterval.apply(delegate, __spreadArray([handler, timeout], __read(args)));
            }
            return setInterval.apply(void 0, __spreadArray([handler, timeout], __read(args)));
        },
        clearInterval: function (handle) {
            var delegate = intervalProvider.delegate;
            return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearInterval) || clearInterval)(handle);
        },
        delegate: undefined,
    };

    var AsyncAction = (function (_super) {
        __extends(AsyncAction, _super);
        function AsyncAction(scheduler, work) {
            var _this = _super.call(this, scheduler, work) || this;
            _this.scheduler = scheduler;
            _this.work = work;
            _this.pending = false;
            return _this;
        }
        AsyncAction.prototype.schedule = function (state, delay) {
            if (delay === void 0) { delay = 0; }
            if (this.closed) {
                return this;
            }
            this.state = state;
            var id = this.id;
            var scheduler = this.scheduler;
            if (id != null) {
                this.id = this.recycleAsyncId(scheduler, id, delay);
            }
            this.pending = true;
            this.delay = delay;
            this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);
            return this;
        };
        AsyncAction.prototype.requestAsyncId = function (scheduler, _id, delay) {
            if (delay === void 0) { delay = 0; }
            return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);
        };
        AsyncAction.prototype.recycleAsyncId = function (_scheduler, id, delay) {
            if (delay === void 0) { delay = 0; }
            if (delay != null && this.delay === delay && this.pending === false) {
                return id;
            }
            intervalProvider.clearInterval(id);
            return undefined;
        };
        AsyncAction.prototype.execute = function (state, delay) {
            if (this.closed) {
                return new Error('executing a cancelled action');
            }
            this.pending = false;
            var error = this._execute(state, delay);
            if (error) {
                return error;
            }
            else if (this.pending === false && this.id != null) {
                this.id = this.recycleAsyncId(this.scheduler, this.id, null);
            }
        };
        AsyncAction.prototype._execute = function (state, _delay) {
            var errored = false;
            var errorValue;
            try {
                this.work(state);
            }
            catch (e) {
                errored = true;
                errorValue = e ? e : new Error('Scheduled action threw falsy error');
            }
            if (errored) {
                this.unsubscribe();
                return errorValue;
            }
        };
        AsyncAction.prototype.unsubscribe = function () {
            if (!this.closed) {
                var _a = this, id = _a.id, scheduler = _a.scheduler;
                var actions = scheduler.actions;
                this.work = this.state = this.scheduler = null;
                this.pending = false;
                arrRemove(actions, this);
                if (id != null) {
                    this.id = this.recycleAsyncId(scheduler, id, null);
                }
                this.delay = null;
                _super.prototype.unsubscribe.call(this);
            }
        };
        return AsyncAction;
    }(Action));

    var nextHandle = 1;
    var resolved;
    var activeHandles = {};
    function findAndClearHandle(handle) {
        if (handle in activeHandles) {
            delete activeHandles[handle];
            return true;
        }
        return false;
    }
    var Immediate = {
        setImmediate: function (cb) {
            var handle = nextHandle++;
            activeHandles[handle] = true;
            if (!resolved) {
                resolved = Promise.resolve();
            }
            resolved.then(function () { return findAndClearHandle(handle) && cb(); });
            return handle;
        },
        clearImmediate: function (handle) {
            findAndClearHandle(handle);
        },
    };

    var setImmediate = Immediate.setImmediate, clearImmediate = Immediate.clearImmediate;
    var immediateProvider = {
        setImmediate: function () {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            var delegate = immediateProvider.delegate;
            return ((delegate === null || delegate === void 0 ? void 0 : delegate.setImmediate) || setImmediate).apply(void 0, __spreadArray([], __read(args)));
        },
        clearImmediate: function (handle) {
            var delegate = immediateProvider.delegate;
            return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearImmediate) || clearImmediate)(handle);
        },
        delegate: undefined,
    };

    var AsapAction = (function (_super) {
        __extends(AsapAction, _super);
        function AsapAction(scheduler, work) {
            var _this = _super.call(this, scheduler, work) || this;
            _this.scheduler = scheduler;
            _this.work = work;
            return _this;
        }
        AsapAction.prototype.requestAsyncId = function (scheduler, id, delay) {
            if (delay === void 0) { delay = 0; }
            if (delay !== null && delay > 0) {
                return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
            }
            scheduler.actions.push(this);
            return scheduler._scheduled || (scheduler._scheduled = immediateProvider.setImmediate(scheduler.flush.bind(scheduler, undefined)));
        };
        AsapAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
            if (delay === void 0) { delay = 0; }
            if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {
                return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);
            }
            if (!scheduler.actions.some(function (action) { return action.id === id; })) {
                immediateProvider.clearImmediate(id);
                scheduler._scheduled = undefined;
            }
            return undefined;
        };
        return AsapAction;
    }(AsyncAction));

    var Scheduler = (function () {
        function Scheduler(schedulerActionCtor, now) {
            if (now === void 0) { now = Scheduler.now; }
            this.schedulerActionCtor = schedulerActionCtor;
            this.now = now;
        }
        Scheduler.prototype.schedule = function (work, delay, state) {
            if (delay === void 0) { delay = 0; }
            return new this.schedulerActionCtor(this, work).schedule(state, delay);
        };
        Scheduler.now = dateTimestampProvider.now;
        return Scheduler;
    }());

    var AsyncScheduler = (function (_super) {
        __extends(AsyncScheduler, _super);
        function AsyncScheduler(SchedulerAction, now) {
            if (now === void 0) { now = Scheduler.now; }
            var _this = _super.call(this, SchedulerAction, now) || this;
            _this.actions = [];
            _this._active = false;
            _this._scheduled = undefined;
            return _this;
        }
        AsyncScheduler.prototype.flush = function (action) {
            var actions = this.actions;
            if (this._active) {
                actions.push(action);
                return;
            }
            var error;
            this._active = true;
            do {
                if ((error = action.execute(action.state, action.delay))) {
                    break;
                }
            } while ((action = actions.shift()));
            this._active = false;
            if (error) {
                while ((action = actions.shift())) {
                    action.unsubscribe();
                }
                throw error;
            }
        };
        return AsyncScheduler;
    }(Scheduler));

    var AsapScheduler = (function (_super) {
        __extends(AsapScheduler, _super);
        function AsapScheduler() {
            return _super !== null && _super.apply(this, arguments) || this;
        }
        AsapScheduler.prototype.flush = function (action) {
            this._active = true;
            var flushId = this._scheduled;
            this._scheduled = undefined;
            var actions = this.actions;
            var error;
            action = action || actions.shift();
            do {
                if ((error = action.execute(action.state, action.delay))) {
                    break;
                }
            } while ((action = actions[0]) && action.id === flushId && actions.shift());
            this._active = false;
            if (error) {
                while ((action = actions[0]) && action.id === flushId && actions.shift()) {
                    action.unsubscribe();
                }
                throw error;
            }
        };
        return AsapScheduler;
    }(AsyncScheduler));

    var asapScheduler = new AsapScheduler(AsapAction);
    var asap = asapScheduler;

    var asyncScheduler = new AsyncScheduler(AsyncAction);
    var async = asyncScheduler;

    var QueueAction = (function (_super) {
        __extends(QueueAction, _super);
        function QueueAction(scheduler, work) {
            var _this = _super.call(this, scheduler, work) || this;
            _this.scheduler = scheduler;
            _this.work = work;
            return _this;
        }
        QueueAction.prototype.schedule = function (state, delay) {
            if (delay === void 0) { delay = 0; }
            if (delay > 0) {
                return _super.prototype.schedule.call(this, state, delay);
            }
            this.delay = delay;
            this.state = state;
            this.scheduler.flush(this);
            return this;
        };
        QueueAction.prototype.execute = function (state, delay) {
            return (delay > 0 || this.closed) ?
                _super.prototype.execute.call(this, state, delay) :
                this._execute(state, delay);
        };
        QueueAction.prototype.requestAsyncId = function (scheduler, id, delay) {
            if (delay === void 0) { delay = 0; }
            if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {
                return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
            }
            return scheduler.flush(this);
        };
        return QueueAction;
    }(AsyncAction));

    var QueueScheduler = (function (_super) {
        __extends(QueueScheduler, _super);
        function QueueScheduler() {
            return _super !== null && _super.apply(this, arguments) || this;
        }
        return QueueScheduler;
    }(AsyncScheduler));

    var queueScheduler = new QueueScheduler(QueueAction);
    var queue = queueScheduler;

    var AnimationFrameAction = (function (_super) {
        __extends(AnimationFrameAction, _super);
        function AnimationFrameAction(scheduler, work) {
            var _this = _super.call(this, scheduler, work) || this;
            _this.scheduler = scheduler;
            _this.work = work;
            return _this;
        }
        AnimationFrameAction.prototype.requestAsyncId = function (scheduler, id, delay) {
            if (delay === void 0) { delay = 0; }
            if (delay !== null && delay > 0) {
                return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
            }
            scheduler.actions.push(this);
            return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(function () { return scheduler.flush(undefined); }));
        };
        AnimationFrameAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
            if (delay === void 0) { delay = 0; }
            if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {
                return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);
            }
            if (!scheduler.actions.some(function (action) { return action.id === id; })) {
                animationFrameProvider.cancelAnimationFrame(id);
                scheduler._scheduled = undefined;
            }
            return undefined;
        };
        return AnimationFrameAction;
    }(AsyncAction));

    var AnimationFrameScheduler = (function (_super) {
        __extends(AnimationFrameScheduler, _super);
        function AnimationFrameScheduler() {
            return _super !== null && _super.apply(this, arguments) || this;
        }
        AnimationFrameScheduler.prototype.flush = function (action) {
            this._active = true;
            var flushId = this._scheduled;
            this._scheduled = undefined;
            var actions = this.actions;
            var error;
            action = action || actions.shift();
            do {
                if ((error = action.execute(action.state, action.delay))) {
                    break;
                }
            } while ((action = actions[0]) && action.id === flushId && actions.shift());
            this._active = false;
            if (error) {
                while ((action = actions[0]) && action.id === flushId && actions.shift()) {
                    action.unsubscribe();
                }
                throw error;
            }
        };
        return AnimationFrameScheduler;
    }(AsyncScheduler));

    var animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);
    var animationFrame = animationFrameScheduler;

    var VirtualTimeScheduler = (function (_super) {
        __extends(VirtualTimeScheduler, _super);
        function VirtualTimeScheduler(schedulerActionCtor, maxFrames) {
            if (schedulerActionCtor === void 0) { schedulerActionCtor = VirtualAction; }
            if (maxFrames === void 0) { maxFrames = Infinity; }
            var _this = _super.call(this, schedulerActionCtor, function () { return _this.frame; }) || this;
            _this.maxFrames = maxFrames;
            _this.frame = 0;
            _this.index = -1;
            return _this;
        }
        VirtualTimeScheduler.prototype.flush = function () {
            var _a = this, actions = _a.actions, maxFrames = _a.maxFrames;
            var error;
            var action;
            while ((action = actions[0]) && action.delay <= maxFrames) {
                actions.shift();
                this.frame = action.delay;
                if ((error = action.execute(action.state, action.delay))) {
                    break;
                }
            }
            if (error) {
                while ((action = actions.shift())) {
                    action.unsubscribe();
                }
                throw error;
            }
        };
        VirtualTimeScheduler.frameTimeFactor = 10;
        return VirtualTimeScheduler;
    }(AsyncScheduler));
    var VirtualAction = (function (_super) {
        __extends(VirtualAction, _super);
        function VirtualAction(scheduler, work, index) {
            if (index === void 0) { index = (scheduler.index += 1); }
            var _this = _super.call(this, scheduler, work) || this;
            _this.scheduler = scheduler;
            _this.work = work;
            _this.index = index;
            _this.active = true;
            _this.index = scheduler.index = index;
            return _this;
        }
        VirtualAction.prototype.schedule = function (state, delay) {
            if (delay === void 0) { delay = 0; }
            if (Number.isFinite(delay)) {
                if (!this.id) {
                    return _super.prototype.schedule.call(this, state, delay);
                }
                this.active = false;
                var action = new VirtualAction(this.scheduler, this.work);
                this.add(action);
                return action.schedule(state, delay);
            }
            else {
                return Subscription.EMPTY;
            }
        };
        VirtualAction.prototype.requestAsyncId = function (scheduler, id, delay) {
            if (delay === void 0) { delay = 0; }
            this.delay = scheduler.frame + delay;
            var actions = scheduler.actions;
            actions.push(this);
            actions.sort(VirtualAction.sortActions);
            return true;
        };
        VirtualAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
            if (delay === void 0) { delay = 0; }
            return undefined;
        };
        VirtualAction.prototype._execute = function (state, delay) {
            if (this.active === true) {
                return _super.prototype._execute.call(this, state, delay);
            }
        };
        VirtualAction.sortActions = function (a, b) {
            if (a.delay === b.delay) {
                if (a.index === b.index) {
                    return 0;
                }
                else if (a.index > b.index) {
                    return 1;
                }
                else {
                    return -1;
                }
            }
            else if (a.delay > b.delay) {
                return 1;
            }
            else {
                return -1;
            }
        };
        return VirtualAction;
    }(AsyncAction));

    var EMPTY = new Observable(function (subscriber) { return subscriber.complete(); });
    function empty(scheduler) {
        return scheduler ? emptyScheduled(scheduler) : EMPTY;
    }
    function emptyScheduled(scheduler) {
        return new Observable(function (subscriber) { return scheduler.schedule(function () { return subscriber.complete(); }); });
    }

    function isScheduler(value) {
        return value && isFunction(value.schedule);
    }

    function last(arr) {
        return arr[arr.length - 1];
    }
    function popResultSelector(args) {
        return isFunction(last(args)) ? args.pop() : undefined;
    }
    function popScheduler(args) {
        return isScheduler(last(args)) ? args.pop() : undefined;
    }
    function popNumber(args, defaultValue) {
        return typeof last(args) === 'number' ? args.pop() : defaultValue;
    }

    var isArrayLike = (function (x) { return x && typeof x.length === 'number' && typeof x !== 'function'; });

    function isPromise(value) {
        return isFunction(value === null || value === void 0 ? void 0 : value.then);
    }

    function isInteropObservable(input) {
        return isFunction(input[observable]);
    }

    function isAsyncIterable(obj) {
        return Symbol.asyncIterator && isFunction(obj === null || obj === void 0 ? void 0 : obj[Symbol.asyncIterator]);
    }

    function createInvalidObservableTypeError(input) {
        return new TypeError("You provided " + (input !== null && typeof input === 'object' ? 'an invalid object' : "'" + input + "'") + " where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.");
    }

    function getSymbolIterator() {
        if (typeof Symbol !== 'function' || !Symbol.iterator) {
            return '@@iterator';
        }
        return Symbol.iterator;
    }
    var iterator = getSymbolIterator();

    function isIterable(input) {
        return isFunction(input === null || input === void 0 ? void 0 : input[iterator]);
    }

    function readableStreamLikeToAsyncGenerator(readableStream) {
        return __asyncGenerator(this, arguments, function readableStreamLikeToAsyncGenerator_1() {
            var reader, _a, value, done;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        reader = readableStream.getReader();
                        _b.label = 1;
                    case 1:
                        _b.trys.push([1, , 9, 10]);
                        _b.label = 2;
                    case 2:
                        return [4, __await(reader.read())];
                    case 3:
                        _a = _b.sent(), value = _a.value, done = _a.done;
                        if (!done) return [3, 5];
                        return [4, __await(void 0)];
                    case 4: return [2, _b.sent()];
                    case 5: return [4, __await(value)];
                    case 6: return [4, _b.sent()];
                    case 7:
                        _b.sent();
                        return [3, 2];
                    case 8: return [3, 10];
                    case 9:
                        reader.releaseLock();
                        return [7];
                    case 10: return [2];
                }
            });
        });
    }
    function isReadableStreamLike(obj) {
        return isFunction(obj === null || obj === void 0 ? void 0 : obj.getReader);
    }

    function innerFrom(input) {
        if (input instanceof Observable) {
            return input;
        }
        if (input != null) {
            if (isInteropObservable(input)) {
                return fromInteropObservable(input);
            }
            if (isArrayLike(input)) {
                return fromArrayLike(input);
            }
            if (isPromise(input)) {
                return fromPromise(input);
            }
            if (isAsyncIterable(input)) {
                return fromAsyncIterable(input);
            }
            if (isIterable(input)) {
                return fromIterable(input);
            }
            if (isReadableStreamLike(input)) {
                return fromReadableStreamLike(input);
            }
        }
        throw createInvalidObservableTypeError(input);
    }
    function fromInteropObservable(obj) {
        return new Observable(function (subscriber) {
            var obs = obj[observable]();
            if (isFunction(obs.subscribe)) {
                return obs.subscribe(subscriber);
            }
            throw new TypeError('Provided object does not correctly implement Symbol.observable');
        });
    }
    function fromArrayLike(array) {
        return new Observable(function (subscriber) {
            for (var i = 0; i < array.length && !subscriber.closed; i++) {
                subscriber.next(array[i]);
            }
            subscriber.complete();
        });
    }
    function fromPromise(promise) {
        return new Observable(function (subscriber) {
            promise
                .then(function (value) {
                if (!subscriber.closed) {
                    subscriber.next(value);
                    subscriber.complete();
                }
            }, function (err) { return subscriber.error(err); })
                .then(null, reportUnhandledError);
        });
    }
    function fromIterable(iterable) {
        return new Observable(function (subscriber) {
            var e_1, _a;
            try {
                for (var iterable_1 = __values(iterable), iterable_1_1 = iterable_1.next(); !iterable_1_1.done; iterable_1_1 = iterable_1.next()) {
                    var value = iterable_1_1.value;
                    subscriber.next(value);
                    if (subscriber.closed) {
                        return;
                    }
                }
            }
            catch (e_1_1) { e_1 = { error: e_1_1 }; }
            finally {
                try {
                    if (iterable_1_1 && !iterable_1_1.done && (_a = iterable_1.return)) _a.call(iterable_1);
                }
                finally { if (e_1) throw e_1.error; }
            }
            subscriber.complete();
        });
    }
    function fromAsyncIterable(asyncIterable) {
        return new Observable(function (subscriber) {
            process(asyncIterable, subscriber).catch(function (err) { return subscriber.error(err); });
        });
    }
    function fromReadableStreamLike(readableStream) {
        return fromAsyncIterable(readableStreamLikeToAsyncGenerator(readableStream));
    }
    function process(asyncIterable, subscriber) {
        var asyncIterable_1, asyncIterable_1_1;
        var e_2, _a;
        return __awaiter(this, void 0, void 0, function () {
            var value, e_2_1;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        _b.trys.push([0, 5, 6, 11]);
                        asyncIterable_1 = __asyncValues(asyncIterable);
                        _b.label = 1;
                    case 1: return [4, asyncIterable_1.next()];
                    case 2:
                        if (!(asyncIterable_1_1 = _b.sent(), !asyncIterable_1_1.done)) return [3, 4];
                        value = asyncIterable_1_1.value;
                        subscriber.next(value);
                        if (subscriber.closed) {
                            return [2];
                        }
                        _b.label = 3;
                    case 3: return [3, 1];
                    case 4: return [3, 11];
                    case 5:
                        e_2_1 = _b.sent();
                        e_2 = { error: e_2_1 };
                        return [3, 11];
                    case 6:
                        _b.trys.push([6, , 9, 10]);
                        if (!(asyncIterable_1_1 && !asyncIterable_1_1.done && (_a = asyncIterable_1.return))) return [3, 8];
                        return [4, _a.call(asyncIterable_1)];
                    case 7:
                        _b.sent();
                        _b.label = 8;
                    case 8: return [3, 10];
                    case 9:
                        if (e_2) throw e_2.error;
                        return [7];
                    case 10: return [7];
                    case 11:
                        subscriber.complete();
                        return [2];
                }
            });
        });
    }

    function executeSchedule(parentSubscription, scheduler, work, delay, repeat) {
        if (delay === void 0) { delay = 0; }
        if (repeat === void 0) { repeat = false; }
        var scheduleSubscription = scheduler.schedule(function () {
            work();
            if (repeat) {
                parentSubscription.add(this.schedule(null, delay));
            }
            else {
                this.unsubscribe();
            }
        }, delay);
        parentSubscription.add(scheduleSubscription);
        if (!repeat) {
            return scheduleSubscription;
        }
    }

    function observeOn(scheduler, delay) {
        if (delay === void 0) { delay = 0; }
        return operate(function (source, subscriber) {
            source.subscribe(createOperatorSubscriber(subscriber, function (value) { return executeSchedule(subscriber, scheduler, function () { return subscriber.next(value); }, delay); }, function () { return executeSchedule(subscriber, scheduler, function () { return subscriber.complete(); }, delay); }, function (err) { return executeSchedule(subscriber, scheduler, function () { return subscriber.error(err); }, delay); }));
        });
    }

    function subscribeOn(scheduler, delay) {
        if (delay === void 0) { delay = 0; }
        return operate(function (source, subscriber) {
            subscriber.add(scheduler.schedule(function () { return source.subscribe(subscriber); }, delay));
        });
    }

    function scheduleObservable(input, scheduler) {
        return innerFrom(input).pipe(subscribeOn(scheduler), observeOn(scheduler));
    }

    function schedulePromise(input, scheduler) {
        return innerFrom(input).pipe(subscribeOn(scheduler), observeOn(scheduler));
    }

    function scheduleArray(input, scheduler) {
        return new Observable(function (subscriber) {
            var i = 0;
            return scheduler.schedule(function () {
                if (i === input.length) {
                    subscriber.complete();
                }
                else {
                    subscriber.next(input[i++]);
                    if (!subscriber.closed) {
                        this.schedule();
                    }
                }
            });
        });
    }

    function scheduleIterable(input, scheduler) {
        return new Observable(function (subscriber) {
            var iterator$$1;
            executeSchedule(subscriber, scheduler, function () {
                iterator$$1 = input[iterator]();
                executeSchedule(subscriber, scheduler, function () {
                    var _a;
                    var value;
                    var done;
                    try {
                        (_a = iterator$$1.next(), value = _a.value, done = _a.done);
                    }
                    catch (err) {
                        subscriber.error(err);
                        return;
                    }
                    if (done) {
                        subscriber.complete();
                    }
                    else {
                        subscriber.next(value);
                    }
                }, 0, true);
            });
            return function () { return isFunction(iterator$$1 === null || iterator$$1 === void 0 ? void 0 : iterator$$1.return) && iterator$$1.return(); };
        });
    }

    function scheduleAsyncIterable(input, scheduler) {
        if (!input) {
            throw new Error('Iterable cannot be null');
        }
        return new Observable(function (subscriber) {
            executeSchedule(subscriber, scheduler, function () {
                var iterator = input[Symbol.asyncIterator]();
                executeSchedule(subscriber, scheduler, function () {
                    iterator.next().then(function (result) {
                        if (result.done) {
                            subscriber.complete();
                        }
                        else {
                            subscriber.next(result.value);
                        }
                    });
                }, 0, true);
            });
        });
    }

    function scheduleReadableStreamLike(input, scheduler) {
        return scheduleAsyncIterable(readableStreamLikeToAsyncGenerator(input), scheduler);
    }

    function scheduled(input, scheduler) {
        if (input != null) {
            if (isInteropObservable(input)) {
                return scheduleObservable(input, scheduler);
            }
            if (isArrayLike(input)) {
                return scheduleArray(input, scheduler);
            }
            if (isPromise(input)) {
                return schedulePromise(input, scheduler);
            }
            if (isAsyncIterable(input)) {
                return scheduleAsyncIterable(input, scheduler);
            }
            if (isIterable(input)) {
                return scheduleIterable(input, scheduler);
            }
            if (isReadableStreamLike(input)) {
                return scheduleReadableStreamLike(input, scheduler);
            }
        }
        throw createInvalidObservableTypeError(input);
    }

    function from(input, scheduler) {
        return scheduler ? scheduled(input, scheduler) : innerFrom(input);
    }

    function of() {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        var scheduler = popScheduler(args);
        return from(args, scheduler);
    }

    function throwError(errorOrErrorFactory, scheduler) {
        var errorFactory = isFunction(errorOrErrorFactory) ? errorOrErrorFactory : function () { return errorOrErrorFactory; };
        var init = function (subscriber) { return subscriber.error(errorFactory()); };
        return new Observable(scheduler ? function (subscriber) { return scheduler.schedule(init, 0, subscriber); } : init);
    }

    (function (NotificationKind) {
        NotificationKind["NEXT"] = "N";
        NotificationKind["ERROR"] = "E";
        NotificationKind["COMPLETE"] = "C";
    })(exports.NotificationKind || (exports.NotificationKind = {}));
    var Notification = (function () {
        function Notification(kind, value, error) {
            this.kind = kind;
            this.value = value;
            this.error = error;
            this.hasValue = kind === 'N';
        }
        Notification.prototype.observe = function (observer) {
            return observeNotification(this, observer);
        };
        Notification.prototype.do = function (nextHandler, errorHandler, completeHandler) {
            var _a = this, kind = _a.kind, value = _a.value, error = _a.error;
            return kind === 'N' ? nextHandler === null || nextHandler === void 0 ? void 0 : nextHandler(value) : kind === 'E' ? errorHandler === null || errorHandler === void 0 ? void 0 : errorHandler(error) : completeHandler === null || completeHandler === void 0 ? void 0 : completeHandler();
        };
        Notification.prototype.accept = function (nextOrObserver, error, complete) {
            var _a;
            return isFunction((_a = nextOrObserver) === null || _a === void 0 ? void 0 : _a.next)
                ? this.observe(nextOrObserver)
                : this.do(nextOrObserver, error, complete);
        };
        Notification.prototype.toObservable = function () {
            var _a = this, kind = _a.kind, value = _a.value, error = _a.error;
            var result = kind === 'N'
                ?
                    of(value)
                :
                    kind === 'E'
                        ?
                            throwError(function () { return error; })
                        :
                            kind === 'C'
                                ?
                                    EMPTY
                                :
                                    0;
            if (!result) {
                throw new TypeError("Unexpected notification kind " + kind);
            }
            return result;
        };
        Notification.createNext = function (value) {
            return new Notification('N', value);
        };
        Notification.createError = function (err) {
            return new Notification('E', undefined, err);
        };
        Notification.createComplete = function () {
            return Notification.completeNotification;
        };
        Notification.completeNotification = new Notification('C');
        return Notification;
    }());
    function observeNotification(notification, observer) {
        var _a, _b, _c;
        var _d = notification, kind = _d.kind, value = _d.value, error = _d.error;
        if (typeof kind !== 'string') {
            throw new TypeError('Invalid notification, missing "kind"');
        }
        kind === 'N' ? (_a = observer.next) === null || _a === void 0 ? void 0 : _a.call(observer, value) : kind === 'E' ? (_b = observer.error) === null || _b === void 0 ? void 0 : _b.call(observer, error) : (_c = observer.complete) === null || _c === void 0 ? void 0 : _c.call(observer);
    }

    function isObservable(obj) {
        return !!obj && (obj instanceof Observable || (isFunction(obj.lift) && isFunction(obj.subscribe)));
    }

    var EmptyError = createErrorClass(function (_super) { return function EmptyErrorImpl() {
        _super(this);
        this.name = 'EmptyError';
        this.message = 'no elements in sequence';
    }; });

    function lastValueFrom(source, config) {
        var hasConfig = typeof config === 'object';
        return new Promise(function (resolve, reject) {
            var _hasValue = false;
            var _value;
            source.subscribe({
                next: function (value) {
                    _value = value;
                    _hasValue = true;
                },
                error: reject,
                complete: function () {
                    if (_hasValue) {
                        resolve(_value);
                    }
                    else if (hasConfig) {
                        resolve(config.defaultValue);
                    }
                    else {
                        reject(new EmptyError());
                    }
                },
            });
        });
    }

    function firstValueFrom(source, config) {
        var hasConfig = typeof config === 'object';
        return new Promise(function (resolve, reject) {
            var subscriber = new SafeSubscriber({
                next: function (value) {
                    resolve(value);
                    subscriber.unsubscribe();
                },
                error: reject,
                complete: function () {
                    if (hasConfig) {
                        resolve(config.defaultValue);
                    }
                    else {
                        reject(new EmptyError());
                    }
                },
            });
            source.subscribe(subscriber);
        });
    }

    var ArgumentOutOfRangeError = createErrorClass(function (_super) {
        return function ArgumentOutOfRangeErrorImpl() {
            _super(this);
            this.name = 'ArgumentOutOfRangeError';
            this.message = 'argument out of range';
        };
    });

    var NotFoundError = createErrorClass(function (_super) {
        return function NotFoundErrorImpl(message) {
            _super(this);
            this.name = 'NotFoundError';
            this.message = message;
        };
    });

    var SequenceError = createErrorClass(function (_super) {
        return function SequenceErrorImpl(message) {
            _super(this);
            this.name = 'SequenceError';
            this.message = message;
        };
    });

    function isValidDate(value) {
        return value instanceof Date && !isNaN(value);
    }

    var TimeoutError = createErrorClass(function (_super) {
        return function TimeoutErrorImpl(info) {
            if (info === void 0) { info = null; }
            _super(this);
            this.message = 'Timeout has occurred';
            this.name = 'TimeoutError';
            this.info = info;
        };
    });
    function timeout(config, schedulerArg) {
        var _a = (isValidDate(config) ? { first: config } : typeof config === 'number' ? { each: config } : config), first = _a.first, each = _a.each, _b = _a.with, _with = _b === void 0 ? timeoutErrorFactory : _b, _c = _a.scheduler, scheduler = _c === void 0 ? schedulerArg !== null && schedulerArg !== void 0 ? schedulerArg : asyncScheduler : _c, _d = _a.meta, meta = _d === void 0 ? null : _d;
        if (first == null && each == null) {
            throw new TypeError('No timeout provided.');
        }
        return operate(function (source, subscriber) {
            var originalSourceSubscription;
            var timerSubscription;
            var lastValue = null;
            var seen = 0;
            var startTimer = function (delay) {
                timerSubscription = executeSchedule(subscriber, scheduler, function () {
                    try {
                        originalSourceSubscription.unsubscribe();
                        innerFrom(_with({
                            meta: meta,
                            lastValue: lastValue,
                            seen: seen,
                        })).subscribe(subscriber);
                    }
                    catch (err) {
                        subscriber.error(err);
                    }
                }, delay);
            };
            originalSourceSubscription = source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                timerSubscription === null || timerSubscription === void 0 ? void 0 : timerSubscription.unsubscribe();
                seen++;
                subscriber.next((lastValue = value));
                each > 0 && startTimer(each);
            }, undefined, undefined, function () {
                if (!(timerSubscription === null || timerSubscription === void 0 ? void 0 : timerSubscription.closed)) {
                    timerSubscription === null || timerSubscription === void 0 ? void 0 : timerSubscription.unsubscribe();
                }
                lastValue = null;
            }));
            !seen && startTimer(first != null ? (typeof first === 'number' ? first : +first - scheduler.now()) : each);
        });
    }
    function timeoutErrorFactory(info) {
        throw new TimeoutError(info);
    }

    function map(project, thisArg) {
        return operate(function (source, subscriber) {
            var index = 0;
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                subscriber.next(project.call(thisArg, value, index++));
            }));
        });
    }

    var isArray = Array.isArray;
    function callOrApply(fn, args) {
        return isArray(args) ? fn.apply(void 0, __spreadArray([], __read(args))) : fn(args);
    }
    function mapOneOrManyArgs(fn) {
        return map(function (args) { return callOrApply(fn, args); });
    }

    function bindCallbackInternals(isNodeStyle, callbackFunc, resultSelector, scheduler) {
        if (resultSelector) {
            if (isScheduler(resultSelector)) {
                scheduler = resultSelector;
            }
            else {
                return function () {
                    var args = [];
                    for (var _i = 0; _i < arguments.length; _i++) {
                        args[_i] = arguments[_i];
                    }
                    return bindCallbackInternals(isNodeStyle, callbackFunc, scheduler)
                        .apply(this, args)
                        .pipe(mapOneOrManyArgs(resultSelector));
                };
            }
        }
        if (scheduler) {
            return function () {
                var args = [];
                for (var _i = 0; _i < arguments.length; _i++) {
                    args[_i] = arguments[_i];
                }
                return bindCallbackInternals(isNodeStyle, callbackFunc)
                    .apply(this, args)
                    .pipe(subscribeOn(scheduler), observeOn(scheduler));
            };
        }
        return function () {
            var _this = this;
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
            }
            var subject = new AsyncSubject();
            var uninitialized = true;
            return new Observable(function (subscriber) {
                var subs = subject.subscribe(subscriber);
                if (uninitialized) {
                    uninitialized = false;
                    var isAsync_1 = false;
                    var isComplete_1 = false;
                    callbackFunc.apply(_this, __spreadArray(__spreadArray([], __read(args)), [
                        function () {
                            var results = [];
                            for (var _i = 0; _i < arguments.length; _i++) {
                                results[_i] = arguments[_i];
                            }
                            if (isNodeStyle) {
                                var err = results.shift();
                                if (err != null) {
                                    subject.error(err);
                                    return;
                                }
                            }
                            subject.next(1 < results.length ? results : results[0]);
                            isComplete_1 = true;
                            if (isAsync_1) {
                                subject.complete();
                            }
                        },
                    ]));
                    if (isComplete_1) {
                        subject.complete();
                    }
                    isAsync_1 = true;
                }
                return subs;
            });
        };
    }

    function bindCallback(callbackFunc, resultSelector, scheduler) {
        return bindCallbackInternals(false, callbackFunc, resultSelector, scheduler);
    }

    function bindNodeCallback(callbackFunc, resultSelector, scheduler) {
        return bindCallbackInternals(true, callbackFunc, resultSelector, scheduler);
    }

    var isArray$1 = Array.isArray;
    var getPrototypeOf = Object.getPrototypeOf, objectProto = Object.prototype, getKeys = Object.keys;
    function argsArgArrayOrObject(args) {
        if (args.length === 1) {
            var first_1 = args[0];
            if (isArray$1(first_1)) {
                return { args: first_1, keys: null };
            }
            if (isPOJO(first_1)) {
                var keys = getKeys(first_1);
                return {
                    args: keys.map(function (key) { return first_1[key]; }),
                    keys: keys,
                };
            }
        }
        return { args: args, keys: null };
    }
    function isPOJO(obj) {
        return obj && typeof obj === 'object' && getPrototypeOf(obj) === objectProto;
    }

    function createObject(keys, values) {
        return keys.reduce(function (result, key, i) { return ((result[key] = values[i]), result); }, {});
    }

    function combineLatest() {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        var scheduler = popScheduler(args);
        var resultSelector = popResultSelector(args);
        var _a = argsArgArrayOrObject(args), observables = _a.args, keys = _a.keys;
        if (observables.length === 0) {
            return from([], scheduler);
        }
        var result = new Observable(combineLatestInit(observables, scheduler, keys
            ?
                function (values) { return createObject(keys, values); }
            :
                identity));
        return resultSelector ? result.pipe(mapOneOrManyArgs(resultSelector)) : result;
    }
    function combineLatestInit(observables, scheduler, valueTransform) {
        if (valueTransform === void 0) { valueTransform = identity; }
        return function (subscriber) {
            maybeSchedule(scheduler, function () {
                var length = observables.length;
                var values = new Array(length);
                var active = length;
                var remainingFirstValues = length;
                var _loop_1 = function (i) {
                    maybeSchedule(scheduler, function () {
                        var source = from(observables[i], scheduler);
                        var hasFirstValue = false;
                        source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                            values[i] = value;
                            if (!hasFirstValue) {
                                hasFirstValue = true;
                                remainingFirstValues--;
                            }
                            if (!remainingFirstValues) {
                                subscriber.next(valueTransform(values.slice()));
                            }
                        }, function () {
                            if (!--active) {
                                subscriber.complete();
                            }
                        }));
                    }, subscriber);
                };
                for (var i = 0; i < length; i++) {
                    _loop_1(i);
                }
            }, subscriber);
        };
    }
    function maybeSchedule(scheduler, execute, subscription) {
        if (scheduler) {
            executeSchedule(subscription, scheduler, execute);
        }
        else {
            execute();
        }
    }

    function mergeInternals(source, subscriber, project, concurrent, onBeforeNext, expand, innerSubScheduler, additionalFinalizer) {
        var buffer = [];
        var active = 0;
        var index = 0;
        var isComplete = false;
        var checkComplete = function () {
            if (isComplete && !buffer.length && !active) {
                subscriber.complete();
            }
        };
        var outerNext = function (value) { return (active < concurrent ? doInnerSub(value) : buffer.push(value)); };
        var doInnerSub = function (value) {
            expand && subscriber.next(value);
            active++;
            var innerComplete = false;
            innerFrom(project(value, index++)).subscribe(createOperatorSubscriber(subscriber, function (innerValue) {
                onBeforeNext === null || onBeforeNext === void 0 ? void 0 : onBeforeNext(innerValue);
                if (expand) {
                    outerNext(innerValue);
                }
                else {
                    subscriber.next(innerValue);
                }
            }, function () {
                innerComplete = true;
            }, undefined, function () {
                if (innerComplete) {
                    try {
                        active--;
                        var _loop_1 = function () {
                            var bufferedValue = buffer.shift();
                            if (innerSubScheduler) {
                                executeSchedule(subscriber, innerSubScheduler, function () { return doInnerSub(bufferedValue); });
                            }
                            else {
                                doInnerSub(bufferedValue);
                            }
                        };
                        while (buffer.length && active < concurrent) {
                            _loop_1();
                        }
                        checkComplete();
                    }
                    catch (err) {
                        subscriber.error(err);
                    }
                }
            }));
        };
        source.subscribe(createOperatorSubscriber(subscriber, outerNext, function () {
            isComplete = true;
            checkComplete();
        }));
        return function () {
            additionalFinalizer === null || additionalFinalizer === void 0 ? void 0 : additionalFinalizer();
        };
    }

    function mergeMap(project, resultSelector, concurrent) {
        if (concurrent === void 0) { concurrent = Infinity; }
        if (isFunction(resultSelector)) {
            return mergeMap(function (a, i) { return map(function (b, ii) { return resultSelector(a, b, i, ii); })(innerFrom(project(a, i))); }, concurrent);
        }
        else if (typeof resultSelector === 'number') {
            concurrent = resultSelector;
        }
        return operate(function (source, subscriber) { return mergeInternals(source, subscriber, project, concurrent); });
    }

    function mergeAll(concurrent) {
        if (concurrent === void 0) { concurrent = Infinity; }
        return mergeMap(identity, concurrent);
    }

    function concatAll() {
        return mergeAll(1);
    }

    function concat() {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        return concatAll()(from(args, popScheduler(args)));
    }

    function defer(observableFactory) {
        return new Observable(function (subscriber) {
            innerFrom(observableFactory()).subscribe(subscriber);
        });
    }

    var DEFAULT_CONFIG = {
        connector: function () { return new Subject(); },
        resetOnDisconnect: true,
    };
    function connectable(source, config) {
        if (config === void 0) { config = DEFAULT_CONFIG; }
        var connection = null;
        var connector = config.connector, _a = config.resetOnDisconnect, resetOnDisconnect = _a === void 0 ? true : _a;
        var subject = connector();
        var result = new Observable(function (subscriber) {
            return subject.subscribe(subscriber);
        });
        result.connect = function () {
            if (!connection || connection.closed) {
                connection = defer(function () { return source; }).subscribe(subject);
                if (resetOnDisconnect) {
                    connection.add(function () { return (subject = connector()); });
                }
            }
            return connection;
        };
        return result;
    }

    function forkJoin() {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        var resultSelector = popResultSelector(args);
        var _a = argsArgArrayOrObject(args), sources = _a.args, keys = _a.keys;
        var result = new Observable(function (subscriber) {
            var length = sources.length;
            if (!length) {
                subscriber.complete();
                return;
            }
            var values = new Array(length);
            var remainingCompletions = length;
            var remainingEmissions = length;
            var _loop_1 = function (sourceIndex) {
                var hasValue = false;
                innerFrom(sources[sourceIndex]).subscribe(createOperatorSubscriber(subscriber, function (value) {
                    if (!hasValue) {
                        hasValue = true;
                        remainingEmissions--;
                    }
                    values[sourceIndex] = value;
                }, function () { return remainingCompletions--; }, undefined, function () {
                    if (!remainingCompletions || !hasValue) {
                        if (!remainingEmissions) {
                            subscriber.next(keys ? createObject(keys, values) : values);
                        }
                        subscriber.complete();
                    }
                }));
            };
            for (var sourceIndex = 0; sourceIndex < length; sourceIndex++) {
                _loop_1(sourceIndex);
            }
        });
        return resultSelector ? result.pipe(mapOneOrManyArgs(resultSelector)) : result;
    }

    var nodeEventEmitterMethods = ['addListener', 'removeListener'];
    var eventTargetMethods = ['addEventListener', 'removeEventListener'];
    var jqueryMethods = ['on', 'off'];
    function fromEvent(target, eventName, options, resultSelector) {
        if (isFunction(options)) {
            resultSelector = options;
            options = undefined;
        }
        if (resultSelector) {
            return fromEvent(target, eventName, options).pipe(mapOneOrManyArgs(resultSelector));
        }
        var _a = __read(isEventTarget(target)
            ? eventTargetMethods.map(function (methodName) { return function (handler) { return target[methodName](eventName, handler, options); }; })
            :
                isNodeStyleEventEmitter(target)
                    ? nodeEventEmitterMethods.map(toCommonHandlerRegistry(target, eventName))
                    : isJQueryStyleEventEmitter(target)
                        ? jqueryMethods.map(toCommonHandlerRegistry(target, eventName))
                        : [], 2), add = _a[0], remove = _a[1];
        if (!add) {
            if (isArrayLike(target)) {
                return mergeMap(function (subTarget) { return fromEvent(subTarget, eventName, options); })(innerFrom(target));
            }
        }
        if (!add) {
            throw new TypeError('Invalid event target');
        }
        return new Observable(function (subscriber) {
            var handler = function () {
                var args = [];
                for (var _i = 0; _i < arguments.length; _i++) {
                    args[_i] = arguments[_i];
                }
                return subscriber.next(1 < args.length ? args : args[0]);
            };
            add(handler);
            return function () { return remove(handler); };
        });
    }
    function toCommonHandlerRegistry(target, eventName) {
        return function (methodName) { return function (handler) { return target[methodName](eventName, handler); }; };
    }
    function isNodeStyleEventEmitter(target) {
        return isFunction(target.addListener) && isFunction(target.removeListener);
    }
    function isJQueryStyleEventEmitter(target) {
        return isFunction(target.on) && isFunction(target.off);
    }
    function isEventTarget(target) {
        return isFunction(target.addEventListener) && isFunction(target.removeEventListener);
    }

    function fromEventPattern(addHandler, removeHandler, resultSelector) {
        if (resultSelector) {
            return fromEventPattern(addHandler, removeHandler).pipe(mapOneOrManyArgs(resultSelector));
        }
        return new Observable(function (subscriber) {
            var handler = function () {
                var e = [];
                for (var _i = 0; _i < arguments.length; _i++) {
                    e[_i] = arguments[_i];
                }
                return subscriber.next(e.length === 1 ? e[0] : e);
            };
            var retValue = addHandler(handler);
            return isFunction(removeHandler) ? function () { return removeHandler(handler, retValue); } : undefined;
        });
    }

    function generate(initialStateOrOptions, condition, iterate, resultSelectorOrScheduler, scheduler) {
        var _a, _b;
        var resultSelector;
        var initialState;
        if (arguments.length === 1) {
            (_a = initialStateOrOptions, initialState = _a.initialState, condition = _a.condition, iterate = _a.iterate, _b = _a.resultSelector, resultSelector = _b === void 0 ? identity : _b, scheduler = _a.scheduler);
        }
        else {
            initialState = initialStateOrOptions;
            if (!resultSelectorOrScheduler || isScheduler(resultSelectorOrScheduler)) {
                resultSelector = identity;
                scheduler = resultSelectorOrScheduler;
            }
            else {
                resultSelector = resultSelectorOrScheduler;
            }
        }
        function gen() {
            var state;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        state = initialState;
                        _a.label = 1;
                    case 1:
                        if (!(!condition || condition(state))) return [3, 4];
                        return [4, resultSelector(state)];
                    case 2:
                        _a.sent();
                        _a.label = 3;
                    case 3:
                        state = iterate(state);
                        return [3, 1];
                    case 4: return [2];
                }
            });
        }
        return defer((scheduler
            ?
                function () { return scheduleIterable(gen(), scheduler); }
            :
                gen));
    }

    function iif(condition, trueResult, falseResult) {
        return defer(function () { return (condition() ? trueResult : falseResult); });
    }

    function timer(dueTime, intervalOrScheduler, scheduler) {
        if (dueTime === void 0) { dueTime = 0; }
        if (scheduler === void 0) { scheduler = async; }
        var intervalDuration = -1;
        if (intervalOrScheduler != null) {
            if (isScheduler(intervalOrScheduler)) {
                scheduler = intervalOrScheduler;
            }
            else {
                intervalDuration = intervalOrScheduler;
            }
        }
        return new Observable(function (subscriber) {
            var due = isValidDate(dueTime) ? +dueTime - scheduler.now() : dueTime;
            if (due < 0) {
                due = 0;
            }
            var n = 0;
            return scheduler.schedule(function () {
                if (!subscriber.closed) {
                    subscriber.next(n++);
                    if (0 <= intervalDuration) {
                        this.schedule(undefined, intervalDuration);
                    }
                    else {
                        subscriber.complete();
                    }
                }
            }, due);
        });
    }

    function interval(period, scheduler) {
        if (period === void 0) { period = 0; }
        if (scheduler === void 0) { scheduler = asyncScheduler; }
        if (period < 0) {
            period = 0;
        }
        return timer(period, period, scheduler);
    }

    function merge() {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        var scheduler = popScheduler(args);
        var concurrent = popNumber(args, Infinity);
        var sources = args;
        return !sources.length
            ?
                EMPTY
            : sources.length === 1
                ?
                    innerFrom(sources[0])
                :
                    mergeAll(concurrent)(from(sources, scheduler));
    }

    var NEVER = new Observable(noop);
    function never() {
        return NEVER;
    }

    var isArray$2 = Array.isArray;
    function argsOrArgArray(args) {
        return args.length === 1 && isArray$2(args[0]) ? args[0] : args;
    }

    function onErrorResumeNext() {
        var sources = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            sources[_i] = arguments[_i];
        }
        var nextSources = argsOrArgArray(sources);
        return operate(function (source, subscriber) {
            var remaining = __spreadArray([source], __read(nextSources));
            var subscribeNext = function () {
                if (!subscriber.closed) {
                    if (remaining.length > 0) {
                        var nextSource = void 0;
                        try {
                            nextSource = innerFrom(remaining.shift());
                        }
                        catch (err) {
                            subscribeNext();
                            return;
                        }
                        var innerSub = createOperatorSubscriber(subscriber, undefined, noop, noop);
                        nextSource.subscribe(innerSub);
                        innerSub.add(subscribeNext);
                    }
                    else {
                        subscriber.complete();
                    }
                }
            };
            subscribeNext();
        });
    }

    function onErrorResumeNext$1() {
        var sources = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            sources[_i] = arguments[_i];
        }
        return onErrorResumeNext(argsOrArgArray(sources))(EMPTY);
    }

    function pairs(obj, scheduler) {
        return from(Object.entries(obj), scheduler);
    }

    function not(pred, thisArg) {
        return function (value, index) { return !pred.call(thisArg, value, index); };
    }

    function filter(predicate, thisArg) {
        return operate(function (source, subscriber) {
            var index = 0;
            source.subscribe(createOperatorSubscriber(subscriber, function (value) { return predicate.call(thisArg, value, index++) && subscriber.next(value); }));
        });
    }

    function partition(source, predicate, thisArg) {
        return [filter(predicate, thisArg)(innerFrom(source)), filter(not(predicate, thisArg))(innerFrom(source))];
    }

    function race() {
        var sources = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            sources[_i] = arguments[_i];
        }
        sources = argsOrArgArray(sources);
        return sources.length === 1 ? innerFrom(sources[0]) : new Observable(raceInit(sources));
    }
    function raceInit(sources) {
        return function (subscriber) {
            var subscriptions = [];
            var _loop_1 = function (i) {
                subscriptions.push(innerFrom(sources[i]).subscribe(createOperatorSubscriber(subscriber, function (value) {
                    if (subscriptions) {
                        for (var s = 0; s < subscriptions.length; s++) {
                            s !== i && subscriptions[s].unsubscribe();
                        }
                        subscriptions = null;
                    }
                    subscriber.next(value);
                })));
            };
            for (var i = 0; subscriptions && !subscriber.closed && i < sources.length; i++) {
                _loop_1(i);
            }
        };
    }

    function range(start, count, scheduler) {
        if (count == null) {
            count = start;
            start = 0;
        }
        if (count <= 0) {
            return EMPTY;
        }
        var end = count + start;
        return new Observable(scheduler
            ?
                function (subscriber) {
                    var n = start;
                    return scheduler.schedule(function () {
                        if (n < end) {
                            subscriber.next(n++);
                            this.schedule();
                        }
                        else {
                            subscriber.complete();
                        }
                    });
                }
            :
                function (subscriber) {
                    var n = start;
                    while (n < end && !subscriber.closed) {
                        subscriber.next(n++);
                    }
                    subscriber.complete();
                });
    }

    function using(resourceFactory, observableFactory) {
        return new Observable(function (subscriber) {
            var resource = resourceFactory();
            var result = observableFactory(resource);
            var source = result ? innerFrom(result) : EMPTY;
            source.subscribe(subscriber);
            return function () {
                if (resource) {
                    resource.unsubscribe();
                }
            };
        });
    }

    function zip() {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        var resultSelector = popResultSelector(args);
        var sources = argsOrArgArray(args);
        return sources.length
            ? new Observable(function (subscriber) {
                var buffers = sources.map(function () { return []; });
                var completed = sources.map(function () { return false; });
                subscriber.add(function () {
                    buffers = completed = null;
                });
                var _loop_1 = function (sourceIndex) {
                    innerFrom(sources[sourceIndex]).subscribe(createOperatorSubscriber(subscriber, function (value) {
                        buffers[sourceIndex].push(value);
                        if (buffers.every(function (buffer) { return buffer.length; })) {
                            var result = buffers.map(function (buffer) { return buffer.shift(); });
                            subscriber.next(resultSelector ? resultSelector.apply(void 0, __spreadArray([], __read(result))) : result);
                            if (buffers.some(function (buffer, i) { return !buffer.length && completed[i]; })) {
                                subscriber.complete();
                            }
                        }
                    }, function () {
                        completed[sourceIndex] = true;
                        !buffers[sourceIndex].length && subscriber.complete();
                    }));
                };
                for (var sourceIndex = 0; !subscriber.closed && sourceIndex < sources.length; sourceIndex++) {
                    _loop_1(sourceIndex);
                }
                return function () {
                    buffers = completed = null;
                };
            })
            : EMPTY;
    }

    function audit(durationSelector) {
        return operate(function (source, subscriber) {
            var hasValue = false;
            var lastValue = null;
            var durationSubscriber = null;
            var isComplete = false;
            var endDuration = function () {
                durationSubscriber === null || durationSubscriber === void 0 ? void 0 : durationSubscriber.unsubscribe();
                durationSubscriber = null;
                if (hasValue) {
                    hasValue = false;
                    var value = lastValue;
                    lastValue = null;
                    subscriber.next(value);
                }
                isComplete && subscriber.complete();
            };
            var cleanupDuration = function () {
                durationSubscriber = null;
                isComplete && subscriber.complete();
            };
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                hasValue = true;
                lastValue = value;
                if (!durationSubscriber) {
                    innerFrom(durationSelector(value)).subscribe((durationSubscriber = createOperatorSubscriber(subscriber, endDuration, cleanupDuration)));
                }
            }, function () {
                isComplete = true;
                (!hasValue || !durationSubscriber || durationSubscriber.closed) && subscriber.complete();
            }));
        });
    }

    function auditTime(duration, scheduler) {
        if (scheduler === void 0) { scheduler = asyncScheduler; }
        return audit(function () { return timer(duration, scheduler); });
    }

    function buffer(closingNotifier) {
        return operate(function (source, subscriber) {
            var currentBuffer = [];
            source.subscribe(createOperatorSubscriber(subscriber, function (value) { return currentBuffer.push(value); }, function () {
                subscriber.next(currentBuffer);
                subscriber.complete();
            }));
            closingNotifier.subscribe(createOperatorSubscriber(subscriber, function () {
                var b = currentBuffer;
                currentBuffer = [];
                subscriber.next(b);
            }, noop));
            return function () {
                currentBuffer = null;
            };
        });
    }

    function bufferCount(bufferSize, startBufferEvery) {
        if (startBufferEvery === void 0) { startBufferEvery = null; }
        startBufferEvery = startBufferEvery !== null && startBufferEvery !== void 0 ? startBufferEvery : bufferSize;
        return operate(function (source, subscriber) {
            var buffers = [];
            var count = 0;
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                var e_1, _a, e_2, _b;
                var toEmit = null;
                if (count++ % startBufferEvery === 0) {
                    buffers.push([]);
                }
                try {
                    for (var buffers_1 = __values(buffers), buffers_1_1 = buffers_1.next(); !buffers_1_1.done; buffers_1_1 = buffers_1.next()) {
                        var buffer = buffers_1_1.value;
                        buffer.push(value);
                        if (bufferSize <= buffer.length) {
                            toEmit = toEmit !== null && toEmit !== void 0 ? toEmit : [];
                            toEmit.push(buffer);
                        }
                    }
                }
                catch (e_1_1) { e_1 = { error: e_1_1 }; }
                finally {
                    try {
                        if (buffers_1_1 && !buffers_1_1.done && (_a = buffers_1.return)) _a.call(buffers_1);
                    }
                    finally { if (e_1) throw e_1.error; }
                }
                if (toEmit) {
                    try {
                        for (var toEmit_1 = __values(toEmit), toEmit_1_1 = toEmit_1.next(); !toEmit_1_1.done; toEmit_1_1 = toEmit_1.next()) {
                            var buffer = toEmit_1_1.value;
                            arrRemove(buffers, buffer);
                            subscriber.next(buffer);
                        }
                    }
                    catch (e_2_1) { e_2 = { error: e_2_1 }; }
                    finally {
                        try {
                            if (toEmit_1_1 && !toEmit_1_1.done && (_b = toEmit_1.return)) _b.call(toEmit_1);
                        }
                        finally { if (e_2) throw e_2.error; }
                    }
                }
            }, function () {
                var e_3, _a;
                try {
                    for (var buffers_2 = __values(buffers), buffers_2_1 = buffers_2.next(); !buffers_2_1.done; buffers_2_1 = buffers_2.next()) {
                        var buffer = buffers_2_1.value;
                        subscriber.next(buffer);
                    }
                }
                catch (e_3_1) { e_3 = { error: e_3_1 }; }
                finally {
                    try {
                        if (buffers_2_1 && !buffers_2_1.done && (_a = buffers_2.return)) _a.call(buffers_2);
                    }
                    finally { if (e_3) throw e_3.error; }
                }
                subscriber.complete();
            }, undefined, function () {
                buffers = null;
            }));
        });
    }

    function bufferTime(bufferTimeSpan) {
        var _a, _b;
        var otherArgs = [];
        for (var _i = 1; _i < arguments.length; _i++) {
            otherArgs[_i - 1] = arguments[_i];
        }
        var scheduler = (_a = popScheduler(otherArgs)) !== null && _a !== void 0 ? _a : asyncScheduler;
        var bufferCreationInterval = (_b = otherArgs[0]) !== null && _b !== void 0 ? _b : null;
        var maxBufferSize = otherArgs[1] || Infinity;
        return operate(function (source, subscriber) {
            var bufferRecords = [];
            var restartOnEmit = false;
            var emit = function (record) {
                var buffer = record.buffer, subs = record.subs;
                subs.unsubscribe();
                arrRemove(bufferRecords, record);
                subscriber.next(buffer);
                restartOnEmit && startBuffer();
            };
            var startBuffer = function () {
                if (bufferRecords) {
                    var subs = new Subscription();
                    subscriber.add(subs);
                    var buffer = [];
                    var record_1 = {
                        buffer: buffer,
                        subs: subs,
                    };
                    bufferRecords.push(record_1);
                    executeSchedule(subs, scheduler, function () { return emit(record_1); }, bufferTimeSpan);
                }
            };
            if (bufferCreationInterval !== null && bufferCreationInterval >= 0) {
                executeSchedule(subscriber, scheduler, startBuffer, bufferCreationInterval, true);
            }
            else {
                restartOnEmit = true;
            }
            startBuffer();
            var bufferTimeSubscriber = createOperatorSubscriber(subscriber, function (value) {
                var e_1, _a;
                var recordsCopy = bufferRecords.slice();
                try {
                    for (var recordsCopy_1 = __values(recordsCopy), recordsCopy_1_1 = recordsCopy_1.next(); !recordsCopy_1_1.done; recordsCopy_1_1 = recordsCopy_1.next()) {
                        var record = recordsCopy_1_1.value;
                        var buffer = record.buffer;
                        buffer.push(value);
                        maxBufferSize <= buffer.length && emit(record);
                    }
                }
                catch (e_1_1) { e_1 = { error: e_1_1 }; }
                finally {
                    try {
                        if (recordsCopy_1_1 && !recordsCopy_1_1.done && (_a = recordsCopy_1.return)) _a.call(recordsCopy_1);
                    }
                    finally { if (e_1) throw e_1.error; }
                }
            }, function () {
                while (bufferRecords === null || bufferRecords === void 0 ? void 0 : bufferRecords.length) {
                    subscriber.next(bufferRecords.shift().buffer);
                }
                bufferTimeSubscriber === null || bufferTimeSubscriber === void 0 ? void 0 : bufferTimeSubscriber.unsubscribe();
                subscriber.complete();
                subscriber.unsubscribe();
            }, undefined, function () { return (bufferRecords = null); });
            source.subscribe(bufferTimeSubscriber);
        });
    }

    function bufferToggle(openings, closingSelector) {
        return operate(function (source, subscriber) {
            var buffers = [];
            innerFrom(openings).subscribe(createOperatorSubscriber(subscriber, function (openValue) {
                var buffer = [];
                buffers.push(buffer);
                var closingSubscription = new Subscription();
                var emitBuffer = function () {
                    arrRemove(buffers, buffer);
                    subscriber.next(buffer);
                    closingSubscription.unsubscribe();
                };
                closingSubscription.add(innerFrom(closingSelector(openValue)).subscribe(createOperatorSubscriber(subscriber, emitBuffer, noop)));
            }, noop));
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                var e_1, _a;
                try {
                    for (var buffers_1 = __values(buffers), buffers_1_1 = buffers_1.next(); !buffers_1_1.done; buffers_1_1 = buffers_1.next()) {
                        var buffer = buffers_1_1.value;
                        buffer.push(value);
                    }
                }
                catch (e_1_1) { e_1 = { error: e_1_1 }; }
                finally {
                    try {
                        if (buffers_1_1 && !buffers_1_1.done && (_a = buffers_1.return)) _a.call(buffers_1);
                    }
                    finally { if (e_1) throw e_1.error; }
                }
            }, function () {
                while (buffers.length > 0) {
                    subscriber.next(buffers.shift());
                }
                subscriber.complete();
            }));
        });
    }

    function bufferWhen(closingSelector) {
        return operate(function (source, subscriber) {
            var buffer = null;
            var closingSubscriber = null;
            var openBuffer = function () {
                closingSubscriber === null || closingSubscriber === void 0 ? void 0 : closingSubscriber.unsubscribe();
                var b = buffer;
                buffer = [];
                b && subscriber.next(b);
                innerFrom(closingSelector()).subscribe((closingSubscriber = createOperatorSubscriber(subscriber, openBuffer, noop)));
            };
            openBuffer();
            source.subscribe(createOperatorSubscriber(subscriber, function (value) { return buffer === null || buffer === void 0 ? void 0 : buffer.push(value); }, function () {
                buffer && subscriber.next(buffer);
                subscriber.complete();
            }, undefined, function () { return (buffer = closingSubscriber = null); }));
        });
    }

    function catchError(selector) {
        return operate(function (source, subscriber) {
            var innerSub = null;
            var syncUnsub = false;
            var handledResult;
            innerSub = source.subscribe(createOperatorSubscriber(subscriber, undefined, undefined, function (err) {
                handledResult = innerFrom(selector(err, catchError(selector)(source)));
                if (innerSub) {
                    innerSub.unsubscribe();
                    innerSub = null;
                    handledResult.subscribe(subscriber);
                }
                else {
                    syncUnsub = true;
                }
            }));
            if (syncUnsub) {
                innerSub.unsubscribe();
                innerSub = null;
                handledResult.subscribe(subscriber);
            }
        });
    }

    function scanInternals(accumulator, seed, hasSeed, emitOnNext, emitBeforeComplete) {
        return function (source, subscriber) {
            var hasState = hasSeed;
            var state = seed;
            var index = 0;
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                var i = index++;
                state = hasState
                    ?
                        accumulator(state, value, i)
                    :
                        ((hasState = true), value);
                emitOnNext && subscriber.next(state);
            }, emitBeforeComplete &&
                (function () {
                    hasState && subscriber.next(state);
                    subscriber.complete();
                })));
        };
    }

    function reduce(accumulator, seed) {
        return operate(scanInternals(accumulator, seed, arguments.length >= 2, false, true));
    }

    var arrReducer = function (arr, value) { return (arr.push(value), arr); };
    function toArray() {
        return operate(function (source, subscriber) {
            reduce(arrReducer, [])(source).subscribe(subscriber);
        });
    }

    function joinAllInternals(joinFn, project) {
        return pipe(toArray(), mergeMap(function (sources) { return joinFn(sources); }), project ? mapOneOrManyArgs(project) : identity);
    }

    function combineLatestAll(project) {
        return joinAllInternals(combineLatest, project);
    }

    var combineAll = combineLatestAll;

    function combineLatest$1() {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        var resultSelector = popResultSelector(args);
        return resultSelector
            ? pipe(combineLatest$1.apply(void 0, __spreadArray([], __read(args))), mapOneOrManyArgs(resultSelector))
            : operate(function (source, subscriber) {
                combineLatestInit(__spreadArray([source], __read(argsOrArgArray(args))))(subscriber);
            });
    }

    function combineLatestWith() {
        var otherSources = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            otherSources[_i] = arguments[_i];
        }
        return combineLatest$1.apply(void 0, __spreadArray([], __read(otherSources)));
    }

    function concatMap(project, resultSelector) {
        return isFunction(resultSelector) ? mergeMap(project, resultSelector, 1) : mergeMap(project, 1);
    }

    function concatMapTo(innerObservable, resultSelector) {
        return isFunction(resultSelector) ? concatMap(function () { return innerObservable; }, resultSelector) : concatMap(function () { return innerObservable; });
    }

    function concat$1() {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        var scheduler = popScheduler(args);
        return operate(function (source, subscriber) {
            concatAll()(from(__spreadArray([source], __read(args)), scheduler)).subscribe(subscriber);
        });
    }

    function concatWith() {
        var otherSources = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            otherSources[_i] = arguments[_i];
        }
        return concat$1.apply(void 0, __spreadArray([], __read(otherSources)));
    }

    function fromSubscribable(subscribable) {
        return new Observable(function (subscriber) { return subscribable.subscribe(subscriber); });
    }

    var DEFAULT_CONFIG$1 = {
        connector: function () { return new Subject(); },
    };
    function connect(selector, config) {
        if (config === void 0) { config = DEFAULT_CONFIG$1; }
        var connector = config.connector;
        return operate(function (source, subscriber) {
            var subject = connector();
            innerFrom(selector(fromSubscribable(subject))).subscribe(subscriber);
            subscriber.add(source.subscribe(subject));
        });
    }

    function count(predicate) {
        return reduce(function (total, value, i) { return (!predicate || predicate(value, i) ? total + 1 : total); }, 0);
    }

    function debounce(durationSelector) {
        return operate(function (source, subscriber) {
            var hasValue = false;
            var lastValue = null;
            var durationSubscriber = null;
            var emit = function () {
                durationSubscriber === null || durationSubscriber === void 0 ? void 0 : durationSubscriber.unsubscribe();
                durationSubscriber = null;
                if (hasValue) {
                    hasValue = false;
                    var value = lastValue;
                    lastValue = null;
                    subscriber.next(value);
                }
            };
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                durationSubscriber === null || durationSubscriber === void 0 ? void 0 : durationSubscriber.unsubscribe();
                hasValue = true;
                lastValue = value;
                durationSubscriber = createOperatorSubscriber(subscriber, emit, noop);
                innerFrom(durationSelector(value)).subscribe(durationSubscriber);
            }, function () {
                emit();
                subscriber.complete();
            }, undefined, function () {
                lastValue = durationSubscriber = null;
            }));
        });
    }

    function debounceTime(dueTime, scheduler) {
        if (scheduler === void 0) { scheduler = asyncScheduler; }
        return operate(function (source, subscriber) {
            var activeTask = null;
            var lastValue = null;
            var lastTime = null;
            var emit = function () {
                if (activeTask) {
                    activeTask.unsubscribe();
                    activeTask = null;
                    var value = lastValue;
                    lastValue = null;
                    subscriber.next(value);
                }
            };
            function emitWhenIdle() {
                var targetTime = lastTime + dueTime;
                var now = scheduler.now();
                if (now < targetTime) {
                    activeTask = this.schedule(undefined, targetTime - now);
                    subscriber.add(activeTask);
                    return;
                }
                emit();
            }
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                lastValue = value;
                lastTime = scheduler.now();
                if (!activeTask) {
                    activeTask = scheduler.schedule(emitWhenIdle, dueTime);
                    subscriber.add(activeTask);
                }
            }, function () {
                emit();
                subscriber.complete();
            }, undefined, function () {
                lastValue = activeTask = null;
            }));
        });
    }

    function defaultIfEmpty(defaultValue) {
        return operate(function (source, subscriber) {
            var hasValue = false;
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                hasValue = true;
                subscriber.next(value);
            }, function () {
                if (!hasValue) {
                    subscriber.next(defaultValue);
                }
                subscriber.complete();
            }));
        });
    }

    function take(count) {
        return count <= 0
            ?
                function () { return EMPTY; }
            : operate(function (source, subscriber) {
                var seen = 0;
                source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                    if (++seen <= count) {
                        subscriber.next(value);
                        if (count <= seen) {
                            subscriber.complete();
                        }
                    }
                }));
            });
    }

    function ignoreElements() {
        return operate(function (source, subscriber) {
            source.subscribe(createOperatorSubscriber(subscriber, noop));
        });
    }

    function mapTo(value) {
        return map(function () { return value; });
    }

    function delayWhen(delayDurationSelector, subscriptionDelay) {
        if (subscriptionDelay) {
            return function (source) {
                return concat(subscriptionDelay.pipe(take(1), ignoreElements()), source.pipe(delayWhen(delayDurationSelector)));
            };
        }
        return mergeMap(function (value, index) { return delayDurationSelector(value, index).pipe(take(1), mapTo(value)); });
    }

    function delay(due, scheduler) {
        if (scheduler === void 0) { scheduler = asyncScheduler; }
        var duration = timer(due, scheduler);
        return delayWhen(function () { return duration; });
    }

    function dematerialize() {
        return operate(function (source, subscriber) {
            source.subscribe(createOperatorSubscriber(subscriber, function (notification) { return observeNotification(notification, subscriber); }));
        });
    }

    function distinct(keySelector, flushes) {
        return operate(function (source, subscriber) {
            var distinctKeys = new Set();
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                var key = keySelector ? keySelector(value) : value;
                if (!distinctKeys.has(key)) {
                    distinctKeys.add(key);
                    subscriber.next(value);
                }
            }));
            flushes === null || flushes === void 0 ? void 0 : flushes.subscribe(createOperatorSubscriber(subscriber, function () { return distinctKeys.clear(); }, noop));
        });
    }

    function distinctUntilChanged(comparator, keySelector) {
        if (keySelector === void 0) { keySelector = identity; }
        comparator = comparator !== null && comparator !== void 0 ? comparator : defaultCompare;
        return operate(function (source, subscriber) {
            var previousKey;
            var first = true;
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                var currentKey = keySelector(value);
                if (first || !comparator(previousKey, currentKey)) {
                    first = false;
                    previousKey = currentKey;
                    subscriber.next(value);
                }
            }));
        });
    }
    function defaultCompare(a, b) {
        return a === b;
    }

    function distinctUntilKeyChanged(key, compare) {
        return distinctUntilChanged(function (x, y) { return compare ? compare(x[key], y[key]) : x[key] === y[key]; });
    }

    function throwIfEmpty(errorFactory) {
        if (errorFactory === void 0) { errorFactory = defaultErrorFactory; }
        return operate(function (source, subscriber) {
            var hasValue = false;
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                hasValue = true;
                subscriber.next(value);
            }, function () { return (hasValue ? subscriber.complete() : subscriber.error(errorFactory())); }));
        });
    }
    function defaultErrorFactory() {
        return new EmptyError();
    }

    function elementAt(index, defaultValue) {
        if (index < 0) {
            throw new ArgumentOutOfRangeError();
        }
        var hasDefaultValue = arguments.length >= 2;
        return function (source) {
            return source.pipe(filter(function (v, i) { return i === index; }), take(1), hasDefaultValue ? defaultIfEmpty(defaultValue) : throwIfEmpty(function () { return new ArgumentOutOfRangeError(); }));
        };
    }

    function endWith() {
        var values = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            values[_i] = arguments[_i];
        }
        return function (source) { return concat(source, of.apply(void 0, __spreadArray([], __read(values)))); };
    }

    function every(predicate, thisArg) {
        return operate(function (source, subscriber) {
            var index = 0;
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                if (!predicate.call(thisArg, value, index++, source)) {
                    subscriber.next(false);
                    subscriber.complete();
                }
            }, function () {
                subscriber.next(true);
                subscriber.complete();
            }));
        });
    }

    function exhaustMap(project, resultSelector) {
        if (resultSelector) {
            return function (source) {
                return source.pipe(exhaustMap(function (a, i) { return innerFrom(project(a, i)).pipe(map(function (b, ii) { return resultSelector(a, b, i, ii); })); }));
            };
        }
        return operate(function (source, subscriber) {
            var index = 0;
            var innerSub = null;
            var isComplete = false;
            source.subscribe(createOperatorSubscriber(subscriber, function (outerValue) {
                if (!innerSub) {
                    innerSub = createOperatorSubscriber(subscriber, undefined, function () {
                        innerSub = null;
                        isComplete && subscriber.complete();
                    });
                    innerFrom(project(outerValue, index++)).subscribe(innerSub);
                }
            }, function () {
                isComplete = true;
                !innerSub && subscriber.complete();
            }));
        });
    }

    function exhaustAll() {
        return exhaustMap(identity);
    }

    var exhaust = exhaustAll;

    function expand(project, concurrent, scheduler) {
        if (concurrent === void 0) { concurrent = Infinity; }
        concurrent = (concurrent || 0) < 1 ? Infinity : concurrent;
        return operate(function (source, subscriber) {
            return mergeInternals(source, subscriber, project, concurrent, undefined, true, scheduler);
        });
    }

    function finalize(callback) {
        return operate(function (source, subscriber) {
            try {
                source.subscribe(subscriber);
            }
            finally {
                subscriber.add(callback);
            }
        });
    }

    function find(predicate, thisArg) {
        return operate(createFind(predicate, thisArg, 'value'));
    }
    function createFind(predicate, thisArg, emit) {
        var findIndex = emit === 'index';
        return function (source, subscriber) {
            var index = 0;
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                var i = index++;
                if (predicate.call(thisArg, value, i, source)) {
                    subscriber.next(findIndex ? i : value);
                    subscriber.complete();
                }
            }, function () {
                subscriber.next(findIndex ? -1 : undefined);
                subscriber.complete();
            }));
        };
    }

    function findIndex(predicate, thisArg) {
        return operate(createFind(predicate, thisArg, 'index'));
    }

    function first(predicate, defaultValue) {
        var hasDefaultValue = arguments.length >= 2;
        return function (source) {
            return source.pipe(predicate ? filter(function (v, i) { return predicate(v, i, source); }) : identity, take(1), hasDefaultValue ? defaultIfEmpty(defaultValue) : throwIfEmpty(function () { return new EmptyError(); }));
        };
    }

    function groupBy(keySelector, elementOrOptions, duration, connector) {
        return operate(function (source, subscriber) {
            var element;
            if (!elementOrOptions || typeof elementOrOptions === 'function') {
                element = elementOrOptions;
            }
            else {
                (duration = elementOrOptions.duration, element = elementOrOptions.element, connector = elementOrOptions.connector);
            }
            var groups = new Map();
            var notify = function (cb) {
                groups.forEach(cb);
                cb(subscriber);
            };
            var handleError = function (err) { return notify(function (consumer) { return consumer.error(err); }); };
            var activeGroups = 0;
            var teardownAttempted = false;
            var groupBySourceSubscriber = new OperatorSubscriber(subscriber, function (value) {
                try {
                    var key_1 = keySelector(value);
                    var group_1 = groups.get(key_1);
                    if (!group_1) {
                        groups.set(key_1, (group_1 = connector ? connector() : new Subject()));
                        var grouped = createGroupedObservable(key_1, group_1);
                        subscriber.next(grouped);
                        if (duration) {
                            var durationSubscriber_1 = createOperatorSubscriber(group_1, function () {
                                group_1.complete();
                                durationSubscriber_1 === null || durationSubscriber_1 === void 0 ? void 0 : durationSubscriber_1.unsubscribe();
                            }, undefined, undefined, function () { return groups.delete(key_1); });
                            groupBySourceSubscriber.add(innerFrom(duration(grouped)).subscribe(durationSubscriber_1));
                        }
                    }
                    group_1.next(element ? element(value) : value);
                }
                catch (err) {
                    handleError(err);
                }
            }, function () { return notify(function (consumer) { return consumer.complete(); }); }, handleError, function () { return groups.clear(); }, function () {
                teardownAttempted = true;
                return activeGroups === 0;
            });
            source.subscribe(groupBySourceSubscriber);
            function createGroupedObservable(key, groupSubject) {
                var result = new Observable(function (groupSubscriber) {
                    activeGroups++;
                    var innerSub = groupSubject.subscribe(groupSubscriber);
                    return function () {
                        innerSub.unsubscribe();
                        --activeGroups === 0 && teardownAttempted && groupBySourceSubscriber.unsubscribe();
                    };
                });
                result.key = key;
                return result;
            }
        });
    }

    function isEmpty() {
        return operate(function (source, subscriber) {
            source.subscribe(createOperatorSubscriber(subscriber, function () {
                subscriber.next(false);
                subscriber.complete();
            }, function () {
                subscriber.next(true);
                subscriber.complete();
            }));
        });
    }

    function takeLast(count) {
        return count <= 0
            ? function () { return EMPTY; }
            : operate(function (source, subscriber) {
                var buffer = [];
                source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                    buffer.push(value);
                    count < buffer.length && buffer.shift();
                }, function () {
                    var e_1, _a;
                    try {
                        for (var buffer_1 = __values(buffer), buffer_1_1 = buffer_1.next(); !buffer_1_1.done; buffer_1_1 = buffer_1.next()) {
                            var value = buffer_1_1.value;
                            subscriber.next(value);
                        }
                    }
                    catch (e_1_1) { e_1 = { error: e_1_1 }; }
                    finally {
                        try {
                            if (buffer_1_1 && !buffer_1_1.done && (_a = buffer_1.return)) _a.call(buffer_1);
                        }
                        finally { if (e_1) throw e_1.error; }
                    }
                    subscriber.complete();
                }, undefined, function () {
                    buffer = null;
                }));
            });
    }

    function last$1(predicate, defaultValue) {
        var hasDefaultValue = arguments.length >= 2;
        return function (source) {
            return source.pipe(predicate ? filter(function (v, i) { return predicate(v, i, source); }) : identity, takeLast(1), hasDefaultValue ? defaultIfEmpty(defaultValue) : throwIfEmpty(function () { return new EmptyError(); }));
        };
    }

    function materialize() {
        return operate(function (source, subscriber) {
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                subscriber.next(Notification.createNext(value));
            }, function () {
                subscriber.next(Notification.createComplete());
                subscriber.complete();
            }, function (err) {
                subscriber.next(Notification.createError(err));
                subscriber.complete();
            }));
        });
    }

    function max(comparer) {
        return reduce(isFunction(comparer) ? function (x, y) { return (comparer(x, y) > 0 ? x : y); } : function (x, y) { return (x > y ? x : y); });
    }

    var flatMap = mergeMap;

    function mergeMapTo(innerObservable, resultSelector, concurrent) {
        if (concurrent === void 0) { concurrent = Infinity; }
        if (isFunction(resultSelector)) {
            return mergeMap(function () { return innerObservable; }, resultSelector, concurrent);
        }
        if (typeof resultSelector === 'number') {
            concurrent = resultSelector;
        }
        return mergeMap(function () { return innerObservable; }, concurrent);
    }

    function mergeScan(accumulator, seed, concurrent) {
        if (concurrent === void 0) { concurrent = Infinity; }
        return operate(function (source, subscriber) {
            var state = seed;
            return mergeInternals(source, subscriber, function (value, index) { return accumulator(state, value, index); }, concurrent, function (value) {
                state = value;
            }, false, undefined, function () { return (state = null); });
        });
    }

    function merge$1() {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        var scheduler = popScheduler(args);
        var concurrent = popNumber(args, Infinity);
        args = argsOrArgArray(args);
        return operate(function (source, subscriber) {
            mergeAll(concurrent)(from(__spreadArray([source], __read(args)), scheduler)).subscribe(subscriber);
        });
    }

    function mergeWith() {
        var otherSources = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            otherSources[_i] = arguments[_i];
        }
        return merge$1.apply(void 0, __spreadArray([], __read(otherSources)));
    }

    function min(comparer) {
        return reduce(isFunction(comparer) ? function (x, y) { return (comparer(x, y) < 0 ? x : y); } : function (x, y) { return (x < y ? x : y); });
    }

    function multicast(subjectOrSubjectFactory, selector) {
        var subjectFactory = isFunction(subjectOrSubjectFactory) ? subjectOrSubjectFactory : function () { return subjectOrSubjectFactory; };
        if (isFunction(selector)) {
            return connect(selector, {
                connector: subjectFactory,
            });
        }
        return function (source) { return new ConnectableObservable(source, subjectFactory); };
    }

    function pairwise() {
        return operate(function (source, subscriber) {
            var prev;
            var hasPrev = false;
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                var p = prev;
                prev = value;
                hasPrev && subscriber.next([p, value]);
                hasPrev = true;
            }));
        });
    }

    function pluck() {
        var properties = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            properties[_i] = arguments[_i];
        }
        var length = properties.length;
        if (length === 0) {
            throw new Error('list of properties cannot be empty.');
        }
        return map(function (x) {
            var currentProp = x;
            for (var i = 0; i < length; i++) {
                var p = currentProp === null || currentProp === void 0 ? void 0 : currentProp[properties[i]];
                if (typeof p !== 'undefined') {
                    currentProp = p;
                }
                else {
                    return undefined;
                }
            }
            return currentProp;
        });
    }

    function publish(selector) {
        return selector ? function (source) { return connect(selector)(source); } : function (source) { return multicast(new Subject())(source); };
    }

    function publishBehavior(initialValue) {
        return function (source) {
            var subject = new BehaviorSubject(initialValue);
            return new ConnectableObservable(source, function () { return subject; });
        };
    }

    function publishLast() {
        return function (source) {
            var subject = new AsyncSubject();
            return new ConnectableObservable(source, function () { return subject; });
        };
    }

    function publishReplay(bufferSize, windowTime, selectorOrScheduler, timestampProvider) {
        if (selectorOrScheduler && !isFunction(selectorOrScheduler)) {
            timestampProvider = selectorOrScheduler;
        }
        var selector = isFunction(selectorOrScheduler) ? selectorOrScheduler : undefined;
        return function (source) { return multicast(new ReplaySubject(bufferSize, windowTime, timestampProvider), selector)(source); };
    }

    function raceWith() {
        var otherSources = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            otherSources[_i] = arguments[_i];
        }
        return !otherSources.length
            ? identity
            : operate(function (source, subscriber) {
                raceInit(__spreadArray([source], __read(otherSources)))(subscriber);
            });
    }

    function repeat(countOrConfig) {
        var _a;
        var count = Infinity;
        var delay;
        if (countOrConfig != null) {
            if (typeof countOrConfig === 'object') {
                (_a = countOrConfig.count, count = _a === void 0 ? Infinity : _a, delay = countOrConfig.delay);
            }
            else {
                count = countOrConfig;
            }
        }
        return count <= 0
            ? function () { return EMPTY; }
            : operate(function (source, subscriber) {
                var soFar = 0;
                var sourceSub;
                var resubscribe = function () {
                    sourceSub === null || sourceSub === void 0 ? void 0 : sourceSub.unsubscribe();
                    sourceSub = null;
                    if (delay != null) {
                        var notifier = typeof delay === 'number' ? timer(delay) : innerFrom(delay(soFar));
                        var notifierSubscriber_1 = createOperatorSubscriber(subscriber, function () {
                            notifierSubscriber_1.unsubscribe();
                            subscribeToSource();
                        });
                        notifier.subscribe(notifierSubscriber_1);
                    }
                    else {
                        subscribeToSource();
                    }
                };
                var subscribeToSource = function () {
                    var syncUnsub = false;
                    sourceSub = source.subscribe(createOperatorSubscriber(subscriber, undefined, function () {
                        if (++soFar < count) {
                            if (sourceSub) {
                                resubscribe();
                            }
                            else {
                                syncUnsub = true;
                            }
                        }
                        else {
                            subscriber.complete();
                        }
                    }));
                    if (syncUnsub) {
                        resubscribe();
                    }
                };
                subscribeToSource();
            });
    }

    function repeatWhen(notifier) {
        return operate(function (source, subscriber) {
            var innerSub;
            var syncResub = false;
            var completions$;
            var isNotifierComplete = false;
            var isMainComplete = false;
            var checkComplete = function () { return isMainComplete && isNotifierComplete && (subscriber.complete(), true); };
            var getCompletionSubject = function () {
                if (!completions$) {
                    completions$ = new Subject();
                    notifier(completions$).subscribe(createOperatorSubscriber(subscriber, function () {
                        if (innerSub) {
                            subscribeForRepeatWhen();
                        }
                        else {
                            syncResub = true;
                        }
                    }, function () {
                        isNotifierComplete = true;
                        checkComplete();
                    }));
                }
                return completions$;
            };
            var subscribeForRepeatWhen = function () {
                isMainComplete = false;
                innerSub = source.subscribe(createOperatorSubscriber(subscriber, undefined, function () {
                    isMainComplete = true;
                    !checkComplete() && getCompletionSubject().next();
                }));
                if (syncResub) {
                    innerSub.unsubscribe();
                    innerSub = null;
                    syncResub = false;
                    subscribeForRepeatWhen();
                }
            };
            subscribeForRepeatWhen();
        });
    }

    function retry(configOrCount) {
        if (configOrCount === void 0) { configOrCount = Infinity; }
        var config;
        if (configOrCount && typeof configOrCount === 'object') {
            config = configOrCount;
        }
        else {
            config = {
                count: configOrCount,
            };
        }
        var _a = config.count, count = _a === void 0 ? Infinity : _a, delay = config.delay, _b = config.resetOnSuccess, resetOnSuccess = _b === void 0 ? false : _b;
        return count <= 0
            ? identity
            : operate(function (source, subscriber) {
                var soFar = 0;
                var innerSub;
                var subscribeForRetry = function () {
                    var syncUnsub = false;
                    innerSub = source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                        if (resetOnSuccess) {
                            soFar = 0;
                        }
                        subscriber.next(value);
                    }, undefined, function (err) {
                        if (soFar++ < count) {
                            var resub_1 = function () {
                                if (innerSub) {
                                    innerSub.unsubscribe();
                                    innerSub = null;
                                    subscribeForRetry();
                                }
                                else {
                                    syncUnsub = true;
                                }
                            };
                            if (delay != null) {
                                var notifier = typeof delay === 'number' ? timer(delay) : innerFrom(delay(err, soFar));
                                var notifierSubscriber_1 = createOperatorSubscriber(subscriber, function () {
                                    notifierSubscriber_1.unsubscribe();
                                    resub_1();
                                }, function () {
                                    subscriber.complete();
                                });
                                notifier.subscribe(notifierSubscriber_1);
                            }
                            else {
                                resub_1();
                            }
                        }
                        else {
                            subscriber.error(err);
                        }
                    }));
                    if (syncUnsub) {
                        innerSub.unsubscribe();
                        innerSub = null;
                        subscribeForRetry();
                    }
                };
                subscribeForRetry();
            });
    }

    function retryWhen(notifier) {
        return operate(function (source, subscriber) {
            var innerSub;
            var syncResub = false;
            var errors$;
            var subscribeForRetryWhen = function () {
                innerSub = source.subscribe(createOperatorSubscriber(subscriber, undefined, undefined, function (err) {
                    if (!errors$) {
                        errors$ = new Subject();
                        notifier(errors$).subscribe(createOperatorSubscriber(subscriber, function () {
                            return innerSub ? subscribeForRetryWhen() : (syncResub = true);
                        }));
                    }
                    if (errors$) {
                        errors$.next(err);
                    }
                }));
                if (syncResub) {
                    innerSub.unsubscribe();
                    innerSub = null;
                    syncResub = false;
                    subscribeForRetryWhen();
                }
            };
            subscribeForRetryWhen();
        });
    }

    function sample(notifier) {
        return operate(function (source, subscriber) {
            var hasValue = false;
            var lastValue = null;
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                hasValue = true;
                lastValue = value;
            }));
            notifier.subscribe(createOperatorSubscriber(subscriber, function () {
                if (hasValue) {
                    hasValue = false;
                    var value = lastValue;
                    lastValue = null;
                    subscriber.next(value);
                }
            }, noop));
        });
    }

    function sampleTime(period, scheduler) {
        if (scheduler === void 0) { scheduler = asyncScheduler; }
        return sample(interval(period, scheduler));
    }

    function scan(accumulator, seed) {
        return operate(scanInternals(accumulator, seed, arguments.length >= 2, true));
    }

    function sequenceEqual(compareTo, comparator) {
        if (comparator === void 0) { comparator = function (a, b) { return a === b; }; }
        return operate(function (source, subscriber) {
            var aState = createState();
            var bState = createState();
            var emit = function (isEqual) {
                subscriber.next(isEqual);
                subscriber.complete();
            };
            var createSubscriber = function (selfState, otherState) {
                var sequenceEqualSubscriber = createOperatorSubscriber(subscriber, function (a) {
                    var buffer = otherState.buffer, complete = otherState.complete;
                    if (buffer.length === 0) {
                        complete ? emit(false) : selfState.buffer.push(a);
                    }
                    else {
                        !comparator(a, buffer.shift()) && emit(false);
                    }
                }, function () {
                    selfState.complete = true;
                    var complete = otherState.complete, buffer = otherState.buffer;
                    complete && emit(buffer.length === 0);
                    sequenceEqualSubscriber === null || sequenceEqualSubscriber === void 0 ? void 0 : sequenceEqualSubscriber.unsubscribe();
                });
                return sequenceEqualSubscriber;
            };
            source.subscribe(createSubscriber(aState, bState));
            compareTo.subscribe(createSubscriber(bState, aState));
        });
    }
    function createState() {
        return {
            buffer: [],
            complete: false,
        };
    }

    function share(options) {
        if (options === void 0) { options = {}; }
        var _a = options.connector, connector = _a === void 0 ? function () { return new Subject(); } : _a, _b = options.resetOnError, resetOnError = _b === void 0 ? true : _b, _c = options.resetOnComplete, resetOnComplete = _c === void 0 ? true : _c, _d = options.resetOnRefCountZero, resetOnRefCountZero = _d === void 0 ? true : _d;
        return function (wrapperSource) {
            var connection;
            var resetConnection;
            var subject;
            var refCount = 0;
            var hasCompleted = false;
            var hasErrored = false;
            var cancelReset = function () {
                resetConnection === null || resetConnection === void 0 ? void 0 : resetConnection.unsubscribe();
                resetConnection = undefined;
            };
            var reset = function () {
                cancelReset();
                connection = subject = undefined;
                hasCompleted = hasErrored = false;
            };
            var resetAndUnsubscribe = function () {
                var conn = connection;
                reset();
                conn === null || conn === void 0 ? void 0 : conn.unsubscribe();
            };
            return operate(function (source, subscriber) {
                refCount++;
                if (!hasErrored && !hasCompleted) {
                    cancelReset();
                }
                var dest = (subject = subject !== null && subject !== void 0 ? subject : connector());
                subscriber.add(function () {
                    refCount--;
                    if (refCount === 0 && !hasErrored && !hasCompleted) {
                        resetConnection = handleReset(resetAndUnsubscribe, resetOnRefCountZero);
                    }
                });
                dest.subscribe(subscriber);
                if (!connection &&
                    refCount > 0) {
                    connection = new SafeSubscriber({
                        next: function (value) { return dest.next(value); },
                        error: function (err) {
                            hasErrored = true;
                            cancelReset();
                            resetConnection = handleReset(reset, resetOnError, err);
                            dest.error(err);
                        },
                        complete: function () {
                            hasCompleted = true;
                            cancelReset();
                            resetConnection = handleReset(reset, resetOnComplete);
                            dest.complete();
                        },
                    });
                    innerFrom(source).subscribe(connection);
                }
            })(wrapperSource);
        };
    }
    function handleReset(reset, on) {
        var args = [];
        for (var _i = 2; _i < arguments.length; _i++) {
            args[_i - 2] = arguments[_i];
        }
        if (on === true) {
            reset();
            return;
        }
        if (on === false) {
            return;
        }
        var onSubscriber = new SafeSubscriber({
            next: function () {
                onSubscriber.unsubscribe();
                reset();
            },
        });
        return on.apply(void 0, __spreadArray([], __read(args))).subscribe(onSubscriber);
    }

    function shareReplay(configOrBufferSize, windowTime, scheduler) {
        var _a, _b, _c;
        var bufferSize;
        var refCount = false;
        if (configOrBufferSize && typeof configOrBufferSize === 'object') {
            (_a = configOrBufferSize.bufferSize, bufferSize = _a === void 0 ? Infinity : _a, _b = configOrBufferSize.windowTime, windowTime = _b === void 0 ? Infinity : _b, _c = configOrBufferSize.refCount, refCount = _c === void 0 ? false : _c, scheduler = configOrBufferSize.scheduler);
        }
        else {
            bufferSize = (configOrBufferSize !== null && configOrBufferSize !== void 0 ? configOrBufferSize : Infinity);
        }
        return share({
            connector: function () { return new ReplaySubject(bufferSize, windowTime, scheduler); },
            resetOnError: true,
            resetOnComplete: false,
            resetOnRefCountZero: refCount,
        });
    }

    function single(predicate) {
        return operate(function (source, subscriber) {
            var hasValue = false;
            var singleValue;
            var seenValue = false;
            var index = 0;
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                seenValue = true;
                if (!predicate || predicate(value, index++, source)) {
                    hasValue && subscriber.error(new SequenceError('Too many matching values'));
                    hasValue = true;
                    singleValue = value;
                }
            }, function () {
                if (hasValue) {
                    subscriber.next(singleValue);
                    subscriber.complete();
                }
                else {
                    subscriber.error(seenValue ? new NotFoundError('No matching values') : new EmptyError());
                }
            }));
        });
    }

    function skip(count) {
        return filter(function (_, index) { return count <= index; });
    }

    function skipLast(skipCount) {
        return skipCount <= 0
            ?
                identity
            : operate(function (source, subscriber) {
                var ring = new Array(skipCount);
                var seen = 0;
                source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                    var valueIndex = seen++;
                    if (valueIndex < skipCount) {
                        ring[valueIndex] = value;
                    }
                    else {
                        var index = valueIndex % skipCount;
                        var oldValue = ring[index];
                        ring[index] = value;
                        subscriber.next(oldValue);
                    }
                }));
                return function () {
                    ring = null;
                };
            });
    }

    function skipUntil(notifier) {
        return operate(function (source, subscriber) {
            var taking = false;
            var skipSubscriber = createOperatorSubscriber(subscriber, function () {
                skipSubscriber === null || skipSubscriber === void 0 ? void 0 : skipSubscriber.unsubscribe();
                taking = true;
            }, noop);
            innerFrom(notifier).subscribe(skipSubscriber);
            source.subscribe(createOperatorSubscriber(subscriber, function (value) { return taking && subscriber.next(value); }));
        });
    }

    function skipWhile(predicate) {
        return operate(function (source, subscriber) {
            var taking = false;
            var index = 0;
            source.subscribe(createOperatorSubscriber(subscriber, function (value) { return (taking || (taking = !predicate(value, index++))) && subscriber.next(value); }));
        });
    }

    function startWith() {
        var values = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            values[_i] = arguments[_i];
        }
        var scheduler = popScheduler(values);
        return operate(function (source, subscriber) {
            (scheduler ? concat(values, source, scheduler) : concat(values, source)).subscribe(subscriber);
        });
    }

    function switchMap(project, resultSelector) {
        return operate(function (source, subscriber) {
            var innerSubscriber = null;
            var index = 0;
            var isComplete = false;
            var checkComplete = function () { return isComplete && !innerSubscriber && subscriber.complete(); };
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                innerSubscriber === null || innerSubscriber === void 0 ? void 0 : innerSubscriber.unsubscribe();
                var innerIndex = 0;
                var outerIndex = index++;
                innerFrom(project(value, outerIndex)).subscribe((innerSubscriber = createOperatorSubscriber(subscriber, function (innerValue) { return subscriber.next(resultSelector ? resultSelector(value, innerValue, outerIndex, innerIndex++) : innerValue); }, function () {
                    innerSubscriber = null;
                    checkComplete();
                })));
            }, function () {
                isComplete = true;
                checkComplete();
            }));
        });
    }

    function switchAll() {
        return switchMap(identity);
    }

    function switchMapTo(innerObservable, resultSelector) {
        return isFunction(resultSelector) ? switchMap(function () { return innerObservable; }, resultSelector) : switchMap(function () { return innerObservable; });
    }

    function switchScan(accumulator, seed) {
        return operate(function (source, subscriber) {
            var state = seed;
            switchMap(function (value, index) { return accumulator(state, value, index); }, function (_, innerValue) { return ((state = innerValue), innerValue); })(source).subscribe(subscriber);
            return function () {
                state = null;
            };
        });
    }

    function takeUntil(notifier) {
        return operate(function (source, subscriber) {
            innerFrom(notifier).subscribe(createOperatorSubscriber(subscriber, function () { return subscriber.complete(); }, noop));
            !subscriber.closed && source.subscribe(subscriber);
        });
    }

    function takeWhile(predicate, inclusive) {
        if (inclusive === void 0) { inclusive = false; }
        return operate(function (source, subscriber) {
            var index = 0;
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                var result = predicate(value, index++);
                (result || inclusive) && subscriber.next(value);
                !result && subscriber.complete();
            }));
        });
    }

    function tap(observerOrNext, error, complete) {
        var tapObserver = isFunction(observerOrNext) || error || complete
            ?
                { next: observerOrNext, error: error, complete: complete }
            : observerOrNext;
        return tapObserver
            ? operate(function (source, subscriber) {
                var _a;
                (_a = tapObserver.subscribe) === null || _a === void 0 ? void 0 : _a.call(tapObserver);
                var isUnsub = true;
                source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                    var _a;
                    (_a = tapObserver.next) === null || _a === void 0 ? void 0 : _a.call(tapObserver, value);
                    subscriber.next(value);
                }, function () {
                    var _a;
                    isUnsub = false;
                    (_a = tapObserver.complete) === null || _a === void 0 ? void 0 : _a.call(tapObserver);
                    subscriber.complete();
                }, function (err) {
                    var _a;
                    isUnsub = false;
                    (_a = tapObserver.error) === null || _a === void 0 ? void 0 : _a.call(tapObserver, err);
                    subscriber.error(err);
                }, function () {
                    var _a, _b;
                    if (isUnsub) {
                        (_a = tapObserver.unsubscribe) === null || _a === void 0 ? void 0 : _a.call(tapObserver);
                    }
                    (_b = tapObserver.finalize) === null || _b === void 0 ? void 0 : _b.call(tapObserver);
                }));
            })
            :
                identity;
    }

    var defaultThrottleConfig = {
        leading: true,
        trailing: false,
    };
    function throttle(durationSelector, config) {
        if (config === void 0) { config = defaultThrottleConfig; }
        return operate(function (source, subscriber) {
            var leading = config.leading, trailing = config.trailing;
            var hasValue = false;
            var sendValue = null;
            var throttled = null;
            var isComplete = false;
            var endThrottling = function () {
                throttled === null || throttled === void 0 ? void 0 : throttled.unsubscribe();
                throttled = null;
                if (trailing) {
                    send();
                    isComplete && subscriber.complete();
                }
            };
            var cleanupThrottling = function () {
                throttled = null;
                isComplete && subscriber.complete();
            };
            var startThrottle = function (value) {
                return (throttled = innerFrom(durationSelector(value)).subscribe(createOperatorSubscriber(subscriber, endThrottling, cleanupThrottling)));
            };
            var send = function () {
                if (hasValue) {
                    hasValue = false;
                    var value = sendValue;
                    sendValue = null;
                    subscriber.next(value);
                    !isComplete && startThrottle(value);
                }
            };
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                hasValue = true;
                sendValue = value;
                !(throttled && !throttled.closed) && (leading ? send() : startThrottle(value));
            }, function () {
                isComplete = true;
                !(trailing && hasValue && throttled && !throttled.closed) && subscriber.complete();
            }));
        });
    }

    function throttleTime(duration, scheduler, config) {
        if (scheduler === void 0) { scheduler = asyncScheduler; }
        if (config === void 0) { config = defaultThrottleConfig; }
        var duration$ = timer(duration, scheduler);
        return throttle(function () { return duration$; }, config);
    }

    function timeInterval(scheduler) {
        if (scheduler === void 0) { scheduler = asyncScheduler; }
        return operate(function (source, subscriber) {
            var last = scheduler.now();
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                var now = scheduler.now();
                var interval = now - last;
                last = now;
                subscriber.next(new TimeInterval(value, interval));
            }));
        });
    }
    var TimeInterval = (function () {
        function TimeInterval(value, interval) {
            this.value = value;
            this.interval = interval;
        }
        return TimeInterval;
    }());

    function timeoutWith(due, withObservable, scheduler) {
        var first;
        var each;
        var _with;
        scheduler = scheduler !== null && scheduler !== void 0 ? scheduler : async;
        if (isValidDate(due)) {
            first = due;
        }
        else if (typeof due === 'number') {
            each = due;
        }
        if (withObservable) {
            _with = function () { return withObservable; };
        }
        else {
            throw new TypeError('No observable provided to switch to');
        }
        if (first == null && each == null) {
            throw new TypeError('No timeout provided.');
        }
        return timeout({
            first: first,
            each: each,
            scheduler: scheduler,
            with: _with,
        });
    }

    function timestamp(timestampProvider) {
        if (timestampProvider === void 0) { timestampProvider = dateTimestampProvider; }
        return map(function (value) { return ({ value: value, timestamp: timestampProvider.now() }); });
    }

    function window(windowBoundaries) {
        return operate(function (source, subscriber) {
            var windowSubject = new Subject();
            subscriber.next(windowSubject.asObservable());
            var errorHandler = function (err) {
                windowSubject.error(err);
                subscriber.error(err);
            };
            source.subscribe(createOperatorSubscriber(subscriber, function (value) { return windowSubject === null || windowSubject === void 0 ? void 0 : windowSubject.next(value); }, function () {
                windowSubject.complete();
                subscriber.complete();
            }, errorHandler));
            windowBoundaries.subscribe(createOperatorSubscriber(subscriber, function () {
                windowSubject.complete();
                subscriber.next((windowSubject = new Subject()));
            }, noop, errorHandler));
            return function () {
                windowSubject === null || windowSubject === void 0 ? void 0 : windowSubject.unsubscribe();
                windowSubject = null;
            };
        });
    }

    function windowCount(windowSize, startWindowEvery) {
        if (startWindowEvery === void 0) { startWindowEvery = 0; }
        var startEvery = startWindowEvery > 0 ? startWindowEvery : windowSize;
        return operate(function (source, subscriber) {
            var windows = [new Subject()];
            var count = 0;
            subscriber.next(windows[0].asObservable());
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                var e_1, _a;
                try {
                    for (var windows_1 = __values(windows), windows_1_1 = windows_1.next(); !windows_1_1.done; windows_1_1 = windows_1.next()) {
                        var window_1 = windows_1_1.value;
                        window_1.next(value);
                    }
                }
                catch (e_1_1) { e_1 = { error: e_1_1 }; }
                finally {
                    try {
                        if (windows_1_1 && !windows_1_1.done && (_a = windows_1.return)) _a.call(windows_1);
                    }
                    finally { if (e_1) throw e_1.error; }
                }
                var c = count - windowSize + 1;
                if (c >= 0 && c % startEvery === 0) {
                    windows.shift().complete();
                }
                if (++count % startEvery === 0) {
                    var window_2 = new Subject();
                    windows.push(window_2);
                    subscriber.next(window_2.asObservable());
                }
            }, function () {
                while (windows.length > 0) {
                    windows.shift().complete();
                }
                subscriber.complete();
            }, function (err) {
                while (windows.length > 0) {
                    windows.shift().error(err);
                }
                subscriber.error(err);
            }, function () {
                windows = null;
            }));
        });
    }

    function windowTime(windowTimeSpan) {
        var _a, _b;
        var otherArgs = [];
        for (var _i = 1; _i < arguments.length; _i++) {
            otherArgs[_i - 1] = arguments[_i];
        }
        var scheduler = (_a = popScheduler(otherArgs)) !== null && _a !== void 0 ? _a : asyncScheduler;
        var windowCreationInterval = (_b = otherArgs[0]) !== null && _b !== void 0 ? _b : null;
        var maxWindowSize = otherArgs[1] || Infinity;
        return operate(function (source, subscriber) {
            var windowRecords = [];
            var restartOnClose = false;
            var closeWindow = function (record) {
                var window = record.window, subs = record.subs;
                window.complete();
                subs.unsubscribe();
                arrRemove(windowRecords, record);
                restartOnClose && startWindow();
            };
            var startWindow = function () {
                if (windowRecords) {
                    var subs = new Subscription();
                    subscriber.add(subs);
                    var window_1 = new Subject();
                    var record_1 = {
                        window: window_1,
                        subs: subs,
                        seen: 0,
                    };
                    windowRecords.push(record_1);
                    subscriber.next(window_1.asObservable());
                    executeSchedule(subs, scheduler, function () { return closeWindow(record_1); }, windowTimeSpan);
                }
            };
            if (windowCreationInterval !== null && windowCreationInterval >= 0) {
                executeSchedule(subscriber, scheduler, startWindow, windowCreationInterval, true);
            }
            else {
                restartOnClose = true;
            }
            startWindow();
            var loop = function (cb) { return windowRecords.slice().forEach(cb); };
            var terminate = function (cb) {
                loop(function (_a) {
                    var window = _a.window;
                    return cb(window);
                });
                cb(subscriber);
                subscriber.unsubscribe();
            };
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                loop(function (record) {
                    record.window.next(value);
                    maxWindowSize <= ++record.seen && closeWindow(record);
                });
            }, function () { return terminate(function (consumer) { return consumer.complete(); }); }, function (err) { return terminate(function (consumer) { return consumer.error(err); }); }));
            return function () {
                windowRecords = null;
            };
        });
    }

    function windowToggle(openings, closingSelector) {
        return operate(function (source, subscriber) {
            var windows = [];
            var handleError = function (err) {
                while (0 < windows.length) {
                    windows.shift().error(err);
                }
                subscriber.error(err);
            };
            innerFrom(openings).subscribe(createOperatorSubscriber(subscriber, function (openValue) {
                var window = new Subject();
                windows.push(window);
                var closingSubscription = new Subscription();
                var closeWindow = function () {
                    arrRemove(windows, window);
                    window.complete();
                    closingSubscription.unsubscribe();
                };
                var closingNotifier;
                try {
                    closingNotifier = innerFrom(closingSelector(openValue));
                }
                catch (err) {
                    handleError(err);
                    return;
                }
                subscriber.next(window.asObservable());
                closingSubscription.add(closingNotifier.subscribe(createOperatorSubscriber(subscriber, closeWindow, noop, handleError)));
            }, noop));
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                var e_1, _a;
                var windowsCopy = windows.slice();
                try {
                    for (var windowsCopy_1 = __values(windowsCopy), windowsCopy_1_1 = windowsCopy_1.next(); !windowsCopy_1_1.done; windowsCopy_1_1 = windowsCopy_1.next()) {
                        var window_1 = windowsCopy_1_1.value;
                        window_1.next(value);
                    }
                }
                catch (e_1_1) { e_1 = { error: e_1_1 }; }
                finally {
                    try {
                        if (windowsCopy_1_1 && !windowsCopy_1_1.done && (_a = windowsCopy_1.return)) _a.call(windowsCopy_1);
                    }
                    finally { if (e_1) throw e_1.error; }
                }
            }, function () {
                while (0 < windows.length) {
                    windows.shift().complete();
                }
                subscriber.complete();
            }, handleError, function () {
                while (0 < windows.length) {
                    windows.shift().unsubscribe();
                }
            }));
        });
    }

    function windowWhen(closingSelector) {
        return operate(function (source, subscriber) {
            var window;
            var closingSubscriber;
            var handleError = function (err) {
                window.error(err);
                subscriber.error(err);
            };
            var openWindow = function () {
                closingSubscriber === null || closingSubscriber === void 0 ? void 0 : closingSubscriber.unsubscribe();
                window === null || window === void 0 ? void 0 : window.complete();
                window = new Subject();
                subscriber.next(window.asObservable());
                var closingNotifier;
                try {
                    closingNotifier = innerFrom(closingSelector());
                }
                catch (err) {
                    handleError(err);
                    return;
                }
                closingNotifier.subscribe((closingSubscriber = createOperatorSubscriber(subscriber, openWindow, openWindow, handleError)));
            };
            openWindow();
            source.subscribe(createOperatorSubscriber(subscriber, function (value) { return window.next(value); }, function () {
                window.complete();
                subscriber.complete();
            }, handleError, function () {
                closingSubscriber === null || closingSubscriber === void 0 ? void 0 : closingSubscriber.unsubscribe();
                window = null;
            }));
        });
    }

    function withLatestFrom() {
        var inputs = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            inputs[_i] = arguments[_i];
        }
        var project = popResultSelector(inputs);
        return operate(function (source, subscriber) {
            var len = inputs.length;
            var otherValues = new Array(len);
            var hasValue = inputs.map(function () { return false; });
            var ready = false;
            var _loop_1 = function (i) {
                innerFrom(inputs[i]).subscribe(createOperatorSubscriber(subscriber, function (value) {
                    otherValues[i] = value;
                    if (!ready && !hasValue[i]) {
                        hasValue[i] = true;
                        (ready = hasValue.every(identity)) && (hasValue = null);
                    }
                }, noop));
            };
            for (var i = 0; i < len; i++) {
                _loop_1(i);
            }
            source.subscribe(createOperatorSubscriber(subscriber, function (value) {
                if (ready) {
                    var values = __spreadArray([value], __read(otherValues));
                    subscriber.next(project ? project.apply(void 0, __spreadArray([], __read(values))) : values);
                }
            }));
        });
    }

    function zipAll(project) {
        return joinAllInternals(zip, project);
    }

    function zip$1() {
        var sources = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            sources[_i] = arguments[_i];
        }
        return operate(function (source, subscriber) {
            zip.apply(void 0, __spreadArray([source], __read(sources))).subscribe(subscriber);
        });
    }

    function zipWith() {
        var otherInputs = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            otherInputs[_i] = arguments[_i];
        }
        return zip$1.apply(void 0, __spreadArray([], __read(otherInputs)));
    }

    function partition$1(predicate, thisArg) {
        return function (source) {
            return [filter(predicate, thisArg)(source), filter(not(predicate, thisArg))(source)];
        };
    }

    function race$1() {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            args[_i] = arguments[_i];
        }
        return raceWith.apply(void 0, __spreadArray([], __read(argsOrArgArray(args))));
    }



    var _operators = /*#__PURE__*/Object.freeze({
        audit: audit,
        auditTime: auditTime,
        buffer: buffer,
        bufferCount: bufferCount,
        bufferTime: bufferTime,
        bufferToggle: bufferToggle,
        bufferWhen: bufferWhen,
        catchError: catchError,
        combineAll: combineAll,
        combineLatestAll: combineLatestAll,
        combineLatest: combineLatest$1,
        combineLatestWith: combineLatestWith,
        concat: concat$1,
        concatAll: concatAll,
        concatMap: concatMap,
        concatMapTo: concatMapTo,
        concatWith: concatWith,
        connect: connect,
        count: count,
        debounce: debounce,
        debounceTime: debounceTime,
        defaultIfEmpty: defaultIfEmpty,
        delay: delay,
        delayWhen: delayWhen,
        dematerialize: dematerialize,
        distinct: distinct,
        distinctUntilChanged: distinctUntilChanged,
        distinctUntilKeyChanged: distinctUntilKeyChanged,
        elementAt: elementAt,
        endWith: endWith,
        every: every,
        exhaust: exhaust,
        exhaustAll: exhaustAll,
        exhaustMap: exhaustMap,
        expand: expand,
        filter: filter,
        finalize: finalize,
        find: find,
        findIndex: findIndex,
        first: first,
        groupBy: groupBy,
        ignoreElements: ignoreElements,
        isEmpty: isEmpty,
        last: last$1,
        map: map,
        mapTo: mapTo,
        materialize: materialize,
        max: max,
        merge: merge$1,
        mergeAll: mergeAll,
        flatMap: flatMap,
        mergeMap: mergeMap,
        mergeMapTo: mergeMapTo,
        mergeScan: mergeScan,
        mergeWith: mergeWith,
        min: min,
        multicast: multicast,
        observeOn: observeOn,
        onErrorResumeNext: onErrorResumeNext,
        pairwise: pairwise,
        partition: partition$1,
        pluck: pluck,
        publish: publish,
        publishBehavior: publishBehavior,
        publishLast: publishLast,
        publishReplay: publishReplay,
        race: race$1,
        raceWith: raceWith,
        reduce: reduce,
        repeat: repeat,
        repeatWhen: repeatWhen,
        retry: retry,
        retryWhen: retryWhen,
        refCount: refCount,
        sample: sample,
        sampleTime: sampleTime,
        scan: scan,
        sequenceEqual: sequenceEqual,
        share: share,
        shareReplay: shareReplay,
        single: single,
        skip: skip,
        skipLast: skipLast,
        skipUntil: skipUntil,
        skipWhile: skipWhile,
        startWith: startWith,
        subscribeOn: subscribeOn,
        switchAll: switchAll,
        switchMap: switchMap,
        switchMapTo: switchMapTo,
        switchScan: switchScan,
        take: take,
        takeLast: takeLast,
        takeUntil: takeUntil,
        takeWhile: takeWhile,
        tap: tap,
        throttle: throttle,
        throttleTime: throttleTime,
        throwIfEmpty: throwIfEmpty,
        timeInterval: timeInterval,
        timeout: timeout,
        timeoutWith: timeoutWith,
        timestamp: timestamp,
        toArray: toArray,
        window: window,
        windowCount: windowCount,
        windowTime: windowTime,
        windowToggle: windowToggle,
        windowWhen: windowWhen,
        withLatestFrom: withLatestFrom,
        zip: zip$1,
        zipAll: zipAll,
        zipWith: zipWith
    });

    var SubscriptionLog = (function () {
        function SubscriptionLog(subscribedFrame, unsubscribedFrame) {
            if (unsubscribedFrame === void 0) { unsubscribedFrame = Infinity; }
            this.subscribedFrame = subscribedFrame;
            this.unsubscribedFrame = unsubscribedFrame;
        }
        return SubscriptionLog;
    }());

    var SubscriptionLoggable = (function () {
        function SubscriptionLoggable() {
            this.subscriptions = [];
        }
        SubscriptionLoggable.prototype.logSubscribedFrame = function () {
            this.subscriptions.push(new SubscriptionLog(this.scheduler.now()));
            return this.subscriptions.length - 1;
        };
        SubscriptionLoggable.prototype.logUnsubscribedFrame = function (index) {
            var subscriptionLogs = this.subscriptions;
            var oldSubscriptionLog = subscriptionLogs[index];
            subscriptionLogs[index] = new SubscriptionLog(oldSubscriptionLog.subscribedFrame, this.scheduler.now());
        };
        return SubscriptionLoggable;
    }());

    function applyMixins(derivedCtor, baseCtors) {
        for (var i = 0, len = baseCtors.length; i < len; i++) {
            var baseCtor = baseCtors[i];
            var propertyKeys = Object.getOwnPropertyNames(baseCtor.prototype);
            for (var j = 0, len2 = propertyKeys.length; j < len2; j++) {
                var name_1 = propertyKeys[j];
                derivedCtor.prototype[name_1] = baseCtor.prototype[name_1];
            }
        }
    }

    var ColdObservable = (function (_super) {
        __extends(ColdObservable, _super);
        function ColdObservable(messages, scheduler) {
            var _this = _super.call(this, function (subscriber) {
                var observable = this;
                var index = observable.logSubscribedFrame();
                var subscription = new Subscription();
                subscription.add(new Subscription(function () {
                    observable.logUnsubscribedFrame(index);
                }));
                observable.scheduleMessages(subscriber);
                return subscription;
            }) || this;
            _this.messages = messages;
            _this.subscriptions = [];
            _this.scheduler = scheduler;
            return _this;
        }
        ColdObservable.prototype.scheduleMessages = function (subscriber) {
            var messagesLength = this.messages.length;
            for (var i = 0; i < messagesLength; i++) {
                var message = this.messages[i];
                subscriber.add(this.scheduler.schedule(function (state) {
                    var _a = state, notification = _a.message.notification, destination = _a.subscriber;
                    observeNotification(notification, destination);
                }, message.frame, { message: message, subscriber: subscriber }));
            }
        };
        return ColdObservable;
    }(Observable));
    applyMixins(ColdObservable, [SubscriptionLoggable]);

    var HotObservable = (function (_super) {
        __extends(HotObservable, _super);
        function HotObservable(messages, scheduler) {
            var _this = _super.call(this) || this;
            _this.messages = messages;
            _this.subscriptions = [];
            _this.scheduler = scheduler;
            return _this;
        }
        HotObservable.prototype._subscribe = function (subscriber) {
            var subject = this;
            var index = subject.logSubscribedFrame();
            var subscription = new Subscription();
            subscription.add(new Subscription(function () {
                subject.logUnsubscribedFrame(index);
            }));
            subscription.add(_super.prototype._subscribe.call(this, subscriber));
            return subscription;
        };
        HotObservable.prototype.setup = function () {
            var subject = this;
            var messagesLength = subject.messages.length;
            var _loop_1 = function (i) {
                (function () {
                    var _a = subject.messages[i], notification = _a.notification, frame = _a.frame;
                    subject.scheduler.schedule(function () {
                        observeNotification(notification, subject);
                    }, frame);
                })();
            };
            for (var i = 0; i < messagesLength; i++) {
                _loop_1(i);
            }
        };
        return HotObservable;
    }(Subject));
    applyMixins(HotObservable, [SubscriptionLoggable]);

    var defaultMaxFrame = 750;
    var TestScheduler = (function (_super) {
        __extends(TestScheduler, _super);
        function TestScheduler(assertDeepEqual) {
            var _this = _super.call(this, VirtualAction, defaultMaxFrame) || this;
            _this.assertDeepEqual = assertDeepEqual;
            _this.hotObservables = [];
            _this.coldObservables = [];
            _this.flushTests = [];
            _this.runMode = false;
            return _this;
        }
        TestScheduler.prototype.createTime = function (marbles) {
            var indexOf = this.runMode ? marbles.trim().indexOf('|') : marbles.indexOf('|');
            if (indexOf === -1) {
                throw new Error('marble diagram for time should have a completion marker "|"');
            }
            return indexOf * TestScheduler.frameTimeFactor;
        };
        TestScheduler.prototype.createColdObservable = function (marbles, values, error) {
            if (marbles.indexOf('^') !== -1) {
                throw new Error('cold observable cannot have subscription offset "^"');
            }
            if (marbles.indexOf('!') !== -1) {
                throw new Error('cold observable cannot have unsubscription marker "!"');
            }
            var messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);
            var cold = new ColdObservable(messages, this);
            this.coldObservables.push(cold);
            return cold;
        };
        TestScheduler.prototype.createHotObservable = function (marbles, values, error) {
            if (marbles.indexOf('!') !== -1) {
                throw new Error('hot observable cannot have unsubscription marker "!"');
            }
            var messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);
            var subject = new HotObservable(messages, this);
            this.hotObservables.push(subject);
            return subject;
        };
        TestScheduler.prototype.materializeInnerObservable = function (observable, outerFrame) {
            var _this = this;
            var messages = [];
            observable.subscribe({
                next: function (value) {
                    messages.push({ frame: _this.frame - outerFrame, notification: nextNotification(value) });
                },
                error: function (error) {
                    messages.push({ frame: _this.frame - outerFrame, notification: errorNotification(error) });
                },
                complete: function () {
                    messages.push({ frame: _this.frame - outerFrame, notification: COMPLETE_NOTIFICATION });
                },
            });
            return messages;
        };
        TestScheduler.prototype.expectObservable = function (observable, subscriptionMarbles) {
            var _this = this;
            if (subscriptionMarbles === void 0) { subscriptionMarbles = null; }
            var actual = [];
            var flushTest = { actual: actual, ready: false };
            var subscriptionParsed = TestScheduler.parseMarblesAsSubscriptions(subscriptionMarbles, this.runMode);
            var subscriptionFrame = subscriptionParsed.subscribedFrame === Infinity ? 0 : subscriptionParsed.subscribedFrame;
            var unsubscriptionFrame = subscriptionParsed.unsubscribedFrame;
            var subscription;
            this.schedule(function () {
                subscription = observable.subscribe({
                    next: function (x) {
                        var value = x instanceof Observable ? _this.materializeInnerObservable(x, _this.frame) : x;
                        actual.push({ frame: _this.frame, notification: nextNotification(value) });
                    },
                    error: function (error) {
                        actual.push({ frame: _this.frame, notification: errorNotification(error) });
                    },
                    complete: function () {
                        actual.push({ frame: _this.frame, notification: COMPLETE_NOTIFICATION });
                    },
                });
            }, subscriptionFrame);
            if (unsubscriptionFrame !== Infinity) {
                this.schedule(function () { return subscription.unsubscribe(); }, unsubscriptionFrame);
            }
            this.flushTests.push(flushTest);
            var runMode = this.runMode;
            return {
                toBe: function (marbles, values, errorValue) {
                    flushTest.ready = true;
                    flushTest.expected = TestScheduler.parseMarbles(marbles, values, errorValue, true, runMode);
                },
                toEqual: function (other) {
                    flushTest.ready = true;
                    flushTest.expected = [];
                    _this.schedule(function () {
                        subscription = other.subscribe({
                            next: function (x) {
                                var value = x instanceof Observable ? _this.materializeInnerObservable(x, _this.frame) : x;
                                flushTest.expected.push({ frame: _this.frame, notification: nextNotification(value) });
                            },
                            error: function (error) {
                                flushTest.expected.push({ frame: _this.frame, notification: errorNotification(error) });
                            },
                            complete: function () {
                                flushTest.expected.push({ frame: _this.frame, notification: COMPLETE_NOTIFICATION });
                            },
                        });
                    }, subscriptionFrame);
                },
            };
        };
        TestScheduler.prototype.expectSubscriptions = function (actualSubscriptionLogs) {
            var flushTest = { actual: actualSubscriptionLogs, ready: false };
            this.flushTests.push(flushTest);
            var runMode = this.runMode;
            return {
                toBe: function (marblesOrMarblesArray) {
                    var marblesArray = typeof marblesOrMarblesArray === 'string' ? [marblesOrMarblesArray] : marblesOrMarblesArray;
                    flushTest.ready = true;
                    flushTest.expected = marblesArray
                        .map(function (marbles) { return TestScheduler.parseMarblesAsSubscriptions(marbles, runMode); })
                        .filter(function (marbles) { return marbles.subscribedFrame !== Infinity; });
                },
            };
        };
        TestScheduler.prototype.flush = function () {
            var _this = this;
            var hotObservables = this.hotObservables;
            while (hotObservables.length > 0) {
                hotObservables.shift().setup();
            }
            _super.prototype.flush.call(this);
            this.flushTests = this.flushTests.filter(function (test) {
                if (test.ready) {
                    _this.assertDeepEqual(test.actual, test.expected);
                    return false;
                }
                return true;
            });
        };
        TestScheduler.parseMarblesAsSubscriptions = function (marbles, runMode) {
            var _this = this;
            if (runMode === void 0) { runMode = false; }
            if (typeof marbles !== 'string') {
                return new SubscriptionLog(Infinity);
            }
            var characters = __spreadArray([], __read(marbles));
            var len = characters.length;
            var groupStart = -1;
            var subscriptionFrame = Infinity;
            var unsubscriptionFrame = Infinity;
            var frame = 0;
            var _loop_1 = function (i) {
                var nextFrame = frame;
                var advanceFrameBy = function (count) {
                    nextFrame += count * _this.frameTimeFactor;
                };
                var c = characters[i];
                switch (c) {
                    case ' ':
                        if (!runMode) {
                            advanceFrameBy(1);
                        }
                        break;
                    case '-':
                        advanceFrameBy(1);
                        break;
                    case '(':
                        groupStart = frame;
                        advanceFrameBy(1);
                        break;
                    case ')':
                        groupStart = -1;
                        advanceFrameBy(1);
                        break;
                    case '^':
                        if (subscriptionFrame !== Infinity) {
                            throw new Error("found a second subscription point '^' in a " + 'subscription marble diagram. There can only be one.');
                        }
                        subscriptionFrame = groupStart > -1 ? groupStart : frame;
                        advanceFrameBy(1);
                        break;
                    case '!':
                        if (unsubscriptionFrame !== Infinity) {
                            throw new Error("found a second unsubscription point '!' in a " + 'subscription marble diagram. There can only be one.');
                        }
                        unsubscriptionFrame = groupStart > -1 ? groupStart : frame;
                        break;
                    default:
                        if (runMode && c.match(/^[0-9]$/)) {
                            if (i === 0 || characters[i - 1] === ' ') {
                                var buffer = characters.slice(i).join('');
                                var match = buffer.match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);
                                if (match) {
                                    i += match[0].length - 1;
                                    var duration = parseFloat(match[1]);
                                    var unit = match[2];
                                    var durationInMs = void 0;
                                    switch (unit) {
                                        case 'ms':
                                            durationInMs = duration;
                                            break;
                                        case 's':
                                            durationInMs = duration * 1000;
                                            break;
                                        case 'm':
                                            durationInMs = duration * 1000 * 60;
                                            break;
                                        default:
                                            break;
                                    }
                                    advanceFrameBy(durationInMs / this_1.frameTimeFactor);
                                    break;
                                }
                            }
                        }
                        throw new Error("there can only be '^' and '!' markers in a " + "subscription marble diagram. Found instead '" + c + "'.");
                }
                frame = nextFrame;
                out_i_1 = i;
            };
            var this_1 = this, out_i_1;
            for (var i = 0; i < len; i++) {
                _loop_1(i);
                i = out_i_1;
            }
            if (unsubscriptionFrame < 0) {
                return new SubscriptionLog(subscriptionFrame);
            }
            else {
                return new SubscriptionLog(subscriptionFrame, unsubscriptionFrame);
            }
        };
        TestScheduler.parseMarbles = function (marbles, values, errorValue, materializeInnerObservables, runMode) {
            var _this = this;
            if (materializeInnerObservables === void 0) { materializeInnerObservables = false; }
            if (runMode === void 0) { runMode = false; }
            if (marbles.indexOf('!') !== -1) {
                throw new Error('conventional marble diagrams cannot have the ' + 'unsubscription marker "!"');
            }
            var characters = __spreadArray([], __read(marbles));
            var len = characters.length;
            var testMessages = [];
            var subIndex = runMode ? marbles.replace(/^[ ]+/, '').indexOf('^') : marbles.indexOf('^');
            var frame = subIndex === -1 ? 0 : subIndex * -this.frameTimeFactor;
            var getValue = typeof values !== 'object'
                ? function (x) { return x; }
                : function (x) {
                    if (materializeInnerObservables && values[x] instanceof ColdObservable) {
                        return values[x].messages;
                    }
                    return values[x];
                };
            var groupStart = -1;
            var _loop_2 = function (i) {
                var nextFrame = frame;
                var advanceFrameBy = function (count) {
                    nextFrame += count * _this.frameTimeFactor;
                };
                var notification = void 0;
                var c = characters[i];
                switch (c) {
                    case ' ':
                        if (!runMode) {
                            advanceFrameBy(1);
                        }
                        break;
                    case '-':
                        advanceFrameBy(1);
                        break;
                    case '(':
                        groupStart = frame;
                        advanceFrameBy(1);
                        break;
                    case ')':
                        groupStart = -1;
                        advanceFrameBy(1);
                        break;
                    case '|':
                        notification = COMPLETE_NOTIFICATION;
                        advanceFrameBy(1);
                        break;
                    case '^':
                        advanceFrameBy(1);
                        break;
                    case '#':
                        notification = errorNotification(errorValue || 'error');
                        advanceFrameBy(1);
                        break;
                    default:
                        if (runMode && c.match(/^[0-9]$/)) {
                            if (i === 0 || characters[i - 1] === ' ') {
                                var buffer = characters.slice(i).join('');
                                var match = buffer.match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);
                                if (match) {
                                    i += match[0].length - 1;
                                    var duration = parseFloat(match[1]);
                                    var unit = match[2];
                                    var durationInMs = void 0;
                                    switch (unit) {
                                        case 'ms':
                                            durationInMs = duration;
                                            break;
                                        case 's':
                                            durationInMs = duration * 1000;
                                            break;
                                        case 'm':
                                            durationInMs = duration * 1000 * 60;
                                            break;
                                        default:
                                            break;
                                    }
                                    advanceFrameBy(durationInMs / this_2.frameTimeFactor);
                                    break;
                                }
                            }
                        }
                        notification = nextNotification(getValue(c));
                        advanceFrameBy(1);
                        break;
                }
                if (notification) {
                    testMessages.push({ frame: groupStart > -1 ? groupStart : frame, notification: notification });
                }
                frame = nextFrame;
                out_i_2 = i;
            };
            var this_2 = this, out_i_2;
            for (var i = 0; i < len; i++) {
                _loop_2(i);
                i = out_i_2;
            }
            return testMessages;
        };
        TestScheduler.prototype.createAnimator = function () {
            var _this = this;
            if (!this.runMode) {
                throw new Error('animate() must only be used in run mode');
            }
            var lastHandle = 0;
            var map;
            var delegate = {
                requestAnimationFrame: function (callback) {
                    if (!map) {
                        throw new Error('animate() was not called within run()');
                    }
                    var handle = ++lastHandle;
                    map.set(handle, callback);
                    return handle;
                },
                cancelAnimationFrame: function (handle) {
                    if (!map) {
                        throw new Error('animate() was not called within run()');
                    }
                    map.delete(handle);
                },
            };
            var animate = function (marbles) {
                var e_1, _a;
                if (map) {
                    throw new Error('animate() must not be called more than once within run()');
                }
                if (/[|#]/.test(marbles)) {
                    throw new Error('animate() must not complete or error');
                }
                map = new Map();
                var messages = TestScheduler.parseMarbles(marbles, undefined, undefined, undefined, true);
                try {
                    for (var messages_1 = __values(messages), messages_1_1 = messages_1.next(); !messages_1_1.done; messages_1_1 = messages_1.next()) {
                        var message = messages_1_1.value;
                        _this.schedule(function () {
                            var e_2, _a;
                            var now = _this.now();
                            var callbacks = Array.from(map.values());
                            map.clear();
                            try {
                                for (var callbacks_1 = (e_2 = void 0, __values(callbacks)), callbacks_1_1 = callbacks_1.next(); !callbacks_1_1.done; callbacks_1_1 = callbacks_1.next()) {
                                    var callback = callbacks_1_1.value;
                                    callback(now);
                                }
                            }
                            catch (e_2_1) { e_2 = { error: e_2_1 }; }
                            finally {
                                try {
                                    if (callbacks_1_1 && !callbacks_1_1.done && (_a = callbacks_1.return)) _a.call(callbacks_1);
                                }
                                finally { if (e_2) throw e_2.error; }
                            }
                        }, message.frame);
                    }
                }
                catch (e_1_1) { e_1 = { error: e_1_1 }; }
                finally {
                    try {
                        if (messages_1_1 && !messages_1_1.done && (_a = messages_1.return)) _a.call(messages_1);
                    }
                    finally { if (e_1) throw e_1.error; }
                }
            };
            return { animate: animate, delegate: delegate };
        };
        TestScheduler.prototype.createDelegates = function () {
            var _this = this;
            var lastHandle = 0;
            var scheduleLookup = new Map();
            var run = function () {
                var now = _this.now();
                var scheduledRecords = Array.from(scheduleLookup.values());
                var scheduledRecordsDue = scheduledRecords.filter(function (_a) {
                    var due = _a.due;
                    return due <= now;
                });
                var dueImmediates = scheduledRecordsDue.filter(function (_a) {
                    var type = _a.type;
                    return type === 'immediate';
                });
                if (dueImmediates.length > 0) {
                    var _a = dueImmediates[0], handle = _a.handle, handler = _a.handler;
                    scheduleLookup.delete(handle);
                    handler();
                    return;
                }
                var dueIntervals = scheduledRecordsDue.filter(function (_a) {
                    var type = _a.type;
                    return type === 'interval';
                });
                if (dueIntervals.length > 0) {
                    var firstDueInterval = dueIntervals[0];
                    var duration = firstDueInterval.duration, handler = firstDueInterval.handler;
                    firstDueInterval.due = now + duration;
                    firstDueInterval.subscription = _this.schedule(run, duration);
                    handler();
                    return;
                }
                var dueTimeouts = scheduledRecordsDue.filter(function (_a) {
                    var type = _a.type;
                    return type === 'timeout';
                });
                if (dueTimeouts.length > 0) {
                    var _b = dueTimeouts[0], handle = _b.handle, handler = _b.handler;
                    scheduleLookup.delete(handle);
                    handler();
                    return;
                }
                throw new Error('Expected a due immediate or interval');
            };
            var immediate = {
                setImmediate: function (handler) {
                    var handle = ++lastHandle;
                    scheduleLookup.set(handle, {
                        due: _this.now(),
                        duration: 0,
                        handle: handle,
                        handler: handler,
                        subscription: _this.schedule(run, 0),
                        type: 'immediate',
                    });
                    return handle;
                },
                clearImmediate: function (handle) {
                    var value = scheduleLookup.get(handle);
                    if (value) {
                        value.subscription.unsubscribe();
                        scheduleLookup.delete(handle);
                    }
                },
            };
            var interval = {
                setInterval: function (handler, duration) {
                    if (duration === void 0) { duration = 0; }
                    var handle = ++lastHandle;
                    scheduleLookup.set(handle, {
                        due: _this.now() + duration,
                        duration: duration,
                        handle: handle,
                        handler: handler,
                        subscription: _this.schedule(run, duration),
                        type: 'interval',
                    });
                    return handle;
                },
                clearInterval: function (handle) {
                    var value = scheduleLookup.get(handle);
                    if (value) {
                        value.subscription.unsubscribe();
                        scheduleLookup.delete(handle);
                    }
                },
            };
            var timeout = {
                setTimeout: function (handler, duration) {
                    if (duration === void 0) { duration = 0; }
                    var handle = ++lastHandle;
                    scheduleLookup.set(handle, {
                        due: _this.now() + duration,
                        duration: duration,
                        handle: handle,
                        handler: handler,
                        subscription: _this.schedule(run, duration),
                        type: 'timeout',
                    });
                    return handle;
                },
                clearTimeout: function (handle) {
                    var value = scheduleLookup.get(handle);
                    if (value) {
                        value.subscription.unsubscribe();
                        scheduleLookup.delete(handle);
                    }
                },
            };
            return { immediate: immediate, interval: interval, timeout: timeout };
        };
        TestScheduler.prototype.run = function (callback) {
            var prevFrameTimeFactor = TestScheduler.frameTimeFactor;
            var prevMaxFrames = this.maxFrames;
            TestScheduler.frameTimeFactor = 1;
            this.maxFrames = Infinity;
            this.runMode = true;
            var animator = this.createAnimator();
            var delegates = this.createDelegates();
            animationFrameProvider.delegate = animator.delegate;
            dateTimestampProvider.delegate = this;
            immediateProvider.delegate = delegates.immediate;
            intervalProvider.delegate = delegates.interval;
            timeoutProvider.delegate = delegates.timeout;
            performanceTimestampProvider.delegate = this;
            var helpers = {
                cold: this.createColdObservable.bind(this),
                hot: this.createHotObservable.bind(this),
                flush: this.flush.bind(this),
                time: this.createTime.bind(this),
                expectObservable: this.expectObservable.bind(this),
                expectSubscriptions: this.expectSubscriptions.bind(this),
                animate: animator.animate,
            };
            try {
                var ret = callback(helpers);
                this.flush();
                return ret;
            }
            finally {
                TestScheduler.frameTimeFactor = prevFrameTimeFactor;
                this.maxFrames = prevMaxFrames;
                this.runMode = false;
                animationFrameProvider.delegate = undefined;
                dateTimestampProvider.delegate = undefined;
                immediateProvider.delegate = undefined;
                intervalProvider.delegate = undefined;
                timeoutProvider.delegate = undefined;
                performanceTimestampProvider.delegate = undefined;
            }
        };
        TestScheduler.frameTimeFactor = 10;
        return TestScheduler;
    }(VirtualTimeScheduler));



    var _testing = /*#__PURE__*/Object.freeze({
        TestScheduler: TestScheduler
    });

    function getXHRResponse(xhr) {
        switch (xhr.responseType) {
            case 'json': {
                if ('response' in xhr) {
                    return xhr.response;
                }
                else {
                    var ieXHR = xhr;
                    return JSON.parse(ieXHR.responseText);
                }
            }
            case 'document':
                return xhr.responseXML;
            case 'text':
            default: {
                if ('response' in xhr) {
                    return xhr.response;
                }
                else {
                    var ieXHR = xhr;
                    return ieXHR.responseText;
                }
            }
        }
    }

    var AjaxResponse = (function () {
        function AjaxResponse(originalEvent, xhr, request, type) {
            if (type === void 0) { type = 'download_load'; }
            this.originalEvent = originalEvent;
            this.xhr = xhr;
            this.request = request;
            this.type = type;
            var status = xhr.status, responseType = xhr.responseType;
            this.status = status !== null && status !== void 0 ? status : 0;
            this.responseType = responseType !== null && responseType !== void 0 ? responseType : '';
            var allHeaders = xhr.getAllResponseHeaders();
            this.responseHeaders = allHeaders
                ?
                    allHeaders.split('\n').reduce(function (headers, line) {
                        var index = line.indexOf(': ');
                        headers[line.slice(0, index)] = line.slice(index + 2);
                        return headers;
                    }, {})
                : {};
            this.response = getXHRResponse(xhr);
            var loaded = originalEvent.loaded, total = originalEvent.total;
            this.loaded = loaded;
            this.total = total;
        }
        return AjaxResponse;
    }());

    var AjaxError = createErrorClass(function (_super) {
        return function AjaxErrorImpl(message, xhr, request) {
            this.message = message;
            this.name = 'AjaxError';
            this.xhr = xhr;
            this.request = request;
            this.status = xhr.status;
            this.responseType = xhr.responseType;
            var response;
            try {
                response = getXHRResponse(xhr);
            }
            catch (err) {
                response = xhr.responseText;
            }
            this.response = response;
        };
    });
    var AjaxTimeoutError = (function () {
        function AjaxTimeoutErrorImpl(xhr, request) {
            AjaxError.call(this, 'ajax timeout', xhr, request);
            this.name = 'AjaxTimeoutError';
            return this;
        }
        AjaxTimeoutErrorImpl.prototype = Object.create(AjaxError.prototype);
        return AjaxTimeoutErrorImpl;
    })();

    function ajaxGet(url, headers) {
        return ajax({ method: 'GET', url: url, headers: headers });
    }
    function ajaxPost(url, body, headers) {
        return ajax({ method: 'POST', url: url, body: body, headers: headers });
    }
    function ajaxDelete(url, headers) {
        return ajax({ method: 'DELETE', url: url, headers: headers });
    }
    function ajaxPut(url, body, headers) {
        return ajax({ method: 'PUT', url: url, body: body, headers: headers });
    }
    function ajaxPatch(url, body, headers) {
        return ajax({ method: 'PATCH', url: url, body: body, headers: headers });
    }
    var mapResponse = map(function (x) { return x.response; });
    function ajaxGetJSON(url, headers) {
        return mapResponse(ajax({
            method: 'GET',
            url: url,
            headers: headers,
        }));
    }
    var ajax = (function () {
        var create = function (urlOrConfig) {
            var config = typeof urlOrConfig === 'string'
                ? {
                    url: urlOrConfig,
                }
                : urlOrConfig;
            return fromAjax(config);
        };
        create.get = ajaxGet;
        create.post = ajaxPost;
        create.delete = ajaxDelete;
        create.put = ajaxPut;
        create.patch = ajaxPatch;
        create.getJSON = ajaxGetJSON;
        return create;
    })();
    var UPLOAD = 'upload';
    var DOWNLOAD = 'download';
    var LOADSTART = 'loadstart';
    var PROGRESS = 'progress';
    var LOAD = 'load';
    function fromAjax(init) {
        return new Observable(function (destination) {
            var _a, _b;
            var config = __assign({ async: true, crossDomain: false, withCredentials: false, method: 'GET', timeout: 0, responseType: 'json' }, init);
            var queryParams = config.queryParams, configuredBody = config.body, configuredHeaders = config.headers;
            var url = config.url;
            if (!url) {
                throw new TypeError('url is required');
            }
            if (queryParams) {
                var searchParams_1;
                if (url.includes('?')) {
                    var parts = url.split('?');
                    if (2 < parts.length) {
                        throw new TypeError('invalid url');
                    }
                    searchParams_1 = new URLSearchParams(parts[1]);
                    new URLSearchParams(queryParams).forEach(function (value, key) { return searchParams_1.set(key, value); });
                    url = parts[0] + '?' + searchParams_1;
                }
                else {
                    searchParams_1 = new URLSearchParams(queryParams);
                    url = url + '?' + searchParams_1;
                }
            }
            var headers = {};
            if (configuredHeaders) {
                for (var key in configuredHeaders) {
                    if (configuredHeaders.hasOwnProperty(key)) {
                        headers[key.toLowerCase()] = configuredHeaders[key];
                    }
                }
            }
            var crossDomain = config.crossDomain;
            if (!crossDomain && !('x-requested-with' in headers)) {
                headers['x-requested-with'] = 'XMLHttpRequest';
            }
            var withCredentials = config.withCredentials, xsrfCookieName = config.xsrfCookieName, xsrfHeaderName = config.xsrfHeaderName;
            if ((withCredentials || !crossDomain) && xsrfCookieName && xsrfHeaderName) {
                var xsrfCookie = (_b = (_a = document === null || document === void 0 ? void 0 : document.cookie.match(new RegExp("(^|;\\s*)(" + xsrfCookieName + ")=([^;]*)"))) === null || _a === void 0 ? void 0 : _a.pop()) !== null && _b !== void 0 ? _b : '';
                if (xsrfCookie) {
                    headers[xsrfHeaderName] = xsrfCookie;
                }
            }
            var body = extractContentTypeAndMaybeSerializeBody(configuredBody, headers);
            var _request = __assign(__assign({}, config), { url: url,
                headers: headers,
                body: body });
            var xhr;
            xhr = init.createXHR ? init.createXHR() : new XMLHttpRequest();
            {
                var progressSubscriber_1 = init.progressSubscriber, _c = init.includeDownloadProgress, includeDownloadProgress = _c === void 0 ? false : _c, _d = init.includeUploadProgress, includeUploadProgress = _d === void 0 ? false : _d;
                var addErrorEvent = function (type, errorFactory) {
                    xhr.addEventListener(type, function () {
                        var _a;
                        var error = errorFactory();
                        (_a = progressSubscriber_1 === null || progressSubscriber_1 === void 0 ? void 0 : progressSubscriber_1.error) === null || _a === void 0 ? void 0 : _a.call(progressSubscriber_1, error);
                        destination.error(error);
                    });
                };
                addErrorEvent('timeout', function () { return new AjaxTimeoutError(xhr, _request); });
                addErrorEvent('abort', function () { return new AjaxError('aborted', xhr, _request); });
                var createResponse_1 = function (direction, event) {
                    return new AjaxResponse(event, xhr, _request, direction + "_" + event.type);
                };
                var addProgressEvent_1 = function (target, type, direction) {
                    target.addEventListener(type, function (event) {
                        destination.next(createResponse_1(direction, event));
                    });
                };
                if (includeUploadProgress) {
                    [LOADSTART, PROGRESS, LOAD].forEach(function (type) { return addProgressEvent_1(xhr.upload, type, UPLOAD); });
                }
                if (progressSubscriber_1) {
                    [LOADSTART, PROGRESS].forEach(function (type) { return xhr.upload.addEventListener(type, function (e) { var _a; return (_a = progressSubscriber_1 === null || progressSubscriber_1 === void 0 ? void 0 : progressSubscriber_1.next) === null || _a === void 0 ? void 0 : _a.call(progressSubscriber_1, e); }); });
                }
                if (includeDownloadProgress) {
                    [LOADSTART, PROGRESS].forEach(function (type) { return addProgressEvent_1(xhr, type, DOWNLOAD); });
                }
                var emitError_1 = function (status) {
                    var msg = 'ajax error' + (status ? ' ' + status : '');
                    destination.error(new AjaxError(msg, xhr, _request));
                };
                xhr.addEventListener('error', function (e) {
                    var _a;
                    (_a = progressSubscriber_1 === null || progressSubscriber_1 === void 0 ? void 0 : progressSubscriber_1.error) === null || _a === void 0 ? void 0 : _a.call(progressSubscriber_1, e);
                    emitError_1();
                });
                xhr.addEventListener(LOAD, function (event) {
                    var _a, _b;
                    var status = xhr.status;
                    if (status < 400) {
                        (_a = progressSubscriber_1 === null || progressSubscriber_1 === void 0 ? void 0 : progressSubscriber_1.complete) === null || _a === void 0 ? void 0 : _a.call(progressSubscriber_1);
                        var response = void 0;
                        try {
                            response = createResponse_1(DOWNLOAD, event);
                        }
                        catch (err) {
                            destination.error(err);
                            return;
                        }
                        destination.next(response);
                        destination.complete();
                    }
                    else {
                        (_b = progressSubscriber_1 === null || progressSubscriber_1 === void 0 ? void 0 : progressSubscriber_1.error) === null || _b === void 0 ? void 0 : _b.call(progressSubscriber_1, event);
                        emitError_1(status);
                    }
                });
            }
            var user = _request.user, method = _request.method, async = _request.async;
            if (user) {
                xhr.open(method, url, async, user, _request.password);
            }
            else {
                xhr.open(method, url, async);
            }
            if (async) {
                xhr.timeout = _request.timeout;
                xhr.responseType = _request.responseType;
            }
            if ('withCredentials' in xhr) {
                xhr.withCredentials = _request.withCredentials;
            }
            for (var key in headers) {
                if (headers.hasOwnProperty(key)) {
                    xhr.setRequestHeader(key, headers[key]);
                }
            }
            if (body) {
                xhr.send(body);
            }
            else {
                xhr.send();
            }
            return function () {
                if (xhr && xhr.readyState !== 4) {
                    xhr.abort();
                }
            };
        });
    }
    function extractContentTypeAndMaybeSerializeBody(body, headers) {
        var _a;
        if (!body ||
            typeof body === 'string' ||
            isFormData(body) ||
            isURLSearchParams(body) ||
            isArrayBuffer(body) ||
            isFile(body) ||
            isBlob(body) ||
            isReadableStream(body)) {
            return body;
        }
        if (isArrayBufferView(body)) {
            return body.buffer;
        }
        if (typeof body === 'object') {
            headers['content-type'] = (_a = headers['content-type']) !== null && _a !== void 0 ? _a : 'application/json;charset=utf-8';
            return JSON.stringify(body);
        }
        throw new TypeError('Unknown body type');
    }
    var _toString = Object.prototype.toString;
    function toStringCheck(obj, name) {
        return _toString.call(obj) === "[object " + name + "]";
    }
    function isArrayBuffer(body) {
        return toStringCheck(body, 'ArrayBuffer');
    }
    function isFile(body) {
        return toStringCheck(body, 'File');
    }
    function isBlob(body) {
        return toStringCheck(body, 'Blob');
    }
    function isArrayBufferView(body) {
        return typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView(body);
    }
    function isFormData(body) {
        return typeof FormData !== 'undefined' && body instanceof FormData;
    }
    function isURLSearchParams(body) {
        return typeof URLSearchParams !== 'undefined' && body instanceof URLSearchParams;
    }
    function isReadableStream(body) {
        return typeof ReadableStream !== 'undefined' && body instanceof ReadableStream;
    }



    var _ajax = /*#__PURE__*/Object.freeze({
        ajax: ajax,
        AjaxError: AjaxError,
        AjaxTimeoutError: AjaxTimeoutError,
        AjaxResponse: AjaxResponse
    });

    var DEFAULT_WEBSOCKET_CONFIG = {
        url: '',
        deserializer: function (e) { return JSON.parse(e.data); },
        serializer: function (value) { return JSON.stringify(value); },
    };
    var WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT = 'WebSocketSubject.error must be called with an object with an error code, and an optional reason: { code: number, reason: string }';
    var WebSocketSubject = (function (_super) {
        __extends(WebSocketSubject, _super);
        function WebSocketSubject(urlConfigOrSource, destination) {
            var _this = _super.call(this) || this;
            _this._socket = null;
            if (urlConfigOrSource instanceof Observable) {
                _this.destination = destination;
                _this.source = urlConfigOrSource;
            }
            else {
                var config = (_this._config = __assign({}, DEFAULT_WEBSOCKET_CONFIG));
                _this._output = new Subject();
                if (typeof urlConfigOrSource === 'string') {
                    config.url = urlConfigOrSource;
                }
                else {
                    for (var key in urlConfigOrSource) {
                        if (urlConfigOrSource.hasOwnProperty(key)) {
                            config[key] = urlConfigOrSource[key];
                        }
                    }
                }
                if (!config.WebSocketCtor && WebSocket) {
                    config.WebSocketCtor = WebSocket;
                }
                else if (!config.WebSocketCtor) {
                    throw new Error('no WebSocket constructor can be found');
                }
                _this.destination = new ReplaySubject();
            }
            return _this;
        }
        WebSocketSubject.prototype.lift = function (operator) {
            var sock = new WebSocketSubject(this._config, this.destination);
            sock.operator = operator;
            sock.source = this;
            return sock;
        };
        WebSocketSubject.prototype._resetState = function () {
            this._socket = null;
            if (!this.source) {
                this.destination = new ReplaySubject();
            }
            this._output = new Subject();
        };
        WebSocketSubject.prototype.multiplex = function (subMsg, unsubMsg, messageFilter) {
            var self = this;
            return new Observable(function (observer) {
                try {
                    self.next(subMsg());
                }
                catch (err) {
                    observer.error(err);
                }
                var subscription = self.subscribe({
                    next: function (x) {
                        try {
                            if (messageFilter(x)) {
                                observer.next(x);
                            }
                        }
                        catch (err) {
                            observer.error(err);
                        }
                    },
                    error: function (err) { return observer.error(err); },
                    complete: function () { return observer.complete(); },
                });
                return function () {
                    try {
                        self.next(unsubMsg());
                    }
                    catch (err) {
                        observer.error(err);
                    }
                    subscription.unsubscribe();
                };
            });
        };
        WebSocketSubject.prototype._connectSocket = function () {
            var _this = this;
            var _a = this._config, WebSocketCtor = _a.WebSocketCtor, protocol = _a.protocol, url = _a.url, binaryType = _a.binaryType;
            var observer = this._output;
            var socket = null;
            try {
                socket = protocol ? new WebSocketCtor(url, protocol) : new WebSocketCtor(url);
                this._socket = socket;
                if (binaryType) {
                    this._socket.binaryType = binaryType;
                }
            }
            catch (e) {
                observer.error(e);
                return;
            }
            var subscription = new Subscription(function () {
                _this._socket = null;
                if (socket && socket.readyState === 1) {
                    socket.close();
                }
            });
            socket.onopen = function (evt) {
                var _socket = _this._socket;
                if (!_socket) {
                    socket.close();
                    _this._resetState();
                    return;
                }
                var openObserver = _this._config.openObserver;
                if (openObserver) {
                    openObserver.next(evt);
                }
                var queue = _this.destination;
                _this.destination = Subscriber.create(function (x) {
                    if (socket.readyState === 1) {
                        try {
                            var serializer = _this._config.serializer;
                            socket.send(serializer(x));
                        }
                        catch (e) {
                            _this.destination.error(e);
                        }
                    }
                }, function (err) {
                    var closingObserver = _this._config.closingObserver;
                    if (closingObserver) {
                        closingObserver.next(undefined);
                    }
                    if (err && err.code) {
                        socket.close(err.code, err.reason);
                    }
                    else {
                        observer.error(new TypeError(WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT));
                    }
                    _this._resetState();
                }, function () {
                    var closingObserver = _this._config.closingObserver;
                    if (closingObserver) {
                        closingObserver.next(undefined);
                    }
                    socket.close();
                    _this._resetState();
                });
                if (queue && queue instanceof ReplaySubject) {
                    subscription.add(queue.subscribe(_this.destination));
                }
            };
            socket.onerror = function (e) {
                _this._resetState();
                observer.error(e);
            };
            socket.onclose = function (e) {
                if (socket === _this._socket) {
                    _this._resetState();
                }
                var closeObserver = _this._config.closeObserver;
                if (closeObserver) {
                    closeObserver.next(e);
                }
                if (e.wasClean) {
                    observer.complete();
                }
                else {
                    observer.error(e);
                }
            };
            socket.onmessage = function (e) {
                try {
                    var deserializer = _this._config.deserializer;
                    observer.next(deserializer(e));
                }
                catch (err) {
                    observer.error(err);
                }
            };
        };
        WebSocketSubject.prototype._subscribe = function (subscriber) {
            var _this = this;
            var source = this.source;
            if (source) {
                return source.subscribe(subscriber);
            }
            if (!this._socket) {
                this._connectSocket();
            }
            this._output.subscribe(subscriber);
            subscriber.add(function () {
                var _socket = _this._socket;
                if (_this._output.observers.length === 0) {
                    if (_socket && (_socket.readyState === 1 || _socket.readyState === 0)) {
                        _socket.close();
                    }
                    _this._resetState();
                }
            });
            return subscriber;
        };
        WebSocketSubject.prototype.unsubscribe = function () {
            var _socket = this._socket;
            if (_socket && (_socket.readyState === 1 || _socket.readyState === 0)) {
                _socket.close();
            }
            this._resetState();
            _super.prototype.unsubscribe.call(this);
        };
        return WebSocketSubject;
    }(AnonymousSubject));

    function webSocket(urlConfigOrSource) {
        return new WebSocketSubject(urlConfigOrSource);
    }



    var _webSocket = /*#__PURE__*/Object.freeze({
        webSocket: webSocket,
        WebSocketSubject: WebSocketSubject
    });

    function fromFetch(input, initWithSelector) {
        if (initWithSelector === void 0) { initWithSelector = {}; }
        var selector = initWithSelector.selector, init = __rest(initWithSelector, ["selector"]);
        return new Observable(function (subscriber) {
            var controller = new AbortController();
            var signal = controller.signal;
            var abortable = true;
            var outerSignal = init.signal;
            if (outerSignal) {
                if (outerSignal.aborted) {
                    controller.abort();
                }
                else {
                    var outerSignalHandler_1 = function () {
                        if (!signal.aborted) {
                            controller.abort();
                        }
                    };
                    outerSignal.addEventListener('abort', outerSignalHandler_1);
                    subscriber.add(function () { return outerSignal.removeEventListener('abort', outerSignalHandler_1); });
                }
            }
            var perSubscriberInit = __assign(__assign({}, init), { signal: signal });
            var handleError = function (err) {
                abortable = false;
                subscriber.error(err);
            };
            fetch(input, perSubscriberInit)
                .then(function (response) {
                if (selector) {
                    innerFrom(selector(response)).subscribe(createOperatorSubscriber(subscriber, undefined, function () {
                        abortable = false;
                        subscriber.complete();
                    }, handleError));
                }
                else {
                    abortable = false;
                    subscriber.next(response);
                    subscriber.complete();
                }
            })
                .catch(handleError);
            return function () {
                if (abortable) {
                    controller.abort();
                }
            };
        });
    }



    var _fetch = /*#__PURE__*/Object.freeze({
        fromFetch: fromFetch
    });

    var operators = _operators;
    var testing = _testing;
    var ajax$1 = _ajax;
    var webSocket$1 = _webSocket;
    var fetch$1 = _fetch;

    exports.operators = operators;
    exports.testing = testing;
    exports.ajax = ajax$1;
    exports.webSocket = webSocket$1;
    exports.fetch = fetch$1;
    exports.Observable = Observable;
    exports.ConnectableObservable = ConnectableObservable;
    exports.observable = observable;
    exports.animationFrames = animationFrames;
    exports.Subject = Subject;
    exports.BehaviorSubject = BehaviorSubject;
    exports.ReplaySubject = ReplaySubject;
    exports.AsyncSubject = AsyncSubject;
    exports.asap = asap;
    exports.asapScheduler = asapScheduler;
    exports.async = async;
    exports.asyncScheduler = asyncScheduler;
    exports.queue = queue;
    exports.queueScheduler = queueScheduler;
    exports.animationFrame = animationFrame;
    exports.animationFrameScheduler = animationFrameScheduler;
    exports.VirtualTimeScheduler = VirtualTimeScheduler;
    exports.VirtualAction = VirtualAction;
    exports.Scheduler = Scheduler;
    exports.Subscription = Subscription;
    exports.Subscriber = Subscriber;
    exports.Notification = Notification;
    exports.pipe = pipe;
    exports.noop = noop;
    exports.identity = identity;
    exports.isObservable = isObservable;
    exports.lastValueFrom = lastValueFrom;
    exports.firstValueFrom = firstValueFrom;
    exports.ArgumentOutOfRangeError = ArgumentOutOfRangeError;
    exports.EmptyError = EmptyError;
    exports.NotFoundError = NotFoundError;
    exports.ObjectUnsubscribedError = ObjectUnsubscribedError;
    exports.SequenceError = SequenceError;
    exports.TimeoutError = TimeoutError;
    exports.UnsubscriptionError = UnsubscriptionError;
    exports.bindCallback = bindCallback;
    exports.bindNodeCallback = bindNodeCallback;
    exports.combineLatest = combineLatest;
    exports.concat = concat;
    exports.connectable = connectable;
    exports.defer = defer;
    exports.empty = empty;
    exports.forkJoin = forkJoin;
    exports.from = from;
    exports.fromEvent = fromEvent;
    exports.fromEventPattern = fromEventPattern;
    exports.generate = generate;
    exports.iif = iif;
    exports.interval = interval;
    exports.merge = merge;
    exports.never = never;
    exports.of = of;
    exports.onErrorResumeNext = onErrorResumeNext$1;
    exports.pairs = pairs;
    exports.partition = partition;
    exports.race = race;
    exports.range = range;
    exports.throwError = throwError;
    exports.timer = timer;
    exports.using = using;
    exports.zip = zip;
    exports.scheduled = scheduled;
    exports.EMPTY = EMPTY;
    exports.NEVER = NEVER;
    exports.config = config;
    exports.audit = audit;
    exports.auditTime = auditTime;
    exports.buffer = buffer;
    exports.bufferCount = bufferCount;
    exports.bufferTime = bufferTime;
    exports.bufferToggle = bufferToggle;
    exports.bufferWhen = bufferWhen;
    exports.catchError = catchError;
    exports.combineAll = combineAll;
    exports.combineLatestAll = combineLatestAll;
    exports.combineLatestWith = combineLatestWith;
    exports.concatAll = concatAll;
    exports.concatMap = concatMap;
    exports.concatMapTo = concatMapTo;
    exports.concatWith = concatWith;
    exports.connect = connect;
    exports.count = count;
    exports.debounce = debounce;
    exports.debounceTime = debounceTime;
    exports.defaultIfEmpty = defaultIfEmpty;
    exports.delay = delay;
    exports.delayWhen = delayWhen;
    exports.dematerialize = dematerialize;
    exports.distinct = distinct;
    exports.distinctUntilChanged = distinctUntilChanged;
    exports.distinctUntilKeyChanged = distinctUntilKeyChanged;
    exports.elementAt = elementAt;
    exports.endWith = endWith;
    exports.every = every;
    exports.exhaust = exhaust;
    exports.exhaustAll = exhaustAll;
    exports.exhaustMap = exhaustMap;
    exports.expand = expand;
    exports.filter = filter;
    exports.finalize = finalize;
    exports.find = find;
    exports.findIndex = findIndex;
    exports.first = first;
    exports.groupBy = groupBy;
    exports.ignoreElements = ignoreElements;
    exports.isEmpty = isEmpty;
    exports.last = last$1;
    exports.map = map;
    exports.mapTo = mapTo;
    exports.materialize = materialize;
    exports.max = max;
    exports.mergeAll = mergeAll;
    exports.flatMap = flatMap;
    exports.mergeMap = mergeMap;
    exports.mergeMapTo = mergeMapTo;
    exports.mergeScan = mergeScan;
    exports.mergeWith = mergeWith;
    exports.min = min;
    exports.multicast = multicast;
    exports.observeOn = observeOn;
    exports.pairwise = pairwise;
    exports.pluck = pluck;
    exports.publish = publish;
    exports.publishBehavior = publishBehavior;
    exports.publishLast = publishLast;
    exports.publishReplay = publishReplay;
    exports.raceWith = raceWith;
    exports.reduce = reduce;
    exports.repeat = repeat;
    exports.repeatWhen = repeatWhen;
    exports.retry = retry;
    exports.retryWhen = retryWhen;
    exports.refCount = refCount;
    exports.sample = sample;
    exports.sampleTime = sampleTime;
    exports.scan = scan;
    exports.sequenceEqual = sequenceEqual;
    exports.share = share;
    exports.shareReplay = shareReplay;
    exports.single = single;
    exports.skip = skip;
    exports.skipLast = skipLast;
    exports.skipUntil = skipUntil;
    exports.skipWhile = skipWhile;
    exports.startWith = startWith;
    exports.subscribeOn = subscribeOn;
    exports.switchAll = switchAll;
    exports.switchMap = switchMap;
    exports.switchMapTo = switchMapTo;
    exports.switchScan = switchScan;
    exports.take = take;
    exports.takeLast = takeLast;
    exports.takeUntil = takeUntil;
    exports.takeWhile = takeWhile;
    exports.tap = tap;
    exports.throttle = throttle;
    exports.throttleTime = throttleTime;
    exports.throwIfEmpty = throwIfEmpty;
    exports.timeInterval = timeInterval;
    exports.timeout = timeout;
    exports.timeoutWith = timeoutWith;
    exports.timestamp = timestamp;
    exports.toArray = toArray;
    exports.window = window;
    exports.windowCount = windowCount;
    exports.windowTime = windowTime;
    exports.windowToggle = windowToggle;
    exports.windowWhen = windowWhen;
    exports.withLatestFrom = withLatestFrom;
    exports.zipAll = zipAll;
    exports.zipWith = zipWith;

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

})));

//# sourceMappingURL=rxjs.umd.js.map

/**
  @license
  Apache License 2.0 https://github.com/ReactiveX/RxJS/blob/master/LICENSE.txt
 **/
/**
  @license
  Apache License 2.0 https://github.com/ReactiveX/RxJS/blob/master/LICENSE.txt
 **/
/*
 *****************************************************************************
    Copyright (c) Microsoft Corporation.

    Permission to use, copy, modify, and/or distribute this software for any
    purpose with or without fee is hereby granted.

    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.
*****************************************************************************/
(function(g,y){"object"===typeof exports&&"undefined"!==typeof module?y(exports):"function"===typeof define&&define.amd?define("rxjs",["exports"],y):y(g.rxjs={})})(this,function(g){function y(b,a){function c(){this.constructor=b}if("function"!==typeof a&&null!==a)throw new TypeError("Class extends value "+String(a)+" is not a constructor or null");Ua(b,a);b.prototype=null===a?Object.create(a):(c.prototype=a.prototype,new c)}function Zd(b,a){var c={},d;for(d in b)Object.prototype.hasOwnProperty.call(b,
d)&&0>a.indexOf(d)&&(c[d]=b[d]);if(null!=b&&"function"===typeof Object.getOwnPropertySymbols){var e=0;for(d=Object.getOwnPropertySymbols(b);e<d.length;e++)0>a.indexOf(d[e])&&Object.prototype.propertyIsEnumerable.call(b,d[e])&&(c[d[e]]=b[d[e]])}return c}function $d(b,a,c,d){function e(a){return a instanceof c?a:new c(function(b){b(a)})}return new (c||(c=Promise))(function(c,h){function f(a){try{w(d.next(a))}catch(v){h(v)}}function k(a){try{w(d["throw"](a))}catch(v){h(v)}}function w(a){a.done?c(a.value):
e(a.value).then(f,k)}w((d=d.apply(b,a||[])).next())})}function Va(b,a){function c(a){return function(b){return d([a,b])}}function d(c){if(f)throw new TypeError("Generator is already executing.");for(;e;)try{if(f=1,h&&(l=c[0]&2?h["return"]:c[0]?h["throw"]||((l=h["return"])&&l.call(h),0):h.next)&&!(l=l.call(h,c[1])).done)return l;if(h=0,l)c=[c[0]&2,l.value];switch(c[0]){case 0:case 1:l=c;break;case 4:return e.label++,{value:c[1],done:!1};case 5:e.label++;h=c[1];c=[0];continue;case 7:c=e.ops.pop();e.trys.pop();
continue;default:if(!(l=e.trys,l=0<l.length&&l[l.length-1])&&(6===c[0]||2===c[0])){e=0;continue}if(3===c[0]&&(!l||c[1]>l[0]&&c[1]<l[3]))e.label=c[1];else if(6===c[0]&&e.label<l[1])e.label=l[1],l=c;else if(l&&e.label<l[2])e.label=l[2],e.ops.push(c);else{l[2]&&e.ops.pop();e.trys.pop();continue}}c=a.call(b,e)}catch(r){c=[6,r],h=0}finally{f=l=0}if(c[0]&5)throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}var e={label:0,sent:function(){if(l[0]&1)throw l[1];return l[1]},trys:[],ops:[]},f,h,l,k;return k=
{next:c(0),"throw":c(1),"return":c(2)},"function"===typeof Symbol&&(k[Symbol.iterator]=function(){return this}),k}function F(b){var a="function"===typeof Symbol&&Symbol.iterator,c=a&&b[a],d=0;if(c)return c.call(b);if(b&&"number"===typeof b.length)return{next:function(){b&&d>=b.length&&(b=void 0);return{value:b&&b[d++],done:!b}}};throw new TypeError(a?"Object is not iterable.":"Symbol.iterator is not defined.");}function x(b,a){var c="function"===typeof Symbol&&b[Symbol.iterator];if(!c)return b;b=
c.call(b);var d,e=[],f;try{for(;(void 0===a||0<a--)&&!(d=b.next()).done;)e.push(d.value)}catch(h){f={error:h}}finally{try{d&&!d.done&&(c=b["return"])&&c.call(b)}finally{if(f)throw f.error;}}return e}function z(b,a,c){if(c||2===arguments.length)for(var d=0,e=a.length,f;d<e;d++)!f&&d in a||(f||(f=Array.prototype.slice.call(a,0,d)),f[d]=a[d]);return b.concat(f||Array.prototype.slice.call(a))}function da(b){return this instanceof da?(this.v=b,this):new da(b)}function ae(b,a,c){function d(a){k[a]&&(w[a]=
function(c){return new Promise(function(b,d){1<g.push([a,c,b,d])||e(a,c)})})}function e(a,c){try{var b=k[a](c);b.value instanceof da?Promise.resolve(b.value.v).then(f,h):l(g[0][2],b)}catch(u){l(g[0][3],u)}}function f(a){e("next",a)}function h(a){e("throw",a)}function l(a,c){(a(c),g.shift(),g.length)&&e(g[0][0],g[0][1])}if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var k=c.apply(b,a||[]),w,g=[];return w={},d("next"),d("throw"),d("return"),w[Symbol.asyncIterator]=
function(){return this},w}function be(b){function a(a){e[a]=b[a]&&function(d){return new Promise(function(e,f){d=b[a](d);c(e,f,d.done,d.value)})}}function c(a,c,b,d){Promise.resolve(d).then(function(c){a({value:c,done:b})},c)}if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var d=b[Symbol.asyncIterator],e;return d?d.call(b):(b="function"===typeof F?F(b):b[Symbol.iterator](),e={},a("next"),a("throw"),a("return"),e[Symbol.asyncIterator]=function(){return this},e)}
function q(b){return"function"===typeof b}function R(b){b=b(function(a){Error.call(a);a.stack=Error().stack});b.prototype=Object.create(Error.prototype);return b.prototype.constructor=b}function M(b,a){b&&(a=b.indexOf(a),0<=a&&b.splice(a,1))}function Hb(b){return b instanceof C||b&&"closed"in b&&q(b.remove)&&q(b.add)&&q(b.unsubscribe)}function Ib(b){ea.setTimeout(function(){var a=S.onUnhandledError;if(a)a(b);else throw b;})}function D(){}function J(b,a,c){return{kind:b,value:a,error:c}}function Ca(b){if(S.useDeprecatedSynchronousErrorHandling){var a=
!V;a&&(V={errorThrown:!1,error:null});b();if(a&&(a=V,b=a.errorThrown,a=a.error,V=null,b))throw a;}else b()}function Da(b){S.useDeprecatedSynchronousErrorHandling?S.useDeprecatedSynchronousErrorHandling&&V&&(V.errorThrown=!0,V.error=b):Ib(b)}function Wa(b,a){var c=S.onStoppedNotification;c&&ea.setTimeout(function(){return c(b,a)})}function E(b){return b}function Xa(){for(var b=[],a=0;a<arguments.length;a++)b[a]=arguments[a];return Jb(b)}function Jb(b){return 0===b.length?E:1===b.length?b[0]:function(a){return b.reduce(function(a,
b){return b(a)},a)}}function Kb(b){var a;return null!==(a=null!==b&&void 0!==b?b:S.Promise)&&void 0!==a?a:Promise}function ce(b){var a;(a=b&&b instanceof oa)||(a=b&&q(b.next)&&q(b.error)&&q(b.complete)&&Hb(b));return a}function n(b){return function(a){if(q(null===a||void 0===a?void 0:a.lift))return a.lift(function(a){try{return b(a,this)}catch(d){this.error(d)}});throw new TypeError("Unable to lift unknown Observable type");}}function m(b,a,c,d,e){return new Lb(b,a,c,d,e)}function Ya(){return n(function(b,
a){var c=null;b._refCount++;var d=m(a,void 0,void 0,void 0,function(){if(!b||0>=b._refCount||0<--b._refCount)c=null;else{var d=b._connection,f=c;c=null;!d||f&&d!==f||d.unsubscribe();a.unsubscribe()}});b.subscribe(d);d.closed||(c=b.connect())})}function Mb(b){var a=T.schedule;return new p(function(c){var d=new C,e=b||Ea,f=e.now(),h=function(l){var k=e.now();c.next({timestamp:b?k:l,elapsed:k-f});c.closed||d.add(a(h))};d.add(a(h));return d})}function Nb(b){return b in Za?(delete Za[b],!0):!1}function de(b){return new p(function(a){return b.schedule(function(){return a.complete()})})}
function Fa(b){return b&&q(b.schedule)}function pa(b){return q(b[b.length-1])?b.pop():void 0}function N(b){return Fa(b[b.length-1])?b.pop():void 0}function Ob(b){return Symbol.asyncIterator&&q(null===b||void 0===b?void 0:b[Symbol.asyncIterator])}function Pb(b){return new TypeError("You provided "+(null!==b&&"object"===typeof b?"an invalid object":"'"+b+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Qb(b){return q(null===
b||void 0===b?void 0:b[$a])}function Rb(b){return ae(this,arguments,function(){var a,c,d,e;return Va(this,function(f){switch(f.label){case 0:a=b.getReader(),f.label=1;case 1:f.trys.push([1,,9,10]),f.label=2;case 2:return[4,da(a.read())];case 3:return c=f.sent(),d=c.value,(e=c.done)?[4,da(void 0)]:[3,5];case 4:return[2,f.sent()];case 5:return[4,da(d)];case 6:return[4,f.sent()];case 7:return f.sent(),[3,2];case 8:return[3,10];case 9:return a.releaseLock(),[7];case 10:return[2]}})})}function t(b){if(b instanceof
p)return b;if(null!=b){if(q(b[qa]))return ee(b);if(ab(b))return fe(b);if(q(null===b||void 0===b?void 0:b.then))return ge(b);if(Ob(b))return Sb(b);if(Qb(b))return he(b);if(q(null===b||void 0===b?void 0:b.getReader))return Sb(Rb(b))}throw Pb(b);}function ee(b){return new p(function(a){var c=b[qa]();if(q(c.subscribe))return c.subscribe(a);throw new TypeError("Provided object does not correctly implement Symbol.observable");})}function fe(b){return new p(function(a){for(var c=0;c<b.length&&!a.closed;c++)a.next(b[c]);
a.complete()})}function ge(b){return new p(function(a){b.then(function(b){a.closed||(a.next(b),a.complete())},function(b){return a.error(b)}).then(null,Ib)})}function he(b){return new p(function(a){var c,d;try{for(var e=F(b),f=e.next();!f.done;f=e.next())if(a.next(f.value),a.closed)return}catch(h){c={error:h}}finally{try{f&&!f.done&&(d=e.return)&&d.call(e)}finally{if(c)throw c.error;}}a.complete()})}function Sb(b){return new p(function(a){ie(b,a).catch(function(b){return a.error(b)})})}function ie(b,
a){var c,d,e,f;return $d(this,void 0,void 0,function(){var h,l;return Va(this,function(k){switch(k.label){case 0:k.trys.push([0,5,6,11]),c=be(b),k.label=1;case 1:return[4,c.next()];case 2:if(d=k.sent(),d.done)return[3,4];h=d.value;a.next(h);if(a.closed)return[2];k.label=3;case 3:return[3,1];case 4:return[3,11];case 5:return l=k.sent(),e={error:l},[3,11];case 6:return k.trys.push([6,,9,10]),d&&!d.done&&(f=c.return)?[4,f.call(c)]:[3,8];case 7:k.sent(),k.label=8;case 8:return[3,10];case 9:if(e)throw e.error;
return[7];case 10:return[7];case 11:return a.complete(),[2]}})})}function G(b,a,c,d,e){void 0===d&&(d=0);void 0===e&&(e=!1);a=a.schedule(function(){c();e?b.add(this.schedule(null,d)):this.unsubscribe()},d);b.add(a);if(!e)return a}function ra(b,a){void 0===a&&(a=0);return n(function(c,d){c.subscribe(m(d,function(c){return G(d,b,function(){return d.next(c)},a)},function(){return G(d,b,function(){return d.complete()},a)},function(c){return G(d,b,function(){return d.error(c)},a)}))})}function sa(b,a){void 0===
a&&(a=0);return n(function(c,d){d.add(b.schedule(function(){return c.subscribe(d)},a))})}function je(b,a){return new p(function(c){var d=0;return a.schedule(function(){d===b.length?c.complete():(c.next(b[d++]),c.closed||this.schedule())})})}function Tb(b,a){return new p(function(c){var d;G(c,a,function(){d=b[$a]();G(c,a,function(){var a,b,h;try{a=d.next(),b=a.value,h=a.done}catch(l){c.error(l);return}h?c.complete():c.next(b)},0,!0)});return function(){return q(null===d||void 0===d?void 0:d.return)&&
d.return()}})}function Ub(b,a){if(!b)throw Error("Iterable cannot be null");return new p(function(c){G(c,a,function(){var d=b[Symbol.asyncIterator]();G(c,a,function(){d.next().then(function(a){a.done?c.complete():c.next(a.value)})},0,!0)})})}function Vb(b,a){if(null!=b){if(q(b[qa]))return t(b).pipe(sa(a),ra(a));if(ab(b))return je(b,a);if(q(null===b||void 0===b?void 0:b.then))return t(b).pipe(sa(a),ra(a));if(Ob(b))return Ub(b,a);if(Qb(b))return Tb(b,a);if(q(null===b||void 0===b?void 0:b.getReader))return Ub(Rb(b),
a)}throw Pb(b);}function O(b,a){return a?Vb(b,a):t(b)}function bb(){for(var b=[],a=0;a<arguments.length;a++)b[a]=arguments[a];a=N(b);return O(b,a)}function Wb(b,a){var c=q(b)?b:function(){return b},d=function(a){return a.error(c())};return new p(a?function(b){return a.schedule(d,0,b)}:d)}function Ga(b,a){var c,d,e,f=b.kind,h=b.value;b=b.error;if("string"!==typeof f)throw new TypeError('Invalid notification, missing "kind"');"N"===f?null===(c=a.next)||void 0===c?void 0:c.call(a,h):"E"===f?null===(d=
a.error)||void 0===d?void 0:d.call(a,b):null===(e=a.complete)||void 0===e?void 0:e.call(a)}function cb(b){return b instanceof Date&&!isNaN(b)}function db(b,a){b=cb(b)?{first:b}:"number"===typeof b?{each:b}:b;var c=b.first,d=b.each,e=b.with,f=void 0===e?ke:e,e=b.scheduler,h=void 0===e?null!==a&&void 0!==a?a:I:e;a=b.meta;var l=void 0===a?null:a;if(null==c&&null==d)throw new TypeError("No timeout provided.");return n(function(a,b){var e,k,g=null,w=0,u=function(a){k=G(b,h,function(){try{e.unsubscribe(),
t(f({meta:l,lastValue:g,seen:w})).subscribe(b)}catch(W){b.error(W)}},a)};e=a.subscribe(m(b,function(a){null===k||void 0===k?void 0:k.unsubscribe();w++;b.next(g=a);0<d&&u(d)},void 0,void 0,function(){(null===k||void 0===k?0:k.closed)||(null===k||void 0===k?void 0:k.unsubscribe());g=null}));!w&&u(null!=c?"number"===typeof c?c:+c-h.now():d)})}function ke(b){throw new Xb(b);}function P(b,a){return n(function(c,d){var e=0;c.subscribe(m(d,function(c){d.next(b.call(a,c,e++))}))})}function X(b){return P(function(a){return le(a)?
b.apply(void 0,z([],x(a))):b(a)})}function Ha(b,a,c,d){if(c)if(Fa(c))d=c;else return function(){for(var e=[],f=0;f<arguments.length;f++)e[f]=arguments[f];return Ha(b,a,d).apply(this,e).pipe(X(c))};return d?function(){for(var c=[],f=0;f<arguments.length;f++)c[f]=arguments[f];return Ha(b,a).apply(this,c).pipe(sa(d),ra(d))}:function(){for(var c=this,d=[],h=0;h<arguments.length;h++)d[h]=arguments[h];var l=new eb,k=!0;return new p(function(e){e=l.subscribe(e);if(k){var f=k=!1,h=!1;a.apply(c,z(z([],x(d)),
[function(){for(var a=[],c=0;c<arguments.length;c++)a[c]=arguments[c];if(b&&(c=a.shift(),null!=c)){l.error(c);return}l.next(1<a.length?a:a[0]);h=!0;f&&l.complete()}]));h&&l.complete();f=!0}return e})}}function Yb(b){if(1===b.length){var a=b[0];if(me(a))return{args:a,keys:null};if(a&&"object"===typeof a&&ne(a)===oe)return b=pe(a),{args:b.map(function(b){return a[b]}),keys:b}}return{args:b,keys:null}}function Zb(b,a){return b.reduce(function(b,d,e){return b[d]=a[e],b},{})}function $b(){for(var b=[],
a=0;a<arguments.length;a++)b[a]=arguments[a];var c=N(b),a=pa(b),b=Yb(b),d=b.args,e=b.keys;if(0===d.length)return O([],c);c=new p(ac(d,c,e?function(a){return Zb(e,a)}:E));return a?c.pipe(X(a)):c}function ac(b,a,c){void 0===c&&(c=E);return function(d){bc(a,function(){for(var e=b.length,f=Array(e),h=e,l=e,k=function(e){bc(a,function(){var k=!1;O(b[e],a).subscribe(m(d,function(a){f[e]=a;k||(k=!0,l--);l||d.next(c(f.slice()))},function(){--h||d.complete()}))},d)},g=0;g<e;g++)k(g)},d)}}function bc(b,a,c){b?
G(c,b,a):a()}function fb(b,a,c,d,e,f,h,l){var k=[],g=0,r=0,v=!1,A=function(a){return g<d?n(a):k.push(a)},n=function(b){f&&a.next(b);g++;var l=!1;t(c(b,r++)).subscribe(m(a,function(b){null===e||void 0===e?void 0:e(b);f?A(b):a.next(b)},function(){l=!0},void 0,function(){if(l)try{g--;for(var b=function(){var b=k.shift();h?G(a,h,function(){return n(b)}):n(b)};k.length&&g<d;)b();!v||k.length||g||a.complete()}catch(Y){a.error(Y)}}))};b.subscribe(m(a,A,function(){v=!0;!v||k.length||g||a.complete()}));return function(){null===
l||void 0===l?void 0:l()}}function H(b,a,c){void 0===c&&(c=Infinity);if(q(a))return H(function(c,e){return P(function(b,d){return a(c,b,e,d)})(t(b(c,e)))},c);"number"===typeof a&&(c=a);return n(function(a,e){return fb(a,e,b,c)})}function ta(b){void 0===b&&(b=Infinity);return H(E,b)}function Ia(){return ta(1)}function ua(){for(var b=[],a=0;a<arguments.length;a++)b[a]=arguments[a];return Ia()(O(b,N(b)))}function Ja(b){return new p(function(a){t(b()).subscribe(a)})}function gb(b,a,c,d){q(c)&&(d=c,c=
void 0);if(d)return gb(b,a,c).pipe(X(d));d=x(qe(b)?re.map(function(d){return function(e){return b[d](a,e,c)}}):se(b)?te.map(cc(b,a)):ue(b)?ve.map(cc(b,a)):[],2);var e=d[0],f=d[1];if(!e&&ab(b))return H(function(b){return gb(b,a,c)})(t(b));if(!e)throw new TypeError("Invalid event target");return new p(function(a){var b=function(){for(var b=[],c=0;c<arguments.length;c++)b[c]=arguments[c];return a.next(1<b.length?b:b[0])};e(b);return function(){return f(b)}})}function cc(b,a){return function(c){return function(d){return b[c](a,
d)}}}function se(b){return q(b.addListener)&&q(b.removeListener)}function ue(b){return q(b.on)&&q(b.off)}function qe(b){return q(b.addEventListener)&&q(b.removeEventListener)}function dc(b,a,c){return c?dc(b,a).pipe(X(c)):new p(function(c){var d=function(){for(var a=[],b=0;b<arguments.length;b++)a[b]=arguments[b];return c.next(1===a.length?a[0]:a)},f=b(d);return q(a)?function(){return a(d,f)}:void 0})}function Z(b,a,c){void 0===b&&(b=0);void 0===c&&(c=hb);var d=-1;null!=a&&(Fa(a)?c=a:d=a);return new p(function(a){var e=
cb(b)?+b-c.now():b;0>e&&(e=0);var h=0;return c.schedule(function(){a.closed||(a.next(h++),0<=d?this.schedule(void 0,d):a.complete())},e)})}function ec(b,a){void 0===b&&(b=0);void 0===a&&(a=I);0>b&&(b=0);return Z(b,b,a)}function aa(b){return 1===b.length&&we(b[0])?b[0]:b}function fc(){for(var b=[],a=0;a<arguments.length;a++)b[a]=arguments[a];var c=aa(b);return n(function(a,b){var d=z([a],x(c)),e=function(){if(!b.closed)if(0<d.length){var a=void 0;try{a=t(d.shift())}catch(w){e();return}var c=m(b,void 0,
D,D);a.subscribe(c);c.add(e)}else b.complete()};e()})}function gc(b,a){return function(c,d){return!b.call(a,c,d)}}function L(b,a){return n(function(c,d){var e=0;c.subscribe(m(d,function(c){return b.call(a,c,e++)&&d.next(c)}))})}function hc(b){return function(a){for(var c=[],d=function(d){c.push(t(b[d]).subscribe(m(a,function(b){if(c){for(var e=0;e<c.length;e++)e!==d&&c[e].unsubscribe();c=null}a.next(b)})))},e=0;c&&!a.closed&&e<b.length;e++)d(e)}}function ib(){for(var b=[],a=0;a<arguments.length;a++)b[a]=
arguments[a];var c=pa(b),d=aa(b);return d.length?new p(function(a){var b=d.map(function(){return[]}),e=d.map(function(){return!1});a.add(function(){b=e=null});for(var l=function(f){t(d[f]).subscribe(m(a,function(d){b[f].push(d);b.every(function(a){return a.length})&&(d=b.map(function(a){return a.shift()}),a.next(c?c.apply(void 0,z([],x(d))):d),b.some(function(a,b){return!a.length&&e[b]})&&a.complete())},function(){e[f]=!0;!b[f].length&&a.complete()}))},k=0;!a.closed&&k<d.length;k++)l(k);return function(){b=
e=null}}):K}function jb(b){return n(function(a,c){var d=!1,e=null,f=null,h=!1,l=function(){null===f||void 0===f?void 0:f.unsubscribe();f=null;if(d){d=!1;var a=e;e=null;c.next(a)}h&&c.complete()},k=function(){f=null;h&&c.complete()};a.subscribe(m(c,function(a){d=!0;e=a;f||t(b(a)).subscribe(f=m(c,l,k))},function(){h=!0;d&&f&&!f.closed||c.complete()}))})}function ic(b,a){void 0===a&&(a=I);return jb(function(){return Z(b,a)})}function jc(b){return n(function(a,c){var d=[];a.subscribe(m(c,function(a){return d.push(a)},
function(){c.next(d);c.complete()}));b.subscribe(m(c,function(){var a=d;d=[];c.next(a)},D));return function(){d=null}})}function kc(b,a){void 0===a&&(a=null);a=null!==a&&void 0!==a?a:b;return n(function(c,d){var e=[],f=0;c.subscribe(m(d,function(c){var h,k,g,r,v=null;0===f++%a&&e.push([]);try{for(var m=F(e),n=m.next();!n.done;n=m.next()){var u=n.value;u.push(c);b<=u.length&&(v=null!==v&&void 0!==v?v:[],v.push(u))}}catch(Y){h={error:Y}}finally{try{n&&!n.done&&(k=m.return)&&k.call(m)}finally{if(h)throw h.error;
}}if(v)try{for(var fa=F(v),W=fa.next();!W.done;W=fa.next())u=W.value,M(e,u),d.next(u)}catch(Y){g={error:Y}}finally{try{W&&!W.done&&(r=fa.return)&&r.call(fa)}finally{if(g)throw g.error;}}},function(){var a,b;try{for(var c=F(e),f=c.next();!f.done;f=c.next())d.next(f.value)}catch(r){a={error:r}}finally{try{f&&!f.done&&(b=c.return)&&b.call(c)}finally{if(a)throw a.error;}}d.complete()},void 0,function(){e=null}))})}function lc(b){for(var a,c,d=[],e=1;e<arguments.length;e++)d[e-1]=arguments[e];var f=null!==
(a=N(d))&&void 0!==a?a:I,h=null!==(c=d[0])&&void 0!==c?c:null,l=d[1]||Infinity;return n(function(a,c){var d=[],e=!1,k=function(a){var b=a.buffer;a.subs.unsubscribe();M(d,a);c.next(b);e&&g()},g=function(){if(d){var a=new C;c.add(a);var e={buffer:[],subs:a};d.push(e);G(a,f,function(){return k(e)},b)}};null!==h&&0<=h?G(c,f,g,h,!0):e=!0;g();var w=m(c,function(a){var b,c,e=d.slice();try{for(var f=F(e),h=f.next();!h.done;h=f.next()){var g=h.value,w=g.buffer;w.push(a);l<=w.length&&k(g)}}catch(ze){b={error:ze}}finally{try{h&&
!h.done&&(c=f.return)&&c.call(f)}finally{if(b)throw b.error;}}},function(){for(;null===d||void 0===d?0:d.length;)c.next(d.shift().buffer);null===w||void 0===w?void 0:w.unsubscribe();c.complete();c.unsubscribe()},void 0,function(){return d=null});a.subscribe(w)})}function mc(b,a){return n(function(c,d){var e=[];t(b).subscribe(m(d,function(b){var c=[];e.push(c);var f=new C;f.add(t(a(b)).subscribe(m(d,function(){M(e,c);d.next(c);f.unsubscribe()},D)))},D));c.subscribe(m(d,function(a){var b,c;try{for(var d=
F(e),f=d.next();!f.done;f=d.next())f.value.push(a)}catch(r){b={error:r}}finally{try{f&&!f.done&&(c=d.return)&&c.call(d)}finally{if(b)throw b.error;}}},function(){for(;0<e.length;)d.next(e.shift());d.complete()}))})}function nc(b){return n(function(a,c){var d=null,e=null,f=function(){null===e||void 0===e?void 0:e.unsubscribe();var a=d;d=[];a&&c.next(a);t(b()).subscribe(e=m(c,f,D))};f();a.subscribe(m(c,function(a){return null===d||void 0===d?void 0:d.push(a)},function(){d&&c.next(d);c.complete()},void 0,
function(){return d=e=null}))})}function kb(b){return n(function(a,c){var d=null,e=!1,f,d=a.subscribe(m(c,void 0,void 0,function(h){f=t(b(h,kb(b)(a)));d?(d.unsubscribe(),d=null,f.subscribe(c)):e=!0}));e&&(d.unsubscribe(),d=null,f.subscribe(c))})}function oc(b,a,c,d,e){return function(f,h){var l=c,k=a,g=0;f.subscribe(m(h,function(a){var c=g++;k=l?b(k,a,c):(l=!0,a);d&&h.next(k)},e&&function(){l&&h.next(k);h.complete()}))}}function ga(b,a){return n(oc(b,a,2<=arguments.length,!1,!0))}function lb(){return n(function(b,
a){ga(Ae,[])(b).subscribe(a)})}function pc(b,a){return Xa(lb(),H(function(a){return b(a)}),a?X(a):E)}function Ka(b){return pc($b,b)}function mb(){for(var b=[],a=0;a<arguments.length;a++)b[a]=arguments[a];return(a=pa(b))?Xa(mb.apply(void 0,z([],x(b))),X(a)):n(function(a,d){ac(z([a],x(aa(b))))(d)})}function qc(){for(var b=[],a=0;a<arguments.length;a++)b[a]=arguments[a];return mb.apply(void 0,z([],x(b)))}function La(b,a){return q(a)?H(b,a,1):H(b,1)}function rc(b,a){return q(a)?La(function(){return b},
a):La(function(){return b})}function sc(){for(var b=[],a=0;a<arguments.length;a++)b[a]=arguments[a];var c=N(b);return n(function(a,e){Ia()(O(z([a],x(b)),c)).subscribe(e)})}function tc(){for(var b=[],a=0;a<arguments.length;a++)b[a]=arguments[a];return sc.apply(void 0,z([],x(b)))}function Be(b){return new p(function(a){return b.subscribe(a)})}function Ma(b,a){void 0===a&&(a=Ce);var c=a.connector;return n(function(a,e){var d=c();t(b(Be(d))).subscribe(e);e.add(a.subscribe(d))})}function uc(b){return ga(function(a,
c,d){return!b||b(c,d)?a+1:a},0)}function vc(b){return n(function(a,c){var d=!1,e=null,f=null,h=function(){null===f||void 0===f?void 0:f.unsubscribe();f=null;if(d){d=!1;var a=e;e=null;c.next(a)}};a.subscribe(m(c,function(a){null===f||void 0===f?void 0:f.unsubscribe();d=!0;e=a;f=m(c,h,D);t(b(a)).subscribe(f)},function(){h();c.complete()},void 0,function(){e=f=null}))})}function wc(b,a){void 0===a&&(a=I);return n(function(c,d){function e(){var c=l+b,e=a.now();e<c?(f=this.schedule(void 0,c-e),d.add(f)):
k()}var f=null,h=null,l=null,k=function(){if(f){f.unsubscribe();f=null;var a=h;h=null;d.next(a)}};c.subscribe(m(d,function(c){h=c;l=a.now();f||(f=a.schedule(e,b),d.add(f))},function(){k();d.complete()},void 0,function(){h=f=null}))})}function va(b){return n(function(a,c){var d=!1;a.subscribe(m(c,function(a){d=!0;c.next(a)},function(){d||c.next(b);c.complete()}))})}function ha(b){return 0>=b?function(){return K}:n(function(a,c){var d=0;a.subscribe(m(c,function(a){++d<=b&&(c.next(a),b<=d&&c.complete())}))})}
function nb(){return n(function(b,a){b.subscribe(m(a,D))})}function ob(b){return P(function(){return b})}function Na(b,a){return a?function(c){return ua(a.pipe(ha(1),nb()),c.pipe(Na(b)))}:H(function(a,d){return b(a,d).pipe(ha(1),ob(a))})}function xc(b,a){void 0===a&&(a=I);var c=Z(b,a);return Na(function(){return c})}function yc(){return n(function(b,a){b.subscribe(m(a,function(b){return Ga(b,a)}))})}function zc(b,a){return n(function(c,d){var e=new Set;c.subscribe(m(d,function(a){var c=b?b(a):a;e.has(c)||
(e.add(c),d.next(a))}));null===a||void 0===a?void 0:a.subscribe(m(d,function(){return e.clear()},D))})}function pb(b,a){void 0===a&&(a=E);b=null!==b&&void 0!==b?b:De;return n(function(c,d){var e,f=!0;c.subscribe(m(d,function(c){var h=a(c);if(f||!b(e,h))f=!1,e=h,d.next(c)}))})}function De(b,a){return b===a}function Ac(b,a){return pb(function(c,d){return a?a(c[b],d[b]):c[b]===d[b]})}function wa(b){void 0===b&&(b=Ee);return n(function(a,c){var d=!1;a.subscribe(m(c,function(a){d=!0;c.next(a)},function(){return d?
c.complete():c.error(b())}))})}function Ee(){return new ba}function Bc(b,a){if(0>b)throw new qb;var c=2<=arguments.length;return function(d){return d.pipe(L(function(a,c){return c===b}),ha(1),c?va(a):wa(function(){return new qb}))}}function Cc(){for(var b=[],a=0;a<arguments.length;a++)b[a]=arguments[a];return function(a){return ua(a,bb.apply(void 0,z([],x(b))))}}function Dc(b,a){return n(function(c,d){var e=0;c.subscribe(m(d,function(f){b.call(a,f,e++,c)||(d.next(!1),d.complete())},function(){d.next(!0);
d.complete()}))})}function Oa(b,a){return a?function(c){return c.pipe(Oa(function(c,e){return t(b(c,e)).pipe(P(function(b,d){return a(c,b,e,d)}))}))}:n(function(a,d){var c=0,f=null,h=!1;a.subscribe(m(d,function(a){f||(f=m(d,void 0,function(){f=null;h&&d.complete()}),t(b(a,c++)).subscribe(f))},function(){h=!0;!f&&d.complete()}))})}function Pa(){return Oa(E)}function Ec(b,a,c){void 0===a&&(a=Infinity);a=1>(a||0)?Infinity:a;return n(function(d,e){return fb(d,e,b,a,void 0,!0,c)})}function Fc(b){return n(function(a,
c){try{a.subscribe(c)}finally{c.add(b)}})}function Gc(b,a){return n(Hc(b,a,"value"))}function Hc(b,a,c){var d="index"===c;return function(c,f){var e=0;c.subscribe(m(f,function(h){var l=e++;b.call(a,h,l,c)&&(f.next(d?l:h),f.complete())},function(){f.next(d?-1:void 0);f.complete()}))}}function Ic(b,a){return n(Hc(b,a,"index"))}function Jc(b,a){var c=2<=arguments.length;return function(d){return d.pipe(b?L(function(a,c){return b(a,c,d)}):E,ha(1),c?va(a):wa(function(){return new ba}))}}function Kc(b,
a,c,d){return n(function(e,f){function h(a,b){var c=new p(function(a){v++;var c=b.subscribe(a);return function(){c.unsubscribe();0===--v&&n&&Q.unsubscribe()}});c.key=a;return c}var l;a&&"function"!==typeof a?(c=a.duration,l=a.element,d=a.connector):l=a;var k=new Map,g=function(a){k.forEach(a);a(f)},r=function(a){return g(function(b){return b.error(a)})},v=0,n=!1,Q=new Lb(f,function(a){try{var e=b(a),g=k.get(e);if(!g){k.set(e,g=d?d():new B);var w=h(e,g);f.next(w);if(c){var v=m(g,function(){g.complete();
null===v||void 0===v?void 0:v.unsubscribe()},void 0,void 0,function(){return k.delete(e)});Q.add(t(c(w)).subscribe(v))}}g.next(l?l(a):a)}catch(xe){r(xe)}},function(){return g(function(a){return a.complete()})},r,function(){return k.clear()},function(){n=!0;return 0===v});e.subscribe(Q)})}function Lc(){return n(function(b,a){b.subscribe(m(a,function(){a.next(!1);a.complete()},function(){a.next(!0);a.complete()}))})}function rb(b){return 0>=b?function(){return K}:n(function(a,c){var d=[];a.subscribe(m(c,
function(a){d.push(a);b<d.length&&d.shift()},function(){var a,b;try{for(var h=F(d),l=h.next();!l.done;l=h.next())c.next(l.value)}catch(k){a={error:k}}finally{try{l&&!l.done&&(b=h.return)&&b.call(h)}finally{if(a)throw a.error;}}c.complete()},void 0,function(){d=null}))})}function Mc(b,a){var c=2<=arguments.length;return function(d){return d.pipe(b?L(function(a,c){return b(a,c,d)}):E,rb(1),c?va(a):wa(function(){return new ba}))}}function Nc(){return n(function(b,a){b.subscribe(m(a,function(b){a.next(Qa.createNext(b))},
function(){a.next(Qa.createComplete());a.complete()},function(b){a.next(Qa.createError(b));a.complete()}))})}function Oc(b){return ga(q(b)?function(a,c){return 0<b(a,c)?a:c}:function(a,b){return a>b?a:b})}function Pc(b,a,c){void 0===c&&(c=Infinity);if(q(a))return H(function(){return b},a,c);"number"===typeof a&&(c=a);return H(function(){return b},c)}function Qc(b,a,c){void 0===c&&(c=Infinity);return n(function(d,e){var f=a;return fb(d,e,function(a,c){return b(f,a,c)},c,function(a){f=a},!1,void 0,
function(){return f=null})})}function Rc(){for(var b=[],a=0;a<arguments.length;a++)b[a]=arguments[a];var c=N(b),d="number"===typeof b[b.length-1]?b.pop():Infinity,b=aa(b);return n(function(a,f){ta(d)(O(z([a],x(b)),c)).subscribe(f)})}function Sc(){for(var b=[],a=0;a<arguments.length;a++)b[a]=arguments[a];return Rc.apply(void 0,z([],x(b)))}function Tc(b){return ga(q(b)?function(a,c){return 0>b(a,c)?a:c}:function(a,b){return a<b?a:b})}function Ra(b,a){var c=q(b)?b:function(){return b};return q(a)?Ma(a,
{connector:c}):function(a){return new Sa(a,c)}}function Uc(){return n(function(b,a){var c,d=!1;b.subscribe(m(a,function(b){var e=c;c=b;d&&a.next([e,b]);d=!0}))})}function Vc(){for(var b=[],a=0;a<arguments.length;a++)b[a]=arguments[a];var c=b.length;if(0===c)throw Error("list of properties cannot be empty.");return P(function(a){var d=a;for(a=0;a<c;a++)if(d=null===d||void 0===d?void 0:d[b[a]],"undefined"===typeof d)return;return d})}function Wc(b){return b?function(a){return Ma(b)(a)}:function(a){return Ra(new B)(a)}}
function Xc(b){return function(a){var c=new Yc(b);return new Sa(a,function(){return c})}}function Zc(){return function(b){var a=new eb;return new Sa(b,function(){return a})}}function $c(b,a,c,d){c&&!q(c)&&(d=c);var e=q(c)?c:void 0;return function(c){return Ra(new ia(b,a,d),e)(c)}}function sb(){for(var b=[],a=0;a<arguments.length;a++)b[a]=arguments[a];return b.length?n(function(a,d){hc(z([a],x(b)))(d)}):E}function ad(b){var a,c=Infinity,d;null!=b&&("object"===typeof b?(a=b.count,c=void 0===a?Infinity:
a,d=b.delay):c=b);return 0>=c?function(){return K}:n(function(a,b){var e=0,f,k=function(){null===f||void 0===f?void 0:f.unsubscribe();f=null;if(null!=d){var a="number"===typeof d?Z(d):t(d(e)),c=m(b,function(){c.unsubscribe();g()});a.subscribe(c)}else g()},g=function(){var d=!1;f=a.subscribe(m(b,void 0,function(){++e<c?f?k():d=!0:b.complete()}));d&&k()};g()})}function bd(b){return n(function(a,c){var d,e=!1,f,h=!1,l=!1,k=function(){f||(f=new B,b(f).subscribe(m(c,function(){d?g():e=!0},function(){h=
!0;l&&h&&c.complete()})));return f},g=function(){l=!1;d=a.subscribe(m(c,void 0,function(){(l=!0,h)&&(c.complete(),!0)||k().next()}));e&&(d.unsubscribe(),d=null,e=!1,g())};g()})}function cd(b){void 0===b&&(b=Infinity);b=b&&"object"===typeof b?b:{count:b};var a=b.count,c=void 0===a?Infinity:a,d=b.delay;b=b.resetOnSuccess;var e=void 0===b?!1:b;return 0>=c?E:n(function(a,b){var f=0,h,g=function(){var l=!1;h=a.subscribe(m(b,function(a){e&&(f=0);b.next(a)},void 0,function(a){if(f++<c){var e=function(){h?
(h.unsubscribe(),h=null,g()):l=!0};if(null!=d){a="number"===typeof d?Z(d):t(d(a,f));var k=m(b,function(){k.unsubscribe();e()},function(){b.complete()});a.subscribe(k)}else e()}else b.error(a)}));l&&(h.unsubscribe(),h=null,g())};g()})}function dd(b){return n(function(a,c){var d,e=!1,f,h=function(){d=a.subscribe(m(c,void 0,void 0,function(a){f||(f=new B,b(f).subscribe(m(c,function(){return d?h():e=!0})));f&&f.next(a)}));e&&(d.unsubscribe(),d=null,e=!1,h())};h()})}function tb(b){return n(function(a,
c){var d=!1,e=null;a.subscribe(m(c,function(a){d=!0;e=a}));b.subscribe(m(c,function(){if(d){d=!1;var a=e;e=null;c.next(a)}},D))})}function ed(b,a){void 0===a&&(a=I);return tb(ec(b,a))}function fd(b,a){return n(oc(b,a,2<=arguments.length,!0))}function gd(b,a){void 0===a&&(a=function(a,b){return a===b});return n(function(c,d){var e={buffer:[],complete:!1},f={buffer:[],complete:!1},h=function(b,c){var e=m(d,function(e){var f=c.buffer,h=c.complete;0===f.length?h?(d.next(!1),d.complete()):b.buffer.push(e):
a(e,f.shift())||(d.next(!1),d.complete())},function(){b.complete=!0;var a=c.buffer;c.complete&&(d.next(0===a.length),d.complete());null===e||void 0===e?void 0:e.unsubscribe()});return e};c.subscribe(h(e,f));b.subscribe(h(f,e))})}function ub(b){void 0===b&&(b={});var a=b.connector,c=void 0===a?function(){return new B}:a,a=b.resetOnError,d=void 0===a?!0:a,a=b.resetOnComplete,e=void 0===a?!0:a;b=b.resetOnRefCountZero;var f=void 0===b?!0:b;return function(a){var b,h,g,r=0,v=!1,m=!1,Q=function(){null===
h||void 0===h?void 0:h.unsubscribe();h=void 0},u=function(){Q();b=g=void 0;v=m=!1},fa=function(){var a=b;u();null===a||void 0===a?void 0:a.unsubscribe()};return n(function(a,l){r++;m||v||Q();var k=g=null!==g&&void 0!==g?g:c();l.add(function(){r--;0!==r||m||v||(h=vb(fa,f))});k.subscribe(l);!b&&0<r&&(b=new ja({next:function(a){return k.next(a)},error:function(a){m=!0;Q();h=vb(u,d,a);k.error(a)},complete:function(){v=!0;Q();h=vb(u,e);k.complete()}}),t(a).subscribe(b))})(a)}}function vb(b,a){for(var c=
[],d=2;d<arguments.length;d++)c[d-2]=arguments[d];if(!0===a)b();else if(!1!==a){var e=new ja({next:function(){e.unsubscribe();b()}});return a.apply(void 0,z([],x(c))).subscribe(e)}}function hd(b,a,c){var d,e;d=!1;b&&"object"===typeof b?(d=b.bufferSize,e=void 0===d?Infinity:d,d=b.windowTime,a=void 0===d?Infinity:d,d=b.refCount,d=void 0===d?!1:d,c=b.scheduler):e=null!==b&&void 0!==b?b:Infinity;return ub({connector:function(){return new ia(e,a,c)},resetOnError:!0,resetOnComplete:!1,resetOnRefCountZero:d})}
function id(b){return n(function(a,c){var d=!1,e,f=!1,h=0;a.subscribe(m(c,function(l){f=!0;if(!b||b(l,h++,a))d&&c.error(new jd("Too many matching values")),d=!0,e=l},function(){d?(c.next(e),c.complete()):c.error(f?new kd("No matching values"):new ba)}))})}function ld(b){return L(function(a,c){return b<=c})}function md(b){return 0>=b?E:n(function(a,c){var d=Array(b),e=0;a.subscribe(m(c,function(a){var f=e++;if(f<b)d[f]=a;else{var f=f%b,l=d[f];d[f]=a;c.next(l)}}));return function(){d=null}})}function nd(b){return n(function(a,
c){var d=!1,e=m(c,function(){null===e||void 0===e?void 0:e.unsubscribe();d=!0},D);t(b).subscribe(e);a.subscribe(m(c,function(a){return d&&c.next(a)}))})}function od(b){return n(function(a,c){var d=!1,e=0;a.subscribe(m(c,function(a){return(d||(d=!b(a,e++)))&&c.next(a)}))})}function pd(){for(var b=[],a=0;a<arguments.length;a++)b[a]=arguments[a];var c=N(b);return n(function(a,e){(c?ua(b,a,c):ua(b,a)).subscribe(e)})}function ka(b,a){return n(function(c,d){var e=null,f=0,h=!1;c.subscribe(m(d,function(c){null===
e||void 0===e?void 0:e.unsubscribe();var l=0,g=f++;t(b(c,g)).subscribe(e=m(d,function(b){return d.next(a?a(c,b,g,l++):b)},function(){e=null;h&&!e&&d.complete()}))},function(){(h=!0,!e)&&d.complete()}))})}function qd(){return ka(E)}function rd(b,a){return q(a)?ka(function(){return b},a):ka(function(){return b})}function sd(b,a){return n(function(c,d){var e=a;ka(function(a,c){return b(e,a,c)},function(a,b){return e=b,b})(c).subscribe(d);return function(){e=null}})}function td(b){return n(function(a,
c){t(b).subscribe(m(c,function(){return c.complete()},D));!c.closed&&a.subscribe(c)})}function ud(b,a){void 0===a&&(a=!1);return n(function(c,d){var e=0;c.subscribe(m(d,function(c){var f=b(c,e++);(f||a)&&d.next(c);!f&&d.complete()}))})}function vd(b,a,c){var d=q(b)||a||c?{next:b,error:a,complete:c}:b;return d?n(function(a,b){var c;null===(c=d.subscribe)||void 0===c?void 0:c.call(d);var e=!0;a.subscribe(m(b,function(a){var c;null===(c=d.next)||void 0===c?void 0:c.call(d,a);b.next(a)},function(){var a;
e=!1;null===(a=d.complete)||void 0===a?void 0:a.call(d);b.complete()},function(a){var c;e=!1;null===(c=d.error)||void 0===c?void 0:c.call(d,a);b.error(a)},function(){var a,b;e&&(null===(a=d.unsubscribe)||void 0===a?void 0:a.call(d));null===(b=d.finalize)||void 0===b?void 0:b.call(d)}))}):E}function wb(b,a){void 0===a&&(a=wd);return n(function(c,d){var e=a.leading,f=a.trailing,h=!1,l=null,g=null,w=!1,r=function(){null===g||void 0===g?void 0:g.unsubscribe();g=null;f&&(n(),w&&d.complete())},v=function(){g=
null;w&&d.complete()},n=function(){if(h){h=!1;var a=l;l=null;d.next(a);!w&&(g=t(b(a)).subscribe(m(d,r,v)))}};c.subscribe(m(d,function(a){h=!0;l=a;(!g||g.closed)&&(e?n():g=t(b(a)).subscribe(m(d,r,v)))},function(){w=!0;f&&h&&g&&!g.closed||d.complete()}))})}function xd(b,a,c){void 0===a&&(a=I);void 0===c&&(c=wd);var d=Z(b,a);return wb(function(){return d},c)}function yd(b){void 0===b&&(b=I);return n(function(a,c){var d=b.now();a.subscribe(m(c,function(a){var e=b.now(),h=e-d;d=e;c.next(new Fe(a,h))}))})}
function zd(b,a,c){var d,e;c=null!==c&&void 0!==c?c:hb;cb(b)?d=b:"number"===typeof b&&(e=b);if(a)b=function(){return a};else throw new TypeError("No observable provided to switch to");if(null==d&&null==e)throw new TypeError("No timeout provided.");return db({first:d,each:e,scheduler:c,with:b})}function Ad(b){void 0===b&&(b=la);return P(function(a){return{value:a,timestamp:b.now()}})}function Bd(b){return n(function(a,c){var d=new B;c.next(d.asObservable());var e=function(a){d.error(a);c.error(a)};
a.subscribe(m(c,function(a){return null===d||void 0===d?void 0:d.next(a)},function(){d.complete();c.complete()},e));b.subscribe(m(c,function(){d.complete();c.next(d=new B)},D,e));return function(){null===d||void 0===d?void 0:d.unsubscribe();d=null}})}function Cd(b,a){void 0===a&&(a=0);var c=0<a?a:b;return n(function(a,e){var d=[new B],h=0;e.next(d[0].asObservable());a.subscribe(m(e,function(a){var f,g;try{for(var l=F(d),v=l.next();!v.done;v=l.next())v.value.next(a)}catch(A){f={error:A}}finally{try{v&&
!v.done&&(g=l.return)&&g.call(l)}finally{if(f)throw f.error;}}a=h-b+1;0<=a&&0===a%c&&d.shift().complete();0===++h%c&&(a=new B,d.push(a),e.next(a.asObservable()))},function(){for(;0<d.length;)d.shift().complete();e.complete()},function(a){for(;0<d.length;)d.shift().error(a);e.error(a)},function(){d=null}))})}function Dd(b){for(var a,c,d=[],e=1;e<arguments.length;e++)d[e-1]=arguments[e];var f=null!==(a=N(d))&&void 0!==a?a:I,h=null!==(c=d[0])&&void 0!==c?c:null,g=d[1]||Infinity;return n(function(a,c){var d=
[],e=!1,l=function(a){var b=a.subs;a.window.complete();b.unsubscribe();M(d,a);e&&k()},k=function(){if(d){var a=new C;c.add(a);var e=new B,h={window:e,subs:a,seen:0};d.push(h);c.next(e.asObservable());G(a,f,function(){return l(h)},b)}};null!==h&&0<=h?G(c,f,k,h,!0):e=!0;k();var w=function(a){d.slice().forEach(function(b){return a(b.window)});a(c);c.unsubscribe()};a.subscribe(m(c,function(a){d.slice().forEach(function(b){b.window.next(a);g<=++b.seen&&l(b)})},function(){return w(function(a){return a.complete()})},
function(a){return w(function(b){return b.error(a)})}));return function(){d=null}})}function Ed(b,a){return n(function(c,d){var e=[],f=function(a){for(;0<e.length;)e.shift().error(a);d.error(a)};t(b).subscribe(m(d,function(b){var c=new B;e.push(c);var h=new C,g;try{g=t(a(b))}catch(r){f(r);return}d.next(c.asObservable());h.add(g.subscribe(m(d,function(){M(e,c);c.complete();h.unsubscribe()},D,f)))},D));c.subscribe(m(d,function(a){var b,c,d=e.slice();try{for(var f=F(d),h=f.next();!h.done;h=f.next())h.value.next(a)}catch(A){b=
{error:A}}finally{try{h&&!h.done&&(c=f.return)&&c.call(f)}finally{if(b)throw b.error;}}},function(){for(;0<e.length;)e.shift().complete();d.complete()},f,function(){for(;0<e.length;)e.shift().unsubscribe()}))})}function Fd(b){return n(function(a,c){var d,e,f=function(a){d.error(a);c.error(a)},h=function(){null===e||void 0===e?void 0:e.unsubscribe();null===d||void 0===d?void 0:d.complete();d=new B;c.next(d.asObservable());var a;try{a=t(b())}catch(k){f(k);return}a.subscribe(e=m(c,h,h,f))};h();a.subscribe(m(c,
function(a){return d.next(a)},function(){d.complete();c.complete()},f,function(){null===e||void 0===e?void 0:e.unsubscribe();d=null}))})}function Gd(){for(var b=[],a=0;a<arguments.length;a++)b[a]=arguments[a];var c=pa(b);return n(function(a,e){for(var d=b.length,h=Array(d),g=b.map(function(){return!1}),k=!1,n=function(a){t(b[a]).subscribe(m(e,function(b){h[a]=b;k||g[a]||(g[a]=!0,(k=g.every(E))&&(g=null))},D))},r=0;r<d;r++)n(r);a.subscribe(m(e,function(a){k&&(a=z([a],x(h)),e.next(c?c.apply(void 0,
z([],x(a))):a))}))})}function Hd(b){return pc(ib,b)}function Id(){for(var b=[],a=0;a<arguments.length;a++)b[a]=arguments[a];return n(function(a,d){ib.apply(void 0,z([a],x(b))).subscribe(d)})}function Jd(){for(var b=[],a=0;a<arguments.length;a++)b[a]=arguments[a];return Id.apply(void 0,z([],x(b)))}function Kd(b,a){for(var c=0,d=a.length;c<d;c++)for(var e=a[c],f=Object.getOwnPropertyNames(e.prototype),h=0,g=f.length;h<g;h++){var k=f[h];b.prototype[k]=e.prototype[k]}}function Ld(b){switch(b.responseType){case "json":return"response"in
b?b.response:JSON.parse(b.responseText);case "document":return b.responseXML;default:return"response"in b?b.response:b.responseText}}function Ge(b,a){return ca({method:"GET",url:b,headers:a})}function He(b,a,c){return ca({method:"POST",url:b,body:a,headers:c})}function Ie(b,a){return ca({method:"DELETE",url:b,headers:a})}function Je(b,a,c){return ca({method:"PUT",url:b,body:a,headers:c})}function Ke(b,a,c){return ca({method:"PATCH",url:b,body:a,headers:c})}function Le(b,a){return Me(ca({method:"GET",
url:b,headers:a}))}function Ne(b){return new p(function(a){var c,d,e=U({async:!0,crossDomain:!1,withCredentials:!1,method:"GET",timeout:0,responseType:"json"},b),f=e.queryParams,h=e.body,g=e.headers,k=e.url;if(!k)throw new TypeError("url is required");if(f){var m;if(k.includes("?")){k=k.split("?");if(2<k.length)throw new TypeError("invalid url");m=new URLSearchParams(k[1]);(new URLSearchParams(f)).forEach(function(a,b){return m.set(b,a)});k=k[0]+"?"+m}else m=new URLSearchParams(f),k=k+"?"+m}f={};
if(g)for(var r in g)g.hasOwnProperty(r)&&(f[r.toLowerCase()]=g[r]);var n=e.crossDomain;n||"x-requested-with"in f||(f["x-requested-with"]="XMLHttpRequest");var A=e.xsrfCookieName,g=e.xsrfHeaderName;(e.withCredentials||!n)&&A&&g&&(n=null!==(d=null===(c=null===document||void 0===document?void 0:document.cookie.match(new RegExp("(^|;\\s*)("+A+")\x3d([^;]*)")))||void 0===c?void 0:c.pop())&&void 0!==d?d:"")&&(f[g]=n);c=Oe(h,f);var q=U(U({},e),{url:k,headers:f,body:c}),u;u=b.createXHR?b.createXHR():new XMLHttpRequest;
var p=b.progressSubscriber,e=b.includeDownloadProgress,e=void 0===e?!1:e;d=b.includeUploadProgress;d=void 0===d?!1:d;h=function(b,c){u.addEventListener(b,function(){var b,d=c();null===(b=null===p||void 0===p?void 0:p.error)||void 0===b?void 0:b.call(p,d);a.error(d)})};h("timeout",function(){return new Md(u,q)});h("abort",function(){return new xa("aborted",u,q)});var t=function(b,c,d){b.addEventListener(c,function(b){a.next(new xb(b,u,q,d+"_"+b.type))})};d&&[yb,zb,Nd].forEach(function(a){return t(u.upload,
a,Pe)});p&&[yb,zb].forEach(function(a){return u.upload.addEventListener(a,function(a){var b;return null===(b=null===p||void 0===p?void 0:p.next)||void 0===b?void 0:b.call(p,a)})});e&&[yb,zb].forEach(function(a){return t(u,a,Od)});var x=function(b){a.error(new xa("ajax error"+(b?" "+b:""),u,q))};u.addEventListener("error",function(a){var b;null===(b=null===p||void 0===p?void 0:p.error)||void 0===b?void 0:b.call(p,a);x()});u.addEventListener(Nd,function(b){var c,d,e=u.status;if(400>e){null===(c=null===
p||void 0===p?void 0:p.complete)||void 0===c?void 0:c.call(p);c=void 0;try{c=new xb(b,u,q,Od+"_"+b.type)}catch(ye){a.error(ye);return}a.next(c);a.complete()}else null===(d=null===p||void 0===p?void 0:p.error)||void 0===d?void 0:d.call(p,b),x(e)});e=q.user;d=q.method;h=q.async;e?u.open(d,k,h,e,q.password):u.open(d,k,h);h&&(u.timeout=q.timeout,u.responseType=q.responseType);"withCredentials"in u&&(u.withCredentials=q.withCredentials);for(r in f)f.hasOwnProperty(r)&&u.setRequestHeader(r,f[r]);c?u.send(c):
u.send();return function(){u&&4!==u.readyState&&u.abort()}})}function Oe(b,a){var c;if(!b||"string"===typeof b||"undefined"!==typeof FormData&&b instanceof FormData||"undefined"!==typeof URLSearchParams&&b instanceof URLSearchParams||Ab(b,"ArrayBuffer")||Ab(b,"File")||Ab(b,"Blob")||"undefined"!==typeof ReadableStream&&b instanceof ReadableStream)return b;if("undefined"!==typeof ArrayBuffer&&ArrayBuffer.isView(b))return b.buffer;if("object"===typeof b)return a["content-type"]=null!==(c=a["content-type"])&&
void 0!==c?c:"application/json;charset\x3dutf-8",JSON.stringify(b);throw new TypeError("Unknown body type");}function Ab(b,a){return Qe.call(b)==="[object "+a+"]"}var Ua=function(b,a){Ua=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,b){a.__proto__=b}||function(a,b){for(var c in b)Object.prototype.hasOwnProperty.call(b,c)&&(a[c]=b[c])};return Ua(b,a)},U=function(){U=Object.assign||function(b){for(var a,c=1,d=arguments.length;c<d;c++){a=arguments[c];for(var e in a)Object.prototype.hasOwnProperty.call(a,
e)&&(b[e]=a[e])}return b};return U.apply(this,arguments)},Ta=R(function(b){return function(a){b(this);this.message=a?a.length+" errors occurred during unsubscription:\n"+a.map(function(a,b){return b+1+") "+a.toString()}).join("\n  "):"";this.name="UnsubscriptionError";this.errors=a}}),C=function(){function b(a){this.initialTeardown=a;this.closed=!1;this._finalizers=this._parentage=null}b.prototype.unsubscribe=function(){var a,b,d,e,f;if(!this.closed){this.closed=!0;var h=this._parentage;if(h)if(this._parentage=
null,Array.isArray(h))try{for(var g=F(h),k=g.next();!k.done;k=g.next())k.value.remove(this)}catch(A){a={error:A}}finally{try{k&&!k.done&&(b=g.return)&&b.call(g)}finally{if(a)throw a.error;}}else h.remove(this);a=this.initialTeardown;if(q(a))try{a()}catch(A){f=A instanceof Ta?A.errors:[A]}if(a=this._finalizers){this._finalizers=null;try{for(var m=F(a),r=m.next();!r.done;r=m.next()){var n=r.value;try{a=n,q(a)?a():a.unsubscribe()}catch(A){f=null!==f&&void 0!==f?f:[],A instanceof Ta?f=z(z([],x(f)),x(A.errors)):
f.push(A)}}}catch(A){d={error:A}}finally{try{r&&!r.done&&(e=m.return)&&e.call(m)}finally{if(d)throw d.error;}}}if(f)throw new Ta(f);}};b.prototype.add=function(a){var c;if(a&&a!==this)if(this.closed)q(a)?a():a.unsubscribe();else{if(a instanceof b){if(a.closed||a._hasParent(this))return;a._addParent(this)}(this._finalizers=null!==(c=this._finalizers)&&void 0!==c?c:[]).push(a)}};b.prototype._hasParent=function(a){var b=this._parentage;return b===a||Array.isArray(b)&&b.includes(a)};b.prototype._addParent=
function(a){var b=this._parentage;this._parentage=Array.isArray(b)?(b.push(a),b):b?[b,a]:a};b.prototype._removeParent=function(a){var b=this._parentage;b===a?this._parentage=null:Array.isArray(b)&&M(b,a)};b.prototype.remove=function(a){var c=this._finalizers;c&&M(c,a);a instanceof b&&a._removeParent(this)};b.EMPTY=function(){var a=new b;a.closed=!0;return a}();return b}(),Pd=C.EMPTY,S={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1},
ea={setTimeout:function(b,a){for(var c=[],d=2;d<arguments.length;d++)c[d-2]=arguments[d];d=ea.delegate;return(null===d||void 0===d?0:d.setTimeout)?d.setTimeout.apply(d,z([b,a],x(c))):setTimeout.apply(void 0,z([b,a],x(c)))},clearTimeout:function(b){var a=ea.delegate;return((null===a||void 0===a?void 0:a.clearTimeout)||clearTimeout)(b)},delegate:void 0},ya=J("C",void 0,void 0),V=null,oa=function(b){function a(a){var c=b.call(this)||this;c.isStopped=!1;a?(c.destination=a,Hb(a)&&a.add(c)):c.destination=
Re;return c}y(a,b);a.create=function(a,b,e){return new ja(a,b,e)};a.prototype.next=function(a){this.isStopped?Wa(J("N",a,void 0),this):this._next(a)};a.prototype.error=function(a){this.isStopped?Wa(J("E",void 0,a),this):(this.isStopped=!0,this._error(a))};a.prototype.complete=function(){this.isStopped?Wa(ya,this):(this.isStopped=!0,this._complete())};a.prototype.unsubscribe=function(){this.closed||(this.isStopped=!0,b.prototype.unsubscribe.call(this),this.destination=null)};a.prototype._next=function(a){this.destination.next(a)};
a.prototype._error=function(a){try{this.destination.error(a)}finally{this.unsubscribe()}};a.prototype._complete=function(){try{this.destination.complete()}finally{this.unsubscribe()}};return a}(C),Bb=Function.prototype.bind,Se=function(){function b(a){this.partialObserver=a}b.prototype.next=function(a){var b=this.partialObserver;if(b.next)try{b.next(a)}catch(d){Da(d)}};b.prototype.error=function(a){var b=this.partialObserver;if(b.error)try{b.error(a)}catch(d){Da(d)}else Da(a)};b.prototype.complete=
function(){var a=this.partialObserver;if(a.complete)try{a.complete()}catch(c){Da(c)}};return b}(),ja=function(b){function a(a,d,e){var c=b.call(this)||this;q(a)||!a?a={next:null!==a&&void 0!==a?a:void 0,error:null!==d&&void 0!==d?d:void 0,complete:null!==e&&void 0!==e?e:void 0}:c&&S.useDeprecatedNextContext&&(d=Object.create(a),d.unsubscribe=function(){return c.unsubscribe()},a={next:a.next&&Bb.call(a.next,d),error:a.error&&Bb.call(a.error,d),complete:a.complete&&Bb.call(a.complete,d)});c.destination=
new Se(a);return c}y(a,b);return a}(oa),Re={closed:!0,next:D,error:function(b){throw b;},complete:D},qa="function"===typeof Symbol&&Symbol.observable||"@@observable",p=function(){function b(a){a&&(this._subscribe=a)}b.prototype.lift=function(a){var c=new b;c.source=this;c.operator=a;return c};b.prototype.subscribe=function(a,b,d){var c=this,f=ce(a)?a:new ja(a,b,d);Ca(function(){var a=c.operator,b=c.source;f.add(a?a.call(f,b):b?c._subscribe(f):c._trySubscribe(f))});return f};b.prototype._trySubscribe=
function(a){try{return this._subscribe(a)}catch(c){a.error(c)}};b.prototype.forEach=function(a,b){var c=this;b=Kb(b);return new b(function(b,d){var e=new ja({next:function(b){try{a(b)}catch(k){d(k),e.unsubscribe()}},error:d,complete:b});c.subscribe(e)})};b.prototype._subscribe=function(a){var b;return null===(b=this.source)||void 0===b?void 0:b.subscribe(a)};b.prototype[qa]=function(){return this};b.prototype.pipe=function(){for(var a=[],b=0;b<arguments.length;b++)a[b]=arguments[b];return Jb(a)(this)};
b.prototype.toPromise=function(a){var b=this;a=Kb(a);return new a(function(a,c){var d;b.subscribe(function(a){return d=a},function(a){return c(a)},function(){return a(d)})})};b.create=function(a){return new b(a)};return b}(),Lb=function(b){function a(a,d,e,f,h,g){var c=b.call(this,a)||this;c.onFinalize=h;c.shouldUnsubscribe=g;c._next=d?function(b){try{d(b)}catch(r){a.error(r)}}:b.prototype._next;c._error=f?function(b){try{f(b)}catch(r){a.error(r)}finally{this.unsubscribe()}}:b.prototype._error;c._complete=
e?function(){try{e()}catch(w){a.error(w)}finally{this.unsubscribe()}}:b.prototype._complete;return c}y(a,b);a.prototype.unsubscribe=function(){var a;if(!this.shouldUnsubscribe||this.shouldUnsubscribe()){var d=this.closed;b.prototype.unsubscribe.call(this);!d&&(null===(a=this.onFinalize)||void 0===a?void 0:a.call(this))}};return a}(oa),Sa=function(b){function a(a,d){var c=b.call(this)||this;c.source=a;c.subjectFactory=d;c._subject=null;c._refCount=0;c._connection=null;q(null===a||void 0===a?void 0:
a.lift)&&(c.lift=a.lift);return c}y(a,b);a.prototype._subscribe=function(a){return this.getSubject().subscribe(a)};a.prototype.getSubject=function(){var a=this._subject;if(!a||a.isStopped)this._subject=this.subjectFactory();return this._subject};a.prototype._teardown=function(){this._refCount=0;var a=this._connection;this._subject=this._connection=null;null===a||void 0===a?void 0:a.unsubscribe()};a.prototype.connect=function(){var a=this,b=this._connection;if(!b){var b=this._connection=new C,e=this.getSubject();
b.add(this.source.subscribe(m(e,void 0,function(){a._teardown();e.complete()},function(b){a._teardown();e.error(b)},function(){return a._teardown()})));b.closed&&(this._connection=null,b=C.EMPTY)}return b};a.prototype.refCount=function(){return Ya()(this)};return a}(p),Ea={now:function(){return(Ea.delegate||performance).now()},delegate:void 0},T={schedule:function(b){var a=requestAnimationFrame,c=cancelAnimationFrame,d=T.delegate;d&&(a=d.requestAnimationFrame,c=d.cancelAnimationFrame);var e=a(function(a){c=
void 0;b(a)});return new C(function(){return null===c||void 0===c?void 0:c(e)})},requestAnimationFrame:function(){for(var b=[],a=0;a<arguments.length;a++)b[a]=arguments[a];a=T.delegate;return((null===a||void 0===a?void 0:a.requestAnimationFrame)||requestAnimationFrame).apply(void 0,z([],x(b)))},cancelAnimationFrame:function(){for(var b=[],a=0;a<arguments.length;a++)b[a]=arguments[a];a=T.delegate;return((null===a||void 0===a?void 0:a.cancelAnimationFrame)||cancelAnimationFrame).apply(void 0,z([],x(b)))},
delegate:void 0},Te=Mb(),Qd=R(function(b){return function(){b(this);this.name="ObjectUnsubscribedError";this.message="object unsubscribed"}}),B=function(b){function a(){var a=b.call(this)||this;a.closed=!1;a.currentObservers=null;a.observers=[];a.isStopped=!1;a.hasError=!1;a.thrownError=null;return a}y(a,b);a.prototype.lift=function(a){var b=new Cb(this,this);b.operator=a;return b};a.prototype._throwIfClosed=function(){if(this.closed)throw new Qd;};a.prototype.next=function(a){var b=this;Ca(function(){var c,
d;b._throwIfClosed();if(!b.isStopped){b.currentObservers||(b.currentObservers=Array.from(b.observers));try{for(var h=F(b.currentObservers),g=h.next();!g.done;g=h.next())g.value.next(a)}catch(k){c={error:k}}finally{try{g&&!g.done&&(d=h.return)&&d.call(h)}finally{if(c)throw c.error;}}}})};a.prototype.error=function(a){var b=this;Ca(function(){b._throwIfClosed();if(!b.isStopped){b.hasError=b.isStopped=!0;b.thrownError=a;for(var c=b.observers;c.length;)c.shift().error(a)}})};a.prototype.complete=function(){var a=
this;Ca(function(){a._throwIfClosed();if(!a.isStopped){a.isStopped=!0;for(var b=a.observers;b.length;)b.shift().complete()}})};a.prototype.unsubscribe=function(){this.isStopped=this.closed=!0;this.observers=this.currentObservers=null};Object.defineProperty(a.prototype,"observed",{get:function(){var a;return 0<(null===(a=this.observers)||void 0===a?void 0:a.length)},enumerable:!1,configurable:!0});a.prototype._trySubscribe=function(a){this._throwIfClosed();return b.prototype._trySubscribe.call(this,
a)};a.prototype._subscribe=function(a){this._throwIfClosed();this._checkFinalizedStatuses(a);return this._innerSubscribe(a)};a.prototype._innerSubscribe=function(a){var b=this,c=this.isStopped,f=this.observers;if(this.hasError||c)return Pd;this.currentObservers=null;f.push(a);return new C(function(){b.currentObservers=null;M(f,a)})};a.prototype._checkFinalizedStatuses=function(a){var b=this.thrownError,c=this.isStopped;this.hasError?a.error(b):c&&a.complete()};a.prototype.asObservable=function(){var a=
new p;a.source=this;return a};a.create=function(a,b){return new Cb(a,b)};return a}(p),Cb=function(b){function a(a,d){var c=b.call(this)||this;c.destination=a;c.source=d;return c}y(a,b);a.prototype.next=function(a){var b,c;null===(c=null===(b=this.destination)||void 0===b?void 0:b.next)||void 0===c?void 0:c.call(b,a)};a.prototype.error=function(a){var b,c;null===(c=null===(b=this.destination)||void 0===b?void 0:b.error)||void 0===c?void 0:c.call(b,a)};a.prototype.complete=function(){var a,b;null===
(b=null===(a=this.destination)||void 0===a?void 0:a.complete)||void 0===b?void 0:b.call(a)};a.prototype._subscribe=function(a){var b,c;return null!==(c=null===(b=this.source)||void 0===b?void 0:b.subscribe(a))&&void 0!==c?c:Pd};return a}(B),Yc=function(b){function a(a){var c=b.call(this)||this;c._value=a;return c}y(a,b);Object.defineProperty(a.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0});a.prototype._subscribe=function(a){var c=b.prototype._subscribe.call(this,
a);!c.closed&&a.next(this._value);return c};a.prototype.getValue=function(){var a=this.thrownError,b=this._value;if(this.hasError)throw a;this._throwIfClosed();return b};a.prototype.next=function(a){b.prototype.next.call(this,this._value=a)};return a}(B),la={now:function(){return(la.delegate||Date).now()},delegate:void 0},ia=function(b){function a(a,d,e){void 0===a&&(a=Infinity);void 0===d&&(d=Infinity);void 0===e&&(e=la);var c=b.call(this)||this;c._bufferSize=a;c._windowTime=d;c._timestampProvider=
e;c._buffer=[];c._infiniteTimeWindow=Infinity===d;c._bufferSize=Math.max(1,a);c._windowTime=Math.max(1,d);return c}y(a,b);a.prototype.next=function(a){var c=this._buffer,e=this._infiniteTimeWindow,f=this._timestampProvider,h=this._windowTime;this.isStopped||(c.push(a),!e&&c.push(f.now()+h));this._trimBuffer();b.prototype.next.call(this,a)};a.prototype._subscribe=function(a){this._throwIfClosed();this._trimBuffer();for(var b=this._innerSubscribe(a),c=this._infiniteTimeWindow,f=this._buffer.slice(),
h=0;h<f.length&&!a.closed;h+=c?1:2)a.next(f[h]);this._checkFinalizedStatuses(a);return b};a.prototype._trimBuffer=function(){var a=this._bufferSize,b=this._timestampProvider,e=this._buffer,f=this._infiniteTimeWindow,h=(f?1:2)*a;Infinity>a&&h<e.length&&e.splice(0,e.length-h);if(!f){a=b.now();b=0;for(f=1;f<e.length&&e[f]<=a;f+=2)b=f;b&&e.splice(0,b+1)}};return a}(B),eb=function(b){function a(){var a=null!==b&&b.apply(this,arguments)||this;a._value=null;a._hasValue=!1;a._isComplete=!1;return a}y(a,b);
a.prototype._checkFinalizedStatuses=function(a){var b=this._hasValue,c=this._value,f=this.thrownError,h=this.isStopped,g=this._isComplete;if(this.hasError)a.error(f);else if(h||g)b&&a.next(c),a.complete()};a.prototype.next=function(a){this.isStopped||(this._value=a,this._hasValue=!0)};a.prototype.complete=function(){var a=this._hasValue,d=this._value;this._isComplete||(this._isComplete=!0,a&&b.prototype.next.call(this,d),b.prototype.complete.call(this))};return a}(B),ma={setInterval:function(b,a){for(var c=
[],d=2;d<arguments.length;d++)c[d-2]=arguments[d];d=ma.delegate;return(null===d||void 0===d?0:d.setInterval)?d.setInterval.apply(d,z([b,a],x(c))):setInterval.apply(void 0,z([b,a],x(c)))},clearInterval:function(b){var a=ma.delegate;return((null===a||void 0===a?void 0:a.clearInterval)||clearInterval)(b)},delegate:void 0},za=function(b){function a(a,d){var c=b.call(this,a,d)||this;c.scheduler=a;c.work=d;c.pending=!1;return c}y(a,b);a.prototype.schedule=function(a,b){void 0===b&&(b=0);if(this.closed)return this;
this.state=a;a=this.id;var c=this.scheduler;null!=a&&(this.id=this.recycleAsyncId(c,a,b));this.pending=!0;this.delay=b;this.id=this.id||this.requestAsyncId(c,this.id,b);return this};a.prototype.requestAsyncId=function(a,b,e){void 0===e&&(e=0);return ma.setInterval(a.flush.bind(a,this),e)};a.prototype.recycleAsyncId=function(a,b,e){void 0===e&&(e=0);if(null!=e&&this.delay===e&&!1===this.pending)return b;ma.clearInterval(b)};a.prototype.execute=function(a,b){if(this.closed)return Error("executing a cancelled action");
this.pending=!1;if(a=this._execute(a,b))return a;!1===this.pending&&null!=this.id&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))};a.prototype._execute=function(a,b){b=!1;var c;try{this.work(a)}catch(f){b=!0,c=f?f:Error("Scheduled action threw falsy error")}if(b)return this.unsubscribe(),c};a.prototype.unsubscribe=function(){if(!this.closed){var a=this.id,d=this.scheduler,e=d.actions;this.work=this.state=this.scheduler=null;this.pending=!1;M(e,this);null!=a&&(this.id=this.recycleAsyncId(d,
a,null));this.delay=null;b.prototype.unsubscribe.call(this)}};return a}(function(b){function a(a,d){return b.call(this)||this}y(a,b);a.prototype.schedule=function(a,b){return this};return a}(C)),Ue=1,Db,Za={},Ve=function(b){var a=Ue++;Za[a]=!0;Db||(Db=Promise.resolve());Db.then(function(){return Nb(a)&&b()});return a},We=function(b){Nb(b)},na={setImmediate:function(){for(var b=[],a=0;a<arguments.length;a++)b[a]=arguments[a];a=na.delegate;return((null===a||void 0===a?void 0:a.setImmediate)||Ve).apply(void 0,
z([],x(b)))},clearImmediate:function(b){var a=na.delegate;return((null===a||void 0===a?void 0:a.clearImmediate)||We)(b)},delegate:void 0},Xe=function(b){function a(a,d){var c=b.call(this,a,d)||this;c.scheduler=a;c.work=d;return c}y(a,b);a.prototype.requestAsyncId=function(a,d,e){void 0===e&&(e=0);if(null!==e&&0<e)return b.prototype.requestAsyncId.call(this,a,d,e);a.actions.push(this);return a._scheduled||(a._scheduled=na.setImmediate(a.flush.bind(a,void 0)))};a.prototype.recycleAsyncId=function(a,
d,e){void 0===e&&(e=0);if(null!=e&&0<e||null==e&&0<this.delay)return b.prototype.recycleAsyncId.call(this,a,d,e);a.actions.some(function(a){return a.id===d})||(na.clearImmediate(d),a._scheduled=void 0)};return a}(za),Eb=function(){function b(a,c){void 0===c&&(c=b.now);this.schedulerActionCtor=a;this.now=c}b.prototype.schedule=function(a,b,d){void 0===b&&(b=0);return(new this.schedulerActionCtor(this,a)).schedule(d,b)};b.now=la.now;return b}(),Aa=function(b){function a(a,d){void 0===d&&(d=Eb.now);
a=b.call(this,a,d)||this;a.actions=[];a._active=!1;a._scheduled=void 0;return a}y(a,b);a.prototype.flush=function(a){var b=this.actions;if(this._active)b.push(a);else{var c;this._active=!0;do if(c=a.execute(a.state,a.delay))break;while(a=b.shift());this._active=!1;if(c){for(;a=b.shift();)a.unsubscribe();throw c;}}};return a}(Eb),Rd=new (function(b){function a(){return null!==b&&b.apply(this,arguments)||this}y(a,b);a.prototype.flush=function(a){this._active=!0;var b=this._scheduled;this._scheduled=
void 0;var c=this.actions,f;a=a||c.shift();do if(f=a.execute(a.state,a.delay))break;while((a=c[0])&&a.id===b&&c.shift());this._active=!1;if(f){for(;(a=c[0])&&a.id===b&&c.shift();)a.unsubscribe();throw f;}};return a}(Aa))(Xe),I=new Aa(za),hb=I,Ye=function(b){function a(a,d){var c=b.call(this,a,d)||this;c.scheduler=a;c.work=d;return c}y(a,b);a.prototype.schedule=function(a,d){void 0===d&&(d=0);if(0<d)return b.prototype.schedule.call(this,a,d);this.delay=d;this.state=a;this.scheduler.flush(this);return this};
a.prototype.execute=function(a,d){return 0<d||this.closed?b.prototype.execute.call(this,a,d):this._execute(a,d)};a.prototype.requestAsyncId=function(a,d,e){void 0===e&&(e=0);return null!=e&&0<e||null==e&&0<this.delay?b.prototype.requestAsyncId.call(this,a,d,e):a.flush(this)};return a}(za),Sd=new (function(b){function a(){return null!==b&&b.apply(this,arguments)||this}y(a,b);return a}(Aa))(Ye),Ze=function(b){function a(a,d){var c=b.call(this,a,d)||this;c.scheduler=a;c.work=d;return c}y(a,b);a.prototype.requestAsyncId=
function(a,d,e){void 0===e&&(e=0);if(null!==e&&0<e)return b.prototype.requestAsyncId.call(this,a,d,e);a.actions.push(this);return a._scheduled||(a._scheduled=T.requestAnimationFrame(function(){return a.flush(void 0)}))};a.prototype.recycleAsyncId=function(a,d,e){void 0===e&&(e=0);if(null!=e&&0<e||null==e&&0<this.delay)return b.prototype.recycleAsyncId.call(this,a,d,e);a.actions.some(function(a){return a.id===d})||(T.cancelAnimationFrame(d),a._scheduled=void 0)};return a}(za),Td=new (function(b){function a(){return null!==
b&&b.apply(this,arguments)||this}y(a,b);a.prototype.flush=function(a){this._active=!0;var b=this._scheduled;this._scheduled=void 0;var c=this.actions,f;a=a||c.shift();do if(f=a.execute(a.state,a.delay))break;while((a=c[0])&&a.id===b&&c.shift());this._active=!1;if(f){for(;(a=c[0])&&a.id===b&&c.shift();)a.unsubscribe();throw f;}};return a}(Aa))(Ze),Ud=function(b){function a(a,d){void 0===a&&(a=Fb);void 0===d&&(d=Infinity);var c=b.call(this,a,function(){return c.frame})||this;c.maxFrames=d;c.frame=0;
c.index=-1;return c}y(a,b);a.prototype.flush=function(){for(var a=this.actions,b=this.maxFrames,e,f;(f=a[0])&&f.delay<=b&&!(a.shift(),this.frame=f.delay,e=f.execute(f.state,f.delay)););if(e){for(;f=a.shift();)f.unsubscribe();throw e;}};a.frameTimeFactor=10;return a}(Aa),Fb=function(b){function a(a,d,e){void 0===e&&(e=a.index+=1);var c=b.call(this,a,d)||this;c.scheduler=a;c.work=d;c.index=e;c.active=!0;c.index=a.index=e;return c}y(a,b);a.prototype.schedule=function(c,d){void 0===d&&(d=0);if(Number.isFinite(d)){if(!this.id)return b.prototype.schedule.call(this,
c,d);this.active=!1;var e=new a(this.scheduler,this.work);this.add(e);return e.schedule(c,d)}return C.EMPTY};a.prototype.requestAsyncId=function(b,d,e){void 0===e&&(e=0);this.delay=b.frame+e;b=b.actions;b.push(this);b.sort(a.sortActions);return!0};a.prototype.recycleAsyncId=function(a,b,e){};a.prototype._execute=function(a,d){if(!0===this.active)return b.prototype._execute.call(this,a,d)};a.sortActions=function(a,b){return a.delay===b.delay?a.index===b.index?0:a.index>b.index?1:-1:a.delay>b.delay?
1:-1};return a}(za),K=new p(function(b){return b.complete()}),ab=function(b){return b&&"number"===typeof b.length&&"function"!==typeof b},$a;$a="function"===typeof Symbol&&Symbol.iterator?Symbol.iterator:"@@iterator";(function(b){b.NEXT="N";b.ERROR="E";b.COMPLETE="C"})(g.NotificationKind||(g.NotificationKind={}));var Qa=function(){function b(a,b,d){this.kind=a;this.value=b;this.error=d;this.hasValue="N"===a}b.prototype.observe=function(a){return Ga(this,a)};b.prototype.do=function(a,b,d){var c=this.kind,
f=this.value,h=this.error;return"N"===c?null===a||void 0===a?void 0:a(f):"E"===c?null===b||void 0===b?void 0:b(h):null===d||void 0===d?void 0:d()};b.prototype.accept=function(a,b,d){return q(null===a||void 0===a?void 0:a.next)?this.observe(a):this.do(a,b,d)};b.prototype.toObservable=function(){var a=this.kind,b=this.value,d=this.error,b="N"===a?bb(b):"E"===a?Wb(function(){return d}):"C"===a?K:0;if(!b)throw new TypeError("Unexpected notification kind "+a);return b};b.createNext=function(a){return new b("N",
a)};b.createError=function(a){return new b("E",void 0,a)};b.createComplete=function(){return b.completeNotification};b.completeNotification=new b("C");return b}(),ba=R(function(b){return function(){b(this);this.name="EmptyError";this.message="no elements in sequence"}}),qb=R(function(b){return function(){b(this);this.name="ArgumentOutOfRangeError";this.message="argument out of range"}}),kd=R(function(b){return function(a){b(this);this.name="NotFoundError";this.message=a}}),jd=R(function(b){return function(a){b(this);
this.name="SequenceError";this.message=a}}),Xb=R(function(b){return function(a){void 0===a&&(a=null);b(this);this.message="Timeout has occurred";this.name="TimeoutError";this.info=a}}),le=Array.isArray,me=Array.isArray,ne=Object.getPrototypeOf,oe=Object.prototype,pe=Object.keys,$e={connector:function(){return new B},resetOnDisconnect:!0},te=["addListener","removeListener"],re=["addEventListener","removeEventListener"],ve=["on","off"],Vd=new p(D),we=Array.isArray,Ae=function(b,a){return b.push(a),
b},Ce={connector:function(){return new B}},wd={leading:!0,trailing:!1},Fe=function(){return function(b,a){this.value=b;this.interval=a}}(),af=Object.freeze({audit:jb,auditTime:ic,buffer:jc,bufferCount:kc,bufferTime:lc,bufferToggle:mc,bufferWhen:nc,catchError:kb,combineAll:Ka,combineLatestAll:Ka,combineLatest:mb,combineLatestWith:qc,concat:sc,concatAll:Ia,concatMap:La,concatMapTo:rc,concatWith:tc,connect:Ma,count:uc,debounce:vc,debounceTime:wc,defaultIfEmpty:va,delay:xc,delayWhen:Na,dematerialize:yc,
distinct:zc,distinctUntilChanged:pb,distinctUntilKeyChanged:Ac,elementAt:Bc,endWith:Cc,every:Dc,exhaust:Pa,exhaustAll:Pa,exhaustMap:Oa,expand:Ec,filter:L,finalize:Fc,find:Gc,findIndex:Ic,first:Jc,groupBy:Kc,ignoreElements:nb,isEmpty:Lc,last:Mc,map:P,mapTo:ob,materialize:Nc,max:Oc,merge:Rc,mergeAll:ta,flatMap:H,mergeMap:H,mergeMapTo:Pc,mergeScan:Qc,mergeWith:Sc,min:Tc,multicast:Ra,observeOn:ra,onErrorResumeNext:fc,pairwise:Uc,partition:function(b,a){return function(c){return[L(b,a)(c),L(gc(b,a))(c)]}},
pluck:Vc,publish:Wc,publishBehavior:Xc,publishLast:Zc,publishReplay:$c,race:function(){for(var b=[],a=0;a<arguments.length;a++)b[a]=arguments[a];return sb.apply(void 0,z([],x(aa(b))))},raceWith:sb,reduce:ga,repeat:ad,repeatWhen:bd,retry:cd,retryWhen:dd,refCount:Ya,sample:tb,sampleTime:ed,scan:fd,sequenceEqual:gd,share:ub,shareReplay:hd,single:id,skip:ld,skipLast:md,skipUntil:nd,skipWhile:od,startWith:pd,subscribeOn:sa,switchAll:qd,switchMap:ka,switchMapTo:rd,switchScan:sd,take:ha,takeLast:rb,takeUntil:td,
takeWhile:ud,tap:vd,throttle:wb,throttleTime:xd,throwIfEmpty:wa,timeInterval:yd,timeout:db,timeoutWith:zd,timestamp:Ad,toArray:lb,window:Bd,windowCount:Cd,windowTime:Dd,windowToggle:Ed,windowWhen:Fd,withLatestFrom:Gd,zip:Id,zipAll:Hd,zipWith:Jd}),Ba=function(){return function(b,a){void 0===a&&(a=Infinity);this.subscribedFrame=b;this.unsubscribedFrame=a}}(),Wd=function(){function b(){this.subscriptions=[]}b.prototype.logSubscribedFrame=function(){this.subscriptions.push(new Ba(this.scheduler.now()));
return this.subscriptions.length-1};b.prototype.logUnsubscribedFrame=function(a){var b=this.subscriptions;b[a]=new Ba(b[a].subscribedFrame,this.scheduler.now())};return b}(),Gb=function(b){function a(a,d){var c=b.call(this,function(a){var b=this,c=b.logSubscribedFrame(),d=new C;d.add(new C(function(){b.logUnsubscribedFrame(c)}));b.scheduleMessages(a);return d})||this;c.messages=a;c.subscriptions=[];c.scheduler=d;return c}y(a,b);a.prototype.scheduleMessages=function(a){for(var b=this.messages.length,
c=0;c<b;c++){var f=this.messages[c];a.add(this.scheduler.schedule(function(a){Ga(a.message.notification,a.subscriber)},f.frame,{message:f,subscriber:a}))}};return a}(p);Kd(Gb,[Wd]);var Xd=function(b){function a(a,d){var c=b.call(this)||this;c.messages=a;c.subscriptions=[];c.scheduler=d;return c}y(a,b);a.prototype._subscribe=function(a){var c=this,e=c.logSubscribedFrame(),f=new C;f.add(new C(function(){c.logUnsubscribedFrame(e)}));f.add(b.prototype._subscribe.call(this,a));return f};a.prototype.setup=
function(){for(var a=this,b=a.messages.length,e=function(b){(function(){var c=a.messages[b],d=c.notification;a.scheduler.schedule(function(){Ga(d,a)},c.frame)})()},f=0;f<b;f++)e(f)};return a}(B);Kd(Xd,[Wd]);var bf=function(b){function a(a){var c=b.call(this,Fb,750)||this;c.assertDeepEqual=a;c.hotObservables=[];c.coldObservables=[];c.flushTests=[];c.runMode=!1;return c}y(a,b);a.prototype.createTime=function(b){b=this.runMode?b.trim().indexOf("|"):b.indexOf("|");if(-1===b)throw Error('marble diagram for time should have a completion marker "|"');
return b*a.frameTimeFactor};a.prototype.createColdObservable=function(b,d,e){if(-1!==b.indexOf("^"))throw Error('cold observable cannot have subscription offset "^"');if(-1!==b.indexOf("!"))throw Error('cold observable cannot have unsubscription marker "!"');b=a.parseMarbles(b,d,e,void 0,this.runMode);b=new Gb(b,this);this.coldObservables.push(b);return b};a.prototype.createHotObservable=function(b,d,e){if(-1!==b.indexOf("!"))throw Error('hot observable cannot have unsubscription marker "!"');b=a.parseMarbles(b,
d,e,void 0,this.runMode);b=new Xd(b,this);this.hotObservables.push(b);return b};a.prototype.materializeInnerObservable=function(a,b){var c=this,d=[];a.subscribe({next:function(a){d.push({frame:c.frame-b,notification:J("N",a,void 0)})},error:function(a){d.push({frame:c.frame-b,notification:J("E",void 0,a)})},complete:function(){d.push({frame:c.frame-b,notification:ya})}});return d};a.prototype.expectObservable=function(b,d){var c=this;void 0===d&&(d=null);var f=[],g={actual:f,ready:!1};d=a.parseMarblesAsSubscriptions(d,
this.runMode);var l=Infinity===d.subscribedFrame?0:d.subscribedFrame;d=d.unsubscribedFrame;var k;this.schedule(function(){k=b.subscribe({next:function(a){a=a instanceof p?c.materializeInnerObservable(a,c.frame):a;f.push({frame:c.frame,notification:J("N",a,void 0)})},error:function(a){f.push({frame:c.frame,notification:J("E",void 0,a)})},complete:function(){f.push({frame:c.frame,notification:ya})}})},l);Infinity!==d&&this.schedule(function(){return k.unsubscribe()},d);this.flushTests.push(g);var m=
this.runMode;return{toBe:function(b,c,d){g.ready=!0;g.expected=a.parseMarbles(b,c,d,!0,m)},toEqual:function(a){g.ready=!0;g.expected=[];c.schedule(function(){k=a.subscribe({next:function(a){a=a instanceof p?c.materializeInnerObservable(a,c.frame):a;g.expected.push({frame:c.frame,notification:J("N",a,void 0)})},error:function(a){g.expected.push({frame:c.frame,notification:J("E",void 0,a)})},complete:function(){g.expected.push({frame:c.frame,notification:ya})}})},l)}}};a.prototype.expectSubscriptions=
function(b){var c={actual:b,ready:!1};this.flushTests.push(c);var e=this.runMode;return{toBe:function(b){b="string"===typeof b?[b]:b;c.ready=!0;c.expected=b.map(function(b){return a.parseMarblesAsSubscriptions(b,e)}).filter(function(a){return Infinity!==a.subscribedFrame})}}};a.prototype.flush=function(){for(var a=this,d=this.hotObservables;0<d.length;)d.shift().setup();b.prototype.flush.call(this);this.flushTests=this.flushTests.filter(function(b){return b.ready?(a.assertDeepEqual(b.actual,b.expected),
!1):!0})};a.parseMarblesAsSubscriptions=function(a,b){var c=this;void 0===b&&(b=!1);if("string"!==typeof a)return new Ba(Infinity);var d=z([],x(a));a=d.length;for(var g=-1,l=Infinity,k=Infinity,m=0,n=function(a){var e=m,f=function(a){e+=a*c.frameTimeFactor},h=d[a];switch(h){case " ":b||f(1);break;case "-":f(1);break;case "(":g=m;f(1);break;case ")":g=-1;f(1);break;case "^":if(Infinity!==l)throw Error("found a second subscription point '^' in a subscription marble diagram. There can only be one.");
l=-1<g?g:m;f(1);break;case "!":if(Infinity!==k)throw Error("found a second unsubscription point '!' in a subscription marble diagram. There can only be one.");k=-1<g?g:m;break;default:if(b&&h.match(/^[0-9]$/)&&(0===a||" "===d[a-1])){var n=d.slice(a).join("").match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);if(n){a+=n[0].length-1;var h=parseFloat(n[1]),r=void 0;switch(n[2]){case "ms":r=h;break;case "s":r=1E3*h;break;case "m":r=6E4*h}f(r/p.frameTimeFactor);break}}throw Error("there can only be '^' and '!' markers in a subscription marble diagram. Found instead '"+
h+"'.");}m=e;q=a},p=this,q,t=0;t<a;t++)n(t),t=q;return 0>k?new Ba(l):new Ba(l,k)};a.parseMarbles=function(a,b,e,f,g){var c=this;void 0===f&&(f=!1);void 0===g&&(g=!1);if(-1!==a.indexOf("!"))throw Error('conventional marble diagrams cannot have the unsubscription marker "!"');var d=z([],x(a)),h=d.length,m=[];a=g?a.replace(/^[ ]+/,"").indexOf("^"):a.indexOf("^");var n=-1===a?0:a*-this.frameTimeFactor,q="object"!==typeof b?function(a){return a}:function(a){return f&&b[a]instanceof Gb?b[a].messages:b[a]},
p=-1;a=function(a){var b=n,f=function(a){b+=a*c.frameTimeFactor},h=void 0,k=d[a];switch(k){case " ":g||f(1);break;case "-":f(1);break;case "(":p=n;f(1);break;case ")":p=-1;f(1);break;case "|":h=ya;f(1);break;case "^":f(1);break;case "#":h=J("E",void 0,e||"error");f(1);break;default:if(g&&k.match(/^[0-9]$/)&&(0===a||" "===d[a-1])){var l=d.slice(a).join("").match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);if(l){a+=l[0].length-1;var k=parseFloat(l[1]),r=void 0;switch(l[2]){case "ms":r=k;break;case "s":r=1E3*
k;break;case "m":r=6E4*k}f(r/u.frameTimeFactor);break}}h=J("N",q(k),void 0);f(1)}h&&m.push({frame:-1<p?p:n,notification:h});n=b;t=a};for(var u=this,t,y=0;y<h;y++)a(y),y=t;return m};a.prototype.createAnimator=function(){var b=this;if(!this.runMode)throw Error("animate() must only be used in run mode");var d=0,e;return{animate:function(c){var d,f;if(e)throw Error("animate() must not be called more than once within run()");if(/[|#]/.test(c))throw Error("animate() must not complete or error");e=new Map;
c=a.parseMarbles(c,void 0,void 0,void 0,!0);try{for(var g=F(c),m=g.next();!m.done;m=g.next())b.schedule(function(){var a,c,d=b.now(),f=Array.from(e.values());e.clear();try{for(var g=(a=void 0,F(f)),h=g.next();!h.done;h=g.next()){var k=h.value;k(d)}}catch(Y){a={error:Y}}finally{try{h&&!h.done&&(c=g.return)&&c.call(g)}finally{if(a)throw a.error;}}},m.value.frame)}catch(r){d={error:r}}finally{try{m&&!m.done&&(f=g.return)&&f.call(g)}finally{if(d)throw d.error;}}},delegate:{requestAnimationFrame:function(a){if(!e)throw Error("animate() was not called within run()");
var b=++d;e.set(b,a);return b},cancelAnimationFrame:function(a){if(!e)throw Error("animate() was not called within run()");e.delete(a)}}}};a.prototype.createDelegates=function(){var a=this,b=0,e=new Map,f=function(){var b=a.now(),c=Array.from(e.values()).filter(function(a){return a.due<=b}),d=c.filter(function(a){return"immediate"===a.type});if(0<d.length)d=d[0],c=d.handle,d=d.handler,e.delete(c),d();else if(d=c.filter(function(a){return"interval"===a.type}),0<d.length){var c=d[0],g=c.duration,d=
c.handler;c.due=b+g;c.subscription=a.schedule(f,g);d()}else if(c=c.filter(function(a){return"timeout"===a.type}),0<c.length)d=c[0],c=d.handle,d=d.handler,e.delete(c),d();else throw Error("Expected a due immediate or interval");};return{immediate:{setImmediate:function(c){var d=++b;e.set(d,{due:a.now(),duration:0,handle:d,handler:c,subscription:a.schedule(f,0),type:"immediate"});return d},clearImmediate:function(a){var b=e.get(a);b&&(b.subscription.unsubscribe(),e.delete(a))}},interval:{setInterval:function(c,
d){void 0===d&&(d=0);var g=++b;e.set(g,{due:a.now()+d,duration:d,handle:g,handler:c,subscription:a.schedule(f,d),type:"interval"});return g},clearInterval:function(a){var b=e.get(a);b&&(b.subscription.unsubscribe(),e.delete(a))}},timeout:{setTimeout:function(c,d){void 0===d&&(d=0);var g=++b;e.set(g,{due:a.now()+d,duration:d,handle:g,handler:c,subscription:a.schedule(f,d),type:"timeout"});return g},clearTimeout:function(a){var b=e.get(a);b&&(b.subscription.unsubscribe(),e.delete(a))}}}};a.prototype.run=
function(b){var c=a.frameTimeFactor,e=this.maxFrames;a.frameTimeFactor=1;this.maxFrames=Infinity;this.runMode=!0;var f=this.createAnimator(),g=this.createDelegates();T.delegate=f.delegate;la.delegate=this;na.delegate=g.immediate;ma.delegate=g.interval;ea.delegate=g.timeout;Ea.delegate=this;f={cold:this.createColdObservable.bind(this),hot:this.createHotObservable.bind(this),flush:this.flush.bind(this),time:this.createTime.bind(this),expectObservable:this.expectObservable.bind(this),expectSubscriptions:this.expectSubscriptions.bind(this),
animate:f.animate};try{var l=b(f);this.flush();return l}finally{a.frameTimeFactor=c,this.maxFrames=e,this.runMode=!1,T.delegate=void 0,la.delegate=void 0,na.delegate=void 0,ma.delegate=void 0,ea.delegate=void 0,Ea.delegate=void 0}};a.frameTimeFactor=10;return a}(Ud),cf=Object.freeze({TestScheduler:bf}),xb=function(){return function(b,a,c,d){void 0===d&&(d="download_load");this.originalEvent=b;this.xhr=a;this.request=c;this.type=d;c=a.status;d=a.responseType;this.status=null!==c&&void 0!==c?c:0;this.responseType=
null!==d&&void 0!==d?d:"";this.responseHeaders=(c=a.getAllResponseHeaders())?c.split("\n").reduce(function(a,b){var c=b.indexOf(": ");a[b.slice(0,c)]=b.slice(c+2);return a},{}):{};this.response=Ld(a);a=b.total;this.loaded=b.loaded;this.total=a}}(),xa=R(function(b){return function(a,b,d){this.message=a;this.name="AjaxError";this.xhr=b;this.request=d;this.status=b.status;this.responseType=b.responseType;var c;try{c=Ld(b)}catch(f){c=b.responseText}this.response=c}}),Md=function(){function b(a,b){xa.call(this,
"ajax timeout",a,b);this.name="AjaxTimeoutError";return this}b.prototype=Object.create(xa.prototype);return b}(),Me=P(function(b){return b.response}),ca=function(){var b=function(a){return Ne("string"===typeof a?{url:a}:a)};b.get=Ge;b.post=He;b.delete=Ie;b.put=Je;b.patch=Ke;b.getJSON=Le;return b}(),Pe="upload",Od="download",yb="loadstart",zb="progress",Nd="load",Qe=Object.prototype.toString,df=Object.freeze({ajax:ca,AjaxError:xa,AjaxTimeoutError:Md,AjaxResponse:xb}),ef={url:"",deserializer:function(b){return JSON.parse(b.data)},
serializer:function(b){return JSON.stringify(b)}},Yd=function(b){function a(a,d){var c=b.call(this)||this;c._socket=null;if(a instanceof p)c.destination=d,c.source=a;else{d=c._config=U({},ef);c._output=new B;if("string"===typeof a)d.url=a;else for(var f in a)a.hasOwnProperty(f)&&(d[f]=a[f]);if(!d.WebSocketCtor&&WebSocket)d.WebSocketCtor=WebSocket;else if(!d.WebSocketCtor)throw Error("no WebSocket constructor can be found");c.destination=new ia}return c}y(a,b);a.prototype.lift=function(b){var c=new a(this._config,
this.destination);c.operator=b;c.source=this;return c};a.prototype._resetState=function(){this._socket=null;this.source||(this.destination=new ia);this._output=new B};a.prototype.multiplex=function(a,b,e){var c=this;return new p(function(d){try{c.next(a())}catch(k){d.error(k)}var f=c.subscribe({next:function(a){try{e(a)&&d.next(a)}catch(w){d.error(w)}},error:function(a){return d.error(a)},complete:function(){return d.complete()}});return function(){try{c.next(b())}catch(k){d.error(k)}f.unsubscribe()}})};
a.prototype._connectSocket=function(){var a=this,b=this._config,e=b.WebSocketCtor,f=b.protocol,g=b.url,b=b.binaryType,l=this._output,k=null;try{this._socket=k=f?new e(g,f):new e(g),b&&(this._socket.binaryType=b)}catch(r){l.error(r);return}var m=new C(function(){a._socket=null;k&&1===k.readyState&&k.close()});k.onopen=function(b){if(a._socket){var c=a._config.openObserver;c&&c.next(b);b=a.destination;a.destination=oa.create(function(b){if(1===k.readyState)try{var c=a._config.serializer;k.send(c(b))}catch(u){a.destination.error(u)}},
function(b){var c=a._config.closingObserver;c&&c.next(void 0);b&&b.code?k.close(b.code,b.reason):l.error(new TypeError("WebSocketSubject.error must be called with an object with an error code, and an optional reason: { code: number, reason: string }"));a._resetState()},function(){var b=a._config.closingObserver;b&&b.next(void 0);k.close();a._resetState()});b&&b instanceof ia&&m.add(b.subscribe(a.destination))}else k.close(),a._resetState()};k.onerror=function(b){a._resetState();l.error(b)};k.onclose=
function(b){k===a._socket&&a._resetState();var c=a._config.closeObserver;c&&c.next(b);b.wasClean?l.complete():l.error(b)};k.onmessage=function(b){try{var c=a._config.deserializer;l.next(c(b))}catch(A){l.error(A)}}};a.prototype._subscribe=function(a){var b=this,c=this.source;if(c)return c.subscribe(a);this._socket||this._connectSocket();this._output.subscribe(a);a.add(function(){var a=b._socket;0===b._output.observers.length&&(!a||1!==a.readyState&&0!==a.readyState||a.close(),b._resetState())});return a};
a.prototype.unsubscribe=function(){var a=this._socket;!a||1!==a.readyState&&0!==a.readyState||a.close();this._resetState();b.prototype.unsubscribe.call(this)};return a}(Cb),ff=Object.freeze({webSocket:function(b){return new Yd(b)},WebSocketSubject:Yd}),gf=Object.freeze({fromFetch:function(b,a){void 0===a&&(a={});var c=a.selector,d=Zd(a,["selector"]);return new p(function(a){var e=new AbortController,g=e.signal,l=!0,k=d.signal;if(k)if(k.aborted)e.abort();else{var n=function(){g.aborted||e.abort()};
k.addEventListener("abort",n);a.add(function(){return k.removeEventListener("abort",n)})}var r=U(U({},d),{signal:g}),p=function(b){l=!1;a.error(b)};fetch(b,r).then(function(b){c?t(c(b)).subscribe(m(a,void 0,function(){l=!1;a.complete()},p)):(l=!1,a.next(b),a.complete())}).catch(p);return function(){l&&e.abort()}})}});g.operators=af;g.testing=cf;g.ajax=df;g.webSocket=ff;g.fetch=gf;g.Observable=p;g.ConnectableObservable=Sa;g.observable=qa;g.animationFrames=function(b){return b?Mb(b):Te};g.Subject=B;
g.BehaviorSubject=Yc;g.ReplaySubject=ia;g.AsyncSubject=eb;g.asap=Rd;g.asapScheduler=Rd;g.async=hb;g.asyncScheduler=I;g.queue=Sd;g.queueScheduler=Sd;g.animationFrame=Td;g.animationFrameScheduler=Td;g.VirtualTimeScheduler=Ud;g.VirtualAction=Fb;g.Scheduler=Eb;g.Subscription=C;g.Subscriber=oa;g.Notification=Qa;g.pipe=Xa;g.noop=D;g.identity=E;g.isObservable=function(b){return!!b&&(b instanceof p||q(b.lift)&&q(b.subscribe))};g.lastValueFrom=function(b,a){var c="object"===typeof a;return new Promise(function(d,
e){var f=!1,g;b.subscribe({next:function(a){g=a;f=!0},error:e,complete:function(){f?d(g):c?d(a.defaultValue):e(new ba)}})})};g.firstValueFrom=function(b,a){var c="object"===typeof a;return new Promise(function(d,e){var f=new ja({next:function(a){d(a);f.unsubscribe()},error:e,complete:function(){c?d(a.defaultValue):e(new ba)}});b.subscribe(f)})};g.ArgumentOutOfRangeError=qb;g.EmptyError=ba;g.NotFoundError=kd;g.ObjectUnsubscribedError=Qd;g.SequenceError=jd;g.TimeoutError=Xb;g.UnsubscriptionError=Ta;
g.bindCallback=function(b,a,c){return Ha(!1,b,a,c)};g.bindNodeCallback=function(b,a,c){return Ha(!0,b,a,c)};g.combineLatest=$b;g.concat=ua;g.connectable=function(b,a){void 0===a&&(a=$e);var c=null,d=a.connector;a=a.resetOnDisconnect;var e=void 0===a?!0:a,f=d();a=new p(function(a){return f.subscribe(a)});a.connect=function(){if(!c||c.closed)c=Ja(function(){return b}).subscribe(f),e&&c.add(function(){return f=d()});return c};return a};g.defer=Ja;g.empty=function(b){return b?de(b):K};g.forkJoin=function(){for(var b=
[],a=0;a<arguments.length;a++)b[a]=arguments[a];var a=pa(b),b=Yb(b),c=b.args,d=b.keys,b=new p(function(a){var b=c.length;if(b)for(var e=Array(b),g=b,k=b,n=function(b){var f=!1;t(c[b]).subscribe(m(a,function(a){f||(f=!0,k--);e[b]=a},function(){return g--},void 0,function(){g&&f||(k||a.next(d?Zb(d,e):e),a.complete())}))},p=0;p<b;p++)n(p);else a.complete()});return a?b.pipe(X(a)):b};g.from=O;g.fromEvent=gb;g.fromEventPattern=dc;g.generate=function(b,a,c,d,e){function f(){var b;return Va(this,function(d){switch(d.label){case 0:b=
k,d.label=1;case 1:return a&&!a(b)?[3,4]:[4,l(b)];case 2:d.sent(),d.label=3;case 3:return b=c(b),[3,1];case 4:return[2]}})}var g,l,k;1===arguments.length?(k=b.initialState,a=b.condition,c=b.iterate,g=b.resultSelector,l=void 0===g?E:g,e=b.scheduler):(k=b,!d||Fa(d)?(l=E,e=d):l=d);return Ja(e?function(){return Tb(f(),e)}:f)};g.iif=function(b,a,c){return Ja(function(){return b()?a:c})};g.interval=ec;g.merge=function(){for(var b=[],a=0;a<arguments.length;a++)b[a]=arguments[a];var a=N(b),c="number"===typeof b[b.length-
1]?b.pop():Infinity;return b.length?1===b.length?t(b[0]):ta(c)(O(b,a)):K};g.never=function(){return Vd};g.of=bb;g.onErrorResumeNext=function(){for(var b=[],a=0;a<arguments.length;a++)b[a]=arguments[a];return fc(aa(b))(K)};g.pairs=function(b,a){return O(Object.entries(b),a)};g.partition=function(b,a,c){return[L(a,c)(t(b)),L(gc(a,c))(t(b))]};g.race=function(){for(var b=[],a=0;a<arguments.length;a++)b[a]=arguments[a];b=aa(b);return 1===b.length?t(b[0]):new p(hc(b))};g.range=function(b,a,c){null==a&&
(a=b,b=0);if(0>=a)return K;var d=a+b;return new p(c?function(a){var e=b;return c.schedule(function(){e<d?(a.next(e++),this.schedule()):a.complete()})}:function(a){for(var c=b;c<d&&!a.closed;)a.next(c++);a.complete()})};g.throwError=Wb;g.timer=Z;g.using=function(b,a){return new p(function(c){var d=b(),e=a(d);(e?t(e):K).subscribe(c);return function(){d&&d.unsubscribe()}})};g.zip=ib;g.scheduled=Vb;g.EMPTY=K;g.NEVER=Vd;g.config=S;g.audit=jb;g.auditTime=ic;g.buffer=jc;g.bufferCount=kc;g.bufferTime=lc;
g.bufferToggle=mc;g.bufferWhen=nc;g.catchError=kb;g.combineAll=Ka;g.combineLatestAll=Ka;g.combineLatestWith=qc;g.concatAll=Ia;g.concatMap=La;g.concatMapTo=rc;g.concatWith=tc;g.connect=Ma;g.count=uc;g.debounce=vc;g.debounceTime=wc;g.defaultIfEmpty=va;g.delay=xc;g.delayWhen=Na;g.dematerialize=yc;g.distinct=zc;g.distinctUntilChanged=pb;g.distinctUntilKeyChanged=Ac;g.elementAt=Bc;g.endWith=Cc;g.every=Dc;g.exhaust=Pa;g.exhaustAll=Pa;g.exhaustMap=Oa;g.expand=Ec;g.filter=L;g.finalize=Fc;g.find=Gc;g.findIndex=
Ic;g.first=Jc;g.groupBy=Kc;g.ignoreElements=nb;g.isEmpty=Lc;g.last=Mc;g.map=P;g.mapTo=ob;g.materialize=Nc;g.max=Oc;g.mergeAll=ta;g.flatMap=H;g.mergeMap=H;g.mergeMapTo=Pc;g.mergeScan=Qc;g.mergeWith=Sc;g.min=Tc;g.multicast=Ra;g.observeOn=ra;g.pairwise=Uc;g.pluck=Vc;g.publish=Wc;g.publishBehavior=Xc;g.publishLast=Zc;g.publishReplay=$c;g.raceWith=sb;g.reduce=ga;g.repeat=ad;g.repeatWhen=bd;g.retry=cd;g.retryWhen=dd;g.refCount=Ya;g.sample=tb;g.sampleTime=ed;g.scan=fd;g.sequenceEqual=gd;g.share=ub;g.shareReplay=
hd;g.single=id;g.skip=ld;g.skipLast=md;g.skipUntil=nd;g.skipWhile=od;g.startWith=pd;g.subscribeOn=sa;g.switchAll=qd;g.switchMap=ka;g.switchMapTo=rd;g.switchScan=sd;g.take=ha;g.takeLast=rb;g.takeUntil=td;g.takeWhile=ud;g.tap=vd;g.throttle=wb;g.throttleTime=xd;g.throwIfEmpty=wa;g.timeInterval=yd;g.timeout=db;g.timeoutWith=zd;g.timestamp=Ad;g.toArray=lb;g.window=Bd;g.windowCount=Cd;g.windowTime=Dd;g.windowToggle=Ed;g.windowWhen=Fd;g.withLatestFrom=Gd;g.zipAll=Hd;g.zipWith=Jd;Object.defineProperty(g,
"__esModule",{value:!0})});
//# sourceMappingURL=rxjs.umd.min.js.map

{
  "name": "rxjs/ajax",
  "types": "../dist/types/ajax/index.d.ts",
  "main": "../dist/cjs/ajax/index.js",
  "module": "../dist/esm5/ajax/index.js",
  "es2015": "../dist/esm/ajax/index.js",
  "sideEffects": false
}
The MIT License (MIT)

Copyright (c) Feross Aboukhadijeh

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.
/* eslint-disable node/no-deprecated-api */
var buffer = require('buffer')
var Buffer = buffer.Buffer

// alternative to using Object.keys for old browsers
function copyProps (src, dst) {
  for (var key in src) {
    dst[key] = src[key]
  }
}
if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
  module.exports = buffer
} else {
  // Copy properties from require('buffer')
  copyProps(buffer, exports)
  exports.Buffer = SafeBuffer
}

function SafeBuffer (arg, encodingOrOffset, length) {
  return Buffer(arg, encodingOrOffset, length)
}

// Copy static methods from Buffer
copyProps(Buffer, SafeBuffer)

SafeBuffer.from = function (arg, encodingOrOffset, length) {
  if (typeof arg === 'number') {
    throw new TypeError('Argument must not be a number')
  }
  return Buffer(arg, encodingOrOffset, length)
}

SafeBuffer.alloc = function (size, fill, encoding) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  var buf = Buffer(size)
  if (fill !== undefined) {
    if (typeof encoding === 'string') {
      buf.fill(fill, encoding)
    } else {
      buf.fill(fill)
    }
  } else {
    buf.fill(0)
  }
  return buf
}

SafeBuffer.allocUnsafe = function (size) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  return Buffer(size)
}

SafeBuffer.allocUnsafeSlow = function (size) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  return buffer.SlowBuffer(size)
}
{
  "name": "safe-buffer",
  "description": "Safer Node.js Buffer API",
  "version": "5.1.2",
  "author": {
    "name": "Feross Aboukhadijeh",
    "email": "feross@feross.org",
    "url": "http://feross.org"
  },
  "devDependencies": {
    "standard": "*",
    "tape": "^4.0.0"
  },
  "homepage": "https://github.com/feross/safe-buffer",
  "license": "MIT",
  "main": "index.js",
  "types": "index.d.ts",
  "repository": {
    "type": "git",
    "url": "git://github.com/feross/safe-buffer.git"
  }
}MIT License

Copyright (c) 2018 Nikita Skovoroda <chalkerx@gmail.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.
# Porting to the Buffer.from/Buffer.alloc API

<a id="overview"></a>
## Overview

- [Variant 1: Drop support for Node.js ≤ 4.4.x and 5.0.0 — 5.9.x.](#variant-1) (*recommended*)
- [Variant 2: Use a polyfill](#variant-2)
- [Variant 3: manual detection, with safeguards](#variant-3)

### Finding problematic bits of code using grep

Just run `grep -nrE '[^a-zA-Z](Slow)?Buffer\s*\(' --exclude-dir node_modules`.

It will find all the potentially unsafe places in your own code (with some considerably unlikely
exceptions).

### Finding problematic bits of code using Node.js 8

If you’re using Node.js ≥ 8.0.0 (which is recommended), Node.js exposes multiple options that help with finding the relevant pieces of code:

- `--trace-warnings` will make Node.js show a stack trace for this warning and other warnings that are printed by Node.js.
- `--trace-deprecation` does the same thing, but only for deprecation warnings.
- `--pending-deprecation` will show more types of deprecation warnings. In particular, it will show the `Buffer()` deprecation warning, even on Node.js 8.

You can set these flags using an environment variable:

```console
$ export NODE_OPTIONS='--trace-warnings --pending-deprecation'
$ cat example.js
'use strict';
const foo = new Buffer('foo');
$ node example.js
(node:7147) [DEP0005] DeprecationWarning: The Buffer() and new Buffer() constructors are not recommended for use due to security and usability concerns. Please use the new Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() construction methods instead.
    at showFlaggedDeprecation (buffer.js:127:13)
    at new Buffer (buffer.js:148:3)
    at Object.<anonymous> (/path/to/example.js:2:13)
    [... more stack trace lines ...]
```

### Finding problematic bits of code using linters

Eslint rules [no-buffer-constructor](https://eslint.org/docs/rules/no-buffer-constructor)
or
[node/no-deprecated-api](https://github.com/mysticatea/eslint-plugin-node/blob/master/docs/rules/no-deprecated-api.md)
also find calls to deprecated `Buffer()` API. Those rules are included in some pre-sets.

There is a drawback, though, that it doesn't always
[work correctly](https://github.com/chalker/safer-buffer#why-not-safe-buffer) when `Buffer` is
overriden e.g. with a polyfill, so recommended is a combination of this and some other method
described above.

<a id="variant-1"></a>
## Variant 1: Drop support for Node.js ≤ 4.4.x and 5.0.0 — 5.9.x.

This is the recommended solution nowadays that would imply only minimal overhead.

The Node.js 5.x release line has been unsupported since July 2016, and the Node.js 4.x release line reaches its End of Life in April 2018 (→ [Schedule](https://github.com/nodejs/Release#release-schedule)). This means that these versions of Node.js will *not* receive any updates, even in case of security issues, so using these release lines should be avoided, if at all possible.

What you would do in this case is to convert all `new Buffer()` or `Buffer()` calls to use `Buffer.alloc()` or `Buffer.from()`, in the following way:

- For `new Buffer(number)`, replace it with `Buffer.alloc(number)`.
- For `new Buffer(string)` (or `new Buffer(string, encoding)`), replace it with `Buffer.from(string)` (or `Buffer.from(string, encoding)`).
- For all other combinations of arguments (these are much rarer), also replace `new Buffer(...arguments)` with `Buffer.from(...arguments)`.

Note that `Buffer.alloc()` is also _faster_ on the current Node.js versions than
`new Buffer(size).fill(0)`, which is what you would otherwise need to ensure zero-filling.

Enabling eslint rule [no-buffer-constructor](https://eslint.org/docs/rules/no-buffer-constructor)
or
[node/no-deprecated-api](https://github.com/mysticatea/eslint-plugin-node/blob/master/docs/rules/no-deprecated-api.md)
is recommended to avoid accidential unsafe Buffer API usage.

There is also a [JSCodeshift codemod](https://github.com/joyeecheung/node-dep-codemod#dep005)
for automatically migrating Buffer constructors to `Buffer.alloc()` or `Buffer.from()`.
Note that it currently only works with cases where the arguments are literals or where the
constructor is invoked with two arguments.

_If you currently support those older Node.js versions and dropping them would be a semver-major change
for you, or if you support older branches of your packages, consider using [Variant 2](#variant-2)
or [Variant 3](#variant-3) on older branches, so people using those older branches will also receive
the fix. That way, you will eradicate potential issues caused by unguarded Buffer API usage and
your users will not observe a runtime deprecation warning when running your code on Node.js 10._

<a id="variant-2"></a>
## Variant 2: Use a polyfill

Utilize [safer-buffer](https://www.npmjs.com/package/safer-buffer) as a polyfill to support older
Node.js versions.

You would take exacly the same steps as in [Variant 1](#variant-1), but with a polyfill
`const Buffer = require('safer-buffer').Buffer` in all files where you use the new `Buffer` api.

Make sure that you do not use old `new Buffer` API — in any files where the line above is added,
using old `new Buffer()` API will _throw_. It will be easy to notice that in CI, though.

Alternatively, you could use [buffer-from](https://www.npmjs.com/package/buffer-from) and/or
[buffer-alloc](https://www.npmjs.com/package/buffer-alloc) [ponyfills](https://ponyfill.com/) —
those are great, the only downsides being 4 deps in the tree and slightly more code changes to
migrate off them (as you would be using e.g. `Buffer.from` under a different name). If you need only
`Buffer.from` polyfilled — `buffer-from` alone which comes with no extra dependencies.

_Alternatively, you could use [safe-buffer](https://www.npmjs.com/package/safe-buffer) — it also
provides a polyfill, but takes a different approach which has
[it's drawbacks](https://github.com/chalker/safer-buffer#why-not-safe-buffer). It will allow you
to also use the older `new Buffer()` API in your code, though — but that's arguably a benefit, as
it is problematic, can cause issues in your code, and will start emitting runtime deprecation
warnings starting with Node.js 10._

Note that in either case, it is important that you also remove all calls to the old Buffer
API manually — just throwing in `safe-buffer` doesn't fix the problem by itself, it just provides
a polyfill for the new API. I have seen people doing that mistake.

Enabling eslint rule [no-buffer-constructor](https://eslint.org/docs/rules/no-buffer-constructor)
or
[node/no-deprecated-api](https://github.com/mysticatea/eslint-plugin-node/blob/master/docs/rules/no-deprecated-api.md)
is recommended.

_Don't forget to drop the polyfill usage once you drop support for Node.js < 4.5.0._

<a id="variant-3"></a>
## Variant 3 — manual detection, with safeguards

This is useful if you create Buffer instances in only a few places (e.g. one), or you have your own
wrapper around them.

### Buffer(0)

This special case for creating empty buffers can be safely replaced with `Buffer.concat([])`, which
returns the same result all the way down to Node.js 0.8.x.

### Buffer(notNumber)

Before:

```js
var buf = new Buffer(notNumber, encoding);
```

After:

```js
var buf;
if (Buffer.from && Buffer.from !== Uint8Array.from) {
  buf = Buffer.from(notNumber, encoding);
} else {
  if (typeof notNumber === 'number')
    throw new Error('The "size" argument must be of type number.');
  buf = new Buffer(notNumber, encoding);
}
```

`encoding` is optional.

Note that the `typeof notNumber` before `new Buffer` is required (for cases when `notNumber` argument is not
hard-coded) and _is not caused by the deprecation of Buffer constructor_ — it's exactly _why_ the
Buffer constructor is deprecated. Ecosystem packages lacking this type-check caused numereous
security issues — situations when unsanitized user input could end up in the `Buffer(arg)` create
problems ranging from DoS to leaking sensitive information to the attacker from the process memory.

When `notNumber` argument is hardcoded (e.g. literal `"abc"` or `[0,1,2]`), the `typeof` check can
be omitted.

Also note that using TypeScript does not fix this problem for you — when libs written in
`TypeScript` are used from JS, or when user input ends up there — it behaves exactly as pure JS, as
all type checks are translation-time only and are not present in the actual JS code which TS
compiles to.

### Buffer(number)

For Node.js 0.10.x (and below) support:

```js
var buf;
if (Buffer.alloc) {
  buf = Buffer.alloc(number);
} else {
  buf = new Buffer(number);
  buf.fill(0);
}
```

Otherwise (Node.js ≥ 0.12.x):

```js
const buf = Buffer.alloc ? Buffer.alloc(number) : new Buffer(number).fill(0);
```

## Regarding Buffer.allocUnsafe

Be extra cautious when using `Buffer.allocUnsafe`:
 * Don't use it if you don't have a good reason to
   * e.g. you probably won't ever see a performance difference for small buffers, in fact, those
     might be even faster with `Buffer.alloc()`,
   * if your code is not in the hot code path — you also probably won't notice a difference,
   * keep in mind that zero-filling minimizes the potential risks.
 * If you use it, make sure that you never return the buffer in a partially-filled state,
   * if you are writing to it sequentially — always truncate it to the actuall written length

Errors in handling buffers allocated with `Buffer.allocUnsafe` could result in various issues,
ranged from undefined behaviour of your code to sensitive data (user input, passwords, certs)
leaking to the remote attacker.

_Note that the same applies to `new Buffer` usage without zero-filling, depending on the Node.js
version (and lacking type checks also adds DoS to the list of potential problems)._

<a id="faq"></a>
## FAQ

<a id="design-flaws"></a>
### What is wrong with the `Buffer` constructor?

The `Buffer` constructor could be used to create a buffer in many different ways:

- `new Buffer(42)` creates a `Buffer` of 42 bytes. Before Node.js 8, this buffer contained
  *arbitrary memory* for performance reasons, which could include anything ranging from
  program source code to passwords and encryption keys.
- `new Buffer('abc')` creates a `Buffer` that contains the UTF-8-encoded version of
  the string `'abc'`. A second argument could specify another encoding: For example,
  `new Buffer(string, 'base64')` could be used to convert a Base64 string into the original
  sequence of bytes that it represents.
- There are several other combinations of arguments.

This meant that, in code like `var buffer = new Buffer(foo);`, *it is not possible to tell
what exactly the contents of the generated buffer are* without knowing the type of `foo`.

Sometimes, the value of `foo` comes from an external source. For example, this function
could be exposed as a service on a web server, converting a UTF-8 string into its Base64 form:

```
function stringToBase64(req, res) {
  // The request body should have the format of `{ string: 'foobar' }`
  const rawBytes = new Buffer(req.body.string)
  const encoded = rawBytes.toString('base64')
  res.end({ encoded: encoded })
}
```

Note that this code does *not* validate the type of `req.body.string`:

- `req.body.string` is expected to be a string. If this is the case, all goes well.
- `req.body.string` is controlled by the client that sends the request.
- If `req.body.string` is the *number* `50`, the `rawBytes` would be 50 bytes:
  - Before Node.js 8, the content would be uninitialized
  - After Node.js 8, the content would be `50` bytes with the value `0`

Because of the missing type check, an attacker could intentionally send a number
as part of the request. Using this, they can either:

- Read uninitialized memory. This **will** leak passwords, encryption keys and other
  kinds of sensitive information. (Information leak)
- Force the program to allocate a large amount of memory. For example, when specifying
  `500000000` as the input value, each request will allocate 500MB of memory.
  This can be used to either exhaust the memory available of a program completely
  and make it crash, or slow it down significantly. (Denial of Service)

Both of these scenarios are considered serious security issues in a real-world
web server context.

when using `Buffer.from(req.body.string)` instead, passing a number will always
throw an exception instead, giving a controlled behaviour that can always be
handled by the program.

<a id="ecosystem-usage"></a>
### The `Buffer()` constructor has been deprecated for a while. Is this really an issue?

Surveys of code in the `npm` ecosystem have shown that the `Buffer()` constructor is still
widely used. This includes new code, and overall usage of such code has actually been
*increasing*.
/* eslint-disable node/no-deprecated-api */

'use strict'

var buffer = require('buffer')
var Buffer = buffer.Buffer
var safer = require('./safer.js')
var Safer = safer.Buffer

var dangerous = {}

var key

for (key in safer) {
  if (!safer.hasOwnProperty(key)) continue
  dangerous[key] = safer[key]
}

var Dangereous = dangerous.Buffer = {}

// Copy Safer API
for (key in Safer) {
  if (!Safer.hasOwnProperty(key)) continue
  Dangereous[key] = Safer[key]
}

// Copy those missing unsafe methods, if they are present
for (key in Buffer) {
  if (!Buffer.hasOwnProperty(key)) continue
  if (Dangereous.hasOwnProperty(key)) continue
  Dangereous[key] = Buffer[key]
}

if (!Dangereous.allocUnsafe) {
  Dangereous.allocUnsafe = function (size) {
    if (typeof size !== 'number') {
      throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size)
    }
    if (size < 0 || size >= 2 * (1 << 30)) {
      throw new RangeError('The value "' + size + '" is invalid for option "size"')
    }
    return Buffer(size)
  }
}

if (!Dangereous.allocUnsafeSlow) {
  Dangereous.allocUnsafeSlow = function (size) {
    if (typeof size !== 'number') {
      throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size)
    }
    if (size < 0 || size >= 2 * (1 << 30)) {
      throw new RangeError('The value "' + size + '" is invalid for option "size"')
    }
    return buffer.SlowBuffer(size)
  }
}

module.exports = dangerous
{
  "name": "safer-buffer",
  "version": "2.1.2",
  "description": "Modern Buffer API polyfill without footguns",
  "main": "safer.js",
  "author": {
    "name": "Nikita Skovoroda",
    "email": "chalkerx@gmail.com",
    "url": "https://github.com/ChALkeR"
  },
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/ChALkeR/safer-buffer.git"
  },
  "devDependencies": {
    "standard": "^11.0.1",
    "tape": "^4.9.0"
  },
  "files": [
    "Porting-Buffer.md",
    "Readme.md",
    "tests.js",
    "dangerous.js",
    "safer.js"
  ]
}/* eslint-disable node/no-deprecated-api */

'use strict'

var buffer = require('buffer')
var Buffer = buffer.Buffer

var safer = {}

var key

for (key in buffer) {
  if (!buffer.hasOwnProperty(key)) continue
  if (key === 'SlowBuffer' || key === 'Buffer') continue
  safer[key] = buffer[key]
}

var Safer = safer.Buffer = {}
for (key in Buffer) {
  if (!Buffer.hasOwnProperty(key)) continue
  if (key === 'allocUnsafe' || key === 'allocUnsafeSlow') continue
  Safer[key] = Buffer[key]
}

safer.Buffer.prototype = Buffer.prototype

if (!Safer.from || Safer.from === Uint8Array.from) {
  Safer.from = function (value, encodingOrOffset, length) {
    if (typeof value === 'number') {
      throw new TypeError('The "value" argument must not be of type number. Received type ' + typeof value)
    }
    if (value && typeof value.length === 'undefined') {
      throw new TypeError('The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type ' + typeof value)
    }
    return Buffer(value, encodingOrOffset, length)
  }
}

if (!Safer.alloc) {
  Safer.alloc = function (size, fill, encoding) {
    if (typeof size !== 'number') {
      throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size)
    }
    if (size < 0 || size >= 2 * (1 << 30)) {
      throw new RangeError('The value "' + size + '" is invalid for option "size"')
    }
    var buf = Buffer(size)
    if (!fill || fill.length === 0) {
      buf.fill(0)
    } else if (typeof encoding === 'string') {
      buf.fill(fill, encoding)
    } else {
      buf.fill(fill)
    }
    return buf
  }
}

if (!safer.kStringMaxLength) {
  try {
    safer.kStringMaxLength = process.binding('buffer').kStringMaxLength
  } catch (e) {
    // we can't determine kStringMaxLength in environments where process.binding
    // is unsupported, so let's not set it
  }
}

if (!safer.constants) {
  safer.constants = {
    MAX_LENGTH: safer.kMaxLength
  }
  if (safer.kStringMaxLength) {
    safer.constants.MAX_STRING_LENGTH = safer.kStringMaxLength
  }
}

module.exports = safer
/* eslint-disable node/no-deprecated-api */

'use strict'

var test = require('tape')

var buffer = require('buffer')

var index = require('./')
var safer = require('./safer')
var dangerous = require('./dangerous')

/* Inheritance tests */

test('Default is Safer', function (t) {
  t.equal(index, safer)
  t.notEqual(safer, dangerous)
  t.notEqual(index, dangerous)
  t.end()
})

test('Is not a function', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.equal(typeof impl, 'object')
    t.equal(typeof impl.Buffer, 'object')
  });
  [buffer].forEach(function (impl) {
    t.equal(typeof impl, 'object')
    t.equal(typeof impl.Buffer, 'function')
  })
  t.end()
})

test('Constructor throws', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.throws(function () { impl.Buffer() })
    t.throws(function () { impl.Buffer(0) })
    t.throws(function () { impl.Buffer('a') })
    t.throws(function () { impl.Buffer('a', 'utf-8') })
    t.throws(function () { return new impl.Buffer() })
    t.throws(function () { return new impl.Buffer(0) })
    t.throws(function () { return new impl.Buffer('a') })
    t.throws(function () { return new impl.Buffer('a', 'utf-8') })
  })
  t.end()
})

test('Safe methods exist', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.equal(typeof impl.Buffer.alloc, 'function', 'alloc')
    t.equal(typeof impl.Buffer.from, 'function', 'from')
  })
  t.end()
})

test('Unsafe methods exist only in Dangerous', function (t) {
  [index, safer].forEach(function (impl) {
    t.equal(typeof impl.Buffer.allocUnsafe, 'undefined')
    t.equal(typeof impl.Buffer.allocUnsafeSlow, 'undefined')
  });
  [dangerous].forEach(function (impl) {
    t.equal(typeof impl.Buffer.allocUnsafe, 'function')
    t.equal(typeof impl.Buffer.allocUnsafeSlow, 'function')
  })
  t.end()
})

test('Generic methods/properties are defined and equal', function (t) {
  ['poolSize', 'isBuffer', 'concat', 'byteLength'].forEach(function (method) {
    [index, safer, dangerous].forEach(function (impl) {
      t.equal(impl.Buffer[method], buffer.Buffer[method], method)
      t.notEqual(typeof impl.Buffer[method], 'undefined', method)
    })
  })
  t.end()
})

test('Built-in buffer static methods/properties are inherited', function (t) {
  Object.keys(buffer).forEach(function (method) {
    if (method === 'SlowBuffer' || method === 'Buffer') return;
    [index, safer, dangerous].forEach(function (impl) {
      t.equal(impl[method], buffer[method], method)
      t.notEqual(typeof impl[method], 'undefined', method)
    })
  })
  t.end()
})

test('Built-in Buffer static methods/properties are inherited', function (t) {
  Object.keys(buffer.Buffer).forEach(function (method) {
    if (method === 'allocUnsafe' || method === 'allocUnsafeSlow') return;
    [index, safer, dangerous].forEach(function (impl) {
      t.equal(impl.Buffer[method], buffer.Buffer[method], method)
      t.notEqual(typeof impl.Buffer[method], 'undefined', method)
    })
  })
  t.end()
})

test('.prototype property of Buffer is inherited', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.equal(impl.Buffer.prototype, buffer.Buffer.prototype, 'prototype')
    t.notEqual(typeof impl.Buffer.prototype, 'undefined', 'prototype')
  })
  t.end()
})

test('All Safer methods are present in Dangerous', function (t) {
  Object.keys(safer).forEach(function (method) {
    if (method === 'Buffer') return;
    [index, safer, dangerous].forEach(function (impl) {
      t.equal(impl[method], safer[method], method)
      if (method !== 'kStringMaxLength') {
        t.notEqual(typeof impl[method], 'undefined', method)
      }
    })
  })
  Object.keys(safer.Buffer).forEach(function (method) {
    [index, safer, dangerous].forEach(function (impl) {
      t.equal(impl.Buffer[method], safer.Buffer[method], method)
      t.notEqual(typeof impl.Buffer[method], 'undefined', method)
    })
  })
  t.end()
})

test('Safe methods from Dangerous methods are present in Safer', function (t) {
  Object.keys(dangerous).forEach(function (method) {
    if (method === 'Buffer') return;
    [index, safer, dangerous].forEach(function (impl) {
      t.equal(impl[method], dangerous[method], method)
      if (method !== 'kStringMaxLength') {
        t.notEqual(typeof impl[method], 'undefined', method)
      }
    })
  })
  Object.keys(dangerous.Buffer).forEach(function (method) {
    if (method === 'allocUnsafe' || method === 'allocUnsafeSlow') return;
    [index, safer, dangerous].forEach(function (impl) {
      t.equal(impl.Buffer[method], dangerous.Buffer[method], method)
      t.notEqual(typeof impl.Buffer[method], 'undefined', method)
    })
  })
  t.end()
})

/* Behaviour tests */

test('Methods return Buffers', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(0)))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(0, 10)))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(0, 'a')))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(10)))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(10, 'x')))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.alloc(9, 'ab')))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('')))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('string')))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('string', 'utf-8')))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64')))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from([0, 42, 3])))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from(new Uint8Array([0, 42, 3]))))
    t.ok(buffer.Buffer.isBuffer(impl.Buffer.from([])))
  });
  ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) {
    t.ok(buffer.Buffer.isBuffer(dangerous.Buffer[method](0)))
    t.ok(buffer.Buffer.isBuffer(dangerous.Buffer[method](10)))
  })
  t.end()
})

test('Constructor is buffer.Buffer', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.equal(impl.Buffer.alloc(0).constructor, buffer.Buffer)
    t.equal(impl.Buffer.alloc(0, 10).constructor, buffer.Buffer)
    t.equal(impl.Buffer.alloc(0, 'a').constructor, buffer.Buffer)
    t.equal(impl.Buffer.alloc(10).constructor, buffer.Buffer)
    t.equal(impl.Buffer.alloc(10, 'x').constructor, buffer.Buffer)
    t.equal(impl.Buffer.alloc(9, 'ab').constructor, buffer.Buffer)
    t.equal(impl.Buffer.from('').constructor, buffer.Buffer)
    t.equal(impl.Buffer.from('string').constructor, buffer.Buffer)
    t.equal(impl.Buffer.from('string', 'utf-8').constructor, buffer.Buffer)
    t.equal(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64').constructor, buffer.Buffer)
    t.equal(impl.Buffer.from([0, 42, 3]).constructor, buffer.Buffer)
    t.equal(impl.Buffer.from(new Uint8Array([0, 42, 3])).constructor, buffer.Buffer)
    t.equal(impl.Buffer.from([]).constructor, buffer.Buffer)
  });
  [0, 10, 100].forEach(function (arg) {
    t.equal(dangerous.Buffer.allocUnsafe(arg).constructor, buffer.Buffer)
    t.equal(dangerous.Buffer.allocUnsafeSlow(arg).constructor, buffer.SlowBuffer(0).constructor)
  })
  t.end()
})

test('Invalid calls throw', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.throws(function () { impl.Buffer.from(0) })
    t.throws(function () { impl.Buffer.from(10) })
    t.throws(function () { impl.Buffer.from(10, 'utf-8') })
    t.throws(function () { impl.Buffer.from('string', 'invalid encoding') })
    t.throws(function () { impl.Buffer.from(-10) })
    t.throws(function () { impl.Buffer.from(1e90) })
    t.throws(function () { impl.Buffer.from(Infinity) })
    t.throws(function () { impl.Buffer.from(-Infinity) })
    t.throws(function () { impl.Buffer.from(NaN) })
    t.throws(function () { impl.Buffer.from(null) })
    t.throws(function () { impl.Buffer.from(undefined) })
    t.throws(function () { impl.Buffer.from() })
    t.throws(function () { impl.Buffer.from({}) })
    t.throws(function () { impl.Buffer.alloc('') })
    t.throws(function () { impl.Buffer.alloc('string') })
    t.throws(function () { impl.Buffer.alloc('string', 'utf-8') })
    t.throws(function () { impl.Buffer.alloc('b25ldHdvdGhyZWU=', 'base64') })
    t.throws(function () { impl.Buffer.alloc(-10) })
    t.throws(function () { impl.Buffer.alloc(1e90) })
    t.throws(function () { impl.Buffer.alloc(2 * (1 << 30)) })
    t.throws(function () { impl.Buffer.alloc(Infinity) })
    t.throws(function () { impl.Buffer.alloc(-Infinity) })
    t.throws(function () { impl.Buffer.alloc(null) })
    t.throws(function () { impl.Buffer.alloc(undefined) })
    t.throws(function () { impl.Buffer.alloc() })
    t.throws(function () { impl.Buffer.alloc([]) })
    t.throws(function () { impl.Buffer.alloc([0, 42, 3]) })
    t.throws(function () { impl.Buffer.alloc({}) })
  });
  ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) {
    t.throws(function () { dangerous.Buffer[method]('') })
    t.throws(function () { dangerous.Buffer[method]('string') })
    t.throws(function () { dangerous.Buffer[method]('string', 'utf-8') })
    t.throws(function () { dangerous.Buffer[method](2 * (1 << 30)) })
    t.throws(function () { dangerous.Buffer[method](Infinity) })
    if (dangerous.Buffer[method] === buffer.Buffer.allocUnsafe) {
      t.skip('Skipping, older impl of allocUnsafe coerced negative sizes to 0')
    } else {
      t.throws(function () { dangerous.Buffer[method](-10) })
      t.throws(function () { dangerous.Buffer[method](-1e90) })
      t.throws(function () { dangerous.Buffer[method](-Infinity) })
    }
    t.throws(function () { dangerous.Buffer[method](null) })
    t.throws(function () { dangerous.Buffer[method](undefined) })
    t.throws(function () { dangerous.Buffer[method]() })
    t.throws(function () { dangerous.Buffer[method]([]) })
    t.throws(function () { dangerous.Buffer[method]([0, 42, 3]) })
    t.throws(function () { dangerous.Buffer[method]({}) })
  })
  t.end()
})

test('Buffers have appropriate lengths', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.equal(impl.Buffer.alloc(0).length, 0)
    t.equal(impl.Buffer.alloc(10).length, 10)
    t.equal(impl.Buffer.from('').length, 0)
    t.equal(impl.Buffer.from('string').length, 6)
    t.equal(impl.Buffer.from('string', 'utf-8').length, 6)
    t.equal(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64').length, 11)
    t.equal(impl.Buffer.from([0, 42, 3]).length, 3)
    t.equal(impl.Buffer.from(new Uint8Array([0, 42, 3])).length, 3)
    t.equal(impl.Buffer.from([]).length, 0)
  });
  ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) {
    t.equal(dangerous.Buffer[method](0).length, 0)
    t.equal(dangerous.Buffer[method](10).length, 10)
  })
  t.end()
})

test('Buffers have appropriate lengths (2)', function (t) {
  t.equal(index.Buffer.alloc, safer.Buffer.alloc)
  t.equal(index.Buffer.alloc, dangerous.Buffer.alloc)
  var ok = true;
  [ safer.Buffer.alloc,
    dangerous.Buffer.allocUnsafe,
    dangerous.Buffer.allocUnsafeSlow
  ].forEach(function (method) {
    for (var i = 0; i < 1e2; i++) {
      var length = Math.round(Math.random() * 1e5)
      var buf = method(length)
      if (!buffer.Buffer.isBuffer(buf)) ok = false
      if (buf.length !== length) ok = false
    }
  })
  t.ok(ok)
  t.end()
})

test('.alloc(size) is zero-filled and has correct length', function (t) {
  t.equal(index.Buffer.alloc, safer.Buffer.alloc)
  t.equal(index.Buffer.alloc, dangerous.Buffer.alloc)
  var ok = true
  for (var i = 0; i < 1e2; i++) {
    var length = Math.round(Math.random() * 2e6)
    var buf = index.Buffer.alloc(length)
    if (!buffer.Buffer.isBuffer(buf)) ok = false
    if (buf.length !== length) ok = false
    var j
    for (j = 0; j < length; j++) {
      if (buf[j] !== 0) ok = false
    }
    buf.fill(1)
    for (j = 0; j < length; j++) {
      if (buf[j] !== 1) ok = false
    }
  }
  t.ok(ok)
  t.end()
})

test('.allocUnsafe / .allocUnsafeSlow are fillable and have correct lengths', function (t) {
  ['allocUnsafe', 'allocUnsafeSlow'].forEach(function (method) {
    var ok = true
    for (var i = 0; i < 1e2; i++) {
      var length = Math.round(Math.random() * 2e6)
      var buf = dangerous.Buffer[method](length)
      if (!buffer.Buffer.isBuffer(buf)) ok = false
      if (buf.length !== length) ok = false
      buf.fill(0, 0, length)
      var j
      for (j = 0; j < length; j++) {
        if (buf[j] !== 0) ok = false
      }
      buf.fill(1, 0, length)
      for (j = 0; j < length; j++) {
        if (buf[j] !== 1) ok = false
      }
    }
    t.ok(ok, method)
  })
  t.end()
})

test('.alloc(size, fill) is `fill`-filled', function (t) {
  t.equal(index.Buffer.alloc, safer.Buffer.alloc)
  t.equal(index.Buffer.alloc, dangerous.Buffer.alloc)
  var ok = true
  for (var i = 0; i < 1e2; i++) {
    var length = Math.round(Math.random() * 2e6)
    var fill = Math.round(Math.random() * 255)
    var buf = index.Buffer.alloc(length, fill)
    if (!buffer.Buffer.isBuffer(buf)) ok = false
    if (buf.length !== length) ok = false
    for (var j = 0; j < length; j++) {
      if (buf[j] !== fill) ok = false
    }
  }
  t.ok(ok)
  t.end()
})

test('.alloc(size, fill) is `fill`-filled', function (t) {
  t.equal(index.Buffer.alloc, safer.Buffer.alloc)
  t.equal(index.Buffer.alloc, dangerous.Buffer.alloc)
  var ok = true
  for (var i = 0; i < 1e2; i++) {
    var length = Math.round(Math.random() * 2e6)
    var fill = Math.round(Math.random() * 255)
    var buf = index.Buffer.alloc(length, fill)
    if (!buffer.Buffer.isBuffer(buf)) ok = false
    if (buf.length !== length) ok = false
    for (var j = 0; j < length; j++) {
      if (buf[j] !== fill) ok = false
    }
  }
  t.ok(ok)
  t.deepEqual(index.Buffer.alloc(9, 'a'), index.Buffer.alloc(9, 97))
  t.notDeepEqual(index.Buffer.alloc(9, 'a'), index.Buffer.alloc(9, 98))

  var tmp = new buffer.Buffer(2)
  tmp.fill('ok')
  if (tmp[1] === tmp[0]) {
    // Outdated Node.js
    t.deepEqual(index.Buffer.alloc(5, 'ok'), index.Buffer.from('ooooo'))
  } else {
    t.deepEqual(index.Buffer.alloc(5, 'ok'), index.Buffer.from('okoko'))
  }
  t.notDeepEqual(index.Buffer.alloc(5, 'ok'), index.Buffer.from('kokok'))

  t.end()
})

test('safer.Buffer.from returns results same as Buffer constructor', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.deepEqual(impl.Buffer.from(''), new buffer.Buffer(''))
    t.deepEqual(impl.Buffer.from('string'), new buffer.Buffer('string'))
    t.deepEqual(impl.Buffer.from('string', 'utf-8'), new buffer.Buffer('string', 'utf-8'))
    t.deepEqual(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64'), new buffer.Buffer('b25ldHdvdGhyZWU=', 'base64'))
    t.deepEqual(impl.Buffer.from([0, 42, 3]), new buffer.Buffer([0, 42, 3]))
    t.deepEqual(impl.Buffer.from(new Uint8Array([0, 42, 3])), new buffer.Buffer(new Uint8Array([0, 42, 3])))
    t.deepEqual(impl.Buffer.from([]), new buffer.Buffer([]))
  })
  t.end()
})

test('safer.Buffer.from returns consistent results', function (t) {
  [index, safer, dangerous].forEach(function (impl) {
    t.deepEqual(impl.Buffer.from(''), impl.Buffer.alloc(0))
    t.deepEqual(impl.Buffer.from([]), impl.Buffer.alloc(0))
    t.deepEqual(impl.Buffer.from(new Uint8Array([])), impl.Buffer.alloc(0))
    t.deepEqual(impl.Buffer.from('string', 'utf-8'), impl.Buffer.from('string'))
    t.deepEqual(impl.Buffer.from('string'), impl.Buffer.from([115, 116, 114, 105, 110, 103]))
    t.deepEqual(impl.Buffer.from('string'), impl.Buffer.from(impl.Buffer.from('string')))
    t.deepEqual(impl.Buffer.from('b25ldHdvdGhyZWU=', 'base64'), impl.Buffer.from('onetwothree'))
    t.notDeepEqual(impl.Buffer.from('b25ldHdvdGhyZWU='), impl.Buffer.from('onetwothree'))
  })
  t.end()
})
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.

====

`String.fromCodePoint` by Mathias Bynens used according to terms of MIT
License, as follows:

    Copyright Mathias Bynens <https://mathiasbynens.be/>

    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": "sax",
  "description": "An evented streaming XML parser in JavaScript",
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
  "version": "1.2.4",
  "main": "lib/sax.js",
  "license": "ISC",
  "repository": "git://github.com/isaacs/sax-js.git",
  "files": [
    "lib/sax.js",
    "LICENSE",
    "README.md"
  ],
  "devDependencies": {
    "standard": "^8.6.0",
    "tap": "^10.5.1"
  }
};(function (sax) { // wrapper for non-node envs
  sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }
  sax.SAXParser = SAXParser
  sax.SAXStream = SAXStream
  sax.createStream = createStream

  // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.
  // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),
  // since that's the earliest that a buffer overrun could occur.  This way, checks are
  // as rare as required, but as often as necessary to ensure never crossing this bound.
  // Furthermore, buffers are only tested at most once per write(), so passing a very
  // large string into write() might have undesirable effects, but this is manageable by
  // the caller, so it is assumed to be safe.  Thus, a call to write() may, in the extreme
  // edge case, result in creating at most one complete copy of the string passed in.
  // Set to Infinity to have unlimited buffers.
  sax.MAX_BUFFER_LENGTH = 64 * 1024

  var buffers = [
    'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype',
    'procInstName', 'procInstBody', 'entity', 'attribName',
    'attribValue', 'cdata', 'script'
  ]

  sax.EVENTS = [
    'text',
    'processinginstruction',
    'sgmldeclaration',
    'doctype',
    'comment',
    'opentagstart',
    'attribute',
    'opentag',
    'closetag',
    'opencdata',
    'cdata',
    'closecdata',
    'error',
    'end',
    'ready',
    'script',
    'opennamespace',
    'closenamespace'
  ]

  function SAXParser (strict, opt) {
    if (!(this instanceof SAXParser)) {
      return new SAXParser(strict, opt)
    }

    var parser = this
    clearBuffers(parser)
    parser.q = parser.c = ''
    parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH
    parser.opt = opt || {}
    parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags
    parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase'
    parser.tags = []
    parser.closed = parser.closedRoot = parser.sawRoot = false
    parser.tag = parser.error = null
    parser.strict = !!strict
    parser.noscript = !!(strict || parser.opt.noscript)
    parser.state = S.BEGIN
    parser.strictEntities = parser.opt.strictEntities
    parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES)
    parser.attribList = []

    // namespaces form a prototype chain.
    // it always points at the current tag,
    // which protos to its parent tag.
    if (parser.opt.xmlns) {
      parser.ns = Object.create(rootNS)
    }

    // mostly just for error reporting
    parser.trackPosition = parser.opt.position !== false
    if (parser.trackPosition) {
      parser.position = parser.line = parser.column = 0
    }
    emit(parser, 'onready')
  }

  if (!Object.create) {
    Object.create = function (o) {
      function F () {}
      F.prototype = o
      var newf = new F()
      return newf
    }
  }

  if (!Object.keys) {
    Object.keys = function (o) {
      var a = []
      for (var i in o) if (o.hasOwnProperty(i)) a.push(i)
      return a
    }
  }

  function checkBufferLength (parser) {
    var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)
    var maxActual = 0
    for (var i = 0, l = buffers.length; i < l; i++) {
      var len = parser[buffers[i]].length
      if (len > maxAllowed) {
        // Text/cdata nodes can get big, and since they're buffered,
        // we can get here under normal conditions.
        // Avoid issues by emitting the text node now,
        // so at least it won't get any bigger.
        switch (buffers[i]) {
          case 'textNode':
            closeText(parser)
            break

          case 'cdata':
            emitNode(parser, 'oncdata', parser.cdata)
            parser.cdata = ''
            break

          case 'script':
            emitNode(parser, 'onscript', parser.script)
            parser.script = ''
            break

          default:
            error(parser, 'Max buffer length exceeded: ' + buffers[i])
        }
      }
      maxActual = Math.max(maxActual, len)
    }
    // schedule the next check for the earliest possible buffer overrun.
    var m = sax.MAX_BUFFER_LENGTH - maxActual
    parser.bufferCheckPosition = m + parser.position
  }

  function clearBuffers (parser) {
    for (var i = 0, l = buffers.length; i < l; i++) {
      parser[buffers[i]] = ''
    }
  }

  function flushBuffers (parser) {
    closeText(parser)
    if (parser.cdata !== '') {
      emitNode(parser, 'oncdata', parser.cdata)
      parser.cdata = ''
    }
    if (parser.script !== '') {
      emitNode(parser, 'onscript', parser.script)
      parser.script = ''
    }
  }

  SAXParser.prototype = {
    end: function () { end(this) },
    write: write,
    resume: function () { this.error = null; return this },
    close: function () { return this.write(null) },
    flush: function () { flushBuffers(this) }
  }

  var Stream
  try {
    Stream = require('stream').Stream
  } catch (ex) {
    Stream = function () {}
  }

  var streamWraps = sax.EVENTS.filter(function (ev) {
    return ev !== 'error' && ev !== 'end'
  })

  function createStream (strict, opt) {
    return new SAXStream(strict, opt)
  }

  function SAXStream (strict, opt) {
    if (!(this instanceof SAXStream)) {
      return new SAXStream(strict, opt)
    }

    Stream.apply(this)

    this._parser = new SAXParser(strict, opt)
    this.writable = true
    this.readable = true

    var me = this

    this._parser.onend = function () {
      me.emit('end')
    }

    this._parser.onerror = function (er) {
      me.emit('error', er)

      // if didn't throw, then means error was handled.
      // go ahead and clear error, so we can write again.
      me._parser.error = null
    }

    this._decoder = null

    streamWraps.forEach(function (ev) {
      Object.defineProperty(me, 'on' + ev, {
        get: function () {
          return me._parser['on' + ev]
        },
        set: function (h) {
          if (!h) {
            me.removeAllListeners(ev)
            me._parser['on' + ev] = h
            return h
          }
          me.on(ev, h)
        },
        enumerable: true,
        configurable: false
      })
    })
  }

  SAXStream.prototype = Object.create(Stream.prototype, {
    constructor: {
      value: SAXStream
    }
  })

  SAXStream.prototype.write = function (data) {
    if (typeof Buffer === 'function' &&
      typeof Buffer.isBuffer === 'function' &&
      Buffer.isBuffer(data)) {
      if (!this._decoder) {
        var SD = require('string_decoder').StringDecoder
        this._decoder = new SD('utf8')
      }
      data = this._decoder.write(data)
    }

    this._parser.write(data.toString())
    this.emit('data', data)
    return true
  }

  SAXStream.prototype.end = function (chunk) {
    if (chunk && chunk.length) {
      this.write(chunk)
    }
    this._parser.end()
    return true
  }

  SAXStream.prototype.on = function (ev, handler) {
    var me = this
    if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) {
      me._parser['on' + ev] = function () {
        var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments)
        args.splice(0, 0, ev)
        me.emit.apply(me, args)
      }
    }

    return Stream.prototype.on.call(me, ev, handler)
  }

  // this really needs to be replaced with character classes.
  // XML allows all manner of ridiculous numbers and digits.
  var CDATA = '[CDATA['
  var DOCTYPE = 'DOCTYPE'
  var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace'
  var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/'
  var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }

  // http://www.w3.org/TR/REC-xml/#NT-NameStartChar
  // This implementation works on strings, a single character at a time
  // as such, it cannot ever support astral-plane characters (10000-EFFFF)
  // without a significant breaking change to either this  parser, or the
  // JavaScript language.  Implementation of an emoji-capable xml parser
  // is left as an exercise for the reader.
  var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/

  var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/

  var entityStart = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/
  var entityBody = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/

  function isWhitespace (c) {
    return c === ' ' || c === '\n' || c === '\r' || c === '\t'
  }

  function isQuote (c) {
    return c === '"' || c === '\''
  }

  function isAttribEnd (c) {
    return c === '>' || isWhitespace(c)
  }

  function isMatch (regex, c) {
    return regex.test(c)
  }

  function notMatch (regex, c) {
    return !isMatch(regex, c)
  }

  var S = 0
  sax.STATE = {
    BEGIN: S++, // leading byte order mark or whitespace
    BEGIN_WHITESPACE: S++, // leading whitespace
    TEXT: S++, // general stuff
    TEXT_ENTITY: S++, // &amp and such.
    OPEN_WAKA: S++, // <
    SGML_DECL: S++, // <!BLARG
    SGML_DECL_QUOTED: S++, // <!BLARG foo "bar
    DOCTYPE: S++, // <!DOCTYPE
    DOCTYPE_QUOTED: S++, // <!DOCTYPE "//blah
    DOCTYPE_DTD: S++, // <!DOCTYPE "//blah" [ ...
    DOCTYPE_DTD_QUOTED: S++, // <!DOCTYPE "//blah" [ "foo
    COMMENT_STARTING: S++, // <!-
    COMMENT: S++, // <!--
    COMMENT_ENDING: S++, // <!-- blah -
    COMMENT_ENDED: S++, // <!-- blah --
    CDATA: S++, // <![CDATA[ something
    CDATA_ENDING: S++, // ]
    CDATA_ENDING_2: S++, // ]]
    PROC_INST: S++, // <?hi
    PROC_INST_BODY: S++, // <?hi there
    PROC_INST_ENDING: S++, // <?hi "there" ?
    OPEN_TAG: S++, // <strong
    OPEN_TAG_SLASH: S++, // <strong /
    ATTRIB: S++, // <a
    ATTRIB_NAME: S++, // <a foo
    ATTRIB_NAME_SAW_WHITE: S++, // <a foo _
    ATTRIB_VALUE: S++, // <a foo=
    ATTRIB_VALUE_QUOTED: S++, // <a foo="bar
    ATTRIB_VALUE_CLOSED: S++, // <a foo="bar"
    ATTRIB_VALUE_UNQUOTED: S++, // <a foo=bar
    ATTRIB_VALUE_ENTITY_Q: S++, // <foo bar="&quot;"
    ATTRIB_VALUE_ENTITY_U: S++, // <foo bar=&quot
    CLOSE_TAG: S++, // </a
    CLOSE_TAG_SAW_WHITE: S++, // </a   >
    SCRIPT: S++, // <script> ...
    SCRIPT_ENDING: S++ // <script> ... <
  }

  sax.XML_ENTITIES = {
    'amp': '&',
    'gt': '>',
    'lt': '<',
    'quot': '"',
    'apos': "'"
  }

  sax.ENTITIES = {
    'amp': '&',
    'gt': '>',
    'lt': '<',
    'quot': '"',
    'apos': "'",
    'AElig': 198,
    'Aacute': 193,
    'Acirc': 194,
    'Agrave': 192,
    'Aring': 197,
    'Atilde': 195,
    'Auml': 196,
    'Ccedil': 199,
    'ETH': 208,
    'Eacute': 201,
    'Ecirc': 202,
    'Egrave': 200,
    'Euml': 203,
    'Iacute': 205,
    'Icirc': 206,
    'Igrave': 204,
    'Iuml': 207,
    'Ntilde': 209,
    'Oacute': 211,
    'Ocirc': 212,
    'Ograve': 210,
    'Oslash': 216,
    'Otilde': 213,
    'Ouml': 214,
    'THORN': 222,
    'Uacute': 218,
    'Ucirc': 219,
    'Ugrave': 217,
    'Uuml': 220,
    'Yacute': 221,
    'aacute': 225,
    'acirc': 226,
    'aelig': 230,
    'agrave': 224,
    'aring': 229,
    'atilde': 227,
    'auml': 228,
    'ccedil': 231,
    'eacute': 233,
    'ecirc': 234,
    'egrave': 232,
    'eth': 240,
    'euml': 235,
    'iacute': 237,
    'icirc': 238,
    'igrave': 236,
    'iuml': 239,
    'ntilde': 241,
    'oacute': 243,
    'ocirc': 244,
    'ograve': 242,
    'oslash': 248,
    'otilde': 245,
    'ouml': 246,
    'szlig': 223,
    'thorn': 254,
    'uacute': 250,
    'ucirc': 251,
    'ugrave': 249,
    'uuml': 252,
    'yacute': 253,
    'yuml': 255,
    'copy': 169,
    'reg': 174,
    'nbsp': 160,
    'iexcl': 161,
    'cent': 162,
    'pound': 163,
    'curren': 164,
    'yen': 165,
    'brvbar': 166,
    'sect': 167,
    'uml': 168,
    'ordf': 170,
    'laquo': 171,
    'not': 172,
    'shy': 173,
    'macr': 175,
    'deg': 176,
    'plusmn': 177,
    'sup1': 185,
    'sup2': 178,
    'sup3': 179,
    'acute': 180,
    'micro': 181,
    'para': 182,
    'middot': 183,
    'cedil': 184,
    'ordm': 186,
    'raquo': 187,
    'frac14': 188,
    'frac12': 189,
    'frac34': 190,
    'iquest': 191,
    'times': 215,
    'divide': 247,
    'OElig': 338,
    'oelig': 339,
    'Scaron': 352,
    'scaron': 353,
    'Yuml': 376,
    'fnof': 402,
    'circ': 710,
    'tilde': 732,
    'Alpha': 913,
    'Beta': 914,
    'Gamma': 915,
    'Delta': 916,
    'Epsilon': 917,
    'Zeta': 918,
    'Eta': 919,
    'Theta': 920,
    'Iota': 921,
    'Kappa': 922,
    'Lambda': 923,
    'Mu': 924,
    'Nu': 925,
    'Xi': 926,
    'Omicron': 927,
    'Pi': 928,
    'Rho': 929,
    'Sigma': 931,
    'Tau': 932,
    'Upsilon': 933,
    'Phi': 934,
    'Chi': 935,
    'Psi': 936,
    'Omega': 937,
    'alpha': 945,
    'beta': 946,
    'gamma': 947,
    'delta': 948,
    'epsilon': 949,
    'zeta': 950,
    'eta': 951,
    'theta': 952,
    'iota': 953,
    'kappa': 954,
    'lambda': 955,
    'mu': 956,
    'nu': 957,
    'xi': 958,
    'omicron': 959,
    'pi': 960,
    'rho': 961,
    'sigmaf': 962,
    'sigma': 963,
    'tau': 964,
    'upsilon': 965,
    'phi': 966,
    'chi': 967,
    'psi': 968,
    'omega': 969,
    'thetasym': 977,
    'upsih': 978,
    'piv': 982,
    'ensp': 8194,
    'emsp': 8195,
    'thinsp': 8201,
    'zwnj': 8204,
    'zwj': 8205,
    'lrm': 8206,
    'rlm': 8207,
    'ndash': 8211,
    'mdash': 8212,
    'lsquo': 8216,
    'rsquo': 8217,
    'sbquo': 8218,
    'ldquo': 8220,
    'rdquo': 8221,
    'bdquo': 8222,
    'dagger': 8224,
    'Dagger': 8225,
    'bull': 8226,
    'hellip': 8230,
    'permil': 8240,
    'prime': 8242,
    'Prime': 8243,
    'lsaquo': 8249,
    'rsaquo': 8250,
    'oline': 8254,
    'frasl': 8260,
    'euro': 8364,
    'image': 8465,
    'weierp': 8472,
    'real': 8476,
    'trade': 8482,
    'alefsym': 8501,
    'larr': 8592,
    'uarr': 8593,
    'rarr': 8594,
    'darr': 8595,
    'harr': 8596,
    'crarr': 8629,
    'lArr': 8656,
    'uArr': 8657,
    'rArr': 8658,
    'dArr': 8659,
    'hArr': 8660,
    'forall': 8704,
    'part': 8706,
    'exist': 8707,
    'empty': 8709,
    'nabla': 8711,
    'isin': 8712,
    'notin': 8713,
    'ni': 8715,
    'prod': 8719,
    'sum': 8721,
    'minus': 8722,
    'lowast': 8727,
    'radic': 8730,
    'prop': 8733,
    'infin': 8734,
    'ang': 8736,
    'and': 8743,
    'or': 8744,
    'cap': 8745,
    'cup': 8746,
    'int': 8747,
    'there4': 8756,
    'sim': 8764,
    'cong': 8773,
    'asymp': 8776,
    'ne': 8800,
    'equiv': 8801,
    'le': 8804,
    'ge': 8805,
    'sub': 8834,
    'sup': 8835,
    'nsub': 8836,
    'sube': 8838,
    'supe': 8839,
    'oplus': 8853,
    'otimes': 8855,
    'perp': 8869,
    'sdot': 8901,
    'lceil': 8968,
    'rceil': 8969,
    'lfloor': 8970,
    'rfloor': 8971,
    'lang': 9001,
    'rang': 9002,
    'loz': 9674,
    'spades': 9824,
    'clubs': 9827,
    'hearts': 9829,
    'diams': 9830
  }

  Object.keys(sax.ENTITIES).forEach(function (key) {
    var e = sax.ENTITIES[key]
    var s = typeof e === 'number' ? String.fromCharCode(e) : e
    sax.ENTITIES[key] = s
  })

  for (var s in sax.STATE) {
    sax.STATE[sax.STATE[s]] = s
  }

  // shorthand
  S = sax.STATE

  function emit (parser, event, data) {
    parser[event] && parser[event](data)
  }

  function emitNode (parser, nodeType, data) {
    if (parser.textNode) closeText(parser)
    emit(parser, nodeType, data)
  }

  function closeText (parser) {
    parser.textNode = textopts(parser.opt, parser.textNode)
    if (parser.textNode) emit(parser, 'ontext', parser.textNode)
    parser.textNode = ''
  }

  function textopts (opt, text) {
    if (opt.trim) text = text.trim()
    if (opt.normalize) text = text.replace(/\s+/g, ' ')
    return text
  }

  function error (parser, er) {
    closeText(parser)
    if (parser.trackPosition) {
      er += '\nLine: ' + parser.line +
        '\nColumn: ' + parser.column +
        '\nChar: ' + parser.c
    }
    er = new Error(er)
    parser.error = er
    emit(parser, 'onerror', er)
    return parser
  }

  function end (parser) {
    if (parser.sawRoot && !parser.closedRoot) strictFail(parser, 'Unclosed root tag')
    if ((parser.state !== S.BEGIN) &&
      (parser.state !== S.BEGIN_WHITESPACE) &&
      (parser.state !== S.TEXT)) {
      error(parser, 'Unexpected end')
    }
    closeText(parser)
    parser.c = ''
    parser.closed = true
    emit(parser, 'onend')
    SAXParser.call(parser, parser.strict, parser.opt)
    return parser
  }

  function strictFail (parser, message) {
    if (typeof parser !== 'object' || !(parser instanceof SAXParser)) {
      throw new Error('bad call to strictFail')
    }
    if (parser.strict) {
      error(parser, message)
    }
  }

  function newTag (parser) {
    if (!parser.strict) parser.tagName = parser.tagName[parser.looseCase]()
    var parent = parser.tags[parser.tags.length - 1] || parser
    var tag = parser.tag = { name: parser.tagName, attributes: {} }

    // will be overridden if tag contails an xmlns="foo" or xmlns:foo="bar"
    if (parser.opt.xmlns) {
      tag.ns = parent.ns
    }
    parser.attribList.length = 0
    emitNode(parser, 'onopentagstart', tag)
  }

  function qname (name, attribute) {
    var i = name.indexOf(':')
    var qualName = i < 0 ? [ '', name ] : name.split(':')
    var prefix = qualName[0]
    var local = qualName[1]

    // <x "xmlns"="http://foo">
    if (attribute && name === 'xmlns') {
      prefix = 'xmlns'
      local = ''
    }

    return { prefix: prefix, local: local }
  }

  function attrib (parser) {
    if (!parser.strict) {
      parser.attribName = parser.attribName[parser.looseCase]()
    }

    if (parser.attribList.indexOf(parser.attribName) !== -1 ||
      parser.tag.attributes.hasOwnProperty(parser.attribName)) {
      parser.attribName = parser.attribValue = ''
      return
    }

    if (parser.opt.xmlns) {
      var qn = qname(parser.attribName, true)
      var prefix = qn.prefix
      var local = qn.local

      if (prefix === 'xmlns') {
        // namespace binding attribute. push the binding into scope
        if (local === 'xml' && parser.attribValue !== XML_NAMESPACE) {
          strictFail(parser,
            'xml: prefix must be bound to ' + XML_NAMESPACE + '\n' +
            'Actual: ' + parser.attribValue)
        } else if (local === 'xmlns' && parser.attribValue !== XMLNS_NAMESPACE) {
          strictFail(parser,
            'xmlns: prefix must be bound to ' + XMLNS_NAMESPACE + '\n' +
            'Actual: ' + parser.attribValue)
        } else {
          var tag = parser.tag
          var parent = parser.tags[parser.tags.length - 1] || parser
          if (tag.ns === parent.ns) {
            tag.ns = Object.create(parent.ns)
          }
          tag.ns[local] = parser.attribValue
        }
      }

      // defer onattribute events until all attributes have been seen
      // so any new bindings can take effect. preserve attribute order
      // so deferred events can be emitted in document order
      parser.attribList.push([parser.attribName, parser.attribValue])
    } else {
      // in non-xmlns mode, we can emit the event right away
      parser.tag.attributes[parser.attribName] = parser.attribValue
      emitNode(parser, 'onattribute', {
        name: parser.attribName,
        value: parser.attribValue
      })
    }

    parser.attribName = parser.attribValue = ''
  }

  function openTag (parser, selfClosing) {
    if (parser.opt.xmlns) {
      // emit namespace binding events
      var tag = parser.tag

      // add namespace info to tag
      var qn = qname(parser.tagName)
      tag.prefix = qn.prefix
      tag.local = qn.local
      tag.uri = tag.ns[qn.prefix] || ''

      if (tag.prefix && !tag.uri) {
        strictFail(parser, 'Unbound namespace prefix: ' +
          JSON.stringify(parser.tagName))
        tag.uri = qn.prefix
      }

      var parent = parser.tags[parser.tags.length - 1] || parser
      if (tag.ns && parent.ns !== tag.ns) {
        Object.keys(tag.ns).forEach(function (p) {
          emitNode(parser, 'onopennamespace', {
            prefix: p,
            uri: tag.ns[p]
          })
        })
      }

      // handle deferred onattribute events
      // Note: do not apply default ns to attributes:
      //   http://www.w3.org/TR/REC-xml-names/#defaulting
      for (var i = 0, l = parser.attribList.length; i < l; i++) {
        var nv = parser.attribList[i]
        var name = nv[0]
        var value = nv[1]
        var qualName = qname(name, true)
        var prefix = qualName.prefix
        var local = qualName.local
        var uri = prefix === '' ? '' : (tag.ns[prefix] || '')
        var a = {
          name: name,
          value: value,
          prefix: prefix,
          local: local,
          uri: uri
        }

        // if there's any attributes with an undefined namespace,
        // then fail on them now.
        if (prefix && prefix !== 'xmlns' && !uri) {
          strictFail(parser, 'Unbound namespace prefix: ' +
            JSON.stringify(prefix))
          a.uri = prefix
        }
        parser.tag.attributes[name] = a
        emitNode(parser, 'onattribute', a)
      }
      parser.attribList.length = 0
    }

    parser.tag.isSelfClosing = !!selfClosing

    // process the tag
    parser.sawRoot = true
    parser.tags.push(parser.tag)
    emitNode(parser, 'onopentag', parser.tag)
    if (!selfClosing) {
      // special case for <script> in non-strict mode.
      if (!parser.noscript && parser.tagName.toLowerCase() === 'script') {
        parser.state = S.SCRIPT
      } else {
        parser.state = S.TEXT
      }
      parser.tag = null
      parser.tagName = ''
    }
    parser.attribName = parser.attribValue = ''
    parser.attribList.length = 0
  }

  function closeTag (parser) {
    if (!parser.tagName) {
      strictFail(parser, 'Weird empty close tag.')
      parser.textNode += '</>'
      parser.state = S.TEXT
      return
    }

    if (parser.script) {
      if (parser.tagName !== 'script') {
        parser.script += '</' + parser.tagName + '>'
        parser.tagName = ''
        parser.state = S.SCRIPT
        return
      }
      emitNode(parser, 'onscript', parser.script)
      parser.script = ''
    }

    // first make sure that the closing tag actually exists.
    // <a><b></c></b></a> will close everything, otherwise.
    var t = parser.tags.length
    var tagName = parser.tagName
    if (!parser.strict) {
      tagName = tagName[parser.looseCase]()
    }
    var closeTo = tagName
    while (t--) {
      var close = parser.tags[t]
      if (close.name !== closeTo) {
        // fail the first time in strict mode
        strictFail(parser, 'Unexpected close tag')
      } else {
        break
      }
    }

    // didn't find it.  we already failed for strict, so just abort.
    if (t < 0) {
      strictFail(parser, 'Unmatched closing tag: ' + parser.tagName)
      parser.textNode += '</' + parser.tagName + '>'
      parser.state = S.TEXT
      return
    }
    parser.tagName = tagName
    var s = parser.tags.length
    while (s-- > t) {
      var tag = parser.tag = parser.tags.pop()
      parser.tagName = parser.tag.name
      emitNode(parser, 'onclosetag', parser.tagName)

      var x = {}
      for (var i in tag.ns) {
        x[i] = tag.ns[i]
      }

      var parent = parser.tags[parser.tags.length - 1] || parser
      if (parser.opt.xmlns && tag.ns !== parent.ns) {
        // remove namespace bindings introduced by tag
        Object.keys(tag.ns).forEach(function (p) {
          var n = tag.ns[p]
          emitNode(parser, 'onclosenamespace', { prefix: p, uri: n })
        })
      }
    }
    if (t === 0) parser.closedRoot = true
    parser.tagName = parser.attribValue = parser.attribName = ''
    parser.attribList.length = 0
    parser.state = S.TEXT
  }

  function parseEntity (parser) {
    var entity = parser.entity
    var entityLC = entity.toLowerCase()
    var num
    var numStr = ''

    if (parser.ENTITIES[entity]) {
      return parser.ENTITIES[entity]
    }
    if (parser.ENTITIES[entityLC]) {
      return parser.ENTITIES[entityLC]
    }
    entity = entityLC
    if (entity.charAt(0) === '#') {
      if (entity.charAt(1) === 'x') {
        entity = entity.slice(2)
        num = parseInt(entity, 16)
        numStr = num.toString(16)
      } else {
        entity = entity.slice(1)
        num = parseInt(entity, 10)
        numStr = num.toString(10)
      }
    }
    entity = entity.replace(/^0+/, '')
    if (isNaN(num) || numStr.toLowerCase() !== entity) {
      strictFail(parser, 'Invalid character entity')
      return '&' + parser.entity + ';'
    }

    return String.fromCodePoint(num)
  }

  function beginWhiteSpace (parser, c) {
    if (c === '<') {
      parser.state = S.OPEN_WAKA
      parser.startTagPosition = parser.position
    } else if (!isWhitespace(c)) {
      // have to process this as a text node.
      // weird, but happens.
      strictFail(parser, 'Non-whitespace before first tag.')
      parser.textNode = c
      parser.state = S.TEXT
    }
  }

  function charAt (chunk, i) {
    var result = ''
    if (i < chunk.length) {
      result = chunk.charAt(i)
    }
    return result
  }

  function write (chunk) {
    var parser = this
    if (this.error) {
      throw this.error
    }
    if (parser.closed) {
      return error(parser,
        'Cannot write after close. Assign an onready handler.')
    }
    if (chunk === null) {
      return end(parser)
    }
    if (typeof chunk === 'object') {
      chunk = chunk.toString()
    }
    var i = 0
    var c = ''
    while (true) {
      c = charAt(chunk, i++)
      parser.c = c

      if (!c) {
        break
      }

      if (parser.trackPosition) {
        parser.position++
        if (c === '\n') {
          parser.line++
          parser.column = 0
        } else {
          parser.column++
        }
      }

      switch (parser.state) {
        case S.BEGIN:
          parser.state = S.BEGIN_WHITESPACE
          if (c === '\uFEFF') {
            continue
          }
          beginWhiteSpace(parser, c)
          continue

        case S.BEGIN_WHITESPACE:
          beginWhiteSpace(parser, c)
          continue

        case S.TEXT:
          if (parser.sawRoot && !parser.closedRoot) {
            var starti = i - 1
            while (c && c !== '<' && c !== '&') {
              c = charAt(chunk, i++)
              if (c && parser.trackPosition) {
                parser.position++
                if (c === '\n') {
                  parser.line++
                  parser.column = 0
                } else {
                  parser.column++
                }
              }
            }
            parser.textNode += chunk.substring(starti, i - 1)
          }
          if (c === '<' && !(parser.sawRoot && parser.closedRoot && !parser.strict)) {
            parser.state = S.OPEN_WAKA
            parser.startTagPosition = parser.position
          } else {
            if (!isWhitespace(c) && (!parser.sawRoot || parser.closedRoot)) {
              strictFail(parser, 'Text data outside of root node.')
            }
            if (c === '&') {
              parser.state = S.TEXT_ENTITY
            } else {
              parser.textNode += c
            }
          }
          continue

        case S.SCRIPT:
          // only non-strict
          if (c === '<') {
            parser.state = S.SCRIPT_ENDING
          } else {
            parser.script += c
          }
          continue

        case S.SCRIPT_ENDING:
          if (c === '/') {
            parser.state = S.CLOSE_TAG
          } else {
            parser.script += '<' + c
            parser.state = S.SCRIPT
          }
          continue

        case S.OPEN_WAKA:
          // either a /, ?, !, or text is coming next.
          if (c === '!') {
            parser.state = S.SGML_DECL
            parser.sgmlDecl = ''
          } else if (isWhitespace(c)) {
            // wait for it...
          } else if (isMatch(nameStart, c)) {
            parser.state = S.OPEN_TAG
            parser.tagName = c
          } else if (c === '/') {
            parser.state = S.CLOSE_TAG
            parser.tagName = ''
          } else if (c === '?') {
            parser.state = S.PROC_INST
            parser.procInstName = parser.procInstBody = ''
          } else {
            strictFail(parser, 'Unencoded <')
            // if there was some whitespace, then add that in.
            if (parser.startTagPosition + 1 < parser.position) {
              var pad = parser.position - parser.startTagPosition
              c = new Array(pad).join(' ') + c
            }
            parser.textNode += '<' + c
            parser.state = S.TEXT
          }
          continue

        case S.SGML_DECL:
          if ((parser.sgmlDecl + c).toUpperCase() === CDATA) {
            emitNode(parser, 'onopencdata')
            parser.state = S.CDATA
            parser.sgmlDecl = ''
            parser.cdata = ''
          } else if (parser.sgmlDecl + c === '--') {
            parser.state = S.COMMENT
            parser.comment = ''
            parser.sgmlDecl = ''
          } else if ((parser.sgmlDecl + c).toUpperCase() === DOCTYPE) {
            parser.state = S.DOCTYPE
            if (parser.doctype || parser.sawRoot) {
              strictFail(parser,
                'Inappropriately located doctype declaration')
            }
            parser.doctype = ''
            parser.sgmlDecl = ''
          } else if (c === '>') {
            emitNode(parser, 'onsgmldeclaration', parser.sgmlDecl)
            parser.sgmlDecl = ''
            parser.state = S.TEXT
          } else if (isQuote(c)) {
            parser.state = S.SGML_DECL_QUOTED
            parser.sgmlDecl += c
          } else {
            parser.sgmlDecl += c
          }
          continue

        case S.SGML_DECL_QUOTED:
          if (c === parser.q) {
            parser.state = S.SGML_DECL
            parser.q = ''
          }
          parser.sgmlDecl += c
          continue

        case S.DOCTYPE:
          if (c === '>') {
            parser.state = S.TEXT
            emitNode(parser, 'ondoctype', parser.doctype)
            parser.doctype = true // just remember that we saw it.
          } else {
            parser.doctype += c
            if (c === '[') {
              parser.state = S.DOCTYPE_DTD
            } else if (isQuote(c)) {
              parser.state = S.DOCTYPE_QUOTED
              parser.q = c
            }
          }
          continue

        case S.DOCTYPE_QUOTED:
          parser.doctype += c
          if (c === parser.q) {
            parser.q = ''
            parser.state = S.DOCTYPE
          }
          continue

        case S.DOCTYPE_DTD:
          parser.doctype += c
          if (c === ']') {
            parser.state = S.DOCTYPE
          } else if (isQuote(c)) {
            parser.state = S.DOCTYPE_DTD_QUOTED
            parser.q = c
          }
          continue

        case S.DOCTYPE_DTD_QUOTED:
          parser.doctype += c
          if (c === parser.q) {
            parser.state = S.DOCTYPE_DTD
            parser.q = ''
          }
          continue

        case S.COMMENT:
          if (c === '-') {
            parser.state = S.COMMENT_ENDING
          } else {
            parser.comment += c
          }
          continue

        case S.COMMENT_ENDING:
          if (c === '-') {
            parser.state = S.COMMENT_ENDED
            parser.comment = textopts(parser.opt, parser.comment)
            if (parser.comment) {
              emitNode(parser, 'oncomment', parser.comment)
            }
            parser.comment = ''
          } else {
            parser.comment += '-' + c
            parser.state = S.COMMENT
          }
          continue

        case S.COMMENT_ENDED:
          if (c !== '>') {
            strictFail(parser, 'Malformed comment')
            // allow <!-- blah -- bloo --> in non-strict mode,
            // which is a comment of " blah -- bloo "
            parser.comment += '--' + c
            parser.state = S.COMMENT
          } else {
            parser.state = S.TEXT
          }
          continue

        case S.CDATA:
          if (c === ']') {
            parser.state = S.CDATA_ENDING
          } else {
            parser.cdata += c
          }
          continue

        case S.CDATA_ENDING:
          if (c === ']') {
            parser.state = S.CDATA_ENDING_2
          } else {
            parser.cdata += ']' + c
            parser.state = S.CDATA
          }
          continue

        case S.CDATA_ENDING_2:
          if (c === '>') {
            if (parser.cdata) {
              emitNode(parser, 'oncdata', parser.cdata)
            }
            emitNode(parser, 'onclosecdata')
            parser.cdata = ''
            parser.state = S.TEXT
          } else if (c === ']') {
            parser.cdata += ']'
          } else {
            parser.cdata += ']]' + c
            parser.state = S.CDATA
          }
          continue

        case S.PROC_INST:
          if (c === '?') {
            parser.state = S.PROC_INST_ENDING
          } else if (isWhitespace(c)) {
            parser.state = S.PROC_INST_BODY
          } else {
            parser.procInstName += c
          }
          continue

        case S.PROC_INST_BODY:
          if (!parser.procInstBody && isWhitespace(c)) {
            continue
          } else if (c === '?') {
            parser.state = S.PROC_INST_ENDING
          } else {
            parser.procInstBody += c
          }
          continue

        case S.PROC_INST_ENDING:
          if (c === '>') {
            emitNode(parser, 'onprocessinginstruction', {
              name: parser.procInstName,
              body: parser.procInstBody
            })
            parser.procInstName = parser.procInstBody = ''
            parser.state = S.TEXT
          } else {
            parser.procInstBody += '?' + c
            parser.state = S.PROC_INST_BODY
          }
          continue

        case S.OPEN_TAG:
          if (isMatch(nameBody, c)) {
            parser.tagName += c
          } else {
            newTag(parser)
            if (c === '>') {
              openTag(parser)
            } else if (c === '/') {
              parser.state = S.OPEN_TAG_SLASH
            } else {
              if (!isWhitespace(c)) {
                strictFail(parser, 'Invalid character in tag name')
              }
              parser.state = S.ATTRIB
            }
          }
          continue

        case S.OPEN_TAG_SLASH:
          if (c === '>') {
            openTag(parser, true)
            closeTag(parser)
          } else {
            strictFail(parser, 'Forward-slash in opening tag not followed by >')
            parser.state = S.ATTRIB
          }
          continue

        case S.ATTRIB:
          // haven't read the attribute name yet.
          if (isWhitespace(c)) {
            continue
          } else if (c === '>') {
            openTag(parser)
          } else if (c === '/') {
            parser.state = S.OPEN_TAG_SLASH
          } else if (isMatch(nameStart, c)) {
            parser.attribName = c
            parser.attribValue = ''
            parser.state = S.ATTRIB_NAME
          } else {
            strictFail(parser, 'Invalid attribute name')
          }
          continue

        case S.ATTRIB_NAME:
          if (c === '=') {
            parser.state = S.ATTRIB_VALUE
          } else if (c === '>') {
            strictFail(parser, 'Attribute without value')
            parser.attribValue = parser.attribName
            attrib(parser)
            openTag(parser)
          } else if (isWhitespace(c)) {
            parser.state = S.ATTRIB_NAME_SAW_WHITE
          } else if (isMatch(nameBody, c)) {
            parser.attribName += c
          } else {
            strictFail(parser, 'Invalid attribute name')
          }
          continue

        case S.ATTRIB_NAME_SAW_WHITE:
          if (c === '=') {
            parser.state = S.ATTRIB_VALUE
          } else if (isWhitespace(c)) {
            continue
          } else {
            strictFail(parser, 'Attribute without value')
            parser.tag.attributes[parser.attribName] = ''
            parser.attribValue = ''
            emitNode(parser, 'onattribute', {
              name: parser.attribName,
              value: ''
            })
            parser.attribName = ''
            if (c === '>') {
              openTag(parser)
            } else if (isMatch(nameStart, c)) {
              parser.attribName = c
              parser.state = S.ATTRIB_NAME
            } else {
              strictFail(parser, 'Invalid attribute name')
              parser.state = S.ATTRIB
            }
          }
          continue

        case S.ATTRIB_VALUE:
          if (isWhitespace(c)) {
            continue
          } else if (isQuote(c)) {
            parser.q = c
            parser.state = S.ATTRIB_VALUE_QUOTED
          } else {
            strictFail(parser, 'Unquoted attribute value')
            parser.state = S.ATTRIB_VALUE_UNQUOTED
            parser.attribValue = c
          }
          continue

        case S.ATTRIB_VALUE_QUOTED:
          if (c !== parser.q) {
            if (c === '&') {
              parser.state = S.ATTRIB_VALUE_ENTITY_Q
            } else {
              parser.attribValue += c
            }
            continue
          }
          attrib(parser)
          parser.q = ''
          parser.state = S.ATTRIB_VALUE_CLOSED
          continue

        case S.ATTRIB_VALUE_CLOSED:
          if (isWhitespace(c)) {
            parser.state = S.ATTRIB
          } else if (c === '>') {
            openTag(parser)
          } else if (c === '/') {
            parser.state = S.OPEN_TAG_SLASH
          } else if (isMatch(nameStart, c)) {
            strictFail(parser, 'No whitespace between attributes')
            parser.attribName = c
            parser.attribValue = ''
            parser.state = S.ATTRIB_NAME
          } else {
            strictFail(parser, 'Invalid attribute name')
          }
          continue

        case S.ATTRIB_VALUE_UNQUOTED:
          if (!isAttribEnd(c)) {
            if (c === '&') {
              parser.state = S.ATTRIB_VALUE_ENTITY_U
            } else {
              parser.attribValue += c
            }
            continue
          }
          attrib(parser)
          if (c === '>') {
            openTag(parser)
          } else {
            parser.state = S.ATTRIB
          }
          continue

        case S.CLOSE_TAG:
          if (!parser.tagName) {
            if (isWhitespace(c)) {
              continue
            } else if (notMatch(nameStart, c)) {
              if (parser.script) {
                parser.script += '</' + c
                parser.state = S.SCRIPT
              } else {
                strictFail(parser, 'Invalid tagname in closing tag.')
              }
            } else {
              parser.tagName = c
            }
          } else if (c === '>') {
            closeTag(parser)
          } else if (isMatch(nameBody, c)) {
            parser.tagName += c
          } else if (parser.script) {
            parser.script += '</' + parser.tagName
            parser.tagName = ''
            parser.state = S.SCRIPT
          } else {
            if (!isWhitespace(c)) {
              strictFail(parser, 'Invalid tagname in closing tag')
            }
            parser.state = S.CLOSE_TAG_SAW_WHITE
          }
          continue

        case S.CLOSE_TAG_SAW_WHITE:
          if (isWhitespace(c)) {
            continue
          }
          if (c === '>') {
            closeTag(parser)
          } else {
            strictFail(parser, 'Invalid characters in closing tag')
          }
          continue

        case S.TEXT_ENTITY:
        case S.ATTRIB_VALUE_ENTITY_Q:
        case S.ATTRIB_VALUE_ENTITY_U:
          var returnState
          var buffer
          switch (parser.state) {
            case S.TEXT_ENTITY:
              returnState = S.TEXT
              buffer = 'textNode'
              break

            case S.ATTRIB_VALUE_ENTITY_Q:
              returnState = S.ATTRIB_VALUE_QUOTED
              buffer = 'attribValue'
              break

            case S.ATTRIB_VALUE_ENTITY_U:
              returnState = S.ATTRIB_VALUE_UNQUOTED
              buffer = 'attribValue'
              break
          }

          if (c === ';') {
            parser[buffer] += parseEntity(parser)
            parser.entity = ''
            parser.state = returnState
          } else if (isMatch(parser.entity.length ? entityBody : entityStart, c)) {
            parser.entity += c
          } else {
            strictFail(parser, 'Invalid character in entity name')
            parser[buffer] += '&' + parser.entity + c
            parser.entity = ''
            parser.state = returnState
          }

          continue

        default:
          throw new Error(parser, 'Unknown state: ' + parser.state)
      }
    } // while

    if (parser.position >= parser.bufferCheckPosition) {
      checkBufferLength(parser)
    }
    return parser
  }

  /*! http://mths.be/fromcodepoint v0.1.0 by @mathias */
  /* istanbul ignore next */
  if (!String.fromCodePoint) {
    (function () {
      var stringFromCharCode = String.fromCharCode
      var floor = Math.floor
      var fromCodePoint = function () {
        var MAX_SIZE = 0x4000
        var codeUnits = []
        var highSurrogate
        var lowSurrogate
        var index = -1
        var length = arguments.length
        if (!length) {
          return ''
        }
        var result = ''
        while (++index < length) {
          var codePoint = Number(arguments[index])
          if (
            !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`
            codePoint < 0 || // not a valid Unicode code point
            codePoint > 0x10FFFF || // not a valid Unicode code point
            floor(codePoint) !== codePoint // not an integer
          ) {
            throw RangeError('Invalid code point: ' + codePoint)
          }
          if (codePoint <= 0xFFFF) { // BMP code point
            codeUnits.push(codePoint)
          } else { // Astral code point; split in surrogate halves
            // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
            codePoint -= 0x10000
            highSurrogate = (codePoint >> 10) + 0xD800
            lowSurrogate = (codePoint % 0x400) + 0xDC00
            codeUnits.push(highSurrogate, lowSurrogate)
          }
          if (index + 1 === length || codeUnits.length > MAX_SIZE) {
            result += stringFromCharCode.apply(null, codeUnits)
            codeUnits.length = 0
          }
        }
        return result
      }
      /* istanbul ignore next */
      if (Object.defineProperty) {
        Object.defineProperty(String, 'fromCodePoint', {
          value: fromCodePoint,
          configurable: true,
          writable: true
        })
      } else {
        String.fromCodePoint = fromCodePoint
      }
    }())
  }
})(typeof exports === 'undefined' ? this.sax = {} : exports)
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.
// just pre-load all the stuff that index.js lazily exports
const internalRe = require('./internal/re')
module.exports = {
  re: internalRe.re,
  src: internalRe.src,
  tokens: internalRe.t,
  SEMVER_SPEC_VERSION: require('./internal/constants').SEMVER_SPEC_VERSION,
  SemVer: require('./classes/semver'),
  compareIdentifiers: require('./internal/identifiers').compareIdentifiers,
  rcompareIdentifiers: require('./internal/identifiers').rcompareIdentifiers,
  parse: require('./functions/parse'),
  valid: require('./functions/valid'),
  clean: require('./functions/clean'),
  inc: require('./functions/inc'),
  diff: require('./functions/diff'),
  major: require('./functions/major'),
  minor: require('./functions/minor'),
  patch: require('./functions/patch'),
  prerelease: require('./functions/prerelease'),
  compare: require('./functions/compare'),
  rcompare: require('./functions/rcompare'),
  compareLoose: require('./functions/compare-loose'),
  compareBuild: require('./functions/compare-build'),
  sort: require('./functions/sort'),
  rsort: require('./functions/rsort'),
  gt: require('./functions/gt'),
  lt: require('./functions/lt'),
  eq: require('./functions/eq'),
  neq: require('./functions/neq'),
  gte: require('./functions/gte'),
  lte: require('./functions/lte'),
  cmp: require('./functions/cmp'),
  coerce: require('./functions/coerce'),
  Comparator: require('./classes/comparator'),
  Range: require('./classes/range'),
  satisfies: require('./functions/satisfies'),
  toComparators: require('./ranges/to-comparators'),
  maxSatisfying: require('./ranges/max-satisfying'),
  minSatisfying: require('./ranges/min-satisfying'),
  minVersion: require('./ranges/min-version'),
  validRange: require('./ranges/valid'),
  outside: require('./ranges/outside'),
  gtr: require('./ranges/gtr'),
  ltr: require('./ranges/ltr'),
  intersects: require('./ranges/intersects'),
  simplifyRange: require('./ranges/simplify'),
  subset: require('./ranges/subset'),
}
{
  "name": "semver",
  "version": "7.3.7",
  "description": "The semantic version parser used by npm.",
  "main": "index.js",
  "devDependencies": {
    "@npmcli/eslint-config": "^3.0.1",
    "@npmcli/template-oss": "3.3.2",
    "tap": "^16.0.0"
  },
  "license": "ISC",
  "repository": {
    "type": "git",
    "url": "https://github.com/npm/node-semver.git"
  },
  "bin": {
    "semver": "bin/semver.js"
  },
  "files": [
    "bin/",
    "classes/",
    "functions/",
    "internal/",
    "ranges/",
    "index.js",
    "preload.js",
    "range.bnf"
  ],
  "tap": {
    "check-coverage": true,
    "coverage-map": "map.js"
  },
  "engines": {
    "node": ">=10"
  },
  "dependencies": {
    "lru-cache": "^6.0.0"
  },
  "author": "GitHub Inc.",
  "templateOSS": {
    "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
    "version": "3.3.2",
    "engines": ">=10",
    "ciVersions": [
      "10.0.0",
      "10.x",
      "12.x",
      "14.x",
      "16.x"
    ],
    "distPaths": [
      "bin/",
      "classes/",
      "functions/",
      "internal/",
      "ranges/",
      "index.js",
      "preload.js",
      "range.bnf"
    ]
  }
}// 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]+
// 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
const Range = require('../classes/range')
const intersects = (r1, r2, options) => {
  r1 = new Range(r1, options)
  r2 = new Range(r2, options)
  return r1.intersects(r2)
}
module.exports = intersects
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
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
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
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
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
// 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
}
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 GT.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 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 = [new Comparator('>=0.0.0-0')]
    } else {
      sub = [new Comparator('>=0.0.0')]
    }
  }

  if (dom.length === 1 && dom[0].semver === ANY) {
    if (options.includePrerelease) {
      return true
    } else {
      dom = [new Comparator('>=0.0.0')]
    }
  }

  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
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
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
// 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

module.exports = {
  SEMVER_SPEC_VERSION,
  MAX_LENGTH,
  MAX_SAFE_INTEGER,
  MAX_SAFE_COMPONENT_LENGTH,
}
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
const numeric = /^[0-9]+$/
const compareIdentifiers = (a, b) => {
  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,
}
// parse out just the options we care about so we always get a consistent
// obj with keys in a consistent order.
const opts = ['includePrerelease', 'loose', 'rtl']
const parseOptions = options =>
  !options ? {}
  : typeof options !== 'object' ? { loose: true }
  : opts.filter(k => options[k]).reduce((o, k) => {
    o[k] = true
    return o
  }, {})
module.exports = parseOptions
const { MAX_SAFE_COMPONENT_LENGTH } = require('./constants')
const debug = require('./debug')
exports = module.exports = {}

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

const createToken = (name, value, isGlobal) => {
  const index = R++
  debug(name, index, value)
  t[name] = index
  src[index] = value
  re[index] = new RegExp(value, 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', '[0-9]+')

// ## 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-][a-zA-Z0-9-]*')

// ## 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.

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

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

// ## 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', '[0-9A-Za-z-]+')

// ## 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('COERCE', `${'(^|[^\\d])' +
              '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +
              `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +
              `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +
              `(?:$|[^\\d])`)
createToken('COERCERTL', src[t.COERCE], 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*$')
const parse = require('./parse')
const clean = (version, options) => {
  const s = parse(version.trim().replace(/^[=v]+/, ''), options)
  return s ? s.version : null
}
module.exports = clean
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
const SemVer = require('../classes/semver')
const parse = require('./parse')
const { 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(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'
    //
    // 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.
    let next
    while ((next = re[t.COERCERTL].exec(version)) &&
        (!match || match.index + match[0].length !== version.length)
    ) {
      if (!match ||
            next.index + next[0].length !== match.index + match[0].length) {
        match = next
      }
      re[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length
    }
    // leave it in a clean state
    re[t.COERCERTL].lastIndex = -1
  }

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

  return parse(`${match[2]}.${match[3] || '0'}.${match[4] || '0'}`, options)
}
module.exports = coerce
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
const compare = require('./compare')
const compareLoose = (a, b) => compare(a, b, true)
module.exports = compareLoose
const SemVer = require('../classes/semver')
const compare = (a, b, loose) =>
  new SemVer(a, loose).compare(new SemVer(b, loose))

module.exports = compare
const parse = require('./parse')
const eq = require('./eq')

const diff = (version1, version2) => {
  if (eq(version1, version2)) {
    return null
  } else {
    const v1 = parse(version1)
    const v2 = parse(version2)
    const hasPre = v1.prerelease.length || v2.prerelease.length
    const prefix = hasPre ? 'pre' : ''
    const defaultResult = hasPre ? 'prerelease' : ''
    for (const key in v1) {
      if (key === 'major' || key === 'minor' || key === 'patch') {
        if (v1[key] !== v2[key]) {
          return prefix + key
        }
      }
    }
    return defaultResult // may be undefined
  }
}
module.exports = diff
const compare = require('./compare')
const eq = (a, b, loose) => compare(a, b, loose) === 0
module.exports = eq
const compare = require('./compare')
const gt = (a, b, loose) => compare(a, b, loose) > 0
module.exports = gt
const compare = require('./compare')
const gte = (a, b, loose) => compare(a, b, loose) >= 0
module.exports = gte
const SemVer = require('../classes/semver')

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

  try {
    return new SemVer(
      version instanceof SemVer ? version.version : version,
      options
    ).inc(release, identifier).version
  } catch (er) {
    return null
  }
}
module.exports = inc
const compare = require('./compare')
const lt = (a, b, loose) => compare(a, b, loose) < 0
module.exports = lt
const compare = require('./compare')
const lte = (a, b, loose) => compare(a, b, loose) <= 0
module.exports = lte
const SemVer = require('../classes/semver')
const major = (a, loose) => new SemVer(a, loose).major
module.exports = major
const SemVer = require('../classes/semver')
const minor = (a, loose) => new SemVer(a, loose).minor
module.exports = minor
const compare = require('./compare')
const neq = (a, b, loose) => compare(a, b, loose) !== 0
module.exports = neq
const { MAX_LENGTH } = require('../internal/constants')
const { re, t } = require('../internal/re')
const SemVer = require('../classes/semver')

const parseOptions = require('../internal/parse-options')
const parse = (version, options) => {
  options = parseOptions(options)

  if (version instanceof SemVer) {
    return version
  }

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

  if (version.length > MAX_LENGTH) {
    return null
  }

  const r = options.loose ? re[t.LOOSE] : re[t.FULL]
  if (!r.test(version)) {
    return null
  }

  try {
    return new SemVer(version, options)
  } catch (er) {
    return null
  }
}

module.exports = parse
const SemVer = require('../classes/semver')
const patch = (a, loose) => new SemVer(a, loose).patch
module.exports = patch
const parse = require('./parse')
const prerelease = (version, options) => {
  const parsed = parse(version, options)
  return (parsed && parsed.prerelease.length) ? parsed.prerelease : null
}
module.exports = prerelease
const compare = require('./compare')
const rcompare = (a, b, loose) => compare(b, a, loose)
module.exports = rcompare
const compareBuild = require('./compare-build')
const rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose))
module.exports = rsort
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
const compareBuild = require('./compare-build')
const sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose))
module.exports = sort
const parse = require('./parse')
const valid = (version, options) => {
  const v = parse(version, options)
  return v ? v.version : null
}
module.exports = valid
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
      }
    }

    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 (!options || typeof options !== 'object') {
      options = {
        loose: !!options,
        includePrerelease: false,
      }
    }

    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)
    }

    const sameDirectionIncreasing =
      (this.operator === '>=' || this.operator === '>') &&
      (comp.operator === '>=' || comp.operator === '>')
    const sameDirectionDecreasing =
      (this.operator === '<=' || this.operator === '<') &&
      (comp.operator === '<=' || comp.operator === '<')
    const sameSemVer = this.semver.version === comp.semver.version
    const differentDirectionsInclusive =
      (this.operator === '>=' || this.operator === '<=') &&
      (comp.operator === '>=' || comp.operator === '<=')
    const oppositeDirectionsLessThan =
      cmp(this.semver, '<', comp.semver, options) &&
      (this.operator === '>=' || this.operator === '>') &&
        (comp.operator === '<=' || comp.operator === '<')
    const oppositeDirectionsGreaterThan =
      cmp(this.semver, '>', comp.semver, options) &&
      (this.operator === '<=' || this.operator === '<') &&
        (comp.operator === '>=' || comp.operator === '>')

    return (
      sameDirectionIncreasing ||
      sameDirectionDecreasing ||
      (sameSemVer && differentDirectionsInclusive) ||
      oppositeDirectionsLessThan ||
      oppositeDirectionsGreaterThan
    )
  }
}

module.exports = Comparator

const parseOptions = require('../internal/parse-options')
const { re, t } = require('../internal/re')
const cmp = require('../functions/cmp')
const debug = require('../internal/debug')
const SemVer = require('./semver')
const Range = require('./range')
module.exports = {
  SemVer: require('./semver.js'),
  Range: require('./range.js'),
  Comparator: require('./comparator.js'),
}
// 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.format()
      return this
    }

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

    // First, split based on boolean or ||
    this.raw = range
    this.set = range
      .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: ${range}`)
    }

    // 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.format()
  }

  format () {
    this.range = this.set
      .map((comps) => {
        return comps.join(' ').trim()
      })
      .join('||')
      .trim()
    return this.range
  }

  toString () {
    return this.range
  }

  parseRange (range) {
    range = range.trim()

    // memoize range parsing for performance.
    // this is a very hot path, and fully deterministic.
    const memoOpts = Object.keys(this.options).join(',')
    const memoKey = `parseRange:${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)

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

    // normalize spaces
    range = range.split(/\s+/).join(' ')

    // 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('lru-cache')
const cache = new LRU({ max: 1000 })

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

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) => {
  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
const replaceTildes = (comp, options) =>
  comp.trim().split(/\s+/).map((c) => {
    return 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
const replaceCarets = (comp, options) =>
  comp.trim().split(/\s+/).map((c) => {
    return 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) => {
    return 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
const hyphenReplace = incPr => ($0,
  from, fM, fm, fp, fpr, fb,
  to, tM, tm, tp, tpr, tb) => {
  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
}
const debug = require('../internal/debug')
const { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')
const { 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: ${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)
    }

    return (
      compareIdentifiers(this.major, other.major) ||
      compareIdentifiers(this.minor, other.minor) ||
      compareIdentifiers(this.patch, other.patch)
    )
  }

  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('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)
  }

  // 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) {
    switch (release) {
      case 'premajor':
        this.prerelease.length = 0
        this.patch = 0
        this.minor = 0
        this.major++
        this.inc('pre', identifier)
        break
      case 'preminor':
        this.prerelease.length = 0
        this.patch = 0
        this.minor++
        this.inc('pre', identifier)
        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)
        this.inc('pre', identifier)
        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)
        }
        this.inc('pre', identifier)
        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':
        if (this.prerelease.length === 0) {
          this.prerelease = [0]
        } 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
            this.prerelease.push(0)
          }
        }
        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
          if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
            if (isNaN(this.prerelease[1])) {
              this.prerelease = [identifier, 0]
            }
          } else {
            this.prerelease = [identifier, 0]
          }
        }
        break

      default:
        throw new Error(`invalid increment argument: ${release}`)
    }
    this.format()
    this.raw = this.version
    return this
  }
}

module.exports = SemVer
#!/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.

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

const semver = require('../')

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':
            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 '-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 = { loose: loose, includePrerelease: includePrerelease, rtl: rtl }

  versions = versions.map((v) => {
    return coerce ? (semver.coerce(v, options) || { version: v }).version : v
  }).filter((v) => {
    return semver.valid(v)
  })
  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()
    }
  }
  return success(versions)
}

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

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

const success = () => {
  const compare = reverse ? 'rcompare' : 'compare'
  versions.sort((a, b) => {
    return semver[compare](a, b, options)
  }).map((v) => {
    return semver.clean(v, options)
  }).map((v) => {
    return inc ? semver.inc(v, inc, options, identifier) : v
  }).forEach((v, i, _) => {
    console.log(v)
  })
}

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, or prerelease.  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)

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()
0.18.0 / 2022-03-23
===================

  * Fix emitted 416 error missing headers property
  * Limit the headers removed for 304 response
  * deps: depd@2.0.0
    - Replace internal `eval` usage with `Function` constructor
    - Use instance methods on `process` to check for listeners
  * deps: destroy@1.2.0
  * deps: http-errors@2.0.0
    - deps: depd@2.0.0
    - deps: statuses@2.0.1
  * deps: on-finished@2.4.1
  * deps: statuses@2.0.1

0.17.2 / 2021-12-11
===================

  * pref: ignore empty http tokens
  * deps: http-errors@1.8.1
    - deps: inherits@2.0.4
    - deps: toidentifier@1.0.1
    - deps: setprototypeof@1.2.0
  * deps: ms@2.1.3

0.17.1 / 2019-05-10
===================

  * Set stricter CSP header in redirect & error responses
  * deps: range-parser@~1.2.1

0.17.0 / 2019-05-03
===================

  * deps: http-errors@~1.7.2
    - Set constructor name when possible
    - Use `toidentifier` module to make class names
    - deps: depd@~1.1.2
    - deps: setprototypeof@1.1.1
    - deps: statuses@'>= 1.5.0 < 2'
  * deps: mime@1.6.0
    - Add extensions for JPEG-2000 images
    - Add new `font/*` types from IANA
    - Add WASM mapping
    - Update `.bdoc` to `application/bdoc`
    - Update `.bmp` to `image/bmp`
    - Update `.m4a` to `audio/mp4`
    - Update `.rtf` to `application/rtf`
    - Update `.wav` to `audio/wav`
    - Update `.xml` to `application/xml`
    - Update generic extensions to `application/octet-stream`:
      `.deb`, `.dll`, `.dmg`, `.exe`, `.iso`, `.msi`
    - Use mime-score module to resolve extension conflicts
  * deps: ms@2.1.1
    - Add `week`/`w` support
    - Fix negative number handling
  * deps: statuses@~1.5.0
  * perf: remove redundant `path.normalize` call

0.16.2 / 2018-02-07
===================

  * Fix incorrect end tag in default error & redirects
  * deps: depd@~1.1.2
    - perf: remove argument reassignment
  * deps: encodeurl@~1.0.2
    - Fix encoding `%` as last character
  * deps: statuses@~1.4.0

0.16.1 / 2017-09-29
===================

  * Fix regression in edge-case behavior for empty `path`

0.16.0 / 2017-09-27
===================

  * Add `immutable` option
  * Fix missing `</html>` in default error & redirects
  * Use instance methods on steam to check for listeners
  * deps: mime@1.4.1
    - Add 70 new types for file extensions
    - Set charset as "UTF-8" for .js and .json
  * perf: improve path validation speed

0.15.6 / 2017-09-22
===================

  * deps: debug@2.6.9
  * perf: improve `If-Match` token parsing

0.15.5 / 2017-09-20
===================

  * deps: etag@~1.8.1
    - perf: replace regular expression with substring
  * deps: fresh@0.5.2
    - Fix handling of modified headers with invalid dates
    - perf: improve ETag match loop
    - perf: improve `If-None-Match` token parsing

0.15.4 / 2017-08-05
===================

  * deps: debug@2.6.8
  * deps: depd@~1.1.1
    - Remove unnecessary `Buffer` loading
  * deps: http-errors@~1.6.2
    - deps: depd@1.1.1

0.15.3 / 2017-05-16
===================

  * deps: debug@2.6.7
    - deps: ms@2.0.0
  * deps: ms@2.0.0

0.15.2 / 2017-04-26
===================

  * deps: debug@2.6.4
    - Fix `DEBUG_MAX_ARRAY_LENGTH`
    - deps: ms@0.7.3
  * deps: ms@1.0.0

0.15.1 / 2017-03-04
===================

  * Fix issue when `Date.parse` does not return `NaN` on invalid date
  * Fix strict violation in broken environments

0.15.0 / 2017-02-25
===================

  * Support `If-Match` and `If-Unmodified-Since` headers
  * Add `res` and `path` arguments to `directory` event
  * Remove usage of `res._headers` private field
    - Improves compatibility with Node.js 8 nightly
  * Send complete HTML document in redirect & error responses
  * Set default CSP header in redirect & error responses
  * Use `res.getHeaderNames()` when available
  * Use `res.headersSent` when available
  * deps: debug@2.6.1
    - Allow colors in workers
    - Deprecated `DEBUG_FD` environment variable set to `3` or higher
    - Fix error when running under React Native
    - Use same color for same namespace
    - deps: ms@0.7.2
  * deps: etag@~1.8.0
  * deps: fresh@0.5.0
    - Fix false detection of `no-cache` request directive
    - Fix incorrect result when `If-None-Match` has both `*` and ETags
    - Fix weak `ETag` matching to match spec
    - perf: delay reading header values until needed
    - perf: enable strict mode
    - perf: hoist regular expressions
    - perf: remove duplicate conditional
    - perf: remove unnecessary boolean coercions
    - perf: skip checking modified time if ETag check failed
    - perf: skip parsing `If-None-Match` when no `ETag` header
    - perf: use `Date.parse` instead of `new Date`
  * deps: http-errors@~1.6.1
    - Make `message` property enumerable for `HttpError`s
    - deps: setprototypeof@1.0.3

0.14.2 / 2017-01-23
===================

  * deps: http-errors@~1.5.1
    - deps: inherits@2.0.3
    - deps: setprototypeof@1.0.2
    - deps: statuses@'>= 1.3.1 < 2'
  * deps: ms@0.7.2
  * deps: statuses@~1.3.1

0.14.1 / 2016-06-09
===================

  * Fix redirect error when `path` contains raw non-URL characters
  * Fix redirect when `path` starts with multiple forward slashes

0.14.0 / 2016-06-06
===================

  * Add `acceptRanges` option
  * Add `cacheControl` option
  * Attempt to combine multiple ranges into single range
  * Correctly inherit from `Stream` class
  * Fix `Content-Range` header in 416 responses when using `start`/`end` options
  * Fix `Content-Range` header missing from default 416 responses
  * Ignore non-byte `Range` headers
  * deps: http-errors@~1.5.0
    - Add `HttpError` export, for `err instanceof createError.HttpError`
    - Support new code `421 Misdirected Request`
    - Use `setprototypeof` module to replace `__proto__` setting
    - deps: inherits@2.0.1
    - deps: statuses@'>= 1.3.0 < 2'
    - perf: enable strict mode
  * deps: range-parser@~1.2.0
    - Fix incorrectly returning -1 when there is at least one valid range
    - perf: remove internal function
  * deps: statuses@~1.3.0
    - Add `421 Misdirected Request`
    - perf: enable strict mode
  * perf: remove argument reassignment

0.13.2 / 2016-03-05
===================

  * Fix invalid `Content-Type` header when `send.mime.default_type` unset

0.13.1 / 2016-01-16
===================

  * deps: depd@~1.1.0
    - Support web browser loading
    - perf: enable strict mode
  * deps: destroy@~1.0.4
    - perf: enable strict mode
  * deps: escape-html@~1.0.3
    - perf: enable strict mode
    - perf: optimize string replacement
    - perf: use faster string coercion
  * deps: range-parser@~1.0.3
    - perf: enable strict mode

0.13.0 / 2015-06-16
===================

  * Allow Node.js HTTP server to set `Date` response header
  * Fix incorrectly removing `Content-Location` on 304 response
  * Improve the default redirect response headers
  * Send appropriate headers on default error response
  * Use `http-errors` for standard emitted errors
  * Use `statuses` instead of `http` module for status messages
  * deps: escape-html@1.0.2
  * deps: etag@~1.7.0
    - Improve stat performance by removing hashing
  * deps: fresh@0.3.0
    - Add weak `ETag` matching support
  * deps: on-finished@~2.3.0
    - Add defined behavior for HTTP `CONNECT` requests
    - Add defined behavior for HTTP `Upgrade` requests
    - deps: ee-first@1.1.1
  * perf: enable strict mode
  * perf: remove unnecessary array allocations

0.12.3 / 2015-05-13
===================

  * deps: debug@~2.2.0
    - deps: ms@0.7.1
  * deps: depd@~1.0.1
  * deps: etag@~1.6.0
   - Improve support for JXcore
   - Support "fake" stats objects in environments without `fs`
  * deps: ms@0.7.1
    - Prevent extraordinarily long inputs
  * deps: on-finished@~2.2.1

0.12.2 / 2015-03-13
===================

  * Throw errors early for invalid `extensions` or `index` options
  * deps: debug@~2.1.3
    - Fix high intensity foreground color for bold
    - deps: ms@0.7.0

0.12.1 / 2015-02-17
===================

  * Fix regression sending zero-length files

0.12.0 / 2015-02-16
===================

  * Always read the stat size from the file
  * Fix mutating passed-in `options`
  * deps: mime@1.3.4

0.11.1 / 2015-01-20
===================

  * Fix `root` path disclosure

0.11.0 / 2015-01-05
===================

  * deps: debug@~2.1.1
  * deps: etag@~1.5.1
    - deps: crc@3.2.1
  * deps: ms@0.7.0
    - Add `milliseconds`
    - Add `msecs`
    - Add `secs`
    - Add `mins`
    - Add `hrs`
    - Add `yrs`
  * deps: on-finished@~2.2.0

0.10.1 / 2014-10-22
===================

  * deps: on-finished@~2.1.1
    - Fix handling of pipelined requests

0.10.0 / 2014-10-15
===================

  * deps: debug@~2.1.0
    - Implement `DEBUG_FD` env variable support
  * deps: depd@~1.0.0
  * deps: etag@~1.5.0
    - Improve string performance
    - Slightly improve speed for weak ETags over 1KB

0.9.3 / 2014-09-24
==================

  * deps: etag@~1.4.0
    - Support "fake" stats objects

0.9.2 / 2014-09-15
==================

  * deps: depd@0.4.5
  * deps: etag@~1.3.1
  * deps: range-parser@~1.0.2

0.9.1 / 2014-09-07
==================

  * deps: fresh@0.2.4

0.9.0 / 2014-09-07
==================

  * Add `lastModified` option
  * Use `etag` to generate `ETag` header
  * deps: debug@~2.0.0

0.8.5 / 2014-09-04
==================

  * Fix malicious path detection for empty string path

0.8.4 / 2014-09-04
==================

  * Fix a path traversal issue when using `root`

0.8.3 / 2014-08-16
==================

  * deps: destroy@1.0.3
    - renamed from dethroy
  * deps: on-finished@2.1.0

0.8.2 / 2014-08-14
==================

  * Work around `fd` leak in Node.js 0.10 for `fs.ReadStream`
  * deps: dethroy@1.0.2

0.8.1 / 2014-08-05
==================

  * Fix `extensions` behavior when file already has extension

0.8.0 / 2014-08-05
==================

  * Add `extensions` option

0.7.4 / 2014-08-04
==================

  * Fix serving index files without root dir

0.7.3 / 2014-07-29
==================

  * Fix incorrect 403 on Windows and Node.js 0.11

0.7.2 / 2014-07-27
==================

  * deps: depd@0.4.4
    - Work-around v8 generating empty stack traces

0.7.1 / 2014-07-26
==================

 * deps: depd@0.4.3
   - Fix exception when global `Error.stackTraceLimit` is too low

0.7.0 / 2014-07-20
==================

 * Deprecate `hidden` option; use `dotfiles` option
 * Add `dotfiles` option
 * deps: debug@1.0.4
 * deps: depd@0.4.2
   - Add `TRACE_DEPRECATION` environment variable
   - Remove non-standard grey color from color output
   - Support `--no-deprecation` argument
   - Support `--trace-deprecation` argument

0.6.0 / 2014-07-11
==================

 * Deprecate `from` option; use `root` option
 * Deprecate `send.etag()` -- use `etag` in `options`
 * Deprecate `send.hidden()` -- use `hidden` in `options`
 * Deprecate `send.index()` -- use `index` in `options`
 * Deprecate `send.maxage()` -- use `maxAge` in `options`
 * Deprecate `send.root()` -- use `root` in `options`
 * Cap `maxAge` value to 1 year
 * deps: debug@1.0.3
   - Add support for multiple wildcards in namespaces

0.5.0 / 2014-06-28
==================

 * Accept string for `maxAge` (converted by `ms`)
 * Add `headers` event
 * Include link in default redirect response
 * Use `EventEmitter.listenerCount` to count listeners

0.4.3 / 2014-06-11
==================

 * Do not throw un-catchable error on file open race condition
 * Use `escape-html` for HTML escaping
 * deps: debug@1.0.2
   - fix some debugging output colors on node.js 0.8
 * deps: finished@1.2.2
 * deps: fresh@0.2.2

0.4.2 / 2014-06-09
==================

 * fix "event emitter leak" warnings
 * deps: debug@1.0.1
 * deps: finished@1.2.1

0.4.1 / 2014-06-02
==================

 * Send `max-age` in `Cache-Control` in correct format

0.4.0 / 2014-05-27
==================

 * Calculate ETag with md5 for reduced collisions
 * Fix wrong behavior when index file matches directory
 * Ignore stream errors after request ends
   - Goodbye `EBADF, read`
 * Skip directories in index file search
 * deps: debug@0.8.1

0.3.0 / 2014-04-24
==================

 * Fix sending files with dots without root set
 * Coerce option types
 * Accept API options in options object
 * Set etags to "weak"
 * Include file path in etag
 * Make "Can't set headers after they are sent." catchable
 * Send full entity-body for multi range requests
 * Default directory access to 403 when index disabled
 * Support multiple index paths
 * Support "If-Range" header
 * Control whether to generate etags
 * deps: mime@1.2.11

0.2.0 / 2014-01-29
==================

 * update range-parser and fresh

0.1.4 / 2013-08-11 
==================

 * update fresh

0.1.3 / 2013-07-08 
==================

 * Revert "Fix fd leak"

0.1.2 / 2013-07-03 
==================

 * Fix fd leak

0.1.0 / 2012-08-25 
==================

  * add options parameter to send() that is passed to fs.createReadStream() [kanongil]

0.0.4 / 2012-08-16 
==================

  * allow custom "Accept-Ranges" definition

0.0.3 / 2012-07-16 
==================

  * fix normalization of the root directory. Closes #3

0.0.2 / 2012-07-09 
==================

  * add passing of req explicitly for now (YUCK)

0.0.1 / 2010-01-03
==================

  * Initial release
(The MIT License)

Copyright (c) 2012 TJ Holowaychuk
Copyright (c) 2014-2022 Douglas Christopher Wilson

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.
# Security Policies and Procedures

## Reporting a Bug

The `send` team and community take all security bugs seriously. Thank you
for improving the security of Express. We appreciate your efforts and
responsible disclosure and will make every effort to acknowledge your
contributions.

Report security bugs by emailing the current owner(s) of `send`. This information
can be found in the npm registry using the command `npm owner ls send`.
If unsure or unable to get the information from the above, open an issue
in the [project issue tracker](https://github.com/pillarjs/send/issues)
asking for the current contact information.

To ensure the timely response to your report, please ensure that the entirety
of the report is contained within the email body and not solely behind a web
link or an attachment.

At least one owner will acknowledge your email within 48 hours, and will send a
more detailed response within 48 hours indicating the next steps in handling
your report. After the initial reply to your report, the owners will
endeavor to keep you informed of the progress towards a fix and full
announcement, and may ask for additional information or guidance.
/*!
 * send
 * Copyright(c) 2012 TJ Holowaychuk
 * Copyright(c) 2014-2022 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module dependencies.
 * @private
 */

var createError = require('http-errors')
var debug = require('debug')('send')
var deprecate = require('depd')('send')
var destroy = require('destroy')
var encodeUrl = require('encodeurl')
var escapeHtml = require('escape-html')
var etag = require('etag')
var fresh = require('fresh')
var fs = require('fs')
var mime = require('mime')
var ms = require('ms')
var onFinished = require('on-finished')
var parseRange = require('range-parser')
var path = require('path')
var statuses = require('statuses')
var Stream = require('stream')
var util = require('util')

/**
 * Path function references.
 * @private
 */

var extname = path.extname
var join = path.join
var normalize = path.normalize
var resolve = path.resolve
var sep = path.sep

/**
 * Regular expression for identifying a bytes Range header.
 * @private
 */

var BYTES_RANGE_REGEXP = /^ *bytes=/

/**
 * Maximum value allowed for the max age.
 * @private
 */

var MAX_MAXAGE = 60 * 60 * 24 * 365 * 1000 // 1 year

/**
 * Regular expression to match a path with a directory up component.
 * @private
 */

var UP_PATH_REGEXP = /(?:^|[\\/])\.\.(?:[\\/]|$)/

/**
 * Module exports.
 * @public
 */

module.exports = send
module.exports.mime = mime

/**
 * Return a `SendStream` for `req` and `path`.
 *
 * @param {object} req
 * @param {string} path
 * @param {object} [options]
 * @return {SendStream}
 * @public
 */

function send (req, path, options) {
  return new SendStream(req, path, options)
}

/**
 * Initialize a `SendStream` with the given `path`.
 *
 * @param {Request} req
 * @param {String} path
 * @param {object} [options]
 * @private
 */

function SendStream (req, path, options) {
  Stream.call(this)

  var opts = options || {}

  this.options = opts
  this.path = path
  this.req = req

  this._acceptRanges = opts.acceptRanges !== undefined
    ? Boolean(opts.acceptRanges)
    : true

  this._cacheControl = opts.cacheControl !== undefined
    ? Boolean(opts.cacheControl)
    : true

  this._etag = opts.etag !== undefined
    ? Boolean(opts.etag)
    : true

  this._dotfiles = opts.dotfiles !== undefined
    ? opts.dotfiles
    : 'ignore'

  if (this._dotfiles !== 'ignore' && this._dotfiles !== 'allow' && this._dotfiles !== 'deny') {
    throw new TypeError('dotfiles option must be "allow", "deny", or "ignore"')
  }

  this._hidden = Boolean(opts.hidden)

  if (opts.hidden !== undefined) {
    deprecate('hidden: use dotfiles: \'' + (this._hidden ? 'allow' : 'ignore') + '\' instead')
  }

  // legacy support
  if (opts.dotfiles === undefined) {
    this._dotfiles = undefined
  }

  this._extensions = opts.extensions !== undefined
    ? normalizeList(opts.extensions, 'extensions option')
    : []

  this._immutable = opts.immutable !== undefined
    ? Boolean(opts.immutable)
    : false

  this._index = opts.index !== undefined
    ? normalizeList(opts.index, 'index option')
    : ['index.html']

  this._lastModified = opts.lastModified !== undefined
    ? Boolean(opts.lastModified)
    : true

  this._maxage = opts.maxAge || opts.maxage
  this._maxage = typeof this._maxage === 'string'
    ? ms(this._maxage)
    : Number(this._maxage)
  this._maxage = !isNaN(this._maxage)
    ? Math.min(Math.max(0, this._maxage), MAX_MAXAGE)
    : 0

  this._root = opts.root
    ? resolve(opts.root)
    : null

  if (!this._root && opts.from) {
    this.from(opts.from)
  }
}

/**
 * Inherits from `Stream`.
 */

util.inherits(SendStream, Stream)

/**
 * Enable or disable etag generation.
 *
 * @param {Boolean} val
 * @return {SendStream}
 * @api public
 */

SendStream.prototype.etag = deprecate.function(function etag (val) {
  this._etag = Boolean(val)
  debug('etag %s', this._etag)
  return this
}, 'send.etag: pass etag as option')

/**
 * Enable or disable "hidden" (dot) files.
 *
 * @param {Boolean} path
 * @return {SendStream}
 * @api public
 */

SendStream.prototype.hidden = deprecate.function(function hidden (val) {
  this._hidden = Boolean(val)
  this._dotfiles = undefined
  debug('hidden %s', this._hidden)
  return this
}, 'send.hidden: use dotfiles option')

/**
 * Set index `paths`, set to a falsy
 * value to disable index support.
 *
 * @param {String|Boolean|Array} paths
 * @return {SendStream}
 * @api public
 */

SendStream.prototype.index = deprecate.function(function index (paths) {
  var index = !paths ? [] : normalizeList(paths, 'paths argument')
  debug('index %o', paths)
  this._index = index
  return this
}, 'send.index: pass index as option')

/**
 * Set root `path`.
 *
 * @param {String} path
 * @return {SendStream}
 * @api public
 */

SendStream.prototype.root = function root (path) {
  this._root = resolve(String(path))
  debug('root %s', this._root)
  return this
}

SendStream.prototype.from = deprecate.function(SendStream.prototype.root,
  'send.from: pass root as option')

SendStream.prototype.root = deprecate.function(SendStream.prototype.root,
  'send.root: pass root as option')

/**
 * Set max-age to `maxAge`.
 *
 * @param {Number} maxAge
 * @return {SendStream}
 * @api public
 */

SendStream.prototype.maxage = deprecate.function(function maxage (maxAge) {
  this._maxage = typeof maxAge === 'string'
    ? ms(maxAge)
    : Number(maxAge)
  this._maxage = !isNaN(this._maxage)
    ? Math.min(Math.max(0, this._maxage), MAX_MAXAGE)
    : 0
  debug('max-age %d', this._maxage)
  return this
}, 'send.maxage: pass maxAge as option')

/**
 * Emit error with `status`.
 *
 * @param {number} status
 * @param {Error} [err]
 * @private
 */

SendStream.prototype.error = function error (status, err) {
  // emit if listeners instead of responding
  if (hasListeners(this, 'error')) {
    return this.emit('error', createHttpError(status, err))
  }

  var res = this.res
  var msg = statuses.message[status] || String(status)
  var doc = createHtmlDocument('Error', escapeHtml(msg))

  // clear existing headers
  clearHeaders(res)

  // add error headers
  if (err && err.headers) {
    setHeaders(res, err.headers)
  }

  // send basic response
  res.statusCode = status
  res.setHeader('Content-Type', 'text/html; charset=UTF-8')
  res.setHeader('Content-Length', Buffer.byteLength(doc))
  res.setHeader('Content-Security-Policy', "default-src 'none'")
  res.setHeader('X-Content-Type-Options', 'nosniff')
  res.end(doc)
}

/**
 * Check if the pathname ends with "/".
 *
 * @return {boolean}
 * @private
 */

SendStream.prototype.hasTrailingSlash = function hasTrailingSlash () {
  return this.path[this.path.length - 1] === '/'
}

/**
 * Check if this is a conditional GET request.
 *
 * @return {Boolean}
 * @api private
 */

SendStream.prototype.isConditionalGET = function isConditionalGET () {
  return this.req.headers['if-match'] ||
    this.req.headers['if-unmodified-since'] ||
    this.req.headers['if-none-match'] ||
    this.req.headers['if-modified-since']
}

/**
 * Check if the request preconditions failed.
 *
 * @return {boolean}
 * @private
 */

SendStream.prototype.isPreconditionFailure = function isPreconditionFailure () {
  var req = this.req
  var res = this.res

  // if-match
  var match = req.headers['if-match']
  if (match) {
    var etag = res.getHeader('ETag')
    return !etag || (match !== '*' && parseTokenList(match).every(function (match) {
      return match !== etag && match !== 'W/' + etag && 'W/' + match !== etag
    }))
  }

  // if-unmodified-since
  var unmodifiedSince = parseHttpDate(req.headers['if-unmodified-since'])
  if (!isNaN(unmodifiedSince)) {
    var lastModified = parseHttpDate(res.getHeader('Last-Modified'))
    return isNaN(lastModified) || lastModified > unmodifiedSince
  }

  return false
}

/**
 * Strip various content header fields for a change in entity.
 *
 * @private
 */

SendStream.prototype.removeContentHeaderFields = function removeContentHeaderFields () {
  var res = this.res

  res.removeHeader('Content-Encoding')
  res.removeHeader('Content-Language')
  res.removeHeader('Content-Length')
  res.removeHeader('Content-Range')
  res.removeHeader('Content-Type')
}

/**
 * Respond with 304 not modified.
 *
 * @api private
 */

SendStream.prototype.notModified = function notModified () {
  var res = this.res
  debug('not modified')
  this.removeContentHeaderFields()
  res.statusCode = 304
  res.end()
}

/**
 * Raise error that headers already sent.
 *
 * @api private
 */

SendStream.prototype.headersAlreadySent = function headersAlreadySent () {
  var err = new Error('Can\'t set headers after they are sent.')
  debug('headers already sent')
  this.error(500, err)
}

/**
 * Check if the request is cacheable, aka
 * responded with 2xx or 304 (see RFC 2616 section 14.2{5,6}).
 *
 * @return {Boolean}
 * @api private
 */

SendStream.prototype.isCachable = function isCachable () {
  var statusCode = this.res.statusCode
  return (statusCode >= 200 && statusCode < 300) ||
    statusCode === 304
}

/**
 * Handle stat() error.
 *
 * @param {Error} error
 * @private
 */

SendStream.prototype.onStatError = function onStatError (error) {
  switch (error.code) {
    case 'ENAMETOOLONG':
    case 'ENOENT':
    case 'ENOTDIR':
      this.error(404, error)
      break
    default:
      this.error(500, error)
      break
  }
}

/**
 * Check if the cache is fresh.
 *
 * @return {Boolean}
 * @api private
 */

SendStream.prototype.isFresh = function isFresh () {
  return fresh(this.req.headers, {
    etag: this.res.getHeader('ETag'),
    'last-modified': this.res.getHeader('Last-Modified')
  })
}

/**
 * Check if the range is fresh.
 *
 * @return {Boolean}
 * @api private
 */

SendStream.prototype.isRangeFresh = function isRangeFresh () {
  var ifRange = this.req.headers['if-range']

  if (!ifRange) {
    return true
  }

  // if-range as etag
  if (ifRange.indexOf('"') !== -1) {
    var etag = this.res.getHeader('ETag')
    return Boolean(etag && ifRange.indexOf(etag) !== -1)
  }

  // if-range as modified date
  var lastModified = this.res.getHeader('Last-Modified')
  return parseHttpDate(lastModified) <= parseHttpDate(ifRange)
}

/**
 * Redirect to path.
 *
 * @param {string} path
 * @private
 */

SendStream.prototype.redirect = function redirect (path) {
  var res = this.res

  if (hasListeners(this, 'directory')) {
    this.emit('directory', res, path)
    return
  }

  if (this.hasTrailingSlash()) {
    this.error(403)
    return
  }

  var loc = encodeUrl(collapseLeadingSlashes(this.path + '/'))
  var doc = createHtmlDocument('Redirecting', 'Redirecting to <a href="' + escapeHtml(loc) + '">' +
    escapeHtml(loc) + '</a>')

  // redirect
  res.statusCode = 301
  res.setHeader('Content-Type', 'text/html; charset=UTF-8')
  res.setHeader('Content-Length', Buffer.byteLength(doc))
  res.setHeader('Content-Security-Policy', "default-src 'none'")
  res.setHeader('X-Content-Type-Options', 'nosniff')
  res.setHeader('Location', loc)
  res.end(doc)
}

/**
 * Pipe to `res.
 *
 * @param {Stream} res
 * @return {Stream} res
 * @api public
 */

SendStream.prototype.pipe = function pipe (res) {
  // root path
  var root = this._root

  // references
  this.res = res

  // decode the path
  var path = decode(this.path)
  if (path === -1) {
    this.error(400)
    return res
  }

  // null byte(s)
  if (~path.indexOf('\0')) {
    this.error(400)
    return res
  }

  var parts
  if (root !== null) {
    // normalize
    if (path) {
      path = normalize('.' + sep + path)
    }

    // malicious path
    if (UP_PATH_REGEXP.test(path)) {
      debug('malicious path "%s"', path)
      this.error(403)
      return res
    }

    // explode path parts
    parts = path.split(sep)

    // join / normalize from optional root dir
    path = normalize(join(root, path))
  } else {
    // ".." is malicious without "root"
    if (UP_PATH_REGEXP.test(path)) {
      debug('malicious path "%s"', path)
      this.error(403)
      return res
    }

    // explode path parts
    parts = normalize(path).split(sep)

    // resolve the path
    path = resolve(path)
  }

  // dotfile handling
  if (containsDotFile(parts)) {
    var access = this._dotfiles

    // legacy support
    if (access === undefined) {
      access = parts[parts.length - 1][0] === '.'
        ? (this._hidden ? 'allow' : 'ignore')
        : 'allow'
    }

    debug('%s dotfile "%s"', access, path)
    switch (access) {
      case 'allow':
        break
      case 'deny':
        this.error(403)
        return res
      case 'ignore':
      default:
        this.error(404)
        return res
    }
  }

  // index file support
  if (this._index.length && this.hasTrailingSlash()) {
    this.sendIndex(path)
    return res
  }

  this.sendFile(path)
  return res
}

/**
 * Transfer `path`.
 *
 * @param {String} path
 * @api public
 */

SendStream.prototype.send = function send (path, stat) {
  var len = stat.size
  var options = this.options
  var opts = {}
  var res = this.res
  var req = this.req
  var ranges = req.headers.range
  var offset = options.start || 0

  if (headersSent(res)) {
    // impossible to send now
    this.headersAlreadySent()
    return
  }

  debug('pipe "%s"', path)

  // set header fields
  this.setHeader(path, stat)

  // set content-type
  this.type(path)

  // conditional GET support
  if (this.isConditionalGET()) {
    if (this.isPreconditionFailure()) {
      this.error(412)
      return
    }

    if (this.isCachable() && this.isFresh()) {
      this.notModified()
      return
    }
  }

  // adjust len to start/end options
  len = Math.max(0, len - offset)
  if (options.end !== undefined) {
    var bytes = options.end - offset + 1
    if (len > bytes) len = bytes
  }

  // Range support
  if (this._acceptRanges && BYTES_RANGE_REGEXP.test(ranges)) {
    // parse
    ranges = parseRange(len, ranges, {
      combine: true
    })

    // If-Range support
    if (!this.isRangeFresh()) {
      debug('range stale')
      ranges = -2
    }

    // unsatisfiable
    if (ranges === -1) {
      debug('range unsatisfiable')

      // Content-Range
      res.setHeader('Content-Range', contentRange('bytes', len))

      // 416 Requested Range Not Satisfiable
      return this.error(416, {
        headers: { 'Content-Range': res.getHeader('Content-Range') }
      })
    }

    // valid (syntactically invalid/multiple ranges are treated as a regular response)
    if (ranges !== -2 && ranges.length === 1) {
      debug('range %j', ranges)

      // Content-Range
      res.statusCode = 206
      res.setHeader('Content-Range', contentRange('bytes', len, ranges[0]))

      // adjust for requested range
      offset += ranges[0].start
      len = ranges[0].end - ranges[0].start + 1
    }
  }

  // clone options
  for (var prop in options) {
    opts[prop] = options[prop]
  }

  // set read options
  opts.start = offset
  opts.end = Math.max(offset, offset + len - 1)

  // content-length
  res.setHeader('Content-Length', len)

  // HEAD support
  if (req.method === 'HEAD') {
    res.end()
    return
  }

  this.stream(path, opts)
}

/**
 * Transfer file for `path`.
 *
 * @param {String} path
 * @api private
 */
SendStream.prototype.sendFile = function sendFile (path) {
  var i = 0
  var self = this

  debug('stat "%s"', path)
  fs.stat(path, function onstat (err, stat) {
    if (err && err.code === 'ENOENT' && !extname(path) && path[path.length - 1] !== sep) {
      // not found, check extensions
      return next(err)
    }
    if (err) return self.onStatError(err)
    if (stat.isDirectory()) return self.redirect(path)
    self.emit('file', path, stat)
    self.send(path, stat)
  })

  function next (err) {
    if (self._extensions.length <= i) {
      return err
        ? self.onStatError(err)
        : self.error(404)
    }

    var p = path + '.' + self._extensions[i++]

    debug('stat "%s"', p)
    fs.stat(p, function (err, stat) {
      if (err) return next(err)
      if (stat.isDirectory()) return next()
      self.emit('file', p, stat)
      self.send(p, stat)
    })
  }
}

/**
 * Transfer index for `path`.
 *
 * @param {String} path
 * @api private
 */
SendStream.prototype.sendIndex = function sendIndex (path) {
  var i = -1
  var self = this

  function next (err) {
    if (++i >= self._index.length) {
      if (err) return self.onStatError(err)
      return self.error(404)
    }

    var p = join(path, self._index[i])

    debug('stat "%s"', p)
    fs.stat(p, function (err, stat) {
      if (err) return next(err)
      if (stat.isDirectory()) return next()
      self.emit('file', p, stat)
      self.send(p, stat)
    })
  }

  next()
}

/**
 * Stream `path` to the response.
 *
 * @param {String} path
 * @param {Object} options
 * @api private
 */

SendStream.prototype.stream = function stream (path, options) {
  var self = this
  var res = this.res

  // pipe
  var stream = fs.createReadStream(path, options)
  this.emit('stream', stream)
  stream.pipe(res)

  // cleanup
  function cleanup () {
    destroy(stream, true)
  }

  // response finished, cleanup
  onFinished(res, cleanup)

  // error handling
  stream.on('error', function onerror (err) {
    // clean up stream early
    cleanup()

    // error
    self.onStatError(err)
  })

  // end
  stream.on('end', function onend () {
    self.emit('end')
  })
}

/**
 * Set content-type based on `path`
 * if it hasn't been explicitly set.
 *
 * @param {String} path
 * @api private
 */

SendStream.prototype.type = function type (path) {
  var res = this.res

  if (res.getHeader('Content-Type')) return

  var type = mime.lookup(path)

  if (!type) {
    debug('no content-type')
    return
  }

  var charset = mime.charsets.lookup(type)

  debug('content-type %s', type)
  res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : ''))
}

/**
 * Set response header fields, most
 * fields may be pre-defined.
 *
 * @param {String} path
 * @param {Object} stat
 * @api private
 */

SendStream.prototype.setHeader = function setHeader (path, stat) {
  var res = this.res

  this.emit('headers', res, path, stat)

  if (this._acceptRanges && !res.getHeader('Accept-Ranges')) {
    debug('accept ranges')
    res.setHeader('Accept-Ranges', 'bytes')
  }

  if (this._cacheControl && !res.getHeader('Cache-Control')) {
    var cacheControl = 'public, max-age=' + Math.floor(this._maxage / 1000)

    if (this._immutable) {
      cacheControl += ', immutable'
    }

    debug('cache-control %s', cacheControl)
    res.setHeader('Cache-Control', cacheControl)
  }

  if (this._lastModified && !res.getHeader('Last-Modified')) {
    var modified = stat.mtime.toUTCString()
    debug('modified %s', modified)
    res.setHeader('Last-Modified', modified)
  }

  if (this._etag && !res.getHeader('ETag')) {
    var val = etag(stat)
    debug('etag %s', val)
    res.setHeader('ETag', val)
  }
}

/**
 * Clear all headers from a response.
 *
 * @param {object} res
 * @private
 */

function clearHeaders (res) {
  var headers = getHeaderNames(res)

  for (var i = 0; i < headers.length; i++) {
    res.removeHeader(headers[i])
  }
}

/**
 * Collapse all leading slashes into a single slash
 *
 * @param {string} str
 * @private
 */
function collapseLeadingSlashes (str) {
  for (var i = 0; i < str.length; i++) {
    if (str[i] !== '/') {
      break
    }
  }

  return i > 1
    ? '/' + str.substr(i)
    : str
}

/**
 * Determine if path parts contain a dotfile.
 *
 * @api private
 */

function containsDotFile (parts) {
  for (var i = 0; i < parts.length; i++) {
    var part = parts[i]
    if (part.length > 1 && part[0] === '.') {
      return true
    }
  }

  return false
}

/**
 * Create a Content-Range header.
 *
 * @param {string} type
 * @param {number} size
 * @param {array} [range]
 */

function contentRange (type, size, range) {
  return type + ' ' + (range ? range.start + '-' + range.end : '*') + '/' + size
}

/**
 * Create a minimal HTML document.
 *
 * @param {string} title
 * @param {string} body
 * @private
 */

function createHtmlDocument (title, body) {
  return '<!DOCTYPE html>\n' +
    '<html lang="en">\n' +
    '<head>\n' +
    '<meta charset="utf-8">\n' +
    '<title>' + title + '</title>\n' +
    '</head>\n' +
    '<body>\n' +
    '<pre>' + body + '</pre>\n' +
    '</body>\n' +
    '</html>\n'
}

/**
 * Create a HttpError object from simple arguments.
 *
 * @param {number} status
 * @param {Error|object} err
 * @private
 */

function createHttpError (status, err) {
  if (!err) {
    return createError(status)
  }

  return err instanceof Error
    ? createError(status, err, { expose: false })
    : createError(status, err)
}

/**
 * decodeURIComponent.
 *
 * Allows V8 to only deoptimize this fn instead of all
 * of send().
 *
 * @param {String} path
 * @api private
 */

function decode (path) {
  try {
    return decodeURIComponent(path)
  } catch (err) {
    return -1
  }
}

/**
 * Get the header names on a respnse.
 *
 * @param {object} res
 * @returns {array[string]}
 * @private
 */

function getHeaderNames (res) {
  return typeof res.getHeaderNames !== 'function'
    ? Object.keys(res._headers || {})
    : res.getHeaderNames()
}

/**
 * Determine if emitter has listeners of a given type.
 *
 * The way to do this check is done three different ways in Node.js >= 0.8
 * so this consolidates them into a minimal set using instance methods.
 *
 * @param {EventEmitter} emitter
 * @param {string} type
 * @returns {boolean}
 * @private
 */

function hasListeners (emitter, type) {
  var count = typeof emitter.listenerCount !== 'function'
    ? emitter.listeners(type).length
    : emitter.listenerCount(type)

  return count > 0
}

/**
 * Determine if the response headers have been sent.
 *
 * @param {object} res
 * @returns {boolean}
 * @private
 */

function headersSent (res) {
  return typeof res.headersSent !== 'boolean'
    ? Boolean(res._header)
    : res.headersSent
}

/**
 * Normalize the index option into an array.
 *
 * @param {boolean|string|array} val
 * @param {string} name
 * @private
 */

function normalizeList (val, name) {
  var list = [].concat(val || [])

  for (var i = 0; i < list.length; i++) {
    if (typeof list[i] !== 'string') {
      throw new TypeError(name + ' must be array of strings or false')
    }
  }

  return list
}

/**
 * Parse an HTTP Date into a number.
 *
 * @param {string} date
 * @private
 */

function parseHttpDate (date) {
  var timestamp = date && Date.parse(date)

  return typeof timestamp === 'number'
    ? timestamp
    : NaN
}

/**
 * Parse a HTTP token list.
 *
 * @param {string} str
 * @private
 */

function parseTokenList (str) {
  var end = 0
  var list = []
  var start = 0

  // gather tokens
  for (var i = 0, len = str.length; i < len; i++) {
    switch (str.charCodeAt(i)) {
      case 0x20: /*   */
        if (start === end) {
          start = end = i + 1
        }
        break
      case 0x2c: /* , */
        if (start !== end) {
          list.push(str.substring(start, end))
        }
        start = end = i + 1
        break
      default:
        end = i + 1
        break
    }
  }

  // final token
  if (start !== end) {
    list.push(str.substring(start, end))
  }

  return list
}

/**
 * Set an object of headers on a response.
 *
 * @param {object} res
 * @param {object} headers
 * @private
 */

function setHeaders (res, headers) {
  var keys = Object.keys(headers)

  for (var i = 0; i < keys.length; i++) {
    var key = keys[i]
    res.setHeader(key, headers[key])
  }
}
{
  "name": "send",
  "description": "Better streaming static file server with Range and conditional-GET support",
  "version": "0.18.0",
  "author": "TJ Holowaychuk <tj@vision-media.ca>",
  "license": "MIT",
  "repository": "pillarjs/send",
  "dependencies": {
    "debug": "2.6.9",
    "depd": "2.0.0",
    "destroy": "1.2.0",
    "encodeurl": "~1.0.2",
    "escape-html": "~1.0.3",
    "etag": "~1.8.1",
    "fresh": "0.5.2",
    "http-errors": "2.0.0",
    "mime": "1.6.0",
    "ms": "2.1.3",
    "on-finished": "2.4.1",
    "range-parser": "~1.2.1",
    "statuses": "2.0.1"
  },
  "devDependencies": {
    "after": "0.8.2",
    "eslint": "7.32.0",
    "eslint-config-standard": "14.1.1",
    "eslint-plugin-import": "2.25.4",
    "eslint-plugin-markdown": "2.2.1",
    "eslint-plugin-node": "11.1.0",
    "eslint-plugin-promise": "5.2.0",
    "eslint-plugin-standard": "4.1.0",
    "mocha": "9.2.2",
    "nyc": "15.1.0",
    "supertest": "6.2.2"
  },
  "files": [
    "HISTORY.md",
    "LICENSE",
    "README.md",
    "SECURITY.md",
    "index.js"
  ],
  "engines": {
    "node": ">= 0.8.0"
  }
}MIT License

Copyright (c) 2014-present Sequelize contributors

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

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

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

// TODO [>=7]: remove me. I've been moved to 'exports' in package.json

/**
  * A Sequelize module that contains the sequelize entry point.
  *
  * @module sequelize
  */

/** Exports the sequelize entry point. */
module.exports = require('./lib');
{
  "name": "sequelize",
  "description": "Sequelize is a promise-based Node.js ORM tool for Postgres, MySQL, MariaDB, SQLite, Microsoft SQL Server, Amazon Redshift and Snowflake’s Data Cloud. It features solid transaction support, relations, eager and lazy loading, read replication and more.",
  "version": "6.21.3",
  "funding": [
    {
      "type": "opencollective",
      "url": "https://opencollective.com/sequelize"
    }
  ],
  "repository": {
    "type": "git",
    "url": "https://github.com/sequelize/sequelize.git"
  },
  "homepage": "https://sequelize.org/",
  "main": "./lib/index.js",
  "types": "./types",
  "type": "commonjs",
  "exports": {
    ".": {
      "import": "./lib/index.mjs",
      "require": "./lib/index.js",
      "types": "./types/index.d.ts"
    },
    "./lib/*": {
      "default": "./lib/*.js",
      "types": "./types/*.d.ts"
    },
    "./lib/errors": {
      "default": "./lib/errors/index.js",
      "types": "./types/errors/index.d.ts"
    },
    "./package.json": "./package.json"
  },
  "engines": {
    "node": ">=10.0.0"
  },
  "files": [
    "lib",
    "types",
    "index.js"
  ],
  "license": "MIT",
  "dependencies": {
    "@types/debug": "^4.1.7",
    "@types/validator": "^13.7.1",
    "debug": "^4.3.3",
    "dottie": "^2.0.2",
    "inflection": "^1.13.2",
    "lodash": "^4.17.21",
    "moment": "^2.29.1",
    "moment-timezone": "^0.5.34",
    "pg-connection-string": "^2.5.0",
    "retry-as-promised": "^5.0.0",
    "semver": "^7.3.5",
    "sequelize-pool": "^7.1.0",
    "toposort-class": "^1.0.1",
    "uuid": "^8.3.2",
    "validator": "^13.7.0",
    "wkx": "^0.5.0"
  },
  "devDependencies": {
    "@commitlint/cli": "^15.0.0",
    "@commitlint/config-angular": "^15.0.0",
    "@octokit/rest": "^18.12.0",
    "@octokit/types": "^6.34.0",
    "@types/chai": "^4.3.0",
    "@types/lodash": "4.14.182",
    "@types/mocha": "^9.0.0",
    "@types/node": "^16.11.17",
    "@types/sinon": "^10.0.6",
    "@typescript-eslint/eslint-plugin": "^5.8.1",
    "@typescript-eslint/parser": "^5.8.1",
    "acorn": "^8.7.0",
    "chai": "^4.3.4",
    "chai-as-promised": "^7.1.1",
    "chai-datetime": "^1.8.0",
    "cheerio": "^1.0.0-rc.10",
    "cls-hooked": "^4.2.2",
    "copyfiles": "^2.4.1",
    "cross-env": "^7.0.3",
    "delay": "^5.0.0",
    "esbuild": "0.14.3",
    "esdoc": "^1.1.0",
    "esdoc-ecmascript-proposal-plugin": "^1.0.0",
    "esdoc-inject-style-plugin": "^1.0.0",
    "esdoc-standard-plugin": "^1.0.0",
    "eslint": "^8.5.0",
    "eslint-plugin-jsdoc": "^37.4.0",
    "eslint-plugin-mocha": "^9.0.0",
    "expect-type": "^0.12.0",
    "fast-glob": "^3.2.7",
    "fs-jetpack": "^4.3.0",
    "husky": "^7.0.4",
    "ibm_db": "^2.8.1",
    "js-combinatorics": "^0.6.1",
    "lcov-result-merger": "^3.1.0",
    "lint-staged": "^12.1.4",
    "mariadb": "^2.5.5",
    "markdownlint-cli": "^0.30.0",
    "mocha": "^7.2.0",
    "module-alias": "^2.2.2",
    "mysql2": "^2.3.3",
    "node-hook": "^1.0.0",
    "nyc": "^15.1.0",
    "p-map": "^4.0.0",
    "p-props": "^4.0.0",
    "p-settle": "^4.1.1",
    "p-timeout": "^4.0.0",
    "pg": "^8.7.1",
    "pg-hstore": "^2.3.4",
    "rimraf": "^3.0.2",
    "semantic-release": "^18.0.1",
    "semantic-release-fail-on-major-bump": "^1.0.0",
    "sinon": "^12.0.1",
    "sinon-chai": "^3.7.0",
    "snowflake-sdk": "^1.6.6",
    "source-map-support": "^0.5.21",
    "sqlite3": "npm:@vscode/sqlite3@^5.0.7",
    "tedious": "8.3.0",
    "typescript": "^4.5.4"
  },
  "peerDependenciesMeta": {
    "pg": {
      "optional": true
    },
    "pg-hstore": {
      "optional": true
    },
    "mysql2": {
      "optional": true
    },
    "ibm_db": {
      "optional": true
    },
    "snowflake-sdk": {
      "optional": true
    },
    "mariadb": {
      "optional": true
    },
    "sqlite3": {
      "optional": true
    },
    "tedious": {
      "optional": true
    }
  },
  "commitlint": {
    "extends": [
      "@commitlint/config-angular"
    ],
    "rules": {
      "type-enum": [
        2,
        "always",
        [
          "build",
          "ci",
          "docs",
          "feat",
          "fix",
          "perf",
          "refactor",
          "revert",
          "style",
          "test",
          "meta"
        ]
      ]
    }
  },
  "lint-staged": {
    "*!(d).[tj]s": "eslint"
  },
  "release": {
    "plugins": [
      "@semantic-release/commit-analyzer",
      "semantic-release-fail-on-major-bump",
      "@semantic-release/release-notes-generator",
      "@semantic-release/npm",
      "@semantic-release/github"
    ],
    "branches": [
      "v6",
      {
        "name": "v6-beta",
        "prerelease": "beta"
      }
    ]
  },
  "publishConfig": {
    "tag": "latest"
  },
  "support": true
}"use strict";
const util = require("util");
const _ = require("lodash");
const wkx = require("wkx");
const sequelizeErrors = require("./errors");
const Validator = require("./utils/validator-extras").validator;
const momentTz = require("moment-timezone");
const moment = require("moment");
const { logger } = require("./utils/logger");
const warnings = {};
const { classToInvokable } = require("./utils/class-to-invokable");
const { joinSQLFragments } = require("./utils/join-sql-fragments");
class ABSTRACT {
  toString(options) {
    return this.toSql(options);
  }
  toSql() {
    return this.key;
  }
  stringify(value, options) {
    if (this._stringify) {
      return this._stringify(value, options);
    }
    return value;
  }
  bindParam(value, options) {
    if (this._bindParam) {
      return this._bindParam(value, options);
    }
    return options.bindParam(this.stringify(value, options));
  }
  static toString() {
    return this.name;
  }
  static warn(link, text) {
    if (!warnings[text]) {
      warnings[text] = true;
      logger.warn(`${text} 
>> Check: ${link}`);
    }
  }
  static extend(oldType) {
    return new this(oldType.options);
  }
}
ABSTRACT.prototype.dialectTypes = "";
class STRING extends ABSTRACT {
  constructor(length, binary) {
    super();
    const options = typeof length === "object" && length || { length, binary };
    this.options = options;
    this._binary = options.binary;
    this._length = options.length || 255;
  }
  toSql() {
    return joinSQLFragments([
      `VARCHAR(${this._length})`,
      this._binary && "BINARY"
    ]);
  }
  validate(value) {
    if (Object.prototype.toString.call(value) !== "[object String]") {
      if (this.options.binary && Buffer.isBuffer(value) || typeof value === "number") {
        return true;
      }
      throw new sequelizeErrors.ValidationError(util.format("%j is not a valid string", value));
    }
    return true;
  }
  get BINARY() {
    this._binary = true;
    this.options.binary = true;
    return this;
  }
  static get BINARY() {
    return new this().BINARY;
  }
}
class CHAR extends STRING {
  constructor(length, binary) {
    super(typeof length === "object" && length || { length, binary });
  }
  toSql() {
    return joinSQLFragments([
      `CHAR(${this._length})`,
      this._binary && "BINARY"
    ]);
  }
}
class TEXT extends ABSTRACT {
  constructor(length) {
    super();
    const options = typeof length === "object" && length || { length };
    this.options = options;
    this._length = options.length || "";
  }
  toSql() {
    switch (this._length.toLowerCase()) {
      case "tiny":
        return "TINYTEXT";
      case "medium":
        return "MEDIUMTEXT";
      case "long":
        return "LONGTEXT";
      default:
        return this.key;
    }
  }
  validate(value) {
    if (typeof value !== "string") {
      throw new sequelizeErrors.ValidationError(util.format("%j is not a valid string", value));
    }
    return true;
  }
}
class CITEXT extends ABSTRACT {
  toSql() {
    return "CITEXT";
  }
  validate(value) {
    if (typeof value !== "string") {
      throw new sequelizeErrors.ValidationError(util.format("%j is not a valid string", value));
    }
    return true;
  }
}
class NUMBER extends ABSTRACT {
  constructor(options = {}) {
    super();
    if (typeof options === "number") {
      options = {
        length: options
      };
    }
    this.options = options;
    this._length = options.length;
    this._zerofill = options.zerofill;
    this._decimals = options.decimals;
    this._precision = options.precision;
    this._scale = options.scale;
    this._unsigned = options.unsigned;
  }
  toSql() {
    let result = this.key;
    if (this._length) {
      result += `(${this._length}`;
      if (typeof this._decimals === "number") {
        result += `,${this._decimals}`;
      }
      result += ")";
    }
    if (this._unsigned) {
      result += " UNSIGNED";
    }
    if (this._zerofill) {
      result += " ZEROFILL";
    }
    return result;
  }
  validate(value) {
    if (!Validator.isFloat(String(value))) {
      throw new sequelizeErrors.ValidationError(util.format(`%j is not a valid ${this.key.toLowerCase()}`, value));
    }
    return true;
  }
  _stringify(number) {
    if (typeof number === "number" || typeof number === "boolean" || number === null || number === void 0) {
      return number;
    }
    if (typeof number.toString === "function") {
      return number.toString();
    }
    return number;
  }
  get UNSIGNED() {
    this._unsigned = true;
    this.options.unsigned = true;
    return this;
  }
  get ZEROFILL() {
    this._zerofill = true;
    this.options.zerofill = true;
    return this;
  }
  static get UNSIGNED() {
    return new this().UNSIGNED;
  }
  static get ZEROFILL() {
    return new this().ZEROFILL;
  }
}
class INTEGER extends NUMBER {
  validate(value) {
    if (!Validator.isInt(String(value))) {
      throw new sequelizeErrors.ValidationError(util.format(`%j is not a valid ${this.key.toLowerCase()}`, value));
    }
    return true;
  }
}
class TINYINT extends INTEGER {
}
class SMALLINT extends INTEGER {
}
class MEDIUMINT extends INTEGER {
}
class BIGINT extends INTEGER {
}
class FLOAT extends NUMBER {
  constructor(length, decimals) {
    super(typeof length === "object" && length || { length, decimals });
  }
  validate(value) {
    if (!Validator.isFloat(String(value))) {
      throw new sequelizeErrors.ValidationError(util.format("%j is not a valid float", value));
    }
    return true;
  }
}
class REAL extends NUMBER {
  constructor(length, decimals) {
    super(typeof length === "object" && length || { length, decimals });
  }
}
class DOUBLE extends NUMBER {
  constructor(length, decimals) {
    super(typeof length === "object" && length || { length, decimals });
  }
}
class DECIMAL extends NUMBER {
  constructor(precision, scale) {
    super(typeof precision === "object" && precision || { precision, scale });
  }
  toSql() {
    if (this._precision || this._scale) {
      return `DECIMAL(${[this._precision, this._scale].filter(_.identity).join(",")})`;
    }
    return "DECIMAL";
  }
  validate(value) {
    if (!Validator.isDecimal(String(value))) {
      throw new sequelizeErrors.ValidationError(util.format("%j is not a valid decimal", value));
    }
    return true;
  }
}
const protoExtensions = {
  escape: false,
  _value(value) {
    if (isNaN(value)) {
      return "NaN";
    }
    if (!isFinite(value)) {
      const sign = value < 0 ? "-" : "";
      return `${sign}Infinity`;
    }
    return value;
  },
  _stringify(value) {
    return `'${this._value(value)}'`;
  },
  _bindParam(value, options) {
    return options.bindParam(this._value(value));
  }
};
for (const floating of [FLOAT, DOUBLE, REAL]) {
  Object.assign(floating.prototype, protoExtensions);
}
class BOOLEAN extends ABSTRACT {
  toSql() {
    return "TINYINT(1)";
  }
  validate(value) {
    if (!Validator.isBoolean(String(value))) {
      throw new sequelizeErrors.ValidationError(util.format("%j is not a valid boolean", value));
    }
    return true;
  }
  _sanitize(value) {
    if (value !== null && value !== void 0) {
      if (Buffer.isBuffer(value) && value.length === 1) {
        value = value[0];
      }
      const type = typeof value;
      if (type === "string") {
        return value === "true" ? true : value === "false" ? false : value;
      }
      if (type === "number") {
        return value === 1 ? true : value === 0 ? false : value;
      }
    }
    return value;
  }
}
BOOLEAN.parse = BOOLEAN.prototype._sanitize;
class TIME extends ABSTRACT {
  toSql() {
    return "TIME";
  }
}
class DATE extends ABSTRACT {
  constructor(length) {
    super();
    const options = typeof length === "object" && length || { length };
    this.options = options;
    this._length = options.length || "";
  }
  toSql() {
    return "DATETIME";
  }
  validate(value) {
    if (!Validator.isDate(String(value))) {
      throw new sequelizeErrors.ValidationError(util.format("%j is not a valid date", value));
    }
    return true;
  }
  _sanitize(value, options) {
    if ((!options || options && !options.raw) && !(value instanceof Date) && !!value) {
      return new Date(value);
    }
    return value;
  }
  _isChanged(value, originalValue) {
    if (originalValue && !!value && (value === originalValue || value instanceof Date && originalValue instanceof Date && value.getTime() === originalValue.getTime())) {
      return false;
    }
    if (!originalValue && !value && originalValue === value) {
      return false;
    }
    return true;
  }
  _applyTimezone(date, options) {
    if (options.timezone) {
      if (momentTz.tz.zone(options.timezone)) {
        return momentTz(date).tz(options.timezone);
      }
      return date = moment(date).utcOffset(options.timezone);
    }
    return momentTz(date);
  }
  _stringify(date, options) {
    if (!moment.isMoment(date)) {
      date = this._applyTimezone(date, options);
    }
    return date.format("YYYY-MM-DD HH:mm:ss.SSS Z");
  }
}
class DATEONLY extends ABSTRACT {
  toSql() {
    return "DATE";
  }
  _stringify(date) {
    return moment(date).format("YYYY-MM-DD");
  }
  _sanitize(value, options) {
    if ((!options || options && !options.raw) && !!value) {
      return moment(value).format("YYYY-MM-DD");
    }
    return value;
  }
  _isChanged(value, originalValue) {
    if (originalValue && !!value && originalValue === value) {
      return false;
    }
    if (!originalValue && !value && originalValue === value) {
      return false;
    }
    return true;
  }
}
class HSTORE extends ABSTRACT {
  validate(value) {
    if (!_.isPlainObject(value)) {
      throw new sequelizeErrors.ValidationError(util.format("%j is not a valid hstore", value));
    }
    return true;
  }
}
class JSONTYPE extends ABSTRACT {
  validate() {
    return true;
  }
  _stringify(value) {
    return JSON.stringify(value);
  }
}
class JSONB extends JSONTYPE {
}
class NOW extends ABSTRACT {
}
class BLOB extends ABSTRACT {
  constructor(length) {
    super();
    const options = typeof length === "object" && length || { length };
    this.options = options;
    this._length = options.length || "";
  }
  toSql() {
    switch (this._length.toLowerCase()) {
      case "tiny":
        return "TINYBLOB";
      case "medium":
        return "MEDIUMBLOB";
      case "long":
        return "LONGBLOB";
      default:
        return this.key;
    }
  }
  validate(value) {
    if (typeof value !== "string" && !Buffer.isBuffer(value)) {
      throw new sequelizeErrors.ValidationError(util.format("%j is not a valid blob", value));
    }
    return true;
  }
  _stringify(value) {
    if (!Buffer.isBuffer(value)) {
      if (Array.isArray(value)) {
        value = Buffer.from(value);
      } else {
        value = Buffer.from(value.toString());
      }
    }
    const hex = value.toString("hex");
    return this._hexify(hex);
  }
  _hexify(hex) {
    return `X'${hex}'`;
  }
  _bindParam(value, options) {
    if (!Buffer.isBuffer(value)) {
      if (Array.isArray(value)) {
        value = Buffer.from(value);
      } else {
        value = Buffer.from(value.toString());
      }
    }
    return options.bindParam(value);
  }
}
BLOB.prototype.escape = false;
class RANGE extends ABSTRACT {
  constructor(subtype) {
    super();
    const options = _.isPlainObject(subtype) ? subtype : { subtype };
    if (!options.subtype)
      options.subtype = new INTEGER();
    if (typeof options.subtype === "function") {
      options.subtype = new options.subtype();
    }
    this._subtype = options.subtype.key;
    this.options = options;
  }
  validate(value) {
    if (!Array.isArray(value)) {
      throw new sequelizeErrors.ValidationError(util.format("%j is not a valid range", value));
    }
    if (value.length !== 2) {
      throw new sequelizeErrors.ValidationError("A range must be an array with two elements");
    }
    return true;
  }
}
class UUID extends ABSTRACT {
  validate(value, options) {
    if (typeof value !== "string" || !Validator.isUUID(value) && (!options || !options.acceptStrings)) {
      throw new sequelizeErrors.ValidationError(util.format("%j is not a valid uuid", value));
    }
    return true;
  }
}
class UUIDV1 extends ABSTRACT {
  validate(value, options) {
    if (typeof value !== "string" || !Validator.isUUID(value) && (!options || !options.acceptStrings)) {
      throw new sequelizeErrors.ValidationError(util.format("%j is not a valid uuid", value));
    }
    return true;
  }
}
class UUIDV4 extends ABSTRACT {
  validate(value, options) {
    if (typeof value !== "string" || !Validator.isUUID(value, 4) && (!options || !options.acceptStrings)) {
      throw new sequelizeErrors.ValidationError(util.format("%j is not a valid uuidv4", value));
    }
    return true;
  }
}
class VIRTUAL extends ABSTRACT {
  constructor(ReturnType, fields) {
    super();
    if (typeof ReturnType === "function")
      ReturnType = new ReturnType();
    this.returnType = ReturnType;
    this.fields = fields;
  }
}
class ENUM extends ABSTRACT {
  constructor(...args) {
    super();
    const value = args[0];
    const options = typeof value === "object" && !Array.isArray(value) && value || {
      values: args.reduce((result, element) => {
        return result.concat(Array.isArray(element) ? element : [element]);
      }, [])
    };
    this.values = options.values;
    this.options = options;
  }
  validate(value) {
    if (!this.values.includes(value)) {
      throw new sequelizeErrors.ValidationError(util.format("%j is not a valid choice in %j", value, this.values));
    }
    return true;
  }
}
class ARRAY extends ABSTRACT {
  constructor(type) {
    super();
    const options = _.isPlainObject(type) ? type : { type };
    this.options = options;
    this.type = typeof options.type === "function" ? new options.type() : options.type;
  }
  toSql() {
    return `${this.type.toSql()}[]`;
  }
  validate(value) {
    if (!Array.isArray(value)) {
      throw new sequelizeErrors.ValidationError(util.format("%j is not a valid array", value));
    }
    return true;
  }
  static is(obj, type) {
    return obj instanceof ARRAY && obj.type instanceof type;
  }
}
class GEOMETRY extends ABSTRACT {
  constructor(type, srid) {
    super();
    const options = _.isPlainObject(type) ? type : { type, srid };
    this.options = options;
    this.type = options.type;
    this.srid = options.srid;
  }
  _stringify(value, options) {
    return `ST_GeomFromText(${options.escape(wkx.Geometry.parseGeoJSON(value).toWkt())})`;
  }
  _bindParam(value, options) {
    return `ST_GeomFromText(${options.bindParam(wkx.Geometry.parseGeoJSON(value).toWkt())})`;
  }
}
GEOMETRY.prototype.escape = false;
class GEOGRAPHY extends ABSTRACT {
  constructor(type, srid) {
    super();
    const options = _.isPlainObject(type) ? type : { type, srid };
    this.options = options;
    this.type = options.type;
    this.srid = options.srid;
  }
  _stringify(value, options) {
    return `ST_GeomFromText(${options.escape(wkx.Geometry.parseGeoJSON(value).toWkt())})`;
  }
  _bindParam(value, options) {
    return `ST_GeomFromText(${options.bindParam(wkx.Geometry.parseGeoJSON(value).toWkt())})`;
  }
}
GEOGRAPHY.prototype.escape = false;
class CIDR extends ABSTRACT {
  validate(value) {
    if (typeof value !== "string" || !Validator.isIPRange(value)) {
      throw new sequelizeErrors.ValidationError(util.format("%j is not a valid CIDR", value));
    }
    return true;
  }
}
class INET extends ABSTRACT {
  validate(value) {
    if (typeof value !== "string" || !Validator.isIP(value)) {
      throw new sequelizeErrors.ValidationError(util.format("%j is not a valid INET", value));
    }
    return true;
  }
}
class MACADDR extends ABSTRACT {
  validate(value) {
    if (typeof value !== "string" || !Validator.isMACAddress(value)) {
      throw new sequelizeErrors.ValidationError(util.format("%j is not a valid MACADDR", value));
    }
    return true;
  }
}
class TSVECTOR extends ABSTRACT {
  validate(value) {
    if (typeof value !== "string") {
      throw new sequelizeErrors.ValidationError(util.format("%j is not a valid string", value));
    }
    return true;
  }
}
const DataTypes = module.exports = {
  ABSTRACT,
  STRING,
  CHAR,
  TEXT,
  NUMBER,
  TINYINT,
  SMALLINT,
  MEDIUMINT,
  INTEGER,
  BIGINT,
  FLOAT,
  TIME,
  DATE,
  DATEONLY,
  BOOLEAN,
  NOW,
  BLOB,
  DECIMAL,
  NUMERIC: DECIMAL,
  UUID,
  UUIDV1,
  UUIDV4,
  HSTORE,
  JSON: JSONTYPE,
  JSONB,
  VIRTUAL,
  ARRAY,
  ENUM,
  RANGE,
  REAL,
  "DOUBLE PRECISION": DOUBLE,
  DOUBLE,
  GEOMETRY,
  GEOGRAPHY,
  CIDR,
  INET,
  MACADDR,
  CITEXT,
  TSVECTOR
};
_.each(DataTypes, (dataType, name) => {
  if (!Object.prototype.hasOwnProperty.call(dataType, "key")) {
    dataType.types = {};
    dataType.key = dataType.prototype.key = name;
  }
});
const dialectMap = {};
dialectMap.postgres = require("./dialects/postgres/data-types")(DataTypes);
dialectMap.mysql = require("./dialects/mysql/data-types")(DataTypes);
dialectMap.mariadb = require("./dialects/mariadb/data-types")(DataTypes);
dialectMap.sqlite = require("./dialects/sqlite/data-types")(DataTypes);
dialectMap.mssql = require("./dialects/mssql/data-types")(DataTypes);
dialectMap.db2 = require("./dialects/db2/data-types")(DataTypes);
dialectMap.snowflake = require("./dialects/snowflake/data-types")(DataTypes);
const dialectList = Object.values(dialectMap);
for (const dataTypes of dialectList) {
  _.each(dataTypes, (DataType, key) => {
    if (!DataType.key) {
      DataType.key = DataType.prototype.key = key;
    }
  });
}
for (const dataTypes of [DataTypes, ...dialectList]) {
  _.each(dataTypes, (DataType, key) => {
    dataTypes[key] = classToInvokable(DataType);
  });
}
Object.assign(DataTypes, dialectMap);
//# sourceMappingURL=data-types.js.map
"use strict";
const { classToInvokable } = require("./utils");
class ABSTRACT {
  static toString(...args) {
    return new this().toString(...args);
  }
  toString(...args) {
    return this.toSql(...args);
  }
  toSql() {
    throw new Error("toSql implementation missing");
  }
}
class INITIALLY_DEFERRED extends ABSTRACT {
  toSql() {
    return "DEFERRABLE INITIALLY DEFERRED";
  }
}
class INITIALLY_IMMEDIATE extends ABSTRACT {
  toSql() {
    return "DEFERRABLE INITIALLY IMMEDIATE";
  }
}
class NOT extends ABSTRACT {
  toSql() {
    return "NOT DEFERRABLE";
  }
}
class SET_DEFERRED extends ABSTRACT {
  constructor(constraints) {
    super();
    this.constraints = constraints;
  }
  toSql(queryGenerator) {
    return queryGenerator.setDeferredQuery(this.constraints);
  }
}
class SET_IMMEDIATE extends ABSTRACT {
  constructor(constraints) {
    super();
    this.constraints = constraints;
  }
  toSql(queryGenerator) {
    return queryGenerator.setImmediateQuery(this.constraints);
  }
}
const Deferrable = {
  INITIALLY_DEFERRED: classToInvokable(INITIALLY_DEFERRED),
  INITIALLY_IMMEDIATE: classToInvokable(INITIALLY_IMMEDIATE),
  NOT: classToInvokable(NOT),
  SET_DEFERRED: classToInvokable(SET_DEFERRED),
  SET_IMMEDIATE: classToInvokable(SET_IMMEDIATE)
};
module.exports = Deferrable;
//# sourceMappingURL=deferrable.js.map
"use strict";
const _ = require("lodash");
const { logger } = require("./utils/logger");
const debug = logger.debugContext("hooks");
const hookTypes = {
  beforeValidate: { params: 2 },
  afterValidate: { params: 2 },
  validationFailed: { params: 3 },
  beforeCreate: { params: 2 },
  afterCreate: { params: 2 },
  beforeDestroy: { params: 2 },
  afterDestroy: { params: 2 },
  beforeRestore: { params: 2 },
  afterRestore: { params: 2 },
  beforeUpdate: { params: 2 },
  afterUpdate: { params: 2 },
  beforeSave: { params: 2, proxies: ["beforeUpdate", "beforeCreate"] },
  afterSave: { params: 2, proxies: ["afterUpdate", "afterCreate"] },
  beforeUpsert: { params: 2 },
  afterUpsert: { params: 2 },
  beforeBulkCreate: { params: 2 },
  afterBulkCreate: { params: 2 },
  beforeBulkDestroy: { params: 1 },
  afterBulkDestroy: { params: 1 },
  beforeBulkRestore: { params: 1 },
  afterBulkRestore: { params: 1 },
  beforeBulkUpdate: { params: 1 },
  afterBulkUpdate: { params: 1 },
  beforeFind: { params: 1 },
  beforeFindAfterExpandIncludeAll: { params: 1 },
  beforeFindAfterOptions: { params: 1 },
  afterFind: { params: 2 },
  beforeCount: { params: 1 },
  beforeDefine: { params: 2, sync: true, noModel: true },
  afterDefine: { params: 1, sync: true, noModel: true },
  beforeInit: { params: 2, sync: true, noModel: true },
  afterInit: { params: 1, sync: true, noModel: true },
  beforeAssociate: { params: 2, sync: true },
  afterAssociate: { params: 2, sync: true },
  beforeConnect: { params: 1, noModel: true },
  afterConnect: { params: 2, noModel: true },
  beforeDisconnect: { params: 1, noModel: true },
  afterDisconnect: { params: 1, noModel: true },
  beforeSync: { params: 1 },
  afterSync: { params: 1 },
  beforeBulkSync: { params: 1 },
  afterBulkSync: { params: 1 },
  beforeQuery: { params: 2 },
  afterQuery: { params: 2 }
};
exports.hooks = hookTypes;
const getProxiedHooks = (hookType) => hookTypes[hookType].proxies ? hookTypes[hookType].proxies.concat(hookType) : [hookType];
function getHooks(hooked, hookType) {
  return (hooked.options.hooks || {})[hookType] || [];
}
const Hooks = {
  _setupHooks(hooks) {
    this.options.hooks = {};
    _.map(hooks || {}, (hooksArray, hookName) => {
      if (!Array.isArray(hooksArray))
        hooksArray = [hooksArray];
      hooksArray.forEach((hookFn) => this.addHook(hookName, hookFn));
    });
  },
  async runHooks(hooks, ...hookArgs) {
    if (!hooks)
      throw new Error("runHooks requires at least 1 argument");
    let hookType;
    if (typeof hooks === "string") {
      hookType = hooks;
      hooks = getHooks(this, hookType);
      if (this.sequelize) {
        hooks = hooks.concat(getHooks(this.sequelize, hookType));
      }
    }
    if (!Array.isArray(hooks)) {
      hooks = [hooks];
    }
    if (hookTypes[hookType] && hookTypes[hookType].sync) {
      for (let hook of hooks) {
        if (typeof hook === "object") {
          hook = hook.fn;
        }
        debug(`running hook(sync) ${hookType}`);
        hook.apply(this, hookArgs);
      }
      return;
    }
    for (let hook of hooks) {
      if (typeof hook === "object") {
        hook = hook.fn;
      }
      debug(`running hook ${hookType}`);
      await hook.apply(this, hookArgs);
    }
  },
  addHook(hookType, name, fn) {
    if (typeof name === "function") {
      fn = name;
      name = null;
    }
    debug(`adding hook ${hookType}`);
    hookType = getProxiedHooks(hookType);
    hookType.forEach((type) => {
      const hooks = getHooks(this, type);
      hooks.push(name ? { name, fn } : fn);
      this.options.hooks[type] = hooks;
    });
    return this;
  },
  removeHook(hookType, name) {
    const isReference = typeof name === "function" ? true : false;
    if (!this.hasHook(hookType)) {
      return this;
    }
    debug(`removing hook ${hookType}`);
    hookType = getProxiedHooks(hookType);
    for (const type of hookType) {
      this.options.hooks[type] = this.options.hooks[type].filter((hook) => {
        if (isReference && typeof hook === "function") {
          return hook !== name;
        }
        if (!isReference && typeof hook === "object") {
          return hook.name !== name;
        }
        return true;
      });
    }
    return this;
  },
  hasHook(hookType) {
    return this.options.hooks[hookType] && !!this.options.hooks[hookType].length;
  }
};
Hooks.hasHooks = Hooks.hasHook;
function applyTo(target, isModel = false) {
  _.mixin(target, Hooks);
  for (const hook of Object.keys(hookTypes)) {
    if (isModel && hookTypes[hook].noModel) {
      continue;
    }
    target[hook] = function(name, callback) {
      return this.addHook(hook, name, callback);
    };
  }
}
exports.applyTo = applyTo;
//# sourceMappingURL=hooks.js.map
"use strict";
const IndexHints = module.exports = {
  USE: "USE",
  FORCE: "FORCE",
  IGNORE: "IGNORE"
};
//# sourceMappingURL=index-hints.js.map
"use strict";
module.exports = require("./sequelize");
//# sourceMappingURL=index.js.map
import Pkg from './index.js';

export default Pkg;

// export * from './lib/sequelize';
export const Sequelize = Pkg.Sequelize;
export const fn = Pkg.fn;
export const col = Pkg.col;
export const cast = Pkg.cast;
export const literal = Pkg.literal;
export const and = Pkg.and;
export const or = Pkg.or;
export const json = Pkg.json;
export const where = Pkg.where;

// export * from './lib/query-interface';
export const QueryInterface = Pkg.QueryInterface;

// export * from './lib/data-types';
// 'DOUBLE PRECISION' is missing because its name is not a valid export identifier.
export const ABSTRACT = Pkg.ABSTRACT;
export const STRING = Pkg.STRING;
export const CHAR = Pkg.CHAR;
export const TEXT = Pkg.TEXT;
export const NUMBER = Pkg.NUMBER;
export const TINYINT = Pkg.TINYINT;
export const SMALLINT = Pkg.SMALLINT;
export const MEDIUMINT = Pkg.MEDIUMINT;
export const INTEGER = Pkg.INTEGER;
export const BIGINT = Pkg.BIGINT;
export const FLOAT = Pkg.FLOAT;
export const TIME = Pkg.TIME;
export const DATE = Pkg.DATE;
export const DATEONLY = Pkg.DATEONLY;
export const BOOLEAN = Pkg.BOOLEAN;
export const NOW = Pkg.NOW;
export const BLOB = Pkg.BLOB;
export const DECIMAL = Pkg.DECIMAL;
export const NUMERIC = Pkg.NUMERIC;
export const UUID = Pkg.UUID;
export const UUIDV1 = Pkg.UUIDV1;
export const UUIDV4 = Pkg.UUIDV4;
export const HSTORE = Pkg.HSTORE;
export const JSON = Pkg.JSON;
export const JSONB = Pkg.JSONB;
export const VIRTUAL = Pkg.VIRTUAL;
export const ARRAY = Pkg.ARRAY;
export const ENUM = Pkg.ENUM;
export const RANGE = Pkg.RANGE;
export const REAL = Pkg.REAL;
export const DOUBLE = Pkg.DOUBLE;
export const GEOMETRY = Pkg.GEOMETRY;
export const GEOGRAPHY = Pkg.GEOGRAPHY;
export const CIDR = Pkg.CIDR;
export const INET = Pkg.INET;
export const MACADDR = Pkg.MACADDR;
export const CITEXT = Pkg.CITEXT;
export const TSVECTOR = Pkg.TSVECTOR;

// export * from './lib/model';
export const Model = Pkg.Model;

// export * from './lib/transaction';
export const Transaction = Pkg.Transaction;

// export * from './lib/associations/index';
export const Association = Pkg.Association;
export const BelongsTo = Pkg.BelongsTo;
export const HasOne = Pkg.HasOne;
export const HasMany = Pkg.HasMany;
export const BelongsToMany = Pkg.BelongsToMany;

// export * from './lib/errors';
export const BaseError = Pkg.BaseError;

export const AggregateError = Pkg.AggregateError;
export const AsyncQueueError = Pkg.AsyncQueueError;
export const AssociationError = Pkg.AssociationError;
export const BulkRecordError = Pkg.BulkRecordError;
export const ConnectionError = Pkg.ConnectionError;
export const DatabaseError = Pkg.DatabaseError;
export const EagerLoadingError = Pkg.EagerLoadingError;
export const EmptyResultError = Pkg.EmptyResultError;
export const InstanceError = Pkg.InstanceError;
export const OptimisticLockError = Pkg.OptimisticLockError;
export const QueryError = Pkg.QueryError;
export const SequelizeScopeError = Pkg.SequelizeScopeError;
export const ValidationError = Pkg.ValidationError;
export const ValidationErrorItem = Pkg.ValidationErrorItem;

export const AccessDeniedError = Pkg.AccessDeniedError;
export const ConnectionAcquireTimeoutError = Pkg.ConnectionAcquireTimeoutError;
export const ConnectionRefusedError = Pkg.ConnectionRefusedError;
export const ConnectionTimedOutError = Pkg.ConnectionTimedOutError;
export const HostNotFoundError = Pkg.HostNotFoundError;
export const HostNotReachableError = Pkg.HostNotReachableError;
export const InvalidConnectionError = Pkg.InvalidConnectionError;

export const ExclusionConstraintError = Pkg.ExclusionConstraintError;
export const ForeignKeyConstraintError = Pkg.ForeignKeyConstraintError;
export const TimeoutError = Pkg.TimeoutError;
export const UnknownConstraintError = Pkg.UnknownConstraintError;

export const UniqueConstraintError = Pkg.UniqueConstraintError;

// export { BaseError as Error } from './lib/errors';
export const Error = Pkg.Error;

// export { useInflection } from './lib/utils';
export const useInflection = Pkg.useInflection;

// export { Utils, QueryTypes, Op, TableHints, IndexHints, DataTypes, Deferrable };
export const Utils = Pkg.Utils;
export const QueryTypes = Pkg.QueryTypes;
export const Op = Pkg.Op;
export const TableHints = Pkg.TableHints;
export const IndexHints = Pkg.IndexHints;
export const DataTypes = Pkg.DataTypes;
export const Deferrable = Pkg.Deferrable;

// export { Validator as validator } from './lib/utils/validator-extras';
export const Validator = Pkg.Validator;

export const ValidationErrorItemOrigin = Pkg.ValidationErrorItemOrigin;
export const ValidationErrorItemType = Pkg.ValidationErrorItemType;
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
const _ = require("lodash");
const Utils = require("./utils");
const sequelizeError = require("./errors");
const DataTypes = require("./data-types");
const BelongsTo = require("./associations/belongs-to");
const validator = require("./utils/validator-extras").validator;
const { promisify } = require("util");
class InstanceValidator {
  constructor(modelInstance, options) {
    options = __spreadValues({
      hooks: true
    }, options);
    if (options.fields && !options.skip) {
      options.skip = _.difference(Object.keys(modelInstance.constructor.rawAttributes), options.fields);
    } else {
      options.skip = options.skip || [];
    }
    this.options = options;
    this.modelInstance = modelInstance;
    this.validator = validator;
    this.errors = [];
    this.inProgress = false;
  }
  async _validate() {
    if (this.inProgress)
      throw new Error("Validations already in progress.");
    this.inProgress = true;
    await Promise.all([
      this._perAttributeValidators(),
      this._customValidators()
    ]);
    if (this.errors.length) {
      throw new sequelizeError.ValidationError(null, this.errors);
    }
  }
  async validate() {
    return await (this.options.hooks ? this._validateAndRunHooks() : this._validate());
  }
  async _validateAndRunHooks() {
    const runHooks = this.modelInstance.constructor.runHooks.bind(this.modelInstance.constructor);
    await runHooks("beforeValidate", this.modelInstance, this.options);
    try {
      await this._validate();
    } catch (error) {
      const newError = await runHooks("validationFailed", this.modelInstance, this.options, error);
      throw newError || error;
    }
    await runHooks("afterValidate", this.modelInstance, this.options);
    return this.modelInstance;
  }
  async _perAttributeValidators() {
    const validators = [];
    _.forIn(this.modelInstance.rawAttributes, (rawAttribute, field) => {
      if (this.options.skip.includes(field)) {
        return;
      }
      const value = this.modelInstance.dataValues[field];
      if (value instanceof Utils.SequelizeMethod) {
        return;
      }
      if (!rawAttribute._autoGenerated && !rawAttribute.autoIncrement) {
        this._validateSchema(rawAttribute, field, value);
      }
      if (Object.prototype.hasOwnProperty.call(this.modelInstance.validators, field)) {
        validators.push(this._singleAttrValidate(value, field, rawAttribute.allowNull));
      }
    });
    return await Promise.all(validators);
  }
  async _customValidators() {
    const validators = [];
    _.each(this.modelInstance.constructor.options.validate, (validator2, validatorType) => {
      if (this.options.skip.includes(validatorType)) {
        return;
      }
      const valprom = this._invokeCustomValidator(validator2, validatorType).catch(() => {
      });
      validators.push(valprom);
    });
    return await Promise.all(validators);
  }
  async _singleAttrValidate(value, field, allowNull) {
    if ((value === null || value === void 0) && !allowNull) {
      return;
    }
    const validators = [];
    _.forIn(this.modelInstance.validators[field], (test, validatorType) => {
      if (["isUrl", "isURL", "isEmail"].includes(validatorType)) {
        if (typeof test === "object" && test !== null && test.msg) {
          test = {
            msg: test.msg
          };
        } else if (test === true) {
          test = {};
        }
      }
      if (typeof test === "function") {
        validators.push(this._invokeCustomValidator(test, validatorType, true, value, field));
        return;
      }
      if (value === null || value === void 0) {
        return;
      }
      const validatorPromise = this._invokeBuiltinValidator(value, test, validatorType, field);
      validatorPromise.catch(() => {
      });
      validators.push(validatorPromise);
    });
    return Promise.all(validators.map((validator2) => validator2.catch((rejection) => {
      const isBuiltIn = !!rejection.validatorName;
      this._pushError(isBuiltIn, field, rejection, value, rejection.validatorName, rejection.validatorArgs);
    })));
  }
  async _invokeCustomValidator(validator2, validatorType, optAttrDefined, optValue, optField) {
    let isAsync = false;
    const validatorArity = validator2.length;
    let asyncArity = 1;
    let errorKey = validatorType;
    let invokeArgs;
    if (optAttrDefined) {
      asyncArity = 2;
      invokeArgs = optValue;
      errorKey = optField;
    }
    if (validatorArity === asyncArity) {
      isAsync = true;
    }
    if (isAsync) {
      try {
        if (optAttrDefined) {
          return await promisify(validator2.bind(this.modelInstance, invokeArgs))();
        }
        return await promisify(validator2.bind(this.modelInstance))();
      } catch (e) {
        return this._pushError(false, errorKey, e, optValue, validatorType);
      }
    }
    try {
      return await validator2.call(this.modelInstance, invokeArgs);
    } catch (e) {
      return this._pushError(false, errorKey, e, optValue, validatorType);
    }
  }
  async _invokeBuiltinValidator(value, test, validatorType, field) {
    const valueString = String(value);
    if (typeof validator[validatorType] !== "function") {
      throw new Error(`Invalid validator function: ${validatorType}`);
    }
    const validatorArgs = this._extractValidatorArgs(test, validatorType, field);
    if (!validator[validatorType](valueString, ...validatorArgs)) {
      throw Object.assign(new Error(test.msg || `Validation ${validatorType} on ${field} failed`), { validatorName: validatorType, validatorArgs });
    }
  }
  _extractValidatorArgs(test, validatorType, field) {
    let validatorArgs = test.args || test;
    const isLocalizedValidator = typeof validatorArgs !== "string" && ["isAlpha", "isAlphanumeric", "isMobilePhone"].includes(validatorType);
    if (!Array.isArray(validatorArgs)) {
      if (validatorType === "isImmutable") {
        validatorArgs = [validatorArgs, field, this.modelInstance];
      } else if (isLocalizedValidator || validatorType === "isIP") {
        validatorArgs = [];
      } else {
        validatorArgs = [validatorArgs];
      }
    } else {
      validatorArgs = validatorArgs.slice(0);
    }
    return validatorArgs;
  }
  _validateSchema(rawAttribute, field, value) {
    if (rawAttribute.allowNull === false && (value === null || value === void 0)) {
      const association = Object.values(this.modelInstance.constructor.associations).find((association2) => association2 instanceof BelongsTo && association2.foreignKey === rawAttribute.fieldName);
      if (!association || !this.modelInstance.get(association.associationAccessor)) {
        const validators = this.modelInstance.validators[field];
        const errMsg = _.get(validators, "notNull.msg", `${this.modelInstance.constructor.name}.${field} cannot be null`);
        this.errors.push(new sequelizeError.ValidationErrorItem(errMsg, "notNull Violation", field, value, this.modelInstance, "is_null"));
      }
    }
    if (rawAttribute.type instanceof DataTypes.STRING || rawAttribute.type instanceof DataTypes.TEXT || rawAttribute.type instanceof DataTypes.CITEXT) {
      if (Array.isArray(value) || _.isObject(value) && !(value instanceof Utils.SequelizeMethod) && !Buffer.isBuffer(value)) {
        this.errors.push(new sequelizeError.ValidationErrorItem(`${field} cannot be an array or an object`, "string violation", field, value, this.modelInstance, "not_a_string"));
      }
    }
  }
  _pushError(isBuiltin, errorKey, rawError, value, fnName, fnArgs) {
    const message = rawError.message || rawError || "Validation error";
    const error = new sequelizeError.ValidationErrorItem(message, "Validation error", errorKey, value, this.modelInstance, fnName, isBuiltin ? fnName : void 0, isBuiltin ? fnArgs : void 0);
    error[InstanceValidator.RAW_KEY_NAME] = rawError;
    this.errors.push(error);
  }
}
InstanceValidator.RAW_KEY_NAME = "original";
module.exports = InstanceValidator;
module.exports.InstanceValidator = InstanceValidator;
module.exports.default = InstanceValidator;
//# sourceMappingURL=instance-validator.js.map
"use strict";
const Toposort = require("toposort-class");
const _ = require("lodash");
class ModelManager {
  constructor(sequelize) {
    this.models = [];
    this.sequelize = sequelize;
  }
  addModel(model) {
    this.models.push(model);
    this.sequelize.models[model.name] = model;
    return model;
  }
  removeModel(modelToRemove) {
    this.models = this.models.filter((model) => model.name !== modelToRemove.name);
    delete this.sequelize.models[modelToRemove.name];
  }
  getModel(against, options) {
    options = _.defaults(options || {}, {
      attribute: "name"
    });
    return this.models.find((model) => model[options.attribute] === against);
  }
  get all() {
    return this.models;
  }
  getModelsTopoSortedByForeignKey() {
    const models = /* @__PURE__ */ new Map();
    const sorter = new Toposort();
    for (const model of this.models) {
      let deps = [];
      let tableName = model.getTableName();
      if (_.isObject(tableName)) {
        tableName = `${tableName.schema}.${tableName.tableName}`;
      }
      models.set(tableName, model);
      for (const attrName in model.rawAttributes) {
        if (Object.prototype.hasOwnProperty.call(model.rawAttributes, attrName)) {
          const attribute = model.rawAttributes[attrName];
          if (attribute.references) {
            let dep = attribute.references.model;
            if (_.isObject(dep)) {
              dep = `${dep.schema}.${dep.tableName}`;
            }
            deps.push(dep);
          }
        }
      }
      deps = deps.filter((dep) => tableName !== dep);
      sorter.add(tableName, deps);
    }
    let sorted;
    try {
      sorted = sorter.sort();
    } catch (e) {
      if (!e.message.startsWith("Cyclic dependency found.")) {
        throw e;
      }
      return null;
    }
    return sorted.map((modelName) => {
      return models.get(modelName);
    }).filter(Boolean);
  }
  forEachModel(iterator, options) {
    const sortedModels = this.getModelsTopoSortedByForeignKey();
    if (sortedModels == null) {
      throw new Error("Cyclic dependency found.");
    }
    options = _.defaults(options || {}, {
      reverse: true
    });
    if (options.reverse) {
      sortedModels.reverse();
    }
    for (const model of sortedModels) {
      iterator(model);
    }
  }
}
module.exports = ModelManager;
module.exports.ModelManager = ModelManager;
module.exports.default = ModelManager;
//# sourceMappingURL=model-manager.js.map
"use strict";
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
const assert = require("assert");
const _ = require("lodash");
const Dottie = require("dottie");
const Utils = require("./utils");
const { logger } = require("./utils/logger");
const BelongsTo = require("./associations/belongs-to");
const BelongsToMany = require("./associations/belongs-to-many");
const InstanceValidator = require("./instance-validator");
const QueryTypes = require("./query-types");
const sequelizeErrors = require("./errors");
const Association = require("./associations/base");
const HasMany = require("./associations/has-many");
const DataTypes = require("./data-types");
const Hooks = require("./hooks");
const associationsMixin = require("./associations/mixin");
const Op = require("./operators");
const { noDoubleNestedGroup } = require("./utils/deprecations");
const validQueryKeywords = /* @__PURE__ */ new Set([
  "where",
  "attributes",
  "paranoid",
  "include",
  "order",
  "limit",
  "offset",
  "transaction",
  "lock",
  "raw",
  "logging",
  "benchmark",
  "having",
  "searchPath",
  "rejectOnEmpty",
  "plain",
  "scope",
  "group",
  "through",
  "defaults",
  "distinct",
  "primary",
  "exception",
  "type",
  "hooks",
  "force",
  "name"
]);
const nonCascadingOptions = ["include", "attributes", "originalAttributes", "order", "where", "limit", "offset", "plain", "group", "having"];
class Model {
  static get queryInterface() {
    return this.sequelize.getQueryInterface();
  }
  static get queryGenerator() {
    return this.queryInterface.queryGenerator;
  }
  get sequelize() {
    return this.constructor.sequelize;
  }
  constructor(values = {}, options = {}) {
    if (!this.constructor._overwrittenAttributesChecked) {
      this.constructor._overwrittenAttributesChecked = true;
      setTimeout(() => {
        const overwrittenAttributes = [];
        for (const key of Object.keys(this.constructor._attributeManipulation)) {
          if (Object.prototype.hasOwnProperty.call(this, key)) {
            overwrittenAttributes.push(key);
          }
        }
        if (overwrittenAttributes.length > 0) {
          logger.warn(`Model ${JSON.stringify(this.constructor.name)} is declaring public class fields for attribute(s): ${overwrittenAttributes.map((attr) => JSON.stringify(attr)).join(", ")}.
These class fields are shadowing Sequelize's attribute getters & setters.
See https://sequelize.org/main/manual/model-basics.html#caveat-with-public-class-fields`);
        }
      }, 0);
    }
    options = __spreadValues({
      isNewRecord: true,
      _schema: this.constructor._schema,
      _schemaDelimiter: this.constructor._schemaDelimiter
    }, options);
    if (options.attributes) {
      options.attributes = options.attributes.map((attribute) => Array.isArray(attribute) ? attribute[1] : attribute);
    }
    if (!options.includeValidated) {
      this.constructor._conformIncludes(options, this.constructor);
      if (options.include) {
        this.constructor._expandIncludeAll(options);
        this.constructor._validateIncludedElements(options);
      }
    }
    this.dataValues = {};
    this._previousDataValues = {};
    this.uniqno = 1;
    this._changed = /* @__PURE__ */ new Set();
    this._options = options;
    this.isNewRecord = options.isNewRecord;
    this._initValues(values, options);
  }
  _initValues(values, options) {
    let defaults;
    let key;
    values = __spreadValues({}, values);
    if (options.isNewRecord) {
      defaults = {};
      if (this.constructor._hasDefaultValues) {
        defaults = _.mapValues(this.constructor._defaultValues, (valueFn) => {
          const value = valueFn();
          return value && value instanceof Utils.SequelizeMethod ? value : _.cloneDeep(value);
        });
      }
      if (this.constructor.primaryKeyAttributes.length) {
        this.constructor.primaryKeyAttributes.forEach((primaryKeyAttribute) => {
          if (!Object.prototype.hasOwnProperty.call(defaults, primaryKeyAttribute)) {
            defaults[primaryKeyAttribute] = null;
          }
        });
      }
      if (this.constructor._timestampAttributes.createdAt && defaults[this.constructor._timestampAttributes.createdAt]) {
        this.dataValues[this.constructor._timestampAttributes.createdAt] = Utils.toDefaultValue(defaults[this.constructor._timestampAttributes.createdAt], this.sequelize.options.dialect);
        delete defaults[this.constructor._timestampAttributes.createdAt];
      }
      if (this.constructor._timestampAttributes.updatedAt && defaults[this.constructor._timestampAttributes.updatedAt]) {
        this.dataValues[this.constructor._timestampAttributes.updatedAt] = Utils.toDefaultValue(defaults[this.constructor._timestampAttributes.updatedAt], this.sequelize.options.dialect);
        delete defaults[this.constructor._timestampAttributes.updatedAt];
      }
      if (this.constructor._timestampAttributes.deletedAt && defaults[this.constructor._timestampAttributes.deletedAt]) {
        this.dataValues[this.constructor._timestampAttributes.deletedAt] = Utils.toDefaultValue(defaults[this.constructor._timestampAttributes.deletedAt], this.sequelize.options.dialect);
        delete defaults[this.constructor._timestampAttributes.deletedAt];
      }
      for (key in defaults) {
        if (values[key] === void 0) {
          this.set(key, Utils.toDefaultValue(defaults[key], this.sequelize.options.dialect), { raw: true });
          delete values[key];
        }
      }
    }
    this.set(values, options);
  }
  static _paranoidClause(model, options = {}) {
    if (options.include) {
      for (const include of options.include) {
        this._paranoidClause(include.model, include);
      }
    }
    if (_.get(options, "groupedLimit.on.options.paranoid")) {
      const throughModel = _.get(options, "groupedLimit.on.through.model");
      if (throughModel) {
        options.groupedLimit.through = this._paranoidClause(throughModel, options.groupedLimit.through);
      }
    }
    if (!model.options.timestamps || !model.options.paranoid || options.paranoid === false) {
      return options;
    }
    const deletedAtCol = model._timestampAttributes.deletedAt;
    const deletedAtAttribute = model.rawAttributes[deletedAtCol];
    const deletedAtObject = {};
    let deletedAtDefaultValue = Object.prototype.hasOwnProperty.call(deletedAtAttribute, "defaultValue") ? deletedAtAttribute.defaultValue : null;
    deletedAtDefaultValue = deletedAtDefaultValue || {
      [Op.eq]: null
    };
    deletedAtObject[deletedAtAttribute.field || deletedAtCol] = deletedAtDefaultValue;
    if (Utils.isWhereEmpty(options.where)) {
      options.where = deletedAtObject;
    } else {
      options.where = { [Op.and]: [deletedAtObject, options.where] };
    }
    return options;
  }
  static _addDefaultAttributes() {
    const tail = {};
    let head = {};
    if (!_.some(this.rawAttributes, "primaryKey")) {
      if ("id" in this.rawAttributes) {
        throw new Error(`A column called 'id' was added to the attributes of '${this.tableName}' but not marked with 'primaryKey: true'`);
      }
      head = {
        id: {
          type: new DataTypes.INTEGER(),
          allowNull: false,
          primaryKey: true,
          autoIncrement: true,
          _autoGenerated: true
        }
      };
    }
    if (this._timestampAttributes.createdAt) {
      tail[this._timestampAttributes.createdAt] = {
        type: DataTypes.DATE,
        allowNull: false,
        _autoGenerated: true
      };
    }
    if (this._timestampAttributes.updatedAt) {
      tail[this._timestampAttributes.updatedAt] = {
        type: DataTypes.DATE,
        allowNull: false,
        _autoGenerated: true
      };
    }
    if (this._timestampAttributes.deletedAt) {
      tail[this._timestampAttributes.deletedAt] = {
        type: DataTypes.DATE,
        _autoGenerated: true
      };
    }
    if (this._versionAttribute) {
      tail[this._versionAttribute] = {
        type: DataTypes.INTEGER,
        allowNull: false,
        defaultValue: 0,
        _autoGenerated: true
      };
    }
    const newRawAttributes = __spreadValues(__spreadValues({}, head), this.rawAttributes);
    _.each(tail, (value, attr) => {
      if (newRawAttributes[attr] === void 0) {
        newRawAttributes[attr] = value;
      }
    });
    this.rawAttributes = newRawAttributes;
    if (!Object.keys(this.primaryKeys).length) {
      this.primaryKeys.id = this.rawAttributes.id;
    }
  }
  static getAttributes() {
    return this.rawAttributes;
  }
  static _findAutoIncrementAttribute() {
    this.autoIncrementAttribute = null;
    for (const name in this.rawAttributes) {
      if (Object.prototype.hasOwnProperty.call(this.rawAttributes, name)) {
        const definition = this.rawAttributes[name];
        if (definition && definition.autoIncrement) {
          if (this.autoIncrementAttribute) {
            throw new Error("Invalid Instance definition. Only one autoincrement field allowed.");
          }
          this.autoIncrementAttribute = name;
        }
      }
    }
  }
  static _conformIncludes(options, self) {
    if (!options.include)
      return;
    if (!Array.isArray(options.include)) {
      options.include = [options.include];
    } else if (!options.include.length) {
      delete options.include;
      return;
    }
    options.include = options.include.map((include) => this._conformInclude(include, self));
  }
  static _transformStringAssociation(include, self) {
    if (self && typeof include === "string") {
      if (!Object.prototype.hasOwnProperty.call(self.associations, include)) {
        throw new Error(`Association with alias "${include}" does not exist on ${self.name}`);
      }
      return self.associations[include];
    }
    return include;
  }
  static _conformInclude(include, self) {
    if (include) {
      let model;
      if (include._pseudo)
        return include;
      include = this._transformStringAssociation(include, self);
      if (include instanceof Association) {
        if (self && include.target.name === self.name) {
          model = include.source;
        } else {
          model = include.target;
        }
        return { model, association: include, as: include.as };
      }
      if (include.prototype && include.prototype instanceof Model) {
        return { model: include };
      }
      if (_.isPlainObject(include)) {
        if (include.association) {
          include.association = this._transformStringAssociation(include.association, self);
          if (self && include.association.target.name === self.name) {
            model = include.association.source;
          } else {
            model = include.association.target;
          }
          if (!include.model)
            include.model = model;
          if (!include.as)
            include.as = include.association.as;
          this._conformIncludes(include, model);
          return include;
        }
        if (include.model) {
          this._conformIncludes(include, include.model);
          return include;
        }
        if (include.all) {
          this._conformIncludes(include);
          return include;
        }
      }
    }
    throw new Error("Include unexpected. Element has to be either a Model, an Association or an object.");
  }
  static _expandIncludeAllElement(includes, include) {
    let all = include.all;
    delete include.all;
    if (all !== true) {
      if (!Array.isArray(all)) {
        all = [all];
      }
      const validTypes = {
        BelongsTo: true,
        HasOne: true,
        HasMany: true,
        One: ["BelongsTo", "HasOne"],
        Has: ["HasOne", "HasMany"],
        Many: ["HasMany"]
      };
      for (let i = 0; i < all.length; i++) {
        const type = all[i];
        if (type === "All") {
          all = true;
          break;
        }
        const types = validTypes[type];
        if (!types) {
          throw new sequelizeErrors.EagerLoadingError(`include all '${type}' is not valid - must be BelongsTo, HasOne, HasMany, One, Has, Many or All`);
        }
        if (types !== true) {
          all.splice(i, 1);
          i--;
          for (let j = 0; j < types.length; j++) {
            if (!all.includes(types[j])) {
              all.unshift(types[j]);
              i++;
            }
          }
        }
      }
    }
    const nested = include.nested;
    if (nested) {
      delete include.nested;
      if (!include.include) {
        include.include = [];
      } else if (!Array.isArray(include.include)) {
        include.include = [include.include];
      }
    }
    const used = [];
    (function addAllIncludes(parent, includes2) {
      _.forEach(parent.associations, (association) => {
        if (all !== true && !all.includes(association.associationType)) {
          return;
        }
        const model = association.target;
        const as = association.options.as;
        const predicate = { model };
        if (as) {
          predicate.as = as;
        }
        if (_.some(includes2, predicate)) {
          return;
        }
        if (nested && used.includes(model)) {
          return;
        }
        used.push(parent);
        const thisInclude = Utils.cloneDeep(include);
        thisInclude.model = model;
        if (as) {
          thisInclude.as = as;
        }
        includes2.push(thisInclude);
        if (nested) {
          addAllIncludes(model, thisInclude.include);
          if (thisInclude.include.length === 0)
            delete thisInclude.include;
        }
      });
      used.pop();
    })(this, includes);
  }
  static _validateIncludedElements(options, tableNames) {
    if (!options.model)
      options.model = this;
    tableNames = tableNames || {};
    options.includeNames = [];
    options.includeMap = {};
    options.hasSingleAssociation = false;
    options.hasMultiAssociation = false;
    if (!options.parent) {
      options.topModel = options.model;
      options.topLimit = options.limit;
    }
    options.include = options.include.map((include) => {
      include = this._conformInclude(include);
      include.parent = options;
      include.topLimit = options.topLimit;
      this._validateIncludedElement.call(options.model, include, tableNames, options);
      if (include.duplicating === void 0) {
        include.duplicating = include.association.isMultiAssociation;
      }
      include.hasDuplicating = include.hasDuplicating || include.duplicating;
      include.hasRequired = include.hasRequired || include.required;
      options.hasDuplicating = options.hasDuplicating || include.hasDuplicating;
      options.hasRequired = options.hasRequired || include.required;
      options.hasWhere = options.hasWhere || include.hasWhere || !!include.where;
      return include;
    });
    for (const include of options.include) {
      include.hasParentWhere = options.hasParentWhere || !!options.where;
      include.hasParentRequired = options.hasParentRequired || !!options.required;
      if (include.subQuery !== false && options.hasDuplicating && options.topLimit) {
        if (include.duplicating) {
          include.subQuery = include.subQuery || false;
          include.subQueryFilter = include.hasRequired;
        } else {
          include.subQuery = include.hasRequired;
          include.subQueryFilter = false;
        }
      } else {
        include.subQuery = include.subQuery || false;
        if (include.duplicating) {
          include.subQueryFilter = include.subQuery;
        } else {
          include.subQueryFilter = false;
          include.subQuery = include.subQuery || include.hasParentRequired && include.hasRequired && !include.separate;
        }
      }
      options.includeMap[include.as] = include;
      options.includeNames.push(include.as);
      if (options.topModel === options.model && options.subQuery === void 0 && options.topLimit) {
        if (include.subQuery) {
          options.subQuery = include.subQuery;
        } else if (include.hasDuplicating) {
          options.subQuery = true;
        }
      }
      options.hasIncludeWhere = options.hasIncludeWhere || include.hasIncludeWhere || !!include.where;
      options.hasIncludeRequired = options.hasIncludeRequired || include.hasIncludeRequired || !!include.required;
      if (include.association.isMultiAssociation || include.hasMultiAssociation) {
        options.hasMultiAssociation = true;
      }
      if (include.association.isSingleAssociation || include.hasSingleAssociation) {
        options.hasSingleAssociation = true;
      }
    }
    if (options.topModel === options.model && options.subQuery === void 0) {
      options.subQuery = false;
    }
    return options;
  }
  static _validateIncludedElement(include, tableNames, options) {
    tableNames[include.model.getTableName()] = true;
    if (include.attributes && !options.raw) {
      include.model._expandAttributes(include);
      include.originalAttributes = include.model._injectDependentVirtualAttributes(include.attributes);
      include = Utils.mapFinderOptions(include, include.model);
      if (include.attributes.length) {
        _.each(include.model.primaryKeys, (attr, key) => {
          if (!include.attributes.some((includeAttr) => {
            if (attr.field !== key) {
              return Array.isArray(includeAttr) && includeAttr[0] === attr.field && includeAttr[1] === key;
            }
            return includeAttr === key;
          })) {
            include.attributes.unshift(key);
          }
        });
      }
    } else {
      include = Utils.mapFinderOptions(include, include.model);
    }
    if (include._pseudo) {
      if (!include.attributes) {
        include.attributes = Object.keys(include.model.tableAttributes);
      }
      return Utils.mapFinderOptions(include, include.model);
    }
    const association = include.association || this._getIncludedAssociation(include.model, include.as);
    include.association = association;
    include.as = association.as;
    if (include.association.through && Object(include.association.through.model) === include.association.through.model) {
      if (!include.include)
        include.include = [];
      const through = include.association.through;
      include.through = _.defaults(include.through || {}, {
        model: through.model,
        as: through.model.name,
        association: {
          isSingleAssociation: true
        },
        _pseudo: true,
        parent: include
      });
      if (through.scope) {
        include.through.where = include.through.where ? { [Op.and]: [include.through.where, through.scope] } : through.scope;
      }
      include.include.push(include.through);
      tableNames[through.tableName] = true;
    }
    let model;
    if (include.model.scoped === true) {
      model = include.model;
    } else {
      model = include.association.target.name === include.model.name ? include.association.target : include.association.source;
    }
    model._injectScope(include);
    if (!include.attributes) {
      include.attributes = Object.keys(include.model.tableAttributes);
    }
    include = Utils.mapFinderOptions(include, include.model);
    if (include.required === void 0) {
      include.required = !!include.where;
    }
    if (include.association.scope) {
      include.where = include.where ? { [Op.and]: [include.where, include.association.scope] } : include.association.scope;
    }
    if (include.limit && include.separate === void 0) {
      include.separate = true;
    }
    if (include.separate === true) {
      if (!(include.association instanceof HasMany)) {
        throw new Error("Only HasMany associations support include.separate");
      }
      include.duplicating = false;
      if (options.attributes && options.attributes.length && !_.flattenDepth(options.attributes, 2).includes(association.sourceKey)) {
        options.attributes.push(association.sourceKey);
      }
      if (include.attributes && include.attributes.length && !_.flattenDepth(include.attributes, 2).includes(association.foreignKey)) {
        include.attributes.push(association.foreignKey);
      }
    }
    if (Object.prototype.hasOwnProperty.call(include, "include")) {
      this._validateIncludedElements.call(include.model, include, tableNames);
    }
    return include;
  }
  static _getIncludedAssociation(targetModel, targetAlias) {
    const associations = this.getAssociations(targetModel);
    let association = null;
    if (associations.length === 0) {
      throw new sequelizeErrors.EagerLoadingError(`${targetModel.name} is not associated to ${this.name}!`);
    }
    if (associations.length === 1) {
      association = this.getAssociationForAlias(targetModel, targetAlias);
      if (association) {
        return association;
      }
      if (targetAlias) {
        const existingAliases = this.getAssociations(targetModel).map((association2) => association2.as);
        throw new sequelizeErrors.EagerLoadingError(`${targetModel.name} is associated to ${this.name} using an alias. You've included an alias (${targetAlias}), but it does not match the alias(es) defined in your association (${existingAliases.join(", ")}).`);
      }
      throw new sequelizeErrors.EagerLoadingError(`${targetModel.name} is associated to ${this.name} using an alias. You must use the 'as' keyword to specify the alias within your include statement.`);
    }
    association = this.getAssociationForAlias(targetModel, targetAlias);
    if (!association) {
      throw new sequelizeErrors.EagerLoadingError(`${targetModel.name} is associated to ${this.name} multiple times. To identify the correct association, you must use the 'as' keyword to specify the alias of the association you want to include.`);
    }
    return association;
  }
  static _expandIncludeAll(options) {
    const includes = options.include;
    if (!includes) {
      return;
    }
    for (let index = 0; index < includes.length; index++) {
      const include = includes[index];
      if (include.all) {
        includes.splice(index, 1);
        index--;
        this._expandIncludeAllElement(includes, include);
      }
    }
    includes.forEach((include) => {
      this._expandIncludeAll.call(include.model, include);
    });
  }
  static _conformIndex(index) {
    if (!index.fields) {
      throw new Error('Missing "fields" property for index definition');
    }
    index = _.defaults(index, {
      type: "",
      parser: null
    });
    if (index.type && index.type.toLowerCase() === "unique") {
      index.unique = true;
      delete index.type;
    }
    return index;
  }
  static _uniqIncludes(options) {
    if (!options.include)
      return;
    options.include = _(options.include).groupBy((include) => `${include.model && include.model.name}-${include.as}`).map((includes) => this._assignOptions(...includes)).value();
  }
  static _baseMerge(...args) {
    _.assignWith(...args);
    this._conformIncludes(args[0], this);
    this._uniqIncludes(args[0]);
    return args[0];
  }
  static _mergeFunction(objValue, srcValue, key) {
    if (Array.isArray(objValue) && Array.isArray(srcValue)) {
      return _.union(objValue, srcValue);
    }
    if (["where", "having"].includes(key)) {
      if (this.options && this.options.whereMergeStrategy === "and") {
        return combineWheresWithAnd(objValue, srcValue);
      }
      if (srcValue instanceof Utils.SequelizeMethod) {
        srcValue = { [Op.and]: srcValue };
      }
      if (_.isPlainObject(objValue) && _.isPlainObject(srcValue)) {
        return Object.assign(objValue, srcValue);
      }
    } else if (key === "attributes" && _.isPlainObject(objValue) && _.isPlainObject(srcValue)) {
      return _.assignWith(objValue, srcValue, (objValue2, srcValue2) => {
        if (Array.isArray(objValue2) && Array.isArray(srcValue2)) {
          return _.union(objValue2, srcValue2);
        }
      });
    }
    if (srcValue) {
      return Utils.cloneDeep(srcValue, true);
    }
    return srcValue === void 0 ? objValue : srcValue;
  }
  static _assignOptions(...args) {
    return this._baseMerge(...args, this._mergeFunction.bind(this));
  }
  static _defaultsOptions(target, opts) {
    return this._baseMerge(target, opts, (srcValue, objValue, key) => {
      return this._mergeFunction(objValue, srcValue, key);
    });
  }
  static init(attributes, options = {}) {
    if (!options.sequelize) {
      throw new Error("No Sequelize instance passed");
    }
    this.sequelize = options.sequelize;
    const globalOptions = this.sequelize.options;
    options = Utils.merge(_.cloneDeep(globalOptions.define), options);
    if (!options.modelName) {
      options.modelName = this.name;
    }
    options = Utils.merge({
      name: {
        plural: Utils.pluralize(options.modelName),
        singular: Utils.singularize(options.modelName)
      },
      indexes: [],
      omitNull: globalOptions.omitNull,
      schema: globalOptions.schema
    }, options);
    this.sequelize.runHooks("beforeDefine", attributes, options);
    if (options.modelName !== this.name) {
      Object.defineProperty(this, "name", { value: options.modelName });
    }
    delete options.modelName;
    this.options = __spreadValues({
      timestamps: true,
      validate: {},
      freezeTableName: false,
      underscored: false,
      paranoid: false,
      rejectOnEmpty: false,
      whereCollection: null,
      schema: null,
      schemaDelimiter: "",
      defaultScope: {},
      scopes: {},
      indexes: [],
      whereMergeStrategy: "overwrite"
    }, options);
    if (this.sequelize.isDefined(this.name)) {
      this.sequelize.modelManager.removeModel(this.sequelize.modelManager.getModel(this.name));
    }
    this.associations = {};
    this._setupHooks(options.hooks);
    this.underscored = this.options.underscored;
    if (!this.options.tableName) {
      this.tableName = this.options.freezeTableName ? this.name : Utils.underscoredIf(Utils.pluralize(this.name), this.underscored);
    } else {
      this.tableName = this.options.tableName;
    }
    this._schema = this.options.schema;
    this._schemaDelimiter = this.options.schemaDelimiter;
    _.each(options.validate, (validator, validatorType) => {
      if (Object.prototype.hasOwnProperty.call(attributes, validatorType)) {
        throw new Error(`A model validator function must not have the same name as a field. Model: ${this.name}, field/validation name: ${validatorType}`);
      }
      if (typeof validator !== "function") {
        throw new Error(`Members of the validate option must be functions. Model: ${this.name}, error with validate member ${validatorType}`);
      }
    });
    if (!_.includes(["and", "overwrite"], this.options && this.options.whereMergeStrategy)) {
      throw new Error(`Invalid value ${this.options && this.options.whereMergeStrategy} for whereMergeStrategy. Allowed values are 'and' and 'overwrite'.`);
    }
    this.rawAttributes = _.mapValues(attributes, (attribute, name) => {
      attribute = this.sequelize.normalizeAttribute(attribute);
      if (attribute.type === void 0) {
        throw new Error(`Unrecognized datatype for attribute "${this.name}.${name}"`);
      }
      if (attribute.allowNull !== false && _.get(attribute, "validate.notNull")) {
        throw new Error(`Invalid definition for "${this.name}.${name}", "notNull" validator is only allowed with "allowNull:false"`);
      }
      if (_.get(attribute, "references.model.prototype") instanceof Model) {
        attribute.references.model = attribute.references.model.getTableName();
      }
      return attribute;
    });
    const tableName = this.getTableName();
    this._indexes = this.options.indexes.map((index) => Utils.nameIndex(this._conformIndex(index), tableName));
    this.primaryKeys = {};
    this._readOnlyAttributes = /* @__PURE__ */ new Set();
    this._timestampAttributes = {};
    if (this.options.timestamps) {
      for (const key of ["createdAt", "updatedAt", "deletedAt"]) {
        if (!["undefined", "string", "boolean"].includes(typeof this.options[key])) {
          throw new Error(`Value for "${key}" option must be a string or a boolean, got ${typeof this.options[key]}`);
        }
        if (this.options[key] === "") {
          throw new Error(`Value for "${key}" option cannot be an empty string`);
        }
      }
      if (this.options.createdAt !== false) {
        this._timestampAttributes.createdAt = typeof this.options.createdAt === "string" ? this.options.createdAt : "createdAt";
        this._readOnlyAttributes.add(this._timestampAttributes.createdAt);
      }
      if (this.options.updatedAt !== false) {
        this._timestampAttributes.updatedAt = typeof this.options.updatedAt === "string" ? this.options.updatedAt : "updatedAt";
        this._readOnlyAttributes.add(this._timestampAttributes.updatedAt);
      }
      if (this.options.paranoid && this.options.deletedAt !== false) {
        this._timestampAttributes.deletedAt = typeof this.options.deletedAt === "string" ? this.options.deletedAt : "deletedAt";
        this._readOnlyAttributes.add(this._timestampAttributes.deletedAt);
      }
    }
    if (this.options.version) {
      this._versionAttribute = typeof this.options.version === "string" ? this.options.version : "version";
      this._readOnlyAttributes.add(this._versionAttribute);
    }
    this._hasReadOnlyAttributes = this._readOnlyAttributes.size > 0;
    this._addDefaultAttributes();
    this.refreshAttributes();
    this._findAutoIncrementAttribute();
    this._scope = this.options.defaultScope;
    this._scopeNames = ["defaultScope"];
    this.sequelize.modelManager.addModel(this);
    this.sequelize.runHooks("afterDefine", this);
    return this;
  }
  static refreshAttributes() {
    const attributeManipulation = {};
    this.prototype._customGetters = {};
    this.prototype._customSetters = {};
    ["get", "set"].forEach((type) => {
      const opt = `${type}terMethods`;
      const funcs = __spreadValues({}, this.options[opt]);
      const _custom = type === "get" ? this.prototype._customGetters : this.prototype._customSetters;
      _.each(funcs, (method, attribute) => {
        _custom[attribute] = method;
        if (type === "get") {
          funcs[attribute] = function() {
            return this.get(attribute);
          };
        }
        if (type === "set") {
          funcs[attribute] = function(value) {
            return this.set(attribute, value);
          };
        }
      });
      _.each(this.rawAttributes, (options, attribute) => {
        if (Object.prototype.hasOwnProperty.call(options, type)) {
          _custom[attribute] = options[type];
        }
        if (type === "get") {
          funcs[attribute] = function() {
            return this.get(attribute);
          };
        }
        if (type === "set") {
          funcs[attribute] = function(value) {
            return this.set(attribute, value);
          };
        }
      });
      _.each(funcs, (fct, name) => {
        if (!attributeManipulation[name]) {
          attributeManipulation[name] = {
            configurable: true
          };
        }
        attributeManipulation[name][type] = fct;
      });
    });
    this._dataTypeChanges = {};
    this._dataTypeSanitizers = {};
    this._hasBooleanAttributes = false;
    this._hasDateAttributes = false;
    this._jsonAttributes = /* @__PURE__ */ new Set();
    this._virtualAttributes = /* @__PURE__ */ new Set();
    this._defaultValues = {};
    this.prototype.validators = {};
    this.fieldRawAttributesMap = {};
    this.primaryKeys = {};
    this.uniqueKeys = {};
    _.each(this.rawAttributes, (definition, name) => {
      definition.type = this.sequelize.normalizeDataType(definition.type);
      definition.Model = this;
      definition.fieldName = name;
      definition._modelAttribute = true;
      if (definition.field === void 0) {
        definition.field = Utils.underscoredIf(name, this.underscored);
      }
      if (definition.primaryKey === true) {
        this.primaryKeys[name] = definition;
      }
      this.fieldRawAttributesMap[definition.field] = definition;
      if (definition.type._sanitize) {
        this._dataTypeSanitizers[name] = definition.type._sanitize;
      }
      if (definition.type._isChanged) {
        this._dataTypeChanges[name] = definition.type._isChanged;
      }
      if (definition.type instanceof DataTypes.BOOLEAN) {
        this._hasBooleanAttributes = true;
      } else if (definition.type instanceof DataTypes.DATE || definition.type instanceof DataTypes.DATEONLY) {
        this._hasDateAttributes = true;
      } else if (definition.type instanceof DataTypes.JSON) {
        this._jsonAttributes.add(name);
      } else if (definition.type instanceof DataTypes.VIRTUAL) {
        this._virtualAttributes.add(name);
      }
      if (Object.prototype.hasOwnProperty.call(definition, "defaultValue")) {
        this._defaultValues[name] = () => Utils.toDefaultValue(definition.defaultValue, this.sequelize.options.dialect);
      }
      if (Object.prototype.hasOwnProperty.call(definition, "unique") && definition.unique) {
        let idxName;
        if (typeof definition.unique === "object" && Object.prototype.hasOwnProperty.call(definition.unique, "name")) {
          idxName = definition.unique.name;
        } else if (typeof definition.unique === "string") {
          idxName = definition.unique;
        } else {
          idxName = `${this.tableName}_${name}_unique`;
        }
        const idx = this.uniqueKeys[idxName] || { fields: [] };
        idx.fields.push(definition.field);
        idx.msg = idx.msg || definition.unique.msg || null;
        idx.name = idxName || false;
        idx.column = name;
        idx.customIndex = definition.unique !== true;
        this.uniqueKeys[idxName] = idx;
      }
      if (Object.prototype.hasOwnProperty.call(definition, "validate")) {
        this.prototype.validators[name] = definition.validate;
      }
      if (definition.index === true && definition.type instanceof DataTypes.JSONB) {
        this._indexes.push(Utils.nameIndex(this._conformIndex({
          fields: [definition.field || name],
          using: "gin"
        }), this.getTableName()));
        delete definition.index;
      }
    });
    this.fieldAttributeMap = _.reduce(this.fieldRawAttributesMap, (map, value, key) => {
      if (key !== value.fieldName) {
        map[key] = value.fieldName;
      }
      return map;
    }, {});
    this._hasJsonAttributes = !!this._jsonAttributes.size;
    this._hasVirtualAttributes = !!this._virtualAttributes.size;
    this._hasDefaultValues = !_.isEmpty(this._defaultValues);
    this.tableAttributes = _.omitBy(this.rawAttributes, (_a, key) => this._virtualAttributes.has(key));
    this.prototype._hasCustomGetters = Object.keys(this.prototype._customGetters).length;
    this.prototype._hasCustomSetters = Object.keys(this.prototype._customSetters).length;
    for (const key of Object.keys(attributeManipulation)) {
      if (Object.prototype.hasOwnProperty.call(Model.prototype, key)) {
        this.sequelize.log(`Not overriding built-in method from model attribute: ${key}`);
        continue;
      }
      Object.defineProperty(this.prototype, key, attributeManipulation[key]);
    }
    this.prototype.rawAttributes = this.rawAttributes;
    this.prototype._isAttribute = (key) => Object.prototype.hasOwnProperty.call(this.prototype.rawAttributes, key);
    this.primaryKeyAttributes = Object.keys(this.primaryKeys);
    this.primaryKeyAttribute = this.primaryKeyAttributes[0];
    if (this.primaryKeyAttribute) {
      this.primaryKeyField = this.rawAttributes[this.primaryKeyAttribute].field || this.primaryKeyAttribute;
    }
    this._hasPrimaryKeys = this.primaryKeyAttributes.length > 0;
    this._isPrimaryKey = (key) => this.primaryKeyAttributes.includes(key);
    this._attributeManipulation = attributeManipulation;
  }
  static removeAttribute(attribute) {
    delete this.rawAttributes[attribute];
    this.refreshAttributes();
  }
  static async sync(options) {
    options = __spreadValues(__spreadValues({}, this.options), options);
    options.hooks = options.hooks === void 0 ? true : !!options.hooks;
    const attributes = this.tableAttributes;
    const rawAttributes = this.fieldRawAttributesMap;
    if (options.hooks) {
      await this.runHooks("beforeSync", options);
    }
    const tableName = this.getTableName(options);
    let tableExists;
    if (options.force) {
      await this.drop(options);
      tableExists = false;
    } else {
      tableExists = await this.queryInterface.tableExists(tableName, options);
    }
    if (!tableExists) {
      await this.queryInterface.createTable(tableName, attributes, options, this);
    } else {
      await this.queryInterface.ensureEnums(tableName, attributes, options, this);
    }
    if (tableExists && options.alter) {
      const tableInfos = await Promise.all([
        this.queryInterface.describeTable(tableName, options),
        this.queryInterface.getForeignKeyReferencesForTable(tableName, options)
      ]);
      const columns = tableInfos[0];
      const foreignKeyReferences = tableInfos[1];
      const removedConstraints = {};
      for (const columnName in attributes) {
        if (!Object.prototype.hasOwnProperty.call(attributes, columnName))
          continue;
        if (!columns[columnName] && !columns[attributes[columnName].field]) {
          await this.queryInterface.addColumn(tableName, attributes[columnName].field || columnName, attributes[columnName], options);
        }
      }
      if (options.alter === true || typeof options.alter === "object" && options.alter.drop !== false) {
        for (const columnName in columns) {
          if (!Object.prototype.hasOwnProperty.call(columns, columnName))
            continue;
          const currentAttribute = rawAttributes[columnName];
          if (!currentAttribute) {
            await this.queryInterface.removeColumn(tableName, columnName, options);
            continue;
          }
          if (currentAttribute.primaryKey)
            continue;
          const references = currentAttribute.references;
          if (currentAttribute.references) {
            const database = this.sequelize.config.database;
            const schema = this.sequelize.config.schema;
            for (const foreignKeyReference of foreignKeyReferences) {
              const constraintName = foreignKeyReference.constraintName;
              if (!!constraintName && foreignKeyReference.tableCatalog === database && (schema ? foreignKeyReference.tableSchema === schema : true) && foreignKeyReference.referencedTableName === references.model && foreignKeyReference.referencedColumnName === references.key && (schema ? foreignKeyReference.referencedTableSchema === schema : true) && !removedConstraints[constraintName]) {
                await this.queryInterface.removeConstraint(tableName, constraintName, options);
                removedConstraints[constraintName] = true;
              }
            }
          }
          await this.queryInterface.changeColumn(tableName, columnName, currentAttribute, options);
        }
      }
    }
    const existingIndexes = await this.queryInterface.showIndex(tableName, options);
    const missingIndexes = this._indexes.filter((item1) => !existingIndexes.some((item2) => item1.name === item2.name)).sort((index1, index2) => {
      if (this.sequelize.options.dialect === "postgres") {
        if (index1.concurrently === true)
          return 1;
        if (index2.concurrently === true)
          return -1;
      }
      return 0;
    });
    for (const index of missingIndexes) {
      await this.queryInterface.addIndex(tableName, __spreadValues(__spreadValues({}, options), index));
    }
    if (options.hooks) {
      await this.runHooks("afterSync", options);
    }
    return this;
  }
  static async drop(options) {
    return await this.queryInterface.dropTable(this.getTableName(options), options);
  }
  static async dropSchema(schema) {
    return await this.queryInterface.dropSchema(schema);
  }
  static schema(schema, options) {
    const clone = class extends this {
    };
    Object.defineProperty(clone, "name", { value: this.name });
    clone._schema = schema;
    if (options) {
      if (typeof options === "string") {
        clone._schemaDelimiter = options;
      } else if (options.schemaDelimiter) {
        clone._schemaDelimiter = options.schemaDelimiter;
      }
    }
    return clone;
  }
  static getTableName() {
    return this.queryGenerator.addSchema(this);
  }
  static unscoped() {
    return this.scope();
  }
  static addScope(name, scope, options) {
    options = __spreadValues({ override: false }, options);
    if ((name === "defaultScope" && Object.keys(this.options.defaultScope).length > 0 || name in this.options.scopes) && options.override === false) {
      throw new Error(`The scope ${name} already exists. Pass { override: true } as options to silence this error`);
    }
    if (name === "defaultScope") {
      this.options.defaultScope = this._scope = scope;
    } else {
      this.options.scopes[name] = scope;
    }
  }
  static scope(option) {
    const self = class extends this {
    };
    let scope;
    let scopeName;
    Object.defineProperty(self, "name", { value: this.name });
    self._scope = {};
    self._scopeNames = [];
    self.scoped = true;
    if (!option) {
      return self;
    }
    const options = _.flatten(arguments);
    for (const option2 of options) {
      scope = null;
      scopeName = null;
      if (_.isPlainObject(option2)) {
        if (option2.method) {
          if (Array.isArray(option2.method) && !!self.options.scopes[option2.method[0]]) {
            scopeName = option2.method[0];
            scope = self.options.scopes[scopeName].apply(self, option2.method.slice(1));
          } else if (self.options.scopes[option2.method]) {
            scopeName = option2.method;
            scope = self.options.scopes[scopeName].apply(self);
          }
        } else {
          scope = option2;
        }
      } else if (option2 === "defaultScope" && _.isPlainObject(self.options.defaultScope)) {
        scope = self.options.defaultScope;
      } else {
        scopeName = option2;
        scope = self.options.scopes[scopeName];
        if (typeof scope === "function") {
          scope = scope();
        }
      }
      if (scope) {
        this._conformIncludes(scope, this);
        this._assignOptions(self._scope, Utils.cloneDeep(scope));
        self._scopeNames.push(scopeName ? scopeName : "defaultScope");
      } else {
        throw new sequelizeErrors.SequelizeScopeError(`Invalid scope ${scopeName} called.`);
      }
    }
    return self;
  }
  static async findAll(options) {
    if (options !== void 0 && !_.isPlainObject(options)) {
      throw new sequelizeErrors.QueryError("The argument passed to findAll must be an options object, use findByPk if you wish to pass a single primary key value");
    }
    if (options !== void 0 && options.attributes) {
      if (!Array.isArray(options.attributes) && !_.isPlainObject(options.attributes)) {
        throw new sequelizeErrors.QueryError("The attributes option must be an array of column names or an object");
      }
    }
    this.warnOnInvalidOptions(options, Object.keys(this.rawAttributes));
    const tableNames = {};
    tableNames[this.getTableName(options)] = true;
    options = Utils.cloneDeep(options);
    _.defaults(options, { hooks: true });
    options.rejectOnEmpty = Object.prototype.hasOwnProperty.call(options, "rejectOnEmpty") ? options.rejectOnEmpty : this.options.rejectOnEmpty;
    this._injectScope(options);
    if (options.hooks) {
      await this.runHooks("beforeFind", options);
    }
    this._conformIncludes(options, this);
    this._expandAttributes(options);
    this._expandIncludeAll(options);
    if (options.hooks) {
      await this.runHooks("beforeFindAfterExpandIncludeAll", options);
    }
    options.originalAttributes = this._injectDependentVirtualAttributes(options.attributes);
    if (options.include) {
      options.hasJoin = true;
      this._validateIncludedElements(options, tableNames);
      if (options.attributes && !options.raw && this.primaryKeyAttribute && !options.attributes.includes(this.primaryKeyAttribute) && (!options.group || !options.hasSingleAssociation || options.hasMultiAssociation)) {
        options.attributes = [this.primaryKeyAttribute].concat(options.attributes);
      }
    }
    if (!options.attributes) {
      options.attributes = Object.keys(this.rawAttributes);
      options.originalAttributes = this._injectDependentVirtualAttributes(options.attributes);
    }
    this.options.whereCollection = options.where || null;
    Utils.mapFinderOptions(options, this);
    options = this._paranoidClause(this, options);
    if (options.hooks) {
      await this.runHooks("beforeFindAfterOptions", options);
    }
    const selectOptions = __spreadProps(__spreadValues({}, options), { tableNames: Object.keys(tableNames) });
    const results = await this.queryInterface.select(this, this.getTableName(selectOptions), selectOptions);
    if (options.hooks) {
      await this.runHooks("afterFind", results, options);
    }
    if (_.isEmpty(results) && options.rejectOnEmpty) {
      if (typeof options.rejectOnEmpty === "function") {
        throw new options.rejectOnEmpty();
      }
      if (typeof options.rejectOnEmpty === "object") {
        throw options.rejectOnEmpty;
      }
      throw new sequelizeErrors.EmptyResultError();
    }
    return await Model._findSeparate(results, options);
  }
  static warnOnInvalidOptions(options, validColumnNames) {
    if (!_.isPlainObject(options)) {
      return;
    }
    const unrecognizedOptions = Object.keys(options).filter((k) => !validQueryKeywords.has(k));
    const unexpectedModelAttributes = _.intersection(unrecognizedOptions, validColumnNames);
    if (!options.where && unexpectedModelAttributes.length > 0) {
      logger.warn(`Model attributes (${unexpectedModelAttributes.join(", ")}) passed into finder method options of model ${this.name}, but the options.where object is empty. Did you forget to use options.where?`);
    }
  }
  static _injectDependentVirtualAttributes(attributes) {
    if (!this._hasVirtualAttributes)
      return attributes;
    if (!attributes || !Array.isArray(attributes))
      return attributes;
    for (const attribute of attributes) {
      if (this._virtualAttributes.has(attribute) && this.rawAttributes[attribute].type.fields) {
        attributes = attributes.concat(this.rawAttributes[attribute].type.fields);
      }
    }
    attributes = _.uniq(attributes);
    return attributes;
  }
  static async _findSeparate(results, options) {
    if (!options.include || options.raw || !results)
      return results;
    const original = results;
    if (options.plain)
      results = [results];
    if (!results.length)
      return original;
    await Promise.all(options.include.map(async (include) => {
      if (!include.separate) {
        return await Model._findSeparate(results.reduce((memo, result) => {
          let associations = result.get(include.association.as);
          if (!associations)
            return memo;
          if (!Array.isArray(associations))
            associations = [associations];
          for (let i = 0, len = associations.length; i !== len; ++i) {
            memo.push(associations[i]);
          }
          return memo;
        }, []), __spreadProps(__spreadValues({}, _.omit(options, "include", "attributes", "order", "where", "limit", "offset", "plain", "scope")), {
          include: include.include || []
        }));
      }
      const map = await include.association.get(results, __spreadValues(__spreadValues({}, _.omit(options, nonCascadingOptions)), _.omit(include, ["parent", "association", "as", "originalAttributes"])));
      for (const result of results) {
        result.set(include.association.as, map[result.get(include.association.sourceKey)], { raw: true });
      }
    }));
    return original;
  }
  static async findByPk(param, options) {
    if ([null, void 0].includes(param)) {
      return null;
    }
    options = Utils.cloneDeep(options) || {};
    if (typeof param === "number" || typeof param === "string" || Buffer.isBuffer(param)) {
      options.where = {
        [this.primaryKeyAttribute]: param
      };
    } else {
      throw new Error(`Argument passed to findByPk is invalid: ${param}`);
    }
    return await this.findOne(options);
  }
  static async findOne(options) {
    if (options !== void 0 && !_.isPlainObject(options)) {
      throw new Error("The argument passed to findOne must be an options object, use findByPk if you wish to pass a single primary key value");
    }
    options = Utils.cloneDeep(options);
    if (options.limit === void 0) {
      const uniqueSingleColumns = _.chain(this.uniqueKeys).values().filter((c) => c.fields.length === 1).map("column").value();
      if (!options.where || !_.some(options.where, (value, key) => (key === this.primaryKeyAttribute || uniqueSingleColumns.includes(key)) && (Utils.isPrimitive(value) || Buffer.isBuffer(value)))) {
        options.limit = 1;
      }
    }
    return await this.findAll(_.defaults(options, {
      plain: true
    }));
  }
  static async aggregate(attribute, aggregateFunction, options) {
    options = Utils.cloneDeep(options);
    const prevAttributes = options.attributes;
    this._injectScope(options);
    options.attributes = prevAttributes;
    this._conformIncludes(options, this);
    if (options.include) {
      this._expandIncludeAll(options);
      this._validateIncludedElements(options);
    }
    const attrOptions = this.rawAttributes[attribute];
    const field = attrOptions && attrOptions.field || attribute;
    let aggregateColumn = this.sequelize.col(field);
    if (options.distinct) {
      aggregateColumn = this.sequelize.fn("DISTINCT", aggregateColumn);
    }
    let { group } = options;
    if (Array.isArray(group) && Array.isArray(group[0])) {
      noDoubleNestedGroup();
      group = _.flatten(group);
    }
    options.attributes = _.unionBy(options.attributes, group, [[this.sequelize.fn(aggregateFunction, aggregateColumn), aggregateFunction]], (a) => Array.isArray(a) ? a[1] : a);
    if (!options.dataType) {
      if (attrOptions) {
        options.dataType = attrOptions.type;
      } else {
        options.dataType = new DataTypes.FLOAT();
      }
    } else {
      options.dataType = this.sequelize.normalizeDataType(options.dataType);
    }
    Utils.mapOptionFieldNames(options, this);
    options = this._paranoidClause(this, options);
    const value = await this.queryInterface.rawSelect(this.getTableName(options), options, aggregateFunction, this);
    return value;
  }
  static async count(options) {
    options = Utils.cloneDeep(options);
    options = _.defaults(options, { hooks: true });
    options.raw = true;
    if (options.hooks) {
      await this.runHooks("beforeCount", options);
    }
    let col = options.col || "*";
    if (options.include) {
      col = `${this.name}.${options.col || this.primaryKeyField}`;
    }
    if (options.distinct && col === "*") {
      col = this.primaryKeyField;
    }
    options.plain = !options.group;
    options.dataType = new DataTypes.INTEGER();
    options.includeIgnoreAttributes = false;
    options.limit = null;
    options.offset = null;
    options.order = null;
    const result = await this.aggregate(col, "count", options);
    if (Array.isArray(result)) {
      return result.map((item) => __spreadProps(__spreadValues({}, item), {
        count: Number(item.count)
      }));
    }
    return result;
  }
  static async findAndCountAll(options) {
    if (options !== void 0 && !_.isPlainObject(options)) {
      throw new Error("The argument passed to findAndCountAll must be an options object, use findByPk if you wish to pass a single primary key value");
    }
    const countOptions = Utils.cloneDeep(options);
    if (countOptions.attributes) {
      countOptions.attributes = void 0;
    }
    const [count, rows] = await Promise.all([
      this.count(countOptions),
      this.findAll(options)
    ]);
    return {
      count,
      rows: count === 0 ? [] : rows
    };
  }
  static async max(field, options) {
    return await this.aggregate(field, "max", options);
  }
  static async min(field, options) {
    return await this.aggregate(field, "min", options);
  }
  static async sum(field, options) {
    return await this.aggregate(field, "sum", options);
  }
  static build(values, options) {
    if (Array.isArray(values)) {
      return this.bulkBuild(values, options);
    }
    return new this(values, options);
  }
  static bulkBuild(valueSets, options) {
    options = __spreadValues({ isNewRecord: true }, options);
    if (!options.includeValidated) {
      this._conformIncludes(options, this);
      if (options.include) {
        this._expandIncludeAll(options);
        this._validateIncludedElements(options);
      }
    }
    if (options.attributes) {
      options.attributes = options.attributes.map((attribute) => Array.isArray(attribute) ? attribute[1] : attribute);
    }
    return valueSets.map((values) => this.build(values, options));
  }
  static async create(values, options) {
    options = Utils.cloneDeep(options || {});
    return await this.build(values, {
      isNewRecord: true,
      attributes: options.fields,
      include: options.include,
      raw: options.raw,
      silent: options.silent
    }).save(options);
  }
  static async findOrBuild(options) {
    if (!options || !options.where || arguments.length > 1) {
      throw new Error("Missing where attribute in the options parameter passed to findOrBuild. Please note that the API has changed, and is now options only (an object with where, defaults keys, transaction etc.)");
    }
    let values;
    let instance = await this.findOne(options);
    if (instance === null) {
      values = __spreadValues({}, options.defaults);
      if (_.isPlainObject(options.where)) {
        values = Utils.defaults(values, options.where);
      }
      instance = this.build(values, options);
      return [instance, true];
    }
    return [instance, false];
  }
  static async findOrCreate(options) {
    if (!options || !options.where || arguments.length > 1) {
      throw new Error("Missing where attribute in the options parameter passed to findOrCreate. Please note that the API has changed, and is now options only (an object with where, defaults keys, transaction etc.)");
    }
    options = __spreadValues({}, options);
    if (options.defaults) {
      const defaults = Object.keys(options.defaults);
      const unknownDefaults = defaults.filter((name) => !this.rawAttributes[name]);
      if (unknownDefaults.length) {
        logger.warn(`Unknown attributes (${unknownDefaults}) passed to defaults option of findOrCreate`);
      }
    }
    if (options.transaction === void 0 && this.sequelize.constructor._cls) {
      const t = this.sequelize.constructor._cls.get("transaction");
      if (t) {
        options.transaction = t;
      }
    }
    const internalTransaction = !options.transaction;
    let values;
    let transaction;
    try {
      const t = await this.sequelize.transaction(options);
      transaction = t;
      options.transaction = t;
      const found = await this.findOne(Utils.defaults({ transaction }, options));
      if (found !== null) {
        return [found, false];
      }
      values = __spreadValues({}, options.defaults);
      if (_.isPlainObject(options.where)) {
        values = Utils.defaults(values, options.where);
      }
      options.exception = true;
      options.returning = true;
      try {
        const created = await this.create(values, options);
        if (created.get(this.primaryKeyAttribute, { raw: true }) === null) {
          throw new sequelizeErrors.UniqueConstraintError();
        }
        return [created, true];
      } catch (err) {
        if (!(err instanceof sequelizeErrors.UniqueConstraintError))
          throw err;
        const flattenedWhere = Utils.flattenObjectDeep(options.where);
        const flattenedWhereKeys = Object.keys(flattenedWhere).map((name) => _.last(name.split(".")));
        const whereFields = flattenedWhereKeys.map((name) => _.get(this.rawAttributes, `${name}.field`, name));
        const defaultFields = options.defaults && Object.keys(options.defaults).filter((name) => this.rawAttributes[name]).map((name) => this.rawAttributes[name].field || name);
        const errFieldKeys = Object.keys(err.fields);
        const errFieldsWhereIntersects = Utils.intersects(errFieldKeys, whereFields);
        if (defaultFields && !errFieldsWhereIntersects && Utils.intersects(errFieldKeys, defaultFields)) {
          throw err;
        }
        if (errFieldsWhereIntersects) {
          _.each(err.fields, (value, key) => {
            const name = this.fieldRawAttributesMap[key].fieldName;
            if (value.toString() !== options.where[name].toString()) {
              throw new Error(`${this.name}#findOrCreate: value used for ${name} was not equal for both the find and the create calls, '${options.where[name]}' vs '${value}'`);
            }
          });
        }
        const otherCreated = await this.findOne(Utils.defaults({
          transaction: internalTransaction ? null : transaction
        }, options));
        if (otherCreated === null)
          throw err;
        return [otherCreated, false];
      }
    } finally {
      if (internalTransaction && transaction) {
        await transaction.commit();
      }
    }
  }
  static async findCreateFind(options) {
    if (!options || !options.where) {
      throw new Error("Missing where attribute in the options parameter passed to findCreateFind.");
    }
    let values = __spreadValues({}, options.defaults);
    if (_.isPlainObject(options.where)) {
      values = Utils.defaults(values, options.where);
    }
    const found = await this.findOne(options);
    if (found)
      return [found, false];
    try {
      const createOptions = __spreadValues({}, options);
      if (this.sequelize.options.dialect === "postgres" && options.transaction) {
        createOptions.ignoreDuplicates = true;
      }
      const created = await this.create(values, createOptions);
      return [created, true];
    } catch (err) {
      if (!(err instanceof sequelizeErrors.UniqueConstraintError || err instanceof sequelizeErrors.EmptyResultError)) {
        throw err;
      }
      const foundAgain = await this.findOne(options);
      return [foundAgain, false];
    }
  }
  static async upsert(values, options) {
    options = __spreadValues({
      hooks: true,
      returning: true,
      validate: true
    }, Utils.cloneDeep(options));
    const createdAtAttr = this._timestampAttributes.createdAt;
    const updatedAtAttr = this._timestampAttributes.updatedAt;
    const hasPrimary = this.primaryKeyField in values || this.primaryKeyAttribute in values;
    const instance = this.build(values);
    options.model = this;
    options.instance = instance;
    const changed = Array.from(instance._changed);
    if (!options.fields) {
      options.fields = changed;
    }
    if (options.validate) {
      await instance.validate(options);
    }
    const updatedDataValues = _.pick(instance.dataValues, changed);
    const insertValues = Utils.mapValueFieldNames(instance.dataValues, Object.keys(instance.rawAttributes), this);
    const updateValues = Utils.mapValueFieldNames(updatedDataValues, options.fields, this);
    const now = Utils.now(this.sequelize.options.dialect);
    if (createdAtAttr && !insertValues[createdAtAttr]) {
      const field = this.rawAttributes[createdAtAttr].field || createdAtAttr;
      insertValues[field] = this._getDefaultTimestamp(createdAtAttr) || now;
    }
    if (updatedAtAttr && !insertValues[updatedAtAttr]) {
      const field = this.rawAttributes[updatedAtAttr].field || updatedAtAttr;
      insertValues[field] = updateValues[field] = this._getDefaultTimestamp(updatedAtAttr) || now;
    }
    if (this.sequelize.options.dialect === "db2") {
      this.uniqno = this.sequelize.dialect.queryGenerator.addUniqueFields(insertValues, this.rawAttributes, this.uniqno);
    }
    if (!hasPrimary && this.primaryKeyAttribute && !this.rawAttributes[this.primaryKeyAttribute].defaultValue) {
      delete insertValues[this.primaryKeyField];
      delete updateValues[this.primaryKeyField];
    }
    if (options.hooks) {
      await this.runHooks("beforeUpsert", values, options);
    }
    const result = await this.queryInterface.upsert(this.getTableName(options), insertValues, updateValues, instance.where(), options);
    const [record] = result;
    record.isNewRecord = false;
    if (options.hooks) {
      await this.runHooks("afterUpsert", result, options);
      return result;
    }
    return result;
  }
  static async bulkCreate(records, options = {}) {
    if (!records.length) {
      return [];
    }
    const dialect = this.sequelize.options.dialect;
    const now = Utils.now(this.sequelize.options.dialect);
    options = Utils.cloneDeep(options);
    options.model = this;
    if (!options.includeValidated) {
      this._conformIncludes(options, this);
      if (options.include) {
        this._expandIncludeAll(options);
        this._validateIncludedElements(options);
      }
    }
    const instances = records.map((values) => this.build(values, { isNewRecord: true, include: options.include }));
    const recursiveBulkCreate = async (instances2, options2) => {
      options2 = __spreadValues({
        validate: false,
        hooks: true,
        individualHooks: false,
        ignoreDuplicates: false
      }, options2);
      if (options2.returning === void 0) {
        if (options2.association) {
          options2.returning = false;
        } else {
          options2.returning = true;
        }
      }
      if (options2.ignoreDuplicates && ["mssql", "db2"].includes(dialect)) {
        throw new Error(`${dialect} does not support the ignoreDuplicates option.`);
      }
      if (options2.updateOnDuplicate && (dialect !== "mysql" && dialect !== "mariadb" && dialect !== "sqlite" && dialect !== "postgres")) {
        throw new Error(`${dialect} does not support the updateOnDuplicate option.`);
      }
      const model = options2.model;
      options2.fields = options2.fields || Object.keys(model.rawAttributes);
      const createdAtAttr = model._timestampAttributes.createdAt;
      const updatedAtAttr = model._timestampAttributes.updatedAt;
      if (options2.updateOnDuplicate !== void 0) {
        if (Array.isArray(options2.updateOnDuplicate) && options2.updateOnDuplicate.length) {
          options2.updateOnDuplicate = _.intersection(_.without(Object.keys(model.tableAttributes), createdAtAttr), options2.updateOnDuplicate);
        } else {
          throw new Error("updateOnDuplicate option only supports non-empty array.");
        }
      }
      if (options2.hooks) {
        await model.runHooks("beforeBulkCreate", instances2, options2);
      }
      if (options2.validate) {
        const errors = [];
        const validateOptions = __spreadValues({}, options2);
        validateOptions.hooks = options2.individualHooks;
        await Promise.all(instances2.map(async (instance) => {
          try {
            await instance.validate(validateOptions);
          } catch (err) {
            errors.push(new sequelizeErrors.BulkRecordError(err, instance));
          }
        }));
        delete options2.skip;
        if (errors.length) {
          throw new sequelizeErrors.AggregateError(errors);
        }
      }
      if (options2.individualHooks) {
        await Promise.all(instances2.map(async (instance) => {
          const individualOptions = __spreadProps(__spreadValues({}, options2), {
            validate: false,
            hooks: true
          });
          delete individualOptions.fields;
          delete individualOptions.individualHooks;
          delete individualOptions.ignoreDuplicates;
          await instance.save(individualOptions);
        }));
      } else {
        if (options2.include && options2.include.length) {
          await Promise.all(options2.include.filter((include) => include.association instanceof BelongsTo).map(async (include) => {
            const associationInstances = [];
            const associationInstanceIndexToInstanceMap = [];
            for (const instance of instances2) {
              const associationInstance = instance.get(include.as);
              if (associationInstance) {
                associationInstances.push(associationInstance);
                associationInstanceIndexToInstanceMap.push(instance);
              }
            }
            if (!associationInstances.length) {
              return;
            }
            const includeOptions = _(Utils.cloneDeep(include)).omit(["association"]).defaults({
              transaction: options2.transaction,
              logging: options2.logging
            }).value();
            const createdAssociationInstances = await recursiveBulkCreate(associationInstances, includeOptions);
            for (const idx in createdAssociationInstances) {
              const associationInstance = createdAssociationInstances[idx];
              const instance = associationInstanceIndexToInstanceMap[idx];
              await include.association.set(instance, associationInstance, { save: false, logging: options2.logging });
            }
          }));
        }
        records = instances2.map((instance) => {
          const values = instance.dataValues;
          if (createdAtAttr && !values[createdAtAttr]) {
            values[createdAtAttr] = now;
            if (!options2.fields.includes(createdAtAttr)) {
              options2.fields.push(createdAtAttr);
            }
          }
          if (updatedAtAttr && !values[updatedAtAttr]) {
            values[updatedAtAttr] = now;
            if (!options2.fields.includes(updatedAtAttr)) {
              options2.fields.push(updatedAtAttr);
            }
          }
          const out = Utils.mapValueFieldNames(values, options2.fields, model);
          for (const key of model._virtualAttributes) {
            delete out[key];
          }
          return out;
        });
        const fieldMappedAttributes = {};
        for (const attr in model.tableAttributes) {
          fieldMappedAttributes[model.rawAttributes[attr].field || attr] = model.rawAttributes[attr];
        }
        if (options2.updateOnDuplicate) {
          options2.updateOnDuplicate = options2.updateOnDuplicate.map((attr) => model.rawAttributes[attr].field || attr);
          const upsertKeys = [];
          for (const i of model._indexes) {
            if (i.unique && !i.where) {
              upsertKeys.push(...i.fields);
            }
          }
          const firstUniqueKey = Object.values(model.uniqueKeys).find((c) => c.fields.length > 0);
          if (firstUniqueKey && firstUniqueKey.fields) {
            upsertKeys.push(...firstUniqueKey.fields);
          }
          options2.upsertKeys = upsertKeys.length > 0 ? upsertKeys : Object.values(model.primaryKeys).map((x) => x.field);
        }
        if (options2.returning && Array.isArray(options2.returning)) {
          options2.returning = options2.returning.map((attr) => _.get(model.rawAttributes[attr], "field", attr));
        }
        const results = await model.queryInterface.bulkInsert(model.getTableName(options2), records, options2, fieldMappedAttributes);
        if (Array.isArray(results)) {
          results.forEach((result, i) => {
            const instance = instances2[i];
            for (const key in result) {
              if (!instance || key === model.primaryKeyAttribute && instance.get(model.primaryKeyAttribute) && ["mysql", "mariadb", "sqlite"].includes(dialect)) {
                continue;
              }
              if (Object.prototype.hasOwnProperty.call(result, key)) {
                const record = result[key];
                const attr = _.find(model.rawAttributes, (attribute) => attribute.fieldName === key || attribute.field === key);
                instance.dataValues[attr && attr.fieldName || key] = record;
              }
            }
          });
        }
      }
      if (options2.include && options2.include.length) {
        await Promise.all(options2.include.filter((include) => !(include.association instanceof BelongsTo || include.parent && include.parent.association instanceof BelongsToMany)).map(async (include) => {
          const associationInstances = [];
          const associationInstanceIndexToInstanceMap = [];
          for (const instance of instances2) {
            let associated = instance.get(include.as);
            if (!Array.isArray(associated))
              associated = [associated];
            for (const associationInstance of associated) {
              if (associationInstance) {
                if (!(include.association instanceof BelongsToMany)) {
                  associationInstance.set(include.association.foreignKey, instance.get(include.association.sourceKey || instance.constructor.primaryKeyAttribute, { raw: true }), { raw: true });
                  Object.assign(associationInstance, include.association.scope);
                }
                associationInstances.push(associationInstance);
                associationInstanceIndexToInstanceMap.push(instance);
              }
            }
          }
          if (!associationInstances.length) {
            return;
          }
          const includeOptions = _(Utils.cloneDeep(include)).omit(["association"]).defaults({
            transaction: options2.transaction,
            logging: options2.logging
          }).value();
          const createdAssociationInstances = await recursiveBulkCreate(associationInstances, includeOptions);
          if (include.association instanceof BelongsToMany) {
            const valueSets = [];
            for (const idx in createdAssociationInstances) {
              const associationInstance = createdAssociationInstances[idx];
              const instance = associationInstanceIndexToInstanceMap[idx];
              const values = __spreadValues({
                [include.association.foreignKey]: instance.get(instance.constructor.primaryKeyAttribute, { raw: true }),
                [include.association.otherKey]: associationInstance.get(associationInstance.constructor.primaryKeyAttribute, { raw: true })
              }, include.association.through.scope);
              if (associationInstance[include.association.through.model.name]) {
                for (const attr of Object.keys(include.association.through.model.rawAttributes)) {
                  if (include.association.through.model.rawAttributes[attr]._autoGenerated || attr === include.association.foreignKey || attr === include.association.otherKey || typeof associationInstance[include.association.through.model.name][attr] === void 0) {
                    continue;
                  }
                  values[attr] = associationInstance[include.association.through.model.name][attr];
                }
              }
              valueSets.push(values);
            }
            const throughOptions = _(Utils.cloneDeep(include)).omit(["association", "attributes"]).defaults({
              transaction: options2.transaction,
              logging: options2.logging
            }).value();
            throughOptions.model = include.association.throughModel;
            const throughInstances = include.association.throughModel.bulkBuild(valueSets, throughOptions);
            await recursiveBulkCreate(throughInstances, throughOptions);
          }
        }));
      }
      instances2.forEach((instance) => {
        for (const attr in model.rawAttributes) {
          if (model.rawAttributes[attr].field && instance.dataValues[model.rawAttributes[attr].field] !== void 0 && model.rawAttributes[attr].field !== attr) {
            instance.dataValues[attr] = instance.dataValues[model.rawAttributes[attr].field];
            delete instance.dataValues[model.rawAttributes[attr].field];
          }
          instance._previousDataValues[attr] = instance.dataValues[attr];
          instance.changed(attr, false);
        }
        instance.isNewRecord = false;
      });
      if (options2.hooks) {
        await model.runHooks("afterBulkCreate", instances2, options2);
      }
      return instances2;
    };
    return await recursiveBulkCreate(instances, options);
  }
  static async truncate(options) {
    options = Utils.cloneDeep(options) || {};
    options.truncate = true;
    return await this.destroy(options);
  }
  static async destroy(options) {
    options = Utils.cloneDeep(options);
    this._injectScope(options);
    if (!options || !(options.where || options.truncate)) {
      throw new Error("Missing where or truncate attribute in the options parameter of model.destroy.");
    }
    if (!options.truncate && !_.isPlainObject(options.where) && !Array.isArray(options.where) && !(options.where instanceof Utils.SequelizeMethod)) {
      throw new Error("Expected plain object, array or sequelize method in the options.where parameter of model.destroy.");
    }
    options = _.defaults(options, {
      hooks: true,
      individualHooks: false,
      force: false,
      cascade: false,
      restartIdentity: false
    });
    options.type = QueryTypes.BULKDELETE;
    Utils.mapOptionFieldNames(options, this);
    options.model = this;
    if (options.hooks) {
      await this.runHooks("beforeBulkDestroy", options);
    }
    let instances;
    if (options.individualHooks) {
      instances = await this.findAll({ where: options.where, transaction: options.transaction, logging: options.logging, benchmark: options.benchmark });
      await Promise.all(instances.map((instance) => this.runHooks("beforeDestroy", instance, options)));
    }
    let result;
    if (this._timestampAttributes.deletedAt && !options.force) {
      options.type = QueryTypes.BULKUPDATE;
      const attrValueHash = {};
      const deletedAtAttribute = this.rawAttributes[this._timestampAttributes.deletedAt];
      const field = this.rawAttributes[this._timestampAttributes.deletedAt].field;
      const where = {
        [field]: Object.prototype.hasOwnProperty.call(deletedAtAttribute, "defaultValue") ? deletedAtAttribute.defaultValue : null
      };
      attrValueHash[field] = Utils.now(this.sequelize.options.dialect);
      result = await this.queryInterface.bulkUpdate(this.getTableName(options), attrValueHash, Object.assign(where, options.where), options, this.rawAttributes);
    } else {
      result = await this.queryInterface.bulkDelete(this.getTableName(options), options.where, options, this);
    }
    if (options.individualHooks) {
      await Promise.all(instances.map((instance) => this.runHooks("afterDestroy", instance, options)));
    }
    if (options.hooks) {
      await this.runHooks("afterBulkDestroy", options);
    }
    return result;
  }
  static async restore(options) {
    if (!this._timestampAttributes.deletedAt)
      throw new Error("Model is not paranoid");
    options = __spreadValues({
      hooks: true,
      individualHooks: false
    }, options);
    options.type = QueryTypes.RAW;
    options.model = this;
    Utils.mapOptionFieldNames(options, this);
    if (options.hooks) {
      await this.runHooks("beforeBulkRestore", options);
    }
    let instances;
    if (options.individualHooks) {
      instances = await this.findAll({ where: options.where, transaction: options.transaction, logging: options.logging, benchmark: options.benchmark, paranoid: false });
      await Promise.all(instances.map((instance) => this.runHooks("beforeRestore", instance, options)));
    }
    const attrValueHash = {};
    const deletedAtCol = this._timestampAttributes.deletedAt;
    const deletedAtAttribute = this.rawAttributes[deletedAtCol];
    const deletedAtDefaultValue = Object.prototype.hasOwnProperty.call(deletedAtAttribute, "defaultValue") ? deletedAtAttribute.defaultValue : null;
    attrValueHash[deletedAtAttribute.field || deletedAtCol] = deletedAtDefaultValue;
    options.omitNull = false;
    const result = await this.queryInterface.bulkUpdate(this.getTableName(options), attrValueHash, options.where, options, this.rawAttributes);
    if (options.individualHooks) {
      await Promise.all(instances.map((instance) => this.runHooks("afterRestore", instance, options)));
    }
    if (options.hooks) {
      await this.runHooks("afterBulkRestore", options);
    }
    return result;
  }
  static async update(values, options) {
    options = Utils.cloneDeep(options);
    this._injectScope(options);
    this._optionsMustContainWhere(options);
    options = this._paranoidClause(this, _.defaults(options, {
      validate: true,
      hooks: true,
      individualHooks: false,
      returning: false,
      force: false,
      sideEffects: true
    }));
    options.type = QueryTypes.BULKUPDATE;
    values = _.omitBy(values, (value) => value === void 0);
    if (options.fields && options.fields instanceof Array) {
      for (const key of Object.keys(values)) {
        if (!options.fields.includes(key)) {
          delete values[key];
        }
      }
    } else {
      const updatedAtAttr = this._timestampAttributes.updatedAt;
      options.fields = _.intersection(Object.keys(values), Object.keys(this.tableAttributes));
      if (updatedAtAttr && !options.fields.includes(updatedAtAttr)) {
        options.fields.push(updatedAtAttr);
      }
    }
    if (this._timestampAttributes.updatedAt && !options.silent) {
      values[this._timestampAttributes.updatedAt] = this._getDefaultTimestamp(this._timestampAttributes.updatedAt) || Utils.now(this.sequelize.options.dialect);
    }
    options.model = this;
    let valuesUse;
    if (options.validate) {
      const build = this.build(values);
      build.set(this._timestampAttributes.updatedAt, values[this._timestampAttributes.updatedAt], { raw: true });
      if (options.sideEffects) {
        Object.assign(values, _.pick(build.get(), build.changed()));
        options.fields = _.union(options.fields, Object.keys(values));
      }
      options.skip = _.difference(Object.keys(this.rawAttributes), Object.keys(values));
      const attributes = await build.validate(options);
      options.skip = void 0;
      if (attributes && attributes.dataValues) {
        values = _.pick(attributes.dataValues, Object.keys(values));
      }
    }
    if (options.hooks) {
      options.attributes = values;
      await this.runHooks("beforeBulkUpdate", options);
      values = options.attributes;
      delete options.attributes;
    }
    valuesUse = values;
    let instances;
    let updateDoneRowByRow = false;
    if (options.individualHooks) {
      instances = await this.findAll({
        where: options.where,
        transaction: options.transaction,
        logging: options.logging,
        benchmark: options.benchmark,
        paranoid: options.paranoid
      });
      if (instances.length) {
        let changedValues;
        let different = false;
        instances = await Promise.all(instances.map(async (instance) => {
          Object.assign(instance.dataValues, values);
          _.forIn(valuesUse, (newValue, attr) => {
            if (newValue !== instance._previousDataValues[attr]) {
              instance.setDataValue(attr, newValue);
            }
          });
          await this.runHooks("beforeUpdate", instance, options);
          if (!different) {
            const thisChangedValues = {};
            _.forIn(instance.dataValues, (newValue, attr) => {
              if (newValue !== instance._previousDataValues[attr]) {
                thisChangedValues[attr] = newValue;
              }
            });
            if (!changedValues) {
              changedValues = thisChangedValues;
            } else {
              different = !_.isEqual(changedValues, thisChangedValues);
            }
          }
          return instance;
        }));
        if (!different) {
          const keys = Object.keys(changedValues);
          if (keys.length) {
            valuesUse = changedValues;
            options.fields = _.union(options.fields, keys);
          }
        } else {
          instances = await Promise.all(instances.map(async (instance) => {
            const individualOptions = __spreadProps(__spreadValues({}, options), {
              hooks: false,
              validate: false
            });
            delete individualOptions.individualHooks;
            return instance.save(individualOptions);
          }));
          updateDoneRowByRow = true;
        }
      }
    }
    let result;
    if (updateDoneRowByRow) {
      result = [instances.length, instances];
    } else if (_.isEmpty(valuesUse) || Object.keys(valuesUse).length === 1 && valuesUse[this._timestampAttributes.updatedAt]) {
      result = [0];
    } else {
      valuesUse = Utils.mapValueFieldNames(valuesUse, options.fields, this);
      options = Utils.mapOptionFieldNames(options, this);
      options.hasTrigger = this.options ? this.options.hasTrigger : false;
      const affectedRows = await this.queryInterface.bulkUpdate(this.getTableName(options), valuesUse, options.where, options, this.tableAttributes);
      if (options.returning) {
        result = [affectedRows.length, affectedRows];
        instances = affectedRows;
      } else {
        result = [affectedRows];
      }
    }
    if (options.individualHooks) {
      await Promise.all(instances.map((instance) => this.runHooks("afterUpdate", instance, options)));
      result[1] = instances;
    }
    if (options.hooks) {
      options.attributes = values;
      await this.runHooks("afterBulkUpdate", options);
      delete options.attributes;
    }
    return result;
  }
  static async describe(schema, options) {
    return await this.queryInterface.describeTable(this.tableName, __spreadValues({ schema: schema || this._schema || void 0 }, options));
  }
  static _getDefaultTimestamp(attr) {
    if (!!this.rawAttributes[attr] && !!this.rawAttributes[attr].defaultValue) {
      return Utils.toDefaultValue(this.rawAttributes[attr].defaultValue, this.sequelize.options.dialect);
    }
    return void 0;
  }
  static _expandAttributes(options) {
    if (!_.isPlainObject(options.attributes)) {
      return;
    }
    let attributes = Object.keys(this.rawAttributes);
    if (options.attributes.exclude) {
      attributes = attributes.filter((elem) => !options.attributes.exclude.includes(elem));
    }
    if (options.attributes.include) {
      attributes = attributes.concat(options.attributes.include);
    }
    options.attributes = attributes;
  }
  static _injectScope(options) {
    const scope = Utils.cloneDeep(this._scope);
    this._defaultsOptions(options, scope);
  }
  static [Symbol.for("nodejs.util.inspect.custom")]() {
    return this.name;
  }
  static hasAlias(alias) {
    return Object.prototype.hasOwnProperty.call(this.associations, alias);
  }
  static async increment(fields, options) {
    options = options || {};
    if (typeof fields === "string")
      fields = [fields];
    if (Array.isArray(fields)) {
      fields = fields.map((f) => {
        if (this.rawAttributes[f] && this.rawAttributes[f].field && this.rawAttributes[f].field !== f) {
          return this.rawAttributes[f].field;
        }
        return f;
      });
    } else if (fields && typeof fields === "object") {
      fields = Object.keys(fields).reduce((rawFields, f) => {
        if (this.rawAttributes[f] && this.rawAttributes[f].field && this.rawAttributes[f].field !== f) {
          rawFields[this.rawAttributes[f].field] = fields[f];
        } else {
          rawFields[f] = fields[f];
        }
        return rawFields;
      }, {});
    }
    this._injectScope(options);
    this._optionsMustContainWhere(options);
    options = Utils.defaults({}, options, {
      by: 1,
      where: {},
      increment: true
    });
    const isSubtraction = !options.increment;
    Utils.mapOptionFieldNames(options, this);
    const where = __spreadValues({}, options.where);
    let incrementAmountsByField = {};
    if (Array.isArray(fields)) {
      incrementAmountsByField = {};
      for (const field of fields) {
        incrementAmountsByField[field] = options.by;
      }
    } else {
      incrementAmountsByField = fields;
    }
    if (this._versionAttribute) {
      incrementAmountsByField[this._versionAttribute] = isSubtraction ? -1 : 1;
    }
    const extraAttributesToBeUpdated = {};
    const updatedAtAttr = this._timestampAttributes.updatedAt;
    if (!options.silent && updatedAtAttr && !incrementAmountsByField[updatedAtAttr]) {
      const attrName = this.rawAttributes[updatedAtAttr].field || updatedAtAttr;
      extraAttributesToBeUpdated[attrName] = this._getDefaultTimestamp(updatedAtAttr) || Utils.now(this.sequelize.options.dialect);
    }
    const tableName = this.getTableName(options);
    let affectedRows;
    if (isSubtraction) {
      affectedRows = await this.queryInterface.decrement(this, tableName, where, incrementAmountsByField, extraAttributesToBeUpdated, options);
    } else {
      affectedRows = await this.queryInterface.increment(this, tableName, where, incrementAmountsByField, extraAttributesToBeUpdated, options);
    }
    if (options.returning) {
      return [affectedRows, affectedRows.length];
    }
    return [affectedRows];
  }
  static async decrement(fields, options) {
    return this.increment(fields, __spreadProps(__spreadValues({
      by: 1
    }, options), {
      increment: false
    }));
  }
  static _optionsMustContainWhere(options) {
    assert(options && options.where, "Missing where attribute in the options parameter");
    assert(_.isPlainObject(options.where) || Array.isArray(options.where) || options.where instanceof Utils.SequelizeMethod, "Expected plain object, array or sequelize method in the options.where parameter");
  }
  where(checkVersion) {
    const where = this.constructor.primaryKeyAttributes.reduce((result, attribute) => {
      result[attribute] = this.get(attribute, { raw: true });
      return result;
    }, {});
    if (_.size(where) === 0) {
      return this.constructor.options.whereCollection;
    }
    const versionAttr = this.constructor._versionAttribute;
    if (checkVersion && versionAttr) {
      where[versionAttr] = this.get(versionAttr, { raw: true });
    }
    return Utils.mapWhereFieldNames(where, this.constructor);
  }
  toString() {
    return `[object SequelizeInstance:${this.constructor.name}]`;
  }
  getDataValue(key) {
    return this.dataValues[key];
  }
  setDataValue(key, value) {
    const originalValue = this._previousDataValues[key];
    if (!_.isEqual(value, originalValue)) {
      this.changed(key, true);
    }
    this.dataValues[key] = value;
  }
  get(key, options) {
    if (options === void 0 && typeof key === "object") {
      options = key;
      key = void 0;
    }
    options = options || {};
    if (key) {
      if (Object.prototype.hasOwnProperty.call(this._customGetters, key) && !options.raw) {
        return this._customGetters[key].call(this, key, options);
      }
      if (options.plain && this._options.include && this._options.includeNames.includes(key)) {
        if (Array.isArray(this.dataValues[key])) {
          return this.dataValues[key].map((instance) => instance.get(options));
        }
        if (this.dataValues[key] instanceof Model) {
          return this.dataValues[key].get(options);
        }
        return this.dataValues[key];
      }
      return this.dataValues[key];
    }
    if (this._hasCustomGetters || options.plain && this._options.include || options.clone) {
      const values = {};
      let _key;
      if (this._hasCustomGetters) {
        for (_key in this._customGetters) {
          if (this._options.attributes && !this._options.attributes.includes(_key)) {
            continue;
          }
          if (Object.prototype.hasOwnProperty.call(this._customGetters, _key)) {
            values[_key] = this.get(_key, options);
          }
        }
      }
      for (_key in this.dataValues) {
        if (!Object.prototype.hasOwnProperty.call(values, _key) && Object.prototype.hasOwnProperty.call(this.dataValues, _key)) {
          values[_key] = this.get(_key, options);
        }
      }
      return values;
    }
    return this.dataValues;
  }
  set(key, value, options) {
    let values;
    let originalValue;
    if (typeof key === "object" && key !== null) {
      values = key;
      options = value || {};
      if (options.reset) {
        this.dataValues = {};
        for (const key2 in values) {
          this.changed(key2, false);
        }
      }
      if (options.raw && !(this._options && this._options.include) && !(options && options.attributes) && !this.constructor._hasDateAttributes && !this.constructor._hasBooleanAttributes) {
        if (Object.keys(this.dataValues).length) {
          Object.assign(this.dataValues, values);
        } else {
          this.dataValues = values;
        }
        this._previousDataValues = __spreadValues({}, this.dataValues);
      } else {
        if (options.attributes) {
          const setKeys = (data) => {
            for (const k of data) {
              if (values[k] === void 0) {
                continue;
              }
              this.set(k, values[k], options);
            }
          };
          setKeys(options.attributes);
          if (this.constructor._hasVirtualAttributes) {
            setKeys(this.constructor._virtualAttributes);
          }
          if (this._options.includeNames) {
            setKeys(this._options.includeNames);
          }
        } else {
          for (const key2 in values) {
            this.set(key2, values[key2], options);
          }
        }
        if (options.raw) {
          this._previousDataValues = __spreadValues({}, this.dataValues);
        }
      }
      return this;
    }
    if (!options)
      options = {};
    if (!options.raw) {
      originalValue = this.dataValues[key];
    }
    if (!options.raw && this._customSetters[key]) {
      this._customSetters[key].call(this, value, key);
      const newValue = this.dataValues[key];
      if (!_.isEqual(newValue, originalValue)) {
        this._previousDataValues[key] = originalValue;
        this.changed(key, true);
      }
    } else {
      if (this._options && this._options.include && this._options.includeNames.includes(key)) {
        this._setInclude(key, value, options);
        return this;
      }
      if (!options.raw) {
        if (!this._isAttribute(key)) {
          if (key.includes(".") && this.constructor._jsonAttributes.has(key.split(".")[0])) {
            const previousNestedValue = Dottie.get(this.dataValues, key);
            if (!_.isEqual(previousNestedValue, value)) {
              Dottie.set(this.dataValues, key, value);
              this.changed(key.split(".")[0], true);
            }
          }
          return this;
        }
        if (this.constructor._hasPrimaryKeys && originalValue && this.constructor._isPrimaryKey(key)) {
          return this;
        }
        if (!this.isNewRecord && this.constructor._hasReadOnlyAttributes && this.constructor._readOnlyAttributes.has(key)) {
          return this;
        }
      }
      if (!(value instanceof Utils.SequelizeMethod) && Object.prototype.hasOwnProperty.call(this.constructor._dataTypeSanitizers, key)) {
        value = this.constructor._dataTypeSanitizers[key].call(this, value, options);
      }
      if (!options.raw && (value instanceof Utils.SequelizeMethod || !(value instanceof Utils.SequelizeMethod) && this.constructor._dataTypeChanges[key] && this.constructor._dataTypeChanges[key].call(this, value, originalValue, options) || !this.constructor._dataTypeChanges[key] && !_.isEqual(value, originalValue))) {
        this._previousDataValues[key] = originalValue;
        this.changed(key, true);
      }
      this.dataValues[key] = value;
    }
    return this;
  }
  setAttributes(updates) {
    return this.set(updates);
  }
  changed(key, value) {
    if (key === void 0) {
      if (this._changed.size > 0) {
        return Array.from(this._changed);
      }
      return false;
    }
    if (value === true) {
      this._changed.add(key);
      return this;
    }
    if (value === false) {
      this._changed.delete(key);
      return this;
    }
    return this._changed.has(key);
  }
  previous(key) {
    if (key) {
      return this._previousDataValues[key];
    }
    return _.pickBy(this._previousDataValues, (value, key2) => this.changed(key2));
  }
  _setInclude(key, value, options) {
    if (!Array.isArray(value))
      value = [value];
    if (value[0] instanceof Model) {
      value = value.map((instance) => instance.dataValues);
    }
    const include = this._options.includeMap[key];
    const association = include.association;
    const accessor = key;
    const primaryKeyAttribute = include.model.primaryKeyAttribute;
    const childOptions = {
      isNewRecord: this.isNewRecord,
      include: include.include,
      includeNames: include.includeNames,
      includeMap: include.includeMap,
      includeValidated: true,
      raw: options.raw,
      attributes: include.originalAttributes
    };
    let isEmpty;
    if (include.originalAttributes === void 0 || include.originalAttributes.length) {
      if (association.isSingleAssociation) {
        if (Array.isArray(value)) {
          value = value[0];
        }
        isEmpty = value && value[primaryKeyAttribute] === null || value === null;
        this[accessor] = this.dataValues[accessor] = isEmpty ? null : include.model.build(value, childOptions);
      } else {
        isEmpty = value[0] && value[0][primaryKeyAttribute] === null;
        this[accessor] = this.dataValues[accessor] = isEmpty ? [] : include.model.bulkBuild(value, childOptions);
      }
    }
  }
  async save(options) {
    if (arguments.length > 1) {
      throw new Error("The second argument was removed in favor of the options object.");
    }
    options = Utils.cloneDeep(options);
    options = _.defaults(options, {
      hooks: true,
      validate: true
    });
    if (!options.fields) {
      if (this.isNewRecord) {
        options.fields = Object.keys(this.constructor.rawAttributes);
      } else {
        options.fields = _.intersection(this.changed(), Object.keys(this.constructor.rawAttributes));
      }
      options.defaultFields = options.fields;
    }
    if (options.returning === void 0) {
      if (options.association) {
        options.returning = false;
      } else if (this.isNewRecord) {
        options.returning = true;
      }
    }
    const primaryKeyName = this.constructor.primaryKeyAttribute;
    const primaryKeyAttribute = primaryKeyName && this.constructor.rawAttributes[primaryKeyName];
    const createdAtAttr = this.constructor._timestampAttributes.createdAt;
    const versionAttr = this.constructor._versionAttribute;
    const hook = this.isNewRecord ? "Create" : "Update";
    const wasNewRecord = this.isNewRecord;
    const now = Utils.now(this.sequelize.options.dialect);
    let updatedAtAttr = this.constructor._timestampAttributes.updatedAt;
    if (updatedAtAttr && options.fields.length > 0 && !options.fields.includes(updatedAtAttr)) {
      options.fields.push(updatedAtAttr);
    }
    if (versionAttr && options.fields.length > 0 && !options.fields.includes(versionAttr)) {
      options.fields.push(versionAttr);
    }
    if (options.silent === true && !(this.isNewRecord && this.get(updatedAtAttr, { raw: true }))) {
      _.remove(options.fields, (val) => val === updatedAtAttr);
      updatedAtAttr = false;
    }
    if (this.isNewRecord === true) {
      if (createdAtAttr && !options.fields.includes(createdAtAttr)) {
        options.fields.push(createdAtAttr);
      }
      if (primaryKeyAttribute && primaryKeyAttribute.defaultValue && !options.fields.includes(primaryKeyName)) {
        options.fields.unshift(primaryKeyName);
      }
    }
    if (this.isNewRecord === false) {
      if (primaryKeyName && this.get(primaryKeyName, { raw: true }) === void 0) {
        throw new Error("You attempted to save an instance with no primary key, this is not allowed since it would result in a global update");
      }
    }
    if (updatedAtAttr && !options.silent && options.fields.includes(updatedAtAttr)) {
      this.dataValues[updatedAtAttr] = this.constructor._getDefaultTimestamp(updatedAtAttr) || now;
    }
    if (this.isNewRecord && createdAtAttr && !this.dataValues[createdAtAttr]) {
      this.dataValues[createdAtAttr] = this.constructor._getDefaultTimestamp(createdAtAttr) || now;
    }
    if (this.sequelize.options.dialect === "db2" && this.isNewRecord) {
      this.uniqno = this.sequelize.dialect.queryGenerator.addUniqueFields(this.dataValues, this.constructor.rawAttributes, this.uniqno);
    }
    if (options.validate) {
      await this.validate(options);
    }
    if (options.hooks) {
      const beforeHookValues = _.pick(this.dataValues, options.fields);
      let ignoreChanged = _.difference(this.changed(), options.fields);
      let hookChanged;
      let afterHookValues;
      if (updatedAtAttr && options.fields.includes(updatedAtAttr)) {
        ignoreChanged = _.without(ignoreChanged, updatedAtAttr);
      }
      await this.constructor.runHooks(`before${hook}`, this, options);
      if (options.defaultFields && !this.isNewRecord) {
        afterHookValues = _.pick(this.dataValues, _.difference(this.changed(), ignoreChanged));
        hookChanged = [];
        for (const key of Object.keys(afterHookValues)) {
          if (afterHookValues[key] !== beforeHookValues[key]) {
            hookChanged.push(key);
          }
        }
        options.fields = _.uniq(options.fields.concat(hookChanged));
      }
      if (hookChanged) {
        if (options.validate) {
          options.skip = _.difference(Object.keys(this.constructor.rawAttributes), hookChanged);
          await this.validate(options);
          delete options.skip;
        }
      }
    }
    if (options.fields.length && this.isNewRecord && this._options.include && this._options.include.length) {
      await Promise.all(this._options.include.filter((include) => include.association instanceof BelongsTo).map(async (include) => {
        const instance = this.get(include.as);
        if (!instance)
          return;
        const includeOptions = _(Utils.cloneDeep(include)).omit(["association"]).defaults({
          transaction: options.transaction,
          logging: options.logging,
          parentRecord: this
        }).value();
        await instance.save(includeOptions);
        await this[include.association.accessors.set](instance, { save: false, logging: options.logging });
      }));
    }
    const realFields = options.fields.filter((field) => !this.constructor._virtualAttributes.has(field));
    if (!realFields.length)
      return this;
    if (!this.changed() && !this.isNewRecord)
      return this;
    const versionFieldName = _.get(this.constructor.rawAttributes[versionAttr], "field") || versionAttr;
    const values = Utils.mapValueFieldNames(this.dataValues, options.fields, this.constructor);
    let query = null;
    let args = [];
    let where;
    if (this.isNewRecord) {
      query = "insert";
      args = [this, this.constructor.getTableName(options), values, options];
    } else {
      where = this.where(true);
      if (versionAttr) {
        values[versionFieldName] = parseInt(values[versionFieldName], 10) + 1;
      }
      query = "update";
      args = [this, this.constructor.getTableName(options), values, where, options];
    }
    const [result, rowsUpdated] = await this.constructor.queryInterface[query](...args);
    if (versionAttr) {
      if (rowsUpdated < 1) {
        throw new sequelizeErrors.OptimisticLockError({
          modelName: this.constructor.name,
          values,
          where
        });
      } else {
        result.dataValues[versionAttr] = values[versionFieldName];
      }
    }
    for (const attr of Object.keys(this.constructor.rawAttributes)) {
      if (this.constructor.rawAttributes[attr].field && values[this.constructor.rawAttributes[attr].field] !== void 0 && this.constructor.rawAttributes[attr].field !== attr) {
        values[attr] = values[this.constructor.rawAttributes[attr].field];
        delete values[this.constructor.rawAttributes[attr].field];
      }
    }
    Object.assign(values, result.dataValues);
    Object.assign(result.dataValues, values);
    if (wasNewRecord && this._options.include && this._options.include.length) {
      await Promise.all(this._options.include.filter((include) => !(include.association instanceof BelongsTo || include.parent && include.parent.association instanceof BelongsToMany)).map(async (include) => {
        let instances = this.get(include.as);
        if (!instances)
          return;
        if (!Array.isArray(instances))
          instances = [instances];
        const includeOptions = _(Utils.cloneDeep(include)).omit(["association"]).defaults({
          transaction: options.transaction,
          logging: options.logging,
          parentRecord: this
        }).value();
        await Promise.all(instances.map(async (instance) => {
          if (include.association instanceof BelongsToMany) {
            await instance.save(includeOptions);
            const values0 = __spreadValues({
              [include.association.foreignKey]: this.get(this.constructor.primaryKeyAttribute, { raw: true }),
              [include.association.otherKey]: instance.get(instance.constructor.primaryKeyAttribute, { raw: true })
            }, include.association.through.scope);
            if (instance[include.association.through.model.name]) {
              for (const attr of Object.keys(include.association.through.model.rawAttributes)) {
                if (include.association.through.model.rawAttributes[attr]._autoGenerated || attr === include.association.foreignKey || attr === include.association.otherKey || typeof instance[include.association.through.model.name][attr] === void 0) {
                  continue;
                }
                values0[attr] = instance[include.association.through.model.name][attr];
              }
            }
            await include.association.throughModel.create(values0, includeOptions);
          } else {
            instance.set(include.association.foreignKey, this.get(include.association.sourceKey || this.constructor.primaryKeyAttribute, { raw: true }), { raw: true });
            Object.assign(instance, include.association.scope);
            await instance.save(includeOptions);
          }
        }));
      }));
    }
    if (options.hooks) {
      await this.constructor.runHooks(`after${hook}`, result, options);
    }
    for (const field of options.fields) {
      result._previousDataValues[field] = result.dataValues[field];
      this.changed(field, false);
    }
    this.isNewRecord = false;
    return result;
  }
  async reload(options) {
    options = Utils.defaults({
      where: this.where()
    }, options, {
      include: this._options.include || void 0
    });
    const reloaded = await this.constructor.findOne(options);
    if (!reloaded) {
      throw new sequelizeErrors.InstanceError("Instance could not be reloaded because it does not exist anymore (find call returned null)");
    }
    this._options = reloaded._options;
    this.set(reloaded.dataValues, {
      raw: true,
      reset: !options.attributes
    });
    return this;
  }
  async validate(options) {
    return new InstanceValidator(this, options).validate();
  }
  async update(values, options) {
    values = _.omitBy(values, (value) => value === void 0);
    const changedBefore = this.changed() || [];
    options = options || {};
    if (Array.isArray(options))
      options = { fields: options };
    options = Utils.cloneDeep(options);
    const setOptions = Utils.cloneDeep(options);
    setOptions.attributes = options.fields;
    this.set(values, setOptions);
    const sideEffects = _.without(this.changed(), ...changedBefore);
    const fields = _.union(Object.keys(values), sideEffects);
    if (!options.fields) {
      options.fields = _.intersection(fields, this.changed());
      options.defaultFields = options.fields;
    }
    return await this.save(options);
  }
  async destroy(options) {
    options = __spreadValues({
      hooks: true,
      force: false
    }, options);
    if (options.hooks) {
      await this.constructor.runHooks("beforeDestroy", this, options);
    }
    const where = this.where(true);
    let result;
    if (this.constructor._timestampAttributes.deletedAt && options.force === false) {
      const attributeName = this.constructor._timestampAttributes.deletedAt;
      const attribute = this.constructor.rawAttributes[attributeName];
      const defaultValue = Object.prototype.hasOwnProperty.call(attribute, "defaultValue") ? attribute.defaultValue : null;
      const currentValue = this.getDataValue(attributeName);
      const undefinedOrNull = currentValue == null && defaultValue == null;
      if (undefinedOrNull || _.isEqual(currentValue, defaultValue)) {
        this.setDataValue(attributeName, new Date());
      }
      result = await this.save(__spreadProps(__spreadValues({}, options), { hooks: false }));
    } else {
      result = await this.constructor.queryInterface.delete(this, this.constructor.getTableName(options), where, __spreadValues({ type: QueryTypes.DELETE, limit: null }, options));
    }
    if (options.hooks) {
      await this.constructor.runHooks("afterDestroy", this, options);
    }
    return result;
  }
  isSoftDeleted() {
    if (!this.constructor._timestampAttributes.deletedAt) {
      throw new Error("Model is not paranoid");
    }
    const deletedAtAttribute = this.constructor.rawAttributes[this.constructor._timestampAttributes.deletedAt];
    const defaultValue = Object.prototype.hasOwnProperty.call(deletedAtAttribute, "defaultValue") ? deletedAtAttribute.defaultValue : null;
    const deletedAt = this.get(this.constructor._timestampAttributes.deletedAt) || null;
    const isSet = deletedAt !== defaultValue;
    return isSet;
  }
  async restore(options) {
    if (!this.constructor._timestampAttributes.deletedAt)
      throw new Error("Model is not paranoid");
    options = __spreadValues({
      hooks: true,
      force: false
    }, options);
    if (options.hooks) {
      await this.constructor.runHooks("beforeRestore", this, options);
    }
    const deletedAtCol = this.constructor._timestampAttributes.deletedAt;
    const deletedAtAttribute = this.constructor.rawAttributes[deletedAtCol];
    const deletedAtDefaultValue = Object.prototype.hasOwnProperty.call(deletedAtAttribute, "defaultValue") ? deletedAtAttribute.defaultValue : null;
    this.setDataValue(deletedAtCol, deletedAtDefaultValue);
    const result = await this.save(__spreadProps(__spreadValues({}, options), { hooks: false, omitNull: false }));
    if (options.hooks) {
      await this.constructor.runHooks("afterRestore", this, options);
      return result;
    }
    return result;
  }
  async increment(fields, options) {
    const identifier = this.where();
    options = Utils.cloneDeep(options);
    options.where = __spreadValues(__spreadValues({}, options.where), identifier);
    options.instance = this;
    await this.constructor.increment(fields, options);
    return this;
  }
  async decrement(fields, options) {
    return this.increment(fields, __spreadProps(__spreadValues({
      by: 1
    }, options), {
      increment: false
    }));
  }
  equals(other) {
    if (!other || !other.constructor) {
      return false;
    }
    if (!(other instanceof this.constructor)) {
      return false;
    }
    return this.constructor.primaryKeyAttributes.every((attribute) => this.get(attribute, { raw: true }) === other.get(attribute, { raw: true }));
  }
  equalsOneOf(others) {
    return others.some((other) => this.equals(other));
  }
  setValidators(attribute, validators) {
    this.validators[attribute] = validators;
  }
  toJSON() {
    return _.cloneDeep(this.get({
      plain: true
    }));
  }
  static hasMany(target, options) {
  }
  static belongsToMany(target, options) {
  }
  static hasOne(target, options) {
  }
  static belongsTo(target, options) {
  }
}
function unpackAnd(where) {
  if (!_.isObject(where)) {
    return where;
  }
  const keys = Utils.getComplexKeys(where);
  if (keys.length === 0) {
    return;
  }
  if (keys.length !== 1 || keys[0] !== Op.and) {
    return where;
  }
  const andParts = where[Op.and];
  return andParts;
}
function combineWheresWithAnd(whereA, whereB) {
  const unpackedA = unpackAnd(whereA);
  if (unpackedA === void 0) {
    return whereB;
  }
  const unpackedB = unpackAnd(whereB);
  if (unpackedB === void 0) {
    return whereA;
  }
  return {
    [Op.and]: _.flatten([unpackedA, unpackedB])
  };
}
Object.assign(Model, associationsMixin);
Hooks.applyTo(Model, true);
module.exports = Model;
//# sourceMappingURL=model.js.map
var __defProp = Object.defineProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
__export(exports, {
  Op: () => Op,
  default: () => operators_default
});
const Op = {
  eq: Symbol.for("eq"),
  ne: Symbol.for("ne"),
  gte: Symbol.for("gte"),
  gt: Symbol.for("gt"),
  lte: Symbol.for("lte"),
  lt: Symbol.for("lt"),
  not: Symbol.for("not"),
  is: Symbol.for("is"),
  in: Symbol.for("in"),
  notIn: Symbol.for("notIn"),
  like: Symbol.for("like"),
  notLike: Symbol.for("notLike"),
  iLike: Symbol.for("iLike"),
  notILike: Symbol.for("notILike"),
  startsWith: Symbol.for("startsWith"),
  endsWith: Symbol.for("endsWith"),
  substring: Symbol.for("substring"),
  regexp: Symbol.for("regexp"),
  notRegexp: Symbol.for("notRegexp"),
  iRegexp: Symbol.for("iRegexp"),
  notIRegexp: Symbol.for("notIRegexp"),
  between: Symbol.for("between"),
  notBetween: Symbol.for("notBetween"),
  overlap: Symbol.for("overlap"),
  contains: Symbol.for("contains"),
  contained: Symbol.for("contained"),
  adjacent: Symbol.for("adjacent"),
  strictLeft: Symbol.for("strictLeft"),
  strictRight: Symbol.for("strictRight"),
  noExtendRight: Symbol.for("noExtendRight"),
  noExtendLeft: Symbol.for("noExtendLeft"),
  and: Symbol.for("and"),
  or: Symbol.for("or"),
  any: Symbol.for("any"),
  all: Symbol.for("all"),
  values: Symbol.for("values"),
  col: Symbol.for("col"),
  placeholder: Symbol.for("placeholder"),
  join: Symbol.for("join"),
  match: Symbol.for("match")
};
var operators_default = Op;
module.exports = Op;
//# sourceMappingURL=operators.js.map
"use strict";
const QueryTypes = module.exports = {
  SELECT: "SELECT",
  INSERT: "INSERT",
  UPDATE: "UPDATE",
  BULKUPDATE: "BULKUPDATE",
  BULKDELETE: "BULKDELETE",
  DELETE: "DELETE",
  UPSERT: "UPSERT",
  VERSION: "VERSION",
  SHOWTABLES: "SHOWTABLES",
  SHOWINDEXES: "SHOWINDEXES",
  DESCRIBE: "DESCRIBE",
  RAW: "RAW",
  FOREIGNKEYS: "FOREIGNKEYS",
  SHOWCONSTRAINTS: "SHOWCONSTRAINTS"
};
//# sourceMappingURL=query-types.js.map
"use strict";
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
const url = require("url");
const path = require("path");
const pgConnectionString = require("pg-connection-string");
const retry = require("retry-as-promised");
const _ = require("lodash");
const Utils = require("./utils");
const Model = require("./model");
const DataTypes = require("./data-types");
const Deferrable = require("./deferrable");
const ModelManager = require("./model-manager");
const Transaction = require("./transaction");
const QueryTypes = require("./query-types");
const TableHints = require("./table-hints");
const IndexHints = require("./index-hints");
const sequelizeErrors = require("./errors");
const Hooks = require("./hooks");
const Association = require("./associations/index");
const Validator = require("./utils/validator-extras").validator;
const Op = require("./operators");
const deprecations = require("./utils/deprecations");
const { QueryInterface } = require("./dialects/abstract/query-interface");
const { BelongsTo } = require("./associations/belongs-to");
const HasOne = require("./associations/has-one");
const { BelongsToMany } = require("./associations/belongs-to-many");
const { HasMany } = require("./associations/has-many");
const { withSqliteForeignKeysOff } = require("./dialects/sqlite/sqlite-utils");
const { injectReplacements } = require("./utils/sql");
class Sequelize {
  constructor(database, username, password, options) {
    let config;
    if (arguments.length === 1 && typeof database === "object") {
      options = database;
      config = _.pick(options, "host", "port", "database", "username", "password");
    } else if (arguments.length === 1 && typeof database === "string" || arguments.length === 2 && typeof username === "object") {
      config = {};
      options = username || {};
      const urlParts = url.parse(arguments[0], true);
      options.dialect = urlParts.protocol.replace(/:$/, "");
      options.host = urlParts.hostname;
      if (options.dialect === "sqlite" && urlParts.pathname && !urlParts.pathname.startsWith("/:memory")) {
        const storagePath = path.join(options.host, urlParts.pathname);
        options.storage = path.resolve(options.storage || storagePath);
      }
      if (urlParts.pathname) {
        config.database = urlParts.pathname.replace(/^\//, "");
      }
      if (urlParts.port) {
        options.port = urlParts.port;
      }
      if (urlParts.auth) {
        const authParts = urlParts.auth.split(":");
        config.username = authParts[0];
        if (authParts.length > 1)
          config.password = authParts.slice(1).join(":");
      }
      if (urlParts.query) {
        if (urlParts.query.host) {
          options.host = urlParts.query.host;
        }
        if (options.dialectOptions) {
          Object.assign(options.dialectOptions, urlParts.query);
        } else {
          options.dialectOptions = urlParts.query;
          if (urlParts.query.options) {
            try {
              const o = JSON.parse(urlParts.query.options);
              options.dialectOptions.options = o;
            } catch (e) {
            }
          }
        }
      }
      if (["postgres", "postgresql"].includes(options.dialect)) {
        Object.assign(options.dialectOptions, pgConnectionString.parse(arguments[0]));
      }
    } else {
      options = options || {};
      config = { database, username, password };
    }
    Sequelize.runHooks("beforeInit", config, options);
    this.options = __spreadValues({
      dialect: null,
      dialectModule: null,
      dialectModulePath: null,
      host: "localhost",
      protocol: "tcp",
      define: {},
      query: {},
      sync: {},
      timezone: "+00:00",
      standardConformingStrings: true,
      logging: console.log,
      omitNull: false,
      native: false,
      replication: false,
      ssl: void 0,
      pool: {},
      quoteIdentifiers: true,
      hooks: {},
      retry: {
        max: 5,
        match: [
          "SQLITE_BUSY: database is locked"
        ]
      },
      transactionType: Transaction.TYPES.DEFERRED,
      isolationLevel: null,
      databaseVersion: 0,
      typeValidation: false,
      benchmark: false,
      minifyAliases: false,
      logQueryParameters: false
    }, options);
    if (!this.options.dialect) {
      throw new Error("Dialect needs to be explicitly supplied as of v4.0.0");
    }
    if (this.options.dialect === "postgresql") {
      this.options.dialect = "postgres";
    }
    if (this.options.dialect === "sqlite" && this.options.timezone !== "+00:00") {
      throw new Error("Setting a custom timezone is not supported by SQLite, dates are always returned as UTC. Please remove the custom timezone parameter.");
    }
    if (this.options.logging === true) {
      deprecations.noTrueLogging();
      this.options.logging = console.log;
    }
    this._setupHooks(options.hooks);
    this.config = {
      database: config.database || this.options.database,
      username: config.username || this.options.username,
      password: config.password || this.options.password || null,
      host: config.host || this.options.host,
      port: config.port || this.options.port,
      pool: this.options.pool,
      protocol: this.options.protocol,
      native: this.options.native,
      ssl: this.options.ssl,
      replication: this.options.replication,
      dialectModule: this.options.dialectModule,
      dialectModulePath: this.options.dialectModulePath,
      keepDefaultTimezone: this.options.keepDefaultTimezone,
      dialectOptions: this.options.dialectOptions
    };
    let Dialect;
    switch (this.getDialect()) {
      case "mariadb":
        Dialect = require("./dialects/mariadb");
        break;
      case "mssql":
        Dialect = require("./dialects/mssql");
        break;
      case "mysql":
        Dialect = require("./dialects/mysql");
        break;
      case "postgres":
        Dialect = require("./dialects/postgres");
        break;
      case "sqlite":
        Dialect = require("./dialects/sqlite");
        break;
      case "db2":
        Dialect = require("./dialects/db2");
        break;
      case "snowflake":
        Dialect = require("./dialects/snowflake");
        break;
      default:
        throw new Error(`The dialect ${this.getDialect()} is not supported. Supported dialects: mssql, mariadb, mysql, postgres, db2 and sqlite.`);
    }
    this.dialect = new Dialect(this);
    this.dialect.queryGenerator.typeValidation = options.typeValidation;
    if (_.isPlainObject(this.options.operatorsAliases)) {
      deprecations.noStringOperators();
      this.dialect.queryGenerator.setOperatorsAliases(this.options.operatorsAliases);
    } else if (typeof this.options.operatorsAliases === "boolean") {
      deprecations.noBoolOperatorAliases();
    }
    this.queryInterface = this.dialect.queryInterface;
    this.models = {};
    this.modelManager = new ModelManager(this);
    this.connectionManager = this.dialect.connectionManager;
    Sequelize.runHooks("afterInit", this);
  }
  refreshTypes() {
    this.connectionManager.refreshTypeParser(DataTypes);
  }
  getDialect() {
    return this.options.dialect;
  }
  getDatabaseName() {
    return this.config.database;
  }
  getQueryInterface() {
    return this.queryInterface;
  }
  define(modelName, attributes, options = {}) {
    options.modelName = modelName;
    options.sequelize = this;
    const model = class extends Model {
    };
    model.init(attributes, options);
    return model;
  }
  model(modelName) {
    if (!this.isDefined(modelName)) {
      throw new Error(`${modelName} has not been defined`);
    }
    return this.modelManager.getModel(modelName);
  }
  isDefined(modelName) {
    return !!this.modelManager.models.find((model) => model.name === modelName);
  }
  async query(sql, options) {
    options = __spreadValues(__spreadValues({}, this.options.query), options);
    if (options.instance && !options.model) {
      options.model = options.instance.constructor;
    }
    if (!options.instance && !options.model) {
      options.raw = true;
    }
    if (options.mapToModel) {
      options.fieldMap = _.get(options, "model.fieldAttributeMap", {});
    }
    options = _.defaults(options, {
      logging: Object.prototype.hasOwnProperty.call(this.options, "logging") ? this.options.logging : console.log,
      searchPath: Object.prototype.hasOwnProperty.call(this.options, "searchPath") ? this.options.searchPath : "DEFAULT"
    });
    if (!options.type) {
      if (options.model || options.nest || options.plain) {
        options.type = QueryTypes.SELECT;
      } else {
        options.type = QueryTypes.RAW;
      }
    }
    if (!this.dialect.supports.searchPath || !this.options.dialectOptions || !this.options.dialectOptions.prependSearchPath || options.supportsSearchPath === false) {
      delete options.searchPath;
    } else if (!options.searchPath) {
      options.searchPath = "DEFAULT";
    }
    if (typeof sql === "object") {
      if (sql.values !== void 0) {
        if (options.replacements !== void 0) {
          throw new Error("Both `sql.values` and `options.replacements` cannot be set at the same time");
        }
        options.replacements = sql.values;
      }
      if (sql.bind !== void 0) {
        if (options.bind !== void 0) {
          throw new Error("Both `sql.bind` and `options.bind` cannot be set at the same time");
        }
        options.bind = sql.bind;
      }
      if (sql.query !== void 0) {
        sql = sql.query;
      }
    }
    sql = sql.trim();
    if (options.replacements && options.bind) {
      throw new Error("Both `replacements` and `bind` cannot be set at the same time");
    }
    if (options.replacements) {
      sql = injectReplacements(sql, this.dialect, options.replacements);
    }
    let bindParameters;
    if (options.bind) {
      [sql, bindParameters] = this.dialect.Query.formatBindParameters(sql, options.bind, this.options.dialect);
    }
    const checkTransaction = () => {
      if (options.transaction && options.transaction.finished && !options.completesTransaction) {
        const error = new Error(`${options.transaction.finished} has been called on this transaction(${options.transaction.id}), you can no longer use it. (The rejected query is attached as the 'sql' property of this error)`);
        error.sql = sql;
        throw error;
      }
    };
    const retryOptions = __spreadValues(__spreadValues({}, this.options.retry), options.retry);
    return retry(async () => {
      if (options.transaction === void 0 && Sequelize._cls) {
        options.transaction = Sequelize._cls.get("transaction");
      }
      checkTransaction();
      const connection = await (options.transaction ? options.transaction.connection : this.connectionManager.getConnection(options));
      if (this.options.dialect === "db2" && options.alter) {
        if (options.alter.drop === false) {
          connection.dropTable = false;
        }
      }
      const query = new this.dialect.Query(connection, this, options);
      try {
        await this.runHooks("beforeQuery", options, query);
        checkTransaction();
        return await query.run(sql, bindParameters);
      } finally {
        await this.runHooks("afterQuery", options, query);
        if (!options.transaction) {
          this.connectionManager.releaseConnection(connection);
        }
      }
    }, retryOptions);
  }
  async set(variables, options) {
    options = __spreadValues(__spreadValues({}, this.options.set), typeof options === "object" && options);
    if (!["mysql", "mariadb"].includes(this.options.dialect)) {
      throw new Error("sequelize.set is only supported for mysql or mariadb");
    }
    if (!options.transaction || !(options.transaction instanceof Transaction)) {
      throw new TypeError("options.transaction is required");
    }
    options.raw = true;
    options.plain = true;
    options.type = "SET";
    const query = `SET ${_.map(variables, (v, k) => `@${k} := ${typeof v === "string" ? `"${v}"` : v}`).join(", ")}`;
    return await this.query(query, options);
  }
  escape(value) {
    return this.dialect.queryGenerator.escape(value);
  }
  async createSchema(schema, options) {
    return await this.getQueryInterface().createSchema(schema, options);
  }
  async showAllSchemas(options) {
    return await this.getQueryInterface().showAllSchemas(options);
  }
  async dropSchema(schema, options) {
    return await this.getQueryInterface().dropSchema(schema, options);
  }
  async dropAllSchemas(options) {
    return await this.getQueryInterface().dropAllSchemas(options);
  }
  async sync(options) {
    options = __spreadProps(__spreadValues(__spreadValues(__spreadValues({}, this.options), this.options.sync), options), {
      hooks: options ? options.hooks !== false : true
    });
    if (options.match) {
      if (!options.match.test(this.config.database)) {
        throw new Error(`Database "${this.config.database}" does not match sync match parameter "${options.match}"`);
      }
    }
    if (options.hooks) {
      await this.runHooks("beforeBulkSync", options);
    }
    if (options.force) {
      await this.drop(options);
    }
    if (this.modelManager.models.length === 0) {
      await this.authenticate(options);
    } else {
      const models = this.modelManager.getModelsTopoSortedByForeignKey();
      if (models == null) {
        return this._syncModelsWithCyclicReferences(options);
      }
      models.reverse();
      for (const model of models) {
        await model.sync(options);
      }
    }
    if (options.hooks) {
      await this.runHooks("afterBulkSync", options);
    }
    return this;
  }
  async _syncModelsWithCyclicReferences(options) {
    if (this.dialect.name === "sqlite") {
      await withSqliteForeignKeysOff(this, options, async () => {
        for (const model of this.modelManager.models) {
          await model.sync(options);
        }
      });
      return;
    }
    for (const model of this.modelManager.models) {
      await model.sync(__spreadProps(__spreadValues({}, options), { withoutForeignKeyConstraints: true }));
    }
    for (const model of this.modelManager.models) {
      await model.sync(__spreadProps(__spreadValues({}, options), { force: false, alter: true }));
    }
  }
  async truncate(options) {
    const sortedModels = this.modelManager.getModelsTopoSortedByForeignKey();
    const models = sortedModels || this.modelManager.models;
    const hasCyclicDependencies = sortedModels == null;
    if (hasCyclicDependencies && (!options || !options.cascade)) {
      throw new Error('Sequelize#truncate: Some of your models have cyclic references (foreign keys). You need to use the "cascade" option to be able to delete rows from models that have cyclic references.');
    }
    if (hasCyclicDependencies && this.dialect.name === "sqlite") {
      return withSqliteForeignKeysOff(this, options, async () => {
        await Promise.all(models.map((model) => model.truncate(options)));
      });
    }
    if (options && options.cascade) {
      for (const model of models)
        await model.truncate(options);
    } else {
      await Promise.all(models.map((model) => model.truncate(options)));
    }
  }
  async drop(options) {
    if (options && options.cascade) {
      for (const model of this.modelManager.models) {
        await model.drop(options);
      }
    }
    const sortedModels = this.modelManager.getModelsTopoSortedByForeignKey();
    if (sortedModels) {
      for (const model of sortedModels) {
        await model.drop(options);
      }
    }
    if (this.dialect.name === "sqlite") {
      await withSqliteForeignKeysOff(this, options, async () => {
        for (const model of this.modelManager.models) {
          await model.drop(options);
        }
      });
      return;
    }
    for (const model of this.modelManager.models) {
      const tableName = model.getTableName();
      const foreignKeys = await this.queryInterface.getForeignKeyReferencesForTable(tableName, options);
      await Promise.all(foreignKeys.map((foreignKey) => {
        return this.queryInterface.removeConstraint(tableName, foreignKey.constraintName, options);
      }));
    }
    for (const model of this.modelManager.models) {
      await model.drop(options);
    }
  }
  async authenticate(options) {
    options = __spreadValues({
      raw: true,
      plain: true,
      type: QueryTypes.SELECT
    }, options);
    await this.query("SELECT 1+1 AS result", options);
    return;
  }
  async databaseVersion(options) {
    return await this.getQueryInterface().databaseVersion(options);
  }
  random() {
    if (["postgres", "sqlite", "snowflake"].includes(this.getDialect())) {
      return this.fn("RANDOM");
    }
    return this.fn("RAND");
  }
  static fn(fn, ...args) {
    return new Utils.Fn(fn, args);
  }
  static col(col) {
    return new Utils.Col(col);
  }
  static cast(val, type) {
    return new Utils.Cast(val, type);
  }
  static literal(val) {
    return new Utils.Literal(val);
  }
  static and(...args) {
    return { [Op.and]: args };
  }
  static or(...args) {
    return { [Op.or]: args };
  }
  static json(conditionsOrPath, value) {
    return new Utils.Json(conditionsOrPath, value);
  }
  static where(attr, comparator, logic) {
    return new Utils.Where(attr, comparator, logic);
  }
  async transaction(options, autoCallback) {
    if (typeof options === "function") {
      autoCallback = options;
      options = void 0;
    }
    const transaction = new Transaction(this, options);
    if (!autoCallback) {
      await transaction.prepareEnvironment(false);
      return transaction;
    }
    return Sequelize._clsRun(async () => {
      await transaction.prepareEnvironment(true);
      let result;
      try {
        result = await autoCallback(transaction);
      } catch (err) {
        try {
          await transaction.rollback();
        } catch (ignore) {
        }
        throw err;
      }
      await transaction.commit();
      return result;
    });
  }
  static useCLS(ns) {
    if (!ns || typeof ns !== "object" || typeof ns.bind !== "function" || typeof ns.run !== "function")
      throw new Error("Must provide CLS namespace");
    Sequelize._cls = ns;
    return this;
  }
  static _clsRun(fn) {
    const ns = Sequelize._cls;
    if (!ns)
      return fn();
    let res;
    ns.run((context) => res = fn(context));
    return res;
  }
  log(...args) {
    let options;
    const last = _.last(args);
    if (last && _.isPlainObject(last) && Object.prototype.hasOwnProperty.call(last, "logging")) {
      options = last;
      if (options.logging === console.log) {
        args.splice(args.length - 1, 1);
      }
    } else {
      options = this.options;
    }
    if (options.logging) {
      if (options.logging === true) {
        deprecations.noTrueLogging();
        options.logging = console.log;
      }
      if ((this.options.benchmark || options.benchmark) && options.logging === console.log) {
        args = [`${args[0]} Elapsed time: ${args[1]}ms`];
      }
      options.logging(...args);
    }
  }
  close() {
    return this.connectionManager.close();
  }
  normalizeDataType(Type) {
    let type = typeof Type === "function" ? new Type() : Type;
    const dialectTypes = this.dialect.DataTypes || {};
    if (dialectTypes[type.key]) {
      type = dialectTypes[type.key].extend(type);
    }
    if (type instanceof DataTypes.ARRAY) {
      if (!type.type) {
        throw new Error("ARRAY is missing type definition for its values.");
      }
      if (dialectTypes[type.type.key]) {
        type.type = dialectTypes[type.type.key].extend(type.type);
      }
    }
    return type;
  }
  normalizeAttribute(attribute) {
    if (!_.isPlainObject(attribute)) {
      attribute = { type: attribute };
    }
    if (!attribute.type)
      return attribute;
    attribute.type = this.normalizeDataType(attribute.type);
    if (Object.prototype.hasOwnProperty.call(attribute, "defaultValue")) {
      if (typeof attribute.defaultValue === "function" && [DataTypes.NOW, DataTypes.UUIDV1, DataTypes.UUIDV4].includes(attribute.defaultValue)) {
        attribute.defaultValue = new attribute.defaultValue();
      }
    }
    if (attribute.type instanceof DataTypes.ENUM) {
      if (attribute.values) {
        attribute.type.values = attribute.type.options.values = attribute.values;
      } else {
        attribute.values = attribute.type.values;
      }
      if (!attribute.values.length) {
        throw new Error("Values for ENUM have not been defined.");
      }
    }
    return attribute;
  }
}
Sequelize.prototype.fn = Sequelize.fn;
Sequelize.prototype.col = Sequelize.col;
Sequelize.prototype.cast = Sequelize.cast;
Sequelize.prototype.literal = Sequelize.literal;
Sequelize.prototype.and = Sequelize.and;
Sequelize.prototype.or = Sequelize.or;
Sequelize.prototype.json = Sequelize.json;
Sequelize.prototype.where = Sequelize.where;
Sequelize.prototype.validate = Sequelize.prototype.authenticate;
Object.defineProperty(Sequelize, "version", {
  enumerable: true,
  get() {
    return require("../package.json").version;
  }
});
Sequelize.options = { hooks: {} };
Sequelize.Utils = Utils;
Sequelize.Op = Op;
Sequelize.TableHints = TableHints;
Sequelize.IndexHints = IndexHints;
Sequelize.Transaction = Transaction;
Sequelize.prototype.Sequelize = Sequelize;
Sequelize.prototype.QueryTypes = Sequelize.QueryTypes = QueryTypes;
Sequelize.prototype.Validator = Sequelize.Validator = Validator;
Sequelize.Model = Model;
Sequelize.QueryInterface = QueryInterface;
Sequelize.BelongsTo = BelongsTo;
Sequelize.HasOne = HasOne;
Sequelize.HasMany = HasMany;
Sequelize.BelongsToMany = BelongsToMany;
Sequelize.DataTypes = DataTypes;
for (const dataType in DataTypes) {
  Sequelize[dataType] = DataTypes[dataType];
}
Sequelize.Deferrable = Deferrable;
Sequelize.prototype.Association = Sequelize.Association = Association;
Sequelize.useInflection = Utils.useInflection;
Hooks.applyTo(Sequelize);
Hooks.applyTo(Sequelize.prototype);
Sequelize.Error = sequelizeErrors.BaseError;
for (const error of Object.keys(sequelizeErrors)) {
  Sequelize[error] = sequelizeErrors[error];
}
module.exports = Sequelize;
module.exports.Sequelize = Sequelize;
module.exports.default = Sequelize;
//# sourceMappingURL=sequelize.js.map
"use strict";
const dataTypes = require("./data-types");
const { logger } = require("./utils/logger");
function arrayToList(array, timeZone, dialect, format2) {
  return array.reduce((sql, val, i) => {
    if (i !== 0) {
      sql += ", ";
    }
    if (Array.isArray(val)) {
      sql += `(${arrayToList(val, timeZone, dialect, format2)})`;
    } else {
      sql += escape(val, timeZone, dialect, format2);
    }
    return sql;
  }, "");
}
exports.arrayToList = arrayToList;
function escape(val, timeZone, dialect, format2) {
  let prependN = false;
  if (val === void 0 || val === null) {
    return "NULL";
  }
  switch (typeof val) {
    case "boolean":
      if (["sqlite", "mssql"].includes(dialect)) {
        return +!!val;
      }
      return (!!val).toString();
    case "number":
      return val.toString();
    case "string":
      prependN = dialect === "mssql";
      break;
  }
  if (val instanceof Date) {
    val = dataTypes[dialect].DATE.prototype.stringify(val, { timezone: timeZone });
  }
  if (Buffer.isBuffer(val)) {
    if (dataTypes[dialect].BLOB) {
      return dataTypes[dialect].BLOB.prototype.stringify(val);
    }
    return dataTypes.BLOB.prototype.stringify(val);
  }
  if (Array.isArray(val)) {
    const partialEscape = (escVal) => escape(escVal, timeZone, dialect, format2);
    if (dialect === "postgres" && !format2) {
      return dataTypes.ARRAY.prototype.stringify(val, { escape: partialEscape });
    }
    return arrayToList(val, timeZone, dialect, format2);
  }
  if (!val.replace) {
    throw new Error(`Invalid value ${logger.inspect(val)}`);
  }
  if (["postgres", "sqlite", "mssql", "snowflake", "db2"].includes(dialect)) {
    val = val.replace(/'/g, "''");
    if (dialect === "postgres") {
      val = val.replace(/\0/g, "\\0");
    }
  } else {
    val = val.replace(/[\0\n\r\b\t\\'"\x1a]/g, (s) => {
      switch (s) {
        case "\0":
          return "\\0";
        case "\n":
          return "\\n";
        case "\r":
          return "\\r";
        case "\b":
          return "\\b";
        case "	":
          return "\\t";
        case "":
          return "\\Z";
        default:
          return `\\${s}`;
      }
    });
  }
  return `${(prependN ? "N'" : "'") + val}'`;
}
exports.escape = escape;
function format(sql, values, timeZone, dialect) {
  values = [].concat(values);
  if (typeof sql !== "string") {
    throw new Error(`Invalid SQL string provided: ${sql}`);
  }
  return sql.replace(/\?/g, (match) => {
    if (!values.length) {
      return match;
    }
    return escape(values.shift(), timeZone, dialect, true);
  });
}
exports.format = format;
function formatNamedParameters(sql, values, timeZone, dialect) {
  return sql.replace(/:+(?!\d)(\w+)/g, (value, key) => {
    if (dialect === "postgres" && value.slice(0, 2) === "::") {
      return value;
    }
    if (values[key] !== void 0) {
      return escape(values[key], timeZone, dialect, true);
    }
    throw new Error(`Named parameter "${value}" has no value in the given object.`);
  });
}
exports.formatNamedParameters = formatNamedParameters;
//# sourceMappingURL=sql-string.js.map
"use strict";
const TableHints = module.exports = {
  NOLOCK: "NOLOCK",
  READUNCOMMITTED: "READUNCOMMITTED",
  UPDLOCK: "UPDLOCK",
  REPEATABLEREAD: "REPEATABLEREAD",
  SERIALIZABLE: "SERIALIZABLE",
  READCOMMITTED: "READCOMMITTED",
  TABLOCK: "TABLOCK",
  TABLOCKX: "TABLOCKX",
  PAGLOCK: "PAGLOCK",
  ROWLOCK: "ROWLOCK",
  NOWAIT: "NOWAIT",
  READPAST: "READPAST",
  XLOCK: "XLOCK",
  SNAPSHOT: "SNAPSHOT",
  NOEXPAND: "NOEXPAND"
};
//# sourceMappingURL=table-hints.js.map
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
class Transaction {
  constructor(sequelize, options) {
    this.sequelize = sequelize;
    this.savepoints = [];
    this._afterCommitHooks = [];
    const generateTransactionId = this.sequelize.dialect.queryGenerator.generateTransactionId;
    this.options = __spreadValues({
      type: sequelize.options.transactionType,
      isolationLevel: sequelize.options.isolationLevel,
      readOnly: false
    }, options);
    this.parent = this.options.transaction;
    if (this.parent) {
      this.id = this.parent.id;
      this.parent.savepoints.push(this);
      this.name = `${this.id}-sp-${this.parent.savepoints.length}`;
    } else {
      this.id = this.name = generateTransactionId();
    }
    delete this.options.transaction;
  }
  async commit() {
    if (this.finished) {
      throw new Error(`Transaction cannot be committed because it has been finished with state: ${this.finished}`);
    }
    try {
      await this.sequelize.getQueryInterface().commitTransaction(this, this.options);
      this.cleanup();
    } catch (e) {
      console.warn(`Committing transaction ${this.id} failed with error ${JSON.stringify(e.message)}. We are killing its connection as it is now in an undetermined state.`);
      await this.forceCleanup();
      throw e;
    } finally {
      this.finished = "commit";
      for (const hook of this._afterCommitHooks) {
        await hook.apply(this, [this]);
      }
    }
  }
  async rollback() {
    if (this.finished) {
      throw new Error(`Transaction cannot be rolled back because it has been finished with state: ${this.finished}`);
    }
    if (!this.connection) {
      throw new Error("Transaction cannot be rolled back because it never started");
    }
    try {
      await this.sequelize.getQueryInterface().rollbackTransaction(this, this.options);
      this.cleanup();
    } catch (e) {
      console.warn(`Rolling back transaction ${this.id} failed with error ${JSON.stringify(e.message)}. We are killing its connection as it is now in an undetermined state.`);
      await this.forceCleanup();
      throw e;
    }
  }
  async prepareEnvironment(useCLS = true) {
    let connectionPromise;
    if (this.parent) {
      connectionPromise = Promise.resolve(this.parent.connection);
    } else {
      const acquireOptions = { uuid: this.id };
      if (this.options.readOnly) {
        acquireOptions.type = "SELECT";
      }
      connectionPromise = this.sequelize.connectionManager.getConnection(acquireOptions);
    }
    let result;
    const connection = await connectionPromise;
    this.connection = connection;
    this.connection.uuid = this.id;
    try {
      await this.begin();
      result = await this.setDeferrable();
    } catch (setupErr) {
      try {
        result = await this.rollback();
      } finally {
        throw setupErr;
      }
    }
    if (useCLS && this.sequelize.constructor._cls) {
      this.sequelize.constructor._cls.set("transaction", this);
    }
    return result;
  }
  async setDeferrable() {
    if (this.options.deferrable) {
      return await this.sequelize.getQueryInterface().deferConstraints(this, this.options);
    }
  }
  async begin() {
    const queryInterface = this.sequelize.getQueryInterface();
    if (this.sequelize.dialect.supports.settingIsolationLevelDuringTransaction) {
      await queryInterface.startTransaction(this, this.options);
      return queryInterface.setIsolationLevel(this, this.options.isolationLevel, this.options);
    }
    await queryInterface.setIsolationLevel(this, this.options.isolationLevel, this.options);
    return queryInterface.startTransaction(this, this.options);
  }
  cleanup() {
    if (this.parent || this.connection.uuid === void 0) {
      return;
    }
    this._clearCls();
    this.sequelize.connectionManager.releaseConnection(this.connection);
    this.connection.uuid = void 0;
  }
  async forceCleanup() {
    if (this.parent || this.connection.uuid === void 0) {
      return;
    }
    this._clearCls();
    await this.sequelize.connectionManager.destroyConnection(this.connection);
    this.connection.uuid = void 0;
  }
  _clearCls() {
    const cls = this.sequelize.constructor._cls;
    if (cls) {
      if (cls.get("transaction") === this) {
        cls.set("transaction", null);
      }
    }
  }
  afterCommit(fn) {
    if (!fn || typeof fn !== "function") {
      throw new Error('"fn" must be a function');
    }
    this._afterCommitHooks.push(fn);
  }
  static get TYPES() {
    return {
      DEFERRED: "DEFERRED",
      IMMEDIATE: "IMMEDIATE",
      EXCLUSIVE: "EXCLUSIVE"
    };
  }
  static get ISOLATION_LEVELS() {
    return {
      READ_UNCOMMITTED: "READ UNCOMMITTED",
      READ_COMMITTED: "READ COMMITTED",
      REPEATABLE_READ: "REPEATABLE READ",
      SERIALIZABLE: "SERIALIZABLE"
    };
  }
  static get LOCK() {
    return {
      UPDATE: "UPDATE",
      SHARE: "SHARE",
      KEY_SHARE: "KEY SHARE",
      NO_KEY_UPDATE: "NO KEY UPDATE"
    };
  }
  get LOCK() {
    return Transaction.LOCK;
  }
}
module.exports = Transaction;
module.exports.Transaction = Transaction;
module.exports.default = Transaction;
//# sourceMappingURL=transaction.js.map
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
const DataTypes = require("./data-types");
const SqlString = require("./sql-string");
const _ = require("lodash");
const baseIsNative = require("lodash/_baseIsNative");
const uuidv1 = require("uuid").v1;
const uuidv4 = require("uuid").v4;
const operators = require("./operators");
const operatorsSet = new Set(Object.values(operators));
let inflection = require("inflection");
exports.classToInvokable = require("./utils/class-to-invokable").classToInvokable;
exports.joinSQLFragments = require("./utils/join-sql-fragments").joinSQLFragments;
function useInflection(_inflection) {
  inflection = _inflection;
}
exports.useInflection = useInflection;
function camelizeIf(str, condition) {
  let result = str;
  if (condition) {
    result = camelize(str);
  }
  return result;
}
exports.camelizeIf = camelizeIf;
function underscoredIf(str, condition) {
  let result = str;
  if (condition) {
    result = underscore(str);
  }
  return result;
}
exports.underscoredIf = underscoredIf;
function isPrimitive(val) {
  const type = typeof val;
  return ["string", "number", "boolean"].includes(type);
}
exports.isPrimitive = isPrimitive;
function mergeDefaults(a, b) {
  return _.mergeWith(a, b, (objectValue, sourceValue) => {
    if (!_.isPlainObject(objectValue) && objectValue !== void 0) {
      if (_.isFunction(objectValue) && baseIsNative(objectValue)) {
        return sourceValue || objectValue;
      }
      return objectValue;
    }
  });
}
exports.mergeDefaults = mergeDefaults;
function merge() {
  const result = {};
  for (const obj of arguments) {
    _.forOwn(obj, (value, key) => {
      if (value !== void 0) {
        if (!result[key]) {
          result[key] = value;
        } else if (_.isPlainObject(value) && _.isPlainObject(result[key])) {
          result[key] = merge(result[key], value);
        } else if (Array.isArray(value) && Array.isArray(result[key])) {
          result[key] = value.concat(result[key]);
        } else {
          result[key] = value;
        }
      }
    });
  }
  return result;
}
exports.merge = merge;
function spliceStr(str, index, count, add) {
  return str.slice(0, index) + add + str.slice(index + count);
}
exports.spliceStr = spliceStr;
function camelize(str) {
  return str.trim().replace(/[-_\s]+(.)?/g, (match, c) => c.toUpperCase());
}
exports.camelize = camelize;
function underscore(str) {
  return inflection.underscore(str);
}
exports.underscore = underscore;
function singularize(str) {
  return inflection.singularize(str);
}
exports.singularize = singularize;
function pluralize(str) {
  return inflection.pluralize(str);
}
exports.pluralize = pluralize;
function format(arr, dialect) {
  const timeZone = null;
  return SqlString.format(arr[0], arr.slice(1), timeZone, dialect);
}
exports.format = format;
function formatNamedParameters(sql, parameters, dialect) {
  const timeZone = null;
  return SqlString.formatNamedParameters(sql, parameters, timeZone, dialect);
}
exports.formatNamedParameters = formatNamedParameters;
function cloneDeep(obj, onlyPlain) {
  obj = obj || {};
  return _.cloneDeepWith(obj, (elem) => {
    if (Array.isArray(elem) || _.isPlainObject(elem)) {
      return void 0;
    }
    if (onlyPlain || typeof elem === "object") {
      return elem;
    }
    if (elem && typeof elem.clone === "function") {
      return elem.clone();
    }
  });
}
exports.cloneDeep = cloneDeep;
function mapFinderOptions(options, Model) {
  if (options.attributes && Array.isArray(options.attributes)) {
    options.attributes = Model._injectDependentVirtualAttributes(options.attributes);
    options.attributes = options.attributes.filter((v) => !Model._virtualAttributes.has(v));
  }
  mapOptionFieldNames(options, Model);
  return options;
}
exports.mapFinderOptions = mapFinderOptions;
function mapOptionFieldNames(options, Model) {
  if (Array.isArray(options.attributes)) {
    options.attributes = options.attributes.map((attr) => {
      if (typeof attr !== "string")
        return attr;
      if (Model.rawAttributes[attr] && attr !== Model.rawAttributes[attr].field) {
        return [Model.rawAttributes[attr].field, attr];
      }
      return attr;
    });
  }
  if (options.where && _.isPlainObject(options.where)) {
    options.where = mapWhereFieldNames(options.where, Model);
  }
  return options;
}
exports.mapOptionFieldNames = mapOptionFieldNames;
function mapWhereFieldNames(attributes, Model) {
  if (attributes) {
    attributes = cloneDeep(attributes);
    getComplexKeys(attributes).forEach((attribute) => {
      const rawAttribute = Model.rawAttributes[attribute];
      if (rawAttribute && rawAttribute.field !== rawAttribute.fieldName) {
        attributes[rawAttribute.field] = attributes[attribute];
        delete attributes[attribute];
      }
      if (_.isPlainObject(attributes[attribute]) && !(rawAttribute && (rawAttribute.type instanceof DataTypes.HSTORE || rawAttribute.type instanceof DataTypes.JSON))) {
        attributes[attribute] = mapOptionFieldNames({
          where: attributes[attribute]
        }, Model).where;
      }
      if (Array.isArray(attributes[attribute])) {
        attributes[attribute].forEach((where, index) => {
          if (_.isPlainObject(where)) {
            attributes[attribute][index] = mapWhereFieldNames(where, Model);
          }
        });
      }
    });
  }
  return attributes;
}
exports.mapWhereFieldNames = mapWhereFieldNames;
function mapValueFieldNames(dataValues, fields, Model) {
  const values = {};
  for (const attr of fields) {
    if (dataValues[attr] !== void 0 && !Model._virtualAttributes.has(attr)) {
      if (Model.rawAttributes[attr] && Model.rawAttributes[attr].field && Model.rawAttributes[attr].field !== attr) {
        values[Model.rawAttributes[attr].field] = dataValues[attr];
      } else {
        values[attr] = dataValues[attr];
      }
    }
  }
  return values;
}
exports.mapValueFieldNames = mapValueFieldNames;
function isColString(value) {
  return typeof value === "string" && value[0] === "$" && value[value.length - 1] === "$";
}
exports.isColString = isColString;
function canTreatArrayAsAnd(arr) {
  return arr.some((arg) => _.isPlainObject(arg) || arg instanceof Where);
}
exports.canTreatArrayAsAnd = canTreatArrayAsAnd;
function combineTableNames(tableName1, tableName2) {
  return tableName1.toLowerCase() < tableName2.toLowerCase() ? tableName1 + tableName2 : tableName2 + tableName1;
}
exports.combineTableNames = combineTableNames;
function toDefaultValue(value, dialect) {
  if (typeof value === "function") {
    const tmp = value();
    if (tmp instanceof DataTypes.ABSTRACT) {
      return tmp.toSql();
    }
    return tmp;
  }
  if (value instanceof DataTypes.UUIDV1) {
    return uuidv1();
  }
  if (value instanceof DataTypes.UUIDV4) {
    return uuidv4();
  }
  if (value instanceof DataTypes.NOW) {
    return now(dialect);
  }
  if (Array.isArray(value)) {
    return value.slice();
  }
  if (_.isPlainObject(value)) {
    return __spreadValues({}, value);
  }
  return value;
}
exports.toDefaultValue = toDefaultValue;
function defaultValueSchemable(value) {
  if (value === void 0) {
    return false;
  }
  if (value instanceof DataTypes.NOW) {
    return false;
  }
  if (value instanceof DataTypes.UUIDV1 || value instanceof DataTypes.UUIDV4) {
    return false;
  }
  return typeof value !== "function";
}
exports.defaultValueSchemable = defaultValueSchemable;
function removeNullValuesFromHash(hash, omitNull, options) {
  let result = hash;
  options = options || {};
  options.allowNull = options.allowNull || [];
  if (omitNull) {
    const _hash = {};
    _.forIn(hash, (val, key) => {
      if (options.allowNull.includes(key) || key.endsWith("Id") || val !== null && val !== void 0) {
        _hash[key] = val;
      }
    });
    result = _hash;
  }
  return result;
}
exports.removeNullValuesFromHash = removeNullValuesFromHash;
const dialects = /* @__PURE__ */ new Set(["mariadb", "mysql", "postgres", "sqlite", "mssql", "db2"]);
function now(dialect) {
  const d = new Date();
  if (!dialects.has(dialect)) {
    d.setMilliseconds(0);
  }
  return d;
}
exports.now = now;
const TICK_CHAR = "`";
exports.TICK_CHAR = TICK_CHAR;
function addTicks(s, tickChar) {
  tickChar = tickChar || TICK_CHAR;
  return tickChar + removeTicks(s, tickChar) + tickChar;
}
exports.addTicks = addTicks;
function removeTicks(s, tickChar) {
  tickChar = tickChar || TICK_CHAR;
  return s.replace(new RegExp(tickChar, "g"), "");
}
exports.removeTicks = removeTicks;
function flattenObjectDeep(value) {
  if (!_.isPlainObject(value))
    return value;
  const flattenedObj = {};
  function flattenObject(obj, subPath) {
    Object.keys(obj).forEach((key) => {
      const pathToProperty = subPath ? `${subPath}.${key}` : key;
      if (typeof obj[key] === "object" && obj[key] !== null) {
        flattenObject(obj[key], pathToProperty);
      } else {
        flattenedObj[pathToProperty] = _.get(obj, key);
      }
    });
    return flattenedObj;
  }
  return flattenObject(value, void 0);
}
exports.flattenObjectDeep = flattenObjectDeep;
class SequelizeMethod {
}
exports.SequelizeMethod = SequelizeMethod;
class Fn extends SequelizeMethod {
  constructor(fn, args) {
    super();
    this.fn = fn;
    this.args = args;
  }
  clone() {
    return new Fn(this.fn, this.args);
  }
}
exports.Fn = Fn;
class Col extends SequelizeMethod {
  constructor(col, ...args) {
    super();
    if (args.length > 0) {
      col = args;
    }
    this.col = col;
  }
}
exports.Col = Col;
class Cast extends SequelizeMethod {
  constructor(val, type, json) {
    super();
    this.val = val;
    this.type = (type || "").trim();
    this.json = json || false;
  }
}
exports.Cast = Cast;
class Literal extends SequelizeMethod {
  constructor(val) {
    super();
    this.val = val;
  }
}
exports.Literal = Literal;
class Json extends SequelizeMethod {
  constructor(conditionsOrPath, value) {
    super();
    if (_.isObject(conditionsOrPath)) {
      this.conditions = conditionsOrPath;
    } else {
      this.path = conditionsOrPath;
      if (value) {
        this.value = value;
      }
    }
  }
}
exports.Json = Json;
class Where extends SequelizeMethod {
  constructor(attribute, comparator, logic) {
    super();
    if (logic === void 0) {
      logic = comparator;
      comparator = "=";
    }
    this.attribute = attribute;
    this.comparator = comparator;
    this.logic = logic;
  }
}
exports.Where = Where;
function getOperators(obj) {
  return Object.getOwnPropertySymbols(obj).filter((s) => operatorsSet.has(s));
}
exports.getOperators = getOperators;
function getComplexKeys(obj) {
  return getOperators(obj).concat(Object.keys(obj));
}
exports.getComplexKeys = getComplexKeys;
function getComplexSize(obj) {
  return Array.isArray(obj) ? obj.length : getComplexKeys(obj).length;
}
exports.getComplexSize = getComplexSize;
function isWhereEmpty(obj) {
  return !!obj && _.isEmpty(obj) && getOperators(obj).length === 0;
}
exports.isWhereEmpty = isWhereEmpty;
function generateEnumName(tableName, columnName) {
  return `enum_${tableName}_${columnName}`;
}
exports.generateEnumName = generateEnumName;
function camelizeObjectKeys(obj) {
  const newObj = new Object();
  Object.keys(obj).forEach((key) => {
    newObj[camelize(key)] = obj[key];
  });
  return newObj;
}
exports.camelizeObjectKeys = camelizeObjectKeys;
function defaults(object, ...sources) {
  object = Object(object);
  sources.forEach((source) => {
    if (source) {
      source = Object(source);
      getComplexKeys(source).forEach((key) => {
        const value = object[key];
        if (value === void 0 || _.eq(value, Object.prototype[key]) && !Object.prototype.hasOwnProperty.call(object, key)) {
          object[key] = source[key];
        }
      });
    }
  });
  return object;
}
exports.defaults = defaults;
function nameIndex(index, tableName) {
  if (tableName.tableName)
    tableName = tableName.tableName;
  if (!Object.prototype.hasOwnProperty.call(index, "name")) {
    const fields = index.fields.map((field) => typeof field === "string" ? field : field.name || field.attribute);
    index.name = underscore(`${tableName}_${fields.join("_")}`);
  }
  return index;
}
exports.nameIndex = nameIndex;
function intersects(arr1, arr2) {
  return arr1.some((v) => arr2.includes(v));
}
exports.intersects = intersects;
function safeStringifyJson(value) {
  return JSON.stringify(value, (key, value2) => {
    if (typeof value2 === "bigint") {
      return String(value2);
    }
    return value2;
  });
}
exports.safeStringifyJson = safeStringifyJson;
//# sourceMappingURL=utils.js.map
var __defProp = Object.defineProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
__export(exports, {
  classToInvokable: () => classToInvokable
});
function classToInvokable(Class) {
  return new Proxy(Class, {
    apply(_target, _thisArg, args) {
      return new Class(...args);
    },
    construct(_target, args) {
      return new Class(...args);
    }
  });
}
//# sourceMappingURL=class-to-invokable.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
__export(exports, {
  noBoolOperatorAliases: () => noBoolOperatorAliases,
  noDoubleNestedGroup: () => noDoubleNestedGroup,
  noRawAttributes: () => noRawAttributes,
  noStringOperators: () => noStringOperators,
  noTrueLogging: () => noTrueLogging,
  unsupportedEngine: () => unsupportedEngine
});
var import_util = __toModule(require("util"));
const noop = () => {
};
const noRawAttributes = (0, import_util.deprecate)(noop, "Use sequelize.fn / sequelize.literal to construct attributes", "SEQUELIZE0001");
const noTrueLogging = (0, import_util.deprecate)(noop, "The logging-option should be either a function or false. Default: console.log", "SEQUELIZE0002");
const noStringOperators = (0, import_util.deprecate)(noop, "String based operators are deprecated. Please use Symbol based operators for better security, read more at https://sequelize.org/master/manual/querying.html#operators", "SEQUELIZE0003");
const noBoolOperatorAliases = (0, import_util.deprecate)(noop, "A boolean value was passed to options.operatorsAliases. This is a no-op with v5 and should be removed.", "SEQUELIZE0004");
const noDoubleNestedGroup = (0, import_util.deprecate)(noop, "Passing a double nested nested array to `group` is unsupported and will be removed in v6.", "SEQUELIZE0005");
const unsupportedEngine = (0, import_util.deprecate)(noop, "This database engine version is not supported, please update your database server. More information https://github.com/sequelize/sequelize/blob/main/ENGINE.md", "SEQUELIZE0006");
//# sourceMappingURL=deprecations.js.map
var __defProp = Object.defineProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __publicField = (obj, key, value) => {
  __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
  return value;
};
__export(exports, {
  JoinSQLFragmentsError: () => JoinSQLFragmentsError,
  joinSQLFragments: () => joinSQLFragments
});
function doesNotWantLeadingSpace(str) {
  return /^[;,)]/.test(str);
}
function doesNotWantTrailingSpace(str) {
  return /\($/.test(str);
}
function singleSpaceJoinHelper(parts) {
  return parts.reduce(({ skipNextLeadingSpace, result }, part) => {
    if (skipNextLeadingSpace || doesNotWantLeadingSpace(part)) {
      result += part.trim();
    } else {
      result += ` ${part.trim()}`;
    }
    return {
      skipNextLeadingSpace: doesNotWantTrailingSpace(part),
      result
    };
  }, {
    skipNextLeadingSpace: true,
    result: ""
  }).result;
}
function joinSQLFragments(array) {
  if (array.length === 0)
    return "";
  const truthyArray = array.filter((x) => !!x);
  const flattenedArray = truthyArray.map((fragment) => {
    if (Array.isArray(fragment)) {
      return joinSQLFragments(fragment);
    }
    return fragment;
  });
  for (const fragment of flattenedArray) {
    if (fragment && typeof fragment !== "string") {
      throw new JoinSQLFragmentsError(flattenedArray, fragment, `Tried to construct a SQL string with a non-string, non-falsy fragment (${fragment}).`);
    }
  }
  const trimmedArray = flattenedArray.map((x) => x.trim());
  const nonEmptyStringArray = trimmedArray.filter((x) => x !== "");
  return singleSpaceJoinHelper(nonEmptyStringArray);
}
class JoinSQLFragmentsError extends TypeError {
  constructor(args, fragment, message) {
    super(message);
    __publicField(this, "args");
    __publicField(this, "fragment");
    this.args = args;
    this.fragment = fragment;
    this.name = "JoinSQLFragmentsError";
  }
}
//# sourceMappingURL=join-sql-fragments.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __objRest = (source, exclude) => {
  var target = {};
  for (var prop in source)
    if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
      target[prop] = source[prop];
  if (source != null && __getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(source)) {
      if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
        target[prop] = source[prop];
    }
  return target;
};
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
var __publicField = (obj, key, value) => {
  __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
  return value;
};
__export(exports, {
  Logger: () => Logger,
  logger: () => logger
});
var import_debug = __toModule(require("debug"));
var import_util = __toModule(require("util"));
class Logger {
  constructor(_a = {}) {
    __publicField(this, "config");
    var _b = _a, { context = "sequelize" } = _b, rest = __objRest(_b, ["context"]);
    this.config = __spreadValues({
      context
    }, rest);
  }
  warn(message) {
    console.warn(`(${this.config.context}) Warning: ${message}`);
  }
  inspect(value) {
    return import_util.default.inspect(value, {
      showHidden: false,
      depth: 1
    });
  }
  debugContext(name) {
    return (0, import_debug.default)(`${this.config.context}:${name}`);
  }
}
const logger = new Logger();
//# sourceMappingURL=logger.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
__export(exports, {
  injectReplacements: () => injectReplacements
});
var import_isPlainObject = __toModule(require("lodash/isPlainObject"));
var import_sql_string = __toModule(require("../sql-string"));
function injectReplacements(sqlString, dialect, replacements) {
  var _a, _b, _c, _d;
  if (replacements == null) {
    return sqlString;
  }
  if (!Array.isArray(replacements) && !(0, import_isPlainObject.default)(replacements)) {
    throw new TypeError(`"replacements" must be an array or a plain object, but received ${JSON.stringify(replacements)} instead.`);
  }
  const isNamedReplacements = (0, import_isPlainObject.default)(replacements);
  const isPositionalReplacements = Array.isArray(replacements);
  let lastConsumedPositionalReplacementIndex = -1;
  let output = "";
  let currentDollarStringTagName = null;
  let isString = false;
  let isColumn = false;
  let previousSliceEnd = 0;
  let isSingleLineComment = false;
  let isCommentBlock = false;
  for (let i = 0; i < sqlString.length; i++) {
    const char = sqlString[i];
    if (isColumn) {
      if (char === dialect.TICK_CHAR_RIGHT) {
        isColumn = false;
      }
      continue;
    }
    if (isString) {
      if (char === "'" && !isBackslashEscaped(sqlString, i - 1)) {
        isString = false;
      }
      continue;
    }
    if (currentDollarStringTagName !== null) {
      if (char !== "$") {
        continue;
      }
      const remainingString = sqlString.slice(i, sqlString.length);
      const dollarStringStartMatch = remainingString.match(/^\$(?<name>[a-z_][0-9a-z_])?(\$)/i);
      const tagName = (_a = dollarStringStartMatch == null ? void 0 : dollarStringStartMatch.groups) == null ? void 0 : _a.name;
      if (currentDollarStringTagName === tagName) {
        currentDollarStringTagName = null;
      }
      continue;
    }
    if (isSingleLineComment) {
      if (char === "\n") {
        isSingleLineComment = false;
      }
      continue;
    }
    if (isCommentBlock) {
      if (char === "*" && sqlString[i + 1] === "/") {
        isCommentBlock = false;
      }
      continue;
    }
    if (char === dialect.TICK_CHAR_LEFT) {
      isColumn = true;
      continue;
    }
    if (char === "'") {
      isString = true;
      continue;
    }
    if (char === "-" && sqlString.slice(i, i + 3) === "-- ") {
      isSingleLineComment = true;
      continue;
    }
    if (char === "/" && sqlString.slice(i, i + 2) === "/*") {
      isCommentBlock = true;
      continue;
    }
    if (char === "$") {
      const previousChar = sqlString[i - 1];
      if (/[0-9a-z_]/i.test(previousChar)) {
        continue;
      }
      const remainingString = sqlString.slice(i, sqlString.length);
      const dollarStringStartMatch = remainingString.match(/^\$(?<name>[a-z_][0-9a-z_]*)?\$/i);
      if (dollarStringStartMatch) {
        currentDollarStringTagName = (_c = (_b = dollarStringStartMatch.groups) == null ? void 0 : _b.name) != null ? _c : "";
        continue;
      }
      continue;
    }
    if (isNamedReplacements && char === ":") {
      const previousChar = sqlString[i - 1];
      if (previousChar !== void 0 && !/[\s(,=[]/.test(previousChar)) {
        continue;
      }
      const remainingString = sqlString.slice(i, sqlString.length);
      const match = remainingString.match(/^:(?<name>[a-z_][0-9a-z_]*)(?:\)|,|$|\s|::|;|])/i);
      const replacementName = (_d = match == null ? void 0 : match.groups) == null ? void 0 : _d.name;
      if (!replacementName) {
        continue;
      }
      const replacementValue = replacements[replacementName];
      if (!Object.prototype.hasOwnProperty.call(replacements, replacementName) || replacementValue === void 0) {
        throw new Error(`Named replacement ":${replacementName}" has no entry in the replacement map.`);
      }
      const escapedReplacement = (0, import_sql_string.escape)(replacementValue, void 0, dialect.name, true);
      output += sqlString.slice(previousSliceEnd, i);
      previousSliceEnd = i + replacementName.length + 1;
      output += escapedReplacement;
      continue;
    }
    if (isPositionalReplacements && char === "?") {
      const previousChar = sqlString[i - 1];
      if (previousChar !== void 0 && !/[\s(,=[]/.test(previousChar)) {
        continue;
      }
      const nextChar = sqlString[i + 1];
      if (nextChar === "|" || nextChar === "&") {
        continue;
      }
      const replacementIndex = ++lastConsumedPositionalReplacementIndex;
      const replacementValue = replacements[lastConsumedPositionalReplacementIndex];
      if (replacementValue === void 0) {
        throw new Error(`Positional replacement (?) ${replacementIndex} has no entry in the replacement map (replacements[${replacementIndex}] is undefined).`);
      }
      const escapedReplacement = (0, import_sql_string.escape)(replacementValue, void 0, dialect.name, true);
      output += sqlString.slice(previousSliceEnd, i);
      previousSliceEnd = i + 1;
      output += escapedReplacement;
    }
  }
  output += sqlString.slice(previousSliceEnd, sqlString.length);
  return output;
}
function isBackslashEscaped(string, pos) {
  let escaped = false;
  for (let i = pos; i >= 0; i--) {
    const char = string[i];
    if (char !== "\\") {
      break;
    }
    escaped = !escaped;
  }
  return escaped;
}
//# sourceMappingURL=sql.js.map
"use strict";
const _ = require("lodash");
const validator = _.cloneDeep(require("validator"));
const moment = require("moment");
const extensions = {
  extend(name, fn) {
    this[name] = fn;
    return this;
  },
  notEmpty(str) {
    return !str.match(/^[\s\t\r\n]*$/);
  },
  len(str, min, max) {
    return this.isLength(str, min, max);
  },
  isUrl(str) {
    return this.isURL(str);
  },
  isIPv6(str) {
    return this.isIP(str, 6);
  },
  isIPv4(str) {
    return this.isIP(str, 4);
  },
  notIn(str, values) {
    return !this.isIn(str, values);
  },
  regex(str, pattern, modifiers) {
    str += "";
    if (Object.prototype.toString.call(pattern).slice(8, -1) !== "RegExp") {
      pattern = new RegExp(pattern, modifiers);
    }
    return str.match(pattern);
  },
  notRegex(str, pattern, modifiers) {
    return !this.regex(str, pattern, modifiers);
  },
  isDecimal(str) {
    return str !== "" && !!str.match(/^(?:-?(?:[0-9]+))?(?:\.[0-9]*)?(?:[eE][+-]?(?:[0-9]+))?$/);
  },
  min(str, val) {
    const number = parseFloat(str);
    return isNaN(number) || number >= val;
  },
  max(str, val) {
    const number = parseFloat(str);
    return isNaN(number) || number <= val;
  },
  not(str, pattern, modifiers) {
    return this.notRegex(str, pattern, modifiers);
  },
  contains(str, elem) {
    return !!elem && str.includes(elem);
  },
  notContains(str, elem) {
    return !this.contains(str, elem);
  },
  is(str, pattern, modifiers) {
    return this.regex(str, pattern, modifiers);
  }
};
exports.extensions = extensions;
validator.isImmutable = function(value, validatorArgs, field, modelInstance) {
  return modelInstance.isNewRecord || modelInstance.dataValues[field] === modelInstance._previousDataValues[field];
};
validator.notNull = function(val) {
  return val !== null && val !== void 0;
};
_.forEach(extensions, (extend, key) => {
  validator[key] = extend;
});
validator.isNull = validator.isEmpty;
validator.isDate = function(dateString) {
  const parsed = Date.parse(dateString);
  if (isNaN(parsed)) {
    return false;
  }
  const date = new Date(parsed);
  return moment(date.toISOString()).isValid();
};
exports.validator = validator;
//# sourceMappingURL=validator-extras.js.map
var __defProp = Object.defineProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
__markAsModule(exports);
//# sourceMappingURL=falsy.js.map
var __defProp = Object.defineProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
__markAsModule(exports);
//# sourceMappingURL=sql-fragment.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
var __publicField = (obj, key, value) => {
  __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
  return value;
};
__export(exports, {
  default: () => aggregate_error_default
});
var import_base_error = __toModule(require("./base-error"));
class AggregateError extends import_base_error.default {
  constructor(errors) {
    super();
    __publicField(this, "errors");
    this.errors = errors;
    this.name = "AggregateError";
  }
  toString() {
    const message = `AggregateError of:
${this.errors.map((error) => error === this ? "[Circular AggregateError]" : error instanceof AggregateError ? String(error).replace(/\n$/, "").replace(/^/gm, "  ") : String(error).replace(/^/gm, "    ").substring(2)).join("\n")}
`;
    return message;
  }
}
var aggregate_error_default = AggregateError;
//# sourceMappingURL=aggregate-error.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
__export(exports, {
  default: () => association_error_default
});
var import_base_error = __toModule(require("./base-error"));
class AssociationError extends import_base_error.default {
  constructor(message) {
    super(message);
    this.name = "SequelizeAssociationError";
  }
}
var association_error_default = AssociationError;
//# sourceMappingURL=association-error.js.map
var __defProp = Object.defineProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
__export(exports, {
  default: () => base_error_default
});
class BaseError extends Error {
  constructor(message) {
    super(message);
    this.name = "SequelizeBaseError";
  }
}
var base_error_default = BaseError;
//# sourceMappingURL=base-error.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
var __publicField = (obj, key, value) => {
  __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
  return value;
};
__export(exports, {
  default: () => bulk_record_error_default
});
var import_base_error = __toModule(require("./base-error"));
class BulkRecordError extends import_base_error.default {
  constructor(error, record) {
    super(error.message);
    __publicField(this, "errors");
    __publicField(this, "record");
    this.name = "SequelizeBulkRecordError";
    this.errors = error;
    this.record = record;
  }
}
var bulk_record_error_default = BulkRecordError;
//# sourceMappingURL=bulk-record-error.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
var __publicField = (obj, key, value) => {
  __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
  return value;
};
__export(exports, {
  default: () => connection_error_default
});
var import_base_error = __toModule(require("./base-error"));
class ConnectionError extends import_base_error.default {
  constructor(parent) {
    super(parent ? parent.message : "");
    __publicField(this, "parent");
    __publicField(this, "original");
    this.name = "SequelizeConnectionError";
    this.parent = parent;
    this.original = parent;
  }
}
var connection_error_default = ConnectionError;
//# sourceMappingURL=connection-error.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
var __publicField = (obj, key, value) => {
  __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
  return value;
};
__export(exports, {
  default: () => database_error_default
});
var import_base_error = __toModule(require("./base-error"));
class DatabaseError extends import_base_error.default {
  constructor(parent, options = {}) {
    super(parent.message);
    __publicField(this, "parent");
    __publicField(this, "original");
    __publicField(this, "sql");
    __publicField(this, "parameters");
    var _a;
    this.name = "SequelizeDatabaseError";
    this.parent = parent;
    this.original = parent;
    this.sql = parent.sql;
    this.parameters = (_a = parent.parameters) != null ? _a : {};
    if (options.stack) {
      this.stack = options.stack;
    }
  }
}
var database_error_default = DatabaseError;
//# sourceMappingURL=database-error.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
__export(exports, {
  default: () => eager_loading_error_default
});
var import_base_error = __toModule(require("./base-error"));
class EagerLoadingError extends import_base_error.default {
  constructor(message) {
    super(message);
    this.name = "SequelizeEagerLoadingError";
  }
}
var eager_loading_error_default = EagerLoadingError;
//# sourceMappingURL=eager-loading-error.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
__export(exports, {
  default: () => empty_result_error_default
});
var import_base_error = __toModule(require("./base-error"));
class EmptyResultError extends import_base_error.default {
  constructor(message) {
    super(message);
    this.name = "SequelizeEmptyResultError";
  }
}
var empty_result_error_default = EmptyResultError;
//# sourceMappingURL=empty-result-error.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
__export(exports, {
  AccessDeniedError: () => import_access_denied_error.default,
  AggregateError: () => import_aggregate_error.default,
  AssociationError: () => import_association_error.default,
  AsyncQueueError: () => import_async_queue.AsyncQueueError,
  BaseError: () => import_base_error.default,
  BulkRecordError: () => import_bulk_record_error.default,
  ConnectionAcquireTimeoutError: () => import_connection_acquire_timeout_error.default,
  ConnectionError: () => import_connection_error.default,
  ConnectionRefusedError: () => import_connection_refused_error.default,
  ConnectionTimedOutError: () => import_connection_timed_out_error.default,
  DatabaseError: () => import_database_error.default,
  EagerLoadingError: () => import_eager_loading_error.default,
  EmptyResultError: () => import_empty_result_error.default,
  ExclusionConstraintError: () => import_exclusion_constraint_error.default,
  ForeignKeyConstraintError: () => import_foreign_key_constraint_error.default,
  HostNotFoundError: () => import_host_not_found_error.default,
  HostNotReachableError: () => import_host_not_reachable_error.default,
  InstanceError: () => import_instance_error.default,
  InvalidConnectionError: () => import_invalid_connection_error.default,
  OptimisticLockError: () => import_optimistic_lock_error.default,
  QueryError: () => import_query_error.default,
  SequelizeScopeError: () => import_sequelize_scope_error.default,
  TimeoutError: () => import_timeout_error.default,
  UniqueConstraintError: () => import_unique_constraint_error.default,
  UnknownConstraintError: () => import_unknown_constraint_error.default,
  ValidationError: () => import_validation_error.default,
  ValidationErrorItem: () => import_validation_error.ValidationErrorItem,
  ValidationErrorItemOrigin: () => import_validation_error.ValidationErrorItemOrigin,
  ValidationErrorItemType: () => import_validation_error.ValidationErrorItemType
});
var import_base_error = __toModule(require("./base-error"));
var import_database_error = __toModule(require("./database-error"));
var import_aggregate_error = __toModule(require("./aggregate-error"));
var import_association_error = __toModule(require("./association-error"));
var import_bulk_record_error = __toModule(require("./bulk-record-error"));
var import_connection_error = __toModule(require("./connection-error"));
var import_eager_loading_error = __toModule(require("./eager-loading-error"));
var import_empty_result_error = __toModule(require("./empty-result-error"));
var import_instance_error = __toModule(require("./instance-error"));
var import_optimistic_lock_error = __toModule(require("./optimistic-lock-error"));
var import_query_error = __toModule(require("./query-error"));
var import_sequelize_scope_error = __toModule(require("./sequelize-scope-error"));
var import_validation_error = __toModule(require("./validation-error"));
var import_access_denied_error = __toModule(require("./connection/access-denied-error"));
var import_connection_acquire_timeout_error = __toModule(require("./connection/connection-acquire-timeout-error"));
var import_connection_refused_error = __toModule(require("./connection/connection-refused-error"));
var import_connection_timed_out_error = __toModule(require("./connection/connection-timed-out-error"));
var import_host_not_found_error = __toModule(require("./connection/host-not-found-error"));
var import_host_not_reachable_error = __toModule(require("./connection/host-not-reachable-error"));
var import_invalid_connection_error = __toModule(require("./connection/invalid-connection-error"));
var import_exclusion_constraint_error = __toModule(require("./database/exclusion-constraint-error"));
var import_foreign_key_constraint_error = __toModule(require("./database/foreign-key-constraint-error"));
var import_timeout_error = __toModule(require("./database/timeout-error"));
var import_unknown_constraint_error = __toModule(require("./database/unknown-constraint-error"));
var import_unique_constraint_error = __toModule(require("./validation/unique-constraint-error"));
var import_async_queue = __toModule(require("../dialects/mssql/async-queue"));
//# sourceMappingURL=index.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
__export(exports, {
  default: () => instance_error_default
});
var import_base_error = __toModule(require("./base-error"));
class InstanceError extends import_base_error.default {
  constructor(message) {
    super(message);
    this.name = "SequelizeInstanceError";
  }
}
var instance_error_default = InstanceError;
//# sourceMappingURL=instance-error.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
var __publicField = (obj, key, value) => {
  __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
  return value;
};
__export(exports, {
  default: () => optimistic_lock_error_default
});
var import_base_error = __toModule(require("./base-error"));
class OptimisticLockError extends import_base_error.default {
  constructor(options) {
    options = options || {};
    options.message = options.message || `Attempting to update a stale model instance: ${options.modelName}`;
    super(options.message);
    __publicField(this, "modelName");
    __publicField(this, "values");
    __publicField(this, "where");
    this.name = "SequelizeOptimisticLockError";
    this.modelName = options.modelName;
    this.values = options.values;
    this.where = options.where;
  }
}
var optimistic_lock_error_default = OptimisticLockError;
//# sourceMappingURL=optimistic-lock-error.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
__export(exports, {
  default: () => query_error_default
});
var import_base_error = __toModule(require("./base-error"));
class QueryError extends import_base_error.default {
  constructor(message) {
    super(message);
    this.name = "SequelizeQueryError";
  }
}
var query_error_default = QueryError;
//# sourceMappingURL=query-error.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
__export(exports, {
  default: () => sequelize_scope_error_default
});
var import_base_error = __toModule(require("./base-error"));
class SequelizeScopeError extends import_base_error.default {
  constructor(message) {
    super(message);
    this.name = "SequelizeScopeError";
  }
}
var sequelize_scope_error_default = SequelizeScopeError;
//# sourceMappingURL=sequelize-scope-error.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
var __publicField = (obj, key, value) => {
  __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
  return value;
};
__export(exports, {
  ValidationErrorItem: () => ValidationErrorItem,
  ValidationErrorItemOrigin: () => ValidationErrorItemOrigin,
  ValidationErrorItemType: () => ValidationErrorItemType,
  default: () => validation_error_default
});
var import_base_error = __toModule(require("./base-error"));
var ValidationErrorItemType = /* @__PURE__ */ ((ValidationErrorItemType2) => {
  ValidationErrorItemType2["notnull violation"] = "CORE";
  ValidationErrorItemType2["string violation"] = "CORE";
  ValidationErrorItemType2["unique violation"] = "DB";
  ValidationErrorItemType2["validation error"] = "FUNCTION";
  return ValidationErrorItemType2;
})(ValidationErrorItemType || {});
var ValidationErrorItemOrigin = /* @__PURE__ */ ((ValidationErrorItemOrigin2) => {
  ValidationErrorItemOrigin2["CORE"] = "CORE";
  ValidationErrorItemOrigin2["DB"] = "DB";
  ValidationErrorItemOrigin2["FUNCTION"] = "FUNCTION";
  return ValidationErrorItemOrigin2;
})(ValidationErrorItemOrigin || {});
class ValidationErrorItem {
  constructor(message, type, path, value, instance, validatorKey, fnName, fnArgs) {
    __publicField(this, "message");
    __publicField(this, "type");
    __publicField(this, "path");
    __publicField(this, "value");
    __publicField(this, "origin");
    __publicField(this, "instance");
    __publicField(this, "validatorKey");
    __publicField(this, "validatorName");
    __publicField(this, "validatorArgs");
    this.message = message || "";
    this.type = null;
    this.path = path || null;
    this.value = value !== void 0 ? value : null;
    this.origin = null;
    this.instance = instance || null;
    this.validatorKey = validatorKey || null;
    this.validatorName = fnName || null;
    this.validatorArgs = fnArgs || [];
    if (type) {
      if (this.isValidationErrorItemOrigin(type)) {
        this.origin = type;
      } else {
        const lowercaseType = this.normalizeString(type);
        const realType = ValidationErrorItemType[lowercaseType];
        if (realType && ValidationErrorItemOrigin[realType]) {
          this.origin = realType;
          this.type = type;
        }
      }
    }
  }
  isValidationErrorItemOrigin(origin) {
    return ValidationErrorItemOrigin[origin] !== void 0;
  }
  normalizeString(str) {
    return str.toLowerCase().trim();
  }
  getValidatorKey(useTypeAsNS, NSSeparator) {
    const useTANS = useTypeAsNS === void 0 || !!useTypeAsNS;
    const NSSep = NSSeparator === void 0 ? "." : NSSeparator;
    const type = this.origin;
    const key = this.validatorKey || this.validatorName;
    const useNS = useTANS && type && ValidationErrorItemOrigin[type];
    if (useNS && (typeof NSSep !== "string" || !NSSep.length)) {
      throw new Error("Invalid namespace separator given, must be a non-empty string");
    }
    if (!(typeof key === "string" && key.length)) {
      return "";
    }
    return (useNS ? [this.origin, key].join(NSSep) : key).toLowerCase().trim();
  }
}
__publicField(ValidationErrorItem, "TypeStringMap", ValidationErrorItemType);
__publicField(ValidationErrorItem, "Origins", ValidationErrorItemOrigin);
class ValidationError extends import_base_error.default {
  constructor(message, errors, options = {}) {
    super(message);
    __publicField(this, "errors");
    this.name = "SequelizeValidationError";
    this.message = "Validation Error";
    this.errors = errors || [];
    if (message) {
      this.message = message;
    } else if (this.errors.length > 0 && this.errors[0].message) {
      this.message = this.errors.map((err) => `${err.type || err.origin}: ${err.message}`).join(",\n");
    }
    if (options.stack) {
      this.stack = options.stack;
    }
  }
  get(path) {
    return this.errors.reduce((reduced, error) => {
      if (error.path === path) {
        reduced.push(error);
      }
      return reduced;
    }, []);
  }
}
var validation_error_default = ValidationError;
//# sourceMappingURL=validation-error.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
var __publicField = (obj, key, value) => {
  __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
  return value;
};
__export(exports, {
  default: () => unique_constraint_error_default
});
var import_validation_error = __toModule(require("../validation-error"));
class UniqueConstraintError extends import_validation_error.default {
  constructor(options) {
    var _a, _b, _c;
    options = options != null ? options : {};
    options.parent = (_a = options.parent) != null ? _a : { sql: "", name: "", message: "" };
    options.message = options.message || options.parent.message || "Validation Error";
    options.errors = (_b = options.errors) != null ? _b : [];
    super(options.message, options.errors, { stack: options.stack });
    __publicField(this, "parent");
    __publicField(this, "original");
    __publicField(this, "fields");
    __publicField(this, "sql");
    this.name = "SequelizeUniqueConstraintError";
    this.fields = (_c = options.fields) != null ? _c : {};
    this.parent = options.parent;
    this.original = options.parent;
    this.sql = options.parent.sql;
  }
}
var unique_constraint_error_default = UniqueConstraintError;
//# sourceMappingURL=unique-constraint-error.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
var __publicField = (obj, key, value) => {
  __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
  return value;
};
__export(exports, {
  default: () => exclusion_constraint_error_default
});
var import_database_error = __toModule(require("../database-error"));
class ExclusionConstraintError extends import_database_error.default {
  constructor(options) {
    options = options || {};
    options.parent = options.parent || { sql: "", name: "", message: "" };
    super(options.parent, { stack: options.stack });
    __publicField(this, "constraint");
    __publicField(this, "fields");
    __publicField(this, "table");
    this.name = "SequelizeExclusionConstraintError";
    this.message = options.message || options.parent.message || "";
    this.constraint = options.constraint;
    this.fields = options.fields;
    this.table = options.table;
  }
}
var exclusion_constraint_error_default = ExclusionConstraintError;
//# sourceMappingURL=exclusion-constraint-error.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
var __publicField = (obj, key, value) => {
  __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
  return value;
};
__export(exports, {
  RelationshipType: () => RelationshipType,
  default: () => foreign_key_constraint_error_default
});
var import_database_error = __toModule(require("../database-error"));
var RelationshipType = /* @__PURE__ */ ((RelationshipType2) => {
  RelationshipType2["parent"] = "parent";
  RelationshipType2["child"] = "child";
  return RelationshipType2;
})(RelationshipType || {});
class ForeignKeyConstraintError extends import_database_error.default {
  constructor(options) {
    options = options || {};
    options.parent = options.parent || { sql: "", name: "", message: "" };
    super(options.parent, { stack: options.stack });
    __publicField(this, "table");
    __publicField(this, "fields");
    __publicField(this, "value");
    __publicField(this, "index");
    __publicField(this, "reltype");
    this.name = "SequelizeForeignKeyConstraintError";
    this.message = options.message || options.parent.message || "Database Error";
    this.fields = options.fields;
    this.table = options.table;
    this.value = options.value;
    this.index = options.index;
    this.reltype = options.reltype;
  }
}
var foreign_key_constraint_error_default = ForeignKeyConstraintError;
//# sourceMappingURL=foreign-key-constraint-error.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
__export(exports, {
  default: () => timeout_error_default
});
var import_database_error = __toModule(require("../database-error"));
class TimeoutError extends import_database_error.default {
  constructor(parent, options = {}) {
    super(parent, options);
    this.name = "SequelizeTimeoutError";
  }
}
var timeout_error_default = TimeoutError;
//# sourceMappingURL=timeout-error.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
var __publicField = (obj, key, value) => {
  __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
  return value;
};
__export(exports, {
  default: () => unknown_constraint_error_default
});
var import_database_error = __toModule(require("../database-error"));
class UnknownConstraintError extends import_database_error.default {
  constructor(options) {
    options = options || {};
    options.parent = options.parent || { sql: "", name: "", message: "" };
    super(options.parent, { stack: options.stack });
    __publicField(this, "constraint");
    __publicField(this, "fields");
    __publicField(this, "table");
    this.name = "SequelizeUnknownConstraintError";
    this.message = options.message || "The specified constraint does not exist";
    this.constraint = options.constraint;
    this.fields = options.fields;
    this.table = options.table;
  }
}
var unknown_constraint_error_default = UnknownConstraintError;
//# sourceMappingURL=unknown-constraint-error.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
__export(exports, {
  default: () => access_denied_error_default
});
var import_connection_error = __toModule(require("../connection-error"));
class AccessDeniedError extends import_connection_error.default {
  constructor(parent) {
    super(parent);
    this.name = "SequelizeAccessDeniedError";
  }
}
var access_denied_error_default = AccessDeniedError;
//# sourceMappingURL=access-denied-error.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
__export(exports, {
  default: () => connection_acquire_timeout_error_default
});
var import_connection_error = __toModule(require("../connection-error"));
class ConnectionAcquireTimeoutError extends import_connection_error.default {
  constructor(parent) {
    super(parent);
    this.name = "SequelizeConnectionAcquireTimeoutError";
  }
}
var connection_acquire_timeout_error_default = ConnectionAcquireTimeoutError;
//# sourceMappingURL=connection-acquire-timeout-error.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
__export(exports, {
  default: () => connection_refused_error_default
});
var import_connection_error = __toModule(require("../connection-error"));
class ConnectionRefusedError extends import_connection_error.default {
  constructor(parent) {
    super(parent);
    this.name = "SequelizeConnectionRefusedError";
  }
}
var connection_refused_error_default = ConnectionRefusedError;
//# sourceMappingURL=connection-refused-error.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
__export(exports, {
  default: () => connection_timed_out_error_default
});
var import_connection_error = __toModule(require("../connection-error"));
class ConnectionTimedOutError extends import_connection_error.default {
  constructor(parent) {
    super(parent);
    this.name = "SequelizeConnectionTimedOutError";
  }
}
var connection_timed_out_error_default = ConnectionTimedOutError;
//# sourceMappingURL=connection-timed-out-error.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
__export(exports, {
  default: () => host_not_found_error_default
});
var import_connection_error = __toModule(require("../connection-error"));
class HostNotFoundError extends import_connection_error.default {
  constructor(parent) {
    super(parent);
    this.name = "SequelizeHostNotFoundError";
  }
}
var host_not_found_error_default = HostNotFoundError;
//# sourceMappingURL=host-not-found-error.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
__export(exports, {
  default: () => host_not_reachable_error_default
});
var import_connection_error = __toModule(require("../connection-error"));
class HostNotReachableError extends import_connection_error.default {
  constructor(parent) {
    super(parent);
    this.name = "SequelizeHostNotReachableError";
  }
}
var host_not_reachable_error_default = HostNotReachableError;
//# sourceMappingURL=host-not-reachable-error.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
__export(exports, {
  default: () => invalid_connection_error_default
});
var import_connection_error = __toModule(require("../connection-error"));
class InvalidConnectionError extends import_connection_error.default {
  constructor(parent) {
    super(parent);
    this.name = "SequelizeInvalidConnectionError";
  }
}
var invalid_connection_error_default = InvalidConnectionError;
//# sourceMappingURL=invalid-connection-error.js.map
"use strict";
const stores = /* @__PURE__ */ new Map();
module.exports = (dialect) => {
  if (!stores.has(dialect)) {
    stores.set(dialect, /* @__PURE__ */ new Map());
  }
  return {
    clear() {
      stores.get(dialect).clear();
    },
    refresh(dataType) {
      for (const type of dataType.types[dialect]) {
        stores.get(dialect).set(type, dataType.parse);
      }
    },
    get(type) {
      return stores.get(dialect).get(type);
    }
  };
};
//# sourceMappingURL=parserStore.js.map
"use strict";
const fs = require("fs");
const path = require("path");
const AbstractConnectionManager = require("../abstract/connection-manager");
const { logger } = require("../../utils/logger");
const debug = logger.debugContext("connection:sqlite");
const dataTypes = require("../../data-types").sqlite;
const sequelizeErrors = require("../../errors");
const parserStore = require("../parserStore")("sqlite");
const { promisify } = require("util");
class ConnectionManager extends AbstractConnectionManager {
  constructor(dialect, sequelize) {
    super(dialect, sequelize);
    if (this.sequelize.options.host === "localhost") {
      delete this.sequelize.options.host;
    }
    this.connections = {};
    this.lib = this._loadDialectModule("sqlite3");
    this.refreshTypeParser(dataTypes);
  }
  async _onProcessExit() {
    await Promise.all(Object.getOwnPropertyNames(this.connections).map((connection) => promisify((callback) => this.connections[connection].close(callback))()));
    return super._onProcessExit.call(this);
  }
  _refreshTypeParser(dataType) {
    parserStore.refresh(dataType);
  }
  _clearTypeParser() {
    parserStore.clear();
  }
  async getConnection(options) {
    options = options || {};
    options.uuid = options.uuid || "default";
    if (!!this.sequelize.options.storage !== null && this.sequelize.options.storage !== void 0) {
      options.storage = this.sequelize.options.storage;
    } else {
      options.storage = this.sequelize.options.host || ":memory:";
    }
    options.inMemory = options.storage === ":memory:" ? 1 : 0;
    const dialectOptions = this.sequelize.options.dialectOptions;
    const defaultReadWriteMode = this.lib.OPEN_READWRITE | this.lib.OPEN_CREATE;
    options.readWriteMode = dialectOptions && dialectOptions.mode || defaultReadWriteMode;
    if (this.connections[options.inMemory || options.uuid]) {
      return this.connections[options.inMemory || options.uuid];
    }
    if (!options.inMemory && (options.readWriteMode & this.lib.OPEN_CREATE) !== 0) {
      fs.mkdirSync(path.dirname(options.storage), { recursive: true });
    }
    const connection = await new Promise((resolve, reject) => {
      this.connections[options.inMemory || options.uuid] = new this.lib.Database(options.storage, options.readWriteMode, (err) => {
        if (err)
          return reject(new sequelizeErrors.ConnectionError(err));
        debug(`connection acquired ${options.uuid}`);
        resolve(this.connections[options.inMemory || options.uuid]);
      });
    });
    if (this.sequelize.config.password) {
      connection.run(`PRAGMA KEY=${this.sequelize.escape(this.sequelize.config.password)}`);
    }
    if (this.sequelize.options.foreignKeys !== false) {
      connection.run("PRAGMA FOREIGN_KEYS=ON");
    }
    return connection;
  }
  releaseConnection(connection, force) {
    if (connection.filename === ":memory:" && force !== true)
      return;
    if (connection.uuid) {
      connection.close();
      debug(`connection released ${connection.uuid}`);
      delete this.connections[connection.uuid];
    }
  }
}
module.exports = ConnectionManager;
module.exports.ConnectionManager = ConnectionManager;
module.exports.default = ConnectionManager;
//# sourceMappingURL=connection-manager.js.map
"use strict";
module.exports = (BaseTypes) => {
  const warn = BaseTypes.ABSTRACT.warn.bind(void 0, "https://www.sqlite.org/datatype3.html");
  function removeUnsupportedIntegerOptions(dataType) {
    if (dataType._zerofill || dataType._unsigned) {
      warn(`SQLite does not support '${dataType.key}' with UNSIGNED or ZEROFILL. Plain '${dataType.key}' will be used instead.`);
      dataType._unsigned = void 0;
      dataType._zerofill = void 0;
    }
  }
  BaseTypes.DATE.types.sqlite = ["DATETIME"];
  BaseTypes.STRING.types.sqlite = ["VARCHAR", "VARCHAR BINARY"];
  BaseTypes.CHAR.types.sqlite = ["CHAR", "CHAR BINARY"];
  BaseTypes.TEXT.types.sqlite = ["TEXT"];
  BaseTypes.TINYINT.types.sqlite = ["TINYINT"];
  BaseTypes.SMALLINT.types.sqlite = ["SMALLINT"];
  BaseTypes.MEDIUMINT.types.sqlite = ["MEDIUMINT"];
  BaseTypes.INTEGER.types.sqlite = ["INTEGER"];
  BaseTypes.BIGINT.types.sqlite = ["BIGINT"];
  BaseTypes.FLOAT.types.sqlite = ["FLOAT"];
  BaseTypes.TIME.types.sqlite = ["TIME"];
  BaseTypes.DATEONLY.types.sqlite = ["DATE"];
  BaseTypes.BOOLEAN.types.sqlite = ["TINYINT"];
  BaseTypes.BLOB.types.sqlite = ["TINYBLOB", "BLOB", "LONGBLOB"];
  BaseTypes.DECIMAL.types.sqlite = ["DECIMAL"];
  BaseTypes.UUID.types.sqlite = ["UUID"];
  BaseTypes.ENUM.types.sqlite = false;
  BaseTypes.REAL.types.sqlite = ["REAL"];
  BaseTypes.DOUBLE.types.sqlite = ["DOUBLE PRECISION"];
  BaseTypes.GEOMETRY.types.sqlite = false;
  BaseTypes.JSON.types.sqlite = ["JSON", "JSONB"];
  class JSONTYPE extends BaseTypes.JSON {
    static parse(data) {
      return JSON.parse(data);
    }
  }
  class DATE extends BaseTypes.DATE {
    static parse(date, options) {
      if (!date.includes("+")) {
        return new Date(date + options.timezone);
      }
      return new Date(date);
    }
  }
  class DATEONLY extends BaseTypes.DATEONLY {
    static parse(date) {
      return date;
    }
  }
  class STRING extends BaseTypes.STRING {
    toSql() {
      if (this._binary) {
        return `VARCHAR BINARY(${this._length})`;
      }
      return super.toSql(this);
    }
  }
  class TEXT extends BaseTypes.TEXT {
    toSql() {
      if (this._length) {
        warn("SQLite does not support TEXT with options. Plain `TEXT` will be used instead.");
        this._length = void 0;
      }
      return "TEXT";
    }
  }
  class CITEXT extends BaseTypes.CITEXT {
    toSql() {
      return "TEXT COLLATE NOCASE";
    }
  }
  class CHAR extends BaseTypes.CHAR {
    toSql() {
      if (this._binary) {
        return `CHAR BINARY(${this._length})`;
      }
      return super.toSql();
    }
  }
  class NUMBER extends BaseTypes.NUMBER {
    toSql() {
      let result = this.key;
      if (this._unsigned) {
        result += " UNSIGNED";
      }
      if (this._zerofill) {
        result += " ZEROFILL";
      }
      if (this._length) {
        result += `(${this._length}`;
        if (typeof this._decimals === "number") {
          result += `,${this._decimals}`;
        }
        result += ")";
      }
      return result;
    }
  }
  class TINYINT extends BaseTypes.TINYINT {
    constructor(length) {
      super(length);
      removeUnsupportedIntegerOptions(this);
    }
  }
  class SMALLINT extends BaseTypes.SMALLINT {
    constructor(length) {
      super(length);
      removeUnsupportedIntegerOptions(this);
    }
  }
  class MEDIUMINT extends BaseTypes.MEDIUMINT {
    constructor(length) {
      super(length);
      removeUnsupportedIntegerOptions(this);
    }
  }
  class INTEGER extends BaseTypes.INTEGER {
    constructor(length) {
      super(length);
      removeUnsupportedIntegerOptions(this);
    }
  }
  class BIGINT extends BaseTypes.BIGINT {
    constructor(length) {
      super(length);
      removeUnsupportedIntegerOptions(this);
    }
  }
  class FLOAT extends BaseTypes.FLOAT {
  }
  class DOUBLE extends BaseTypes.DOUBLE {
  }
  class REAL extends BaseTypes.REAL {
  }
  function parseFloating(value) {
    if (typeof value !== "string") {
      return value;
    }
    if (value === "NaN") {
      return NaN;
    }
    if (value === "Infinity") {
      return Infinity;
    }
    if (value === "-Infinity") {
      return -Infinity;
    }
  }
  for (const floating of [FLOAT, DOUBLE, REAL]) {
    floating.parse = parseFloating;
  }
  for (const num of [FLOAT, DOUBLE, REAL, TINYINT, SMALLINT, MEDIUMINT, INTEGER, BIGINT]) {
    num.prototype.toSql = NUMBER.prototype.toSql;
  }
  class ENUM extends BaseTypes.ENUM {
    toSql() {
      return "TEXT";
    }
  }
  return {
    DATE,
    DATEONLY,
    STRING,
    CHAR,
    NUMBER,
    FLOAT,
    REAL,
    "DOUBLE PRECISION": DOUBLE,
    TINYINT,
    SMALLINT,
    MEDIUMINT,
    INTEGER,
    BIGINT,
    TEXT,
    ENUM,
    JSON: JSONTYPE,
    CITEXT
  };
};
//# sourceMappingURL=data-types.js.map
"use strict";
const _ = require("lodash");
const AbstractDialect = require("../abstract");
const ConnectionManager = require("./connection-manager");
const Query = require("./query");
const QueryGenerator = require("./query-generator");
const DataTypes = require("../../data-types").sqlite;
const { SQLiteQueryInterface } = require("./query-interface");
class SqliteDialect extends AbstractDialect {
  constructor(sequelize) {
    super();
    this.sequelize = sequelize;
    this.connectionManager = new ConnectionManager(this, sequelize);
    this.queryGenerator = new QueryGenerator({
      _dialect: this,
      sequelize
    });
    this.queryInterface = new SQLiteQueryInterface(sequelize, this.queryGenerator);
  }
}
SqliteDialect.prototype.supports = _.merge(_.cloneDeep(AbstractDialect.prototype.supports), {
  DEFAULT: false,
  "DEFAULT VALUES": true,
  "UNION ALL": false,
  "RIGHT JOIN": false,
  inserts: {
    ignoreDuplicates: " OR IGNORE",
    updateOnDuplicate: " ON CONFLICT DO UPDATE SET",
    conflictFields: true
  },
  index: {
    using: false,
    where: true,
    functionBased: true
  },
  transactionOptions: {
    type: true
  },
  constraints: {
    addConstraint: false,
    dropConstraint: false
  },
  groupedLimit: false,
  JSON: true
});
SqliteDialect.prototype.defaultVersion = "3.8.0";
SqliteDialect.prototype.Query = Query;
SqliteDialect.prototype.DataTypes = DataTypes;
SqliteDialect.prototype.name = "sqlite";
SqliteDialect.prototype.TICK_CHAR = "`";
SqliteDialect.prototype.TICK_CHAR_LEFT = SqliteDialect.prototype.TICK_CHAR;
SqliteDialect.prototype.TICK_CHAR_RIGHT = SqliteDialect.prototype.TICK_CHAR;
module.exports = SqliteDialect;
module.exports.SqliteDialect = SqliteDialect;
module.exports.default = SqliteDialect;
//# sourceMappingURL=index.js.map
"use strict";
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
const Utils = require("../../utils");
const Transaction = require("../../transaction");
const _ = require("lodash");
const MySqlQueryGenerator = require("../mysql/query-generator");
const AbstractQueryGenerator = require("../abstract/query-generator");
class SQLiteQueryGenerator extends MySqlQueryGenerator {
  createSchema() {
    return "SELECT name FROM `sqlite_master` WHERE type='table' and name!='sqlite_sequence';";
  }
  showSchemasQuery() {
    return "SELECT name FROM `sqlite_master` WHERE type='table' and name!='sqlite_sequence';";
  }
  versionQuery() {
    return "SELECT sqlite_version() as `version`";
  }
  createTableQuery(tableName, attributes, options) {
    options = options || {};
    const primaryKeys = [];
    const needsMultiplePrimaryKeys = Object.values(attributes).filter((definition) => definition.includes("PRIMARY KEY")).length > 1;
    const attrArray = [];
    for (const attr in attributes) {
      if (Object.prototype.hasOwnProperty.call(attributes, attr)) {
        const dataType = attributes[attr];
        const containsAutoIncrement = dataType.includes("AUTOINCREMENT");
        let dataTypeString = dataType;
        if (dataType.includes("PRIMARY KEY")) {
          if (dataType.includes("INT")) {
            dataTypeString = containsAutoIncrement ? "INTEGER PRIMARY KEY AUTOINCREMENT" : "INTEGER PRIMARY KEY";
            if (dataType.includes(" REFERENCES")) {
              dataTypeString += dataType.substr(dataType.indexOf(" REFERENCES"));
            }
          }
          if (needsMultiplePrimaryKeys) {
            primaryKeys.push(attr);
            if (dataType.includes("NOT NULL")) {
              dataTypeString = dataType.replace(" PRIMARY KEY", "");
            } else {
              dataTypeString = dataType.replace("PRIMARY KEY", "NOT NULL");
            }
          }
        }
        attrArray.push(`${this.quoteIdentifier(attr)} ${dataTypeString}`);
      }
    }
    const table = this.quoteTable(tableName);
    let attrStr = attrArray.join(", ");
    const pkString = primaryKeys.map((pk) => this.quoteIdentifier(pk)).join(", ");
    if (options.uniqueKeys) {
      _.each(options.uniqueKeys, (columns) => {
        if (columns.customIndex) {
          attrStr += `, UNIQUE (${columns.fields.map((field) => this.quoteIdentifier(field)).join(", ")})`;
        }
      });
    }
    if (pkString.length > 0) {
      attrStr += `, PRIMARY KEY (${pkString})`;
    }
    const sql = `CREATE TABLE IF NOT EXISTS ${table} (${attrStr});`;
    return this.replaceBooleanDefaults(sql);
  }
  booleanValue(value) {
    return value ? 1 : 0;
  }
  _checkValidJsonStatement(stmt) {
    if (typeof stmt !== "string") {
      return false;
    }
    const jsonFunctionRegex = /^\s*(json(?:_[a-z]+){0,2})\([^)]*\)/i;
    const tokenCaptureRegex = /^\s*((?:([`"'])(?:(?!\2).|\2{2})*\2)|[\w\d\s]+|[().,;+-])/i;
    let currentIndex = 0;
    let openingBrackets = 0;
    let closingBrackets = 0;
    let hasJsonFunction = false;
    let hasInvalidToken = false;
    while (currentIndex < stmt.length) {
      const string = stmt.substr(currentIndex);
      const functionMatches = jsonFunctionRegex.exec(string);
      if (functionMatches) {
        currentIndex += functionMatches[0].indexOf("(");
        hasJsonFunction = true;
        continue;
      }
      const tokenMatches = tokenCaptureRegex.exec(string);
      if (tokenMatches) {
        const capturedToken = tokenMatches[1];
        if (capturedToken === "(") {
          openingBrackets++;
        } else if (capturedToken === ")") {
          closingBrackets++;
        } else if (capturedToken === ";") {
          hasInvalidToken = true;
          break;
        }
        currentIndex += tokenMatches[0].length;
        continue;
      }
      break;
    }
    hasInvalidToken |= openingBrackets !== closingBrackets;
    if (hasJsonFunction && hasInvalidToken) {
      throw new Error(`Invalid json statement: ${stmt}`);
    }
    return hasJsonFunction;
  }
  _toJSONValue(value) {
    if (value instanceof Date) {
      return value.toISOString();
    }
    if (Array.isArray(value) && value[0] instanceof Date) {
      return value.map((val) => val.toISOString());
    }
    return value;
  }
  handleSequelizeMethod(smth, tableName, factory, options, prepend) {
    if (smth instanceof Utils.Json) {
      return super.handleSequelizeMethod(smth, tableName, factory, options, prepend);
    }
    if (smth instanceof Utils.Cast) {
      if (/timestamp/i.test(smth.type)) {
        smth.type = "datetime";
      }
    }
    return AbstractQueryGenerator.prototype.handleSequelizeMethod.call(this, smth, tableName, factory, options, prepend);
  }
  addColumnQuery(table, key, dataType) {
    const attributes = {};
    attributes[key] = dataType;
    const fields = this.attributesToSQL(attributes, { context: "addColumn" });
    const attribute = `${this.quoteIdentifier(key)} ${fields[key]}`;
    const sql = `ALTER TABLE ${this.quoteTable(table)} ADD ${attribute};`;
    return this.replaceBooleanDefaults(sql);
  }
  showTablesQuery() {
    return "SELECT name FROM `sqlite_master` WHERE type='table' and name!='sqlite_sequence';";
  }
  updateQuery(tableName, attrValueHash, where, options, attributes) {
    options = options || {};
    _.defaults(options, this.options);
    attrValueHash = Utils.removeNullValuesFromHash(attrValueHash, options.omitNull, options);
    const modelAttributeMap = {};
    const values = [];
    const bind = [];
    const bindParam = options.bindParam || this.bindParam(bind);
    if (attributes) {
      _.each(attributes, (attribute, key) => {
        modelAttributeMap[key] = attribute;
        if (attribute.field) {
          modelAttributeMap[attribute.field] = attribute;
        }
      });
    }
    for (const key in attrValueHash) {
      const value = attrValueHash[key];
      if (value instanceof Utils.SequelizeMethod || options.bindParam === false) {
        values.push(`${this.quoteIdentifier(key)}=${this.escape(value, modelAttributeMap && modelAttributeMap[key] || void 0, { context: "UPDATE" })}`);
      } else {
        values.push(`${this.quoteIdentifier(key)}=${this.format(value, modelAttributeMap && modelAttributeMap[key] || void 0, { context: "UPDATE" }, bindParam)}`);
      }
    }
    let query;
    const whereOptions = __spreadProps(__spreadValues({}, options), { bindParam });
    if (options.limit) {
      query = `UPDATE ${this.quoteTable(tableName)} SET ${values.join(",")} WHERE rowid IN (SELECT rowid FROM ${this.quoteTable(tableName)} ${this.whereQuery(where, whereOptions)} LIMIT ${this.escape(options.limit)})`;
    } else {
      query = `UPDATE ${this.quoteTable(tableName)} SET ${values.join(",")} ${this.whereQuery(where, whereOptions)}`;
    }
    return { query, bind };
  }
  truncateTableQuery(tableName, options = {}) {
    return [
      `DELETE FROM ${this.quoteTable(tableName)}`,
      options.restartIdentity ? `; DELETE FROM ${this.quoteTable("sqlite_sequence")} WHERE ${this.quoteIdentifier("name")} = ${Utils.addTicks(Utils.removeTicks(this.quoteTable(tableName), "`"), "'")};` : ""
    ].join("");
  }
  deleteQuery(tableName, where, options = {}, model) {
    _.defaults(options, this.options);
    let whereClause = this.getWhereConditions(where, null, model, options);
    if (whereClause) {
      whereClause = `WHERE ${whereClause}`;
    }
    if (options.limit) {
      whereClause = `WHERE rowid IN (SELECT rowid FROM ${this.quoteTable(tableName)} ${whereClause} LIMIT ${this.escape(options.limit)})`;
    }
    return `DELETE FROM ${this.quoteTable(tableName)} ${whereClause}`;
  }
  attributesToSQL(attributes) {
    const result = {};
    for (const name in attributes) {
      const dataType = attributes[name];
      const fieldName = dataType.field || name;
      if (_.isObject(dataType)) {
        let sql = dataType.type.toString();
        if (Object.prototype.hasOwnProperty.call(dataType, "allowNull") && !dataType.allowNull) {
          sql += " NOT NULL";
        }
        if (Utils.defaultValueSchemable(dataType.defaultValue)) {
          sql += ` DEFAULT ${this.escape(dataType.defaultValue, dataType)}`;
        }
        if (dataType.unique === true) {
          sql += " UNIQUE";
        }
        if (dataType.primaryKey) {
          sql += " PRIMARY KEY";
          if (dataType.autoIncrement) {
            sql += " AUTOINCREMENT";
          }
        }
        if (dataType.references) {
          const referencesTable = this.quoteTable(dataType.references.model);
          let referencesKey;
          if (dataType.references.key) {
            referencesKey = this.quoteIdentifier(dataType.references.key);
          } else {
            referencesKey = this.quoteIdentifier("id");
          }
          sql += ` REFERENCES ${referencesTable} (${referencesKey})`;
          if (dataType.onDelete) {
            sql += ` ON DELETE ${dataType.onDelete.toUpperCase()}`;
          }
          if (dataType.onUpdate) {
            sql += ` ON UPDATE ${dataType.onUpdate.toUpperCase()}`;
          }
        }
        result[fieldName] = sql;
      } else {
        result[fieldName] = dataType;
      }
    }
    return result;
  }
  showIndexesQuery(tableName) {
    return `PRAGMA INDEX_LIST(${this.quoteTable(tableName)})`;
  }
  showConstraintsQuery(tableName, constraintName) {
    let sql = `SELECT sql FROM sqlite_master WHERE tbl_name='${tableName}'`;
    if (constraintName) {
      sql += ` AND sql LIKE '%${constraintName}%'`;
    }
    return `${sql};`;
  }
  removeIndexQuery(tableName, indexNameOrAttributes) {
    let indexName = indexNameOrAttributes;
    if (typeof indexName !== "string") {
      indexName = Utils.underscore(`${tableName}_${indexNameOrAttributes.join("_")}`);
    }
    return `DROP INDEX IF EXISTS ${this.quoteIdentifier(indexName)}`;
  }
  describeTableQuery(tableName, schema, schemaDelimiter) {
    const table = {
      _schema: schema,
      _schemaDelimiter: schemaDelimiter,
      tableName
    };
    return `PRAGMA TABLE_INFO(${this.quoteTable(this.addSchema(table))});`;
  }
  describeCreateTableQuery(tableName) {
    return `SELECT sql FROM sqlite_master WHERE tbl_name='${tableName}';`;
  }
  removeColumnQuery(tableName, attributes) {
    attributes = this.attributesToSQL(attributes);
    let backupTableName;
    if (typeof tableName === "object") {
      backupTableName = {
        tableName: `${tableName.tableName}_backup`,
        schema: tableName.schema
      };
    } else {
      backupTableName = `${tableName}_backup`;
    }
    const quotedTableName = this.quoteTable(tableName);
    const quotedBackupTableName = this.quoteTable(backupTableName);
    const attributeNames = Object.keys(attributes).map((attr) => this.quoteIdentifier(attr)).join(", ");
    return `${this.createTableQuery(backupTableName, attributes)}INSERT INTO ${quotedBackupTableName} SELECT ${attributeNames} FROM ${quotedTableName};DROP TABLE ${quotedTableName};${this.createTableQuery(tableName, attributes)}INSERT INTO ${quotedTableName} SELECT ${attributeNames} FROM ${quotedBackupTableName};DROP TABLE ${quotedBackupTableName};`;
  }
  _alterConstraintQuery(tableName, attributes, createTableSql) {
    let backupTableName;
    attributes = this.attributesToSQL(attributes);
    if (typeof tableName === "object") {
      backupTableName = {
        tableName: `${tableName.tableName}_backup`,
        schema: tableName.schema
      };
    } else {
      backupTableName = `${tableName}_backup`;
    }
    const quotedTableName = this.quoteTable(tableName);
    const quotedBackupTableName = this.quoteTable(backupTableName);
    const attributeNames = Object.keys(attributes).map((attr) => this.quoteIdentifier(attr)).join(", ");
    return `${createTableSql.replace(`CREATE TABLE ${quotedTableName}`, `CREATE TABLE ${quotedBackupTableName}`).replace(`CREATE TABLE ${quotedTableName.replace(/`/g, '"')}`, `CREATE TABLE ${quotedBackupTableName}`)}INSERT INTO ${quotedBackupTableName} SELECT ${attributeNames} FROM ${quotedTableName};DROP TABLE ${quotedTableName};ALTER TABLE ${quotedBackupTableName} RENAME TO ${quotedTableName};`;
  }
  renameColumnQuery(tableName, attrNameBefore, attrNameAfter, attributes) {
    let backupTableName;
    attributes = this.attributesToSQL(attributes);
    if (typeof tableName === "object") {
      backupTableName = {
        tableName: `${tableName.tableName}_backup`,
        schema: tableName.schema
      };
    } else {
      backupTableName = `${tableName}_backup`;
    }
    const quotedTableName = this.quoteTable(tableName);
    const quotedBackupTableName = this.quoteTable(backupTableName);
    const attributeNamesImport = Object.keys(attributes).map((attr) => attrNameAfter === attr ? `${this.quoteIdentifier(attrNameBefore)} AS ${this.quoteIdentifier(attr)}` : this.quoteIdentifier(attr)).join(", ");
    const attributeNamesExport = Object.keys(attributes).map((attr) => this.quoteIdentifier(attr)).join(", ");
    return `${this.createTableQuery(backupTableName, attributes)}INSERT INTO ${quotedBackupTableName} SELECT ${attributeNamesImport} FROM ${quotedTableName};DROP TABLE ${quotedTableName};${this.createTableQuery(tableName, attributes)}INSERT INTO ${quotedTableName} SELECT ${attributeNamesExport} FROM ${quotedBackupTableName};DROP TABLE ${quotedBackupTableName};`;
  }
  startTransactionQuery(transaction) {
    if (transaction.parent) {
      return `SAVEPOINT ${this.quoteIdentifier(transaction.name)};`;
    }
    return `BEGIN ${transaction.options.type} TRANSACTION;`;
  }
  setIsolationLevelQuery(value) {
    switch (value) {
      case Transaction.ISOLATION_LEVELS.REPEATABLE_READ:
        return "-- SQLite is not able to choose the isolation level REPEATABLE READ.";
      case Transaction.ISOLATION_LEVELS.READ_UNCOMMITTED:
        return "PRAGMA read_uncommitted = ON;";
      case Transaction.ISOLATION_LEVELS.READ_COMMITTED:
        return "PRAGMA read_uncommitted = OFF;";
      case Transaction.ISOLATION_LEVELS.SERIALIZABLE:
        return "-- SQLite's default isolation level is SERIALIZABLE. Nothing to do.";
      default:
        throw new Error(`Unknown isolation level: ${value}`);
    }
  }
  replaceBooleanDefaults(sql) {
    return sql.replace(/DEFAULT '?false'?/g, "DEFAULT 0").replace(/DEFAULT '?true'?/g, "DEFAULT 1");
  }
  getForeignKeysQuery(tableName) {
    return `PRAGMA foreign_key_list(${this.quoteTable(this.addSchema(tableName))})`;
  }
  tableExistsQuery(tableName) {
    return `SELECT name FROM sqlite_master WHERE type='table' AND name=${this.escape(this.addSchema(tableName))};`;
  }
  quoteIdentifier(identifier, force) {
    return Utils.addTicks(Utils.removeTicks(identifier, "`"), "`");
  }
}
module.exports = SQLiteQueryGenerator;
//# sourceMappingURL=query-generator.js.map
"use strict";
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
const sequelizeErrors = require("../../errors");
const QueryTypes = require("../../query-types");
const { QueryInterface } = require("../abstract/query-interface");
const { cloneDeep } = require("../../utils");
const _ = require("lodash");
class SQLiteQueryInterface extends QueryInterface {
  async removeColumn(tableName, attributeName, options) {
    options = options || {};
    const fields = await this.describeTable(tableName, options);
    delete fields[attributeName];
    const sql = this.queryGenerator.removeColumnQuery(tableName, fields);
    const subQueries = sql.split(";").filter((q) => q !== "");
    for (const subQuery of subQueries)
      await this.sequelize.query(`${subQuery};`, __spreadValues({ raw: true }, options));
  }
  async changeColumn(tableName, attributeName, dataTypeOrOptions, options) {
    options = options || {};
    const fields = await this.describeTable(tableName, options);
    Object.assign(fields[attributeName], this.normalizeAttribute(dataTypeOrOptions));
    const sql = this.queryGenerator.removeColumnQuery(tableName, fields);
    const subQueries = sql.split(";").filter((q) => q !== "");
    for (const subQuery of subQueries)
      await this.sequelize.query(`${subQuery};`, __spreadValues({ raw: true }, options));
  }
  async renameColumn(tableName, attrNameBefore, attrNameAfter, options) {
    options = options || {};
    const fields = await this.assertTableHasColumn(tableName, attrNameBefore, options);
    fields[attrNameAfter] = __spreadValues({}, fields[attrNameBefore]);
    delete fields[attrNameBefore];
    const sql = this.queryGenerator.renameColumnQuery(tableName, attrNameBefore, attrNameAfter, fields);
    const subQueries = sql.split(";").filter((q) => q !== "");
    for (const subQuery of subQueries)
      await this.sequelize.query(`${subQuery};`, __spreadValues({ raw: true }, options));
  }
  async removeConstraint(tableName, constraintName, options) {
    let createTableSql;
    const constraints = await this.showConstraint(tableName, constraintName);
    const constraint = constraints.find((constaint) => constaint.constraintName === constraintName);
    if (!constraint) {
      throw new sequelizeErrors.UnknownConstraintError({
        message: `Constraint ${constraintName} on table ${tableName} does not exist`,
        constraint: constraintName,
        table: tableName
      });
    }
    createTableSql = constraint.sql;
    constraint.constraintName = this.queryGenerator.quoteIdentifier(constraint.constraintName);
    let constraintSnippet = `, CONSTRAINT ${constraint.constraintName} ${constraint.constraintType} ${constraint.constraintCondition}`;
    if (constraint.constraintType === "FOREIGN KEY") {
      const referenceTableName = this.queryGenerator.quoteTable(constraint.referenceTableName);
      constraint.referenceTableKeys = constraint.referenceTableKeys.map((columnName) => this.queryGenerator.quoteIdentifier(columnName));
      const referenceTableKeys = constraint.referenceTableKeys.join(", ");
      constraintSnippet += ` REFERENCES ${referenceTableName} (${referenceTableKeys})`;
      constraintSnippet += ` ON UPDATE ${constraint.updateAction}`;
      constraintSnippet += ` ON DELETE ${constraint.deleteAction}`;
    }
    createTableSql = createTableSql.replace(constraintSnippet, "");
    createTableSql += ";";
    const fields = await this.describeTable(tableName, options);
    const sql = this.queryGenerator._alterConstraintQuery(tableName, fields, createTableSql);
    const subQueries = sql.split(";").filter((q) => q !== "");
    for (const subQuery of subQueries)
      await this.sequelize.query(`${subQuery};`, __spreadValues({ raw: true }, options));
  }
  async addConstraint(tableName, options) {
    if (!options.fields) {
      throw new Error("Fields must be specified through options.fields");
    }
    if (!options.type) {
      throw new Error("Constraint type must be specified through options.type");
    }
    options = cloneDeep(options);
    const constraintSnippet = this.queryGenerator.getConstraintSnippet(tableName, options);
    const describeCreateTableSql = this.queryGenerator.describeCreateTableQuery(tableName);
    const constraints = await this.sequelize.query(describeCreateTableSql, __spreadProps(__spreadValues({}, options), { type: QueryTypes.SELECT, raw: true }));
    let sql = constraints[0].sql;
    const index = sql.length - 1;
    const createTableSql = `${sql.substr(0, index)}, ${constraintSnippet})${sql.substr(index + 1)};`;
    const fields = await this.describeTable(tableName, options);
    sql = this.queryGenerator._alterConstraintQuery(tableName, fields, createTableSql);
    const subQueries = sql.split(";").filter((q) => q !== "");
    for (const subQuery of subQueries)
      await this.sequelize.query(`${subQuery};`, __spreadValues({ raw: true }, options));
  }
  async getForeignKeyReferencesForTable(tableName, options) {
    const database = this.sequelize.config.database;
    const query = this.queryGenerator.getForeignKeysQuery(tableName, database);
    const result = await this.sequelize.query(query, options);
    return result.map((row) => ({
      tableName,
      columnName: row.from,
      referencedTableName: row.table,
      referencedColumnName: row.to,
      tableCatalog: database,
      referencedTableCatalog: database
    }));
  }
  async dropAllTables(options) {
    options = options || {};
    const skip = options.skip || [];
    const tableNames = await this.showAllTables(options);
    await this.sequelize.query("PRAGMA foreign_keys = OFF", options);
    await this._dropAllTables(tableNames, skip, options);
    await this.sequelize.query("PRAGMA foreign_keys = ON", options);
  }
  async describeTable(tableName, options) {
    let schema = null;
    let schemaDelimiter = null;
    if (typeof options === "string") {
      schema = options;
    } else if (typeof options === "object" && options !== null) {
      schema = options.schema || null;
      schemaDelimiter = options.schemaDelimiter || null;
    }
    if (typeof tableName === "object" && tableName !== null) {
      schema = tableName.schema;
      tableName = tableName.tableName;
    }
    const sql = this.queryGenerator.describeTableQuery(tableName, schema, schemaDelimiter);
    options = __spreadProps(__spreadValues({}, options), { type: QueryTypes.DESCRIBE });
    const sqlIndexes = this.queryGenerator.showIndexesQuery(tableName);
    try {
      const data = await this.sequelize.query(sql, options);
      if (_.isEmpty(data)) {
        throw new Error(`No description found for "${tableName}" table. Check the table name and schema; remember, they _are_ case sensitive.`);
      }
      const indexes = await this.sequelize.query(sqlIndexes, options);
      for (const prop in data) {
        data[prop].unique = false;
      }
      for (const index of indexes) {
        for (const field of index.fields) {
          if (index.unique !== void 0) {
            data[field.attribute].unique = index.unique;
          }
        }
      }
      const foreignKeys = await this.getForeignKeyReferencesForTable(tableName, options);
      for (const foreignKey of foreignKeys) {
        data[foreignKey.columnName].references = {
          model: foreignKey.referencedTableName,
          key: foreignKey.referencedColumnName
        };
      }
      return data;
    } catch (e) {
      if (e.original && e.original.code === "ER_NO_SUCH_TABLE") {
        throw new Error(`No description found for "${tableName}" table. Check the table name and schema; remember, they _are_ case sensitive.`);
      }
      throw e;
    }
  }
}
exports.SQLiteQueryInterface = SQLiteQueryInterface;
//# sourceMappingURL=query-interface.js.map
"use strict";
const _ = require("lodash");
const Utils = require("../../utils");
const AbstractQuery = require("../abstract/query");
const QueryTypes = require("../../query-types");
const sequelizeErrors = require("../../errors");
const parserStore = require("../parserStore")("sqlite");
const { logger } = require("../../utils/logger");
const debug = logger.debugContext("sql:sqlite");
class Query extends AbstractQuery {
  getInsertIdField() {
    return "lastID";
  }
  static formatBindParameters(sql, values, dialect) {
    let bindParam;
    if (Array.isArray(values)) {
      bindParam = {};
      values.forEach((v, i) => {
        bindParam[`$${i + 1}`] = v;
      });
      sql = AbstractQuery.formatBindParameters(sql, values, dialect, { skipValueReplace: true })[0];
    } else {
      bindParam = {};
      if (typeof values === "object") {
        for (const k of Object.keys(values)) {
          bindParam[`$${k}`] = values[k];
        }
      }
      sql = AbstractQuery.formatBindParameters(sql, values, dialect, { skipValueReplace: true })[0];
    }
    return [sql, bindParam];
  }
  _collectModels(include, prefix) {
    const ret = {};
    if (include) {
      for (const _include of include) {
        let key;
        if (!prefix) {
          key = _include.as;
        } else {
          key = `${prefix}.${_include.as}`;
        }
        ret[key] = _include.model;
        if (_include.include) {
          _.merge(ret, this._collectModels(_include.include, key));
        }
      }
    }
    return ret;
  }
  _handleQueryResponse(metaData, columnTypes, err, results, errStack) {
    if (err) {
      err.sql = this.sql;
      throw this.formatError(err, errStack);
    }
    let result = this.instance;
    if (this.isInsertQuery(results, metaData) || this.isUpsertQuery()) {
      this.handleInsertQuery(results, metaData);
      if (!this.instance) {
        if (metaData.constructor.name === "Statement" && this.model && this.model.autoIncrementAttribute && this.model.autoIncrementAttribute === this.model.primaryKeyAttribute && this.model.rawAttributes[this.model.primaryKeyAttribute]) {
          const startId = metaData[this.getInsertIdField()] - metaData.changes + 1;
          result = [];
          for (let i = startId; i < startId + metaData.changes; i++) {
            result.push({ [this.model.rawAttributes[this.model.primaryKeyAttribute].field]: i });
          }
        } else {
          result = metaData[this.getInsertIdField()];
        }
      }
    }
    if (this.isShowTablesQuery()) {
      return results.map((row) => row.name);
    }
    if (this.isShowConstraintsQuery()) {
      result = results;
      if (results && results[0] && results[0].sql) {
        result = this.parseConstraintsFromSql(results[0].sql);
      }
      return result;
    }
    if (this.isSelectQuery()) {
      if (this.options.raw) {
        return this.handleSelectQuery(results);
      }
      const prefixes = this._collectModels(this.options.include);
      results = results.map((result2) => {
        return _.mapValues(result2, (value, name) => {
          let model;
          if (name.includes(".")) {
            const lastind = name.lastIndexOf(".");
            model = prefixes[name.substr(0, lastind)];
            name = name.substr(lastind + 1);
          } else {
            model = this.options.model;
          }
          const tableName = model.getTableName().toString().replace(/`/g, "");
          const tableTypes = columnTypes[tableName] || {};
          if (tableTypes && !(name in tableTypes)) {
            _.forOwn(model.rawAttributes, (attribute, key) => {
              if (name === key && attribute.field) {
                name = attribute.field;
                return false;
              }
            });
          }
          return Object.prototype.hasOwnProperty.call(tableTypes, name) ? this.applyParsers(tableTypes[name], value) : value;
        });
      });
      return this.handleSelectQuery(results);
    }
    if (this.isShowOrDescribeQuery()) {
      return results;
    }
    if (this.sql.includes("PRAGMA INDEX_LIST")) {
      return this.handleShowIndexesQuery(results);
    }
    if (this.sql.includes("PRAGMA INDEX_INFO")) {
      return results;
    }
    if (this.sql.includes("PRAGMA TABLE_INFO")) {
      result = {};
      let defaultValue;
      for (const _result of results) {
        if (_result.dflt_value === null) {
          defaultValue = void 0;
        } else if (_result.dflt_value === "NULL") {
          defaultValue = null;
        } else {
          defaultValue = _result.dflt_value;
        }
        result[_result.name] = {
          type: _result.type,
          allowNull: _result.notnull === 0,
          defaultValue,
          primaryKey: _result.pk !== 0
        };
        if (result[_result.name].type === "TINYINT(1)") {
          result[_result.name].defaultValue = { "0": false, "1": true }[result[_result.name].defaultValue];
        }
        if (typeof result[_result.name].defaultValue === "string") {
          result[_result.name].defaultValue = result[_result.name].defaultValue.replace(/'/g, "");
        }
      }
      return result;
    }
    if (this.sql.includes("PRAGMA foreign_keys;")) {
      return results[0];
    }
    if (this.sql.includes("PRAGMA foreign_keys")) {
      return results;
    }
    if (this.sql.includes("PRAGMA foreign_key_list")) {
      return results;
    }
    if ([QueryTypes.BULKUPDATE, QueryTypes.BULKDELETE].includes(this.options.type)) {
      return metaData.changes;
    }
    if (this.options.type === QueryTypes.VERSION) {
      return results[0].version;
    }
    if (this.options.type === QueryTypes.RAW) {
      return [results, metaData];
    }
    if (this.isUpsertQuery()) {
      return [result, null];
    }
    if (this.isUpdateQuery() || this.isInsertQuery()) {
      return [result, metaData.changes];
    }
    return result;
  }
  async run(sql, parameters) {
    const conn = this.connection;
    this.sql = sql;
    const method = this.getDatabaseMethod();
    const complete = this._logQuery(sql, debug, parameters);
    return new Promise((resolve, reject) => conn.serialize(async () => {
      const columnTypes = {};
      const errForStack = new Error();
      const executeSql = () => {
        if (sql.startsWith("-- ")) {
          return resolve();
        }
        const query = this;
        function afterExecute(executionError, results) {
          try {
            complete();
            resolve(query._handleQueryResponse(this, columnTypes, executionError, results, errForStack.stack));
            return;
          } catch (error) {
            reject(error);
          }
        }
        if (!parameters)
          parameters = [];
        conn[method](sql, parameters, afterExecute);
        return null;
      };
      if (this.getDatabaseMethod() === "all") {
        let tableNames = [];
        if (this.options && this.options.tableNames) {
          tableNames = this.options.tableNames;
        } else if (/FROM `(.*?)`/i.exec(this.sql)) {
          tableNames.push(/FROM `(.*?)`/i.exec(this.sql)[1]);
        }
        tableNames = tableNames.filter((tableName) => !(tableName in columnTypes) && tableName !== "sqlite_master");
        if (!tableNames.length) {
          return executeSql();
        }
        await Promise.all(tableNames.map((tableName) => new Promise((resolve2) => {
          tableName = tableName.replace(/`/g, "");
          columnTypes[tableName] = {};
          conn.all(`PRAGMA table_info(\`${tableName}\`)`, (err, results) => {
            if (!err) {
              for (const result of results) {
                columnTypes[tableName][result.name] = result.type;
              }
            }
            resolve2();
          });
        })));
      }
      return executeSql();
    }));
  }
  parseConstraintsFromSql(sql) {
    let constraints = sql.split("CONSTRAINT ");
    let referenceTableName, referenceTableKeys, updateAction, deleteAction;
    constraints.splice(0, 1);
    constraints = constraints.map((constraintSql) => {
      if (constraintSql.includes("REFERENCES")) {
        updateAction = constraintSql.match(/ON UPDATE (CASCADE|SET NULL|RESTRICT|NO ACTION|SET DEFAULT){1}/);
        deleteAction = constraintSql.match(/ON DELETE (CASCADE|SET NULL|RESTRICT|NO ACTION|SET DEFAULT){1}/);
        if (updateAction) {
          updateAction = updateAction[1];
        }
        if (deleteAction) {
          deleteAction = deleteAction[1];
        }
        const referencesRegex = /REFERENCES.+\((?:[^)(]+|\((?:[^)(]+|\([^)(]*\))*\))*\)/;
        const referenceConditions = constraintSql.match(referencesRegex)[0].split(" ");
        referenceTableName = Utils.removeTicks(referenceConditions[1]);
        let columnNames = referenceConditions[2];
        columnNames = columnNames.replace(/\(|\)/g, "").split(", ");
        referenceTableKeys = columnNames.map((column) => Utils.removeTicks(column));
      }
      const constraintCondition = constraintSql.match(/\((?:[^)(]+|\((?:[^)(]+|\([^)(]*\))*\))*\)/)[0];
      constraintSql = constraintSql.replace(/\(.+\)/, "");
      const constraint = constraintSql.split(" ");
      if (["PRIMARY", "FOREIGN"].includes(constraint[1])) {
        constraint[1] += " KEY";
      }
      return {
        constraintName: Utils.removeTicks(constraint[0]),
        constraintType: constraint[1],
        updateAction,
        deleteAction,
        sql: sql.replace(/"/g, "`"),
        constraintCondition,
        referenceTableName,
        referenceTableKeys
      };
    });
    return constraints;
  }
  applyParsers(type, value) {
    if (type.includes("(")) {
      type = type.substr(0, type.indexOf("("));
    }
    type = type.replace("UNSIGNED", "").replace("ZEROFILL", "");
    type = type.trim().toUpperCase();
    const parse = parserStore.get(type);
    if (value !== null && parse) {
      return parse(value, { timezone: this.sequelize.options.timezone });
    }
    return value;
  }
  formatError(err, errStack) {
    switch (err.code) {
      case "SQLITE_CONSTRAINT_UNIQUE":
      case "SQLITE_CONSTRAINT_PRIMARYKEY":
      case "SQLITE_CONSTRAINT_TRIGGER":
      case "SQLITE_CONSTRAINT_FOREIGNKEY":
      case "SQLITE_CONSTRAINT": {
        if (err.message.includes("FOREIGN KEY constraint failed")) {
          return new sequelizeErrors.ForeignKeyConstraintError({
            parent: err,
            stack: errStack
          });
        }
        let fields = [];
        let match = err.message.match(/columns (.*?) are/);
        if (match !== null && match.length >= 2) {
          fields = match[1].split(", ");
        } else {
          match = err.message.match(/UNIQUE constraint failed: (.*)/);
          if (match !== null && match.length >= 2) {
            fields = match[1].split(", ").map((columnWithTable) => columnWithTable.split(".")[1]);
          }
        }
        const errors = [];
        let message = "Validation error";
        for (const field of fields) {
          errors.push(new sequelizeErrors.ValidationErrorItem(this.getUniqueConstraintErrorMessage(field), "unique violation", field, this.instance && this.instance[field], this.instance, "not_unique"));
        }
        if (this.model) {
          _.forOwn(this.model.uniqueKeys, (constraint) => {
            if (_.isEqual(constraint.fields, fields) && !!constraint.msg) {
              message = constraint.msg;
              return false;
            }
          });
        }
        return new sequelizeErrors.UniqueConstraintError({ message, errors, parent: err, fields, stack: errStack });
      }
      case "SQLITE_BUSY":
        return new sequelizeErrors.TimeoutError(err, { stack: errStack });
      default:
        return new sequelizeErrors.DatabaseError(err, { stack: errStack });
    }
  }
  async handleShowIndexesQuery(data) {
    return Promise.all(data.reverse().map(async (item) => {
      item.fields = [];
      item.primary = false;
      item.unique = !!item.unique;
      item.constraintName = item.name;
      const columns = await this.run(`PRAGMA INDEX_INFO(\`${item.name}\`)`);
      for (const column of columns) {
        item.fields[column.seqno] = {
          attribute: column.name,
          length: void 0,
          order: void 0
        };
      }
      return item;
    }));
  }
  getDatabaseMethod() {
    if (this.isInsertQuery() || this.isUpdateQuery() || this.isUpsertQuery() || this.isBulkUpdateQuery() || this.sql.toLowerCase().includes("CREATE TEMPORARY TABLE".toLowerCase()) || this.options.type === QueryTypes.BULKDELETE) {
      return "run";
    }
    return "all";
  }
}
module.exports = Query;
module.exports.Query = Query;
module.exports.default = Query;
//# sourceMappingURL=query.js.map
var __defProp = Object.defineProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
__export(exports, {
  withSqliteForeignKeysOff: () => withSqliteForeignKeysOff
});
async function withSqliteForeignKeysOff(sequelize, options, cb) {
  try {
    await sequelize.query("PRAGMA foreign_keys = OFF", options);
    return await cb();
  } finally {
    await sequelize.query("PRAGMA foreign_keys = ON", options);
  }
}
//# sourceMappingURL=sqlite-utils.js.map
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
const AbstractConnectionManager = require("../abstract/connection-manager");
const SequelizeErrors = require("../../errors");
const { logger } = require("../../utils/logger");
const DataTypes = require("../../data-types").snowflake;
const debug = logger.debugContext("connection:snowflake");
const parserStore = require("../parserStore")("snowflake");
class ConnectionManager extends AbstractConnectionManager {
  constructor(dialect, sequelize) {
    sequelize.config.port = sequelize.config.port || 3306;
    super(dialect, sequelize);
    this.lib = this._loadDialectModule("snowflake-sdk");
    this.refreshTypeParser(DataTypes);
  }
  _refreshTypeParser(dataType) {
    parserStore.refresh(dataType);
  }
  _clearTypeParser() {
    parserStore.clear();
  }
  static _typecast(field, next) {
    if (parserStore.get(field.type)) {
      return parserStore.get(field.type)(field, this.sequelize.options, next);
    }
    return next();
  }
  async connect(config) {
    const connectionConfig = __spreadValues({
      account: config.host,
      username: config.username,
      password: config.password,
      database: config.database,
      warehouse: config.warehouse,
      role: config.role
    }, config.dialectOptions);
    try {
      const connection = await new Promise((resolve, reject) => {
        this.lib.createConnection(connectionConfig).connect((err, conn) => {
          if (err) {
            console.log(err);
            reject(err);
          } else {
            resolve(conn);
          }
        });
      });
      debug("connection acquired");
      if (!this.sequelize.config.keepDefaultTimezone) {
        const tzOffset = this.sequelize.options.timezone === "+00:00" ? "Etc/UTC" : this.sequelize.options.timezone;
        const isNamedTzOffset = /\//.test(tzOffset);
        if (isNamedTzOffset) {
          await new Promise((resolve, reject) => {
            connection.execute({
              sqlText: `ALTER SESSION SET timezone = '${tzOffset}'`,
              complete(err) {
                if (err) {
                  console.log(err);
                  reject(err);
                } else {
                  resolve();
                }
              }
            });
          });
        } else {
          throw Error("only support time zone name for snowflake!");
        }
      }
      return connection;
    } catch (err) {
      switch (err.code) {
        case "ECONNREFUSED":
          throw new SequelizeErrors.ConnectionRefusedError(err);
        case "ER_ACCESS_DENIED_ERROR":
          throw new SequelizeErrors.AccessDeniedError(err);
        case "ENOTFOUND":
          throw new SequelizeErrors.HostNotFoundError(err);
        case "EHOSTUNREACH":
          throw new SequelizeErrors.HostNotReachableError(err);
        case "EINVAL":
          throw new SequelizeErrors.InvalidConnectionError(err);
        default:
          throw new SequelizeErrors.ConnectionError(err);
      }
    }
  }
  async disconnect(connection) {
    if (!connection.isUp()) {
      debug("connection tried to disconnect but was already at CLOSED state");
      return;
    }
    return new Promise((resolve, reject) => {
      connection.destroy((err) => {
        if (err) {
          console.error(`Unable to disconnect: ${err.message}`);
          reject(err);
        } else {
          console.log(`Disconnected connection with id: ${connection.getId()}`);
          resolve(connection.getId());
        }
      });
    });
  }
  validate(connection) {
    return connection.isUp();
  }
}
module.exports = ConnectionManager;
module.exports.ConnectionManager = ConnectionManager;
module.exports.default = ConnectionManager;
//# sourceMappingURL=connection-manager.js.map
"use strict";
const momentTz = require("moment-timezone");
const moment = require("moment");
module.exports = (BaseTypes) => {
  BaseTypes.ABSTRACT.prototype.dialectTypes = "https://dev.snowflake.com/doc/refman/5.7/en/data-types.html";
  BaseTypes.DATE.types.snowflake = ["DATETIME"];
  BaseTypes.STRING.types.snowflake = ["VAR_STRING"];
  BaseTypes.CHAR.types.snowflake = ["STRING"];
  BaseTypes.TEXT.types.snowflake = ["BLOB"];
  BaseTypes.TINYINT.types.snowflake = ["TINY"];
  BaseTypes.SMALLINT.types.snowflake = ["SHORT"];
  BaseTypes.MEDIUMINT.types.snowflake = ["INT24"];
  BaseTypes.INTEGER.types.snowflake = ["LONG"];
  BaseTypes.BIGINT.types.snowflake = ["LONGLONG"];
  BaseTypes.FLOAT.types.snowflake = ["FLOAT"];
  BaseTypes.TIME.types.snowflake = ["TIME"];
  BaseTypes.DATEONLY.types.snowflake = ["DATE"];
  BaseTypes.BOOLEAN.types.snowflake = ["TINY"];
  BaseTypes.BLOB.types.snowflake = ["TINYBLOB", "BLOB", "LONGBLOB"];
  BaseTypes.DECIMAL.types.snowflake = ["NEWDECIMAL"];
  BaseTypes.UUID.types.snowflake = false;
  BaseTypes.ENUM.types.snowflake = false;
  BaseTypes.REAL.types.snowflake = ["DOUBLE"];
  BaseTypes.DOUBLE.types.snowflake = ["DOUBLE"];
  BaseTypes.GEOMETRY.types.snowflake = ["GEOMETRY"];
  BaseTypes.JSON.types.snowflake = ["JSON"];
  class DATE extends BaseTypes.DATE {
    toSql() {
      return "TIMESTAMP";
    }
    _stringify(date, options) {
      if (!moment.isMoment(date)) {
        date = this._applyTimezone(date, options);
      }
      if (this._length) {
        return date.format("YYYY-MM-DD HH:mm:ss.SSS");
      }
      return date.format("YYYY-MM-DD HH:mm:ss");
    }
    static parse(value, options) {
      value = value.string();
      if (value === null) {
        return value;
      }
      if (momentTz.tz.zone(options.timezone)) {
        value = momentTz.tz(value, options.timezone).toDate();
      } else {
        value = new Date(`${value} ${options.timezone}`);
      }
      return value;
    }
  }
  class DATEONLY extends BaseTypes.DATEONLY {
    static parse(value) {
      return value.string();
    }
  }
  class UUID extends BaseTypes.UUID {
    toSql() {
      return "VARCHAR(36)";
    }
  }
  class TEXT extends BaseTypes.TEXT {
    toSql() {
      return "TEXT";
    }
  }
  class BOOLEAN extends BaseTypes.BOOLEAN {
    toSql() {
      return "BOOLEAN";
    }
  }
  class JSONTYPE extends BaseTypes.JSON {
    _stringify(value, options) {
      return options.operation === "where" && typeof value === "string" ? value : JSON.stringify(value);
    }
  }
  return {
    TEXT,
    DATE,
    BOOLEAN,
    DATEONLY,
    UUID,
    JSON: JSONTYPE
  };
};
//# sourceMappingURL=data-types.js.map
"use strict";
const _ = require("lodash");
const AbstractDialect = require("../abstract");
const ConnectionManager = require("./connection-manager");
const Query = require("./query");
const QueryGenerator = require("./query-generator");
const DataTypes = require("../../data-types").snowflake;
const { SnowflakeQueryInterface } = require("./query-interface");
class SnowflakeDialect extends AbstractDialect {
  constructor(sequelize) {
    super();
    this.sequelize = sequelize;
    this.connectionManager = new ConnectionManager(this, sequelize);
    this.queryGenerator = new QueryGenerator({
      _dialect: this,
      sequelize
    });
    this.queryInterface = new SnowflakeQueryInterface(sequelize, this.queryGenerator);
  }
}
SnowflakeDialect.prototype.supports = _.merge(_.cloneDeep(AbstractDialect.prototype.supports), {
  "VALUES ()": true,
  "LIMIT ON UPDATE": true,
  lock: true,
  forShare: "LOCK IN SHARE MODE",
  settingIsolationLevelDuringTransaction: false,
  inserts: {
    ignoreDuplicates: " IGNORE",
    updateOnDuplicate: false
  },
  index: {
    collate: false,
    length: true,
    parser: true,
    type: true,
    using: 1
  },
  constraints: {
    dropConstraint: false,
    check: false
  },
  indexViaAlter: true,
  indexHints: true,
  NUMERIC: true,
  GEOMETRY: false,
  JSON: false,
  REGEXP: true,
  schemas: true
});
SnowflakeDialect.prototype.defaultVersion = "5.7.0";
SnowflakeDialect.prototype.Query = Query;
SnowflakeDialect.prototype.QueryGenerator = QueryGenerator;
SnowflakeDialect.prototype.DataTypes = DataTypes;
SnowflakeDialect.prototype.name = "snowflake";
SnowflakeDialect.prototype.TICK_CHAR = '"';
SnowflakeDialect.prototype.TICK_CHAR_LEFT = SnowflakeDialect.prototype.TICK_CHAR;
SnowflakeDialect.prototype.TICK_CHAR_RIGHT = SnowflakeDialect.prototype.TICK_CHAR;
module.exports = SnowflakeDialect;
//# sourceMappingURL=index.js.map
"use strict";
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
const _ = require("lodash");
const Utils = require("../../utils");
const AbstractQueryGenerator = require("../abstract/query-generator");
const util = require("util");
const Op = require("../../operators");
const JSON_FUNCTION_REGEX = /^\s*((?:[a-z]+_){0,2}jsonb?(?:_[a-z]+){0,2})\([^)]*\)/i;
const JSON_OPERATOR_REGEX = /^\s*(->>?|@>|<@|\?[|&]?|\|{2}|#-)/i;
const TOKEN_CAPTURE_REGEX = /^\s*((?:([`"'])(?:(?!\2).|\2{2})*\2)|[\w\d\s]+|[().,;+-])/i;
const FOREIGN_KEY_FIELDS = [
  "CONSTRAINT_NAME as constraint_name",
  "CONSTRAINT_NAME as constraintName",
  "CONSTRAINT_SCHEMA as constraintSchema",
  "CONSTRAINT_SCHEMA as constraintCatalog",
  "TABLE_NAME as tableName",
  "TABLE_SCHEMA as tableSchema",
  "TABLE_SCHEMA as tableCatalog",
  "COLUMN_NAME as columnName",
  "REFERENCED_TABLE_SCHEMA as referencedTableSchema",
  "REFERENCED_TABLE_SCHEMA as referencedTableCatalog",
  "REFERENCED_TABLE_NAME as referencedTableName",
  "REFERENCED_COLUMN_NAME as referencedColumnName"
].join(",");
const SNOWFLAKE_RESERVED_WORDS = "account,all,alter,and,any,as,between,by,case,cast,check,column,connect,connections,constraint,create,cross,current,current_date,current_time,current_timestamp,current_user,database,delete,distinct,drop,else,exists,false,following,for,from,full,grant,group,gscluster,having,ilike,in,increment,inner,insert,intersect,into,is,issue,join,lateral,left,like,localtime,localtimestamp,minus,natural,not,null,of,on,or,order,organization,qualify,regexp,revoke,right,rlike,row,rows,sample,schema,select,set,some,start,table,tablesample,then,to,trigger,true,try_cast,union,unique,update,using,values,view,when,whenever,where,with".split(",");
const typeWithoutDefault = /* @__PURE__ */ new Set(["BLOB", "TEXT", "GEOMETRY", "JSON"]);
class SnowflakeQueryGenerator extends AbstractQueryGenerator {
  constructor(options) {
    super(options);
    this.OperatorMap = __spreadProps(__spreadValues({}, this.OperatorMap), {
      [Op.regexp]: "REGEXP",
      [Op.notRegexp]: "NOT REGEXP"
    });
  }
  createDatabaseQuery(databaseName, options) {
    options = __spreadValues({
      charset: null,
      collate: null
    }, options);
    return Utils.joinSQLFragments([
      "CREATE DATABASE IF NOT EXISTS",
      this.quoteIdentifier(databaseName),
      options.charset && `DEFAULT CHARACTER SET ${this.escape(options.charset)}`,
      options.collate && `DEFAULT COLLATE ${this.escape(options.collate)}`,
      ";"
    ]);
  }
  dropDatabaseQuery(databaseName) {
    return `DROP DATABASE IF EXISTS ${this.quoteIdentifier(databaseName)};`;
  }
  createSchema() {
    return "SHOW TABLES";
  }
  showSchemasQuery() {
    return "SHOW TABLES";
  }
  versionQuery() {
    return "SELECT CURRENT_VERSION()";
  }
  createTableQuery(tableName, attributes, options) {
    options = __spreadValues({
      charset: null,
      rowFormat: null
    }, options);
    const primaryKeys = [];
    const foreignKeys = {};
    const attrStr = [];
    for (const attr in attributes) {
      if (!Object.prototype.hasOwnProperty.call(attributes, attr))
        continue;
      const dataType = attributes[attr];
      let match;
      if (dataType.includes("PRIMARY KEY")) {
        primaryKeys.push(attr);
        if (dataType.includes("REFERENCES")) {
          match = dataType.match(/^(.+) (REFERENCES.*)$/);
          attrStr.push(`${this.quoteIdentifier(attr)} ${match[1].replace("PRIMARY KEY", "")}`);
          foreignKeys[attr] = match[2];
        } else {
          attrStr.push(`${this.quoteIdentifier(attr)} ${dataType.replace("PRIMARY KEY", "")}`);
        }
      } else if (dataType.includes("REFERENCES")) {
        match = dataType.match(/^(.+) (REFERENCES.*)$/);
        attrStr.push(`${this.quoteIdentifier(attr)} ${match[1]}`);
        foreignKeys[attr] = match[2];
      } else {
        attrStr.push(`${this.quoteIdentifier(attr)} ${dataType}`);
      }
    }
    const table = this.quoteTable(tableName);
    let attributesClause = attrStr.join(", ");
    const pkString = primaryKeys.map((pk) => this.quoteIdentifier(pk)).join(", ");
    if (options.uniqueKeys) {
      _.each(options.uniqueKeys, (columns, indexName) => {
        if (columns.customIndex) {
          if (typeof indexName !== "string") {
            indexName = `uniq_${tableName}_${columns.fields.join("_")}`;
          }
          attributesClause += `, UNIQUE ${this.quoteIdentifier(indexName)} (${columns.fields.map((field) => this.quoteIdentifier(field)).join(", ")})`;
        }
      });
    }
    if (pkString.length > 0) {
      attributesClause += `, PRIMARY KEY (${pkString})`;
    }
    for (const fkey in foreignKeys) {
      if (Object.prototype.hasOwnProperty.call(foreignKeys, fkey)) {
        attributesClause += `, FOREIGN KEY (${this.quoteIdentifier(fkey)}) ${foreignKeys[fkey]}`;
      }
    }
    return Utils.joinSQLFragments([
      "CREATE TABLE IF NOT EXISTS",
      table,
      `(${attributesClause})`,
      options.comment && typeof options.comment === "string" && `COMMENT ${this.escape(options.comment)}`,
      options.charset && `DEFAULT CHARSET=${options.charset}`,
      options.collate && `COLLATE ${options.collate}`,
      options.rowFormat && `ROW_FORMAT=${options.rowFormat}`,
      ";"
    ]);
  }
  describeTableQuery(tableName, schema, schemaDelimiter) {
    const table = this.quoteTable(this.addSchema({
      tableName,
      _schema: schema,
      _schemaDelimiter: schemaDelimiter
    }));
    return `SHOW FULL COLUMNS FROM ${table};`;
  }
  showTablesQuery(database) {
    return Utils.joinSQLFragments([
      "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'",
      database ? `AND TABLE_SCHEMA = ${this.escape(database)}` : "AND TABLE_SCHEMA NOT IN ( 'INFORMATION_SCHEMA', 'PERFORMANCE_SCHEMA', 'SYS')",
      ";"
    ]);
  }
  addColumnQuery(table, key, dataType) {
    return Utils.joinSQLFragments([
      "ALTER TABLE",
      this.quoteTable(table),
      "ADD",
      this.quoteIdentifier(key),
      this.attributeToSQL(dataType, {
        context: "addColumn",
        tableName: table,
        foreignKey: key
      }),
      ";"
    ]);
  }
  removeColumnQuery(tableName, attributeName) {
    return Utils.joinSQLFragments([
      "ALTER TABLE",
      this.quoteTable(tableName),
      "DROP",
      this.quoteIdentifier(attributeName),
      ";"
    ]);
  }
  changeColumnQuery(tableName, attributes) {
    const query = (...subQuerys) => Utils.joinSQLFragments([
      "ALTER TABLE",
      this.quoteTable(tableName),
      "ALTER COLUMN",
      ...subQuerys,
      ";"
    ]);
    const sql = [];
    for (const attributeName in attributes) {
      let definition = this.dataTypeMapping(tableName, attributeName, attributes[attributeName]);
      const attrSql = [];
      if (definition.includes("NOT NULL")) {
        attrSql.push(query(this.quoteIdentifier(attributeName), "SET NOT NULL"));
        definition = definition.replace("NOT NULL", "").trim();
      } else if (!definition.includes("REFERENCES")) {
        attrSql.push(query(this.quoteIdentifier(attributeName), "DROP NOT NULL"));
      }
      if (definition.includes("DEFAULT")) {
        attrSql.push(query(this.quoteIdentifier(attributeName), "SET DEFAULT", definition.match(/DEFAULT ([^;]+)/)[1]));
        definition = definition.replace(/(DEFAULT[^;]+)/, "").trim();
      } else if (!definition.includes("REFERENCES")) {
        attrSql.push(query(this.quoteIdentifier(attributeName), "DROP DEFAULT"));
      }
      if (definition.match(/UNIQUE;*$/)) {
        definition = definition.replace(/UNIQUE;*$/, "");
        attrSql.push(query("ADD UNIQUE (", this.quoteIdentifier(attributeName), ")").replace("ALTER COLUMN", ""));
      }
      if (definition.includes("REFERENCES")) {
        definition = definition.replace(/.+?(?=REFERENCES)/, "");
        attrSql.push(query("ADD FOREIGN KEY (", this.quoteIdentifier(attributeName), ")", definition).replace("ALTER COLUMN", ""));
      } else {
        attrSql.push(query(this.quoteIdentifier(attributeName), "TYPE", definition));
      }
      sql.push(attrSql.join(""));
    }
    return sql.join("");
  }
  renameColumnQuery(tableName, attrBefore, attributes) {
    const attrString = [];
    for (const attrName in attributes) {
      const definition = attributes[attrName];
      attrString.push(`'${attrBefore}' '${attrName}' ${definition}`);
    }
    return Utils.joinSQLFragments([
      "ALTER TABLE",
      this.quoteTable(tableName),
      "RENAME COLUMN",
      attrString.join(" to "),
      ";"
    ]);
  }
  handleSequelizeMethod(attr, tableName, factory, options, prepend) {
    if (attr instanceof Utils.Json) {
      if (attr.conditions) {
        const conditions = this.parseConditionObject(attr.conditions).map((condition) => `${this.jsonPathExtractionQuery(condition.path[0], _.tail(condition.path))} = '${condition.value}'`);
        return conditions.join(" AND ");
      }
      if (attr.path) {
        let str;
        if (this._checkValidJsonStatement(attr.path)) {
          str = attr.path;
        } else {
          const paths = _.toPath(attr.path);
          const column = paths.shift();
          str = this.jsonPathExtractionQuery(column, paths);
        }
        if (attr.value) {
          str += util.format(" = %s", this.escape(attr.value));
        }
        return str;
      }
    } else if (attr instanceof Utils.Cast) {
      if (/timestamp/i.test(attr.type)) {
        attr.type = "datetime";
      } else if (attr.json && /boolean/i.test(attr.type)) {
        attr.type = "char";
      } else if (/double precision/i.test(attr.type) || /boolean/i.test(attr.type) || /integer/i.test(attr.type)) {
        attr.type = "decimal";
      } else if (/text/i.test(attr.type)) {
        attr.type = "char";
      }
    }
    return super.handleSequelizeMethod(attr, tableName, factory, options, prepend);
  }
  truncateTableQuery(tableName) {
    return Utils.joinSQLFragments([
      "TRUNCATE",
      this.quoteTable(tableName)
    ]);
  }
  deleteQuery(tableName, where, options = {}, model) {
    const table = this.quoteTable(tableName);
    let whereClause = this.getWhereConditions(where, null, model, options);
    const limit = options.limit && ` LIMIT ${this.escape(options.limit)}`;
    let primaryKeys = "";
    let primaryKeysSelection = "";
    if (whereClause) {
      whereClause = `WHERE ${whereClause}`;
    }
    if (limit) {
      if (!model) {
        throw new Error("Cannot LIMIT delete without a model.");
      }
      const pks = Object.values(model.primaryKeys).map((pk) => this.quoteIdentifier(pk.field)).join(",");
      primaryKeys = model.primaryKeyAttributes.length > 1 ? `(${pks})` : pks;
      primaryKeysSelection = pks;
      return Utils.joinSQLFragments([
        "DELETE FROM",
        table,
        "WHERE",
        primaryKeys,
        "IN (SELECT",
        primaryKeysSelection,
        "FROM",
        table,
        whereClause,
        limit,
        ")",
        ";"
      ]);
    }
    return Utils.joinSQLFragments([
      "DELETE FROM",
      table,
      whereClause,
      ";"
    ]);
  }
  showIndexesQuery() {
    return "SELECT '' FROM DUAL";
  }
  showConstraintsQuery(table, constraintName) {
    const tableName = table.tableName || table;
    const schemaName = table.schema;
    return Utils.joinSQLFragments([
      "SELECT CONSTRAINT_CATALOG AS constraintCatalog,",
      "CONSTRAINT_NAME AS constraintName,",
      "CONSTRAINT_SCHEMA AS constraintSchema,",
      "CONSTRAINT_TYPE AS constraintType,",
      "TABLE_NAME AS tableName,",
      "TABLE_SCHEMA AS tableSchema",
      "from INFORMATION_SCHEMA.TABLE_CONSTRAINTS",
      `WHERE table_name='${tableName}'`,
      constraintName && `AND constraint_name = '${constraintName}'`,
      schemaName && `AND TABLE_SCHEMA = '${schemaName}'`,
      ";"
    ]);
  }
  removeIndexQuery(tableName, indexNameOrAttributes) {
    let indexName = indexNameOrAttributes;
    if (typeof indexName !== "string") {
      indexName = Utils.underscore(`${tableName}_${indexNameOrAttributes.join("_")}`);
    }
    return Utils.joinSQLFragments([
      "DROP INDEX",
      this.quoteIdentifier(indexName),
      "ON",
      this.quoteTable(tableName),
      ";"
    ]);
  }
  attributeToSQL(attribute, options) {
    if (!_.isPlainObject(attribute)) {
      attribute = {
        type: attribute
      };
    }
    const attributeString = attribute.type.toString({ escape: this.escape.bind(this) });
    let template = attributeString;
    if (attribute.allowNull === false) {
      template += " NOT NULL";
    }
    if (attribute.autoIncrement) {
      template += " AUTOINCREMENT";
    }
    if (!typeWithoutDefault.has(attributeString) && attribute.type._binary !== true && Utils.defaultValueSchemable(attribute.defaultValue)) {
      template += ` DEFAULT ${this.escape(attribute.defaultValue)}`;
    }
    if (attribute.unique === true) {
      template += " UNIQUE";
    }
    if (attribute.primaryKey) {
      template += " PRIMARY KEY";
    }
    if (attribute.comment) {
      template += ` COMMENT ${this.escape(attribute.comment)}`;
    }
    if (attribute.first) {
      template += " FIRST";
    }
    if (attribute.after) {
      template += ` AFTER ${this.quoteIdentifier(attribute.after)}`;
    }
    if (attribute.references) {
      if (options && options.context === "addColumn" && options.foreignKey) {
        const attrName = this.quoteIdentifier(options.foreignKey);
        const fkName = this.quoteIdentifier(`${options.tableName}_${attrName}_foreign_idx`);
        template += `, ADD CONSTRAINT ${fkName} FOREIGN KEY (${attrName})`;
      }
      template += ` REFERENCES ${this.quoteTable(attribute.references.model)}`;
      if (attribute.references.key) {
        template += ` (${this.quoteIdentifier(attribute.references.key)})`;
      } else {
        template += ` (${this.quoteIdentifier("id")})`;
      }
      if (attribute.onDelete) {
        template += ` ON DELETE ${attribute.onDelete.toUpperCase()}`;
      }
      if (attribute.onUpdate) {
        template += ` ON UPDATE ${attribute.onUpdate.toUpperCase()}`;
      }
    }
    return template;
  }
  attributesToSQL(attributes, options) {
    const result = {};
    for (const key in attributes) {
      const attribute = attributes[key];
      result[attribute.field || key] = this.attributeToSQL(attribute, options);
    }
    return result;
  }
  _checkValidJsonStatement(stmt) {
    if (typeof stmt !== "string") {
      return false;
    }
    let currentIndex = 0;
    let openingBrackets = 0;
    let closingBrackets = 0;
    let hasJsonFunction = false;
    let hasInvalidToken = false;
    while (currentIndex < stmt.length) {
      const string = stmt.substr(currentIndex);
      const functionMatches = JSON_FUNCTION_REGEX.exec(string);
      if (functionMatches) {
        currentIndex += functionMatches[0].indexOf("(");
        hasJsonFunction = true;
        continue;
      }
      const operatorMatches = JSON_OPERATOR_REGEX.exec(string);
      if (operatorMatches) {
        currentIndex += operatorMatches[0].length;
        hasJsonFunction = true;
        continue;
      }
      const tokenMatches = TOKEN_CAPTURE_REGEX.exec(string);
      if (tokenMatches) {
        const capturedToken = tokenMatches[1];
        if (capturedToken === "(") {
          openingBrackets++;
        } else if (capturedToken === ")") {
          closingBrackets++;
        } else if (capturedToken === ";") {
          hasInvalidToken = true;
          break;
        }
        currentIndex += tokenMatches[0].length;
        continue;
      }
      break;
    }
    if (hasJsonFunction && (hasInvalidToken || openingBrackets !== closingBrackets)) {
      throw new Error(`Invalid json statement: ${stmt}`);
    }
    return hasJsonFunction;
  }
  dataTypeMapping(tableName, attr, dataType) {
    if (dataType.includes("PRIMARY KEY")) {
      dataType = dataType.replace("PRIMARY KEY", "");
    }
    if (dataType.includes("SERIAL")) {
      if (dataType.includes("BIGINT")) {
        dataType = dataType.replace("SERIAL", "BIGSERIAL");
        dataType = dataType.replace("BIGINT", "");
      } else if (dataType.includes("SMALLINT")) {
        dataType = dataType.replace("SERIAL", "SMALLSERIAL");
        dataType = dataType.replace("SMALLINT", "");
      } else {
        dataType = dataType.replace("INTEGER", "");
      }
      dataType = dataType.replace("NOT NULL", "");
    }
    return dataType;
  }
  getForeignKeysQuery(table, schemaName) {
    const tableName = table.tableName || table;
    return Utils.joinSQLFragments([
      "SELECT",
      FOREIGN_KEY_FIELDS,
      `FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME = '${tableName}'`,
      `AND CONSTRAINT_NAME!='PRIMARY' AND CONSTRAINT_SCHEMA='${schemaName}'`,
      "AND REFERENCED_TABLE_NAME IS NOT NULL",
      ";"
    ]);
  }
  getForeignKeyQuery(table, columnName) {
    const quotedSchemaName = table.schema ? wrapSingleQuote(table.schema) : "";
    const quotedTableName = wrapSingleQuote(table.tableName || table);
    const quotedColumnName = wrapSingleQuote(columnName);
    return Utils.joinSQLFragments([
      "SELECT",
      FOREIGN_KEY_FIELDS,
      "FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE",
      "WHERE (",
      [
        `REFERENCED_TABLE_NAME = ${quotedTableName}`,
        table.schema && `AND REFERENCED_TABLE_SCHEMA = ${quotedSchemaName}`,
        `AND REFERENCED_COLUMN_NAME = ${quotedColumnName}`
      ],
      ") OR (",
      [
        `TABLE_NAME = ${quotedTableName}`,
        table.schema && `AND TABLE_SCHEMA = ${quotedSchemaName}`,
        `AND COLUMN_NAME = ${quotedColumnName}`,
        "AND REFERENCED_TABLE_NAME IS NOT NULL"
      ],
      ")"
    ]);
  }
  dropForeignKeyQuery(tableName, foreignKey) {
    return Utils.joinSQLFragments([
      "ALTER TABLE",
      this.quoteTable(tableName),
      "DROP FOREIGN KEY",
      this.quoteIdentifier(foreignKey),
      ";"
    ]);
  }
  addLimitAndOffset(options) {
    let fragment = [];
    if (options.offset !== null && options.offset !== void 0 && options.offset !== 0) {
      fragment = fragment.concat([" LIMIT ", this.escape(options.limit), " OFFSET ", this.escape(options.offset)]);
    } else if (options.limit !== null && options.limit !== void 0) {
      fragment = [" LIMIT ", this.escape(options.limit)];
    }
    return fragment.join("");
  }
  quoteIdentifier(identifier, force) {
    const optForceQuote = force || false;
    const optQuoteIdentifiers = this.options.quoteIdentifiers !== false;
    const rawIdentifier = Utils.removeTicks(identifier, '"');
    if (optForceQuote === true || optQuoteIdentifiers !== false || identifier.includes(".") || identifier.includes("->") || SNOWFLAKE_RESERVED_WORDS.includes(rawIdentifier.toLowerCase())) {
      return Utils.addTicks(rawIdentifier, '"');
    }
    return rawIdentifier;
  }
}
function wrapSingleQuote(identifier) {
  return Utils.addTicks(identifier, "'");
}
module.exports = SnowflakeQueryGenerator;
//# sourceMappingURL=query-generator.js.map
"use strict";
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
const sequelizeErrors = require("../../errors");
const { QueryInterface } = require("../abstract/query-interface");
const QueryTypes = require("../../query-types");
class SnowflakeQueryInterface extends QueryInterface {
  async removeColumn(tableName, columnName, options) {
    options = options || {};
    const [results] = await this.sequelize.query(this.queryGenerator.getForeignKeyQuery(tableName.tableName ? tableName : {
      tableName,
      schema: this.sequelize.config.database
    }, columnName), __spreadValues({ raw: true }, options));
    if (results.length && results[0].constraint_name !== "PRIMARY") {
      await Promise.all(results.map((constraint) => this.sequelize.query(this.queryGenerator.dropForeignKeyQuery(tableName, constraint.constraint_name), __spreadValues({ raw: true }, options))));
    }
    return await this.sequelize.query(this.queryGenerator.removeColumnQuery(tableName, columnName), __spreadValues({ raw: true }, options));
  }
  async upsert(tableName, insertValues, updateValues, where, options) {
    options = __spreadValues({}, options);
    options.type = QueryTypes.UPSERT;
    options.updateOnDuplicate = Object.keys(updateValues);
    const model = options.model;
    const sql = this.queryGenerator.insertQuery(tableName, insertValues, model.rawAttributes, options);
    return await this.sequelize.query(sql, options);
  }
  async removeConstraint(tableName, constraintName, options) {
    const sql = this.queryGenerator.showConstraintsQuery(tableName.tableName ? tableName : {
      tableName,
      schema: this.sequelize.config.database
    }, constraintName);
    const constraints = await this.sequelize.query(sql, __spreadProps(__spreadValues({}, options), {
      type: this.sequelize.QueryTypes.SHOWCONSTRAINTS
    }));
    const constraint = constraints[0];
    let query;
    if (!constraint || !constraint.constraintType) {
      throw new sequelizeErrors.UnknownConstraintError({
        message: `Constraint ${constraintName} on table ${tableName} does not exist`,
        constraint: constraintName,
        table: tableName
      });
    }
    if (constraint.constraintType === "FOREIGN KEY") {
      query = this.queryGenerator.dropForeignKeyQuery(tableName, constraintName);
    } else {
      query = this.queryGenerator.removeIndexQuery(constraint.tableName, constraint.constraintName);
    }
    return await this.sequelize.query(query, options);
  }
}
exports.SnowflakeQueryInterface = SnowflakeQueryInterface;
//# sourceMappingURL=query-interface.js.map
"use strict";
const AbstractQuery = require("../abstract/query");
const sequelizeErrors = require("../../errors");
const _ = require("lodash");
const { logger } = require("../../utils/logger");
const ER_DUP_ENTRY = 1062;
const ER_DEADLOCK = 1213;
const ER_ROW_IS_REFERENCED = 1451;
const ER_NO_REFERENCED_ROW = 1452;
const debug = logger.debugContext("sql:snowflake");
class Query extends AbstractQuery {
  static formatBindParameters(sql, values, dialect) {
    const bindParam = [];
    const replacementFunc = (_match, key, values_) => {
      if (values_[key] !== void 0) {
        bindParam.push(values_[key]);
        return "?";
      }
      return void 0;
    };
    sql = AbstractQuery.formatBindParameters(sql, values, dialect, replacementFunc)[0];
    return [sql, bindParam.length > 0 ? bindParam : void 0];
  }
  async run(sql, parameters) {
    this.sql = sql;
    const { connection, options } = this;
    const showWarnings = this.sequelize.options.showWarnings || options.showWarnings;
    const complete = this._logQuery(sql, debug, parameters);
    if (parameters) {
      debug("parameters(%j)", parameters);
    }
    let results;
    try {
      results = await new Promise((resolve, reject) => {
        connection.execute({
          sqlText: sql,
          binds: parameters,
          complete(err, _stmt, rows) {
            if (err) {
              reject(err);
            } else {
              resolve(rows);
            }
          }
        });
      });
    } catch (error) {
      if (options.transaction && error.errno === ER_DEADLOCK) {
        try {
          await options.transaction.rollback();
        } catch (error_) {
        }
        options.transaction.finished = "rollback";
      }
      error.sql = sql;
      error.parameters = parameters;
      throw this.formatError(error);
    } finally {
      complete();
    }
    if (showWarnings && results && results.warningStatus > 0) {
      await this.logWarnings(results);
    }
    return this.formatResults(results);
  }
  formatResults(data) {
    let result = this.instance;
    if (this.isInsertQuery(data)) {
      this.handleInsertQuery(data);
      if (!this.instance) {
        if (data.constructor.name === "ResultSetHeader" && this.model && this.model.autoIncrementAttribute && this.model.autoIncrementAttribute === this.model.primaryKeyAttribute && this.model.rawAttributes[this.model.primaryKeyAttribute]) {
          const startId = data[this.getInsertIdField()];
          result = [];
          for (let i = startId; i < startId + data.affectedRows; i++) {
            result.push({ [this.model.rawAttributes[this.model.primaryKeyAttribute].field]: i });
          }
        } else {
          result = data[this.getInsertIdField()];
        }
      }
    }
    if (this.isSelectQuery()) {
      if (this.options.raw === false && this.sequelize.options.quoteIdentifiers === false) {
        const sfAttrMap = _.reduce(this.model.rawAttributes, (m, v, k) => {
          m[k.toUpperCase()] = k;
          return m;
        }, {});
        data = data.map((data2) => _.reduce(data2, (prev, value, key) => {
          if (value !== void 0 && sfAttrMap[key]) {
            prev[sfAttrMap[key]] = value;
            delete prev[key];
          }
          return prev;
        }, data2));
      }
      this.options.fieldMap = _.mapKeys(this.options.fieldMap, (v, k) => {
        return k.toUpperCase();
      });
      return this.handleSelectQuery(data);
    }
    if (this.isShowTablesQuery()) {
      return this.handleShowTablesQuery(data);
    }
    if (this.isDescribeQuery()) {
      result = {};
      for (const _result of data) {
        result[_result.Field] = {
          type: _result.Type.toUpperCase(),
          allowNull: _result.Null === "YES",
          defaultValue: _result.Default,
          primaryKey: _result.Key === "PRI",
          autoIncrement: Object.prototype.hasOwnProperty.call(_result, "Extra") && _result.Extra.toLowerCase() === "auto_increment",
          comment: _result.Comment ? _result.Comment : null
        };
      }
      return result;
    }
    if (this.isShowIndexesQuery()) {
      return this.handleShowIndexesQuery(data);
    }
    if (this.isCallQuery()) {
      return data[0];
    }
    if (this.isBulkUpdateQuery() || this.isBulkDeleteQuery()) {
      return data[0]["number of rows updated"];
    }
    if (this.isVersionQuery()) {
      return data[0].version;
    }
    if (this.isForeignKeysQuery()) {
      return data;
    }
    if (this.isUpsertQuery()) {
      return [result, data.affectedRows === 1];
    }
    if (this.isInsertQuery() || this.isUpdateQuery()) {
      return [result, data.affectedRows];
    }
    if (this.isShowConstraintsQuery()) {
      return data;
    }
    if (this.isRawQuery()) {
      return [data, data];
    }
    return result;
  }
  async logWarnings(results) {
    const warningResults = await this.run("SHOW WARNINGS");
    const warningMessage = `Snowflake Warnings (${this.connection.uuid || "default"}): `;
    const messages = [];
    for (const _warningRow of warningResults) {
      if (_warningRow === void 0 || typeof _warningRow[Symbol.iterator] !== "function") {
        continue;
      }
      for (const _warningResult of _warningRow) {
        if (Object.prototype.hasOwnProperty.call(_warningResult, "Message")) {
          messages.push(_warningResult.Message);
        } else {
          for (const _objectKey of _warningResult.keys()) {
            messages.push([_objectKey, _warningResult[_objectKey]].join(": "));
          }
        }
      }
    }
    this.sequelize.log(warningMessage + messages.join("; "), this.options);
    return results;
  }
  formatError(err) {
    const errCode = err.errno || err.code;
    switch (errCode) {
      case ER_DUP_ENTRY: {
        const match = err.message.match(/Duplicate entry '([\s\S]*)' for key '?((.|\s)*?)'?$/);
        let fields = {};
        let message = "Validation error";
        const values = match ? match[1].split("-") : void 0;
        const fieldKey = match ? match[2] : void 0;
        const fieldVal = match ? match[1] : void 0;
        const uniqueKey = this.model && this.model.uniqueKeys[fieldKey];
        if (uniqueKey) {
          if (uniqueKey.msg)
            message = uniqueKey.msg;
          fields = _.zipObject(uniqueKey.fields, values);
        } else {
          fields[fieldKey] = fieldVal;
        }
        const errors = [];
        _.forOwn(fields, (value, field) => {
          errors.push(new sequelizeErrors.ValidationErrorItem(this.getUniqueConstraintErrorMessage(field), "unique violation", field, value, this.instance, "not_unique"));
        });
        return new sequelizeErrors.UniqueConstraintError({ message, errors, parent: err, fields });
      }
      case ER_ROW_IS_REFERENCED:
      case ER_NO_REFERENCED_ROW: {
        const match = err.message.match(/CONSTRAINT ([`"])(.*)\1 FOREIGN KEY \(\1(.*)\1\) REFERENCES \1(.*)\1 \(\1(.*)\1\)/);
        const quoteChar = match ? match[1] : "`";
        const fields = match ? match[3].split(new RegExp(`${quoteChar}, *${quoteChar}`)) : void 0;
        return new sequelizeErrors.ForeignKeyConstraintError({
          reltype: String(errCode) === String(ER_ROW_IS_REFERENCED) ? "parent" : "child",
          table: match ? match[4] : void 0,
          fields,
          value: fields && fields.length && this.instance && this.instance[fields[0]] || void 0,
          index: match ? match[2] : void 0,
          parent: err
        });
      }
      default:
        return new sequelizeErrors.DatabaseError(err);
    }
  }
  handleShowIndexesQuery(data) {
    data = data.reduce((acc, item) => {
      if (!(item.Key_name in acc)) {
        acc[item.Key_name] = item;
        item.fields = [];
      }
      acc[item.Key_name].fields[item.Seq_in_index - 1] = {
        attribute: item.Column_name,
        length: item.Sub_part || void 0,
        order: item.Collation === "A" ? "ASC" : void 0
      };
      delete item.column_name;
      return acc;
    }, {});
    return _.map(data, (item) => ({
      primary: item.Key_name === "PRIMARY",
      fields: item.fields,
      name: item.Key_name,
      tableName: item.Table,
      unique: item.Non_unique !== 1,
      type: item.Index_type
    }));
  }
}
module.exports = Query;
module.exports.Query = Query;
module.exports.default = Query;
//# sourceMappingURL=query.js.map
"use strict";
const _ = require("lodash");
const AbstractConnectionManager = require("../abstract/connection-manager");
const { logger } = require("../../utils/logger");
const debug = logger.debugContext("connection:pg");
const sequelizeErrors = require("../../errors");
const semver = require("semver");
const dataTypes = require("../../data-types");
const momentTz = require("moment-timezone");
const { promisify } = require("util");
class ConnectionManager extends AbstractConnectionManager {
  constructor(dialect, sequelize) {
    sequelize.config.port = sequelize.config.port || 5432;
    super(dialect, sequelize);
    const pgLib = this._loadDialectModule("pg");
    this.lib = this.sequelize.config.native ? pgLib.native : pgLib;
    this._clearDynamicOIDs();
    this._clearTypeParser();
    this.refreshTypeParser(dataTypes.postgres);
  }
  _refreshTypeParser(dataType) {
    const arrayParserBuilder = (parser2) => {
      return (value) => this.lib.types.arrayParser.create(value, parser2).parse();
    };
    const rangeParserBuilder = (parser2) => {
      return (value) => dataType.parse(value, { parser: parser2 });
    };
    if (dataType.key.toLowerCase() === "range") {
      for (const name in this.nameOidMap) {
        const entry = this.nameOidMap[name];
        if (!entry.rangeOid)
          continue;
        const rangeParser = rangeParserBuilder(this.getTypeParser(entry.oid));
        const arrayRangeParser = arrayParserBuilder(rangeParser);
        this.oidParserMap.set(entry.rangeOid, rangeParser);
        if (!entry.arrayRangeOid)
          continue;
        this.oidParserMap.set(entry.arrayRangeOid, arrayRangeParser);
      }
      return;
    }
    const parser = (value) => dataType.parse(value);
    const arrayParser = arrayParserBuilder(parser);
    if (dataType.key.toLowerCase() === "enum") {
      this.enumOids.oids.forEach((oid) => {
        this.oidParserMap.set(oid, parser);
      });
      this.enumOids.arrayOids.forEach((arrayOid) => {
        this.oidParserMap.set(arrayOid, arrayParser);
      });
      return;
    }
    dataType.types.postgres.forEach((name) => {
      if (!this.nameOidMap[name])
        return;
      this.oidParserMap.set(this.nameOidMap[name].oid, parser);
      if (!this.nameOidMap[name].arrayOid)
        return;
      this.oidParserMap.set(this.nameOidMap[name].arrayOid, arrayParser);
    });
  }
  _clearTypeParser() {
    this.oidParserMap = /* @__PURE__ */ new Map();
  }
  getTypeParser(oid, ...args) {
    if (this.oidParserMap.get(oid))
      return this.oidParserMap.get(oid);
    return this.lib.types.getTypeParser(oid, ...args);
  }
  async connect(config) {
    config.user = config.username;
    const connectionConfig = _.pick(config, [
      "user",
      "password",
      "host",
      "database",
      "port"
    ]);
    connectionConfig.types = {
      getTypeParser: ConnectionManager.prototype.getTypeParser.bind(this)
    };
    if (config.dialectOptions) {
      _.merge(connectionConfig, _.pick(config.dialectOptions, [
        "application_name",
        "ssl",
        "client_encoding",
        "binary",
        "keepAlive",
        "statement_timeout",
        "query_timeout",
        "idle_in_transaction_session_timeout",
        "options"
      ]));
    }
    const connection = await new Promise((resolve, reject) => {
      let responded = false;
      const connection2 = new this.lib.Client(connectionConfig);
      const parameterHandler = (message) => {
        switch (message.parameterName) {
          case "server_version":
            if (this.sequelize.options.databaseVersion === 0) {
              const version = semver.coerce(message.parameterValue).version;
              this.sequelize.options.databaseVersion = semver.valid(version) ? version : this.dialect.defaultVersion;
            }
            break;
          case "standard_conforming_strings":
            connection2["standard_conforming_strings"] = message.parameterValue;
            break;
        }
      };
      const endHandler = () => {
        debug("connection timeout");
        if (!responded) {
          reject(new sequelizeErrors.ConnectionTimedOutError(new Error("Connection timed out")));
        }
      };
      connection2.once("end", endHandler);
      if (!this.sequelize.config.native) {
        connection2.connection.on("parameterStatus", parameterHandler);
      }
      connection2.connect((err) => {
        responded = true;
        if (!this.sequelize.config.native) {
          connection2.connection.removeListener("parameterStatus", parameterHandler);
        }
        if (err) {
          if (err.code) {
            switch (err.code) {
              case "ECONNREFUSED":
                reject(new sequelizeErrors.ConnectionRefusedError(err));
                break;
              case "ENOTFOUND":
                reject(new sequelizeErrors.HostNotFoundError(err));
                break;
              case "EHOSTUNREACH":
                reject(new sequelizeErrors.HostNotReachableError(err));
                break;
              case "EINVAL":
                reject(new sequelizeErrors.InvalidConnectionError(err));
                break;
              default:
                reject(new sequelizeErrors.ConnectionError(err));
                break;
            }
          } else {
            reject(new sequelizeErrors.ConnectionError(err));
          }
        } else {
          debug("connection acquired");
          connection2.removeListener("end", endHandler);
          resolve(connection2);
        }
      });
    });
    connection.once("error", (error) => {
      connection._invalid = true;
      debug(`connection error ${error.code || error.message}`);
      this.pool.destroy(connection);
    });
    let query = "";
    if (this.sequelize.options.standardConformingStrings !== false && connection["standard_conforming_strings"] !== "on") {
      query += "SET standard_conforming_strings=on;";
    }
    if (this.sequelize.options.clientMinMessages !== void 0) {
      console.warn('Usage of "options.clientMinMessages" is deprecated and will be removed in v7.');
      console.warn('Please use the sequelize option "dialectOptions.clientMinMessages" instead.');
    }
    if (!(config.dialectOptions && config.dialectOptions.clientMinMessages && config.dialectOptions.clientMinMessages.toLowerCase() === "ignore" || this.sequelize.options.clientMinMessages === false)) {
      const clientMinMessages = config.dialectOptions && config.dialectOptions.clientMinMessages || this.sequelize.options.clientMinMessages || "warning";
      query += `SET client_min_messages TO ${clientMinMessages};`;
    }
    if (!this.sequelize.config.keepDefaultTimezone) {
      const isZone = !!momentTz.tz.zone(this.sequelize.options.timezone);
      if (isZone) {
        query += `SET TIME ZONE '${this.sequelize.options.timezone}';`;
      } else {
        query += `SET TIME ZONE INTERVAL '${this.sequelize.options.timezone}' HOUR TO MINUTE;`;
      }
    }
    if (query) {
      await connection.query(query);
    }
    if (Object.keys(this.nameOidMap).length === 0 && this.enumOids.oids.length === 0 && this.enumOids.arrayOids.length === 0) {
      await this._refreshDynamicOIDs(connection);
    }
    return connection;
  }
  async disconnect(connection) {
    if (connection._ending) {
      debug("connection tried to disconnect but was already at ENDING state");
      return;
    }
    return await promisify((callback) => connection.end(callback))();
  }
  validate(connection) {
    return !connection._invalid && !connection._ending;
  }
  async _refreshDynamicOIDs(connection) {
    const databaseVersion = this.sequelize.options.databaseVersion;
    const supportedVersion = "8.3.0";
    if ((databaseVersion && semver.gte(databaseVersion, supportedVersion)) === false) {
      return;
    }
    const results = await (connection || this.sequelize).query("WITH ranges AS (  SELECT pg_range.rngtypid, pg_type.typname AS rngtypname,         pg_type.typarray AS rngtyparray, pg_range.rngsubtype    FROM pg_range LEFT OUTER JOIN pg_type ON pg_type.oid = pg_range.rngtypid)SELECT pg_type.typname, pg_type.typtype, pg_type.oid, pg_type.typarray,       ranges.rngtypname, ranges.rngtypid, ranges.rngtyparray  FROM pg_type LEFT OUTER JOIN ranges ON pg_type.oid = ranges.rngsubtype WHERE (pg_type.typtype IN('b', 'e'));");
    let result = Array.isArray(results) ? results.pop() : results;
    if (Array.isArray(result)) {
      if (result[0].command === "SET") {
        result = result.pop();
      }
    }
    const newNameOidMap = {};
    const newEnumOids = { oids: [], arrayOids: [] };
    for (const row of result.rows) {
      if (row.typtype === "e") {
        newEnumOids.oids.push(row.oid);
        if (row.typarray)
          newEnumOids.arrayOids.push(row.typarray);
        continue;
      }
      newNameOidMap[row.typname] = { oid: row.oid };
      if (row.typarray)
        newNameOidMap[row.typname].arrayOid = row.typarray;
      if (row.rngtypid) {
        newNameOidMap[row.typname].rangeOid = row.rngtypid;
        if (row.rngtyparray)
          newNameOidMap[row.typname].arrayRangeOid = row.rngtyparray;
      }
    }
    this.nameOidMap = newNameOidMap;
    this.enumOids = newEnumOids;
    this.refreshTypeParser(dataTypes.postgres);
  }
  _clearDynamicOIDs() {
    this.nameOidMap = {};
    this.enumOids = { oids: [], arrayOids: [] };
  }
}
module.exports = ConnectionManager;
module.exports.ConnectionManager = ConnectionManager;
module.exports.default = ConnectionManager;
//# sourceMappingURL=connection-manager.js.map
"use strict";
const _ = require("lodash");
const wkx = require("wkx");
module.exports = (BaseTypes) => {
  const warn = BaseTypes.ABSTRACT.warn.bind(void 0, "http://www.postgresql.org/docs/9.4/static/datatype.html");
  function removeUnsupportedIntegerOptions(dataType) {
    if (dataType._length || dataType.options.length || dataType._unsigned || dataType._zerofill) {
      warn(`PostgresSQL does not support '${dataType.key}' with LENGTH, UNSIGNED or ZEROFILL. Plain '${dataType.key}' will be used instead.`);
      dataType._length = void 0;
      dataType.options.length = void 0;
      dataType._unsigned = void 0;
      dataType._zerofill = void 0;
    }
  }
  BaseTypes.UUID.types.postgres = ["uuid"];
  BaseTypes.CIDR.types.postgres = ["cidr"];
  BaseTypes.INET.types.postgres = ["inet"];
  BaseTypes.MACADDR.types.postgres = ["macaddr"];
  BaseTypes.TSVECTOR.types.postgres = ["tsvector"];
  BaseTypes.JSON.types.postgres = ["json"];
  BaseTypes.JSONB.types.postgres = ["jsonb"];
  BaseTypes.TIME.types.postgres = ["time"];
  class DATEONLY extends BaseTypes.DATEONLY {
    _stringify(value, options) {
      if (value === Infinity) {
        return "Infinity";
      }
      if (value === -Infinity) {
        return "-Infinity";
      }
      return super._stringify(value, options);
    }
    _sanitize(value, options) {
      if ((!options || options && !options.raw) && value !== Infinity && value !== -Infinity) {
        if (typeof value === "string") {
          const lower = value.toLowerCase();
          if (lower === "infinity") {
            return Infinity;
          }
          if (lower === "-infinity") {
            return -Infinity;
          }
        }
        return super._sanitize(value);
      }
      return value;
    }
    static parse(value) {
      if (value === "infinity") {
        return Infinity;
      }
      if (value === "-infinity") {
        return -Infinity;
      }
      return value;
    }
  }
  BaseTypes.DATEONLY.types.postgres = ["date"];
  class DECIMAL extends BaseTypes.DECIMAL {
    static parse(value) {
      return value;
    }
  }
  BaseTypes.DECIMAL.types.postgres = ["numeric"];
  class STRING extends BaseTypes.STRING {
    toSql() {
      if (this._binary) {
        return "BYTEA";
      }
      return super.toSql();
    }
  }
  BaseTypes.STRING.types.postgres = ["varchar"];
  class TEXT extends BaseTypes.TEXT {
    toSql() {
      if (this._length) {
        warn("PostgreSQL does not support TEXT with options. Plain `TEXT` will be used instead.");
        this._length = void 0;
      }
      return "TEXT";
    }
  }
  BaseTypes.TEXT.types.postgres = ["text"];
  class CITEXT extends BaseTypes.CITEXT {
    static parse(value) {
      return value;
    }
  }
  BaseTypes.CITEXT.types.postgres = ["citext"];
  class CHAR extends BaseTypes.CHAR {
    toSql() {
      if (this._binary) {
        return "BYTEA";
      }
      return super.toSql();
    }
  }
  BaseTypes.CHAR.types.postgres = ["char", "bpchar"];
  class BOOLEAN extends BaseTypes.BOOLEAN {
    toSql() {
      return "BOOLEAN";
    }
    _sanitize(value) {
      if (value !== null && value !== void 0) {
        if (Buffer.isBuffer(value) && value.length === 1) {
          value = value[0];
        }
        if (typeof value === "string") {
          return ["true", "t"].includes(value) ? true : ["false", "f"].includes(value) ? false : value;
        }
        if (typeof value === "number") {
          return value === 1 ? true : value === 0 ? false : value;
        }
      }
      return value;
    }
  }
  BOOLEAN.parse = BOOLEAN.prototype._sanitize;
  BaseTypes.BOOLEAN.types.postgres = ["bool"];
  class DATE extends BaseTypes.DATE {
    toSql() {
      return "TIMESTAMP WITH TIME ZONE";
    }
    validate(value) {
      if (value !== Infinity && value !== -Infinity) {
        return super.validate(value);
      }
      return true;
    }
    _stringify(value, options) {
      if (value === Infinity) {
        return "Infinity";
      }
      if (value === -Infinity) {
        return "-Infinity";
      }
      return super._stringify(value, options);
    }
    _sanitize(value, options) {
      if ((!options || options && !options.raw) && !(value instanceof Date) && !!value && value !== Infinity && value !== -Infinity) {
        if (typeof value === "string") {
          const lower = value.toLowerCase();
          if (lower === "infinity") {
            return Infinity;
          }
          if (lower === "-infinity") {
            return -Infinity;
          }
        }
        return new Date(value);
      }
      return value;
    }
  }
  BaseTypes.DATE.types.postgres = ["timestamptz"];
  class TINYINT extends BaseTypes.TINYINT {
    constructor(length) {
      super(length);
      removeUnsupportedIntegerOptions(this);
    }
  }
  BaseTypes.TINYINT.types.postgres = ["int2"];
  class SMALLINT extends BaseTypes.SMALLINT {
    constructor(length) {
      super(length);
      removeUnsupportedIntegerOptions(this);
    }
  }
  BaseTypes.SMALLINT.types.postgres = ["int2"];
  class INTEGER extends BaseTypes.INTEGER {
    constructor(length) {
      super(length);
      removeUnsupportedIntegerOptions(this);
    }
  }
  INTEGER.parse = function parse(value) {
    return parseInt(value, 10);
  };
  BaseTypes.INTEGER.types.postgres = ["int4"];
  class BIGINT extends BaseTypes.BIGINT {
    constructor(length) {
      super(length);
      removeUnsupportedIntegerOptions(this);
    }
  }
  BaseTypes.BIGINT.types.postgres = ["int8"];
  class REAL extends BaseTypes.REAL {
    constructor(length) {
      super(length);
      removeUnsupportedIntegerOptions(this);
    }
  }
  BaseTypes.REAL.types.postgres = ["float4"];
  class DOUBLE extends BaseTypes.DOUBLE {
    constructor(length) {
      super(length);
      removeUnsupportedIntegerOptions(this);
    }
  }
  BaseTypes.DOUBLE.types.postgres = ["float8"];
  class FLOAT extends BaseTypes.FLOAT {
    constructor(length, decimals) {
      super(length, decimals);
      if (this._decimals) {
        warn("PostgreSQL does not support FLOAT with decimals. Plain `FLOAT` will be used instead.");
        this._length = void 0;
        this.options.length = void 0;
        this._decimals = void 0;
      }
      if (this._unsigned) {
        warn("PostgreSQL does not support FLOAT unsigned. `UNSIGNED` was removed.");
        this._unsigned = void 0;
      }
      if (this._zerofill) {
        warn("PostgreSQL does not support FLOAT zerofill. `ZEROFILL` was removed.");
        this._zerofill = void 0;
      }
    }
  }
  delete FLOAT.parse;
  class BLOB extends BaseTypes.BLOB {
    toSql() {
      if (this._length) {
        warn("PostgreSQL does not support BLOB (BYTEA) with options. Plain `BYTEA` will be used instead.");
        this._length = void 0;
      }
      return "BYTEA";
    }
    _hexify(hex) {
      return `E'\\\\x${hex}'`;
    }
  }
  BaseTypes.BLOB.types.postgres = ["bytea"];
  class GEOMETRY extends BaseTypes.GEOMETRY {
    toSql() {
      let result = this.key;
      if (this.type) {
        result += `(${this.type}`;
        if (this.srid) {
          result += `,${this.srid}`;
        }
        result += ")";
      }
      return result;
    }
    static parse(value) {
      const b = Buffer.from(value, "hex");
      return wkx.Geometry.parse(b).toGeoJSON({ shortCrs: true });
    }
    _stringify(value, options) {
      return `ST_GeomFromGeoJSON(${options.escape(JSON.stringify(value))})`;
    }
    _bindParam(value, options) {
      return `ST_GeomFromGeoJSON(${options.bindParam(value)})`;
    }
  }
  BaseTypes.GEOMETRY.types.postgres = ["geometry"];
  class GEOGRAPHY extends BaseTypes.GEOGRAPHY {
    toSql() {
      let result = "GEOGRAPHY";
      if (this.type) {
        result += `(${this.type}`;
        if (this.srid) {
          result += `,${this.srid}`;
        }
        result += ")";
      }
      return result;
    }
    static parse(value) {
      const b = Buffer.from(value, "hex");
      return wkx.Geometry.parse(b).toGeoJSON({ shortCrs: true });
    }
    _stringify(value, options) {
      return `ST_GeomFromGeoJSON(${options.escape(JSON.stringify(value))})`;
    }
    bindParam(value, options) {
      return `ST_GeomFromGeoJSON(${options.bindParam(value)})`;
    }
  }
  BaseTypes.GEOGRAPHY.types.postgres = ["geography"];
  let hstore;
  class HSTORE extends BaseTypes.HSTORE {
    constructor() {
      super();
      if (!hstore) {
        hstore = require("./hstore");
      }
    }
    _value(value) {
      if (!hstore) {
        hstore = require("./hstore");
      }
      return hstore.stringify(value);
    }
    _stringify(value) {
      return `'${this._value(value)}'`;
    }
    _bindParam(value, options) {
      return options.bindParam(this._value(value));
    }
    static parse(value) {
      if (!hstore) {
        hstore = require("./hstore");
      }
      return hstore.parse(value);
    }
  }
  HSTORE.prototype.escape = false;
  BaseTypes.HSTORE.types.postgres = ["hstore"];
  class RANGE extends BaseTypes.RANGE {
    _value(values, options) {
      if (!Array.isArray(values)) {
        return this.options.subtype.stringify(values, options);
      }
      const valueInclusivity = [true, false];
      const valuesStringified = values.map((value, index) => {
        if (_.isObject(value) && Object.prototype.hasOwnProperty.call(value, "value")) {
          if (Object.prototype.hasOwnProperty.call(value, "inclusive")) {
            valueInclusivity[index] = value.inclusive;
          }
          value = value.value;
        }
        if (value === null || value === -Infinity || value === Infinity) {
          return value;
        }
        if (this.options.subtype.stringify) {
          return this.options.subtype.stringify(value, options);
        }
        return options.escape(value);
      });
      valuesStringified.inclusive = valueInclusivity;
      return range.stringify(valuesStringified);
    }
    _stringify(values, options) {
      const value = this._value(values, options);
      if (!Array.isArray(values)) {
        return `'${value}'::${this.toCastType()}`;
      }
      return `'${value}'`;
    }
    _bindParam(values, options) {
      const value = this._value(values, options);
      if (!Array.isArray(values)) {
        return `${options.bindParam(value)}::${this.toCastType()}`;
      }
      return options.bindParam(value);
    }
    toSql() {
      return BaseTypes.RANGE.types.postgres.subtypes[this._subtype.toLowerCase()];
    }
    toCastType() {
      return BaseTypes.RANGE.types.postgres.castTypes[this._subtype.toLowerCase()];
    }
    static parse(value, options = { parser: (val) => val }) {
      return range.parse(value, options.parser);
    }
  }
  const range = require("./range");
  RANGE.prototype.escape = false;
  BaseTypes.RANGE.types.postgres = {
    subtypes: {
      integer: "int4range",
      decimal: "numrange",
      date: "tstzrange",
      dateonly: "daterange",
      bigint: "int8range"
    },
    castTypes: {
      integer: "int4",
      decimal: "numeric",
      date: "timestamptz",
      dateonly: "date",
      bigint: "int8"
    }
  };
  BaseTypes.ARRAY.prototype.escape = false;
  BaseTypes.ARRAY.prototype._value = function _value(values, options) {
    return values.map((value) => {
      if (options && options.bindParam && this.type && this.type._value) {
        return this.type._value(value, options);
      }
      if (this.type && this.type.stringify) {
        value = this.type.stringify(value, options);
        if (this.type.escape === false) {
          return value;
        }
      }
      return options.escape(value);
    }, this);
  };
  BaseTypes.ARRAY.prototype._stringify = function _stringify(values, options) {
    let str = `ARRAY[${this._value(values, options).join(",")}]`;
    if (this.type) {
      const Utils = require("../../utils");
      let castKey = this.toSql();
      if (this.type instanceof BaseTypes.ENUM) {
        const table = options.field.Model.getTableName();
        const useSchema = table.schema !== void 0;
        const schemaWithDelimiter = useSchema ? `${Utils.addTicks(table.schema, '"')}${table.delimiter}` : "";
        castKey = `${Utils.addTicks(Utils.generateEnumName(useSchema ? table.tableName : table, options.field.field), '"')}[]`;
        str += `::${schemaWithDelimiter}${castKey}`;
      } else {
        str += `::${castKey}`;
      }
    }
    return str;
  };
  BaseTypes.ARRAY.prototype._bindParam = function _bindParam(values, options) {
    return options.bindParam(this._value(values, options));
  };
  class ENUM extends BaseTypes.ENUM {
    static parse(value) {
      return value;
    }
  }
  BaseTypes.ENUM.types.postgres = [null];
  return {
    DECIMAL,
    BLOB,
    STRING,
    CHAR,
    TEXT,
    CITEXT,
    TINYINT,
    SMALLINT,
    INTEGER,
    BIGINT,
    BOOLEAN,
    DATE,
    DATEONLY,
    REAL,
    "DOUBLE PRECISION": DOUBLE,
    FLOAT,
    GEOMETRY,
    GEOGRAPHY,
    HSTORE,
    RANGE,
    ENUM
  };
};
//# sourceMappingURL=data-types.js.map
"use strict";
const hstore = require("pg-hstore")({ sanitize: true });
function stringify(data) {
  if (data === null)
    return null;
  return hstore.stringify(data);
}
exports.stringify = stringify;
function parse(value) {
  if (value === null)
    return null;
  return hstore.parse(value);
}
exports.parse = parse;
//# sourceMappingURL=hstore.js.map
"use strict";
const _ = require("lodash");
const AbstractDialect = require("../abstract");
const ConnectionManager = require("./connection-manager");
const Query = require("./query");
const QueryGenerator = require("./query-generator");
const DataTypes = require("../../data-types").postgres;
const { PostgresQueryInterface } = require("./query-interface");
class PostgresDialect extends AbstractDialect {
  constructor(sequelize) {
    super();
    this.sequelize = sequelize;
    this.connectionManager = new ConnectionManager(this, sequelize);
    this.queryGenerator = new QueryGenerator({
      _dialect: this,
      sequelize
    });
    this.queryInterface = new PostgresQueryInterface(sequelize, this.queryGenerator);
  }
}
PostgresDialect.prototype.supports = _.merge(_.cloneDeep(AbstractDialect.prototype.supports), {
  "DEFAULT VALUES": true,
  EXCEPTION: true,
  "ON DUPLICATE KEY": false,
  "ORDER NULLS": true,
  returnValues: {
    returning: true
  },
  bulkDefault: true,
  schemas: true,
  lock: true,
  lockOf: true,
  lockKey: true,
  lockOuterJoinFailure: true,
  skipLocked: true,
  forShare: "FOR SHARE",
  index: {
    concurrently: true,
    using: 2,
    where: true,
    functionBased: true,
    operator: true
  },
  inserts: {
    onConflictDoNothing: " ON CONFLICT DO NOTHING",
    updateOnDuplicate: " ON CONFLICT DO UPDATE SET",
    conflictFields: true
  },
  NUMERIC: true,
  ARRAY: true,
  RANGE: true,
  GEOMETRY: true,
  REGEXP: true,
  GEOGRAPHY: true,
  JSON: true,
  JSONB: true,
  HSTORE: true,
  TSVECTOR: true,
  deferrableConstraints: true,
  searchPath: true
});
PostgresDialect.prototype.defaultVersion = "9.5.0";
PostgresDialect.prototype.Query = Query;
PostgresDialect.prototype.DataTypes = DataTypes;
PostgresDialect.prototype.name = "postgres";
PostgresDialect.prototype.TICK_CHAR = '"';
PostgresDialect.prototype.TICK_CHAR_LEFT = PostgresDialect.prototype.TICK_CHAR;
PostgresDialect.prototype.TICK_CHAR_RIGHT = PostgresDialect.prototype.TICK_CHAR;
module.exports = PostgresDialect;
module.exports.default = PostgresDialect;
module.exports.PostgresDialect = PostgresDialect;
//# sourceMappingURL=index.js.map
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
const Utils = require("../../utils");
const util = require("util");
const DataTypes = require("../../data-types");
const AbstractQueryGenerator = require("../abstract/query-generator");
const semver = require("semver");
const _ = require("lodash");
const POSTGRES_RESERVED_WORDS = "all,analyse,analyze,and,any,array,as,asc,asymmetric,authorization,binary,both,case,cast,check,collate,collation,column,concurrently,constraint,create,cross,current_catalog,current_date,current_role,current_schema,current_time,current_timestamp,current_user,default,deferrable,desc,distinct,do,else,end,except,false,fetch,for,foreign,freeze,from,full,grant,group,having,ilike,in,initially,inner,intersect,into,is,isnull,join,lateral,leading,left,like,limit,localtime,localtimestamp,natural,not,notnull,null,offset,on,only,or,order,outer,overlaps,placing,primary,references,returning,right,select,session_user,similar,some,symmetric,table,tablesample,then,to,trailing,true,union,unique,user,using,variadic,verbose,when,where,window,with".split(",");
class PostgresQueryGenerator extends AbstractQueryGenerator {
  setSearchPath(searchPath) {
    return `SET search_path to ${searchPath};`;
  }
  createDatabaseQuery(databaseName, options) {
    options = __spreadValues({
      encoding: null,
      collate: null
    }, options);
    const values = {
      database: this.quoteTable(databaseName),
      encoding: options.encoding ? ` ENCODING = ${this.escape(options.encoding)}` : "",
      collation: options.collate ? ` LC_COLLATE = ${this.escape(options.collate)}` : "",
      ctype: options.ctype ? ` LC_CTYPE = ${this.escape(options.ctype)}` : "",
      template: options.template ? ` TEMPLATE = ${this.escape(options.template)}` : ""
    };
    return `CREATE DATABASE ${values.database}${values.encoding}${values.collation}${values.ctype}${values.template};`;
  }
  dropDatabaseQuery(databaseName) {
    return `DROP DATABASE IF EXISTS ${this.quoteTable(databaseName)};`;
  }
  createSchema(schema) {
    const databaseVersion = _.get(this, "sequelize.options.databaseVersion", 0);
    if (databaseVersion && semver.gte(databaseVersion, "9.2.0")) {
      return `CREATE SCHEMA IF NOT EXISTS ${schema};`;
    }
    return `CREATE SCHEMA ${schema};`;
  }
  dropSchema(schema) {
    return `DROP SCHEMA IF EXISTS ${schema} CASCADE;`;
  }
  showSchemasQuery() {
    return "SELECT schema_name FROM information_schema.schemata WHERE schema_name <> 'information_schema' AND schema_name != 'public' AND schema_name !~ E'^pg_';";
  }
  versionQuery() {
    return "SHOW SERVER_VERSION";
  }
  createTableQuery(tableName, attributes, options) {
    options = __spreadValues({}, options);
    const databaseVersion = _.get(this, "sequelize.options.databaseVersion", 0);
    const attrStr = [];
    let comments = "";
    let columnComments = "";
    const quotedTable = this.quoteTable(tableName);
    if (options.comment && typeof options.comment === "string") {
      comments += `; COMMENT ON TABLE ${quotedTable} IS ${this.escape(options.comment)}`;
    }
    for (const attr in attributes) {
      const quotedAttr = this.quoteIdentifier(attr);
      const i = attributes[attr].indexOf("COMMENT ");
      if (i !== -1) {
        const escapedCommentText = this.escape(attributes[attr].substring(i + 8));
        columnComments += `; COMMENT ON COLUMN ${quotedTable}.${quotedAttr} IS ${escapedCommentText}`;
        attributes[attr] = attributes[attr].substring(0, i);
      }
      const dataType = this.dataTypeMapping(tableName, attr, attributes[attr]);
      attrStr.push(`${quotedAttr} ${dataType}`);
    }
    let attributesClause = attrStr.join(", ");
    if (options.uniqueKeys) {
      _.each(options.uniqueKeys, (columns) => {
        if (columns.customIndex) {
          attributesClause += `, UNIQUE (${columns.fields.map((field) => this.quoteIdentifier(field)).join(", ")})`;
        }
      });
    }
    const pks = _.reduce(attributes, (acc, attribute, key) => {
      if (attribute.includes("PRIMARY KEY")) {
        acc.push(this.quoteIdentifier(key));
      }
      return acc;
    }, []).join(",");
    if (pks.length > 0) {
      attributesClause += `, PRIMARY KEY (${pks})`;
    }
    return `CREATE TABLE ${databaseVersion === 0 || semver.gte(databaseVersion, "9.1.0") ? "IF NOT EXISTS " : ""}${quotedTable} (${attributesClause})${comments}${columnComments};`;
  }
  dropTableQuery(tableName, options) {
    options = options || {};
    return `DROP TABLE IF EXISTS ${this.quoteTable(tableName)}${options.cascade ? " CASCADE" : ""};`;
  }
  showTablesQuery() {
    const schema = this.options.schema || "public";
    return `SELECT table_name FROM information_schema.tables WHERE table_schema = ${this.escape(schema)} AND table_type LIKE '%TABLE' AND table_name != 'spatial_ref_sys';`;
  }
  tableExistsQuery(tableName) {
    const table = tableName.tableName || tableName;
    const schema = tableName.schema || "public";
    return `SELECT table_name FROM information_schema.tables WHERE table_schema = ${this.escape(schema)} AND table_name = ${this.escape(table)}`;
  }
  describeTableQuery(tableName, schema) {
    schema = schema || this.options.schema || "public";
    return `SELECT pk.constraint_type as "Constraint",c.column_name as "Field", c.column_default as "Default",c.is_nullable as "Null", (CASE WHEN c.udt_name = 'hstore' THEN c.udt_name ELSE c.data_type END) || (CASE WHEN c.character_maximum_length IS NOT NULL THEN '(' || c.character_maximum_length || ')' ELSE '' END) as "Type", (SELECT array_agg(e.enumlabel) FROM pg_catalog.pg_type t JOIN pg_catalog.pg_enum e ON t.oid=e.enumtypid WHERE t.typname=c.udt_name) AS "special", (SELECT pgd.description FROM pg_catalog.pg_statio_all_tables AS st INNER JOIN pg_catalog.pg_description pgd on (pgd.objoid=st.relid) WHERE c.ordinal_position=pgd.objsubid AND c.table_name=st.relname) AS "Comment" FROM information_schema.columns c LEFT JOIN (SELECT tc.table_schema, tc.table_name, cu.column_name, tc.constraint_type FROM information_schema.TABLE_CONSTRAINTS tc JOIN information_schema.KEY_COLUMN_USAGE  cu ON tc.table_schema=cu.table_schema and tc.table_name=cu.table_name and tc.constraint_name=cu.constraint_name and tc.constraint_type='PRIMARY KEY') pk ON pk.table_schema=c.table_schema AND pk.table_name=c.table_name AND pk.column_name=c.column_name WHERE c.table_name = ${this.escape(tableName)} AND c.table_schema = ${this.escape(schema)}`;
  }
  _checkValidJsonStatement(stmt) {
    if (typeof stmt !== "string") {
      return false;
    }
    const jsonFunctionRegex = /^\s*((?:[a-z]+_){0,2}jsonb?(?:_[a-z]+){0,2})\([^)]*\)/i;
    const jsonOperatorRegex = /^\s*(->>?|#>>?|@>|<@|\?[|&]?|\|{2}|#-)/i;
    const tokenCaptureRegex = /^\s*((?:([`"'])(?:(?!\2).|\2{2})*\2)|[\w\d\s]+|[().,;+-])/i;
    let currentIndex = 0;
    let openingBrackets = 0;
    let closingBrackets = 0;
    let hasJsonFunction = false;
    let hasInvalidToken = false;
    while (currentIndex < stmt.length) {
      const string = stmt.substr(currentIndex);
      const functionMatches = jsonFunctionRegex.exec(string);
      if (functionMatches) {
        currentIndex += functionMatches[0].indexOf("(");
        hasJsonFunction = true;
        continue;
      }
      const operatorMatches = jsonOperatorRegex.exec(string);
      if (operatorMatches) {
        currentIndex += operatorMatches[0].length;
        hasJsonFunction = true;
        continue;
      }
      const tokenMatches = tokenCaptureRegex.exec(string);
      if (tokenMatches) {
        const capturedToken = tokenMatches[1];
        if (capturedToken === "(") {
          openingBrackets++;
        } else if (capturedToken === ")") {
          closingBrackets++;
        } else if (capturedToken === ";") {
          hasInvalidToken = true;
          break;
        }
        currentIndex += tokenMatches[0].length;
        continue;
      }
      break;
    }
    hasInvalidToken |= openingBrackets !== closingBrackets;
    if (hasJsonFunction && hasInvalidToken) {
      throw new Error(`Invalid json statement: ${stmt}`);
    }
    return hasJsonFunction;
  }
  handleSequelizeMethod(smth, tableName, factory, options, prepend) {
    if (smth instanceof Utils.Json) {
      if (smth.conditions) {
        const conditions = this.parseConditionObject(smth.conditions).map((condition) => `${this.jsonPathExtractionQuery(condition.path[0], _.tail(condition.path))} = '${condition.value}'`);
        return conditions.join(" AND ");
      }
      if (smth.path) {
        let str;
        if (this._checkValidJsonStatement(smth.path)) {
          str = smth.path;
        } else {
          const paths = _.toPath(smth.path);
          const column = paths.shift();
          str = this.jsonPathExtractionQuery(column, paths);
        }
        if (smth.value) {
          str += util.format(" = %s", this.escape(smth.value));
        }
        return str;
      }
    }
    return super.handleSequelizeMethod.call(this, smth, tableName, factory, options, prepend);
  }
  addColumnQuery(table, key, attribute) {
    const dbDataType = this.attributeToSQL(attribute, { context: "addColumn", table, key });
    const dataType = attribute.type || attribute;
    const definition = this.dataTypeMapping(table, key, dbDataType);
    const quotedKey = this.quoteIdentifier(key);
    const quotedTable = this.quoteTable(this.extractTableDetails(table));
    let query = `ALTER TABLE ${quotedTable} ADD COLUMN ${quotedKey} ${definition};`;
    if (dataType instanceof DataTypes.ENUM) {
      query = this.pgEnum(table, key, dataType) + query;
    } else if (dataType.type && dataType.type instanceof DataTypes.ENUM) {
      query = this.pgEnum(table, key, dataType.type) + query;
    }
    return query;
  }
  removeColumnQuery(tableName, attributeName) {
    const quotedTableName = this.quoteTable(this.extractTableDetails(tableName));
    const quotedAttributeName = this.quoteIdentifier(attributeName);
    return `ALTER TABLE ${quotedTableName} DROP COLUMN ${quotedAttributeName};`;
  }
  changeColumnQuery(tableName, attributes) {
    const query = (subQuery) => `ALTER TABLE ${this.quoteTable(tableName)} ALTER COLUMN ${subQuery};`;
    const sql = [];
    for (const attributeName in attributes) {
      let definition = this.dataTypeMapping(tableName, attributeName, attributes[attributeName]);
      let attrSql = "";
      if (definition.includes("NOT NULL")) {
        attrSql += query(`${this.quoteIdentifier(attributeName)} SET NOT NULL`);
        definition = definition.replace("NOT NULL", "").trim();
      } else if (!definition.includes("REFERENCES")) {
        attrSql += query(`${this.quoteIdentifier(attributeName)} DROP NOT NULL`);
      }
      if (definition.includes("DEFAULT")) {
        attrSql += query(`${this.quoteIdentifier(attributeName)} SET DEFAULT ${definition.match(/DEFAULT ([^;]+)/)[1]}`);
        definition = definition.replace(/(DEFAULT[^;]+)/, "").trim();
      } else if (!definition.includes("REFERENCES")) {
        attrSql += query(`${this.quoteIdentifier(attributeName)} DROP DEFAULT`);
      }
      if (attributes[attributeName].startsWith("ENUM(")) {
        attrSql += this.pgEnum(tableName, attributeName, attributes[attributeName]);
        definition = definition.replace(/^ENUM\(.+\)/, this.pgEnumName(tableName, attributeName, { schema: false }));
        definition += ` USING (${this.quoteIdentifier(attributeName)}::${this.pgEnumName(tableName, attributeName)})`;
      }
      if (definition.match(/UNIQUE;*$/)) {
        definition = definition.replace(/UNIQUE;*$/, "");
        attrSql += query(`ADD UNIQUE (${this.quoteIdentifier(attributeName)})`).replace("ALTER COLUMN", "");
      }
      if (definition.includes("REFERENCES")) {
        definition = definition.replace(/.+?(?=REFERENCES)/, "");
        attrSql += query(`ADD FOREIGN KEY (${this.quoteIdentifier(attributeName)}) ${definition}`).replace("ALTER COLUMN", "");
      } else {
        attrSql += query(`${this.quoteIdentifier(attributeName)} TYPE ${definition}`);
      }
      sql.push(attrSql);
    }
    return sql.join("");
  }
  renameColumnQuery(tableName, attrBefore, attributes) {
    const attrString = [];
    for (const attributeName in attributes) {
      attrString.push(`${this.quoteIdentifier(attrBefore)} TO ${this.quoteIdentifier(attributeName)}`);
    }
    return `ALTER TABLE ${this.quoteTable(tableName)} RENAME COLUMN ${attrString.join(", ")};`;
  }
  fn(fnName, tableName, parameters, body, returns, language) {
    fnName = fnName || "testfunc";
    language = language || "plpgsql";
    returns = returns ? `RETURNS ${returns}` : "";
    parameters = parameters || "";
    return `CREATE OR REPLACE FUNCTION pg_temp.${fnName}(${parameters}) ${returns} AS $func$ BEGIN ${body} END; $func$ LANGUAGE ${language}; SELECT * FROM pg_temp.${fnName}();`;
  }
  truncateTableQuery(tableName, options = {}) {
    return [
      `TRUNCATE ${this.quoteTable(tableName)}`,
      options.restartIdentity ? " RESTART IDENTITY" : "",
      options.cascade ? " CASCADE" : ""
    ].join("");
  }
  deleteQuery(tableName, where, options = {}, model) {
    const table = this.quoteTable(tableName);
    let whereClause = this.getWhereConditions(where, null, model, options);
    const limit = options.limit ? ` LIMIT ${this.escape(options.limit)}` : "";
    let primaryKeys = "";
    let primaryKeysSelection = "";
    if (whereClause) {
      whereClause = ` WHERE ${whereClause}`;
    }
    if (options.limit) {
      if (!model) {
        throw new Error("Cannot LIMIT delete without a model.");
      }
      const pks = Object.values(model.primaryKeys).map((pk) => this.quoteIdentifier(pk.field)).join(",");
      primaryKeys = model.primaryKeyAttributes.length > 1 ? `(${pks})` : pks;
      primaryKeysSelection = pks;
      return `DELETE FROM ${table} WHERE ${primaryKeys} IN (SELECT ${primaryKeysSelection} FROM ${table}${whereClause}${limit})`;
    }
    return `DELETE FROM ${table}${whereClause}`;
  }
  showIndexesQuery(tableName) {
    let schemaJoin = "";
    let schemaWhere = "";
    if (typeof tableName !== "string") {
      schemaJoin = ", pg_namespace s";
      schemaWhere = ` AND s.oid = t.relnamespace AND s.nspname = '${tableName.schema}'`;
      tableName = tableName.tableName;
    }
    return `SELECT i.relname AS name, ix.indisprimary AS primary, ix.indisunique AS unique, ix.indkey AS indkey, array_agg(a.attnum) as column_indexes, array_agg(a.attname) AS column_names, pg_get_indexdef(ix.indexrelid) AS definition FROM pg_class t, pg_class i, pg_index ix, pg_attribute a${schemaJoin} WHERE t.oid = ix.indrelid AND i.oid = ix.indexrelid AND a.attrelid = t.oid AND t.relkind = 'r' and t.relname = '${tableName}'${schemaWhere} GROUP BY i.relname, ix.indexrelid, ix.indisprimary, ix.indisunique, ix.indkey ORDER BY i.relname;`;
  }
  showConstraintsQuery(tableName) {
    return [
      'SELECT constraint_catalog AS "constraintCatalog",',
      'constraint_schema AS "constraintSchema",',
      'constraint_name AS "constraintName",',
      'table_catalog AS "tableCatalog",',
      'table_schema AS "tableSchema",',
      'table_name AS "tableName",',
      'constraint_type AS "constraintType",',
      'is_deferrable AS "isDeferrable",',
      'initially_deferred AS "initiallyDeferred"',
      "from INFORMATION_SCHEMA.table_constraints",
      `WHERE table_name='${tableName}';`
    ].join(" ");
  }
  removeIndexQuery(tableName, indexNameOrAttributes, options) {
    let indexName = indexNameOrAttributes;
    if (typeof indexName !== "string") {
      indexName = Utils.underscore(`${tableName}_${indexNameOrAttributes.join("_")}`);
    }
    return [
      "DROP INDEX",
      options && options.concurrently && "CONCURRENTLY",
      `IF EXISTS ${this.quoteIdentifiers(indexName)}`
    ].filter(Boolean).join(" ");
  }
  addLimitAndOffset(options) {
    let fragment = "";
    if (options.limit != null) {
      fragment += " LIMIT " + this.escape(options.limit);
    }
    if (options.offset != null) {
      fragment += " OFFSET " + this.escape(options.offset);
    }
    return fragment;
  }
  attributeToSQL(attribute, options) {
    if (!_.isPlainObject(attribute)) {
      attribute = {
        type: attribute
      };
    }
    let type;
    if (attribute.type instanceof DataTypes.ENUM || attribute.type instanceof DataTypes.ARRAY && attribute.type.type instanceof DataTypes.ENUM) {
      const enumType = attribute.type.type || attribute.type;
      let values = attribute.values;
      if (enumType.values && !attribute.values) {
        values = enumType.values;
      }
      if (Array.isArray(values) && values.length > 0) {
        type = `ENUM(${values.map((value) => this.escape(value)).join(", ")})`;
        if (attribute.type instanceof DataTypes.ARRAY) {
          type += "[]";
        }
      } else {
        throw new Error("Values for ENUM haven't been defined.");
      }
    }
    if (!type) {
      type = attribute.type;
    }
    let sql = type.toString();
    if (Object.prototype.hasOwnProperty.call(attribute, "allowNull") && !attribute.allowNull) {
      sql += " NOT NULL";
    }
    if (attribute.autoIncrement) {
      if (attribute.autoIncrementIdentity) {
        sql += " GENERATED BY DEFAULT AS IDENTITY";
      } else {
        sql += " SERIAL";
      }
    }
    if (Utils.defaultValueSchemable(attribute.defaultValue)) {
      sql += ` DEFAULT ${this.escape(attribute.defaultValue, attribute)}`;
    }
    if (attribute.unique === true) {
      sql += " UNIQUE";
    }
    if (attribute.primaryKey) {
      sql += " PRIMARY KEY";
    }
    if (attribute.references) {
      let referencesTable = this.quoteTable(attribute.references.model);
      let schema;
      if (options.schema) {
        schema = options.schema;
      } else if ((!attribute.references.model || typeof attribute.references.model == "string") && options.table && options.table.schema) {
        schema = options.table.schema;
      }
      if (schema) {
        referencesTable = this.quoteTable(this.addSchema({
          tableName: referencesTable,
          _schema: schema
        }));
      }
      let referencesKey;
      if (!options.withoutForeignKeyConstraints) {
        if (attribute.references.key) {
          referencesKey = this.quoteIdentifiers(attribute.references.key);
        } else {
          referencesKey = this.quoteIdentifier("id");
        }
        sql += ` REFERENCES ${referencesTable} (${referencesKey})`;
        if (attribute.onDelete) {
          sql += ` ON DELETE ${attribute.onDelete.toUpperCase()}`;
        }
        if (attribute.onUpdate) {
          sql += ` ON UPDATE ${attribute.onUpdate.toUpperCase()}`;
        }
        if (attribute.references.deferrable) {
          sql += ` ${attribute.references.deferrable.toString(this)}`;
        }
      }
    }
    if (attribute.comment && typeof attribute.comment === "string") {
      if (options && ["addColumn", "changeColumn"].includes(options.context)) {
        const quotedAttr = this.quoteIdentifier(options.key);
        const escapedCommentText = this.escape(attribute.comment);
        sql += `; COMMENT ON COLUMN ${this.quoteTable(options.table)}.${quotedAttr} IS ${escapedCommentText}`;
      } else {
        sql += ` COMMENT ${attribute.comment}`;
      }
    }
    return sql;
  }
  deferConstraintsQuery(options) {
    return options.deferrable.toString(this);
  }
  setConstraintQuery(columns, type) {
    let columnFragment = "ALL";
    if (columns) {
      columnFragment = columns.map((column) => this.quoteIdentifier(column)).join(", ");
    }
    return `SET CONSTRAINTS ${columnFragment} ${type}`;
  }
  setDeferredQuery(columns) {
    return this.setConstraintQuery(columns, "DEFERRED");
  }
  setImmediateQuery(columns) {
    return this.setConstraintQuery(columns, "IMMEDIATE");
  }
  attributesToSQL(attributes, options) {
    const result = {};
    for (const key in attributes) {
      const attribute = attributes[key];
      result[attribute.field || key] = this.attributeToSQL(attribute, __spreadValues({ key }, options));
    }
    return result;
  }
  createTrigger(tableName, triggerName, eventType, fireOnSpec, functionName, functionParams, optionsArray) {
    const decodedEventType = this.decodeTriggerEventType(eventType);
    const eventSpec = this.expandTriggerEventSpec(fireOnSpec);
    const expandedOptions = this.expandOptions(optionsArray);
    const paramList = this._expandFunctionParamList(functionParams);
    return `CREATE ${this.triggerEventTypeIsConstraint(eventType)}TRIGGER ${this.quoteIdentifier(triggerName)} ${decodedEventType} ${eventSpec} ON ${this.quoteTable(tableName)}${expandedOptions ? ` ${expandedOptions}` : ""} EXECUTE PROCEDURE ${functionName}(${paramList});`;
  }
  dropTrigger(tableName, triggerName) {
    return `DROP TRIGGER ${this.quoteIdentifier(triggerName)} ON ${this.quoteTable(tableName)} RESTRICT;`;
  }
  renameTrigger(tableName, oldTriggerName, newTriggerName) {
    return `ALTER TRIGGER ${this.quoteIdentifier(oldTriggerName)} ON ${this.quoteTable(tableName)} RENAME TO ${this.quoteIdentifier(newTriggerName)};`;
  }
  createFunction(functionName, params, returnType, language, body, optionsArray, options) {
    if (!functionName || !returnType || !language || !body)
      throw new Error("createFunction missing some parameters. Did you pass functionName, returnType, language and body?");
    const paramList = this._expandFunctionParamList(params);
    const variableList = options && options.variables ? this._expandFunctionVariableList(options.variables) : "";
    const expandedOptionsArray = this.expandOptions(optionsArray);
    const statement = options && options.force ? "CREATE OR REPLACE FUNCTION" : "CREATE FUNCTION";
    return `${statement} ${functionName}(${paramList}) RETURNS ${returnType} AS $func$ ${variableList} BEGIN ${body} END; $func$ language '${language}'${expandedOptionsArray};`;
  }
  dropFunction(functionName, params) {
    if (!functionName)
      throw new Error("requires functionName");
    const paramList = this._expandFunctionParamList(params);
    return `DROP FUNCTION ${functionName}(${paramList}) RESTRICT;`;
  }
  renameFunction(oldFunctionName, params, newFunctionName) {
    const paramList = this._expandFunctionParamList(params);
    return `ALTER FUNCTION ${oldFunctionName}(${paramList}) RENAME TO ${newFunctionName};`;
  }
  pgEscapeAndQuote(val) {
    return this.quoteIdentifier(Utils.removeTicks(this.escape(val), "'"));
  }
  _expandFunctionParamList(params) {
    if (params === void 0 || !Array.isArray(params)) {
      throw new Error("_expandFunctionParamList: function parameters array required, including an empty one for no arguments");
    }
    const paramList = [];
    params.forEach((curParam) => {
      const paramDef = [];
      if (curParam.type) {
        if (curParam.direction) {
          paramDef.push(curParam.direction);
        }
        if (curParam.name) {
          paramDef.push(curParam.name);
        }
        paramDef.push(curParam.type);
      } else {
        throw new Error("function or trigger used with a parameter without any type");
      }
      const joined = paramDef.join(" ");
      if (joined)
        paramList.push(joined);
    });
    return paramList.join(", ");
  }
  _expandFunctionVariableList(variables) {
    if (!Array.isArray(variables)) {
      throw new Error("_expandFunctionVariableList: function variables must be an array");
    }
    const variableDefinitions = [];
    variables.forEach((variable) => {
      if (!variable.name || !variable.type) {
        throw new Error("function variable must have a name and type");
      }
      let variableDefinition = `DECLARE ${variable.name} ${variable.type}`;
      if (variable.default) {
        variableDefinition += ` := ${variable.default}`;
      }
      variableDefinition += ";";
      variableDefinitions.push(variableDefinition);
    });
    return variableDefinitions.join(" ");
  }
  expandOptions(options) {
    return options === void 0 || _.isEmpty(options) ? "" : options.join(" ");
  }
  decodeTriggerEventType(eventSpecifier) {
    const EVENT_DECODER = {
      "after": "AFTER",
      "before": "BEFORE",
      "instead_of": "INSTEAD OF",
      "after_constraint": "AFTER"
    };
    if (!EVENT_DECODER[eventSpecifier]) {
      throw new Error(`Invalid trigger event specified: ${eventSpecifier}`);
    }
    return EVENT_DECODER[eventSpecifier];
  }
  triggerEventTypeIsConstraint(eventSpecifier) {
    return eventSpecifier === "after_constraint" ? "CONSTRAINT " : "";
  }
  expandTriggerEventSpec(fireOnSpec) {
    if (_.isEmpty(fireOnSpec)) {
      throw new Error("no table change events specified to trigger on");
    }
    return _.map(fireOnSpec, (fireValue, fireKey) => {
      const EVENT_MAP = {
        "insert": "INSERT",
        "update": "UPDATE",
        "delete": "DELETE",
        "truncate": "TRUNCATE"
      };
      if (!EVENT_MAP[fireValue]) {
        throw new Error(`parseTriggerEventSpec: undefined trigger event ${fireKey}`);
      }
      let eventSpec = EVENT_MAP[fireValue];
      if (eventSpec === "UPDATE") {
        if (Array.isArray(fireValue) && fireValue.length > 0) {
          eventSpec += ` OF ${fireValue.join(", ")}`;
        }
      }
      return eventSpec;
    }).join(" OR ");
  }
  pgEnumName(tableName, attr, options) {
    options = options || {};
    const tableDetails = this.extractTableDetails(tableName, options);
    let enumName = Utils.addTicks(Utils.generateEnumName(tableDetails.tableName, attr), '"');
    if (options.schema !== false && tableDetails.schema) {
      enumName = this.quoteIdentifier(tableDetails.schema) + tableDetails.delimiter + enumName;
    }
    return enumName;
  }
  pgListEnums(tableName, attrName, options) {
    let enumName = "";
    const tableDetails = this.extractTableDetails(tableName, options);
    if (tableDetails.tableName && attrName) {
      enumName = ` AND t.typname=${this.pgEnumName(tableDetails.tableName, attrName, { schema: false }).replace(/"/g, "'")}`;
    }
    return `SELECT t.typname enum_name, array_agg(e.enumlabel ORDER BY enumsortorder) enum_value FROM pg_type t JOIN pg_enum e ON t.oid = e.enumtypid JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace WHERE n.nspname = '${tableDetails.schema}'${enumName} GROUP BY 1`;
  }
  pgEnum(tableName, attr, dataType, options) {
    const enumName = this.pgEnumName(tableName, attr, options);
    let values;
    if (dataType.values) {
      values = `ENUM(${dataType.values.map((value) => this.escape(value)).join(", ")})`;
    } else {
      values = dataType.toString().match(/^ENUM\(.+\)/)[0];
    }
    let sql = `CREATE TYPE ${enumName} AS ${values};`;
    if (!!options && options.force === true) {
      sql = this.pgEnumDrop(tableName, attr) + sql;
    }
    return sql;
  }
  pgEnumAdd(tableName, attr, value, options) {
    const enumName = this.pgEnumName(tableName, attr);
    let sql = `ALTER TYPE ${enumName} ADD VALUE `;
    if (semver.gte(this.sequelize.options.databaseVersion, "9.3.0")) {
      sql += "IF NOT EXISTS ";
    }
    sql += this.escape(value);
    if (options.before) {
      sql += ` BEFORE ${this.escape(options.before)}`;
    } else if (options.after) {
      sql += ` AFTER ${this.escape(options.after)}`;
    }
    return sql;
  }
  pgEnumDrop(tableName, attr, enumName) {
    enumName = enumName || this.pgEnumName(tableName, attr);
    return `DROP TYPE IF EXISTS ${enumName}; `;
  }
  fromArray(text) {
    text = text.replace(/^{/, "").replace(/}$/, "");
    let matches = text.match(/("(?:\\.|[^"\\\\])*"|[^,]*)(?:\s*,\s*|\s*$)/ig);
    if (matches.length < 1) {
      return [];
    }
    matches = matches.map((m) => m.replace(/",$/, "").replace(/,$/, "").replace(/(^"|"$)/g, ""));
    return matches.slice(0, -1);
  }
  dataTypeMapping(tableName, attr, dataType) {
    if (dataType.includes("PRIMARY KEY")) {
      dataType = dataType.replace("PRIMARY KEY", "");
    }
    if (dataType.includes("SERIAL")) {
      if (dataType.includes("BIGINT")) {
        dataType = dataType.replace("SERIAL", "BIGSERIAL");
        dataType = dataType.replace("BIGINT", "");
      } else if (dataType.includes("SMALLINT")) {
        dataType = dataType.replace("SERIAL", "SMALLSERIAL");
        dataType = dataType.replace("SMALLINT", "");
      } else {
        dataType = dataType.replace("INTEGER", "");
      }
      dataType = dataType.replace("NOT NULL", "");
    }
    if (dataType.startsWith("ENUM(")) {
      dataType = dataType.replace(/^ENUM\(.+\)/, this.pgEnumName(tableName, attr));
    }
    return dataType;
  }
  getForeignKeysQuery(tableName) {
    return `SELECT conname as constraint_name, pg_catalog.pg_get_constraintdef(r.oid, true) as condef FROM pg_catalog.pg_constraint r WHERE r.conrelid = (SELECT oid FROM pg_class WHERE relname = '${tableName}' LIMIT 1) AND r.contype = 'f' ORDER BY 1;`;
  }
  _getForeignKeyReferencesQueryPrefix() {
    return "SELECT DISTINCT tc.constraint_name as constraint_name, tc.constraint_schema as constraint_schema, tc.constraint_catalog as constraint_catalog, tc.table_name as table_name,tc.table_schema as table_schema,tc.table_catalog as table_catalog,tc.initially_deferred as initially_deferred,tc.is_deferrable as is_deferrable,kcu.column_name as column_name,ccu.table_schema  AS referenced_table_schema,ccu.table_catalog  AS referenced_table_catalog,ccu.table_name  AS referenced_table_name,ccu.column_name AS referenced_column_name FROM information_schema.table_constraints AS tc JOIN information_schema.key_column_usage AS kcu ON tc.constraint_name = kcu.constraint_name JOIN information_schema.constraint_column_usage AS ccu ON ccu.constraint_name = tc.constraint_name ";
  }
  getForeignKeyReferencesQuery(tableName, catalogName, schemaName) {
    return `${this._getForeignKeyReferencesQueryPrefix()}WHERE constraint_type = 'FOREIGN KEY' AND tc.table_name = '${tableName}'${catalogName ? ` AND tc.table_catalog = '${catalogName}'` : ""}${schemaName ? ` AND tc.table_schema = '${schemaName}'` : ""}`;
  }
  getForeignKeyReferenceQuery(table, columnName) {
    const tableName = table.tableName || table;
    const schema = table.schema;
    return `${this._getForeignKeyReferencesQueryPrefix()}WHERE constraint_type = 'FOREIGN KEY' AND tc.table_name='${tableName}' AND  kcu.column_name = '${columnName}'${schema ? ` AND tc.table_schema = '${schema}'` : ""}`;
  }
  dropForeignKeyQuery(tableName, foreignKey) {
    return `ALTER TABLE ${this.quoteTable(tableName)} DROP CONSTRAINT ${this.quoteIdentifier(foreignKey)};`;
  }
  quoteIdentifier(identifier, force) {
    const optForceQuote = force || false;
    const optQuoteIdentifiers = this.options.quoteIdentifiers !== false;
    const rawIdentifier = Utils.removeTicks(identifier, '"');
    if (optForceQuote === true || optQuoteIdentifiers !== false || identifier.includes(".") || identifier.includes("->") || POSTGRES_RESERVED_WORDS.includes(rawIdentifier.toLowerCase())) {
      return Utils.addTicks(rawIdentifier, '"');
    }
    return rawIdentifier;
  }
}
module.exports = PostgresQueryGenerator;
//# sourceMappingURL=query-generator.js.map
"use strict";
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
var __objRest = (source, exclude) => {
  var target = {};
  for (var prop in source)
    if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
      target[prop] = source[prop];
  if (source != null && __getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(source)) {
      if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
        target[prop] = source[prop];
    }
  return target;
};
const DataTypes = require("../../data-types");
const QueryTypes = require("../../query-types");
const { QueryInterface } = require("../abstract/query-interface");
const Utils = require("../../utils");
const Deferrable = require("../../deferrable");
class PostgresQueryInterface extends QueryInterface {
  async ensureEnums(tableName, attributes, options, model) {
    const keys = Object.keys(attributes);
    const keyLen = keys.length;
    let sql = "";
    let promises = [];
    let i = 0;
    for (i = 0; i < keyLen; i++) {
      const attribute = attributes[keys[i]];
      const type = attribute.type;
      if (type instanceof DataTypes.ENUM || type instanceof DataTypes.ARRAY && type.type instanceof DataTypes.ENUM) {
        sql = this.queryGenerator.pgListEnums(tableName, attribute.field || keys[i], options);
        promises.push(this.sequelize.query(sql, __spreadProps(__spreadValues({}, options), { plain: true, raw: true, type: QueryTypes.SELECT })));
      }
    }
    const results = await Promise.all(promises);
    promises = [];
    let enumIdx = 0;
    const addEnumValue = (field, value, relativeValue, position = "before", spliceStart = promises.length) => {
      const valueOptions = __spreadValues({}, options);
      valueOptions.before = null;
      valueOptions.after = null;
      switch (position) {
        case "after":
          valueOptions.after = relativeValue;
          break;
        case "before":
        default:
          valueOptions.before = relativeValue;
          break;
      }
      promises.splice(spliceStart, 0, () => {
        return this.sequelize.query(this.queryGenerator.pgEnumAdd(tableName, field, value, valueOptions), valueOptions);
      });
    };
    for (i = 0; i < keyLen; i++) {
      const attribute = attributes[keys[i]];
      const type = attribute.type;
      const enumType = type.type || type;
      const field = attribute.field || keys[i];
      if (type instanceof DataTypes.ENUM || type instanceof DataTypes.ARRAY && enumType instanceof DataTypes.ENUM) {
        if (!results[enumIdx]) {
          promises.push(() => {
            return this.sequelize.query(this.queryGenerator.pgEnum(tableName, field, enumType, options), __spreadProps(__spreadValues({}, options), { raw: true }));
          });
        } else if (!!results[enumIdx] && !!model) {
          const enumVals = this.queryGenerator.fromArray(results[enumIdx].enum_value);
          const vals = enumType.values;
          let lastOldEnumValue;
          let rightestPosition = -1;
          for (let oldIndex = 0; oldIndex < enumVals.length; oldIndex++) {
            const enumVal = enumVals[oldIndex];
            const newIdx = vals.indexOf(enumVal);
            lastOldEnumValue = enumVal;
            if (newIdx === -1) {
              continue;
            }
            const newValuesBefore = vals.slice(0, newIdx);
            const promisesLength = promises.length;
            for (let reverseIdx = newValuesBefore.length - 1; reverseIdx >= 0; reverseIdx--) {
              if (~enumVals.indexOf(newValuesBefore[reverseIdx])) {
                break;
              }
              addEnumValue(field, newValuesBefore[reverseIdx], lastOldEnumValue, "before", promisesLength);
            }
            if (newIdx > rightestPosition) {
              rightestPosition = newIdx;
            }
          }
          if (lastOldEnumValue && rightestPosition < vals.length - 1) {
            const remainingEnumValues = vals.slice(rightestPosition + 1);
            for (let reverseIdx = remainingEnumValues.length - 1; reverseIdx >= 0; reverseIdx--) {
              addEnumValue(field, remainingEnumValues[reverseIdx], lastOldEnumValue, "after");
            }
          }
          enumIdx++;
        }
      }
    }
    const result = await promises.reduce(async (promise, asyncFunction) => await asyncFunction(await promise), Promise.resolve());
    if (promises.length) {
      await this.sequelize.dialect.connectionManager._refreshDynamicOIDs();
    }
    return result;
  }
  async getForeignKeyReferencesForTable(table, options) {
    const queryOptions = __spreadProps(__spreadValues({}, options), {
      type: QueryTypes.FOREIGNKEYS
    });
    const query = this.queryGenerator.getForeignKeyReferencesQuery(table.tableName || table, this.sequelize.config.database);
    const result = await this.sequelize.query(query, queryOptions);
    return result.map((fkMeta) => {
      const _a = Utils.camelizeObjectKeys(fkMeta), { initiallyDeferred, isDeferrable } = _a, remaining = __objRest(_a, ["initiallyDeferred", "isDeferrable"]);
      return __spreadProps(__spreadValues({}, remaining), {
        deferrable: isDeferrable === "NO" ? Deferrable.NOT : initiallyDeferred === "NO" ? Deferrable.INITIALLY_IMMEDIATE : Deferrable.INITIALLY_DEFERRED
      });
    });
  }
  async dropEnum(enumName, options) {
    options = options || {};
    return this.sequelize.query(this.queryGenerator.pgEnumDrop(null, null, this.queryGenerator.pgEscapeAndQuote(enumName)), __spreadProps(__spreadValues({}, options), { raw: true }));
  }
  async dropAllEnums(options) {
    options = options || {};
    const enums = await this.pgListEnums(null, options);
    return await Promise.all(enums.map((result) => this.sequelize.query(this.queryGenerator.pgEnumDrop(null, null, this.queryGenerator.pgEscapeAndQuote(result.enum_name)), __spreadProps(__spreadValues({}, options), { raw: true }))));
  }
  async pgListEnums(tableName, options) {
    options = options || {};
    const sql = this.queryGenerator.pgListEnums(tableName);
    return this.sequelize.query(sql, __spreadProps(__spreadValues({}, options), { plain: false, raw: true, type: QueryTypes.SELECT }));
  }
  async dropTable(tableName, options) {
    await super.dropTable(tableName, options);
    const promises = [];
    const instanceTable = this.sequelize.modelManager.getModel(tableName, { attribute: "tableName" });
    if (!instanceTable) {
      return;
    }
    const getTableName = (!options || !options.schema || options.schema === "public" ? "" : `${options.schema}_`) + tableName;
    const keys = Object.keys(instanceTable.rawAttributes);
    const keyLen = keys.length;
    for (let i = 0; i < keyLen; i++) {
      if (instanceTable.rawAttributes[keys[i]].type instanceof DataTypes.ENUM) {
        const sql = this.queryGenerator.pgEnumDrop(getTableName, keys[i]);
        options.supportsSearchPath = false;
        promises.push(this.sequelize.query(sql, __spreadProps(__spreadValues({}, options), { raw: true })));
      }
    }
    await Promise.all(promises);
  }
}
exports.PostgresQueryInterface = PostgresQueryInterface;
//# sourceMappingURL=query-interface.js.map
"use strict";
const AbstractQuery = require("../abstract/query");
const QueryTypes = require("../../query-types");
const sequelizeErrors = require("../../errors");
const _ = require("lodash");
const { logger } = require("../../utils/logger");
const debug = logger.debugContext("sql:pg");
class Query extends AbstractQuery {
  static formatBindParameters(sql, values, dialect) {
    const stringReplaceFunc = (value) => typeof value === "string" ? value.replace(/\0/g, "\\0") : value;
    let bindParam;
    if (Array.isArray(values)) {
      bindParam = values.map(stringReplaceFunc);
      sql = AbstractQuery.formatBindParameters(sql, values, dialect, { skipValueReplace: true })[0];
    } else {
      bindParam = [];
      let i = 0;
      const seen = {};
      const replacementFunc = (match, key, values2) => {
        if (seen[key] !== void 0) {
          return seen[key];
        }
        if (values2[key] !== void 0) {
          i = i + 1;
          bindParam.push(stringReplaceFunc(values2[key]));
          seen[key] = `$${i}`;
          return `$${i}`;
        }
        return void 0;
      };
      sql = AbstractQuery.formatBindParameters(sql, values, dialect, replacementFunc)[0];
    }
    return [sql, bindParam];
  }
  async run(sql, parameters) {
    const { connection } = this;
    if (!_.isEmpty(this.options.searchPath)) {
      sql = this.sequelize.getQueryInterface().queryGenerator.setSearchPath(this.options.searchPath) + sql;
    }
    if (this.sequelize.options.minifyAliases && this.options.includeAliases) {
      _.toPairs(this.options.includeAliases).sort((a, b) => b[1].length - a[1].length).forEach(([alias, original]) => {
        const reg = new RegExp(_.escapeRegExp(original), "g");
        sql = sql.replace(reg, alias);
      });
    }
    this.sql = sql;
    const query = parameters && parameters.length ? new Promise((resolve, reject) => connection.query(sql, parameters, (error, result) => error ? reject(error) : resolve(result))) : new Promise((resolve, reject) => connection.query(sql, (error, result) => error ? reject(error) : resolve(result)));
    const complete = this._logQuery(sql, debug, parameters);
    let queryResult;
    const errForStack = new Error();
    try {
      queryResult = await query;
    } catch (error) {
      if (error.code === "ECONNRESET" || /Unable to set non-blocking to true/i.test(error) || /SSL SYSCALL error: EOF detected/i.test(error) || /Local: Authentication failure/i.test(error)) {
        connection._invalid = true;
      }
      error.sql = sql;
      error.parameters = parameters;
      throw this.formatError(error, errForStack.stack);
    }
    complete();
    let rows = Array.isArray(queryResult) ? queryResult.reduce((allRows, r) => allRows.concat(r.rows || []), []) : queryResult.rows;
    const rowCount = Array.isArray(queryResult) ? queryResult.reduce((count, r) => Number.isFinite(r.rowCount) ? count + r.rowCount : count, 0) : queryResult.rowCount || 0;
    if (this.sequelize.options.minifyAliases && this.options.aliasesMapping) {
      rows = rows.map((row) => _.toPairs(row).reduce((acc, [key, value]) => {
        const mapping = this.options.aliasesMapping.get(key);
        acc[mapping || key] = value;
        return acc;
      }, {}));
    }
    const isTableNameQuery = sql.startsWith("SELECT table_name FROM information_schema.tables");
    const isRelNameQuery = sql.startsWith("SELECT relname FROM pg_class WHERE oid IN");
    if (isRelNameQuery) {
      return rows.map((row) => ({
        name: row.relname,
        tableName: row.relname.split("_")[0]
      }));
    }
    if (isTableNameQuery) {
      return rows.map((row) => Object.values(row));
    }
    if (rows[0] && rows[0].sequelize_caught_exception !== void 0) {
      if (rows[0].sequelize_caught_exception !== null) {
        throw this.formatError({
          sql,
          parameters,
          code: "23505",
          detail: rows[0].sequelize_caught_exception
        });
      }
      for (const row of rows) {
        delete row.sequelize_caught_exception;
      }
    }
    if (this.isShowIndexesQuery()) {
      for (const row of rows) {
        const attributes = /ON .*? (?:USING .*?\s)?\(([^]*)\)/gi.exec(row.definition)[1].split(",");
        const columns = _.zipObject(row.column_indexes, this.sequelize.getQueryInterface().queryGenerator.fromArray(row.column_names));
        delete row.column_indexes;
        delete row.column_names;
        let field;
        let attribute;
        row.fields = row.indkey.split(" ").map((indKey, index) => {
          field = columns[indKey];
          if (!field) {
            return null;
          }
          attribute = attributes[index];
          return {
            attribute: field,
            collate: attribute.match(/COLLATE "(.*?)"/) ? /COLLATE "(.*?)"/.exec(attribute)[1] : void 0,
            order: attribute.includes("DESC") ? "DESC" : attribute.includes("ASC") ? "ASC" : void 0,
            length: void 0
          };
        }).filter((n) => n !== null);
        delete row.columns;
      }
      return rows;
    }
    if (this.isForeignKeysQuery()) {
      const result = [];
      for (const row of rows) {
        let defParts;
        if (row.condef !== void 0 && (defParts = row.condef.match(/FOREIGN KEY \((.+)\) REFERENCES (.+)\((.+)\)( ON (UPDATE|DELETE) (CASCADE|RESTRICT))?( ON (UPDATE|DELETE) (CASCADE|RESTRICT))?/))) {
          row.id = row.constraint_name;
          row.table = defParts[2];
          row.from = defParts[1];
          row.to = defParts[3];
          let i;
          for (i = 5; i <= 8; i += 3) {
            if (/(UPDATE|DELETE)/.test(defParts[i])) {
              row[`on_${defParts[i].toLowerCase()}`] = defParts[i + 1];
            }
          }
        }
        result.push(row);
      }
      return result;
    }
    if (this.isSelectQuery()) {
      let result = rows;
      if (this.options.raw === false && this.sequelize.options.quoteIdentifiers === false) {
        const attrsMap = _.reduce(this.model.rawAttributes, (m, v, k) => {
          m[k.toLowerCase()] = k;
          return m;
        }, {});
        result = rows.map((row) => {
          return _.mapKeys(row, (value, key) => {
            const targetAttr = attrsMap[key];
            if (typeof targetAttr === "string" && targetAttr !== key) {
              return targetAttr;
            }
            return key;
          });
        });
      }
      return this.handleSelectQuery(result);
    }
    if (QueryTypes.DESCRIBE === this.options.type) {
      const result = {};
      for (const row of rows) {
        result[row.Field] = {
          type: row.Type.toUpperCase(),
          allowNull: row.Null === "YES",
          defaultValue: row.Default,
          comment: row.Comment,
          special: row.special ? this.sequelize.getQueryInterface().queryGenerator.fromArray(row.special) : [],
          primaryKey: row.Constraint === "PRIMARY KEY"
        };
        if (result[row.Field].type === "BOOLEAN") {
          result[row.Field].defaultValue = { "false": false, "true": true }[result[row.Field].defaultValue];
          if (result[row.Field].defaultValue === void 0) {
            result[row.Field].defaultValue = null;
          }
        }
        if (typeof result[row.Field].defaultValue === "string") {
          result[row.Field].defaultValue = result[row.Field].defaultValue.replace(/'/g, "");
          if (result[row.Field].defaultValue.includes("::")) {
            const split = result[row.Field].defaultValue.split("::");
            if (split[1].toLowerCase() !== "regclass)") {
              result[row.Field].defaultValue = split[0];
            }
          }
        }
      }
      return result;
    }
    if (this.isVersionQuery()) {
      return rows[0].server_version;
    }
    if (this.isShowOrDescribeQuery()) {
      return rows;
    }
    if (QueryTypes.BULKUPDATE === this.options.type) {
      if (!this.options.returning) {
        return parseInt(rowCount, 10);
      }
      return this.handleSelectQuery(rows);
    }
    if (QueryTypes.BULKDELETE === this.options.type) {
      return parseInt(rowCount, 10);
    }
    if (this.isInsertQuery() || this.isUpdateQuery() || this.isUpsertQuery()) {
      if (this.instance && this.instance.dataValues) {
        if (this.isInsertQuery() && !this.isUpsertQuery() && rowCount === 0) {
          throw new sequelizeErrors.EmptyResultError();
        }
        for (const key in rows[0]) {
          if (Object.prototype.hasOwnProperty.call(rows[0], key)) {
            const record = rows[0][key];
            const attr = _.find(this.model.rawAttributes, (attribute) => attribute.fieldName === key || attribute.field === key);
            this.instance.dataValues[attr && attr.fieldName || key] = record;
          }
        }
      }
      if (this.isUpsertQuery()) {
        return [
          this.instance,
          null
        ];
      }
      return [
        this.instance || rows && (this.options.plain && rows[0] || rows) || void 0,
        rowCount
      ];
    }
    if (this.isRawQuery()) {
      return [rows, queryResult];
    }
    return rows;
  }
  formatError(err, errStack) {
    let match;
    let table;
    let index;
    let fields;
    let errors;
    let message;
    const code = err.code || err.sqlState;
    const errMessage = err.message || err.messagePrimary;
    const errDetail = err.detail || err.messageDetail;
    switch (code) {
      case "23503":
        index = errMessage.match(/violates foreign key constraint "(.+?)"/);
        index = index ? index[1] : void 0;
        table = errMessage.match(/on table "(.+?)"/);
        table = table ? table[1] : void 0;
        return new sequelizeErrors.ForeignKeyConstraintError({
          message: errMessage,
          fields: null,
          index,
          table,
          parent: err,
          stack: errStack
        });
      case "23505":
        if (errDetail && (match = errDetail.replace(/"/g, "").match(/Key \((.*?)\)=\((.*?)\)/))) {
          fields = _.zipObject(match[1].split(", "), match[2].split(", "));
          errors = [];
          message = "Validation error";
          _.forOwn(fields, (value, field) => {
            errors.push(new sequelizeErrors.ValidationErrorItem(this.getUniqueConstraintErrorMessage(field), "unique violation", field, value, this.instance, "not_unique"));
          });
          if (this.model && this.model.uniqueKeys) {
            _.forOwn(this.model.uniqueKeys, (constraint) => {
              if (_.isEqual(constraint.fields, Object.keys(fields)) && !!constraint.msg) {
                message = constraint.msg;
                return false;
              }
            });
          }
          return new sequelizeErrors.UniqueConstraintError({ message, errors, parent: err, fields, stack: errStack });
        }
        return new sequelizeErrors.UniqueConstraintError({
          message: errMessage,
          parent: err,
          stack: errStack
        });
      case "23P01":
        match = errDetail.match(/Key \((.*?)\)=\((.*?)\)/);
        if (match) {
          fields = _.zipObject(match[1].split(", "), match[2].split(", "));
        }
        message = "Exclusion constraint error";
        return new sequelizeErrors.ExclusionConstraintError({
          message,
          constraint: err.constraint,
          fields,
          table: err.table,
          parent: err,
          stack: errStack
        });
      case "42704":
        if (err.sql && /(CONSTRAINT|INDEX)/gi.test(err.sql)) {
          message = "Unknown constraint error";
          index = errMessage.match(/(?:constraint|index) "(.+?)"/i);
          index = index ? index[1] : void 0;
          table = errMessage.match(/relation "(.+?)"/i);
          table = table ? table[1] : void 0;
          throw new sequelizeErrors.UnknownConstraintError({
            message,
            constraint: index,
            fields,
            table,
            parent: err,
            stack: errStack
          });
        }
      default:
        return new sequelizeErrors.DatabaseError(err, { stack: errStack });
    }
  }
  isForeignKeysQuery() {
    return /SELECT conname as constraint_name, pg_catalog\.pg_get_constraintdef\(r\.oid, true\) as condef FROM pg_catalog\.pg_constraint r WHERE r\.conrelid = \(SELECT oid FROM pg_class WHERE relname = '.*' LIMIT 1\) AND r\.contype = 'f' ORDER BY 1;/.test(this.sql);
  }
  getInsertIdField() {
    return "id";
  }
}
module.exports = Query;
module.exports.Query = Query;
module.exports.default = Query;
//# sourceMappingURL=query.js.map
"use strict";
const _ = require("lodash");
function stringifyRangeBound(bound) {
  if (bound === null) {
    return "";
  }
  if (bound === Infinity || bound === -Infinity) {
    return bound.toString().toLowerCase();
  }
  return JSON.stringify(bound);
}
function parseRangeBound(bound, parseType) {
  if (!bound) {
    return null;
  }
  if (bound === "infinity") {
    return Infinity;
  }
  if (bound === "-infinity") {
    return -Infinity;
  }
  return parseType(bound);
}
function stringify(data) {
  if (data === null)
    return null;
  if (!Array.isArray(data))
    throw new Error("range must be an array");
  if (!data.length)
    return "empty";
  if (data.length !== 2)
    throw new Error("range array length must be 0 (empty) or 2 (lower and upper bounds)");
  if (Object.prototype.hasOwnProperty.call(data, "inclusive")) {
    if (data.inclusive === false)
      data.inclusive = [false, false];
    else if (!data.inclusive)
      data.inclusive = [true, false];
    else if (data.inclusive === true)
      data.inclusive = [true, true];
  } else {
    data.inclusive = [true, false];
  }
  _.each(data, (value, index) => {
    if (_.isObject(value)) {
      if (Object.prototype.hasOwnProperty.call(value, "inclusive"))
        data.inclusive[index] = !!value.inclusive;
      if (Object.prototype.hasOwnProperty.call(value, "value"))
        data[index] = value.value;
    }
  });
  const lowerBound = stringifyRangeBound(data[0]);
  const upperBound = stringifyRangeBound(data[1]);
  return `${(data.inclusive[0] ? "[" : "(") + lowerBound},${upperBound}${data.inclusive[1] ? "]" : ")"}`;
}
exports.stringify = stringify;
function parse(value, parser) {
  if (value === null)
    return null;
  if (value === "empty") {
    return [];
  }
  let result = value.substring(1, value.length - 1).split(",", 2);
  if (result.length !== 2)
    return value;
  result = result.map((item, index) => {
    return {
      value: parseRangeBound(item, parser),
      inclusive: index === 0 ? value[0] === "[" : value[value.length - 1] === "]"
    };
  });
  return result;
}
exports.parse = parse;
//# sourceMappingURL=range.js.map
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
const AbstractConnectionManager = require("../abstract/connection-manager");
const SequelizeErrors = require("../../errors");
const { logger } = require("../../utils/logger");
const DataTypes = require("../../data-types").mysql;
const momentTz = require("moment-timezone");
const debug = logger.debugContext("connection:mysql");
const parserStore = require("../parserStore")("mysql");
const { promisify } = require("util");
class ConnectionManager extends AbstractConnectionManager {
  constructor(dialect, sequelize) {
    sequelize.config.port = sequelize.config.port || 3306;
    super(dialect, sequelize);
    this.lib = this._loadDialectModule("mysql2");
    this.refreshTypeParser(DataTypes);
  }
  _refreshTypeParser(dataType) {
    parserStore.refresh(dataType);
  }
  _clearTypeParser() {
    parserStore.clear();
  }
  static _typecast(field, next) {
    if (parserStore.get(field.type)) {
      return parserStore.get(field.type)(field, this.sequelize.options, next);
    }
    return next();
  }
  async connect(config) {
    const connectionConfig = __spreadValues({
      host: config.host,
      port: config.port,
      user: config.username,
      flags: "-FOUND_ROWS",
      password: config.password,
      database: config.database,
      timezone: this.sequelize.options.timezone,
      typeCast: ConnectionManager._typecast.bind(this),
      bigNumberStrings: false,
      supportBigNumbers: true
    }, config.dialectOptions);
    try {
      const connection = await new Promise((resolve, reject) => {
        const connection2 = this.lib.createConnection(connectionConfig);
        const errorHandler = (e) => {
          connection2.removeListener("connect", connectHandler);
          connection2.removeListener("error", connectHandler);
          reject(e);
        };
        const connectHandler = () => {
          connection2.removeListener("error", errorHandler);
          resolve(connection2);
        };
        connection2.on("error", errorHandler);
        connection2.once("connect", connectHandler);
      });
      debug("connection acquired");
      connection.on("error", (error) => {
        switch (error.code) {
          case "ESOCKET":
          case "ECONNRESET":
          case "EPIPE":
          case "PROTOCOL_CONNECTION_LOST":
            this.pool.destroy(connection);
        }
      });
      if (!this.sequelize.config.keepDefaultTimezone) {
        let tzOffset = this.sequelize.options.timezone;
        tzOffset = /\//.test(tzOffset) ? momentTz.tz(tzOffset).format("Z") : tzOffset;
        await promisify((cb) => connection.query(`SET time_zone = '${tzOffset}'`, cb))();
      }
      return connection;
    } catch (err) {
      switch (err.code) {
        case "ECONNREFUSED":
          throw new SequelizeErrors.ConnectionRefusedError(err);
        case "ER_ACCESS_DENIED_ERROR":
          throw new SequelizeErrors.AccessDeniedError(err);
        case "ENOTFOUND":
          throw new SequelizeErrors.HostNotFoundError(err);
        case "EHOSTUNREACH":
          throw new SequelizeErrors.HostNotReachableError(err);
        case "EINVAL":
          throw new SequelizeErrors.InvalidConnectionError(err);
        default:
          throw new SequelizeErrors.ConnectionError(err);
      }
    }
  }
  async disconnect(connection) {
    if (connection._closing) {
      debug("connection tried to disconnect but was already at CLOSED state");
      return;
    }
    return await promisify((callback) => connection.end(callback))();
  }
  validate(connection) {
    return connection && !connection._fatalError && !connection._protocolError && !connection._closing && !connection.stream.destroyed;
  }
}
module.exports = ConnectionManager;
module.exports.ConnectionManager = ConnectionManager;
module.exports.default = ConnectionManager;
//# sourceMappingURL=connection-manager.js.map
"use strict";
const wkx = require("wkx");
const _ = require("lodash");
const momentTz = require("moment-timezone");
const moment = require("moment");
module.exports = (BaseTypes) => {
  BaseTypes.ABSTRACT.prototype.dialectTypes = "https://dev.mysql.com/doc/refman/5.7/en/data-types.html";
  BaseTypes.DATE.types.mysql = ["DATETIME"];
  BaseTypes.STRING.types.mysql = ["VAR_STRING"];
  BaseTypes.CHAR.types.mysql = ["STRING"];
  BaseTypes.TEXT.types.mysql = ["BLOB"];
  BaseTypes.TINYINT.types.mysql = ["TINY"];
  BaseTypes.SMALLINT.types.mysql = ["SHORT"];
  BaseTypes.MEDIUMINT.types.mysql = ["INT24"];
  BaseTypes.INTEGER.types.mysql = ["LONG"];
  BaseTypes.BIGINT.types.mysql = ["LONGLONG"];
  BaseTypes.FLOAT.types.mysql = ["FLOAT"];
  BaseTypes.TIME.types.mysql = ["TIME"];
  BaseTypes.DATEONLY.types.mysql = ["DATE"];
  BaseTypes.BOOLEAN.types.mysql = ["TINY"];
  BaseTypes.BLOB.types.mysql = ["TINYBLOB", "BLOB", "LONGBLOB"];
  BaseTypes.DECIMAL.types.mysql = ["NEWDECIMAL"];
  BaseTypes.UUID.types.mysql = false;
  BaseTypes.ENUM.types.mysql = false;
  BaseTypes.REAL.types.mysql = ["DOUBLE"];
  BaseTypes.DOUBLE.types.mysql = ["DOUBLE"];
  BaseTypes.GEOMETRY.types.mysql = ["GEOMETRY"];
  BaseTypes.JSON.types.mysql = ["JSON"];
  class DECIMAL extends BaseTypes.DECIMAL {
    toSql() {
      let definition = super.toSql();
      if (this._unsigned) {
        definition += " UNSIGNED";
      }
      if (this._zerofill) {
        definition += " ZEROFILL";
      }
      return definition;
    }
  }
  class DATE extends BaseTypes.DATE {
    toSql() {
      return this._length ? `DATETIME(${this._length})` : "DATETIME";
    }
    _stringify(date, options) {
      if (!moment.isMoment(date)) {
        date = this._applyTimezone(date, options);
      }
      if (this._length) {
        return date.format("YYYY-MM-DD HH:mm:ss.SSS");
      }
      return date.format("YYYY-MM-DD HH:mm:ss");
    }
    static parse(value, options) {
      value = value.string();
      if (value === null) {
        return value;
      }
      if (momentTz.tz.zone(options.timezone)) {
        value = momentTz.tz(value, options.timezone).toDate();
      } else {
        value = new Date(`${value} ${options.timezone}`);
      }
      return value;
    }
  }
  class DATEONLY extends BaseTypes.DATEONLY {
    static parse(value) {
      return value.string();
    }
  }
  class UUID extends BaseTypes.UUID {
    toSql() {
      return "CHAR(36) BINARY";
    }
  }
  const SUPPORTED_GEOMETRY_TYPES = ["POINT", "LINESTRING", "POLYGON"];
  class GEOMETRY extends BaseTypes.GEOMETRY {
    constructor(type, srid) {
      super(type, srid);
      if (_.isEmpty(this.type)) {
        this.sqlType = this.key;
        return;
      }
      if (SUPPORTED_GEOMETRY_TYPES.includes(this.type)) {
        this.sqlType = this.type;
        return;
      }
      throw new Error(`Supported geometry types are: ${SUPPORTED_GEOMETRY_TYPES.join(", ")}`);
    }
    static parse(value) {
      value = value.buffer();
      if (!value || value.length === 0) {
        return null;
      }
      value = value.slice(4);
      return wkx.Geometry.parse(value).toGeoJSON({ shortCrs: true });
    }
    toSql() {
      return this.sqlType;
    }
  }
  class ENUM extends BaseTypes.ENUM {
    toSql(options) {
      return `ENUM(${this.values.map((value) => options.escape(value)).join(", ")})`;
    }
  }
  class JSONTYPE extends BaseTypes.JSON {
    _stringify(value, options) {
      return options.operation === "where" && typeof value === "string" ? value : JSON.stringify(value);
    }
  }
  return {
    ENUM,
    DATE,
    DATEONLY,
    UUID,
    GEOMETRY,
    DECIMAL,
    JSON: JSONTYPE
  };
};
//# sourceMappingURL=data-types.js.map
"use strict";
const _ = require("lodash");
const AbstractDialect = require("../abstract");
const ConnectionManager = require("./connection-manager");
const Query = require("./query");
const QueryGenerator = require("./query-generator");
const DataTypes = require("../../data-types").mysql;
const { MySQLQueryInterface } = require("./query-interface");
class MysqlDialect extends AbstractDialect {
  constructor(sequelize) {
    super();
    this.sequelize = sequelize;
    this.connectionManager = new ConnectionManager(this, sequelize);
    this.queryGenerator = new QueryGenerator({
      _dialect: this,
      sequelize
    });
    this.queryInterface = new MySQLQueryInterface(sequelize, this.queryGenerator);
  }
}
MysqlDialect.prototype.supports = _.merge(_.cloneDeep(AbstractDialect.prototype.supports), {
  "VALUES ()": true,
  "LIMIT ON UPDATE": true,
  lock: true,
  forShare: "LOCK IN SHARE MODE",
  settingIsolationLevelDuringTransaction: false,
  inserts: {
    ignoreDuplicates: " IGNORE",
    updateOnDuplicate: " ON DUPLICATE KEY UPDATE"
  },
  index: {
    collate: false,
    length: true,
    parser: true,
    type: true,
    using: 1
  },
  constraints: {
    dropConstraint: false,
    check: false
  },
  indexViaAlter: true,
  indexHints: true,
  NUMERIC: true,
  GEOMETRY: true,
  JSON: true,
  REGEXP: true
});
MysqlDialect.prototype.defaultVersion = "5.7.0";
MysqlDialect.prototype.Query = Query;
MysqlDialect.prototype.QueryGenerator = QueryGenerator;
MysqlDialect.prototype.DataTypes = DataTypes;
MysqlDialect.prototype.name = "mysql";
MysqlDialect.prototype.TICK_CHAR = "`";
MysqlDialect.prototype.TICK_CHAR_LEFT = MysqlDialect.prototype.TICK_CHAR;
MysqlDialect.prototype.TICK_CHAR_RIGHT = MysqlDialect.prototype.TICK_CHAR;
module.exports = MysqlDialect;
//# sourceMappingURL=index.js.map
"use strict";
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
const _ = require("lodash");
const Utils = require("../../utils");
const AbstractQueryGenerator = require("../abstract/query-generator");
const util = require("util");
const Op = require("../../operators");
const JSON_FUNCTION_REGEX = /^\s*((?:[a-z]+_){0,2}jsonb?(?:_[a-z]+){0,2})\([^)]*\)/i;
const JSON_OPERATOR_REGEX = /^\s*(->>?|@>|<@|\?[|&]?|\|{2}|#-)/i;
const TOKEN_CAPTURE_REGEX = /^\s*((?:([`"'])(?:(?!\2).|\2{2})*\2)|[\w\d\s]+|[().,;+-])/i;
const FOREIGN_KEY_FIELDS = [
  "CONSTRAINT_NAME as constraint_name",
  "CONSTRAINT_NAME as constraintName",
  "CONSTRAINT_SCHEMA as constraintSchema",
  "CONSTRAINT_SCHEMA as constraintCatalog",
  "TABLE_NAME as tableName",
  "TABLE_SCHEMA as tableSchema",
  "TABLE_SCHEMA as tableCatalog",
  "COLUMN_NAME as columnName",
  "REFERENCED_TABLE_SCHEMA as referencedTableSchema",
  "REFERENCED_TABLE_SCHEMA as referencedTableCatalog",
  "REFERENCED_TABLE_NAME as referencedTableName",
  "REFERENCED_COLUMN_NAME as referencedColumnName"
].join(",");
const typeWithoutDefault = /* @__PURE__ */ new Set(["BLOB", "TEXT", "GEOMETRY", "JSON"]);
class MySQLQueryGenerator extends AbstractQueryGenerator {
  constructor(options) {
    super(options);
    this.OperatorMap = __spreadProps(__spreadValues({}, this.OperatorMap), {
      [Op.regexp]: "REGEXP",
      [Op.notRegexp]: "NOT REGEXP"
    });
  }
  createDatabaseQuery(databaseName, options) {
    options = __spreadValues({
      charset: null,
      collate: null
    }, options);
    return Utils.joinSQLFragments([
      "CREATE DATABASE IF NOT EXISTS",
      this.quoteIdentifier(databaseName),
      options.charset && `DEFAULT CHARACTER SET ${this.escape(options.charset)}`,
      options.collate && `DEFAULT COLLATE ${this.escape(options.collate)}`,
      ";"
    ]);
  }
  dropDatabaseQuery(databaseName) {
    return `DROP DATABASE IF EXISTS ${this.quoteIdentifier(databaseName)};`;
  }
  createSchema() {
    return "SHOW TABLES";
  }
  showSchemasQuery() {
    return "SHOW TABLES";
  }
  versionQuery() {
    return "SELECT VERSION() as `version`";
  }
  createTableQuery(tableName, attributes, options) {
    options = __spreadValues({
      engine: "InnoDB",
      charset: null,
      rowFormat: null
    }, options);
    const primaryKeys = [];
    const foreignKeys = {};
    const attrStr = [];
    for (const attr in attributes) {
      if (!Object.prototype.hasOwnProperty.call(attributes, attr))
        continue;
      const dataType = attributes[attr];
      let match;
      if (dataType.includes("PRIMARY KEY")) {
        primaryKeys.push(attr);
        if (dataType.includes("REFERENCES")) {
          match = dataType.match(/^(.+) (REFERENCES.*)$/);
          attrStr.push(`${this.quoteIdentifier(attr)} ${match[1].replace("PRIMARY KEY", "")}`);
          foreignKeys[attr] = match[2];
        } else {
          attrStr.push(`${this.quoteIdentifier(attr)} ${dataType.replace("PRIMARY KEY", "")}`);
        }
      } else if (dataType.includes("REFERENCES")) {
        match = dataType.match(/^(.+) (REFERENCES.*)$/);
        attrStr.push(`${this.quoteIdentifier(attr)} ${match[1]}`);
        foreignKeys[attr] = match[2];
      } else {
        attrStr.push(`${this.quoteIdentifier(attr)} ${dataType}`);
      }
    }
    const table = this.quoteTable(tableName);
    let attributesClause = attrStr.join(", ");
    const pkString = primaryKeys.map((pk) => this.quoteIdentifier(pk)).join(", ");
    if (options.uniqueKeys) {
      _.each(options.uniqueKeys, (columns, indexName) => {
        if (columns.customIndex) {
          if (typeof indexName !== "string") {
            indexName = `uniq_${tableName}_${columns.fields.join("_")}`;
          }
          attributesClause += `, UNIQUE ${this.quoteIdentifier(indexName)} (${columns.fields.map((field) => this.quoteIdentifier(field)).join(", ")})`;
        }
      });
    }
    if (pkString.length > 0) {
      attributesClause += `, PRIMARY KEY (${pkString})`;
    }
    for (const fkey in foreignKeys) {
      if (Object.prototype.hasOwnProperty.call(foreignKeys, fkey)) {
        attributesClause += `, FOREIGN KEY (${this.quoteIdentifier(fkey)}) ${foreignKeys[fkey]}`;
      }
    }
    return Utils.joinSQLFragments([
      "CREATE TABLE IF NOT EXISTS",
      table,
      `(${attributesClause})`,
      `ENGINE=${options.engine}`,
      options.comment && typeof options.comment === "string" && `COMMENT ${this.escape(options.comment)}`,
      options.charset && `DEFAULT CHARSET=${options.charset}`,
      options.collate && `COLLATE ${options.collate}`,
      options.initialAutoIncrement && `AUTO_INCREMENT=${options.initialAutoIncrement}`,
      options.rowFormat && `ROW_FORMAT=${options.rowFormat}`,
      ";"
    ]);
  }
  describeTableQuery(tableName, schema, schemaDelimiter) {
    const table = this.quoteTable(this.addSchema({
      tableName,
      _schema: schema,
      _schemaDelimiter: schemaDelimiter
    }));
    return `SHOW FULL COLUMNS FROM ${table};`;
  }
  showTablesQuery(database) {
    let query = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'";
    if (database) {
      query += ` AND TABLE_SCHEMA = ${this.escape(database)}`;
    } else {
      query += " AND TABLE_SCHEMA NOT IN ('MYSQL', 'INFORMATION_SCHEMA', 'PERFORMANCE_SCHEMA', 'SYS', 'mysql', 'information_schema', 'performance_schema', 'sys')";
    }
    return `${query};`;
  }
  tableExistsQuery(table) {
    const tableName = this.escape(this.quoteTable(table).slice(1, -1));
    return `SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = ${tableName} AND TABLE_SCHEMA = ${this.escape(this.sequelize.config.database)}`;
  }
  addColumnQuery(table, key, dataType) {
    return Utils.joinSQLFragments([
      "ALTER TABLE",
      this.quoteTable(table),
      "ADD",
      this.quoteIdentifier(key),
      this.attributeToSQL(dataType, {
        context: "addColumn",
        tableName: table,
        foreignKey: key
      }),
      ";"
    ]);
  }
  removeColumnQuery(tableName, attributeName) {
    return Utils.joinSQLFragments([
      "ALTER TABLE",
      this.quoteTable(tableName),
      "DROP",
      this.quoteIdentifier(attributeName),
      ";"
    ]);
  }
  changeColumnQuery(tableName, attributes) {
    const attrString = [];
    const constraintString = [];
    for (const attributeName in attributes) {
      let definition = attributes[attributeName];
      if (definition.includes("REFERENCES")) {
        const attrName = this.quoteIdentifier(attributeName);
        definition = definition.replace(/.+?(?=REFERENCES)/, "");
        constraintString.push(`FOREIGN KEY (${attrName}) ${definition}`);
      } else {
        attrString.push(`\`${attributeName}\` \`${attributeName}\` ${definition}`);
      }
    }
    return Utils.joinSQLFragments([
      "ALTER TABLE",
      this.quoteTable(tableName),
      attrString.length && `CHANGE ${attrString.join(", ")}`,
      constraintString.length && `ADD ${constraintString.join(", ")}`,
      ";"
    ]);
  }
  renameColumnQuery(tableName, attrBefore, attributes) {
    const attrString = [];
    for (const attrName in attributes) {
      const definition = attributes[attrName];
      attrString.push(`\`${attrBefore}\` \`${attrName}\` ${definition}`);
    }
    return Utils.joinSQLFragments([
      "ALTER TABLE",
      this.quoteTable(tableName),
      "CHANGE",
      attrString.join(", "),
      ";"
    ]);
  }
  handleSequelizeMethod(smth, tableName, factory, options, prepend) {
    if (smth instanceof Utils.Json) {
      if (smth.conditions) {
        const conditions = this.parseConditionObject(smth.conditions).map((condition) => `${this.jsonPathExtractionQuery(condition.path[0], _.tail(condition.path))} = '${condition.value}'`);
        return conditions.join(" AND ");
      }
      if (smth.path) {
        let str;
        if (this._checkValidJsonStatement(smth.path)) {
          str = smth.path;
        } else {
          const paths = _.toPath(smth.path);
          const column = paths.shift();
          str = this.jsonPathExtractionQuery(column, paths);
        }
        if (smth.value) {
          str += util.format(" = %s", this.escape(smth.value));
        }
        return str;
      }
    } else if (smth instanceof Utils.Cast) {
      if (/timestamp/i.test(smth.type)) {
        smth.type = "datetime";
      } else if (smth.json && /boolean/i.test(smth.type)) {
        smth.type = "char";
      } else if (/double precision/i.test(smth.type) || /boolean/i.test(smth.type) || /integer/i.test(smth.type)) {
        smth.type = "decimal";
      } else if (/text/i.test(smth.type)) {
        smth.type = "char";
      }
    }
    return super.handleSequelizeMethod(smth, tableName, factory, options, prepend);
  }
  _toJSONValue(value) {
    if (typeof value === "boolean") {
      return value.toString();
    }
    if (value === null) {
      return "null";
    }
    return value;
  }
  truncateTableQuery(tableName) {
    return `TRUNCATE ${this.quoteTable(tableName)}`;
  }
  deleteQuery(tableName, where, options = {}, model) {
    let limit = "";
    let query = `DELETE FROM ${this.quoteTable(tableName)}`;
    if (options.limit) {
      limit = ` LIMIT ${this.escape(options.limit)}`;
    }
    where = this.getWhereConditions(where, null, model, options);
    if (where) {
      query += ` WHERE ${where}`;
    }
    return query + limit;
  }
  showIndexesQuery(tableName, options) {
    return Utils.joinSQLFragments([
      `SHOW INDEX FROM ${this.quoteTable(tableName)}`,
      options && options.database && `FROM \`${options.database}\``
    ]);
  }
  showConstraintsQuery(table, constraintName) {
    const tableName = table.tableName || table;
    const schemaName = table.schema;
    return Utils.joinSQLFragments([
      "SELECT CONSTRAINT_CATALOG AS constraintCatalog,",
      "CONSTRAINT_NAME AS constraintName,",
      "CONSTRAINT_SCHEMA AS constraintSchema,",
      "CONSTRAINT_TYPE AS constraintType,",
      "TABLE_NAME AS tableName,",
      "TABLE_SCHEMA AS tableSchema",
      "from INFORMATION_SCHEMA.TABLE_CONSTRAINTS",
      `WHERE table_name='${tableName}'`,
      constraintName && `AND constraint_name = '${constraintName}'`,
      schemaName && `AND TABLE_SCHEMA = '${schemaName}'`,
      ";"
    ]);
  }
  removeIndexQuery(tableName, indexNameOrAttributes) {
    let indexName = indexNameOrAttributes;
    if (typeof indexName !== "string") {
      indexName = Utils.underscore(`${tableName}_${indexNameOrAttributes.join("_")}`);
    }
    return Utils.joinSQLFragments([
      "DROP INDEX",
      this.quoteIdentifier(indexName),
      "ON",
      this.quoteTable(tableName)
    ]);
  }
  attributeToSQL(attribute, options) {
    if (!_.isPlainObject(attribute)) {
      attribute = {
        type: attribute
      };
    }
    const attributeString = attribute.type.toString({ escape: this.escape.bind(this) });
    let template = attributeString;
    if (attribute.allowNull === false) {
      template += " NOT NULL";
    }
    if (attribute.autoIncrement) {
      template += " auto_increment";
    }
    if (!typeWithoutDefault.has(attributeString) && attribute.type._binary !== true && Utils.defaultValueSchemable(attribute.defaultValue)) {
      template += ` DEFAULT ${this.escape(attribute.defaultValue)}`;
    }
    if (attribute.unique === true) {
      template += " UNIQUE";
    }
    if (attribute.primaryKey) {
      template += " PRIMARY KEY";
    }
    if (attribute.comment) {
      template += ` COMMENT ${this.escape(attribute.comment)}`;
    }
    if (attribute.first) {
      template += " FIRST";
    }
    if (attribute.after) {
      template += ` AFTER ${this.quoteIdentifier(attribute.after)}`;
    }
    if ((!options || !options.withoutForeignKeyConstraints) && attribute.references) {
      if (options && options.context === "addColumn" && options.foreignKey) {
        const attrName = this.quoteIdentifier(options.foreignKey);
        const fkName = this.quoteIdentifier(`${options.tableName}_${attrName}_foreign_idx`);
        template += `, ADD CONSTRAINT ${fkName} FOREIGN KEY (${attrName})`;
      }
      template += ` REFERENCES ${this.quoteTable(attribute.references.model)}`;
      if (attribute.references.key) {
        template += ` (${this.quoteIdentifier(attribute.references.key)})`;
      } else {
        template += ` (${this.quoteIdentifier("id")})`;
      }
      if (attribute.onDelete) {
        template += ` ON DELETE ${attribute.onDelete.toUpperCase()}`;
      }
      if (attribute.onUpdate) {
        template += ` ON UPDATE ${attribute.onUpdate.toUpperCase()}`;
      }
    }
    return template;
  }
  attributesToSQL(attributes, options) {
    const result = {};
    for (const key in attributes) {
      const attribute = attributes[key];
      result[attribute.field || key] = this.attributeToSQL(attribute, options);
    }
    return result;
  }
  _checkValidJsonStatement(stmt) {
    if (typeof stmt !== "string") {
      return false;
    }
    let currentIndex = 0;
    let openingBrackets = 0;
    let closingBrackets = 0;
    let hasJsonFunction = false;
    let hasInvalidToken = false;
    while (currentIndex < stmt.length) {
      const string = stmt.substr(currentIndex);
      const functionMatches = JSON_FUNCTION_REGEX.exec(string);
      if (functionMatches) {
        currentIndex += functionMatches[0].indexOf("(");
        hasJsonFunction = true;
        continue;
      }
      const operatorMatches = JSON_OPERATOR_REGEX.exec(string);
      if (operatorMatches) {
        currentIndex += operatorMatches[0].length;
        hasJsonFunction = true;
        continue;
      }
      const tokenMatches = TOKEN_CAPTURE_REGEX.exec(string);
      if (tokenMatches) {
        const capturedToken = tokenMatches[1];
        if (capturedToken === "(") {
          openingBrackets++;
        } else if (capturedToken === ")") {
          closingBrackets++;
        } else if (capturedToken === ";") {
          hasInvalidToken = true;
          break;
        }
        currentIndex += tokenMatches[0].length;
        continue;
      }
      break;
    }
    if (hasJsonFunction && (hasInvalidToken || openingBrackets !== closingBrackets)) {
      throw new Error(`Invalid json statement: ${stmt}`);
    }
    return hasJsonFunction;
  }
  getForeignKeysQuery(table, schemaName) {
    const tableName = table.tableName || table;
    return Utils.joinSQLFragments([
      "SELECT",
      FOREIGN_KEY_FIELDS,
      `FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME = '${tableName}'`,
      `AND CONSTRAINT_NAME!='PRIMARY' AND CONSTRAINT_SCHEMA='${schemaName}'`,
      "AND REFERENCED_TABLE_NAME IS NOT NULL",
      ";"
    ]);
  }
  getForeignKeyQuery(table, columnName) {
    const quotedSchemaName = table.schema ? wrapSingleQuote(table.schema) : "";
    const quotedTableName = wrapSingleQuote(table.tableName || table);
    const quotedColumnName = wrapSingleQuote(columnName);
    return Utils.joinSQLFragments([
      "SELECT",
      FOREIGN_KEY_FIELDS,
      "FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE",
      "WHERE (",
      [
        `REFERENCED_TABLE_NAME = ${quotedTableName}`,
        table.schema && `AND REFERENCED_TABLE_SCHEMA = ${quotedSchemaName}`,
        `AND REFERENCED_COLUMN_NAME = ${quotedColumnName}`
      ],
      ") OR (",
      [
        `TABLE_NAME = ${quotedTableName}`,
        table.schema && `AND TABLE_SCHEMA = ${quotedSchemaName}`,
        `AND COLUMN_NAME = ${quotedColumnName}`,
        "AND REFERENCED_TABLE_NAME IS NOT NULL"
      ],
      ")"
    ]);
  }
  dropForeignKeyQuery(tableName, foreignKey) {
    return Utils.joinSQLFragments([
      "ALTER TABLE",
      this.quoteTable(tableName),
      "DROP FOREIGN KEY",
      this.quoteIdentifier(foreignKey),
      ";"
    ]);
  }
  quoteIdentifier(identifier, force) {
    return Utils.addTicks(Utils.removeTicks(identifier, "`"), "`");
  }
}
function wrapSingleQuote(identifier) {
  return Utils.addTicks(identifier, "'");
}
module.exports = MySQLQueryGenerator;
//# sourceMappingURL=query-generator.js.map
"use strict";
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
const sequelizeErrors = require("../../errors");
const { QueryInterface } = require("../abstract/query-interface");
const QueryTypes = require("../../query-types");
class MySQLQueryInterface extends QueryInterface {
  async removeColumn(tableName, columnName, options) {
    options = options || {};
    const [results] = await this.sequelize.query(this.queryGenerator.getForeignKeyQuery(tableName.tableName ? tableName : {
      tableName,
      schema: this.sequelize.config.database
    }, columnName), __spreadValues({ raw: true }, options));
    if (results.length && results[0].constraint_name !== "PRIMARY") {
      await Promise.all(results.map((constraint) => this.sequelize.query(this.queryGenerator.dropForeignKeyQuery(tableName, constraint.constraint_name), __spreadValues({ raw: true }, options))));
    }
    return await this.sequelize.query(this.queryGenerator.removeColumnQuery(tableName, columnName), __spreadValues({ raw: true }, options));
  }
  async upsert(tableName, insertValues, updateValues, where, options) {
    options = __spreadValues({}, options);
    options.type = QueryTypes.UPSERT;
    options.updateOnDuplicate = Object.keys(updateValues);
    options.upsertKeys = Object.values(options.model.primaryKeys).map((item) => item.field);
    const model = options.model;
    const sql = this.queryGenerator.insertQuery(tableName, insertValues, model.rawAttributes, options);
    return await this.sequelize.query(sql, options);
  }
  async removeConstraint(tableName, constraintName, options) {
    const sql = this.queryGenerator.showConstraintsQuery(tableName.tableName ? tableName : {
      tableName,
      schema: this.sequelize.config.database
    }, constraintName);
    const constraints = await this.sequelize.query(sql, __spreadProps(__spreadValues({}, options), {
      type: this.sequelize.QueryTypes.SHOWCONSTRAINTS
    }));
    const constraint = constraints[0];
    let query;
    if (!constraint || !constraint.constraintType) {
      throw new sequelizeErrors.UnknownConstraintError({
        message: `Constraint ${constraintName} on table ${tableName} does not exist`,
        constraint: constraintName,
        table: tableName
      });
    }
    if (constraint.constraintType === "FOREIGN KEY") {
      query = this.queryGenerator.dropForeignKeyQuery(tableName, constraintName);
    } else {
      query = this.queryGenerator.removeIndexQuery(constraint.tableName, constraint.constraintName);
    }
    return await this.sequelize.query(query, options);
  }
}
exports.MySQLQueryInterface = MySQLQueryInterface;
//# sourceMappingURL=query-interface.js.map
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
const AbstractQuery = require("../abstract/query");
const sequelizeErrors = require("../../errors");
const _ = require("lodash");
const { logger } = require("../../utils/logger");
const ER_DUP_ENTRY = 1062;
const ER_DEADLOCK = 1213;
const ER_ROW_IS_REFERENCED = 1451;
const ER_NO_REFERENCED_ROW = 1452;
const debug = logger.debugContext("sql:mysql");
class Query extends AbstractQuery {
  constructor(connection, sequelize, options) {
    super(connection, sequelize, __spreadValues({ showWarnings: false }, options));
  }
  static formatBindParameters(sql, values, dialect) {
    const bindParam = [];
    const replacementFunc = (match, key, values_) => {
      if (values_[key] !== void 0) {
        bindParam.push(values_[key]);
        return "?";
      }
      return void 0;
    };
    sql = AbstractQuery.formatBindParameters(sql, values, dialect, replacementFunc)[0];
    return [sql, bindParam.length > 0 ? bindParam : void 0];
  }
  async run(sql, parameters) {
    this.sql = sql;
    const { connection, options } = this;
    const showWarnings = this.sequelize.options.showWarnings || options.showWarnings;
    const complete = this._logQuery(sql, debug, parameters);
    if (parameters) {
      debug("parameters(%j)", parameters);
    }
    let results;
    const errForStack = new Error();
    try {
      if (parameters && parameters.length) {
        results = await new Promise((resolve, reject) => {
          connection.execute(sql, parameters, (error, result) => error ? reject(error) : resolve(result)).setMaxListeners(100);
        });
      } else {
        results = await new Promise((resolve, reject) => {
          connection.query({ sql }, (error, result) => error ? reject(error) : resolve(result)).setMaxListeners(100);
        });
      }
    } catch (error) {
      if (options.transaction && error.errno === ER_DEADLOCK) {
        try {
          await options.transaction.rollback();
        } catch (error_) {
        }
        options.transaction.finished = "rollback";
      }
      error.sql = sql;
      error.parameters = parameters;
      throw this.formatError(error, errForStack.stack);
    } finally {
      complete();
    }
    if (showWarnings && results && results.warningStatus > 0) {
      await this.logWarnings(results);
    }
    return this.formatResults(results);
  }
  formatResults(data) {
    let result = this.instance;
    if (this.isInsertQuery(data)) {
      this.handleInsertQuery(data);
      if (!this.instance) {
        if (data.constructor.name === "ResultSetHeader" && this.model && this.model.autoIncrementAttribute && this.model.autoIncrementAttribute === this.model.primaryKeyAttribute && this.model.rawAttributes[this.model.primaryKeyAttribute]) {
          const startId = data[this.getInsertIdField()];
          result = [];
          for (let i = startId; i < startId + data.affectedRows; i++) {
            result.push({ [this.model.rawAttributes[this.model.primaryKeyAttribute].field]: i });
          }
        } else {
          result = data[this.getInsertIdField()];
        }
      }
    }
    if (this.isSelectQuery()) {
      return this.handleSelectQuery(data);
    }
    if (this.isShowTablesQuery()) {
      return this.handleShowTablesQuery(data);
    }
    if (this.isDescribeQuery()) {
      result = {};
      for (const _result of data) {
        const enumRegex = /^enum/i;
        result[_result.Field] = {
          type: enumRegex.test(_result.Type) ? _result.Type.replace(enumRegex, "ENUM") : _result.Type.toUpperCase(),
          allowNull: _result.Null === "YES",
          defaultValue: _result.Default,
          primaryKey: _result.Key === "PRI",
          autoIncrement: Object.prototype.hasOwnProperty.call(_result, "Extra") && _result.Extra.toLowerCase() === "auto_increment",
          comment: _result.Comment ? _result.Comment : null
        };
      }
      return result;
    }
    if (this.isShowIndexesQuery()) {
      return this.handleShowIndexesQuery(data);
    }
    if (this.isCallQuery()) {
      return data[0];
    }
    if (this.isBulkUpdateQuery() || this.isBulkDeleteQuery()) {
      return data.affectedRows;
    }
    if (this.isVersionQuery()) {
      return data[0].version;
    }
    if (this.isForeignKeysQuery()) {
      return data;
    }
    if (this.isUpsertQuery()) {
      return [result, data.affectedRows === 1];
    }
    if (this.isInsertQuery() || this.isUpdateQuery()) {
      return [result, data.affectedRows];
    }
    if (this.isShowConstraintsQuery()) {
      return data;
    }
    if (this.isRawQuery()) {
      return [data, data];
    }
    return result;
  }
  async logWarnings(results) {
    const warningResults = await this.run("SHOW WARNINGS");
    const warningMessage = `MySQL Warnings (${this.connection.uuid || "default"}): `;
    const messages = [];
    for (const _warningRow of warningResults) {
      if (_warningRow === void 0 || typeof _warningRow[Symbol.iterator] !== "function") {
        continue;
      }
      for (const _warningResult of _warningRow) {
        if (Object.prototype.hasOwnProperty.call(_warningResult, "Message")) {
          messages.push(_warningResult.Message);
        } else {
          for (const _objectKey of _warningResult.keys()) {
            messages.push([_objectKey, _warningResult[_objectKey]].join(": "));
          }
        }
      }
    }
    this.sequelize.log(warningMessage + messages.join("; "), this.options);
    return results;
  }
  formatError(err, errStack) {
    const errCode = err.errno || err.code;
    switch (errCode) {
      case ER_DUP_ENTRY: {
        const match = err.message.match(/Duplicate entry '([\s\S]*)' for key '?((.|\s)*?)'?$/);
        let fields = {};
        let message = "Validation error";
        const values = match ? match[1].split("-") : void 0;
        const fieldKey = match ? match[2].split(".").pop() : void 0;
        const fieldVal = match ? match[1] : void 0;
        const uniqueKey = this.model && this.model.uniqueKeys[fieldKey];
        if (uniqueKey) {
          if (uniqueKey.msg)
            message = uniqueKey.msg;
          fields = _.zipObject(uniqueKey.fields, values);
        } else {
          fields[fieldKey] = fieldVal;
        }
        const errors = [];
        _.forOwn(fields, (value, field) => {
          errors.push(new sequelizeErrors.ValidationErrorItem(this.getUniqueConstraintErrorMessage(field), "unique violation", field, value, this.instance, "not_unique"));
        });
        return new sequelizeErrors.UniqueConstraintError({ message, errors, parent: err, fields, stack: errStack });
      }
      case ER_ROW_IS_REFERENCED:
      case ER_NO_REFERENCED_ROW: {
        const match = err.message.match(/CONSTRAINT ([`"])(.*)\1 FOREIGN KEY \(\1(.*)\1\) REFERENCES \1(.*)\1 \(\1(.*)\1\)/);
        const quoteChar = match ? match[1] : "`";
        const fields = match ? match[3].split(new RegExp(`${quoteChar}, *${quoteChar}`)) : void 0;
        return new sequelizeErrors.ForeignKeyConstraintError({
          reltype: String(errCode) === String(ER_ROW_IS_REFERENCED) ? "parent" : "child",
          table: match ? match[4] : void 0,
          fields,
          value: fields && fields.length && this.instance && this.instance[fields[0]] || void 0,
          index: match ? match[2] : void 0,
          parent: err,
          stack: errStack
        });
      }
      default:
        return new sequelizeErrors.DatabaseError(err, { stack: errStack });
    }
  }
  handleShowIndexesQuery(data) {
    data = data.reduce((acc, item) => {
      if (!(item.Key_name in acc)) {
        acc[item.Key_name] = item;
        item.fields = [];
      }
      acc[item.Key_name].fields[item.Seq_in_index - 1] = {
        attribute: item.Column_name,
        length: item.Sub_part || void 0,
        order: item.Collation === "A" ? "ASC" : void 0
      };
      delete item.column_name;
      return acc;
    }, {});
    return _.map(data, (item) => ({
      primary: item.Key_name === "PRIMARY",
      fields: item.fields,
      name: item.Key_name,
      tableName: item.Table,
      unique: item.Non_unique !== 1,
      type: item.Index_type
    }));
  }
}
module.exports = Query;
module.exports.Query = Query;
module.exports.default = Query;
//# sourceMappingURL=query.js.map
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
  __markAsModule(target);
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
  if (module2 && typeof module2 === "object" || typeof module2 === "function") {
    for (let key of __getOwnPropNames(module2))
      if (!__hasOwnProp.call(target, key) && key !== "default")
        __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
  }
  return target;
};
var __toModule = (module2) => {
  return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
var __publicField = (obj, key, value) => {
  __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
  return value;
};
__export(exports, {
  AsyncQueueError: () => AsyncQueueError,
  default: () => async_queue_default
});
var import_base_error = __toModule(require("../../errors/base-error"));
var import_connection_error = __toModule(require("../../errors/connection-error"));
class AsyncQueueError extends import_base_error.default {
  constructor(message) {
    super(message);
    this.name = "SequelizeAsyncQueueError";
  }
}
class AsyncQueue {
  constructor() {
    __publicField(this, "previous");
    __publicField(this, "closed");
    __publicField(this, "rejectCurrent");
    this.previous = Promise.resolve();
    this.closed = false;
    this.rejectCurrent = () => {
    };
  }
  close() {
    this.closed = true;
    this.rejectCurrent(new import_connection_error.default(new AsyncQueueError("the connection was closed before this query could finish executing")));
  }
  enqueue(asyncFunction) {
    return new Promise((resolve, reject) => {
      this.previous = this.previous.then(() => {
        this.rejectCurrent = reject;
        if (this.closed) {
          return reject(new import_connection_error.default(new AsyncQueueError("the connection was closed before this query could be executed")));
        }
        return asyncFunction().then(resolve, reject);
      });
    });
  }
}
var async_queue_default = AsyncQueue;
//# sourceMappingURL=async-queue.js.map
"use strict";
const AbstractConnectionManager = require("../abstract/connection-manager");
const AsyncQueue = require("./async-queue").default;
const { logger } = require("../../utils/logger");
const sequelizeErrors = require("../../errors");
const DataTypes = require("../../data-types").mssql;
const parserStore = require("../parserStore")("mssql");
const debug = logger.debugContext("connection:mssql");
const debugTedious = logger.debugContext("connection:mssql:tedious");
class ConnectionManager extends AbstractConnectionManager {
  constructor(dialect, sequelize) {
    sequelize.config.port = sequelize.config.port || 1433;
    super(dialect, sequelize);
    this.lib = this._loadDialectModule("tedious");
    this.refreshTypeParser(DataTypes);
  }
  _refreshTypeParser(dataType) {
    parserStore.refresh(dataType);
  }
  _clearTypeParser() {
    parserStore.clear();
  }
  async connect(config) {
    const connectionConfig = {
      server: config.host,
      authentication: {
        type: "default",
        options: {
          userName: config.username || void 0,
          password: config.password || void 0
        }
      },
      options: {
        port: parseInt(config.port, 10),
        database: config.database,
        trustServerCertificate: true
      }
    };
    if (config.dialectOptions) {
      if (config.dialectOptions.options && config.dialectOptions.options.instanceName) {
        delete connectionConfig.options.port;
      }
      if (config.dialectOptions.authentication) {
        Object.assign(connectionConfig.authentication, config.dialectOptions.authentication);
      }
      Object.assign(connectionConfig.options, config.dialectOptions.options);
    }
    try {
      return await new Promise((resolve, reject) => {
        const connection = new this.lib.Connection(connectionConfig);
        if (connection.state === connection.STATE.INITIALIZED) {
          connection.connect();
        }
        connection.queue = new AsyncQueue();
        connection.lib = this.lib;
        const connectHandler = (error) => {
          connection.removeListener("end", endHandler);
          connection.removeListener("error", errorHandler);
          if (error)
            return reject(error);
          debug("connection acquired");
          resolve(connection);
        };
        const endHandler = () => {
          connection.removeListener("connect", connectHandler);
          connection.removeListener("error", errorHandler);
          reject(new Error("Connection was closed by remote server"));
        };
        const errorHandler = (error) => {
          connection.removeListener("connect", connectHandler);
          connection.removeListener("end", endHandler);
          reject(error);
        };
        connection.once("error", errorHandler);
        connection.once("end", endHandler);
        connection.once("connect", connectHandler);
        connection.on("error", (error) => {
          switch (error.code) {
            case "ESOCKET":
            case "ECONNRESET":
              this.pool.destroy(connection);
          }
        });
        if (config.dialectOptions && config.dialectOptions.debug) {
          connection.on("debug", debugTedious.log.bind(debugTedious));
        }
      });
    } catch (error) {
      if (!error.code) {
        throw new sequelizeErrors.ConnectionError(error);
      }
      switch (error.code) {
        case "ESOCKET":
          if (error.message.includes("connect EHOSTUNREACH")) {
            throw new sequelizeErrors.HostNotReachableError(error);
          }
          if (error.message.includes("connect ENETUNREACH")) {
            throw new sequelizeErrors.HostNotReachableError(error);
          }
          if (error.message.includes("connect EADDRNOTAVAIL")) {
            throw new sequelizeErrors.HostNotReachableError(error);
          }
          if (error.message.includes("getaddrinfo ENOTFOUND")) {
            throw new sequelizeErrors.HostNotFoundError(error);
          }
          if (error.message.includes("connect ECONNREFUSED")) {
            throw new sequelizeErrors.ConnectionRefusedError(error);
          }
          throw new sequelizeErrors.ConnectionError(error);
        case "ER_ACCESS_DENIED_ERROR":
        case "ELOGIN":
          throw new sequelizeErrors.AccessDeniedError(error);
        case "EINVAL":
          throw new sequelizeErrors.InvalidConnectionError(error);
        default:
          throw new sequelizeErrors.ConnectionError(error);
      }
    }
  }
  async disconnect(connection) {
    if (connection.closed) {
      return;
    }
    connection.queue.close();
    return new Promise((resolve) => {
      connection.on("end", resolve);
      connection.close();
      debug("connection closed");
    });
  }
  validate(connection) {
    return connection && (connection.loggedIn || connection.state.name === "LoggedIn");
  }
}
module.exports = ConnectionManager;
module.exports.ConnectionManager = ConnectionManager;
module.exports.default = ConnectionManager;
//# sourceMappingURL=connection-manager.js.map
"use strict";
const moment = require("moment");
module.exports = (BaseTypes) => {
  const warn = BaseTypes.ABSTRACT.warn.bind(void 0, "https://msdn.microsoft.com/en-us/library/ms187752%28v=sql.110%29.aspx");
  function removeUnsupportedIntegerOptions(dataType) {
    if (dataType._length || dataType.options.length || dataType._unsigned || dataType._zerofill) {
      warn(`MSSQL does not support '${dataType.key}' with options. Plain '${dataType.key}' will be used instead.`);
      dataType._length = void 0;
      dataType.options.length = void 0;
      dataType._unsigned = void 0;
      dataType._zerofill = void 0;
    }
  }
  BaseTypes.DATE.types.mssql = [43];
  BaseTypes.STRING.types.mssql = [231, 173];
  BaseTypes.CHAR.types.mssql = [175];
  BaseTypes.TEXT.types.mssql = false;
  BaseTypes.TINYINT.types.mssql = [30];
  BaseTypes.SMALLINT.types.mssql = [34];
  BaseTypes.MEDIUMINT.types.mssql = false;
  BaseTypes.INTEGER.types.mssql = [38];
  BaseTypes.BIGINT.types.mssql = false;
  BaseTypes.FLOAT.types.mssql = [109];
  BaseTypes.TIME.types.mssql = [41];
  BaseTypes.DATEONLY.types.mssql = [40];
  BaseTypes.BOOLEAN.types.mssql = [104];
  BaseTypes.BLOB.types.mssql = [165];
  BaseTypes.DECIMAL.types.mssql = [106];
  BaseTypes.UUID.types.mssql = false;
  BaseTypes.ENUM.types.mssql = false;
  BaseTypes.REAL.types.mssql = [109];
  BaseTypes.DOUBLE.types.mssql = [109];
  BaseTypes.GEOMETRY.types.mssql = false;
  class BLOB extends BaseTypes.BLOB {
    toSql() {
      if (this._length) {
        if (this._length.toLowerCase() === "tiny") {
          warn("MSSQL does not support BLOB with the `length` = `tiny` option. `VARBINARY(256)` will be used instead.");
          return "VARBINARY(256)";
        }
        warn("MSSQL does not support BLOB with the `length` option. `VARBINARY(MAX)` will be used instead.");
      }
      return "VARBINARY(MAX)";
    }
    _hexify(hex) {
      return `0x${hex}`;
    }
  }
  class STRING extends BaseTypes.STRING {
    toSql() {
      if (!this._binary) {
        return `NVARCHAR(${this._length})`;
      }
      return `BINARY(${this._length})`;
    }
    _stringify(value, options) {
      if (this._binary) {
        return BLOB.prototype._stringify(value);
      }
      return options.escape(value);
    }
    _bindParam(value, options) {
      return options.bindParam(this._binary ? Buffer.from(value) : value);
    }
  }
  STRING.prototype.escape = false;
  class TEXT extends BaseTypes.TEXT {
    toSql() {
      if (this._length) {
        if (this._length.toLowerCase() === "tiny") {
          warn("MSSQL does not support TEXT with the `length` = `tiny` option. `NVARCHAR(256)` will be used instead.");
          return "NVARCHAR(256)";
        }
        warn("MSSQL does not support TEXT with the `length` option. `NVARCHAR(MAX)` will be used instead.");
      }
      return "NVARCHAR(MAX)";
    }
  }
  class BOOLEAN extends BaseTypes.BOOLEAN {
    toSql() {
      return "BIT";
    }
  }
  class UUID extends BaseTypes.UUID {
    toSql() {
      return "CHAR(36)";
    }
  }
  class NOW extends BaseTypes.NOW {
    toSql() {
      return "GETDATE()";
    }
  }
  class DATE extends BaseTypes.DATE {
    toSql() {
      return "DATETIMEOFFSET";
    }
  }
  class DATEONLY extends BaseTypes.DATEONLY {
    static parse(value) {
      return moment(value).format("YYYY-MM-DD");
    }
  }
  class INTEGER extends BaseTypes.INTEGER {
    constructor(length) {
      super(length);
      removeUnsupportedIntegerOptions(this);
    }
  }
  class TINYINT extends BaseTypes.TINYINT {
    constructor(length) {
      super(length);
      removeUnsupportedIntegerOptions(this);
    }
  }
  class SMALLINT extends BaseTypes.SMALLINT {
    constructor(length) {
      super(length);
      removeUnsupportedIntegerOptions(this);
    }
  }
  class BIGINT extends BaseTypes.BIGINT {
    constructor(length) {
      super(length);
      removeUnsupportedIntegerOptions(this);
    }
  }
  class REAL extends BaseTypes.REAL {
    constructor(length, decimals) {
      super(length, decimals);
      if (this._length || this.options.length || this._unsigned || this._zerofill) {
        warn("MSSQL does not support REAL with options. Plain `REAL` will be used instead.");
        this._length = void 0;
        this.options.length = void 0;
        this._unsigned = void 0;
        this._zerofill = void 0;
      }
    }
  }
  class FLOAT extends BaseTypes.FLOAT {
    constructor(length, decimals) {
      super(length, decimals);
      if (this._decimals) {
        warn("MSSQL does not support Float with decimals. Plain `FLOAT` will be used instead.");
        this._length = void 0;
        this.options.length = void 0;
      }
      if (this._unsigned) {
        warn("MSSQL does not support Float unsigned. `UNSIGNED` was removed.");
        this._unsigned = void 0;
      }
      if (this._zerofill) {
        warn("MSSQL does not support Float zerofill. `ZEROFILL` was removed.");
        this._zerofill = void 0;
      }
    }
  }
  class ENUM extends BaseTypes.ENUM {
    toSql() {
      return "VARCHAR(255)";
    }
  }
  return {
    BLOB,
    BOOLEAN,
    ENUM,
    STRING,
    UUID,
    DATE,
    DATEONLY,
    NOW,
    TINYINT,
    SMALLINT,
    INTEGER,
    BIGINT,
    REAL,
    FLOAT,
    TEXT
  };
};
//# sourceMappingURL=data-types.js.map
"use strict";
const _ = require("lodash");
const AbstractDialect = require("../abstract");
const ConnectionManager = require("./connection-manager");
const Query = require("./query");
const QueryGenerator = require("./query-generator");
const DataTypes = require("../../data-types").mssql;
const { MSSqlQueryInterface } = require("./query-interface");
class MssqlDialect extends AbstractDialect {
  constructor(sequelize) {
    super();
    this.sequelize = sequelize;
    this.connectionManager = new ConnectionManager(this, sequelize);
    this.queryGenerator = new QueryGenerator({
      _dialect: this,
      sequelize
    });
    this.queryInterface = new MSSqlQueryInterface(sequelize, this.queryGenerator);
  }
}
MssqlDialect.prototype.supports = _.merge(_.cloneDeep(AbstractDialect.prototype.supports), {
  DEFAULT: true,
  "DEFAULT VALUES": true,
  "LIMIT ON UPDATE": true,
  "ORDER NULLS": false,
  lock: false,
  transactions: true,
  migrations: false,
  returnValues: {
    output: true
  },
  schemas: true,
  autoIncrement: {
    identityInsert: true,
    defaultValue: false,
    update: false
  },
  constraints: {
    restrict: false,
    default: true
  },
  index: {
    collate: false,
    length: false,
    parser: false,
    type: true,
    using: false,
    where: true
  },
  NUMERIC: true,
  tmpTableTrigger: true
});
MssqlDialect.prototype.defaultVersion = "12.0.2000";
MssqlDialect.prototype.Query = Query;
MssqlDialect.prototype.name = "mssql";
MssqlDialect.prototype.TICK_CHAR = '"';
MssqlDialect.prototype.TICK_CHAR_LEFT = "[";
MssqlDialect.prototype.TICK_CHAR_RIGHT = "]";
MssqlDialect.prototype.DataTypes = DataTypes;
module.exports = MssqlDialect;
//# sourceMappingURL=index.js.map
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
const _ = require("lodash");
const Utils = require("../../utils");
const DataTypes = require("../../data-types");
const TableHints = require("../../table-hints");
const AbstractQueryGenerator = require("../abstract/query-generator");
const randomBytes = require("crypto").randomBytes;
const semver = require("semver");
const Op = require("../../operators");
const throwMethodUndefined = function(methodName) {
  throw new Error(`The method "${methodName}" is not defined! Please add it to your sql dialect.`);
};
class MSSQLQueryGenerator extends AbstractQueryGenerator {
  createDatabaseQuery(databaseName, options) {
    options = __spreadValues({ collate: null }, options);
    const collation = options.collate ? `COLLATE ${this.escape(options.collate)}` : "";
    return [
      "IF NOT EXISTS (SELECT * FROM sys.databases WHERE name =",
      wrapSingleQuote(databaseName),
      ")",
      "BEGIN",
      "CREATE DATABASE",
      this.quoteIdentifier(databaseName),
      `${collation};`,
      "END;"
    ].join(" ");
  }
  dropDatabaseQuery(databaseName) {
    return [
      "IF EXISTS (SELECT * FROM sys.databases WHERE name =",
      wrapSingleQuote(databaseName),
      ")",
      "BEGIN",
      "DROP DATABASE",
      this.quoteIdentifier(databaseName),
      ";",
      "END;"
    ].join(" ");
  }
  createSchema(schema) {
    return [
      "IF NOT EXISTS (SELECT schema_name",
      "FROM information_schema.schemata",
      "WHERE schema_name =",
      wrapSingleQuote(schema),
      ")",
      "BEGIN",
      "EXEC sp_executesql N'CREATE SCHEMA",
      this.quoteIdentifier(schema),
      ";'",
      "END;"
    ].join(" ");
  }
  dropSchema(schema) {
    const quotedSchema = wrapSingleQuote(schema);
    return [
      "IF EXISTS (SELECT schema_name",
      "FROM information_schema.schemata",
      "WHERE schema_name =",
      quotedSchema,
      ")",
      "BEGIN",
      "DECLARE @id INT, @ms_sql NVARCHAR(2000);",
      "DECLARE @cascade TABLE (",
      "id INT NOT NULL IDENTITY PRIMARY KEY,",
      "ms_sql NVARCHAR(2000) NOT NULL );",
      "INSERT INTO @cascade ( ms_sql )",
      "SELECT CASE WHEN o.type IN ('F','PK')",
      "THEN N'ALTER TABLE ['+ s.name + N'].[' + p.name + N'] DROP CONSTRAINT [' + o.name + N']'",
      "ELSE N'DROP TABLE ['+ s.name + N'].[' + o.name + N']' END",
      "FROM sys.objects o",
      "JOIN sys.schemas s on o.schema_id = s.schema_id",
      "LEFT OUTER JOIN sys.objects p on o.parent_object_id = p.object_id",
      "WHERE o.type IN ('F', 'PK', 'U') AND s.name = ",
      quotedSchema,
      "ORDER BY o.type ASC;",
      "SELECT TOP 1 @id = id, @ms_sql = ms_sql FROM @cascade ORDER BY id;",
      "WHILE @id IS NOT NULL",
      "BEGIN",
      "BEGIN TRY EXEC sp_executesql @ms_sql; END TRY",
      "BEGIN CATCH BREAK; THROW; END CATCH;",
      "DELETE FROM @cascade WHERE id = @id;",
      "SELECT @id = NULL, @ms_sql = NULL;",
      "SELECT TOP 1 @id = id, @ms_sql = ms_sql FROM @cascade ORDER BY id;",
      "END",
      "EXEC sp_executesql N'DROP SCHEMA",
      this.quoteIdentifier(schema),
      ";'",
      "END;"
    ].join(" ");
  }
  showSchemasQuery() {
    return [
      'SELECT "name" as "schema_name" FROM sys.schemas as s',
      'WHERE "s"."name" NOT IN (',
      "'INFORMATION_SCHEMA', 'dbo', 'guest', 'sys', 'archive'",
      ")",
      "AND",
      '"s"."name" NOT LIKE',
      "'db_%'"
    ].join(" ");
  }
  versionQuery() {
    return [
      "DECLARE @ms_ver NVARCHAR(20);",
      "SET @ms_ver = REVERSE(CONVERT(NVARCHAR(20), SERVERPROPERTY('ProductVersion')));",
      "SELECT REVERSE(SUBSTRING(@ms_ver, CHARINDEX('.', @ms_ver)+1, 20)) AS 'version'"
    ].join(" ");
  }
  createTableQuery(tableName, attributes, options) {
    const primaryKeys = [], foreignKeys = {}, attributesClauseParts = [];
    let commentStr = "";
    for (const attr in attributes) {
      if (Object.prototype.hasOwnProperty.call(attributes, attr)) {
        let dataType = attributes[attr];
        let match;
        if (dataType.includes("COMMENT ")) {
          const commentMatch = dataType.match(/^(.+) (COMMENT.*)$/);
          const commentText = commentMatch[2].replace("COMMENT", "").trim();
          commentStr += this.commentTemplate(commentText, tableName, attr);
          dataType = commentMatch[1];
        }
        if (dataType.includes("PRIMARY KEY")) {
          primaryKeys.push(attr);
          if (dataType.includes("REFERENCES")) {
            match = dataType.match(/^(.+) (REFERENCES.*)$/);
            attributesClauseParts.push(`${this.quoteIdentifier(attr)} ${match[1].replace("PRIMARY KEY", "")}`);
            foreignKeys[attr] = match[2];
          } else {
            attributesClauseParts.push(`${this.quoteIdentifier(attr)} ${dataType.replace("PRIMARY KEY", "")}`);
          }
        } else if (dataType.includes("REFERENCES")) {
          match = dataType.match(/^(.+) (REFERENCES.*)$/);
          attributesClauseParts.push(`${this.quoteIdentifier(attr)} ${match[1]}`);
          foreignKeys[attr] = match[2];
        } else {
          attributesClauseParts.push(`${this.quoteIdentifier(attr)} ${dataType}`);
        }
      }
    }
    const pkString = primaryKeys.map((pk) => this.quoteIdentifier(pk)).join(", ");
    if (options.uniqueKeys) {
      _.each(options.uniqueKeys, (columns, indexName) => {
        if (columns.customIndex) {
          if (typeof indexName !== "string") {
            indexName = `uniq_${tableName}_${columns.fields.join("_")}`;
          }
          attributesClauseParts.push(`CONSTRAINT ${this.quoteIdentifier(indexName)} UNIQUE (${columns.fields.map((field) => this.quoteIdentifier(field)).join(", ")})`);
        }
      });
    }
    if (pkString.length > 0) {
      attributesClauseParts.push(`PRIMARY KEY (${pkString})`);
    }
    for (const fkey in foreignKeys) {
      if (Object.prototype.hasOwnProperty.call(foreignKeys, fkey)) {
        attributesClauseParts.push(`FOREIGN KEY (${this.quoteIdentifier(fkey)}) ${foreignKeys[fkey]}`);
      }
    }
    const quotedTableName = this.quoteTable(tableName);
    return Utils.joinSQLFragments([
      `IF OBJECT_ID('${quotedTableName}', 'U') IS NULL`,
      `CREATE TABLE ${quotedTableName} (${attributesClauseParts.join(", ")})`,
      ";",
      commentStr
    ]);
  }
  describeTableQuery(tableName, schema) {
    let sql = [
      "SELECT",
      "c.COLUMN_NAME AS 'Name',",
      "c.DATA_TYPE AS 'Type',",
      "c.CHARACTER_MAXIMUM_LENGTH AS 'Length',",
      "c.IS_NULLABLE as 'IsNull',",
      "COLUMN_DEFAULT AS 'Default',",
      "pk.CONSTRAINT_TYPE AS 'Constraint',",
      "COLUMNPROPERTY(OBJECT_ID(c.TABLE_SCHEMA+'.'+c.TABLE_NAME), c.COLUMN_NAME, 'IsIdentity') as 'IsIdentity',",
      "CAST(prop.value AS NVARCHAR) AS 'Comment'",
      "FROM",
      "INFORMATION_SCHEMA.TABLES t",
      "INNER JOIN",
      "INFORMATION_SCHEMA.COLUMNS c ON t.TABLE_NAME = c.TABLE_NAME AND t.TABLE_SCHEMA = c.TABLE_SCHEMA",
      "LEFT JOIN (SELECT tc.table_schema, tc.table_name, ",
      "cu.column_name, tc.CONSTRAINT_TYPE ",
      "FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc ",
      "JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE  cu ",
      "ON tc.table_schema=cu.table_schema and tc.table_name=cu.table_name ",
      "and tc.constraint_name=cu.constraint_name ",
      "and tc.CONSTRAINT_TYPE='PRIMARY KEY') pk ",
      "ON pk.table_schema=c.table_schema ",
      "AND pk.table_name=c.table_name ",
      "AND pk.column_name=c.column_name ",
      "INNER JOIN sys.columns AS sc",
      "ON sc.object_id = object_id(t.table_schema + '.' + t.table_name) AND sc.name = c.column_name",
      "LEFT JOIN sys.extended_properties prop ON prop.major_id = sc.object_id",
      "AND prop.minor_id = sc.column_id",
      "AND prop.name = 'MS_Description'",
      "WHERE t.TABLE_NAME =",
      wrapSingleQuote(tableName)
    ].join(" ");
    if (schema) {
      sql += `AND t.TABLE_SCHEMA =${wrapSingleQuote(schema)}`;
    }
    return sql;
  }
  renameTableQuery(before, after) {
    return `EXEC sp_rename ${this.quoteTable(before)}, ${this.quoteTable(after)};`;
  }
  showTablesQuery() {
    return "SELECT TABLE_NAME, TABLE_SCHEMA FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE';";
  }
  tableExistsQuery(table) {
    const tableName = table.tableName || table;
    const schemaName = table.schema || "dbo";
    return `SELECT TABLE_NAME, TABLE_SCHEMA FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = ${this.escape(tableName)} AND TABLE_SCHEMA = ${this.escape(schemaName)}`;
  }
  dropTableQuery(tableName) {
    const quoteTbl = this.quoteTable(tableName);
    return Utils.joinSQLFragments([
      `IF OBJECT_ID('${quoteTbl}', 'U') IS NOT NULL`,
      "DROP TABLE",
      quoteTbl,
      ";"
    ]);
  }
  addColumnQuery(table, key, dataType) {
    dataType.field = key;
    let commentStr = "";
    if (dataType.comment && _.isString(dataType.comment)) {
      commentStr = this.commentTemplate(dataType.comment, table, key);
      delete dataType["comment"];
    }
    return Utils.joinSQLFragments([
      "ALTER TABLE",
      this.quoteTable(table),
      "ADD",
      this.quoteIdentifier(key),
      this.attributeToSQL(dataType, { context: "addColumn" }),
      ";",
      commentStr
    ]);
  }
  commentTemplate(comment, table, column) {
    return ` EXEC sp_addextendedproperty @name = N'MS_Description', @value = ${this.escape(comment)}, @level0type = N'Schema', @level0name = 'dbo', @level1type = N'Table', @level1name = ${this.quoteIdentifier(table)}, @level2type = N'Column', @level2name = ${this.quoteIdentifier(column)};`;
  }
  removeColumnQuery(tableName, attributeName) {
    return Utils.joinSQLFragments([
      "ALTER TABLE",
      this.quoteTable(tableName),
      "DROP COLUMN",
      this.quoteIdentifier(attributeName),
      ";"
    ]);
  }
  changeColumnQuery(tableName, attributes) {
    const attrString = [], constraintString = [];
    let commentString = "";
    for (const attributeName in attributes) {
      const quotedAttrName = this.quoteIdentifier(attributeName);
      let definition = attributes[attributeName];
      if (definition.includes("COMMENT ")) {
        const commentMatch = definition.match(/^(.+) (COMMENT.*)$/);
        const commentText = commentMatch[2].replace("COMMENT", "").trim();
        commentString += this.commentTemplate(commentText, tableName, attributeName);
        definition = commentMatch[1];
      }
      if (definition.includes("REFERENCES")) {
        constraintString.push(`FOREIGN KEY (${quotedAttrName}) ${definition.replace(/.+?(?=REFERENCES)/, "")}`);
      } else {
        attrString.push(`${quotedAttrName} ${definition}`);
      }
    }
    return Utils.joinSQLFragments([
      "ALTER TABLE",
      this.quoteTable(tableName),
      attrString.length && `ALTER COLUMN ${attrString.join(", ")}`,
      constraintString.length && `ADD ${constraintString.join(", ")}`,
      ";",
      commentString
    ]);
  }
  renameColumnQuery(tableName, attrBefore, attributes) {
    const newName = Object.keys(attributes)[0];
    return Utils.joinSQLFragments([
      "EXEC sp_rename",
      `'${this.quoteTable(tableName)}.${attrBefore}',`,
      `'${newName}',`,
      "'COLUMN'",
      ";"
    ]);
  }
  bulkInsertQuery(tableName, attrValueHashes, options, attributes) {
    const quotedTable = this.quoteTable(tableName);
    options = options || {};
    attributes = attributes || {};
    const tuples = [];
    const allAttributes = [];
    const allQueries = [];
    let needIdentityInsertWrapper = false, outputFragment = "";
    if (options.returning) {
      const returnValues = this.generateReturnValues(attributes, options);
      outputFragment = returnValues.outputFragment;
    }
    const emptyQuery = `INSERT INTO ${quotedTable}${outputFragment} DEFAULT VALUES`;
    attrValueHashes.forEach((attrValueHash) => {
      const fields = Object.keys(attrValueHash);
      const firstAttr = attributes[fields[0]];
      if (fields.length === 1 && firstAttr && firstAttr.autoIncrement && attrValueHash[fields[0]] === null) {
        allQueries.push(emptyQuery);
        return;
      }
      _.forOwn(attrValueHash, (value, key) => {
        if (value !== null && attributes[key] && attributes[key].autoIncrement) {
          needIdentityInsertWrapper = true;
        }
        if (!allAttributes.includes(key)) {
          if (value === null && attributes[key] && attributes[key].autoIncrement)
            return;
          allAttributes.push(key);
        }
      });
    });
    if (allAttributes.length > 0) {
      attrValueHashes.forEach((attrValueHash) => {
        tuples.push(`(${allAttributes.map((key) => this.escape(attrValueHash[key])).join(",")})`);
      });
      const quotedAttributes = allAttributes.map((attr) => this.quoteIdentifier(attr)).join(",");
      allQueries.push((tupleStr) => `INSERT INTO ${quotedTable} (${quotedAttributes})${outputFragment} VALUES ${tupleStr};`);
    }
    const commands = [];
    let offset = 0;
    const batch = Math.floor(250 / (allAttributes.length + 1)) + 1;
    while (offset < Math.max(tuples.length, 1)) {
      const tupleStr = tuples.slice(offset, Math.min(tuples.length, offset + batch));
      let generatedQuery = allQueries.map((v) => typeof v === "string" ? v : v(tupleStr)).join(";");
      if (needIdentityInsertWrapper) {
        generatedQuery = `SET IDENTITY_INSERT ${quotedTable} ON; ${generatedQuery}; SET IDENTITY_INSERT ${quotedTable} OFF;`;
      }
      commands.push(generatedQuery);
      offset += batch;
    }
    return commands.join(";");
  }
  updateQuery(tableName, attrValueHash, where, options, attributes) {
    const sql = super.updateQuery(tableName, attrValueHash, where, options, attributes);
    if (options.limit) {
      const updateArgs = `UPDATE TOP(${this.escape(options.limit)})`;
      sql.query = sql.query.replace("UPDATE", updateArgs);
    }
    return sql;
  }
  upsertQuery(tableName, insertValues, updateValues, where, model) {
    const targetTableAlias = this.quoteTable(`${tableName}_target`);
    const sourceTableAlias = this.quoteTable(`${tableName}_source`);
    const primaryKeysAttrs = [];
    const identityAttrs = [];
    const uniqueAttrs = [];
    const tableNameQuoted = this.quoteTable(tableName);
    let needIdentityInsertWrapper = false;
    for (const key in model.rawAttributes) {
      if (model.rawAttributes[key].primaryKey) {
        primaryKeysAttrs.push(model.rawAttributes[key].field || key);
      }
      if (model.rawAttributes[key].unique) {
        uniqueAttrs.push(model.rawAttributes[key].field || key);
      }
      if (model.rawAttributes[key].autoIncrement) {
        identityAttrs.push(model.rawAttributes[key].field || key);
      }
    }
    for (const index of model._indexes) {
      if (index.unique && index.fields) {
        for (const field of index.fields) {
          const fieldName = typeof field === "string" ? field : field.name || field.attribute;
          if (!uniqueAttrs.includes(fieldName) && model.rawAttributes[fieldName]) {
            uniqueAttrs.push(fieldName);
          }
        }
      }
    }
    const updateKeys = Object.keys(updateValues);
    const insertKeys = Object.keys(insertValues);
    const insertKeysQuoted = insertKeys.map((key) => this.quoteIdentifier(key)).join(", ");
    const insertValuesEscaped = insertKeys.map((key) => this.escape(insertValues[key])).join(", ");
    const sourceTableQuery = `VALUES(${insertValuesEscaped})`;
    let joinCondition;
    identityAttrs.forEach((key) => {
      if (insertValues[key] && insertValues[key] !== null) {
        needIdentityInsertWrapper = true;
      }
    });
    const clauses = where[Op.or].filter((clause) => {
      let valid = true;
      for (const key in clause) {
        if (typeof clause[key] === "undefined" || clause[key] == null) {
          valid = false;
          break;
        }
      }
      return valid;
    });
    const getJoinSnippet = (array) => {
      return array.map((key) => {
        key = this.quoteIdentifier(key);
        return `${targetTableAlias}.${key} = ${sourceTableAlias}.${key}`;
      });
    };
    if (clauses.length === 0) {
      throw new Error("Primary Key or Unique key should be passed to upsert query");
    } else {
      for (const key in clauses) {
        const keys = Object.keys(clauses[key]);
        if (primaryKeysAttrs.includes(keys[0])) {
          joinCondition = getJoinSnippet(primaryKeysAttrs).join(" AND ");
          break;
        }
      }
      if (!joinCondition) {
        joinCondition = getJoinSnippet(uniqueAttrs).join(" AND ");
      }
    }
    const filteredUpdateClauses = updateKeys.filter((key) => !identityAttrs.includes(key)).map((key) => {
      const value = this.escape(updateValues[key]);
      key = this.quoteIdentifier(key);
      return `${targetTableAlias}.${key} = ${value}`;
    });
    const updateSnippet = filteredUpdateClauses.length > 0 ? `WHEN MATCHED THEN UPDATE SET ${filteredUpdateClauses.join(", ")}` : "";
    const insertSnippet = `(${insertKeysQuoted}) VALUES(${insertValuesEscaped})`;
    let query = `MERGE INTO ${tableNameQuoted} WITH(HOLDLOCK) AS ${targetTableAlias} USING (${sourceTableQuery}) AS ${sourceTableAlias}(${insertKeysQuoted}) ON ${joinCondition}`;
    query += ` ${updateSnippet} WHEN NOT MATCHED THEN INSERT ${insertSnippet} OUTPUT $action, INSERTED.*;`;
    if (needIdentityInsertWrapper) {
      query = `SET IDENTITY_INSERT ${tableNameQuoted} ON; ${query} SET IDENTITY_INSERT ${tableNameQuoted} OFF;`;
    }
    return query;
  }
  truncateTableQuery(tableName) {
    return `TRUNCATE TABLE ${this.quoteTable(tableName)}`;
  }
  deleteQuery(tableName, where, options = {}, model) {
    const table = this.quoteTable(tableName);
    const whereClause = this.getWhereConditions(where, null, model, options);
    return Utils.joinSQLFragments([
      "DELETE",
      options.limit && `TOP(${this.escape(options.limit)})`,
      "FROM",
      table,
      whereClause && `WHERE ${whereClause}`,
      ";",
      "SELECT @@ROWCOUNT AS AFFECTEDROWS",
      ";"
    ]);
  }
  showIndexesQuery(tableName) {
    return `EXEC sys.sp_helpindex @objname = N'${this.quoteTable(tableName)}';`;
  }
  showConstraintsQuery(tableName) {
    return `EXEC sp_helpconstraint @objname = ${this.escape(this.quoteTable(tableName))};`;
  }
  removeIndexQuery(tableName, indexNameOrAttributes) {
    let indexName = indexNameOrAttributes;
    if (typeof indexName !== "string") {
      indexName = Utils.underscore(`${tableName}_${indexNameOrAttributes.join("_")}`);
    }
    return `DROP INDEX ${this.quoteIdentifiers(indexName)} ON ${this.quoteIdentifiers(tableName)}`;
  }
  attributeToSQL(attribute, options) {
    if (!_.isPlainObject(attribute)) {
      attribute = {
        type: attribute
      };
    }
    if (attribute.references) {
      if (attribute.Model && attribute.Model.tableName === attribute.references.model) {
        this.sequelize.log("MSSQL does not support self referencial constraints, we will remove it but we recommend restructuring your query");
        attribute.onDelete = "";
        attribute.onUpdate = "";
      }
    }
    let template;
    if (attribute.type instanceof DataTypes.ENUM) {
      if (attribute.type.values && !attribute.values)
        attribute.values = attribute.type.values;
      template = attribute.type.toSql();
      template += ` CHECK (${this.quoteIdentifier(attribute.field)} IN(${attribute.values.map((value) => {
        return this.escape(value);
      }).join(", ")}))`;
      return template;
    }
    template = attribute.type.toString();
    if (attribute.allowNull === false) {
      template += " NOT NULL";
    } else if (!attribute.primaryKey && !Utils.defaultValueSchemable(attribute.defaultValue)) {
      template += " NULL";
    }
    if (attribute.autoIncrement) {
      template += " IDENTITY(1,1)";
    }
    if (attribute.type !== "TEXT" && attribute.type._binary !== true && Utils.defaultValueSchemable(attribute.defaultValue)) {
      template += ` DEFAULT ${this.escape(attribute.defaultValue)}`;
    }
    if (attribute.unique === true) {
      template += " UNIQUE";
    }
    if (attribute.primaryKey) {
      template += " PRIMARY KEY";
    }
    if ((!options || !options.withoutForeignKeyConstraints) && attribute.references) {
      template += ` REFERENCES ${this.quoteTable(attribute.references.model)}`;
      if (attribute.references.key) {
        template += ` (${this.quoteIdentifier(attribute.references.key)})`;
      } else {
        template += ` (${this.quoteIdentifier("id")})`;
      }
      if (attribute.onDelete) {
        template += ` ON DELETE ${attribute.onDelete.toUpperCase()}`;
      }
      if (attribute.onUpdate) {
        template += ` ON UPDATE ${attribute.onUpdate.toUpperCase()}`;
      }
    }
    if (attribute.comment && typeof attribute.comment === "string") {
      template += ` COMMENT ${attribute.comment}`;
    }
    return template;
  }
  attributesToSQL(attributes, options) {
    const result = {}, existingConstraints = [];
    let key, attribute;
    for (key in attributes) {
      attribute = attributes[key];
      if (attribute.references) {
        if (existingConstraints.includes(attribute.references.model.toString())) {
          attribute.onDelete = "";
          attribute.onUpdate = "";
        } else {
          existingConstraints.push(attribute.references.model.toString());
          attribute.onUpdate = "";
        }
      }
      if (key && !attribute.field)
        attribute.field = key;
      result[attribute.field || key] = this.attributeToSQL(attribute, options);
    }
    return result;
  }
  createTrigger() {
    throwMethodUndefined("createTrigger");
  }
  dropTrigger() {
    throwMethodUndefined("dropTrigger");
  }
  renameTrigger() {
    throwMethodUndefined("renameTrigger");
  }
  createFunction() {
    throwMethodUndefined("createFunction");
  }
  dropFunction() {
    throwMethodUndefined("dropFunction");
  }
  renameFunction() {
    throwMethodUndefined("renameFunction");
  }
  _getForeignKeysQueryPrefix(catalogName) {
    return `${"SELECT constraint_name = OBJ.NAME, constraintName = OBJ.NAME, "}${catalogName ? `constraintCatalog = '${catalogName}', ` : ""}constraintSchema = SCHEMA_NAME(OBJ.SCHEMA_ID), tableName = TB.NAME, tableSchema = SCHEMA_NAME(TB.SCHEMA_ID), ${catalogName ? `tableCatalog = '${catalogName}', ` : ""}columnName = COL.NAME, referencedTableSchema = SCHEMA_NAME(RTB.SCHEMA_ID), ${catalogName ? `referencedCatalog = '${catalogName}', ` : ""}referencedTableName = RTB.NAME, referencedColumnName = RCOL.NAME FROM sys.foreign_key_columns FKC INNER JOIN sys.objects OBJ ON OBJ.OBJECT_ID = FKC.CONSTRAINT_OBJECT_ID INNER JOIN sys.tables TB ON TB.OBJECT_ID = FKC.PARENT_OBJECT_ID INNER JOIN sys.columns COL ON COL.COLUMN_ID = PARENT_COLUMN_ID AND COL.OBJECT_ID = TB.OBJECT_ID INNER JOIN sys.tables RTB ON RTB.OBJECT_ID = FKC.REFERENCED_OBJECT_ID INNER JOIN sys.columns RCOL ON RCOL.COLUMN_ID = REFERENCED_COLUMN_ID AND RCOL.OBJECT_ID = RTB.OBJECT_ID`;
  }
  getForeignKeysQuery(table, catalogName) {
    const tableName = table.tableName || table;
    let sql = `${this._getForeignKeysQueryPrefix(catalogName)} WHERE TB.NAME =${wrapSingleQuote(tableName)}`;
    if (table.schema) {
      sql += ` AND SCHEMA_NAME(TB.SCHEMA_ID) =${wrapSingleQuote(table.schema)}`;
    }
    return sql;
  }
  getForeignKeyQuery(table, attributeName) {
    const tableName = table.tableName || table;
    return Utils.joinSQLFragments([
      this._getForeignKeysQueryPrefix(),
      "WHERE",
      `TB.NAME =${wrapSingleQuote(tableName)}`,
      "AND",
      `COL.NAME =${wrapSingleQuote(attributeName)}`,
      table.schema && `AND SCHEMA_NAME(TB.SCHEMA_ID) =${wrapSingleQuote(table.schema)}`
    ]);
  }
  getPrimaryKeyConstraintQuery(table, attributeName) {
    const tableName = wrapSingleQuote(table.tableName || table);
    return Utils.joinSQLFragments([
      "SELECT K.TABLE_NAME AS tableName,",
      "K.COLUMN_NAME AS columnName,",
      "K.CONSTRAINT_NAME AS constraintName",
      "FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS C",
      "JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS K",
      "ON C.TABLE_NAME = K.TABLE_NAME",
      "AND C.CONSTRAINT_CATALOG = K.CONSTRAINT_CATALOG",
      "AND C.CONSTRAINT_SCHEMA = K.CONSTRAINT_SCHEMA",
      "AND C.CONSTRAINT_NAME = K.CONSTRAINT_NAME",
      "WHERE C.CONSTRAINT_TYPE = 'PRIMARY KEY'",
      `AND K.COLUMN_NAME = ${wrapSingleQuote(attributeName)}`,
      `AND K.TABLE_NAME = ${tableName}`,
      ";"
    ]);
  }
  dropForeignKeyQuery(tableName, foreignKey) {
    return Utils.joinSQLFragments([
      "ALTER TABLE",
      this.quoteTable(tableName),
      "DROP",
      this.quoteIdentifier(foreignKey)
    ]);
  }
  getDefaultConstraintQuery(tableName, attributeName) {
    const quotedTable = this.quoteTable(tableName);
    return Utils.joinSQLFragments([
      "SELECT name FROM sys.default_constraints",
      `WHERE PARENT_OBJECT_ID = OBJECT_ID('${quotedTable}', 'U')`,
      `AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns WHERE NAME = ('${attributeName}')`,
      `AND object_id = OBJECT_ID('${quotedTable}', 'U'))`,
      ";"
    ]);
  }
  dropConstraintQuery(tableName, constraintName) {
    return Utils.joinSQLFragments([
      "ALTER TABLE",
      this.quoteTable(tableName),
      "DROP CONSTRAINT",
      this.quoteIdentifier(constraintName),
      ";"
    ]);
  }
  setIsolationLevelQuery() {
  }
  generateTransactionId() {
    return randomBytes(10).toString("hex");
  }
  startTransactionQuery(transaction) {
    if (transaction.parent) {
      return `SAVE TRANSACTION ${this.quoteIdentifier(transaction.name)};`;
    }
    return "BEGIN TRANSACTION;";
  }
  commitTransactionQuery(transaction) {
    if (transaction.parent) {
      return;
    }
    return "COMMIT TRANSACTION;";
  }
  rollbackTransactionQuery(transaction) {
    if (transaction.parent) {
      return `ROLLBACK TRANSACTION ${this.quoteIdentifier(transaction.name)};`;
    }
    return "ROLLBACK TRANSACTION;";
  }
  selectFromTableFragment(options, model, attributes, tables, mainTableAs, where) {
    this._throwOnEmptyAttributes(attributes, { modelName: model && model.name, as: mainTableAs });
    const dbVersion = this.sequelize.options.databaseVersion;
    const isSQLServer2008 = semver.valid(dbVersion) && semver.lt(dbVersion, "11.0.0");
    if (isSQLServer2008 && options.offset) {
      const offset = options.offset || 0;
      const isSubQuery = options.hasIncludeWhere || options.hasIncludeRequired || options.hasMultiAssociation;
      let orders = { mainQueryOrder: [] };
      if (options.order) {
        orders = this.getQueryOrders(options, model, isSubQuery);
      }
      if (orders.mainQueryOrder.length === 0) {
        orders.mainQueryOrder.push(this.quoteIdentifier(model.primaryKeyField));
      }
      const tmpTable = mainTableAs || "OffsetTable";
      if (options.include) {
        const subQuery = options.subQuery === void 0 ? options.limit && options.hasMultiAssociation : options.subQuery;
        const mainTable = {
          name: mainTableAs,
          quotedName: null,
          as: null,
          model
        };
        const topLevelInfo = {
          names: mainTable,
          options,
          subQuery
        };
        let mainJoinQueries = [];
        for (const include of options.include) {
          if (include.separate) {
            continue;
          }
          const joinQueries = this.generateInclude(include, { externalAs: mainTableAs, internalAs: mainTableAs }, topLevelInfo);
          mainJoinQueries = mainJoinQueries.concat(joinQueries.mainQuery);
        }
        return Utils.joinSQLFragments([
          "SELECT TOP 100 PERCENT",
          attributes.join(", "),
          "FROM (",
          [
            "SELECT",
            options.limit && `TOP ${options.limit}`,
            "* FROM (",
            [
              "SELECT ROW_NUMBER() OVER (",
              [
                "ORDER BY",
                orders.mainQueryOrder.join(", ")
              ],
              `) as row_num, ${tmpTable}.* FROM (`,
              [
                "SELECT DISTINCT",
                `${tmpTable}.* FROM ${tables} AS ${tmpTable}`,
                mainJoinQueries,
                where && `WHERE ${where}`
              ],
              `) AS ${tmpTable}`
            ],
            `) AS ${tmpTable} WHERE row_num > ${offset}`
          ],
          `) AS ${tmpTable}`
        ]);
      }
      return Utils.joinSQLFragments([
        "SELECT TOP 100 PERCENT",
        attributes.join(", "),
        "FROM (",
        [
          "SELECT",
          options.limit && `TOP ${options.limit}`,
          "* FROM (",
          [
            "SELECT ROW_NUMBER() OVER (",
            [
              "ORDER BY",
              orders.mainQueryOrder.join(", ")
            ],
            `) as row_num, * FROM ${tables} AS ${tmpTable}`,
            where && `WHERE ${where}`
          ],
          `) AS ${tmpTable} WHERE row_num > ${offset}`
        ],
        `) AS ${tmpTable}`
      ]);
    }
    return Utils.joinSQLFragments([
      "SELECT",
      isSQLServer2008 && options.limit && `TOP ${options.limit}`,
      attributes.join(", "),
      `FROM ${tables}`,
      mainTableAs && `AS ${mainTableAs}`,
      options.tableHint && TableHints[options.tableHint] && `WITH (${TableHints[options.tableHint]})`
    ]);
  }
  addLimitAndOffset(options, model) {
    if (semver.valid(this.sequelize.options.databaseVersion) && semver.lt(this.sequelize.options.databaseVersion, "11.0.0")) {
      return "";
    }
    const offset = options.offset || 0;
    const isSubQuery = options.subQuery === void 0 ? options.hasIncludeWhere || options.hasIncludeRequired || options.hasMultiAssociation : options.subQuery;
    let fragment = "";
    let orders = {};
    if (options.order) {
      orders = this.getQueryOrders(options, model, isSubQuery);
    }
    if (options.limit || options.offset) {
      if (!options.order || options.order.length === 0 || options.include && orders.subQueryOrder.length === 0) {
        const tablePkFragment = `${this.quoteTable(options.tableAs || model.name)}.${this.quoteIdentifier(model.primaryKeyField)}`;
        if (!options.order || !options.order.length) {
          fragment += ` ORDER BY ${tablePkFragment}`;
        } else {
          const orderFieldNames = _.map(options.order, (order) => order[0]);
          const primaryKeyFieldAlreadyPresent = _.includes(orderFieldNames, model.primaryKeyField);
          if (!primaryKeyFieldAlreadyPresent) {
            fragment += options.order && !isSubQuery ? ", " : " ORDER BY ";
            fragment += tablePkFragment;
          }
        }
      }
      if (options.offset || options.limit) {
        fragment += ` OFFSET ${this.escape(offset)} ROWS`;
      }
      if (options.limit) {
        fragment += ` FETCH NEXT ${this.escape(options.limit)} ROWS ONLY`;
      }
    }
    return fragment;
  }
  booleanValue(value) {
    return value ? 1 : 0;
  }
  quoteIdentifier(identifier, force) {
    return `[${identifier.replace(/[[\]']+/g, "")}]`;
  }
}
function wrapSingleQuote(identifier) {
  return Utils.addTicks(Utils.removeTicks(identifier, "'"), "'");
}
module.exports = MSSQLQueryGenerator;
//# sourceMappingURL=query-generator.js.map
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
const _ = require("lodash");
const Utils = require("../../utils");
const QueryTypes = require("../../query-types");
const Op = require("../../operators");
const { QueryInterface } = require("../abstract/query-interface");
class MSSqlQueryInterface extends QueryInterface {
  async removeColumn(tableName, attributeName, options) {
    options = __spreadValues({ raw: true }, options || {});
    const findConstraintSql = this.queryGenerator.getDefaultConstraintQuery(tableName, attributeName);
    const [results0] = await this.sequelize.query(findConstraintSql, options);
    if (results0.length) {
      const dropConstraintSql = this.queryGenerator.dropConstraintQuery(tableName, results0[0].name);
      await this.sequelize.query(dropConstraintSql, options);
    }
    const findForeignKeySql = this.queryGenerator.getForeignKeyQuery(tableName, attributeName);
    const [results] = await this.sequelize.query(findForeignKeySql, options);
    if (results.length) {
      const dropForeignKeySql = this.queryGenerator.dropForeignKeyQuery(tableName, results[0].constraint_name);
      await this.sequelize.query(dropForeignKeySql, options);
    }
    const primaryKeyConstraintSql = this.queryGenerator.getPrimaryKeyConstraintQuery(tableName, attributeName);
    const [result] = await this.sequelize.query(primaryKeyConstraintSql, options);
    if (result.length) {
      const dropConstraintSql = this.queryGenerator.dropConstraintQuery(tableName, result[0].constraintName);
      await this.sequelize.query(dropConstraintSql, options);
    }
    const removeSql = this.queryGenerator.removeColumnQuery(tableName, attributeName);
    return this.sequelize.query(removeSql, options);
  }
  async upsert(tableName, insertValues, updateValues, where, options) {
    const model = options.model;
    const wheres = [];
    options = __spreadValues({}, options);
    if (!Utils.isWhereEmpty(where)) {
      wheres.push(where);
    }
    let indexes = Object.values(model.uniqueKeys).map((item) => item.fields);
    indexes = indexes.concat(Object.values(model._indexes).filter((item) => item.unique).map((item) => item.fields));
    const attributes = Object.keys(insertValues);
    for (const index of indexes) {
      if (_.intersection(attributes, index).length === index.length) {
        where = {};
        for (const field of index) {
          where[field] = insertValues[field];
        }
        wheres.push(where);
      }
    }
    where = { [Op.or]: wheres };
    options.type = QueryTypes.UPSERT;
    options.raw = true;
    const sql = this.queryGenerator.upsertQuery(tableName, insertValues, updateValues, where, model, options);
    return await this.sequelize.query(sql, options);
  }
}
exports.MSSqlQueryInterface = MSSqlQueryInterface;
//# sourceMappingURL=query-interface.js.map
"use strict";
const AbstractQuery = require("../abstract/query");
const sequelizeErrors = require("../../errors");
const parserStore = require("../parserStore")("mssql");
const _ = require("lodash");
const { logger } = require("../../utils/logger");
const debug = logger.debugContext("sql:mssql");
function getScale(aNum) {
  if (!Number.isFinite(aNum))
    return 0;
  let e = 1;
  while (Math.round(aNum * e) / e !== aNum)
    e *= 10;
  return Math.log10(e);
}
class Query extends AbstractQuery {
  getInsertIdField() {
    return "id";
  }
  getSQLTypeFromJsType(value, TYPES) {
    const paramType = { type: TYPES.VarChar, typeOptions: {} };
    paramType.type = TYPES.NVarChar;
    if (typeof value === "number") {
      if (Number.isInteger(value)) {
        if (value >= -2147483648 && value <= 2147483647) {
          paramType.type = TYPES.Int;
        } else {
          paramType.type = TYPES.BigInt;
        }
      } else {
        paramType.type = TYPES.Numeric;
        paramType.typeOptions = { precision: 30, scale: getScale(value) };
      }
    } else if (typeof value === "boolean") {
      paramType.type = TYPES.Bit;
    }
    if (Buffer.isBuffer(value)) {
      paramType.type = TYPES.VarBinary;
    }
    return paramType;
  }
  async _run(connection, sql, parameters, errStack) {
    this.sql = sql;
    const { options } = this;
    const complete = this._logQuery(sql, debug, parameters);
    const query = new Promise((resolve, reject) => {
      if (sql.startsWith("BEGIN TRANSACTION")) {
        return connection.beginTransaction((error) => error ? reject(error) : resolve([]), options.transaction.name, connection.lib.ISOLATION_LEVEL[options.isolationLevel]);
      }
      if (sql.startsWith("COMMIT TRANSACTION")) {
        return connection.commitTransaction((error) => error ? reject(error) : resolve([]));
      }
      if (sql.startsWith("ROLLBACK TRANSACTION")) {
        return connection.rollbackTransaction((error) => error ? reject(error) : resolve([]), options.transaction.name);
      }
      if (sql.startsWith("SAVE TRANSACTION")) {
        return connection.saveTransaction((error) => error ? reject(error) : resolve([]), options.transaction.name);
      }
      const rows2 = [];
      const request = new connection.lib.Request(sql, (err, rowCount2) => err ? reject(err) : resolve([rows2, rowCount2]));
      if (parameters) {
        _.forOwn(parameters, (value, key) => {
          const paramType = this.getSQLTypeFromJsType(value, connection.lib.TYPES);
          request.addParameter(key, paramType.type, value, paramType.typeOptions);
        });
      }
      request.on("row", (columns) => {
        rows2.push(columns);
      });
      connection.execSql(request);
    });
    let rows, rowCount;
    try {
      [rows, rowCount] = await query;
    } catch (err) {
      err.sql = sql;
      err.parameters = parameters;
      throw this.formatError(err, errStack);
    }
    complete();
    if (Array.isArray(rows)) {
      rows = rows.map((columns) => {
        const row = {};
        for (const column of columns) {
          const typeid = column.metadata.type.id;
          const parse = parserStore.get(typeid);
          let value = column.value;
          if (value !== null & !!parse) {
            value = parse(value);
          }
          row[column.metadata.colName] = value;
        }
        return row;
      });
    }
    return this.formatResults(rows, rowCount);
  }
  run(sql, parameters) {
    const errForStack = new Error();
    return this.connection.queue.enqueue(() => this._run(this.connection, sql, parameters, errForStack.stack));
  }
  static formatBindParameters(sql, values, dialect) {
    const bindParam = {};
    const replacementFunc = (match, key, values2) => {
      if (values2[key] !== void 0) {
        bindParam[key] = values2[key];
        return `@${key}`;
      }
      return void 0;
    };
    sql = AbstractQuery.formatBindParameters(sql, values, dialect, replacementFunc)[0];
    return [sql, bindParam];
  }
  formatResults(data, rowCount) {
    if (this.isInsertQuery(data)) {
      this.handleInsertQuery(data);
      return [this.instance || data, rowCount];
    }
    if (this.isShowTablesQuery()) {
      return this.handleShowTablesQuery(data);
    }
    if (this.isDescribeQuery()) {
      const result = {};
      for (const _result of data) {
        if (_result.Default) {
          _result.Default = _result.Default.replace("('", "").replace("')", "").replace(/'/g, "");
        }
        result[_result.Name] = {
          type: _result.Type.toUpperCase(),
          allowNull: _result.IsNull === "YES" ? true : false,
          defaultValue: _result.Default,
          primaryKey: _result.Constraint === "PRIMARY KEY",
          autoIncrement: _result.IsIdentity === 1,
          comment: _result.Comment
        };
        if (result[_result.Name].type.includes("CHAR") && _result.Length) {
          if (_result.Length === -1) {
            result[_result.Name].type += "(MAX)";
          } else {
            result[_result.Name].type += `(${_result.Length})`;
          }
        }
      }
      return result;
    }
    if (this.isSelectQuery()) {
      return this.handleSelectQuery(data);
    }
    if (this.isShowIndexesQuery()) {
      return this.handleShowIndexesQuery(data);
    }
    if (this.isCallQuery()) {
      return data[0];
    }
    if (this.isBulkUpdateQuery()) {
      if (this.options.returning) {
        return this.handleSelectQuery(data);
      }
      return rowCount;
    }
    if (this.isBulkDeleteQuery()) {
      return data[0] ? data[0].AFFECTEDROWS : 0;
    }
    if (this.isVersionQuery()) {
      return data[0].version;
    }
    if (this.isForeignKeysQuery()) {
      return data;
    }
    if (this.isUpsertQuery()) {
      if (data && data.length === 0) {
        return [this.instance || data, false];
      }
      this.handleInsertQuery(data);
      return [this.instance || data, data[0].$action === "INSERT"];
    }
    if (this.isUpdateQuery()) {
      return [this.instance || data, rowCount];
    }
    if (this.isShowConstraintsQuery()) {
      return this.handleShowConstraintsQuery(data);
    }
    if (this.isRawQuery()) {
      return [data, rowCount];
    }
    return data;
  }
  handleShowTablesQuery(results) {
    return results.map((resultSet) => {
      return {
        tableName: resultSet.TABLE_NAME,
        schema: resultSet.TABLE_SCHEMA
      };
    });
  }
  handleShowConstraintsQuery(data) {
    return data.slice(1).map((result) => {
      const constraint = {};
      for (const key in result) {
        constraint[_.camelCase(key)] = result[key];
      }
      return constraint;
    });
  }
  formatError(err, errStack) {
    let match;
    match = err.message.match(/Violation of (?:UNIQUE|PRIMARY) KEY constraint '([^']*)'. Cannot insert duplicate key in object '.*'.(:? The duplicate key value is \((.*)\).)?/);
    match = match || err.message.match(/Cannot insert duplicate key row in object .* with unique index '(.*)'/);
    if (match && match.length > 1) {
      let fields = {};
      const uniqueKey = this.model && this.model.uniqueKeys[match[1]];
      let message = "Validation error";
      if (uniqueKey && !!uniqueKey.msg) {
        message = uniqueKey.msg;
      }
      if (match[3]) {
        const values = match[3].split(",").map((part) => part.trim());
        if (uniqueKey) {
          fields = _.zipObject(uniqueKey.fields, values);
        } else {
          fields[match[1]] = match[3];
        }
      }
      const errors = [];
      _.forOwn(fields, (value, field) => {
        errors.push(new sequelizeErrors.ValidationErrorItem(this.getUniqueConstraintErrorMessage(field), "unique violation", field, value, this.instance, "not_unique"));
      });
      return new sequelizeErrors.UniqueConstraintError({ message, errors, parent: err, fields, stack: errStack });
    }
    match = err.message.match(/Failed on step '(.*)'.Could not create constraint. See previous errors./) || err.message.match(/The DELETE statement conflicted with the REFERENCE constraint "(.*)". The conflict occurred in database "(.*)", table "(.*)", column '(.*)'./) || err.message.match(/The (?:INSERT|MERGE|UPDATE) statement conflicted with the FOREIGN KEY constraint "(.*)". The conflict occurred in database "(.*)", table "(.*)", column '(.*)'./);
    if (match && match.length > 0) {
      return new sequelizeErrors.ForeignKeyConstraintError({
        fields: null,
        index: match[1],
        parent: err,
        stack: errStack
      });
    }
    match = err.message.match(/Could not drop constraint. See previous errors./);
    if (match && match.length > 0) {
      let constraint = err.sql.match(/(?:constraint|index) \[(.+?)\]/i);
      constraint = constraint ? constraint[1] : void 0;
      let table = err.sql.match(/table \[(.+?)\]/i);
      table = table ? table[1] : void 0;
      return new sequelizeErrors.UnknownConstraintError({
        message: match[1],
        constraint,
        table,
        parent: err,
        stack: errStack
      });
    }
    return new sequelizeErrors.DatabaseError(err, { stack: errStack });
  }
  isShowOrDescribeQuery() {
    let result = false;
    result = result || this.sql.toLowerCase().startsWith("select c.column_name as 'name', c.data_type as 'type', c.is_nullable as 'isnull'");
    result = result || this.sql.toLowerCase().startsWith("select tablename = t.name, name = ind.name,");
    result = result || this.sql.toLowerCase().startsWith("exec sys.sp_helpindex @objname");
    return result;
  }
  isShowIndexesQuery() {
    return this.sql.toLowerCase().startsWith("exec sys.sp_helpindex @objname");
  }
  handleShowIndexesQuery(data) {
    data = data.reduce((acc, item) => {
      if (!(item.index_name in acc)) {
        acc[item.index_name] = item;
        item.fields = [];
      }
      item.index_keys.split(",").forEach((column) => {
        let columnName = column.trim();
        if (columnName.includes("(-)")) {
          columnName = columnName.replace("(-)", "");
        }
        acc[item.index_name].fields.push({
          attribute: columnName,
          length: void 0,
          order: column.includes("(-)") ? "DESC" : "ASC",
          collate: void 0
        });
      });
      delete item.index_keys;
      return acc;
    }, {});
    return _.map(data, (item) => ({
      primary: item.index_name.toLowerCase().startsWith("pk"),
      fields: item.fields,
      name: item.index_name,
      tableName: void 0,
      unique: item.index_description.toLowerCase().includes("unique"),
      type: void 0
    }));
  }
  handleInsertQuery(results, metaData) {
    if (this.instance) {
      const autoIncrementAttribute = this.model.autoIncrementAttribute;
      let id = null;
      let autoIncrementAttributeAlias = null;
      if (Object.prototype.hasOwnProperty.call(this.model.rawAttributes, autoIncrementAttribute) && this.model.rawAttributes[autoIncrementAttribute].field !== void 0)
        autoIncrementAttributeAlias = this.model.rawAttributes[autoIncrementAttribute].field;
      id = id || results && results[0][this.getInsertIdField()];
      id = id || metaData && metaData[this.getInsertIdField()];
      id = id || results && results[0][autoIncrementAttribute];
      id = id || autoIncrementAttributeAlias && results && results[0][autoIncrementAttributeAlias];
      this.instance[autoIncrementAttribute] = id;
      if (this.instance.dataValues) {
        for (const key in results[0]) {
          if (Object.prototype.hasOwnProperty.call(results[0], key)) {
            const record = results[0][key];
            const attr = _.find(this.model.rawAttributes, (attribute) => attribute.fieldName === key || attribute.field === key);
            this.instance.dataValues[attr && attr.fieldName || key] = record;
          }
        }
      }
    }
  }
}
module.exports = Query;
module.exports.Query = Query;
module.exports.default = Query;
//# sourceMappingURL=query.js.map
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
const semver = require("semver");
const AbstractConnectionManager = require("../abstract/connection-manager");
const SequelizeErrors = require("../../errors");
const { logger } = require("../../utils/logger");
const DataTypes = require("../../data-types").mariadb;
const momentTz = require("moment-timezone");
const debug = logger.debugContext("connection:mariadb");
const parserStore = require("../parserStore")("mariadb");
class ConnectionManager extends AbstractConnectionManager {
  constructor(dialect, sequelize) {
    sequelize.config.port = sequelize.config.port || 3306;
    super(dialect, sequelize);
    this.lib = this._loadDialectModule("mariadb");
    this.refreshTypeParser(DataTypes);
  }
  static _typecast(field, next) {
    if (parserStore.get(field.type)) {
      return parserStore.get(field.type)(field, this.sequelize.options, next);
    }
    return next();
  }
  _refreshTypeParser(dataType) {
    parserStore.refresh(dataType);
  }
  _clearTypeParser() {
    parserStore.clear();
  }
  async connect(config) {
    let tzOffset = this.sequelize.options.timezone;
    tzOffset = /\//.test(tzOffset) ? momentTz.tz(tzOffset).format("Z") : tzOffset;
    const connectionConfig = __spreadValues({
      host: config.host,
      port: config.port,
      user: config.username,
      password: config.password,
      database: config.database,
      timezone: tzOffset,
      typeCast: ConnectionManager._typecast.bind(this),
      bigNumberStrings: false,
      supportBigNumbers: true,
      foundRows: false
    }, config.dialectOptions);
    if (!this.sequelize.config.keepDefaultTimezone) {
      if (connectionConfig.initSql) {
        if (!Array.isArray(connectionConfig.initSql)) {
          connectionConfig.initSql = [connectionConfig.initSql];
        }
        connectionConfig.initSql.push(`SET time_zone = '${tzOffset}'`);
      } else {
        connectionConfig.initSql = `SET time_zone = '${tzOffset}'`;
      }
    }
    try {
      const connection = await this.lib.createConnection(connectionConfig);
      this.sequelize.options.databaseVersion = semver.coerce(connection.serverVersion()).version;
      debug("connection acquired");
      connection.on("error", (error) => {
        switch (error.code) {
          case "ESOCKET":
          case "ECONNRESET":
          case "EPIPE":
          case "PROTOCOL_CONNECTION_LOST":
            this.pool.destroy(connection);
        }
      });
      return connection;
    } catch (err) {
      switch (err.code) {
        case "ECONNREFUSED":
          throw new SequelizeErrors.ConnectionRefusedError(err);
        case "ER_ACCESS_DENIED_ERROR":
        case "ER_ACCESS_DENIED_NO_PASSWORD_ERROR":
          throw new SequelizeErrors.AccessDeniedError(err);
        case "ENOTFOUND":
          throw new SequelizeErrors.HostNotFoundError(err);
        case "EHOSTUNREACH":
        case "ENETUNREACH":
        case "EADDRNOTAVAIL":
          throw new SequelizeErrors.HostNotReachableError(err);
        case "EINVAL":
          throw new SequelizeErrors.InvalidConnectionError(err);
        default:
          throw new SequelizeErrors.ConnectionError(err);
      }
    }
  }
  async disconnect(connection) {
    if (!connection.isValid()) {
      debug("connection tried to disconnect but was already at CLOSED state");
      return;
    }
    return await connection.end();
  }
  validate(connection) {
    return connection && connection.isValid();
  }
}
module.exports = ConnectionManager;
module.exports.ConnectionManager = ConnectionManager;
module.exports.default = ConnectionManager;
//# sourceMappingURL=connection-manager.js.map
"use strict";
const wkx = require("wkx");
const _ = require("lodash");
const momentTz = require("moment-timezone");
const moment = require("moment");
module.exports = (BaseTypes) => {
  BaseTypes.ABSTRACT.prototype.dialectTypes = "https://mariadb.com/kb/en/library/resultset/#field-types";
  BaseTypes.DATE.types.mariadb = ["DATETIME"];
  BaseTypes.STRING.types.mariadb = ["VAR_STRING"];
  BaseTypes.CHAR.types.mariadb = ["STRING"];
  BaseTypes.TEXT.types.mariadb = ["BLOB"];
  BaseTypes.TINYINT.types.mariadb = ["TINY"];
  BaseTypes.SMALLINT.types.mariadb = ["SHORT"];
  BaseTypes.MEDIUMINT.types.mariadb = ["INT24"];
  BaseTypes.INTEGER.types.mariadb = ["LONG"];
  BaseTypes.BIGINT.types.mariadb = ["LONGLONG"];
  BaseTypes.FLOAT.types.mariadb = ["FLOAT"];
  BaseTypes.TIME.types.mariadb = ["TIME"];
  BaseTypes.DATEONLY.types.mariadb = ["DATE"];
  BaseTypes.BOOLEAN.types.mariadb = ["TINY"];
  BaseTypes.BLOB.types.mariadb = ["TINYBLOB", "BLOB", "LONGBLOB"];
  BaseTypes.DECIMAL.types.mariadb = ["NEWDECIMAL"];
  BaseTypes.UUID.types.mariadb = false;
  BaseTypes.ENUM.types.mariadb = false;
  BaseTypes.REAL.types.mariadb = ["DOUBLE"];
  BaseTypes.DOUBLE.types.mariadb = ["DOUBLE"];
  BaseTypes.GEOMETRY.types.mariadb = ["GEOMETRY"];
  BaseTypes.JSON.types.mariadb = ["JSON"];
  class DECIMAL extends BaseTypes.DECIMAL {
    toSql() {
      let definition = super.toSql();
      if (this._unsigned) {
        definition += " UNSIGNED";
      }
      if (this._zerofill) {
        definition += " ZEROFILL";
      }
      return definition;
    }
  }
  class DATE extends BaseTypes.DATE {
    toSql() {
      return this._length ? `DATETIME(${this._length})` : "DATETIME";
    }
    _stringify(date, options) {
      if (!moment.isMoment(date)) {
        date = this._applyTimezone(date, options);
      }
      return date.format("YYYY-MM-DD HH:mm:ss.SSS");
    }
    static parse(value, options) {
      value = value.string();
      if (value === null) {
        return value;
      }
      if (momentTz.tz.zone(options.timezone)) {
        value = momentTz.tz(value, options.timezone).toDate();
      } else {
        value = new Date(`${value} ${options.timezone}`);
      }
      return value;
    }
  }
  class DATEONLY extends BaseTypes.DATEONLY {
    static parse(value) {
      return value.string();
    }
  }
  class UUID extends BaseTypes.UUID {
    toSql() {
      return "CHAR(36) BINARY";
    }
  }
  class GEOMETRY extends BaseTypes.GEOMETRY {
    constructor(type, srid) {
      super(type, srid);
      if (_.isEmpty(this.type)) {
        this.sqlType = this.key;
      } else {
        this.sqlType = this.type;
      }
    }
    static parse(value) {
      value = value.buffer();
      if (!value || value.length === 0) {
        return null;
      }
      value = value.slice(4);
      return wkx.Geometry.parse(value).toGeoJSON({ shortCrs: true });
    }
    toSql() {
      return this.sqlType;
    }
  }
  class ENUM extends BaseTypes.ENUM {
    toSql(options) {
      return `ENUM(${this.values.map((value) => options.escape(value)).join(", ")})`;
    }
  }
  class JSONTYPE extends BaseTypes.JSON {
    _stringify(value, options) {
      return options.operation === "where" && typeof value === "string" ? value : JSON.stringify(value);
    }
  }
  return {
    ENUM,
    DATE,
    DATEONLY,
    UUID,
    GEOMETRY,
    DECIMAL,
    JSON: JSONTYPE
  };
};
//# sourceMappingURL=data-types.js.map
"use strict";
const _ = require("lodash");
const AbstractDialect = require("../abstract");
const ConnectionManager = require("./connection-manager");
const Query = require("./query");
const QueryGenerator = require("./query-generator");
const { MySQLQueryInterface } = require("../mysql/query-interface");
const DataTypes = require("../../data-types").mariadb;
class MariadbDialect extends AbstractDialect {
  constructor(sequelize) {
    super();
    this.sequelize = sequelize;
    this.connectionManager = new ConnectionManager(this, sequelize);
    this.queryGenerator = new QueryGenerator({
      _dialect: this,
      sequelize
    });
    this.queryInterface = new MySQLQueryInterface(sequelize, this.queryGenerator);
  }
}
MariadbDialect.prototype.supports = _.merge(_.cloneDeep(AbstractDialect.prototype.supports), {
  "VALUES ()": true,
  "LIMIT ON UPDATE": true,
  lock: true,
  forShare: "LOCK IN SHARE MODE",
  settingIsolationLevelDuringTransaction: false,
  schemas: true,
  inserts: {
    ignoreDuplicates: " IGNORE",
    updateOnDuplicate: " ON DUPLICATE KEY UPDATE"
  },
  index: {
    collate: false,
    length: true,
    parser: true,
    type: true,
    using: 1
  },
  constraints: {
    dropConstraint: false,
    check: false
  },
  indexViaAlter: true,
  indexHints: true,
  NUMERIC: true,
  GEOMETRY: true,
  JSON: true,
  REGEXP: true
});
MariadbDialect.prototype.defaultVersion = "10.1.44";
MariadbDialect.prototype.Query = Query;
MariadbDialect.prototype.QueryGenerator = QueryGenerator;
MariadbDialect.prototype.DataTypes = DataTypes;
MariadbDialect.prototype.name = "mariadb";
MariadbDialect.prototype.TICK_CHAR = "`";
MariadbDialect.prototype.TICK_CHAR_LEFT = MariadbDialect.prototype.TICK_CHAR;
MariadbDialect.prototype.TICK_CHAR_RIGHT = MariadbDialect.prototype.TICK_CHAR;
module.exports = MariadbDialect;
//# sourceMappingURL=index.js.map
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
const MySQLQueryGenerator = require("../mysql/query-generator");
const Utils = require("./../../utils");
class MariaDBQueryGenerator extends MySQLQueryGenerator {
  createSchema(schema, options) {
    options = __spreadValues({
      charset: null,
      collate: null
    }, options);
    return Utils.joinSQLFragments([
      "CREATE SCHEMA IF NOT EXISTS",
      this.quoteIdentifier(schema),
      options.charset && `DEFAULT CHARACTER SET ${this.escape(options.charset)}`,
      options.collate && `DEFAULT COLLATE ${this.escape(options.collate)}`,
      ";"
    ]);
  }
  dropSchema(schema) {
    return `DROP SCHEMA IF EXISTS ${this.quoteIdentifier(schema)};`;
  }
  showSchemasQuery(options) {
    const schemasToSkip = [
      "'MYSQL'",
      "'INFORMATION_SCHEMA'",
      "'PERFORMANCE_SCHEMA'"
    ];
    if (options.skip && Array.isArray(options.skip) && options.skip.length > 0) {
      for (const schemaName of options.skip) {
        schemasToSkip.push(this.escape(schemaName));
      }
    }
    return Utils.joinSQLFragments([
      "SELECT SCHEMA_NAME as schema_name",
      "FROM INFORMATION_SCHEMA.SCHEMATA",
      `WHERE SCHEMA_NAME NOT IN (${schemasToSkip.join(", ")})`,
      ";"
    ]);
  }
  showTablesQuery(database) {
    let query = "SELECT TABLE_NAME, TABLE_SCHEMA FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'";
    if (database) {
      query += ` AND TABLE_SCHEMA = ${this.escape(database)}`;
    } else {
      query += " AND TABLE_SCHEMA NOT IN ('MYSQL', 'INFORMATION_SCHEMA', 'PERFORMANCE_SCHEMA')";
    }
    return `${query};`;
  }
  quoteIdentifier(identifier, force) {
    return Utils.addTicks(Utils.removeTicks(identifier, "`"), "`");
  }
}
module.exports = MariaDBQueryGenerator;
//# sourceMappingURL=query-generator.js.map
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
const AbstractQuery = require("../abstract/query");
const sequelizeErrors = require("../../errors");
const _ = require("lodash");
const DataTypes = require("../../data-types");
const { logger } = require("../../utils/logger");
const ER_DUP_ENTRY = 1062;
const ER_DEADLOCK = 1213;
const ER_ROW_IS_REFERENCED = 1451;
const ER_NO_REFERENCED_ROW = 1452;
const debug = logger.debugContext("sql:mariadb");
class Query extends AbstractQuery {
  constructor(connection, sequelize, options) {
    super(connection, sequelize, __spreadValues({ showWarnings: false }, options));
  }
  static formatBindParameters(sql, values, dialect) {
    const bindParam = [];
    const replacementFunc = (match, key, values_) => {
      if (values_[key] !== void 0) {
        bindParam.push(values_[key]);
        return "?";
      }
      return void 0;
    };
    sql = AbstractQuery.formatBindParameters(sql, values, dialect, replacementFunc)[0];
    return [sql, bindParam.length > 0 ? bindParam : void 0];
  }
  async run(sql, parameters) {
    this.sql = sql;
    const { connection, options } = this;
    const showWarnings = this.sequelize.options.showWarnings || options.showWarnings;
    const complete = this._logQuery(sql, debug, parameters);
    if (parameters) {
      debug("parameters(%j)", parameters);
    }
    let results;
    const errForStack = new Error();
    try {
      results = await connection.query(this.sql, parameters);
    } catch (error) {
      if (options.transaction && error.errno === ER_DEADLOCK) {
        try {
          await options.transaction.rollback();
        } catch (error_) {
        }
        options.transaction.finished = "rollback";
      }
      error.sql = sql;
      error.parameters = parameters;
      throw this.formatError(error, errForStack.stack);
    } finally {
      complete();
    }
    if (showWarnings && results && results.warningStatus > 0) {
      await this.logWarnings(results);
    }
    return this.formatResults(results);
  }
  formatResults(data) {
    let result = this.instance;
    if (this.isBulkUpdateQuery() || this.isBulkDeleteQuery()) {
      return data.affectedRows;
    }
    if (this.isUpsertQuery()) {
      return [result, data.affectedRows === 1];
    }
    if (this.isInsertQuery(data)) {
      this.handleInsertQuery(data);
      if (!this.instance) {
        if (this.model && this.model.autoIncrementAttribute && this.model.autoIncrementAttribute === this.model.primaryKeyAttribute && this.model.rawAttributes[this.model.primaryKeyAttribute]) {
          const startId = data[this.getInsertIdField()];
          result = new Array(data.affectedRows);
          const pkField = this.model.rawAttributes[this.model.primaryKeyAttribute].field;
          for (let i = 0; i < data.affectedRows; i++) {
            result[i] = { [pkField]: startId + i };
          }
          return [result, data.affectedRows];
        }
        return [data[this.getInsertIdField()], data.affectedRows];
      }
    }
    if (this.isSelectQuery()) {
      this.handleJsonSelectQuery(data);
      return this.handleSelectQuery(data);
    }
    if (this.isInsertQuery() || this.isUpdateQuery()) {
      return [result, data.affectedRows];
    }
    if (this.isCallQuery()) {
      return data[0];
    }
    if (this.isRawQuery()) {
      const meta = data.meta;
      delete data.meta;
      return [data, meta];
    }
    if (this.isShowIndexesQuery()) {
      return this.handleShowIndexesQuery(data);
    }
    if (this.isForeignKeysQuery() || this.isShowConstraintsQuery()) {
      return data;
    }
    if (this.isShowTablesQuery()) {
      return this.handleShowTablesQuery(data);
    }
    if (this.isDescribeQuery()) {
      result = {};
      for (const _result of data) {
        result[_result.Field] = {
          type: _result.Type.toLowerCase().startsWith("enum") ? _result.Type.replace(/^enum/i, "ENUM") : _result.Type.toUpperCase(),
          allowNull: _result.Null === "YES",
          defaultValue: _result.Default,
          primaryKey: _result.Key === "PRI",
          autoIncrement: Object.prototype.hasOwnProperty.call(_result, "Extra") && _result.Extra.toLowerCase() === "auto_increment",
          comment: _result.Comment ? _result.Comment : null
        };
      }
      return result;
    }
    if (this.isVersionQuery()) {
      return data[0].version;
    }
    return result;
  }
  handleJsonSelectQuery(rows) {
    if (!this.model || !this.model.fieldRawAttributesMap) {
      return;
    }
    for (const _field of Object.keys(this.model.fieldRawAttributesMap)) {
      const modelField = this.model.fieldRawAttributesMap[_field];
      if (modelField.type instanceof DataTypes.JSON) {
        rows = rows.map((row) => {
          if (row[modelField.fieldName] && typeof row[modelField.fieldName] === "string") {
            row[modelField.fieldName] = JSON.parse(row[modelField.fieldName]);
          }
          if (DataTypes.JSON.parse) {
            return DataTypes.JSON.parse(modelField, this.sequelize.options, row[modelField.fieldName]);
          }
          return row;
        });
      }
    }
  }
  async logWarnings(results) {
    const warningResults = await this.run("SHOW WARNINGS");
    const warningMessage = `MariaDB Warnings (${this.connection.uuid || "default"}): `;
    const messages = [];
    for (const _warningRow of warningResults) {
      if (_warningRow === void 0 || typeof _warningRow[Symbol.iterator] !== "function") {
        continue;
      }
      for (const _warningResult of _warningRow) {
        if (Object.prototype.hasOwnProperty.call(_warningResult, "Message")) {
          messages.push(_warningResult.Message);
        } else {
          for (const _objectKey of _warningResult.keys()) {
            messages.push([_objectKey, _warningResult[_objectKey]].join(": "));
          }
        }
      }
    }
    this.sequelize.log(warningMessage + messages.join("; "), this.options);
    return results;
  }
  formatError(err, errStack) {
    switch (err.errno) {
      case ER_DUP_ENTRY: {
        const match = err.message.match(/Duplicate entry '([\s\S]*)' for key '?((.|\s)*?)'?\s.*$/);
        let fields = {};
        let message = "Validation error";
        const values = match ? match[1].split("-") : void 0;
        const fieldKey = match ? match[2] : void 0;
        const fieldVal = match ? match[1] : void 0;
        const uniqueKey = this.model && this.model.uniqueKeys[fieldKey];
        if (uniqueKey) {
          if (uniqueKey.msg)
            message = uniqueKey.msg;
          fields = _.zipObject(uniqueKey.fields, values);
        } else {
          fields[fieldKey] = fieldVal;
        }
        const errors = [];
        _.forOwn(fields, (value, field) => {
          errors.push(new sequelizeErrors.ValidationErrorItem(this.getUniqueConstraintErrorMessage(field), "unique violation", field, value, this.instance, "not_unique"));
        });
        return new sequelizeErrors.UniqueConstraintError({ message, errors, parent: err, fields, stack: errStack });
      }
      case ER_ROW_IS_REFERENCED:
      case ER_NO_REFERENCED_ROW: {
        const match = err.message.match(/CONSTRAINT ([`"])(.*)\1 FOREIGN KEY \(\1(.*)\1\) REFERENCES \1(.*)\1 \(\1(.*)\1\)/);
        const quoteChar = match ? match[1] : "`";
        const fields = match ? match[3].split(new RegExp(`${quoteChar}, *${quoteChar}`)) : void 0;
        return new sequelizeErrors.ForeignKeyConstraintError({
          reltype: err.errno === ER_ROW_IS_REFERENCED ? "parent" : "child",
          table: match ? match[4] : void 0,
          fields,
          value: fields && fields.length && this.instance && this.instance[fields[0]] || void 0,
          index: match ? match[2] : void 0,
          parent: err,
          stack: errStack
        });
      }
      default:
        return new sequelizeErrors.DatabaseError(err, { stack: errStack });
    }
  }
  handleShowTablesQuery(results) {
    return results.map((resultSet) => ({
      tableName: resultSet.TABLE_NAME,
      schema: resultSet.TABLE_SCHEMA
    }));
  }
  handleShowIndexesQuery(data) {
    let currItem;
    const result = [];
    data.forEach((item) => {
      if (!currItem || currItem.name !== item.Key_name) {
        currItem = {
          primary: item.Key_name === "PRIMARY",
          fields: [],
          name: item.Key_name,
          tableName: item.Table,
          unique: item.Non_unique !== 1,
          type: item.Index_type
        };
        result.push(currItem);
      }
      currItem.fields[item.Seq_in_index - 1] = {
        attribute: item.Column_name,
        length: item.Sub_part || void 0,
        order: item.Collation === "A" ? "ASC" : void 0
      };
    });
    return result;
  }
}
module.exports = Query;
//# sourceMappingURL=query.js.map
"use strict";
const AbstractConnectionManager = require("../abstract/connection-manager");
const sequelizeErrors = require("../../errors");
const { logger } = require("../../utils/logger");
const DataTypes = require("../../data-types").db2;
const debug = logger.debugContext("connection:db2");
const parserStore = require("../parserStore")("db2");
class ConnectionManager extends AbstractConnectionManager {
  constructor(dialect, sequelize) {
    sequelize.config.port = sequelize.config.port || 3306;
    super(dialect, sequelize);
    this.lib = this._loadDialectModule("ibm_db");
    this.refreshTypeParser(DataTypes);
  }
  static _typecast(field, next) {
    if (parserStore.get(field.type)) {
      return parserStore.get(field.type)(field, this.sequelize.options, next);
    }
    return next();
  }
  _refreshTypeParser(dataType) {
    parserStore.refresh(dataType);
  }
  _clearTypeParser() {
    parserStore.clear();
  }
  async connect(config) {
    const connectionConfig = {
      database: config.database,
      hostname: config.host,
      port: config.port,
      uid: config.username,
      pwd: config.password
    };
    if (config.ssl) {
      connectionConfig["security"] = config.ssl;
    }
    if (config.sslcertificate) {
      connectionConfig["SSLServerCertificate"] = config.sslcertificate;
    }
    if (config.dialectOptions) {
      for (const key of Object.keys(config.dialectOptions)) {
        connectionConfig[key] = config.dialectOptions[key];
      }
    }
    try {
      const connection = await new Promise((resolve, reject) => {
        const connection2 = new this.lib.Database();
        connection2.lib = this.lib;
        connection2.open(connectionConfig, (error) => {
          if (error) {
            if (error.message && error.message.includes("SQL30081N")) {
              return reject(new sequelizeErrors.ConnectionRefusedError(error));
            }
            return reject(new sequelizeErrors.ConnectionError(error));
          }
          return resolve(connection2);
        });
      });
      return connection;
    } catch (err) {
      throw new sequelizeErrors.ConnectionError(err);
    }
  }
  disconnect(connection) {
    if (connection.connected) {
      connection.close((error) => {
        if (error) {
          debug(error);
        } else {
          debug("connection closed");
        }
      });
    }
    return Promise.resolve();
  }
  validate(connection) {
    return connection && connection.connected;
  }
  _disconnect(connection) {
    return this.dialect.connectionManager.disconnect(connection);
  }
}
module.exports = ConnectionManager;
module.exports.ConnectionManager = ConnectionManager;
module.exports.default = ConnectionManager;
//# sourceMappingURL=connection-manager.js.map
"use strict";
const momentTz = require("moment-timezone");
const moment = require("moment");
module.exports = (BaseTypes) => {
  const warn = BaseTypes.ABSTRACT.warn.bind(void 0, "https://www.ibm.com/support/knowledgecenter/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0008478.html");
  function removeUnsupportedIntegerOptions(dataType) {
    if (dataType._length || dataType.options.length || dataType._unsigned || dataType._zerofill) {
      warn(`Db2 does not support '${dataType.key}' with options. Plain '${dataType.key}' will be used instead.`);
      dataType._length = void 0;
      dataType.options.length = void 0;
      dataType._unsigned = void 0;
      dataType._zerofill = void 0;
    }
  }
  BaseTypes.DATE.types.db2 = ["TIMESTAMP"];
  BaseTypes.STRING.types.db2 = ["VARCHAR"];
  BaseTypes.CHAR.types.db2 = ["CHAR"];
  BaseTypes.TEXT.types.db2 = ["VARCHAR", "CLOB"];
  BaseTypes.TINYINT.types.db2 = ["SMALLINT"];
  BaseTypes.SMALLINT.types.db2 = ["SMALLINT"];
  BaseTypes.MEDIUMINT.types.db2 = ["INTEGER"];
  BaseTypes.INTEGER.types.db2 = ["INTEGER"];
  BaseTypes.BIGINT.types.db2 = ["BIGINT"];
  BaseTypes.FLOAT.types.db2 = ["DOUBLE", "REAL", "FLOAT"];
  BaseTypes.TIME.types.db2 = ["TIME"];
  BaseTypes.DATEONLY.types.db2 = ["DATE"];
  BaseTypes.BOOLEAN.types.db2 = ["BOOLEAN", "BOOL", "SMALLINT", "BIT"];
  BaseTypes.BLOB.types.db2 = ["BLOB"];
  BaseTypes.DECIMAL.types.db2 = ["DECIMAL"];
  BaseTypes.UUID.types.db2 = ["CHAR () FOR BIT DATA"];
  BaseTypes.ENUM.types.db2 = ["VARCHAR"];
  BaseTypes.REAL.types.db2 = ["REAL"];
  BaseTypes.DOUBLE.types.db2 = ["DOUBLE"];
  BaseTypes.GEOMETRY.types.db2 = false;
  class BLOB extends BaseTypes.BLOB {
    toSql() {
      if (this._length) {
        if (this._length.toLowerCase() === "tiny") {
          return "BLOB(255)";
        }
        if (this._length.toLowerCase() === "medium") {
          return "BLOB(16M)";
        }
        if (this._length.toLowerCase() === "long") {
          return "BLOB(2G)";
        }
        return `BLOB(${this._length})`;
      }
      return "BLOB";
    }
    escape(blob) {
      return `BLOB('${blob.toString().replace(/'/g, "''")}')`;
    }
    _stringify(value) {
      if (Buffer.isBuffer(value)) {
        return `BLOB('${value.toString().replace(/'/g, "''")}')`;
      }
      if (Array.isArray(value)) {
        value = Buffer.from(value);
      } else {
        value = Buffer.from(value.toString());
      }
      const hex = value.toString("hex");
      return this._hexify(hex);
    }
    _hexify(hex) {
      return `x'${hex}'`;
    }
  }
  class STRING extends BaseTypes.STRING {
    toSql() {
      if (!this._binary) {
        if (this._length <= 4e3) {
          return `VARCHAR(${this._length})`;
        }
        return `CLOB(${this._length})`;
      }
      if (this._length < 255) {
        return `CHAR(${this._length}) FOR BIT DATA`;
      }
      if (this._length <= 4e3) {
        return `VARCHAR(${this._length}) FOR BIT DATA`;
      }
      return `BLOB(${this._length})`;
    }
    _stringify(value, options) {
      if (this._binary) {
        return BLOB.prototype._hexify(value.toString("hex"));
      }
      return options.escape(value);
    }
    _bindParam(value, options) {
      return options.bindParam(this._binary ? Buffer.from(value) : value);
    }
  }
  STRING.prototype.escape = false;
  class TEXT extends BaseTypes.TEXT {
    toSql() {
      let len = 0;
      if (this._length) {
        switch (this._length.toLowerCase()) {
          case "tiny":
            len = 256;
            break;
          case "medium":
            len = 8192;
            break;
          case "long":
            len = 65536;
            break;
        }
        if (isNaN(this._length)) {
          this._length = 32672;
        }
        if (len > 0) {
          this._length = len;
        }
      } else {
        this._length = 32672;
      }
      if (this._length > 32672) {
        len = `CLOB(${this._length})`;
      } else {
        len = `VARCHAR(${this._length})`;
      }
      warn(`Db2 does not support TEXT datatype. ${len} will be used instead.`);
      return len;
    }
  }
  class BOOLEAN extends BaseTypes.BOOLEAN {
    toSql() {
      return "BOOLEAN";
    }
    _sanitize(value) {
      if (value !== null && value !== void 0) {
        if (Buffer.isBuffer(value) && value.length === 1) {
          value = value[0];
        }
        if (typeof value === "string") {
          value = value === "true" ? true : value === "false" ? false : value;
          value = value === "" ? true : value === "\0" ? false : value;
        } else if (typeof value === "number") {
          value = value === 1 ? true : value === 0 ? false : value;
        }
      }
      return value;
    }
  }
  BOOLEAN.parse = BOOLEAN.prototype._sanitize;
  class UUID extends BaseTypes.UUID {
    toSql() {
      return "CHAR(36) FOR BIT DATA";
    }
  }
  class NOW extends BaseTypes.NOW {
    toSql() {
      return "CURRENT TIME";
    }
  }
  class DATE extends BaseTypes.DATE {
    toSql() {
      if (this._length < 0) {
        this._length = 0;
      }
      if (this._length > 6) {
        this._length = 6;
      }
      return `TIMESTAMP${this._length ? `(${this._length})` : ""}`;
    }
    _stringify(date, options) {
      if (!moment.isMoment(date)) {
        date = this._applyTimezone(date, options);
      }
      if (this._length > 0) {
        let msec = ".";
        for (let i = 0; i < this._length && i < 6; i++) {
          msec += "S";
        }
        return date.format(`YYYY-MM-DD HH:mm:ss${msec}`);
      }
      return date.format("YYYY-MM-DD HH:mm:ss");
    }
    static parse(value) {
      if (typeof value !== "string") {
        value = value.string();
      }
      if (value === null) {
        return value;
      }
      value = new Date(momentTz.utc(value));
      return value;
    }
  }
  class DATEONLY extends BaseTypes.DATEONLY {
    static parse(value) {
      return momentTz(value).format("YYYY-MM-DD");
    }
  }
  class INTEGER extends BaseTypes.INTEGER {
    constructor(length) {
      super(length);
      removeUnsupportedIntegerOptions(this);
    }
  }
  class TINYINT extends BaseTypes.TINYINT {
    constructor(length) {
      super(length);
      removeUnsupportedIntegerOptions(this);
    }
  }
  class SMALLINT extends BaseTypes.SMALLINT {
    constructor(length) {
      super(length);
      removeUnsupportedIntegerOptions(this);
    }
  }
  class BIGINT extends BaseTypes.BIGINT {
    constructor(length) {
      super(length);
      removeUnsupportedIntegerOptions(this);
    }
  }
  class REAL extends BaseTypes.REAL {
    constructor(length, decimals) {
      super(length, decimals);
      if (this._length || this.options.length || this._unsigned || this._zerofill) {
        warn("Db2 does not support REAL with options. Plain `REAL` will be used instead.");
        this._length = void 0;
        this.options.length = void 0;
        this._unsigned = void 0;
        this._zerofill = void 0;
      }
    }
  }
  class FLOAT extends BaseTypes.FLOAT {
    constructor(length, decimals) {
      super(length, decimals);
      if (this._decimals) {
        warn("Db2 does not support Float with decimals. Plain `FLOAT` will be used instead.");
        this._length = void 0;
        this.options.length = void 0;
      }
      if (this._unsigned) {
        warn("Db2 does not support Float unsigned. `UNSIGNED` was removed.");
        this._unsigned = void 0;
      }
      if (this._zerofill) {
        warn("Db2 does not support Float zerofill. `ZEROFILL` was removed.");
        this._zerofill = void 0;
      }
    }
  }
  class ENUM extends BaseTypes.ENUM {
    toSql() {
      return "VARCHAR(255)";
    }
  }
  class DOUBLE extends BaseTypes.DOUBLE {
    constructor(length, decimals) {
      super(length, decimals);
      if (this._length || this.options.length || this._unsigned || this._zerofill) {
        warn("db2 does not support DOUBLE with options. Plain DOUBLE will be used instead.");
        this._length = void 0;
        this.options.length = void 0;
        this._unsigned = void 0;
        this._zerofill = void 0;
      }
    }
    toSql() {
      return "DOUBLE";
    }
  }
  DOUBLE.prototype.key = DOUBLE.key = "DOUBLE";
  return {
    BLOB,
    BOOLEAN,
    ENUM,
    STRING,
    UUID,
    DATE,
    DATEONLY,
    NOW,
    TINYINT,
    SMALLINT,
    INTEGER,
    DOUBLE,
    "DOUBLE PRECISION": DOUBLE,
    BIGINT,
    REAL,
    FLOAT,
    TEXT
  };
};
//# sourceMappingURL=data-types.js.map
"use strict";
const _ = require("lodash");
const AbstractDialect = require("../abstract");
const ConnectionManager = require("./connection-manager");
const Query = require("./query");
const QueryGenerator = require("./query-generator");
const DataTypes = require("../../data-types").db2;
const { Db2QueryInterface } = require("./query-interface");
class Db2Dialect extends AbstractDialect {
  constructor(sequelize) {
    super();
    this.sequelize = sequelize;
    this.connectionManager = new ConnectionManager(this, sequelize);
    this.queryGenerator = new QueryGenerator({
      _dialect: this,
      sequelize
    });
    this.queryInterface = new Db2QueryInterface(sequelize, this.queryGenerator);
  }
}
Db2Dialect.prototype.supports = _.merge(_.cloneDeep(AbstractDialect.prototype.supports), {
  "DEFAULT": true,
  "DEFAULT VALUES": false,
  "VALUES ()": false,
  "LIMIT ON UPDATE": false,
  "ORDER NULLS": false,
  lock: false,
  transactions: true,
  migrations: false,
  returnValues: false,
  schemas: true,
  finalTable: true,
  autoIncrement: {
    identityInsert: false,
    defaultValue: false,
    update: true
  },
  constraints: {
    restrict: true,
    default: false
  },
  index: {
    collate: false,
    length: false,
    parser: false,
    type: false,
    using: false,
    where: true
  },
  NUMERIC: true,
  tmpTableTrigger: true
});
Db2Dialect.prototype.defaultVersion = "1.0.0";
Db2Dialect.prototype.Query = Query;
Db2Dialect.prototype.name = "db2";
Db2Dialect.prototype.TICK_CHAR = '"';
Db2Dialect.prototype.TICK_CHAR_LEFT = '"';
Db2Dialect.prototype.TICK_CHAR_RIGHT = '"';
Db2Dialect.prototype.DataTypes = DataTypes;
module.exports = Db2Dialect;
//# sourceMappingURL=index.js.map
"use strict";
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
const _ = require("lodash");
const Utils = require("../../utils");
const DataTypes = require("../../data-types");
const AbstractQueryGenerator = require("../abstract/query-generator");
const randomBytes = require("crypto").randomBytes;
const Op = require("../../operators");
const throwMethodUndefined = function(methodName) {
  throw new Error(`The method "${methodName}" is not defined! Please add it to your sql dialect.`);
};
class Db2QueryGenerator extends AbstractQueryGenerator {
  constructor(options) {
    super(options);
    this.OperatorMap = __spreadProps(__spreadValues({}, this.OperatorMap), {
      [Op.regexp]: "REGEXP_LIKE",
      [Op.notRegexp]: "NOT REGEXP_LIKE"
    });
    this.autoGenValue = 1;
  }
  createSchema(schema) {
    return [
      "CREATE SCHEMA",
      this.quoteIdentifier(schema),
      ";"
    ].join(" ");
  }
  dropSchema(schema) {
    const query = `CALL SYSPROC.ADMIN_DROP_SCHEMA(${wrapSingleQuote(schema.trim())}, NULL, ? , ?)`;
    const sql = { query };
    sql.bind = [
      { ParamType: "INOUT", Data: "ERRORSCHEMA" },
      { ParamType: "INOUT", Data: "ERRORTABLE" }
    ];
    return sql;
  }
  showSchemasQuery() {
    return `SELECT SCHEMANAME AS "schema_name" FROM SYSCAT.SCHEMATA WHERE (SCHEMANAME NOT LIKE 'SYS%') AND SCHEMANAME NOT IN ('NULLID', 'SQLJ', 'ERRORSCHEMA')`;
  }
  versionQuery() {
    return "select service_level as VERSION from TABLE (sysproc.env_get_inst_info()) as A";
  }
  createTableQuery(tableName, attributes, options) {
    const query = "CREATE TABLE <%= table %> (<%= attributes %>)", primaryKeys = [], foreignKeys = {}, attrStr = [], commentTemplate = " -- <%= comment %>, TableName = <%= table %>, ColumnName = <%= column %>;";
    let commentStr = "";
    for (const attr in attributes) {
      if (Object.prototype.hasOwnProperty.call(attributes, attr)) {
        let dataType = attributes[attr];
        let match;
        if (dataType.includes("COMMENT ")) {
          const commentMatch = dataType.match(/^(.+) (COMMENT.*)$/);
          if (commentMatch && commentMatch.length > 2) {
            const commentText = commentMatch[2].replace(/COMMENT/, "").trim();
            commentStr += _.template(commentTemplate, this._templateSettings)({
              table: this.quoteIdentifier(tableName),
              comment: this.escape(commentText),
              column: this.quoteIdentifier(attr)
            });
            dataType = commentMatch[1];
          }
        }
        if (_.includes(dataType, "PRIMARY KEY")) {
          primaryKeys.push(attr);
          if (_.includes(dataType, "REFERENCES")) {
            match = dataType.match(/^(.+) (REFERENCES.*)$/);
            attrStr.push(`${this.quoteIdentifier(attr)} ${match[1].replace(/PRIMARY KEY/, "")}`);
            foreignKeys[attr] = match[2];
          } else {
            attrStr.push(`${this.quoteIdentifier(attr)} ${dataType.replace(/PRIMARY KEY/, "")}`);
          }
        } else if (_.includes(dataType, "REFERENCES")) {
          match = dataType.match(/^(.+) (REFERENCES.*)$/);
          attrStr.push(`${this.quoteIdentifier(attr)} ${match[1]}`);
          foreignKeys[attr] = match[2];
        } else {
          if (options && options.uniqueKeys) {
            for (const ukey in options.uniqueKeys) {
              if (options.uniqueKeys[ukey].fields.includes(attr) && !_.includes(dataType, "NOT NULL")) {
                dataType += " NOT NULL";
                break;
              }
            }
          }
          attrStr.push(`${this.quoteIdentifier(attr)} ${dataType}`);
        }
      }
    }
    const values = {
      table: this.quoteTable(tableName),
      attributes: attrStr.join(", ")
    }, pkString = primaryKeys.map((pk) => {
      return this.quoteIdentifier(pk);
    }).join(", ");
    if (options && options.uniqueKeys) {
      _.each(options.uniqueKeys, (columns, indexName) => {
        if (columns.customIndex) {
          if (!_.isString(indexName)) {
            indexName = `uniq_${tableName}_${columns.fields.join("_")}`;
          }
          values.attributes += `, CONSTRAINT ${this.quoteIdentifier(indexName)} UNIQUE (${columns.fields.map((field) => this.quoteIdentifier(field)).join(", ")})`;
        }
      });
    }
    if (pkString.length > 0) {
      values.attributes += `, PRIMARY KEY (${pkString})`;
    }
    for (const fkey in foreignKeys) {
      if (Object.prototype.hasOwnProperty.call(foreignKeys, fkey)) {
        values.attributes += `, FOREIGN KEY (${this.quoteIdentifier(fkey)}) ${foreignKeys[fkey]}`;
      }
    }
    return `${_.template(query, this._templateSettings)(values).trim()};${commentStr}`;
  }
  describeTableQuery(tableName, schema) {
    let sql = [
      'SELECT NAME AS "Name", TBNAME AS "Table", TBCREATOR AS "Schema",',
      'TRIM(COLTYPE) AS "Type", LENGTH AS "Length", SCALE AS "Scale",',
      'NULLS AS "IsNull", DEFAULT AS "Default", COLNO AS "Colno",',
      'IDENTITY AS "IsIdentity", KEYSEQ AS "KeySeq", REMARKS AS "Comment"',
      "FROM",
      "SYSIBM.SYSCOLUMNS",
      "WHERE TBNAME =",
      wrapSingleQuote(tableName)
    ].join(" ");
    if (schema) {
      sql += ` AND TBCREATOR =${wrapSingleQuote(schema)}`;
    } else {
      sql += " AND TBCREATOR = USER";
    }
    return `${sql};`;
  }
  renameTableQuery(before, after) {
    const query = "RENAME TABLE <%= before %> TO <%= after %>;";
    return _.template(query, this._templateSettings)({
      before: this.quoteTable(before),
      after: this.quoteTable(after)
    });
  }
  showTablesQuery() {
    return `SELECT TABNAME AS "tableName", TRIM(TABSCHEMA) AS "tableSchema" FROM SYSCAT.TABLES WHERE TABSCHEMA = USER AND TYPE = 'T' ORDER BY TABSCHEMA, TABNAME`;
  }
  tableExistsQuery(table) {
    const tableName = table.tableName || table;
    const schemaName = table.schema || this.sequelize.config.username.toUpperCase();
    return `SELECT name FROM sysibm.systables WHERE NAME = ${wrapSingleQuote(tableName)} AND CREATOR = ${wrapSingleQuote(schemaName)}`;
  }
  dropTableQuery(tableName) {
    const query = "DROP TABLE <%= table %>";
    const values = {
      table: this.quoteTable(tableName)
    };
    return `${_.template(query, this._templateSettings)(values).trim()};`;
  }
  addColumnQuery(table, key, dataType) {
    dataType.field = key;
    const query = "ALTER TABLE <%= table %> ADD <%= attribute %>;", attribute = _.template("<%= key %> <%= definition %>", this._templateSettings)({
      key: this.quoteIdentifier(key),
      definition: this.attributeToSQL(dataType, {
        context: "addColumn"
      })
    });
    return _.template(query, this._templateSettings)({
      table: this.quoteTable(table),
      attribute
    });
  }
  removeColumnQuery(tableName, attributeName) {
    const query = "ALTER TABLE <%= tableName %> DROP COLUMN <%= attributeName %>;";
    return _.template(query, this._templateSettings)({
      tableName: this.quoteTable(tableName),
      attributeName: this.quoteIdentifier(attributeName)
    });
  }
  changeColumnQuery(tableName, attributes) {
    const query = "ALTER TABLE <%= tableName %> <%= query %>;";
    const attrString = [], constraintString = [];
    for (const attributeName in attributes) {
      const attrValue = attributes[attributeName];
      let defs = [attrValue];
      if (Array.isArray(attrValue)) {
        defs = attrValue;
      }
      for (let i = 0; i < defs.length; i++) {
        const definition = defs[i];
        if (definition.match(/REFERENCES/)) {
          constraintString.push(_.template("<%= fkName %> FOREIGN KEY (<%= attrName %>) <%= definition %>", this._templateSettings)({
            fkName: this.quoteIdentifier(`${attributeName}_foreign_idx`),
            attrName: this.quoteIdentifier(attributeName),
            definition: definition.replace(/.+?(?=REFERENCES)/, "")
          }));
        } else if (_.startsWith(definition, "DROP ")) {
          attrString.push(_.template("<%= attrName %> <%= definition %>", this._templateSettings)({
            attrName: this.quoteIdentifier(attributeName),
            definition
          }));
        } else {
          attrString.push(_.template("<%= attrName %> SET <%= definition %>", this._templateSettings)({
            attrName: this.quoteIdentifier(attributeName),
            definition
          }));
        }
      }
    }
    let finalQuery = "";
    if (attrString.length) {
      finalQuery += `ALTER COLUMN ${attrString.join(" ALTER COLUMN ")}`;
      finalQuery += constraintString.length ? " " : "";
    }
    if (constraintString.length) {
      finalQuery += `ADD CONSTRAINT ${constraintString.join(" ADD CONSTRAINT ")}`;
    }
    return _.template(query, this._templateSettings)({
      tableName: this.quoteTable(tableName),
      query: finalQuery
    });
  }
  renameColumnQuery(tableName, attrBefore, attributes) {
    const query = "ALTER TABLE <%= tableName %> RENAME COLUMN <%= before %> TO <%= after %>;", newName = Object.keys(attributes)[0];
    return _.template(query, this._templateSettings)({
      tableName: this.quoteTable(tableName),
      before: this.quoteIdentifier(attrBefore),
      after: this.quoteIdentifier(newName)
    });
  }
  addConstraintQuery(tableName, options) {
    options = options || {};
    if (options.onUpdate && options.onUpdate.toUpperCase() === "CASCADE") {
      delete options.onUpdate;
    }
    const constraintSnippet = this.getConstraintSnippet(tableName, options);
    if (typeof tableName === "string") {
      tableName = this.quoteIdentifiers(tableName);
    } else {
      tableName = this.quoteTable(tableName);
    }
    return `ALTER TABLE ${tableName} ADD ${constraintSnippet};`;
  }
  bulkInsertQuery(tableName, attrValueHashes, options, attributes) {
    options = options || {};
    attributes = attributes || {};
    let query = "INSERT INTO <%= table %> (<%= attributes %>)<%= output %> VALUES <%= tuples %>;";
    if (options.returning) {
      query = "SELECT * FROM FINAL TABLE( INSERT INTO <%= table %> (<%= attributes %>)<%= output %> VALUES <%= tuples %>);";
    }
    const emptyQuery = "INSERT INTO <%= table %>", tuples = [], allAttributes = [], allQueries = [];
    let outputFragment;
    const valuesForEmptyQuery = [];
    if (options.returning) {
      outputFragment = "";
    }
    _.forEach(attrValueHashes, (attrValueHash) => {
      const fields = Object.keys(attrValueHash);
      const firstAttr = attributes[fields[0]];
      if (fields.length === 1 && firstAttr && firstAttr.autoIncrement && attrValueHash[fields[0]] === null) {
        valuesForEmptyQuery.push(`(${this.autoGenValue++})`);
        return;
      }
      _.forOwn(attrValueHash, (value, key) => {
        if (allAttributes.indexOf(key) === -1) {
          if (value === null && attributes[key] && attributes[key].autoIncrement)
            return;
          allAttributes.push(key);
        }
      });
    });
    if (valuesForEmptyQuery.length > 0) {
      allQueries.push(`${emptyQuery} VALUES ${valuesForEmptyQuery.join(",")}`);
    }
    if (allAttributes.length > 0) {
      _.forEach(attrValueHashes, (attrValueHash) => {
        tuples.push(`(${allAttributes.map((key) => this.escape(attrValueHash[key]), void 0, { context: "INSERT" }).join(",")})`);
      });
      allQueries.push(query);
    }
    const replacements = {
      table: this.quoteTable(tableName),
      attributes: allAttributes.map((attr) => this.quoteIdentifier(attr)).join(","),
      tuples,
      output: outputFragment
    };
    const generatedQuery = _.template(allQueries.join(";"), this._templateSettings)(replacements);
    return generatedQuery;
  }
  updateQuery(tableName, attrValueHash, where, options, attributes) {
    const sql = super.updateQuery(tableName, attrValueHash, where, options, attributes);
    options = options || {};
    _.defaults(options, this.options);
    if (!options.limit) {
      sql.query = `SELECT * FROM FINAL TABLE (${sql.query});`;
      return sql;
    }
    attrValueHash = Utils.removeNullValuesFromHash(attrValueHash, options.omitNull, options);
    const modelAttributeMap = {};
    const values = [];
    const bind = [];
    const bindParam = options.bindParam || this.bindParam(bind);
    if (attributes) {
      _.each(attributes, (attribute, key) => {
        modelAttributeMap[key] = attribute;
        if (attribute.field) {
          modelAttributeMap[attribute.field] = attribute;
        }
      });
    }
    for (const key in attrValueHash) {
      const value = attrValueHash[key];
      if (value instanceof Utils.SequelizeMethod || options.bindParam === false) {
        values.push(`${this.quoteIdentifier(key)}=${this.escape(value, modelAttributeMap && modelAttributeMap[key] || void 0, { context: "UPDATE" })}`);
      } else {
        values.push(`${this.quoteIdentifier(key)}=${this.format(value, modelAttributeMap && modelAttributeMap[key] || void 0, { context: "UPDATE" }, bindParam)}`);
      }
    }
    let query;
    const whereOptions = _.defaults({ bindParam }, options);
    query = `UPDATE (SELECT * FROM ${this.quoteTable(tableName)} ${this.whereQuery(where, whereOptions)} FETCH NEXT ${this.escape(options.limit)} ROWS ONLY) SET ${values.join(",")}`;
    query = `SELECT * FROM FINAL TABLE (${query});`;
    return { query, bind };
  }
  upsertQuery(tableName, insertValues, updateValues, where, model) {
    const targetTableAlias = this.quoteTable(`${tableName}_target`);
    const sourceTableAlias = this.quoteTable(`${tableName}_source`);
    const primaryKeysAttrs = [];
    const identityAttrs = [];
    const uniqueAttrs = [];
    const tableNameQuoted = this.quoteTable(tableName);
    for (const key in model.rawAttributes) {
      if (model.rawAttributes[key].primaryKey) {
        primaryKeysAttrs.push(model.rawAttributes[key].field || key);
      }
      if (model.rawAttributes[key].unique) {
        uniqueAttrs.push(model.rawAttributes[key].field || key);
      }
      if (model.rawAttributes[key].autoIncrement) {
        identityAttrs.push(model.rawAttributes[key].field || key);
      }
    }
    for (const index of model._indexes) {
      if (index.unique && index.fields) {
        for (const field of index.fields) {
          const fieldName = typeof field === "string" ? field : field.name || field.attribute;
          if (uniqueAttrs.indexOf(fieldName) === -1 && model.rawAttributes[fieldName]) {
            uniqueAttrs.push(fieldName);
          }
        }
      }
    }
    const updateKeys = Object.keys(updateValues);
    const insertKeys = Object.keys(insertValues);
    const insertKeysQuoted = insertKeys.map((key) => this.quoteIdentifier(key)).join(", ");
    const insertValuesEscaped = insertKeys.map((key) => this.escape(insertValues[key])).join(", ");
    const sourceTableQuery = `VALUES(${insertValuesEscaped})`;
    let joinCondition;
    const clauses = where[Op.or].filter((clause) => {
      let valid = true;
      for (const key in clause) {
        if (!clause[key]) {
          valid = false;
          break;
        }
      }
      return valid;
    });
    const getJoinSnippet = (array) => {
      return array.map((key) => {
        key = this.quoteIdentifier(key);
        return `${targetTableAlias}.${key} = ${sourceTableAlias}.${key}`;
      });
    };
    if (clauses.length === 0) {
      throw new Error("Primary Key or Unique key should be passed to upsert query");
    } else {
      for (const key in clauses) {
        const keys = Object.keys(clauses[key]);
        if (primaryKeysAttrs.indexOf(keys[0]) !== -1) {
          joinCondition = getJoinSnippet(primaryKeysAttrs).join(" AND ");
          break;
        }
      }
      if (!joinCondition) {
        joinCondition = getJoinSnippet(uniqueAttrs).join(" AND ");
      }
    }
    const filteredUpdateClauses = updateKeys.filter((key) => {
      if (identityAttrs.indexOf(key) === -1) {
        return true;
      }
      return false;
    }).map((key) => {
      const value = this.escape(updateValues[key]);
      key = this.quoteIdentifier(key);
      return `${targetTableAlias}.${key} = ${value}`;
    }).join(", ");
    const updateSnippet = filteredUpdateClauses.length > 0 ? `WHEN MATCHED THEN UPDATE SET ${filteredUpdateClauses}` : "";
    const insertSnippet = `(${insertKeysQuoted}) VALUES(${insertValuesEscaped})`;
    let query = `MERGE INTO ${tableNameQuoted} AS ${targetTableAlias} USING (${sourceTableQuery}) AS ${sourceTableAlias}(${insertKeysQuoted}) ON ${joinCondition}`;
    query += ` ${updateSnippet} WHEN NOT MATCHED THEN INSERT ${insertSnippet};`;
    return query;
  }
  truncateTableQuery(tableName) {
    return `TRUNCATE TABLE ${this.quoteTable(tableName)} IMMEDIATE`;
  }
  deleteQuery(tableName, where, options = {}, model) {
    const table = this.quoteTable(tableName);
    const query = "DELETE FROM <%= table %><%= where %><%= limit %>";
    where = this.getWhereConditions(where, null, model, options);
    let limit = "";
    if (options.offset > 0) {
      limit = ` OFFSET ${this.escape(options.offset)} ROWS`;
    }
    if (options.limit) {
      limit += ` FETCH NEXT ${this.escape(options.limit)} ROWS ONLY`;
    }
    const replacements = {
      limit,
      table,
      where
    };
    if (replacements.where) {
      replacements.where = ` WHERE ${replacements.where}`;
    }
    return _.template(query, this._templateSettings)(replacements);
  }
  showIndexesQuery(tableName) {
    let sql = 'SELECT NAME AS "name", TBNAME AS "tableName", UNIQUERULE AS "keyType", COLNAMES, INDEXTYPE AS "type" FROM SYSIBM.SYSINDEXES WHERE TBNAME = <%= tableName %>';
    let schema = void 0;
    if (_.isObject(tableName)) {
      schema = tableName.schema;
      tableName = tableName.tableName;
    }
    if (schema) {
      sql = `${sql} AND TBCREATOR = <%= schemaName %>`;
    }
    sql = `${sql} ORDER BY NAME;`;
    return _.template(sql, this._templateSettings)({
      tableName: wrapSingleQuote(tableName),
      schemaName: wrapSingleQuote(schema)
    });
  }
  showConstraintsQuery(tableName, constraintName) {
    let sql = `SELECT CONSTNAME AS "constraintName", TRIM(TABSCHEMA) AS "schemaName", TABNAME AS "tableName" FROM SYSCAT.TABCONST WHERE TABNAME = '${tableName}'`;
    if (constraintName) {
      sql += ` AND CONSTNAME LIKE '%${constraintName}%'`;
    }
    return `${sql} ORDER BY CONSTNAME;`;
  }
  removeIndexQuery(tableName, indexNameOrAttributes) {
    const sql = "DROP INDEX <%= indexName %>";
    let indexName = indexNameOrAttributes;
    if (typeof indexName !== "string") {
      indexName = Utils.underscore(`${tableName}_${indexNameOrAttributes.join("_")}`);
    }
    const values = {
      tableName: this.quoteIdentifiers(tableName),
      indexName: this.quoteIdentifiers(indexName)
    };
    return _.template(sql, this._templateSettings)(values);
  }
  attributeToSQL(attribute, options) {
    if (!_.isPlainObject(attribute)) {
      attribute = {
        type: attribute
      };
    }
    let template;
    let changeNull = 1;
    if (attribute.type instanceof DataTypes.ENUM) {
      if (attribute.type.values && !attribute.values)
        attribute.values = attribute.type.values;
      template = attribute.type.toSql();
      template += ` CHECK (${this.quoteIdentifier(attribute.field)} IN(${attribute.values.map((value) => {
        return this.escape(value);
      }).join(", ")}))`;
    } else {
      template = attribute.type.toString();
    }
    if (options && options.context === "changeColumn" && attribute.type) {
      template = `DATA TYPE ${template}`;
    } else if (attribute.allowNull === false || attribute.primaryKey === true || attribute.unique) {
      template += " NOT NULL";
      changeNull = 0;
    }
    if (attribute.autoIncrement) {
      let initialValue = 1;
      if (attribute.initialAutoIncrement) {
        initialValue = attribute.initialAutoIncrement;
      }
      template += ` GENERATED BY DEFAULT AS IDENTITY(START WITH ${initialValue}, INCREMENT BY 1)`;
    }
    if (attribute.type !== "TEXT" && attribute.type._binary !== true && Utils.defaultValueSchemable(attribute.defaultValue)) {
      template += ` DEFAULT ${this.escape(attribute.defaultValue)}`;
    }
    if (attribute.unique === true) {
      template += " UNIQUE";
    }
    if (attribute.primaryKey) {
      template += " PRIMARY KEY";
    }
    if ((!options || !options.withoutForeignKeyConstraints) && attribute.references) {
      if (options && options.context === "addColumn" && options.foreignKey) {
        const attrName = this.quoteIdentifier(options.foreignKey);
        const fkName = `${options.tableName}_${attrName}_fidx`;
        template += `, CONSTRAINT ${fkName} FOREIGN KEY (${attrName})`;
      }
      template += ` REFERENCES ${this.quoteTable(attribute.references.model)}`;
      if (attribute.references.key) {
        template += ` (${this.quoteIdentifier(attribute.references.key)})`;
      } else {
        template += ` (${this.quoteIdentifier("id")})`;
      }
      if (attribute.onDelete) {
        template += ` ON DELETE ${attribute.onDelete.toUpperCase()}`;
      }
      if (attribute.onUpdate && attribute.onUpdate.toUpperCase() != "CASCADE") {
        template += ` ON UPDATE ${attribute.onUpdate.toUpperCase()}`;
      }
    }
    if (options && options.context === "changeColumn" && changeNull === 1 && attribute.allowNull !== void 0) {
      template = [template];
      if (attribute.allowNull) {
        template.push("DROP NOT NULL");
      } else {
        template.push("NOT NULL");
      }
    }
    if (attribute.comment && typeof attribute.comment === "string") {
      template += ` COMMENT ${attribute.comment}`;
    }
    return template;
  }
  attributesToSQL(attributes, options) {
    const result = {}, existingConstraints = [];
    let key, attribute;
    for (key in attributes) {
      attribute = attributes[key];
      if (attribute.references) {
        if (existingConstraints.indexOf(attribute.references.model.toString()) !== -1) {
          attribute.onDelete = "";
          attribute.onUpdate = "";
        } else if (attribute.unique && attribute.unique === true) {
          attribute.onDelete = "";
          attribute.onUpdate = "";
        } else {
          existingConstraints.push(attribute.references.model.toString());
        }
      }
      if (key && !attribute.field && typeof attribute === "object")
        attribute.field = key;
      result[attribute.field || key] = this.attributeToSQL(attribute, options);
    }
    return result;
  }
  createTrigger() {
    throwMethodUndefined("createTrigger");
  }
  dropTrigger() {
    throwMethodUndefined("dropTrigger");
  }
  renameTrigger() {
    throwMethodUndefined("renameTrigger");
  }
  createFunction() {
    throwMethodUndefined("createFunction");
  }
  dropFunction() {
    throwMethodUndefined("dropFunction");
  }
  renameFunction() {
    throwMethodUndefined("renameFunction");
  }
  _getForeignKeysQuerySQL(condition) {
    return `SELECT R.CONSTNAME AS "constraintName", TRIM(R.TABSCHEMA) AS "constraintSchema", R.TABNAME AS "tableName", TRIM(R.TABSCHEMA) AS "tableSchema", LISTAGG(C.COLNAME,', ') WITHIN GROUP (ORDER BY C.COLNAME) AS "columnName", TRIM(R.REFTABSCHEMA) AS "referencedTableSchema", R.REFTABNAME AS "referencedTableName", TRIM(R.PK_COLNAMES) AS "referencedColumnName" FROM SYSCAT.REFERENCES R, SYSCAT.KEYCOLUSE C WHERE R.CONSTNAME = C.CONSTNAME AND R.TABSCHEMA = C.TABSCHEMA AND R.TABNAME = C.TABNAME${condition} GROUP BY R.REFTABSCHEMA, R.REFTABNAME, R.TABSCHEMA, R.TABNAME, R.CONSTNAME, R.PK_COLNAMES`;
  }
  getForeignKeysQuery(table, schemaName) {
    const tableName = table.tableName || table;
    schemaName = table.schema || schemaName;
    let sql = "";
    if (tableName) {
      sql = ` AND R.TABNAME = ${wrapSingleQuote(tableName)}`;
    }
    if (schemaName) {
      sql += ` AND R.TABSCHEMA = ${wrapSingleQuote(schemaName)}`;
    }
    return this._getForeignKeysQuerySQL(sql);
  }
  getForeignKeyQuery(table, columnName) {
    const tableName = table.tableName || table;
    const schemaName = table.schema;
    let sql = "";
    if (tableName) {
      sql = ` AND R.TABNAME = ${wrapSingleQuote(tableName)}`;
    }
    if (schemaName) {
      sql += ` AND R.TABSCHEMA = ${wrapSingleQuote(schemaName)}`;
    }
    if (columnName) {
      sql += ` AND C.COLNAME = ${wrapSingleQuote(columnName)}`;
    }
    return this._getForeignKeysQuerySQL(sql);
  }
  getPrimaryKeyConstraintQuery(table, attributeName) {
    const tableName = wrapSingleQuote(table.tableName || table);
    return [
      'SELECT TABNAME AS "tableName",',
      'COLNAME AS "columnName",',
      'CONSTNAME AS "constraintName"',
      "FROM SYSCAT.KEYCOLUSE WHERE CONSTNAME LIKE 'PK_%'",
      `AND COLNAME = ${wrapSingleQuote(attributeName)}`,
      `AND TABNAME = ${tableName};`
    ].join(" ");
  }
  dropForeignKeyQuery(tableName, foreignKey) {
    return _.template("ALTER TABLE <%= table %> DROP <%= key %>", this._templateSettings)({
      table: this.quoteTable(tableName),
      key: this.quoteIdentifier(foreignKey)
    });
  }
  dropConstraintQuery(tableName, constraintName) {
    const sql = "ALTER TABLE <%= table %> DROP CONSTRAINT <%= constraint %>;";
    return _.template(sql, this._templateSettings)({
      table: this.quoteTable(tableName),
      constraint: this.quoteIdentifier(constraintName)
    });
  }
  setAutocommitQuery() {
    return "";
  }
  setIsolationLevelQuery() {
  }
  generateTransactionId() {
    return randomBytes(10).toString("hex");
  }
  startTransactionQuery(transaction) {
    if (transaction.parent) {
      return `SAVE TRANSACTION ${this.quoteIdentifier(transaction.name)};`;
    }
    return "BEGIN TRANSACTION;";
  }
  commitTransactionQuery(transaction) {
    if (transaction.parent) {
      return;
    }
    return "COMMIT TRANSACTION;";
  }
  rollbackTransactionQuery(transaction) {
    if (transaction.parent) {
      return `ROLLBACK TRANSACTION ${this.quoteIdentifier(transaction.name)};`;
    }
    return "ROLLBACK TRANSACTION;";
  }
  addLimitAndOffset(options) {
    const offset = options.offset || 0;
    let fragment = "";
    if (offset > 0) {
      fragment += ` OFFSET ${this.escape(offset)} ROWS`;
    }
    if (options.limit) {
      fragment += ` FETCH NEXT ${this.escape(options.limit)} ROWS ONLY`;
    }
    return fragment;
  }
  booleanValue(value) {
    return value ? 1 : 0;
  }
  addUniqueFields(dataValues, rawAttributes, uniqno) {
    uniqno = uniqno === void 0 ? 1 : uniqno;
    for (const key in rawAttributes) {
      if (rawAttributes[key].unique && dataValues[key] === void 0) {
        if (rawAttributes[key].type instanceof DataTypes.DATE) {
          dataValues[key] = Utils.now("db2");
        } else if (rawAttributes[key].type instanceof DataTypes.STRING) {
          dataValues[key] = `unique${uniqno++}`;
        } else if (rawAttributes[key].type instanceof DataTypes.INTEGER) {
          dataValues[key] = uniqno++;
        } else if (rawAttributes[key].type instanceof DataTypes.BOOLEAN) {
          dataValues[key] = new DataTypes.BOOLEAN(false);
        }
      }
    }
    return uniqno;
  }
  quoteIdentifier(identifier, force) {
    return Utils.addTicks(Utils.removeTicks(identifier, '"'), '"');
  }
}
function wrapSingleQuote(identifier) {
  if (identifier) {
    return `'${identifier}'`;
  }
  return "";
}
module.exports = Db2QueryGenerator;
//# sourceMappingURL=query-generator.js.map
"use strict";
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
const _ = require("lodash");
const Utils = require("../../utils");
const Op = require("../../operators");
const { QueryInterface } = require("../abstract/query-interface");
const QueryTypes = require("../../query-types");
class Db2QueryInterface extends QueryInterface {
  async getForeignKeyReferencesForTable(tableName, options) {
    const queryOptions = __spreadProps(__spreadValues({}, options), {
      type: QueryTypes.FOREIGNKEYS
    });
    const query = this.queryGenerator.getForeignKeysQuery(tableName, this.sequelize.config.username.toUpperCase());
    return this.sequelize.query(query, queryOptions);
  }
  async upsert(tableName, insertValues, updateValues, where, options) {
    options = __spreadValues({}, options);
    const model = options.model;
    const wheres = [];
    const attributes = Object.keys(insertValues);
    let indexes = [];
    let indexFields;
    options = _.clone(options);
    if (!Utils.isWhereEmpty(where)) {
      wheres.push(where);
    }
    indexes = _.map(model.uniqueKeys, (value) => {
      return value.fields;
    });
    model._indexes.forEach((value) => {
      if (value.unique) {
        indexFields = value.fields.map((field) => {
          if (_.isPlainObject(field)) {
            return field.attribute;
          }
          return field;
        });
        indexes.push(indexFields);
      }
    });
    for (const index of indexes) {
      if (_.intersection(attributes, index).length === index.length) {
        where = {};
        for (const field of index) {
          where[field] = insertValues[field];
        }
        wheres.push(where);
      }
    }
    where = { [Op.or]: wheres };
    options.type = QueryTypes.UPSERT;
    options.raw = true;
    const sql = this.queryGenerator.upsertQuery(tableName, insertValues, updateValues, where, model, options);
    const result = await this.sequelize.query(sql, options);
    return [result, void 0];
  }
  async createTable(tableName, attributes, options, model) {
    let sql = "";
    options = __spreadValues({}, options);
    if (options && options.uniqueKeys) {
      _.forOwn(options.uniqueKeys, (uniqueKey) => {
        if (uniqueKey.customIndex === void 0) {
          uniqueKey.customIndex = true;
        }
      });
    }
    if (model) {
      options.uniqueKeys = options.uniqueKeys || model.uniqueKeys;
    }
    attributes = _.mapValues(attributes, (attribute) => this.sequelize.normalizeAttribute(attribute));
    if (options.indexes) {
      options.indexes.forEach((fields) => {
        const fieldArr = fields.fields;
        if (fieldArr.length === 1) {
          fieldArr.forEach((field) => {
            for (const property in attributes) {
              if (field === attributes[property].field) {
                attributes[property].unique = true;
              }
            }
          });
        }
      });
    }
    if (options.alter) {
      if (options.indexes) {
        options.indexes.forEach((fields) => {
          const fieldArr = fields.fields;
          if (fieldArr.length === 1) {
            fieldArr.forEach((field) => {
              for (const property in attributes) {
                if (field === attributes[property].field && attributes[property].unique) {
                  attributes[property].unique = false;
                }
              }
            });
          }
        });
      }
    }
    if (!tableName.schema && (options.schema || !!model && model._schema)) {
      tableName = this.queryGenerator.addSchema({
        tableName,
        _schema: !!model && model._schema || options.schema
      });
    }
    attributes = this.queryGenerator.attributesToSQL(attributes, { table: tableName, context: "createTable", withoutForeignKeyConstraints: options.withoutForeignKeyConstraints });
    sql = this.queryGenerator.createTableQuery(tableName, attributes, options);
    return await this.sequelize.query(sql, options);
  }
}
exports.Db2QueryInterface = Db2QueryInterface;
//# sourceMappingURL=query-interface.js.map
"use strict";
const AbstractQuery = require("../abstract/query");
const sequelizeErrors = require("../../errors");
const parserStore = require("../parserStore")("db2");
const _ = require("lodash");
const { logger } = require("../../utils/logger");
const moment = require("moment");
const debug = logger.debugContext("sql:db2");
class Query extends AbstractQuery {
  getInsertIdField() {
    return "id";
  }
  getSQLTypeFromJsType(value) {
    const param = { ParamType: "INPUT", Data: value };
    if (Buffer.isBuffer(value)) {
      param.DataType = "BLOB";
      return param;
    }
    return value;
  }
  async _run(connection, sql, parameters) {
    this.sql = sql;
    const benchmark = this.sequelize.options.benchmark || this.options.benchmark;
    let queryBegin;
    if (benchmark) {
      queryBegin = Date.now();
    } else {
      this.sequelize.log(`Executing (${this.connection.uuid || "default"}): ${this.sql}`, this.options);
    }
    const errStack = new Error().stack;
    return new Promise((resolve, reject) => {
      if (_.startsWith(this.sql, "BEGIN TRANSACTION")) {
        connection.beginTransaction((err) => {
          if (err) {
            reject(this.formatError(err, errStack));
          } else {
            resolve(this.formatResults());
          }
        });
      } else if (_.startsWith(this.sql, "COMMIT TRANSACTION")) {
        connection.commitTransaction((err) => {
          if (err) {
            reject(this.formatError(err, errStack));
          } else {
            resolve(this.formatResults());
          }
        });
      } else if (_.startsWith(this.sql, "ROLLBACK TRANSACTION")) {
        connection.rollbackTransaction((err) => {
          if (err) {
            reject(this.formatError(err, errStack));
          } else {
            resolve(this.formatResults());
          }
        });
      } else if (_.startsWith(this.sql, "SAVE TRANSACTION")) {
        connection.commitTransaction((err) => {
          if (err) {
            reject(this.formatError(err, errStack));
          } else {
            connection.beginTransaction((err2) => {
              if (err2) {
                reject(this.formatError(err2, errStack));
              } else {
                resolve(this.formatResults());
              }
            });
          }
        }, this.options.transaction.name);
      } else {
        const params = [];
        if (parameters) {
          _.forOwn(parameters, (value, key) => {
            const param = this.getSQLTypeFromJsType(value, key);
            params.push(param);
          });
        }
        const SQL = this.sql.toUpperCase();
        let newSql = this.sql;
        if ((this.isSelectQuery() || _.startsWith(SQL, "SELECT ")) && SQL.indexOf(" FROM ", 8) === -1) {
          if (this.sql.charAt(this.sql.length - 1) === ";") {
            newSql = this.sql.slice(0, this.sql.length - 1);
          }
          newSql += " FROM SYSIBM.SYSDUMMY1;";
        }
        connection.prepare(newSql, (err, stmt) => {
          if (err) {
            reject(this.formatError(err, errStack));
          }
          stmt.execute(params, (err2, result, outparams) => {
            debug(`executed(${this.connection.uuid || "default"}):${newSql} ${parameters ? JSON.stringify(parameters) : ""}`);
            if (benchmark) {
              this.sequelize.log(`Executed (${this.connection.uuid || "default"}): ${newSql} ${parameters ? JSON.stringify(parameters) : ""}`, Date.now() - queryBegin, this.options);
            }
            if (err2 && err2.message) {
              err2 = this.filterSQLError(err2, this.sql, connection);
              if (err2 === null) {
                stmt.closeSync();
                resolve(this.formatResults([], 0));
              }
            }
            if (err2) {
              err2.sql = sql;
              stmt.closeSync();
              reject(this.formatError(err2, errStack, connection, parameters));
            } else {
              let data = [];
              let metadata = [];
              let affectedRows = 0;
              if (typeof result === "object") {
                if (_.startsWith(this.sql, "DELETE FROM ")) {
                  affectedRows = result.getAffectedRowsSync();
                } else {
                  data = result.fetchAllSync();
                  metadata = result.getColumnMetadataSync();
                }
                result.closeSync();
              }
              stmt.closeSync();
              const datalen = data.length;
              if (datalen > 0) {
                const coltypes = {};
                for (let i = 0; i < metadata.length; i++) {
                  coltypes[metadata[i].SQL_DESC_NAME] = metadata[i].SQL_DESC_TYPE_NAME;
                }
                for (let i = 0; i < datalen; i++) {
                  for (const column in data[i]) {
                    const parse = parserStore.get(coltypes[column]);
                    const value = data[i][column];
                    if (value !== null) {
                      if (parse) {
                        data[i][column] = parse(value);
                      } else if (coltypes[column] === "TIMESTAMP") {
                        data[i][column] = new Date(moment.utc(value));
                      } else if (coltypes[column] === "BLOB") {
                        data[i][column] = new Buffer.from(value);
                      } else if (coltypes[column].indexOf("FOR BIT DATA") > 0) {
                        data[i][column] = new Buffer.from(value, "hex");
                      }
                    }
                  }
                }
                if (outparams && outparams.length) {
                  data.unshift(outparams);
                }
                resolve(this.formatResults(data, datalen, metadata, connection));
              } else {
                resolve(this.formatResults(data, affectedRows));
              }
            }
          });
        });
      }
    });
  }
  async run(sql, parameters) {
    return await this._run(this.connection, sql, parameters);
  }
  static formatBindParameters(sql, values, dialect) {
    let bindParam = {};
    const replacementFunc = (match, key, values2) => {
      if (values2[key] !== void 0) {
        bindParam[key] = values2[key];
        return "?";
      }
      return void 0;
    };
    sql = AbstractQuery.formatBindParameters(sql, values, dialect, replacementFunc)[0];
    if (Array.isArray(values) && typeof values[0] === "object") {
      bindParam = values;
    }
    return [sql, bindParam];
  }
  filterSQLError(err, sql, connection) {
    if (err.message.search("SQL0204N") != -1 && _.startsWith(sql, "DROP ")) {
      err = null;
    } else if (err.message.search("SQL0443N") != -1) {
      if (this.isDropSchemaQuery()) {
        connection.querySync("DROP TABLE ERRORSCHEMA.ERRORTABLE;");
        connection.querySync(this.sql);
      }
      err = null;
    } else if (err.message.search("SQL0601N") != -1) {
      const match = err.message.match(/SQL0601N {2}The name of the object to be created is identical to the existing name "(.*)" of type "(.*)"./);
      if (match && match.length > 1 && match[2] === "TABLE") {
        let table;
        const mtarray = match[1].split(".");
        if (mtarray[1]) {
          table = `"${mtarray[0]}"."${mtarray[1]}"`;
        } else {
          table = `"${mtarray[0]}"`;
        }
        if (connection.dropTable !== false) {
          connection.querySync(`DROP TABLE ${table}`);
          err = connection.querySync(sql);
        } else {
          err = null;
        }
      } else {
        err = null;
      }
    } else if (err.message.search("SQL0911N") != -1) {
      if (err.message.search('Reason code "2"') != -1) {
        err = null;
      }
    } else if (err.message.search("SQL0605W") != -1) {
      err = null;
    } else if (err.message.search("SQL0668N") != -1 && _.startsWith(sql, "ALTER TABLE ")) {
      connection.querySync(`CALL SYSPROC.ADMIN_CMD('REORG TABLE ${sql.substring(12).split(" ")[0]}')`);
      err = connection.querySync(sql);
    }
    if (err && err.length === 0) {
      err = null;
    }
    return err;
  }
  formatResults(data, rowCount, metadata, conn) {
    let result = this.instance;
    if (this.isInsertQuery(data, metadata)) {
      this.handleInsertQuery(data, metadata);
      if (!this.instance) {
        if (this.options.plain) {
          const record = data[0];
          result = record[Object.keys(record)[0]];
        } else {
          result = data;
        }
      }
    }
    if (this.isShowTablesQuery()) {
      result = data;
    } else if (this.isDescribeQuery()) {
      result = {};
      for (const _result of data) {
        if (_result.Default) {
          _result.Default = _result.Default.replace("('", "").replace("')", "").replace(/'/g, "");
        }
        result[_result.Name] = {
          type: _result.Type.toUpperCase(),
          allowNull: _result.IsNull === "Y" ? true : false,
          defaultValue: _result.Default,
          primaryKey: _result.KeySeq > 0,
          autoIncrement: _result.IsIdentity === "Y" ? true : false,
          comment: _result.Comment
        };
      }
    } else if (this.isShowIndexesQuery()) {
      result = this.handleShowIndexesQuery(data);
    } else if (this.isSelectQuery()) {
      result = this.handleSelectQuery(data);
    } else if (this.isUpsertQuery()) {
      result = data;
    } else if (this.isDropSchemaQuery()) {
      result = data[0];
      if (conn) {
        const query = "DROP TABLE ERRORSCHEMA.ERRORTABLE";
        conn.querySync(query);
      }
    } else if (this.isCallQuery()) {
      result = data;
    } else if (this.isBulkUpdateQuery()) {
      result = data.length;
    } else if (this.isBulkDeleteQuery()) {
      result = rowCount;
    } else if (this.isVersionQuery()) {
      result = data[0].VERSION;
    } else if (this.isForeignKeysQuery()) {
      result = data;
    } else if (this.isInsertQuery() || this.isUpdateQuery()) {
      result = [result, rowCount];
    } else if (this.isShowConstraintsQuery()) {
      result = this.handleShowConstraintsQuery(data);
    } else if (this.isRawQuery()) {
      result = [data, metadata];
    } else {
      result = data;
    }
    return result;
  }
  handleShowTablesQuery(results) {
    return results.map((resultSet) => {
      return {
        tableName: resultSet.TABLE_NAME,
        schema: resultSet.TABLE_SCHEMA
      };
    });
  }
  handleShowConstraintsQuery(data) {
    return _.remove(data, (constraint) => {
      return !_.startsWith(constraint.constraintName, "SQL");
    });
  }
  formatError(err, errStack, conn, parameters) {
    let match;
    if (!(err && err.message)) {
      err["message"] = "No error message found.";
    }
    match = err.message.match(/SQL0803N {2}One or more values in the INSERT statement, UPDATE statement, or foreign key update caused by a DELETE statement are not valid because the primary key, unique constraint or unique index identified by "(\d)+" constrains table "(.*)\.(.*)" from having duplicate values for the index key./);
    if (match && match.length > 0) {
      let uniqueIndexName = "";
      let uniqueKey = "";
      const fields = {};
      let message = err.message;
      const query = `SELECT INDNAME FROM SYSCAT.INDEXES  WHERE IID = ${match[1]} AND TABSCHEMA = '${match[2]}' AND TABNAME = '${match[3]}'`;
      if (!!conn && match.length > 3) {
        uniqueIndexName = conn.querySync(query);
        uniqueIndexName = uniqueIndexName[0]["INDNAME"];
      }
      if (this.model && !!uniqueIndexName) {
        uniqueKey = this.model.uniqueKeys[uniqueIndexName];
      }
      if (!uniqueKey && this.options.fields) {
        uniqueKey = this.options.fields[match[1] - 1];
      }
      if (uniqueKey) {
        if (this.options.where && this.options.where[uniqueKey.column] !== void 0) {
          fields[uniqueKey.column] = this.options.where[uniqueKey.column];
        } else if (this.options.instance && this.options.instance.dataValues && this.options.instance.dataValues[uniqueKey.column]) {
          fields[uniqueKey.column] = this.options.instance.dataValues[uniqueKey.column];
        } else if (parameters) {
          fields[uniqueKey.column] = parameters["0"];
        }
      }
      if (uniqueKey && !!uniqueKey.msg) {
        message = uniqueKey.msg;
      }
      const errors = [];
      _.forOwn(fields, (value, field) => {
        errors.push(new sequelizeErrors.ValidationErrorItem(this.getUniqueConstraintErrorMessage(field), "unique violation", field, value, this.instance, "not_unique"));
      });
      return new sequelizeErrors.UniqueConstraintError({ message, errors, parent: err, fields, stack: errStack });
    }
    match = err.message.match(/SQL0532N {2}A parent row cannot be deleted because the relationship "(.*)" restricts the deletion/) || err.message.match(/SQL0530N/) || err.message.match(/SQL0531N/);
    if (match && match.length > 0) {
      return new sequelizeErrors.ForeignKeyConstraintError({
        fields: null,
        index: match[1],
        parent: err,
        stack: errStack
      });
    }
    match = err.message.match(/SQL0204N {2}"(.*)" is an undefined name./);
    if (match && match.length > 1) {
      const constraint = match[1];
      let table = err.sql.match(/table "(.+?)"/i);
      table = table ? table[1] : void 0;
      return new sequelizeErrors.UnknownConstraintError({
        message: match[0],
        constraint,
        table,
        parent: err,
        stack: errStack
      });
    }
    return new sequelizeErrors.DatabaseError(err, { stack: errStack });
  }
  isDropSchemaQuery() {
    let result = false;
    if (_.startsWith(this.sql, "CALL SYSPROC.ADMIN_DROP_SCHEMA")) {
      result = true;
    }
    return result;
  }
  isShowOrDescribeQuery() {
    let result = false;
    result = result || this.sql.toLowerCase().startsWith("select c.column_name as 'name', c.data_type as 'type', c.is_nullable as 'isnull'");
    result = result || this.sql.toLowerCase().startsWith("select tablename = t.name, name = ind.name,");
    result = result || this.sql.toLowerCase().startsWith("exec sys.sp_helpindex @objname");
    return result;
  }
  isShowIndexesQuery() {
    let result = false;
    result = result || this.sql.toLowerCase().startsWith("exec sys.sp_helpindex @objname");
    result = result || this.sql.startsWith('SELECT NAME AS "name", TBNAME AS "tableName", UNIQUERULE AS "keyType", COLNAMES, INDEXTYPE AS "type" FROM SYSIBM.SYSINDEXES');
    return result;
  }
  handleShowIndexesQuery(data) {
    let currItem;
    const result = [];
    data.forEach((item) => {
      if (!currItem || currItem.name !== item.Key_name) {
        currItem = {
          primary: item.keyType === "P",
          fields: [],
          name: item.name,
          tableName: item.tableName,
          unique: item.keyType === "U",
          type: item.type
        };
        _.forEach(item.COLNAMES.replace(/\+|-/g, (x) => {
          return ` ${x}`;
        }).split(" "), (column) => {
          let columnName = column.trim();
          if (columnName) {
            columnName = columnName.replace(/\+|-/, "");
            currItem.fields.push({
              attribute: columnName,
              length: void 0,
              order: column.indexOf("-") === -1 ? "ASC" : "DESC",
              collate: void 0
            });
          }
        });
        result.push(currItem);
      }
    });
    return result;
  }
  handleInsertQuery(results, metaData) {
    if (this.instance) {
      const autoIncrementAttribute = this.model.autoIncrementAttribute;
      let id = null;
      let autoIncrementAttributeAlias = null;
      if (Object.prototype.hasOwnProperty.call(this.model.rawAttributes, autoIncrementAttribute) && this.model.rawAttributes[autoIncrementAttribute].field !== void 0)
        autoIncrementAttributeAlias = this.model.rawAttributes[autoIncrementAttribute].field;
      id = id || results && results[0][this.getInsertIdField()];
      id = id || metaData && metaData[this.getInsertIdField()];
      id = id || results && results[0][autoIncrementAttribute];
      id = id || autoIncrementAttributeAlias && results && results[0][autoIncrementAttributeAlias];
      this.instance[autoIncrementAttribute] = id;
    }
  }
}
module.exports = Query;
module.exports.Query = Query;
module.exports.default = Query;
//# sourceMappingURL=query.js.map
"use strict";
const { Pool, TimeoutError } = require("sequelize-pool");
const _ = require("lodash");
const semver = require("semver");
const errors = require("../../errors");
const { logger } = require("../../utils/logger");
const deprecations = require("../../utils/deprecations");
const debug = logger.debugContext("pool");
class ConnectionManager {
  constructor(dialect, sequelize) {
    const config = _.cloneDeep(sequelize.config);
    this.sequelize = sequelize;
    this.config = config;
    this.dialect = dialect;
    this.versionPromise = null;
    this.dialectName = this.sequelize.options.dialect;
    if (config.pool === false) {
      throw new Error("Support for pool:false was removed in v4.0");
    }
    config.pool = _.defaults(config.pool || {}, {
      max: 5,
      min: 0,
      idle: 1e4,
      acquire: 6e4,
      evict: 1e3,
      validate: this._validate.bind(this)
    });
    this.initPools();
  }
  refreshTypeParser(dataTypes) {
    _.each(dataTypes, (dataType) => {
      if (Object.prototype.hasOwnProperty.call(dataType, "parse")) {
        if (dataType.types[this.dialectName]) {
          this._refreshTypeParser(dataType);
        } else {
          throw new Error(`Parse function not supported for type ${dataType.key} in dialect ${this.dialectName}`);
        }
      }
    });
  }
  _loadDialectModule(moduleName) {
    try {
      if (this.sequelize.config.dialectModulePath) {
        return require(this.sequelize.config.dialectModulePath);
      }
      if (this.sequelize.config.dialectModule) {
        return this.sequelize.config.dialectModule;
      }
      return require(moduleName);
    } catch (err) {
      if (err.code === "MODULE_NOT_FOUND") {
        if (this.sequelize.config.dialectModulePath) {
          throw new Error(`Unable to find dialect at ${this.sequelize.config.dialectModulePath}`);
        }
        throw new Error(`Please install ${moduleName} package manually`);
      }
      throw err;
    }
  }
  async _onProcessExit() {
    if (!this.pool) {
      return;
    }
    await this.pool.drain();
    debug("connection drain due to process exit");
    return await this.pool.destroyAllNow();
  }
  async close() {
    this.getConnection = async function getConnection() {
      throw new Error("ConnectionManager.getConnection was called after the connection manager was closed!");
    };
    return await this._onProcessExit();
  }
  initPools() {
    const config = this.config;
    if (!config.replication) {
      this.pool = new Pool({
        name: "sequelize",
        create: () => this._connect(config),
        destroy: async (connection) => {
          const result = await this._disconnect(connection);
          debug("connection destroy");
          return result;
        },
        validate: config.pool.validate,
        max: config.pool.max,
        min: config.pool.min,
        acquireTimeoutMillis: config.pool.acquire,
        idleTimeoutMillis: config.pool.idle,
        reapIntervalMillis: config.pool.evict,
        maxUses: config.pool.maxUses
      });
      debug(`pool created with max/min: ${config.pool.max}/${config.pool.min}, no replication`);
      return;
    }
    if (!Array.isArray(config.replication.read)) {
      config.replication.read = [config.replication.read];
    }
    config.replication.write = _.defaults(config.replication.write, _.omit(config, "replication"));
    config.replication.read = config.replication.read.map((readConfig) => _.defaults(readConfig, _.omit(this.config, "replication")));
    let reads = 0;
    this.pool = {
      release: (client) => {
        if (client.queryType === "read") {
          this.pool.read.release(client);
        } else {
          this.pool.write.release(client);
        }
      },
      acquire: (queryType, useMaster) => {
        useMaster = useMaster === void 0 ? false : useMaster;
        if (queryType === "SELECT" && !useMaster) {
          return this.pool.read.acquire();
        }
        return this.pool.write.acquire();
      },
      destroy: (connection) => {
        this.pool[connection.queryType].destroy(connection);
        debug("connection destroy");
      },
      destroyAllNow: async () => {
        await Promise.all([
          this.pool.read.destroyAllNow(),
          this.pool.write.destroyAllNow()
        ]);
        debug("all connections destroyed");
      },
      drain: async () => Promise.all([
        this.pool.write.drain(),
        this.pool.read.drain()
      ]),
      read: new Pool({
        name: "sequelize:read",
        create: async () => {
          const nextRead = reads++ % config.replication.read.length;
          const connection = await this._connect(config.replication.read[nextRead]);
          connection.queryType = "read";
          return connection;
        },
        destroy: (connection) => this._disconnect(connection),
        validate: config.pool.validate,
        max: config.pool.max,
        min: config.pool.min,
        acquireTimeoutMillis: config.pool.acquire,
        idleTimeoutMillis: config.pool.idle,
        reapIntervalMillis: config.pool.evict,
        maxUses: config.pool.maxUses
      }),
      write: new Pool({
        name: "sequelize:write",
        create: async () => {
          const connection = await this._connect(config.replication.write);
          connection.queryType = "write";
          return connection;
        },
        destroy: (connection) => this._disconnect(connection),
        validate: config.pool.validate,
        max: config.pool.max,
        min: config.pool.min,
        acquireTimeoutMillis: config.pool.acquire,
        idleTimeoutMillis: config.pool.idle,
        reapIntervalMillis: config.pool.evict,
        maxUses: config.pool.maxUses
      })
    };
    debug(`pool created with max/min: ${config.pool.max}/${config.pool.min}, with replication`);
  }
  async getConnection(options) {
    options = options || {};
    if (this.sequelize.options.databaseVersion === 0) {
      if (!this.versionPromise) {
        this.versionPromise = (async () => {
          try {
            const connection = await this._connect(this.config.replication.write || this.config);
            const _options = {};
            _options.transaction = { connection };
            _options.logging = () => {
            };
            _options.logging.__testLoggingFn = true;
            if (this.sequelize.options.databaseVersion === 0) {
              const version = await this.sequelize.databaseVersion(_options);
              const parsedVersion = _.get(semver.coerce(version), "version") || version;
              this.sequelize.options.databaseVersion = semver.valid(parsedVersion) ? parsedVersion : this.dialect.defaultVersion;
            }
            if (semver.lt(this.sequelize.options.databaseVersion, this.dialect.defaultVersion)) {
              deprecations.unsupportedEngine();
              debug(`Unsupported database engine version ${this.sequelize.options.databaseVersion}`);
            }
            this.versionPromise = null;
            return await this._disconnect(connection);
          } catch (err) {
            this.versionPromise = null;
            throw err;
          }
        })();
      }
      await this.versionPromise;
    }
    let result;
    try {
      result = await this.pool.acquire(options.type, options.useMaster);
    } catch (error) {
      if (error instanceof TimeoutError)
        throw new errors.ConnectionAcquireTimeoutError(error);
      throw error;
    }
    debug("connection acquired");
    return result;
  }
  releaseConnection(connection) {
    this.pool.release(connection);
    debug("connection released");
  }
  async destroyConnection(connection) {
    await this.pool.destroy(connection);
    debug(`connection ${connection.uuid} destroyed`);
  }
  async _connect(config) {
    await this.sequelize.runHooks("beforeConnect", config);
    const connection = await this.dialect.connectionManager.connect(config);
    await this.sequelize.runHooks("afterConnect", connection, config);
    return connection;
  }
  async _disconnect(connection) {
    await this.sequelize.runHooks("beforeDisconnect", connection);
    await this.dialect.connectionManager.disconnect(connection);
    return this.sequelize.runHooks("afterDisconnect", connection);
  }
  _validate(connection) {
    if (!this.dialect.connectionManager.validate) {
      return true;
    }
    return this.dialect.connectionManager.validate(connection);
  }
}
module.exports = ConnectionManager;
module.exports.ConnectionManager = ConnectionManager;
module.exports.default = ConnectionManager;
//# sourceMappingURL=connection-manager.js.map
"use strict";
class AbstractDialect {
}
AbstractDialect.prototype.supports = {
  "DEFAULT": true,
  "DEFAULT VALUES": false,
  "VALUES ()": false,
  "LIMIT ON UPDATE": false,
  "ON DUPLICATE KEY": true,
  "ORDER NULLS": false,
  "UNION": true,
  "UNION ALL": true,
  "RIGHT JOIN": true,
  returnValues: false,
  autoIncrement: {
    identityInsert: false,
    defaultValue: true,
    update: true
  },
  bulkDefault: false,
  schemas: false,
  transactions: true,
  settingIsolationLevelDuringTransaction: true,
  transactionOptions: {
    type: false
  },
  migrations: true,
  upserts: true,
  inserts: {
    ignoreDuplicates: "",
    updateOnDuplicate: false,
    onConflictDoNothing: "",
    conflictFields: false
  },
  constraints: {
    restrict: true,
    addConstraint: true,
    dropConstraint: true,
    unique: true,
    default: false,
    check: true,
    foreignKey: true,
    primaryKey: true
  },
  index: {
    collate: true,
    length: false,
    parser: false,
    concurrently: false,
    type: false,
    using: true,
    functionBased: false,
    operator: false
  },
  groupedLimit: true,
  indexViaAlter: false,
  JSON: false,
  deferrableConstraints: false
};
module.exports = AbstractDialect;
module.exports.AbstractDialect = AbstractDialect;
module.exports.default = AbstractDialect;
//# sourceMappingURL=index.js.map
"use strict";
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
const util = require("util");
const _ = require("lodash");
const uuidv4 = require("uuid").v4;
const Utils = require("../../utils");
const deprecations = require("../../utils/deprecations");
const SqlString = require("../../sql-string");
const DataTypes = require("../../data-types");
const Model = require("../../model");
const Association = require("../../associations/base");
const BelongsTo = require("../../associations/belongs-to");
const BelongsToMany = require("../../associations/belongs-to-many");
const HasMany = require("../../associations/has-many");
const Op = require("../../operators");
const sequelizeError = require("../../errors");
const IndexHints = require("../../index-hints");
class QueryGenerator {
  constructor(options) {
    if (!options.sequelize)
      throw new Error("QueryGenerator initialized without options.sequelize");
    if (!options._dialect)
      throw new Error("QueryGenerator initialized without options._dialect");
    this.sequelize = options.sequelize;
    this.options = options.sequelize.options;
    this.dialect = options._dialect.name;
    this._dialect = options._dialect;
    this._initQuoteIdentifier();
  }
  extractTableDetails(tableName, options) {
    options = options || {};
    tableName = tableName || {};
    return {
      schema: tableName.schema || options.schema || this.options.schema || "public",
      tableName: _.isPlainObject(tableName) ? tableName.tableName : tableName,
      delimiter: tableName.delimiter || options.delimiter || "."
    };
  }
  addSchema(param) {
    if (!param._schema)
      return param.tableName || param;
    const self = this;
    return {
      tableName: param.tableName || param,
      table: param.tableName || param,
      name: param.name || param,
      schema: param._schema,
      delimiter: param._schemaDelimiter || ".",
      toString() {
        return self.quoteTable(this);
      }
    };
  }
  dropSchema(tableName, options) {
    return this.dropTableQuery(tableName, options);
  }
  describeTableQuery(tableName, schema, schemaDelimiter) {
    const table = this.quoteTable(this.addSchema({
      tableName,
      _schema: schema,
      _schemaDelimiter: schemaDelimiter
    }));
    return `DESCRIBE ${table};`;
  }
  dropTableQuery(tableName) {
    return `DROP TABLE IF EXISTS ${this.quoteTable(tableName)};`;
  }
  renameTableQuery(before, after) {
    return `ALTER TABLE ${this.quoteTable(before)} RENAME TO ${this.quoteTable(after)};`;
  }
  insertQuery(table, valueHash, modelAttributes, options) {
    options = options || {};
    _.defaults(options, this.options);
    const modelAttributeMap = {};
    const bind = [];
    const fields = [];
    const returningModelAttributes = [];
    const values = [];
    const quotedTable = this.quoteTable(table);
    const bindParam = options.bindParam === void 0 ? this.bindParam(bind) : options.bindParam;
    let query;
    let valueQuery = "";
    let emptyQuery = "";
    let outputFragment = "";
    let returningFragment = "";
    let identityWrapperRequired = false;
    let tmpTable = "";
    if (modelAttributes) {
      _.each(modelAttributes, (attribute, key) => {
        modelAttributeMap[key] = attribute;
        if (attribute.field) {
          modelAttributeMap[attribute.field] = attribute;
        }
      });
    }
    if (this._dialect.supports["DEFAULT VALUES"]) {
      emptyQuery += " DEFAULT VALUES";
    } else if (this._dialect.supports["VALUES ()"]) {
      emptyQuery += " VALUES ()";
    }
    if (this._dialect.supports.returnValues && options.returning) {
      const returnValues = this.generateReturnValues(modelAttributes, options);
      returningModelAttributes.push(...returnValues.returnFields);
      returningFragment = returnValues.returningFragment;
      tmpTable = returnValues.tmpTable || "";
      outputFragment = returnValues.outputFragment || "";
    }
    if (_.get(this, ["sequelize", "options", "dialectOptions", "prependSearchPath"]) || options.searchPath) {
      options.bindParam = false;
    }
    if (this._dialect.supports.EXCEPTION && options.exception) {
      options.bindParam = false;
    }
    valueHash = Utils.removeNullValuesFromHash(valueHash, this.options.omitNull);
    for (const key in valueHash) {
      if (Object.prototype.hasOwnProperty.call(valueHash, key)) {
        const value = valueHash[key];
        fields.push(this.quoteIdentifier(key));
        if (modelAttributeMap && modelAttributeMap[key] && modelAttributeMap[key].autoIncrement === true && value == null) {
          if (!this._dialect.supports.autoIncrement.defaultValue) {
            fields.splice(-1, 1);
          } else if (this._dialect.supports.DEFAULT) {
            values.push("DEFAULT");
          } else {
            values.push(this.escape(null));
          }
        } else {
          if (modelAttributeMap && modelAttributeMap[key] && modelAttributeMap[key].autoIncrement === true) {
            identityWrapperRequired = true;
          }
          if (value instanceof Utils.SequelizeMethod || options.bindParam === false) {
            values.push(this.escape(value, modelAttributeMap && modelAttributeMap[key] || void 0, { context: "INSERT" }));
          } else {
            values.push(this.format(value, modelAttributeMap && modelAttributeMap[key] || void 0, { context: "INSERT" }, bindParam));
          }
        }
      }
    }
    let onDuplicateKeyUpdate = "";
    if (this._dialect.supports.inserts.updateOnDuplicate && options.updateOnDuplicate) {
      if (this._dialect.supports.inserts.updateOnDuplicate == " ON CONFLICT DO UPDATE SET") {
        const conflictKeys = options.upsertKeys.map((attr) => this.quoteIdentifier(attr));
        const updateKeys = options.updateOnDuplicate.map((attr) => `${this.quoteIdentifier(attr)}=EXCLUDED.${this.quoteIdentifier(attr)}`);
        onDuplicateKeyUpdate = ` ON CONFLICT (${conflictKeys.join(",")})`;
        onDuplicateKeyUpdate += _.isEmpty(updateKeys) ? " DO NOTHING " : ` DO UPDATE SET ${updateKeys.join(",")}`;
      } else {
        const valueKeys = options.updateOnDuplicate.map((attr) => `${this.quoteIdentifier(attr)}=VALUES(${this.quoteIdentifier(attr)})`);
        if (_.isEmpty(valueKeys) && options.upsertKeys) {
          valueKeys.push(...options.upsertKeys.map((attr) => `${this.quoteIdentifier(attr)}=${this.quoteIdentifier(attr)}`));
        }
        if (_.isEmpty(valueKeys)) {
          throw new Error("No update values found for ON DUPLICATE KEY UPDATE clause, and no identifier fields could be found to use instead.");
        }
        onDuplicateKeyUpdate += `${this._dialect.supports.inserts.updateOnDuplicate} ${valueKeys.join(",")}`;
      }
    }
    const replacements = {
      ignoreDuplicates: options.ignoreDuplicates ? this._dialect.supports.inserts.ignoreDuplicates : "",
      onConflictDoNothing: options.ignoreDuplicates ? this._dialect.supports.inserts.onConflictDoNothing : "",
      attributes: fields.join(","),
      output: outputFragment,
      values: values.join(","),
      tmpTable
    };
    valueQuery = `${tmpTable}INSERT${replacements.ignoreDuplicates} INTO ${quotedTable} (${replacements.attributes})${replacements.output} VALUES (${replacements.values})${onDuplicateKeyUpdate}${replacements.onConflictDoNothing}${valueQuery}`;
    emptyQuery = `${tmpTable}INSERT${replacements.ignoreDuplicates} INTO ${quotedTable}${replacements.output}${onDuplicateKeyUpdate}${replacements.onConflictDoNothing}${emptyQuery}`;
    if (this._dialect.supports.EXCEPTION && options.exception) {
      const dropFunction = "DROP FUNCTION IF EXISTS pg_temp.testfunc()";
      if (returningModelAttributes.length === 0) {
        returningModelAttributes.push("*");
      }
      const delimiter = `$func_${uuidv4().replace(/-/g, "")}$`;
      const selectQuery = `SELECT (testfunc.response).${returningModelAttributes.join(", (testfunc.response).")}, testfunc.sequelize_caught_exception FROM pg_temp.testfunc();`;
      options.exception = "WHEN unique_violation THEN GET STACKED DIAGNOSTICS sequelize_caught_exception = PG_EXCEPTION_DETAIL;";
      valueQuery = `CREATE OR REPLACE FUNCTION pg_temp.testfunc(OUT response ${quotedTable}, OUT sequelize_caught_exception text) RETURNS RECORD AS ${delimiter} BEGIN ${valueQuery} RETURNING * INTO response; EXCEPTION ${options.exception} END ${delimiter} LANGUAGE plpgsql; ${selectQuery} ${dropFunction}`;
    } else {
      valueQuery += returningFragment;
      emptyQuery += returningFragment;
    }
    query = `${replacements.attributes.length ? valueQuery : emptyQuery};`;
    if (this._dialect.supports.finalTable) {
      query = `SELECT * FROM FINAL TABLE(${replacements.attributes.length ? valueQuery : emptyQuery});`;
    }
    if (identityWrapperRequired && this._dialect.supports.autoIncrement.identityInsert) {
      query = `SET IDENTITY_INSERT ${quotedTable} ON; ${query} SET IDENTITY_INSERT ${quotedTable} OFF;`;
    }
    const result = { query };
    if (options.bindParam !== false) {
      result.bind = bind;
    }
    return result;
  }
  bulkInsertQuery(tableName, fieldValueHashes, options, fieldMappedAttributes) {
    options = options || {};
    fieldMappedAttributes = fieldMappedAttributes || {};
    const tuples = [];
    const serials = {};
    const allAttributes = [];
    let onDuplicateKeyUpdate = "";
    for (const fieldValueHash of fieldValueHashes) {
      _.forOwn(fieldValueHash, (value, key) => {
        if (!allAttributes.includes(key)) {
          allAttributes.push(key);
        }
        if (fieldMappedAttributes[key] && fieldMappedAttributes[key].autoIncrement === true) {
          serials[key] = true;
        }
      });
    }
    for (const fieldValueHash of fieldValueHashes) {
      const values = allAttributes.map((key) => {
        if (this._dialect.supports.bulkDefault && serials[key] === true) {
          return fieldValueHash[key] != null ? fieldValueHash[key] : "DEFAULT";
        }
        return this.escape(fieldValueHash[key], fieldMappedAttributes[key], { context: "INSERT" });
      });
      tuples.push(`(${values.join(",")})`);
    }
    if (this._dialect.supports.inserts.updateOnDuplicate && options.updateOnDuplicate) {
      if (this._dialect.supports.inserts.updateOnDuplicate == " ON CONFLICT DO UPDATE SET") {
        const conflictKeys = options.upsertKeys.map((attr) => this.quoteIdentifier(attr));
        const updateKeys = options.updateOnDuplicate.map((attr) => `${this.quoteIdentifier(attr)}=EXCLUDED.${this.quoteIdentifier(attr)}`);
        onDuplicateKeyUpdate = ` ON CONFLICT (${conflictKeys.join(",")}) DO UPDATE SET ${updateKeys.join(",")}`;
      } else {
        const valueKeys = options.updateOnDuplicate.map((attr) => `${this.quoteIdentifier(attr)}=VALUES(${this.quoteIdentifier(attr)})`);
        onDuplicateKeyUpdate = `${this._dialect.supports.inserts.updateOnDuplicate} ${valueKeys.join(",")}`;
      }
    }
    const ignoreDuplicates = options.ignoreDuplicates ? this._dialect.supports.inserts.ignoreDuplicates : "";
    const attributes = allAttributes.map((attr) => this.quoteIdentifier(attr)).join(",");
    const onConflictDoNothing = options.ignoreDuplicates ? this._dialect.supports.inserts.onConflictDoNothing : "";
    let returning = "";
    if (this._dialect.supports.returnValues && options.returning) {
      const returnValues = this.generateReturnValues(fieldMappedAttributes, options);
      returning += returnValues.returningFragment;
    }
    return Utils.joinSQLFragments([
      "INSERT",
      ignoreDuplicates,
      "INTO",
      this.quoteTable(tableName),
      `(${attributes})`,
      "VALUES",
      tuples.join(","),
      onDuplicateKeyUpdate,
      onConflictDoNothing,
      returning,
      ";"
    ]);
  }
  updateQuery(tableName, attrValueHash, where, options, attributes) {
    options = options || {};
    _.defaults(options, this.options);
    attrValueHash = Utils.removeNullValuesFromHash(attrValueHash, options.omitNull, options);
    const values = [];
    const bind = [];
    const modelAttributeMap = {};
    let outputFragment = "";
    let tmpTable = "";
    let suffix = "";
    if (_.get(this, ["sequelize", "options", "dialectOptions", "prependSearchPath"]) || options.searchPath) {
      options.bindParam = false;
    }
    const bindParam = options.bindParam === void 0 ? this.bindParam(bind) : options.bindParam;
    if (this._dialect.supports["LIMIT ON UPDATE"] && options.limit) {
      if (this.dialect !== "mssql" && this.dialect !== "db2") {
        suffix = ` LIMIT ${this.escape(options.limit)} `;
      }
    }
    if (this._dialect.supports.returnValues && options.returning) {
      const returnValues = this.generateReturnValues(attributes, options);
      suffix += returnValues.returningFragment;
      tmpTable = returnValues.tmpTable || "";
      outputFragment = returnValues.outputFragment || "";
      if (!this._dialect.supports.returnValues.output && options.returning) {
        options.mapToModel = true;
      }
    }
    if (attributes) {
      _.each(attributes, (attribute, key) => {
        modelAttributeMap[key] = attribute;
        if (attribute.field) {
          modelAttributeMap[attribute.field] = attribute;
        }
      });
    }
    for (const key in attrValueHash) {
      if (modelAttributeMap && modelAttributeMap[key] && modelAttributeMap[key].autoIncrement === true && !this._dialect.supports.autoIncrement.update) {
        continue;
      }
      const value = attrValueHash[key];
      if (value instanceof Utils.SequelizeMethod || options.bindParam === false) {
        values.push(`${this.quoteIdentifier(key)}=${this.escape(value, modelAttributeMap && modelAttributeMap[key] || void 0, { context: "UPDATE" })}`);
      } else {
        values.push(`${this.quoteIdentifier(key)}=${this.format(value, modelAttributeMap && modelAttributeMap[key] || void 0, { context: "UPDATE" }, bindParam)}`);
      }
    }
    const whereOptions = __spreadProps(__spreadValues({}, options), { bindParam });
    if (values.length === 0) {
      return "";
    }
    const query = `${tmpTable}UPDATE ${this.quoteTable(tableName)} SET ${values.join(",")}${outputFragment} ${this.whereQuery(where, whereOptions)}${suffix}`.trim();
    const result = { query };
    if (options.bindParam !== false) {
      result.bind = bind;
    }
    return result;
  }
  arithmeticQuery(operator, tableName, where, incrementAmountsByField, extraAttributesToBeUpdated, options) {
    options = options || {};
    _.defaults(options, { returning: true });
    extraAttributesToBeUpdated = Utils.removeNullValuesFromHash(extraAttributesToBeUpdated, this.options.omitNull);
    let outputFragment = "";
    let returningFragment = "";
    if (this._dialect.supports.returnValues && options.returning) {
      const returnValues = this.generateReturnValues(null, options);
      outputFragment = returnValues.outputFragment;
      returningFragment = returnValues.returningFragment;
    }
    const updateSetSqlFragments = [];
    for (const field in incrementAmountsByField) {
      const incrementAmount = incrementAmountsByField[field];
      const quotedField = this.quoteIdentifier(field);
      const escapedAmount = this.escape(incrementAmount);
      updateSetSqlFragments.push(`${quotedField}=${quotedField}${operator} ${escapedAmount}`);
    }
    for (const field in extraAttributesToBeUpdated) {
      const newValue = extraAttributesToBeUpdated[field];
      const quotedField = this.quoteIdentifier(field);
      const escapedValue = this.escape(newValue);
      updateSetSqlFragments.push(`${quotedField}=${escapedValue}`);
    }
    return Utils.joinSQLFragments([
      "UPDATE",
      this.quoteTable(tableName),
      "SET",
      updateSetSqlFragments.join(","),
      outputFragment,
      this.whereQuery(where),
      returningFragment
    ]);
  }
  addIndexQuery(tableName, attributes, options, rawTablename) {
    options = options || {};
    if (!Array.isArray(attributes)) {
      options = attributes;
      attributes = void 0;
    } else {
      options.fields = attributes;
    }
    options.prefix = options.prefix || rawTablename || tableName;
    if (options.prefix && typeof options.prefix === "string") {
      options.prefix = options.prefix.replace(/\./g, "_");
      options.prefix = options.prefix.replace(/("|')/g, "");
    }
    const fieldsSql = options.fields.map((field) => {
      if (field instanceof Utils.SequelizeMethod) {
        return this.handleSequelizeMethod(field);
      }
      if (typeof field === "string") {
        field = {
          name: field
        };
      }
      let result = "";
      if (field.attribute) {
        field.name = field.attribute;
      }
      if (!field.name) {
        throw new Error(`The following index field has no name: ${util.inspect(field)}`);
      }
      result += this.quoteIdentifier(field.name);
      if (this._dialect.supports.index.collate && field.collate) {
        result += ` COLLATE ${this.quoteIdentifier(field.collate)}`;
      }
      if (this._dialect.supports.index.operator) {
        const operator = field.operator || options.operator;
        if (operator) {
          result += ` ${operator}`;
        }
      }
      if (this._dialect.supports.index.length && field.length) {
        result += `(${field.length})`;
      }
      if (field.order) {
        result += ` ${field.order}`;
      }
      return result;
    });
    if (!options.name) {
      options = Utils.nameIndex(options, options.prefix);
    }
    options = Model._conformIndex(options);
    if (!this._dialect.supports.index.type) {
      delete options.type;
    }
    if (options.where) {
      options.where = this.whereQuery(options.where);
    }
    if (typeof tableName === "string") {
      tableName = this.quoteIdentifiers(tableName);
    } else {
      tableName = this.quoteTable(tableName);
    }
    const concurrently = this._dialect.supports.index.concurrently && options.concurrently ? "CONCURRENTLY" : void 0;
    let ind;
    if (this._dialect.supports.indexViaAlter) {
      ind = [
        "ALTER TABLE",
        tableName,
        concurrently,
        "ADD"
      ];
    } else {
      ind = ["CREATE"];
    }
    ind = ind.concat(options.unique ? "UNIQUE" : "", options.type, "INDEX", !this._dialect.supports.indexViaAlter ? concurrently : void 0, this.quoteIdentifiers(options.name), this._dialect.supports.index.using === 1 && options.using ? `USING ${options.using}` : "", !this._dialect.supports.indexViaAlter ? `ON ${tableName}` : void 0, this._dialect.supports.index.using === 2 && options.using ? `USING ${options.using}` : "", `(${fieldsSql.join(", ")})`, this._dialect.supports.index.parser && options.parser ? `WITH PARSER ${options.parser}` : void 0, this._dialect.supports.index.where && options.where ? options.where : void 0);
    return _.compact(ind).join(" ");
  }
  addConstraintQuery(tableName, options) {
    if (typeof tableName === "string") {
      tableName = this.quoteIdentifiers(tableName);
    } else {
      tableName = this.quoteTable(tableName);
    }
    return Utils.joinSQLFragments([
      "ALTER TABLE",
      tableName,
      "ADD",
      this.getConstraintSnippet(tableName, options || {}),
      ";"
    ]);
  }
  getConstraintSnippet(tableName, options) {
    let constraintSnippet, constraintName;
    const fieldsSql = options.fields.map((field) => {
      if (typeof field === "string") {
        return this.quoteIdentifier(field);
      }
      if (field instanceof Utils.SequelizeMethod) {
        return this.handleSequelizeMethod(field);
      }
      if (field.attribute) {
        field.name = field.attribute;
      }
      if (!field.name) {
        throw new Error(`The following index field has no name: ${field}`);
      }
      return this.quoteIdentifier(field.name);
    });
    const fieldsSqlQuotedString = fieldsSql.join(", ");
    const fieldsSqlString = fieldsSql.join("_");
    switch (options.type.toUpperCase()) {
      case "UNIQUE":
        constraintName = this.quoteIdentifier(options.name || `${tableName}_${fieldsSqlString}_uk`);
        constraintSnippet = `CONSTRAINT ${constraintName} UNIQUE (${fieldsSqlQuotedString})`;
        break;
      case "CHECK":
        options.where = this.whereItemsQuery(options.where);
        constraintName = this.quoteIdentifier(options.name || `${tableName}_${fieldsSqlString}_ck`);
        constraintSnippet = `CONSTRAINT ${constraintName} CHECK (${options.where})`;
        break;
      case "DEFAULT":
        if (options.defaultValue === void 0) {
          throw new Error("Default value must be specified for DEFAULT CONSTRAINT");
        }
        if (this._dialect.name !== "mssql") {
          throw new Error("Default constraints are supported only for MSSQL dialect.");
        }
        constraintName = this.quoteIdentifier(options.name || `${tableName}_${fieldsSqlString}_df`);
        constraintSnippet = `CONSTRAINT ${constraintName} DEFAULT (${this.escape(options.defaultValue)}) FOR ${fieldsSql[0]}`;
        break;
      case "PRIMARY KEY":
        constraintName = this.quoteIdentifier(options.name || `${tableName}_${fieldsSqlString}_pk`);
        constraintSnippet = `CONSTRAINT ${constraintName} PRIMARY KEY (${fieldsSqlQuotedString})`;
        break;
      case "FOREIGN KEY":
        const references = options.references;
        if (!references || !references.table || !(references.field || references.fields)) {
          throw new Error("references object with table and field must be specified");
        }
        constraintName = this.quoteIdentifier(options.name || `${tableName}_${fieldsSqlString}_${references.table}_fk`);
        const quotedReferences = typeof references.field !== "undefined" ? this.quoteIdentifier(references.field) : references.fields.map((f) => this.quoteIdentifier(f)).join(", ");
        const referencesSnippet = `${this.quoteTable(references.table)} (${quotedReferences})`;
        constraintSnippet = `CONSTRAINT ${constraintName} `;
        constraintSnippet += `FOREIGN KEY (${fieldsSqlQuotedString}) REFERENCES ${referencesSnippet}`;
        if (options.onUpdate) {
          constraintSnippet += ` ON UPDATE ${options.onUpdate.toUpperCase()}`;
        }
        if (options.onDelete) {
          constraintSnippet += ` ON DELETE ${options.onDelete.toUpperCase()}`;
        }
        break;
      default:
        throw new Error(`${options.type} is invalid.`);
    }
    if (options.deferrable && ["UNIQUE", "PRIMARY KEY", "FOREIGN KEY"].includes(options.type.toUpperCase())) {
      constraintSnippet += ` ${this.deferConstraintsQuery(options)}`;
    }
    return constraintSnippet;
  }
  removeConstraintQuery(tableName, constraintName) {
    if (typeof tableName === "string") {
      tableName = this.quoteIdentifiers(tableName);
    } else {
      tableName = this.quoteTable(tableName);
    }
    return Utils.joinSQLFragments([
      "ALTER TABLE",
      tableName,
      "DROP CONSTRAINT",
      this.quoteIdentifiers(constraintName)
    ]);
  }
  quote(collection, parent, connector) {
    const validOrderOptions = [
      "ASC",
      "DESC",
      "ASC NULLS LAST",
      "DESC NULLS LAST",
      "ASC NULLS FIRST",
      "DESC NULLS FIRST",
      "NULLS FIRST",
      "NULLS LAST"
    ];
    connector = connector || ".";
    if (typeof collection === "string") {
      return this.quoteIdentifiers(collection);
    }
    if (Array.isArray(collection)) {
      collection.forEach((item2, index) => {
        const previous = collection[index - 1];
        let previousAssociation;
        let previousModel;
        if (!previous && parent !== void 0) {
          previousModel = parent;
        } else if (previous && previous instanceof Association) {
          previousAssociation = previous;
          previousModel = previous.target;
        }
        if (previousModel && previousModel.prototype instanceof Model) {
          let model;
          let as;
          if (typeof item2 === "function" && item2.prototype instanceof Model) {
            model = item2;
          } else if (_.isPlainObject(item2) && item2.model && item2.model.prototype instanceof Model) {
            model = item2.model;
            as = item2.as;
          }
          if (model) {
            if (!as && previousAssociation && previousAssociation instanceof Association && previousAssociation.through && previousAssociation.through.model === model) {
              item2 = new Association(previousModel, model, {
                as: model.name
              });
            } else {
              item2 = previousModel.getAssociationForAlias(model, as);
              if (!item2) {
                item2 = previousModel.getAssociationForAlias(model, model.name);
              }
            }
            if (!(item2 instanceof Association)) {
              throw new Error(util.format("Unable to find a valid association for model, '%s'", model.name));
            }
          }
        }
        if (typeof item2 === "string") {
          const orderIndex = validOrderOptions.indexOf(item2.toUpperCase());
          if (index > 0 && orderIndex !== -1) {
            item2 = this.sequelize.literal(` ${validOrderOptions[orderIndex]}`);
          } else if (previousModel && previousModel.prototype instanceof Model) {
            if (previousModel.associations !== void 0 && previousModel.associations[item2]) {
              item2 = previousModel.associations[item2];
            } else if (previousModel.rawAttributes !== void 0 && previousModel.rawAttributes[item2] && item2 !== previousModel.rawAttributes[item2].field) {
              item2 = previousModel.rawAttributes[item2].field;
            } else if (item2.includes(".") && previousModel.rawAttributes !== void 0) {
              const itemSplit = item2.split(".");
              if (previousModel.rawAttributes[itemSplit[0]].type instanceof DataTypes.JSON) {
                const identifier = this.quoteIdentifiers(`${previousModel.name}.${previousModel.rawAttributes[itemSplit[0]].field}`);
                const path = itemSplit.slice(1);
                item2 = this.jsonPathExtractionQuery(identifier, path);
                item2 = this.sequelize.literal(item2);
              }
            }
          }
        }
        collection[index] = item2;
      }, this);
      const collectionLength = collection.length;
      const tableNames = [];
      let item;
      let i = 0;
      for (i = 0; i < collectionLength - 1; i++) {
        item = collection[i];
        if (typeof item === "string" || item._modelAttribute || item instanceof Utils.SequelizeMethod) {
          break;
        } else if (item instanceof Association) {
          tableNames[i] = item.as;
        }
      }
      let sql = "";
      if (i > 0) {
        sql += `${this.quoteIdentifier(tableNames.join(connector))}.`;
      } else if (typeof collection[0] === "string" && parent) {
        sql += `${this.quoteIdentifier(parent.name)}.`;
      }
      collection.slice(i).forEach((collectionItem) => {
        sql += this.quote(collectionItem, parent, connector);
      }, this);
      return sql;
    }
    if (collection._modelAttribute) {
      return `${this.quoteTable(collection.Model.name)}.${this.quoteIdentifier(collection.fieldName)}`;
    }
    if (collection instanceof Utils.SequelizeMethod) {
      return this.handleSequelizeMethod(collection);
    }
    if (_.isPlainObject(collection) && collection.raw) {
      throw new Error('The `{raw: "..."}` syntax is no longer supported.  Use `sequelize.literal` instead.');
    }
    throw new Error(`Unknown structure passed to order / group: ${util.inspect(collection)}`);
  }
  _initQuoteIdentifier() {
    this._quoteIdentifier = this.quoteIdentifier;
    this.quoteIdentifier = function(identifier, force) {
      if (identifier === "*")
        return identifier;
      return this._quoteIdentifier(identifier, force);
    };
  }
  quoteIdentifier(identifier, force) {
    throw new Error(`quoteIdentifier for Dialect "${this.dialect}" is not implemented`);
  }
  quoteIdentifiers(identifiers) {
    if (identifiers.includes(".")) {
      identifiers = identifiers.split(".");
      const head = identifiers.slice(0, identifiers.length - 1).join("->");
      const tail = identifiers[identifiers.length - 1];
      return `${this.quoteIdentifier(head)}.${this.quoteIdentifier(tail)}`;
    }
    return this.quoteIdentifier(identifiers);
  }
  quoteAttribute(attribute, model) {
    if (model && attribute in model.rawAttributes) {
      return this.quoteIdentifier(attribute);
    }
    return this.quoteIdentifiers(attribute);
  }
  quoteTable(param, alias) {
    let table = "";
    if (alias === true) {
      alias = param.as || param.name || param;
    }
    if (_.isObject(param)) {
      if (this._dialect.supports.schemas) {
        if (param.schema) {
          table += `${this.quoteIdentifier(param.schema)}.`;
        }
        table += this.quoteIdentifier(param.tableName);
      } else {
        if (param.schema) {
          table += param.schema + (param.delimiter || ".");
        }
        table += param.tableName;
        table = this.quoteIdentifier(table);
      }
    } else {
      table = this.quoteIdentifier(param);
    }
    if (alias) {
      table += ` AS ${this.quoteIdentifier(alias)}`;
    }
    return table;
  }
  escape(value, field, options) {
    options = options || {};
    if (value !== null && value !== void 0) {
      if (value instanceof Utils.SequelizeMethod) {
        return this.handleSequelizeMethod(value);
      }
      if (field && field.type) {
        this.validate(value, field, options);
        if (field.type.stringify) {
          const simpleEscape = (escVal) => SqlString.escape(escVal, this.options.timezone, this.dialect);
          value = field.type.stringify(value, { escape: simpleEscape, field, timezone: this.options.timezone, operation: options.operation });
          if (field.type.escape === false) {
            return value;
          }
        }
      }
    }
    return SqlString.escape(value, this.options.timezone, this.dialect);
  }
  bindParam(bind) {
    return (value) => {
      bind.push(value);
      return `$${bind.length}`;
    };
  }
  format(value, field, options, bindParam) {
    options = options || {};
    if (value !== null && value !== void 0) {
      if (value instanceof Utils.SequelizeMethod) {
        throw new Error("Cannot pass SequelizeMethod as a bind parameter - use escape instead");
      }
      if (field && field.type) {
        this.validate(value, field, options);
        if (field.type.bindParam) {
          return field.type.bindParam(value, { escape: _.identity, field, timezone: this.options.timezone, operation: options.operation, bindParam });
        }
      }
    }
    return bindParam(value);
  }
  validate(value, field, options) {
    if (this.typeValidation && field.type.validate && value) {
      try {
        if (options.isList && Array.isArray(value)) {
          for (const item of value) {
            field.type.validate(item, options);
          }
        } else {
          field.type.validate(value, options);
        }
      } catch (error) {
        if (error instanceof sequelizeError.ValidationError) {
          error.errors.push(new sequelizeError.ValidationErrorItem(error.message, "Validation error", field.fieldName, value, null, `${field.type.key} validator`));
        }
        throw error;
      }
    }
  }
  isIdentifierQuoted(identifier) {
    return /^\s*(?:([`"'])(?:(?!\1).|\1{2})*\1\.?)+\s*$/i.test(identifier);
  }
  jsonPathExtractionQuery(column, path, isJson) {
    let paths = _.toPath(path);
    let pathStr;
    const quotedColumn = this.isIdentifierQuoted(column) ? column : this.quoteIdentifier(column);
    switch (this.dialect) {
      case "mysql":
      case "mariadb":
      case "sqlite":
        if (this.dialect === "mysql") {
          paths = paths.map((subPath) => {
            return /\D/.test(subPath) ? Utils.addTicks(subPath, '"') : subPath;
          });
        }
        pathStr = this.escape(["$"].concat(paths).join(".").replace(/\.(\d+)(?:(?=\.)|$)/g, (__, digit) => `[${digit}]`));
        if (this.dialect === "sqlite") {
          return `json_extract(${quotedColumn},${pathStr})`;
        }
        return `json_unquote(json_extract(${quotedColumn},${pathStr}))`;
      case "postgres":
        const join = isJson ? "#>" : "#>>";
        pathStr = this.escape(`{${paths.join(",")}}`);
        return `(${quotedColumn}${join}${pathStr})`;
      default:
        throw new Error(`Unsupported ${this.dialect} for JSON operations`);
    }
  }
  selectQuery(tableName, options, model) {
    options = options || {};
    const limit = options.limit;
    const mainQueryItems = [];
    const subQueryItems = [];
    const subQuery = options.subQuery === void 0 ? limit && options.hasMultiAssociation : options.subQuery;
    const attributes = {
      main: options.attributes && options.attributes.slice(),
      subQuery: null
    };
    const mainTable = {
      name: tableName,
      quotedName: null,
      as: null,
      model
    };
    const topLevelInfo = {
      names: mainTable,
      options,
      subQuery
    };
    let mainJoinQueries = [];
    let subJoinQueries = [];
    let query;
    if (this.options.minifyAliases && !options.aliasesMapping) {
      options.aliasesMapping = /* @__PURE__ */ new Map();
      options.aliasesByTable = {};
      options.includeAliases = /* @__PURE__ */ new Map();
    }
    if (options.tableAs) {
      mainTable.as = this.quoteIdentifier(options.tableAs);
    } else if (!Array.isArray(mainTable.name) && mainTable.model) {
      mainTable.as = this.quoteIdentifier(mainTable.model.name);
    }
    mainTable.quotedName = !Array.isArray(mainTable.name) ? this.quoteTable(mainTable.name) : tableName.map((t) => {
      return Array.isArray(t) ? this.quoteTable(t[0], t[1]) : this.quoteTable(t, true);
    }).join(", ");
    if (subQuery && attributes.main) {
      for (const keyAtt of mainTable.model.primaryKeyAttributes) {
        if (!attributes.main.some((attr) => keyAtt === attr || keyAtt === attr[0] || keyAtt === attr[1])) {
          attributes.main.push(mainTable.model.rawAttributes[keyAtt].field ? [keyAtt, mainTable.model.rawAttributes[keyAtt].field] : keyAtt);
        }
      }
    }
    attributes.main = this.escapeAttributes(attributes.main, options, mainTable.as);
    attributes.main = attributes.main || (options.include ? [`${mainTable.as}.*`] : ["*"]);
    if (subQuery || options.groupedLimit) {
      attributes.subQuery = attributes.main;
      attributes.main = [`${mainTable.as || mainTable.quotedName}.*`];
    }
    if (options.include) {
      for (const include of options.include) {
        if (include.separate) {
          continue;
        }
        const joinQueries = this.generateInclude(include, { externalAs: mainTable.as, internalAs: mainTable.as }, topLevelInfo);
        subJoinQueries = subJoinQueries.concat(joinQueries.subQuery);
        mainJoinQueries = mainJoinQueries.concat(joinQueries.mainQuery);
        if (joinQueries.attributes.main.length > 0) {
          attributes.main = _.uniq(attributes.main.concat(joinQueries.attributes.main));
        }
        if (joinQueries.attributes.subQuery.length > 0) {
          attributes.subQuery = _.uniq(attributes.subQuery.concat(joinQueries.attributes.subQuery));
        }
      }
    }
    if (subQuery) {
      subQueryItems.push(this.selectFromTableFragment(options, mainTable.model, attributes.subQuery, mainTable.quotedName, mainTable.as));
      subQueryItems.push(subJoinQueries.join(""));
    } else {
      if (options.groupedLimit) {
        if (!mainTable.as) {
          mainTable.as = mainTable.quotedName;
        }
        const where = __spreadValues({}, options.where);
        let groupedLimitOrder, whereKey, include, groupedTableName = mainTable.as;
        if (typeof options.groupedLimit.on === "string") {
          whereKey = options.groupedLimit.on;
        } else if (options.groupedLimit.on instanceof HasMany) {
          whereKey = options.groupedLimit.on.foreignKeyField;
        }
        if (options.groupedLimit.on instanceof BelongsToMany) {
          groupedTableName = options.groupedLimit.on.manyFromSource.as;
          const groupedLimitOptions = Model._validateIncludedElements({
            include: [{
              association: options.groupedLimit.on.manyFromSource,
              duplicating: false,
              required: true,
              where: __spreadValues({
                [Op.placeholder]: true
              }, options.groupedLimit.through && options.groupedLimit.through.where)
            }],
            model
          });
          options.hasJoin = true;
          options.hasMultiAssociation = true;
          options.includeMap = Object.assign(groupedLimitOptions.includeMap, options.includeMap);
          options.includeNames = groupedLimitOptions.includeNames.concat(options.includeNames || []);
          include = groupedLimitOptions.include;
          if (Array.isArray(options.order)) {
            options.order.forEach((order, i) => {
              if (Array.isArray(order)) {
                order = order[0];
              }
              let alias = `subquery_order_${i}`;
              options.attributes.push([order, alias]);
              alias = this.sequelize.literal(this.quote(alias));
              if (Array.isArray(options.order[i])) {
                options.order[i][0] = alias;
              } else {
                options.order[i] = alias;
              }
            });
            groupedLimitOrder = options.order;
          }
        } else {
          groupedLimitOrder = options.order;
          delete options.order;
          where[Op.placeholder] = true;
        }
        const baseQuery = `SELECT * FROM (${this.selectQuery(tableName, {
          attributes: options.attributes,
          offset: options.offset,
          limit: options.groupedLimit.limit,
          order: groupedLimitOrder,
          aliasesMapping: options.aliasesMapping,
          aliasesByTable: options.aliasesByTable,
          where,
          include,
          model
        }, model).replace(/;$/, "")}) AS sub`;
        const placeHolder = this.whereItemQuery(Op.placeholder, true, { model });
        const splicePos = baseQuery.indexOf(placeHolder);
        mainQueryItems.push(this.selectFromTableFragment(options, mainTable.model, attributes.main, `(${options.groupedLimit.values.map((value) => {
          let groupWhere;
          if (whereKey) {
            groupWhere = {
              [whereKey]: value
            };
          }
          if (include) {
            groupWhere = {
              [options.groupedLimit.on.foreignIdentifierField]: value
            };
          }
          return Utils.spliceStr(baseQuery, splicePos, placeHolder.length, this.getWhereConditions(groupWhere, groupedTableName));
        }).join(this._dialect.supports["UNION ALL"] ? " UNION ALL " : " UNION ")})`, mainTable.as));
      } else {
        mainQueryItems.push(this.selectFromTableFragment(options, mainTable.model, attributes.main, mainTable.quotedName, mainTable.as));
      }
      mainQueryItems.push(mainJoinQueries.join(""));
    }
    if (Object.prototype.hasOwnProperty.call(options, "where") && !options.groupedLimit) {
      options.where = this.getWhereConditions(options.where, mainTable.as || tableName, model, options);
      if (options.where) {
        if (subQuery) {
          subQueryItems.push(` WHERE ${options.where}`);
        } else {
          mainQueryItems.push(` WHERE ${options.where}`);
          mainQueryItems.forEach((value, key) => {
            if (value.startsWith("SELECT")) {
              mainQueryItems[key] = this.selectFromTableFragment(options, model, attributes.main, mainTable.quotedName, mainTable.as, options.where);
            }
          });
        }
      }
    }
    if (options.group) {
      options.group = Array.isArray(options.group) ? options.group.map((t) => this.aliasGrouping(t, model, mainTable.as, options)).join(", ") : this.aliasGrouping(options.group, model, mainTable.as, options);
      if (subQuery && options.group) {
        subQueryItems.push(` GROUP BY ${options.group}`);
      } else if (options.group) {
        mainQueryItems.push(` GROUP BY ${options.group}`);
      }
    }
    if (Object.prototype.hasOwnProperty.call(options, "having")) {
      options.having = this.getWhereConditions(options.having, tableName, model, options, false);
      if (options.having) {
        if (subQuery) {
          subQueryItems.push(` HAVING ${options.having}`);
        } else {
          mainQueryItems.push(` HAVING ${options.having}`);
        }
      }
    }
    if (options.order) {
      const orders = this.getQueryOrders(options, model, subQuery);
      if (orders.mainQueryOrder.length) {
        mainQueryItems.push(` ORDER BY ${orders.mainQueryOrder.join(", ")}`);
      }
      if (orders.subQueryOrder.length) {
        subQueryItems.push(` ORDER BY ${orders.subQueryOrder.join(", ")}`);
      }
    }
    const limitOrder = this.addLimitAndOffset(options, mainTable.model);
    if (limitOrder && !options.groupedLimit) {
      if (subQuery) {
        subQueryItems.push(limitOrder);
      } else {
        mainQueryItems.push(limitOrder);
      }
    }
    if (subQuery) {
      this._throwOnEmptyAttributes(attributes.main, { modelName: model && model.name, as: mainTable.as });
      query = `SELECT ${attributes.main.join(", ")} FROM (${subQueryItems.join("")}) AS ${mainTable.as}${mainJoinQueries.join("")}${mainQueryItems.join("")}`;
    } else {
      query = mainQueryItems.join("");
    }
    if (options.lock && this._dialect.supports.lock) {
      let lock = options.lock;
      if (typeof options.lock === "object") {
        lock = options.lock.level;
      }
      if (this._dialect.supports.lockKey && ["KEY SHARE", "NO KEY UPDATE"].includes(lock)) {
        query += ` FOR ${lock}`;
      } else if (lock === "SHARE") {
        query += ` ${this._dialect.supports.forShare}`;
      } else {
        query += " FOR UPDATE";
      }
      if (this._dialect.supports.lockOf && options.lock.of && options.lock.of.prototype instanceof Model) {
        query += ` OF ${this.quoteTable(options.lock.of.name)}`;
      }
      if (this._dialect.supports.skipLocked && options.skipLocked) {
        query += " SKIP LOCKED";
      }
    }
    return `${query};`;
  }
  aliasGrouping(field, model, tableName, options) {
    const src = Array.isArray(field) ? field[0] : field;
    return this.quote(this._getAliasForField(tableName, src, options) || src, model);
  }
  escapeAttributes(attributes, options, mainTableAs) {
    return attributes && attributes.map((attr) => {
      let addTable = true;
      if (attr instanceof Utils.SequelizeMethod) {
        return this.handleSequelizeMethod(attr);
      }
      if (Array.isArray(attr)) {
        if (attr.length !== 2) {
          throw new Error(`${JSON.stringify(attr)} is not a valid attribute definition. Please use the following format: ['attribute definition', 'alias']`);
        }
        attr = attr.slice();
        if (attr[0] instanceof Utils.SequelizeMethod) {
          attr[0] = this.handleSequelizeMethod(attr[0]);
          addTable = false;
        } else if (!attr[0].includes("(") && !attr[0].includes(")")) {
          attr[0] = this.quoteIdentifier(attr[0]);
        } else {
          deprecations.noRawAttributes();
        }
        let alias = attr[1];
        if (this.options.minifyAliases) {
          alias = this._getMinifiedAlias(alias, mainTableAs, options);
        }
        attr = [attr[0], this.quoteIdentifier(alias)].join(" AS ");
      } else {
        attr = !attr.includes(Utils.TICK_CHAR) && !attr.includes('"') ? this.quoteAttribute(attr, options.model) : this.escape(attr);
      }
      if (!_.isEmpty(options.include) && (!attr.includes(".") || options.dotNotation) && addTable) {
        attr = `${mainTableAs}.${attr}`;
      }
      return attr;
    });
  }
  generateInclude(include, parentTableName, topLevelInfo) {
    const joinQueries = {
      mainQuery: [],
      subQuery: []
    };
    const mainChildIncludes = [];
    const subChildIncludes = [];
    let requiredMismatch = false;
    const includeAs = {
      internalAs: include.as,
      externalAs: include.as
    };
    const attributes = {
      main: [],
      subQuery: []
    };
    let joinQuery;
    topLevelInfo.options.keysEscaped = true;
    if (topLevelInfo.names.name !== parentTableName.externalAs && topLevelInfo.names.as !== parentTableName.externalAs) {
      includeAs.internalAs = `${parentTableName.internalAs}->${include.as}`;
      includeAs.externalAs = `${parentTableName.externalAs}.${include.as}`;
    }
    if (topLevelInfo.options.includeIgnoreAttributes !== false) {
      include.model._expandAttributes(include);
      Utils.mapFinderOptions(include, include.model);
      const includeAttributes = include.attributes.map((attr) => {
        let attrAs = attr;
        let verbatim = false;
        if (Array.isArray(attr) && attr.length === 2) {
          if (attr[0] instanceof Utils.SequelizeMethod && (attr[0] instanceof Utils.Literal || attr[0] instanceof Utils.Cast || attr[0] instanceof Utils.Fn)) {
            verbatim = true;
          }
          attr = attr.map((attr2) => attr2 instanceof Utils.SequelizeMethod ? this.handleSequelizeMethod(attr2) : attr2);
          attrAs = attr[1];
          attr = attr[0];
        }
        if (attr instanceof Utils.Literal) {
          return attr.val;
        }
        if (attr instanceof Utils.Cast || attr instanceof Utils.Fn) {
          throw new Error("Tried to select attributes using Sequelize.cast or Sequelize.fn without specifying an alias for the result, during eager loading. This means the attribute will not be added to the returned instance");
        }
        let prefix;
        if (verbatim === true) {
          prefix = attr;
        } else if (/#>>|->>/.test(attr)) {
          prefix = `(${this.quoteIdentifier(includeAs.internalAs)}.${attr.replace(/\(|\)/g, "")})`;
        } else if (/json_extract\(/.test(attr)) {
          prefix = attr.replace(/json_extract\(/i, `json_extract(${this.quoteIdentifier(includeAs.internalAs)}.`);
        } else {
          prefix = `${this.quoteIdentifier(includeAs.internalAs)}.${this.quoteIdentifier(attr)}`;
        }
        let alias = `${includeAs.externalAs}.${attrAs}`;
        if (this.options.minifyAliases) {
          alias = this._getMinifiedAlias(alias, includeAs.internalAs, topLevelInfo.options);
        }
        return Utils.joinSQLFragments([
          prefix,
          "AS",
          this.quoteIdentifier(alias, true)
        ]);
      });
      if (include.subQuery && topLevelInfo.subQuery) {
        for (const attr of includeAttributes) {
          attributes.subQuery.push(attr);
        }
      } else {
        for (const attr of includeAttributes) {
          attributes.main.push(attr);
        }
      }
    }
    if (include.through) {
      joinQuery = this.generateThroughJoin(include, includeAs, parentTableName.internalAs, topLevelInfo);
    } else {
      this._generateSubQueryFilter(include, includeAs, topLevelInfo);
      joinQuery = this.generateJoin(include, topLevelInfo);
    }
    if (joinQuery.attributes.main.length > 0) {
      attributes.main = attributes.main.concat(joinQuery.attributes.main);
    }
    if (joinQuery.attributes.subQuery.length > 0) {
      attributes.subQuery = attributes.subQuery.concat(joinQuery.attributes.subQuery);
    }
    if (include.include) {
      for (const childInclude of include.include) {
        if (childInclude.separate || childInclude._pseudo) {
          continue;
        }
        const childJoinQueries = this.generateInclude(childInclude, includeAs, topLevelInfo);
        if (include.required === false && childInclude.required === true) {
          requiredMismatch = true;
        }
        if (childInclude.subQuery && topLevelInfo.subQuery) {
          subChildIncludes.push(childJoinQueries.subQuery);
        }
        if (childJoinQueries.mainQuery) {
          mainChildIncludes.push(childJoinQueries.mainQuery);
        }
        if (childJoinQueries.attributes.main.length > 0) {
          attributes.main = attributes.main.concat(childJoinQueries.attributes.main);
        }
        if (childJoinQueries.attributes.subQuery.length > 0) {
          attributes.subQuery = attributes.subQuery.concat(childJoinQueries.attributes.subQuery);
        }
      }
    }
    if (include.subQuery && topLevelInfo.subQuery) {
      if (requiredMismatch && subChildIncludes.length > 0) {
        joinQueries.subQuery.push(` ${joinQuery.join} ( ${joinQuery.body}${subChildIncludes.join("")} ) ON ${joinQuery.condition}`);
      } else {
        joinQueries.subQuery.push(` ${joinQuery.join} ${joinQuery.body} ON ${joinQuery.condition}`);
        if (subChildIncludes.length > 0) {
          joinQueries.subQuery.push(subChildIncludes.join(""));
        }
      }
      joinQueries.mainQuery.push(mainChildIncludes.join(""));
    } else {
      if (requiredMismatch && mainChildIncludes.length > 0) {
        joinQueries.mainQuery.push(` ${joinQuery.join} ( ${joinQuery.body}${mainChildIncludes.join("")} ) ON ${joinQuery.condition}`);
      } else {
        joinQueries.mainQuery.push(` ${joinQuery.join} ${joinQuery.body} ON ${joinQuery.condition}`);
        if (mainChildIncludes.length > 0) {
          joinQueries.mainQuery.push(mainChildIncludes.join(""));
        }
      }
      joinQueries.subQuery.push(subChildIncludes.join(""));
    }
    return {
      mainQuery: joinQueries.mainQuery.join(""),
      subQuery: joinQueries.subQuery.join(""),
      attributes
    };
  }
  _getMinifiedAlias(alias, tableName, options) {
    if (options.aliasesByTable[`${tableName}${alias}`]) {
      return options.aliasesByTable[`${tableName}${alias}`];
    }
    if (alias.match(/subquery_order_[0-9]/)) {
      return alias;
    }
    const minifiedAlias = `_${options.aliasesMapping.size}`;
    options.aliasesMapping.set(minifiedAlias, alias);
    options.aliasesByTable[`${tableName}${alias}`] = minifiedAlias;
    return minifiedAlias;
  }
  _getAliasForField(tableName, field, options) {
    if (this.options.minifyAliases) {
      if (options.aliasesByTable[`${tableName}${field}`]) {
        return options.aliasesByTable[`${tableName}${field}`];
      }
    }
    return null;
  }
  generateJoin(include, topLevelInfo) {
    const association = include.association;
    const parent = include.parent;
    const parentIsTop = !!parent && !include.parent.association && include.parent.model.name === topLevelInfo.options.model.name;
    let $parent;
    let joinWhere;
    const left = association.source;
    const attrLeft = association instanceof BelongsTo ? association.identifier : association.sourceKeyAttribute || left.primaryKeyAttribute;
    const fieldLeft = association instanceof BelongsTo ? association.identifierField : left.rawAttributes[association.sourceKeyAttribute || left.primaryKeyAttribute].field;
    let asLeft;
    const right = include.model;
    const tableRight = right.getTableName();
    const fieldRight = association instanceof BelongsTo ? right.rawAttributes[association.targetIdentifier || right.primaryKeyAttribute].field : association.identifierField;
    let asRight = include.as;
    while (($parent = $parent && $parent.parent || include.parent) && $parent.association) {
      if (asLeft) {
        asLeft = `${$parent.as}->${asLeft}`;
      } else {
        asLeft = $parent.as;
      }
    }
    if (!asLeft)
      asLeft = parent.as || parent.model.name;
    else
      asRight = `${asLeft}->${asRight}`;
    let joinOn = `${this.quoteTable(asLeft)}.${this.quoteIdentifier(fieldLeft)}`;
    const subqueryAttributes = [];
    if (topLevelInfo.options.groupedLimit && parentIsTop || topLevelInfo.subQuery && include.parent.subQuery && !include.subQuery) {
      if (parentIsTop) {
        const tableName = this.quoteTable(parent.as || parent.model.name);
        joinOn = this._getAliasForField(tableName, attrLeft, topLevelInfo.options) || `${tableName}.${this.quoteIdentifier(attrLeft)}`;
        if (topLevelInfo.subQuery) {
          const dbIdentifier = `${tableName}.${this.quoteIdentifier(fieldLeft)}`;
          subqueryAttributes.push(dbIdentifier !== joinOn ? `${dbIdentifier} AS ${this.quoteIdentifier(attrLeft)}` : dbIdentifier);
        }
      } else {
        const joinSource = `${asLeft.replace(/->/g, ".")}.${attrLeft}`;
        joinOn = this._getAliasForField(asLeft, joinSource, topLevelInfo.options) || this.quoteIdentifier(joinSource);
      }
    }
    joinOn += ` = ${this.quoteIdentifier(asRight)}.${this.quoteIdentifier(fieldRight)}`;
    if (include.on) {
      joinOn = this.whereItemsQuery(include.on, {
        prefix: this.sequelize.literal(this.quoteIdentifier(asRight)),
        model: include.model
      });
    }
    if (include.where) {
      joinWhere = this.whereItemsQuery(include.where, {
        prefix: this.sequelize.literal(this.quoteIdentifier(asRight)),
        model: include.model
      });
      if (joinWhere) {
        if (include.or) {
          joinOn += ` OR ${joinWhere}`;
        } else {
          joinOn += ` AND ${joinWhere}`;
        }
      }
    }
    if (this.options.minifyAliases && asRight.length > 63) {
      const alias = `%${topLevelInfo.options.includeAliases.size}`;
      topLevelInfo.options.includeAliases.set(alias, asRight);
    }
    return {
      join: include.required ? "INNER JOIN" : include.right && this._dialect.supports["RIGHT JOIN"] ? "RIGHT OUTER JOIN" : "LEFT OUTER JOIN",
      body: this.quoteTable(tableRight, asRight),
      condition: joinOn,
      attributes: {
        main: [],
        subQuery: subqueryAttributes
      }
    };
  }
  generateReturnValues(modelAttributes, options) {
    const returnFields = [];
    const returnTypes = [];
    let outputFragment = "";
    let returningFragment = "";
    let tmpTable = "";
    if (Array.isArray(options.returning)) {
      returnFields.push(...options.returning.map((field) => this.quoteIdentifier(field)));
    } else if (modelAttributes) {
      _.each(modelAttributes, (attribute) => {
        if (!(attribute.type instanceof DataTypes.VIRTUAL)) {
          returnFields.push(this.quoteIdentifier(attribute.field));
          returnTypes.push(attribute.type);
        }
      });
    }
    if (_.isEmpty(returnFields)) {
      returnFields.push("*");
    }
    if (this._dialect.supports.returnValues.returning) {
      returningFragment = ` RETURNING ${returnFields.join(",")}`;
    } else if (this._dialect.supports.returnValues.output) {
      outputFragment = ` OUTPUT ${returnFields.map((field) => `INSERTED.${field}`).join(",")}`;
      if (options.hasTrigger && this._dialect.supports.tmpTableTrigger) {
        const tmpColumns = returnFields.map((field, i) => `${field} ${returnTypes[i].toSql()}`);
        tmpTable = `DECLARE @tmp TABLE (${tmpColumns.join(",")}); `;
        outputFragment += " INTO @tmp";
        returningFragment = "; SELECT * FROM @tmp";
      }
    }
    return { outputFragment, returnFields, returningFragment, tmpTable };
  }
  generateThroughJoin(include, includeAs, parentTableName, topLevelInfo) {
    const through = include.through;
    const throughTable = through.model.getTableName();
    const throughAs = `${includeAs.internalAs}->${through.as}`;
    const externalThroughAs = `${includeAs.externalAs}.${through.as}`;
    const throughAttributes = through.attributes.map((attr) => {
      let alias = `${externalThroughAs}.${Array.isArray(attr) ? attr[1] : attr}`;
      if (this.options.minifyAliases) {
        alias = this._getMinifiedAlias(alias, throughAs, topLevelInfo.options);
      }
      return Utils.joinSQLFragments([
        `${this.quoteIdentifier(throughAs)}.${this.quoteIdentifier(Array.isArray(attr) ? attr[0] : attr)}`,
        "AS",
        this.quoteIdentifier(alias)
      ]);
    });
    const association = include.association;
    const parentIsTop = !include.parent.association && include.parent.model.name === topLevelInfo.options.model.name;
    const tableSource = parentTableName;
    const identSource = association.identifierField;
    const tableTarget = includeAs.internalAs;
    const identTarget = association.foreignIdentifierField;
    const attrTarget = association.targetKeyField;
    const joinType = include.required ? "INNER JOIN" : include.right && this._dialect.supports["RIGHT JOIN"] ? "RIGHT OUTER JOIN" : "LEFT OUTER JOIN";
    let joinBody;
    let joinCondition;
    const attributes = {
      main: [],
      subQuery: []
    };
    let attrSource = association.sourceKey;
    let sourceJoinOn;
    let targetJoinOn;
    let throughWhere;
    let targetWhere;
    if (topLevelInfo.options.includeIgnoreAttributes !== false) {
      for (const attr of throughAttributes) {
        attributes.main.push(attr);
      }
    }
    if (!topLevelInfo.subQuery) {
      attrSource = association.sourceKeyField;
    }
    if (topLevelInfo.subQuery && !include.subQuery && !include.parent.subQuery && include.parent.model !== topLevelInfo.options.mainModel) {
      attrSource = association.sourceKeyField;
    }
    if (topLevelInfo.subQuery && !include.subQuery && include.parent.subQuery && !parentIsTop) {
      const joinSource = this._getAliasForField(tableSource, `${tableSource}.${attrSource}`, topLevelInfo.options) || `${tableSource}.${attrSource}`;
      sourceJoinOn = `${this.quoteIdentifier(joinSource)} = `;
    } else {
      const aliasedSource = this._getAliasForField(tableSource, attrSource, topLevelInfo.options) || attrSource;
      sourceJoinOn = `${this.quoteTable(tableSource)}.${this.quoteIdentifier(aliasedSource)} = `;
    }
    sourceJoinOn += `${this.quoteIdentifier(throughAs)}.${this.quoteIdentifier(identSource)}`;
    targetJoinOn = `${this.quoteIdentifier(tableTarget)}.${this.quoteIdentifier(attrTarget)} = `;
    targetJoinOn += `${this.quoteIdentifier(throughAs)}.${this.quoteIdentifier(identTarget)}`;
    if (through.where) {
      throughWhere = this.getWhereConditions(through.where, this.sequelize.literal(this.quoteIdentifier(throughAs)), through.model);
    }
    joinBody = `( ${this.quoteTable(throughTable, throughAs)} INNER JOIN ${this.quoteTable(include.model.getTableName(), includeAs.internalAs)} ON ${targetJoinOn}`;
    if (throughWhere) {
      joinBody += ` AND ${throughWhere}`;
    }
    joinBody += ")";
    joinCondition = sourceJoinOn;
    if (include.where || include.through.where) {
      if (include.where) {
        targetWhere = this.getWhereConditions(include.where, this.sequelize.literal(this.quoteIdentifier(includeAs.internalAs)), include.model, topLevelInfo.options);
        if (targetWhere) {
          joinCondition += ` AND ${targetWhere}`;
        }
      }
    }
    this._generateSubQueryFilter(include, includeAs, topLevelInfo);
    return {
      join: joinType,
      body: joinBody,
      condition: joinCondition,
      attributes
    };
  }
  _generateSubQueryFilter(include, includeAs, topLevelInfo) {
    if (!topLevelInfo.subQuery || !include.subQueryFilter) {
      return;
    }
    if (!topLevelInfo.options.where) {
      topLevelInfo.options.where = {};
    }
    let parent = include;
    let child = include;
    let nestedIncludes = this._getRequiredClosure(include).include;
    let query;
    while (parent = parent.parent) {
      if (parent.parent && !parent.required) {
        return;
      }
      if (parent.subQueryFilter) {
        return;
      }
      nestedIncludes = [__spreadProps(__spreadValues({}, child), { include: nestedIncludes, attributes: [] })];
      child = parent;
    }
    const topInclude = nestedIncludes[0];
    const topParent = topInclude.parent;
    const topAssociation = topInclude.association;
    topInclude.association = void 0;
    if (topInclude.through && Object(topInclude.through.model) === topInclude.through.model) {
      query = this.selectQuery(topInclude.through.model.getTableName(), {
        attributes: [topInclude.through.model.primaryKeyField],
        include: Model._validateIncludedElements({
          model: topInclude.through.model,
          include: [{
            association: topAssociation.toTarget,
            required: true,
            where: topInclude.where,
            include: topInclude.include
          }]
        }).include,
        model: topInclude.through.model,
        where: {
          [Op.and]: [
            this.sequelize.literal([
              `${this.quoteTable(topParent.model.name)}.${this.quoteIdentifier(topParent.model.primaryKeyField)}`,
              `${this.quoteIdentifier(topInclude.through.model.name)}.${this.quoteIdentifier(topAssociation.identifierField)}`
            ].join(" = ")),
            topInclude.through.where
          ]
        },
        limit: 1,
        includeIgnoreAttributes: false
      }, topInclude.through.model);
    } else {
      const isBelongsTo = topAssociation.associationType === "BelongsTo";
      const sourceField = isBelongsTo ? topAssociation.identifierField : topAssociation.sourceKeyField || topParent.model.primaryKeyField;
      const targetField = isBelongsTo ? topAssociation.sourceKeyField || topInclude.model.primaryKeyField : topAssociation.identifierField;
      const join = [
        `${this.quoteIdentifier(topInclude.as)}.${this.quoteIdentifier(targetField)}`,
        `${this.quoteTable(topParent.as || topParent.model.name)}.${this.quoteIdentifier(sourceField)}`
      ].join(" = ");
      query = this.selectQuery(topInclude.model.getTableName(), {
        attributes: [targetField],
        include: Model._validateIncludedElements(topInclude).include,
        model: topInclude.model,
        where: {
          [Op.and]: [
            topInclude.where,
            { [Op.join]: this.sequelize.literal(join) }
          ]
        },
        limit: 1,
        tableAs: topInclude.as,
        includeIgnoreAttributes: false
      }, topInclude.model);
    }
    if (!topLevelInfo.options.where[Op.and]) {
      topLevelInfo.options.where[Op.and] = [];
    }
    topLevelInfo.options.where[`__${includeAs.internalAs}`] = this.sequelize.literal([
      "(",
      query.replace(/;$/, ""),
      ")",
      "IS NOT NULL"
    ].join(" "));
  }
  _getRequiredClosure(include) {
    const copy = __spreadProps(__spreadValues({}, include), { attributes: [], include: [] });
    if (Array.isArray(include.include)) {
      copy.include = include.include.filter((i) => i.required).map((inc) => this._getRequiredClosure(inc));
    }
    return copy;
  }
  getQueryOrders(options, model, subQuery) {
    const mainQueryOrder = [];
    const subQueryOrder = [];
    if (Array.isArray(options.order)) {
      for (let order of options.order) {
        if (!Array.isArray(order)) {
          order = [order];
        }
        if (subQuery && Array.isArray(order) && order[0] && !(order[0] instanceof Association) && !(typeof order[0] === "function" && order[0].prototype instanceof Model) && !(typeof order[0].model === "function" && order[0].model.prototype instanceof Model) && !(typeof order[0] === "string" && model && model.associations !== void 0 && model.associations[order[0]])) {
          subQueryOrder.push(this.quote(order, model, "->"));
        }
        if (subQuery) {
          const subQueryAttribute = options.attributes.find((a) => Array.isArray(a) && a[0] === order[0] && a[1]);
          if (subQueryAttribute) {
            const modelName = this.quoteIdentifier(model.name);
            order[0] = new Utils.Col(this._getAliasForField(modelName, subQueryAttribute[1], options) || subQueryAttribute[1]);
          }
        }
        mainQueryOrder.push(this.quote(order, model, "->"));
      }
    } else if (options.order instanceof Utils.SequelizeMethod) {
      const sql = this.quote(options.order, model, "->");
      if (subQuery) {
        subQueryOrder.push(sql);
      }
      mainQueryOrder.push(sql);
    } else {
      throw new Error("Order must be type of array or instance of a valid sequelize method.");
    }
    return { mainQueryOrder, subQueryOrder };
  }
  _throwOnEmptyAttributes(attributes, extraInfo = {}) {
    if (attributes.length > 0)
      return;
    const asPart = extraInfo.as && `as ${extraInfo.as}` || "";
    const namePart = extraInfo.modelName && `for model '${extraInfo.modelName}'` || "";
    const message = `Attempted a SELECT query ${namePart} ${asPart} without selecting any columns`;
    throw new sequelizeError.QueryError(message.replace(/ +/g, " "));
  }
  selectFromTableFragment(options, model, attributes, tables, mainTableAs) {
    this._throwOnEmptyAttributes(attributes, { modelName: model && model.name, as: mainTableAs });
    let fragment = `SELECT ${attributes.join(", ")} FROM ${tables}`;
    if (mainTableAs) {
      fragment += ` AS ${mainTableAs}`;
    }
    if (options.indexHints && this._dialect.supports.indexHints) {
      for (const hint of options.indexHints) {
        if (IndexHints[hint.type]) {
          fragment += ` ${IndexHints[hint.type]} INDEX (${hint.values.map((indexName) => this.quoteIdentifiers(indexName)).join(",")})`;
        }
      }
    }
    return fragment;
  }
  addLimitAndOffset(options) {
    let fragment = "";
    if (options.offset != null && options.limit == null) {
      fragment += " LIMIT " + this.escape(options.offset) + ", " + 1e13;
    } else if (options.limit != null) {
      if (options.offset != null) {
        fragment += " LIMIT " + this.escape(options.offset) + ", " + this.escape(options.limit);
      } else {
        fragment += " LIMIT " + this.escape(options.limit);
      }
    }
    return fragment;
  }
  handleSequelizeMethod(smth, tableName, factory, options, prepend) {
    let result;
    if (Object.prototype.hasOwnProperty.call(this.OperatorMap, smth.comparator)) {
      smth.comparator = this.OperatorMap[smth.comparator];
    }
    if (smth instanceof Utils.Where) {
      let value = smth.logic;
      let key;
      if (smth.attribute instanceof Utils.SequelizeMethod) {
        key = this.getWhereConditions(smth.attribute, tableName, factory, options, prepend);
      } else {
        key = `${this.quoteTable(smth.attribute.Model.name)}.${this.quoteIdentifier(smth.attribute.field || smth.attribute.fieldName)}`;
      }
      if (value && value instanceof Utils.SequelizeMethod) {
        value = this.getWhereConditions(value, tableName, factory, options, prepend);
        if (value === "NULL") {
          if (smth.comparator === "=") {
            smth.comparator = "IS";
          }
          if (smth.comparator === "!=") {
            smth.comparator = "IS NOT";
          }
        }
        return [key, value].join(` ${smth.comparator} `);
      }
      if (_.isPlainObject(value)) {
        return this.whereItemQuery(smth.attribute, value, {
          model: factory
        });
      }
      if ([this.OperatorMap[Op.between], this.OperatorMap[Op.notBetween]].includes(smth.comparator)) {
        value = `${this.escape(value[0])} AND ${this.escape(value[1])}`;
      } else if (typeof value === "boolean") {
        value = this.booleanValue(value);
      } else {
        value = this.escape(value);
      }
      if (value === "NULL") {
        if (smth.comparator === "=") {
          smth.comparator = "IS";
        }
        if (smth.comparator === "!=") {
          smth.comparator = "IS NOT";
        }
      }
      return [key, value].join(` ${smth.comparator} `);
    }
    if (smth instanceof Utils.Literal) {
      return smth.val;
    }
    if (smth instanceof Utils.Cast) {
      if (smth.val instanceof Utils.SequelizeMethod) {
        result = this.handleSequelizeMethod(smth.val, tableName, factory, options, prepend);
      } else if (_.isPlainObject(smth.val)) {
        result = this.whereItemsQuery(smth.val);
      } else {
        result = this.escape(smth.val);
      }
      return `CAST(${result} AS ${smth.type.toUpperCase()})`;
    }
    if (smth instanceof Utils.Fn) {
      return `${smth.fn}(${smth.args.map((arg) => {
        if (arg instanceof Utils.SequelizeMethod) {
          return this.handleSequelizeMethod(arg, tableName, factory, options, prepend);
        }
        if (_.isPlainObject(arg)) {
          return this.whereItemsQuery(arg);
        }
        return this.escape(typeof arg === "string" ? arg.replace(/\$/g, "$$$") : arg);
      }).join(", ")})`;
    }
    if (smth instanceof Utils.Col) {
      if (Array.isArray(smth.col) && !factory) {
        throw new Error("Cannot call Sequelize.col() with array outside of order / group clause");
      }
      if (smth.col.startsWith("*")) {
        return "*";
      }
      return this.quote(smth.col, factory);
    }
    return smth.toString(this, factory);
  }
  whereQuery(where, options) {
    const query = this.whereItemsQuery(where, options);
    if (query && query.length) {
      return `WHERE ${query}`;
    }
    return "";
  }
  whereItemsQuery(where, options, binding) {
    if (where === null || where === void 0 || Utils.getComplexSize(where) === 0) {
      return "";
    }
    if (typeof where === "string") {
      throw new Error("Support for `{where: 'raw query'}` has been removed.");
    }
    const items = [];
    binding = binding || "AND";
    if (binding[0] !== " ")
      binding = ` ${binding} `;
    if (_.isPlainObject(where)) {
      Utils.getComplexKeys(where).forEach((prop) => {
        const item = where[prop];
        items.push(this.whereItemQuery(prop, item, options));
      });
    } else {
      items.push(this.whereItemQuery(void 0, where, options));
    }
    return items.length && items.filter((item) => item && item.length).join(binding) || "";
  }
  whereItemQuery(key, value, options = {}) {
    if (value === void 0) {
      throw new Error(`WHERE parameter "${key}" has invalid "undefined" value`);
    }
    if (typeof key === "string" && key.includes(".") && options.model) {
      const keyParts = key.split(".");
      if (options.model.rawAttributes[keyParts[0]] && options.model.rawAttributes[keyParts[0]].type instanceof DataTypes.JSON) {
        const tmp = {};
        const field2 = options.model.rawAttributes[keyParts[0]];
        _.set(tmp, keyParts.slice(1), value);
        return this.whereItemQuery(field2.field || keyParts[0], tmp, __spreadValues({ field: field2 }, options));
      }
    }
    const field = this._findField(key, options);
    const fieldType = field && field.type || options.type;
    const isPlainObject = _.isPlainObject(value);
    const isArray = !isPlainObject && Array.isArray(value);
    key = this.OperatorsAliasMap && this.OperatorsAliasMap[key] || key;
    if (isPlainObject) {
      value = this._replaceAliases(value);
    }
    const valueKeys = isPlainObject && Utils.getComplexKeys(value);
    if (key === void 0) {
      if (typeof value === "string") {
        return value;
      }
      if (isPlainObject && valueKeys.length === 1) {
        return this.whereItemQuery(valueKeys[0], value[valueKeys[0]], options);
      }
    }
    if (value === null) {
      const opValue2 = options.bindParam ? "NULL" : this.escape(value, field);
      return this._joinKeyValue(key, opValue2, this.OperatorMap[Op.is], options.prefix);
    }
    if (!value) {
      const opValue2 = options.bindParam ? this.format(value, field, options, options.bindParam) : this.escape(value, field);
      return this._joinKeyValue(key, opValue2, this.OperatorMap[Op.eq], options.prefix);
    }
    if (value instanceof Utils.SequelizeMethod && !(key !== void 0 && value instanceof Utils.Fn)) {
      return this.handleSequelizeMethod(value);
    }
    if (key === void 0 && isArray) {
      if (Utils.canTreatArrayAsAnd(value)) {
        key = Op.and;
      } else {
        throw new Error("Support for literal replacements in the `where` object has been removed.");
      }
    }
    if (key === Op.or || key === Op.and || key === Op.not) {
      return this._whereGroupBind(key, value, options);
    }
    if (value[Op.or]) {
      return this._whereBind(this.OperatorMap[Op.or], key, value[Op.or], options);
    }
    if (value[Op.and]) {
      return this._whereBind(this.OperatorMap[Op.and], key, value[Op.and], options);
    }
    if (isArray && fieldType instanceof DataTypes.ARRAY) {
      const opValue2 = options.bindParam ? this.format(value, field, options, options.bindParam) : this.escape(value, field);
      return this._joinKeyValue(key, opValue2, this.OperatorMap[Op.eq], options.prefix);
    }
    if (isPlainObject && fieldType instanceof DataTypes.JSON && options.json !== false) {
      return this._whereJSON(key, value, options);
    }
    if (isPlainObject && valueKeys.length > 1) {
      return this._whereBind(this.OperatorMap[Op.and], key, value, options);
    }
    if (isArray) {
      return this._whereParseSingleValueObject(key, field, Op.in, value, options);
    }
    if (isPlainObject) {
      if (this.OperatorMap[valueKeys[0]]) {
        return this._whereParseSingleValueObject(key, field, valueKeys[0], value[valueKeys[0]], options);
      }
      return this._whereParseSingleValueObject(key, field, this.OperatorMap[Op.eq], value, options);
    }
    if (key === Op.placeholder) {
      const opValue2 = options.bindParam ? this.format(value, field, options, options.bindParam) : this.escape(value, field);
      return this._joinKeyValue(this.OperatorMap[key], opValue2, this.OperatorMap[Op.eq], options.prefix);
    }
    const opValue = options.bindParam ? this.format(value, field, options, options.bindParam) : this.escape(value, field);
    return this._joinKeyValue(key, opValue, this.OperatorMap[Op.eq], options.prefix);
  }
  _findField(key, options) {
    if (options.field) {
      return options.field;
    }
    if (options.model && options.model.rawAttributes && options.model.rawAttributes[key]) {
      return options.model.rawAttributes[key];
    }
    if (options.model && options.model.fieldRawAttributesMap && options.model.fieldRawAttributesMap[key]) {
      return options.model.fieldRawAttributesMap[key];
    }
  }
  _whereGroupBind(key, value, options) {
    const binding = key === Op.or ? this.OperatorMap[Op.or] : this.OperatorMap[Op.and];
    const outerBinding = key === Op.not ? "NOT " : "";
    if (Array.isArray(value)) {
      value = value.map((item) => {
        let itemQuery = this.whereItemsQuery(item, options, this.OperatorMap[Op.and]);
        if (itemQuery && itemQuery.length && (Array.isArray(item) || _.isPlainObject(item)) && Utils.getComplexSize(item) > 1) {
          itemQuery = `(${itemQuery})`;
        }
        return itemQuery;
      }).filter((item) => item && item.length);
      value = value.length && value.join(binding);
    } else {
      value = this.whereItemsQuery(value, options, binding);
    }
    if ((key === Op.or || key === Op.not) && !value) {
      return "0 = 1";
    }
    return value ? `${outerBinding}(${value})` : void 0;
  }
  _whereBind(binding, key, value, options) {
    if (_.isPlainObject(value)) {
      value = Utils.getComplexKeys(value).map((prop) => {
        const item = value[prop];
        return this.whereItemQuery(key, { [prop]: item }, options);
      });
    } else {
      value = value.map((item) => this.whereItemQuery(key, item, options));
    }
    value = value.filter((item) => item && item.length);
    return value.length ? `(${value.join(binding)})` : void 0;
  }
  _whereJSON(key, value, options) {
    const items = [];
    let baseKey = this.quoteIdentifier(key);
    if (options.prefix) {
      if (options.prefix instanceof Utils.Literal) {
        baseKey = `${this.handleSequelizeMethod(options.prefix)}.${baseKey}`;
      } else {
        baseKey = `${this.quoteTable(options.prefix)}.${baseKey}`;
      }
    }
    Utils.getOperators(value).forEach((op) => {
      const where = {
        [op]: value[op]
      };
      items.push(this.whereItemQuery(key, where, __spreadProps(__spreadValues({}, options), { json: false })));
    });
    _.forOwn(value, (item, prop) => {
      this._traverseJSON(items, baseKey, prop, item, [prop]);
    });
    const result = items.join(this.OperatorMap[Op.and]);
    return items.length > 1 ? `(${result})` : result;
  }
  _traverseJSON(items, baseKey, prop, item, path) {
    let cast;
    if (path[path.length - 1].includes("::")) {
      const tmp = path[path.length - 1].split("::");
      cast = tmp[1];
      path[path.length - 1] = tmp[0];
    }
    let pathKey = this.jsonPathExtractionQuery(baseKey, path);
    if (_.isPlainObject(item)) {
      Utils.getOperators(item).forEach((op) => {
        const value = this._toJSONValue(item[op]);
        let isJson = false;
        if (typeof value === "string" && op === Op.contains) {
          try {
            JSON.stringify(value);
            isJson = true;
          } catch (e) {
          }
        }
        pathKey = this.jsonPathExtractionQuery(baseKey, path, isJson);
        items.push(this.whereItemQuery(this._castKey(pathKey, value, cast), { [op]: value }));
      });
      _.forOwn(item, (value, itemProp) => {
        this._traverseJSON(items, baseKey, itemProp, value, path.concat([itemProp]));
      });
      return;
    }
    item = this._toJSONValue(item);
    items.push(this.whereItemQuery(this._castKey(pathKey, item, cast), { [Op.eq]: item }));
  }
  _toJSONValue(value) {
    return value;
  }
  _castKey(key, value, cast, json) {
    cast = cast || this._getJsonCast(Array.isArray(value) ? value[0] : value);
    if (cast) {
      return new Utils.Literal(this.handleSequelizeMethod(new Utils.Cast(new Utils.Literal(key), cast, json)));
    }
    return new Utils.Literal(key);
  }
  _getJsonCast(value) {
    if (typeof value === "number") {
      return "double precision";
    }
    if (value instanceof Date) {
      return "timestamptz";
    }
    if (typeof value === "boolean") {
      return "boolean";
    }
    return;
  }
  _joinKeyValue(key, value, comparator, prefix) {
    if (!key) {
      return value;
    }
    if (comparator === void 0) {
      throw new Error(`${key} and ${value} has no comparator`);
    }
    key = this._getSafeKey(key, prefix);
    return [key, value].join(` ${comparator} `);
  }
  _getSafeKey(key, prefix) {
    if (key instanceof Utils.SequelizeMethod) {
      key = this.handleSequelizeMethod(key);
      return this._prefixKey(this.handleSequelizeMethod(key), prefix);
    }
    if (Utils.isColString(key)) {
      key = key.substr(1, key.length - 2).split(".");
      if (key.length > 2) {
        key = [
          key.slice(0, -1).join("->"),
          key[key.length - 1]
        ];
      }
      return key.map((identifier) => this.quoteIdentifier(identifier)).join(".");
    }
    return this._prefixKey(this.quoteIdentifier(key), prefix);
  }
  _prefixKey(key, prefix) {
    if (prefix) {
      if (prefix instanceof Utils.Literal) {
        return [this.handleSequelizeMethod(prefix), key].join(".");
      }
      return [this.quoteTable(prefix), key].join(".");
    }
    return key;
  }
  _whereParseSingleValueObject(key, field, prop, value, options) {
    if (prop === Op.not) {
      if (Array.isArray(value)) {
        prop = Op.notIn;
      } else if (value !== null && value !== true && value !== false) {
        prop = Op.ne;
      }
    }
    let comparator = this.OperatorMap[prop] || this.OperatorMap[Op.eq];
    switch (prop) {
      case Op.in:
      case Op.notIn:
        if (value instanceof Utils.Literal) {
          return this._joinKeyValue(key, value.val, comparator, options.prefix);
        }
        if (value.length) {
          return this._joinKeyValue(key, `(${value.map((item) => this.escape(item, field)).join(", ")})`, comparator, options.prefix);
        }
        if (comparator === this.OperatorMap[Op.in]) {
          return this._joinKeyValue(key, "(NULL)", comparator, options.prefix);
        }
        return "";
      case Op.any:
      case Op.all:
        comparator = `${this.OperatorMap[Op.eq]} ${comparator}`;
        if (value[Op.values]) {
          return this._joinKeyValue(key, `(VALUES ${value[Op.values].map((item) => `(${this.escape(item)})`).join(", ")})`, comparator, options.prefix);
        }
        return this._joinKeyValue(key, `(${this.escape(value, field)})`, comparator, options.prefix);
      case Op.between:
      case Op.notBetween:
        return this._joinKeyValue(key, `${this.escape(value[0], field)} AND ${this.escape(value[1], field)}`, comparator, options.prefix);
      case Op.raw:
        throw new Error("The `$raw` where property is no longer supported.  Use `sequelize.literal` instead.");
      case Op.col:
        comparator = this.OperatorMap[Op.eq];
        value = value.split(".");
        if (value.length > 2) {
          value = [
            value.slice(0, -1).join("->"),
            value[value.length - 1]
          ];
        }
        return this._joinKeyValue(key, value.map((identifier) => this.quoteIdentifier(identifier)).join("."), comparator, options.prefix);
      case Op.startsWith:
      case Op.endsWith:
      case Op.substring:
        comparator = this.OperatorMap[Op.like];
        if (value instanceof Utils.Literal) {
          value = value.val;
        }
        let pattern = `${value}%`;
        if (prop === Op.endsWith)
          pattern = `%${value}`;
        if (prop === Op.substring)
          pattern = `%${value}%`;
        return this._joinKeyValue(key, this.escape(pattern), comparator, options.prefix);
    }
    const escapeOptions = {
      acceptStrings: comparator.includes(this.OperatorMap[Op.like])
    };
    if (_.isPlainObject(value)) {
      if (value[Op.col]) {
        return this._joinKeyValue(key, this.whereItemQuery(null, value), comparator, options.prefix);
      }
      if (value[Op.any]) {
        escapeOptions.isList = true;
        return this._joinKeyValue(key, `(${this.escape(value[Op.any], field, escapeOptions)})`, `${comparator} ${this.OperatorMap[Op.any]}`, options.prefix);
      }
      if (value[Op.all]) {
        escapeOptions.isList = true;
        return this._joinKeyValue(key, `(${this.escape(value[Op.all], field, escapeOptions)})`, `${comparator} ${this.OperatorMap[Op.all]}`, options.prefix);
      }
    }
    if (value === null && comparator === this.OperatorMap[Op.eq]) {
      return this._joinKeyValue(key, this.escape(value, field, escapeOptions), this.OperatorMap[Op.is], options.prefix);
    }
    if (value === null && comparator === this.OperatorMap[Op.ne]) {
      return this._joinKeyValue(key, this.escape(value, field, escapeOptions), this.OperatorMap[Op.not], options.prefix);
    }
    return this._joinKeyValue(key, this.escape(value, field, escapeOptions), comparator, options.prefix);
  }
  getWhereConditions(smth, tableName, factory, options, prepend) {
    const where = {};
    if (Array.isArray(tableName)) {
      tableName = tableName[0];
      if (Array.isArray(tableName)) {
        tableName = tableName[1];
      }
    }
    options = options || {};
    if (prepend === void 0) {
      prepend = true;
    }
    if (smth && smth instanceof Utils.SequelizeMethod) {
      return this.handleSequelizeMethod(smth, tableName, factory, options, prepend);
    }
    if (_.isPlainObject(smth)) {
      return this.whereItemsQuery(smth, {
        model: factory,
        prefix: prepend && tableName,
        type: options.type
      });
    }
    if (typeof smth === "number") {
      let primaryKeys = factory ? Object.keys(factory.primaryKeys) : [];
      if (primaryKeys.length > 0) {
        primaryKeys = primaryKeys[0];
      } else {
        primaryKeys = "id";
      }
      where[primaryKeys] = smth;
      return this.whereItemsQuery(where, {
        model: factory,
        prefix: prepend && tableName
      });
    }
    if (typeof smth === "string") {
      return this.whereItemsQuery(smth, {
        model: factory,
        prefix: prepend && tableName
      });
    }
    if (Buffer.isBuffer(smth)) {
      return this.escape(smth);
    }
    if (Array.isArray(smth)) {
      if (smth.length === 0 || smth.length > 0 && smth[0].length === 0)
        return "1=1";
      if (Utils.canTreatArrayAsAnd(smth)) {
        const _smth = { [Op.and]: smth };
        return this.getWhereConditions(_smth, tableName, factory, options, prepend);
      }
      throw new Error("Support for literal replacements in the `where` object has been removed.");
    }
    if (smth === null) {
      return this.whereItemsQuery(smth, {
        model: factory,
        prefix: prepend && tableName
      });
    }
    return "1=1";
  }
  parseConditionObject(conditions, path) {
    path = path || [];
    return _.reduce(conditions, (result, value, key) => {
      if (_.isObject(value)) {
        return result.concat(this.parseConditionObject(value, path.concat(key)));
      }
      result.push({ path: path.concat(key), value });
      return result;
    }, []);
  }
  booleanValue(value) {
    return value;
  }
}
Object.assign(QueryGenerator.prototype, require("./query-generator/operators"));
Object.assign(QueryGenerator.prototype, require("./query-generator/transaction"));
module.exports = QueryGenerator;
//# sourceMappingURL=query-generator.js.map
"use strict";
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
const _ = require("lodash");
const Utils = require("../../utils");
const DataTypes = require("../../data-types");
const Transaction = require("../../transaction");
const QueryTypes = require("../../query-types");
class QueryInterface {
  constructor(sequelize, queryGenerator) {
    this.sequelize = sequelize;
    this.queryGenerator = queryGenerator;
  }
  async createDatabase(database, options) {
    options = options || {};
    const sql = this.queryGenerator.createDatabaseQuery(database, options);
    return await this.sequelize.query(sql, options);
  }
  async dropDatabase(database, options) {
    options = options || {};
    const sql = this.queryGenerator.dropDatabaseQuery(database);
    return await this.sequelize.query(sql, options);
  }
  async createSchema(schema, options) {
    options = options || {};
    const sql = this.queryGenerator.createSchema(schema);
    return await this.sequelize.query(sql, options);
  }
  async dropSchema(schema, options) {
    options = options || {};
    const sql = this.queryGenerator.dropSchema(schema);
    return await this.sequelize.query(sql, options);
  }
  async dropAllSchemas(options) {
    options = options || {};
    if (!this.queryGenerator._dialect.supports.schemas) {
      return this.sequelize.drop(options);
    }
    const schemas = await this.showAllSchemas(options);
    return Promise.all(schemas.map((schemaName) => this.dropSchema(schemaName, options)));
  }
  async showAllSchemas(options) {
    options = __spreadProps(__spreadValues({}, options), {
      raw: true,
      type: this.sequelize.QueryTypes.SELECT
    });
    const showSchemasSql = this.queryGenerator.showSchemasQuery(options);
    const schemaNames = await this.sequelize.query(showSchemasSql, options);
    return _.flatten(schemaNames.map((value) => value.schema_name ? value.schema_name : value));
  }
  async databaseVersion(options) {
    return await this.sequelize.query(this.queryGenerator.versionQuery(), __spreadProps(__spreadValues({}, options), { type: QueryTypes.VERSION }));
  }
  async createTable(tableName, attributes, options, model) {
    let sql = "";
    options = __spreadValues({}, options);
    if (options && options.uniqueKeys) {
      _.forOwn(options.uniqueKeys, (uniqueKey) => {
        if (uniqueKey.customIndex === void 0) {
          uniqueKey.customIndex = true;
        }
      });
    }
    if (model) {
      options.uniqueKeys = options.uniqueKeys || model.uniqueKeys;
    }
    attributes = _.mapValues(attributes, (attribute) => this.sequelize.normalizeAttribute(attribute));
    await this.ensureEnums(tableName, attributes, options, model);
    if (!tableName.schema && (options.schema || !!model && model._schema)) {
      tableName = this.queryGenerator.addSchema({
        tableName,
        _schema: !!model && model._schema || options.schema
      });
    }
    attributes = this.queryGenerator.attributesToSQL(attributes, {
      table: tableName,
      context: "createTable",
      withoutForeignKeyConstraints: options.withoutForeignKeyConstraints
    });
    sql = this.queryGenerator.createTableQuery(tableName, attributes, options);
    return await this.sequelize.query(sql, options);
  }
  async tableExists(tableName, options) {
    const sql = this.queryGenerator.tableExistsQuery(tableName);
    const out = await this.sequelize.query(sql, __spreadProps(__spreadValues({}, options), {
      type: QueryTypes.SHOWTABLES
    }));
    return out.length === 1;
  }
  async dropTable(tableName, options) {
    options = __spreadValues({}, options);
    options.cascade = options.cascade || options.force || false;
    const sql = this.queryGenerator.dropTableQuery(tableName, options);
    await this.sequelize.query(sql, options);
  }
  async _dropAllTables(tableNames, skip, options) {
    for (const tableName of tableNames) {
      if (!skip.includes(tableName.tableName || tableName)) {
        await this.dropTable(tableName, __spreadProps(__spreadValues({}, options), { cascade: true }));
      }
    }
  }
  async dropAllTables(options) {
    options = options || {};
    const skip = options.skip || [];
    const tableNames = await this.showAllTables(options);
    const foreignKeys = await this.getForeignKeysForTables(tableNames, options);
    for (const tableName of tableNames) {
      let normalizedTableName = tableName;
      if (_.isObject(tableName)) {
        normalizedTableName = `${tableName.schema}.${tableName.tableName}`;
      }
      for (const foreignKey of foreignKeys[normalizedTableName]) {
        await this.sequelize.query(this.queryGenerator.dropForeignKeyQuery(tableName, foreignKey));
      }
    }
    await this._dropAllTables(tableNames, skip, options);
  }
  async renameTable(before, after, options) {
    options = options || {};
    const sql = this.queryGenerator.renameTableQuery(before, after);
    return await this.sequelize.query(sql, options);
  }
  async showAllTables(options) {
    options = __spreadProps(__spreadValues({}, options), {
      raw: true,
      type: QueryTypes.SHOWTABLES
    });
    const showTablesSql = this.queryGenerator.showTablesQuery(this.sequelize.config.database);
    const tableNames = await this.sequelize.query(showTablesSql, options);
    return _.flatten(tableNames);
  }
  async describeTable(tableName, options) {
    let schema = null;
    let schemaDelimiter = null;
    if (typeof options === "string") {
      schema = options;
    } else if (typeof options === "object" && options !== null) {
      schema = options.schema || null;
      schemaDelimiter = options.schemaDelimiter || null;
    }
    if (typeof tableName === "object" && tableName !== null) {
      schema = tableName.schema;
      tableName = tableName.tableName;
    }
    const sql = this.queryGenerator.describeTableQuery(tableName, schema, schemaDelimiter);
    options = __spreadProps(__spreadValues({}, options), { type: QueryTypes.DESCRIBE });
    try {
      const data = await this.sequelize.query(sql, options);
      if (_.isEmpty(data)) {
        throw new Error(`No description found for "${tableName}" table. Check the table name and schema; remember, they _are_ case sensitive.`);
      }
      return data;
    } catch (e) {
      if (e.original && e.original.code === "ER_NO_SUCH_TABLE") {
        throw new Error(`No description found for "${tableName}" table. Check the table name and schema; remember, they _are_ case sensitive.`);
      }
      throw e;
    }
  }
  async addColumn(table, key, attribute, options) {
    if (!table || !key || !attribute) {
      throw new Error("addColumn takes at least 3 arguments (table, attribute name, attribute definition)");
    }
    options = options || {};
    attribute = this.sequelize.normalizeAttribute(attribute);
    return await this.sequelize.query(this.queryGenerator.addColumnQuery(table, key, attribute), options);
  }
  async removeColumn(tableName, attributeName, options) {
    return this.sequelize.query(this.queryGenerator.removeColumnQuery(tableName, attributeName), options);
  }
  normalizeAttribute(dataTypeOrOptions) {
    let attribute;
    if (Object.values(DataTypes).includes(dataTypeOrOptions)) {
      attribute = { type: dataTypeOrOptions, allowNull: true };
    } else {
      attribute = dataTypeOrOptions;
    }
    return this.sequelize.normalizeAttribute(attribute);
  }
  quoteIdentifier(identifier2, force) {
    return this.queryGenerator.quoteIdentifier(identifier2, force);
  }
  quoteIdentifiers(identifiers) {
    return this.queryGenerator.quoteIdentifiers(identifiers);
  }
  async changeColumn(tableName, attributeName, dataTypeOrOptions, options) {
    options = options || {};
    const query = this.queryGenerator.attributesToSQL({
      [attributeName]: this.normalizeAttribute(dataTypeOrOptions)
    }, {
      context: "changeColumn",
      table: tableName
    });
    const sql = this.queryGenerator.changeColumnQuery(tableName, query);
    return this.sequelize.query(sql, options);
  }
  async assertTableHasColumn(tableName, columnName, options) {
    const description = await this.describeTable(tableName, options);
    if (description[columnName]) {
      return description;
    }
    throw new Error(`Table ${tableName} doesn't have the column ${columnName}`);
  }
  async renameColumn(tableName, attrNameBefore, attrNameAfter, options) {
    options = options || {};
    const data = (await this.assertTableHasColumn(tableName, attrNameBefore, options))[attrNameBefore];
    const _options = {};
    _options[attrNameAfter] = {
      attribute: attrNameAfter,
      type: data.type,
      allowNull: data.allowNull,
      defaultValue: data.defaultValue
    };
    if (data.defaultValue === null && !data.allowNull) {
      delete _options[attrNameAfter].defaultValue;
    }
    const sql = this.queryGenerator.renameColumnQuery(tableName, attrNameBefore, this.queryGenerator.attributesToSQL(_options));
    return await this.sequelize.query(sql, options);
  }
  async addIndex(tableName, attributes, options, rawTablename) {
    if (!Array.isArray(attributes)) {
      rawTablename = options;
      options = attributes;
      attributes = options.fields;
    }
    if (!rawTablename) {
      rawTablename = tableName;
    }
    options = Utils.cloneDeep(options);
    options.fields = attributes;
    const sql = this.queryGenerator.addIndexQuery(tableName, options, rawTablename);
    return await this.sequelize.query(sql, __spreadProps(__spreadValues({}, options), { supportsSearchPath: false }));
  }
  async showIndex(tableName, options) {
    const sql = this.queryGenerator.showIndexesQuery(tableName, options);
    return await this.sequelize.query(sql, __spreadProps(__spreadValues({}, options), { type: QueryTypes.SHOWINDEXES }));
  }
  async getForeignKeysForTables(tableNames, options) {
    if (tableNames.length === 0) {
      return {};
    }
    options = __spreadProps(__spreadValues({}, options), { type: QueryTypes.FOREIGNKEYS });
    const results = await Promise.all(tableNames.map((tableName) => this.sequelize.query(this.queryGenerator.getForeignKeysQuery(tableName, this.sequelize.config.database), options)));
    const result = {};
    tableNames.forEach((tableName, i) => {
      if (_.isObject(tableName)) {
        tableName = `${tableName.schema}.${tableName.tableName}`;
      }
      result[tableName] = Array.isArray(results[i]) ? results[i].map((r) => r.constraint_name) : [results[i] && results[i].constraint_name];
      result[tableName] = result[tableName].filter(_.identity);
    });
    return result;
  }
  async getForeignKeyReferencesForTable(tableName, options) {
    const queryOptions = __spreadProps(__spreadValues({}, options), {
      type: QueryTypes.FOREIGNKEYS
    });
    const query = this.queryGenerator.getForeignKeysQuery(tableName, this.sequelize.config.database);
    return this.sequelize.query(query, queryOptions);
  }
  async removeIndex(tableName, indexNameOrAttributes, options) {
    options = options || {};
    const sql = this.queryGenerator.removeIndexQuery(tableName, indexNameOrAttributes, options);
    return await this.sequelize.query(sql, options);
  }
  async addConstraint(tableName, options) {
    if (!options.fields) {
      throw new Error("Fields must be specified through options.fields");
    }
    if (!options.type) {
      throw new Error("Constraint type must be specified through options.type");
    }
    options = Utils.cloneDeep(options);
    const sql = this.queryGenerator.addConstraintQuery(tableName, options);
    return await this.sequelize.query(sql, options);
  }
  async showConstraint(tableName, constraintName, options) {
    const sql = this.queryGenerator.showConstraintsQuery(tableName, constraintName);
    return await this.sequelize.query(sql, __spreadProps(__spreadValues({}, options), { type: QueryTypes.SHOWCONSTRAINTS }));
  }
  async removeConstraint(tableName, constraintName, options) {
    return this.sequelize.query(this.queryGenerator.removeConstraintQuery(tableName, constraintName), options);
  }
  async insert(instance, tableName, values, options) {
    options = Utils.cloneDeep(options);
    options.hasTrigger = instance && instance.constructor.options.hasTrigger;
    const sql = this.queryGenerator.insertQuery(tableName, values, instance && instance.constructor.rawAttributes, options);
    options.type = QueryTypes.INSERT;
    options.instance = instance;
    const results = await this.sequelize.query(sql, options);
    if (instance)
      results[0].isNewRecord = false;
    return results;
  }
  async upsert(tableName, insertValues, updateValues, where, options) {
    options = __spreadValues({}, options);
    const model = options.model;
    options.type = QueryTypes.UPSERT;
    options.updateOnDuplicate = Object.keys(updateValues);
    options.upsertKeys = options.conflictFields || [];
    if (options.upsertKeys.length === 0) {
      const primaryKeys = Object.values(model.primaryKeys).map((item) => item.field);
      const uniqueKeys = Object.values(model.uniqueKeys).filter((c) => c.fields.length > 0).map((c) => c.fields);
      const indexKeys = Object.values(model._indexes).filter((c) => c.unique && c.fields.length > 0).map((c) => c.fields);
      for (const field of options.updateOnDuplicate) {
        const uniqueKey = uniqueKeys.find((fields) => fields.includes(field));
        if (uniqueKey) {
          options.upsertKeys = uniqueKey;
          break;
        }
        const indexKey = indexKeys.find((fields) => fields.includes(field));
        if (indexKey) {
          options.upsertKeys = indexKey;
          break;
        }
      }
      if (options.upsertKeys.length === 0 || _.intersection(options.updateOnDuplicate, primaryKeys).length) {
        options.upsertKeys = primaryKeys;
      }
      options.upsertKeys = _.uniq(options.upsertKeys);
    }
    const sql = this.queryGenerator.insertQuery(tableName, insertValues, model.rawAttributes, options);
    return await this.sequelize.query(sql, options);
  }
  async bulkInsert(tableName, records, options, attributes) {
    options = __spreadValues({}, options);
    options.type = QueryTypes.INSERT;
    const results = await this.sequelize.query(this.queryGenerator.bulkInsertQuery(tableName, records, options, attributes), options);
    return results[0];
  }
  async update(instance, tableName, values, identifier2, options) {
    options = __spreadValues({}, options);
    options.hasTrigger = instance && instance.constructor.options.hasTrigger;
    const sql = this.queryGenerator.updateQuery(tableName, values, identifier2, options, instance.constructor.rawAttributes);
    options.type = QueryTypes.UPDATE;
    options.instance = instance;
    return await this.sequelize.query(sql, options);
  }
  async bulkUpdate(tableName, values, identifier2, options, attributes) {
    options = Utils.cloneDeep(options);
    if (typeof identifier2 === "object")
      identifier2 = Utils.cloneDeep(identifier2);
    const sql = this.queryGenerator.updateQuery(tableName, values, identifier2, options, attributes);
    const table = _.isObject(tableName) ? tableName : { tableName };
    const model = _.find(this.sequelize.modelManager.models, { tableName: table.tableName });
    options.type = QueryTypes.BULKUPDATE;
    options.model = model;
    return await this.sequelize.query(sql, options);
  }
  async delete(instance, tableName, identifier2, options) {
    const cascades = [];
    const sql = this.queryGenerator.deleteQuery(tableName, identifier2, {}, instance.constructor);
    options = __spreadValues({}, options);
    if (!!instance.constructor && !!instance.constructor.associations) {
      const keys = Object.keys(instance.constructor.associations);
      const length = keys.length;
      let association;
      for (let i = 0; i < length; i++) {
        association = instance.constructor.associations[keys[i]];
        if (association.options && association.options.onDelete && association.options.onDelete.toLowerCase() === "cascade" && association.options.useHooks === true) {
          cascades.push(association.accessors.get);
        }
      }
    }
    for (const cascade of cascades) {
      let instances = await instance[cascade](options);
      if (!instances)
        continue;
      if (!Array.isArray(instances))
        instances = [instances];
      for (const _instance of instances)
        await _instance.destroy(options);
    }
    options.instance = instance;
    return await this.sequelize.query(sql, options);
  }
  async bulkDelete(tableName, where, options, model) {
    options = Utils.cloneDeep(options);
    options = _.defaults(options, { limit: null });
    if (options.truncate === true) {
      return this.sequelize.query(this.queryGenerator.truncateTableQuery(tableName, options), options);
    }
    if (typeof identifier === "object")
      where = Utils.cloneDeep(where);
    return await this.sequelize.query(this.queryGenerator.deleteQuery(tableName, where, options, model), options);
  }
  async select(model, tableName, optionsArg) {
    const options = __spreadProps(__spreadValues({}, optionsArg), { type: QueryTypes.SELECT, model });
    return await this.sequelize.query(this.queryGenerator.selectQuery(tableName, options, model), options);
  }
  async increment(model, tableName, where, incrementAmountsByField, extraAttributesToBeUpdated, options) {
    options = Utils.cloneDeep(options);
    const sql = this.queryGenerator.arithmeticQuery("+", tableName, where, incrementAmountsByField, extraAttributesToBeUpdated, options);
    options.type = QueryTypes.UPDATE;
    options.model = model;
    return await this.sequelize.query(sql, options);
  }
  async decrement(model, tableName, where, incrementAmountsByField, extraAttributesToBeUpdated, options) {
    options = Utils.cloneDeep(options);
    const sql = this.queryGenerator.arithmeticQuery("-", tableName, where, incrementAmountsByField, extraAttributesToBeUpdated, options);
    options.type = QueryTypes.UPDATE;
    options.model = model;
    return await this.sequelize.query(sql, options);
  }
  async rawSelect(tableName, options, attributeSelector, Model) {
    options = Utils.cloneDeep(options);
    options = _.defaults(options, {
      raw: true,
      plain: true,
      type: QueryTypes.SELECT
    });
    const sql = this.queryGenerator.selectQuery(tableName, options, Model);
    if (attributeSelector === void 0) {
      throw new Error("Please pass an attribute selector!");
    }
    const data = await this.sequelize.query(sql, options);
    if (!options.plain) {
      return data;
    }
    const result = data ? data[attributeSelector] : null;
    if (!options || !options.dataType) {
      return result;
    }
    const dataType = options.dataType;
    if (dataType instanceof DataTypes.DECIMAL || dataType instanceof DataTypes.FLOAT) {
      if (result !== null) {
        return parseFloat(result);
      }
    }
    if (dataType instanceof DataTypes.INTEGER || dataType instanceof DataTypes.BIGINT) {
      if (result !== null) {
        return parseInt(result, 10);
      }
    }
    if (dataType instanceof DataTypes.DATE) {
      if (result !== null && !(result instanceof Date)) {
        return new Date(result);
      }
    }
    return result;
  }
  async createTrigger(tableName, triggerName, timingType, fireOnArray, functionName, functionParams, optionsArray, options) {
    const sql = this.queryGenerator.createTrigger(tableName, triggerName, timingType, fireOnArray, functionName, functionParams, optionsArray);
    options = options || {};
    if (sql) {
      return await this.sequelize.query(sql, options);
    }
  }
  async dropTrigger(tableName, triggerName, options) {
    const sql = this.queryGenerator.dropTrigger(tableName, triggerName);
    options = options || {};
    if (sql) {
      return await this.sequelize.query(sql, options);
    }
  }
  async renameTrigger(tableName, oldTriggerName, newTriggerName, options) {
    const sql = this.queryGenerator.renameTrigger(tableName, oldTriggerName, newTriggerName);
    options = options || {};
    if (sql) {
      return await this.sequelize.query(sql, options);
    }
  }
  async createFunction(functionName, params, returnType, language, body, optionsArray, options) {
    const sql = this.queryGenerator.createFunction(functionName, params, returnType, language, body, optionsArray, options);
    options = options || {};
    if (sql) {
      return await this.sequelize.query(sql, options);
    }
  }
  async dropFunction(functionName, params, options) {
    const sql = this.queryGenerator.dropFunction(functionName, params);
    options = options || {};
    if (sql) {
      return await this.sequelize.query(sql, options);
    }
  }
  async renameFunction(oldFunctionName, params, newFunctionName, options) {
    const sql = this.queryGenerator.renameFunction(oldFunctionName, params, newFunctionName);
    options = options || {};
    if (sql) {
      return await this.sequelize.query(sql, options);
    }
  }
  ensureEnums() {
  }
  async setIsolationLevel(transaction, value, options) {
    if (!transaction || !(transaction instanceof Transaction)) {
      throw new Error("Unable to set isolation level for a transaction without transaction object!");
    }
    if (transaction.parent || !value) {
      return;
    }
    options = __spreadProps(__spreadValues({}, options), { transaction: transaction.parent || transaction });
    const sql = this.queryGenerator.setIsolationLevelQuery(value, {
      parent: transaction.parent
    });
    if (!sql)
      return;
    return await this.sequelize.query(sql, options);
  }
  async startTransaction(transaction, options) {
    if (!transaction || !(transaction instanceof Transaction)) {
      throw new Error("Unable to start a transaction without transaction object!");
    }
    options = __spreadProps(__spreadValues({}, options), { transaction: transaction.parent || transaction });
    options.transaction.name = transaction.parent ? transaction.name : void 0;
    const sql = this.queryGenerator.startTransactionQuery(transaction);
    return await this.sequelize.query(sql, options);
  }
  async deferConstraints(transaction, options) {
    options = __spreadProps(__spreadValues({}, options), { transaction: transaction.parent || transaction });
    const sql = this.queryGenerator.deferConstraintsQuery(options);
    if (sql) {
      return await this.sequelize.query(sql, options);
    }
  }
  async commitTransaction(transaction, options) {
    if (!transaction || !(transaction instanceof Transaction)) {
      throw new Error("Unable to commit a transaction without transaction object!");
    }
    if (transaction.parent) {
      return;
    }
    options = __spreadProps(__spreadValues({}, options), {
      transaction: transaction.parent || transaction,
      supportsSearchPath: false,
      completesTransaction: true
    });
    const sql = this.queryGenerator.commitTransactionQuery(transaction);
    const promise = this.sequelize.query(sql, options);
    transaction.finished = "commit";
    return await promise;
  }
  async rollbackTransaction(transaction, options) {
    if (!transaction || !(transaction instanceof Transaction)) {
      throw new Error("Unable to rollback a transaction without transaction object!");
    }
    options = __spreadProps(__spreadValues({}, options), {
      transaction: transaction.parent || transaction,
      supportsSearchPath: false,
      completesTransaction: true
    });
    options.transaction.name = transaction.parent ? transaction.name : void 0;
    const sql = this.queryGenerator.rollbackTransactionQuery(transaction);
    const promise = this.sequelize.query(sql, options);
    transaction.finished = "rollback";
    return await promise;
  }
}
exports.QueryInterface = QueryInterface;
//# sourceMappingURL=query-interface.js.map
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
const _ = require("lodash");
const SqlString = require("../../sql-string");
const QueryTypes = require("../../query-types");
const Dot = require("dottie");
const deprecations = require("../../utils/deprecations");
const uuid = require("uuid").v4;
const { safeStringifyJson } = require("../../utils.js");
class AbstractQuery {
  constructor(connection, sequelize, options) {
    this.uuid = uuid();
    this.connection = connection;
    this.instance = options.instance;
    this.model = options.model;
    this.sequelize = sequelize;
    this.options = __spreadValues({
      plain: false,
      raw: false,
      logging: console.log
    }, options);
    this.checkLoggingOption();
    if (options.rawErrors) {
      this.formatError = AbstractQuery.prototype.formatError;
    }
  }
  static formatBindParameters(sql, values, dialect, replacementFunc, options) {
    if (!values) {
      return [sql, []];
    }
    options = options || {};
    if (typeof replacementFunc !== "function") {
      options = replacementFunc || {};
      replacementFunc = void 0;
    }
    if (!replacementFunc) {
      if (options.skipValueReplace) {
        replacementFunc = (match, key, values2) => {
          if (values2[key] !== void 0) {
            return match;
          }
          return void 0;
        };
      } else {
        replacementFunc = (match, key, values2, timeZone2, dialect2) => {
          if (values2[key] !== void 0) {
            return SqlString.escape(values2[key], timeZone2, dialect2);
          }
          return void 0;
        };
      }
    } else if (options.skipValueReplace) {
      const origReplacementFunc = replacementFunc;
      replacementFunc = (match, key, values2, timeZone2, dialect2, options2) => {
        if (origReplacementFunc(match, key, values2, timeZone2, dialect2, options2) !== void 0) {
          return match;
        }
        return void 0;
      };
    }
    const timeZone = null;
    const list = Array.isArray(values);
    sql = sql.replace(/\B\$(\$|\w+)/g, (match, key) => {
      if (key === "$") {
        return options.skipUnescape ? match : key;
      }
      let replVal;
      if (list) {
        if (key.match(/^[1-9]\d*$/)) {
          key = key - 1;
          replVal = replacementFunc(match, key, values, timeZone, dialect, options);
        }
      } else if (!key.match(/^\d*$/)) {
        replVal = replacementFunc(match, key, values, timeZone, dialect, options);
      }
      if (replVal === void 0) {
        throw new Error(`Named bind parameter "${match}" has no value in the given object.`);
      }
      return replVal;
    });
    return [sql, []];
  }
  formatError(error, errStack) {
    error.stack = errStack;
    return error;
  }
  run() {
    throw new Error("The run method wasn't overwritten!");
  }
  checkLoggingOption() {
    if (this.options.logging === true) {
      deprecations.noTrueLogging();
      this.options.logging = console.log;
    }
  }
  getInsertIdField() {
    return "insertId";
  }
  getUniqueConstraintErrorMessage(field) {
    let message = field ? `${field} must be unique` : "Must be unique";
    if (field && this.model) {
      for (const key of Object.keys(this.model.uniqueKeys)) {
        if (this.model.uniqueKeys[key].fields.includes(field.replace(/"/g, ""))) {
          if (this.model.uniqueKeys[key].msg) {
            message = this.model.uniqueKeys[key].msg;
          }
        }
      }
    }
    return message;
  }
  isRawQuery() {
    return this.options.type === QueryTypes.RAW;
  }
  isVersionQuery() {
    return this.options.type === QueryTypes.VERSION;
  }
  isUpsertQuery() {
    return this.options.type === QueryTypes.UPSERT;
  }
  isInsertQuery(results, metaData) {
    let result = true;
    if (this.options.type === QueryTypes.INSERT) {
      return true;
    }
    result = result && this.sql.toLowerCase().startsWith("insert into");
    result = result && (!results || Object.prototype.hasOwnProperty.call(results, this.getInsertIdField()));
    result = result && (!metaData || Object.prototype.hasOwnProperty.call(metaData, this.getInsertIdField()));
    return result;
  }
  handleInsertQuery(results, metaData) {
    if (this.instance) {
      const autoIncrementAttribute = this.model.autoIncrementAttribute;
      let id = null;
      id = id || results && results[this.getInsertIdField()];
      id = id || metaData && metaData[this.getInsertIdField()];
      this.instance[autoIncrementAttribute] = id;
    }
  }
  isShowTablesQuery() {
    return this.options.type === QueryTypes.SHOWTABLES;
  }
  handleShowTablesQuery(results) {
    return _.flatten(results.map((resultSet) => Object.values(resultSet)));
  }
  isShowIndexesQuery() {
    return this.options.type === QueryTypes.SHOWINDEXES;
  }
  isShowConstraintsQuery() {
    return this.options.type === QueryTypes.SHOWCONSTRAINTS;
  }
  isDescribeQuery() {
    return this.options.type === QueryTypes.DESCRIBE;
  }
  isSelectQuery() {
    return this.options.type === QueryTypes.SELECT;
  }
  isBulkUpdateQuery() {
    return this.options.type === QueryTypes.BULKUPDATE;
  }
  isBulkDeleteQuery() {
    return this.options.type === QueryTypes.BULKDELETE;
  }
  isForeignKeysQuery() {
    return this.options.type === QueryTypes.FOREIGNKEYS;
  }
  isUpdateQuery() {
    return this.options.type === QueryTypes.UPDATE;
  }
  handleSelectQuery(results) {
    let result = null;
    if (this.options.fieldMap) {
      const fieldMap = this.options.fieldMap;
      results = results.map((result2) => _.reduce(fieldMap, (result3, name, field) => {
        if (result3[field] !== void 0 && name !== field) {
          result3[name] = result3[field];
          delete result3[field];
        }
        return result3;
      }, result2));
    }
    if (this.options.raw) {
      result = results.map((result2) => {
        let o = {};
        for (const key in result2) {
          if (Object.prototype.hasOwnProperty.call(result2, key)) {
            o[key] = result2[key];
          }
        }
        if (this.options.nest) {
          o = Dot.transform(o);
        }
        return o;
      });
    } else if (this.options.hasJoin === true) {
      results = AbstractQuery._groupJoinData(results, {
        model: this.model,
        includeMap: this.options.includeMap,
        includeNames: this.options.includeNames
      }, {
        checkExisting: this.options.hasMultiAssociation
      });
      result = this.model.bulkBuild(results, {
        isNewRecord: false,
        include: this.options.include,
        includeNames: this.options.includeNames,
        includeMap: this.options.includeMap,
        includeValidated: true,
        attributes: this.options.originalAttributes || this.options.attributes,
        raw: true
      });
    } else {
      result = this.model.bulkBuild(results, {
        isNewRecord: false,
        raw: true,
        attributes: this.options.originalAttributes || this.options.attributes
      });
    }
    if (this.options.plain) {
      result = result.length === 0 ? null : result[0];
    }
    return result;
  }
  isShowOrDescribeQuery() {
    let result = false;
    result = result || this.sql.toLowerCase().startsWith("show");
    result = result || this.sql.toLowerCase().startsWith("describe");
    return result;
  }
  isCallQuery() {
    return this.sql.toLowerCase().startsWith("call");
  }
  _logQuery(sql, debugContext, parameters) {
    const { connection, options } = this;
    const benchmark = this.sequelize.options.benchmark || options.benchmark;
    const logQueryParameters = this.sequelize.options.logQueryParameters || options.logQueryParameters;
    const startTime = Date.now();
    let logParameter = "";
    if (logQueryParameters && parameters) {
      const delimiter = sql.endsWith(";") ? "" : ";";
      let paramStr;
      if (Array.isArray(parameters)) {
        paramStr = parameters.map((p) => safeStringifyJson(p)).join(", ");
      } else {
        paramStr = safeStringifyJson(parameters);
      }
      logParameter = `${delimiter} ${paramStr}`;
    }
    const fmt = `(${connection.uuid || "default"}): ${sql}${logParameter}`;
    const msg = `Executing ${fmt}`;
    debugContext(msg);
    if (!benchmark) {
      this.sequelize.log(`Executing ${fmt}`, options);
    }
    return () => {
      const afterMsg = `Executed ${fmt}`;
      debugContext(afterMsg);
      if (benchmark) {
        this.sequelize.log(afterMsg, Date.now() - startTime, options);
      }
    };
  }
  static _groupJoinData(rows, includeOptions, options) {
    if (!rows.length) {
      return [];
    }
    let i;
    let length;
    let $i;
    let $length;
    let rowsI;
    let row;
    const rowsLength = rows.length;
    let keys;
    let key;
    let keyI;
    let keyLength;
    let prevKey;
    let values;
    let topValues;
    let topExists;
    const checkExisting = options.checkExisting;
    let itemHash;
    let parentHash;
    let topHash;
    const results = checkExisting ? [] : new Array(rowsLength);
    const resultMap = {};
    const includeMap = {};
    let $keyPrefix;
    let $keyPrefixString;
    let $prevKeyPrefixString;
    let $prevKeyPrefix;
    let $lastKeyPrefix;
    let $current;
    let $parent;
    let previousPiece;
    const buildIncludeMap = (piece) => {
      if (Object.prototype.hasOwnProperty.call($current.includeMap, piece)) {
        includeMap[key] = $current = $current.includeMap[piece];
        if (previousPiece) {
          previousPiece = `${previousPiece}.${piece}`;
        } else {
          previousPiece = piece;
        }
        includeMap[previousPiece] = $current;
      }
    };
    const keyPrefixStringMemo = {};
    const keyPrefixString = (key2, memo) => {
      if (!Object.prototype.hasOwnProperty.call(memo, key2)) {
        memo[key2] = key2.substr(0, key2.lastIndexOf("."));
      }
      return memo[key2];
    };
    const removeKeyPrefixMemo = {};
    const removeKeyPrefix = (key2) => {
      if (!Object.prototype.hasOwnProperty.call(removeKeyPrefixMemo, key2)) {
        const index = key2.lastIndexOf(".");
        removeKeyPrefixMemo[key2] = key2.substr(index === -1 ? 0 : index + 1);
      }
      return removeKeyPrefixMemo[key2];
    };
    const keyPrefixMemo = {};
    const keyPrefix = (key2) => {
      if (!Object.prototype.hasOwnProperty.call(keyPrefixMemo, key2)) {
        const prefixString = keyPrefixString(key2, keyPrefixStringMemo);
        if (!Object.prototype.hasOwnProperty.call(keyPrefixMemo, prefixString)) {
          keyPrefixMemo[prefixString] = prefixString ? prefixString.split(".") : [];
        }
        keyPrefixMemo[key2] = keyPrefixMemo[prefixString];
      }
      return keyPrefixMemo[key2];
    };
    const lastKeyPrefixMemo = {};
    const lastKeyPrefix = (key2) => {
      if (!Object.prototype.hasOwnProperty.call(lastKeyPrefixMemo, key2)) {
        const prefix2 = keyPrefix(key2);
        const length2 = prefix2.length;
        lastKeyPrefixMemo[key2] = !length2 ? "" : prefix2[length2 - 1];
      }
      return lastKeyPrefixMemo[key2];
    };
    const getUniqueKeyAttributes = (model) => {
      let uniqueKeyAttributes2 = _.chain(model.uniqueKeys);
      uniqueKeyAttributes2 = uniqueKeyAttributes2.result(`${uniqueKeyAttributes2.findKey()}.fields`).map((field) => _.findKey(model.attributes, (chr) => chr.field === field)).value();
      return uniqueKeyAttributes2;
    };
    const stringify = (obj) => obj instanceof Buffer ? obj.toString("hex") : obj;
    let primaryKeyAttributes;
    let uniqueKeyAttributes;
    let prefix;
    for (rowsI = 0; rowsI < rowsLength; rowsI++) {
      row = rows[rowsI];
      if (rowsI === 0) {
        keys = Object.keys(row);
        keyLength = keys.length;
      }
      if (checkExisting) {
        topExists = false;
        $length = includeOptions.model.primaryKeyAttributes.length;
        topHash = "";
        if ($length === 1) {
          topHash = stringify(row[includeOptions.model.primaryKeyAttributes[0]]);
        } else if ($length > 1) {
          for ($i = 0; $i < $length; $i++) {
            topHash += stringify(row[includeOptions.model.primaryKeyAttributes[$i]]);
          }
        } else if (!_.isEmpty(includeOptions.model.uniqueKeys)) {
          uniqueKeyAttributes = getUniqueKeyAttributes(includeOptions.model);
          for ($i = 0; $i < uniqueKeyAttributes.length; $i++) {
            topHash += row[uniqueKeyAttributes[$i]];
          }
        }
      }
      topValues = values = {};
      $prevKeyPrefix = void 0;
      for (keyI = 0; keyI < keyLength; keyI++) {
        key = keys[keyI];
        $keyPrefixString = keyPrefixString(key, keyPrefixStringMemo);
        $keyPrefix = keyPrefix(key);
        if (rowsI === 0 && !Object.prototype.hasOwnProperty.call(includeMap, key)) {
          if (!$keyPrefix.length) {
            includeMap[key] = includeMap[""] = includeOptions;
          } else {
            $current = includeOptions;
            previousPiece = void 0;
            $keyPrefix.forEach(buildIncludeMap);
          }
        }
        if ($prevKeyPrefix !== void 0 && $prevKeyPrefix !== $keyPrefix) {
          if (checkExisting) {
            length = $prevKeyPrefix.length;
            $parent = null;
            parentHash = null;
            if (length) {
              for (i = 0; i < length; i++) {
                prefix = $parent ? `${$parent}.${$prevKeyPrefix[i]}` : $prevKeyPrefix[i];
                primaryKeyAttributes = includeMap[prefix].model.primaryKeyAttributes;
                $length = primaryKeyAttributes.length;
                itemHash = prefix;
                if ($length === 1) {
                  itemHash += stringify(row[`${prefix}.${primaryKeyAttributes[0]}`]);
                } else if ($length > 1) {
                  for ($i = 0; $i < $length; $i++) {
                    itemHash += stringify(row[`${prefix}.${primaryKeyAttributes[$i]}`]);
                  }
                } else if (!_.isEmpty(includeMap[prefix].model.uniqueKeys)) {
                  uniqueKeyAttributes = getUniqueKeyAttributes(includeMap[prefix].model);
                  for ($i = 0; $i < uniqueKeyAttributes.length; $i++) {
                    itemHash += row[`${prefix}.${uniqueKeyAttributes[$i]}`];
                  }
                }
                if (!parentHash) {
                  parentHash = topHash;
                }
                itemHash = parentHash + itemHash;
                $parent = prefix;
                if (i < length - 1) {
                  parentHash = itemHash;
                }
              }
            } else {
              itemHash = topHash;
            }
            if (itemHash === topHash) {
              if (!resultMap[itemHash]) {
                resultMap[itemHash] = values;
              } else {
                topExists = true;
              }
            } else if (!resultMap[itemHash]) {
              $parent = resultMap[parentHash];
              $lastKeyPrefix = lastKeyPrefix(prevKey);
              if (includeMap[prevKey].association.isSingleAssociation) {
                if ($parent) {
                  $parent[$lastKeyPrefix] = resultMap[itemHash] = values;
                }
              } else {
                if (!$parent[$lastKeyPrefix]) {
                  $parent[$lastKeyPrefix] = [];
                }
                $parent[$lastKeyPrefix].push(resultMap[itemHash] = values);
              }
            }
            values = {};
          } else {
            $current = topValues;
            length = $keyPrefix.length;
            if (length) {
              for (i = 0; i < length; i++) {
                if (i === length - 1) {
                  values = $current[$keyPrefix[i]] = {};
                }
                $current = $current[$keyPrefix[i]] || {};
              }
            }
          }
        }
        values[removeKeyPrefix(key)] = row[key];
        prevKey = key;
        $prevKeyPrefix = $keyPrefix;
        $prevKeyPrefixString = $keyPrefixString;
      }
      if (checkExisting) {
        length = $prevKeyPrefix.length;
        $parent = null;
        parentHash = null;
        if (length) {
          for (i = 0; i < length; i++) {
            prefix = $parent ? `${$parent}.${$prevKeyPrefix[i]}` : $prevKeyPrefix[i];
            primaryKeyAttributes = includeMap[prefix].model.primaryKeyAttributes;
            $length = primaryKeyAttributes.length;
            itemHash = prefix;
            if ($length === 1) {
              itemHash += stringify(row[`${prefix}.${primaryKeyAttributes[0]}`]);
            } else if ($length > 0) {
              for ($i = 0; $i < $length; $i++) {
                itemHash += stringify(row[`${prefix}.${primaryKeyAttributes[$i]}`]);
              }
            } else if (!_.isEmpty(includeMap[prefix].model.uniqueKeys)) {
              uniqueKeyAttributes = getUniqueKeyAttributes(includeMap[prefix].model);
              for ($i = 0; $i < uniqueKeyAttributes.length; $i++) {
                itemHash += row[`${prefix}.${uniqueKeyAttributes[$i]}`];
              }
            }
            if (!parentHash) {
              parentHash = topHash;
            }
            itemHash = parentHash + itemHash;
            $parent = prefix;
            if (i < length - 1) {
              parentHash = itemHash;
            }
          }
        } else {
          itemHash = topHash;
        }
        if (itemHash === topHash) {
          if (!resultMap[itemHash]) {
            resultMap[itemHash] = values;
          } else {
            topExists = true;
          }
        } else if (!resultMap[itemHash]) {
          $parent = resultMap[parentHash];
          $lastKeyPrefix = lastKeyPrefix(prevKey);
          if (includeMap[prevKey].association.isSingleAssociation) {
            if ($parent) {
              $parent[$lastKeyPrefix] = resultMap[itemHash] = values;
            }
          } else {
            if (!$parent[$lastKeyPrefix]) {
              $parent[$lastKeyPrefix] = [];
            }
            $parent[$lastKeyPrefix].push(resultMap[itemHash] = values);
          }
        }
        if (!topExists) {
          results.push(topValues);
        }
      } else {
        results[rowsI] = topValues;
      }
    }
    return results;
  }
}
module.exports = AbstractQuery;
module.exports.AbstractQuery = AbstractQuery;
module.exports.default = AbstractQuery;
//# sourceMappingURL=query.js.map
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
const _ = require("lodash");
const Op = require("../../../operators");
const Utils = require("../../../utils");
const OperatorHelpers = {
  OperatorMap: {
    [Op.eq]: "=",
    [Op.ne]: "!=",
    [Op.gte]: ">=",
    [Op.gt]: ">",
    [Op.lte]: "<=",
    [Op.lt]: "<",
    [Op.not]: "IS NOT",
    [Op.is]: "IS",
    [Op.in]: "IN",
    [Op.notIn]: "NOT IN",
    [Op.like]: "LIKE",
    [Op.notLike]: "NOT LIKE",
    [Op.iLike]: "ILIKE",
    [Op.notILike]: "NOT ILIKE",
    [Op.startsWith]: "LIKE",
    [Op.endsWith]: "LIKE",
    [Op.substring]: "LIKE",
    [Op.regexp]: "~",
    [Op.notRegexp]: "!~",
    [Op.iRegexp]: "~*",
    [Op.notIRegexp]: "!~*",
    [Op.between]: "BETWEEN",
    [Op.notBetween]: "NOT BETWEEN",
    [Op.overlap]: "&&",
    [Op.contains]: "@>",
    [Op.contained]: "<@",
    [Op.adjacent]: "-|-",
    [Op.strictLeft]: "<<",
    [Op.strictRight]: ">>",
    [Op.noExtendRight]: "&<",
    [Op.noExtendLeft]: "&>",
    [Op.any]: "ANY",
    [Op.all]: "ALL",
    [Op.and]: " AND ",
    [Op.or]: " OR ",
    [Op.col]: "COL",
    [Op.placeholder]: "$$PLACEHOLDER$$",
    [Op.match]: "@@"
  },
  OperatorsAliasMap: {},
  setOperatorsAliases(aliases) {
    if (!aliases || _.isEmpty(aliases)) {
      this.OperatorsAliasMap = false;
    } else {
      this.OperatorsAliasMap = __spreadValues({}, aliases);
    }
  },
  _replaceAliases(orig) {
    const obj = {};
    if (!this.OperatorsAliasMap) {
      return orig;
    }
    Utils.getOperators(orig).forEach((op) => {
      const item = orig[op];
      if (_.isPlainObject(item)) {
        obj[op] = this._replaceAliases(item);
      } else {
        obj[op] = item;
      }
    });
    _.forOwn(orig, (item, prop) => {
      prop = this.OperatorsAliasMap[prop] || prop;
      if (_.isPlainObject(item)) {
        item = this._replaceAliases(item);
      }
      obj[prop] = item;
    });
    return obj;
  }
};
module.exports = OperatorHelpers;
//# sourceMappingURL=operators.js.map
"use strict";
const uuidv4 = require("uuid").v4;
const TransactionQueries = {
  setIsolationLevelQuery(value, options) {
    if (options.parent) {
      return;
    }
    return `SET TRANSACTION ISOLATION LEVEL ${value};`;
  },
  generateTransactionId() {
    return uuidv4();
  },
  startTransactionQuery(transaction) {
    if (transaction.parent) {
      return `SAVEPOINT ${this.quoteIdentifier(transaction.name, true)};`;
    }
    return "START TRANSACTION;";
  },
  deferConstraintsQuery() {
  },
  setConstraintQuery() {
  },
  setDeferredQuery() {
  },
  setImmediateQuery() {
  },
  commitTransactionQuery(transaction) {
    if (transaction.parent) {
      return;
    }
    return "COMMIT;";
  },
  rollbackTransactionQuery(transaction) {
    if (transaction.parent) {
      return `ROLLBACK TO SAVEPOINT ${this.quoteIdentifier(transaction.name, true)};`;
    }
    return "ROLLBACK;";
  }
};
module.exports = TransactionQueries;
//# sourceMappingURL=transaction.js.map
"use strict";
const { AssociationError } = require("./../errors");
class Association {
  constructor(source, target, options = {}) {
    this.source = source;
    this.target = target;
    this.options = options;
    this.scope = options.scope;
    this.isSelfAssociation = this.source === this.target;
    this.as = options.as;
    this.associationType = "";
    if (source.hasAlias(options.as)) {
      throw new AssociationError(`You have used the alias ${options.as} in two separate associations. Aliased associations must have unique aliases.`);
    }
  }
  toInstanceArray(input) {
    if (!Array.isArray(input)) {
      input = [input];
    }
    return input.map((element) => {
      if (element instanceof this.target)
        return element;
      const tmpInstance = {};
      tmpInstance[this.target.primaryKeyAttribute] = element;
      return this.target.build(tmpInstance, { isNewRecord: false });
    });
  }
  [Symbol.for("nodejs.util.inspect.custom")]() {
    return this.as;
  }
}
module.exports = Association;
//# sourceMappingURL=base.js.map
"use strict";
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
const Utils = require("./../utils");
const Helpers = require("./helpers");
const _ = require("lodash");
const Association = require("./base");
const BelongsTo = require("./belongs-to");
const HasMany = require("./has-many");
const HasOne = require("./has-one");
const AssociationError = require("../errors").AssociationError;
const EmptyResultError = require("../errors").EmptyResultError;
const Op = require("../operators");
class BelongsToMany extends Association {
  constructor(source, target, options) {
    super(source, target, options);
    if (this.options.through === void 0 || this.options.through === true || this.options.through === null) {
      throw new AssociationError(`${source.name}.belongsToMany(${target.name}) requires through option, pass either a string or a model`);
    }
    if (!this.options.through.model) {
      this.options.through = {
        model: options.through
      };
    }
    this.associationType = "BelongsToMany";
    this.targetAssociation = null;
    this.sequelize = source.sequelize;
    this.through = __spreadValues({}, this.options.through);
    this.isMultiAssociation = true;
    this.doubleLinked = false;
    if (!this.as && this.isSelfAssociation) {
      throw new AssociationError("'as' must be defined for many-to-many self-associations");
    }
    if (this.as) {
      this.isAliased = true;
      if (_.isPlainObject(this.as)) {
        this.options.name = this.as;
        this.as = this.as.plural;
      } else {
        this.options.name = {
          plural: this.as,
          singular: Utils.singularize(this.as)
        };
      }
    } else {
      this.as = this.target.options.name.plural;
      this.options.name = this.target.options.name;
    }
    this.combinedTableName = Utils.combineTableNames(this.source.tableName, this.isSelfAssociation ? this.as || this.target.tableName : this.target.tableName);
    if (this.isSelfAssociation) {
      this.targetAssociation = this;
    }
    _.each(this.target.associations, (association) => {
      if (association.associationType !== "BelongsToMany")
        return;
      if (association.target !== this.source)
        return;
      if (this.options.through.model === association.options.through.model) {
        this.paired = association;
        association.paired = this;
      }
    });
    this.sourceKey = this.options.sourceKey || this.source.primaryKeyAttribute;
    this.sourceKeyField = this.source.rawAttributes[this.sourceKey].field || this.sourceKey;
    if (this.options.targetKey) {
      this.targetKey = this.options.targetKey;
      this.targetKeyField = this.target.rawAttributes[this.targetKey].field || this.targetKey;
    } else {
      this.targetKeyDefault = true;
      this.targetKey = this.target.primaryKeyAttribute;
      this.targetKeyField = this.target.rawAttributes[this.targetKey].field || this.targetKey;
    }
    this._createForeignAndOtherKeys();
    if (typeof this.through.model === "string") {
      if (!this.sequelize.isDefined(this.through.model)) {
        this.through.model = this.sequelize.define(this.through.model, {}, Object.assign(this.options, {
          tableName: this.through.model,
          indexes: [],
          paranoid: this.through.paranoid ? this.through.paranoid : false,
          validate: {}
        }));
      } else {
        this.through.model = this.sequelize.model(this.through.model);
      }
    }
    Object.assign(this.options, _.pick(this.through.model.options, [
      "timestamps",
      "createdAt",
      "updatedAt",
      "deletedAt",
      "paranoid"
    ]));
    if (this.paired) {
      let needInjectPaired = false;
      if (this.targetKeyDefault) {
        this.targetKey = this.paired.sourceKey;
        this.targetKeyField = this.paired.sourceKeyField;
        this._createForeignAndOtherKeys();
      }
      if (this.paired.targetKeyDefault) {
        if (this.paired.targetKey !== this.sourceKey) {
          delete this.through.model.rawAttributes[this.paired.otherKey];
          this.paired.targetKey = this.sourceKey;
          this.paired.targetKeyField = this.sourceKeyField;
          this.paired._createForeignAndOtherKeys();
          needInjectPaired = true;
        }
      }
      if (this.otherKeyDefault) {
        this.otherKey = this.paired.foreignKey;
      }
      if (this.paired.otherKeyDefault) {
        if (this.paired.otherKey !== this.foreignKey) {
          delete this.through.model.rawAttributes[this.paired.otherKey];
          this.paired.otherKey = this.foreignKey;
          needInjectPaired = true;
        }
      }
      if (needInjectPaired) {
        this.paired._injectAttributes();
      }
    }
    if (this.through) {
      this.throughModel = this.through.model;
    }
    this.options.tableName = this.combinedName = this.through.model === Object(this.through.model) ? this.through.model.tableName : this.through.model;
    this.associationAccessor = this.as;
    const plural = _.upperFirst(this.options.name.plural);
    const singular = _.upperFirst(this.options.name.singular);
    this.accessors = {
      get: `get${plural}`,
      set: `set${plural}`,
      addMultiple: `add${plural}`,
      add: `add${singular}`,
      create: `create${singular}`,
      remove: `remove${singular}`,
      removeMultiple: `remove${plural}`,
      hasSingle: `has${singular}`,
      hasAll: `has${plural}`,
      count: `count${plural}`
    };
  }
  _createForeignAndOtherKeys() {
    if (_.isObject(this.options.foreignKey)) {
      this.foreignKeyAttribute = this.options.foreignKey;
      this.foreignKey = this.foreignKeyAttribute.name || this.foreignKeyAttribute.fieldName;
    } else {
      this.foreignKeyAttribute = {};
      this.foreignKey = this.options.foreignKey || Utils.camelize([
        this.source.options.name.singular,
        this.sourceKey
      ].join("_"));
    }
    if (_.isObject(this.options.otherKey)) {
      this.otherKeyAttribute = this.options.otherKey;
      this.otherKey = this.otherKeyAttribute.name || this.otherKeyAttribute.fieldName;
    } else {
      if (!this.options.otherKey) {
        this.otherKeyDefault = true;
      }
      this.otherKeyAttribute = {};
      this.otherKey = this.options.otherKey || Utils.camelize([
        this.isSelfAssociation ? Utils.singularize(this.as) : this.target.options.name.singular,
        this.targetKey
      ].join("_"));
    }
  }
  _injectAttributes() {
    this.identifier = this.foreignKey;
    this.foreignIdentifier = this.otherKey;
    _.each(this.through.model.rawAttributes, (attribute, attributeName) => {
      if (attribute.primaryKey === true && attribute._autoGenerated === true) {
        if ([this.foreignKey, this.otherKey].includes(attributeName)) {
          attribute.primaryKey = false;
        } else {
          delete this.through.model.rawAttributes[attributeName];
        }
        this.primaryKeyDeleted = true;
      }
    });
    const sourceKey = this.source.rawAttributes[this.sourceKey];
    const sourceKeyType = sourceKey.type;
    const sourceKeyField = this.sourceKeyField;
    const targetKey = this.target.rawAttributes[this.targetKey];
    const targetKeyType = targetKey.type;
    const targetKeyField = this.targetKeyField;
    const sourceAttribute = __spreadValues({ type: sourceKeyType }, this.foreignKeyAttribute);
    const targetAttribute = __spreadValues({ type: targetKeyType }, this.otherKeyAttribute);
    if (this.primaryKeyDeleted === true) {
      targetAttribute.primaryKey = sourceAttribute.primaryKey = true;
    } else if (this.through.unique !== false) {
      let uniqueKey;
      if (typeof this.options.uniqueKey === "string" && this.options.uniqueKey !== "") {
        uniqueKey = this.options.uniqueKey;
      } else {
        uniqueKey = [this.through.model.tableName, this.foreignKey, this.otherKey, "unique"].join("_");
      }
      targetAttribute.unique = sourceAttribute.unique = uniqueKey;
    }
    if (!this.through.model.rawAttributes[this.foreignKey]) {
      this.through.model.rawAttributes[this.foreignKey] = {
        _autoGenerated: true
      };
    }
    if (!this.through.model.rawAttributes[this.otherKey]) {
      this.through.model.rawAttributes[this.otherKey] = {
        _autoGenerated: true
      };
    }
    if (this.options.constraints !== false) {
      sourceAttribute.references = {
        model: this.source.getTableName(),
        key: sourceKeyField
      };
      sourceAttribute.onDelete = this.options.onDelete || this.through.model.rawAttributes[this.foreignKey].onDelete;
      sourceAttribute.onUpdate = this.options.onUpdate || this.through.model.rawAttributes[this.foreignKey].onUpdate;
      if (!sourceAttribute.onDelete)
        sourceAttribute.onDelete = "CASCADE";
      if (!sourceAttribute.onUpdate)
        sourceAttribute.onUpdate = "CASCADE";
      targetAttribute.references = {
        model: this.target.getTableName(),
        key: targetKeyField
      };
      targetAttribute.onDelete = this.through.model.rawAttributes[this.otherKey].onDelete || this.options.onDelete;
      targetAttribute.onUpdate = this.through.model.rawAttributes[this.otherKey].onUpdate || this.options.onUpdate;
      if (!targetAttribute.onDelete)
        targetAttribute.onDelete = "CASCADE";
      if (!targetAttribute.onUpdate)
        targetAttribute.onUpdate = "CASCADE";
    }
    Object.assign(this.through.model.rawAttributes[this.foreignKey], sourceAttribute);
    Object.assign(this.through.model.rawAttributes[this.otherKey], targetAttribute);
    this.through.model.refreshAttributes();
    this.identifierField = this.through.model.rawAttributes[this.foreignKey].field || this.foreignKey;
    this.foreignIdentifierField = this.through.model.rawAttributes[this.otherKey].field || this.otherKey;
    if (this.options.sequelize.options.dialect === "db2" && this.source.rawAttributes[this.sourceKey].primaryKey !== true) {
      this.source.rawAttributes[this.sourceKey].unique = true;
    }
    if (this.paired && !this.paired.foreignIdentifierField) {
      this.paired.foreignIdentifierField = this.through.model.rawAttributes[this.paired.otherKey].field || this.paired.otherKey;
    }
    this.toSource = new BelongsTo(this.through.model, this.source, {
      foreignKey: this.foreignKey
    });
    this.manyFromSource = new HasMany(this.source, this.through.model, {
      foreignKey: this.foreignKey
    });
    this.oneFromSource = new HasOne(this.source, this.through.model, {
      foreignKey: this.foreignKey,
      sourceKey: this.sourceKey,
      as: this.through.model.name
    });
    this.toTarget = new BelongsTo(this.through.model, this.target, {
      foreignKey: this.otherKey
    });
    this.manyFromTarget = new HasMany(this.target, this.through.model, {
      foreignKey: this.otherKey
    });
    this.oneFromTarget = new HasOne(this.target, this.through.model, {
      foreignKey: this.otherKey,
      sourceKey: this.targetKey,
      as: this.through.model.name
    });
    if (this.paired && this.paired.otherKeyDefault) {
      this.paired.toTarget = new BelongsTo(this.paired.through.model, this.paired.target, {
        foreignKey: this.paired.otherKey
      });
      this.paired.oneFromTarget = new HasOne(this.paired.target, this.paired.through.model, {
        foreignKey: this.paired.otherKey,
        sourceKey: this.paired.targetKey,
        as: this.paired.through.model.name
      });
    }
    Helpers.checkNamingCollision(this);
    return this;
  }
  mixin(obj) {
    const methods = ["get", "count", "hasSingle", "hasAll", "set", "add", "addMultiple", "remove", "removeMultiple", "create"];
    const aliases = {
      hasSingle: "has",
      hasAll: "has",
      addMultiple: "add",
      removeMultiple: "remove"
    };
    Helpers.mixinMethods(this, obj, methods, aliases);
  }
  async get(instance, options) {
    options = Utils.cloneDeep(options) || {};
    const through = this.through;
    let scopeWhere;
    let throughWhere;
    if (this.scope) {
      scopeWhere = __spreadValues({}, this.scope);
    }
    options.where = {
      [Op.and]: [
        scopeWhere,
        options.where
      ]
    };
    if (Object(through.model) === through.model) {
      throughWhere = {};
      throughWhere[this.foreignKey] = instance.get(this.sourceKey);
      if (through.scope) {
        Object.assign(throughWhere, through.scope);
      }
      if (options.through && options.through.where) {
        throughWhere = {
          [Op.and]: [throughWhere, options.through.where]
        };
      }
      options.include = options.include || [];
      options.include.push({
        association: this.oneFromTarget,
        attributes: options.joinTableAttributes,
        required: true,
        paranoid: _.get(options.through, "paranoid", true),
        where: throughWhere
      });
    }
    let model = this.target;
    if (Object.prototype.hasOwnProperty.call(options, "scope")) {
      if (!options.scope) {
        model = model.unscoped();
      } else {
        model = model.scope(options.scope);
      }
    }
    if (Object.prototype.hasOwnProperty.call(options, "schema")) {
      model = model.schema(options.schema, options.schemaDelimiter);
    }
    return model.findAll(options);
  }
  async count(instance, options) {
    const sequelize = this.target.sequelize;
    options = Utils.cloneDeep(options);
    options.attributes = [
      [sequelize.fn("COUNT", sequelize.col([this.target.name, this.targetKeyField].join("."))), "count"]
    ];
    options.joinTableAttributes = [];
    options.raw = true;
    options.plain = true;
    const result = await this.get(instance, options);
    return parseInt(result.count, 10);
  }
  async has(sourceInstance, instances, options) {
    if (!Array.isArray(instances)) {
      instances = [instances];
    }
    options = __spreadProps(__spreadValues({
      raw: true
    }, options), {
      scope: false,
      attributes: [this.targetKey],
      joinTableAttributes: []
    });
    const instancePrimaryKeys = instances.map((instance) => {
      if (instance instanceof this.target) {
        return instance.where();
      }
      return {
        [this.targetKey]: instance
      };
    });
    options.where = {
      [Op.and]: [
        { [Op.or]: instancePrimaryKeys },
        options.where
      ]
    };
    const associatedObjects = await this.get(sourceInstance, options);
    return _.differenceWith(instancePrimaryKeys, associatedObjects, (a, b) => _.isEqual(a[this.targetKey], b[this.targetKey])).length === 0;
  }
  async set(sourceInstance, newAssociatedObjects, options) {
    options = options || {};
    const sourceKey = this.sourceKey;
    const targetKey = this.targetKey;
    const identifier = this.identifier;
    const foreignIdentifier = this.foreignIdentifier;
    if (newAssociatedObjects === null) {
      newAssociatedObjects = [];
    } else {
      newAssociatedObjects = this.toInstanceArray(newAssociatedObjects);
    }
    const where = __spreadValues({
      [identifier]: sourceInstance.get(sourceKey)
    }, this.through.scope);
    const updateAssociations = (currentRows) => {
      const obsoleteAssociations = [];
      const promises = [];
      const defaultAttributes = options.through || {};
      const unassociatedObjects = newAssociatedObjects.filter((obj) => !currentRows.some((currentRow) => currentRow[foreignIdentifier] === obj.get(targetKey)));
      for (const currentRow of currentRows) {
        const newObj = newAssociatedObjects.find((obj) => currentRow[foreignIdentifier] === obj.get(targetKey));
        if (!newObj) {
          obsoleteAssociations.push(currentRow);
        } else {
          let throughAttributes = newObj[this.through.model.name];
          if (throughAttributes instanceof this.through.model) {
            throughAttributes = {};
          }
          const attributes = __spreadValues(__spreadValues({}, defaultAttributes), throughAttributes);
          if (Object.keys(attributes).length) {
            promises.push(this.through.model.update(attributes, Object.assign(options, {
              where: {
                [identifier]: sourceInstance.get(sourceKey),
                [foreignIdentifier]: newObj.get(targetKey)
              }
            })));
          }
        }
      }
      if (obsoleteAssociations.length > 0) {
        promises.push(this.through.model.destroy(__spreadProps(__spreadValues({}, options), {
          where: __spreadValues({
            [identifier]: sourceInstance.get(sourceKey),
            [foreignIdentifier]: obsoleteAssociations.map((obsoleteAssociation) => obsoleteAssociation[foreignIdentifier])
          }, this.through.scope)
        })));
      }
      if (unassociatedObjects.length > 0) {
        const bulk = unassociatedObjects.map((unassociatedObject) => {
          return __spreadValues(__spreadProps(__spreadValues(__spreadValues({}, defaultAttributes), unassociatedObject[this.through.model.name]), {
            [identifier]: sourceInstance.get(sourceKey),
            [foreignIdentifier]: unassociatedObject.get(targetKey)
          }), this.through.scope);
        });
        promises.push(this.through.model.bulkCreate(bulk, __spreadValues({ validate: true }, options)));
      }
      return Promise.all(promises);
    };
    try {
      const currentRows = await this.through.model.findAll(__spreadProps(__spreadValues({}, options), { where, raw: true }));
      return await updateAssociations(currentRows);
    } catch (error) {
      if (error instanceof EmptyResultError)
        return updateAssociations([]);
      throw error;
    }
  }
  async add(sourceInstance, newInstances, options) {
    if (!newInstances)
      return Promise.resolve();
    options = __spreadValues({}, options);
    const association = this;
    const sourceKey = association.sourceKey;
    const targetKey = association.targetKey;
    const identifier = association.identifier;
    const foreignIdentifier = association.foreignIdentifier;
    const defaultAttributes = options.through || {};
    newInstances = association.toInstanceArray(newInstances);
    const where = __spreadValues({
      [identifier]: sourceInstance.get(sourceKey),
      [foreignIdentifier]: newInstances.map((newInstance) => newInstance.get(targetKey))
    }, association.through.scope);
    const updateAssociations = (currentRows) => {
      const promises = [];
      const unassociatedObjects = [];
      const changedAssociations = [];
      for (const obj of newInstances) {
        const existingAssociation = currentRows && currentRows.find((current) => current[foreignIdentifier] === obj.get(targetKey));
        if (!existingAssociation) {
          unassociatedObjects.push(obj);
        } else {
          const throughAttributes = obj[association.through.model.name];
          const attributes = __spreadValues(__spreadValues({}, defaultAttributes), throughAttributes);
          if (Object.keys(attributes).some((attribute) => attributes[attribute] !== existingAssociation[attribute])) {
            changedAssociations.push(obj);
          }
        }
      }
      if (unassociatedObjects.length > 0) {
        const bulk = unassociatedObjects.map((unassociatedObject) => {
          const throughAttributes = unassociatedObject[association.through.model.name];
          const attributes = __spreadValues(__spreadValues({}, defaultAttributes), throughAttributes);
          attributes[identifier] = sourceInstance.get(sourceKey);
          attributes[foreignIdentifier] = unassociatedObject.get(targetKey);
          Object.assign(attributes, association.through.scope);
          return attributes;
        });
        promises.push(association.through.model.bulkCreate(bulk, __spreadValues({ validate: true }, options)));
      }
      for (const assoc of changedAssociations) {
        let throughAttributes = assoc[association.through.model.name];
        const attributes = __spreadValues(__spreadValues({}, defaultAttributes), throughAttributes);
        if (throughAttributes instanceof association.through.model) {
          throughAttributes = {};
        }
        promises.push(association.through.model.update(attributes, Object.assign(options, { where: {
          [identifier]: sourceInstance.get(sourceKey),
          [foreignIdentifier]: assoc.get(targetKey)
        } })));
      }
      return Promise.all(promises);
    };
    try {
      const currentRows = await association.through.model.findAll(__spreadProps(__spreadValues({}, options), { where, raw: true }));
      const [associations] = await updateAssociations(currentRows);
      return associations;
    } catch (error) {
      if (error instanceof EmptyResultError)
        return updateAssociations();
      throw error;
    }
  }
  remove(sourceInstance, oldAssociatedObjects, options) {
    const association = this;
    options = options || {};
    oldAssociatedObjects = association.toInstanceArray(oldAssociatedObjects);
    const where = {
      [association.identifier]: sourceInstance.get(association.sourceKey),
      [association.foreignIdentifier]: oldAssociatedObjects.map((newInstance) => newInstance.get(association.targetKey))
    };
    return association.through.model.destroy(__spreadProps(__spreadValues({}, options), { where }));
  }
  async create(sourceInstance, values, options) {
    const association = this;
    options = options || {};
    values = values || {};
    if (Array.isArray(options)) {
      options = {
        fields: options
      };
    }
    if (association.scope) {
      Object.assign(values, association.scope);
      if (options.fields) {
        options.fields = options.fields.concat(Object.keys(association.scope));
      }
    }
    const newAssociatedObject = await association.target.create(values, options);
    await sourceInstance[association.accessors.add](newAssociatedObject, _.omit(options, ["fields"]));
    return newAssociatedObject;
  }
  verifyAssociationAlias(alias) {
    if (typeof alias === "string") {
      return this.as === alias;
    }
    if (alias && alias.plural) {
      return this.as === alias.plural;
    }
    return !this.isAliased;
  }
}
module.exports = BelongsToMany;
module.exports.BelongsToMany = BelongsToMany;
module.exports.default = BelongsToMany;
//# sourceMappingURL=belongs-to-many.js.map
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
const Utils = require("./../utils");
const Helpers = require("./helpers");
const _ = require("lodash");
const Association = require("./base");
const Op = require("../operators");
class BelongsTo extends Association {
  constructor(source, target, options) {
    super(source, target, options);
    this.associationType = "BelongsTo";
    this.isSingleAssociation = true;
    this.foreignKeyAttribute = {};
    if (this.as) {
      this.isAliased = true;
      this.options.name = {
        singular: this.as
      };
    } else {
      this.as = this.target.options.name.singular;
      this.options.name = this.target.options.name;
    }
    if (_.isObject(this.options.foreignKey)) {
      this.foreignKeyAttribute = this.options.foreignKey;
      this.foreignKey = this.foreignKeyAttribute.name || this.foreignKeyAttribute.fieldName;
    } else if (this.options.foreignKey) {
      this.foreignKey = this.options.foreignKey;
    }
    if (!this.foreignKey) {
      this.foreignKey = Utils.camelize([
        this.as,
        this.target.primaryKeyAttribute
      ].join("_"));
    }
    this.identifier = this.foreignKey;
    if (this.source.rawAttributes[this.identifier]) {
      this.identifierField = this.source.rawAttributes[this.identifier].field || this.identifier;
    }
    if (this.options.targetKey && !this.target.rawAttributes[this.options.targetKey]) {
      throw new Error(`Unknown attribute "${this.options.targetKey}" passed as targetKey, define this attribute on model "${this.target.name}" first`);
    }
    this.targetKey = this.options.targetKey || this.target.primaryKeyAttribute;
    this.targetKeyField = this.target.rawAttributes[this.targetKey].field || this.targetKey;
    this.targetKeyIsPrimary = this.targetKey === this.target.primaryKeyAttribute;
    this.targetIdentifier = this.targetKey;
    this.associationAccessor = this.as;
    this.options.useHooks = options.useHooks;
    const singular = _.upperFirst(this.options.name.singular);
    this.accessors = {
      get: `get${singular}`,
      set: `set${singular}`,
      create: `create${singular}`
    };
  }
  _injectAttributes() {
    const newAttributes = {
      [this.foreignKey]: __spreadValues({
        type: this.options.keyType || this.target.rawAttributes[this.targetKey].type,
        allowNull: true
      }, this.foreignKeyAttribute)
    };
    if (this.options.constraints !== false) {
      const source = this.source.rawAttributes[this.foreignKey] || newAttributes[this.foreignKey];
      this.options.onDelete = this.options.onDelete || (source.allowNull ? "SET NULL" : "NO ACTION");
      this.options.onUpdate = this.options.onUpdate || "CASCADE";
    }
    Helpers.addForeignKeyConstraints(newAttributes[this.foreignKey], this.target, this.source, this.options, this.targetKeyField);
    Utils.mergeDefaults(this.source.rawAttributes, newAttributes);
    this.source.refreshAttributes();
    this.identifierField = this.source.rawAttributes[this.foreignKey].field || this.foreignKey;
    Helpers.checkNamingCollision(this);
    return this;
  }
  mixin(obj) {
    const methods = ["get", "set", "create"];
    Helpers.mixinMethods(this, obj, methods);
  }
  async get(instances, options) {
    const where = {};
    let Target = this.target;
    let instance;
    options = Utils.cloneDeep(options);
    if (Object.prototype.hasOwnProperty.call(options, "scope")) {
      if (!options.scope) {
        Target = Target.unscoped();
      } else {
        Target = Target.scope(options.scope);
      }
    }
    if (Object.prototype.hasOwnProperty.call(options, "schema")) {
      Target = Target.schema(options.schema, options.schemaDelimiter);
    }
    if (!Array.isArray(instances)) {
      instance = instances;
      instances = void 0;
    }
    if (instances) {
      where[this.targetKey] = {
        [Op.in]: instances.map((_instance) => _instance.get(this.foreignKey))
      };
    } else {
      if (this.targetKeyIsPrimary && !options.where) {
        return Target.findByPk(instance.get(this.foreignKey), options);
      }
      where[this.targetKey] = instance.get(this.foreignKey);
      options.limit = null;
    }
    options.where = options.where ? { [Op.and]: [where, options.where] } : where;
    if (instances) {
      const results = await Target.findAll(options);
      const result = {};
      for (const _instance of instances) {
        result[_instance.get(this.foreignKey, { raw: true })] = null;
      }
      for (const _instance of results) {
        result[_instance.get(this.targetKey, { raw: true })] = _instance;
      }
      return result;
    }
    return Target.findOne(options);
  }
  async set(sourceInstance, associatedInstance, options = {}) {
    let value = associatedInstance;
    if (associatedInstance instanceof this.target) {
      value = associatedInstance[this.targetKey];
    }
    sourceInstance.set(this.foreignKey, value);
    if (options.save === false)
      return;
    options = __spreadValues({
      fields: [this.foreignKey],
      allowNull: [this.foreignKey],
      association: true
    }, options);
    return await sourceInstance.save(options);
  }
  async create(sourceInstance, values, options) {
    values = values || {};
    options = options || {};
    const newAssociatedObject = await this.target.create(values, options);
    await sourceInstance[this.accessors.set](newAssociatedObject, options);
    return newAssociatedObject;
  }
  verifyAssociationAlias(alias) {
    if (typeof alias === "string") {
      return this.as === alias;
    }
    if (alias && alias.singular) {
      return this.as === alias.singular;
    }
    return !this.isAliased;
  }
}
module.exports = BelongsTo;
module.exports.BelongsTo = BelongsTo;
module.exports.default = BelongsTo;
//# sourceMappingURL=belongs-to.js.map
"use strict";
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
const Utils = require("./../utils");
const Helpers = require("./helpers");
const _ = require("lodash");
const Association = require("./base");
const Op = require("../operators");
class HasMany extends Association {
  constructor(source, target, options) {
    super(source, target, options);
    this.associationType = "HasMany";
    this.targetAssociation = null;
    this.sequelize = source.sequelize;
    this.isMultiAssociation = true;
    this.foreignKeyAttribute = {};
    if (this.options.through) {
      throw new Error("N:M associations are not supported with hasMany. Use belongsToMany instead");
    }
    if (this.isSelfAssociation) {
      this.targetAssociation = this;
    }
    if (this.as) {
      this.isAliased = true;
      if (_.isPlainObject(this.as)) {
        this.options.name = this.as;
        this.as = this.as.plural;
      } else {
        this.options.name = {
          plural: this.as,
          singular: Utils.singularize(this.as)
        };
      }
    } else {
      this.as = this.target.options.name.plural;
      this.options.name = this.target.options.name;
    }
    if (_.isObject(this.options.foreignKey)) {
      this.foreignKeyAttribute = this.options.foreignKey;
      this.foreignKey = this.foreignKeyAttribute.name || this.foreignKeyAttribute.fieldName;
    } else if (this.options.foreignKey) {
      this.foreignKey = this.options.foreignKey;
    }
    if (!this.foreignKey) {
      this.foreignKey = Utils.camelize([
        this.source.options.name.singular,
        this.source.primaryKeyAttribute
      ].join("_"));
    }
    if (this.target.rawAttributes[this.foreignKey]) {
      this.identifierField = this.target.rawAttributes[this.foreignKey].field || this.foreignKey;
      this.foreignKeyField = this.target.rawAttributes[this.foreignKey].field || this.foreignKey;
    }
    this.sourceKey = this.options.sourceKey || this.source.primaryKeyAttribute;
    if (this.source.rawAttributes[this.sourceKey]) {
      this.sourceKeyAttribute = this.sourceKey;
      this.sourceKeyField = this.source.rawAttributes[this.sourceKey].field || this.sourceKey;
    } else {
      this.sourceKeyAttribute = this.source.primaryKeyAttribute;
      this.sourceKeyField = this.source.primaryKeyField;
    }
    const plural = _.upperFirst(this.options.name.plural);
    const singular = _.upperFirst(this.options.name.singular);
    this.associationAccessor = this.as;
    this.accessors = {
      get: `get${plural}`,
      set: `set${plural}`,
      addMultiple: `add${plural}`,
      add: `add${singular}`,
      create: `create${singular}`,
      remove: `remove${singular}`,
      removeMultiple: `remove${plural}`,
      hasSingle: `has${singular}`,
      hasAll: `has${plural}`,
      count: `count${plural}`
    };
  }
  _injectAttributes() {
    const newAttributes = {
      [this.foreignKey]: __spreadValues({
        type: this.options.keyType || this.source.rawAttributes[this.sourceKeyAttribute].type,
        allowNull: true
      }, this.foreignKeyAttribute)
    };
    const constraintOptions = __spreadValues({}, this.options);
    if (this.options.constraints !== false) {
      const target = this.target.rawAttributes[this.foreignKey] || newAttributes[this.foreignKey];
      constraintOptions.onDelete = constraintOptions.onDelete || (target.allowNull ? "SET NULL" : "CASCADE");
      constraintOptions.onUpdate = constraintOptions.onUpdate || "CASCADE";
    }
    Helpers.addForeignKeyConstraints(newAttributes[this.foreignKey], this.source, this.target, constraintOptions, this.sourceKeyField);
    Utils.mergeDefaults(this.target.rawAttributes, newAttributes);
    this.target.refreshAttributes();
    this.source.refreshAttributes();
    this.identifierField = this.target.rawAttributes[this.foreignKey].field || this.foreignKey;
    this.foreignKeyField = this.target.rawAttributes[this.foreignKey].field || this.foreignKey;
    this.sourceKeyField = this.source.rawAttributes[this.sourceKey].field || this.sourceKey;
    Helpers.checkNamingCollision(this);
    return this;
  }
  mixin(obj) {
    const methods = ["get", "count", "hasSingle", "hasAll", "set", "add", "addMultiple", "remove", "removeMultiple", "create"];
    const aliases = {
      hasSingle: "has",
      hasAll: "has",
      addMultiple: "add",
      removeMultiple: "remove"
    };
    Helpers.mixinMethods(this, obj, methods, aliases);
  }
  async get(instances, options = {}) {
    const where = {};
    let Model = this.target;
    let instance;
    let values;
    if (!Array.isArray(instances)) {
      instance = instances;
      instances = void 0;
    }
    options = __spreadValues({}, options);
    if (this.scope) {
      Object.assign(where, this.scope);
    }
    if (instances) {
      values = instances.map((_instance) => _instance.get(this.sourceKey, { raw: true }));
      if (options.limit && instances.length > 1) {
        options.groupedLimit = {
          limit: options.limit,
          on: this,
          values
        };
        delete options.limit;
      } else {
        where[this.foreignKey] = {
          [Op.in]: values
        };
        delete options.groupedLimit;
      }
    } else {
      where[this.foreignKey] = instance.get(this.sourceKey, { raw: true });
    }
    options.where = options.where ? { [Op.and]: [where, options.where] } : where;
    if (Object.prototype.hasOwnProperty.call(options, "scope")) {
      if (!options.scope) {
        Model = Model.unscoped();
      } else {
        Model = Model.scope(options.scope);
      }
    }
    if (Object.prototype.hasOwnProperty.call(options, "schema")) {
      Model = Model.schema(options.schema, options.schemaDelimiter);
    }
    const results = await Model.findAll(options);
    if (instance)
      return results;
    const result = {};
    for (const _instance of instances) {
      result[_instance.get(this.sourceKey, { raw: true })] = [];
    }
    for (const _instance of results) {
      result[_instance.get(this.foreignKey, { raw: true })].push(_instance);
    }
    return result;
  }
  async count(instance, options) {
    options = Utils.cloneDeep(options);
    options.attributes = [
      [
        this.sequelize.fn("COUNT", this.sequelize.col(`${this.target.name}.${this.target.primaryKeyField}`)),
        "count"
      ]
    ];
    options.raw = true;
    options.plain = true;
    const result = await this.get(instance, options);
    return parseInt(result.count, 10);
  }
  async has(sourceInstance, targetInstances, options) {
    const where = {};
    if (!Array.isArray(targetInstances)) {
      targetInstances = [targetInstances];
    }
    options = __spreadProps(__spreadValues({}, options), {
      scope: false,
      attributes: [this.target.primaryKeyAttribute],
      raw: true
    });
    where[Op.or] = targetInstances.map((instance) => {
      if (instance instanceof this.target) {
        return instance.where();
      }
      return {
        [this.target.primaryKeyAttribute]: instance
      };
    });
    options.where = {
      [Op.and]: [
        where,
        options.where
      ]
    };
    const associatedObjects = await this.get(sourceInstance, options);
    return associatedObjects.length === targetInstances.length;
  }
  async set(sourceInstance, targetInstances, options) {
    if (targetInstances === null) {
      targetInstances = [];
    } else {
      targetInstances = this.toInstanceArray(targetInstances);
    }
    const oldAssociations = await this.get(sourceInstance, __spreadProps(__spreadValues({}, options), { scope: false, raw: true }));
    const promises = [];
    const obsoleteAssociations = oldAssociations.filter((old) => !targetInstances.find((obj) => obj[this.target.primaryKeyAttribute] === old[this.target.primaryKeyAttribute]));
    const unassociatedObjects = targetInstances.filter((obj) => !oldAssociations.find((old) => obj[this.target.primaryKeyAttribute] === old[this.target.primaryKeyAttribute]));
    let updateWhere;
    let update;
    if (obsoleteAssociations.length > 0) {
      update = {};
      update[this.foreignKey] = null;
      updateWhere = {
        [this.target.primaryKeyAttribute]: obsoleteAssociations.map((associatedObject) => associatedObject[this.target.primaryKeyAttribute])
      };
      promises.push(this.target.unscoped().update(update, __spreadProps(__spreadValues({}, options), {
        where: updateWhere
      })));
    }
    if (unassociatedObjects.length > 0) {
      updateWhere = {};
      update = {};
      update[this.foreignKey] = sourceInstance.get(this.sourceKey);
      Object.assign(update, this.scope);
      updateWhere[this.target.primaryKeyAttribute] = unassociatedObjects.map((unassociatedObject) => unassociatedObject[this.target.primaryKeyAttribute]);
      promises.push(this.target.unscoped().update(update, __spreadProps(__spreadValues({}, options), {
        where: updateWhere
      })));
    }
    await Promise.all(promises);
    return sourceInstance;
  }
  async add(sourceInstance, targetInstances, options = {}) {
    if (!targetInstances)
      return Promise.resolve();
    targetInstances = this.toInstanceArray(targetInstances);
    const update = __spreadValues({
      [this.foreignKey]: sourceInstance.get(this.sourceKey)
    }, this.scope);
    const where = {
      [this.target.primaryKeyAttribute]: targetInstances.map((unassociatedObject) => unassociatedObject.get(this.target.primaryKeyAttribute))
    };
    await this.target.unscoped().update(update, __spreadProps(__spreadValues({}, options), { where }));
    return sourceInstance;
  }
  async remove(sourceInstance, targetInstances, options = {}) {
    const update = {
      [this.foreignKey]: null
    };
    targetInstances = this.toInstanceArray(targetInstances);
    const where = {
      [this.foreignKey]: sourceInstance.get(this.sourceKey),
      [this.target.primaryKeyAttribute]: targetInstances.map((targetInstance) => targetInstance.get(this.target.primaryKeyAttribute))
    };
    await this.target.unscoped().update(update, __spreadProps(__spreadValues({}, options), { where }));
    return this;
  }
  async create(sourceInstance, values, options = {}) {
    if (Array.isArray(options)) {
      options = {
        fields: options
      };
    }
    if (values === void 0) {
      values = {};
    }
    if (this.scope) {
      for (const attribute of Object.keys(this.scope)) {
        values[attribute] = this.scope[attribute];
        if (options.fields)
          options.fields.push(attribute);
      }
    }
    values[this.foreignKey] = sourceInstance.get(this.sourceKey);
    if (options.fields)
      options.fields.push(this.foreignKey);
    return await this.target.create(values, options);
  }
  verifyAssociationAlias(alias) {
    if (typeof alias === "string") {
      return this.as === alias;
    }
    if (alias && alias.plural) {
      return this.as === alias.plural;
    }
    return !this.isAliased;
  }
}
module.exports = HasMany;
module.exports.HasMany = HasMany;
module.exports.default = HasMany;
//# sourceMappingURL=has-many.js.map
"use strict";
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
const Utils = require("./../utils");
const Helpers = require("./helpers");
const _ = require("lodash");
const Association = require("./base");
const Op = require("../operators");
class HasOne extends Association {
  constructor(source, target, options) {
    super(source, target, options);
    this.associationType = "HasOne";
    this.isSingleAssociation = true;
    this.foreignKeyAttribute = {};
    if (this.as) {
      this.isAliased = true;
      this.options.name = {
        singular: this.as
      };
    } else {
      this.as = this.target.options.name.singular;
      this.options.name = this.target.options.name;
    }
    if (_.isObject(this.options.foreignKey)) {
      this.foreignKeyAttribute = this.options.foreignKey;
      this.foreignKey = this.foreignKeyAttribute.name || this.foreignKeyAttribute.fieldName;
    } else if (this.options.foreignKey) {
      this.foreignKey = this.options.foreignKey;
    }
    if (!this.foreignKey) {
      this.foreignKey = Utils.camelize([
        Utils.singularize(this.options.as || this.source.name),
        this.source.primaryKeyAttribute
      ].join("_"));
    }
    if (this.options.sourceKey && !this.source.rawAttributes[this.options.sourceKey]) {
      throw new Error(`Unknown attribute "${this.options.sourceKey}" passed as sourceKey, define this attribute on model "${this.source.name}" first`);
    }
    this.sourceKey = this.sourceKeyAttribute = this.options.sourceKey || this.source.primaryKeyAttribute;
    this.sourceKeyField = this.source.rawAttributes[this.sourceKey].field || this.sourceKey;
    this.sourceKeyIsPrimary = this.sourceKey === this.source.primaryKeyAttribute;
    this.associationAccessor = this.as;
    this.options.useHooks = options.useHooks;
    if (this.target.rawAttributes[this.foreignKey]) {
      this.identifierField = this.target.rawAttributes[this.foreignKey].field || this.foreignKey;
    }
    const singular = _.upperFirst(this.options.name.singular);
    this.accessors = {
      get: `get${singular}`,
      set: `set${singular}`,
      create: `create${singular}`
    };
  }
  _injectAttributes() {
    const newAttributes = {
      [this.foreignKey]: __spreadValues({
        type: this.options.keyType || this.source.rawAttributes[this.sourceKey].type,
        allowNull: true
      }, this.foreignKeyAttribute)
    };
    if (this.options.constraints !== false) {
      const target = this.target.rawAttributes[this.foreignKey] || newAttributes[this.foreignKey];
      this.options.onDelete = this.options.onDelete || (target.allowNull ? "SET NULL" : "CASCADE");
      this.options.onUpdate = this.options.onUpdate || "CASCADE";
    }
    Helpers.addForeignKeyConstraints(newAttributes[this.foreignKey], this.source, this.target, this.options, this.sourceKeyField);
    Utils.mergeDefaults(this.target.rawAttributes, newAttributes);
    this.target.refreshAttributes();
    this.identifierField = this.target.rawAttributes[this.foreignKey].field || this.foreignKey;
    Helpers.checkNamingCollision(this);
    return this;
  }
  mixin(obj) {
    const methods = ["get", "set", "create"];
    Helpers.mixinMethods(this, obj, methods);
  }
  async get(instances, options) {
    const where = {};
    let Target = this.target;
    let instance;
    options = Utils.cloneDeep(options);
    if (Object.prototype.hasOwnProperty.call(options, "scope")) {
      if (!options.scope) {
        Target = Target.unscoped();
      } else {
        Target = Target.scope(options.scope);
      }
    }
    if (Object.prototype.hasOwnProperty.call(options, "schema")) {
      Target = Target.schema(options.schema, options.schemaDelimiter);
    }
    if (!Array.isArray(instances)) {
      instance = instances;
      instances = void 0;
    }
    if (instances) {
      where[this.foreignKey] = {
        [Op.in]: instances.map((_instance) => _instance.get(this.sourceKey))
      };
    } else {
      where[this.foreignKey] = instance.get(this.sourceKey);
    }
    if (this.scope) {
      Object.assign(where, this.scope);
    }
    options.where = options.where ? { [Op.and]: [where, options.where] } : where;
    if (instances) {
      const results = await Target.findAll(options);
      const result = {};
      for (const _instance of instances) {
        result[_instance.get(this.sourceKey, { raw: true })] = null;
      }
      for (const _instance of results) {
        result[_instance.get(this.foreignKey, { raw: true })] = _instance;
      }
      return result;
    }
    return Target.findOne(options);
  }
  async set(sourceInstance, associatedInstance, options) {
    options = __spreadProps(__spreadValues({}, options), { scope: false });
    const oldInstance = await sourceInstance[this.accessors.get](options);
    const alreadyAssociated = oldInstance && associatedInstance && this.target.primaryKeyAttributes.every((attribute) => oldInstance.get(attribute, { raw: true }) === (associatedInstance.get ? associatedInstance.get(attribute, { raw: true }) : associatedInstance));
    if (oldInstance && !alreadyAssociated) {
      oldInstance[this.foreignKey] = null;
      await oldInstance.save(__spreadProps(__spreadValues({}, options), {
        fields: [this.foreignKey],
        allowNull: [this.foreignKey],
        association: true
      }));
    }
    if (associatedInstance && !alreadyAssociated) {
      if (!(associatedInstance instanceof this.target)) {
        const tmpInstance = {};
        tmpInstance[this.target.primaryKeyAttribute] = associatedInstance;
        associatedInstance = this.target.build(tmpInstance, {
          isNewRecord: false
        });
      }
      Object.assign(associatedInstance, this.scope);
      associatedInstance.set(this.foreignKey, sourceInstance.get(this.sourceKeyAttribute));
      return associatedInstance.save(options);
    }
    return null;
  }
  async create(sourceInstance, values, options) {
    values = values || {};
    options = options || {};
    if (this.scope) {
      for (const attribute of Object.keys(this.scope)) {
        values[attribute] = this.scope[attribute];
        if (options.fields) {
          options.fields.push(attribute);
        }
      }
    }
    values[this.foreignKey] = sourceInstance.get(this.sourceKeyAttribute);
    if (options.fields) {
      options.fields.push(this.foreignKey);
    }
    return await this.target.create(values, options);
  }
  verifyAssociationAlias(alias) {
    if (typeof alias === "string") {
      return this.as === alias;
    }
    if (alias && alias.singular) {
      return this.as === alias.singular;
    }
    return !this.isAliased;
  }
}
module.exports = HasOne;
//# sourceMappingURL=has-one.js.map
"use strict";
function checkNamingCollision(association) {
  if (Object.prototype.hasOwnProperty.call(association.source.rawAttributes, association.as)) {
    throw new Error(`Naming collision between attribute '${association.as}' and association '${association.as}' on model ${association.source.name}. To remedy this, change either foreignKey or as in your association definition`);
  }
}
exports.checkNamingCollision = checkNamingCollision;
function addForeignKeyConstraints(newAttribute, source, target, options, key) {
  if (options.foreignKeyConstraint || options.onDelete || options.onUpdate) {
    const primaryKeys = Object.keys(source.primaryKeys).map((primaryKeyAttribute) => source.rawAttributes[primaryKeyAttribute].field || primaryKeyAttribute);
    if (primaryKeys.length === 1 || !primaryKeys.includes(key)) {
      newAttribute.references = {
        model: source.getTableName(),
        key: key || primaryKeys[0]
      };
      newAttribute.onDelete = options.onDelete;
      newAttribute.onUpdate = options.onUpdate;
    }
  }
}
exports.addForeignKeyConstraints = addForeignKeyConstraints;
function mixinMethods(association, obj, methods, aliases) {
  aliases = aliases || {};
  for (const method of methods) {
    if (!Object.prototype.hasOwnProperty.call(obj, association.accessors[method])) {
      const realMethod = aliases[method] || method;
      obj[association.accessors[method]] = function() {
        return association[realMethod](this, ...Array.from(arguments));
      };
    }
  }
}
exports.mixinMethods = mixinMethods;
//# sourceMappingURL=helpers.js.map
"use strict";
const Association = require("./base");
Association.BelongsTo = require("./belongs-to");
Association.HasOne = require("./has-one");
Association.HasMany = require("./has-many");
Association.BelongsToMany = require("./belongs-to-many");
module.exports = Association;
module.exports.default = Association;
module.exports.Association = Association;
//# sourceMappingURL=index.js.map
"use strict";
const _ = require("lodash");
const HasOne = require("./has-one");
const HasMany = require("./has-many");
const BelongsToMany = require("./belongs-to-many");
const BelongsTo = require("./belongs-to");
function isModel(model, sequelize) {
  return model && model.prototype && model.prototype instanceof sequelize.Sequelize.Model;
}
const Mixin = {
  hasMany(target, options = {}) {
    if (!isModel(target, this.sequelize)) {
      throw new Error(`${this.name}.hasMany called with something that's not a subclass of Sequelize.Model`);
    }
    const source = this;
    options.hooks = options.hooks === void 0 ? false : Boolean(options.hooks);
    options.useHooks = options.hooks;
    Object.assign(options, _.omit(source.options, ["hooks"]));
    if (options.useHooks) {
      this.runHooks("beforeAssociate", { source, target, type: HasMany }, options);
    }
    const association = new HasMany(source, target, options);
    source.associations[association.associationAccessor] = association;
    association._injectAttributes();
    association.mixin(source.prototype);
    if (options.useHooks) {
      this.runHooks("afterAssociate", { source, target, type: HasMany, association }, options);
    }
    return association;
  },
  belongsToMany(target, options = {}) {
    if (!isModel(target, this.sequelize)) {
      throw new Error(`${this.name}.belongsToMany called with something that's not a subclass of Sequelize.Model`);
    }
    const source = this;
    options.hooks = options.hooks === void 0 ? false : Boolean(options.hooks);
    options.useHooks = options.hooks;
    options.timestamps = options.timestamps === void 0 ? this.sequelize.options.timestamps : options.timestamps;
    Object.assign(options, _.omit(source.options, ["hooks", "timestamps", "scopes", "defaultScope"]));
    if (options.useHooks) {
      this.runHooks("beforeAssociate", { source, target, type: BelongsToMany }, options);
    }
    const association = new BelongsToMany(source, target, options);
    source.associations[association.associationAccessor] = association;
    association._injectAttributes();
    association.mixin(source.prototype);
    if (options.useHooks) {
      this.runHooks("afterAssociate", { source, target, type: BelongsToMany, association }, options);
    }
    return association;
  },
  getAssociations(target) {
    return Object.values(this.associations).filter((association) => association.target.name === target.name);
  },
  getAssociationForAlias(target, alias) {
    return this.getAssociations(target).find((association) => association.verifyAssociationAlias(alias)) || null;
  }
};
function singleLinked(Type) {
  return function(target, options = {}) {
    const source = this;
    if (!isModel(target, source.sequelize)) {
      throw new Error(`${source.name}.${_.lowerFirst(Type.name)} called with something that's not a subclass of Sequelize.Model`);
    }
    options.hooks = options.hooks === void 0 ? false : Boolean(options.hooks);
    options.useHooks = options.hooks;
    if (options.useHooks) {
      source.runHooks("beforeAssociate", { source, target, type: Type }, options);
    }
    const association = new Type(source, target, Object.assign(options, source.options));
    source.associations[association.associationAccessor] = association;
    association._injectAttributes();
    association.mixin(source.prototype);
    if (options.useHooks) {
      source.runHooks("afterAssociate", { source, target, type: Type, association }, options);
    }
    return association;
  };
}
Mixin.hasOne = singleLinked(HasOne);
Mixin.belongsTo = singleLinked(BelongsTo);
module.exports = Mixin;
module.exports.Mixin = Mixin;
module.exports.default = Mixin;
//# sourceMappingURL=mixin.js.map
(The MIT License)

Copyright (c) 2018-present Sushant <sushantdhiman@outlook.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.


--------------------------------

(Original Fork License)

[generic-pool@2.5]

Copyright (c) 2010-2016 James Cooper <james@bitmechanic.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": "sequelize-pool",
  "description": "Resource pooling for Node.JS",
  "version": "7.1.0",
  "author": "Sushant <sushantdhiman@outlook.com>",
  "main": "lib/index.js",
  "repository": {
    "type": "git",
    "url": "http://github.com/sushantdhiman/sequelize-pool.git"
  },
  "files": [
    "lib",
    "types"
  ],
  "types": "types",
  "dependencies": {},
  "devDependencies": {
    "@types/node": "^10.17.54",
    "@typescript-eslint/eslint-plugin": "^4.0.0",
    "@typescript-eslint/parser": "^4.0.0",
    "eslint": "^7.0.0",
    "eslint-config-prettier": "^7.0.0",
    "eslint-plugin-prettier": "^3.1.2",
    "prettier": "^2.0.2",
    "tap": "^14.10.7",
    "typedoc": "^0.20.30",
    "typedoc-plugin-markdown": "^3.6.0",
    "typescript": "~4.2.2"
  },
  "engines": {
    "node": ">= 10.0.0"
  },
  "prettier": {
    "singleQuote": true
  },
  "license": "MIT"
}"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AggregateError = void 0;
class AggregateError extends Error {
    constructor(errors) {
        super();
        this.errors = errors;
        this.name = 'AggregateError';
    }
    toString() {
        const message = `AggregateError of:\n${this.errors
            .map((error) => error === this
            ? '[Circular AggregateError]'
            : error instanceof AggregateError
                ? String(error).replace(/\n$/, '').replace(/^/gm, '  ')
                : String(error).replace(/^/gm, '    ').substring(2))
            .join('\n')}\n`;
        return message;
    }
}
exports.AggregateError = AggregateError;
//# sourceMappingURL=AggregateError.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Deferred = void 0;
const TimeoutError_1 = require("./TimeoutError");
class Deferred {
    constructor() {
        this._promise = new Promise((resolve, reject) => {
            this._reject = reject;
            this._resolve = resolve;
        });
    }
    registerTimeout(timeoutInMillis, callback) {
        if (this._timeout)
            return;
        this._timeout = setTimeout(() => {
            callback();
            this.reject(new TimeoutError_1.TimeoutError('Operation timeout'));
        }, timeoutInMillis);
    }
    _clearTimeout() {
        if (!this._timeout)
            return;
        clearTimeout(this._timeout);
    }
    resolve(value) {
        this._clearTimeout();
        this._resolve(value);
    }
    reject(error) {
        this._clearTimeout();
        this._reject(error);
    }
    promise() {
        return this._promise;
    }
}
exports.Deferred = Deferred;
//# sourceMappingURL=Deferred.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Pool = void 0;
const Deferred_1 = require("./Deferred");
const AggregateError_1 = require("./AggregateError");
class Pool {
    constructor(factory) {
        this.log = false;
        if (!factory.create) {
            throw new Error('create function is required');
        }
        if (!factory.destroy) {
            throw new Error('destroy function is required');
        }
        if (!factory.validate) {
            throw new Error('validate function is required');
        }
        if (typeof factory.min !== 'number' ||
            factory.min < 0 ||
            factory.min !== Math.round(factory.min)) {
            throw new Error('min must be an integer >= 0');
        }
        if (typeof factory.max !== 'number' ||
            factory.max <= 0 ||
            factory.max !== Math.round(factory.max)) {
            throw new Error('max must be an integer > 0');
        }
        if (factory.min > factory.max) {
            throw new Error('max is smaller than min');
        }
        if (factory.maxUses !== undefined &&
            (typeof factory.maxUses !== 'number' || factory.maxUses < 0)) {
            throw new Error('maxUses must be an integer >= 0');
        }
        this.idleTimeoutMillis = factory.idleTimeoutMillis || 30000;
        this.acquireTimeoutMillis = factory.acquireTimeoutMillis || 30000;
        this.reapIntervalMillis = factory.reapIntervalMillis || 1000;
        this.maxUsesPerResource = factory.maxUses || Infinity;
        this.log = factory.log || false;
        this._factory = factory;
        this._count = 0;
        this._draining = false;
        this._pendingAcquires = [];
        this._inUseObjects = [];
        this._availableObjects = [];
        this._removeIdleScheduled = false;
    }
    get size() {
        return this._count;
    }
    get name() {
        return this._factory.name;
    }
    get available() {
        return this._availableObjects.length;
    }
    get using() {
        return this._inUseObjects.length;
    }
    get waiting() {
        return this._pendingAcquires.length;
    }
    get maxSize() {
        return this._factory.max;
    }
    get minSize() {
        return this._factory.min;
    }
    _log(message, level) {
        if (typeof this.log === 'function') {
            this.log(message, level);
        }
        else if (this.log) {
            console.log(`${level.toUpperCase()} pool ${this.name || ''} - ${message}`);
        }
    }
    _removeIdle() {
        const toRemove = [];
        const now = Date.now();
        let i;
        let available = this._availableObjects.length;
        const maxRemovable = this.size - this.minSize;
        let timeout;
        this._removeIdleScheduled = false;
        for (i = 0; i < available && maxRemovable > toRemove.length; i++) {
            timeout = this._availableObjects[i].timeout;
            if (now >= timeout) {
                this._log('removeIdle() destroying obj - now:' + now + ' timeout:' + timeout, 'verbose');
                toRemove.push(this._availableObjects[i].resource);
            }
        }
        toRemove.forEach(this.destroy, this);
        available = this._availableObjects.length;
        if (available > 0) {
            this._log('this._availableObjects.length=' + available, 'verbose');
            this._scheduleRemoveIdle();
        }
        else {
            this._log('removeIdle() all objects removed', 'verbose');
        }
    }
    _scheduleRemoveIdle() {
        if (!this._removeIdleScheduled) {
            this._removeIdleScheduled = true;
            this._removeIdleTimer = setTimeout(() => {
                this._removeIdle();
            }, this.reapIntervalMillis);
        }
    }
    _dispense() {
        let wrappedResource = null;
        const waitingCount = this._pendingAcquires.length;
        this._log(`dispense() clients=${waitingCount} available=${this._availableObjects.length}`, 'info');
        if (waitingCount < 1) {
            return;
        }
        while (this._availableObjects.length > 0) {
            this._log('dispense() - reusing obj', 'verbose');
            wrappedResource = this._availableObjects[this._availableObjects.length - 1];
            if (!this._factory.validate(wrappedResource.resource)) {
                this.destroy(wrappedResource.resource);
                continue;
            }
            this._availableObjects.pop();
            this._addResourceToInUseObjects(wrappedResource.resource, wrappedResource.useCount);
            const deferred = this._pendingAcquires.shift();
            return deferred.resolve(wrappedResource.resource);
        }
        if (this.size < this.maxSize) {
            this._createResource();
        }
    }
    _createResource() {
        this._count += 1;
        this._log(`createResource() - creating obj - count=${this.size} min=${this.minSize} max=${this.maxSize}`, 'verbose');
        this._factory
            .create()
            .then((resource) => {
            const deferred = this._pendingAcquires.shift();
            if (deferred) {
                this._addResourceToInUseObjects(resource, 0);
                deferred.resolve(resource);
            }
            else {
                this._addResourceToAvailableObjects(resource, 0);
            }
        })
            .catch((error) => {
            const deferred = this._pendingAcquires.shift();
            this._count -= 1;
            if (this._count < 0)
                this._count = 0;
            if (deferred) {
                deferred.reject(error);
            }
            process.nextTick(() => {
                this._dispense();
            });
        });
    }
    _addResourceToAvailableObjects(resource, useCount) {
        const wrappedResource = {
            resource: resource,
            useCount: useCount,
            timeout: Date.now() + this.idleTimeoutMillis,
        };
        this._availableObjects.push(wrappedResource);
        this._dispense();
        this._scheduleRemoveIdle();
    }
    _addResourceToInUseObjects(resource, useCount) {
        const wrappedResource = {
            resource: resource,
            useCount: useCount,
        };
        this._inUseObjects.push(wrappedResource);
    }
    _ensureMinimum() {
        let i, diff;
        if (!this._draining && this.size < this.minSize) {
            diff = this.minSize - this.size;
            for (i = 0; i < diff; i++) {
                this._createResource();
            }
        }
    }
    acquire() {
        if (this._draining) {
            return Promise.reject(new Error('pool is draining and cannot accept work'));
        }
        const deferred = new Deferred_1.Deferred();
        deferred.registerTimeout(this.acquireTimeoutMillis, () => {
            this._pendingAcquires = this._pendingAcquires.filter((pending) => pending !== deferred);
        });
        this._pendingAcquires.push(deferred);
        this._dispense();
        return deferred.promise();
    }
    release(resource) {
        if (this._availableObjects.some((resourceWithTimeout) => resourceWithTimeout.resource === resource)) {
            this._log('release called twice for the same resource: ' + new Error().stack, 'error');
            return;
        }
        const index = this._inUseObjects.findIndex((wrappedResource) => wrappedResource.resource === resource);
        if (index < 0) {
            this._log('attempt to release an invalid resource: ' + new Error().stack, 'error');
            return;
        }
        const wrappedResource = this._inUseObjects[index];
        wrappedResource.useCount += 1;
        if (wrappedResource.useCount >= this.maxUsesPerResource) {
            this._log('release() destroying obj - useCount:' +
                wrappedResource.useCount +
                ' maxUsesPerResource:' +
                this.maxUsesPerResource, 'verbose');
            this.destroy(wrappedResource.resource);
            this._dispense();
        }
        else {
            this._inUseObjects.splice(index, 1);
            this._addResourceToAvailableObjects(wrappedResource.resource, wrappedResource.useCount);
        }
    }
    async destroy(resource) {
        const available = this._availableObjects.length;
        const using = this._inUseObjects.length;
        this._availableObjects = this._availableObjects.filter((object) => object.resource !== resource);
        this._inUseObjects = this._inUseObjects.filter((object) => object.resource !== resource);
        if (available === this._availableObjects.length &&
            using === this._inUseObjects.length) {
            this._ensureMinimum();
            return;
        }
        this._count -= 1;
        if (this._count < 0)
            this._count = 0;
        try {
            await this._factory.destroy(resource);
        }
        finally {
            this._ensureMinimum();
            if (!this._draining) {
                process.nextTick(() => {
                    this._dispense();
                });
            }
        }
    }
    drain() {
        this._log('draining', 'info');
        this._draining = true;
        const check = (callback) => {
            if (this._pendingAcquires.length > 0) {
                this._dispense();
                setTimeout(() => {
                    check(callback);
                }, 100);
                return;
            }
            if (this._availableObjects.length !== this._count) {
                setTimeout(() => {
                    check(callback);
                }, 100);
                return;
            }
            callback();
        };
        return new Promise((resolve) => check(resolve));
    }
    async destroyAllNow() {
        this._log('force destroying all objects', 'info');
        this._removeIdleScheduled = false;
        clearTimeout(this._removeIdleTimer);
        const resources = this._availableObjects.map((resource) => resource.resource);
        const errors = [];
        for (const resource of resources) {
            try {
                await this.destroy(resource);
            }
            catch (ex) {
                this._log('Error destroying resource: ' + ex.stack, 'error');
                errors.push(ex);
            }
        }
        if (errors.length > 0) {
            throw new AggregateError_1.AggregateError(errors);
        }
    }
}
exports.Pool = Pool;
//# sourceMappingURL=Pool.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TimeoutError = void 0;
class TimeoutError extends Error {
}
exports.TimeoutError = TimeoutError;
//# sourceMappingURL=TimeoutError.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Pool = exports.AggregateError = exports.TimeoutError = void 0;
var TimeoutError_1 = require("./TimeoutError");
Object.defineProperty(exports, "TimeoutError", { enumerable: true, get: function () { return TimeoutError_1.TimeoutError; } });
var AggregateError_1 = require("./AggregateError");
Object.defineProperty(exports, "AggregateError", { enumerable: true, get: function () { return AggregateError_1.AggregateError; } });
var Pool_1 = require("./Pool");
Object.defineProperty(exports, "Pool", { enumerable: true, get: function () { return Pool_1.Pool; } });
//# sourceMappingURL=index.js.map1.15.0 / 2022-03-24
===================

  * deps: send@0.18.0
    - Fix emitted 416 error missing headers property
    - Limit the headers removed for 304 response
    - deps: depd@2.0.0
    - deps: destroy@1.2.0
    - deps: http-errors@2.0.0
    - deps: on-finished@2.4.1
    - deps: statuses@2.0.1

1.14.2 / 2021-12-15
===================

  * deps: send@0.17.2
    - deps: http-errors@1.8.1
    - deps: ms@2.1.3
    - pref: ignore empty http tokens

1.14.1 / 2019-05-10
===================

  * Set stricter CSP header in redirect response
  * deps: send@0.17.1
    - deps: range-parser@~1.2.1

1.14.0 / 2019-05-07
===================

  * deps: parseurl@~1.3.3
  * deps: send@0.17.0
    - deps: http-errors@~1.7.2
    - deps: mime@1.6.0
    - deps: ms@2.1.1
    - deps: statuses@~1.5.0
    - perf: remove redundant `path.normalize` call

1.13.2 / 2018-02-07
===================

  * Fix incorrect end tag in redirects
  * deps: encodeurl@~1.0.2
    - Fix encoding `%` as last character
  * deps: send@0.16.2
    - deps: depd@~1.1.2
    - deps: encodeurl@~1.0.2
    - deps: statuses@~1.4.0

1.13.1 / 2017-09-29
===================

  * Fix regression when `root` is incorrectly set to a file
  * deps: send@0.16.1

1.13.0 / 2017-09-27
===================

  * deps: send@0.16.0
    - Add 70 new types for file extensions
    - Add `immutable` option
    - Fix missing `</html>` in default error & redirects
    - Set charset as "UTF-8" for .js and .json
    - Use instance methods on steam to check for listeners
    - deps: mime@1.4.1
    - perf: improve path validation speed

1.12.6 / 2017-09-22
===================

  * deps: send@0.15.6
    - deps: debug@2.6.9
    - perf: improve `If-Match` token parsing
  * perf: improve slash collapsing

1.12.5 / 2017-09-21
===================

  * deps: parseurl@~1.3.2
    - perf: reduce overhead for full URLs
    - perf: unroll the "fast-path" `RegExp`
  * deps: send@0.15.5
    - Fix handling of modified headers with invalid dates
    - deps: etag@~1.8.1
    - deps: fresh@0.5.2

1.12.4 / 2017-08-05
===================

  * deps: send@0.15.4
    - deps: debug@2.6.8
    - deps: depd@~1.1.1
    - deps: http-errors@~1.6.2

1.12.3 / 2017-05-16
===================

  * deps: send@0.15.3
    - deps: debug@2.6.7

1.12.2 / 2017-04-26
===================

  * deps: send@0.15.2
    - deps: debug@2.6.4

1.12.1 / 2017-03-04
===================

  * deps: send@0.15.1
    - Fix issue when `Date.parse` does not return `NaN` on invalid date
    - Fix strict violation in broken environments

1.12.0 / 2017-02-25
===================

  * Send complete HTML document in redirect response
  * Set default CSP header in redirect response
  * deps: send@0.15.0
    - Fix false detection of `no-cache` request directive
    - Fix incorrect result when `If-None-Match` has both `*` and ETags
    - Fix weak `ETag` matching to match spec
    - Remove usage of `res._headers` private field
    - Support `If-Match` and `If-Unmodified-Since` headers
    - Use `res.getHeaderNames()` when available
    - Use `res.headersSent` when available
    - deps: debug@2.6.1
    - deps: etag@~1.8.0
    - deps: fresh@0.5.0
    - deps: http-errors@~1.6.1

1.11.2 / 2017-01-23
===================

  * deps: send@0.14.2
    - deps: http-errors@~1.5.1
    - deps: ms@0.7.2
    - deps: statuses@~1.3.1

1.11.1 / 2016-06-10
===================

  * Fix redirect error when `req.url` contains raw non-URL characters
  * deps: send@0.14.1

1.11.0 / 2016-06-07
===================

  * Use status code 301 for redirects
  * deps: send@0.14.0
    - Add `acceptRanges` option
    - Add `cacheControl` option
    - Attempt to combine multiple ranges into single range
    - Correctly inherit from `Stream` class
    - Fix `Content-Range` header in 416 responses when using `start`/`end` options
    - Fix `Content-Range` header missing from default 416 responses
    - Ignore non-byte `Range` headers
    - deps: http-errors@~1.5.0
    - deps: range-parser@~1.2.0
    - deps: statuses@~1.3.0
    - perf: remove argument reassignment

1.10.3 / 2016-05-30
===================

  * deps: send@0.13.2
    - Fix invalid `Content-Type` header when `send.mime.default_type` unset

1.10.2 / 2016-01-19
===================

  * deps: parseurl@~1.3.1
    - perf: enable strict mode

1.10.1 / 2016-01-16
===================

  * deps: escape-html@~1.0.3
    - perf: enable strict mode
    - perf: optimize string replacement
    - perf: use faster string coercion
  * deps: send@0.13.1
    - deps: depd@~1.1.0
    - deps: destroy@~1.0.4
    - deps: escape-html@~1.0.3
    - deps: range-parser@~1.0.3

1.10.0 / 2015-06-17
===================

  * Add `fallthrough` option
    - Allows declaring this middleware is the final destination
    - Provides better integration with Express patterns
  * Fix reading options from options prototype
  * Improve the default redirect response headers
  * deps: escape-html@1.0.2
  * deps: send@0.13.0
    - Allow Node.js HTTP server to set `Date` response header
    - Fix incorrectly removing `Content-Location` on 304 response
    - Improve the default redirect response headers
    - Send appropriate headers on default error response
    - Use `http-errors` for standard emitted errors
    - Use `statuses` instead of `http` module for status messages
    - deps: escape-html@1.0.2
    - deps: etag@~1.7.0
    - deps: fresh@0.3.0
    - deps: on-finished@~2.3.0
    - perf: enable strict mode
    - perf: remove unnecessary array allocations
  * perf: enable strict mode
  * perf: remove argument reassignment

1.9.3 / 2015-05-14
==================

  * deps: send@0.12.3
    - deps: debug@~2.2.0
    - deps: depd@~1.0.1
    - deps: etag@~1.6.0
    - deps: ms@0.7.1
    - deps: on-finished@~2.2.1

1.9.2 / 2015-03-14
==================

  * deps: send@0.12.2
    - Throw errors early for invalid `extensions` or `index` options
    - deps: debug@~2.1.3

1.9.1 / 2015-02-17
==================

  * deps: send@0.12.1
    - Fix regression sending zero-length files

1.9.0 / 2015-02-16
==================

  * deps: send@0.12.0
    - Always read the stat size from the file
    - Fix mutating passed-in `options`
    - deps: mime@1.3.4

1.8.1 / 2015-01-20
==================

  * Fix redirect loop in Node.js 0.11.14
  * deps: send@0.11.1
    - Fix root path disclosure

1.8.0 / 2015-01-05
==================

  * deps: send@0.11.0
    - deps: debug@~2.1.1
    - deps: etag@~1.5.1
    - deps: ms@0.7.0
    - deps: on-finished@~2.2.0

1.7.2 / 2015-01-02
==================

  * Fix potential open redirect when mounted at root

1.7.1 / 2014-10-22
==================

  * deps: send@0.10.1
    - deps: on-finished@~2.1.1

1.7.0 / 2014-10-15
==================

  * deps: send@0.10.0
    - deps: debug@~2.1.0
    - deps: depd@~1.0.0
    - deps: etag@~1.5.0

1.6.5 / 2015-02-04
==================

  * Fix potential open redirect when mounted at root
    - Back-ported from v1.7.2

1.6.4 / 2014-10-08
==================

  * Fix redirect loop when index file serving disabled

1.6.3 / 2014-09-24
==================

  * deps: send@0.9.3
    - deps: etag@~1.4.0

1.6.2 / 2014-09-15
==================

  * deps: send@0.9.2
    - deps: depd@0.4.5
    - deps: etag@~1.3.1
    - deps: range-parser@~1.0.2

1.6.1 / 2014-09-07
==================

  * deps: send@0.9.1
    - deps: fresh@0.2.4

1.6.0 / 2014-09-07
==================

  * deps: send@0.9.0
    - Add `lastModified` option
    - Use `etag` to generate `ETag` header
    - deps: debug@~2.0.0

1.5.4 / 2014-09-04
==================

  * deps: send@0.8.5
    - Fix a path traversal issue when using `root`
    - Fix malicious path detection for empty string path

1.5.3 / 2014-08-17
==================

  * deps: send@0.8.3

1.5.2 / 2014-08-14
==================

  * deps: send@0.8.2
    - Work around `fd` leak in Node.js 0.10 for `fs.ReadStream`

1.5.1 / 2014-08-09
==================

  * Fix parsing of weird `req.originalUrl` values
  * deps: parseurl@~1.3.0
  * deps: utils-merge@1.0.0

1.5.0 / 2014-08-05
==================

  * deps: send@0.8.1
    - Add `extensions` option

1.4.4 / 2014-08-04
==================

  * deps: send@0.7.4
    - Fix serving index files without root dir

1.4.3 / 2014-07-29
==================

  * deps: send@0.7.3
    - Fix incorrect 403 on Windows and Node.js 0.11

1.4.2 / 2014-07-27
==================

  * deps: send@0.7.2
    - deps: depd@0.4.4

1.4.1 / 2014-07-26
==================

  * deps: send@0.7.1
    - deps: depd@0.4.3

1.4.0 / 2014-07-21
==================

  * deps: parseurl@~1.2.0
    - Cache URLs based on original value
    - Remove no-longer-needed URL mis-parse work-around
    - Simplify the "fast-path" `RegExp`
  * deps: send@0.7.0
    - Add `dotfiles` option
    - deps: debug@1.0.4
    - deps: depd@0.4.2

1.3.2 / 2014-07-11
==================

  * deps: send@0.6.0
    - Cap `maxAge` value to 1 year
    - deps: debug@1.0.3

1.3.1 / 2014-07-09
==================

  * deps: parseurl@~1.1.3
    - faster parsing of href-only URLs

1.3.0 / 2014-06-28
==================

  * Add `setHeaders` option
  * Include HTML link in redirect response
  * deps: send@0.5.0
    - Accept string for `maxAge` (converted by `ms`)

1.2.3 / 2014-06-11
==================

  * deps: send@0.4.3
    - Do not throw un-catchable error on file open race condition
    - Use `escape-html` for HTML escaping
    - deps: debug@1.0.2
    - deps: finished@1.2.2
    - deps: fresh@0.2.2

1.2.2 / 2014-06-09
==================

  * deps: send@0.4.2
    - fix "event emitter leak" warnings
    - deps: debug@1.0.1
    - deps: finished@1.2.1

1.2.1 / 2014-06-02
==================

  * use `escape-html` for escaping
  * deps: send@0.4.1
    - Send `max-age` in `Cache-Control` in correct format

1.2.0 / 2014-05-29
==================

  * deps: send@0.4.0
    - Calculate ETag with md5 for reduced collisions
    - Fix wrong behavior when index file matches directory
    - Ignore stream errors after request ends
    - Skip directories in index file search
    - deps: debug@0.8.1

1.1.0 / 2014-04-24
==================

  * Accept options directly to `send` module
  * deps: send@0.3.0

1.0.4 / 2014-04-07
==================

  * Resolve relative paths at middleware setup
  * Use parseurl to parse the URL from request

1.0.3 / 2014-03-20
==================

  * Do not rely on connect-like environments

1.0.2 / 2014-03-06
==================

  * deps: send@0.2.0

1.0.1 / 2014-03-05
==================

  * Add mime export for back-compat

1.0.0 / 2014-03-05
==================

  * Genesis from `connect`
(The MIT License)

Copyright (c) 2010 Sencha Inc.
Copyright (c) 2011 LearnBoost
Copyright (c) 2011 TJ Holowaychuk
Copyright (c) 2014-2016 Douglas Christopher Wilson

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.
/*!
 * serve-static
 * Copyright(c) 2010 Sencha Inc.
 * Copyright(c) 2011 TJ Holowaychuk
 * Copyright(c) 2014-2016 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module dependencies.
 * @private
 */

var encodeUrl = require('encodeurl')
var escapeHtml = require('escape-html')
var parseUrl = require('parseurl')
var resolve = require('path').resolve
var send = require('send')
var url = require('url')

/**
 * Module exports.
 * @public
 */

module.exports = serveStatic
module.exports.mime = send.mime

/**
 * @param {string} root
 * @param {object} [options]
 * @return {function}
 * @public
 */

function serveStatic (root, options) {
  if (!root) {
    throw new TypeError('root path required')
  }

  if (typeof root !== 'string') {
    throw new TypeError('root path must be a string')
  }

  // copy options object
  var opts = Object.create(options || null)

  // fall-though
  var fallthrough = opts.fallthrough !== false

  // default redirect
  var redirect = opts.redirect !== false

  // headers listener
  var setHeaders = opts.setHeaders

  if (setHeaders && typeof setHeaders !== 'function') {
    throw new TypeError('option setHeaders must be function')
  }

  // setup options for send
  opts.maxage = opts.maxage || opts.maxAge || 0
  opts.root = resolve(root)

  // construct directory listener
  var onDirectory = redirect
    ? createRedirectDirectoryListener()
    : createNotFoundDirectoryListener()

  return function serveStatic (req, res, next) {
    if (req.method !== 'GET' && req.method !== 'HEAD') {
      if (fallthrough) {
        return next()
      }

      // method not allowed
      res.statusCode = 405
      res.setHeader('Allow', 'GET, HEAD')
      res.setHeader('Content-Length', '0')
      res.end()
      return
    }

    var forwardError = !fallthrough
    var originalUrl = parseUrl.original(req)
    var path = parseUrl(req).pathname

    // make sure redirect occurs at mount
    if (path === '/' && originalUrl.pathname.substr(-1) !== '/') {
      path = ''
    }

    // create send stream
    var stream = send(req, path, opts)

    // add directory handler
    stream.on('directory', onDirectory)

    // add headers listener
    if (setHeaders) {
      stream.on('headers', setHeaders)
    }

    // add file listener for fallthrough
    if (fallthrough) {
      stream.on('file', function onFile () {
        // once file is determined, always forward error
        forwardError = true
      })
    }

    // forward errors
    stream.on('error', function error (err) {
      if (forwardError || !(err.statusCode < 500)) {
        next(err)
        return
      }

      next()
    })

    // pipe
    stream.pipe(res)
  }
}

/**
 * Collapse all leading slashes into a single slash
 * @private
 */
function collapseLeadingSlashes (str) {
  for (var i = 0; i < str.length; i++) {
    if (str.charCodeAt(i) !== 0x2f /* / */) {
      break
    }
  }

  return i > 1
    ? '/' + str.substr(i)
    : str
}

/**
 * Create a minimal HTML document.
 *
 * @param {string} title
 * @param {string} body
 * @private
 */

function createHtmlDocument (title, body) {
  return '<!DOCTYPE html>\n' +
    '<html lang="en">\n' +
    '<head>\n' +
    '<meta charset="utf-8">\n' +
    '<title>' + title + '</title>\n' +
    '</head>\n' +
    '<body>\n' +
    '<pre>' + body + '</pre>\n' +
    '</body>\n' +
    '</html>\n'
}

/**
 * Create a directory listener that just 404s.
 * @private
 */

function createNotFoundDirectoryListener () {
  return function notFound () {
    this.error(404)
  }
}

/**
 * Create a directory listener that performs a redirect.
 * @private
 */

function createRedirectDirectoryListener () {
  return function redirect (res) {
    if (this.hasTrailingSlash()) {
      this.error(404)
      return
    }

    // get original URL
    var originalUrl = parseUrl.original(this.req)

    // append trailing slash
    originalUrl.path = null
    originalUrl.pathname = collapseLeadingSlashes(originalUrl.pathname + '/')

    // reformat the URL
    var loc = encodeUrl(url.format(originalUrl))
    var doc = createHtmlDocument('Redirecting', 'Redirecting to <a href="' + escapeHtml(loc) + '">' +
      escapeHtml(loc) + '</a>')

    // send redirect response
    res.statusCode = 301
    res.setHeader('Content-Type', 'text/html; charset=UTF-8')
    res.setHeader('Content-Length', Buffer.byteLength(doc))
    res.setHeader('Content-Security-Policy', "default-src 'none'")
    res.setHeader('X-Content-Type-Options', 'nosniff')
    res.setHeader('Location', loc)
    res.end(doc)
  }
}
{
  "name": "serve-static",
  "description": "Serve static files",
  "version": "1.15.0",
  "author": "Douglas Christopher Wilson <doug@somethingdoug.com>",
  "license": "MIT",
  "repository": "expressjs/serve-static",
  "dependencies": {
    "encodeurl": "~1.0.2",
    "escape-html": "~1.0.3",
    "parseurl": "~1.3.3",
    "send": "0.18.0"
  },
  "devDependencies": {
    "eslint": "7.32.0",
    "eslint-config-standard": "14.1.1",
    "eslint-plugin-import": "2.25.4",
    "eslint-plugin-markdown": "2.2.1",
    "eslint-plugin-node": "11.1.0",
    "eslint-plugin-promise": "5.2.0",
    "eslint-plugin-standard": "4.1.0",
    "mocha": "9.2.2",
    "nyc": "15.1.0",
    "safe-buffer": "5.2.1",
    "supertest": "6.2.2"
  },
  "files": [
    "LICENSE",
    "HISTORY.md",
    "index.js"
  ],
  "engines": {
    "node": ">= 0.8.0"
  }
}Copyright (c) 2016, 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.
module.exports = function (blocking) {
  [process.stdout, process.stderr].forEach(function (stream) {
    if (stream._handle && stream.isTTY && typeof stream._handle.setBlocking === 'function') {
      stream._handle.setBlocking(blocking)
    }
  })
}
{
  "name": "set-blocking",
  "version": "2.0.0",
  "description": "set blocking stdio and stderr ensuring that terminal output does not truncate",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/yargs/set-blocking.git"
  },
  "author": "Ben Coe <ben@npmjs.com>",
  "license": "ISC",
  "homepage": "https://github.com/yargs/set-blocking#readme",
  "devDependencies": {
    "chai": "^3.5.0",
    "coveralls": "^2.11.9",
    "mocha": "^2.4.5",
    "nyc": "^6.4.4",
    "standard": "^7.0.1",
    "standard-version": "^2.2.1"
  },
  "files": [
    "index.js",
    "LICENSE.txt"
  ]
}Copyright (c) 2015, Wes Todd

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.
'use strict'
/* eslint no-proto: 0 */
module.exports = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array ? setProtoOf : mixinProperties)

function setProtoOf (obj, proto) {
  obj.__proto__ = proto
  return obj
}

function mixinProperties (obj, proto) {
  for (var prop in proto) {
    if (!Object.prototype.hasOwnProperty.call(obj, prop)) {
      obj[prop] = proto[prop]
    }
  }
  return obj
}
{
  "name": "setprototypeof",
  "version": "1.2.0",
  "description": "A small polyfill for Object.setprototypeof",
  "main": "index.js",
  "typings": "index.d.ts",
  "repository": {
    "type": "git",
    "url": "https://github.com/wesleytodd/setprototypeof.git"
  },
  "author": "Wes Todd",
  "license": "ISC",
  "homepage": "https://github.com/wesleytodd/setprototypeof",
  "devDependencies": {
    "mocha": "^6.1.4",
    "standard": "^13.0.2"
  }
}coverage/
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"lines": 86,
	"statements": 85.93,
	"functions": 82.43,
	"branches": 76.06,
	"exclude": [
		"coverage",
		"test"
	]
}
MIT License

Copyright (c) 2019 Jordan Harband

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 GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');
var inspect = require('object-inspect');

var $TypeError = GetIntrinsic('%TypeError%');
var $WeakMap = GetIntrinsic('%WeakMap%', true);
var $Map = GetIntrinsic('%Map%', true);

var $weakMapGet = callBound('WeakMap.prototype.get', true);
var $weakMapSet = callBound('WeakMap.prototype.set', true);
var $weakMapHas = callBound('WeakMap.prototype.has', true);
var $mapGet = callBound('Map.prototype.get', true);
var $mapSet = callBound('Map.prototype.set', true);
var $mapHas = callBound('Map.prototype.has', true);

/*
 * This function traverses the list returning the node corresponding to the
 * given key.
 *
 * That node is also moved to the head of the list, so that if it's accessed
 * again we don't need to traverse the whole list. By doing so, all the recently
 * used nodes can be accessed relatively quickly.
 */
var listGetNode = function (list, key) { // eslint-disable-line consistent-return
	for (var prev = list, curr; (curr = prev.next) !== null; prev = curr) {
		if (curr.key === key) {
			prev.next = curr.next;
			curr.next = list.next;
			list.next = curr; // eslint-disable-line no-param-reassign
			return curr;
		}
	}
};

var listGet = function (objects, key) {
	var node = listGetNode(objects, key);
	return node && node.value;
};
var listSet = function (objects, key, value) {
	var node = listGetNode(objects, key);
	if (node) {
		node.value = value;
	} else {
		// Prepend the new node to the beginning of the list
		objects.next = { // eslint-disable-line no-param-reassign
			key: key,
			next: objects.next,
			value: value
		};
	}
};
var listHas = function (objects, key) {
	return !!listGetNode(objects, key);
};

module.exports = function getSideChannel() {
	var $wm;
	var $m;
	var $o;
	var channel = {
		assert: function (key) {
			if (!channel.has(key)) {
				throw new $TypeError('Side channel does not contain ' + inspect(key));
			}
		},
		get: function (key) { // eslint-disable-line consistent-return
			if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {
				if ($wm) {
					return $weakMapGet($wm, key);
				}
			} else if ($Map) {
				if ($m) {
					return $mapGet($m, key);
				}
			} else {
				if ($o) { // eslint-disable-line no-lonely-if
					return listGet($o, key);
				}
			}
		},
		has: function (key) {
			if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {
				if ($wm) {
					return $weakMapHas($wm, key);
				}
			} else if ($Map) {
				if ($m) {
					return $mapHas($m, key);
				}
			} else {
				if ($o) { // eslint-disable-line no-lonely-if
					return listHas($o, key);
				}
			}
			return false;
		},
		set: function (key, value) {
			if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {
				if (!$wm) {
					$wm = new $WeakMap();
				}
				$weakMapSet($wm, key, value);
			} else if ($Map) {
				if (!$m) {
					$m = new $Map();
				}
				$mapSet($m, key, value);
			} else {
				if (!$o) {
					/*
					 * Initialize the linked list as an empty node, so that we don't have
					 * to special-case handling of the first node: we can always refer to
					 * it as (previous node).next, instead of something like (list).head
					 */
					$o = { key: {}, next: null };
				}
				listSet($o, key, value);
			}
		}
	};
	return channel;
};
{
  "name": "side-channel",
  "version": "1.0.4",
  "description": "Store information about any JS value in a side channel. Uses WeakMap if available.",
  "main": "index.js",
  "exports": {
    "./package.json": "./package.json",
    ".": [
      {
        "default": "./index.js"
      },
      "./index.js"
    ]
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/ljharb/side-channel.git"
  },
  "author": "Jordan Harband <ljharb@gmail.com>",
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "license": "MIT",
  "homepage": "https://github.com/ljharb/side-channel#readme",
  "devDependencies": {
    "@ljharb/eslint-config": "^17.3.0",
    "aud": "^1.1.3",
    "auto-changelog": "^2.2.1",
    "eslint": "^7.16.0",
    "nyc": "^10.3.2",
    "safe-publish-latest": "^1.1.4",
    "tape": "^5.0.1"
  },
  "dependencies": {
    "call-bind": "^1.0.0",
    "get-intrinsic": "^1.0.2",
    "object-inspect": "^1.9.0"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false,
    "hideCredit": true
  }
}# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/side-channel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
The ISC License

Copyright (c) 2015, 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.
// Note: since nyc uses this module to output coverage, any lines
// that are in the direct sync flow of nyc's outputCoverage are
// ignored, since we can never get coverage for them.
// grab a reference to node's real process object right away
var process = global.process

const processOk = function (process) {
  return process &&
    typeof process === 'object' &&
    typeof process.removeListener === 'function' &&
    typeof process.emit === 'function' &&
    typeof process.reallyExit === 'function' &&
    typeof process.listeners === 'function' &&
    typeof process.kill === 'function' &&
    typeof process.pid === 'number' &&
    typeof process.on === 'function'
}

// some kind of non-node environment, just no-op
/* istanbul ignore if */
if (!processOk(process)) {
  module.exports = function () {
    return function () {}
  }
} else {
  var assert = require('assert')
  var signals = require('./signals.js')
  var isWin = /^win/i.test(process.platform)

  var EE = require('events')
  /* istanbul ignore if */
  if (typeof EE !== 'function') {
    EE = EE.EventEmitter
  }

  var emitter
  if (process.__signal_exit_emitter__) {
    emitter = process.__signal_exit_emitter__
  } else {
    emitter = process.__signal_exit_emitter__ = new EE()
    emitter.count = 0
    emitter.emitted = {}
  }

  // Because this emitter is a global, we have to check to see if a
  // previous version of this library failed to enable infinite listeners.
  // I know what you're about to say.  But literally everything about
  // signal-exit is a compromise with evil.  Get used to it.
  if (!emitter.infinite) {
    emitter.setMaxListeners(Infinity)
    emitter.infinite = true
  }

  module.exports = function (cb, opts) {
    /* istanbul ignore if */
    if (!processOk(global.process)) {
      return function () {}
    }
    assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler')

    if (loaded === false) {
      load()
    }

    var ev = 'exit'
    if (opts && opts.alwaysLast) {
      ev = 'afterexit'
    }

    var remove = function () {
      emitter.removeListener(ev, cb)
      if (emitter.listeners('exit').length === 0 &&
          emitter.listeners('afterexit').length === 0) {
        unload()
      }
    }
    emitter.on(ev, cb)

    return remove
  }

  var unload = function unload () {
    if (!loaded || !processOk(global.process)) {
      return
    }
    loaded = false

    signals.forEach(function (sig) {
      try {
        process.removeListener(sig, sigListeners[sig])
      } catch (er) {}
    })
    process.emit = originalProcessEmit
    process.reallyExit = originalProcessReallyExit
    emitter.count -= 1
  }
  module.exports.unload = unload

  var emit = function emit (event, code, signal) {
    /* istanbul ignore if */
    if (emitter.emitted[event]) {
      return
    }
    emitter.emitted[event] = true
    emitter.emit(event, code, signal)
  }

  // { <signal>: <listener fn>, ... }
  var sigListeners = {}
  signals.forEach(function (sig) {
    sigListeners[sig] = function listener () {
      /* istanbul ignore if */
      if (!processOk(global.process)) {
        return
      }
      // If there are no other listeners, an exit is coming!
      // Simplest way: remove us and then re-send the signal.
      // We know that this will kill the process, so we can
      // safely emit now.
      var listeners = process.listeners(sig)
      if (listeners.length === emitter.count) {
        unload()
        emit('exit', null, sig)
        /* istanbul ignore next */
        emit('afterexit', null, sig)
        /* istanbul ignore next */
        if (isWin && sig === 'SIGHUP') {
          // "SIGHUP" throws an `ENOSYS` error on Windows,
          // so use a supported signal instead
          sig = 'SIGINT'
        }
        /* istanbul ignore next */
        process.kill(process.pid, sig)
      }
    }
  })

  module.exports.signals = function () {
    return signals
  }

  var loaded = false

  var load = function load () {
    if (loaded || !processOk(global.process)) {
      return
    }
    loaded = true

    // This is the number of onSignalExit's that are in play.
    // It's important so that we can count the correct number of
    // listeners on signals, and don't wait for the other one to
    // handle it instead of us.
    emitter.count += 1

    signals = signals.filter(function (sig) {
      try {
        process.on(sig, sigListeners[sig])
        return true
      } catch (er) {
        return false
      }
    })

    process.emit = processEmit
    process.reallyExit = processReallyExit
  }
  module.exports.load = load

  var originalProcessReallyExit = process.reallyExit
  var processReallyExit = function processReallyExit (code) {
    /* istanbul ignore if */
    if (!processOk(global.process)) {
      return
    }
    process.exitCode = code || /* istanbul ignore next */ 0
    emit('exit', process.exitCode, null)
    /* istanbul ignore next */
    emit('afterexit', process.exitCode, null)
    /* istanbul ignore next */
    originalProcessReallyExit.call(process, process.exitCode)
  }

  var originalProcessEmit = process.emit
  var processEmit = function processEmit (ev, arg) {
    if (ev === 'exit' && processOk(global.process)) {
      /* istanbul ignore else */
      if (arg !== undefined) {
        process.exitCode = arg
      }
      var ret = originalProcessEmit.apply(this, arguments)
      /* istanbul ignore next */
      emit('exit', process.exitCode, null)
      /* istanbul ignore next */
      emit('afterexit', process.exitCode, null)
      /* istanbul ignore next */
      return ret
    } else {
      return originalProcessEmit.apply(this, arguments)
    }
  }
}
{
  "name": "signal-exit",
  "version": "3.0.7",
  "description": "when you want to fire an event no matter how a process exits.",
  "main": "index.js",
  "files": [
    "index.js",
    "signals.js"
  ],
  "repository": {
    "type": "git",
    "url": "https://github.com/tapjs/signal-exit.git"
  },
  "author": "Ben Coe <ben@npmjs.com>",
  "license": "ISC",
  "homepage": "https://github.com/tapjs/signal-exit",
  "devDependencies": {
    "chai": "^3.5.0",
    "coveralls": "^3.1.1",
    "nyc": "^15.1.0",
    "standard-version": "^9.3.1",
    "tap": "^15.1.1"
  }
}// This is not the set of all possible signals.
//
// It IS, however, the set of all signals that trigger
// an exit on either Linux or BSD systems.  Linux is a
// superset of the signal names supported on BSD, and
// the unknown signals just fail to register, so we can
// catch that easily enough.
//
// Don't bother with SIGKILL.  It's uncatchable, which
// means that we can't fire any callbacks anyway.
//
// If a user does happen to register a handler on a non-
// fatal signal like SIGWINCH or something, and then
// exit, it'll end up firing `process.emit('exit')`, so
// the handler will be fired anyway.
//
// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised
// artificially, inherently leave the process in a
// state from which it is not safe to try and enter JS
// listeners.
module.exports = [
  'SIGABRT',
  'SIGALRM',
  'SIGHUP',
  'SIGINT',
  'SIGTERM'
]

if (process.platform !== 'win32') {
  module.exports.push(
    'SIGVTALRM',
    'SIGXCPU',
    'SIGXFSZ',
    'SIGUSR2',
    'SIGTRAP',
    'SIGSYS',
    'SIGQUIT',
    'SIGIOT'
    // should detect profiler and enable/disable accordingly.
    // see #21
    // 'SIGPROF'
  )
}

if (process.platform === 'linux') {
  module.exports.push(
    'SIGIO',
    'SIGPOLL',
    'SIGPWR',
    'SIGSTKFLT',
    'SIGUNUSED'
  )
}
The MIT License (MIT)

Copyright (c) Feross Aboukhadijeh

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.
/*! simple-concat. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
module.exports = function (stream, cb) {
  var chunks = []
  stream.on('data', function (chunk) {
    chunks.push(chunk)
  })
  stream.once('end', function () {
    if (cb) cb(null, Buffer.concat(chunks))
    cb = null
  })
  stream.once('error', function (err) {
    if (cb) cb(err)
    cb = null
  })
}
{
  "name": "simple-concat",
  "description": "Super-minimalist version of `concat-stream`. Less than 15 lines!",
  "version": "1.0.1",
  "author": {
    "name": "Feross Aboukhadijeh",
    "email": "feross@feross.org",
    "url": "https://feross.org"
  },
  "dependencies": {},
  "devDependencies": {
    "standard": "*",
    "tape": "^5.0.1"
  },
  "homepage": "https://github.com/feross/simple-concat",
  "license": "MIT",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/feross/simple-concat.git"
  },
  "funding": [
    {
      "type": "github",
      "url": "https://github.com/sponsors/feross"
    },
    {
      "type": "patreon",
      "url": "https://www.patreon.com/feross"
    },
    {
      "type": "consulting",
      "url": "https://feross.org/support"
    }
  ]
}The MIT License (MIT)

Copyright (c) Feross Aboukhadijeh

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.
/*! simple-get. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
module.exports = simpleGet

const concat = require('simple-concat')
const decompressResponse = require('decompress-response') // excluded from browser build
const http = require('http')
const https = require('https')
const once = require('once')
const querystring = require('querystring')
const url = require('url')

const isStream = o => o !== null && typeof o === 'object' && typeof o.pipe === 'function'

function simpleGet (opts, cb) {
  opts = Object.assign({ maxRedirects: 10 }, typeof opts === 'string' ? { url: opts } : opts)
  cb = once(cb)

  if (opts.url) {
    const { hostname, port, protocol, auth, path } = url.parse(opts.url) // eslint-disable-line node/no-deprecated-api
    delete opts.url
    if (!hostname && !port && !protocol && !auth) opts.path = path // Relative redirect
    else Object.assign(opts, { hostname, port, protocol, auth, path }) // Absolute redirect
  }

  const headers = { 'accept-encoding': 'gzip, deflate' }
  if (opts.headers) Object.keys(opts.headers).forEach(k => (headers[k.toLowerCase()] = opts.headers[k]))
  opts.headers = headers

  let body
  if (opts.body) {
    body = opts.json && !isStream(opts.body) ? JSON.stringify(opts.body) : opts.body
  } else if (opts.form) {
    body = typeof opts.form === 'string' ? opts.form : querystring.stringify(opts.form)
    opts.headers['content-type'] = 'application/x-www-form-urlencoded'
  }

  if (body) {
    if (!opts.method) opts.method = 'POST'
    if (!isStream(body)) opts.headers['content-length'] = Buffer.byteLength(body)
    if (opts.json && !opts.form) opts.headers['content-type'] = 'application/json'
  }
  delete opts.body; delete opts.form

  if (opts.json) opts.headers.accept = 'application/json'
  if (opts.method) opts.method = opts.method.toUpperCase()

  const originalHost = opts.hostname // hostname before potential redirect
  const protocol = opts.protocol === 'https:' ? https : http // Support http/https urls
  const req = protocol.request(opts, res => {
    if (opts.followRedirects !== false && res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
      opts.url = res.headers.location // Follow 3xx redirects
      delete opts.headers.host // Discard `host` header on redirect (see #32)
      res.resume() // Discard response

      const redirectHost = url.parse(opts.url).hostname // eslint-disable-line node/no-deprecated-api
      // If redirected host is different than original host, drop headers to prevent cookie leak (#73)
      if (redirectHost !== null && redirectHost !== originalHost) {
        delete opts.headers.cookie
        delete opts.headers.authorization
      }

      if (opts.method === 'POST' && [301, 302].includes(res.statusCode)) {
        opts.method = 'GET' // On 301/302 redirect, change POST to GET (see #35)
        delete opts.headers['content-length']; delete opts.headers['content-type']
      }

      if (opts.maxRedirects-- === 0) return cb(new Error('too many redirects'))
      else return simpleGet(opts, cb)
    }

    const tryUnzip = typeof decompressResponse === 'function' && opts.method !== 'HEAD'
    cb(null, tryUnzip ? decompressResponse(res) : res)
  })
  req.on('timeout', () => {
    req.abort()
    cb(new Error('Request timed out'))
  })
  req.on('error', cb)

  if (isStream(body)) body.on('error', cb).pipe(req)
  else req.end(body)

  return req
}

simpleGet.concat = (opts, cb) => {
  return simpleGet(opts, (err, res) => {
    if (err) return cb(err)
    concat(res, (err, data) => {
      if (err) return cb(err)
      if (opts.json) {
        try {
          data = JSON.parse(data.toString())
        } catch (err) {
          return cb(err, res, data)
        }
      }
      cb(null, res, data)
    })
  })
}

;['get', 'post', 'put', 'patch', 'head', 'delete'].forEach(method => {
  simpleGet[method] = (opts, cb) => {
    if (typeof opts === 'string') opts = { url: opts }
    return simpleGet(Object.assign({ method: method.toUpperCase() }, opts), cb)
  }
})
{
  "name": "simple-get",
  "description": "Simplest way to make http get requests. Supports HTTPS, redirects, gzip/deflate, streams in < 100 lines.",
  "version": "4.0.1",
  "author": {
    "name": "Feross Aboukhadijeh",
    "email": "feross@feross.org",
    "url": "https://feross.org"
  },
  "browser": {
    "decompress-response": false
  },
  "dependencies": {
    "decompress-response": "^6.0.0",
    "once": "^1.3.1",
    "simple-concat": "^1.0.0"
  },
  "devDependencies": {
    "self-signed-https": "^1.0.5",
    "standard": "*",
    "string-to-stream": "^3.0.0",
    "tape": "^5.0.0"
  },
  "homepage": "https://github.com/feross/simple-get",
  "license": "MIT",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/feross/simple-get.git"
  },
  "funding": [
    {
      "type": "github",
      "url": "https://github.com/sponsors/feross"
    },
    {
      "type": "patreon",
      "url": "https://www.patreon.com/feross"
    },
    {
      "type": "consulting",
      "url": "https://feross.org/support"
    }
  ]
}version: 2
updates:
  - package-ecosystem: npm
    directory: /
    schedule:
      interval: daily
    labels:
      - dependency
    versioning-strategy: increase-if-necessary
  - package-ecosystem: github-actions
    directory: /
    schedule:
      interval: daily
    labels:
      - dependency
name: ci
'on':
  - push
  - pull_request
jobs:
  test:
    name: Node ${{ matrix.node }} / ${{ matrix.os }}
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os:
          - ubuntu-latest
        node:
          - '14'
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v2
        with:
          node-version: ${{ matrix.node }}
      - run: npm install
      - run: npm run build --if-present
      - run: npm test
parser: typescript
printWidth: 120
tabWidth: 2
singleQuote: true
trailingComma: noneThe MIT License (MIT)

Copyright (c) 2013-2017 Josh Glazebrook

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": "smart-buffer",
  "version": "4.2.0",
  "description": "smart-buffer is a Buffer wrapper that adds automatic read & write offset tracking, string operations, data insertions, and more.",
  "main": "build/smartbuffer.js",
  "homepage": "https://github.com/JoshGlazebrook/smart-buffer/",
  "repository": {
    "type": "git",
    "url": "https://github.com/JoshGlazebrook/smart-buffer.git"
  },
  "engines": {
    "node": ">= 6.0.0",
    "npm": ">= 3.0.0"
  },
  "author": "Josh Glazebrook",
  "license": "MIT",
  "readmeFilename": "README.md",
  "devDependencies": {
    "@types/chai": "4.1.7",
    "@types/mocha": "5.2.7",
    "@types/node": "^12.0.0",
    "chai": "4.2.0",
    "coveralls": "3.0.5",
    "istanbul": "^0.4.5",
    "mocha": "6.2.0",
    "mocha-lcov-reporter": "^1.3.0",
    "nyc": "14.1.1",
    "source-map-support": "0.5.12",
    "ts-node": "8.3.0",
    "tslint": "5.18.0",
    "typescript": "^3.2.1"
  },
  "typings": "typings/smartbuffer.d.ts",
  "dependencies": {}
}smart-buffer  [![Build Status](https://travis-ci.org/JoshGlazebrook/smart-buffer.svg?branch=master)](https://travis-ci.org/JoshGlazebrook/smart-buffer)  [![Coverage Status](https://coveralls.io/repos/github/JoshGlazebrook/smart-buffer/badge.svg?branch=master)](https://coveralls.io/github/JoshGlazebrook/smart-buffer?branch=master)
=============

smart-buffer is a light Buffer wrapper that takes away the need to keep track of what position to read and write data to and from the underlying Buffer. It also adds null terminating string operations and **grows** as you add more data.

![stats](https://nodei.co/npm/smart-buffer.png?downloads=true&downloadRank=true&stars=true "stats")

### What it's useful for:

I created smart-buffer because I wanted to simplify the process of using Buffer for building and reading network packets to send over a socket. Rather than having to keep track of which position I need to write a UInt16 to after adding a string of variable length, I simply don't have to.

Key Features:
* Proxies all of the Buffer write and read functions.
* Keeps track of read and write positions for you.
* Grows the internal Buffer as you add data to it. 
* Useful string operations. (Null terminating strings)
* Allows for inserting values at specific points in the internal Buffer.
* Built in TypeScript
* Type Definitions Provided

Requirements:
* Node v4.0+ is supported at this time.  (Versions prior to 2.0 will work on node 0.10)


#### Note:
smart-buffer can be used for writing to an underlying buffer as well as reading from it. It however does not function correctly if you're mixing both read and write operations with each other.

## Breaking Changes with 2.0
The latest version (2.0+) is written in TypeScript, and are compiled to ES6 Javascript. This means the earliest Node.js it supports will be 4.x (in strict mode.) If you're using version 6 and above it will work without any issues. From an API standpoint, 2.0 is backwards compatible. The only difference is SmartBuffer is not exported directly as the root module.

## Breaking Changes with 3.0
Starting with 3.0, if any of the readIntXXXX() methods are called and the requested data is larger than the bounds of the internally managed valid buffer data, an exception will now be thrown.

## Installing:

`npm install smart-buffer`

or

`yarn add smart-buffer`

Note: The published NPM package includes the built javascript library. 
If you cloned this repo and wish to build the library manually use:

`tsc -p ./`

## Using smart-buffer

### Example

Say you were building a packet that had to conform to the following protocol:

`[PacketType:2][PacketLength:2][Data:XX]`

To build this packet using the vanilla Buffer class, you would have to count up the length of the data payload beforehand. You would also need to keep track of the current "cursor" position in your Buffer so you write everything in the right places. With smart-buffer you don't have to do either of those things.

```javascript
// 1.x (javascript)
var SmartBuffer = require('smart-buffer');

// 1.x (typescript)
import SmartBuffer = require('smart-buffer');

// 2.x+ (javascript)
const SmartBuffer = require('smart-buffer').SmartBuffer;

// 2.x+ (typescript)
import { SmartBuffer, SmartBufferOptions} from 'smart-buffer';

function createLoginPacket(username, password, age, country) {
    let packet = new SmartBuffer();
    packet.writeUInt16LE(0x0060); // Login Packet Type/ID
    packet.writeStringNT(username);
    packet.writeStringNT(password);
    packet.writeUInt8(age);
    packet.writeStringNT(country);
    packet.writeUInt16LE(packet.length - 2, 2);
    
    return packet.toBuffer();
}
```
With the above function, you now can do this:
```javascript
let login = createLoginPacket("Josh", "secret123", 22, "United States");

// <Buffer 60 00 1e 00 4a 6f 73 68 00 73 65 63 72 65 74 31 32 33 00 16 55 6e 69 74 65 64 20 53 74 61 74 65 73 00>
```
Notice that the `[PacketLength:2]` part of the packet was inserted after we had added everything else, and as shown in the Buffer dump above, is in the correct location along with everything else.

Reading back the packet we created above is just as easy:
```javascript

let reader = SmartBuffer.fromBuffer(login);

let logininfo = {
    packetType: reader.readUInt16LE(),
    packetLength: reader.readUInt16LE(),
    username: reader.readStringNT(),
    password: reader.readStringNT(),
    age: reader.readUInt8(),
    country: reader.readStringNT()
};

/*
{ 
    packetType: 96, (0x0060)
    packetLength: 30,
    username: 'Josh',
    password: 'secret123',
    age: 22,
    country: 'United States' 
};
*/
```

# Api Reference:

### Constructing a smart-buffer

smart-buffer has a few different ways to construct an instance. Starting with version 2.0, the following factory methods are preffered.

```javascript
let SmartBuffer = require('smart-buffer');

// Creating SmartBuffer from existing Buffer
let buff = SmartBuffer.fromBuffer(buffer); // Creates instance from buffer. (Uses default utf8 encoding)
let buff = SmartBuffer.fromBuffer(buffer, 'ascii'); // Creates instance from buffer with ascii encoding for Strings. 

// Creating SmartBuffer with specified internal Buffer size.
let buff = SmartBuffer.fromSize(1024); // Creates instance with internal Buffer size of 1024.
let buff = SmartBuffer.fromSize(1024, 'utf8'); // Creates instance with intenral Buffer size of 1024, and utf8 encoding. 

// Creating SmartBuffer with options object. This one specifies size and encoding.
let buff = SmartBuffer.fromOptions({
    size: 1024,
    encoding: 'ascii'
});

// Creating SmartBuffer with options object. This one specified an existing Buffer.
let buff = SmartBuffer.fromOptions({
    buff: buffer
});

// Just want a regular SmartBuffer with all default options?
let buff = new SmartBuffer();
```

## Backwards Compatibility:

All constructors used prior to 2.0 still are supported. However it's not recommended to use these.

```javascript
let writer = new SmartBuffer();               // Defaults to utf8, 4096 length internal Buffer.
let writer = new SmartBuffer(1024);           // Defaults to utf8, 1024 length internal Buffer.
let writer = new SmartBuffer('ascii');         // Sets to ascii encoding, 4096 length internal buffer.
let writer = new SmartBuffer(1024, 'ascii');  // Sets to ascii encoding, 1024 length internal buffer.
```

## Reading Data

smart-buffer supports all of the common read functions you will find in the vanilla Buffer class. The only difference is, you do not need to specify which location to start reading from. This is possible because as you read data out of a smart-buffer, it automatically progresses an internal read offset/position to know where to pick up from on the next read.

## Reading Numeric Values

When numeric values, you simply need to call the function you want, and the data is returned.

Supported Operations:
* readInt8
* readInt16BE
* readInt16LE
* readInt32BE
* readInt32LE
* readBigInt64LE
* readBigInt64BE
* readUInt8
* readUInt16BE
* readUInt16LE
* readUInt32BE
* readUInt32LE
* readBigUInt64LE
* readBigUInt64BE
* readFloatBE
* readFloatLE
* readDoubleBE
* readDoubleLE

```javascript
let reader = new SmartBuffer(somebuffer);
let num = reader.readInt8();
```

## Reading String Values

When reading String values, you can either choose to read a null terminated string, or a string of a specified length.

### SmartBuffer.readStringNT( [encoding] )
> `String` **String encoding to use**  - Defaults to the encoding set in the constructor. 

returns `String`

> Note: When readStringNT is called and there is no null character found, smart-buffer will read to the end of the internal Buffer.

### SmartBuffer.readString( [length] )
### SmartBuffer.readString( [encoding] )
### SmartBuffer.readString( [length], [encoding] )
> `Number` **Length of the string to read**

> `String` **String encoding to use** - Defaults to the encoding set in the constructor, or utf8.

returns `String`

> Note: When readString is called without a specified length, smart-buffer will read to the end of the internal Buffer.



## Reading Buffer Values

### SmartBuffer.readBuffer( length )
> `Number` **Length of data to read into a Buffer**

returns `Buffer`

> Note: This function uses `slice` to retrieve the Buffer.


### SmartBuffer.readBufferNT()

returns `Buffer`

> Note: This reads the next sequence of bytes in the buffer until a null (0x00) value is found. (Null terminated buffer)
> Note: This function uses `slice` to retrieve the Buffer.


## Writing Data

smart-buffer supports all of the common write functions you will find in the vanilla Buffer class. The only difference is, you do not need to specify which location to write to in your Buffer by default. You do however have the option of **inserting** a piece of data into your smart-buffer at a given location. 


## Writing Numeric Values


For numeric values, you simply need to call the function you want, and the data is written at the end of the internal Buffer's current write position. You can specify a offset/position to **insert** the given value at, but keep in mind this does not override data at the given position. This feature also does not work properly when inserting a value beyond the current internal length of the smart-buffer (length being the .length property of the smart-buffer instance you're writing to)

Supported Operations:
* writeInt8
* writeInt16BE
* writeInt16LE
* writeInt32BE
* writeInt32LE
* writeBigInt64BE
* writeBigInt64LE
* writeUInt8
* writeUInt16BE
* writeUInt16LE
* writeUInt32BE
* writeUInt32LE
* writeBigUInt64BE
* writeBigUInt64LE
* writeFloatBE
* writeFloatLE
* writeDoubleBE
* writeDoubleLE

The following signature is the same for all the above functions:

### SmartBuffer.writeInt8( value, [offset] )
> `Number` **A valid Int8 number**

> `Number` **The position to insert this value at** 

returns this 

> Note: All write operations return `this` to allow for chaining.

## Writing String Values

When reading String values, you can either choose to write a null terminated string, or a non null terminated string.

### SmartBuffer.writeStringNT( value, [offset], [encoding] )
### SmartBuffer.writeStringNT( value, [offset] )
### SmartBuffer.writeStringNT( value, [encoding] )
> `String` **String value to write**

> `Number` **The position to insert this String at**

> `String` **The String encoding to use.** - Defaults to the encoding set in the constructor, or utf8.

returns this

### SmartBuffer.writeString( value, [offset], [encoding] )
### SmartBuffer.writeString( value, [offset] )
### SmartBuffer.writeString( value, [encoding] )
> `String` **String value to write**

> `Number` **The position to insert this String at**

> `String` **The String encoding to use** - Defaults to the encoding set in the constructor, or utf8.

returns this


## Writing Buffer Values

### SmartBuffer.writeBuffer( value, [offset] )
> `Buffer` **Buffer value to write**

> `Number` **The position to insert this Buffer's content at**

returns this

### SmartBuffer.writeBufferNT( value, [offset] )
> `Buffer` **Buffer value to write**

> `Number` **The position to insert this Buffer's content at**

returns this


## Utility Functions

### SmartBuffer.clear()
Resets the SmartBuffer to its default state where it can be reused for reading or writing.

### SmartBuffer.remaining()

returns `Number` The amount of data left to read based on the current read Position.

### SmartBuffer.skip( value )
> `Number` **The amount of bytes to skip ahead**

Skips the read position ahead by the given value.

returns this

### SmartBuffer.rewind( value )
> `Number` **The amount of bytes to reward backwards**

Rewinds the read position backwards by the given value.

returns this

### SmartBuffer.moveTo( position )
> `Number` **The point to skip the read position to**

Moves the read position to the given point.
returns this

### SmartBuffer.toBuffer()

returns `Buffer` A Buffer containing the contents of the internal Buffer.

> Note: This uses the slice function.

### SmartBuffer.toString( [encoding] )
> `String` **The String encoding to use** - Defaults to the encoding set in the constructor, or utf8.

returns `String` The internal Buffer in String representation.

## Properties

### SmartBuffer.length

returns `Number` **The length of the data that is being tracked in the internal Buffer** - Does NOT return the absolute length of the internal Buffer being written to.

## License

This work is licensed under the [MIT license](http://en.wikipedia.org/wiki/MIT_License)."use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const utils_1 = require("./utils");
// The default Buffer size if one is not provided.
const DEFAULT_SMARTBUFFER_SIZE = 4096;
// The default string encoding to use for reading/writing strings.
const DEFAULT_SMARTBUFFER_ENCODING = 'utf8';
class SmartBuffer {
    /**
     * Creates a new SmartBuffer instance.
     *
     * @param options { SmartBufferOptions } The SmartBufferOptions to apply to this instance.
     */
    constructor(options) {
        this.length = 0;
        this._encoding = DEFAULT_SMARTBUFFER_ENCODING;
        this._writeOffset = 0;
        this._readOffset = 0;
        if (SmartBuffer.isSmartBufferOptions(options)) {
            // Checks for encoding
            if (options.encoding) {
                utils_1.checkEncoding(options.encoding);
                this._encoding = options.encoding;
            }
            // Checks for initial size length
            if (options.size) {
                if (utils_1.isFiniteInteger(options.size) && options.size > 0) {
                    this._buff = Buffer.allocUnsafe(options.size);
                }
                else {
                    throw new Error(utils_1.ERRORS.INVALID_SMARTBUFFER_SIZE);
                }
                // Check for initial Buffer
            }
            else if (options.buff) {
                if (Buffer.isBuffer(options.buff)) {
                    this._buff = options.buff;
                    this.length = options.buff.length;
                }
                else {
                    throw new Error(utils_1.ERRORS.INVALID_SMARTBUFFER_BUFFER);
                }
            }
            else {
                this._buff = Buffer.allocUnsafe(DEFAULT_SMARTBUFFER_SIZE);
            }
        }
        else {
            // If something was passed but it's not a SmartBufferOptions object
            if (typeof options !== 'undefined') {
                throw new Error(utils_1.ERRORS.INVALID_SMARTBUFFER_OBJECT);
            }
            // Otherwise default to sane options
            this._buff = Buffer.allocUnsafe(DEFAULT_SMARTBUFFER_SIZE);
        }
    }
    /**
     * Creates a new SmartBuffer instance with the provided internal Buffer size and optional encoding.
     *
     * @param size { Number } The size of the internal Buffer.
     * @param encoding { String } The BufferEncoding to use for strings.
     *
     * @return { SmartBuffer }
     */
    static fromSize(size, encoding) {
        return new this({
            size: size,
            encoding: encoding
        });
    }
    /**
     * Creates a new SmartBuffer instance with the provided Buffer and optional encoding.
     *
     * @param buffer { Buffer } The Buffer to use as the internal Buffer value.
     * @param encoding { String } The BufferEncoding to use for strings.
     *
     * @return { SmartBuffer }
     */
    static fromBuffer(buff, encoding) {
        return new this({
            buff: buff,
            encoding: encoding
        });
    }
    /**
     * Creates a new SmartBuffer instance with the provided SmartBufferOptions options.
     *
     * @param options { SmartBufferOptions } The options to use when creating the SmartBuffer instance.
     */
    static fromOptions(options) {
        return new this(options);
    }
    /**
     * Type checking function that determines if an object is a SmartBufferOptions object.
     */
    static isSmartBufferOptions(options) {
        const castOptions = options;
        return (castOptions &&
            (castOptions.encoding !== undefined || castOptions.size !== undefined || castOptions.buff !== undefined));
    }
    // Signed integers
    /**
     * Reads an Int8 value from the current read position or an optionally provided offset.
     *
     * @param offset { Number } The offset to read data from (optional)
     * @return { Number }
     */
    readInt8(offset) {
        return this._readNumberValue(Buffer.prototype.readInt8, 1, offset);
    }
    /**
     * Reads an Int16BE value from the current read position or an optionally provided offset.
     *
     * @param offset { Number } The offset to read data from (optional)
     * @return { Number }
     */
    readInt16BE(offset) {
        return this._readNumberValue(Buffer.prototype.readInt16BE, 2, offset);
    }
    /**
     * Reads an Int16LE value from the current read position or an optionally provided offset.
     *
     * @param offset { Number } The offset to read data from (optional)
     * @return { Number }
     */
    readInt16LE(offset) {
        return this._readNumberValue(Buffer.prototype.readInt16LE, 2, offset);
    }
    /**
     * Reads an Int32BE value from the current read position or an optionally provided offset.
     *
     * @param offset { Number } The offset to read data from (optional)
     * @return { Number }
     */
    readInt32BE(offset) {
        return this._readNumberValue(Buffer.prototype.readInt32BE, 4, offset);
    }
    /**
     * Reads an Int32LE value from the current read position or an optionally provided offset.
     *
     * @param offset { Number } The offset to read data from (optional)
     * @return { Number }
     */
    readInt32LE(offset) {
        return this._readNumberValue(Buffer.prototype.readInt32LE, 4, offset);
    }
    /**
     * Reads a BigInt64BE value from the current read position or an optionally provided offset.
     *
     * @param offset { Number } The offset to read data from (optional)
     * @return { BigInt }
     */
    readBigInt64BE(offset) {
        utils_1.bigIntAndBufferInt64Check('readBigInt64BE');
        return this._readNumberValue(Buffer.prototype.readBigInt64BE, 8, offset);
    }
    /**
     * Reads a BigInt64LE value from the current read position or an optionally provided offset.
     *
     * @param offset { Number } The offset to read data from (optional)
     * @return { BigInt }
     */
    readBigInt64LE(offset) {
        utils_1.bigIntAndBufferInt64Check('readBigInt64LE');
        return this._readNumberValue(Buffer.prototype.readBigInt64LE, 8, offset);
    }
    /**
     * Writes an Int8 value to the current write position (or at optional offset).
     *
     * @param value { Number } The value to write.
     * @param offset { Number } The offset to write the value at.
     *
     * @return this
     */
    writeInt8(value, offset) {
        this._writeNumberValue(Buffer.prototype.writeInt8, 1, value, offset);
        return this;
    }
    /**
     * Inserts an Int8 value at the given offset value.
     *
     * @param value { Number } The value to insert.
     * @param offset { Number } The offset to insert the value at.
     *
     * @return this
     */
    insertInt8(value, offset) {
        return this._insertNumberValue(Buffer.prototype.writeInt8, 1, value, offset);
    }
    /**
     * Writes an Int16BE value to the current write position (or at optional offset).
     *
     * @param value { Number } The value to write.
     * @param offset { Number } The offset to write the value at.
     *
     * @return this
     */
    writeInt16BE(value, offset) {
        return this._writeNumberValue(Buffer.prototype.writeInt16BE, 2, value, offset);
    }
    /**
     * Inserts an Int16BE value at the given offset value.
     *
     * @param value { Number } The value to insert.
     * @param offset { Number } The offset to insert the value at.
     *
     * @return this
     */
    insertInt16BE(value, offset) {
        return this._insertNumberValue(Buffer.prototype.writeInt16BE, 2, value, offset);
    }
    /**
     * Writes an Int16LE value to the current write position (or at optional offset).
     *
     * @param value { Number } The value to write.
     * @param offset { Number } The offset to write the value at.
     *
     * @return this
     */
    writeInt16LE(value, offset) {
        return this._writeNumberValue(Buffer.prototype.writeInt16LE, 2, value, offset);
    }
    /**
     * Inserts an Int16LE value at the given offset value.
     *
     * @param value { Number } The value to insert.
     * @param offset { Number } The offset to insert the value at.
     *
     * @return this
     */
    insertInt16LE(value, offset) {
        return this._insertNumberValue(Buffer.prototype.writeInt16LE, 2, value, offset);
    }
    /**
     * Writes an Int32BE value to the current write position (or at optional offset).
     *
     * @param value { Number } The value to write.
     * @param offset { Number } The offset to write the value at.
     *
     * @return this
     */
    writeInt32BE(value, offset) {
        return this._writeNumberValue(Buffer.prototype.writeInt32BE, 4, value, offset);
    }
    /**
     * Inserts an Int32BE value at the given offset value.
     *
     * @param value { Number } The value to insert.
     * @param offset { Number } The offset to insert the value at.
     *
     * @return this
     */
    insertInt32BE(value, offset) {
        return this._insertNumberValue(Buffer.prototype.writeInt32BE, 4, value, offset);
    }
    /**
     * Writes an Int32LE value to the current write position (or at optional offset).
     *
     * @param value { Number } The value to write.
     * @param offset { Number } The offset to write the value at.
     *
     * @return this
     */
    writeInt32LE(value, offset) {
        return this._writeNumberValue(Buffer.prototype.writeInt32LE, 4, value, offset);
    }
    /**
     * Inserts an Int32LE value at the given offset value.
     *
     * @param value { Number } The value to insert.
     * @param offset { Number } The offset to insert the value at.
     *
     * @return this
     */
    insertInt32LE(value, offset) {
        return this._insertNumberValue(Buffer.prototype.writeInt32LE, 4, value, offset);
    }
    /**
     * Writes a BigInt64BE value to the current write position (or at optional offset).
     *
     * @param value { BigInt } The value to write.
     * @param offset { Number } The offset to write the value at.
     *
     * @return this
     */
    writeBigInt64BE(value, offset) {
        utils_1.bigIntAndBufferInt64Check('writeBigInt64BE');
        return this._writeNumberValue(Buffer.prototype.writeBigInt64BE, 8, value, offset);
    }
    /**
     * Inserts a BigInt64BE value at the given offset value.
     *
     * @param value { BigInt } The value to insert.
     * @param offset { Number } The offset to insert the value at.
     *
     * @return this
     */
    insertBigInt64BE(value, offset) {
        utils_1.bigIntAndBufferInt64Check('writeBigInt64BE');
        return this._insertNumberValue(Buffer.prototype.writeBigInt64BE, 8, value, offset);
    }
    /**
     * Writes a BigInt64LE value to the current write position (or at optional offset).
     *
     * @param value { BigInt } The value to write.
     * @param offset { Number } The offset to write the value at.
     *
     * @return this
     */
    writeBigInt64LE(value, offset) {
        utils_1.bigIntAndBufferInt64Check('writeBigInt64LE');
        return this._writeNumberValue(Buffer.prototype.writeBigInt64LE, 8, value, offset);
    }
    /**
     * Inserts a Int64LE value at the given offset value.
     *
     * @param value { BigInt } The value to insert.
     * @param offset { Number } The offset to insert the value at.
     *
     * @return this
     */
    insertBigInt64LE(value, offset) {
        utils_1.bigIntAndBufferInt64Check('writeBigInt64LE');
        return this._insertNumberValue(Buffer.prototype.writeBigInt64LE, 8, value, offset);
    }
    // Unsigned Integers
    /**
     * Reads an UInt8 value from the current read position or an optionally provided offset.
     *
     * @param offset { Number } The offset to read data from (optional)
     * @return { Number }
     */
    readUInt8(offset) {
        return this._readNumberValue(Buffer.prototype.readUInt8, 1, offset);
    }
    /**
     * Reads an UInt16BE value from the current read position or an optionally provided offset.
     *
     * @param offset { Number } The offset to read data from (optional)
     * @return { Number }
     */
    readUInt16BE(offset) {
        return this._readNumberValue(Buffer.prototype.readUInt16BE, 2, offset);
    }
    /**
     * Reads an UInt16LE value from the current read position or an optionally provided offset.
     *
     * @param offset { Number } The offset to read data from (optional)
     * @return { Number }
     */
    readUInt16LE(offset) {
        return this._readNumberValue(Buffer.prototype.readUInt16LE, 2, offset);
    }
    /**
     * Reads an UInt32BE value from the current read position or an optionally provided offset.
     *
     * @param offset { Number } The offset to read data from (optional)
     * @return { Number }
     */
    readUInt32BE(offset) {
        return this._readNumberValue(Buffer.prototype.readUInt32BE, 4, offset);
    }
    /**
     * Reads an UInt32LE value from the current read position or an optionally provided offset.
     *
     * @param offset { Number } The offset to read data from (optional)
     * @return { Number }
     */
    readUInt32LE(offset) {
        return this._readNumberValue(Buffer.prototype.readUInt32LE, 4, offset);
    }
    /**
     * Reads a BigUInt64BE value from the current read position or an optionally provided offset.
     *
     * @param offset { Number } The offset to read data from (optional)
     * @return { BigInt }
     */
    readBigUInt64BE(offset) {
        utils_1.bigIntAndBufferInt64Check('readBigUInt64BE');
        return this._readNumberValue(Buffer.prototype.readBigUInt64BE, 8, offset);
    }
    /**
     * Reads a BigUInt64LE value from the current read position or an optionally provided offset.
     *
     * @param offset { Number } The offset to read data from (optional)
     * @return { BigInt }
     */
    readBigUInt64LE(offset) {
        utils_1.bigIntAndBufferInt64Check('readBigUInt64LE');
        return this._readNumberValue(Buffer.prototype.readBigUInt64LE, 8, offset);
    }
    /**
     * Writes an UInt8 value to the current write position (or at optional offset).
     *
     * @param value { Number } The value to write.
     * @param offset { Number } The offset to write the value at.
     *
     * @return this
     */
    writeUInt8(value, offset) {
        return this._writeNumberValue(Buffer.prototype.writeUInt8, 1, value, offset);
    }
    /**
     * Inserts an UInt8 value at the given offset value.
     *
     * @param value { Number } The value to insert.
     * @param offset { Number } The offset to insert the value at.
     *
     * @return this
     */
    insertUInt8(value, offset) {
        return this._insertNumberValue(Buffer.prototype.writeUInt8, 1, value, offset);
    }
    /**
     * Writes an UInt16BE value to the current write position (or at optional offset).
     *
     * @param value { Number } The value to write.
     * @param offset { Number } The offset to write the value at.
     *
     * @return this
     */
    writeUInt16BE(value, offset) {
        return this._writeNumberValue(Buffer.prototype.writeUInt16BE, 2, value, offset);
    }
    /**
     * Inserts an UInt16BE value at the given offset value.
     *
     * @param value { Number } The value to insert.
     * @param offset { Number } The offset to insert the value at.
     *
     * @return this
     */
    insertUInt16BE(value, offset) {
        return this._insertNumberValue(Buffer.prototype.writeUInt16BE, 2, value, offset);
    }
    /**
     * Writes an UInt16LE value to the current write position (or at optional offset).
     *
     * @param value { Number } The value to write.
     * @param offset { Number } The offset to write the value at.
     *
     * @return this
     */
    writeUInt16LE(value, offset) {
        return this._writeNumberValue(Buffer.prototype.writeUInt16LE, 2, value, offset);
    }
    /**
     * Inserts an UInt16LE value at the given offset value.
     *
     * @param value { Number } The value to insert.
     * @param offset { Number } The offset to insert the value at.
     *
     * @return this
     */
    insertUInt16LE(value, offset) {
        return this._insertNumberValue(Buffer.prototype.writeUInt16LE, 2, value, offset);
    }
    /**
     * Writes an UInt32BE value to the current write position (or at optional offset).
     *
     * @param value { Number } The value to write.
     * @param offset { Number } The offset to write the value at.
     *
     * @return this
     */
    writeUInt32BE(value, offset) {
        return this._writeNumberValue(Buffer.prototype.writeUInt32BE, 4, value, offset);
    }
    /**
     * Inserts an UInt32BE value at the given offset value.
     *
     * @param value { Number } The value to insert.
     * @param offset { Number } The offset to insert the value at.
     *
     * @return this
     */
    insertUInt32BE(value, offset) {
        return this._insertNumberValue(Buffer.prototype.writeUInt32BE, 4, value, offset);
    }
    /**
     * Writes an UInt32LE value to the current write position (or at optional offset).
     *
     * @param value { Number } The value to write.
     * @param offset { Number } The offset to write the value at.
     *
     * @return this
     */
    writeUInt32LE(value, offset) {
        return this._writeNumberValue(Buffer.prototype.writeUInt32LE, 4, value, offset);
    }
    /**
     * Inserts an UInt32LE value at the given offset value.
     *
     * @param value { Number } The value to insert.
     * @param offset { Number } The offset to insert the value at.
     *
     * @return this
     */
    insertUInt32LE(value, offset) {
        return this._insertNumberValue(Buffer.prototype.writeUInt32LE, 4, value, offset);
    }
    /**
     * Writes a BigUInt64BE value to the current write position (or at optional offset).
     *
     * @param value { Number } The value to write.
     * @param offset { Number } The offset to write the value at.
     *
     * @return this
     */
    writeBigUInt64BE(value, offset) {
        utils_1.bigIntAndBufferInt64Check('writeBigUInt64BE');
        return this._writeNumberValue(Buffer.prototype.writeBigUInt64BE, 8, value, offset);
    }
    /**
     * Inserts a BigUInt64BE value at the given offset value.
     *
     * @param value { Number } The value to insert.
     * @param offset { Number } The offset to insert the value at.
     *
     * @return this
     */
    insertBigUInt64BE(value, offset) {
        utils_1.bigIntAndBufferInt64Check('writeBigUInt64BE');
        return this._insertNumberValue(Buffer.prototype.writeBigUInt64BE, 8, value, offset);
    }
    /**
     * Writes a BigUInt64LE value to the current write position (or at optional offset).
     *
     * @param value { Number } The value to write.
     * @param offset { Number } The offset to write the value at.
     *
     * @return this
     */
    writeBigUInt64LE(value, offset) {
        utils_1.bigIntAndBufferInt64Check('writeBigUInt64LE');
        return this._writeNumberValue(Buffer.prototype.writeBigUInt64LE, 8, value, offset);
    }
    /**
     * Inserts a BigUInt64LE value at the given offset value.
     *
     * @param value { Number } The value to insert.
     * @param offset { Number } The offset to insert the value at.
     *
     * @return this
     */
    insertBigUInt64LE(value, offset) {
        utils_1.bigIntAndBufferInt64Check('writeBigUInt64LE');
        return this._insertNumberValue(Buffer.prototype.writeBigUInt64LE, 8, value, offset);
    }
    // Floating Point
    /**
     * Reads an FloatBE value from the current read position or an optionally provided offset.
     *
     * @param offset { Number } The offset to read data from (optional)
     * @return { Number }
     */
    readFloatBE(offset) {
        return this._readNumberValue(Buffer.prototype.readFloatBE, 4, offset);
    }
    /**
     * Reads an FloatLE value from the current read position or an optionally provided offset.
     *
     * @param offset { Number } The offset to read data from (optional)
     * @return { Number }
     */
    readFloatLE(offset) {
        return this._readNumberValue(Buffer.prototype.readFloatLE, 4, offset);
    }
    /**
     * Writes a FloatBE value to the current write position (or at optional offset).
     *
     * @param value { Number } The value to write.
     * @param offset { Number } The offset to write the value at.
     *
     * @return this
     */
    writeFloatBE(value, offset) {
        return this._writeNumberValue(Buffer.prototype.writeFloatBE, 4, value, offset);
    }
    /**
     * Inserts a FloatBE value at the given offset value.
     *
     * @param value { Number } The value to insert.
     * @param offset { Number } The offset to insert the value at.
     *
     * @return this
     */
    insertFloatBE(value, offset) {
        return this._insertNumberValue(Buffer.prototype.writeFloatBE, 4, value, offset);
    }
    /**
     * Writes a FloatLE value to the current write position (or at optional offset).
     *
     * @param value { Number } The value to write.
     * @param offset { Number } The offset to write the value at.
     *
     * @return this
     */
    writeFloatLE(value, offset) {
        return this._writeNumberValue(Buffer.prototype.writeFloatLE, 4, value, offset);
    }
    /**
     * Inserts a FloatLE value at the given offset value.
     *
     * @param value { Number } The value to insert.
     * @param offset { Number } The offset to insert the value at.
     *
     * @return this
     */
    insertFloatLE(value, offset) {
        return this._insertNumberValue(Buffer.prototype.writeFloatLE, 4, value, offset);
    }
    // Double Floating Point
    /**
     * Reads an DoublEBE value from the current read position or an optionally provided offset.
     *
     * @param offset { Number } The offset to read data from (optional)
     * @return { Number }
     */
    readDoubleBE(offset) {
        return this._readNumberValue(Buffer.prototype.readDoubleBE, 8, offset);
    }
    /**
     * Reads an DoubleLE value from the current read position or an optionally provided offset.
     *
     * @param offset { Number } The offset to read data from (optional)
     * @return { Number }
     */
    readDoubleLE(offset) {
        return this._readNumberValue(Buffer.prototype.readDoubleLE, 8, offset);
    }
    /**
     * Writes a DoubleBE value to the current write position (or at optional offset).
     *
     * @param value { Number } The value to write.
     * @param offset { Number } The offset to write the value at.
     *
     * @return this
     */
    writeDoubleBE(value, offset) {
        return this._writeNumberValue(Buffer.prototype.writeDoubleBE, 8, value, offset);
    }
    /**
     * Inserts a DoubleBE value at the given offset value.
     *
     * @param value { Number } The value to insert.
     * @param offset { Number } The offset to insert the value at.
     *
     * @return this
     */
    insertDoubleBE(value, offset) {
        return this._insertNumberValue(Buffer.prototype.writeDoubleBE, 8, value, offset);
    }
    /**
     * Writes a DoubleLE value to the current write position (or at optional offset).
     *
     * @param value { Number } The value to write.
     * @param offset { Number } The offset to write the value at.
     *
     * @return this
     */
    writeDoubleLE(value, offset) {
        return this._writeNumberValue(Buffer.prototype.writeDoubleLE, 8, value, offset);
    }
    /**
     * Inserts a DoubleLE value at the given offset value.
     *
     * @param value { Number } The value to insert.
     * @param offset { Number } The offset to insert the value at.
     *
     * @return this
     */
    insertDoubleLE(value, offset) {
        return this._insertNumberValue(Buffer.prototype.writeDoubleLE, 8, value, offset);
    }
    // Strings
    /**
     * Reads a String from the current read position.
     *
     * @param arg1 { Number | String } The number of bytes to read as a String, or the BufferEncoding to use for
     *             the string (Defaults to instance level encoding).
     * @param encoding { String } The BufferEncoding to use for the string (Defaults to instance level encoding).
     *
     * @return { String }
     */
    readString(arg1, encoding) {
        let lengthVal;
        // Length provided
        if (typeof arg1 === 'number') {
            utils_1.checkLengthValue(arg1);
            lengthVal = Math.min(arg1, this.length - this._readOffset);
        }
        else {
            encoding = arg1;
            lengthVal = this.length - this._readOffset;
        }
        // Check encoding
        if (typeof encoding !== 'undefined') {
            utils_1.checkEncoding(encoding);
        }
        const value = this._buff.slice(this._readOffset, this._readOffset + lengthVal).toString(encoding || this._encoding);
        this._readOffset += lengthVal;
        return value;
    }
    /**
     * Inserts a String
     *
     * @param value { String } The String value to insert.
     * @param offset { Number } The offset to insert the string at.
     * @param encoding { String } The BufferEncoding to use for writing strings (defaults to instance encoding).
     *
     * @return this
     */
    insertString(value, offset, encoding) {
        utils_1.checkOffsetValue(offset);
        return this._handleString(value, true, offset, encoding);
    }
    /**
     * Writes a String
     *
     * @param value { String } The String value to write.
     * @param arg2 { Number | String } The offset to write the string at, or the BufferEncoding to use.
     * @param encoding { String } The BufferEncoding to use for writing strings (defaults to instance encoding).
     *
     * @return this
     */
    writeString(value, arg2, encoding) {
        return this._handleString(value, false, arg2, encoding);
    }
    /**
     * Reads a null-terminated String from the current read position.
     *
     * @param encoding { String } The BufferEncoding to use for the string (Defaults to instance level encoding).
     *
     * @return { String }
     */
    readStringNT(encoding) {
        if (typeof encoding !== 'undefined') {
            utils_1.checkEncoding(encoding);
        }
        // Set null character position to the end SmartBuffer instance.
        let nullPos = this.length;
        // Find next null character (if one is not found, default from above is used)
        for (let i = this._readOffset; i < this.length; i++) {
            if (this._buff[i] === 0x00) {
                nullPos = i;
                break;
            }
        }
        // Read string value
        const value = this._buff.slice(this._readOffset, nullPos);
        // Increment internal Buffer read offset
        this._readOffset = nullPos + 1;
        return value.toString(encoding || this._encoding);
    }
    /**
     * Inserts a null-terminated String.
     *
     * @param value { String } The String value to write.
     * @param arg2 { Number | String } The offset to write the string to, or the BufferEncoding to use.
     * @param encoding { String } The BufferEncoding to use for writing strings (defaults to instance encoding).
     *
     * @return this
     */
    insertStringNT(value, offset, encoding) {
        utils_1.checkOffsetValue(offset);
        // Write Values
        this.insertString(value, offset, encoding);
        this.insertUInt8(0x00, offset + value.length);
        return this;
    }
    /**
     * Writes a null-terminated String.
     *
     * @param value { String } The String value to write.
     * @param arg2 { Number | String } The offset to write the string to, or the BufferEncoding to use.
     * @param encoding { String } The BufferEncoding to use for writing strings (defaults to instance encoding).
     *
     * @return this
     */
    writeStringNT(value, arg2, encoding) {
        // Write Values
        this.writeString(value, arg2, encoding);
        this.writeUInt8(0x00, typeof arg2 === 'number' ? arg2 + value.length : this.writeOffset);
        return this;
    }
    // Buffers
    /**
     * Reads a Buffer from the internal read position.
     *
     * @param length { Number } The length of data to read as a Buffer.
     *
     * @return { Buffer }
     */
    readBuffer(length) {
        if (typeof length !== 'undefined') {
            utils_1.checkLengthValue(length);
        }
        const lengthVal = typeof length === 'number' ? length : this.length;
        const endPoint = Math.min(this.length, this._readOffset + lengthVal);
        // Read buffer value
        const value = this._buff.slice(this._readOffset, endPoint);
        // Increment internal Buffer read offset
        this._readOffset = endPoint;
        return value;
    }
    /**
     * Writes a Buffer to the current write position.
     *
     * @param value { Buffer } The Buffer to write.
     * @param offset { Number } The offset to write the Buffer to.
     *
     * @return this
     */
    insertBuffer(value, offset) {
        utils_1.checkOffsetValue(offset);
        return this._handleBuffer(value, true, offset);
    }
    /**
     * Writes a Buffer to the current write position.
     *
     * @param value { Buffer } The Buffer to write.
     * @param offset { Number } The offset to write the Buffer to.
     *
     * @return this
     */
    writeBuffer(value, offset) {
        return this._handleBuffer(value, false, offset);
    }
    /**
     * Reads a null-terminated Buffer from the current read poisiton.
     *
     * @return { Buffer }
     */
    readBufferNT() {
        // Set null character position to the end SmartBuffer instance.
        let nullPos = this.length;
        // Find next null character (if one is not found, default from above is used)
        for (let i = this._readOffset; i < this.length; i++) {
            if (this._buff[i] === 0x00) {
                nullPos = i;
                break;
            }
        }
        // Read value
        const value = this._buff.slice(this._readOffset, nullPos);
        // Increment internal Buffer read offset
        this._readOffset = nullPos + 1;
        return value;
    }
    /**
     * Inserts a null-terminated Buffer.
     *
     * @param value { Buffer } The Buffer to write.
     * @param offset { Number } The offset to write the Buffer to.
     *
     * @return this
     */
    insertBufferNT(value, offset) {
        utils_1.checkOffsetValue(offset);
        // Write Values
        this.insertBuffer(value, offset);
        this.insertUInt8(0x00, offset + value.length);
        return this;
    }
    /**
     * Writes a null-terminated Buffer.
     *
     * @param value { Buffer } The Buffer to write.
     * @param offset { Number } The offset to write the Buffer to.
     *
     * @return this
     */
    writeBufferNT(value, offset) {
        // Checks for valid numberic value;
        if (typeof offset !== 'undefined') {
            utils_1.checkOffsetValue(offset);
        }
        // Write Values
        this.writeBuffer(value, offset);
        this.writeUInt8(0x00, typeof offset === 'number' ? offset + value.length : this._writeOffset);
        return this;
    }
    /**
     * Clears the SmartBuffer instance to its original empty state.
     */
    clear() {
        this._writeOffset = 0;
        this._readOffset = 0;
        this.length = 0;
        return this;
    }
    /**
     * Gets the remaining data left to be read from the SmartBuffer instance.
     *
     * @return { Number }
     */
    remaining() {
        return this.length - this._readOffset;
    }
    /**
     * Gets the current read offset value of the SmartBuffer instance.
     *
     * @return { Number }
     */
    get readOffset() {
        return this._readOffset;
    }
    /**
     * Sets the read offset value of the SmartBuffer instance.
     *
     * @param offset { Number } - The offset value to set.
     */
    set readOffset(offset) {
        utils_1.checkOffsetValue(offset);
        // Check for bounds.
        utils_1.checkTargetOffset(offset, this);
        this._readOffset = offset;
    }
    /**
     * Gets the current write offset value of the SmartBuffer instance.
     *
     * @return { Number }
     */
    get writeOffset() {
        return this._writeOffset;
    }
    /**
     * Sets the write offset value of the SmartBuffer instance.
     *
     * @param offset { Number } - The offset value to set.
     */
    set writeOffset(offset) {
        utils_1.checkOffsetValue(offset);
        // Check for bounds.
        utils_1.checkTargetOffset(offset, this);
        this._writeOffset = offset;
    }
    /**
     * Gets the currently set string encoding of the SmartBuffer instance.
     *
     * @return { BufferEncoding } The string Buffer encoding currently set.
     */
    get encoding() {
        return this._encoding;
    }
    /**
     * Sets the string encoding of the SmartBuffer instance.
     *
     * @param encoding { BufferEncoding } The string Buffer encoding to set.
     */
    set encoding(encoding) {
        utils_1.checkEncoding(encoding);
        this._encoding = encoding;
    }
    /**
     * Gets the underlying internal Buffer. (This includes unmanaged data in the Buffer)
     *
     * @return { Buffer } The Buffer value.
     */
    get internalBuffer() {
        return this._buff;
    }
    /**
     * Gets the value of the internal managed Buffer (Includes managed data only)
     *
     * @param { Buffer }
     */
    toBuffer() {
        return this._buff.slice(0, this.length);
    }
    /**
     * Gets the String value of the internal managed Buffer
     *
     * @param encoding { String } The BufferEncoding to display the Buffer as (defaults to instance level encoding).
     */
    toString(encoding) {
        const encodingVal = typeof encoding === 'string' ? encoding : this._encoding;
        // Check for invalid encoding.
        utils_1.checkEncoding(encodingVal);
        return this._buff.toString(encodingVal, 0, this.length);
    }
    /**
     * Destroys the SmartBuffer instance.
     */
    destroy() {
        this.clear();
        return this;
    }
    /**
     * Handles inserting and writing strings.
     *
     * @param value { String } The String value to insert.
     * @param isInsert { Boolean } True if inserting a string, false if writing.
     * @param arg2 { Number | String } The offset to insert the string at, or the BufferEncoding to use.
     * @param encoding { String } The BufferEncoding to use for writing strings (defaults to instance encoding).
     */
    _handleString(value, isInsert, arg3, encoding) {
        let offsetVal = this._writeOffset;
        let encodingVal = this._encoding;
        // Check for offset
        if (typeof arg3 === 'number') {
            offsetVal = arg3;
            // Check for encoding
        }
        else if (typeof arg3 === 'string') {
            utils_1.checkEncoding(arg3);
            encodingVal = arg3;
        }
        // Check for encoding (third param)
        if (typeof encoding === 'string') {
            utils_1.checkEncoding(encoding);
            encodingVal = encoding;
        }
        // Calculate bytelength of string.
        const byteLength = Buffer.byteLength(value, encodingVal);
        // Ensure there is enough internal Buffer capacity.
        if (isInsert) {
            this.ensureInsertable(byteLength, offsetVal);
        }
        else {
            this._ensureWriteable(byteLength, offsetVal);
        }
        // Write value
        this._buff.write(value, offsetVal, byteLength, encodingVal);
        // Increment internal Buffer write offset;
        if (isInsert) {
            this._writeOffset += byteLength;
        }
        else {
            // If an offset was given, check to see if we wrote beyond the current writeOffset.
            if (typeof arg3 === 'number') {
                this._writeOffset = Math.max(this._writeOffset, offsetVal + byteLength);
            }
            else {
                // If no offset was given, we wrote to the end of the SmartBuffer so increment writeOffset.
                this._writeOffset += byteLength;
            }
        }
        return this;
    }
    /**
     * Handles writing or insert of a Buffer.
     *
     * @param value { Buffer } The Buffer to write.
     * @param offset { Number } The offset to write the Buffer to.
     */
    _handleBuffer(value, isInsert, offset) {
        const offsetVal = typeof offset === 'number' ? offset : this._writeOffset;
        // Ensure there is enough internal Buffer capacity.
        if (isInsert) {
            this.ensureInsertable(value.length, offsetVal);
        }
        else {
            this._ensureWriteable(value.length, offsetVal);
        }
        // Write buffer value
        value.copy(this._buff, offsetVal);
        // Increment internal Buffer write offset;
        if (isInsert) {
            this._writeOffset += value.length;
        }
        else {
            // If an offset was given, check to see if we wrote beyond the current writeOffset.
            if (typeof offset === 'number') {
                this._writeOffset = Math.max(this._writeOffset, offsetVal + value.length);
            }
            else {
                // If no offset was given, we wrote to the end of the SmartBuffer so increment writeOffset.
                this._writeOffset += value.length;
            }
        }
        return this;
    }
    /**
     * Ensures that the internal Buffer is large enough to read data.
     *
     * @param length { Number } The length of the data that needs to be read.
     * @param offset { Number } The offset of the data that needs to be read.
     */
    ensureReadable(length, offset) {
        // Offset value defaults to managed read offset.
        let offsetVal = this._readOffset;
        // If an offset was provided, use it.
        if (typeof offset !== 'undefined') {
            // Checks for valid numberic value;
            utils_1.checkOffsetValue(offset);
            // Overide with custom offset.
            offsetVal = offset;
        }
        // Checks if offset is below zero, or the offset+length offset is beyond the total length of the managed data.
        if (offsetVal < 0 || offsetVal + length > this.length) {
            throw new Error(utils_1.ERRORS.INVALID_READ_BEYOND_BOUNDS);
        }
    }
    /**
     * Ensures that the internal Buffer is large enough to insert data.
     *
     * @param dataLength { Number } The length of the data that needs to be written.
     * @param offset { Number } The offset of the data to be written.
     */
    ensureInsertable(dataLength, offset) {
        // Checks for valid numberic value;
        utils_1.checkOffsetValue(offset);
        // Ensure there is enough internal Buffer capacity.
        this._ensureCapacity(this.length + dataLength);
        // If an offset was provided and its not the very end of the buffer, copy data into appropriate location in regards to the offset.
        if (offset < this.length) {
            this._buff.copy(this._buff, offset + dataLength, offset, this._buff.length);
        }
        // Adjust tracked smart buffer length
        if (offset + dataLength > this.length) {
            this.length = offset + dataLength;
        }
        else {
            this.length += dataLength;
        }
    }
    /**
     * Ensures that the internal Buffer is large enough to write data.
     *
     * @param dataLength { Number } The length of the data that needs to be written.
     * @param offset { Number } The offset of the data to be written (defaults to writeOffset).
     */
    _ensureWriteable(dataLength, offset) {
        const offsetVal = typeof offset === 'number' ? offset : this._writeOffset;
        // Ensure enough capacity to write data.
        this._ensureCapacity(offsetVal + dataLength);
        // Adjust SmartBuffer length (if offset + length is larger than managed length, adjust length)
        if (offsetVal + dataLength > this.length) {
            this.length = offsetVal + dataLength;
        }
    }
    /**
     * Ensures that the internal Buffer is large enough to write at least the given amount of data.
     *
     * @param minLength { Number } The minimum length of the data needs to be written.
     */
    _ensureCapacity(minLength) {
        const oldLength = this._buff.length;
        if (minLength > oldLength) {
            let data = this._buff;
            let newLength = (oldLength * 3) / 2 + 1;
            if (newLength < minLength) {
                newLength = minLength;
            }
            this._buff = Buffer.allocUnsafe(newLength);
            data.copy(this._buff, 0, 0, oldLength);
        }
    }
    /**
     * Reads a numeric number value using the provided function.
     *
     * @typeparam T { number | bigint } The type of the value to be read
     *
     * @param func { Function(offset: number) => number } The function to read data on the internal Buffer with.
     * @param byteSize { Number } The number of bytes read.
     * @param offset { Number } The offset to read from (optional). When this is not provided, the managed readOffset is used instead.
     *
     * @returns { T } the number value
     */
    _readNumberValue(func, byteSize, offset) {
        this.ensureReadable(byteSize, offset);
        // Call Buffer.readXXXX();
        const value = func.call(this._buff, typeof offset === 'number' ? offset : this._readOffset);
        // Adjust internal read offset if an optional read offset was not provided.
        if (typeof offset === 'undefined') {
            this._readOffset += byteSize;
        }
        return value;
    }
    /**
     * Inserts a numeric number value based on the given offset and value.
     *
     * @typeparam T { number | bigint } The type of the value to be written
     *
     * @param func { Function(offset: T, offset?) => number} The function to write data on the internal Buffer with.
     * @param byteSize { Number } The number of bytes written.
     * @param value { T } The number value to write.
     * @param offset { Number } the offset to write the number at (REQUIRED).
     *
     * @returns SmartBuffer this buffer
     */
    _insertNumberValue(func, byteSize, value, offset) {
        // Check for invalid offset values.
        utils_1.checkOffsetValue(offset);
        // Ensure there is enough internal Buffer capacity. (raw offset is passed)
        this.ensureInsertable(byteSize, offset);
        // Call buffer.writeXXXX();
        func.call(this._buff, value, offset);
        // Adjusts internally managed write offset.
        this._writeOffset += byteSize;
        return this;
    }
    /**
     * Writes a numeric number value based on the given offset and value.
     *
     * @typeparam T { number | bigint } The type of the value to be written
     *
     * @param func { Function(offset: T, offset?) => number} The function to write data on the internal Buffer with.
     * @param byteSize { Number } The number of bytes written.
     * @param value { T } The number value to write.
     * @param offset { Number } the offset to write the number at (REQUIRED).
     *
     * @returns SmartBuffer this buffer
     */
    _writeNumberValue(func, byteSize, value, offset) {
        // If an offset was provided, validate it.
        if (typeof offset === 'number') {
            // Check if we're writing beyond the bounds of the managed data.
            if (offset < 0) {
                throw new Error(utils_1.ERRORS.INVALID_WRITE_BEYOND_BOUNDS);
            }
            utils_1.checkOffsetValue(offset);
        }
        // Default to writeOffset if no offset value was given.
        const offsetVal = typeof offset === 'number' ? offset : this._writeOffset;
        // Ensure there is enough internal Buffer capacity. (raw offset is passed)
        this._ensureWriteable(byteSize, offsetVal);
        func.call(this._buff, value, offsetVal);
        // If an offset was given, check to see if we wrote beyond the current writeOffset.
        if (typeof offset === 'number') {
            this._writeOffset = Math.max(this._writeOffset, offsetVal + byteSize);
        }
        else {
            // If no numeric offset was given, we wrote to the end of the SmartBuffer so increment writeOffset.
            this._writeOffset += byteSize;
        }
        return this;
    }
}
exports.SmartBuffer = SmartBuffer;
//# sourceMappingURL=smartbuffer.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const buffer_1 = require("buffer");
/**
 * Error strings
 */
const ERRORS = {
    INVALID_ENCODING: 'Invalid encoding provided. Please specify a valid encoding the internal Node.js Buffer supports.',
    INVALID_SMARTBUFFER_SIZE: 'Invalid size provided. Size must be a valid integer greater than zero.',
    INVALID_SMARTBUFFER_BUFFER: 'Invalid Buffer provided in SmartBufferOptions.',
    INVALID_SMARTBUFFER_OBJECT: 'Invalid SmartBufferOptions object supplied to SmartBuffer constructor or factory methods.',
    INVALID_OFFSET: 'An invalid offset value was provided.',
    INVALID_OFFSET_NON_NUMBER: 'An invalid offset value was provided. A numeric value is required.',
    INVALID_LENGTH: 'An invalid length value was provided.',
    INVALID_LENGTH_NON_NUMBER: 'An invalid length value was provived. A numeric value is required.',
    INVALID_TARGET_OFFSET: 'Target offset is beyond the bounds of the internal SmartBuffer data.',
    INVALID_TARGET_LENGTH: 'Specified length value moves cursor beyong the bounds of the internal SmartBuffer data.',
    INVALID_READ_BEYOND_BOUNDS: 'Attempted to read beyond the bounds of the managed data.',
    INVALID_WRITE_BEYOND_BOUNDS: 'Attempted to write beyond the bounds of the managed data.'
};
exports.ERRORS = ERRORS;
/**
 * Checks if a given encoding is a valid Buffer encoding. (Throws an exception if check fails)
 *
 * @param { String } encoding The encoding string to check.
 */
function checkEncoding(encoding) {
    if (!buffer_1.Buffer.isEncoding(encoding)) {
        throw new Error(ERRORS.INVALID_ENCODING);
    }
}
exports.checkEncoding = checkEncoding;
/**
 * Checks if a given number is a finite integer. (Throws an exception if check fails)
 *
 * @param { Number } value The number value to check.
 */
function isFiniteInteger(value) {
    return typeof value === 'number' && isFinite(value) && isInteger(value);
}
exports.isFiniteInteger = isFiniteInteger;
/**
 * Checks if an offset/length value is valid. (Throws an exception if check fails)
 *
 * @param value The value to check.
 * @param offset True if checking an offset, false if checking a length.
 */
function checkOffsetOrLengthValue(value, offset) {
    if (typeof value === 'number') {
        // Check for non finite/non integers
        if (!isFiniteInteger(value) || value < 0) {
            throw new Error(offset ? ERRORS.INVALID_OFFSET : ERRORS.INVALID_LENGTH);
        }
    }
    else {
        throw new Error(offset ? ERRORS.INVALID_OFFSET_NON_NUMBER : ERRORS.INVALID_LENGTH_NON_NUMBER);
    }
}
/**
 * Checks if a length value is valid. (Throws an exception if check fails)
 *
 * @param { Number } length The value to check.
 */
function checkLengthValue(length) {
    checkOffsetOrLengthValue(length, false);
}
exports.checkLengthValue = checkLengthValue;
/**
 * Checks if a offset value is valid. (Throws an exception if check fails)
 *
 * @param { Number } offset The value to check.
 */
function checkOffsetValue(offset) {
    checkOffsetOrLengthValue(offset, true);
}
exports.checkOffsetValue = checkOffsetValue;
/**
 * Checks if a target offset value is out of bounds. (Throws an exception if check fails)
 *
 * @param { Number } offset The offset value to check.
 * @param { SmartBuffer } buff The SmartBuffer instance to check against.
 */
function checkTargetOffset(offset, buff) {
    if (offset < 0 || offset > buff.length) {
        throw new Error(ERRORS.INVALID_TARGET_OFFSET);
    }
}
exports.checkTargetOffset = checkTargetOffset;
/**
 * Determines whether a given number is a integer.
 * @param value The number to check.
 */
function isInteger(value) {
    return typeof value === 'number' && isFinite(value) && Math.floor(value) === value;
}
/**
 * Throws if Node.js version is too low to support bigint
 */
function bigIntAndBufferInt64Check(bufferMethod) {
    if (typeof BigInt === 'undefined') {
        throw new Error('Platform does not support JS BigInt type.');
    }
    if (typeof buffer_1.Buffer.prototype[bufferMethod] === 'undefined') {
        throw new Error(`Platform does not support Buffer.prototype.${bufferMethod}.`);
    }
}
exports.bigIntAndBufferInt64Check = bigIntAndBufferInt64Check;
//# sourceMappingURL=utils.js.mapmodule.exports = {
  root: true,
  parser: '@typescript-eslint/parser',
  plugins: [
    '@typescript-eslint',
  ],
  extends: [
    'eslint:recommended',
    'plugin:@typescript-eslint/recommended',
  ],
};parser: typescript
printWidth: 80
tabWidth: 2
singleQuote: true
trailingComma: all
arrowParens: always
bracketSpacing: falseThe MIT License (MIT)

Copyright (c) 2013 Josh Glazebrook

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": "socks",
  "private": false,
  "version": "2.7.0",
  "description": "Fully featured SOCKS proxy client supporting SOCKSv4, SOCKSv4a, and SOCKSv5. Includes Bind and Associate functionality.",
  "main": "build/index.js",
  "typings": "typings/index.d.ts",
  "homepage": "https://github.com/JoshGlazebrook/socks/",
  "repository": {
    "type": "git",
    "url": "https://github.com/JoshGlazebrook/socks.git"
  },
  "engines": {
    "node": ">= 10.13.0",
    "npm": ">= 3.0.0"
  },
  "author": "Josh Glazebrook",
  "license": "MIT",
  "readmeFilename": "README.md",
  "devDependencies": {
    "@types/ip": "1.1.0",
    "@types/mocha": "^9.1.1",
    "@types/node": "^18.0.6",
    "@typescript-eslint/eslint-plugin": "^5.30.6",
    "@typescript-eslint/parser": "^5.30.6",
    "eslint": "^8.20.0",
    "mocha": "^10.0.0",
    "prettier": "^2.7.1",
    "ts-node": "^10.9.1",
    "typescript": "^4.7.4"
  },
  "dependencies": {
    "ip": "^2.0.0",
    "smart-buffer": "^4.2.0"
  }
}# Documentation

- [API Reference](https://github.com/JoshGlazebrook/socks#api-reference)

- [Code Examples](./examples/index.md)# socks

## Migrating from v1

For the most part, migrating from v1 takes minimal effort as v2 still supports factory creation of proxy connections with callback support.

### Notable breaking changes

- In an options object, the proxy 'command' is now required and does not default to 'connect'.
- **In an options object, 'target' is now known as 'destination'.**
- Sockets are no longer paused after a SOCKS connection is made, so socket.resume() is no longer required. (Please be sure to attach data handlers immediately to the Socket to avoid losing data).
- In v2, only the 'connect' command is supported via the factory SocksClient.createConnection function. (BIND and ASSOCIATE must be used with a SocksClient instance via event handlers).
- In v2, the factory SocksClient.createConnection function callback is called with a single object rather than separate socket and info object.
- A SOCKS http/https agent is no longer bundled into the library.

For informational purposes, here is the original getting started example from v1 converted to work with v2.

### Before (v1)

```javascript
var Socks = require('socks');

var options = {
    proxy: {
        ipaddress: "202.101.228.108",
        port: 1080,
        type: 5
    },
    target: {
        host: "google.com",
        port: 80
    },
    command: 'connect'
};

Socks.createConnection(options, function(err, socket, info) {
    if (err)
        console.log(err);
    else {
        socket.write("GET / HTTP/1.1\nHost: google.com\n\n");
        socket.on('data', function(data) {
            console.log(data.length);
            console.log(data);
        });

        // PLEASE NOTE: sockets need to be resumed before any data will come in or out as they are paused right before this callback is fired.
        socket.resume();

        // 569
        // <Buffer 48 54 54 50 2f 31 2e 31 20 33 30 31 20 4d 6f 76 65 64 20 50 65...
    }
});
```

### After (v2)
```javascript
const SocksClient = require('socks').SocksClient;

let options = {
    proxy: {
        ipaddress: "202.101.228.108",
        port: 1080,
        type: 5
    },
    destination: {
        host: "google.com",
        port: 80
    },
    command: 'connect'
};

SocksClient.createConnection(options, function(err, result) {
    if (err)
        console.log(err);
    else {
        result.socket.write("GET / HTTP/1.1\nHost: google.com\n\n");
        result.socket.on('data', function(data) {
            console.log(data.length);
            console.log(data);
        });

        // 569
        // <Buffer 48 54 54 50 2f 31 2e 31 20 33 30 31 20 4d 6f 76 65 64 20 50 65...
    }
});
```# socks examples

## TypeScript Examples

[Connect command](typescript/connectExample.md)

[Bind command](typescript/bindExample.md)

[Associate command](typescript/associateExample.md)

## JavaScript Examples

[Connect command](javascript/connectExample.md)

[Bind command](javascript/bindExample.md)

[Associate command](javascript/associateExample.md)# socks examples

## Example for SOCKS 'associate' command

The associate command tells the SOCKS proxy server to establish a UDP relay. The server binds to a new UDP port and communicates the newly opened port back to the origin client. From here, any SOCKS UDP frame packets sent to this special UDP port on the Proxy server will be forwarded to the desired destination, and any responses will be forwarded back to the origin client (you).

This can be used for things such as DNS queries, and other UDP communicates.

**Connection Steps**

1. Client -(associate)-> Proxy (Tells the proxy to create a UDP relay and bind on a new port)
2. Client <-(port)- Proxy (Tells the origin client which port it opened and is accepting UDP frame packets on)

At this point the proxy is accepting UDP frames on the specified port.

3. Client --(udp frame) -> Proxy -> Destination (The origin client sends a UDP frame to the proxy on the UDP port, and the proxy then forwards it to the destination specified in the UDP frame.)
4. Client <--(udp frame) <-- Proxy <-- Destination (The destination client responds to the udp packet sent in #3)

## Usage

The 'associate' command can only be used by creating a new SocksClient instance and listening for the 'established' event.

**Note:** UDP packets relayed through the proxy servers are packaged in a special Socks UDP frame format. SocksClient.createUDPFrame() and SocksClient.parseUDPFrame() create and parse these special UDP packets.

```typescript
import * as dgram from 'dgram';
import { SocksClient, SocksClientOptions } from 'socks';

// Create a local UDP socket for sending/receiving packets to/from the proxy.
const udpSocket = dgram.createSocket('udp4');
udpSocket.bind();

// Listen for incoming UDP packets from the proxy server.
udpSocket.on('message', (message, rinfo) => {
  console.log(SocksClient.parseUDPFrame(message));
  /*
  { frameNumber: 0,
    remoteHost: { host: '8.8.8.8', port: 53 }, // The remote host that replied with a UDP packet
    data: <Buffer 74 65 73 74 0a> // The data
  }
  */
});

const options: SocksClientOptions = {
  proxy: {
    host: '104.131.124.203',
    port: 1081,
    type: 5
  },

  // This should be the ip and port of the expected client that will be sending UDP frames to the newly opened UDP port on the server.
  // Most SOCKS servers accept 0.0.0.0 as a wildcard address to accept UDP frames from any source.
  destination: {
    host: '0.0.0.0',
    port: 0
  },

  command: 'associate'
};

const client = new SocksClient(options);

// This event is fired when the SOCKS server has started listening on a new UDP port for UDP relaying.
client.on('established', info => {
  console.log(info);
  /*
  {
    socket: <Socket ...>,
    remoteHost: { // This is the remote port on the SOCKS proxy server to send UDP frame packets to.
      host: '104.131.124.203',
      port: 58232
    }
  }
  */

  // Send a udp frame to 8.8.8.8 on port 53 through the proxy.
  const packet = SocksClient.createUDPFrame({
    remoteHost: { host: '8.8.8.8', port: 53 },
    data: Buffer.from('hello') // A DNS lookup in the real world.
  });

  // Send packet.
  udpSocket.send(packet, info.remoteHost.port, info.remoteHost.host);
});

// SOCKS proxy failed to bind.
client.on('error', () => {
  // Handle errors
});

// Start connection
client.connect();
```
# socks examples

## Example for SOCKS 'bind' command

The bind command tells the SOCKS proxy server to bind and listen on a new TCP port for an incoming connection. It communicates the newly opened port back to the origin client. Once a incoming connection is accepted by the SOCKS proxy server it then communicates the remote host that connected to the SOCKS proxy back through the same initial connection via the origin client.

This can be used for things such as FTP clients which require incoming TCP connections, etc.

**Connection Steps**

1. Client -(bind)-> Proxy    (Tells the proxy to bind to a new port)
2. Client <-(port)- Proxy    (Tells the origin client which port it opened)
3. Client2 --> Proxy    (Other client connects to the proxy on this port)
4. Client <--(client2's host info)  (Proxy tells the origin client who connected to it)
5. Original connection to the proxy is now a full TCP stream between client (you) and client2.
6. Client <--> Proxy <--> Client2


## Usage

The 'bind' command can only be used by creating a new SocksClient instance and listening for 'bound' and 'established' events.


```typescript
import { SocksClient, SocksClientOptions } from 'socks';

const options: SocksClientOptions = {
  proxy: {
    host: '104.131.124.203',
    port: 1081,
    type: 5
  },

  // This should be the ip and port of the expected client that will connect to the SOCKS proxy server on the newly bound port.
  // Most SOCKS servers accept 0.0.0.0 as a wildcard address to accept any client.
  destination: {
    host: '0.0.0.0',
    port: 0
  },

  command: 'bind'
};

const client = new SocksClient(options);

// This event is fired when the SOCKS server has started listening on a new port for incoming connections.
client.on('bound', (info) => {
  console.log(info);
  /*
  {
    socket: <Socket ...>,
    remoteHost: { // This is the remote ip and port of the SOCKS proxy that is now accepting incoming connections.
      host: '104.131.124.203',
      port: 49928
    }
  }
  */
});

// This event is fired when the SOCKS server has accepted an incoming connection on the newly bound port.
client.on('established', (info) => {
  console.log(info);
  /*
  {
    socket: <Socket ...>,
    remoteHost: { // This is the remote ip and port that connected to the SOCKS proxy on the newly bound port.
      host: '1.2.3.4',
      port: 58232
    }
  }
  */

  // At this point info.socket is a regular net.Socket TCP connection between client and client2 (1.2.3.4) (the client which connected to the proxy on the newly bound port.)

  console.log(info.socket);
  // <Socket ...>  (this is a raw net.Socket that is established to the destination host through the given proxy servers)
});

// SOCKS proxy failed to bind.
client.on('error', () => {
  // Handle errors
});

// Start connection
client.connect();
```# socks examples

## Example for SOCKS 'connect' command

The connect command is the most common use-case for a SOCKS proxy. This establishes a direct connection to a destination host through a proxy server. The destination host only has knowledge of the proxy server connecting to it and does not know about the origin client (you).

**Origin Client (you) <-> Proxy Server <-> Destination Server**

In this example, we are connecting to a web server on port 80, and sending a very basic HTTP request to receive a response. It's worth noting that there are many socks-http-agents that can be used with the node http module (and libraries such as request.js) to make this easier. This HTTP request is used as a simple example.

The 'connect' command can be used via the SocksClient.createConnection() factory function as well as by creating a SocksClient instance and using event handlers.

### Using createConnection with async/await

Since SocksClient.createConnection returns a Promise, we can easily use async/await for flow control.

```typescript
import { SocksClient, SocksClientOptions } from 'socks';

const options: SocksClientOptions = {
  proxy: {
    host: '104.131.124.203',
    port: 1081,
    type: 5
  },

  destination: {
    host: 'ip-api.com', // host names are supported with SOCKS v4a and SOCKS v5.
    port: 80
  },

  command: 'connect'
};

async function start() {
  try {
    const info = await SocksClient.createConnection(options);

    console.log(info.socket);
    // <Socket ...>  (this is a raw net.Socket that is established to the destination host through the given proxy servers)

    info.socket.write('GET /json HTTP/1.1\nHost: ip-api.com\n\n');
    info.socket.on('data', (data) => {
      console.log(data.toString()); // ip-api.com sees that the last proxy (104.131.124.203) is connected to it and not the origin client (you).
      /*
        HTTP/1.1 200 OK
        Access-Control-Allow-Origin: *
        Content-Type: application/json; charset=utf-8
        Date: Sun, 24 Dec 2017 03:47:51 GMT
        Content-Length: 300

        {
          "as":"AS14061 Digital Ocean, Inc.",
          "city":"Clifton",
          "country":"United States",
          "countryCode":"US",
          "isp":"Digital Ocean",
          "lat":40.8326,
          "lon":-74.1307,
          "org":"Digital Ocean",
          "query":"104.131.124.203",
          "region":"NJ",
          "regionName":"New Jersey",
          "status":"success",
          "timezone":"America/New_York",
          "zip":"07014"
        }
      */
    });
  } catch (err) {
    // Handle errors
  }
}

start();
```

### Using createConnection with Promises

```typescript
import { SocksClient, SocksClientOptions } from 'socks';

const options: SocksClientOptions = {
  proxy: {
    ipaddress: '104.131.124.203',
    port: 1081,
    type: 5
  },

  destination: {
    host: 'ip-api.com', // host names are supported with SOCKS v4a and SOCKS v5.
    port: 80
  },

  command: 'connect'
};

SocksClient.createConnection(options)
.then(info => {
  console.log(info.socket);
  // <Socket ...>  (this is a raw net.Socket that is established to the destination host through the given proxy servers)

  info.socket.write('GET /json HTTP/1.1\nHost: ip-api.com\n\n');
  info.socket.on('data', (data) => {
    console.log(data.toString()); // ip-api.com sees that the last proxy (104.131.124.203) is connected to it and not the origin client (you).
    /*
      HTTP/1.1 200 OK
      Access-Control-Allow-Origin: *
      Content-Type: application/json; charset=utf-8
      Date: Sun, 24 Dec 2017 03:47:51 GMT
      Content-Length: 300

      {
        "as":"AS14061 Digital Ocean, Inc.",
        "city":"Clifton",
        "country":"United States",
        "countryCode":"US",
        "isp":"Digital Ocean",
        "lat":40.8326,
        "lon":-74.1307,
        "org":"Digital Ocean",
        "query":"104.131.124.203",
        "region":"NJ",
        "regionName":"New Jersey",
        "status":"success",
        "timezone":"America/New_York",
        "zip":"07014"
      }
    */
  });
})
.catch(err => {
  // handle errors
});
```

### Using createConnection with callbacks

SocksClient.createConnection() optionally accepts a callback function as a second parameter.

**Note:** If a callback function is provided, a Promise is still returned from the function, but the promise will always resolve regardless of if there was en error. (tldr: Do not mix callbacks and Promises).

```typescript
import { SocksClient, SocksClientOptions } from 'socks';

const options: SocksClientOptions = {
  proxy: {
    ipaddress: '104.131.124.203',
    port: 1081,
    type: 5
  },

  destination: {
    host: 'ip-api.com', // host names are supported with SOCKS v4a and SOCKS v5.
    port: 80
  },

  command: 'connect'
};

SocksClient.createConnection(options, (err, info) => {
  if (err) {
    // handle errors
  } else {
    console.log(info.socket);
    // <Socket ...>  (this is a raw net.Socket that is established to the destination host through the given proxy servers)

    info.socket.write('GET /json HTTP/1.1\nHost: ip-api.com\n\n');
    info.socket.on('data', (data) => {
      console.log(data.toString()); // ip-api.com sees that the last proxy (104.131.124.203) is connected to it and not the origin client (you).
      /*
        HTTP/1.1 200 OK
        Access-Control-Allow-Origin: *
        Content-Type: application/json; charset=utf-8
        Date: Sun, 24 Dec 2017 03:47:51 GMT
        Content-Length: 300

        {
          "as":"AS14061 Digital Ocean, Inc.",
          "city":"Clifton",
          "country":"United States",
          "countryCode":"US",
          "isp":"Digital Ocean",
          "lat":40.8326,
          "lon":-74.1307,
          "org":"Digital Ocean",
          "query":"104.131.124.203",
          "region":"NJ",
          "regionName":"New Jersey",
          "status":"success",
          "timezone":"America/New_York",
          "zip":"07014"
        }
      */
    });
  }
})
```

### Using event handlers

SocksClient also supports instance creation of a SocksClient. This allows for event based flow control.

```typescript
import { SocksClient, SocksClientOptions } from 'socks';

const options: SocksClientOptions = {
  proxy: {
    ipaddress: '104.131.124.203',
    port: 1081,
    type: 5
  },

  destination: {
    host: 'ip-api.com', // host names are supported with SOCKS v4a and SOCKS v5.
    port: 80
  },

  command: 'connect'
};

const client = new SocksClient(options);

client.on('established', (info) => {
  console.log(info.socket);
  // <Socket ...>  (this is a raw net.Socket that is established to the destination host through the given proxy servers)

  info.socket.write('GET /json HTTP/1.1\nHost: ip-api.com\n\n');
  info.socket.on('data', (data) => {
    console.log(data.toString()); // ip-api.com sees that the last proxy (104.131.124.203) is connected to it and not the origin client (you).
    /*
      HTTP/1.1 200 OK
      Access-Control-Allow-Origin: *
      Content-Type: application/json; charset=utf-8
      Date: Sun, 24 Dec 2017 03:47:51 GMT
      Content-Length: 300

      {
        "as":"AS14061 Digital Ocean, Inc.",
        "city":"Clifton",
        "country":"United States",
        "countryCode":"US",
        "isp":"Digital Ocean",
        "lat":40.8326,
        "lon":-74.1307,
        "org":"Digital Ocean",
        "query":"104.131.124.203",
        "region":"NJ",
        "regionName":"New Jersey",
        "status":"success",
        "timezone":"America/New_York",
        "zip":"07014"
      }
    */
  });
});

// Failed to establish proxy connection to destination.
client.on('error', () => {
  // Handle errors
});

// Start connection
client.connect();
```# socks examples

## Example for SOCKS 'associate' command

The associate command tells the SOCKS proxy server to establish a UDP relay. The server binds to a new UDP port and communicates the newly opened port back to the origin client. From here, any SOCKS UDP frame packets sent to this special UDP port on the Proxy server will be forwarded to the desired destination, and any responses will be forwarded back to the origin client (you).

This can be used for things such as DNS queries, and other UDP communicates.

**Connection Steps**

1. Client -(associate)-> Proxy (Tells the proxy to create a UDP relay and bind on a new port)
2. Client <-(port)- Proxy (Tells the origin client which port it opened and is accepting UDP frame packets on)

At this point the proxy is accepting UDP frames on the specified port.

3. Client --(udp frame) -> Proxy -> Destination (The origin client sends a UDP frame to the proxy on the UDP port, and the proxy then forwards it to the destination specified in the UDP frame.)
4. Client <--(udp frame) <-- Proxy <-- Destination (The destination client responds to the udp packet sent in #3)

## Usage

The 'associate' command can only be used by creating a new SocksClient instance and listening for the 'established' event.

**Note:** UDP packets relayed through the proxy servers are encompassed in a special Socks UDP frame format. SocksClient.createUDPFrame() and SocksClient.parseUDPFrame() create and parse these special UDP packets.

```typescript
const dgram = require('dgram');
const SocksClient = require('socks').SocksClient;

// Create a local UDP socket for sending/receiving packets to/from the proxy.
const udpSocket = dgram.createSocket('udp4');
udpSocket.bind();

// Listen for incoming UDP packets from the proxy server.
udpSocket.on('message', (message, rinfo) => {
  console.log(SocksClient.parseUDPFrame(message));
  /*
  { frameNumber: 0,
    remoteHost: { host: '8.8.8.8', port: 53 }, // The remote host that replied with a UDP packet
    data: <Buffer 74 65 73 74 0a> // The data
  }
  */
});

const options = {
  proxy: {
    host: '104.131.124.203',
    port: 1081,
    type: 5
  },

  // This should be the ip and port of the expected client that will be sending UDP frames to the newly opened UDP port on the server.
  // Most SOCKS servers accept 0.0.0.0 as a wildcard address to accept UDP frames from any source.
  destination: {
    host: '0.0.0.0',
    port: 0
  },

  command: 'associate'
};

const client = new SocksClient(options);

// This event is fired when the SOCKS server has started listening on a new UDP port for UDP relaying.
client.on('established', info => {
  console.log(info);
  /*
  {
    socket: <Socket ...>,
    remoteHost: { // This is the remote port on the SOCKS proxy server to send UDP frame packets to.
      host: '104.131.124.203',
      port: 58232
    }
  }
  */

  // Send a udp frame to 8.8.8.8 on port 53 through the proxy.
  const packet = SocksClient.createUDPFrame({
    remoteHost: { host: '8.8.8.8', port: 53 },
    data: Buffer.from('hello') // A DNS lookup in the real world.
  });

  // Send packet.
  udpSocket.send(packet, info.remoteHost.port, info.remoteHost.host);
});

// SOCKS proxy failed to bind.
client.on('error', () => {
  // Handle errors
});
```
# socks examples

## Example for SOCKS 'bind' command

The bind command tells the SOCKS proxy server to bind and listen on a new TCP port for an incoming connection. It communicates the newly opened port back to the origin client. Once a incoming connection is accepted by the SOCKS proxy server it then communicates the remote host that connected to the SOCKS proxy back through the same initial connection via the origin client.

This can be used for things such as FTP clients which require incoming TCP connections, etc.

**Connection Steps**

1. Client -(bind)-> Proxy    (Tells the proxy to bind to a new port)
2. Client <-(port)- Proxy    (Tells the origin client which port it opened)
3. Client2 --> Proxy    (Other client connects to the proxy on this port)
4. Client <--(client2's host info)  (Proxy tells the origin client who connected to it)
5. Original connection to the proxy is now a full TCP stream between client (you) and client2.
6. Client <--> Proxy <--> Client2


## Usage

The 'bind' command can only be used by creating a new SocksClient instance and listening for 'bound' and 'established' events.


```typescript
const SocksClient = require('socks').SocksClient;

const options = {
  proxy: {
    host: '104.131.124.203',
    port: 1081,
    type: 5
  },

  // This should be the ip and port of the expected client that will connect to the SOCKS proxy server on the newly bound port.
  // Most SOCKS servers accept 0.0.0.0 as a wildcard address to accept any client.
  destination: {
    host: '0.0.0.0',
    port: 0
  },

  command: 'bind'
};

const client = new SocksClient(options);

// This event is fired when the SOCKS server has started listening on a new port for incoming connections.
client.on('bound', (info) => {
  console.log(info);
  /*
  {
    socket: <Socket ...>,
    remoteHost: { // This is the remote ip and port of the SOCKS proxy that is now accepting incoming connections.
      host: '104.131.124.203',
      port: 49928
    }
  }
  */
});

// This event is fired when the SOCKS server has accepted an incoming connection on the newly bound port.
client.on('established', (info) => {
  console.log(info);
  /*
  {
    socket: <Socket ...>,
    remoteHost: { // This is the remote ip and port that connected to the SOCKS proxy on the newly bound port.
      host: '1.2.3.4',
      port: 58232
    }
  }
  */

  // At this point info.socket is a regular net.Socket TCP connection between client and client2 (1.2.3.4) (the client which connected to the proxy on the newly bound port.)

  console.log(info.socket);
  // <Socket ...>  (this is a raw net.Socket that is established to the destination host through the given proxy servers)
});

// SOCKS proxy failed to bind.
client.on('error', () => {
  // Handle errors
});
```# socks examples

## Example for SOCKS 'connect' command

The connect command is the most common use-case for a SOCKS proxy. This establishes a direct connection to a destination host through a proxy server. The destination host only has knowledge of the proxy server connecting to it and does not know about the origin client (you).

**Origin Client (you) <-> Proxy Server <-> Destination Server**

In this example, we are connecting to a web server on port 80, and sending a very basic HTTP request to receive a response. It's worth noting that there are many socks-http-agents that can be used with the node http module (and libraries such as request.js) to make this easier. This HTTP request is used as a simple example.

The 'connect' command can be used via the SocksClient.createConnection() factory function as well as by creating a SocksClient instance and using event handlers.

### Using createConnection with async/await

Since SocksClient.createConnection returns a Promise, we can easily use async/await for flow control.

```typescript
const SocksClient = require('socks').SocksClient;

const options  = {
  proxy: {
    host: '104.131.124.203',
    port: 1081,
    type: 5
  },

  destination: {
    host: 'ip-api.com', // host names are supported with SOCKS v4a and SOCKS v5.
    port: 80
  },

  command: 'connect'
};

async function start() {
  try {
    const info = await SocksClient.createConnection(options);

    console.log(info.socket);
    // <Socket ...>  (this is a raw net.Socket that is established to the destination host through the given proxy servers)

    info.socket.write('GET /json HTTP/1.1\nHost: ip-api.com\n\n');
    info.socket.on('data', (data) => {
      console.log(data.toString()); // ip-api.com sees that the last proxy (104.131.124.203) is connected to it and not the origin client (you).
      /*
        HTTP/1.1 200 OK
        Access-Control-Allow-Origin: *
        Content-Type: application/json; charset=utf-8
        Date: Sun, 24 Dec 2017 03:47:51 GMT
        Content-Length: 300

        {
          "as":"AS14061 Digital Ocean, Inc.",
          "city":"Clifton",
          "country":"United States",
          "countryCode":"US",
          "isp":"Digital Ocean",
          "lat":40.8326,
          "lon":-74.1307,
          "org":"Digital Ocean",
          "query":"104.131.124.203",
          "region":"NJ",
          "regionName":"New Jersey",
          "status":"success",
          "timezone":"America/New_York",
          "zip":"07014"
        }
      */
  } catch (err) {
    // Handle errors
  }
}

start();
```

### Using createConnection with Promises

```typescript
const SocksClient = require('socks').SocksClient;

const options  = {
  proxy: {
    ipaddress: '104.131.124.203',
    port: 1081,
    type: 5
  },

  destination: {
    host: 'ip-api.com', // host names are supported with SOCKS v4a and SOCKS v5.
    port: 80
  },

  command: 'connect'
};

SocksClient.createConnection(options)
.then(info => {
  console.log(info.socket);
  // <Socket ...>  (this is a raw net.Socket that is established to the destination host through the given proxy servers)

  info.socket.write('GET /json HTTP/1.1\nHost: ip-api.com\n\n');
  info.socket.on('data', (data) => {
    console.log(data.toString()); // ip-api.com sees that the last proxy (104.131.124.203) is connected to it and not the origin client (you).
    /*
      HTTP/1.1 200 OK
      Access-Control-Allow-Origin: *
      Content-Type: application/json; charset=utf-8
      Date: Sun, 24 Dec 2017 03:47:51 GMT
      Content-Length: 300

      {
        "as":"AS14061 Digital Ocean, Inc.",
        "city":"Clifton",
        "country":"United States",
        "countryCode":"US",
        "isp":"Digital Ocean",
        "lat":40.8326,
        "lon":-74.1307,
        "org":"Digital Ocean",
        "query":"104.131.124.203",
        "region":"NJ",
        "regionName":"New Jersey",
        "status":"success",
        "timezone":"America/New_York",
        "zip":"07014"
      }
    */
})
.catch(err => {
  // handle errors
});
```

### Using createConnection with callbacks

SocksClient.createConnection() optionally accepts a callback function as a second parameter.

**Note:** If a callback function is provided, a Promise is still returned from the function, but the promise will always resolve regardless of if there was en error. (tldr: Do not mix callbacks and Promises).

```typescript
const SocksClient = require('socks').SocksClient;

const options  = {
  proxy: {
    ipaddress: '104.131.124.203',
    port: 1081,
    type: 5
  },

  destination: {
    host: 'ip-api.com', // host names are supported with SOCKS v4a and SOCKS v5.
    port: 80
  },

  command: 'connect'
};

SocksClient.createConnection(options, (err, info) => {
  if (err) {
    // handle errors
  } else {
    console.log(info.socket);
    // <Socket ...>  (this is a raw net.Socket that is established to the destination host through the given proxy servers)

    info.socket.write('GET /json HTTP/1.1\nHost: ip-api.com\n\n');
    info.socket.on('data', (data) => {
      console.log(data.toString()); // ip-api.com sees that the last proxy (104.131.124.203) is connected to it and not the origin client (you).
      /*
        HTTP/1.1 200 OK
        Access-Control-Allow-Origin: *
        Content-Type: application/json; charset=utf-8
        Date: Sun, 24 Dec 2017 03:47:51 GMT
        Content-Length: 300

        {
          "as":"AS14061 Digital Ocean, Inc.",
          "city":"Clifton",
          "country":"United States",
          "countryCode":"US",
          "isp":"Digital Ocean",
          "lat":40.8326,
          "lon":-74.1307,
          "org":"Digital Ocean",
          "query":"104.131.124.203",
          "region":"NJ",
          "regionName":"New Jersey",
          "status":"success",
          "timezone":"America/New_York",
          "zip":"07014"
        }
      */
  }
})
```

### Using event handlers

SocksClient also supports instance creation of a SocksClient. This allows for event based flow control.

```typescript
const SocksClient = require('socks').SocksClient;

const options  = {
  proxy: {
    ipaddress: '104.131.124.203',
    port: 1081,
    type: 5
  },

  destination: {
    host: 'ip-api.com', // host names are supported with SOCKS v4a and SOCKS v5.
    port: 80
  },

  command: 'connect'
};

const client = new SocksClient(options);

client.on('established', (info) => {
  console.log(info.socket);
  // <Socket ...>  (this is a raw net.Socket that is established to the destination host through the given proxy servers)

  info.socket.write('GET /json HTTP/1.1\nHost: ip-api.com\n\n');
  info.socket.on('data', (data) => {
    console.log(data.toString()); // ip-api.com sees that the last proxy (104.131.124.203) is connected to it and not the origin client (you).
    /*
      HTTP/1.1 200 OK
      Access-Control-Allow-Origin: *
      Content-Type: application/json; charset=utf-8
      Date: Sun, 24 Dec 2017 03:47:51 GMT
      Content-Length: 300

      {
        "as":"AS14061 Digital Ocean, Inc.",
        "city":"Clifton",
        "country":"United States",
        "countryCode":"US",
        "isp":"Digital Ocean",
        "lat":40.8326,
        "lon":-74.1307,
        "org":"Digital Ocean",
        "query":"104.131.124.203",
        "region":"NJ",
        "regionName":"New Jersey",
        "status":"success",
        "timezone":"America/New_York",
        "zip":"07014"
      }
    */
});

// Failed to establish proxy connection to destination.
client.on('error', () => {
  // Handle errors
});
```"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
__exportStar(require("./client/socksclient"), exports);
//# sourceMappingURL=index.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SOCKS5_NO_ACCEPTABLE_AUTH = exports.SOCKS5_CUSTOM_AUTH_END = exports.SOCKS5_CUSTOM_AUTH_START = exports.SOCKS_INCOMING_PACKET_SIZES = exports.SocksClientState = exports.Socks5Response = exports.Socks5HostType = exports.Socks5Auth = exports.Socks4Response = exports.SocksCommand = exports.ERRORS = exports.DEFAULT_TIMEOUT = void 0;
const DEFAULT_TIMEOUT = 30000;
exports.DEFAULT_TIMEOUT = DEFAULT_TIMEOUT;
// prettier-ignore
const ERRORS = {
    InvalidSocksCommand: 'An invalid SOCKS command was provided. Valid options are connect, bind, and associate.',
    InvalidSocksCommandForOperation: 'An invalid SOCKS command was provided. Only a subset of commands are supported for this operation.',
    InvalidSocksCommandChain: 'An invalid SOCKS command was provided. Chaining currently only supports the connect command.',
    InvalidSocksClientOptionsDestination: 'An invalid destination host was provided.',
    InvalidSocksClientOptionsExistingSocket: 'An invalid existing socket was provided. This should be an instance of stream.Duplex.',
    InvalidSocksClientOptionsProxy: 'Invalid SOCKS proxy details were provided.',
    InvalidSocksClientOptionsTimeout: 'An invalid timeout value was provided. Please enter a value above 0 (in ms).',
    InvalidSocksClientOptionsProxiesLength: 'At least two socks proxies must be provided for chaining.',
    InvalidSocksClientOptionsCustomAuthRange: 'Custom auth must be a value between 0x80 and 0xFE.',
    InvalidSocksClientOptionsCustomAuthOptions: 'When a custom_auth_method is provided, custom_auth_request_handler, custom_auth_response_size, and custom_auth_response_handler must also be provided and valid.',
    NegotiationError: 'Negotiation error',
    SocketClosed: 'Socket closed',
    ProxyConnectionTimedOut: 'Proxy connection timed out',
    InternalError: 'SocksClient internal error (this should not happen)',
    InvalidSocks4HandshakeResponse: 'Received invalid Socks4 handshake response',
    Socks4ProxyRejectedConnection: 'Socks4 Proxy rejected connection',
    InvalidSocks4IncomingConnectionResponse: 'Socks4 invalid incoming connection response',
    Socks4ProxyRejectedIncomingBoundConnection: 'Socks4 Proxy rejected incoming bound connection',
    InvalidSocks5InitialHandshakeResponse: 'Received invalid Socks5 initial handshake response',
    InvalidSocks5IntiailHandshakeSocksVersion: 'Received invalid Socks5 initial handshake (invalid socks version)',
    InvalidSocks5InitialHandshakeNoAcceptedAuthType: 'Received invalid Socks5 initial handshake (no accepted authentication type)',
    InvalidSocks5InitialHandshakeUnknownAuthType: 'Received invalid Socks5 initial handshake (unknown authentication type)',
    Socks5AuthenticationFailed: 'Socks5 Authentication failed',
    InvalidSocks5FinalHandshake: 'Received invalid Socks5 final handshake response',
    InvalidSocks5FinalHandshakeRejected: 'Socks5 proxy rejected connection',
    InvalidSocks5IncomingConnectionResponse: 'Received invalid Socks5 incoming connection response',
    Socks5ProxyRejectedIncomingBoundConnection: 'Socks5 Proxy rejected incoming bound connection',
};
exports.ERRORS = ERRORS;
const SOCKS_INCOMING_PACKET_SIZES = {
    Socks5InitialHandshakeResponse: 2,
    Socks5UserPassAuthenticationResponse: 2,
    // Command response + incoming connection (bind)
    Socks5ResponseHeader: 5,
    Socks5ResponseIPv4: 10,
    Socks5ResponseIPv6: 22,
    Socks5ResponseHostname: (hostNameLength) => hostNameLength + 7,
    // Command response + incoming connection (bind)
    Socks4Response: 8, // 2 header + 2 port + 4 ip
};
exports.SOCKS_INCOMING_PACKET_SIZES = SOCKS_INCOMING_PACKET_SIZES;
var SocksCommand;
(function (SocksCommand) {
    SocksCommand[SocksCommand["connect"] = 1] = "connect";
    SocksCommand[SocksCommand["bind"] = 2] = "bind";
    SocksCommand[SocksCommand["associate"] = 3] = "associate";
})(SocksCommand || (SocksCommand = {}));
exports.SocksCommand = SocksCommand;
var Socks4Response;
(function (Socks4Response) {
    Socks4Response[Socks4Response["Granted"] = 90] = "Granted";
    Socks4Response[Socks4Response["Failed"] = 91] = "Failed";
    Socks4Response[Socks4Response["Rejected"] = 92] = "Rejected";
    Socks4Response[Socks4Response["RejectedIdent"] = 93] = "RejectedIdent";
})(Socks4Response || (Socks4Response = {}));
exports.Socks4Response = Socks4Response;
var Socks5Auth;
(function (Socks5Auth) {
    Socks5Auth[Socks5Auth["NoAuth"] = 0] = "NoAuth";
    Socks5Auth[Socks5Auth["GSSApi"] = 1] = "GSSApi";
    Socks5Auth[Socks5Auth["UserPass"] = 2] = "UserPass";
})(Socks5Auth || (Socks5Auth = {}));
exports.Socks5Auth = Socks5Auth;
const SOCKS5_CUSTOM_AUTH_START = 0x80;
exports.SOCKS5_CUSTOM_AUTH_START = SOCKS5_CUSTOM_AUTH_START;
const SOCKS5_CUSTOM_AUTH_END = 0xfe;
exports.SOCKS5_CUSTOM_AUTH_END = SOCKS5_CUSTOM_AUTH_END;
const SOCKS5_NO_ACCEPTABLE_AUTH = 0xff;
exports.SOCKS5_NO_ACCEPTABLE_AUTH = SOCKS5_NO_ACCEPTABLE_AUTH;
var Socks5Response;
(function (Socks5Response) {
    Socks5Response[Socks5Response["Granted"] = 0] = "Granted";
    Socks5Response[Socks5Response["Failure"] = 1] = "Failure";
    Socks5Response[Socks5Response["NotAllowed"] = 2] = "NotAllowed";
    Socks5Response[Socks5Response["NetworkUnreachable"] = 3] = "NetworkUnreachable";
    Socks5Response[Socks5Response["HostUnreachable"] = 4] = "HostUnreachable";
    Socks5Response[Socks5Response["ConnectionRefused"] = 5] = "ConnectionRefused";
    Socks5Response[Socks5Response["TTLExpired"] = 6] = "TTLExpired";
    Socks5Response[Socks5Response["CommandNotSupported"] = 7] = "CommandNotSupported";
    Socks5Response[Socks5Response["AddressNotSupported"] = 8] = "AddressNotSupported";
})(Socks5Response || (Socks5Response = {}));
exports.Socks5Response = Socks5Response;
var Socks5HostType;
(function (Socks5HostType) {
    Socks5HostType[Socks5HostType["IPv4"] = 1] = "IPv4";
    Socks5HostType[Socks5HostType["Hostname"] = 3] = "Hostname";
    Socks5HostType[Socks5HostType["IPv6"] = 4] = "IPv6";
})(Socks5HostType || (Socks5HostType = {}));
exports.Socks5HostType = Socks5HostType;
var SocksClientState;
(function (SocksClientState) {
    SocksClientState[SocksClientState["Created"] = 0] = "Created";
    SocksClientState[SocksClientState["Connecting"] = 1] = "Connecting";
    SocksClientState[SocksClientState["Connected"] = 2] = "Connected";
    SocksClientState[SocksClientState["SentInitialHandshake"] = 3] = "SentInitialHandshake";
    SocksClientState[SocksClientState["ReceivedInitialHandshakeResponse"] = 4] = "ReceivedInitialHandshakeResponse";
    SocksClientState[SocksClientState["SentAuthentication"] = 5] = "SentAuthentication";
    SocksClientState[SocksClientState["ReceivedAuthenticationResponse"] = 6] = "ReceivedAuthenticationResponse";
    SocksClientState[SocksClientState["SentFinalHandshake"] = 7] = "SentFinalHandshake";
    SocksClientState[SocksClientState["ReceivedFinalResponse"] = 8] = "ReceivedFinalResponse";
    SocksClientState[SocksClientState["BoundWaitingForConnection"] = 9] = "BoundWaitingForConnection";
    SocksClientState[SocksClientState["Established"] = 10] = "Established";
    SocksClientState[SocksClientState["Disconnected"] = 11] = "Disconnected";
    SocksClientState[SocksClientState["Error"] = 99] = "Error";
})(SocksClientState || (SocksClientState = {}));
exports.SocksClientState = SocksClientState;
//# sourceMappingURL=constants.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateSocksClientChainOptions = exports.validateSocksClientOptions = void 0;
const util_1 = require("./util");
const constants_1 = require("./constants");
const stream = require("stream");
/**
 * Validates the provided SocksClientOptions
 * @param options { SocksClientOptions }
 * @param acceptedCommands { string[] } A list of accepted SocksProxy commands.
 */
function validateSocksClientOptions(options, acceptedCommands = ['connect', 'bind', 'associate']) {
    // Check SOCKs command option.
    if (!constants_1.SocksCommand[options.command]) {
        throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksCommand, options);
    }
    // Check SocksCommand for acceptable command.
    if (acceptedCommands.indexOf(options.command) === -1) {
        throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksCommandForOperation, options);
    }
    // Check destination
    if (!isValidSocksRemoteHost(options.destination)) {
        throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsDestination, options);
    }
    // Check SOCKS proxy to use
    if (!isValidSocksProxy(options.proxy)) {
        throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsProxy, options);
    }
    // Validate custom auth (if set)
    validateCustomProxyAuth(options.proxy, options);
    // Check timeout
    if (options.timeout && !isValidTimeoutValue(options.timeout)) {
        throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsTimeout, options);
    }
    // Check existing_socket (if provided)
    if (options.existing_socket &&
        !(options.existing_socket instanceof stream.Duplex)) {
        throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsExistingSocket, options);
    }
}
exports.validateSocksClientOptions = validateSocksClientOptions;
/**
 * Validates the SocksClientChainOptions
 * @param options { SocksClientChainOptions }
 */
function validateSocksClientChainOptions(options) {
    // Only connect is supported when chaining.
    if (options.command !== 'connect') {
        throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksCommandChain, options);
    }
    // Check destination
    if (!isValidSocksRemoteHost(options.destination)) {
        throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsDestination, options);
    }
    // Validate proxies (length)
    if (!(options.proxies &&
        Array.isArray(options.proxies) &&
        options.proxies.length >= 2)) {
        throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsProxiesLength, options);
    }
    // Validate proxies
    options.proxies.forEach((proxy) => {
        if (!isValidSocksProxy(proxy)) {
            throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsProxy, options);
        }
        // Validate custom auth (if set)
        validateCustomProxyAuth(proxy, options);
    });
    // Check timeout
    if (options.timeout && !isValidTimeoutValue(options.timeout)) {
        throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsTimeout, options);
    }
}
exports.validateSocksClientChainOptions = validateSocksClientChainOptions;
function validateCustomProxyAuth(proxy, options) {
    if (proxy.custom_auth_method !== undefined) {
        // Invalid auth method range
        if (proxy.custom_auth_method < constants_1.SOCKS5_CUSTOM_AUTH_START ||
            proxy.custom_auth_method > constants_1.SOCKS5_CUSTOM_AUTH_END) {
            throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsCustomAuthRange, options);
        }
        // Missing custom_auth_request_handler
        if (proxy.custom_auth_request_handler === undefined ||
            typeof proxy.custom_auth_request_handler !== 'function') {
            throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsCustomAuthOptions, options);
        }
        // Missing custom_auth_response_size
        if (proxy.custom_auth_response_size === undefined) {
            throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsCustomAuthOptions, options);
        }
        // Missing/invalid custom_auth_response_handler
        if (proxy.custom_auth_response_handler === undefined ||
            typeof proxy.custom_auth_response_handler !== 'function') {
            throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsCustomAuthOptions, options);
        }
    }
}
/**
 * Validates a SocksRemoteHost
 * @param remoteHost { SocksRemoteHost }
 */
function isValidSocksRemoteHost(remoteHost) {
    return (remoteHost &&
        typeof remoteHost.host === 'string' &&
        typeof remoteHost.port === 'number' &&
        remoteHost.port >= 0 &&
        remoteHost.port <= 65535);
}
/**
 * Validates a SocksProxy
 * @param proxy { SocksProxy }
 */
function isValidSocksProxy(proxy) {
    return (proxy &&
        (typeof proxy.host === 'string' || typeof proxy.ipaddress === 'string') &&
        typeof proxy.port === 'number' &&
        proxy.port >= 0 &&
        proxy.port <= 65535 &&
        (proxy.type === 4 || proxy.type === 5));
}
/**
 * Validates a timeout value.
 * @param value { Number }
 */
function isValidTimeoutValue(value) {
    return typeof value === 'number' && value > 0;
}
//# sourceMappingURL=helpers.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ReceiveBuffer = void 0;
class ReceiveBuffer {
    constructor(size = 4096) {
        this.buffer = Buffer.allocUnsafe(size);
        this.offset = 0;
        this.originalSize = size;
    }
    get length() {
        return this.offset;
    }
    append(data) {
        if (!Buffer.isBuffer(data)) {
            throw new Error('Attempted to append a non-buffer instance to ReceiveBuffer.');
        }
        if (this.offset + data.length >= this.buffer.length) {
            const tmp = this.buffer;
            this.buffer = Buffer.allocUnsafe(Math.max(this.buffer.length + this.originalSize, this.buffer.length + data.length));
            tmp.copy(this.buffer);
        }
        data.copy(this.buffer, this.offset);
        return (this.offset += data.length);
    }
    peek(length) {
        if (length > this.offset) {
            throw new Error('Attempted to read beyond the bounds of the managed internal data.');
        }
        return this.buffer.slice(0, length);
    }
    get(length) {
        if (length > this.offset) {
            throw new Error('Attempted to read beyond the bounds of the managed internal data.');
        }
        const value = Buffer.allocUnsafe(length);
        this.buffer.slice(0, length).copy(value);
        this.buffer.copyWithin(0, length, length + this.offset - length);
        this.offset -= length;
        return value;
    }
}
exports.ReceiveBuffer = ReceiveBuffer;
//# sourceMappingURL=receivebuffer.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.shuffleArray = exports.SocksClientError = void 0;
/**
 * Error wrapper for SocksClient
 */
class SocksClientError extends Error {
    constructor(message, options) {
        super(message);
        this.options = options;
    }
}
exports.SocksClientError = SocksClientError;
/**
 * Shuffles a given array.
 * @param array The array to shuffle.
 */
function shuffleArray(array) {
    for (let i = array.length - 1; i > 0; i--) {
        const j = Math.floor(Math.random() * (i + 1));
        [array[i], array[j]] = [array[j], array[i]];
    }
}
exports.shuffleArray = shuffleArray;
//# sourceMappingURL=util.js.map"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SocksClientError = exports.SocksClient = void 0;
const events_1 = require("events");
const net = require("net");
const ip = require("ip");
const smart_buffer_1 = require("smart-buffer");
const constants_1 = require("../common/constants");
const helpers_1 = require("../common/helpers");
const receivebuffer_1 = require("../common/receivebuffer");
const util_1 = require("../common/util");
Object.defineProperty(exports, "SocksClientError", { enumerable: true, get: function () { return util_1.SocksClientError; } });
class SocksClient extends events_1.EventEmitter {
    constructor(options) {
        super();
        this.options = Object.assign({}, options);
        // Validate SocksClientOptions
        (0, helpers_1.validateSocksClientOptions)(options);
        // Default state
        this.setState(constants_1.SocksClientState.Created);
    }
    /**
     * Creates a new SOCKS connection.
     *
     * Note: Supports callbacks and promises. Only supports the connect command.
     * @param options { SocksClientOptions } Options.
     * @param callback { Function } An optional callback function.
     * @returns { Promise }
     */
    static createConnection(options, callback) {
        return new Promise((resolve, reject) => {
            // Validate SocksClientOptions
            try {
                (0, helpers_1.validateSocksClientOptions)(options, ['connect']);
            }
            catch (err) {
                if (typeof callback === 'function') {
                    callback(err);
                    // eslint-disable-next-line @typescript-eslint/no-explicit-any
                    return resolve(err); // Resolves pending promise (prevents memory leaks).
                }
                else {
                    return reject(err);
                }
            }
            const client = new SocksClient(options);
            client.connect(options.existing_socket);
            client.once('established', (info) => {
                client.removeAllListeners();
                if (typeof callback === 'function') {
                    callback(null, info);
                    resolve(info); // Resolves pending promise (prevents memory leaks).
                }
                else {
                    resolve(info);
                }
            });
            // Error occurred, failed to establish connection.
            client.once('error', (err) => {
                client.removeAllListeners();
                if (typeof callback === 'function') {
                    callback(err);
                    // eslint-disable-next-line @typescript-eslint/no-explicit-any
                    resolve(err); // Resolves pending promise (prevents memory leaks).
                }
                else {
                    reject(err);
                }
            });
        });
    }
    /**
     * Creates a new SOCKS connection chain to a destination host through 2 or more SOCKS proxies.
     *
     * Note: Supports callbacks and promises. Only supports the connect method.
     * Note: Implemented via createConnection() factory function.
     * @param options { SocksClientChainOptions } Options
     * @param callback { Function } An optional callback function.
     * @returns { Promise }
     */
    static createConnectionChain(options, callback) {
        // eslint-disable-next-line no-async-promise-executor
        return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
            // Validate SocksClientChainOptions
            try {
                (0, helpers_1.validateSocksClientChainOptions)(options);
            }
            catch (err) {
                if (typeof callback === 'function') {
                    callback(err);
                    // eslint-disable-next-line @typescript-eslint/no-explicit-any
                    return resolve(err); // Resolves pending promise (prevents memory leaks).
                }
                else {
                    return reject(err);
                }
            }
            let sock;
            // Shuffle proxies
            if (options.randomizeChain) {
                (0, util_1.shuffleArray)(options.proxies);
            }
            try {
                for (let i = 0; i < options.proxies.length; i++) {
                    const nextProxy = options.proxies[i];
                    // If we've reached the last proxy in the chain, the destination is the actual destination, otherwise it's the next proxy.
                    const nextDestination = i === options.proxies.length - 1
                        ? options.destination
                        : {
                            host: options.proxies[i + 1].host ||
                                options.proxies[i + 1].ipaddress,
                            port: options.proxies[i + 1].port,
                        };
                    // Creates the next connection in the chain.
                    const result = yield SocksClient.createConnection({
                        command: 'connect',
                        proxy: nextProxy,
                        destination: nextDestination,
                        // Initial connection ignores this as sock is undefined. Subsequent connections re-use the first proxy socket to form a chain.
                    });
                    // If sock is undefined, assign it here.
                    if (!sock) {
                        sock = result.socket;
                    }
                }
                if (typeof callback === 'function') {
                    callback(null, { socket: sock });
                    resolve({ socket: sock }); // Resolves pending promise (prevents memory leaks).
                }
                else {
                    resolve({ socket: sock });
                }
            }
            catch (err) {
                if (typeof callback === 'function') {
                    callback(err);
                    // eslint-disable-next-line @typescript-eslint/no-explicit-any
                    resolve(err); // Resolves pending promise (prevents memory leaks).
                }
                else {
                    reject(err);
                }
            }
        }));
    }
    /**
     * Creates a SOCKS UDP Frame.
     * @param options
     */
    static createUDPFrame(options) {
        const buff = new smart_buffer_1.SmartBuffer();
        buff.writeUInt16BE(0);
        buff.writeUInt8(options.frameNumber || 0);
        // IPv4/IPv6/Hostname
        if (net.isIPv4(options.remoteHost.host)) {
            buff.writeUInt8(constants_1.Socks5HostType.IPv4);
            buff.writeUInt32BE(ip.toLong(options.remoteHost.host));
        }
        else if (net.isIPv6(options.remoteHost.host)) {
            buff.writeUInt8(constants_1.Socks5HostType.IPv6);
            buff.writeBuffer(ip.toBuffer(options.remoteHost.host));
        }
        else {
            buff.writeUInt8(constants_1.Socks5HostType.Hostname);
            buff.writeUInt8(Buffer.byteLength(options.remoteHost.host));
            buff.writeString(options.remoteHost.host);
        }
        // Port
        buff.writeUInt16BE(options.remoteHost.port);
        // Data
        buff.writeBuffer(options.data);
        return buff.toBuffer();
    }
    /**
     * Parses a SOCKS UDP frame.
     * @param data
     */
    static parseUDPFrame(data) {
        const buff = smart_buffer_1.SmartBuffer.fromBuffer(data);
        buff.readOffset = 2;
        const frameNumber = buff.readUInt8();
        const hostType = buff.readUInt8();
        let remoteHost;
        if (hostType === constants_1.Socks5HostType.IPv4) {
            remoteHost = ip.fromLong(buff.readUInt32BE());
        }
        else if (hostType === constants_1.Socks5HostType.IPv6) {
            remoteHost = ip.toString(buff.readBuffer(16));
        }
        else {
            remoteHost = buff.readString(buff.readUInt8());
        }
        const remotePort = buff.readUInt16BE();
        return {
            frameNumber,
            remoteHost: {
                host: remoteHost,
                port: remotePort,
            },
            data: buff.readBuffer(),
        };
    }
    /**
     * Internal state setter. If the SocksClient is in an error state, it cannot be changed to a non error state.
     */
    setState(newState) {
        if (this.state !== constants_1.SocksClientState.Error) {
            this.state = newState;
        }
    }
    /**
     * Starts the connection establishment to the proxy and destination.
     * @param existingSocket Connected socket to use instead of creating a new one (internal use).
     */
    connect(existingSocket) {
        this.onDataReceived = (data) => this.onDataReceivedHandler(data);
        this.onClose = () => this.onCloseHandler();
        this.onError = (err) => this.onErrorHandler(err);
        this.onConnect = () => this.onConnectHandler();
        // Start timeout timer (defaults to 30 seconds)
        const timer = setTimeout(() => this.onEstablishedTimeout(), this.options.timeout || constants_1.DEFAULT_TIMEOUT);
        // check whether unref is available as it differs from browser to NodeJS (#33)
        if (timer.unref && typeof timer.unref === 'function') {
            timer.unref();
        }
        // If an existing socket is provided, use it to negotiate SOCKS handshake. Otherwise create a new Socket.
        if (existingSocket) {
            this.socket = existingSocket;
        }
        else {
            this.socket = new net.Socket();
        }
        // Attach Socket error handlers.
        this.socket.once('close', this.onClose);
        this.socket.once('error', this.onError);
        this.socket.once('connect', this.onConnect);
        this.socket.on('data', this.onDataReceived);
        this.setState(constants_1.SocksClientState.Connecting);
        this.receiveBuffer = new receivebuffer_1.ReceiveBuffer();
        if (existingSocket) {
            this.socket.emit('connect');
        }
        else {
            this.socket.connect(this.getSocketOptions());
            if (this.options.set_tcp_nodelay !== undefined &&
                this.options.set_tcp_nodelay !== null) {
                this.socket.setNoDelay(!!this.options.set_tcp_nodelay);
            }
        }
        // Listen for established event so we can re-emit any excess data received during handshakes.
        this.prependOnceListener('established', (info) => {
            setImmediate(() => {
                if (this.receiveBuffer.length > 0) {
                    const excessData = this.receiveBuffer.get(this.receiveBuffer.length);
                    info.socket.emit('data', excessData);
                }
                info.socket.resume();
            });
        });
    }
    // Socket options (defaults host/port to options.proxy.host/options.proxy.port)
    getSocketOptions() {
        return Object.assign(Object.assign({}, this.options.socket_options), { host: this.options.proxy.host || this.options.proxy.ipaddress, port: this.options.proxy.port });
    }
    /**
     * Handles internal Socks timeout callback.
     * Note: If the Socks client is not BoundWaitingForConnection or Established, the connection will be closed.
     */
    onEstablishedTimeout() {
        if (this.state !== constants_1.SocksClientState.Established &&
            this.state !== constants_1.SocksClientState.BoundWaitingForConnection) {
            this.closeSocket(constants_1.ERRORS.ProxyConnectionTimedOut);
        }
    }
    /**
     * Handles Socket connect event.
     */
    onConnectHandler() {
        this.setState(constants_1.SocksClientState.Connected);
        // Send initial handshake.
        if (this.options.proxy.type === 4) {
            this.sendSocks4InitialHandshake();
        }
        else {
            this.sendSocks5InitialHandshake();
        }
        this.setState(constants_1.SocksClientState.SentInitialHandshake);
    }
    /**
     * Handles Socket data event.
     * @param data
     */
    onDataReceivedHandler(data) {
        /*
          All received data is appended to a ReceiveBuffer.
          This makes sure that all the data we need is received before we attempt to process it.
        */
        this.receiveBuffer.append(data);
        // Process data that we have.
        this.processData();
    }
    /**
     * Handles processing of the data we have received.
     */
    processData() {
        // If we have enough data to process the next step in the SOCKS handshake, proceed.
        while (this.state !== constants_1.SocksClientState.Established &&
            this.state !== constants_1.SocksClientState.Error &&
            this.receiveBuffer.length >= this.nextRequiredPacketBufferSize) {
            // Sent initial handshake, waiting for response.
            if (this.state === constants_1.SocksClientState.SentInitialHandshake) {
                if (this.options.proxy.type === 4) {
                    // Socks v4 only has one handshake response.
                    this.handleSocks4FinalHandshakeResponse();
                }
                else {
                    // Socks v5 has two handshakes, handle initial one here.
                    this.handleInitialSocks5HandshakeResponse();
                }
                // Sent auth request for Socks v5, waiting for response.
            }
            else if (this.state === constants_1.SocksClientState.SentAuthentication) {
                this.handleInitialSocks5AuthenticationHandshakeResponse();
                // Sent final Socks v5 handshake, waiting for final response.
            }
            else if (this.state === constants_1.SocksClientState.SentFinalHandshake) {
                this.handleSocks5FinalHandshakeResponse();
                // Socks BIND established. Waiting for remote connection via proxy.
            }
            else if (this.state === constants_1.SocksClientState.BoundWaitingForConnection) {
                if (this.options.proxy.type === 4) {
                    this.handleSocks4IncomingConnectionResponse();
                }
                else {
                    this.handleSocks5IncomingConnectionResponse();
                }
            }
            else {
                this.closeSocket(constants_1.ERRORS.InternalError);
                break;
            }
        }
    }
    /**
     * Handles Socket close event.
     * @param had_error
     */
    onCloseHandler() {
        this.closeSocket(constants_1.ERRORS.SocketClosed);
    }
    /**
     * Handles Socket error event.
     * @param err
     */
    onErrorHandler(err) {
        this.closeSocket(err.message);
    }
    /**
     * Removes internal event listeners on the underlying Socket.
     */
    removeInternalSocketHandlers() {
        // Pauses data flow of the socket (this is internally resumed after 'established' is emitted)
        this.socket.pause();
        this.socket.removeListener('data', this.onDataReceived);
        this.socket.removeListener('close', this.onClose);
        this.socket.removeListener('error', this.onError);
        this.socket.removeListener('connect', this.onConnect);
    }
    /**
     * Closes and destroys the underlying Socket. Emits an error event.
     * @param err { String } An error string to include in error event.
     */
    closeSocket(err) {
        // Make sure only one 'error' event is fired for the lifetime of this SocksClient instance.
        if (this.state !== constants_1.SocksClientState.Error) {
            // Set internal state to Error.
            this.setState(constants_1.SocksClientState.Error);
            // Destroy Socket
            this.socket.destroy();
            // Remove internal listeners
            this.removeInternalSocketHandlers();
            // Fire 'error' event.
            this.emit('error', new util_1.SocksClientError(err, this.options));
        }
    }
    /**
     * Sends initial Socks v4 handshake request.
     */
    sendSocks4InitialHandshake() {
        const userId = this.options.proxy.userId || '';
        const buff = new smart_buffer_1.SmartBuffer();
        buff.writeUInt8(0x04);
        buff.writeUInt8(constants_1.SocksCommand[this.options.command]);
        buff.writeUInt16BE(this.options.destination.port);
        // Socks 4 (IPv4)
        if (net.isIPv4(this.options.destination.host)) {
            buff.writeBuffer(ip.toBuffer(this.options.destination.host));
            buff.writeStringNT(userId);
            // Socks 4a (hostname)
        }
        else {
            buff.writeUInt8(0x00);
            buff.writeUInt8(0x00);
            buff.writeUInt8(0x00);
            buff.writeUInt8(0x01);
            buff.writeStringNT(userId);
            buff.writeStringNT(this.options.destination.host);
        }
        this.nextRequiredPacketBufferSize =
            constants_1.SOCKS_INCOMING_PACKET_SIZES.Socks4Response;
        this.socket.write(buff.toBuffer());
    }
    /**
     * Handles Socks v4 handshake response.
     * @param data
     */
    handleSocks4FinalHandshakeResponse() {
        const data = this.receiveBuffer.get(8);
        if (data[1] !== constants_1.Socks4Response.Granted) {
            this.closeSocket(`${constants_1.ERRORS.Socks4ProxyRejectedConnection} - (${constants_1.Socks4Response[data[1]]})`);
        }
        else {
            // Bind response
            if (constants_1.SocksCommand[this.options.command] === constants_1.SocksCommand.bind) {
                const buff = smart_buffer_1.SmartBuffer.fromBuffer(data);
                buff.readOffset = 2;
                const remoteHost = {
                    port: buff.readUInt16BE(),
                    host: ip.fromLong(buff.readUInt32BE()),
                };
                // If host is 0.0.0.0, set to proxy host.
                if (remoteHost.host === '0.0.0.0') {
                    remoteHost.host = this.options.proxy.ipaddress;
                }
                this.setState(constants_1.SocksClientState.BoundWaitingForConnection);
                this.emit('bound', { remoteHost, socket: this.socket });
                // Connect response
            }
            else {
                this.setState(constants_1.SocksClientState.Established);
                this.removeInternalSocketHandlers();
                this.emit('established', { socket: this.socket });
            }
        }
    }
    /**
     * Handles Socks v4 incoming connection request (BIND)
     * @param data
     */
    handleSocks4IncomingConnectionResponse() {
        const data = this.receiveBuffer.get(8);
        if (data[1] !== constants_1.Socks4Response.Granted) {
            this.closeSocket(`${constants_1.ERRORS.Socks4ProxyRejectedIncomingBoundConnection} - (${constants_1.Socks4Response[data[1]]})`);
        }
        else {
            const buff = smart_buffer_1.SmartBuffer.fromBuffer(data);
            buff.readOffset = 2;
            const remoteHost = {
                port: buff.readUInt16BE(),
                host: ip.fromLong(buff.readUInt32BE()),
            };
            this.setState(constants_1.SocksClientState.Established);
            this.removeInternalSocketHandlers();
            this.emit('established', { remoteHost, socket: this.socket });
        }
    }
    /**
     * Sends initial Socks v5 handshake request.
     */
    sendSocks5InitialHandshake() {
        const buff = new smart_buffer_1.SmartBuffer();
        // By default we always support no auth.
        const supportedAuthMethods = [constants_1.Socks5Auth.NoAuth];
        // We should only tell the proxy we support user/pass auth if auth info is actually provided.
        // Note: As of Tor v0.3.5.7+, if user/pass auth is an option from the client, by default it will always take priority.
        if (this.options.proxy.userId || this.options.proxy.password) {
            supportedAuthMethods.push(constants_1.Socks5Auth.UserPass);
        }
        // Custom auth method?
        if (this.options.proxy.custom_auth_method !== undefined) {
            supportedAuthMethods.push(this.options.proxy.custom_auth_method);
        }
        // Build handshake packet
        buff.writeUInt8(0x05);
        buff.writeUInt8(supportedAuthMethods.length);
        for (const authMethod of supportedAuthMethods) {
            buff.writeUInt8(authMethod);
        }
        this.nextRequiredPacketBufferSize =
            constants_1.SOCKS_INCOMING_PACKET_SIZES.Socks5InitialHandshakeResponse;
        this.socket.write(buff.toBuffer());
        this.setState(constants_1.SocksClientState.SentInitialHandshake);
    }
    /**
     * Handles initial Socks v5 handshake response.
     * @param data
     */
    handleInitialSocks5HandshakeResponse() {
        const data = this.receiveBuffer.get(2);
        if (data[0] !== 0x05) {
            this.closeSocket(constants_1.ERRORS.InvalidSocks5IntiailHandshakeSocksVersion);
        }
        else if (data[1] === constants_1.SOCKS5_NO_ACCEPTABLE_AUTH) {
            this.closeSocket(constants_1.ERRORS.InvalidSocks5InitialHandshakeNoAcceptedAuthType);
        }
        else {
            // If selected Socks v5 auth method is no auth, send final handshake request.
            if (data[1] === constants_1.Socks5Auth.NoAuth) {
                this.socks5ChosenAuthType = constants_1.Socks5Auth.NoAuth;
                this.sendSocks5CommandRequest();
                // If selected Socks v5 auth method is user/password, send auth handshake.
            }
            else if (data[1] === constants_1.Socks5Auth.UserPass) {
                this.socks5ChosenAuthType = constants_1.Socks5Auth.UserPass;
                this.sendSocks5UserPassAuthentication();
                // If selected Socks v5 auth method is the custom_auth_method, send custom handshake.
            }
            else if (data[1] === this.options.proxy.custom_auth_method) {
                this.socks5ChosenAuthType = this.options.proxy.custom_auth_method;
                this.sendSocks5CustomAuthentication();
            }
            else {
                this.closeSocket(constants_1.ERRORS.InvalidSocks5InitialHandshakeUnknownAuthType);
            }
        }
    }
    /**
     * Sends Socks v5 user & password auth handshake.
     *
     * Note: No auth and user/pass are currently supported.
     */
    sendSocks5UserPassAuthentication() {
        const userId = this.options.proxy.userId || '';
        const password = this.options.proxy.password || '';
        const buff = new smart_buffer_1.SmartBuffer();
        buff.writeUInt8(0x01);
        buff.writeUInt8(Buffer.byteLength(userId));
        buff.writeString(userId);
        buff.writeUInt8(Buffer.byteLength(password));
        buff.writeString(password);
        this.nextRequiredPacketBufferSize =
            constants_1.SOCKS_INCOMING_PACKET_SIZES.Socks5UserPassAuthenticationResponse;
        this.socket.write(buff.toBuffer());
        this.setState(constants_1.SocksClientState.SentAuthentication);
    }
    sendSocks5CustomAuthentication() {
        return __awaiter(this, void 0, void 0, function* () {
            this.nextRequiredPacketBufferSize =
                this.options.proxy.custom_auth_response_size;
            this.socket.write(yield this.options.proxy.custom_auth_request_handler());
            this.setState(constants_1.SocksClientState.SentAuthentication);
        });
    }
    handleSocks5CustomAuthHandshakeResponse(data) {
        return __awaiter(this, void 0, void 0, function* () {
            return yield this.options.proxy.custom_auth_response_handler(data);
        });
    }
    handleSocks5AuthenticationNoAuthHandshakeResponse(data) {
        return __awaiter(this, void 0, void 0, function* () {
            return data[1] === 0x00;
        });
    }
    handleSocks5AuthenticationUserPassHandshakeResponse(data) {
        return __awaiter(this, void 0, void 0, function* () {
            return data[1] === 0x00;
        });
    }
    /**
     * Handles Socks v5 auth handshake response.
     * @param data
     */
    handleInitialSocks5AuthenticationHandshakeResponse() {
        return __awaiter(this, void 0, void 0, function* () {
            this.setState(constants_1.SocksClientState.ReceivedAuthenticationResponse);
            let authResult = false;
            if (this.socks5ChosenAuthType === constants_1.Socks5Auth.NoAuth) {
                authResult = yield this.handleSocks5AuthenticationNoAuthHandshakeResponse(this.receiveBuffer.get(2));
            }
            else if (this.socks5ChosenAuthType === constants_1.Socks5Auth.UserPass) {
                authResult =
                    yield this.handleSocks5AuthenticationUserPassHandshakeResponse(this.receiveBuffer.get(2));
            }
            else if (this.socks5ChosenAuthType === this.options.proxy.custom_auth_method) {
                authResult = yield this.handleSocks5CustomAuthHandshakeResponse(this.receiveBuffer.get(this.options.proxy.custom_auth_response_size));
            }
            if (!authResult) {
                this.closeSocket(constants_1.ERRORS.Socks5AuthenticationFailed);
            }
            else {
                this.sendSocks5CommandRequest();
            }
        });
    }
    /**
     * Sends Socks v5 final handshake request.
     */
    sendSocks5CommandRequest() {
        const buff = new smart_buffer_1.SmartBuffer();
        buff.writeUInt8(0x05);
        buff.writeUInt8(constants_1.SocksCommand[this.options.command]);
        buff.writeUInt8(0x00);
        // ipv4, ipv6, domain?
        if (net.isIPv4(this.options.destination.host)) {
            buff.writeUInt8(constants_1.Socks5HostType.IPv4);
            buff.writeBuffer(ip.toBuffer(this.options.destination.host));
        }
        else if (net.isIPv6(this.options.destination.host)) {
            buff.writeUInt8(constants_1.Socks5HostType.IPv6);
            buff.writeBuffer(ip.toBuffer(this.options.destination.host));
        }
        else {
            buff.writeUInt8(constants_1.Socks5HostType.Hostname);
            buff.writeUInt8(this.options.destination.host.length);
            buff.writeString(this.options.destination.host);
        }
        buff.writeUInt16BE(this.options.destination.port);
        this.nextRequiredPacketBufferSize =
            constants_1.SOCKS_INCOMING_PACKET_SIZES.Socks5ResponseHeader;
        this.socket.write(buff.toBuffer());
        this.setState(constants_1.SocksClientState.SentFinalHandshake);
    }
    /**
     * Handles Socks v5 final handshake response.
     * @param data
     */
    handleSocks5FinalHandshakeResponse() {
        // Peek at available data (we need at least 5 bytes to get the hostname length)
        const header = this.receiveBuffer.peek(5);
        if (header[0] !== 0x05 || header[1] !== constants_1.Socks5Response.Granted) {
            this.closeSocket(`${constants_1.ERRORS.InvalidSocks5FinalHandshakeRejected} - ${constants_1.Socks5Response[header[1]]}`);
        }
        else {
            // Read address type
            const addressType = header[3];
            let remoteHost;
            let buff;
            // IPv4
            if (addressType === constants_1.Socks5HostType.IPv4) {
                // Check if data is available.
                const dataNeeded = constants_1.SOCKS_INCOMING_PACKET_SIZES.Socks5ResponseIPv4;
                if (this.receiveBuffer.length < dataNeeded) {
                    this.nextRequiredPacketBufferSize = dataNeeded;
                    return;
                }
                buff = smart_buffer_1.SmartBuffer.fromBuffer(this.receiveBuffer.get(dataNeeded).slice(4));
                remoteHost = {
                    host: ip.fromLong(buff.readUInt32BE()),
                    port: buff.readUInt16BE(),
                };
                // If given host is 0.0.0.0, assume remote proxy ip instead.
                if (remoteHost.host === '0.0.0.0') {
                    remoteHost.host = this.options.proxy.ipaddress;
                }
                // Hostname
            }
            else if (addressType === constants_1.Socks5HostType.Hostname) {
                const hostLength = header[4];
                const dataNeeded = constants_1.SOCKS_INCOMING_PACKET_SIZES.Socks5ResponseHostname(hostLength); // header + host length + host + port
                // Check if data is available.
                if (this.receiveBuffer.length < dataNeeded) {
                    this.nextRequiredPacketBufferSize = dataNeeded;
                    return;
                }
                buff = smart_buffer_1.SmartBuffer.fromBuffer(this.receiveBuffer.get(dataNeeded).slice(5));
                remoteHost = {
                    host: buff.readString(hostLength),
                    port: buff.readUInt16BE(),
                };
                // IPv6
            }
            else if (addressType === constants_1.Socks5HostType.IPv6) {
                // Check if data is available.
                const dataNeeded = constants_1.SOCKS_INCOMING_PACKET_SIZES.Socks5ResponseIPv6;
                if (this.receiveBuffer.length < dataNeeded) {
                    this.nextRequiredPacketBufferSize = dataNeeded;
                    return;
                }
                buff = smart_buffer_1.SmartBuffer.fromBuffer(this.receiveBuffer.get(dataNeeded).slice(4));
                remoteHost = {
                    host: ip.toString(buff.readBuffer(16)),
                    port: buff.readUInt16BE(),
                };
            }
            // We have everything we need
            this.setState(constants_1.SocksClientState.ReceivedFinalResponse);
            // If using CONNECT, the client is now in the established state.
            if (constants_1.SocksCommand[this.options.command] === constants_1.SocksCommand.connect) {
                this.setState(constants_1.SocksClientState.Established);
                this.removeInternalSocketHandlers();
                this.emit('established', { remoteHost, socket: this.socket });
            }
            else if (constants_1.SocksCommand[this.options.command] === constants_1.SocksCommand.bind) {
                /* If using BIND, the Socks client is now in BoundWaitingForConnection state.
                   This means that the remote proxy server is waiting for a remote connection to the bound port. */
                this.setState(constants_1.SocksClientState.BoundWaitingForConnection);
                this.nextRequiredPacketBufferSize =
                    constants_1.SOCKS_INCOMING_PACKET_SIZES.Socks5ResponseHeader;
                this.emit('bound', { remoteHost, socket: this.socket });
                /*
                  If using Associate, the Socks client is now Established. And the proxy server is now accepting UDP packets at the
                  given bound port. This initial Socks TCP connection must remain open for the UDP relay to continue to work.
                */
            }
            else if (constants_1.SocksCommand[this.options.command] === constants_1.SocksCommand.associate) {
                this.setState(constants_1.SocksClientState.Established);
                this.removeInternalSocketHandlers();
                this.emit('established', {
                    remoteHost,
                    socket: this.socket,
                });
            }
        }
    }
    /**
     * Handles Socks v5 incoming connection request (BIND).
     */
    handleSocks5IncomingConnectionResponse() {
        // Peek at available data (we need at least 5 bytes to get the hostname length)
        const header = this.receiveBuffer.peek(5);
        if (header[0] !== 0x05 || header[1] !== constants_1.Socks5Response.Granted) {
            this.closeSocket(`${constants_1.ERRORS.Socks5ProxyRejectedIncomingBoundConnection} - ${constants_1.Socks5Response[header[1]]}`);
        }
        else {
            // Read address type
            const addressType = header[3];
            let remoteHost;
            let buff;
            // IPv4
            if (addressType === constants_1.Socks5HostType.IPv4) {
                // Check if data is available.
                const dataNeeded = constants_1.SOCKS_INCOMING_PACKET_SIZES.Socks5ResponseIPv4;
                if (this.receiveBuffer.length < dataNeeded) {
                    this.nextRequiredPacketBufferSize = dataNeeded;
                    return;
                }
                buff = smart_buffer_1.SmartBuffer.fromBuffer(this.receiveBuffer.get(dataNeeded).slice(4));
                remoteHost = {
                    host: ip.fromLong(buff.readUInt32BE()),
                    port: buff.readUInt16BE(),
                };
                // If given host is 0.0.0.0, assume remote proxy ip instead.
                if (remoteHost.host === '0.0.0.0') {
                    remoteHost.host = this.options.proxy.ipaddress;
                }
                // Hostname
            }
            else if (addressType === constants_1.Socks5HostType.Hostname) {
                const hostLength = header[4];
                const dataNeeded = constants_1.SOCKS_INCOMING_PACKET_SIZES.Socks5ResponseHostname(hostLength); // header + host length + port
                // Check if data is available.
                if (this.receiveBuffer.length < dataNeeded) {
                    this.nextRequiredPacketBufferSize = dataNeeded;
                    return;
                }
                buff = smart_buffer_1.SmartBuffer.fromBuffer(this.receiveBuffer.get(dataNeeded).slice(5));
                remoteHost = {
                    host: buff.readString(hostLength),
                    port: buff.readUInt16BE(),
                };
                // IPv6
            }
            else if (addressType === constants_1.Socks5HostType.IPv6) {
                // Check if data is available.
                const dataNeeded = constants_1.SOCKS_INCOMING_PACKET_SIZES.Socks5ResponseIPv6;
                if (this.receiveBuffer.length < dataNeeded) {
                    this.nextRequiredPacketBufferSize = dataNeeded;
                    return;
                }
                buff = smart_buffer_1.SmartBuffer.fromBuffer(this.receiveBuffer.get(dataNeeded).slice(4));
                remoteHost = {
                    host: ip.toString(buff.readBuffer(16)),
                    port: buff.readUInt16BE(),
                };
            }
            this.setState(constants_1.SocksClientState.Established);
            this.removeInternalSocketHandlers();
            this.emit('established', { remoteHost, socket: this.socket });
        }
    }
    get socksClientOptions() {
        return Object.assign({}, this.options);
    }
}
exports.SocksClient = SocksClient;
//# sourceMappingURL=socksclient.js.mapCopyright (c) 2007-2014, Alexandru Marasteanu <hello [at) alexei (dot] ro>
All rights reserved.

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.
* Neither the name of this software nor the names of its contributors may 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 AUTHORS OR COPYRIGHT HOLDERS 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.
{
  "name": "sprintf",
  "description": "JavaScript sprintf implementation",
  "version": "1.0.3",
  "main": "src/sprintf.js",
  "license": "BSD-3-Clause-Clear",
  "keywords": ["sprintf", "string", "formatting"],
  "authors": ["Alexandru Marasteanu <hello@alexei.ro> (http://alexei.ro/)"],
  "homepage": "https://github.com/alexei/sprintf.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/alexei/sprintf.js.git"
  }
}
module.exports = function(grunt) {
    grunt.initConfig({
        pkg: grunt.file.readJSON("package.json"),

        uglify: {
            options: {
                banner: "/*! <%= pkg.name %> | <%= pkg.author %> | <%= pkg.license %> */\n",
                sourceMap: true
            },
            build: {
                files: [
                    {
                        src: "src/sprintf.js",
                        dest: "dist/sprintf.min.js"
                    },
                    {
                        src: "src/angular-sprintf.js",
                        dest: "dist/angular-sprintf.min.js"
                    }
                ]
            }
        },

        watch: {
            js: {
                files: "src/*.js",
                tasks: ["uglify"]
            }
        }
    })

    grunt.loadNpmTasks("grunt-contrib-uglify")
    grunt.loadNpmTasks("grunt-contrib-watch")

    grunt.registerTask("default", ["uglify", "watch"])
}
{
  "name": "sprintf-js",
  "version": "1.0.3",
  "description": "JavaScript sprintf implementation",
  "author": "Alexandru Marasteanu <hello@alexei.ro> (http://alexei.ro/)",
  "main": "src/sprintf.js",
  "repository": {
    "type": "git",
    "url": "https://github.com/alexei/sprintf.js.git"
  },
  "license": "BSD-3-Clause",
  "readmeFilename": "README.md",
  "devDependencies": {
    "mocha": "*",
    "grunt": "*",
    "grunt-contrib-watch": "*",
    "grunt-contrib-uglify": "*"
  }
}angular.
    module("sprintf", []).
    filter("sprintf", function() {
        return function() {
            return sprintf.apply(null, arguments)
        }
    }).
    filter("fmt", ["$filter", function($filter) {
        return $filter("sprintf")
    }]).
    filter("vsprintf", function() {
        return function(format, argv) {
            return vsprintf(format, argv)
        }
    }).
    filter("vfmt", ["$filter", function($filter) {
        return $filter("vsprintf")
    }])
(function(window) {
    var re = {
        not_string: /[^s]/,
        number: /[diefg]/,
        json: /[j]/,
        not_json: /[^j]/,
        text: /^[^\x25]+/,
        modulo: /^\x25{2}/,
        placeholder: /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijosuxX])/,
        key: /^([a-z_][a-z_\d]*)/i,
        key_access: /^\.([a-z_][a-z_\d]*)/i,
        index_access: /^\[(\d+)\]/,
        sign: /^[\+\-]/
    }

    function sprintf() {
        var key = arguments[0], cache = sprintf.cache
        if (!(cache[key] && cache.hasOwnProperty(key))) {
            cache[key] = sprintf.parse(key)
        }
        return sprintf.format.call(null, cache[key], arguments)
    }

    sprintf.format = function(parse_tree, argv) {
        var cursor = 1, tree_length = parse_tree.length, node_type = "", arg, output = [], i, k, match, pad, pad_character, pad_length, is_positive = true, sign = ""
        for (i = 0; i < tree_length; i++) {
            node_type = get_type(parse_tree[i])
            if (node_type === "string") {
                output[output.length] = parse_tree[i]
            }
            else if (node_type === "array") {
                match = parse_tree[i] // convenience purposes only
                if (match[2]) { // keyword argument
                    arg = argv[cursor]
                    for (k = 0; k < match[2].length; k++) {
                        if (!arg.hasOwnProperty(match[2][k])) {
                            throw new Error(sprintf("[sprintf] property '%s' does not exist", match[2][k]))
                        }
                        arg = arg[match[2][k]]
                    }
                }
                else if (match[1]) { // positional argument (explicit)
                    arg = argv[match[1]]
                }
                else { // positional argument (implicit)
                    arg = argv[cursor++]
                }

                if (get_type(arg) == "function") {
                    arg = arg()
                }

                if (re.not_string.test(match[8]) && re.not_json.test(match[8]) && (get_type(arg) != "number" && isNaN(arg))) {
                    throw new TypeError(sprintf("[sprintf] expecting number but found %s", get_type(arg)))
                }

                if (re.number.test(match[8])) {
                    is_positive = arg >= 0
                }

                switch (match[8]) {
                    case "b":
                        arg = arg.toString(2)
                    break
                    case "c":
                        arg = String.fromCharCode(arg)
                    break
                    case "d":
                    case "i":
                        arg = parseInt(arg, 10)
                    break
                    case "j":
                        arg = JSON.stringify(arg, null, match[6] ? parseInt(match[6]) : 0)
                    break
                    case "e":
                        arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential()
                    break
                    case "f":
                        arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg)
                    break
                    case "g":
                        arg = match[7] ? parseFloat(arg).toPrecision(match[7]) : parseFloat(arg)
                    break
                    case "o":
                        arg = arg.toString(8)
                    break
                    case "s":
                        arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg)
                    break
                    case "u":
                        arg = arg >>> 0
                    break
                    case "x":
                        arg = arg.toString(16)
                    break
                    case "X":
                        arg = arg.toString(16).toUpperCase()
                    break
                }
                if (re.json.test(match[8])) {
                    output[output.length] = arg
                }
                else {
                    if (re.number.test(match[8]) && (!is_positive || match[3])) {
                        sign = is_positive ? "+" : "-"
                        arg = arg.toString().replace(re.sign, "")
                    }
                    else {
                        sign = ""
                    }
                    pad_character = match[4] ? match[4] === "0" ? "0" : match[4].charAt(1) : " "
                    pad_length = match[6] - (sign + arg).length
                    pad = match[6] ? (pad_length > 0 ? str_repeat(pad_character, pad_length) : "") : ""
                    output[output.length] = match[5] ? sign + arg + pad : (pad_character === "0" ? sign + pad + arg : pad + sign + arg)
                }
            }
        }
        return output.join("")
    }

    sprintf.cache = {}

    sprintf.parse = function(fmt) {
        var _fmt = fmt, match = [], parse_tree = [], arg_names = 0
        while (_fmt) {
            if ((match = re.text.exec(_fmt)) !== null) {
                parse_tree[parse_tree.length] = match[0]
            }
            else if ((match = re.modulo.exec(_fmt)) !== null) {
                parse_tree[parse_tree.length] = "%"
            }
            else if ((match = re.placeholder.exec(_fmt)) !== null) {
                if (match[2]) {
                    arg_names |= 1
                    var field_list = [], replacement_field = match[2], field_match = []
                    if ((field_match = re.key.exec(replacement_field)) !== null) {
                        field_list[field_list.length] = field_match[1]
                        while ((replacement_field = replacement_field.substring(field_match[0].length)) !== "") {
                            if ((field_match = re.key_access.exec(replacement_field)) !== null) {
                                field_list[field_list.length] = field_match[1]
                            }
                            else if ((field_match = re.index_access.exec(replacement_field)) !== null) {
                                field_list[field_list.length] = field_match[1]
                            }
                            else {
                                throw new SyntaxError("[sprintf] failed to parse named argument key")
                            }
                        }
                    }
                    else {
                        throw new SyntaxError("[sprintf] failed to parse named argument key")
                    }
                    match[2] = field_list
                }
                else {
                    arg_names |= 2
                }
                if (arg_names === 3) {
                    throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported")
                }
                parse_tree[parse_tree.length] = match
            }
            else {
                throw new SyntaxError("[sprintf] unexpected placeholder")
            }
            _fmt = _fmt.substring(match[0].length)
        }
        return parse_tree
    }

    var vsprintf = function(fmt, argv, _argv) {
        _argv = (argv || []).slice(0)
        _argv.splice(0, 0, fmt)
        return sprintf.apply(null, _argv)
    }

    /**
     * helpers
     */
    function get_type(variable) {
        return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase()
    }

    function str_repeat(input, multiplier) {
        return Array(multiplier + 1).join(input)
    }

    /**
     * export to either browser or node.js
     */
    if (typeof exports !== "undefined") {
        exports.sprintf = sprintf
        exports.vsprintf = vsprintf
    }
    else {
        window.sprintf = sprintf
        window.vsprintf = vsprintf

        if (typeof define === "function" && define.amd) {
            define(function() {
                return {
                    sprintf: sprintf,
                    vsprintf: vsprintf
                }
            })
        }
    }
})(typeof window === "undefined" ? this : window);
/*! sprintf-js | Alexandru Marasteanu <hello@alexei.ro> (http://alexei.ro/) | BSD-3-Clause */

angular.module("sprintf",[]).filter("sprintf",function(){return function(){return sprintf.apply(null,arguments)}}).filter("fmt",["$filter",function(a){return a("sprintf")}]).filter("vsprintf",function(){return function(a,b){return vsprintf(a,b)}}).filter("vfmt",["$filter",function(a){return a("vsprintf")}]);
//# sourceMappingURL=angular-sprintf.min.map/*! sprintf-js | Alexandru Marasteanu <hello@alexei.ro> (http://alexei.ro/) | BSD-3-Clause */

!function(a){function b(){var a=arguments[0],c=b.cache;return c[a]&&c.hasOwnProperty(a)||(c[a]=b.parse(a)),b.format.call(null,c[a],arguments)}function c(a){return Object.prototype.toString.call(a).slice(8,-1).toLowerCase()}function d(a,b){return Array(b+1).join(a)}var e={not_string:/[^s]/,number:/[diefg]/,json:/[j]/,not_json:/[^j]/,text:/^[^\x25]+/,modulo:/^\x25{2}/,placeholder:/^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijosuxX])/,key:/^([a-z_][a-z_\d]*)/i,key_access:/^\.([a-z_][a-z_\d]*)/i,index_access:/^\[(\d+)\]/,sign:/^[\+\-]/};b.format=function(a,f){var g,h,i,j,k,l,m,n=1,o=a.length,p="",q=[],r=!0,s="";for(h=0;o>h;h++)if(p=c(a[h]),"string"===p)q[q.length]=a[h];else if("array"===p){if(j=a[h],j[2])for(g=f[n],i=0;i<j[2].length;i++){if(!g.hasOwnProperty(j[2][i]))throw new Error(b("[sprintf] property '%s' does not exist",j[2][i]));g=g[j[2][i]]}else g=j[1]?f[j[1]]:f[n++];if("function"==c(g)&&(g=g()),e.not_string.test(j[8])&&e.not_json.test(j[8])&&"number"!=c(g)&&isNaN(g))throw new TypeError(b("[sprintf] expecting number but found %s",c(g)));switch(e.number.test(j[8])&&(r=g>=0),j[8]){case"b":g=g.toString(2);break;case"c":g=String.fromCharCode(g);break;case"d":case"i":g=parseInt(g,10);break;case"j":g=JSON.stringify(g,null,j[6]?parseInt(j[6]):0);break;case"e":g=j[7]?g.toExponential(j[7]):g.toExponential();break;case"f":g=j[7]?parseFloat(g).toFixed(j[7]):parseFloat(g);break;case"g":g=j[7]?parseFloat(g).toPrecision(j[7]):parseFloat(g);break;case"o":g=g.toString(8);break;case"s":g=(g=String(g))&&j[7]?g.substring(0,j[7]):g;break;case"u":g>>>=0;break;case"x":g=g.toString(16);break;case"X":g=g.toString(16).toUpperCase()}e.json.test(j[8])?q[q.length]=g:(!e.number.test(j[8])||r&&!j[3]?s="":(s=r?"+":"-",g=g.toString().replace(e.sign,"")),l=j[4]?"0"===j[4]?"0":j[4].charAt(1):" ",m=j[6]-(s+g).length,k=j[6]&&m>0?d(l,m):"",q[q.length]=j[5]?s+g+k:"0"===l?s+k+g:k+s+g)}return q.join("")},b.cache={},b.parse=function(a){for(var b=a,c=[],d=[],f=0;b;){if(null!==(c=e.text.exec(b)))d[d.length]=c[0];else if(null!==(c=e.modulo.exec(b)))d[d.length]="%";else{if(null===(c=e.placeholder.exec(b)))throw new SyntaxError("[sprintf] unexpected placeholder");if(c[2]){f|=1;var g=[],h=c[2],i=[];if(null===(i=e.key.exec(h)))throw new SyntaxError("[sprintf] failed to parse named argument key");for(g[g.length]=i[1];""!==(h=h.substring(i[0].length));)if(null!==(i=e.key_access.exec(h)))g[g.length]=i[1];else{if(null===(i=e.index_access.exec(h)))throw new SyntaxError("[sprintf] failed to parse named argument key");g[g.length]=i[1]}c[2]=g}else f|=2;if(3===f)throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported");d[d.length]=c}b=b.substring(c[0].length)}return d};var f=function(a,c,d){return d=(c||[]).slice(0),d.splice(0,0,a),b.apply(null,d)};"undefined"!=typeof exports?(exports.sprintf=b,exports.vsprintf=f):(a.sprintf=b,a.vsprintf=f,"function"==typeof define&&define.amd&&define(function(){return{sprintf:b,vsprintf:f}}))}("undefined"==typeof window?this:window);
//# sourceMappingURL=sprintf.min.map<!doctype html>
<html ng-app="app">
<head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-rc.3/angular.min.js"></script>
    <script src="../src/sprintf.js"></script>
    <script src="../src/angular-sprintf.js"></script>
</head>
<body>
    <pre>{{ "%+010d"|sprintf:-123 }}</pre>
    <pre>{{ "%+010d"|vsprintf:[-123] }}</pre>
    <pre>{{ "%+010d"|fmt:-123 }}</pre>
    <pre>{{ "%+010d"|vfmt:[-123] }}</pre>
    <pre>{{ "I've got %2$d apples and %1$d oranges."|fmt:4:2 }}</pre>
    <pre>{{ "I've got %(apples)d apples and %(oranges)d oranges."|fmt:{apples: 2, oranges: 4} }}</pre>

    <script>
        angular.module("app", ["sprintf"])
    </script>
</body>
</html>
Copyright (c) MapBox
All rights reserved.

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.
- Neither the name "MapBox" nor the names of its contributors may 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 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.{
  "name": "sqlite3",
  "description": "Asynchronous, non-blocking SQLite3 bindings",
  "version": "5.1.1",
  "homepage": "https://github.com/TryGhost/node-sqlite3",
  "author": {
    "name": "Mapbox",
    "url": "https://mapbox.com/"
  },
  "binary": {
    "module_name": "node_sqlite3",
    "module_path": "./lib/binding/napi-v{napi_build_version}-{platform}-{libc}-{arch}",
    "host": "https://github.com/TryGhost/node-sqlite3/releases/download/",
    "remote_path": "v{version}",
    "package_name": "napi-v{napi_build_version}-{platform}-{libc}-{arch}.tar.gz",
    "napi_versions": [
      3,
      6
    ]
  },
  "files": [
    "binding.gyp",
    "deps/",
    "lib/*.js",
    "lib/*.d.ts",
    "src/"
  ],
  "repository": {
    "type": "git",
    "url": "https://github.com/TryGhost/node-sqlite3.git"
  },
  "dependencies": {
    "@mapbox/node-pre-gyp": "^1.0.0",
    "node-addon-api": "^4.2.0",
    "tar": "^6.1.11"
  },
  "devDependencies": {
    "eslint": "6.8.0",
    "mocha": "7.2.0",
    "node-pre-gyp-github": "1.4.4"
  },
  "peerDependencies": {
    "node-gyp": "8.x"
  },
  "peerDependenciesMeta": {
    "node-gyp": {
      "optional": true
    }
  },
  "optionalDependencies": {
    "node-gyp": "8.x"
  },
  "license": "BSD-3-Clause",
  "main": "./lib/sqlite3",
  "types": "./lib/sqlite3.d.ts",
  "renovate": {
    "extends": [
      "@tryghost:base"
    ]
  }
}#ifndef NODE_SQLITE3_SRC_ASYNC_H
#define NODE_SQLITE3_SRC_ASYNC_H

#include <napi.h>
#include <uv.h>

#include "threading.h"

// Generic uv_async handler.
template <class Item, class Parent> class Async {
    typedef void (*Callback)(Parent* parent, Item* item);

protected:
    uv_async_t watcher;
    NODE_SQLITE3_MUTEX_t
    std::vector<Item*> data;
    Callback callback;
public:
    Parent* parent;

public:
    Async(Parent* parent_, Callback cb_)
        : callback(cb_), parent(parent_) {
        watcher.data = this;
        NODE_SQLITE3_MUTEX_INIT
        uv_loop_t *loop;
        napi_get_uv_event_loop(parent_->Env(), &loop);
        uv_async_init(loop, &watcher, reinterpret_cast<uv_async_cb>(listener));
    }

    static void listener(uv_async_t* handle) {
        Async* async = static_cast<Async*>(handle->data);
        std::vector<Item*> rows;
        NODE_SQLITE3_MUTEX_LOCK(&async->mutex)
        rows.swap(async->data);
        NODE_SQLITE3_MUTEX_UNLOCK(&async->mutex)
        for (unsigned int i = 0, size = rows.size(); i < size; i++) {
            async->callback(async->parent, rows[i]);
        }
    }

    static void close(uv_handle_t* handle) {
        assert(handle != NULL);
        assert(handle->data != NULL);
        Async* async = static_cast<Async*>(handle->data);
        delete async;
    }

    void finish() {
        // Need to call the listener again to ensure all items have been
        // processed. Is this a bug in uv_async? Feels like uv_close
        // should handle that.
        listener(&watcher);
        uv_close((uv_handle_t*)&watcher, close);
    }

    void add(Item* item) {
        NODE_SQLITE3_MUTEX_LOCK(&mutex);
        data.push_back(item);
        NODE_SQLITE3_MUTEX_UNLOCK(&mutex)
    }

    void send() {
        uv_async_send(&watcher);
    }

    void send(Item* item) {
        add(item);
        send();
    }

    ~Async() {
        NODE_SQLITE3_MUTEX_DESTROY
    }
};

#endif
#ifndef NODE_SQLITE3_SRC_BACKUP_H
#define NODE_SQLITE3_SRC_BACKUP_H

#include "database.h"

#include <string>
#include <queue>
#include <set>

#include <sqlite3.h>
#include <napi.h>

using namespace Napi;

namespace node_sqlite3 {

/**
 *
 * A class for managing an sqlite3_backup object.  For consistency
 * with other node-sqlite3 classes, it maintains an internal queue
 * of calls.
 *
 * Intended usage from node:
 *
 *   var db = new sqlite3.Database('live.db');
 *   var backup = db.backup('backup.db');
 *   ...
 *   // in event loop, move backup forward when we have time.
 *   if (backup.idle) { backup.step(NPAGES); }
 *   if (backup.completed) { ... success ... }
 *   if (backup.failed)    { ... sadness ... }
 *   // do other work in event loop - fine to modify live.db
 *   ...
 *
 * Here is how sqlite's backup api is exposed:
 *
 *   - `sqlite3_backup_init`: This is implemented as
 *     `db.backup(filename, [callback])` or
 *     `db.backup(filename, destDbName, sourceDbName, filenameIsDest, [callback])`.
 *   - `sqlite3_backup_step`: `backup.step(pages, [callback])`.
 *   - `sqlite3_backup_finish`: `backup.finish([callback])`.
 *   - `sqlite3_backup_remaining`: `backup.remaining`.
 *   - `sqlite3_backup_pagecount`: `backup.pageCount`.
 *
 * There are the following read-only properties:
 *
 *   - `backup.completed` is set to `true` when the backup
 *     succeeeds.
 *   - `backup.failed` is set to `true` when the backup
 *     has a fatal error.
 *   - `backup.idle` is set to `true` when no operation
 *     is currently in progress or queued for the backup.
 *   - `backup.remaining` is an integer with the remaining
 *     number of pages after the last call to `backup.step`
 *     (-1 if `step` not yet called).
 *   - `backup.pageCount` is an integer with the total number
 *     of pages measured during the last call to `backup.step`
 *     (-1 if `step` not yet called).
 *
 * There is the following writable property:
 *
 *   - `backup.retryErrors`: an array of sqlite3 error codes
 *     that are treated as non-fatal - meaning, if they occur,
 *     backup.failed is not set, and the backup may continue.
 *     By default, this is `[sqlite3.BUSY, sqlite3.LOCKED]`.
 *
 * The `db.backup(filename, [callback])` shorthand is sufficient
 * for making a backup of a database opened by node-sqlite3.  If
 * using attached or temporary databases, or moving data in the
 * opposite direction, the more complete (but daunting)
 * `db.backup(filename, destDbName, sourceDbName, filenameIsDest, [callback])`
 * signature is provided.
 *
 * A backup will finish automatically when it succeeds or a fatal
 * error occurs, meaning it is not necessary to call `db.finish()`.
 * By default, SQLITE_LOCKED and SQLITE_BUSY errors are not
 * treated as failures, and the backup will continue if they
 * occur.  The set of errors that are tolerated can be controlled
 * by setting `backup.retryErrors`. To disable automatic
 * finishing and stick strictly to sqlite's raw api, set
 * `backup.retryErrors` to `[]`.  In that case, it is necessary
 * to call `backup.finish()`.
 *
 * In the same way as node-sqlite3 databases and statements,
 * backup methods can be called safely without callbacks, due
 * to an internal call queue.  So for example this naive code
 * will correctly back up a db, if there are no errors:
 *
 *   var backup = db.backup('backup.db');
 *   backup.step(-1);
 *   backup.finish();
 *
 */
class Backup : public Napi::ObjectWrap<Backup> {
public:
    static Napi::Object Init(Napi::Env env, Napi::Object exports);

    struct Baton {
        napi_async_work request = NULL;
        Backup* backup;
        Napi::FunctionReference callback;

        Baton(Backup* backup_, Napi::Function cb_) : backup(backup_) {
            backup->Ref();
            callback.Reset(cb_, 1);
        }
        virtual ~Baton() {
            if (request) napi_delete_async_work(backup->Env(), request);
            backup->Unref();
            callback.Reset();
        }
    };

    struct InitializeBaton : Database::Baton {
        Backup* backup;
        std::string filename;
        std::string sourceName;
        std::string destName;
        bool filenameIsDest;
        InitializeBaton(Database* db_, Napi::Function cb_, Backup* backup_) :
            Baton(db_, cb_), backup(backup_), filenameIsDest(true) {
            backup->Ref();
        }
        virtual ~InitializeBaton() {
            backup->Unref();
            if (!db->IsOpen() && db->IsLocked()) {
                // The database handle was closed before the backup could be opened.
                backup->FinishAll();
            }
        }
    };

    struct StepBaton : Baton {
        int pages;
        std::set<int> retryErrorsSet;
        StepBaton(Backup* backup_, Napi::Function cb_, int pages_) :
            Baton(backup_, cb_), pages(pages_) {}
    };

    typedef void (*Work_Callback)(Baton* baton);

    struct Call {
        Call(Work_Callback cb_, Baton* baton_) : callback(cb_), baton(baton_) {};
        Work_Callback callback;
        Baton* baton;
    };

    void init(Database* db_) {
        db = db_;
        _handle = NULL;
        _otherDb = NULL;
        _destDb = NULL;
        inited = false;
        locked = true;
        completed = false;
        failed = false;
        remaining = -1;
        pageCount = -1;
        finished = false;
        db->Ref();
    }

    Backup(const Napi::CallbackInfo& info);

    ~Backup() {
        if (!finished) {
            FinishAll();
        }
        retryErrors.Reset();
    }

    WORK_DEFINITION(Step);
    WORK_DEFINITION(Finish);
    Napi::Value IdleGetter(const Napi::CallbackInfo& info);
    Napi::Value CompletedGetter(const Napi::CallbackInfo& info);
    Napi::Value FailedGetter(const Napi::CallbackInfo& info);
    Napi::Value PageCountGetter(const Napi::CallbackInfo& info);
    Napi::Value RemainingGetter(const Napi::CallbackInfo& info);
    Napi::Value FatalErrorGetter(const Napi::CallbackInfo& info);
    Napi::Value RetryErrorGetter(const Napi::CallbackInfo& info);

    void FatalErrorSetter(const Napi::CallbackInfo& info, const Napi::Value& value);
    void RetryErrorSetter(const Napi::CallbackInfo& info, const Napi::Value& value);

protected:
    static void Work_BeginInitialize(Database::Baton* baton);
    static void Work_Initialize(napi_env env, void* data);
    static void Work_AfterInitialize(napi_env env, napi_status status, void* data);

    void Schedule(Work_Callback callback, Baton* baton);
    void Process();
    void CleanQueue();
    template <class T> static void Error(T* baton);

    void FinishAll();
    void FinishSqlite();
    void GetRetryErrors(std::set<int>& retryErrorsSet);

    Database* db;

    sqlite3_backup* _handle;
    sqlite3* _otherDb;
    sqlite3* _destDb;
    int status;
    std::string message;

    bool inited;
    bool locked;
    bool completed;
    bool failed;
    int remaining;
    int pageCount;
    bool finished;
    std::queue<Call*> queue;

    Napi::Reference<Array> retryErrors;
};

}

#endif

#ifndef NODE_SQLITE3_SRC_DATABASE_H
#define NODE_SQLITE3_SRC_DATABASE_H


#include <assert.h>
#include <string>
#include <queue>

#include <sqlite3.h>
#include <napi.h>

#include "async.h"

using namespace Napi;

namespace node_sqlite3 {

class Database;


class Database : public Napi::ObjectWrap<Database> {
public:
#if NAPI_VERSION < 6
    static Napi::FunctionReference constructor;
#endif
    static Napi::Object Init(Napi::Env env, Napi::Object exports);

    static inline bool HasInstance(Napi::Value val) {
        Napi::Env env = val.Env();
        Napi::HandleScope scope(env);
        if (!val.IsObject()) return false;
        Napi::Object obj = val.As<Napi::Object>();
#if NAPI_VERSION < 6
        return obj.InstanceOf(constructor.Value());
#else
        Napi::FunctionReference* constructor =
            env.GetInstanceData<Napi::FunctionReference>();
        return obj.InstanceOf(constructor->Value());
#endif
    }

    struct Baton {
        napi_async_work request = NULL;
        Database* db;
        Napi::FunctionReference callback;
        int status;
        std::string message;

        Baton(Database* db_, Napi::Function cb_) :
                db(db_), status(SQLITE_OK) {
            db->Ref();
            if (!cb_.IsUndefined() && cb_.IsFunction()) {
                callback.Reset(cb_, 1);
            }
        }
        virtual ~Baton() {
            if (request) napi_delete_async_work(db->Env(), request);
            db->Unref();
            callback.Reset();
        }
    };

    struct OpenBaton : Baton {
        std::string filename;
        int mode;
        OpenBaton(Database* db_, Napi::Function cb_, const char* filename_, int mode_) :
            Baton(db_, cb_), filename(filename_), mode(mode_) {}
    };

    struct ExecBaton : Baton {
        std::string sql;
        ExecBaton(Database* db_, Napi::Function cb_, const char* sql_) :
            Baton(db_, cb_), sql(sql_) {}
    };

    struct LoadExtensionBaton : Baton {
        std::string filename;
        LoadExtensionBaton(Database* db_, Napi::Function cb_, const char* filename_) :
            Baton(db_, cb_), filename(filename_) {}
    };

    struct LimitBaton : Baton {
        int id;
        int value;
        LimitBaton(Database* db_, Napi::Function cb_, int id_, int value_) :
            Baton(db_, cb_), id(id_), value(value_) {}
    };

    typedef void (*Work_Callback)(Baton* baton);

    struct Call {
        Call(Work_Callback cb_, Baton* baton_, bool exclusive_ = false) :
            callback(cb_), exclusive(exclusive_), baton(baton_) {};
        Work_Callback callback;
        bool exclusive;
        Baton* baton;
    };

    struct ProfileInfo {
        std::string sql;
        sqlite3_int64 nsecs;
    };

    struct UpdateInfo {
        int type;
        std::string database;
        std::string table;
        sqlite3_int64 rowid;
    };

    bool IsOpen() { return open; }
    bool IsLocked() { return locked; }

    typedef Async<std::string, Database> AsyncTrace;
    typedef Async<ProfileInfo, Database> AsyncProfile;
    typedef Async<UpdateInfo, Database> AsyncUpdate;

    friend class Statement;
    friend class Backup;

    void init() {
        _handle = NULL;
        open = false;
        closing = false;
        locked = false;
        pending = 0;
        serialize = false;
        debug_trace = NULL;
        debug_profile = NULL;
        update_event = NULL;
    }

    Database(const Napi::CallbackInfo& info);

    ~Database() {
        RemoveCallbacks();
        sqlite3_close(_handle);
        _handle = NULL;
        open = false;
    }

protected:
    static void Work_BeginOpen(Baton* baton);
    static void Work_Open(napi_env env, void* data);
    static void Work_AfterOpen(napi_env env, napi_status status, void* data);

    Napi::Value OpenGetter(const Napi::CallbackInfo& info);

    void Schedule(Work_Callback callback, Baton* baton, bool exclusive = false);
    void Process();

    Napi::Value Exec(const Napi::CallbackInfo& info);
    static void Work_BeginExec(Baton* baton);
    static void Work_Exec(napi_env env, void* data);
    static void Work_AfterExec(napi_env env, napi_status status, void* data);

    Napi::Value Wait(const Napi::CallbackInfo& info);
    static void Work_Wait(Baton* baton);

    Napi::Value Close(const Napi::CallbackInfo& info);
    static void Work_BeginClose(Baton* baton);
    static void Work_Close(napi_env env, void* data);
    static void Work_AfterClose(napi_env env, napi_status status, void* data);

    Napi::Value LoadExtension(const Napi::CallbackInfo& info);
    static void Work_BeginLoadExtension(Baton* baton);
    static void Work_LoadExtension(napi_env env, void* data);
    static void Work_AfterLoadExtension(napi_env env, napi_status status, void* data);

    Napi::Value Serialize(const Napi::CallbackInfo& info);
    Napi::Value Parallelize(const Napi::CallbackInfo& info);

    Napi::Value Configure(const Napi::CallbackInfo& info);

    Napi::Value Interrupt(const Napi::CallbackInfo& info);

    static void SetBusyTimeout(Baton* baton);
    static void SetLimit(Baton* baton);

    static void RegisterTraceCallback(Baton* baton);
    static void TraceCallback(void* db, const char* sql);
    static void TraceCallback(Database* db, std::string* sql);

    static void RegisterProfileCallback(Baton* baton);
    static void ProfileCallback(void* db, const char* sql, sqlite3_uint64 nsecs);
    static void ProfileCallback(Database* db, ProfileInfo* info);

    static void RegisterUpdateCallback(Baton* baton);
    static void UpdateCallback(void* db, int type, const char* database, const char* table, sqlite3_int64 rowid);
    static void UpdateCallback(Database* db, UpdateInfo* info);

    void RemoveCallbacks();

protected:
    sqlite3* _handle;

    bool open;
    bool closing;
    bool locked;
    unsigned int pending;

    bool serialize;

    std::queue<Call*> queue;

    AsyncTrace* debug_trace;
    AsyncProfile* debug_profile;
    AsyncUpdate* update_event;
};

}

#endif
// http://web.archive.org/web/20140401031018/http://rjpower9000.wordpress.com:80/2012/04/09/fun-with-shared-libraries-version-glibc_2-14-not-found/

#if defined(__linux__)

#define _GNU_SOURCE
#include <features.h>
#undef _GNU_SOURCE

#if defined(__USE_GNU)

#if defined(__x86_64__)
__asm__(".symver memcpy,memcpy@GLIBC_2.2.5");
__asm__(".symver exp,exp@GLIBC_2.2.5");
__asm__(".symver log,log@GLIBC_2.2.5");
__asm__(".symver pow,pow@GLIBC_2.2.5");
__asm__(".symver fcntl64,fcntl@GLIBC_2.2.5");
#endif

#if defined(__aarch64__) || defined(_M_ARM64)
__asm__(".symver memcpy,memcpy@GLIBC_2.17");
__asm__(".symver exp,exp@GLIBC_2.17");
__asm__(".symver log,log@GLIBC_2.17");
__asm__(".symver pow,pow@GLIBC_2.17");
__asm__(".symver fcntl64,fcntl@GLIBC_2.17");
#endif

#endif
#endif
#ifndef NODE_SQLITE3_SRC_MACROS_H
#define NODE_SQLITE3_SRC_MACROS_H

const char* sqlite_code_string(int code);
const char* sqlite_authorizer_string(int type);
#include <vector>

// TODO: better way to work around StringConcat?
#include <napi.h>
inline Napi::String StringConcat(Napi::Value str1, Napi::Value str2) {
  return Napi::String::New(str1.Env(), str1.As<Napi::String>().Utf8Value() +
                    str2.As<Napi::String>().Utf8Value() );
}

// A Napi substitute IsInt32()
inline bool OtherIsInt(Napi::Number source) {
    double orig_val = source.DoubleValue();
    double int_val = (double)source.Int32Value();
    if (orig_val == int_val) {
        return true;
    } else {
        return false;
    }
}

#define REQUIRE_ARGUMENTS(n)                                                   \
    if (info.Length() < (n)) {                                                 \
        Napi::TypeError::New(env, "Expected " #n "arguments").ThrowAsJavaScriptException(); \
        return env.Null(); \
    }


#define REQUIRE_ARGUMENT_EXTERNAL(i, var)                                      \
    if (info.Length() <= (i) || !info[i].IsExternal()) {                       \
        Napi::TypeError::New(env, "Argument " #i " invalid").ThrowAsJavaScriptException(); \
        return env.Null(); \
    }                                                                          \
    Napi::External var = info[i].As<Napi::External>();


#define REQUIRE_ARGUMENT_FUNCTION(i, var)                                      \
    if (info.Length() <= (i) || !info[i].IsFunction()) {                        \
        Napi::TypeError::New(env, "Argument " #i " must be a function").ThrowAsJavaScriptException(); \
        return env.Null(); \
    }                                                                          \
    Napi::Function var = info[i].As<Napi::Function>();


#define REQUIRE_ARGUMENT_STRING(i, var)                                        \
    if (info.Length() <= (i) || !info[i].IsString()) {                         \
        Napi::TypeError::New(env, "Argument " #i " must be a string").ThrowAsJavaScriptException(); \
        return env.Null(); \
    }                                                                          \
    std::string var = info[i].As<Napi::String>();

#define REQUIRE_ARGUMENT_INTEGER(i, var)                                        \
    if (info.Length() <= (i) || !info[i].IsNumber()) {                        \
        Napi::TypeError::New(env, "Argument " #i " must be an integer").ThrowAsJavaScriptException(); \
        return env.Null();        \
    }                                                                          \
    int var(info[i].As<Napi::Number>().Int32Value());

#define OPTIONAL_ARGUMENT_FUNCTION(i, var)                                     \
    Napi::Function var;                                                        \
    if (info.Length() > i && !info[i].IsUndefined()) {                         \
        if (!info[i].IsFunction()) {                                           \
            Napi::TypeError::New(env, "Argument " #i " must be a function").ThrowAsJavaScriptException(); \
            return env.Null(); \
        }                                                                      \
        var = info[i].As<Napi::Function>();                                    \
    }


#define OPTIONAL_ARGUMENT_INTEGER(i, var, default)                             \
    int var;                                                                   \
    if (info.Length() <= (i)) {                                                \
        var = (default);                                                       \
    }                                                                          \
    else if (info[i].IsNumber()) {                                             \
        if (OtherIsInt(info[i].As<Number>())) {                                \
            var = info[i].As<Napi::Number>().Int32Value();                     \
        }                                                                      \
    }                                                                          \
    else {                                                                     \
        Napi::TypeError::New(env, "Argument " #i " must be an integer").ThrowAsJavaScriptException(); \
        return env.Null(); \
    }


#define DEFINE_CONSTANT_INTEGER(target, constant, name)                        \
    Napi::PropertyDescriptor::Value(#name, Napi::Number::New(env, constant),   \
        static_cast<napi_property_attributes>(napi_enumerable | napi_configurable)),

#define DEFINE_CONSTANT_STRING(target, constant, name)                         \
    Napi::PropertyDescriptor::Value(#name, Napi::String::New(env, constant),   \
        static_cast<napi_property_attributes>(napi_enumerable | napi_configurable)),

#define EXCEPTION(msg, errno, name)                                            \
    Napi::Value name = Napi::Error::New(env,                                   \
        StringConcat(                                                          \
            StringConcat(                                                      \
                Napi::String::New(env, sqlite_code_string(errno)),             \
                Napi::String::New(env, ": ")                                   \
            ),                                                                 \
            (msg)                                                              \
        ).Utf8Value()                                                          \
    ).Value();                                                                 \
    Napi::Object name ##_obj = name.As<Napi::Object>();                        \
    (name ##_obj).Set( Napi::String::New(env, "errno"), Napi::Number::New(env, errno)); \
    (name ##_obj).Set( Napi::String::New(env, "code"),                         \
        Napi::String::New(env, sqlite_code_string(errno)));


#define EMIT_EVENT(obj, argc, argv)                                            \
    TRY_CATCH_CALL((obj),                                                      \
        (obj).Get("emit").As<Napi::Function>(),\
        argc, argv                                                             \
    );

// The Mac OS compiler complains when argv is NULL unless we
// first assign it to a locally defined variable.
#define TRY_CATCH_CALL(context, callback, argc, argv, ...)                     \
    Napi::Value* passed_argv = argv;\
    std::vector<napi_value> args;\
    if ((argc != 0) && (passed_argv != NULL)) {\
      args.assign(passed_argv, passed_argv + argc);\
    }\
    Napi::Value res = (callback).Call(Napi::Value(context), args);             \
    if (res.IsEmpty()) return __VA_ARGS__;

#define WORK_DEFINITION(name)                                                  \
    Napi::Value name(const Napi::CallbackInfo& info);                          \
    static void Work_Begin##name(Baton* baton);                                \
    static void Work_##name(napi_env env, void* data);                         \
    static void Work_After##name(napi_env env, napi_status status, void* data);

#define STATEMENT_BEGIN(type)                                                  \
    assert(baton);                                                             \
    assert(baton->stmt);                                                       \
    assert(!baton->stmt->locked);                                              \
    assert(!baton->stmt->finalized);                                           \
    assert(baton->stmt->prepared);                                             \
    baton->stmt->locked = true;                                                \
    baton->stmt->db->pending++;                                                \
    Napi::Env env = baton->stmt->Env();                                        \
    int status = napi_create_async_work(                                       \
        env, NULL, Napi::String::New(env, "sqlite3.Statement."#type),          \
        Work_##type, Work_After##type, baton, &baton->request                  \
    );                                                                         \
    assert(status == 0);                                                       \
    napi_queue_async_work(env, baton->request);

#define STATEMENT_INIT(type)                                                   \
    type* baton = static_cast<type*>(data);                                    \
    Statement* stmt = baton->stmt;

#define STATEMENT_MUTEX(name) \
    if (!stmt->db->_handle) { \
        stmt->status = SQLITE_MISUSE; \
        stmt->message = "Database handle is closed"; \
        return; \
    } \
    sqlite3_mutex* name = sqlite3_db_mutex(stmt->db->_handle);

#define STATEMENT_END()                                                        \
    assert(stmt->locked);                                                      \
    assert(stmt->db->pending);                                                 \
    stmt->locked = false;                                                      \
    stmt->db->pending--;                                                       \
    stmt->Process();                                                           \
    stmt->db->Process();

#define BACKUP_BEGIN(type)                                                     \
    assert(baton);                                                             \
    assert(baton->backup);                                                     \
    assert(!baton->backup->locked);                                            \
    assert(!baton->backup->finished);                                          \
    assert(baton->backup->inited);                                             \
    baton->backup->locked = true;                                              \
    baton->backup->db->pending++;                                              \
    Napi::Env env = baton->backup->Env();                                      \
    int status = napi_create_async_work(                                       \
        env, NULL, Napi::String::New(env, "sqlite3.Backup."#type),             \
        Work_##type, Work_After##type, baton, &baton->request                  \
    );                                                                         \
    assert(status == 0);                                                       \
    napi_queue_async_work(env, baton->request);

#define BACKUP_INIT(type)                                                      \
    type* baton = static_cast<type*>(data);                                    \
    Backup* backup = baton->backup;

#define BACKUP_END()                                                           \
    assert(backup->locked);                                                    \
    assert(backup->db->pending);                                               \
    backup->locked = false;                                                    \
    backup->db->pending--;                                                     \
    backup->Process();                                                         \
    backup->db->Process();

#define DELETE_FIELD(field)                                                    \
    if (field != NULL) {                                                       \
        switch ((field)->type) {                                               \
            case SQLITE_INTEGER: delete (Values::Integer*)(field); break;      \
            case SQLITE_FLOAT:   delete (Values::Float*)(field); break;        \
            case SQLITE_TEXT:    delete (Values::Text*)(field); break;         \
            case SQLITE_BLOB:    delete (Values::Blob*)(field); break;         \
            case SQLITE_NULL:    delete (Values::Null*)(field); break;         \
        }                                                                      \
    }

#endif
#ifndef NODE_SQLITE3_SRC_STATEMENT_H
#define NODE_SQLITE3_SRC_STATEMENT_H

#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
#include <vector>

#include <sqlite3.h>
#include <napi.h>
#include <uv.h>

#include "database.h"
#include "threading.h"

using namespace Napi;

namespace node_sqlite3 {

namespace Values {
    struct Field {
        inline Field(unsigned short _index, unsigned short _type = SQLITE_NULL) :
            type(_type), index(_index) {}
        inline Field(const char* _name, unsigned short _type = SQLITE_NULL) :
            type(_type), index(0), name(_name) {}

        unsigned short type;
        unsigned short index;
        std::string name;
    };

    struct Integer : Field {
        template <class T> inline Integer(T _name, int64_t val) :
            Field(_name, SQLITE_INTEGER), value(val) {}
        int64_t value;
    };

    struct Float : Field {
        template <class T> inline Float(T _name, double val) :
            Field(_name, SQLITE_FLOAT), value(val) {}
        double value;
    };

    struct Text : Field {
        template <class T> inline Text(T _name, size_t len, const char* val) :
            Field(_name, SQLITE_TEXT), value(val, len) {}
        std::string value;
    };

    struct Blob : Field {
        template <class T> inline Blob(T _name, size_t len, const void* val) :
                Field(_name, SQLITE_BLOB), length(len) {
            value = (char*)malloc(len);
            memcpy(value, val, len);
        }
        inline ~Blob() {
            free(value);
        }
        int length;
        char* value;
    };

    typedef Field Null;
}

typedef std::vector<Values::Field*> Row;
typedef std::vector<Row*> Rows;
typedef Row Parameters;



class Statement : public Napi::ObjectWrap<Statement> {
public:
    static Napi::Object Init(Napi::Env env, Napi::Object exports);
    static Napi::Value New(const Napi::CallbackInfo& info);

    struct Baton {
        napi_async_work request = NULL;
        Statement* stmt;
        Napi::FunctionReference callback;
        Parameters parameters;

        Baton(Statement* stmt_, Napi::Function cb_) : stmt(stmt_) {
            stmt->Ref();
            callback.Reset(cb_, 1);
        }
        virtual ~Baton() {
            for (size_t i = 0; i < parameters.size(); i++) {
                Values::Field* field = parameters[i];
                DELETE_FIELD(field);
            }
            if (request) napi_delete_async_work(stmt->Env(), request);
            stmt->Unref();
            callback.Reset();
        }
    };

    struct RowBaton : Baton {
        RowBaton(Statement* stmt_, Napi::Function cb_) :
            Baton(stmt_, cb_) {}
        Row row;
    };

    struct RunBaton : Baton {
        RunBaton(Statement* stmt_, Napi::Function cb_) :
            Baton(stmt_, cb_), inserted_id(0), changes(0) {}
        sqlite3_int64 inserted_id;
        int changes;
    };

    struct RowsBaton : Baton {
        RowsBaton(Statement* stmt_, Napi::Function cb_) :
            Baton(stmt_, cb_) {}
        Rows rows;
    };

    struct Async;

    struct EachBaton : Baton {
        Napi::FunctionReference completed;
        Async* async; // Isn't deleted when the baton is deleted.

        EachBaton(Statement* stmt_, Napi::Function cb_) :
            Baton(stmt_, cb_) {}
        virtual ~EachBaton() {
            completed.Reset();
        }
    };

    struct PrepareBaton : Database::Baton {
        Statement* stmt;
        std::string sql;
        PrepareBaton(Database* db_, Napi::Function cb_, Statement* stmt_) :
            Baton(db_, cb_), stmt(stmt_) {
            stmt->Ref();
        }
        virtual ~PrepareBaton() {
            stmt->Unref();
            if (!db->IsOpen() && db->IsLocked()) {
                // The database handle was closed before the statement could be
                // prepared.
                stmt->Finalize_();
            }
        }
    };

    typedef void (*Work_Callback)(Baton* baton);

    struct Call {
        Call(Work_Callback cb_, Baton* baton_) : callback(cb_), baton(baton_) {};
        Work_Callback callback;
        Baton* baton;
    };

    struct Async {
        uv_async_t watcher;
        Statement* stmt;
        Rows data;
        NODE_SQLITE3_MUTEX_t;
        bool completed;
        int retrieved;

        // Store the callbacks here because we don't have
        // access to the baton in the async callback.
        Napi::FunctionReference item_cb;
        Napi::FunctionReference completed_cb;

        Async(Statement* st, uv_async_cb async_cb) :
                stmt(st), completed(false), retrieved(0) {
            watcher.data = this;
            NODE_SQLITE3_MUTEX_INIT
            stmt->Ref();
            uv_loop_t *loop;
            napi_get_uv_event_loop(stmt->Env(), &loop);
            uv_async_init(loop, &watcher, async_cb);
        }

        ~Async() {
            stmt->Unref();
            item_cb.Reset();
            completed_cb.Reset();
            NODE_SQLITE3_MUTEX_DESTROY
        }
    };

    void init(Database* db_) {
        db = db_;
        _handle = NULL;
        status = SQLITE_OK;
        prepared = false;
        locked = true;
        finalized = false;
        db->Ref();
    }

    Statement(const Napi::CallbackInfo& info);

    ~Statement() {
        if (!finalized) Finalize_();
    }

    WORK_DEFINITION(Bind);
    WORK_DEFINITION(Get);
    WORK_DEFINITION(Run);
    WORK_DEFINITION(All);
    WORK_DEFINITION(Each);
    WORK_DEFINITION(Reset);

    Napi::Value Finalize_(const Napi::CallbackInfo& info);

protected:
    static void Work_BeginPrepare(Database::Baton* baton);
    static void Work_Prepare(napi_env env, void* data);
    static void Work_AfterPrepare(napi_env env, napi_status status, void* data);

    static void AsyncEach(uv_async_t* handle);
    static void CloseCallback(uv_handle_t* handle);

    static void Finalize_(Baton* baton);
    void Finalize_();

    template <class T> inline Values::Field* BindParameter(const Napi::Value source, T pos);
    template <class T> T* Bind(const Napi::CallbackInfo& info, int start = 0, int end = -1);
    bool Bind(const Parameters &parameters);

    static void GetRow(Row* row, sqlite3_stmt* stmt);
    static Napi::Value RowToJS(Napi::Env env, Row* row);
    void Schedule(Work_Callback callback, Baton* baton);
    void Process();
    void CleanQueue();
    template <class T> static void Error(T* baton);

protected:
    Database* db;

    sqlite3_stmt* _handle;
    int status;
    std::string message;

    bool prepared;
    bool locked;
    bool finalized;
    std::queue<Call*> queue;
};

}

#endif
#ifndef NODE_SQLITE3_SRC_THREADING_H
#define NODE_SQLITE3_SRC_THREADING_H

#define NODE_SQLITE3_MUTEX_t uv_mutex_t mutex;
#define NODE_SQLITE3_MUTEX_INIT uv_mutex_init(&mutex);
#define NODE_SQLITE3_MUTEX_LOCK(m) uv_mutex_lock(m);
#define NODE_SQLITE3_MUTEX_UNLOCK(m) uv_mutex_unlock(m);
#define NODE_SQLITE3_MUTEX_DESTROY uv_mutex_destroy(&mutex);

#endif // NODE_SQLITE3_SRC_THREADING_H
const binary = require('@mapbox/node-pre-gyp');
const path = require('path');
const binding_path = binary.find(path.resolve(path.join(__dirname,'../package.json')));
const binding = require(binding_path);
module.exports = exports = binding;
const path = require('path');
const sqlite3 = require('./sqlite3-binding.js');
const EventEmitter = require('events').EventEmitter;
module.exports = exports = sqlite3;

function normalizeMethod (fn) {
    return function (sql) {
        let errBack;
        const args = Array.prototype.slice.call(arguments, 1);

        if (typeof args[args.length - 1] === 'function') {
            const callback = args[args.length - 1];
            errBack = function(err) {
                if (err) {
                    callback(err);
                }
            };
        }
        const statement = new Statement(this, sql, errBack);
        return fn.call(this, statement, args);
    };
}

function inherits(target, source) {
    for (const k in source.prototype)
        target.prototype[k] = source.prototype[k];
}

sqlite3.cached = {
    Database: function(file, a, b) {
        if (file === '' || file === ':memory:') {
            // Don't cache special databases.
            return new Database(file, a, b);
        }

        let db;
        file = path.resolve(file);

        if (!sqlite3.cached.objects[file]) {
            db = sqlite3.cached.objects[file] = new Database(file, a, b);
        }
        else {
            // Make sure the callback is called.
            db = sqlite3.cached.objects[file];
            const callback = (typeof a === 'number') ? b : a;
            if (typeof callback === 'function') {
                function cb() { callback.call(db, null); }
                if (db.open) process.nextTick(cb);
                else db.once('open', cb);
            }
        }

        return db;
    },
    objects: {}
};


const Database = sqlite3.Database;
const Statement = sqlite3.Statement;
const Backup = sqlite3.Backup;

inherits(Database, EventEmitter);
inherits(Statement, EventEmitter);
inherits(Backup, EventEmitter);

// Database#prepare(sql, [bind1, bind2, ...], [callback])
Database.prototype.prepare = normalizeMethod(function(statement, params) {
    return params.length
        ? statement.bind.apply(statement, params)
        : statement;
});

// Database#run(sql, [bind1, bind2, ...], [callback])
Database.prototype.run = normalizeMethod(function(statement, params) {
    statement.run.apply(statement, params).finalize();
    return this;
});

// Database#get(sql, [bind1, bind2, ...], [callback])
Database.prototype.get = normalizeMethod(function(statement, params) {
    statement.get.apply(statement, params).finalize();
    return this;
});

// Database#all(sql, [bind1, bind2, ...], [callback])
Database.prototype.all = normalizeMethod(function(statement, params) {
    statement.all.apply(statement, params).finalize();
    return this;
});

// Database#each(sql, [bind1, bind2, ...], [callback], [complete])
Database.prototype.each = normalizeMethod(function(statement, params) {
    statement.each.apply(statement, params).finalize();
    return this;
});

Database.prototype.map = normalizeMethod(function(statement, params) {
    statement.map.apply(statement, params).finalize();
    return this;
});

// Database#backup(filename, [callback])
// Database#backup(filename, destName, sourceName, filenameIsDest, [callback])
Database.prototype.backup = function() {
    let backup;
    if (arguments.length <= 2) {
        // By default, we write the main database out to the main database of the named file.
        // This is the most likely use of the backup api.
        backup = new Backup(this, arguments[0], 'main', 'main', true, arguments[1]);
    } else {
        // Otherwise, give the user full control over the sqlite3_backup_init arguments.
        backup = new Backup(this, arguments[0], arguments[1], arguments[2], arguments[3], arguments[4]);
    }
    // Per the sqlite docs, exclude the following errors as non-fatal by default.
    backup.retryErrors = [sqlite3.BUSY, sqlite3.LOCKED];
    return backup;
};

Statement.prototype.map = function() {
    const params = Array.prototype.slice.call(arguments);
    const callback = params.pop();
    params.push(function(err, rows) {
        if (err) return callback(err);
        const result = {};
        if (rows.length) {
            const keys = Object.keys(rows[0]);
            const key = keys[0];
            if (keys.length > 2) {
                // Value is an object
                for (let i = 0; i < rows.length; i++) {
                    result[rows[i][key]] = rows[i];
                }
            } else {
                const value = keys[1];
                // Value is a plain value
                for (let i = 0; i < rows.length; i++) {
                    result[rows[i][key]] = rows[i][value];
                }
            }
        }
        callback(err, result);
    });
    return this.all.apply(this, params);
};

let isVerbose = false;

const supportedEvents = [ 'trace', 'profile', 'change' ];

Database.prototype.addListener = Database.prototype.on = function(type) {
    const val = EventEmitter.prototype.addListener.apply(this, arguments);
    if (supportedEvents.indexOf(type) >= 0) {
        this.configure(type, true);
    }
    return val;
};

Database.prototype.removeListener = function(type) {
    const val = EventEmitter.prototype.removeListener.apply(this, arguments);
    if (supportedEvents.indexOf(type) >= 0 && !this._events[type]) {
        this.configure(type, false);
    }
    return val;
};

Database.prototype.removeAllListeners = function(type) {
    const val = EventEmitter.prototype.removeAllListeners.apply(this, arguments);
    if (supportedEvents.indexOf(type) >= 0) {
        this.configure(type, false);
    }
    return val;
};

// Save the stack trace over EIO callbacks.
sqlite3.verbose = function() {
    if (!isVerbose) {
        const trace = require('./trace');
        [
            'prepare',
            'get',
            'run',
            'all',
            'each',
            'map',
            'close',
            'exec'
        ].forEach(function (name) {
            trace.extendTrace(Database.prototype, name);
        });
        [
            'bind',
            'get',
            'run',
            'all',
            'each',
            'map',
            'reset',
            'finalize',
        ].forEach(function (name) {
            trace.extendTrace(Statement.prototype, name);
        });
        isVerbose = true;
    }

    return sqlite3;
};
// Inspired by https://github.com/tlrobinson/long-stack-traces
const util = require('util');

function extendTrace(object, property, pos) {
    const old = object[property];
    object[property] = function() {
        const error = new Error();
        const name = object.constructor.name + '#' + property + '(' +
            Array.prototype.slice.call(arguments).map(function(el) {
                return util.inspect(el, false, 0);
            }).join(', ') + ')';

        if (typeof pos === 'undefined') pos = -1;
        if (pos < 0) pos += arguments.length;
        const cb = arguments[pos];
        if (typeof arguments[pos] === 'function') {
            arguments[pos] = function replacement() {
                const err = arguments[0];
                if (err && err.stack && !err.__augmented) {
                    err.stack = filter(err).join('\n');
                    err.stack += '\n--> in ' + name;
                    err.stack += '\n' + filter(error).slice(1).join('\n');
                    err.__augmented = true;
                }
                return cb.apply(this, arguments);
            };
        }
        return old.apply(this, arguments);
    };
}
exports.extendTrace = extendTrace;


function filter(error) {
    return error.stack.split('\n').filter(function(line) {
        return line.indexOf(__filename) < 0;
    });
}
MZ                @                                       	!L!This program cannot be run in DOS mode.
$       弞弞X䎞X/X䞞<䳞<䫞<䛞X俞弞r1亞1彞1佞Rich                PE  L j+#c         !!   J     Z                                       @                           0 (    P                    `     p                            @               , @                   .text                           `.rdata  [    \               @  @.data   <     .                @  .rsrc      P     (             @  @.reloc     `     *             @  B                                                                                                                                                                                                                                                                                                                                h=Ỹ|$u"D$hpz u
P  3 ̋IL%E̡0AVtVЃPj j j j j ~ ^  D$V*tjVF ^ j j j j j ?~ A`% **Ujhmd    P 3PEd    ME    %hx%T VN$r(FA   rP#+w@QPE F     F$   F Ft~ uP6<F    ^E} Ujhd    P4 3ŉEVWPEd    }EP6,=   эM  E    p  Mr(UA   rP#+wlQRE EE    E   E t} uPu<    G    EGǋMd    Y_^M3eD ] J| Ujhd    P4 3ŉEVWPEd    }EP6<   эM  E    p  Mr(UA   rP#+wlQRD EE    E   E t} uPu<    G    EGǋMd    Y_^M3eC ] J{ QVD$P6$=t6D$     @    @ @<&@    @     @$   ^Y t$L$6#  D$^Y Ujh݊d    P4 3ŉEVPEd    F   MQP6=   MX  E      Mr(UA   rP#+wWQRB EE    E   E t} uPu<3Md    Y^M3B ]ËEy Ujhd    P0 3ŉEVPEd    F   MQP6<   Mh  E    
  Mr(UA   rP#+wWQRA EE    E   E t} uPu<2Md    Y^M3A ]ÊEx Ujhd    P4 3ŉEVWPEd    EPuW<   ׍M  E    !  Mr(UA   rP#+wjQR@ EE    E   E t} uPu<    F    E>FƋMd    Y_^M3@ ]w Ujh݊d    P4 3ŉEVPEd    EPv6<txM  E    '  Mr(UA   rP#+wWQR? EE    E   E t} uPu<2EǋMd    Y^M3/? ]w Ujh݊d    P0 3ŉEVWPEd    (EP$WL=   ׍M  E    9  Mr(UA   rP#+wjQR> EE    E   E t} uPu<    F    Eĉ>FƋMd    Y_^M3.> ]v Ujh݊d    P4 3ŉEVPEd    EPv6 =txM
  E    G  Mr(UA   rP#+wWQR= EE    E   E t} uPu<3EċMd    Y^M3O= ]6u Ujhed    P8 3ŉESVWPEd    UuH׍M	  E    r  M   UA   rzP#+   dʍYAuE+PQRW<   ׍Mb	  E     Mr(UA   rP#+wpQR< EE E   E    t} uPu<    F    E>FƋMd    Y_^[M3; ]s s Ujh݊d    P0 3ŉEVWPEd    EMQuPW<   ׍M[  E      Mr(UA   rP#+wjQR; EE    E   E t} uPu<    F    Eĉ>FƋMd    Y_^M3: ]r S܃Ukl$jhd    PSX 3ŉEVWPEd    u{EPj j v}6<   M?  E      MЃr,UA   rP#+8  QRt: EE    E   E t} uPu<G    G        G    G         E    E    UE E   MMA;v E MuP]  MUE    MuMECEԈ:Q;w$MuCuj VIR E uQE uQM9_  EMj PCMQv6<   M  E}  MЃr,UA   rP#+   QR9 EE    E   E t} uPu<MG    G        G    G    rOUA   rP#+w]QR8 %E    G    G    ~EfGǋMd    Y_^M3	8 ][ o o o Ujh݊d    P0 3ŉEVWPEd    EMċ}QPv6=   эMW  E    	  Mr(UA   rP#+wlQR7 EE    E   E t} uPu<    G    EĉGǋMd    Y_^M36 ] n Ujh݊d    P0 3ŉEVWPEd    }EPuv6<   эMX  E      Mr(UA   rP#+wlQR6 EE    E   E t} uPu<    G    EĉGǋMd    Y_^M35 ] m Ujhd    P0 3ŉEVPEd    EPjv6=txMc  E      Mr(UA   rP#+wXQR5 EE    E   E t} uPu<2Md    Y^M35 ] l Ujhd    P8 3ŉEVPEd    EMQpv6<txM  E    !  Mr(UA   rP#+wYQR4 EE    E   E t} uPu<2EËMd    Y^M3)4 ] l Ujh݊d    P4 3ŉEVPEd    EPv6P=txM   E    7  Mr(UA   rP#+wWQR3 EE    E   E t} uPu<3EċMd    Y^M3?3 ]&k ̃4SUVWD$D$    PV<  D$ D$PVD$(<  8D$tD$PV$=z     D$ %EЋʍYAuD$+PQRV<O  D$,w"& $& D$Pt$j V<D$Pt$j V<  l$_G<&7    G G    G     G$      SjUVD=   D$PV(=   GD$ D$ Pjt$ D$0    VD$8    D$<    D$@    l$DD$H   D$L    =uySjt$ VD=us_^][4ú%%{   %%l   %%]   &%N   (&%?   l&&0   &&!   &&   f$ $     jRjQ<̃$SUl$4VF    ^W|$8F<&>F F    F     F$      SjUWD=t|D$8PW(=uuFD$D$Pjt$@D$     WD$(    D$,    D$0    l$4D$8   D$<    =u0Sjt$@WD=u*_^][$ l&&&&&&Ujh=d    PL 3ŉEVWPEd    Ouu
N  URQPX=tOэM/E      MC  UA   '  P#+    EPuQ=tOME   m  M   UA      P#+)     }   wME [EPuu7 =}    wM,EPuu7<   эME      Mr(UA   rP#+wQRI. EE    E   E t} uPu<    F    EEFƋMd    Y_^M3- ] e ~e ye Ujh}d    PV 3PEd    QčM  E    ~ tEPq@P6=u#uuH=uMd    Y^]ú&&&'VFt~ uP6<F    ^Ujhd    P4 3ŉESVWPEd    EN4]VQREč~FFPWu   S^    F0           F8=tMVME    xM   UA      P#+   ;   3ɺ   Q+ F0Fj j PWuS8=tuVMIE   Mr(UA   rP#+w[QR+ EE E   E    t} uPu<ƋMd    Y_^[M3* ] b b ̋A0tP* YUUA$;Qs AD$$PEP] D$PL$;PEP] UQIuuL$L$E] EP] Ujhd    P0 3ŉEVPEd    ENQP<ttME    VMr(UA   rP#+wTQR) ME    E   E t} uQu<ƋMd    Y^M3c) ] Ha q1H=t&'OUjhd    PX 3ŉEVWPEd    EMEEMMPE    EMEEMMPVPEMuQ  EE؃}uCE؋UPMr,UA   rP#+   QR( ME    E   E r(UA   rP#+wiQR[( ME    E   E r(UA   rP#+w'QR( ǋMd    Y_^M3' ]_ UjhEd    PH 3ŉESVPEd    uMV:ME    {tMnt2   EMEEPVME    =t}֍MEE Mr,UA   rP#+   QR' EE    E   E t} uPu<3MčEP5  PMuuH=u"ËMd    Y^[M3^& ]E^ &'eUjhd    PQVW 3PEd    uE)F    FF    F    F E    F    F    F,    F0   F HE5  MtMuQEPNx7  ƋMd    Y_^] Ujhd    PVW 3PEd    F)tPFp<=N26  N7  N0r(FA   rP#+wPQPA% F,    F0   F Ft~ uPv<F    Md    Y_^]\ VD$tj4V$ ^ h$'\3 Ujhd    PVW 3PEd    G *tPGp<=O"5  O6  Gt uPw<G    Md    Y_^]VhD$tjV$ ^ UjhЍd    PV 3PEd    E    N4*4  Fx ux tN4)  N|r,FhA   rP#+   QP# Fx    F|   Fh Ndr,FPA   rP#+   QP9# F`    Fd   FP NLr(F8A   rP#+wMQP" FH    FL   F8 Eth   V" ƋMd    Y^] [Z VN.  D$tj$V" ^ Ujhd    PVW 3PEd    E    ~L *ur(  Nd4  Fht~l uPvd<Fh    NP-  N<r(F(A   rP#+wKQP! F8    F<   F( 7  EtjpV! ƋMd    Y_^] >Y +-  Ujh d    P4   3ŉEVPEd    uE    ǅR ǅ    ǅ    8'ǅ     7  ǅY ǅ    ǅ    @'ǅ     R7  j(o  ( ǅ    ǅ    ǅ] ǅ    ǅ    ǅH' j(ǅІ ǅ    @ǅ    ~f@ Wfǅ    0@ ( ǅ    ǅ    ǅ@^ ǅ    ǅ    ǅP' j(ǅІ ǅ    @ǅ    ~f@ Wfǅ    P` ( ǅ    ǅ    ǅp^ ǅ    ǅ    ǅ\' j(ǅІ ǅ    @ǅ    ~f@ Wfǅ    pE ( ǅ    ǅ    ǅ^ ǅ    ǅ    ǅd' j(ǅІ ǅ    @ǅ    ~f@ Wfǅ    EEX ( ǅ    ǅ    ǅ^ ǅ    ǅ    ǅp' j(ǅІ ǅ    @ǅ    ~f@ Wfǅ    EE Wǅ    ǅ    ǅ _ ,ǅ    ǅ0_ ǅ|' ǅІ ǅ    @ǅ ~f@ WfPǅ    EjuEF  MPh'
3  EMNH=uƋMd    Y^M3_ ]ú&'kUjh]d    PQSVW 3PEd    ~L t~` t7  Md    Y_^[]À~@ te~A u_^`tXV\NXI#ȋFT<}CE    F`uF\F\wЃEjW ~@ uMd    Y_^[]QV~L t8js L$D$D$L$HD$PNP%  c   ^Y ~@ t~A u~` ut$T$^Y j L$D$D$L$HD$PNPP%  ^Y Ujhӎd    P    3ŉESVWPEd    ى]{CWHEXE    C`{@ Ev  8 m  h'׍M׋@Mph%E@׋ph0MVSp0MQQu`up0Eȃxr5<pQM,  xEPMpEM쉝\Xr,UA   rP#+  QR EE    E   E t} uPu<E    E Măr,UA   rP#+  QR@ h'׉]xuX`p0PM0  h'׍xi`p0h0OMP0  U2EPTE  ]K\sXN#CT44tEu	C\    C\FEMEQH#&  {@    }    M   E    E    E    EXtMPPPH  xPK%  ]SPE`M+QPuMRu<]  }   MEEtLE+       rH#+  RQg E    E    E    MtjjVE 6 C`S`E8E1  \Xh'׍xwE    E    E    @hlptExtMPhPG  MxPc$  Mh'pEP@`P@$  I}URWHE+PQVS<   ӍMEjM"xUMEJMMt0U+у   rH#++  RQ MtjjV    } u=   M+σ   rx#+ǃ   QWw       M+σ   r׋x#+ǃ   {` {`tNfS\ʋCXsTH#ȋ44u	C\    C\NtjtjV ? uLHH=u+Md    Y_^[M3t ][K VK QK &'qS܃Ukl$jh֏d    PS    3ŉEVWPEd    |}CTEG    G    G E    M)GpQȉuTMQj @h WPV<5<tsUMeE
E Mr,UA   rP#+	  QR EE    E   E tW} uQPuFEpEtƅx pEPO   ttx uPpփE   *G(    G8    G<   G( EwPuj    F    F    F    F     @    0Gd    Gh    Gl EMEQppV0=   MQMEEMr,UA   rP#+h  QR< EE    E   E t} uPu<3Eu]5<֍Mj1h'g$  MEM  UA     P#+  m  EHM  j MQsp0  }  MEjPF/p  }	  MEjP  }  MEjPf  9E   MPEP  }   MEjPtwMEjPxt]5<֍Mjh("  MEM7  UA     P#+n    }Lj Pp09$  EEjPjpEhPlMjx `EPdjH XEM\MPE(E    E    H E    EuuẺEtE    E    E    EMMPEH EẺMMPE(E    E    E    E    }E    EE    tPE̋EE+H EẺMMPEE(E    E    E    EEtE    EE    E    EPEH EẺMMP8EE(E    E    E    EEtE    EE    E    EPESH EẺMMP|EGHG    G    G     G@   GDGHGL   h   t EjtEPvMp0uEp8 *x4    F    F    HP    |A    A    Hh    MA    A    EH4ƀ     EEPhP"  Mr,UA   rP#+  QR EP`|P  Mr,UA   rP#+  QRf EPX0MP  Mr,UA   rP#+_  QR MMj QhN    MX    5<֍Mjht(V  MEM  UA   u  P#+  \  5<֍Mj"hP(  MEM4  UA     P#+     5<֍Mjh0(  MEMM   UA      P#+,     5<֍Mjh(?  ME
Mr~UA   rfP#+   P5<֍Mjh (  ME	Mr,UA   rP#+   QR1	 EE    E   E t} uPu<ǋMd    Y_^M3 ][ @ @ ~@ y@ t@ o@ j@ e@ `@ [@ V@ Q@ UL$S]VWh(C@sv{WShP hO pj V<7V<_^[]U$ 3ĉD$ SVuWF~4@Xt
SH~LN8r	j Wj[ G$uL8   tGW@D$GD$GP~dNPr	~|Fhr Qt$PRų G    tGG@$ G    PN D$    D$(    D$(    qfD  Au+QRL$,  D$PO(_  L$(r)T$A   rP#+wBQR O3S6 G    G     t
SPL$,_^[3z ]a> Ujh%d    Pp 3ŉESVWPEd    ]]E    M{4GPEE$ tU   ~  ,  EG@PK  }   M  EPMrE    E    E    EEuMPEP7  EPO  uPEM+ƍMQVPuRu<t UM"EM} u6tM+΃   rp#+ƃ   QVJ MEt,M+΃   rp#+ƃwZQV GGA H|OK  uuH=u)jMd    Y_^[M3 ]i< &'Ujhd    PP 3ŉESVWPEd    E]}p}{ u  j EP:#  j EPH MME{EE       jEP   jEPtg5<֍Mjh):  E   MEM;  UA     P#+j    jEPMp E3j$ }E   EEE *G    GuG    G    G HE  QEPO  EwE*Guj    F     ME @@f@V7  MWhPU uVg5<֍Mjh(  E    QRa EE E   E    t} uPu<WM蕽ǋMd    Y_^[M3 ] 9 UL$S]VWh0)C@AC@@sv;{WSh`W hU pj V<7V<_^[]U$ 3ĉD$ SVW}wFtwP NF$A FDA$FHN$,  dt1t%-  ts"tL4D$    D$$    D$(    AD$Au+L$QRL$%  D$PN(  L$(r-T$A   rP#+   QR~    vjGЋHy u~$9y}Iы	y tz uN$;J|;u3FtP轶 F    Nt3/ F    F     L$,_^[3 ]7 UjhՐd    Pp 3ŉESVWPEd    ]]E    M{GPE&EG$e   GBEPKF  } Q  MD@  EPM迺$eMUPE    E    E    @MEEEuMPEP0  EPO  uPEM+ƍMQVPuRu<t;UMKEM訸! uGC]  p} u6tM+΃   rp#+ƃ   QVX MEt,M+΃   rp#+ƃwZQV" GGA HOE  uuH=u)jMd    Y_^[M3 ]w5 &'Ujh'd    PH 3ŉESVWPEd    E]}p}{ uE       j EPC,   j EP'   5<֍MjhD)  ME    >EMr,UA   rP#+   QR EE    E   E t} uPu<WM   j EPjp E3j; }E   EEE *G    GuG    G    G HE  QEPO  MWh[ ELuVAƋMd    Y_^[M3 ] }3 UL$S]VWhd)C@AC@@sv{WSh0\ h[ pj V<7V<_^[]̋D$VpFtP˱ F    Nt3* F    F     ^Ujhud    P` 3ŉESVWPEd    }}E    MwvZE   EPO	  } tM腷urE    E    E    EEPNK	  ]MMQj j upS<tӍMEM:#} tEFFA HNA  uuH=u$jMd    Y_^[M3 ]ú&'UQV~B u
~C uFCFLFtP  F    Nt3( F    NF     
  ^]Uy@ tyA u
y` $t$ Q$4$߷PEP] UABQ$P觷PEP] UACQ$PwPEP] UfnADQ$#PEP] UfnAHQ$PEP] U$dP  PEP] Ujhd    P\ 3ŉESVWPEd    E}ϋp裵   5<֍Mjh|)4  ME    Mr,UA   rP#+   QRu EE    E   E    }    Pu   u_?Nd	  ~d   FhPjSWD=tuVdME   5Măr(UA   rP#+wYQR EE    E   E t} uPu<Md    Y_^[M3B ] '. ". Ujhd    P<SVW 3PEd    Eu{ u(D  wV  ǋ?jP  tEM[QHd[F      M3ۉE   SEPM谾M訲   MEM܍M؉EK΍E}PEP')  ~ @fEĀx u;x}V~tk>uE    jE    1 EME    HPuȉ8uĉxxf@  )  C;]CMd    Y_^[] G̋	tj̋tjP SVWFNuA9FwQ  NI!F~~#ȋF    < ujN NFD$ F_^[ VFtfD  FuF    W~tFOtjP uF_t*N   rP#+w/QP jPF    F         ^f+ VW7v~ u!vW%  Ƌ6jP ~ tj7{ _^Vt@N+ȃ   rP#+w"QPB     F    F    ^* VNr'A   rP#+wQP F    F    ^w* VW|$;taNr'A   rP#+wEQP F    F    ~GfFG    G    _^ ) Ujhd    P4 3ŉEVWPEd    F}   P6<tvM|E    Mr(UA   rP#+wQR EE    E   E t} uPu<F    ƋONON    G    G Md    Y_^M3  ] ( Ujhd    P4 3ŉEVWPEd    Ouu
N   URQPX=   эM[E    Mr(UA   rP#+wlQR EE    E   E t} uPu<    F    EFƋMd    Y_^M3 ] ' Ujh݊d    P4 3ŉEVPEd    EPv6<txMeE    Mr(UA   rP#+wWQR EE    E   E t} uPu<3EċMd    Y^M3 ]& Ujh݊d    P4 3ŉEVPEd    EPv6<txM腻E    'Mr(UA   rP#+wWQR EE    E   E t} uPu<3EċMd    Y^M3/ ]& Ujh݊d    P0 3ŉEVWPEd    u   V   OQjRPD=ttM莺E    0Mr(UA   rP#+wSQR EE    E   E t} uPu<Md    Y_^M3> ] #% Ujhd    P, 3ŉEVPEd    F   P6<tvM谹E    RMr(UA   rP#+wYQR EE    E   E t} uPu<F    Md    Y^M3X ]?$ Ujhed    P@ 3ŉESVWPEd    uEM]QuuPW<   ׍M豸E    SMr,UA   rP#+   QR EE    E   E t} uPu<    F    F F<&F    F     F$   F iEPuj WӃtK׍ME   蕽MjUA   NP#+w39uWƋMd    Y_^[M3 ]" " Ujhd    P0 3ŉEPEd    EPuu<tyUM&E    ȼMr(UA   rP#+wVQR_ EE    E   E t} uPu<3EċMd    YM3 ]! Ujhd    PVW 3PEd    ~ )t(EPNEt~ tj PvT=Ft~ uPv<F    Md    Y_^] ̃ VWj D$0D$    t$ D$    ~D$f@WfD$D$ D$D$$D$    D$    D$G_^ Ujhd    P, 3ŉEVPEd    EMpQv6=txME    豺Mr(UA   rP#+wXQRH EE    E   E t} uPu<2Md    Y^M3 ]  Ujhd    P0 3ŉEVPEd    Epuv64=txM E    ¹Mr(UA   rP#+wXQRY EE    E   E t} uPu<2Md    Y^M3 ]  Ujhd    P< 3ŉEVWPEd    EMuP  @PVw74=txME    Mr(UA   rP#+wYQRX EE    E   E t} uPu<2Md    Y_^M3 ]  Ujh3d    P    3ŉESVWPEd    ى]s4`vV;E    C4Ex<H(rH(p8QMdh%֍|MxI$_  P֍XѧMWSp0߻MQQuhup0Eȃxr5<pQMupEPMߴX8EM]r,UA   rP#+]  QR EE    E   E t} uPu<E    E Măr,UA   rP#+  QR; h'։}p]蜦]hfnC$p0蛤PMh'֍p`K$p0У  P֍hBMPMEPw} -  Mu  E}EE    E    E    EEuMPEP7  pPKu}PEh+ƍMQVPuRW<t׍M蝯EBM} uVt0M+΋ƃ   rp#+ƃ  QV d`H=Z  4  tڋM+΋ƃ   rp#+ƃ:  h'֍pޤǅx    ǅ|    E    @EEM}EEEuxPEP  pPKh'KxEPXhP蹩xURVH|+PQWS<tӍM3EسM萛} uMMMd    Y_^[M3 ] &' Ujh3d    P    3ŉESVWPEd    ى]s`vV{E    CEx<H(rH(p8QM褤h%֍|2MxI$蟠  P֍XMWSp0MQQuhup07Eȃxr5<pQMpEPMX8EM]r,UA   rP#+]  QR EE    E   E t} uPu<E    E Măr,UA   rP#+  QR{ h'։}p]ܡ]hfnC$p0۟PMRh'֍p蠡K$p0  P֍h股MPMEP} -  M赛  E}EE    E    E    EEuMPEPw  pPKXu}PEh+ƍMQVPuRW<t׍MݪE肰M:} uVt0M+΋ƃ   rp#+ƃ  QV d`H=Z  4  tڋM+΋ƃ   rp#+ƃ:  h'֍pǅx    ǅ|    E    @EEM}EEEuxPEP2  pPKh'KxEPXhPxURVH|+PQWS<tӍMsEMЖ} uMMMd    Y_^[M3Q ]8 &'X$ SVt$ـ~ u&W|$vWƋ6jPJ ~ t_^[ QT$SW_+É\$;   UoVD$;v&   #P    X#CC+;v;BN   rA#;   봅tQn 3ۋD$GD$@wPr?7VS M   rV#+Fw8QVP ^]_[Y WSv ^]_[Y ͔ SW|$ف   C   sWt${S"  _[ UVv%   #Q tfh#E0   ;BF=   r	H#;v;˅tPO 3Wt$+U{s / ^]_[ < QT$SٹUk+;!  V*D$W{|$;v&   #P    x#GC+;v;BN   rA#;   봅tQ~ 3D$CD$ s4/ƃ|$D$UrW3VW t$,/j P D$(L$A     rV#+FwKQV> ;_^][Y SWd t$,j V D$(  É;_^][Y 訒 VD$tjV ^ SV   t$VE+ڃrs+;I  UW~|$=?8  =   r'H#;#  Q9   h#EtP 3F    v<*T$+VQWV >t$|$D$V;w4    QRP. +ǋ|$PD$,j P Wj U{ 3<    WRP v7+t$VPU W.j PJ t$8F$t*N   rP#+w!QPi ^_n]^[    ̃S\$UVt$W    G    G    NSkL$T$
D$ F+;w\;nwW~FfGF    F    r7{rBPSP T$,W_^][ +;w^BP~CfGC    C    SP ~r6L$QVS T$,W_^][ +;   l$ v/   #Q ȃ   A#HL$2   ;BE=   r	H#;vktP L$3T$ Wo~D$$r6QVP {rD$@PD$(D$SP _^][ W h) Ujhd    PP 3ŉEVWPEd    MuQVMu  E    E    3  u}MĐFGFF=p    NUVQPjh'RMU<u PPh u6u<   UME試M9  UA     P#+T    =  uYNUVQPjh'RMU<   PPh u6u<   MF    F    E @ E;učEPuVj h` jh'u=    UME躥MJ  UA   .  P#+j    UMȟEmM   UA      P#+"     3tSu~ t>p tUFMP  j j h  vuu<u<G ;}ruEEFM7	  ƋMd    Y_^M3/ ]ËUME蔤Mr(UA   rP#+wZQR+ EE E   E    t} uPu<u    F    T	 	 	 	 Ujh͓d    PVW 3PEd    uQčM0}E    VPjuuH=uMd    Y_^]ú&'S܃Ukl$jhd    PSTV 3PEd    sMsE    MuԋFEԍEPp0M(fsQMQf~f~ЋpEЉM؅t	PZ ƋMd    Y^][S܃Ukl$jhd    PSTV 3PEd    sMsXE    MuԋF EԍEP\p0"M(fsQMQf~f~ЋpEЉM؅t	P ƋMd    Y^][S܃Ukl$jh-d    PSXVW 3PEd    sMs藢E    M}̋G E̍EP蛤p0aGMEEj PMPE(fsf~Pf~ȍ1ЋEȅt	P 3Md    Y_^][Ujh]d    P$ 3ŉEVWPEd    MEP膓E    E؃}MuCE؋PfMr(UA   rP#+w2QRZ MЋǋUԉWMd    Y_^M3 ] SUVt$W|$׋k+֋+;  ?^  D$?+D$;v
D$?D$;BD$t?   rQ#+ʍA  UQ     C    C    D$=?   ,       r'E#;   P!    H#AtU 3ɉ)KC;t[D  F;u_^]K[ C+;v;;t@ FIA;uK;tB;u_^]K[ ;tFIA;u_^]S[   6 0̋	T$AB    Jx u)L$V19p}@3
B    Jx t^   SUl$C         C    VWtqwr   r"G#;vcP t[p#FCtW C3>։U l$Uj V3 s_^][ }   ̋T$SUW|$C+W;u} ǉ}}G_][ |$ uz;Uu}
:;U u} Oǀy   V@ Pr;   Ny    r;u7Jy uAJN;AuqJ;u1qrHAHIA HQ2N
Ny uQJN;QuqV   J;QuqV   1V   y uBAHIA HA   2;u:NNy uAJN;AuqJ;Auq1FrHAHIA HQrJy uQJN;QuqJ;u1qrHy ^E@_][ ̋AtjPe Vt@N+ȃ   rP#+w"QP"     F    F    ^  h) Ujhd    P| 3ŉEVWPEd    }EuPWV0=u9Euh)PV@=3zWVx觛jpE    = ExEQE EP|<tEE F EPxmEt	P EMd    Y_^M3 ]À} t|MEEPDEtjME Mr(UA   rP#+wFQR EE    E   E ?} uPu<E      Ujhd    P8 3PEd    uMu=E    MAEEPЋEt	P 3Md    Y]Ujh-d    PLV 3PEd    uMu̙E    M܋AE܍EPEPЃpE؉Mt	P7 ƋMd    Y^]Ujh-d    PLV 3PEd    uMuLE    M܋AE܍EPEPЃpE؉Mt	P ƋMd    Y^]Ujh]d    P@V 3PEd    uMu̘E    Muj FEEPnPEPFЋEt	P3 3Md    Y^]Ujhd    P, 3ŉEVPEd    E@     H unj j hД pRV<g  ֍MaE    M  UA      P#+7      ukj j hД pRV<   ֍ME   荖M   UA      P#+   oxІ tx    j j h pRV<tt֍MnE   Mr(UA   rP#+wZQR EE    E   E t} uPu<Md    Y^M3 ]   jt$9 S܃Ukl$jhݕd    PSDV 3PEd    sMsE    MuFEEPp0M(fsQf~f~ЋEt	Pf 3Md    Y^][jt$i j(t$Y jt$I Ujhd    P0 3ŉEVPEd    EMQpv6l=txME    !Mr(UA   rP#+wYQR EE    E   E t} uPu<2EǋMd    Y^M3) ]  Ujh݊d    P4 3ŉEVPEd    EPv6=tyM蕍E    7Mr(UA   rP#+wZQR EE    E   E t} uPu<WEMd    Y^M3< ]# UMM$$fnf.Dz]2]UQVuut$u脙EF4EF8t,^] VNHr(F4A   rP#+w=QP贿 FD    FH   F4 ԙD$tjPV艿 ^ ( VNHr(F4A   rP#+w=QPD FD    FH   F4 dD$tjLV ^  V8D$tj<V ^ UjhЍd    PV 3PEd    E    h,\  N3 N$F    F <EtjDV{ ƋMd    Y^] Ujh+d    P   3ŉEVWPEd    tul蟓E    ǅ ǅ    ǅ    ,*ǅ     qǅ  ǅ    ǅ    4*ǅ     -ǅ ǅ    ǅ    <*ǅ     ǅ  ǅ    ǅ    D*ǅ     ǅ ǅ    (ǅ    T*ǅ     aǅ  ǅ    Hǅ    `*ǅ     ǅ  ǅ    hǅ    l*ǅ     ǅ ǅ    ǅ    ǅ    x*M j(赻 ( xEEȀ E    E    E    EE     ǅ*EǅІ ǅ    @ǅ    ~Ef@ WfPǅ    Ej	uE]  j |    F    F xu3   QjPVD=   ֍MWEE Mr,UA   rP#+k  QR苺 EE    E   E t} uPu<E    33ƅ Ej h P0x@ E u=tzUM}E"E Mr,UA   rP#+   QR豹 EE    E   E t} uPu<xPh*MtpEMlNH=u'ƋMd    Y_^M3 ]  &'Ujhd    P    3ŉESVWPEd    ى|{CW@EEE    { x  {   {4   h*׍M{׋@MMh%Ez`׋ph0zMVSp0؎MQQuhup0躎|Eȃxr5<pQMntEPM؇pEM쉝PTr,UA   rP#+  QR薷 EE    E   E t} uPu<E    E Măr,UA   rP#+  QR+ h'׉]tuyXhp0wPMh'׍tTyhp0h0:yMPH2|LES4  K0s,N#C(44uBC4uC0C0FEMEQHMs   Ms   E    E    E    EPuMPHPtPKdSPEhM+QPuMRu<|  d   MEEtLE+       rH#+  RQY E    E    E    MtjjVE ( S48U_  Th'׍tuwE    E    E    @\PX`dEhuMPXP}MtP^Mh'pEPEhP>G|}URWHE+PQVS<   ӍMÀEhM n   UM蠀EEMmMt0U+у   rH#+[  RQͳ MtjjV赳 D@H=!     } u.tԋM+σ   rx#+ǃ   QW뢅tM+σ   rx#+ǃ   Ѐ{ t
{ n{4cS0K,I#ȋC(4~ t
{ 9GC4uC0C0uE	FCvЃ{ jVE 謲 { oMd    Y_^[M3? ]& ! &'A Ujh6d    P    3ŉESVWPEd    EXw]EGV]E菇E    O  8Ov  h*֍MUt֋@Mth%E5tP֋xh0tMWSp0)MQQu`up0AvEȃxr5<pQMhEPM)X8EM]r,UA   rP#+  QR EE    E   E t} uPu<E    E Mr,UA   rP#+  QR腰 h'։}h]rX`p0pPM`h'֍hr`p0h0rMP]EPKɾtjMl  Ml  E}Eǅ|    E    E    EEu|PEPqMhPR|M}QPE+VPuRW<t׍M{E聁M9i} u=  M+΃   rp#+ƃ  QV  O  G  M+΃   r׋p#+ƃ]  h'֍h2qǅp    ǅt    ǅx    @EEM}EEEupPEPCMhP$Mh'pEPPP	vpURWHt+PQVS<tӍMzE1Mg} u@4  x+σ   rx#+ǃL  QW譭       x+σ   rԋx#+ǃ  뾄t) Mu	u8O t wOMSу   j ؀} ]u
  u2Mw$CECFNuA9FwQ N  NI!F~~#ȋFM< uj薬 NUʋFF\XH=u-Md    Y_^[M35 ]    &'0{S܃Ukl$jh×d    PS    3ŉEVWPEd    }}CLEG    G    G E    )GHMMQMQj @h WPu<   UMxE}E Mr,UA   rP#+  QRL EE    E   E tX} uPuġ<ЃE    ;EEEEE EEPO诸Et} uPu<ЃE   w$h,|j    F    F    F    F    i @    0EEG    fG  G G    G  G8    G<    G@    x pp  j MQ%gS  MDj PH EEMMPnEEE   xrhjMQ~fuOMEjP~p0Ht0MxjP~E   H MME&kEE  EME    ǅ|    9Hr?QPQ?~(fu!MPQMP ~H |EEj PQ}MǅX(ǅ\    @ǅ`    ǅd    XlEǅh    Eǅp    ǅt    hPE}H EẺMMPgrfnEMЋiMǅX*ǅ\    @ǅ`    ǅd    XlPǅh    Eǅp    ǅt    hPEP}H EẺMMPqjP趧 uEE|}uCEWE7EN4p,    }A    A    BEBu+URWjEMFLEvh*viMyWQhp h pj V<7V<Mr,UA   rP#+   QR }ǋMd    Y_^M3蜦 ][ 5<֍Mjh*;MExMr(UA   rP#+wMQR胦 EE    E   E k} aPu<O   U 3ĉD$SVW}HO4_r	j wLS Gs   V4 D$    D$     D$     qfAu+QRL$D$PO߲L$ r-T$A   rP#+   QRp K3 C    _^[L$3 ]ËFt
PHFǆ  0  ǆ      ǆ      t
PPL$$_ǆ    ^[3詤 ] UjhKd    P    3ŉESVWPEd    ]]E    LCpxVE}uzE{   {rS֍\f֋@MMh%EfMxI d  P֍DfpWSp0zMQQudup0zhEȃxr5<pQM3EEPMsX8EM]r,UA   rP#+x  QRg EE    E   E t} uPu<E    EMr,UA   rP#+  QR h'։}M]`e]dfnCp0_cPMֺh'֍M'eKp0b  P֍d	eMP荻Ex}!EM@EP]u@x|KEPM_P  M_?  ǅl    ǅp    ǅt    EEulPxPEP襰l]Ppd+ǍMQWPu<RSЃtӍM#nEsM[} uYt3t+σ   rx#+ǃm  QWH PLH=7    E  t+    ǁ   rx#+ǃ  QWq  Ex y  h'֍M@cE    E    E    @T|Xx\`EduMPTPBEP'h'xpPDdMP
h]HEU+ÍURUSP<QWRЃt UMlE'rMY} u5M+˃   rX#+Ã  QSYEt7E+    Á   rX#+Ã  QSj Ex h*֍MaE    E    E    @MEEEuMPEPMEPѭh'ppPDdMP諭f}URWHE+PQVS<tӍM4kE	pMX} u7@M+σ    x#+ǃ   MJM+σ   x#+ǃwHMjMd    Y_^[M3距 ] &'l   UAQ$Pg\PEP] Ujhd    PH 3ŉESVWPEd    M}]E     wu   j EP(rZ   j EPrY   5<֍MjhD)uME    #oEMr,UA   rP#+   QR诜 EE    E   E t} uPu<SMWZj EPTqp E3j4% EVuuVE   ujPhP ESgqËMd    Y_^[M3辛 ]  US]VWC@KC9  CL$h*@sv6^{WSh h pj V<7V<_^[]U  3ĉD$VW}3ҋwN G   v D$    D$     D$     qD  Au+QRL$D$PO?L$ rAT$A   rP#+w3QRԚ _^L$3聚 ]F    L$$_^3i ]P Ujh.d    P    3ŉESVWPEd    }xE    L_sCV|EuoEKC    r?W֍d\֋@MMh%Ef\MxIY  P֍DE\pWSp0PpMQQuTup02ph^Eȃxr5<pQMEEPMSixEM}r,UA   rP#+  QR EE    E   E t} uPu<E    EMr,UA   rP#+-  QR诘 h'։]M}[}TfnGp0YPM艰h'֍MZOp0JX  P֍TZMP@E]|EC PMSu@MEOEPȦMTQ  MT@  ǅl    ǅp    ǅt    EExlPEP|MEP`l]PpT+ǍMQWPu<RSЃtӍMcEiM;Q} uYt3t+σ   rx#+ǃ  QW PLH=_  0  E  t+    ǁ   rx#+ǃ-  QWl  { j  h'֍MXE    E    E    @\M`EdhElxMP\PMEPh'xpPDTMP]]HEU+ÍURUSP<QWRЃt UMBbEgMO} u5M+˃   rX#+Ã  QS^Et7E+    Á   rX#+Ã  QS* |{ h,*֍MWE    E    E    @\M`EdhEdxMP\PEPKmh'ppPDTPKGP\}]SWHE+ǉUPQVR<|t UM`E	kfM#N} u7M+σ   x#+ǃ   M+σ   x#+ǃwHMjMd    Y_^[M3J ]1 &'Qb   Ujh}d    P| 3ŉESVWPEd    M]q3ɋ}uE    E    9K   QEPgO   j EPgO   5<֍MjhD)>ME    dEMr,UA   rP#+0  QRx EE    E   E t} uPu<WMM   j EPgH EM3ɋuF EF    MNuE    E    E    xE   PgMQj j upu<t$UM6^EcMEK} tEF EsWfǋMd    Y_^[M3 ]  Ujh}d    P| 3ŉESVWPEd    M]q3ɋ}uE    E    9K   QEPeM   j EPeM   5<֍MjhD)ME    bEMr,UA   rP#+0  QRX EE    E   E t} uPu<WMK   j EPdH EM3ɋuF EF     MLuE    E    E    xE   PdMQj j upu<t$UM\EaMEoI} tEF ESWdǋMd    Y_^[M3 ]  Ul$pjh8d    P4 3ŉElSVWPEd    }ԋ]|w֋ExE{]u se5<MDjh+<E    MD`EMh  UTA   d  P#+  K  h$+MPPj EP>ct,j4 Ej j WE   g`   h,+֍MPPj EPbt,j4蹍 Ej j WE   Lg   h4+֍M1PPj EPbY   jEPtb]Jt&5<֍MDjh@+E   j4 Ej j WE   fEjEPbȋEAMENF   h\+֍MkOPj EPa_  {s&5<֍MDjhd+.E   jEPakIt&5<֍MDjhx+E   jEPCa,Iti5<֍MDjh+谟E   oQR EHEd    Eh   ET H  }L >  PuD<,  jEP`H MME^MjEP`PMMU<Mj<g EVWj E   ȋ}j WU  Rh+֍MMPj EP<`tUj4 Ej j WE	   d EE  u VPuVA`F  h+֍M]MMxEj P_MQWSpM0TaOE
   zrʍy@ Au5<+QR֍MME\E
M@r,U,A   rP#+   QR5 E E<    E@   E, t}$ uPu<E     EMr(UA   rP#+wIQRˉ E    E   E uM VEƋMd    Y_^[Ml3M ep] 1 Ujhud    PX 3ŉEVWPEd    y Qu}U   5<Mjh+蛜ME    I[EMăr,UA   rP#+*  QRՈ EE    E   E    }    Pu<MVD   y    5<Mjh+ME   ZEMr,UA   rP#+   QR' EE    E   E t} uPu<E    VMTCAVǀ(     ]ƋMd    Y_^M3u ] Z U Ujhd    PV 3PEd    uuE    Fvpr jMd    Y^]̋T$VWBr4J8xw3x/X;~ȉLxʋj_^Ã}
   DȉLxj_^Ujhݚd    PQSVW 3PEd    ]]E    {8    h   j uǆ       Ftǆ       ǆ       Pǆ       6t=EPw\=h Vu|=w8wFt
PHFF^@ǆ       thPP\wFt
PHFF^ ǆ       ǆ       t
PPw8Vd%  h Vh=G8    jMd    Y_^[]Ujhd    PQSVW 3PEd    j' uUE        F    F    yAu+QREEux8_tSd=      ;At0A
URP+  S`=Wx=Md    Y_^[]Ujhed    Px 3ŉESVWPEd    }]}E    MsVYh$+EMF@EǉMrP֍MFE    E    E    @MEEEuMPEPٵEPK轒h'KpEP|UP蝒K]}WSHE+ÉUPQVR<}tUMPEUM|=t0Mċ+˃   rX#+Ã   QSO uuH=uptKOr'A   rP#+wDQP	 jWG    G     Md    Y_^[M3菂 ]v &'QUjhݚd    PQSVW 3PEd    ]]E    {<    h   : uǆ       Ftǆ       ǆ       Pǆ   P    6t=EPw\=h Vu|=w<wNtQHNF^$ǆ        F^thQP\wFt
PHf^Fǆ       ǆ       t
PPw<V.!  h Vh=G<    jMd    Y_^[]̃  3ĉD$S\$(VW|$4j  σF    QF    F    F    F        F    F   D$    D$     D$$        Au+QWL$蜥D$PL$$r)T$A   rP#+wsQRu D$8L$<FN{<t$_tSd=      ;At0AT$RPX&  S`=Wx=L$0_^[3  豷 Ujhd    P    3ŉESVWPEd    }]}E    MsV6Uh,+EMB@E܋ǉM؃rP֍MA@MEWO׭ ^(֍M(?E    E    E    @MEEEuMPEPEPKύh'Kp|PtUP謍F]}WSHE+ÉUPQVR<}tUM.KEPM8t0M+˃   rX#+Ã   QS^~ uuH=ulOr'A   rP#+wDQP~ j WG    G     ~ Md    Y_^[M3} ]艵 &'LUjhݚd    PQSVW 3PEd    ]]E    {@    h   J} uǆ       Ftǆ       ǆ       Pǆ       6t=EPw\=h Vu|=w@wFt
PHFǆ       tdPPXwFt
PHFǆ       ǆ       t
PPw@VL  h Vh=G@    jMd    Y_^[]U$ 3ĉD$ ES]VWD$Ej@D$| L$EуF    F    F    F    F    F     F$    F(    F,    F0    F4    F8    F<    F    F    F   F    F,    F0   BD$    D$$    D$(    D$Bu+T$RQL$WD$PN蚈L$(r-T$A   rP#+   QR+{ D$    D$$    D$(    z    Bu+׍L$RSܟD$PNL$(r)T$A   rP#+wuQRz |$EMF8N<@t$_tSd=      ;At0AT$RP   S`=Wx=L$4_^[3z ] Ul$pjhd    P$ 3ŉElSVWPEd    ]|Ex]E    ME0VoOh+EML<@MDEH	tt% 1D1(1P֍M	<{} @EPǉMLrP֍M;@EXCMT{0rCP֍M;@E`E|M\P<H8蟧 (ЍM9E    E    E    @MdEhEEluMPEDP軪MEP蟇Mh'pEPEЉUP肇@U}WRH EE+PQVuV<} t֍MEEJM_2Ut0M+ʃ   rP#+   QR/x uuH=   K0r,CA   rP#+   QPw C,    C0   C Or'A   rP#+wGQPw j@u|G    G    w Md    Y_^[Ml3'w ep] &'-FUjhdd    Pd 3ŉESVWPEd    E}p]u C  j EPK3&  j EPKH EEMMP;E   E       jEPKm3  jEPhKQ3   5<֍Mjh)щMEHEMr,UA   rP#+  QRv EE    E   E t} uPu<SME1Mă  UA   rP#+  QRu v  jEP{Jp E3jLLu EEM}VCMuuMVNEEM d,4E     @    @    BEBu+URQMjEuhP S>JMă   UA   )P#+   5<֍Mjh, ME    FEMr(UA   rP#+wiQR^t EE    E   E t} uPu<SM/ËMd    Y_^[M3s ] 讫 詫 褫 UL$S]VWh,,C@svE6{WSh  h pj V<7V<_^[]U  3ĉD$VW}HG4D$    r L$Qj j PGp_ G   t$   D$    D$    D$     QAu+QVL$D$PO7L$ r-T$A   rP#+   QRr = tTpKt
PHV$)xIIVpKt%PP_^L$3)r ]VL$$_^3r ] Ujhd    P    3ŉESVWPEd    ]]E    LCpxVhH}uqGEEPK血{   {rS֍|.4֋@M`h%E4MxI{1  P֍D3MWSp0GMQQuTup0G6Eȃxr5<pQM葄lEPM@X8EM]r,UA   rP#+  QRp EE    E   E t} uPu<E    EMr,UA   rP#+  QRWp h'։}l]2]TfnCp00PM.h'֍l|2Kp0/  P֍T^2MPM,)  M,  E|EE    E    E    EEuMP|PVMlP7~u}PET+ƍMQVPuRW<t׍M;EaAM)} u=  M+΃   rp#+ƃ  QVn   E  M+΃     p#+ƃ  s  h'֍l1ǅ\    ǅ`    ǅd    @xEt|EEEu\PtPMlP|h'pEPDTMP|5\]SWH`+ǉUPQVR<]t UMF:E?M'} u@  d+σ   rx#+ǃ  QWgm J  E3  d+σ   rx#+ǃ\  QW   M)   M)   |PM_(E    E    E    EEuMP|P蠞lP{u}PET+ƍMQVPuRW<t׍M9E	>Md&
} tCM+΃   rp#+ƃwcQV/l QV#l hPLH=u3jMd    Y_^[M3k ]耣 { v &':Ujhd    PH 3ŉESVWPEd    M}]E     wu   j EPH@1(   j EP,@(   5<֍MjhD)~ME    C=EMr,UA   rP#+   QRj EE    E   E t} uPu<SM&Zj EPt?p E3j4Ej EVuuVE   CjPh0 ES?ËMd    Y_^[M3i ] á UjhEd    Pd 3ŉEVWPEd    }}E    MG@PEW?EEPOxM&  M&   EPM$E    E    E    EEuMPEP>OEPxuPEM+ƍMQVPuRu<t UM5EL;M#} u2tjM+΃   rp#+ƃw~QVh <Et,M+΃   rp#+ƃwHQVh O莯uuH=u(jMd    Y_^M3h ] &'$7Ujhdd    Pd 3ŉESVWPEd    E}p]u C  j EP<$&  j EP<H EEMMP,E   E       jEP<m$  jEPh<Q$   5<֍Mjh)zME9EMr,UA   rP#+  QRg EE    E   E t} uPu<SME"Mă  UA   rP#+  QRf v  jEP{;p E3jLLf EEM}VCMuuMV?EEM d,4E     @    @    BEBu+URQMjEuhP 観S>;Mă   UA   )P#+   5<֍Mjh, yME    7EMr(UA   rP#+wiQR^e EE    E   E t} uPu<SM ËMd    Y_^[M3d ] 讜 詜 褜 UL$S]VWhD,C@svE'{WSh  h pj V<7V<_^[]U$ 3ĉD$ SVW}GpFt
PHF$N    F$Ft
PPHw4D$    r6GXCt
PHD$Pj  {W uu3Ћ}  Kt
QPGwpFt
PHF$f F$Ft
PP    t$   D$    D$$    D$(    QAu+QVL$KD$POpL$(r-T$A   rP#+   QRc = tXpKt
PHV$)xIIVpKt&PP_^[L$ 3|b ]VL$,_^[3`b ]G Sh=VW~8tW(  h WӃF8    ~<tW	  h WӃF<    ~@tW  h WӃF@    _^[V1   N0r(FA   rP#+wmQPa F,    F0   F Nr(FA   rP#+w+QPa j@VF    F   F a ^0 V1tKNr'A   rP#+w*QPAa j VF    F    %a ^Ș V1tKNr'A   rP#+w*QP` jVF    F    ` ^h ̋tjP` ̋D$V0t&FtPp=   lh   Vf` ^Ujh}d    PSVW 3PEd    E33]]u8}GtuPEd=3   EE3;t 9yqq]}uA    ]u`=E+}39}v0u]     4      ЋEG;ru]t)+Ã   rX#+ÃwVSX_ Md    Y_^[] Vt$t+Ft~ uP6<F    jV_ ^̃SUV   Wt$VEfD  +ڃrs+;S  ߋ~|$=?D  =   r'H#;/  QS^   h#EtP3^ 3F    v<*T$+VQWp >t$|$D$V;w:    QRPH +ǋ|$PD$ j Pv Wj Uv 9<    WRP v7+t$VPU .Wj PXv t$ Ft*N   rP#+w!QPw] ^_n^][  Ujhd    PP 3ŉEVWPEd    MuQVMuE    E    3  u}MĐFGFF=p    NUVQPjh*RMU<u PPh u6u<   UM)E.M9  UA     P#+T    =  uYNUVQPjh*RMU<   PPh u6u<   MF    F    E @ E;učEPuVj h jh*u=    UM%(E-MJ  UA   .  P#+j    UM'E}-M   UA      P#+"     3tSu~ t>p tUFMP蚕j j h  vuu<u<G ;}ruEEFMGƋMd    Y_^M3?Z ]ËUM&E,Mr(UA   rP#+wZQR;Z EE E   E    t} uPu<u    F    T蟑 蚑 蕑 萑 ̃Ul$W+G+=?&  W+SVp?+t$;   ;C؁?      r'C#;   P)Y    p#FtS	Y 3D$ l$L$ G;u+PQVF l$#+PQV1 G+PUl$$EP t,O+ȃ   rP#+w4QPX D$7ŉO3^[O_] 5萏, Ujhǝd    P| 3ŉEVWPEd    }EuPWV0=u9Euh)PV@=3zWVx7+jDE    W ExEQ衫E EP|<tEE F EPx,Et	PoW EMd    Y_^M3DW ]À} t|MEEPEtjM)E Mr(UA   rP#+wFQRW EE    E   E ?} uPu<E     舎 Ujh&d    P   3ŉEVWPEd    u}x",E    uuu'MuEV+Eǅ7ǅ    ǅ    1ǅ     lǅ;ǅ    0ǅ    1ǅ     tlǅAǅ    Pǅ    1ǅ     0lǅPGǅ    pǅ    1ǅ     kǅNǅ    Mǅ    1ǅ     kǅ[ǅ    1ǅ    ǅ     Mjkǅ0gǅ    Mǅ    1ǅ     )kPjV  Ph1wkE 5H=փ  uuu2UU@ǅx,ǅ    ǅ    ǅ    ǅ    ǅ   ǅ    5U@ǅ,ǅ    ǅ    ǅ    ǅ     ǅ   ǅ     pU@ǅ,ǅ    ǅ    ǅ    ǅ     $ǅ(   ǅ,    k U@ǅ0,ǅ4    ǅ8    ǅ<    ǅ@    DǅH   ǅL    U@ǅP,ǅT    ǅX    ǅ\    ǅ`    dǅh   ǅl    @ǅp,ǅt    ǅx    ǅ|    ǅ    pUǅ   ǅ    <Uhh,@ǅ,ǅ    ǅ    ǅ    ǅ    ǅ   ǅ    U`h,@ǅ,ǅ    ǅ    ǅ    ǅ    ǅ   ǅ    X8XU@ǅP-ǅ    ǅ    ǅ    ǅ    ǅ   ǅ    UPWҋ@ǅ\-ǅ    ǅ    ǅ    ǅ     ǅ   ǅ    HU@ǅl-ǅ    ǅ    ǅ    ǅ     $ǅ(   ǅ,    N@ǅ0p-ǅ4    ǅ8    ǅ<    ǅ@    DǅH   ǅL    U@8U@ǅPx-ǅT    ǅX    ǅ\    ǅ`    dǅh   ǅl    0U@ǅp-ǅt    ǅx    ǅ|    ǅ    ǅ   ǅ    (U@ǅ-ǅ    ǅ    ǅ    ǅ    ǅ   ǅ     U@ǅ-ǅ    ǅ    ǅ    ǅ    ǅ   ǅ    UU@ǅ-ǅ    ǅ    ǅ    ǅ    ǅ   ǅ    U@ǅ-ǅ    ǅ    ǅ    ǅ     ǅ   ǅ    @Uǅ-ǅ    ǅ    ǅ    ǅ     $ǅ(   ǅ,    &  U@ǅ0-ǅ4    ǅ8    ǅ<    ǅ@    DǅH   ǅL    U@ǅP-ǅT    ǅX    ǅ\    ǅ`    dǅh   ǅl    \U@ǅp-ǅt    ǅx    ǅ|    ǅ    ǅ   ǅ    U@ǅ-ǅ    ǅ    ǅ    ǅ    ǅ   ǅ     U@ǅ-ǅ    ǅ    ǅ    ǅ    ǅ   ǅ    -@ǅ-ǅ    (Uǅ    ǅ    ǅ    ǅ   ǅ    
0U@ǅ-ǅ    ǅ    ǅ    ǅ     ǅ   ǅ    c
8U@ǅ .ǅ    ǅ    ǅ    ǅ     $ǅ(   ǅ,    	@U@ǅ0.ǅ4    ǅ8    ǅ<    ǅ@    DǅH   ǅL    	HU@ǅP.ǅT    ǅX    ǅ\    ǅ`    dǅh   ǅl    4	PU@ǅp.ǅt    ǅx    ǅ|    ǅ    ǅ   ǅ    @ǅ$.ǅ    ǅ    ǅ    ǅ    XUǅ   ǅ    j`U@ǅ0.ǅ    ǅ    ǅ    ǅ    ǅ   ǅ    hU@ǅ8.ǅ    ǅ    ǅ    ǅ    ǅ   ǅ    pU@ǅ@.ǅ    ǅ    ǅ    ǅ     ǅ   ǅ    ;xU@ǅH.ǅ    ǅ    ǅ    ǅ     $ǅ(   ǅ,    U@ǅ0P.ǅ4    ǅ8    ǅ<    ǅ@    DǅH   ǅL    q@ǅPX.ǅT    ǅX    ǅ\    ǅ`    dǅh   ǅl    UxW@U@ǅp`.ǅt    ǅx    ǅ|    ǅ    ǅ   ǅ    hU@ǅp.ǅ    ǅ    ǅ    ǅ    ǅ   ǅ    G`U@ǅ.ǅ    ǅ    ǅ    ǅ    ǅ   ǅ    XU@ǅ.ǅ    ǅ    ǅ    ǅ    ǅ   ǅ    }PU@ǅ.ǅ    ǅ    ǅ    ǅ     ǅ   ǅ    HU@ǅ.ǅ    ǅ    ǅ    ǅ     $ǅ(   ǅ,    U@ǅ0.ǅ4    ǅ8    ǅ<    ǅ@    DǅH   ǅL    N8U@ǅP.ǅT    ǅX    ǅ\    ǅ`    dǅh   ǅl    0U@ǅp.ǅt    ǅx    ǅ|    E    EE   E     (U@E/E    E    E    E    EE   E    CU@E(/E    E    E    E    EE   E    @E䍅Pj1uE</uE    E    E    E    E   E    =$   UE&r/A   rP#+   QR@ ǅ    ǅ   ƅ t uP<|EMxOփu1ǋMd    Y_^M3? ]ú&'w &'̃e   $T/ø`/øp/ø/ø/ø/ø/ø/ø/ø/ø/ø/ø0ø0ø(0ø80øH0øX0øh0øx0ø0ø0ø0ø0ø0ø0ø0ø0ø1ø1ÐW]ciou{ 	
̋D$t$PPD$Pi@Ujhd    P4 3ŉEVWPEd    }EP6=   эMn
E    Mr(UA   rP#+wlQR= EE    E   E t} uPu<    G    EGǋMd    Y_^M3= ] t Ujhd    P0 3ŉEVPEd    F   MQP6=   Mh	E    
Mr(UA   rP#+wWQR< EE    E   E t} uPu<2Md    Y^M3< ]ÊEs Ujh݊d    P0 3ŉEVWPEd    }EPv6=   эM{E    Mr(UA   rP#+wlQR; EE    E   E t} uPu<    G    EĉGǋMd    Y_^M3; ] r Ujh݊d    P0 3ŉEVWPEd    }EPv6=   эM{E    Mr(UA   rP#+wlQR: EE    E   E t} uPu<    G    EĉGǋMd    Y_^M3: ] q Ujh݊d    P0 3ŉEVWPEd    }EPuv6<   эMxE    Mr(UA   rP#+wlQR9 EE    E   E t} uPu<    G    EĉGǋMd    Y_^M39 ] p Ujh݊d    P0 3ŉEVWPEd    }EPv6=   эM{E    Mr(UA   rP#+wlQR8 EE    E   E t} uPu<    G    EĉGǋMd    Y_^M38 ] o Ujhd    P4 3ŉEVWPEd    EPuW=   ׍ME    !
Mr(UA   rP#+wjQR7 EE    E   E t} uPu<    F    E>FƋMd    Y_^M37 ]n q1=tt11VNr(FA   rP#+w QP6 F    F   F ^un Ujhkd    PQVW 3PEd    }E(3G    GG    G    G E    G    G    G     HE)FQEPOGǋMd    Y_^] Ujhd    PQSVW 3PEd    (33ۋGO+J  4+  H  $X#Nr,FA   rP#+  QP5 j(   NrFA   rP#+m  QPV5 j(   Q`     v m Nr,FA   rP#+  QP5 j$6Nr,FA   rP#+   QP4 jF    F   VF 4 GCO+;GtPGp<=O1EOFGtAO +ȃ   rP#+wTQP=4 G    G    G     Gt uPw<G    Md    Y_^[]k !!!"H"UQVuut$u$3F$    F(    F,    ^] UQVuut$u83F(    F,    F0    ^] UQVuut$ud 3F$    F(    F, ^] VD$tj$V2 ^ VN0r(FA   rP#+wqQP2 F,    F0   F Nr(FA   rP#+w/QPr2 j4VF    F   F U2 ^ i VF$tAN,+ȃ   rP#+w@QP2 F$    F(    F,    D$tj0V1 ^ i VD$tj8V1 ^ Ujhd    PVW 3PEd    E    N$ 3DF(t~, uPv$<F(    -Etj4VC1 ƋMd    Y_^] UjhЍd    PV 3PEd    E    N443AFx ux tN4C  NLr(F8A   rP#+wJQP0 FH    FL   F8 
EtjPVy0 ƋMd    Y^] 
h UjhЍd    PV 3PEd    E    ~: ,3uB  N<;N4r(F A   rP#+wJQP/ F0    F4   F  EEtjPV/ ƋMd    Y^] Ig UVjh 2Vg uEED$D$h 2PD$ PL$!*@D$D$L$MP^]jh2V.g uED$D$h2PD$2^]Ujh]d    PQSVW 3PEd    ~: t~L tA  Md    Y_^[]À~8 te~9 u_^LtXVHNDI#ȋF@<}CE    FLuFHFHwЃEjWG. ~8 uMd    Y_^[]QV~: t8j- L$D$D$L$HD$PN<9@  ^Y ~8 t~9 ut$T$^Y j- L$D$D$L$HD$PN<8^Y S܃Ukl$jhd    PS    3ŉEVWPEd    uu{x}F    F    F E    )FGEEPWMQj @h VPu<tsUMlEE Mr,UA   rP#+  QR, EE    E   E tP} uJPu:E|EEE |EPN:Et} uP|<ЃE   ,3F     F0    F4   F  <Euj    F    F    F    F    + @    0EGwE?  j EP p0  }  jEPk T  }   jEPD -tvjEP, t]5<֍Mjh(>MEJM  UA     P#+    j pPp0?EEjPME$2E    x0EE    E    EE    }EE    E    EPEH EEMMPEMH@    @    f@8 @: 9jP) EMEjPE	Mp0ubMEA4A843     E@    @     EI49EEPMu}qE~r6E    E    E    zBu+׍MRVFNMEP6Mr,UA   rP#+Z  QR) EMr,UA   rP#+"  QR( Mj uh/|v   5<֍Mjh20<MEMrzUA   rbP#+   L5<֍Mjh (;MEMr(UA   rP#+wmQR&( EE    E   E t} uPu<EMd    Y_^M3' ][ |_ w_ r_ m_ h_ UL$S]VWh(2C@sv{WSh01h/pj V<7V<_^[]U 3ĉD$S]VW{4Gpu$jQO G   @  _^[L$3& ]Ëvt
VH{LS8rCOj Qj Hh   sH G   Cpn D$    D$     D$     Y Au+QRL$lKD$PO 3L$ r)T$A   rP#+w1QRD& G    t
VPL$$_^[3% ]] Ujhud    Pp 3ŉESVWPEd    ]]E    M{4GPEVE t@  ~8  7  G8{ )  MQK_4h  EPKC4EPME    E    E    EEuMPEPWEPO3uPEM+ƍMQVPuRu<t UME,M} u6tM+΃   rp#+ƃ   QV$ MEt,M+΃   rp#+ƃwZQVy$ GG9 HqOYkuuH=u)jMd    Y_^[M3# ][ &'U4 3ĉD$0SًMVW\$A+G  sxI sx|$t
WH33f;F}?3   NdfAuy tD Fd   CfL8(F;ظ   |̋|$    t      t
WPE0x;  T$D    CfuQ{SrD$@D$u3$ʍAD$fD  Au+L$D$?Qu T$ID$  $p7C RPD$t$pn T$$B  C $PD$ p%m T$$B  {0CD$r D$C,T$D$ D$@ȉD$Fi ؅{  9D$   L$D$jjIdD$(RT$(PL$  ؃u.D$ PTD$@uP?8Pu36E  ؅t)D$ӋY@  D$yW ut  ؋D$ @   P   CD$ C \$ӉD$D$@ȉD$ih ЉT$ue9D$tK\$jRKdD$(RT$$PF ЃT$tQ@  T$ˋ	肭  \$D$ @t<P0\$3D$T$@ȉD$ g ؅uL$ 	It
QPT$Zz u!;i_^[L$03:  ] t$Fpg D$(    D$8    D$8    yfAu+QRL$,ED$$PN _-L$8r)T$$A   rP#+w QR L$<2_^[3 ] W f4445l6Ujhd    P4 3ŉESVWPEd    E]}sSu[?     5<֍MjhD22ME    zEMr(UA   rP#+w~QR
 EE    E   E t} uPu<E    WM7MPh8WǋMd    Y_^[M3V ] ;V UL$S]VWh`2C@9C@@sv{WSh9h09pj V<7V<_^[]S\$VWsFxujQN F   7  _^[Ët WHSWP_^[S_^[Ujh%d    Pp 3ŉESVWPEd    }}E    M_CPEE{ tUA  .  EPO,M  M  EPME    E    E    EEuMPEPNEPK+uPEM+ƍMQVPuRu<t UM7EM} u6tM+΃   rp#+ƃ   QV_ MEt,M+΃   rp#+ƃwZQV) CC9 H!K	cuuH=u)jMd    Y_^[M3 ]~S &'Ujhd    P4 3ŉESVWPEd    E]}sSu{D     5<֍MjhD2.ME    zEMr(UA   rP#+w~QR
 EE    E   E t} uPu<E    WM7MPh<WǋMd    Y_^[M3V ] ;R UL$S]VWhx2C@9C@@sv{WSh>h0=pj V<7V<_^[]U$ 3ĉD$ ESVWpXD$~euC+  Fxu$jQN F   j3  _^[L$ 3m ]Ët
WHS   vO Fd   e   Fp` D$    D$(    D$(    YAu+QRL$>D$PN Y&L$(r)T$A   rP#+w?QR t
WP~duL$V$%  L$,_^[3w ]^P UjhUd    Pp 3ŉESVWPEd    ]]E    M{GPEEGdtet><  7  EPK&M  M
  dM  EPfuS$M   E    E    E    EEuMPEPIEPO}&uPEM+ƍMQVPuRu<t UMEMb} u=i  M+΃   rp#+ƃz  QV) 4  E  M+΋ƃ      p#+ƃ5     EPIE    E    E    EEuMPEPHEPOq%uPEM+ƍMQVPuRu<t UMEMV} u2taM+΃   rp#+ƃwvQV% 3EtMQV	 GG9 HO\uuH=u)jMd    Y_^[M3w ]^M &'~Ujhd    P4 3ŉESVWPEd    E]}sSukB     5<֍MjhD2(ME    ZEMr(UA   rP#+w~QR EE    E   E t} uPu<E    WMMPhBwWǋMd    Y_^[M36 ] L UL$S]VWh2C@9C@@sv{WShDhPCpj V<7V<_^[]U 3ĉD$S]VWsFxu$jQN F   g-  _^[L$3j ]Ët
WHCK+uv-9 KQo   vH Fd   e   FpZ D$    D$     D$     YAu+QRL$7D$PN 9 L$ rIT$A   rP#+wJQR F@H(@,K(C,F@@hC0t
WPL$$_^[3L ]3J Ujhd    Pp 3ŉESVWPEd    }}E    M_sVuECdtet6    EPO M  M  h2֍M]W,O(p0J@ (ЍM]PQEPK )h2֍MfnG0Mp0PQEPK= )EPME    E    E    EEuMPEPCEPKuPEM+ƍMQVPuRu<t UMwEM} u6tM+΃   rp#+ƃ   QV MEt,M+΃   rp#+ƃwZQVi CC9 HaKIWuuH=u)jMd    Y_^[M3 ]G &'Ujhd    P4 3ŉESVWPEd    E]}sSu8     5<֍MjhD2#ME    EMr(UA   rP#+w~QRJ EE    E   E t} uPu<E    WMwMPhHW?ǋMd    Y_^[M3 ] {F UL$S]VWh2C@9C@@sv{WShJhHpj V<7V<_^[]U$ 3ĉD$ S]VWsF@u$jQN F   '  _^[L$ 3 ]Ë@D$t
PHC{+sv3 W   v`C Fduc{$fj} ؃ˉ\$    C    C    VR  G;GtGL$QP蕳vB Fdte   FpT D$    D$(    D$(    yAu+QRL$1D$PN ;L$(r)T$A   rP#+w.QR D$t
PPL$,_^[3j ]QD Ujhd    P    3ŉESVWPEd    ]hE    ls~FWuE}E~et#0    EPKM  M  C(+C$  P׍MC(s$EE    ;sy]WEtw  puuu=tUMEMmEtjSZ E;ur]|PMEEEEE    E    E    EEuMP|P<MtPu}PEM+ƍMQVPuRW<t׍MDEM} u=  M+΃   rp#+ƃ  QVh
 U  E-  M+΃     p#+ƃ\     |PMUtj E    E    E    @MEEEuMP|P;MtPu}PEM+ƍMQVPuRW<t׍MEMk
} tTM+΃   rp#+ƃwoQV6	 &QV*	 uFF9 HNPplH=u)jMd    Y_^[M3 ]v@ &'Ujhed    Px 3ŉESVWPEd    M}]E    E    GwuEE    |tHPE|P#E    EuKP|PE    u#EPE|PH MEMEPQMW8  E   5<֍MjhD2%ME    EMr,UA   rP#+2  QR_ EE    E   E t} uPu<SM   p$} M   FPjuQD=   MpE   EMăr(UA   rP#+wzQR EE    E   E t} uPu<E    uMh Q8SËMd    Y_^[M3 ] = = UjhΡd    PSVW 3PEd    h    uE    ]KNtFx    F|    ǆ       Ɔ    ǆ       ǆ       ǆ       Ɔ    ǆ       ǆ       Ɔ       EP6t=Nt9FtMQp\=h VVu|=EEs0KPK0P   QEPK$K0P   CMh2@9C@@svQ{WSh@[hRpj V<7V<(Md    Y_^[]U, 3ĉD$(MSVWYA0D$Cpu$jQK C      _^[L$(3 ]ËA{+AvL$|$s7) L$|$QV  t
VH79 Cd   t
VPj T$|$    G    G    k  D$   PD$d=L$xA;At8AT$RP蒩t$`=t$x=|$Ae   Cp{J D$     D$0    D$0    yAu+QRL$$'D$PK (L$0r)T$A   rP#+w?QR t
VPD$Pƀ   x=L$8_^[3F ]-: Ujhd    PSVW 3PEd    E0   E    Nt         Pp=   <t%    uP   ы<ǆ          t    uP   уǆ       FxtG   +ȃ   rP#+wDQPy Fx    F|    ǆ       h   VS Md    Y_^[]8 Ul$tjhMd    P( 3ŉEpSVWPEd    E|ME]0Ct@PE,c   E    M 333u ]$E(QEd=M0U 3]xE3;t#1YAy](y]؉u E$Eu`=;}b  M0E4P   M4Q  M4
@  EWPM,E ~@M E;  7uEMu,  ]0E<    E@    @   MEED    uEEPE PM<1KtEPa]<PE@M+ÍMQSPu8Ru4<   9E   EtLED+    Á   rX#+Ã  QS E<    E@    ED    tjV ;}$ME U M(+ʃ   rP#+  QR MU4MHEMHyt0MD+˃   rX#+Ã2  QSL t
jV6 U   M(+ʃ   rP#+  QR   E t7E+       rW#+G  QW ]0E4P   q    G  }8 ,  M4b  E PM,ݸfn   M܋U,E<    E@    ED    @MEuEEPE PM<.KtEPu<}4PE@M+ƍMQVPu8RW<t׍MHhEMHŶ} u/tlMD+΃   rp#+ƃwQV >t,MD+΃   rp#+ƃwPQVe hTuh=uuH=u'Md    Y_^[Mp3 et]3 3 &'Ujhd    PVW 3PEd    uuE    M~wNEet0  GG9 HOBuuH=ujMd    Y_^]ú&'9Ujhܢd    PH 3ŉESVWPEd    M}]E     wu   j EPѷ   j EP起   5<֍MjhD)5ME    EMr,UA   rP#+   QRo EE    E   E t} uPu<SM裵Xj EPp E3j$ EVuuVE   5Ph]ES)ËMd    Y_^[M3 ] e1 UL$S]VWh2C@9C@@sv{WSh ^h ^pj V<7V<_^[]̋D$Vpv F    ^Ujh%d    Pp 3ŉESVWPEd    ]]E    M{GPEfEEPKM螵  M莵  EPM	E    E    E    EEuMPEPM*EPO1uPEM+ƍMQVPuRu<t UME^M} u6tM+΃   rp#+ƃ   QV MEt,M+΃   rp#+ƃwZQV GG9 HO>uuH=u)jMd    Y_^[M3 ] / &' Ujh=d    P    3ŉESVWPEd    MEMQPE<t!UMjE    MİEE   ]PS](=t1ӍM+EME脰E    E    EEG7E;^  E    H   E    $cS$K $ Ul(辶t|S dU衶t_{0Cr s,U\P躹t5sUMs /  tTPMt@E{CrCULPupuu4=t"UMEME7H  $cKr,CA   rP#+  QP j(   KrCA   rP#+J  QP j(   Q   s  - Kr,CA   rP#+   QPh j$6Kr,CA   rP#+   QP0 jC    C   SC  ;uEPuuu=t3UMkEMȭ]M    C    ]MECuQ=u#ËMd    Y_^[M3; ]"+ t11Bfa,aIasaabXbbbbUjhȣd    P4SVW 3PEd    Eم     3M؅  D  WP7 Mj j pX8 Ev  $gj( uWuE    34 U܍NUE       BA    A    E@ Bu+URu=EF E܉F$  j(	 uWuE   2 UN   ]    BA    A    EܐBu+URuEF e  uWVT4 WVE
0 j4E űUNE          BA    A    E܊Bu+URuXuNEu    A    A       uWV. WVE~/ j$E uȋUNE          BA    A    E܊Bu+URuEPFs) MF QuP Oj uċUNE          BA    A    E܊Bu+URuYECu;Ct0CMQPsEG;}VMd    Y_^[]ÎdereefUjhd    PD 3ŉESVWPEd    M}]E     wu   j EP葬   j EPu   5<֍MjhD)ME    EMr,UA   rP#+   QR/ EE    E   E t} uPu<SMcij EPp E3j$ EVuE   ȋuVPhhENEPb@CËMd    Y_^[M3/ ] & Ujhed    P\ 3ŉEVPEd    uuE    MFpEN   EPNMܪtvMЪuiE    E    E    EENPMMQj j upu<tUM%EʿM肧uuH=u"jMd    Y^M3 ]ú&'UQVF:-   v NF    ^]Ujhӎd    P    3ŉESVWPEd    ى]{CWHE8E    CL{8 Ev  8 m  h 3׍M׋@Mph%Eٮ@׋ph0迮MVSp0MQQu`up0Eȃxr5<pQMcxEPMͻpEM쉝\Xr,UA   rP#+  QR EE    E   E t} uPu<E    E Măr,UA   rP#+  QR  h'׉]xu聭X`p0脫PMh'׍xI`p0h0/MPU2EPTE  ]KHsDN#C@44tEu	CH    CHFEMEQH{8    }    M   E    E    E    EXtMPPPxPK]SPE`M+QPuMRu<]  }   MEEtLE+       rH#+  RQG E    E    E    MtjjVE  CLSLE8E1  \Xh'׍xWE    E    E    @hlptExtMPhPbMxPCMh'pEP@`P )}URWHE+PQVS<   ӍM襴EJMxUM腴E*MMt0U+у   rH#++  RQ MtjjV    } u=   M+σ   rx#+ǃ   QWW       M+σ   r׋x#+ǃ   {L {LtNfSHʋCDs@H#ȋ44u	CH    CHNtjtjV ? uLHH=u+Md    Y_^[M3T ]; 6 1 &'QV1tjV^ ^QS\$VWNL$;w(r>Sh*W^c  _^[Y    Uw/Ѹ+;w 
;BO   r2A#;      #P tuh#EtQo 3Sh*U^~ D$+ r)H   rP#+wQPN .]_^[Y  !ܞUjhФd    P    3ŉESVWPEd    EX4X]sVhC E    xr P֍h8֋@MMh%EMxI舤P֍PMWSp0MQQupup0 Eȃxr5<pQMxEPMX8EM]r,UA   rP#+  QR EE    E   E t} uPu<E    E Măr,UA   rP#+5  QRd h'։}x]ť]pfnCp0ģPM;h'֍x艥Kp0P֍pkMPMEPM訟  M蘟   E}EE    E    E    EEuMPEPZxPK;u}PEp+ƍMQVPuRW<t׍MEeM} u5|  M+΃   rp#+ƃ  QVG  G  M+΃   rߋp#+ƃ  h'֍xE    E    E    @dE`hlEpuMP`P)xPK
h'pEPPpPK}URWHE+PQVS<tӍMpEM͚} uOt0M+σ   rx#+ǃ   QW \XH=uP(tM+σ   rŋx#+ǃw7볋Md    Y_^[M3 ]  &' Ujh$d    Pl 3ŉESVWPEd    Mȋ}MwdE    3_uԅ~3CPEP袴苜uCPEP致KH0Mj$[ EuEVu诨E uԅ
  j E̋PAj EPtj)@MME֪3Ʌ  QE̍yPMWp0  NE;N tFEPQN;|}  迳覛t蚛  j E̋P蔳2p0  j E̋Pm 2p0ޮ  j E̋PF  j E̋P*tt3  j E̋PH EEMMP赤M蝩3ۉE  }SEPM谦EPM脡M\MfnEWMf.ȟDzOuEuMPFMPv6  OE;O tG   EPQO~   EM̉E̋EEЍEPE~r6uEuMPѢVp0!  OE;O tGEPQOE Mr,UA   rP#+   QR C;]Ku3HPEMP{up0  NE;N tFEPQN莂E;|uuuH=u%ƋMd    Y_^[M3 ]  &'UjhФd    P    3ŉESVWPEd    EXX]sVHC E    xr P֍h֋@MMh%EMxIhP֍PڝMWSp0MQQupup0ʱ Eȃxr5<pQM~xEPMX8EM]r,UA   rP#+  QR EE    E   E t} uPu<E    E Măr,UA   rP#+5  QRD h'։}x]襜]pfnCp0褚PMh'֍xiKp0ٙP֍pKMPMEPM舖  Mx   E}EE    E    E    EEuMPEP:xPKu}PEp+ƍMQVPuRW<t׍M蠥EEM} u5|  M+΃   rp#+ƃ  QVG  G  M+΃   rߋp#+ƃ  h'֍xE    E    E    @dE`hlEpuMP`P	
xPKh'pEPPpPKП}URWHE+PQVS<tӍMPEM譑} uOt0M+σ   rx#+ǃ   QWx \XH=uP(tM+σ   rŋx#+ǃw7볋Md    Y_^[M3 ]  &'٥ Ujhtd    Pl 3ŉESVWPEd    MȋuMvDE    3^}ԅ~3CPEP肫kuCPEPgKH8Mj0; EuEWu菢E   j E̋P$j EPtj@MME蹡3Ʌ  QE̍qPM͞Vp0  OE;O tGEPQO{;|  袪ȉE舒tM{  j E̋Pu2p0  j E̋PN 2p0迥  j E̋P'   j E̋P؋tt3  j E̋PݩH EEMMP薛M~3MEԅ  PEPM菝EPMcM;MfnE6Mf.ȟDzOuEuMP%MPv6p  OE;O tG   EPQO]z   EM̉E̋EEЍEPE~r6uEuMP谙Vp0e  OE;O tGEPQOyE Mr,UA   rP#+   QR E@E;EH3HPEMPWup0z  OE;O tGEPQOjyE;|uuH=u%ǋMd    Y_^[M3 ] 
 &'̡Ujhĥd    Pl 3ŉESVWPEd    MȋuMv4E    3^}ԅ~3CPEPr[uCPEPWKH8Mj8+ EuEWu连E   j E̋Pj EPtj@MME詝3Ʌ  QE̍qPM轚Vp0  OE;O tGEPQOw;|  蒦ȉExtMk  j E̋Pe2p0֡  j E̋P> 2p0诡  j E̋P  j E̋P؋t֍t3  j E̋PͥH EEMMP膗Mn3MEԅ  PEPMEPMSM+MfnE&Mf.ȟDzOuEuMPMPv6`  OE;O tG   EPQOMv   EM̉E̋EEЍEPE~r6uEuMP蠕Vp0U  OE;O tGEPQOuE Mr,UA   rP#+   QR E@E;EH3HPEMPGup0j  OE;O tGEPQOZuE;|uuH=u%ǋMd    Y_^[M3 ]  &'輝Ujhd    Pl 3ŉESVWPEd    MȋuM]v!E    y^3}ԅ~3CPEP[DuCPEP@KH8Mj4 EuEWuE   j E̋P֋j EPtp@MME蒙3Ʌ  fD  QE̍qPM蠖Vp0  OE;O tGEPQOs;|  uȉE[tMN  j E̋PH2p0蹝  j E̋P! 2p0蒝  j E̋Pӏ  j E̋Pޡ؋ŉt蹉t3  j E̋P谡H EEMMPiMQ3MEԅ  PEPMbEPM6MMfnE	Mf.ȟDzOuEuMPM΍Pv6C  OE;O tG   EPQO0r   EM̉E̋EEЍEPÐE~r6uEuMP胑Vp08  OE;O tGEPQOqE Mr,UA   rP#+   QRg E@E;EH3HPEMP*up0M
  OE;O tGEPQO=qE;|uuH=u%ǋMd    Y_^[M3 ]  &'蟙Ul$tjh}d    P0 3ŉEpSVWPEd    E XM̉]sVC E    xr P֍M̌h%֋@M,ME$貌MxI"P֍M藌WSMp0訠M0Qu$Mu,p0莠ĎEȃxr5<pQMHBEEPMH诙X8EMl]$r,UXA   rP#+g  QRv ELEh    El   EX t}P uPuH<EL    E MDr,U0A   rP#+  QR h'։}(M],o]MfnCp0qPM(h'֍M9Kp0詈P֍MM(PM E(PSM([
  M(K   E$}EE    E    E    EE u MPEPEPKu}(PEM+ƍM QVPu,RW<t׍MHyEMHց}  u5Z  M+΃   rp#+ƃ  QV%  %  M+΃   rߋp#+ƃ^  h'֍MډE     E    E    @E؋E$Mԉ}܉EEEu M PEPEPKh'pEPEĉMPKǎ} U,RWHE+PQVS<tӍMHGEMH褀}, uEt,M+σ   rx#+ǃw}QWs uuH=uQ(tM+σ   rˋx#+ǃw8빋Md    Y_^[Mp3 et]  &'ٔ Ujhd    P4 3ŉESVWPEd    EMQj PuW=   ׍M(E    ʗMr,UA   rP#+   QR] EE    E   E t} uPu<    F    FF    F    sMF>VN     F    tHj j ]E    SRPQW=MăNt(MAE   M~    F    F    Md    Y_^[M3, ] Ujhd    PP 3ŉEVWPEd    MuQVMuE    E    3  u}MĐFGFF=p    NUVQPjh1RMU<u PPh u6u<   UM$EɕM9  UA     P#+T    =  uYNUVQPjh1RMU<   PPh u6u<   MF    F    E @ E;učEPuVj hjh1u=    UM5EڔMJ  UA   .  P#+j    UME荔M   UA      P#+"     3tSu~ t>p tUFMPj j h  vuu<u<G ;}ruEEFMWƋMd    Y_^M3O ]ËUME贓Mr(UA   rP#+wZQRK EE E   E    t} uPu<u    F    T    Ujh]d    P0 3ŉESVWPEd    M}   EMEčE؉MȍMPlj4E    R uȃ}U؋}   CUff~F    F    F   F ENu    RA    A    Mr,UA   rP#+m  QR >  u2uDM   EPEPy蒄j4E   x uȃ}U؋}   CUff~F    F    F   F ENu    RA    A    5MNUA   rP#+  QR `  {   u}uwj(t[譾 uE   MUM̍M̉UVf~   fF    F    F   F F ƉV$  R uE   MUM̍M̉U   f~fF    F    F   F F   M{ujj( uE   MUM̍M̉U}}3Ʉf~   fF    F    F   F N F$      Mzu:js }   Eȃffx@    @    @   @   M4t~EPM	  j$! ؃]ȍME	   f
  }M[
  u   fEfCC    C    C   C Vs VWPC , <  u 2uBt=j(蘼 uȍEE
   PMiR   fEfF?MfytMYy   EPM$M<y   EPM(j4E    uȃ}Uظ   CUfEfFF    F    F   F ENu    RA    A    MUA   P#+w%3Md    Y_^[M3O ] 4 UjhLd    P8 3ŉESVWPEd    uM*x   EMEčE؉MȍMP	j4E     }EO}]؋   C]    A    BA    EBu+URVEOu    SA    A    Mr,UA   rP#+(  QR}   u2uϊM   EPEPj4E    }EO}]؋   C]    A    BA    E Bu+URVEOu    SA    A    M9UA   rP#+5  QR芹   Wv   uuj(t{) }E   MUM̍M̉UzOUЋ؋       A    A    BE    Bu+URVEЉG$ǉ_ i  许 }E   MUM̍M̉Ug   OE    A    A    ZBu+RVpE̋G   MGuuyj(/ }E   MUM̍M̉Uw   3G    G    OBA    ÉEЊBu+URV_ G$    s  MtuSj詷 }E	   O       A    A    Z@ Bu+RV  MQz   EPM  j$: }ȍME
     EMԉEq  ]O       A    A    BEЊBu+URVS_ SuG P2 r  u 2uHt]j(螶 }ȍEE   PMozX   OE    A    A    ZBuMLstM?s   EPM
{M"s   EPM{j4E    }EO}]؋   C]    A    BA    E@ Bu+URVEOu    SA    A    M)UA   P#+w%3Md    Y_^[M3 ]  Ujhd    P| 3ŉEVWPEd    }EuPWV0=u9Euh)PV@=3zWVxjPE    譴 ExEQ1E EP|<tEE F EPx݉Et	PO EMd    Y_^M3$ ]À} t|MEEPpEtjMlE Mr(UA   rP#+wFQR EE    E   E ?} uPu<E     h Ujhd    P0 3ŉESVWPEd    uQF	~ V    F    tJj j ]E    SWPRQ=ȃEĉFt(ME    [Mm    F    F    Md    Y_^[M3褲 ] Ujh݊d    P4 3ŉEVPEd    ~    EPEPv6=tvME    詄Mr(UA   rP#+w^QR@ EE    E   E t!} uPu<EĉFEFMd    Y^M3誱 ] QVW|$	wl 5pKE5dIt
VH|$ D$L$xI@    IA    tIt
VP3_^Yh-hY  hhěje     _^YUuD$WPD$fD$PufD$3uU$
UL$
]USVuWFt
PH]  $@L  3Ʌt AuP  3҅t BuT  3t GuX  3ɅtD   AuыMt
<  +ǉ<  E++σ} m  P  t.
t
ыȅuL  P  L  ǆP      X  '  
tыȅuT  X  T  ǆX        } E     E0    Ǆ0        3ۉ\$8^_u 3ɉL$9N   3҉T$FDD$tj@         <p,tSD$ $T$    Ѓ}uL$IyDЋ\$L$ڋT$\$AL$T$;Nr~_ u貌 EE       ~_ D$    u: ~ D$  D$    R  3ۉ\$     F\\$  j(K<K,KKD$CtP$3D$C4tP$3D$C$tP$3D$CDtP$3D$[0t]@ {tL
 uFW	Q t2  Wt2  Wt  W ׋m2  u|$t#Wt   uBu9 ?u݋D$\$@D$\$;F~_ ǆ      u EM     D$A~D$3ɉ  L$ts uL$Eǆ           E3ۋNt
QP_^[]û
   339N~73@ FDt@    } tǄ       A;N|ϋE     E8돋E        &|	   w   |	    w3R   H   E ?̃SUVt$D$W|$ 3D$    O3Ҋg0ML$,0t%tGˍRFQuߋL$;|+;$t:>uD$FD$E |$ u_^][̃D$WSVWPD$Ph<7V.  N:   D$FPhD7VY  >.u\NtMF %fD  FYYӊfnX\u^ʊT$3҉T$D$fnGD$GfG(  G+XG tNFuG    -u
+u@   D$FPD$Ph47VuiL$D$+L$ÉGZtzu%FtNvuG-3u9GG,3_^[_^   [̃U}( g  }* SVt8Mu֋]\$i  T$=x9  v,j0j U E.^[]ú     T$T$}) u΃QWyOL$AڃO@iQ h鍏l  Qiɭ  ȋD$+˃fn\YP" }+ ؋] D$EE(t^MEE Y+Mi`   +u |$}, }tiE`  fE*  E, +u }_^[]̃SVWs8Vuw@ 8|HHtVPыV*L$QP@@D$YP? ȉVt&    F        G    _^   [ÉW|tG(3_^[̃SUڋVW{<-D$D$ PD$ EPD$ PhH7W-t$@ul
uTuG֋t	? uAF+ |$-D$F( F*u؀~, FD$FD$ Ft/3_^][Ë֋\tT7+
;uu-I t%֋_^][exx+uBˍQAu+ʍT$ ?jQf  ~WD$ f/(F)F [Hf/IYPXp 3VF(_^][_^]   [SVW{* 0  {( u  C   C   CC*_^[ËK@ rw=rvj0j S C._^[ .j h \& QP< fn\0^,ȋ+ȁ  fn\^,%  iȭ  Q+fn^,fnY,+   +   sM+3SǉCC*_^[W+    VG .j h \& PR G) G+fnиų^,fnG\i𸉈ʋO++fn^XG _U    3ĉ$   VWT$W)D$P)D$`D$p    V ެ7@=  wr 'w3Wh  R6jL$ D$ FD$0F D$@qL$ D$(  yOG+D$H   L$ ǉD$(yj h  t$,t$, -@iD$1= T$t t$L$PQL$QD$PD$TP t;D$X7jjjj@   l    _^$   3 ]ËD$d+l  FD$`@j FD$`h  vFD$d6FD$dF q fnL$P3YP$   _F(  F, F. XF ^3v ]UhVW|$xՃL
  $p7-a  
  }
  u8F)ta8F(u\N f/
  f/~
  YF(   F,XXp( 3V_^]3F)_^]úx7`  (
  }
  M8A(
  8A)	
  A)_^]ú7_`  	   	  M_^]ú7,`  }uh8G)tc}	  G YXf/(	  f/v	  XpG(   G, 3W_^]ú7_  >	  L$ -	  -   3ωt$qG3L$<D$L$j0D$Dj PP L$ Ǚ+D$hD$L$T$L$@L$@D$D$D  8D$hu88D$jt;L$HT$L|$PT$ i  |$(=x9  v,j0D$Dj Pٷ |$@'       T$ T$(|$i u̓yQOL$ D$0AO@iQ h鍇l  iȭ  QD$0ȋD$(+L$0fn\YP9 |$k T$DtbL$TD$XD$`Y+L$Ti`  T$0 L$0+t$L$D|$l L$DtiD$\`  +ʉL$Dt$+|$<tFt$2uj0j V胶 D$ D$FF(F-3_^]ù7   L$ Jt#	x:xL$uAGL$Jxxx+  u3΍QAu+ʁ?jQT$8]  u  L$0,t$0fnf.DQ  I  f/7  }HG, G( rG j h \& PQ j jRPk ȉT$<ƙD$<;|;vj h \&PQ fG*  D$0 \&G, +W3W_^]ø7	   D$JL$t%D$x:xD$u@GD$Jx xx+5  }G(u8G*u	8G+  	* t$<?  u  G   G   GG*  O@    r=r    .j h \& QP fn\0^,ȋ+ȁ  fn\^,%  iȭ  Q+fn^,fnY,+   +Mq   MƋt$<+3QǔǋGG*j0j W/ G.fG+ WG    G    G fG(    7Z  t7Y  uG   G   3_^]ú7Y  Y  _^]ÊF   tf<:tu	D>GujWT$8yZ    7|$<:   j0D$Dj PO NT$@Es  L$@"D$@|$D- .j h \& D$WPp j h \&RP L$+ȉL$>-uىL$ ߋuD$fF*  ~3F, _^]tD  GGu|$+  NFu+?t$F  D>xsuNt$MFL$0Wf/L$(v
pD$ D$    L$A;   օ   |$ ~"Jtx:xuFGJxxx+u]L$Q(WZf/vHZf/v?|$ǋuth   "kL$0,Ffn   L$t$|$D$L$y"u   fF*  F, _^]ËL$0F,L$0D$<HHfnD$0*L$<F@+ȉNF( \L$(L$(Y$ZYXD$  V3fF*F,_^]ø   _^]BǵYȶ            ̃SUl$VWj0j U|$ t$迮 u toՋ_^][\$ Q?<tS<tOt>%  =  uyuAu wd tUЋy      _^][t	&$tQ	 (t
8X (WWM f/E)r0Hf/v"YPXp( E UE(   ;   u3/Q%  =  uyuyt3	c QtyuA2tY   t
Ë\$ Ë\$ t3i L$VUPF;t$Q}. }@ r} r_^]3[UUD$Ѓ<VuPuu|L$T$L$T ^P6   D$fFt2U D$	   fFD$L$%  =  uD$ u   fF^]UUD$Ѓ4VuPuuOL$j h  t$t$= -@i   1fqtRPZ ^]É   QfA^]UX 3ĉD$TEL$USW}QP  L$L$WD$
   ؉L$3D$I-+D$L-MbQ0T$Egfff0T$Fʋ|$0T$G*ظgfff0\$H\$ʋ|$0T$J*ظgfff0\$K\$ ʋ|$0T$MD$O D$R:*D$U:0D$X \$Ngfff\$$jʋ|$0T$T*ع
   gfff0l$,\$UڋÙD$,0ˈT$W,\$4*0D$Xgfffjʋ|$0T$^*؋π0|$  \$_}D$L-T$LjjT$Qʼ L$\_[3{ ]UL 3ĉD$HEL$USVuWQPS   L$/\$$gfff
   D$F:D$I:D$L 0T$D*ظgfffl$(0\$EڋÊ˙D$(0ˈT$G,\$0*0D$Hgfffjjjʋ0T$V*؍T$P0Έ\$W讻 L$T_^[3^ ]UP 3ĉD$LEL$USW}QP4)  L$D$
   ؉L$3D$I-+D$L-MbQ0T$Egfff0T$Fʋ|$0T$G*ع
   gfff0l$\$HڋÙD$0ˈT$J\$ *0D$Kgfffʋ|$0T$MD$O *؀0|$ j\$Rj}D$L-T$Ljj
T$Q3 L$T_[3 ]U   VuW  M	{  Q%  =  uyuyU  \ D  MD$VuPQj   L$@@xD$H    D$D    D$L    D$PD$T    fD$X  L$L$338  L$0(D$0(T$ T$(\$L$     <7%  ;sX΍+ȋD$T;D$LrQL$H9  t*D$T+D$HQRP
 (\$(T$ (D$0L$0T$L$FFD$7D$ۃR  $t$ D$Hh7Pk@  O  D$D]$h7P@@  $  t$$)\$`L$`)T$p)$   Ƅ$    D$l   D$p   L$+L$`D$D$d .j h \& PQ |$WD$\u_T$L$ .j h \& QRε j jRPs L$\+ȸ$Iѹ7PQD$LPv?  Z  @7PQD$LP\?  @  Ϲ ^PD$L$h7P0?    t$t$(j h  RQ( -@i1RPD$Lh7P>     ,Pc j h \& RQ j jRP苵 03ɈD$   D$TɅrw;D$LrL$D4  Ѕ~wD$TJL$HT$\T$D$TT$\Ut$D$Hh7PV>  =L$T3   rw;L$LrL$DM4  D$TJL$H%D$TL$0(D$0(T$ (\$D$T$L$F<7 ;si+D$T;D$Lr?эL$DV6  MT$H8  _^]D$Yt<T$Ht4L$D  _^]ÅtD$T+D$HVQP辶 MT$D7  _^]Ð!Y*c 	
D$    D$    D$    D$    D$    D$    ̃S\$UVWT$ořRPr
     Uj V D$,%t$$PGVt$ WЋtj= tUpKt
QHV$)xIIVpKt"PP33_^][V33_^][_^]       [Vt@VЃ    = tEpKt
PHV$)xIIVpKtPP^V^Q
 t3YÀ= VWu3j@t
WH5Ht?S\$t5Fˊ:utQ:Puu3tvu[t
WP_^YK
    W8u3j@t
WHL$HVt6;uQH't#~ tF;t	Fu9NuAF|$ ^utBAJ	QHt
WP3_蛤
 |   V8u3j@t
VHT$t;H;u
BH't#y tAf;t	ȋAu9QuBAt
VP3^QVt$蘽 ut$hX8j8  ^YS  Vt$t$ u"t$t$ Ph8j\8  ^̋D$3Uhj
 ]̃=@    = SUVWt<5=-D$D$D5=-L$L$L$L$8D$TD$<5D=HL-PX_^]@[8̃|$D
 u%@t3̋D$t
D$%D̋D$t
D$%H̋D$t
D$%L3̋D$t
D$%P̸   ̹   tI3
u*VW=8x-V׃.|_H   3^Ã=H uj 5=H t33ɺtI   
u59Hu-VW=ܰx-fD  V׃.|_H    ^3UVW}ǃ ttO    +x-_^]j j  t5    F    F    F    F    F    V~8_^]Vt$Ftu^Vܰ= tDpKt
PHV$)xIIVpKt^D$%PV^t$̡<V   yt$<   3ɅE^tt$3ɅE^t$4USVW_
 t_^[]Ë5pKtVH5pKUxK|KM\$D$%|s   VPT$_^[]Ë=K|$Kt;|;wuˋ׋\$xK|K| t|;xIwK   
K    t%VP5pKtVHVPT$_^[]UM3IRP]SUV(
 t	^][ápKtPHpKt$K-K|>L$r4K5K;5|K|xK;r|KuxK5|Kt
PP^Ջ][UV5pKWt
VH=xIt
VP3_^]UV5pKWt
VH=Iσ} ExIIt
VP3_^]QL$SUVt$Wr  j  r \  = ?  pKt
PHV(I;G΋5|KI   xK   Ǚ؋+3;|l9xIrbpKK   t$QPpKtQHpKK5Kt+3;|9xIr	3^KWtCV$xIȡI;ȉxIGIAII;ȉIGIpKt
QP_^][YV_^][Y_^]3[YUU
 t3]ËE~RP<]U%
 t3]uu]̋D$tP$3Vt$tW= tDpKt
PHV$)xIIVpKt^D$%PV^Vt4;d  s,;\  r  ^(;`  r  6  ^R$  ^VtG   t^;d  s0;\  rX  X  ^;`  rP  P  ^ÅtX= tEpKt
PHV$)xIIVpKtPP^V^̋T$t	L$?̃SUVWut$,t$,6_^][Ë\$(ËL$,ul9tPpKt
PHV$)xIIVpKt
PP3_^][V3_^][Åwr sV$|$S(;j  = P  =pKtWH=pKI;GË\$I+Å   xIL$ȡxKT$+|KL$ L$D$    9L$   9D$r~|3	=xK v(t$WP=pKtWH=pKK|=Kt2+D$ L$3;|$9D$rWP3_^][UV t)V$xI+ȃI;ȉxIGIpKt!PP_^][UV _^][U
 t3]ËM39EMERP]UŖ
 t3]uMu]]QVW|$t$Wt[   tWj V _^YQVWt$t$Nu	  _^YQVL$W|$4  ;r5w;v/0   uD  WQ_^YÀ~W    3_^YÅwBr   w8X  tX  @  _^YËT  tT  @  _^YËP  tP  @  _^YËL  t@  L  _^YH  WQ_^YSVW~W u;`  rR;d  sJt$t$؃t[;\  s	6     PWS t	׋_^[t$t$zuZ  _^[3_^[SVWхu3_^[ËύqAu+j YSt	@itSWV舢 _^[SVWt5\$D$ PVtSWV? 3 _^[3_^[QSVWًL$t     GGu+~If     tNIƋ˙ RP\؃tVWS諡 3 _^[YV~W u{~X uu    FW~
ǆ(     0  3f4    tEh8P&2    @        tfD  @$@      u3^̋D$xW t8    u/0  @W ǀ(      t
3f4  6  f4  QyW u
  t9AH#YÃ    u)0  AW ǁ(      t36  f4     A@   /     YQVW~ uoT$D$|i;FvbN|[;vUFt-FtVtfF    F    F    t  t
@$@   3_^YËRPtcu6F9Ft-FtVtFfF    F    F    _^YU(   3ĉ$$  E3Vu3W}L$|L$(|$4OT$lL$tT$l|$ HDȉL$$
  W$   GWT$$   8$   0$   $   $   x$    $   @$   X$   `D$$       %t։T$(D  FFt<%uƍO+L$D$POD$P;L$OD$Hrt$P  (D$Pt |$H9|$4PRG+D$XD$PPȝ >   NFt$hl  2D$     D$CD$D$3D$D$D$D$|$T$$AL   $ D$e  D$+[  D$ Q  D$3G  D$=  D$C3  D$,)  FAЉD$ t$h0|-@ 9w<F<y0}|$ |$D$ t$h%D$ .    |$ t|D$lP9WfD$8D$8i@BT$lBA$tQT$<Fta1 T$<3ty t|1 T$<WfD$8T$<D$8T$<D$$D$ yD$=  |؉D$ D$     FV<.  <l
  T$h5  NFt$h*   |$ t||$lW9WfD$8|$8iGBGA$tQ9T$<Jt0 T$<5ty t0 T$<WfD$8T$<|$8T$<D$$:|$y   |NF|$t$h>|$NFt$h,30|9w<F<y0}t$h|$lu5NNFt$hb!NFD$t$hluNFt$hD$D$$3D$0D$P0D$;tF|T$L$PvE3E0L$PT$]  $D$D$ A  |$    t$lV9"WfD$8L$<D$8T$D$L$,  FBFA$tD$AD$,D$L$,yt. T$,ʉD$`ty t. T$,ʉD$EWfD$8D$<D$,D$8L$,D$&D$L$t<uD$$I
D$$ʅC|9ز-D$ ىL$,   |$    t$lV9~bFBFA$tD$AD$,D$L$,   t- T$,ʉD$kty t- T$,ʉD$PWfD$8D$<D$,D$8L$,D$1D$L$t<D$uD$$ID$D$$3ɉL$,2҈T$uD$3|$C tL$ 3+;L|$%}F   $   t$dD$XOǙʃ
t$d |$ tVUUUt$dQL$8VȉD$`L$|  N|$t$(   D$̹̍zD$8D$T$DD$,ȉT$HD$,ΉT$8T$H D$pL$D |$H|$3ыL$8+}j j
QV褓 uu3t$(}F}L$P|$AD$8AʉD$HD$,L$DD  Qt$LNPWC t$DL$<t$Lt$4W踒 L$DD$,wruD$X֋|$+t$(t$dN;}+J0uT$(|$ tQIVUUU   3ɍzT$(+։T$(~!uD$AN   Aߋt$dD$tJT$(|$3 t)D$P@ttJ@
uT$(D$XN+|$ D$+|$ z    D$43ɉ|$D@D$HǙD$HʋT$4Bx#9D$HrL$4n  T$4D$DT  |$DJOB B|$ 5  |$ tyt$lV9~YFBFAt	T$L$X]$tQ	[ T$(L$X@t* T$(D$X($   T$L$XL$D$$	L$Xy     O$   f/vW$   L$XD$-u~Ó  +Ÿ$
r$   D  Y؃u|$uKL$8VUUUL$<    ǃ}(Y$   X(XL$XL$83L$<с  D$  u$D$8 tD$(8   D$f/3  $   f/$   (r=^  Yԃd(Yf/sD$$   (Yf/r"    =^  (Ѓ
Yf/sD$$   (Yf/r=^  (@Yf/sD$^$   f/L$Xv$$   @ Yʃf/wD$L$Xf/v YHf/wD$L$X=^  ~9$   3L$(L$Ɉ$   Ǆ   Inf p$   T$$   tNXf/L$XrY$   @D$L$Xu%|$3 D$|;
+T$T$L$L$3ɀE3ɉL$pOȉT$DǙȋD$ L$8T$DȋD$D x#FvPQL$<gD$|  D$T$t$(E   
D$
D$3L$HD$tFT$py0FJL$X$   fD  0,Ifn0\YʈFyيD$L$HL$Xt.FByPj0VD$D+k| L$Tt$8~8O0(L$XI,fn0\Y$   L$XFȀ|$ t.|$ t'~0u
N ~0t~.u|$ t0FN |$   D$P~L$|$8@3+ɉD$PM+   N|$Pd|$t$8QʍA0Fkd+|$PgfffʍA0L$P*Ȁ0NT$(D$|$  +|$C ;ǋ+ƋD$8;|+f9I;}|$ 38D$tVj0Pz |$ uL$D$4D$$	@3|$4WOGL$։D$;
  T$(V  
  $   Ƅ$   %D$(    |$    t$lV9   FBFt}Q%  =  uyuQu[?0 о   t$tN
$   Ɂ   
  D  2$<   4   Ft$|      t$Ƅ$       L$D$$	   s$            s"?$   ,@$   $   vр?   s,   $, $   ?$   $   :   $$   ,$   $??$   $   t$   D$ +ǋ@T$XD$ ~h|$ uaD$43ɋ@D$DD$DʋT$4Bx!9D$DrT$XL$4
  D$X~T$4|$XJOB B|$3ɉL$ L$4OQ;QrV$      t V$   QPA+P趌 L$4u$   T$(0  |$ trt$lV9
3ҰT$(pFBFu
3ҰT$(VQ%  =  uyuQT$(3t
3ҰT$($- ЉD$(L$D$$D$T$(u%T$(   <   t$4~ uy~ ts|$  ulyh~ ubVt(;d  s ;\  r   ;`  r	6  R$T$,FJBuN+сV3T$|x]|$ t3~"OtF<r$<u
FF$<t+t$  3CD  < 4F;|*N    Fu+t$s  '   "   D|$ D$Dt^t$lV9
D$    `FBFu3@Q%  =  uyuq#t3, D$L$D$$1t$t$u|$
88Et$WfD$p|$pfD$PD$HD$TT$8T$tT$XD$dtjD$PL$8D$Pf7tU:D$Du
D$PT$d |$ t"$<uD7$<ufD7 $<tD$H D$HT$Xu|$ t$Pt|$
D$H   tD$H    ϋ L$dx)Fv"QL$8VD$|D$(ЅF  $   T$(|$H WfD$8tD$D   D$,    D$<t$8D$,D$Xt$fD$p|itcL$tL$dL$pL$PL$D$PD$CT$, :D$DD$XuL$CL$T$, D$PT$d 9D$d|9|$Prt$|$H tD$Dt$ |$ |$ FD$8q O$<Eσyt$PT$4BJƉL$D$HBL$H;JD$rT$(Vt$8  L$)t!D$HBVt$,+D$PPч L$$t$4|$ tCǙD$8 D$ x9D$8r׋z  ~L$	OF L$|$4  |$4Gd  D$$|$3 L$   1   F     FD$Hu3ȍQfD  Au+ʁ?W;WrT$HQ  tGQt$L+WP݆ FuF$vuqAD3gD$8   HtywQ;wr<  G+wRPv D$ptBxDu<  t2   t(΍QAu+ʋT$8;r;s	D$p+։PD3|$4G  L$D$$1Vt_|$ uXʍq@ Au+΁?w;wrQ  3w  GQ+wRP諅 3S~    FD$HtyȍQ    Au+ʋW?;WrT$HQ  tGQt$L+WP= OA;Orj8  GOD.Vu3$ʍqAutʍqAuF@   HQth8W  3lh8Wo  3Wt'GVt$,+ƉP荄 D$D$D$D$D$|t3ɉL$|t$hF_^$$  3V ]ËT$D$2F;0r%j8  _^$$  3V ]ËG2D0%$,  _^3rV ]Ð4H>*\ Rf 									
 .!!!a~`).3USUVT$W~ K  Nu-Ft  t
@$@   F+FH_^][]ÊFD$$D$t~3^3Ճ   ;   ؅   ;vz|$ T$tVt
NfVF    F    F    Ft
t$Fr    d  @$@   3_^][]Ë^tZ3u	USU;d  s8;\  r   w(F$J;`  r6  ;wr;wF$)US7
j SN$   uFtPvWr ~tJ;d  sB;\  rN   FD$_^][];`  r6  NFD$_^][]W$FND$_^][]ÊфtVtfNу~ F    F    F    FttV_3^][]Vt$W|$ǙF x;Fr׋[~T$NOFF_^SVڋT$W ~NNWSQ, ~_^[QL$T$Vq;qrRT$^YÅtARt$+qP ^Y̋T$Vu3p@u+%?L$q;qrPL^ÅtqIP+RQ ^UVWj F@Ptt F@PvW6 ~N_^]Ã~ Ft-FtVtfF    F    F    ~_^]QVWFtPQj 2FtVhjvm} _^Yj jj %V} FtVt/f_F    F    F    ^YVt$W   H;   NtF ~ vFu~= tKpKt
PHV$)xIIVpKtPP_^V_^_3^̋D$t@ø   ̋D$t@3̋L$tQtA A3Vt$WFtVtf_F    F    F    ^Un
 uHPjt9MtIx ʚ;@         @    H@    f@  ]øH;]Uh 3ĉD$dVWD$F   MD$ D$QGxD$D$RP|$D$$    fD$( t$t'D$0 |$ vD$uL$t$|$uL$l_^3N ]̋T$D$L$P>Uh 3ĉD$dVuW}m
 t3_^L$d3=N ]ÍD$ D$    WD$D$VPD$F   D$  ʚ;D$$    fD$(  L$t6D$ |$ v#D$uL$_^L$d3M ]ËL$L$l_^3M ]l
 t3ÍD$Pt$UEVE^]uuuD$D$Pt$D$    D$     D$$    fD$(  =L$$1 ^]UEV~MuD$EPuD$t$PD$    D$     D$$    fD$(  L$$1 ^]ËE^]U    3ĉ$   EVPD$    RD$D$   L$(D$    PL$D$$    fD$(  UL$t'D$ |$ vD$uL$+L$QV5$  ^3K ]̃= tT$D$L$P%Y̍D$Pt$t$U   3ĉ$  S]VWj
   8u3j@t
WHuR  J  =hJ    j fiJ  uh   PD$Pc 15th   D$j Pc t$L$Qh   P@8Ѓ3kJ@=   |3D4kJjJȈjJɊkJkJkJkJF   |uhJfiJ[iJɊkJjJ¢jJkJkJjJkJiJkJkJCuu _^[$  3I ]hJ t
WP$  _^[3I ]Vt$vFj F[ 3^ VP   rThS$<uBÃ?ȉ$<t[   r% =   t=  u  ^Ë^USيUVW{D$\$tC<t?(    {s;sFV;rD$C3_^][]ËK   <uKs RP,1KtȉL$ ȉD$ u   _^][]ÊC<  ;  |$   F   r\h;t!    $<uF?;u   r% =   tÃ=  uO   QÍOL$ D$$  w5  Ë

2$?2(L$ D$$$Y,$y;:    F   rUh;t$<uF?;u   r% =   t=  u   OQڍOL$   w9  $$
,(D$ D$ 
2$?2L$ Yy;AL$\$+C G  ;  <   f     FЍ (=  w-;s)Fȋ?%  @  
эOL$    sfڋ?뀁   s$,@GD$?,   s |$ _?逈|$ G_;4   FЍ (=  w-;s)Fȋ?%  @  
эOL$    sfڋ?뀁   s$,@GD$?,   s |$ _?逈|$ G_;4L$\$+C C   u{ t L$D$=    CCfsKK t>;d  s6;\  r   C3_^][];`  r6  C3_^][]Q$C_3^][]V3Wx<9 t%;s!A<r$<uQAtF9 u_^U8EWVWj )D$$jRP)D$ L$ fD$@|$45 D$ uD$"|$"tL$rW t"D$    u|$( t	L$ 3_^]ËD$_^]Åu3ÍQfD  Au+ʁ?QSVڋ$  t   fHt	 	   fH
  t,Ãt
uHDtj j PуFL^[Y3FL^[YV
  t*t
uHDtj j PуFL^3FL^US]Vu^@
  t'Ãt
uHDtj j Pу3FLUu+^@u9$  uFD^[]ËӋ^[]Ã$   u6j j(*tWW    @f@ fHpU$  EP$  thjjj% ^[]É$  ^[]UQSVuEWP>GDU<؃D}GD[ t$t	ӋW t6F$F   _^[]F$Vt_^F   ǆ      _^[]WtH }:[S]   OVD3fD  >:uA8uFA^ [_SW_rB }4V   s;vf     
 |A;rCGB^_[̋T$u	D$Vt$uF^+;utBxx+uBVW+1;u	u_^xx+uA_^Vt$u
D$^W|$uG_^ËT$~'fD  Jtx:xuFGJy_3^_x^x+̋2҅u2Êtɍ@xũDSD$0   T$LWUV3D$DfD$$ى\$0t$D$<   t$4D$   t$D$    Wt|D$\<u   L$0C      +ǉL$0;}< u;|;¿   M3׉l$T$4T$4;s     t;r3_^][DÊ<-u
D$<<+uً|$,l$(|$$l$(;  t$0f\$X9  ̓0t$0l$(D$މ|$$      T$4;   L$ tsAL$ ;rڅIT$XL$   T$X@   l  |^  ŋ%  T$4;t$ D$8D$@ƋڅIȉT$XǉL$ u|$< t$D$L$  t  .usD$;sf   B|s8̓0t$0l$(L$ D$T$4|$$;r2D$\$Xt$ D$D$l$(l$(|$$D$;
t$ D$et7Et2;L$0fff     ;rL$0@|$$D$    D$;<-u
D$@<+u;     D$XtD$8='  }D$XHL$0ЉD$8D$8'  D$   ;r-j j
WUe D$@ȉt$8+ϋ|$$u#l$@|$8D$XL$ H|$$D$XL$ l$(|$< }݉l$( ߉|$$D$Xu׋di t$V  =3     =V     D$@tQD$X|$l$tYL$Xut$Xω|$|$$L$͉l$l$(D$@L$D$t$ ׋h D$L$t$}^D$@^   YD$@Y   ׋}h Y(t$wwh t$ZYZ\Xt$|$l$tYL$XuT$$L$(l$|$D$@h |$X}^D$@YD$@D$L$T$H;\$4u~t~
_^][DÃt3_^]H[D̃$D$,WT$L$fD$D$    D$    SUVW<uD$8   >T$8      +;}< u;|3;Ãω\$$L$;sGtΉL$;r|$,3\$(щD$8   -u
D$   +uΉL$щT$;s90u;rL$|$,3\$(D$8;   L$<D  D$<,0<	w7ËD$<؋D$8ЃΉD$8;rD$8r)wv"|$ tT$3ۿ    T$T$|$ tۃ ߋL$ ًL${u	;u2|$$ t   $;sD  t ;rD$83k;   ~   KD$8   3D  }8G+ЍtAL$8L$xE\$ L$t	3Ҿ   st   _^][$Åɸ   E_^][$_^][$̃SUVWT$$?0   G<xt<X   0W   fD$t$u F<>0tt$>ދl$tFt$**ЀT;Củt$t$D$D$L$$)A<; u+ރ
3_^][ø   _^][ËǍp@ @u+Ƌ%?jPx_^][USUVWWl$fD$D$    <-   D$   YA7  0uA90t\$3|$)Ѓ	w ׋E|ԃ
   T$+ʋÃ    |   tߋD$8   _^][]<+]<0WQxt	XFQq.3ۀ0u	VF0t3t:fD  }+7*7G*ȃ7uЅx7u]    _^][]_3^][]̃SUT$VW3W] fD$tc|$L$Ѓw2ru,\.FutuD$   _^][ËD$_^]     3[̃ 3ĉD$D$3SVف   ֋T$   S^ɀKɀKɀKɀKɀKɀKɀ	   ʀK[L$3n2 W3fD  ʋɀL<Gud$xL4[KyL$_^[3 2 ̋T$Vt$w8rw   ^Åw!r?  w   Q^VR^VWxW_^ÊFS؄x$ȋÙ[w_^Fȋс xG    ډ[_^F؋ˁ xG    [_^ËUn݄x3][G_^FȄx 3][G_^F؄x 33?3][G_^F x3][G_^F 3][G	_^̃VWJx_^RЄx ʉ_^ÍT$L$3;T$u_^_^̋L$Vt$W   t@ Gu_^̃SUl$ڋŉ\$+VW RPZMtV3~C\****
ڈ9\$;|ƙ+8 _^][QSUl$VW|$s|7r1|t+;|Q;rK׉3s_^][YÅ|s      +D$΃D$Ń ;|
L$;L$v_^]   [YQT$D$u/=   u(Q|r   YÃ    3QYڃ PRYQSUl$D$VW|$0X|jtZUWhj W ;   |;   UWh   j W ;   ;   UWSVEY L$3Q_^][YÅ|s܅|(tSVh   j W ;|Y;봅|su   t=u   t1UWh   jhW ىL$˃ ;s
9D$g_^]   [Y̋L$(   D$wErs3w
rs3
uWrfEf
fÅu=   v(wr=   wuv
wrwfEf
fɋV
   Wgfffusurf<~_^ÃЃ f|J_^W    +ʋ_^W ̃SUVWT$tEG   l$D$U_RSc u8+tt;t$}T$֋_^][_^]3[SVW{sC    tU= tBpKt
PHW$)xIIWpKtPPWC        tbpK= >t=t
PHV$)xIIVpKtPPVpKu_^C    [QSUV       W=   F;7p  XJtЍ    j Pc\Jtх=  wtX= tEpKt
PHV$)xIIVpKtPPVUo$D$    Qj UeB OG       Q3t D  Rxiy7uƋ3t$4    t5tV3@NtBABtJ!OJGGtHA    O˅h   _^][Y_^]3[YSYUVWt=E 3t#     vxiy7u31|y3ҋYD$ttAGK+     ;uu_^][xx+u@Ջ?u_^]I[USVD$WP6GD$   E   OtFtGANtD$9|uA	= tEpKt
PHW$)xIIWpKtPPWFuD$_^[]ÉG_D$_^[]Ã}    j jLE   _GVBV
r@;v8ҋyt+3Ʉt[xiȱy7u36T$FtJЅtCtJ3@zt,AGAt83y_^[]É~3y_^[]ËFFtxG    ~3_^[]S\$ue3D  p2tl2|2tx22t22t22t2<=  r3[VW33h2@ :utP:Quu3tG  r_^   [Íp2l2u	p2L$_D^3[S\$VW33D  h2ˊ:utQ:Puu3tG  r_^3[Íl2_^[S\$VtIW3h2    :utQ:Puu3tF6|_FP}vl28 uF=,6|^3[Ívh2^[USUVWj j jSj h  4   ,?j UK   Uj V< WVjSj h  4uf9tRpKt
PHV$)xIIVpKt PP3_^][]V3_^][]_3^][]USUVWj j j j jSj h  <5   RUh   Uj V; j j WVjSj h  <5uf9tRpKt
PHV$)xIIVpKt PP3_^][]V3_^][]_3^][]̃VWj j D$D$    Pj Vj h    3   XJtЋL$\Jtt$4VhEt$Wt}= tNpKt
PHV$)xIIVpKt8PP3_^V3_^VVhEt$ Wb_3^́    3ĉ$  SU$  D$V$  WD$ P  %E38D$tLt
t@| u=  s=D D$PRUS$,  hEW$(  _^][3     % QS\$VW3o  s2ufF}#jd 5s2tC    3_^[YhҴ  sh\F3й
  _^[YÃ D$$L$4S\$4P4Uh0V3L$T$W;n|;sh@,|$<ÉD$Ǚ;T$!|;wWt$t$@UM _^]3[ +\$8Ut$S7M L$Pݙ+l$@D$4|$<\$8l$@Wt$,fD$l$$L$(@ L$QL$DQWSp4   3&tu3;5t:}<t  t!t7t@tyt=  uF8P 5D$4뎋L$4h  qA
  hhF~_^][ Åt'F8h  ƙ+PhFjD$@;+Wj P7 
  _^][ ̃S\$(WUl$0Vt$,%W3fD$|$ \$D$   D$, L$QL$4QVPD$8pH5uR3;=t:   t$ t!t7t@tyt=     G8P 5D$,,L$0ta;w]ى\$ %D$D$,+D$,]t'G8h  Ǚ+PhFj_^]3[3tL$(ЉA't'pt"h  q
  h|F_^][h  q   hpF_^][U   3ĉ$  SVW}39w$~3_^[$  3 ]ËG ~)ȋMR]PމL$SQG )D$ډ\$ED$ED$9w,t_0G4WfD$D$\$ωD$+  D$%j D$(D$(Pt$w4   3D$   wL$(Q  GD$, %E38D$(t!L(t
t@|( u=     D( D$(PRhPFt$$hr  hEh
  WF͵  *w4u63Ё  t&WFҵ  PGPQ
  u.D$|&t ;D$|;\$vjjPS  $$  _^[3  ] Vt$F,t4j P 6u'3h.  v
  FhFU^v3t3^3h=  v
  FhF^QVW|$D$Pw3T$D$3΃ Pu-3t#hf  wЉGhF
  _^Y_3^Ỹp:WVWfD$D$D$D$    Pj h  j wD$(    $5u.3=   thŶ  wЉGhF
  ._^̃D$ Ul$ VW3D$    M   щT$(;|	_^3]Et|_^
  ]St        f     p:WD$KD$fD$Pj jj juD$<    D$8    4t$u;3ttj 53[_^E   
  ]Ét$D$0   tYp:WfD$D$D$Pj h  j juD$<    D$8    4up3E3D$0\$,|$ t;u6p:WD$D$Pj jj ufD$(D$8    D$4    $52  ]3[_^]ËD$0   랃uUtp:W@fD$D$D$Pj jj juD$<    D$8    4BD$0   D7/ͻ   Gp:WfD$D$D$Pj h  j SuD$<    D$8    4t   3][_^]3D$$    p:WfD$D$D$Pj h  j juD$8    4u3]   [}_^]̃Vt$~rD$ ^    3áp:WW@fD$D$D$Pj jj jvD$0    D$,    4t8p:D$Pj jj vWD$,    AfD$L$$D$(    $5D$$3Ʌ_3^̃SVt$ W3^   p:WfD$D$D$PWh  Wv|$0|$,$5|$(unp:WfD$D$D$PWh  Wjv|$4|$04u63h  vFhF3й
  3r9p:W@fD$D$D$Pj jj vD$0    D$,    $53D$(urD$(r:p:WD$D$Pj jj vfD$ D$0    D$,    $5D$(F_^[UEHSVWm  DE$EEHE3_^[]ËEHE3_^[]ËEEH 3_^[]Ëu~  &  D$PV  MI;L$  
;T$  QRV_^[]ËUM2yA3_^[]ÊAu$A3_^[]A3_^[]ËUM2yA3_^[]ÊAu$A3_^[]A3_^[]ËE@phEM3_^[]ËM~t:t:A~83_^[]á8A3_^[]ËEHE3_^[]ËMT$D$    I     UL$
_^[]Ë]{;|;vЋ|t3uF8N<K;V8u	;~<~$ ~4 V8~<
~0   jj  _^[]ø   _^[]fBBBBC7CC{C4DcD DE 	
̸   ̋D$@̃SUV5IىT$I\$W  ~\   t
PD39~L~*fff     FTt05FT42G;~L|FtktfN3  v2uHG}jd 5v2tF    'hҴ  v$h\F3й
  +~\$|$ t$XJtj vS  \JtЋFdE ~TtX= tEpKt
PHW$)xIIWpKtPPWpK= tCt
PHV$)xIIVpKtPPVndu H_^][̃VWD$D$    Pj jD$    j jWD$,    wfD$$4   P tQD$GQPj jj wWD$0    fD$ D$(   D$,    $5u	3GX  _^j Gj POD$    D$D$   WD$    Pj jj fD$Qt;$5u	3GXhy  whF3й
  _^$5u	3GXD$D$    Pj jj jwWD$,   fD$$D$0    4t3_^3GX   _^̃,SUVWD$    j j|$ l$  WE wtNFu+?~yj W֏؃"  Wj S`& |$$ChCwh GPFPAIt
PH5I   {V+D  
;u_um9   pKt
PHS$)xIISpK  PP
  xx+uB끋vdi|$CICd= D$     ItI+
 t"    
     S  j @u
     hGw$y
 tj    C 3Ƀ3ɍD$ Pɺ    EPCPs7  t#h˹  shG3ЋF+|$ uCPD$   =     l$D$$D$4    Pj jj sWD$@   fD$8D$D    $5u	3CX3= tEpKt
PHU$)xIIUpKtPPUIt
PP_^][,Ël$|$Iu F\ot
PPt
PHF`En`t
PPD$_^][,Ã= tSpKt
PHU$)xIIUpKt!PP
  _^][,U_^]
  [,S\$Vs   W>t
PHG`O`;tfH;uF= tBpKt
PHV$)xIIVpKtPPVC    t
PPItPHIG\_uT$KIt
PP^3[̋D$SXU  +  L$(   Vt$(Wfff+E t
PHL$4E`   D$(    tfL$(;tfH
@ufL$(D$(#fucFxD$     D$WD$fD$Pj t$8D$(    j u$5t33EX   0  f!{f!{
!  3f!{f!{
     3ɉL$(t&     fx   fH
@fL$(uL$(#fuXFxD$     D$WD$fD$Pj t$8D$(    j ju4t33EX   u~f	{
x3f	{
pt    fxuZfx
uT@uFxD$     D$WD$fD$Pj t$8D$(    j ju4t3f	{3EX   E t
PP_^][]
  [̡ItPHIt
D$%PUS]VW3su$  s6t
PH~Q t  FQ]9^L  MCNHL$QD$FPt,Mhں  qh$G3й
  sJ  D$9T$8|9D$s0} -  RPFPtMh  qh0G롋FTD$$
   L$   j P_   3ɉFTFPM   L$3ɄM   L$9^L   j t$j Qj v2؅tONL3M5IE+PQj t$ S4t$VLNTDNLFTFL]L$9^L~83Mh$  FXq
  h<G2tS2]9^L~ËNTE35IT	
  3ҋE~P t
   Dt
PP_^[]VF,tGP05u'3hU  vЉFhHG
  ^F,    F0    F4    F(t9P2u'3h`  vЉFhXG
  ;^F(    3^̋T$SVT$L$WL$~$   )|s#D$PVt	
  _^[ËT$L$~<F8;|
;vȋ׋=H3O##u9F4|9F0v;~0u	;^4   j WSjj v2F(u+3h  vЉFhhG
  G3_^[Wj j jP4u;v(2F(    3h  vЉFhtG
  3_^[ÉF,~0^4_^3[UVuW}    ~< |B~8 v:~, ujju$EMU9V4|9F0r
F,F$3_^]̃|$ t
D$H$3ËL$3́   3ĉ$  SUiVT$W]ÙRPԃ  Sj W^ ED$tj@t
PH5Ho  ΍AD$@ Au+L$?$  t1/t\tAM;   tj@t
PP= tEpKt
PHW$)xIIWpKtPPWD$D$ P  3 38D$t&D  Lt
t@| u=  d  D D$Ph%hGj h  hEj(     VhEWU޲,  j@  PP
  tj@t
PPm    j PD  m    Pj Ve VU3   9tEpKt
PHV$)xIIVpKtPPVpK= t@t
PHW$)xIIWpKtPPWhP  j hG3й
  5  6D$  PhEWU]= tIpKt
PHl$U$)xIIUpKtPPl$UpK= tAt
PHV$)xIIVpKtRPVpKύqfD  Au+΁?  D949</t<\tD$A@;  f\ pKύqAu+΁?A;   = t@t
RHW$)xIIWpKtPPWD$D$ P  3{38D$t!Lt
t@| u=    D D$Ph%hGj h  hEj訰     hG+PSW߃KCu+ف?4Vj襰   >   D  Fv3l3҈FFl3҈FFl3҈FFl3҈FFlFuD$fL83  = t@t
RHW$)xIIWpKtPPWD$D$ P  338D$t)     Lt
t@| u=  ^  D D$Ph%hGj h  hEj     = tEpKt
PHV$)xIIVpKtPPVpK=    t
PHW$)xIIWpKtaPPU= tEpKt
PHW$)xIIWpKtPPW
  $  _^][3      U    3ĉ$   EMVuD$ EL$DMWD$t$4D  D$0D$,    D$    D$8D$    D$(D$Lj@j VD$, F39t$u!L$$T$Rv  D$D$0D$0D$  W3)D$P)D$`t$p@ L$PQj Pt3uJ3;5t:}Mt  t!t7t@tyt=  u(F8P 5D$뤋D$Pt  |$        D|$8 D$<t   t$3D$hGt$e
 tj    / 3Ƀ33Ҹ   ɹ E9T$(   D$@DʉL$DD  j QVj Pt$Pt$$2   |$  tGXJD$(    tэD$(Pjt$t$0  \Jtхu9t$(uat$3L$;t:}Et  t!t7t@tyt=  u AL$8Q 5D$@L$D;D$,L$t'A8h  +PhFj>  = tIpKt
PHt$V$)xIIVpKtPP
t$pKt$tS= t@t
PHV$)xIIVpKtPPV|$    |$8   Mt$4D$M_= tIpKt
PHt$V$)xIIVpKtPP
t$pKt$tm= tZt
PHV$)xIIVpKt-PP  _^$   3 ]V  _^$   3 ]ËD$4   T$,hľ  PD$4PhGYh-hž  hhěj軨   _^$   3 ]ËL$Ht39D$ @= D$$ptKpKt
PHt$$)xIIt$pKtPP
t$pKL$tZ= tGtPHL$Q$)xIIt$pKtPPQt@|$L t$4D$$F~tNE   t5hGt$m`
 tj   8+ 3ɃtND$FF    F(    F,    F0    F4    F83N<_^$   3 ]ÅtX= tEpKt
PHV$)xIIVpKtPPV
  $   _^3u ]ËL$SUVW33,؅u
  _^][Sh3tn   S2   3;=t:}it! t!t7t@tyt  uCG8P 5Sh3u3t
   u
  
  t#hq  t$$ֹ

  hG1-3t'G8hs  Ǚ+PhFj耥= tPpKt
PHS$)xIISpKtPP_^][S_^][Ã4 3ĉD$0D$<L$DSUVL$WD$t$u
  _^][L$03 4W3D$|$<D$,fD$Pj Vt3l$P؅+  3;=t:}=t! t!t7t@tyt  uG8P 5t$뗅t'G8h  Ǚ+PhFj      = tIpKt
PH|$W$)xIIWpKtPP|$Wh  t$ֹ
  hG_^][L$03_ 4Ët$D$%u9l$8u9l$<uD$|$|$= tEpKt
PHV$)xIIVpKtPPV t
t(u3ۃËD$L$@_^3][3 4ËD$tu   3USVWL$?/u+_t:t\u8_u?u8_uGHtD</t><\t:t:t(I9MWLMj\RhGuQ3_^[]ËW  j j j V3u~9tEpKt
PHV$)xIIVpKtPPVh  WhH3й  _^[]ÃD$j PD$o؃A  t$j S j St$V3   9tEpKt
PHV$)xIIVpKtPPVpK= tQt
PHS$)xIISpKt$PPh  WhHSh  WhH= tEpKt
PHV$)xIIVpKtPPV= tEpKt
PHS$)xIISpKtPPS   L$VhEuI9MLMQK= tOpKt
PHV$)xIIVpKtPP3_^[]V3_^[]Ã= tRpKt
PHV$)xIIVpKt PP
  _^[]V_^
  []Q= S\$Ul$Vt$ W|$ t<j@D$t)PHVWӋt$P_^][YVWӋ_^][Y̋L$Vu^WV4= tIpKt
QHV$)xIIVpKtPP_^V_^t$3T$Yt$t$3t$,3U 3ĉD$S]VW}Wj S\$ D$P333@ D30FD;L0A3;LD0A3;LD30A;L|8330F;L0A3;Lȋ0A3;L03A;L3L$301Nt$;L302B;Lȋ01A3;L0113A;LD$P4T$3D$0F;LD$0A3;LD$0A3;LD$0A3;LD$0A3;LD$0A3;LD$0A3;LD$0    L$$;L_^[3l ]̋L$MbV  V 5i  ^̃$P3D$3$j h'   PQi L$ 1  3Q̃$P3D$3$j h'   PQ  ȁ1  g ^PD$ 3V3T$~t$^̋D$SVWp~4    = u3j@؃t
SHI3Ʌ   =IU94,    t
A;|   NtQH=II~0usI/uctU= tBpKt
PHW$)xIIWpKtPPWI    ]t
SP~F~t
PHN0~0    F$t\^tU= tBpKt
PHS$)xIISpKtPPSt
PPt
PD= t7pKt
PHV$)xIIVpKV3_^[Ët
PP_^3[̋D$UVWpFt
PHL$|$l$ ;V|Q;vKQj t$ ;n|;s+PFPt$Y Ft
PP_^
  ]ËFQPt$, Ft
PP_^3]UED$ESVWp}Ft
PHN$tFt
PP
  _^[]ËE؋߉\$ED$;F   ;   ;F|w;^vp   ~     VN;|   ;   ۉD$;|;vىT$NPShu
  rFD$^\$FE;F|;v+PFj Ph D$FuFuP Ft
PP3_^[]ÿ   Ft
PP_^[]̋D$VW3pFtPHFT$L$;V|;v   Vt
PP_^̋D$VpFt
PHD$VPF^t
PP3S\$Ul$VsW3;ku_^]3[ËFt
PH~(F$t   I{@9~,t   7F,   +Cu~~,9~,t   F(~~,N(kFt
PP_^][UEVW   pFt
PHEuv6vhlHM<$u9U>J;N|;s|sFNNǉFNJ3Ft
PP_^]̸  ̋D$VpFt
PHD$D$T$;V|;wF$uNF L$3ɋD$F^t
PP3ËD$VpFt
PHN F^t
PP3UQEWUSVf @    W{  OD  Gu+?Y  :/P  8u3j@؃t
SHU3D$9I~X    I4ʋF4f:utP:Quu3   D$U@D$;I|G;j P`m  IIj    P]dȃuy94  pKt
PHV$)xIIVpK   PP   eFt
PHF0   Ij8j V4@II F$   FGPuNN8QN4 	 t	F    j @FuxI= tEpKt
PHV$)xIIVpKtPPVtISP   _^[]PF0   HtOSPCj j8_u   _^[]j8j V F$   FNUMrt
E   Ft
PP_^3[]̋D$     3t$hEt$t$3̋D$@D$@(D$@D$@,D$@D$@0D$@D$@4D$@D$@8D$@D$@<D$@D$@DD$@D$@HVD$D$    PjRQ?
 uJD$8u>pNtQHD$39N4ED$NtQPD$^3^U  S]D$    VW}ύGD$ud KD$u]GUtB7  L$   qt
NJEto~_^[]ËӉD$D$wD$N8x9tctuӹSOtyӋ}D$Z}R>^u	 t3_^[]SW_\t6vW{ _^[]Ë DD$,Q  @Sh|H@$D$&/  j D$(Pj h   jЇ = tFpKt
QHV$)xIIVpKtPPV  \$$uhNjF 9;uhPNj1   3t%h-hS hhěj3  D$@t
PH    G|$2  C L$;   j QD$0   SPj訆    t$|$0:   |$:   :   t$0t$CNFCKNF   K         ΋                                 + F$       r q S |$( |ƃ   
    |$uScD$$  u33Q%  =  uyuyt3	4 D$S|t@\D$xW uzu3>ύQAu+j AL$PD$ _D$(tt$WPG D$4L$։C|cs$D$@t
PPdt3K     C|    s$ҋ@t
PHKxt3f;   r   A@   PA$t1y9t蒘 &ty t識 WfD$|$t$S$yW uu3bC$@t
PPD$WVRP Mt1yEt3\  	 t3L  WVW|$4  At
PHKxt3f;   r   A@   PA$t15t菗 $ty t謗 D$WfD$t$t$S$yW uu3aC$@t
PPD$,   @ D$,;|jt$\$    j L$D$    QWP   ЃSuD$pV j VX D$ t6j  D$,G;|$~\$$|$A3u3hPNjGh-hZP hhěj,_^[]ËFt
PH    |	    v	Ӌ    D$    r D$ ~W T$utj`
 _^[]_^3[]U   SVW}3ۉ\$Gt
PHUOuUt_GHD$1x=UtD$t%uUSt,D$HD$yŋȃ}L$tD$     uhH)uD$     j D$Pj h   jʀ D$9tBpKt
PHV$)xIIVpKtPPV9\$o  D$   \$\$   uhNj,!; uhPNj   3t2h-hS hhějD$        D$@t
PH ?  D$@D$2(  C L$3   j QD$$   SPj (  t$|$ :   |$:   :   t$ t$CNFCKNF   K         ΋                                 $ F$       ro H Sb |$ |ƃ    }D$@t
PP   e   D$   X  u[D$$  u33Q%  =  uyuqt3	ߞ D$S|tTD$xW ubu3B΍Q@ Au+j AL$PD$$XD$tt$VP D$$L$׉C|)\s$ }   C|    s$Uu
D$   ^P3EMBEE JMJBJB=;ǉ|$}|;s
BD$BE$B$t$\$u   D$u,hPNjh-hZP hhěj覂uHtQHD$    |	    v	Ӌ    D$    r' D$ \$T${W utZ< 
 t[E$tU= tBpKt
PHV$)xIIVpKtPPVGt
PPD$_^[]SVZW;   ~ t!~3ҋ3ҋtڅtb~ u=  w˸   _D3    ^[øMbk}C+ЋDt}   f;tB3Du_^3[_^   [QSUًVW  M;  ^  fstL3ҋ3ҍ<_u,Sh   N؃tNh  Cj Pm 3_;  w;     MbEk}+ȋDuC|:_   _^][Y;   A}#ȋDt;u3_^][YËC>   j h  CND$u   _^][YÍSh  }   j R Mb|Sl$3T t	F}r3P_^][Y@C3l_^][YË̓DD_^]3[YSU   M{ Vt#s3ҋ3ҋ\   { u݁;  w̓^D]D[W|$Ch  }   j P t$ 3C    y}fD  t1E;t*BC3| tB}#Ѓ| uDA;r_^][Sمty{ tVWs}   vu_^= tEpKt
PHS$)xIISpKtPP[S[U SUVWT$j h   t$ Kth  Ej P u F RWKt$ tWj VI 	 t3|$j h   KD$J  B  Q  L$D$    J  3Cw*$D$D$$   LDQL$DD$D$$   Pj}T$$D$3L9LNL$$|$|$,T$z׋   22   ׋w   |$= f  pKt
PHW$)xIIWpK0  PP!  t$ǃt$$|$,L$T$͍R؋3ؿ   +\$] 9|$1t$$t$t$(t$t$,    ׋ЋD$DD$,Dt$$D$θ   t$ ҋL$DL$(1    3;u&Gt$$t$t$(t$t$,;|$~t$ \$tWtj= tWpKt
PHV$)xIIVpKt%PP_^][]V_^][]22̃SUVWt$    G PG(PVluE_^][Ë_y<GGR VRP. ؅| ʚ;v ʚ;D$    t$SUpG,t
Po,w_^]3[VW|$WWwFfF >FF(Ff    NVfF   _^Vt$F8 uV^Af@^̋AHfA   AQtz  t|j 1r,|9JuA$BA$Vq tF$Bq$A tF 
uB!A$    A ^tH$z  JtB!z 
u	AuJAtN%  fAt=AfQA$    Q tJ$x  Ht@!x u	AuH̋QV9JuA$BA$Wy tG$Bq$A _tF 
uB!fA  f#ffy fA^uAx  tj 1p,|SًtyUVW  P9BuH$Jx H$tO$Jp$H tN 

uB!fHf#ffx fHuHy  tj 0q,|u_^][VWVwG7p,GwtptlO9yuG$AW G$tB$AW$G tB 
uA!G$    G tx$y  ytA!y 9u	Guy_^SWC,t[tVq 9yv/΅uC,^u)9{t$WjPxtsW0    GPs,_[U    3ĉ$   SVWh   D$<j P    D  KË3    T8tFt$@ J;HsVJuFHu؉D$ D8    G|D8u@$   t$J;HsVJuFHu؉D$ $   QL$8   T8t>t8t$A;BsNAuL$ VBuԉL$ G |_$   ^[3 ]SVW;=PI   dItRHdI5hItOlIhII3lI;XI|IpII;GAII;ȉ|IGIt
RPusǙRP0Bt`V$dI؅tRHdII;IGˣII;ȉIGIt
RP_^[V   ;5\Ird;5`Is\dIt
PHhI|I3lIA5hI;XIlIpIdI   PP^WV$dItQHdI)=I_t
QP= tEpKt
PHV$)xIIVpKtPP^V^USUVW~<0  9~0   LI   N   XJt
ҋNLI~n ڋFj QRP ;|
;vSW*@\J~@tЅt?W$~ NύA 9AA   F<AA    ~N<uԋ~<uftXJtЋNN؅t\JtЅu
3_^][]Ë~G G3GGǋN_^][]ËOǉN<G    N_^][]USٹ   UVWC4\$4 ;Bt$tXJtЍ<    j W>tWj U {4 t\JtЅ   39{4v?fD  K8t%\$fA3qD AL ΅u\$G;{4rˋt${8tg= tTpKt
PHW$)xIIWpKt"PPk8s4_^][]Wk8s4_^][]SUV] C;Cv|Ws0f~ upN3ҋFANFAFF    H,~Fw4G8;t	H;u@O0f~ ~tG<Fw<GC;Cw_}0 uju@tc= tBpKt
PHV$)xIIVpKtPPVE<    E@    ^][ÃSUT$VW}$M4+;s3ǋ3T$T$FD$E8t$tof9Pr[M0HPtHQPHJH@    I,fx ptN<T$HF<FFT$Xut$;t$tF3u4T$h_^][jdj hI tt@HI   t2j@I= u3j@dI=HI tt
LIt
LI    I
   3DI   jdj hI UQSVk5HI4WDƙRP2;   Vj W =HI t_DC
   If{" u   fC"CC,C0MEuO GG3G|tG
   CC
+C
C_(_4 uW  3_^[]Ë_^[]S\${ tICV3W|$V+  ;G+S:F+F
F{_^S [[̋L$y tVW9wG    w_^̋D$@0̃STIU-KVWT$pIO0+O,|$7t$u3;Ns$;O stGG;PI~Ņt9O,s
_^]3[ËG0;G4rpITI-K    v0f~    G0@;GstGG;PI~Յtp^3ҋFs4C8;t	H;u@K0NFANFAFF    H,^C;Gtzf~ tC<Fs<C3ҋσ|$t;L$3ҋG0w4NG8FF~F         G84;O$vO$_^][ËGL$+CA̋L$3Vt$v4F8tfD  9Ht@uD$t4ыP"^ËPt H^QPHJH@    I,3^̃|$ Vu)t$B;BwL$BAB,AHJ,F,^ËL$3ҋqAv4F8;t@ P;u@N0fy qtF<AFN<^Ë	~F^̋D$3VW|$t$w4G8;t
H;uF3҉L$w4NG8FG84;O$vO$_^Vt$W|$;~$w׋GF$_^Vt$W~0 >t	3ҋF)GFO)G+O
Oj~@tU= tBpKt
PHW$)xIIWpKtPPWpK~8tU= t=t
PHW$)xIIWpKtPPWpK= t@t
PHV$)xIIVpKt_^D$%PV_^W|$tV@ O28օu^O    G   G    G    G    _7QVWFfu'Nj h  ;td?   FANfFAFt?|$T$9QA    Ft;P|;8w	  f!VHN_^YÉNN_^Ỹ$SUVWfD  iZ92;+|;w%;|;sHIu։PD$_^][ÉPruD$_^][́    3ĉ$   SUVWh   D$j Pu tHD$3nF    t*\$fD  ֋7G    \$utuD$   LttыF(rዌ$   _^][3 Ĭ   QVNtD$PD$p2FVtӋD$0^YVW7u_3^S~*Z7t/FӋFω[F_^ËNƉF    F    [_^QSى\$CD$C    C    D$   VW3 ˋ؋CD$Kt$u3LG~-׍L$Ct$t1FL$F׉D$&FFD$F    F    ƹ   CD$u_^[YQSUVWGuuOGfOWt^   JBNGu=tD  O2v4օu    G   G    G    G    _^][Y_^]3[ỸSUVWD$(;G<  GD$&  Gwt$uD$_tvsKL$   NtD$ PT$ D$$pt$NVtD$$Pt$$T$L$C    2t$D$uGfu9Oj h  J7ȃuWCKA?   GwAfGFGD$0t L$    F    F    yFfOG    G    D$(G_tA|$4t$0Ct+fD  P;|;s@;|;v@uۋ[u3_^][_^]   [̃y, tǁ   Ày 0E   ̃  3ĉD$SUVWًL$QS @Ћȃ  T$  t$	  L$ @RVjQSЋȃ  t$;t$4  l$D$D$;  |;    L$T$ RQ@L$jQSЋȃ^  D$T$ȉD$D$PRjD$0PASЋȃ)  T$$;  B;  T$D$+PRVAWSЋȃ   D$؅torjW҃Wf     fnf`fafrffnDf`fafrf;rf(fsffsff~33;s9+r%ED$f+D+;L$r;s+؍3Df8  3_^][L$3ܪ  _^L$$][3Ǫ  USUVW      ʋ   ;F3L$9nh~*3Vd׋BBuFPNTBJE0;nh|ދ   ~PWnTfD$tj R UWN +    l$|$~ ~PnT~Xn\u/~t)F@tPA0Ѓ   uWfC    KC~4Wj$^l$ȉCF ȉC   ȉC   ȉCEPCj P| 33D  ;   s#vTFDvPUSPAЃnPVT t_^][]̃$ 3ĉD$D$0WSUVWD$D$DD$T$_P   oTfD$ L$t'1j V US +؍   T$ރ l$$\$ L$	3ˉ_PoT;D$<(  |
;L$8  u
;_Xu;o\tmGDT$ USjRPAЃ  L$ p;us3%:uA:BuA:BuA:Bu3  WD˃Ń 2PQjD$PFRЋȃa  L$D$ȉˋWDŃ P2D$QjPFRЋȃ*  D$ˋWDȉG4Ń 2PQjD$ PFRЋȃ   T$D$ȉGPGT   WD˃Ń 2PQjD$$PFRЃ   GDT$t$΃ USjRPAЃ   L$ɉL$u
   L$   {    rv   wn   wfAu_FuXjT$  ȃD$0GPWT _^][L$3警 $ËD$ GPWT _^][L$3苦 $øe   L$,_^][3s $̃$SUVW3ɉL$  {  sD9  C3tfD  EȊ/uL${ tWKPWSTfD$ t4   j  L$VRQT$$ L$+ȋD$΋sD D$$L$ KPCTST   KPRQD$(L$L$(jQ@VT$,Ѓ  L$SDD$ P2QUWFRЃ   {DȉD$ řȋL$L$T$@T$ RQjL$,QWЃ   D$|$ϋsDȉD$ D$ PQjD$,PBVЃutCDT$ RWjhPAЃuOECPCDSTT$(RPAЃu.sTSP9t$,|"9T$(vCDVRPAЃ_^][$3_^][$SUV3W9^h~3NdL9C0;^h|~ tFH8u~Ht@WЃ    ~dtU= tBpKt
PHW$)xIIWpKtPPW_Fd    Fh    F8    ^][QSUًV3D$3W9sh~-3     Kd;D9wL9|D$F0;sh|_^][YUSUVWN<F<       tb, t)+ uGj	jj PA8ЃG, Gh    G/ G(f   + uOjjPQB8ЃfG({~ uyF@tPA0Ѓ   t	F$<t~Dt@WЃ    F@3ɋt8Nuj PB ЃȀ~tF FFt
~uFF ~, tg~ u-FlF`t@   @,u   3F 2	FD8 F~ tF@j j j PAHЃF,    _FP    FT    FX    F\    F ^][]̃y SUVWu   _^][Å   A@8       3]y0EER VRP ؅| ʚ;v ʚ;M tI Gut+d   ʋÙRPQVW 3_^][33_^][_^]3[̃SUVW3~s~s
3_^][8nDM   uAUЃ} N<~<~0  F<uKFPFTt<Aj j UЋH  8F?  N
VDtQR@Ѓ!  3  <tI~ t<u?A^UЃ}   V	HtR   Pу   3   u	8^u3   FP3FT         T$utE QQj@hUЃE j j U@Ѓuh8FuFDV
RPAЋuGl$|?t9FDT$RPAЋu 9l$|9\$vFDUSPAЃFT    FP    N<F<    F0    ui~ l$uDՋ*u7   t  D  f!P@ uAAV   1   V   l$   t1{, tD{+ uCj	jj PA8ЃC, Ch    C/ u<t8V9V$v  u#tF@tj jPA(Ћu338Nur   t58K+tBSK+K(jjQR@8ЊS+tC+3Ʉu3F@3ɋt"8Nt3jPB ЃȀ~tFFFFF D_^][UQVF<tCt?<r)XJtЋ=  \Jt Ћ^]À~ uj 3?^]SY4   VW   33~G   =  |'f     8     ~ٍ7_^[_^[U} SVWT$   D$twDwHrL$$2t$$j@QVЃ  D$\$ ˋH QR   @t$VЋt  Eȋ   T$   
L$$BD$ Ɖ
BL  ;   @  ;_.  EtӋ  } tLt$ L$ T$(t$(jRQ@Ћ  D$$ȉD$$9uuT$^;D$$  MtV  uD$Hf9   t
f       t3E   j Sp,xЃu3&J   9 uRӋF@fA} L$    uT$B;G\|   ;GXw{   W@T$$tmWsuat]      CVj P! RPD$,Vt$w@@Ѓ;_$v_$O`tSt$oR CtAt3놃} u/u2OD$jP   SWЀguWL$w|$ tG   D$t$@PD$05    t$ЃuD$$@GpL$_^[]3_^[]øe   _^[]̃$SU)VW\$ uƙRP  Vj W Ej h@  WSUЋEǉD$3  L$,QW@Ћ  EHD$,L$(T$0RP؃\$up      SD$,j j PHT$(ʉL$$RWAЋX  D$,L$ D$,D 9t$0  9t$,   @ D$$PE j SUЋ  9D$$   PEh@  t$SUЋ   t$(T$L$L$t@QЋD$        D$8 t2L$ D  :utP:Quu3tju3ˍQAu+ʁ?Cً+D$;T$0
;D$,t@WЃ    Etj t$$UЃ3\$= tEpKt
PHS$)xIISpKtPPSt@WЃ    = tPpKt
PHW$)xIIWpKt
PP_^][$W_^][$_^]   [$̃$SUVWډ\$ w@  Os      L$,@QVl$ ЋřPUj Sl$,D$$ T$(؉\$$   D$,L$0;u;u_^][$;|;vG@RSPAЃcD$;]|;wWl$   Uj Sd G@tT$$RjPA(Ѓt$$+t$D$(D$O@PVUSQBЃuD$ G$_^][$_^]3[$V~ u\F@tPA0Ѓ   uCN@@,t*QЃ }      ^ù   ;O   ^ø      ^ǆ      ^̃$SUVWD$    T$3ۍT$,D$    RD$(   D$,GDP\$AЋ.     ՋOD@@P
  8] tD$ PD$(VUP@ Ћ  9\$   l$D$PD$_PPt$8wPՋω^t$8l$4_       l$   u1t$,T$0+󋏨        PQRVٽ wPl$uH9l$uB3ɋGXO\;u2;Nu-t$,   +T$0WT   PQRV芽 l$9_PwPu1~ u+\$ϋ   wP_9   s   3ۅt]D  |$$ t-GlG`t@   @,u   3dD$$    j jj ֋u[D$wPC;rwPT$D$PD$Pt$8t$8(\$3eEu;jT$,	  'euD$,wPL$0N띋\$
  ǋ\$GG      ODD$(hՋ@@P   G<suGG@tj jPA(3Eu[3 uO
W@tQR@Ѓu63ҋ8U j u8E t9D$ tD$(Ջω0|$ tt   ShHh  PE_^][$USUVW]E3҉l$\$T$   D$t!T$R`     T$D$D$tR      ABq%   J؋>C8 ;RPGOUl$$uVЋ\$09       WHj P K@RPW1uQFЋȃ3
  DȋD$8u$t(Cp_^][]ËE@Cp_^][]S\$VW3   Wt$p,xȃ   q   9>uT$Q-@fF   f~uZFt9N9quF$AV F$tB$AV$F tB 
uA!FjHF6p,| u   Vу$  C`t@   @,u_^[QS\$Ul$Vt$W   3ҍ\$t 9nBGЍFvGË؉3ut$\$   ~u!FHpFAɉHFH\F@` ._G      PSUVc  ؃u9G`tvVO`G vu_^][Yú   ̃SWڋ   tfx( |	@HuR3O@tED$WPfD$BQЃu<      T$QD$    PR ;   v   3_[̃,SUV3ۉD$t$0\$W`  hSh   |$4  h  GSP1 L$,/nPU T$AFFF   D$0ED$T$9   &  AQD$$D$$T$(uT$D$T$(D$$IE D$M|$D$@ ME ;L$$   |;   jjWՋT$4؃tˋT$    R   j R T$PQ4 D$(D$0T$,  \$ C,;Apm  C     ApC,CD$X  u\     _^][,ËF    FFF   L$0   F 3ۉF8Y,   ADD$$A   A4@AD@ ATiDE   !T$(fD$$;wJY    uρ  PV|T$0؋L$8T$(EGtD$$;ADt49     tB BЅu	EA  9  pxV؋ǅu_^][,ËNTnPD$0E D$L$D$W] fD$(L$,D$(]@ |$T$;   |;   D$$D$(    PD$,PWR3IT$8T$(؅uG   3FXN\;E u4;Mu/|$+} T$U       PQRW藴 ЉT$(3uIE M;]t$4;L$O|
;D$Cjjt$ Ջr؃GuT$(뷋T$ tg|$JD$S ;QDsQDC$ALC(AP7  CD$3D$D$u';F8s"jj WT$4؃D$@D$tًt$y   ~ t~}   ut$= tEpKt
PHV$)xIIVpKtPPVuD$E D$E_^][,̃Vq@Wtd8|_      T$D$|
t2҃y, QtҸ0Eǉ   t@(L$QjVЃ_^USVW3D$~ t9~ue   9xuZtV;   tN~ W|$fD$vF@tT$RPAЋuK^|$uDxL$XL$   uEȅy   f   _^[]WfFlF`t@   @,u   3   &{   L$ǉ   L$WD$ SPQ} F3ҡp:L$@      É   9SVWڋN;|uO~ t3F@SPAЊNuuu^u      Ѓu_^[_^3[̃XJSUVW   \$tЋ   tkpK= _t@t
PHW$)xIIWpKtPPWpKu\$3F tGE %   D$u9~ |$u-9~t(F@tT$RjPA(Ѓt
u9|$uFՋ   W   PH  FlF`ǆ       tff     @   @,u   3~ t	rVDtb~ u@jRЋVDu
FXPRAЃȃt
u.F,Ftǆ   ~ 0E   t\JtЋ~Dt@WЃ    ~@t@WЃ       p,= tPpKt
PHV$)xIIVpKtPP3_^][V_^]3[̃$ 3ĉD$SUVWl$F,"  9   uP
  ~   FD8   ~  F@u3ۉ\$PA0Ћ؃   |$  F0WnPȉD$(ŉL$ NTT$$fD$t/   j  WQUL$(9 +D$ D$|$l$FDT$WUjRPAЃu4L$;u1A;u&FDWUjhPAЃt=
     ~ t'   uN
VDtQR@Ѓ   v\FDT$$vXjRPAЃ   |$l$   u)F
3ɀ~
   DʋVDtQR@ЃupFPNTFXN\t1u-Ή~0Kt_^][L$3 $ËFPNTFXN\   t      f!P@ uAA3FL$,_^][3諁 $̃SUV3WV@9*u'   U%PARUQЋ  NV(;sI u9Wv>j Q      
 D$F@T$tT$RjPA(ЃFF(    _;   G      C   j P謬 T$u!OGIpAɉHGH\G@` ._t$F@WU   RPT$(AЃuD$@Fp;^$v^$   wN`!9 F@_^][̃SUVX3hD$WCh~#{d9or耲tChF0;|3_^][F;sh}vCdI0FD    ;sh|T$rN   ~H39u;t8Ft.j@j W茘    ESh   WSUЃy      j v8 PQ* NHD$SWjhT$$@ȉD$$RQ@Ѓ(FH SW   UPAЃT$F8΋Ra_^][Å۸  OÉG_G0   G8    o4EUQSVuW}~,    Ft   G      G        t ؅u9PP׋_'Gu~u   2؅u׋ÉD$uD$t
u5^,Ftǆ   _^[]À~ 0E   _^[]_^3[]̃0T$(T$<SщD$D$   U3L$(V3l$0@   l$9H]WOH|$Dt$(AD$ D$80D$PD$5  \$)  ? A  ύQAu+j APD$Tbt$}  t$LWVv NFu+?3D$LL$A   T$ Nj PPD$D  t$<j W腕 D$       0O@@ȉOHL$ ODL$ 9L$<     Vt$Q D$HL$(@ƉD$ _  SQP蟩 \$ \$ L  3ɉt$3L$LL$|$L? |$Ll$uF6RP؃\$9  SV E$WUЋt   ul$     N    Fu+ρ?QAu+ʉ|$L?AωL$(8t5|$LˍQ Au+ʍQӋʍyAu+ύY8uӋL$(+Cu3L$F;A)h-h'  hhěj/   T$3 _^][0Ë\$ CVt$   S2 3-jouVCrnal	t$   S D$3-walt/3L$L$D$Ǉ       Ǉ       D$D$LL$\$     8   D$LD$L    PASw@   QЋ\$`Ã\$D$4G  G@u3PA0Ѓu#      v    ;GȉL$$hH   	 tj    g 3Ƀ3ɈO    u;hH   ^	 X  j    % 3Ƀ8     fGG\$D$L   jT$(u{   PT$ʀ҉CCCfC"C,DƉC$Ph   t$,C   CX   K C!{(Cd   C   lt$<   hw@t@VЃ       ܸ=   pKt
PHW$)xIIWpK`  PP_^][02D$Lky<CCR VRP | ʚ;v ʚ;D$,    t$<UVpC,t
PD$$L$CD$0s,\$GD$LǇ   ?GGG_OGuG 
X   Ǉ   f   Ǉ   |$0 uGu9\$4tG, Ǉ   Qt   D$883_^][0À 0E   D$883_^][0W_^][0ËD$t	3_^]   [0̋D$x ux ux ux tH@@@̃SUVD$   WFDE      D$u*D$PC j    SЋ  9D$  F@T$D$    RPA$Ћb  9D$X  T$ C  9D$   9D$    XJtЊF<r<u$~ uF@jPAЃuO~tFCtj    SЃ~ u*F@t~ ujPA Ѓ~tFFF\J   Ћ_^][ÍD$ D$   PCh  vD   SЋtuh3E    _^][ËFDT$j j D$ jRPAЋ3
  D9D$uvDt@VЃ    38D$E _^][U8 3ĉD$4VWt$    `  ~ V     D$     ~wT$  9D$  ~ tο  _^L$43s ]ÊF3ɉL$<r<u98Nt3FL$0F@jPAЋȃL$i  FL$W  FD8    ~   >D$Pj    G WЃD$uv9D$tpD$D$PGh  vD   WЋ|$uFD$t?h-h9  hhěj&   |$~Dt@WЃ    FDtL~ ujPAЃD$ukNDFXPQBЃD$uQ3ҋ8VD$F 4~ u*F@t~ ujPA Ѓ~tFFFD$t<ȃt
uF,Fǆ   |$_^L$43q ]À~   ~    F@T$ j jjRPAЋt
  uW)D$ Np   T$ ;usBFlF`t @   @,u   3~ tF@j j j PAHЃ~ u~L$Qj    P@ ЃD$u9D$tHT$D$t|$A|$ uHt/j    Pу3ҋ  ~|$uF 3   D$   x, H+D$    xL$t/9 uj	jj PA8ЋD$$L$@, @h    @/ P(T$fx*9 uD$jjPQB8ЋD$$fH(   3GT$Wj <  D$tt$u|$ tFFlF`t    @   @,u   3腭~ tF@j j j PAHЃ|$~ u~ uVyL$<_FF^3yo ]UQS]VWu(h-h  hhějd#C_^[]Ëu   A!PSq,x      3D$x!   p,tL$;A~YAtf9xu@t@$uAuAt1f9xt	@$u"Pq(A$Ћ؃t	J  L$]jSq,x3ۃ   Dم   u
     ]x   ? uPèAfGEM8 tu   3_^[];   u%h-h.  hhěj"   >wF@8 t"9^ru   ؅   ;         tXGt9O9yuG$AW G$tB$AW$G tB 
uA!GjHG7p,|   x uE     _^[]Ät.XJt;^ w
N<'Ӌn\Jt   j wӅ _^3[]US]3D$VW}  t
E
     t'D$P9<  tM    _^[]ËD$     D$C   D$ j P O@\$S   RVQ@DЋ]ȃv  D$D$  w
       j Sp,xtgX   u; uPKAfCt>t$Ew@   >   j t$(f RPGHVЋE3_^[]ËD$D$󋟐   tCW   CC    f A   (D$ RP؃t3t$j S C(C   C{D$sC   37D$w@PE>      j t$(蠖 RPGHVЋ}   tE3_^[]ÅtCE     _^[]Ãw/u+h-h}  hhějC_^[]Ë]uuSW_^[]̋D$     D$@,UA VWtIQ      Ar@   qA   >H   j P誕 RPGHVЃ_^]Ĥ_^]̃SUV3WD$F,  9     ~  ~Ph   ؃~  h  Cj PC ;FD~<8    ~ut@    @    @    @    @    @     @$    @(    @,    @<    @   @@0    @8    @4       ~ D$    t-  M3  9ntAN@t8D$PB(jQЋ؃tu9l$t  a  uX     L$UPvD~ ؃u4F0    FP    FT    F FX    F\    P؅t5裝    FP    FT    _^][É^<   _^][F_^][QSVW3F,  ~D$UFu        ~ t]x+ uWF<r<u"~ uF@jPAЃ4  F   + uOG(jjPQB8ЃG+   }. t   ]_^[YÀ}+ ]\$t3!j
jj PA8Ћ   \$E M4E,,   ;uss}+ uD$j	jj  PA8ЃE,   KF3<r<u*~ t3F@jPAЋu@~tFu2tWXuNFN(N$N FP    FT    ]_^[ỸSUVWt$ ~ϋFЉD$_PoTfNWDNUɉD$ SL$L$j@QRЃ   WD˃Ń 2PQ   Ft$$RЃun   T$OD   D$UD$ SjR@QЃu8      \$ O< WPGTG0SQSϋ_^][QSUVW3^{uGu`芠K<t1nIu#;k wt_^][YÀ{tfNfN{h ~	`F9CsC_^][YUSUVW]3l$$D$D$      P   討 Kȋm؋S}#G|$ ;v+EA;v+E33L$     T$$;r   K<tuMtf   j Vp,xЃu	D$   B   8 uRAf@D$tn@   L$EʉL$QD$L$;   tNj D$ P   VSЃD$u.L$.L$   D$D$AED$D$L$AFL$;   9D$   D     j Wp,xЃ   B   8 uR;Af@t[fH@ tIP      Hr@   p@   >H   j P8 RPGHVЋ|$0PG|$ RD$c_^][]UAQtB;Arzh t	]3]ËB,u   ;   v	j]]QSVW3F,N  th  ЃtG
_^[YÀ~s3_^[Yú   u"F`  @ @   @,u  9   t   |$tD  B BЅu	MuPD$P   jVЋD$xjvЋL$tw     [Z  3~ up9~vkWD$P   jVЋuBL$vu3T$t%BHpBAɉHBH\B@` ._T$FT$t>   Ӌ   3ҋ:      t@ B BЅu	-Ћd      oV;V$v3;   +u^|$ uJF@tSjPA(3Eu63~ uN
V@tQR@Ѓ3u    uF_^[YUSUVWNL$uF,_^][]Àw
3_^][]Ã       ^,uOFh~G3~3    NdL)蔔Gm0;~h|냾    Fh    uFD8 t3ҋ:Vj uÃt	
   ^,Ftfǆ   _^][]ËFD8 tt3ҋj 3ҋ蟽؀~ u|$vF,   Fǆ   _^][]À~ 0E   _^][]̃SUVWt$j vOd_hP   ΍[+ՉT$IPj Rv od;   t$(GFGD8 tOTGP|u   3ɉF؉N܋G8FGj h   D$t`h  Mj Q.v D$ E nF      tADFALFAPApFC0_h;\$\3_^][ÉnF   _^]   [̃SUVW\$~,   FhT$$;   3ɃʉL$IT$;}*    NdLE[0;nh|L$T$\$Nhu]I^d{ tDFH(t;u-      j s PQ RPvHEЃCF8_^][Ã    uFD8 tu3ҋ_^][EFd_^][/̅ty Լu   QSUVW3ڀ tH  Ct#  Ct	9l$uk%  fC   j t$p,xȃu3   q   > uT$Q肕@fF   f~~0h-h  hhěj   _^][YfFff	C tWB託XFt9N9quF$AV F$tB$AV$F tB 
uA!FjHF6p,|CˋT$D$<ŕ ttT$ tUj D$P   UWЋt ;o w   O<薎_^][YËD$fHL$YL$3_^][YSVW~ Ntt	;  ;0  ~ V        ~Dt@WЃ    ~r#H   j    PF_^[Ê^3u~u6N3ru'8Ft3F@jPAЃu\~tFuNHtj    Pуu2F@t~ ujPA Ѓ~tFFFF_^[Äu,.F_^[Ãu~Dt@WЃ    F_^[A̀ysAD8 tyT |yP w   3̀y A@ t3Ày u8|x4 t   VNr	t3^À~ Wt3F_^ËF@jPAЋu_F^ËF@t~ ujPA Ѓ~tFN_N^SVW3~    9         ~    ~ uF@ 8|p9x4tk~Dt@WЃ    ~ tu'FV@S      P     uFF _^[ø   _^[   _^[QSUVW3   9;   N3|$ru+8Ft3F@jPAЃ   ~tF   L$Qj    P@ Ћ   9D$tD8Ftu'FV@S      P     up; tkub   F   P      ΋t0~ u*F@t~ ujPA Ѓ~tFFF_^][ỸSUڋVW\$    D$9]UM j PuD$0F_^][ËM+   Pj Pm Cu E    }+uAj h   th   j Vm E 3ҋL$   4E 9Ehu ME,VPh   SQB4Ћ؃u(9D$~9t0hX  ЋL$t"   L$uM.3DL$E _^]D$[S\$Ul$Wt;[33t!Bǃ;rD$8_]X[V2΋%   ȋ%   r΋%   ȃ%   ;rD$^8_]X[QSU3VW3E M\E4E@E4- H΃;ru\U`E4C0EDC@ETCP}+tEPA<ЃE4_^EDCET]C [ỸATUVt$iLWT$L$;FuoAX;Fug>υt_S3ۋ8YAUUj}D$ˋT$,UUp$iF[9E u'F9EuD$Nɉ8D$_^]   _^3]̃VWwD   !9w~G D$t3D$PȃD$td @  T$u   D$"t$u=D+JT$;~3fJA    |D$    ++Rj PWj _^̃SUL$VWu!9q~A <|$t3D$P|$؅t* @  L$uǈ   t$|$'"t$u   _^][Ët$L$up+u+ρ @  QSWi | t	L$t$$ՋD$i    f<H tJt,D$A  f<H uD$tD$f,H_^][h-he  hhějO   _^][U    3ĉ$   SVD$<    WD$D    ^-C~+ \$u!N   j
+PSQB8Ѓ  j0F4j Ph FT$TRPAЋ  9D$L  |$H   FT$lj j j RPAЋq  T$l|$tʋω|$h=7j  G_     S     G  D$x^L$   ȉNXSʈVAFpT$p$   j j~$FT$   9  $   9FP  D$p=- t(h-h  hhěj     _\$Xm	     j PD$(  L$LD$\ǋ|$HD$8 Ù ؋PSQW\$dD$`kx 3ɉT$<L$$B!D$0D    9D$<CЉT$ u
D$   ߉\$F D$9N~$ <    |$,D$D$4tL$3.D$4PWL$ D$(D$,D$4L$D$8  \$,T$8\$;\$    @ t$P~t$XD$Hj Px   RPt$`Ct$4WЋuzt$(D$ht$`T$hP?\$t[t$`ӋuED$dt(FHD$h%   ȉ^DfNBFLD$@FPD$DC\$;\$ O\$L$T$,L$3ɋT$$   Һx  Dȸ   DPD$<PD$Py ;\$ vL$$T$<AL$$;L$07= tIpKt
PH\$(S$)xIISpKtPP
t$(   D$@ΉFLD$DFPkF    `L$    FDA A        ~+ ST$0t3+      Nj
jRQ@8Ћu>T$0L$u~D tFDAD~+ uFj	jRPA8Ѓu,L$C{~H tvlvDhHh   \$~+ uF   j	+RSPA8Ѓǋ$   _^[3J ]UV~+t~2 tW39~~vSD  F tU= tBpKt
PHS$)xIISpKtPPSF     G;~|[_~+tFUPA@Ѓ^]̃S\$ UVW    Exj PD$8  t$j Vb L$4FxFNL$fF(D$$FD$ ؉.~Nl$fF0F+D$,PEh  D$4  vQUЋu<D$,tF.t@0WЃ   tF0    tF1 3_^][3ҋi~t@WЃ    = tPpKt
PHV$)xIIVpKtPP_^][V_^][_^]   [̃SUV3W3l$3ҋًL$$T$T$(\$T$D  t$,;>|;    @+\$<4?;}0 +l$L ;L l$s+@\$\$T$Gl$0ʋ4L$fTM Al$T$L$L$$;zLE 94L$$t$,h@bD$(T$(Pt$4Uu _^][U    3ĉ$   ESډD$TQDL$LVWB!T$HHL$,B4E   pf	   PVa|$   Vj W_ t$8w8f	   D$H   ;j GPt$8  "3ɉL$L$D\$4L$;\$,  L$T9Y~A D$D$@t3!D$@P:L$HD$DL$D$t$0t9 @  L$<u   3҉D$D$@T$T$D("T$T$Du   D$  T$t$k  KL$X;L$,uL$H+	L$<+GL$(@BBGT$3\$PT$D~	fC@;|jh3D$d3VP|$ |$0|^ D$43ۅ|   L$PL$L    3|$D$$tCff     t$8ThD$L$PD$,PtlFǋ΃uӋ|$D$$L$LDdCD$(|`L$L;|Fs?   ǅt&t$8ThD$L$PD$,Ptl]D$8Fǃr΋|$D$4t$ L$\$X|LL$PLL$LD$0D$0C\$4t$8tX= tEpKt
PHV$)xIIVpKtPPV|$u&t$ D$\0_^[$   3C ]ÿ   = tNpKt
PHt$ V$)xIIVpKtPP3뇋t$ V3r$      _^[3gC ]̋A V0ApAD    AT@ȉATQXF`    Flǆ          Fh    ^ @ũPSUT$<V3ۉl$<WuBMDƋ|$h   Ɖ\$D$E \$(L$ `T$9
/  EH   D$,|$DD$4;v{f}+ ~t3Mj
jWQ@8Ѓ؋D$tut$lЃuąuzT$L$ DD8]+uEj	jWPA8ЋL$0T$|$Fo9
g  D$P؃|$ E  t$l }+ t!33  L$43T$L$ |$뢋Ej
jjPA8Ѓ؅tu
V׃u  L$T$pD$HD$ A MT$ptRQ@Ћ؃(  t$j Vj t$8m D$PET$Ttj j'PA(ЃET$XRPAЋ؃\$0  D$T9D$\yt$P|$X|;skj t$j uDl T$\    ;T$T.|;s(h-h  hhěj   i  EtT$PRjPA(ЃT$T$4ft$L$$D$<BD$8xj؍C4F.;}FNVAfD  9;T$<wV@F;|L$$L$$;sFǉL$$D$(y\$0l$@D$   D$D(      T$(;T$Hv;T$ w	;L$,v T$47\$JuC>8 RPGS$   VЋ؃uMuD$$S\$H>Sj P/k RPGS$   VЋ؃\$0uT$438XWÍ]   |$t$Etj j%PA(ЃuHM T$ 	;QugMeHRVQ@Ћ؃uT$pMt=RQ@Ћ؃t-T$}+ uEj	jjPA8ЃT$u33ۋT$L$ 
˅   t$d   ;EDs
         D$LPj}+ t3Ej
jjPA8Ѓ؅tut$l׃uʅu<uT$LESSPAЃ؀}+ uEj	jjPA8Ѓ|$ tj= tTpKt
PHt$V$)xIIVpKt!PP_^][Pt$_^][P̡XJSVWtЋGT$RPAЋu(\$9\$|T$9T$vGSRPAЃ\JtЅtwlhIV_^[USVWT$3  3ۉ\$9]   FjPAЋu}8^+uF+T$j j uuuj j j    uMFD$t3T$Rj
PA(Ѓ|$u9^| 9^rj j 	   \$Ӌi^t@SЃ    |$ t*XJtЋHtj vlPу\JtЋ^ tX= tEpKt
PHS$)xIISpKtPPSpK= tJt
PHV$)xIIVpKtPP_^[]V_^[]́    3ĉ$   SUVW{+C 0^N T$ T$D\$0\$TL$L$dtCPA<L$T$ \$0F0L$DT$tD$tF@$   FP,   $   D  ;   s(fsf~   3L$D3ҋЋAD$l;r(fsf~;u_(fsf~;uOK4,   T$D;us33E    S4[DKTKB   C$3   $   _^][39 Ĝ   ̃SUVW\$~ ~F  D$t3/D$3Pt    F2F+   |$ tӋu^2      ~2 ^2uLF.tF~+ u6Fjjj PA8Ћ   8F+uFjjWPA8Ѓ     F,D$u8F+uFj
jj PA8Ћuv~ F,~F 8 t3D$3P%u$T$Qt$D$    |$ u~+ F, uFj	jj PA8Ѓu.~4- t#h-ht  hhěj   ; t t3ҋ 
  DF+ _^][Ul 3ĉD$hSVT$8W~+ F   ؋ jjjPA8Ћ|$Å     |$\$~ 4  3F   =   pKt
PHS$)xIISpK  PP  ؍T$L3fF(Rj h   j PA4Ћ  tD|$=  F T$(R  F4@FD@ FPFTAЋ\$|$
9D$,#||$( sD$<    ~D|$  FT$Tj j j RPAЋ\$$|$FTL$d;FX;AF$D$4U	   D$4ʉD$8QPL$(D$q  L$8D$@FLD$DFPD$HF$fDD$T$ T$ʉL$$L$ ȉD$;L$,   |D$$;D$(   t$FRt$<t$PAЋ|$u^t$D$(t$DT$XPPt?9|$$u2T$T$8L$ L$L$8D$ ʉT$D$;D$,|;L$(v|$D$DFLD$HFP= tKpKt
PHt$$)xIIt$pKtPP
t$\$_^[L$h304 ]ÿ   SF     G;~|$~, \$F2 t(~+ uj	jj PA8ЃF, Fh    F/ F(fx#~+ ujjPQB8ЃfF(D$<L$t    _^[33 ]̋D$SUVW3~-Od~G_^][Ã
|	k'QP@<Ѓ\$    8^2   Ջu`F 9t88^+u3FjjjPA8Ћu&8F+uFjjjPA8Ѓ_^][Ãu  _^][Åt
_^][À~2 tՋ_^][F  `D$    ;FD   8^+t3FjjjPA8Ѓ~+tFPA<ЃuBF V4,   ;us3fF(_^][À~+   jjjv  ?FD3ۋT$3D$l$$C
;w
;L$wً@|F.l$$\$uC;\$ru9   @ ~+ kuENj
jUQ@8Ћt.C;|Ћ\$$uK  D_^][3T$ƹ   ȋD$D$D~+ uŋj	jUPA8Ѓ뱀~+ ku(NjjUQ@8ЃtD_^][Ë|$@~+FdtFPA<ЃD$9Du3F V4,       ;usf^(3_^][À~+ ujjUFPA8Ѓ_^][̃ ADSUVL$3t$D$WM  f9i(u
y2 =  QdX!!T$ ;"   9Y~A D$(t3D$(PȃD$(t+ @  T$$u   \$,D$("D$,   T$$   i      %  4BtJf     T$,;T$wL$;QdrL$(L;L$DOt*L$$@%  4AuÅuNK;\$ |GL$t$h-hU  hhěj    _^][ ù   _^][ ËD$4_^(3][ ̃SUT$L$Vt$]WL$;M{|;su|$Ǚ;U|i;rcE+ދT$$RVSt$PAЃu]MÙD$$\$U+D$tQR@Ѓ3t)t_^][Ë|$ET$RVWt$PAЃ_^][̃  3ĉD$BSZU\$ȉD$D$,Vu ȉD$W~h ~LuRNXT$FT3ۉL$ D$8^AWWjT$WWv$\$ȉD$$GȉD$(WD$t$<T$|$8VWjuӋVWukL$,_^][3*-  U< 3ĉD$8SVT$W^$\$$DL	     ÙډD$SP\$(   FhuX3St$j PtX ؃0 FRSjWPAЋD$ɉNLOɉNP^h\$Fh       ;\$   t$ Ct$j PX N D$ Rt$t$,T$4W@QЃD$   ~h OD$,L$0uXFTT$,NX38^AD$4FLPÉL$<PjFLWPPv$FL\$ȉD$<FPȉD$@WD$4t$(FT$0t$jRPAЃD$C\$= t\pKt
PHW$)xIIWpKt*PPD$_^[L$83+ ]WD$_^[L$83* ]ËL$D   _^[3* ]̃t 3ĉD$lS\$|UVWT$(\$8,   D$<    D$$    G O4D$    (Ջ;usE@D$3f9w(   9u`v_D$Pj+ uGj
jjPA8Ћu'T$+ u9Gj	jjPA8Ѓ	  + uGjjjPA8Ѓ3fG(CT$,Sj\t\$8  oDl$0   D$(wTOpD$\7D$` -ȉD$dȉD$huVjN3ҋ3L$pL$\D$lAƃЍD$t;rƉWPȉD$tȉD$xT$\D$(wLG$Gj j GA G/j RPAЋ  8G0t9$   Wt%QR@Ћt_^][L$l3( t3GWD$D$D$   D$PD$(D$Tȉ|$@fD$HPQj UL$<D$DHT $    D$  |$8 l$$  fD  |$    { ku   SD$PD$    t$;t$r^t$4Ft$0j PS Oh8D$ t;swhGRt$t$0sPAЋ  D$   f!SbD$ $   D$0kt}  u	$   3t$PQL$Lzp  D$ D$,L$4L$fK@\$<D$ ] $   D$Dl$D$  h tT$0  $     1    O@,t QЃ }   =   ~      \$ ˉL$̓l$R PQt$$L$,Q L$+ȋD$L$HD$L;uD$   ;tD$    ;R|;sL    T$<L$@US$   J@  \$,l$4D$$;l$L|;\$HrËD$DD$|$ tL$$   Q@Ѓ/ tLo_|Br<t$4D$(t$0D$8j PQ   ;|
;v؋USaG/ l$8_Dt'   E@tuCϋ4muمuw@ D$$~2HCD$$ӋD$<pt_^][L$l3;% tËL$(   _D$    fGBt$   G<GH_L$|_^][3$ tUESVT$WD$    D$~. t   _^[]À~+ u!Fj
jjPA8Ћ:  EF-tZ~+ t3Fj
jj PA8ЃEtuuЃuȅuF,   D$    E    T$|$ tF9|j j j PAHЃ   9~Dt>NB   ;Et%h-h$  hhěj   FuT$uuut$ tuM tFDM$t
F  @`|$ tj0F4j PB< ~, t)~+ uFj	jj PA8ЃF, Fh    F/ ~- t~+ uFj	jjPA8ЃF- uD$9Et   _^[]VF@<t
PPF
 ^WG@<   PLtsVwt~
 tvuG@<t
PHOAwG
t-~ t F@<t
PHNAF
vu^_ËOAG
_VW3   9w~.S3ۋOLty	 tAy
 u.3F;w|[G__^SV39s~+W3fKL9ty	 tAuF;s|_^[̋D$3SVW~E tI  N 3V$N8V<_^[I  N,3N8F<PQ蒣   j Wv83ҋvK  ؃uN8W9D9~_^[Ã= tLpKt
PHW$)xIIWpKtPP_^[W_^[_^   [QSUVWF@t  _^][YÀ>u F    u8NDx.3~^xIH"FD[G;|NtIHFDf_^][YSUVW;t$tUt9n@uLt;<t7FDx;3~^xIH赵FD[G;|NtIH螵FD!u	vu3_^][VW~tc= tPpKt
PHW$)xIIWpKt!PPF    _^W_F    ^QSUVW   kp( u	G_^][YËT$WV)) Gft-f;Ew't$$׋:T  Kp׋Iأ_^][Yh-ha hhějKp׾   I蠣_^][Yt$$T$$t$ t$ 3Q  _^][ỸSVD$    W>u
F_^[th  Ѓt
   _^[ËVD$Pj v<v8؃u~~tW9tEpKt
PHW$)xIIWpKtPPWD$F    tF~ t> u_^[̈Q̃S\$UVW; u(u,h-h	 hhěj-   _^][Ãs30̍we(Ƌ3Ap:3+3u$H;΋E T$$j RQP   L$$Ѓt
_^][ËL$$A8 t&h-h#	 hhěj   b+|$Oy&h-h(	 hhěja   0yD$t$ :u	G;tuD$ΈwL$$_^][αQSUVW3ۋr.̍we(Ƌ3Ap:+3u$H;ÃދE L$j QSP   ЃusL$+Oi<yQh-hU	 8t$/T$tD/ȉ'<w3_^][Yh-h]	 hhěj<   _^][YQA4SYUl$Vp(WE+ǉT$I3;_OfEfEf+D$ff^fE][Y̋D$Vt$֍HfF    fF3fFF^UESV0W   rxBB:r;rBJډL$u   >  L$A3ۋL$D$$ڀ  D$@D$$ڀL$   AL$D$$ڀ   D$@D$$ڀL$   AL$D$$ڀrdD$@D$$ڀL$rAAL$D$$ڀrD$@D$ ڋL$AMD$9}YqAG;w*֋+ED$fAfs	   fAfQ_^[]ËUQ_^[]S\$Ul$Vs
   rW~FFЀ>r;r_L$FA    QqC;w$ҋ+fAfs	   fA^]fQ[QՋ^][S\$Ul$Vs
W=   r~NF>r;r{FΉL$;w+ƃs2_^]   [ËK43s+ƋI(D$;G+_^][Vt$FVD  @y;r+^S\$UVW   r!{D  FFЀ>r;r~ N}Jq΄y?Ny6q΄y+Ny"q΄yNyq΄yND$h;w+уs
_^]   [_^]f[x@4+׋p(3҃;G+_^][̃SUVt$0Wك> us|$0D$PCPWSD$,;D$sUM<;r2;s,h-h
 hhěj   _^][D$"K4VsT8j_^][̃4D$    SUVXhp	Wx8ωD$,@4\$4k\$(|$$X(F;L$ l$8Ӊ\$t$w  D$Zv@t$0;~+h-h  hhějN   _^][4Å$  ,>D>;~+h-h# hhěj	   _^][4Í/t;   {   D$(T>ǉD$<D>D$$    D$T$H@ȉL$ ;r+h-h+ hhěj   _^][4Í2D$8   ;v+h-h. hhějH   _^][4KCȉL$$);D$~+h-h0 hhěj   _^][4Í4
ŋL$0++PD$<PP3A L$,֋t$<T$ƍ+\$8P9P;P	A T$@׋|$<;sy\$$@ 
B;sDD$D$@;D$~h-h4 hhějL   _^][4;sB;r\$8t$T$(  t$nFT$@|$8 D$0       |$47G;5  ;-  PD$0P@L+؉D$<;   T$;   È_|$ u7;tMD$,+R@4    D$(ŉL$ P)P? D$(D$ D$ t$<PD$,P? L$0T$@A;L$8L$0L$ 4|$$t$T$(F FL$,+;A   h-hj hhěj   _^][4h-hW hhěj   _^][4h-hQ hhěj|   _^][4È^+Sj FWfF   * 3_^][4̃SUVW\$F	V8hD$T$*L*N4I(+L$;9tJ+\$yjJ.;vET$;~ˋL$;~(h-h hhějD$8    3_^][Åth-h ȃ}$D$t$|09wf
f( \0_^][Í;~h-h 댋ÈZ_^BD$][̃D$SUʉD$L$M	D$f@T$VW}8Ɖl$ D$ L$\8u88u
3   8fff;scӃ;r!:L:T$fff;r4ft+h-hL hhějb   _^][ËT$E4@(D$;v+h-hQ hhěj   _^][f   L$A;   *D$;v+h-h] hhěj   _^][L/D/͉L$;L$v+h-h` hhěj   _^][+L/D$,/ffl$ΉL$E;vgD$L9D8L$A;D$rG;L$v+h-hm hhěj
   _^][ËD$* T$+D$,֊D/L$:v+h-hs hhěj   _^][*D/L/D$D/fff;   s+h-h| hhějf   _^][ÍM;t+h-h} hhěj1   _^][ËL$D/\/D/L/΋9T9l$ \$E4@tD$,Pj >P% D$D$L$,D>D>D$$>L>E3_^][SڰV*W~4^F
uHF??Dй<`<DFVLNPfGfFG fFGF3_^[fF  FL ?FP>ufGfFGfFGF3_^[h-h hhějƿ   _^[̃SUVW|$w	o8G4OT.X(D.Љ\$G
J|.҃HD.t.L$v4vzB;sh-h    ;0f/L/T/L/׍J;v;~h-h Vth-h FD$;vh-h 2D$L$;;|+L$ƉA3_^][h-h hhěj菾   _^][̃SUVWUuVD$E4H(E8D$38EL$ 3ۃ+ȉL$tET$<f;t$rc;t$]PELU;D$ ECT$;|3_^][h-hA hhějƽ   _^][h-h< hhěj蛽   _^][QSUVW_	_8o4t)h-ha hhějH   _^][YE$W
fHO	fGG
fG fȍBfOO8G@E$G<
GDsCff𸫪fwM$;v)h-ho hhěj跼   _^][YGE@ %     t_^][Y_^]3[ỸSUVWT$_4G	W8T$CD$tC(+P*j P! T$$D$L$*D*    D* fȋC(D*C(D*C(T$f+G]L$fwC$w@G<G
G GDC$fHfG3fG_^][SVW3j W   p,xtSP   : uPAAfBt+r;~tBF8VHɉ^4d~N	_^[_^3[̋A@0̃SUVt$WD$;h0vDh-h
 hhějݺ   tNDAFDDtFt_^][t$$ L$QUP   ЋuT$\$B8 u5J;it BA8D$A4ȉQH$diA	u8tKfxr@:FEt:h-h hhěj   8IHś+_^]3[̃SVWt$ًL$QWP   ЋtD$     _^[Ët$N;ytFA8qHȉY4$dyA	AH3|$fx~14h-hc hhěj7WF_^[_ ^[̋D$H9 t fx̋D$Vp  Ƽ  t"NxQvЃu	F^F^3^́    3ĉ$   $   S$   U3D$,l$3T$L$$\$ D$VWt	8E t3	   t4,IŊ:utP:Quu3t t{Vt$   x$   3$   $      L$   tut%   $   j j0؃   j0j S D$4C [ C$   t$$o  $   tt$$@X  t$$   I  u3͍QfD  Au+ʁ?D$,y@h;Oȋ RPoK	D$L$uu9tdpKt
PHS$)xIISpKt
PP   $   _^][3 Ĝ   S֋T$ tl$WRU0 /P  D$0URP@$Ћl$t   u&3l$l$=    3D$D$0  = tIpKt
PHt$V$)xIIVpKtPPt$VpK= tHt
PHS$)xIISpKtPPSj@D$t
PH= u
D$0    j@D$0t
PH=TJt$$   t$$    7ŋ   fD  :utP:Quu3uD$,9t	Hu2D$(Px @t9ytyy{GDD$0t
PP= 5  pKt
PHU$)xIIUpK   PP   D$0t
PPD$t
PP= tEpKt
PHU$)xIIUpKtPPUpK= tKt
PHS$)xIISpKtPP   S   yU.  l$ j j\a  j\j W $   t$$QL$<U/D$w  T$(B0R4      u7D$<3jdUPl$ F@tUUjdT$HRPAЃD$=
  t3  D$GD$(Gǀ   R      @@tQjPB(Ѓ{7oo~ tfOL$MD$LO$   r6   w.Au'L$PfOD$pȅGD$|ȅGo$9l$ t
9l$$ufo2W$PΉD$ JuD$2  G$k	+D$G(GD   }  l$t~= uTJGH=TJl$aj@= tj @G<u
h  tVHTJGH=TJVPl$k	}  }   D$(3ҋh~lHtx	 u
B;|PHt
HuS;PsCC    X(Ht9Qs	HuHKCtYXl$D$4D$tL$L$D$   W  }  st#C{
 ub}  tCu/~4 uw}  stC{
 u0   FFRPj h @ F0,& |= ʚ;v ʚ;D$8    Pv,p}  tCuH@tGPB(jQЃl$D$PPl$t3t= tHpKt
PHV$)xIIVpKtPPV   = tUpKt
PHS$)xIISpKt#PPD$8     SD$4     VN$9FTu Nh   j QAF(    ^Wf 3FT^QSUVW~	 ~tF~
 u2j 3ҋ7  ~	    Fu~	    3= u3j@؃t
SHOD9oDATJ;u
GHTJtHH;tuGHG<t
PD   t
SP   rO8tG4tPуW4t3?~OTtOT9GT    = tEpKt
PHW$)xIIWpKtPPWNtFANtFA= tNpKt
PHV$)xIIVpKtPP3_^][YV_^]3[ỸSUVWڀ	 wtG
 u.   ]y8EER VRP$" ؅| ʚ;v ʚ;D$    Su,p	 tGu_^]3[̃SUVWڊO	wL$tG
 L$uO	L$    D$PT$t-y@RVRPi! T$؋D$XO	L$Xhy;@R VRP/! | ʚ;v ʚ;D$     L$;M݄tGu_^][QSVW\$~	 ~tF~
 uz t2fB Z	Z
2=JÃZB	uB
 2D$tB
B
Bt
ĈB\$t	uBJD$ DȈJ~	 tFu_^3[YSUVW~	 ~tF~
 uL$G$+G(;ȈOLGL$t~	 tFur   _^][Í =   w:Cu3 ~      D؋GT_$tHOT5L$GT    QW$lL$W$+у|$ W(tfO~	 tFu_^][SVW~	 tF~
 uF t   ~	    tFu_^[QSVT$W3~	 ^tF~
 u	}T$CtC3Ʉ;t   CC~	 tFu_^[ỸSUVW  L$ j QjP   Ѓ  T$ JL$ytBA8QHy4A   A	dY8KPɉL$T$(tC;C\tʉT$G@ %    t3       ˺u;3  s{vfO{  uXG uRT$D$    觛  9D$u/D$HHq-   9h  rU3_^][C<@uC< uC< u3     sCFp     d     X  fOC+ȉD$$L$;w$t^D$HHY.-   x uTOTD$G(w$tOT2GT    t$$W$i_^][ËT$(9T$vG@ %     T$     w$O(C4ȅGC@ȅGl$w(   θ  ZFf_   fGf;fWGfW GD$Go03_^][h-h
 hhěj'   D$HHq+   x uSG    _^][SVW~0    ^KH{8surjLj F%GF&GfGF$*F(GGPfG@ G P	    FfNȉG4FȉG@F0   G3_^[̃SUVq3ۋL$Wl$>|$8Y	tA8Y
u	2L$A<k  <u_  @ %    t8_u	  f!FVtft
   ]  ~tyVP9t(  B  ~FLtD  ;uۋ@uA8Y	t39HPt@@t
    @Lt9txuxu@u  3f~9^0ufFn~ u؋tTuP|$tyFt	   9D$3ɋ xV3҃QL$؃u|؋t1? u,Nt%F    IHy)   x uQuY}  uQnż  E t>Mx7QuЃt#En(  u~ ~u   En   L$8YuF,8Y	tA(FLA,A FL|$ A:E vE l$tL~  f#FNPfF~@fVG8@9F0tOHa؅uLN0G8ɉHL$|$T$$tF@8@(ȉt   ;Wh~ tE3ۋD$x	 t@uH_^][̃SUVW> ^4F\$D$t
D$    D$   n3tWF@fxFً#؍D$^8PSY~ uD$\$Pt$jF\$G;|~ u"V	D$PF8t$jTD$_^][̃$|$,SUVWuHN8;t+h-h hhěj(   _^][$ËD$8ȉ3_^][$À> u	|uV3ۉT$ҋT$8thT$fF@fXF#~8|$<utD$PFPWVD$4;D$$sF4L$*ϋ@(F8;wgA;tQT$C;|T$8;\$d|$<ukN	N8A;u[ʉQ3_^][$Ë;uT$8ȉ뼋T$8ȉAh-h hhěj   _^][$h-h hhěj   _^][$̃SUVWl$GD$ s+h-h hhěj蚞   _^][t$4WHt$4M ǎt$  \$(t$0wt0t+G8ʅt>D$PVjt$          t$0E L$l$,j QUP   Ѓ   L$y;ot AG8D$G4ȉOH$doG	OHaD$tOHaD$_^][ËT$ SV(OHt$7uT$0D$L$PUSt$ _^][̃,SUىT$VW|$@k$l$s34̉l$c(wʋ3Ap:3+3u H;΋l$Dt$;  p:36@;  C@8@$ȅue   _^][,ÍD$4PD$P  D$<u+h-hY hhějl   _^][,<u?  jD$<WPT$L]&    L$@  IH}   L$j QWP   Ѓ|  T$rt$8NHL$@;~tBF8ȉ^4$d~F	L$@L$3EʉL$,T$0C0RD$,T$$QD$,P%     L$ tIH2}D$$;D$(wftL$,T$0;D$wT$8UPt$<t$$qL$P	|ult$   p:36hD  O;tsO3rL$@	|h-h hhějܚ   _^][,ËL$@	|_^][,ø̍wc(Ƌ3A+F+;xC{03_^][,SUVWg(3^r Mp:+3w$3H;+Ս3D$3+p:w$+t$x;v;sNfD  s3N3ҋ+ʍA+;t;t_^][USUVW	 _tG
 u{ u
e   
  Cˋk0Ջ@8p$VЃT$;   ;   tKtj 3   T$Ct`@uj U   CHHAQt&B;Ar9rhtd3C3K0ɋ@8HVr,u   ;   vCK0ɋ@8H#h-h hhěj舘   	 tGum_^][]̃SYUV3L$D$CWt `@u{   {0s30̍wc(Ƌ3Ap:3+3s$H;;  p:3s$@;s  CT$@8p$Ήt$D$  L$tW39H~@29t	A;N|t$D$s$@VW4ȋD$(   T$0;GƉD$u_^][ËƉt$P׋;v+h-h hhěj"   _^][sKtj 33;v) u"L$3;L$֋PWO;wڃetuM|$tAKIH^9|$uC@8@     C@8@$    Cʋ@8PCs0t	L$ _^][h-h hhějF   _^][QSUVW3~uv~	 ~tF~
 u( t(؅t~	 tFu_^][YÀ tG0Bj ~	 tFu詾_^][YQSUVWEM D$@ }       }~19oPu"?  GP    f!GGLt@@uE_^][YËwL_Lty9.uhF~t`= tHpKt
PHV$)xIIVpKtPPV^3uD$9oPuGP    ?  ,u	  f!O@,u@ E x =H2@    IHqJ   x _^][BQSUVT$W~ ts~	 tF~
 u;~u?n} _,   GluG8_tBu<GNM@E]E@    /~	 tFu輼3_^][YWj>؃Ãt
u._,GtǇ    0E   s|$ h~	 tFuA_^][ỸSUV3\$W|$8  {	 tC{
 usv  |$    Nuzt<u}@   <u F    u>FDx.3ۄ~~xIHStFDC;|NtIH<tFDffu_謾~FDx43ۄ~~xfD  IHsFDC;|NtIHsFDvt"|$  \$j \${	 tCuۺ_^][USVMWD$~	 ^tF~
 u辺D$υu#KtP3U33ɅDϋt3QЋ5E~   }L$j EQjP   ЃurD$D$@D$xH8PHt!D$@D$D$X4@   @	d@ȅu@C0
AD$L$   x uJ?K@C.C@     ~	 tFu荹_^[]SVW~	 ^tF~
 u肹;yh~y t.~3~	 tFu5_^[̃SUVW;  ~1  ~	 ~tF~
 uuOtj 3觻؃   t$~؃   9D$}	GtG00    GD$HHh85y؅urjLSE G%EG&EfEG$*G(EEPfE@ E  L$ SGfOȉE4GȉE@G0   E3ۋǹ   @8@ȅu@G0~	 tFuܷ_^][_^]3[VWOw0s&h-h hhěj蕎   _^39A0DT$D$r@BDBpzJB At9p@uH B @u|$ ABQtJB yT u_^B_3^VW~	 t@F~
 ut$׋t$t$!~	 tFuɶ_^t$t$t$_^QSUVW~  	 nl$tG
 u葶E;u
FEfH;tuFFDx23~^xIHnFD[E;|NtIHnl$FD} u,Mt%E    IHY   x uq;^tX= tEpKt
PHS$)xIISpKtPPSpK^tS= t@t
PHS$)xIISpKtPPSEt} uF    3_^][YÀ	 tGuF    _^]3[Yfy2 u0QtA IIFPB@fHB#ȋBPJ8QRЃ38VF V$^ÀI@̀aVxF,^̃SUD$    V3ۋWt$8]   F~s3/e(ǋ3Ap:+3u$3H;;tp:3u$@;uFG;u0w@D$ PD$P賺   |$uD$9D$ ut$e   gt$M 39D$(   DPD$$P   VQЋu5T$ Z;stBC8SHȉk4$dsC	C83 ȉD$D$,L$D$(t3eD_^][ÅtKHk3eD_^][U$SV3Wt$\$,NtFD$fFFL$(f;Ar(h-h hhěj胉C_^[]ËF(V0D$$D$(+H8D$@(+;v*h-h hhěj3   _^[];smEȉD$ ;v+ωL$ |$$u9]tD$(HHr؅ut$ VWQWV; 3ۋL$ 3E+t$ D$  t$E+D$ ED$v  D$N0L$(P(D$$T$4L$Ήt$A   A,J+D$(3t$QD$$D$(tR$L$,;~6L$D$$Ij P Zȃu
A_^[]ËD$HL$(D$Qj p L$I*3ҋIt$tD$,3ҋǋt$t$L$9  T$,T$(	D  T$(D$;p0@  A4;|$rFADt+|$T$t$   L$D$Pj t$ +|$؋T$   T$L$+ύ;D$D$Fʺ   L$$39EDPD$0P   VQЋ؃uSL$,A0Ήt$9]tp؅ut$$t$$W	t$$Wt$(  3ۋD$,thh3T$D$$+ЉT$tqD$ uiD$(L$tTh-h( hhěj^   _^[]h-h hhěj4   _^[]_^[]UVW>u   _^]菳uPu׋u_^]̋L$T$9 uj t$t$t$t$̋AtVq0@<+A(;~3HƉA(^É2A(^QSUVWڊGDo<|)h-h hhěj2   _^][YÀgwt3fO2fGFfDOHWDDx3GDfGFGPWV_^][ỸSUVW3VDxB^t:  IHkfVDVDtLxIHQfVDVDunx+!  9~@u   _^][Ê<r<uF_^][蝰F^tn@N@D$;h0v8h-h
 hhěj      _^][Ë QL$QUP   Ћu؋T$B8 uHJ;it BA8D$A4ȉQH$diA	$ttIHPez32FD @FE+}     E39Np;   f3fFFfF2f9Ev_^][8E   }th-hI    M	E8n| |-h-h hhěj   _^][3ϋfLFHNDDx3FDfFFFPVS_^][ÿ   _^][h-h= hhějq   _^][V3ɋFtx u/VFH@fQH@8#ы΋ȅt^Ë^QVW4uω_^YÃu   3_^YSVW? _ut    3_^[uXwt8Fu(N	F8TfFfGF1u!wt8FtfFfHfGF3_^[ÊOG_^[Ãu   3_^[USVW\$;    K   S }C$;u;EuE     3_^[];E   |;       ;up;EukEKKt     3fC2CF@fCFf;ArfSF  y u%tet_^[]Ë9{ uE9C$  t  E 3_^[]ø   +ƉD$St3T$ZB@KD$JL$fpB#JD|$ t9rB<    A;   9sAT$ L$$D$ ;M|U;s~;~,U;M|J;vD^;T$4;D$u   T$\$z t,MfsF33fK2_^[]Ë\$T$fsFz uuB;|J	B8TB@fxB#ȋB8ʋf{FuD$h-h; hhěj~   _^[]ÀKC 3fC2EK$     3_^[]̃SUVW3\$|$f~wfKAD$$F t
uNSCD$$tICKD$Pq(9u~ uACACD$sD$0qC ? b  ot} U  GD3҉D$$~.wH_x     ff;A*  B;T$$|\$EOFH;ukE@fHE#EUD
r;wSVx<E;w)SBPQT$ ȃ{ uD$,3_^][ÀD    wtF@f F#FVD
j;wSUE xaF;wNSBPQT$ ={ u7Gtg8 uWh-h hhěj|   _^][C t  D$, 3_^][ËotD$$    ]K\$ E@fXE#EMDq;wt$VRT$ $  x+E;wt$AVPRT$    E
w +ȋEPVQUЋ>[  D$3ҋHq(;A0D  GRPI  D$3j VWfXFL$W>fD>  D$am  Pt$֋Y  = tEpKt
PHV$)xIIVpKtPPVt$yD$ st$$   t$$CD$ ;|$0k} uVE;|M	E8TE@fpE#ȋE8|$fwF0	3fO2_^][ËD$fXFD$,83|$3fO2_^][ËD$,|$     3f_F8F   h-hv hhěj z   3fO2_^][Ã= t\pKt
PHV$)xIIVpKt
PPD$|$3fO2_^][Vދ|$3ɸ   fO2_^][h-hV hhějjy|$$3ɸ   fO2_^][38QSUVW> uOFtx tF@2ۙFDD$~%3fDxUW@RP Ëˋ;L$|ߋǋ_^][Y_^][YSVWt,<r\  <   <u~     fFF~tf@fFF؀?    th  Ѓ   Gf;_   u&O	G8T   _^[^DtLf3NtfF2DVFfFF^DDtFtIHYNtFFf;Asy t3ҋ_^[K   e   _^[Ät3_^[h-h hhějw   _^[UQa3VfA28uAFQt@fAFf;BrfqF^]Àz t3^]^]SVWt(<r̤   <   <u	~  |p~tFFȀ ugG@fHGы#ЋG8{u<~t8Gu(O	G8TfGfFFSu~t8GtfGfHfFF3_^[fuAf^DtZf3NtfF2fDVFfFF^DDtFtIHXFFftËȍAfFFFtx tx u3ҋ_^[   _^e   [Ua3fA28uQFftAtx tBfAF3]]̃8SUVT$$W3t$3ۉl$,~N0|$4L$0G8@$ȉD$@;r)h-h hhějuE_^][8Å  T$T2ɋD$PL$\$<u/;D$0w;L$j QKR  |$uD$ɸ   DȉL$OH^"  T$@G8JɉH$݉\$tC88G8x ;|$0  L$<AL$<;  D$,j Pʺ  l$,T$l$DE8D$$X˅u<u8MH5^o  D$LL$48E8|$(I8 /3A l$,  L$A(;f  S  9|$PtD$TG  <?  D$LMHD$ 8D$((]  uI\$uL$4E83l$,I8 A q  KH]  E83K8l$, J  E8x;T$0m  L$D$8j P蜹s  D$8HH#],  L$8SE8\$8I8 ʋC8ɉH    PE8PC8P KHT\$uL$43l$,A8x   KH\  C83l$,8  D$Ts  |$P3ɉL$    T$$<u;vmA;rL$ c+y   uڿ   ;vAl$$D+D$Py=   u;ML$ G;L$ M;rˋl$DL$ T$$D<;D$0F  =  |$ t;D$Pt   |$T   L$LMH[   K9L$ sD$$DGD$$\$ɉHD$LK@0t;1wt3   |$(PW訷u$IH5[ttIH1S    D$ L$tIHS38\$tFt$|$4T$@=D$8HHR#h-h hhějq   \$tMHRtKHR_^][8h-h] h-h h-h hhějp   3럋OH38FD$<CZup:3v$~0G@~0D$D;uG~08^   s31L$wa(Ƌ3A+F+D$DƋt$;uft$<D$D\$DP׋ u=t$@NHYNHQu#|$3ҡp:w$w0NO0;uNO0_^][8Ë|$Gt$<t$,@8HϋD$TW0襵|$(IH,YjtIH$QUUS3Vu3ɉD$C\$L$D$W  ;s0  tGHf@@@֋XL$IHAAtP;Qrxh ts:2D$    9p,i  Q   ;   vVoUt$>  uD$H8A$ȉD$$@ȉA$C   uAL$ WQVP   Ћ  L$ uy;wtAG8OH_4wG	 OHAQtB;Arzh t9/D$    2r,      ;   v@UTt$u|uG4p$j w8 { tD$Pj jAt$ uC|$$ <  D$@8H ɉL$;K0vQh-h hhěj[m   3ۅtOH O\$D$tHHN_^[]ËT$$j RQP   ЋuT$$L$Z;Kt"BC8SHT$$dS4KC	T$C8r(HɍFL$;v,h-h hhějl\$   =F\$;,  KHAqtF;Ar~h tF 8-v,t	\$Q   ;   vSS\$T$t$C8NɉHC8MɉLt,Bu&OHq~ uAt~h u%  fAJ@3\$uFB0Qh   D$ 9ȃL$t@h  VQi L$(D$\$D$H@E;%oD$   \$H@\$uCL$WQuP   ЋT$Mz;OtBG8WH_4OG	 OHAQtB;Arzh t6.30r,t	\$   ;   v RQu׋G8L$\$ɉG8M@    D$@8H 5h-h hhějkj   _^[]̃SUL$VWq;u<v+h-ho hhějj   _^][A3ҋm4I+ȋv΋}(A؅    KD$    D$       ;u0   t"D$PD$ Pfuw|$u֋t/OHfyt%h-h hhějci   V׋tOHtJut$J3_^][Ë_^][h-h hhějh   _^][̃,T$SUVx h
WD$44*   \$@{C Kǉ|$ D$L$=   s	   Iȅw6rw   /wr?  w   NRQSK\$$4+w>rw      w$r?  w   N   RQ譀zD$@H L$L$ D$   s	   Kȅw6rw   /wr?  w   NRQ8\$$L$4t$݉l$(AD$4;<   .;Wt$LȋD$LS ;+Vj P 3_^][,i3ҋI4+ŉL$I(*T$(;D$4ND$DՍJ3ɋD$$L$$3|$(L$ D$4D$fD  ;ŋN;|Vt$S
 ~Qt$S 	Vj S\ D$$+ƉD$C  L$ t$+ΉL$ +uL$ǉl$,D$8y t^i$؍{|$(߃s3/̍wa(Ƌ3Ap:3+3H;;ϋL$tp:3@;tj D$,WPT$8 l$(\$,|$(t$0} t9usD$0PD$<ͅPPCt$<ttKHLGu:L$4ȉD$$tHH.GӉT$$B8     Z8m(|L$$tIHF_^][,ËL$$tIHF_^]3[,QSUVW|$?    F8L$D$F@hhCF	D$ʋF4;H(v*h-h  hhějd   _^][Yt$ut_^][YfFfHfFfuJL$T$D
    D
 F4@(D
F4@(D
F4N
P(F	++ЃV_^][YË+PCPSy L$(T$FD
FD
F_^][YUSVuWT$ s  F;Gg  WHBZtC;Br{h t>D/#K,u"   ;   vJOJȅtE_^[]Ë_8W	GO\$D$    ZAB؉L$T$;v   G4x(   uz   z u
z    A;   D$P貝ȃtrT$+ʉL$;L$   h-h hhějbM   _^[]h-h hhějbM   _^[]ËD$u.T$L$F;~?W   +֋σ;OetM_^[]ËT$JBIC+ދÈZˈBT$L$]F)G} L$tFPCPAP? L$ EȉVSQ* G@L$4HG+PFVP
 L$$NL$G	fGDuG	DG4x tSu׋S_^[]Ë]tVuS T$(]EtȉGG\$fTO_^[]SVWCs4FLVЋKfyCfx_^[̃4SUl$DVWL$E4U8u	m@x( \$0T$    L$L$HˉD$,L$82L2D$<D23;F+WD$0QPL$@ L$((39}@9~L$@T$<D$$D  AIY;D$4r;sэ;L$   L$,+L$ э;L$$v;D$$rz+Ήt$(+L$ M L$@Ί*\$ ]\$\$0;   RPQ C\$0;\$8}<T$L$9_bWT$$T$Oh-h! Zh-h! NL$<T$LD$HfBB fA  BABAD$@AD$A3A _^][4h-h! hhěj_   _^][4̃T$SD$UX8D$$Vt$0WD$8Ɖ\$T$4D$ ;  |$<39w(O(}@91~@,E D$8{ G<pu{ tL$D$$P-؃uT$4+D$;   +׉T$4ڋD$<T$8@9;v;rQWQS T$<ËL$ F+*ZT$0;t$ }MًT$4|$<9u_ML$8Ph-h$" hhěj]   _^][ËL$,D$4_^]3[̃A4SUi8X(A	VWL$Q
Չl$\$D$ 3D$(33ɉD$(;~   D  D$,@4;t$ rK;sGD$,@x3;t,t+T$QL$ 3ˋ\$;v3_^][ˋ\$EG;|$(|t+T$QL$ 躘_^][̃(SىT$L$4UVC8kt$8D$$C	D$(C@W|$D\$4HΉD$CŉL$D$;}iƋ+WPЃT$$;~+h-h" hhěj;\   _^][(ËK@m    PQPQv D$(+l$$L$;}+WPV+D$,D$(D$0H@I@D$(D$;D$  ;C<|  D$ ;}Ws@+ʍm    9L$@PLL$DVL$$NP D$HT$Wt$ PD$$VPz  l$T$<3ɉL$$8K   CD$0+t$ xq;t$@}kC@pL$,;~+PQAPp T$HGEf<p u	֋T$D$WjVt$8P   T$<D$L$$AD$C;ȉL$$D$hC@t$@Wh+P*T$PQD$(Pu<T$0L$fCC BC\$(B+*B3J_^][(Ët$<D$@؅~DD$<,    D  Gf< uGO4(ALQЋOfKҋD$@t$4T$@P_^][(̃h 3ĉD$dSUVt$xWL$$|$ t$,f o4u6h-h# hhějY   _^][L$d3Q hj D$,j PT$ x؃y  G$PD$GLWЋ|$SωD$$赜D$(L$ L$@3ҍL$$D$<L$DL$8@<WjD$@   D$PD$h   ؃\$t     GM(+D$+ȃO} t@T$(D$PD$(pj9fD$(f;GvD$Pt$	\$T$ JB@fDHB#J8L$эi	JL$y;ri	ѐJFL$y;rl$$u'UD$PD$$pD$4+SVP\$(M	E8T$(ʉTOH9L$t_^][3袣 h̃D$SUV8 WT$L$   A43ۋq8y	d   zj8DىD$L7GȋD$@(+P1P)P D$$H@HP+WP t$( 蠙ȅu+cȅuD$8Ht͵L$$_^][ËD$$_^][UT   3ĉ$P  SVu3Wj@PD$ډD$,D$4D$\$\  $`  $   P\$||$Dt$tD$$    D$     @ G4D$4uF_^[$P  3/ ]WO4s3t;u
EXKE   +\$DF+ىt$XD$<3;u	O	G@fHG#O83҉L$PȉD$L؉D$d   |$4;_0v(h-h
 hhějU      L$(j QSP   ЋЃT$uzT$(B   8 uaJ;YtBA8QHȉy4$dYA	   豗ЉT$t'   t"IH6T$   ƉT$$3҉T$   T$$<      $   ;9Q}ЉT$T$$;  ;|$IN|$:  \$8StGD$DK;u9C$PL  S8CLω|$T|$lЋT$C ߉   wL$D+ȋC@fHC#{8WL  ȉD$P؉D$hD$<P@LЃD$4T$0   @t@D$8+H8
T$4;B(T$0'D$hRWP  D$DT$0+x8|$hH  |$8D$$PRT$LG+zT$,T$W$   j P: |$3	  D$4w@$vHRPq!؃$   ux	  $   $   pD$@L$|AfD$\AD$D$t3D$09D$<  D$    |$HG_8wWD$`$   L$T$(\$lH8t$:b  G$   PD$|j APD     W9T$(  t9|$xf̋D$#ȋ$   ˉGu؉|$x|$Ht$38Wv3\$xO$$       IBGC;|t$\$x\$lGOÍH;s3|$xf̋D$`#ȋ$   ˉG;rى|$x|$HL$ D$0T$x  ;D$X   |$       $   \$,t$@PfQ؋D$$\$0L  V D$hT$x$   Ƌ$   fVf+D$\fV u$   G8@sD$@ CfVf<Vr\$,D$0BT$x@D$0;D$<D$\33ۋD$4L$ \$,@(D$<|$H   f     T$`F<      t;   uIL$ |$ uD$8AL$ @<   B   +~$   ~ D$X8D$    v?^$ 3FLVЋL$ [AL$ F;|ًD$XL$ T$`\$,8D$<A|$H   C\$,L$ ;&\$x$   D$    T$@t$     3҉D$,T$ $   ʉL$(9;|$H4  $   dh-h$ hhěj@O   3  h-h$ hhějO   3m      $   ;|!@D$  D$x    9   $   $   D$00DrNL$XfuэL$x$   L$(+|$ 9u';t$x}rfu֍L$xW3L$0D$XT$ t$D$,;|$H8\$x$   ʉL$01;   fff     $   pfu֍L$xL$0;|$HQT$(F|$ 1:u0;}*$   pfu֍L$xL$03T$ )   ;|T$ ;|D$,L$t$L$~	D$@3;~QD$,t$A@L$T$ D$,;T$@Xh-h(% hhějM   3u  h-hI% hhějL   3K  T$@FȉD$0k  $   L$XD$ 8   $H   D$,
$   D$(p+T$tBf<Q QD$uL$xg$   \$ff     $   f<q t$lt$`u֍L$x/tI} D$(~   L$   \$I9L$0    DL$,+ȋ$   p+;ET$l$   \$p+ȋD$XL$,L$@4D$`D$(MD$ $H  \$x8D$,L$0vt$@    D3;~~T$@IL$0$   3@8 D$F9t$$  D  ;t$<         Ǆ       |$(OHAQtCB;Ar;zh t1Wh-hs% hhějJ   34  3+B,D$t    ;   v2q1ЉT$D$p3+D$DD$;GHT$$A@;t      |$   } T$(L$LEȍD$dj QL$<P_ЃT$T$$uƋ|$(ϋT$词L$4D$     y t%WD$$PD$<pjx|$0|$u@D$dD$LF;t$      h-h% hhějI   \$$   t	3D$<3~   tIH)+D$<F;|3~"ff        tIH*F;|苌$\  _^[3 ]Ë\$3Ʌ       P@H0     f@fLH  3~ 90    @;|A;|D$3ۉ\$(3N;~.\$3       ;<   sA;|\$(D$   Ǆ   ;tL~D$4P0   B֋HH3fAA   ׋HHftH  fA$   xD$C\$(;Z\$D$   L$P@ȉu0L$<;t($   $   MDP8   H8BAD$4x   $   33D$P    T$ ^F9T$x  ƉT$(D$f     $   L$;ue38D$D$pG;|$}1   /h-h% hhěj5G      FD$pN;tD$L$(;   L$u&D$P@D$P|$ D$(   D$  ;|$}@;0  D$u;N8r	;N<   f|$\ T$ u&T$$RpL$<j+uD$0T$ D$$   PfuL$xSL$f;Av{|$ $   Pt$APQ$  ;$  sVV<L$;r
;   D$$PD$ p$  jTD$(ʋH4tT$0T$T$gD$T$ BT$ ;T$x8D$3H\$L  D        L$hL$T\$\D$P$   L$L$PӋ<$   \$LpЀy uI8A   h-h
 |$    $0  NP$   4APQЋD$$$4  $0  XwVrw   D$    \$LPjw0r?  w&D$       K\$LP6RQY]\$TD$    PuD$8WP@LЃT$T39$   }
@9   ~񋌄   ;r:;   L$8D$$PD$TpD$ PRT$TW%|$8|$dD$CH\$L;P\$   +ÉD$T;   $   f$T  3+?    |$T 4    }4  ;4      u3ҋ3Dh-h_& ;L$<}38T$4  T$x4   38D$4   +ȍ\$xSQ4   Pr$   D$D$$4   L$H+4   HD$T@D$T;D$\$} tlt$8f~ ua$   F	;AQx$   ։D$$D$$PT$(T$o   $   qI42ЃT$PL$4y tBf|$\ u:3~4   T$$Rp@8jPpL$@F;|֋T$$T$T$|$<;}&   uqыI4F;|މT$|$TGPlUSىT$UV3KHW{4l$Aql$|$tF;Ar9nht6>%~,      ;   v(G(uw|$j sD$PT$(xl$(D$ՍD$Pt$ |$d  CD$ u%uAh-h	 hhěj A~D$$     tMH"_^][]Ãs3<L$̃a(Ƌ3AL$p:+3q$3H;΋t$D$T$j RQ PL$,   Ѓt   L$A8 t%h-h#	 hhějE@   h+D$Hy%h-h(	 hhěj@   5AD$8pu
;D$ t)uD$ D$ ȉL$t!CPCPEP
 CPC$PE$P CEˋE8	C8K	T$_TD$ ^(3][]U$ 3ĉD$ SVW33ɉL$^t{ }o  SuFH(Cɍ@;  FDD$uW  F@t;t8 uHt;Nt^  @uV|f  FDFFF|^xFth|tDFF|$D$OHAQtB;Arzh t:
%z,      ;   v%%   |$ }u~   |${ t5{u/fCf;Cu%tG;D$uD$PJFH$1NT$Q3ɉD$|$QPD$t
D$D$KHC FNDAFDDtFt<#h-hE' hhějN=   L$tL$,_^[3
 ]USڋыMVW}A+u\$T$   3c  ހ; u\$F;|3_^[];B  JHAQtB;Arzh t4H%B,     ;   v#Q#   +Wj S> 3_^[];}!+WPQL$-   MIMӃr;us   :u+   B:AutsB:AutfB:At^D$HHAQtB;Arzh t,`!B,u4   ;   v#m"uEW@EPS 3_^[]̃SUVWM0U(}t^ ^
t$ \$;G<0  GG8;!  Qj V.  u0;   E(G4ˉD$x( L$j QSP   Ѓ   D$D$HiH;Yt$@A8D$E D$A4ȉY$dA	E fxu79 u27;D$s	A8|$+Q8WVt$(ND$&h-h ( hhějJ:D$   M tD$u=D$;t$ 3_^][h-h( hhěj9   _^][UDESVD$WD$     \$~F|$$OL$ trIV@t;t	tH9Q@tCIu$߈F|$ tH~D }Bh-hw( hhěj]9   _^[]ÅtVet_^[]À>rZt	n  |$$FpU    tMCN@SD$$GG @t/\$$@ @tG9H@u9P u9X$u @u݋\$UFt2C;F u*C;F$u"f~2 tGC C9F,u<Ӌ_^[]Ã|$ u%D$Pss  ^t{    >   h-h( hhěj!8   _^[]Ã|$ uujKft/D$(T$(CD$,D$fL$<PD$B D$F 3 D$PPssd  9D$JūKC9N 49F$+T$(L$DΉD$8D$H    _^[]Ëw  ET$zT|$$tyBXD$    D$D$ }   D$   L$ z tsC;vkD$(PCPWSD$D9D$4tQT$ D$L$PsTjie|$#D$ Pt$D$ |$D$  |$ FFȉL$   C;r*h-h) hhěj]6   _^[]ËKHAQtB;Arzh t6%z,u     ;   voQ  L$ C@fHC#{8{ uL$$D$(PCPWSfL$D;D$4tD$(PZfL$<3fT$D$D$:;   ;D$4   D$x tC;   C8K	
;s*h-h1) hhěj75   _^[]Í;C<v*h-h4) hhěj5   _^[]Rt$(WK 3_^[]D$:T$ L$QP|$  L$ }f{ v@ffFFȍD$Pj j t$ t$43fF28C   fEFt|$$@       FDx.~^xIHFD[G;||$$NtIHFD~p \$t>ss,FuKxCF8N<_^[]s3P, CKF8N<_^[]Ë|$_^[]̃<SUD$0ڋ@3VWˉ\$$pTl$D$ 覧K,   sE<3҃w
B+?  w   NRQKT$8<0|$9jpuZT$TL$Pw8rw   1w!r?  w   ORQKT$8|$L$$s0[(At,3;h<    v)h-h) hhěj2E_^][<ËA,D$;u,Bt@;s!VSW輫 D$,+pTpX_^][<ËA3ɋztl$,3L$8 D$Dl$(GD$<|$@;w|$r;wω|$=|$@G4OL$j x(L$+ȋWPQȨ L$;D$<NȉL$T$ +BTT$D$4D$ |$4xXD$$|$;H,s|$ D$,D$4GX|$D$$;vKHtF;A<v+h-h) hhějS1   _^][<ËD$$L$@(,0 +|$l$4t*;΋BWSRs L$ T$+׉L$+T$߉t$0tvL$(t|$DD$(jPD$0       UWЃD$u(L$(D$$T$YpL$+v(̓gL$|$  T$   D$u9D$   ߋt$0l$49D$,   L$ T$@PPD$HD$PPZL$8T$T\$8l$l$<ȉL$ At*tD$<Psj^l$Hl$KHL$ D$@ߋt$0l$4D$8t:@8D$,     PI(D$T$L$;sD$ȋD$L$L$T$D$|$NL$8tIH.L$(t!l$_^][<U8SUVWT$GD$hl$$t<ra\'  8  _tGDOFD$,CL$ \$(;wVh-h* hhěj.   _^][]h-h* hhěj.   _^][]ËC@fHC#K8{ L$}:nt+h-h!* hhějR.   _^][]ËL$D$$D$tL{ t5CLQSЋM(ɸC;f{tD$NX  { wu7&3fG28uOFftGtx t	AfGFl  o@ t&L$$U It;t	t}9Q@txIu$߈p uFD$x t<M W w$EE @t#@tE9H@u9P u9p$u @u݋KHAQt.B;Ar&zh tM>tWXt_^][]ËB,     ;   v1  t$D$0PCPVSD$L;D$<tD$0PF3T$ ˉD$D$PD$FPet$ w  {    _t9s}lT  GDL$,H;}D|GthKC@S8fDHC#B;s+h-h|* hhěj+   _^][]ËCLVSЋKHD$D$$AQ@TD$$tB;Arzh t?qD$    oB,tFD$l$SD$PUJbt$ t  \$(GH(Gtɋ@@;Q3^   ;   vD$uT$ D$L$(PUl$$t$,EPFPu   GDl$,;~QOtIHWDWD;~$fʋLxWDtIHhWD;ϋDxGt=   |$v9C9D$ rGfCfHfGF_^][]G   _^][]Ël|$ t<GDx23ۄ~ox M IHGDmC;|OtIHGD3D_^][]U$SىT$$VW\$(st$~ _  Ftf`@u{	 {tC{
 uR{	 G@8x4tCupR;~0v*h-h* hhějP)   _^[]Ë\$Gω|$׉|$ǋs38rc(Ƌ3Ap:3+3s$H;D$΋t$;tp:3s$@;uGǋϋщD$D$jD$ WPT$$в؃\$u>9|$  ND$D$ tP3RT3ۋL$tIH)
t	_^[]ËL$$j QWP   Ѓ9  T$$JL$;ytBA8QHȉq4$dyA	D$ PD$PW؃D$<   <     T$St$ t$(t$ ؃D$tHHq	DL$$SQWP   Ѓ  L$$\$q;~tAF8NHȉ^4$d~F	NHAQt"B;Arzh t2D$       B,D$u&   ;   vtD$D$t[NHD$_^[]h-h + hhěj&   D$ZHHw_^[]Ët$\$D$Pj j4U\$ uL$(SW  ؃tBNH#_^[]j D$,jPT$0f؃|$(t$$E
      DiNHtD$,83_^[]VW~	 tF~
 uNt$׋~	 tFu	N_^U,SVWD$;x0v*h-hz+ hhějl%   _^[]Ë L$j QWP   Ћ؃uTT$r8uRNHL$;~t!BF8D$F4ȉ$d~F	L$~g؅tL$	_^[]Ë\$CuGFHO@;t4h-h+ hhěj$NH   \_^[]~	F3ɉ|$3҉L$D$f;    F@fHF#^8~ uuL$j1  D$ PFPSVD$<;D$,tD$ P輹   D$L$AL$ ;w\$|$ֹ8   D$z u& ujT8   8FuMtD$ Q} t#vN4-NH0_^[]ËNHAQtB;Arzh t%3'z,u8   ;   v
	uD$L$ ΃fNH_^[]SUVW~	 ntF~
 uKMt$t9y@t	Iuj N؃uC~ t)FF @tf@tF9x@u @ut$׋j ؀~	 tFuPK_^][QQ@Ij BỸSUVkWt$;u0v+h-h+ hhěj!   _^][j S  E L$j QVP   Ѓ4  L$y;wtAG8OHȉo4$dwG	} D$       {	 stC{
 uxJ{	 F@8p4tCu:J9t$u0wO4ױOHD$D$  _^][ÅtOHE L$j QVP   Ѓ`  L$y;wtAG8OHȉo4$dwG	j t$׋j j΁D$tOHKD$  E L$j QVP   Ѓ   L$y;wtAG8OHȉo4$dwG	wO4۰D$tOHD$   D$0p:3u$N@D$~ ;t9s3,e(ǋ3A+H+L$ɃȋD$;uNOV      _^][wO48OH;_^][VW~	 tF~
 uvHt$׋)~	 tFu	1H_^SVW~	 ^tF~
 u"Hu
HlNC@8L$ɋD$~	 tFu
_^[G_^[USVT$W~	 ^tF~
 uGCH8L$HHAQtB;Arzh t%3'z,u<   ;   vuT$L$EȉD$MuK~	 tFuG_^[]̃SUVWW|$fD$uD$$     @    3_^][Åul$\$D  (   uދ~tOu8OucG؉\$tR    ^D   f3fF2fDVFfFF^DDtFtOH~tFFf;Gs\$@fFFNFG;uO	G8TG@fHG#ЋG8ʋ虗(|$8D$$L$_^h][̋A QVt$WFtnFH~8 Ft(V8N(B;Qrj8IAQD
F~(tv$v PWvD$Pt$W4~<uF   _^YQSUVW;{wbt^sǃ   ȉD$.tWhTISC   _^][YËCD(   u(KT$)Ј)3_^][YWh<IS_^]   [Ỹ,S\$8UVD$W|$@l$$NL$L  @ ~ 6  ׋-%  FL$(j QWP   K\$TЃ  D$(HL$ D  i͉l$4y teD$,PD$DPJt$t=
  uF   WhpIV&)L$@D$,utPPj jWhIV@(;vWhIVl$0K"     \$ ;πy teD$0PD$PSJt$t=
  uF   WhpIV})L$D$0utPPj jWhIVR׋zl$4\$D+݋l$$|y tttp\$ D$8PD$PˋIt$t=
  uF   ShpIV(L$D$8u;tPPWjShIV\$DD$ L$(8υt	WhIVL$D$t';Nu"P+ùJPJDPh(JVP_^][,́   SD$0UVWC;3D$lC D$pC$D$tG(l$\$TD$$   D$0   |$,D$8\  aO  VCDJL$\k QUP   ЃtPhPJSpL$XD$QT$z8j	;Bt#AD$,B4D$BJH$dE ʈD$# ZtDPhxJSHL$tIHD$lCD$pC D$tC$D$<@_^][Ā   ËL$XtPhJ뭋} D$(CJJBjIT$D   D$4BD$P+ȍL$(D$hhy|$   D$DxD$,8PtrD$@PD$CJPGt$t=
  uC   WhpIS?-L$D$@u;D$tPPt$ jWhIS$   $   $   P|$(D$<t$0	s@    ŉl$@D$L   T$8T$PfD  {    C$f|$L$4A;s  ;k  D$(L$xQPD$PD$P@Pf$   T$8;  hKS:D$$    |$D$LT$PD$Lfl$@|$$ $   $   $   PC    M  { T$z u{s@    xn\$@D$h,Xl$(fD  fE ̋D$(PBLRHǋ>t;vuT$y\$TD$DP@vU\$(L,E>ȍBt;vuU Ew\$TD$43ҋT$$     nF   9r&;DvA;r;vދT$$L$4;  +HЋŉD$4닋D$x    |$0 T$xD$|t#;$   |	;$   v   3Ʌt9;$   |.	;$   r#PRh(KS$   T$xf$   $   T$8$   D$0    $   $   ;   +σ|$H3t$P|9D$`D$,πx tkD$\PD$PACt$t=
  uC   WhpISk-L$D$\u;D$tPPt$ jWhIS<t$`3ҋW;D$x    D$H8D$,πx tkD$dPD$&PBt$t=
  uC   WhpIS-L$"D$du;D$tPPt$ jWhIS$   $   $   P>D$<    ;|$<8h@KS\|$<!$   H>ŉ ;uRPUhJSD$$    l$UPh\KST$4l$L$8+Iʃ> zD$D@;jUPQhKSTL$D$#I_^]3[Ā   ́    3ĉ$   $   SUD$tVWl$$u$   L$ t$FP @$D$x3T$tD$X9u
9Y\$E؀}	 tE}
 u9|$lt$(D$,N0$  D$8$   L$4D$<    D$@    D$D    D$H    D$L    D$0    D$h    D$TD$P    D$Xd   D$\ ʚ;D$`    fD$d A  j iU5  Uj Wt |$0N$@D$h  p:3v$x;|$4wL$0

t3D$DK   FH8A$PA L$,PD$D    T$$  ur~ tG33҅~t$  ;CB;|t$F@8@4;t7PQD$0hKPm!F@8@@ȅtD$(hKPJT$N3ہa A$A$   D$ D  |$8    <   ~ t{vvurL$(D$pPD$P>t)t=
  uD$@   WD$,hpIP-L$D$putPPj jWD$<hIP|$ $   hjPL$4*ǋT$C;8|$ FL$tH L$xH$     9|$4  |$8    D$0   (ubs3<L$wa(Ƌ3AL$p:+3q$3H;΋t$;u~ uWD$,h0LPD$0(t^s34\$wc(Ƌ3Ap:3+3s$H;΋t$;u~ tWD$,hHLPBG;|$4|$0D$@   l$$L$h9t$0tX= tEpKt
PHV$)xIIVpKtPPV|$@ D$et@tT$TtL$PYD$e$D$eT$<3BD$X    D$`    L$TT$<L$TT$<t$|u3ttыL$P	D$e$D$e3D$X    D$`    L$T}	 tEu4L$Tt%D$` |$\ vD$euL$PL$T$   _^][3fW    SUVW~	    \$FÀ~
 uj4~	 Nt69qPtA@t
     ALtD  90t
9xu8Xu\@uMLtf9yu91t5Iuj jȃt=A    A    y1ELAML:YvY3u	   f	A     ~	 tFu3_^][_^]3[UQVu>r7uh> t
   ^]ËFV@Ht;t	t 9Q@tIufFu   ^]ÅtV5Ujuu ^]USUVWڋu  f#FfFu fVj 3jeuxNy88_u8_thj    EeuSFHHAQtB;Arzh t%3%B,u$   ;   vu__  f!N_^][]́    3ĉ$  S$(  L$UVW  uN}x8 tt uӹS   yϋL$ƃ   h   3D$ WPNm $   jLWP;m   }W $   D$  l$th8P|L$ d \$tt$hEt$,Se   T$tL$% t"xEDShlLjQ 3$,  _^][3S    UQS]VWCt
PH}Gt
PH;uhLjW3   j j0   j0j Vl Ӌu$F׋uF~ >^F   F(    ttx tchLjW<= tRpKt
PHV$)xIIVpKt PP3)F@!V3   G@   Gt
PPKt
QP_^[]U4ASVWpډL$$D$ A@x$F$;ȉD$LϋǙL$8ȋL$PQj SD$$} 3D$4T$<;|$tD$ x    x    D$4؋+\$L$L$f;i  |;_  D$RPQSD$    D$<T$@{ 3ҍxD$$Hp:Iq$@;   j D$PD$(WP   Ћ   |$GOt&A;Gr9qht7   _^[]31q,      ;   vKuo|$t$0t$0t$S{ t$8Gt$|$t$ D$4WS{ EPt$0} D$@  u9EuD$$L$(@@@0ȉA|$t \$,L$L$0L$uD$4T$<_^[]U<S]VWC@t
PHKy	 tAy
 u-tAtPHstt	!  {SD$8    wD$,B D$t~u	   43T$4t u j 3ҋ:_{KD$8   L$4{ u%uIGKVVP$Yu-Ku${ uC   P^uC   CPCJ$@L$x$ |$ @D$u<u
;ϸ   ER0{T$3MD$(x;   C{D$;wt   C3ҋHp:q$L$@;tCjD$(PD$4QP   Ћu%T$PD$(pL$,tD$(@T$ku5S$+@C 9w/9s(I  C@A`C,Y`C(   ,  e#     {8W	tG8W
u*G@0    GD$(x0    HL$0A8IHD$4V   t$4L$(jLj A%FA&FfFA$*A(FFPfF@ F %f L$<   DL$(AfIȉF4AȉF@A0   F3	 tGu	*   |$te   |$C   K@P  ts |$uK     L$D$ ;  ȍAǙ3ҋCHp:q$O@;D$El$L$(D$D$T$4x@@|$0D$$D  ;   C3ҋHp:q$@;tsj D$PD$WP   ЋuUL$AQtB;Ar9rht%3'r,u    ;   v&L$tpD$$GcuL$3jp:D$ ʉD$$T$4L$(;|;D$rD$D$$T$(p:D$T$ ʅn  ;L$(   |
;|$$   D$t$j VRPQWD$0    D$TT$XEu @PD$8P   Ћu!t$ T$4D$Wt$
pRAЃL$t|$<L$ L$@L$ g   |$0L$@QW@Ћ   L$49L$D|
D$9D$@vQt$ @WЃ   |$G@tVjPA(ЃEu^3 u<O
W@tQR@Ѓ!3L$|$ j 3҉AuK3ie   D|$8 tK3gK3xi
     Dst@t
PPKy	 tAu|&KIt
QP_^[]QSVt$Wu3_^[YË^Ct
PHNy	 tAy
 u2&t@t
PH> tFH~( t F@A``;t	H,;uF,N3j j3~eE~t&y@u9$  u	AD,z Ny	 tAuq%> tg= tTpKt
PHV$)xIIVpKt"PP&z _^[YVz _^[Y̋D$@ ̋D$@$SUl$VW@ Ft
tuC;^s>@t
PHjUӋKAt
PPt~v,u_^][Utu~]̃<SUVW~	 tF~
 uA$	 tG
 u+$F X@+t<GH0@$RPj Qr D$D$PT$E(jS3ۃE؅   WD$,D$hPD$     fD$(fD$<fD$DD$L    |$8t$$D$0   GD$ P؃uN  f!A4D$@y u%AlA`t@   @,u   3貃	 tGu#~	 tFu"_^][<Ut 3ĉD$pESVH\$HW,  @L$HD$D,|s&u=   u
3҉\$4ыڃ ۉ\$4щD$4؉T$8D$<   D$y ¹yD$PD$8T$@ȋڋD$4ΉD$P T$4T$PL$@ |$X3Ӌ\$4\$4D$8ɉT$8*L$<0DdIL$<k9D$D|9D$HsDd-I   +PD$iPt$Tr _^[L$p3|D ]É\$hD$d    D$l    D$p    D$t    fD$x   tPr  D$l$hLP`$   L$|_^ [3D ]AuQ3A;tUSVWD$~ ~   } o  NL$;`  ^\$D$T$   uRP   ;d  sq;\  r&wer=   w\E    ~ ߉~~ +  ;`  r;6  9T$w#r͋D$;wE    ~ ߉~~    D$T$RыP߅uT$t	L$~ ~~ E       RPu^^tW9tEpKt
PHS$)xIISpKtPPS?߉~~ E    +NlD$NRPtIr؃u7   fFt	  	   fFF       F    _^[]ËFt(;d  s ;\  r   ;`  r	6  
S$} FtFtvP7o    fFtvF$ЃF  f!F3_^[]9Q}j dËA fa-A3VjV@t   ^ËNF NFD FND    f	F3^VFtu   tUV	t;   jt   #6FFj PY F  f!F3t   ^Ã~ tF;F t4u  f!F3^VWVFt<   jQt   _^6FFj PY F  f!F_3^QSVT$W~ }!j     tF    _^[YËF ff-FVVNQfAu+F?  fF|$ NfFt
  fND$<t	Ћ(_^3[YU\W   V)D$@fD$@L$0)D$)D$ FD$D)D$0fD$PL$t$T$@TD$(D$PBЃ~ ~V ND$0D$$D$@F~D$PfF ^]̃ VW   WD$D$fFt	H   	   fFGL$,t$|$L$@TD$ D$PAЋD$ _^ Vf~ }   fFtvF$Ѓ   fF^V   fFt~ tV NF    F    ^Q   fAuy tYQy tY f/r3   f/r	rk ̃A$PqIWfD$QD$T$UA$t	Q]èt|]èty t	]33ҋ]UA$PqIWD$D$]Atè$t
Q	Ek WQA$tAu-3YètYèt	taf.(D{Ӹ   YUVF$tV1th"t~ tWfD$T$D$D  fFf#VffF3^]VFt$tVQj tWfFH  f#ffF3^̃SVWFȨ-   F֋NPv(tuFT$NPv(~zi D$i D$f.(D{LL$T$;u$A;Bu  |r   | rfFH  f#f\$|$fFD  f#>^fȁ  3_fN^[USVN  
  $ u/uB菘  F   %P  fF3^[]ÁP  3fN^[]Ë3^[]Ë$tV3t1$t~ t	NWfD$T$D$D  fFf#VffF3^[]t"$tV h t	rWfFH  f#ffF3^[]Ë]BSfF肗    f!FFu^3^[]8^tӋ^[]Ð%fD$fAQA    Q   fAtOYø   fAYQV   WfFu~ tc  F    fF3FF    I_^YV   fFtD$L$   NfF^̋Q   fBtt$t$YËD$L$   JfBYSVWD$%{ CpE  fCD$_3E^K$[Sٸ   VW{fCu{ tRj j g   t(;d  s ;\  r   ;`  r	6  
V$    N fF   fF  ~F    F    F    NF    fC3sC$ _^[_^   [AtQ   tI3;Qx3VW%t$֋   _^U   fAtu]BA    fBufA  f#fEfA]QV   WfFt  GFf#fNt(fG    f#3f;u @  fN_^Y_3^ỸSUVt$$WL$,u/   fGt'3_^][ø   fG3_^][ËGtPx ʚ;T$t|snD$0D$(<uNFu+D$  3k|$ WfD$L$t$|!     D.
.t ;|;vD$  #\$0\$(uD$   D$(D$   D$;|q;vkD$4tt=uO蝹UЃ   fGt		   fGGt  t
@$@      _^][ËT$4u}D$   t3ۀ|$(3Cȅ| v    9W}j   OG Of!-GSUw_L$(*a fT$O   O   L$fu t|T$4Oo_u_Go t>;d  s6;\  rfT$O   GQ;`  r6  OfT$G5U$fT$OG҉W$fT$       L$DfЊD$(wfG<h_@u<KD$(;<3D$(uFGwAPQ_ G GD    L$f	D$(G3_^][_^]   [QS\$UVW|$   D$fOp+F0f$/|;s)h-hm8 hhěj   _^][YÍS9W}j uUG GL$j wS[uG    fGƉ__^][Yø   fGu td_^][YQSVWGt_(w0@<+;~	3ɋHL$Y;w@  Qfq3_^[YQR3ҋ_^[YSVWF      tNV	t;   jt   #6FFj PI F  f!F3uqFfNσ;t	ы:tF   tuu:fF  f#fuj ?F;uF_^[_^3[Sڅt)Q%  =  u
8YuA[u[3[U VD$    D$   D$    %L$WT$>   t   uv   u~$u`N3X }VL$j uD$$t$$W{uD$   T$WUW菍  D$$_^]Á   u&V
tufLL$T$|$ u	  L$ωT$     |$T$։|$T$            }L$Vj QuW  D$  D$@t2 WU L$W詌  UL$D$
_^]ËHuO   uGH   L$WfAf#UffAL$Q  UL$D$
_^]ډU ىHL$W"  UL$D$
_^]Ãy   j j(t	褶ͯt_t$W       @f@ fPpD$fHtUL$D$
_^]fPUL$D$
_^]ÉD$        j j(t	<t΋t$W    @f@ fHpD$D$ xu3ύQAu+ʁ?I+hj RPQ׋"L$ UL$D$
_^]Á     j j(t	c茮tRt$W U   @f@ pD$fH3ɋD$ @8HD$@    L$D$
_^]ËUȉD$D$
_^]j j(t	ߴȃ)  W   AfA fAD$AL$F   Vt-D$   fqtRP4H   QfA8Rt$hLP   L$thjjjL$E   t   uC<Atja  L$A,t	%  fAMt<D$@uHUL$D$    D$
_^]8HtыL$iD$UL$D$
_^]ÉL$L$et$t"   fFu~ tUN{   _^]VHtF^3^USUVWj h   ;$u_^][]h   nhj UB >GtpGFF    w^sNl9Npj jj @     _^][]ÍAFlE _@   D    D   D    D    ^][]Vt$V|tmT$D$PF|^̃SUVWt$FpNL$t   ؋3   39   ;|;vǴ   _^][ËvhËuUSıE;d  s2;\  rw&r8   w.;`  r6  ;wr;vUS֋mtU|$t(;d  s ;\  r   ;`  r	6  V$ȸ̉O0D$Ppph_3ɸ   ^]E[VWt   _^t$׋t$t$   _^UQSVW~l9~puuu_^[]ÍGFlFhM3JMfBBB_JM^J[]UVW~l9~pj Rj    /_^]ÍGFlFh   D    TD    D    _^]UQSVWwl9wpj Rj u   /FGlGhu   D    TD    D    ƀyW tu3c	  _^[]ÅyGlHGhj u
  _^[]UE3SVW} T$OpL$_lwh;  UMu+։T$$fK   <s   AL$u   D$DʉL$ 9Gpj Vыj 0HOh\$ 3f\\\\\_ltyW tt$3Z  }yHGhj t$	  [<i   QL$9Opj VRG   -AGh}G   TtD    D    D$$FT$L$BT$0whL$D$9j RuT   _^[]ÍA]T   \TD    D    _^[]UQSVWwl9wpuuu>7FGlGhD    D 3fAEAEAEAƀyW tUtvu  _^[]ÅyGlHGhEy<z u6uEBB_^[]ËMt%BJuA_^[]Pu  _^[]UESVWT$   RwP7؃uUBt.3_^[]ËENhCEC    C    C    FlCEVl؉T$L$BD$9VpuЋut$ ЃT$BBFlFhD    D D$3fAD$AEAEAFhD$yW tSI  T$7yFlHD$ | tjSЋi  T$X@Fl~]D$. f\GtEG_^[]USVW}      UEPVw؋   D$VlT$9Vpj PR   4|$BFlFh|}   TD    D    yW tS,  4yFlHFh| tjSЋS  tX@} t
D$   _^[]UQSVW~l9~pj j R   /GFlFh   TD    D    D    yW tub  9y~lOFh| tjuЋ  MtH@Fl~NhfEfD39K~;   3ʉ   tCD8x	 t   ȉ   A;K|͋N_^[AtEA]̃SUVWT$
   3+O8_@/L$uVQ萨_;d  sL;\  r*   w<w@D$L$G<D$Il_^][;`  r6  ;wr;VQӋutӋ)w@w<_^][Éw@uw<_^][SUVW   ^%} @S@   FlFh@waɃwJ$8x t         9   ῁ɀ      "H;Nϋ9xOxHyыH;Fht뎅tS@LC@    C8    } _^][f88z888888QSUVWFl;Fp~t3_^][YËFlFhD$~\T$BBAYBt: ~FlÉABA3A A    fAuD$nl_^][YVW~ tV tXϋ_^MVWWBt,׋_^!SUVW	  $4;T$_^][T$   _^][      L$      ыI_^][鷡T$B   _^][頡   u2t$      fFu~ tCN_^][eT$_^][   uLt$F.u@~^GuGtwЃ׋tS@Ѓ֋_^][_^][f':4:4:4:::-;I:y:4:QSUVt$WEtuE E    y++ohgfffVt${   _^][YË\$utVN Fu+?t53փPR'tVSWvH 7 }E_^][Y3}_^E][YUQVyW tUtfu^]ÅyVlJFhMy0z u*EuBJ^]Åt!BJu@^]Qu^]VyVlJxW tI^ËFh^̃$BSU3D$    D$    l$ى\$D$ ʚ;l$ fl$$VW  $<@ZCPD$hLP33f;C   {t0%L@ :utP:Quu3LCEξ%Q(LDPLDPD$$hLP^CE;qL$(A;L$ rjLL$ \$  D$\$L$(D)  JA4D$1hMP  JPq D$ h$MP{  BHڋBp0D$ h7PT  rD$h,MP:  B D$ $h7Pj  BHtP   $tp0D$ h7P5   u80MD   BpD$h8MP   z   ;r2[    4,   DPD$ h@MPF;vڋl$ L$(A;rjHML$\$FD$\$L$(D]6LMBRt!ʍqAu+΁?QL$AD$,tL$t'D$( |$$ vD$-uL$_^][$ËD$_^][$Ðw>J?>>-?>?;=V>???>/>QU都    t[E SW3X@D$~DVw    t&   tty	 tAy
 u	iD$Gƃ;|^_[]YQSUW3E X@D$~:Vwt#   tty	 tAu	D$Gƃ;|^_][YQSUVWt|txY<   t&q ~ tt諚(F;r_^][YÍq    f.t
NS~ tVqF    3f(F;r_^][Y̋T$
   B   ̃SUilVW3ۉD$3L$3҉\$ l$tX@t	Xx333ɃrSpDh;|3;}L$HL$.ȉL$L$l$D$4 @D$;F  D$(P  D  Al;}ih$+3ɋ@;|    A+@;},|$ m        ͉L$$yuz3   ~I9t@;|;u\L$3PL$A$uxT$L$$zACfBf#D$(ffB    BAL$HL$L$|$0 t8D <t-<@D$u @D$;}5L$D$    ՋD$L$4_L$4D$1L$8^][ËD$L$D$ e   A$    ̃SUVW   wX$/(l$ <tE %    u3      $Gx    u詞   _^][ÅtWXh  3ҍD$3PD$PG P   $<Qv؃U  (   D$D$\$t/G$	      EQW_^][ËӋ      D$   C   fntRP	Vf^N(D$@fitRP	QfYNPD$@fitRPgx   &  x   QfY     D$fntRP.	Vf^D$N(j jjj0!D$$NP@fitRP	QfYNxD$@fitRP	QfY   D$@fitRP	QfY   D$@fitRPn	QfYf(  t  <   f(        T$0hpjjjD$0f   wxxW t   G$   _^][G$    d   _^][̃DSUV   W   {,ǃ       D$,   ȘL$DK(D$(C`L$@D$u~GFlnh   C0+l$ΉT$T$D$${ t{ t    3   ȉ         
   ;L3|$033ɉ         <   L$<3<E3<   h  l$<;s7xW u$0 +j jjFtj%C;|ϋ|$0l$   D$3ۋT$$L$0;(|;w"+WÉD$LfD$H*l$L\$HD$33ɉNXL$(D$<    D$ D$9D$<|9T$ w+T$  D$D$LD$\$     FdD$D$    D$    T$ D$$D$9D$ |9T$$w+T$$L$D$ʉD$LL$\$$l$L$N\L$@L$L$H3ɃD$D$    Ƀd$L$<;ȋL$(|D$;wD$+D$D$؋D$l$<F`   L$,US\T$4   D$zW    NXu3;wD$0r;wL$+ظ    ˋFdNXu!3;|9\$ w+\$ L$l$4L$FdF\u9l$|9\$$w+\$$l$l$4F\F`u9l$<L$|;wD$+ÉF`L$(T$,zW t3fFFFhD$@FD$DfFFd~!   @ IfX@(@    FX~~3ɉOfHH@(t$Hj v`$ _Ɔ   F F$    fǆ   F(    F,    F   F0    F@    FD    ^][DQSUVW    t"   V,RHAЃ_^][YË~,   )׋  _(tX= tEpKt
PHS$)xIISpKtPPS׋F,    _^][YËN,S1_^][YQSUVW339~~!F`tF`    G;~|ߋCFhC4FlCFXC8FCF`C,FK S$H(P,CHKLF(N,KPSTHhPl   .t2    GtwЃG׋͉   ?   uՋC(_   C0^]C(    [YQSUVW   t)At	ȋAuǃ       ǃ       39s~!C`tC`    F;s|ߋSKX      D  GOX   3G<,9w@~@ T tF;w@|OXW<pw((t*D  FtvЃF֋͉G("w(uۋ׋	   r   t3;fD  FtvЃF֋ω   ύ   u_^][YQSUVW   ;ftKtStt4m    f   j PQCtt!~   NfH8@(@    _^][YÃ4SUVWT$033D$$3D$   L$,  D  ;|  }/Xt @<tSЋL$4Ӌ*  L$,Et3  D$(  3 ;G   G\(|   {uv{	 D$    tC{
 uCG|(tA( ty u
y uD$$q,u9   u
V{	 tCuD$(@D$(X_^][4Ã|$  t(   t   Ћt  _^][4ËOA@ P   T$tԼ
  jBu+?  |$$~  W3D$ |$ D$    fD$8tFԼٍSD  Cu+ځ?j Qj hMWqD$u   _^][4Ëu3΃D$$tdpuPhMjݹD$0EPjL$8t$,PQhM3Pj}D$4PD$$j VP@ Ћ  9D$4t7D$$PhMjr\$,Ctj t$(SЃ  \$ l$$D$j h@  PՋ|  3ɉL$,9O   D$<3҉D$(D$8T$0D$$GDtuxuo@    t`ӍJBut$(t$+t$(?BPASVЃKCu+ف?CD$$T$(    L$,T$0AL$,T$0;Ok\$ L$t@0QЃ   {   L$jQ@ЋtdL$|Ct	j USЃD$ϋ_^][4ËL$|D$ Ht	j UPуD$ϋ_^][43ۅu23ɉL$0;_}&GDtՋw!L$0CL$0tՋL$L|tT$荈_^][4ËD$ HtjUPу3D$ϋ\uMXJt39_~$3@ GL(t
   "C;_|\Jtк@   KA _^][43ۅu33    ;_}!|( tL(3 OCt3ۅu3;_}D)t3ҋZ"OCt_^][4̃SUVW3D$u ]0Kl$ \$V|$~o3 F3ɋ\(t=|$ut$Q&ȃFut$Q%ȃFuL$AЉL$;|\$l$ D$  E0    u*uSЋA uS   A |$u$EHML     EPMT    _^][Vt(         |u3^Ã~D |~@ vhMVF$  Ɔ            M^̃SUVW>W tF$      v  3ΉD$)F$   t
t	t	t3   ͉L$t^   @t	L$	tJtu tD$   +  5 / GUF(    F,    3ɉL$~$ t      u7Ņu1   ~D |!~@ vhMVF$  E }|   ~     U      Ѓ9     ~$ t}    |$             D$xLtFhMVF$  E    @t    t   _^][ø  YW$3o ʃto    W$8֋u&   @t!    t   _^][ÅtF$3ҋT4 F(    F,    9g G$gǇ       Ǉ      Ǉ      Ǉ      G$L$Ǉ      tg   t\~0 tVыtIN$tuV|F$t>F|      3 T- GUF,    F(          |$tMV(ʋn,OpGtŉGtUL$d9N$tE <t<u   L$F   L$8GpWOtfD$l$T$GpOtWholF(    F,        t0      @u      t   Ɔ   W tF$      39N$_^]D[SVW| 7_$   FXXJtЋ$  u6Pj(څtW    @f@ fHp$  tW|jjjj\JtNXÉ^@FD_^[Ë$  t+   fHt^@FD_^[ù   fH_^@FD^[UVW   >u~  |$   u~| uF$G@V|tF|    Fx    GH#F$_^]QVWL$7t\S\$Ul$    x 9uNx   t~FtvЃF֋L$m7u][_^ỸSUVW|$Ott   \Wt2   t`     } ut$t7uN44F<vЋ;t׋t$Ջu|$    t.WOd   t   toht8Gl4F<vЋG;tՋR   tA   uOGtACOtGA׋_^][	̃D$3VPvDN,v@,u;9D$t(h-h]I hhěj譭   ^F 3F     ^QVW~,?rtF     F_^YÊ3F     tF_^YQA,8 tY3Ý   rA((QS\$UVWF  $`   C          f_^][Yù      f_^][YE       Sf_^][YE M      Sf_^][YEM M      Sf_^][YEMM M      Sf_^][YEMEEEE     3   {f_^][YE EEEEt$EEE3ҋD$щƉCu      f_^][YËȁ    u% и   u      f_^][YÍGC          f_^][YÍGk   C},_^]f[Y n^^^^^0___l`l`M^n^QVWGȋOH RPt~%xȃu_^YÍA 9AfGf@_fA^YU$S]L$MVWT$ qA ;;t$sQKx:CǄx% T$|$3;L$tM3ۉT$ǉD$;       ;D$    Mʀ91sPQx8AƄx% T$(t$(3;L$,tT$L$ЉT$T$$QBAB։AA    A    ML$   r(D$CMƋt$(D$t$f;YsT$;;D$ v/ft*   fFtNɵEfX_^[]ø   fF_^fY[]UTSVW}_8^urGrvvwЃ_^[]NfFD$LD$P    D$$D$(    D$8L$Hr   @  fL$HL$HBfD$ D$r%   @  fD$ D$     u8\$Jut$@D$Ht3ӍL$8D$ W%  =  u8T$"uD$D$ t3	L$ttPt$ GVt$PwЃEt 3|$P t	L$8蘴|$( t	L$舴_^[]SZUJVWu}Ʃ   tg#   t
E +_^][3   t$~J< u@;|E _^]+[_^][Å~M< u@;|+:_^][_^]   [ËM;ROr;ust4:u't)A:ButA:ButA:Bt3u+_^][̃ f/VL$wWf/sE(V T$;|3L$5;r);-|;w' L$f/w3f/^Ã^ø   ^UQSVWGsȉD$֋	D$D$t+ʋ_^[]è,`  #¨$   tf/X  f/   $   t~ f/  f/  (V S;      ;   ;|   ;    f/   3f/_^[]$   Ws;      ;   ;   |;w{3_^[]tm$ty f/wgf/sL( W;J|7;r3;|>;w:& f/w3f/H_^[]èt=u   _^[]u
_^[]ËEtj P׋4_^[]Ë׋_^[]U\} S]VWT$[L$$   Br=   s.
   t$L$(<D$   |$ (  JL$ xCJȄxD$   T$(蚼3ҊȋD$(;T$,tT$
Ft$L$=   mt$f
L$   s   mBD$ xȰL$NBxL$ % ȰL$(L$T$(L$(3҉L$;T$,tL$T$t$L$ D$    ;|$$v.h-hL hhějwE@3_^[]C21$  
V    |$   D$@P,D$D f/v  f/r
      S;|;s
     ;|;v  V L$@f/v
   h  3f/IY  o  $q`  OJ  GO+  OOO  GʋD$@ʋD$@ʋD$@L$(L$IL$(    ʋD$@ʋD$@ʋD$@ʋD$@ʋD$@ʋD$@ʋD$@~3ɋS;  ;  ;  ;     ET$ @      C  3     
s+  D$@PuL$@f/   f/x.   f/af/  - T$D;  L$@:;  ;*|;  f/  f/  q     rQ   ƃM  6  NL$(L$L9;D$$  EB;D$  D$|    BL$@D$RBD$T   fD$PD$ǉD$HEPD$ t:  AƄx% JT$06t$03;D$41<{;ϋSLL$ L$rfD  ;ust4:u't)A:ButA:ButA:BtɃ3ɅL$(+K8  )     rIQx
7AƄx% T$8Wt$83;D$<  ΉL$(    T$ y;D$$  C   t&3tT$@ < @;|+   s;L$LʋSrf;ust4:u't)A:ButA:ButA:BtɃ3ɋD$(`+K3ɅJEL$AL$@;   (   rF(|$ 3Ɖ|$    tBuD$D$;D$   ;|$$w~T$Nh-hIM hhěj菚E@3_^[]ù   h-hgM hhějJE@3_^[]ËE@@_^[]ú   ;t_^[]fjjjjj	kqkT$L$j t$UMASVW9?	  $XsM  OM4  GOM  OOOM   GOGGGM    GGGGGGGWfD$\$t$   3ۋExP;|;vH_^[];|;sH_^[]fxvjыMP_^[]H@_^[]j uыM_^[]f=s{qqqqqAr=srrU    S]VWK}fyTSx
:KȄx T$KkD$3;L$uK}E@_^[]èuE@_^[]+L$ȉD$;M~.h-h1N hhějҖE@3_^[]Ë}L$w;WM˃rfD  ;ust4:u't)A:ButA:ButA:Bt3<xED$+Gu-fvMjW!_^[]GG_^[]Å~G_^[]G_^[]̃XSUVW
](3M0},fD$(D$0Ett$,@<+;~	3ҋȅHʉ\$ ;w@  |$$fD$("D$3PW9X  |$$\$ 3   rKx?   ;   T3,3      3xDqCƄx% 뫍T$+t$3;D$tD3x% T$MT$3;D$uZrU	wPtK(1;r=+D$@P;D$p|$0 L$@T$DPt	L$C3_^][XÃ|$0 t	L$)h-hN hhěj.   _^][X̃0SVWz,.O,3у   r   3t$$fD$ D$(Gtw(W0@<+;~	3ۋЅHӉt$;w@  L$fD$ D$3PQ9udL$t$j t$D]L$L|$( t	L$43_^[0ËD$Dh-hN hhěj     &   _^[0̋D$ApT$QtAhQl̋At!BD     ʉ   @uQSVW   AdD   9j j(t	g`   W   FfF fF   ~fFtCع  CFf#fNt$fC    f#3f;u @  fN	jAN<  _^[Y_^3[YUVWGwFh<A   DtM NNDPGp h,NЏG   jjjjçta= tNpKt
PHV$)xIIVpKtPP3_^]V3_^]_   ^]QSUVW    U|u ta_u3AˍQAu+j AD$Pt	e^tt$SV	 u|wtf= tSpKt
PHV$)xIIVpKt!PPG    _^][YVG    _^][Y̋D$t   u3ø   UVW8|HHtT$RPыT$D$)L$QP@@D$ YP}	 D$T$+   j    h@B RP    D$T$tRP      уG^tD$P   V   jЃ_ǆ       ǆ       ^]QSVt$Wu_^[YË>u2hPNjێh-hZP hhějG_^[YËGt
PH    |	    v	֋3ۀ   r	E؋W uuwH#f _^[YËӋfϋM _^[YVt$Wu3_^Ë>Gt
PH    |	    v	֋Ɔ   F F$    fǆ   F(    F,    F   F0    F@    FD    W uu3Ћ;fGt
PP_^SUVt$Whl$t
UH33f;F}:3   Ndfiuy t
Fd   CfL8(F;|ыl$    t      t
UP_^]3[Vt$WNto   tVV
t=   j蝔t   #6FFj PO F  f!F3t3_^fN~ tF_^Ë%  =  u~tu_β^̋L$At
yuAètQ   tËèt3ò醭̋L$At
yuAètQ   tËèt3òF̋L$At$$è$tQ	 $$èt^$$W$$UEH$t ]t g]tx t聙]Wf$$]UMA$t	Q]èt]èty t	#]Wf$$T$]̋D$   fHt@3Vt$  fFf#
  f;uCD$t;~pu5D  :utQ:Puu3uF^3^̋L$u3Q%  =  u
yuAuܲ魤̋L$u3Q%  =  u
yuAuܲm̋L$u3Q%  =  u
yuAuܲ-̋D$@?̋D$  fH3f#f;̋D$@UVW}       Pj(V   W  FfF GFf#fFF    tE%   @  fFat9   fFu~ t%NKY3_^]èt	%  fF_^]_3^]QVt$t"   fFu~ tΕNX^YUQESVWuًuR;Pt:tk   fAt=	   fAC   IQ__^[]GSuW8WtGt2O   tG;Hx~j jjjNC   y_^[]t$T$L$j t$U} w"E=wuUMj P]ËEttuЃMNj jjA   	j]UEV0   fFt		   fFED$L$%  =  uD$ u   fF^]UMEjjRUA   	P<]UMEjjRUA   	P]UQMEV   	fqtRP=^]É   QfA^]UE   fBtuu]ËEM   JfB]̋D$    fHt騒   fH̋D$V0   fFu~ t豒   fF衒D$%FpEȋD$F  fFD$ EȉN$^̋D$D$A   f	At$T$L$jt$iU}   MEу} w!E=wuMRUP*]ËEttuЃMNj jjA   	j!]t$T$L$jt$t$T$L$jt$UVW}   7fFtU  BFf#fNt$fB    f#3f;u @  fNFWuV8Vt谅Ft2V   tF;Px~Nj jjjG   _^]UM3ORPu   ]UMVW}1F@x9Ur/w;v)j jA   Njj裘   _^]ø   fFu~ t  F    fF3FF    Iǉ3_^]̋L$Vt$EF@   dtatE-  t'sRtGj jЋj^j jj^j jLj^ú4j jj^UMNj jjA   	j|]QVt$   fHt覎F   IX^Yù   fHF   IX^ỸSUVWt$$   ><   <t<   Vq   <u   t/       F$   %  [GH#_^][Ã    u
Ǉ(      G^tU    uL    tC   8|HHt	SPу&L$QP@@D$ YP S      @u      t   F     Ɔ      t|   O-     l$duG@_^][Ã    |	    v	֋e   U    3ɉL$9O   33G\   {	 tC{
 u;CD$        tHL$@    {	 tCuD$~,  t"|$ uPG4W  ыȃL$L$E;o^t$$l$N$t       }	ho@V$yW utWu    F$LGH_^#][U   S]VW3uhNj~ 9;uhPNj~   3t*h-hS hhěj}   _^[]ËD$@t
PH!  @ G|$2  C L$;   j QD$   SPjxw    t$|$ :   |$:   :   t$ t$CNFCKNF   K         ΋                                   F$       rhAS[|$ |ƃ      |$u#TD$$  u33Q%  =  uyuyt3	D$S|tML$yW udu3։C|T\ύQAu+j AL$PD$ PD$tt$WP D$ L$։C|FTC|       s$\$Ct
PP_^[]̋D$@@̋D$ @̋D$   fH3f#f;UHVD$W     H  fF  f#
  f;.  ~p$  N@ :utP:Quu3  FD$  } 8tLg3fG28uGFOt@fGFf;ArfWF|$  Ky uAiu3D|$8 te   _^]Ë|$7W)D$ )D$0fD$@v,H0P(@tT$@<+;~D$    HL$T$(;w@  t$,fD$03$D$ PV3B   T$(T$zJsRAD$xа:AxT$% аT$WT$3;L$tL$AWG@TG @  fGtt   D$8D$0   u|$8 t	L$ 蟆_^]_   ^]̋T$L$j q̋T$L$jQSVWs7   fFtF    F_^[ø   F    fFF_^[9~}j F ff-F   fFCFtWj P F_^[QL$Afx |T$XYË@YVt$F   tT$9Pu;Ntx@u3^Ë@^UQS]VW}KL$   t9~u;Ctxvu	j jt))L'Ft`vЋEFEF_^[]0EtJL$WF    C~   FÉ   x u@EFEF_^[]ËEtuЃ_^[]̋D$@@̋D$t   3̋D$txx t   3QVt$WuhP[_^YË@t
PHVxt   L$;}x   A@   |~PPV$yW uu3dNF$It
QP_^YQVt$WtH@t
PHVxt   L$;}x   A@   }PAtyuy)tQ   t9t3	螖t.V$yW uu3MF$@t
PP_^YVt$WtH@t
PHVxt   L$;}x   A@   }PAtyuy)tQ   t9t3	ϕt.V$yW uu3LF$@t
PP_^UVutG@t
PHVxt   M;}x   A@   8|PAt$tQ	 tlWD$t.V$yW uu3KF$@t
PPD$^]UVuWtG@t
PHVxt   M;}x   A@   g{PA$t91t ty t	WfD$|$t.V$yW uu3KF$It
QP_^]USVuWtG@t
PHVxt   M;}x   A@   zPA$t9Y9t&ty t0WfD$\$|$t.V$yW uu3-JF$@t
PPǋ_^[]QVt$WtN@t
PHVxt!   L$;}xu3K   A@   yPQ%  =  uyuyt3	赋t.V$yW uu3WIF$@t
PP_^YQVt$WtH@t
PHVxt   L$;}x<   A@   xPG    t%   @  fGt.V$yW uu3HF$It
QP_^YVt$WtN@t
PHVxt!   L$;}xu3K   A@   xPQ%  =  uyuyt3	6t.V$yW uu3GF$@t
PP_^QVt$Wu`?_^YË@t
PHVxt   L$;}x   A@   :wP@?V$yW uu3GF$It
QP_^YSVW   >;      D$Gt
PHNt|$ t2u3aQ%  =  uyuqDt3;0u3/Q%  =  uyuqt3	蒈W t4    u)0  GW Ǉ(      t36  f4  3Gt
PP_^[_^3[QT$L$j j Y̋T$L$j j̋T$L$jj ̋T$L$jjSVWuhNjl!> uhPNjl   3t'h-hU hhějhl   _^[Ë@t
PH   tb   A@   t@t
PP   hNjlh-hU hhějk   _^[Ã|rF;jFdOȸ   fCu{ ty   fS@@       t&|   t      3_^[Ë   A@   sIt
QP_^   [QSVWڋc   T$txt$ Gdt$(t$$t$$K@u-8D$$tHCPTuS88Su3/Kpmt!։q@NsyW ut	KC@t'PP_^[YËD$ tt	t$Ѓ_^[YUUVW}ua9EtAEuVGdIȋERUPot։q@rB@t&PP_^]ËEttuЃ_^]UQS]VW}u^Ut;uGdKVuut։q@
rB@t'PP_^[]ËEttuЃ_^[]US]VW}EuuKd<Ѹ   fGt
Ov	   fGED$L$%  =  uD$ u   GfG@t
PP_^[]UERPuu	   ]UQS]VW}uQOdѸ   fBtuJu{EMBظ   JfB@t
PP_^[]QT$VW|$uAt
PP_^YS\$Vt$Wu`Kd4эNUuD$%FpEȋD$F  fFD$ Nع EȉN@t!PP_^[ËD$ t	t$Ѓ_^[UQS]VW}'   9EtpGdujȋEKRUP	}u'CPTuS88Su3/K?it!։q@oyW ut	?@t'PP_^[]ËEttuЃ_^[]UM    } EыMUPuuuu]UQS]VW}   9EtpGdujȋEKRUP{u'CPTuS88Su3/Kht!։q@myW ut	=@t'PP_^[]ËEttuЃ_^[]UM4Q?SVWH3  $q1uu`_^[]t
Q	A $uun_^[]Ë}   t~ϋu։D$0؅u]Gd4ȸ   fFu9^tN rL$0  fF3F    FIF    F؋Ht
QP_^[]ËA]ӉD$4AωD$0!Y  9D$0t?Od4jPD$<RT$<Pzt։q@=lD<@  PP_^[]ÊAY}D$0AϙT$4UD$8\$<   t}ET$<jt$4Gdt$<t$DȍKgyu-8D$0tHCPTuS88Su3/Ket!։q@ukyW ut	r;@t9PP_^[]Ë}ϋUuHt
QP_^[]ÐPjQS\$Vt$Wu_Kd4Ѹ   fFu9~tNp  F    fF39D$FMD$FF    @t
PP_^[YSUVt$W@t
PHl$@x9T$ rw;v   l|$΋؅uYFd<ȸ   fGu9_tOTo  G    fG3GG    IŉG؋@t
PPyW uu3	9At
PP_^][̋D$t@3ËT$u3Ë   tVr   W|$9<tA;|_3^_A^̃T$thtdW   u3_ËGUl$VD$   SU_RS u8+tt;t$}T$֋[^]_[^]3_3̋T$u3VqAu+΁?^D$ttQ   63̃SUV@T$WtPHT$33L$f;E}p3۸       rd}dfFu~ tcmT$L$   A(L$GF~G fF fGG    E;ȸ   |@t
PP_^]3[̋L$T$fAf;Bt   Ã    t          t      ̋D$t 3̋D$t   ø   ̋D$t   3̋D$t   u   3VW|$GtPHGt$uwvt
PP_^̋L$cuTVW|$7Ft
PHD$D$    ω  腮Fǆ      _^t
PPD$Ã|$ D$   t
ǁ       ̋D$t   3Vt$tFW   t6@t
PH׋0   @t
PP_^_3^3^UtSVW93҉L$ D$    D$   GxT$<T$8T$@D$DT$HfT$L   |$0   8   F<
tuL$H;L$@rjNL$<UfNL$HfDND|$H+;|$@rQӍL$<]UtD$<Q+|$LSP L  T$<jf9QuGu3ɋQL$<U#  ΍QD  Au+ʋց?QL$<T  8J  D  3ۋ\$,     T$(e |$(   t؀? u|$,L$H;L$@rS֍L$<TtD$<S+ÉL$LVP q  >?u~NT$qD$D$L$ W   T{D$H;L$D$ [NL$t$4L$@dCt:L$H;L$@rj8L$<S  D$<L$HDNULL  $tsD$<3h7PZ  t#D$8$hLPZ~     L$0ATD$$<tgW)D$`L$dL$P)D$PfD$pCj t$(RSPhpD$`uD$b#|$btL$P\uD$LD$@    \$PsD$<shNPY|$$   D$`   u|$h    L$Pg      t3D$<h OPY   L$H;L$@rjOL$<mRD$<x'  L$HfTC3D$,~,    C8PD$<hOP9YG;|t$4L$HA;L$@rjOL$<RD$<L$HD'> |$L t#D$MtT$<t	L$8)3ҋ_^[]ËT$<t*D$H |$D vD$MuL$8vR_^[]ËT$<_^[]QSUVW~G+ÍGX4wXD$38L$   E`   D$G`t`G`    F;}@~V N)NřRPt,&F Fu	F_^][YÉnG`WV L$D$BfB fB<
BHuNL$J,A    _^][YU(SUVT$ WT$0FND$t$v#d]     D$0$ D$0D$( D$D$0f.(D  L$(T$;u,A;Bu$  |r         F֋NPvi   fF^D$0f|$$ ȉL$(L$fFt~dL$^ȉD$T$$ L$0f.ȟDzPT$$^D$   |:L$t0^"|sD$(^%D  VfF  f;_^][]É>^fF^f  ff;_^][]SUVWC|z^   u      _^][c f.ȟDzWϋŃwFrw?D  >nf^_^][ÀBu#Fu,tT$j`  f!F_^][Vt$F?u3ҋOF?^̃VWF   tfV	t;   j\t   #6FFj P7 F  f!F3t       F    _^F֋NPv`)uFT$NPvf~+   _^ÃuFT$NPvfuՋD$L$   _N^QQ,utY3YV   fFta   fF^QBAXй   fHt	Yù   fHYUSUjWVrWfD$.;   |$\$4N$t~ctB$tVMt,a>t~ t	Ia+WfD$T$D$tF   t(uË_^][]ËD$T$_^][]A?U   3ĉ$  VWD$    2ɉ|$L$wWD$l    GhwXD$`D$D$f$   t$@TD$TFD$p   t#x  3ҋ   D$+Ǆ$       Ǆ$   $L$|m  G$    G8    G<    Gx    (   ǀ      sm  G WL$`$   $(  $   D$$    $   шL$#T$$     $$)L$   A+L$`4D$fTgfffL$Ta  @DBN  ƋL$`$   $   VT$BBHθ   fDD$Tx S  $   $   L$T$`A΍D@3fT$   $   T$   |$B+T$`4D$fLgfffǋ|$TL$`t$$   $   n@DD$!     e  x e  w,Fw(L$      SyL$yuGhDHOhwXL$`t$$   $   L$AGXȸ   fAt.jȋD$@D$Q$   $      fAD$@D$Q$   $   aL$AGXȸ   fBt	   fBD$@@BD$
$   $   L$AGXȸ   fAtȸ   fAD$@ D$$   $   L$AGX4ȸ   fFtA	   fFD$Pu3ʍyAuD$+ρ?|$THtsj jjjc|$f  T$TGUU  L$F    f	Fyuqt$L$T$AFANJT$D$;Hx f  |$IT$BGXȸ   fAtVT$ȸ"  fABABAD$TAD$@~,|$4D$@9|$uD$9Tu	"  fAD$t$$   $   /L$AGXȸ   fBt	   fBD$t$xH   ~   B    E+rD$(f     fN(v(tNYD$(   OfF    L  L$  AfDf#ffDD$$   $   VL$AGX4ȸ   fFt	   fFD$H@u=Ћ^V;  T$TD$Vt$$   $   j j RыP\aT$dD$Vt$$   $   L$AGd<ȍO`c  D$@4Ƹ   fFt]Gع  GFf#@   ffFD$|$t$$   $   "T$BJL$0<ƋB4D     fFu~ tXL$0   GF~G fF fG @  G    fFtT  L$0((L$0uFL$AD$0A<ƋA4h @  ׋/_ @  fFtTx  F   tL$At	%  fFL$0IL$0((뜋L$h @  AƋA^D$$   $   T$   Bf|ƋB|$ƋDt$PR\D$$   $   ~A   fAD$$   $   V3ҋЉT$_  D$$   $   %T$BƋBL$$<ƋBQT$H4ƊG
¨tj[u/T$Tj T   D$$  f@f#ȉL$H,   t$tS  D$$  f@f#D$HGD$0uT$Tj S   t")S  fG  f#D$0D$$@GD$(ȉT$XD$L$D@x9T$Xd`  |;Z`  T$(3;P3O  fFB  f#ffF;twwvb D$<fGD$$ppFGPA D$0L$HT$TfHL$DvD$XD$<F FD    f	FNVL$A<Ƌω|$DD$(D$@ƋȉD$hȋD$"L$(@4ƋD$ht$0f@fGF  D$hW8|$$xD$$$   D$$       $+RQ$   b   |$DUL$hD$8TD$   $,RQ$   GcuyRQ$   cub   #D$$uu   wRQWP臻 "t]#u   3RQWt$0 $   $   $   $   fFND  f#fbD$0   fH   hR?XD$8w\D$8oYD$8gL$8f.$(  D{^L9SL$h,SΉ$   ω$   t#σu   3WVRP?  t$0D$8L$<%  =  uD$8 8fFH  f#fv   fHl@nA  j j WD$$   $   yT$BƋBL$(ƋD$@4ƊB
At$HtW   fFt%QD$t$$   $      fFD$t$$   $   QL$($  $  QȋD$L$0 D$#<fu##n<gudt^%|s*D$#|#vىL$0 D$#|O@rH|s<htWfD$8t$<|$8L$HD  fAf#9fqfA~$  fn<huffL$8ffL$8|s@   +L$0 |$8t$<닋L$A4ƋPD  fFf#VffFD$@D$Vt$$   $   vL$A4FȨu6t$TCFȨuD$x 6P     T$X  D$D  fNt$$   $   L$AD$>  QQD$$   $   L$A4Ƹ   fFtxLЉT$%X  D$t$TPHRЉT$X  D$t$$   $   YL$A<ƋA|$hL4GL$$!D$$D$$D$DL$   FwD$(|$(;|G;v7P D$|$N  t$D$l   $   $   ;=|;s7D D$|$N  t$D$l$   $   J D$|$qN  t$D$l    $   $   PЉT$(t~D$@y@D$$t&   uD$T$DD$l     J  ЃE  |$D$M  t$D$l   $   $   T$RGCr<D$(   $.<u3ҋ\NL$.   3ҋ?   B   uF,tBT$TjJfG  T$Hf3f#f3GD$D;uȉL$L$u3,t.T$Tj@JL$ fFf3  f#f3FȉL$D$׋pL$ T$DD$l|$l D$0D$XD$HD$ }DFL$H|$0ыL$X|$l|$huJ L$H|$0PыL$X|$l|$hfND$fW@  |$t$$   $   0|$l $L  $   $   T$Bu3Bt$|$JRvt$Xwt$(3D$0L$$T$HzfD  t΋BT$70D$ D$,D$\T$lL$ȉD$H覗ЃT$luD$0FT$H;t$$|D$H@tD$D@u
D$h@tډT$l|$ D$|$t$ډT$l$   $   T$lL$y&AL$`싌$   $   u&AL$`싌$   $   AL$`싌$   $   xL$   AK   D$HD$JL$p9,u	A4D$Lu,A  fLD$t$$   $   |$D  ǋ|$TfLD$t$$   $   T$BRBJL$3ARPAT$BDƋB4u73J؋j @PmND$t$$   $   ,MD$t$$   $   L$A<ƋA4ƋjMG   fFH҉V~   D$tFL$+Hhgfff   ʋ>uH  ʈ>|$t$@h|$@;G<  D$@h@GD$|$$   $   0T$BRHD$w<  $   $   L$3ҋA9QHD$;<  $   $   @DD$G  $   $   @DyG  P舯|$;G;  |$$   $   LL$ADuADuAAKD$$   $   @DD$F  $   $   L$G`Ix D$@*KF  T$G`JR4T$F NHL$\;GtR~    ~ ~,tFtbDtZv(P|$뾀? t^|$ЉT$N  T$럋F,8 .  ܉ЉT$N  T$uNЉT$wN  ٫VTFP茱ȍ~T+>   F$   T$~TDFPLD$V4NLT$D@F L$\=   s   ыNLuRL$\T$D3V>fT$$;s%FL        =   ;FP  CFLD$0   D$t$@ID$$   $   V>T$$|$;g  F4D$D ;  FLD$0uPW$`  )$`  )$p  fք$  N,PePЃT$M  $h  T$$D$0D$DD$DT$$
3ҋD$\|$DT$dQL$(?|$0D$XD$\T$H D$0D$hD$pD$p=   sGQL$XT$d.T$pPL$HD$pL$pL$XȃT$d D$(T$\@D$HL$XD$(T$H;D$w;|$hyT$hT$h;rA;wP;NPuK|$d u@T$$+|$0~L fD$D8u$`  BT$$L$p|$pT$drw;NPvT$hD$\8 u3뭃~L u$`  BT$`BK  |$t$@$   $   3ɉL$p;wpT$t$zBu.Rh    ID$|$$   $   GD$|$$   $   xLXL$pD$T$@<¸   |$(fGtFL$p|$T$\FT;D|$(   D$FLD$(sыW_D$TqwGV9W}QD$;px4L     j fG;t1|$D$
h8WU   T$*J  G GVt$,w, G GD D$pfEfGD$TGD$T$p@trtxVuT$pWsL$;Ax_K  L$WPD$dN,KЃT$oI  T$pOW+  f!GL$AQ3ɉT$HL$0z43|$8f;B"Y|$(fD  G`t    D$x    t$TNL$X   GP}   $,kfatY>׋F    =  wrw %  fF|$(0Vū D$X%  fF|$(	(bH  L$0T$H(B"AL$0|$(;SL$Ay4ƊD  t$TЋ?EuUNL$(tHF    =  wrw   fNV
 D$(%  fFGG(녋L$W3fD$8T$\fD$(AyƋt$L$$FD$hFt$ƉD$HtDq@ t$TN2?Eut%   fGG(u͋T$\L$$D$ht$8|$<t$L$,L$XL$(L$DHD$dL$8t   Ƀ
Bi  $  P@T$0D$(
|sD$\   rwdL$0D$0    ;u-D$0;D$(u#D$   rL$dBT$\D$d  L$dT$\   t$ D$d     r  w"L$dT$\   t$ D$d  w\r w"L$dT$\   t$ D$dm  w,rw"L$dT$\   t$ D$d=  =  w)rw"L$dT$\   t$ D$d  t$  t>T$(L$0芨 D$dL$dT$\@D$8%  fA   D$d   L$d   T$\D$d   tB    t$    PT$(PD$0   tCL$dPD$0t89D$dT$(PD$DT$XT$(D$0j Pt$$ RIL$lT$\ЋD$0T$\;D$$tD$d(X~~-RPID$dƉD$dRPIT$l;t$}BT$\D$0ƉL$8D$(D$Hϋ|$DL$X@;|;wL$Ht$(A A5D$@x;kE  |;aE  T$(L$H6/L$H   qfAD$Xt  9fAID$\L$4=   }At$8t$4EL$$ȋ|$$L$Ww9AL$tx(OGT$82t2ut$8F   sAL$r6~0j RFEL$$ȋL$tPwV蹤 7L$D$hD$$;(VL$G`IP,D$x tб$   $   .L$$   WPf$   ЃT$B  T$W$   $   P'  L$AyD$$D$       *B  23ҋD$t$8    Qq ЃT$A  L$F!RPB.  L$8V AQWR胣 T$zU t
BU B]    F       FN    FN    3ɉL$t5t,D$vuW|$hOW&L   T$@  D$T$$    ~	*A  ~ ulx] tfD$D   uaL$skF  D$|$@U,tA  W$T$@  T$D$DD$DB]   A  D$D      D$H +D$HD$uv|$D$(    O L$0~`3D$8PD$  HLjЃT$?  D$(L$@D$(;AD$8|D$L$0T$$3ɉL$0|$D$(     ~I3PD$HL9ЃT$m?  D$(L$@T$$D$(;AD$|L$0|$t1OtfD        Iu OT$|$H?  T$  ;t$A  ыL$T$  ;u܋T$$u'L$֋F  }|$D u_T$$D$6|$D |$FN     FN  ǉ  tuL$Q( ЃT$N>  |$   ?  D$t$$   $   L$D$0    qt D$H$P %   >  L$AL$AD$(@D$8   L$0Q7ЃT$>            D$9P   |$8WUtD$      L$A0u      A0H3P D$uD$L$8P0`D$T$     BHJL    BPJTǘ   T$<  D$fx L$D$0;A>  D$(@@;AD$   =  T$$  L$PBIRLD$@GXȸ   fAt.ȋ$  D$Q$   $      fA$  D$Q$   $   zL$D$qqQpNT$D$Bu&BJ+ȋFD$ȃHR T$u	NBALzuL$3S   T${;  D$t$$   $   T$G`J4tF8;BuN,AP#  L$#T$   t$$<<  D$RD$8    D$0    @D$HFqL$T$(pt$Xu$@yt$@L:   s
   3AtL$43L$D$(A<uAD$0@<uAD$8QL$j Pv,D$Lt$4L$`NFD$0WFF8ٔ|$D$D$0F0D$xFD$N,PFQT$9  D$t$$   $   LT$G`j JR<L$G<PUVFVG0F0GFG8F8O3ʃ3ʉNGFNOv,V8v0Nj D$L$A~D    AD%QG`4thFubF<9AYV8Nj F    F    F     ЃT$T$88  D$Ft$$   $   +j qLD$~N3h  @PD$WP[hЃT$a8  PP|ЃT$uxT$BD$8F0t?BV8PЃT$uv,V8t$<j讒ЃT$F %v,   F8   j j臒FT$D$3fx   EȋFȉNe9  |$D$Ft$$   $   L$jqQT$PJH0RL$V  ЃT$C7  D$$   $   L$G`IzϋrƉJ BD$"  |$t$$   $   QL$jqQmL$@IH$@@,HD$$   $    L$G`Ith_D$HG`    D$$   $   L$G`D$    I< fG  G     W  D$@4FD$8$.<u	3ҋ-V-ND$0D$8T$HfF$   uj!  |$$!  O,T$x脜ЉT$5  T$|$x k!  D$|$t$$   $   t$Ht$4yx~D$$tHyD$$u@D$$O,D$xPt$Lw,3t$8莜ЃD$0G@D$HT$GD4  T$D$$L$x     u	   D$x    3G,w,L$@$D$#    D$$   G0$   fAf$   Ƅ$    E$   AL$$   D$xPbЃT$84  8D$#8T$T$8$   "D$x    3ҋ,ЉT$X|$e3  D$    D$x   G+  ut*D$xD$x    3ҋ@뢋L$G`I<G,8 L$G0$   Ƅ$    fA$qf$   A L$Ǆ$       $   L$$   P$   PՇЃT$3  $   2  7O,N"ЉT$te2  D$    D$L$`|$t$@@$   $   "L$G`IL$PI;}fHD$$   $   L$I;  fHD$$   $   L$G`I< 5+  D$$   $   L$G`|$I@;Gǋ|$1HG`4D$L$@D$$   @f$   ft0F0~$$   $   Ƅ$    N,W讛ЃT$k   fAt%%N0o$   N0WrR3pF$G N,PQL$׉D$T$~$1  ɈVV FD$ <u*D$  |$t$$   $   L  <u6$   $   fD   {  A(;||$<D$f@fFD$t$$   $   L$AD$u_ƲC$  t$T$  D$  ~D fք$  $    $  $  L$A<ƋTT$(D$HD$@`4$   PRWN,3Ǆ$       #Љ~@D$4FDfF  F     $   F$$    T$tD$x I  pm  ЉT$|$P/  D$t$$   $   L$AGXȸ   fBt5	   fBD$HG`H@BD$
HG`@P D$$   $   1L$WfD$HD$0    AGXȸ   T$(fBtD$(	   fBD$HG`<|$8GuaO,T$0(ЉT$A.  9D$0tD$H   D$L3O,^D$HT$L|rOD$H T$LD$H   D$   tBt	ЋBuB44Ƌ%D  fFf#VfNfFu   G   |$L ;|D$H;sD$H|$LD$H~|$8Gta3D$HPj.D$TT$8L$P%?R L$TPD$\3QO,肔ЃT$,  9D$0uFd|   ,  T$(G G     D$HL$LJL$AIG`|$T$8T$4L$t$XyA<ǋDT$8D$($   $   u6L$    t%D$Nɋ@ȉL$HL$AD$0D$(L$D$0    D$H    AtD$@(P, D$(A tL$y(A,L$|$ID$   D$   t~$3D$   ftt$XtЉ$   Ǆ$          Ǆ$       WQN,$   cF T$F     n+  D$0$      $   0D$t$T@   EPD$       ЃST$O`B4BD$@tL$|$D|$WfD$8D$<L$8R,PQN,T$zBJD$8G`4uJD$       tAN@BȉD$0BD$(t2~ t,N,裇VDT$F@|$   3D$0    D$(RN,F     T$F$    *  D$8ID$@(P,4D$((@vDv@0D$t$<j	   уw,L$w(aD$G(    G,    $   $   T$G`JBǄ$       ƍ$   PD$pm  ЃT$K)  D$9$     $   $   L$AIƋG`l  ЉT$(  D$HG`P D$$   $   FT$O`D$Py,L$;Axf*  VЋ+ЃT$(  D$9P @  fN|$D$t$$   $   魿T$rL$D$QH`4~ t   fG7~ tF@VD$   $   W>uKN,$   RQ1@0ЋL$։D${T$'  $   $   W cЉT$y'  8Ft   fGN,藄$   $   W{T$G`Ru,jjsH@$    @@,H8 @@     !H,;D$$   $   L|$#L$G`I4~,Ǆ$       uF$̃$   fЊ$   T$FF F     j&  D$9P9$   1  |$t$$   $   髽L$$   G`Ip,轌ЉT$
&  9$     k|.r(RP-|$;G|$}Ǆ$      4  $    D$  t$$   $      L$G`I4Ǆ$      >u$   g  ЉT$K~,:ЉT$uω$   蒋uǄ$      3҉T$|$F F     %  $   FD$9$     t$$   $   LL$G`I4֋L$g  2T$G`JR4N,:T$G`JR4N,谕ЉT$F     uFD$@   b  eZ$  D$    F	  L$G`I<L$AA4tD$@(P,    fFtPЉT$#  L$F$   $   Ft$$   AƉ$   fAf$   AtO$3QO,$   %   PmG     |$T$|#  D$$   $   ׺T$G`J<B4Ƹ   fFtЉT$(#  ֋xT  |$
T$G`J4L$F0~,$   fBf$   B$   Ƅ$    ω$   $  P׌ЃT$"  9$  uЉT$"  D$fx tL$p Y$  D$|$F     F$    t$$   $   鸹T$G`J4F,8 t\]ЉT$"  T$D$    ~    L$$   Wf$   V,PtЃT$!  D$8uWHG`B $   $   B@D$JDBB     @BD$r(t$$   $   Ћ謶$   $   t$PD$$   $   髸Bt$D$$   $   L$G`Iy 1  [ЉT$   D$$   $   ;T$G`|$#)JA0$   fBf$   $   BƉ$   y,`}w,r"  f"  T$$  j '$  ֋P#ЃT$)   $  $  P$   Pe$  L$D$ND  |$t$$   $   :T$T$   fF   A9   !  D$$   QJT$@D$,Ǆ$       RLD$   fF$   VT$<  $   UL$T$(qL$P}" L$0D$t$L$w$   $   bT$D$8L$WPfD$<BIRLЃD$T$x t/T$8W(D$<G,D$@~΋D$<DD$T$y  $   $   صL$G`I9u&Q,L$zB  D$$   $   頵I,ЉT$  D$$   $   pT$5T$D$Ǆ$       Jr$   HIЃT$  $   D$Vt$$   $   L$D$j j A`j pQP| t$ ЃT$N`W  D$t$$   $   骴L$y quPD$ɋ@t	w L$D$փa@PG|PJ L$ЃT$I      L$G|$   $   $   IǄ$       L8JL$$   D$pAh Q4h0QQ  D$$   j Qh VPƀ   Ǆ$       Ǆ$       { D$u&$   D$u9$   u^s / D$L$T$Ƃ    T$L$@ T$}T$  L$QL$J ЉT$  D$$   $   L$qQL$ D$$   $   ҲL$qQL$ D$$   $   颲L$qQL$ D$$   $   rT$|$BJ4B<Ǎ$  PD$@PrAL$PBQTJD$($  t3|$( <L$Hhpj)jjTT$8qT$T
|$t$T$(   !  $   ;$   XL$|w9$   Efp  5x  t  $    $   Ѓ  $   T$L$|;$   wr	9$   sD$$   $   L$AD4ƋA<u*D$Nt4Q長L$AD4t?N$   6t,D$$$  t$$$  @  L$AD4ƋA<AD$(uD$(t&L$t4NM  D$(ҶL$AqL$t$HD$L$0fx t!   Nt9H@uL$0T$   ;     A  NFɍpEAD$H@yI<L$ǙRP9D$(L$0L$0  T$+T$`fAD$(AyD$A$AL$Hw<AG@gfffT$G0BXGBG8B`GBG,BhGBlG4AG   ƍǍGX;tT$3Pfp(;ut$HyT$L$      GA(I,G O$B(J,GHOLHh@lGTOP   G(GXBXǂ       B(    B,       O<D$JG@BL$J`FOFPj Qd |$L$`QOhFGlT$T$螫   h @  H0H@LT$JȋmD$t$$   $   |D$@ %    D$t2@t$  D$  t$$   $   5x @t*L$   D$  $   $   G@D$WD$   $   x tT$     G@GDT$    D$  $   $   釬   t(BtfD  ЋBuD$@B<L$A<Ƌ1D  Gf#WffGD$@4ƋD  Ff#VffF9O|9O閲L$A4D$|yoD$@+ȋD$|D$@L$`|$t$@$   $   jL$A<AAT$8D$@X4ȸ   fFtT$8	   fFD$D$   $  |YtSL$ыL|uWfD$8L$<D$8QP$  u$   $  NiFWL$A4D$T/o
  e
  D$ TO
  L$ALց   |tփ LD$
  $   $   L$j AL$D$,D   P'D$(T$jF    L$A+L$`FgfffL$~F FD$TFD$(F    FfqL$qAL$t$8<|$(9~t:N~x.|$Vt$fGRƉByt$8|$(GF|$VNP RVtAAЋF~%|$PhEWFD$|$~ t%D$@tL$j jF    fAuy t   T$fHF    ظL$AQ4ƋAt*L$RL$D$@4	|$  T$T鬮L$$  P$  Ǆ$      PqQL$Ǆ$  Ǆ$    ЃT$t!  D$    Ǆ$     D$3   @4Ƌ  fNtRPH      VfFG(|T$D$(D$PpҋD$HDȉD$8ȉD$L$DL$   DBumv tL$uUD$tL$t$("  fN} ȉF0 T$TΉFFT$|$;ttuD$xU a     T  u$L$D$pL$uL$W}|$ GL$83҃B@D$(L$At3T$PqO|c ЃT$,  D$$   $   釥L$D$I@ɋL\ЉT$e  D$    E  x u&PL$cD$$   $   @@3   1   D$$   $   L$G`II,jD$$   $   ¤L$G`II,jD$$   $   铤T$BT$$  uB %   D$84D$JT$$  @RLЃT$  D$phQWT$$  L$q֋L$~ ЉT$qV6dT$^D$$0  W)$@  $D  D$)$0  fք$P  @
D$$0  PjtO|QL$PD$P z D$$@     u
$H   t$0  fT$  D$$   $    L$D$   pPW} t$ЃT$   {  D$t$$   $   ΢L$D$0    Ap  >  D$0PGVЋL$։D$bT$  D$0L$jR0D$P8  L$0H,F
L$G`I<^ jPjUD$O,T$|$HʋЉNɟ   hphNfH=D$t$$   $   鼡L$AIG`4փ(t$HD$>fnƋH,L$$fp |$0D$hD$L$DЋD$L$X3ɋP\T$(      =(A   (@%  yH@(P+ t$8   |$8 fnFfp R@ff8@ffBfnFfp ff8@ffBfnƃfp ff8@ffBfnfp ff8@ffB;q|$0T$(;}t$HAƉA(;|D$t$$RWp|$Pt$dVG ЋT$|L$D$~`T$  G(VЋL$ A Ŧ|$D$@L$`t$@$   $   ןT$G`J<B 4t4kBWG, D$( D$8D$T)$   )$   $   $   tT$      fFA  f#ffF$   rPD$@w,@,Ћ|$T$(ωD$i_$    ~#VYfPhEW$   D$T$T T$XL$G`I< rG,P0L$<A$ЋL$։D$^T$  D$8w,@(Ѓ|$t$L$QL$`JT$L$T$y I       A$A$BHBL$(D4uF!~tЉT$  L$(vQ@LЃD$uL$A$a A$|$ϋT$(^   T$3D$WfD$0xW ٻD$@PT$(  D$8  x4 t$vD$L$\@\D$#D$@3~@(;|D$L$@A\D$0PD$<WVR@4ЋL$|$T$(D$D$#A\E]T$ut$9Vt$t]D$0L$4F(N,MuDD$@x t7L$IB  D$t$D$    $   $   釜t$G(W,   D$t$$   $   UL$AGXȸ   fBt	   fBD$HD$ɋ@D@@0D$B    $   $   L$AGX4ȸ   fFtw	   fFD$3ҋHD$ɋ@|D$9Pt1ЋD$;PBPCF    .L$qAL$t$8<|$(9>tED$NFD$T>Fx,|$Vt$GRƉByt$8|$(fGA  f#ffGFNPFPAVЋF~%|$PhEWFD$|$D$   L$pv<T$ F    @  f!LD$$   $   XL$ыA΍<EʋD$DRPQV/a L$TˠL$ыA΍<|$8ʋD$DRPQV` L$8D$L   ϋ|$ЋD$u      t$$   $   釙T$J^A         @u      @t-ЋwD$V      V輺t$ W   P~9hQRD$V   W   jVt$ t$,   W   jЃD$@;|9D$8x   9Wl~    Oh<uD    B;Wl|3|$@G|$   ht$NO$F      Aft<4LhHOWGt3t$Pv|h`Ot$F|qhEW|$D$+L$`p|   gfffPhhOw|$$3L$D$ux$  x$ e      E  d / ЉT$|$t$~W        L$0T$84ʋL$L14D/|$PhOW
  T$멋|$hOW
   T$댋|$hOW
   T$lt$FU cL$gfff+L$`L$G    D$AU x$  e     t$    t   T$   T$L$gfff+L$`G D$|$x$  D$p|t$%L$PL$A|D$PʋD$ɋ@D ;D$0tL$f    P  T$N8T$6|$hNWp	   T$hQq    h-hbr hhěj      Ƈ   T$L$ bh\QWD$       VR\|$PhEWT$$n|$QD$   QEPhQW   9t$0GЃӲ|$   T$Ǆ$   	   L$|T$   Dƈ   GGD$@ƉGxD$xW f@^tj W      jЃL$gfff+L$`@G d   Q  T$JrT$$   BU;   tt$  f Ct    ~
h0P   Y/  $   t$|$$   ψFU/u=L$gfff+L$`L$G *$      AUD$x$  _ D$e   x$    Eh  uhPPW   T$fPPDPW   T$?$   $   $   $   	   T$$   $   $   $   飰
!  u'h-hz hhěj   T$| u
  t5f PhEWt$֋L$w$TL$gfff+L$`w|   PhQV   u.
     L$辺L$D$w   tJ L$$   f     9$   ~   T$|w	9$   rop  tex  t  $    ЋL$tǄ$   L$|	   dL$yU ZA I$A KD$$          t$  _^3- ]fq%H	$.njN`####%Swwwx5hh	f		#EY	Y nnVκrP<V%09;Ifgggg::-B9IG3!"	Q( ( a~p6ټ>ndYvsM	^Y .{]emuQSUVT$W   3~GXfH8GXL$H(L$H, ~G    _ve`؃d   G`Ff9B>vcLXstVR REIB<ǋDXF   r(B,L$FH@)@3_^][YøRPh(Rv`   vNF    ~  u[hPNjh-hZP hhějF{^Pq PhEvL$_^][YËCt
PH    |	    v	׋zM3퀿   r	--{W uu{H#Ջյ,[ FF    Zt$t$hHRPGL$ G_^][YËL$_^)][YUT   3ĉ$P  EM$D$0ED$4ESVuD$ 3W3D$9E t$D$,FL$DD$8    |$ t
PHj j T؃\$t
WCh   D$Pj P@ $  jLj P@   ~W $   D$H  t$Hth8P)4  t	׋3D$ D$48F_u{t$@3ҍL$Lt$(8 |$  G+<  G  <n  { W<tF3Ƀ9t@A9uFɋȉC3G"\$0D$~=    t$<+     
;8  B  D$t$\$0;  }     F 3% @  t8t$v0t-fV~N$fD  9IREǋuvuՋ\$[\$tEfD  s23t*KىL$(C;L$0tfuR@;|\$[\$uc  L$H \$t$(s  D$ H<tD$3@9t@G9uVlAD$9VpFSt$0   W\xx+uBD$C;BFlFht$,tt$(   |\D    xW uFhT$DTFl~   FhfTQhؼ   9؃      t"ɋ@Dx	 t      D$xW    L${ACD$,CyW tP3Vhj P(D$xW uO}  tCqL$T$HAC{ CA"@C$A"ΉCD3f$  D$t   D$p   9\$t$D$0fCs~_ uI~W   uT$8u.L$@AD$L$82      L$H# |$4|$ \$WhRS&D$   {_ u\$st   rq'J(t$Ӌ蝨\$3ɅEWDPSVt	׋tL$H ~W       3   |$4   t$<hRVzD$   ~_ WKt$$hRt$$h|R	t$$h\RD$PP#D$LtD$L    |$ ~_ D$    D$|$ u8FWuD$DӋ(D$@t
PP$\  _^[3/" ]QSVt$Wt?~^Gt
PH֋$Gt
PPSF_^[Y_^3[ỸSUىT$VWu)h-h| hhějC_^][ËsFt
PHD$$kl$   |$(   D$ʋǙD$ʙ;   |
9D$   u}   CHy	 tAy
 uFt$Ct$(PsT$<KIy	 tAuD$u'   r$D$%C    n@%x$n@u9$  uFD   ~@׋5~W ut׋2Nt
QP_^][QT$L$hPt$t$eYQT$L$h t$t$EYËD$t	x t 3UQSVW}u(h-h1} hhějG_^[]ËwFt
PHGuxJuT$@$    ut)\$3۹ESDQWVt	Ӌm~W ut׋Nt
QP_^[]UVWwtX= tEpKt
PHV$)xIIVpKtPPVpKw$tS= t@t
PHV$)xIIVpKtPPVW,tGRj j PAHЃw0   ~ t
  N tږN0tΖN  = tEpKt
PHV$)xIIVpKtPPVj8j Wt6 _^]̃SUVWG,t7D$$0řW3_^][Ëw(ƋʉD$QPwL$$S5H D$uAGЋO+O;L$|
;T$w+wGSVw$PAЃ  D$_(+;O$ȋD$$řW3_^][ËO;}h   |=   s	   3ʋř;|;v;|;wQOVau   _^][ÉwGG$D$SPwI ÃW+~; _(D$;PNދu&GSt$ +PqI +ȋD$$O3_^][̃  3ĉD$SVWڋG,t&W3_^[L$3  Ëw(ƙRPw7F t0+	|)O$W3_^[L$3M  3fD  D$   Pu!D$ƃFLxԋӍL$Y3L$$_^[3  UL$SVWth   Ѓt
  _^[]ËV,^,tFRj j PAHЃ    U3EMNBJNʉFFD$@@   9Q&|9Aw9|USrj j PADЃ   9;   D$@XÙȋPQvL$(6D$(E ȋF$L$D$u,t$t$ 6D$F$   ^(DuDL$t<>+ًNÙV;V|
;v+vND$D$WSPQBЃ_^[]USVW3WfD$G;G   ;G   w0   9^tT  ؍V u?F0
F(N0;FuF,;FuF   NFYV  V ؍N,  F0V ؍NF(;uF,;AuF   uF9^uAq1Ru$T$uT$G PωW_^[]Ë]_^[]̋L$Vt$Wy> uIT$ Wt$ Iz"   T$L$j W!)_^UUEJSV1W:L$   rOJx
=BƄx% L$T$t$3;D$tEHL$	   rLPx
:@x% L$T$L$3;D$t;Lƃ+r;ust4:u't)G:CutG:CutG:Ct3u+UJIu>fyvAuz9uUWu    UMjW'_^[]ËI9 t_^[]QD$S\$UPV+KW8|$;   33t7+f+uFB;|T$J"L$U 	2}
@T$JuvIfyvyt$z> uT$,Wt$,     T$ L$$jW&_^][YÃvv+럸   4v'? }L$   III9 t_^][YË+~Ԁ}  ZR̃ SUVWT$$3ۉ|$(Vt8t   3D$4l$@0@       L$ ōň   D$D$ϙRP  t$j V- L$@t$ q,GxD$ƉFq0PB L$ D$$\t	ufD8_	tG8_
uG@$FD$48_	tGuYD$|$(~HȀF:N;3҈F9tNH1IHF;B;|V   -l$4.G@@PȉT$(D$4D$D$(T$$|sjh PQPQRt$$y? |=    r    ;Nn8 u$t$$D$8t$F4ÕF(   DًL$f|s$Dt;GuD u"F<_^][ Ë_^][ ËD$4p,   _^][ UVu    ~ St,W    jjSl5   t6_u^   = tBpKt
PHV$)xIIVpKtPPVE    [^E     ]^3]̃SUVWj j\$E     联uF_^][À= tCth   Ѓu,D$~^Sj Vh@j j FM u~^WF    ? u`t$T$F_u 3^][SV   W;~
@ ;|+ƍ   tjdЃt3_^[ËÙRP蘓t*Sj W&*     7G    +ƍOOG_^[UQSVW~   39>~3@ NG8;>|= tMpKt
PHV$)xIIVpKtPP_^[]V_^[]̃SUڋVWl$s;x~<<(HyKt$StFC    K3C    {;    {xWԅt	L$w܅t]= tHpKt
PHV$)xIIVpKt4PP(VW؅tD  r3薔օuOt4t)jHGj P,( _EC;H;6{( u S$tf     r36օuS C$    C,    C8 C0    C    t	L$ _^]C     [U   V9Ur|9Ewk8|dL$D$    QD$   @(jVЋt@(MQjVЃL$Qu@Dj j VЋL$tQj j @HVЃ^]̡VWth   Ѓt
  _^ËD$Ph  V3豅D$uLD$  D$tD$PB(jQЋD$L$|T$tQRD$_^̃S\$UVWD$    D$    t$3CP7GPD$$PE UЃ>w>u׋D$_^][ÉsD$    uD$>_^][́   3ĉ$  SUV\${ Wl$u1KIȉKuA   C@f@fAC@ Cu H<u@> ?Dh   C D$$j Pl% txD  Mt;u3
^^D$ 3\$F    t7\$l$ P֋GE     l$$D l uً\$l$t u\$33L ttQЋSF@|݉E C@$$  _^][3   ̃D$T$D$SUVW   >    ~nD$+V;N+D$$UP:P8 /D$F;FuC^ËN FV9RPD$$+PFPGQЉFFF    VF    L$+͉L$k_^][QSUVWt$? u8 t2o_;~(O ÙGW+1RPGUPFQЋt$$GGWVwtX= tEpKt
PHV$)xIIVpKtPPVWGfG _^][YU    3ĉ$   VT$~( W~(F@D$    t'h   Ѓt
  _^$   3	 ]ËL$ D$Ph  W	3_D$  Ǆ$     $   t$   PB(jQЋD$ ^  D$N0$   @Q	L$  RPmT$  F0WD$F4D$DFL$ )D$P)D$`@D$HfD$pWPD$(D$Tu3D$p   D$ D$lD$DD$hD$D$`D$0D$X|$PD$HNWt$|$LWt$$3 șL$0L$\L$`L$+ȋD$HD$XD$ |$D|$l|$PL$L$hD$pD$F@ȅwPrw   $   D$Qw.r?  w$$      $   D$RQ$   D$      |$H$   +|$0;N+WPD$\D$8P5 L$<ωL$0L$`;L$HufD$ D$\D$T$DRPD$8+D$dPD$`D$hPt$0AЋL$,D$P3D$0D$`D$\D$HȋD$DL$L$hD$DD$lD$+|$PAD$0   ~wDrw$$      >w)r=?  w ɀ$$      $   RP$   P$   L$TVL$P6D$x u\= tEpKt
PHV$)xIIVpKtPPVD$$   L$P0	$   _^3 ]̃UT$VEpED$E    +΍D  U΁  D$SW    +΃<    +E ƙ+    tL{    sD$s ww PD$(P@ ЋO   u;   D$3҅ED$˸$I+MEʉ΋EU    +ȍ<nEU_[@    +39DL$D$@@^]Ëϸ$I+MEʉ΋EUD$        +ȍVt$΍V1F   ^QSUVWk;3MC83~3C:@ƙz<| <t   ? tF;|͍S$;u   ō_^][YËw~C$+˃@98C:fGC,GC$    C,    t&Vs($C4WR*_^][YÃ{( tC4RP谅C(u_^]   [ỸSD$    UVq,CH\$$Wx   rGPx
5@x% T$+L$3;D$ u#Awtf<
~tf<F< [   Ùkl$t    GuNtW~( t"F0t;~   ^,3^,F,^,;;~!=K tD$    F0    ~,;~~~^(   n0l$F4;      D$ʋF$t+ÉD$řD$;|	;sD  ;|;rF;|;vʋD$;
|;sQWs؃tFD$xÉF$^(~4D$N0F0F$<t*+#řRP}u   _^][ËF$G\$(GssP~. CD$~$_^][U    3ĉ$   3L$@D$DWAD$<AD$0A$   I0VW@L$0)D$P)D$`@D$4fD$pVWD$TuD$h|$lt$`D$P   D$ AVWt$@|$PWK+ ϋ|$8+ȉt$\D$4D$XD$0t$`L$ L$h|$lD$pt$$   |$,B@    +ȋBȉD$4@L$4D$0ƙD$ D$@׃y $   _  D$0Ǆ$      ʉ|$<$   $   t$   @u   $   ǋʋ|$HD$@D$@$   GD$DT$8;   |
9D$@   D$<wErw$$      ?w*r=?  w!$   ɀ$$      $   VP$   P$   L$T
D$8L$TP t$0O$   t$`D$Lt$uD$h|$lD$ jD$lD$,D$hD$ t$|$Pu:L$Tt2D$\;~*t$pD$ T$,>L$\RPD$+D$dPQOVуD$L$Ht$TD$ A8T$,Q<tX= tEpKt
PHV$)xIIVpKtPPVD$L$   D_^3 ]Vt$^A   ̡SUVt$Wt"jdЃt    3   _^][j j@ptj@j W >tʉoKAq	+;NwƙC@_SD3^][UT$ʉD$SV3ۉAD$W~{4    3+|$    }AuH0L03t 9At	\W	3ҋ   |$   L$C88|$;\$|9O    +;|+^
A4\I    +ƍ    T$+Ãz t<y u2qT$q L$ D$    Bqq L$$QP@ ЃNދL$AOlD$@@_^[]UST$UVWx0D$RˋWChs   GD$9wt9͋VW S   VW0StR_^][]Ã{8 u'sDS8s@C@    CD    uJC8G0C@KDGD$OC@SD tu|$tL$_^][]Ë_^][]Vt$   N0^	A   ̃$S\$,UVL$$ȋ3[WD$$3t$\$ЋD$<҉T$,   D39l$$   L$3ۋƅu{rQL$,P֍A(Pu6WT$fD$L$FD$NFu	4FEN8T$,D$L$;l$$|مtt$\$mD$<     D$80X_^][$ÃSUڋT$,L$VWQȉ\$D$(   ;  Cuh/  D$,%  yH@    +ȋD$0@ȃ0D$8       |+ƍ   \$ tjdЃ   ÙRPz؃   t$ j Sf     3+C    KKӍL$$t$C\$uD$AD$0Ǚ<E;
u=D$,%  yH@    +ЋD$0HD$D0_^][Ë\$   붋|$    tO tpO0tpO= tPpKt
PHW$)xIIWpKtPP_^][W_^][Ã4SUVT$03ۉt$,3\$WF;<vx؉\$uh  3ɍ~@3҉T$L$     F;;	  _  33D$D$(D$$HÙ;$|;sf     D$$;|;rWfD$8!D$(PD$<PT$0   D$(       |+ƍ   tjdЃtT$3OÙRPdxЃT$t2Sj R T$     +ƍJ2B    JBT$   G3ۅ~^   +Él$,   ;LЍD$,PD$<PGut$,T$(Vt$0*D$(G;|T$un\$t'L$C0PL$$T$t$0"L$ ڋT$At$0H\$8#\$A8HL$ T$T$\$D$4     _^][4ËD$4_^][4USD$    UVWCH@D$C<<u@<> ?D38S;vK`     1IHC;B;|T$w  8C9  C;4Ã~ ~u+IȉO?  @f@fAG@ D$j j8t}t$&vD$   j8j V T$n0sUF|$ƅ   E t$@   @)A@QD3C;H~=D$3|$D$GD0t@   @)A@QDC;EH8;|Ջ|$33C;;}>D$3HD)0ͅt#9xtQ\
   F8tD$3uVc   s   t$   39~3fNC8;|= z   pKt
PHV$)xIIVpKtHPP_^][]Ët$K@j as3]_^][]V_^][]QSY,3UVWl$8C8u'9C$S$tE K@_^][E    _^][YË}{;x!o,,DHyl$uE     _^][YQSVWz,ـ8 tL9 tOumO9Auee   _^[YËOT$D$    IuC9D$t=e   _^[YËW$BG$B    ( ur%vօu3ɸe   9O$E_^[Y̋A,SVWx8 t2x9 t@X 'PB@    +ȋB\ ȃ@$X89~}j ׋蘬t   _^[ËF ff-FfFP  Wf#~SvffF 3_^[QSUi0Vq,W|$T$^ u؉^ u	C_^][Yf{~8 t1~9 tFH P&VB@    +ȋBȋH PV$JSQ3Ʌ~Cf u+A(;|D$j SPH L$$3_^][YËD$_^] 3[ỸL$,SUl$,ř؋D$0Vt$(щ\$T$;V|;^v^]
  [W9F u9N$u	t^(S^WfD$ tCFt$$|$ l$<T$T$8D$t$;|;w
D$ul$4t$,L$<FRPQt$D ~+;MVPt$8 t$<+    xtt$,ƅt
L$T$WfD$8T$<L$8D$,_^]X(H P$3[VtgpKW = >t=t
PHV$)xIIVpKtPPVpKu_^UE   VuW}~   ǙEʉD$FM;  
9D$  j@j )D$(FV)D$L)D$|F )D$\F0)D$<& (L$<f~(fs%j Pf~(VfsPf~P@Ћ   (D$ fsf~WfD$(D$ fsf~D$D$tyD$L$D$L$@ ǙD$D$;T$t|T$p9T$v+Pt$D$WPAVЃD$u*L$ǙȋD$L$T$ D$uL$":|$t	@VЃ(D$ (D$@F(D$PF (D$0F0uuURuu@VЃ_^]ËEM    ~V;u;ts;o|;siF~D$ȉT$t.Uu;E|;sL$?D$uU    EFE~FF(    F     F$    }    F~D$ǙRPv|$v2 Ћϋ}+;T$MuW
    D$   RP8m   L$     t6T$F;qFfWuP$ 3_^]ËT$FFD$WuHQ M}+ϙFMV3_^]_
  ^]SUl$VW|$;o~\$|;_ss3uOw@GwD$ȉT$t);|;sL$D$u    w_oG(    G     G$    _^]3[̋L$It3̋D$HPD$P3SUVt$W|$j@j VF uD$W%PCVUSЃ_^][Åǹ  NFD$~_F03n8^4^][SUڋVW   {t7~W  uoN{t7~2  uJNS(  u4S  u&S   u9D$u[${_^]3[_^]   [SUVًWVSCЃu:F   uMVt   FNtCVSЃt_^][é   tVw   uR_^]3[Ënt } ~U A   u,OF   tɋV,j_^][_^]   [̅(3̃SUىl$  {   VWCUSЃ  }t"7~l  NU$R  }(t$7~fg/  NU,M  }0t'7~D  '   NU<   UHt4C= tt	   s=	uj U   M tlD$~bi0fD  UtunD$E t-}t&7~@ wuCND$HHD$l$CtUSЃm4l$k_^]3[_^]   [_^][]3[ËD$@3̋D$H̋L$9u
D$@ A3U(EVWt$TD$tj j L  D$3xW tz  ȋI  _^]ËE~2D$    WfD$fD$$D$qD$,t׍L$mU:q   BD$   NFu+?vlL$F5j P	mD$tMj4j PV L$Vt$fA"A4PqA L$A I "  yA   Ut$O0W_ BGB G B0G0
RZ J0B   t
B,tPHj jtlfȃt      yA_^]Ë[H  _^]̃ASU$T$VW<M  i3ҊE t<.t	D*BuD$ tg"  ؅~&D  Ntx:xuGCNxxx+   D$ <    E3ҊE t@ <.t	D*BuD$tZ   ؅~!Ntx:xuGCNxxx+uPD$< uFD$tB+D$
;uu_^]   [xx+uD$B_^]3[̋Q,Vq B`tBBD`t4B"f@|
^3ɘ3҃ ^C3ʃ@CуÃ@?   M33҃ C3@^CUQSVWT$j j4j   j4j VN MT$fF"F   A,FfEfF AN    F,uT  ЋD$_^[]ËX9Z}VT  ЃD$_^[]`pAAD$q_^[]UTS3L$	3VD$HUEW3T$H3҉\$(\$0]t$D$    D$4    L$$|$T$8D$@   @   Ct	T$   A3D$D~cYD  +
;u!u/\$$ǋt$KTD$DT$8-xx+uB뿋D$DGt$;|\$$;uJS+     
;uu)C3]PT$8T$*xx+uBŋT$3]
     CD$T  3ɍpL$,t$ 9  @      F(    FD$<V  F33@D$P9   p RuUNq   |$ ~TD$ @(   t*UH0 xD$ @$tY   D$    D$(tL$$W  3D$0D$(D$    D$D$ED$4   fX @  D$PCT$;Kt$ L$,  }T$u  D$<tx\$89X<`  ugS:uMtP:QuAu38ET$0L$@ PQL$BD$87}     ^tT$<+4;u2uDD$   r@t<  t2M,9t"@uxx+  B     t$ M|$<3T$D$DO"_L$P   8S
   }+4;      |$t$ ~FF(   t UN0 xF$tk   3D$(tL$$U  3ɉL$0L$(]T$DG|$|$<t$G ;      xx+uBWt$ T$L$PD$D@D$D;'|$<|$ ukG   L$,T$ubD$4|$Z]T$0L$C PQL$cD$8D$(QfC F(    tFHL@뒋t$ L$,T$|$D$TAHL$,t$ ;kt#MG,AGA,G$HtI    @<D$8|$
    L$T$ Ax      8   tZUB      Mt8+f4:;uu)M3A   xx+}   BŀtEEt9S+4:;uuMA   ?xx+uBЀt0Et,S+4:;ueusMAD$@xD$ EUB   tntjZtcS+     4:;u2u@C M@D$ A   1xx+uBxxx+uB뮋D$    M蚚L$ 3D$4D$q"Q<YT$8t$P~AfD  8C
   u+
;      L$ A ;,  t$P;|MW  L$ tA   D;   |$4u-\$t%E@(uMW  tC@     ]EC      C3ۋL$T~jp~uWEu7Bxx+uBt$PD$G;3tЋ藘L$T  C;|]E[D$L]v  |$T$u  $  ǋU3D$   ruRЋD$   ru|$D$@   fV N,  k u|$ȋED$@   @H$NZ  J,L$8   L$ t<BD$@   hk ȋD$ |$@"@ƋuȋE@@F  fB D$@M   y|$FD  u; |L$|$	     ϸ   |$L$	      |L$|$	     ϸ   |$L$	   r  u   fF FDZ  uFVDu$@tWh(St$   _^[]@   tF @  t;t$HtWhHSȊuHu@u(@@8thpSt$赔   _^[]ËD$Lu|$PVS   u    g   90t@uT       I  u   ^   D$$    uTH @$D$\D$H@   t2%  u%   @ u%     t	   3	   @ t)uhSj菉WufF,   _^[]  u N5N  tF   _^[]Ë|$\$(   G9   F   t
%F.V|$$t9  VF    t9  F    D$~ j j4]tvj4j V L$(fF"F   A,Ff~ AN    F,P9S}D$VcH  `pAAquFS^y  L$$L  uSSEL$tuQPhSt$$Q.MtQPhSt$ 5PhSt$!L$ƋfD  @uH$	@uJDD$@D$H@\$F   u5Vt	L$$;8  VF    t	L$$$8  N   F    F fz   tvEP,B`t>BD`t0B"f@|>3ɘ3 C3ʃ@Cу @?   M33 C3ʃ@C	K8	S<uD$@|$h      t	M   Ut$8JL$P   @3҃90tB@90u   L$PMuwx]513~t]4{    ;9t
@H;|Vt$P|$ttCK x
FɋF fxȋFɋHXRPgG uyL$HEA;t
IA;u_^   []SVWj j4Z   j4j Vk D$T$ fN"F   \<ǉ^,G4FC ;u
fN _^[fV C`tRCD`tDC"f@|ƃO@WD_^[3ɘ3҃ C3ʃ@CуO@WD_^[Ã@?   M33Ƀ C3@C	G@	OD_^[U    3ĉ$   USVuZWT$;t$4\$,|$(=   .  D$L   $KAF,A4fN FFD
  3ɋӃ}BRDlAuVt	L$NM  S     F  >3lTtTD$     Dи   ED$ 	FV3}DlBC[uVtl4  D$LF    _^[$   3 ]À;u3D$,D$FD$   CVT$(t` T tTt0T
DTDPh|ThXTW}fD  @uH$	@uJDT$N9;u3D$,RT$,QI   BD$AD$rA  tD  9t	@u0  t    9t	IuF,T$,VSt$$t$ _^[$   3V ]ËFD$ t33L$@D$D$    D$H    @TD$<CD$$ %@  F   D$8tF,D$xu3҉T$Fj t$@D$8Q ЃT$u7T$0Pt$@j D$uD$   T  D$H   G  39BB   D$   N   |$@   D$ D$@@8t	Ff@D$0u3ȍQfAuD$0+ʁ?jQT$HD$Hf/v	FY`,FyVhTW4CT$j r    j C tQuVhTWCy   _^[$   3 ]ËB   D$0   8uDL$0N땋D$@ (  tN   @   ubD$$ *tr T tTt0T
DTDPhThXTWb@uH$	@uJDL$$$.F   tN   @D$H   t" u@ u3D$   D$LD$  ( t@   G  F   @t*   u@ %    uVhWW贉D$     L$tAx u;t7VhUW肉T$$C   L$$39D$!   T$tbD$$ t |$G   |$(tt!t? @  u8D$@   u	DUt<UVPhPUWD$    Ch|$ t    uVhlUH|$H tVhU6FF   t(VhUW衈CF   T$ET$LT$L$ t2~)t$ًuOt$4\$,|$(|$ ;  D$      [\$ s*tSH3t$PB xW g  D$xt07~'\$fD  uN\$ D$xt*7~!\$uN\$ D$P(tL$D$ЋW D$$L$8   	D$L_^[$   3 ]F   F tF,P(tL$yf     D$PD$l    $   WD$PCD$TFfD$|fD$XfD$`D$p HD$tFD$xGt+8X~ L$luO|$(\$,F   tF,P(t	L$lT$`tFM$   u@f$    t5F[\$,/D$$L$8	D$L_^[$   3 ]ËD$tH  	KD$$L$8	D$L_^[$   3 ]F   FD$4A  CD$8C.tY T tTt0T
DTDPhUhXTW蔅yFuF$	vuADVL$D$8;C  D$4@K@  C.   T tTt0T
DTDPhUhXTWyFuF$T  vuK  ~t G   t=   tGxu|$(xW   N<uA<uYAe<;t<uWRsu_^[$   3 ]À?uF3_^[$   3 ]<u
A@   >0u6^K<uA<uA <u
A@    ;u3KN<uA<uA <u
A@    ;t/hpSW軃fD  FuF$	vuADG$$   _^[3̃ ]t~Іɑ   S\$UVW;;u>*3[~3rD  FuuttG;|_^]3[ÍG_^][̃@B WSZUl$LfD$4D$D    L$(D$,\$0D$@  D$<    V1WF[D$F[   D$H    L$0%oL$D$H    D$PT$ ED$D$0D$,E   L$   9   ~ Ph(WQ荁D$F[3_^][@ËՍL$L$E)   L$H%  	E|$D L$HD$x$ D$F[393~{3jUF  |;3|3_^][@_^][@QS\$UVWt|E xW us   sj;   ~t$hVU趀   _^][YËRs3T$~3     Fft
;$j 6HPT$$G;;|3_^][YQt$ GPhUUI   _^][Y̋L$A   t#I,Q tA$Q$tA B A     3̃<SډL$Ul$HVCW}|$ D$(D$ 3D$9E a  ŋ/7  F   t   tFpvu  D$T8GtSVȃL$cF   tNC-   tuONT$=  t?L$"NT$D$    a=  t!L$ىL$A=     fO   L$$3fG     C390~a3jt3虦  u:9CDt*WD$,fD$4L$,fD$<D$00\$DL$FfACF;0||$D$Pl$E|$l$;(l$Pt$TL$$UY_^][<t$(D$t$X|$(@PhUW!~FuF$vuF_^][<ÉAD_^]   [<UTSVW}O  E0X\$t$D$4@uS׋ 39F$@_^[]ËO4G4D$<3ɉL$8D$     |$D$(     OL$@Wt$@fD$DfD$LfD$T|$\W<#    G   w t$tHG0A0G0    t$D$0    8    3ɉL$$4Ft@uyt[3ۋL$   D$,Ft   t$V  L$D$,y$    j  D$t39X\$   OȋF0ȉN0؋L$$D$Ht$0FL$$t$0 ;0Yt$D$X@  L$@D$D\$LW    L$XL$XG(D$0uu	L$X  	OL$XGɀ   D$HL$XW,tG  L$@    W$L$@  x  39~-3D0tTHL$@L  Q  D$CH ;|֋D$   r8wHt1fVL$@    VL$@     v$uсL$X@  D$L    G   tD$ HA0G0A0    G0t&L$(;L$ hTVP׍L$H  t$4~W   d$X\$0tGhVS׍L$Hh  8FW_  3K3҅~    @uUB;|W8tGJ ;uW4D$    \$t$D$hVP"z   _^[]hVt$z   _^[]B   tht$y   _^[]-   t:t%tPh@}  Ph@m   Ph@]  Ph@M  |$8 2  |$   _0\$   T$
L$;   ~h0VR:yF_^[]3Ʌ~C@  @A;|L$<G8    t@ x89G4O4u|$   G3ɋ|$ 3t$$D$0L$\$,9~K CD$(u*3t F   to   tFpvut$$AL$\$,;||$\$ 8|$t3~KfD  @  ;|   _^[]é   t~S-   t#   NT$(H6     |$(NT$(D$(    &6  td|$(ߋT$L$D$0~;8   0AhTVPhURwD$$D  FuF$K  vuF_^[]ËT$0VufL$PP   L$D$(yW u;T$L$PD$   r~T$VD$(L$tw  T$         L$j j5A؃   j4j SZ fC"C4 C4D$,K   C   {;uA8qu
ȋA8qtYL$  \$,T$f{KL$|$ L$   |$ t$$AD   _^[]Ph\Vt$&v_^   []̃ SVWu	3_^[ ËG    %oL$G    D$PT$E|$(D$F   L$   9   ~Ph(WQu   _^[ Ë֍L$L$F)   G%  	F	_ D$x$ F_^   [ ̃$T$SUVW   C3%oL$ CD$PD$ D$$    \$0t$9*   zD  7tlF   L$   9   h֍L$L$F)   C t%  	FK% 	D$oKL$y$ ,T$E;*|t$	s3_^][$Ph(WQ9t_^]   [$̃D$ $$D$PD$D$    D$"UA   tI=   uA=   t=   uQ,uX=   uAHI뽃$t3=   uAPA JL=   uII댊A]ËI3Z ]I xB";}BɊD]ðD]QSUVW|$ڋG   	@j #E4P=   j4j Vm qfF"u	N  SF4FOtQ7P |$ NG t)N }"     D	F sN "  F   ^_^][Y_^][YUSUV3\$3t$W   =   uB=   t=   tMuJ,   $}   =   tv=   uBPjqz   B   t`Bt@   t돋Bzt3~W u-03Ʌ~!B   uA;|t$t$RC33D_^][]rVTj @ iB xAH   tH 8 t@8 ut@8 u^TPt&j   htÍl n\$h} ^u UPT C   _D^][]USVWD$$ t	3_^[]Ã}  ]t+C   uEt	@   u:u4T$%@   ut	C   uuϋ&L$؀@~@~C}	C}A	C߀@O
]L$QlAhT$D$9QpuUuujЃT$DBAlD$ D    D E3fAEAEAEAD$D$D$ʋT$zW T$tL$V9yHlID$ | tL$jVtp@wFl~ӋFhfTD$_^[]UQSVWي<urj j4q9t>j4j V. fF"z     9F~Ph(WSqn΅tdEFfEfF ~_^[]<u'   EG|rD    _^[]Åtj j n  _^[]3_^[]QVt$W<u`B<uJ
<u=JA8~2z<tD$LB_^YËALD$B_^YËD$ʉB_^Y<uB@LD$D$_^Y<u"Bt$TϋD$х  _^Y_3^YUDBSVWD$ JL$(w<uA<uAL$<uA@L$D$   O83ۋG8D$B
D$H9_$  L$ <uA<uA <u
A@    9D$thpSWl_^[]ÊU8   7EȀ9uD$645   DD$D$(\$$8uЋBB  D$$D$ \$,8uЋ(B  D$,NlU9Npj RjG   踅'AFlFhG   D   T\\U3ɉT$LL$D$8    D$<    D$4    D$0    t*VlxW tIۍBIÍFhL$PT$(D$8PD$8Pt$,QfT$0؍D$L\$PPD$DPt$Dt$,Ct$hT$Xt$pFlt$<D$HD$DQSPt$h$   nL$t<tG<s   GL$<tG<s   GD$<8t	\$K<6ulD$H9D$}_VlT$9Vpj j j :   GD$3BFlFh:   D    D    D    D    \$K}NlFpuS;j uG   j    UAFlFhG   D    TD    D    RT$@;t$DuR\   苃.AFlFhTUTT$D\   TD    U9\$   \$NlFp5ue;$j t$R3   %L$\$A\$AFlFhTT$3   TD    D    L$AU;j t$   j 迂3T$AFlFh   D    TD    D    L$E9L$L$Ӌ\$DЈT$AVlxW tIL$BIFhPNT$ҋA<A8yR]	I@Fl}4uSNl9NpE   j PP_^[]ËUAFlFh   TTD    D    _^[]W   V@ G$t	@;~G,t	@;~G<t	@;~Gt 0~t	I;
~
uG(t 0~t	I;
~
uG0t"0~ft	I;
~
u4N^_QWWtR3ҋGT$t9POPT$G   tOT$D$@G_YUotHS] V~Mft9POPu3Ʌ~ufvHu@ 	O^[B]G_YQVW~$ u#<   9G~Ph(WV3f_^YQ$$    0$ỸSUVW|$ 3ۋ\$3D$t"=   utT$r\$uoEE4j Pr0   j4j V+ D$$fF"t}u&ۉ^  F    E	F_^][ÍF4FOtQ7Pg |$$ OF t)N }"     D	FeF   _^][UET$L$SVWu3NFuE+?33ۉ|$\$   utT$p\$u~|$L$G4j P9/tkj4j W D$(|$ fG"u%ۉ_  G    E	G_^[]ÍG4GtVuP6 G G   _^[]UQVuUtF
  Ut=8
  ^]ËEtB@%@ 	BEtB@%@ 	B^]UQSVWj j4'.tlj4j V fF"EtF@%@ 	FEtF@%@ 	F   9F~4Ph(WWb_^[]ËUtT	  UtF	  _^[]UVWt<EN @ F$ u<   9F~(Ph(WW}b_^]ËUtjTV _^]̃D$SUV3ۉT$3L$W9   h} ?uG   ;uIWL$j h   j j j j j yW G    tt p4D$CT$;|$R%XWNPQh\Wt$ at~4 tN   D$T$  _^][USVW}T$+  u	_^[]ËC%   =    t GO%   L$=    Y  L$GD$   ?  NDuӋ\$  P9Q}0S\$ыq  ȉNDu  b`&`pDT\\$NDP9Q}ыW  pDT|NDT$3W|$l   j DˍG4P*tVj4j V襺 fF"u)D$  F F   Eʋ	N_^[]ÍF4Ff 0 F   _^[]j j4u*D$tpj4j P0 T$L$ fB",z	@ ZJJC%@ ʉBS|$   9G~.Ph(WVF__^[]Ë    |$_^[]̃SUl$3D$VWML$ T$t	@D$L$ 4j P)   j4j VI fF"th|$ u	N  XD$ N4NtRu Q D$,F N }"D$      DD$ 	F^F   E +   F$t!;   ~ uUhWW^N^$ u#   9F~Ph(WW]|$$uN_^][ÅtL$  _^]3[̃0SUVWL$   VBzT$4D$uf        :?D$      D$DuD$0+HT$8jPe{  l$<|$8L$ g  	\     ;M  |;C  ύ   щL$T$0f;      f   D$   |$   } D$8D$$D$D|$T$0   O;A     ȉT$D$0ȉL$T$L$L$L$ D$(;d    ;\  H  T$  r=   z  D$$ϋT$D$T$0L$  }    |$09
L$} tB;G|BL$    hWS[fFuF$  vu_^][0Ë      D$$tTH   L$(L$DQRPD$< L$Pu
D$0< tD$$|;|$(}T$4ŋD$$3ȉL$f7f      L$+;`  r?6  D$89T$w)r
D$(;D$8w!T$ϋD$$D$T$0L$mD$(T$RP+&ȋD$,%L$ 
D$ RP%ȋD$@T$$D$tUuA   T$0L$D$Ot$Dt$8T<L$$WA D$P |$L$} fN L$ ;   ~/hWSYFuF$vu_^][0ÉAD_^][0UQSVWF      Vt
>tVt   F   Vt   j$M    tA  F      ~,   O tG$O$tG A G     w(S   Wt  Wt  wSh   wS_   toWta׋XF   tVtAF   u	֋/_^[]UUtM]UQSVWVDuB  FD_^[]ËX9Z}W  FD_^[]`pAAy_VD^[]̃ SVWtS   r9Wt$L$fD$fD$ D$_D$ aƆ   İ   _^[ _^[ Vt(9t#A   uy uy u      4      0   u Itq@ Au+B?эB^SWڅt-UtOVOӋ^]_[_3[̃D$$L$S\$$UVWt0D$$   K3t*ӋtO{OӋoL$řRPD$,     t$%  t8?t3G   u* u uD$      D$ @     D$    4   ǉT$    D$   u(Ot!ifD  Au+́?AD$(D$(    l$0t
RWV E   t    @  ۃ4SWVw 4s4   +PD$j Pɯ FL$(%D$D$$FtD$D$ QFwP& T$F\$
   u$W   Ut    T$FF @   ՋcD$F   u>WtD$Pj3FWtD$Pj3FD$    tw,֋] F,L$4tCD$_^][   u+>Gtj Ћ  FˋWj   F_^][̃SUډL$\$VW  j @4   Vt|$D$   Vj W( 3l$9+   D$+D$D$(t$ ΋8j   Sj   GD$$u3?P@u+j hUt	tUt$(V# l$wECGD$l$;(D$(hD$_^][Ë_^][_^]3[̋T$:uB   tL$R,I" 3̋L$3T$;QUtj u]3]̃ SUVD$    t$$3ɉL$W  t(;d  s ;\  r   ;`  r	6  
V$RPȃL$,:  FAA> D$D$      ^+Ή\$ L$${t$4D$0tO?uJtFFtOL$D$F/G;D$tt$4ЉD$ȃL$NL$N{u3>ǍP@u+j XSt	tSWV \$ T$rKt$$LJL$ACBD$(L$T$\$ ;L$,_^][ _^]3[ ̃SUىl$\$VWr  E ~3PRPD$$D  M H}  D$    ,  ͍}+ȍpL$ GF1D$u3BȍQD  Au+j iUt	؃tUt$S˾ GD$u3AȍQfAu+j iL$Ut4]؃tUt$Sy ^D$u3AȍQAuD$+j iUt	؃tUt$S' ^GOF N$G F(GFGFtVG4D$u3DȍQAuD$+j iUt	l؃tUt$S豽 N$^<G8F@   t F$l$,\$tW4U/F<GFt@WUa  FG   ˋW$tX   	UF,G,O0HN8L$F4AD$HL$;L$ D$$_^][3_^][̃SUVڋ\$t$ W   j    PdD$(   3҉KHT$9   K+؉L$x\$u3BÍP@u+j hUt	-tUSVL L$T$D$Bwt$$T$8D$ L$;|D$(_^][3_^][U4SVD$    t$D$D$    ىD$W  j jLa|$   uVSGV u G V$uG$V(uG(V,uG,V0uG0ˈD$uG8G4    V<G<G    G    FGGGfFfGV@G@3GD    D$vHL$t,D  V3ҋ6U t
v$x$uL$|$ t$OH~D t5{W u/D$(L$$D$,D$0    D$$    |$<iFG{W u+D$|$8G4v4D$t$aD$_^[]jG8    > D$_^[]_^3[]UQSVWj jlyut	׋3_^[]`pF      FFƉ~_^[]UQSVW3FF   ;d  s2;\  r   w".;`  r6  ;w
r;wWQ֋u ֋  UtI3_^[]Ë`ApBBEB_^[]UQVuU	^]Ëp9r}u	^]`2pAAEA^]U4SVWD$tD$D$    U];    <t@<uC<uC <u
C@    
;tPQhXWH   D$    ~kJL$3 PQӋЃt.u	HL$ 9N}hRuwT$L$T$AUL$;|D$xW un;uiteD$LYAL$肋 _^[]`D$ pAAQT$D    stY   D$<r?W|$$fD$0L$$fD$8D$(_D$, aƇ   ֠D$   UL$׊ _^[]̅t(3ET$At	 ;tÃSUVW   l$ ]D$E D$t/3ӃPRtSt$V 3 3|$$ \$stZ;G   <rIs<tBj jtKt
Ѓt#W2E MBJ  B  _^][Vt.| 4ut$T$	-F^Vt1;   ~t$h(XQE^SUVW} uf6SxVtO_^Ջ][r̋T$t	L$̋D$3fHAQVWѿlT+f7;uu_   ^Yxx+uFӾtT+
;uu_    ^Yxx+uB_3^YVW~  uNit~   _^_3^V<,t<+t^ËNSWNЋZ%  =   t?O%   =    t.     t       t_[^À>,D_[^À>,D_[^S\$UVW|$Ou
C   Ńxw7,$sC      C   u}u   @C_^]3[Ëk  uKEt_^k   ][C tf1fu,C;Gt3fG   _^][Ãu
_^]y3[Ãu3fG   _^][ h ̃D$0   fD$D$D$    tэ$͛D$QSUl$V3WED$90~Ux    3ɋT$jSj  }'m Ӌu
E @t7xPt.l$D$F;0|D$@   t_3^fE   ][Y_^]   [YPU_^][YQV3Wu_3^YA   tA   _^Y-   tu/I_^YËIT$t$tD$   ؉_^Y̊<t<uI<uA2w=$t3A    u#A,tQ fxHtDuѸ   ?Bn    V3AtG<t	<u
   I<uA2w=D$03C^Åu!Bu   ^3^ÀC|fy  |3^Ð+ QVWѿ@X+f7;uu_   ^Yxx+uFӿHX+7;utFxx+uFپPX+
;utBxx+uB_3^YUQS]VT$WNl9Npj Sj G   XT$/AFlFhG   D    \D    D    ~l9~pj j R#   sXT$2]GFlFh#   TD    D    D    Nl9NpSj R^   X.]AFlFh^   TD    \D    Fl~   FhfTVlxW tI_^[]ÅBI_Fh^[T]UdSىT$3\$VWKD$L$ u 9Ctu@PuC!UT$D$ C(D$@} C(t>B   t5B3x~uF;|E3;\$DE{$    L$  A     @  Ax4   @	  x<   x$ ~  H 9n  y d  Y\$0{+O  x3ҋ7t$~O82  B;|K<D$$ t'D$3҉T$$ @9tD  @B9uT$$L$ыAtL$$Eи   rTuΉrTu /t*t$ɋ@Dx	 t3T$(j s  T$   GOL$8fx     |$ wl9wpj j j    U3FGlGh   D    D    D    D    |$ϋT$jpSt$,B D$   3hTXj WG[\$0SlxW tIP  BIƍChT  GD$8D$<       D$4   3  D$H<uA<uQ
<u#QB8~tytL:BL8D$8P x\$0C";}CҊ\D<@~@~<C}	C}AC@Att3CD$4D$4L$<T$AL$<;2  \$0[\$,  3|  C4;s  9s$j  ?a  EtC2;O  ;~
{6 A  D$<    WfD$H  D$L3D$(D$H|$@D$0D$P<uB<uJ
<u#JA8~tztT9AT8B   D$84tL$*tF   tL$\$D$4uˋD$4N 3t$,L$D^f9uEtOF 4+     ;ut.Bxx+uBًL$Dt$,D$4G;|$|\$;tU3ҋ3 C3փ@C#L$0#D$(u.	T$0	t$(EL$<t<|$@AL$<|$@;\$,T$t$(33 C3ʃ@Cу9L$0  ;|  t$ ~l9~p'j j j    QAD$Ht$LD$0랍GFlFh   D    D    D    D    3hXj t$WNlS,9Npt$$Rt$ p   @Q/AFlFht$TT$$p   tTD    D$Ӌȋp| Ѕt*yW tR[FlFhDTCU0t$t%L$A,@|$A,uT$L$ PD$ Pl xW t
IPBIǍD$ @hTt$T$[\$,h   \$L$   EthA   u_qA    L$TfD$hD$X0D$\D$l    肏f|$h L$qtA8K(   D$t$m   3ED$   tt$щ   |  1EtC,s,0t$ы^  tT$L$ Vy   t$L$U         I<uA<uy<   Ax?   3Ƀ   (@%  yH@߾   +؃ ffnFfp R@fBfnFfp fBfnƃfp fBfnfp fB;|;}U   3ɉA;|MD$_^D$[]̃SUVrW<uF<uF<u
F@   B   \$tB3	D$CRPtD$   3   3@ <uF<uN
<u%NA8~t~tLAL8؋D$t,HL9Կ<@~@~<C}	C}AC@ËL$\$)E;kD$ _^][UTBT$D$    SVW{|$ @:  {4 0     \  wl9wpj j j    LT$ 3FGlGh   D    D    D    D    B   tBphXj SRT$$\$OlR,[09Opj RS	   BL/AGlGh|$ 	   \TD    D    D$OlP9Opj Rus   K/AGlGhs   TD    EA    AWlxW tIP_^[]ÅBIƍGhT_^[]   Bs,Fs,r0Wl9Wpj Vj J   XK/BGlGhJ   D    tD    D    BT$B,wlt$9wpj j j    JT$ D$3FGlGh   D    D    D    D    r<uF<uF<u
F@   D$MT$HGlD$,9Gpj RQv   fJT$$D$,4@GlD$,Gh}||$ v   TD    D       L$$D$8j PЃT$(t@L$t$8j ABL$,fB@fBATBBPJ   菊 L$$D$(D$@   @D$8  pH%|$  L$4XDPhXjSOL$DD$9  EˋT$D$DD$HD$L    D$P    D$T    T$8j D$\B    qD$8yW t
D$$   L$DQ D$(D$8tj # T$Xt|$$ t&D$(     H_^[]Ã|$   D$(3D$$D$0D$8<uF<uN
<u%NA8~t~tT9AT8B   D$88D$4u t@   tuT$4L$$l$L$$i|$     Ȁ@D$AEC   DD$t$(tD$ˋP艻FKS,u2F2
t$L$$7K   t$u

L$$ɉt$K   D$$D$8P T$8D$4*  GhD$<ȃ|$ 2t$@   D$H0   fL$XD$LD$\       ֍L$DXf|$X L$<   GhD$0yW u,T$ t4VQfF F    GhyW u(T$ t4VLQf F    D$L$0D$    `t$T$DE  Wl9Wpt$$a   jt$ F6BGl|$||$$||$ a   D   D    yW tD$   PP!yWlJD$jPQWl9Wp!t$   t$(ukEOh7BGl}||$$||$||$    D    ΋xW uDD   ΋D$4T$8HD$4T$8GhL$tC<s   CL$$tC<s   CT$(tLyW tRO4D$,yGlHGh| tjRЋPP@L$   WlxW tIɍBIGhPD$Olp,P09Op%jVRC   DC C    _^[]ÍAGlGhC   TtD   D    C C    _^[]U8SUVW3ډl$$w9o$=  KCD$   tiphYUWINlS,{09NpURWU	NCC_^][]ÍAFlFh	   |TllC_^][]Á   KG,@G,C0VlD$ 9Vpj Pj J   B3B3FlFhll$ l3J   D    D    C@BC,ubnll$$9npj j j    ~Bl$$9EFl    Fh   D    D    D    D    L$%qXDPhYjW6Hl$(;uE   G,D$4    D$@    D$8    PD$<    T$0G,;uVBD$,
T$8L$<NlD$ 9NpPRj K   AoA3FlFhTT$ K   T@D$,Nl9Npj Rj G   VA)A3FlFhG   Tllll$}< D$z  3T$ Wl$ 3   j DL$l$ E4P  j4j U蠁 E fE"|$ uD$   E E	ME4Ef 0 L$E   ECA<PtL$j j 3j j4D$$YD$ tlj4j P L$,fA"D$4iU@ QQtA@%@ A4l$    9E~/Ph(WW'&D$t	xl$ D$@<Pt	L$]D$@<h&  3T$4Yl$2   j DL$l$,E4PmED$ t\j4j U# E fE"|$( u"D$  E E   E	ME4Ef 1 ED$ E   D$ j j4D$tWj4j P L$$fA"tD$ i %@ 	A   D$9H~"Qh(WW$t3D$L$A<D$L$,QЋ@     tC3_^][]ËL$$l$0kt#VlyJxW tI	FhPNlS,[09NpjRSC   =+AFlFhC   \TD   D    G G    _^][]QVWw<uF<uF<u
F@   G   t3xW u+G@ ;tky$ u\RPhXQ#   _^YÃtGF   t'y$ u/Fj@0hXQ\#   _^YhpSQE#   _^Y_3^YUDSVD$@    Wt$83|$,D$HD$F_D$(  ֋VD$<FuHu@ u
@@    4   D$j VtZȉL$(}ȉD$(tVj Q} L$,xW 5  wD$PQMD$L3҉t$H9MDT$@PjZT$8ωD$@D$\PG R  T$4_3ɋ\$D$L~
9uA;|;uȉL$   u,GuG,3ۋO,L$L3ۈG   L$5OG D$;+ˉOL$G G,HÉL$G,39\$~p|$L    ыNl9Npj RWP   #;/AFlFht$@P   |TD    D    L$CT$ G;\$||$,\$|$0N  O83ۋG8D$,D$8\$HPL$0觮D$E;EtmGuG,_,ȈG   Nl\$9NpD$f   SPP^:+T$AFlFhf   TT\D    D$0D$8    8   HL$4fD$HP8  ؃|$ \$@tZL$4	tKNl9NpD$f   PSP9+T$AFlFhf   T\TD    L$HtG<s   GD$0 H9D$8   E;E   L$3Vl;E2   D$(9VpS]SQ29>\$(BFlFh3f\\$\]\\$@\D    D yW tt$C;yVlJFh| tjt$ЋDL$tH@Nl   D$< f   L$3Vl;E3   D$(9VpSt$0QK8?\$(BFlFh3f\\$\\$,\\$@\D    D yW tt$B;yVlJFh| tjt$ЋDL$tH@Fl~L$<fFhfTD$8T$0@L$4D$8L$4;e\$   Nl9Npj u2   SO7.UAFlFh2   \TD    D    Nl9Npj u   j 72UAFlFh   D    TD    D    NT$,ҋA<A8yR>	I@Fl  G<     Gm  U9UuT$4O8G8D$HD$4D$@       L$$D$    fD  D$8HD$<uA<uQ
<u/QB8~$|$tyt
\$LB\$L\$$   tSNlT$$9Npj t$8R2   5/AFlFhTT$42   TD    D    T$@D$$B\$\$T$@;$U|$0   Nl9Npt$Rt$   952T$AFlFhTUTT$   TD    VlT$89Vpj j j    4D$8J  BFlFh   D    D    D    D      St$@`   j St$ (8MVlFpT$8;Mur;t$   Qt$Z42BFlFh   D    D$AEAD$AxW   FhD\  ;!t$   j t$3ЃT$87|$BFlFh||$||$,   D    D    xW uFhD\T$DtTuONl9Npj uRS2i32|$,AFlFhTU3   TD    D    E;EuPNl9Npj Pj    32UAFlFh   D    TD    D    T$Ht#NҋA<A8yR:	I@FlNlL$H9Np!j u#   t$2UD$H2T$AFlFhTU#   TD    D    D$    ~O8G8D$4T$4  D$0     GuG,_,ȈG   L$(\$$<uA<uI
<u5IA8~&tD$(xt
T$0TAT$0TL$(ы袥NlD$@9NpT$SRt$^   1/T$AFlFhTT$^   T\D    \$Vl\$9Vp t$$4   t$8S'1\$03|$,BFlFh\\$4\\$$4   \D    yW tT$@R;8yVlJFh| T$@tjRЋ<tP@tG<s   GL$D$0A\$L$;CNl9Npj u   j H02UAFlFh   D    TD    D       NT$4ҋA<A8yR/8	I@FlT$HNlB9Npj Rt$&   //\$AFlFh&   \TD    D    Nl9Npj u   j r/2UAFlFh   D    TD    D    VlxW tIL$8BIFhPL$;L$LttG<s   GT$ tD$<t	_^[]UL$IVW@   xD$L$|$t`Qlރ} D9Qpj uG   Vq._^]ÍBAlIhEG   tDD    D    _^]ÍT$Mut~	twt+|$t$u   t[u	3   ߃ t$|$L$j j	t8pL$H   jPj uj L1_^]Ë|$      8YJtx:xuFGJ   xx+   L$эrBu+ց?jRT$ } tD$WD$t$j jtL$T$PjPj u   j l0_^]t$} %LDPh<Yt$ _^]USVWڋG4w~`VlHD$T$9Vpu   j PS,D$<BFlFhT$TU   D    TD    D$    E@ft.{+ u(K4t!9|Ttj j y3{W D$uuЋ+  T$tX}?B   Vl9Vpj ju`   ~+2]BFlFh`   \D   D    D    yW tW   "6yVlJFhjWR7L$t/VlxW tIP_^[]ÅɍBIFhT_^[]USVWt$u[Nl9NpuW^uu*_^[]ÍAFlFh^   EAEAEAA    _^[]Ë]d  G ;X  +u   \$   _C t[NL$   t3hXYQG_^[]Ëq4   ufCE@SA4QD$p4  f!C_^[]GtLOtA8$<tIuQ43]tIt$ t$f;1t@;|]ϋ  ^   D$t$σL$Nl9NpuPu<)8AFlFhD    D 3fAEAD$AEAW+   D$    @TD$D$AfteuaW4tZ9|VTtKQD$PAPt$ T$ t*yW tRp3FlFhDTD$ۋ |E   +   Nl9Npj j uW   1(_^[]ËUAFlFhW   TD    D    D    _^[]ËNl9Npj u   u'_^[]ÍAFlFh   D    EAEAA    _^[]U4SVWt$<uF<uV<  FPT$
  E     u֋_^[]ËG,X\$ G,   3ɉL$Q FttCfT$8D$(0D$,D$<    t֍L$$dff|$8 tS֋#  HD$tj j ֋FD$3xW uS֋Y&  D$t	֋%L$Ct$l$   L$HD$ _^[]Ë_^[]u֋%  _^[]U\ 3ĉD$XSVW|$D$Ew5  $O8G8}SWD$%  D$~pHD$Nl9Npj t$3   W%/T$AFlFh3   |TD    D    L$W0%  l$uVlxW tIFh8Pu~Fh   fTNT$ҋA<A8yRD-U  I@Fl_^[L$X3L ]j4D$ j Pe D$T$\$0uJ  _^[L$X3L ]ËS3js2  ЋNl}9Np'j WRG   v$_^[L$X3DL ]ÍAFlFhG   T|D    D    _^[L$X3L ]ËCD$CЋ\$jSD$2  u
   b;+Cu0T$j08  u؋T$js8  uC;3u"T$j j0%6  t
   3S:uRK9  Nl}9Npj Wj K   AFlFhK   D    |D    D    _^[L$X3J ]ËKD$PxYD$TYD$XYD$\ RD$`RH<@}YP׋#&}׋LP#uS<   L$h_^[3xJ ] ;	 {
>
U   VWyt$<L$|$4D$,    D$D    D$(    l  T$$B=   W  <+$*F   uVt:t	vt$<뷋uVwЃT$;tNOl9Opj VRQ   !+AGlGhQ   TtD    D    ։t$Ol9Op j j R   s!T$_^]ÍAGlGh   TD    D    D    _^]ËV(F"N(T$RT$D9 L$D$ u
D_^]Ë~( |$4   tD$L$(Ol@D$9OpURVP^    U.T$AGlGhTU^   tTD    D$ L$DDf  ȋD$(ɋ@|E  Ol9Opj j RW   @ E_^]ÍAGlGhW   TD      F V  URVV,ȉL$t'N xB";}BɊDL$L$DFA   Wl4E9Wpj jQ`   7BGlGh|$||$4`   D   D    D    yW tV2*D$_^]ÅyWlJGh| tjVЋQ+D$_^]Åtp@D$_^]Å  I4L$   V F,D$ y
ы_^]p?  N+D$D$`tW   t6L$hXYQ3_^]Á   fNyT$ L$PVD$  f!N_^]À~E  Ol9OpUj RPQ   !UT$AGlGhTUQ   TD    D    QFuD$#F PRV,|$ t1L$QJlIxW tI	Bh9^u	D$fA~,   ~E  Ol9Opj j uUAGlGhW   TD      }Wj k_^]F    tvuF3ҋOl8P9Opj uRG   E_^]ÍAGlGhG   T@  NL  эr Bu+ց?jRT$ej jЃtD$L$JjRj u   j E_^]vUeE_^]ËVu3NFu+?NVD$Ƌwl+9wpj uRM   .FGlGhTUM   TD    D    yW tT$R&E_^]ÅywlNGh| T$tjRЋ'E_^]Å  P@E_^]ËOlV 9Opj uRN   $2t$<AGlGhTUN   TD    D    Fx t  L$   u3-N    rL$|$99|$4tA;|3q    yW tVz%E_^]ËGlGhDtE_^]ËF_^]uVUD$;tWOl9Opj RPQ   )U3AGlGh|$||$4Q   TD    D    T$N3  Ol9Opj VuX   D$_^]ËUAGlGhX   TtD    D    D$_^]3D$(   -P4T$$FD$0L$L$uPT$T$$|$ux|$|$4|$u2@@D$D$0t$>t$<~t$(Ru  T$,R  VL$D$D$DP  OlD$ 9Opj uG   j2UAGlGhG   D   TD    D    FT$$L$
Pt$,GlPt$,t$ RvT$LOl|$(   GpuF;j uG   j    UAGlGhG   D    T  ;t$ \   ut$  T$At$ GlGhTU\   TtD    L$  VD$,PV  VL$D$D$DP>  Ol9OpuT$RT$,VM9  T$$AGlGh3fTT$TUTtD    D L$  FuuVj+_^]À   H`  эr    Bu+ց?jRT$uD$Wj jD$ ЃtD$L$JjRj u   j E_^]ÍD$,D$|P$   Ǆ$     Ǆ$         VL$D$D$DP  OlT$9OpuRVk     AGlGhTUk   tTD    L$  VD$,Pq  OlT$$9Opj uVo  AGlGh3fTUTD    5VD$,P  ЃFt     @    t@u@3Ɋ@L$(3ɀ~-wlL$ 3ɄL$9wpQuR[   .FGlGhTUTT$[   TD    UxW Ght$ 3t$(DtL$u  Ol9Opj uG   j_2UAGlGhG   D   TD    D    VD$,L$P  wlT$$D$9wpj j P;FGlGh3fTT$TD    D    D    D Ol9Opj uG   j U2UAGlGhG   D    TD    D    OlL$xW tIHL$<  AIƍGhL$HL$  F(t!V"fx;P,}@(D_^]VhYQ,  F   D$ D$    D$0    @TD$8tF,@8_^]Ày tK   D$L0fD$\L$HD$PD$`    Rf|$\ tL$j*  _^]ËFD$@t 3VL$ j t$<D$0P\ D$8  x   H  @ tuT$DpL$_^]  ( t6F   @t-   uD$ @ %    uVhWt$T$(3L$@D$,   |$L$D3L$@  s@   fL$\D$L0D$PD$`    tL$HPf|$\ D$,tƋL$8A t|$0 uT$ϋ-D$0D$,L$@T$(D$,L$;y|$4L$@t$t$<AD$D   |$ L$tA,x|$$|$4A,nu6AuA,T$@A,D$$ST$@ȈA   D$$7qA D$$;A +AA,x|$$|$4A,t$<T$DD$8@tT$,tu	T$,$BT$@jj t$,  L$LD$$    D$(|#F   tqT$<L$$Py D$8~L$D1݋D$8@    |$0 uD$ @D$0Wl9Wpj j j U   7t$<BGlGhU   D    D    D    D    yW tt$08;yWlJGh| tjt$4ы\D$0tAAF|$(t$΋T$Pt$<Wut$4m
  |$ b
  u-L$$Q
  F<F
     FE_^];~'
  D$$F E~_^]VhYt$]	  xW    u6F   t-F@ t y$ -	  jPhXQg	  h_^]Ë~ tG8AvJT$GBGр?D$L$EȀuG u
G@    N;tPQhXRF G_^]ËA8HD$HA8OlD$ 9Opj uK   j f2UAGlGhK   D    TD    D    t$ L$t$,Olu9Opj VjG   /AGlGhG   D   tD    D    OT$ҋA<A8yR	I@GlOl9Opj j VV   /AGlGhV   tD    D    D    OT$ ҋA<A8yR|E_^]ËI@GlE_^]Ë}j j W  _^]V N,L$D$ }  ȋD$AP"BVыOl9Opj uR   U.AGlGhTU   TD    D    L$ D$ɋ@|EOl9Opj j RW   Q=  AGlGhW   TD    D    D    L$  hpSQF  AOlVD$L$9Opj j R   
D$3t$<AGlGh   TD    D    D    D$ȋUR@ VL$#ЋD$t$HGlD$ yW tIHIƍGhL$ HywlNxW tL$IP  GhTL$	  3D$<    D$ D$@FD$4P D$8A8HT$0A8vD$(   L$@j j aL$HD$ yW t  Q  L$,QL$D$D$ ȅt:Q   t   tAHIuaAD$Aj4D$Lj PJ D$,L$T$0D$TD$HD$H5D$<D$,    D$8H  H@D$   ΋D$XA8HjPt$DD$0QA8  T$@ut$ ΋R  Ol9Opj t$,   j 3T$(AGlGh   D    TD    D    OT$$ҋA<A8yR	I@GlT$0(l$T$07   ΋Q8JjRPQT$LQ8%  T$@ut$ ΋R  Ol9Opj t$,   j 3T$(AGlGh   D    TD    D    OT$<ҋA<A8yR	I@GlT$0(l$T$0>t$D$8tu΋D$8T	  ROl9Opj uK   j 2UAGlGhK   D    TD    D    D$ tL$@WlxW tIGh8Pu~Gh   fTOT$(ҋA<A8yRl  I@Gl^  yx uy uhYQ3_^]À~uAtEAL$Fvt$<   Wl9Wpj jj F   7t$BGlGhF   D    D   D    D    yW tV3   yWlJGhj V   yx    q  ED$ u 9qtu@PuAL$D$ uItɋT$EBj t$F   j PWFl~3ҋFhfTL$Ut$,tA<s   At$DtA<s   A_^]ËOl9Opj uK   j E_^]ÍAGlGhK   D    UTD    D    E_^] r #!(#]%  <'$!"$[* 	
 USًVuD$\$W{Dy=t9w   Ft3jP  txD$Kۋ\$u  j j lЃT$   B   {OlGhL$D$9Op-j j j    T$D$KF_^[]Ë늋uAGlGh   D    D    D    D    GhD$C xW uyC,s,V  T$C豎WlxW tIP_^[]ËL$BID$ T_^[]3҅u	#HL$9O}RytE"`D$pAAQ31yC,s,q{D_^[]̃SVWt"fF   t   tFpvu t]tY>tT   D$0fD$ L$D$D$$    T@f|$  tD$,j     g_^[ÊGuG,_,ȈG   S֋Ѓ;uL$,_^[ÅtG<s   GD$,_^[     UQSVW{    }WD$;tntF  @ P   uQ   sNl9Npj WP_^[]ÍAFlFh3fTT$T|D    D    D _^[]U<S]$PV2WD$|$(t$GD$ $ E3ۉL$BD$$\$  uрT$8   @   tD$KNHD$e\$ }OKl9KpT$j VW.T$AClCh3҈TTTt|fT\$D$L$T$D$$CF\$;؋D$$\D$_^[]tJD$00   fD$@D$4D$D    t׍L$,=f|$@ tL$(V냋L$(V;jT$\$ Pu@Ȁ9Pu)AQ@;uA@;ufy uBAT$Kl9Kpj VWҋ_^[]U   SVWD$    j4D$Lj Pt$!> D$|j4j P> D$j4j P= Vtj j 躌3{W    L$D$HD$ ֍D$|D$,D$$ID$H9t$TAD$XD$|7$   Aω$   D$P'D$΅tDff     Q   t   tAHIuaAD$AEtuL$uQWЃuNT$T$tG<s   Gt	֋辈_^[]US]VWD$    {D$    +  u   ȈD$L$A=     7$|7;tuuPS  |$,uXuK8K8PEQL$pS{  EVupSKO T$ҋA<A8l  Rk@  E}uWVpSEWVpS   uuvS
    V3D$Ft@    t@u@3ɋv8H3;L$HtDPuVS  DPuVS    3D$   -4D$ED$V<uB<uB
<uB@8w  D$P}ˍD$WPOW
Qt$uPVt$$wo  VD$POl9Opj uRT$  AGlGhTD$3fAAA  u֋h 3uy  K8֋K8} L$EEPQMOl9Opj u   j 2UAGlGh   D    TD    D    OT$ҋA<A8yR   I@Gl   ED$N%  =   uKOl9Opj u   j    AGlGh   D    D    f       teD$P
Ol3҃9T$9OpRu   V+AGlGh   tTEA    AL$tC<s   CL$tC<s   C_^[]'4~3455I54>4g6 US]VWD$    {D$      u  ȈT$L$=     <$d<;tuuPSb  |$,u*E}uWVpSbEWVpST 1  uK8K8PEQL$pSEVupSO T$ҋA<A8yR   I@Gl  uuvS  V3D$Ft@    t@u@3ɋv8H   ;L$t3ɀDPuVS^  3ɀDPuVSFC  3D$   -4L$ED$V<uB<uB
<uB@8,  D$P}ˍD$WPOW
Qt$uPD$ VPw[j  VD$PdOl9Opj uRT$vs  AGlGhTD$3fAAA<  u֋h@8u-  } ֋tEPP$  K8C8PuD$	OT$ҋA<A8	R   ED$N%   =    uKOl9Opj u   j    AGlGh   D    D    f     teD$P"Ol3҃9T$9OpRu   V++AGlGh   tTEA    AL$tC<s   CL$tC<s   C_^[]V989::}:9m9O; USVڋ\$t$W}+  #  8  ;/  QD$PjAjD$,    D$$    |$    vS     |   B   QL$   :FD$tN?u"%  =  u~tu	T$j '@D$D$D$   D$$t&fHux tD$$Hɝ   t D$fu~ tzN蠝|$   WʋCȉL$   t"#   tC;GZ     _^[]Êu:J  Gh  s   tntiy  quWt   G         @ :utN:Huu3SLG+ƉD$$0;      C3   /   tS,L$jw, G3C  D$   F     u uSL$Vw3SL$VwCWD$$u-   xx+sD$$Fa;
W3ۅ~]H+L$rD$ff     0:,u3vD$$CL$L$;D$|u\$ utCt>D$ @  u4fC f;G C:Gt	1tC;Gt;3_^[]Àqu"SL$VW}   _^[]À?qmL$Vw3ɃA_^[]3ɸ   ;_^D[]S\$UVWt$Sz   t$=      B$BtvG   k   wjt$VSuVjt$S{t2   _^][þ   WVt$SUuu4-u.   t$WSF3;y_^][_^]3[Ð^BAA6B;BcBTBB  QSUl$Vt$WUVtX>+u(Uv׋u?Uv׋u+>3uj Uv׋_^][Y3_^][Y_^]   [YVt$Fuq=      D$DL$A;FuF   fA   ^W|$f u)Vt`*f t3fGVtE*_   ^ËVtL$-*u^ËF8u@,tx+t͋F8uH,t3y+^3^ lD6DsDDDD          ̃VWt' F   t   tFpvuu_3^Ê<3uCv3D$CD$    D$    fD$|$ t֍L$(fD$_^<,u    Nfu
v>,t_   ^̋L$SVW9u]|$AW;BuN3S4t0q Kff;1t@;|   fG   _^[fy   fG   _^[_^3[UESVWHEL$x   YqÉt$A֋qQT$D$T$ ut$P-^;d  sF;\  r|$ w7rf=   w.];`  r$6  D$9T$wrAD$;D$w5D$t$L$$P轙uD$ppF_^[]ËL$qW? fD$ ~7t$$L$  T$ɋD4 RT$ ;|;r_^3[]̋D$VWHqƋytD$@  +qy_^QS\$UVW<t<   t$nEt3Ʌ~{4;8tDAH;|E3]|=t7t$Mv 91tGǙ;|;rt$fN3_^][YËǙ;|;rfN_^]3[YUQUSVWB @    z(   EJ"0:L$u2G9T   j j u؃   OD$\*G(9   j j u؃tlO(D$VDu53VD_^[]Ëx9z}S腁ЃVD3_^[]`:pAAYVD_^3[]̃SUVt$W|$OQi\$T$l$-   /  t!  _^]3[A   uF9Gu](3,;} }.D  ;tjV3t	G;} |;}    L$\$	S(ATD$D$ PUQ |$,C(   l$1L$ E,E,AFt 3VM j t$P/ L$,AFtE(A   E(f~"_^(^][A   f~"_^(^][Ë\$f~"   _^(^][Å  :3Ʌ  D$V4;tAH;|_^]   [ËE M 3D$~#M9Quff;F D$tG;|M ;   UD$PQQ
 |$(E   F,FAfF fAC,C,AfAqUL$t9EZ39~-D  9uA;Fu
fA f;F t8MB;|܋L$fy }fEfAEn(f~"_^]   [ËL$fQ̃SUtXV3W{93~K     D$ID$pqD$qD$     l$(D$    t	L$!F;3|_^][̃SUL$VW   ] tI ZNt
x:xuGBNxjxx+tRL$E   uD   t3	A %    t$   u    u|   ~   u
3_^][ShZt$   _^][UQSVW{   ɋ@DOlB9OpRjVd   ?+AGlGhd   tD   TD    }֋KWj tK   Wj _^[]U4SVWT$ 3D$    \$8{W   ʋQtC3Ƀ9t@A9uCɋI   3҉D$$D$ Qp  D${  H< T$(t03҉T$(T$$T$$֋@9t@B9uKT$(L$$D$$ҋ ЉD$E  H L$,D$4t:3PQҐD$t%t$,t$8P5 D$L$, 3D$kD$  t$ЋR    t$T$踎  k  t$T$~  Q  T$^  D$Ph\}  @  L$y+u,Ph\W:T$, T$_^[]j Pt$   }    T$q    L$D$D$y+u'q4D$tD$9tvuF3ɋ 9HLDWT$$t	GtT$4.t u@PuGЍGtT$$T$4\   υEȋD$3҉T$0A ȉD$,8t/s&A<r$<u    AA$<tB9 uՉT$0L$,3|$(QPt$$D$HD$ QPPh]Wr  t$LD$@t$TPPPt$Hh]WT  @_t$Q  tD$0t$ t$h_W!  |$(t L$D$T$,QPRQRPhP_W      G,G,t$L$(D$46L$(Ql9Qp$j j t$8   ЃD$4hD$4=\$0BAlAhD$4 \\$8   D    D    D    L$$xW u8yQlJD$4 | tL$$jV
p@FT$(jD$Gj h\`t$DPPh(ZW  |$(tVj h\`t$hZW҄  T$4
 T$	_^[]t$h\T$ 
 _^[]ËT$ 
 T$tȈ_^[]U(SUVT$ W~$ T$      l$4M<tB3ۃ9t@C9uBˋU L$,T$M"D$ED$ @fu3 }+ t3}4t9}3|t$L$̄     j 0t$%y    D$ @th`V_^][]Ã} th`V_^][]è`   tG3ɀ8yDL$A % @   t)}0 t#tt$t$h`hl`V  L$,D$ @tut$t$ha      QD$ D$     PjAj"  |$u#t$t$hDahl`V蟂  |$0tC   fGu tO@tt$t$htahl`VT  L$$A	D$L$(   3PQL$ dtlt$t$,W. D$(8 D$$HI;v@ <;tt I;wt$E,PWPt$ haV轁  L$4~u"9~tu@PuF  FuF,n,ȈF   Ol9OpjUSc   WhT$1AGlWhT$c   \lD   D       ؉   t"L$,@Dx	 t   ؉   Ol9Opj jUV   .AGlV   lDD    D    OlQ9Opj RU1   .AGlD$ 1   lTD    D    Ol9OpjjSd   j2AGlD$ d   \D   D   D    tF<s   FjӋD$8x uD$ @t@`tt$t$h(bV  _^][]̃SUVT$W>|$W   ʋQt$39WGt@A9uɋϋ|$L$APq3ҋ  ؃\$1  K+u hcV蒼T$_^][ u h4cVmT$_^][ Ӌ  Ft΅D$  EAK<t G3ۃ\$ 9t@C9u\$ \$j j@迆~  j@j Ux    E   C"fE"Hj 4FVvtVj W4 }3|$hTcW蝮ME      E"PsQ* 33T$f;E"   3ɉL$$}u2mˍQfAu+j AL$PD$0ԅtt$(SV * 2ɉ7uT$%tf     vxuT$O
BL$$E"T$L$$;c|$\$S4j ghL$$E4ɋGDE<C,E,E   T$_^][ ̃,SUD$    D$VWP] l$4\$D$    ts39VFt
f@A9uɋ@|$ 3PwM  t$$E  ֋S4  3ҹhc~+Eʀ~+upct&6QhchcU詹׋_^][,6 N< T$t"C3҃T$9tfD  @B9uT$Cj 6͋к   PD$4Gq    D$@t8p3t0΃PQكD$tVWP&( D$ D$~|$ <  D$$3|$,H"L$0~.@l$D$,f+
;u:uHL$0l$4|$,;uQt$@hcU茸T$, T$  xx+uB릋D$,GL$0D$,;|룋|$(3ۃ|$j h%ESWWh(ZUz  |$t3j h%WhZUz  WWh[Uvz  h \Ukz  WWh[UYz  Et͋t$DEA  .~t23σPQL$ _D$tWUU& / 3l$l$   |$4 D$$    PSVUl$<UPD$@PPhcWy  D$<Vt$TPD$TU0VhdWy  T$`DjBGjh\`SVVh(ZWfy  |$t1jh\`VhZWIy  \$,T$ W  T$3D$\$T$ <  T$t]}D$tЋ_^][,E}_^][,VW   tEj jt+zЃt&D$W2@JB  B  _^̋  tL$f9t@uÉ̋D$L$  t9t	@u     A   u"  t, 9t@u     3U4SZ@D$\$VW  03C@@ulYat]j jtyȃt1      yAtσ~$ u  A  W6{ 3; D$    ~pfD  KW)D$ ƉL$)D$0D$ tD$ PS D$$L$ xW u=ыL$  T$D$BT$;|t9  u	G  _^[]̃Vt$D$x$ t
   ^S\$C   t[   ^W{tD397~:WJt(u#  tf9t	@u     D$F;7|ɋt$K L$   U3l$9)   Y8  K؅t9t	@u     C   ;utL׋A39~;l$wD    t@ 9t	@u     B;|Ջl$D$Et$ Hl$;(D$i\$$]L$u_[3^̃SU~   V3WfD$fD$D$$    l$D$_W{~L$uN393~0SBu  
t9t	@u     F;3|_^][̋T$B   t   ËL$3̋T$SVt$W~<Mu6B ;Gu{6Fx;Guq    ta9tNqu_^3[<uJB ;GuAB   u8G;B,u06  t"9tqu_^3[ËAAG_^3[UQSL$ڋMVWu3/Q%  =  uyuqt3	Mu3-Q%  =  uyuAt3}%; eDwSQPVhe7D$jjjj@   Ǽt	ww_^[]ÃSUVWT$h   j EP    jLj P  L$(       M yW th8UCD$ u   _^][ú   0eJtx:xuFGJxCxx+t+h-ht hhěj膥   _^][Ã|$$ t   U|$ tK|$_Kwx;|$fD  ttu׹StyӋ|$T$ ͈   ƅ   } ǅ      : W t   Ƈ    _^][Åu;9   u39   u+9   u#h-h hhěj虤   Ƈ    _^][̃8SUVT$ T$Lt$@WuT$4JBu+с?T$4T$PD$Lu3؍KfD  Cu+ف?33\$ W|$3fD$8@D$,t$(   Rh8eP9D$uG_^][8ËNFuD$$+3Ɂ?t$8@QVRPS D$,׃RVtx؉\$q؉D$  Vj S0   D$ 3xϋD$,WVt!x؉\$Dq؉D$J  Vj S D$,L$8L$8,E   4   t$(Pt$PD$8S& D$08  D  OT$t%D  A;GGIuD$$T$t$(\$ȋ ;t	H;u\$PGtR|$T Ou"Ftt$4GӉD$T$   Gt$8T$WT$<"uFT$T$   w_w\$U] ( tCM  }4[Ѹ]   MD3.:uA8uFA \$eOt$(<'%EЋD$ RUh@eVPO։T$tNFu+?D$_+\$L;tAD$0++PD$P3D$P L$ ƋT$$+L$0ȋD$L$0 D$VRP` L$8rD$$\$t$(8,L$DjjjL$8q3   \$tc= tPpKt
PHS$)xIISpKtPP_^][8S_^][8U    3ĉ$   VWW)D$ 3)D$0 |$ D$   |$D$PtD$3ɋ@9t@A9uD$ɋ@4ȋD$L$ P{m  ЃD$Wx@   tK  u|$WtL$ 3|$5  -  Wt L$D$ PH D$x$ t	pD$  9w  ׋q D$  GD$D$VjLsЍt$pD$ ҉T$Eu%PD$   DЃD$%^T$L$FF    F    F    AdAdFFF3fFD$F F$    F(    F,    F0    F4    F8    F<    F@    FD    FH    D$xW t3L$h;֋L$P5 u   G    D$    t$Dj KG L$3T$9A$ D$tB    L$jB     ՛ t$GtD8 ~?3ɉL$L$u1TtL$j F L$T$HGBT$L$;|ϋD$L$xW L$$t
   F  D$>  WtL$ K1L$D$  wt$H	  L$8D$ T$ D$doT$L% L$8> D$PPD$TD$X    D$D$       FD$ 0tyF   L$L   9     ֍L$LL$LF)   L$8 t"  	NL$8% 	D$oL$8T$Lz$    D$t$D$FD$Ht$;0D$aD$ȉL$8L$3D$w       N L$ t$(D$8   0D$u]VL$ 0D$uIVL$ /D$u5VL$ /D$8    /Ph(WQ謥L$   jt$D$8    t$T$L$D$$      (_^$   3 ]Ë$      _^3 ]QSUًUtmm  VWU6UtH}t&7~     uNE D$ty8t#7~uND$xt)7~     uND$PtD$PtEt&390~ 3     TUEHF;0|m(_^][YUQSVWs;t   rkD   tt	   uBu0r     t^fD  F   v$W>KV(t]Vt?jF8tV t+j֋"j   u   tL~
 uFV^ tiVtiVtuIVk  ֋iSti  triօu賋 _^[]U   3ĉ$  ESVuD$P Wt$Xx|$uL$H7Q%  =  uyuAt
D$H    D$HNuL$7Q%  =  uyuAt
D$    該D$Nu3|$ ;Q%  =  uyu	y|$ t3|$ aD$ NQ$t7t蝥%ty t蹥؉D$WfD$(\$(\$NuL$L7Q%  =  uyuAt
D$L    бD$LNQ$tT$P3t
ty t(WfD$(D$(D$PN A$t11tɤ ty t	WfD$(t$(|$H D$h  L$(f	  ^	  |$L S	  K	  x_ uԿD$t$׋c  ЃT$	  J";  BWVt$LˋD$,fD$<D$L    B ;؋D$$PDʋT$ L$H$   ǀh      1D$|    $   D$l@cD$hD$d cD$4D$tWD$fD$hD$@  $d  c  F+<uOv,Qf$   L$|> D$ $      xW Eʅ  ֍L$\Xo  g  u   t$@T$  L$ 蚠Љt$@T$  N";}JNt@$  $  t5f9tyu"AD$4AD$8$d  L$4$  |$< }BF t;$  t0@ 9tyuAD$4AD$8$d  L$4^t-;~$fD  L$\EuO鋴$d  ^t5{(t 7~L$\uN[uҋ$d  $h  t5{(t 7~L$\uN[uҋ$d  33f;F"}Q3ff     FD8ft,~+ u&N4t9|TtL$\$d  F"C;|T$^0\$t       3D$9C   L$$uGT$9u?$  $  t)9tquAD$4AD$8L$4L$D$ItoT$ Ou^{D$$utIЋ-u<t8$  $  t&Ȑ99tquAD$4AD$8L$4D$L$@T$D$;A&ً[T$\$b  $h  tGx(t'7~L$\uN鋄$h  P$  L$\  L$xKȅ+  $l  rt$   F  t$3ҍL$|Pb  ;D$  F    X\$   ; D$    ~|D$D  {uTtPL$$tHыÜu7$  $  t%99tquAD$4AD$8L$4D$|$G|$;8|t$ VT$   3ɉL$9
   Z;D$$utXЋ3L$T$uCt?$  $  t-99tquAD$4AD$8L$4T$L$AL$;
|t$ ^\$   ; D$    ~xD${uTtPL$$tHы蓛u7$  $  t%99tquAD$4AD$8L$4D$|$G|$;8|t$ v(t$ $l  D$9$      JL$   9 D$       $  D$3҉L$D  9t$$utX֋ÚL$u?t;$  t099tquAD$4AD$8$  L$4L$T$D$BT$L$;|$l  L$\t$P\$XT$8t$Pt$Pȅ  D$D$\$Tu@ %  ;uL$X1S
   |$|    L$XqIu3/Q%  =  uyuyt3	¨u3/N%  =  u~uFt3	艨t$|h%h%PWhe$   ȊC   jjjj諣tL$xY^
QS@L$xtT$4t|$     r&^օuD$L$(x_ h  t_^[$  3 ]ËD$x_ u$  _^[3 ]W|$?uRG   uIT$,SZC;u6t2  
t$V99tQ
u^[3_ËAAC^[3_QL$SUVA   t$A WD$nt   _^][YÅu   _^][Y39~TxG;Eu9t3  t%9tPuH
M HEE t$D$CH;|L$ы_^]3[YU   3ĉ$  EVuD$H Wt$\@D$u3/Q%  =  uyuyt3	6NuL$7Q%  =  uyuAt
D$    D$NuL$7Q%  =  uyuAt
D$    谥D$NuL$H7Q%  =  uyuAt
D$H    lD$HNQ$t13t誘!ty t	ƘWfD$Pt$P|$ W  D$K  |$H @  L$y_ h  T$Pǁh      u谳D$L$WD$0    W)D$$W  D$,$   fD$pD$d$   D$ D$x    Vt$ t$VD$t`~D$x~$   ȃ   ~ $     |$t$  N+     F,$   W)$   )$   $   `$   V,Pq2 9$   tB$     t$|$L  F %  ;  L$\qW8  V,L$dj  tD$@ % @         F0D$tt$  @D$`tMT$8u>$  t3D$` 9tquAD$ AD$$$  L$ D$@D$ut$$    L$Ǔ  t$,9D$u?Ft80D$~'L$duD$ND$ዼ$  t$T  $  E  9tW:u3  GD$ GD$$|$   $  tft<$  $  t*9tquAD$ AD$$$  L$ |$   W$  L$dv  $  t$~tVT$褒uGD$,@<;Fu;$  $  t%f99tquAD$ AD$$L$ t$|$ 6  $   2ȅr֍L$d]~|$  t$tJ֋
u=$  $  t'f99tquAD$ AD$$L$ t$|$G   3ɉL$9   3|$fD  |tK֋菑u>$  $  t,    99tquAD$ AD$$L$ D$D$|$L$H@t$|$;||$(|$|$LT$ jt$Lt$$ȃ   t$+$       L$\qIu3/Q%  =  uyuyt3	謟u3/N%  =  u~uFt3	s$   h%h%PWhe$   证L$hjjA   	jj莚t$   9U
QW $   QT$ tf     L$rUօut$~_ uD$Ph  $  _^3 ]Vt$>uuBFt<D$Wx  
t%91tQ
u_3^ÅtAAG_3^Ux   3ĉ$t  EMD$V L$	Wx|$u3/Q%  =  uyuqt3	L$IuL$7Q%  =  uyuAt
D$    蠝D$_ h  D$ Ǉh      uKR  D$F  j PW֍L$t  $T  WD$PD$8D$hD$$D$@)D$@fD$0D$(pD$, cD$<   y+uSA,WL$lD$ `|$xb+ t$|$t   ~W E|$.  T$L$$2   yt'7~L$$uN鋌$T  33f;A"   3AD0ft,y+ u&Q4t9|TtL$$$T  A"G;|n$X  t@x(t'7~L$$ruN鋄$X  P$t.L$$#L$h|$u5$\  L$$t$D$T$@L$j j P0|$t$T$@t!|$D  rQօu|$t$t6t$F %  u;uD$pt$
Wt$AL$hu|$_ D$ h  u*$|  _^3 ]Ux   3ĉ$t  EMD$0V L$	Wpt$0u3|$;Q%  =  uyu	y|$t3|$zD$L$IuL$(7Q%  =  uyuAt
D$(    0D$(L$IQ$tT$,3tfty t脍WfD$ D$ D$,L$F %   D$<IuL$7Q%  =  uyuAt
D$    葙D$L$IQ$tD$4/tǌty tWfD$ D$ h  T$ ǆh        L$(  V T$4tF$f F$t$,QVL$tL$@   `	N ucD$<   $T     z+uWD$h)D$@L$hD$@D$@)D$PR,P' $      |$t    T$   F %     L$8D$hPD$ pp   $\     uL$hu$\  RD$ tF3ɃL$9t@A9uL$vD$0Nxx1tT$輈tuT$S覈ty9t$uL$8   fHt9j jHt$0L$hD$ h  _^$t  3O ]ù       @    fH뽋$|  _h  ^3 ]U<   3ĉ$8  ESVW}D$ X\$ A$t11t5 ty t	RWfD$t$OuL$7Q%  =  uyuAt
D$    qD$OQ$t93t诉!ty t	ˉWfD$|$CɋȍL$0h  D$3ǃh      Pt$St$  $    K"f}  D$$;n  KD$(4$<  tt92tBЅu3ҋD$$H;}*t$(Ct0tt91tAȅu3ɋyr&BJ{,|$t,t	HuL$\$ +WQPhHeSvw|$0ϋjjj.   = tnpKt
PHV$)xIIVpKt
PPL$0L$h  _^[$8  3q ]VL$0L$h  _^[$8  3? ]h-h' hhěj?yL$0   nD$ L$|$h  !t$|$L$0GL$h  t
VW$D  _^[3 ]UDSVW\$4|$HT$(zW g  Wt t$(3ɋv9VFt@A9uɋGPw3ҋJ  t$  ֋  3ҹhc~+Eʀ~+upct(6QhchcS]L$<  _^[]Ë}  GD$DL$@t83PQL$0Ltt$Dt$DV! D$P0 3{^  L$z D$8yWhcSā*  T$L$@BD	t&,OVPeDPh\eS腁  fz"VhxeSh  J< t$ t&D$(3t$ @9tt$ fD  @G9uD$(t$ 2@   4ȋV9  h  j h%CPVVh(ZSD$`YC  t3j h%VhZS>C  VVh[S.C  h \S#C  VVh[SC  D$0t$<WVheSB  j׋謸Cjh$ft$LVVh(ZSB  tjh$fVhZSB  {$   D$L$@@D {  s3ɉL$$L$,u9Ktu@PuCfC(jqt$D$ HWK(׋Ն NlVhL$DT$9Npj j W#   ^D$DVh2AT$Fl#   |D    D    D    C,L$@C,D$AumNl9Np%j PW   L$ A"C,3  AFl||$   |D    D    L$A"C,3   QT$$t B8$<tRuT$$B43D$C,D$<B2؉\$@3f;؋\$4s{\$fNl9NpD$^   @PWS2T$02AFlD$ ^   \|D$@A    ǉAJ2G;|\$4L$D$@C,D$<|$@|$,@3C,D$03|$<f;A"3  \$3ɉL$@
fD  T$$;|$8   CD    tPB43ɉD$LtBf;8t5A;L$L|B2;   L$$T$8R  3ɘ;+	Ӌ|$,T$C B׋|$<;u^Nl9Npj Rj K    D$,X\$AD$,FlD$ K   D    TD    D    RWt$ ӋkD$,|$<L$@C"G|$<L$@;\$4|$T$,GuVC,Nl9NpRWRK   X2AFlD$ K   D    |D    D       Nl9Np\$0SRWa   .AFlD$ TT$0a   |TD    D$$   X2Vl\$L9VpWt$4   t$ 蛕6\$BFlD$ \\$0\\$L   |D    |$xW uD\\$Fl~   fTT$DNlB9Nprj RS&      Nl\$9Npt$RS   |$랋|$AFlTT$   \TD    kAFl|$&   \TD    D    VlxW tIL$DBIPD$ L$(UA|$HL$(  _^[]U4 3ĉD$0ESىD$ EVW{3T$D$,t$ u"9{tu
FPuC蔑  T$NȉD$$L$3fxD$  1L$$D4 Z=  uk}+4|D$t$0hfS"<  C\D0D4T$L$F|wl9wp   Rt$4q   u%_h   PL$T$T0t2L$$@DL$x	 tt$jRы1  T$(L$D$(t"Pt$0D$ t$0hfSp;  UGlD$9Gpj QR   茒1T$@GlD$GhTT$   TD    D    FGl_hq   TD    EAD$0AxW uDD   Gl~T$fTL$<_^[3輹 ]蒾 ̋L$t	ы	>U$S]VW}@D$$A$t15t{$ty t{D$WfD$t$t$OFD$A$t1t$1tt{ty t{WfD$(D$(D$D$L$$$   RPtA;   L$$   Pj V D$0OA$t91tz ty t	{WfD$(|$(M~F    IA$t91tz ty t	zWfD$(|$(D$֋L$FD$FF$hPF j j$ˉ~F F_^[]Ë   fHt	ry	   fHC   IC_^[]USVuW6NA$t11ty ty t	yWfD$t$39Ou#9O   D  G   A;O|         WG3ɍZ;w;st%  yH@(0+ظ    fD  D@@(fL(DfDDfLDfD;|;}@ GA;|;w}G G   F;w|WwBWtTO@;vFG O   3;Eً fPtj Q}_^[]É   @    fH_^[]U,ESVW0
D$(    \$D$     D$(    KsAD$0    kd{ fD$4  t$L$,tCt$j PD$(h4gPi39{       C j 3CSPQ D$uDu@T$
   D$3   ȋ3;wr9D$w	   3D$VPD$(h<gPi\$,Gt$ ;{lD$4tPu;D$5MtT$$hjt$8_^[]j jj %D$5tT$$t	L$ p9_^[]U|ED$D@SVE@t$HWD$dȉ|$$L$@AL$tAG,_L$AL$xAL$XAL$pAL$lA;T$DD$4NL$(G,\$t
\$8\$H-t u
BPuG}؉D$8\$\$HV  N  ~+ D  Pgj\h$ &  N< T$<t#D$D3҉T$<@9t @B9uT$<D$D   ϋ@4D$Pj 0b)    L$<t&@Dx	 tD$Lы0j p)  EЋt$L@EjpVt$DH$   G(;NωG(x T$d6ȋMփz|$0  D$4t;  39O$EBL$4tG8$<uw2t$\G8G4D$\ȋtO2 qT$pPt$dJT$(L$(΋B,;NB,CpW,{lD$9$t$<Rup   D$DhD$3uAChD$ TT$<p   tTD    D$$ȋT$0p  Ѕt*yW tRmFlFhDTD$9!T$dj RT$dRG   Dt$5t$AT$\TT$dG   TD    D    D$0P2D$9j t$xRG   1At$TT$tG   TD    D    D$L$|9j j u#   芈UD$|0UA#   TD    D    D    D$9jt$Rb   11\$ATT$b   TD   D    D$D  D$9j t$|RG   ԇ1\$ATT$xG   TD    D    L$$3j htjut$t#D$(9j t$DG   j b1T$@AG   D    TD    D    L$`D$,  D$$j H8@8D$X    L$HP7D$h  T$9
j j j    ΆT$ 5\$A   D    D    D    D    |$`L$,uaD$0fx2uVx6 tP9
j t$X3   t$0X1\$(AT$T3   \TD    D    3D$     D$0$   @ 4D$$   yTÊPV  D$\utx uL$$VP  D$\D$9'\$G   j t$Dt$(蜅T$,t$9t$A\$@T$ \\$G   TD    D    D$9t$Ru^   8T$,,Autt$^   TtD    D$7T$(90Rj t$ 4   5\$FD$ \\$4   D    TD    ƀyW tT$\R}:yHT$\D$ | tjRЋ螐tP@$   L$h4t$~   fTD$ T$`@D$ ;D$9j t$DRG   1\$ATT$@G   TD    D    D$9j t$X   j 衃1T$TA   D    TD    D    L$,I\$xW tIɋID$,TD$83D$8D$HD$HD$hxW tIɍBID$ PD$T$(9RVu^   ܂0]AD$ \\$^   tTD    F;t$`pKT$TҋA<A8yRÊI@T$hL$Dy/L$$   j h jt$$uL$XD$7      ;j j t$ 2   T$9T$F\$\\$2   D    D    D    D$L$h9j j t$    豁D$h1AT$   TD    D    D    D$T$`9 t$(   j uTЃT$`8]BD$ \\$(\\$   D    D    xW uD$ DD   D$H xW tt$IBIƋt$PD$9j t$0&   u褀0UATT$,&   TD    D    xW tIL$hBIPxW tt$IPtL$`BIt$TV;j t$0&   ut$4UFt$TT$,&   TD    D    L$$3j hjt$xu@D$(9t$a   jt$`}5Bt$Xtt$tt$a   D   D    yW th\g3 yJj h\gKD$9j t$T   u~U4\$PAU\\$   TD    D    D$9t$Pt$R   ~1\$ATT$TT$P   TD    ~   fTxW tIL$|BI|$0MPD$4T$LD$4|$0T$LMD$4|$0[  8L$4  Klt$l$   9Kpj VRb   }|$Dh-ACl{hb   TtD    D    Sl$   9Spj j V   Z}$   .BCl   tD    D    D    Kl9Kpj t$tK   j }2T$pAClK   D    TD    D    sl9spt$a   jt$`|2T$XFClTT$a   D   TD    yW th\g3R!yslNj h\gKlt$P9Kpj Vu   |U-UACl   TtD    D    Kl9KpVt$R   {.ACl\$TT$   TtD    Cl~   fTSlxW tIP_^[]Ë$   BIT_^[]UVqWu9qtu@PuAxtQNl9Npj j W   z_^]ÍAFlFh   |D    D    D    _^]̃SUVWl$͋@DD$GtE   VTuVTuT  FPωFP_(j j SCG($t$o,G(ED$vtVPUSj 6D$uT$_^][SUVW u<t3@90t@G90uCtE   VTuVTu花  FP`gL$FPɋs(FC(dgEPDŋ PVBC,@Ջs(PVt$ ׋_^][USVWt$G   u"9s  t	֋BF;s|  u~ uT$0  xЋ   T$D$PV1     ~ tKL$D$    D$   H L$D$t43PQ\)tt$t$V D$0 3^tFt$֋n'  υtPPt$3V%  tj Ћ֋${` u|wu9wtu@PuGutWNl9Npj j j    w_^[]ÍAFlFh   D    D    D    D    _^[]SUVW3> tHl$;}@3҃0|9wFRQ0}j R rfD} < uFFGu|$g8>        j[hPֹhg  uO8cj[hPֹtg  u+ND$T$&iD$LÙRPqfG0j[hPֹg  uO8@tD   t
FFȄu< uFF< tK_^][ULSVW}t[tU tOMq	  ؃t9wu;C(   fD$@D$PC&PQrD$LKfC(3_^[]Ët%|]ust'F8$<tvuEp$  tN8V2VvN8BQN8   ~$ uF_^f KfC&3[]̃SUVWC3lMtD  A`	uM tA`8	uCˉ\$кfPD$  tDx+ u>t$hgSMux!j D$Ph VS ֋ˋ!u tNA8u街  6uu(_^][̋ASVڋW|$׋4+2;uu_^   [xx+uFӅu/S+
;utBxx+uB_^3[UEMSV 3ۋ	W3\$p|$ \$u\$3Q%  =  uyuAt\$NjD$MIu3-Q%  =  uyuAt3jL$%ɋE|$E   T$t`hdH-D$      ^KCt蒠CL$ gh   j PV8{ӕD$\     NG;|WhgVKD$J  3~R׋uDNGT$;|~  ;uFj j04#F  NAG|t$hgVUKD$  A3uSQ"?;d  s,;\  r
   w2;`  r6  ;wr;vSQ׋#  ^WT$߉~F<D$D$PD$$IPD$,PD$PN    u%Et$jjjj@   xc<  = tQpKt
PHV$)xIIVpK  PP_^[]V_^[]ËD$|$    L$$Pj CPVFL$D$tCQAu+j APD$,c!ȃL$ tt$$t$Q L$,D$F_ u hhVwID$C   t  K  S耾  Cu
D$   (xL t"@M:FTth(hV&ID$D$   Ky	 tAy
 utCVY@ x u   ty+tPFHL$$uL$By	 tAy
 u	tL$$y	 A@D$tAu	DtD$D$KL$$tCy	 tAy
 u	7tL$$A  f!PQD$f	By	 tAusV K87Ky	 tAusD$Cu; D$   \$D\$   fD   Gu u u? t߅tX= tEpKt
PHW$)xIIWpKtPPWuB8^_usf   Ɔ    uT$4< ؀~_ us         FHD$$FLttFD    FD    7  D$$Ft(
  t D$uJt$hlhVFD$.!T$tMh8VFD$D$t/}jjjjG   V_T$t}t
SW_^[]U    3ĉ$   ESVW}|$u3ۋ@D$OQ%  =  uyu	QT$t3ۋ@D$LcЉD$3ۋAD$u	%T$H3L$~8x tR֋L$uD$T$F;|ӋD$|$;|h~}hrKty u`y uZ@@H0tfQB;CuBB	uKqL$C    C    
  _^[$   3Z ]øht$PD$(Ph   ,FT$0jjjjG   ]$    _^[3 ]UHVT$$W~$ >|$  EW)D$0)D$@t$0tI8;tAЍL$0t5EЋwEt	ЋgEt	ЋW_^] uEt8;tЍL$03   uEt8;tЍL$0   uEt'8uu@3T$(j j Ps    FD$t ~t u@PuFgND$V~ |GF BFF,xF,   UWQGD$;tzEt@  @ P   uQ   NL$ AlD$$9Apj Wt$$}i<@AlD$$D$ @h|D    3@    fHL$H@ ~ G   UPFWD$(;   Et@  @ P   uQ   ND$ L$,Ql9QpT$Wj Rt$,hDD$@AlD$D$,@hTD    D    L$ @ 3fHL$$H~ G   UPEWD$ ;   Et@  @ P   uQ   ND$ L$,Ql9QpT$$Wj Rt$$hDD$$@AlD$$D$,@hTD    D    L$ @ 3fHL$H|$ t{E3j PGQ+PWNlt$(3҃|$(Nl9Npj j R   g/AFlFh   TD    D    D    |$EzlQRj j Rhl   YQt$t$RRh0   Y̋D$L$Pz$ uI   @9Vu2    ty3^r,hhVL   ^̃L$SUVIWL$y(T$tEZKrx5t?Ntu׹S+NtyӋL$T$D$,@ D$@  3h|$98   p8t$ y$    EtsrNzx:tMt"EuйSMtEy͋EL$;uuL$M(   t$ L$|$E    A M(   E D$F   utu<L$D$GHH|$t$ ;8}.T$,uq0q,hi1cK_^]   [Ë\$,C@t$390~3TL$(cuϋC@F;0|_^]3[Ud 3ĉD$`SVWT$q  Y     Wh  WtR  t*7~!     跤)  N|$GtPWD$8T$fD$fD$ fD$(fD$0fD$<fD$DfD$LfD$TfD$\d   G D$   8t&7~%   ND$Pt3uyD$xt"7~uXND$Ptu:D$@D$p|$(|$3_^[L$`3 ]ËL$l   _^[3 ]Vt$Ft
PHL$D$h  l  t+Nt$fff           IuF^t
PP3̃SVt$WT$    CD$t	3_^[   Pt$ h  Rjl  ЋuSt$t$hTih<{|$ tPt$h\iI<PhdiW:HG   _^[Ãtth<iWHG   _^[VWh  tu    ul    uc   t$t$t$Rl  ыuhiVGF   _^Åtth<iV   G~_^_3^̃SUVWl$FtE3ɉt$Vh^l~|$$ 9(u9xt*A;|;B.ȋD$u2PQ|x u|$( u2ɈH_^][ñH_^][;d  sB;\  rw6r.   w,3h;`  r6  D$;wr;w3BPQ׋Au(t$׋K3T$
Bh    _^][3tT$_Bh@BhD$^D$AD$ AD$$]A[U SUVW{ +\$l$$q  {$ t}W a  C   _^][]Ëst$u7    $  9stu
EPuC2]uC     D$    	     T$z`   Nl9Npj j j S   !_T$ 3AFlFhS   D    D    D    D    Nlz\L$(9Npj j W#   ^T$ D$()A3FlFhllll$$#   |Bd3D$ 9z`~n؋Nl,;B\D$,9NpUWP^   ^^T$ 0A3l$,FlFhl,;^   |lD    G;z`|\$l$$D$ Nl9Npj WPT   ]T$ 3\$ AFlFh\\$T   |D    D    |$(NlR\G9Npj PR&   ],A3FlFhTWlll$$&   TVlxW tIBIǍFhPNl9Npj j j F   ,]3AFlFhF   D    D    D    D    }W y  {T u
{D i  NlxW IuFh3H3҉T$   D$,CT         t@Dx	 t      EDSP#T$,ڋH ҉L$$ڋNlD$(L$,9NpPRW   8\3\$AFlFhTT$(   |TD    L$,xW uFhT$$DT    uFl~   FhfTT$GT$;}3ɉL$(9        x4t9/tuVl9Vpj j j    g[7\$BFlFh   D    D    D    D    xW u7yVlJFh| tjWЋ=gt
x@GL$(AL$(;   9{h kǃ       D$        3}ht$ClUlƋL$(HL$$H@L$D$,9UpQPt$0   rZ6t$(BEltt$,tt$tt$   D    M yW tt$$e}h:yUlJ| tjt$(Ћ2fL$$tH@D$ @t$D$ ;Cht$kpD$(CD$,       UʋD$(ɋ}jp@DpHR3F EW0Zh   YcЃtTGzB@O   JfB>Gz4zHBXzpz|         {( uC(   m \t${D|$   C ? D$(       wǋ~   {    .W>6D$,;titE  @ P   uQ   kMl9Mpj WPvX7AElEh3fTT$,T|D    D    D D$|$(G|$(;8St$    tR   P`tENlx\9Npj RWv   W%A3FlFhv   |TllNl9Npj jj    W3AFlFh   D    D   D    D    {$ uӋBoCe   _^][]C   _^][]UhVuW~$ >|$GD$   UEP/D$u8GWuF   F$_^]   F   wH)D$0GjLj )D$HG W)D$\G0)D$l~G@fD$,u D$ T$MHޓ D$L$T$H(D$0E(D$@HG(D$PG (D$`G0~D$ fG@wH_^]̃SUVt$ډ\$W|$R  G3ۉD$ ~*o} +
;
    D$ |$;| S+2;    3ۋGˋt$L$ j LTh   U    ZJtx:xuFGJxxx+uPT$  i+7;      D$i@Hj  Th_^][xx+uBD$ C;xx+uF_^]3[xx+uFYi+7;uTFxx+uFվ'Q+
;u"Bxx+(BѾi+     
;uu/D$ QL$ @Lxx+B뿋Gj HR@Gj HRh   9w~7D$    @j LRhcD$F;p|Һ   I ZJtx:xuFGJxxx+ Si+7;uu&D$ Q@Hxx+uFȾi+
;uBxx+BUSVT$W\$Cu0    u'V  tF$F3_^[]À{_ tKu}ˋȃL$   8F   8      P  QX   S   iJtx:xuGCJxxx+uH}O跳 t9@0t3L$j Ph躡 ؃tӋ8 t
C_^[]ËD$t	3_^[]Ë}Fy+uY~ tSD$D$    iiDMWtQPhSV$7L$$_^[]PhSV7L$ _^[]̃UVWT$339w~hL$S_ փM֋DD$tQ-tD$T$Hj Ohu_L$F;w|[_^]_^]VWj GLT$OtuVJ;uFBtfD  Q
;tuFv$WV(tVtF8tV t֋O_^ÃSVW   ST$9s~lU    ŉD$f     
L$| u"tED$L$    S;})GFD$;s|{]4sT$  ;tBFtD$0_^[SUVWxCҋDfHNC@fHNc{8 u239s~+3ff     CD@Nt	P譛  F;s|_^][SVW~_ u T39~~33    FDt~8 uPY  fHNG;~|փfˡ ~_ uS~8 u
_^[^_^[UQSVW}Gs4ft/t/9|JTt	KGED_^[]ÅuU   fG	s4_^[]Ë@fGP9V}u	&s4_^[]`pAAE_As4^[]̃SUVWT$} u3NFu+?^3Et$t.;tAD$@ Au+L$?At$D$$u3ȍq Au+΁?A3L$t$uVQWG;d  s2;\  rw&r:   w0;`  r6  ;wr;vVQL$ t t$;} t$(PQ    f	E_^][UVW~tpS33f;F"}     tF"C;|V[t~+ uV4tt	   u3F    fF"8F+uF4_^]QSUVWuts^t	   u}+tNj Jv$WV(tNVtF8tV t֋uE+  ]0      t	   u7KCtAtPSM<P8LJKtCAstGFD$pW5D$PtD$pWc' vW
֋s tGFD$pWD$PtBD$pW' vW֋sӋޅ
   <|   t	   u6M4E4    t(f1QuM4q  A  ʅuڃ}0 t?39u,~tE0tGF;u,|U0t3u,WX& Ջ<U tUt UtBՋ_^][QT$tL$t	   uBukYQVj VJT$eHt   u@u	Ћ&N^YSVWtOzt73σPQ,tWSV{ 7 ._^[3._^[_^3[QSUVW   rt,3΃PQtVSW > 3s.tZuN]x9uZ/t u׹SF/ty˅t	׋]_^][Y_^][YQVWT$z vG    thiVI-_^YËD$ȅy#WhjV -_^YËD$   8_^Y̋A %  u3̃SUVW|$C$K D$%         =             L$ utM.uBFut1Ћ-u$L$$Fut-  h%W,   _^][À u[   tR ZfD  Jtx:xuFGJ   xx+tvK           uz    uq|   ~	   t_j_U老 tNj  _t6x+u0UЋ/'  tUhjt$)+   _^][_^]3[̋AtH8t@uVq43tIff;t@;|^SfC tYfxTUW33t&Vs BȍvEЃu^CD tfC$f+_f][_f][UA,VqWy,u9qtu@PuAAtiNl9NpjWj    C/AFlFh   D    |DD       @@x	 t   _^]U$SVWD$i|$ 7t$    tg   u^    QDȉD$(QAu+j APD$4tt$,t$,V?    T$  L$,Qu؃	  } t(Ex vthDjW(_^[]û   D$,D$tWH L$D$,t;3PQVt$t$t$0V蟗 D$(0 (3(3      D$rXD$tOj jtЃt&L$W2IBJ  B     D$L$I      x  } \hcDVPB     ӋȉD$D$8   @EML$(iT$   PD$0 QDj P]  9Eu't$,MPD$0VH81  D$8    D$L$@ωD$   t$L$ytg} u*L$x+hcQ\EPhpjW&G  GtׅEd$BTD$u؉BTu7x  @  t$L$|tVhjWY&  L$j j@D$,  j@j P軀 L$8T$ 1t$fA BDA<   A   fA&         wt$tOtL$,.t u@PuG7=Gtt$D$,F   ׅEd$T$(BTD$u؉BTu$w  T$(BPJ؃} BPtRNl9Npj j j    ?3AFlFh   D    D    D    D    G,@GXD$@G\@G,Nl9NpjPSc   >VhT$@AFlVht$T$T$c   TT$\D   D       ؉   t"L$@Dx	 t   ؉   NlL$(9Np!D$   j j P=D$(=|$ AFlT$t$   TD    D    D    D$T$@     u   NlD$$9NpPjSd   {=.AFlT$$d   \D   TD    D$NlT$@TD$$9NpPjSd    =.AFlT$$d   \D   TD    NlT$L$$xW tIAL$(IL$$} Hut} unNlL$(9Np#D$   j@PS<      |$ AFlT$B   \TD   D    D$(   ZNl9NpD$G   j @Pj  <7AFlT$t$BG   D    TD    D    GD$u D$,8 u@PuG}9D$t(D$ILy	 th QjjӋ_T$JlL$,9JpL$q   Sjj i;T$ 7t$ABlBhq   D    D   \D    L$,xW uBhDD   ( uG(   Nl9Npj t$   j :|$6|$AT$Fl   D    TD    D    \$Vl9Vpj SjM   :6BFlt$|$M   D   \D    D    yW th("E7yVlJ| tjh(ЋFF@(@Nl9Npt$   Sj 9.T$AFl   D    \TD    Fl~   fTNl9Npj j j z   x9_^[]ÍAFlz   D    D    D    D    _^[]G$G   L$G,_^[]Vt$jWj FH(8|$Wt@׋_^QSUVW    thjVƆ   j jht	   j`Gj PGy    7oj jtZȃt      yA16jj FH(7Wth׋{W ujGjwfGjGCV@GC@G G,G$ w0oDCH(7;ur_^][YÅt	Ջ_^][Ỹ$SD$ UVW   T$\$D$$D$AL$  A"@;   ~1hjRr_^][$À   s	L$8E\$Dl$@l$(  u      jJtx:xuFGJxxx+   \$Dt&Mfff     t
KI\$Du	r{u	   tok@ Jtx:xuFGJxxx+u(\$DtM@ t
KI\$Du   L$@l$@3ɋ\$DL$ l$(fD  d;uaH/uJtJ~!Nt
x:xuGBNx*xx+ыL$ tAL$ |-D$ 3ۺ   HL$D$$BNL$D$$   u   t$<3ʃ PQL$Z  D$|$8   rFtAj jtȃt"T$A    )yq  A  VWU . UE 2҈T$̈́tfD  IxuT$t$3D$ N"L$,~u~8W
u`7+D  
;u)u7D$UhkPQL$ _^][$xx+uB뷋D$ T$L$,@D$ ;|L$I uWVt$   T$;d  sv;\  rTwjr   w`t$WD$~"N/G
ueD$3G%   1GD$$G	D$   ;`  r6  ;wr;vWVt$ыȃuՋ_^][$͍QAu+ʁ?St$,qV0  ׋   fOt$GD$fF"fF$@L    _^][$V   tOF"f|EN3A1AN   At#FtfHN"I;uH8@u^QSUVW33C   AxrahcuBxbolcuBltxetuB`bolbuCtEuN9(AuG뫁laeru	Cu4E0aolfu	Cu#Ebuodu	CuE% =tni t`DtZ3ɉL$C}6t-t,u
GGuT$#L$      @;OE	_^][YUdSVW   D$      t      u   H"@fT$4D$D$$0D$(D$8    t׍L$ pfT$4D$fu0h,kV   @`th\kVoj4D$@j Pq UD$<uhD$DT$<|$HD$@    j j覿T$LD$t D$T$Pt$   D$<rCt$ WfD$,fD$4D$$_D$( aƆ   t׍L$ "oD$   t	׋+_^[]̃ SUVW3|$l$$D$   t$tFt(6hkWro  _^][ wFu3^"KFD$fH@`  hkW"   M L$(   EL$ D$ t@    t@uuu ;quH9uu;8;uxh3F"~k~7+ ;u+u9fOG`|$|$thkWt$)xx+uB뵋t$CF";||$D$l$ D$;l$$L$(   D$   @$<@   |$<      r?t;Etf@    t@u  tfD  9t	IuF D$4F*D$8	Ff^    E   3U $M u@;|_^][ Dt	<pupPhpWF_^][ S|$8 thkW!jj t$D3ҋj j t$HUj j ;  $_^][ USVW   t$          CɋD@@   vuAHL$9N}R֋"`D$pAAQD$pL tGHjP_^[]ËMAtfff     AAuUBtfBJu+щL$D$T$jP֋_^[]Åt#_^[]̃SUVW   D$/     "  @"7HD$t$  *Zt,3˃PQtSUVU 3 3      yTÊPVp  utx uVP׋q  օty\$l$L$SVKօtQt$ A ;u5CT8   u388 t@8 ut@8 uPA IuT$L$_^][&_^][USVW   |$T$   r"J΀   L$uh lS   fy wr}   G   ?ЅtOLlJtx:xuFGJ   xx+   L$|$1h\lSet	ŵ_^[]ÃuӋ?Ѕt˾TlJtx:xuFGJxxx+uT$@   T$fJ$    |$f	O	rGtfG`thkST$t$W_^[]QSUVW|$ىD$3/0t u_u	L/Euu.D$D$;   PՋ\ |$;u</ ut3
"   FtF?"u"FGGuD$t"F_ 0^][Ỹ$SUL$VW3D$x"p|$(~93t@ "HZREȍAuuϋ|$(D$3Ɋt"AZREHuL͸l2Lº|lD$0lLº%D$,lLD$ ,E#   ŉl$(RP؃uL$$~3_^][$hlSUh˃QAu|$+ʁ?T$L$7D$D$    (pGD$$3f;G"   ΋֋t$ PD$0+P 3tQAu+ʋ?l$$D$T$D$,ˉD$ u Eu3WGu+?t$WQP{ D$$D$(l$$t$@"֋9D$Fl$(t$0+hEPU8 _^][$SUl$VC4W;   <    ǙRPt#L   Wj Ve C4Ps VRz C2<s E   PsW4z C44m    {<oPsWz C4{PsWy {K8fk43_^][_^]   [S3UVWCs4h3t){D  Gfy   
L	@;|ߍ    j P0fC0_^][̃SUыL$Vt$ WA3T$pD$$~dZt$f9uMI B 41+;uu_^]B[xx+u@ыD$$L$ T$t$G;|_^]3[̃SWUVfD$p4\$l$WD$xPH@L$<px0ID u?}33 C3ʃ@CڋL$yD$_^h@]XD[U(SUVW|$M GUL$$T$   D$uO33f;O"}83ҐODtDu
DG"F;|؋T$O   O   D$D$   t%yJlIxW tI	Bh@   G _ fD  ȋD$ɋ ȉD$0u3NFu+?L$$F5j Pt=j4j Wb ;fG"G4GtVt$4P	w G G   M ȅuD$`_^][]À   r  Qt9t	@u   3jAj j f\$ j j C*PQj j 0  $}$ tc_^][]Ëst$        F8$<tvut$ ~   wt$ tF8$<tvut$    Ëf;F2sH  @ WVӋtfn4N N9NfyfYCF2G;|f^2\$F8L$$ F8   uF8F2T$ȉL$0fF4l$4t(N,t!yJlIxW tI	Bh CF,{"  G8$<  3O23ۉD$(L$t7	L$,PыVKD$(E@D$(ًL$,;|׋L$L$u	fG4   L$$P  D$33 f;L$0s{    L$,L$(SVЋuGFOl$(T$,fXf)F O 
F< tO8   D$l$(T$,(Cŋl$4;|\$K"33D$L$4~aV3ۉT$,    f|$0 vfD  RI;tD$ D D$u@D$D$T$,G;|t$ \$L$$Pua3f;C"}R3fVͅ~    RI;t#D$ D uFf<hF @ED$G@";|k_^][]̃SL$UVWx+D$   0u3֍JfD  Bu+с?l$uM   ݅t$ Otx:xuCFOxxx+uK<*_4*uBD$L$j   @0=@t 8|H\t_F^][D$_^]3[U    3ĉ$   ET$\D$0VWM|$L$,7t$$u     t$0  ufj_PD$X D$tIT$L$$j   ЃD$ _t'z+u!t$L$(VL$0tN   L$,D$$    t&   8N+   9         FM   tN   3D$    f;F"}hD$ D  VЋJ   $<uBABtF ;D$tuJN   L$F"AD$ ;ȋD$ L$|M  F   h mWs_^$   3C ]Ë   F/	F'h%W7_^$   3B ]BD$8t=ȍQAu+ʋT$8BPR6hlW _^$   3|B ]P6hlW _^$   3WB ]èu$6h4mW _^$   3/B ]  ֋ωFYV<D$4 t&D$$3ɉL$4@9tfD  @A9uL$4FD$   WD$xfD$HfD$PD$\    fD$lD$t    D$|    f$   f$   f$   f$   f$   f$   D$h   $   Ǆ$   @D$  HD$h;щD$D  |$@DD$L$@3҉D$XkuT$L$@:$ tVt	L$$tF    F`  33҉D$T$ f;F"m  3ɉL$    FD`t  Dfu3 ~+ t3V4t9}3TWD$x)D$@)D$PfD$lD$t    D$|    f$   f$   f$   f$   f$   f$   D$h   $   Ǆ$   @HD$h9N<  D$D  D|$@L$@D$X*tOL$$j j4D$t"j4j PX D$$ yfH"@   PFD$PT$ L$F"BT$ L$;|$ u(hTmW_^$   3C? ]D$~"3N3҉|$|$D$T$ |HV"~"RB؍<G|$|$fff     A	D$A D$ uD$T$ |$ ~I	3f~  j HMQfF(Ft    9u|$D$$    O  t|$)L$yt u@PuA%|$  Ol9Opj j j z   =3AGlGhz   D    D    D    D    F+mmDʺ\L$(hcDʃ|$, L$<  T$    tB$B   _^$   3= ]ËB,@D$@D$ @B,BtEAOlB\D$9Op$T$4RPjq   fD$ hD$<T$AGlGhD$ TT$4q   D   TD    GhOlT$~    ftt$0B(   GlD$(HL$9GpQj t$
   3T$OlD$ TT$
   D    TD    T$z$   T$,L$jAj1 Ѓ  J"3fN$fN"JNfB"BD$$   uBuD$T$,L$D$DD$@PD$DD$L    D$X    D$P    D$T    詤 D$ x$ P  Ol9Opj j t$D   6T$AGlT$D   TD    D    D    GT$@ G@    OlL$xW tIAL$(IL$HWlD$DD$(T$9Wpj j P   &D$6BT$GlT$(   TD    D    D    L$LD$PT$L$OlD$(9Opt$ T$PRa   2AGlT$TT$(TT$ a   TD    j ֋# Ol9OpD$    j @PjR;T$At$0GlT$ B   D   TD    D    OlT$9OpL$    APQj3t$0AGlT$ TB   D   TD    OlT$9Opj t$   j T$2AGlT$   D    TD    D    OlL$(xW tT$IAIT$L$(HOl9Op%j j jz   L$0o   AGlz   D   D    D    D    L$$-H} D$   uT$8   D$+L$8;tJt$Qt$0hmt$4L$T$4D$0qXt$4T$ q\PPD$8t$P@4hmQD$T$tL$$3T$JT$L$(@DQl @D$09QpPjt$<d   7BAlD$(T$4@hTT$0d   D   TD    FT$t-    u$D$$HL$AxH u1hnR;j Q6h0nt$4T$HPvD$,|$    }   N<VItL$$_^$   36 ]ËD$$_Ǉ       H :utP:Quu3uF<pH|$, u"~+ uD$d uD$8 +   F,$   _^3i6 ]UTS]VT$W\$D$    f    >|$~hTnV  uUj juu   |$   ~$   UD$O   PuO< tD$3@9t@G9uωt$,ɃBȉD$TBӋDD$PD$LL$0D$D$\3fD$DD$,D$Xhct$0D$40D$8D$< D$@    D$HM   K       rD$3L$j膦|$ UL$jG,GG+|$W u{      L$$D$(9;tȉL$$D$ +ȍP
tBRIuT$j j D$0   3HΉD$,D$,P|$tjӋ    r
U?Et	Ћ説_^[]USUVW}+   C8E47t    90tH@uE0  j #Hu4E00hTW   K8_^][]3K8_^][]ÍD$D$    PpQf D$tPhEWD$ ot	ЋyK8_^][]E"f~
3_^][]yu hxnWy   _^][]ËU,j }D$     L$O(Ƈ    p L$ OdL$$t$tF3ɉL$9~<D$4 > }!G(G(VtR B9  L$D$AHL$;|΋T$fE"ϋh  30  j@f4  h  _' Љh  D$$G(D$$T$Gdu3ɍrffM"fE$   Eut=Vu"V!! $ uT$J;uj@RՋ^$ T$#fB"fE"BBb	E3fB"BE"fE$   uBuu3T$j 0  t36  f4  D$      U<fJN{W t	Ջ落_^][]Vt$WT$yG@t@ H9quQ uG@ tD  H9q,uQ, u_^UQSVT$W~u9~tu@PuFT$FuF,^,ȈF   }hnVT$Ol9OpuSR   oU*AGlGhTU   \TD    Ft΅SESt$A@4hnV԰tF<s   F_^[]̃$ 3ĉD$D$,SUl$0VWD$   @АVhnD$Pj~T$$Srtt$D$UPShfWEF~L$,_^][3N/ $USVT$MW^L$$t$xD$|$ Nt\$L$u"9u
@PuFNtD$؉L$	   EMVTuʉVTu
>  MFPNȉFPt$~+uRKl9Kpj j j    3AClCh   D    D    D    D    L$\ t|$f֋w v u|$ t$Ft67hnt$67|$h0oWʮ}    ~+   3ҋCD$ 3t;sCtD  H,t;s;G@ut7S< t3ɋ@9t@A9uQ֋D$$떋\$t$~+   Sl69Spj j u   O6}BClCh||$   D    D    D    yW tV3ySlJChj V"D$ϋt$ EASl69Spj j u   6}BClCh||$   D    D    D    yW tV3PySlJChj Vw|$$@NlD8B9NpRjud   .]AFlFhd   \D   TD    L$At8FNt4vtD  Vz+u	L$6uA  D8f!HN_^[]̃SUVW(   D$    ZNt
x:xuGBNxxx+   u      tofJtx:xuGCJx`xx+tH
   UJtx:xuFGJxxx+uJ_^]3[ËD$H   t>C %    t1   u(    u|   ~	   t_^]   [_^][̃SUVT$W.l$}W      }[9D$$tD$Pt"3ɋX9SCt@A9u}[ɋ@T$ PD$p8؃D$$tu/:  D$΋P:  xT$_^][F0  K< tE39t@G9u{+uӋ  Eɺ	   ȹiPD$ QDj PA  9D$ t3҃U   4{+uC4   t9(t@u@@3҃U   3t$P3۞=  t$P	P3连!  Ӌt"3h|oVT$_^][%/  |$  C+t&<tH3hoVjT$_^][.  <u"3hoVDT$_^][.  ~ tNt ~t u@PuFNttqE   UTuUTu7  EPMEPl$ u3׋hdgT$S  UWӋl$ T$_^][!.  ̃0SڋUVW   2\$T$,t$ D$       l$HuHH"  t0} t*@t$D4hoRՋ_^][0    tE ;th pRs  \$D3L$s%4΅tD] ~9U    
ti    Au+́?A uы\$DL$ WVt.l$8QD$8  Vj U> D$$|$,E @0ED$4$   u   <rE<tAj jtƮЃt"W2KBJ  B  s3VR C HS|$BD$։T$8Eu>D$@"HE$D$|$H    ](l$,7-  @  3ɉL$~ȍW3]$t$$\$4D$(l$3m"~`L$Y40+@ ;uu\$4t$$;+xx+uBЋt$$G;}D$(볋\$4L$T$(D$@";}[|$,   r   2t9t	@uL$D$(AL$t$$\$4;L$8l$0T$8\$thpt$4Rl$<t$ Ջ   NfD  Fu+?   r  t9t	@uV7RQ D$DP0 փl$T$8]l$0D$L\$UEE EK<U8E;ut$ #\$ՋVtEhk0t$ \$l$Ht	Ӌ~tՋ_^][0j_^][0U,SVW\$CD$0|$,G(D$ @D$@G(K tB3ۃ9t    @C9uB   4D$j 0ʘ  t&@Dx	 tD$0Ӌ0jp'wu"9wtu@PuGl  Ex
D$(D$D$H,L$(Ћ;  W(D$$T$JO(t D$NlL$4@2D$9NpPj Rw   VhT$AAFlVhT$T$TT$TT$w   D    D    D$4yW tt$$T:yFlH| tjt$(ыyD$$tAAT$ jpt$4Sc  VlT$09Vpj j t$(#   D$06BFlD$T$  #   TD    D    D    GuG,W,ȈG   GtυT$j EȍD$8j Pj Rt$4T$0Ae  Nl9Npj t$   t$E6T$AFlD$ TT$   TD    D    T$4t*GҋHA<A8yRW) GI@@lD$0Nl@D$49Npj Pt$(&   6T$AFlT$ TT$4&   TD    D    NlT$L$4xW tIAL$0IL$4} H}NNl9Npj St$0   #.AFlT$(   T\D    D    Vl9VpSt$,q   t$$6|$BFlD$ ||$(||$,q   \D    yW tt$$p\$>yVlJ\$| tjt$(ыD$$tAAFl~}       MэfTVlT$$9Vpj j t$!   D$$2BFlT$!   TD    D    D    D$x6 %  VlT$09Vpj jj    ЃT$06|$,BFl   D    D   D    D    D$NlL$(@2D$49Npt$Rt$   "6AFl\$TT$\\$   TD    L$(xW uT$4DTt$   -  VlxW t
IP/L$0BITGtυEAFlD$(Nl9Np!t$   t$t$TT$(2T$AFlTT$TT$   TD    D$@8   uPNl9Npj j R   2|$,AFl   TD    D    D    Nl9Npj t$   t$$T$ 2T$AFlTT$   TD    D    Fl~   f||$,tG<s   GNl|$9Npj t$,$   W.T$(AFl$   |TD    D    VlxW tIL$$BIPNl9Npj j t$(z   2T$ AFlz   TD    D    D    Nl9Npj j t$$z   G2T$AFlz   TD    D    D    Nl9Npj j Wz   _^[]ÍAFlz   |D    D    D    _^[]QD$SUVW	   ׍   HT$D$RPtq蚛t@t$j V%2 L$FHF fn4FxΉFxFEfF2D$_^][YU   3ĉ$  D$$    ML$,ML$ML$HML$PVuL$3WD$L$TL$<L$@L$89H$     u
}(z  j k  L$$t~ u{@;||$4 D$D   H  D$T׋|$PVD$(  D$    ufT$4?  ~ uUt$(tQL$@<I;ADt$Dt$(9|$$Dt	<pupPD$hpP  t$(Ή$   ɃWf$   Bf$   f$   f$   ȉ$   B$   f$   f$   f$   D$   L$T$   3f$   $   $   $   $   D$4Ǆ$   p$   Ǆ$   0Ǆ$   Ǆ$    Ǆ$       f$   f$   $   !/D$4Pt)3ɋp9VFt    @A9uɋ΋t$(@PD$83ҋpȃL$ A  u$D$@@;A<t1hpWw=
  AtgIL$8t\A8$<tIuL$8FD$   D$   H< t$(t D$3t$(@9t@F9ut$(|$   L$\GD$0D$ 0t$t Z@ Jtx:xuFGJxxx+u0|$    u'|$4 t D$ 0hqt$ j0	  |$t$T$ B+<uh4qt$A	  <uhPqt$'  D$Tf  8pE  3΃PQL$貝D$,  VWPA L$8 YD$ ֋|$0hpѥt        D$    u.j ֋tVhtqWnt$,0  D$t$0ȋT$,6]tg}$ ut$,VhqW0t$,  Gt׋t$DL$(EBTuȉBTu#  谧D$,D$,  t$0D$,D$,o^D$,D$,  3JD$,    {  B   t	@AuQVhqWt$,H  |$    tFt$0   s^6i|$( QVD   j P9  D$ 3҃|$(L$,V0QύU   
  D$$   D$ H"@fLDD$u3NFu+?L$F5j Pmt=j4j W*+ ;fG"G4GtVt$ P? G G   D$׋芅|$$  M 3уED$L$L- ;   ~hph(XW$   |$$7~?WD  
9qu$ItyAu+ρ?D$<@D$<u͋|$$t$,ǃD$NFuD$8+?tH2   D$@PD$@fыL$@P{D$|$<xW   L$@AƉD$@FPt$0QW> L$\U(G8t$ O6ىwɉT$HȋD$ʃ|$X T$\O8@DGD$$ fG2   T$W$   $   fD$hfD$pD$|    f$   Ǆ$       Ǆ$       f$   f$   f$   f$   f$   f$   Ǆ$      Ǆ$   @H$   9N<L$`t$XT$`  D$d  D։D$xWG2w$D$X    ȋD$0@@LD$OD$   rD$$G(D$$    33ɉt$0f;  T$utqu@8uu ;L$ Wt$ )D$`$   D$$   )D$pf$    Ǆ$       Ǆ$       f$   f$   f$   f$   f$   f$   Ǆ$      Ǆ$   @HD$9N<   D$`$   D$d   DL$`D$xVL$t$0y$ 3  D$ t@    t@u8t@T$ ;     ( uD$$G(D$$    GfpT$ g8HH yD$ H P,T$ Dug8D t$0tO8   GfpD$ 8qu@Hu3V@ Fu+?|$@FVQW: >t$0D$@0x0
Q   t8 t@8 ut@8 uxu@D$    uOD$   QTD$MPWT$VM+  |$M utx uT$NL$WP:,     D$<T$@ <3|$<J|$OBȋGT$FG2t$0;BT$8(  33f;J2.  fBVRpщD$$ωD$Ha     fG4D$@   hqQ|$t$<tEv$WrV(t}VtF8tV t֋L$   z6  Ju  T$0GL$fPD$8O @ D$8O@
BG2T$0T$8FB2;GfpG @  D$    u۾Կ|$4 tSL$ w4A";|CO8 3A"D$@~1I L$ ;   3tOf;   @;|g8ߋT$D$ ;      pt$8   O2 F2f;   3҉T$L$@   F+ǉD$0 f8f;   L$<F I 4+;uDuRT$L$@Bt$8D$0T$;|CfID$@L$B;7xx+u@뜋T$t$8L$@|$<;   O2vt$8!T$D$    t$J        |$4 t(G   O,@t9H,u;   @uOW^   :&F6O6:t(<ttj hrt$ ~6uG6F6}(uF8D$HF8L$      G   	h4rR0h-h hhějռD$4@   N5  @tD$4+  B,rB,D$tBt*zt u@PuB6T$Bt" L$(Ed$DT$HBTD$DuȉBTu'  T$HL$(BPJȉBPVl9Vp j j j    ЃFhD$D=|$<BFlFhD$D    D    D    D    D    W,Nl9NpT$jRt$0   6T$(AFlD$D TT$   TD   D    } tLD$L$T      +Pz;HrAE|$T P%EPhPrt$$c3L$\Pt$ D$XD$(0D$ 7@4hdrt$0蟇T$lt	L$ۋ|$4    t$L$D$T$\H L$P@DAlBD$H9ApRjt$0d   v9|$(@AlD$HD$P@h||$<d   D   TD    j Q7hrt$$uT$<P6Nl9Np/j jj    T$DNlL$HxW tCIST$DA|$<Fl   D    D   D    D    뮍AO,IL$Ht$HT$D$4    ut      cD$ @GD$ xMBtx6tHBBu|$$D$Xt$t	Ћit	׋Q}T$4  D$,t	Ћ$  _^3 ]SV   WF2~f;r؋NA&fc}c   fQ&~$ ȍAЋDЍPGfhP1 N2C;w   ffG@V2;~~6 t	3fG_^[USVWt$T$zW      L$pP>؃\$uT9Eu(FPhrWL$ G
  _^[]ËV:  裗L$Gt
  _^[]C8t"j hrWL$ L
  _^[]ËK tD$3@9t@F9uCΉD$$	   D$L$@iPD$$ QDj PCy  D$$3t$ 03U
   y  _tGt&t u@PuGf؍Gt   ׅEи   T$ JTuJTuZ  T$ BPJL$BPD$0D$@4hsWD$(֋0h`g6T$OL$$@DQl @D$ 9QpPjVd   3BAlD$$T$ @hd   tD   TD    D$VP,D$SlT$$ D$9Spj j V   {h5BCl{hT$$   tD    D    D    yW t$t$3t$L$  _^[]ÅySlJj t$ ˍ9t$L$  _^[]UEL$MS VWD$؋ʋ ##u\u^3ËT$uL$RSwyt$;d  s^;\  r6wRr   wHǋD$WD    E _^[]ËL$;`  r6  ;wr;w븋L$QS׋uE _^[]̃SUVWL$u*Rjt	迈   W)3   ;d     ;\  rk   w}l$$D$@   M ED$L$t3PQAtf\$St$W, ; R;`  r6  ;wr;VQ׋m׋   3_^][3蛽3D$\$|   <rHtD<t@j jt蚇Àt#W 8M UHP  H  _^][VW   S39~"Un    U t2C;|][tN   tϋ_^;d  s2;\  rX  X  _^;`  rP  P  _^Ã= tFpKt
PHV$)xIIVpKtPP_^V_^̃SU)VW3T$~IY+@ ;uu_^][xx+u@G;}T$_^][̃SUVW|$ l$:D$;F   ¹   ȋڋǙȉL$ ځ|$   U |h   hXsUֺ3_^][Å|   v   3ۉL$  ;d  s2;\  rw&r@   w6;`  r6  ;wr ;vL$SU	iD$ F\$$J;|V   ƍ:+ӍB@ƍI@AH@HAX@XAh@hAx@x~   fր   u>ۍ,ƍPEj PJ ;}E4 @Hu_^][̃SU)VW  RjP3  jHFF   WP    F4ƋD$$   L$   @ȉD$3PQȃtt$t$W( D$ 8 oD$ {ȅ   H L$D$tq3PQotZl$Ut$W' / <_^][7j>׋   3_^][3ո<_^][ËD$ tTH L$D$t83PQʂt!l$Ut$W' / t3i3{ȸ3<_^][SUمt5W39} ~,Vu4> }C(C(Vt
R GH;} |^_][QSUVW  39+   sfVt~t}Vt}F tV8t}F tV8tqVtt	   uBuNFt
PW F    tV(F(t
PWJ^EH;+KtX   tӋ|_^][Y;d  s8;\  rX  X  _^][Y;`  rP  P  _^][YÃ= tLpKt
PHS$)xIISpKtPP_^][YS_^][YUSVuWD$u1t-~u9t ɺs|sDPhsSy"MQuȃL$uI~t"\$t	[t\$Utj 3_^[]Ë<   rjGȉD$t_Et8 uEEtHj jtxЃt)MWD$IBJ  B  MAD$tN	L$t83PQL$'؃tt$t$Sp# D$  3ۋʴ_̋EtG@   tO    u3GD$_^[]Ã~ tO   FGD$_^[]ËGD$_^[]SUVWtvt$^tk<u> u	__^][Ë.t<	3ӃPRK~t#SUV" 3 O7_^][3O7_^][SUVt$Wtj6؃uM _^][ËPFPCPP" M yKt_^@K,][̅tLD$ËT$t	lWtuV7~lNW,S2ۍ@ BRNBH
؅G, [tAH~,    uHHH,   fD  	@Iy^_USUVWT$j j hs/   l$ iK  wu"9wtu@PuGJ"  L$   39}   3fD  EDt@@t3	3҃	BNl9Npj RW   ')A3FlFhlll$   |T      t@Dx	 t      L$G;}VNl9Npj j j    _^][]ÍAFlFh   D    D    D    D    _^][]UQSVW3ۃsj s   Ej P^huwwu9wtu@PuGtRNl9Npj Sj   _^[]ÍAFlFh   D   \D    D    _^[]UET$SVWP  p D$t/3փPRTztVt$W > 3  su"9stu@PuC   D$    j W4#g   Vl9VpPPt$3ҋ3\$BFlFh    \D    D    D    FhyW tWa_^[]ÅyVlJ | tjWЋ_^[]Éx@_^[]Ë3u_^[]̃SVW7Fx uv    umD$h  j PV3؃thsW
_   _^[ËFL$j j HVduc{   _^[_^3[̃SڋUV3T$*W9u~_My tKt9+;uDuRT$Bt΅Eи   zTuzTuT$F;u|_^][xx+u@U$ET$SVPWL$T$pxt$$uD$    D$D$     ~( D$(    fD$,  t6D$htP茢J  33f;F2g  fD  FxBɋȅt;L$(;L$ rj$tL$0T$D$,   L$(ftuu3ʍq Au+΋u?D$(;D$ rQL$ؚtD$(+D$QRP L$(A;L$ rj8L$蟚D$L$(D.u3ˍQAu+ʁ?D$(;D$ rQӍL$YtD$(+D$QSP F2GT$;L$t#D$( |$$ vD$-uL$|$F8  T$$<  Dًru9rtu@PuBtT$D$uJtEBVlT$9Vpj PSF   }3BFlFhT$\\$F   \D    D    yW tW 2yVlJFh| utzBjW<Fl~   FhfT_^[]USVWT$MA fx&A41hTi7D$  1h(t7ΜD$
  w؅u9wtu@PuGD$uOtEGVl|$9Vpj PWF   /BFlFh||$F   |D    D    yW tS2yVlJFh| utZBjSFl~   FhfT_^[]̃SًL$UVx+WD$\$  h   @ tGE43   ]f;    E +    ;uw   \$D$H< t3@9t@F9uCtE   WTuWTuGPjGP0xx+u@fE4L$$G;7\$mL$$D$_^][̃SUVWT$3ۉ\$D$h9X~:u vt \$VS6u\$D$C\$;X|_^][USVW|$襏 0  u3ҋ`_^[]ËEt	8    OL$D$  3PRrq  t$t$W D$ 8 CT  j ׈D$_Ht+D$@t׋׋m_^[]Ë׋m|$EL$QPxD$?  D$3  H L$D$t43PQptt$t$ W D$ 8 3B   L$׋CɋȋPD$  itj Ћ׋Bl_^[]t$׋nnD$׋l|$ tPNt\$ɸ   EWTuډWTuGP΋T$jGP_^[]h4tV_^[]Ëk_^[]3]_^[]̃SU\$ VC4ȉl$}$ L$L$ K2WD$L$t
3_^][Ë} C8j t5D$(P#otqD$t$$FD$ fFD$$/D$$Pnt<D$t$ FD$(fFfFGTFFj ~P   ~
 rq   39|$vmC ,@u3@D$   yTÊPU  utx uL$UP  \$(DCNG;|$|l$}$ t*C8   u   C8E  u
Nj3_^][USVWj \$8D$jt	mftWfFW t.Ut\U   j褖 _^[]ËEFEFttD$[ D$tIL$3Ӄ	PR1mt,St$W} ; ߢEFƉ>_^[]3ŢEFƉ>_^[]ÊE3>F_^[]̃S\$D$UV(l$Wu
_^][ËD$      39~Aou + 
;uWuet$hdtt$蟡D$C;|Ƌl$\$$3@$   ;d  s\;\  r6   wLyxx+uB뉅uj j$t9k5;`  r6  ;w
r;w1VQ׋ldtWFF     }W t<StZsUȗ tgӋ͋}g_^][Ë͍@D~CfDPg_^][Ul$tTS\$W39} ~;VufD  VtbZ6S: VtfG;} |^_ˋ[]f]US]T$VW     j Ըp   9u   ˍQAu+ʁ?j AD$<Pt	ajctbD$<Pj V
 t$ F<FSPFFF(F,   V؃t"lӋf3_^[]Ë_^[]ÅtD$@_^[]ËG_^[]UT$SVuD$EW  u3t(j Ћ蹷ptD$4Est~ ωL$M     t$ti/  ȍQAu+j yW#iD$  W}WPi D$t$P  S   ЋT$(d}      j j(h      Wj PF׋fF jjfF^کN%  =  u~uFu%LtPCTP  S   Ѓ   fFu~ tN.dt$E   sL$tU~ ul3D$fD     j HtD$y ufL$G|3}W|$ htWܜG  _^[]ËEj Ћ諵paD$4NK_F    ^[]QSVW<IڅtAG +     ;uu_^[Yxx+u@Ջ$u_^3[YU~tSVWq   ~u3ǍP@u+%?ڋ׋]Vt
HP    IFI(   u_^[]USVڋW3\$T$|$u3ND  Fu+?  t$j ӉD$((]@tt;tuNɃ3x3+;Ӹ   U   EȋF;u	#VtA;L$ƋvNT$NǉT$ut$3}    tD$@   D$3ҹ   D$     xʋT$Ѕtu3D  ;tuB;x33r;]      E΃;u#t@]t$;ƋʋRNNϋt$u       38EE_^[]Ã}ڋL$F)j Ptyd]D$   N)Qj P%
 ǃH(H ECFPt$Q S tD  RxBuS L$$Sݲ;uL$_L$f3_^[]ÉC'_^[]U8VuWFND$F(F0    F,    )D$ )D$0F(    F4    (D$ fsf~ǅtaD  wtL~
 uFV3} t3L_Vt3>_Vt3>V33_?uuL$0蛮F    F    F    F    t$t!    VtBu3|f6uL$MuN8BFNFH    tF%  _fFN^]QSUVWt`~	 ~tF~
 uz4 u)j jT{[؃tjTj S
 _4G8`|~	 tFuw4j jT:[tjTj V
 ud_^][YÀ~L utF    F    F    F    F     F    F    F$    F0    F,    F(    F4    F@    F<    F8    FD    FM_^][YSVrWzt 3ҋH9qAt
f@B90uҋGPw3ҋ]Wtt	   uBudwtFG(t׋2 3ɅE_^[UVWNl9Npj j j S   蚯3AFlFhS   D    D    D    D    Nl9Npj jWT   I/AFlFhT   |D   D    D       ixW uUNtj jjj>_^]̃VWF+<u*F4t    9t@u@3ɋ 9H4.F  t}FA$Q D$t2  t t3ɅtQ6htW觔   _^Á    tԃ   u˃    u|   ~	   t   뫊F+|$ u<u6htWH   _^_3^U4SVWD$ x<L$\$ tC398t@F98uUtj j B=L$D$D$    	j jP^   jHGG   j P   +
 G4D    D    D$ D$u3IȍQD  Au+j AD$Pt	^+W؃tt$t$ SD _\$ CD$u3:ȍQAu+j APD$(]tt$ t$ V wuL$3h   uj j t$$W* ML$(L$D$$D$$PD$0    D$<    D$4    D$8    < tj֋G _^[]U   SىT$l3\$V3D$WWD$$    D$x    D$`    t$Xt$Dt$4t$pt$Lt$@fD$hD$\9s$S  B|$,@  9w8u@@t9p0t	    tG+3t$dD$D$#*j j h   ׋0 G+t$dD$D$#uj j ׋;  D$0    tD$0   ׋軞  ׋P  O< T$\t$8t!B3t$89tD  @F9ut$8B	   L$4j 7HD$/  L$t3ҋC(D$($   A4K(AK(GtABK(@u$   |$u   $   $      D$l$   D$h$   {CtD$Ht
D$||$P/8 u@PuC蒧KtL$||$PW  { u    ӅEи   T$<JTuJTuoT$<BPBPD$0B|$#u%t$(T$0j j u^D$8D$xD$$D$t$   UWf$   f$   f$   $   $   0  D$\H$3tp{ uj{x ud    u[C,OlS,T$`9Opj Rj G   谨3t$8AGlGhG   D    TD    D    |$ L$0T$,  }     z+  t*L$@Dx	 t2jrFT$8B   L$`D$LEJWlD$TL$d9WpPVQ   ܧЃD$Ph6\$dBGlGhtt$T\\$   tD    GhyW tT$LRs7yWlJ | T$LtjRЋ藳tP@D$,p  \$8@ OlF,D$d9Opj SP   Wh5\$dAGlWh\\$8   \D    D    F8$<u5D$,@t+OlxW tIIT$`Ev[\$  $   @   E3B   D$uzC,wlGpS,D$0    D$8   T$pt$<D$9j Rj K   6  AGhK   D    TD    D      JL$0tfA8$<tIuL$0C,wlI2L$8t$<PT$DC,C(D$4@C(GpL$D$9j Rt$<v   lD$2\$4AGh\\$v   TD    D    CˋT$0D$TD$Pt=T$T
yW tPBlBhT$PDTGpt$<D$D$(ˋT$t@Pt$j j j u ЃT$PG
  BD$hBD$TB2D$$   <tD$Hˋ EAB4T$tY9
j j t$0   VT$$6\$(AGh\\$   D    D    D    D$`tN9
j jPV   2T$`AGhV   TD   D    D    |$0 t_D$83ɘL$H~F\$,t$0 D$DPFHPt$0xL$TT$8AL$H;|͋\$t$<T$DT$cS,D$BS,T$9j Rt$0   3T$ 2AGht$(tt$<   TD    D    |$ K,   D$8$   L$\D$HFRPSȃL$XuL$P#* J  FPjQr
 T$dD$hL$(D x+ D$Tx+ D$t-yW u%Ght4V@f F    K8WhC8t$<D$LT$Z  D$0   Ћ	L$L$8QQD$P      L$@a   Pt$Pt$TyD$,L$h9"t$D   t$t$<谡Wh<\$4AWh\\$\\$D\\$   D    L$hT$xW    \$8DTeD$D$H   9j Rt$x   GhD$8\$pAGhD$    \TD    D    \$L$PA( T$|$#   3|$D$DuZD$L$D9j j j    蕠D$D1A   D    D    D    D    T$,D$xPD$(Pt$`t$4jjqJ  D$'<uIL$DD$hP;u<xW tL$hIH&D$Iы L$hHD$   D$,L$$x+<  D$X+D$(< *  D$L$h9#t$   t$Pt$,蔟T$=T$A\$$\\$L\\$\\$   D    L$hxW   DD$HA  |$0 D$L$@   ;!j j t$<#   T$D$@5T$A\$4#   \D    D    D    D$,\$x+u\9\$t$^   j t$<臞   AT$4TT$^   D    TD       9\$j t$   t$<+   AT$4TT$   TD    D    \;t$-   j t$x֝9T$pAD$ TT$-   D    TD    D$@D$@L$$T$,z+s  r4tD$\    9tvu L$|EȀ|$AuiL$<D$9j j t$0z   $5BD$T$( z   TD    D    D    D$|8 uC T$<D$
L$h9t$   jj 跜T$H=\$AD$ \\$   D    D   D    L$hxW u)y
IT$| t.jVЋ聨T$t$<~Z   fTItp@Ft$T{ $   jPt$Xt$($   Q$     $|$ t@OT$LҋA<A8yRL$T#   I@L$P#    |$0 D$ thT$@B;j Rt$<&   dT$   T$A\$@CT$4TT$\\$&   D    D    Z;j t$D   j  T$9T$A\$@\\$   D    D    D    6xW tIL$@FIp{ u{x u{p t-  D$`thtЋ$   t$Xt$      3\$\ˋT$tEt	Ћ&t	֋(G_^[]U$SVD$    W\$$|$K8sWK8   }$ t$L$T$,   ҍ~h   |$    DVlD$(9VpuQu薙D\$(BFlFh3]\\$\]\\$$f||D FhD$ |$xW uD$  DfEAj j ׋9t  uuuE(D$ t  D$     tMt$u9G	t3
 t
D$ #E PVҔ ȃtD$ AD$  uu|$ˋr  S,	D$ L$BD$G"@C,Ql9Qpj t$P   u`6BAlD$U@hTT$P   TD    D    3f;G"}Zt$3ۋT$  t3   t&ӋSL$APSu
mT$,G"C;|u\$$D$@lD$(tWt$u?	u9
 ut$E Pt$V {t ut$׋VL  uuD$(|$Wl;   |$,       DD$,9WpuЋt$uD\$,BGlGh3ftutt$tu\$$tuD    D xW uGhDfEAU(|$j j j t$ T$0j  D$0+p  Pj u׋u  L$ 3҃8UAlD$,9Apj Ru   D7u@AlD$,D$@htu   TD    D    { tt(f}uT$
yW t_WǠT$}$ tBl~   BhftuD$ xl;EtgJl9Jp,L$   j j P舕GBlBhD|럍ABlBhT$    TD    D    D    D$Hl~ @h   D$,    8U$ET$,fTj j t$׋j 辁  tS    ~u?~	u9~
 ut$E Pt$W' {t ut$֋W莄 v uT$\$ӋJA<A8ySɜ_^[]ËI@Bl_^[]UD$SV3ɉD$BXW\$u3ztG8$<tur)  UET$    } t	:    ;   ;E   t$D$(QL$Pjj u   F8T$tN2N4KlD$ 9KpPRu   苓2UAClChTT$TT$    TD    Cl~   ChfTT$$t.D$ҋXKA<A8yRY	I@Cl\$E΋T$v@T$E_^[]U$SVMW|$,FD$ty$ tmN8F8E@F4W$	L$(D$$tj j +"L$0؋D$,3ۀxW ujQSV芛D$4t	ӋF4    3	    E} D$tG8tG2G4ȉL$ u FuF,^,7ȈF   &V^ \$;+щF VF,XF,\$D$t;]ux$ t3D$3|$(  Ӊ|$$\$,T$t@xCf;xu
f   CxfuhET$$@F4C(TD$(tj j  D$(3xW ut$׋D$,t	׋|$F4    NRSPu)fCf<x |CT$Bl~8Bh|W<u$
yW uwW譛fG G    |$D$GD$$L$ T$D$|$;\$}tD$Pl9Pp<WQSa   aT$ uVt]F<sVȋÉ   F_^[]ËL$BAlD$T$ @ha   \T|D    ;V~V^ _^[]QL$S\$UAQWhA3BhLL$@?tUV   9t$~9fD  B?t/QdL$3ŋLF;t$|4t$^_][Y̋D$L$j j j@?(6UE    VfHt	@WfD$T$L$E    fptRQs~^]É   PfH^]UQEVQ?H   $tyuA*tq   tt3؋M   	fqtRP}^]É   QfA^]Å   %  =  uyuAubȄtWЄt#@ruH@Btu+jE    fHt+w^]ù   fH^]îUEV0Vʋ?      t"$tV t	xWWD$f/vWD$E0   fFtmvD$	   fFD$L$%  =  uD$       fF^]ËE    fHt	v^]ù   fH^]$tV$tvtT~ tNvȅR|sLu.   u&MtjjjA   	jB~^]ك WfD$T$L$E    fptRQg{^]É   PfH^]USVu3ɉL$WD$   D$$    Q?F\$@?D$&  <  tyuY(tA   tt3	蛈؋NAtyu	y|$5tQ   t
9|$|$+  PD$  |$u/|$   6EpȃL$3   |$   u3/Q%  =  uyuqt3	EHuL$;Q%  =  uyu	IL$t3ɉL$ӀȉD$   D$s  }   fp  Qs  6؃\$$tK%  =  u{usu]   Ått{u[+tK   tt3Ć؋Ep7ЃT$ :Jz%  =  u
?uBL$ T$ D$   |$ t?u	z|$=tJ   t
:|$%|$t3|$L$ D$L$   D$tT$;   8u`֋L$r;ustf:u't[B:GutNB:GutAB:Gt9T$L$|$D$D$    KFt$<D$t;w3*9\$~ 3    fHG   I^;/D$M   	fqtRP w   QfA\$$tfsu{ t"qKH4\$ tfsu{ tpK#4_^[]U,SVuW}@D$   ]   Q%  =  uyuQ   }Ѕ   OD$    L$KL$L$AxD$,D$PRD$(D$,    PL$,D$4    D$<    fD$@ dbD$0|$0t! |$, vD$5uL$ 
\D$$hjWЋ#_^[]U,SVW}D$,    OQ?  }uG@?  @?\$$t13to!ty t	oWfD$ t$ Ƌ7T$ȉL$uiFt~u	^\$ 9tN   t
ى\$ !L$ t
D$     蔂D$ 7       ^%  =  u~uv  {L$T$  3ۉ\$ 9|s3΄t+fD  A<r$<u AA$<tCu߉\$ }uqOA$tA9D$49trnT$4$ty tnT$4WfD$0|$0Ǚڋ'|s!D$,    E @@xڋT$L$g|sWD$ ȉL$T$T$j|sdڅ|sWfD$0\$4|$0WfD$T$L$T$L$*|tL$T$|t|$, t;T$,+ωL$ӉT$%|s\$,WfD$T$L$T$L$|$   > t*t$F<r$<u
FF$<t> uր> t*t$B<r$<u
BB$<t: u+ց   MjjR_^[]ËD$ T$,ыˉT$ T$;L$,|/9D$ v'\$,D$+څ?|sWfD$0|$0D$u"wM0jj W_^[]ËENj jjj@   t_^[]U8V3}W}uvOQ?G  $tA1D$4:tkT$4$t9qtkT$4WfD$0t$0~   3H?O?  t($tW (tk(WWf/L$0L$8#  f/  u3f/v
pXu  D$0   $VhuZu9u   fHt	i	   fHF   I3_^]Ë΍QAu+ʍT$8?jQh= tEpKt
PHV$)xIIVpKtPPVD$8D$0E0   fFt	i	   fFD$0D$8L$<%  =  uD$8 u   fF_^]UVW}A@x;U|*;v$j jjjNF   Dq3_^]WR)u0   fAtgh	   fAF   I{2_^]UQSVuWu3/Q%  =  uyuyt3	LuAtyuq)tQ   t1t3	{t^Mƙ RPD$t@~'+R$ "DBuD$MhpjV_^[]UQSVuWu3/Q%  =  uyuyt3	\tAtyuq)tQ   t1t3	ztRMƙ RP؃t6~+fRxBuMhpjV_^[]UVD$PjXL$T$|sډT$ ىL$E    fptQRl^]ÉH   fH^]UEVWA$t1Q tgfty tf|s   3ҋMRVtWVXMhpj V_^]UQEV   AP(@,fqtPR8k^]ÉA   fA^]UQEV   APh@lfqtPRj^]ÉA   fA^]UQEV   APp@tfqtPRj^]ÉA   fA^]̃SUVWD$    L$,t$|$iD$ Al$$D$<s
G؉|$L$X|$؋L$,G  ;\$ ~  ;\$0u!y u2L$X؅R  |$|$<   FЉt$   L$333IX؅  L$6Xȃ^uL$o#Xȃ]u;ٸ   L$D	Xȅ   ]tX-u-D$ <]t#ttL$W;r
;ظ   F3;ٸ   DL$Wȅu_^]A[;tyt$|$l$$L$,L$Wt$ЋL$,;|$ t,ʊx:xu   sL$,   p;u;|$tL$,Z_^]   [Ê<s
G؉|$L$V|$;\$ t;u"t;uύL$Vu_^]   [Åu
_^]3[ËD$0l$,;u} uLL$V؅tċ|$      |$ t~D$. $ "ÈD$,xD$-at$> z@ PU֍OD   F<r$<u
FF$<t> D$0u_^]   [È\$,D$- t$D$,PV
 ƃ8 	 t$0pUuuD$,PV
 ƃ8 u_^]   [Ët$<s
Ft$L$Ut$;ut$0֋Uit_^][38_^][̋T$L$j[hP,t$T$L$h$
UUS]V
WpCxA|$tyuA*tQ   tt3
tU;   ~%ujjjjC   h_^[]Ã}   J  Q%  =  uyuA{  lD$h  38txs$@ruH@tB8 u׃uJL$S;tO;uYL$D$3;؉L$L$D$DʈL$;u/T$)<ujjjjC   g_^[]_uu3/Q%  =  uyuyt3	kvt~Fȁ    u~uFu[ktNtJSt$ЋMغ   	@fQtj PId_^[]É   A    fA_^[]Vt$W|$FVBhWt<t7V_^̋L$j jj<̋L$,j jjUVW}Ou3/Q%  =  uyuqt3	jA$t91t] ty t	]WfD$|$VhEW]O_^]UESVW  Q%  =  uyuYd  i؅S     ,@ Jtx:xuFGJy3xx+sEt$u3ލK    Cu+ف?T$
ÅuJtYt!HtɊx:xuFGHT$xxx+ȅuFtT$}t$뀹   3WfD$T$L$E    fptRQua_^[]É   PfH_^[]UEVA$t11t[ ty t	[WfD$t$*w	3ҋMj jjV^]U0SUVWOы?He  $t"$tWb t	[WD$8$hLVL?  N4  F N"  jvT$@0YD$8f.D$8D  FtVtCD$0fF    F    F    $hluV!L_^][]$tW5t,Z%t t	HZWfD$0T$4D$0RPh7VK_^][]WǾOtu*tG   t?t3l}   A~    ^3Ʌ~+S)RDB)ADB;|fD{' }   fX'F_^][]Ë%  =  u uGPhtuVJ_^][]t3PhtuVJ_^][]òePhtuVJ_^][]ËN;Nrj8uC_^][]ËFNDNULL_^][]*D6UUVu@HxL$L$D$    D$D$    D$    fD$  T$t'D$ |$ vD$uL$CT$hjt$ |$ t@   fHt'WD$PV{^]ù   fHD$PV^^]UQEVtmQ%  =  uyuAuKdD$t<8 t7L$@KM   	fqtRP\^]É   QfA^]USVW߳   }   RP؃\$  3D$   @ MA$tQtVt1y t+V|r|%= v  D$    WfD$D$% =   sFb؋Ȁ?=   s@^>?=   s N^?,ꀈVN^D$@D$;\$+   ptX= tEpKt
PHS$)xIISpKtPPSMNj jjA   	jD]_^[]ËMhpjV_^[]Ëu   fHt	WT	   fHF   Ik_^[]UQSVuW6謹Atyuq)tQ   t1t3	g   M RPD$ЅtL~+DDBu׋M6hp T$jP_^[]UEA$tQtSty tT|sWf$$T$RPutPuR]U<S]VuW@D$8  Q%  =  uyuA  _D$,w  Qtyu	y|$<tA   t
9|$"|$t3|$2fD$N  Q%  =  uyuA  D_D$0  8 u6S_^[]ËNAtyuA)tQ   tT$t3eD$Nx  Q%  =  uyuAR  ^D$4?  NQtyu	qt$4tA   t 1t$t
D$    dD$GʉD$ QL$(P؃  t$+ƉD$D    ȉD$(L$l  @ L$,T$0ωD$@D$:  r;ust=:   t.A:B   tA:B   tA:B   t$D$;   L$ +ƙȋD$8L$ T$$L$<@xL$$ ;!  |
9D$<  D$(@D$(D$@u:D$ \$@D$ʙ+t$ L$$QV؃tWt$D$PD$ t$8PS
 D$ OL$(D$t$L$   GL$;|$D  D$(]   fHt	>O	   fHC   IRt$@  = t pKt
PHV$VaV_^[]ËMNj jjA   	jnW   = tMpKt
PHS$S)xIIpKtcPP_^[]S_^[]ÉL$t$+PD$0PP
 D$(M+ƋhpjP 莸_^[]U$SVuWQ?*  "  %  =  uyuA   ZD$  Atyu	Y\$9tQ   t
ډ\$!ډ\$t3ۉ\$Pa؉D$}u(   D$$    \$t$ T$  Nb  Q%  =  uyu	y|$$8  0ZD$$#  3τ  @ Ar$<ufAA$<tFu߅     MRPD$  ? 4t$   +3ۉA<r$<u    AA$<tC+Ɖ9 ủ\$ۋ\$T  \$T$t$ EL$@@D$,      ff     D$(       Ƌ+T$D$f8;wpL$r;us+  :u7  A:Bu&  A:Bu   A:B   T$L$D$\$(C\$(;u\$D$,      @ f     D$(       D$ |$+ǋT$D$;wj+ËD$rfD  ;
usL$tx:
u'tiH:Jut\H:JutO@:BtGT$L$D$\$(C\$(;{9L$\$+ˋ\$T$t$ L$gL$+ˋ\$L$|$$ t`t$tX= tEpKt
PHV$)xIIVpKtPPV\$T$MjjS2_^[]UQSVW}u3/Q%  =  uyuqt3	VED$    YS     u#jjjji@   Q_^[]Ã}u4Ot-Q%  =  uyuyu3V3   Ct
PHD$PWE  {W uu3ЋKt
QP   Et$jjjj@   Qt`= tMpKt
PHV$)xIIVpKtPP_^[]V_^[]UMSVqWf~ |    v];G?u3ҋG?     FV Au$t9Y9tH&ty t&HWfD$\$|$Ӌ& XF
F   SWNxVttfF_^[]ètXF_^[]è$tQ	˳ XF_^[]ètHXF_^[]WFX_^[]UMSVqWf~ |    ]v}C?u3ҋC?      FVur~ ulA$t9Y9tF&ty tFWfD$\$|$Ӌ谲 )~\^_^[]ËAt	\_^[]è$t Q	h (\_^[]ètF(\_^[]W\_^[]UVuFfx |3ҋ@   x    
x    x t#tjjjjF   \M^]Àx tg6    D$fFtDD$	   fFD$L$%  =  uD$ uD   fF^]ËHP   fptRQ+J^]É   PfH^]UVW}wf~ |3ҋ߽vt{VN|qtk述    ^ȋ7L$fFtCL$	   fFL$L$%  =  uD$ u   fF_^]UVuFfx |3ҋ0@t W6   D$fFt	C	   fFD$D$L$%  =  uD$ u   fF^]̋D$Hfy |   薼I|$ tD$ @?ttQ UVuFfx |3ҋ@@tPWfD$T$L$   fptRQH^]É   PfH^]̋D$Hfy |   ƻI|$ tD$ @?ttQ̋D$S\$U(W{f |(   mt$EO?uftCC_][f   CSVBhՋLCQϋp`^tx_]CC[Å~   fGt@E   EGf#fOtfE    f#3f;i @  fO_][=@G   t|@E   EGf#fOfE    f#3f; @  fO_][=Vt$Ffx |3ҋ@tfx t
PVѮ^VW|$wf~ |3ҋǹvt+f~ t
VW莮   fFu~ t	_^?_^UMSVW@?  }wf~ |$   BMD$vt$  }V@@xFuWtGN3   rw;Nr'Ѕ  fD  FJN,Fo  F   c  I  u3/Q%  =  uyuyt3	KMIAtyu	Y\$9tQ   t
ډ\$!ډ\$t3ۉ\$+R؉D$t4N;NrS׋})!tFS+ÉNWP販
 3ۉ\$FD$$;^u~  ~ |$p  ?FD$$I uPt$(   ~ F4  FtVt fF    F    F      ~ F D$Fu<   Ϛ uPW|$ tN3IL$~krPVFT$Q;w;s8%  yH@+ȃ;|AD$L$|$ ;}t$$C;|t$\$F~\D$8=AtyuA'tQ   tt3]PF]Fu3/Q%  =  uyuyt3	mIAtyuQ)tY   tt3	OЅt7N;NrR׋5'_^[]ÅtFR+NWPe
 _^[]W|$@?`  L$Vqf~ |$   \v7  t$Q%  =  uytusHAtyuy)tQ   t9t3	NVN JVt~9PAPQ
 ~F;|	F    N+PF9PQT
 ~ uu~ F    t`= tMpKt
PHW$)xIIWpKtPPF     ^_WF     ^_VW|$wf~ |3ҋvth֋&v tX= tEpKt
PHV$)xIIVpKt_^D$%PV_^UQVuNfy |3ҋbI   A<u#Nj jjjF   A^]<u5   fHt	9	   fHF   I%^]ËQtA Q3jjqM^]U3SUV$Wj ҋ   uD$(jjE萙tRHuG8uB    thdjV4   Nt@       Iujjju%tW_$tusCЃӋ\GG$        G`GG    G    G    oj jju賘tUHuJ8uE    thdjV&3   Nt           IujjjuEtW_$tusCЃӋ|GG$        G`GG    G    G    oj jjuӗ|$ uj j	xj躗	x_^][]U8VuW>G?u3ҋDG?   &  }G@D$8At$tQ	 tn7W$T$@7   \$8fFt	5	   fFD$8D$8L$<%  =  uD$8       fF_^]ËA$t1Q5t&6$ty t	C6WfD$8T$<t$8E    fHtRVE;_^]ù   0PfH_^]D$$ D$$ USVuW>G?u3ҋG?t	x  At$tQ	i t5WWD$f/7  }]   >G?u3ҋGD$?t	   D (Wf/L$   NAt$tQ	迠 	t5Wf/    ^D$- CD$@tu^x^D$3   fFt	S3	   fFD$D$L$%  =  uD$ u   fF_^[]D$XD$U8VW}7F?u3ҋF?t	   At$tQ	z t3WuF$@D$@T$@6   \$8fFt	62	   fFD$8D$8L$<%  =  uD$8 u   fF_^]U8VuW>G?u3ҋG?t	.  ~G?u3ҋYG?t	   At*$tQ	? D$8t2D$8	WD$8NAt$tQ	 tS2WuFD$D$H$@D$DT$D6   \$8fFt	0	   fFD$8D$8L$<%  =  uD$8 u   fF_^]UQEV0   fFtA0   fF^]UVW}7F?u3ҋF?tuyAt$tQ	 t1WWf/v3f/3ҋE    fptRQ5_^]É   PfH_^]Ã(SUVW|$<G(l$(щD$,3_T$$t$\$ L$uUE f      t$ȋEɋ+@ 
;u   Bxx+u5BՋt$Dt.
    j PD$  L$L$3ml$  E2;s  }6 i  }$ _  u9E8$<N  t~T$<$RA;|D$@(3_^][(3҉T$   EPf   D$(xO   t$8 t@8 utD  @8 upu@E     L$0+
;u[ui/3\$,@ +;uOu]t$tD$<L$0D$1\$ T$l$;tIBT$;7:xx+u$Bxx+u@G;|$ |뫋T$L$;ml$t	t$m|$<L$$    uw0h\xQx)L$4D$t		0_^]   [(U$SىT$VW\$su9stu@PuC@C(K8H} S8D$T$}OENlx9Npj RW0   B+AFlFh0   |TD    D    M3D$(y|$$   |$     U	fUNlB9Npj t$R2    B|$+AFlFh2   T|D    D    MD$(@D$(Y\$$;|\$|$$}  A  } }  CuC,{,ȈC   E	fUNlB9Npj WRQ   oA/\$AFlFhQ   T|D    D    VlT$(9Vpj j W   AD$(/BFlFh   |D    D    D    EM;ul}ufNl9NpWt$5   u@.UAFlFhTT$5   T|D    Fl~   FhfTT$ jpuRT$ -  Nl9NpWj t$   =@/T$AFlFh   TD    |D    Nl9Npj t$   j ?3T$AFlFh   D    TD    D    VlxW JtI+FhVlD$(JIȋxW tI	FhP  C<     C  u(CuC,C,D$?ȈC   D$*KS T$;+ωC KC,HǉL$C,ENlP,9Npt$ Rt$p   >3|$AFlFhTT$ ||$$p   TD    CˋUD$,D$(t2T$,
yW tPJIBlBhT$(DT   D$3ۉD$ EfEMANlD$,9NpT$ j RPP   =3T$,AFlFhTT$ P   TD    D    D$ C;|\$EM;S  }I  NlL$ AǉD$,3D$(        MfEMAL$(D$ E@<HE׋HMQЋEf;x |$ D9^pRt$04   W=+CFlFh\$,4   |\TD    ^l~Fh   fT^lD$(|$$@D$(;<\$ \$L$ 9Npj t$   j <3T$AFlFh   D    TD    D    UWQC+  `   Pj Wt$(?NlL$,9Np#t$   t$t$<T$$7T$AFlFhTT$TT$   TD    L$,xW uFhD|ut!C<s   C;{~{S MQ   @ %       9Ct   8C   {u@PuC8KtECWl9Wpj jh  F   
;3BGlGhF   D  D   D    D    yW tj E&yWlJGh| tjj FGl~u   GhfTc}~uCtECQNl9Npj WR   G:+AFlFh   T|D    D    NT$ҋA<A8yR>B	I@FlNl9Npj j t$z   9_^[]ËT$AFlFh_^[z   TD    D    D    ]USVWD$ j j5D$k3  j4j W$z
 UfG"G4G  G   f   f;S    sȋE@GFGN   t"8 t@8 ut@8 uD$uD$@ D$   N    Fu+?vrL$F5j P	؃tXj4j SKy
 qfC"C4CVt$P轍
 C K "  {C   _^[]ËEGGD_^[]UDSVWT$(3D$    D$wL$t$u9Gtu
APuG5D$} }\E^l\$P9^pj j R0   7D$/CFlFh0   TD    D    D    u3ۉ\$ 9^{  Et	@XUPuD$EtF$ȋɋ@ȉD$$u3NFu+?L$F5j P؃t=j4j Sw
 ;fC"C4CtVt$(P
 C C   j j4tdj4j VVw
 5fF"t^C%@ 	FD$tF@%@ 	Fz   9F~/Ph(WWqD$t	t	T$VҺ\$$uCD$\$ ;^3U;  }   B}     j D$ t
MH@Dt$(   L$j v4ٶ؃tEC,sfC j j4etdj4j V"v
 4fF"t^C%@ 	FT$ tVB%@ 	FF   9F~-Ph(WW=T$ tt	T$V蠹D$\$(L$0W\$4fD$8fD$@fD$H|$0ͤ$   j j j j j t$ Ӌ蜫 \$0EKlP9Kpd  j uR   N4x  E33L$$3f;p2  @4HVuD$(EҋHщD$,u3N    Fu+?L$F5j PD$tEj4j Pt
 L$fA"A4;AtVt$0P
 L$A A   j j4wthj4j V4t
 T$-fF"tVB%@ 	FD$ tF@%@ 	FT   9F~1Ph(WWK D$ t	西T$t薿T$,uy  q  CN%   =    t%   L$ =          L$    Ӌ֋3T$ Wt$ $L$,   Dj F4PU؃   j4j Ss
 fC"u%D$   C C   E	K   C4Cf 0 C      j j4D$tij4j Pr
 T$L$,fB",r	@ ZJJC%@ ʉBİ\$   9C~'Ph(WW\$EL$$UAL$$@2;ȋEj j43=j4j Vq
 fF"^CAClChTU   TD    D    t3 \$D$tL$ZD$t=SlJ;u
Kl_^[]ÅIȋxW tIP_^[]ËChT_^[]QWҋGD@D$   SUVp~+    v0   ^t;kuWUtTuW+ sWҽӋ^ F    t;kuW謽UtuW sW艽ӋF     vcD$ D$9^][_YUSVT$W>G % @   k  Ex+ ^  ^3҉T$u9Vtu
GPuF,؋EH<8j ).x    MI0  y uG %    uIu_^[]N8KlV8T$9Kpj Rj0   ./AClCh0   D   TD    D    T$j j j Qj Ɔ   Ћ?Ɔ    G %    $  Kly9KpPWPP0./AClCh0   D    |D    D    ~u9~tu@PuFy+NtEFWl9Wpj jh  F   -3BGlGhF   D  D   D    D    yW tj 28&yWlJGh| tjj Z9Gl~   GhfTT$t(KҋA<A8yR#5_^[]ËI@Cl_^[]̃BSU3ۉD$\$VW   E"J(T$L$ 	3L$   3ۋD$(< }E ;uZ|$, tSEt?+    ;uu_^]   [xx+u@DuL$E"F;|\$T$L$C\$L$;V_^]3[U4SىT$VW\$<3   D$t$F % @     z+   J< |$tF3|$9t@G9u|$Fϋz0L$8|$ D$0E  ED$$    D$,    D$(    t\
Gutt>39w)  O$E< } D$@ ;u} uF;w|  t$    Gt$0tЋxP3ҋ)D$  L$,QL$(QW_  D$,tȉD$ G$L$4D$4L$ 39w~pD  D$@ 9uD$h   tDD$$T$t	@pB t$ȋBɋ4ȋ^3ɃL$(L$ F;w|L$t$t*T$8@Dx	 t6ыj vuL$(C(Ett$(ыjPt$,Wt$8VjUtHCt˅EȋA|t ;Gut*;G utt$(jRt$,T$,Wt$8VT$,t$Q  !E  D$|$   ~W   $  su9stu@PuC&FlW@D$    D$,FpD$$   \$G$D$(f!UNlBЋD$$9j t$0R2   l(3|$ AFlFhTT$,2   TD    D    D$(CD$(;_|\$<D$$NlW9j jR   '/AFlFh   TDD    D    t$T$|$ xJ<8j &p      E|$D$,    D$0    tu֋Pr  ~ uD$@ %    u9Ctu	8CM  D$0PD$0PVdt|$ 2  |$W $    j jPD$0D$(   jHOG   j Q   g
 G4D    D    O GAC(L$,G4C(EtjPt$0VQt$,ML$DUtIjRt$039EVQt$,ˊD0D$'~ uD$<
t<tCt˅EAG    ׋|$TD$(|$t	ЋvP_^[]̃SUVW3|$@ % @     }+    ]0t4{~"S$f
~   u[uЋ|$M<U 8j $XtYj D$D$    PSՋuT$$t.z2t"R
f~   u|$[u_^][̃SUV@ % @  D$    D$    Wt4}+ u.D$uTM<U 8P#x u!}0 uD$    _39D$^ED$][_3D$   9D$^ED$][Ë}0\$ tu_3҅~aO$1< }E ;u|$  uD$B;|9M GutL$   DȉL$D$D$   u\$ M<U 8j "p4|$@ SW֋t~ u"D$   vu_39D$^ED$][_^]   [U    3ĉ$   ESVWT$@U3ɅD$<|$H7T$t$D
D$<u F %    5  L$lL$lx  p  D$\\$dPD$h\$`\$,ω\$\$<\$P\$$ڋT$DPS  3ɉL$P9K]
      D$\t[$D$dt	@HD$@@ ȋD$@ɋ@ȉD$DuD$$ȍQD  Au+ʁ?L$$D$\$` @D$Xu3؍KCu+ف?j j8Ή\$t9j4j Vb
 N4;NfF"fSfSAA F   L$C5j P؃\$0tEj4j SCb
 L$ fC";C4CtQt$\Pv
 L$ C C   D$$L$5j PD$\!؃\$,tEj4j Sa
 ;fC"K4D$0KtPt$HQDv
 CL$$ C   j j4؃tdj4j Sa
 T$8fC"tSB%@ 	CtsF%@ 	C襟   9C~-Ph(WWt	T$,tj j40tdj4j V`
 T$<5fF"tVB%@ 	Ft^C%@ 	F   9F~-Ph(WWt	fT$0tWT$u	t$y  q  BN%   =    t%   L$0=          L$0   \֋S3T$0Wt$0˸   Dj F4PЃT$   j4j R_
 T$$fB"u%D$0  B B   E	J   B4Bf 0 B      j j4؃tej4j S^_
 L$<fC"D$,s	@ CKK@%@ ˉC聝   9C~%Ph(WWxT$تϪ\$L$<-  L$j t$X ؃tAj4j S^
 t$0fC";C4CtVt$HP's
 C C   L$j j8t9j4j Vf^
 N4;NfF"fSfSAA F   j j4\D$,thj4j P^
 T$8fB"tZC%@ 	BtrF%@ 	B;   D$,9H~+Qh(WW.t	茩t	L$j t$X؃\$0tAj4j Sy]
 t$0fC";C4CtVt$HPq
 C C   L$j j8e؃t9j4j S"]
 K4;KfC"fSfSAA C   j j4tdj4j V\
 T$<fF"tVB%@ 	Ft^C%@ 	F   9F~-Ph(WWt	NT$0t?j j4؃tdj4j SA\
 -fC"D$,tC@%@ 	CtsF%@ 	Ce   9C~/Ph(WW\t	躧D$,t	詧T$ S轟L$@D$ D$<  <
`    |$j t$X؃tAj4j Sr[
 t$0fC";C4CtVt$HPo
 C C   j j8`t9j4j W[
 O4;OfG"fSfSAA G   L$Hj j4	tkj4j VZ
 fF"t^C%@ 	Ft~G%@ 	F|$H   9F   Ph(WW   t׋|$H:|$H   #   <	uLD$AD$`@`u9@ft0y+ u*I4t#9|TtL$j j Ũ4L$j j4tj4j VY
 F   fF"y\$8uI؉\$8P9S}V蝴D$8؅tl`pAAq|$X t8L$3PQmtt$t$\Vm
 D$  3sL$P\$At$L$P;KT$\t+0t$Pu3ލKfD  Cu+ف?|$  D$@ P<tD$3ɋ@9tfD  @A9ut$0ɋt$\$4FȉL$dtQAu+ʁ?L$hj jR{tSj4j V8X
 GN4NfF"M~MfAMAMAA F   F膲D$`3ҍD$0PD$hPCj jLD$,D$Lt$pED$`u   P/FF    F    F    GdGdF3fFD$FFu1PjPtqD$tjPj P%W
 D$(F D$F$F(    F,    F0    F4    F8    F<    F@    FD    FH    yW t3T$p;P  D$L    D$    L$3j 0  f4  CUPt$8  CUPj VlV
 N$A0NL$(ASt$TPj
 D$$\$tj jЋ3L$(T$8jAWL$,T$LAj萮L$,|$  A   j j4؃tfj4j SU
 fC"D$ ˉC@%@ 	C   9C~Ph(WWL$j j\$(HT$ F\$ 3ɋD$D$N\$|$0  t36  f4  D$t	ЋD$ t	ЋD$8t	Ћ苴D$LtjЋH  WuZt?~\$wSWtJwS!  vSȡ֋3_^[$   3;
 ]ÊD$T$<<t<
uu	L$(L$(L$(qҋL$@A<FA<FD$l0,F$   _^[33;
 ]QSUVWE @ % @   tgO<8j HptN\$ tt$$֋S8t*t$׋Vtj jt$$ЋW* vu_^][YUS]T$D$VuWxt5 ɋ@Dx	 t"}q6L$Pv.T$F   F$D$FwlD$9wpSPRU):UFGlGh3fTT$TT$T\D    D xW    GhT$DT_^[]ËvtF8$<tvuOlF,D$9OpSPRU:UAGlGh3fTT$TT$T\D    D D$֋ȋxRЅt/yW tR_^[]ËGlGhDT_^[]QSUVW~    F4n RPFu3_^][Y33f;F4sQ3 FxfxȋEɊDftN(L<A}A<C~CNGF4;|F F_^][YUSVW\$F   1  U   8QWtVClChDtClxW tIChPpx _Kl9KpRVWa   _^[]ÍAClCha   |tTD    _^[]ËKl~$9Kpj WR_   d+AClCh_   T|D    D    yW tV_^[]ËClChDt_^[]Ë~unD$F"@RPuL$_^[]333f;F"}$3ۋFD uD9AF"B;|\$9 x<9A~~N@ Fu+?tXEtVWj VP`   _^[]ËyW tW,_^[]ËClVWChIZ_^[]ËD$8u!@ fxT$ɋB@fDf	B3̃(SUVW|$<׋MS\$l$nG@t_UJlIxW tI	Bh`u-H9 t13D  GD u@t@A9 u_u@   33f;G"}$3ҋwD`t
   fDG"A;|ދÉ|$4D$ !D$$    D$(    E4D  33ۉD$D$<f;G"   3     wF      fF3fD$0Fft%+ uO4t9|Tt	L$!L  f!FD$0tΉL$<3D$   L$טD$PV  f!FL$<G"C;Vt.|$ '1\$hXYSVC4    _^][(ËD$@4    _^][(ËD$_^]X4[(̃SUl$3VWEt$   B   CtEBɋD@H   @   x+   fx"   wpt9n   6uj jUj jtAjȃt      qAt	xW u7GpD$wpFnG,G,FG,F_^][C$C  3_^][UQV~TqNl9Npj uR   
^]ÍAFlFh   TD    EA    A^]USUVWF~pD$D$$  oWhFT$uF,^,ȈF   D$HlQT$T$BD$ D$9HpRt$ J7   Q	9T$ABlT$ @hTT$TT$7   TD    E3jqpHwL$    h\tIL$X4XDQIH,   PPPHfH>tF:s   F?D$$_^][]U   V3T$\WD$L    3҉|$Ǆ$       D$H7D$4    D$t$   D$/D$xD$P$   D$|t$T9G$  $   ED$(t.@   t%9P4u HL$xΉPj  D$(    T$`Wt$<  N< T$t#D$T3҉T$@9t @B9uT$D$Tҋϋ@4к   j 6(P  F%~8 D$pu@@tx0 t	    tD$@    D$l    '$   Pj jv D$x$   D$@F+֋ψD$?$
  t$@֋oX
  GD$tD$h$   0t u@PuGD$D$h$   o
   u   |$( u|$l D$ tD$GtL$E   VTuʉVTu>L$FPȉFPD$F} u.D$(t&|$l uT$QuPE    L$t$ыtO,T$D$dAD$\B"@t$0G,z+u	F@t$0G,FuD$XD$@@  D$z  3F~F @A;|D$3t$$I  @"3   M    D$DLD$L$ @D$80+     
;u[uiD$D׋Mt$$|3ɋD$P;D$DȋD$L$@ ;EL$HB`L$HtK2L$hxQ  xx+uB녋T$GD$8D$8J";}	L$ Vt$$D$@";}|#t6t&|$p ut$$t$HD$ Ft$$;7}-D$D$`Vt$PhxVF  |$|$(   D$G,w,xlW9xp Rj V
   TD$thD$ 1PlhWD$  
   tD    TD    T$(38D$L$ED$X$   D$Ƅ$   $   Ǆ$       Ǆ$       @"$   $   Ph $   L$P  D$x$   T$Jl9Jpj j Vt$D   s6ABlD$  tt$D   D    D    D    F@ F@    VlxW tIBIǍD$  |$l PD$(@ D$$  L$AD$8u9Atu@PuA L$D$8T$xlz+uR4t 9tRuD$83Ҿ   ;~} @WD$tIGIƍD$8@hpu6L$9Hu;HD$;H   @t$@ ;H,   @uu	9P   D$F;||$t$$E"    t$F D$Hx9F`t3Px,FʃȋD$H`@IDD$HD$HyD$HFb  V"  N3D  bFIDƋu`  t$T$D$/B(JD$4@B(uB,z,B,B,)J   uB,B,J   NlD$9Npj t$(v   t$< 6T$4AFlD$  TT$$v   TD    D    L$vl$   t$D9qpj j R    6FAlD$ t$D    TD    D    D    D$Hl9HpT$PWt$(Ra   0 6T$ABlT$ T$PTT$$a   T|D    D$Hl9Hp L$   j Qt$<T$(:T$ABlT$ T$4TT$   TD    D    D$Hl9HpRWt$<   q6T$ABlD$ T$4 TT$   |TD    D$Hl9Hpj Vj    6T$ABlD$     D    tD    D    D$Pl xW tIBIƍD$  PtL$A<s   G|$L$zG<o   G]D$xW)$   )$   $   D$4t!0$   Љt$$2o  3t$$3D$@"+Ƌt$$;tVPD$hPhxW!L  Et ;tPVhyW*  D$TH$3ts umx ug    u^t$G,W,$   Nl9Npj Rj G   h/AFlFhG   D    TD    D    |$?tzT$$   PD$PPj jj jq9  L$lj    P D$|t`D$3ɋP~ G,G,|$|A|$B4G,R;|T$|G,G,U  L$A+<uh1h(yW}t$(T$`L$TY+D$xtL$TƜEtL$T6 ]  ֋t$Tjm  J  <uhXyWf딋t23~J    @;|D$`L$Lu$   H4D$XfD  > |$`~ |$F$N(V,t&T$`V8 #D$XL$L$   vu|$/    t$~l|$t9~pQj j t$<#   k$   Fl$   C  Dt	<pupPhpT$4GFlFh#   TD    D    D    Fl$      |$(    L$$   QlT$t9Qpj j V   Ѝ~hT$t9BAlyhT$ttt$   D    D    D    D$H$   xTT$PNl9Npj t$4RP   B.AFlTT$0P   TD    D    D$3|$X33ɉT$|$ f;p"t$L$8  	D  D$@ ;u]Nl9Npj j WL   T$(B  AFlFhL   |D    D    D    T$
  D$pDb  BT$ tO  @tD$@  t$cE   Ffu3$L$y+ t3q4t9}3tL$y t_Ǆ$          Ǆ$   Ǆ$   0f$   t֍$   A8f$    L$tWZ  9tj j ֋L$3W uD$ P0t	֋ |$   Et>3҅~"D  |$898|$ t
B;|;|7Ff3|$$ uFf3T$8+T$|$/ tZt$Nl9NpWRt$<^   T$(A  AFlFht$4^   tT|D    	  |$( thD$Pt$;D$XNl9Npj WRQ   KT$(   AFlFhQ   T|D    D       L$xtD$x    W֋|D$ ;tF  @ P   uQ   L$qNl9Npj PW|$,,AFlFh||$ 3ɉxfHHHHT$t$D$GL$8A|$ L$8@";o|$O8D$@G8D$8!  D$H"Au GuG,w,3ȈG   "Ww ;1+щG WG,pG,|$HypT$JlzlBpD$ 9&L$G   j VjD$thD$$  AhG   DtD    D    U  |$/ tZD$Hl9HpVWt$<^   I   T$ABlBhT$4^   T|tD       L$x|D$x    V׋zD$D;tltG  @ P   uQ   L$yOl9Opj VP6AGlGhtD    3@    fHL$DH@ D$HlxlpL$@D$ 9'L$3   j j VGT$thD$@T$$8T$AhT$$3   tD    D    D    D$ 9L$G   j Vj-AG   DtD    D    D$T$$L$D xW tIAL$@IL$DHD$ 9L$   j j VW=AT$$   tD    D    D    D$ D$ T$$D$V@$HD$@D$ 9D$@L$PRt$`P   V1AD$$|$X ||$@P   T|D    L$|$A`tQL$|$?tFыL$P'T$t$8uB"+IQRT$|jj j L$0A"@ut'G<s    G;G~Gw L$|$?h  y+T$u^Jl9JpL$K   j t$`j T$3t$\ABlBhK   D    tD    D    L$t$H  |$/    Jl9Jpqt$0L$^   Vt$<hT$0$   L$xl7pD$$y+   ;  L$j j R3   #T$thT$P&  ABlBhT$4TT$0^   tTD    y|$( jt$xt>yu
y+"   Ft$0֋.T$4;,tF  @ P   uQ   D$pNl9Npj t$4WAFlFhT$0|3ɉPfHHHHT$FhT$PT$0TT$P3   D    D    D    D$$9!T$dL$Rt$4T$TR   1AT$LTT$0TT$d   TD    D$T$PL$D xW t
IH~AIƍT$PL$DHaNL$D;j QL$R2   2T$th8T$Ft$0htt$D2   tD    D    t$$9L$   j j t$8  AT$0   TD       y+tz|$p usJlzlrpt$$9)T$dL$Rt$4T$TR   f      A   BhT$L   TT$0TT$dTD    dJlzlrpt$$9L$K   j t$4j 6ABhT$0K   D    TD    t$$D    3t$0T$hL$L$A`tT$XQL$L$y+,  q4tD$T@ 9tvuыL$W D$T$pH"D$$L$D9't$\   QL$j(ЃD$hhD$@@BD$T$DhD$@ TT$\TT$p   D   D    D$ xW u;yJD$@ | tL$jVt
p@F~Mѹ   DэD$@ fTt$΋FtEA   u|$<D$tj PD$TыL$Wu4Ǆ$       Pj t$x$   t$p$     T$@,L$j j t$dj |$p tD$    t3   T$PVt$j $   t$l$   t$d#%  t$|$8$   tZT$Jl9JpL$V   j jPl6ABlBh$   V   TD   D    D    |$l t+L$T$XWuA"+ЃRT$xQjj j T$׋JA<A8yW&wlI@rl|$|$/    9Op!j $   &   t$<Wh7AWh|$4|$   &   |D    D    L$t>yOD$ xW tIxD$9Hpj j t$<z      AT$4z   TD    D    D       |$(    9Opj $      j Wh;AWh$   ||$   D    D    D    L$t6yNxW tIp|$ ux up t$   L$hpyN9yu}ut$(}it$T׋D$|t	Ћ_^]̋D$8u*@ fxT$ȋB< |fJ3ËD$fH3U   E0VWD$`3ɉT$$   $   w$   $   L$x$   JD$dB"|$Ǆ$       Ǆ$       D$+ t$,D$xD$8    Ǆ$      4BD$8tF8$<tvut$8t$,D$8@2$      M L$p  33D$HD$@|$4L$3҉T$L+  D$3|$T     L$IωL$Dy  D$@ ;  A`t|$H u	D$4  }, t$,tu,< t$,}  |$pT$Lt%T$pT$Lu|$H ufy u    u   |$H tA  L$MUBЍGT$<  $\h~l|$09~pj j R3   D$0/GFlFh3   TD    D    D    D$DD$@@ft6L$y+ u,I4t%9|!TD$8tj j uD$83W D$DuT$<L$RT$DtrVlxW tIP2  L$0BIFhT  L$AtEAD$D0D$ 0hTit$p迾NlT$<D$D9NpRWh  E   I+AFlFhE   D  |TD    T$DyW tRFlFhDTFl~_   FhfTMNl9Npj u$R2   .AFlFhTU$2   TD    D    D$L$L|$TAL$L|$T;D$H|$4L$T$@ut?u;   D$HT$B`L$RUR8D$Lw|$T$L$pRT$4D$T     D$d@ %      EЉG4u   3ɉL$@9
\  BD$l  D$ Ǆ$          }, @t$,$   tnu,WǄ$       )$   $   t$,fք$   Ǆ$   `FtЍ$   "L$@T$4} f$   uf#D$lf  |$+ uE΋T$@PD$+D$$   H8H8L$0tL$dj j irL$83T$dD$DzW ujQPt$ T$Dt	L$d?ouXNl9Npj u$Wj q   U$AFlFh   D    TD    D       D$ L$   D$   AD$<u%9Atu@PuA$   L$D$<uAtEAL$<j Rj Wh  F   \D$PHl~@h$   fTNT$0ҋA<A8yR	I@FlT$4L$@D$ AL$@D$ ;
|$G4    T$M0D$D    D$l    BD$t    D$@J  9 u"A3ɄEL$`M0E   D$p#    3@GuL$dD$D   |$@$   j Pt軑D$t  $   j Pf!
 $   M03҉T$ 4t$0A    ? tXWtFD$3ɋ@t    ;t@Au<1 T$ u 1t$t֋Ƌt$0LBT$ T$ uD$3ɋt$,@t(|$t׋|$0    <9 uJ@AuT$|$D$dH @$$   % `   uD$`D$\        tez8 u@@tx0 t	    t
D$`    j j h   R D$`u?T$j j hu)D$\   j j D$h    EЃT$\teG,NlW,T$\9Npj Rj G   3AFlFht$,G   D    TD    D    O8G8D$x}   |$8   D$O8L$p8P*tDT$T}0 T$    M09 ty tIu$   t38QU   T$ ;M0tlNl$   9Np"j j j    T$,$   7AFlFht$,   D    D    D    D    D$L$puv:trx tl$    ubVl9Vpj j j    7BFlFht$,   D    D    D    D    B$   EtbNl9NpPWu5   )-UAFlFhTU5   |TD    Fl~   FhfTNl9Npu   Wu-UAFlFhTU   |TD    T$ B|  $ph|$\ T$   L$jjjAtj juEuuA$   L$8*BNl$9Np2j jt$dV   Ǆ$      Ǆ$        T$\AFlFhǄ$      Ǆ$      V   TD   D    D       z t&L$jj uAtuEAL$$&GǄ$         uU0L$j t$$. Nl9Npj u$   j @IU$AFlFh   D    TD    D       t$L$%N׋A<A8yW	I@Fl}0tq9$   thNl$   9Np!j j j    $      AFlFh   D    D    D    D       $       Nl$   9Npj j j    ($   3AFlFh   D    D    D    D    $   VlIxW t	IɋI$   Fh}0|$D tD$tH D$@3ɋT$xD$L$$T$Px  T$PU    <   tUσ9 t9AtIu$    $   t1;u-VlxW tI$   BIFhP|$G8H|$+ D$XG8uE΋T$@PD$+D$L$$x$    ENl9Npj Rj K   3AFlFht$,K   D    TD    D    EЉG4D$TD$P$D$0tj j gD$03xW ujt$\Wt$ KD$@t	׋dD$L$$@4    	EЉD$TE3҉T$4$   $   xD$|$H@4f;\  |$ T$<D$@PʃuyL$D$TT$<A4D$@(TD$0tj j gL$D$83xW ut$ ,D$4t	׋cD$|$ @4       tRD$@ ;tFL$誒UNlB9Npj WRQ   f|$ AFlFhQ   5Nl9Npj WuR   .UAFlFhR   D    D    |TD$GT$4D$<BT$4H4|$ ;D$$UNl9NpRWt$Pa   F/AFlFht$Htt$,a   |TD    } |$T$8t9;u5} u/NT$XҋA<A8yR!  I@Flt  G6u!NT$XҋA<A8yRK  L$pt   D$   D$<t38AE   D$<|$$        ;      D$dT$@ %    $   tDz8 uD$ @@t.x0 t(D$    uj j h   ߽ u\T$D$d@ % @  $   tz0 u=J<8j x u%NT$XҋA<A8R5
  Vl2$   T$L9Vp't$HD$(   t$\EPYЃT$LE$   BFlFhT$$Ut$,TT$XTT$HTT$L   D    xW uFhD|T$L$8;u
|$H|$hs$   T$u(BuB,z,|$hLȈB   |$h7Jz |$h;+$   B JB,x$   |$hB,L$8T$} u|$<  D$@   Nl9NpD$$   Ej WP+:T$$AU|$hFlFht$,   T|D    D    U.  Nl9NpRt$\5   WU.T$XAFlFhTU5   |TD    Fl     Fhf|  ;   33|$ f;A2   D$hD$4R43Ʌt"D$8@<xD$@ f;8t<A;|NlЉ$   9Np$|$4΋D$$EWRP^   Bʋ|$$A}$   FlFht$,||$4^   T|D    D$8GL$ T$A|$4@2L$ ;:L$8}   I2FlD$T4   D$0B8T$h$<DT$H3$   |$   D$8@ <D$   QTD$~PW$   BȀ|$~ L$4u ty uT$WQL$)D$4|$8L$ GHG2H;uD$XD$0D$T5   L$A}VlGD$ $   9VpT$TPt$4W|$,EBFlFht$,||$ L$T@    3fHL$0H$   @ HyW tT$4R8yVlJFh| T$4tjRЋ2tP@Fl~   FhfTD$8G|$ @2;vU|$<G   $ht$׋|$  D$$E|$ϋU0Pt$t$$5 |$Nl9Npj u$   j A  U$AFlFh   D    TD    D      ~l+|$L|$\ |$0tL$AtE$   A|$` tVtRNl9Npj j u   2UAFlFh   TD    D    D    UD$$L$PD$<9D$Pjj $   t$|RuT$<$   ,4$|$` tX} tRNl9Npj j u   2UAFlFh   TD    D    D    T$\G  Nl9Npj jRV   3|$0AFlFhV   TD   D    D    Vl$   9Vpj j j    \$   3BFlFh   D    D    D    D    NT$PҋA<A8yRD	I@FlD$H8P8D$T$Px$ tZNl9Npj R$   R2   6$   AFlFhTT$P2   TD    D       D$LȅyNlIxW tI	Fh xf~)$   <tU$   t$,EL$PPW$   Q$   Fl~Nhf$   fD|$0D$LO@|$0D$LYt$|$   VlxW t
IP"$   BIFhT|$Ǆ$      NT$XҋA<A8yR	I@FlL$h;L$Ht1$   ut!G<s   G;G~GO $      $      @t8 t
x    $   NlB9Npj Rj    6$   AFlFh   D    TD    D    VlxW tIBIǍFh3ɉP$   UL$$|$D t#D$l@ȉD$lL$$;L$@}.D$tȋH D$@A@D$@D$L$$t}0$   Vp   Nl9
j Pj    ~hVp<AFl~h$   tt$,   D    D    D    NlL$lxW t
IH#A$   IL$lH~h$      NlVp9
!j t$T   t$d+~hVp9AFl~ht$\tt$Ptt$,   D    D    |$8    EtqNl9
Pt$|5   uVp4AFlutt$xtutt$,5   D    Fl~   ftt$,Nl9
u   t$|uG0UAFlTT$xTU   TD    t$L$   0VpYNl9
j t$|   j Vp6AFlt$xtt$,   D    D    D    NT$PA<A8yt$PVpFlI@t$PL$A   uD$$I$L$lt$,$   Nl9
|$la   PW}GW'5$   AFl}G||$la   |TD    |$+ uT$j 艶E($   _^]×IIINJHTTTSRS____`_USډL$Vq3W{\$t$T$d  EML$-  $ tONlY9Npj SR2   /AFlFht$2   T\D    D    ] O8ۋ$<uD$@t	E$
tG2G4VlD$$D$ D$HL$ 9VpQPu   ~6BFlFhutt$tt$ tt$   D    xW uFhT$$DTFl~ӋFhfTET$@BT$E\$L$C   y t2M    EЀ} DȊ}  MD؋D$Nl9NpuRu   .AFlFh   TD    EAEAD$x u1yW tt$FlT$FhDTFl~ӋFhfT_^[]U$z+SVT$Wt$uE E 3_^[]ËJ< t3@9t@G9u]NL$y^(C} t	ut$Bu"} tu> t$tuRW螰1t7ɋ@Dx	 t }q2PraT$ L$Etr3D$$.  E@D$F8$T$,C<uD$@tEtE } tD$8    F,D$ AlD$(9ApWt$$RU@U@AlD$(D$@h3fTT$,TT$ T|D    D L$֋AD$,D$(t2T$,
yW tPBlBhT$(DTL$Al~UD$@hfTL$D$$v@D$D$$L$;Y(~Y(_^[]SUVWO2f9K2   fC4f;G4   C6:G6   33f;~   3퐋GpCf;p   fuC(3ɋW(jt(T*OucGK:uUC G ut;ыȅu,G2F;|W$3js$u
   _^][_^]3[U<3SVWڋ8\$ D$|$,L$<L$8L$09    E9H@  {+  }uf9K |K*MuE   p >  ~   x$   x0 }  x( s  x< i  x4 _  @U  @8I  @8=  Vt!39WGtD  @A9uɋFL$3Pv?m|$  G;CuG<;C<  w΋S3  +   K"f;O"  fC f;G      t     3D$(    f;-  3ɉL$4
fD  |$sfNfGf`f`f;=  ftwGfu3$L$y+ t3Q4t9}3TFfu3${+ t3K4u39}3DjP3  F:G  O   u38 t@8 ut@8 uH^   t:8 t	 @8 utD  @8 utQ  ыԥɅ8  Ft
G(  `   |$(    Ffu3$L$ y+ t3Q4t9}3TGfu3$L$y+ t3q4t9}3t3Ʌ3;   t/NB:utP:Quu3ui\$ t$(L$4Ft$(C"L$4;{   tyD  6 D$0ED$0D$ptfD  ֋uvu3_^[]ËF,;G,u#D$@<;C<uth  Ѓt̋   uKt$t^FD$Dt;u3~GX+qD$@0:u3jv9rD$DG;8D$@|͋\$ t$|$,G O$% @   t
{0 93,N<D$( tG3҃T$(9t@B9uT$(|$wt$@u9wtu@PuGFD$@Gt׋L$(Eи   zTuωzTuBL$USy(|$GD$@A(SL$ D$DAu	Q,BQ,ȈA   NlT$$9Npj Rj K   /AFlFhK   D    TD    D    L$AuA,A,ȈA   jqSuWD$$ԧD$8@  f{  }{ u|$0 uE      ~l9~pj j t$#   .3T$GFlFh#   TD    D    D    NlL$<9Npj j j    ֹD$<3AFlFh   D    D    D    D    VlxW tIBIǍFh|$PD$@  L$jpPt$0蠦VlT$89Vpj j W#   0D$8/BFlFh#   |D    D    D    f{    ~lT$9~pj Rt$   θT$$/\$GFlFh   \TD    D    D$,@   ^l9^pRj t$   k3T$CFlFhTT$   D    TD    t$ UL$ QVlxW tIۍBIÍFhPt$T$HL$ '   { uLD$,@uB~l9~pj t$   t$豷uT$GFlFh   T@~l9~pj t$   t$o3\$GFlFh   \T$D    D    TD$,@t`Nl9Npj j t$      ?T$AFlFh      TD    D    D       Nl9Np!t$   t$t$覶T$$3T$AFlFhTT$TT$   TD    Nl9NpRt$(   t$M3T$AFlFhTT$$TT$   TD    D$,@uKyW tt$ 0FlFh| L$ tjQPH@Fl~Fhf\Nl9Npj W|$&   W蒵1T$AFlFh|&   TD    D    Nl9Npj j Wz   C/AFlFhz   |D    D    D    Nl9Np   j j t$z   \$ |$CD$   D  D$0 tt$ ׋uut$@NlW,9Np   t$(Rt$p   脴   T$AFlFhz   TD    D    D    XU|$t$ɋ@Dx	 t3jsRT$(ʋ|$ɋ@Dx	 7L$ j wR\$AFlFhTT$(p   \TD    D$׋ȋXЅt*yW tRlClChDTT$ NlR,9NpuRt$q   B.\$AFlFhTUq   \TD    D$ȋT$ X}Ѕt*yW tRԽClChDTFl~   FhfTVlT$49Vpj j t$#   薲D$43BFlFhT$#   TD    D    D    D$,@   G43ۉD$Dt# t@D$DuC;|;   Nl9Npj j t$   T$3T$AFlFh   TD    D    D    Nl|$9Npj WR   蝱   AFlFh   T|D    D       D$\$0@tD$ ۊ@8$<   D\$0Nl|$9Npjt$(   W/T$$AFlFh   |TD   D    WNl9Npj t$(R   ʰ3|$AFlFhTT$$   TD    D    Fl~FhfT\$4NlS9Npj RW&   [/\$4AFlFh&   |TD    D    VlxW tIۍBIÍFhPNl9Npj j Wz   /AFlFhz   |D    D    D    Nl9Npj j t$z   蘯3T$AFlFhz   TD    D    D    D$ |$@D$ yL$8t&VlxW tIɍBIFhPL$T$tB<s   BL$$tB<s   B\$<   zp tvNl9Npj j j F   謮3AFlFhF   D    D    D    D    VlxW tIۍBIÍFhPNl9Np j j t$z   23_^[]ËT$AFlFhz   TD    D    D    3_^[]_^   []UM$SVW}3ۅu8Ga<vtL<t	<m<9u09Ph 9j苉h-h hhějm   _^[]ËGɾ%Et
PH_@9$  t3ҋϑGDfD  >   D$,3PD$,\$$PSh   j։\$8ω\$<  |$<D$"  ut$,؋}3\$(t$fWz
D$} I  dt*eD  |$( 9  E@ %    %  |$( uk   Mj \$$   PV]t$  3tj j ֋L$ F;||$dt$t$D$(     3ۉL$$9\$ p  3҉T$@tPHT$ Oxt   ;}xu3G   A@   GPQ%  =  uyuqt3	eW$yW uu3`G$@t
PPL$$4   @t
PHOxt   ;}xD$   A@   蒏P@?W$yW D$uu3t_G$@t
PP|$   L$$T$C(T$;\$ t$    \$ L$$VQSuUu~D$d3ۀ   \$r؉D$t$,3tfFFuD$t
MWuC}M]t$/      rz}Ӌω_@[$3t   rsL}\$t	֋VW uu3Ӌ!^EtstiW ؃uE@ˍQAu+j APD$4aStt$,SW}	 E8}u   ϋ։w@蝍     Gt
PP_^[]USVD$    щD$WT$$D$    2t$OGu]+t    B %    u#  hi訂   _^[]ËMyED$ 3    t$F(VЃD$f   3t$ hTiH  D$VP@(ЃD$= tEpKt
PHV$)xIIVpKtPPVD$ ^N  t$ t$PVF0Ћ؃  9Eu  \$u3NFu+?\ +  Fj PIQD$   sqli@te3_x</t	<\tyC   uQyL$ Jt#	x:xL$ uACL$ Jy3xx+хҹ         ET$
t*t$f.tt
x3CJBu܋L$yt$Qt$fyfDF0VL$,Ћ؃)  =    pKt
PHt$V$)xIIVpKt
PPhD$Pt$,Ӄ  =   W  ]tt$hyt$  =   pKt
PHV$)xIIVpKL  PP=  t$VHD$t$P@4Ѓ   _^[]Ë]ttL$ QAu+ʍ,      D$ t    @D$PWND$t(t$t$$hyPWEGt$PF,VЃt$F4VЋ\$  = tVpKt
PHS$)xIISpKM  PP   _^[]S   _^[]VD$t$P@4Ѓ   _^[]Ë\$$j    <   WTWj VK	    ~P   V	    tZP   L$      3_^[]Ët$3]ti,   D$9 t       _^[]ËD$PWMD$t)t$h  hyPW}Gt$PF,VЃ_^   []QVt$WFt
PHt$T$t$~W uu3ЋWFt
PP_^YUSVW_    8u3j@t
VHH3ɋH]T$tfD  9tA;r;uE   D$ u,L$Pt$OtHHAH   t
VP_^[]̀= VWu33j@3t
VHHBx/SHUl$9,tyDJH   ][t
VP_^    V8u3j@t
VHW=HtU= tBpKt
PHW$)xIIWpKtPPWH    H    _t
VP^̃SUVWT$|$tT$D$    蒒D$_^][ËME Eu+?3<;ugŁDtVt!HtɊx:xuFGHxxx+u|$ tv|$C|D$$_^][Ê_^][QSUVWFu-   膾xW u`Ktj jjj\_^][YYFt33<8xW uKtj jjj(u_^][YUQVj jOtMUPjPj jj H   Nl9Npj jjT   W^]ÍAFlFh^T   D   D   D    D    ]Sـ{U t0VsW{~"NOtS 8@_^[̃u3ËtQSUVW3B   f3+T$uu   ЋST$tOIˋٍOI;~_3;^]N[YQSUVL$W|$ < D؅tzl$XW    ~ t]V   ttN~ t~ Dȋ#5    PP4QUv hjt$0腞$XWvu_^][YUQSVWNl9Npj jjT   z3AFlFhT   D   D   D    D    ~lW9~pjRj1   &/GFlFh1   D   TD   D    Nl9Npj j j F   ֛_^[]ÍAFlFhF   D    D    D    D    _^[]U    3ĉ$   ESYD$ T$L$D$\$XVW}|$Pt\$8'yt u
@PuA؉\$`\$8  KlslCpt$@D$,9j jj   2ACh   D   D   D    D    D$T$$H,L$d   L$hQW_S|$<  T$L$TBD$LuL$J  T$D$h  H L$ D$$t43PQ!Ktt$ t$(Wj	 D$,8 3Ām  } tt$(ht$$swD$(tmH L$ D$$tI3PQL$JD$t2t$ t$(P	 T$(D$  AL$3D$.L$3ɉL$D$Px vD$L 3PQL$    WD$<|$ e7}  $   D$$   D$$   Ǆ$       D$X   ǀ      @t
PHT$0L$21 ȉL$ txy	 tAy
 u	ĝL$ AT$   T$$@@u
D$X   $   QjPB(ЋL$,D$XT$D$$  y	 tAu@D$@t
PPD$X   PuxW u$   KtjjjjF$   D$8   P   D$09j jjT   贗2AChT   D   D   D    D    $   D$8th= tUpKtQHD$<P$)xIIt$8pKtPPw  Pf     $   tuPhEt$ }$   tX= tEpKt
PHV$)xIIVpKtPPVD$׋\$X@$X  ȋ׉L$\  AtL$|$e    L$\AutT$uыL$\T$AH*"P  $   T$<Љ   t"L$T@Dx	 t   Љ   D$u4D$d	   Qh4˃ 藟L$D׉HH@|0  T$ D$     T$ T$8y   u
D$8ډT$8L$AtEȸ   L$QTL$<L$uD$<QTu	L$APT$<ЉAPD$,9t$8VjRd   ܔ.ACht$8d   TD   tD    L$LApPQIRPa  D$Lpu4tFˋ@$RP  3˙RP  L$T$ D$     Ɔ\$΋T$ j j Sd`Gm  D$LL$Dpt$$t5L${uHL$   j 3ɃL$DD$P|$x    |$   D$|$x    3҉|$|$D3ۉT$(@ttK~	 tF~
 uzT$(F  f!H    Nf	A~	 tFu)T$(D$CT$(;X|\$`t$$|$Du3T~	 tF~
 uxF  f!H    Nf	AFx~	 tFu誗j WT$L$?T$t	L$?$   _^[3O	 ]ËL$Wf$   AtEȸ   L$QTL$<uD$ʉPTuD$d T$XxpuID$,9j R      ACht$<tt$@TSh   D       D$tG$   /u5$   $   |!r|,v%Ǆ$       Wf$   $   D$,9!Rt$\   t$DDT$Dh<ACh\$<D$$ \\$X\\$`TT$$   D    D$,9j jt$`T   ސ;AT$XTT   D   D    D    |$tzG|$+D$D$$ 
;uu   Sxx+uD$$BыT$+fD  
;uuxx+uBڃD$Px ueD$uHY      9P~G    @D8@ x!x u   t~+tHD$D$D$B;P|t$@HYD$L@@ x!x u   tz+tHL$L$HGDº   PwD$09j jjT   8AChT   D   D   D    D    \u-|$T$H|$P    D$<    G      ʍQ Au+ʉ|$?3L$$D$Ht4tt|$хt!Jtx:xuGFJx#xx+tD$HL$$@뙋T$H   D$@ %    -|$PD$p   L$(@|    ;t$<t
          t@Dx	 t      L$@D$,998#RjV   蒍8fGCh   tD   TD    L$(T$H|$PD$L$(5L$@D$,9BD$L$   @@0$   t8L$$   `~$   |$   s$   |#r         tBJ      D$L@D$(u_P	t@x
 umD$(P	p~ u338NAL$$t@uj V_}Y|$+L$L$$@ <
;u	u   xx+uL$$BӋT$+ʉL$$@ <
;uu    ~   xx+uL$$B΋T$+ʉL$$<
;uu   @xx+uL$$BыL$T$ D$     }D$ 3҃GL$ЉD$8AZL$(胾^|$8t	L6   Qh,ՔT$DNH0OPPPTH\   Љ   L$T@Dx	    L$ЋT$   ~7T$D$     tL$T$ |tT$ T$(D$(L$AtEȸ   L$QTL$<L$uD$<QTu	L$APT$<ЋT$(APD$,9j jRG   ʉChD$D4AChD$D G   TD   D    D    D$,T$89!j j t$D=   hT$PD$89\$<BT$D\\$`=   D    D    D    D$,9j j jT   T$P5\$`AT   D   D    D    D    D$,9j jjV   謈T$P5\$`AV   D   DD    D    D$,9j t$<1   jPT$D1AT$81   D   TD    D    6xW tI׉pdҍFI׍D$D tEuD$Lˋ@@PRP#L$T$ D$     7z\$LD$ KAPSKRP[uDD$@  uRPD$L3ҋHRP\$T$ D$    yt$ tD$L֋H   P\$K S$t K ˉS$9߉K ˉS$"|$  L$$   x$    %|
$    s$   $   T$Pt$z u$   $   F0N4N|$L$8   ى|$Fttq;L$<tz ue~	 $   N$   D$$L$htF~
 u
D$$L$h	      $~	 tFu輊L$8T$Pt$IL$8p\$`t$F   Ǆ$   Ǆ$   t
PHT$0 tm~	 tF~
 ucFL$   L$$@@uy$   RjPA(ЃL$D$$  ~	 tFuD$@t
PPu$   $   T$D$@$xut$FVRP׋
|$,0<wك0w<{    >;uu   Vxx+uJBFҋT$+    4:;u	uXxx+uB3ۋT$2FV;FFHt"~U t5y u/蘱F@    g5T$L$^V0T$hRiT$L$0T$= tj@t
PH|$ uxHo  P   WD$09j jjT   ;  AChT   D   D   D    D      \$; t)D$L$$QjS P@ Ѓj  9D$$`  D$xVwBT$2FHt2~U ty uLF@    4hRh5HtX= tEpKt
PHV$)xIIVpKtPPV; tShE)\H
H    = j@PP= tj@t
PH|$ u
H%\$; thD$L$$QjS P@ Ѓu9D$$uGht$yg= tj@t
PPL$.T$x5HtX= tEpKt
PHV$)xIIVpKtPPV; tShEZHH    u"D$L@ RP\${U uht$tf|$<L$3j@   DL$LAA	QuhыD$T$\H @$#J#Bt3ɸ   QPWf$   $   $   QPT$AID$(zU L$8u%L$8D$(L$   j T$J R$L$$T$htD$L$(T$8H P$nT$(ʋ\$#L$$D$8#D$hK ˋ\$`A$   u|$8 uǁ      ǁ      # tL$1fu	L$^0D$,9%j j j    ~L$vACh   D    D    D    D    L$4|$ t$0֋L$豶L$   Vt$ +t$DׅbND$4    L$ |$t|$A8$<tIuL$ L$d   L$wqF"3ɋ~3҉L$8f;T$\D$(    G3؉\$h\$`bt,BBu	D$4C  G t   @ u30L$    t#D$(;|I;D$8tB;~\$`Gfu3(L$Dy+ t3I4u39}3Dst	@D$XD$X    L$\D$xAAuD$x D$htAD$$Au+L$$@Gt	D/%VRt$`D$4   T$4    PD$H+D$DQ7P$   jS~$   (L$8D$DAL$8@"t$(;yT$L$)T$kL$dt$0   L$jT$D$X    |$z #|$3D$H    ft!B  wc  T$BTr  fD  BNt$hk  Hfy" t uV  1ht$TD$$   j L$$D$$    QL$j j jQ  t$4   >u4hPNjVh-hZP hhějVt$0t$uGt
PH    |	    v	֋   D$(    rMD$("W T$(ut/f D$D$|$HT$$L$M't$hD$xW t(h8  _`D$  @   D$@Trt$8J  D$fvt!  a  F+<u
D$4hc&<u
D$4LlF   \DȉL$4   D$(t| Z Jtx:xuFGJxxx+u:t$('QNaui"iN`ui
t$(t$(|$HL$8QJPB"QPD$t$@V@4h jSz$D$t$86t$8t$0D$XT$@D$X|$H;BD$ׅt$0L$'D$8|$udt$0L$Pt$ %ׅ@@D$8T$t|$G8$<tuT$|$8O|$8W tD$3ɋ@9tfD  @A9uT$\BBtG4   	G2   D$4D$dT$GD$$BtEи   T$RTuD$ʉPTuC3҉T$(f9T$4fGPȉL$hfy3D$$ɋ@ȋL$hPQRh(jSxL$tAAt-G2L$(;PG 4GPh0jSxD$dD$,9j RjT   v2ACht$@T   D   TD    D    T$(L$4BT$(;T$L$`#T$D$ׅt$0L$ׅV< |$t#D$3ɉ|$@9t|$ @A9uD$d|$    GtE   WTuʉWTu袭v3Ǆ$   8Ǆ$   <Ǆ$   z@ 39F$PF8   38F6P6Wh@jS!wv GuƋT$L$I"T$D$d3T$|$    9rv3ɉ|$L$ RD
t1@ x tԼ   P4
VhHjSvL$8T$FL$ ;r|D$d3ɉL$     D$  |$F0QhLjSLvL$46AL$ uD$L$d|$@   ID$(L$ 1t%    Pj֋v$D$(uL$ L$ TJ|ƋT$  TVPj 6D$(u4D$dT$      ׅ|$FphXWjSlu6u|$D  6hXWjSAu|D$ׅt$0L$D$$ׅx+ p0P< |$4t#D$3ɉ|$4@9t|$4 @A9uD$d3ҋ|$T$(    GtE   |$TuD$ωxTu蔪3f39~   V$T$ Fw#$<(4<HFw#$L(4<HhPPD$,Qr
@4vWt$DhXjSsT$LG,T$ ;~ST$(vBT$(-T$4L$T$/T$d|$HT$L$PL$TD$\BDH|$D$|$tt$03ҋPT$3A	L$XD$T  x+ }  x0 s  H< tB39t@F9uB׉L$ ΉD$0GtEи   zT  zT  躨|$TL$dG"D$\;~L$3jpWV]T$\7qO0L$(   D$t  ff     Qt$0L$0R  D$D    t,D$D$ IDx	 t7L$j wL$D$Dj Pt$0D*\D$Du[T$tL$jpWV0]   D$L$ |$T @Dx	 7L$j wnx,L$@D$,9T$tVWRp   ro*BChT$tp   T|tD    D$ȋT$Dx豰Ѕt*yW tRzGlGhDTL$(D$t@D$tIL$(uL$9A(}A(t$@D$,T$49j j j #   nD$4{h4B{h#   D    D    D    D    D$TD$<   @0D$L  ff     t$0PL$D$$D$D    D$(    tL$(QL$HQt$TL$$L(D$T$LL$dH8x8BD$\|$H;~J3D$    t$\$T$8     |$HL$(u ˋT$TVPj BT$LD$,
9j WV2   }m{h0A{hT$H2   tTD    D    L$LFD$ T$8@D$ IT$8;at$@{hT$D   QQL$\`   PD$Tj pt$lpD$`@D$$D$,9t$\   t$Lt$Dl5Bt$<tt$Htt$\tt$@   D    xW    T$$DT   |$$    D$,Q9t$\Rt$D   (l1\$<ATT$\\\$`   TD    D$,9j t$L   j k1T$HA   D    TD    D    T$TD$,B u2;D$P   j @Pj rkhA   0;D$PK   j @Pj @k6AK   T$P\$`BD    D    TD    D$<HPD$PpD$XhdPSlD$@9j jt$XT   j1T$PAT   TD   D    D    KT$HҋA<A8yRrI@T$(t	L$gD$LD$<@D$LD$,T$4B9j Rj &    j1\$`A&   D    TD    D    xW tIL$4BIL$XPT$.L$   j eL$3҃bD$|    xD$oD$P8 D$<DD$<D$d    d   D$(D$4t`L$T$4[tD$4D$(Cd   8D$<xȋD$ɋ@3L$3Pt$ x$   D$4D$(PD$,9j jRG   hChD$$8At$@ChD$$ G   TD   D    D    D$D$H    |$x {  |$3ɋD$<x;U  L$ыAtL$HEи   zTuωzTu L$HD$3ɉ$   @DD$X@D$   T$|ًxt;u+GAE3ҋȋGt	@ABuD$ ;OڋT$| D$ u\$D\$`  Aj DL$   Po  39T$|t   G    D$X@D$4tSL$DL$D    |$| Ht9L$|u*AuABD$4ItA,BIuD$4 D$4uD$dD$D;NȋD$dD$@ @    D$,L$h9!jRj   fT$DhT$0?At$@ChD$0 TSh   D   D   D    D$hyW tW2q.yH| tjWЋ[rx@~L$HэD$0 fTD$,>98j j j2   e5GD$0 2   D   D    D    D    T$$   B4hhR>D$4D$,9j jj u   ]e9BD$0t$@ u   D    D   D    D    yW tT$4Ro:yJD$0T$4 | tjRЋqtP@D$,9jjjo   d5AD$0 o   D   D   D   D    xW t|$0IBIǋ|$0PD$X@D$h2  @D$LǄ$       D$tx+   L$|t;  @u
D$X    #HL$XtA8$<tIuD$LL$X$   QL$`QL$ j jj jp负D$D9j jj G   c1AG   D    D   D    D    |$LtnT$@   D$,
9j Vj G    cT$L5\$`AD$0 G   D    tD    D    Fut$@D$,9j j t$d#   b|$<5|$0AT$\#   TD    D    D    D$,T$x9j jjV   ZbD$x1BV   D   D   D    D    |$oqtqD$LP$D$,J9jRt$d^   a1\$\A\\$`^   TD   D    ~   fT|$L33L$PWT$Tf;G"=  D$4 D$L|$ @ ;  Gu  tD$H8@8D$DD$D    T$LjQt$d[6nT$08^u~   f||$ G  D$,L$p9j j j3   `D$p1A3   D   D    D    D    7D$P0ht$9D$<9j jj u   a`9BD$0t$@ u   D    D   D    D    yW tWjT$4:yJT$0| tjWЋlT$8tx@|$T |$ t`G$<tWD$,9T$Dj Rj    _:AT$D   D    TD    D    xW tIL$pBID$0 PD$L@     G  g D$,L$p9Rj j   ^D$p5\$`AD$0    D   D    TD    T$LL$4B4G24D/ht$ 7D$@9j jj u   W^9BD$0t$@ u   D    D   D    D    yW tWh6yJD$0 | tjWЋjtx@KT$DҋA<A8yReI@xW tIL$pBID$0 PL$PT$T|$LAD$4L$PG";ȋD$4W  L$A %      P4L$ЉT$ yW   D$L$x8O|$pGA8D$4D$\@A42N~:\$p<   <@ j S7QeL$(N\$`|$pT$ jt$8rQ`K׋A<A8yWdt$Dt$@I@D$@4    D$L0ht$5D$89j jj u   .\9BD$0t$@ u   D    D   D    D    yW tWf6yJD$0 | tjWЋgtx@KT$4ҋA<A8yRcI@L$|$LT$ t|$oq  |$T  $      +ȉD$PL$ L$I8A8D$p9|$X  t$t$   $   Pj j t$pT$8T$PD$tD$,$   9j jRV   Z5|$TAD$0 V   TD   D    D    G4>D$4D$,98 t$tT$tRt$X   ^Z5T$PGD$0 TT$pTT$t   TD    xW uD$0T$4 DTh́   [D$09jjjo   Y5AD$0 o   D   D   D   D    hԁ   ZD$09jjjo   jY5AD$0 o   D   D   D   D    D$T   0>ZD$pD$,9jjjo   X5AD$0 o   D   D   D   D    D$4yW tIBIǍD$0 QL$Ty6   D$3H8@8D$D3f;A2   t$tAxxD$Lɋ@DuWT$@D$,
9j t$H2   V$X1AD$0T$D 2   tTD    D    L$TGFA2;|t$@D$,>98j j t$X&   W5T$PGD$0 &   TD    D    D    D$,9j t$H   j dW5T$DAD$0    D    TD    D    xW tIBIǍD$0 PD$Tx2D$,9t$t(   t$Ht$XV9BD$0t$P tt$Dtt$ttt$@(   D    xW uD$0 D|h   WD$0T$p9j Rj    KV1AD$0    D    TD    D    KT$DҋA<A8yR<^I@L$4yJxW tID$0 $   Pt(D$֋PJA<A8yV]	I@Bl|$TL$D$Pt$@|$THD$,9j t$|&   t$dRU|$<5|$0AT$\TT$x&   TD    D    L$xIxW tIɋID$x|$oq  h   UD$Px  L$X   D$4;  $   ЋD$,9j jRb   ~T5\$`AD$0 b   TD   D    D    D$,690jj t$<5   &T9T$@FD$0T$4 5   TD    D   D    T$@~   D$0 fT7   TT$DD$,
9jjjo   S5AD$0 o   D   D   D   D    跶D$@xW tIBIƍD$0 t$@L$XPD$4@D$4bD$h|$0 D$hL$HD$<|$AL$H;OQh   \Ѓt3   B)+D$(BB8(EBeJtT$$ShxW IuHտ|$   L$=!  D$ @T`thP   SSD$09j jjT   R邿AChT   D   D   D    D    IT$B@&5`׉T$`   |$fD  T$+
;      K   t$EЉ$   F  j @PMVT@zPHt$   T$N3t$htt$ J7T$ L$
T$ixx+uB?s+뭋AT$<D$$   Љ   t&T$T@Dx	 t   T$<Љ   |$ tgAuaQh   eZL$,T$,D$,    D$DNL$FFBL$$   N ׋L$fF/T$鎽QhD   ZL$D|$HHL$$H    ;@sh|$F 8tA;|!FL$d3|$      *{   @D$$tkQPD$09j jjT   `OD$0벍AChT   D   D   D    D    D$$w   ;pshF    89A;|MD$P   |$8 D$EL$<3҉L$$   |$+ȋЉ$   <
;uu!P   xx+u
$   B͋T$+
;u	uQKxx+uB׋T$`+
;u	uQxx+uB3ҋD$d    D$,9jRt$,   M{h4A{h\$$\\$`   TD   D    D$,9	j jUAT   D   D   gt%L$T$$D$$    ?t$$t$? D$  ׸  ˙RPx酺T$BtPHT$z_ uRT$3|$9r~83ۉ|$ BDt@    p,T$F;r|рz_ uRT$BPPt*L$T$$D$$    >L$$׉L$ D$   |$0 L$Q(T$HBA(L$<tD$4D$|$@HD$4;     |$|$4D$XD$TL$Xf     |$<\  L$AtEȋATD$Xu
|$<ATD$L$T@D@D$x       t$xvF     fF&f.Ft@8   @uf   L$jpVt$D8D$,\$,׃|$@9\$`$   RPt$P    K;ACh\$H\$   \\$`    TD    |$@L$6T$XA4hQ$D$ D  L$Au
D$d 8ȈA   L$@D$,9j Wj u   eJЃChD$(8BCh\$`D$( u   D    |D    D    yW tVTT$,>yD$@JT$(| tjVЋVT$0tp@t$@D$,9j jWT   IT$T   AT$HT   |D   D    D       D$,9 j j j    HIЃD$8h9BCh|$@   D    D    D    D    ChyW tVST$L:yJ | tjVЋUT$PT$Htp@t$@D$x D$x|$4L$XD$TD$<D$TL$X9|$<~D$,9j j j    RH魵ACh   D    D    t*L$$   9u$   $     tQV.;pKtPHpK5xK|K$   tPP$   QVۨ   L$$   8   茎 tD$ :pKtPHpK5Kt$ 5Kt
PPD$ $   |'$   tt;|9L$ v
RQ tQV'pKtPHpK5KKtCL$$   8u/9$   |&$   r   %;GL$   D$ˋ   RP茧陳t9L$$   7u%9$   |$   rL$%  D$ˋ  RP1>t%L$T$$D$$    N8t$$t$ D$ˋ  RPW6IBsik|.i»ٸ'
IeO-|6ټU    3ĉ$   E~D$ ED$$ESD$,3VD$4D$    D$W}D$@ffD$DGD$   D$     fD$(  D$$   fD$88_v?(   48 6D$RhP. GvC˺,   ;|؉L$u7D$hĂPCG D$    tQL$$;L$rj̂L$'~̂L$$L$fAfԂfAւAD$   GtML$$;L$rj؂L$i'~؂L$$L$fAAffAD$L$$A;L$rjLL$D$L$$D)L$tD$$ |$  vD$)u	L$D$8Pt$0     t L$03F_^[$   3vj	 ]j ju L$0   _^[$   3Fj	 ]ËL$,W f@HL$HL$0xX_^[$   3
j	 ]t$,茱 PhENL$<ƋL$0_^[    $   3i	 ]Vt$tZ= tGpKt
PHV$)xIIVpKtPP3^V3^̋D$S\$UC(x    +3ҋKD$    D$       VWy tyux1;|+BDD$B;|ՋL$_^tQCD   CDL$tQCPC(C0   C4    D   C][D3pC(C0C4    ]3[U襇 u,PjЃtEWMfB
3]ø   ]SVWv#F       >   = t|pKt
PHW$fnI3fnxIfbfnfnfbfbff~xIfsWf~IpKtPPW    U_^[Vt$$tZ= tGpKt
PHV$)xIIVpKtPP3^V3^VW|$GwW 蚜dt wʋG    ϋ_^_3^U$S]VW;|$TG3@Ѓ9u~j<ED  tHQ%  =  uyuAu# 5tPhEa  EF;u||$GL$j@|D$     D$    D$$    D$(D$,    fD$0  CtPD$hPGu3ʍq@ Au+΁?D$(;D$ rQL${tD$(+D$QRP谒	 CtPD$hPVt$t+D$(0 |$$ vD$-uL$t$u   _^[]ËL${j Wj Ih   j  D$= tFpKt
QHV$)xIIVpKtPPVt$t)\$sӫ PhEC_^[]73Csdt7'    ˋ_^[]̋L$39A̋T$W|$@;   VrtD@t
PHNxt   ;}x<   A@   - PG    t%   @  fGt.V$yW uu3F$@t
PPWt$賓3^_ËL$+jjjT63_̋D$HPD$P3VW>W t
F   _^ËF8    Ft-t$4r2hWNF   _^ËG  th-h LB MEQh4WȃD$t8 tPQhTWȋFh-h hhějF   _^US]VuW>VO@i  FW tj Ӌ   _^[]Ã{ .  K  xc  Axr           KD$-tF9   vt= th4rӋ\   D$j Pj    ϋSj jD$(    	  G@L$   t>   u5;F~Fu		t<tW; ӋPt$Ǉ   H/1  >u3hPNjh-hZP hhějx3_^[]ËGt
PH    |	    v	֋^3ۀ   r	c؋dW ut	Ӌ 3_^[]Ã{ txt9 uoGҋ4ЋS/uh\OKW,+t.O,r&;Nw!G@t59H,u;u@u_^[]À= th4rj Ӌ_^3[]U    3ĉ$   EVWD$D$8 QED$DD$twj PοD$iT$(D$<|$0DL$jPD$4    Ƈ   Ǆ$   \L$<$   $   Ǆ$   4YǄ$   pǄ$       |$DT$LD$P    D$X    D$\    !wt$@  L$ GL$4Nt$u@fHN3{  y	 tAy
 u\;Nt
y    j 3mD$   Ⱦdt2t&  ts"tL4΍QAu+j APD$,D$tt$$VP	 t$tD$t$f  D$$   3D$     wV	FD$0tF~
 u_:V	D$0@L$@8D(ȉDPtFu:D$@D$||$(G %    tW3)D$PT$`t$D$PNtQ|$  uzG@ut   º@D  j D$,GT3HtD$(ONGTAMNyP    D$X   =   uw|:WTtj jD?t3(h8hFHhF XhF0hhF@D$tD$0   u  ؅0DAPVNRPcFL$THLFxL u@LFxLvLj jt~ȃfFD$tyD$0      |$  u|
G$g G$FL$t$,@@0D$PG4hЃWmh  L$Dj Qh PWD$PǇh      &T$Pȃ$h  DL$@L$tL$uT$ 螽L$W tϾ   XGD$D$2tG %    ttGL$DfHN3t$D$|$$ tP@D$x	 t@x
 ue7D$3ҋxuL$3yD$x	 t@u7D$Hy	 tAu6tt
  uT$ Ƌ$   Ƈ    _^3Y	 ]USUVWًCKЃD$A@MCTA@Nuj U3ҋuBsN~-CD@Nuj U֋uN؃|$ tc3_^][]UVW7    u*WQtG$G_^]À~_ tN_^]3_^]SWSl;tV         vFWЃtO   t֋C   ;d  s0;\  rX  X  m;`  rP  P  U= tBpKt
PHV$)xIIVpKtPPV   6S@^tSDt&C)0  t36  f4       _    C [VWj jtkȃt   D$   Ay_^t$6׃3_^Á0   3ĉ$,  $@  SUV$H  W$D  ىD$$$T  h   D$D$0j Pl$ \$,|$(o	 $   jLj Po	   {W $   D$(  \$($  th8P$H  tD$@0  3f4  ${_ D$A   39k   3ɉL$@ Cttj~	 tF~
 u?3L$~	 FtG9pPt@@t   @Lt90txuxu@u3Fu2uaL$EL$;kz|$l${    t|/    ;{|~?hjS   %P  C4hWS4  tKǋ˙ RP<t0WUV苂	 7 ֍L$(ij ŋ+Ƌ$  $  ՍL$(=j $  D$t8    t$0u`+tZ$H     x
ǆ       t/Ǚ RPtWt$U	 / 3퉮   t$0{W tD$4   D$9 f  |$4  e  |$9 F      9  |$(39o*  3ۉ\$D  wD$    t   ~ u@j 3ҋc؃t
  uD$4      \$D$   ~	 FD$tF~
 u0D$~	 @@8@(ȉD$tFup0GL$D;tՋD$4   |$ t?~	 tF~
 uS03ҋpu	3ҋr~	 tFu
0E\$;ot$0\$ t   rVWD$,|$4t!PhEWST$<tkbD$4C@u9$  u	CDFT$4"9D$$30$  {@CDt   fHt		   fH$   tAыˉ$   9$   uL$(E$<  _^][3Q	 0  UESVW3T$|$8u>h8h 9jh-h hhěj   _^[]ÊFa<vt<t<mth<9h09명tFt
PH~_ u/^WuT$ uuuuD$tp~W ^W\$uc=  uG|$|NuI~8 u439^~)3@ FD@Nt	PvC;^||$\$G|$k~_ u
.^W; T$uu3	BNǆ      t
QP_^[]t$T$t$L$j j t$St$T$t$L$j h   t$ t$D$t$T$L$   j Pt$̃SUl$D$    D$    VE     u>h8h 9jh-hS hhějx   ^][ÊCa<vt<t<mth<9h09명tW|$x3~<0 u|0 t;|Ct
PHQW֋
tlD$PUj t$,jT$(D$t=l$(t5+׋g
ЍN~<r<s$<wuAE ׋{W T$_uu3	(Kt
QP^][t$T$t$L$j t$et$T$t$L$h   t$Bt$D$t$T$L$   Pt$
SUVWn  l$V^4tV Tv$W舳V(tv,WnV0tv<WTF@t
PW#kVHtr NDt'Q tA$Q$tA B A     NDuم   tO   t֋   ;d  s0;\  rX  X  p;`  rP  P  X= tEpKt
PHV$)xIIVpKtPPV   _^][U\ 3ĉD$XSVWًj jLD$t$EuEWj5t'j4j Wd	 fG"G4G  G   3E~}FF    F    CdCdF3FFfFu+WjPtutjPj W+d	 EF$EF(EF,EF0E ~ F4    F8    F<F@    FD    FH    yW t*3T$;P)3_^[L$X3J	 ]ËL$dD$_^[3J	 ]UUtMj]̃0 3ĉD$,SUl$<3Vt$D3WL$,|$(l$$t$ \$|$0l$4t$8D$T0T$   J3L$TC;uf:tuLtL~!NtɊx:xuG@Nxk T$xx+L$tIEi|\$ˀ   Ã!<!ÀtJˀ8 t@_^][L$,3lI	 0Ë\$mV؉\$}D$@D$뢋T$ eRҋeDPD$,PDQt$8h(t$DhL$X   _^][3H	 0̃S2҉D$T$UVWt tvxuT$i"3ۋy~G8W
u:t$+;uu_^][xx+u@ҊT$C;|_^][QSUVL$W;t$A<   < /͋T$3؅x|$( t MDtFH;t$~_^]3[YËT$ t(L$D0    tDHL@D$$2_^]   [YQVT$tZSUl$W	n>V$u.Ft'398~!3 LUF[T$G;8|NUvT$u_][^YUV   S\$WFVxt9n$u	xu9nuGuC%:u5Ft.398~(3D  t$LF[G;8|\$NSdvj_[^]U@SUVWT$Dz 3҉l$|$T$H  wxGt$D$8 8 ^\$("    F$ FD$<L  3   \$4  9^  D$(3ɉ\$ f;H"  L$,fD  @D   ,3   fՋxKDtT$FH;~ً\$4qt$΋T$4j E؃\$4tOu	34B͍Q Au+j yWtVtWUVr	 4ËT$L$,|$l$ D$(El$ L$,@";D$(t$l$t	   ^}$   \$(D$<   Nj  9 E L$LD$4D$       AD$@(ˋՉl$,D$H  D$03҃QPD$,PUt$$v  t$0׋\$$L$4VSrT$ۃD0    tLIL@B,@  D$S3 PD$4PD$,PUt$$l$$j  \$,    D$$D0   l    M8]F   uD$׋=P9V}D$Wh`pAAy\$0T$L$4St$(qE0    tEHL@D$T$$\$,l$͋ RPD$4PD$,PSt$$\$S\$hSl$tRP9V}W蟶`pAAyj h ֋躡D$Ջt$H@L$4VPp؃D$     tHQL@l$j j4M <tnj4j VZ	 5fF"t^C%@ 	Ft~G%@ 	F!E    9F~Ph(WU D$<	FCF$t
M gt
M Y\$DVS$jL$P|$t$C$\$ D$@C\$ ;\$(D$@4t4VP\$HvS$C$   F    T$BD$8HHHT$t$;}ED$8j hHU@   _^][]Uht$ !   _^][]_3^][]UQSZA,R$VqWy,tBPj 2URUNl+]9NpWRSa   m_^[]ÍAFlFh\|a   TD    _^[]U4SD$    VD$3Wp|$t$<O у D$0ED$4GD$EL$ L$tU+A,PD$4A,ET$@t@E@D$A8HA8MɉG   PQL$RD$,t[T$T$0NlGD$89Npj RP~   O+|$8AFlFh||$~   T\\D$ 9]uo9]~jT$0T$ЋD$HL$,AlD$89ApuRuO   3}@AlD$8D$,@hTU||$O   T\9\$  t$4L$t$uD$0D$P,JL$,OʋT$0H,+OD$ ȉL$ NlL$(t8T$9Npj j R   2D$(^AFlFh   5W9Npj j Rx   D$('AFlFhx   |$\\\TNlGD$89NpPt$Z   t$4/T$,AFlFhTT$TT$8Z   T\OyNlI8XWtI	FhD$L$8 8XWJ  ED$ AIL$ APj qU	 8YWtt$ D$$6FlFh8\tjt$$Q!D$(D$ AAH@+IQt$L$  L$@AFlD$ P9FpRj R   $|$FhVl   T\T\L$I8A8GA,Q,GWNlD$89Npj PR	   %+|$AFlFhTT$8	   T\\NlW9Npj j R   '|$AFlFh   T\\\D$tKNlW9Npj RP   +|$AFlFh||$   T\\Vl8XWtIL$(BIFhL$PGD$(IL$8Ql9QpPt$0O   t$3BAlD$8T$@hTT$,TT$(O   T\Vl8XWtIL$ BIFhP9\$  NlWT$ AD$89Npj Pt$$;   pT$,^h9|$AFl^h||$8||$;   D    D    Nl\$,9Npj j R   T$,.AFl   TD    D    D    D$D$^l9^pPj R'   :|$C|$FlD$, ||$'   TD    D    T$ xW uD$,|$0+|$ ||$DNl9Npj j R   36|$AFlD$,    TD    D    D    |$$ ut$4L$t$uD$$W D$O   ~lD$L$8|$09~pPt$(QGGFlFht$<|$03fTT$8TT$$TT$T$TD    D xW uFhT$4+T$DTt:T$RuVly^lKxW tIP_^[]ËFhT_^[]U$ESى\$VW8s|$n    CuC,{,ȈC   Vl9Vpu   uuu0BFlFh   D    EAEAEAxW uFhT$DTT$Nl9NpWRua   .UAFlFhTT$a   T|D    Vl9Vpu   Wu1]BFlFh\]\\$   |D    xW uFhT$DTFl~   FhfTtC<s   CE_^[]ËC,VhD$    HǉC,L$ Nl9D$(GD$$FpF  ET$ }+׉D$T$,ԁT$,\$$9\$Nl\$D$Fp}4;Rt$,4   Wa\$(AFlFh4   0;Ru5   Wm.]AFlFh5   \\$D    T|T$yW tR0FlFh| tjRP>tP@NlVh~   f\Nl\$D$GD$@;D$D$D$Fp9%t$$\$$΋USRP   _^[]Ë\$$AFlUTT$ P   T\D    _^[]_^3[]Qy$ SUVWD$   t	   Y|$yW u*ChtT4f F    GyClHQWtICh8u,u(ChWt4Vf F    |$u1y{lOxW tI	ChD$KA   A_^][YUDSVW}ًMT$\$sD$D$8Gt$4D$D$$    tI3ɋEL$0t
8 u]3EuTR~MNl9NpjuR1   
.AFlFhTU1   TD   D    T$|$ BT$u7MtA  xE{,|$$C,ux~t$4|$ C,K,;~
|$ C,M} E|$(P|k  3ۋNl9Np^   PSu	T$.AFlFh^   \D    EAAC;|\$2  d$%  
t	t	t2D$,   |$0          D$,A	D$@;}F}؍4DtfӋD$f+WfB@fTC;|Ջt$4\$|$ T$D$HD$<~4qv3fDË؍BDl$<ut$4\$(\$D$L$D$,|$HD$Ly tt|$$ ~ET$HD$(    P$t$,Qj W	L$|$0 tat$ Equxp}MqPET$uzz~sNl9Np3juP1W |$,T$EL$8It  $3	\$AFlFh|}||$ 1   D   D    밋|$ 뭊CuC,C,ȈC   NlD$,9NpPt$a   WT$8/T$AFlFhTT$,a   |TD    NlL$@9NpWRt$   -3\$AFlFh\\$   T|D    L$@xW uFhT$DTL$,<  C<1     C  Nl9Npt$   Wt$
  T$AFlFhTT$   |TD    
  T$$Bu(CuC,C,D$ ;ȈC   D$ &K L$ ;S)S
C C,HL$ C,D$ D$$NlD$49NpPt$a   W/T$AFlFhTT$4a   |TD    |$   NlT$BL$@T$8AD$<9Npt$ PR   kT$,7\$AFlFhTT$<TT$    TD    L$@xW uFhDD    NlL$@9NpWRt$@   3\$8AFlFh\\$   T|D    L$@xW uFhT$DTEt#t$$Ћjt$0t$@t$(I   CuC,{,ȈC   Nl9Npj Wt$   8T$ /T$AFlFh   T|D    D    Nl9NpWt$$R   /\$AFlFhTT$    T|D    Fl~   FhfTtC<s   CD$$@u	L$ ;C  CD$ C     E@D$4CuC,[,ȈC   Nl9Npj u2   W.UAFlFh2   |TD    D    D$4T$Nl+ǉD$@9NpSRPa   /|$@AFlFh||$ a   T\D    |$4 VlFp}N;WSt$   Z  BFlFhT$   T\|D      ;WSt$   /|$BFlFh||$    \|D    xW @  FhT$4DT(  ?  CuC,K,ȈC   UD$PL$0ra   QPWVl9VpW|$0   Wt$M7\$BFlFh\\$,\\$||$,   D    xW uFhT$DTb  C<W     CE  Nl9Npj t$G   j   T$AFlFhG   D   TD    D        t$$t$t$0WR$_^[]Åuۀ|$NlFpuWUR;j j R      AFlFh   TD    D    D    X  ;j t$T   W9  T$AFlFhT   |T뫋EKD$<    @D$DT$0u	C,@C,K   D$(T$4u%uC,C,D$$;K   D$$&K L$$;S)S
C C,HL$$C,D$$D$0D$@HD$@L$,|$D$8uyVlT$<9VpWj P   ЃT$<3\$8BFlFh\\$   D    |D    xW uFhT$DTL$,Vl9VpQt$a   WZT$8/BFlFhT$TT$,a   |TD    |$ujNl9Npj Rt$@    3T$8AFlFhTT$,   TD    D    Fl~   FhfT|$0 ~zD$D\$$D$8 WNl9Npj SRQ   {/|$ AFlFhQ   T\D    D    D$8Cl$0D$8u\$NlT$@|$9Npj RW~   +AFlFh~   |TD    D    Nl9Np!t$(a   t$8t$,T$07\$4AT$$FlFh\\$(\\$a   TD    NlL$D9NpRt$,   WbT$03\$AFlFh||$(   |TD    L$D|$4xW uFhD|L$<t+FlD$DyHxW tI	FhL$DHL$(tC<s   Cut!C<s   C;{~{S } u]D$PtRNl9Npj uR<   e_^[]ÍAFlFhTU<   TD    D    _^[]fa'	q(	Q.	3	(	~/	~/	(	.	.	n-	(	.	(	+	̃ST$
Ul$ +݉D$VW8D$,@L$D$,j D$ P蝫t?L$,t$j AÍFfFfFGTFFP~   *;	 tRL$    ݋;l$}8nL$"nu	D$ @E V+T$(K:G;|$|ˋ_^][UTSVًMW\$ UK8s|$@BD$4C8D$L3D$<RD$TD$D$\AD$,Gt$XD$P   E~hNl@9Npj RP	   T8AFlu	   ^t$X\\$ TD    D    Nl9Npj t$8   j 2T$4AFl   D    TD    D    ENPA<A8yR 	I@FlM|$@E@D$(D$<	1  <)  <
   KS,T$8u@K   D$D$<te<ta}|$u)u
L$   K   L$   K L$;{){9C    HǉL$   uD$D$       D$    K   D$r tPQNl9Npj Rj K   /AFlFhK   D    TD    D    ES,D$    @D$ED$T$8D$T~lM +AA D$D  D$@C(D$0@y C(tXT$<9Vpj j j    D$<2BFh   D    D    D    D    T$D$DBVpD$XT$$9
Pt$Dy   t$8nVp6\$0AFh\\$@\\$X\\$ y   D    L$<t/D$HxW tID$HHIFhL$HHL$X9
j t$8!   t$0Vp:\$(AFh\\$4\\$ !   D    D    D$X@D$<9
"t$0   t$Dt$0t3  T$(AFhTT$@TT$0   TD    3H  VpL$XT$$9
j t$8"   t$0
Vp:\$(AFh\\$4\\$ "   D    D    D$X@D$<D$@@D$X~Q9
T$LjRP1   2T$XAFhTT$L1   TD   D    D$(D$0D$@x ~cVp@D$X9
j jPV   0Vp6\$XAFh\\$ V   DD    D    T$$   D$DD$XHD$L$D~2\$PЃf     f; A[Eȃu\$ D$DD$PT$@ҋT$$   D$@T$P\$@\$\$T@T$$D$H ftHIL$DD$P9
SPt$8^   :T$02\$0AFh\\$P\\$T^   \D    D$@Kl$HHL$DD$@D$H\$Tt\$ D$L$\a  $(B	9
t$T$\Rt$8^   2T$0AFhTT$XTT$^   TD    D$$9j t$    t$4GT$(2T$,AFhTT$   TD    D    D$$9Rt$   t$42T$,AFhTT$TT$   TD         FhfT  Ma   Pqt$$Pt$(D$8L$\9t$   t$ t$4R6T$,AFhTT$TT$   TD    L$\T$xW i  FhDTU  EPCT$Hu
D$8 ȈC   L$0T$+ЉT$PT$D$TD$XD$$\$X9\$ Qt$Ta   t$\T$$:L$X\$TAFh\\$P\\$0\\$ a   D    |$H D$$L$\ }L;Rt$4   t$4h  \$,AFh\\$0   \T1  ;Rt$4   t$46\$,AFh\\$0\\$    TD    L$\xW    FhT$HDT   |$	u`\$ ;MT   j PAP:   ]AFhS\$ TT$T   TD    D    \E@;j j P   8]AFhS   TD    D    \$ D    T$L$tQ|$ut;S~,D$SC  L$tC<s   CL$C<s   CNT$LҋA<A8yRjI@]T$$C t8; \$<$   j St$0T$0jAFh$   6; \$<&   j St$0T$02AFh&   \$(\\$<D    D    \EXtJ9
j j SC   ].AFhC   \D    D    D    NT$4ҋA<A8yRQ_^[]ËI@_^[]À@	=	c<	?	c<	/>	4SUVW|$-     uj_ 3ɉL$L$tXu^n3U ~ M4fD  99t@H;|L$|$;}LlL$l$vl$uu3_^][4Ël$t4U;}xTE D$$L$ t$,D$ 6_^][4Åy7_^][4YCtʍqAu+΍A_^][4ËCqD/_^][4ËOAPA x̃LSUVW|$0    w\$m   c  B4t	ЋB4uB jD$4GC$K D$,l$ t   3@D$$ uL$ tD$    U n
E 3ɉL$  \$3\$;Ct.Cu(xW 1  Ntjjjj  |$     8   H x,yO y,{Gɋȃ|$$ t?R7hTit$yW    Nthjjj   xW    NtjjjjovuAPh(t$T3ǍP@uL$+@j PD$0؃tt$(WS-?	 xW uNthjjj\$D$|$(G\$|$ϋ ;l$|$0L$43_L$<|$8D$D    ~L}f     L$8eЀyW u"   CtjjjjlF;u |_^][L̃,SUVW\$$D$0    D$,    D$(    D$4       D$ j Vt谙l$ӒD$tVj U])	 D$   ;OL$@3D$ t$fL$D);  D$D$|${W   D$t
@    t8fD  H   t   t@@@uޅt8u@uu1@   u0P,t)H yJ y,{Bɋ<;uxtBsu7ύQAu+j YL$(S肘tSWV<	 \$$FPh(SD$       @ j ֍L$,c@   @t	   f	E u37ƍP@u+%?v"P~f2tJ<2:DL$AQVPh4SL$(|$vD$Pj]2҉u΅ttIxu|$UG   t	   f	E tW֍L$,1;ut$F|$t$;t$ l$L$({W tc~|$tut	ՋD$D3     D$@fA_^][,ËL$@333t$fL$D_^]3[,UXT$4VWD$88|$W _  MWr)D$@)D$PA ID$D3L$0D$    t$f;B"  FD$ b	BЍL$@D$,>L$,D$(qWFD$(  OGu+3ҋ?L$$uL$3ǃRPΕЉT$(   VFu+L$$?3ҋ҃D$  T$T$;d  sn;\  r&T$wbr=   wYD$щD$D$   ;`  r86  D$49T$w"r
D$ ;D$4wD$щD$D$D$aD$ T$RыL$PЉD$(u'D$$t|$Ћt$D$ L$PD$L$L$D$t0GPD$,PFP
9	 D$ L$t$|$f ft$|$f   f#f~@EFT$,L$8_Wt0֋PT$<L$0D$L$0B"t$9D$   fB(_^]̃SU)VWj u Ƌ}$@L$E }$Vh  }$|$u $    C4t	؋C4uj j@贓tjj@j Vq#	 F          fF&ϋSFPF"Pvt$$֋SfF }W t!   uFu	֋3_^][_^][Uz SZ<VWT$\$$j  b  G,@G,BwD$u9wtu@PuGCD$ D$    u^lVp\$T$h  @   tXNpFlL$D$?   t]uHT$D$\$|$ FlNpD$L$   D$ 9Gj t$G   S(FhD$^HT$D$    舅t\$D$   딋L$ @FhT$D$ G   \TD    D    T$uCD$
9SuSS$  AFh   D          ÙRPsL$f9A   I @  fA   \$D$ t$ЋNl9Np$j j t$   T$FhD$8T$AFhD$    TD    D    D    D$9j uR   4AFh^h   T\$EA    A    AL$T$$z    G,_,YG,RS|$D$9j j S   &T$$5T$A|$   \D    D    D    D$9CSPt$   _^[]ÍAT$TS   T\D    _^[]QSVt$WW4tVt_^[Y3O;1}TDR_^[Ỹ(SUVr0T$$D$Wt3ɋy,   L$$T$j ʍEPL$ ؃\$t5GCfC@fCATUCCj PK   ~	 t؉D$p  |$$ D$,    ]  CD$4CD$Ft$D$ ff     (E   tL$JQD$    pD$(NP4tL$Vu,D$(3@;0}L$TPuD$xD$0   NFu+?vmF5j PD$軍؃tOj4j Sx	 qfC"C4CVt$4P1	 C K "  kC   \$\$\$D$ t$(L$4>|$,t$HD$ G|$,;|$$_^][(UTSD$    VW\${D C D$0Cw|$D$4     D$,th<W_^[]j j j !   y  G8@  HӉG8fKPD$(aC<L$0D$@CD$<CD$8C0C<    C    C    D$3~!0@u
@H;|L$0D4D$ W(T$BG(;u3ɉD$49L$@G(L$ɃG,G,L$DT$HD$L    D$X    D$P    D$T    NlD$(9Npt$,y   Pt$(T$7\$ AFlFh\\$(\\$,\\$y   D    |$    QӋVlD$  D$09Vpj Pt$v   7\$BFlFh\\$0\\$v   D    D    yW tWD$ D$\   yVlJFh| tjWЋD$$D$\dtx@D$D$\ONl9Npj t$0Rv   Z/AFlFhTT$,v   TD    D    T$4tZ~l9~pj j Rv   3\$GFlFhv   TD    D    D    K {C0    G  G4@    tuG4hjt$D$8@8    T$8D$PL$ Pi  L$0Y8f  NlL$09NpT$$PRt$P#7D$03T$AFlFhTT$$#   TD    D    Nl9Npj j t$(   3T$ AFlFh   TD    D    D    D$NltTB9Np!t$(Rt$^   T$   \$AFlFhTT$(T^   \O9Npj t$,   t$-T$7T$A\$(FlFh   T\D    \$D    Nl9Npj j R   3\$AFlFh   TD    D    D    T$D$8J8R8T$4~TNl9NpjRP1   nT$@3\$8AFlFh\\$1   TD   D    t$$L$Ruj j t$4T$TtSNl9Npj t$(R<   3\$AFlFhTT$$<   TD    D    NT$4ҋA<A8yR	I@Flhjt$G4    L$ D$PPf  D$0T$0G4Nl9Npj Rj    A/AFlFh   D    TD    D    NT$$ҋA<A8y2R4t$S0t?uD$C0D$@C<_^[]ËI@Fl΋t$hpVU   3L$D$4D$(EVW yV4t$,T$|$4D$@~@@fD$PD$Xu9ytuD$0@PuAD$4|$@ubND$DD$Ol9Opj RPv   3AGlGh|$||$4v   TD    D    D$@FD$   tFD$$       L$P<҉T$ T$$xD uF4t^ʉL$~D tt$,D$    tf     @       @4u~0    UL$R  _^]Ã%EPQL$hj Q'|$(L$D$@jjPj j j|$  uf~v8uыU3ɋD$LBD$PB_^]ËL$D$@P3D$(  L$y4 u*hЅjt$hjt$L$(-       z  T$J(L$AD$@B(Wl9Wpj j Qv   7t$BGlGhtt$,v   D    D    D    V΋F8t	ȋA8uI D$T$L$D$lD$hPD$lD$t    Ǆ$       D$x    D$|    ,b  ȃL$(  Wl9WpPPt$ PvS7BGlGh|$||$4v   D    D    D    VF<D$D$D$lF4    F<    -   ttt Phjt$L$ D$xPVa  D$<F4D$<D$F4@f9F~fFV<t	L$0#]|$( D$F<
  T$B8HPD$$HJ8։L$ L$Ol9OpT$ j Rt$#   3T$AGlGhTT$ #   TD    D    L$AuA,Q,ȈA   OlT$$L$9Op j Rt$   T$0D$3t$AGlGhtt$,   TD    D    OlL$89Op Rt$    t$ ?T$07t$AGlGhtt$tt$,   TD    L$8xW uGhDD    L$tA<s   At$ D$Dt$ Pj j t$ ZOT$ҋA<A8yR	I@GlOl9OpT$j Rt$&   a3T$AGlGhTT$&   TD    D    OT$ ҋA<A8yRP	I@GlOl9Opj j t$ z     T$AGlGhz   TD    D    D    u  3щD$D$ FAFAF<A<D$@L$P*^  ȃD$L$(@<    	  N4PV@F   OlL$9Opj j R   *D$3t$,AGlGh   TD    D    D    Vt[NBL$$Ol9OpRPt$,   2AGlGh|$$|z||$4   TD    hjt$L$D$LP]  ND$(F4D$<D$F4L$8@f9D$8|*B1;~FWB;~F@F+N4A1;~
T$B)A;~T$B@+T$JfN<D$fF  I  A   tAO-   t#  IT$ p|  D$ "IT$$D$$    oZ  D$$؅L  D$(   ȅw7rs%wrs3zl$
uTrMu=   vD$(wr=   wuv ff     D$
wrwfEf
fD$f9D$   (   w?rs,wrst$,3fFy
ɅuHrAu   v(wr   wuv
wrwfMf
fƋt$,fFt$,L$  WlxW tIP  ɍBIGhT  |$@uD$DD$   T$J(L$AB(Wl9Wpj j Qv   7BGlGh|$||$4v   D    D    D    V΋F8tfȋA8uI D$T$L$$   $   PƄ$   Ǆ$       Ǆ$       Ǆ$       Ǆ$       Y  ȃL$(B  >F4F<D$N<$   -   ttt Phjt$L$ $   PY  D$<>F4D$<D$F4F0       N@L$8f9D$8|*B1;~FWB;~F@F+N4A1;~
T$B)A;~T$B@+T$JffFV<t	L$0ZT|$@D$F<F    F      D$0xW   T$B8HPD$$HJ8։L$L$:Ol9OpT$ j Rt$#   83T$AGlGhTT$ #   TD    D    t$ Glt$L$D$,D$HPj j t$ 艻OT$ҋA<A8yR	I@GlOl9OpT$$j Rt$&   3T$AGlGhTT$$&   TD    D    OT$ ҋA<A8yR	I@GlOl9Opj j t$z   3T$AGlGhD    D    D    Tz   ~8 uBD$   u3&PyJlIxW tI	Bh@L$   D$x$   F   FL$0j  D$PbvȃL$   T$BAfA@fAD$0@TAD$0A      PAj P	 T$$|$ JL$    D$    3V4t8L$WXL$$uA#L$0xЉT$u   L$(  3V;:}D$L$T8L$ u	D$0@D$GL$ ;|$||$4T$fFD$    D$$wh    xW tIT$PT$xW tRT$wh&x tjRЋ'T$ P@D$$L$AL$ D$$ft$,v4t$,AuL$IpL$(UD$L|$<BD$PBtYt$j jt`tmȃt$      yA`	L$(_^]ËjQL$,_^]U,S]VWT$ |$,wFlO8D$4G8D$E  NlVhL$(T$9Npj j P   D$(8]AFlT$\]   D    D    D    UtCNlD$$E@L$D$CD$09Np$\$$Z   St$P2UȃL$:\$0AFlD$ \\$\\$$Z   \D    L${W tR7yFlHD$ | tjRЋtP@D$Nl]D$09NpPt$   Po5T$A\$0FlT$\\]   TD    NlT$L$0xW tIAL$(IL$0SHJNlCD$09NpRt$P   P5\$0AFlD$ \\$\]P   TD    Nl9Npj uG   j5UAFlD$ G   D   TD    D    T$ xW t	3_^[]ËR~RNl9Npjt$R1   2]AFlFhTT$1   TD   D    M  $t	OuW,O,BT$4O   G,T$uɉT$O   KD$C^pL$(NlD$09RT$,PRa   H3T$(AFlFhTT$0TT$a   TD    ENlP9j t$R   T$ /AFlFhTT$   TD    D    ENl@D$09Rt$   P蕾3T$0AFlFhTT$TT$   TD    FlT$~   Fhf||$,L$tG<s   G  G<     G  GuG,W,ȈG   CPqT$RPsa   cCS^pNlD$$ET$,L$(@D$09Rt$   P舽7T$0AFlFhTT$TT$,   TD    L$(T$xW FhT$$TT$DAS[OlD$09OpRPSO     AGlGh|$0O   \|T`  QueCD$0u GuG,W,AȈG   0OW ;+KG L$0GG,]PD$0G,MCQACOl9OpPCRPO   ;-AGlGh{TSO   |TD    E^pNlP9j j R      AFlFh   TD    D    D    SS{^pNl9j RWT   菻.AFlFhT   |TD    D    ^pT$ RtMNl9j uR<   8/AFlFh<   TD    EA    ANT$ҋA<A8yR+	I@FlNl9!j j uC   úD$@_^[]ÍAFlFh_^C   MB    D$,JB    B    []Ðr	#q	[o	Yr	U   SD$4A8VqHWD$ H|$A8L$0_0D$P    D$4    t$D$\$$T$H<  D$<   |$xW    D$8fD$@;8   3Ʌ~"t$HS@ ;tA;|t$T$H;   L$<j j5jO  j4j WM fG"G4  O   D$G   GuD$0׋T؉\$$%P9S   D$0W UD$$؋D$X0   |$T$HD$<G|$xW |$L$<   j PiD$X   L$H   ;|$t$XCD$T[HB;~t$\$$QL$4XD$\[`pAAD$yX0L$8T$H|$BT$Hf|L$88   _^[]D$\    T$uD$D         GL$0A,T$,X@\$DA,Nl9Npj Sj G   ӷT$83|$AFlFhG   D    \D    D    L$<Rj Ph\$,ȃL$4tNT$,BAfA@fAD$<@TAD$<A      PAj P D$@L$<jD$4   |$,    \$0P3ɉT$L$(3 G4tVЋ_L$,T$u%3_;3\$0}GT*L$(T$D$4T$L$(@ F;t$,|t$\$$T$   uAD$<@P    u44 t,8u
@4Ax4 u~A@ R4uT$T׉|$TB4B4    Ӌ\$0j @8    D$(JT$(ˉB0hTVw0=D$,hTVp0(t$0׋    |$   S,BT$8BD$@C,Gt@GNlD$9Npj RPP   xT$D3\$AFlFh\\$0P   TD    D    Nl9Npj t$DRP   !EAFlFht$TT$@P   TD    D    D$@    D$8    W<t	L$<wAG<    S,BD$|Ǆ$       BD$ʉ$   BL$,T$(BS,T$Ǆ$       Ǆ$       Ǆ$       D$`L$dD$h    D$t    D$l    D$p    -   ttt PhjS%FlD$LP9FpRj t$$
   D$L0|$FhVl||$
   D    TD    T$$D$8hjSB诹T$0$   P)D  Nl9Npj j t$$D   Z3T$AFlFhD   TD    D    D    F@ F@    VlxW tIL$LBIFhPFlD$LP9FpRj t$4
   ŲD$L,\$,FhVl
   \D    TD    D$_L$@hjt$8H@    舸T$ D$lL$<PC  D$X؉{Nl9Npj j t$4D   (3T$,AFlFhD   TD    D    D    t$ Ft$8|$8t$L@ Ft$4u@    $   PD$XD$<t<u(t$ D$dt$8t$Lt$$uPsD$PD$4t u
Hu^L$    VlT$9Vpj t$T	   t$ -D$3BFlFhT$TT$P	   TD    D    VlT$49Vpj t$$   t$4ϰD$43BFlFhT$,TT$    TD    D    Nl9Npj t$   j w3T$AFlFh   D    TD    D    D$$KL$8@f9D$8|*B1;~CWB;~C@F+K4A1;~
D$$@)A;~D$$@@+T$$JffC^l\$D9^pWj t$D	   t$0蘯؃\$DiT$ D$T$4uL$$D$DIf9K~fKT$4D$   T$(CFlFhTT$@	   TD    D    Nl9Npj t$$   t$$3T$AFlFhTT$    TD    D    Nl9Npj Sj    赮/AFlFh   D    \D    D    ^l\$89^p!j t$D	   t$0_؃\$83T$(CFlFhTT$@	   TD    D    Nl9Npj t$   t$$3T$AFlFhTT$   TD    D    Nl9NpD$    j HPj 譭4T$ AFlFhJ   D    TD    D    D$<uNl\$(L$   <uFl\$(C\$8D$  ^l\$(9^pj t$   t$$!D$(3T$CFlFhTT$   TD    D    Nl9NpD$    j HPj Ǭ4T$ AFlFhJ   D    TD    D    |$NlL$uS9Npj t$T	   t$ e3T$AFlFhTT$P	   TD    D    Nl\$D9Npj St$4   /T$,AFlFh   T\D    D    Nl9NpD$    j HPj 輫8T$ A|$0FlJFh   D    TD    D    VlxW tIL$LBIFhPNl9NpT$4j Rt$$   63T$AFlFhTT$4   TD    D    Nl9Npj St$4   /T$,AFlFh   T\D    D    NT$ JҋA<A8yRղ	I@FlVl9Vpj j j Y   m3BFlFhY   D    D    D    D    yW tt$X;yVlJFh| tjt$\Ћ1L$XtH@^l$   T$lD$L9^pt$HRPZ   贩3|$LCFlFhTT$H||$0Z   TD    yW tT$\RS8y^lKFh| T$\tjRЋvtP@Fl~   FhfTNl9Np T$RT$,RT$@R   3T$8AFlFhTT$(TT$   TD    NT$ ҋA<A8yR۰	I@Fl\$Ts4tGj jtsYRȃt      qA`	jnt$$s4V0^8t	L$<HF0       u3&WyJlIxW tI	Bh@   39G$_^[]U@SUVW|$u
3_^][]ËOtG$;FuFG$<4  G;F:   1  G F\<uC<uC
<uZC@8~OC   t,y$   Cj@0hXQ]_^][]hpSQE_^][]Ë~ )l$t2t-j4D$ j P F\$(\$D$D$8D$    j j ӋK6؀}W t0  Ӌ?3_^][]Ã~ tK    GtW$P襆L$3<u,@    t@u@38HK   K<   <q   
t D$uǁg_^][]øLD$VFu+?v\	F5j PVtFj4j Uv E qfE"E4EVt$P E M "  E   ]g_^][]<uG;FuFGWmWΉG`G   GGtjЋ   (t$39(~Xf'[E;/||$G   tx_,Ή\$S(C(CD$t,39(~&XfD  [E;/||$\$CD$t"39(~X[E;/||$_^][]̃Sډ\$U  VW[t39;~sPvG;;|D$X(t"39;~sf'vG;;|D$X0t39;~s vG;;|\$͋S,S$͉C,s C$D$~^0t$@ Vj4t'^t 39;~svG;;|t$D$HHt$D$\$|$  t[4\$_^][̋L$V9u!D$pF,;Aufy  |	F8	V<3^QSUW|$3ɋډL$9~hD$4Vf;L$tKG@t| u
E(DE(wDtjv Ӌv4uL$D$AHL$;|^_][Y̋D$T$tuJVp;1}L~H^@tJP$;}L~H$3U   D$8D$SV   ڋ W\$(L$ @PD$<    D$D$,      MC D$0{D L$@<OG4D$PG|$D$$  yD   A<Q t{<   x   C   t{  2q  Qe  ]tT$0:QN  F  |$(0 |$t
y0 .  t
y0    tD$(x$   @        _,G,D$L`tD  }   Q Bx+  D$(@    D$<   Q } ~
B,@  W0   tGLx z  |8q D t+_     S  8 I     =  y4 Y4\$4  y0 "  }   t$(F
  |$<        A	  Q4t	9  A 8  yD   } ~
@,@  ʅuF0t~f8   A;|F      D$08~lD$xd  h  L$AP   W  @( RVP؃\$,tVj S t$ F(\$4\$,\$4t$G   j j j Ή   <D$,   t$$WD$4t	L$KWt	L$KWt	L$KG    G    G        D$   T$( B4Z0r<L$D$8D$j @    B0    B4    B<    e7T$,ȋD$L$Hr<Z0xu	D$8   t$\$,FdFdAt^D$xW uTuq T$PL$\D$T    WD$h    fD$`\$lD$XЌ	D$\L$HT$(D$8A4tH8Q8|$B4D$ @4D$ t$$|$D$,tL$.JD$xW tD$4   _^[]Ëwt`F   L$j jAtEtMFȃ         qAP|$G    L$(ًt$4t$L$8f     D$0T$@D$ D,S $@D$F D$$T$08|$ ;u
L$L	L$~ZEL$@PGP@ЃT$0  D$$S 6t	   u
FWPKHFF   t$@xD$ \$t$,,D$$@ F   tVL$[jHj FWGFG FG0F~G@fFG,D$P? HHl$$u\$8|$ t$L$,L$@ʉT$0L$,A,$@
D$
D$A,V0t4C  @ u+39
~BfD  3@fpA;
|t$S0F0    |$< D$v$t$$@$    vT$Dj{   C$D$    D$j j4Ktdj4j Vb T$,fF"V,BT$$%@ 	FVB%@ 	FL$   9F~/Ph(WQ}D$T$$&D$T$ &s$D$t$xW u7D$L$TD$TӋD$PD$XD$DD$\D$<D$`Fj D$hF%   	CF<t
C<F<    ~gt$,@~ tNWD$p    FfD$|Ǆ$       L$pD$t	D$x$       F    Hut$[4v4L$(\$8t$D$$   \$4Wf$   f$   $   Ǆ$   HǄ$   YtL$js   _^[]_^3[]QSUVWl$E    L$    D$>@   tXPXPB   ut	C   u^uӋQtxP   ~3Ʌ~ ]V9Xu
f@ f;E tuA;|p
<AuF   F3F^    (uWQHa;d  sN;\  r,   w>~FL$T$LNFT_^][Y;`  r6  ;wr;WQӋoIutӋyD~~_^][YÉ~u~_^][ỸSUVW   FG   <,uVvu_^][<5   n   ^} uGfD$$D$0D$D$(    tӍL$Mf|$$ tVSՋ   ;u>fD$$L$D$0D$D$(    f|$$ tVUӋ_^][UQSVWC8 uC>   C F   39{~$S
;tA;Fu
fA f;F tG;{|߸   _^[]Ã} t	@<AtCF% FCTtj j S%F   _^[]3F   _^[]_^3[]QD$Vt$Wx tI<5r<9v<-u;Vj G8 t	   _^YËN<BtVj w֋_^YU4SVuW\$3ɉ|$L$<  C   /  UB$P"  9K4tfD  9HD  @4uCDt	9H  9K<  >,u(RvӋsvL$UȉL$>,tۉuL$ J$@  Ft  F$;B,     D$(0fD$8L$$B,D$,D$<D$8F  D$K   j j #D$tafD  f>u3Ft,398~&3     LjRtF[G;8|Nj7tvu\$|$EL$$T$|$$D$0    @,D$(D$,CD$4wCDt=@   fL$8D$(D$,    D$<|$$t֍L$$3f;D$8t7CVtS,C,S$C$[4\$tuqD$ _^[]ËD$_^[]_^3[]̃SUVWE]@t$xtF@ +;uu}D3_^][xx+u@ϋut$j ShVpxF   _^][USVW}4 tW0tftu@4u3_^[]fz u
x@   uy3_^[]ÅxEj jL\$,D$(t	B;t=jLj V5 3҉D$j j ȃL$uL$jek   _^[]Ë   D$rlxȅ|$}t^D$    tQj jtA;Ѓt*L$WD$IBJ  B  L$D$pF   tH    @    j j5GFG F G0F0~G@fF@GHFHO L$(KA؃t'j4j S fC"C4C  C   L$$Ӌ	~+GG$    F(    F,    F0    G%G4       G8    GG@    GH    F4_p83F<    ^[]̃(ST$UVW  D$T$   x$    D$<x    H(L$0      X*3~vJL$1+;u5uCt$tgL$F9ta6PQJu   _^][(xx+u@뫋L$GL$;|T$z uRT$m3_^][(D$0tShĆj j@t?؉\$ 8؉D$ oj@j S< vuVjt	T?}8D$   L$WF    p	j jt?B8ȃtFT$   D$   qA@FD$<XD$C    D$0u@3~D$֋:Ӌ:   _^][(ËӉp:   _^][(ËȍQfAu+j iUt	f>7؃tUt$4S D$j \$K B  fC    fC&D$Pt&L$@AW H   A(t!q@h܆t$!s   _^][(   qDA(>|
~uF QT$,|$$
ttD$0       D$0   D  :   w 3ۉt$ 9   D$ 0~ utVtmD$8+
;u=uKD$|$$F@@G    uf    GyL$i(EA(nxx+uB룋|$$D$ CH;zT$,
G    t G4D$$ ;D$0h\$l$D$L$E    B    L$(t|B@׉G@G@    umD$|$,L$  ϋG4t	ȋA4uEQtXtR
;tJ\$RQu h4SUq     _^][(jtD$     _^][(ËЍCPC"\$Pʡ|$0 t"G    \EL$(E_E         ^][(̋D$   t*L$y4 u A8t	ȋA8uA@t	@  UdSVuW}D$D    \$GD$,O@L$yW %  @t   _^[]f~ t	CdCdG   G D$$GD$Pt>G    t5G@u'Pj$:   W @@     G@@   O@t{$ u  A  L$$t8399~2q4f> }C(C(VtR ҷL$$GH;9|֋u3ۍA\$<D$`99      "  WnuD$_j j@t9G@   _^[]2  j@j V wF   GD$XtMȍQAu+j AL$D$`P	tx92D$Lt(t$\t$\P D$XD$Wh0aC4tD  ؋C4uSFL$PF"PN B  fF    fF&D$x$ {  L$W:tD$Z  t%D$3ɋ p9VFt@A9uɋ΋uGL$3Pw5؃_C=  ]  @{+Ct
G()  {+    FӋt$ΈD$zMC+<uBT$B %    uJC<;At3hԇV<mS,L$j K GC<u?G(t9S4t2D$@ %    t   3B;v3hVls"fC"   EfHȋWMD$fAfs"D$\$<G(t׋qL$$CH\$<;}]uw   _^[]whĆt$Xl   _^[]3ht$9lG       _^[]Ë\${$ U+gL$P3ҋ9~2q3f<t<uA8tYB;|L$P\$D\$;
  T$3ۉ\$@ DD$l3D$\	      T$|4D$D|$dGD$D   uG8   uD$׋v ؉\$!P9S}#D$W D$؅u&^:	  `pAAyFDF31F    F      3D$XD$<uGHL$<3ɋD$$|$`D$8    |$(8   fD  CST$D$4    D$@uD$@|$W a  C(    tC@D$Hzt+ 
;uAuST$R<3D$HtEG3Ƀ9t@ A@9ux'GɋȉL$4!xx+  BD$4SL$$D$8@;^  Cp   Q  D$,   C  CxD$LD$0    8 3  D$ u3NFu+?F5j P4t:j4j W ;fG"G4GtVSP; G G   t$uD$׋%t$!P9V}ED$WuD$uH|$L$0T$LAD$ L$0D$ ;
,\$(R`pAAy|$ShW4x[F   D$L    D$33ɉT$ f;H"%  fD  pʋD$<L$h>|$0t.L$Ht&j P3ҍT$(  D$<MA   u
F     fNL$,tu     |$8 D$X   ~'u#   uC(   tK0p  u3NFu+?L$F5j P2؃\$Tt:j4j S ;fC"C4CtVWP: C C   D$$0~F|$(G$@tMD$,   uC+t$8N~:0HNG   ttT$0"yL$   X  \$@u3NfD  Fu+?L$F5j P21t:j4j W ;fG"G4GtVSP` G G   t$j j40؃tdj4j S T$`fC"tSB%@ 	Ct{G%@ 	C   9C~-Ph(WVet	T$Tt   r$D$dHt  t9t	@u8D$4  NFu+L$?j F5P/t=j4j W踿 ;fG"G4GtVt$8P& G G   D$j j4/tdj4j Vc fF"t^C%@ 	Ft~G%@ 	FL$   9F~5Ph(WQ~d$t׋|$
|$t	
ދL$t$u	nt$P9V}n	SD$uu\$(L$$HD$8@\$(D$8;L$<q|$X \$  T$D$<  Ph,Rc  `pAAYD$,   <  D$      L$HtZD$ \u\$03cˍQD  Au+j AL$PD$\-tt$TSV@ \$0 \$0St$Dt$<h t$$Vǹ47D$(7@(   tH0,y=D$LtӋy(\$   L$hCfTtT$    7   \$   7T$ v|$lut$0t$DhTit$ lUGFD$0u37ȍQ Au+j YL$S,tSt$4V4 w'T$ \$C"BT$ ;\$(D$h@RaD$\L$P@D$\;2t$ыMY\$t$MAt5 ;   ~hTSa   _^[]D$D @ tI   _^3[]̋L$AxgSY    AD$UW3(9;~JVs    VB @  t*t$A4t    ȋA4uj@QGH;;|^_][̃VWxW    G   ~ D$t$tL$D$	D$    趺3D$	D$	L$fD$蔺~$ u\D$(L$D$PD$D$    t$D$ _~$ u'D$L$D$	D$t$2_^USUVWډ\$C }l$|$C,  }$   OlSs9OpRVj K   \y)A3GlGhlll$K   tTD$s(3ۉ\$9X,)       ~   P   :   j j ~_lV9_pj j Rv   x3CGlGh|$v   TD    D    D    ÀyW tUe4yGlHGh| tjUЋ茄th@Fl$^p hj UB~\$(htUN^FD$C\$;X,_^][]USUVq3Wx(D$t$9h,   ދ@t3ҋNlGD$9Npj RP   w3AFlCht$tt$   TD    D    WyW tR*FlChDTD$E;h,Z_^][]U4SVT$$W}D$    VT$, G(JlD$     ZpD$8    D$L$$\$,   D$4    @   X\$<   @,x(Ex$ tzD$@@ tm|$( tfD$u
F,F,D$	9JpL$P   j Pt$0;v3ABlBhT$(TT$P   TD    D    N8F8jPWVD$Dtn\$0u FuF,~,9ȈF   (NV T$;+ˉF NF,xÉF,|$\$<jj Wu3D$0    |$L$y |0t,D$4u
N8F8D$4UWSPq\eL$,AA@    3;|$0}GD$<txD$uM9A$t
F,F,D$L$$\$,9\$j j PU   t6BCh\$\\$U   D    D    D    yW tW_:ySlJCh| tjWЋ膀tx@\$D$Kl|$P9KpRWj    th.AClChh   D    |TD    L$D$	PyW tR~D$$ DTD$$~D$0ЋfTD$0ut!F<s   F;F~F~ |$4T$t%J׋A<A8yWx{T$	I@BlL$8}AD$L$8D$;O,JlY|$ L$$u
D$,D$,G$;\$,ZhE$\$4ЉT$$8    |$( T$(T$ЉT$$\$4tzD$$D$ D$,T$ \$49T$$#L$   j j t$xrT$0D$ 7D$ @D$ \$   \D    D    D    E3ۋ@9~/xD  wqD$(C;|D$xlPhT$4D$M\$  t97N;u	_^[]Ë xW tIp_^[]ËIˍp_^[]U(VW}?,e  u   fL$(׍L$D$D$    FD$@(D$,D$ݰf|$(   G%   =       (    T$4YD$    0c       DΉD$4j P!   j4j V裱 fF"|$ uD$  F E	NF4Ff 1 D$F   N0P$VV^ GFG F G0F0uW_ O0L$A$   fF_^]ø   _^]_3^]Vt$W|$VtV(tϋ_^SU3VW9] ~WuF;tDG;FuOutuWt.VtB   tR uCH;] |_^]3[_^]   [U   3ĉ$  VWD$x   ML$|D$ w|$Ǆ$       L$Pt$\u 9wtu
APuGlD$ t$\?4  $ 54  j j j    4  D$|L$ 8whA0D$tOj jtT$ȃt      QAL$ A0    A  @ Aыj $ uGD$ HL$0   tsP BȉD$1tML$AuA PhW!T   2  3   D$x_^$  3蕕 ]ËD$ L$0HL$|9	u	ЋT$  uL$ W)$   )$   fք$   AQ T$XD$lA0$   3D$,9A4  ;Z  ||$txD$@,$|$@|$<uNT$I$R43t3D$P@P    u&L$D$Xa,@,Q4@PD$$H$oML$ T$XD$t]  @T$@8B"T$X;ǉ|$|$  D$t@.  x0|$|$   y0 u	:   x<    @      A      D$P@P      j jt<ȃt   D$   AAT$:D$t@0    D$,t$lT$$Pt1$ D$,"D$,uA   tŃ:tDBt"u>븋D$,t$PL$ ~W Q t$\T$X|$|?|$vA0$   D$,@y4 D$,t$|ы苖D$ x8 	0     /  3   _^$  3ђ ]t$L$D1Ph(WQA$T$<:  8,T$<-  D$PT$<@P     W$   $   T$<@ L$ A Ǆ$       Ǆ$       Ǆ$       Ǆ$       t8 ~@,@Ǆ$      uǄ$      Q$$   $    t|$   Ǆ$       $   D$ $   Ǆ$   	Ǆ$   P$Ǆ$       Ǆ$       t$   <$   t$   	$    L$<3D$d9   @<G8G<$   u%GtwL$    h%PzL$HGD$LH  L$ ;L$   D$P@P   u/G(   tGDx t8}D$ T$LWp$L$$|$d    D$0G     T$<:t
Bt"  G(   tGDx   B,@  FlA,Q,WNlD$@D$9NpPj R
   WhT$ 3AFlFht$\TT$
   D    TD    GWhPjt$(WƄ$   $   Ǆ$       Ǆ$       Ǆ$       Ǆ$       mT$\$   L$,PdD$`Of@fA&O( $   WG Nl9Npj j RD   xg/AFlFhD   TD    D    D    F@ F@    VlxW tIL$BIFh|$PG G      G(      GDD$P   Nl@D$9Npj RP	   f6|$AFlFh|$   	   TD    D    T$,BD$;tcNl9Np(j PWs   RfT$ L$LfBfA-  AFlFht$\||$s   |D    D    L$LfBfA  G@      T$<T$,;s|    BD$@t[B( uUJtNB@<D$GT$;P<T$,u4Gt-pMuL$@9D$uG@;Au	A   tRT$,HT$,;rL$A,3D$tA,GVlT$h9Vp  j j j    *eЃT$h(  T$,BD$t[JL$NlT$9Npj PR	   d/AFlFhTT$	   TD    D    T$,NlB,,D$9Np+j PWs   dT$8L$LBf@fAh  AFlFht$\||$s   |D    D    BL$Lf@fA!  $   BFlFh   D    D    D    D    O(BG(D$@GuZVlT$t9Vpj j j    cD$t3BFlFh   D    D    D    D    G,Wh`jt$(Ƅ$   $   Ǆ$       Ǆ$       Ǆ$       Ǆ$       WiT$\$   L$,PT$`OfBfA&L$tt0FlD$xW tID$HIFhL$HNlGD$9Npj t$DC   Pb3T$AFlFhTT$@C   TD    D    NlT$LL$xW tIAL$hIFhL$HD$@ @    G(%  =   uODGAGAG,AfBfA|$D$PxW L$ )   D$0L$<   |$D$d@D$d;WL$ AQD$`A$D$dA(D$DA,D$tA$$  $	<   $   D$hD$`u         $   t$` ;t$\   D$    ~wL$hT$`$   T$@fD  A:B   j23ouq|$hD$T$@@$   D$;|$T$@$   |L$ QD$`yD u/QЋL$Pj Ƅ$  D$$L$DHH(D$`$     0j eD$PG($   D$HO($   L$`B	ʋVlL$0T$$9Vpj QPv   $`ЃT$$7|$BFlFh||$0||$v   D    D    yW t!L$HQjT$($   WyFlHFh| L$HtjQЋkT$,$   tH@$   Ǆ$   L$|9
  D$`ANlD$9Npj RPv   ._3|$AFlFh||$v   TD    D    D$ @      L$`PT$~ft$P|$`L$$fD9@u?T9tZL$$T9tL$$T$JHT$L$$t$\|$L$`3҅~D$`A@u	 yD$`B;|O8D$ IO8$  @ @  u	@  fPQЋ{T$$z u.$   x#xW tI	Fh w$   B  G(ω$  @G(Rj j bNl$  D$HL$$9Npj j Rv   ]D$$7|$AFlFhv   TD    D    D    D$$yW tT$HR(h;|$$ }FlHT$HFh| tjRЋHitP@D$$$  Fl~   FhfTT$ Ƅ$  Ƅ$   |$l D$D5  -  3D$ @  8$     EfBf#D$fD$BDD$0t T$ BPt$RrT$L$   t$xd ȃL$HUD$ Q8f;P}fP$   tI3$  L$HEЈ$  $   tOA1$   A4uA A0@|8 tA D$   3ɋ$   ;Dщ$   $   x4u08QWu)Fht<Wcff G    |$|$0 T$   G8G,HD$HQD$(G8G,Pt$PL$$ωD$LqM NlT$$9Npj Rj    [/AFlFh   D    TD    D    NFT$D$lҋA<A8yRb	I@Flt$$T$$$  t$Ǆ$       $   P$   PjONT$ҋA<A8yRb	I@FlNlT$@9Npj j RC   !Z/AFlFhC   TD    D    D    NT$$ҋA<A8yRb  I@Fl  D$Hp$p $  $   P$   PjDNL$` FD$l]  D$4    D$T    D$h      J~3IHfy|$D$DH L$$~3IHfqt$\fzB~	B   fB$      D$D ;   ~+|$D33D
R$FD$   ;|t$\|$tv;urD$    ~VD$$L$@@:AuSj1L$,3fu;t$DT$L$@BD$$T$;t$\L$@D$$|D$h   3fBO8G8D$,D$Pj j4t%	ȉL$0HȉD$0   j4j Q͘ j jtЃt&   L$(   JB	T$<T$<KD$(L$PtD$(L$P(t	D$(L$T$<L$(T$<T$<D$PxW ~D$ W@A0G,$   @T$Df$   f$   Ǆ$       $   $   At3QT$`A$   2t$   $   tL$t   |$D tTD$ Wf$   f$   $   P,Ǆ$   	$   t$   D$ L$t@$D$d$   Ǆ$   IǄ$   pq$   Ǆ$   qǄ$       $   Ǆ$       赕T$(B B$D$ x(    x,    z,   B( D$HL$   9   @      L$PAP      HLv=u L$ID$;%D$@L$PvIX=u6D$@D$;T$L$Pj kȃ$   tD$@AT$(	T$(D$; z, D$       $   3t$(fD  F(   $   $   D$P*rD$@   t[@,Ǆ$   IǄ$   pqǄ$   qP($   Ǆ$       $   Ǆ$       t$   $   D$@$   D$;F,It$\|$T$(L$PG,ByW   |$D   z,Ǆ$       D$       B(x        @      @   Ptj j rL$XD$$D$$    T$Dj ȃ$   uT$$$   TP9Q}D$$ыPV$   0`$   pAAD$$A$   T$(%   D$G(ωBG(r T$Hj 0XNl$   D$(L$@P@D$9Npj RPw   RЃT$@7|$AFlFh||$TT$@w   D    D    yW t$   Rn];yFlH$   Fh| tjRЋ^tP@G,@D$XPG8HT$pD$HJHO,G8D$$D$DL$LO,AD$lD$D G,Nl9Npj Rj G   Q3|$AFlFhG   D    TD    D    D$DT$LNl9NpD$LR@K   Pj Q8|$LAFlFhGt$\||$K   D    TD    Nl9Npj t$(	   t$T'Q3T$LAFlFhTT$$	   TD    D    L$h   ٸ@   j Ɂ   $  DT$@ffL$P$   j Pt$Tt$x ȃ$   u$   L$P    A3T$DD$A1;u3D$d  $   tD$ @pt|Phj WGVD$TD$d   ʋD$(T$4L$x@ D$T~<D$(xF;ʍLƋBLl$Tu|$t$xt$\L$xu.OGD$TuG,G,D$<AɈ   D$<-W T$<;O)OG G,PT$<G,GD$TT$Dj j t$DOT$4Ǆ$       z  ~yL$43D$TT$(RB;|$D$<PBPr1$L$@AL$4t$(G$   D$0BD$T$   ;V t$\D$T|D$0D$TGuG,G,Ɉ   NlD$49NpT$xPRt$Da   |NT$@3T$<AFlFhTT$xTT$4a   TD    D$(Nl@D$09Npj RP   NT$@3|$0AFlFh||$   TD    D    L$Tt<s   D$xuT$<t#<s   ;G~
GD$<G $    D$(W(T$4PD$TG(uG,G,Ɉ   NlD$T9NpT$xRPt$<y   4M3|$AFlFhTT$TTT$xy   TD    D$(NlP9Npj t$0R!   L3|$AFlFhTT$,!   TD    D    D$($   @   |$h tWT$PBPuMuA4tCǄ$       yW u0$   Fht<W3Wf G    |$|$d Nl$   tYD$(P9Npt$4t$XR   K3|$AFlFhTT$TTT$4   TD    L$D3D$h9   L$0T$lЃ|$d T$TtTNl9NpRPt$<^   KIT$4AFlFhTT$hTT$T^   TD    D$(R KD$hT$D@L$0D$hL$0;gʋ$   t VlD$09VpPD$PZ   t$p@PJ<|$LBFlFhGt$\||$l||$0||$Z   D    yW t$   RsU;yVlJFh| $   tjRЋVtP@FlD$TP9FpRj R   $J,|$FhVl   TD    TD    OD$DL$0Ql D$h9QpPD$PO   @Pt$tI<|$BAlD$0T$l@hTT$LBO   TT$hTD    Nl9NpD$p	   j t$L@PdI8T$pA|$FlBFhTT$H	   TD    D    Nl9Npj t$01   t$x	I3T$pAFlFhTT$,1   TD    D    Nl9Npj t$(	   t$TH3T$LAFlFhTT$$	   TD    D    VlxW tIL$TBIFht$Pt$,T$`>Nl9Npj t$\G   jH3T$XAFlFhG   D   TD    D    |$d t^D$(NlP9Npj $   R$   GuAFlFhT$   $   TD    D    =$    yW u-D$@Fht<WDRf G    |$$   tL$PNl9NpD$p	   j t$L@PG8T$pA|$FlBFhTT$H	   TD    D    Nl9Npj t$0   j F3T$,AFlFh   D    TD    D    Nl$   9Npj t$tG   jWFT$|3T$pAFlFhG   D   TD    D    Nl9Npj Bj PC   E8T$pA|$FlBFhC   TD    D    D    NFT$HD$lҋA<A8yRM	I@FlFlHPL$09Fpj Rt$`1   oE0|$XNlFh||$1   TD    D    Nl9NpD$pC   j @j PE8T$pA|$FlBFhC   TD    D    D    T$(jt$4t$|WM$   T$4$$  t$D$   P$   PjE9Nl(9NpD$pC   j @j PtD8T$pA|$FlBFhC   TD    D    D    NT$$ҋA<A8yR^L	I@FlT$(UNl9Npj t$\G   j C3T$XAFlFhG   D    TD    D    Nl9Npj j t$TC   C3T$LAFlFhC   TD    D    D    f|$ t!L$tD$(ыϋ@(pp6V  T$ z$   B8  J 9  y   D$(x,  z,   IL$Xy+   B@8  t$(9p(t$\  D$(@(@@   v  rFt$\@  _  A<D$D$4 t"3ɋT$L$4@9t@A9uL$4G(3ɉD$$@G(3T$ D$D$XL$Hϋ@D$GtEȉL$0ATL$4D$d   D$du(D$dȉD$dD$0|$dxT|$uy/t.ɋ@Dx	 tD$XϋT$40j pT$ D$X@t%HL$Ht@ A8$<tIuL$H3ɋB @0u@T$XBt5@ @8ux0f;z(}x$ utf;y0}ȋ@u׋|$L$HtA,ыωD$蛂D$NlL$09Np!t$4T$RT$,Rp   @7T$$AFlFhTT$TT$4p   TD    L$0xW uFhDD   T$tDyW tRmK,FlFh| tjRPLP@D$(Nl@(@D$9Npj Pt$,b   #@T$07|$AT$$FlFh||$b   TD    D    Nl9Npj j Rz   ?3AFlFht$\z   TD    D    D         L$HT$XtBt	A8$<tD$   D$    %|$ %P̈DP2hj WNE  L$(D$    Ǆ$       D$0    y$ A,D$   3҅~)I(@   u	A@ uD$B;|D$;   G,NlW,T$9Npj Rj G   >\AFlFht$\G   D    TD    D    'u"A(x | @$   %   D$0T$(D$;fD$0T$<j Pj $   $   t$x! D$4{  @3ϋT$Pt$,D$ T$ tD$(@(tppw1T$tQNl9Npj RjG   =3|$AFlFhG   D   TD    D    |$; D$4   @4   x1    H0x$QR@ BP@,u-`yD$4NlP$9Np"j Rj    <?R=3|$AFlFh   D    TD    D    D$4 T$(jt$0Ǆ$       t$|WED$<ϋT$0PP$   j j j1V(T$l
T$,A<A8yt$,yDFlt$,I@T$lt$\$  uhphj W#B$    tF$    NPhj WAD$p$   T$40$   PAD$l$  ҋA<A8yRC	I@Fl39G$D$xL$P$   zWyJlIxW t$I@   _^$  3c ]ËBh@   _^$  3b ]ËwyNlIxW t&I@   D$x_^$  3b ]ÍNh@   D$x_^$  3{b ]Ë$     _^3bb ]UQSVuW~ u} t]]ˋFV;v QFj PJ  ~ u\3^~+E4hE?  VGF;|ՋE  39]     3   9^tӋ~tX= tEpKt
PHW$)xIIWpKtPPWhFF      _^[]ÍPf@u+%?x|$F u<PW;t,Et$4WR NC<F;]}EF      _^[]F_^3[]UE$S]     VWt    }t    ut    D$    D$     D$$    D$(   D$   D$,    o tED$    @@      _^[]j jPDD$  V     D$Ph	uuL$(T$(D$<  D$P  |$    tq>tX= tEpKt
PHW$)xIIWpKtPPWt$hEt$tm= tWpKt
PHV$)xIIVpKt(PPMD$,A@_^[]t$MD$,A@_^[]Ët$t\= tEpKt
PHV$)xIIVpKtPPVD$tD$P   D$_^[]ËD$(9D$v<L$j Pu*D$PJ   E@@      _^[]ËD$MtD$$tD$ _^3[]S\$  pKUV   +;   Wf     <   = ttt
PHW$fnI3fnxIfbfnfnfbfbff~xIfsWf~IpKtPPWpKF;`_= ^]t?t
PHS$)xIISpKt[D$%PS[UQSVWtq[(VtVtVtj}V]V tn  VcV$t*֋!u_^[]̃Uj8W@T$@D$x0tVSVwF;B<u'Ft +;u;uID$9FuT$~uFB<Fn ?T$u^[_]xx+u@U    3ĉ$   ES]D$(EVD$EWD$DMD$@3T$(7|$HL$4\$8D$$D$9E t#9AvhW1     D$$D$ PQD$  L$ L$(L$  ~W       ttQtL$A    ы$    D$   u&L$4y uT$tN@<;ADT$T$T$~W *  WD$<\$<$   |$LAf$   f$   f$   D$tAf$   f$   f$   DD$pD$lL$PD$(D$|3fD$dD$LD$hD$D$x$|$PD$T0D$XD$\ D$`    f$   f$   f$   $   q\$8:  T$D$4tx+u=h,W[   D$D$u   3D$$D$      D$(   H L$ D$,t:3PQD$t%t$ t$0P D$L$  3D$UD$txL$41h$uP      FL$<T$j L(l/x    }$    D$(PhXWUD$ЋT$^u  39;~)D$8D  tD$8G;8|\$8       Ӌe#  GtED$d$WTT$oWT`[gTD$4   L$,u
L$L$y\$L$( Z\$\$8L$ Jt+	x:xL$uD$(A@L$D$(J  xD$( x+  D$4x+u5L$0AtND$!PEPhW}|$0AuD$PhԊW[      P< L$t"F3ɃL$9tfD  @A9uL$V}  D$ tBt}  t      Pt$0t$ 6t$ |$iP Q   DP|$0A!   j ED$4j$D$׉T$$b  D$G    G    G    G    G    G    G    G     D$@D$ uD$0FȍQ Au+j APD$4D$0tt$,t$$P] D$<T$$L$<|$!GFDL$4GA<L$HGEGG	   r>D$@D$,  t!T$$T$,9t@u3҉T$D>T$03҉T$D0T$Dtj jL$PD$@D$@    D$$D$$D$@T$G_   [   |$$htWU;d  s0;\  rX  X  p;`  rP  P  X= tEpKt
PHS$)xIISpKtPPSD$Dt	ЋD$H    uT\$$tL{
 uFStJSt<StηSTӋ$   _^[3R ]U\SVWщT$z$    ǂ       t    ~ D$D$ t*C3ɋVL$9T$tV@A9uT$L$~t w(uL$,tAD$$D  Au+L$$?D$L$0
|$D$T$4AT$D$\AʋT$DD$XD$TD$,D$d3fD$LD$4D$`$ȉT$8D$<0D$@D$D D$H    D$PVd  VtL$8,iL  L$      r   3  8   AD$$tQt2yt AtD$ u@PuA&T$ D$$  L$ыL$EЉT$ BTD$   D$uD$ȉBTu`L$T$ BPȉBPEH L$ D$(t:3PQD$t%t$ t$,P ~ D$$L$  3D$L$PvCt$$4ht$$)T$0tgD$T$H L$(@DQl @D$ 9QpPjt$d   (7BAlD$(T$@hTT$ d   D   TD    j Qt$$hTS!T$ L$(P.   8 tfCL$T$Vt$,L(v't	V<t$(N9Nu|Vj &׋HA8F q8_^[]ÅtL~
 uFVt;Vt-Vt迳VP֋׋c_^[]UQSVWj j0ttXj0j V{g Uf^ut!tft QAu~$_^[]ÅtjӋ~ _^3[]̃SوT$UVW{$ +t
3_^][ËL$j q1Vt		2   Vj Wf D$(w0p0V7{ D$t$$T$$wt#t@ t QAuw$   <rLw<tEj jtfЃt&L$W2IBJ  B  _^][UDSVWuu|$8Rt$,     MrND$      D$     D$ D$    D$L$L$      j jL|$(  Vj舸GV j6G V$j4G$V(jRG(V,jG,V0j.G0ˈD$G8G4    V<jڷG<G    G    FGGGfFfGV@G@3GD    D$vHL$t'V3ҋv t
v$x$uL$|$(t$OH~D t5{W u/D$8L$4D$<D$@    D$4    |$LcFG{W u"D$|$8G4v4D$t$mjG8    )t$,D$ FE}FE~ Ft"?t3~O@  u%@;|T$tj_^[]ÍDt	<pupPhpt$8붋ULUt\  UU,ES]VWuD$u\$R7\$$ȃL$     r+D$3AEAÉAED$    |$A  |$3D$    L$  t(;d  s ;\  r   ;`  r	6  
W$RPqȃL$4?  GAA? D$ D$$      _+ω\$(L$0[jD$ 8tM;uHtDGtKL$D$G-C;D$tjЉD$軴ȃL$OL$O\$(CD$,u3DȍQAu+j AD$,Pt	tt$(t$0Wu T$ zK|$0LJCL$BD$$@T$ D$$\$(;L$4\$D$}Htj j׋覯3L$AuÉ\$AEA  ~3PΙRPȃL$uL$D$AEAg  A; D$$    9  T$y+щT$,D  CG:D$0tJȍQAu+j AD$8Pt	<eD$(tt$4t$4P|t D$4CD$0tMȍQ Au+j AD$8Pt	D$(tt$4t$4P"t D$4GD$0tJȍQAu+j AD$8Pt	D$(tt$4t$4Ps D$4GCKG O$C G(CGCGt[C4D$0tMȍQAu+j AD$8Pt	9D$(tt$4t$4PPs D$4O$G<C8G@   t G$tS4jѱG<CGt@SjGC   ΋S$t
j`T$,G,C,K0HG4D$O8HL$$AL$$;}L$D$AEA}D$t	Ћ腽t	׋ȩ|$  39   WttWtG tW8tG tW8tWtt	   uBuMGt
PVG    tW(FG(t
PVID$CH;Gtg   t׋D$_^[];d  sB;\  rX  D$X  _^[];`  rP  D$P  _^[]Ã= tQpKt
PHW$)xIIWpKtPPD$_^[]WD$_^[]USVuWuD$ދuL$Rt4D$   r3tL$j j親3ۉ_GtL$藧_^[]̃SUD$    VW] t${W       F3ND$L$9{~xMtP֋1t'CT$j L(HL$uL$D$G;{|tыX   T$_^][Ht$|$$ uFPhtU< 	Ћ~RET$_^][HUSUVWډ\$K u t$tF39t@G9uKSj PtZFɋ4ȋV23҃3U   蕷h  VPi Q	   DPk>  ]u#9]tuE @PuE؅  D$0D$@4hUE ML$@DqlB9qpRjWd   /FAlD$@hd   |D   TD    D$Sl09Spj j W   Wkh2BClkhE    |D    D    D    yW tV3"_^][]ÅySlJE j Vˍ%$_^][]UVWj GLU(   N9Nu5Vj HtA88t;tH u@ ~
 uFVtYVtKVtݣV@֋*O_^]ÃSUVWڋ\$3|$ЉT$ &  I    u+K8t$;u3  B t;t	F un L$(\$,L$V;uGF      39;~*AyeD$,G;8F|L$V\$,|$uZD$Nx+uCt&   ȋЋEPh؋WYL$$F	5L$\$,|$#F	~
 tu   ut uF	v &T$ D$0t(_3^]E[USUVWD$X/u3AˍQAu+j AD$Pt	[脿tt$SVj j jP2؃ut	֋,3_^][]jHCC   j P   U T$ C4D    D    BHsE;HtKR  j }  >         j h   j j j j V3ҋ13ҋωD$j j 	Au tL$jo_^][]Ë   ƉD$r[PȉT$tPtKj jt#Ѓt(D$3WIBJ  B  D$thE   tH    @    tVj6Ӌ>؃uWB_^][]ËPFPCPPh YKt@K,_^][]_^][]U$SV3ɉD$(W3ۉt$>|$L$9  D$P  <t<uZB8uRhVL$E33T$ f;p"U  3ɉL$@D  D$$   3   j j Ѕuѭ=p9s}L$RӋ	%`3pAAQW   |$?  ύ4QAu+j AL$PD$(D$tt$ WP)g D$$FD$@31V  N    Fu+?F5j Pt=j4j WAR ;fG"G4GtVt$(Pf G G   ut$׋蝬=P9S}D$W`pAAy|$L$W uf<E@D$(u3?ȍQAu+j AL$PD$,tt$$t$,Ve L$'w|$T$ EBT$ L$@";ЋEL$D$,AD$|$t$;D$L$E_^[]U   3ĉ$  EWVD$WT$fD$x   ~f$   f$   Ǆ$       f$   f$   f$   f$   f$   f$   f$   Ǆ$       f$   f$   f$   f$   f$  f$  Pj L$D$D$   T$|Ǆ$      $   Ǆ$   $   ΋D$j $   ^~$ uT$x:#$   t	L$&L$t$QȃD$L$xW   T$W)D$P)D$`z` uB`F(B\F(EщD$XL$PD$t$PD$h   @   D$FxVD$  xW   F,T$HF,D$T$L$$Hd3D$(N  D$T$(L$   D$    ~  D$ tKfT$HD$80D$<D$L    tЍL$48Mf|$H D$ tL$QЋN
KL$,tj j L$43yW D$0ut$Ћ"L$0T$0tL$ <EuTOl9Opj j t$W   3T$AGlGhW   TD    D    D    D$   L$AD$l$L$L$$D$(OlT$9OpRPt$,a   T$3T$$AGlGhTT$(TT$a   TD    L$BD$I\L$OlT$9Opj PR   &/AGlGhTT$   TD    D    D$OlT$@\D$9OpBPRt$   /AGlGh|$TT$   |TD    D$L$t	ыݫ$  _Fx    Ɔ    ^3@3 ]U,SVW\$st$L$w  E@ uG   G$   PhQQKVl9Vpj jh   
7BFlFht$   DD   D    D    yW tSx4yVlJFh| tjSЋtX@L$\$_       Wj L$D$D$D$     D$$    PD$4    D$,    D$0    荚tL$j\$(L$E_^3[]ËWtj j 73   Wj j j PQQL$(j 耝׋PЋ
  Nl9Np   AFlFh   D    D    D    D    QWtj j 裘3j j PQ׋MЋ\EW C  WL$P   P/WL$Pj ׋PЋNl9Np@j j j    yUh   3ĉ$d  EVD$Wj T$FtD$0    EȋL$(D$jt|$$AD$$  L$$Wj fGA|GD$y|jtոЉT$0ЉD$0  L$$Wh   fBB    WIj    BD$   EGD$dPGG1H $  jLj PH L$$  $  D$X  L$XyW th8PZ|$D$XW)D$0D$0D$ $   D$$$   $P  G|$`$      $   F)D$@D$quL$Xn&  D$t`Qh4t$ ЀyW tRc0GlGh| tjRPtP@D$PtoL$j j ƕȃD$L$ xW u>эL$08vu'$   HjPt$(D$8$   D$dP L$ D$t	ыxD$uPL$\eT$0t#OҋA<A8yR	I@GlOl9Opj j j F   m3AGlGhF   D    D    D    D    ~$ uD$\FD$|F$D$dFT$\t	L$X~$ u&T$$ϋwhR` L$(GlAGh    1L$($   t$A$   AD$Aϋ$   F$   FM1L$X_^$d  3c, ]Ã~$ u8D$\L$XFD$|F$D$dFt$_^$d  3%, ]ËT$\t	L$X?t$L$XR_^$d  3+ ]ÉW$l  3_^3+ ]UVWGtEF|utf9u9pt@uVuGAD_^]USVW~Ftu98u@PuF1Ft֋EEыR|t9u9Bt"RuPuӋAD   ; t@ %    D$D$   tD$    ^,C^,rWl9WpSu/   u.BGlGh/   \D    EAEAyW tV4yWlJGh| tjVЋtp@Gl~T$GhfT_^[]UQSVى\$W   }UN;t~
             F	;EuzFt?Mt8399~fY    W,yEG;8F|\$;\$}~
 uu ֋uWu{t uWu֋Gv U}C_^[]̃SU3VL$ɉt$3ꀉl$T$t]WD  C;u;D$(C	t2CtPtL)3~y+y,CF;|l$[ L$ T$t$u_^][Ël$t${
 t	l$t$0Ӌt$0tL$$ll$U    3ĉ$   ES]VWT$0U3D$ED$$BVL$$D$ȉL$(tL$ VV誏L$0D$,t$,tAI0   A4HqD$   33҉L$f;P2   D$@j j4HD$ 褰؃tCj4j Sa@ KfC"~   9C~Ph(WWD$@fC u軚9P9V}S`pAAYD$L$AL$@2;7D$3ۀx+Ã\$J  L$A+<   3t$f;A"   j j4貯؃tCj4j So? KfC"}   9C~Ph(WWD$@fC uə9P9V}S!`pAAYD$L$AL$@";FD$   g3<j Ãj4\$t:j4j V> KfF"|   9F~Ph(WWD$$   8 D$       XftL$ j j 3҅u蹘AHL$9N}R"`D$pAAQD$L$$@D$;|j jLD$\$PE؅u   V~(st$(C   C    C    GdGdC3CCfCu+VjPth葦tjPj V= D$,s C$C(    C,    C0    C4    C8    C<    C@    CD    CH    yW t3T$P;ڋP3\$tK   D$D$4D$0D$8D$D$H    D$@    D$D    t
@2D$<D$<D$4P1tL$ j$   _^[3:# ]U8  VWT$pW|$Ǆ$       Ǆ$       $ Ǆ$       D$lǄ$       D$\    D$|    Ǆ$       Ǆ$      Ǆ$       D$     D$X    Ǆ$       D$x    Ǆ$       D$P    f$   $   Y(  T$p%Jt$B(  N<D$L t$3҉T$L@9tfD  @B9uT$L~8 u@@tx0 t	    tǄ$       D$`    .$  Puh   D$l$  $   F+D$D$p8~E D$(D$(    ֋dw'  $   ֋J\'  G(D$$   HO(F$   u
D$8    #NL$8tA8$<tIuD$L$8N3҉T$dt8$   39L$8|$ED$BFD$W(Iut$dt$T$dD$MtA(D$A,$   $   G(D$L$pj A4F"$      P裩ȃL$Hm&  F"D$d$   @PjQ$   99 D$p$   D 33f;F"} |$H     AF";||$Mǉ$  WO   D$4$   D$pf$  Ǆ$      Ǆ$      $   $  L$tL$<=t u@PuGrȉL$L$<k%  $   $  D$4MD$C D$ D$0    9 v  qt$,@ ND$ uL$0t%T$@ IxuT$$  |$(    6   L$4o$   $      Ǆ$   P    E$   $   $   $   F   $      9   A  ֍$   6$   F)   $  %  	F	$  $   $  $   x$ $  D$D$D$<D$<t$,T$3B"D$t   BL$T$tD$hD$48H
ur V$   +;u6uDT$B ;uat$,L$HD$$   D$0D$l   xx+uB몋D$4L$T$tt$,GD$4;uT$ML$h|$8 tDtL$HD$0t$,D$C D`   L$HD$0t$,t$,B";|;|$8    Ng   $   HXD$0D$D$lyHX
Bɋȋ$   L$Lɋ@4ȋL$RT$ 2   a"  uD$H|$0MGt$,|$0t$,;9}v$   $  D$4Ph(WQ"  $   hDt$f!  D$0Mt$thhVAF!  T$D$CD$$   B`   333L$tf;B"   3fD$H<    BD8`   D8fu3 z+ t3R4t9}3TD$HW)$   Ǆ$       fք$   Ǆ$   `F$   t$   2L$t|$ f$   u  f#T$ftD$H   L$t B"F;)	z+uWf$   $   $   t$pF@$   Pt$LNDL$D$|ȃ}   $   DL$,T$3$   |$hr  $   G|$0$        ;t$8  V$thD$H$   WǄ$       )$   fք$   Ǆ$   `F$   w1|$ f$   u  f#3fi  333$   f;F2   L$4D  FxfxT$HoF(W)$   Ǆ$8      fք$0  TD$HǄ$$  `F$8  t$   0|$ f$4  u  f#3fɋL$4}  F2GL$4;Z$   |$0 D$hG$   |$0@vL$,D$hut$$   F,F,$    tD$d@Pj$   a1 ~ uD$   |$` u|$, D$ tD$FtL$LE   VTuʉVTu)(L$LFPȉFPD$Ft$~+   $   |$$   W,B|$C T$XW,T$ u|$` u
D$,ʅtN"BʉD$xD$,O,$    u|$` utAD$XȉG,A$   F"G,_T$J,AJ,F4}B,u~6   $   D$   |$0T$J,AJ,F4B,OG|$L$u"   $   L$$      $   $   $   $   |$( )  ut$֋j j u@U  $      $   %o$   $      Ǆ$   P$   Eǉ$   $   $   B   $      9   ~Ph(WQk  $   -U$   B)   $  %  	B$  9$    $   9x$  |$D$<t$|$D$<U|$~+u(uL$Rt$PT$|$   uV  5  T$B8HB8$   D$T$   H$3   zx ~   z ux    uo} uiB,OlB,$   9Opj Pj G   T$ :$   AGlGhtt$G   D    D    D    |$( @  F6  Ol9Op%t$ K   $   j T$Hh8$   AGlWhtt$ K   D    tD    L$q(t$$FA(L$l|$L9yp$   v   j V|$L1GAl$   v   tD    TD    }   T$t$j$   Ǆ$       uD$P   R$   D$0$   Ǆ$       D$4   D$8tx23B,|$|HL$\ϋ|$(@} D$PB,\  |$uF"34|$8 z(|$$GB(tdD$T$\JыHl9HpRt$`K   j 9|$AGlǋ|$\@h||$$K   D    TD    L$QlT$L9Qpj VWv   |$HD$Lh1BAlyhT$$v   TtD    D    D$8tFL$+Ѕt1D$fryW tR@lDTD$8|$( t:L$pt$,uQMQL$(PxT$,|$  t$  |$    u(|$` u!|$, u$    u$       D$   T$tPj j j u` ȃ$     Aq2QD$4A4T$0t$D$      GtυEȃt$A      ;   $   +$   |$L< tsD$D    it$3D$$    |$Lt$9|$(Btʋt$|T$\$   EƉ$   $   A3ɉL$DT$PD$4  t$|$LL$A2  T$Jl9Jp%L$   j t$$VSt$HT$h9|$ABlrh||$ ||$L   D    D    L$D   D$L$h$   @,@,Jl9Jp%t$ L$   $   t$,  ABlT$$T$   TT$    TD        
yW v  t4VFf F    M  D$|3|$h~/D$\ыL$PD$<@pPt$>L$$F;|ҋL$DtQT$Lt5D$yW u%@ht4Vf F    L$DD$\$   D$P   T$8WQ$   t$a   Pt$XWt$lVl9Vp&t$\   t$Tt$,Wt$HЃh:|$$BFlFhh||$P||$\||$h   D    D$ xW uD|L$D|$0} k  |$( ut$   ;m |$  L$D3   D$4$   x+$    x+$    ukL$d3+ȅ~ZL$ql9qpj j j    U7FAlD$@h   D    D    D    D    T$L$j j $   $   j jq!tCL$QlB;uFl2HxW tt$IPt$FhTt$|$D   D$9D$4   ;   Vl9Vp&t$P   $   Pet$HЃh9|$BFlFhh|$   ||$P   |D    D$$    xW u$   DT$   |$DtD$H8@8D$Tt$|$8 T$ ET$PNl9Npj $   R2   +AFlFh2   T|D    D    |$$L$D$(|$   <  t$9F"  t$X$   ;|$X  $   t@  @ P   uQ   vNl9Np  j t$\WD$H|$pl!  |$8 ;  |$( 0  Nl|$$9Np"j $   #   Wt$Hh5$   AFlFhh#   |TD    D    D$L$H8P8AlT$T$   9Apj t$$   W2$   3T$ @Al$      |TD    D    D$T$THl9Hpt$ Rt$   R|$AGlt$TT$    tTD$|$$H8Nl@8D$T9Np"j $   #   WgT$Hrh9$   AFlFhhTT$<#   |D    D    L$Al$   D$(  |$|$8   D$|3{    |$T$\։T$4Ol9OpRVt$,^   |$Hh2T$$AGlGhhTT$4^   tTD    L$|F;|L$zhQl9Qpt$\   t$Xt$G2t$BAltt$Ttt$\   tD    L$xW   t$|DTl$   9Qpj t$$   WT$,.BAlT$    |TD    D    D$Hl9Hp
Rt$XT$ABlT$TT$TTT$    TD    $   9Qpj t$T   W".BAlT$P   |TD    D    L$Ql9Qpt$P   t$Xt$6|$BAl||$T||$P||$$   D    L$xW DD    |$$AFlFh|D    3@    fHL$XH@ D$<|$plaT$ql9Jpt$XT$pRW|$^   2ABhT$lTT$X||$^   TD    ǋp   9j j t$`   2T$XAGh   TD    D    D    |$C uQ|$, uQT$`  3uT$dt$L$jj u3ɋD$,3|$4f;H"  L$l%|$, tT$L$)D  |$4D$@DL$D$haT$x$   y    }   ugD$hu`D$Hlxl9Hpj Rj K   X$   AD$@hK   D    TD    D    L$RT$Vt$^|$HlD$FL$lL$l@";|$<l|$ u_|$8 uXt$9Npj t$\P   t$(2T$ AFhTT$XP   TD    D    T$`uL$t$jju>$   3D$HD$|$d|$xH"f;  3҉T$l@ ;u+T$Jl9Jp  L$K   j Vj "   D$@D`t    N   D$H  |$( F  |$tL$|ЋD$Hl9HpVRt$,^   3|$AGlGh|$$^   |TtD    |$dD$GD$lFT$l|$d@"Ș;D$$   @`tL$P\D$$     $   t$Ћ|$XT$`L$Wut$(t$$juh   |$  |$8 VlFp  ;m  t$P   Wt$t$HЃh}  M|D$x V׋
D$x;tG  @ P   uQ   |$Ol9Opj VP:AGlGhtD    3@    fHL$xH@ z$      toj   D$4u[T$Jl9JpL$K   j Vj 6ABlBhK   D    tD    D    T$L$VWt$蘭Ǆ$       |$BFlFhh||$T||$P   |D    D$ xW ud$   DTM;t$    Wt$/BFlFhT$TT$    |TD    T$3ɋ$   3f;J"}gL$x@ BD`t GDǋ/D$H< }%B ;tL$WVt$臬$   T$B"FGL$x;|$   B`t L$R?|$  T$|$T$   j t$LL$PWu$   t$8t$t$   t$4$   K,$    u$       |$8 L$qlAp  ;!t$P   Wt$T$Hh9|$FAlQh||$T||$P||$T   D    D$ xW u$   DTt$T$ |$, tt$tL$t$Lj RT$(%T$L$j$   $   t$qA$       Nl9Npy   j j t$      ;!t$ t$   Wt${[T$FAlt$FhTT$    |TD    'T$AFlFh   TD    D    D    T$,
$    tXNl9Npj j t$   T$83AFlFht$   tD    D    D    tt$tT$t$LL$t$`j 讨t$D3T$L$j j E   P$   t$h$   t$(|$, t)t$tT$t$LL$t$(u|$Tt$D$   tZT$Jl9JpL$V   j jP6ABlBh$   V   TD   D    D    T$`L$Wut$(t$$juh   Ut6T$׋JA<uQA8yW	I@Bl$   Z t$N$   ҋA<A8   Rc   A8yWPT$@lI@lt$
9Np$   j Rt$,&   댍AFhT$$T$   &   TD    D    RI@FlD$x uxx u} uxp t$   th|Ћ"$   t$      T$H$   5T$p$    Et$   `rEt$   ^_^]UDSىT$8MVW{A43\$|$Lt$<D$Dt90t@uD$DA"K(D$B4D$AD$4    C(WlL$T$$9Wpj t$ v   QZD$$3BGlGhT$TT$v   TD    D    C,HD$L$L$@C,9  ED$,    @uuUj tj }`  j4ʁ   j4j V KfF"O   9F   Ph(WS¶   HL$,tA8$<tIuL$,AM D$Hx$UTtj j _[3Wj j4tCj4j V KfF" O   9F~Ph(WSD$H@fF 2k3ɋE3҉L$0f;P"D  ExwMTtL$<j j $_3҅uj   X9^}R5k   `pAAQ   j j4؃tCj4j S KfC"&N   9C~Ph(WWD$0@fC u4j9P9V}Sj`pAAYEL$0AL$0@";|$L\$T$ut$LVt$@tL$<nD$H    wh  j jj @j D$<@j uD$HC,(E D$4@  E3f;H"  L$E+D$<t$8QT$(t$8    {    MRt֋/T$,D$H;   tF  @ P   uQ   sD$ Nl9Npj Rt$PЋVT$4wh   \$ AFlFh3ftt$H\$tTD    D    D wh~Ol9OpRPt$    T$4wh7\$AGlwh\\$8   \\$TD    Glt$ ~   f\\$t$ EBL$8D$<ʉT$(@";ȋD$<Ewht$ @E  Ol9Opj t$   t$ *2T$AGlTT$   TD    D    T$EB   {   RЋ_T$ȃL$<B;  UKL$8RYl҉\$HP9Yp\$j Pt$DM  D$Ht$ @AlD$HD$8@h3fTT$<D    Ol9Opj Rt$    .   \$AGl\\$      HtA8$<tIuAOlT$H9Opt$Rt$    T$T2\$AGl\\$\\$   TD    L$AыOl9Opj PRQ   f3\$AGlQ   TT$BD    D    TT$D$4@2D$H   xW u/D$$tT4f F    t$ Ol9Opj j t$ z   7  T$AGlz   TD    D    D       Ct˅EAOl9Opt$,t$ Ra   Y2\$AGlTT$TT$,a   TD    Ol9Opj t$4   t$T$ 6\$0AT$Gl\\$   TD    D    Ol9Opt$0t$0R   2\$AGlTT$,TT$0   TD    D$@t$ 8u	L$4O OlL$$9Op!j j t$#   ;T$,D$$6T$ At$Gl#   tD    D    D    39t$~hD$Ol9OpPVt$^   T$,4\$AGl|$L\\$^   t\D    F;t$|\$t$ U1  Wl9Wpt$   t$ j \6\$BGl\\$\\$   D    D    xW u:yWlJ| L$DtjQЋ0t
H@AOl~ EЃD$L   DT$LfTCtE؃|$H C   \$$OlS9Opj Rt$&   }2\$AGl\\$$&   TD    D    WlxW tIۍBIÍPOl9Opj j t$z   _^[]ËT$AGlz   TD    D    D    _^[]ËL$4)M _^[]UQSVWf^teVt2RVteVtRVthr֋_ru_^[]USUVWu
3_^][]ËWtj j T3ۋWtj j T3WWj D$XΉD$j Xj j0t	unȃt[A    3A    A    A!    A%    A)    fA-A/D$A9AD$AiY_^][]Åt	׋dt	ՋPD$t	Ћwdt	ӋPD$t	ЋI3_^][]UVWj j0ttmЃt]M3B    B    B    B!    B%    B)    fB-B/EBEBBEB:J_^]Åt	׋cUtOUtcUtOUte_3^]́    3ĉ$   SUVWW$   3l$4t$|$D$(fD$@fD$HfD$Pt$8l$<  fD    L$83  WL$82  ]?m4|$$Cl$0u?uG8ufx   jhD$\j P $   D$dqD$pƄ$   $   [\$   @ {6    C29   C$t#L$Q   UP   k23ɉL$    3҉T$,     C D$`Cf<HuC(\;qt$\$d$   D$dCfHf$   \$X3    t$0L$ SP|?F;|L$ |$$t$\$;}Ll$0[\$	|$ trt$:L$ ;}ŋT$,AL$ T$,;}\$|$$0|$D$G뾋|$D$(l$4|$3$   _^][3u    ËD$(u9Gu	$   @Ph$   Pj1$   Pht$$舦   U,SVqډD$ B(T$(UWL$(t$4D$ ; t9St[u\$P  9EG  E@   AuA,y,ȈA   Nl9Npj Wu   蕿.UAFlFh   T|D    D    NlT$9NpWj R   F+AFlFh   TD    |D    {  L$(A<l     AZ  xtfD  G8$<tuG2D$A,D$    XD$|$ \$ \$A,   D$ D$R43Ʌt3G\$XD$0E@f     \$0f;\$t/A;|Nl9Npt$Ru^   97׋]AFlFhTT$\\$^   TD    D$D$@UD$;D$K~lT$9~pt$ j R   Ľ/GFlFhTT$    D    TD    xW uFhT$DTVl9Vpj jjF   Y7\$BFlFhF   D   D   D    D    yW thi8yVlJFh| tjhiЋ@i@L$(AtEAVlxW tIBIǍFhPT$,L$$j R QRD$43ɋE3f;H"}|3ۋ@|EuZD$,NlP$9Npj j RW   ?3AFlFht$4W   TD    D    D    EG@";E|\$StL$$j j }K3SSj j jPQL$<j OT$LL$<P^_^[]USVWj D$T$UPj h   j\$(肑  t$Vd   t8@t
PHNxt3f;   r   A@   负PQ%  =  uyuyt3	ұt.V$yW uu3toF$@t
PPt;jh܌W tjhW uT$WuV)d3ۃeE؅ty|$W) D$u3GȍQ Au+j AD$Pt	k;dtt$t$ WT D$tL$fD$8V_^[]̋T$D$SVW|$PI؃uC_^[ËT$SӋϋf_^[U    3ĉ$   ESVT$WD$~t3'~t u@PuF3ۅ  T$~$   t#D$PRq؃    3D$9D$
  jPPD$DWD$HfD$0PfD$< T$D$Lt$ L$ D$$D$8   (   F,~ F,D$   T$PȃD$L$;   T$NL$RAl҉D$P9ApD$j Pt$D$KD$@AlD$D$@h3fTT$TT$TD    D    D 3Ol9Opj PS   豷/T$AGlGh   \TD    D       ɉ   @Dx	 t   ؉   D$t	C$   _^[3 ]̃LSUVWD$,    ى\$U uRj j(gt"F~fF tc3   _^][LÃ   ~Jj j+gtF~,fF f4fF(6F*둋l$dG<D$   M?t2j j.gT8fHfN:%  =  u}uO<UO<3tO<3҃O<贬O<ЃO<%O Gwho$_^L$@  D$<O L$`GGt$Hwlt$Lwpl$Do$G^ ,t$Pwtt$Tt\$\$L$`Fl$  x ux D$$    tD$$   GRhLSWD$8FD$G<  D$(GD$,XCD$9l$d    W @@fD$0   T$0RPAЃu9D$4|m9D$0vej jϽ   eЃT$(t*d~tfBf|fJ~B\$tЋLaT$(  OD$~	 tF~
 u1Fh$H+h(~	 L$0tFuL$0G;͋T$`Oˉl$0TRP3ҋ2Ћ){	 l$m tC{
 u輸E @   `@ {	 tCuwT$hs5  3ҋ9T$dP   D  F xu	9l$duodFˋl$0j UP$O  9D$$uWdPU2  W   GZxGN	tF~
 u
ڷN	Vz u338B@D$0tFu芷Ջt$ D$,ht$    W2  t$ ht$ W  t$    h(t$ W^g  t$ ht$ W:  D$ f     N	FD$0tF~
 u۶N	D$0u
 hln@@8l$̈́tFu舶L$ Pn:  D$ D$ 
k9l$duӋ  {	 tC{
 u<3ҋu3ҋ{	 tCu   9l$d   K	tC{
 u
K	D$z u338B@D$0tCu蓵Ջ
{	 tC{
 u蔵D$ h$H+h({	 L$0tCuML$0D$;jOU P$q   D$<G΋D$@G D$DG$D$HGhD$LGlD$PGpD$TGtD$jj Ƈ    G^\$4GUtKC    C    \a_^][LU} SVWD$u3   u3NfFu+?Fj PYuc3_^[]ÍFPt$OQL$  ET$EGEWGG    G   W  Ӯtl;ub֋[3_^[]ËVt(J @  t	   uBuccF    FuFtvЃ֋[_^[]QVt$WFt
PHT$j t$ t$ ~W u33ҋbFt
PP_^YQSVt$WFt
PH\$$΋T$St$$t$$?~W u33ҋybtt	t$ ӃFt
PP_^[YQS\$U     VW|$D  Mm L$tR3tDًKD  :utP:Quu3t	DFuƋ\$L$< uFCqt
PHj j j ֋M{W t	3ҋaCt
PPR_^]3[Ỹ4V2tffD  9tV2u^ËFFU.uBS^W~GuGtwЃ׋mYtS@Ѓ_[͋]^QY]^QV     ǁ      It      IuSUW F^D$uG~nGuGtwЃ׋|$X|$tE U@Ѓ֋Xu_][^YS3UVWC,9,   ;   |3hjQ蔑3ҋs0uRU?\i;d  sT;\  r.wHr   w>K,AC,D$D    s0_^][3;`  r6  ;w
r;w3QU֋\uT$t_^][W̃SUVWt$,jj j t$44g   K  l$(C+T$tZD$(m D$t:3̓PQN[t!Ut$V . l$(3l$(3VӋӋj }D$u3MȍQ    Au+j AL$D$PtZStt$t$ V VӋE+   E    s0tAS< tD$3ɋ@9t@A9uɺ   @4ȋ63{G_^][QSUVW   tJ    tA   ŋ RPYtUSWM /    WX_^][YU SUVW鋽   ] l$$|$\$  ]ǅ       ,~        EtͅEA   tF+   QhDS苁D$ |$ P<tK39tfD  IF9uuX WPPCL$$4h`UP}u9}tuE @PuE胥M D$]ILKlB9KpRjVd   蕧+AClChd   tD   TD    Ol9Opj j j    K3AGlGh   D    D    D    D    D$\$ S0hďt$(Jj P֋tL$SD$E,],0Ol9Opj SV   謦_^][]ÍAGlGh   t\D    D    _^][]ËG<  D$(D$,G0j @D$      8   x\    tK    Cu+ف?G<@D$   h}+    E      M uJtzt!Nt
x:xuGBNxxxD$+хu0E <_u#L$ @P	A\ЃD$tM   D$ |$D$El$$\$L$(T$,WtX_^][]ǅ       _^][]Vǆ       ǆ       ^̃    u   B   ËB+      ̃@SډL$UVWC0k,D$8  \$ D$4    t 9X  @u3  ΍QAu+j yL$W8UD$  WVP j jENt  D$W|$T fFF    ~FK<t@3҃9t@B9uD$@ҋK0ЉAL$\$D^t$@D$L      D$HD$@  D$4PSt$@UwUT$pL$`D$0  u,&W+3h؏Q|L$h   _^][@Å   D$4u9|$WhUa|L$h։Pt$0׋P_^][@PhEU,|L$h|$4t}= tjpKt
PHW$)xIIWpKt8PP|$֋Ot$0׋rO_^][@W|$֋QOt$0׋DO_^][@Ëq  Wf @    GF   |$L u}D$ 0h$U:{L$hF.u;~GuGtwЃ׋NtS@Ѓ֋Nl$   |$͋N_^][@ËL$ 3҉T$(T$8A4F3q4f;A"  3l$,D  AD(t (ʍqAu+΍qL$ T$(D(t4D/t$u1  %t$ME Eu+3҉T$$?   މt$fD        zHtɊx:xuFGHxxx+   T$$t{ u}Ê@t< upt$;}v|$$238S:;+t$fD  IA;~; u~C L$    l$,T$(AfL(I$T$$BCT$$;T$(l$,L$ 	A\$8A"C\$8l$,;cl$|$͋t$0L_^][@ËL$[ST$L$L_^]   [@QSUV   W|  uc   ڋ鋎  څuSW-Pf;d  sS;\  r1wGr   w=|  WD      3_^][Y;`  r6  ;wr;vSыWPȃu_^]A[YSVWF4ЋT$jH؃K0j 9  豝PtxHtox tit$QRӋumK4tf91tIu_^[ËuJK4t91tIu|    |  A_^[WhTVCwL$    _^[U$   3ĉ$   S]VuW3Ft
PH  D$A  9x8  @h   D$D$ j PG $   jLj P3   ~W $   D$  t$th8Pt   L$Ƅ$   Ƅ$   D$Ɔ    Ǆ$      J    $     8FW   8C+   L$9y   CAS4t=L$C"T$fA"fA$C%  	A3CfC"Ct3@ 9x4t'KtA8$<tIu   f9A2L$ECtAC    HB   >T$B   1D$3҅EPDQjV[T$,t	I   \$ Ƅ$    t   r}$  t   uBulPL$j~W D$   u	u#~H׋1PFt
PP_^[$   3< ]ú   F@   Ft
PPh-hPB hhějw$@     _^[3 ]̃SUVW3E4ЋT$(D   ~+   N4   ыB9x   Ru~43ۋy;uN4A      A  υuԋC HuHFsуD$u`CF4CD$uN{KL$Gu"GtwЃ׋|$GL$|$tQ@ЃӋF   uFu	֋N|$_^][_^]   [̃UT$l$  D$   S3ǅ      9|     VWD  4Ntt	QЋ~FF    D$uGnEuEtuЃՋl$*Fl$tW@Ѓ֋Fl$D$CT$;|  s_^ЋEǅ|      []QSUVW3ҋ|  ~9  u	B_^][YÅ   F D$9P8t3Ʌ~  90twA;|ЅuZD$v@8ЋЃuE|        4|  FtL$9QPtG~PvAPЃЋ_^][Y_^]3[Ỹ3L$SډD$\$9     UV3Wfff     ;|       4~V   9   FÃ ttITIXD$$IP@FڅtD$$9F~PRы~^D$FD$u@GuGtwЃ׋|$0D|$tS@Ѓ֋D\$D$EL$-_^][̃D$$    D$    SVW  8
  @,   x+   @4tfD  90t@uH@H   T$RT$Rw t$$QЃ   O tQAu+ʁ?Y)j St	,GU@ttSj V ^(GF~G fF ^ W u3ʍyfAu+ρ?APRS& D$FD$NF_^[Ë_^[SVWFtE3ɋ   ~  ;8t?A;|       RP(Ct     <   _^[Ë_^[H̃SUD$    VW} M 8D$L$ 	  At	;A   j j@t	E>   j@j Vy ED$u։A3_^][ËȍQAu+j AD$Pt	bE>؃tt$t$ S u֋BA3_^][ÉuF   F+G@N   F<fF D$u39ȍQAu+j APD$$D؃tt$t$S L$S0L$j  D$u39ȍQAu+j APD$$pD؃tt$t$S S\$֋D$֋PD$$pUtKt$VhESXyt	֋@Ut$J @     uBuGE    _^]   [ËD$@\_ QVW|$3Gt
PH  u;D D$tKt>t1MD h-Ph   hěVbnw@֋v@@ 		D$AGt
PP_^Ỹ|$  SUVW|$t4N;NrjpgNNpAtAT$(~-NA;Nrjxf3F3ۉND(
3ۅ  FD$VD$,T$ , Vt%
A;Nrj|lrf
F
D,G(u0hʍyAu+ρ?~;~r,Q,f8u,{ɋGɋ@ȅu3ʅtFQ+~RPB T$(C|$;LFD$~|$ȉ|$L$0؋~IA;NrjLe,FD) ^n\$ l$\$l$\$0l$ˋD$B;rT$4jWeD$4N DD$(~6D$0D$A;rjxe3D$3FD(
3   t%A;M rj|ld
FD,B;U rj MdN MDD$(G;|~2D$A;rjLd_^][ËD$ FD)_^][ÃSUVWl$ ]U2E D$T$fu
E,0P  N;Nrj|dT$F (  Nf|3D$   l$D$fExuhu,{Eɋ@ȅt4N;NrjpcNNpAtA;|$SBPVujG;|$wl$ E, tE΋T$hWWP   E,tE΋T$hWSPNA;NrjLb_^][ËFND)_^][U    3ĉ$   SڋыMVWBt3T$4E     A<yP@Ë_,D$$BD$0    2  fM %  Ã0D$(u   uf9ww	u3      t$$D$<T$D$ɺL$0D$d   DD$ ʚ;PD$D$$    hPfD$0 h      D$$O L$(@@t!A8$<u3Pe9D$,D.  .   t @  tԐ@DL$;L$rjL$Da"L$L$AffAAD$(0D$VPhL$   tih,{D$hPgt=   1|$(0uh,{D$h8Pg<   <PD$hDPgtw$D$whLPvgD$$@$tD$hhPZgt$t'D$0 |$ vD$!uL$ at$\$0T$4{l   9{pj RW   +GClCh   |TD    D    ǀyW t%V苕_^[$   3f ]ÅyClHCh| t&jVЋ蝖_^[$   3( ]Åtp@_^[$   3 ]Ë$   3_^[3 ]U    3ĉ$   SVW}L$,D$d   D$ ʚ;G<D$     fD$$ 4Bv4AD$(D$0D$VD$D$htPe_PC,   tEFH fx"@4ȍD$hPse   D$hP\e   s2C;   @ S Bpuhu,{Bɋ@<C2;~:L$ ;L$rjpL$]pL$ L$AtAWD$hPdCF;qL$ A;L$rjLL$]D$L$ D)|$t'D$ 8 |$ vD$%uL$-^|$\$(T$,sl   9spj RV   +FClCh   tTD    D    ƀyW t%W踒_^[$   3蓯 ]ÅyClHCh| t&jWЋʓ_^[$   3U ]Åtx@$   _^[33 ]V3B
Wu`@ ? t@tOOXG\#J(#B,u?tB
   t   fB
fJ
JxBIPBuFB
t_^̃SU3ۉD$\$VW~   3퐊<uG<uO
<u%OA8~ttt)At(D$Ί<@~0@~-<C}/C}*\$D$AC\$;\$|_^][Ê@<At֋D$΋\$+tU$T$SVD$0Et$Wtj j ЋpT$؉D$ 3ۉ\$ ~W   C3M3@D$$C@D$A0;'  \$fD  A8M9   @L$$HD$D$,L$(   uы =P9W}Q!"`pAAD$(AD$,T$     D$TuG AHL$,9N}R "`D$,pAAQD$L$T$D    EBMT$@0;\$ D$$tL$$D$tL$$CpCxt">u~F    St	L${CP0t39~J     3Ifq@;|_^[]U<S]VWT$(
|$L$$wt$4<5j  <-b  <2uXNl}9Npj Wj K   x  AFlFhK   D    |D    D      SP3ۋ}D$,   T$B,   \$uB t@8t39ML$0ED$03~#R8tt$$91t$4   @;|T$z0M;}+B8+t$$    KR90Eˋكut$4T$$3D$D$ J     B@8y  z          J<uA<uA8)T$(ME_^[]<u
A@8   L$;j O	Wt2%,D$tWj P D$ T$$L$ QL$Pj j#*|$0D$,|$   L$D$RU9P|$LD$8W upD$<    j Wtq2+D$tWj P& D$ T$8L$ QL$Pj j)L$0|$DD$,D$$L$HD$8t	Ћ|$|$,u439D$0D$0)L$D$ Pj j j?)|$0D$,|$ŋD$0Nl3҅   9Npj j W言*AFlFh3fT|TTTTL$UI,   zH uD$H8@8B} ~A,   u   A,BHD$<ËZLBHD$(L$@@    T$DPQ
	1t:L$DALD$@GG    yLttsSW- ExL]{L4  D$<L$U@A0;  }    D$ +D$8D$D$<+ǉD$DA8L$ L$$9R  |$,uNVl9Vpj Wt$   6   BFlFht$   t|D    d|$ tL$<L$<3VlD$@9VpWPt$^   ~3BFlFht$tt$@^   t|t$4D    SNl9Npj j W2   w~/AFlFh2   |D    D    D    L$DU;u*|$0 D$C%~D$8CK
3ɉKD$GL$DD$ L$8@0;ȋL$t]~bA,  uYNlS9Npuj R}   }7AFlFhTU}   D    TD    CH    D$tЋD$t*}T$(KPA,    t   fBu_^[]ËQuZU,L$D$SVPPq,T$$WB2y^R D$D$(|$0\$@D$$ED$$D$4ƉA,	kD$,u3ɉL$KȍQAuD$ +j qVt-ȉL$&ȉD$tVt$0Q D$f-  t$OlJvӉt$9OpRSj K   3|+AGlGhK   D    \TD    Ol39U   9Opj j V{*AGlGh3fTtTTTTWlT$,9Wpj j j    {D$,3BGlGh   D    D    D    D    }    wl   E9wpSj t$ 0{7FGlGh3fTT$TD    \D    D xW uGh\$Ӌ\$DTD$pWlxW tIL$,BIGh3Pf9t$tcfD  Ol39OpRVt$ ^   sz/\$AGlGh\\$^   tTD    L$F;|D$D$;D$$  D$(ދL$ Su@8Vt$(.Ѓ;t{|$4u(L$t\$ C<s   Cډ\$POl9Opj SRP   y/AGlGh|$0P   T\D    D    \$F;t$$OT$+ڋL$\$44D$(@8At@                  @D$fQ
udtUD$ދOlP9Opj RS2   x/AGlGh|$02   \TD    D    D$L$ y$ u:<@~@~<C}C}@<AuAL$tAL$F\$4AT$L$;L$$MD$_^[]ËET$_^[]USVWڋT$rO4t$Nl9Npu   j uwT$2AFlFh   D    D    EAEA   fG,   BtʅEȃyP    C
D$j @"4   Vte(!   Vj W L$3A"C4H~$CpFfx2L$tC4H;|܋t$yW tW_^[]ËFlHFh| tjWЋ_^[]Éx@_^[]UQSVW   <uB<uz<   zG8   B   tcs2}ЋNlO9NpWuRP   Av_^[]ÍAFlFhP   T|EA    A_^[]39u~0EˋPuF;u|_^[]uu_^[]UVWj j<Ot&ȃt.G@HGHHqAFAF A(F0A8_^]ËD$3Vt$Wxw7UuNtF    tvu֋azFGFfGffF    _F,    ^_3^Vt$>ugD$WxF;GuRF ;GuIS֋V N,xC";}CҊDDFGFfG[fF 3_    ^_3^3^̃dVq(L$uA8     AWD$3SUl$xD$8D$43ۋD$tD$@E fD$fD$$fD$,T$<l$L D$PD$f;H4z  Kt$W@ @XfuJT$<fL$lD$\0D$`D$p      L$X/f|$l    D$$
|f   D$@H       tA 8 t	 @8 utD  @8 uP@+
2;      |$LD$$@
U\$Ht	L$ 色}t)7~ f     L$ 5uN}t)7~ f     L$ uNt$L$Ct$A4;؋   _][^dxx+uB&̃SUl$VWD$?,uOUD$?,tu39]~.@ F
u3PWufN
D$C0;]|_^][UB0SVuFT$ uW|$;o  ^[@      {4 SP4  fz2 )  MB#
#E  ECB,      B8GuG,G,ȈG   Pj j SRwȋC4D$L$VlFhD$9VpQu?   t$pA|$BFlD$ |}||$||$?   D    D$D$xW 8  D$ D     rD$Pj j ӋLD$ ΋D$$t$L$ыL$tGv    ?AJFG~|A
J~IRWj RV`   sD$,|$t	wK4L$ VlFhD$9Vpt$?   uQoA|$ BFlD$ |}||$||$?   D    D$D$xW uD$T$ TDuC4    C    D$$F`u@0;_^[]U   D$h    VD$U W}D$dJXL$|t$$GPD$ G<Bȃ$   @,D$89   u	   3J     ;~!M  t$891t$$   @;|Wf$   $   $   #M#UOXMW\}APQTh L$UD$0A8HA8BBD$<A8HA8z< $   B   $   @$tsQ,EBQ,Nl9Np0j Rj G   mI33 C3ʃ@CRAFlFhG   D    TD    D    υ~+U8      x u8 uI`IM  $   |$\@(    NlxP9NpRj W
   *m/AFlFht$$
   |D    TD    Vl9Vp'j t$@   WlMЃQDA=S  BFlFht$$||$<   |D    D    MQDA=  D$ P,     @0D$<Hu*L$AuA,A,ЉD$(KȈA   6D$Px |$(;+ы|$WT$(G @,PL$A,T$(E3@D$\9|$<   D$ T$@8L$   A#  wϸ   L$3t$ F(t$$   D$t$P(T$RBF(@,΋@,D$Ot$(D$ǋNl9Np\T$RT$PR   CkT$D$ G;|$<PD$ Nl|$(P9Np  j WRG   k  T$AFlFhTT$   TT$TD    뇍:ыL$Pt$4WuE@D$\^:L$jPRD$ xJD$ u^@tXENl@P9Npj Rj G   	AFlFht$$G   D    TD    D    T$AFlFhG   T|D    D    NlW9Npj Rt$DG   i3|$<AFlFh||$(G   TD    D    L$ AEº   Pq$Wt$ht$HmD$4L$d`yW t@$    UMD$8B@>   y2    E3ɈB=FlBDL$9L$<  G|$ D$D  G8T$`sfG"ftM$  L$B  w	   3G(  D$dxW   MD$    yH    yLpW@ yFlHtI	Fh^uD$D$9AuD$D$9At$$tL$EAL$;HH|eAyIL$NlD$H9NpL$WPQҋg6AFlFh|D    3@ fHL$HL$HHD$j j4t>j4j Wk 5fG"L$   9G~Ph(WQMD$dxW    D$`H P~
BTL$dj j5W/D$HtPj4j P L$TfA"A4A  D$D$A   OAEjpWt$oGD$dG    t	׋i|$ L$AL$;L$<)    D$ L$0@8D$@,x,WQj uȃL$;ttT$B<s   BEx@4D$H   Vl9VpQWP?   f3BFlFht$Htt$tt$$?   |D    xW uFhDD   uUuL$WuL$$Vl9Vp   QWt$@   ~eE@=3MD$`@ Ad3ҋypT$,D$HL%       3D$G
ȉL$X%  EHXP\G,$   ##O(ȉ$   ~"  MT$,I4$  BFlFhT$8TT$   |TD    B%  =    3D$       L$D3D$, tD$ D$   @88L$tD$ L$@8L$DD$0t|$D*  D$4L$Q<uB<uB
<uUB@8~JT$BuB,z,ȈB   QL$jW6L$ @D42L$D$HPbM׉D$`nL$|$HT$`DNlD$9NpRt$@Ћt$@|c:AFlFhTD    D L$3fHL$8HL$<HL$t}A<sv   AgNl   9NpL$\j Qt$@b:AFlFhD    D    3@ fHL$8HL$\HL$D$D   8A,A,jWPD$O<uA<uA
<uA@8
<8t<6tD$0E6   D$0E7   D$,uQuAuA@8}ϋT$D}|$0 NlOD%|$,   G=D$8G@rD$@,Nlx,9Npj Wt$@   a/T$8AFlFh   T|D    D    NlT$,9NpL$Wt$@Qpa6AFlFh|D    3@ fHL$HL$<HFlS   FhfT   g  |$ D$x    D$,    GOD$lG3D$<3D$4D$D$D$(D$D$ L$@ D$pE@D$TD$P t|$ G8AD$x   T$ B8R;G׸   L$,T$HfA
   D$}@,P,W,Nl9Npj RjG   3`/AFlFhG   D   TD    D    Fl3ɋW,G0ҋD$pW,|$P@<E3L$0ʋT$HH,|$x u8|$pL$PGHL$HxGɋ@DtL$HuD$D$ @,0         D$   MD$@,9 P,T$(Q$tVNl9Npj Rj WF8_3AFlFht$$G   D    TD    D    MD$H8@8A(L$pD$f;A4sHA3ɋT$P89L$0u3D$,L$xT$<D$xD$D$D$lL$,D$ L$lD$<} ~aD$ @,   tTNl9Npj j t$\   k^3T$TAFlFh   TD    D    D    UD$DL$PWt$8|$\ЋD$PT$@tkf|$< tcuD$4YȍQAuD$d+j yWt	D$4tD$DW|$TPD$<P
 |$PT$@|$( Et	H(L$L@D$LD$xt@(D$h    tD$h   L$,tA(D$\    tD$\   uEf9D$w>D$t|$   NlD$h    9Np  j Rj K   ]  D$t   |$t xD$lȋD$P|$HQL$P$      fH
tDFlxW tIIFhHPE@,E@,$fD$x@
ujUt_T$PNlT$@9Npj t$PR2   >\7|$HAFlFht$$TT$L2   TD    D    L$DtD$PPD$pL$lD$<uG<uG
<u!G@8~L$D$h   D$    T$xMTL$D$ ~   |$PAFlFh:|$( ωL$tbNl9Npj Rj K   O[3AFlFht$$K   D    D    TD    OD$t   L$|$T$D+ǉ|$l|$@tD~:AHGB~|A
H~PRj PD$`   WHR^L$$D$ @2ft;  T$(tMNl9Npj RjG   uZ/AFlFhG   D   TD    D    Ex4   Vl9Vpt$@?   t$PWZ3BFlFht$$||$L||$@?   |D    |$LxW uFhT$PDTuUuL$WuL$hD$tAL$0AlL$ T$D$HA,      u{D$p@gfff	VlT$9Vpj j W|   2YD$/BFlFh|   |D    D    D    D$HT$~l9~pt$@Ћt$Pt$\X:GFlFhD    D 3fHL$THL$LHL$@HxW uFh|$D||$D$(   NlQ9Npj Rj    KX3|$AFlFh   D    TD    D    L$0   Vl;nD$9Vpt$@Ћt$Pt$\W=BFlFhD    D L$3fHL$THL$LHL$@HxW uFh+|$hD|D$(T$PL$,|$  |$ HL$ht	}FlGDD$<|$@Pщ|$xL$WzD$4   fH
tDFlxW tIIFhHPE@,E@,$fD$,@
u\L$htONl9Npj t$P2   WV/T$LAFlFh2   |TD    D    |$4tpL$<ыL$hWD$@ȋtL$tD  ?AHAGL$t~|8A
H~ PWj PD$`   $   HYL$<|$L$h<uA<uA
<uA@8~
D$\   uT$,Mrg|$ t`u[|$@Nl9NpPWPPKU/AFlFhK   D    |D    D    |$D$\    GD$DtL$dFD$4tL$d3MyD uFlAD  D$(tSNlQ9Npj RP   T3AFlFht$(tt$$   TD    D    D$\L$0VlH(D$9Vpt$@Ћt$Pt$\T=BFlFhD    D L$3fHL$THL$LHL$@HxW uFhD|L$t#VlyJxW tI	FhPD$(   NlQ9Npj RP   S3AFlFht$(tt$$   TD    D    D$lL$0VlH(D$9Vpt$@Ћt$Pt$\jS=BFlFhD    D L$3fHL$THL$LHL$@HxW uFhDD$lǉA|$ G,   tRNl9NpD$P}   PPt$\R/T$TAFlFhTT$P}   TTD    G,@   EtfP,uD$D   H  T$pzGu%|$TWt$<JD$D         L$83D$D;L$T\  D$DtD$DfG8$<tuO2u,L$AuA,A,D$4XȈA   D$4CT$B RD$4;t$+щF Ƌt$$PD$@,PL$T$4A,T$pG2D$H    D$\    f9D$H   D$4D$T$pR43Ʌt4Gt$\pD$HD$p@f     t$Hf;0t$$t0A;|Nl9Npt$Rt$\^   Q8֍AFlFht$TTT$tt$$^   TD    T$\O2BD$T$\;EVl9Vp"t$4   $   t$@P:BFlFht$8t$   tt$4tt$$   D    xW uFhD|   |$TL$8E8 u4EfP,uPыL$tWD$pH$tt$|T$<L$ UA,   tB=|$T   룃|$0 %B=z@A.$B>A,uB?|$D !  3D$p0    [  L$D$4    D$    D$P    A(I8y,$   G@y,A(A8D$T$   |$\D$    D$(    PD$ T$h@8 D$H@D$tEx@}@=CG0<W  L$d+EHD$`j P   Pt|$tD$tuEU_^]ËT$`BG$    G@G@ G(@0G8~@@EfGH@|XOP}ǜ       `IHADAD AD0A~D@fAut$$T$hL$E@,  B   A,~lQ,FpT$|$0D$@93j Rj K   MD$Np@,@,D$Pg  GD$l똍AFhK   D    TD    D    D$~lNp@,@,D$P  ztG8$<tuA(D$@A(FlW2D$0FpD$@9j Rt$v   M3AFlFht$tt$$v   TD    D    L$׋AD$`OFT$`
yW t,WWD$~l|$0NpL$@@,@,D$P>BlBh|~lDNpD$|$0L$@@,@,D$P~lNp|$0L$@T$`9j t$`G   j 1LD$`2BFhT$\G   D    TD    D    Uzd  33L$Bp8;D$HtM  fp
t$u>?  fHL$t/B  @ u&L$dj j >T$0PbL$ D$(D$(UA0L$;Jd|t$$}   D$j j4VtRj4j W ,fG"D$(ωG@%@ 	GML$   9G~ Ph(WQ@1D$T$(|$(|$hjWP$   3ɃL$<9J   Ǆ$       IBT$89Pt   fPtOD$D    tL$dj j L$D3D$d|$XxW t>  ׋|$L$<D$tAL$<;H|     3  D$(txAPhjt$P$   $   j j j j W|$0  (D$x&  T$l   j QE@,  D$t|$<@H;DD$h|$@  T$0D$@
9j t$T   t$@]I2AFhT$8TT$P   TD    D    L$0D$@T$D9!t$P.   j t$HЃT$D6|$BFh||$P||$.   D    D    xW uFhD||$T$0D$@
9  j t$X	   t$dzHT$<  $   H2D$ |$,u0L$AuA,3Q,T$Lb3A   T$LKD$HP T$L;t$:+ωF Ƌt$$H@,L$PǉT$LA,33f;D$ s4@ ΋T$hP$   @xPt$@T$XG;|$,|ЋD$   L$0D$@9|$D98"Rj t$   oGT$XD$D2GFht$tt$$   D    TD    xW uFh|$,D|D$   D$0D$@9t$Pt$0Ra   FT$X2|$0AFh|$,||$Pa   T|D    L$0D$@998 Rt$T   t$FT$X2T$GFhTT$PTT$L   TD    xW uFh|$,D||$ tD$0 ~   Fhf|f|$ u)W|$G<L   G:|$D$,;G)GW |$\AFh||$T||$	   D    D    L$Dt"yJxW tI	FhPD$xL$P4E$   L$P  A,   t;|$< t|$49y |$u't$hFt$$tA @8$<D$xt	I L$4D$4    tMI4Q     u3&WyJlIxW tI	Bh@   D$XSL$d@C|$>WyJlIxW tI	Bh@M   D$4AHt
$   AD$(tL$d@    |$0L$`yJxW tI	FhPEPD$@9j Rj    C2AFh|$0   D    TD    D    NT$TҋA<A8yRKI@}GDEx0vD$ltL$df|$ T$H $   @(@L$0ULB=D$8B@4VlD$9Vp(j Wt$@ЋBMЃBA?ADdBFlFh|D    D    L$@ 3fHL$8HBMADA?D$p$   T$H$D$XX   B>  t1  MB$9   u	   3R     T$X;~%  T$r$91t$$T$X   @;|Wf$   $   $   $   #$   #  G
T$ȋD$`   EWǄ$       f$   f$   @$   D$p$   $   $   Ǆ$    Ft$   ݀G
f$    t1   T$,  33 C3ʃ@C1у}+Щ   tT$,M      T$,      tsEP,tiNlD$XL$9Npj j P@D$:AFlFhD    D    3@    fHL$XH@ j$   t$ t$pIL$$t&VlxW tIɍBIFhPfO
T$,MD$H0HD$HypT$`AlD$4  wF      f   L$89N   $   @$X   FыL$|j h   uD$duvI     G
u{Gt@   t@@8_j$    $   @$   @ $   @0$   D$`@$   $   Pt$HfO
|$4O0|$4t$$MA8D$  A<E@D$   @   T$Jz |GB ABB,xB,EWNl@D$X9Np j RP   N>D$   (  AD$   FlFht$Xtt$$   TD    D       xt    G8$<tuG2D$Hu$L$AuA,Q,UȈA   DD$P @T$DD$X;t$F D$X+΋t$$AD$@,PL$A,T$D3ɉL$|9L$v>BD$X$   PGHPt$@c$   D$XAL$|;L$|ʋ|$DL$GVlT$	L$X9VpPj Q   <ЃT$6BFlFhT$XTWTT$   D    D    xW uFhT$DTT$Nl9NpWRGa   Pq<.AFlFhwtt$$a   T|D    D$NlL$X9NpGPWR   <2AFlFht$$TW   |TD    L$XxW uFhT$DTD$NlL$XP9NpGPj R   ;6AFlFht$$TW   D    TD    D$XT$yW uFhDTFl~   FhfTT$FlD$|D$yD$|HyW tI	FhL$|BHut)L$A<s   AL$;Q~Qy ET$X   M~lAFpD$|9j RjG   :FhD$8AVhT$T$XG   D   TD    D    Ex8    @8׋ωD$`'FhD$NpEVlL$|ʋ@8D$`   @	D$HD$|9T$Hj Rj J   95AD$T$H J   D    TD    D    L$`T$ABEM3qp9yl~Z	fD  EF
u=UN(#HXF,#B\ȋT$u&$   @$@uj$   6RbBfN
EG0;xl|M_^AXQ\]U    3ĉ$   T$WfD$,ML$SA8D$<APD$,A<VW{3T$ B\$0|$@t$ȃD$,@0hjS>OlL$(9t$  T$ D$8  t$<\$T$D$OlBL|$	xp|$|$@t$29Opj j V   (8/AGlGh   tD    D    D    T$BD$8tUOl9Opj j P   7T$(3t$8AGlGh   tD    D    D    t$`T$\$03L$T$T$8L$(L$<D$,@$@W  D$4D$4    PHD$ T$L$xd /  |$3ɉL$8Pp  fB
t    f9B  L$#J(#B,  B  tQQpD$3ɉL$T$u    F%   =    t%   L$=          L$   ֋tT$i3T$Wt$(L$   Dj t$F4P(   j4j Vv fF"|$ u%D$  F F   E	N   F4Ff 0 F      j j4D$tmj4j Pqv T$(L$ fB"D$B,	@ rJJF%@ ʉB萴t$   9F~)Ph(WST$t$T$ D$4L$8@0D$4;BdL$8|$@t$L$,T$HD$H   D$L   j h   j D$\j Aj VD$xA $   A0$   ~A@fք$   Ƅ$    C謫  D$8  D$$S,BT$ @D$D$8S,@ D$@D$,@D$$@uhOl9Op#j Rt$   04D$      t$AGlGhD$   tt$   TD    D    hXtC8$<t[uC2L$0D$H|$ A,v63ϋT$$PCpPt$T$,F;t$|׋t$\$0ًD$(T$DRL$,9Op"t$ j R?   R3T$,ȃL$,:t$(AGht$TT$ ?   D    TD    L$,xW uGh\$\\$0DL$(D$D	 D$$L$49OpRt$D   P2:t$(AGht$$tt$@tt$   TD    D$4zW uT$GhDTD$( D$$HD$,IȀzW tI	GhL$$HD$DL$(P	@D$$9Opj RP	   26\$(AGh|$$\$0	   |TD    D    L$83  t	f   uK   _^[$   3sY ]ËSyJlIxW tI	Bh@K$   _^   [3/Y ]USVWO9O   GD$D$ IȉD$T$    PQЃtD$HL
L$JB    PLWu%EttL$^D$G3_^[]ËG@PD$PR GGW_T$RBىGfMfL$uGt1F   t(FRPM+T$$  f+fL$fC   fCt# F   t   tFpvu{W3fK
C_C^C,    []U,SVڋW3t$$|$CL$(|$,   SWjPD$</zh  P\  |$0HffD$ Al$ D$D$!D$l$}2ɈL$<C@08u  @L$  x   :  :L$  E҃CXPT$0tL$C    t[uD$<   D$(@ %    a  C Q   ЉD$$wt$,tKN?u9%  =  u~u	~|$t3|$.%D$D$$PD$     |      l$H   l$<u  {|$  3  L$d$t$:t:t:tF:u<> tF>u  |>  :  :u|> u   3MO@ Gu+L$(?j G5PRȃL$B  j4j Qn L$(fA"A4uAtWt$Pq L$(A3҉T$  yA   37 ~$D$D$ 9;D$ uA9A:B;|T$ D$04: 8u5<Bu&D$0@      @,   x+   T$ jRT$8C)L$ u?-tFT$0jQN~@T$L$(\$,t"   fCu{ tK3_^[]ËL$|$E   D$$pC     |   HE   8 tvCx tmL$$AuA,y,ȈA   W	NlxW tIFh     tL$$A<s   A|$\$,3D$0$   fCu{ tKD$0_^[]3̃SUL$VW]   ]   ;   C8uw@,tpx+uj3EЋ4+
;u0u>D$_^D$K]D$K[   xx+uBG|L$s>uiF,tbx+u\@4t9t@uH@Ht>T$RT$RujQЃ=   |"L$_D$ KD$0   ^][_^]3[À4t
t3uu3ҋM>uF,tx+   Dׅt9uA,tx+uBȋD$ 0D$$4uD$_^] D[ÀuD$_^] E[À3uL$F_^][U\L$0USVWxRL$@D$,j 	\$<L$4T$`|$\D$Xh  tt$D$	  h  j Vqi fO
w h  j VVi D$T$Tj+@	 @    @    @    @   p$  T$L$<]*  D$0xW 	  L$T$4\$D$AqD$ D$Dt$Z  fD  B  FȉL$H    L$0Wj h  fD$P  fN
    h  ~WfFFw j VfD$,Jh D$8ϋ wt$G	 G    G    G    G   j,}#  L$@O)  D$,GD$0xW    _   L$$D$ L$D$  <1t<5r<9v<2t<-tf{@uwL$8S9   u	   32     ;~  9t/@;|WfD$`T$dL$`D$ L$ʉD$ L$33 C3ʃ@CӋD$ 0Xt$\$\$L$$D$ T$4|$L#ЋD$H#ىT$4\$|$ D$]  |$LD$HT$4|$ D$D  F
ب2  L$8V9   u	   37     ;~  D  9tJ@;|WfD$`|$dt$`tD$@@D$ɋ@\L$89   u    3O33ƃ C3@C븋     ;~  fD  9tW@;|WfD$`T$dL$`T$4\$##߉T$4D$H\$u6t$WfD$HD$LD$ D$HD$)33 C3ʃ@C!t$!|$ t$\$L$D0It$L$D|$XL$     Ӊ  fGG  D$,@	y  33T$HL$DD$   @f9xt	3D@;H  xA|$40L$DT$H}  33|$4L$T$D$   @0f9Xt	3Dp;NvvA0L$T$]OV؊F

G
x>L$t>T$tÃf;t
Ã&f;u3ɋjpR}1L$T$Z3ɋjpRW1L$T$4ˍAt       E؋D$,L$  j j 蚲L$T$ 5   t3fD  A   B;uL$,jtT$0L$<P3	  |$8L$D$D$ Y  3T$|$H|  YAD$41         f!H
p
D$4x;tdL$89   u	   3:     ;~  @ 99tI@;|WfD$`T$dL$`D$4#L$#T$ u7T$  0D$4z_^[]33 C3ʃ@C빋H׋    L$DT$@D$4tz9V
t
  f!W9NuPuVL$@jPRq/u2NI诓ND$XI蝓ȋD$Xt;uf@3L$D0D$4T$yD$HL$@D$H  D$33ҋXx   G
@   PtL$0j j ]3ҋD$8L$Xu	EH9NL$HL$X}	R_"`D$HpAAQP0htL$0j j ԯ3ۋD$@j j4   j4j W` 1fG"t_C%@ 	GL$@   9G~Ph(WQL$TAt		GA$G$\$,jˉwXL$@V  CvMҋt$`LKfD1fDCD_^[]ÅtD$@ӋtL$0薿_^[]Éw_^[]SVW@P   <5t<-   G   OMOC:tC   <C   G   t_W_WB   ut	C   u蚒uӋ荒thxPt_W΋_suxӋ_u@0+
;uu3_^[xx+uBѸ   _^[_^3[̃4SUىD$W\$fD$0VW  l$<t$8l$t$H W@L$,D$(fD$0tI398~Ct$4hD$0D$ U   L$ mGD$(L$ ;8|ދl$t$(t$D$(D$4L$0D$Wt$l$fD$0@(D$(tP398~Jt$4hD$0D$     U   L$ mGD$(L$ ;8|ދl$t$(t$D$(D$4L$0D$Wt$l$fD$0@0D$(tC398~=L$0ht$4L$ U   	D$ mD$(G;8|l$t$(t$|$(D$0|$4D$ D$ˋP$c  D$ D$ˋP,K  D$,t$l$   8 D$        x0|$(W   t$l$uW  t$l$tjGWD$0fD$8t:390~0\$<xl$8L$$  D$0F;0||$(t$t$\$<l$8l$t$\$$l$D$ HL$,@D$ |$(;AD$@4D$}Ƌ_^][4ËD$8T$<_^][4̃D$SUVt$W3T$uvfGwrwT4DT$p   l$$~(    33f;F2   3fD  Ff<xukF(Dt"H   t   t@@@uދՅt% J   t   tRRRut$3Pb(t%F2G;{vP3_^][ËL$D$_^]   A[QSUVt$W<uD$$6|(9#Fp<uFF C   _^][YËT$|$t'ʋǃ##uVWRӋ`_^][Y_^]3[YUtL$,SVWWD$fD$xD$@    :D$`    D$\    |$4L$(D$ yW R  MXIىL$  \$LL$$3    t$Vt4  L$$T$HfD$pD$tD$HD$pD$XD$D$p1   ֋  F   NFL$ D$dt#L$$kȍFK S$L$XT$H  WfD$Ptk8 ~f|$Tt$P3ۉD$hL$$%  L$dD$hCD$h;|݋\$Lt$,t$L$,|$0T$0|$4FK S$L$XT$H  L$PFT$TK S$L$XT$H   Vt	  WfD$hT$lL$hK S$~ t#F  FD$ u~ uL$XT$H   >FD$  ut upL$$V9Qu   F3      9A~ 9t'|$$@;G|$4|WFfD$hT$lL$hH33 C3ʃ@FC.   tWfD$hT$lL$hL$$  ȍFD$ \$$L$,T$0; \$Lt   f	{
|$4 D$dS  |$$F$D$P9G   |$4u
D$<    X\$$9C\$L~6|$$|$h|$4t$h\$P9\$Lt$t|t$$@D$h;Ft$|WfD$hD$lD$<D$hD$PD$dtxT$<ȃL$LD$dD$<L$,D$hD$LT$0;D$<ws   D$L;D$Psc   33Ã C3߉|$<\$P@Ëߋ|$4C؉\$<\$L끉L$hD$h;D$<rAw
D$h;D$Pr5D$88 ~@,@thȑW_^[]Ë|$ D$d|$4D$|D$hD$xD$d3K(fCD$S,CC<1  <5r<9  <2  <-  0  D$x,  FD$\    D$p\$(tj j XD$`D$`    Vtj j 53ۋD$\j j4̼D$s   j4j V,U D$fF"D$`tF@%@ 	Ft^C%@ 	FK   9F~Ph(WWBD$  t-	FD$@$F$t	舠D$`t	w\$jxL$<V7KvD$ ҋutt$NfDfDFT$L$\t$AL$\DD$pD$p  +u#uT$L$<L$Y\$  D$3  FD$p8  fx    D$    L$(j j4D$\t"j4j PS D$h yfH"@   D$ptL$(j j >3j j4D$hD$Pttj4j PCS L$\T$h6fA"tQBQ%@ 	QD$`tA@%@ 	[   D$P9H~5Qh(WWN D$`t	訞T$\t虞D$PL$h   tw\$@L$psF     F$    AFA MF   fFCLKD$fDfDCT$D[fK
C(K,F(N,t$D$<5t<-h
  FuP  P  uˀx,uōD$\PD$dPD$HPDtFL$@@D$ptj ыL$,j |L$HD$LD$L    t$\t[xW uS   3f	C
Yt;|$@эv$ "D3D$LHxD_3u͋|$4t$\L$(yW u]D$LPu3ʍYfD  Au+ˁ?D
\$`t<@D$`    D\$`x\$XD
L$(D$`D$X@D؋D$p\$\tj j oD$`D$`    NFu+?v_F5j P؃tIj4j SXP qfC"C4CVt$`Pd C D$`K "  C   C\$`j j4:|   j4j VO 9fF"D$@tF@%@ 	Ft^C%@ 	F   9F~Ph(WWD$ \$ t-	FC$F$"t	TD$@t	C\$L$h  ?T$L$8D$`PD$ttL$(j j D$PD$P    t$\NFu+?vkF5j PD$ptSj4j PN L$|Vt$`fA"A4PqACc L$|A D$PI "  A   AL$Pj j4豾|   j4j VjN 8fF"D$LtF@%@ 	FD$PtF@%@ 	F芌   9F~Ph(WWD$  t-	FC$F$"D$Pt	ǙD$Lt	趙֋t$h  L$<։D$pPq\$ F؃|$X oL$`IM҉LND$DfDFL$DD$pM@F҉LND$DfDFL$Dvt F    tvuD$@D$`t@    t@uD$`T$XʋC$#K #D$HD$\?  tD$\   C~
Ftt$pL$<Vt$PRT$PtMD$@CD$DCD$<1u   (<2u   <-u   L$p   If#D$\fC|$-   uf	C
D$`g  t$pL$<T$DPs$s XD  D$`@ 6  { D$P       \$(ˋT$j j 躚{W t=  ֋讗_^[]Ë\$j  M@CD$pHKD$fDfDCL$D|$-uD$p   f	P
[fL
ًdt   f	CD$Pt$\$pV:   FD$L8z   B   u&t@   t,~ȉL$`uT$L~D$`VFD$LB   u t@   t}uT$L}9D$`tv   FNFN<6r,646T$pD$@L$HL$hBD$DBD$XD$dB D$,B(D$0J$B,1u   D$P#D$\fB2u   D$P#D$\fB-u   D$P#D$\fB˸   fD$P#D$\fB|$2D$  D$pխt$L$ D$p    FtT3C(    C,    fCP  @PT$\  FL$L$uHL$L$|$u@|$x  @@9j  F@   tF@   N  y,D  3t$`D$RVP{t$dϋVt$(Vf$   j j4D$*޸   j4j VH D$fF"D$ptF@%@ 	Ft^C%@ 	F趆   9F~Ph(WWD$  t-	FD$@$F$t	D$pt	\$h  L$<Pt$dT$\Ft$`;C    T$fL
fL   |$1   {    F8   D$ \$       Fx4    xD    {,  T$3N<uA<uA <u
A@    ;q  h  ֋ KGӍ4@P|L$<CMT$LKfD
fDCt$Dv\${,  L$(D$pPD$dD$t    PD$D$h    P  \$pt$`\$Xt$\ HD$PtL$$  T$`WfD$xD$|D$`D$xD$ptL$$  WfD$xT$|D$x#D$p#T$`6  tL$(PPʔ3ۋj j4tNj4j VE .fF"t^C%@ 	F   9F~Ph(WWt	bD$  ttD$N@$F$\$jHsL$\@D$pF D$`F$AFA MF@   fFD$FCLKD$fDfD
CT$DK\$XfI
A(I,F(N,t$\T$Ƌ؉t$\D$P\$XG\$T$CL$d	H L$h	H$_^[]QS\$VWfD  t F   t   tvvvu_t!8uVSVj %_^[YU$    MD$S Vt$W;   A   tqC-   tuzIT$wtjt$IT$D$    YtLt$ޅx>j j5  j4j WyC fG"G4  O   w<t$j j5~   j4j W7C fG"G4G  wG   j j4<tJj4j VB .fF"~΋G%@ 	F7   9F~Ph(WS.	萎t0֋t$j@ENA@   fAEA_^[]USUV WA~Iq@nF
ttF
0t~t	׋Y;t0_^][]̃$SUVWl$$} u,U9Su	   3,s   ;~K9tR@;|WfD$(t$(|$,Ut$|$t  t$|$Ut'     33ƃ C3@C밋ME   t@t   U[mML$(tm9 WfD$~HD$yt$3D$"  L$ED$(L$;(|ߋ|$l$$t$(t$D$(D$L$t$E|$M t	        E,WfD$@D$(tP8 ~Kt$xD$3D$   L$ED$(L$;(|ߋ|$l$$t$(t$D$(D$L$E,Wt$|$fD$@D$(tK8 ~FL$xt$3L$       	D$D$(E;(||$l$$t$(t$D$D$(D$D$U,ˋR(   D$T$(_^][$Ë׋_^][$U:VuqB ukR9Qu   3ҋ^]Ëq   ;~fD  9t @;|WfD$L$T$^]33 C3ʃ@C^]B   t	33^]^]Ut	N]Wf$$T$]UQSVWًwxV׋Py_^[]U$SVWى|$\$G(t\O@GD$ L$,tJ33|$(91~>L$P";}@ u$F;|D$ W0hSy_^[]Ëj j4$|$$tj4j W= fG"D$G   @,GD$ fw FG,BL$	Q<T$	A8tj j ]3j j4D$觭tRj4j Wd= fG"D$tG@%@ 	G{   9G~"Ph(WSD$t	j j40؃tdj4j S< 5fC"t{G%@ 	CT$$ˉSB%@ 	C{L$   9C~1Ph(WQ L$T$$	dtD$׋S|$ˊG$W,$HPMj6|$,D$,GD$|$(;8#\$D$ ̃SfڋUl$V
WzT$ǉL$|$ftY@ Pf;|L$ x##;L$ u;tUf;x#L$ #;u	;x     fuL$T$|$fsAAf
fL$(fH
L$ fL$(hfXf9H
~fH
_^]   [ÃIfHf;JOuf9X_^]3[̃$SUVWt$V^F\$T$lFF|l$ |$0RKL$;S2  9y  9A  fuoNRt# A   t   tAHIut B   t   tBPRuWQ3L$T$  ~v@}  il$,   tJ^s>Ht1@ f     A         tAHIu܋L$\$ŅF  ~        9~(O1kO؅   k<@   @   <C~   C}yAw   9u u3҅t9iA ~HL$(D$$9.uff;tB;|L$(l$,t$;Ӌ\$uADfA fDVHFL$$CwI؀@w?G   wt/G@H]j<@~@~<C}	C}AC؀@t!B|u
3B3C      twWwWB   ut	F   uku֋wkuE @t$v+f
;uKuYt$T$Bt Ht9uA;Fu
fA f;FHt2L$D$AFN_^][$xx+uB땋t$\$L$l$ T$|$0B0T$L$;S[3҉\$T$F:FsFr_^]3[$VNhF^:QD$SUVW|$$FD$F    fF F    VF    FF   G\$oXE ;ufVH_^][YÅx(EɊDΈFG FfVH_^][YÃuG(DΉFG FfFH_^][YËT$u_^]3[Ỹh 3ĉD$dD$|SU$   Vt$xWPUVR3L$ tD    p ֋X$#$   #$   uuH#uDL$uËǋL$t_^][3 h̃:SUVWL$  t$,B4Z3҉D$>~F t2ff     A         tAHIu܋D$B;|kl$  }6 &  }$   33ɉ\$f;M2  L$(UjjjS,  E 3D$ D$,98   XЅ   @ H   tL   t;HA6<t<KD$9ABfy  7   _^][Ë@uMtuAul$fH f;nl$u,L$9Hu#t$tgu@T$ @t0D$,G;8<\$E2;tml$tLD$\$x܋EXxEɋ@D   tuE2C;؉\$D$_^]3[SVWsϋVlyJxW tI	FhxW uZ;}Vt$A\$+׋|$U   9xu1H^uH@PHH     fhu@~pu]_^[QSVJ,9N   F   B$Xt@   9H$   L$F$#N #D$   N   Bɋ6@|N#dN؅uF   t0F@Hd<@~@~<C}3C}.   ^[YÊ؀@tB|u3ɀB3^[Y3ɀC3^[Y^3[YU|SVT$P3t$W3D$ ^D$(D$8L$X{l\$|$\9{pQQQPD$\3GClCh   D    D    D    D    EWMD$    fD$`@IPD$@D$TL$$P@T$4@D$L;  D$dD$,D$`D$D   D$0ff     B
:#  UJ$@  Gt  G$;B,  B,   f$   D$p0D$t$   t׍L$ll/f$   f  tj j Z3ۋ|$(T$Hu	\$(y  q  GK%   =    t%   L$P=          L$P   ׋`}ӋW}3T$PW|$PL$H   Dj G4P؃\$(   j4j S/ fC"u%D$P  C C   E	K   C4Cf 0 C      j j4觟tej4j Wd/ L$\fG"D$(,_	@ GOO@%@ ωGm   9G~%Ph(WV~T$(zz|$(u|$8uU  O3@|   3ǃ C3@C߀|$ u%T$@ɋB42h h  D$ϋ#L$0#D$,   T$$L$PB4T$D;}hBD$<j PqD$Hd
  T$$J4Qr8PB L$0Q8A@;tL$PCL$$D$HA8D$<fA4L$$t$A8	|$0|$,D$D$DT$4t$|$,|$,L$$T$40T$4;T$LT$0|$dT$`D$   fA0fAEA,AB  #x<H8#ыD$@T$0?   |$,3L$H@"؉\$Pf;}T$4É\$PD$4~Et$4\$,    33ɋ C3у@C#T$0#tD$G;|֋t$\$PL$HEx< |sD$ÉD$D$@D$H	   Ǎ   HÉD$PRPt轜D$   t$Pj Pk, T$,WfD$`BHB JÉL$PL$3ۉB\$DxBxBD$HfB4L$TfB2D$$P D$@<BIT$PL$<T$H;L$L'  D$4D$4D$dD$HD$`D$D     uUu   D$<3ҋ@ȉL$`@|   3 C3׃@Cʋ#L$D#D$H   D$<	T$DT$`	|$HD$ @fXA   tyQyQB   ut	G   uS^u׋F^tT$ B CT$ @B CT$ L$<0L$<;L$LB\$DT$PD$H39|$4~Qt$H33ɋ C3у@C#T$0#L$,tf<XD$ @ @CT$PG;|$4|t$\$DEx< ?|x8 s7|$@?   f;G"}(t$ ȋfXAF @CG";|t$\$D|$T$BfXD$ M@ @F(AF(AOlD$`9Opj RPt   _h5t$`AGl_htt$t   TD    D    F΋T$ D$`>*D$Pt5T$`
yW tP_hBlBhT$PDT@P   u`V,MBV,Q4Ol9Opj Rh'  M   M2t$AGlM   D'  TD    D    UB<D$T @D0 ȉD$@   OlP$T$TL$X9Opj j j G   T$`D$X6t$AGlG   D    D    D    D    D$@Ol@ D$`9OpPj R
   fT$`2t$`AGltt$
   TD    D    L$l9ypj j R   kGAl   7L$lR9ypj j R#   2GAl#   t$D    D    D    TD$(t"N8N8jQPVL$HD$4H,   FuF,F,ȈF   MT$ j j j j PqΉD$TXSD$lE@4D$`   T$$JT$L$LJlL$P9Jp t$TL$   j PT$$:t$`ABltt$Ttt$   D    D    L$PxW ut$Ltt$DT$EJl@D$`9JpL$   j t$@P^T$$6t$`ABltt$<tt$   D    D    Jl~   ftJlt$|$( tABrT$8D$`@<F8t$yt$8L$dT$Bt$8@@t$D$@@0    L$XyJlIxW tID$DD$TAMD$@qp(qT$$Jl9Jp'L$   j Wj CD$LT$`0   t$ABl   D    |D    D    D$@`0   MGIL$XJl9JpL$&   j Pt$`T$$5t$XABltwtt$&   D    D    Bl~   ftt$BlD$`yxxW tIL$`HL$<tF<s   FL$\zlyOxW tIxD$(t	o_^[]U\T$SVW}T$\$sGPt$,D$(NlL$<9Npj j j    T$(D$<8AFlFh   D    D    D    D    D  WHXK8C8D$8GD$C,@C,G4D$$G<
   D$@ȉD$0@H&T$4gfffʋT$4Ʌusurf<L f|H5    +ȋ5 wr'  s'  u v D$D    NlT$$9Npj RWM   G+AFlFhM   |TD    D    NlL$$9Npj j t$#   D$$3T$AFlFh#   TD    D    D    D$xp@d@ωL$;   t$0    G
usV,@ukAttXA$;F4uLF4   fT$`D$P0D$TD$dtэL$LfT$`ftjt$<QS<D$0;zt$,D$(@,   	  CuC,{,ȈC   Nl9Npj Wt$   /T$AFlFh   T|D    D    EVl@4D$49VpWj P   f3\$4BFlFh\\$   D    |D    xW uFhDD   ~  C<s     Ca  P @ȉT$0L$4L$ u,CuC,3C,D$P3C   D$9{S T$;
+C {C,PT$C,33f;D$4s8T$0\$PBRxPt$T$<G;|$ |؋\$T$E~l@4D$09~pRj P   T$3\$0GFlFh\\$   D    TD    xW uFh|$ D||$ f|$4ut!C<s   C;{~{S NT$8ҋA<A8yR	I@FlET$$NlBx9Npj RW&   A/\$AFlFh&   |TD    D    VlxW tIL$$BIFhPD$(`,@P      T$D$@D$z0;}uJP  L$8vЍBEBD,Hu,\$(t"MC##EuC,% @ =  @ tL$8F`t$;|D$;ǋt$,\$T$}VlxW tI_^[]ËL$<B_IFh^[T]̃<D$    SUډD$$L$L$PSVWx3A\$|$$D$(D$    9s~zl$T  ffB
f#fB
؋y,9zuAL$PB$#J #ȋL$Xu-Bt"xA$Xt@t9x$uD$@fZ
D$F0  ;p||$$33ۉL$QA  /  wfT$DD$40D$8D$H       ֍L$0}f|$D       <uL$XF;A,   <q   N9   T$XA;B,|   fA fF A fxZL$(AH   t" 8 t@8 utD  @8 uu@Nutu   C;3ɍQ;u+D$,͉L$@,y	@    E3ۋl$j E4AL$V	t̊|$D$  Vj Wu T$(m    ŉ_PM3ۍ\$dO3GD$,ЋT$GD$WHGLGT    r9Z  D$   T$?  F
@   FAYfFf#u f~
 |3҃OT$	BT   ׃@u
Fz     t   f;G[<tVP<uB<uB
<u;B@8~0}T$ D$ u    D\$XD$E?  D$ЋD$C0\$X;X|$/3ۋl$~nt$$   fD  ~fD$DD$40D$8D$H    t,׍L$0f|$D uT$,G ڊ$DC   u|$D$\T$ _f_^][<h8t$޽3_^][<QSU3VWD$9] ~G}\   @ 7t"fFu~ t7N]       C;] |ɋD$Ջ_^][5VWF, D        tFty~$td= tQpKt
PHW$)xIIWpKt"PPF$    f_^Wf_F$    ^é @  t$V tRt|V rF     _^SUVW|$F4;}Rj     P'؃uC_^][F4Pv8Se+ V8F@;t^8f~4_^]3[SUVWMX0uDtIF<^@EDV8;t֋3^8fF0ָ   F,    fF4藂uDuuL   D  tS   t֋   ;d  s4;\  rX  X  q;`  rP  P  YtU= tBpKt
PHV$)xIIVpKtPPV]LEՋ_^][鸁VFHt=fD  NHP@@B@(B H8J0Ћ	pFHu^QSUVD$X0Wx2U2u0++;}SL$fAf;E~
fAf;E;f;w6sxCA8]0<t'CxM8fD  9ty_^]3[YÃyˋL$A,@tE,_^][Y_^]   [YQSUVWE    N8H   H:N   @, @  t,f~2 u%N,    ux^##;u;t`>VX##8;8u";ufHf;NfHf;N
fHf;N~6;>u;VufHf;N|
fHf;N}Nh<E V_^][Y_^]3[ỸSUVWL$(Al$uAt3fe   _^][ËZDHG,   ABDD$       G 8C   C,   tw׋t,SOf;ыOMfwsN;M7Ӌt.SOf;ыONfwsF;NfWG[<lL$D$ It'f0 t/GfWPw7c3_^][Ë׋u
3_^][Ë\$ uESjPi؃uC_^][ÍC@C,    C83fC0   fC4C<    w{< k<tj\$׋wtRu tKF<E F@V8;t~֋F@F,    F83fF0   fF4}}  u\$ l$ӋG0PPtj4j S_    QGCG C G0C0Pw8s8% G,   tg @  tG     3C,   uK tI8uC     _^][̃SUVW3ۋщ\$T$GOOrщD$ BL$$D$   f^(ˋn,#L$ #D$$   ˋ#O#G   F
   O0x=G8t;t%@xl$@En,;t
yyAT$9_u%9ou F?uG@D,HuO,   NGfDfG\$D$0T$HD$+T$,+G;~+fW_^][HfGFtD$    Ht\A   tAC-   tu?IT$st/D$IT$D$    rtD$@
   v   \$;:    f	F
\$%̃SUVW|$4T$ L$p<uF<uF <u
F@    \$,   t$0T$K4+;LȉL$$;     D$ju   D$A@t(A@   Ht	A|(|)>G  D$ 9F:  T$KfF f;
T$!  K\$0:  ?ϊ?Ȁ@~@~C}	C}A	Cˀ@V x\$,[C";}CҊDD:   F   tL$(tG   tL$\$֋@uˋ@tf\$,|$ K 49+;u4uBT$D$B|$|$4T$;T$$_^][xx+u@묋T$_^][́    3ĉ$   T$$S$   3U3VrW D$TT$<\$ D$0D$    l$L$ t$l8HWt
   y	  F,   N D$P  DFD$`FD$dF2D$hF0D$DD$XFL$HʉD$\FD$LC8SDʉl$|T$8QL$DWr,|$4Q$   3fFC ȉL$tf
3RPf!D$,   D$p$   D$8f  UD$(    D$@f;tE
t,CxxCɋ@D     	  NF#M #E$     fE
t	  L$4A$XtE @r  @$;A,f  {6 tC2H;u
L$<ID$<HD$PL$DF,D$HfFD$`fFD$dfFGF4fN0;sTL$0j     Pz؃
  F4Pv8S	 V8F@;t	L$0v^8f~4N0F8|$X,fF0Nf@fF0} U$#T$\L$@؋FЉ>#ЉV1  U B   tu{D$(.   3Ʌ   ^8t$(t9D$(    Dt$(A;|t$(t$lL$(D$@8   f|$,
   @T$$Pf
,3=BtË tRPȃL$(뭹.   ǙRPf!++D$,
fy$f|$8  D$0@P     N,   N,|$T$L$ ^,m  F  If       \$L$$V,CHV,t>ʅxCf|$8 u;C2H9D$$u.C8uu{6 tf|$@t
ʁ   ʁ   N,$   J    N,<F,   tF,"|$$T$4L$TUt$(W   "F,R,*fF3Ҹ   T$(͉L$ fE
~0U0F4GT$;sXL$0j     Pw؃>  F4Pv8S= V8F@;t	L$0sT$^8f~4N0F8|$   fF0N,fFOF,R,jfFF, ՉT$tN0F8LL$ 3ɉL$ L$ A
ul$ȅtRf	E
uȋD$ хtfx ~tf} ~A39D$ +3+f

   L;ǋǋ|$M]fFMVf!Gl$$f<h |fFf+D$(f+GfNf+LPfPD$@   fFt
A
fFŉD$@G0+ЋD$4@H((AAD$pf9|$,|+A1;~D$,AA;~D$,@3+fD$,#B1;~B;~G+f@  ucE؃f;|&G1;~@G;~A1+f#B1;~B;~C+fL$(t$tD$<fF/l$@D$<fFMA֋uL$x\$ыL$@D$F,DfVu/Ff;C4s%f;C2r	C8$<tD$8͋T$4PSD$LfF\$|$$$   |$    D$X\$HL$hD$\FD$`fFD$dfFD$PF,D$LfFD$Df^fN2fF0f;-  l$T$$M2B;  D$Df;  E8@      L$0AP @     Ef|P*   F4G;sXj     Ps؃)F4Pv8S- V8F@;t	L$0oT$$^8\$Hf~4N0F8fFfF2D$        fF0N,   EL$8f<Pf+|PT$4f)FL$<PUDD$TfFD$hfF2D$Pf^F,D$$   _^][3    ̃SUVWE8^  pt$M  3ۉ\$9?  D$t$ 6  fD  F   t   tFpvu   >u=D$$9Fu4V f   u23Ʌ   Ef;   A;|   E(   33f;M2   XEf<xuht"H   t   t@@@uދf     J   t   tRRRut$$3Pt6E2G;|\$D$t$C\$t$;3_^][_^]   [̃T$SUVW@  |$ t$$>,L$u+D  vW   vT$>,tދL$@ %    t3ɉL$ oD$       } Gt9_$um ttdSVtN>+u,L$Svu3L$Svu>3uL$j SvtE
t"D$0L$ @D$;A}L$T$a   _^][_^]3[́   SUVWD$H3|$$t$D$8   _T$,\$LCBID(ȋJGT$L$(D$0tjD   Ati   Wt$XD$Hf$   D$\D$<D$`fD$hfD$pfD$xf$   f$   Ƅ$    Ǆ$     Ƅ$   L$dA($   f$   A&fD$<3fD$>B(u
B@D$ll$Xl$   D$4D$(@&ȋD$$|$ 9p  D$,   fh,l$    @ %      B(K  D$4   B$~  D$0p@@ƉD$f
3RP蝸T$f!D$;5  KC#N #F$   QQ&   C8   fKK0L$(C     0D$ fCy+tL$4 @  ufCfy3fC+   fCf;| \~EJ~G8f,A1+}+    A+},   3+ f+$   fCC, @  N F$$   L$$CȉL$L$D$0T$_^][Ĵ   Ët$  E$t$tR$N,Pt$46  E8   )  E83CfCC0CfC$   $   Cf{k v,t$(Ή|$ U8ʉD$ uHL$83҅ɍGC,   EfCL$0SWyӋf{  U   tW@  fD$@|$Dt$@ D$u@}D#p8#x<Ǹ@  t   T$ C,ufD$4 u]9U$uXD$@(uN  E8  L$(fE0f;A(  D$,@,  8    @P   D$83EȈKM0+L$(I(L$@fC+  T$,A3D$@,D$@9jd   \$3ɉL$ zpWD$TD$PǄ$       f$   f$   \$PǄ$    F$   t$   L$ f$    u0Gf
NGtT$,ED$@0L$ ;jdk\$L{f;|%B1;~BB;~G3+f%A1;~A;~F+fl$L$fCQL$4=D$@$t}( uL$$_L$D$fC|$$ϋT$j UG t$uD$4   t$T$B(t3mD$8l$w_^][Ĵ   ̃,S\$DUiV1CD$WyD$ L$4GNfT$L$,L$DD$(D$XOl$$|$0     D$@sT$~bf|$ڋF@U B j$#D$H#l$L;B u;j$ufzu|$\ u	B,I<vl$$u|$0\$PT$    Pj t$$ T$4l$,t$ C    C    C     C(C0   C4    C8    D@LDC@KDCX    D@4t9t@uhSU@8E @ЋD$PI8trtmu	j_MuIȺdt5t(  ts%tRRLR	4RQhEV utX= tEpKt
PHV$)xIIVpKtPPVD$PE    t3ɃD_^][,Ël$t$P    Pj w8 WG3G(    C  T$hD$l$@D  4ʃ  ;  E  T$$;B  W8<   }    ,@D$$hE 	E$	G;t$PD$,NT$PT$P| t.}D$T   ЋT$PuG"fG"}JuO   D$0    OD$0CX   G(G(t$XE,I<   >    {   s   =    pKt
PHV$)xIIVpK   PP   Ent$Xc8C        XT$PT$D$l$@Al$@;et$PF3fG0xG88    A;~CGG3C1GCC    G${  tnCkVC    C    D$\    3_^][,ËD$(L$,L1D$$hHP   _^][,ËD$(L$,D03G 3fGK(f/L$@   hf/rSWfD$@f/r\f/vt$@l$D   l$Dt$@(	 RP(L$D  f+fffffG(   C4K0w6rs#wrs3j
ɅuHrAu   v(wr   wuv
wrwfMf
fW,fGK8   %L$4DЉW,vGtrw$tg= tTpKt
PHV$)xIIVpKt"PPÃg_^][,Vg_^][,̋D$Vt$   ;   @FSD@FHɋ@ȋXtq@   vLWxt'G   uEC   t:H%u4)C   tt	G   uӋ%u	׋%_t [^[@^3^̋L$   3҃L$OATtT$u	!AXB~	AX   3̋L$3T$W|$xi;
}eVq94uDBLISCTD$BD@BH@PtQVjAt$$a3[^uɺ   _DÉ   _̋D$@P̃dSD$    UD$VhXWE\$T9|$Pl$dAЍT$RP$   $   ؃\$(tTe3fEfE0E4E,   L$,;}nqj     Pq`uL$PT$(	   _^][dE4Pu8W U8E@;t7\\$(}8fu4t$|D$$L$ 3PD$Pt$$SjjV$   R |$$ |$t,L$ D$j Pt$$3SjjV$    D$M  L$x֋ЉT$4#UD$0#E D$hD$T$lu  3WT$$fD$8fD$XztXRD$Pt$$SjjVQL$@t$P#u  L$4#M|$t$HL$Lu   T$$3҅  D$\D$LD$XD$HD$<ʉD$DD$8L$D$8f|$, ~^D$TS\$,@L$0@#L D$#D$4;D$Drw;L$8v;w
r;suŋl$d\$(L$T$$Ɖt$8#ǉ|$D   ;t$hu;|$ltw;t$Hu;|$LtkL$xD$j Pt$$$   S3WVPQL$@~L$8$    |$9E u"t$|9uu|$    T$$DȉL$
T$$|$n|$ufl$|t$xu4L$ D$RPt$$SUVUVL$8 |$    Dʅu(   uQL$$D$Pt$$SUVUV { t_stX= tEpKt
PHV$)xIIVpKtPPVL$PӋ	__^][d́   3ĉ$  SUVW3j8U|$DGwD$Ll$X@\$,t$(@ÉD$$$  PX F@D,ȋH4D$HL$@t3f  ;\$Z  f$     D$|$=  fK$  S    #N#F  BD$,   @D$<Z\$ D$X~@$H  fD$hD$dZ\$8;\$,  t$   fCtC>D$@9C  L$DD$pD$pL$tD$x,D$|   Ǆ$      $   $  L$XD$\3f$H  D$H@x+u&$  $  V$  !l$V$  D$u($  L$\$  V$  l$f$H  f)  |$, t4P$T  f$  P$   P D$,      P$  f$  P$  P $  3|$f$  T$4  $  ƉL$D$0    I  i$X  QIl$TT$LL$P؉t$(fD  Vf;|(H1;~BH;~E3+f#O1;~O;~B+fD$(l$E f;|6A1;~JA;~
L$@6T$+
fC1;C;~B+fЋL$LVt$,FD$TNPQ$  ֬L$<$T  Al$`L$0t$(;L$T$4L$T$4\$8l$f$  |$t$0\$8;3|$f$  t$ L$$   fF0WF83ۉ3F,    fFFFF(uQ$"  |$ ;}3F׋Nf@fGfGFOL$<mCD$tɋ|$l$t$ \$$D$   0\$$;ŋ$  _^][3 Ĵ  ̃DL$W	SUVA03QWL$@fD$8@fD$H,t$4l$t$ t$, D$0D$x|$D@ N  _@w,_83f_0   f_4Z;q  T$8l$<T$T$LT$(T$Hl$T$$T$,W@  Ws,fD$H9   u	   32     ;~  91tN@;|WfD$8T$<L$8|$4 OWu?C$bu9|$  uiWfD$8l$<L$8l$L$R33 C3ʃ@CC$@   L$ C$El$(L$ L$L$$#L$l$D$4L$Cx+   t${Hl$H;މ|$8\$LsrfD  uG$"tYL$@W,9   u	   3=     ;~      9tD@;|WfD$HT$LL$Ht$ڃH;rL$SUt$t$|$T433 C3ʃ@CUQL$ 6l$PH\$8\$Lu$L$Ax	 tSUl$Ut$al$D$$GD$$D$(GD$(uD$0xW u2eu+hdj3D$,\$8L$@D$;\$W8_@;t	L$0PL$03_8fG0   fG4G,    _^][DU   ST$83ɉD$<WVWfD$Hf9Mt  @P@	  D$8?	  3|$L3f$    fD$PD$$Cډ|$3Ӄ@ECڃ$   T$$%  $   \$H؉\$   3D$|$   D$t$   D$pD$TD$hD$Pt$xD$d@ ff     $   ;@  r;$   8  E;O  ~|$dy|$d|$hy|$h|$;}E@4Et$(   t  uEt$(F,     %   $   t3fFFT$8D$D@D43ɉD$lL$,f  D$@D$D  33 C3ʃ@L$PC#ˋT$0#}  6o  f     F   t   tFpvuA  <t<3  T$l9V&  D$|L$dj PD$pPF QL$TPIX藫   _u%D$(3P0t@8;8tA;|;   Â   f~  |{D$DT$0΋؅uX@   txPxPB   ut	G   uu׋{tE8+4:;uu,\$ |$\$P|$0\$ |$xx+uB\$ |$t$L$,T$8AL$,t$;7t$(F,   H     tD$\       D$P    <V T$\  B8  z6 J2L$PJ4tD$$   tD$$ 22҈D$D$,T$3҉T$D$H  T$0f~\$;}hF2;|`^8D$|4N#ftD$$      DȈL$$]  t[6B;}L$A 90t?B;|\$T$t$\t1FPF<F|$@ ;ȸD2Ɋ\$ǃD$ D$$L$`t-x;|%Fɋ@DuD$$ 3DD$$3  t$@t$<L$8;e  33ɋ C3у@C#T$ #L$.  $  B   t   tBPRu   EL$`$"؊|+<t<   D$l9B   B ;   lD$\L$0@(Lt"fA   t   tAHIuB   t   tBPRut$lQ3tuVL$`   D$DT$<0΋=u@D$\L$@ 4+f
;uKuY߅tVt$<Gt$<L$tD$P;}D$$ |$, '  D$$(  xx+uBf$    t$(t	D$@fFE@D$7unL$@|$Tt(t$3Ɋ\$D$72:ڈt$|$DȄ_02T$T$t!D$x33҃ C3ʃ@EC		PD$L$@T$DtF;N,   |$`   D$,D3ɉD$,3 C3@C	D$ 	L$D$0BT$;T$Ht$(=|$$ )  L$(D$pAD$pD$tAD$t3D$<f9D$8  \$@T$\$,33ƃ C3@C#L$ #   tL$DӍ  zWfD$HL$LD$HD$PL$0uKǄ$   0   f$   Ǆ$   Ǆ$       tӍ$   Yf$    t L$pD$t#L$P#D$0u	t$ 	|$T$D$<\$8@D$,ˋ\$,D$<;L$(|$\$ T$$t$xFt$x$   ;$   u!;uD$8_^[]À~  t%  =   uuqL$8X~QD  @}33ҋ C3ʃ@CуWfD$HT$LL$H#D$ #;u;tK2_^[]Ê_^[]_^[]̃tSUT$0VWl$ E D$lD$T    D$\    0E0D$X    D$h    t$pD$\$<w   
      DE|$Pt	ft3ɍ    L$0D$d RPIЃT$4uB_^][tËWڍ4\$$t$(0?|$dF
R HυT$0tL$hPj Qj T$<D$l0      ;Bȸ   fNL$D$`tEF   |$<3҉T$@  D  3ɉL$,  t$mDl$,  FWVʋ^#M D$fD$x#EȉT$D\$HP  ʋ#M#E>  E, @  t
f>+  L$,.fAyff;|%B1;~<B;~G-+fA1;A;~F+fD$fމt$xf;|(B1;NB;~F=+ff\$t$-A1;~A;~G+ft$fދL$,|$DfAyfD$LD$HAD$HD$|$D  l$ D$xPQt$HE,,PD$,PD$4ȋPd$q  Ӊt$fދt$$39L$~"l$H9>u9nuF2  A ;L$|L$|$P;|l$\f;  uf;\$Xz  ;ύAMt$Tt$$;ϋ|$LMD$D$l$,H@EMFD$xL$|FD$FD$@f~NfV<    f^D$Wpv FL$\$$,|$P;H  k   sD$T    l$\t$X;v1C4D  Pf;uf90~	0L$TA ;|߉t$Xl$\l$,L$  L$AID$xD$ ,L$|d$;L$0D$hHD$t f   D$8D$0+kd|$0RP؏L$@U fD$ @  tL$ I.f;L$8}L$8   tf
~+Af
D$RP{L$fL$tff;|_B1;~|$DÃЊd$B;~|$DFЊd$|$D+fЊd$rA1;~ǋ|$DЊd$VA;~G|$DЊd$6+fǋ|$DЊd$;L$8Ff;|#|$LkFf;|\f9^Rl$,L$\$$t$m<l$,D$`l$  t$D$`T$@t$(|$<Ét$$BT$@t$(D$`;  ht$pyL$x      t,T$4n?   _^][tËl$,SL$\$$N\$4;d  sJ;\  rX     X  _^][t;`  rP     P  _^][tË\$4= tSpKt
PHS$)xIISpKt!PP   _^][tS   _^][tÃ~$N P    fFf;AO ut$(L$(3|$ Y\$,v5<  R`FB@BED4h;|׋L$(\$,fE,  f#º   f;uE}3 u?f|$8 t7D$xP    tUGPh   QrȃE;uE3U4}U4d  L$(AD$E1E,yA;uE3P   A]PID$K   |$ E1    D$,L$d lE,%  =  e,tpD$x׋|$ WPD$@UHf$   PD$4h   Pw;u4D$xL$|O4K!|$ t<uL$ A,tQ4\$,L$(|$    fG,tXG1;uP|$ vIT$dD$xPWfD$|tD$DHPj Q
ȃG;uD$xL$|O4E MD$(L$pf@fE8th   tT$4<3_^][tË\$4;d  sD;\  rX  3X  _^][t;`  rP  3P  _^][tË\$4= tPpKt
PHS$)xIISpKtPP3_^][tS_^]3[t̃| 3ĉD$tSU)VWl$E,   ED$p~+  @0  YUX@43ɉD$D$<fK2L$,L$(L$0L$ T$C,    T$ T$$fD$8 D$4   D$:fD$h襓п   t%ff     J J$   L$ {Ѕuv   ~6    ~$    F2   n833f;sfT$L$ VUWt$ tJD  H H$t.L$ u.C8C,  !   f{0f{fClK8GF2;|F2;tvN?C,  F8 uD$H@@D#N@#FDuC,A  fC0fC'   s fCl$   {, tdD$f{P  C   C      Ef}8t E1   fE,tE3|$9vK,    _^][L$t3) |Ë$   3_^][3 |̋D$8u@   uD$3fH   3̃4SUD$VWl$W]D$fD$8tF393~@  D$({D$<l$(D$D$8D$胍	D$	T$F;3|l$ T$<L$8T$L$ED$(tLW3fD$8t$<|$89~-  L$$hU &L$$mCD$(;|l$ 	|$	t$u0Nt$$p  F	@ŃD$(P\$0|$4T$8BEȉD$,@,$<      fE,uB,      zϋZ#L$#D$ucMdEp,I;s|N,#V(#tAt-T$,I$;J4u!0;r׋#t$0#T$4t$T$M;s5l$ t$$\$|$D$(N`t$$D$(!Ë_^][4Ë׋!T$!L$;s$t$8H,#P(#tfH
~^0;rl$ t$$M0A;t+΍I`PD$,PP M0c_^][4QUV   }0P  @D$vuSW  f    P,ʁ    u<   t4HɋMLQ   Qf;Y&~tH,῁  @ H,fXFE0`;|_[^]YU   T$$VW}WpD$t$DL$0)D$`fD$pt?@D$8    M|$8}@~j@hPn3_^]ËE D$   Ej T$@RD$<  D$(PP>9ȃD$0L$xW t  ы*53_^]ËT$D$,AEAD$<y}yAAA0B8HB8A A$D$fA,ED$XfA.   Uj'A(A1j PQD$hq D$DL$P   L$ Pj QP T$L$$ʉT$`L$hǂ      BXD$D$dA@ǂ   A83fA0   fA4A,    JXA j,A	 A    A    A    A   A<|$< uEEtL$\ D$   tD$0@PuL$A3L$hj Q֌D$8I|$,3@ T$G,     BX  ׋L$PǈD$0FH;0|ȋt$DT$zx&fD  W֋lD$0yt$DT$M   A<D$8   A	   y ?   Gx+   A03ɋR4D$$~ D$@@u98u{A0;|D$$t,39~&D  H9uU9yuP uKL$$B;|D$8UL$jIWpR)EP~@<jJW|$ p|$D$x$       33L$$G
   G(G,   9D$<t[W$      )$   fք$   f$   Ǆ$    Ǆ$   t$   Nf$    tD$jp$7t$迍fO
L$$|$F0L$$;wOt$DD$T$   tZL$0APt|$    T$f!G,;uT$0WH|$tG3} u   f	G,EG|$|$<uL$`|uhL$`u03ҋBL$0yW u tLW8fB%L$0yW t/t$L$֋F(   L$0踭3_^]ËL$0 uA %    tGPGTD$x$ uG0D$LD$P<rV} t<D$3%   f;u,AP   u#1D$TG0ȉT$PL$<<rD$0@P   utG8   3ɋD$tjP  W,   u tQD$,@x+tD    tD$t5L$%   A23ɋD$,@@u@tL$⿉W,|$L$<D$TD$8    @      B< L$,T$4D$@@D$H<t'D$03҉T$4@9t @B9uT$4D$@ @  L$ IPL$$2  @+<#  I,      D$x4tD$09tuT$@B4VlD$H9Vpj j P   萁7BFlFht$Htt$D   D    D    D    xW    yVlJFh| tjWЋbct_x@GS<tO@uD$    D$@@,P   t,|$ɋ@Dx	 D$t0j pD$T$$B,   c  @z D$Hp     G8$<D$       L$ AA&  D$@2 p   t@4q   GD$QL$PRT$LR4m2    D$fx"@}v@upD$$@, @@ ucD$@3P@HDtGuyW tWʊ,FlFh| tjWPx@FlT$TFhfTD$L$y2 t+D$@T$X@@t;t@BuD$Hq   Q'L$Xt tD$He   L$Q(BA(L$ ANlG,D$(9NpL$4QPRT$T :AFlFhTD    D L$H3fHL$(HL$4HL$׋AD$(/t.T$(
yW tW肉BlBhD|D$$@,t. u'D$@,ux3tFl~   FhfTL$4x,T$BtEи   zTuωzTuD$@|$@,  j j$	.ЉD$<tOL
B   B    WLT$4D$ P8}  L$A(y,A(Gy,zNl9Npj Wh   M   }/AFlFhM   D   |D    D    D$T$4@,x,zNl9Npj Wj K   &}/AFlFhK   D    |D    D    D$T$4@   Nl9Npj jRv   |/AFlFhv   TD   D    D    D$j j8-Ѓt!JB  JGTBz    0Ѕ   BB      yW tR   FlFhT   xt@ G8$<tuG2NlD$(9Npj PRv   {3AFlFht$DTT$(v   TD    D    L$׋AD$(t.T$(
yW tWWBlBh|DD$$|$`,D$\G3  D$8T$ @L$<`D$8T$ ;FlG<D$0xW J3҉T$ V  <  D$x$ 'GL$,@,D$TH0D$(M  tbP Nl@$D$(9Npj RP	   z  AFlFht$(tt$D	   TD    D       VlT$89Vpj j j    6zD$83BFlFh   D    D    D    D    D$(NlP @$D$(9Npj RP	   y3AFlFht$(tt$D	   TD    D    VlxW tIL$8BIFhPT$ L$TG @@ tZ @  t,L$,T$Pt$Tt$T@L$Pt$PL$t$PP9D$0xW MGt$T$0L$P3t$XFlt$XL$ GGPt$4t$$	L$(T$PT$ D$LBG܃`A T$ ;T$<FlG@_^]U@SUVD$8    Wt$NV0D$ h L$HD$8ElMl$4D$LT$0L$D
  }p
    MB@ƉD$p8X\$@   	ҋA<A8yR6I@}pEl    ElVFMlv9jRVC   wMD$<8D$<AElEhC   tTD   D    M\$@|$=WPT$,  t$D$    ~3  F0H9D$0  B,     B @8y  RT$(i  @f<P$[  D$ ڋ@,@3D$$@ MlW<9MpWVR^   v+\$(AElEh^   Tt|D    D$$F|$;|L$ C   A,ǋ|$$   x=%pDыMlL$9MpWj V[vt$.AElEh3҉tt$fTT|TTE \$@xW uEhT$(DT|$MlWD9Mpj Rj   uO1AElEh   D   TD    D    ˋt#MҋA<A8yR}	I@ElD$MlW>wD@X=9MpRVWӋZu*AElEh3f\|tT\\El|$~W?EhfT$ tuMW(ҋA<A8yR3}	I@ElWDMlJw$9Mpj RV<   t+AElEh<   tTD    D    L$tUE UlxW t
IP?ɍBIEhT(t"	ҋA<A8yR|	I@ElD$,@,   W  H M  MWҋA<A8yRF|	I@ElWHGLT$@r44  ]hE NUlA\$xW tIɍBIP~  ~ /  D$,@,   u   t   3L$9 tTMlQ9Mpj RS   Rs,AElD$3 lll$4   \TL$   UlF~D$$ZAD$(9UpWSP   r1\$(BElD$ \Z   \|D    E \$xW uT$$DTE NUlAxW tIɍBIPMlV>^9Mpj RWӋKr-AElD$ 3f\|T\\\\$N}l׍AE IрxW t
]hI8D$@HD$@M\$A<A8SyRy	I@ElC8}ptOMlP9jj RC   q/AElEhC   TD    D   D    S   Ml9j Rj    +q/AElEh   D    TD    D    E UlKxW tIɍBIEhPUlCJIȋE xW tI	EhPs0tPS,Ml9j VR<   p/\$AElEh<   TtD    D      D$,ult$@|$,X,9upj j R1   pD$@/FElEh1   TD    D    D    t$@uTMlV9Mpj j R   o3t$AElEh   TD    D    D       uG    t	~H FHuE]p~=CVMlf  v@9B  j RV	   =o  FH        KtD$83ҋ@9t@B9uD$Mls,x9MpRVWe   n)AElEh3ll$4e   |tTD$ Ӌȋp!Ѕt*yW tRxyFlFhDT|$,t$Ml]pV9j j R   Knt$AElEh   TD    D    D    AElEh	   t59j Rj    m/AElEh   D    D    D    TL$@UlyJE xW t
IPEhT}pT$0t$T$01L$D~H t讘3ۍ   \$(|$,8^0  D  8 G<L$HHL$DOPtWӋ3  @0 tW L$ j p(wzh  A,@  tA     N  GHD$@?  L$8yW 1  ~2 t@@uV@T$Lw yMlIE xW tI	Ehl$D+֍D$0 ;G   C<^   ESyi'@4PFʋ t:33f;-U      FȍRDG;~|$,L$@3Q4tIf;1t@;|L$0x C<u	GC<uGC;2l$4\$(t$F0C`\$(|$,;.ED$Dv$֋A<A8yV~s	Q@Elt$֋\$ L$8F(   4D$<(C_^][]̋L$Afx |   @t P UVuFfx |   M@tPWfD$T$L$   fptRQ&Z^]É   PfH^]̋L$Afx |   @t@   @    UQVuNfy |   ItNAAtA    Q A       IfptQRlY^]ÉH   fH^]USVuW~f |   p  MYC?u3ҋCM?tb   IAt$tQ	謿 tTWD$ ȉD$脿 f.D$DzcD$SIA$tYD$=tRD$(ty tSD$WfD$\$D$+|u%̒jjjjF   Z_^[]ÃW ;uI;_uDE0VGu0   fHt	Q	   fHF   I_^[]Vt$W~f |3ҋwtAGt:PV>wt"   fFu~ t|QNG    _^Vt$W~f |   t^ uXD$0hGuC   fHtPF   _^I   fHF   _^I_^Vt$W~f |   ttAGt:PV;wt"   fFu~ tyPNG    _^̋D$Hfy |   It QVq QAquq^UVW}wf~ |   vtL   VfxtRQU    F    _^]É   PfH    F    _^]̋L$Afx |   8@t@P ̋L$Afx |   @P Ë@@P USVuWFfx |   @   HPXxP6   	   蓻 D$σ ~ L$   ^L$fFt\NL$	   fFL$L$%  =  uD$ u6   fF_^[]ø   fFtMW   fF_^[]UVW}wf~ |3ҋv   VN襺 VND$蔺 L$   ^ȋ7L$fFtpML$	   fFL$L$%  =  uD$ u   fF_^]UVW}wf~ |   vt~FupEA$tQt|Mty tMFV4|u.F    F    jjjjG   0UV _^]ËL$Afx |   X@P Ë@@P UESVpWf~ |   v2  NFD$L$    V>QPRW|$ T$v ~^uD$6u8ظ   fFtSWQ_^[]ø   >^fF_^[]t$t$ȋPQL$4D$0 L$+ȋD$L$T$@t$D$QPt$ D$,R ;|;st$t$SWɳ t$ +t$(SW贳 D$T$    fNtRPQ_^[]ÉV   fF_^[]S\$Vsf~ |   vtrUW>   tfou tJOD$0u/fht	\J	   fH_]C   I^[lF_]^[̋L$Vqf~ |   vt6Fu0W>t"   fGu t'JOM    _^Vt$Ffx |3ҋ@t t
PV肸^Vt$W~f |   tt>t8PV<7t"   fFu~ t{IN    _^QS\$UVWt4+;ut.@xx+u@ًv$uSh4UoE_^][YU    3ĉ$   SVuW^   ;    Pb؃  Sj FSj FStj j ?3FStj j #3FCFCFCFC^FR  ;Yu+~ u~ tFt8thHWeD3  E@   #  ~( D$thW6D  E3D$p D$L   D$ Z   H D$D$$U   D$(D$,Y   D$0Z   D$4U   D$8D$<Y   D$@Z   D$DU   D$HD$L\   D$PU   D$TZ   D$X$!D$\\   D$`V   D$dZ   D$hD$lL   D$pU   D$tZ   D$xD$|L   Ǆ$   Z   Ǆ$   Z   Ǆ$   XǄ$   L   Ǆ$   Z   Ǆ$   U   ;tG|   Vt	L$^Vt	L$NF    F    F DL D$NFV   3ۍT$4Y\$N   j DًL$C4P>tHj4j W fG"uD$  G E	OG4Gf 1 G   ~]^,$   _^[3贃 ]UESVuXWT${ t7>   K3~~4D  ;9t@H;|;   T$-   t)t$u}F   tttN,f;tY@$uxW b  CЅtW398~N3ɉL$T3jVit-CGL$L$;8|؃%   _^[]3_^[]ËS   L$j j 	MT$D$
t
8u 
SuD2F9rt$u}PK(`D$pAAD$AStWF֋      FL$L$	j4j Vך yC8Of~ @0FCF,D$FD$   38AWE_^[]_^   []̋L$T$VWq~;u_3^ÉV~   _^̃0D$4WS\$DUD$D$D+W|$DD$D$fD$,D$4    D$    l$T$L$ D$$`D$(pD$8t>V7~*D  L$$euND$^_][0^_+][0_+][0USVWL$U  t3: D$       D$BD$    P1tj j 3ۀ~W C  }    t)f     F   t   tvvvutmN   t	FD$F-   tuJNT$mt:"NT$D$    St D$؉D$NyNF    uL$Ӌ	P9W}L$S	du$L$,`pAAYD$L$ D9\$ D$CL$M\$ D$;L$_^[]Åt	Ӌ_^[]ËT$:uD$SZ;H|ÈZ3[3̋D$8ux( upD$hГ0<3U    3ĉ$   SVW3|$t$`9GD  9G4  G          FD$u9Ftu@PuFSD$G D$$G$D$dG(D$hG,D$<GDD$GL$0D$     D$lj j@t؉\$4 ؉D$4  j@j S臖 t$@WD$DHfD$LL$@fD$TD$HG\$(uK_0D$,D$DPD$H    D$(t,;D$(~D$(L$@衕uO|$G3ҋ\$   G     G$    G(    G,    Gjs%jsЋЃT$   G0    T$8;   L$W0tz;uv3ۅ~RD$J+ЉL$4T$\x:uMWj13bu8D$CL$4T$\L$4;|ɋ|$W0t	L$0G0    |$\$T$D$8F(ӉC0΃F(D$ Pt$0wt$0D$4_0WT$ |$D$tD$,D$|D$pf$   Ǆ$       Ǆ$       T$x|$p$   Ǆ$   `Ǆ$   p$   t5;~(ff     $   ғuOT$x|$t3j wΉGLuj wЋgT$$|$      CHHC,@   t6D$ Pt$0Qt$0y|$0tCPC`-3C`CP"t3j Q׉CP|$ S(tfL$0j j BЅuAHL$89O}RV"`D$8pAAQ|$ F,F,C4F,F,S4C8D$Hl9Hpj Rj K   R9t$AFlƋt$`@hK   D    TD    D    [$T$   3ۍT$4W\$4>D   WDًL$4C4PtHj4j WS fG"uD$4  G E	OG4Gf 0 G   j jL/D$$   E؅u   W[o{C    C    C    FdFdC3fCD$$CCu1PjPtD$$tjPj Pc D$0C D$dC$D$hC(D$<C,D$C0C4    C8    C<    C@    CD    CH    yW t!3$   ;ڋPU*3|$|$j jP؃u(D$X \$(N  L$0j*9  jHCC   j P   萐 T$4C4D    D    D$X {ڋH L$<tH3ۉT$9~:y4T$D  ? }F(F(WtR }L$<CH;|֋|$\$O@  j@lȃD$l	Gu   sT$,ًD$ABA B A0L$@B0J @  @ WPD$@    fD$PD$X    D$D D$HpqD$Lq3ɋD$0   j jxW EʉL$t|ȃt1      YAD$_^[$   3 v ]Åt>D$_^[$   3u ]ËD$0t  t
@$@   $      _^[3u ]VW   SF ^$tN$tF A F     v(WVtVtvW_vWVtfVtX֋Ou[_^USVD$0D$   fD$D$     W   L$}3f;D$       r;W|$fD$L$fD$ D$_D$ aƇ   0   Aj j4tj4j VC yF   fF"_^[]U҉T$S]Y   EVD$EWUuXtVu=XtUu3hWF2UtUt3_^[]Ëj jdttjdj V腌 D$MFEF^u@PB   Eȃ|$ UNψFBUωF5F_^[]SUVWt_D$FD$FD$tg(Xt43ӃPRtSUWb ; ~_^][3~_^][ËT$t6T$t'_^][SUVWF   T$] P t~ t t~ t  u0vPhDU0_^][ËWj YFWtj CFVt/F    _^][Vt$Wt*J   r,VHBt~thhQ"0_^Ë9tN tF$N$tF A F     v(WVtVtvWuvWlt|Vtnϋ_^c̃D$Wt@PDVpD   j W3   txSUo@utD$H   ][^_ÅtM ;u3~͍]+ȍpL$1:uǋ3jvVuL$G;} |][^_ËO$tH >w ^_̃SUVt$  \$ }  E:Cq  E:Ce  E:CY  E:CM  Ujs1V5  UjsV  ESD$Wutd   _^][Åt;
u3~GH+L$rD$0:ű3jvUuD$GL$L$;8D$|ɋESD$uuct;
z3~OH+L$rD$0:Y3jvDUED$GL$L$;8D$||$( tU(L$js(U_^][_^]3[^]   [UB SU@Vs\$@WzD D$u9stu@PuCNDD$W0O0L$nhNll$9Npj PRv   _F0AFlE 3llnhTT$v   Tl$T$NlB9Npj RPs   	F4AFlE 3jll$s   TD    D    D$NlB9Npj RPs   E4AFlE 3jll$s   TD    D    D$NlB9Npj RPs   UE4AFlE 3jll$s   TD    D    Otb	C,@GDK,AWDNlD$9NpPRj K   D-AFlE 3TT$lll$K   TS,BS,WTNl9Npj RjG   D-AFlE 3lll$G   D   T $  C,C,GXC,C,G\C(G<C(NlWX9Npj RjG   D/AFlE G   D   TD    D    NlW\9Npj Rj G   C/AFlE G   D    TD    D    D$Nl<9Npj RWs   xC_^][]ÍAFlE s   |TD    D    _^][]ff     G,@     Z  GHj j P%HK(O<C,C(@G@C,tG,@ xiuE NlW<9Npj jRv   B6\$AFlD$ v   TD   D    D    yW tU\MFlD$ DlW@NlB9Npj Rj G   5B   A3FlD$ G   ll   @ =t=t=t=XutC(G<C,@G@C(G<C,C(D$Nlo<9Npj RUs   A2\$AFlD$ D    D    s   Tl$:_^][]USVWT$|$wu9wtu@PuG>Gu	_,C_,ȈG   Nl9Npj Sj G   @/AFlFhG   D    \D    D    }@  GuG,G,ȈG   VlD$9Vpj Pj u   z@7|$BFlFh||$u   D    D    D    yW th%K8yVlJFh| tjh%Ћ:L@%@NlAD$9Npt$9   Pt$?3T$AFlFhTT$TT$9   TD    Fl~hS   FhfTVNlQ9Npj Rt$   W?3|$AFlFh||$   TD    D    NlEQpT$9Npt$RS>E}AFlFhp|$3fTT$TT$\TD    D Fl~C   FhfTGtυEANl9Npj jjF   n>3AFlFhF   D   D   D    D    EyW ltRIFlFhDTtG<s   G_^[]USVqWT$FD$   	y|$u 9ytu@PuA[;D$|$Nt	3ɋvL39~gE+ƉEOl9OpRVt$^   S=/AGlGh|$||$^   tTD    D$CF;E|_^[]U$	SVWq|$ L$t$u9qtu@PuA:D$|$߅E   {` S,T$(t3ɉL$$   CH@t3L$$   L$$uIz u@D$]NlCPPD$ B@0D$,9NpSRPW]@<iAFlFht$,8D$]NlߋPP9NpSRu^   <.AFlFhutt$D    \T^   L$$GT$(;G\$|$ X ED$  B     {Z  ~l9~pj j P2   x;2UGFlFh2   TD    D    D    } d  S@NlB9Npj jRV   ;3\$AFlFhV   TD   D    D    NlS@9Npj RuQ   :2]AFlFh\\$Q   TD    D    S@NlZ9NpSjRa   n:/AFlFht$a   TD   \D    D$NlP@X<9Npj RS   :\$+  AFlFht$\\$   TD    D       Vl[<9Vpu   j S92BFlFht$\]   D    \D    xW uFhDD   \$NlS<9Npj j R   @93\$AFlFh   TD    D    D    VlxW JtI+FhVlyzxW t
I>  0  S@tY+UNlB9Npj jRV   8  AFlFhV   TD   D    D      T$(z   3D$,9C(   T$BuB,z,ȈB   SPыNl9NpWRu^   7.]AFlFh\\$^   T|D    VlT$,9Vpjj W   7D$,/BFlFh   |D    D   D    L$tA<s   AL${`    CH~l@T$$u(AuA,A,D$RȈA   D$=A ID$;t$+ʉF Ƌt$HL$A,X\$\$A,SHj j t$$R:7Vl;}F]υyNlIxW tI	Fh9^ut$ A;F0t$uYG;|\$D$(@    CHL$@PJu	D$ xVl9Vpj j j U   !67\$BFlFhU   D    D    D    D    yW tW@4yVlJFh| tjWЋAtx@EЋNlڋ{4ҁ¢   9NpW|$ WPo58AFlFh3fTUTT$|TD    D yW tt$(@FlT$(FhDTFl~L$$эFhfT{` t6D$$ut)L$A<s   AL$;A~Ay L$,t#VlyJxW tI	FhP|$ [$\$_^[]USڋUVWry\$t$u9rtu@PuB1D$  GXD$8 6  G,@   &  Z  NlW89Npj Rj K   3/AFlFhK   D    TD    D    NlW<9Npj j R   3/AFlFh   TD    D    D    NlW8_<9NpRj S^   /3%A3FlFh^   \lTlVlxW JtI  +Fh  @   GHPt3ҋNl  _49Npj RS   2%A3FlFh   \TllW,yW tRD=FlFhDTNlW8_49Npj RSP   2%A3FlFhP   \TllNlW49Npj Rj K   1   AFlFhK   D    TD    D    w_8o49NpSRU   1+AFlFht$   lT\D    W,yW tR0<FlFhDT\$$D$_^][]U0ASUVq3ۋhL$4D$(\$ \$W9H<|$4L$(tm 3G8W,OHD$HG8u@
L$ 2ɉD$=O   D$u
L$ 2O   D$ D$D$   u@uO   \$$u
D$kO   D$VG OD$$D$;(+͉\$_ OXŉ\$$\$;++͉G OHŉL$\$$D$T$,NlR09Npj PR   //AFlFhTT$   TD    D    L$8S\$0S0mNlS49Npj Rj K   .//AFlFhK   D    TD    D    [$uT$,NlRX9NpD$RHSPt$0.4\$A|$(FlKFh||$4   \TD    ^l\$<9^pT$ j Rt$0   s.3T$(CFlFhTT$    TD    D    D$,NlP\9Np t$ D$HPR6   .T$,4|$4AFlFhTT$J6   TT$ TD    L$,A<Uu]Nl9NpRt$5   t$-*  T$AFlFhTT$TT$ 5   TD      <B  Q3ۉ\$0tSSr2L$4D$0y^uX^l9^pt$ 5   j t$#-3T$CFlFhTT$ 5   D    TD    |$0    t$T$,L$<Nl9NpUt$(Z   t$$,/T$AFlFhTT$$Z   TlD    yW tt$0S7FlT$0FhDTFlP9FpRt$R   +,z|$FhVl||$4   TTLNl9Npj t$   j +3T$AFlFh   D    TD    D    t&VlxW tIۍBIÍFhP\$<D$8ȋT$,pj t$0fNT$ҋA<A8yR3	I@FlNl9Npj St$0&   !+/T$(AFlFh&   T\D    D    KVlxW tIɋIÍFhKVlxW tIɍBIFhL$ PtG<s   GL$tG<s   Gt`u:L$tG<s   GL$$t7G<s0   G!G;~D$G ŉo;~
D$$oG L$8   _^][]U(SUVWSs\$4T$zX t
  ;|$E,D$,@ =  =  =t=X  EH@E<O8D$$G8D$(GL$0uG,_,ȈG   B0NlD$E8D$ }K9Npj Pj K   )   T$ AFlFhK   D    TD    MUP9NpPRt$$^   (3|$AFlFhTT$ ||$^   TD    Nl9Npj St$$   m(/T$AFlFh   T\D    D    |$0D$,H }t3ҁNlU9Npj RSV   (EPD$ J  |$AFlFhV   \TD    D    EPD$   3jD$,GuG,W,ȈG   EPNl@T$ D$09NpRPt$$^   a'T$,3T$AFlFhTT$0TT$ ^   TD    Nl9NpSSRT$8'T$,7T$,AFlFh3fTT$ T\\D    D MPL$ tGL$ <sL$    GNl9NpT$(SRt$,   &/T$$AFlFhTT$(   T\D    D$ NlU8 D$09NpRPt$,^   /&3|$$AFlFh^   ||$0||$TD    NT$(ҋA<A8yR.	I@FlT$tG<s   Gm$\$4NlS{9Np  j RW	   %_^][]ËE<O8D$$G8D$(GuG,_,ȈG   NlU89Npj Rj K   -%3|$AFlFhK   D    TD    D    D$,Nlx uxD$UPB@0D$09Np%SRP^   $ӋjT   |$0AFlFhj||$T^   \D    J9Npj SjG   W$/AFlFhG   D   \D    D    NlU@9NpSRSj   	$+|$AFlFhj   \T\D    U@NlB9NpSt$,R6   #/|$AFlFhTT$(6   T\D    Nl9NpSj t$,   l#/T$$AFlFh   TD    \D    NlEPU8D$09NpRPt$,^   #AFlFh|_	   TD    D    ^][]USUVWs\$u9stu@PuC^ 3  GXD$Nl_,W4\$9Npj Rj K   h"3\$AFlFhK   D    TD    D    GH@t3;
t(3D$8 t  C =t=   NlW@9Npj Rj G   !3\$AFlFhG   D    TD    D    W@NlB9Npj Rj G   !3\$AFlFhG   D    TD    D    C      W<   Nl9Npj j R   !/AFlFh   TD    D    D    W@NlB9Npj Rj G    /AFlFhG   D    TD    D    $\$K,_^)C,A][]USVWڋwu9wtu@PuGN  j j ωD$6%NlVh}]D$T$9Npt$Z   WSVh1AT$Fl\\$\]Z   |D    yW tT$R*FlT$DTFlP9FpRuR   b+VlD$    TTEA    AT$NlJ9NpRSWP   _^[]ÍAFlD$ P   |\TD    _^[]ËNl9Npj u   j _^[]ÍAFlFh_^   EA    AA    A    []U$SىT$VW\$$;|$,wu9wtu@PuGKAOD$(u_,CӍB+W,O   uBO   O8L$$D$BUD$G,j   D$G8SD$$UL$$t$D$,Ht/T$6t39E7   D$D$8   k   D$=  NlL$$9Npj j S3   ED$$/AFlFh3   \D    D    D    T$6   tG   Nl9NpRuR      AFlFh   D    tNl9Npj u2   t$iAFlFh2   5Nl9Npj u3   t$`2AFlFh3   T$TUD    D    TNl9Npj t$$   j 3T$ AFlFh   D    TD    D    VlxW tIL$$BIFhPNl9Npj u2   t$2T$AFlFhTU2   TD    D    D$6t9u$NlxW tIFhL$ Vl9Vpj t$ u   j 	7|$BFlFh||$,u   D    D    D    yW th%%8yVlJFh| tjh%Ћ&@%@NlL$$9NpSj t$$9   ZD$$/T$AFlFh9   TD    \D    T$D$9ujt
7uWkuRNl9NpSut$6AFlFh3fTT$TUT\D    D Nl9NpT$SSu5AFlFh\\D    D$A 3fAEAVlxW tIL$$BIFhPNlT$9NpSut$6AFlFh3fTT$TUT\D    D D$(ϋPԌЅuPyW tR#FlFhDTFl~   FhfTNT$ ҋA<A8yR 	I@FltG<s   GL$tG<s   G_^[]U,SىT$VWD$,    K;s|$AD$G8HL$D$G8AD$0    D$(u8Zu3_^[]ÉD$(U   |$NlY|$ua|$$L$0u6 D$<VuK(K 3<V3|$VU7       K06   C(t$PuQL9Npjt$ R1   )/AFlFhTT$1   TD   D    L$|$$uyX u	3ҋ{FlL$D$4D$( :A[  } Q  yYG  OuW,O,BT$8O   G,T$D$(uɉT$O   |$$D$    NlC 9Npj RP   12{ AFlFh||$   TD    D    NlS09Npj t$$R   T$,3|$AFlFhTT$    TD    D    Nl9Np!T$Rt$ 9   t$(   AFlFhTT$TT$   {    NlC09Npj RP   1T$ 2{0AFlFh||$   TD    D    NlC9NpRt$ 9   P2{AFlFh||$||$D    T9   L$tG<s   GL$ tG<s   GL$D$$      yX S0C4T$D$(taA\D$ Nl9Npj jPV      |$ AFlFhV   ||$D   D    D    ^sj RыFC$S D$(AXT$D$ usjRыC(ˉD$C,D$(T$D$$;CupNl9Npj j R   [T$ 3|$AFlFh   TD    D    D    Fl~   FhfTT$} NlFp   y;j WR&   -AFlFhT&   TD    D    VlT$,9Vpj j j    D$,3BFlFh   D    D    D    D    |$L|$     3Ҁ|$LB;j Rt$&   3|$AFlFh||$&   TD    D    |$L  Nl9Npj t$    j 3T$AFlFh   D    TD    D    D$HtS	L$$tQu GuG,W,?ȈG   .W T$ ;O)O
G G,PG,
D$$    3҉T$ RT$*D$\$ t$4Pt$,SD$0ut!G<s   G;G~G_ T$0tMNl9Npj Rj    /AFlFh   D    TD    D    N\$ӋA<A8ySD$0_^[]ËQ@NlD$,_^[]̃SUl$T$VW  j jdt#f  jdj VP E D$u3IȍQD  Au+j AD$ Pt	˹؃tt$t$Sd ED$u3DȍQAu+j AD$ Pt	Mv؃tt$t$Sd ^ϋU(j F(E,ωF,Uj FUj FEψFEFEFEFE8F8E4F4EPFPE0F0E`F`Uj 膢FUj tFD$FHEF_^][_^]3[U	VW33t$tiQD$PATjCPEt$trF$t6ta%t9~t}t$WfD$L$ɸ   Ot"   fFu~ tNȺ_^]U   SڋVWT${Dr|$ GD$,u9rtu@PuB.T$C WD$L    D$P    D$(    H4@L$TD$    D$$    @"D$DB8HD$    D$0B8ED$hED$dG0D$@$   D$    HfD$pL$4HD$|    $   GǄ$       Ǆ$       T$X|$\t$`L$x<Vt<ZtD$p      X    D  A,@ =tx=tq=tj=XtcI$u׀Xu$YtPWL$T$t<D$p   2D$p   (Yt"WL$L$pT$   EȉL$pB,L$DAXD$<@B,O\$8D$HD$tXtVu@D$B,OXtVu@D$B,LtYL$,t	3ɋWLӉT$(Wt
\$(\$(\$PT$PT$|P$   P$   C,T$D3ۅ~e|$8 Nl9NpRSt$\^   #/|$TAFlFh||$8^   \TD    T$DC;||$ Nl\$89Npt$<RSa   
+AFlFhTT$<a   \TD    W  D$DGLË\$j j ˉD$@C,WDD$TC,^lD$$9^pt$DRt$@Z   :
3|$8CFlFhTT$D||$ Z   TD    T$TyW tRFlFhDTNlS9NpRSR   	+|$ AFlFh   T\TD    NlL$L9Npj j t$,	   e	D$L3T$$AFlFh	   TD    D    D    T$DNlJ_D9NpRSt$@P   	/|$8AFlFh||$ P   \TD    Nl\$HT$49Npj SR   T$@+AFlFh   T\D    D    Nl9NpSt$@R   e/|$ AFlFhTT$<   T\D    NlWTL$T9NpSj R4   D$T/|$ AFlFh4   TD    \D    \$׋D$lD$t+WPT$3   YDP9L$t2WQST$Y      DPL$Y  G:G  |$   ^l3<VU7   9^pQj t$;CFlFh3fTT$TT$D    TD    D 3ҍL$XjNl9Npj j$   #   7AFlFh#   D   D    $   A    AL$XNl9Np!$      j j PΉD$LB:$   AFlFhT$@   TD    D    D    Nl9Npj t$4   j 3T$0AFlFh   D    TD    D    VlxW tIۍBIÍFh\$PVu_YtYT$tQNl9NpD$PRPk   V1\$AFlFhTӉ\\$k   TD    ZtQNlT$x9Npj jR#   /AFlFh#   TD   D    D    NlT$@9Npj jR#   /AFlFh#   TD   D    D    Nl$   9Npj jR#   X/AFlFh#   TD   D    D    D$  L$,x  NlJ9NpRPt$0P   3|$(AFlFh||$||$ P   TD    T$,NlJ9NpR$   P   t$$3\$AFlFh\\$|\\$P   TD    D$,NlJ9NpR$   P   t$$16|$AFlFh|$   ||$ P   TD    D$,NlJ9NpR$   P   t$$6\$AFlFh\$   \\$P   TD    Nl9Npj t$4   j x3T$0AFlFh   D    TD    D    VlxW tIL$TBIFhPD$tt$0T$0Pt$0G<V)  j j    L$`Z  YL$X   K89   [8FlS$   D$\t$$   %j t$(   L$paj j    L$xONl T$T9Npj Rj    O/AFlFh   D    TD    D    NӋA<A8ySF	D  I@Fl6  \$   j Sj t$    L$h  X   <XuIYuC\$L$Xj S   zj t$    L$hfj j    L$pT  \$L$Xj S   7j j    L$h%j t$(   L$ps  3ۍL$XSSSZR  Y   FlD$TD$t+\$L$X9   K8[8S$   P$   [j j    L$`j t$    L$h|$    NlT$T9Np:j Rj    sPT$tS^l9^pjj R1   J3|$ CFlFh1   TD    D   D    j j    L$`j t$    L$h|$ t&VlxW tIۍBIÍFhP\$NT$0ҋA<A8yR	I@FlM    NlL$P9Npj t$(G   j ]D$P3T$$AFlFhG   D    TD    D    VlxW tIL$LBIFhPVlD$t    T$D9VpT$4j j R#   D$D3BFlFhT$4#   TD    D    D    XGuV<Xu%Yuj S   L$`ND$      j L$\P-j j    L$hu  L$X   j j <V  ^lL$`Yju*t$   jj    D$\L$hD$X?Z   ut$jj t$jt$    D$XL$hD$\Nl9Npj Sj    /AFlFh   D    \D    D    VlxW tIL$LBIFhPL$XFl   jj D$\Nl؋T$T9Npj Rj    /AFlFh   D    TD    D    VlxW tIL$HBIFhPVlyZxW    I   FFlL$`jj    D$d-j t$(   L$pNlT$T9Npj Rj    /AFlFh   D    TD    D    VlyZxW tI	FhPVlxW tIL$DBIFhPNl9Npj j $      u7AFlFh   D    D    $   A    A +  WX   Nl9Npj RjG   /AFlFhG   D   TD    D    Nl\9Npj Wj G   /AFlFhG   D    |D    D    VlxW tIL$PBIFhPNl9Npj j t$,C   A_^[]ËT$$AFlFhC   TD    D    D    _^[]̋B4SVW   J   Z   B8    H0Fu9H<uP8ЁH   @4uM-   ttt PɺlDPhtW   u   ~;~hWx_^[QVtD$F@,^Yt$1=^YQS\$UVWT$C5j P   D$Wl$3fF  F   F    F    F(    F    fF,SfF F4UPF    FL F +   NF$ }"D$     DD$	FF      <rA<t=j jtCȃtA    1iY  A  _^][YUVuW9t,t(:yu#   sEVtZF    _^]UQSVWu>P9V}j >"`pAAA    } ]u}t    u3shĕWKjS֋_^[]UI4VWph  :$:EM  	j_^]ËE&  E$  	_^]ËU	W$_^]ËE015;_^]ËU	耧_^]ËU	_^]ËE90   N tF$N$tF A F     v(WVtOVtAvWȂvW迂tϡVt֋踡_^]ËU	_^]ËU	R3_^]ËEPt	_^]fZ9y9999999~::::    	


SVW~^;vAAfQP;whS^_^[U4SD$L$\$VW=U    $\Eƀ     Eƀ     M<  SM,'  C     CC  SM(z  MCP3@)d  MCP   ')K  MCP   )2  sMCj j sԍSP  E@0  3f4    C     E3ɋ 8   K  MCj sSPQ  su3j j 6S  j  C	Cx  {u"jh,{suC  P  sC    shu.  {su!jhz6u   >  63shu>  sMsss趹  C    C      C+CCC  C+CCC  C+CCC  ECy  EMCKh  EKSHHPLT  KCSPQM裿7  CsS@MP舿  CCSMPsk  M   j ssSSMRs=  sMu   s"tbsSMRV  SM[  sM3sscg  jj j j j sj M3j j $B  sSsM)  sMCs3P9  E     x+   H0  CA  MS  SMj #  SCMP  C#CCC  C    C    z  C    C    g  CCC   U  CCC   @  C   4  C	   (  C
     C     C      E@L      SMj ss־  jj j j j ssmsSsMh  suCsSP   C   {  C   o  C   c  sSMj K  sȋMCsSssPCP$  sSMjX  uD$$SWPD$(	D$,D$<    D$@    }s6t  sSMC  sSMC  st
Ms}  s{   ~4 tKMD$    MD$j VPj j 3%M3j j j j j j PKt2C~4tgf{   tE@s  EW0s  C     sSsMsssssC  susSsssssSCtPHh  \  SMj h   j j j j j dC5  SMsj h   j j j j j :tft p4    su΋SCԃ{ vKjQKsSԋs  u   j OlSP葇C  }   j j ms;   sVP   qmSԋPF7  CKCK)  SMS  S    CD  SԍCMPj CPCPCP  SȍCMPj CPCPCPMSCRp  SCMPj CPCPCP[MЉCs8\  SȍCMPsCPj j &C7  Sȅu9Su9Su9SuCC  C{K8   W}j Qj j sȅtcSBɉDȋBDċBDԅt@   tL    B0tBH΃b0BH    LB    B    B    St  uЋlj h   j j j j s3ҋqSȃWPCPj j C+  M{j W3/E   rtVW?7  }KQC3P   rtVCPs  sj M3V  CsP}CPs3Vn  SxAZ  }sj V3ҋ\;  SEA'  MSj j C  MCj PSC  MCPCPSC  CCC      CC    C  C    C      CKCK  C    C   x  sSԋMnCԋSs諅O  sM3FCC1  C   %  M   j s7iC  ssM   iC  ssSCMPSMj j s":  SM?C      SM(CC  uCԋSȋPLSh CtZ8~Dj h   j j j j P3ҋbD$    3D$    j PD$Pj j SȋPlCȋSȋj j j sss  sSԋMׁMSCjRA  sSsMC  sM3萁MjV>k  sM3s迁P  sSsȋMss4  SԋMj ssj   C    SM虫   sMsSs	sk C  sMSj j s	I C  M3j j j 	j *   M3j ss	j  C}  CCr  SCMPCX  MsV3@  sM;   sC"  s};   sqs;   s]PV   fC  s؋};   sԋ/s;   D$ss;   sPV   et$,    D$rV3ҋD$PV   eU  sSsMC;  }sjV   b|+   H$	  C8#us@tfKCL$MD$y uD$Ph,QqC      j j    dC  L$PI  {   MWsMWCpjd  SCMjPTCH  uCjP$   aj sCȋЋc  sSsԋMVh  Msj V3h  D$pPMSbhMD$p3\$  3j ͋Msj V3(h  s}ϋS~}   ϋj j cCԅt"p> O  FKԋ@%@ 	A9  V75)  sSMOeC  sSsM"cC  KCKK   C  s3s}%ωC|Ћs|Kj Q2gCyj P   bCCt  H   h  s3s}%ωCP|ЋsA|Ћs2|Kj QfCԅyj P   'bCԋCԅ
  H   
  SMj saC
  M3   j saC
  sM-   saCSMj2P
  sM   saSMj3PCU
  sM-   sfaCsM   sNaSMj3PC
  SMj s$aC	  M3f{jj s­   `C	  su3ҋzЋszSj R1eC	  su3ҋzЋsxz0   ΋j s`CԅtxW6K~{ :	  j sԺ   M`	  CuEu΋Sk{ tTlTu   DP^Cԅ  ~  8u\@ȉD$趀tJCԍsԀ8t?C}@    s7}j t$    _P65   _|}sj 61   _ȃus7M}LA8u5@s`D$t*Ћt$_CAϋ<\{   j 6   _  M   j j ^CsM_  u1   j sԋ^sЉCԋl_{ {  j sԺ   ^_  uCPC3Pbj j j j j j P3҉D$8X$Ct3ҋ΅PET$j sԺ1   '^WiM   j j ^C$u   j s]KCԅt+CtыPwȋCԉH΋SZ  Q6{s6h~  sSԋMtwMЉCsawR  sM3LwMЉCs9wC*  sSM wC  sM3wC  uCj s{3j sPssQj WSPCP$          W	  C     sSԍCsMPCd  sMss3V'I  sSMo3  sM3   sMS   MCj j PS=  j MCPCSP=  MCj PCPS=  jċMCjPCSP~=  CKCS+D$D$L$MPg  sMssSsssssVG { uCKCK)  NCK  CA     C!     CCC      CC   C  CH,CA(KCA,  C@,  CKhHuCKB  hu-  h ul  sCSsMPsssqCB  sCSsMsPssgC  sMSssC  sMsS	jC  MG   j j YC  @  MCjPG   	BWCȅ  KH  C   y  C   m  sSMW  sSsMo>  SMgo.  M3j   MCPS  M3j +]  MCPS]  SCMP]  MS      +CY  SCMP%9  M3ҋA0  f4  Se  SȍCMPCPJ  M3,;  MS,+  sԋMCPCPS*  My0   MS0   C   utP蹥   ~$      H     C   C    C   CSȋMPssCssM3C^sSMCHsSMމKCA$CC&{ tMSj s؋	bKCCԋD$_4Eh`@EMJT$
fq^f[]ËSMj ss輈렋SsȋMVss袈뇋SMj sj 艈CjsVsSMj jLsVj M3j j jUj jZDC%CSMPj jUssC CSȋMPssssCCCC    KCKCC CCCCCCKCtA(CCrPE0`CCY}j jd?tFKN(s0s7z`sCCuj jdCSj s9K;;;	<<%<%<%<1<1<B<X<q<<<=<<=<==9=D====>>'>8>C>T>h>>>>>*?:?U?z?????@=7X=@/@B@U@g@|@@@@I@X\=HI=@T>@@@A=5AZ5AX\AAMAYAH=qAAAAB&B?B%<B%<BC`CC7X,U==CD:DD==DD=DD(E`EEHDFF
G$G-GbG7XGGGGGHH H1H=ZDHmHL7XHIHH=Z=X\=HHHH=X\=X\II3IIJ#JQJiJJ=JJJKKJX\MA=?KJKdK?K|K|KKKdLdLLLXMtMMMMNN2NNNNNNNNNNNTOOOP;PgPPPPPPLH*QLHQRSZSSS>TgTX\=Z==TT=?KT,U==?K8UUU=HsUUUX\=UUU	VVDD*VUV%<VVVVV=X\VVW&W;WPWzWWWW	X7X,UCXOXeX~X=X\XXXXXXY3YWYrYYYYYYYYYZZ"Z+ZIZ^ZZtZZ[[5[R[Zp[x[[[%<Z[Z[[[\\\\'\X\2\Zc\\\Z̃SUVWT$ l$GD$0?  f;wNm0f9Et*fff     uftbf9Eu4El$  f;r`+Ѐ` u
;  sct$4t$4t$ t$,^+f<Eeuft
4Eb4m돸  f;wRP;  v_^][  fjȿ?  f;FȋD$0BD$4f
B_^][Ë_  f;u__^][ËD$0L$4D$ L$$8 D$L$tD$ Ph,S蔱hXS脱D$_PՋ@_^][̃SVى\$   3D3L$Wxx@3   3    Uf     ;ub}D$ȭ$:E uIC$:ɭu<   ;~ʭ+݊:uB@;|D$]_^[Ë\$ $y]_^[_^[Ë^[̋T$   w$D$UȭD$3ø   ̸   QT$$L$PD$;   3|$;QVW7f     T$E   D$=   t;t#utvt=   t=   tf<E;u;   7_^YSVW   $kF   t@      L2Bu   _^[ÊF<-u)F   t
t
D1Au   _^[<>u3p   ~>_^[k      _^[      _^[      _^[      _^[j      _^[l      _^[À~*u8Ft1   Ѝ1*u8/t
tA   A_^D[m      _^[n      _^[35   ~=_^@[ÊF<=u7      _^[<>td<<uh      _^[8      _^[ÊF<=u9      _^[<>ui      _^[6      _^[À~=
  4      _^[À~|tg      _^[o      _^[      _^[f      _^[r      _^[V   tfD  ;u
D;uAT1Au'uu   A_^[Åt;   A_^[   _^[Fu      _^[   0uGF<xt<Xu<Ft/F   t     L2Bu_^[3tD2Bu<2.u0D2Bt@      D2Bu   2<et<EuUL2u+t-u;D2t-D2t    D2Bu   2F9ff     L2B   Fu_^[ø   ]t0t@]u]   ;   Dʉ_^[F      fff     L2Bu_^[N3   Bt=     FtB(t:u8Lu@L0@uM     _^[ÐT0@ʄtu)u)u_^@[F    wff     D1A v1FtA   ;   W_^[À~'u|F      tf     D1Au1<'ut   t<'t	D1Au<1 A_^D[À~u~u      _^[ù   1Ft D1AFu;   _^[   3_^[      _^[fkjkhEjEj	jf-hig;fOgg;ggffffff,g hhhhkkkkU   3ĉ$  SVD$    WD$     H|L$u
ǀ(      L$8F    L$0T$3ɉ   L$8$  $  t$4  L$$ω  )T$T$T  @      T$      D$ (     D$=   u	|$   ? u2u33T$D$         3T$D$   =   u0GL$D$;urL$   ;   E\=   u&GD$uDL$t;u1   /=     GD$uL$p   t;   T$D$PWL$8      |$~ \$u#T$)D$D$F   F$L$0D$8;v+D$0AfQL$0PL$4T$<;w׋\$ {W tF   ~    V   e   ¹dtatU-  tGsRtGCD$D$,D$(PhlV|$4=GF	   8L4QhESF   vhv讛D$        tX= tEpKt
PHW$)xIIWpKtPPW   t    u   uBus   tU   sL
 uFW_tkWtkWtvKWl׋k   tkD$$$  _  D$^[3d ]QD$SU2ۊ\$VW      NW   t$ht3K  x*<  Ht(*ux/HuB     Bu_^]3[YÀx-    @ р
t
P@ʄu       H@tD  ]  H@u_^]3[YÊH@t;  H@u_^]3[YFn  H   FtfL(EFuƽ15  t$tuXNtɊx:xuGCNxxx+u\$H     \$H     uX$NtɊx:xuGCNxxx+u\$H   k  u,NtPɊx:xu<GC3	XNtɊx:xuGCNxxx+\$H      uYNtɊx:xuGCNxxx+\$H   wfD  NtɊx:xuGCNxxx+D\$H   H      @\$x_3^][Yfqq8qppsqq     	rjswr0t  UQSVW!     Pj(d~tnUWj jF   fF jjfF    %  =  u~uFuhtPD$      t!   fu~ tNEf_^[]̡t
D$  3̸̸_. ̸   U= SUVWt
3_^][]\{  8u3j@؃t
SH=       = uhj1  = u3j@= pKt=   |	=         54,tWpKK,   u8q  tSP^  tQH=   =   j\j hI       6a   `/R	   ,C   x74c   @%= u2duhj  d5`Ћ"       Pj
`  = tupKt
PHV$)xIIVpKtCPP7j@Ȁ= umpkVWI    hHHH3jh:Wj h+Wj h1Wj h2W = u3j@j IVȃup   At;   ;j Bh`;d;4W   9DI   3\IE=ɋ=lIE݉=TI#-PIZ~3XI
   pI'gfff@£XI3hIpItͣhIu`I          tQPtSHHt
QD    t
SP_^][]UVW39=t'h-ha hhějG_^]ËEH  $}f=_^]f _^]f_^]ËE 8@H@ X_^]8MHAXA _^]ËE @(_^]9=uVE (@_^]ËE_^]ÊE _^]ËEEE_^]ËE    _^]ËE \@l@ |@0_^]9=duhjJ\MlA|A A0_^]ËEE_^]ËEE_^]ÊE_^]ÊE_^]ËMUuE|r|=  v  3Ʌ|sWfD$t$T$;|
;vЋǉ5_^]ËE_^]ËE_^]ËEMǉ_^]ÿ   _^]P{_{p{{{}>|}|{{}|}}}}o||,}}<}}^|}}.|}}̃SUl$ŉT$l$VWD$3ɉT$ L  tD   AuP  3t FuT  3҅t BuX  3ɅtD   Au<  +++~   _^][À8   tb`  tX= tEpKt
PHV$)xIIVpKtPPV3ۃO݅  L$$3I   D$uBXJtt$ l$UY\JtЅtV$D$T$ l$΋ÉL$  |9  RPt$(UX L$j h   +ȋD$(PQ8 D$$h=   |<t$耙RPt$(V j h   +D$(PV  t$D$$#~RPt$(U  333D$$    É`  ǇL      ǇP      f4  f6  tn~3ҋ ƉL  u\$$ǇT      ǇX      \  ~3ҋ    ƉT  Ѓu|$ +323`  ǇT      2ǇX         \  f4  d  0  8  <  3_^][̋D$@Vt$Ft
PH~_ uW39~~1S3fFDt@    p,G;~|[~_ _u&F^t
PP3̃S\$VW33C|$t
PH{_ u萲U33ɉL$    ;k   CD}   xuw@{ s,uL   tB BЅu	uu%tfx xuPSUǅt|$L$\$u   3E|$`EL$[{_ ]uCt
PPuFu_^[UQMSVW-        39ոtBr   _^[]ËuE^ ~$~ռ3uHռ3##ǉF$N ;u;t)Ft"f           @u}tTռ3#N #F$t   3_^[]3_^[]uUuMA_^[]ËEHE_^3[]̋T$S\$Vt$W|$;Lσr;ust4:u't)B:FutB:FutB:Ft3u+_^[̋D$Vt$t | uuL$T$t|
 uuRQVPt$?^S\$Ul$;Vt$LӅuD$ ^+݅]E؋[W|$$u   +_^E][Å~"Jtx:xuFGJy3+_^E][+_x^]x+E؋[̋T$B(R,Vt$Ft
PHD$L$F(FN,^tPPY̋T$BhRl̋D$@h̋T$BpRt̋D$@pV  t AыΉ  U  uǆ      ǆ      F] ^QSUVWl$<  Ga<tE<vtA<mt=h<9h 9j;h-hd hhěj   _^][YËGt
PHG^t   j W   jЃ_ u蕭39_~73Gt(tvtVz+u6uC;_|ϋl$  tFPt6u?_ urD   u(9ou6w3Ʌ~Gtz uA;|Ga/  3_^][YhjWZGt
PP_^]   [Y̋D$S@t
PHD$Ul$VpNWtIxx1t{tuչSgtyӋD$WI3;0+HBD  t@3;NÃ؃uD$_^]@t
PP[̋L$3̋L$   QSUVWaK   A  w3Ʌ~$GfD  t
z   A;|3ҋ/  39_~03wL.tOD.    tD.    C;_|ҋG@t	PU  tBfD  ]s$tuvFЃ֋RsӋRޅu΋m uč  艡  t;E   D$pFt6ЃuT$tQm uō  9  tRsVt$J @     uBu(YF    FuFtvЃ֋SQu  Ҡ$   G@    t3ҋ蹈GD$  t"   fFu~ t΍NP39   ~'ff        4A4QF;   |㋗   tPGGaՋPtP  t   ЃGt
PPGGa΅t
PD8   tb`  tX= tEpKt
PHV$)xIIVpKtPPVpK= t5t
PHW$)xIIWpKW_^][YËGt
PP_^][YUXJSUV3T$WtЀ~_ uFt    u   33T$9~~53ۋFLty   D3RT$+T$G;~|ͺD   /\JtЃ|$ t-NtfD        IuPS~_ u裧f f$   ǆ       ǆ      ǆ      ǆ      tu~U u   Ѓ_^][]̋dt1t&-  tsuøøLø4̋D$W|$}@kdd   h  ;  ~  +х3_Ëi  PA<QЃ   _Vt$Ft
PHD$  D$  Fǆ      ǆ      ^t
PP3S\$Ul$Vt$W|$NtQHN3ҋǅNNڅ_Nꉮp  x  t  ^][tQPYVt$W|$F~Nt
PHFǆ  0  ǆ      ǆ      t
PP  3_^Åt
PHFǆ      ǆ      ǆ      ǆ      t
PP_3^̋D$ǀ(     USVڋ\$t$W@  } }t/  39M3;  39M 39E$;   U    ˍYfD  Au+ˁ?     ]˃ 8     L$C   $   z](Su$    u WuuuQRT$4	$  D$΋T$Su$]5    u WuuuPS$I  UX   Ëj PRT$D$$dt[H;ˋ]uQ ;uJ    thdjVӂ   _^[]ËNt,      Iu]} u   T$jt$Su
F_^[]Ë~$tuwGЋL$ 
JE(t MF$FD$FEEȋEFE FE$FENF3_^[]h-h١ hhějx   _^[]fWWW֐ݐUQSVWT$3Gt
PH](t:j jmFuOuӃF   E    ^FET$Vu$u uuuPuu$D$ti> uduӃ= tEpKt
PHV$)xIIVpKtPPVD$W uu3ЋPGt
PP_^[]ËT$L$j j j t$,t$,t$,t$,t$,t$,$t$$T$L$j j t$,t$,t$,t$,t$,t$,s$t$(T$t$(L$t$(t$(t$(j t$,t$,t$,1$Vt$WFt
PHT$SQjJ~j j j t$@؋t$@t$@t$@t$@t$@1,t	Ӌ?G~W [ut׋NFt
PP_^UVuWFph%tjjjjF   t_= tLpKt
PHW$)xIIWpKtPP_^]W_^]QSVW|$Gt
PH\$j jt$$Gޅt
PPt3_^[YS7su
   _^[Yhpj j j j h Pjt$<ӋT$_^[YVt$WFt
PHL$   ؉   L$$@   F^Ft
PP_^S\$VW|$wtVHw3ÅET$3Ʌ҉   EȋD$O^   t
VP_^3[SVt$WVtRHV^^L$   D$      ^^tˀ^^t
RP_^[Vt$WFt
PHD$   L$   F   t
PP_^Vt$WFt
PHD$   L$   F   t
PP_^Vt$WFt
PHD$   L$   F   t
PP_^Vt$Ft
PH  t   ЃD$  D$   D$  F^t
PP3QD$SUVW;D$  XJtЋ|$Gt
PHl$ t^}  tXwN_x1t}tuչS}tyӅyUhؚ   VWzD   j j j Ǉ        w@u9$  u	GD	֋zW ut	֋ J    u
Ǉ(      Gt
PP\Jt_^]3[YVt$W|$F~ t
PHǆ    "t
PHǆ      ǆ      Ft
PP_3^Vt$WFt
PHD$  L$  F  t
PP_^̋D$SUVWt D$$t |$  |$Gt
PHl$t`}  tZwN_x3ft{tuչS{tyӅyUhؚ   VWxJ   t$$Ǉ      t$$t$$  w@u9$  u	GD	֋wW ut֋G    u
Ǉ(      Ot
QP_^][_^]   [QSUVW|$Gt
PHl$t^}  tXwN_x1tztuչSztyӅyUhؚ   VWwD   j j j Ǉ      r   w@u9$  u	GD	֋vW ut֋F    u
Ǉ(      Gt
PP_^][YUS3щ\$VW3T$3t$ D$9B0  3ɋL$   ;t	   r3t   ~	 ^tF~
 u誖{ t   u3T$$9   u#{uWWWhHRT$89   t@}u3   uCu      P   Q   W ~	 tFuD$L$T$\$E    E    u   3t$ t$ @D$L$;BuGu_^[]VW|$uE_^ÊGa<tM<vtI<mtEh<9h 9jSlh-h¤ hhěj5l4ɸE_^ËOtQHOW tE   @ tB$  t4V%  =  u~uvt3袆OuEW@dt1t%-  ts"tL4t
QP_^Vt$t&Nat#vtmth<9h 9j$k^Ã~@ tFt
PHFW~Dt
PP_^Vt$u^ÊFa<t#<vt<mth<9h 9jj%^ËFt
PH~W Wt
  $  t3Q%  =  uyuyuA   V@dt1t%-  ts"tL4QRVJs$  u3/Q%  =  uyuyt3	謄~W t2    u)0  FW ǆ(      t36  f4  Ft
PP_^̋L$tTAa<t@<vt<<mt8h<9h 9j8ih-h hhěji   ÀyW uAH#A@ø   ̋D$tQHat?vt:mt5h<9h 9jhh-h hhějh    ÀxW u@@ø   ̋D$t@L3̋L$dt1t&-  tsuøøLø4USVWMt$L$t7t2Av3h-hJ hhějg   _^[]û   \$t*j   T$X   _T$   {        thjWp   _^[]ËOt      IuC;uYj   Y   L$p    F:CutvЋL$F    L$uӋt$\$jVȃu
A_^[]ËEAEAEAE$
ÈA$   G@    t3ҋ'o3_^[]GD3_^[]̋L$w@D$V4D$W~xx'X;~
Fx_^Ã}
ɺ   DFx_^ÃU,ESVL$0D$    T$Wu3OGu+?@u= /  &  >file  ~:  3D$    @D$_T$<0&u	   3WfD$(T$,L$(T$@;|
  D$PSu3؃         ~/\$ui~/ucNV   tT/t	L0@utAuloca;
ulhos;Ju
t   :JtRD$   Ph4b  03  #   @%   0   L0   l0**يۊ*ъ*ʃمu[0t#tu?8u+=u+\$0_D$    @   u&tЊL0@uŋL$\$AL$뷋\$uy&t	=   L$| u#0tf#t|0&tL0@ur&u T$ BT$2ҋL$AL$ML$2ҿ   AL$5u?tL$AL$u&u   2ҋL$AL$3    u3ˍQ    Au+ʁ?QӀ:   s   ʍqAu+΁?AD$u3wfD  GuD$+?u vf  f;
]  :ZT  D$4K  u;cach;9  e   :B+     D$ PD$(x:D$$   8  :mode   L$P7   D$(   L$$D$ t03ۉD$r   ΍QAu+ʁ?;uNL$׃r;ustX:u'tMA:Fut@A:Fut3A:Ft+D$C4؅ut$D$   t$$h|_tL$LtՋ%;D$$   D$(s   #D$D$T$B׀: ?\$t$4V?&ȃEu)VhD$    _Mt$-  3ۋMD$MD$_^[]t$D$   t$$h^uAGj P.؃t-    \$tWVS d$;    =_^   []U$SL$ 3ۉD$$VW\$\$9  }8u\$+   t\$   t
D$   D$   t9t    j h  |$,}-o  h  j VD ƉD$9\$   8u^j@Ful9tPpKt
PHV$)xIIVpKtPP3w  V3w  Ft
PHF   %   Famǆ0     j @%    FH  F3f4  XhPj Fxjh   xFUFZ      N F0F$N4Ή^dǆ   H/F$                j hPj j@j hPj j@j h j jj@j hЄj jP8^W  L$$   N<Fu%h-hڧ hhějB]   >T$(D$MPD$PEVPD$   u4L$\$|$3҅EWDPQV1ft`= tMpKt
PHW$)xIIWpKtPP  W  E\$   PFj \$,PVt=
  u   ȋЉN@d  FHy	 tAy
 u/V΋RNA~W u=F  j @@@MD$FTHtD$NFHy	 tAu袄3ҋNAF SF@F@F@~W Fav  $   F@    t3ҋcFDjhxuVu2Fa<tH<vtD<mt@h<9h 9j[h-h hhějZt$     ~W ΉL$  VH#V@  L$D$ы=}  VЋЃD$΃D$t  =H D$  3ɉT$L$Y = u3j@t
WHL$;HrD$    3HD$t
WPD$3|$t-hL$QVЃtt$hzPV$c3ۋ|$tX= tEpKt
PHW$)xIIWpKtPPWL$AL$\$$D$ȋ׊Fa<t<<vt8<mt4h<9h 9j0Yh-h hhějYw~W L$ukFH#F@ucL$   ΉV@a53ҋ5Ft
PHFǆ  ǆ    t
PPFt
PPFa<tE<vtA<mt=h<9h 9jeXh-h hhějGXGa   ?~W u#N@#NH|$щL$$ttGa   t$$3ҋ3D$,8   { Cu{ u{ u; t߅tb= tOpKt
PHS$)xIISpKtPP_^[]S_^[]̋T$L$j jt$T$t$L$USVW}    &   Ej j(E%FD$   W   j FjfF fjjF    lN%  =  u~uFuCWqt6j j׋&؃u1HIANu#@T@@@MD$      t%D$   fu~ tcN'_^[]Vt$WFt
PHT$j t$ t$ t$ ~W uu3ЋF.Ft
PP_^Vt$WFt
PHt$ T$t$ t$ t$ ~W uu3Ћ-Ft
PP_^Vt$W3Ft
PHT$SQj\؃t%j t$$Ӌt$$t$$Ӌ΋%~W [ut׋F-Ft
PP_^Vt$Ft
PHD$  D$   Fǆ      ^t
PP3Vt$Ft
PHD$  D$   Fǆ      ^t
PP3̋D$@UQVh-Rt$hěVS^YQh-QhhějxS   Ỹ(SUl$43V3D$    WE|$H\$\$,\$\$ t
PH8]_u|T$]ED$0  t$@T$H t$(  ~+    N"3D$<L$$~4~t$Hߋ+
;      D$<L$$t$(|$H;u1FB  3  F D$<  ^   {׉|$tX3΍yfD  Au+ϋ|$At$Uxx+uBRD$<L$$@D$<;0TCt4D/t$D$    ù      u38 t@8 uft@8 uX    t$(D$,|$F ;D$<uFD$    uD$     u"@D$7@D$   33ۀ}_ u8{D$LtL$D$PtD$TtL$,D$XtL$D$\tL$ \$0u6u2T$t!t$Ht$HhUNȃL$   L$3ҸEQDPSUYT$,t!}W uu3Ӌ)Et
PP_^][(j yȃuiD$  PA<QЋȃMbVt$Ft
PH   |$ EFHF^t
PP3QS\$UVWC   t
PHT$  6  ~	 tF~
 uxFD$ Q@uD$$3   uD$$3	   u*   tH3D$$   D$$3ID   #uD$$3Il   &uk~	 l$$m tF~
 uwFx$H+x(~	 L$tFuwL$D$$;O8   wj U3ҋפ3'
  uyt$$PA(RЃ  ~	 tFuVwCt
PP_^][YUESVW  $@   hJK3f_^[]ù@   KhJ3f_^[]ËEMt@@ Ej j M3_^[]ËUM_^[]ËEQ  j Ѓ_^[]ËEXJE\J3_^[]ËMp:  p:_^[]D$    D$_^[]ËE_^[]ø _^[]ËEMHP3_^[]ËE3ɃDM3 _^[]ËEp 3_^[]ËE3_^[]ÊE3_^[]ËE3_^[]ËEM   3_^[]Ã= M     _^[]ËEHtQHE}   XKp~   uXtu׹SWty˅xE}E3      3      $   E   utn!}G  PP3_^[]ËMB[  %  fBfH 3_^[]ËE     @    3_^[]ËE  $pEH3_^[]ËE H3_^[]ËE`J3_^[]ËE `J3_^[]Mf/L$r3   hf/rTWfD$f/r\f/vt$|$    |$t$(u RPiL$  f+ffffȋEщiMRPQJiȃE3_^[]f/~ǽ?qOL`ȿ)ۿU$MWSVWfD$QfD$(Au+ʋUrBu+֋u~Fu\$B
+D$$    |$(Ƌt$,D$ 3ҋED$D$D$|Q\$MY Au+ˍAD$ET$ LYAu+ˍAD$ H;|\$;T$}$EQAu+ʍAD$     D$$г   |$|$ t$$VW   UX     \$$N Fu+FPRS {39\$~-EVFu+FPQW| GC;\$|ӋU GN Fu+FPRWL UFNFu+NQRW* D$0fD7  _^[]_^3[]̋D$~   V x ux ux u	x ptHtW= tDpKt
PHV$)xIIVpKt^D$%PV^̋L$S   \$       y uy uy uy tIVWrBu+ց?ztt? toËϊ:utQ:Puu3ύQD  Au+ʁ?Qׅt&uz맋ʍqAu+΁?yu3_^[3[̋L$V   t$       y uy uy uy tIWzBu+ׁ?Bt@: t;N~4ʍyAu+B?uB؋x@u+B%?u38_E^3^t$t$cȃ39D$tP   &3ɃUuut$Zu$T$]ËUE]̋D$u    x ux ux ux tH̋L$u3D  y uy uy uy tIVrBu+ց?Bt>: t9ʍqAu+B?uBދp@ @u+B%?uB^̋L$u3D  y uy uy uy tIVrBu+ց?Bt>: t9ʍqAu+B?uBދp@ @u+B%?utʍq Au+΁?^AË^SUڍiVtLqWN} x2 tCOtuӹS/OtyӅ_y^]3[3E D^][̋L$xD$;H}	@ɋ3̋T$L$ct@ x tԼË   3̋T$L$3t@@ÃQSUVt$   WtY,Jtx:xuFGJy3xx+ыL$ҍqEt$u3ލKCu+ف?L$@ )ÅuPtat'fD  HtɊx:xuFGHxxx+L$u+FtL$L$}t$s_^]   [Y_^]3[YËD$*w3̃SUL$D$VqWx@       _^][ @  u@       _^][V?      u@       _^][n    u(@       _^][ÁD$       fD  ˙F3҃m L$ʁ    L$t?~΋D$+t$_(H^][̃SUWL$fD$l$ًL$VWD$3L$fD  ;s<ΙCT$$3 L$ȉL$    tD$?~CL$L$,D$+\$_^i][Vq @  u	
   ^F?      u	   ^N%    u	
   ^F   ^V<[t<'t<"t<`uKSU3<[]      Dʀ~ t)W3:u8L3uѿ      ߈.E<3 u_. ][^QSVW|$   譯w<(   f6虯vu   tW9tEpKt
PHV$)xIIVpKtPPVpK   tX= t@t
PHV$)xIIVpKtPPVpK   tX= t@t
PHV$)xIIVpKtPPVpKw(tX= t@t
PHV$)xIIVpKtPPVpKw,tS= t@t
PHV$)xIIVpKtPPVG$PAЃ= tMpKt
PHW$)xIIWpKtPP3_^[YW_^3[YVW|$7tU= tBpKt
PHV$)xIIVpKtPPVD$Pt$19_^UVW}?    EPu8u   _^]j j j Vu茱= tIpKt
PHV$)xIIVpKtPP_^]V_^]QVt$4W%D$    NV~( QRDPQRQRQRQRh8vD$<PD$@8u	V_^ỸSUVD$    W~( n   F,hD$83ۅt'fD  ;^}F4SWhy8CuߋD$ttPWhW8uD$   WvD$vh̝UPOtX= tEpKt
PHW$)xIIWpKtPPWvD$vhUPD$vvh8UP    tvD$vh؞UP    t2vD$vhHvP{D$(uƆ   _^][ËD$_^][USUVWى\$;   uh7u   3_^][]ËMD$j Pj j j2   t$@t$t:Ƌ @t
PHNxt3f;   r   A@   @PA$t1tmF ty t	FWfD$\$t.V$yW uu3F$@t
PPt$   踨\$uǅ      3= tPpKt
PHW$)xIIWpKtPP3_^][]W3_^][]SUVW|$?    D$ Pt$ q4\$ tvtvVPhL"5= tFpKt
QHV$)xIIVpKtPPVu   ;t`= tMpKt
PHW$)xIIWpKtPP3_^][W3_^][UVWOGu+t3_^]Í}   RPt'"Otf"uAFAuf" _^]̃SUVD$    3Wl$9n(   u
D$%KD$D$\$$D$h0PS39~~)l$F4D$WUh8PSG;~|ߋl$~, thHhPD$PS   = tHpKt
PHU$)xIIUpKtyPPmUa\$$D$h,{PSC39~~(f     F4D$hXPSG;~|F,tPhPD$PSN(хuVɸ%dDPRvD$ hpPSD$,_^][̃SUWVfD$L$3] D$W0|N|$fD  9w;Ѓw$rw\.F0}D$_^][_^][USVWuD$    Rh\1u
F_^[]j D$Pj j j-؃\$$tWPPhEu= tEpKt
PHV$)xIIVpKtPPV  L$WfD$\$tN   3t7D$D$fj j P@u+@D$ F;}L$Ӌt$t$
D$3D$*tD$    D$$      4    3L$PQD$u
D$$   R3ۉD$tFL$j j IVFu+FVPt$۪ L$$D$CD$;|t$   u,hPNjD1h-hZP hhěj)1mCt
PH    |	    v	֋   D$    r讀D$胁{W T$utn	ǮEL$8EEL$D$$_^[]_^[]U    3ĉ$   ED$`E$   ES]D$,3D$4D$\D$ D$V$   K@W3D$3$   \$XQD$    |$$|$`D$@$   $   D$DD$HD$LD$\D$PD$D$T Au+ʍAKD$0QAu+ʍAD$pE4˚tpK   |$8:  j VD$8y  Vj P3 苚tpK   |$  j VkD$5  Vj P L$D   pKD$hL$,;E  |$` L$X4t$|   ΍QD  Au+ʃ         Jtx:xuFGJxxx+uHt$|FxA u5t$4L$pD$dPV	  t$4D$$D$D$t$,  t$||$4i  <=t  AA<=u+Ɖ$   APhE6,|$tpK     Ǆ$   Ǆ$   	   Ǆ$   Ǆ$      Ǆ$   ȟǄ$      Ǆ$   ԟǄ$   
   Ǆ$   Ǆ$      Ǆ$   Ǆ$      Ǆ$   Ǆ$   
   Ǆ$   Ǆ$   
     \$|3$   D$tfD  Ĝ   ;u^Ę   tS~%@ Jtx:xuFGJx:xx+D$tt"$   @D$t||$3D$tpK/  $t$΍QAu+ʃuIѿJtx:xuFGJx=xx+t%t$Vht$<pK   D$$Ǆ$        t$DtZ= tAt
SHV$)xIIVpKtSPVpKD$D$DD$      t$HtZ= tAt
SHV$)xIIVpKtSPVpKD$D$HD$    `  t$LtZ= tAt
SHV$)xIIVpKtSPVpKD$D$LD$      t$΍Q    Au+ʃuQѿ,Jtx:xuFGJ   xt$x+   ΍QAu+ʃuPѿz    Jtx:xuFGJx?xt$x+t'Vh0t$<_pK   D$$t$<dt<DtǄ$       F  Ǆ$      6  t$\tZ= tAt
SHV$)xIIVpKtSPVpKD$D$\D$    O  t$PtZ= tAt
SHV$)xIIVpKtSPVpKD$D$PD$       T$TL$D$D$    BT$T   t$|hHt$<pKD$$   t$= tDt
SHV$)xIIVpKtOSP=V1΍QAuD$<+@L$(D$<D$dD$,4AL$(L$ pKD$h|$$@D$hi3t$D$Dr  = U  t
SH\$DS$)xIISpK%  SP     D$$늅u|$\  t$HtZ= tAt
SHV$)xIIVpKtSPVpKt$LtZ= tAt
SHV$)xIIVpKtSPVpK3D$HD$L9D$(4  9tDt
SHt$,V$)xIIVpKtPP
t$,t$4$   D$hPD$(D$4    PD$8PD$hWPLD$$ulD$P\$ |$,\$(|$8tJ3~D t21tD$PF;|D$dD$<A;}    DF;|K\$(D$dD$<D$,pKD$8\$(|$8uD$<   D$(   |$` u"t$4L$pD$dPd  D$$ue\$D   t!t   <,rAIEքu贏t3D$@<vj WD$@D$ u   D$$pK|$@Wj P
 x   ˻   L$h;~i|$@D$D  T$lD$D$l    +3ɋD$l= Or   L$hAuD$NK
D$D$CL$h;|L$(vD$|$<D$   D$    D$pD$0诎tDD$    O\$D   Shlt$<D$0%t$ |$ pKD$Dt$j W_ȃL$u t$   |$ pKD$$t$W|$ j WŇ $      T$4|$4GWǇ      OD$`G$Ǉ     u$   u2|$4   G0         $      D$\G(D$PG,  |$ SWPD$h    D$\    褛 T$(|$@   ~DD$3ɉ|$@D$  IfDD    D    D    D    uˋ  |$(Ë\$Xt$pVB zsW% D$(t$0VxsW D$43ۅ~Z@      D$8T$0D$0      t$0~VPWȚ > *L$A<GD$(C;|L$3҉T$X  L$A<    |$048NfD  Fu3+t$ \$p9\$Tc   D$$   1  ˍQ Au+;  D$֋@4   |$  ~#fJtx:xuFGJxxx+   D$L$X@ = |   pKt
PHS$fnI3fnxIfbfnfnfbfbff~xIfsSf~IpKtPPS$        |$0t$ \$pC\$p;\$TT$XBT$X;T$(S\$T3~1    D$tPhht$<&D$   F;|փ|$ |$Lt$Hu;3Ʌ3;t)ԟD$   ȟEPht$<\$D$P׋j   3D$     \$0u%߉|$0h MD$$PD$PD$(39p~)D  WhD$(PD$P[F;s|\$0t$~, thD$$PD$P0tX= tEpKt
PHS$)xIISpKtPPSD$    D$D$$$   t5D$$   |$4tuƆ   ֍L$   #   D$D$$,F,jjvE؉$   螮F0h    t+\$;{}C4VhdGu$   S\$ sVh@ttWs
D$$   D$$tY= tFpKt
PHW$)xIIWpKtSPWpKtj= tQt
SHV$)xIIVpKt)SPpK|$@VpK|$@PpKtZ= tAt
SHW$)xIIWpKtSPWpK|$HtZ= tAt
SHW$)xIIWpKtSPWpK|$LtZ= tAt
SHW$)xIIWpKtSPWpK|$\tZ= tAt
SHW$)xIIWpKtSPWpK|$PtZ= tAt
SHW$)xIIWpKtSPWpK39|$T   4   = x   t
SHV$fnI3fnxIfbfnfnfbfbff~xIfsVf~IpKtSPVpKt$G;|$TQt$$|$8tk= tRt
SHW$)xIIWpKt*SPD$pK   WpK|$tS= t@t
SHW$)xIIWpKtPPWD$tNt P_^[$   34d ]ËL$`t+Q@Ѓ_^[$   3
d ]Ë$   $   _^[3c ]ÐK9Jt$T$3t$t$t$t$At$T$   t$t$t$t$̃D$L$SVW\$|$x8 \$t$t
_^C[@U3A    A(9)   Qz u6z@   3]_^A    A(A0    A4   [Ë2xx@;t3   yzutA   A(l$z@ux;I(Al$Zu|$9D|$|$tÃw$l$t$\$D$$E;)yuI8   xAغ   ADxAI   B|$xAI   BxAI   yu0Q2xD$$@@;uz ĠEƉAA    ]_^3[Ët$B  UutE        ]j j`VMu	   ]j`j Py 3]QSUVW} t+U     uE   u薆E    E u   >u,hPNjh-hZP hhějcGt
PH    |	    v	֋m3ۀ   r	d؋dW ut	Ӌ(u   pK~^tX= t@t
PHW$)xIIWpKtPPWpK= t@t
PHV$)xIIVpKtPPVpK<u,E    tX= tEpKt
PHV$)xIIVpKtPPVu\tg~  u^~ uX= tEpKt
PHV$)xIIVpKtPPVutQFuFt    ~6  t$;wuwtfD  FuFtuj\Ej Pv _^][YVt$tZ= tGpKt
PHV$)xIIVpKtPP3^V3^QSU3VW9]   u    tMÉ   E_^][Y   hȠu	G_^][YËNEF8j Pj h   j.N8= tEpKt
PHW$)xIIWpKtPPWuE_^][YUDSVuWL$H3ۋMT$8T$,Wt$HD$    fD$ D$,   T$0};v  _^[]ËMU0  D$$D$D$ D$ D$4D$D$0L$DT$@D$fD  u  3t$9t$,u)yT$'t$   ;  D$,    yT$0\$0ظ   \$0+E;y  D$H+;k  c  ÙD$ʋƙD$;L$|]
D$ 9D$vQ   ȉT$ƺ   ȉL$ T$Tz  t$L$t$$   D$D$SWPL L$X3T$؉D$(;\$<Ot$<rfD  ;ust4:u't)A:ButA:ButA:Bt3T$@t!xu;\$<~L$t$
r3҉T$@t$L$DtD$yq3ɉL$DD$D$ t$;|$H  #   t$4D$0trtq3\$tb= tOpKt
PHS$)xIISpKtPP_^[]S_^[]̃SUVt$,WT$L$yT$0|$0l$<\$8T$,L$USt$<|$0Vs    D$0D$     C;M u	;E   j T$RPQL$(T$@  t$@uT$L$j St$Vt$<8tX= tEpKt
PHV$)xIIVpKtPPV33ۉt$0uvj D$PAT$8PL$$P  t$@uLD$ yT$ <D$ ;D$$|  T$L$USt$Vt$<Ztc= tPpKt
PHV$)xIIVpKtPP_^][V_^][̃`L$HSD$PUD$l)VWL$\$l$u8o  ;<u5CyT$(K;t$(L$t$(u  _^][`3t$(u$AAyT$,D$,D$,t3DǉD$,;  W3fD$8t=ƍ}ϋ؊ËAD$uD$+ϋ\$$AE l$t$T$`ˉt$|$dT$hl$`؋Ή\$|$ \$h΋t$lȉL$\$$J  	?  7  	,  D$<D$DD$8D$4;|;sŋωD$0L$8É\$0Ήt$8|$+T$4D$D    ډ|$DˀGuD$DT$8|$|$ D$0\$$D$4щT$D;   ;   L$tAy T$HfȋD$HL$ %   L$D$H L$|$    y#T$LȋD$LL$    D$L   L$    ;T|;sNL$t6yT$PȋD$P   D$PL$ |$ T|$ [L$t0y T$TbȋD$TL$ D$TU\$$
l$L$\$   3Ʌt;ƍ}ϋfËAD$uD$+ϋ\$$AE ًtD  OG$
u+VSU蓀 L$$3Ʌt8}ϋD  ËAD$uD$+$AE \$ًtfD  OG$
u+VSU \$ σL$\$l$T$XEE  _^CT$T][AL$d3`̃lST$,U$   V0D$P$   m W3\$ |$|$;u+CCyT$d|$   |$؉\$ } u&EEyT$3D$    ;|$  t$(WfD$Ht)FȊًˀFu\$ T$X!؍T$`D$X̓\$ D$D$\ D$L$`|$dL$$ |$   |$       D$8D$<D$LD$4D$HT$@D$,T$<T$D$@D$T$HD$D;u;t6$       ;|$   
;L$   ;   |;   $    tD$L$D$(L$0L$(ω|$0Ћ+T$,D$4 ډt$4ˀFuD$4T$HD$(\$ D$,D$0D$4D$DL$(L$$$    u
;|;v;|$8|;L$w0E t_T$hL$hD$l L$$L$$t0T$pgL$p؋D$t\$  L$L$$D$D$(ӊDƉD$(tJBÊ$
ue ڋtOGĊ$
u: D$(-  ? $  BZyT$D$   ؍oE \$ yT$Vt$(|$$t$(|$D$   }ft WGˊည
u߄   G_yT$|$؉\$    ؉|$\$ U tWG̊ည
ut3GoyT$|$`|$D$   KU tME$
uEt@ KC$
u$   CL$T$   (91u
3_^][l_F ^]   [lQ$SUVWtD$8 tt$l$ F+D$$t$l$ ՋD$$+F9ډ|$ˀGuD$.D$8D$$_FD$^][    YUdS3L$$VuډD$HWW}3fD$hD$DEfD$`D$@EfD$XD$4         E     kL  ƙʋǙʃ QVD$H"  ;\$DrL$h3҉L$T$hD$hD$]D$lD$T$T$8;\$@rD$d3ɉD$ D$`D$"T$hʾT$D$hD$D$lD$ t$\\$XL$(L$0D$u  ;D$ |
D$9D$v   D$$'D$9D$D$u;D$ u3D$$D$$   |$, ED$$z  g  S  9D$,t9D$4t
+\$t$L$D$+ˋƋ ˋɀGu\$D$0|$<|$
T$8PL$@D$8   D$L(  D$8D$;D$Dr3҉T$T$8FT$P舽T$Ѓ|$, T$T$8tL$+L$PL$|$TD$D$PD$|$T|$D$0D$(;D$@r|$<3T$X)L$(|$<ȃ|$, D$T$L$(L$0t+D$XD$D$ D$\D$ LD$XD$D$ D$\D$ 3t  |$, t|$4 t
+\$t$ L$D$ +ˋƋfˋɀGuD$(\$t$ 
Њ(|$$D$4   t@ JBŊ$
uD$(BT$0+WPt$,v |$0|$0;|$@r|$$3ɋT$oT$`|$, T$D$|$$L$(L$0t+D$`D$D$ D$dD$ 5D$`D$D$ D$dD$ |$, t|$4 t
+\$t$L$D$+ˋƋ    ˉ|$8ɀGuD$8\$t$|$$D$D$4   (tJBŊ$
uD$BT$8+WPt$,u |$0|$8;|$Dr|$$3ҋL$(T$T$8_T$h|$, L$(D$|$$T$T$8t+D$hD$D$D$lD$!D$hD$D$D$lD$EWt$Hf+0E8D$L_^[]Ã= tIpKt
PHt$HV$)xIIVpKtPPt$HVE33+0E8D$L_^[]_^   []UlEWS]T$@UVuW8L$fD$pfD$hfD$PD$83T$<\$@D$,D$4t0#fuǙ
 RPD$Du   _^[]ËT$DD$(D$0;r3T$pG<D$p\$tD$D$<|$$;D$8rL$l3T$hT$pT$pt$<L$tL$T$t$ P  G  ;|D$;v   <  D$;(  ;   D$(L$0t$T$|$PD$(D$TD$LD$,SD$0D$8VPD$\P0T$XD$0PD$8Pjj L$Pe uD$(D$0D$LD$TD$,|$PD$4D$4D$,D$0D$(|$$;|$@r3|$$.T$X|$ |$$t
+t$X\$\t$X\$\t$t$ ;t$8rL$3T$t$ *  T$`ȷT$|$ L$t$ t+T$`L$d   T$`L$d      |$ EyjtGʀည
uGD$L;D$@   T$hWL$|$L|$ D$T$|$$t+D$hD$\$l   D$hD$\$lrtD  Fʀည
uL$FD$L;D$8rT$3t$ >T$pܶT$t$L|$ L$t$ t
+T$pL$tT$pL$tL$T$MD$(t$D+ƃ|$ tt\$<tg= tTpKt
PHS$)xIISpKt"PPE03_^[]SE0_^3[]̃SUVW33l$\$<tc<u@t$4T$,L$0fڋˀFu]    \$+t$4Fl$t    OG$
u;   	D  l$GT$ `?   uF\$4T$,ދL$0 CD$uD$$D$   E D$4+D$4T$ L$$F    CD$uD$L$4$E +Ft@ P@ˊڀ
u;D$"|$ tD$4 F_^][_^][̃SUV3L$3W3ۋT   uD@      |$W|$WPVt@V   | tW9tEpKt
PHW$)xIIWpKtPPWpK= t@t
PHV$)xIIVpKtPPVt$D$L$D     CE@3u _^][Ã= tPpKt
PHV$)xIIVpKtPP_^][V_^][UL$S]V8 WD$ujs_u|$    _@   _^[]ËƙRP|$_@tSuPm WffD  3_^[]Ëu3 L$  L$QL$Qp@D$RS   *؃   ;ut[tW9tEpKt
PHV$)xIIVpKtPPVpK\$3tS= t@t
PHV$)xIIVpKtPPVt$    \$tG   D$|$3w<_|_^[];utftb= tOpKt
PHV$)xIIVpKtPP_^[]V_^[]É1X@_^3[]U$  SVW}3\$3L$    9     9     D$9Eu9Et   T$RUPuuY  ug\$t[U r%  yHu6D$U\   L$@   j P   U JB3\$L$     t$D$VP   V躰     L$ Ë\$   ʋE   

QVjSL$0D$   ʋE   

ʁ   QVjS \$y     9     uCL$ Ë\$   ʋE   

ʙQVjSy\$\$|$Z  3c  9;uhPNjG3P  D$@t
PHn  G|$2  C L$D3   j QD$    SPjA   t$D|$H:   |$D:   :   t$Ht$DCNFCKNF   K         ΋                                 蘎F$       r1>
?S$`|$ |ƃ   lm   |$uD$$  u33Q%  =  uyuqt3	D$S|tپT$zW    u3B΍AD$Au+L$j APD$ D$tt$VPf D$ L$׉C|s$T$Bt
PPd  D$    @t
PHKxt$   f;   s()   C|    s$렋   A@   PA$t1y9t&ty t1WfD$|$t$S$t$|$$yW uu3*C$@t
PPt$0|$4@t
PHKxt   f;   sP   A@   PA$t1y9tK&ty tfWfD$|$t$S$yW uu3gC$@t
PPt$8|$<@t
PHKxt   f;   sx   A@   PA$tqt$(=tT$(*ty tT$(WfD$D$D$(D$S$D$,yW uu3C$@t
PP@t
PHKx   tf;   s      A@   /PAtyuy)tQ   t9t3	S$yW uu3C$@t
PP@t
PHCxtf;   s      A@   PP]S$D$yW uu3iC$@t
PPL$t$$   }    T$   3ɍD$89MDL$ PD$4PWRuU   9Eu9EuL$0Pt$4L$8t$<
t$4L$03ҍD$PWt$ } t$4t$<t$Pt$PVQOAZ  $   w%  yHu(?TuW@   j P蜺t?} WD$D$GD$} f} \   TL$M     |$uGeE_^[]hNjEh-hS hhěj'   3뵋Ct
PH    |	    v	׋	X7Ƈ   G G$    fǇ   G(    G,    G   G0    G@    GD    {W uu3Ћ3Ct
PPeE_^[]USVWT$|$   pRtE3ۉ_^[]j j8S؃4  } ?g       qL$;   }g    M9L$tA֋t$j8j SvK ֋Sj j ut$$jt$0C$   E_^[]ø   D$$      D$     D$t$    ;      
E@9uFD$j8j SpD$,    K ֋Sj jut$$jt$0RD$$t3t$D$  @|$  D$t$tt$$E_^[]ËD$Sj j uPt$$jj E_^[]ËD$j8j SpbJ ֋Sj uut$$jj 39EC$E_^[]́    3ĉ$   $   SUVWD$ڋ$   h   D$D$4kj P\$(I $   3҃L$(;O   LЋC 39C   ЋD$ CD$$D$ T$,ՉEt$$t$$E  u.Ջ  d   u4T$4u0gtҡpK3    \0   =    t
PHS$fnI3fnxIfbfnfnfbfbff~xIfsSf~IpKtKPP:ZT$0EL$D$0L$D$pSpKG$\$  = tEpKt
PHU$)xIIUpKtPPU$   _^]C    [3. Ĩ   QSVt$WFf   f   ~3D$uFZ~ uvTD$P?9  W VFFX   GOF N$uT$pA  uD$uu~4 V N$u;NT|b;VPw_^[Y;NLS|;VHsLF_^[YË>G8vcNdtQFSO8_^[Yj QoF V$3O8_^[YUV   Vʃ?u3ҋ,N?uO$t
V^]èt^]èt~ t^]WfD$T$D$^]ËEU^]USVu3W3ۉL$ \$>L$L$9O8t
C_^[]ËEUȉD$t\$3ɋL$   t@L$ L$   t@\$\$   tD$L$h   j L$ hjFHVLFPEVTt8D   L$F4fF    KD$u3;%  =  u{uCt3KD$؅u	?t   _^[]ËD$ 3F    tEH$t5t #tx tWfD$ L$ NGP   VRQSt$,ыO$wPwl     c2     D$tQCD$CD$ HtQHD$$ӋD$ @t
PPt$OD$Ǉ         F,F(F     F$    +  |$ u.|$ u'~4 ĠDP   h$/~4 ĠDPRvPvLvH   hD$   G8Nj QOj h   j=O8= tLpKt
PH|$W$)xIIWpKtJPP>|$W.   _^[]Ë؅ut$jvx؅uF^Nf   f   93D$uF^~ uv!OD$P3  W VFFX   GOF N$uT$<  uD$H~4 V N$u;NT&1;VPw_^[];NL|	;VHF_^[]Ë>G83s^dtQFoNO8_^[]j QJjF V$3O8_^[]Vt$FtmF^̋D$H P$D$P3UQMSVW}3ۉL$7V++*       9_t>M   G	fqtRP_^[]É   fAÉQ_^[]9^,u>E    fHtj j D_^[]ù   XfH_^[]ÉT$38_tj؅  7F8w$w jwrw_\N8dt6wL؃  9X(u  G_^[]Å^  wt~x t	   3|$H;9  GtD@t
PHNxt   ;}x<   A@   &PG    t%   @  fGt.V$yW uu3F$@t
PPWuV_^[]ËE   O W$ fptRQ_^[]É   PfH_^[]ËE0   fFu9^t   fF  @~fFFpF$ _^[]t$T$t$L$˩ USVuWFH(@,L$ΉD$  uL~4vFF0t?=   t8T$|$  N4L$+ȃ@~v0ы~    tMCD$CD$HtQHD$ӋD$@t
PPt$Iǆ       vFt
PHD$F(D$F,Ft
PP_^[]W      VwhLb   Sj j j j j j Vww蜄$؃= tUpKt
QHV$)xIIVpKt%PP3   [^_V[3^   _^   _3_̋L$A4     L$'  3UQSVuٹ  T$W}fFf#
  f;uO~puI@    :utP:Quu3uFt3_^[]    t$hTjjjjC   te= tRpKt
PHV$)xIIVpKt PP   _^[]V_^   []U}SVD$tWxt$D$D$   ~(MjjjA   	j_^[]Ë}D$$PE0W  E  $8EHA$tA\$D$9tT$"ty tT$WfD$D$D$EHA$tA\$D$9tVT$"ty tqT$WfD$D$D$EHu3/Q%  =  uyuqt3	EHu3/Q%  =  uyuYt3	R؋L$D$L$MD$It3Q%  =  uyuIt3		ȋD$L$t+t$t#tuRPjj%
L_^[]Ë   fHt	l	   fHG   I耫_^[]Ë|$$ touM7F8w$w jwkwG 1UN8dt6w.Eu9p(u  GEt
VP7Qut$Mt$t$ St$$ _^[] 66F655UQS]D$VWPEġ0}u~|$8Gtl&uM7F8w$w jw;jwG OTN8dt3wLDu9p(u  Gt
VSXPu	׋H _^[]U$(~S]VWPE0  D$j j j 8hw(Hu[P  t0et+j j j hwGj j j hwG(j j j hwGE   D$tOHL$HL$QtRHD$L$hD$@t
PPt$:BǇ       tetVSO_^[]úܡ̡j jjI_^[]QVt$D$W|$P6   |$~4Nt-Q%  =  uyuAt3|T$PESz uj j j %H[_^YVE    t<~UnGt
PH֋7Gt
PPUA]ǃ       [_^Ỹ$ 3ĉD$ S\$4Ul$<VWD$3D$ 5D$ġD$08D$ (~D$$8D$(D$,0:@ <    ˋD< :utQ:Puu3tF|_^]3[L$ 3! $ËD<L$0_^E    ][3 $SVt$W^D$u@  D$~( |$uWvD$vhSP+    tWvD$vh,SP    tWvD$vhdSPWvD$vhSP˒WvD$0vh̢SP贒D$@0_^[USVuW      FH(@,L$ΉD$\  ؅uL~4vFF0t?=   t8T$\$S  N4L$+ȃ@~v0ыr ؋   tMGD$GD$HtQHD$׋蔞D$@t
PPt$f>ǆ       vFt
PHD$NF(D$F,t
QP_^[]_^3[]VW|$3     utЋtr_3^_   ^Vt$N~ ^{]  = tDpKt
PHV$)xIIVpKt^D$%PV^UQSVW}Gt
PHj j h }@W u33ҋ跤Gt
PPt	_^[]7  Pj  hfdF    F    F    F    jF    `  >  hj`     hLj
$n`    PPPPPhPVh  j0R؃$  PPPPPhPVh  j0R؃$  jhWU؃  jhġWvU؃}  jhW\U؃c  jhWBU؃I  jh(~W(U؃/  FGt
PHh`>Vhh>W u33ҋڢ؅t	V^Gt
PP=  FGt
PHh`>Vhh@7>W u33ҋq؅t	VGt
PP   FGt
PHh`>Vh$=W uG3j3ҋ؅t	VGM   Z  = tOpKt
PHV$)xIIVpKt+PP_^[]V_^[]û   _^[]̃SUVL$W   l$$|$ \$}  ~   t+V3L$UWSvu_^][ËF3@@D$~0H   VL$ӍBPrruG;|$|ՋF@,_^][_^E ][̃SUVD$H   3W3ۉT$@ ;^@  փz   L$D$    QL$D$    QvDG  |$ur>tb9-tPpKt
PHW$)xIIWpKtPP.nL  W.n8  N,y>#  uf9-tOpKt
PHW$)xIIWpK   PP   W   V;}
T$D$T$T$RT$|$RP++;UMЋD$$   D$ tX= tEpKt
PHU$)xIIUpKtPPUD$l$ D$F,   ;~D$T$CT$_^][U(SUډL$,V33T$W9stC3D$3D$9C@*  KXL$ 	L$  A  8l0    ǙRPR  l$T$(MI袃M)I+UQWN>    T$D$$+T$L$PD$,|$Pjj t$8|$4X= tEpKt
PHV$)xIIVpKtPPVl$+tZD$ЉT$L$ @D$L$ ;C@  {,  L$4sk A I$CKC     = tEpKt
PHW$)xIIWpKtPPWpKl$   = tGt
PHU$U)xIIpK   PP   U   tX= tEpKt
PHV$)xIIVpKtPPV|$t6= t#pKt
PHW$W<WC    3C     _^][]ËC;~++׋΋D$$L$(l$4-  řRP  t$4j U' l$D$(k׍L$PD$(Pjj 賻tD$+CC   i|$tX= tEpKt
PHW$)xIIWpKtPPWC    3C tS=    pKt
PHV$)xIIVpKt
PPl$9k      =    pKt
PHU$)xIIUpK   PP3_^][]V{tf= tSpKt
PHV$)xIIVpKt!PP   _^][]V   _^][]U_3^][]̃(SUVt$8W3M L$tfE4:   u[΋A@Y@H\$  w3ҍA\;}Ox uty$ u38 t   BtՋ\$\$u t$<֋F(    _^][(Ë\$t܋L$<t$AD;FM3҉D$4L@3T$L$ ;   Y\$,       IkEPL$,T$4QΉD$,     3~+3\$$y( tT$(Sf  uG;|ߋ\$,3{~ |$fD  ϋT  uDF;s|t$0V輪  T$$D$4BL$ t$C\$\$Bt$<_F(   ^][(Ë̃ SUl$0VW]    |$43WfD$T$];   3T$ED$$D$l$$D$fD  T$(|t$,t$,RP5 D$L$ʉt$$L$tFʀည
uL$F;s@ > uF;r;rT$l$$L$D$@+8D$8(D$<H_^][ 3ED$8;r
; }K;sCT$(ˋ{t$,D$<t$,RP4 L$<)Q;uD$D } _^][ Í{;v(Ot;v-ʁ   t5O;wuG;v	    GxD$@+߉} _^][ ÍG̃SUVW~u
>   ^;s}T${    t~ tD$)FD$FD$FD$F~tOG$
uO+FF ;s
9 uA;rD$N2Ɉ_^][ËD$_^][QD$SVW9G,u/t$&t$O3NO NOWNV_^[YÍ@T\t+L$APqAVPn  > uL$_^[YËD$    3_^[YU    3ĉ$   ESVD$H2t$(W3\$4~@|$D$D$u*B PBˋR\VP  9>-  *  A4j`D$#D$Tj P      WD$    fD$83T$<\$8D$(T$$\$    L$|$X;F@      T$,L$QL$8wVPD$> uW|$ t9OT$$;|;v   ;u;t/   |$ EyW\$ T$$D$   T$$D$(t$,@|$ D$(uL$L$MD$D$|$F@3ɉL$|  d  |$ X  <I|<P C  L$XωL$0I;|;v	   ;u;u338\$Í]   D$D$    9F,u9L$4D$PFND<`F D<dFD<XD$L<\D$FT7\t6L$4D<dPt<dD<\VPν  > t$,|$uD$D$D<P   |$L$0I;L$$|T$ ;vT$ ;uT$$;tۅ~ы3ɉ\$ T$$L$T$$L$\$ \$ L$|$F@AL$;|$ t  @D$0    DLD$(xG#v  n  ǙRP-|$DS  L$(AQN@ItLW61 D$4W3҃T$fN@A~g\$D|$` u?+ʉD$8D$HPD$<\$LPjQ\$4j L$8T$(tD$(+ÉD$0N@BT$A;|\$ |$DF@H;to= tSpKt
PHW$)xIIWpK|$;PP,W|$T$$D$0^V~F F   L$D$T$L_^[$   3~ ]Ë$      _^[3d ]SUVW   |$?    >u?^S@t3~KX9 t@;|;F"S   _^][ËVWVWFx" tFx" t
F"_^][2F"_^][̃4S\$HUVW; T$L$  |$P3ɋt$Hl$LfD  t`_  uVT$L$SWUv>uT$T$6t_^][4Ën3l$@t$(   }H|$,;u@   L$L\$0+CsS{ED3CD$WT$<3D$L$4   3ɉD$ L$$;J   {8 uh{ ub{s;{W|;swPL$4D$8j PWV3k  u+D$8H#;L$ ~"|$ D$ ;{|;svL$$T$<AL$$wL$0D$AD$T(_^][4ËL$0D$t$(|$,FAD$Tt$(|$,(uϋT$l$@̃$SUT$V3D$W9p<   T$WD$fD$(fD$ D{    \$t8@t
PHCxt3f;   r   A@   PP&t.S$yW uu3C$@t
PPW  t8@t
PHKxt3f;   r   A@   vPAtyuq)tQ   t1t3	7t.S$yW uu3)C$@t
PPD$(͍<.Pr4(;sD$ Pq;rL$(l$,thD$ D$$t^D$UQt$,H@t$,hDD$(   1( VWRP$( L$SA<#D$L$@<_^][$S#  _^][$U4T$0SVD$(3 W3D$4D$(    ^t$ 9p(|  Mq  E    9Pu0G+u|$$I  @  L$,T$(?3D$t$D    M3Ut$<y t91utA;G}yuߋt$   ˅yD$ HD$(9G   wGt$0D$8u6Pj~t'T$,W 0JHL$8HBF3D$D$   vY  ti= tVpKt
PHV$)xIIVpKt$PPD$4@      VD$0@          MË؋ˉL$8tx@  D$$H;  WD$0L$4PD$D$    PwD$<    !D$  G\$07D$3D$uotW9tEpKt
PHS$)xIISpKtPPS    F    O  V,y:  uf9tOpKt
PHS$)xIISpK   PP   S   FD$0;T$}L$ȋD$D$0\$ًL$D$D$PD$4\$4\$PT$$+D$$QN,+;L$(SMЋD$D   譲D$tX= tEpKt
PHS$)xIISpKtPPSD$0D$FL$,   ;0~0t$D$T$8څua3t:IȉL$0;s- F@xtfP@ˊڀ
u@;D$0rڋT$8|$ t;t$ }t$ ڋt$D$FG    t$;t$$_^[]3_^[]USUVWD$D$    PD$    D$D$    PD$S;P|$ I  t$<      /    D$j pPz   D$|$PD$3PD$ v4ϋPst$,t$$]L$(*+σD$+ƋD$|$ uAUW3ҋDD$3u)    ;t$}D$UWD$Ftރ= tHpKt
PHW$)xIIWpKt PPWD$   SD$PD$_^][]V~ t^W~tU= tBpKt
PHW$)xIIWpKtPPW_F    F     F    ^̃D$$SUl$$XVW|$0u T$T$$?T$T$\$RP@Uj щ\$j L$$D$<L$$l$$Pl$(0D$$Pj jl$@\$0̣|$< ;t>9l$tD$ PT$(L$ɞ\$NtNF$
u+FVW&9l$tsU t@ NF$
u+FVUS# ދl$4M+كxE ;+Pj P_ ] T$,D$0M
M@   _^][_^]3[U$SVW}ڋ\$t$? Z  F4D$D$HC!  $Hfs[t$$\$ ~" Wt'T$CKBJC B _^[]À{" t%nT$FNBJF B _^[]IL$W:~  u]{  uV? uQSNC9V|;v   ;u9Vt*   |$ WEL$H~  tT$FNBJ~  u
{  u2:B $    CD$(8 t9? u4t${  u&p j p ӋWiD$,? tԋt$$FD$(t>8 t9? u4\$~  u&p j p] ֋W D$,? tԋ\$ F C _^[]ËCSD$ T$,XJ\$$Z;^\$t$|;v	   ;uL$$B;Au3؃|$ EȋD$  D$(8 B u&8 D$uxW{L$$L$ ʉD$ыW\D$8 tL$(9 t2ɈK L$,\$$yIsL$,;|;v	   ;u;u3\$(; \$u8 u؃|$ Eȅyt$,׉Ss_^[]ËSCD$$T$,z! uWD$(WЋT$(z  ul? ug\$,{  uXr;sJCt$|;v   ;uB;Ct*   |$ E~WӋ>T$(? t\$BJCKB C _^[]ËKL$IT$C D$(    z( tPD$,I   8^4\$\$t0z t*L$rPB PBPVrL$0AP[L$ D$(AICK_^[] 	bd	bcU: SUVWT$   D$c  98[  Ht99L  HWfD$\$t$tE@M@ څuE@ s!  SV^r؃  UuJL$J@L$t+>u&FӋNpD$PD$ PJvuыt$FvHAD$A@D$t8t4>FHuF@FPD$PD$ Pvuȃ= tPpKt
PHS$)xIISpKt
PP_^][]S_^][]ËD$_^    3][]̃SUl$VW   }    H  $jVUt#VUtՋx  3>m  Ft	8]  39~u#NA;C uA;C$uI?v9~t݋F;C '  F;C$  N_^][ËVU$VˋUu      _^][ËVU   VU   3_^][Ã{ tq~" { u#FNL$;uZA;GuRFx tIFvΉD$]֋T$OE 39FD$|$ǉJ_^][À~  uF;C uF;C$uFx  !3_^][fQh*iQhhUSUVWE 3ۉD$  9_ts38OtY;ȅuL7F8w$w jwP8w_e"N8dt)wbȃu9X(u	  GL$u*l D$WD$PWwCtm~tX= tEpKt
PHW$)xIIWpKtPPWF    vuD$E ut   _^][]_3^][]̃SUVW|$   \$D  ;    u   U~(    39^@~b~\tK3@    @   9P~6D  AP    AT    BAX    A\    ;P|C;^@||$֋	\$F(    F    F    F    F0    USE    E    fE   m_^][̃UD$   SVWf     u   v   3|$@ >23t%D  ۍBߊ~EF》uE(T3M(A> t1FFyT$>^|$   |$D$;|D$M2mD$C_^[]U SUVW3ۋ\$9_(W  F D$ F$D$$GL$tD  8u	GuG߉D$,GD$(G D$̓;tkA@D$KJ  Pt$ 9kȃM(7  l$E@Pj Q [uD$P\$~ uxut~ uv|D$P;W VFFX   GOF N$u?uT$gu\$u8^uU~ tD$ F D$$F$D$F tG _^][]ÍD$Pal$,D$P\$    E؋D$,\$9Gu9ottɋ_^][]E(    _   ^][]U<ESڋVW\$s:     T$FDt$4;G}	;E|  KCvL$,D$0;J u;B$u{       3|$3L$2ɉL$(OD$+  FuDy  IE؅uމ|$  L$4t$9A(   G ׈D$΍D$PD$ unL$t$0|$,T$z  u=L$D$P;L$T$u
9zu9rtD$tˋ|$t$D$|$t$u8O   ED$t3N  D    u D$PD$ t_^[]Å  D$0   G  f?uGPD$T$$Z8@4z<r0Jt$,\$|$ \$8|$<;D$()  t;s2T$ƅtBL$A I$;|;v   ;u;v     |$ E^  V  D$$X8u'T$8W\$8T$\$4|$<|$ |tNF$
uF;s    > uF;r\$|$ :T$@|Wt$Dt$D438D$ERPi \$|$ ؉\$\$8T$|$ |$<tt;2v2T$t:L$A I$;|;v   ;u;tS   |$ E~?u;L$(D$PD$$PD$@PD$8PD$4p|$P\$8t$,T$냋D$$p0X8x<ut$;^ u;~$t3ɉL$0L$0|$|$   D$4p0օ   >u1BryT$WL$ȸ   L$3ɉL$};}]    t    ZB̊Àည
ut@BryT$tWL$ȸ   L$;|38D;MDƉ3_^[]UMSVWt	   ]{VFu+   ueօt_fD  Jtx:xuFGJxxx+u{NFuC+huZ   _^[]ËC؉D$K@ CuhHu+*   *   P2  PdD$   2  Qj P T$ J   JAJVWA@ƉABMHBǀ      Bp t$ FSt$p NI)VE03_^[]ø   _^[]S\$UVWk(   u<6vu   tW9=tEpKt
PHV$)xIIVpKtPPVpK= tHt
PHS$)xIISpKtPP3_^][S_^]3[̃T$SU   VWD$9ZuJ9 u	y uZ 3ɉD$A}   BЋ\$I|    \u9EŀEǀEED$ \$D$uD$D$uD\$A;|T$$   Jx%   B      dD$pB    B(x'\$B         B(YB(xBCB(YB(xB(\B(_^]3[UQVu*Pjx`tjxj Vd M31^]ø   ^]SUVt$WX   tAoGD$Et
PH׋EcEt
PPt$Nǃ         ~<tX= tEpKt
PHW$)xIIWpKtPPWpK~LtX= t@t
PHW$)xIIWpKtPPWpK~ptX= t@t
PHW$)xIIWpKtPPWpK= tHt
PHV$)xIIVpKtPP3_^][V_^]3[USVW}wlXG`GhWd @Gh;})Wp Ƀ|    |
<    @Gh;|ݍWc  d   G83ۋOLD$G4D$    D$   GP;G0W,Mw0r ;ust=:u't2A:But%A:ButA:Bt3_^[]3x
uG0;GP~3GX   _^[]Ãlwp}VD$  L$Pj %aD$  Wl    +Qj P D$ Gl   GlPj 6 3\$ D$9D$m      L$T$ L$WfD$ fML$ȋÉL$   T$$L$       D$}L$  D$   X;_l~[D$    L$ j P.`D$    Wl+Qj R D$,D$_lH   T L$s|v
@P    uL$3Kuu	YL$9L$DT L$@P    D$     P D$;L$Gh    _^[]_^   []U$S]3VT$D$    ։L$MD$@D$(WuD$    &D$       NtD$@;EKLЉT$   {<tX= tEpKt
PHW$)xIIWpKtPPWpK{ptX= t@t
PHW$)xIIWpKtPPWpK{LtS= t@t
PHW$)xIIWpKtPPWjtCj P }|$    CH   CHE|$ CH}xYtSQ%  =  uyuAu1Gt&PhE舉ȃK<tfQAu+ʉK@D$xqu3-Q%  =  uyuAt3ݥPhE"ȃKLu   _^[]ÍQ    Au+ʉKPL$ xnA$t13Ht$Vt՘3Ht$:ty t3Ht$W3fD$ t$ Ht$3{<Cj8j sTs@P T$(CPt$j Vt$<Wjj Du%C<ΉCSp0舐  u	S[_^[]̋D$@XUQEV   $UMjjr0R,3^]ËEM@htH   j jjS3^]ËE   Hh@pɋȋLE fptQRޜ3^]ÉH   fH3^]ËE   Hh@pɋTLE fptQR蓜3^]ËEM@T	   fqtRPk3^]É   fA3Q^]{ǁ̋D$H`PdD$P3QSVWD$    D$Pt$>t$VGЋЃuLL$1?|AGSt$Ћtt$OыD$ _     ^[YËL$D$_^[YËL$D$_^[YU,SV3ۉT$( 3D$ EL$0W}~fD  <>"tF;|EQ	0D$ PVWȃv  D$(\$PD$\$ PD$$\$PD$$\$4PD$@PD$8t$4@ЃD$   t$Ɛ   Nt3ۋM   D$   j V-U؃tVj S L$8C0C   @@   CHDKD$ALKA`AHt$Ct$4pH  D$ ;E}<8*uC@P   D$L$4D$Q~|8-uHA   D$t ~|8^uC@T   D$HD$ËMD$t$t3ɃeDD$t$D$$t$ @ЋE_^[]ËE_^[]U<SVWT$03ۉ|$D3\$t$\$(D$$D$PuRWAD$D$ H  \$D$x   L$8D$    QL$0D$8    QL$<D$4    QL$(D$D    QL$PQPD$<@Ћ  [t|$($D$j @PV|$(u\tX= tEpKt
PHV$)xIIVpKtPPV  D$D$T$<t3t$<WOVu\tX= tEpKt
PHS$)xIISpKtPPS߅d  D$(WD$D$< f@t$D$t$DP5 L$HD$D$T$0AD$,;E}<*u   3AD$4~|^u   3AD$@D$D$(D$D$D$D$D$PD$(@ЃD$     eQ  ft3|$0(D$(L$j @@PT|$0u\tX= tEpKt
PHV$)xIIVpKtPPV   D$ tPD$(@ЃtX= tEpKt
PHS$)xIISpKtPPStX= tEpKt
PHV$)xIIVpKtPPVE        _^[]jxj W D$PO0O   @ADGL$(H@GII	<ȅtft$SW = tEpKt
PHS$)xIISpKtPPS\$03ҋC9P@~3    |HICB|4;P@|3E0_^[]U$T$MD$T$L$@    SVW~(< t<	t<
t<t<t<uNCt$\$ u
Fe_^[]ÿD      D$;   W˃r;ust1:   t"A:BuwtA:BujtA:Bu]t$D$$
   u {/uC,0<	wNˍT$$KF< tt<	tp<
tl<th<td<t`<"t\<(tX<)tTtPt$$;"      ;~f<"tB;|E+L$Aˉ;uk   _^[]ruJPj0fMD$(t7j0j P L$4G+t$D$$AEE03_^[]ø   _^[]uL$BPS_^[]Ët$3FD$(3D$9F   N։L$$fD  9NFu+9t$~V<:uPօtF~!Jtx:xuGCJxmxx+tU\$ T$D$L$$@D$L$$;Bw3L$uET$(+VuPL$ P#>_^[]Ë|$ L$GD$+D$(뿋	u3UVrW|$t4SfD  u3;	֋ru[BtxBGWz_^]ÉW} z_^]U,SVuW3T$D$(3ۉ|$|$D$    t$L$$D$,    QL$0D$(    QVȉD$  t$,  T$4uaD$(9HtS  Pj0JD$,  j0j P^ D$8    pFtXCt$`t|~ uv3D$   9L$   D$         8;  VЍL$h|$D$D$ T$D$(t$t$+t$$T$$T$|$     L$0D$    uz  Pj0ID$,c  j0j Pr |$8L$T$    WT$ǋL$4|$T$T$4+t88j  'tpF+|$ t$T$+t$$T$$t$T$  D$(FuFt
fD  FΉD$4	  D$4t;puptFuFtuD$     FuFt    FΉD$4r	  D$4t;puptFuFtuD$   H  FuFt    FΉD$4	  D$4t;puptFuFtuD$      FuFt    FΉD$4  D$4t;puptFuFtuD$      euqt|$  tUE+D$   d3ɉL$tHuME+D$   BCӅt	ЋBuEz+ƉWUE_^[]ËUE+Ɖ   tEGuGtw  t;~u~tGuGtuͅtL@ CuCts  t";^u^t@ CuCtޅuʋE     D$_^[]ËE8_^[]Vt)y   ^ËNWzuN_^3^_^U(SU3VWD$$8t$|$ \$0uZ  -  $    OVGL$D$ooiL$D$hȉL$u:VL$rȉD$u$D$GxD$GxD$$8_^][]Ët$tDFuFt^  t;sustFuFtu΋t$  FuFt^  t;sustFuFtu  83_^][]  PVDD$y  Vj P8 ǃD$9u@D$9t\$\$T$JT$4@ f     HL$,@    t	A    3|$ L$ЉT$  t$3ۅtUT$l$(;\$}C
t9MCD$EiEhD$(l$m@    t$    u2uiT$,   B\$0D$9u@D$9tJBAJBtAjD$T$4jD$T$4|$  FuFt^  t";sust@ FuFtuʋ\$D$   \$   \$33ɉ|$~Ct$Յt1u	D$x }EhEhl$mB    |$A;|\$pK_  = H  t
PHS$)xIISpK  PP  \$L$3D$(v   |$4tYFuFt    ^  t$;sustfD  FuFtuȋD$(L$@D$(;||$ \$	pK= mt@t
PHV$)xIIVpKtPPVpKuS\$uD$$8_^][]û   tGGuGtw  t!;~u~t GuGtuˋD$$_^     ][]̃,D$0WSUD$D$@VD$ D$HW|$PD$(D$DfD$,D$4    L$T$D$ ul$X3ۉ} <ύQAul$XD$@P+ʋUQL$ ؃uX9D$4tXMuI}        ؅u-u tNP؅uNP؅   u tMFuFt~   t";wuwt@ FuFtuʋ|$PE     ujhأt$d5C_^][,ÃuWht$d4_^][,QSUVW|$o   u tX= tEpKt
PHV$)xIIVpKtPPVtW3E EfE 9]@~{}\7~  tX= tEpKt
PHV$)xIIVpKtPPV    C;]@||$w(tX= tEpKt
PHV$)xIIVpKtPPVpK= tGt
PHW$)xIIWpKtPP_^][YW_^][YUVW}uE    tU= tBpKt
PHW$)xIIWpKtPPWE    E       pKS} t\~tU= t=t
PHW$)xIIWpKtPPWpK= t=t
PHV$)xIIVpKtPPVpK=[_^E    ]̋D$V3W|$ǍP@u+~    3эH3_^̋D$;D$t   Pt$t$ Vt$3W|$~    3эN3_%^̋L$;L$t   ËT$Vt$rf;ust4:u't)B:FutB:FutB:Ft^3^USUVW4      PV:  Vj U> wtX= tEpKt
PHV$)xIIVpKtPPV?PwНEo_D$G    tnK\$vv#Ã    ՋJtAFAt0q!wqGGtpF    wۋD$r\$u3_^][]_   ^][]QSUVWyT$tCD$9t<Ǹ E؅t$l$OtURvvӃt6T$u_^]3[Y_^][YUSVuW\$НPVS?EЋȋӋGHL$#PVD$J7  FD$E  NtGtFAGL$9tuA	9 A     t_^tX= tEpKt
PHS$)xIISpKtPPSpK= t@t
PHV$)xIIVpKtPPVO ?D$_^[]ÉFD$_^[]Ã}    u   uW9W|ҋutEG    _^[];   Pj+7   WF           tb3ۉ^=    pKt
PHV$)xIIVpKt
PPE_^[]ËERP6؃tuj S ^ut$S VE_^[]É^EFOGI#L$GȋJtBAFAt0EqrF3_^[]ËEwqrF3_^[]ËGGtpEF    wrF_^3[]Uu Pj5tM     3]ø   ]UQVcuhPjW5ЃtWMJuJ EyqD  Au+ΉJBEB    B    B    B    3^]ø   ^]Vt$W~tU= tBpKt
PHW$)xIIWpKtPPWpK= tCt
PHV$)xIIVpKtPP3_^V_3^̊u33|0At$3}	   +tø   SVt$WtzÊ3<}	   +NtF҄tCÊ3<}*Ft%3<}	   +N>t^F3_^[_^3[SVW  Ê3<}	   +NtF΄   Ê3<}*Ft%3<}	   +Nt^F뵄   Í~3<}	   +st˄tCÊ3<}*Ft%3<}	   +N,t^F3_^[_^   [_^3[SVt$Wf        Ê3<}	   +NtF΄   Ê3<}*Ft%3<}	   +N}t	^F tÍ~3<}	   +ItτtCÊ3<}*Ft%3<}	   +Nt^F3_^[_^3[SVt$    ^t?Ê3<})Ft$3<}	   +tF3^[SV   Ê3<|-Ft*3}   +N<tywttxtoytjFtc3}	   +Nt?Ft83<|0Ft-3}	   +Nu	^3[Ät^   [̃SUV33\$W|$ ~1+ύ]7A<w A<	FF+u\$|$    
   EЍ;~&+;}8@:B;|D$$: _^][ËD$$> _0^][̃( 3ĉD$$D$0SUl$4VWD$l$G  3ҍr~)D  A<w A<  L4BN;|܍\$D$/    D$3 ހ>s   40Ʊs+:uL@usNRu`@<s+:uD2FuiNIu30Ѱs+D  :uD2FusNIusHDd+:u/D9GuW  eN[u|  Lg+:uD9GuWt40Pd+fD  ::  D9GuWyE;  XTƱt+    :uL@uaNRu   `\l+:uD2FubNIu   hdz+:uD2FuiNIu   t^Ê3<}	tMo.Got$3}	   +Oht:] ultstzt!ttNe>yuFP@tiF  $lTl+:u5D9GuW%  afD  N[u{  |tl+:c  D9GuWI  tN[u4  i+:u5D9GuW  efD  N[u  i+:  D9GuWH  aN[u  dr+:  D9GuWr  ifN[u[  wi+:C  D9GuW)  w  N[u	  \i+:u/D9GuWj  bN[u  i+:u/D9GuW'  aN[u  ȤĤi+    :u/D9GuWN  eN[u9  ԤФi+:u/D9GuW  eN[u  ܤؤi+:  D9GuWS  o@ N[u  dn+:u/D9GuW}  iN[uh  Tn+:u/DGuW:  aN[u%  Tr+:  DGuW  a N[u  m+:u/DGuW<  aN[u  s+:u/DGuWj  iN[uU  s+:u6DGuW'  f    N[u  ؤs+:   DGuWh   oN[u   $i+:u5DGuW%   afD  N[u{   ,i+:u)DGuWtQiN[u>4\i+f:u(DGuWtbfN[u  Է$@<e+    :u/DGuW=m  iN[uX  He+f:uDGu   Pe+:!  DGuW  aN[u   X<i+    :   DGuW   iN[u   `<l+:u3DGuWFv   i    N[u]hl+    :uGDGuWt1-ls+    :uD9GuWEF  $>l  ~WC    >e  ~n  F<at<e  ~>r변>c뮀>e  ~b~  F<at<io  ~됀>ta  F<auVDD  <e<  tt+:uDGuE|t+ :uDGu%t+ :   DGu>uuV<D   F<st<t   n+D  :   DGu>m   ~ix   ~e+@ :uD9Guui+ :u=D9GuU>su*~ou$~B>euG~iu~WwE>eu+~Wat/tDV9t>lu
~lFD΍QAuD$+ʉD$  t3@vu_^][L$$3褟 (ËD$PU0L$4_^][3 (fHحha1H )ٳ'˴ 6;@gFaѶ 	

USVW}wW_;}ff΋x0|	h uqw΋;|ڋΉL$;}&x0|h tqw;|ދL$;;|e   _^[]+;w~8FGGD$yuaL$VIRP$tFL$Guˋw4EOEL$EOEOG3_^[]_^   []US]VuD$    WF@D$u3/Q%  =  uyuyt3	elAtyuA'tQ   tt3r@}D$^  L$Qjh  @PD$(    )|$ u.C@@u%jjjjF   +g_^[]ËKAtyuA'tQ   tt34r      sL$׋ Pt$ D$;D$u8jjjjF   fL$Qjh  @PD$,    <|$ u@@tjj jT$_^[]ËjjjjF   $f_^[]ÅtNL$t@y t:9НPPWEЋL$׋II#Qt$(L$$:t@3D$|$ 2WhĥMjjjjF   eG= tQpKt
PHW$)xIIWpKPP_^[]W_^[]SVW3    Ӄ`w`$fD  H@t	:u@8tt+Ɖ_^[ÊNVtD  <]t
JBuɍBDǄx uF뷍F xɀ t@_^3[Ðxʼ USVWRhED$    K؃\$   ˍQAu+ʍT$ˉD$D$DǋωD$$  ύQAu+ʍAD$ 6  ~ ,  >НPPWEЋNI#Qt$,  @D$   t$$3FD$3;t$sf    T$؅tFڷuut$j    PqtYFt$t$ @F;t$r\$D$uWPD$,@Ћ   hܥu	   = tIpKt
PHt$V$)xIIVpKtPPt$VpKtJ= tMt
PHW$)xIIWpKt
PP   _^[]W   _^[]ËEL$  ts= tHpKt
PHW$)xIIWpKt.PP"WWhĥu   = tOpKt
PHS$)xIISpKtPP_^[]S_^[]UVW胵)  Ph   p  h   j V }   }OQAu+3҅   G<sBD0;|E03_^]Ã= tNpKt
PHV$)xIIVpKtPP   _^]V   _^]ù   0r9vArZvAw   3ȈDA   |ǋE03_^]_   ^]USVW}wW_D$;}fƋ΋<s| Wtqw΋;|ډt$;}&Ί<s|$|8 }uqw;|܋L$;;|e   _^[]+;w~8FGGD$蓳uyL$VIRP+t^L$G3҅~D  A<w GB;|OEEL$0EEOEOG3_^[]_^   []USVWhuD$      }]|$u	|$   33҅~x@u+F|$B;|菲t33ɍw      D$j Pj|$$ωL$upc  D$ǉD$D$~V׉D$|$+ӉT$ 3NFu+<FP3W@ T$ Gl$uȋL$|$$L$\$d|$ |7΍QAu+ʍAMD$$6  y ,  9НPPVEЋMQJ#Rt$0   @   3ҍD$L$PD$NPCNPAЋ\$,u?*u/PjЃtD$WrBEL$J   L$D$t	PAЃ   = tlpKt
PHW$)xIIWpKt:PP_^[]Vhĥu	   3rW_^[]Vt$Fv@Ѓ= tGpKt
PHV$)xIIVpKtPP3^V3^Vt$3ɋ~Fx tx u8tA;|F    3^ËFF      FD3F(^UEu+Pj$9tMW @@     3]ø   ]VWNtQ@@ЃF    ~tU= tBpKt
PHW$)xIIWpKtPPW_F    F    F    F    F    F     F    ^Vt$DtZ= tGpKt
PHV$)xIIVpKtPP3^V3^VW|$GPG PGPGPGPGPwBЋt3eD_^UQSVW}   ϋD$q9u7  uu3/Q%  =  uyuYt3	\؋Atyuq)tQ   t1t3	`ct   G    _^[]ÍFRPGu   _^[]Å~VSPѺ G_L$SV Awq@ЋuFD$@GPG PGPGPGPGP3BЋt93eD_^[]̋L$39AUQEVwt$UMjjRjո3^]ËUMjjrR趸3^]ËE@M   	fqt!RPT3^]ËE@֋E@ Ή   fA3Q^] Wu̋D$L$@3Q́    3ĉ$   $   SUD$鋌$   <   ŉL$VW3D$$4D$(`D$,D$0D$4D$8D$<D$@4D$DPD$HD$LЧD$PD$THD$XD$\@D$`xD$dD$hD$l$D$pLD$txD$xD$|ԪǄ$    Ǆ$   %Ǆ$   %Ǆ$   (Ǆ$   `Ǆ$   Ǆ$    Ǆ$   Ǆ$   Ǆ$   (Ǆ$   Ǆ$   Ǆ$   ,Ǆ$   hǄ$   Ǆ$   Ǆ$   TD$ \$   D$$u   uu0a<. u   PI<   uuP1<   u~}j L$QMj Pj7= tEpKt
PHV$)xIIVpKtPPVD$ \$L$T$t=tk33u+ ;}4pVS/T$(ƅtD$$   _^][3 ļ   U  SVWD$    D$\$$j P   ȃA  u\$ujSC3uhNj<$9;uhPNjy<   3   h-hS hhějJ<  3Ft
PH    |	    v	Ӌ/؋ƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    ~W 
    3  D$@t
PH蹺
  G|$2  C L$ ;   j QD$    SPjV5   t$ |$(:   |$ :   :   t$(t$ CNFCKNF   K         ΋                                 F$       rFS9|$ |ƃ   聹   |$uD$$  u33Q%  =  uyuyt3	TD$S|t
D$xW    u3AύQ Au+j AL$PD$$D$tt$WP D$$L$։C|)s$D$@t
PPd@t
PHCxt3f;   r   A@   AP@?S$yW D$uu3   C|    s$qC$@t
PP|$tL$$3_^[]ËЋSFt
PPu  L$$    _^[]ËD$_^[]U  SUVWD$    D$\$(j P   1|$5  \$PPjS3uhNj7$9+uhPNj7   3   h-hS hhěj7  3Ft
PH    |	    v	Ӌ螧Gƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    ~W     3  D$@t
PH(  El$$2   C L$,;   j QD$(   SPj0   l$,|$0:   :   :   t$0MCECKME   K         ͋                                  E$       r蹅蒆S謧|$  |ƃ      l$$utl$$  u3/Q%  =  uyuyt3	UPS|te}W u]u3>ύQfAu+j APD$,&
D$ tt$$WPp D$,։C||$s$|$   C|    s$|$l$Et
PPd@t
PHCxt3f;   r   A@   #=P@?S$yW D$uu3C$@t
PP|$~D$(_^][]ËЋFt
PPu  D$(     _^][]ËD$_^][]USVW\$3   ߞA  Ph   )  N(Fd   N3    FUMD$f     ډ|$ˀGuD$+|$>F D$03_^[]ËVA;~<<u+O(IΙRPtF(~Fc3tk= tXpKt
PHV$)xIIVpKt&PP       _^[]V    _^   []̃S\$3UT$VW|$$u t$t9^u9~tFË+FNËQPL$7   t$FFF F$^~\$,|$(   tB9~u9^tBj jL$udSWL$uRt$~^F F$
|@r:|$0+N \$4F$ PQL$ut$~ ^$t$L$;u tu    _^][_^]3[̃SUl$$Vt$$W|$$T$D$    tN tH?НUPVEЋOI#QUptHL$$t++  D$$    D$ L$$RPD$ RP  T$(  t$<   T$(VUr;uwtf= tSpKt
PHV$)xIIVpKt!PP   _^][V   _^][ËD$u  _^][̃ D$$SUD$    V3D$    D$    M$t$t$W\$,uD$<03_^][ Í|$WjP	  CD$(D  L$QL$$QL$,QL$QL$DQt$0Ћ؃   L$;|AD$   D$4   T$~}RT$<P  PQ؃   u\  {;   }99T$|#Rt$8T$@APt$ ~؃  Ftt$D$(,   D$,t$@ЋD$@L$3eD؋_^][ ̃SU39      3VL$W   D$xtppKD  wtU= t=t
PHV$)xIIVpKtPPVpK?uD$SL$EL$;   [_^]ǃ      [É  ][USVW~(    FLA?uOQ?t   _^[]$tE1Q0P3_^[]t;E0P3_^[]ty t";E0P3_^[]ËEWfD$T$t$0P3_^[]ÍG   PD$PZ   \$9F,taFLA$t1tv: ty t	:WfD$\$NË\$RPQSu{FLA?tA@?uG@?t   _^[]QjSu#SGSNNQ(q,Mq_^[]QVW$t4D$   j P=u}t$VVucD$   j P	uIt$V踬V远u/PD$   Put$V腬V茜    t3u/PD$   Put$VIVP    t3u/PD$   P^ut$VV_^ỸSUVWl$}    D$,   PD$P\  \$S誫d0  3l$9o,tG@PS訶D$j Sw    D$$T$ ;|-;r';u;u	   t9  u  ;  ~I     T$ D$$3     l$0    Ǉ     ;_jG | u=St$ƷT$ UjPWOD$$D$0St$4\t$$Ct\$S衚D$ 0_^][ËD$4\$l$    Sxu _^][t$_u _^][USVW3D$WPWt$$\7     ʋE   

EʙQVt$jV躿Vԩd   t8@t
PHNxt3f;   r   A@   l0PA$t90t5t9yt	6WfD$|$t.V$yW uu3 F$@t
PPV#ȃu.|$uT$ uA  M    _^[]ËE8_^[]USV      W|$tuuPRM   u&vh%   u   _^[]Sj uuhPvvI   t	9At	3ɋEL$i  ~舑tD$3   8_^[]Å~ǙRP`uD$   8_^[]ËEt @  ~   t$0L$u(h-h| hhěj%   1  YCtPHL$AD$   ;1   up   A@x	 t@x
 uNL$QI9 uj WV舛
WV<D$ΉL$@@x	 t@u	$N΋D$u/   rtD$uD$@    D$C@%p$K@u9$  uCD   s@֋\-{W ut֋YCt
PPL$WD    tl= tWpKt
PHW$)xIIWpKt%PPD$ 38_^[]W3D$8_^[]Ã  D_^[]QSUVW   hPw0G,W(+ƋO4;VLUM؃uro0WO(O0AG0;G,uVw4tAnFD$Et
PH֋Et
PPt$[G4    G0    _^][YQSUVW~    ~(tX= tEpKt
PHW$)xIIWpKtPPW~4t:_oCt
PH׋Ct
PPU蒓F4    _F(    ^][YUSUVL$WFHu~(~LtF,F(;  n8  ~(m l$tX= tEpKt
PHW$)xIIWpKtPPWF(    M  EmD$l$8EG;FD   n@tX= tEpKt
PHU$)xIIUpKtPPUl$e   m      RPFF@tym   FDD$Upv@R F@( n<uI~EǙRPt2D$WpU F8~L3~,nHn(_^][]F@       _^][]Ë?N$F ;N|;Fr
3_^][]ÃV,j  F RQN$V(L$$P3  ~(39F4t*  +F(;F0~"~4 uޅ  yT$CȋD$   D$yT$l$   =  F,+F(;-  L$;N<   řD$ʋD$D$FDʙ;|g9D$v_   ȉT$D$   ȋF@L$T$D$sT$L$Rt$	F@D$FD3M
9F4t(   +F(;F0~~4 M
u܅upF@D$UWP3 D$ŃF<yVLFL   NL8F,+VHF(FP    ;~0 u|
 u
  _^][]̃    SVWtD~8 t>T$FX    RVHFTNX     A    PQNPQvL3_3_^[Ë^H39~4t!u3+F(
;F0~~4 uuNHVXqNHȉNP_^[ÃSUV2ۉD$W3~P|$8   tX9n8tSD$(VT\$t8
D$,ID$3PRVHFXPD$ PvL_D$(3Ƀ8L$EFP_^][ËVLVHT$
t@ Gـ《
u~4 tF0F(;rt_^][ËL$(GtFP+NPD$,IT$ǋ;s#׋ ? uzǋ׋ȋ;|$rT$;rFP    _^][39n4t ui+F(
;F0~~4 uuIT$	T$ ǋN\FPFX    t+D$FXL$N\_^][D$FXL$N\_^][QSUVWi  ~@tX= tEpKt
PHW$)xIIWpKtPPWpK~ u_~(tX= t@t
PHW$)xIIWpKtPPWpK~4t?_oCt
PH׋1Ct
PPU
pK= tGt
PHV$)xIIVpKtPP_^][YV_^][YUS]VL$3EW}$T$L$uEEt  _^[]ÍOL$q`膅      ƙRPl   j`j V~ D$|$ UM|$ FEFEFE^VFNt>FF`F(~,tWu P. F(W8D8    E(03_^[]ËE(^  V$03_^[]_^   []̋D$SVWD$y IXP;Lr;ust4:u't)A:ButA:ButA:Bt3u+_^[USVRD$    3D$    4   \$  Wt$$9]@  ~\$$|$Z  U3t$ǋϐtg9P   uIUrD  ;ust1:   t"A:Bu}tA:BuptA:Buct$D$$;uF@D$$t$Ju^L$IƙRPtF|$ȋUL$<C|$L$U<C|$UL$?ǉ|$tt$D$       ~hjSQx |$ h   |$Z%  9^  >Н]P}ESWЋv׋L$,N#VSD$   |$   |$4d   KtD$    D$    Kj V-D$u
D$    .Vj P{ t$(    N`PWQN8 } t`\$tX= tEpKt
PHS$)xIISpKtPPSMD$_^D$[]ËD$SUl$H(   }(    U@H@Vp<W}<+y@r;ust{:ugtpA:BuZtcA:BuM>r;ust;:u't0A:But#A:ButA:Bt_E^3_E^39E(3ۅ+؅uL$E ][+][̋T$3Vt$9JP39FP+u3J\F\W~X9zXu;u	+_^;|9zXv_   ^_^Ë^̋T$3Vt$9JP39FP+u3J\F\W~X9zXu;u	+_^;|9zXs_   ^_^Ë^̃y(    S\$VWy<I@;~r/;u.sr@ ;ust4:u't)A:ButA:ButA:Bt3u+_^[3̋D$;UWxExJSVZfD  ;}2ff     tt T$ xLD DL F;|؃y^[_]UD$VW	   j PR   ut$ujVժ   fuJt3NdPPE(RPY)t׉y@@t
PPV蒔V虄   ΋uAt
PP_^]U  SUVWD$    D$\$,j P$   a*  \$3uhNj@ 9+uhPNj+   3t8h-hS hhěj 3  D$,8_^][]ËD$@t
PH  El$2  C L$(;   j QD$,   SPj   l$(|$0:   :   :   t$0MCECKME   K         ͋                                 E$       r`_aSy|$$ |ƃ      l$uAl$$  u3/Q%  =  uyuyt3	"+S|t2}W uWu3<ύQAu+j APD$ D$$tt$WP? D$0։C||s$   C|    s$l$Et
PPd@t
PHKxt3f;   r   A@   PA$t91t ty t	WfD$|$S$yW uu3C$@PP3Ft
PH    |	    v	Ӌ~~^ƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    ~W uu3Ћ؋Ft
PPD$,8_^][]_    ^][]UD$SVWں   j P  ut$ujVrÙRPjVeuujVWuujVIM(@U,uu$u jV,  RQu$u hu
G_^[]ú   蓠   ^dhpjjj   #u/   PTu   88   t0   t׉y@yW ut@tkPP_ptX= tEpKt
PHW$)xIIWpKtPPW   號uP}0t6NdPPE4   RP"t׉y@@t
PPV迍V}   ΋%u@t
PP_^[]U,S]V2T$0D$t$W   N3F D$~UfD  ;}F:uG;|+߉\$(  _^[]Ë3ʉD$L$0D  FuÉt$,t$ډD$$\$ ˋ3    CuD$,L$D$(T$\$ D$,;   ~J~ V  utF$       _^[]ËD$,~RPF$"  T$F$~ tF\$0D$,ȋD$ʀL$0AD$uD$0+L$,\$ T$щT$F$D$,ȋD$$ʀL$0AD$$uD$0\$(+L$,SET$PF$T$PN D$ FË}F 9~}9F?D$0tH  L$0IÙRP,  ^FUFWRPF ~3_^[]Ë]   (t      ǙRPD$   W Su@jf@ D$@    L$A(A$L$$thT$ D$ AЃ> uL$L$ND$NHL$D$D$NHD$NHL$4F    D$_^[]ËD$T$@L$@ЋD$_^[]D$    _^   []̃SU3ۉT$VWL$(9   T$43t$8EuD$0
   +l$|$(M$E$@ʋɀGuD$<T$@t$M ӋL$DQV +T$(L$LL$HV$T$(_^][Ëzl$<t$@L$4D$8l$t$ L$D$|$$   fu3FuG$
   L$0+T$(uw$L$ڋˀFut$ L$(|$$G W$+PՋl$ VUL$؃G @l$ȉt$ D$L$D$|$$RT$t$LD$4t$L@t$LL$4VUt$Tt$TP? _^][̅<  SVqWpKfD  ~$N(^;tYtU= t=t
PHW$)xIIWpKtPPWpK~tU= t=t
PHW$)xIIWpKtPPWpK= t=t
PHV$)xIIVpKtPPVpK_^[U,SVWى\$$7t$   Ipu:Pj@=D$$t%j@j Vi 7   ptF0       _^[]Å~ǙRPF0t܋   
   F(ˍD$0j P  |$0WFduj W6ʉFVFNW/vR  N,3UL$N|$ ~];}F:uG;||$ +߉\$  3GuÉ|$43fFuE3ډt$(t$ЉD$,ˉ\$0fD  GuL$(D$L$4L$M|$ L$(   T$$;      FVD$4uY  ȋNL$ QL$(Rt$<V0F-  L$$GPuA4QY  F3D$3ED$FuT$,ˉt$43ۋt$CuD$4MEAȉL$(F8V<;N(~>F0D$4mL$(IL$4RPcF0D$(F(F0D$D$(؋ǙȊ\$4CD$uL$4D$+\$($L$F0ˋ\$0D$(D$L$Ȋt$4FD$uL$4D$+t$($t$t$t$ Eǋ|$PF0P#{ |$$F0ǉ|$D$4ȋD$,ʀAD$,u+L$4\$ً}F0WuPz ;]F,;^ ~<F$<D$4llL$4IǙRPP~ F$FSuvvz ^3_^[]ø  _^[]U   SVT$Wt$3D$    ;]}oE3ɋ<GGtQQD$ QPȃu8wt$ wjV-wwjVV9$V@rt$Ct_^[]Ë}D$j P   W<:  L$D$\$   ʋE   

QVjS蚗L$ D$$   ʋE   

ʁ   QVjS` V   豿  L$D$\$   ʋE   

ʙQVjS3uhNjS 93uhPNj>   3t#h-hS hhějN  D$@t
PH~  @ Ft$2  C L$;   j QD$$   SPj   t$|$ :   |$:   :   t$ t$CNFCKNF   K         ΋                                 F$       rMNSo|$ |ƃ   |   t$ueD$$  u33Q%  =  uyuyt3	FD$S|tRD$xW    u3KύQ    Au+j AL$PD$$ȃL$tt$WQLv L$ D$K|֋C$D$@t
PPu3_^[]C|    C$   Ћ;Gt
PH    |	    v	Ӌl7Lƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    W uu3ЋGt
PP_^[]̃S\$Ul$VT$3ҋm WD$T$<+    2;s
t
F;rT$D$;t=+ޅ~7FFyT$轻T$D$и   T$D$띋+|$ t++~W+j P_ D$ _^D$(][U$    SVWL$@E։T$$GD$ a  xP U  BXD$B\D$D$PD$P   1  D$ ;}7zP t.L$9JXu%L$9J\uL$j j Ft_^[]t$$Vmt$~bx8 tZF;G~;D$(GGD$,MeurT$(ҋL$,IRPtVGFPt$wJs GD$OxD$   PD$Pt$ xP t<L$   _^[]ËMD$EL$L$HE03_^[]ËE     3_^[]̃SL$U3D$VPWT$9hu^\$ ;h}Q034QL$uLtt$$ӋxӀ~ ttD$Ex tT$hR3_^][U`SUVWډ\$C@D$D{l$ HD$    D$H|$(D$\D$lD$h     D$dEL$LL$D$`u
3_^][]ËC3~:D  z t	QD$  CFL$;|;ǍhEl$<xTGD$@ ;}7l$@fD  |WSrL$x\<F;|ۋl$<D$@l$<y\$C    x( w  x<{,X@D$X(D$D0t|$d uxH;I  |$h u;:  Ӄr;ust=:  t.B:F  tB:F  tB:F  L$D$(   l$8;    z( tq9z<ulR@˃rfD  ;usD$(t1:u6t"A:Bu)tA:ButA:BuD$(L$E;|L$l$8   |$H \$    |$L        tx8    T$xLz4x8 XHt\r;z~5,?D$lj
a[  L$lIřRP?  WSPo D$    l$8T$D$d   Z0jD_^][]Ë\$ 3W3|$$fD$P~fL$F;|t$`L$U]L$9xP  L$TL$4L$PL$,pXL$0X\QL$DD$D    QL$(D$8    t$X\$D(   9l$8~8|$fD  zP t!9rXu9Z\uL$ j j E;l$8|֋|$$|$l tD$03PD$DPD$LH|$H L$0t&  D$    ~;D$4t;|"T$,;v+ދt$<);|9t$,r  _^][]ËD$4ދt$<+\$,|$\ t	AD$D$    Ӌ3fD  GuD$L$ǋ|$$;A~A< AyD$^F  L$IǙRP*  L$|$$AA3ǉT$9T$L   T$0L$@PVStL$PL$,L$<L$4|$$\$t$`L$Ul$@OL$xP    \$D$k	  l$ |$(D$4ȉT$ӋʀAu+L$4D$P|$$D$,|$\ D$<|$$D$4^\$t$0Vt$DCPk C G|$$4D$      _^][]Íw;s~.{sx]uڅIƙRPtċ|$$CCW8D8    CC0d   {4k_^][]ËD$_^][]QVW   39w~F;w|7tX= tEpKt
PHV$)xIIVpKtPPVpKwtS= t@t
PHV$)xIIVpKtPPVG        G    _^ỸSUVWRQ   WfD$3ɋ\$t$D$<0r6<9w2ƋD$ڙD9D$ڃЃA<0sʀ<9 D$(0Xu
 A<9 t3ۍi<9-WfD$t$E|$]U 0r19w,ƋUЃE0sWÙVRPg L$,Q_^][U  SV%   WL$D$$j Q踯J
  uƋUWjRVe uMڃ QVt$$jVj h   uue 

   RPjVVpd	  D$WPD$,fD$P    L$	  D$	  ;	  |;u	  VpdtV`D$8    D$    D$     G	  \$$W&PD$P蔮&	  PD$$PW'w		  u]SjVVpd5  \$D  |$4ǙRPjSυG|$4t8@t
PHNxt3f;   r   A@   PA$t91t ty t	:WfD$|$t.V$yW uu3=F$At
PPǙRPjS
t@@t
PHNxt   f;   s(   A@   PA$t91tU ty t	rWfD$|$t.V$yW uu3uF$At
PPǙRPjSB3uhNj 9;uhPNjx   3t#h-hS hhějMH  D$@t
PHWk  G|$2  C L$$3   j QD$0   SPj   t$$|$8:   |$$:   :   t$8t$$CNFCKNF   K         ΋                                 MF$       r:;S\|$( |ƃ   !j   |$uD$$  u33Q%  =  uyuqt3	D$S|t萻D$xW   u3C΍QD  Au+j AL$PD$DD$(tt$VPc D$4L$׉C|C$t$D$@t
PP   ;|$Gt
PH    |	    v	ӋY9ƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    W uu3"t$C|    C$   ?ЋD$@t
PPuRVjd]VZ  uS\$(jS葀3u#hNj2VZ_^[]93uhPNj   3t#h-hS hhějE  D$@t
PHg	  Ft$(2  C L$ ;   j QD$   SPj3   t$ |$8:   |$ :   :   t$8t$ CNFCKNF   K         ΋                                 芇F$       r#77SY|$ |ƃ   ^f   t$(uD$$  u33Q%  =  uyuyt3	D$S|tͷD$xW    u3FύQfAu+j AL$PD$脻ȃL$(tt$WQ_ L$4D$K|֋C$D$@t
PPu3_^[]C|    C$   Ћ3Ft
PH    |	    v	ӋV5ƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    ~W uu3Ћ8FtPP_^[]V6W_^[]U   VW3T$j8D$\D$,    |$(Wt$WPfD$<I T$$D$dPWjWWuu6H  9|$\>  }  L$WPD$$Pä  L$D$   L$)ʋE   

QVjt$,|L$$D$()ʋE   

ʁ  QVt$8jV{Ve$duWVqT$D$4D$D$0VD$$Ua  EuV|$\uD$X 9x8u
e   =  D$ D$D$D$      D$   D$D$4D$D$0D$ ET$HD$*E
T$   
T$D$(PT$T$QuL$t$ ׺}tD$9D$|
D$ 9D$v         L$T$XW)D$@t$DD$PD$Dt$DD$luO|$T$X!d   $   T$($   $   $   Qnt|$$  G0D$0  =   pKtQHD$4P$)xIIt$0pK  PP  uEt$t$\T$t$\PuT|$$"  ? w,W0V   GWOL$(t$(D$8D$,t$8 OL$fD$DD$8    D$$    G#   D$L$PD$0PD$@Pwwwwj uSt$t$0w<w8t$Lt$Lt$<t$LwwRw<w8j j j j j j t$8T$Tt$@L$<0D$@4R}T$t;T$>L$|;L$ .L$w<w8RQPpKO$L$0tZ= tGtPHL$4Q$)xIIt$0pKtPPQ= tWpKt
PHW$)xIIWpKt%PPL$X_^]WL$X_^]U   SUVW33;   }#  jW2Geu3مtՋ8        }0   {  9u4r  D$t$VPV)U  \$PjjSv3uhNj 9;uhPNj   3t#h-hS hhěj$  D$@t
PH]  G|$2  C L$$;   j QD$(   SPja   t$$|$(:   |$$:   :   t$(t$$CNFCKNF   K         ΋                                 }F$       rQ-*.SDO|$  |ƃ   \   |$uD$$  u33Q%  =  uyuyt3	D$S|tD$xW    u3>ύQAu+j AL$PD$ 貱D$ tt$WPU D$,L$։C|7s$D$@t
PPd   @t
PHKxt3f;   r   A@   PA$t1B   C|    s$댨tM ty t	jWfD$t$S$yW uu3qC$@t
PPu0uE0   euE0    u3_^][]Ë3Ft
PH    |	    v	ӋnK+ƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    ~W uu3Ћ蘳Ft
PP_^][]Ë_^][]̃SUVT$W3D$3~N    t$ 3D  ډt$ˀFuD$T$GD$ +;|$|D$$_^(][USVW;   G
   T$BE  t$V0  UD$OPV"D$    j PϙD$tt= tTpKt
QHV$)xIIVpKt!PPD$_^[]VD$_^[]    |$ jWp   iluJOdhpPD$$(RP[t։q@蝱@tkPP_ptX= tEpKt
PHV$)xIIVpKtPPVW3ZW:J_^[]   _^[]U4SVWD$X|$ \$? )  PC     RP8t$0  L$    ƺ   D$4D$(j P՗tt= tTpKt
QHV$)xIIVpKt!PPL$$9_^[]VL$ 9_^[]Ë\$(j j jSnSYd  t8@t
PHKxt3f;   r   A@   PAtyuA)tQ   tT$t3YD$tjS$yW uu3IC$@t
PPt8@t
PHCxt3f;   r   A@   PPlIЉT$$t2S$yW uu3ǮC$@t
PPT$$D$3tD| |=3ɉL$,9L$~];}-ʍT$8qL$,T$$ȋD$8GD$L$,;|$|,D$;}$+3<L$    Pj VV: SMGte= pKt
QHV$)xIIVpKPPL$$9_^[]ËMy9s    D$@@~@E^}+ǉE38
;s3+ʋD$F@@;E|ԋt$0\$4D$0L$PSL$$D$0j P   耔te= pKt
QHV$)xIIVpKPPL$$9_^[]Ë|$(j j jWk   3guKt4OdPPD$8(RP%؃tӉY@`g@t
PPW^UWeEL$$   fu@t
PP= tMpKt
PHV$)xIIVpKt(PP_^[]V_^[]   _^[]U  SUVWT$,3t$ |$|$  PD$PW譒    \$RPjS+j   RPjSj     D$$      ; uhPNjO   3}  D$@t
PHMQB  fD$$@D$$2(  C L$(3   j QD$    SPji  t$(|$0:   |$(:   :   t$0t$(CNFCKNF   K         ΋                                 ;qF$       r !SB|$ |ƃ   P|$D$@t
PPd  @t
PHKxt3f;   r   A@   PA$   1t$  u"D$$  u33Q%  =  uyuqt3	D$S|tD$xW u^u3>΍QAu+j AL$PD$ ̤D$$tt$VPI D$0L$׉C|Qs$|$   C|    s$tty tWfD$D$D$S$yW uu3C$@t
PP3fD  D$ ;   T$jVFeu   3|$ʉ|$t]hNjh-hS hhěj   3Ft
PH    |	    v	Ӌ>1ƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    ~W uu3Ћ貦؋Ft
PPt$ D닞   tMCD$CD$ HtQHD$$ӋD$ @t
PPt$>ǆ       u9l$,tEeu_^][]U  SUVW3	     3ۉD$8hD$D\$D$8]u   |$F  MD$j Pj h   j|$|$9tEpKt
PHV$)xIIVpKtPPV  E   7t\$3   D$|$  WVtD$u\$   |$g  Vt$j V0 M\$1PT$4D$<     3  9;uhPNjG3  D$@t
PHJ  G|$,2  C L$83   j QD$(   SPjs   t$8|$@:   |$8:   :   t$@t$8CNFCKNF   K         ΋                                 jF$       rc<SV<|$  |ƃ   I   |$,uD$$  u33Q%  =  uyuqt3	D$S|tT$zW    u3B΍AD$ Au+L$ j APD$(D$,tt$ VP
C D$8L$׉C|Es$T$Bt
PPdq  }, D$    tE@PS9VD$It
QHKxt3f;   r   A@   PA$t1yM   C|    s$ft5&ty tPWfD$ |$$t$ S$|$yW uu3MC$@t
PP    ;|1;r+;u;u	   tD$9  u  ;  ~|$u*|$D$  3    ǅ      |$Et$|$   Pj V,   D$(   L$   t$ D$,fff     W;U  E <   @t
PHKxt   ;}xu3G   A@   PQ%  =  uyuqt3	!S$yW uu3ǟC$@t
PPt$,T$GPV=D$(D$@t
PHKxt   ;}
xL$    A@   @PAtyuq)tQ   t1t3	S$yW uu3C$@t
PPL$E4L$t$ D$,(Gt$ J|$t$    tVՍL$|$|$u-D$039UL$4+IAB;U~t$3u5hPNjh-hZP hhějt$43   Ft
PH    |	    v	Ӌh5   D$     r D$ ~W T$ utCt$3C|$t$9hNjh-hS hhěj|$0\$3    tt$0T$8L$t$@RM|$ tX= tEpKt
PHV$)xIIVpKtPPV   3u>hPNj h-hZP hhěj   D_^][]ËFt
PH    |	    v	Ӌ33퀻   r	~U~W uu^H#Ջ;؋AD_^][]U  S]VWj8D$     j St$<( i.t       _^[]j VKu   _^[]Vj P' D$   j Pt$ {  u\$ ujSdZt$3c  9;uhPNjG3P  D$@t
PHA  G|$2  C L$,3   j QD$   SPj@   t$,|$@:   |$,:   :   t$@t$,CNFCKNF   K         ΋                                 aF$       r0	S#3|$ |ƃ   k@   |$uD$$  u33Q%  =  uyuqt3	D$S|tؑT$zW    u3B΍AD$Au+L$j APD$荕D$tt$VP9 D$$L$׉C|s$T$Bt
PPd  D$09D$  @t
PHKx   t"f;   s   )   C|    s$뗋   A@   }PAtyuA/tQ   tT$t
D$    6D$S$yW uu3*C$@t
PP@t
PHCxtf;   s      A@   PPL2S$D$4yW uu3譗C$@t
PP@t
PHKxt   f;   sx   A@   GPA$tqt$(=tT$(*ty tT$(WfD$ D$$D$(D$ S$D$yW uu3C$@t
PP@t
PHKxt   f;   sP   A@   PA$tqt$=tT$*ty t&T$WfD$ D$$D$D$ S$D$ yW uu3C$@t
PP@t
PHKxt   f;   s(   A@   PA$t1y9tH&ty tcWfD$8|$<t$8S$yW uu3dC$@t
PPE3ҋL$ Pt$t$<t$4t$(t$(t$8WVΡGE$t$ |$@-hNjDh-hS hhěj&uD$ 3D_^[]Ë3Ft
PH    |	    v	Ӌ+ƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    ~W uu3Ћ'Nt
QPD$ D_^[]USUV3W\$\$NV~ttNӉVN;N|3_^][]Åt%yT$@{\$ظ   FNyT${|$   NN;^   F+;      ,;n ~.FD$%u_L$IřRPNtGn FNtsFWPP3 NFFnNuMyV(tz   _^][]   F(VFы~(+V;|ʉN$N3_^][]_  ^][]U<ESZ8Vr<lWL$ \$$t$(D$   T$J3D$    |$L$0~*]u;}B:7uG;|t$(\$$E|$+ǉD$$  3ʉD$<L$8GuD$$ʉ|$(D$DЉL$@3GuL$|$,T$,T$(T$$|$T$49D$0   |$ A;   |$   qqqL$,HL$T$D$@D$0ȃ fD  ӋʀAu+L$0AT$ZrƉJ˃\$$JL$ Bt$(B    ~  t  D$ @T$D$Eq3_^[]Ãy    D$    D$(;A~@D$0#  L$(IL$0RP裉  L$T$(QT$@D$,ЊÉT$0BD$ut$0D$+T$,$BqD$Q\$4YqD$ډD$Љ\$(t$ ;Y~ED$4a"`  L$4ӅIÙRPȃ@  \$D$(KCT$t$ )  \$E;A~AD$4!   MIL$4RP葈Ѓ   E|$CS{ tDL$8Ћ\$<D$4ÉT$<BD$uL$<D$+T$4$\$L$@Ћ\$DD$<ÉT$DBD$uL$DD$+T$<$\$Et$$ǋ|$ VPPP/ 7uVus</ L$ s_^[]ù   _^[]Ëʋ_^[]_^  []US]VWL$GD$;_~&7 uRۋIÙRPEt<_O3U~;}:uF;|+ƉD$  _^[]ø   _^[]SR7m. _|$ tAD$HƙL$Ȋى|$ˀGuD$+|$D$x|$GD$؋D$Ȋ\$CD$uL$D$+\$$_E\$SPGP- O˃} OtTD$E ىt$ˀFuD$+t$]wGSuPe- __^3[]U$ESVډL$H03P,Wx(@4L$,KDD$3\$|$$T$ D$~;}C@:>uF;|+|$(  _^[]Ë3ۙCuǉ\$3GuL$D$L$(3ۙL$D$(Ћ CuD$T$Ë\$ЉT$KP   \$;   \$   SLQs<L$ s8iCD$uL$FPt$(D$C8D$ S< 3CD    CP    fFuT$ \$(B3D  AuD$\$ЉT$|$C(D$S,{Pud;{T~.CLD$(YuVL$(IǙRPt>{TCL{P uCLCP     t$S@t$0KLt$(t$09_^[]_^   []UpKS]VWL$$|$,  \$       7tX= t@t
PHV$)xIIVpKtPPVpKwtX= t@t
PHV$)xIIVpKtPPVpK -_^[]ËT$t$      ~t}+~l   Pj^tnFt   FlFl|$ FlW8@O<D$ ډt$ˀFuD$+t$T$FwppK~    |$|$(   T$ދT$|$ωL${  LN~"uQvL$,vQD$pK>   = twt
PHW$fnI3fnxIfbfnfnfbfbff~xIfsWf~IpKtPPWpK~   = twt
PHW$fnI3fnxIfbfnfnfbfbff~xIfsWf~IpKtPPWpKT$ t$|$L$ud8V0uN(F,WfD$D$L$T$LrPV7PFQv$Nv v< v8vvPQL$T؃0pK\$yL7tX= t@t
PHV$)xIIVpKtPPVpKL$q@t`= tMt
PHV$)xIIVpKt PPE_^[]VE_^[]U   SVWD$    D$\$j P"   l  u\$ujSuD3uhNj 9;uhPNj諬   3t(h-hS hhěj耬   E  D$@t
PH+  G|$2  C L$;   j QD$   SPj"   t$|$ :   |$:   :   t$ t$CNFCKNF   K         ΋                                 yKF$       rS|$ |ƃ   M*   |$u͂D$$  u33Q%  =  uyuyt3	D$S|t{D$xW    u3>ύQAu+j AL$PD$ sD$tt$WP# D$ L$։C|s$D$@t
PP3dD$u"L$3_^[]þ   C|    s$뽋3Ft
PH    |	    v	Ӌƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    ~W uu3ЋFt
PPL$D$_^[]_^    []U\  SVWD$,    L$,D$4    j Qȉ|$0h  MW\$,D$<EfD$pPQjSg@ǙRPjSZ@ 3uhNj襨 9;uhPNj萨   3t1h-hS hhěje_  3_^[]ËD$@t
PHa'  fD  G|$2  C L$3   j QD$(   SPj  t$$   :   |$:   :   $   t$CNFCKNF   K         ΋                                 IGF$       rS|$  |ƃ   &   |$u~D$$  u33Q%  =  uyuqt3	~D$S|twD$xW    u3>΍QAu+j AL$PD$(C{D$tt$ VP D$(L$׉C|~s$D$@t
PPd@t
PHKxt$   f;   s()   C|    s$먋   A@   DPA$tqt$=tϳT$*ty tT$WfD$ D$$D$D$ S$D$0yW uu3}C$@t
PP@t
PHKxt   f;   sP   A@   }PA$tqt$=tT$*ty t#T$WfD$ D$$D$D$ S$D$8yW uu3}C$@t
PP}D$p   ˍw(VPNN|s؉ ىNu2G0@t
PHKx   tf;   s      A@   pPAtyuA/tQ   tT$t
D$    )D$S$yW uu3|C$@t
PP@t
PHCxtf;   s      A@   身PP?S$t$ yW uu3{C$@t
PP   3Ft
PH    |	    v	Ӌiƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    ~W ut	ЋzFt
PP|$      E_^[]t$tL$8T$@t$t  D$<D$u  L$4D$|VPt$T$$t$$t$D$   z  t$WD$lD$|fD$LfD$TfD$\fD$dt$@D$Dt> tNT$P`@D$HD$H   tL$@u3D  |$@ tL$@tD$\9ELU   M   D$XtxD$r\$;\$,uD$stO|$:}u;t=\$A:C\$,u&t(\$A:C\$,utAL$:At3M+L$\EȋD$<3҅ND$D$Xt`9tNpKtQHD$\P$)xID$XIPpKtPPPpKL$tZ= tGtPHL$Q$)xIIt$pKtPPQ)  9t$  D$ L$A  D$pA+D$0@D$0GD$GD$pG D$tG$EGEGD$(G}+8f[ GWACS|\$,D$T$T$ʙGWD98D$4T9<T$   ;NЃT$;T9T~ED9LD$(	   L$IL$(RPtp   L$T$T9TD9Lt$t$$t9L T$ WL$D:LL:PD    |$   4fD    O6  9 WGfD$LfD$TfD$\fD$dt$lL$@D$DtAT$P\@D$HT$   D$H   L$@q|$@ t  L$@W|$@ u  D$\;G~@GD$(z  T$\ҋL$(IRPDoȃX  D$\GO~Pt$\w D$h|$ G@  D$TT$L$Pj RPOT$QL$DD$     D$$    GuL$$D$D   ;OPD$T$ us;~EGD$(   L$ IL$(RPn   L$ L$GD$QPw L$ WGOD    D$tn= t[pKtQHD$P$)xIIt$pKt!PP      PD$Xt^= tKpKt
PHt$X$)xIIt$XpKtPPPD$ HD$=;Gt
PH    |	    v	Ӌ]ƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    W       3   3Ft
PH    |	    v	Ӌ
nƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    ~W ut	ЋrFt
PP  _^[]ËЋr؋Ot
QPu_^[]Ë3Ft
PH    |	    v	Ӌ	ƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    ~W uu3ЋrFt
PP_^[]U  SVWD$    D$|$j P   Y>  ME\$ PQjS03uhNjؘ 93uhPNjØ   3t#h-hS hhěj蘘G  D$@t
PH  Ft$2  C L$$;   j QD$(   SPjA   t$$|$(:   |$$:   :   t$(t$$CNFCKNF   K         ΋                                 7F$       r1
S$	|$  |ƃ   l   t$unD$$  u33Q%  =  uyuyt3	ϱD$S|tgD$xW    u3DύQAu+j AL$PD$ kȃL$ tt$WQ L$,D$K|֋oC$|$D$@t
PPt8@t
PHKxt3f;   r   A@   譞PA$t1E|$C|    C$   뎨t+ ty t	HWfD$t$t.S$yW uu3KnC$@t
PP7u3_^[]Ë3Ft
PH    |	    v	Ӌdƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    ~W uu3ЋmFt
PP_^[]U  SVT$0WL$D$0j Q   D$,    D$    D$0    lT3
  u\$ujS+E@RPjS+ 3uhNj' 9;uhPNj   3t#h-hS hhěj%  D$@t
PH  fD  G|$2  C L$,3   j QD$   SPj舍   t$,|$8:   |$,:   :   t$8t$,CNFCKNF   K         ΋                                 2F$       rxQSk|$ |ƃ      |$u3jD$$  u33Q%  =  uyuqt3	D$S|t cD$xW    u3C΍QD  Au+j AL$PD$ fD$tt$VP D$ L$׉C|Yjs$D$@t
PPd   @t
PHKxt3f;   r   A@   PA$t 1At$$D$J   C|    s$끨tdT$"ty tT$WfD$D$D$$S$yW uu3iC$@t
PP   ;Gt
PH    |	    v	Ӌ Kƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    W uu3ЋhGt
PP  L$0D$(j P
   O  \$(uhNjˏ$9;uhPNj趏   3   h-hS hhěj臏u  ;|$Gt
PH    |	    v	Ӌeƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    W \  T  3X  D$@t
PH  @ G|$2  C L$(3   j QD$    SPj興   t$(|$8:   |$(:   :   t$8t$(CNFCKNF   K         ΋                                 -F$       rxQSk|$ |ƃ      |$u3eD$$  u33Q%  =  uyuqt3	D$S|t ^D$xW    u3C΍QD  Au+j AL$PD$ aD$tt$VP D$ L$׉C|Yes$D$@t
PPd@t
PHKxt3f;   r   A@   PA$t9AN   C|    s$뉨tlT$,ty t腚T$WfD$D$|$D$S$yW uu3dC$@t
PPD$$uL$ǉ~NуF  V$Ћ7dD$@t
PP3  F$	   L$0~ D$D$j PIK؃upt$W|$jW"Sbu@t
PPWW   ϋ+u@t
PPt	_^[]ËENXF   EFD$$D$4FfD  G   FV`GdFVAQǙFVAGQFVAQčG|3_^[]Ë_^[]_^[]U   SVWD$D$       j PI  u\$ujSy!ƙRPjSl! 3uhNj跉 93uhPNj袉   3t#h-hS hhějwC  D$@t
PH  Ft$2  C L$;   j QD$   SPj    t$|$ :   |$:   :   t$ t$CNFCKNF   K         ΋                                 w(F$       rS|$ |ƃ   K   t$u_D$$  u33Q%  =  uyuyt3	订D$S|tXD$xW    u3DύQAu+j AL$PD$ s\ȃL$tt$WQ  L$ D$K|֋_C$D$@t
PPu3_^[]C|    C$   Ћ3Ft
PH    |	    v	Ӌƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    ~W uu3Ћ'_Ft
PP_^[]U$  SVD$    3ۉD$0WL$,D$0    SQS#D$L    D$4    \$DFt$  ut$0ujV\$fff     \$8  9uhPNj贅   3  D$@t
PHH      D$8@D$82-  F L$@>   j QD$   VPjDD$   t$@|$H:   t$,:   |$@|$,t$H:   t$,֋|$@FOGFNOG   N         ϋ                                 $_$   r.V!9\$|Ɔ   jT$Bt
PPd  D$D9D$0|?|$@D$D|$   L$IǙRPU  D$@t
PHNxt3f;   r   A@   0PA$   9  u<[D$$  u33Q%  =  uyuyt3	D$V|t)TT$8ZWudu3BύAD$Au+L$j APD$WD$8tt$WP- D$DT$ L$F|f[~$}   ^|~$qtߐt9Yt	WfD$ |$ V$8YWuu3[F$@t
PPL$0D$<AL$0ZD$   -hNjh-hS hhěju3   >Gt
PH9   |9   v	֋Ɔ   F ^$fǆ   ^(^,F   ^0^@^D8_Wut	Ћ!ZOD$tQPD$t$uIuCL$4VPD$@P8A\$Du$uujSD$D3|$ƀ   D$43|$ƀ     ;|$0  D$;  RPjSjǙRPjS] 3uhNj言 93uhPNj蓀   3t#h-hS hhějhG  D$@t
PHr  Ft$2  C L$;   j QD$(   SPjz   t$|$H:   |$:   :   t$Ht$CNFCKNF   K         ΋                                 hF$       rS|$  |ƃ   <   t$uVD$$  u33Q%  =  uyuyt3	蟙D$S|tOD$xW    u3DύQAu+j AL$PD$(dSȃL$tt$ WQ L$ D$K|֋VC$|$D$@t
PPu\$   |$C|    C$   ΋3Ft
PH    |	    v	Ӌƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    ~W u
uD$ЋVD$Ft
PPt$G|$LD$4\$ƀ    tb= tOpKt
PHS$)xIISpKtPP_^[]S_^[]̋D$S\$UVWt6i ˋɀ
BL$uD$+$BV_^][_F   ^][UTSVW3|$$D$|$(|$,}  _^[]Ë]L$;s~-D$ 4u`L$ ƙRPMtKD$sW{8 fD$<fD$DfD$LfD$T|$\D$0t$4tHT$@G:@D$8   _^[]D$8   L$03  MfD  |$0 g  { D$L|$HT$Dt$@D$ |$T$t$  ;ELȅtrtnEtg׋r;ust<:u't1B:Fut$B:FutB:FtT$t$T$3t$3L$ +MEȅ   |$ t   D$ t@3\$FΐËAD$uD$+΋]$T$At$|$   EK0PD$ t$XT$(t$XPW   L$0軾M|$$D$HT$DD$D$@D$T${ uwD$ L$tOًL$@D$ЊÉT$ BD$uL$ D$+T$$]BL$|$$T$뗺   SUD$
B\$tX= tEpKt
PHS$)xIISpKtPPSpKt]= tJt
PHW$)xIIWpKtPP_^[]W_^[]U  S3D$d    VWD$p    WD$LL$D$t    S\$(QS \$0ȉ\$4fD$XfD$`fD$8\$$*8t$   u\$ ujSǙȋPQjSL$hD$d t$uhNjw!; uhPNjw   3t;h-hS hhějwD$4D$8D$0D$<  E  D$@t
PHF  L$AL$2.  C L$@3   j QD$   SPj!qU  t$@$   :   |$@:   :   $   t$@CNFCKNF   K         ΋                                 rF$       rS|$ |ƃ   Ft$ T$Bt
PPdV@t
PHCx      f;            usMD$$  u33Q%  =  uyuqt3	TD$S|t`FT$zW ugu3G΍AD$D  Au+L$j APD$JD$tt$VP^ D$(L$׉C|M{$t$    C|    {$   A@   T}PPS$yW uu3<MC$@t
PP@t
PHKxtf;   s      A@   |PAtyuq)tQ   t1t3	處S$yW uu3LC$@t
PP@t
PHKxt   f;   s(   A@   )|PA$tD$<AD$8At谁T$8*ty tˁT$8WfD$0D$4D$8D$0D$<S$yW uu3KC$@t
PPUD$PPRuD$xPW;Gt
PH    |	    v	Ӌsƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    W uu3ЋJ؋Gt
PP    \$\T$PL$T|$$\$ \$XL$@T$\$P  j D$T$TPQL$,L$XRT$ D$     D$$    J  t$3ۉ\$X\$\\$`}
    D$L$;t$,~+u{IƙRPMCteD$$D$t$,W$   3f$   |$(f$   f$   f$   D$xt$|8t#H$   /@$        Ǆ$      L$x蓵1  f     |$x 	  $   $      M;L˅t^tZEtS׋r;ust4:u't)B:FutB:FutB:Ft3+MEȅxb|$ ttWD$L$$$   V$   [$   D$t$@$   T$\$   L$,SW<uL$xz|$($   |$( \$Xt	>$   D$L$$$   $   $   D$$   D$@tX= tEpKt
PHW$)xIIWpKtPPWtX= tEpKt
PHS$)xIISpKtPPS   L$LD$0VPV	.   t$ |$4t$TjWVuO\$$t4OdPPD$0(RP蘄t։q@vF@t
PPWW   ϋ7u@t
PP|$$\$tX= tEpKt
PHS$)xIISpKtPPSL$@T$q!  |$Pǋ\$   L$LD$j P   D$    8-  t$8\$t$@jSD$0σPQjS uhNjl 93uhPNjl   3t#h-hS hhějlI  D$@t
PH  Ft$2  C L$3   j QD$8   SPjXf   t$$   :   |$:   :   $   t$CNFCKNF   K         ΋                                 F$       rBS5|$0 |ƃ   }   t$uBD$$  u33Q%  =  uyuqt3	D$S|t;T$zW   u3B΍AD$0Au+L$0j APD$8?D$tt$0VP D$ L$׉C|&CC$T$Bt
PP   ;Gt
PH    |	    v	ӋFƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    W uu3C|    C$   GЋ]BGt
PPL  \$ L$LD$j P!   D$    q)  St$T\$jS VuOt$lt4KdPPD$x(RPtt։q@qA@t
PPuujS t$Tt$\jSu  3uhNjh 93uhPNjh   3t#h-hS hhějhK  D$@t
PH  Ft$D2  C L$;   j QD$P   SPj(b   t$$   :   |$:   :   $   t$CNFCKNF   K         ΋                                 yF$       rS|$H |ƃ   M   t$Du>D$$  u33Q%  =  uyuyt3	谁D$S|t7D$xW |   u3EύQAu+j AL$PD$Pt;ȃL$Dtt$HWQ L$PD$K|֋>C$D$@t
PPu3   C|    C$   ԋ;Gt
PH    |	    v	Ӌ諵ƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    W uu3Ћ,>Gt
PP   u@t
PP\$$|$ltX= tEpKt
PHW$)xIIWpKtPPWtb= tOpKt
PHS$)xIISpKtPP_^[]S_^[]U   SUVWD$D$       j PE$  \$PjjS~6   WuIt2KdPPǃ(RPKzt։q@l<@t
PP3uhNjc 9+uhPNjc   3t#h-hS hhějxcM  D$@t
PH  El$ 2  C L$$;   j QD$$   SPj!]   l$$|$(:   :   :   t$(MCECKME   K         ͋                                 |E$       rS|$ |ƃ   P   l$ u9l$$  u3/Q%  =  uyuyt3	|S|t2}W ueu3֋͉C|K:C$bύQAu+j APD$(v6D$tt$ WP D$(։C|9C$C|    C$   l$Et
PPu3   ;Gt
PH    |	    v	Ӌ豰ƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    W uu3Ћ29Gt
PP   uAt
PP_^][]U   SUVWD$    D$|$j P   G    
 D$  \$PjjS3uhNj_ 9+uhPNj_   3t#h-hS hhěj_  D$@t
PH  fD  El$2  C L$$;   j QD$(   SPj8Y   l$$|$(:   :   :   t$(MCECKME   K         ͋                                 E$       r,S|$  |ƃ   g   l$u5l$$  u3/Q%  =  uyuyt3	xS|t.}W u`u3AύQD  Au+j APD$2D$ tt$WP D$,։C|6|$s$|$   C|    s$|$l$Et
PPdf  @t
PHCxt3f;   r   A@   ePPS$yW uu3{5C$@t
PP@t
PHKxt3f;   r   A@   ePAtyuq)tQ   t1t3	}S$yW uu34C$@t
PPtE;w~,D$*uJL$IƙRP-t2wtVUP+ wl$u3D_^][]ý   3Ft
PH    |	    v	Ӌ>ƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    ~W uu3Ћ3Ft
PPD_^][]UL  SVىT$@W\$WfD$(D$P    D$T    D$X    D$4      Ph  (t$  8  ˉD$`T$PD$$  D$,D$D$(D$D$TD$0    |$D      
D$\D$T$H   j PD$    D$H    D$T    E   \$LRPjSk3uhNjY 9;uhPNjY   3t4h-hS hhějvYt$  3  D$@t
PHo  @ G|$82  C L$d3   j QD$(   SPjS   t$d|$p:   |$d:   :   t$pt$dCNFCKNF   K         ΋                                 _F$       rѨS|$  |ƃ   3   |$8u/D$$  u33Q%  =  uyuqt3	rD$S|t(T$zW    u3C΍AD$ Au+L$ j APD$(T,D$8tt$ VP D$DL$׉C|/s$T$Bt
PPd@t
PHKxt3f;   r   A@   n_PA$tqt$N   C|    s$녨tdT$*ty teT$WfD$(D$,D$D$(S$D$yW uu3.C$@t
PP@t
PHKxt   f;   s(   A@   ^PA$tA1D$,=t!dT$,(ty t:dD$T$,WfD$(t$(t$S$yW uu35.C$@	PP;|$ Gt
PH    |	    v	ӋRƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    W uu3Ћ|-D$ @t
PP  D$0  |$Pp3ۉD$ W\$8fD$(8>}
  |   ~G8}NHu  `N~Gf8}NHƍ>T$(D$0D$T>>yT$8k\$8ظ   <0+|$   t$D$,L$(  t$Ht$`PQ t$HD$<t$`t$ t$  ;  |
;D$8  D$ t$D$0D$TL$T$D$4D$       ;T$\  |  h  j t$$ D$l@   x  t$L$T$Pt$\$Tt|$@ x  o  \$   D$L$ D$HD$hj P7  |$Hˋt$hǃ PQjVP

 
W
SjV2V3J$d   t8@t
PHFxt3f;   r   A@   ZP@?\$?tnV$yW uHuD3EL$(D$,t$9uЉL$OuƉT$;D$@   L   t$D$4G*F$@t
PP3ۀ|$?Vzt$tD$`H\$L  t$$L$t$t$  D$`9p  |$$׋L$Gp0Wv  T$$3L$eXup	dn  |$@ t-~)D$$St$|$p,p(t$$t$$貧 t$|$t$(t$ t$ D$  L$9  u:\$$ыS補D$uӋWD$L$duD$D9A|  3+AL$Dȉt$@D$$L$DL$H3ɋX       P3~ 89tA;|(    G3GtWQD$pQL$Pȃ   wt$pwjVjwwjV\Vv$V}t$DȅuCt$t$|$k+w<w@|$t$ t$ Ft$@|$D$$u\$;ptt$S\$L$  |$0D$4   wu9;t$X~h.u"L$PIƙRP t
t$XD$PAD$   t$֋\$N(F,ىN(˃ ؉F,D$P|$   D$PL$4ӊڋˀFuD$0T$P+ƉD$04D$@D  ًˀFuL$0D$P+ΉL$0L$TI\$D$PӋGt$L{0 D$ t$DD$4u,s,L$s(D$  PQ]D$0t$DD$4|$\$t$L$$[uL$$[  \$t$|$4 tuT$P= tEpKt
PHV$)xIIVpKtPPVpK\$Pt]= tJt
PHS$)xIISpKtPP_^[]S_^[]_^   []QSUVW3پ   <0|<9w}<B<x<0}<,u8BB   3<0|$D  <9w}4Bv4p<0}      D$    8   u*sD$shHsPFl$$uƃ   V׋苳   tA~FD$Gt
PH֋Gt
PPt$}ǃ       _^][Y_^]   [YU   S3D$    D$    UVW0|%D  9w=}BÊHЀ0}F0t~F0       u.vD$vhHvP+D$$  Ɔ   D$   j P
  \$PjjS(F0RPjS 3uhNjeJ 9+uhPNjPJ   3t#h-hS hhěj%JR  D$@t
PH/  fD  El$2   C L$;   j QD$    SPjC   l$|$ :   :   :   t$ MCECKME   K         ͋                                 #E$       r輘蕙S诺|$ |ƃ      l$uy l$$  u3/Q%  =  uyuyt3	ZcS|tj}W udu3֋͉C| C$aύQAu+j APD$$D$tt$WPh D$$։C| C$C|    C$   l$Et
PPu3_^][]Ë3Ft
PH    |	    v	Ӌ諷Tƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    ~W uu3ЋFt
PP_^][]̃S\$UVt$$WL$։|$؋D$؋؋D$ ؋؋D$,؋؋D$03~$D$ˋ(ٙE;l$|_֋^][̃|SUVWj8WD$TfD$4ىl$(j D$HP\$,D$X    D$PՋPjj j j j$   7T  t$DD$Dt$DT$XD$doL`  T$PLdJ  |$4\$0|$\$$   T$($   WfD$(ω\$fD$8fD$04;   |$,\$(D$4l$0D$WT$(fD$(;t$   L$(T$,tAut8L$xT$T$|Ut$<WS$   t$81D$01T$WfD$8fD$0tT$8\*T$(OD$     t
+\$(|$,\$(|$,;t$/L$ T$PKd|$\$|$4\$0L$PaR$   _É1^][|U@  SUVWT$dWl$ D$(fD$Pj P   fD$HD$0    t$t$    \$(RPjSd   RPjSSD$t D$`D$PD$\3  9+uhPNjCE3l  D$$@t
PH  El$82  C L$03   j QD$D   SPj#=   l$0|$h:   :   :   t$hMCECKME   K         ͋                                 ~E$       rS
|$< |ƃ   R   l$8ul$$$  u3/Q%  =  uyuqt3	\S|t}W u[u3<΍QAu+j APD$DD$8tt$<VPк D$D׉C|t${$t$   C|    {$t$l$$Et
PPd1  @t
PHKxt3f;   r   A@   IPA$tA)D$T9tOT$T$ty t'OT$TWfD$Pl$PS$yW uu3*C$@t
PPD$ 39   ~5@ D$PW1D$dG1T$h;   |݋t$\$(t$y-hNj@h-hS hhěj?   ;Gt
PH    |	    v	Ӌү{ƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    W uu3Ћ؋Gt
PP  |$  l$ t$4E$   h D$8B=؃u\$D   l$@|$  MD$4j Pj h   j8|$95tEpKt
PHS$)xIISpKtPPS\$Dl$@t$4  D  D$      > uhPNj/>   3  D$@t
PH-H  fD$@D$22  F L$8>   j QD$4   VPj7D$Lp  t$8|$h:   t$4:   |$8|$4t$h:   t$4֋|$8FOGFNOG   N         ϋ                                 G$       r誌胍V蝮|$, |Ɔ   T$Bt
PPdO  @t
PHNxt3f;   r   A@   DPA$   IL$  uD$$  u33Q%  =  uyuyt3	VD$V|tT$zW udu3BύAD$Au+L$j APD$ D$,tt$WP D$8T$LL$F|"~$   F|    ~$tIT$*ty tIT$WfD$@D$DD$D$@V$D$HyW uu3F$@t
PPD$ D$(    x, t@@PVD$0D$ 3(   |$,L$;xU@ <   @t
PHVxt    O;}xL$uL$O   A@   BPQ%  =  uyuAt
D$    UD$V$yW uu3F$@t
PPT$(D$$PD$$jt$D$0    H$^L$0D$   fff     D$LD$X    PD$TD$D    PD$HD$X    PD$dD$X    PD$LPD$DQ@ЃD$   t$LT$\L$@Wt$$t$TPt$</L$<3D$8   39   o  fD  ;T$X)t$LL$@t$0t$$t$TVt$<3D$ 3F;   |Ë|$,L$$t$4L$$tD$0Q@ЃD$3ɃeDL$D$D$G(|$,L$u6D$ hNj^8h-hS hhěj@8|$   D$0u/hPNj8h-hZP hhěj 8   HtQHD$4    |	    v	֋   D$    r~D$St$0T$~W ut:蓵|$\$Dl$@9l$\u9\$`tD$d     _^][]Ët$D$d_    ^][]̃SUVL$   W~uT$<N%  =  u?u	VT$t
3D$QD$ƹ   t
?u^+tN   tt33X؋D$u   _^][Ãu`Ӌ(~Jtx:xuFGJxxx+  L$31c_^][Ãu^Ӌ𿼯Jtx:xuFGJxxx+   L$^h_^][Ã~   ӋįfJtx:xuFGJxxx+u<L$T$D$       9l$  D_^][Ã~tD$   ԯfD  Jtx:xuFGJxxx+uT$L$R2_^][ËD$
~_
   ܯ Jtx:xuFGJxxx+uT$L$R
_^][̃<SUVW3ۉ|$,9_'  7Swt$0F$D$< D$83D$PT$Dl$9^  f  F 8(  EPwWL$QL$@jP\$(X؃D$S      L$D$     QL$<D$@    QL$DD$@    QL$,D$(    QL$PQPD$H@Ћ؉\$$   l$ D     L$(G7;A}
;D$   ~ t|$    F;t~    ;}{T$@6r
;ust-
:uTt"J:NuGtJ:Nu:tB:Fu-D$ORPD$ RPt$TT$8t$\: \$<l$ 4D$|$,l$t$(D$|$,tPD$4@Ѓ3eDEl$;n=wt%fD  u9^NtSS=؋vu_^][<USVWD$D$    PuD$    t$$V׍L$D$|$     3ۉt$9_(   3ɋE39G(u6D$3PD$Pnȃut$VV"ȋ        D$   PD$P c  t$V˲VҢ_^[]ÍD$   PD$Pȃ!  t$V苲d   t8@t
PHNxt3f;   r   A@   #9PA$tAD$8t>؉T$#t9Yt>؉T$WfD$\$t.V$yW uu3F$@t
PPVˡȃu>]PE     G   Pj u萔 _^[]Ë_^[]UDSVW3ɉD$8L$,L$(L$D_\$   M@?u$TB?t  \$LA$t11tb= ty t	=WfD$0t$0y   3  \$ڃ 	  SVЃT$   \$A   Qj RD$<S 39  uRD$$VPVfu9t$$Pu@t
PPVVt$  |$8ME  9w(<  \C?uYC?  	Q?   $tIT$L$$Ct;T$$+ty t<T$$WfD$D$D$$D$D$C$tS3t;$t{ t	;WfD$HT$LD$H9D$u9T$$tKG@\_ ut$ D$,PL$0L$,uUD$D   t$M\$  B?t&t$ D$,PMD$0t$D$,D$,|$8<  4  LA$t\$1t:ty t:WfD$8D$8D$|$D u7uUt$u(         E  P  T$D;|1;r+;u;u	   tD$9  u  ;  ~K)  T$DD$  D$    Ǉ          M3ۋt$0L$(t$DG <    	u3-Q%  =  uyuAt3ET$VSP>   L$(	AtyuA'tQ   tt3ALL$T$0t$D	L$(D$CL$(t$DC;}	L$($3t$    tt$0׍L$Pt$D$,@    \$ tPSt$8׍L$Qt$\$ = tHpKt
PHS$)xIISpKtPPS      tMCD$8CD$DHtQHD$HӋD$D@t
PPt$8YǇ       _^[]̋L$VW+qF;uF F > ud~ u^~ uX= tEpKt
PHV$)xIIVpKt_^D$%PV_^SVWt$t1t$Ou*t%t$Ot$_^[6WT$_^[̋D$L$@A@@A3̋D$L$ D$H$3̃SUV1D$L$WtsX8D$$D$;R|;sLt;yT$ȋD$   D$;\$|;r3L$D$8X1_^][UQEUSVuWF<ȋB@@D$Pv荋t$؅tLwyT$lL$ɸ   y  _^[]ÉGGÉww WW_^[]U   D$\    VWD$d    Wp)D$pfք$   D$`>D$HL$DD$8D$4    tMND$`PhT$<  tND$`PhT$<  |$d   4|$ t$LD  PV5  t$Lj V輊 L$TEL$pD$tID$D$   D$x|$|Ǆ$   L$HD$4    D$LtZID$pPhT$<ȃL$  |$L   L$HD$pPhT$<IȃL$   Aы@@D$4L$pPt$x|ȃD$4L$teFyT$LWT$LȋD$4ѹ   JD$LD$Hy  L$D$LL$FF D$HFVFV  3~P$   }L$ D$4 8 t'33ɋփ?Ѓ C3@C		OD$4L$ F(D$4;|ȋMEL$|$    }S3Ǆ$         3fff     $   t$xPH$   G(;|   T$   $   @ ~ t>9V|;s׉T$ T$ (uց  3+D$x@D$H$   B3҉D$LT$4f     $   t$LVNHVN t$H6T$8G$   (T$4;|$   WD$ 3fD$`D$`|$dfD$XT$XD$D$\t$t$(|$  T$4։t$,D$0ff     $   T$TB D$@  D$xzD$ rt$$|$D;a  |;W  D$(%?  yH@L$ D$PD$HT$L     D$H;  ;  D$P33 C3@D$$C+33 C3у@D$CʉT$`EL$X#ǋL$M#ȸ   u  D$D$T	t$3	|$8~$fD  ΋T$Xә 	T$0F	D$4T$`;||$@tnyT$<ȋD$<   D$<t$$L$ D$|$@|$DD$D$xt$$;|$DT$L;D$HL$|D$(T$,@(D$(T$,;JD$0T$4t$;t$8}t$ w|$FD$VF~t$t$8EL$8$   ti= tPpKt
PHV$)xIIVpKt$PPD$ _^]$   D$_^]ø   _^]USVuD$ى\$WyNFu+KCA;|?ʋƙD$ʃd L$uGt$L$Wt2{{Vt$;P L$(7 A3_^[]_^   []UdSV23WD$$    JFV|$4wD$@BD$ B\$(\$4D$L$D$pL$tݭL$8|$IVQu_^[]iL$@D$\I$T$TT$PRPD$@WPuk       \$ } D$$D$PPD$,D$     PD$$D$0    PD$\PD$pPD$`t$\@Ћk  T$9T$$|9D$,T  \$D$TL$+ÉD$D\$D$@D$  Ét$4u+|$F33ɋ C3у@C##t} t$4]3KD$,    3ɋ C3у@C#T$#L$u8|$,t$fK33ɋG C3у@C##L$t݋t$4|$,} +t$,ƙ+   D$8D$,    H$D$4D$<PD$4t$Ht$HP  ]D$<|$4    9\$,}DL$,D$X    QL$HD$D    QL$HD$L    QL$dQL$tQPGЋD$<tPǋ@Ћ} t	eZ  T$3L$e+ED$,~,~L$hfnffL$hD$l\$hD$T$L$\$\$3\$\$T$D$,      9u   \$"  yٍKfCu+ًOGA;|GʋÙD$Dʃd L$X9  t$XL$HV  ww?T$SR7P/ T$$]  3C   ]KCuG+ًOA;|GʋÙD$Dʃd L$X视b  t$XL$HVAI  ww?Su7P蟔 T$$] 8 3C] |$$D$L$D$hL$l;H] |$$E;[  3+3 C3у@C#T$#L$t   3;|$} \$@~&L$ T$D$+P
^     ]K CuG+ًOA;|GʋÙD$Dʃd L$Xy4  t$XL$HV  ww?Su7Pq ] 8 C\$D$L$(+ˉL$4D$\yȍQAu+ʉL$4} GW@T$D;|J؋؋D$Xd\$D ̄  L$XVSiq  L$4_wQt$`\$(3P辒 L$@3O 9t$@   ]SCu+ڍAL$D;|IʋÙʃd L$\9   t$\L$$VD$    wD$ wSuP* L$,G \$(\$ \$(\$ &  }   uN    FuC+KAt$D;|9ʋƋ3ʃd L$\yu8t$\Wt%{s;t$Du7Px D$P         e   \$K CuG+ًOA;|?ʋÙD$Xʃd L$\ut$\L$\Vtww?D$D$ SP7P ] 8 3CD$Lt$H@Ѓ_^[]̃UW    U G;B   G;B$  Ot]  O_]3ɀ}yD$GVD$pEtG$SD$  @ 3t!    」GFEǊ
¨uD$T$@D;B};u6}yuL$E<$t AЋET$ȉ>   FFypN @  u   \F?      u   >F    u    Fȸ   ϸ   ;M[  ^_][^_3]_3]̋T$SUVBD$t$W:~" @B,t5F8t-39s~U    O@RJFO@J;s|3_^][Ë֋wu*39S~#3ɋF(IBDD)F(DD);S|_^][QSUl$3VW3ۋE|$|$~~uyT$D$ M PS
yt$(ЉT$t@3tဍGFEǊ
¨uT$D$Ét$ @E<|$@E    C;]|_^][Yw4@$,   ËAËAAËAAËAA@f   ̃SVW> uN  6t8@t
PHNxt3f;   r   A@   PAtyuY)tQ   tt3	4؅   V$yW uu3F$@t
PP@t
PHFxt3f;   r   A@   YPPޅV$yW uu3AF$@tPPhP袅tSD$ύ4;P|$|4T$t*;w&D$xD$ tD$$t03_^[ø  _^[̋T$L$ҋD$3U0SUVWىl$3\$,t$({|  PWD$  WVP`v {t$ t;t$OT$$h u%t t$OT$$h D$8|$39U~ω|$IB@+p@q;U|3D$ 9E  33ۉL$L$$9MU  wfVnL$,UP/u|$(_  } tLNT$0WL$0T$4"  u  A}   L$AL$L$l$D$$@D$$};ǋD$ h   33҅~CD$x u3&t;N}pt;Ht   B;Oڃuȋ}3un>~T$8L$8T$<tutAF3o~|$L$l$ADD$PL$ E@D$ ;E}|$w]   |$(3= tTpKt
PH\$S$)xIISpKt!PP_^][]t$_^][]_   ^][]̃lSUl$xV\$3ɉt$3҉L$W}D$ L$$T$,$   |$Y  E$   C  $   E      E      L$ D$@j WT$(j PfD$LaL$@D$
      L$ D$<PD$4PD$PPT$0)D$un39}l  \$<t$0T$P`t$0;,  j jt$Tt$T t$LD$Tt$L RP˃ T$
G;}||$t$\$D$,$   T$,L$BT$,t$$  >Gt
PH    |	    v	֋%}\Ɔ   F F$    fǆ   F(    F,    F   F0    F@    FD    W ut	ЋSGt
PPD$_^][lø  D$v$L$$T$,v D$0    m\$0D$~  t8@t
PHCxt3f;   r   A@   PP3tjS$yW uu3C$@t
PPt8@t
PHKxt3f;   r   A@   0PAtyuq)tQ   t1t3	,t.S$yW uu3C$@t
PP>3D$(9u~;L$XQ;|$(wD$D$XFD$(;u|	  D$|$t$P3Ft
PH    |	    v	Ӌz]Zƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    ~W ut	ЋFPPt$`vD$d    D$h    D$(    teND$`PhT$0,D$UtND$`PhT$0D$+t$ՋD$FՋt$D$d   @@D$hD$Pj 7!n ND$^D$p    D$t    t$l3K\$@D$4    L$(tP	D$lPhT$<ED$ntKD$lPhT$<D$DCD$p   D$    L$(@@D$t|$ 0  t$~ t$L$ Ej j PT$0D$3D$4    tGL$(T$4Uh	ȃ      KT$4Uhg   u 3ɋD$4L$>8K"t.C8t&39O~`L$4F@IABF@A;W|=Ӌ jȉL$u.39W~'t$4C(IBDD1C(DD1;W|L$|$t$T$4L$4qfD$4D$3D$4    tCD$(T$4Uh0KT$4Uh0g$   339H   3w   L$8QU2kT$@ȉL$4t:3t」FBEƊ
uL$4D$\$@T$8 4D$     $   E;h|$   |$_^][l U4SWVr\fD$$fD$,fD$4T$CL$ΉT$D$    D$ W   MF:utP:Quu3΅   ~  ul~ uf= tSpKt
PHV$)xIIVpKt!PPT$B\    #VT$B\    T$  r3ɉL$L$L$>tGND$PhT$$"utND$PhT$$ D$3ɋT$   N$}BD$(+   D$    <p   <c   <n          PD$ hPD$t$֋jjjj@   m  =    pKt
PHV$)xIIVpK  PP_^[]<au    P'<lu    =<st<xt<yt<b'L$ /L$FȉL$3ҋ߃sL$ Cu+3 Tnt33hV_^[]VW2tEWj Vg L$$F      DCNL$PuQN| T$3ɅD$      Er\BX   uPt$脀_^[]3 uG_k _uGQrm   PSc؃t# ptGPGPSn{ 
   T$But$ ֋L$D$,D$$P\$DD$t0D$p\VF       QNQP{ D$(tPt$tAS׃_^[]ËD$ӋL$Wj @\@P~y_^[]jt$I_^[]́    3ĉ$   $   SUT$4$   L$D$   L$L$   L$H3VWl$@\$L$L$dL$hL$l9JuQjQ%  $   ;»   Mи@   ;OЉT$DBD$H\$8WfD$(fD$XxÙ؉D$$D$4      T$,$   L$(D$T$ L$W3fG9p   @ D$p    WD$t    fD$xf$   D$(    x;u\D$(PD$tPD$`PRT$LQL$8VȃL$   L$(D$T$ ;~D$p~$   fGL$F;pht$4OFW\$8L$T$ t$4;%9L$Xu9T$\tL$tT$DCD$HL$3~Gl$L$   u4D$dPt$TCt$\;Ut$4QL$TVF;|ȉL$l$   t>~^Gt
PH֋Gt
PPSoL$ǅ       trQt$D|\$ltv= tHpKt
PHS$)xIISpKt1PP%ST$dL$@hpjj,v$   _^][3I    USVuD$W}WPfD$wbNt$ЉT$Y@t=yT$L$AT$T$$ɸ   AT$T$D$D$D$D$~MCD$D  WGRȍBGD$L$AD$AD$Q1AuʋD$_^[]_^[]U    3ĉ$   D$VW@$zT$L$l D$ 3D$,    D$D    D$TuWjW%	  WD$4)D$p)$   D$8T$0D$(D$tSOD$0PhT$02  |$tOD$0PhT$0  D$8G3D$4   @@<@D$`|$1g  PW"  t$j W` $   3ҋ|$T$(G O$$   D$$$   ωL$p9P|  D$h    D$P    D$L    D$H    T$tD$x    D$    D$tNOD$pPh0T$  |$   OD$pPh0T$h   D$\WPRfD$8H_G|$\t$H@L$tGy%T$XL$ЋD$X|$\T$(   D$X|$\T$D$4D$D$0D$~>qT$x$   RBȉT$xƉ9Nl$AD$AD$QAuɋt$  D$(@PD$D$pֈt$D$p脄u!|$t$w  c  L$QPD$,W|$H$Wrq  D$HPD$PPD$XPD$tP$   PD$4t$0@ЃD$  D$`3t$  $   D$9 t5A+AqqD$0Ǚ;|9D$0sy+yt$t$D$D$u  u    -yT$dPȋD$d   D$dFVD$t$ 9|$H},D$HPD$PPD$XPD$tP$   Pt$0FЃt΋t$   D$LL$P++$   P*QPt$4$   h@Pj@-$   NFuD$D+ƉD$0HD$T;|EȋƙdL$T Gc   D$TL$,WP   |$,|$,V$   PD$LP4q D$<D$DD$    8 +eu
L$$y( td|$t$3eED$$@ЃugD$$T$T$(;P}VL$pD$ t$@Ћ|$3΋D$ t$@ЃD$ t$@Ѓ  $      $   t^= tEpKt
PHW$)xIIWpKtPP$   D$$   tQGD$0GD$HtQHD$׋D$@t
PPt$0agD$(ǀ          Vt$p>tt$4   = tZpKt
PHV$)xIIVpKtYPP_^$   3A ]V_^$   3A ]ËD$DT$,HL$lhpjPm$   _^3bA ]Vt$   W~tU= tBpKt
PHW$)xIIWpKtPPWpK= _tBt
PHV$)xIIVpKtPP3^V3^US]T$UӉL$T$D$    VW;  \$7G   rOh;t $<uG?;u   r% =   tƃ=  u  x  ;tC 1w-      } %ߟ%a uD$@D$D$T$;G]1  L$qy^  PVa  D$T$@D$D  3C   rLh;t$<uC?;u   r% =   tƃ=  u  q  ;D$tl 1w-      } %ߟ%a u4D$3Ʌ~
94}A;|;~DJ;D$@4D$D$T$;L$yA3_^[]_^   []SUVqW~,i3x">+T ;t"HN@;Nǋ;}ދ3  _3^][Ë˾   {  _3^][USV3W\$]  Pj	ЃT$  W3B   D$D  ;E  MOGu+   TwӋ;u+sff;uA:BuT$B     hӾ    ;u+sff;uA:BuT$B       |Ӿ    ;u4sff;u!A:BuT$B         Ӿ   ;u"sff;uA:Bu   5Ӿ   fD  ;uPsff;u=A:Bu53ҋL$GPCPT$D$D$\$@D$|	T$   R3ҋE_^[]_^   []UQV[uvPjЃteMWfBB    JuEB%3^]ËEy qD  AuE+ΉJ3^]ÉBE3^]ø   ^]U$USVWzrzr
L$|$$t$(;   G|$   rXh;t&@ $<uG?;uL$|$   r% =   tÃ=  u  PuL$|$$;re   _^[]9t$$sUrt$@ B΋R+ȉD$T$ B;|@Y  D$ L$@RP'  U+JBB@t$|$,   }C             3D$    D$Ǚ+ӋF+ыHL$ ҉L$ HD$D$FHD$;}ċT$ |$;}#3#   uE0؋L$At3ҋ˃a  ؋t$      }F    'w݃(؊ˀ?   }@NNÁ   }$?, À^N'$,$??NÀF^t$T$(;   G|$   rWh;t%    $<uG?;u|$   r% =   tÃ=  u  L$U 1w1      } %ߟ%a iUE+zJz+rEL$$0+JEEL$,+JEJB3_^[]_^   []QVt$   s   #8^@YÁ  @ sbSUW3
    3D  +`H;BCH;B;}ڋ`%  
9D$_][@^Yø   ^Ý   3ĉ$  SUVT$WD$Ǆ$     Ǆ$   8CǄ$   cǄ$   Ǆ$   Ǆ$   >Ǆ$   xǄ$   Ǆ$   (	O	Ǆ$   		Ǆ$   	$
Ǆ$   l

Ǆ$   
Ǆ$   NǄ$   Ǆ$   Ǆ$   pǄ$   Ǆ$   Ǆ$   8Ǆ$   HXǄ$   hǄ$   Ǆ$   
Ǆ$   *JǄ$   jǄ$   Ǆ$  Ǆ$  8HǄ$  ZxǄ$  Ǆ$  6Ǆ$  xǄ$  Ǆ$   iǄ$$  Ǆ$(  H^Ǆ$,  Ǆ$0  Ǆ$4  Ǆ$8  XǄ$<  hxǄ$@  Ǆ$D  Ǆ$H  .Ǆ$L  nǄ$P  Ǆ$T  
Ǆ$X  ,^Ǆ$\  Ǆ$`  Ǆ$d  HZǄ$h  xǄ$l  Ǆ$p  Ǆ$t  
.Ǆ$x  nǄ$|  Ǆ$  8JǄ$  jǄ$  
Ǆ$  *NǄ$  D$ aceD$inouD$ yyacD$$deegD$(hijkD$,lnorD$0stuuD$4wyzoD$8uaioD$<ugD$@koj    D$DgnaD$Heior3D$LusthD$Paeo}   D$Ty  3D$X    D$\  abD$`ddD$defgD$hhhiD$lkllD$pmnpD$trrsD$xtuD$|vwwxǄ$   yzhtǄ$   wyaǄ$   eǄ$   ioǄ$   ufǄ$   yD  +D   P;B׋PBBŋ;}׍T$Ճ|$ u: }D$"l   L$;
$  _^][3\2 Ĉ  V~ u^W~tU= tBpKt
PHW$)xIIWpKtPPW_FFd   FF    F    F    F^USUV3W^~;wr;s	؃
8FtQ8Ft   _^][]PugSW躳tWvvU^ F n3~^_^][]ËnPu%SW&tn3~^_^][]Ë>   FfHt		   fHG   Iļ}_   ^][]US]VuWFV;Vrw;FrӋul~~~CE|$PuD$D$    P\$$D$(    D$,    fD$0  ZD$,8 FFPfD  @u+FV_^[]USډ\$VW  M    VF ;Frw;VrQ   FN"VFV 3D$FE    "t!\twiˉL$   ًȸ    +D$ ;Frw;NvU+׃uuWFN\FV FD$VFVNE\$ GL$VN;YF"FV _^[]3MD$ ;Frw;NvU+׃uŋFN\FNV FuFV NF0FV FND$F0FNV F0FV FD$D$USUVWO?H  $,+NF ;Frw;Nr     FNnullFV _^][]Ë_%  =  u
;uot3Ot
;u*tG   t?j  W  FN ;Frw;Nr׋T/  FFWUP~Z ~V _^][]Ë_%  =  u
;uot3Ot
;u_*tG   tt3Bظ   fGtRJuL   FN ;Frw;NrӋufFFSUPY ^V _^][]SՋ	_^][]À~ u+̰jjjA   	j[F_^][]ÐX)X)**)UVW~    V~ p>E~ NwwPjQW)tRЃNj jjjG   FFd   FF    F    F    F_^]VW~tU= tBpKt
PHW$)xIIWpKtPPW~F        F    t`= tMpKt
PHW$)xIIWpKtPPF    _^W_F    ^Vt$tW= tDpKt
PHV$)xIIVpKt^D$%PV^SUVWEt tD$tU΋_^][tmE H  $X1NF ;Frw;Nr     FNtrueFV _^][ËNF ;Frw;Nr   R]  NNtTxTAFV _^][EtuU_^][Ë}]  ϸ    NF;Frw;Nr׋  FFWSPV ~V _^][ËFN;Frw;Nr   uNF[FV @ M      [<    Gu\NVt=FD<[t2<{t.;Vrw;Nr   *uFN,FV t$֋M?rG@   ;xE tE@l RF;FrwF;Fr     FN]FV _^][ËFN;Frw;Nr   wuNF{FV }      [<    G   NVt=FD<[t2<{t.;Vrw;Nr   uNF,FV t$֋F;FrwF;Fr   uFN:FV t$֋?rG   ;](E tE@l F;FrwF;Fr   EuTFN}FV _^][ËNF ;Frw;Nr   uFNnullFV _^][Ä--3.3.../U    3ĉ$   EWVWfD$  T$"|$T$T$PD$d   D$    fD$i|$!    t$|$  pE|$ w L$wT$PjQ%Q,t	t$ЃNj jjjF   'D$"D$d   WD$D$    fD$D$    _^f	H$   3@Jp$ ]̃AqD$SY**ȊÃ$L$*ȊË\$*؊$*Ȋ*L$؊*ъL$*ʃ[U SUHL$ډ\$VW  $X8   fHtj j]_^][]       @    fH_^][]Ë   fHtj j _^][]        @    fH_^][]ËiWfD$(E <-uET$,]t$(E<0|w<9wsC0|D   r6   |   <0|<9   	   tRƋ <0}} -uރ ڋD$    fHtbRV-_^][]À} -u^D$    fHth   j _^][]        @   fH_^][]É0   PfH_^][]ËL$\$qu3΍QfD  Au+ʁ?jQT$03   fFt	\	   fFD$(D$(L$,%  =  uD$(      fF_^][]AuiqE  QAT$ D$rn@    ƙRPT  D$    H3D$(;  \$CKD$$Њ<\t.m  DGBAT$L$<u"  BT$؋L$T$L$:  w.\$  Á  w?.Fˀ.\$   %   =      D$ ;s~:\uyD$$<8uuoT$ȁ      L$uR%    @
؃.$?D.?$?D.ˀ.\$].?$?D.ˀ.\$4<bu%<fu<nu
<ru<t	   DȈ.L$GBAF;|$(v\$. pPjVՋkK_^][]Ë   fHt		   fHC   I_^][]j a_^][]Ë   fHt_^][]ù   fH_^][]Ð[3335588UQSVW~ uVF<E
   FD$=u8L$j P@tuӉ~uΉF$   _^[]F_^[]UQVNt+;Fs$@EAEA AH^]uu7^]USUVWىT${/ tfff     D/E ul$/4/t${y  Kt-;Cs&@f D    D    L$Aj j    D$ȅ  u  > tFfCf@fCf;  ֋!   { f  IK|S  L@/ t     D/E u</:   U  fC  > tD>F u><,uF/<}  D$+J@CTF_^][]ø  fC  D$@9  F_^][]À[  Kt-;Cs&@f D    D    L$Aj j    D$ȅ,  CIuL$  D      > tFfCf@fCf;   ֋fkxM8 tD>F u><,uF<]   CT$+L$ILF_^][]Ã"   D=u2҈T$tfo<\uOD>FE<"t=<\t9</t5<bt1<ft-<nt)<rt%<tt!<uu33ҋfD  tBA|T$<"tD>FEu_^][]Ë{+L$At ;Csl$@f Lll$   UQ|T${ @CTF_^][]ÀnuFjhRVR pF_Kt;Cs@f  M3kt{   jhlTVQ !FKt-;Cs&@f D    D    E_^][]ú   j j E_^][]Àf{   jhtTV?Q FKt-;Cs&@f D    D    E_^][]j j    E_^][]À-t@0|9~6}u_^][]À]u_^][]Ä3_^][]220-EEŀ<80uD8,0<	u >><0|A<9~V<et<EuQ|>0D7<+t<-uD7F,0<	F<.u|>-ogF뙀y0X3ɋ+ҋSt*;Cs#l$@D |l_^][]Ël$UW_^][]UQSWVuWCu
F_^[]3҉smЊCu9~528t@ D2B uC<2 u~	3_^[]þ   tUt7   fAtlfqG   I腢n_^[]jjjjwF_^[]SUVWE4[U<D$tHuw   9wrmES͉Bv|r	D   ;wv_^][þ   9wr*Sv<rD@   ;wv_^][U$SVW\$ uL$7Q%  =  uyuAt
D$    ]D$Qtyu	qt$<tA   t
1t$"t$t3t$D$3D$    |$(D$,|$$9|$  3D$f     pC      9Qu;CtxIu   y   T$ug9wubOT$r;ust-:u6t"A:Bu)tA:ButA:BuG T$GT$OG;L$,sL$,L$L$( ;D$$t$FD$$D$@|$$D$|$$D$T$D$(tOB J_^[]2,  t$j F!Pߕ؃  FWPt$K QCK@ Usto= tSpKt
PHS$)xIISpK  PP3_^[]S3_^[]ËL$ G|$(sǎpCQT$,   tfD  9~u;Atxvu
j jt%誛#Ft^vЃ^F,   赔tEL$ WT$,F    A~   F   y uA^F,_= tEpKt
PHS$)xIISpKtPPST$ B   te    9yu;BtxIu3_^[]ËA_^[]Ë\$    fHt		   fHC   I2_^3[]UT$S]ʉD$@V; 4IW<|$  G\$   <.  ?  CC]<"u7Cst$   t<"t	DBuMZ<
   BT$-3҉\$T$t<.t<[t	DBuT$څ  rf   @ vDQt;u,St$qC;uASt$@P|H @uDFv<rD@   ;wvG (  D$GD$@D$@<mT$\$ B\$  <[  C3D$Vt9D$fL4Bv4pur	]   L$|$#:  ?|$$D$,  _;w6f     RDFEƀ9rA@   ;v׋D$G tG   D$@D$@<D$랋]   |${-uHCD$t53ɍQ@ D$BIHD$u;q  +<]`  ?\  D$$@D$ D  _   ;r8@ IuDt&DFEƀ:rB@   ;vG tD$GD$@D$@<;F  T$\$$ыD$RCT$]@; <|$  }   |$Owt,;s&@f D   D    L$$Aj j   D$$Wt(;s"IL$LL$f \?Gt$   SL$ uT$ AuыL$  D$x    t(H\$D$$+Í[L DD$@L_^[]ËME3_^[]Å   }   \$Kt%;Cs@f D   t3Fj j   uT$$WG   { u)t0L$\$+I[L t_^[]ËE3_^[]Ë_^[]UQS]VW   uZNt$;Fs@f  D    D    j j 3ҋ;~    @F_^[]<.u Nt;Fs@f 2   DjhWC u]Nt$;Fs@f D    D       j j ~ uuSWJ_^[]_^3[]UD$    VW   :$u"D$PuB3PT$   FRh }   jjjjG   = tNpKt
PHV$)xIIVpKtRPP3_^]V3_^]ù   fHt		   fHG   Iʕ3_^]UVWRhjjjjF   t_= tLpKt
PHW$)xIIWpKtPP_^]W_^]SUW   ];|=V4    .t<uN>rF@   G;~^_][U    3ĉ$   UD$VW}L$W|$fD$  D$D$d   D$    fD$W|$!    t$|$  pE|$ w L$wT$PjQv4,t	t$ЃNj jjjF   xD$"D$d   WD$D$    fD$D$    _^f	H$   3@J ]U    3ĉ$   M3ҋESVWL$3D$d   L$D$2   fD$0 3D$\$ |$$D$2[L$(T$,9U   @ tBD$D<[t6<{t2;rw;r   L$RuL$(D$,D$(T$, D$L$F;u}T$,L$(|$$\$ 됋D$,;D$$rw
L$(;L$ r   L$uL$(D$]D$(T$, L$L$_^[   f	H$   3@Jf ]US]WVuWSfD$   }uKNu3-Q%  =  uyuAt3 Sj Ћtu?u7_   ;r+T$t$I<rD@   ȃ ;vT$t$E    fHtRVI_^[]ù   0PfH_^[]U    3ĉ$   S]Vu\$CW}|$ @D$,  S׋eD$  
  O  Q%  =  uyu	Y\$  ؉D$x  D$,T
  ;$	  L$t$Jd   L$0WfD$H t$4|$8D$<    fD$@  $[     fD$J3ҍCL$@T$DD$Cu+\$z  3T$JǉD$$udr\ds	   3n8#utWV-D$tbt$@t$8PD1 T$L$@|$<3T$4D$H t$8St$ 
P1 L$LT$Dˋ\$<t$4׋|$8L$@T$D   t$0   D$IfHt		   fHF   I'|$H u`t$4tX= tEpKt
PHV$)xIIVpKtPPVWD$Ht$JfD$@T$Dd   L$@3ۉt$4|$8\$<3ۋ ;A  w;7  rwv |$H    |$I   !u+SW薄tt$@t$8V/ D$H    t$0   D$IfHt		   fHF   Iٍ|$H N  t$4B  = +  pKt
PHV$)xIIVpK  PP   u5SWgt#L$@t$4|$8\$<]   f1D$@  t$0   D$IfHt		   fHF   I|$H g  t$4[  = D  pKt
PHV$)xIIVpK  PP  3[@PD$D$NhHP- L$L$@    L$@T$DT$ T$D~Fu+  3ۋD$Ë\$<;U  |$8w
9|$E  3;wr;sǋӃ
 |$H T$D$   |$I     u9\$|$SWD$tt$@t$8P$- D$D$H    t$0   D$IfHt	6	   fHF   IJ|$H N  t$4B  = +  pKt
PHV$)xIIVpK   PP   T$ @  D$4D$ $u/\$|$L$ SW轄tL$@D$4|$8\$<   t$0   D$IfHt	D	   fHF   IX|$H u`t$4tX= tEpKt
PHV$)xIIVpKtPPVWD$Ht$JfD$@T$Dd   L$@3ۉt$4|$8\$<5D$4Vt$ PA+ L$LT$DΉL$@ T$D|$8\$<t$4;A  w;7  rwv |$H    |$I %  u+SWtt$@t$8V* D$H    t$0   D$IfHt	˾	   fHF   I߈|$H T  t$4H  = 1  pKt
PHV$)xIIVpK   PP   uFSWmt4L$@t$4|$8\$<1 D$@t$4T$D |$I    3   t$0   D$IfHt	ӽ	   fHF   I|$H u`t$4tX= tEpKt
PHV$)xIIVpKtPPVt$JD$8d   Wt$4D$<    fD$@D$H#t$L$j dt$<|$H u\tX= tEpKt
PHV$)xIIVpKtPPVt$D$JWD$4D$8d   D$<    fD$@D$Ht$ӋL$Vj r  D$,t!j _^[$   3x ]Q   f	H@ _^[$   3I ]Ët$Ӌ\$Vj @{     Q֋A_^[$   3 ]ÍD$J\$0fD$H    D$4D$8d   D$<    D$J[D$@   D$D    D$ u3-Q%  =  uyuAt3L$Sj ؃D$x    T$@ʋt$DtXD$4D<[tL<{tH;t$<r$w;T$8r   L$0eT$@tt$DD$4,T$@t$DT$@ t$Dtj T$4(A ;t$<rw;D$8r   L$0uT$@D$4nullD$@T$D uG\$;;uZD$D;D$<rw
D$@;D$8r   L$0uD$@L$4]D$@T$D L$0L$   f	H@JL$0$   _^[3 ]U$S]VW;t$,uWvЉD$ T$:t_^[]ù   t$$L$(9K4  fD  I   LCL$J\$D$;       v9DuPt$t/ T$ t$J|r	D   ;s[D$뷊DuML$9 uD9T$,BQ֋ȃ  WT$ T$B;t	LL\$;r*  {    Owt(;s"@f D   D    Cj j   	؋Wt#;sIL$LL$f Lt$L$    QOt(;s"@f D    D    7Fj j     uMOD$ D$D$$\$$@L ˋ\$+ȋGLvGSLGTT${rC   L$(]ȉL$(;K_^[]_^3[]U@VW}u3-Q%  =  uyuAt3;uL$P   Ot-Q%  =  uyuAt3P֍L$,L$u_t$03tj ֋)0   fHt	P	   fHF   IdL$KL$(B_^]U    3ĉ$   EEMSVWD$L$t3Ljjjj@   t_^[$   3 ]3҉D$3fD$0 D$2t$$d   D$   |$ 3D$2{L$(T$,9U  D$@?  tBD$D<[t6<{t2;rw;r   L$uL$(D$,D$(T$, |$u3/Q%  =  uyuqt3	QtyuA2ty   t
ǋ|$ǋ|$t3P֍L$D$0;D$$rw
L$(;L$ r   L$uL$(D$:D$(T$, TL$G;]}T$,L$(t$$|$ D$,;D$$rw
L$(;L$ r   L$fuL$(D$}D$(T$, L$CL$   f	H@J_^[$   3 ]ËL$jjjA   	j,L$`$   _^[3 ]U$SVW}   ]u3-Q%  =  uyuAt3NUL$P   p;v[tkQ%  =  uyuAuIt>uЍL$j |$% u$tHF;rL$AuUj 0L$_^[]U$S]VW  uM4w_^[]Ë}u3-Q%  =  uyuAt35UL$P   p;vmfD  u3-Q%  =  uyuAt3ؾuЍL$j |$% uLt
HNH;rL$At!A4u! L$U_^[]ËUWL$9_^[]U,S]VW}G@D$  u1Dы@_^[]ËEu3-Q%  =  uyuAt3߽P׍L$  p;   Eu3-Q%  =  uyuAt3肽L$D$    WQЍL$ iȀ|$, u^|$-    t|$ u|$ t
IFA;nL$ AtbAM4WL$_^[]Ë   fHt	蛯	   fHG   IyL$_^[]u%L$y_^[]S\$Vt$WV   |$utKu3VPc^Q%  =  uyuAVj 72t3VP Vj ЋGtj jj_^[UQUVuj 	غ   fQtj P[^]É   A    fA^]VW|$wf~ |   (v   ~ u<T$FfF ΉFFd   F     [>F   F    _^ӽNFuv.;Nrw;Fr   uNF,FV T$Ή>_^酽_^SUVWڋwf~ |3G'v   F   >;FrwF;FrՋ薹uNF]nV FtG<      fHt	ެfhG   Iv   _^]f	H@J[ËNVt p~ EPjQF=jjQ   FV_^]f	H@J[j jj   _^]f	H@J[̋L$3̋L$   QL$SVWY33f9s|3%؉D$[\$   C   SUkD$rXw;vR\$<,u
u2t;,<"u3<\uAu<{t<[uF<}t<]uN3A;rw;r\$3;w7r;s1t$+щSkBPFPFP C]_ ^[YC   C]_^[YVW|$wf~ |   %v:  ~ u-FfF FFd   F     {F   F    =NFuv.;Nrw;Fr   uNF,FV Ul$>M u3/Q%  =  uyuyt3	薷M QtyuA$t   tAt3	P׋/F;FrwF;Fr   ^uNF:FV U]_^۹_^SUVWڋwf~ |3#v   F   ;FrwF;FrՋuFN}nV FtG<      fHt	0fhG   IIs   _^]f	H@J[ËNVt p~ EPjQaF=jjQO   FV_^]f	H@J[j jj   _^]f	H@J[̋L$3̋L$   UVuWhu uLt>G_^]j jhu   _^]Wjuf @    +_^]UQVcu*Pj@Whtj@j V M31^]ø   ^]UQVu0Pj@htj@j V M31A^]ø   ^]VW~tU= tBpKt
PHW$)xIIWpKtPPWpK~tP= t=t
PHW$)xIIWpKtPPWN 蜹_F    F    F    F F    F    ^Vt$tZ= tGpKt
PHV$)xIIVpKtPP3^V3^̋L$A;A@̋T$Vz tQJSZ(ID@tABqr;rs#B0W<4B>u;uF    _[3^F3_[^BtCt
BB3^ËrB(v|rDB@@ƉB3^B   @ƉB3^ËrB(v<rDB@ƉB3^B   ƉB3^SUVrRW~9Ft,   z;}fD  1tA;|;uFVRhBUP_^][S\$UVWu9G;GrwG;Gr   ҰuGO$GW _^][ËE04VM([v<uthWj腱_^][C@S_^]E[U    3ĉ$   SVuW}O_(I؉D$E  $`{  G<u$Q֋3_^[$   3 ]<   Wt  G0W(@T   fHt$j R53_^[$   3P ]É@       fH3_^[$   3' ]C@QKD@3_^[$   3 ]C@CD  C@KDˀ9  Q3_^[$   3 ]C@t	   3WfD$|$D$3ȋ   fpt#RQ<3_^[$   3W ]É   PfH3_^[$   32 ];Om   c  G0   fPt$j Qͧ3_^[$   3 ]É D$:Wt$ fD$8 D$$D$(d   D$,    fD$0tYuD$:$D$0   L$4  G0T$ 4VO(v|$<u	t  G@WE  GD$j  NFu+k  L$:drcƃnD$    D$\uht$t$KaD$tPt$0t$(Pb D$$L$D$(D$L$$D$8 D$,D$0Vt$P1 t$0T$4    t$    D$9fHt	C	   fHF   IWj|$8 u`t$$tX= tEpKt
PHV$)xIIVpKtPPVD$:D$(d   WD$$D$,    fD$0D$8D$:$D$0   D$4    G<uwhD$(Pj<uӍL$ d|$9   t$ |$8 pE|$4 wL$0wT$$PjQ  t	t$$ЃNj jjjF   蜧3_^[$   3 ]À 4  G0T$:Wt$ fD$8 T$$D$(d   D$,    fD$0D$u   D$:$3L$0|$4ww0T$ ϋ4VD$O(@<v<utD$$hPj趫G@WL$ E.|$9    \$8|$4L$0T$$t$ D$pED$uwPjQXtRЃNj jjjF   c3_^[$   3 ]ËW,GEj jj$   3_^[3 ](uu
v#vXvv$wy'{̋D$L$@3A    ̃S\$UVWC3҉L$3t$39~J|    x uxuTB;|ׅt_^]   [ËL$t$y_^]C    3[ËCC(   CDy_^]C   3[ËC_^]   CD3C   [USVuW}   }  Q%  =  uyuYi  &؅X  Qtyuy(tA   t9t3	萯tF       _^[]ËǙ RP[F   OQSP	 ^WF F0  3҉^,N û~4      tfDB u<     ~ tP^ ^t	F0    j SI[F0uF4d   _^[]j 3ҍN |}  ]D$    K  Q%  =  uyuA  茧D$  KAtyuY)tQ   tt3	|tF       _^[]ËÙ RPUZFK\$QSPh ;$t3D$3PFN @j P\$    xtX= tEpKt
PHW$)xIIWpKtPPWSh 詉A      y E_^[]Åth~(ϸ*+N(ʉNNF<rWGG    @N~ Ft/F0V(@FtID@tAF3_^[]ÍAF3_^[]ÍAF3_^[]ÍN e~4       XtX= tEpKt
PHS$)xIISpKtPPShkA   y En_^[]S\$UVW33@ u\Ct
PHj j WՋ!{W u33ҋ[bCt
PPr_^][USVu~QT$3ƉL$+kaW+ȋD$|ttAM9wu9Otut)D$t;t  _^[]ËEG83_^[]ËPLHLL$T$   uuR۴T$΋؃D$tax uVx8 uP    rBD$ FtPHT$YFt
PPt$ tD$pLt!>    p$h菆D$u   _^[]t$j uuhPD$$p pG ؃= tRpKtPHt$Lt$$)xIIt$pKtPP
t$t{>tWD$x uMx8 uG    wGD$ Ft
PH׋vXFt
PPt$ LU  E3  8_^[]ËT$tx rLt 3JL$ ;  .  D$  j PU  D$O D$OMG   @<OMOG    G    P6GT$D$t$ u&h-h| hhějs^E  ^\$$CtPHT$FD$   ;   up   FHy	 tAy
 u	/T$NF9 uj t$ R"t$RD$ ΉL$@@x	 t@u	蹮΋D$u/   rnD$CD$ @    D$C@%p$K@u9$  uCD   s@֋{W uu3֋]؋D$$@t
PPT$      }u;9]u6G@B(v     E3   8_^[]ËGJp@B;~  KD$t@Ga   3L$DtGE|t8_^[]ËE  8_^[]ÅtpD$H<= tVpKt
PHW$)xIIWpKt$PPE38_^[]WE38_^[]̃SUVWډ\$GwSD$ZJ;}^l$3U MɉHP vU@ 
@ɉHROF;|t$SNAQF   _3;\$^][USUVW   WOuPtQRjV#   u@t
PPE   _ΉD$uKt4NdPPD$(RP؃tӉY@"[@t
PPVG    V   ΋xu@t
PPGGu)u%E3ҋH(@,GOa   DtG|t_^][]_3^][]UQSVW   F   O<~u~ uGt؅u֋`؋NFt-3ҹa   Ot;t	H;uFF    = tOpKt
PHV$)xIIVpKt
PP_^[]V_^[]_^3[]UQSVډD$puUCW|$LDrȉD$ɉJHMC3f@ɉHɉLO;|_^[]̋T$L$jt$t$t$t$\  ̋T$L$j t$t$t$t$\  QSUVWF(s  ~LF tG~8 uAFL    _oCt
PH׋PCt
PPUvPvTzvXov\dv`YvdNvhCvl8vp-~@tX= tEpKt
PHW$)xIIWpKtPPWpK= tGt
PHV$)xIIVpKtPP_^][YV_^][Y̋L$g3Vt$WF$N PQPQPQht|uG_^S^LtV~ uP~8 uJFL    CUkD$Et
PHӋNE]t
PPt$j j j Wv؃= tBpKt
PHW$)xIIWpKtPPWuc[_^UQVctM       ^]j h   @Kt'h   Nj Q MA83M1^]ËE0   ^]QSUVW /l$   pK39_   3fD  Gt(tlFtvЋpK= t>t
QHV$)xIIVpKtQPVpKC;_|l$wtP= t=t
QHV$)xIIVpKtPPVG    w@   fD  vuw tT9tBpKt
PHV$)xIIVpKtPPVw$h   j W /w$_^][YVt$W>Av$	= tBpKt
PHV$)xIIVpKtPPVG8wLHG8tI uCu?GL~S^Gt
PH֋KGt
PPS^[_3^̋D$@Ud 3ĉD$`ESىD$VW}sKT$UFD$Gu#ExD$u
BȉF(D$N,K|$       $ؓB,ȉD$D$B(ZȉD$D$`D$ZD$XB$ȉD$D$B ZȉD$D$PD$ZD$HBȉD$D$BZȉD$D$@D$ZD$8BȉD$D$BZȉD$D$0D$ZD$(BȉD$D$BZȉD$D$ D$Z      $B,fnB(D$`fnD$XB$fnB D$PfnD$HBfnBD$@fnD$8BfnBD$0fnD$(BfnBD$ fnD$FuID$D$    PD$Pt$CVЃ|$ u
T$    W_^[L$`3 ]ËMD$FVAHF F0F@AF8F<CЋT$N<;
}
V@f/w	Wf/vL$l_^[3/ ]f]Β\USVWD$tcHB3҉D$L$X@t*D$~H0;L$u	L$;qtB;|  _^[]ËE3_^[]ËE_^[ 3]̀y tA(Ãy tA 3USVT$W(D$ ^~ |$9^|E]   D$Tu&L$[j PGtD$ ^3_^[]É|$VT$BFRȍȊL$D$H   B+؋D$ [ȍ<f/wf/D$   @:G   D$ T$~WRB~DD$fG fTK}0D@D$ |aDD    D@D@D$ D@ӋǉT$D$~|$:D$_^[]̃SV(WD$ڀ~ tN(	~ t4N DTt-	f/w#f.ȟDz8Yw_^[(DT~ tru_^[Ëϸ*+N BV@}T@kF@    F( ~@fGD$ ^8F_^[_F(^8F^ [̃SUVW   t$F+T@tD@    ~ tF8LTF _^][Ã~   F @LTNnN l$m    ~DfA}DDFDDD    3ҍZ;  f     {;   N [,f/wf/   D4[:Dt$   Rf/wf/  D:D  ~T~DfDZF OfT}+T@|D@       D@D@T@   N R,[f/wf/   D<R:D{ssR~T~DfDF fTj}(L@|ы$D@    D@D@L@Ӌl$U   ;_^][U0SUVW|$GL$,D$(A3<D$L$0  } {  G   +ȍq< 4u,tG H@O0G4VPQ3B  ]PzrBD$,|$H@ ;  |$(    D$8|$|$ D$$       \$3D$@ǋPF|/T$0L$ QL$<QUVX  \$ \$  }   |$LɉL$4u
fn	L$4ZɍJ   $T@f/  @f/  D$    D$,E@|$]|$E,}D$p  l$3ɋ>vϋU΅~!E fD  90u	9x  A;|2<  f/H   f/Ho   f.HD[         $p|$TʉT$4u
fn	D$4ZHf/
|$DȉD$4ufnf/pD$4Zf/a|$LɉL$4u@fnf/=L$4@Zf/)|$LɉL$4u
fn	D$4Zf/@uuL$$AL$$;L$(gu}l$;D$rhWf/D$8vD$8T$8͊T$VtWD$}|$Eu]E;ǋ|$r{G3_^][]ø  _^][]_   ^][]Ë | Û$$Vt$~ tv$F I^UQSVuWFt~(~ t~ 3V@   3+ȍT$9u.tF H@N0F4RPQ3؃u.T$t&HGȋ@TLEɉP_^[]USVuWFT$t^(~ t^ 3   +\$F@3ɍD$9u4tF HPD$N0V4PRQL$3T$ȋD$$ D$t	_^[]Å  }uZB   KȋD$@TLEɋ fptRQ3_^[]É   PfH3_^[]B;   BKȀz D$@LEɉL$0uoD$   ZfFtyD$Z	   fFD$L$%  =  uD$      fF3_^[]Ë   fNtRP~3_^[]É   fF3V_^[]À~ ^$uw; u&L$R@j SIj h   jd  D$PD$@ЋD$@LDQPj33)D$duFT$FB3+Gta@t
PHNxt4   ;})x%<53D$3ɃeD_^[]Ë   A@   rPG    t%   @  fGt.V$yW uu3]BF$@t
PPWu3_^[]U4SVW}3ωt$t$$\$C(EG.  M	A$t9Y<tww)t9qtwD$WfD$0\$4|$0|$MWfD$8D$@?u L$3DL$AM?tfuS	AtD$($$tQ	! tvwWD$(Ӌ L$(f.ȟD{3E@  SW|$jt$$wXwXOXdu5j QʉD$$T$ L$(RQP3ҋ{D$pXQD$@D$$D$<D$ u9t$k}W2ҋL$ЋD$G@3T$(JL$ JBPJBD$t3D$J@D$ fD  A;D$u;t L$ G;|$|D$(  L$$H   D$(|$$3L$$H{D$3Pj ju\EWD$0  4@tEUxP&j V4MAQT$UQ      t$\$  F  K<~u~ uCtu	֋9FNt+3ҹa   Kt;t	H;uFF    =   pKt
PHV$)xIIVpK  PP_^[]Vj P CMTL$(   Pj Qd 33t$D$ MT$4؉\$$F?u3ҋF?t$EpSDp0F  M  fCf#
  f;  {p  l    :utP:Quu3  [z  3PPV2jPj VX ~P3SW GT$$GFG FGFHGu
BG   G\$3BƉrt$KHBL$(HBKAH$D$D$   tFtAD$0CuC@   \$hCtBtC@   \$QC?   \$DMAt!$tQ	C trD$0C\$D$0D$ Ft$D$ ;uS(Ћ]nu   _^[]ÿ   @   @    3f@ D$C@PjV_^[]U< 3ĉD$8S]D$VW3j)WP|$   C   8@@D+u33D$3@ (   Kȅuy    99y   y    ~E@;~
D$y@ubA>wR$pAEB
CDFT$D/DT$+ȋCCDD$T$FD$;3;C   C      D$PhE_C      _^[L$83V ]3Ʌ~"fff     C    CD A;|CC      CDC0   C4    C8   FC   3C   T$+UB0R4 y Ys0{4L$D3_^C([3藬 ]f	M ̃Ay VWL$ucwG$G,\G(ZG$\G ZYG\GZYG\GZYG\GZY_^Ã   $(G,ʋG(+ʋыB D$G$ʋG +ʋы# YD$D$GʋG+ʋы YD$D$GʋG+ʋы YD$D$GʋG+ʋы YD$_^-ΫeQSUl$VrW]3+рz u:D  v]D.[FF_CFB;|_^][YË;.M.vNN;NN[B;|_^][YWSYVW3   t$ QHfuIFZZfnIfnFf/v+u
IZ	fnIɄu5ZZ5uNZZZfnNfnfnf/vu	Zfnu	Zfnf/w'\Y;%X(_^[(X_^[(ÃU    3ĉ$   EVWD$$D$T$8Pj j3҉|$ D$$    [3Ƀt$L$,h  t$G+E;8  F3W|$(WfD$D$@H@L$HD$<D$   D$D$D$L$D$PPW(D$X$   L$)$   (D$h)$   (D$x)$   t$@L$ $   D$<(L$ $   \D$0L$T$PD$0(D$0t"L$@f/wf.Dz*L$Hf/vL$PD$TD$@T$HL$D$L$D$G;|$<L$|$T$(RPQ֋D$F   O<~u~ uGt^u	֋FNt,3ҹa   Ot;t
H;uFF    = tEpKt
PHV$)xIIVpKtPPVD$L$,t$(AL$,L$$D$1_^$   3A ]ËL$$D$_Ƌ$   ^3! ]̃P 3ĉD$LS\$X3U*\$VW   @D$$d-  D$P  D$(Pt$ GD$3GD$    t$,K+\$(+\$@ |$   /wA/   \$T$(SWT$L$(D$,UJ3ɉB8OvD0RȉBAG;|E   E ՋD$$	3_^][L$L3 PË;uA;iD$ ;3\$멋L$\  _^][3蚤 PUQVuuujv\5uujv\%v\=$v\B^]UQVuuujvhuujvhvh$vh^]̃SUL$VW   33ЉD$+4    ΉL$L$$QL$$QL$ t$,L$ t$,Vt$,t$<	 T$@t$;|;}s;ut$    G0t$Ս    ;ut$C뽋T$$t$ T$f/vt$CT$$둋t$T$$G_^][̃SUl$ T$T$$L$VW  L$t$433ۉD$+4    ΉL$,L$4QL$RT$Pt$DT$<t$DL$,t$DUVt$4t$\ t$D,|$\$ ;|;  D$4t$,T$0D$x IFuKDIFTD$(ZZҍRFt$0LRt$,ZɍFt$0\ZMfnDIFfnTD$(ҍRFt$0fnLRt$,ɍFt$0fn\ۋt$;t/;tf/wf.Dzf/vD$GD$ T$D$ʋT$CD$ _^][U    3ĉ$   T$MWۋUT$TUVpT$TFUWT$H<   UD$L$T$DD$4    D$(    $   )  PV#ЃT$  L$Vj RAD$8} D$3Htet$3҉T$  L$T$3ɉ~
A;|t$,L$t$WRID$GT$0T$T$ H;|D$TD$@    *  |$GOȸVUUUL$L$ T$+ЉD$,T$<WD$$3D$hD$pWۉt$0;  	GD$W@D$D$LD$DL$$@D$D$PT$8     D$L   |$ $   @$   @ D$P$    $   @$   @ D$H$   ;~TD$ 8    $   @D$;L$P|$   D$FL$(H;|ċ|$T$8|$ WҋuW      ZZ\XyXӋWf      ZZ\Xyf    fn   fn   \X(y(ӋXWfn   fn   \XyXQ$   P$   $   D$`$   x$   $   a$   L$$XD$`;L$,t"T$hf/wf.Dz T$pf/vD$ht$0L$pt$0\$xAT$8L$$;L$<L$ T$<D$@t$   f/vD$4$   t$(@;D$TD$@D$,L$ T$4t$L$|$H @DGD G 3T$(T$D@DBD B 9|$~UD$4T$X4@;|$(L$LT$\VT$H;|$(L$LT$HVmL$Gt$ ;|$|= t\pKt
PHV$)xIIVpKt*PP3_^$   3軛 ]V3_^$   3蛛 ]Ë$      _^3肛 ]U    3ĉ$   ESډD$$VW\$CD$L    p@t$s<  Fk4j P]D$8  v   QD$0j Pϳ 39t$v(D$8D$(PVӋD$0F0D$(;t$|GPCj P至 L$8D$D$C    A@A @ {CD$4  x   w 蕹t
D$$    Cj Vt$$t.O Qj V F F   FG<F   Cw 9t3t$Cj V%t$t.O Qj V該 F F   FG<F   CGKC   ދWD$QL$$щt$(L$$t$HL$<t$ L$Dt$0L$t$T$/     D$ ыߋT$ u=   pKt
PH\$8S$)xIISpKt
PP_^[$   3輘 ]ËD$<G \$(D$t3҉T$Rj t$ЃT$t:G Pj R[ T$B B   BG<D$<B   t@CËډt$Hʉt$ t$0\$<\$D؉L$$t$t$wj s D$wj pذ T$D$   PD$TPt$SV  T$  9Cu9CuӋi  L$AI$   $   CKD$PD$D$4L$L$T8L$0u3x u-E@PD$D$TP    D$   D$P  WT$t$0L$D$VȉJ3ɉB8OvDXRȉBAG;|D$PF   P֋  E@P$   PD$  D$`  Pt$0JBȹpL$@  9uDD$Gƃ} LTʉL$T$|   ~QD$+T$ka+ȋttL$t9Vu9NtvuD$    ;t& ut#	D$T$L$@  "L$D$ppQRWT$,T$(L$D$,;u;HuD$L      D$t$0Ft$0PJB;D$48  x   S3t$4JB  9upDD$@ Gƃ} L\ɉL$~g~Q+ka+tttf9^u9NtvuD$;to ut!D$L$@L$D1D$ppQSWT$$u/\$t$4Ft$4SJB;=     D$HL$<|$L    D$,MDt$@@T$,D$t$~y~QD$,+T$,ka+ȋttt\$9Vu9^tvu\$ \$(L$$\$ \$;tc utCT$,D$ssPRWT$$uDT$3u5ӋD$     3  D$0L$D$\$ t$8_^[$   3 ]3ҋ&3ҋ$      _^[3踒 ]USVWD$D$    P؃uщE@L$Pt$  ؋T$   ؅   vvjwTwTwT   vvjwlwlwluWFNt,3ҹa   Ot;t
H;uFF    EFVGDFF3wD_^[]Ë_^[]̃| 3ĉD$tSUVW.l$   Fx@D$ Pj |$    D$;v?l$fD  L$PQPqD$XPT$,QG;|Ջl$D$F֋ND$ D$L$$Pud{|$FN3}OG{ v D(ȉGFC;|E   _^][L$t3} |3$   _^][3e |ÃSUVىT$W\$3NFu   >    PQjsd3sddu9Wsdl$ȋŅt9Hu9Pt uVRQ3ҋ}sduu9>   6d   [T$D$ RJzB+L$ I;QPW \$ SJBHȋJBC   9+teC|$p@OGȸVUUUϋ;}%t$$P_^][ý  _^][O_^][Ux 3ĉD$t3T$$WBV)D$<)D$LH@fD$\D$$@Wt$D$fnxfp )D$0趭  j PЃT$   3L$D$$D$,|$D$   f;L$(uE @G@ G T$WQ2L$D$$3Vtc8Nu.Gf@ZZXD@XD@A;|03OffnAfn	XD@XD@@;|׋L$0AL$;L$A|$V3Ʌtbr]L$0fYpfff     D@f^D@DPf^DPD`f^D`Dpf^Dp;|;}r+|Afnύz(XfD@f^D@DPf^DP;|;}*fnX    D@^D@A;|L$3   D$ WۃD$T$(38VvYȀ~ uA	ZZfnAfn	ɋD$\\D@BYXF;|D$L$G0D$;|t$,ыL$(t$F|$$Pj GP蛤 G   3FNȸVUUUD$ʋT$+H;   D$$L$4@t$ V褻UF;
   ;B   } t$PQjVT$Vt$ T$$u8v\t$(t$ jv\v\$v\۰ȃL$@vht$(t$ jvhvh$vh裰ȃL$L$t$G   D$ux ;|$}oD$$L$(Qu΋@D$(ЉD$4TȉD$u7uT$,t$0L$   t$T$(ΉD$mL$DȉL$Gt= t_pKt
PHt$ V$)xIIVpKt,PPD$_^L$t3訉 ]t$ D$_^L$t3膉 ]ËL$|   _^3p ]U} SVW~_E@D$~QL$+ka+ȋttt0D$L$ 9Fu9Nt	vuDtG>uV.tAE;CH~$u tPV׉CH_^[]PV׋0_^[]V׋|uz} GD$FPQju4s\$Wt$$js\s\-$s\2_^[]shWt$$jshsh$sh_^[]UT 3ĉD$PSVWD$D$    Pj j3ҋo  u3ut$jsXlsX脽KXdu*VQrL$QRP3ҋ"sXet$QY6     V3zBt,CJD$D  A;Eu;UtL$F;|T$˿  T  T$j VT$ˋ1    uujs`s`藼s`蜬y  9Cp  t$VJBȃS  BJT$RPQ։|$ȃL$uCˋT$HPD$D$3   @   K<xu9xuCtMuD$ЋT$BJt/3ҹa   T$;t	H;uBB    = tKpKt
PHt$$)xIIt$pKtPPRD$EuKSNQF   sDt$  t$    t$FH@3L$ D$;}hL$(QP'D$,PvT$8u,vT$(D$,PHT$,ˋt$DD$L$ @D$tt$FK<CD= tEpKt
PHV$)xIIVpKtPPVsDt$t$t$     F  K<~u9~uCtu֋跴FNt03ҹa   Kt;tD  H;uFF    =   pKt
PHV$)xIIVpK   PP      F   K<~u~ uCt=u	֋FNt+3ҹa   Kt;t	H;uFF    = tEpKt
PHV$)xIIVpKtPPVL$\_^[3D ]̃SUىT$VW3\$s$|$s hi4  KD$WPWh   j09=tEpKt
PHV$)xIIVpKtPPV|$  D$   73f;      Ft
PHOtu3/Q%  =  uyuYt3	&P؀~W t4    u)0  FW ǆ(      t36  f4  3ۋFt
PPt$Sv$h|3F;j j ЋrT$j j B`PVs$h2 C      7u>hPNjz4h-hZP hhěj_4   D_^][ËFt
PH    |	    v	׋:3ۀ   r	؃؋评~W ut	Ӌ   _D^][Ud 3ĉD$`UESVW}3ۉ|$4T$$D$,\$\$09_<t  _^[L$`3c ]G(WEfD$8w  O;NȉL$(8_V  3  ZKAt	$$tQ	 (t
B(WWWZZ\$f/v&f/v
YfZ\$\@At	0$tQ	H \$(tA\$(WWZZf/v#Wf/v
YfZ/TDw@;t$(T$$JQ?,  $  1Y9  V  3ۅ~BD$HA$tA1D$9t@T$$ty t0@T$WfD$t$D$t@ H$t@D$=t ?ȉT$'tx t?ȉT$WfD$L$LD;D$D$;\$(6S  tL?'ty tf?WfD$\$t$D$$t$t$8\$<Q?tG$tQ3t>#ty t>WfD$T$D$;u;tkSVjwXwXwXD$du:G@\_ ut$SVD$D$0   "3  t$D$0   \$<t$8D$$Q?   $tQRPD$it=RPxD$Ity t=RPVD$'WfD$T$D$RP3D$D$  }  D$(9D$0   w\_\P\$Ru@t
PP3   -u@t
PP3菰3蕠t$0ЋGT$H(@,L$8D$<F5  L$,G\D$1YD$(Pj T$@VD$  \$(D$8PGH~tCH }({u{ tD$8GH    j PӋ.pD$8j Py[D$8PD$uFt$<D$t$<{sj0pVt$(Wj6a6z$6耟|$8D$3   C   O<{u9suGt蟫uӋ@CKt+3ҹa   J;t	H;uCC    = tEpKt
PHS$)xIISpKtPPS\$uht$u\8_tWD$,_pp0jSH v$GL$$tFPSGF;|S5S<D$\$jL$l_^[3+x ]̋D$@3̋D$VpL@ tKx8 uES@L    ^W~Gt
PH֋Gt
PPSڜ_[3^̋D$Vt$WPN$V QRPQRPQRhȳ)(   S^LtV~ uP~8 uJFL    CUkD$Et
PHӋ`E]t
PPt$5j j j WvS= [tHpKt
PHW$)xIIWpKt
PP_^W_^_   ^SVt$W~L^F tP~8 uJFL    GUoD$Et
PH׋yE]t
PPt$N_^3^[VW|$3     $utЋ5tr_3^_   ^UD 3ĉD$@} ESىD$EVW\$(|$D${a  ݔuEPjt4tGx ʚ;F        F    FF    fF  H;t$t$hDVl)3{ vWhVT)CG;|t$|$WhV4)t$ WhжV$)st$4WhV)4V#uF_^[L$@3t ]j j j Vt$$= tEpKt
PHV$)xIIVpKtPPV  |$(@   3fnЍCPfnfp  fnfp fffD,|3D$d   RRRRRRhfs T$@W$t3D      s$s h\&ux   L$D$$j Pj h   j!u0|$$WBduj W2D$T$ Wa= tEpKt
PHV$)xIIVpKtPPVL$ |D$dwd   3ɉC03K4f   u{ tP<    <    t$t$P$؃|   L$j t<0j h   j = tHpKt
PHS$)xIISpKtPPS   \$(F({   t$|$Wh+$C@   uIPjt8D$t@x ʚ;F        F    FF    fF  H;t$WhV%3{ vGt'NA;Nrj|l`FND,GPWhVP%CG;|hV9%V u   _^[L$@3p ]ËL$Cpj Pj h   j= tEpKt
PHV$)xIIVpKtPPVL$L_^[3Kp ]UVW  j D$D$    Pj h   j@   t$Vۥd   t8@t
PHNxt3f;   r   A@   s,PA$t91t2 ty t	"2WfD$|$t.V$yW uu3%F$@t
PPE8VT_^]ø   _^]U< 3ĉD$8ET$US]D$ VuBL$T$ t$\$D$,    D$0D$4D$8иD$<Wa/  jjQ~OGu^+KCu+э    j P    Pj V;   F(   (6AN ǃ|$ F$FD$ WpQ葛 S\$$sv$~ FuIPj:t8D$t@x ʚ;G        G    GG    fG  H;KT$D$    p|sPhW!   9\$$~t D$ FL$,9+u AD$    T$QF%|Ph4.u:FT$D$    |t$,PD$ WI!C;\$$|hTW4!WD$9  xF(%  ^LF tZ~8 uTFL    CD$(CD$HtQHD$ӋD$@t
PPt$(萑vP腑vTzvXov\dv`YvdNvhCvl8vp-^@  =   pKt
PHS$)xIISpK  PP  ;\$$}hhE   (\$PS迥tS PhEL$ = tIpKt
PH\$S$)xIISpKtPP\$SNF<sG
v   
t&   t0hEL$    F } NtKPhD$    L$؍D$P0uHFL$k3N;}hFcv$Ph L$ ؍FPtt$覱PhE~  }v$  h\PL$ tX= tEpKt
PHS$)xIISpKtPPSD$ u\$ppt"SPhEL$ bD$(03_^[L$83)i ]SpK= tUt
PHV$)xIIVpKt(PP_^[L$83h ]V_^[L$83h ]ø   _^[L$83h ]3   Mt8hEL$L   _^[3Ph ]Ux   3ĉ$t  EWVuWh  D$0D$Tj P)D$<)D$L H$t5t L*#tx tf*WfD$ L$ L$d;  2  vD$D$iL$L$kΎ|$H   NQtyuQ(tA   t  <Ѓ  OGȋD$;  Qu;PjEt*F        F    F ʚ;F    fF  H;O3GT$   D$~D$     $H  |$ PRT$8L$Xƙ|$ ~&NA;Nrje
ND $L  $L  hXVm39|$v+fP  Z$h`VAG;|$|׋NA;Nrjd~|$ ND}D$HT$BT$H@;t~   Vt$0Ћhpjj躑WV萗$|  _^3^e ]UVW}Q?   tyuA*tq   t   :   73tNȋGȋE    fPtVQy,_^]É   pfH_^]Ëu   fHt	5&	   fHF   II_^]ËMhjjjA   	j._^]̃SVWD$ 3Pt$ t$\$ 9s(u9uC(   _^[ËD$j Pj h   jt$$C(tb= tOpKt
PHW$)xIIWpKtPP_^[W_^[Vt$~( uN~0d}HD$Pt$t)N,%Pɸ8IDPQhkF,uF(   F0^USVT$W39~(  9~uvvhVF9~(  ]Sujv]vud  ~t8@t
PHOxt3f;   r   A@   
PAtyuY)tQ   tt3	7؅t.W$yW uu3G$@t
PP~uhPD$}@t
PHGxt3f;   r   A@   HPP͈W$D$yW uu3.G$@tPP|$|$苀t3F(   0ÙRPru	F(   St$W腎 D$ ]vN(uȉF(uuSuhĹV{_^[]̃SUVD$D$W|uvvtV]|~(    l$$Ut$$jWW3eu.T۸LDL$ Pt$0t$0UQh`VWduRj WL$4D$;D$(u;t5Qt$,L$(UQLD$ TDD$ PRt$,UQhVy,W谅~( uF(_^][U<SVuW}T$$T$(WVD$0    D$   T$(}RWVhDS  }    @D$$(vqPhhS=   pKt
PHt$V$)xIIVpK  PP_^[]ËD$H@ȋC@L$D   ;~RQWVhS1  3t$  CT$@Ƌtt$t   L$ΉL$3ҋKt$(t$D$ T$  Et$ +t$4HL$D$ 4ЋD$4Ήt$,<3ω|$09Ct;D$,/D$0t!uut$Rh̺SnT$4L$}    D$IɉL$8 ȉD$<D$@39Ct;D$8/D$,u 9Ct	;|$<D$0/D$@t%}t$WuVRh ST$4L$L$}t$BT$L$;S|$$ Wut$ t$4~)3?t$(T$8t$<t$8R5C$   C Ft$;t$DC= tQpKt
PHt$V$)xIIVpKtPP_^[]Ët$V_^[]SVW~( udSvvhVtIWdu/j WҝL$;D$u;tRPQt$ShV~WF(_^[̃<S\$DWUD$    VWfD$ 3fD$(}U fD$0fD$8fD$@l$t$\$tWWWhsU覅D$<D$   D$<u=SVD$h$Pt   P5D$<3ɃED$<SVD$hP      +I+D$$}D$h@Pi   V苐d   @t
PHFxt   f;   s(   A@   P@?V$yW uu3F$@t
PP3D$ V-L$@EȉL$<L$<|$$|CuQjQ3ҍL$ <D$4L$RP`D$@L$RPht$(~t$,~t$0~|$ t1j j j hpUt$PT$TL$@DƉ
_^][<ËL$TD$@_^]D$0[<UQSVW}t-t(MtjjjA   	jk#_^[]Ë]D$    u3/Q%  =  uyuqt3	'u	ƾS8Ku3-Q%  =  uyuAt3w'}T$RP֋It$uj(jjE֋p
PWDt`= tMpKt
PHV$)xIIVpKtPP_^[]V_^[]Vt$j j j j j hj jj:$   PPPPPhPjj$   PPPPPhPjj$   Ft
PHWj j h(6̼~W u33ҋFt
PPuOFt
PHj jh(6Լ9~W u33ҋsNt
QP_^US]V3}W|X}OL$tQAu+ʁ?L$T$jD$y%whhM   _^[]Ét$jSehS:ua<utE3   0_^[]j juE   0_^[]    F    F    D$^FE0_^[]SUVt$3W9~>VD  zu%:    B t
t	u
A;|3ɅxF   FL	NxFANxFA؃NFF(uF8 uAx t0_^]3[_^]   [Ãu%F8 ux uxux uNF    _^]3[UQVsu>PhP  t*hL  Nj Q;m E@FE03^]ø   ^]W    pKS3V9_~pU3퐋Gt(tW= t>t
QHV$)xIIVpKtQPVpKC;_|]wtP= t=t
QHV$)xIIVpKtPPV^[G    G    _SVW^~tU= tBpKt
PHW$)xIIWpKtPPWW_FfF ^^[QSUٽ    VWsNh>   = t|pKt
PHW$fnI3fnxIfbfnfnfbfbff~xIfsWf~IpKtPPW    (Msw    tW9-tEpKt
PHV$)xIIVpKtPPV_^]C ǃ      [YVt$v\v= tGpKt
PHV$)xIIVpKtPP3^V3^UHSUVWU 3Ed   D$Dl$$L$8E<
t<t<t<  D$,       D$,      XdEG\$ _E$    ؉]AwW@$D$(GG+G+t$ tLf;T$(  D$LDȋD$LȍB;sX  хuL$8|$, ut3GȉE   y	 tAy
 u	,L$8AP(+P$T$(y	 T$tAu,E@4@ntE       _^][]j VЃUtߋMAIPj Rh 3D$H9En  T$3L$ |$L]A|;j  ;|$(`  |$, uȉCED$<  <1sPQx8AƄx% T$Pt$P3;L$TtT$|$uT$@;u$vu$L$Iʀ|$L$4u	D$$L$IыL$4D$@D$D$0+|$0
;D$@NȉL$44  ;   T$+3t$0O;L$     EkD$0++t$4sl       j PCT$   ɉ;   CT$<j RLD$@D$D    Q@ P   ЃuND$<@CɉL$<tF;|l$$T$L$ D$H|$L@D$H|$L;E3_^][]Ël$$C       _^][]Ël$$E M_3^][]̃SUVWP@ҋ@lE H@  D$D$    u@H  ދE@$ȋ  SHRQj PVw @  D  _^][Ë@(T$Rh( QЃH  ޅuL$D$D  L$@  CD$_F^][UT$SVuD$@W~ x$D$    u9   juy~uÙRPFthh   j Pd D$L$j Qt$@ P   Ћ؃u L$Wqvtx L$t_^[]F    _^   []U$SVW}O  ɋ@@\\$C D$$tX= tEpKt
PHV$)xIIVpKtPPVǇ              wǇ(      Ǉ,      Ǉ0      Ǉ4      Ǉ8      Ǉ<      ǇH      ǇL      Ǉ$      wd  t@@t
PHNxt   f;   s(   A@   PA$tT$1tty tWfD$(D$(D$t.V$yW uu3F$@t
PPD$$x   T$wV8D$D$G    	 u ht$G   Dt$Ǉ      Ǉ$       4   	 4t$uZǇ(      Ǉ,      Ǉ0      Ǉ4      Ǉ8      Ǉ<      ǇH      ǇL      Ǉ$      NV;   L$4RD$IL$ D;D   {	 tC{
 u${	 C@(D$tCu$$  0L$ DH9D}D$8  <  )D8  D$<  +D0  4  DD$@D	 F  ;DQt$FVD$t$~  uBV;	~    ;         FN(L$ ;FuV @FTL$ Q$  D$@0    	 u&pphL$A4   D@    w@ǉD$t8@t
PHNxt3f;   r   A@   PQ%  =  uyuAt3D$ t6V$yW uu3F$t$ HƅtQPƋT$ˉ    -  L$Aw`$T   A(  A0  4  A$;,  ~,  	 u$qhE[L$     D33҉D$AD$       %  yH@YWy+؉\$W\$0   fnT8   fn@fn8(fn8fbfnD8fbfnT8fbffnL8fn8pfbfbfbf;T$|}fA(fsffsff~d$D$    D$    ;   I+L$|\L$ R|$+ʋ\$AJT$(א<@0Tu\$T$T$(|$};T$ |L$T$L$&L$@ D$RT$ȋL$L$T$8  <  	 )_^[]Ë	   A   3_^[]wGh_^[]VGh_^[]Ë_t8@t
PHKxt3f;   r   A@   fPQ%  =  uyuAt3D$(t6S$yW uu3$C$\$(HÅtQPËL$   DL$Q  D$Ǉ   pph\3ɉ     Dȋ_^[]Ë7h-h; hhěj   _^[]Ð  ̋D$@US]3VWˉD$33t$stfU{T$   M	t"Q%  =  uyuA'tC3C    C_^[]ò   D$|$taD$@pNxxF\$fu D$   tuӹS tyË]|$syC    3C_^[]ËFCT$utIuL$;Q%  =  uyuAt
D$    D$T$Gt<At$tQ	n 	tf.(D{2C	D$x_uEPjt4tGx ʚ;F        F    FF    fF  H;D$Kɋ@@4h(VD$tPhĽVpD$thԽV[*  H;  NtF ~ vFu~= tBpKt
PHV$)xIIVpKtPPV   j CPD$ j h   jH= tBpKt
PHW$)xIIWpKtPPWuSǃ  4_^[]_^   []UQEV
  $UMjj  ji3^]ËUz	     Mjjji3^]ËEx	 t$  4       E fPtj Q3^]É   @    fH3^]ËUz	      Mj jj1i3^]ËE(     E8     E0     E,     Ex	    @     D  E fptRQM3^]É   PfH3^]ËEH  2Mj jjPER@rh3^]ËE@	M   	fqtRP3^]É   fAQ3^]fKl'5CQ̋D$L$  3A    Vt$WFt
PHj j h:c~W u33ҋFt
PP_^QV   $|L$	S  ^YËD$0tx= tIpKt
PHV$)xIIVpKt3PP^YV^YËL$	{  ^YËL$	u  ^YÐ__mSVW~^;vHHPQ;whSI  ^_^[UT$D$SUXVW8  $0"GC  W  G{  GGp  w3V  Y  G3P  GЋ9  G5  WGP  G  G3wD$9ku~   u
w     9uHA>uFHȍ$   j PK  t1E    E    虅  T$  ֋  w  D$Q  Q  3Ty  wn  G3wD$9kuЅtR8MuHA>uFHȍ$   j PK  tE    XGKo3D$91uXtku
o  j j,  t0   F    贄  T$+  Ջ"  o  D$P  P  3ox  o  wԋWȃ  GGn  O3wL$9ktP  L$P  oE  >uFDD$Ɖt$9)u`P  Ko  9(uK;u	FLASp+֋C    PRBPd L$ KP  o     9uVB9uAHЍ$   j PKZ  t/E    E    l    T$ڃ  of  O  L$O  3+w  oG  w	   j j    G)  w	   j j   ֋wQ  w   w3ҋt  G   Gt
x t@w3ҋs  G   O؃uGԁ8NEARtwQhSE  GD$t`w3ɅtP3҅~OoD  $*,0<	wBIH;|D$GGJUVhS9E  GG2
   GG#wWBs  GG    G    D$!T@_^ÊJT$
Y][]ËGOGOwWGPlv  Gww3VTv  G   u)4Ko46)!!6] {     !!!!"#"!VW3FFN;N}gT$RT$R@$T$RQvЋuDL$;Nu6t$v@ЋT$H9~}FVF뤋N;;~FF둋_^QSUVt$W3D$|  nN$EF~$F ;a  ;Y  L$(t;u	N8L$(^8;n   V0+t6yʍAD$Au+L$RQv<h(F<uxAV(t:ʍAD$    Au+L$RQv<h(fF<   DD$(;n   ~$ tKF;F }CV(u<t8ʍYAuR+Qv<h(F<uL$,^8x   L$,^8V0+uCt?yʍAD$ Au+L$RQv<h(F<uL$,xZV,u<t8ʍAD$Au+L$RQv<h(sF<uL$,xL$,uL$,F$   ;   V0+u;t7yʍAD$Au+L$RQv<h(F<   DL$,;n|=;n}8V,u1t-ʍYAuR+Qv<h(F<   D_^][Y_^]3[YUL}SVWt(M0jjjA   	jp_^[]Ë}A$t11tH ty t	eWfD$t$OWfD$fD$ fD$(fD$0fD$8fD$HfD$Pu3-Q%  =  uyuAt3_OD$@u3-Q%  =  uyuAt3#]D$DD$LPD$LPEVS@,Ѓ|$H *  uaEL$(WD$QS@ fD$,fD$4\$$t$(Ћu/L$Iu h0#D$Pt$TEt$TS@ЃT$LL$P+L$HuSt8yэr@ Bu+QRt$\h(t$Tu	xt$TMjjja[t$TtX= tEpKt
PHV$)xIIVpKtPPVtWu`_^[]USUVW~;~u7t@   ^Mu4    j P`tF~NF,F3_^][]_   ^][]UVW3Eucu9>~OED$xLVD  
< t<	t<
t<uy;L$t&<.t<:u1_^]3ҋ_^]̃0D$DSUډL$ VD$    D$LWD$$    D$    D$8D$,PA SD$     D$8    t$(|$$T$<39t$,      D$PD$(PD$PD$4VS@$ЋuaD$L9D$$uWD$;D$P|M;T$4F|;D$8s>L$H   L$  9 t$ED$D$,Hl$S@ЃD$D$0F;t$,iD$X\$\L$tYt$D+D$0D$T++řȋL$ ƙl$9T$|9D$ v+t$Tƙȋ|sWfD$8L$8_^][0U   3D$<    }VWD$D$$D$,t'MjjjA   	jH_^]ËE}W@ЋuWD$,fD$pfD$xf$   f$   f$   f$   f$   A$tAT$D$46tT$4ty tT$4
fD$0D$0D$Nu3-Q%  =  uyuAt3%Eȉ$   Nu3-Q%  =  uyuAt3%Eȉ$   Nu3-Q%  =  uyuAt3t%EȉL$LNA$tD$AD$49tT$4"ty tT$4WfD$0D$0D$L$3uWID$FЃD$@/It3D$xCD$@3D$x0RPD$uxD$DPF WЋD$D$3D$`    Wt$)D$P9t$(}  D$L$(D  x;W  $   D$P    PD$dD$\    PEVu@,Ћz  h(D$TP$   Et$lu@ЋM  D$ PEVu@0Ћ/  D$<;D$D  L$HQ$   QL$8QPEu@$Ѓ9$   Z  t$H;t$ y  @  t$@|$ PW`A U$   MPD$<Pt$Vt$VWt$8  D$8;D$$~D$$$   D$D$ t$D$,D$ L$X   ;D$   T$HI3~D$\fD  9F;|D$\9   t$@|$ j W@ UD$DMj Pt$D$h4t$Wt$8D$\d   ҋt$x   DL$8L$8u(;L$$~"D$ D$,D$<t$@T$L$$lt$D$<@D$<[#D$D$D$$D$$D$D$	t$  L$(D$Ft$;uuH$   P$   PEt$V@,Ћu"9D$,uD$,PEt$V@0Ѓu$    3  uJL$WEL$x$   QD$t@ Vf$   f$   t$|ЋuL$pD$L$H$   $   ~PuLt$LtD΍Q    AuV+Q$   h(TL$($      D$   $   x/fD  ;}uML$pOL$$   yދ$   u/h0#D$tP$   E$   u@Ѓ$   D$,H9$      $   $   +$   uF   yэzfD  Bu+QRVh(j$         WuW$      =    pKt
PHV$)xIIVpKtcPPRu|$Lt'ύQ Au+WQKg$   MjjjPTVpKt$tX= t@t
PHV$)xIIVpKtPPVpKt$\tZ= tGt
PHV$)xIIVpKtPP_^]V_^]̋D$ P 3U,SVWj Vt$G<|$Ѓ  GWVfD$,fD$4ЉD$X\$ JB  PS;؃\$  t$ j S; L$$CCȉCD$(PGVЋ   D$0PD$jt$@Ћ   T$4L$01Q T$,L$(D$ Q L$ ^K3;\$   h3D$$WPD$St$fD$0@4ЋumL$(|$ +ϋT$,t$$P Xp֋D$ P XpL$ ^(P Wf/rH|$GC_   = t_pKt
PHW$)xIIWpKt-PP!D$hpWt$@8Ѓ
WuE8_^[]þ   E     _^[]ËM_^[3]US]D$VW}WPD$$D$    3mu&D$p Pj V9 D$PG SЃ3  fD  ;|$   D$PD$PD$ PEWS@$Ѓ  L$9M~vEAtD$GX릨$tQ	N D$GX뇨tD$GXjD$WGXSD$GX7D$PEjS@0fnT$$҅   T$
~[YB+^RXhY(XY^YXL$ (D$ uWEY0   D$ fFtD$ 	   fFD$ L$$%  =  uD$  u    fF_^[]PuP_^[]USډL$MVWS;sOҸ@   Ewr;srw;rD$=u L$WVAts3_^[]ËD$_^[       ]QVWF	;FvPZubV|$L$wBrw   
F_^YÅw&r?  wJ   F_^YWQwF_^YS\$UVW;    D$ Pt$ u   _^][ËύQAut$+ʍit.F;FvP֋uFUWPJ nN= tKpKt
PHW$)xIIWpKtPP_^][W_^][Vt$> uD$Pt$u
   ^3^VW7tg= tTpKt
PHV$)xIIVpKt%PPWfG    _^VWfG    _^̃SUVt$ W|$ D$;   ^(L$@	L$ yL$T$  D$L$ D$wVtn((@\$ yT$  D$\$ L D$@L$ yT$ y D$L$ r-3ҁʉӉV3_^][_   F^][̃S\$UVWEU ;+  |$ ;  ˉD$d$L$;L$tqNFVw:rw$   2w"r?  w$B   QS*F3ɋD$щM Eϋ>+ʋЃ ~w^rw   FD$ E ]_^][Åw4r?  w*O   FD$ E ]_^][RQFD$ E ]_^][UQSVW; uT8}Et3PWśuE|t   _^[]Wj V72 _^[]_^3[]UQSًVWD$; uduyNFu+~L8t3   _^[]Å~ǙRP)tVt$WEF 7 _^[]_^3[]́    3ĉ$   $    D$    D$    D$    D$    D$    D$   D$    D$     D$$    D$(    D$,    D$0D$4D$8  D$<    D$@ D$DD$HD$LD$PD$TD$X D$\   D$` D$dD$hD$lD$pD$tD$x D$|    x < u3$   3q Ą   Ë$      3W Ą   USVWT$M3D$>  ]pSx%]fff         33y]L$    33%  8D$tf9OuZ9_uUˋurf;ustH:u't=B:Fut0B:Fut#B:FtL$u{35t"E    3_^[]VW艘ut   3D$u_^[]Wj V. T$FSuP^VoC L$$FD$1_^[]U!  pKSVW3fff     t    @ = vttt
PHW$fnI3fnxIfbfnfnfbfbff~xIfsWf~IpKtPPWpKgC   J= _^[t@t
PHU$)xIIUpKtPP]U]SًӊكQ   C$CVW   RJtx:xuFGJy3ҍC3Ʌ_^E[_x^xC+3Ʌ[EÀ{'SuMJBa|f~A|F~A<	v'u)+u B[ÍCtV'u@8uJH@u3[À+t-uS
A<	wB.uB,0<	w,0<	wB3;DЋ[f'CBBFC SV3W]      >[D8^tCU2:u8L2u)      ׈3k݀<2 u. ]_^[]_3 B^[_3^[UL 3ĉD$HEL$$MST$ VuD$ 3WL$zD$D$ Bu+׋y  L$~0OL$t&D$x:xD$u@CD$O   xx+  D$D$~6fD  OL$t&D$x:xD$u@CD$O0   xx+  D$D$~0OL$t&D$x:xD$u@CD$OV   xx+:  D$D$T~0OL$t&D$x:xD$u@CD$On   xx+R  L$L$~)Ot#	x:xuL$CAL$O  xD$ x+  L$L$M~, Ot#	x:xL$uACL$Oxxx+  D$4YD$8   D$<D$@    D$DQD$H   D$L    D$P    Au+D$    L$\$YD$         uJt]ޅ~!Otx:xuBCOx\$xx+u|$ }1\$ \8\$L$AL$    T4D$ tL$l   L$(Y0thĿL$(_^[L$H3 ]Ê0t1u~ th  31L$(A,3_^[L$H3^ ]ËD$(x( thdx  OGu+_w-t 3۸   L$(Y(_^[L$H3 ]Å~܋ÙRPE؃tWVSd; ; 3뽋\$({  th,%  > t6VsD$(C    hLPC$D$ _^[L$H3 ]C    3_^[L$H3l ]ËލKfCu+3CǋPQL$(L$(D$ WS|$(D$,؅  :  T$(z8 t hXL$(D$     WfD$   D$D$ D$D$    u	OG t'utJBu3;EtI+PWS9 D$L$<[t<'t<"t<`u0C+؀> u
@ F> tD$D$T$  R|$hdL$(D$   'L$$|$QL$,QL$8Pgs D$ D$= tHpKt
PHW$)xIIWpKt%PPWD$ D$pKt$,tJ= tWt
PHV$)xIIVpKt
PPD$_^[L$H3
 ]Vދ\$(   { uS+*t   3ۉD$,j j|؃u   D$j|j S# 3L$(Y   3ɀ> ufD  F> tu>,uFF< uFF< t
G<0|j<9fStMD  <9w  }FIH<0}A=  wCC3zh]3jhL"hx=L$QRh(L$$   L$T_^[3	 ]UQSVډL$WNFu+(t%EL$     E        3_^[]3΃PQ蔋E     E     uL$3   _^[]ÍFPSW6 <"tG<'tC<[t?<`t;MtJB@u3;Et,+0 E8_^[]ËE    u܃= tOpKt
PHW$)xIIWpKtPP_^[]W_^[]U4SVWL$(D$    a'tE        _^[]j jl?E8u
G_^[]jlj W  ]L$7GHj PGt3]t$G3KL$$uYٍKfCu+&u2C~+RP诉D$ tSt$(P4 D$, 3   t$]G3KL$$D$u`ٍKD  Cu+R&u2C~+RP?D$tSt$(PY4 D$  3D$   t$]GG,   G0    u>u   D$F ut$hlظM   t$   D$7  fD  ;Ez  L$ QL$D$03D$    QЉ\$L$\$,\$(ute8 u@8 ttV8=u@D$$   9\$ t3>t:8 u@8 tt+8t'L$0QL$QL$\$t38Et$u'   t$,hM   t$\$(  =   pKt
PHS$)xIISpK   PP   |$$ t6uL$,۸%EË\$P۸%EPFt$b\$3t( t,{uSh-D$t7(uOGt$h4ԶM   OGt$G3SpK\$tS= t@t
PHS$)xIISpKtPPSD$]@D$    9w8_8   D$(@(u-5    ph    G<        b  Sj Hj pL$<ЋD$,G<uˁ8.ut$ BGD	3t$GD$ u@  u, t- PwD$whPet$$G$   G(u7"tj3   G(   PhTD$<D$$    PD$(D$@    PD$H    D$L     te39w~^ u7G\1j jt,{0{H@ sdPQD$<PD$(PF;w|t$D$4G4t   E     _^[]V-  N8tF<Q@ЃW~tV= tCpKt
PHW$)xIIWpKtQPWpK~tW= t>t
QHW$)xIIWpKtQPWpK39~~iSFtW= t>t
QHS$)xIISpKtQPSpKG;~|[tW= t>t
QHW$)xIIWpKtQPWpK~tW= t>t
QHW$)xIIWpKtQPWpK~`tW= t>t
QHW$)xIIWpKtQPWpK~dtW= t>t
QHW$)xIIWpKtQPWpK~$tW= t>t
QHW$)xIIWpKtQPWpK~(tW= t>t
QHW$)xIIWpKtQPWpK~4tW= t>t
QHW$)xIIWpKtQPWpK= _t@t
QHV$)xIIVpKtPP^V^̃SU3D$V(D$ l$W(   u@ NF ttJBu3;E  ߍL$+ލCRPD$tSVS* \$t$   < uGG< t<(   EGt$   t? uD  G? t?)   υt9 ufD  A9 t%   > ufD  F> t   <)t<,   N+L$FRPtVWU) t$th   = tmpKt
PHS$)xIISpKt;PP_^][þ   똋D$D$$(_^][S_^][_^]   [USV3W  蚻   uN?u3ҋXN?_  $t2t谽!t9^t̽WfD$L$A=    OL_^[]ú   uN?u3ҋlWN?  $t2t!t9^t'WfD$L$u  O\_^[]úV   uN?u3ҋVN?  $t2tl!t9^t舼WfD$L$@     DȋÉOP_^[]ú 諹   uN?u3ҋ"VN?p  $t2t!t9^tݻWfD$L$A'  OX_^[]ú   uN?u3ҋUN?  $t2t!t9^t:WfD$L$     ÉOT_^[]ø    MȋÉOT_^[]ú ED  Mt-Q%  =  uyuAt3L$QT$9؃   w`tW9tEpKt
PHV$)xIIVpKtPPVpKwdtk= tXt
PHV$)xIIVpKt+PPD$G`D$Gd_^[]VD$G`D$Gd_^[]Ãu3ۋE    _^[]U  SUVWT$,3|$$D$3ۍD$ \$w\$$wGL  hPGP   GX   GT   G\      D$SPSh   j芤9tLpKt
PHV$)xIIVpKt
PP\$V\$|$ m  D  32  9+uhPNjE3  D$@t
PH(  El$2  C L$ 3   j QD$0   SPj胣   l$ |$0:   :   :   t$0MCECKME   K         ͋                                 HE$       rwPSj|$( |ƃ   '   l$u2l$$  u3/Q%  =  uyuqt3	S|t#y}W uWu3<΍QAu+j APD$ |D$(tt$VP0! D$4׉C|ms$   C|    s$l$Et
PPd  @t
PHKxt3f;   r   A@   PQ%  =  uyuyt3	S$yW uu3C$@t
PP@t
PHsxt   f;   s(   A@   MPF    t%   @  fFS$yW uu3'C$@t
PPtx81uhF$tFL$D$3tvD$T$t~ t舴D$T$WfD$D$D$L$$D$PVD$     hNj踥h-hS hhěj蚥u3   ;u5hPNjzh-hZP hhěj_G_^][]ËGt
PH    |	    v	ӋC3퀻   r	W uuwH#Ջ}"u?D$t+\$$9shtjPh@Kh   _^][]ËD$$L$,HH_^][]Ë_^][]Vt$~ uD$Pt$סFF   ^SUVWu D   t	t

tuF\$3C   }N  li$8i   
   0ǉM _^][ø      0ǉM _^][ø      0ǉM _^][ø      0ǉM _^][ø      0ǉM _^][ø      0ǉM _^][ø      0ǉM _^][ø      0ǉM _^][ø      0ǉM _^][ø      0ǉM _^][ø   30ǉM _^][ÿ	   F"u	H@"ut@+ƉC0ǉM _^][hRJ3_^][uVhR+3_^][ÊNV	   tJBu+։SuOR  f9u@0   M _^][Ãu)<NuF<OuF<Tu3uxu+<AuF<NuF<Du3Ƀu   0_^M ][ hh g7ggggg|ggNgeg`h 	
U4EW$ESVfD$$     EW\$fD$0     D$8    T$<f  Ph  oN  NF	      \$$D$PT$L$(H؋|$D$(F@ <"w% 8pt<Sr+ЃST u
;  s'Wt$Q<Ow=y>;  v茱aH_<"ȋD$FщGD$G>~<Qu~/L$D$QPhWL$,D$0;D$,~P\|$, u~;vAAQP/;w= tEpKt
PHV$)xIIVpKtPPV|$u;w}Q|$8 tJ|$, u}/
u2Pj#mt#WL$$f     pT$8P6  D$,   |$, u3	tE     j jlE0uvD$,   L$8>  t$4   =    pKt
PHV$)xIIVpK   PP   D$8u+9D$,ul6	t3j j(%lu4D$,   F    ~D$4FD$0FF    3t$4@W @f@ F@   F    VMD$(D$,_^[]_^   []US]VWT$L$sfD  Cu+މ\$^   PQ@k؃  D$33D$?   3ҁ[T$%   ET$T$_   D$*   ET$T$ƙ;D$utU:D$t:D$t:D$uvU+ǃ|)"A;}A<"u"AG;|f" D$8u3|^uFƙ!|;D$s}<>]tFƙ|;D$r~FƙY
;D$M~8t$3ҋF0t   ;uFE vhuSPE3     = tOpKt
PHS$)xIISpKt
PP_^[]S_^[]_^   []UQSVW   39~~^ fG[;~|Nh'  = tMpKt
PHV$)xIIVpKtPP_^[]V_^[]VW   NL~tU= tBpKt
PHW$)xIIWpKtPPWpK= tAt
PHV$)xIIVpKtPP_^V_^U4W)D$fD$$D$,    D$SVW8  HNP^L$T$   u      9
uJA;uCH3$   D$9|$(u<wuj t$hg   |$ vD$(      T$3[%  D$ߋL$X|$( F       X<       IǙRPjtw\$KQNWQ 3Ƀ9N~FA;N|D$C{Bt$j W4    G    0  T$41  Ӌ+1  ;D$(   ~tU= tBpKt
PHW$)xIIWpKtPPWpK= tIt
PHV$)xIIVpKt,PPD$,_^[]VD$,_^[]É1D$(_^[]U    3ĉ$   ESVWD$0Et$@T$,   D$4t$D$     \$  M3UD$fw~ L  9D  9N;  ~ 1  9\$    H  [j Pd؃-  D$Pt$S D$$L$LD$D$;tbt^= tKpKt
PHt$$)xIIt$pKtPPPD$\$\$VNt$D0    D0    D0    D0    0T0PD$PD$tD0D$ MUD$t$|$ u"L$03ۋL$4F     v  T$,B    D$(    ˉD$|$  WfD$8|$L$$  T$ T$D  > uY9F~u(9Ou#VFNWPt> T$uO|$;|;s؉|$|$L$$D$T$uutx|$(    t$,D$    F;FvP֍L$ t
T$T$(WST$@=D$(    t$ϋÉL$$D$|$\$(u0T$,L$0L$4BL$03ۋL$4B\$(t$D$@;t]tY= tFpKt
PHV$)xIIVpKtQPV$   _^[3N ]U    3ĉ$   EWSVWD$@3L$ D$0L$X|$GwfD$PL$(D$G    ~>0uvj PaȃL$(u   _^[$   3 ]ËG@Pj Q t$4G3ۉt$,       D$    D$$    D$    taD$D$D    PD$D$L    PD$(OT$LD$T    ppȃL$0   L$T$;L$DuD$$   HPF    FF        F    VPNVtF~ D$$FuzD$C@; t$,  t$tS=    pKt
PHV$)xIIVpKt
PP|$3L$@9G3ۉpK9_W  |$(L$f 6  7,  =   t
PHV$)xIIVpK  PP  V]t$,     N\$L$ 3   T$ |$$   ǙT$8ӉD$<\$8FًT$4;u;trD$     ;P|;s@~VFNVP.t~? F;|ыT$4;rǋ|$$;|;vً+\$<\$L$8L$\$L$D$G|$$@;IT$ t$,"|$ tu[|$D$     G;Gv&PWL$$迼tL$ L$0"t$T$TSOED$0    |$G3ۅ~?t$(@ VFNPV tF~ D$C@;|̋t$,SVpKL$C;Y\$(L$X;tWtS= t@t
PHS$)xIISpKtPPS$   D$0_^[3< ]́    3ĉ$   SUVW|$0l$3ED$E\$,|$t$~!@L$j P=t$|$h   D$4j P t	33l  39]   D$W,UM G    G    G        G    wwwVOWGrt    G   @OWOOWVGFt    G   @E    Co0l$;]X    t$~N|$$L$ED$   D$(      E؉D$     Nߋ@+؋D$ +؋F;|;r;D$   ;   D$    ;`|;sZV~OWNNRFdt    G   @NFu=   @_  V;|V;r|$$;D$|;vȉ|$$L$L$l$0T$(\$ BT$(E\$ ;|$ t$3ۅ~\ ~NnL$Gt	;.u;Nt-;GvP׍L$$ڸuL$QU֋tD$C0@;|L$3t$3ҋi~'y1;|;sދt$t$B0;|ٍ4vt$F~OWVFFNPt    G   @~ l$~   @l$3ۋE(9XD$,     D$0;tX= tEpKt
PHU$)xIIUpKtPPUË$   _^][30    ̃,L$SD$$3U@VWD$,T$$9P_  HL$(f	L$8AZ  D$       AD$3؉t$5  Kktbyhy  w(tHG(    ~FD$4Gt
PH֋ZGt
PPt$4|t$E     {ǍPfD  @uL$,+U3qL$8L$ IɃRPD$(׋%  uqE [x    Dt$&tWL$ T$8AD$L$ D$;JT$$D$,BL$(T$$L$(;PD$0@    3_^][,ËD$0_^]@   3[,Ãy Vu(D$L$;|6T$t$;;r(;|1;w-3^ËT$t$D$L$;|;v^;|;sӸ   ^SW3C   C    9{~Vs  Gv;{|^_[SV	t)t$39s~<W{ D  F;s|_^[Ës39V~NIB@    ;V|^[VT$Wz t_^Ã~ t   _^Ã BNRvu;|;r;|";v   _^;|;w;|;r_3^̃DSYUVD$pWL$Dt$,F\$x  tkW3fD$8T$<l$8T$t[Hy u9qt;t$|;s   3ɋ\$;t   ։T$T$@ut$,@P(T$l$3ɿ   |$ L$09N  FD$4 D$8D$(    x o  D$$x   W3fD$Hȋ\$L|$HAx u+pt;|;s   39D$t	޽   Iuŋl$;uT$;   t$$3\$D$     tENy u.|$ Au;|;w;|;sSU  vt  L$$WfD$H3T$Ll$HT$Ax u7pt;t$|;s   39D$t   ։T$T$Iul$5  |$ \$8L$(D$$AL$(;K\$D$$L$0t$,D$4A\$L$0D$4;N\5|$D$Dwo3W@t$ l$$9h0   vVnt+Jy u;GuA;Gu9i~F   Ru9nd  pF;u;3~ )3|$ u;!|9;wЉl$T$; |;sRUE  u78Fu2FЉl$T$3L$A    A   _^][DËL$A   _^][D3ۍn;^   U z   z     ~    z    BrxHL$DF    t/;~vW֍L$(uL$DFWQP ~t$ |$C|$$ kl$$l$$;^utM֍L$$l$$u:u6   G_^][DÍD$4D$4    P[D$$|$4 t3G_^][DUS]VW}D$    GpG    t$~ L  WD$   fD$ ΋D$$3ۋt$$D$D$ D$Ax u9xt!;|;T$s   3u9Ft$tT$   |$Iu]t$~U    G;L$u;D$t)} tv;u;tn;|;v   3M;AuS} tRS   Oj j j t  GP$@$    T$u>F3L$8PDωL$3ɉL$L$T$vHu
]3}\]   }O} vtuuF   Nj j j /t  FP$@$    u	8Vu3   Gu׋_^[]_^[]U} VuWF@xtuu   Oj j j s  GH$@$    uD8Ou?FPJABE@x0 uABIN3ɉF9J3N_^]F   _F    ^]̃SUjT$D$VWz ~FZ$M3~ u* u"vvwwu~ uD$uT$GOBJGBG_^]B[US]VW3CD$CD$9{~ks x uWPH;T$u;L$t,} t?]{ ]u;M.|;Us';M| ;UvuuuPu@ЃuG;{|M3_^[]_^C    []ÃSUVWl$$u}T$t$ EE    D$    D$      ] \$	D  T$z KCu;|8$;r2;|.;v(;"|;w;|;sCVWjSRЃun{ uwKC;u;tD$     t${ ϋtE   \$D$CE;؉\$\$`|$  t$uLT$T$E    _^][ËE3E   E    ~u 4EvB;|t$T$} tm;jthM 	t;t63ۅ~Ut$$ M 4Cm;^|l$$3t$}u_^][Ë]39S~KfD  IB@    ;S|}3_u^][UQVuuuuF Pu@ЃuM^]F    ^]QSUVr Wz$3T$~ uRW֋~#vGvjWSЃ֋ˋWu uFj j j VSЋtT$FBFBFNBJ~ tM	t't"39w~:_ F[;w|_^][YËw39V~NIB@    ;V|_^][YUQVuuuuF Pu@ЃuMtF    ^]̃SUVW3ۋ__   	   9_uG      w\$\$~@G D$fu30͋L$؋D$AFwD$D$L$D$;|ɋO W L$AIGOt>tD$@Gd|$ ~]3G   G    ~I
)@R;G|7;t$u13G   G    ~@ 
@R;G|؅   39w   Hw$đ׋_^][ËGPJABE9p0uABIG3O9B3G_^][Ë׋_^][Ë׋_^][Ë׋_^][_^][f}>+̋D$VWw։Gu:9Fu5T$L$9Gu9N#|9Vs9N|9VvFQRjVWЃ~ tD  uPPPFVWЃ~ u_^̃SUى\$VW;  { D$      kl$futX= tEpKt
PHV$)xIIVpKtPPVM tTyg  w(tEG(    ~^Gt
PH֋HGt
PPS\$u   N^tWiIg  }(tHE(    oGD$ Et
PH׋HEt
PPt$ ]N¦= tEpKt
PHV$)xIIVpKtPPV5l$\$D$@l$D$;CO{ ~K1= tNpKt
PHS$)xIISpKtPP_^][S_^][UQSV3W9s   Mu	_^[]ÅugNt3   j j0:Dt}j0j V M~   y |u~'NKFTF_^[]Ëw%  yHuBu0   j PmGuC     M_^[]Ëm u-KCUTKNFTF_^[]ËFU_TF^[]UEMSVW83@t$>     ;ND$   _~vEtpX\$   PSB؃   t$VSe CCt$uP G@ǉCG@ǋEp_^[]Ë%  yHuM3muË   j PFtdu0ppppppp MXOWt$UAGL$D脦DEt$p_^[]ËE   p_^[]SVW   39~~^G[;~|~tX= tEpKt
PHW$)xIIWpKtPPWpK= tEt
PHV$)xIIVpKtPP_^[V_^[UWSfD$D$D$EVL$pL$WyN@ Fu+~      ǙRPu@tzVt$W 37 9UU   T$<[t<'t<"t<`uΪT$ύqD  Auh+΋t$QWRF<L$(Qv8@Ѓ3     = tEpKt
PHW$)xIIWpKtPPW/  t$#  9t$u?s%  yHu'{Vu^    j PBtFCCT$   9S   t;C   3ҋCKT$TD$_^[]ËL$C   3_^[]j j$>Ѓu C   CKT$TD$_^[]WBB     CKT$TD$_^[]ËBtMLT$CKTD$_^[]ËL$sj_^3[]U,D$ SV@3W3t$|$0t$4D$t3۾   \$t$\$tj j=؃\$u   \$t$OW\$fCt   3t$#j j=u   t$ˉ0L$\$C   ut   3t$*j j([=u   t$W @f@ C   *t   3ɉt$&j j=ȃu   t$	WyCHL$uV@XtJL$V   PD$,Ѡtt$$SV \$L$C@pt$L$\$9y   3D$   Q+ىT$ \$(f;A  D$$    څtM   Sp@uj j +PRt$4D$DP[D$$   u|$0T$ D$uL$(ʈD9BD9D$L$@D$T$ gL$E     _^[]Ë|$0T$ 3ut	L$w6j j$z;u	L$pL$WGG     \$uzT$,BCCC   8C@xC@@   Cyu09q u+y u%CL$    C@E_^[]ËCL$_ 	   C@E^[]QSUVhWj    P袞t(33Ʌ~ {;}
9uBLA;|tc= tNpKt
PHS$)xIISpKtPP_^][YS_^][YUSVUWD$3t$rȉD$@؃D$\$98  L$	L$<[t<'t<"t<`u(L$Q3T$~2Y|$uwT$tF;|ۋ\$3;uShht$   |$t3tD$3    Z   j P<uD$    43Ʌ~9tt(A;|;~fD  DJ;Ct\$= tEpKt
PHS$)xIISpKtPPSpKult$td= tQt
PHV$)xIIVpKt$PP_^[]ápKV_^[]̃SUڃ} UVW\$?  	t8t339s(  { t$,t$,F;s|_^][Ëkl$ }|$   333ɉl$9~\T$(w\$(t$;}>>*+u(|$A/l$E|$l$@|$;|l$~Al$\$D$ /@8 ur    C    _^][ËL$,9 tD$(E    _^][Ë|$(t2j    S詚tSWV u_^][3u_^][QVt$t$x0uhQD$PVft$t\= tIpKt
PHV$)xIIVpKtPP^YV^Y̋tdtRt   ËAxu)@xu x  ux u      ú   ø   `ø   ЋVW   9uFPF PGPA FG= tFpKt
PHV$)xIIVpKt$PP_^V_^ËGt G_^USUVWD$@]ˋx|$(   RPmt$$X     ~|M   D$    t$3;     Pj$4  WGG     u%  yHu4ED$    L$     j PX7tuuEE3ۋL$<ED$G   @DD$ 9]uhNFu+^[uE~AÙRPI3؃t0Vt$$Se 3 #   ?t$|$   3E   _39u]u!uj j02u4   3Vj j 	      t$$|$uj0j VC F~H \uNM]F|F뤃{ uME|MN]F|Fu|$   D$t$D$|$t$$; t3_^][]ËL$&_^][]UQS]VWD$3P92u33Ƀ	uLu	3_^[]9Ht}Cx~tL$uMM_^[]ËEu
E_^[]ËutuO!tu   98uHA9>uFHȍ$   j P+tΉ>^F	   S3~(K0x uF        SG;|܋|$ˋx0 BuAH;+x !УEPhWͽ= tMpKt
PHV$)xIIVpKtPP3V3UU_^[]UUS   9]VN]E2Wt$\$ uBR 3ɉL$9N%  |$3t$@ BƉD$$x    D$@D$x   @ wƍP@u+;t}O8tKUr;
ust6:
u't+N:JutN:JutF:Bt	uSt$]D$    F{[;FvPVL$ t
D$u>T$$NSWu\$ U|$D$D$@D$;G}t$3_^[]Sًt*	t%V39s~W{ D  F;s|_^[ËC[@@    QT$SUVL$WHNVF       $FH39A_^][Y39^   ~ fD  RQM tL$CT$;^|޸   _^][YË   	   39V   @ B;V|3_^][Y339^~+n RQM "L$ mT$$   EC;^|؋_^][YR~ Qt"t$N$t$u   _^][YËt(	t#39V~)@ YB;V|3_^][YËF@@    _^]3[Y jV$ QSUW3ۉ|$Wo   pKVM 4tgfD  = >t=t
PHV$)xIIVpKtPPVpKu|$WC;|^    Pj u  G    _][ỸSUVWW  D$ߋwE؃9Gu!    F     F   +IHD$   = @  s   =    s   
=   BQP*Pa D$ ȋGÉD$w2rw0w r?  wT$JRQouN+G|$ uG    fG  w_^][3_^][U,3T$9USVL$D$(    WD$(   x$}f     :    33yL$U    Y3T$433Q|$T$    4   E8F(uqE9FufUN)rf;us  :u7  A:Bu&  A:Bu  A:B  E6u|$L$UjT$   sD$   A;0  ۉ\$$VJ  P4    V@)|$0+  Vj Wƿ t$3D$9F   t$L$t$ @ tfC(P@u+¿   x'p(         3эv3yt$ 3t$$|$0uD$L$@D$t$ ;A|\$$t$D$   =    pKt
PHt$$)xIIt$pK   PP   N+F}h	  ËΙRP+  L$_\$    SЋ
;t
ы;u:U}F؉D$,^  F\$؋U}D$,F  P^   \$u{x]    33уy\$    3D$433s\$(  Pt$'  D$WuuFfF FEF(F)P EFD) *FCC4CV}֋Ew<rw$   6w&r=?  wȋ   ɀ
MJWPpFUFV ~$F;t@FfFN F$;u;   ڋ+ًL$j HN΅w8rw   /w!r?  w   Y
WS]pFM\$N MFN$F;D$(   t@FF    fF|$f  uFD$,NK3_^[]F;tr   FFN΋؅w6rw   -wr?  w   Y
RSoF\$f~F    |$( }|$   ǋ~+Fȅx   rw/T$   FFD$,VK3_^[]f~벅w>r?  w4T$O   FFD$,VK3_^[]RQnFT$FD$,VK3_^[]FKFD$,3_^[]_^   []̃SUVWD$    |$t$ʉL$u
ti3u73ފF(n(3:B(u͍F(j(+fAIC:)tL$n(+:D(vyR    뙋L$7yv    녋D$_^][USVWt$|$G    ,  Ph   #؃\$  h   j S蛹 3҃T$9W   MfD  G<|$   t]G@;   ƍW(rf
;ust-
:u`t"J:HuStJ:HuFtJ:Hu9G    3υt%|$aF    ȋu|$\$t$M?|$QT$|$BT$;W)33D  F |t$F    = tRpKt
PHS$)xIISpKt PP~3_^[]S~3_^[]_^   []SZVWy;M~\	r ;ust4:u't)A:ButA:ButA:Bt3u+_^[USVW3L$9y$X  A(Y(U3D$t{Ru3Pv~D$tY;HL$HL$QtRHD$L$G#D$@t
PPt$3DUL$9;u#uSVRuhqp0u uD$  @@p$_^[]Åt  3t	9~t63t$ѼK  F j P3  Gw3t$u(h-h| hhějTQ   @  ^Ct
PHL$FD$   ;   up   F@x	 t@x
 uzL$FVw8 uj VQVQD$ΉL$@@x	 t@u	y΋D$u/   rRD$'D$@    D$C@%p$K@u9$  uCD   s@֋X{W ut֋(Ct
PP   = t[pKt
PHW$)xIIWpKtyPPD$3@@p$_^[]WD$3@@p$_^[]ËL$ D H@ȋD$O@@p$_^[]þ   3D$@@p$_^[]QVWt$t$nt{F|9F_^YG$  = tLpKt
PHV$)xIIVpKtPP3_^YV3_^YUSVT$W~$ n  ~, ^,   pphLL~$ u,tj Sj 	h   j?HF$F$   \tX= tEpKt
PHW$)xIIWpKtPPW~$    uuj3I;   uR9D$t9OdPPE(RT$ PcD$tЉA@ VT$&@t
PP33F$3   ]u@t
PP_^[]SVW~$    ~0 ^0   pphK~$ u,tj Sj 	h   jFF$F$   \tX= tEpKt
PHW$)xIIWpKtPPW~$ u9t$t$j3t$,t$,j33$3ƽF$_^[W   ?    pKS39_~lUVo u tU= t=t
PHV$)xIIVpKtPPVpKC;_|^]= [t@t
PHW$)xIIWpKtPP_W_USUVW9 } l$$L$   ?   GHj @4(   V|؃\$   VWS W3Ʌ~C fD       @WA;|D$    ~|G D$ kE 3@D$90u(auj SUuXt
D$    utTS\$$3VZ L$(A\$,L$;O|\$l$$   ] _^][]Sj V苮 u묡pK39_~ol$ u tX= t@t
PHV$)xIIVpKtPPVpKC;_|= tQt
PH\$S$)xIISpK$PP_^][]t$_^][]U<SV3ۉT$8W\$M|$ \$$\$(t GGGЉOT$$yw T$(p>jw L$$    D$(D$=    AD$D@<(   |$0Kt3j W;D$ u#|$9\$0v   \$ǉD$@  t$0j W蟬 |$@L$ WD$$GD$(   GEw 3L$0  G D$fff     \$,;L$$  D$(    ;t$<  \$ ЉD$8[v T$(Mv |$(D$8;8  3D$4D$,؉\$uD<t3\$4j S(D$8   ȃ|$4 T$,ډT$v	   \$D$)|$   xD$8       3ɉL$4f;t$<   8L$ ׍u L$ Wu L$ Wru G;G|$(|ID$8L$4@D$8;ǉL$4D$|\$4Sj P D$(\$,L$8)|$\$PD$  \$L$0~x t  Dډ\$;L$Dux t  \$|$D$EL$0AL$0D$+|$D$#D$  \$     D$+ǋ|$D$(tu  \$  ?    t$3pK9~~w^ D  3tX= t@t
PHV$)xIIVpKtPPVpKt$G;~|\$= tQt
PHV$)xIIVpKt$PPM3_^[]VM3_^[]ËD$@M_^[]_^  []̃SUVWD$    j j
d~$   GW @    D$WPD$PF$uT$9CLt9SHt
F$= tEpKt
PHW$)xIIWpKtPPW~$    |$   ?    pK39_~po D  u tX= t@t
PHV$)xIIVpKtPPVpKC;_|= tKt
PHW$)xIIWpKtPP3_^][W3_^][ËD$_^][USUVWWfD$~$   ~D ^D   phR@~$ u,tj Sj 	h   j;F$F$   \tX= tEpKt
PHW$)xIIWpKtPPWF$F$t33_^][]3"du)j 33F$ǋ_^][]3l$|$F$ǋ_^][]Ë|$ǋl$_^][]̃$Sx$ X$UVWD$ |$&   T$$3D$,    Wj@HfD$(IȉL$mt$(%  L$FFNGȅw8rw   N3w r?  w   FNRQNXGML$(ΉD$w7rw$   /w!r=?  wD$$A   
RPXWOŉD$(,0w:rw   M 2w"r?  wE    MRQ5XD$(3l$9o   wF˙RPT$,m˙RPT$4m> ~U3FˋRPT$,lFˋDRPT$4lFˋDRPT$<lE;.|l$|$El$;oqt$$t$(L$$j j
&L$$n_^][$USVuB@L$< W  JL$;N  I4E~    >|$   T$ND+D;E   D$x$    C@<@CD$3u>L$PWt*KIQOWQ7 WfG    {T$B$   D$T$x$ uKFK|$O~fDAC|$T$:L$EAL$;H_^[]̃SUVWx$ D$  L$$m    3B  @B U\+\C\$  L$$U   90uy~  r  B3@3ۋ|D$G    =(A	  H%  yH@(=0+WWfff     fnYI`fnA(fnIfnQfbfnAfbfnYfbfnIffnQfbfnAfbfnYfbfnIffnQfbfnAfbfnYfbfnIfbf8=(ffnQfbfbff8=;Rf8=(fsf8=fsf8=f~;}(D$H[+AI+A@;NƋuL$$\$;|3L$$ՅQL$IS_^][̃SVWWu:G   WAj GWOj OȋGOO_^[ËC;}<1 uF;|G   G_^[Ë+T$@GIj ȋD$GD$GGO_^[̃SUl$VWߋt$K.   E;   P׋{0    stX= tEpKt
PHV$)xIIVpKtPPVW@   CCGʋřC8ʃ  QL$VCtKSG_^][̃y$ u	z u3ø   ̃S\$UVWL$w;wG      GN3ۋ3	T$NN;~F@ 8}NH;2T$h D$)G D$G$GHD$GF;G|;T$Њ
u	HC;G}&y$;G|   Jf9 }@I~KD$L$++G\$$w    C;E    P
0    wtX= tEpKt
PHV$)xIIVpKtPPVW@   GGEʋÙG8ʃ  QL$VGt@ OhtG    E_^][U   pKW39} ~nSV] 3tU= t=t
PHV$)xIIVpKtPPVpKG ;} |^[= _t@t
PHU$)xIIUpKtPP]U]U4ST$43щD$VW3ۉT$3\$ |$$9B$Y  ȉL$8  茡  L$SF(P!D$0  E@   WȋڋǙȋEڃ  ȋD$0L$(ډD$3\$,P։T$8BT$9z$  B(Z(3D$}   t$,3QPaD$tY;HL$4HL$QtRHD$ L$D$@t
PPt$4X3DL$(T$9;u$u SVt$4Qhrp0RX u
  A  9  3t	9~t63t$  F j P	  Gw3t$,u(h-h| hhěj4   <  ^Ct
PHL$FD$   ;   up   F@x	 t@x
 u[]L$FVw8 uj VQNVQ D$,ΉL$(@@x	 t@u	\΋D$u/   r蝃D$rD$,@    D$(C@%p$K@u9$  uCD   s@֋ <{W ut֋Ct
PPt]= tHpKt
PHW$)xIIWpKtBPP6W*L$ D H@ȉO   3T$B@r$D$8\$ 8t    D؉\$ D$0|$$G8T$GB$   z$ D$|$$
Z  |$< EAu/3C  yL$fD$F ;0|T$  Kz$   L$st$$@    tG       wt$06tX= tEpKt
PHV$)xIIVpKtPPVD$0W@    @D$8@ʋD$$Gʃ  QL$V|$8t$$T$NKt$$z$ 
D$z$ t	3_^[]QSUVWL$w/tX= tEpKt
PHV$)xIIVpKtPPV_GC_tG    G,;]UE 3ȋQL$V(Gt5pW0w,H9H|A_^][YË9_ G,_^][YG    _^][YQy$ W   WSVx0wuVO0;JMJG\ GX   ;}j< ubFG\;}< uF^[GW_YËGX    ^[GW_YË
FD$yT$^ 4D$ȀO\GXƙ^GW[_ỸSډL$UVW{T$ksD$$(8^ L$l$ Gl$ ։T$9T$   |;  D$,;CH	    CH;SLv|$$RSD\u-L$D$$D$ QPCHCDP t$$D$CH~$t$CSC$D$CC,k(kJ;|AC0L$$T$$c] K0C,L$$SK0B
9T$|7;r1Ӌ(Cu9uJ  _^][Ë   D$    SP] ŉCT$S_^][ËD$@$  _^][QSVW{ tt$ t$ujj`j Vn @x0Eʋ։N ωCHFs$ u/FF   F    j @@F,֋._^[YU SD$    UVW\$ H0GwL$$P(G0;ND$ WfD$(u ;   <. uJF;   <. u;F0..D$   yT$[ ؋D$+D$;   .T$(\ _8D$(GPD$,GT9\$|3G<D$胗uHL$    j Pt.G<_8\$O<GƋL$$CGD$\$W\$ C$   \$ D$G4{$    w֋Ox0u\W0;QMQG\ GX   ;}q< uiFG\;}< uFƙGW_^][]ËGX    GW_^][]Ë	FD$ yT$ nZ D$ ȀO\GXƙGW_^][]QSUVW~tX= tEpKt
PHW$)xIIWpKtPPWF    }$ 
      ^;^$   KN3 ȋʃ QW   N;N$uF(;G}1V%@t;G|	E$  F    F~Nuc9tEpKt
PHW$)xIIWpKtPPW}$ 	VPNWY FVFt@@͉F0f_^][YËBH@@y$ u|\ t    u   3USVW}O4~PGIuG<O4ΙW׉GOx0tOXˍT$X D$)GPD$GT_^[]ËM_^[]US]VuW> ~t8F;x|0֋{$ +  ~ !  FP       FT    ;~0}:FT$X ǙFD$FPD$FTVF_^[]FP  > tUFD$    HT$ʍT$1W ;|$tL$T$9W t$ǋ˙V։F   KA@AKY   C(D$WD  Gu+j KS(B+ǃ)D$   F|$8FHFHN0OfGuFH    +t3;~LvMVDW$TuT$FHFDWRP葠 ~HL$VPV ]FVEt    ֋_^[]Ë~tg= tTpKt
PHW$)xIIWpKt"PPF    _^[]WF    _^[]U$SVuWD$    D$$    ~^^XG;}j;^0|8D$   T$6U ;\$t=T$$"U ؋ÙFVy  T$U L$NPL$NTÙFVL  > |  333ɉD$F   T$uSUJA@AJY   C(D$WGu+j T$K+ύBǃ)D$~u~tl= tYpKt
PHW$)xIIWpKt'PPF    3q  ~WF    3T  FHFHAF0O@ GuFH    +t3;~LvMVDW$QuT$FDFHWRP ~HL$VPT FEV    ~   @ MF~a  B؍GD$ \$(D$tI;}IVPS F    F؋D$ 9G~V0R L$	ȉN,~4D$9G~+T$(R D$\$(F,ÙFV^0D$   D$;  9  |$ 1  Ftu= tTpKt
PHW$)xIIWpKt"PPF    _^[]WF    _^[]t$$MEx$     ~ߋVx0u>N0;JMJF\ FX   ;}R< uJGF\;}< uG6FX    -
GD$$yT$$Q <D$$ȀN\FXǙFVEtx    _^[]ËNًFD$$ T$NFy(D$$T$^FQ ÉFT$$VT$$F\VX_^[]ËE@$  _^[]̃4SUL$VWl$U@}D$    ]D$    tGE 3JL$ ȋD$QVt$(HD$F$t$D$0  |$(;L$0\$,9}$uE(   1P	    @y;|L$0UU0ET$4;AO  L$ E $D$8GD$$L$09 -   l$|$(\$,L$L$8;A  3\$$ȋQL$$Vn   7   GD$@GщD$<Fft
ǋ|$D$fҋDD$D$tX= tEpKt
PHW$)xIIWpKtPPWl$D$<L$0T$4|$(\$,L$9D$@|1L$0T$4D$$l$@|$(9 \$,D$$L$|$    D$4t^= tKpKt
PHt$4$)xIIt$4pKtPPPD$D$\$9A;{~D$   _^][4ËT$ύRPN E    E SC;|@ʍT$@M D$@l$L$ _^][4ṽ8SUVW|$L3L$T$@T$,D$4    OL$DD$D$qi\$l$0hM T$,t$$T$(;  n\$,l$ yL$T$,+M \$,,l$ t$49t$   upT$T+;B3Ʌt4D$ŉD$8D$PƋt$8D$<D  :uA;r|$Lt$4t$49t$T   ;s)L$L$P:   t$09t$$   \$T$l$$+~L T$(T$l$$T$(;  rL$ƉL$t$ T$;L t$(L$t$ ƉL$;:  3|$@    t$Dto= t\pKt
PHV$)xIIVpKt*PPG    _^][8ø   VG    _^][8Å   l$׋bG      p@\$D$0;|׋3Gu_^][8ËT$ +&K l$$l$ F  3ə;9  |;/  3l$(+D$T$,J \$,3  r
;L$0    +G    GG(GG$D$GH    t;;GLvL$WDP$HuD$PGHt$TGDP赔 D$ GHD$t9GH;GLvL$WDPI$gHuGHGDSUPr _HD$\$$;\$0r	G@@T$LI ؋D$LD$(G0Gw_,_@;|7;r1l$׋Gu9E$   E$  '   3l$WP!J ƉGӉW}$    E w֋Ox0u\W0;QMQG\ GX   ;}q< uiFG\;}< uFƙGW_^][8ËGX    GW_^][8Ë	FD$LyT$LH D$LȀO\GXƙGW_^][8ËD$@$  _^][8UESVuWj\D$ ٍFT$j PD$    D$    4~ MC<8    pph~{$ u/t"K<j Qj h   j%C$C$   \tX= tEpKt
PHW$)xIIWpKtPPWMC<{$ 8X  RPjW)   身uR9D$t9OdPPE(RT$$P.D$ tЉA@ T$ @t
PPWޙd   t8@t
PHOxt3f;   r   A@   v PA$tD$1t&ty t#&WfD$ D$ D$ȉL$t6W$yW uu3G$@t
PPL$D$L$D$WC$   ku@t
PPE3ɋ֋@9D$ML$MD$L$ HˉF~ |$tu׋t$V2{$ uau]V~VtMEEtV|$  t(N$;NuF0;G|Q0F@Et	֋FtF _^[]Ë@x0DʉN _^[]USVD$t$Wy  Eo  }   ^\$wx>    33y}3sCteC@;uWT$K(rf;us   :u't|A:ButoA:ButbA:BtZu33ɋD$L$@$    t	FL$]KKL$q  \$G   G _^[]ËsG)+t$.t3T$3D$B$   뢍FRP
tt$G)PFP L$(W)ƃ+ӃPȃL$8uN^$iFHL$tSy(|$VFu+ыL$j I豶D$O΃L$@+ƃ)D$t"WGu+3D$    3L$D$3   ;    '   Pj   ]WD$fF    CD$CH    t3;{LvL$SDWI$@uCDCHWt$P {H}D$FFwWPC E\$W׉GFG0tD$
    }@x0DʉO _^[]ÃSUVL$WyHD$A0+;|	+~
0xD$,v@ }\    {\ uf83_^][Í      RuhD$@         9   u;u   _^   ][;|9   v   3ɋT$3;J4ED$Hf83_^][SUl$VW;hn  ~tX= tEpKt
PHW$)xIIWpKtPPWEF    ։Ft{$    V   *} E   ;z   VP/@ F    ~{$    ׋Nx0uVV0;QMQF\ FX   ;}k< ucGF\;}< uGǙFV_^][ËFX    FV_^][Ë	GD$yT$? D$ȀN\FXǙFV_^][C$  _^][Sم  U39k0K  VWs\@ N8?>tU= tBpKt
PHW$)xIIWpKtPPWpK~tP= t=t
PHW$)xIIWpKtPPWN4~0tU= tBpKt
PHW$)xIIWpKtPPWj`Fj Ps E`;k0_^Kf>= ]tEpKt
PHS$)xIISpKtPP[S[SUVC0D$+;t$|FW@ }$ u:֋atPj PU@ Ћs0ƙ+;t$}_^][̃SUVl$Wm    ŋ~@NPȋFDL$YPQT;u;t;|;s   3;F4  Ń,@P~4 t	3   F@F0D$VD+؋FH| D$tcyPQTMPET;u;   ;|;v   3ҋ~4;uN@͉FDL$#;FD|;N@v   3;uN@FDL$+θ*PL$ft/NHӃ,IL$PA_^]   [ËL$D$_^]3[̃SUVWL$,l$$ !   EHpt$,D$     vŉD$$XP\$f      Y  Cϋs@k։D$D$   uUu6\$0D$4;F$|%;^ vnj ֋tҋ\$;k~kUӋ3^mu8\$0D  D$4;F$"|;^ sj ֋e֋9tՋ\$F;C}@ӋωC\3D$t$t$ uC j SWЃ{ t"D$$      u>;D$4|D;L$0r>t$,l${ tI|$  uBD$Pu-D$w;D$4|;L$0v$ t뺋@pL$ QSWЃjVՋOUHB@|)\ E)   )   E@MDB@PŃx t)}8 txX u39O$_^][PE,UЃ_^][̃SV{$    D$UW     FHL$QhFPD$    <m    PSD7pЃ|7\ t|$ uD$PtEjU֋QFH@@|1\ F1   1   F@D$ND    ֋W_]^[W|$~Vt$Wt$FP ~^_U} SVW   }3D  MT$18 3ɋD$\$GGwt$~z90t
A;|i+Gy9w8rw   1w!r?  w   _RSW!}\$Aw;]L_^[]US]VW  U3}t$zuW   D$yT$<7 UB39~ \$9]   zA;}|B        ;}><tyF<> |F;|z t+
ƋT$+P:PAP U+D$
A;   t$Ft$;   >>FT$yT$6 T$t$E3ɋ@9~9tI}A_};]|UB    ;B_^[]ËB   H @ET$@   +P:PAPG U+D$t$
AB   _^[]̃BSUV(3XÉT$L$JWzXD$D$L$ ʋT$+PT$HǙ;|;D$s+\$ L$AAΉD$@ED$ SUt$0l$(UT$<+߅tX= tEpKt
PHV$)xIIVpKtPPV~kD$ tZ 3l$Eȉl$řQL$ Vyt3N.D$;M;D$ 4D$p3&E$  _^][UBXSVW}T$G;GvPK$r2   T$BXWGuf uhW@_^[]Ë|$t$x0 uD3Ʌ~F8 t-A;|3T$ˉD$D$hP_^[]ø   ֍D$fD$hP_^[]̋T$Vt$FPNTJFXB^US]VW}CPKTOCXGCD$CXʋCsK@;|;wC D$G_^[]ËWwG     KXFT$;FvJ$P1u#CXWFL$hVf G_^[]̋D$@    S\$Vt$WK{Ws(C     FPNT_CC ^KC[ÃS\$ UVt$$kXWFD$řʋC{K@;|?;v9N~Wv(F     CPKTn NFn_^][ËCV(8{3ۋ
\$/l$D$Bm l$ l$(4T$,JPRTM ͋l$ QT$;s4Gً;};t;|u*L$\$M E;r̋D$t$(_ +Fn^][USVuW}FPNT_(OFD$FXFʉD$Nv\$F;F  |
9D$:  6t$A$A     D$8 =  U33ۉt$BXD$0D$T$8~&t$QL$ .   T$M@ D$9}T$G@;   9|T$;s@ >tFx;rD$9\u0T$Ƌ\$+Ã:tUPAA SPwz MƋT$+ÃA ;s?^Ft$\$hT$/ \$EYA_^[]ËAAA A_^[]ËUwOVSG     9GG G_^[]W? ugB x0u	B,_ËJ(u	B,_Ã9 u	B,_Ãx0 u	B,_ÃxdB,p]-_B,_̃SUVWT$ 3|$O$D$39u#D$<y9_Z\$@@9\L\   ;~
@ ;|kdj PP1l$  vu0t$DP}E, MHL$,.E4$E8D$0E( uՍO$L$,$ U  D$<t$    F @T$ T$4tEPD$   PQt$@T$@^;\$         s   D$<v@HPD$@͋l$ƉD$u,SQ`׉L$(L$(y7    CQǃ`Pt$4L$0t$DL$4T$4yЋl$T$4;\$ [|$H@@sL$ x4EPvD$$fQU3L$$`yl$t$D$ _$   u0N~F@ ֋؅t+[PŃ$ uj P@ WЃVSՋN_$UHB@t)\}8 E)   )   E@MDt:B@; u+|(\ t$(    uj j j Ջl_^][Åt<B@PPE,UЃ_^][Ë    _^][ËD$D(_^][̃y$ u	z u3ø   ́   3ĉ$   y$ Vt$u~  |A$   3^$   3?H   SUh   D$j Pa n~_3W    |~Dt3 @ H=  w&ȅyT$%  yH@

uȋt$u_3|$u
f@|t\3t   Bu$  ][@^3{G   UQSVW~$ uj];_D|bGHD$fuKL$j P3D$t/WD+Qj R ` D$GH_DF$_^[]F$   F$_^[]U SUVW{X |$,  CH3WT$fD$ 9P~#{@fD$ |   D$(    T$T$ D$$D$(D$ D$ 39kD~u3D$sHNtctDQ@   ʋřʃ  ʋVQW|$8豫D$(T$EF     F    D$;kD|C@    $    CPD$,~kL%w4   &uKt4NdPPD$4(RPtՉi@SZ@t
PPCX   D$ T$(RPjw4w41{w46kw4ՉG$蔌u@t
PPCX    _^][]̃SUVWL$ 3|$Y$D$3҉\$T$9  @   wH	F;AL  F@    vʋD$ʃ  ʋVQL$(WD$|$L$ PwH;    ~4    ~T$$O' ȍT$$A' F F4	;F8vPV0a%uN4F0 F4˙RPV0%\$0V0|$,L$$SW%~(|$^,\$F$   T$D$F    F    	   D$~ tD$0~+FL$4N;uon3ɍ~j QB%ŋ˙RP4%D$@L$4QP׋%D$8T$|$BL$ FD$4FD$F   ; T$(_^][USUVWL$WOAQ: tJ9 t8wH~ ~/F	;FvL$VP$#uNF FG@GD$UwoGD$l$t@G;GvL$WP$#l$uGGVt$ Po l$w3wl$ȋGʋWQV葧D$ G         G;GvPM$W6#uOW
GGG    G<fG9_^][]̃SUl$VWMT$9n(FL^(Fȋ;HL|8~z$~L$n?   F;FvPV"F+F~~ȅw6rw   /wr?  w   ORQF3FF~:    ~   l$9~(t!3҅~n$L$$+):uBA;|BT$\$֋9{$k$G  D$~Pt6;FTvPVL!uD$PFLt$(FPPm T$ VPFFX9}    ^Fl$^$:~V$L$$+D  :uGA;|l$^ǃ$RP!D$ +ǉD$RP!L$ t<C;CvPӋ!u!L$D$$QPCPm D$$C\$ F(    t.;^,vSV$ uF$F(St$(Pl ^(NHfF9  F8F_^][QSVW$ u$~~'ND$I~~	֋N$"N~"Nv"NLn"39^D~3D  NHS"C ;^D|vHt^= tKpKt
PHV$)xIIVpKtPP_^[YV_^[YUSVWj\j pLCPW EӉjC   SC:O$CX   VWSO$VHǃx4 H4L$    pphL $ u1t$j t$ϋj h   j		G$G$   \tX= tEpKt
PHV$)xIIVpKtPPVL$$ u!C     RPC   j1_^[]U@SL$UVWD$x0 WfD$DD$L    D$4      y$Xx?   C؅y  { u@    C@    ]   +l$8C D$$    D$<    RPt$HD$8T$46t$
  ;n~    F3҉T$H;D$LvPT$HjT$LB;D$LvPT$HNuT$HD$DL$$T$HC ϙRPT$Lk CD$(t@t$H.;D$LvPT$Hu t$HD$DUt$,Ph t$Ht$Hl$L$8E mD$8+t;.;L$LvQT$Ht$LuD$8UPD$LPh t$H? uL$DAD$HAF	;D$LvPT$HKt$LuD$D0Ft$HC;C   l$KU;}wC;Eo+ʍAƙRPT$LM KmL$8+ktAt$H.;D$LvPT$Hu!t$HL$8D$DUQPg t$Ht$HK؋CA?   D$x0 h0l$(    pphi? u1t%L$j t$,	j h   j	   \tX= tEpKt
PHU$)xIIUpKtPPU?   l$(L$<D$@ PQju t$<t$Dju u o$u _  D$x, h,l$(    pphLR? u1t%L$j t$,	j h   j	   \tX= tEpKt
PHU$)xIIUpKtPPU?    l$(t$,t$4ju E    D$(u]9D$Dt@L$(PPƋId(RT$PPrD$@tt$(ЋA@T$@D$( @t
PPu mu ]u    ~u@t
PPt$= tEpKt
PHV$)xIIVpKtPPVT$ L$D$4`@D$4;B0^L$D_^][]̃D$x$ H$S\$Ul$$Vt$ WL$(    NVxL
;   +3+~fD  T$T ;||$$t2G;GvL$(WPuGGVSPc wL$ +PL$(D$ 9 gL$(~.F;FvPVruFFUSP}c n_^][U   SVuWD$    F@L$D$0D$(Et D$4D$4    j`@0D$<3PD$D$PPfN D$4T$WfD$<D$D     D$tSލC@BT$,@BI44ύT$Lt$FL$@T$D$LǄ$       u  vD$D$HI;w$uxӋ> ubD$HL$ TuFD$ L$j @4   P襺t%L$ WIfDD     @L$   L$ȃ> ]  C@A@L$ @D$AD$$Su4L$$Pt$$tT$ WJIfD    B   >   L$T$HD$0t$D$(C@VD$0tD$0P@RBL$T$,BD$(A   1L$APT$D$,xuCD$$   9AtD$$    D$PRSj j j ыj nt$(֋  fD  FHP@@t$ t$0   0   L$0;\$@K  ~fT$<r;ust=:  t.A:B  tA:B   tA:B   L$0t$T$D$ xX u|$$   x\ 	  $ uuQST$PD$   FH\$@@$ 0        L$XL$d;HL|T$H$   t*T$XL$TSVQT$P$   $       u~Ƌ+D$xL$|tt$} tD$49$   W  3t$@t8;\$DvSO$T$@ut$@D$<St$4P^ t$@L$03ҋt$T$ƋQPT$\O$!t$x\$|fǄ$     |$8uzt$ ~\    L$X_$A	;D$\vPT$XKL$\uD$T L$XAL$X~X ~aA	;D$\vPT$XuEL$XD$T D$X3\$ KXC\HO$RPT$\nD$Ph Pt$j j j ֋֋\$T$HS\$8$ u~ u֋"L$(D$  T$  3T$$_8t$D$(@D$T$8A3ə PD$QPj ;    pph$ u/tj Sj 	h   jG$G$         = t|pKt
PHV$fnI3fnxIfbfnfnfbfbff~xIfsVf~IpKtPPVt$$ u(t$8t$j3iz3d3TG$l$$t$\$4T$t$(F;t N+@PRPQ[ T$(L$)Q)V    ; t$u
D$,HI  39^0V  \@ N8>tX= tEpKt
PHW$)xIIWpKtPPWpK~tS= t@t
PHW$)xIIWpKtPPWN4~0tX= tEpKt
PHW$)xIIWpKtPPWj`Fj PE D$C`;X0NI= tEpKt
PHV$)xIIVpKtPPVL$<Mt	$   )_^[]̃D$SUVT$3ɉl$D$L$$W:|$    }$    3339O~1WuB;NNC;_|;~ȋl$;L$,}
v| tMD$(   T$͍XD$ PV|$$}$ u[< uWVK|$  ]D$8D$(_^][É:_^][U   SUVW3|$t$\OL$$9wPuGHWL9w$u
GP9w$_$t3GP oPՉl$ωl$(WOPЉT$ tT$ wPc  RT$lhL@0l$4D$HJ93t$$uj 3ҋ脉;   fD  ~  _(NFu+׋L$$j ǀFÃD$8G+ƍQ)D$,Au|$+SQT$pp_$;   $   |$xT$,F;|"D$tRT$<RPUW |$,|$x.  W3fD$PD$TL$PfD$`D$HL$@ ;  L$8T$`)H L$`T$dL$l$@l$Hꀼ$    l$H   L$t9D$xAD$w>rw$   8w(r=?  wȋɀ
L$$B   UPL$UƄ$    QL$T$p$   +(  |$x3ɋ\$t$   `\$t,;w:rw   M 2w"r?  wE    MRQBL$|$xI$|$DuWl$@T$,;}(D$8<( u; EG|$x;}<( u
 G|$xE7;D$0V  L$T$h|$x<  D$@   D$8D$< D$4yL$<T$4
 Ћ͋D$4yЍ7T$P;D$0 Rt$@;PU T$\|$x   3l$L       \$0++ދ+l$<;~CT$4
 ;}2.T$4o
 ȍ1;fD  T$4.R
 ȍ1;~D$tVUPT l$X\$ $   |$xl$L7;D$0|T$h|$x$   T$P;}
{$ Ll$@T$,\$$   $; l$0; t$$uF@F; |$t$$+|D$\PT$l+l$} unT$(胏; l$(l$   uzEu@v͍4   j Pȃt#vWfDD     Al$l$(   ; uPE} @4@Eu-PV輫ȃtEW@fD    M    |$; t$\u%UE RBED$ A   qEU3ҋ&;    xP ~{twMƋ]\$ G؉L$DD$hpD$qPWSVUqN WSt$Pt$0`N |$T$,+ϋD$pwVl$0l$3l$ o$XT9u uC3fD$9\|1L$T$ j VD$(FL$PD$$Q}  tŋ|$T$薗L$譌_^][]USUVWD$ol$$}
3_^][]Ë_3~!OQ;tJE;u9t?F;|D$s4vx$   3Ct#D$3@$   _^][]_^][]3΃(PQ؃uD$@$   _^][]ÍF(Pj Sr< G@   CGOCKGL$j @D$I$m    P	T$ B   O3L$xi4M   \$439>~Am    3D  N@R[GE~DfDLLT$;>|֋L$IL$y\$D$$BF_^][]Ã= tRpKt
PHS$)xIISpKt PP3ۋ_^][]S3_^][]UMuUuI$]UQMS]$VW9 [   uF;FvP   V}Mw8rw   
1w!r?  w   JWQ>F>~ȅw6rw   /wr?  w   ORQFESpFPrN ^WFf _^[]̃VWwww;7rG    _^ÍT$d D$GD$GyT$ L$
ȸ   G1O3;Gw_^ULS]T$DVuWW}CN$fD$(fD$GPfD$4fD$PD$X    e~$     L$(L$T$( D$(D${ D$,D$L$L$$L$L$T$(a ؋D$(D$D$,D$$|$4D$0UL$y6yT~L$L~BL$Tf
JL$LfD$LD$T_^[]Å  ;L$$  L$;L$  L$T$$+׋|$L|$Pw8rw   1w!r?  w   ORQD$PT$L$$D$(xG9T$uA9L$u;M;q|.	T$0I D$D$0D$D$D$4D$D$(M;Y|	T$8 ؋D$D$8D$D$$D$<D$$D$(L$T$+׋|$L|$Pw8rw   1w!r?  w   ORQUD$PD$L$D$(;r|(
T$@Z D$D$@D$D$D$DD$D$(U   3ĉ$  EWS]VD$3W}4    +D$HD$LD$P|$X8   \$\PD$dD$4    j PD$@    D$D    D$H    fD$L5 tlWt$F ~ΉFG  U|$`|$,T$ É\$
_WG~BωT$ D$; t?L$t*SƋ{;P|;xvp0H0ƅu|$,T$ D$s 9t$\$08\$0|$,T$ D$l  D$\T$4D$X@HL$	$ÉL$0P5    \$8D$DT$@fD  N|$4+ʋVw8rw   1w!r?  w   ORQ;V؋F0N\$\$$\$8T$,L$T^  ;PU  ;HL  3D$    D$(    WfD$@t$\$\$   D$0   t$L$Xi\$H  =   pKt
PHS$)xIISpKa  PPR  @ L$T9V   9N   N~ NV(F0W    RVD$,    G    N,GL$(
NL$ L$(AL$(|Ir?L$t*@ ;x$|;P vp0H0t$ƅuދt$^01\$\$L$(D$$T$,t$5L$({0 L$ T$HAL$0P|$T$@[0L$H D$L\$w7VL$ WQA(I,PR|=r7L$t"fD  ;x$|;P vX0H0ÅuD$X0\${0    O _ C|$;L$@u;D$DtPQT$HL$PWG(O,SPG$_0W \$|:r4L$t#$Ë;x$|;P vX0H0Åu|$_09\${0 kK C$;L$@u;D$DtPQT$HL$P9C+C(L$LȉD$$D$ ;  |$4	|$ȅw8rw   1w!r?  w   ORQ|$t$LD$LPD$<PE L$Xϋ|$$L$L$8~%C,C(WPD$<PD L$ ωL$L$8\$\Ct$\$   |$p? tYD$,9GuPD$T9GuGOP? t:L$t&_ƋW;P|;Xvp0H0ƅu\$w Gt$8\$uvGGPwD$D$<P9D GD$$GD$D$8 v0t$t3L$t"_ƋW;P|;Xvp0H0ƅuw09t$o\$D$TT$,D$08 QFt$8GSD$4WL$Xf~D$4D$<fA$  _^[3 ]̃PSUT$H5l$4VE W}$j x0|$,Eʺ9L$D6Eʺ   L$H   Eʺx   L$4    EʉL$PIP؃}P \$4u'? EHULu5EP? t3EP MPL$<	  	  D$dW|$p   fD$D$$    \$8fD$TD$\    R  D$hT$$Rj jt$xD$X    PWj0 0t$@}$ ugF P0;u	F,RN(u	F,B9 u	F,4u	F,'xdF,VpM$F,֋l$us\$FH@@PPF,VЃ~ tD$TPF+VPQWT$TnD$HP袽֋6t|$p\$\$8D$D$l$,  39n0V  ^\fK8(;tX= tEpKt
PHW$)xIIWpKtPPWpK{tS= t@t
PHW$)xIIWpKtPPWK4s{0tX= tEpKt
PHW$)xIIWpKtPPWj`Cj PW+ E`;n0\$8|$pN=    pKt
PHV$)xIIVpKt
PPl$,D$dL$h0T$<D$$Pj jt$xQL$(Wj8|$Dt$$? ~   F P0u F,hV뜋L$l$L$뙋N(u	F,A9 u	F,3u	F,&xdF,VpF,L$  FHP@@PxHpDD$(P@,ЃtjD$l;  L$hЃr;ust=:  t.A:F  tA:Fs  tA:Fb  t$$~ )  D$9n   |9   |$X    D$(39(   |$X    L$0T$49;}Y}   Ǎ8 t
F;|9~L$Tv~BL$\f
JL$0T$4fD$TD$\D$X    D$(;u54VQD$\Pt$ T$T;}L$0F     @uD$(E8 Ct$$WfD$L$l$L$TQ+ȋFVPQt$$T$TnD$L$D$8PL$u\$8
L$l$434y$ u.Pt$4D$\PQT$TD$08;}yuL$;|$L|l$$  39]0L  u\N8C>tX= tEpKt
PHW$)xIIWpKtPPWpK~tS= t@t
PHW$)xIIWpKtPPWN4莊~0tX= tEpKt
PHW$)xIIWpKtPPWj`Fj Pr& C`;]0M= tEpKt
PHU$)xIIUpKtPPUD$X\$(j P]N  VL$XND$XFD$XtPt$XRJ: j h  ؃   l$  C0      KHkC, G   ~ ~OwWP.  |$P    W׉GFG0CHfHtK4̓O+3@3CGtE @x0DʋD$tO tX= tEpKt
PHV$)xIIVpKtPPVL$T)L$<s\$4	sta= tNpKt
PHS$)xIISpKtPP_^][PS_^][PUSVT$W~ E  3ۉD$7*tƉ^      ^$  j j~uƹ      ^$   WFfGGD$@0G   )t_j h   貌G   9t]pKt
PHW$)xIIWpKt+PPƉ^      ^$CWƉ^      ^$"h   j P" Ɖ^$   VN]F};|;r;u
;u~  t	;A\~: t    -D$~F F$_^F$    ^[]QSUVW~(tAF(    _oCt
PH׋;Ct
PPU.Nt^F    NPt"qFP    _^]3[Ỹ8 3ĉD$0VNPtpFP    NtP^F    j W%j jfD$4D$D$$mT${F$L$4F$    ^3A 8SVW  NPtgpFP    v,(-v0-v4-v8-v<,vD,~   |]_tX= tEpKt
PHS$)xIISpKtPPSpK= t@t
PHW$)xIIWpKtPPWpK~tX= t@t
PHW$)xIIWpKtPPWpK= tGt
PHV$)xIIVpKtPP3_^[V_^3[S\$3VW3~C;}=0@r+;}00u @;}0tO;u	G;|_^[3_^[̃$SUVt$4WD$3A$L$ V|$T$RT$,|$,|$0|$4D$(-  3ۉ\$8~D$(V@UP2 L$<ts3ɉ\$~.3 )A<r;}@ )$<uA;|G;|݉|$3D$   h;|'p|$;tCG;EL$8L$8;~3L$<D$l$ ;X  }P u v}$ EHE$ULutEP}$ E$  D$(0u$>    tR_Us(tAC(    ~^Gt
PH֋藉Gt
PPSp)u(3t=}(^nCt
PH֋QCt
PPU*)D$D\$(8  = y  pKt
PHS$)xIISpKC  PP4  EP0 D$(uPL$Qj jt$(PD$Pt$TP耷k|$D$Pt$Dt$$ыt$4t$HJ|$$l}$ u$kG P0u	G,UO(u	G,E9 u	G,7u	G,*xdG,WpM$u$G,> GH@@Pǃx PG,WЃSL$$_^]    [$SVWj j j w׋詩~$    GH@@t;\tp;   80td= tEpKt
PHV$)xIIVpKtPPVD;\    GO_^[A$A$    QS\$UVW|$SWjn֋֋ŸuUFH@@~4 0   0   u;/|;s)
;|#;vSWj֋茨֋ptN_^]A$A$    [YUSD$    D$UV1D$WD$D$Pjj j
hqT$/v6   |$u h-h| hhěj菴U_Ct
PH?GD$}   s@֋{W ut	֋Ct
PPb  w_Ft
PH׋Ft
PPS$_^][]ÅupzGHy	 tAy
 uowt$} rNuit$}  t   XEU@Ht;t	t9Q@tIueEu   &tU+jD$Pjt)OIy	 tAu&D$u*   rD$G    k@p$k@9$  uCDr3_^][]V~P ubp~$ FHVLuonFP~$ t3fF$F$    ^ËFP NPfF$F$    ^S\$UVt$W؋؋؋Ǚ؋D$xˋ0ٙ39l$$~#D$ ˋ(ٙE;l$$|_֋^][̃<SD$    UV3D$P33ۉl$0Wt$<t$@\$HT$;P  A$3D$8 $  D$8T$(  D$T$L$D$(ЉT$;Q  ;uqT$,R  |$,T$\$;Kl  3ډt$8d  ;|$<v!L$T$4WBt$<l$4=  W.SPD* (  T$   D$T$$D$0  L$09t$    T$D$$;BT$    |$t$8|$$D$0t9;D$<vL$T$4Pt$<l$4uWt$4.P) D$8    ;Lƅ~g|$@Ճr
;ust@
:u't5J:Out(J:OutB:GtD$   3u+Å
D$   3ۉ\$Dt2;t$HvL$T$@V\$HuD$@VUP( ދD$T$;PD$tX= tEpKt
PHW$)xIIWpKtPPWpK\$@t\= tIt
PHS$)xIISpKtPP_^][<S_^][<UP  SUVW3t$H\$<F|$(PT$VT$@~  6qqh聬9{$u2t%D$(WPW	h   j*|$<C$C$   \tX= tEpKt
PHV$)xIIVpKtPPV{$   3  9/uhPNj腭E3  D$@t
PH,  El$ 2  G L$h7   j QD$    WPj"   l$h|$x:   t$(:   |$(t$x:   |$(׋MGEGOME   O         ͋                                 uLE$       rW|$ |Ƈ   I+   l$ uɃD$$  u33Q%  =  uyuqt3	D$T$(R|t|D$xW    u3?΍Q    Au+j AL$PD$ dtt$VU$ D$(׋L$h||$(w$D$@t
PPd  @t
PHGx   t#f;   s(-|$(   G|    w$뤋   A@   _PPW$yW uu3GG$@t
PP@t
PHOxtf;   s(   A@   PAtyuA/tQ   tT$t
D$    D$W$yW uu3蓂G$@t
PP@t
PHOxt   f;   sP   A@   -PA$t)l$81t軷ty tڷWfD$0D$0D$8W$yW uu3߁G$@t
PP@t
PHOxt   f;   sx   A@   yPA$t)l$,1tty t&WfD$0D$0D$,W$yW uu3+G$@t
PPL$HD$8;A  3ə͉l$lǉ|$XPQY  G9GC$     /T$`(  E MȋD$`;   ;G   (T$L  ȋD$L$`9D$LD$LLЅ~^̓r ;ust4:u't)A:FutA:FutA:Ft3u
D$L+D$yC$  ׋t= tEpKt
PHW$)xIIWpKtPPW{$ W  |$l$8GM;   D$H3 ȋQVT   N;N}C$  D$@@;|"P   3ff;tC$  = tEpKt
PHV$)xIIVpKtPPVG{$ 0x  |$,   D$83D$T3D$HD$@    D$    l$P D$,t$$    L$U|$4G(P~wD${  D$,@   WȋƙT$ T$ D:L$lD:l$X3L$ l$9{$  C(k(3D$D|   t$u QPD$DE tZ} HL$\HL$dQtRHD$HL$duD$d@t
PPt$\3DL$ 9} u$u UVt$ Qhsp0 u
  ,  $  u t	9~t63t$   F j Pnr  Gwm u&h-h| hhěju+  ]Ct
PHED$D   ;u    up   EHy	 tAy
 uMGU9 uj PV
PVwEΉL$@x	 t@u	c΋D$Du+   rD$DD$E    C@%p$K@u9$  uCD   s@֋蟫{W ut֋{Ct
PP\$<t]= tHpKt
PHW$)xIIWpKtBPP6W*L$  D H@ȉO   3C@T$s$t$$D$0l$P|t    Dl$PF2C$   F{$ t$$4t$t$8t$3l$,n9>~+D$D$fD  fG ;} |t$l$,{$ t+j3t$֋,h  řT$4l$X    L$TFAL$@D$Tl$\;  ȃ L$3T$ 9{$  k(3] twRQSu ,] tX} CD$0CD$HtQHD$ ӋrD$@t
PPt$03DT$ L$9} u&u"t$<Uj RQhvp0 u
  (     u t	9~t63t$  F j Pn  Gwm u&h-h| hhěju'  ]Ct
PHED$$   ;u    up   EHy	 tAy
 uMGU9 uj PV
PVEΉL$@x	 t@u	u΋D$$u+   r*D$$D$E    C@%p$K@u9$  uCD   s@֋豧{W ut֋wCt
PPt]= tHpKt
PHW$)xIIWpKtBPP6W*L$ D H@ȉO   3\$<l$\C@s$t$tu   
BftC$  = tEpKt
PHW$)xIIWpKtPPWL$@FAL$@D$T;[ȃ L$3T$ 9{$  k(3] twRQSu ] tX} CD$0CD$HtQHD$ Ӌ^nD$@t
PPt$003DT$ L$9} u&u"t$<Uj RQhvp0' u
  (     u t	9~t63t$  F j Pj  Gwm u&h-h| hhějvu'  ]Ct
PHED$$   ;u    up   EHy	 tAy
 u9MGU9 uj PV2
PVEΉL$@x	 t@u	΋D$$u+   rD$$\D$E    C@%p$K@u9$  uCD   s@֋{W ut֋tCt
PPt]= tHpKt
PHW$)xIIWpKtBPP6W*L$ D H@ȉO   3\$<C@s$   
B;O}#ʍT$p+  t$D$p;F uD$t;F$tt$C$  = tHpKt
PHW$)xIIWpKtPPWt$j ֋|_֋`l$Xd]bD$H@D$@D$8|$(D${$ -hNj謙h-hS hhěj莙|$(   7u/hPNjmh-hZP hhějR~lFt
PH    |	    v	׋<	3퀿   r	~W uu~H#Ջq{$ u{$_^][]UTyP WSVW@0T$DL$D$@fD$HD$T    D$X    D$\    u!'VL$y$ AHQLu2TL$APy$ Q$T$   AP yP|$<  3D$,9G~6_393~ 3SL$F;3|D$,|$<@D$,;G|͍D$Pj jj j j j ݗt$,T$\$L|$H  \$|$ BHWfD$HD$8    @@|$@      L$(      L$$|$,D$0utm  D$$Q   D$(3D$(9D$,~/L$0؋D$(@D$(;D$,|Ջt$1\$\$3߉\$  3ɉL$XBH@@ڋ   ;D$\vPT$XN$u.L$X   SPWD$Thf D$XPȏL$XA;D$\vPT$XN$   L$XD$T    D$XD$XL$HQL$<QL$\1   t$(ƋT$$t$(щT$$    D$L؋ʋD$HދL$$%؃ 3D$4~-T$0ޙϋ|$,؋D$4@D$4;|1\$D$H\$T$X3ًL$TPD$<\$Pxt$0it$D$X\$T$j j j 蕈T$$w|$ĄD$ 8 u|$D t9}u9]t\$   \$ L$<!It$Tth= tUpKt
PHV$)xIIVpKt#PP    _^[]V    _^[]Ë_^    []VtsNN)V  N!= tHpKt
PHV$)xIIVpKtPP^V^̋L$w3S\$VWsNFQPQPQPhhj 6Q  $uK9F,tvvhP6Q  u*~  uvvhj 6xQ  u_^[USVWL$D$    at
D$    j j JaD$|$u    L$E     _^[]uMW @D$Puuwυu\$E_Gt$t3ɉ|$Oq   j jX`ȃt$upO|$   jXj Q0  wD$F@   shPF|$΅tl|$ |$tauj hP  L$|$uBu`gjhP  |$D$ȅuL$|$t$tfG    uD$ˋWPt$ .Q  }D$D$hPȃt9$t;s}+C4%EPQD$hPzȃFuЋ|$h sD$QhPTD$tsP3!= tNpKt
PHt$$)xIIt$pKtPPt$t$EChOOCh    _E_^[]t$T$3t$t$t$t$t$T$   t$t$t$t$U4ES]VH3W3L$<D$(    AD$,t$t$ t$$t$0t$t$49q@th8ݍMAG_^[]Ë   D$8  D$8  RP]ȃL$  KC   t$93  3҉T$8CP@   u
;L$,   x S  xz;L$,}tD$<@DBt	Auc:tBuZAG   L   DT$Qh,M:G4:Vj膍NFuC+L$T$΋t$FL$t$4   |$        ɋL$   T$9=GCFD$    t$4   x L  D  D$,@;u|$4 L$ur9rGD$4   FD$Qh,MD$$   8MG48Vj轌N    Fu+L$΋t$L$CFT$t$4ЋCDL$T$8D$T$89D$b|$  ur3Ʌ~h3fC< }S| tLD<t%<t!<t< u8|$$ u1D$D$$   8>|$0 uD$D$0   8<CGF4A;|L$9 {ueD$<S@
@;ȋD$u)t%    (D$C(8 3_^[]Ãu&@   C    z L$(tɀ   L$(D$|$  tBtD$(C3C(_^[]ËD$( K8C3C(_^[]Ã|$0 tI|$$    tD$(C3C(_^[]ËD$(C3C(_^[]Ã|$$ u>tD$(C3C(_^[]ËD$((C3C(_^[]ÅtD$(C3C(_^[]ËD$( C3C(_^[]_^   []̋AV@,tD  9t=@uApH;FHu;VLtNPtb?FP    F$F$    ^3^UQSVuW~؅u~O<x   |$t3M   9_^[]j WXtt$vj Wy  GxGF,GFFV N~,GEO8_^[]ËE_^     []QSUVWwh\$tX= tEpKt
PHV$)xIIVpKtPPVwttX= tEpKt
PHV$)xIIVpKtPPVw0t5u
39O   C| Vu
6s\w8tb6K= tEpKt
PHV$)xIIVpKtPPVotO4?wdtpF^tvЃ= tEpKt
PHV$)xIIVpKtPPVuw\`wXtX= tEpKt
PHV$)xIIVpKtPPVpKG<   wHtX= t@t
PHV$)xIIVpKtPPVpKwLtS= t@t
PHV$)xIIVpKtPPVD$@p(tA@(    ~^Gt
PH֋XGt
PPSj`j U  _^][YVW|$   7YN,;t	H;uG= tKpKt
PHW$)xIIWpKtPP3_^W_3^̃SUVWl$ ]83euM<3_^][Ãd  j 3D$     3C   St;@t
PHNxtf;   s(   A@   :PAtyu	il$9tQ   t
)l$!l$t3l$D$t.V$yW uu3]F$@t
PP3uhP3z@t
PHFxtf;   s(   A@   dPPV$|$yW uu3H]F$@tPP|$~FC3H~/{T$p  D$ED$GD$CH;|؋|$+|$|sL$ I<N3_^][USVuWF   3F< txN4vARX\$XSt$
ЃuN4AL$;Hu;Xt   N<F4߃NN<@x t   N<ut	_^[]ËF(D$F,D$F4~Gj j j WVЃ؃ ut$t$wwu~G   F4@@N	F<_^[]ÃtktVxG@v0O@dtOv0N<؃t<7HPhE
A_^[]Ë_^[]ÃN<3_^[]QSVWD$ 3Pt$ |$uL$G9_^[YË\$D$j Pj h   jT|t3PhEfKh= tWpKt
PHV$)xIIVpKt%PPL$D$_^[YVL$D$_^[YU  SUVWE 3ۋMHD$,l$xEL\$L$$*  PD$hP蘰  D$SPSh   j։\$$@{|$9tEpKt
PHV$)xIIVpKtPPV`  \$uhNj贀 9;uhPNj蟀   3t+h-hS hhějtT    D$@t
PHv  G|$2  C L$(3   j QD$(   SPjz   l$(|$0:   :   :   t$0MCECKME   K         ͋                                 nE$       rS|$  |ƃ   B   |$uVl$$  u3/Q%  =  uyuqt3	裙S|tO}W udu3׋͉C|;WZ΍QfAu+j APD$ fSD$ tt$VP  D$,׉C|VC|       s$l$D$@t
PPd   L$ETj P/EXD$D$   39uT   3|$AtPHSxt   ;}x   A@   (PG    t%   @  fGS$yW uu3VC$@t
PPEX<F|$(|$;uTY]\\$   3u2hPNj}h-hZP hhěj|^   Ft
PH    |	    v	Ӌ3   r	mD~W uu^H#%׋#U΋z]P_^][]Ë\$tEP    _^][]ËL$$|$,Gp t'FutL$$t,vuQh>zG   EP    _^][]_uP^][]U<SVW}33D$0    T$$T$<\$T$8KL$ AhD$D3D$D$9A@th8yCF_^[]9Gt j`Gj P#  L$,3ҍCAh3ɉD$4L$,9M  ]F<6  p$XED$0  Et/Q%  =  uyuQu轕Ѕu%3FIH<0|<9~:*  t$4D$PRQL$03V؃  T$O43ɋ؉L$L$  ]L$,T$$   3|GD$@EuL$(7Q%  =  uyuAt
D$(    D$(3FIH0|9~D$(t,T$RT$DPQL$,Y؃
  D$,D$!ET$$ED$<
ED$8AL$,;M8]hDL$@Dt$<j\$4_Zh   j   G W$>G(W,  JB3ۀ u	JB t3D$$t 3  tDGȄu|$$}D$$G      T$(D$,fD  NL$ɋL$(t)D$	x:xD$,uD$(@D$,Nx  xD$( x+   D$@@@G@WD|  uxT$,MʉD$( Nt+	x:xL$,uD$(A@L$,D$(NxxD$( x+uGOG@OD  D$$RPhuT$@     L$L$  G(W,誕G W$t$,Ntty tA I$G(O,FH(P,A(I,G(O,FH P$O W$G   FSRQp4w4D$(΋P؃Fx tO<O<N@  4 v  |$0    \$0K%  =  u{ust333覑33҉L$<T$8uC3ۃ?D$8PT$@L$@T$8؅uO<OHWLuVhtAOHWLz  \$,t$*D$ OHWL@`tD$ @dp    E f  _4G   FD$@D$8D$<t[3ۍ4      PVC     Pj Vn  T$L|$, ^ĠDË\$<JP%Eû%P$tDPQt$HQrh`RV؉w8(u#D$ωx؋D$@    [  6= tRpKt
PHV$)xIIVpKt PPG8       VG8             w4Sw$G   w W\$ {$ ushrKh      L$$3Gu
39G   Nw0T$4RVЉD$DL$H:/  ؃uOD$<L$@\L$$tQjP w$w jPw,w(j6p W؋L$   InL$q   =    pKt
PHV$)xIIVpKtPPpKL$= tTt
PHt$V$)xIIVpKt#PPV랡pKQD$ L$D_^Hh[]Öא  ̋D$@<̋L$AHVwa$TL$WfD$3t$T$1Q^ËA8tL$pP31Q^ËA4L$@pP31Q^j q0L$31Q^ ؘUSUV39F0W~0u=~u
39^   hڋ#RW,     DF<   7F8tH@F4@H@PQj7C@@7KI@duf<3_^][]7u  _^][]ËCxh t 0;PhEnKIh_^][]̍D$Pt$nL$AUSVD$    W^6  3|u.9C uh(V   _^[]ËNhI  _^[]Ë׹{u/{ uhxV`   _^[]ËNI  _^[]Ë׹(~{   F3|$p9~t
Ή~S9~PuW-FHVL9~$ue+FP9~$t3FP ^PNPt#~PtӋ|$#  39_uGfD  @C8 t~$ W  [D$ |8 ?  D$D$  PST$|$~$   D$ŋ׹z  MA$t1t} ty t	"}WfD$\$Fp~P u!.,~$ FHVL   7*FP~$    FP ~P|$   ϋPXT$tb"T$FP    ǋυy'׋覕ωD$;"D$   ۉ|$ȅt'y t!RST$聍|$t	׋,!F$F$    _^[]Ë׹įyu~MA$t9׋Nb  _^[]èt{Na  _^[]èty t{Na  _^[]ËNWfD$|$a  _^[]ËN_u<]D$NPS(u"9D$t   _^[]ËNj Sk  _^[]U,SVW}3GOD$HhG@,txu98uH< @u]Q?D$<G  D$@TT$0B?   u33J%  =  uzurt3L$0D$x        ֹ(1w   K3Q?  $tSIQOPI=    tyʍSQOP'=  x  t9qtzʍSQOP=  U  WSfD$0L$4D$0QOP<  2  D$@֋t  QD$D$,   9p u @\_ D$,|$uJGx uAD$}pЋNPhiG   G@h    _^[]Ã}u|$tQORP3-<  ~  txORP3<  _  t9qtxORP3;  ?  OWfD$0T$4D$0RP3;    KL$ A?D$0u3L$ A?D$0ttG   @h    _^[]À|$tl|$,  y  KA$tQRPS  twRP?  t9qtxRP*  WfD$0T$4D$0RP  A$t1A@twT$/t9qtwD$ T$WfD$ D$$t$ D$t$ KA$tI5t?w$ty t	\wWfD$L$D$|$0D$L$u];D$u;tU|$,OuPV3):  u{t$t$1uN  u^D$3ҋOPt$$9  )D$PVO39  u-uOuN  uEӋOp0
S  G_@h    ^[]Vt$FNHhF@,txu90uH< @uNe  N^Ah    ̋L$73̋D$HA    I*̋D$@`@̋D$ @@̋D$3ҋ SVX6  uvT$W|$BAy=3Ʌ~JWfD$|$Ul$@ C<lA:j;H|]_^[;}CD
B_^[ø   _^[̋D$3W x5  u"L$WVwq^9G|9Gw  _̋T$u3ËD$t$t$ Rjt$ @H<p8AЃ̋D$@4t@3̋L$xD$@4;H}
@@3SVW|$@x tAt;3ҋ؅uBt$FVw0kL$ Vw0L$,_^[ËL$3    L$    _^[U4SVT$(W3t$^8\$$@D$0F<@D$(  98  v4t$~]t3ɉL$   j WF3ȃL$   FPj Q  3҃9V~q|$D  FHuI9   0D$@D$ ؋F;C\$$   \$ F;C\$$   ~ t$       B;V|L$3   ED$39XA  D$,     D$)  |$@x tNtH3ҋv   |$sVw0Vw0D$4oL$ t$   c3D$$D$G4D$0ÉL$43ɃL$8 3D$<D$09x~Rt$@ @@t3Ʌ~9tA;|3~ t3   GD$0;x|t$$u3%L$T$0h`t$A<VjRq8@ЃD$CL$;XD$t`= tMpKtPHL$Q$L$)xIIQpKtPPQt$^8tN4ssI^8T$,D$(f<t/8 u*u3DtSM+ǉM1_^[]Ëv4F
y u,vA;Fu!A;FuEJEJ_^[]ËE3     E_^[]U(SUVWE 3ɋu4l$,L$@L$ @D$4tv3t$9Mhu vL$ j PL$(EhL$]h
  3CD$$~qD    D$ PD$,PȃL$u2FFFFL$(T$ VPNV5L$$tFG;|$|t$D$$3w  D$(3҉D$ D$^  D$$L$+x u xH;L|;Ls4(L$B;|ҋD$l$,   L$ @ulD$L$ ;|Dt    EtD$0   L$0vj P32tlL$ Etulut ~<ËGW WF
NxP;D$4}JGRWPtGD$D$(3D$(   e<D$Ep_^][]ËD$  e<Ep_^][]ËL$e<Ep_^][]3e<Ep_^][]Vt$3F<tlЅuD$Np^Vt$W3F<t;u@D$x3;Fp}.@FtD$FtLD$FtLD$_^ø   _^̋D$P8tBRË@4HAQD$uD$ 3U$SVu3W\$F<AD$d  9X,tAF8tP@F4@P@IPRV+W  T$؃\$f<!  9X$u23ɍP9
  ؋C< u
FA;
|3ۃf<   HD$   3L$ ;9   @<    F    D$,@x    ~t{3ҋ؉\$u|\$Sv0]Sv0D$4T$4؅t=L$hPSRA<jt$<q8@ЋL$8؃\$D$Gхu%D$LL$ D$3G\$D$4T$ f<PMy2E3     9
~23    F<A;;
|D$_^[];
}FE_^[]ËE_^[        ]UQS]VWsdtC`9tJvuuKPj*t:WC`CdFsdEFEF3_^[]ËFtvЃڋMtuу_^   []̋T$JdtR`f9t
Iu3Ã|$ AtA    A    VW|$7;wrD$_^ D$ ST$  L$\$7u0T$褊  L$T$ƉD$    腊  L$[_^QT$$L$UW|$PW   tD$3S\$$Vt$$G        ;Gr^[_]YÍT$   ȋD$ L$u,T$   D$T$ D$     ĉ  D$ ^[_]YQD$SVW |$@7_x0u1;\$r
_^[YÍT$w  ƉD$_^[Y;s>t"T$O  7;rD$ _^[YËT$N,  @_^[YUMSV3ۋ@Wx0V  A8t$Mu3TL@+ʋ}   Q43ۋEJ9XudxpB|$;xuR;puM9Y~HQ A}t L$QWVt$"L$$A@IIt_^[]Ë}3ɉ3ۋt3UGE    7 O@x0u8;r_^[]ÍT$  UƉD$_^[];s>t&T$܇  7;wrU_^[]ËUN趇  @_^[]Ë}D$UPW	uKD$t3҉WE _^[]À9uUAX  @_^[]ËE_^[]USVuD$WPD$    6Vt$|$؃   EUG   G     G$   G(G,7w4H4V؃ujT$6Pw$Rw `؃Fx tO<O<Nu9u G<u-uWh֋؃uW0؃t3eD؅   7N,;t	H;uG= tOpKt
PHW$)xIIWpKtPP_^[]W_^[]UMS]V	WC@D$A$t9Q5td$ty t	dWfD$T$|$L$p,t9~u	9V   vuRWhOTC   jjjjBl   =    pKt
PHV$)xIIVpKtQPP_^[]Ã~ hEN`PEHPASVhЃF`    _^[]V_^[]̃,B4T$L$$    SUVWtH3ɋWL$fD$,D$4    @@0   q  A3D$$@ ;   R43B9xuRhXB;huD;Xu?9y~:Q At!L$QL$$QSU>D$IAD$ A|$ 3D$L$RPT$4|$&T$D$$F|$ _39l$  t$0;l$  R4D$    By uSYyJ;YuE;yu@x ~:P Ht%D$ PD$ PWS腼|$0\$D$@Xx33|$ \$D$D$t9>;D$4vPT$0L$ʀt$4uD$,WSP  t$0T$E|$ )   Y3~Kz4G
y uA;GuA;GuB3L$RPT$4߀T$F;|L$3ۅy   t$0R4B<y uVRA;BuKA;BuCot97;D$4vPT$0L$t$4uD$,WUP  t$0T$C;\$|t$0T$,L$(hpj VD$_^][,UQSVuWD$    NZCu69E  EN@VD    fptKRQeD$_^[]Ë};uFENV    fptRQeD$_^[]É   PfHD$_^[]@;uruMTD$_^[]Ãt	!  ~P u؉\$  vXFPvTF`u@VhЋD$ F`    _^[]Ã{    Bκ   CheD$   v0GtD@t
PHNxt   ;}x<   A@   ]YPG    t%   @  fGt.V$yW uu33)F$@t
PPWuCh    D$_^[]̋D$VW@p t)|$FutЋ[tvu_3^ËD$_ D$0   ^̋D$VWH1M  |$ulhWhvvh j 6   uFh`gWh`gvvh P6   u!hWhvvh P6o   ~, t%u!h Wh vvh P6D   ~  u%u!hWhvvh P6   _^̋L$A@,tfxu9uH< @uIL  ̋L$A@,tfxu9uH< @uIA    I9UES]VWjSp#   ˍQAu+ʍAD$3t$D$ju_t$V\tLt$j V  NNt$SQc  MEFEFEFA Fǉq _^[]ø   _^[]UEVWP@u+3@D$øukVWt[Wj VF  Ft$uP  EUFE~ fF@FEF3J$Nr$9Fur(_^]ø   _^]Vt$W|$uv(%v$tCfD  tXtvut!T$3~F_fNJL$V^ËD$W_^f @       SUT$VWth} taq$t$@ tCXtvuT$u;u    h~JL$$ǋL$Y8    A<    _^][Ëq(\$B8S#ЍER#FUvЋL$(FA<t/t$thJL$A<        _^][Á8.u BAD_^][3AD_^][̡pKS\$VWs trN~tvѡpK= t=t
PHV$)xIIVpKtPPVpKus$tv@ N~tvѡpK= t=t
PHV$)xIIVpKtPPVpKu= tAt
PHS$)xIISpKt_^[D$%PS_^[̋D$  VW@xD$0fFf#
  f;u?~pu9<:utP:Quu3u	Ft8_^̋L$PjjjVW|$3     utЋCUtr_3^_   ^UT 3ĉD$PSVW\$N  Pj0>  G    G    G    G     G$    G(    G,    _   GG`GCt
PHhWh{W u3ɉL$o  3ҋ!D$Z  w D$t}D$pKN^tvѡpK= t=t
PHV$)xIIVpKtPPVpKupKw$trN^tvѡpK= t=t
PHV$)xIIVpKtPPVpKu= t=t
PHW$)xIIWpKtPPW\$Ct
PPD$  D$t$ D$3D$ *D$$D$(dD$,D$0%D$4D$8pD$<D$@6D$D}vG6vvWЃCt߅m  D$$t$D$p3D$ @D$$@D$(D$,D$0pD$4@D$8D$<D$@ D$D.D$HD$L.D$PpD$T 0}j FPGW6WЃCt   \$Ct
PHj Wh{W u33ҋ7Ct
PPuQVVVVVh Wjj$uHPPPPPhpWjP$_^[L$P3  ]Ë_^[L$P3  ]ø   L$\_^[3ِ  ]̋L$UD 3ĉD$@S3ۋMVL$ML$WNt$D$L$9b  8D$ D$$D$(`D$,$D$0D$4D$8xD$<D$@D$D(D$HP
+  $$w$w4t([B   G(PPPw$w4t4<B   w(w$w4t, B   _C    RP   3~fF?,@;|DF D$Vwwt,A؃= tXpKt
PHV$)xIIVpKt
PPt$u)      Vwwt(>AӋD$j t$ j @@3   Pj<D$ D$I@= tEpKt
PHS$)xIISpKtPPS\$t"t$t7PhE~@D$L$ PL$P_^[3  ].J  UVWEPuL?u	F_^]uj j Vu= tKpKt
PHV$)xIIVpKtPP_^]V_^]̃|$ LSUVWD$    %DPt$ D$Ussh\P3|$4 t}WUsh|"?L$4= tPpKt
PHW$)xIIWpKtPP_^][W_^][USىT$VW3C<H   |$itE0F_^[]j WNE|$8u
G_^[]t$j WƤ  GHGD$G9u  9s /  s<E    |$  
     RPt$b  hVWQ>OGu3+D$9C~BD  PD$ h+VP>ND  FuD$+@t$D$;C|ËEPj V= tIpKt
PH|$W$)xIIWpKtPP|$Wua|${, tu j hGu8EPjh'ujP8?=  tL$   E     _^[]þ   SVWtxs   6vu9=tLpKt
PHS$)xIISpKtPP3_^[S_^3[UM   9USNUEVWT$xAtu@AIXRuL$$ыOj0Sw\$,wD$(3ۋD$(9X~MuI@MT$4誂t&T$OPuC1Pt$$wwrD$C;X|_^[]U  ST$Vu3ۉD$L$$\$W}  L$SQS[  \$VWjS3uhNjO< 9;uhPNj:<   3t#h-hS hhěj<Q  D$@t
PH
  G|$ 2  C L$3   j QD$$   SPj5   t$|$8:   |$:   :   t$8t$CNFCKNF   K         ΋                                 F$       r覊S虬|$ |ƃ      |$ uaD$$  u33Q%  =  uyuqt3	BUD$S|tND$xW    u3A΍Q Au+j AL$PD$(D$tt$ VPN  D$(L$׉C|s$D$@t
PPd   u3_^[]þ   C|    s$Ƌ3Ft
PH    |	    v	Ӌ膩/ƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    ~W uu3ЋFt
PP_^[]ËD$u}H   VWD$4D$8y   t$  T$$D$(   L$    D$(;p  @|0 L  b  @t
PHKxt   ;}x
L$u3G   A@   @PQ%  =  uyuyt3	RS$yW uu3C$@t
PP@t
PHKxt   ;}
xL$   A@   #@PAtyuq)tQ   t1t3	XS$yW uu3C$@   PP      	u3/Q%  =  uyuyt3	QL$	Atyuq)tQ   t1t3	*X3D$4t&L$(T$,hVWA<jRq8@ЋD$4L$t$I)DD$T@| |)| r T$$D$(FD$t$uL$}  D$@Pu)3E_^[]ËD$x |xsҿ  Ӌ3t$ Ft
PH    |	    v	Ӌ軥dƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    ~W uu3ЋD$ @t
PPE_^[]U   x, SVW&  D$D$    j P     u\$ujS]~6   uIt2KdPPǃ(RPJt։q@=@t
PP3uhNjJ4 93uhPNj54   3t#h-hS hhěj
4E  D$@t
PH	  Ft$2  C L$;   j QD$   SPj-   t$|$ :   |$:   :   t$ t$CNFCKNF   K         ΋                                 
F$       r裂|S薤|$ |ƃ   ޱ   t$u`
D$$  u33Q%  =  uyuyt3	AMD$S|tMD$xW }   u3FύQfAu+j AL$PD$ ȃL$tt$WQL  L$ D$K|֋
C$D$@t
PPu3   C|    C$   ԋ;Gt
PH    |	    v	Ӌ蒡;ƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    W uu3Ћ	Gt
PP   -u@t
PP_^[]3_^[]USىT$UVW{ \$  {KST$ L$|$h    A        Pj R8  j j$ uI~ tCT$_  3;^}&    ;}D$ ˍ_  G;^||$\$tU= tBpKt
PHV$)xIIVpKtPPVG$L$$G$    K_^][]_3^][]̃SUD$    VWWD$    E T$uL$fD$ux]3~ET$L$t4\F;||$\$u!t$uj jm~$F$    tc= tPpKt
PHS$)xIISpKtPP_^][S_^][U  SD$    VW\$   D$  u׋uh|$$  9G,  PD$$PVx  u\$$ujSuhNj- 93uhPNj-   3t#h-hS hhěj-?  D$@t
PH薬  Ft$2  C L$3   j QD$,   SPj5'   t$|$(:   |$:   :   t$(t$CNFCKNF   K         ΋                                 F$       r%||S|$$ |ƃ   `   t$uD$$  u33Q%  =  uyuqt3	FD$S|tD$xW u{u3D΍QAu+j AL$PD$ ȃL$$tt$VQԤ  L$0D$K|׋C$D$@t
PPu3   C|    C$   ԋ;Gt
PH    |	    v	Ӌzƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    W uu3ЋDGt
PP\$|$      D$ VPVw  u\$$ujSuhNj'* 93uhPNj*   3t#h-hS hhěj)C  D$@t
PH  Ft$2  C L$;   j QD$    SPj#   t$|$(:   |$:   :   t$(t$CNFCKNF   K         ΋                                 F$       rxYySs|$ |ƃ   軧   t$u= D$$  u33Q%  =  uyuyt3	CD$S|t*D$xW    u3DύQAu+j AL$PD$ ȃL$tt$WQ+  L$D$K|֋d C$D$@t
PPu3_^[]C|    C$   Ћ3Ft
PH    |	    v	Ӌmwƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    ~W uu3ЋFt
PP_^[]Ë_^[]QVW7G    VFRPRPhj 6u=9F,tvvh0P6uOiujP8I%  _^YU(  SUV3L$t$(WD$     3D$$    W\$T$<fD$4t$0F  S2  PD$PS
\$|$   3R  9+uhPNj%E3?  D$@t
PH覤  El$ 2  C L$L3   j QD$   SPjC   l$L|$P:   :   :   t$PMCECKME   K         ͋                                 E$       r7tuS*|$ |ƃ   r   l$ ul$$  u3/Q%  =  uyuqt3	>S|t}W u[u3<΍QAu+j APD$(D$tt$ VP  D$׉C|-|$s$|$   C|    s$|$l$Et
PPd  @t
PHKxt3f;   r   A@   +PA$t1y=t21*ty tM1D$WfD$@|$Dt$@t$S$|$yW uu3BC$@t
PPWVt$$33҉l$0N6c3Ƀ|$L$4  D$<;H  3҉T$8@8  q@t
PHKxt   ;}xu3G   A@   *PQ%  =  uyuyt3	<S$yW uu3GC$@t
PPt$4F@t
PHKxt   ;}x   A@   )PAtyuq)tQ   t1t3	BS$yW uu3C$@t
PPu3 T$<L$0hVWB<jQr8@ЃT$8D$|$,	T$@ȉL$ ;vT@   EǙwr;srw;r胋uCL$$WV$t1L$ T$@t$,D$$t$$l$(wGrw   @l$(   |$;w!r?  w   NRQ8|$l$(D$L$4pD$8TL$4AL$4Kt$FV uSt$T$(t$gD$-hNjXh-hS hhěj:t$$tX= tEpKt
PHV$)xIIVpKtPPVu3   +Et
PH    |	    v	Ӌ輎enƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    }W uu3ЋEt
PPEuL$_^][]_^][]U   SUVx, WT$$L$   D$D$    j P     \$Pڰu@t
PP   跰u@t
PP3uhNjN 9+uhPNj9   3t#h-hS hhějS  D$@t
PH  El$2  C L$;   j QD$   SPj   l$|$(:   :   :   t$(MCECKME   K         ͋                                 E$       rklS融|$ |ƃ      l$uhl$$  u3/Q%  =  uyuyt3	I6S|tY}W uku3֋͉C|C$hύQ    Au+j APD$ D$tt$WPP  D$ ։C|C$C|    C$   l$Et
PPu3   ;Gt
PH    |	    v	Ӌ蘊Ajƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    W uu3ЋGt
PPuD$ T$$  H(@,
B_^][]ø   _^][]U  SVWD$L$$y     HQ?u}$tQM3Q_^[]t'M3Q_^[]ty t'M3Q_^[]ËMWfD$D$T$3Q_^[]ËU_^[]ÍD$D$    j P        \$D  D$$@@;D$4VS観Ftc  3uhNj 93uhPNjp   3t#h-hS hhějEE  D$@t
PHO	  fD  Ft$2  C L$;   j QD$   SPj   t$|$(:   |$:   :   t$(t$CNFCKNF   K         ΋                                 ?F$       rfgSˈ|$ |ƃ      t$uD$$  u33Q%  =  uyuyt3	v1D$S|tD$xW u{u3DύQAu+j AL$PD$ ?ȃL$tt$WQ臏  L$ D$K|֋C$D$@t
PPu3   C|    C$   ԋ3Ft
PH    |	    v	Ӌͅveƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    ~W uu3ЋFt
PPD$$ H(P,EP_^[]̃,SUVT$Wt$W   fD$ \$D$(    t$,l$D|$uN3Ut$DU|$3ɉL$0  l$$f;Kn  D$4    C<    |$tt5V%  =  u~uvt37/L$0LQtyuI(tA   t	t3	5ȅu3C<hQV@L$8jQs8Ѓ|$D$4؋E	;D$(vPT$$L$@|$l$$uRL$ ͅw8rw   /w!r?  w   Y
VS,l$$t$D$0\$ND$4QL$0AL$0l$DFV uUt$DT$(|$  tj= tTpKt
PHt$ V$)xIIVpKt!PP_^][,t$ _^][,U  SV1WRvvhP؃\$$u
C_^[]ËD$j Pj h   jD$     69  \$3uhNj 9;uhPNj   3t#h-hS hhěj!  D$@t
PH͐  fG|$2  C L$;   j QD$   SPjh   t$|$(:   |$:   :   t$(t$CNFCKNF   K         ΋                                 述F$       rX`1aSK|$ |ƃ   蓏   |$uD$$  u33Q%  =  uyuyt3	*D$S|t D$xW    u3CύQD  Au+j AL$PD$ D$tt$WP  D$ L$։C|9s$D$@t
PPd   @t
PHKxt3f;   r   A@   PA$t1yJ   C|    s$뉨tL&ty tgWfD$|$t$S$yW uu3hC$@t
PPE0xu3   ;u/hPNj}h-hZP hhějbwvGt
PH    |	    v	ӋL~3   t$r]D$^W uu	wH#t$֋\$$= tOpKt
PHS$)xIISpKtPP_^[]S_^[]U$SVu   9MWNMEFD$,L$ tVuFVF@0 t D$    t
D$    ~|$BD$FD$]D$$PQL$43SAЃT$W  9D$$   >ǋVD$щT$L$ʉL$D$L$T$T$у0|$ 3T$D$(9D$ ~>|$L$D$(@T$D$(;D$ |ωt$u|$1~1VT$3ɿ   L$(vG;Fu}zFT$ @4QD$tCL$$QL$0PSl@Ѓ|$$ T$u%t$T$L$SWv6DY1F1VT$L$(GL$(x_^[]UDWS)D$8D$)D$(\$DVCW\$$4@gv  PVXD$  KQj PT$,o  C tuu3  L$D$j P
   D$      |$Wud  D$   j WXD$0T$4D$<    {, tL$RT$$P0  uF{0u@3ut3w*j h   suph   j Wn  |$H3      ;{   C<    |$8D$<    {0uD3ut3ۍs*j h   ؃uph   j Sn  \$H\$$ugwVt$CVt$ D$8L$8Ѕu3"C<hRQ@L$<jQs8Ћu{, tL$ D$<;  ED$<L$T{0uL$H*?D$H    GL$H?|$D$H    uW誊d>Wz     L$33Ʌ   {;}/D$\$P;ˋ\$$u[DT$;DuMAt   {  |$u@D$(WPfD$,   D$(;Gu	D$,;Gt  g{, tDD$(WP fD$,u>D$D$D$(;GuD$,;Gt  T$D$t$Dt$DH
o= tSpKt
PH\$S$)xIISpKt PP_^[]t$_^[]_^   []U  SVW@D$ D$T$   j PD$    +\$  uD$(   ujS膞39;u/hPNjh-hS hhěj  D$@t
PH  D  G|$2  C L$;   j QD$    SPjX    t$|$(:   |$:   :   t$(t$CNFCKNF   K         ΋                                 该F$       rHU!VS;w|$ |ƃ   胄   |$uD$$  u33Q%  =  uyuyt3	D$S|tD$xW    u3CύQD  Au+j AL$PD$D$tt$WP}  D$$L$։C|)s$D$@t
PPd  @t
PHCxt3f;   r   A@   PPCwS$D$yW uu3   C|    s$uC$@t
PP@t
PHKxt3f;   r   A@   2PAtyuA/tQ   tT$t
D$    $D$S$yW uu3C$@t
PP339t$ ~+D$;t$}3L$2  GD$D$;|$ |3ɸ   ;t$DD$$;Gt
PH    |	    v	ӋrkRƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    W uu3ЋGt
PP|$$ t
  D_^[]USUVW{  h(@,l$D$tTC    uts~ tF    P"~(tLF(    oGD$Et
PH׋Et
PPt$drl$~$F$    0Ft
PHD$F,Fn(t
PP_^][]U   SVD$    WL$D$j 	   Qa  \$Putt]{dPjjju"GPTuW18Wt,5t։q@	yW ut@t
PPEtPjS=ERPjSʗ3uhNj  93uhPNj     3t#h-hS hhějE  D$@t
PH~	  fD  Ft$2  C L$;   j QD$   SPjx   t$|$ :   |$:   :   t$ t$CNFCKNF   K         ΋                                 ϞF$       rhNAOS[p|$ |ƃ   }   t$u%D$$  u33Q%  =  uyuyt3	D$S|tD$xW u{u3DύQAu+j AL$PD$ȃL$tt$WQw  L$D$K|֋PC$D$@t
PPu3   C|    C$   ԋ;Gt
PH    |	    v	Ӌ]mMƃ   C C$    fǃ   C(    C,    C   C0    C@    CD    W uu3ЋGt
PP   u@t
PPu)9ut$|$OpHFtGuqH_^[]Ë_^[]UQESVW.  wgtM3ۍC_^[]j h   V؃uMC_^[]h   j S`      .3D$;E   M<tt`pu tAxFFuD$뵺|wu tx FFuD$녃= tBpKt
PHS$)xIISpKtPPSM       _^[]ËM3_^[]Vt$W3҅   S    F^;w;   (%A(-(5`U+D  :@  (ċfd(ffdff(ffffT@((fdfdfff(ffff@;|t$];}++
+,8@݊̀ AрGшPu[_^Ud 3ĉD$`EL$US]D$EVD$ 33T$D$t$D$@   L$W_  Q  ;}}2x<8 u	Ft$;|;)  ~;}#u :x	<0 tG;|t$L$+ƉD$;D$   D$(;tct_= tLpKtPHL$Q$)xIIt$pKtPPQculD$   RPȃL$tSD$ T$T$PWVt$t$j t$4T$<L$$wD$t$;}T$3ɉL$   t$3D$(;tct_= tLpKtPHL$Q$)xIIt$pKtPPQL$l3e_E^[3C  ]USډL$VWVFu+z        D$ba  L$PW+D$G  L$T$   |$;  3C      h;t"@ $<uC?;uL$   r% =   tƃ=  uH  $%  L$   ;E    1w=      } %ߟ   sER%a u9D$3Ʌ~
94wA;|<D$+PGWPo  7|$G|$L$T$;D$      3_^[]_^   []Vt$  W   tU= tBpKt
PHW$)xIIWpKtPPWpK   tU= t=t
PHW$)xIIWpKtPPWpK= _t?t
PHV$)xIIVpKt^D$%PV^UQESVWt   _^[]_t 3۾   S3ۋE_^[]j h   ؃th   j SY  ǃ      ǃ   @   X_tǃ       j j@?   uE3;}}&uﺔEutՀ> tG< t<	uFt     B  < tȊ	tt
FF< uu3ɾъ       ;}A   |   |3 3҉T$;UM<   u5D$MT<0t<1t<2   z    0   epuD$MjT:|uMPD$T]uT$T$,   SUVW   ~5   3x(>+;t0HN񋍐   @;Nǋ;}3p   _(   3^][þ   UU3US]VW}      D$ƉL$$T$t$D$h  ދM ;T  'y{G+ED$    rNh;tf$<uG?;u   r% =   tƃ=  u  M  T$n< uGh+ML$ Ԋ AȀGGCT$+ML$$;O  ;\$   [b  D$   RPȾЃT$?  ut$   +QRi     tX= tEpKt
PHV$)xIIVpKtPPVuD$L$T$ɉ   L$   D$'T  G   rLh;t$<uG?;u   r% =   tƃ=  u  M$uI      1           } %ߟ%a    E΋     ȅ7   (   s?$,@K	   s&$, ?$?KC$,$?C?$?KCM< t$$t$+t$$SVj uUT$,ȉD$$   3eE_^[]ËL$$3e_^E[]Vt$tgFt	PFЃ= tDpKt
PHV$)xIIVpKt^D$%PV^UQS]D$    VW$~}?X  Ph   蕻   h   j VR  VD$PEWP@Ћu9ۍK^NȋESQ#ȋQt$ЋuE0_^[]Í^t	PFЃ= tUpKt
PHV$)xIIVpKt=PPE     _^[]VE     _^[]ÿ   E     _^[]V3W|$~1@ <at$<et <it<ot<utt<ytF   ;|3F;}&<at<et<it<ot<utt<yuF3;|_3^_F^VWD7<wtR<xtN<ytJS333҅~0:<at<et<it<ot<utt<yt   3BY;|Ѓ3[_^_3^V3~$<at!<et<it<ot<ut~<yt	F;|3^ø   ^QSVW7DW  "$x"@  al  f;D0      |anceu  |ence      er  f;D      ic  f;D      |ableuv  |ible  `  Aƃv  an  t   f;u	:X7  ~emen;Tu:\u  ~|mentu  en  f;  :X   ~3io  f;Du0n   :Du%D<s   <t         ou  f;D         is  f;D   m   m   at  f;Due   :DtSit  f;Duni   :~bou  f;DuVs   "~Jiv  
~>iz  f;Du2e   :Du'j {tj+it7_^3[YÐ' H y    ]!!!	"!"-"p" 	
UVW7D  ,)S$)~Watio;DuUna  f;DuIl   :Du>j V  fTfDVDF[3_^]Ã  tion;D  al  f;D  j VKo  FDtion[3_^]ÃR  |enciu&j V3  [73_Dence^]Á|anci  j V  [73_Dance^]Ã  |izer  j V  fdfDfDF[3_^]Ã  |logi  j VRv  fwfDwDF[3_^]Íi      bl  f;Su5:Cu0j V   f\fC^C3[7_^]ÍS~5|alliu+j V  al  fDF[3_^]Ã~Ientl;lu>:Du8j Vy  fĤfDƤDF[3_^]ÍS~4el  f;*u*:Bu%j V-Q  FCe[3_^]Ã8  ousl;T)  :D  j V
  fؤfDڤDF[3_^]ún   ~Rizat;DuLio  f;Du@:Tu:j V  fdfDfDF[3_^]Ã~Fatio;DuD:Tu>j V?c  fTfDVDF[3_^]Ã:  |ator,  j V  fTfDVDF[3_^]Ã~Aalis;Du6m   :Du+j V  al  fDF[3_^]Ã  ivenes  s   ;DuBf;Tu;:\u5j VMq  ffDDF[3_^]øfuln;DuBf;Tu;:\u5j V $  ffDDF[3_^]øousn;D   f;T   :\   j V   fؤfDڤDF[3_^]Ã   aliti   ;Tu
:Divit;Tu7:Du1j V>tfffDDF[3_^]Ã~Abili;Du6ti  f;Du*j Vtf\fD^DF[_^3]f"#$]$$&'T(( VW7D  +$*~  |icalp  j VJ[  ic  fDF3_^Ã>  |ness0  Vj 
  3_^Ã  icat;Due   :Dticit;D   i   :D   j V   ic  fDF3_^Ã   fu  f;D   l   :D   Vj `tu3_^Ã~iativ;Du^e   :DuSVj -tB3_^Ã~6aliz;Du+e   :Du j Vtal  fDF_3^ e)))>*~*** ̋L$A=I  SUl$VWQt$ }WL$ &Y  t$ |>su5D><eu$~|>su|>st~|>iu	<stNt$D7<etH<n    i   :D7un   :D7ug   :D7u3  Vld   ~4ee  f;\7u(:L7u"j Vb  f\7NS  N  e   :D7u
:L7u3,  V`  3ɉt$D:a   t1ud~_iz  f;D:uSfdrfD:f:   ~+bl  f;D:uf\rfD:   ^:t$   D>><atM<etI<itE<otA<ut=<lt9<st5<zt1:Cu,Nc~̸at  f;D:ufTrfD:V::j ֋t,j+Ѝ8nu֋tet$Ft$|>yuV-tD>iT$)T$T$Et$|>euej VtVj+Ѝ8u7j Vt)Vj+Ѝ8uV.uNt$~;|>lu4|>lu-^j tj+Ѝ8qEt$t$(Et$(VWt$(u Ѓ_^][t$D$t$Qt$t$0@Ѓ̃L$D$$h0+t$$D$D$t$$D$At$$D$D$PqAЃ$UQSVWQGtM3F1_^[]j j3uMF1_^[]   3 ;}   E\t/u!0t1u{ u30뺃= tBpKt
PHV$)xIIVpKtPPVM       _^[]ËM3_1^[]̃H 3ĉD$DL$X3ҋD$PSUl$dVD$ D$lWL$0D$(T$l$@ +FD$    rSh;t$<uF?;uT$   r% =   t=  u    t$,;  |$\?t	3  ȁ   s\$5rً?   s$,@À\$5\$6D$4O$?À   s\$6 D$5T$4\$7#?\$7D$6\$8T$5L$4F\$   rQh;t $<uF?;u   r% =   t=  u    ;  t	3  ȍ{   spً?À   sL$$,@GL$?   sL$ _%l$?M l$G_F   rNh;t$<uF?;u   r% =   t=  u     D$\8 t	3   ȍW   skً?À\$   s$,@BG$?   s D$B ?ÀBD$BL$ t$4+PQ+RPj t$8T$@ЃT$u$t$,L$0D$_^][L$D3w#  HËL$T_^][3b#  H̃T$   }QA GÁ      SU3һ   VWT$ +G+HՅWHT$H؉T$;};}#3#   uEHȋD$_^][t3҃ 'A(vw06$6AփI  6$6B3B3B3B3BB3AփK  P7$07B3B3B3B3B	3BB	B3AփD3  7$7B
3B3fB
B3AփE   8$7B3B3fBB3AփI   x8$T8B3B3B3B3B3B3BfBB3AփEwi8$8B3B3B3B3B3AփIw)89$$9B3B3fBB3ø   ì44G5556U64 4444446 f55@555 5'5.56 s5e5l5y56  55556 f655555566 fK6/666=6D66 f}6o6v666 SVWу      E(4E*;vi+Ef;r@f;B;؅x=}4};s t_^[+Ѓ_^[   _^3[̃SVWx   _^[Nx   _^[VЄx    ʉ_^[ÍT$   L$_^[VWxG    _^S^xG    [_^Fȋс xG    ډ[_^F؋ˁ xG    [_^ËUn݄x3][G_^FȄx 3][G_^F؄x 33?3][G_^F x3][G_^F 3][G	_^U< 3ĉD$8ES]VuD$ET$0L$\$D$4D$84D$<XWu)VʍyAu+σu:tempuF^v>t0hL$        _^[L$83  ]ËF^vȉt$\$$D$(QAu+ʍAˉD$0Q Au+D$    A3ۉL$,ND  Fu+~8(     ǙRP	  Vt$WF  7<[t<'t<"t<`uNRu3t$Q:u   t$6u   t$WheL$$   3= tEpKt
PHW$)xIIWpKtPPW\$ut8t$$RD$D$   |$0L$\$,G$ÙRPtsD$4N$FD$FD$ St$(FQNFE  Wt$,vE  N<[t<'t<"t<`uN<[t<'t<"t<`uD$L$D_0D$^[3  ]t$T$t$L$t$t$̃SUVt$W33ҋD$~YvR| t5< u/LEÀ؋EǀE EŋuB;T$|t$ l$3L$xF   ,U(pF(x!F      F(YF(   xFF(YF(~u"F8 ux nu_F    3^][Én_^]3[U  SVu3W3\$|$,FN|$P9^ tQhFG_^[]PQPD$ hPeD$   j L$QNj h   j9tPpKt
PH\$S$)xIISpKt
PP\$\$S\$t$3DEt$@      |$9;u/hPNjUh-hS hhěj:U  D$@t
PHDH@  L$AL$2(  C L$3   j QD$(   SPjh  t$|$0:   |$:   :   t$0t$CNFCKNF   K         ΋                                 4hF$       rS9|$  |ƃ   Gt$D$@t
PPd  @t
PHKxt3f;   r   A@   PA$   9A  uD$$  u33Q%  =  uyuqt3	D$S|t	D$xW u`u3@΍QfAu+j AL$PD$(ěD$tt$ VP@  D$$L$׉C|I{$t$   C|    {$tT$,ty tT$WfD$ D$$|$ D$S$yW uu3ΞC$@t
PPE@@,tL$    9xu9Ht,@u3E@     x     u	   8ً;u4hPNjh-hZP hhějw3)  Gt
PH    |	    v	Ӌn53   t$rD$W uu	wH#t$֋违C3ۅ   uvvh)Fs   G@,txu98uH< @uOt$uVGL$V@XPt$,t.VX~^V$OIʋL$,F(Et$_^[]Ët$   ;u<hPNj9h-hZP hhějEL$,_^[]ËGt
PH    |	    v	Ӌ3   D$    rD$hW T$utSAEL$,_^[]QSUVWNF0    F4    tPY{(tAC(    _oCt
PH׋>Ct
PPU4Nt8w~F    F    tX= tEpKt
PHW$)xIIWpKtPPW_FF    F    ^][YVt$N8vd3= tGpKt
PHV$)xIIVpKtPP3^V3^̃SU3VW\$M8YtE   _^][ËAH@@      OB#ЋET$xmM;Mr;ust4:u't)A:ButA:ButA:Bt3xu9}}E   ]<t4;}@vWU8L$bu%\$E8E<Wt$Pf:  }<_^][ËD$_^][USVW}OT$ApAt$@P;Gt   _^[]3ۃG0\$_4B   A_WOP3T$@0D$GH|$t!R_PQL$IWtTGHOP    O     @    	u'" _u|$tT$GHOPt   _^[]Åu$O AO ;}W(DuAO ;|T$9Zu9w G |O8Yt^G   G uE u?D$x u5D$;}!G(fD  BuD$A;|;Ⱥ  Dڋ_^[]ËAH@@      Nt$B#ЋGT${   O;Mr ;ust4:u't)A:ButA:ButA:Bt3xt$u9w}G   3_^[]É_<O8t5;qvэL$V\$uO8AVt$ P7  w<D$4    Vj w$ #  Vj w(#  G     GWfD$ D$    @H0GpXD$@   uLu>D$ PD$Pu$G$Ӌ΃ P D$ PD$Pt܋G( P O4؋T$z+WBH@@      G J;W<  w8A#ȃrfD  ;usG  :u78  A:Fu&'  A:Fu  A:F
    |   D$ D$PD$PD$$9D$t;D$};O(D$T O$ӃT D$ PD$Pqt  D$ PD$P?D$D$D$D  9D$$L$ |;L$sG(ӃT D$ PD$PD$t33w ,G Gx UMSVW3D$   3D$    3ۋ@D$3D$UMt1t@tD$  N~%  =  u?u	NL$t
D$     D$Ft
?u~+tN   t>t3qD$    ]CT$pCPj t$ W Ѓ  NPD$NPKuЅ  D${   uC@x0  Sm_^[]ÅtxKs%  =  u>u	KL$t|$D$Ct
>u{+tK   t;t3i\$Ks%  =  u>uKL$trȉD$CuD$%t
>uC)tK   tt3	]pCT$uC       _^[]ËƙRP/ȃKu
A_^[]ËC@Pt$Q:2  _^[]UMVWApV0xEuQ8jjq<M03_^]ÅuOu*;0  A VMj jj{03_^]ËQ uA(ЋT"A$ЋTu,;uQ(Q$
R            t~tP   E   IH fPtj Qz3_^]É   @    fH3_^]ÅuAHQL T1 uKAHxD;F}?APE    fptRQ3_^]É   fHP_3^]̋D$H0P4D$P3̸,ø<    QRPh,( ZYภ<<<<<<<<<<<<w<m<c<Y<O<E<;<1<'<<<	< ======== =$=(=,=0=}4=s8=i<=_@=UD=KH=AL=7P=-T=#X=\=`=d=h=l=p=t=x=|========y=o=e=[=Q=G===3<)=; u  \{UuG  Ytu8  Yt]Ã}i  G  Uu!{Y]U]UE t3t tt3@0     uu   Y} P  Y] jhV  j /  Y   &  E]e = A     A   [  tM
  k    hhcG  YYu)  t hhG  YY A   2ۈ]E=   uC,	  > tVF  Ytuju6=3@]u  Y3Md    Y_^[j  jhO
  =3iH=3G}e   E}= Auk    	  % A e 9   j uF  YY#uE"   ƋMd    Y_^[Ë}u  YËu  j+  jh	  }u9==3   e t
t]1]SWu   u   SWuu   SWu  uu'u#SPu}  PYSVuj   tuHSWuBut5SWuD   $MQ0h[WuuuA  Ëe3uEƋMd    Y_^[UV5<u3@uuu^] U}uv  uuu] Uj uh	 P ]U$  j$tjY)>>>>5>=>f>f>f>f>f%>f->>E >E>E>>  >==	 =   =   jXk ǀ=   jXk  LjX Lh@Uj   ]U  j$tM)>>>>5>=>f>f>f>f>f%>f->>E >E>E>>==	 =   =   jXk M=h@UVuX   l^] a a AtlUVu%   ^] a a A`%UVFL  ` PEP
  YY^] ALPU  YUVFLP>  EYt
jVYY^] UM=hEP)  UMShhEP  ̋AuTUe Ee PE3EE`1E1EEPEM3E3E3Ë VWN@  ;tu&;uO@u
G  ȉ _^3@ h@(h@  Yø@ø@H$HHHUEVH<AQAk(;tM;Jr
BB;r(;u3^]ËVU  t d   AP;t3u2^ð^$  tC    PG  Yt2L  j    YU  u2N  uK  N  <  U  u}uuMPuUuu?  YY]  thAL  YQD  $D  j }N  Y  U} uAs    u2]M  u
j   Y]U=	A t]Vutub  t&u"hAoL  YuhA`L  Yt+20AAAAA A	A^]j   jhT  e MZ  f9   u]<     PE  uL  f9  u>E   +PQYYt'x$ |!EE 3Ɂ8  ËeE2Md    Y_^[U  t} u	3A]U=A t} uuL  uM  YY]øLU$  Sj$tM)j   $  j P*  |xffftfpflfhEEǅ  @jPEj P  EE  @E   E,j XۍEEۉEEPuuj   Y[Ã%$A SV;sW>t
׃;r_^[SV;sW>t
׃;r_^[hld5    D$l$l$+SVW 1E3PeuEEEEd    UEVt
jVYY^] U%(A $j
$  e 3SVW3ɍ}S[wO3ɉWE܋}EGenuE5ineIEE5ntelE3@S[]܉EEǉsKSuCE%?= t#=` t=p t=P t=` t=p u=,A=,A=,AMjXM9E|03S[]܉sKMS]   t=,A](A         (A      ty   tq3ЉEUEMj^#;uW(A    t; (A     #;uE   M#;u@5(A_^[33@39LUQQEVEEEVL" b RP  YY^ UVu^] UQVuu^ UVuH^] UMuhEP  UQEMSVXWx׉Ux-kË]t<J9X};~uuIUyB;w;wEM_p^PH[@H  Ue E3 MEEEE@ELhMEd    EEd    uQu  ȋEd    U@S}#  ugM3@   e Eh M3EȋEE̋EEЋEEԋE E؃e e e e܉md    EEd    E0 YME   EEEE+
  @EEMUEEEPE0UYYe } td    ]d    	Ed    E[UQSEEd    d    E]mc[ UQQSVWd5    uE#hj uuu8E@MAd=    ];d    _^[ UVuN3j Vvvj uvu   ^]UMVu	  H$N	  p$^]UV  u;p$uv  p$^]  H$;tHt	FE  UQSEH3ME@ftE@$   3@ljjEpEpEpj uEpu
   Ex$ uuuj j j j j EPh#  dE]ck 3@[USVWE3PPPuuuuu   E_^[E]jh HEt~8csmuvxupx tx!t	x"uUHtNQt)e RpJ   E1uuC   YYËet@tQp֋Md    Y_^[UMU] U} t2VW}7>csmu!~u~ t~!t~"t_^3]  pw  pC  U  @$tM9t@u3@]3]UMUVqxI
^]UVuW>?RCCt?MOCt
?csmtf  x ~[  H_3^]M  xvB  pC  C  UW=(A   }wwUfnp ۹   #σ+3offtftf#uf#ǅEЃSf#3+#I#[ǅD_Ut93   t;Dǅt G   ufnf:cG@L9Bu_ø#fft    #Ϻf#ufft@ft뽋}3كE8t3_UVuW}tN382FN38_^]US]VWE 3E   R ]Cs3 VPuEu  E{@fuZEEEECtiMGGHEt  MxHMuɄt. E    th V  VuE_^[]ËE8csmu8= t/h t5ju֋uEMY  E9xth V׋b  EVuXsM֋I  UW} tHtBQAu+SVYSk!  Yt7SVq@  E΃3@V*!  Y^[MA _]UVu~ t6!  Y& F ^]UESW} Et-tVQp ΋x^t
t @EEEPjjhcsm]}<_[ UEM;u3]Ã:utP:Quu]Uu@tV0P7   Yu^]  u2  u.    j   YU} u
     ]  ̋L$D$׋|$<  i          %,As	D$%   fnfp +ρ   vL$    $    ffGfG fG0fG@fGPfG`fGp       u%s>fnfp  rG   s   tb|GD$   tG   u   tt $        GuD$UEt=8AtPg  Y] U t'VuuP   Yj P  YYV^]	   =  Ã= u3SW5   YtuYj5   YYu3BVj(j[=  YYtV5   YYu3S5   YY3V  Y^WD_[hJq   Yu2h8APO  YYu   á tP   Yjhz3ۋEH
  8Y  Pu9   ux]}y t4AEtUEtH      GPQ7t=x       wpVC  uV> tQGP6YY@H9_u#tZtVwGPQoYYPV  t7t3j [C]E3@Ëe3Md    Y_^[:  jh<UM: }yze uVRQ]St!u4FPsYYjPvW}  FPsYYPvWS  EMd    Y_^[3@ËeU:  U}  S]VW}tu SWuHE,uuPdu$6uuWh	  F@PuW  h   u(suuWu  8tWP_^[]UdSVW}3WuEuEO  ȃMn  ;Oe  ];csm   {   { t{!t{"   39s   99p  +X#E@E  ;csmu*{u${ t{!t	{"u	9s  9ptb@EuSp	  YYu@}97+  Gh`<Lz    E@E;   ӋUUUM3}ЉEԁ;csm  {  { t{!t{"}  u$9G  u EWuQPEPyUăEE؉U;U   kM }jpEY9E   ;E   3ɉM9M   SB0EEu܉E}u܋}~$R7EP  u"SNMEAME;Mu+uEuu$u P7EPuuuuS0UMBE؃UM;U(}u$} t
jS%YY%=!rhG  utX}  uRtXMHGwS  YYt]&9Gv!8E   u$u QWuRuSz    x uf_^[U6  jSYYM1  h$EPSXKMHuuSVWuu  W<  P  06  U8S];    VW39xtFWH9pt3;MOCt+;RCCt#u$u uuuuS   EE}9x   u PuEuPEPUE܉EU;U   kM }jpEY9EN;EIMԋEHty u. @u)j ju$Mu Qj PuuuuSU0MBEUM;Ur_^[4  UUSVWBtvH9 tn}tua_3;t0C:utY:Xuut3+ttE tt tt3F3@_^[]USVWu  Y>M3U"9p u":csmt:&  t#;r
A    Bft&9q   9u   Quu;     9qu#=!r9qu;rhA t^:csmu:zr49zv/Bpt%E$Pu uQuuuRփ u uu$QuuuR 3@_^[]UVu^] a a AUEPAPYY] j<hhfEEe ]CEЋuvEPYYE@E@EpMHe 3@EEu uuuS]؉]e    uz  YËe``  uFEVu]S  ЉUFE3ɉM9Nv@k^;T]~(ku;T0ukND@EU؋U	AM;NrRVj SV  3ۉ]!]uEE       ËMd    Y_^[Ëu]EЋMAuYMȉHMĉH>csmuK~uE~ t~!t	~"u*} u$t vnYt} PVRYYj x ue   
Mj j H/1  UE 8csmu6xu0x tx!t	x"ux u3AH ]3]Ujuuu   ]jh@uuu(  ug@e ;uth   };w   GME   | t0QWu  h  uGt2  uuYËee uuE'   ;uu6Vuu  Md    Y_^[Ëux ~H/  USVuW   >3ۅ~qEӉ]@E@MEȋEME~8FEu1PluEMHEMEUEUu_^[&/  UuMU] UuMuU] UE@]USQEEEUuMm
  VW_^]MU   u   Q	  ]Y[ U= td   E   ;Ar;AvjY)]SVWT$D$L$URPQQhd5     3ĉD$d%    D$0XL$,3pF   T$4t;5   4v\H{ h  CQ	     Cd	  d    _^[̋L$A      t3D$H3Uhppp.]D$T$   UVWS33333[_^]̋j  33333USVWj RhQ8_^[]Ul$RQt$] VWA3j h  W/  tAr۰   2_^V5At kWAWܰAu_^UQQEWAE ;u3VuRS]V=MA0t;uF!4\O   UYAuǇ;]uU:3^[_ËƇtVuV̰t׋Uȇ
Uh   j u`u2Wu%jhu}3  tj j u`]3]UVhhhj tu^]^]%PUVh hh jut\^]UVh0h(h0jutT^]UVhDh<hDjJuutX^]UVhXhPhXjtuuuuuL^]Vcpt
**  UEMx   A]ËA]UEMH]WVt$L$|$;v;        s%    %,As	D$^_Ë3Ʃ   u%  %,A             svs~vf   te   foNvfo^0foF fon0v00fof:ffof:fGfof:fo 0sv   foNvI fo^0foF fon0v00fof:ffof:fGfof:fo 0svVfoNvfo^0foF fon0v00fof:ffof:fGfof:fo 0svrovfsvs~vf   tI   uу   $$D$^_ÐD$^_ÐFGD$^_ÍI FGFGD$^_Ð4< Q  %      t׃+ʊFGNOu   $̇D$^_ÐFGD$^_ÍI FGFGD$^_ÐFGFGFGD$^_   tINO   u   rh      ooNoV o^0of@onPov`o~pOW _0g@oPw`p   u r#  ooNO ututuD$^_̋ƃ   уtf$    fofoNfoV fo^0ffOfW f_0fof@fonPfov`fo~pfg@foPfw`fp      Jut_t!    ooNOv  Jut0tuȃtFGIu$    I D$^_Í$       ++Qȃt	FGIutvHuYSQ0   SQ0L$KCkUQPXY]Y[ ̋USWMG _t	A= C uCAV40  wSPHLHH	3  V7_3  P  ^uP  G_[] UVuW}FAw GBw +uu_^]ËU= C u)} u",        ]Ã} t]j uu   ]ËUVuu+      |  fW}u+      ]  FSuME􋘔   FG+uu} [t
MP  _^ËUU3AAAA$t
AB9 CuAAA] VWu	P   tw   p$ tw u   p_^ËV~ uf PFD3^ËF^ËUQVW Eu3GGGPEP0  YYu7D_^ËV> u	t^!  ̋U(   3ŉE}Wt	uYjPj Ph  0j P0ffffffEEǅ0  @EEE,j Puu}t	uYM3_ËUEA]ËU(Mj EPuuuuu   MËUVW}ut*\  t uuuuuփ_^]Ëu u4Au35 uuu.   3PPPPP@ËV3VVVVV-VVVVV   j$tjY)Vj VjVP ^SVL$T$\$tP+   t:uHt:Bv4u%  =  wڋ;uӃv#Ʃt3^[^[ËUQuE    E/  YËU]G/  ̃=L /  \$D$%  =  u<$f$ffd$/  e0  ̃=L R3  \$D$%  =  u<$f$ffd$!3  3  ̃=L 5  \$D$%  =  u<$f$ffd$5  E6  jh`1}uPh)  `  C=  uj<  Ge 7wP  M EQP  YYËeu  ̋VW7t%~ t	v~ t	vVz-  Y' _^ËUVr*  t>`  t4~ t"<  FttPFtt
uPluh̋UQVWjj6  3Wu,  tMEFFPQjp}M(_^ËUQQ} u$      3VuuEYYt,MQuPhӐuuduPM$  Y3M^ËMtEe Uu̋UVuub$  j^0SWj	Y}u=$  j^0-S39_|9rjX9G|?*Xv
$  j^0[_^G  E]P]];  Y  EP;  Y  EP;  Y  ы_ÃwnrAPwdE+ȍEPډMV][>  YYt9Et  VG  Ye  E)EEPUV%>  YY>F    ;  WV>  YY!} tVNG  YtEEF    E+j j<SW  y<ĉj j<SW  ڋFj j<SW  Fy<ĉFj j<SW  ڋFj jSW[  FyFj jSW  ȅ|&tFNj[NVHD|s>FNj[FVVхF   NFm  FV3SSSSS̋U]f̺I  ̃=L rJ  \$D$%  =  u<$f$ffd$AJ  K  U]rP  UEVQQ$dS  3YY+txHtrEzFzjrR  HYCDzjUR  @Yt$ QQ$SR  pYE^]UV3PPPPPPPPUI 
t	$uI 
t	$s ^̃=L R  \$D$%  =  u<$f$ffd$R  S  ̋U   3ŉEMS]VuW} u%t!      M_^3[覿]Åtۅtǅ    rIΉ3+@   ;'  7Ƌ;w/PVӃ~
Ɖ;vщ;t;+߉    RBDƈJu㋝+ϋ;`y  ǉ<0WVӋ ~M;t=I +׊
Fu PӋ~I;t7+Ѝ    vL2D2Nu닝RWӋ ~5؋;t-+ЊvL2D2Nu닅 ډ;v>$    ;s#WV ~BI ;wWVӋ ~ۋ$     +؉;vWSփً ;rJt++؊RLDJu답 ;;s<$    +ȉ;v!WQӋ tD$    +ȉ;vWQӋ tՋʋ+΋+;|=;sDA ;sD;st@;sϋ  vt̺A  ̃=L "T  \$D$%  =  u<$f$ffd$S  T  U]    U} u      x]uj 5Dl]ËUEj PJ  EYY]̺@  UQQEQQ$wL  YYt't-Ez$jK  HYE   uEDz5PAu#UW  EQQ$ZK  YYV  x̃=L X  \$D$%  =  u<$f$ffd$}X  X  ̺nA  ̃=L w[  \$D$%  =  u<$f$ffd$F[  V]  ̍T$h  W  ̺@  UEQQU$J  YYfwEEV3zFU5PAu(UV  QQ}E$I  YYfU  x^tËUEA]ËUV"   tuYt3@3^]jhe j !i  Ye 5 ΃35AΉuE   ƋMd    Y_^[Ëuj &i  YËUVu;utW>t
׃;uu_^]ËUVuW>tׅu
;uu3_^]ËUcsm9Et3]uP   YY]ËUQVW.  tʍ   ;t}99t;u3_^Åtytu	a 3@uًFEEFy   $Blb ;u  S^9wGt>9  t/9  t 9  t9  ub   X   Q   J   C   <9  t/9  t 9 t9 u            FPjYY^[a qYEFjhE0g  Ye M*   E   Md    Y_^[ E0g  Yjh=A    3@A3ۉ] u25 ΃uA;t3ΉuSSShC
uhC
  YE9uh$hdYYh,h(SYYG9uAG Md    Y_^[ËE  E3=csmMEËe2  ̋Ujh1d    P 3PEd    } u   t	u   YEE E܍EEEEe MjXEEEPEPEPR} tMd    Yu   ̋Uj   tuP up   Yutj 4t4MZ  f9u*H<ȁ9PE  u  f9Auytv    t22+  td0   Ihu2ËUjhd    PQV 3PEd    e EPhj pt!h,u̰tuփ} t	uMd    Y^̋UEA]jj j 7ËUj ju"]áAËUW}u3#  Vtt  j^0~  S0s  h  A3SVl  @FPFt; uAEuPEuPVVS   juu    uf  j^0/EPEPEPVS   uEH5HFDF3j   WE3PV]Sk  YYt
u  *Uˋ9t@A9uSDF]HF  YV]  Y[^_ËUQES]VuW# }    Et0E2ɈM?"uɰ"GM5tFGEPu  YttFGEtMu< t<	utF OE    < t<	uG   Mt1ME 3B3G@\t"u.uMt"uGM3҄EHt\Fut=} u< t3<	t/t%tFP-t  YtGtFGvt F4M_^[t! E ËUVu?s9M3u;s*M;vjP!  j   3^]ËU]Bu"9Btp   t	  uB3Ã=B t3V%p  Su  uPo  Y^WV   YuC3Bj E  V?  YY_^Ã=B t3Vu  uP  Y^WV  Yu C3Bj   V  YY_^ËUQQS]3VW<=tB΍yAu+FuBjPX   YYu
P  3fuRˍyAu+ύAE=t7jP    YYt>SuW[  uHEj 8ED  EY؊uj 1  Y_^[V@  j   j   33PPPPP̋US]VW3׉}ft5j=[f;tB΍yff;Eu+4NfuՋ]3BjPS  YYu
W  3uftjЋˍyff;Eu+j=AYEf;t8jP	  YYtESuWPq  uOE8E3P,  EYCfu3P  Y_^[V"   3S  S  33PPPPP̋UVutWP  YuV  Y_^]ËSVW=BtgtV3SSjPSSp  ؃tJjS1  YYtASVj73SSp  tSVv  SU  u3
V?  Y_^[j UE ;CtP8Y]ËUE ; CtPY]:j N  e hBE   $B5C5 C  jh諷e E0\  Ye M4   uE   ƋMd    Y_^[ uE0\  YËUSW]8u    V733υ      U}u;rT;Et3UȋȉEU ʃ @33;]]]u;EtuE뢃tV   Y  P P3^_[jkk  EEe MjXEEEPEPEP+  ̋UMu]Ë;Au AA3]$CPhC$CYðËV5 VV}V&x  VIz  V^j tYËUQh4FMs   ËV5xHx  5|H35xHe  5HF5|HT  5LF5HFC  5LF^ËU j Y+ȋE3 ]ËUVuuW9>t
6  Y>_^] hh@u  YY  T  ËU} t=tH t-|  ]hh@u  YY]ËUu  Y]jh0苴*  pte 3@ËeE   v  tjv  Y@t"j$tjY)jh  @jj̋UMVWtUt
uu   j^0_^]Ë+>Gtuu  j"3ԋU]N  UEuEtEt}   v]Á}w2]ËUEMUHt]ËUfMftf9tn      ] ̋UQSVWssEVPL{PHP  suWV  P  uP  C_^[]Ã9 u      2ðËU   MSVWt/}t=|$~3EP@@   3PPPPPMH  E>  EMe p0y EuE0EjV}  YYu]f-uf+uU2UUǅt:     E`  Ej  E  E  Ef	  Ep	  E	  E	  Ef
  Ep
  E
  E
  Ef  Ep  Ef  Ep  E  E  Ef  Ep  EP  EZ  E  E  E   E*  E@  EJ  E  E  E  ǅ|  ǅx  j0Yt	  f;f  f;ts
+N  f;4  Mf;>  f;urۋMf;,  f;urɋMf;  f;urMf;  f;urMf;   f;urMf;   f;urMf;   f;ukMf;   f;uUMf;   f;u?Mf;   f;u)Mf;r~f;uMf;rlf;uMf;rZf;uMf;rHf;uMf;r6f;uMf;r$f;|sf;xs-  u%ƃAr
ZwHHwLwɅu=JMxtXtuj_}PMuj_}1QU
uj
_}j0Y3f;S  j:Xf;s΃0;    f;  Ef;&  f;u  Ef;  f;u   Ef;   f;u   Ef;   f;u   Ef;   f;u   Ef;   f;u   Ef;   f;u   Ef;   f;ur|Ef;r~f;urnEf;rpf;ur`Ef;rbf;urREf;rTf;urDEf;rFf;ur6Ef;r8f;ur(Ef;r*f;urEf;rf;|f;xs
+ȃu*΃Ar
ZwAAwwU;s7Ej0;;}UًM1MY<VMuEtp3euVS^YYt@E@@"   u/MttE   %tEtދUtM
_^[ËUEu]ËMUVt2ftf;1u	+^]ËUM3;t'@-rAwjX]ÍDjY;#]Ëľ]ËUV<   MQY<   0^]ËUEVuPF$F YFF^]  uHÃ  uDÃjhP身E0P  Ye E  @H E   Md    Y_^[ E0P  YjhhE0{P  Ye E  HHtutQ  YE   Md    Y_^[ E0pP  YjhE0P  Ye j E 0  YYE   Md    Y_^[ E0P  Yjhp訪E0O  Ye MA 00  YYE   Md    Y_^[ E0O  YËUE3AjCHE xEP  EYj@HEfHlEfr  MEL   EEXEEEPEPEP&EEMjEEXEEEPEPEPËU} tu   u  YY] UExt
Qp  EYp<d  Ep0Y  Ep4N  Ep8C  Ep(8  Ep,-  Ep@"  EpD  E`  	  $EEMjXEEEPEPEPjEEMXEEEPEPEPËUVu~L t(vL)w  FLY;$Ct=Ptx uP?u  YEFL^tPt  Y]áLt!VP  tj 5L  V^ËSWLtPi  tX#zLjP  u3eVhd  j  YYu3S5La  SV5LR  u3S5L@  V  Yh$CVjj   ^WDt_[G̡LVtP  tttnLjP  tahd  j  YYuP5L  V7  Y8V5L  uP5L  Vh$CVj   ^̋SWLtP  tX#zLjP;  u3eVhd  jZ  YYu3S5L  SV5L  u3S5L  Vl  Yh$CVj W  ^WD_[ËULVW3tPj  ttynLjP  tfhd  j  YYuW5Lk  W  Y=V5LV  uW5LF  Vh$CVvj   i}d  _^]hOX  Lu2u	P   YáLtPe  LËUVu;$CtMP  u7t  ^]ËUEVu;$CtMP  ut  ^]ËUVu;4FtMP  uY  ^]ËUEVu;4FtMP  uY  ^]jh詤E0I  Ye $CPu(Ct9>tWVs  YYE   Md    Y_^[ E0I  Y3 C@ËUjXEMEEPEPEPbËU} t-uj 5DuVPrY0^]ËUVuw0uFx  t VoYtVj 5Dt    3^]j
$L3̃=L t2\$D$%  =  u<$f$ffd$u   $G     ÍT$F  R<$t6f<$t-=H F     F  YF  & u|$ u-z   t뻸   =H F     oy  ZU$~<$   ~|$ff(fTf.8  U  f/(snf/0  f(fYf(fYf(-fYfX-fYfX-fYfX-Yf(fXY\f|$D$f/    f(fYf(fYf(-fYfX-fYfX-fYfX-pfYfX-`fYfX-PfYfX-@fYfX-0Yf(fXY\f|$D$~fWf/sO~~-~Xfs,ff~؍@~,~\YX^f   ~~ ^f~Ű~$Ÿf(fYf(fYf(-fYfX-fYfX-fYfX-Yf(fXY\\\fVfD$D$f/uD$f/@sHH$$D$HHD$~~ fTf.zD$H D$Ð̃=L t2\$D$%  =  u<$f$ffd$u   $RC     ÍT$B  R<$tIf<$t-z=H ,C     P)C  -zͩ u1|$ u*-p   =H B     Pu  ZU$~$   fD$ff%f-00f=B  fYf-Xf\f(YfɁ v ?f(-fY\Y\fxf\fYf\f(5pY\fYfY\f(\fXX\YfYYfYfYfX-Y fX5`fYXXYXfXfh\\XHfYXXXXXfX΃Xfd$D$Iff=uYfD$D$fY\YfD$D$̃=L t2\$D$%  =  u<$f$ffd$u   $@     ÍT$=@  R<$tIf<$t-z=H l@      i@  -zͩ u1|$ u*-p   =H @      r  ZU$~$   fD$ff%f-00f=B  fPYfX-Xfp\f(`YfɁv ?f(-@fY\Yx\fxf\fYf\f(5 Y\fYfY\f(\fXX\YfYYfYfYfX-0Y fX5fYXXYXfXfh\\XHfYXXXXXfX΃Xfd$D$+ff%ff\fL$D$I UVutj3X;Er4uuFn  t VYtVj5Dt9    3^]hxhth@j   hhxhj  hhhj   hhhj   ËUQSVW}   M(C0t   lh   j S`udWu7jhSt#jhdSytVVS`u"U(C;}j3_^[ËUƍ(CtVދUESWxC 3Ѓ;u3QtIVuuYYtuP̰tV+Y j Y+3= ;3^_[]ËUVhhhjatuj% ^] UVh$h h$j!tuj% ^] Vt^3@^ËUVt'u(u$u uuuuuu uuuuuj u  P|^]$ UVhThLhjetuP^] UVh\hTh j&tu^] ^]%\UVhdh\h0j tu^] ^]%TUVhlhdhDj!tuu^] ^]%XUVhhhXjftuuuuuL^] UV-t'u(u$u uuuuuu uuuuuj u   P^]$ UVtuu	un  Y^] UVhhhjtu3^] VhhhjUt
^á Wj"YxC_ËU} u'V(C> t>t6& xCu^]ËUQV5 Du-d0   !uF@x |EP9uuj^θ D^ËUQd0   V3u@9p|EP}t3F^Dp  3D   DDDøDøDøDáDáDËUMu    跿jX]áD3]ËUMu    苿jX]áD3]ËUMu    _jX]áD3]ËUEV  WH+  jd__+^]ËUM%  yHuVjd^^ul    u]2]ËUVuuj^0贾!  Wj	Y}uj^0茾3OEM	|=@WrjZ;|=Xvj^0   SEE PEP   ]YYj FQ PuS褰  ȺQ N+؋E} Edu03@9J}@9|HFj +Q PNw7T  j}Yj   VPWS6    Fj +j<WS  f  Fk<+3[_^ËUQQE3SVW@j QPSE  FFPEYQ ȋƺ3u++}wE|s?3؋E HPwEYtEÀQ  w u_^[ËuVYtMU]Uj ME  9Pt3҅uB} t
MP  ËUSVE3PuY  9u  ]W{;=u;=^  95 D   Df95DuD3D@]uDƋ։u]D]D]D]DSu]uuuuRQWPVM  tD,nD]vD]xD]zD]]f95lDurD3=pD@Ƌ֋5rDuuuuVWRQsPj   ,XVVV3kjV@VP3kPWjV   VV3kVjVV   P3k
Psjjz   XK_;};|Q;M;~;}3@^[;|;;~;|.kC<Ck<i  3;u;5;53VVVVV蚺̋UQQe S]VWS@}}YEujt	4`4,SFYim  j6YkM+u;U} t	d0}u ;~t	4`4,u kE$<E(k<E,i  E0} u5_^[ãEP5YuAiM  y \&= \&| 3PPPPPZ̋UQQWlEWh   uPh  uEI"t3@EVP@Yu
P3!WuEVPah  tVj Y^_ËUuuj@u_  uPPj?uuuPPE   ]3PPPPP蜸̋USVW؉]{E3EuPuuYM  EPXY;  D}t1ff;uftfQf;Pufuދt1ύQff;u+M   PYu3PY_^[5DYω5DQff;Eu+WAPVC    uh   P6qh   3Pvaj@3P3Uj@3PsHj36Wx@3jXf9tuj-MYf;uj
EPWd  i  u+t	Af	wj:Xf;   j
EPWnd  uk<j0YMuf;r j9[f;wȋf;Es]j:Xf;u?j
EPWd  uuj0Zf;rj9[f;wf;s]j-Xf9Euމu3fEftEjspWPu0u0,3VVVVV
̋USVW3EuPuu4Y  EPY  EPY   5D5D$(D   k(D<3Af95nD5|D DUtk<Ef=D tDt+k<33ɾ   MVEj 3V3Vsj@V7j@VwX  V73h,D   @VwshD   u0u0u_0^[VVVVV谴̋U   3ŉEVW3P= DY+#tf98t	PYEV5YM_3^.|ËUj uj@uI[  uPPj@ujuPu@   ]3PPPPPjh$Du.j,  Ye $Du$DE   Md    Y_^[j-  Yjh萇e j,  Ye uYuE   ƋMd    Y_^[Ëuj,  Yƅp   
     hI -ٛݽ`aA      
{         Í$    $    ƅp[   
tD   "\  $    $    -@]  I -1c  )]  'c  ƅp\  3+c  at	(   @u[     
u
uU0Sٽ\}}PQRYJ  < mmZYXuZ  8   [ݕzUU0Sٽ\}PQRJ  < mZYXuY  88S   [ݕzU0Suu  uu  ٽ\8Z     [À8=H uOݕ0p
t<t[<t?
t3r   f\f uf tǅr      ٭\f6f%ftf=tCf6f%f=t0ǅr   s4,ǅr    vVWlCv8uuz{tu}]r\SPlCPka  _^EU0Suu   ٽ\8X  [USfEff%f=uff]E]E]mE[̃=L t2\$D$%  =  u<$f$ffd$u   $'     ÍT$&  R<$tmf<$ti&  =  ?s+=H &      &  w:D$% D$u)   -zt"&   u|$ u-p   =H j&      CY  ZU$~$   fD$f%ffWffs,f~    f #-  =     YɁ  \QfT׃   fU -fVf($ X\YYYX^f=f-x\fs?fs?YfpDf5YYfWYYXYXfpXXXfD$D$-  C  Y\QffsfT=pfsf%\YX\YfTfsffVՁ  Y< -Yf(@YY\X\Xf-x\Xf^ff\ Y%   YY΃YYXfYXfXfp\XfVfD$D$;  = 8  sjff(5ff(f(%fYfYfYfYYfXfYYfXfYfpXXfD$D$-;  O  Y\QffT=`fpDfT`f%\YXY\YY\\X\f(fp\XfpXYXfp^f(f(-f(fYfYfY%   YfYfXf(YfYf(@YfXfpYfYXfWfpYfpXf\XXX\\\\fVfD$D$ =     f~fs f~  ?+    fT$f~fs f~с      fWfW  fY=   fD$T$ԃT$T$$T  fD$fD$D$ff@fHXfUfVfD$D$fD$fWXƺ  tfD$fWf    rXfVYfD$D$ËUW}uuY$Vuu	WYv%    3^_]P  tVJYtVWj 5DtҋUS]t tttVtPE]  	EEjPZ  ^tA !   t/ "   []ËUQSVu  WV#f;u&u3f9Fuf9Fuf9u@   jX   u3f9Fuf9Fuf9t3  ++Ef3   j5Zf;3   FffNbfE0Vf#3ȉEfVfȃttufN3fFfN3fFf3f3fH_^[ËUMV  A#f;^uu3f9Auf9Auf9u@]jX]éu3f9Auf9Auf9u]3f]ËUQEjPY  uuËUQQEQQ$   YY txt	E   tcEzjHYDzjt@YU
  EeEËUEPY]̃=L t2\$D$%  =  u<$f$ffd$u   $R     ÍT$  R<$tmf<$t  =  ?s-=H      `  w8D$% D$u'   tr   u|$ u-p   =H      `O  ZU$~$   fD$f%@fPfWfHfs,f~    f #-  =     YɁ  \QfT׃   fU -fVf($ X\YYYX^ff-\fs?fs?YfpDf5YYfWYf\%YXY\fpX\\fD$D$-  A-  fs&fs&ffU\YXfV\Y\Q%   fTfsffVfnfp   Y< -YYY\fTX\Xf-\Xf^ffX YYY΃YYXfYXX%   ffpX\XXXfWfD$D$;  = 8     ff(5 ff(f(% fYf(-fYfYfYYfXfYYfXfpfYfp\fp\\\\\XfD$D$-;     fWfT=@f%Xf( Yf(\f( fpDQfYfpDffYfXffYYfXfpDYfTfYfTfpD\XY\\Yfp\^fXfYfpX%   ffpXXXXfWfD$D$ =     f~fs f~  ?+    fT$f~fs f~с      fWfW  fY:   fD$T$ԃT$T$$ K  fD$fD$D$ffnfp fffTfTXfD$D$ffXfD$D$fWXƺ  J̺6    z̃=L t2\$D$%  =  u<$f$ffd$u   $     ÍT$m  R<$tMf<$t-z؃=H         -z˩ u1|$ u*-p   =H J      #I  ZU$~$   fD$ff%f- 8f=  ff(fY-f( fXf(f\f-@ ) f(% fYكYfYf\fY0Xf(f\f5H 5fT-Pf(f\f^f\f(x\fYf\f(H0fYf(``fYXf(fYfX8fXH fYfX`PfXf(HpfYfYfXf(H@fYfXf(fYYfY   fYfXYfXfX\Xf   fX   YX   XXf=HYf   fTYY   \\   \Y\X\X\ǃXfD$D$?ff=~uYpfhYXYpf\$D$$    DÃ%D ;   &2   2d$ ƅp
t
tݽ`au2XE  -zÍ$    
t
t
tE  $        ؊ E  =L t2\$D$%  =  u<$f$ffd$uQ  $     ÍT$=  R<$tLD$f<$t-  t^   uA=H \     Y     uԩ u|$ u%   t-p   "   uŃ|$ u-   =H      D  ZÃ$     R<$D$tQf<$t)     u=H          u, u%|$ u  " u|$ u%   t-p   =H ?     D  Z̃=L t<\$D$%  =  u<$f$ffd$u   !U$~$   fD$ff(`f(5@f(pf(f%  @  +-<  Ё   (  fYfXf(f\fYf(%fYf(-f\f~ȃ?f\f(KfYf(fYfXYXffo5 ffo50ffs.fYXfVfX~  |  wYXfD$D$Ã|$fT$f f$,$+fo5f  fnfs4fV  fnfs4f$$ft$D$f$$$$f$l$f    s' t)Z   r+#rJwT$9r<      fD$T$ԃT$T$$A  fD$fD$D$=  s1D$=   sfY   fY   뉋T$=  w uD$=  uú  VD$%=  @sfD$XfD$D$ÍI =L t2\$D$%  =  u<$f$ffd$u  $T$D$   ÍT$X  P<$f<$t    T$     )          L$R    u=H I        =H ,      ?  ZÍT$  ztA1uZZ33% D$učT$|  D$%   =  uT$uutQ$\$qTN  Yat     CD$% D$؋D$%D$t=f   l$D$   t-t   "         -p   ٱ uٛuU$\$   fD$f= f0fTfs,f fVf%   %  Y<Of,Of(4S  +уʁ          fnffsfxfs&f fT% %   %  Y \Y, \fX4`fV%0XfTfsf fx\f=%  %  Y, hY hfX40pfT\XYYY\Y\XfL$f\\fxf\X\\f%  =      -?  º@  +-p<  Ё     \\f%xfTfT\fWҺ`@  fY\\YYf(@Y-Yf(PXfpX + -    ȃခ XXfY\fY\f(`f(5PfYfXfpYfW?  XfXf%pfnYT$Yfs-fpDf(=`XfYXffYYfYfXfYYfpYfpYYXŃXXXfD$D$fL$f@f~fTfs f~Ɂ           ځ  fs4fVӹ  fnfsfffffvfʁ      %   =     fL$fT$  fnfT@fs4ffffvf%    ȁ   r^ f f0&f|$fd$f~fs f~%=  r       ^      fWC  ff= f0Yf~fs f~ tRfTfT@fs,f fV%   %  Y<Of,Of(4S> \Ё uT$    t1#  fnfs f0fT$^ʺ   g  #    f fWfTfvfɁ         f       %   =   uefL$fT$  fnfT@fs4ffffvf%   =   t#fL$f%    tfL$f%      fL$f%      Xĺ  ]  fT$f~fs f~ҁ¹     ffYɺ     fd$fT$f~ u fs f~  ?     uf fWfTfvf%   =   uUffd$%     у     tf%  =?  rf%  =?  sXº  Yf~fs f~f0    t0f~   %=  wr wfD$D$ÃfD$T$ԃT$T$$6  D$Ã ~(=   <  VЃ     W?  &=   VЃ     W    XX fY\fY\f(`f(5PfYfXfpYXXf%pfnʁ  fW?  fYT$Yfs-fpDf(=`XfYXffYYfYfXfYYfpYfpYYfnfs-fnfvfXXfTXfWfvf\XfTf_\XXÃ N^YYXYXf%     =      fD$D$^XYYXf%     =      fD$D$ffnYfs-fV       tfYefYTfpDfYf%  @  +-p<  Ё   !=   r ɀ fnfs-fD$D$fd$f  ?  f3%    -KËT$   fT$l$é   t        ËB%  =  tËB
  D$B
D$$,$
    BËD$%  =  tËD$f<$t,$Zf$f=tf tf t   2  Z,$ZÃ$D$%  $D$%  t==  t_f$f=t*f u!f t   t[2  Z=2  Z,$Z   s   v떋VWD3j h  Wt(FP  r۰
j    Y2_^ËUkEDP]ËV5(Ft kWDWܰ(Fu_^ËUkEDP4]ËUE;Ev]]ËUVuWuu}  3~~~   3> uu9~uj  ujF3fWWjVj	uh  uPɭY 4};GvPa  u wwjVj	u$  tHG3_^]ËUSVuuu  3ۉ^^^3   3f9uu9^uj  u|FSSSSjVSu2   uPYk HW};GvPr  u2wMwVu  uP֬Y* HG3_^[]ËUQuEPuupËUE Vuj^0艄G    3!MS]W3M}tVMfE*?QPE "@  YYuEP3PP3  utMQP3  uu}Mً+C3>BEBuE+U@E;ujPS֛uP߳YM  x]EЉU;tN+ǉEAEAu+MAP7EE+EPR+?  u3EU8UU;uE03PbYMJ  3_[^3PPPPPY̋UQMQAuW}+ʋAЉM;vjX_SV_jS輼YYtWuSV>  uPu+ߍ>uSP~>  u7]  3EtV迲uYC0CW訲Y^[3WWWWW訂̋U   3ŉEMUSW};t#</t<\t<:tQWJ>  YY;u㋕<:u G;tR3SSW  3</t
<\t<:u+At؉xV|#pPtPWSSSQ#|SPu.SSWD8t|qYK  A+lMPPPPl#8.uHt*.u8Xt pWPhuy8t蹰YPVMl@+;th+jPPzV8t|XY358t@YV8t|%Yh^M_3[HËVW7;wt6Y;wu7VY_^ËU3PPuujuPu   ] V~ tv误YF ^ËUVW}FVWP_   t
f F 	F3~_^] UVW}V?PFP    t
f F 	F3~_^] UuZYM]ËVW~9~t3r> u&jj蟸j tFF+>vjX5Sj?S61  uj^NF3j 莮Y[_^ËU]UVuuM   3   S3f9u%u9^uj      F3^uSSSSjVSu   uPYF HW};GvP;   u2wMwVuuP豥Y HG3_[^]ËV~ tF j"Yf F ^ 38AtAAAAËU,   3ŉEEh  QPxuP&Y3UME ƅ /PPPPwM3DjhPPE0Ye M*   E   Md    Y_^[ E0YËV  Q @HPQ5,Fw     Q @H  PQ50FX  F   uF 8t0)YFBH @H ^ËUE-  t(ttt3]á ]á]á]á]ËUMj w%8F Eu8F   ,u8F   uE8F   @} t
MP  ËUS]VWh  3CVP8\ss{  3ΫDA  |튆3  F   |_^[]ËU    3ŉESVuW~    Pv   3ۿ   È@;rƅ Q;sƄ @;vuSvPWPjS!  SvWPWPW  S8  @SvWPWPh     S8  $NjX+ƋUt	t	 È   BA;rbjXjZ+֍N+jZ+։3ۿ   w	A w
	 AÈ   A;ǋrɋM_^3[XAËSQQUkl$8  VWss+  sNKEIH;Au3  h   6EYuP   s   PvHuʍ    YY;u    EP蚨   { uVC@H0NuCxHt	pHgYE    KAHKP  u9CEMjCEXEEEPEPEP@{ t
C j Y_^][jh0L3u}P  t9wLt	wHtmYjYuwHu];3t'tutV虧Y3wHuE   뭋ujYËƋMd    Y_^[̀=<F u<4F0F,F裣h4FPjj<FǢh4FPYYËU$ 3ŉESVuWu؉]Y  3ϋǉM9    A0M=   r     P     ;u&F  ~f~~3~VkX  EPSt~h  FWP9W^}  u} Et*Ht#8;wV+A
Bu8 u֍F   @uv3  G]9=8F      h  FWPVkE0E܍E8 t;At1;w^ځ   sBAC;v9 uȋEGEr]S^F   0  E܍Nj_fRfIuV3YM_^3[ =ËUVuu3mEuj^0tSW}t9urVWP=j36uj PUu	֜j9usȜj"^0htjX_^]ËUuMoUEMLuMtE Pu33@} t
MP  ËUjj uj ]PFTFËUUVWtMtuu3fj^0s_^]Ë+>fftuu3f֛j"3̋UE5  ;w(te*t`=+  v=.  vR=1  tK=3  tDM)=  t=  v=  v*=  t#=  u؋MuuuuQPp]3UE  SVWr;t;t25  ;w#tI*tD=+  v2=.  v6=1  t/=3  =  t!=  v=  v;t;tM3ɋ}$##u tt' RVuuuuQP_^[]ËUUW3f9:t!Vʍqff;u+Jf9:u^B_]ËUQQV   SV3+SSSSPVSSE$EuV3RWPYSuʡYV31SuWuVSS uW衡S虡YV_[^ËVu^SWV+ރS蜡YYtSVWfj HYV_[^ËUS]Vu`    L  Wj=Se  EYY  ;  HEE  5B3ۅ   B9]t-t)Ōu        5BXf9]  u)jj8SB|9Bt5Bu%jjSBS5BttM+QPML  EYYxL9tH4YMf9]tE   DA9ujQVm  SǅtYQf9]   ؉EH;?jQV+  S裟ME\5B9]   ȍQff;u+jAPE	YYuSJLuuVFuoE@F3fAE#PVuGV *   YW%VYW3S    ϞY_^[SSSSSn̋UQQW}u3_3ҋǋʉU9t@A9uVAjP7YYtotXS+ߍQff;Eu+jAPE;3PG<; t/7u4;;u u[3PY^eč3PPPPPn̡B; CuP/YBËUSVW=Bt-]SPu,  uX=tftu+_^[]+U]FUVutj3X;Es螕    3BS]WtSzY3uVSlYYt;s+;Vj PN_[^]ËUHEP0f}    S]   V3CƉE    ;|V-  XHY;~W3tYEtDt?Tt6uQt#ǋσ?k8EXF BDB(EGE;u_^[ËSVW3ǋσ?k84XF~t~tN(uF( ttjjjXP؃t+t'St^uN(@)u$N(N(@FtHt
@G[_^[jhp?jY3ۈ]]SG,  Yun]E   ËMd    Y_^[Ê]jYËV3XFtP+  XF Y   rݰ^ËUSVW};}tQtӄt;uu;ut.;t&~ ttj YF;u2_^[]ËUVu9utW~tj Y;uu_^]jh>e E0Ye 5 ΃35dHΉuE   ƋMd    Y_^[ uM1YËUEHt-t!	tt	t3]ø`H]øhH]ødH]ø\H]ËUkE;tU9Pt	;u3]ËUjXEMEEPEPEPËUE\H`HdHhH]j$h~=e e Muj[;t7Ft"Ht)HuGtt
~61V>}u]  7VYYu,    h؍x2ɈM}܃e tjYMe E e ?t 3= ϊM}؃Euq   ;t
tu(EHMԃ` ;u@@E@   E;u"kkM;ta  M܉E)   } ud;u.輓pSY#j[u}؀} tjVYVY;t
tuEMԉH;ugMЉH3Md    Y_^[ÄtjYj|̡ 3lHȅËUElH]ËUV5 35lH΅u3uY^]jh2;E0  Ye uv0[  YYt2F8 u @$t0  YtF FE   Md    Y_^[ E0R  Yj,h:E0Ye 5tHpH}u;tOE7P   YYt7WO}}ĉEȉM̉UЋEE܉E؍EPEPEPM}E   Md    Y_^[ E0mYËU e Ee MEEEEjEXEEEPEPEP} EuEËUEtHtQ   u	E 2]ð]ËUE$<uEu	E   t]2]ËUMSVWq$<uItD9Y+a ~3Q  uWSPt0  ;tjX	tjX!3_^[]ËU(MVW3Va}uVY0EPWfYYuGtWE  P'  YYtMa_^jYápHVj^u   ;}ƣpHjPj tHB=tH u+jV5pHٝj tH=tH u^W3j h  F P財tH4ǃ?k8XFDt	tuF8Gu_3^ËV'2  3tH42  tHY Pܰu5tHk%tH Y^ËUE P]ËUE P4]ËU(AVW   Mt!EA;t3f9t;u+j  уj X+#ЋE;sЋu<Q3;tf9t;u+;-  E<N+ɍFuu ;uEF;t3f9t;u+w      Mt'EA;J3f9?;u3уjX+#ЋE;sЋu<Q3;tf9t;u+;ukE<N+WɃFfufu;uEF;t3f9t;uUʋE4B;t3f9t;u+_^]ËUQSVW}
  ]   ? uE   3f   u~ u%FHM  u#VhHSWu	1        39   uM   f f9H}TFH~#;|39EPuQWj	u+uF;Xr tF@EFF*   |39EPujWj	ut3@3҉HH3_^[ËUEu聈     `]Ë@]ËUQQfE  Vfuf;tG   f;sȡH#/fE3fEEPjEPj1  tE#3^ËUE@H|t   t   t   tVjH(^yt	ty t
Qtu   L  Y^]ËUQSVuW   tl=teF|t^8 uY   t8 uP     YY   t8 uP     YYv|Ԏ   ɎYY   tE8 u@   -   P觎      +P蔎   +P膎   {      YjX   E~(tt8 uPC3<YYE tGt8 uPYEEuVY_^[ËUMt(t3@   @]ø]ËUVut!(t   uV7  V謍YY^]ËUMt(t   H]ø]ËUEtsHH|t	   t	   t	   t	VjH(^yt	t
y t
Qt
u   ZY^]jh1e 衈xLP  t7u=jYe 5$CW=   YYuE	   t ujYËƋMd    Y_^[7|̋UVuWt<Et58;u-V0YtW YuPtWY3_^]ËUQڇHLMMQP赊EYY@ËUVu   F;tPYF;tPӋYF;tPYF;tP诋YF;tP蝋YF ;tP苋YF$;tPyYF8;tPgYF<;tPUYF@;tPCYFD;tP1YFH;tPYFL;tPY^]ËUVutY;tPYF;tPڊYF;tPȊYF0;tP越YF4;tP褊Y^]ËUEVuW<6臊Y;u_^]ËUVu   jVFjPF8jPFhjP   jP   (         jPd   jPVD   jPE  jP7L  jP)T  辉X  賉\  訉`  蝉(^]ËUQMS]VuWuu9ut*证j^0OY_^[ÅtEt߅u	3f3u3f+ىuыufRftԃu&fRftEtEuufuuE3jPfTAXs3fj"XU]'U 3ŉESVWuMS]uEX339E WWuu   PSE   EH;#tq=   wL  t  PmYt	  ƅt=uWV9uVuujSoȃ$ƅtuQVuP%   Y} t
E䃠P  Ǎe_^[M3ËUEt8  uP蘇Y]áH̀zuf\?f?f^٭^剕lݽ`ƅp a$  ؃PRQYZX#zuf\?f?f^٭^剕lݽ`ƅp Ɋaݽ`ɊaŊ$׊$
  ؃PRQYZX#  ɍ$    I ؍$    $       ÐtؐÍ$    d$ ۽bۭbi@tƅp ƅp ɍ$    $    ۽bۭbi@t	ƅp ƅp Í$    ۽bۭbi@t ۽bۭbi@t	ƅp ƅpÐ-pp ƅp
ÍI -
t
t
tUEEEEE	UE]MEMEMEMPQRv  Ef}tmËU =H VWt5Lı'E      etPjY+t:t)t  Ew  MEw?  Ew   MEw$  E   Ew  tT	tC9  EwEϋuE    E] E]P]Y   E      EwE      tAt3	t%t-  t	   E EwEwE4xEwEϋuE    E] E]P]YuQu{ !   DE   EwEϋu E] E]P]Yu/{ "   E_^ËUSVW3   ;+jU4u$  ty^~;~Ѓ_^[]ËU} tuYx=   s	]3]ËU,MVj /OjuQQuuPrEPsMԋIO^ËUQQVWnt`} tZu3҉UNff;u+8ʍAEff;Eu+M;vf<r=uVuR  tu3_^Ëpjh0%e jYe uuuu2   uE   ƋMd    Y_^[ËujYËUQQS]Vufyj^0Q   u3W}Etut4yj^0PRt3fuYt8ʍAEff;Eu+MAt;vj"XRVWu3_^[3PPPPPP̋U]ƅp
uJ$    $    ƅp2+  at@u
tF  t2t-ƅpݽ`aAuƅp-
uS
uq   
uu
tƅp-u
t"Xݽ`au-
tƅp-ƅp
u--ٛݽ`aAuݽ`aݽ`ٛuٛt   ø       VtV$$vH  ft^tËSQQUkl$    3ŉECVsW|t)t tttuljj
jjj_QFPW   uGKttteEF]EFPFPQW|PEP"  h  |&  >YYttV0Yu6%  YM_3^x][ËUW}uE!8V  Wm  YM#^3_]ËUQEtNSVWPH  j??  M1M  ###PE  uV&  ;_^[t3@3ËUSV@  3W}#Jf;u   f@u      f;tދǹ `  #t%=    t= @  t;u         ׹   %   #Ћ#     _^[]ËUQSVW}   ǋ؉U#ڋ   j ^   t	;tuE       #t"=   t=   t;u   	   ׋ǃЃЋǃE_^[ËUM   ##;t]ËU VWjY3}ueE%?  P	=(AY}3]M  Q6YЋȃ? ы?ы   _^ËUM?E]ËUQV3WfE}Uȃ=(A}3
]}?׋ǃЃЋǃȃ׋_^ËU Vu?ыWҍ} j ЋЋЋX j3YuE?Ee?΋ƃj Ƀ ȋƃȋƃȋƃX _΃=(A^|]E?EUU$~$   fD$    f(ffs4f f( Kf(`Kf(%Kf(5 KfTfVfXf %  f(f(ЍfTf\fYf\XfYf(fXƁ         *f
        Df(Kf(f(KfYfYfXf(KYf(-0KfYf(@KfTfXfXfYYfXf(ffY˃f(fXXXfD$D$fD$f(pK f  wHt^  wlfD$f( Kf(`KfTfV f  tKú  Of`K^fK   4fKY/    s:fW^ɺ   fL$T$ԃT$T$$D$fT$fD$f~fs f~с  t  릍d$ UQQEQQ$o   YYuJEQQ$H   EYYDz+pQQU$%   EYYDzjX3@3ËUE    9Mu;} uuz   AE      9Eu;} u5z   AE      9Mu.}    EAsE{b\9EuY} uSEQQ$EYYыAuu zuE3]ËUQMS]VuWuu9ut(0mj^0D_^[ÅtEt߅u 3u+ىuыuBt܃u BtˋEtEuuuuEjPD X lj"oU]>UV3PPPPPPPPUI 
t	$u
t$sF ^ËUj uu   ]ËU} ul    C3Vuul    C9ur3EuM>MVy tJ9Uw
Du+փ+J} t
MP  ^ËUQQ 3ŉES]VW~Su  Y;YX|؋M$uE @ȉE$39E(j j Su   PQtEm  H;#O  =   w07  t  PsYt	    uWSuju$	   u3PPPPPVWuu胀؅t   Ut8E    ;~   3QQQPuVWuuG؅   ׍H;#t};wo6  tp  P@rYt[  tN3PPPSVuWuut43PP9E u!PPSVPu$؃ tVYu u3VY>33VYÍe_^[M3	ËUuM<u(Eu$u uuuuuP$} t
MP  3ɄËU= C VuH} uCi    @>} t9uvi    @^]  j uuu   ^]ËUW}u3   } uh    m@   } tV;vh    C@auM;EWu   uu  &Wuh  P  uQh    p} t
MP  ^_ËUQQSVj8j@y3ۉuYYuK   ;tAW~ Sh  GPq}Og8_̍GG  

G
_ֈ_;uɋu_SoY^[ËUVut%S   W;tWܰ8;uVJoY_[^]jhPM}    r!fgj	^0?ƋMd    Y_^[3uj4YuXH}9E|94XFu1XFuj^uE   뢡XH@XHG뻋uj"YËUEȃ?k8XFP]ËUEȃ?k8XFP4]ËUSVuWxg;5XHs_Ƌރ?k8XFD(tD|t=|  u#3+tt
uPjPjPjȱXFL3!f 	   f  _^[]ËUMue  e 	   Cx';XHs?k8XFD(tD]e  e 	   P=]jhpn3uE0YuE 8ǃ?k8XFD(t!WOYPu.e0:e 	   uE   ƋMd    Y_^[ uM1BYËUVuud 	   YxE;5XHs=Ƌփ?k8XFD(t"EuEMEuPEPEPd 	   2<^ËUjhd    Pt 3ŉESVWPEd    EЋu?]k8u]ĉUXFMDEEƉE̱{ Eu\Cu@E3EЉU;E  }3ۉ]}  EϋE]E   XFM4  .8t@A|}+Eԅ   EM.E  @E+EԉE;  MԋuD=GF;|}~WERP0Mԃ}ӋuXFǈ\.B;|uċuEEM3]}Q]@PEԍEPEP
    EEU AM;  u3]]MU@QPEԍEPEP
    EE}H   d-tD.uĈEEd-EjPFE
@ f9H}/BE;E?  učEjRPeM  EujREPE-  ESS@jEЍEPuԍEPSu Eȅ   SMQPEPu$   UЋ+MFEFE9E   }
u<jXSfEEPjEPu$   }   FFFUЉE;Uoy~&EЋuԋUXFъCL2.M;|u~J~uEXFΈD.C;|׋E
L.EXFL8-E@FƋMd    Y_^[M3 ̋UQSVu3W}EǉE;s?SJ  Yf;u(F
uj[S2  Yf;uFF;}r_^[ËUQSVuWVU  Yt`?k8XF|( }Gu~ uXF    uXF|) tEPXFtбt2_^[ËU  ,   3ŉEMU?k8S]XFVWDMщ3;ss;sA<
uCFFE;r䍅M+j PVPW$tC;rM;rM_^3[ËU  )+   3ŉEMU?k8S]XFVWDMщ3u;s%
uCj_f>fE;r׋+Mj PVPW$tC;rM;rM_^3[ËU  @*   3ŉEMU?k8SVXFuWDM3;   P;s!
u	jZffM;rj j hU  QP+PPj h  u tQ3ۅt5j +QPP$t&;rˋ+EF;FM_^3[jhuuE@$`  @@	         ;5XH   ƃ?k8MXFD(toVY}3ɉMXFUD(uE@@	   @$H uuuV^   }E
   6u}VGYËEP3QQQQQ@$H @@	   3Md    Y_^[ËU0MEEMS]VW}  u*3C$SPPPC PCPC   2  ǋ?k8uXFEЉUD)E<t<uШtE3D( tSjVVW  SWYYt@Et#<  uEuPN   SuEuWPaEXFE|( }OE+t5t   uEuWPuEuWPuEuWP׋L}3VEPuuQ$u	Eԍuԍ}॥EuhEt,jY;uCC	   C$K SPYYY3EMXFD(@tE8tCC   C$s W+E3_^[jhe j諪Ye j^u;5pHtYtHtJ@$ttH4  YtEtH PܰtH4aYtH$ FE   EMd    Y_^[jaYËUVuW~t%tv`Y!3FF_^]ËUMuX 	   8x$;XHs?k8XFD(@]X 	   903]PYËUM9 u3@y ujX38A] UQuEuuuP  ЃwM  v  EtfËUQQ} SVW}?   ]utkWMeuuPEWP  Ѓt^tQM  v+v3   KM
     f   fu]+u;g33fE8E@@*   FWM3]tǃuFMWFSuPWj   uCC*   _^[ËUuuuu]ËUMu3]S]VW}Bw 3Fw +u	tu_^[]ËUE tjt3@]ètjtjX]]ËSQQUkl$    3ŉEVs CWVPs   u&ePCPCPsC sPEP
  s s^Y7t)t%CV\$\$C$sW  $W  $  V  CYYM_3^n][ËU$3AS]VtMtQw  Y*  #Etj^  Y     E   j<  EY   #tT=   t7=   t;ubM{LHM{,2MzMzo  f  E\  EW #}D/  EPQQ$  U U}
3@   AuE   E	e 2EE2ɃE MfE;}B}+}܋]σMt	uCEE}t	   }muщ]]}܃} EtUU܋}Uu8MtKt=   t=   u/E4E} t} uEt}܃U EEEMtjI  Y_tE tj 2  Y3^[ËUj uuuuuu   ]ËUE3S3CHEW  HEHMtE  	XtE  HtE  HtE  HtE  HMVu3A1AM3A1AM3A1AM3A1AM3A#1Az  tMItEHtEHtEH tE	X   #t5=   t"=   t;u)E!MME    #t =   t;u"E MMEM3 1E	X }  t,E` E EXE	X`E]``EXP:MA A E EXE	X`M]A`A`EXP  EPjj W<MAt&At&At&At&At&ߋ t5t"tu(    %   %   ! tt	u!#   	#   }  ^tAPAP_[]ËUEtwO "   ]O !   ]ËUM 39`t'@|e h  u(   uE ËdEtՋEEEEEEEVuEE h  u(EE$uE.   EP蹿uV8YE^ËUQ}EËUQQ}MEf#M#EffMmEËUMt
-]t-]t
-]t	؛ t]ËUQ}EËUQue EPEYYËUQQE]EËUfM  ff#f;u3EQQ$}  YYttt3@]jjX]ø   ]Ɂ   fuE u} tɃᐍ   ]EDzɃA@]Ɂ   ]ËUEVDz	3   Wf}ǩ  uzMU uthپS3AuCEuɉMyMNEtf}U  f#f}[t	   fEEj QQ$1   #j QQ$       _E0^]ËUQQMEE%  ]  fMEËU}  Euu@]Á}  u	ujX]fM  f#f;uj  f;uE utj3]ËUM38t;Et@< u]ËUVu~VuYYE~PuYYtt3QQQPuVuuu"`+uj^	^]áHËUQQVuWVY;uE@@	   ǋQuMQuuPԱuuPPKYYϋEU#;tËE΃?k8XFd1(_^ËUuuuuud]ËUQ9  tEPEjP\  tfEø  jhuuu#E@@   P3WWWWW"@F$Vt'  Y3}Y}uV3   YY}E   ǋMd    Y_^[Ëu}VYËUVuu#EP@@   3PPPPPw![FWtBuV袼VuVYP4  YYy~ tvQf YVS  Y_^]ËU(MVj oEPuYYM؋^̃=L t2\$D$%  =  u<$f$ffd$u  $   ÍT$轘R<$tLD$f<$t-  t^   uA=H ܘ    ٘   uԩ u|$ u%   t-p   "( uŃ|$ u-   =H p    IZÃ=L   \$D$%  =  u<$f$ffd$   ~D$f( f(f(fs4f~fT@ffʩ   tL=  |}f=2  fL$D$f.{$  T$ԃT$T$$D$~D$ff(f=  |%=2  fTXfL$D$Pf0fTf\$D$ËUE  ` E]ËUE  ` E@@*   ]ËU( 3ŉEMES]VuMEWuH33Bu7%}؋ME3f9FuxAMx1tÉ3?  M#} }ujX#  $<u$<u$<   jY+Ȉ}J#%~ǊN,<      :   E܋E9EsE܉E}+}};}s'E@EE$<u~Ã?ЋE9Er;EsfFE*fF,   r  v< w4E   E   E   ;TrtV#UR(	uV1YYM_^3[RUWVSMtMu}AZ I &
t'
t#:r:w:r:w:uu3:t	rً[^_3PPjPjh   @hXX Ë u 3á ttPËUVj uuu5 رu-u"sVuuu5 ر^]jh9e E0pYe M8qǃ?k8XFD(tVW   YYFF	   uE   ƋMd    Y_^[ uE0YËUVuuE`  @$@@	   txK;5XHsCƋփ?k8XFD(t(EuEMEEEPEuPEP(E3PQQQ@$QH @Q@	   n^ËUVW}WYu3NXFu	   uu@`tjjYY;tWYPuW.Yσ?k8XFD( tuVnBYY3_^]ËUE3ɉEHEHEHEHEHEHE]U$~$   fD$    f(ffs4f f(pf(f(f(%f(5fTfVfXf %  f(f(pfTf\fYf\XfYf(fXƁ         *f
        Df(0f(f(@fYfYfXf(PYf(-fYf(fTfXfXfYYfXf(`fYf(ffY˃f(fXfXXXfD$D$fD$f( f  wHt^  wlfD$f(pf(fTfV f  tú  Of^f   4f Y    s:fW^ɺ	   fL$T$ԃT$T$$D$fT$fD$f~fs f~с  t  릍$    ̋UQQSV  Vh?  EYYM  #QQ$f;u=HYYwVSSEaES\$$jj?UED{ uS\$$jjVSEYY^[%%%%% %$%(%,%0%<%@%D%H%L%P%T%X%\%d%h%l%p%t%x%|%%%%%%%%%%%%%%%%%%İ%Ȱ%̰%а%԰%ذ%%%%%%%%% %%%%H   t&   H@HuhHj  D  áHS3CV;tcu[h4u*hV̰thěVH̰tףHκH3
u;t;2^[tV5HhH^úH󐡴Hu3A
uËU@EjPuujY)EDtEVWEP}čW#E#UJ#u33ҋȋEt3	u_^ U<  SVWt  vD  t:        3tB;r	z;rF(;r3_^[] E8EJ$B   UQQVEPEPpuE    C=H u!E   H   ujY)uVuuuVܱujY)^ UQH   t"R-HuEP5Hc   tV5HhH^H    ËU4SVWNM   E$   MЋAYǋQߋq]y   E؉}y}}}3   }܉}}}}u$ẺE&EPjWhW m<3  E;+EЃE܍  uМ3EtE̋PVӋ\  М   tE̋PjӋua3SSuuN=ܛEtE̋Pj׋u%ẺENEPjSh~ m<E   MǇ;uWМ}tE̋PjӋ   E39Xt-9Xt(G<<8PE  uM9L8u;|84uuE4u^uW̰uN5ܛEtE̋Pj֋u%ẺEEPjSh m<)uE0Мte EPjˉ}u8_^[ UE3SVWH<AYt}p;r	H;r
B(;r3_^[]Ujhhld    PSVW 1E3PEd    eE    h   |   tTE-   Ph   Rt:@$ЃEMd    Y_^[]ËE 3Ɂ8  ËeE3Md    Y_^[]UEMZ  f9uH<ȁ9PE  u  3f9Q]3]ËMd    Y__^[]QPd5    D$+d$SVW( 3PuEEd    Pd5    D$+d$SVW( 3PeuEEd    SVD$uL$D$3؋D$Aȋ\$T$D$ud$ȋD$r;T$wr;D$vN3ҋ^[ SD$uL$D$3D$3Pȋ\$T$D$ud$d$r;T$wr;D$v+D$T$+D$T$؃ [ WVS3D$}GT$ڃ D$T$D$}GT$ڃ D$T$uL$D$3؋D$A؋L$T$D$ud$ȋD$r;T$wr;D$vN3ҋOu؃ [^_ SW3D$}GT$ڃ D$T$D$}T$ڃ D$T$uL$D$3D$3OyNS؋L$T$D$ud$d$r;T$wr;D$v+D$T$+D$T$Oy؃ _[ ̋D$L$ȋL$u	D$ S؋D$d$؋D$[ ̀@s sË333̀@s sË3Ҁ33QL$+ȃY   QL$+ȃY   QL$+#ȋ% ;r
Y $-    U=(AM}4ftVf;utfu^3f;UH#]fUfnp fp %  =  w"	(fufuffujf;tftjX3f93]Ë]UQ=(A|f} t	} uT]E?t?  u  é  t*  u  é  u  é   u  ø  ËE̀@s sË̃=(A|~bz~yË̃$$T$Ɂ  As<,Ë 3  }S3t,[Á  Cst؃ wt,   3̃=(A|ny"bW*W*YXX̃\$D$%  =  Y  <$f$ffD  f$    f(ffs4f f(f(Pf(% f(5fTfVfXf %  f(f(ЍfTf\fYf\XfYf(fXƁ         *f
        Df(f(f(fYfYfXf(Yf(- fYf(0fTfXfXfYYfXf(ffYf(fɃXXXf$fW f  wLtb  wpf$f(f(PfTfV f  tfú  OfP^f   4fpY=    s<fW^ɺ   fL$T$ԃT$T$$ұfD$ f$f(f~fs f~с  t  f$k$~$̃=L    \$D$%  =  u<$f$ffd$    ~D$f(f(f(fs4f~fTffʩ   u"=  |Yf=2  fL$D$D$~D$ff(f.zf=  |!=2  fT\fL$D$f fV fTf\$D$ËUQQSV  Vh?  VEYYM  #QQ$f;u=HYYwVS&EaES\$$jj?UED{ uS\$$jjVSEYY^[̍Mx̐T$BJ3̍M騆̐T$BJ3QJ3G̍Mh̐T$BJ3J3H̍M(̐T$BJ3J3tB̍MM̐T$BJ3J3̍M騅MM阅̐T$BJ3AJ37̍MX̐T$BJ3J3r̍MMM̐T$BJ3J3L"̍M8̐T$BJ3qx̍M阄M鐄̐T$BJ39J3/̍MHM@M8̐T$BJ3J3b̍MxM ̐T$BJ3J3̋MŜM̐T$BJ3cP̐T$BJ3>t̐T$BJ3̐T$BJ3y̍镟̐T$B3J3<̍M̐T$BJ3̍H%MM饂tMMMMzMr̐T$B<3J3̋T2M*pTT(TPxTdMMʚMh   EPËMM8MPMhMMwMoMgM_̐T$BH3J3M8M頝MM ̐T$BJ3J3l:̍Mؙj$EPËMăΙMM鮙̐T$BJ3gJ3]̍MMMMp̐T$BJ3J3̍M(jEP1ËMă̐T$BJ3J388̍MMPMhM̐T$BJ3yJ3o|̍MM̐T$BJ39J3/̍M̐T$BJ3|̍M(̐T$BJ3J3B̍M~M~̐T$BJ3J3<̐T$BJ3^t̍M~̐T$BJ31J3'h̍`鵚M-M5~MM%~xM~̐T$BT3J3)̍MM}M}M}M}̐T$BJ3aJ3W̍M̐T$BJ3!<̍M(̐T$BJ3hl̍M̐T$BJ3<̍M̐T$BJ3J3̍x酗jpEPÍM|̐T$Bx34J3*̍M(̐T$BJ3(l̍M̐T$BJ3T<̍MȖ̐T$BJ3̍M{M{M{̐T$BJ3QJ3G̍MH̐T$BJ3̍l饗M-{"M{̐T$Bl3J3,1̍@EMMzM`MM=M5MzMzM_̐T$B<33J3)P̍X鵖M-M5z|M"zpMz̐T$BH3赿J3諿&LҒMyMLL$)MjPEP蚿ËMʙMr̐T$B@3(J3 ̍MHL魕M%M-ylMyMM
yMMx̐T$B@3蠾J3薾̍M騑j4EP豾̐T$BJ3RJ3H̍xeLʔMBMJxlM7xMM'xMMx̐T$B@3载J3賽4.̍MȐM`Mw̐T$Bt3nJ3d̍MDxj4EP聽j4EPrÍMDRj4EP[ÍMD;MD3MD+j<EP4j4EP%ÍMM̐T$BJ3趼Jx3謼'̍MvMv̐T$BJ3yJ3ox̍M̐T$BJ3A̍Mh̐T$BJ3jEP9̐T$BJ3ڻU̍MZM`MxMu̐T$Bx3膻J3|@̍M8ZMM(Mu̐T$Bp36J3,̍M8YMMM@u̐T$BJ3Jx3ߺZ̍MMjLEPËM)Mэ̐T$BJ3芺J3耺̍MLMMtMM}t\MjtMMZt̐T$B@3 J38q̍MM逐MM t̐T$BJ3詹J3蟹̍MX̐T$BJ3q̍xujDEP莹ÍM~s̐T$Bx3$J34̍x饏随s̐T$B3ŸJ3軸p6MMj̐T$BJ3胸̋x颋Mr|鏋xx fx<MPjPEPYËM鉒M8.M&MM̐T$Bp3̷J3·=̍MMPMhMq̐T$BJ3yJ3ot̍M鈊̐T$BJ3AJ37̍MXq̐T$BJ3J3r̍MM逍MM qMMp̐T$BJ3虶J3菶
̍MM M8Mp̐T$BJ3IJ3?d̍helʌMMJpMM:pMM*p̐T$B`3еJ3ƵA̍MoMo̐T$Bx3膵J3|h   EP覵ËMx#M   酈M   w̐T$BJ3 @̐T$BJ3ly̍M阋M MM<MHoM<MHn̐T$BJ3衴J|3藴̍M鸿M ̐T$BJ3Y̍Mhj$EPq̐T$BJ3J30̍M(nM|MnMnMn̐T$BH3讳J3褳Tj(EPɳj(EP躳j4EP諳ËM|j$EP蔳jEP腳̐T$BJ3&̍M8j$EPA̐T$BJ3J3زS̍MM`MxMl̐T$BJ3色J3H̍XM鍿MlMMlMMul̐T$BL3J3l̍M騈j$EP1ÍM̐T$BJ3ʱJ3;̍MXj0EPÍM̐T$BJ3zJ3p̍Mj8EP葱ÍMq̐T$BJ3*J3 X̍M鸇j4EPAÍM!̐T$BJ3ڰJ3аK̍MhM0MHjMpMHjM `MHj̐T$BJ3qJ|3g̍Mxj4EP聰ËMayMYj4EPbËMByj(EPKj(EP<j(EP-j$EPj(EPÍMj4EPËMx̐T$BJ3葯J3臯̍M阼j4EP衯ËMxMyj4EP肯ËMbxj(EPkj(EP\j(EPMjEP>j$EP/j(EP ÍM j4EP	ËMw̐T$BJ3袮J3蘮̍x镃jPEP议ÍMh̐T$Bx3DJ3:\̍MXh̐T$BJ3J3rT$BJ3ڭUT$BJ3轭8T$BJ3蠭T$BJ3胭lT$B|3cJ3YtԿ                                                                              @  b t           " : V h |          . : P X h z         * 8 F T b r          
   2 J X n         * H \ p        	 "	 2	 Z	 f	 t	 	 	 	 	 	 	 	 	 
 $
 4
 N
 Z
 n
 ~
 
 
 
 
 
 
 
 
 $ 4 B T d t                             M*        Ծ_rN+            node.exe        =>^]]Unknown exception   ^]]bad allocation  T^]]Uc^]]8^]]i^]]bad exception   X   d   l   x	   
   
      	      	   ̶	   ض	      
      	   %              $   (   ,   0   4      8   P   S   D   4   L   H   L   P      8      T      X   |l   \   `   d   h   l   p   t   x   |                        	   	         ȷ                 @   `      #   ĸ          $&   L   h   x   |      #      	   ̹   ܹ      %   @$   h%   +      غ    "    (   L*   x            %    Ļ   ػ         (   %    S   L   l   d   8      D   __based(    __cdecl __pascal    __stdcall   __thiscall  __fastcall  __vectorcall    __clrcall   __eabi  __swift_1   __swift_2   __swift_3   __ptr64 __restrict  __unaligned restrict(    new     delete =   >>  <<  !   ==  !=  operator    ++  +   &   ->* <=  >=  ()  ~   ^   |   &&  ||  *=  +=  -=  /=  %=  >>= <<= &=  |=  ^=  `vftable'   `vbtable'   `vcall' `typeof'    `local static guard'    `string'    `vbase destructor'  `vector deleting destructor'    `default constructor closure'   `scalar deleting destructor'    `vector constructor iterator'   `vector destructor iterator'    `vector vbase constructor iterator' `virtual displacement map'  `eh vector constructor iterator'    `eh vector destructor iterator' `eh vector vbase constructor iterator'  `copy constructor closure'  `udt returning' `EH `RTTI   `local vftable' `local vftable constructor closure'  new[]   delete[]   `omni callsig'  `placement delete closure'  `placement delete[] closure'    `managed vector constructor iterator'   `managed vector destructor iterator'    `eh vector copy constructor iterator'   `eh vector vbase copy constructor iterator' `dynamic initializer for '  `dynamic atexit destructor for '    `vector copy constructor iterator'  `vector vbase copy constructor iterator'    `managed vector copy constructor iterator'  `local static thread guard' operator ""     operator co_await   operator<=>  Type Descriptor'    Base Class Descriptor at (  Base Class Array'   Class Hierarchy Descriptor'     Complete Object Locator'   `anonymous namespace'   ha p i - m s - w i n - c o r e - f i b e r s - l 1 - 1 - 1   a p i - m s - w i n - c o r e - s y n c h - l 1 - 2 - 0     k e r n e l 3 2     a p i - m s -          FlsAlloc           FlsFree        FlsGetValue        FlsSetValue       InitializeCriticalSectionEx                                                                                                                     	   m s c o r e e . d l l   CorExitProcess          '    D0A    UYN##            u    ^                                 	               	      
                                                !      5      A      C      P      R      S      W      Y      l      m       p      r   	      
      
      	                  )                                             Y  *         $08@HPXdlx         4HXlt| 0DTh|Sun Mon Tue Wed Thu Fri Sat Sunday  Monday  Tuesday Wednesday   Thursday    Friday  Saturday    Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec January February    March   April   June    July    August  September   October November    December    AM  PM  MM/dd/yy    dddd, MMMM dd, yyyy HH:mm:ss    S u n   M o n   T u e   W e d   T h u   F r i   S a t   S u n d a y     M o n d a y     T u e s d a y   W e d n e s d a y   T h u r s d a y     F r i d a y     S a t u r d a y     J a n   F e b   M a r   A p r   M a y   J u n   J u l   A u g   S e p   O c t   N o v   D e c   J a n u a r y   F e b r u a r y     M a r c h   A p r i l   J u n e     J u l y     A u g u s t     S e p t e m b e r   O c t o b e r   N o v e m b e r     D e c e m b e r     A M     P M     M M / d d / y y     d d d d ,   M M M M   d d ,   y y y y   H H : m m : s s     e n - U S           atan                        -DT!?-DT!RUUUUU?        vF$I?ɿ3YE?#Yqn?;
9 /I?hKd?81UH!G?#$0|f?KRVnTUUUU?        ~I$I?gɿHB;E?q{雮?x֚                         ?       @       @      ?      ?      @>1|MC              sin             UUUUUUſ      ?UUUUUU?*llV4V>>m0_$@      8C  `a=  `a=  @T!?sp.c;      `C      <?             ?      cos             UUUUUUſ      ?UUUUUU?*llV4V>>m0_$@      8C  `a=  `a=  @T!?sp.c;      `C      <?             ?              P0|4p`(a p i - m s - w i n - c o r e - d a t e t i m e - l 1 - 1 - 1   a p i - m s - w i n - c o r e - f i l e - l 1 - 2 - 2   a p i - m s - w i n - c o r e - l o c a l i z a t i o n - l 1 - 2 - 1   a p i - m s - w i n - c o r e - l o c a l i z a t i o n - o b s o l e t e - l 1 - 2 - 0         a p i - m s - w i n - c o r e - p r o c e s s t h r e a d s - l 1 - 1 - 2   a p i - m s - w i n - c o r e - s t r i n g - l 1 - 1 - 0   a p i - m s - w i n - c o r e - s y s i n f o - l 1 - 2 - 1     a p i - m s - w i n - c o r e - w i n r t - l 1 - 1 - 0     a p i - m s - w i n - c o r e - x s t a t e - l 2 - 1 - 0   a p i - m s - w i n - r t c o r e - n t u s e r - w i n d o w - l 1 - 1 - 0     a p i - m s - w i n - s e c u r i t y - s y s t e m f u n c t i o n s - l 1 - 1 - 0     e x t - m s - w i n - n t u s e r - d i a l o g b o x - l 1 - 1 - 0     e x t - m s - w i n - n t u s e r - w i n d o w s t a t i o n - l 1 - 1 - 0     a d v a p i 3 2     n t d l l   a p i - m s - w i n - a p p m o d e l - r u n t i m e - l 1 - 1 - 2     u s e r 3 2     a p i - m s - w i n - c o r e - f i b e r s - l 1 - 1 - 0   e x t - m s -            CompareStringEx             LCMapStringEx         LocaleNameToLCID       RoInitialize       RoUninitialize     AppPolicyGetProcessTerminationMethod       AppPolicyGetThreadInitializationType                            T Z                  i~@sinh         88pcosh         @88tanh        ! 88                         @              asin                  8C      8C\3&<-DT!?                         UUUUUU?333333?m۶mۦ?颋.?333333?qq?UUUUUU?ONđ?m۶mۦ?$rxxx??           ?       9B.@  ׽2b                     ?   ?                               <        acos                  8C      8C\3&<-DT!?\3&-DT!	\3&<-DT!	@                                         UUUUUUſ333333m۶mۦ颋.?333333?qq?UUUUUU?ONđ?m۶mۦ?$rxxx??           ?      ?       9B.@  ׽2b                    7fmod         9988998 9 9@9 99999tan             m0_$@m0_$@      xC      8C @DT!?  DT!? @gg2  LL#F=J47ࢨ:Esp.:3gg2=      ?                       `C      <      <              atan2        p 99 9 9@9 9  99log             sqrt                                                                8C      8C      0<      0<+eGW@+eGW@  B.?  B.?:;=:;=ѱt?ZfUUU?&WU?{?      ?       9B.@  ׽2b                       0<  0<dWdWpow       ?          8C      8C        ?      ?1gU?k?wNo?ł?9B.?      @G                                                               ?5h!>@                   @              $0<Hj a - J P   z h - C N   k o - K R   z h - T W                                                                                                                                                                                                                                                                                         ( ( ( ( (                                     H                                                                                                                                                                                                                                                                                                                                                                  	
 !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ 	
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~                    ( ( ( ( (                                     H                                                       (                                                                 0                   u k                        5h!?5h!?      ?      @       U?wB%K=      ?   [?(6Ng=      ?   $?V`t >      ?   տ?2n{a>      ?   ?M=      ?   H{?{4r>      ?   Pא?"">      ?   u[?*>      ?   ?G0_(>      ?   4wb?i^^?(>      ?   0?p3>      ?   @?FM>      ?   8M?BV>      ?   d?}Ba.>      ?   ȴ?d>      ?   g?ߊ>      ?   @?f\*>      ?   ~e?-f>      ?   ]%?D	G?>      ?   ?\>>      ?   X?1#>      ?   E?h>      ?   ??ⳇ>      ?   ?$	49>      ?   x8?k0H<>      ?   ?rش8>      ?   8fm?"m>">      ?   ħ ?[<c'>      ?   k?"%>      ?   ?݉@fR8>      ?   ?T:>      ?   T!?3&F>      ?    ?<[#>     ?   %?Y:/(A6>      ?   ?N2>     ?   8O?r!'	>      ?   r?8{K>     ?   p?9l9$>      ?   
G?aj	i9>     ?   T|?'\|#<>      ?   $?}dj#>     ?   Wn?׈MVx:>      ?   ,?18o,>     ?   D$?	c/
>      ?   @ |?x7|1>     ?   |?9>      ?   p #?IAu=>     ?   s?x ٴ4>      ?   p?edf&.>     ?   ,?fA>      ?   h*?v2>     ?   $gN?RE\K>      ?   q?'^IE>     ?   DΒ?&aH>      ?   L?&KrQF>     ?   ,?#/'>      ?   إ?]Xc?>     ?    ?Ԯ}>      ?   e.?IdWA>     ?   K?ΐ?>      ?   Xg?4*A>     ?   _?[ǆJ>      ?   ?10H>     ?   ?hc#]G>       @   ,*?Qx
F>     @ @   p?ekR.N>      @    ?Ӿn@>      @   b?O>      @   $Q/?CJO>     @@   E?G>     @   [?3E{A>     @   Tp?SfIS:>      @   X΅?B6)1<>     @@   3?>ځ7>     @   $?s(N>     @   @?V
6f=>      @   (?{>     @@   (W?-Jg >     @   ?"aPK>     @   xm?,Sڤ6>      @   ?6hb">     @@    -?k,<>     @   X>?0=>     @   O?׀IXH>      @   -_?
@>     @@   n?2E>     @   P~?=ő8>     @   lj?[j&,>      @   L7?x82>     @@   ?c#VB>     @   0?7ڨ.Y>     @   P?[p&>      @   ؔ?h4MA>     @@    ?Epl E>     @   +?o$E>     @   h?\*K>      @   ?-?B>     @@   P8?(l|@>     @   p!?u@J>     @   @p-?V1>      	@   89?5>     @	@   <D?ƀ7>     	@   h)P?R`DOG>     	@   T[?9% K>      
@   Mf?/<>     @
@   q?Ò?>     
@   {?42G<>     
@   L?Â|/>      @   Y?s
@>     @@   k?Òa@>     @   XS?x(3u8>     @   ?vO,ib>      @   ȥ?&L͒C>     @@   ?}L>     @   X?Lo>     @   x?-Ϡ9>      @   s?6FID?9>     @@   8J?gsL>     @   d?y>     @   ?>&09C>      @   ?
<A>     @@   (J?IV	C>     @   `w?^@N>     @   ?#%@>      @   s? MK>     @@    D'?ήQ->     @   .?9!G>     @   6?.1>      @   >?.1NcB>      @   cE?sǔ1>     @@   LL?nHN>     `@   HS?W$>     @   8Z?
Ȃq;>     @   a?N/[7>     @   (h?=mC>     @   0oo?H75M>      @   Hv?P.#>      @   |?G7>     @@   *?#42I>     `@   ?ooJ>     @   ?-#>     @   ?h%F>     @   @?Rx^D>     @   PP? s@>      @   4L?P_!
#>      @   4?:#G>     @@   L?qg:&J>     `@   Hɹ?5L$.4>     @   \w?!1C>     @   ?[<>     @   D?<=     @   ?
~=      @   y?B>      @   ?~.4>     @@   h?u|8>     `@   E?A8yL;>     @   h?41C>     @   {?-+oF>     @   $?xO>     @   s?՝mT2>      @   W?=>      @   -?î\=>     @@   ?\==     `@   ?j\&">     @   X?1D>>     @   ?#O#`I>     @   ?}0>     @   ?F\IE>      @   t{#?ׯ,B>      @   0'?E ]$>     @@   ,>,?ކ?5>     `@   0?iIqE>     @   4?ha;>     @   9?AD>     @   .=?̤KFw=     @   DMA?=      @   `E?apI0H>      @   gI?:->     @@   cM?%Q>     `@   @UQ?Ly5ښoE>     @   ;U?vg0/>     @   Y?jvUG>     @   \?yK>     @   ,`?A%My>      @   md?H>      @    h?pM>     @@   0k?k}<>     `@   ho?f7O>     @   r?}O>     @    v?+iI>     @   @z?bB'=>>     @   `}?ZM>      @   ?1M>      @   a?R~=     @@   t?QNT	B>     `@   x?W3cL>     @   g?+(=     @   D?qJK>     @   L? ;,*>     @   8!?D>      @   ,O? E>      @   Du?in]D>     @@   ?%3F>     `@   P?^F"VM>     @   ?}30}->     @   @?~F	y;>     @   ?l	R(>     @   躰?\7`>      @    ?dg;>      @   ?;Sv@E>     @@   <|?M>     `@   Y?|};2>     @   ,0?<vG>     @   $ ?̯/p">     @   ?\(0>     @   |?[s$F>      @   I?dӔV>      @   T?0)LK>     @@   h?)5G5>     `@   XY?|zJ>     @   @?W޾L?>     @   0?6:>     @   <3?QB>     @   x?7o/M>      @   Q?KcZ0>      @   ?z-A5>     @@   Z?"BDcI>     `@   ?`I.>     @    L?Ld%>     @   ?"l"w =     @   (??!>     @   ?j^J>      @   8? ϞH0>      @   LL?%C>     @@   T?J+N>     `@   d?;l>0>     @   B?^{v@>     @   Ȋ?@Y˕B>     @   @ ?Tl0>     @   ?w4n4>      @    G?oN=;>      @   h|?L{/>     @@   <	?Bnu5>     `@   ?`,+>     @   d?5>     @   $?l  >     @   C?~+^M>     @   ^?PKQD >      @   ,u?^{#tF>      @   |?^4K >     @@   ?4O
>>     `@   ?XEړ J>     @   ?(gԹ,>     @    ?43-spF>     @   "?P`E5+*>     @   $?=QQD>       @-DT!?\3&<                              ?1mm.s,)?   '>      ?ii<?   mb      ?Z".?   u      ?ϕk|c}?   ,g      ?ysh:;8]+?    ^<      ?ty[gſh9;?    %<      ?SͿ	%L?    jh<      ?2y?;f?    4݋      ?Xw$3?Ak?    ł      ?暳s?)f?   09<      ?N,J8?   v      ?uZEeuF2k?    Wt<      ?-v1?-VA?   `<      ?gY\ϗb?    bu<      ?P/Ye&%ѣ?   @}      ?              ?                P/Ye?&%ѣ?   @}      gY?\ϗb?    bu<      п-v1-VA?   `<      пuZEeu?F2k?    Wt<      N,J?8?   v      ࿇暳s)f?   09<      Xw$3Ak?    ł      2yʿ;f?    4݋      S?	%L?    jh<      ty[g?h9;?    %<      ysh:?;8]+?    ^<      ϕk|?c}?   ,g      Z"?.?   u      i?i<?   mb      1mm.s?,)?   '>                                    1mm.s?,)   '><      i?i<ȿ   mb<      Z"?.ҿ   u<      ϕk|?c}ؿ   ,g<      ysh:?;8]+޿    ^      ty[g?h9;    %      S?	%L    jh      2yʿ;f    4݋<      Xw$3Ak    ł<      ࿇暳s)f   09      N,J?8   v<      uZEeu?F2k    Wt      -v1-VA   `      пgY?\ϗb    bu      пP/Ye?&%ѣ   @}<                                    P/Ye&%ѣ   @}<      ?gY\ϗb    bu      ?-v1?-VA   `      ?uZEeuF2k    Wt      ?N,J8   v<      ?暳s?)f   09      ?Xw$3?Ak    ł<      ?2y?;f    4݋<      ?SͿ	%L    jh      ?ty[gſh9;    %      ?ysh:;8]+޿    ^      ?ϕk|c}ؿ   ,g<      ?Z".ҿ   u<      ?ii<ȿ   mb<      ?1mm.s,)   '><      ?                         	   (
   0   8   @   H   P   X   `   h   p   x                                     !   "   \#   $   %   &    '   )   *   +    ,   (-   0/   86   @7   H8   P9   X>   `?   h@   pA   xC   D   F   G   I   J   K   N   O   P   V   W   Z   e               H    $  0  <	    H  T  `  l  x    $  <                            !  ,"  8#  D$  P%  \&  h'  t)  *  +  ,  -  /  2  4  5  6  7  8  9  :  (;  4>  @?  L@  XA  dC  pD  E  F  G  I  J  K  L  N  O  P   	R  	V  	W  $	Z  4	e  D	k  T	l  d	  p	  |	  0  		  	
  	  	  	  	  	  	  	   
,  
;  $
>  0
C  <
k  T
  d
  p
  |
	  

  
  
  
;  
k  
  
  
  
	  
      (;  4  D  P  \	  h
  t    ;    	  
      ;    	  
  $  0;  H   X	   d
   p;   |$  	$  
$  ;$  (  	(  
(  ,  	,  
,  0  	0  
0   4  ,	4  8
4  D8  P
8  \<  h
<  t@  
@  
D  
H  
L  
P  |  |  a r     b g     c a     z h - C H S     c s     d a     d e     e l     e n     e s     f i     f r     h e     h u     i s     i t     j a     k o     n l     n o     p l     p t     r o     r u     h r     s k     s q     s v     t h     t r     u r     i d     b e     s l     e t     l v     l t     f a     v i     h y     a z     e u     m k     a f     k a     f o     h i     m s     k k     k y     s w     u z     t t     p a     g u     t a     t e     k n     m r     s a     m n     g l     k o k   s y r   d i v       a r - S A   b g - B G   c a - E S   c s - C Z   d a - D K   d e - D E   e l - G R   f i - F I   f r - F R   h e - I L   h u - H U   i s - I S   i t - I T   n l - N L   n b - N O   p l - P L   p t - B R   r o - R O   r u - R U   h r - H R   s k - S K   s q - A L   s v - S E   t h - T H   t r - T R   u r - P K   i d - I D   u k - U A   b e - B Y   s l - S I   e t - E E   l v - L V   l t - L T   f a - I R   v i - V N   h y - A M   a z - A Z - L a t n     e u - E S   m k - M K   t n - Z A   x h - Z A   z u - Z A   a f - Z A   k a - G E   f o - F O   h i - I N   m t - M T   s e - N O   m s - M Y   k k - K Z   k y - K G   s w - K E   u z - U Z - L a t n     t t - R U   b n - I N   p a - I N   g u - I N   t a - I N   t e - I N   k n - I N   m l - I N   m r - I N   s a - I N   m n - M N   c y - G B   g l - E S   k o k - I N     s y r - S Y     d i v - M V     q u z - B O     n s - Z A   m i - N Z   a r - I Q   d e - C H   e n - G B   e s - M X   f r - B E   i t - C H   n l - B E   n n - N O   p t - P T   s r - S P - L a t n     s v - F I   a z - A Z - C y r l     s e - S E   m s - B N   u z - U Z - C y r l     q u z - E C     a r - E G   z h - H K   d e - A T   e n - A U   e s - E S   f r - C A   s r - S P - C y r l     s e - F I   q u z - P E     a r - L Y   z h - S G   d e - L U   e n - C A   e s - G T   f r - C H   h r - B A   s m j - N O     a r - D Z   z h - M O   d e - L I   e n - N Z   e s - C R   f r - L U   b s - B A - L a t n     s m j - S E     a r - M A   e n - I E   e s - P A   f r - M C   s r - B A - L a t n     s m a - N O     a r - T N   e n - Z A   e s - D O   s r - B A - C y r l     s m a - S E     a r - O M   e n - J M   e s - V E   s m s - F I     a r - Y E   e n - C B   e s - C O   s m n - F I     a r - S Y   e n - B Z   e s - P E   a r - J O   e n - T T   e s - A R   a r - L B   e n - Z W   e s - E C   a r - K W   e n - P H   e s - C L   a r - A E   e s - U Y   a r - B H   e s - P Y   a r - Q A   e s - B O   e s - S V   e s - H N   e s - N I   e s - P R   z h - C H T     s r     B   @,    q             $   0   <   H   T   `   l   x         C            ()      k   !   c      D   }          8E      DG   P      \H      h   t   I         A          J   (                               ,   8K   D   P   0	   \   h   t                                             (   4   #   @e   0*   Ll   &   Xh   8
   dL   P.   ps   @   |         M         >      7      H   N   X/   t          Z   P   O    (   j      $a   X   0P   `   <   HQ   h   TR   H-   `r   h1   lx   :   x   p   ?      S   p2   y   %   g    $   f      8+   m      =      ;      `0       w   u   $U   x   0   <T   H      T   6   `~      lV      xW                  X      Y   <         v         [   "   d       0   @   P   `   p      \                        ]   x3   z   @      8       9   ,      8^   Dn      P_   5   \|   \    hb      t`   4      {   '   i   o                      F   $p   a f - z a   a r - a e   a r - b h   a r - d z   a r - e g   a r - i q   a r - j o   a r - k w   a r - l b   a r - l y   a r - m a   a r - o m   a r - q a   a r - s a   a r - s y   a r - t n   a r - y e   a z - a z - c y r l     a z - a z - l a t n     b e - b y   b g - b g   b n - i n   b s - b a - l a t n     c a - e s   c s - c z   c y - g b   d a - d k   d e - a t   d e - c h   d e - d e   d e - l i   d e - l u   d i v - m v     e l - g r   e n - a u   e n - b z   e n - c a   e n - c b   e n - g b   e n - i e   e n - j m   e n - n z   e n - p h   e n - t t   e n - u s   e n - z a   e n - z w   e s - a r   e s - b o   e s - c l   e s - c o   e s - c r   e s - d o   e s - e c   e s - e s   e s - g t   e s - h n   e s - m x   e s - n i   e s - p a   e s - p e   e s - p r   e s - p y   e s - s v   e s - u y   e s - v e   e t - e e   e u - e s   f a - i r   f i - f i   f o - f o   f r - b e   f r - c a   f r - c h   f r - f r   f r - l u   f r - m c   g l - e s   g u - i n   h e - i l   h i - i n   h r - b a   h r - h r   h u - h u   h y - a m   i d - i d   i s - i s   i t - c h   i t - i t   j a - j p   k a - g e   k k - k z   k n - i n   k o k - i n     k o - k r   k y - k g   l t - l t   l v - l v   m i - n z   m k - m k   m l - i n   m n - m n   m r - i n   m s - b n   m s - m y   m t - m t   n b - n o   n l - b e   n l - n l   n n - n o   n s - z a   p a - i n   p l - p l   p t - b r   p t - p t   q u z - b o     q u z - e c     q u z - p e     r o - r o   r u - r u   s a - i n   s e - f i   s e - n o   s e - s e   s k - s k   s l - s i   s m a - n o     s m a - s e     s m j - n o     s m j - s e     s m n - f i     s m s - f i     s q - a l   s r - b a - c y r l     s r - b a - l a t n     s r - s p - c y r l     s r - s p - l a t n     s v - f i   s v - s e   s w - k e   s y r - s y     t a - i n   t e - i n   t h - t h   t n - z a   t r - t r   t t - r u   u k - u a   u r - p k   u z - u z - c y r l     u z - u z - l a t n     v i - v n   x h - z a   z h - c h s     z h - c h t     z h - c n   z h - h k   z h - m o   z h - s g   z h - t w   z u - z a      :   Y   w                 /  M  l     ;   Z   x                 0  N  m                        ܧ׹fq@      @6C?      ?exp          >88?      X< 1
"?';< ï&b?,kg< !J?ĂeT1< 1y"?z< F#?Va< $
lc?x< nu?cv5< ?0N< ߢ#?	"$< bmd?gQ< |a7?麏< ac?0H_< А$?]U ?< 8Ud?|}}?< 5盧?~+<  ?)0>B< 'HR%?I&< ^:ȅe?>!ʎ< sl?ecb~q< ۧ?rʀ< F(&?Zn< '`f?47j< 㚦?+i	U< oX?F.K;< .'?Yhŉ< 4lkQg?;+U< 3?М	m8< &?< S(?Y=t< :@Xh?,n@4`< $?< n?9ܮ<  -)?\< Řwi?=< R%é?f@< *B?aw< G^*?m(<< 2;j?PE< ?</< :T?Ft< ͩ+?NibzP<  l?  %X< aY?]@_}< nL?G	< 1-?a(< Ulm?iT	?< *̭?V*< w7H-?X[F< +.?X kn< En?T(+< U[?։< '?ju!4< -0?< Q̙p?冿< ?{< qw?_W< C1?'< I\r?Dc< s>Ҳ?< w*I?n'$< 23?z7< [>t?V-Ai< ?`DTb< ;?S.< TR*?)R< 2k?,%ً< r?SC?
< H?Zxgf< `/-?#< މ7m?w< 悆a?_"C< lX^?@< {Х/?$8^< ]hNp?bX*< ?}_Ͼ< s?pt< hf2?$V< 4{#s?Ug
< ?w< J.?IZ< *Ow5?.@< FHv?N	< !?j< v(?z"< i68? ?!< <y?Go< 魺?xeF< 豟?GT< 1<?V	ڀ< {}?0< ?a@< ﶠ?0< ̯@?1< 3ā?.aU< !E?I< ?	< j)E?O< IW?W0e)< u?
T< ˛??< X	J?!PO79< /Q?;X< J]?V:e:< Q?Wm`< b;SO?4Td'< 
Xw?ЀY< L"?dݩS< _}??Tx< [bU?\z#< ^ɍ?1< N?wa< ?N9< aX;[?Y']< @ٜ̓?E< VOu?!SÀX< b- ?C:< |a?B<$< {ɟ?+XUG< me?>Uۊ< o]2'? I< Рi?G< o? Ιn< 9[?	|^< .?>oj< ._p?1S< X?l< ~?o.x< %3d?{ = 4 L?V!= b#?@g	= a?Gz	= ]ư?6= oJV?J b= '4?/t>< w?a`< _?a	e= F``?/f	= #&?5SmT4< W ?Rz<  ъ(?vY< k?pY.= y?8'< KuC?j<{= 2<5?ýd	= x?"a= @ic?%[9= ?kRF< 6DC?ş
ܬ_< 5Z?ȡk*= 3?*+xi(< G&?r
ly= :3S?z
j< [?'< ;!?h= <?:< sd?3= ?	?{!mB< <>?*2 = 2?cMyoG= Vsw?8K$< }?Cl< Ϲ?-< 'F?ɕ{< $R?܊)B< #?< c?? ~< F]?&= 		/?94E< ?T9?9*)< l?e/?B6!F= u0wu?M떐= k`(?< 4=?Kp= G"zI?$}Tw5< [?ߪb< Ka?aF7= Vj?Ty< R߂e?M]-e< $[?3< Ễ?QZo= n<?1-
Ix< f	?I]= O?x= #$?nz= ) ]?h< '7?y]h= Yg?Sc< b}?$ګ= ;ђ@?OD)= =e?:Q]D\<  ?FnHAY< "ۮ?)Bp= )RQ?{< L0?U< dN{?c1= fk?iO)= m?
R = l[]?$Ŝi= w/d?C= (O?u1= /D? &=  ?iC1]< Ei?X=g< P~0?Y;=  ]?m< ?A8y< 7l ?S6= =.q?+`= ?%!5= oh?y= iQi?v7= Խ?dDR޸;= nl?b*t#= xA@h?= ZmI?oP@= Y?Ͽ	= n?uИ?= %k?ZEM-'^= DT!?:Zn== 0|?O= *?m}I{= eP5?+}ZI= Q?^oc;< '?
u/r< S?i1= q?/= {ss?VV&= #k~?[	< ?vB< 6#M?!< 
?q_w#< "?ұR< ?k=C= B ?_< ur?y= Dwb?(,xn< <"Q/?qq)= o\l?)T&=  7a?L< ?|6??#DZ9??/.?>6)}?, ,?؏?M?x%q? ?/xbJ?Ȉb?uÏ?(Z?t?{}2F??_2?>T^?u	??4td?Z?(	?WIY?d?{?|:?S9?s?
?K???l.?Z3?;E<?fSOs?JQ?zL?@?{yK+;?ãjh?F?-(?n?@F?)?PJ?CSi?^?B?i|e?? ?ak?c?X!?89l!?fh+?3?)Ao
:?1(>?2:@?>?@@?"Ir?64?@Û??765@Z?&+-?w'?Q?Gpt?2&?X9Ш?Bq?/?
?vɛ?Mj$?3?s?b里?V?%S?Vѩ?ߖ%@?U>?2,|?ܜm?Vkށ?9?I@|?P3y??}>v?H|As?#<p?_0.m?tj?f?c?3)`?i]? F)Z?2VV?f\S?B?}4P?VL?{fI?uSE?|ǩuB?1<>?(b;?탿7?]o-4?Ph0?H,?:5)?Iٓ\%?f,!?갸%?N?$k?oay?*??Y
?$??(?a?9y?99R?%R?F?@I?j T?0<?2j?p~?,L?@_o?7?'?VG?D<xZu?`\@j?)]Gq`?LcU?JupJ?CY?? X74?T)?KB	0?&D?lU?E0d?KYC ?:?@М?L?#em?-Fգ?DT?W㗖?*MU?z{?lUn?
Q-`?>ұR?VDD?oWsg6?UJ(?>t?2̄λ
?1_?$*2?[ێ?N)?V?l$G~ٮ?+6?tF4؎?,~?"n?<փ]?|ߠL?l6;?6**?|59?:?HK?s7?I-?$z?9\?>|.~?-W?^\sY0?:Rp7?mbzA?G4's?IyȊ?%=_?C\2?Ou?m.?M?nw?KK'F?l^?:" ?Ѭ?}6lw?:@? 7Z8>	?$ f?e')lW?zD@	[?jq?P J?F<?Q'J`?xe_?* Aӱ?"Sr?xwN?k$?
S/?yx|o?P6 d!?ZyrI??Ӳ*?
T?!z?{?0V?8I^?A;?wC?JG7&?'un?)?my??|ȕ?,"Q?/b?PV3 2?S?p?Va"?Tl?Pqj?Y?p,?l"։?cY?                ,d?                        =U&?UUUUUU?                }=mm??                u+E6W??                      ?                        _CN??        Fn<t?        u[c?#Xu?7&?Iv*?w|u?!u$8?"YNu?-HF?0[d? cf>	?c??-[6?N}X<      ?]݃?                'Z4?        e-CS?        F?,w?(F_e?X2CQ?	ُ㈏?wT?/VW?#(7? L?hC!߶?c(y?-˶?X1Uu??Y.<      ?PB?                >SŎ?        6	Ӷ?        'P9?z^3?
΂?&1yA?(+_R?mY?}"?ƟlW?P),H?,b??@??c\5j?=Mpm      ?c+?                BpVV?        Q9V%?        ]|=3?.?|_P?%?ػZq\? ,6?5DKBӹ?@IK?Xf?v?'?+3?2y?g/p<      ?7C?                ?        ED;?        h7r?=?(r?EVw?У??0SM`? ?3?/*2?56Yz?Ʊ?Ge?4?%KV      ?rH?                I,+?        U&X>?        i.?c4???NT?j86?f*"!?~w"?nJR?1 7!?|GD|??*a?} Ũ<      ?ƼpAؒ?                ZM$^@        ]>=@        Z7@abK?؝Z@ t?,@T4s?ag@XpM @D$_@n}in @)M@֐@P(* C? mz       @E3&Կ                fYeY!@        ,d&@        #7̓B,@       @=U&2@UUUUUU@9E47@
@}=m=@@ 8λB@[[@u+E6G@@      ?               @                        ӸHO3        oX ?        %
#Z."S->Q!r?M%ᾎ;Ǆcd3>$9t?JyA]VJ]>Q䫢I? ZIο7t`=        cH?      ?    ZS +        ߏ?        Y9m|1~-g>b/[E?8QSվ7KǓ>p?[j3HX&
CUx>XzvC?  *ɿa#wi#:        wB?      ?    x#        qQ?        LyaF5d>2*q?ɾ?c3yƟ0>q澺k?g\>{O>>u>=? )IſX3{9        lf?      ?    V}X9        ܈?        +*tsJEX*yhU&>3H?ܨ9ԪFr>)(g?VtFcfy>?p6? K=3        il?      ?    Kk        0vB-G?         8dlMV>|s`?Pt"!k?JI>΃+תd?s{c|HY"?X:n>//2? 6G^        #f?      ?    dčD        o=z>        -Bվy%#(A>ō:?S/|o3fW|aD	`N>Fb?kt	LR3ec>Df/? @b̰k        ع?      ?    "])        E}>        r>ľ>nzru>Cԑ?lf6	noP"Q?m˹A>fǰa?+kWZbI#݄,[>=h,? nĠ}P=        Ȣ_?      ?                    +j>                        &D(>ll?                bĲm>gjVa?                \yNW>4w+?                        UUUUUU?      ?    "])>        E}>        r>>>nz?ru>Cԑ?lf6	n>oP"Q??m˹A>fǰa?+kWZb>I#?݄,[>=h,? nĠ?}P        Ȣ_?      ?    dčD?        o=z>        -B>y%#?(A>ō:?S/|>o3fW|a?D	`N>Fb?kt>	LR3?ec>Df/? @b̰?k=        ع?      ?    Kk?        0vB-G?         8d>l?MV>|s`?P>t"!k??JI>΃+תd?s{c|H>Y"??X:n>//2? 6G?^=        #f?      ?    V}X9?        ܈?        +*tsJ>EX*?yhU&>3H?ܨ9>ԪFr?>)(g?V>tF?cfy>?p6? ?K=3=        il?      ?    x#?        qQ?        Lya>F?5d>2*q?>?c3y?Ɵ0>q澺k?>g\>{O?>>u>=? )I?X3{9=        lf?      ?    ZS +?        ߏ?        Y9?m|1~?-g>b/[E?8QS>7K?Ǔ>p?[j3H>X&
CU?x>XzvC?  *?a#wi#:=        wB?      ?    ӸHO3?        oX ?        %
?#Z?."S->Q!r?M%>;Ǆ?cd3>$9t?Jy>A]?VJ]>Q䫢I? ZI?7t`        cH?      ?    fYeY!        ,d&@        #7̓B,       =U&2@UUUUUU@9E47
}=m=@@ 8λB[[u+E6G@@                     @                        ZM$^        ]>=@        Z7abK؝Z@ t?,T4sag@XpM @D$_n}in )M@֐@P(* C mz<       @E3&Կ                I,+        U&X>?        i.c4??NTj86f*"!?~w"?nJR1 7!|GD|??*a} Ũ      ?ƼpAؒ?                ߿        ED;?        h7rۿ=(r?EVw?У׿0SM`? ?3?/*2Կ56Yz⿛Ʊ?Ge?4%KV<      ?rH?                BpVV̿        Q9V%?        ]|=3ſ.߿|_P?%?ػZq\ ,6ڿ5DKBӹ?@IK?Xf䵿vӿ'?+3?2yڿg/p      ?7C?                >SŎ        6	Ӷ?        'P9z^3տ
΂?&1yA?(+_RmYп}"?ƟlW?P),H,bſ?@??c\5jӿ=Mpm<      ?c+?                'Z4        e-CS?        F,wʿ(F_e?X2CQ?	ُ㈏wT¿/VW?#(7? LhC!߶c(y?-˶?X1Uuɿ?Y.      ?PB?                _CN?        Fn<t?        u[c#Xu7&?Iv*?w|u!u$8"YNu?-HF?0[d cf>	棿c??-[6N}X      ?]݃?                  BB     8B.?0gǓW.=                      ?      ?                      0C      0C                      U	I? Ͽu}MUſUUUUU?Sz?                     Mu{<`w>,  g5RҌ<tӰY  aaN`<țuE  l{]<lX  ќ/p=><2  ؼcnQ<P[ {8&TŤ<-B ?RbSQ<zQ}<r S?<uo[ _/:><h1 æDAo<֌b; <8bunz8 +G<|eEk 1	m< 
r7<䦅 MuM<1
 J]9ݏ<d< )}̌/<ʩ:7q ^s)ҧ<4ۧ mL*H<"4L %F<).!
 `cC<-a`N yn<< zΐv<'*6ڿ 	*(̃<,v 	<OV+4 5<'6Go 	Tc<)TH 5d+2<H!o 
<U:~$ s <$"U8b qUM<;f GΆ+<.e< o  <s_u "a<gBV_ FD<s Ul֫e<bN6 g<L% <Dh /<۠*B D_Y{<6w <(`<Ͱ77	 b <ONޟ}	 'Α+q<𣂑	 .X4m<d]{f
 |'<\%>U
 Zsni<yUk
 3˒w<Z
 -f$<O3 .<F^v _
t<K 0ns<Rݛ Y	я<KW.g hl,kg<i  6	p<{J- =t<X PZ<2 Js<^{3 ӈ:`t<?.P &I	'o<ِ  AÎ<'Za 1d<@En[vP ͑M;w<ؐ       ?    ?     ?    D?    ?     ?    @?    @W?     ?    ?    ?    w?    A?    ?    @?    ?    q?    ??     ?    @?     ?    }?    N?    @ ?    ?    ?     ?     m?    A?    ?    ?    ?    ?     q?    H?     !?    ?     ?    ?     ?    a?    <?     ?     ?    @?    @?    @?    g?    E?    @$?     ?     ?    ?    @?    ?     b?    B?     $?    ?    @?    ?     ?    ?     r?    @U?     9?     ?    @?     ?    ?    ?    @?     {?    `?     G?    -?     ?     ?    @?    ?    @?     ?    @?    i?     R?     ;?     $?     ?    ?    @?     ?     ?    @?    ?    @s?    @^?    @I?    @4?    ?    @?     ?     ?     ?    @?    ?    @?     ?     n?     [?    @H?    5?    @#?     ?     ?     ?    @?    ?     ?    ?    @?    @?    @s?    @b?    Q?     A?    0?    @ ?     ?      ?                          a?F<=  z1%?Vd?E=  b?6\M=  ?p9t^<= \cN?	ʽJ= 3?/N=  b?DZ.0=  Ohe??0=  ]3?`$= @׹ƻ?X&eBE= rr?\3#.J= ׌?C5= 3:?LtmYE= @'z+?"e=  tLVv?p$M= `dH?h6_~(= `x?YO= YL?wJQ\C= jU?Vш4= +0?e37.= `2?⋱K= `I?)-W0=  -Ƀ?*D= D?7Tf(G= 6	x?Y8= %?E<= w?~?= ҐC?]u<= PW?>#4<  Xq?BJ= _D?mKF= Ԛ?s7E= @[-?K>d:= g?Z}=\uI= s~Q?g:"(N= '?9~$O1=  q?n1%= p)k ?vʌ= `X:?q.W = Pi?g>M= [?ֲa
M= _3?֍,uXO= `Ɏ/?1w<= >'eH?`	JJ= x~? &= n`Y?˖C= 0?]/= # g?uP= ?,lC= 5q?ᕎ	= @Dӳ?-[@= pt4z? فpnJ= l?i.Eg< y~??O^'= (Tt?
x;;=  P?RRF= &?XɣN= J@?~= Ht=c?AzU"= nB?U_lj7= ]?qBD=  h<?z)t'= Z#z?0L= @5ڿSOOF ڿۓD 0ٿ= n  W9!ٿ?j> 0"ؿ؍ I Qn0ؿHn&E :׿E7D5 7A׿%@ @ֿ* Z+A STֿrJ D @ӑտNT? w3kտr19  ]ԿFKm8 C!`Կ1y2Y @Կ*(<j  䃝ӿVCD p,ӿ1n ҿ2=l7 0IҿO	x*  l@ѿ2>FE O5iѿ4Q! ?:	пC	 + pڌXпxO,C  "пAri< q~_ϿR v= =	~οo6 @mPͿ	 d+ >̿9Ȓ [\˿8B' &˿i[J ZOʿbnE DE}ɿUgc@ H	ȿUZdL  " ǿ=Dj!  ǿVm:A @`3ƿ~%3  kcſ"7M  Ŀp> )%ÿ\B jx¿#6HQ; `t-¿=]PH0 ;TaָE  &a-#K V\Vb4M @U@  Xx55 @캿D= iI^Gי'7 AԷUN  <N>Ҫ1 GƴO\C @+Bg:IB @Zu}M :(T!1 n]vQ<)8  h׾o$|f+ x2S74  U".mœFB* 6IKS_D   5M-C  z1}BK G  c?OfF  L,sX4I+  xm	w$VcE                      ?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    @?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?     ?    ?    ?    @?     ?    ?    ?    @?     ?    ?    ?    @?     ?    ?    ?    @?     ?    ?    ?    @?     ?    
?    
?    @
?     
?    	?    	?    @	?     	?    ?    ?    @?     ?    ?    ?    @?     ?    ?    ?    @?     ?    ?    ?    @?     ?    ?    ?    @?     ?    ?    ?    @?     ?    ?    ?    @?     ?    ?    ?    @?     ?     ?     ?    @ ?      ?                          |)P!?Ua0		!=   +34?2Q	=  `??7;WJ=  `7E?'a %C=  MkK?*b<=  0ɘP?*,z?=  d|S?KT'K=   R_V?bF=  p^BY?E&=  9&\?߇N9=  p	_?߭Eb2]A=  `?f#I=  hb?O2H`3=  c?e2a1=  ԆLe?2RM=  f?A3_:=  @0h?[2ieO=  i?1rK=  k?Σ-=  l?̈[8=  yQm?>|W8A=  ՛ko?>qݲN=  np?z m{M=  t)(q?m,SD=   E`q?}e?=  ԩr?}~:fE=  PSs?&A=  &t?,&8=  tt?eѴN@=  PSu?^p?o40=  !9v?W?N=  <v?+#GYM=  Hw?qC@=  Pex?0&ے=  Xy?8 =  <8y?!({=H=   z?d,GB=  6K{?ҝE	M=  ¾|?w31!=  L|?^X-F=  <w}?0!O=  y1~?|"įQ<=  $~?kf@=  +?bUC=  4/?*K_<*=  <t?̍xI=  2р?wYV%A+=  .?x+s7E=  8#o?efE=  |R?Ks޸E=  T8E?=(=  !?)G=  ?#F؇K=  V[?C<  :︃?kVI=  ?YH=  r?q4';=  .~τ?=S7=  ',?7X#=  4ԉ?Ck7=  bB?EpC=  BC?'2xk==  蠆?̸WUA=  xm	w$VcE  ̑ʭvK[7  GQve$lF  uyԏH  gԙu|ǣ%I  =u?FK  tS'q	!   YхtL8|H  dw)tv#L  l&s>D  fqsg~7(  7s6uE  (ruv.E,  t]rLvO  rȚp  &qC "5F  zIqoO  jpO  |WpȮ/N  #D5pO/3N  ^oI!  `1nDCE  "Bnu
^!E  WΉm--0  lNpC  P&`lJ  $akN  8xj[-=  8Riy~   La8i[٬zF+  ghk<@8K  Hg}7ڒ%  gmg1&3   {4WfI8  e}OA  8ӌd_\M  P4.dó6D  @uc2I  {bTWB  `b.r}  X]La6MŞr<  P`;ƥI  pη_v<-  UF^9M  \̢N  3e[ݻk>?   #JY&-D  PZXm4I@  @7eWO/  jUIlN  Ai0TWquI  bR|m:K  @VNQ?|G¾d0  `7O84   fXLzB7C  Ip4"%H  `/G:
WI  `ȃ1D/!H  @%OAA9"I  x<u*6"dм  7xG@  @O1O(;>  '8RؔN   ;*2]                   @G?   E?   @D?    C?   A?    @?   >?   @=?   ;?   @:?   8?   7?    6?   4?    3?   1?   @0?   .?   @-?   +?   *?    )?   '?    &?   $?   @#?   !?   @ ?   ?   ?    ?   ?    ?   ?   @?   ?   @?   ?   ?    ?   ?    ?   
?   @	?   ?   @?    ?   ?    ?    ?    ?   ?   @?   ?   @?    ?   ?    ?   ?   @?   ?   @?   ?   @?    ?   ?    ?   ?   @?   ?   @?   ?   ?    ?   ?    ?   ?   @?   ?   @?   ?   ?    ?   ?    ?   ?   @?   ?   @?   ?   ?    ?   ?    ?   ?   @?   ?   @?    ?   ?    ?   ?    ?   ?   @?   ?   @?    ?   ?    ?   ?   @?   ?   @?   ?   @?    ?   ?    ?   ?   @?   ?   @?   ?   ?    ?   ?    ?   ?   ?   @?   ?   ?    ?   @?   ?   ?    ?   @?   ?    ?   @?   ?   ?    ?   @?   ?    ?   @?   ?   ?    ?   @?   ?   ?    ?   ?   ?    ?   @?   ?   ?    ?   @?   ?    ?   @?   ?   ?    ?   @?   ?   ?    ?   ?   ?    ?   @?   ?   ~?    ~?   @}?   |?    |?   @{?   z?   y?    y?   @x?   w?   v?   @v?   u?   t?    t?   @s?   r?   q?    q?   @p?   o?    o?   @n?   m?   l?    l?   @k?   j?    j?   @i?   h?   g?    g?   @f?   e?   d?    d?   c?   b?    b?   @a?   `?   _?    _?   @^?   ]?    ]?   @\?   [?   Z?    Z?   @Y?   X?   W?    W?   V?   U?    U?   @T?   S?   R?    R?   @Q?   P?    P?   @O?   N?   M?    M?   @L?   K?   J?   @J?   I?   H?    H?   @G?                             >Y "G=    >.ܶlWE=    >jۋbH=     >^IL#=    >(i&I=   h>gݟP'E=   p >*)D=    >&N=   x >.;ĝ@=   H	 >Qyu3=   
>c-=   @>Rݡ:==   >	{M=    	@>C=   `
>bߔB=    >tdC=   $>9O=    >B NC=   >j&==   >.<=    @>`lrG=   >!ls1=    ?8=   @? mN=   & ?UtQ$=   X?PiB{^C=   ?Gv72=   @?qlm+=   ?!.j7/=   d?L C=   `?m	+=   P ?5Od%	=   ?r<   (?*Hga2=   @	?CI=   r 
?sA=   *
?GTiA=    `?KՋD=   r" ?Dp`q=   L$?~G=   4&?D=   '@?E=   ) ?'P<   +?f4±cC=   @?qWn{;=   ?gC i8=   ?XKD=   P?G;R"=   7?8΁3<L=   a?rF҈K=   ^`?_UN=   ?;T6=    ?Ԛ<   !?qW*#M=   ""?j
\M=   p#0?|I7Z#/=   $?^aDJ=   &?>,'1D=   B'@?:+NB=   (?1z@J=   * ?3=   +`?wU4?=   ,?DO=   ;.?$b =   /p?g)([|X>=   H1?>gV=   20?OBO=   *4?bPA<   5?e4=   f7@?|[{~*L=   9?ٹE=   t:?G]C=   '<P?{mu!K=   =?
v\4=   ??n=   fAp?{7!O=   B?=   D ?=u <=   F?i&-=   lH?oN=   I0?IT$7QN=   K?Н\0=   M?0tЗI=   OP?
'C=   uQ?4%@@=   vS ?*
qwG=   ~U`?K ᴽ+=   W?FPn;M=  , ?]K=  -8 ?ƎIM=  .h ?5m3=   / ? M=   0 ?I=   1 ?"I=   2 !?y$=  4P!?_	D=  .5!?]uE:=  "6!?l#5=   J7!?,A=   u8"?!y##<  98"?xyF=  :h"?bCڝD=   ;"?uRF=   ="?2w}=  D>"?@(6F=  ? #?'A=   @H#?43A=  Ax#?uN}*J=  C#?)r7Yr7=  ]D#?.K="=   rE $?r=  F0$?3=1Z1=   H`$?h|=G=   gI$?ܩN:=   J$?4e6=   K$?{<9=  =M%?uYPwH=  NH%?-*8=  Px%?yF.=  -Q%?\9;,=   R%?29Zd@=   T &?~YK|=  sU0&?WĻ(J=  VX&?RIG=   X&?W	N=   Y&?g'9=   [&?D"^=   2)$   7bmL   Mӿ(   	ԏS4   _	>L   |/dM   4g±8   2qڜ1   ןqaPC   Qo %;9   ?_0C   w4g%6L   &M;k@   ڿ81AB   ۏ1uB   )_Y   /󓎣,:   x.Ճ^-   ?   ޯԝI   -:]=O>   O#w_jُB   n(+E    -V~|_   B}_A   CK!ܨY:   _5G   t/C$>   #H   m-
M   Vn@   QU^tA   $OÄ   þiM   @K8|;2   @(A   V64   oꬠTC   9?&u.   ~Fs:4   Կ	J   _LII   =@0(   ן$.G   ?}3Rʏ3   !|.4   *ڟ඄}3   ?G"jm
>;   *O   0 :O   2K;   ޿Q`4   _ ZD   
69   *
F   _
T3ʢK   	M.֢>   	@_@   ?	1\hU   XpM   &Jx3   Ҭ   x/h7   8Lv]E   V3   Bv9   r_cM   *5&L   q3   ?:R$   @܎$=   K'   \?Ъ{b>   $EvC   Iw8R'   FG_j,)   +jBD   |_`kA   %'rBL   	TE   _GO    #i#     ;^طH   ? 6(`JJ   \HB5   ``.11   \?QD   T<VD=   DMϲk:UG   ?,'   hUF   UȘI   t@5   X?󕕠4   $cG   y/C   tTM   h?A)E   zcϨN   {-   <?G#?F   }-wF   wj'   Qx   ?*
<   4	,   p~ܾUY =   ˚G   쾂p7   m81<   'mN   辙L   hKY02    ̟q   㾭vBfe9   0%2F   ΥE8   ߾`=?   ܾE=|
   پuM   @־9>   Ӿ96   оk<
xE    ˾CqTR;   ǾdG    GgL   @_h%?   SS@                b?Wdy>c*GPAiFC.ֿ      ?        53=?͸)a<aw>,?][SqnC?nwtӰY?eus<)kp?&<ߑțuE?Ka<>?5a1xH<lX?
aJ.<Gr+?qO<2?R{':@<f?{NkQ[?9D9Ŗ1l*?ǥlQ-B?6/QȘZ?	j@<{Q}<r?u׹Aꍌ8?k#uo[?hI{L[<\?.5Sh1?<d n<"P?{ߑ֌b;?JuǍ<}I?~<8bunz8?rǶ~<?OQ?U<|eEk?@3<c߄?}?:L?U<?8
A䦅?ATG<V/>?#Eq<1
?1j<1Lp!?|眊<d<?Y6!'<_V?(FN\\˩:7q?B:fm?<4ۧ?a6u-?)]7"4L?	ڊ<E?V#З*.!
?x0i^P1?y_ǁ-a`N?πzH<W Aj?vdK<<?bs<*?Vb˙<'*6ڿ?B쯗C}<?3xj<,v?WY	BfϢ?ivOV+4?<z]ʤQ?h'6Go?,<Ǘ?[ᕂ<)TH?GFL2<FY&?iK<<H!o?]0<	v?GVB⓼U:~$?@~ 4FC?2u<H%"U8b?3Y	sLU?d>D8`<;f?Ud4ݛu?gVr/e<?<h:kQ}?%<t_u?zGntH??;el٨gBV_?m1WY$?]Oi?,
f<s?/w20?ML<bN6?~y]p<>T'?*mb|L%?2L#FG?AֈDh?ԛƟfǊ?:|<۠*B?&KV<D2?2^p6w?l̅<[?#%X.y֝Ͱ77?~_gRDZ?9|KvPNޟ}?Ѕ|[p?2Αs𣂑?qF||<##c?nLx$x<e]{f?2]IY3-J0?6}\0<]%>U?An/X0y?c~˛<yUk?1<zӿk?l4Z?]4͡<f)?$LޛO3?ׄ0^b:YrY?mqG^v?:T~OXuJ0?.)TK?-z=<	[?rk?Rݛ?HPe<z_@?
ƃ7E<KW.g?<HM<m?D\Hq<i ?Iu<]U?rS;؍|J-?zyC7/?wq{HX?7[<?2?2mi #<`!?xWڒ<_{3?[KOͥ)F&?z'?.P?̩<LQz?"Ւ<ڐ?(#g-H?󓜼'Za?ǝ<k7+%?C<@En[vP?-ә<{?	5ؐ?SH<q+?yetb<   w   w   w   w   x   x!   x   w   w   w   w   4x   w   w     x   w   w   H   P   X   `   h   p   x"   #   $   %   &   fabs    modf    ldexp   _cabs   _hypot  fmod    frexp   _y0 _y1 _yn _logb   _nextafter         D         0                ?      ?     ?     ?     ?     ?     ?     ?     ?     ?     ?     ?     B?     B?     ?     ?     r?     r?     ?     ?     ?     ?     N?     N?     ?     ?     ?     ?     B?     B?     ?     ?     ?     ?     H?     H?     ?     ?     ?     ?     b?     b?     ?     ?     ?     ?     ?     ?     F?     F?     ?     ?     ?     ?     ?     ?     B?     B?     ?     ?     ?     ?     ?     ?     V?     V?     ?     ?     ?     ?     ?     ?     z?     z?     F?     F?     ?     ?     ?     ?     ?     ?     ?     ?     R?     R?     $?     $?     ?     ?     ?     ?     ?     ?     t?     t?     J?     J?      ?      ?     ?     ?     ?     ?     ?     ?     ?     ?     \?     \?     6?     6?     ?     ?     ?     ?     ?     ?     ?     ?     ?     ?     b?     b?     B?     B?      ?      ?      ?      ?                  <?N~'<  xz?'*$=  #f?$/= @0?@AS1= cE?PaB== `R?Dj0Q:W$= >m?Lyc>= *p%??C;0= |?Ix"<= ``ә?y M== orO?+C== v?R1= PQ	?Ӏb= @P?5M[g?= V?d+[7= ?nB>=  kz*?w#8= 0nط?C#7= {?Di00= ˮf?j -= x)?}z=  ?0$= HV?o= Xa?;M_8= @?5= ?^@'= L$?/r(=  <?vT 3= ??Cg?= 0Ә?W/f1= `(J?Dk0= h#?@ 6= ۫?_= |D?&?4j<= '?Qn&= ַ?l= Ð6?DX,4= ?-Q2= xbt?WE< .l?7w,= Ȭ?l>= ɥ%?Nl,"= @\r?? t8= 85R?ӇӜ= L.	?>)g= Ը3U?Ӱ== ?hXg+= og?X= ذ0?{fHn= <w?y5s3R6= )?a8< O4W?4bV0= L?4@= @?Xۓ4= Tk?>_(=  ?*o= @[c?,= $4b?dO"= lx?#608= ě&m*?ɉh"0= בl?n6ѯ{< 9[P?cezb< $?F8"= 8B.?0gǓW.=                     log10                 ?      ?3      3                                           C O N O U T $                  ?     ?BB       xPD?X1=                      ?      ?                      0C      0C                      Η5@=)d	U5j%5j?~@5wzA.lzZ?                          
|?Q-8>=  ޶W?0	k8= ޮp?x9=  >.ښ?pn5= Yح?  	Q*=  c??b6= Y?T?=  >?W!= @-32?Dz= p(?vP(= `?US?>= e?g7= `ŀ'?bͬ/= ^s?}#= Jwk?zn= Nָ?LN 9= @$"3?5Wg4p6= T?Nv$^)= &?.)< lB?M%= `j?w*=  <śm?E2=  ެ>?E= t??= OQ?w(@	< 0?Ac0= Pyp?dry?= St)?4K	>= $?QhBC .= 0	ub?-0=  ?a>-?=  ?Й,<  (lX ?T@b == P?3h,%= f??# = V?ߠϡ6= Y?z $= G? $l35= @n?[+3= Rŷ ?sdLi== p|?rx"#2= @.?|U2=  lԝ?rF= a?4= Y?sl׼#{ = `~R=?.i1= ,? = vX? = p?h}s"= 	E[
?%S#[k= 7H?j= !V1?}a2= jq?20J5= ?5= x¾/@?"B <1= iz?\-!y!= X0z?~b>== :?#.X'= HBO&?(~= xbb?.= Cq?y7i9+= v?:= 0?2ض8= xPD?X1=     ?     ?     Q?     Q?    ?    ?    ?    ?    ?    ?    ?    ?    ]?    ]?    P?    P?     ?     ?    U?    U?    (?    (?    `?    `?    _?    _?    ?    ?    ?    ?    z?    z?    1?    1?    p?    p?    ?    ?    (e?    (e?    @#?    @#?    ?    ?    `?    `?    hk?    hk?    ,?    ,?    x?    x?    ?    ?     ?     ?    N?    N?    x?    x?    p?    p?    ?    ?    ~?    ~?    HN?    HN?    ?    ?    ?    ?    ?    ?    p?    p?    Xi?    Xi?    ??    ??    ?    ?     ?     ?    ?    ?    8?    8?    s?    s?    pI?    pI?    &?    &?     ?     ?    ?    ?    o?    o?     *?     *?    ?    ?    `?    `?     Z?     Z?    ?    ?    0?    0?    ?    ?    PY?    PY?    ?    ?    `?    `?    ?    ?    pm?    pm?     /?     /?    ?    ?     ?     ?K E R N E L 3 2 . D L L     AcquireSRWLockExclusive ReleaseSRWLockExclusive       O   _  _                                                            f                                                                                      l                                        node.exe                      to                                                                B C D E               btn fr                         0 p  @    $@Pd8Ę8    PNL`t        ̙  						
	 	


				   Դ8pܵsss= u 7 u 6 2 5 9 5 1 U MU y U I6 5 2 8 0 8 E6 9 2 9 != 5  : 5 8 : ' 4 9 " : 8 : 9 O 8 % U 8 / ' 3 o 5 9  9 % %  E I % ~ ~ I E  % I % i e I % I %   % ~ ~ I % ~ ^ % ' ^ E  ) ( % ) ( % ) ( % % ^% ) ( % ~ I % ^ I % I E ~ i % ' eF   & 8 & 8 & 8 ^ & e 5 X ) 5 i ) I % ))e^ % i e  ^ 9 ~ ^ % i^:  K % &  5 1 7 1 , 5 L 5 L 5 , gg U  y U 7 U Z l5 U & GM G , g5 '  " :  F L :  G Mg Z ' " ' , l'l' M',F : u &  & ,& l &  'l 5 ' gll * , * , ' j  , J '  GL U M5 &   , J G  '  , ' j  J J , ' * G g L MG W  : 7 L *  G  G G G , j L L l ,  ' ML g , L * 'g  G  , ' j  L * J , ' G L M5 7 , J G  G  , ' * , *  J J , , * G g L M: '  , '  g  G ' G G g J , J j j , ' * Mo  7 : j g G ' l  l  L G G L M : J g G , ' * ,  , J J L J ' G L MG J g '' j  j j , ' * G L M :  J G''  , j l , 
J 5 , G  7  & 5 MU G ' G ' '   g ' ' G  , G  L '  &  M ' z : 5 z L  MO: , : , : , 6 2 6 2 J *  5 L  l,  Z   U gJ  *  * L J L ' M  J L  l ' j G  g  , J L  , ' * Mj , Z ) ) g5 & )  '  ' '  '  ' gl 5Z
1 MU '= G6 2 g	u n  l Gl U GL g L L *  
, J lu & u 7 ' , MO 1  l = Mg& ', ' l  L j J ,  l : U M * J M/ ZL j U * , *  , * , J  L, MM &   * , *  * ,  , J  M Z,:L * *  J L * , J G M, * L j , * l J  
J L  Mg M U l 5 *   ,  J , G & E ^	  		  ) ) ) ^  	 E  ( 8 % x e E  ( x  E  x  x e E  ( X }  U 4 3 6 T 3 6 4 ; <  = 54 3  P u 9 6 2 u9 5 0 U=   / &  y 6 2 & Oy 6 2 W , k Z )  ) Z % i E i % : ) Z 9   ) : ) : ) :  : %  %  % Z E I  ^ e : 9 Z % : n^  /   Y  9 Z 9 Z 9  9 Y Z 9 : 9 ! Y  6 2 :
9 9 Zz	9 :9 9 6 2 6 2 6 2 6 2 6 2 6 2 6 2  6 2 6 2 6 2 6 2 6 2 6 2  y6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 Y Z  Z~ I E  i % ^ % ^  F i % ^%   l ^  / U % % & 5 ,         U 4 3 4 3 u 4 3 5 4 3 51 U 1 5 4 3 U 4 3 6 2 6 2 6 2 6 2  & UQ Z:= u : & ' . 6 2 6 2 6 2 6 2 6 2 Z 6 2 6 2 6 2 6 2 1 6 R : . J 1  Z n & ' 5 Z 
L X F ' 1 G5 f ' 'Z  ZgO: O ' ' ' ' &  U !& u MG ' , k 5 L5 & , NL  &X E &  ^& X   ~F %  , g ,  , J L *   Z 7 :  J G
, U ML u ' MU lJ 5 l * , J  J ,  & MU ' J L J L g , , * M &  z ' * , ' l G L  L ' , ' G & U g* L J U ' F * ,      gJ , J , J 5 * , M' ' '$ D D $ ? ? -G  ' , G9  ' G G g-6 2 7 :  6 2 5  5 Q P 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 U 6 2  p u  1 6 2 6 2 6 2 u 9 1 y 5 7 U  " u 7 u 6 2 5 9 5 1 U MU y U I6 5 2 8 0 8 E6 9 2 9 6 2 5 6 2 U G& F    g W 9 8 : W :  Z b Z GgG gu : :/ , ' '. . 5 5  		M ' G ' 5  5 G5 G ' l L   g gl , 5O 5  g'	* , *  ML * j  J L U "  'Ml  * M L * j ,J   Mg, * , J  * , Mmn 'G'  G J l z  Z   Zl : 
OIEI EIE) I ) I  	 %  eIEI  	 EI   )  EIEIEIEIEIEI)9 %9  )9 %9  )9 %9  )9 %9  )9 %9  ^ M gG ' ' G ' ' ' ' ' ' g G ' ' ' ' ' ' G '     ' G'g  'Y ozz:Z :  ::   z' ' ' ' ' ' C" ? ?   ģ  ȣ ̣ У  >0Pp v rank    %_  	
 	
         Д̒8        -x0 X0      K   # 
 ^   4 	    ^  V   P     &  G   z   REINDEXEDESCAPEACHECKEYBEFOREIGNOREGEXPLAINSTEADDATABASELECTABLEFTHENDEFERRABLELSEXCLUDELETEMPORARYISNULLSAVEPOINTERSECTIESNOTNULLIKEXCEPTRANSACTIONATURALTERAISEXCLUSIVEXISTSCONSTRAINTOFFSETRIGGERANGENERATEDETACHAVINGLOBEGINNEREFERENCESUNIQUERYWITHOUTERELEASEATTACHBETWEENOTHINGROUPSCASCADEFAULTCASECOLLATECREATECURRENT_DATEIMMEDIATEJOINSERTMATCHPLANALYZEPRAGMATERIALIZEDEFERREDISTINCTUPDATEVALUESVIRTUALWAYSWHENWHERECURSIVEABORTAFTERENAMEANDROPARTITIONAUTOINCREMENTCASTCOLUMNCOMMITCONFLICTCROSSCURRENT_TIMESTAMPRECEDINGFAILASTFILTEREPLACEFIRSTFOLLOWINGFROMFULLIMITIFORDERESTRICTOTHERSOVERETURNINGRIGHTROLLBACKROWSUNBOUNDEDUNIONUSINGVACUUMVIEWINDOWBYINITIALLYPRIMARY                  P            h           
				
	
								 onoffalseyestruextrafull    ,   4   <   H   T   \   d    l            A  @   029J.xtyh2, *  &( *.40 468< < < :>    z( n":F; =l>DA CjDEF
E$pv 	   n " `"6X1&B&BB ``(8HYh~d|xvpr&!b*!\+!^2!`!! $
 ,/`, b,Xc,fd,Zg,m,Tn,Vo,Pp,Rr, u, ~,N,d,, @."2>y}L~
 J
H!   c 1 G  k1 G     T lag P0     l /      \   H          h $ < 7D     x ,   P X     < D   	  X  	l        d! x! #  $ $ $ D% % % & & & ' ,' \' ' ' ' ( ( ( ) ,) D) ) ) * * * + ,+ + + , , , - ,- X- - - . . / (/ \/ / 0 0 1 (1 T1 1 1 2 2 2 3 (3 T3 3 4 4 5 (5 \5 5 5 6 (7 <7 X7 `7 7 8 8 8 	9 h9 : : :  ; < < = 4> $d> > 8? @ (A XA xA A A A B <B hB C tM 
@N  P Y  Z lZ [ H\ \ H] ] #^ `_ t_  ` b d d  e e f  g "xg \h xh 
Ti i i j j  l l #hm  n n o o p p q  s @s s s ' w w ~ ~ 4 t   e    (  !@      P X x        ( < dB '    Np   u S 
@       O    Yl           d   @ 
X $     @   '( ?    @ 77@4| $,	ؠС Т8
| ̦x0pܩȪܪxԫ `mox #Phl 	@.@|@\!|$$((0(((	@)), @@ BB DD E FFGZ.D< @' DDF HW L[l[[T\\<]]$^^_, dD@<++@	 @! F %?  >  @FF t  8` 8 8                                                                                                                                                                                                                                                                {z0{@wPwPP иPp @  PCADDEB  <H                % & ( 0 ? @ E G O P t              `(*+*ZZu	AߺA=]~  97             p    ^  T  F   oooGeenu|{zyYslpo#
?>[\\_>>>>G>C81CCCCE20=gtDtdrrDd
Oeee[[[[__D=ggMMffMW&,,,,MrWWr&r&rMaMMM$$$$
$$$-M%%hhm_Mmkir;;777llHHHCQvwRcOj*`ZS49   9   6   9   9   PPPPPP_PPiPnnPnnPPPPP[PPPedPPZgPPhP nth_value         	        ! $ ) . 0 5 6 ; > A C E N Q V Z Z ^ c e i o w { { { ~                               	 '+28DMOUZ\cgryz )-057;CILUZbbfoty          `@    0 0                                              !5Ng&%   O,O4O<O                    (1T\`l                            A  @   029J.xtyh2, *  &( *.40 468< < < :>    z( n":F; =l>DA CjDEF
E$pv 	   n " `"6X1&B&BB ``(8HYh~d|xvpr&!b*!\+!^2!`!! $
 ,/`, b,Xc,fd,Zg,m,Tn,Vo,Pp,Rr, u, ~,N,d,, @."2>y}L~
 J
H!#                % & ( 0 ? @ E G O P t              `(*+*ZZu	AߺA=]~  3     a     z   CREATE TABLE x( name       TEXT, path       TEXT, pageno     INTEGER, pagetype   TEXT, ncell      INTEGER, payload    INTEGER, unused     INTEGER, mx_payload INTEGER, pgoffset   INTEGER, pgsize     INTEGER, schema     TEXT HIDDEN, aggregate  BOOLEAN HIDDEN)   y    0t0tvuu`xx}zP`                                                                                                         bt':)|C!>?/A&v[+2R^3By/svG	wEDMY_(/v}{Qv 0\#xqd.Fa-P`Hc,W~1$<
%vddUX*TISVvJ]vLKZNO="@z  `g   `mgPilpm                                                RlTtT RRYlast_value  second $ W  ?minute 3T  pBhour   9Q  aEday    ZJ Gmonth  h,H 4Jyear    eFKfff    f        0123456789ABCDEF0123456789abcdef       @                @                                                   @          MDz\HzPzTz`zlztzxzzzzzzzxzzzzzztzxzzzzxzzzzzzdg`gz{{Dzxz{{${\,{M4{Dzxz<{D{wL{\{h{p{|{                              `            h     ʚ; ʚ;         
   P                                      @                 





   @******""""""""""""""""""""     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@3.39.3  %llll      PP  p0@                                              	         dense_rank  %_   RRYxYR   `668:<<= Ap@BpEEPNPP MT0U  d        %?AIE   19P @QVg\
YhwW  @rKVP S 9vx
#9L] -09<?[]hj b.,	 =/vxvx?     OOLjtZ_ST}>;Ijs>8  y 
0YiXM{5;>BFO^Ql0f'0:@&)/12LZ-3A4C8_hkmYqtru`dejbginxwz{}<E#[fyW^UV\   	.%C&     prpstPuuu    @v    v                vPw  c   F  d  BINARY      *?[           $@      Y@     @    חA 7yACnF?O8M20HwZ<sOulz@   wB   uA   C      `668:<<BpEEPNPP MT0UV  ; u  T F   u           		

  !!""##$$%%&&''(())**++,,--..//00112233445566778899          ; '     @p0    P @ 0 @ P0 `         @0                  ЙP p u@ 
`@
p5@P { |p`	Ppp	     Ѕ v0v`	г		0P|@p ``0 	 Pp P~ @@00ppЕ		}
 74P.66`  P0p Љ ` @v` `Џ Ьp@0p@`0 T@     7`
P
  Pp	К`  P00 @@p@ Ж 	 		0p}@e ePe` @`  P    0
  P@ @Пp~ 0~{ e              0            Dg       c  T                                         	
 !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                   	 
22d    ! $ % ( ) * + , - . 0 : < ? A [ \ ] ^ _ ` a { | } ~                                  89IJy4:<=?ADGHP ptuvz{~0`1YZa 	 @AK`jnpq 0M $%()0@Y^ 			:	;	<	=	>	A	I	M	N	P	Q	X	b	d	f	p	q	r	y																											




*
2
5
8
<
>
A
G
K
Q
Y
^
f
p
r
u






















*25<=>?@AGKMVW\_bfpqr*5=>AFJUX`bfx=>AFJMNW`bfpyz124?@FGOPZ  *456789:;<=>@Iq +-1289;=?@JPVXZ^abegnquJPXZ`]`i mo  25@R`nr  CD  #')0239@DFPp  UVWX`abcems 456;<=BCEPZakt $,46;@MPZx~ ,kxy   (08@HPY[]_ahp              ( ) * / 0 9 : ; ? A D E F G R S T U _ ` j p q t z } ~              !!!!!
!!!!!!!!!!!$!%!&!'!(!)!*!.!/!0!4!5!9!:!<!>!@!E!G!J!K!L!N!O!P!`!!!!!!!!!!!!!!!!!!!!!!! ### #"#)#*#+#|#}##### $@$`$$$ %%%%%% &o&p&'h'i'j'k'l'm'n'o'p'q'r's't'u'v''''''''''''''''' ( )))))))))))))))))))))))))))))))) +0+E+G+P+ ,0,`,c,e,g,n,q,r,t,u,w,|,~,,,,,,,,,,, -'---0-o-p------------ ......	.
............ .!.".#.$.%.&.'.(.).*./.0.:... // 0000000	0
00000000000000000000 0!0*0.000106080;0<0=0>0A0000000000111111111 2 2*2H2P2Q2`22222 3 4MM N̟ Ф  *@nopst~  "02pqy~#%'(0689@tĨΨШ 
&.0GR_`ϩЩީ )/135@CDLMP\`pqwz{ª۪ݪު	 ( װ   p )*8>@CF>?P  01356789:;<=>?@ABCDEGHIMPTXYZ[\]^_bcdhijpv	
!;<=>?@A[\]^_`abcdfpq   ( < ? P   7@uy  0ABJ (P 
7<?WX 			 	?			 






8
?
@
P
`
}

 9@X`x ` 8GRf ',-6@   $p$ 0 h oPoQooo   )egjms{ухьѪѮ BE ` 4NVhԂԜԞԢԥԩԮԶԻԽ8;@FJRlՆՠպ"<Vp֊֨56OPVop׉׊אשת !$')49;BGIKMQTWY[]_adglty~ 0 0p@P 07 @B @PE   ֦ 4@                       p            g        @p       ` Ы00` ` @   @?@?p?@@@HpO@J`RS                                                                                                                                                                       			                                                                               ""$%%####        ''       (   *,--.

1110  2234444445559;;<<::==>>> 887                                       !!$%&&))++,///
   cfirst_value {          {         {          {         {8        p{          {          {          {           |         |	&        (|
          8|         H|          `|         p|/        |7        |         |         |          |q+        |a         |   @      }          }         (}         4}        D}          T}         p}          }a        }a&        }a       }q          }          }          }         }           ~          ~           ~	        (~!          4~          @~          L~ 	        X~         d~q          p~         ~          ~         ~         ~!          ~  @       ~"          ~#          $          %a         &!        ,%a       8'          D(          \)          d         t         *           +2                Q`cb`b8`b\`lb`Nb:`kb!"a bS?>V	

69KNN59RRG   0123456789ABCDEF (
 08     #naturaleftouterightfullinnercross   8 8v s  8v s  8"y2228z") ) ) )  G G ) ) //G G } ~ P { { | | | |   ? &v s  = v s  / } ~ P { { | | | | v s  Gz z z z y y x x x w t x!w55 e  </ z z z z y y x x x w t } ~ P { { | | | |  &Sx x x w t   8w t | | | | u z z z z y y x x x w t q   "z z z z y y x x x w t </ | | | | z z z z y y x x x w t V} ~ P { { | | | | 
 8  R S z z z z y y x x x w t     } ~ P { { | | | | z z z z y y x x x w t "u o 06 THh38z z z z y y x x x w t q,G G G 5U -8b   } ~ P { { | | | | &  %m m  8 8n  :9E'pkG G G G g</Mz z z z y y x x x w t  8L &d5&(8 3 3  } ~ P { { | | | |   y y x x x w t 5 </  } ~ P { { | | | | z z z z y y x x x w t  uT;;$l </"|z z z z y y x x x w t } ~ P { { | | | | ped uE5  u } ~ P { { | | | | 8 z z z z y y x x x w t     - u/ q, z z z z y y x x x w t } ~ P { { | | | |  7T JJ8V''} ~ P { { | | | |  8  vz z z z y y x x x w t .8  %% +G G z z z z y y x x x w t } ~ P { { | | | |  18~585@5} ~ P { { | | | |    z z z z y y x x x w t  8b2? HIJ=      /	 G G z z z z y y x x x w t } ~ P { { | | | | 88>9]`=5 ks/F F G G  -h P { { | | | | z z z z y y x x x w t ZH75[ 58 8 \z z z z y y x x x w t k G G   88a .*!5  7 7 8 8 5L '} ~ P { { | | | | [`} ~ P { { | | | | qiis} r P { { | | | | IKz z z z y y x x x w t  8`z z z z y y x x x w t )qjj  |z z z z y y x x x w t 8*o3  @5,+ + 8} 5J~ P { { | | | | 89 9  oQ 8A, , Z  C  8B [: : z z z z y y x x x w t \ ; ; o 0D  8 8 , 38%8G8%8G8h < <  = = 888> > - - . . / /  1 1 -8g8d 2 2 ? ? @ @ 188</</A A   88 hm m B B   n :9   C C 88T ;S8 V  F4 4 D D  1E E  a l j 8oQs8o 0 8  & 8l Co 0 35 5 B8  8Q  M3L L 8!8 8Rd 6 6 XH H ( 8-oP   I I    &-8?8\{z 88om m 	    n n:9m m     8n 8:9_8a</8W8d ed   c   j     8t o 0 8uQ84838 K K + Co 0 q M M BJ J * * ]0 0 3DCDC^- Bq N* 9?4 5  6 -}O#x Pm m ) Un :9qm KLJIm m  <.	 n  :9 </  O 0U   $Q T  ~  # 3      b $ [   Z  -^  ! o 0 ] KsJ +3l2Im m r3 n b:9"
 i }a" <c 8-:{ 7#=   N     m m D0  >n  :9 B@F   N  P   W X  Y Z  S O    Y  H  % nS  \  f qi^ ~1 ' _   w`  v  q    | !    d /f !g  #Y$X
 ( _p  4  BA!        <3T3h3|3333334,4H4d4|444444 55$545L5\5l5555556 6<6P6l66666666@p     7$7,778      										&&#                   &&&&&&&&&&                                                         ntile                             '          '    + , - . / 0 1 2 3 4 5 6 7 8 9                  Q + , - . / 0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q        :;:; <V  X   :; q  H (  
f g h i j k l m n o p q + , - . / 0 1 2 3 4 5 6 7 8 9 Q $; $*l m n o p q E t u v H j k  o p q 6 7 8 9 : f g h i j k l m n o p q x     f g h i j k l m n o p q    t u v     6 7 8 9 f g h i j k l m n o p q   . / 0 1 + , - . / 0 1 2 3 4 5 6 7 8 9    ;      C  f g h i j k l m n o p q I   ;   + , - . / 0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q y  ;  t u v w  z { |               t u v $  f g h i j k l m n o p q   78 j k   ;     s t u v  x  G  45   9 Q + , - . / 0 1 2 3 4 5 6 7 8 9    d _  ;  j k   e    r  t u v q 0y   ; w x y z { | }          f g h i j k l m n o p q        t u v L          l W  Y  \ t u v  23   + , - . / 0 1 2 3 4 5 6 7 8 9 ;        j k l m n o p q I    45  Q 9 + , - . / 0 1 2 3 4 5 6 7 8 9 3f g h i j k l m n o p q t u v    w ;  z { | ;   ;             f g h i j k l m n o p q + , - . / 0 1 2 3 4 5 6 7 8 9    ;     t u v   t u v t u v     + , - . / 0 1 2 3 4 5 6 7 8 9   v  f g h i j k l m n o p q L v ;  t u v 0  $ < Y   \     78 e   f g h i j k l m n o p q + , - . / 0 1 2 3 4 5 6 7 8 9    ;  t u v ;    0          0+ , - . / 0 1 2 3 4 5 6 7 8 9      f g h i j k l m n o p q     t u v   t u v  P     0        f g h i j k l m n o p q + , - . / 0 1 2 3 4 5 6 7 8 9   { L          j k  Y   \ ;    + , - . / 0 1 2 3 4 5 6 7 8 9     f g h i j k l m n o p q          	 5   9      u    f g h i j k l m n o p q + , - . / 0 1 2 3 4 5 6 7 8 9     ;     M  O       -.        
  - . / 0 1 2 3 4 5 6 7 8 9 f g h i j k l m n o p q     * u                '  d 
*  f g h i j k l m n o p q u    y   ?      s t  *I                           + , - . / 0 1 2 3 4 5 6 7 8 9   ;  ; + , - . / 0 1 2 3 4 5 6 7 8 9      + , - . / 0 1 2 3 4 5 6 7 8 9 M  O f g h i j k l m n o p q    u #u  f g h i j k l m n o p q    B    # f g h i j k l m n o p q  U e  55  99^       B       J      , - . / 0 1 2 3 4 5 6 7 8 9     ;    
     e 5   9  L s   5  9  . W . Y   \ (     f g h i j k l m n o p q *  #  t u v     F t    N ? = Q t $      !   ; 0   b    s  s  ;            G     A         U   d  Z          d  l  t u j k  y     r  t u v +,y                                          s    
      ;  ~                    $   (          $    c   5   ;          F ; G ; u    N   Q   >G U     Z     x y b U  d   Z  y j k      d r  t u v j k y      r u t u v   y                                            ;  
      a       $                  (      ;    $ S T      G        u    F   ;    N   Q   )G d %   j k l  b  %r  t u v y     d  j k   <   r  t u v   y  )       ) &        && +     $                   ;    "> !    s G          @      ~     1 q 8$    d  [  =j k   =R  r 	t u v ;  y    	    G               //  ,        d      j k       r  t u v   y               = 5 5 %  5 5  t "     s         D D K ) s     }  `   C   C ;    C        t   % a       K X " " " " V K ]  "  "   "      ,                      ??????????????  ? ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????                   8    px

		*(')@@d
  s   g  z   q 	  Q 
  w   c    o   u
   x  X   f   e  E  G  i
  n    %    p  T    S    r
        ,,,,,,3M+SRGJNQV[55<@D5W\5] M,{pBB '---     E------------- X      ( o i Gn#J1EEEEEEEEEEEEEEEEEEYEc~-------------------------------------------------        ^ B A p nO O M { q q   22HHH nimm66C 2222222I 5x2 4444D  ! $$  YXXXX  .aaaosassaaaa004aUaWiizzz222222222222222 GKl&2*Zr
;>?RlvP|=( $12x":I3P#8]OXwQbvdy{ SQLite format 3 D MMMM pp            ; ; ; ;   ; ; ;   ; ; ; ;       ;     ;         ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;       ; ;                         ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;                                                                                                                                                                           abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789  percent_rank                  lead          1   	 
                          (g             0p       p@`0 )0(...13130;<<3>o u t   o f   m e m o r y   thstndrd     TM\MdMhMlMpMtMxMMMMM      row_number  JS   T\Ri  ^ UH 5#V *a6Y   ( k 	  {P N Ag s  0 Z  F<nz I[G=xJ 1 ) q   m
ot}2| d y8XS%~  l3 "   b&' -u] cume_dist   D9P9\9h9t999999999999999:::: :(:4:@:L:X:`:l:x::::::::::::::::;;; ;(;0;4;8;<;@;D;H;P;\;l;x;;;;;;;;;;;;;; <<< <(<0<8<@<H<T<\<d<t<|<<<<<<<<<<<<<=== =,=0=<=H=P=\=d=p=|============>>>$>,>4>@>P>\>d>l>t>|>>>>>>>>>>>>??$?0?8?D?P?\?d?p?x?????????????@@@ @(@4@@@L@X@`@l@x@@@         +  jr              w4    >    $  M    ; /          E      : K         h @B?     .           Qe pC O`v  D  c, 7 L _ !9 f  W           ??{Gzt?Mb@?-C6
?h㈵>Ơ>Hj>:0y5>&.>b a d   p a r a m e t e r   o r   o t h e r   A P I   m i s u s e   unknown exception   bad array new length    string too long :   napi_get_last_error_info    Error::New  napi_is_exception_pending   napi_get_and_clear_last_exception   Error in native callback    napi_create_string_utf8 napi_create_error   4bda9e7e-4913-4dbc-95de-891cbf66598e-errorVal   napi_create_object  Error::Error    napi_define_properties  napi_create_reference   napi_throw  Error::ThrowAsJavaScriptException   napi_close_handle_scope HandleScope::~HandleScope   map/set too long    step    finish  idle    completed   failed  remaining   pageCount   retryErrors Backup  Backup is already finished  errno   code    error   emit    Use the new operator to create new Backup objects   Database object expected    Filename expected   Source database name expected   Destination database name expected  Direction flag expected Callback expected   filename    sourceName  destName    filenameIsDest  sqlite3.Backup.Initialize   Argument 0 must be an integer   Argument 1 must be a function   sqlite3.Backup.Step Argument 0 must be a function   sqlite3.Backup.Finish   retryErrors must be an array    deque<T> too long   vector too long Class constructors cannot be invoked without 'new'  P~ m `2  3  @  4 4 m @3  @  close   exec    wait    loadExtension   serialize   parallelize configure   interrupt   open    Database    Database handle is closed   Database is closed  String expected mode    sqlite3.Database.Open   sqlite3.Database.Close  Expected 2arguments trace   profile busyTimeout Value must be an integer    limit   Expected 3arguments limit id must be an integer limit value must be an integer  change   is not a valid configuration option    Database is not open    Database is closing Argument 0 must be a string sqlite3.Database.Exec   sqlite3.Database.LoadExtension  З ` m ` @ OPEN_READONLY   OPEN_READWRITE  OPEN_CREATE OPEN_FULLMUTEX  OPEN_URI    OPEN_SHAREDCACHE    OPEN_PRIVATECACHE   3.39.3  VERSION 2022-09-05 11:02:23 4635f4a69c8c2a8df242b384a992aea71224e39a2ccab42d8c0b0602f1e826e8    SOURCE_ID   VERSION_NUMBER  OK  ERROR   INTERNAL    PERM    ABORT   BUSY    LOCKED  NOMEM   READONLY    INTERRUPT   IOERR   CORRUPT NOTFOUND    FULL    CANTOPEN    PROTOCOL    EMPTY   SCHEMA  TOOBIG  CONSTRAINT  MISMATCH    MISUSE  NOLFS   AUTH    FORMAT  RANGE   NOTADB  LIMIT_LENGTH    LIMIT_SQL_LENGTH    LIMIT_COLUMN    LIMIT_EXPR_DEPTH    LIMIT_COMPOUND_SELECT   LIMIT_VDBE_OP   LIMIT_FUNCTION_ARG  LIMIT_ATTACHED  LIMIT_LIKE_PATTERN_LENGTH   LIMIT_VARIABLE_NUMBER   LIMIT_TRIGGER_DEPTH LIMIT_WORKER_THREADS    SQLITE_OK   SQLITE_ERROR    SQLITE_INTERNAL SQLITE_PERM SQLITE_ABORT    SQLITE_BUSY SQLITE_LOCKED   SQLITE_NOMEM    SQLITE_READONLY SQLITE_INTERRUPT    SQLITE_IOERR    SQLITE_CORRUPT  SQLITE_NOTFOUND SQLITE_FULL SQLITE_CANTOPEN SQLITE_PROTOCOL SQLITE_EMPTY    SQLITE_SCHEMA   SQLITE_TOOBIG   SQLITE_CONSTRAINT   SQLITE_MISMATCH SQLITE_MISUSE   SQLITE_NOLFS    SQLITE_AUTH SQLITE_FORMAT   SQLITE_RANGE    SQLITE_NOTADB   SQLITE_ROW  SQLITE_DONE UNKNOWN insert  update  delete  D:\a\node-sqlite3\node-sqlite3\src\node_sqlite3.cc  node_sqlite3    napi_close_escapable_handle_scope   EscapableHandleScope::~EscapableHandleScope bind    get run all each    reset   finalize    Statement   Date    RegExp  SQL query expected  sql sqlite3.Statement.Prepare   Data type is not supported  sqlite3.Statement.Bind  sqlite3.Statement.Get   sqlite3.Statement.Run   lastID  changes sqlite3.Statement.All   sqlite3.Statement.Each  sqlite3.Statement.Reset Statement is already finalized  % %@$&m  &p%4_BYTE_ALIGNED_MALLOC   ATOMIC_INTRINSICS=0 COMPILER=msvc-1933  DEFAULT_AUTOVACUUM  DEFAULT_CACHE_SIZE=-2000    DEFAULT_FILE_FORMAT=4   DEFAULT_JOURNAL_SIZE_LIMIT=-1   DEFAULT_MMAP_SIZE=0 DEFAULT_PAGE_SIZE=4096  DEFAULT_PCACHE_INITSZ=20    DEFAULT_RECURSIVE_TRIGGERS  DEFAULT_SECTOR_SIZE=4096    DEFAULT_SYNCHRONOUS=2   DEFAULT_WAL_AUTOCHECKPOINT=1000 DEFAULT_WAL_SYNCHRONOUS=2   DEFAULT_WORKER_THREADS=0    ENABLE_DBSTAT_VTAB  ENABLE_FTS3 ENABLE_FTS4 ENABLE_FTS5 ENABLE_MATH_FUNCTIONS   ENABLE_RTREE    MALLOC_SOFT_LIMIT=1024  MAX_ATTACHED=10 MAX_COLUMN=2000 MAX_COMPOUND_SELECT=500 MAX_DEFAULT_PAGE_SIZE=8192  MAX_EXPR_DEPTH=1000 MAX_FUNCTION_ARG=127    MAX_LENGTH=1000000000   MAX_LIKE_PATTERN_LENGTH=50000   MAX_MMAP_SIZE=0x7fff0000    MAX_PAGE_COUNT=1073741823   MAX_PAGE_SIZE=65536 MAX_SQL_LENGTH=1000000000   MAX_TRIGGER_DEPTH=1000  MAX_VARIABLE_NUMBER=32766   MAX_VDBE_OP=250000000   MAX_WORKER_THREADS=8    MUTEX_W32   SYSTEM_MALLOC   TEMP_STORE=1    THREADSAFE=1    ANY BLOB    INT INTEGER REAL    TEXT    20b:20e 20c:20e 20e 40f-21a-21d now local time unavailable  auto    julianday   localtime   unixepoch   utc weekday     start of    month   year    day %02d    %06.3f  %03d    %.16g   %lld    %04d    date    time    datetime    strftime    current_time    current_timestamp   current_date    failed to allocate %u bytes of memory   failed memory resize %u to %u bytes out of memory   %   NaN NULL    (NULL)  .   (join-%u)   (subquery-%u)   922337203685477580  API call with %s database connection pointer    unopened    invalid Savepoint   AutoCommit  Transaction Checkpoint  JournalMode Vacuum  VFilter VUpdate Goto    Gosub   InitCoroutine   Yield   MustBeInt   Jump    Once    If  IfNot   IsNullOrType    IfNullRow   Not SeekLT  SeekLE  SeekGE  SeekGT  IfNotOpen   IfNoHope    NoConflict  NotFound    Found   SeekRowid   NotExists   Last    IfSmaller   SorterSort  Sort    Rewind  SorterNext  Prev    Next    IdxLE   IdxGT   IdxLT   IdxGE   Or  And RowSetRead  RowSetTest  Program FkIfZero    IfPos   IsNull  NotNull Ne  Eq  Gt  Le  Lt  Ge  ElseEq  IfNotZero   DecrJumpZero    IncrVacuum  VNext   Filter  Init    PureFunc    Function    Return  EndCoroutine    HaltIfNull  Halt    Integer Int64   String  BeginSubrtn Null    SoftNull    Blob    Variable    Move    Copy    SCopy   IntCopy FkCheck ResultRow   CollSeq AddImm  RealAffinity    Cast    Permutation Compare IsTrue  ZeroOrNull  Offset  Column  TypeCheck   Affinity    MakeRecord  Count   ReadCookie  SetCookie   ReopenIdx   BitAnd  BitOr   ShiftLeft   ShiftRight  Add Subtract    Multiply    Divide  Remainder   Concat  OpenRead    OpenWrite   BitNot  OpenDup OpenAutoindex   String8 OpenEphemeral   SorterOpen  SequenceTest    OpenPseudo  Close   ColumnsUsed SeekScan    SeekHit Sequence    NewRowid    Insert  RowCell Delete  ResetCount  SorterCompare   SorterData  RowData Rowid   NullRow SeekEnd IdxInsert   SorterInsert    IdxDelete   DeferredSeek    IdxRowid    FinishSeek  Destroy Clear   ResetSorter CreateBtree SqlExec ParseSchema LoadAnalysis    DropTable   DropIndex   Real    DropTrigger IntegrityCk RowSetAdd   Param   FkCounter   MemMax  OffsetLimit AggInverse  AggStep AggStep1    AggValue    AggFinal    Expire  CursorLock  CursorUnlock    TableLock   VBegin  VCreate VDestroy    VOpen   VInitIn VColumn VRename Pagecount   MaxPgcnt    ClrSubtype  FilterAdd   Trace   CursorHint  ReleaseReg  Noop    Explain Abortable   AreFileApisANSI CharLowerW  CharUpperW  CloseHandle CreateFileA CreateFileW CreateFileMappingA  CreateFileMappingW  CreateMutexW    DeleteFileA DeleteFileW FileTimeToLocalFileTime FileTimeToSystemTime    FlushFileBuffers    FormatMessageA  FormatMessageW  FreeLibrary GetCurrentProcessId GetDiskFreeSpaceA   GetDiskFreeSpaceW   GetFileAttributesA  GetFileAttributesW  GetFileAttributesExW    GetFileSize GetFullPathNameA    GetFullPathNameW    GetLastError    GetProcAddressA GetSystemInfo   GetSystemTime   GetSystemTimeAsFileTime GetTempPathA    GetTempPathW    GetTickCount    GetVersionExA   GetVersionExW   HeapAlloc   HeapCreate  HeapDestroy HeapFree    HeapReAlloc HeapSize    HeapValidate    HeapCompact LoadLibraryA    LoadLibraryW    LocalFree   LockFile    LockFileEx  MapViewOfFile   MultiByteToWideChar QueryPerformanceCounter ReadFile    SetEndOfFile    SetFilePointer  Sleep   SystemTimeToFileTime    UnlockFile  UnlockFileEx    UnmapViewOfFile WideCharToMultiByte WriteFile   CreateEventExW  WaitForSingleObject WaitForSingleObjectEx   SetFilePointerEx    GetFileInformationByHandleEx    MapViewOfFileFromApp    CreateFile2 LoadPackagedLibrary GetTickCount64  GetNativeSystemInfo OutputDebugStringA  OutputDebugStringW  GetProcessHeap  CreateFileMappingFromApp    InterlockedCompareExchange  UuidCreate  UuidCreateSequential    FlushViewOfFile %s  OsError 0x%lx (%lu) os_win.c:%d: (%lu) %s(%s) - %s  delayed %dms for lock/sharing conflict at line %d   winSeekFile winClose    winRead winWrite1   winWrite2   winTruncate1    winTruncate2    winSync1    winSync2    winFileSize winUnlockReadLock   winUnlock   winLockSharedMemory %s-shm  readonly_shm    winOpenShm  winShmMap1  winShmMap2  winShmMap3  winUnmapfile1   winUnmapfile2   winMapfile1 winMapfile2 etilqs_ winGetTempname1 winGetTempname2 winGetTempname4 winGetTempname5 exclusive   winOpen psow    winDelete   winAccess   %s%c%s  winFullPathname1    winFullPathname2    win32   win32-longpath  win32-none  win32-longpath-none memdb   memdb(%p,%lld)  PRAGMA "%w".page_count  ATTACH x AS %Q  recovered %d pages from %s  nolock  immutable   PRAGMA table_list   recovered %d frames from WAL file %s    cannot limit WAL size: %s   :memory:    
   invalid page number %d  2nd reference to page %d    Failed to read ptrmap key=%d    Bad ptr map entry key=%d expected=(%d,%d) got=(%d,%d)   failed to get page %d   freelist leaf count too big on page %d  size    overflow list length    %s is %d but should be %d   Page %u:    unable to get the page. error code=%d   btreeInitPage() returns error code %d   free space corruption   On tree page %u cell %d:    On page %u at right child:  Offset %d out of range %d..%d   Extends off end of page Rowid %lld out of order Child page depth differs    Multiple uses for byte %u of page %u    Fragmentation of %d bytes reported as %d on page %u Main freelist:  max rootpage (%d) disagrees with header (%d)    incremental_vacuum enabled with a max rootpage of zero  Page %d is never used   Pointer map page %d is referenced   unknown database %s destination database is in use  source and destination must be distinct %!.15g  -   %s%s    k(%d    BINARY  B   N.  ,%s%s%s )   ?   8   16LE    16BE    %.18s-%s    %s(%d)  %d  (blob)  vtab:%p %c%u    ]   program addr    opcode  p1  p2  p3  p4  p5  comment id  parent  notused detail  %.4c%s%.16c MJ delete: %s   MJ collide: %s  -mj%06X9%02X    FOREIGN KEY constraint failed   a CHECK constraint  a generated column  an index    non-deterministic use of %s() in %s API called with finalized prepared statement    API called with NULL prepared statement string or blob too big  ValueList   bind on a busy prepared statement: [%s] --  '%.*q'  zeroblob(%d)    x'  %02x    '   NOT NULL    UNIQUE  CHECK   FOREIGN KEY %s constraint failed    %z: %s  abort at %d in [%s]: %s cannot store %s value in %s column %s.%s    cannot open savepoint - SQL statements in progress  no such savepoint: %s   cannot release savepoint - SQL statements in progress   cannot commit transaction - SQL statements in progress  cannot start a transaction within a transaction cannot rollback - no transaction is active  cannot commit - no transaction is active    database schema has changed index corruption    sqlite_master   SELECT*FROM"%w".%s WHERE %s ORDER BY rowid  too many levels of trigger recursion    into    out of  cannot change %s wal mode from within a transaction database table is locked: %s    -- %s   statement aborts at %d: [%s] %s null    real    integer cannot open value of type %s    no such rowid: %lld cannot open virtual table: %s   cannot open table without rowid: %s cannot open view: %s    no such column: "%s"    foreign key indexed cannot open %s column for writing   main    *   new old excluded    misuse of aliased aggregate %s  misuse of aliased window function %s    row value misused   double-quoted string literal: "%w"  coalesce    no such column  ambiguous column name   %s: %s.%s.%s    %s: %s.%s   %s: %s  partial index WHERE clauses index expressions   CHECK constraints   generated columns   %s prohibited in %s true    false   the "." operator    second argument to %#T() must be a constant between 0.0 and 1.0 not authorized to use function: %#T non-deterministic functions %#T() may not be used as a window function  window  aggregate   misuse of %s function %#T() no such function: %#T   wrong number of arguments to function %#T() FILTER may not be used with non-aggregate %#T() subqueries  parameters  %r %s BY term out of range - should be between 1 and %d too many terms in ORDER BY clause   ORDER   %r ORDER BY term does not match any column in the result set    too many terms in %s BY clause  HAVING clause on a non-aggregate query  GROUP   aggregate functions are not allowed in the GROUP BY clause  Expression tree is too large (maximum depth %d) s   IN(...) element has %d term%s - expected %d 0   too many arguments on function %T   unsafe use of %#T() variable number must be between ?1 and ?%d  too many SQL variables  %d columns assigned %d values   too many columns in %s  _ROWID_ ROWID   OID USING ROWID SEARCH ON TABLE %s FOR IN-OPERATOR  USING INDEX %s FOR IN-OPERATOR  sub-select returns %d columns - expected %d REUSE LIST SUBQUERY %d  CORRELATED  %sLIST SUBQUERY %d  REUSE SUBQUERY %d   %sSCALAR SUBQUERY %d    1   0x  hex literal too big: %s%#T  generated column loop on "%s"   blob    text    numeric none    misuse of aggregate: %#T()  unknown function: %#T() RAISE() may only be used within a trigger-program   sqlite_ table %s may not be altered     SELECT 1 FROM "%w".sqlite_master WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X' AND sql NOT LIKE 'create virtual%%' AND sqlite_rename_test(%Q, sql, type, name, %d, %Q, %d)=NULL   SELECT 1 FROM temp.sqlite_master WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X' AND sql NOT LIKE 'create virtual%%' AND sqlite_rename_test(%Q, sql, type, name, 1, %Q, %d)=NULL    UPDATE "%w".sqlite_master SET sql = sqlite_rename_quotefix(%Q, sql)WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X' AND sql NOT LIKE 'create virtual%%'      UPDATE temp.sqlite_master SET sql = sqlite_rename_quotefix('temp', sql)WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X' AND sql NOT LIKE 'create virtual%%'  there is already another table or index with this name: %s  table   view %s may not be altered  UPDATE "%w".sqlite_master SET sql = sqlite_rename_table(%Q, type, name, sql, %Q, %Q, %d) WHERE (type!='index' OR tbl_name=%Q COLLATE nocase)AND   name NOT LIKE 'sqliteX_%%' ESCAPE 'X' UPDATE %Q.sqlite_master SET tbl_name = %Q, name = CASE WHEN type='table' THEN %Q WHEN name LIKE 'sqliteX_autoindex%%' ESCAPE 'X'      AND type='index' THEN 'sqlite_autoindex_' || %Q || substr(name,%d+18) ELSE name END WHERE tbl_name=%Q COLLATE nocase AND (type='table' OR type='index' OR type='trigger');    sqlite_sequence UPDATE "%w".sqlite_sequence set name = %Q WHERE name = %Q   UPDATE sqlite_temp_schema SET sql = sqlite_rename_table(%Q, type, name, sql, %Q, %Q, 1), tbl_name = CASE WHEN tbl_name=%Q COLLATE nocase AND   sqlite_rename_test(%Q, sql, type, name, 1, 'after rename', 0) THEN %Q ELSE tbl_name END WHERE type IN ('view', 'trigger')    after rename    SELECT raise(ABORT,%Q) FROM "%w"."%w"   Cannot add a PRIMARY KEY column Cannot add a UNIQUE column  Cannot add a REFERENCES column with non-NULL default value  Cannot add a NOT NULL column with default value NULL    Cannot add a column with non-constant default   cannot add a STORED column  UPDATE "%w".sqlite_master SET sql = printf('%%.%ds, ',sql) || %Q || substr(sql,1+length(printf('%%.%ds',sql))) WHERE type = 'table' AND name = %Q       SELECT CASE WHEN quick_check GLOB 'CHECK*' THEN raise(ABORT,'CHECK constraint failed') ELSE raise(ABORT,'NOT NULL constraint failed') END  FROM pragma_quick_check(%Q,%Q) WHERE quick_check GLOB 'CHECK*' OR quick_check GLOB 'NULL*'   virtual tables may not be altered   Cannot add a column to a view   sqlite_altertab_%s  view    virtual table   drop column from    rename columns of   cannot %s %s "%s"   no such column: "%T"        UPDATE "%w".sqlite_master SET sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, %d) WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'  AND (type != 'index' OR tbl_name = %Q)   UPDATE temp.sqlite_master SET sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, 1) WHERE type IN ('trigger', 'view')      error in %s %s%s%s: %s  CREATE  "%w"    %Q%s    %.*s%s  PRIMARY KEY cannot drop %s column: "%s" cannot drop column "%s": no other columns exist UPDATE "%w".sqlite_master SET sql = sqlite_drop_column(%d, sql, %d) WHERE (type=='table' AND tbl_name=%Q COLLATE nocase)    after drop column   sqlite_rename_column    sqlite_rename_table sqlite_rename_test  sqlite_drop_column  sqlite_rename_quotefix  sqlite_stat1    tbl,idx,stat    sqlite_stat4    sqlite_stat3    CREATE TABLE %Q.%s(%s)  DELETE FROM %Q.%s WHERE %s=%Q   stat_init   stat_push   %llu     %llu   stat_get    sqlite\_%   BBB idx tbl unordered*  sz=[0-9]*   noskipscan* SELECT tbl,idx,stat FROM %Q.sqlite_stat1    x   too many attached databases - max %d    database %s is already in use   database is already attached        attached databases must use the same text encoding as main database unable to open database: %s no such database: %s    cannot detach database %s   database %s is locked   sqlite_detach   sqlite_attach   %s cannot use variables %s %T cannot reference objects in database %s   authorizer malfunction  %s.%s   %s.%z   access to %z is prohibited  not authorized  sqlite_temp_schema  sqlite_schema   sqlite_temp_master  pragma_ no such view    no such table   corrupt database    unknown database %T object name reserved for internal use: %s   temporary table name must be unqualified    %s %T already exists    there is already an index named %s  sqlite_returning    cannot use RETURNING in a trigger   too many columns on %s  always  generated   duplicate column name: %s   default value of column [%s] is not constant    cannot use DEFAULT on a generated column    generated columns cannot be part of the PRIMARY KEY table "%s" has more than one primary key    AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY virtual tables cannot use computed columns  virtual stored  error in generated column "%s"  ,   
   ,
      
)  CREATE TABLE     TEXT    NUM     INT     REAL   unknown datatype for %s.%s: "%s"    missing datatype for %s.%s  AUTOINCREMENT not allowed on WITHOUT ROWID tables   PRIMARY KEY missing on table %s must have at least one non-generated column TABLE   VIEW    CREATE %s %.*s  UPDATE %Q.sqlite_master SET type='%s', name=%Q, tbl_name=%Q, rootpage=#%d, sql=%Q WHERE rowid=#%d   CREATE TABLE %Q.sqlite_sequence(name,seq)   tbl_name='%q' AND type!='trigger'   parameters are not allowed in views view %s is circularly defined   corrupt schema  UPDATE %Q.sqlite_master SET rootpage=%d WHERE #%d AND rootpage=#%d  sqlite_stat%d   DELETE FROM %Q.sqlite_sequence WHERE name=%Q        DELETE FROM %Q.sqlite_master WHERE tbl_name=%Q and type!='trigger'  stat    table %s may not be dropped use DROP TABLE to delete table %s   use DROP VIEW to delete view %s foreign key on %s should reference only one column of table %T      number of columns in foreign key does not match the number of columns in the referenced table   unknown column "%s" in foreign key definition   FIRST   LAST    unsupported use of NULLS %s index   cannot create a TEMP index on non-TEMP table "%s"   table %s may not be indexed views may not be indexed    virtual tables may not be indexed   there is already a table named %s   index %s already exists sqlite_autoindex_%s_%d  expressions prohibited in PRIMARY KEY and UNIQUE constraints    conflicting ON CONFLICT clauses specified   invalid rootpage     UNIQUE CREATE%s INDEX %.*s INSERT INTO %Q.sqlite_master VALUES('index',%Q,%Q,#%d,%Q);  name='%q' AND type='index'  no such index: %S   index associated with UNIQUE or PRIMARY KEY constraint cannot be dropped    DELETE FROM %Q.sqlite_master WHERE name=%Q AND type='index' too many FROM clause terms, max: %d ON  USING   a JOIN clause is required before %s BEGIN   ROLLBACK    COMMIT  RELEASE unable to open a temporary database file for storing temporary tables   index '%q'  ,   %s.rowid    unable to identify the object to be reindexed   duplicate WITH table name: %s   no such collation sequence: %s  table %s may not be modified    cannot modify %s because it is a view   rows deleted    integer overflow    %.*f    LIKE or GLOB pattern too complex    ESCAPE expression must be a single character    %!.20e  %Q  MATCH   like    implies_nonnull_row expr_compare    expr_implies_expr   affinity    load_extension  sqlite_compileoption_used   sqlite_compileoption_get    unlikely    likelihood  likely  ltrim   rtrim   trim    min max typeof  subtype length  instr   printf  format  unicode char    abs round   upper   lower   hex ifnull  random  randomblob  nullif  sqlite_version  sqlite_source_id    sqlite_log  quote   last_insert_rowid   total_changes   replace zeroblob    substr  substring   sum total   avg count   group_concat    glob    ceil    ceiling floor   trunc   ln  log log10   log2    exp pow power   mod acos    asin    atan    atan2   cos sin tan cosh    sinh    tanh    acosh   asinh   atanh   sqrt    radians degrees pi  sign    iif foreign key mismatch - "%w" referencing "%w"    cannot INSERT into generated column "%s"    table %S has no column named %s table %S has %d columns but %d values were supplied %d values for %d columns    UPSERT not implemented for virtual table "%s"   cannot UPSERT a view    rows inserted   dll sqlite3_extension_init  lib _init   no entry point [%s] in shared library [%s]  error during initialization: %s unable to open shared library [%.*s]    automatic extension loading failed: %s  seq from    to  on_update   on_delete   match   cid name    type    notnull dflt_value  pk  hidden  schema  ncol    wr  strict  seqno   desc    coll    key builtin enc narg    flags   wdth    hght    flgs    unique  origin  partial rowid   fkid    file    busy    checkpointed    database    status  cache_size  timeout analysis_limit  application_id  auto_vacuum automatic_index busy_timeout    cache_spill case_sensitive_like cell_size_check checkpoint_fullfsync    collation_list  compile_options count_changes   data_store_directory    data_version    database_list   default_cache_size  defer_foreign_keys  empty_result_callbacks  encoding    foreign_key_check   foreign_key_list    foreign_keys    freelist_count  full_column_names   fullfsync   function_list   hard_heap_limit ignore_check_constraints    incremental_vacuum  index_info  index_list  index_xinfo integrity_check journal_mode    journal_size_limit  legacy_alter_table  locking_mode    max_page_count  mmap_size   module_list optimize    page_count  page_size   pragma_list query_only  quick_check read_uncommitted    recursive_triggers  reverse_unordered_selects   schema_version  secure_delete   short_column_names  shrink_memory   soft_heap_limit synchronous table_info  table_list  table_xinfo temp_store  temp_store_directory    threads trusted_schema  user_version    wal_autocheckpoint  wal_checkpoint  writable_schema normal  full    incremental memory  temporary storage cannot be changed from within a transaction   SET NULL    SET DEFAULT CASCADE RESTRICT    NO ACTION   persist off truncate    wal utf8    utf16le utf16be w   a   sissii  -%T fast    not a writable directory    Safety level may not be changed inside a transaction    issisii issisi  SELECT*FROM"%w" shadow  sssiii  iisX    isiX    c   u   isisi   iss is  NONE    iissssss    siX *** in database %s ***
 NULL value in %s.%s non-%s value in %s.%s   CHECK constraint failed in %s   row      missing from index     non-unique entry in index   wrong # of entries in index     ok  UTF8    UTF-8   UTF-16le    UTF-16be    UTF16le UTF16be UTF-16  UTF16   unsupported encoding: %s    restart ANALYZE "%w"."%w"   CREATE TABLE x  %c"%s"  ("%s"   ,arg HIDDEN ,schema HIDDEN  PRAGMA  %Q. =%Q rename  drop column add column  error in %s %s after %s: %s malformed database schema (%s)  %z - %s orphan index        CREATE TABLE x(type text,name text,tbl_name text,rootpage int,sql text) unsupported file format SELECT*FROM"%w".%s ORDER BY rowid   database schema is locked: %s   statement too long  unknown join type: %T%s%T%s%T   a NATURAL join may not have an ON or USING clause       cannot join using column %s - column not present in both tables ambiguous reference to %s in USING()    UNION ALL   INTERSECT   EXCEPT  UNION   USE TEMP B-TREE FOR %s  column%d    %.*z:%u cannot use window functions in recursive queries    recursive aggregate queries not supported   SETUP   RECURSIVE STEP  S   SCAN %d CONSTANT ROW%s  COMPOUND QUERY  LEFT-MOST SUBQUERY  %s USING TEMP B-TREE    all VALUES must have the same number of terms       SELECTs to the left and right of %s do not have the same number of result columns   MERGE (%s)  LEFT    RIGHT   no such index: %s   '%s' is not a function  no such index: "%s" multiple references to recursive table: %s  circular reference: %s  table %s has %d values for %d columns   multiple recursive references: %s   recursive reference in a subquery: %s   %!S too many references to "%s": max 65535  access to view "%s" prohibited  unsafe use of virtual table "%s"    ..%s    %s.%s.%s    no such table: %s   no tables specified too many columns in result set  DISTINCT aggregates must have exactly one argument  USE TEMP B-TREE FOR %s(DISTINCT)     USING COVERING INDEX   SCAN %s%s%s target object/alias may not appear in FROM clause: %s   expected %d columns for '%s' but got %d CO-ROUTINE %!S  MATERIALIZE %!S DISTINCT    GROUP BY    RIGHT PART OF ORDER BY  ORDER BY        sqlite3_get_table() called with two or more incompatible queries    temporary trigger may not have qualified name   trigger cannot create triggers on virtual tables    trigger %T already exists   cannot create trigger on system table   BEFORE  AFTER   cannot create %s trigger on view: %S    cannot create INSTEAD OF trigger on table: %S       INSERT INTO %Q.sqlite_master VALUES('trigger',%Q,%Q,0,'CREATE TRIGGER %q')  type='trigger' AND name='%q'    no such trigger: %S DELETE FROM %Q.sqlite_master WHERE name=%Q AND type='trigger'   DELETE  UPDATE  %s RETURNING is not available on virtual tables RETURNING may not use "TABLE.*" wildcards   -- TRIGGER %s   cannot UPDATE generated column "%s" no such column: %s  rows updated    %r  %sON CONFLICT clause does not match any PRIMARY KEY or UNIQUE constraint    CRE INS cannot VACUUM from within a transaction cannot VACUUM - SQL statements in progress  non-text filename   ATTACH %Q AS vacuum_db  output file already exists  SELECT sql FROM "%w".sqlite_schema WHERE type='table'AND name<>'sqlite_sequence' AND coalesce(rootpage,1)>0 SELECT sql FROM "%w".sqlite_schema WHERE type='index'       SELECT'INSERT INTO vacuum_db.'||quote(name)||' SELECT*FROM"%w".'||quote(name)FROM vacuum_db.sqlite_schema WHERE type='table'AND coalesce(rootpage,1)>0  INSERT INTO vacuum_db.sqlite_schema SELECT*FROM "%w".sqlite_schema WHERE type IN('view','trigger') OR(type='table'AND rootpage=0)   CREATE VIRTUAL TABLE %T     UPDATE %Q.sqlite_master SET type='table', name=%Q, tbl_name=%Q, rootpage=0, sql=%Q WHERE rowid=#%d  name=%Q AND sql=%Q  vtable constructor called recursively: %s   vtable constructor failed: %s   vtable constructor did not declare schema: %s   no such module: %s  <expr>   AND    (    (  %s=?    ANY(%s) >   <   SEARCH  SCAN    %s %S   AUTOMATIC PARTIAL COVERING INDEX    AUTOMATIC COVERING INDEX    COVERING INDEX %s   INDEX %s     USING   USING INTEGER PRIMARY KEY (%s  >? AND %s   %c?)     VIRTUAL TABLE INDEX %d:%s   LEFT-JOIN  BLOOM FILTER ON %S (    rowid=? MULTI-INDEX OR  INDEX %d    RIGHT-JOIN %s   regexp  ON clause references tables to its right    NOCASE  too many arguments on %s() - max %d automatic index on %s(%s)   auto-index  %s.xBestIndex malfunction   abbreviated query algorithm search  no query solution   at most %d tables in a join SCAN CONSTANT ROW   second argument to nth_value must be a positive integer argument of ntile must be a positive integer    no such window: %s  RANGE with offset PRECEDING/FOLLOWING requires one ORDER BY expression  FILTER clause may only be used with aggregate window functions  misuse of aggregate: %s()   unsupported frame specification PARTITION clause    ORDER BY clause frame specification cannot override %s of window: %s    DISTINCT is not supported for window functions  frame starting offset must be a non-negative integer    frame ending offset must be a non-negative integer  frame starting offset must be a non-negative number frame ending offset must be a non-negative number   LIMIT   %s clause should come after %s not before   too many terms in compound SELECT   syntax error after column name "%.*s"   parser stack overflow   unknown table option: %.*s  set list    near "%T": syntax error     qualified table names are not allowed on INSERT, UPDATE, and DELETE statements within triggers  the INDEXED BY clause is not allowed on UPDATE or DELETE statements within triggers     the NOT INDEXED clause is not allowed on UPDATE or DELETE statements within triggers    incomplete input    unrecognized token: "%T"    %s in "%s"  create  temp    temporary   end explain     unable to close due to unfinalized statements or unfinished backups not an error    SQL logic error access permission denied    query aborted   database is locked  database table is locked    attempt to write a readonly database    interrupted disk I/O error  database disk image is malformed    unknown operation   database or disk is full    unable to open database file    locking protocol    constraint failed   datatype mismatch   bad parameter or other API misuse   authorization denied    column index out of range   file is not a database  notification message    warning message unknown error   abort due to ROLLBACK   another row available   no more rows available  unable to delete/modify user-function due to active statements  unable to use function %s in the requested context  unknown database: %s    unable to delete/modify collation sequence due to active statements invalid uri authority: %.*s cache   shared  private ro  rw  rwc access  no such %s mode: %s %s mode not allowed: %s no such vfs: %s RTRIM       %s at line %d of [%.10s]    database corruption misuse  cannot open file    no such table column: %s.%s SQLITE_ --  DROP TABLE IF EXISTS %Q.'%q_segments';DROP TABLE IF EXISTS %Q.'%q_segdir';DROP TABLE IF EXISTS %Q.'%q_docsize';DROP TABLE IF EXISTS %Q.'%q_stat';%s DROP TABLE IF EXISTS %Q.'%q_content';   __langid    %Q,     %z%Q,   CREATE TABLE x(%s %Q HIDDEN, docid HIDDEN, %Q HIDDEN)   CREATE TABLE IF NOT EXISTS %Q.'%q_stat'(id INTEGER PRIMARY KEY, value BLOB);    docid INTEGER PRIMARY KEY   %z, 'c%d%q' %z, langid  CREATE TABLE %Q.'%q_content'(%s)    CREATE TABLE %Q.'%q_segments'(blockid INTEGER PRIMARY KEY, block BLOB); CREATE TABLE %Q.'%q_segdir'(level INTEGER,idx INTEGER,start_block INTEGER,leaves_end_block INTEGER,end_block INTEGER,root BLOB,PRIMARY KEY(level, idx));        CREATE TABLE %Q.'%q_docsize'(docid INTEGER PRIMARY KEY, size BLOB); PRAGMA %Q.page_size docid   ,%s(x.'c%d%q')  langid  , x.%Q  , x.'%q'    _content     FROM '%q'.'%q%s' AS x  ,%s(?)  , ? SELECT * FROM %Q.%Q tokenize    matchinfo   prefix  compress    uncompress  order   content languageid  notindexed  fts3    unrecognized matchinfo: %s  asc unrecognized order: %s  unrecognized parameter: %s  simple  error parsing prefix parameter: %s  missing %s parameter in fts4 constructor    DESC    ASC SELECT %s WHERE rowid = ?   SELECT %s WHERE rowid BETWEEN %lld AND %lld ORDER BY rowid %s   SELECT %s ORDER BY rowid %s fts3cursor  %s_stat illegal first argument to %s    <b> </b>    <b>...</b>  wrong number of arguments to function snippet() snippet offsets Index optimized Index already optimal   ALTER TABLE %Q.'%q_content'  RENAME TO '%q_content';    ALTER TABLE %Q.'%q_docsize'  RENAME TO '%q_docsize';    ALTER TABLE %Q.'%q_stat'  RENAME TO '%q_stat';  ALTER TABLE %Q.'%q_segments' RENAME TO '%q_segments';   ALTER TABLE %Q.'%q_segdir'   RENAME TO '%q_segdir'; docsize segdir  segments    porter  unicode61   fts3_tokenizer  fts4    CREATE TABLE x(term, col, documents, occurrences, languageid HIDDEN)    invalid arguments to fts4aux constructor    fts4aux OR  AND NOT NEAR    FTS expression tree is too large (maximum depth %d) malformed MATCH expression: [%s]    ss  sess    i   sei ee  dee gni de  ate ta  ble lb  ize zi  lanoita tion    lanoit  ence    icne    ance    icna    rezi    igol    ilb al  illa    ent iltne   e   ile ous ilsuo   noitazi noita   rota    msila   ive ssenevi ful ssenluf ssensuo itila   itivi   itilib  ic  etaci   evita   ezila   itici   laci    luf ssen    tneme   tnem    tne noi eta iti argument type mismatch  fts3tokenize disabled   unknown tokenizer: %s   unknown tokenizer   CREATE TABLE x(input, token, start, end, position)  fts3tokenize    DELETE FROM %Q.'%q_content' WHERE rowid = ? SELECT NOT EXISTS(SELECT docid FROM %Q.'%q_content' WHERE rowid!=?) DELETE FROM %Q.'%q_content' DELETE FROM %Q.'%q_segments'    DELETE FROM %Q.'%q_segdir'  DELETE FROM %Q.'%q_docsize' DELETE FROM %Q.'%q_stat'    SELECT %s WHERE rowid=?     SELECT (SELECT max(idx) FROM %Q.'%q_segdir' WHERE level = ?) + 1    REPLACE INTO %Q.'%q_segments'(blockid, block) VALUES(?, ?)  SELECT coalesce((SELECT max(blockid) FROM %Q.'%q_segments') + 1, 1) REPLACE INTO %Q.'%q_segdir' VALUES(?,?,?,?,?,?)     SELECT idx, start_block, leaves_end_block, end_block, root FROM %Q.'%q_segdir' WHERE level = ? ORDER BY idx ASC SELECT idx, start_block, leaves_end_block, end_block, root FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ?ORDER BY level DESC, idx ASC  SELECT count(*) FROM %Q.'%q_segdir' WHERE level = ?     SELECT max(level) FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ?   DELETE FROM %Q.'%q_segdir' WHERE level = ?  DELETE FROM %Q.'%q_segments' WHERE blockid BETWEEN ? AND ?  INSERT INTO %Q.'%q_content' VALUES(%s)  DELETE FROM %Q.'%q_docsize' WHERE docid = ? REPLACE INTO %Q.'%q_docsize' VALUES(?,?)    SELECT size FROM %Q.'%q_docsize' WHERE docid=?  SELECT value FROM %Q.'%q_stat' WHERE id=?   REPLACE INTO %Q.'%q_stat' VALUES(?,?)   DELETE FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ?  SELECT ? UNION SELECT level / (1024 * ?) FROM %Q.'%q_segdir'    SELECT level, count(*) AS cnt FROM %Q.'%q_segdir'   GROUP BY level HAVING cnt>=?  ORDER BY (level %% 1024) ASC, 2 DESC LIMIT 1  SELECT 2 * total(1 + leaves_end_block - start_block)   FROM (SELECT * FROM %Q.'%q_segdir'         WHERE level = ? ORDER BY idx ASC LIMIT ?  )   DELETE FROM %Q.'%q_segdir' WHERE level = ? AND idx = ?  UPDATE %Q.'%q_segdir' SET idx = ? WHERE level=? AND idx=?       SELECT idx, start_block, leaves_end_block, end_block, root FROM %Q.'%q_segdir' WHERE level = ? AND idx = ?      UPDATE %Q.'%q_segdir' SET start_block = ?, root = ?WHERE level = ? AND idx = ?  SELECT 1 FROM %Q.'%q_segments' WHERE blockid=? AND block IS NULL    SELECT idx FROM %Q.'%q_segdir' WHERE level=? ORDER BY 1 ASC SELECT max( level %% 1024 ) FROM %Q.'%q_segdir' SELECT level, idx, end_block FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ? ORDER BY level DESC, idx ASC       UPDATE OR FAIL %Q.'%q_segdir' SET level=-1,idx=? WHERE level=? AND idx=?    UPDATE OR FAIL %Q.'%q_segdir' SET level=? WHERE level=-1    %s_segments block   %lld %lld   SELECT %s   rebuild integrity-check merge=  automerge=  SAVEPOINT fts3  RELEASE fts3    ROLLBACK TO fts3    unrecognized matchinfo request: %c  %d %d %d %d     pcx remove_diacritics=1 remove_diacritics=0 remove_diacritics=2 tokenchars= separators= array   object  0123456789abcdef    JSON cannot hold BLOB values    malformed JSON  [0] JSON path error near '%q'   json_%s() needs an odd number of arguments  $.  json_object() requires an even number of arguments  json_object() labels must be TEXT   set []  {}  CREATE TABLE x(key,value,type,atom,id,parent,fullkey,path,json HIDDEN,root HIDDEN)  .%.*s   [%d]    $   json    json_array  json_array_length   json_extract    ->  ->> json_insert json_object json_patch  json_quote  json_remove json_replace    json_set    json_type   json_valid  json_group_array    json_group_object   json_each   json_tree   %s_node data    DROP TABLE '%q'.'%q_node';DROP TABLE '%q'.'%q_rowid';DROP TABLE '%q'.'%q_parent';   RtreeMatchArg   UNIQUE constraint failed: %s.%s rtree constraint failed: %s.(%s<=%s)        ALTER TABLE %Q.'%q_node'   RENAME TO "%w_node";ALTER TABLE %Q.'%q_parent' RENAME TO "%w_parent";ALTER TABLE %Q.'%q_rowid'  RENAME TO "%w_rowid";    SELECT stat FROM %Q.sqlite_stat1 WHERE tbl = '%q_rowid' node    INSERT OR REPLACE INTO '%q'.'%q_node' VALUES(?1, ?2)    DELETE FROM '%q'.'%q_node' WHERE nodeno = ?1    SELECT nodeno FROM '%q'.'%q_rowid' WHERE rowid = ?1 INSERT OR REPLACE INTO '%q'.'%q_rowid' VALUES(?1, ?2)   DELETE FROM '%q'.'%q_rowid' WHERE rowid = ?1    SELECT parentnode FROM '%q'.'%q_parent' WHERE nodeno = ?1   INSERT OR REPLACE INTO '%q'.'%q_parent' VALUES(?1, ?2)  DELETE FROM '%q'.'%q_parent' WHERE nodeno = ?1  CREATE TABLE "%w"."%w_rowid"(rowid INTEGER PRIMARY KEY,nodeno   ,a%d        );CREATE TABLE "%w"."%w_node"(nodeno INTEGER PRIMARY KEY,data); CREATE TABLE "%w"."%w_parent"(nodeno INTEGER PRIMARY KEY,parentnode);   INSERT INTO "%w"."%w_node"VALUES(1,zeroblob(%d))        INSERT INTO"%w"."%w_rowid"(rowid,nodeno)VALUES(?1,?2)ON CONFLICT(rowid)DO UPDATE SET nodeno=excluded.nodeno SELECT * FROM "%w"."%w_rowid" WHERE rowid=?1    UPDATE "%w"."%w_rowid"SET   a%d=?%d  WHERE rowid=?1 SELECT length(data) FROM '%q'.'%q_node' WHERE nodeno = 1    undersize RTree blobs in "%q_node"  Wrong number of columns for an rtree table  Too few columns for an rtree table  Too many columns for an rtree table Auxiliary rtree columns must be last    CREATE TABLE x(%.*s INT ,%.*s   ,%.*s REAL  ,%.*s INT   );  {%lld    %g }   Invalid argument to rtreedepth()    %z%s%z  SELECT data FROM %Q.'%q_node' WHERE nodeno=?    Node %lld missing from database SELECT parentnode FROM %Q.'%q_parent' WHERE nodeno=?1   SELECT nodeno FROM %Q.'%q_rowid' WHERE rowid=?1 %_rowid %_parent    Mapping (%lld -> %lld) missing from %s table    Found (%lld -> %lld) in %s table, expected (%lld -> %lld)   Dimension %d of cell %d on node %lld is corrupt     Dimension %d of cell %d on node %lld is corrupt relative to parent  Node %lld is too small (%d bytes)   Rtree depth out of range (%d)   Node %lld is too small for cell count of %d (%d bytes)  SELECT count(*) FROM %Q.'%q%s'  Wrong number of entries in %%%s table - expected %lld, actual %lld  SELECT * FROM %Q.'%q_rowid' Schema corrupt or not an rtree  _rowid  _parent END wrong number of arguments to function rtreecheck()  rtreenode   rtreedepth  rtreecheck  rtree   rtree_i32   /   overflow    %s%.3x+%.6x %s%.3x/ internal    leaf    corrupted       SELECT * FROM (SELECT 'sqlite_schema' AS name,1 AS rootpage,'table' AS type UNION ALL SELECT name,rootpage,type FROM "%w".sqlite_schema WHERE rootpage!=0)  WHERE name=%Q    ORDER BY name  dbstat  fts5: parser stack overflow fts5: syntax error near "%.*s"  %z%.*s  wrong number of arguments to function highlight()   highlight   bm25    malformed prefix=... directive  too many prefix indexes (max %d)    prefix length out of range (max 999)    multiple tokenize=... directives    parse error in tokenize directive   multiple content=... directives %Q.%Q   content_rowid   multiple content_rowid=... directives   columnsize  malformed columnsize=... directive  columns malformed detail=... directive  unrecognized option: "%.*s" rank    reserved fts5 column name: %s   unindexed   unrecognized column option: %s  T.%Q    , T.%Q  , T.c%d reserved fts5 table name: %s    parse error in "%s" %Q.'%q_%s'  CREATE TABLE x( %z%s%Q  %z, %Q HIDDEN, %s HIDDEN)   pgsz    hashsize    automerge   usermerge   crisismerge SELECT k, v FROM %Q.'%q_config' version invalid fts5 file format (found %d, expected %d) - run 'rebuild'    unterminated string fts5: syntax error near "%.1s"  expected integer, got "%.*s"    fts5: column queries are not supported (detail=none)    phrase  fts5: %s queries are not supported (detail!=full)   REPLACE INTO '%q'.'%q_data'(id, block) VALUES(?,?)  DELETE FROM '%q'.'%q_data' WHERE id>=? AND id<=?    DELETE FROM '%q'.'%q_idx' WHERE segid=? PRAGMA %Q.data_version      SELECT pgno FROM '%q'.'%q_idx' WHERE segid=? AND term<=? ORDER BY term DESC LIMIT 1 INSERT INTO '%q'.'%q_idx'(segid,term,pgno) VALUES(?,?,?)    %s_data id INTEGER PRIMARY KEY, block BLOB  segid, term, pgno, PRIMARY KEY(segid, term) SELECT segid, term, (pgno>>1), (pgno&1) FROM %Q.'%q_idx' WHERE segid=%d ORDER BY 1, 2   recursively defined fts5 content table  SELECT rowid, rank FROM %Q.%Q ORDER BY %s("%w"%s%s) %s  reads   unknown special query: %.*s no such function: %s    parse error in rank function: %s    %s: table does not support scanning delete-all  'delete-all' may only be used with a contentless or external content fts5 table 'rebuild' may not be used with a contentless fts5 table merge   DELETE from cannot %s contentless fts5 table: %s    no such cursor: %lld    no such tokenizer: %s   error in tokenizer constructor  fts5_api_ptr        fts5: 2022-09-05 11:02:23 4635f4a69c8c2a8df242b384a992aea71224e39a2ccab42d8c0b0602f1e826e8  config  fts5    fts5_source_id      SELECT %s FROM %s T WHERE T.%Q >= ? AND T.%Q <= ? ORDER BY T.%Q ASC     SELECT %s FROM %s T WHERE T.%Q <= ? AND T.%Q >= ? ORDER BY T.%Q DESC    SELECT %s FROM %s T WHERE T.%Q=?    REPLACE INTO %Q.'%q_content' VALUES(%s) DELETE FROM %Q.'%q_content' WHERE id=?  DELETE FROM %Q.'%q_docsize' WHERE id=?  SELECT sz FROM %Q.'%q_docsize' WHERE id=?   REPLACE INTO %Q.'%q_config' VALUES(?,?) SELECT %s FROM %s AS T  DROP TABLE IF EXISTS %Q.'%q_data';DROP TABLE IF EXISTS %Q.'%q_idx';DROP TABLE IF EXISTS %Q.'%q_config'; DROP TABLE IF EXISTS %Q.'%q_docsize';   DROP TABLE IF EXISTS %Q.'%q_content';   ALTER TABLE %Q.'%q_%s' RENAME TO '%q_%s';    WITHOUT ROWID  CREATE TABLE %Q.'%q_%q'(%s)%s   fts5: error creating shadow table %q_%s: %s id INTEGER PRIMARY KEY  , c%d   id INTEGER PRIMARY KEY, sz BLOB k PRIMARY KEY, v    DELETE FROM %Q.'%q_data';DELETE FROM %Q.'%q_idx';   DELETE FROM %Q.'%q_docsize';    SELECT count(*) FROM %Q.'%q_%s' tokenchars  separators  L* N* Co    categories  remove_diacritics   case_sensitive  ascii   trigram col row instance    fts5vocab: unknown table type: %Q   CREATE TABlE vocab(term, col, doc, cnt) CREATE TABlE vocab(term, doc, cnt)  CREATE TABlE vocab(term, doc, col, offset)  wrong number of vtable arguments    recursive definition for %s.%s  SELECT t.%Q FROM %Q.%Q AS t WHERE t.%Q MATCH '*id'  no such fts5 table: %s.%s   fts5vocab               Mg<|=:0yE>ư>MbP?9RFߑ??      ?      ?9B.?      ?   ?      ?      ?333333?       @@Uk@      @-DT!	@      @      @      @      @       @      "@      $@      &@      (@      *@      ,@      .@      0@      1@      2@      3@      4@      5@      6@      7@      8@      9@      :@      >@aTR'>@      H@cܥL@Zd;M@      P@      Y@fffff^@     v@     @@     p@     @@     җ@     @    @      @       A    A      A    `&A    .A   @}<A   /GA    SA    TA    pA    חA      A    eA  A    _B  MB @dB /dB      0C      Cd~QJ.BmT}Ô%IT                              @  QH      0                                                                  (   (   (   (                          @       @AAAAAAAAAAAAAAAAZZZZZZZZZZZZZZZZ                            ?              A          BB     8B.?0gǓW.=                      ?      ?                      0C      0C                      U	I? Ͽu}MUſUUUUU?Sz?           ?      ?3      3                  0C                                j+#c       V         j+#c          p p     j+#c       T        j+#c                                                                               ;               ;            @               ;           ,8    ;           @               ;h           x8    ;           @   h            <               <            @                <                 <           @                @<L           \l    @<           @   L            `<               `<           @   Lh h l  m  ݊  e   = }   E   Ѝ    ] ӎ ֏ %  Ր ' u    e   3  ͓  - ]   - ]  ݕ +  6 × K  . } 8 u  ݚ  e   d  E } ǝ & k  u   U   e Ρ  M  ܢ = ȣ  e Ф $ t ĥ  } ] L    1 N k      L    H   [ [ c c dd d d d d 'e /e  % ' J L y fz *| W   Uc   l @  Jq v   4      y    0      RSDS~'J{B/w   D:\a\node-sqlite3\node-sqlite3\build\Release\node_sqlite3.pdb                    GCTL      .text$di      Pz .text$mn    ` R  .text$x     .idata$5        .00cfg      .CRT$XCA        .CRT$XCU        .CRT$XCZ        .CRT$XIA         .CRT$XIC        .CRT$XIZ        .CRT$XPA        .CRT$XPX         .CRT$XPXA   $    .CRT$XPZ    (    .CRT$XTA    ,    .CRT$XTZ    0  .rdata     .rdata$r       .rdata$sxdata   l    .rdata$voltmd      .rdata$zzzdbg       .rtc$IAA        .rtc$IZZ        .rtc$TAA        .rtc$TZZ     D  .xdata$x    ,     .didat$2    L     .didat$3    l (  .didat$4     t  .didat$6      (  .didat$7    0    .idata$2    D    .idata$3    X   .idata$4    @   .idata$6      +  .data   ;    .data$r <    .data$rs    < (  .didat$5    =   .bss     P `   .rsrc$01    `P   .rsrc$02                    `"                          "                          Њ"   @                       "   l                       PX"                             "                          "                           (0"   4                       p"   p                       "                                 "                          0    8"                          p    {"   @                       "                               ck"                          "                          P"                          "	   @                                           Ǝ       "                                   !   ,   :   H   V   ^   ɏ               f   n                       "   L                       "                          zPX   g   r          Ȑ"                              "                           P    X   `   h"   \                       "                          "                          "                           PX"   ,                       "   `                       "                                               &"                          `    h    x    p    "   4                       "   `                        "                          P"                                  "                          "                            "   L                       P"   x                       "                          Е"                                       "                          "
   t                       `    k   s    {                    "                                               )"	   D                       `    n    v~               "
                                             &   .   6   >"                           "
   X                       И    ۘ               	         !`h   p"                          "                          Ǚ֙ޙ#
   +`h"   h                       "                          К"                           "                          @    H   P   X"                                     "   d                                 "                          "                          W0   8   @   O"
   \                                          Ü   Μ   ֜   ޜ     (   0   8"                          p"                                  "                                   "   X                       P    ["                          "                                        ʞ      
   ؞   	   
      P    X   `   h"   T                       "                          "                          "                               (   0   8   @   H          "   D                       "                          Р    ۠                  PX"                                    "                           ck"   d                       "                                     (   0    8   @    "                          Ȣ"                           "   x                              (   0"                          p   "                          @    H   P   X"   (                       "                                               ä         "                          P    X    g"                                  "   @                               "   |                       "                          @    H   P    X   `    h   p"   8                              ǦϦ   צ   *9   A   P"                                       ƧΧݧ
(   0   ?        "   D                       "                                          X                TY        GY        0ZOZ    M]    $   0L   ;           \    ;           !]    M]    x   0L    ;           \            a(a     <           e    M]        L    @<           e            j*j                ~    ~~            |    *|4|@           }                      "                             ss            TtXt    M]    4   @L    `<           L{            1E                E            $?                Qckck"                                                                                                                  P                                                k                |                ^                #                	'                $                R(                (                [2                =                IP                )R                %[                ^                l                Ms               0 = < l                                                 
  4 F V n        $ : J d z        6 D R f ~       & > V p       
  , @ P ` p        0 D h         uenapi_create_function  enapi_open_handle_scope  enapi_get_element  enapi_get_boolean  enapi_get_last_error_info  qenapi_create_error Zenapi_call_function  enapi_instanceof enapi_get_null enapi_queue_async_work enapi_reference_ref  enapi_delete_reference enapi_fatal_error  enapi_is_exception_pending enapi_get_value_string_utf8  enapi_unwrap enapi_reference_unref  enapi_get_property Venapi_add_finalizer  enapi_is_array enapi_create_type_error  enapi_get_value_bool enapi_wrap henapi_create_async_work  ~enapi_create_string_utf8 enapi_has_property enapi_set_named_property enapi_get_named_property enapi_define_properties  enapi_get_instance_data  enapi_typeof enapi_throw  enapi_define_class enapi_get_value_int32  enapi_get_and_clear_last_exception xenapi_create_object  enapi_get_undefined  enapi_get_new_target enapi_set_property enapi_get_cb_info  enapi_delete_async_work  enapi_throw_type_error {enapi_create_reference `enapi_close_handle_scope penapi_create_double  enapi_get_array_length enapi_remove_wrap  enapi_get_reference_value  enapi_get_uv_event_loop  fuv_mutex_unlock fuv_mutex_lock fuv_close  enapi_strict_equals  fuv_mutex_destroy  fuv_mutex_init euv_async_send euv_async_init enapi_get_value_double enapi_set_instance_data  enapi_module_register  fenapi_create_array_with_length benapi_coerce_to_number enapi_get_global enapi_get_property_names enapi_is_buffer  enapi_set_element  _enapi_close_escapable_handle_scope denapi_coerce_to_string enapi_escape_handle  enapi_get_buffer_info  enapi_get_typedarray_info  enapi_open_escapable_handle_scope  menapi_create_buffer_copy                                                                                                                                                                                                                                                                                                         X         T                       @  b t           " : V h |          . : P X h z         * 8 F T b r          
   2 J X n         * H \ p        	 "	 2	 Z	 f	 t	 	 	 	 	 	 	 	 	 
 $
 4
 N
 Z
 n
 ~
 
 
 
 
 
 
 
 
 $ 4 B T d t          yGetModuleHandleA  KERNEL32.dll  # AreFileApisANSI ReadFile  TryEnterCriticalSection SHeapCreate  UHeapFree  5EnterCriticalSection  ]GetFullPathNameW  "WriteFile -GetDiskFreeSpaceW #OutputDebugStringA  LockFile  LeaveCriticalSection  jInitializeCriticalSection .SetFilePointer  ZGetFullPathNameA  SetEndOfFile  UnlockFileEx   GetTempPathW   CreateMutexW  WaitForSingleObject  CreateFileW IGetFileAttributesW   GetCurrentThreadId  UnmapViewOfFile ]HeapValidate  ZHeapSize  MultiByteToWideChar Sleep GetTempPathA  FormatMessageW  *GetDiskFreeSpaceA eGetLastError  DGetFileAttributesA  FGetFileAttributesExW  $OutputDebugStringW  FlushViewOfFile  CreateFileA LoadLibraryA  WaitForSingleObjectEx DeleteFileA DeleteFileW XHeapReAlloc  CloseHandle GetSystemInfo LoadLibraryW  QHeapAlloc RHeapCompact THeapDestroy UnlockFile  GetProcAddress  LocalFree LockFileEx  OGetFileSize DeleteCriticalSection GetCurrentProcessId GetProcessHeap  SystemTimeToFileTime  FreeLibrary WideCharToMultiByte GetSystemTimeAsFileTime GetSystemTime FormatMessageA   CreateFileMappingW  MapViewOfFile XQueryPerformanceCounter GetTickCount  FlushFileBuffers  UnhandledExceptionFilter  }SetUnhandledExceptionFilter GetCurrentProcess TerminateProcess  IsProcessorFeaturePresent oInitializeSListHead IsDebuggerPresent GetStartupInfoW |GetModuleHandleW  RtlUnwind nRaiseException  xInterlockedFlushSList >SetLastError  1EncodePointer kInitializeCriticalSectionAndSpinCount TlsAlloc  TlsGetValue TlsSetValue TlsFree LoadLibraryExW   CreateThread  cExitThread  FreeLibraryAndExitThread  {GetModuleHandleExW  bExitProcess xGetModuleFileNameW   CompareStringW  LCMapStringW  GetTimeZoneInformation  yFindClose FindFirstFileExW  FindNextFileW IsValidCodePage GetACP  GetOEMCP  GetCPInfo GetCommandLineA GetCommandLineW ;GetEnvironmentStringsW  FreeEnvironmentStringsW  SetEnvironmentVariableW GetStdHandle  RGetFileType GetStringTypeW  DecodePointer YSetStdHandle  GetConsoleOutputCP   GetConsoleMode  /SetFilePointerEx  !WriteConsoleW VirtualProtect  VirtualQuery  LoadLibraryExA              N@D                                                     X                                                                                                                     X(                        PC               PST                                                             PDT                                                             P S T                                                                                                                           P D T                                                                                                                            `                                                                                                                                                                                                                                                                                                                                                         abcdefghijklmnopqrstuvwxyz      ABCDEFGHIJKLMNOPQRSTUVWXYZ                                                                                                                                                                                                                                                                                                                                                                                                                                                           abcdefghijklmnopqrstuvwxyz      ABCDEFGHIJKLMNOPQRSTUVWXYZ                                                                                                                                           `y!                       @~      ڣ                              @        ڣ                              A        Ϣ [                       @~    Q  Q^  _j2                   1~                                                                                                                                                                       ZHHHHHHHHHHHHHHHH.   .                                                                                                                                                                                                                               u                     @                `p{@    0qpr|rrt{                                                    `p{@    ppr|rrt{                                                         (                                                                                                                                                                                                                             @                           01d1                          H                    u       H                    u       H                    u       H                    u                              u                              u                 л            u                             u        c                   v        c                    v        c                   ,v                           4v                           4v                           <v                           <v                           Dv                           Dv       !         @            Lv        !                         Lv       !        0    Lv       !        @            Pv        !                        Pv       !       0    Pv                            Tv                            \v       A                     dv                            lv                             tv                             |v                            v                `            v                            v                p            v                p            v                            v                p            v                            v                            v                  `            v                             v       !                     v                              v                              v                0            v                            w                  p            w                              2                              $w                            4w                `            <w                0            Hw                0            Hw                0            Pw                0            Pw                 @\w                 pp@`w                 @hw                ``lw                ``lw                 @@0tw                 @@0tw        P    `            w        $    `            u        $    `            u                                S                                 S            0            w            0            w            0            w            0            w                            w                           w                           w                           w                            w        `                w                        w                        w                        w                        w        p                w                        w                        w                        w        @                w                          x                         x        `                x                        x                        x        *                $x                        ,x                        4x                        <x                        Dx                 `            Lx                            Px                            S                           Xx       @         4H,P]dfl mmmmmo pppo01@2   (     0            x7       (                 7       (                 7       (                 8       (     `            8       (     0            8                  `            $8                              48                              H8                                                                                                                                                                                                                         	                           
                                                                                                                                                      7777$7,7               PP p                                                           p                  p$!                 P                 0                 0                   0                                                                                      X                     X                     X       @         DH P]dfl mmmmmo pppo01@2   @         PH P]dfl mmmmmo pppo01@2@%x    @        @        @y    @x    @x    @        @uy    Ayx    Ax    $Ax    0A        HA        `Ay    tAoy    Ax    AWy    AEy    Ax    AIx    Ax    Ax    Bx    B?y    (Bax    <B=x    PBx    `B-y    pB	y    Biy    Bcy    Bx    Bsx    By    B        B        By    C1x    C!y    C7x    (Cx    4Cx    @Cx    PCy    \Cx    lCy    |C3y    CUx    C9y    C{y    Cx    Cy    C+x    Cgx    C[x    Dx    DQy    (D'y    4Dmx    DDx    TD]y    hDCx    tD        Dx    Dx    D        D        D        D        E        E        ,E        @EOx    TEx    hEKy    xE        E        E        E        Ex       Њ @Ќ АpP    `p        	            r            8f                p            Pf                             df                            xf                            f    h   l   p                          pe                            PO                             P            ,                P            ,                Q            @               Q            P               Q            T                g            X                b            d                a            p                0N            |                pe                            pf                           g                            pi                            pi                            @j                            jlllȲ                mPp@plܲ       @
   X   `              @         ,H,P]dfl mmmmmo pppo01@2      @@@p0P                                                                                 dH    w    zzzz {{ {0{    @{P{                        .?AVbad_alloc@std@@     .?AVexception@std@@     .?AVbad_array_new_length@std@@      .?AVlogic_error@std@@       .?AVlength_error@std@@      .?AVbad_exception@std@@     .?AVtype_info@@ TV1T;TETOTYTcTmTwTTTTTTTTTTTTTTUUU!U+U5U?UIUSU]UgUqU{UUUUUUUUUUUUUUVVV%V/V9VCVMVWVaVkVuVVVVVVVVVVVVV                                                                                                          0                 	  H   `P }                  <?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>
                                         00020D0Q0000001111111e2222e333&454_445%5O55668667767777 88889999U::&;5;\;;9<I<x<<=\>&?5?^??       &050]00&151X1122<2223&3334+4D4e44444445l5555555555555555 6666(6N6|6666777$7.737F7U777v88#99999::::U:v:::q;;<<=======f?u??   0     U00000001111+2222222F3S3t3445)555"6=6b666667p777788]8888"9G9]999	:::::::];;;;;;6=H====+>>?#?F?h?   @  `   ~08111j33333&4F4O4U4'5506D6P6778999:<<U<a<<<==l=x===;>>>>>??=? P  x   r0001T22222q3}34X44445d555555606=6D6K6f7u7o8F9{9999:':::4;;;;;;6<E<<3=c=h=6?E?w?? `  l   '000055?556%6Z66&757V778868888-9999::::;;;f<u<<=F=W=o===7>v>>>$?f?u?? p  L   0V0e001V1h119223O3444>55556(6}667788P999H:::     \   122s222223!3.3@3N3333Y4a444A555555)6:66677f8u8Q>f>u>>>>??      00v0001v1122@2K2V2222*333B3M33)4:455<5556&66L7f8s8889G9b99999:.:S:r:::::;I;b;s;;;`<<&======(>->F>X>>>>@??     `   080[0}01:22234445]5555|6667#77}88/9:::;,;p;;;<c<x<:>>????     d   00p0|0012292v223{34L4456r66377@88T9Y9996:B::;u;;;;;;<<N==R>>>?   |   R00*1s1.2223333m4y445666677+8:8q8{88 9*9w9999=:G:}:::::;V;;;"<U<<7===>>>>>E???        0f0v0000011,1=1S1|11111@2m2t2222T33 4|444455"5'515H5]5s55555667"7V7h777B888i9n9999:::!:8:H:Y:o:::::<<<=*=b=====u>> ???     |   0000[11A2223d33333344444444445556663778$9q9:=;|;;;;<"<<<6=E=>>>>????        [00A1112d22222222"3_3y33*424=4G4M4V4]4b4p44444566797y7+89:c:y:::::;;0;>;;;;I<Q<p<<1=>>??!?q?      Q0v00 11@1_111112(2K2\2222343J3`3334*4y4444H5~55566l66617G77778`8v888*9@9999
:b:o:::#;9;;;;<R<h<<<=2=====K>a>>>?J?z????      D0Z0001$1x11182N22233g3}33314G44445T5g555526677$7)7L7S7X7^7d7j7p7v7|7777777777777777777777 8888888 8$8(8,8084888<8@8D8H8L8P8T8X8\8`8d8h8l8p8t8x8|889%9G99:%:O::;;:;;<<:<<=====>>:>>??8??      000000&161J1~1223X3\3`3d3h33345555&636T667"777858V8f899":C:N:;;<<<l=k>{>>>>F???????   0 t   E0161E1322$3)3J33 446p7t7x7|777777b8888999g9y999:?;t;y;;;;;b<<<<===:==`>>>? @ p   0_11111122223#3/3;3Z33444U55C664797V7e777"8@8888888I9:::;w<=G>|>>>>?? P    0G000&1811112Q2u2z2222I3m3333444435B5^5+6:6667S::::.;3;F;W;;;;;<v<<<M======&>5>????   ` x   0(0P00112O333333333333 444(447 7$7(7,767E777=88889999V:h::::K;;(<C<f<<=X>>? p T   00011&2822333&4456K667767E788:%;*;F;X;;0<<=F=>>'?k??  H   90>0V0e0114F4K4f4u455%8V8[8v889:B<s<x<<<<l===>y>B??  T   60t0091>1V1e112t222S3i3v333344 4.4q4x4495A5`5o5!6f6u6`7b:;;<       \012(292A22q3333v444,5~55555555555y668889$9=9V9:@;D;H;L;P;T;X;\;`;d;h;l;p;;;F<t<<<<<<%=:=h===>>??       I0i0011S1j1|1122:2c2k222H33444[555555	66-656Z6666677#7D788899999P: ;%;+;J;T;;;<'<]<q<<=)=Y==D>W>>>>>>?%?<?F??  t   `0k000000000d1222p3j467:::::;;;<G<<========== >>>?$?/?9???H?O?T?b?z??      0000#0*0/0=0I0p0000011.1;1M11111111/2Y2223"3.33393?3E3K3Q3Z3c3k3p3v3{33333333333333334>4^4~4444444 555#575A5F5X5a5556
666'6-636:6?6Q6X6v666666777 7%7I7_7i777777777768A8F8S8Y8m8s8y8888888888	999+919<999999999999
:::$:-:5:K:V:]:m:s:}::::::::::[;{;;;;;;;;;;<<<<<<<<<<<5=<=G=Q=W=`=g=l=z=========>>%>1>a>o>u>>>>>>>>>>????2?  @   q222035y555555566(677999:
:%:O=]=p={>       00!4w88.:3:R???      S0000000000000111 1$1(1,1014181<1@1D1H1L1P1T1g35506d6l6w66666666778m:::";m;;;;;;;5<J<P<X<d<k<q<w<<<<<<<<<<<<<<==x=>?  H   2:55c66667$77777789w9F:g:%;;<<==:=U=c=h=>?        0011122	33`333o::;;;;;<<<<$<=<C<S<]<c<i<p<u<<<<<<=="=,=2=;=B=G=U=^=k==y>>>>r?z????????? 0   L0001111"1,121<1V11111)2Q222222,363=3H3R3X3a3h3m3{33344$4/494?4H4O4T4b4x44444455)53595B5I5N5\5n5555'6v66666777777878J8888.959}99999:::;O;];r;;;;!<+<@<U<c<x<<<<=?=K=d==%>5>H>R>>>>>>?L????   @ @  00N0X0000191f1r111111282i22233344h4v4555 5$5(5,5054585<5@555556*6<6E6_6e666666666667
777&70767?7F7K7Y7e7788s8}8888889999999::: :':,:>:M:T:x::::::G;M;;;;;;; <	<<<#<,<4<?<Y<m<}<<<<<<<<<<<===`=h=s=}============>Z>>>?? P p  00/0Q0\0a0r0011t1122K2e2z22222	3;3E3W33,494K4l4y444W5555556+646<6G6Q6W6`6g6l6z6666677'797J7X77777777777777
888#8*8/8=8F8U8[88888888888888999$9+919?9H9Q9999999999:\:a:m::::;;&;F;T;^;d;m;t;y;;;;;;<<*<4<:<C<J<O<]<f<k<t<<<<<<<<<<<<<<<<==]=J>T>Z>>>>Q?i??????   `   0,0E0M0X0f0l0u0|0000000000000031;1F1T1Z1c1j1o1}111111111112>2K2U2Z22222222222233(3.373A3F3T3]3m3333!4)444>4D4M4T4Y4g4p4444455&535f55555555555556z66666667 7+797?7H7O7T7b7o7777778
888$8-88888*949;9F9P9V9_9f9k9y999999 ::::$:+:0:>:G:L:U:c:m:s:|::::::::::::::;;;(;2;=;G;M;V;];b;p;y;;;;;;;;;;;<<<(<2<8<A<H<M<[<q<<<<<=='=2=<=B=H=O=T=b=q======P>>>?? p   )0]0s00000011 1.1@1H1S1]1c1i1p1u11111111112
222$2-2=2M2V2^2i2s2y222222243a33344555b555#6]6u667F7b7w77788"8k8888888888889&949:9N9T99999999999999:(:d:j::::;;;<*=g=p={========== >
>>4>       a0001111422222
333.4o4v444444444445%5*5\56
88T8`8j8o88 9999#9)90959C9L9]9<<<<<<<<==>>>>>>>>>?    .0;0C0N0X0^0g0n0s000000000W1h1)2j33$445-5666666666666666 77,727B7H7P7X7b7g7o7w77777777777777788!8'808<8E8M8X8b8h8n8u8z888888,9@999<:q:::::::;
;;0;;;;<<<< <.<7<5=?=H=V=f=n=t===========>9>M>??????  `   0302233333$323;3C3P3^3h3n3t3{33333333333333W59999;;=!==>    4   72222
333 3'3,3:3C3x6799<?????  L   0000(0F0N0Y0c0i0r0y0~00056)77========>>q>z>>?    x   0000000000012#2(2=2222222222223334"424G7&89$9)9<<<e==>y>>>>>>>>>?g?x?  D   0050:0Z0l112	44447777
8{889999:;u<<<>M>  $   534F5p8888:Y;;#<-<2<<   X   26666j8t8y8::::;;;;%;1;<<<<<<<<<<<>>$>.>4>=>D>I>W>k>?     22222222223"3-3;3A3J3Q3V3d3v3F6P6U659=9H9V9\9e9l9q9999::;6;I;Q;\;f;l;u;|;;;;;;;;;;;;;;<???j????   L   00000.0V2^2i2v2|222222277799;;;;;;;;;;4<   0 |   03:3?304T444u556666&6-626@6P6}7777777777a8k8p880979B9L9R9[9b9g9u9~9999%:s:}:::::H;;;;;   @    00011112222222233333345>5C5_5i5n5555b6l6q66677777768@8E8|888899I9S9X9999999::::;;@;J;O;;</<C<w<<<@=J=O=k=u=z====O>Y>^>? P $  )03080000111W2233
444#4*4/4=4e44444445555(5-565D5N5T5]5d5i5w5555555566666666666777 7*70797@7E7S7\7a7j7x7777777778999999999:T;;;;;;;;;;<<<&<1<;<A<J<Q<V<d<}<A=P=`=p=|===>>>)>/>8>?>D>R>[>~>>>>>>>>>>_? ` 4   3555d6:::;;<<)<.<l<v<{<>F>>>> p t    0*0409001~2223:333344455
666#6*6/6=6I6777;q<{<<H>P>[>e>k>t>{>>>>>>>>>>>>>>  d   $0C0111111244444455566678$8)8888*<4<9<<<=K>U>Z>????????    \   000001 1+151;1D1K1P1^1~11112\3f3k3x55599:;:G:S:]:b:::;===g>q>v>    L   000000111222 5"5W6a6f6L8V8[8{888;;;<<A=K=P=>>>  0   T1111M4e5o5t5;;;;;;===>>!>  <   )03080`1j1o133357:::o::::::;;===    X   000111111222444555666~8889992<<<A<]<g<l<<<<?&?+?    4   1112:234=4B4555Z6d6i69"9'9;>#?b?    l   @0k0001111222223o333'4V4,5S77*888
9d999:M;};;<<<===$>a>i>t>~>>>>>>>   d   2h222D3333(494A4L4V4\4e4l4q4444457:789::;;===>>>>>>>>>>???  <   :12R4Y4d4n4t4}44444R5t99:<< >$>(>,>0>Q?[??   (   K0233555X7888i:;;>   0 d   v88 9999999{9#:4;8;<;@;D;H;L;P;T;X;<7=H=q=v======>9>D>e>>>>??!?8?t???   @ D   <0@0D0H0L0P0T0X0\0`0d0h0l0p04456-8;;;;;;;;;<? P 0   ~00081d1134577(::Y=c=h=>%>I>   ` D   000000000000025566^7l7U89999::<?   p    %0w000000111 1$1(1,1w1X3\3`3d3h3l3p3t3x3|344>4C46666777j9s9x99999999999::::::::::	;;:<F<P<U<u<===5>    4   13v4d6657?88C9c99999$;<=*=4=9=c=?  l   H045E5{555O6v667M7778Z888;999*::::<;f;;<,<6<J<<<< ==l>>>>>>>??&?+??    P   0-112'3d333345;6L677l88888819T99	:Y;;<=+=a===>>>  (   Q000K1111!24?6[6888:        *5w5:$;[;;2=X=h=??       &8q889[?       1<9;       Z;        5567:       1577888:?       01111122222364R4n4x4}444555B66777777 8$9(9,9094989<9@9D9H9L9P9T9X9\9`9d9h9l9p9t9x9|999999999999999999999999999999999 :::::::: :$:(:,:0:4:8:<:@:D:H:L:P:T:X:\:`:d:h:l:p:t:x:|::::::::::::::::::::::::::::::::: ;;;;;;;; ;$;(;,;0;4;8;<;@;D;H;L;P;T;X;\;`;d;h;l;p;t;x;|;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; <<<<<<<< <$<(<,<<<<<=>=J=T=Y={==>]>>-?   0    f00J1Q11@3334$4/4445R5\5a5566627<7A7f77788&80868?8F8K8Y8b8j8w8888888889$9/999?9H9O9T9b9k94;<> @ |   01
3s34)4>4F4Q4[4a4g4n4s444445I5546<6G6Q6W6`6g6l6z66)717<7F7L7U7\7a7o7{789Z:d:i:r<z<<<<<<<<<<= P T   0000000000o3{34-6	999&9,959<9A9O9X99:L>e?m?x????????   ` @   0y2223d4p4{444444448899999$929;9@9=   p X   00,2b33334f4l444446*677B7y77899::<<(<N<U<m<<<< ==.>5>    p   =0s0012222233235]6667777777799:":W:::::::;;I<R<Y<<<<|>>>??????  `   $0-080A0J0O01111111 22233345657::4;N;t;;;;;;;;;<==-????        d0l01Q1Y12689<#?    4   70X223334444566K7{79;z====    (   39
:::;;;<<Z=k===f??  d   0"0.0O0V0]1d1222 2$2(222E344;4t4x4|444054585<5@55555555	66Y79:<<=>??  (    02s3555%898:;<<<>/??     00112?   H   111112f2k2t2%45)818
9799<<<'</<@<<<<<<<==u?       0|18;*<}<<U===   `   00u1444c88:::::::::::::::: ;;;;;;;; ;$;(;,;0;4;8;+===8>K> 0 @   00s3z35|77777777788:d<h<l<p<t<x<|<<<=   @ L   A0H0112222222244444444599<<<<<==&==?   P h   0d11111222333S4o44442575}555668889:;;;;<<<$=3=J=P=`=k=}=>'>D>h>p>>> ` T   P02f4n4}45=5P5V5m5w55555m6w6|6-7889v999v:~::::::::::P>X>? p    255===}?        11666788-;Q>>    \   01'121<1B1K1R1W1e11111222233333g4y44444444	55$5:
;s;;;f<?  (   =0152|22337;<<@>>>n??  T   0022355C8J8c8j888Q:q::;;);E;L;<*<f<<=>>>">(>1>8>=>O>`>>@?  H   000000000111]22,383378f88P99Z:/<<<==C===  l   1P25K9999999:C:J:p:w::::::::;;4;K;R;;<	< <*<:<V<h<o<{<<<[=o=u====> >2>N>    <   1178688:9f99999*:;;<====$>>>>>    `   G2345"56e666*787718D8J8a8k88888889S9^999999:;';.;==|>>>>l?t??   \   400002
225223>3W3g3w3c5555555 63696P6Z666788!8*828;8}8B99r;y;<?  4   )11111]234h44479&9.979;=>>??   X   001111X2j2=3336747b7789;;;;;
<<%<<<F<T<g<m<<<>>>>??   0     D0t0^2e237t:M<>B?I?S? @ L   0,070B001111112,222&3344B5G59:;=	==&>1>;>@>??   P T    0400>12I334444\9d9o9y99999999::3?;?F?P?V?_?f?k?y?????   ` $   X34446L72898889|;;== p (   j01344N8z88)90999:	<=       01k8?     m44%9w???  L   00011111223339U9r99?==	>K>l>>>>)?1?<?F?L?U?\?a?o?x?  P   091W1)2;2N36666+8M889:;;(<?<E<`<j<<<<<<===/>@>>?n??  |   0O0m0000000j1333333333344<4$5-5C5999999::":,:6:<:B:G:U:f:::;;>>>>>>>>>>??  \   10h0p0{00000000	1%1y223G67k7Z9@=E>M>X>b>h>n>u>z>>>>>>?	????.?5?w?  \   0'000a0001>11112J2f24'444E5O555566757Q788899:n;u;;;;z??       8:<<=>      22;m=u=>N??  0   011(222f3344s5u667777X:7?         {12 34599 ::<<   0     R051W122333F6Q6;? @    45	6}8]99;   P    2K55? ` 4   22r345\8`8d8h8l8p8t8x8|888888888 p    257<??     0i1}11111111=3z333/4E4k44556666797A7L7V7\7e7l7q7777H8_8e88888889)949B9H9Q9X9]9k9s9999999999::::::::;;;$;:;P;O<<<<==#=+=y=~========>!>@>N>^>h>r>z>>>>>>>>>>>>?E?P?X?q?w?????    h   40[1112,272R2\2o23?5J66777777778878T8\8g8q8w888888*9{95;=>>>>>>??       000003G3N3b333333@47889B:::::;;;;;;;<<<<<<<<=	== =.=;=C=M=\=n=~=======>">,>4>?>I>O>X>_>d>r>{>>>>>  x   \0_2o2223*464@4E4g44k5y555555555666_68D89999.:@:::;x;;;;<<<<<<<<<<<<<=       -4A559:>?    D   0001255u688G9:D:;C<j<r<{<<<_=j==	>2>9>>??      ^00000000112[22^4M7X7]7f7l7~7777778a8l8q8z889999999999999999999999999999 :::::::: :$:(:,:0:4:8:<:@:D:H:L:P:T:X:m:::::;7;c;y;;;;;;;<	=K=S=^=h=n=t={=====L>>?$?/?9?A?K?f?r????????????       000#00&1m11R2[2f2p2v2222222[333q4{4444444 55555o666666K77777878T8_8919>9E9L9f:::;;;;;;<>>>>>????(??  	 h   011X4R5W5f5p5u55556z777777788i:q:|:::::::::<<<==8=B=V=====H>>> 	 $   3384k4x44?56269;_<?    	    O337   0	 ,   433 44444444 4$4(4,404449_< @	 ,   (2,2024282<23^34445d5Z7768R88 P	 $   R369f:;;<<<@>G>N>U>[> `	 ,   2373]4405666667P7o9:;=W? p	 ,   444466'9:9::;	;;;<<?P? 	    36(778:9 	 0   11v2455#6.66@8H888:
;;<<<   	 <   )000w03122 3'3l334h4m468s889R:_:;;;<<<? 	 8   0111W22|33444455=5I5Q567X==>?   	     05153@4<5G55
77;(<< 	 (   &1]7~8888j99M:X:c:;;>>> 	    6????   	    333383A33;45r5z5555555555(7w777777777777778888"808N8p8x888888888n9999999999::: :3:C:M:S:Y:`:e:w:~:;;;%<=====>??  
 P   0020@0d0p0y00?1E13M3U3`3j3p3y3333365D5L5T56E789;;<<<=   
 8   I3Q3\3f3l3u3|3333555?6888S<<<>&>?    
    U1]14678>??   0
 4   0000v112777D8y99.:F::::;;)== @
    000Z: P
    <>????   `
    90~008'<>>   p
 P   2:2O2s234k4y44548>8J888888899m9:::::;<<<=F===   
 P   00"1t12O236078u9{999;<:<W<_<j<t<z<<<<<<,=	>>^>s>y>>>   
 D   #1M1o11333333;[<s<<<<<$=;=C=_===>>?E?j??? 
 d   0]0i0000000101m12'2L2222222233I3R3s3|3333-555566E6X6h6u66	::o:: 
    c4\;d;;;<<< 
    67 
    |225#788}:;;   
     4=459a::; <<=>   
    46689<=        03|4444>>T?        0009:;=>>?.?3?      H01Z67R:(= 0    12N38 89o<"?*?? @     0Z134f555:;<>> P @   2244477u7*828=8G8M8S8Z8_8m88:::(:.:4:;:@:N:W: `    223:9:::   p l   O2w2Z4555k78/8=8E8M8V8l8t8888888880:<:G:Q:W:`:g:l:~:;Z;;;;<<===='=.=3=A=Y=>    ,   2222223333G3K6p666;>>  4   Y2`2464777"8&;;D<<< =
=== =%=3=J=    (   )010<0F0L0U0\0a0o0006^8C:N:       5:[;<(=9>l>       12556(<???    @   00 1;1b111112+22445577g88w999s;~;<<e=  4   f0n0v002	2h2p23444445=#=*=1=>?.?       0@002'6U668:*<       3B4l455556m75:=&=     W33^4445      2222}9< 0 X   L012w33P4n45666666667889O9V9::::::::::::;;M=z=== @    M9<<   P   117'7<79::::<<<<<<< ======== =$=(=,=0=4=8=<=@=D=H=L=P=T=X=\=`=d=h=l=p=t=x=|================================= >>>>>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ???????? ?$?(?,?0?4?8?<?@?D?H?L?P?T?X?\?`?d?h?l?p?t?x?|?????????????????????????????????   `    00000000 0$0(0,0004080<0@0D0H0L0P0T0X0\0`0d0h0l0p0t0x0|000000000000000000000000000000000 11111111 1$1(1,1014181<1@1D1H1L1P1T1X1\1`1d1h1l1p1t1x1|111111111111111111111111111111111 22222222 2$2(2,2024282t22222233"333*414I4c4o4y4444455'55556(6888889989Y9q99999:8:b:::::0;H;;;;;;;;; <<<<<<<< <$<(<,<0<4<8<<<@<D<H<L<P<T<X<\<`<}<>>?8???F?L?f???????????   p   00111122&2,2C2M2222222223&3,3C3M3t3333333344F4h4l4p4t4x4|4444446!6X6~666666666666777#7)787B7I7Q7W7e7q7w7777777777788"8-858>8J8S8h888888888888899(9/969<9C9O9[9g9u9999999999:	:::+:4:M:T:Y:h:s:y::::::::::::;; ;%;L;S;b;s;;;;;;;;;;<<"<2<B<J<R<x<<<<<<<<<<<<== =0============ >>>>>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>?!?,?6?<?E?L?Q?_?h????       112<23h3333555556666667
8#8R888;;;;; <<<<<)<2<:<@<N<X<^<g<n<s<<<<B=>>>#>)>A>H>>>?H?h?x????     01q2{22222222S3[3f3p3v33333334525^5f5q5{555555556;6H66667A777778@8k88889I9d999(:5:H:m:::	;H;c;;#<`<{<==>>>>>>>>>??!?{????????     0)0J0`0e0t00000111111111K2P2\2f2k2222223)3.334V5X666889,991::$;S;m;;;;;;;<<<<%<9<T<~<<<<<<<=D=M=[=d=r={======/>H>P>[>e>k>t>{>>>>6????       
000(0-0f0w00000011)1A1[1c1n1x1~11111111112>2H2^2n22222222[3c3n3x3~33333364P5556266667?7c7o77777	99I9999^:::/;T;x;<===5=:=i======(>4>S>d>u>>>?u????       0020M0d00 11111111 1$1(1,1014181<1@1D1H1L1P1T1X1\1`1d1h1l1p1t1x1|133333333347=8888888/959L9V9j9~99<<<<<<<<<<<==="=+=2=7=E=N=S=f=t=~===============>>>$>2><>B>K>R>W>e>n>>>>>>>>>>>>???!?'?.?3?A?J????????  ,   00070=0b000 1&1:1B1M1W1]1f1m1r1111111R222R3333333333354E4N4Y4c4i4r4y4~4444444444445556-626N6V6a6k6q6z6666666677/77E8V8^8i8s8y8888889999::;;<`<s<y<<<<!=@=X=n=======O>U>l>v>>>>>>???+?U?c?m?s?|????????????  |   0000C0Q0[0a0j0q0w00000001151O1U1l1z11111112222(2.2T2b2l2r2{2222222233#3)32393?3M3Y3333333334>4L4V4\4e4l4r4444444444444455)5/585?5D5R5^56,6U66778:::::::::;!;-;;;A;F;T;];;;<<R<h<<<<<<<<====(====>N>V>a>k>q>z>>>>>>>>>>>>>>>??%?+?8?F?P?V?_?f?l?z??????????????  l  
000#0*000>0G0M0^0l0v0|0000000000000011111C1M1U1_1z111111111111222#2/2=2C2T2b2l2r2{222223 3$3(3,3034383334444q5v5555z666667$727<7B7K7R7W7e7n7s7|7777777777777	8888$828;8Z8b8m8w8}88888829:9E9O9U9[9b9g9u999
:::):/:8:?:D:R:[:H=P=[=e=k=t={====>>>>>>>>>>q?y?????????      =?E?P?^?d?m?t?y???     ?3G3R3\3b3k3r3w333555555556666+656;6D6K6P6^6g6666666666677 8
888 8%838<8D8T8b8l8r8{888888889999!9/9B9q;;==:>>>?x???        G0Z0001>1v122223356666667#71777<7J7777777777777b99<;<%<z<<<<<<<===$=-=4=9=G=W=   0    b000t11[2}2222+343?3I3O3U3\3a3o334V44444444444555<5l55+788 8$8(8F889M9`9x999::@::::;4;N;X;`;h;p;x;;;J<m<<<<====">w>>>>>>>>>>>>>%?\?f??????? @ 0  0060P0j00000001+13191>1x1111111 2
222 2%232F23333333333&4-484B4H4Q4X4]4o4~444445555'505m6u666666666'7/7:7D7J7S7Z7_7m7v7{7777777777778888"80898J8R8]8g8w8.969A9K9Q9Z9a9f9t9}99999999999
:::%:.:5:::L:`:o:w::::::::::;;? P    33333444(4747778K88:::: ;	;;;#;=;;;;;;<<<"<+<Z<a<l<v<|<<<<<<0=8=C=M=S=\=c=h=v==t?|????????? ` X   00&00060<0C0H0V0_02H6L6P6T67777777777M8::::::::;;;;';0; p    v4444445!6(636=6C6L6S6X6f6o6w6}666666666777D888#9+969@9F9O9V9[9i9r9z99999999999999::::':0:5:>:L:V:\:e:l:q:::N>V>a>k>q>z>>>>>>>>>>>>>>>???)?/?8???D?R?[??     50w112222)616<6F6L6U6\6a6o6x66666666677$8,878A8G8P8W8\8j8s8888888888889999'9.939A9J9999999999::;<<<<       66666666677777777777	899/:7:B:L:R:[:b:g:u:~::::::::::;';/;:;D;J;S;Z;_;m;v;~;;;;;;;;;;<<<%<+<1<8<=<K<T<r<<<<<<<<<<<<<<<====$=)=>>>>>>>>??? ???     X0]0001111&1+191B1J1P1^1h1n1w1~1111a2m2x2222222244444444444444445	55&5O5e555546d6|6666_7777
8"8|8888(9R9g9D:::::;R;Y;;;;;3<8<c<h<<<==D=I=N=====">'>i>n>>>>?	?G?L?????       00b0g000002171u1z11122I2N222223%3*3/3t33333(4-4o4444555!6b66777777777777777777777 88888c88-::4;l;r;;;;;<<<<</<@<m<t<<<< ===~=>>>>>???!?(?-?;?H?M?Z?h?r?x???????????    0000'020H0P0[0e0k0t0{0000I1Q1\1f1l1r1y1~111]3p44455555555555%6-686B6H6N6U6Z6h6v66y777777777788%8/858;8B8G8U8c8S:::::';_;i;q;y;;;;;;;;;;;;;;;;;<	<<<'<2<=<H<S<^<i<t<<<<<<<<<_=g=r=|=======>>>>>>?    |   1122S223-3M3W3\3~34U6q66667K8S8^8h8n8w8~8888?:E::::::;;;!;8;'=9=G=Q=W=]=d=i=w===
>>K?]?p?       (3U33S4425<5A5f566666666667=77778888&8-828@8I8g889	999$9-94999G9P99999999999? ?+?5?;?D?K?P?^?g?o????????????    t   	00 0.080>0G0N0S0a0q0{333v4~444444444A8x888999M9z;;;/<G<<==S>Z>e>m>x>>>>>>>>?K?   X   444444445
555-575=5C5J5O5]5f5k5t5555555555;;;;<%<\>>$?  T   *0/0@2y22\9d9o9y999999999999999:
:	=6====j>>>>>>>     t   1;1192`2|2222455888888888s:{:::::::::::: ;
;;; ;%;3;N;<0<L<V<[<~<>>>n??   0    D0^1g1r1|11111111?2F2Q2Y2d2n2t2}22222V3_3j3t3z3333333'44445555555555666666666u77777777777888^:z::;T<c<m<r<<*=\=~==C>J>U>_>e>n>u>z>>>??l?   @ |   1122334J444v55555*696C6H666666666666777<7r88::D;;;;2<E<z<<=A===>{>>>>>?? P    j99999999999::::(:/:4:B:K:P:;g;w;;;;;;;;;;;;;<<)<1<;<V<b<p<v<{<<<<=1=?=I=O=X=_=d=r={===========U>j>>>>>   `    0011p222222575}556D667Q7778A8\88::::::::;;;*;8;F;L;U;_;d;r;{;>>>>>>???2?C?K?V?c?i?r?|?????   p \   W001111=2R2n2x2}2244555N6677)7.7Q7999_:z:;J;_;;;;;S<>>>_??    \   0E0^1s11111344a556d7789999D99m:::::: =4===>>>>'>.>3>A>T>     11111111222&242>2D2M2T2Y2g2z2>3T3p3z333'5C5m6666P7c778R88;;;;;;;;<<< <+<5<;<D<K<P<^<g<=9=N=V=a=k=q=z=====&>;>W>a>f>>     001&2U2j2222245555556666 6.676D6L6W6a6g6p6w6|666O7]7r777779:::>;S;o;y;~;;=>.>d>w>>??    `   0_1t11111
4&4S444+555d6888_9==========>>">,>2>;>B>G>U>h>-?y??    T   H0000001N3q34779:>::
;;#;(;J;;<b<i<t<~<<<<<<<<=>>>  l   4000812222233323444445&5,5C5M5z5555566%6<6F6y66666q::;;;<.=A=Y=>n>    P   11&10161?1F1K1Y1e11122"2,22282?2D2W2^24455_:g:r:|:::::::  P   66,7074787<777(8;8h88899;;;;;;;;;<<<=>>?M?d???      h0071a12H22 33 444444444555555555 6A6c6677'71777@7G7L7^7	88889\:P<j<<<<<<<<<<<=->u>>>??       2444(4.474>4C4Q4`444445555&5+595W5555555555
666!606:6@6F6M6R6`6n66799:[::t;<G=|====>??     |   	07044444444557889:,;0;4;8;<;_;;;; <
<<<<"<0<9<]<e<p<z<<<<<<<<<<<====)=0===>   0 P   X1\1`1d1h1l1p11112W37X8\8`8d8h8l8p8~99:q::::;;;<4=O===>"> @ x   000333333333444445555%5*585A5Q7x708[8;Y<<<<<<<<<<<:=h=p={=========>>>]? P    1233333444 4)405<5G5Q5W5`5g5l5~56#6.686>6G6N6S6e667777777788888888888*:6:A:K:Q:Z:a:f:x:;";-;7;=;F;M;R;`;i;;;;;;;;;<<   `     22e3*5677":<i<?   p    0l0111111111111122222,252222222222234444$568888888888H999~:::0;`;d;h;l;p;t;x;|;;;<==V?^?i?s?y???????      0000000000091?1J11222233#373=3F3P3U3c3o33344445666666777.7U88899999:::!:4:i;;;<<<"<+<2<7<E<N<V<\<j<t<z<<<<<<<+=F=o=w=========i>>>>>>>>>>>>??%?+?1?8?=?K?T???????????    `   0$0/090?0E0L0Q0_0h0000Y1X23333333333 44449::;T=X=\=`=d=h=l=p=t=x=|==  `   0:11H2m24
555%5.555:5L555%68J88999K:p:t:x:|::::::a;<< <$<(<,<0<4<<>  H   70?0J0T0Z0c0j0o0}0005:::;
;;;;-;M;;===>>>>>+>  0   001224t5:89<<
==='=.=3=A=c=
?     W1_1j1w1}1111112222222222333333333W4_4j4t4z4444444#5*555?5E5N5U5Z5h5q5506@6v666666Z788B8888n::J;<C<=>>>>%>,>1>?>H>?9?z???      000"0(0.050:0H0W0000:111122%2m2u2222222222#3V33333333344T4j44444444444,555555P6X6c6m6s6|66666!7N777)81898A88X9u999:^::;;;$;*;3;:;?;Q;a;f;;;;;;;;;;; <=<m<<<=='=2=<=B=K=R=W=e=n======>>>> >.>L>>>     ?00001y112G3O3Z3d3j3s3z33333339444"515L5y55+6\6f666677-77777 8888$8)8;8u8899T:\:g:u:{:::::::(;;;<=<m<<<<3=H===[>>>>>?????+?<?V?e????????        0+070<0i0002233%3+31383>3L3U3[3u33333333333	4444&4+494B4444444444445
5@5G5R5\5b5k5r5w5555555555566y<<<<<<<<<<o==>S>       {000^1111111.4[4444*54595T5X5\5h6/777777&8.898C8I8O8V8[8i8r88888888888G9;; ;$;(;,;0;4;8;<;@;;;;;;<
<<<%<.<5<:<H<U<|<<<<<<<<<=        1]11111024282<2@2D2H2L2P2T2X2\2`2d2h2l2p2t2x2|22222222233F444Y555^77777	8888$828;8;<V<<=   0    1n11,282C2M2S2\2c2h2v2222222333!3*3/3@3N3X3^3g3n3s333455>5^5f5q5{5555555567|777779:::":+:2:7:E:T:::::::::::g>   @    <1b1u11111111111122#2)2/262;2I2U2y22222223333j444455"5F5L5o5y555555566?6I6`6w6}66666677 707@7}77777:8s8829X99:8;@;K;U;[;d;k;p;~;;;;;;;;;;;<<==/=]>e>p>z>>>>>>> P   k00l11111111111232C2T2c22222222222
33\3333314~4444(505;5E5K5Q5X5^5l5u5~55555555555566666%636<6B6[6i6s6y666666666666666777%7/757;7B7H7V7_7e7u7777777777777777888!818?8I8O8U8\8b8p8y8888888888888889999%919:::::::::;[;};; <"<@<<<<J=l===>->>?$?/?9???H?O?T?b?k?s?????????? `    \00000000001/1\1333,4?4t444]5l5v5{555555U677L8k889<9@9D9H9L9P9T9X9\9`9d9h9:::::S;;;;;;;;;;;<<<<<<<<<=a?i?t?~??????? p    0"0-070=0F0M0R0`0q00000000000001111"1'151B123333$3+303>3G3O3U3c3m3s3y3333334444444455I7Q7\7f7l7u7|777779999999999:(:2:8:A:H:M:_:k:0<5<_<m<w<}<<<<<<<        g0o0z00000000z11     '11111111112222222222,3F3333333334444a4i4t4~44444447777777777888%8+848;8@8N8\889m9u999999999h>>>>???!?(?-?;?M?       0000000000001"1,121;1B1G1U1f1o13'3/3:3D3J3S3Z3_3m3z333334J4R4]4g4m4s4z4444888888889999/9K;R;<<<<<<=====$=2=;=@=     000111 1%1711o7w77777777788*99999
;;#;.;8;>;G;N;S;a;;'</<:<D<J<S<Z<_<m<}<<===%=+=4=;=@=N=W==>U>>>>>>>>>>>g??????????????      0000 0,0n11111111111112222!232H2555 66666)62676Q6_6i6o6x66666e7m7x7777777777888 8'8,8:8C8H8Z8h8r8x8888889K9S9^9h9n9w9~9999u>>       00111!1(1-1;1D122222333"3+333333333444(474A4G4M4T4Y4g4s4555g6q6v6677777777888A9I9T9^9d9m9t9y9996:>:I:S:Y:b:i:n:|::==     0
000%0.050:0H0Q001111&1-121@1I144<4G4Q4W4`4g4l4z44555555566.67777777778::::::;	;; ;;;;;;;;;;;->5>@>J>P>Y>`>e>s>>     1"2*252?2E2N2U2Z2h2q223K334444688@9H9S9]9c9l9s9x999::;;;; ;%;3;<;D;Q;_;i;o;u;|;;;;;;;;;;;;;;,<5<@<J<P<V<]<b<p<|<   4   445555!5&545=56c66a7:::::;;>     '11185O8W8b8l8r8{88888799999999999<8=@=K=U=[=d=k=p=~==>O>W>b>l>r>{>>>>>4?r???????????     x   6b777777778888,858 9999#9,93989F9O9W9d9r9|999999999999999::I:Q:\:f:l:u:|::::   0 0   f4n4y4444444495<A<L<V<\<e<l<q<< @ @  0,151O1X1`2p2~2222p3x333333333333333444464>4I4S4Y4b4i4n4|44444444445^5g555555U8]8h8r8x88888888888888899#9.989>9G9N9S9a9j99999999999t::::;;;%;+;4;;;@;N;W;;;;;;;;;;;<<<<<<<<<===D>}>M?U?`?j?p?y???????????????? P    	00!0'00070<0J0S0X0a0o0y0000000222233$3.343=3D3I3[344 4-4<4Y4444
555#5*5/5=5F5N6w6666677;;;;;;;;<<<,<:<D<J<S<Z<_<m<<<!=)=4=>=D=M=T=Y=g=p===?   `    0b0000L1_11 22H2233334
444$4-4444444444516U666	7717@8Q8Y8d8n8t8}88888:=:u::::;.<;<C<N<X<^<g<n<s<<<<<
===#=*=/===F===>>>>>????? p    0
000$00000000000 11i1x11111111496A6L6V6\6e6l6q66666667777'737g7778 9	9'90999999:&:.:9:F:L:U:_:d:r::z;W<=:>>>>>'?D?e??    000001	111%151=1H1R1X1a1h1m1{1111111222 2)2\2d2o2y22222222222222333#3:3H3R3X3a3h3m3{3333333333334)44444444444W5566-6]66M88999!9'90979<9J9e999::::&:-:2:@:I:a:v:::::=d===>>(>->M>??       00Z0b2222223343B3b344555555566"6,626;6B6G6U6k6677777777777778
888$8-848=8X8\8`8d8h8l88T9X9\9`9Z:::;;A;><n=>>$?E?  ,   0+070@0017888,898?8F8K8Y8b8=  x   344#4-434<4C4H4V4i45;5G5R5\5b5k5r5w555589+:d::%;Y;_;j;;;;;;;;;;; <<>K?s??????????    
000@0I0W0a0g0m0t0y000000000000011u111\2c2j2x222222223
3333*33383H3c3l3z333333333333333344#4:4L4X4d4p4|444444444445555'5/5h5s5x555555J666666666666667777777778g8o8z8888888889999 9m9u99999999999:5:I:Q:\:f:l:u:|::::;;<<<*<8<><G<N<S<a<n<<<<<<%=,=7=A=G=P=W=\=j=z=>>>??)?  l   Z11,222T3g33	44a55666677.7\99 :C:;%;0;:;@;F;M;R;`;i;6<><I<S<Y<b<i<n<|<<I=^=z====?  p   00011)1.1Q1}33E4y444o5577888>9999P:h:;;;;;;<<<<&<+<9<B<`<<=====>>*>    l   f0011222222!5O55+7%8-888F8L8U8\8a8o8889'9C9M9R9u9;;;w<<<<<<B=J=U=_=e=n=u=z===   x   123]3e3p3~3333333D4P4Z4_44667O7b77 8Z889999: ;;1;;;@;c;==U>x>%?N?~???????????       e0o0v0}0J122 2.242=2G2L2Z2c23
33#3)323<3A3O3X34Z5b5m5w5}5555555555555556
66"6,62686?6D6V6]669777C8n889::::::::;;Y;=#=.=8=>=D=K=P=b=i==;>C>N>X>^>d>k>p>~>>      0#0x2|2222222222222253?3?4I44444d5n556S6]66666777768@88888999999 9$9(9Z9a9::: ;;;;<<<<.=;=>X???????????   0    0W0e1^2 4)414?4U4444455Z5a55555$6+6d6k6666666666666666074787<7@7D7H7L77777777 888T8X8\8`8d8h8l8p8t8888888$9(9,9094999999J<v<~<<<====>> >*>0>9>@>E>S>\>?   @ x   0000+121=1K1Q1Z1a1f1t1111111e3335q5}5555.66666!777/878B8L8R8[8b8g8u8~88888888899 P p  144$424<4F4P4Z4d4n4x44444444444444555"5,565@5J5T5^5h5r5|55555555555555666&606:6D6N6X6b6l6v66666666666666777788)8.8;8}8888889h9z99:v:::::::;;;;;;&;-;4;;;B;I;P;X;`;h;t;};;;;;;;;;;<<<<<%<,<3<:<A<H<O<V<^<f<n<y<~<<<<<<<<<<==,=R=i=======>!>[>d>q>w>}>>>???? `    .0T0c0z0000000000000Y1f111i22222222223.3a3}33394B4J444444444555:5A5T5v5555566667x7889G:v;====== >?2??   p H   %0800U1j1111112232=2G2U2p2222235788;\;t;z;;p=>     00U0a0z111111122F2Z2l2222222333'343=3B3G3b3l3x3}3333333333334,4D444446666666F777777::b:j:q:;;<<f<u<<<<==='>>>>>?5?<??    t   B00000%1h1w11112n2z22a5r56(6K6677d887999:::;;<u<{<<<==O=b===!>j>p>>>>>??j??     001`1m1|1111111111	2P2_22233}33333333 4,4v444445I5R5>7H7a7k77777 8N:::;;';2;=;\;;$</<n<<<<<==,=e=z===========>>D>U>Z>|>>>>     66.7A7M777
8_8889Z:a::::::;;/;B;\;p;;;;;;<<1<_<n<<<<<<==)=6=Z=d=======
>>;>E>^>w>|>>>???c?i????    t  	00%0G0]0o000000011>1\1h1t1111111112+2F2W2`2x2222222233363=3R33333
44'4y44444444C5O55556y666666697E7U7a7~777788888
999$9)9.9>9C9H9X9]9b99999999:':4:I:R::::::::;;;-;Q;;;;;;;;<<<&<5<@<E<J<e<t<<<<<<<<<<<5=Y=}==========>>/>;>O>>>>>>>>>>>>?	?0?\??     00222222222223+353?3I3S3`3i3r33 44R4]44444
55:5?5E5O5Y5o5v555555647B7a9l9s9y9999999:%:k:v:::;$;:;K;w;;t<<=x>>>>>>?     #050[0~000000D1Q1}1112&2e2q22222)353=3333424:4B4w4555667788	9R999.:9:K:::::;-;5;X;s;$<<<P<`<l<u<<=========>T?\?????       I0Y0k0v000011)151C1b1}111{22232393C334}4444455W5i555556&6V6^6f6n666667v7i8|888889999:;!;c;k;;;;;<< <+<3<Q<]<s<|<<<4=n======$>D>>^?o???   p   0040X0a0l000;1{1112Q22233334U4555567777777
878>8I8W8^8d888
999s<Y=M>t>>>     0"1111 2222333%3?3N3X3e3o333343466677V77777777777848^88(9U999::::;<<=5=h=x==>'>W>v>>>>>t??        011"11.2`2{2222.3Q3333&4^4v4444555 5q5v5{555J6S6666 7&7z7777777a8{88::::::::	; ;C;^;k;y;;;;;;=>>>|??   0    0121b1122822
33.3@3R3d3v333333344'494K4F67g7778v88999-:8:>:G:::::::;#;l;u;~;;;;;5<^<<`=>.?p????? @ H   0003456!6)616O6W666666H7r7z7777788C999;=?? P     000:0B0k0r0000001T1h11111\2r22233v334b4u555)6L6`667>7P7Z7}77818X8y889A9`9:L:f::::;_<<<5=n========v>>   ` L   C00$2?2U2k2s2e6k77H8Z8l8V;;;;1<==>$>T>x>>>>>?????? p `  0-00262;2B2R2`2q22222223334W4a4|45!5)51595W5_5555556`66666667'8-83898?8E8K8Q8W8]8c8i8o8u8{8888888888888888888888899999#9)9/959;9A9G9M9S9Y9_9e9k9q9w9}99999999999999:
:::H:O:U:^:g:::::;;;;#;_;;;;;;;<<"<,<I<s<<<<==2=G=S=Y=n=====>!>'><>a>t>>???;?O?U?  x   0P034f45}55555a6i6q6y66677!7-797777777889c9}9999:::;;;;<[<<<=c====>A>q>>?  l   C000E1112;2222T3334A4{445A5q555L66W77l88O99V::::(;;;#<<=c===G>>@???    D   0s00<1112k222^33*444B555266{7j889(9E9b999    d  11 222222 2@2D2H2L2P2h2l2p2222222222222222222222 3333 3(30383@3H3P3X3`3h3p3x33333333333333333 4444 4(40484@4H4P4X4`4h4p4x44444444444444444 5555 5(50585@5H5P5X5`5h5p5x55555555555555555 6666 6(60686@6H6P6\<`<d<@>H>P>T>X>\>`>d>h>l>t>x>|>>>>>>>>>>>>>       (0,0004080<0@0D0H0L0P0T0X0\0`0d0h0l0p0t0x0|0000000000000000000000000000000 11111111 1$1(1,1014181<1@1D1H1L1P1T1X1\1`1d1h1l1p1t1x1|11117777777777777777 8888============    P   00000000000000001111111111111111444 4     <<<<<<<<====$=,=4=<=D=L=T=\=d=l=t=|=================>>>>$>,>4><>D>L>T>\>d>l>t>|>>>>>>>>>>>>>>>>>????$?,?4?<?D?L?T?\?d?l?t?|?????????????????     0000$0,040<0D0L0T0\0d0l0t0|000000000000000001111$1,141<1D1L1T1\1d1l1t1|111111111111111112222$2,242<2D2L2T2\2d2l2t2|222222222222222223333$3,343<3D3L3T3\3d3l3t3|3333333333333==== >>>> >(>0>8>@>H>P>X>`>h>p>x>>>>>>>>>>>>>>>>> ???? ?(?0?8?@?H?P?X?`?h?p?x?????????????????  P   0000 0(00080@0H0P0X0`0h0p0x00000000000000000 1111 1(10181@1H1P1X1`1h1p1x11111111111111111 2222 2(20282@2H2P2X2`2h2p2x22222222222222222 3333 3(30383@3H3P3X3`3h3p3x33333333333333333 4444 4(40484@4H4P4X4`4h4p4x44444444444444444====  D   d8l8t8|888888888888888889999$9,949<9D9    |   ,<0<8<<<<<<<<<================== >>>>>>>>$>(>,>0>4><>D>H>L>P>>>>>> ??????  (   <<<<======l=p=t=x=|=    P   |00`1h1p1x11111\4;;;;;;;;;;;;;;;;; <<<<<< <$<  @  22222 33333P3T3X3\3t3x3|333378888888 8$8(8,808:::::::::::::::: ;;;x;|;;;8<<<@<D<H<L<P<T<X<\<`<d<h<l<p<t<x<|<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< =======@=P=>>>>>>>>>>>>>>>>>,?0?4?8?<?D?H?L?P?T?X?\?`?d?h?l?p?t?x?|????    d  2222222 333$3(33333333333333333333 44444444444444444 55555555 5$5(5,5054585<5@5L5P5T5X5\5`5d5x5|55555555555555555555555555555555 66666666 6$6(6,6064686<6@6D6H6L6P6T6X6\6`6d6h6l6p6t6x6|666666666666666666666666666666666 77777777 7$7(7,7074787<7@7D7H7L7P7T7X7\7`7d7h7l7p7t7x7|77777777777777777777777777777777 88888888 8$8(8,8084888<8@8D8H8L8P8T8X8\8`8d8h8l8p8t8x8|88888888888888888888888888888888 9999 909       888888888888888888888888 9999999 9$9(9,9094989<<<<<<==(=8=H=X=h=x=========>>(>8>H>X>h>x>>>>>>>>>??(?8?H?X?h?x?????????  $   00(080H0X0h0x000000     x   222222 2$2(2,2024282<2@2D2H2L2P2T2X2\2`2d2h2l2p2t2x2|22222222222222222222222222       55555 66$7(7,7;;;;;;;;;;;;=======? ?P?T?X?\?`?l?p?t?x?|???????????????????       004080<0@0D0H0L0P0T0X0\0|00014181<1@1D1H1L1P1T1X1\1`1d1h1l1p1t1x1|111111111111111111111111111111111 22222222 2$2(2,2024282<2@2D2H2L2P2T2X2\2`2d2h2l2p2t2x2|222222222222222222222222222222222 33333333 3$3(3,3034383<3@3D3H3L3P3T3X3\3`3d3h3l3p3t3x3|333333333333333333333333333333333 4444444999 :::::::: :$:(:d<h<l<p<t< 0     3$3(3,3034383    8  11111222(2,20282P2`2d2t2x2|222222222222333343D3H3X3\3`3d3l33333333399:$:D:P:p:|::::::::;;8;@;H;T;t;;;;;;;;;<<$<D<L<X<<<<<< =$=D=L=T=\=d=l=t=|============= >>>> >(>0>8>@>H>P>X>`>h>t>>>>>>>>>>>?$?,?4?@?`?h?p?x???????  \  000080D0d0p000000000011 1(10181D1d1p111111112$202P2\2|2222222233 3(343X3x333333333333334444(4H4P4X4`4h4p4x44444444444444555<5\5d5l5t5|55555555555666$6,646<6D6L6T6\6d6l6t66666667$7,747<7H7h7p7x77777777788$8,848@8`8h8p8x8888888888888 9 9(909<9\9d9l9x9999999 :::: :(:0:8:@:H:P:X:`:h:p:|::::::; ;(;0;8;@;H;P;X;`;l;;;;;;;;;;;;<$<,<4<<<H<h<t<<<<<<<<<<<=$=,=8=\=|============= >>,>4><>D>P>t>>>>>>>>>>>>???$?D?L?T?`??????????     0000<0D0L0T0\0d0l0t0|0000000000000 1111 1(10181@1H1P1X1d111111222 2(2,242H2P2d2l2t2|22222222222222334383X3`3d333333333 44 4(40484<4D4X4t4x44444444(5D5H5h555556(6H6h666667(7H7h777778$8(8       P00000000001122228888888888888888888 :,:@:D:H:P:T:X:\:`:d:h:::::::::::<< <P<`<x<<<<<<< ==(=@=P=h=x=======>>0>@>X>h>>>>>>>>?0?H?L?P?X?p?????????     0 080H0`0p0000000 11(181P1`1x1111111 22(2@2P2h2x22222223303@3X3h333333334 404H4X4p444444444444445555 585<5@5D5H5`5d5h5l5p555555555555555 66 6(686`6666666666 777(7@7P7h7x7777777 888(808@8P8X8h8x8888888888899 909@9H9X9h9p99999999999:: :0:8:H:X:`:p::::::::::: ;;(;8;P;`;x;;;;;;;;;;;;;;;;;; <<<<< <0<@<H<X<h<p<<<<<<<<<<<= =8=H=`=p=H?L?P?T?X?\?p?t?x?|????????????????? 0 l  0000 080<0@0D0H0`0d0h0l0p0000000000000000 11111(1,1014181P1T1X1\1`1x1|11111111111111111111111 2222 2$2(2,2024282<2@2D2H2L2P2T2X2\2`2d2h2l2t222222222222222222233333 3(3,34383@3D3L3P3X3\3d3h3p3t3|3333333333333333333333 4444$4(40444<4@4H4L4T4X4`4d4l4p4x4|4444444444444444444444 55555 5$5,50585<5D5H5P5\5`5h5l5t555555555555555666 6,6064686<6@6D6H6L6P6T6X6\6`6d6h6l6t6x666666667 787H7P7X7`7h7777777 88(888P8`8x8888888 99(9@9P9h9x9999999::0:4:8:<:@:X:\:`:d:h:x::::::::::::::::::::::::: ;;;;;;;p;x;;;;;;;;;;;;;; <@<`<<<<<<<<<<<<<<<<<<<<<<<<<<<< ======== =$=(=,=0=4=8=<=@=D=H=L=P=T=X=\=`=d=h=l=p=t=x=|================                                                                                                                                                                                                                                                                        {
  'variables': {
      'sqlite_version%':'3390300',
      "toolset%":'',
  },
  'target_defaults': {
    'default_configuration': 'Release',
    'conditions': [
      [ 'toolset!=""', {
        'msbuild_toolset':'<(toolset)'
      }]
    ],
    'configurations': {
      'Debug': {
        'defines!': [
          'NDEBUG'
        ],
        'cflags_cc!': [
          '-O3',
          '-Os',
          '-DNDEBUG'
        ],
        'xcode_settings': {
          'OTHER_CPLUSPLUSFLAGS!': [
            '-O3',
            '-Os',
            '-DDEBUG'
          ],
          'GCC_OPTIMIZATION_LEVEL': '0',
          'GCC_GENERATE_DEBUGGING_SYMBOLS': 'YES'
        },
        'msvs_settings': {
          'VCCLCompilerTool': {
            'ExceptionHandling': 1, # /EHsc
          }
        }
      },
      'Release': {
        'defines': [
          'NDEBUG'
        ],
        'xcode_settings': {
          'OTHER_CPLUSPLUSFLAGS!': [
            '-Os',
            '-O2'
          ],
          'GCC_OPTIMIZATION_LEVEL': '3',
          'GCC_GENERATE_DEBUGGING_SYMBOLS': 'NO',
          'DEAD_CODE_STRIPPING': 'YES',
          'GCC_INLINES_ARE_PRIVATE_EXTERN': 'YES'
        },
        'msvs_settings': {
          'VCCLCompilerTool': {
            'ExceptionHandling': 1, # /EHsc
          }
        }
      }
    }
  }
}
const tar = require("tar");
const path = require("path");
const tarball = path.resolve(process.argv[2]);
const dirname = path.resolve(process.argv[3]);

tar.extract({
    sync: true,
    file: tarball,
    cwd: dirname,
});
      <ƒ[5`'y|
6/N	g!QI8qc7ߴBNwiwKܚNYkϟ}~7ի|b_g/xիg̓3[
;"c=?}=߭{}8/_y@0/o0'?{4Yى됫;6$i֛//<
)k[#:14 v]-I?4idΓOvp8v:^{qF αU[Hrneޭu{KǱrǀ$IHf F$։Kd~k	Y7fsGaě(*rc7ut(\Di?ʅ@Н+cwQ%S#`nω$ll	-e}y˕	*䎄srn;cMO{Ӂ9ᘴ=:.ƣĄsjߘ0y;jO_cb"C"X[prI	Ad7ߚ}J34m?	Ɗ&hbNMhXx*ٹw{Gxn^t8:+Z,,TL`H:A<M8NZ-YՉ;I1G>qEa[#>e3RUTIrg`.4釃v=ck;ATڹo/J~oMZb+;6gt4W+TW5{y\>1\Ǘ6@sR2<{)ǍJ*ƿ@ƢQNd*f,덷X$=tIv_ ZViw+FzxuSd"N(``w1a|ِ\{(Zy8޽@nOuk/P@wd4G7yQ~[_e[{};nEVu*yZEF*r~Npƭb6z:'НL7A/m.KS&7Z@s|V7mg}e1jw޴`K
/kDiu+gwJ tq#<埓bPA51a7mOclh^ Q[mO\XImFjKPgyJ5{iQo0}cJ!@(1x%ƒP+vMHlvlڀ`,jw.
00NT0& eWuk{]kwt~HG+1zÞC:Ǽj--]9r3
K>:;i5Gk:=s[BJkh3<?(?ѷo1˥D*Nl^D3ud̞A+~@*7-9P[p!yv4.HV>,bi{5'S+;`:rʽbizl`ŭTCKe:]l_V&N-i?xQZ},[Y.8YlX[GjHe%*7`!q<"ml	3ZsQM*&zi6W 3&@RE{rC>?4@39֜)P+>phAS.jrQ9#[OI2q9!=VJ{h|c6 jٻAx[	{ͽ*g.7:gHz.2yJ aJh
CPN(F̩_p²EDsKeyM\/P9W	P@tR)cwčˠAj	(l'	iw@b	__Ҁ#8tE~Ъ,ϯ #lI=QN̔(6Pг0l9N 훔rǷGWmDy&x~d̉,k mn,fx3UjHH]k[o-?]|Pܵ" 4KtZhn`7'p:q3UKq`6fjqaW(rnN @$]I%54dt9mk`)GIN zʌ=U	2:t*HцI2o#jVHB4Ṕj}  b'/`QC}۪ۛogf63x#ao_tBۉf,\hfNr~cΖ9c"HT(wR#YF=	P#0T[A b#tp0	(As4ʘ/^jwnݠAyCjؙhTX1Ng G9j,ii#E#wsPI %`PQ=MN7+ǨU`M;~{4:bmOt'qz	~0rHeXݺ>	'pL`+o L´xxz
 
s=+q#Oջ)y;]%beG9+js-dkߓk;&4$p?᩺+a!X!߆@'cG.Z708څC<%	'Ɯw17æ$bXax7cth 9UrN bd'}<	Cj
*v&C}PV5Ib'A:x0R.`b;#W^.*έ/{L9,S ^3\@vW}O%v܍"}qKui1qy]g:yGOycz͆AiUEw~deBd'_Nqlv.Ɠ[Ӛg&/g,\.[B:u%q(A~ٴXɛap5uЧ`A=m-TUuuoeB!X8~*;RpIe 

o]yWŃ/g_U %nLjdv[Y|y VU
/gY	4=kƾȋ-HmMl1ɂw^L2:'vT_7[zhݰ6ao/B(wuGW3,츱7=A_7VmFַcy]z ':9[ӏ7d#FVo=^R7bn@{QR2|V^~1!/bz,иG.d8<Á5v!^:/3|0˭[(7vrуPElTFV·]xಥlcb
eN:kLK 
)xwFo0Q1tEkxFau,X`w2@/G'C8d !f*!S`b,&{Q ZB:zûʀTp=e\Ew%L<j=ŦOc(cFPL^+04.!"z'0VcE
 Vɋ`4bm6srmbWm,S 64\+!(#t;5Ary2 &/ڀfp%ۛBC/RVmz_/%塡ax`S`J7hh=T<6YpPJs1x8xBaC0a%σi	s mbRÄ/,L-Y[t)Rx]jhCS#a_}ei'SŠf[ReyYb((, x;QlZe8#LLpD}&5d	(~(RB_HY`/$}f/ٱVu'RsEHa"Ea(p^\(f r	-VFZeDW91|̡aJ
tJperJH10-J&ɜ($21`0Q@t)+O @+0̠2 C[9s`%R(0"Lc3ZH2:`gIKxPY34$mIBYn*?뻲~KY*17%+^}[+j#lUJF( vwqnvoƍr3Z+//-B́)?8{-[NߛpkQГ9&AdDi$Lϧ	ĄSֈu	;=E-ע~N40o8{$xz9!cw3>Srٍf0А-{EI24FSQGJ쥦'_ɑR$`0u?$u_jb"7>Bj%H+9"E=R>Kg5sYoҸē'FK6^lU\
`loЩ-zV|6*Z+LRY%U8m{GBLRUƍyhpNNu"gyT99I:|9}PaT)29RO|,J{TG[3D.bM2D["Wz$zα>ں](eR%XzZ3;RvnWJzE4XF$JFe'T0q_🱔{vOMFL%"2*;@̥AV-$]q$]6`?Vz2MJ>Y5)#u j2W){h`Sq0CqՊ껍VкUrl,7J:Ow=rVz"KoޤZ%|7s+-(F); e])w2YB_r@s*ȨK L Q}ARn #}]i|$>Kz{ŀ'm?}kǤm|ؠm>/m;H|eⓃ>ȦlI3."SyE]*R/9[&_12nQu' RI3WdRIҿEkY: 6W6`OJY*i?df7ޞRcL4ȳR(Z@>K-(sƵɗsVq|z4AH9u4ǷMʟdKP,-5NS!f@umOD\'uJTHW<{:xBZ<p+j],RLɁqS4#m26{)5R/\_NݵtMtKȽE7xdNpm՝?T"/7iqh	aY̭w&܅'>#@Q.O_thxB%˙sµDd<ܲ`ũP GJҢ¥2]qY(|>E4$˲li%1dɭtR@*nwc_cGdd~5e2cǾv[G",h6~~yvhS5ÿc&y竽?n)1~Yo֬(lX|4w6(8}8މX628{֟^_}}?Ld@AI\@#,K[-(/zڢzZwvmߡe'
s+F};|l|pX5wrs80K:^Yuע|_cRU*^ln}yh\pr#%/YGܨn[߽-.;;xv _wz^K3qc4~~Ogh-d>)&~/#~/{-gZh9v!PG.TMO߄3Sr_wN1](6֔V"}`̣B4rQ94s-%m[ZyiyϠqd{Zگ_Ϳ柡{eK3(lew;ngQ`=H.$_d`zl홍V ҷS۝zϿx0o}2=@_a?yPBZtZS,BEMm$f/|gf<}a>s|}xq.HMj+WOVw;ƎG:a+
Yı>6Ʈfx(7	 X¶x8@ڢY p0^4Md	ϡ3iSq":ޠ2I2WFP !>4d,Nt&SiR\nb[sá+Úipf $}ՖoiZ?, Gb( mmzh</\&18p"03hynGs63cٞM#ܶ08-$,v	gngʼ7z LpX{0pZ7KxN<-ݹg%'ֹ嬤vR"{T>H~bh9Yg#mH?dJ7m7LBYpO2 ZXϠ/ĎXIvs*n1D3FUy1	"X!xD2p!gV<5Ǘc?A\߄gl-]///n\ԅqMQ8ʅiO60Eg}ؖ1^e% ;>JZvNJ(-NQmUnKf/a}}&@Sxj¤M0us;iwYVγl#?]?hHѰF`H7Z?gc360sςlK?gM.~羚rfv6/qkAW,pihWAa4w1>vؠ!TcHs٫#{_i4 5_5^NBC&o"YjM_ArC
n!>u'chvb?(ن9jG(OP5agG+KRo9")do&~Jτdൿ3i42:% FU~"M"|7_ꎂE^I;lᣚ5dvU[%
#D;]^Y<bi3Y&Pb&fӀ7F6evz8LnސgV'\oytl8J)zt\oɞ7'_QK'ǃw0/AHdw>/3Xec^1f?V nփs|mK%*<MP+~0|ET|&wyyKk+PK C7 kB;ݔs'si_VVGp=0ԅ;7]XG>+p'̟~[Y)}Ixv4"ֿGs5܋{f<vhgճlx:waB|ܻ:5\. ~Lh8(.ޝB~wHb}f;',ǲ&Rucuۘ2KJ\2xeB,
,'1x~%<+-a-9#vaAv9ki|^-Eoq(x&Ч<)h]@]w^Ns2[5շD\_u1XR9"QenC.`>`]Kn(C* ҳ2B+,e&!{Y1xF[u_;ـ{fF1YׁE7_вC3t[tGO(ͩ扑#ye&8~JJ*IWk~  IIq_^=;~hb{Xg`![LSV2<\0v.?ᡏbodMZR+"ϭ>\]4%}Mzl3++=Ǯܟqь>R}#ܧ$ݯQ+=8Jz)vY;wROLCWؚxјg͍3×6V"Yi^Kͧ
jQ ~7o{QMD|9߫@	1BgJ5%T)A2=yHߴ`0*,G6+~K}"F_/_$JTOSq^ݣgNfjRePD	YL$u.o#cI} p]$즗oߔI䁑uP\Lbmb=A:Dp 4f5SˋAeϼzQ;
3m}5#%xevg }aQ!QPŢed*Uy"U3wK4ޤi>.'>~@ecsQTRV=P}(H=Ө1
bgd#I?qkG2RA ,3[Q~['bu'a%}6zYv !YN-a\8"46&+T,@Ѭ?&nCjb9>	<˾1'pYq{&)	o,fN(4_Kְo>yTBx% D{Py0׸狡;(k,N3Zsw?:գW3qL{uVXb0d'̂g)l'nSԲE2x{Yp83yO3CD^QyHݳ"-?Ϡ-=TDx9l  ۻ/"Fs;&#fMk0:GuoXBsД_Agv	|}I;M]5_+Gm:|Uep#`xRrI.<	2מ5IwԞȈ[X=׽=潕=br,EBmX%8-aQʳ-G˫ XqΗZi=p`gJ)L*L5oX&^zcH\$dp;NҾ`nb+HCeƞLNV3u|b~Ƕy59Nw	r1= )Hb+%wesj,0#moxBEtc=,yGm ORh8"ɵr=˳b^5%x3	Dxkk!8nRbV[;oM[+z:u_w>y_a]w@9jU>oJVY}WOlP^;z	InE!µ+>T%]?较wOrniʣG_=Z[W>Ϛy1/gѣg/}˯s__=~5a~>ܼ/-F`}[KTTOK~ߠ7cɓ~ӟ(jp7_N"r.Q>'Eэ䘙#>h/꣯Wfً;MƜfX5׫z'n8Tpc@~wL8΋%~C	FꦦydWY58)gk'M5Q<9.a.pD4blF"5sc7pj{z4>n8K_GʽS襫b݀7#;ocЌ-Mu!ni6tB(LW4jV-ڝ}9Sl1hpx3r/-fWE/8Wd3<^Yz|ᮛ_கq>\ڹ$_ii.+ϋ~Äˡ46q)l}\@(Z_\(3ݺQcp	o,tl3l/a=	0Q]JZ|tfFIeWܳwUs7 ^NK7+>J0=RDd6r<h<qhM栃y.;HƂQ7[?}9dRh͓S·s؛I[±f:*'#}ڃ%pw#6~ёtrEa,A^^Hj1
+Hog3ap )$39
#sYA|xXF ,?C4_|$Pca_wu~ҤadkAhYo#ف# ȟ$8쟜(>s{l`ڲ5j9ˮ|ȑ<T{ε"!<H]cw;t YA2rg~phVf00ZӑIwܟ)DNUCB:5M?W;Zक़92hDXn9W@kӒ۞.|pC|թ2uqĩlpGuJuNa{*s*t8j7݌!n2N+7v+?t@'7;>g˱ŅDs4*%qx$N7_ݏ:/ W_:Rcc RACM©p ٵVT
J9禵;Є꫕v|?ʯ+o(p}>\?ɹ*&7 $&~wk:5x-:}F=u҃IruWfa94;2J0 CӚdkwp]ѭ-m![J{8i݂WN~/d(ܣT/W["WB"3~Y&q*F=ծ/	Y-jZ~n1p~dSfy]m
σH/W*}(peU]@I#E?i(gIKB_fN7W= Y>\jihJ!ɧp%֙>ru. 6fϲk_>3__[W4/7fo=7{6{Wk
GV9-ÌW?}f2ŏn9o`+&f)1S	:1ɺ/>OnYnm]]\ ǪRRo+'"̺>#xC̼|&|==ZYߛ_fxS>rQ[
N2vt|}h
4Z&#[0]"3DFrpL1~_|8\2>,պ|x7;_ˌewo?nw'GZ냽gGݭ7G;?8.YIwTCsWg'?vM7]o/۶k똞Z˭nf)J?7$v`fWgqqJU"I_bn1NSwޱm=N`jVtl|3ǒ>4l>64Ⱥ0ɰZFwp}G_?l2Z!欛	|ڹ@1<n9Ep_;}+z5
CulTx ׺die
h"sM3|{vnjUPPw09yk㩠\1llC}wTT>ˎp^;rv>xK;ёCV3̪(v-9@Ceq!*TNw= $Y+C1hI(lܿ_Lp~);඼^g-Ɠ-D-$
([@E`N]5s<.'Nхl}	"Tj瞮l<]]܁ uLY+5sUT!3Ѹ:wwWJ`U׌ &ࠫDD:V) Ys*&V>u(MӁqy]A<G,:hdXgQp#-)}??`7[^ď^<92{}O}֍JxP֖pj<l!2[C,,_jmB354ȳ^ߦ!pQp%?9q3ƮHZ?PHv>t(p\f1r 
lkw	n@7sY0>\RQ ;5X2kD0P6A;vX&Dq1(9tt:NFUB׭.l.{Ƹpy:v5A)ƙx	-,N	4,7=+?	"!CgdmY6Wo@Zf,#c<Xvcpd5m^Y2L&Gp:~UZZL(b:TW'_0nj-F+su	;J0gǓi@|֕ciNٽ:F5iG=_ִS'˖a	yڲ箞Wb5U%|T:ۍfsӈ ,BxۓJs]f-a1c<[wQE9H+9%Rgg#%Z^&FyB-v8PlR`c_(HԎ)1
X>|? ~bc)o	4e;"{8_էY^wp^B %Md"WNbYkOGS'.fAT~ce8v5mAaML*V
ఀ#ZeochN,ڝSYGxD Rsl[T-ކ7Յ'ŢdzV۸۳d0Dd[Cβ%)7БHA"_+kE]q7+cx6[B/y:{s={30Ϝ%ZTwoIzNւOQ^p8\ V־%ApY̳x\<L}?H[̛jmRsog0wHcex0R@9,xEt`t.B9֙@*[ƄgsuL"Z"B֛㓃=)yd4uAlK \V*a~jgKٿ_|_67$|8rэw5HCV$P&)w)	)Ketg}oM6M-?6@pe'DoSiϨjƱds:h6t7c>U
̈8mpHf	ct+6wiL.խe!F~Iddp7ׅ#a5-WC%l,M܊pqu"vTKJn	o%53^(rXۚ`@ư-4ֺ#O*+Z^=H"@uo]t0kBjK`CqnMÉVN`X]W)iƇ%3v'bFmW&rJhBW,=։NF$Z3-'y273Ksqj9\\~I6@">˛cu1y^62ٵeR!UXO5BeU֓~>DWeJه	}h9ex=,{JӋO@4lqk1"=Eh`Pe} r5BͿp_c>B a1w֚eAu-{	6q;?BPI`Ŀ{DfIpGii{`֢*-Vo.:]D+%;Vlmwv}HФ1,԰-fQ+Fp	H":S5IƗ#0lm(o]Kv8a*w4O,k
td٨BZOckN͢8n1^dZBD׉kHb܆>Tdbb-(q5<4WcIt0i9*FF:+0m_(GFO4Oڇ5KA'brm%d|Fd/ҝ^6{9L1V%|'sI}J|-&$
A|B!ZsU6b%B}
)*M(Ru׈jo1-dph	Am2%soՄ8|DANs֊z.!+#­ Ņ<RG|\O0AMG&*h<^b񛂮/rv^B<lbCRX*cop+'Fӻ%l
v~ !/w#sc(iAx69sėz֚_{mpa|t}`sVNelE}rU2Ewl+CD:|B96`#E!}n?/일vN-aQ=+Dr.Jѻğ	>gOKK߲B|ioBVV-'kُ2NcsZLYVQ":r7E;YO͜sl#vPȧh
Z4-np,G47;d*3w1l;>t>l}hu?Xx-ǒ ɭN=ƚ'gWd2zdVj5|KU\ȷo߹{<f'g/W^y]ˡWحJ0-± 4fUFG0ϫқ-:yvzsmPG+_>vLEc="rTKבV#8? L0>Ħ,h!3;
uW:/뗗%%~v뭺qA0ϲUT3--"%:Oie?z7(g|,bc =zmQLjlcmcLk_f6m<?y׽ibȋţ^/?[;_{q^<xR<]l^fGἋ,ۃgr9ɂeXERNxsKDS2X%Hsg3+YÝץQP`,UAꥪ( 1ρpJwtt<T}2\If+QNx|)xYb6I æP۴};d4lY|<}$	Rv<][F}/: >|LzUN`&pju-"1Y/OBv0킈b0 ['{Rv2@"eۻ5s|+:akJj -TmF5iPjoxkr"jv.'F$|4,"S#Ff13Gkʇ?-xoRh6@S4tu8M-,п@ЄW4n{_4kK	JX/7@;	-pe~9j'<)Lb@HQtd#d	  Gd55,!
(EF"hFD  U0QsDXJgbut/-uf+#$%ML3AZB@_\Oú8yx#FˣRszcAef/34oWp0[]b[U%:cY͚cD`AŵwvrSYhkȌ]KjbO??UBLmhcYF	 gU@7=[=-%qז[_'>pS?!C/ԩ)%Ř0`d:u}OkH<|=VV챧6s)R1 Nds@04EOuAQyFGZS8.$I\,U.:20iՠ!MM':ltَKTÞ80,s./gFpA	o$x*tpt-``B1҆4:GN  Sʉ80n3`;fD2%gqNhUmڂ&yw;Ӕ  gRJX㜷@`k4_X|qddEk#Ra+́*ˑ!JڤÅ"3 $+TRx9$ZʖWx	ǽ&=cT՜.*o<"GBs1>uV\~xgn
۽7';%G;;n{݅xtjS:RLy ,PLVPGwu/b
*D.r}53lV0d)[CAl7eN(PR̨-
=cqkTػ݌M'9Ѕ!ʿv<ؐ7/$?!,3 G!Vƀt]d(\bmZFC"y!&jCyBw+C[,|?e7l3M4jiܤetX"%c!tKY0V[Զ^ϑ
dAL|Zߝr/Pruw(}S~MzB *$Ow%Ľ4UxX_L/^>diBV%LsӉtAVl~rBtpCAt0j5S~#L]phJZFCJHna@p:pґ4ƣG_m=z_}ӵ6Xn:{'_=~գ־'_'N~<.dB%:soFͼi3ՆP/)¼id>E9{qpfga9KJuGlF}8;3MHI(4g^SB+NPE;t;='d:	+FP{y =noMjh5=Dǳ=,10͔ B9ޣ7['P_M]b-Fl.jwY#7̩\'[iNO$=SVS]PJġUw̭`(GXX(Lfz}5K&Box78{Gs{f_@@AQmGt]WԱ婣٫XGMR˝v~=047OPdf,^=OАy~:	?b@Bfi)ʴ@$Dp֜Ny&D2`~<	{ʞqq.zȽBGV, I~]2F+Ft8UPwXu$;H>F$4Y%C]'AȒ$=9bʢ(DYլyE g0x'$'9Ԇ^7a	P~[Oy;k<6"=sBn%?z8.}nոYwQ^@Z^mN9[)Z5ªsǖO5Å㽃{zIP:(PLI__h8L5NRE!zʗTpSg׃vϡ<CI VaXJ0L~p' 45ME>/yjmt2q0,V'(㺷Eoc^v,S%A퉧M\ʻR($q/Eܱ⑒WClH0b|ldS00&hPXHXVa+IA@ט"R(˕ + x.K+Zefh"K`@'"~h;up8nN}cuZ[>i}0h鰮ۏ&vs#tS<Z1:		G"e\;D LYty"2FKZcL)ha6,IK
xOaCb<v+jxD(i
=J F\? ;}Z_	R	xhG4<Hpnƽu8y(?Bh l'[mݖB[h8Ѹe5hv#2&D0-ojZ1gM˛p#7&轺 AOMA38ÚjGDQzjDV N.牉Uj}^G'qhoSu*ADr8/ctz(#E,e5,ӁЩt&Y>Ä%&2ng%{S\l!`'!_="	8ܒq:pv)rOfw]C@RYi`Y3CAw9@v6r\&D`g&VaݚMYoAcT;UL P06AaP#՘=(ihH
Oǉm'-~Ⱦs_`>!0)$Pxs$(B.>k\qZ52|k!2lMή,8%Slt:Plfб$3l$G'FbyKVdMȹ\KWN[N'|W<jރ{}>&6#qAh&$-8󀡱M]qaL47	[Rض&LwE44tY5(5KK uYX.Vp+4fݣ#iv}>mեZjAў2Z|#'`ONB<3'At xh	l:/k@@HH4t9*{SɰrT6梵WҎH "`f#/ A<}c-KmћC\گ¥ l0^r=9Q-kOK!-e!yx`qr[:l}=QTyJ[7#hY铗oq֙	 Io@dr $Ɂ@!};K
JtsఋexHORhl֙ǈEF
JZzwDNlom{_%]׹bN^I^w#EAqs'AP~ E5'G];Lћ
8 3XVlgoxе$۬Wa|`ggJ ?.Z;^~p0V@Fk9y-!L0<8rW&	#ɓ6_I=V}yIH SK,8r<ΖlW: 6]jɃvhgt W߫za	!C69(]z[SdS;P$58$!/4/3$yt;Cc!$x^`qXY4Ԗ<0|(PԞ'ԅ1锓
xD>q5Na$e` MˡȠFf0_\ {b`~)WeؘPz)cfKT#*4,gT6?&5X\&#ń43MgJUNNʺioM;3s.l7Ɩ!QWgvvYGAnu\G$%ś\E}Vsӽ Wx;iw'wN/>]^N~=9jz}cǯNf(:pgT~9;x]G'A#Ӄg>k/ߚoM4^r'GohFOfdd࿚}PPft־o}YK;$.PZޟEx[[Ϣ<'o}=Хl?O?vY|UY?swϽ-a̢?ۘy182?ѧޟE''N<T͡L;|=~7fџUyޟE/v6OvޟE[{*lh^\@ }g?Eluyy<4vh󨻽a>3_6dErY~Ӓ>l)71Qp$5@z;UvғΕ`9A43N~|;bGbx6Ph?a}.no[l7}7{}q|H-z6Bz~f0g/,
m!M],vwNfvZRZHz4E0-c-D&-tA6z}nts਻jmӆӜN,/Fm8ֹtM5mm8k.m\B89y3𠍴$cx̽MK3aHK4;fhiM1NA6tJ`a|gz,߷}=˿ -B2Wz/@m}{*Bn}[pIntifw7.S] w=
 !AsN%Fslе`s	ǎq,cǋzFzʉ? Ϲyi}l1E)#^ $d0oGCIGH_&9cG[؆(5<h 1!F}]TcCl zc<8D^၏(mh(G5!4wKFMh32Hw[ow~BjRjV7vo3@/1r"ve<XfNg9cO 1+c
gP	F	\gLjL2jb{?8e/a4{W7q>k={~-=}ўG}hsx{7#?7G8}[߸N*7'V!J`vZkXn?8v{޺atI&/u>g<wG-cum)/x% ϲKjv)1HI|~؎OjA	ܥcd-A--*PD K{pPb&L 3MQo[G1 z8x NR@\0P}$Dm !Qj-XGcX5(>-5Pa-EG!DY)p84x0,-REnoM!6	!H$_zIVg6n3".bшBkek5_ě,qrRE\\FKɎ;(#'(.A`	FO e3o^[Ã#\9PIkeP^oE)٨PAUsq%R~e.	T[KŨ&q\DclҁJ!>NKSә˩;҈ QRfݳ6!"${+)(O'N]pegݨGYKnAg+85W	%^T/ch\~t-_z4g9˄Jl5HbG +(F+kq擎zPp賠x?\q_ ?Ҫ6.Iڗ֜zmck߷xk=f?>㙯='絛Y='畘kJig2VSIbUPүynFk#_	/aE8EccNJGcᕈaT1w2 b
 J\1vY:33H=D3gY>.77]nj( I]>FHj7uhVs`#p?RSY\CafnEI%l)0M_$1GQ`Dً[X WD2'Pz&[nb	n*g5m@]\cUtlKY +s2e')Ŋڜ߬C cՓsxjowH֧M_2׊L(ѩLHڨ
qC[Z `q	
Ճ~"qAv"/Zu	z\^VcF=P1?,ϐ8րAXowZ9;dK'X.	UeLInQB_W>f<5ޡќKiS$Hwrw_IO&O6?SL%=VZAq
:s4e@oH|~WOa@ԧ֭AY2,FCpQ,{8>gxǠP1kFW"`6cJp2n@7'Iѷ~7h3).K:H5?	좴tTP^&1LڏT>pw( @܄GOn 疸<w.6TzM2ϕuZke`c`b"*8mfՓ@
mBosjBMПhwBl#U|,	za7k)pI#ƴRLZNXAU肗*G\oS1)s&%BË,\RƩxG\X׀"i-`IRld XҪT='yV5iH専I
,$k~GQ۷}:"P6P<ad(rtêah|-+]TRZ븁=-sbNR \ (H -πΙ6ŋ(>^Lrܸwz{)=NC7w4⦬K'pli=OA*a{SZ!TJDk6g\s^xC n#XC!)vD/D=<DaKI.wMF"R;dUU@9&PꙂƛ#9ō9E`UCZ S}%B4˖6=_MVpcMK2{9(!r|+mx{9a1-Cxxh S%OG  C}EJdgZ7195l`ᚱMF̄I:)
#t;`)m"Vn2u>=2XqJ 99Dң^u9,1:IMUf\J(6P='ѫX((E8Fbs:>"T!ջW4|4<\q	}hcmvD'{XLVz:/7f?7|xO|dI5===vEԊIG:Q?Q5ۣ":(L 6p!uOG)H HUy6Bb| =b!!$V@͒*`$
[qW553_~./YQ0{ؚNF@*.m
>Ds{p.k(7^PO.@SJua!kS,9#t;ըÈe@*͠z;'1z/%]^/gs8]KV]\ń~4mR/,3V=fx2b
,F /Ij燶hbq?qiBDxܩh+)#?lFȋrBly	gYQbE;ClyQ5&߇<`dH_m( [/P?^^Rx05[
ԑmMN,EHc,k7bme^Jp[>ЪQdw壜"ٞ֟" #'N4zsDu=>!Yěn2?ie@?,z~1%C<eT
O.FUYL1 &)jAQ98hԄ׹ 1Y05z(9۫\hKBYmra	>,A߽*#Q8Rk0kvwvfo=حrµd֑ڳ>:3 ׋MD æ|'2I^
hTpj3\󸷰%( K>	0ib%6PC$SX'*_c@.]yP	e%NxX0i`qh< !`ϧ2G	˾u⬺]MzCCsxDZM2.!)btFX9
̪G8 z%9=)T;c}Eh;(vGophemɺA5\n
Ԙ/wvT{Զ3'F!VmZbnJx4:NcΘlh|~)ÓuTL@${(Ei&
Auy,u\?u[#긞8Wo_ڔjܟr%ߙuFdcR$wQ^K;J!IO+NzO*GN\EKǍBUeǧ0XY<\bs/Y/_FŹ {a@Usp=PQUxqJjD:0HMcI9ZWE\!Bt1q	:Frj	곬Q"B@|A{oMJv=Z/'bç]4CY_`C	ƛkd-aN	7'oZo{E2g6L 6,Ğ\>RhR[jv޻o,?][JZoowmm@ ?5w5z,q)Pى9tNn%BL̞)	uSZ4_y\O|l ^>>>b@ŝ+PsXNI/cp*7ۃˎ:,'K(}(R,wK%E/ԖbAC'z>R@̸a|+xfxa4Mn*ZrSWʂv2K'-殿NZCís"Fɭ?#em.qm/1_ōZU|RJNo.|>)Fob8yCw!k;Z@F͝
CX2SG;'KP3	n߰8-3YkC/TM`w +J|z[|'-a{(fS\}uV G]\QnJ;,zll3uu`X9 [Sۂ"B^YhMav.)Ė
wrOt$O-g{2pO4A$.aOfujeMw#sa5v4u)b3^YLMNKZo>ҖS~4@'(ZvO?b^ŊLX.#,[59A3?3'*B_{?ǢK)2C[4O@&I,}c8r?%CDJ0bTyO`9N ,[ /V6޼3REs2^ste	EGk:&*
")[OrFҦ	xWu-] hWw߭k!UùYp6b,49(r qDq[Y/aᶦ@\ZB2
-UC8MfV*|U)j\pfuKqOcpHppF]NHK,
?9k}ΠJ,,E=:eI[r614A7LlVjD4̇TtI9i)P޹oPOF6λe9XEr=x('sYc}*p|Vől1h?7-R􉭠ޛMd8A`\.fSSMDcXUY6f;T7i*xȑOa-AF!)	X{j̍U\5a0٪y,R'
]kLbVY42v4ݞkf_aS_&jArmx>,}V'̕4CXsӅ473Bj$\V_l6%Wc)\:\lkl#3SѲ"])D<|jx<!^ h"ӠBm-XDx3.dykO 0߫FwZؼH$3)Fd⑾9fmTMqQ;iMEŘyQl\`tE1I7rjȍu A-[ZǼ2wG.I«`Ff5|.1XZϧ`8]N%Bכۻ3 F%(bn+I8dRBՁUJN5هLXxE햣[n*WIfJ6s䄝(wկDNd)V
-I]Q㲼=Sw1!r9l{UvBuDt$ky$v(dL#wKiؘ*KV0EeaRj3pam4C]Wt,\PIz
 I|pY9}:2MZn,0<*MǿR# >[\0'GdyRN;SCLqxٽ46/0\;Żf22dCWu~p9驔C)1vji\CK<dYa|F֑dXְm2w*7Od*G%8"@kRgyz>*m`x_e! 6؆#EqŚ2V5Hgĸvs^_N6Z	XT z1%F$3jR3TQDHR4) ;qrr,{KO[=uG_
V)IVq-\wƶ<>2Gm[Deh
(/mPSr˳P}4L$cv)#cd}@uàxUcxnh5$2͍$x=9#m͵_BZq[k"{D"#%rZ q0]{qs~&Y	z=4\$"܁> (͕hRg.m]H}XmIy(C |8/ZaqK~<>]Al^-^0Wp̘ƽrܛ^JEyKi1 cȉJ\-s6Mg,w!8e[g  y}!cڌAx6B}x(mSCi^$duY$0qRIH
 |OJL*
bE/޼xO@Gx;$1Fdgu`%I*xF<@41xefcȩa74W-61gqJCaVJAV1Eiю2o+
gVBǬL@Ud~6)n{hBz\{aK QMbo
"/H"Y$g6К[:[tyPO-uKD`(N`-(BGQ""u9hG#sNB $s mʈcreP*A-$2hpxrT)`Y.$~Y7M=ɇhG6ݟhKnoɅ'6&rY j{SA+b8^2`\`H?x1R/cCD8)l) (G+EULr DAr__ L6\^М/a57h~4;iPkތPƳ (`mg;ag=1iռy蘘oÕ=XDD5qbUZw.$u|DN(rß'WcZ#WF>Bz9g<q7w0$
i]e qy&$0A*N'eZd3em50/bpu@uX(nc狀.ݲNHMNf2Bul'u;^TLBSgLh&YsIgXe&weii	?%GftI%TduCԬ	]EOEOe-
9?_!/`45_^Ҹav6kQfHDpKs9rBPED.x$%ck)JU!xޔc֌_1!:\Em7<L	?mV8J}uyQ?(f) @I7sG$SFSI-K,`Iӛ&Awv~E-a3ڲ?	ÀՋ-6FCh t&鰼]eEd"lpM:p/6z#WNaܭN	*rs4]IYBq!î-臠i,">c!;UxiʣEY VO/EPON܊
LP@,Yl})tVF} (/U:jEtwj"`cKR4-7Jb`6OκGG`"P4/ӏ{'-}LxZ*%?uqRTmjˮr.@zˮ[oU	
oUcoUӲMm=[o&u7yi6mlSlS[I\`Z|2ͱl8RSm&=<r"}|{Xg+G-0w5~QˮT٣6jFv-j]\ʴB*#؝k(Qˮz"leW#aRonpױVvPnȸ}ruξ^HF95r'joM'mX
ks*Ux|\<+6cJ!ϡ HY 5u,?iPU(BT59hiT%4IDMT52?$N}6i<buWsd⎾ mƩB(l\M'/&.ŕRIl*T8Ȗhԓ]pgBe<(][NGS.ť0׺+TڌNf)owi"wLESdp0<}6H[2}~A_
U" )F+h@aܾ Z#H 0ޟ] zE0Jm@ZɎ/T+&4~h#@5u-Mx_a{0Tor@n[WVVxMKyғFKOXm	JoQ!pU@3x<0<4X0+)FRHg/@C?ֳDߨn<57g_=b>z dcXHKHhj9jQg kKH9;["B7UDua>³J8^:kǀ屡yT\kөJ lP
%n8G#!T&p{<
	C}_r\oു"  R$hǽ+ZtoF)[Cvw4c4}PvaL!AiaT^7dCJ!-%i/cY#V513¹a$r6Bv~F0 4WJ 4YcW4{}n੍zԘRc)[Uh0mc4h/IKX\%1e'* s*h-pH|f?Ê*rB"spB 0s!: ZNa#an-Or%"^zH+)p;	x!N_HbfHp
>$0a1gj_
%aN0ϲҮe,I<D3+A@SV/
Lޣ5ΰnR`k؇1MTՄ)REh*Vk	uv;|o	NcD5Ll8Z"c
Z]8	#%ƪMy;׬OKv<C
kvhr:>DsْUy@Y_0hNwdF;o^iah^Wo+ 
 
 `P"bHUj4xT9	1stW[Ds3Ч]q^_c#*3U_2d8	a9ߍAwNJ>|MJpY !\,Âc9+(JcׂЬGWSIC!uٿs^l:B;0枂KXR0?<`Ku>bcH4@ʋogBBcV6Ve@Y DG9sz.*l/;v	_9]Ig3u^h-)LT h >fx]V)<	+υ-dQdܱahô(,テA ,Hp8zO|ےR=Ǥe|Tc]5$Ցr{)	S[H=TGC&=d'JmFqOcG
1Fp`	$ߠ@\̆"L:E~09泊0Q)^bޠ>@=23A+nGhP+94hN "CoIzdڲTxz|]q_6 #	ɖ$	Ss|r|h"`Li-Rib#z%zQmjQ=i!(}Q1vP("/
{Kb&h 6ssl9@T9Ac)(T2(!(.ᚧo5HlhPmAf|@:065ЈUa.q1\/<n
N<A?^ʝ@?יu'^ j_'NwxP<6kQ=N{;0k*U!.ܗB?ҿ!&.jvY1	m		A:[Q+'i[K0%WR ̓0v{rR'=ۢOtQv cI*+VC#!C"nCSbA
Ǒ-	x ,HoHuG6Dgw$	J[~1maϏXɑ˅rcH%o6tmh%X49)9&(.K_AӶEpL.2ܺ	WO	1SJ5Bm{	`3Ɵd(OO/L+"6wT.QgA&v9XM0+R28v@Gfj/Q'M9iK0 +͜ _Ij. }޿dn	e,+W'xo?6X:SUjt#+@/dp\ Ҙʋ; ֤)i5Qx@ `##>I}H.TNBFaXB,%_SnP'_c5Sxj}2ܮD kVDeAKqk_|Bn;-(v./_("x$@5Ar,)f(EV sZQuSCa07	y؊t<@LCM[tp>%;gɘ¡Fp[zʎ2[A}bQadVxi⛠=.Sf_3m >\s|({o|sۓKh$pЇ&
g'/f;=,}zbKzLspWrl'mIT/7=[&:4G[]HqA忷]`!qڣ{lwѻ\>=u^XѭOi7f9ZzˊsAQzǯyT]NTl[Fwt*<w/ߘj J-D\ld="z54char(ĳ?m"ąUZ*UxÒKr-1|λ	cKS0OmSWR[Ↄhб(@Z L\c6yWwYs
kͻ*vO>R-86 VUm6jYc,2dq'BSM8SU+TQ[lX;X(CVZm>Ѵ#ZO4K;_	`I,%͈|R&1@|BBȁJ5-G/`SxN%Y~Ɠi6 Bء\͘Jadˢz&V뭝2g=	 031~Da@ N5R+[NҞ6rXr[És117ˠԁSRL7W"}UГ );ᜳDшvs@F\?qazG_'ǯ7|X=RPV~A: A%t6nh"	_!:x	q`	^KD:TQD~g,)4tO姑wLRO Dj6XjQB9D5APٺX]\dѣC3fT`-B=Q9 "
"ɽ[X_m<S9JziZ^XZ8%jmni@-Yի_}!ZaTqOǋػԪgcT`u
<FDń
 gjʭi*oy	
۴eJ-`SA[@~ >8Gp)AH\z(Zݏn`|bхӘ',u@>NQW*FB ULNFj]sYz*(A\"jYZ/RPg&ZF!"Nkًw;$ެ$Gs6j礓`:u*RJzOS4E2QI^,cIB[q,fCb')MV5>q\^|<3mKk-zoN?;AN+Ksux7jȖt)_TnY%wb}Ga[ 8Ҡ:Z;Td
;!
!]|g<q`
mlWWLEiD.GfAxpVtx^~i41BW~"LqޜLGՐ;b?qBnx@S$(}[A^)\.]s>&D8f,hx2KHr Y`0\K|{Uy^$0fOwz՘ 5HDXKLYt<@&q!֐n;rDat[qǲlׄSࡗ`%aIaɸzq2D}zuTc)Jm4Ax<oBh)"C^Y}I(eXAvL[ayiKݸa)6Ie6Zp̀)>37lX?afUb݂YƨtĤ0)1!r7򶓽uyuCZÍU5Jib~U9dK<Xyn<^
iF;#[r4лF'zJU+GR5k)*>yfFX<wȫܤ6<51ܧ`PÂŜՄaOpI ֍e0!2+މ\d2j hCҜ/ZEexK1x"H	@ώ$
A1F?m^c8#LEKϿ,jOa)êEv5w9!bow/A	LV4[D8.GOqjJjdryͧQ#1]D,a7]dW"&;ddMPYZJF&ɦNǏãEfTGp%ɝl^pȀ@(74k5F0Ro3i	u=(Qߟ?96dņ!AÚR`oY7OVWWg$5^3i4q~ IL2R!JMYnr;(DX~l/RrDy"Ё؂}m:lBt{w&#<trKˡCkJصXmź|վ˜̾5ad	%Gkx"{!^ըQߎXb#V;̤*6cŉyJ@E&3`!ᖳu#V~iɚzosw`+߼8wJFBjmufHf 	2t4?k e$à]ֿP	D?˥e'+ׂH1kZ ldPcL=M`bp9L_b HFDffPҡAv.s͵DszhLoQe,:dɬTI+N{XqI=BtR]_&#7r$B_X}kAX悼>{]8'u!(mR1 "~643P!5RZ2We|s:@p"&uIbޤҼrheŲG<VAmL ) U^J!;x81bvX1I25O	a*HW5lkR?$L` p^]6"{N7'KTLL ҂ڬvFB	e6B(anZG٦$rl6D~hh`9?5"NZr+071t&Y+{{,
P{	G2.3`RE[LJ8Fp5x!bsl.^'q.-'?AA{s}';[]tʀj+ŉkݲ8}D7!;֬ERӱ䚺IPIXk#d[,GQCai)ɭo9>mU?,Yh&~}y<ݵ2f yuSu/k,n\j
npE 9-#[>Ƹ/z#tmFkAʁTV#E.H(1peUxlcakK}r&	}g|5/H[rR2	PT޴c P!2[y=ӻ*3_`;re#l}˸LD`*WV(!j5]n(mZx_1Tؖ0w|{p},{acepl&dъ)SDFܧiD^TeM⦥CI1⥏20}cA);7#eZL`)MOJlmjl)/(%	l9]M	#my [ΚK6SXힼF<S}辦@"oLYyGZ:e?.rpq t!Iݶdg6P깸EJRy#-벖:PǇϞ\Y	QLzvX($ϒ2-rN׊gl5yII+XjV/. <Ow{Jݛth&	L@+JzF1>DD,!}WЖ~1i$Ԝ{(_װ>+{AslkÌkXtr\	˽n&7z8M@J@,"S"\&AqHC7ı>~G;;0z2e^$bq-fGa!K\ 	xgU͋?Q=+Sز\ƌJc

S	K{tvŁ/pz=Ϯ?_qW%yMW~Z:ibkSYy!unO^6YڱFtI3^lD.xkwJB#A<%&"/$$6:s߽/GE b \`GETOÖ.]LUOT
xxát#9IZiM;@R`8t~lZEz ͼaf|@D $ ) _Ǹ$ 'x^UN/
3N.UJ<,h?!Ƅ5)\{55%cM3TZJQD͢M(J)kbl4.;B. @#ļX7ZqG+X_/N..j+B[BK)<24b$aI1ku^_4(L֓W:ކepm276' e1f|?*٠.4'侄TX]]L!Ĵ_k짦9\8ATT~vP->_3D$eVd 4BOHz̸_cS.}6s[[Qs>N[=rK}E4$Ez]z݅_z9E%#bgO@>`DȚ	(E NyT%]ӱ	|`47ѥedzTZSuvꟍ|e,3^$8hb"o_o |'N(RI(95©\f,~%LedhVuMm?K /^lq.scm.в[ZBAh[l-XD#ĨL	B&˗VxO+p(pOGXLQ0f	h	,J/,b[ava`ԬƄF)̣*®@; ԻO&%,xBh1_9[OC1v:IDm@7ǲܰDR:JЎ^VA.Aޝ\OV#mxAr!љIL^w77|1rReE$԰H7C>xOC
HNPW[q>		F1ՔZ˗9Z7_vQdQ|)㻡 #@|iPƷdT8
0<SB+G Ƀ<xٲ0@D,Sb[b9/B=6K9^K>r33Qo>ƚU%Y6
ZqBM&Օ+S 7*bikG')N	F#P&'ƃr	V"5TRCO%OZ<{XZZ_;87>fgmty6O&5ӽx*̡~2k>Qyh@"2`j1Y:܎V7CNTäm71׾J&O6.Ƈ<9?תL2*KCh+7RLB,Ab Wn
w0ȢOtO%,hv`0OO3F
we=( (9&ɚQ:3me-ZoKSՃj"[;l=`!kt;,,6ơP(n3F6d"Ok"3mt5O/L	[A0@6\%m|ZVb
Ǎ ۧNZR;%j豑͐-i dm#seZYOYߖ뫙pRu1IB^!݃W-<{&!un0pAuIg),Y(K<<ߖQ洐|+aw<ogWz96Uǣh7[(V槗p	bPKukaL٩RYZ@չȰmQnQ :	մ&#0_ 
d&Y ui:lr?Z2+ℕ5(޻w	Q{E\AvKFَOP#enxBpTNLXf\7%$CHEMq8	;OPSH44h'RL}=_6"FC#hgů9ŁݥZoӓ{
`ц;1,ɵ us5jCw1eyq>N|}R <9qW%N!Qw#; 1W"ᰳZ?b֩*X9E4ֳcc1h*9(@4%`PK/sݙsZxnIfl.-eD:{lgR6',񜞸K<r Q.Pq0A%rL	"aB) #dکjҥaNV2F}Hu}%. jMnەLp%.ҽVM~
k6 7SĶ+U5zw!N]{TW20S0G(7<;|zyy@[
HipkejZsǣU
mUHir&J:+(g9SZ1F`,=g Wpx2كJC8E>:eV͟vQHϕXYKF7P9ppHi7ץl/*od4$isKiH z 0(##1:k^9M2
yH}]1 G"ʋ#*_Lnw=L +sPoA/ ˃`P2;{ń;dLpLRɬ8y
"DR{8p.mћ(Wm7:a\FC(U1m
F%OB-~R%{	k)[j*߂`X>sDbTM/w27Mm]*b|o	O#5k?lYF1ѿs.{6c\*j]hCfQ HGcX"tq~,c}kvGcYAaa2v,hX&$1^b$#}5ԞmOLbt\Cb;Cdqj?LG;60b!h/,4aݬK@\EYMݟfMGxNCi$OﻶI"]n|4[`Ù=3cc-г}4_q2b/wd
mS"	梏`&T)=(%I[vrigLf	(yGd\ 5[wgosƶ6%jq>-qk/0wd-þ+BtxE,CMCcWyUFHؾ"bAN KIPyLAf%9ä \C,KD;L.H-XONhpgwUE	Ae'7ٓe_Ͽ:iܤV&ՊSt?" *J4?YPƪ`ڣ$9-` =cZY!8ꗵTd_AhRنE+6 Ƥ8 `<Ҳ#|.EMsr0긣]~\L&؏ e?y}Y Z1MJh}xyCs*o@C;1
:bbjZpCBM6Gfq}9Sxă!|4I9sI-8[ʱ'=B)uA?7	2*224A@~ݭGݣŏN+Xȱn/+͘=<7$ԶZ<zy_n~:G2r+ċWC17/?}'1p=KF!20sL}>VF~C0ce^)_oQ-%0)0>pc7#W1;Z+#,А--@:lOiQw{I}t
}憎1I#A]^e=*/|5Gz"? _`hH,-lwg
s@>c^iڸb^/<m&W29;>hh6qBufh}G_=^XL֛ۨ ʠ^Cw^0=z\w)ƌ/$p1hA2J	䔶@+|҄3LRџqwP~u7c!5!~f7c!BSikgt笿6>6u|f{ϼ:
	 |_s/Qֿ+ʣ?D^/fء}n\ͯtRs&/<"{?ycmē z=FCVgxw#9ގ"Ɠy(c?QnlY-ucj}g  Wz}{% ~VBPm]%5QXhٙ2
xXo>ȶ{('e PH9м\?%K	l{~*A.L*U`ⱷ0MWF[P5296ٍ
H`H ,R7 ԨDs5k(lA 1Π@h\<Llfd2 =+TM}duK-e'73.e(2+n1Biud=
PgiLM5gbFܐ66"{
.6l֢ d֒	, Pv5qJq+UYTʍppAZK(	]JE*<kɘ埒
J7ly}vVlMBE#d'PY
2`1>w$G|O0@BEH3HՇl:ĄO#|
#|eFag! aAp6):LoOk:ZG}ǹbq0`60Ƙ4Z0be,cb*;9y{4%[G͓nddq	wOO]\]M{- 3k#q׳MDwNc{^qKv'/W:Iw0\+AD+(CDV+-.'#A`TV*Pv
ڋ[NS	#	m,nk;1 [@g>?ѣ񣳓;ǽ>+5&Sꇐ.|${)&`LP(1^6O98,qO>:0ѵO=yg~{}}w?9؟KF19yL	dMbIK/Ǣ	NchAdy][+T5!1O?loE}NUKJBLxMc	Ku\ #M``Evfג!]';d&0lvXSNJvUF40TtٸD~dLpn܋k܏7;Yz\r.׬U7O!ٛOҔ	Z%?]peUP~%A%5jt$"zF&vSŶ)݅-I dH?8`lkx ~2$0Ϙ%N8@옖ar+1֢Ks^PWSAah2\Ӯl!+$5HK  %~Ԁ^|f(!#|PLB?P*X))VJ._?zPKD櫱8zQ˿b=mjJͮv(Ibbw8,UC4O"@H=#&X'ēB\`'{&wQDι4xB1̓+z¸렘S>]]780Х8RC.L2o>n7ߐ=.MQTqNѭ wE(VPGa5뚋{ >'Ic'6ELx)fv:F_|1~2kfkYO-<rWM')wN6{c~ '"Ns&EL8ȜͰquֹXւ 0p7rO!? H]m45FUԢiSwJrӌH3Yq3YQ0pu'gۛ'/6XHw2XB"[o )0 <둻@O(WTĦW ڦ&"'J算>b2A?b[Q֯auYǉ;F蘸'H@X
ĽCb4I-QUo3J^Zv3Z6DDדbI>UӮ,I14(󷛻${5v0IAkJ3(ޙC0y-xsm;R;`X_^M#^0ΊR	zA=B`1cŮ9'Đ4:]V426M2xmf_0|4RBtݗ`qZYEw3#ieBw?#j)H;r`:+2L3/J]s 9SsOt&\SvGLkj39q#drzI}5
<a|~e򅷔(xir<ث\K%`7I9]}0	%3mm]\⋞7	FLȚ
(8. )vJZ0k#*Gn~?&4	0hjv_L,2<} '+bWu>v_mnxvHU3bg%+0f-ʨ.nEr2>Xk@#pwitec0)\
@IssVcqRoħ*ywH9$RoDc}>1C	aܼ8HgX:>k&|pҟ}sԍyo
.)gǐ]ֲ6p[BP7*MC
vw{ℙщz['d{s1 u
E.IjrʶOǧd|M&gV]m
XĻ0_aOtn[K>e`c"y]OYnT+MmB3Νx6.XFaGb'ϊTҶ'pZz,$quUPF\ E!&d`}|3KdÊT̏
s"*˺9N[L^m5#R=N|p?; 슢NkJc$Uk`y$@rƘ}Βͧ]\,W܁Ф͓byvn)YʦC,9.u:T*kp9?Tdn1p"p
Bk1@/ЫecJ.n-pBާKHu@K(ony*JyZQEu<]fE.Ot Q11P`@Eܔ1<h/GHH6Q_rQ;eQ<`.St<{
Nqu I# g+d veplIz43lP h){0k~LχX}l1on	3juE늒y.1T#+;oeU֒%4n1^Hz00b RcJdF|<(  
ʛD
5ǂ*G
M~kkkk}É$uUJ
03x}ba0,[/Bxc@Wc_ݷ.[xz"oM!Yݷ؎-߷yZ7Mų7MlSi$M	nL-ܛ&#MƏ4.kH\^CRH]8])asD%l>z{ݓ*Eˆ=#!e)h5Y:>USG.I[Q
ǹQ%p7Ҥ(p#b-d͜bɗ4wʽb<Ɏ?c!9OƄX*H#;7'۝S~ tX	0vMxV2Dlq\sV"1Kid q#>ÿ%4"t
Ҳ+q,p/fqd;Ct;<<1]rx|H,kE-eXMY;|O-m/)LJ^15>wjJfAr9bt ),9oD"z45&}۰T8FN D|R4\qqcfX5)kcV0]jos|5iْ-; -^ 1va:LW7RZ8\@4zOgM"c"/G*4R؁\{9wXuʸ{b0	%逐ׇ}A]g؊R5ZCWb'zX aQ7@bBN"3W33Y5l7X ?rJ{vńSqm%IFd+ocyc1KAHaxySK6*jrSρ8>'t]0g#܅OH݅#p	pP]-'QiV
S5VTwFgES+L"C	d(aZe/7wv;WG]ͭjŁcLSoeK0cQA9E6,fΌ{ŰƘu\NyMJܢKp V
bTQ?}ܷԎ{Uqiy+PKGb*KĕY7:/,qn,z	=9ޓ_b64ơIȣ	NA0Uy2tX%fǎ~K-s8֞10
_eGof̩CU)CpT@c$zbTR¾IT> շVL_2N:Zі?N-⺘tA3R.Y
p4,Ju;{2_yK<
8%ůf뮁O\2kn/Os@}F	7,g<xwۡ3d_g{8P_KhRQC'xقr"r9QŬHL;*J2[`eax<hF~1,s|!3K˔Ot2X+^k9*vTp;}YK#bтW 5ϊknK}t"lz=|Jd1AU-/a.x<.	`7T!WqjJ=v7 z4XyDsT6b<)Fu]Kv]MG0(
h\R!Ҡ7rpP4z]>=A]P;YBax#@ePj֭XB	j3^(৥$@4L>jf.n>mj{Լi
uaY_1|?,50jmv@f䨕l1]tEMll|; N,OLM1ٴ|RH>Vrbe2]P{\Y*STJI@/ϧ)MRuoA>^\*UO%
L9ֽ;xim{4<Lbu^\R0.NKS[[7`,Z̑OڴW;5EP韰HX#\cPK
3|ߠS}(lmx;r:N`n~jѤ` #?Węq~yF9s,̙Bf蘴z3qUq'g6'ӧOIGDd\I!=J(bJ*yyeQmzUvTv秈VNmȾ&H)e~C!<:
8,shZ:W|JoJ$|'<@D[&VYzaVJ)A.-s G kZlgfɂeO$CJoҽ(uÖÑ}	ǴLGKcȍGTm[ni鷿7}[s[1\O7ܐ;fV˕#?A6+Z%v֝)tSC9<,2'Gu5T0BSp:L^T<H,Pba4hvsNMu7-E?Xd+d<X=ռ 7 y\a{;dz/(V"F,wHNDeTQ!K,1C~PeA&vٯoq$JZR׸_
pRN\AaS}pr%+'ƺNCKJ«JOתS،/[c[U8|T|ysxr
;ki؈:u	zM}4〼d,p
#%~(6U%} ZdK	䷭"071b&z[ bs=p@jp}F[j=\AB;:]}mi?ub-Kv3F}ohsDl8m&cB.BK5v3vǎi֥5eao*xciŸ^bC@Tt73Gpnqr9ؼ-ND_R:ȏtQrd<J5_kA
hzNdш+Nyq'lefmœmi3YTɥrmu٫x('OQmQbZt`-X4SA>
51vS8Ic
 KtL(Aט.Dqs禠y`ީy	0Я.A`KЀY0XX;҇$5)=vZa;Ea&K^wޤQ(%j`Iw	g`oAbecr̄6
@QtZXe{S//&yӚjW(æ%% Erc$`Xq<)˻/N|we[ʦxsrEYW$?_B<1aa'	=)c:eͥpCwwQqYpAnf[+kD35.7w|{p},[!SZ}ΐ63~gisCхk^}|wcff/p$(whfewRŰ!DcJIguMk&@-ԴcY,$\j-l@QO&@n\,DSbxpt]? <4(ŪG54O)]dMӡp,ErM^T:H,6~WaY9#XlQݰI&K7x*gb+bJ<`a o [~kBY	с	,
Hp^,5	1$ xd@c]pcD]o ד0=vv.63ejT]r`+l74tIѾ+|Grߦ[6xMݎA)ǀ[<^s' 9ƅPeQn.v]M1:ƾ\=Wds}E)g0klCCOv3~N;kE<f7#!p3F`NrL(#<XUSޖyu&,<EEHN)*;dʞp1k袩fZ 1Z34XK\6N5*`&Ol w;JIB
BN>@.7	9B?FS%f A:POi||vM2UCppD
B^ed%B)vtA7K)9^l`#{}O=TIn-$z0[3	VX=<3~ Ih{b'rm^@w'D0t>5`<zP#\d5ZX
Tr7\$YxTnwE'CUE|=Y}Jڊ(^m(
l YRbUхqUY->	gЋ.%0>`O}s5nme	i"۽?Cֶ;^Ȭͧl6f<cTpV~Cabu%)Q<+$Xh9+뜱EiHC^H179ĉ7u"mȳL[3>=&o50ے`z|<e1!<:sbͫі"Cc`*jQ,ĚP2OGQDdkyqE֚
D9 Z	v{GhFdQ_H
QȲZ0eb n@:}hřDgQ/@97ɦmV*K&ܰ	#[v
tc(Ǽ2	%!%b
v*q#㺬,Q7ش2;
/xp@oY2HR-/tIi|e&%*Bf
<< 34!t|[uǟ}g/^I'6[ۏ^Toxj˩5wuCc~۔8-=!ą?gk/XB`^O KdF_s&:CUh!Fl߬fϳEؙoڞYg~?A?zGG6?o+jf}Y֪k.Eofc ي#{jFuD^Bf"d JR_9vau[BQ,鰙1u7)^ t0%t,PM	 P!kij(+I1RP{&˳tCLǑ k#
pfdq"}C|xNu:(r%n0wGBc apWdMc
@eBwq5BIp5*EGsG{e w&G䓞S,2Q1A2A~GuV"`9X`
EG|1`2A#\חtj/~4,{ %DLopfu1|AG
 +#~w^(	3$xeߋt}Zm[xvf5 7p.o|:\ sa@JY|r͇_4 (5^^KˋE~]R=ӔƆfxV6(n5яGW4hկ!u8^%LMw.L,sGߢ֝p?.'攐Qϧni9@qT4GmvxHJ9Ǻ0*Ȉ*~ѝ䱩R3dGTtsjYā4!c"I"	rqV(9;
mT0^MY)Aiz$H]ǠK:TD2%?
:7$_8/HO3EwZ~fh 
+zeI
*E6@!aHW rOa`@{ywzl}wy&p]N+Y=|sʍ9)&oL7,@
alW
 /oʆDbM		9Yd_{Tr%R/t$:dJԋE[CPuaڵ~'eND#+"'+BOf;Ru$kehL;e'n8l(Y'4* Vrguu5W>q39=ECMw~d<vR;FUPq>.vyЧ &7R;r3\U(3.E4m0ҠEI)axBOT/{{N=D3<PC헖%]9ym(ˋ!}D~P/'WؗC@HI&']nUJ*
cL̖/yGPFQd}TtF8{3Q|:$X YxWrmاnPrlcp+ƟL(Rs(hhܸ@?9*-9%T@\dBУ?)-
5!sரG*\f=p-tA)#Ƿ9GťQ 0Za_5Hc\)ɨO:&p .1<@.2jĽh%ypw}k`>*	mrw j6E/Ȫ@"V!80)>EqGE):5w<d-@c$.ƴvprsCօٓ{Êվct"~goѤg|Q)ôt%9[,`u$f		9+蒋+m!>ؓx"0+wH>ڰ4yQ5O~G5OᘳIyi2NУ(͝ LV-[=h@y ?)EMc5dY]9;Uu|	y+ 67Kc1moE!ݲXF싒n(Fi"Rawx$ArnFt
gHLyE^)ԜS"r{~'eŏSnmlq>J[F3ZьHO!b	uc.t08e#ᭂpfB-5416IZϞPtcɍ#)ldMTv,`ȵ냞(j}2_A4wl4hO>
4k+2 tQ0yL@wLC:ѡҒIYp`+nS[taA53dj&vڙuĖ L,649_-?gppb=4@Z{4j ܕuQ0xi':fW]K5`*GWN1b%g_cfSb=UL#a,K0NKlǗYYh*nOjd!`C]ƶ^_Hdbu{B@	"{)ùPch'VL^:iZ9r.;*yx! <!f*1RȖ_-KF%$3~AS=B8H+WV\wve*w!0th+ѱpyd׮}OU1f+ņys@.!5C>PvDUq_<oi[BzyhZ;a0(<lo!ڒUԕ}gOW?43	BbPc(KG[$IO@>#_aޟ}xR̰"-N~.rV֠{t\KX4t3[g K u'\ͩk|,Hgos~k똳)̺Z|Ot;a?~<f(@0ƐƽJ,J=1T?sqCWBI?GǦ@3<؅	(+'nfblD,sY02BHҲQ\ޜe!v0٠:"'Tcd^PϺ*ߟJaS._Ľu &BL#dD3PcwS
$~5ZPR8.ARb>N~cir%vh`2L(bN*]Ol.vBe{p兩#m NQ+g^=brtW} ly;Oy#Nggtӓt>$@(|Fs.Dc@ !BC:+)@0h%^et"0ƔGNrZ)I\!)mԭQB!|1yи-Foc8@4sV6p6 B9M'B3p.<GVb6vQ}*c,x!!Owz^OtBg$$
Sda)O=Gc-{Q>ǭ"M!fXw4F^SbJ}9
hQfH2y%1DOwurʊL'\A+T<%	93,Ejɖ,g/esX2Hq6#ta~U=*}<|6zDk!I>fn"[C5r0-/7'l 7Oon=NY)٩-Ny{dtl"*`YL0;*ɢ ?7zm sfB}EYt7_a;u/Ig"zA<cIQq8/'bIr*N0rwzx'VHt~C:*0~&$B`XyЃdD6[{p`lk,{G2*/-` xLBjRb#h^rTgzғ\eCl⤷ _g#GJgȶN% ç5GSc&Mې ZRkr1[C
-c DʬGz9J/F{gdyrr3d`$jjInV !CP@P0=ܾ"CX!+)2@qr*^1d+*ޘ&zWu,kʪ9}ELDBLhU
76xT.aE-jJJLeRwR<Nї;]h󍤖"=xJ&ߗ
fƭnb ]ai^>AԚ /CSdq̶;3){#~fRZֆ~I҅Ƅ#o1B5bV2PZqj.fr<NcwE4"o#&NaΚHD(^^[@?- !0ޅ;AkPJYӷ7;wV)$3V,9]K?4\
OdZٮ_DI*~76iIo]I{HY~.Fn>?;6Ҵs`isO$Y'\C3
QB_;ͼ#NPbe\8S*jpW?qJMtMYIj.7EP܂0`)^nIt-vFno0|U7b'[E42z~%9Itq鄚
J0>$ҡJ@!J˸&şkDSgq<|p$w(vOhfε3ewks'/v9fa@槽ޡ_;:ho1:Aϲ/9&iFN-=HЀt:0W~VenaLZEDEDoхD?3.	7gheOg
6qW."lU+5ǧKWM9$gZztI?h6F9>Ohsxsd`4ǧ@6upѵ<9z7ǧe9(>.mwx<=5'柊n;9>17ws}*	rWUDkToS!0)`m=<٣Sq,`K?<$ԧbV>z[b#yTM5rǴ6d`7RMTWԩ1ǌp |ᜢsAZJw+oS{)O9'tp2P]
$GA,BSq+8DNFD"1pՎ20LK%Ic@l(7V(%:~J1kTٗ6}x@ۀj
#*&$\S&ʶoۦܯ(I_VH\w=_[{sHNG獨j!S{ɇ5m1g:MY$G+n3cwo$ZfK*
+Ȋ-/J(HEvU	L(Xa`p8jib\0VnH)Ѐv^>2<|5G֕pbYJw,=r"ㅳ_NߘAG܂9MFa^*rOS°I90ra%.ylW]DN؎Ok=S	?0gyz[,W'ʕ]71!#nDͲ&rr2F{:`č9t]9RUMm\^|qO~;|sNJ{pR`sςrԥp`X Ԩv=H6(0292vI$x& BI|J`IgsygrN\!zr7*WVj~pviث3i%w "}gD^sMINdS!ѵwwrz꾝|ۇSz!HՌy[BYOw"ӳ6^:ZxX"hò=V%$T0#Ə_~r.WqaŃ> մN3LVYPWϰ~rvl\,-IaDAaqDr3yL(.,R=UsxTZ307$wG}xtrg"pj6C~45_oQ15v܃Ѧ'mu nEF>Ջ]>6"AVӹ^ԘwJˬ->:x^u %J@>j\ō=v1,f@[I*/f/>2//	~Gg
Cj|u۬37RVLضr~H(H?[z~Mz:K|DY[ߔ|A,nVbüP'wNڪ?d{rhrY*AQ&8Mrb$I|d΄/ɚДQ֓r+(Hq(g)e+,qs}#DS% Y^⿛*PF>֑yEnw2q"Eea8Ǣ$A1Pbx9@t+0PA5fjEجϐCa'5`L]p,mී蓜#>m3@L(Rbmh#{ @j`V=G{!%yjm6'L9r}Y`1n^"LQZvp<ϵYAc(F]") Q$6خSA/3IeJ٫7;tGiG:e<LstDn5XQb`bLXZqYr2+Nô9Qp^Ln@q$YGL4s		25r-_j$
5^ 9*ȿji]d5~ё)vF_37MDmp4$s=vgW,rB{^o˴ҙБ|P]:Fyn,܆Lvlv꦳D';l:98J]OغhK{-gK^HĂ"6M5\.CN.80|DB g'`jV.
*Z
CŴ?hJByeVB/xhR9=kI̭2BNb1&	#JP[(>$jpS_r4Xkbc\ib̂5{OF9Iү}}t#Fx3e]wӔƇS`$[iXޤc=QvD2d9nHg/%y]Z*_CDɤqe-Ma[o``#E;LLFt
jɧكSW2Wv
G>2/҈1ǀ
5%qd2^4$0[Hl` 6GTbći'@+L?Kb94b_e8^C$]XtC&g\ ?64G))%Hle=x7#|{	ϑ@iL)Ba>5?{h,8'Ær}Tߝ8Em"X_"/Y"urKUYՒ?h%q 4G\/XYq-vcQNߥPwd1j
Xufl!ys\S4g9̽x8K1{ݽY'RX?oeyO+5GUTe^Y0򰀑SQ
:,`PMAt] )OL鳗d`I]sMZ.-`?-^CUy%h|*6 .SP]%PtZ/yQ=%
2"@S.x>ھ&/8V.N'd{	3_ ~*d&^]XBBXڛN[ID-;S.Fhp0`E\ѽ1`.ͣO=ɳq^e/GE	Js@Ŭqx=1w={uĴs
4#-Z=O\jqNxk=VSp5{8K:ɮB:A|WW]vus67SfdR]qlp^;ɰcLϫAsb%#>
etE24	Xzr3.7CR	b5Q*X2' 	./5,d%ꤙ1#=7T9lj>âP.S&r6UV7k*:IO7t`hXBgO}"Tq(4j'X9[hR`)9\jT8EpS=Y2~ւ|yH.}A!`^JNJ8*g]~dg'>:v"L(SMehQDT~%cChe<N"ҟMgAx,.n,h^,ގl׳ˑ)ݵhoXjigwTHiKm9@<¿9v}6q˩'9d	XqЇ1o.x;TmNTƥ[-~a<Cգ)?}>1+qTŖPU d;6&Г/yJ^~r^ցĥlT>X1єqˉ+N])atx9qL&yEsލ_LoD+wl.HCg7*<Ш..`HPkǂ}7zC<]OHFcpVOV{ uLcE"BϘ'_7S3j<Sٌyi,
4Uډ	9u:PVkk
c;ædR
p0X|hiuI-Y5P],rkr9&QSQj7pP%qf/V ܗiJqw"%C# N1e! {M/~w1-cT^BgVŲ°K
àoTBnThq}$(ɒ+4\tX=)%=wtQbݩP:耷YMլ:%j};(˾=Ήj><E碑8DwʩM
aT[ijtiJt+ukӨ-%Vd5A՝x&CfN\e~pjJokG"=!1=PR'Z佉+A)zEP:$MaŠdvAA\}q\p[D_$M2K򵃲\vaZ`ѡ?mY/3|,0Ӧ=})Wdb߄ҏǸm4xwlIJZtOt\wޫe?4k7pp{QZ atp:M4\$iNhJ7u=ߣiKCRY|`gbOew^49)OeϺmIEeO=h5,,23?EV@jX?:p+!#b('q<ԙ:=5fC"jjfˇAh>_,aY9;L'}uZ`Pea͕vtFuuc(Ѭ&Я%vKPHfF;܋=nt]܃6%(7D:a+3 ܓqʩkXvap.hŎ5<l\q_ݽF`	R+M""Ha	a(4L4yͥLgc'7a,8]HaoHw|_պ[Th76blhO5Iw,g;@ԥErHf0^kӇ4vˇb></PxA=AOcEG,-^`"S_rsn&JiNO:Uhv*]LIB"N= |#)][0/iqyx;ée[U?GabWkUzvbC,ƪW~"O~BdqTΚ,3p80|%'ﾝ\}ٜ#oX;|j<Od`d,"?({&.ZQVIëxxNC~q=dZޙ1 -6XLM}9 @6U3]эp90oܱ]:y7(/nR#?sGf˶6h,nI5!K38dAڳ|Ps΍l=[Bx~7{g4h% Z˽N?4V2\oäAK#U	PR|.Ό4	 .KAsGe>fzGJ2(*t^!!^|OJg=ub^N%XQmAsH(WP
Jj* xSīy[{։̉tr~W|cad$'-hCdz%a^3wuVhB~M4]ݛ^N>N/X{.wcKMr\ceB?TpWrm (.*uNhP,)2s9ۖ˛q	٨(69ôV31z4ip'@"1IRx5.L7C1[YI.$^$q
PSZJQ]>.1}cKqWܣҺ&FN[RIJMhWG9x.CtxX=.|tMz^.r؂GAH㚹^9/dcxGTjP 뛓gzw.	0S.?"J߈֟nC,j:p2OQEmg'ׄ!4f&e?PR NqLM=r\zS悀wU |ECь[$f_!q8WIIl])T隶uaA *a̱ZFݘ_z>Jg燖DsI{:z\h65/4)ܽֲW.??G x|)ң؆Va@U_v0"BNƄBzq
rytq]HM	n
~AۤruCiKM%iIgMn-"D,bL>[U4~`/$>:EvMjyr5iѸ@'|IIp$`ȟZ	P{,+ϟZ׬*G۶LhB_Ca`W,.crף!cH^JM- ,5rʩ0E;Z'&艢f`.m|_fpq!SC+Ba<Ik#HƍUpO S18&K/kmDʶxXxd@j]bV_ngͬ(lp۠&&䍾ҘgNH56e;7}2tbRWF,mmsLE)#~sF=i1aFdhkUs?Ǆo'D0?$48{qm	yCY~o6KoIKĂ/CO}OzPi l&HEY(%7Tq&r'^U0g {h}u4[	29v +24`Č$ț~Lgo7w5lf C9pMvC- eьpB^<g#h譬z$ů7gFl
#>B(tn5d3CfuzxcChl/U>F]+Ǯ\)ηF6,U|,T{6ڶ[ ˳R@f?PEr'Ǽ<%rDmX,s#*op-ǝzl5b23i%V?34v&O?F$-PQ6^'LA+DFy
M:	@Z~i$&9t"Sl3!%obM?ބ4EɷB<tyo4liO϶crRe|ֻwݞᜭ0c2!,K<w34va9!ѵX"Zpvd3'^&`1JRl=-URXA d:@|Ě׼ecNa`6w.o"Psr,ͳB<'֮?6Is|PAlCruK=jC;ۓ420)ԘR_a[T9"ج>( X*diI
#[	
8Q!Nk>wj~c.ť1ŲQ69IF)!*\MҰL#>@B| 'l;%r4 I	X0N,ol|(E@aa-
`s\v~,{a=ۉD lG!O!4\)\/P񇂢X5i畴Ӑ*P65O!ڃ"6^f]v'/oNu%w}2ŝ5FsΘ8̅)ʉcޢ}	x9C:lZB(tL޹3bViJY-n^f<-1U#	ćXm"Z5NcHg(c^%DpUT"UJd	jn"[MU-y~l~$s"޷E$X\:DEqЂV^4$Vă^Q\G ZΡU*u^h\AJ2\1"Xsӥ`0'H4m@^vz7U$7 N٭@ҋYVdl7EF#==@]5"H94gƹR&I)6c6bD/96:j|+j#xcIsk&ˈlgE]Lk/r96,Ec`FE$ ٸiI1X%:c&9m51k}	}p{/G258}0 /qJҁLͲׄK1sD>!L9N|e$җ(AO6H޸X{w_'(obRͮPv{+>1"M,]Z@}`n'fۆ[5`":ݼ`^:MBMמu|u9̎TӦYEu,zF+@P 2Tو<@}cwZT%S+ pZh͑s%lw=L{T15-Xa&PN-/(1\=B)CjCF.RF3LQ;]tԉ-nzp..uFhܬS>͢`i3#BE76d  .r8yjuXsۡ4fJK49sЂ1C4pfi	1#[.pG~[)_g|+>q1X4dC)yUD0fA>d9|+n1࿦Pklvg46>+]Ӊ@8	/VdTYhk{\rxieƥ;Cp0!rf0.f)<^yy@M7sC|[yf%pڶ"xʋbwuR2'L{segOҥVߐY7XOq?{2MMmI(]٤un>	<An֢@b QtqȬ, syhʹ	*q}؍Q<6MuZE8Q ֣l?0R3@hԳxAB
՞bQ\z;?$[2 |SNԢo3zgh36})KҍJ='ofM]᳕p]ika&~jkw)UwL'9e6s :~2\@-7hJӄy\\iT;p Xdvsxt8|Bq´(uXIG	r
".hIY-сg+͊}kGAĎp`[<FMAQ'b[{;T:`ÄaZ)EQ݆Hd*~Cը9~@PRE% oIKd'mtsY@ƑR=L{J59yEo "KjQڮ7pT͍a`VRibZOIAÆUXr.TspW\eWs$P+@a-k<H3ru11m!H`^X E.?#uQ;
IHZaõODNPO U6B
(uog,)`#!_,	&R峠ҋ%J~0s<fTOMCy
ɪD=[,O󏗐=|9taq;9~wU(8·p8QU\zCC4
5-G_wOR Ձپ%㱋&@5ߞ"&MƸbP&*~>+I A,T$	Tc}?nRjJ:wRJ=\9Vg5JڛI{\ozk͌oR*xWo_!1ͱpNU+o6g+ ڹNVt{2 lvEwg7`FnQCigۉP`{oON/z'mo]QqKˏb l;I $mи!i&.y1Zv#xhmq|xʛ X˞NVǃW@lYmO\xG+GM>-Ŋ9,K>cU)Yu.?lX+`UG~}/ߥ>ZK%źz !#_7=27nTSaл<qNIujH:^iIw9~ՀGtO~w:#;h.'mlds#9ݼ b
9{ >K#|fB_~,'%$!i*'<8湽@	=\R=KK	 K{~O/ЍYG/<o!E_`.,
_2fnهjCxLI`Zv:^V?!l&S,MD<4Z*ҫ9\ǿ>4P(HU?9tO{gg^!4h'Miҳy1䳙ZOT 1d+6$)?/PxAP'6hANˆ<!'1i ǂz7։n#qA L)2~k97_Db
*q+@xnRUsL^YSH+4@l}X+l zm04-;њVzu
f&U^G`\E:Z^RO 'V6`7gUc4å*8Pl݅pVBeV{8e^Y~\8jq^c\=ײ? dI}`tmjTaGT
9QP[sRH0ߓOD4$x1D<p$C;\_Y^qlpz?8>:p}	>N,+T몈9F07l~(Ns4kCsQ4EHʠi~[`}>eUZ{NܡRޅI VN9JL<4FfwFev&̇"!m0i $V  0i&¤T4N6*sd[2kU5B?\6/"&yJ!4)f%)U$hш&݄崓m:t7a+{^b/dIpXP{sՈEpВu5KRHPGq~=fIvs7-C\_Q9BR81eco4 mE/,in"G+Tܮkfꂥ(gaVUuic={UF1}rm	Vf^ЎIRM\(OJb;[Nve.F>v+iN(`
z80ӷ!2oʗ>\v,bL,f!=?L2
_`A5*f04[˙ ,"X|L; |MFsO1z9|{{Q0$wrj4.w}|{3nvzSkj.dۥ}lȾ^Kaa%.D4Gw@hXie1c 8Xi:e3F r8|/P\0&1,;/4_kva*[l,Q ZBO\bG kwNqB[+K,zX-4vˌbPYl;;tǔuZF`&F{j 2R`nBT&U7q@O"0M<#LgXW4:͡-(,,|5^{hX$/Y˺drː huy 7rt[aט. a0)b.jJR-iEĴ<N|OϜ	K?ugC#nv4	3
֓5:/X]2b@aA KL)3h5`ӽ'-ٖP-A)
,w\NnBŒ'Dd}xzV6wcw:9tSC
;h,!"A_-j9Ľ|Xin0"hg~w9xLjـ++gwUD, O%8*907.L-͜rtD1Q#l|,n)D/I|!܀ 8)<pJ6	P5Z0cR`%Mٚl4"HqV/ory|q
IĖ]P-$ã^GF7SwQV@}YU'VbL)fm̢p։YևL6a,`v_-rq@&`/=
)%s~K~_i.?kڲu2ҌbG33kƑ:-
" <c .1E$ܑeҞNu&(ħkHa*Vl`D4GE[\;dF8gNkmc;^j0P
*2S76w;RSeN򣚽\mԡSBTplq_;_uKjx~TחϞtqh=	H.5~vRCe
jJ2&6١oĐi%+'QQxu$T1U&*0=3 `/=;7ybpw_zy/8٥QY17n@]	e1j.,$La17ɀ(RC#܉})h]!+VEuaj7bZ*@z*E`XǍ(ghGf5C8Bf#ذ˝~O[ƽnL2tQFn́kp^ǁNO|Ű)&qc})E;vո.oc>c˸:hF&7	;aȽY835@kX(0"C+65RW,7Á&%H-.:;Os06P|[͡3P!Zaܻ4n￺r_|#ͷ^([<_;׳d<׾4mZ[!kNW謶C;ᛰ^{P$_^;<|͛WX>;9>o}f=3mЄq.*Pi]L>`9pB.eZ9p.U+u~clIKnӛoW[՛ xwУuLy[Ӵ	Ɉ\r¼
60ߌB^$6*M"LSMsJ/碶HgzAϧB؟{oߜH7FFH,j9	'Ljs¢۫puas[eNTH
evnE~rL9)	`5Y箵aI>?9pKb(..pPdu6B;*3iYs`tyڃ1@_góY(9Gx`ҥ||BPXTԴ#mZ i Cޞ!s;9s/uXX'"&Ix҇:Z5pІhxҒYC$?%uk:~,Œڨ9͑w|f^nǯi\3'1@nX\wN>7ܪPzNa}ĂW7`ިe}^,9qU37
cΜ	s2D]f=dZ㾻aBQq J!0v5	BNYrϴj QMM_(0Q-mnۛ~d)qRR"a/*` ;LSqӣf& ^+CpAڎEqрl_*w7}8% ]tҶa .Teeq_{T7IY>e rht
jv&g7_6h,aª<%n"iI"8"$TT3e[>_rmQG7"I4:`<#{SuQ[ֺ.$Ζ.6+wYIhNn	$?a%BۅmŬu	\&*zX r!өWgeLej
rrNB;]p6Κ+np`Qۃ㵞!1ϛb2" 5U80O۵"j@Spͪۃk/ ͰK62X5S}u'C=cH'xӑN74Hׇ]{ӣq7Cns.,3&v S`5=>I%	P#EoNcQLW؀
}֜n-Eym,3eCfKN4Ep0kY[MMJVx0dj$.q2x
+Va,Y)c'
@jDդ~y	X07M+	WW
\^z0s,^yzGeP)"ӖK!A]PiD9/@<'x=U($h|*KwϢ4b|J__NDw/Oa/[ѾJybdKyd=ɦD4b3UB_ԍoQ+3_TZ~ozoK骖0/l0
1OndaU(Aog''S6W@Ү k<IKsFO[G\FAԝ]B<n lQR֎R] R w.~,V;RJ
a>dV/u<	dm)u_MldVǑRTBawHp=R^@I)c 4,9),YFk >D<G,vߟȩ[p7,ݏ"">*2,H/Df?N@8d(JIY1nfG2o~-@I4mbP^P,+fZ밿r2YxHby]1BR#TʤNm_~ZP]AYj*
+E*?]f<h)[	q(QBH/!~HDp(u"μ6WG_^!r+ɇa׼Kvڭ.wgIVǹHv'T|nGp$8qbӄ)-5:`]qGNrFu&eajY0JEJh-fGyGSYH	G.Bw/v|D)rLT,_b3N.{)M`u§xp&F>&B'b(K_	x.8gZ4Rbn){Ҍ0iB*)?8jJ1oU]@{TA!%W@sb^_ `ԁs]֠,Hs0B4zOgt<|=C]-oACYFc>6WQa~h2	U=0D}@9.lB่^]*"JjM_㨳;Y+n Ǥ?$
KUCL DU<ʑ,& cqV\IDfE$+l@VMg;%c_tj2;,Bb5 mp8TSØ-jB+"*1 QܔrbM*FҡkdДfS@e*._L% PT;b)wp01 
˭ˡյ-HZ9
qrinY؍ٖ{SS~Fއ7
դoad^f/:/ϯz}e|?m8)ХXuS	.!M'GçlVB(lCi(8B 1ZJ̰8ʌ5,`B \!1=0"cxVʐB@fߝ YD>=ЖFccJ3ȃHWoQW=cYT+Pŵ[ȰOVf?'cpfT؉o>C-K؃I׈}RC[|s9:~TnxanGR~Imqcf;'xol $q!Lm`noMTDJQ @{
3C=:§Vs"b6،>kV5?PM1)/{/k8_%:;д!.VW޳'{OlD):"mp/bC[v.%`x/j/CKݣML#fJ>؛/h[XKKI{	+
u*S(ķ9-c:^NtkSDk &0x,NU7w_۷*@?g`@0pUINʶwjvMS	wG[ۊmh	$?]l'0w$A L?H'}0
8JdPQ C	k;XюB qV?n5cM3z_k_	Ax 0.v7;N;줤mGY˿u>N;IvN?y}|\U(\l|OiFּ&-٧M$w6!-ӈ7&Q׌_<^Ә\xT|*i6۰5zmD>yAyى^KPQ00c[[pӷcxG.8V]_w]E/ zc}B*Kۻ#A-{K6'plcYGNs|I0P!8-Upr!Y?[f><hq:$>~]\-yv_zfyȍ{k`:$!fĤ&u'c{mpx-(:&A/?<<_x#pgL4	"Y#N#?{K
7I۴wnRņӝU*n5@Xh~?,U)<(B@~,T?P(Kb9C1Dҥ(:E`2=Ox$З~7hӿ0l'vbI1B)]q7^W1SNERr4yTzHK,izn[7![  m֙q
BҁK<=jC>$X423Yl\< (0?]'	xI=	x,% ;	+m%5BnPɘulA(J,
6&ZmI"
\Zgu+HVp>YT=p	O:$aCzU<6WO馥F'\PWcȵȎLZfEIb9qkC1'6w
e	JQ< _~F{t4$;`?ZC:$V0UTjljE9'^O&AX)gnhBn)Q)Ia{[<y'j0E_S1f&{Ytgz[7+J?X7N7Z:J_X*
ړ@NxYNn-6k2lh"^F֑i#RMO匤`	1Ih6+ĩoVKBu6Z%P8:[͵lZ|\Z\d2.K.D"Hm6ALZ[ݳ-{WW:N=ɠ0ySFH
ޔĆjE}MeJfVT~gЁF3Z·h X<bBL nS'wRTn-\wp"{Bz!Vk5(͎#Jn	1a*?mw48若|_S"hj02r\o5I"l8N/LY*'`uAÄdT7~.L	bBtԎ`KF9zU5l;37=)P:@}vN&
ȯ*/n#0ݾ we>z#9-LD-x7GӽEnpprgYLg1xMO(ƑcG`Ch9 bѕRXC`irGq`*;vד.sXe|M ,ATLх :l=r,Q/8¢|P=j߲
{bSHp# oΏ:}{!1U@vw*}/0<7Y|'D {J2sNl.°üӐ8ZZJ.9_s0$ ؜L
rۡ}!vLdSrP&(bi[mdHWW~$k#A/30yTt<1Ri5j)9@@J
z$@a.nfGd'f4*ֿ፥vF;d;J>!(ZSyH8';8
BBD'x0BK`nx,JBU&&RQЈ{6(7IJ=Beaw,	>c (yq.؍ԒG^(GwHY zȝf0:&6=$.PkdӋZD5BT\R"͚3KڜA)JXcx_K;Sdnq5s!B彐U$qFEf5e1
Z:nJm(bZ(6x1+ D/,ޛ홬Jǳ!Q%!4-45	Ɛ`ឲ`;`  n <fnÙi;پO4":?Y x9=|A}xf<&.tw/nE_̎ _"X*]㭘P
CB,d*geѳʔE1g~l:֪;"z$QŖj6-T:HJL5,_C+խ-NtP6IH
"FjCɋ+>^N|/bC<6gd(1(r@*κцl^BpNU$Dn)+Ux9{L9⃀Tg&>aeSGIr_>$.ä߱D?xfP{@uL]%f2Nr/RöȍqH4bCh/;%38ܜr&j>#p?pt~20Jٛ/* tSZC)5%~n	;&貀ӳuhl*%I	oJMW܅:nxI1օ}5&$\#Ǹ 
yOEb0n慣e®ЀU˭a\a^R`[JٙK!S0k-L+<fAгD(Ӱ61@-oB{|)q6A I0 :b'?YC6W%)rf$ɵ*vr^?C=3afYH	Q@y!Zw✕ȶ߹.U'	O밞[ɷ䰜SțPC9C>H#lxFQ 'LcV_p$]Gk 1cj?$P,B}w t=i4bKAwKW3LQgND̵Ej|Puo>zB5iA?خzٔeȭ%Jqph苊Kc~v@iʶu3Fe0^YIV^^yyy2} +هvwײِ9)6%AiO$)\[Iy(U%	uN(UFK'tgFFt{9f<9vc=>sWDp-n3Ϊ>0τ%+.VP"@hGe#C4GHH:I,ZqZPwa^bҗ+<^liGJJwrUDѓk娤`tmD,ڻ$ץ:]ѣZF	]nL3NNu-j|\Njrj&cP7v+:inVQh9a Rv
T0'%svn*bu3-%ĈfII/?߽hH-B񯇽^/.#BAQ=~ 8cu{\0]+>_6ʗeÂ,6B5A)$BGΥ`4b/(jJ35)`py8^IїEݑ(m3*DhNi7$?Ay!ETO *K.;{.lÎ'R	pa0Dkd7qxbYԳtQ0LqT^cdr@Om>ObtF,|^)if܁l^&fK5"1Ħ<2/7oeYrqu#~k#{]շ/R!w$N+i&ؠ_Ҁxr*W3Zrf=nN0š` f~3Yut@:9"I%*A
Q@MhS
~,M,@%Q2<`,XLzvϑ`)t]Oqʧ%%:Mn3-WU*l\+V	LY1-<rpvc@c2M*)EAl6nڬYD,oPDwedP؜É⯣RDSx{݈f!ΠInrxd$ɾhɵ8= &iyO]~FmF:MTr,m*t8mF
#\M4>Jx	 .lS1pr`$̼iLಹ$?	df#}E_e&cL^pTC9?:PrfQaDurG /QT㖵#G<#	E;C..EV	%ylNyjX	hrKq
 wx(~ ,H9e⠦a=|t+.WdDDT~Gjqݤ#}JM8q8Bj6uQ'x@r4ɡXQp %EՑqW<f:	efVVCiLn=äUЪ5yؔ6,Oچk퇛҄njY|*𼬦7kDAz@&F(Y3@I w<XO8Ψ$H\7>D#@$v7EK4kPuTPb\YDSV$%-jSLo~5y0=
^^rxŀiCea3xwV .d\8H&N)#b=;y E(x)(r4Ff rrHe7弚a^&"KVzAY>s; JlHQiY[fT֝D.PCmxǄ˒C-O,?%k.)KMq[>ޝPc˗14p?\Ah0ZY"ȸ\App)A>σ\U@~(&ALF#*e.˦h:ҽ1YJusY{ <ނis;KSu0A/7Τ:h̍TZ'1_"̩oB#kzFnKqjw2Tf~yLPI=\T'+^LRkMĻy:Br2'ﺪp*ݳCGyNa#ֳN03.d7Yjw(+^lu[	h}/a^vп
UCW<le^8hYj}7a-.|tV4tV B(?II0;\|-bǸs1\QڊF0BI98
(0jp1g
4ZRpῶiij9r0dmz8*{Hae@̍uݘQ	nĸn$ S}w
e`+3NS}CoR}[3,&jL]Nj,!Ӱ񶜳S YKm0AhL1jw#MSԏ{sE4S綪2<o{<9@"<xဥ\IpŚ2`TNbhO)g6՟vؓ#5i^LjLJ*VT][<$$ҡ'3͞|YyJf(\Ml\y[Y cFedꙖկ%0[Ua;mQA-XÚ2 phAS\zt@B2Dr!@\
F |_kNBm&bz"%6CxbdNˍÄ.tlRAT&xsTP+$2vd,V]^#NRD͆.x6=a|60*RALBel՗nU=ٶ[foqJ!Emm2V &)HQbϖ %C5VV=F<ji1B/NW:ITC`a K.Sh)O$Z8%ZH8%ޕ0t#JBNZPsYiekiશL+&GVht1\R&cdAlpz?8>]oDtXEy_	r1KOK8$YVKyz>F93h}3+Ei?g;SOcD[24( ,0%QrP!]	upRfUarvP٬0rj_¥ƃJd
4tO	T	2mS^TY5T)\Cb\խU UqM[p4b́ѝVc)\G1.ujx`dRZ2U7{I9o#1o HxP /Dq	D]\c6n-[kre[+Rjv"=6ȥ-Z؊r+&BaPcW&גj>9lI;(s6s}8^kr0/C"pfkvh/"&ٌTvLَL"ONNF`U-3=;vtusk%׊)kGvo9#o ۜ|$8$*d+!R@A}v2Zdh8r}wl$|5$4<mϔy=CTTY yɇ)Uw3,֎X4p"9^pBtN5̓a GW5CHPv,l		lK
4x+Lh"/"M0YZWfPG;BN!79	C»%G	#&{趺9kn]NI>'5 jwtۈhul?f3Kݜ`xULI0
:G=u\6q	]%,e w
ăqm(IO417!SPp#/uTd{4Y"#L=Fh~|>Dc6%4wбD80Lq<쓊E;La	'j:I cC9l(rYw~-%L4nlm?
=0+-lSc}[{)Re1(v;imq{ŎG*ĥV
i)k"Nnz~V&K I8Wl	MGtNێְ
#pZ`-oWEY/ l[}O|(~dF0؇ʁc0kvYW ~TY\}ĀB͢PmAa;
ݽZGUUgvCw9-7Ф'"QZ	6*-hSQ`+&*	ju
6'~l$O Ŕڊ1wnOqZ5ޠwzt?<K}lBp'4}U<)f"jpG2TҒm(5SdD7v,']`sǬ)X@0Rza}J$>)%vd~!XfP
ȸW!YشY':"1Ɠ:F&1`#gHEM<Q䜮%Xj$>2R;{?INw-!(4M	؊RTXƄ*zqNtZBNAm	\t{}^_
+`yy$7eq\{+_)Qv\>$a@K\p:l;'GWb=c*_# 5rs,(%p<j\ңBnhJ9D̤.c;n(u}r+c?m!^>0޸*EZqH\^ivo#p-à	2ׁhMY%n-?.n|/`gڡ߇á
ЂozUA_i#\c
\^/"&D]qnprSKLCEJ/WxU84!_ ႼޝÆqhLpq2K_35O.]>Y
 ,Vh;	#T,mcG)##Q)v6I+yHpZ;hqTv[ؗ(%; 
@\cO$udv h11@x:"6/l*!L6^[-%!Ն#'8~@CIoKGشD4d0洍hwЂARÄ={sTjRaR"Նv5Q9e r(gZ@EOSXrt(vё8Vf"+
>s!̲oV_c߰k!r1-VfL
>_n	IF߼ᥲiXT|5
!tH% |,Z7ybF9m	6#awZ2:.e8+%PZ&6b!6s6?8ԌLncS[W>N`baVӞ-׺;J4gc[pǁZ5ʮ5_2mִdп!<m Fm-K($!|Ul?Ҕ>"\ݏ1\VLg[i1x; ĬTs?ޱT	|oъpE~ٺ&4	\H!y=;yE?|3*yF X |aQ
X@o%+`QP:#ŏ@F!ΞBū{
tx/,.LgO?S+}yO~c=(c隯w?g_ewA}D-v 
7]j.|G)1Uf-ׅG-b.޵ݜaHU[fD9҆eo>s?|35R8*Qh%w)Br)-%3\i{{_961~:C'Ȃ
#sB"#߅nX1YU-abOEzQ_Nc櫺%iq¤OT.-љ3[
p;>Tw	o@H+}+I*	l3Z3ꖘ48 QJw3.d&k^X:K&6Sķkx^wxjO4e:#n޵/zgL6vR2`0l jV> (u_Wm)BRt]NFYHEui1XrPCrjB*Ԭwa/gp	Q,1aG`)$^B{6m`[PV]KƱH=GUj2YfZTLes|o6 8>XN8׫"xWN?6Y.kY5)KtQszBA5xqwA@*.q|0o.|{E[λA#=$2'g3+V[Ab-r7bC"f~ xzu+|>PJ+jZ+@6.i5Ob2Ya%2^>1q#w)u3|"gvsxǲ`<c(6^^91jKHؾZjIh{(tcL5N[2#"yW9f9֎縵%&ZpQDU!MΡٖh|;rA S&^ԋ:Ad' D6
ߓOWO4g'gY>g)17㵁*ɲw#}pU'̉wPb$fE%ϩ"C*7Fr4Up*ʘ_-:8@-$gL
V"faiIG~Mz.Vjyy[n ѨqqXne~rN' S}EKѺFґ!"&U͖oK`m2[J[M["Sc9qJ=@RbJJ2WQZ&U6jeJanobm͚XWI\%vMa4+FVm2hRiM$L&^kZ#M?l" U?`db`1qa`{+V,>mh4EB3(}X-
$/> bn;p73$8e~NVB>~(Igb'LHDc6 F7 nA	k'mDiW:4xфrX .M$=mSi^lÔ(%QK&yLL1o!/Ã$FOcrxe5z_TC04޸)sMSw9@dd}d8hiLc`쪼%Dxlϵm;l3%= (ӯyݷ:As}y?OmS,/^#$+xn8~y'3AUbWar99,NsV|yyStFPȃ lR;x/+s|ٓ'a|u.>d.O%{P(gOG.,@,yS gM!˥}\I1OșewpcdW_u򚰊Ӭ}y

!tr!^81``ϖcjA Vl:1Qb*ڵ]{#kŹ|<=^s?RdƤi>*b,_7_
Ukm:e)t&AYAc<F4-8.;=vQVGqCiD;zZ9 ]hz{Woxo/2X=DTYyjD~dd,<;=Mn%oS"?c)neHHW\b	>.fiyB+̔
qV[\<#+a	nϻ'윐E^Fs]@s鬱^l3+ЪR/r)mW6/FѽzЕz:47f4Ճ,n"TN8̒jbvS44C 8bsmC3ѡZ~G`߂UԬB(5w;%47B"G+LU:[0[R=eopEoCvUq8͞70<q]J=:5oj%`)%x	"$/lMQjZ~lwqϓbWGGƞ%o
Kl0<+c{䋋z#p$55éS:|c? Ui_S^^^z螅xg<oś(|UHf7y)\-|MO6~49Wdz *AFxHdjfMܳ|,uxycGYX4E<捂A1C#czClױ&64Q SpuI9k3/
;[uub2Go:9(ˮT.b%_Àcyݜ:Ǐ2T땾$)R
UUVKM80/>@V>bhv.X1]/ԟmyﻧ[c3BQYW4eE'+i\d3LiH˲`$OF(5GISH' ;k'T{V@ 2"ϐn4͒X>y!I0;83DQ`l/͙xT84,ĻBReg+1U_!z9< ThqwA+\Ss}@&˜"JՔ ת9u|P
]kBLX̳ +-撚TO8(1Yy
$u6Ď<\2h,mP<!
%3z!%zz\B䕠X<JE7&JQ/ѣaJ~*FGVgop}Ȧ
!@^jF;dGBCJSQ%	&Y^wR9H[`?`o12eQjc"k+^H/}$fyGC(Q'`4pa~{s1ٵ h3hs/5Wps@8 pqܫňu@\*VyZ\2%GapvXf8Vܚx[4X)IQhELɺEb#եcأ0vfF:GjxjQjH:VDl
rR{~{QfMsW6D ɰy]WÒ9VB;2v䡁VӬ&TM&.2{.B 3rJ43mȏH,A'LG@T^sbHɐkkP4,7@UeҢgaQtf>v~NL9Vc5

s=CzjCmۼ@<F4YsǀM\|I	1Y"UPİeu3=]~ݠ!(0"5-ܤ/vҀv&k	fپ~9
ɍH.ߌ: &%Fs̄4Awrhۘ"OjX49TغSHfς'5TSR:FrY0Аż5TF[V`0<,:^S.0u=.fJl:}lڏ</-ln@ImQ(!#no)xE(	Q1S'WdZ@7oc@csvLvl[;A6A%'_(<+rb0°r[=bR3:O|!LR9Vc!pgCgϚ
Th@ӱ7y@$`rw.ZC	қ(cU"57^~?J!#&voɤp%bH7_!02,iȳӵߗ
fQҢ)#&V>IUZ0pZ	
	]:br(P}Zb|-1tv=o8YX/g,eE Y}f
`.x$"d&SJT΍(d#0^ETS:4^FQݧa/	-F"Mj%01\?ZC W3K_̜* \Fq39	BFfIcL~0t@(E wn%_ӝ88]XS=wf
nBD}&k)aWL5&J}naXoP_9HXGw
p)zi9R܅tscYb.ğ`|2;å0scyʁgA%F/bZy$R*WH;QvȗLܔg6۪Yj3EE|9>Bj9(di	&Q	QWa_c|)¡q-ˣ
F-ANQWBO 'Q~ |g"̫;LNmD"7xY@o&x#;[N&
	0DJJeTO|cd'e(cM{Ҩҧow]3/RiF)Ʌ[7\2*ĕ! *LW4h4.
]jYN=,o^7NI~ڸq?1vh\:a/k{!TM4HjH+Lr=[ߒynQu;_
 giT it/)bHf3	x[-x1,onؼ~uH7n$)3X0M\ǟ/UuU^7	:ȗ$-J &jz (Rpa݊.m,P4' -W4E!񱠐X<Q˵mNDF@>4ҶΖɿz⾢O褾IpnIqJbx0~l#CU )DW]TryƠ	y֍DM;_Js5\< "Tg#zcraLz?DEk;"ʹozX)w6_NFnEnlrh8A(z>xD,вF٨M0╔ކLsXRt؟iu8j"Es<!K"]8n-Fzv.>K`c[}qwߛ2,!50}`"6{?y71f>ubzU t[m=^xNQb+TY+hȢ?dy\ lC2lZ`
w)'DZE]vbvȂ0Scʠ`r~\J܀2]lmZ%$25\/1H"":z[3 @ٰf\&??巠%r&Uk\+RY9Dh$%HFQ;Zb[$5Q hqh,OŘrk@T媸.
_.3,}ȉJS[¹0cd9@UEe[Hd1h0oIjyL$%"(Zu別ZRv圬RUT6 CZ7=(h80<GO>]Nn_V!	wL}G7݇#GS63,I{TgRga~^D(ZUɧ%kVJ|yҽ;cn}@`Bu'rV)m<6_ҮP.Xi{޸8'Pt{	X֡o)Y`X21\F9djī5^3CKX+m*dʦ8 6#d"-71}D.ha1ȐoM hbA Il
CrH=דV\> -x #@00ꮔ*%Ө# JqLGp,uhmPnp0= qbCHdSQ^㰬Zj;rO{|x(''#QIV ݸOcA+>=7
T3'#nx0dΊ8ӰЦm-O3<KG(#~f^߶2+aKӢ}7lKL^'[>d DQ_MS,>t~LXb\ttVNG#fڈf?m͊??m)p-Atq5[ٝ5&a9ki˴ϔ[[fk>%-w	k*EqL
7}T#@omR9Q+"xP}4͖s8cXƩ|;4X&jŀ4m^pR#l"k(Xd:&E>l
B/чI$b5F19BSAxV$dW.1U2H	nfq(#KJYxUg` b_GXn` !LBEs#JՃH3.]"hޱn?aVNL}^_^r?I.vCH2?7C(WvP92R^#
i7:&leLCG)<)j:'N)JI`.N<ưPw[6$e̫ieL?c4tG(|ҒpIh-ۢԳQљpt]"Z'WsR!+61e,)< N@nGc%8~=cQۗe-otGW|^h)3.JAIEy[Q[ՓbvP2#Ij5H{9wޛ%^Ϸ<6;eeQ$|ﱹ7Py=>%˺5+x%(	5GU$aӇ5ۓj:4.lrf?
=űАU"dx7{F-ugxGUbl[ꪈo_|i`z92׳[߾^'xOϸgmx*|gz?/*NM1B0ik	:	e94<rO!Y|^fV0'@L`Tvy2s%}ۯ?PWAcgHUKg-J#[eols|fɇ5N7K"jlIY&[h\o/gIz/"E7*0`K +1I\MQ+:R`ƎKxS\}Q֐f*i]L a/"|,]~ ˅mʚɡ.^`U/7>czV\%Gat'\xCjWnu[5ueϊE_gV痵TbLFd,Hh	f}D+ɰ3%Kn?9Kjiں;m@)O4d2#$9|ȉeae}$l_r'W:Ⱥ3V,:($|&o;rZig/X2}-'(r:uG"q(V̭V4[lȕY\uUh
t2IbȰjB_`|V9}mvW3Keo4`G*NgK#jRlS褔cI
kdpXG؟0*x(5wa+!VRb	JDwDu9ǲ46G&/bBgnwe]Zӌ8H`LʜجhcVߑ1D[ɲȆ='V]M[OԶ.{|A jړ=@J|?M<י*y@eXiΗ.NQǥ.wOng-:XQx;_fg7N4UqNp'wpG6,0)a[	|5pր2F03\'S2d򼨫	HHӰiW29$EѬ^
&VfߥxāYƜ,\"[Xz䅢yF{s"}Ą0҄=k5	>lyge˹9q1Jka<<FDslt8/o$JvMQ-2Pw
S{SGg p򺜠t\7ד
m%Q (		 Câ4+P11Zw$3e(c
trn96?D(p;;N"S9 9\_&5<n%CS2:J<W<}YwrD\m	R$#-pl'' rb}q: ?ޫBsU[dȺvJ;x	 7o%2T˸oZ&r'݇ͣ@JCUC=HmR\`,UD}E	ܖirȅqAT$t3	-W)T[֘`*۴v[Ual#-H:f<RօpZGDc!1K6=/ְE!2c`N (WBe1\_"17% \E8?j
 
k9g^ )
ջX2  i*(	&"'<B^jm(!iA9Õ\]Z;dg0$қ"W/&.Q7.^a;/ʔ<lʹ#[c{]NIeDi{Hd܁VTAWQ'( x|eϫxKB֬W
_KV.@e5}Nئ/lPNwrr.ǋŀPBa Arm>@|SHɺr$KX/qޜt68͜BV3:k# j_쪾}

q$&w_ ;{z۟QIw}S/H<ɞtmw;OV@KJsoli'MuP
/urdjf]oo>v4?.IV;yӥh=*D{m=?N"Ӡn(BA:2wRcO*]nDDqd)<NFC<@7*
D6zSJJӻI)ɽ`!=_:YfkK{Lr&\ox:0Nk0Z`2?rO9迒r<#rO+.Glkė]CCl1pP6	rk{x#K*K$µӷ~(f])tTQI"LpA$Uz5[BፕTs Pc"<-Bc*{v3t8_7tWvޣ(ulgqzGl8WnS@lmg3X}Rv*	˫]5P%{&_]ehCv[Յ`z
!E[v%}h&T{ո4FiHր!k~'z&Р#8GnESn06sBP7rN+H8ivk;5yPO\Ѫcʇ@zw뀹O"Niކ^JD58~Cvatwot˃',{~v;:i<8rv]G!C矎Oξ#IQuy5Yx=(ś	dIQi +kEKECPZؑA&ͧF%ȣ.W˼y[GGO߼y8V|c;߫b,Pu]98$%T܈&"WkwÚ cwiQHx)G^|	k"ļCPy
z|s5K)cXuILmxLZcݢ.eoPOT,®!3X稜@KGZ"} i.Db[oxI<F %|jB%8=^LU ax<Ѐ6j7j 0ZZ-816_Fi#X9z(<mlSv|K_lV,Wȑf:ed$lRN`φ7N9' $
n}a]q-[^γ*0!osQh2-1z/ݙTohYhh݃O	s-{捣'b׾LMYw0Kʛ3j.%iqw
;˯5EJ6?AjQgR=(s"ܮ܎&mPYvӿ%_!b^j@9-OJzԡxIs24.C`Z`,YZ!Tqsᜩv U .Eu	r>+iϤk5rQ|e*vλ F˚mȞRBmBwscRS~3Vq"ElemmZyU6u[bs6`gXCsVěʱ}ac$m,.f|F@=SD,?GNlebP.ph!>N,%OMI%?e5b1o].udr"0
{*ٌÆ4J]B]aȢw0TNg"8AvKm]`6ѐhJ:(!G&*??(RT'ʱY\ RpSܲ&QSWiB ^hty$oȧByX`yIJr!~ov>0	\c[;߷u8Wvqvou=KhI=y!	2Oفcs&-3f'-k"d
"Vwi%ЙIzRA/^^ zYO/:ܟ$C%3k"g
t;@wC$m*E]Z\uCfKńFIMX}HQO314*(0BïVI9H~3"jx."e7Kxy0!eV1\#I|j,{s,G6?JuG{嵈1>cƣָI/n=6Į{I+Q|JL&=xU$=ڈR/cq
LcЯ3DGc1Ji7mzvz|~7&pxhQDJ8<@)Ѻ\p9<{kXȆ_CȞ~pL84ΩiZW
 A"OI3M*|{.:h-Ez#l646&gMJlcqG2T4z\JZ5#dZX[AqV3N#(70,(Z5Nup9ٍ+~@nb^!Q-a'z5iɫ
DQM/o}pؚDl[a/F>o0DwwfPC{~/ #VX+2%Qދp87}y{ jlƷfs+	5)*Z+
D!ٴ[**JYg24!~$,?T5V'~*/y
*EEY!fM#_t`bYnKӓi᠉n@R8sXݓ0G&)hr)/3;>r~!W2M5&i#`T6>wJf@+pVh$kGkt=((JNq%rq{ϩ侙:fQ2-dijH2s#yT萃7Np@jHOui,ʨ	ݬBOhz>e'rߝ?Ɔx֢A)FQo(# (3X#4*XT?.,%!;+e58Ԥ]xKIҼa8k\!PRޏrؒEز!Ϫ
C 	  NEHikյ)CFpFykUcE[;/Br]q8U8uq <<<8}Ov,ZFf[j|ȇ4C%zFk[S}8hXu)=;ICR$vּ@';O]2tp)πa[E<b2wRp]CI`p=Bh=H@z]DYxdn#j)F96rh*Y~n
,
!ǢPq2QwEKh#}= OPn1/hM[0y.!cnn3"3&	Hxn\<04x$&"ftPRF裁ݎ㤜^Bm嚺#F<@D%7TJF({(+LMs|CK4NFi
ކ.X]M e-܂M8M:^ķXC=\eNvC=oPXܱh q$oR>}\訋UWK|FFUOF$|Q10p
'j:8C0`XddjAjtPyC؂5IcK&k8:w "';#
vQY/ptxv~֣`MeE*	֬aȍVZmXeе#wQ HC),!;(G
UD<r@˙	HtDB;8o~Y,naLIG5^UK{;x]9'`]V>- Ãs;^cf_c~4xmIa¡z;[m>a1
 #ww5g@jD)EƝ~NH cVE{MU.3^f*lRi1s72Lk-7Uϓ"I{MV4Yt`<zozAndS5.HyvXR;(pR7VHV(	[388!3DJHj/4V=ٮ{·Ob&6.&,k`*%2#.ǮtU=)\
`Ξճw?:t>N:<0i/xDJ[~p=_E»~pRiMwwqx̾!41Ô_-pzEWv[د\-P

!ح?`:/m_9L[ۮȗemkVI6.Z./8f( 7"p]A*R[<; Ivv Ν6)6q֔~mL*!Iaph$];Im,:ޕ2/86$= DTVk4RGƎ:/":IGËt9C̅b+Bf{rmJkLq,,( {ߥq70*(]%]uBJx 5 Jn g$:EC(.Z@;*б/<b)ZjxI#woP<33M-9
/ARYARR5[-د>,E5WJF.1.K<us
ez%VєtU8'n2`IҜ.CfNz˳ﻧN^OrdkkZm۱Q><>fOGSg0ՠY`ˎ>@$SAtu[>)6DU1$
+E ?zM!W/x+s.GvQMˡ\.]qBӿjgcPe`ɾ/H)9GR+Uo(hpʫ8pgb-s]EB=wx
Dda'켫@<C5ι:35$R,[R_ի}a?t˓Ycua3kڭnM8mmΊr"D!zG UrwX4_5ƴVg[ia:>XI.v#f`d]bPZRgl!ЉҊH4$86L6xIj>oC/X𭛽)!1zd@g寭 o%2jQ|WgMXPW!(OyA=u5vGIf~ivvxgi] . qPJö8ITɜ0
dFˡXDTw7FSk|k#\:1K;ނԊTPSmSC?%l)n5z51Sd܄hdCYN,{xKI0<-o|uU8|&$<@! m6
!۩ݽk@\40yBY.U4:}C>"R\h4JTk{24!"Nr)}$YEgtejm-<-ӾfO۶b/S,ݍ1ӊ p
nYOc`tѨL 'k(mwg74L֍(ak26DM<kaa1u<O˱ī9_>M-3re]h<{{}ŕbZ	ԁt>	*nN׆%&qx@iQ7fm1ZЈePMV+nXG!W`E͡4	`Xa,R@oJ"RYp9n!./@Nּ*g@Ϙgb[_p~٠;8?U?_B+'AuyTcLjbM6۾lNjO.mvGN!oj&4_۹jAKid mF}@4@ 7r
 ~ݜWGqILITf SOK&`FHv^(~lUR\,4uv;9u+?"F	5kM,}u&Eus݆A2(1#]QzJemVMo0Eur:#āxs^wJ+5stvu4S1P>):mAO-[?1`_ڭLnx
$sΧϚjm64Ent%hA$0̖'(!:|nTS{xƁ`-]-Bs{ztd<҇k&rޘw$oRW@}UP'4fD&\*=9)0;^
(ɭEv!Mk;z)$S*)h/b-GjLAeXO+'vl.R`=`eP[Z@4aѶz'IQIZVN+.CLqn *T]5=
^8Ȭ&I0dADV_	a Ew;D_~y(McDj@;'p*KX01yyG%Y;h̗.b->1hM+}uOL<waL$Vf6"o
8VO?b8%,g00-[SĬ5[F.CYuoo/Ru̭KrKs.&Vy#zv/,!B5B\bd;>iN"o4I5!]7FA:5k>MARH%5i=ƣ:ϖ	uS=}_=oYisdx8[W([
MIǺ{>PØm~O{.YNMXh1a-*>^
M.)(E
YT#1oTlٽ9_q҂y	{|+dU;ywO)PLMv _-K+*mN""8N(;c!Hv-}vWfi(o1)Ŭ^@HiB" !xdtpc>/Sӵ}M9,~=gl[L{uvS=UT9avՔ*YEׁfƿCtǁ/]k=6}9l9@O*HCf!דy5$}vXHvBV/7e'3"Lp:4vH
nQ0'siU{y\b`%u.[,$]upt_7d*1v`m}⯩ewv/f[6cRX SY|!d[>_{Q}-b/pvxhW߰ʙ( E=֑sw"- a2hZUc5ciȥ1P><#^"+54Qt\smcDefxuys=gF!'>2`;,^XY6\ "9FrQZ!͆,<@"3_Aݴ?U!.mh,m?@FG	:izu8h;#InmVT	0lb*_:ERNd5kʃpd7r4xh_Zz~[^=1"cXt'E`H[k!-\!\9tTrRQUQɄ3DHewaPd8a !,0;`uYw+7
:zҰZ Yq#hFxk<ngۧd0M5rU3ַߢ*mFZ<Ey' *_~H[a.H"-C`+LkXsu{o^#a:t<r[,7irbAu!4m"X^2{Ik죁GZmq=ʛ|.gGnf~D|,y{A3G0
io?Q94^q%&Bagg4C<ڄT-Icia2NT87L$)LY(TU#wé`8z=*@)_:
'"o))m y8' ncĄ.%*aC\u/a"p+u|Br[^jǷ}m76ly66il)t(K=tp/w(l4b8Ԏ88d5jZ1.>1).a1ry!:ڦ1d~DyŚ\^>9թ#_;LNĬHũHdZqY4=>=H'zŢvGl )ylM80&eMa5֘Trhs0f
ldJ9hb(aSYkIԍ 沢M(HJ%ԃ+1z̳mw0؛̒Qm`X<z>HV _HiWL@"i)fZt@Q$m
Sax6T	3`[X^u%װ3BKz:S,?~hxJ6ARildۮ4 ,ylpv:9mt]CK.I'3G0HЯЕa ऍ#L&}_{D:~"Qm? ;:"I	f 
pw|ԟ:a\~C9Vs.)<|q$*n/S.<<qP{g@LsBhEۓ0Ə-h&Q|޴-'E1q~C
xZGF/=ʲ*SF Dp߭[xISQ 4^XۣOE8``zwԀFi.Cnv}5dA`^`M^3y=vW~$!o#QTm;!םO>͸'CPR!gCoȮ$CQ
#v1H?{ߴ_gwrDa/?xFð }B.r;E
lTS?8^x7|)x  %GO_ܱ7r@>,/b
u	JR>pwh%mV~_?^5^QM$c&e_?uoS[zؼ}Kna'Ehuvl!*1)A3͇9fuT]do;u`5t'wukp(Ye`;|3;;2>Ժ$;kYa
`t5X]ʞEI{>8Pܒ1RΆ5oT$\
Z\xb)nQuelM?׊mA8 i!sv؊11^h.k!Lz4hrQBTهE:ۉ(z.Ty}X*d%qYLF1!`h5z|"e=v홟	
p)ÎQL]c@!̶5a{tXwcXJl*r)+ǂ7i2Ӻ}mxA#U[J¡Zx(C`:{-ʾ8B{\O[#g\H6i	͸IʑJ9y^oZ=yۭ<2`?ds;GMrKzhB@'T6텱݌
Pb#C1mXjl=	E3\Zsz+gb"r)>x
y0CPM㕔3F=huE62B'6ΘFf~e-uCīw7퉚MH9uI)f6G\N3H 	S`$kGY{zO[$&x#
;!QX6Ԭ!\@j{z a	P)/MlRb|cۖ?~̗	b|24+D?mFz87LjäE~0$"1"k(A햺8@PS\p6Ǽ$Ss_ʻ--[B%7do07kl{ggGIQ3K+{3|WȮe:tws	rP0[4q9e
{|WQ!zX2	y$	xlrҮv!]+pݷ0HhNq <l`.L8s]C)΢#m٦#GaL"K405CEDSF0R;>sZ<fiՌhpui[TE:|2S9	'"3`Zc,pz(.#<f,͚Cw6&^P(41/nHd7dy a{d1lgBjCbrdGF%]S7(a2+ѠC~"2C6)߈=2ޡ!]Rr/7}vق6D	Y+(n-kG ]F :vAWPFׂd !.VL Չ #rR]Pk|plP#ln)Rˣda_rʚ!&[V-{K h۬]v2Mn}|Ny͓"= <WH&m(UD#]35Z9Q#%f$y:!f`ʺD)RLQaB`;,Z[q&ϋ5yMROs_#Z< "?GQxBQyUJE+[ 蘦RhJ"9pn,(\>搌	'Bqtœ;m0HU;B`IM[P5j0W+ʹZH1}ik0>9Su[X+hp{sǤeb	~V6e}Ҵ㗓RK(igBTȶ̏R3 _AVE'Pd	G7Zǌ./giL q| ry$^e콵&'Oz^vF&#F;i/_<?I@i)/zЎ_<yrH?ȰLGoy1Cbހz`xj#١AHSlz|2Oq1LI4T/fW5_$yQW96jIlfA1ǎmqb0:rivԀ3{W'4o5=dOsei,)$I>`YrJ/+}	_t.Sz(IN^"H/ϓ]|G'L{ɘd"umbqB6ՂbbPkM9H
hӤ#sK;b>RFCVq_dM4<uh[~S >Y7HldT-*
W=MI=], 9r[9|!ww	jɽW0J8\"tF`"eDO0u'8B%e9Z#VPkk[1~a:}F'6ڋH7*,g1@Yl?l.5㿧z*afժg=E5--܇^?WRD9^6 J4<q"գBJ4s-QNa-$iist08!6 EbgTP3tƿtgryBN3 t^8sql_o58~7 s 4Pj]&Ck!5Zۺ u&&EQ dхi g_|˺`ZMC+RB*Q8XϼHŚf k 2.^'EX;ֻ(RD}gI.75EI k¶
<j)cA 	]ϩj=F`\FPCH6=}w7kϽ&|h[AAcqH}01pS|y䚫"~2lIM1'G>>D~	T+,rc-sY#
2T_#*wd;F[|4WW~e
6ymmTE3Bψzy96gm9M]L񸀘cK߳O7O7=Wm?rH|׏;rq 9~%OizkY~~diٟl4>O~wHL}Dzz^U=I*Mn1؀oXUE&Z.vn<d"2o?`I  37J9`~f/ɓ?NClfDK2PNa"^d(D/LI >ʺdmmrE#:KrsDeߌi D0-9DnUq/jt;Nqq8'z,-P9KRv*HbܞKccTLPd >\B\T neK@1̻"n-:x (2F>e|B8̠# AS[R]7KFKk܀n?6>۸
6*΂pxq%2$K	=RkR<phcqyU^.j0?kțJBhį}|a#V2'C}]m	`8MV
Œ>%H|+XP)֞C SUEZȒ&D5.)k;]0WZI51\D]O<3	_+6{ekx,)v-x^궔1XU(N4]UQz4b`c
83p4\sz(n$.qi2*4Q^0hȵ|zy58!<BZ L6l&h~+"&:BhI&̆q
A-XTwŜz"$BPUcI9)ٝJ`J>=逵"~*:#(+ <CJ{:Ăt\E4+I`M3X(`,t!LQ1q NjAHb&#a`м7М?	@H(5leIa^+Ϭ(<-\+xZ[o*#𒀢B7V{pl\Hҟ#[,-,e'$ȑ-yt`3qRU!65>w2xO$pUkE/Lr`d"@	 adJiΝ#^5k8Q"'٨ GeC	gh!v%\oo>cb3ghE"uq;DiQdy>!<rU	0~p9yk71x3G,| QnidY@
`[1e?0FꂭBo
R<EWS1ܺCel 30lPK3zHR#9@I4/`MZ.Iu~4q|Gjxsue&!d{ ݜYcvu^*5b6
jkΕV;c*FK{#},hK72ZodיrCgjẪȁ8Bbԋ [QVc׃|fsC95թc#o_JmgHL4 a9Lٸe&,"ߣ6At?Xck̀fSqAUXPlyU(j %Ɲb5Gphu^sX
a:aG8j7?;w74ZbF^bXID
p!P _0>p#)x!
mC,:?䨏9ڲH!@-mp!u}NuM6͖J_ǧ_=_42(?RG@,\[M]ZP>Tfzp2klpO\YMo gO=פڷ8bk.b_!ѽ.yTv_fɮO	geC))Yó#Qo>XԖ=j;t!H֒(q~7XJT˔9#詑kآIQUSM4AŻ N0:im6" HcZ3)MHPMmN˅`~|{ʝxa;0p9>m::<;?uyAEpGTn8"gzbzzIU8:RD[dT,M>*;IZG(/.'|/Dw~,o
x	ˮVLPOI~٪T	Ov0`_"Bک-eZ$N|;opc"}kfcCg߱5*1L9VWLݏXg#zJKy=nD,pĲp`oJw).2K.b&`[d.{tM#7:'V`#5Ei/Laļ~(@Xto}?y1A	P`3&ЁEȈ$or`H7nb"*!fa}g&f,/2kc2A\aDbv,*U#s7.]DHȬ]T0kɅO4ABnцZ̭}a2=5lyT_`*͉t2[pja05 }K U&t	zML4'MF$Ӂ\kh~QF5^&(7"s(Ex,Cǉ`nTRGCؔ .guεwRΖA˓^;g}vMrV!P9zVNl6 ~sqbrƊ=0Kdە>6^.AԄGBŲ,vݵN+	o]mHLJM]׳)#YE`j9EONl8$d@m(
s},bOo!!V;͚ˍPNl|zr#Uivvc{2w2 qM	9I+ BW>q)9%.&_q~@
udVϙa-,riF
bGNe]܈Up^y\r4<:`5B$2=XڶR(~8{ ]r3p\3*bZCyS٦y\G 6ny  )fp9AVڔ 5J
)65t(M5`VfcW4ɖ`#eP]p0bErh>(͖$l tl:-F%x*e
F-rkxY<'2"1얧i<Y]၃jh8xFyK|ٕkr6	 

F\G#`:p4F7l8.DdHܵ'3JtJB#,NeB7o\$'qb` lä145RX0UJKC6M+}Zkh!r9;-@rXs
k&^JH窸ɡ&\K6+%ԡnѥ\G-G%kRK` 2;JǶROɹI<[m8 ޠ2#I+*'f,$V|%ƀb  o8u;1xB.%8R	l*\C
w?;]>H0̤2'c&CO2G@eXVU5as!Ip
##qs.IV!%:E֐abN,;
>`F&(Oa*ΉuTqBƳ=_Kt7oBn058g<"V]
2T99HKzlnK5粿4,5 ԕ݁> 0plџ.cA ?x8~>1dqMݒ;z}:9>eo &w#	W;˨r4Y(BAL_!=x/i ksl?\J{o].ur-7OBïV򫕆M(DOiO>gbBNPDw_HHIJR\'r=eBiC9_]ãGeom*D	*k @TB+ಐvdu7?_V`4FSbYs ?40"c`k/Iܑ
qkyG52'.}3l\L>D͜5
}Q	G*!& 顋ʢC8)C>t'PaH.cITw$G{ :
t? 9JH&'LBgMγ=_jzdg;y!^֑A*p5,;6x9C+aGnk EϹRpMJGHhKI"7{n6U]
C+(
\ɒn.lnA[4`zfӧ 5׻_I*ͩVitbg_}kh#5I-mN35׃B5A7/_$B0rxISPy<iAA}r[]|j	cOa]e<\~dA.B0-jnM	m%1{@5[#2HЫ?^TpUQG8r5R*IALlƛ=ns'#m%X݀Y4DGA>°CT+Z	/gÛy5HXsU.(+A X&I
x<'I4	.1*Xb]Dc98Mmt
mf2;ttpSxnsH/FtfKzo/O߃sOϟ?>u^>ݢzSq=IIj*
.QOL;BI;ѿpkSpTwYkhIE(cMAwv~tkNl օȤBuY(uT_J
U@ ONsH(h\S(,ǥG5i^;hmBU
CAGMj()/'>,gDB/\$ĳrah a} f˙@J15+G$SwV-s-%fkMܻF[$ݳAOӳ{-ˣa4qrnoN4vD>]ĳO<_?XӋ{y	mr Q*dۍ^+%)O/#f1oB0؁ZK,P'UB^nxoi&%Hw"7HY-16W0@,Qu޽LGe<T*#ѪׅfXx2DAXNCx|;JJ¶P?G~M:ڌ`kdiU	+%RtEODńk#"m\ J}iy6N HEG,0t~qg5DGFh:1)͵'9'^bmveɪLٶ~;l0$}-\xh7^-'8
TH1*Hj/pI%7*j8i6.~Yj1س_f"g.W1HA]~	ią:?Y*o5w&#m5&muYOبpJMr̠0]Ksrn&Y=f459#Ȩ^X'
wKaʪ%}b #\/v:C+؝<\a>{3psd:D`19/44隈/omdP166;) ez (U^t[9$br
6L'AxI^nWI$7÷YzamX\JjTH8bL,NR9ojhTDR	zZU/Y_vCx)mTaR81ȓ!Uww'VJ:
R\خSH"#hY/r'c,Qp7ľ(K@ 	ލvRO)b#gWU}R1K@̅N<|<xLT)Mu2EMS((heXzu<0JTSN70,%aMh
-:ZX7hL@G$#jnD~H(aiZ҈\˧vbKDR`Kg4BҠ6Bl0wNY.F M[.qt|o.$ps@p&U$h<
ߘ$SiRT)jA "%jJ%wA~L mHՔ-iߦmV-Jwvtx҇^||G=WRN9.-~'62F|Qy}yŃ9V?XYH#&~%\QPՏlo߾5,˒!u
H;h48Q>/
Z"<1\ī_P9IoDꅵmͭD(%6ް8:4]Hu;ڞL.Q`}^]ڱ~X\AlOtM7	q'{M|+Ԍ0);(*5}d`M85\,jfv:r(7dF1NU+#\Qjf/cA/q%n47ɠ1|jLTV(7+ǷnS쀐
KCr\ =X{A~!0!
$N3~._:9y!T҂r$̨kA2$(<#	:|xπ켈~rKk~By{A."庳|sv8Fޠ17jO<±&mbE"O'-u%&LzZc#Fj΁w ,'IBqsgMy7L>P&K|zmãZ7. X<q{uA2Gjufz-A9;!by}jd^2[ɘ~*j|b0MdV)0w+ʋ%Ytt5$X;nTYSi 7Upni^ۖQpiׅkv9#S$:iFꬶlЂ'QZÍ~JMȰZ%FB1X̓!x79tͿZ.tn*我WňiWH?|T|7pȜ	-}6+WRY)jcȅyKUPI?%By\,G* 
^m.f6Nhnd04Me4 `wE,;!\Y!?x=8V/rdǩ~T͔狕3I2$̙z."IuRmbrfXN52#kԶ}KQնD5qLsKY۸ϩ ;?{£{鉶ގ	6rM>E-|WSm9=mLK'^TIn<??h'?qmEM|Mfq}}+<VA>@4nE#DoYfbXf𤞯e·B(ݞ;S'#NDk"lX	-qՀj@+Ʉ^1}λxG!^3ħ>jA"=#|^P/t7z/芾)ݛn,2& 'ՐR:֊G;Թ'.m;rp_}PϪB9;QҮ4=!\ǤS,{%A(Nʟ$l	̟݊IDC47ȢJֿ5h`<31ZEŐAãJQa{d$@	+U 4VPi6	ZOKj?NF7.|#JR`"Øad8SU3vc5	$?&^o._]i	Vj eM:i0Sb@e[+jPFHIW±?|J|T'N;=V&iohgk P@]~Dv4IS;^sq"(˺3 :63=;cުg\H!bLj~#V#4nRz8ys,|,9P3{t:г)yY7N:5[WkQ\&{!oZUZ9T".DhȔ.Y<NR}h**C!CwX$	}5l}$wh
f_Jbzq\s25j->R8|`]4\*(
 m{Mn<.YWK뺧?-]#_΂;FSֲു&KZ;Ty1~%C*ȖsY>k|CPlj(6 w*9|6)CMz-#	zȬ[/rCf.8r6:Skk}ΑTTKKF:iH!i܋XoZdSf2nA9%`J@Zr)^ ʍ*M-Hoă`p
Bid_f˳mʩt|Wz֚~W{9l螿\]ai?y^8޿36δϭ?8t{ X=;&6i_yS+[_>mnltQ8>;pi;u6ƽv&&6yAF}7W\_7n=k;ޞ/Gn>+ɸTP{N?>==?>k^A{%g4
vkv=<;&Y;<:Ꞅ|ɱWVp.Y 9
b^0gD׋)*v;^gv}]?~޾7"}&Wwwތyyn}ȎTY0(b^,;Š`;C5p9*akvqCx焂7^$\[Ll)fR jR}YA:e8'}K줎V9_bpjBvr4#E
b~Vtv!`PwōZ9JF'SG(_v
(ؒ`F5Q'ҫTc_{9S3KF !:^6Y@1p+oPP rF"7zj8Ǖ#ՙI:,~IEd¦֙c-.[xA
hft$4Lq^ܙ.\j.k=P"?n5edITÕ_\悡`^Њ_LFdX(olɝ7UiI%Ή뎺'Qv9T`)T0ʶ-1JBr!H:|{d[[-7>؏!f!x
C8ŵ|܊r:ay-7|R%qx9A}Te?Y.P{\a8.{/L"oľuoNw}t髐/ϑ!Ҝ!K~ǈ=+V	]Nέ?.%݌c0Zmu_yB?oo<VMƽHt`C7	n98!wqUíG[ceX;}:>:\RK$I]u(Ώݑ_O<Ob'9Jxͳx:q}"J*̋
9nqUpFwlZϮ},FFIZoajr3qG"pܥE1)~8aCaS[	k	_/uKZR^F1"6[ 1Z޵\'ZGݵz7x!6 #CQ`o\z;UJBvWdlAXmCr@D)+ħ].Nl6+Г@>3ZFfFkT<t8SU@k:&('V]B* d*DAiYH8hKؼ7QqeCxkyO$"x{y%"wFeEC4'uRҜ?]ْ?<hx߾[ZVx#1IU+ۧ3ͬGb>l)Dڌ"rq}C:`A<t}+G<*6,8>0\DݾUS9˛+<-p..ء葊޾=(w3yu҆
j/DAZ9d)_۽,58IS#u9A$bl*U#$`SlH_4#:|1-6T"*kL|O|$h!}UJ4|.룑T2	j585B$ԤEJHDo;;9x}Ǡw{립?o& fmGr_%(T"$usrc=wsw5I|5ɾvguPg<O'A,,*9҂N}GB8H[@xϭasaw-,[2ܳƢ~ڞucwSq% ÀwLch)ov ye;܆b]uEI0+(x@=:dCiuX|И#'(^\w *^]TH/1 SK%BR]y>-mCpJYEYF#q >䗐EfQ+;'ZZ6ٰ55-sYc)wQJJmR#}	e00fRHc>4YnFo#_muw;]T&J"78>~u݅$J`4p1
:5*Hn㳥Ӭ-h甬l6?=TKlêKbM.<zUVS lK)"	z;GA?5Fp3/xR|oYYu!՘kұBRp WiP@V	M8vN2x+4XNC%9enoNcb3D8墖49uq:.MYUz˷b<-ڻS7&s#l^iN|3gXN˯ е!'5P2iIG8Z2G
1!I F`Қ:}d@l8ۈ څ98RɚgNá \':gUMj+|սKwq]_s,a0tشm:ٌhP
<Y=Qؠ˂}ndFbC=jyu/`ZUY«GCJ:	b3Դ>f4B/R6C_50<5fU1%&qSKnM|L=@4)gWB!1<U0g+tGWΪl~FBῺ!QiPZœy{5m7_~nIGtitF k;+ d3>kyxXqMEgߌ1]4~|%^\#ho>sRkhX|
6X,գsh!r*4[GfbH|9EI9jB36,aKC?.sfˏ处HYɞtw嗢EJq=`QV"΄puڤf7JT.<d`(V6O"̡M;.قG.Z?ҼЯ{. NC^|YۛרrEХ(yn`G6StLV$@E7{͘:Cǝɱj z#;m4ʩprnFeϔbBC'çTWB_9$U%>|h21$W]ι(kк>(2
iQR'/nlToH2Sp1;2](P^rF%݆U4B5gMB~78|Ÿ+oʹQ©klV_C5ÞSN{Gy@'>J8t:*ۂ!RvUmi}H79sJ	H3$p}8@'f4FR?@4ڔ}*O#+)yÍ|+%K %(ZB|ɦ 6}dp#-qZ60/]W*oJ+WxPY?퉗BἺ\2ǄPL,;w"fP^bKt9ql
 WB%F뛆Q WlE*[fI-R^aMքH
*(kl-@V'mqX#t	/e~3vZdLm	㕗-Pb)f-?jҰqy[u/mL8L4CT'D#d׫z+06IY_U1<*a\Kx</YO
x['oT`)gK`%)pTSM"&`R^M ʔ]3m`aOTWgƍkm*Ŵ.=;<Hk-=\T}Ԙ647$aú~&ES*d
!ZT%{e<= S܍I/E2R6:h-XvoV=I4 |]D&<q"Gt/4r49'7o= 楏=%&.re0ȦaL)2f"5k ɰFG&:	9hF-O,ٓV),Z;A6^aE Dwq,9պ^Ki]֛5.RA󣒊9BZw[XSn3NdeL@r~b	
'̨bRoޒйҺkeъݼ^הvڰI,V('xΚ{6GNuQ6d? |¢b1v>	-mC v1sQ+T.firT'Mw?2"DHF	)4n~۟L(nyQ[0TgqCP</صRkJ͡30KiJ'>'	Fdm闥:kL}󞖵bukgcԩt\3w|=O?GU,P~/;@_9Wyf_}mCh1!h
˺zxΉk#rÉ&"|xo/ ;դHo3(bEdC	)4IJm
N :O"r='sN|
)@=`{2.,?Y(mSJK-BKn .V)&vG<ڡ]R⾚ z{N^|C;mBho낳:g*zV=[3!GPaNֹr:-Fp
v|	q)PH1#!ÆߨXK)__>,cX6 (WUv)Eر7}<ހL?k{ܒ&*U
7.=QmJE,R0 gƉHg"{/"=o
ըJIM1GC)&qՎK`$G@/k<EƁх㴚QMc2CTli Fqk@j|h;jV;$$P;\#0nonzI
Am{-[HLd_x{'5`G\mgZItbH+)łS_qgU\wV/n*,dhK!r4\Wý#:%{]wޥiӄb(8mn?WUf|8l}Dǉ4'-^kx"ʬxB zI2~*~!SY	@xݦs	ϙxel!kem5l	a\r
. #]cfy {uM̑*xe	"\z"q>;y(RW{>8>޶.>zq(:)TҢhLa/D:ׁ*-KG.+GX5}뾊|ĬZ=(+@V"Dn͏G7ɶ|p1nDr6b*HD_[gO?_=?%0HW&^D{U" }byfFIkzppj6wϩ۫O<uE1cN.Zpxa1uFsRQ2?&jVythq8&lZW6$8}G>8d&Lbq2[2\A0 D3Q 	!E謫,7fe聠UO
x!/1][9qu1pZg&U5˱Eu n;,X	`p(BK#ALg\nXFգQ*"mk<*i`RGPWa),0wIQu=NicY'Wb3^$EchI7ūv;]7m7t+DN[VɳbK6]sH_:fP<GC[ʹ%C7(#/[5g*Yb,QVDLmBz?&T,& "}+,S"[qwM5JcQ@,-=kx,.:&`o40~&]L?YOU3)z/(]ovoarj@ޙ#n._D*>O)7BrmfV<G=}C*\ơ>:i) Uz{mOP{@b)b;EkBl;Bsa,OK!HK( |
2c?u.x8(i'iiyg>aoﱉ]O3@&2е;	Nw49Af"ޡNIjR~vdƔNJ􂲨MhfR
509<_)*(ʿZaZTS2IӅ;
nu#_H#|쨀BsJ5$H >)FR#Y>ƔHK Tofh`KP+p&r3GAv/fC!dHKbvQ0HL&^x8+WU0W	6Q#C;Q~ขhCx{YL[1$6ԗꮈ
pTh6ՁI
lܻίAeϛSzUnIuS0{m9Wd5wvwAm"zbL$2Ĵqv\@
D5H$H?ԨQ87A rUqB4.HYUóAAu1޼[ĭ!nfLGŲm0:2lxx"rz]@LVkw}1\pt&~,J5x]+y;e{y%m졳{;bư%&&DH5[R$X3}C %޿+KYʣ,|XX3ILdp[w4+ClSS:jwW:ꓠXISn{qUj6E@Ec]e=e5"
F+Z\%vܺO
hg'{YS"2Efw5ո~ru^'L8y]~钪D=( S@i32GF0Uɼ],]wĝ.G}LoͲ l#YA@;UƓ.Wh^C&DVBJ>ЌQ4OPp\Wʺ"r;aD/bGNR,;ݖpHuW4p O!eUmUfX073*
~km0{iíl0D@#@}x=ikIw/a30jAn8iodC,yqhy}Ma&\:nvT{uDj1Q<ͥ0qzG/Kia0Hm]fH"Ӌ`ԣK"ftPMP_HS>(bD{WmguKM"|A5BǻȘ
E|],7(mH\ekl8ú;(+h+}{DVt&|2m%4f/Ox^/C8SC3%	C$	1ci0a	NM*/9=}ݽdԣK?[&7kpl$fwV{k9l,M\y{ۀo2 !	m9z[Ǉ^pHO"(N'4OZf-M굜 3FUWS7ۯݨٷCpb;7?2k?53z=??FuR,4~{On-/T%+l*we!NQG B%t(>1~̩@?q|`'R{s-\(ݍuvPÞHT-D~yOU#ԣL	'~JB
᜘msu\(Ω$d%:fhJP#[>|፼; '߻#<wm>Xp3.1VPI$_i3FaC"XPŇ+*7K|XL-n -͒ ʯP#~*\􅶳ؠGNhĺ CypN$`[9|oR#9RsIhO`o}k*Fܫr"*;-NRK5Q_DꔟL $wh`|Šg,s8Cq̤ʪЉF2v`$A9'uRalhM[# s

s	qLxֺޡL_wy;GG٢E/B8+"#l>lJHTt?$IYuf6P.!:E+`aIj EItH/H
Ғg;՘ķ-À-^Pel8+9e՗>B!X,!n{xea0&#frR#oւ H]1^FNm
Ў*n"uQ	޹-:A($#~Н__u~g~
?^({|+dF>x[FЅ|v#f3`574JTS(J3d6=rH|hvL4ϼ'hoM[yDb/	:jĢט3>*ŚŪBRfQ.;ѯo'PcۜYPA]صGz+~Ccfh @ٽ*'XmbՖלTJr0#"<|?mgTS!畣Iw^H0_]]WliB<?v\IrAo`XSW dcRE A_5p]8<c"Ѩձ[)RAW*DIBHz,4.&Gaاp*;@.ԵVq*khC~Mixe
ВMMY+,:9Yg6)؛A^q/0>-iy2*:eݱdϷG/"r(2La\rČw7]ޜ_745(}3)_~s2ye셑%:;ۦ|F8$+9&EH-EX *ab9FVHuIr}[VߓK
-!2FuŁF;ճ4׾V\վU>:YhG44T7ҭǆ 9[s+6fJ`_ '}mVEӂj)&/g ׀_rgh86B?}h'{dVZm*\0ZuYp$N2d9mˏa3fRٶ	P&qGM46A)V;S&]}(|vo ץR*].~NZy1 Aa5-WMuM7ѱRH3}FGKryʓEKBp%ErZ_wϸ {/1Z6erqU")b-%DW@[>4(+([(yplwk;9W>*vw`_[tQjc^5o]WW\cA/lμxA2!ܘaH鮤/gS2.8$	a=Ak2:Հ玶k]gMhh0(>RL2FףּV:@DhJ;Y!`Dz/z˛{^w?:?||sC"xfewwvkwӷo߾ J0SKZF mcHu`.;ꒄh~SѱRoHlFP̴Az¸+wKjUX .)GӁNt$hY_OeH>G9[B(6CA24#TA]8#œ8~use]}R|tu=Ԑ[}^ŭƒT[Iw'}yZt+&h{HCBIC8FXi2?D
bQ{(#80tÒQBٜ,'$桁О!ꋖ~	%;A w_n~V5GU΃]z3p:Xd5m0->#r)21c^V&L6ϲ_zdb(>B!>⃟ fk;D	|۔#$c|ZH⻜朢ieTpmp%r?%-ͭʇ2B'y63	zBLF4<&~X/r[`}憸34y۬)AtّZ(Ϸ٬!vD	߷j:kH);
ޤɗB^DU	#2;ArǸ}	̅YVlrbqژd׾GjY 
b^dŢuYY GZXX,0+pVh)$A0]` NKoN7Ӓobڙ7_₱	b$ٸ?9ܬ1M3Z`\V]Q@\VIo^x^-z~`ePcd}QEHңWm0GmH2`'@hLM?+kp;BJ0-.P74 wEd[⎶PB5̋a1}r]"96BOF{w6b+y; CM{ S:_ro7PP3$\ڤT
I1\( S-3$Q;;nn(Z{Aӂ-֬RRZSE25֗.=UYǮb("وpQ1 Xgq+~#ٹu!ICjWaWwomHXhK+՘ ׇUFǲC$>,17J[3	CYRJ7^r=S8G{/Ե==d5vũ6wOA;t^+HWRQ(WsGuRW?R9]. 7ϤΉ5*x5AXy(S!<=	%PTv$Q?d`hLLv<ȩ᭿Ac4QWu1 >(G1rv	1,gηߴdZr_iN*XߓshJ"7ꢠ"̲I5Uv(	iWbQ+,_ǩ]q[c4<Apb!
V
O1\cӦ0&c:eTj=ڠ΋vⅾpZ]_!6־zOۈ<_-QЊb7]Ͼ;8!`qGWRꕶ;RFC9sL@-gUQ[ѵo3zp<IUu2b
څǠ3VB;+""}6mM~f;_4E:$P`)gLhLE>&YIyQ&Hɓ.ikgeHU5"U	"^9y=,^tj5KfIBP ,([1WQ.l{'7ۮ,w&yW>ts@$`49̂6QBQRkBLI0
c!;%,䄣$Yl(eaьSf..'xq90i|>@rMZ**dO#D/8&-IL$5K;2>dmFWȆ%'N弐hJm_b0xvSq¡uh471Z^D9P<_itڅdyE1JR-Bؤi6w¸;FZ`8.\GJ1@"^T~G6څ4^ϯJSS7G|D}@w;6xmVU֋Pyj,+Jzr{#7XtZd@:h̃,	ճ]9D9rC-ޏ)KK$;H5{[I/
ϧah\rAؚD#a'ȱPƺELpU}Rdd\VXjx|4\Is7IOgc*KR?f2>B{ʉ3gT/www(8;> IUF^5Qf,݈PҴ^b[2dK[ejmwjGm)So&l M~ّ!]5@.)v.|1IAx#@R;$Oxk)8xIoERs~+Vыo\ V8|#:Jqg; ҇/mOKAD]8k[-pmaxJHˏժ-$hUclM%QBӈ:>u94Zކe=Yt,r.@+Whd@}|bmx*uu/3E	W3U,C}9p̷tru#b
c$v 9FUXyQdK^0aJn$R3.hFZ$C(4XJZE\`<v98lm2/,&MӾ'8c-bԠa@1MN<]QΗC~że6fP7w']@>{H b󕳒PUc)'u֨XFhhC#//4Osϖ2~)I!_~=l[%wm202xʓRPQň'HnɣHiE532tkp	Wvv		%RYdZJхBuF+bO'l_IA}V+v0^*rQd QzeHI^NN@uE,: <-¤'oBfo,ӵR+$OgC^*l((|H*{ZSaN@cmzDZ >M&VC֑By?	zpׂʧ ^Lbר22Qut,q1+]:E^cX_[B?%!Ec.MNvO{Xh`v[;N:lYu3O&{DMmpF<kb5tAgΤؒ'ڸC=$) ɰp7{-iYOEA!_WYD)Hx, :Gqvyzm#̗DͼR|>/+H!:^)%KqF/pK@46An<6:>RjL_Fcu{Ň-\g\#Pwic%zZ5xz]qoBiI烮o5fzP-oR@sf07A	Yrua6(3xn/SHd=XP8Ypp0xRV,
iM*R	q`q'0犱)t*ƶo_r.%j5?lq<<O~1d@}zq	`rwz}I9Na?FVC鏼<qN,O/a'G)(öue=p)()'̰noswvBO߃s%r3
be<Y^W6=LGv0Bgdz@Joz*QT;x<︀8ZBz8z(WWpr7-;7T+VGy};u1k*d|44,U䞍ٝXMYlK"	ARῤ5$̌7[^IzvdC2^+["B9&^".]R?狥-N	:R:`9cr$%oTn##;	A.TgHq7z[ $tV&Mg|Nv'ˋ9,aʲaZTb(<ueM󮠂a_-XJ͙Sv\Cc]pÒ[uN.^LU6x<@[Bf#=:N gt
 ~[h@m:=6[PӔ(X#"! 5(ѮA	ʾIԽ%(D</$葨:R0G$|%A"nZT: yAH\S[CwWAdpS Z^4Z.3!6^!>#iPRCm*w  AJ.=!
9Z}i
;p`+nI/?n#	$yU$;C'>3u ҵzu/SnQר>ӢRvx"SBGł|{/%S<e]MDdpV}dAnx+C+)`:v=Lpn*ˠ:{/
/2&a#ȃ{RseL]K-$\ݤ#H|Ėmrm!U13O" 9eCL7:`pc-vUI.
pfn_rWk9&uRnz-(1E{,5cv %saL^c<ǠKA-%1SI#8P@'yIvȘJu?y<CMTᖹDAǥ6xhB2k:: +8OWM'5T'J*%9y=ҹT5ϛݿtr't&3G89cI(r(Y1xBnJ:X;wϻgO'%%f%*Iv*&PO2932hxI)t&t*IC٘b6^M&DX/䂼)Q"Rkoah0T
|:a\(VPlg10TepBaZh`eRə 
_XlGmfy8iYyːf$)lh{1^"H YB;qV=-%މf14,͘^S$e;$B1Gp55UA`2aLe.tYĆ%K	rrFR*ߤ  VunT`60S@bGkBWTL^Ʊx]?|ap$:=mF[fG-:Z>BGD$G@We@J&fx;-+5S4#}rG'vdNYE_T0.dc-?a2a?E<85Ayu%R@UI #\U3ƀϠlC,|K>]kJfI:2$9zcIo!Nx ZT9ղKѽ;8;<TrA6k\/jE[|CP'.I}iGVWiLY:7B"ژ7k9{	ztY	^
ؔ$Q0ֱ >r';GQto'NП2B@Y$Q/ >2څL(54A2C{j,fK5VBThal<ж/!h+5a1ާzxY EX{BNώos/7{OK3rJP-FK6pètl>?"ӻaP0XNH܎Q5/r	X'B( .-ާTp22a22fgrf\B#dy(|ܘU~RMV޸LJ[ƶ!҇ޮJ~jgyRdʘ9hcd{{:,I$/SCɮ5[OnI:	~'EGO&w,{s{kkHqB~'pg\y`pHP΋PUZ\Q.u-KyIgN^e=yS9&րtĀ$y;$
J%#&c%U\$.jjH#6ۼt*%nNp)ZN:T#noJ\5RDZĩn [eL],⭈}C441ŉ
|E}RFxT9*&>{÷3)3W̅Il{Cn:f%e:Lek$6uZ0CM&V4pfqge[# _Z8詥#`|oWw 5<lAʎ:nEژOwe5IvRyN&Y{s Cʤ#l0n>J4vxi6IgÞ4ھ9LTԢCBZ m%Arr}sM}DgIH+LZ'S/`a=ɪϚe+	Ӧ`e]D6b~z wazO
d|&ɽQ\Ehwx)@z?OX	n5F׆4\iY8<seԙ/MdGylZA3UOT7 x{ꒂ*=m	X*FB-l]{4pBIchP3`T'45&y)pvZkPԝУg`@7U03j>}O$SF$Qb/w{$Q8RbH~^?tl#M 9ɼ'Q܅NS`V类[*`=ga"0cH3#qlbJx\ܙؑY)$EYN$iUԮk:EN)ٙϮOa	ˏRLE-.lMFֽȒBobKp7]z6'!=6?{މKsG,߿Iǋ^1HR|LmBh>48rYh_z=aΎKγ_ĕn}idp:bgiӄNǲe!< Kx69"e`1)?Zy8(axa)nX0CHAjG?-GTI\^>q3c
;ݒ}T35rsj!Aq$Q(װFvXӥ*7Lxʲ:,|a'6خսT,R
xY$kӳ׸nbIh&PT(l,Q!x]ƀU:aneÖ^  INs<8N{?u8Җ+.`T[m]HV/{/Pym.Fr8=ΚAN{=kI#f<}bңJ:J:T^	r
Qk>!7cbn@,EoW`1C>2K?d6ų%E?x'xʌy^-sCBax)sH%S @35IB\"ß\2XthRlCXTzJMw`@KTI9iҦIq~7û};iv)Vfw"oV/,+-gK?>Ά_Nh]_YTe 5)a)`<k^=jdzK̵uI2G\@zNǟPPH!0V:CZ;PM`WdAL/bHG|FKvJٟhCwlçU 7,CUrrVL{x2cx{f]g'`p-TsP-\CbJ2 Db5ɂ{͗$w IUFADNgF%DJكʥh6U:0wHՍ)K֒󬠪TX}@/v}^n#r
4>]8Xk¸̖hLV!tfŖFqSbӀP./KUA2_ ϦptpB6dMV(A(S%% N@&ύaJbrCMq+hy/
eU~"q*(Nc)'u7.Zdl߂ǫI}a	57GloG9@hujigg]uux}n0@
PYp1,i	qP׌FЃ\ǋ`dYHe&4u~!fw?I~az;8}tT 'V@`}`N<+.G8VwP=nYC1[IzPg!cl՜lUB	M\MplJ8)JB#>#uX%:S[j+LܲڢpC["#Ýy㤎~0}pEeAY~&t_j1sVwdLrjؐ KKL4ֻd#-9!&)^l'PL(4pOimT`&jzֽhvL?HӉB(QB^-awaG0>ͣI܈#BSTVFM:E : {?iͲb~tgwڃG=RwԪ|Ҩ%If޶Ȑj#tgnO"<Wӟ׫mF"X>NGQLL0Q;	pKa7z]$rU, ܯ->>R##rg3(X .^Zcˊ* ݣ=r5"nu`xf
[nM)sDi+As=ҩj^{]#hd^`|ŁiiX:t?r#7Sl5(jyz\u|=\yjUeKfsZ^;S47eQM@1belL3H4ig:Rzj4\s:)F_SSzXB?GN{\z.чHCvt.38Xlþ=`ғw1{u݃=f*6Żݷi?6W·1;2v]yN8*';X޿J(m)AUĥ	n-vMdʖ&oNg'õ-kV*bX!}pi*KCXsK,
Ǝy	j"NR(jw;%=xEcX|"HUu.~6CNH(]WQtuQ`0rMF}[#c96캵g@ݛ W;"R!rQgx8 x.ɇʣ1,MEwIcp+deOdYb(Pc@bĵwcr+Ʀ`( :{wtwjI,;`|Q
݂rD2abS(,8KK:x1n]=.qZVE9eqnxzl~O#.`Zo32Yj]iCYJ3V~b2.򐔱]9}YR/$1[)j>8+B,bf^=4R<Z#G#ۉu*AS޴+- $AX>BK{!^`WE3cQڇ; Jl:&W`oYVh`&fTn0+|fY ɱn< #!A#$\WVm"k5ngt?ŝhσC|ѻy@'SLN{Uil_\Qz}Y~/fYTD~\Cj{@U*^놆J(:Ǐjt(^ʞo=ѱL[v+,gKǭtqGbKo̘.`LZbpRq>g_wx&rդ$I([N>8t2>Va%jUc@J7B4>sΛOx-,fcn`8<D\'oefsx@N:(,!_g% crRuWn	LKN:ǝ͝v#ڒpW!Byiv"叿=]N_KrMxd}n[uPʏ^bWx])-?ɉ!tt"T6C:)G$Ծ`xR^퀸fvqU5<?Te
"lywSR-@$.̟Zs.4KNZg'?ؖ`R)$zŊl*K2aJ_OQ^Yw"E	J*id*_lrl#`}7GǞ~H'*9K
	mybR3
BXvxiԊN܈LeܩX#jTLL.NF RC;׹5|>IW󭿔Q .W!!@bh8)X$GExxLK8>i|M]ʅ9CӚ:w-z'[foeAt5Ps"&LcL7DmY{{{Ҹ-Vc	"9o^E$@0t"*0t!&H^Ԥ-[K#v  @xX Ɔ: B5+Jy)=^E(: jLFUZaV`Q1[X&PhZE>Lm6gFECKʬ'r)szPXaXUS}vlM) ?Qyc.>ٯlc^}+53p|F-`XP`2>m9Gb
);DZP%O3Z7N(W30G(Z=ߢĴ?efEWr2k-Ư=?Kp5N'QyMEEς׵~W'O$! o#l[O(oFzDcO.3:@ٌl@lDbA0~Xi\gy<A]2b<OftNB/=,6=N<y]
#3uH0YQ#J*U+&@|&YQ{Mʢ,.[aPLJ2g`1S4cU%(o|Ɵ%֣r]Φv~܀ynQ`M~1*'7éx=Ii%gCE{ugmSch$;bV\ll瑿V(3yW HʿZ
5twS w%Wݯ䳓H]XE焛4ބ뉎o5_\e^}:mVNTɃնNМk8KRkۛ~3-C4K 6^Sje  ?RN{`t08;ޏ,(*i>Z{`(T(R7vLnxpursU Lb/Y?NT6;tEň
:hTo[SO<\KtT0c"xZeo}vIa_t/Gn9ȈGވ",kї<NިjpL}`M; b
&էͲS^R-~%,60+Qkt*Ӥ檗CLx%KHbX0G!Od0L2n2(5l5T}uj'7mzqOq"a->nuBJX&4ژ6pLմ#'7"\N}E9Źsytg$zBz~0F),T/vɉU`'tmX_vH$ϭ4K1>Nv'kNBE롹UY6_}:yطX-/Ș&J'pi3ʡݿ!\Tf&"-M(.9TC
ՌfcUZfyv>tFFPI%3j PTW󂶋bso2rR!KC2qRn<ewfhk=]65mxF7*pbýѺG!灄7Y>"WRB0wjyѱA<l+
y?_Y#	a_vHP#	_vL7:I23YsR΋L{KlͱȊ! zuV{_I5g71ki
3zh_<Aցd5^Zj00;+;q
9NG:5_EvX}f%MT@*:9h<V?K\GIx;91$-2#.$T3y:2SNޗI+,i J6q!eg>]̈́{FumHʦ/UlU2Ɋ>H\(=O:ȿ@ڮopk\kj{$jXVł\
Z4VjZ'.|̈&AP мF
«7iqS+,r}"Kzod>/K#fS{K{}#1,lk1Q	ܢLJ.REv(aئmNGp 9`d,Уp1GG#gÏd^(nO9aiu]Z2PЂoCQ׈ouM|*zY2'E)>Fܴ!l<j]|rv[X
bǨb_(#K%!)O sh5bN $F荫{'WǆG-3*qy[_AvYSlBpksU^nxE΀Ҭ\q/L[r
zheWna|+F#]ĲZ_)Xia;Q:)kzU7r"(֤5(bHtY|_Þcb,[kz
RWJ6vlm&Bwj,#'@8Jy YYaOP66':l0r"j*Sh{TO cxSWr;)/XhqaJ69ԅ%b%8aF66s0]a7s5~2z#+S׭lTV%9s%-SCŒ%ڼb{Hl)Bv,<b%L~+R؛ԋMh(U
@ǵJ1l<"UuL%;ZP|vt[*ߺuz[_kKX1T-N]nLA_$]pJJPϒmWizT,Q2։lMf)+lOz8qWK.=.nD+WeD:#4`y6%Q&Y~s@8VZwtQKXd*vZR̍Ln?]c
d*?ŅF*daJj=رv9kNW՜r&).͞HR]ggZk2=blvjjcٲ-d7	^) 7 4U(J`٢H"hpՌjCmiߵ'=d<;I٬9.+(K ގZ^Pf	qj0"_7JGUwIAqe[MI)gC\*uyϋ|$Yr dCHL^2%@b$מ})+ִmy(VW\ J"F&UooY%;}Yc/H5TpßS2MY94;>FY !}OYD貲n[X?eʰJ8X:x7MԒv=n˧tY=
h-:cNmkλڑ˞dαDVe	C A1NR |&{mѨcFRme~l`*DFڽH"eQ27| ]S8ҜV2D\lAЅV1!S4V
>%}nႭQgG JT"	>bڥgeE<)ZTG]y#,˜U"n2aH~dJd,%#O1 nhYv_ym'չl䗒3a6b=~qY8LIb0 @"	/DJP$e* .tF%ƦEZ9y<@>.+H5@ș|
~ye5ґ,䁡 -w;'`
TruOks1l3R)ԆߠstبdԘZ||)C߆vQpV(rsOleƉ5_:dfʦEoprQk(#%>D9P#S7[ń÷¡K*n	 AEahI*^҄/R(#m`a)SU]O=1Y㰭	.څxgυxyKR(/}kA:6ZԖEhK"T.8SO6@}ռCz{6Q|1ILԠ^a˩&|PlM`I:9ڃvEGY}`5tòwaˁ02vW.hëLEM:R2]P,K.8=:	{p6wL mڿBV]qRmXS3٘\t=ڸ;YdTmpo_p&1@XS+#lc@ƴQx_1{|	z./5w:#PDJ FQ	ߋc86[i-h]xڲkyi&1m{z#t|# uV_QR9/@aˎ&>. ڛ#P] "v+!&#0Bk4娹4E[STMNk`\`b`f7.9{3x]eUoǣIckxrЍy-B͊
7n:6c!dgp	`9bYpkͯҷ|҅ ,/FX $N
~=Ĵm^j6p`Y,'\C#i	-2} w>DЉ~ŗJ Jg(3]HgQEMHJkU>#3%끮	-*f	q&AFuh פ"R7!֩R`Wd_j?U4,G܊o%W+g"5l=(	D؇TW5S{EΘ@?aSc$ŭ",
Tj8#?G~y?όeWsqf \y˵WpS\̤g{7~_-ɗ5h: ,Hjŭ`s]Xa+59!<& nΦ4,fNS?4klp2nĽ˂O@r1*kv޷6D9vJX 2^MݳE\H55qumU`O`G(m1Qzqz:8Wqat7m"T8mjQlB~\e_PvJĹق{"s19~#=`i]_=YfkzE%rxKb|N_r& NutFtBksV0=_'DD){c3JKX d՚8YYjLL2v+M\2}'IA1I:[2$UBV_OU.ⲅ
҂E깯aȔJfjc= - ms^f?5U%%qD^pj{=BbV%Xu=OcEt&_ttt@!xLbOԏ"7*#qW6HXýZ)H Pt]{b+FP\(eFJSd[ U+p]֏MDLXθ2; |t$eab[V˸DL!
VFGig㳹A(KNpOO%զRqu
lJ:`u!9/yUt4m;%P<x=]T5 =r XӋ.UxPWAF'wz}}6oHC!J)J%,9
Իpem)xfϒމ(*pgmR5	cNNZ\CMckȥ|Ku2+n),`r=	#Fh^lӂ;)skrmXD8cm=i97=;<|"Dޫ:QoSs!u[slONWdN='U#TyYJۏ\:cgcj7h;򿑐RZO~s_kAiٗ5_kW@.Fx,,W*_#;otQcmǔηjA)cyvlydVu1F FۂbCqwtt΅_8GGR	:,K ymaٵqW:#$9d#57, `!#MnhVq~1;
sv$}n֬B9ʾQ(3U G"x\ތp<zg)vdJ扭οdjXouLP;;Pb}Uv[V,r
$rX
{&>QVZe~ݽ!~!\T
H=K*^}>:m$׀/hZLВYWQ`xtxnhk?&pJ8Dn+,K Q҄q.{xfJ a'eUD-OxAC)熂Es\$=eO<f4TJeoL: 4Qu0rS|ÔOtzjzvtQ^\>H	+W;l$b֢#4P,--YrEԮ-r41I>sj?~^<
;qۮspgêٜtc|l9rv7O: H,:,M!lݑ;+ow01-LdfS	A ̑Bm.sr'
-CA<$Z>e;]qdcl|*Tjԫ$yk~Ү؊=*^[i|U{\;
$X*[֯Kq&~̯V/[d Kn3I܋ e\ڊzu9䕙6p/GޏJn5>l6'A7hQJ9obT3NA'RP2٧e?C35ЍT` 	6iDUv	wXy)#yס~~hmTf6ɆQύȠ_S~Ӗٰ+17?pxc34ř;cI;ps0MJ04T
uXRԑ-=kѮ(:_eC:i^!揁WYU4ҍ0Tu"W'5EM)ô:iPt6סFi06J"z3R>0Zs>g7 Gv[w;Po[ qpxE@Mӣ0,L5v3✶P]}1+*BRqy'6B.dl7(^4iږȞ#+w#y_)͌F13}ni?8>wq%]ɍ9%[cre\LCHTkaʕA f.Y72^opw8^cyfM^ϒCh5)rxtyB Ɩ>ħ+ElFy`]A&`N>vqz,ndM?SU.naTGEr	.XD9HZ=0)HD;׮(]!RdhdCGjQJDu:#1Z1"{{
$9wb|_8eD,m䨑cxWVf#8_>prj jbq%8r`hb(4PfP#k<pTo/Ƈ'n\gSdg6ŀ8hh⤸e:[jfA<r'C3p,P#d%]&9$gqbfF5	x~p9[KEknGx^oM,h,#'
{.4rU
5]LR,N\sS6M|ƕf1/\1v-V%̧	kɵ"UC)P
0?ϼ\P0g	הXIYqeiA\^~Nir~H,riՠ@)-kt+}AxNގͿ#O_gw`f	Ţ,-$!_*h:Dh;IwufۊBjf4!+ՋFDb	Jn33(M -\N	<U>/VP(59Tm.cbQfK|$U>_^c:YEx7aЂ!gwR-GJ8;CxܞB&(Z
I?ʠOc1,YX$!aob"p)ނǜຣl]\*t&8jxd'^'SȀ[\SF4lWע r$˛Q0ծKm=PP*tpx?&N{uG{oChA{~Jx tq.z(Fapn1ot0:@
F^6=L%I. -JRi"iP֣4|Z$Qx#HΰI#lȢVX@65F{{jj>rJ.pfpX  J*9'C6zkK',m¶M3n'8/#sw6ټ27Rᘹֵȁ?B_f+~yQ~\cm p;Ԗ_~xMD//Kߘ3Ys {ǩ$$y+2YX]
Ҳ.4^~dg©lcvo	Ĭgȣcsky`7?M8C}LuT-i(=' Zx fdy#7ҙ9e09 ;a?Sj5mX9{|)ڎnzbݥ/?2bIveQ!,LuC /`S71;xY"7﹯ilnvGEJ v9\,ybkg
[!7J?OC0z"&bD.nժax[p8-o'<3`tXPyPzCtC!9Ittoă"m9MemOg^Gɮ
z>JA{-#-b2gj&Aިk8s~7f 䫯jQiȕ!#0B șN.?A::"Ӓ{+H!8^l~mk@05:9!}xP߱!:[&},lNc!kP*0]2<@ٔ	k,/Zj}^Qqlh 5& DԌ{zYYY.#J8fƨXjx&A:P0  oS398(fVbDБne[W[H;W]"h/S魓g1g'.~Ω.;*{(?-2o"S]}-
%f=br	\*b[Ap8wx:ĵ~6|B@&YɪzW~4UAC .-	EOUC$ۂ1{;BՑQ߿QrtS@>Am.'0!ڿ*3R`eLe$NqIB/&l~`$g>2R.~J"ڰa GZ6E#(9TMdr,֮K2Ŭ~\oj<x%W	W(^*jyakC	Y+iX;;F8jGYHb]ak\hMDIx"Mw@:zX޾DI1^9'E8ɖS[5`JsgXLJ*Y09\2-MvC
hKIJ+%1|6AOwqjb[X5o TR&wXF eo^#u$7a6CNْKp6eozKC$bQ?%Tu3g05G{nu37d;``mVPMq2FיmExԏܫôفKw!QGv~dw05 $*FN)s
,pt'X,GMkc[yj2g樊}{m48E0:DЩJTUqg,`_]Dh}6	Ɲue5T9Eof}P0+c.ڏX 44Jŝ*[F
ҏ=Ǡj5
VT
gBr^BBAHiI[z)A3%YT.KE%T$ĥe)5ungma|b `4dVlRኽ{̇M@tٻX|cPMUC%kl) GXjY/Б^ןqea#'pMoWaU_ {~8+3p98x<Nw;VndEгMR
fjh&ZB 58}8KD}1:Ax+TmI[׏H@,R/=\LM1-Ώq酑uo|x]%krSXn]T2x':NDGbc{dÍ˃̦Yq,+;~׫*6"PJǱGNfUY"P}!
.JQPQ+8Bc1AlLT4/#uV&&T#٧jF릒ZȖO!5	g߂RT(UjD4E:@eԂ{ Jl@&pQLVcԇlB{} G([Wm\;VS	r?6Fv=׋-7MNNGӟZ4~%t2m&nPR}dR{HYzozEUim3',7ΠNx|%ƵL,E]2L9p(U8.$#dGՅ߲$wO>FcsyQT } OVTiY6W-:IBu}\52>(#]d?\?qP*Tl~xbZ
.)tkww,ɺbwq6g	ڠ
[<YzchurX4b|l좜S
cŴO:0~x=5PhG5ZhM;k4/l-|"CwhȤUi6Z^S˖tI>|5BT.G^5,#\ک:%\Jƒq.,GW,iȸQ
P>tLi)NgDA˕M>MlĻ(<^jKa\Y/AS&U}ibWqK*
eu_a]tSxIEC$rՏZ7wm@ Y&y6tCM藰QFRX	>(q 60RCd{bFmaNe`6(qtq8c}ѽYiBJTn"?rpeNlu7L{,!Γ܊9</N>'q.DYu.8L$"_S;6}`㧪˶(
!-DsSAK EU⠅tXa+A1qMPfuI<ZE{ \h±[*: w\kޱ]Xť0 B?ه=
2ڐ-oy(4.Wt#ud]xʢb5yuޅ@ߗL8ebrʐ|R\nn6P.@̓22g3e.)Fx@7EP@Q[A= mh*BXXӢ1`))*]\v>uwax52`B-Xi,	N
	MBQeY
3`egRYlcWmMDma$x(य़Dh|]'b#ȻGN=YelsXU'78TkcGs5KaHE- S5<3H]UcMiygh}C%Sd7PYϳtQVeyRn@E+sθ u｟i`Y7v8,YVlcК2g@em,x=D#aW/dCiT@58ҭuˮ&)J+,5u,#
*С>tdQՓ r(VsF?zG0Z9t=û&:@u ůY״wKFW,a.Tc'x7aado'mmR	U]Ǻl[e'"Q&d΁aqq$+Kll,`J
Z$K[݃ol.6J	sBt#,Kho㤠7p8ITb680C9{fA6uD*Sjw]r<eFuF<,;b"_ kFR>5rGGs-q:'ۀ4OJb/oвXb	B).-MsoInIdj@@ ZF4b6m'PCBAU%B&kdgPm#\
+)VJЖ&c\fki.Oh̴?k-@6OaB-ؚ{ VC#`[9%8r}GAskDJr{B#,{8MH*iLqwֵgͫgbp=eQexoaW3CɴgymR+KkG:Ep@:UL+vvpÉX%K7{鐣"kz}X8PU鯅LV'jnp31zs=g	nwL9`X,+dqf'uB
y}T?Roh~dte+۹ Y?ON#q+B֍FkLBI`ld)0F҄ȟBhﶬr.2wG-G: *-ޱ9Uf7Ķbž~95T򍫅KU~@(#\bKcEY1n</Gn,at*Ťf'Fam=I@9|aE/eh# 8xK^ۋu3=`IғE*=&aC&׃g6qoC-KxGz]1uGth|3؜PH8%n̓Ba:MKmFߺ>A]4ڪ9*6AKLDHP8kҖ<0T㧊pmI,B'n@N*QLPa#Aԟ/jL!?|h@6G6u۱SfH\`k%V(aMF#sss~,:[5'fo`ӯƻL5<W9[j_FS.uf\ш]%kޓ??RrJ8F51?#ihU']`VP:_جS	cǍ$r˭JjZƶBd4?eZ_6͍P5xl4
Wbhoe0XNݗhF$OSI̗ʍhI<eύS=,VD<f1@G:([S@Bkd'RMtE_$FAxw2KLA;Ҏ
@}ˁP܉p)?W/ٻMD5|ݲ}%Hx-Y4JCfaw^1ѭTDdP<Ç%?vTdC%2K!ZH&|-rS8ڤtl"`"XèiAiZSN\XGt,' nmY~u-
YcvKPu[eL!+*|FctT#qCIvِ#vf>&g6j^eqߘ$!
\Pw2]S-=BSѬ$T>6"~RȮ 	mW NL1jS4MUg[M~|;Dk
DJlwq7.nݪ{\[ֹu(pA%CPFPi^WKkԄ778==;9\`18I9ccyB\PTd6GH"+,ھn^;0a)zmMo-ڠo[Zl	\dsv_N6cƀ}Nλb	Rmw*>6\
5-tw+2LTIpZ$r g9(>DŘǰ^Yn?&YǏ5U?1(+}x5֝a=7J-npR+76T-#K'[3D*zxe=[8f梬< M$OD44 ~`RWl֕ӈ\AybWj
>"B9fVJ@'#XԈJêQk_(FsT`v	7YL41ҹz(ràdH=jqUqE?.?)Ksxӗ-@ѵFr?Q-Q8Ձ>ӸII:a
jWuNCbH,,OxH>*ķ|aF_KYԤIJh᜵mC-0N ch-LNEqm0!JvngJ͸dMMEb3>ڌ~Er4yedzK:s:WUK?Kot&$/[F
`gh96HJQNqp Z(8|X\pso
ؑ=}!@Dd}=ڂΐ܉\]+=A3JP6Ww9%T&DjÐ!hd-ha[:~	{::ߤ(P\o|cK,.~!zÓipI9t\\a#W b;`F~-s{&aE
]O9vJXHcu=i|N~1b;tM#/Vp8vݓßt;>^'F4㣂إ=60KËca-}&,;	`8z3)ﶷw#.s:}gWr/gBJ@((`уHzjAC։@ ˅u)(nnIbv̴إg_7N{\
>o<^*`&_2-p'uADoEPcZRMIU{`:dQ;IY4ypp8-~A@r:xS\Q3hHbi^LiUGA<]DLLmJ.VVfjlQ%sD[s1Ύs+ϲ0"0;xZpK!=E؛|Mᘥh9j
G9Kd!HoY~k}>0|WL%֘1m|TɲbeH67̫ńY Oj+/G\!MZ*챩1ʭHɬvh npU=}Vi<;/9ԉzznL
e-/7_$0@0*[F!Gh)xRV;mtyQйΌ`Znʖ,VYi'oP|N!oau;xT5 P]AEZ>Jo	}<;2,v;5ڌZR6 |UڜJx5R̛>ԊݸRI'ԦP[T2@b1T?y|#
f^W9lXY0nU);?eɾHx}kuƎ)5vډ
 ;x92Cq-޳Y	;ܛ"ΉDqcEE%rO[aU-G\;K?T?~CΌj+X##{^@6qMPv]wl:|?]sx. mFu
K1Ry Zɼ|HxK<[p,|hSe^]!ҋ
t9?3Df6Yt3ku,ZUK1'yG?2tdlJP|<$㈪k{>D8 1#	O%_$7_dnPI&Cw*O*`Xa/v*WeTqL};õPr((z5drKZ*IgRBp
 T>Y!dA$#@\&L%Bi׌+Z([%JaߡFb,g^m(e08$pvܪ3o#76uU=&J')7`* Sج~Neq'&Ny'0cμz:K.+r.`,~L5&jWPEW%ՄW?v@ηӱ/é85;S%pz߰X;:'ZqjFy?t*lErߛcE솭N^㜰U$]!)o÷9feܶU_\`.cXL{ZŔ
?J^$xnLݼN{7IW!ɩHK:,Ý\̖fLoD]{1lo3SbJ1cOX߁Z71-!ۿ-
{MUPglFhYT uB0SF#phU0Vh*f<K=!|NxҬQ/T<bEg^Em[bS<p9 ;zFfNQ;)8KZ 9K!frl5)6aTm뻳5j^RWu1#?IPHZC?q*l"l-<?;i`/W?3S꺏O.X1|a`[z`,03*A)SsGa`oͥ9_҇'}e=x>j@lXC?^ 3c).Li=jư,~jlVf*BDZOEö@7URj`",6PEbZ,7[]hd%cq6FH-l$Ϸ=Ő쵩_<,)K.$ȕ`r>iMZʽW5
܍C%ע?pDL%}8H:M_WҞwi~5en%IRG:0TE{!}]WBȮ(큛`τ^@HIS`ȥn7}t~أtuF\tAK Q4Ezzi{bzaF(
};#==N&-x̺d}-nu}1#KϦef3*~>y.\f֘[w?R"կeO9:3]Q:Uwwܪnܪ׮JzkGUm7*0PcNuXUEeN̛&*1qQKȒU ǘx+iQG=p'!(	G>k@@˺j2YʌDVʍmC*-dl˖ӫׯX?dV1\&]JB-^*2WM!ie2۶@0Ybu
i&$FƑXm[2@ݨ69ZZg%""aJD Yc|itկ"⭄NCbT4w.⟋{ɩ~W+
"@8*J L@wWÄ&xlX
ٞQBŲ;סd	HlN=`<iJmEM;h@0QDrA(LW+6Hta B	/shx;1X*׽=(8*ʩ"Kw2ƣis~]-`1@K*P*%3e7 XJ,SU,U."T΂BXX!dQ]!4Iifۘѳwz:8p5F{Dӫ5@wUG[Z{]O͹b븺ɪR0,ιą[<.Uq-,i҈F=.y5rWnV˚y6?|O+Z,c+IX(Gu9kO)XyhKbfedvf^ivEv^@q`]=v{mf9OfI5Skz	ҸGGnW̜*3~njR(u)dOu|^l'˷>sFdL:L?ABe	,\JUIb![ŭ3VU#T?s6Wgn_3Wk ܛ.u6$ZJͫZ_MK#7-iVQ#&]6ʧQ%0[j6VV-Wi>Vf0aqc$,4nI--zi^S Ѭ90	Z#DEV7J_{{qImA=τKUew
r+2/9΄Fn&8]TOڌړ?yyY l/}YQY-ACe(rB_UVj{A"͋2lyX\	[dxDP}^lU1сp,ELPVJI;!pKRpr`mD(r?.n~Tw#AH<FŐJYQOhWTpÕޏG1x!o ]D!JSx/Ph=Z%0w:+7/(,#:BsMM?g{.-hؗ23ϣGYrc	#{LL*UPEjd^ Hc+fT	>Pgmb}A'+).k
sk@=SȃAfދj@T_lПa0Gߩ~6VDژ# !8!/c cArŏIW]-U|ƨUH:VsV}lJh<Õf"fJX/\$	+xkkKcj1[=V
YoޏSԬayzG?w{A||.)*+l0Tu٨:
W1	Sur,,ob3t
DZjϗnŒ?Ӻ;ȧBK8l)~
Hj*,jA3eX`p8]&*gPjx;Yt
zت\ᨘSw1C&^,]
ם\)+pAf$o(6KAS":%e,y. _nD%mP1-0Xwg;*/<L[/I eRE-PIá]a3U4-񺙘{B\ VրD_5ew BcHfN_yLiRRe._ӵXOPHx'2S02\i2B_-yyVMsviO7@7.
Y[l-^;\<F	^-UU*gtĂl8ܢSąmD;\Дq+O]jZW'	:p'2UISyIx7gi)2Nr'9]I k˪EٟSe}a%cQ̾5{T*	dᶼ*@/KWzQ_{/#[i䰻>u_yI"{X#.w9^}mCriF꿒L^XT1R9xI9p{Y"[z ~dj	%%UV$$qMbL1e{̞-,;zfLmu6d2A(6r[.y#@#o	%
N3XmU+Q vOTYgqTַî,ڠƀz'}TAKj1*SgvVLm5ZH~!,:(EETCfrMYx\:Ⰰ\*`#'g21Z0BvL(Ưh&V:j;&F}.k(t([Emdrg?KbGjN<wo^Ei٤q[QBdjևI3H~
 
<'٤IȰR|
}ē=:sL[uݺ4ĐqSׁõxazcT!]gxᑏBUuF(zzŹMf~nĝ8^N2`?  <3}iAeGQt;}
f 2~iĺmF6?D4^EZS&D*\LZ#ŶtVRj3%,sQ'UqT̟"`&ȚuDɍ2o15'+@L׉g$h񌞮h'C$\<7ΏbyÓIPL/QR&"EÓpd"_
Қ
6q.
ޜ-N+^Qr?'
	..CJÔ	g	Kl}W9H(0fE,猁L- =V
^fZ eȸ8m>v'!o[WR̥!I3Xuθ@U(­gZMH5۪eҚO3>gP*.ȇ!n$27(|x~Nt˹`I[|xNKW*Wmhå
rX(o=Ǝx#7 ^A%QassO/XKT
R2nl$V7T\Z&,Xl<p98,t]y<vNh(ݯ(_Uh,.`%٘\Pte S".l,o0e]<֖76$:zZ&\``.X(m8+^@$GFI $}ՂpI_o9ԅʦ	V~qvSvyQnבW%ٞR?)Hɵ%dGCGO٣QT(kc{7_RW[-߇[ٱJb3YM.PRܑhpeb~Xy#nl cnIŎ#JeAbMd97!E,TDaXB;I
<B[NE>2:5jFGOXu |"+K`Agfҕ*@F.oHK5a8=cuiCo-s/:B2_QLTg:}W
SyxМ3A8!0*· 20Vm2q0XAvz@X.i`CbvEkSU/rꘗ!4U`v=c-U93 zj5( NT^fd\N\X
i͋U(莊UWt8̙~roobz"7} yr#TH3s1! zFCآ/[wHhmdޠWBܲZ_o@<|dEŘKGWХo	,zjY9S3;ZwPg9Næ(-%B/]-U|u!kaE[*ԑqq_]Af:7%9;.ldCB$9039H#>6|Ѽ0(*D+j4kA6L[\ˠ`-#pg[-dGpr"fo{{?p u]<@4 6]y49E?b^sע٭ofYyLV0yVLoS	6z}$Yv[m}WAdu5aQSw§ȇ>ci>&CJ_[ϱ\!#ɱ"f1e+A9<~G-w)BśAT[,ChpaEr.bb+"µ/^)(!V[ 0p[ѢH}:#8Hs.8p~+I^鞔y$'c$3K--g0LHxQ.8raB`O
wP,@-P&+%ԉ#zܥMVB7D)}8ͩw<2FaF[^y[I׋=<N]` E)̿io:PEJHxc\u=yeAԆ%/jYn)?|S~d,3ݱ؅\RFIOVlw )γV(ɘ,-$v0ڴ8'ER۟ӕbXQfФx`)",tu,2]v 
=ߓly[,~*!H\pf*Bjbfw+è,wZ$t] zFGwóްIӘojK	j6F+֢]
X;
		ɴZ,$C uu5ܙ
A^fD­Ǭ_E
$ywKW;8QP)s}S$-_ dY.衊,Ug Ӝw̓Qdf);biOKS9QmeY=+@J5?(ak֏}b+7dWѢOw>],$ S/JmbʤKMFcVyHj$E8my6#ZkB[8/]l7Z˜ʨ\@^{	'6:Q
_p2\G-C=3(Zj0[UEWⰞ^nabԥZՊ<tk c1'%cI%'TԾ(@ƭh,A:E2uua^'8oY%,	w%%72O@dI/YVJDDt~ir߷Iò7ZV"nPVaW19M/JG$ZLH@)īTzq_ymvGS#>DMJckPV/sz5tQ2xq^F7żFe67Xz:qe2ܕ(3x%4 RG whC HafQ/VOq(C_ <(msz]
?*#Ȯp%quAc9
f2$U~U|΅N."պ%vT>;0a1(rDjd pl`Ս}uU#׆1`D5Z :H_V $KAfZTTZǹUcr:WD}<$mCl?0@yI$m8sb1R~_ka2@Kū?ewǸGגܒ<pLL)qX%(IdXΥðL		q%>FZi,%.X6<ڠαsmѩ\g;6܆8yҌ;s`2Jp3S
*gJHT(}N|x*u!GH!2Urp*;^ڷIޢmɠBAݰ.Yj(~(R=q^ddq+b>FCS|V_ݶ	9?ȶpZ!W=Vf %&Z9UHM|VŵZ>h)Mz'eۡkNeNA;	evٓ}PW9NdQqGǃi~߷Џn{U|HA͕ + _Ĩ|t'ribjeDuS.^x'J7Ism?#	^D.9s_<XRZ+q|t J=m\(.@n6#FY6\M̚I.U~1Q~rְ',`4I4XR#!qugZJl9_3fP8Y@4@îp_@~]y)坏RffU*jBX2pxqD]i6mPHAddPZI+s{PV癕KN!Υu2, i _wtTë_.K,Jkt=?]fn9BUh_7"F*C:5Q$kV0Əup6m-\NyخdoKe-]W	lu1GH`a[o>ЫPWk=ܫ-CsgwשQomZ3pp8꺎LMub(%~)RvTUF\,t]8'Uyͬw|géTkfC)e\~e̩y+R5TTµkؖ^a !R)va5IՏx J-tѸeՍ^w+;Vp[cIjKE]bXٚ0]]>̵|0|OPN{Qh-tͯ^UѬL2A4%:ق ʱwpqc+{Z[/5rX/USY.вJ@G8Ջ\eNu"7&qKaǡcܧ6	VH 6~^G+,K-Z|yg [Xi[b+l
ũNM	c3\|&SDHV3C
LmFa"cP1% &.-	~@_Ĉ{^h'$G)e&m}@mtWtZu+QO|(obcWjZ=j	WrАIqṁ6FGEdҠJ4"9_6[ߗ[1d$~XiqagЪRp!m2/1
F$qo^<9C9a㓏TT_z1S+ _U'a{jO}Cfa`ѓ#({`GS",Rʗ*%ӽxg5	VJRݕڂǤ֜1ÇD.ITLq[F*5!oY"8\ŘfX>8Џ>PyМQ%35Ѱ*)ES9,e~	%¨<\wQvlX%@6)X_r4)'
\RWz@7h y%ʽҨ[7!t+$ilKJ"*4T#j"[ȭuDmAb0E08. KloUͭPޏ8HlJ15#s{;YƮwT@dG^pWGXc0}0Ž?z75a&:?w˫ߞ!YTƇZ$=*SOt:k:2eMfL>yp2W"x7<EVl[*9MK\7TJׄ+*
2bt+hcV
̚EM49i	5-9de]Bf~8`V{rW_B&h),ה`nJpbN`~O̜rN*ߧ|53ur/<k ư,<iZ/]dl8%ݳ>dRQtUsX4۪k}Zvbܺ;04xa[hsz+pH{I~;^K7䜭8發\f/+C5vw"\2HWf!̧FC=07- >`_V6+W\IOqH斨3emXKL_>.x{uc=u5\Rlօ,lՌҗu\\{Fc2pCqwfT@PZ/ڰ*$
i8YVY/-Sb<"aXS nAN27^$+4¹;͑9]x7#Ft+U
=,+:יp D
x۠7י#B4sUu$)@#׏eedT:)@h`JWÝA7?G."OMĞ[˙05HޚN$);4))[di9/	 tysTjܡn$:y%1^7ʎ	50X1E}GdvV0,-%KIUu[V1r
q}@?s7([:_;'Ņ$/P3̌DRsq;͑Gyܩ*ǟ@
_Xݺ3L/HrzPJCU\z 2`4= "CCOl>qfbc8XI8Aˍf x<xUM7#щ˜.'W{+'ZrHցt"A0*աc|[ 1՘~%oӅai&W-/D:MKksR@9jyrWωjAGdx`u ѕ7'7NL.WKs!y$443a8Cr0Z˵-nt2@k'|^e;"9GBm>| ܍2",IW̱t̮TlU>óA7F}cyk)-gU_H>&M0|0V˒^Hjϣhmtwvjq<X:"-4\IژsFM8!kVC[2ˆPE7\Glyx&j[]-Ms7U|qT($M˹ 2#Nuwo9;A&?AvJׅPT}gɼRZl.;@
J3UQݱj>{7`-oPV~{B+罼MؐbR+OZf2hp18`*Q\a1ўСUFi52ŻAhn"V'oݶST+㏫Fם%޾y	񼠤CI@7{oQN p1MC#7>E<v]0woܒ!^#Ln&/u}PI ߥ2%׷h,Nh[4>(	Ȏ¾CP:dwBGGΜ1<&OBX^ZVM@8ε}}Jcp0 G6p|N]u
ŷRTVyeG*ZPPL_ (yyM }%2Nhni"eWpX,M.:dQ{ 6&\b_<V7Xq7Nv7҅caZR-ÿԩ$/f	sYTJF%6Io(&19-%mwgD̚WmH=jupK'M¾+0?7 rmaߎtS%0GTgϰwC|FZ-75x,QlcC6~ :.(VWm!IL0c霳<c<ۋT˳RMDb|@Ţ[{aùPC3JՑW$Uzre
'4-H'uxid>A^T^AG9^`2%-pyn;#d _xS|E]|}U'ՏOPX_u/O ,Pu}b$|c=AWtK>?Cʻ,Ťc[Eu2TRDbǷ3zMⳊN!UV&-Zd$ϻ͙NWPh)Z!B	.#|yO9~"#|lbI2eScv-%?91sŜqkHuDJI-^;)T)ۘd8d-LU1WO믁)G/Bjֳ83qGMb}Txǣ؆`y#FG tyb
D
l]Fct$tfybe ۠2aIO*`.KPj:i|N]j
Cډgptn U
&o[wWܰ2}~a>EA$t{T |$Cn%[aM
pۀH.S*l#QsUf=ŭ~.
wrf#hFΤCЯI&j=Yț2KfexUD3Q'zX)UX9yأK_{ݺy=wNINZl2U>"'ITi&@~Jvpް6:Ǆ6݊nt(GhYPKfXwӘmӜXN#xćq޾BlǑ͌PKC~kFam;<ť?;[O׺VBS}m^sa 3"c;YVs4o6ҡE:;n݀&AGl<w3{YShDLA/u
ނW|yiV\wLSЃ 6˗y:[,U/n ^SGeB̅<CԏB'P^ hV܉+âՖrΡR?ɞ3737I!)6XB;r]Z:u>rAwY!e$ģ;d_M#ϓ*a͈^PHT*ZS1PO!2BCNeB0	xP" S0L waө߫s(q.`LNQs53`QX>`+j"6X.)P:^G"38åE9JPQHAӜvGd9f+KKԥl7+"gra`/V38u%(Y~Sz?fO.~L6E!2B3FXr5,`RPOtn(#n^gyᖭ%/m;i`f;U+55Yg :XH] 6nTG5Ѓp׋WEي3[zr;htT3c-{G4-YXw9?trTA/\`AlQje(0;/̗rifP^"A&4a;Fp^s~e郅ߟ(RpYpc8v|~e#mbڊɓhWD4b*kIRVC(#ƫB,њl]-<CS$FQ{}IH_'8")OHl54,Էh5bpzc9&mo/=jc3Aw6-.ctU,dIY1	5J2LA<G2`װbPe yIN,gGqU_7e*Aj(=:tZ;`NxRRԸz5xF)|z_ݪ;?;b4WЊTM\W[nhQk>|NN#{!l0u+Z&7&]Zxgb\/!Ygf\W̊Wt	t?P_ӕʩ0ٴ{>Vژ	row,%F l\g)\-`JHtř00wpbbȸlaKjM)(֓{R|sɦ*I4^:_]m,u3 >]Xps#z!80+kvn1]:y(]O(]ŷKYio?Mmi9	hB)IX͛Mg띠;oJ/Q3v;Ą݅WۅQ+PELqsRaJѩ#|Ȭ=R
!MbA@dG4x;͸yc+xjE^G,[l{O%yQ0CAۧY8?uJᒸOK)FVxMJJr`:s.¡RFa87}T*NE#Yl?j&ٱaŶUDےpK'Pd7`y[dzxɄ<cg"1=L*Ι+ \DȆC{|CWIqk>]nkdŉwB(ÌZ1㐋il"d̞䅶3sveUŘtSU	9O-KZNo6DD	Rpme`A{GI&Ww^^Brbla[z"`3B!IVjP(g
t2Hj.=Yb.8|??rsԬJj93ޜ{Qo?ȝ_if(,| t6%Yx<Wq*\H10ʋy"Y;t?;s aF~Owi|\NnNS؆2ۛ޾c->#Hڀ< g3/l
d \0tbUXoBwx$yh"yl<xyցcRJ:B!r,MN̸ FXزfsKPWa,R[荠"$j.\%`ofk' ]޹^XE'3eXJ6NA\r)aJj&M>D[%F}SnE4aNc:YiX-6rvE-Ӌ=:G3w/+fUuj;h6Uv33B#88Y.Hm[Qi;zJV so-KNO"ZyGK ӊT*4$eڧ/xvۢjM>!oEk<3\ӭ92p2XG촼boR58c-2B WVʧJѧ<WQ-{a? _YFV<z%֍L>B#лp<d|?rL)=s-	3M1\ -)dm-xltJICeuucimEJ&)m3(0뷕P-w#`Ϳ%˰lG@L]<W4g|o%,^ӿtW댿
^z-[?ڵV/f?C<	 QXnPc	~ |[ÅYKbܪnн:_3:p?8bĩ/V#-C|\y%t[tq 3E&f 9s#{F	js,~ﶷwjQm[Lbٳfݳ:E+1

f`=9YcGV|bQEKd*([0x?DC= )|{Ӈd#sl99M(63$u jٝ\/fK*<qm ܋{I#Xf\Z6V>4̓Urd4U<
_'~w\=a|NPCD׈00~CtCxԃV@XzJ`LKG;oĺث,;D]̺Ia	26	l)ؼJَQ9w7O߽;R}BtÑUdB}5o1YE e6A=`8D*Joz\C*bWߙy4`6٩`'Jy&kfeb-TJ
Vlw{[?K$#vyDc`G#%i! 	bS'vnһfuczvd|sF5>Vz.x_)'BeN	ko47ac*7s,漢22\ݕҾdOOw6w-;Ͼ}gJf"|wfv_دmQ.7UnpV Ռ%<ߌ{%(JvLN!&r2
O9 ЧY\Io/l;z=<Suݬ-шϿ}n(x̳ג̦S<za	fM
}Vk`;wSV!pYh0p<҅3d\n
K&ҺȜh8e%m=M)XC/WoPQqΎO_}?'j*'x3Kwٵ`&6>آDF..S̮.Vxw,it5bf̯M\})܊M9/L!/BDVpP6H<A,FQ%5ė@C"KMQ2~{aZNx.*}u^A[އIRq)QaSIq&Y$F
,\Zrjk)uE\ txPdBz%.=p|Be eKW"@Z67 Aygx
u/.k!y)&zHudpvNj8&[Zax<_@HZhCOlI8It|]ç֍!Pr.%V7
Ic?E7HvvĹ>cg7dra[U9z$)Eb?:9IUl|ʊ͙:e	zQ(@XFs\9^XkGs۪ӳl>{ͷ/!ၘRCApt{k9	֛\	v~GzUlm%ǫLjZ\OЉ6F<{zQ@iڜwF3ؽNao<e 2r5$_6q9(lQIM_J8s~jYڃ%TTo{2vin3u6e%ņ&p 5
o]MtG#(/zՎ,rlГ1Zv9ݞMCi6R M?4L̷ge 
,8l"2+Ƀ=F~U^AbZ'tOXju4~7mpV.UЍPL|uJ<eܵֈv8ME(r[M8+2"d?Q|_ps=0dWNu򌗘ՂF	]Е"ZO6Q	QDX!sjDIg,dbb04r9ה7cEn_1E
AUҸY*z&˺1-E`9s͹)54z
Jp¯! f5bF@'7YD$"Z&r6l1 z\ýwaᏏ@Ӓr|.r0!#bі8Tb:F1zKK@8[?-q	X`O'DxeqEĜB
#E%_]H"'eh<%&mNE[%/vۍKHtlqP!aP1YGIIHMk6<'&n-5nb[xtjFHtCA7kE7ahq}mo~lfXl9HW<5<MWBfQ\m|QBo,X.rYʜ)7zP.s/(˾RcxU7ɦd&ĹRͲNo9^P~|yLhbĀCu/ei`D{w~^W:E0yj 1u&]x1grESdMtZF4.Y8wYZ}]Sa=]yʈ*?-/bnk0EߛN(pL2)^LT;U+)[јY#"Sn'ufht.rEmJ)!6vl*
w1;;_=[EsZv\uG޹QOҦjN;;<ιtu;~nж{V.~Zm#[׃vɫƍ2]}pŖ[Jɏ?7=|?	TQmmo~>'LsBvt(B`}>|n)|oAC:7zS i?m(_6bLm.QP$gt[32ύ2sn!`yJ("Ѿ`OֻTq.k|8_"~&9g`^faC$sOMũ0͆Lq{VdՀ *YuV;2O_<p:|y5o>ڵ# \(Dlq(W'ۿ|&,/lv9sOZqXhK>.q'lq¢y+NWY
 Ȳ"W8t2`a*Oy\l9rsGRYw )ݰ/n/vͳ8qs|㖫=`$X7[
CL! G]޴%	ucÌi,%Q	1 d*Lki-6Qe??"M/3(yЂǇ]F7[YAUh?y
'x
\umo*'b-y׮MY=Fp'Yl`kq,%Y6CF!:fg3WRzC4Zb7!۫>~mݙ|?~{~צ/!	fMPloXk:G]61-Ǵs"|CSÒ߃%u0ł
Mxs̂dHFޣ{ T ݁lK4^6T1^3OňZt$"(0Y`Q^Kո9Gqnjr_]gg\{nG̸MF}_s C
$r *{l16!?$$XZ3$&܈#o-0cΥ:r~+5ݤ.2Q6-*Xvu97\oS(n]qe9b py#4-JAj>/qkk.Cfj1*\/Bƫ6j#Y|n	xӷvwswwtuN	X1ʰs/I5Ȩ`X[ߛrٌ|`8S٫m!sp'p㸪TE^mTÈzG~7O5kQCNYHdjw]2b;N^n;8:yM&^dOIu,Xv]Yta` )!$<2Ey_%qzGGRAA	wr]At=H݄*2<NlBU4Hb%mݙ5>{
Obuuĝ`|u2L7.Z!!o
U܈C.1[]1Hw >2I Ί~KE 1ڸ[tF	COԹ@/64®c*v%6zk(bi!̀>2׿TҫGfa3/RkddRjM؄;1$qOyksU}j}Ya_HTQ$V']OY6^Zx`ؼ*f|\+C2hww6{UIqcg{=;s=a?R!;@ g [FcZpI%PƔ} 8)ӌ1,q2&ОYHM6z3d=99
?1qsU?:Lbf-,_θ>58c!oqYp	A=E(XH^eA{9Jg}p@'8uJn5hK'm⭥X(}	Bו"e|Ano	} <^}hP]`Xb!m`1W<|I^"0LkO*zrV0ިH o;ڝ+TB0$ʬ{h}89!BjẠBbt8R'd`0d	°Dl3PI fI%CsOA7ߠ#	kE; Ҝz;0d*Gxd+CdTHiaΦsљIM fgsdɷD	d=)>eGJzJ|\W704:YkðGep"c6u_ Ks}(_2(!SWhpEq0|#F EEK*,F@(aSse"O쨡N@"_F.3+]sO1wLs3SbJ@ɱ:uȔ_I5'x5s0힟LzzU\=l<019]CTC^NbśVA$k;6a,a8ҔK65Y~WH}АVJWi`ZR\]FsqE8(M &0c!~ЅBmhF~f|C/u E]o!\e<
!UF	fdNiqqjLmmQ2  jڵ}Dr.v_?:{-bngkYmwa]#^ӈR/ױ3J		E<sL&ыf&!I1\:)$Nk/MR%	ws)rENRvWɃ 	ͽz4&6y\cgYCY:VŴ&`ei8y >#6h0(/fZAl;&H>.>J35g\BgD]!{zWc'TILkC`Q9vRR}R(O0&*aItl?gEz<lLv/Jawwn7 Z;+1Y>4$i6uXs}T"/paW<V\ř$-~+NZHX(sI\6d	Nt@eU>4u:]|ȧ~:&NzXS{86VKd,(&$´O{l@C CY "ɕ Ͼ+3 Q2A͋p
 vHɢDSq |O("/Fv!=p%ɀh\ 44ԐL	Fz4=vEB<.%cDu[ KYa@]0U+?%&raP)=j0f/
Ŏ=&>$m }5' Bd*m_e-;uyfhޡ@\3R;bmmx-q{2R0DŦh{~twk'jw<7~'rIV7Iuu8R㶸pϷ4uIz:6}WF$POTo䦚Ňqlf$!Qnt7QChW^ѡ؂`|I T@rmZ`o|yĜ2=,ZHR
R!9Ӓz 7	l ^xF[gKi+Áoj({SLrNME$D -a϶_H-cPJFR+] 22vd Krt. 5A(I&I׫gboyfv1徭6:O#wY}G$C#dsO4aé|f[7	Ň6^Y.񱰧[6	
-&KP"q֌
Sc{fBZ	Έfd ĂA9:aKۦb<a,c0tl5$̗H!14y6D}"){
6	5#ßFeۈū	THBmTӐ:%->0LW$=Ǒ3%)FmΦ呪%eAMb4/	,hc99C%I+-yy"S/Vp=@ G%ᩚEp^Џ<gSM5mUlzfRFl/-9 7J7-O9uCc02s
٣<r)|u- 'kHCKGQX$*YSfdD
ToҲA"sEKM>!!+Ӽ=OÄsl(dP:7Jƽ^n]m 	+'P-fgA^_?^ix3BudziV.Q<~!s
G:9ٔ`i{/z$B9a8z[/dj	#Ҳ,9Ya'؍WGeO 
?ЋNU)O0]gx%֧wOScSY/[TL1
w*<,#z;0d:鱦Ǟlv6UjGQ>ɋb5%'/#g~ '[[,Wh4Us[_]_&s?eknuMD2ǈ3y'-	UBA6ךT8moi#ё3|T;8>m`Vզfk%7ŽFٰn!xGJ_rѻ_PKܿxR_*~DWh.Ŋq^,]~|eF?{G*U?;5[֮NSбy[iG|[N.B[?׭{S{V/k~^+wx6쿫mn&~>2tpxSmko/w=wkx{94;;5li#`cGֻ^Bw<llKC6[?)Y*z{}=8mZ]o/;{06e{ԓmj[bko/	ʴ׍ش0o֍.'z{5<}ߺy<iAABk\>y{?j6~z_[bG{K޴Ο%d?l7^7]:h$Z{{yP^yoo/A4<񍿗|>P{{?^7O}:V?Q[0Ͽ)Yz{S?r 
ԷjoMk_흝6HO{ȱi-z	Z7odH^5~q~`/	>5iQ^x{y?m9^x{y|}ΌXp^tOGŷ9nd/<;~JjU|ty;o/TVf~>Ӧ^Ƴ󝷗ozǽS)dk%Gez#woVC!S#QAuƻagQn_ws9|??h;>}'gMteζQIrhO#o/.mXs2j}v|(;|QdǷ4iK<9Fv-˄^ܠvYg	KD۷4/nuǷx`>4\hǷ@^!vX?V;5Xv|oeF`{ʝN3F}^x;|a>F44RAaw{iaN>\9o_sevA>}[{9lblcHiCko/iCko/v5XC*|o&fǷlңwM}WiߗPJ4;GJ8նMhm;}F$#ye<mZF+o7v|Q ;~wu,][yc/F[[7} !3jF}Fڎoi3ef~Ƿ5+;̲ȱ}zoS;睹o#evuvӅAu"o4zw|5Fcn־=^Ym@ɯlր C(i~~gXy֬|Q<h9-0sLL y r{'?rK)qMp	c07 b~b5q$V/2XD0 u?иJA/޸-/
s6k!TKHk,r<0[#;~w7yŀKg)_ְb?2{w7{:n62mn0M+4{!X
#}D}ȟJe9M r/W&AG&>Q΃*AbĞk;AT[#U0@?R?|!(h+S[QvN [dMϟU
QqXgW3¤eYd5'jQ9A{TtHJަmV4^XI(E12Od*r.ըՠg#)b{%&]K1xa;9{oFKv1rԝ!e/KBzM5 @U~dgu/UZ|堣 Cfꅫqޏjz\D*]ӂN"RW ~u0nX;j
P]L( Z_hN·#9_jJ;Wd	LWzUՖP{Zz-;Hud9&HFdӤe*`+M[LJ^=
;V*\]^f7o捱MVԖyg$7.	PtأtHԉg6\Lzfi84KgU[S)gz+/VPj6Ix㘫,4Lyg.g\
%%we\mm(VB-237u٘
<dG6$t56f'alnF`̛FXrE1fņu+{8~m;>0pp:<[_A?P;o_ BJr&' OU8Շx1vRcLB@Og荪ŊWmaCP#[x{sP1B5ya֎dH_Kg`[.DPIlRdt9+.~#D~t`ptz7:;uEW-
vmHByBa_UȂۂً?#D1љ?ZkLCu̿ߛ}bxz=c1A>M8?4y.K'-ˤQ5׽(y`!@D.^rw/in~is	݌{0$BB_wN^Jn|]_Nt$'}3¯`f`$_/3BnyCsWtqUnT8(%AM27l"[P/2Iw3'_o+~?0|MxV]lD
.^MҖ}*Z(AG`~m%#bcMFu16f^TME_0+vֽٵxkO9IK҇P$O{	2\(U|BSѸdwk;HnqXJytpUZygrw~!yAqd5p4-╲@3'ckr%r|P,<c7}omRZͣP?a-{yDp];,$X
sk,5"`l؆teG\(o(8iN0A7'NgMP;nXJmN:fչ<FZpaQ3݈\Ru 5'!ZpVKXcƣ0tȯ2P ·as`j7Ao23UJx&z-$ LMZS(;7r%=uUb	G73mOA"p5<T(Iz#6}9Mf!TQIWLX7h>cDʤ?4rDʆ_A-sw^Q%U9MAq?6thE98 벇*GJ8֑ߘWs	-5{D_aGaSڹ|lIa]Q|cfcsmS6B`<~>ןȣϞG;s}wG'^|sj-`OGw,g=Ow9y5`	L.Tp'nnkCeo{bp{k9-Kò l- FGۄu\mM3<LI}518 g\;E$(ĩ/L!=?̏uvﻧGCy{ыZ{)_TL0*?FyZ#.v">/N*M^D
"KInY4"7T)V@v~Iz3O{kIMx|KYG3l[ TwBIgYgRxɉCCӦeȖ&-u U%N>C2#s1
pR 9{Q??aTZZ2T--,`1qϬuu:l}k2ڬ&U!L"RiSd%gY-=mnskK~fjkˊZHĄMĒk$	T9TPcB?]ʋeyÐZO,.hGnq^9B.tnǘc?cxSjWy4E?HHoWz\:OVwvO>V#كYLv>r.Ƒ{i>ku^ǯJo(Ϟs{t;b䨴2vPν-=F;Ϗ#̤՟L_axèvg܂`8P9*y)oc-#bjm8=US|kܩ>D+ƿ[Ti uxPLDRXERpjLAf$ؤw~cӇwvO@#i!i9￙P+Gv3z8xv#{1kslcfS,۴CQEC\߅g.;61&өYK֜.xO!qʢ" c^P{[
-MV[swP 7xKff1yHy[R(/<26q÷oۚ#Z;=2;|7t{p}5nNAkW0%1֭h2 $ŇG3K>] o+i]egU,Xu(Qϐwo{RZ4)%YL)v*0#c@'D,yςEȢv@i)~ nlz'_ӷS,xͧ`9Ht*90<p<R	A}4Z&bdz[YsJ,NطYm}Zo]T^-4`Y@K{ops^fOYRn^}\B4fٷv^Nܬl`Fֆ #4	5g`S h'61wT[R˖x9j)?΍"zzh~o}{_oN{=  }
c4F$;T/n3`|\݋R-awЦS5-`k9B	M]_JU|H3G-,TTWC( էNZ߉]c]nZqm;}x~
Uv*ՂYz'Od7,ii_dѻ3/wN]7:Q6M0d
y/" l=v=4m+{>5Jϕ64+s]W5x]3UD&,k#\O9^@e`ABt(}>ew&lu,+o\#k}ksɵmaP78p[(}.>DmY,1mZ-Z{SAkN}nz_
	0d7Nr?g=<0᠃c	`]ĞN:G|Cu<-	Ju9NN#yްSTr~%0~&U,(l 657`&;?2gDR5ɯa!\e<OFfX.3#}`OF:.=쯎8iG=R(7N2$RXkǶ'Iy'23d2~"zW Q;]1qi1XQľXqdbZ(0֟`"X&P	fōo;uChyeY<Iohvco\y(JiQ{QMV/c#U1ƚe^fM}D[Í;0\[24gq!c)ׇ$cc_[!UF݅OPQ6(ťGx)fef-ߕW<o
caBNy/H0idD =r'(C6dl3T-%,s''(80ؔRn#DE,1[ѺIA=&J|ҷĺ{e!M]R&e BYds#΢j(r" {ǣtQ)C7sRɶj'v߫x=Wԙ@TVCXa9]CM%l)жJ&"a@A!	xIyp|{첑`YE9ԭ)e}_VSvvppD!^dc~	USW$Z@D;^yHQ:/#[&TtQx,?e@\ˣk]/^IMPaɾ]Y3@8~TvXJ2C;[E$7Cl)?:w4Bnq̦*'\a,y'\}Eo-;[ni;-'Piȯ	Į?N4O+frZwyI_p+pg$]M$hUrcG.쥺$5y3X*)Vud^A|B{m]r.S'+Y4rT\MV3RTJ1BPyä.5g2d}͍"hz \|K]xj~6dqj(,I&"-XE-ToE!7A[-f9ǉSZ5 
guu^HA@)hED&`XA+gnB\s=ϒIJa("tUh-S]KHES]`&(23FiVdcݣިwA`mMִmu۱;"n(ֺ@WW}Comרɀ^.m{9c^i:_~O=ȆٟS֜h kDTݿ0|zߙ+I*OC0/PS}2ִ*{JKT|o!F{HKR[Јj)VշNJ#|F9Jl8C[ @1TQmo6`*4N7*>ί~}fi)n!%#t&f귨^A^j1[A}|o˅xu󒌳l3Jv3ݶʟG?=,b٭%vߺOW׺VCvg3f|&F-1giʷhWQwo6S4Gj#/O5gȗ7i%u{
0(PX/0-Mlx<|<mkǩ$YbN~mRWc@y**uq|d	ab?:|^@D	Xx2TTLyrs3Gu講`_蛥M}7^+t'03֌H4Öϟa[kt׶R!C}WOw-yLpRݰ9rI .H@x\i8	d=ͧ1xoiNy1mTv[WAYƮZTdxAT|sN&.z "ZT%s\HAVK]9.
]'X
Xn~_dJ	*8ՋuYWuZeSeP˂4V\h[ٖmҋ3y1ィw.K]Vy˺c$W7k΋GCJi~QC;)n`T422QosHg`>8n*P}( (O6`È P 	/)ݩ/A4dQf[аD@!CkkMND<^"Z;.#pc6oWh""_iSlF9;iBXcw%^+`iY+I7B>n lkk}% m)D5i|jVmΆ5l.xf.̙inb8*N/k1{B6`<s9r)gCd: Uh}d3߁}
l^7 3xAİ
`XGY;38uN6=~N'W²c"(+7ĺJ0:n3V׾7-z;{<n>qe mHxql\Hm3˦#$O
Rpp Wyt#CxEv҄aGv}..>˕9W
Z dtGI8B 63IYd#CD5vLeO}P>lۧ2~`H*:cnaGr^g<<6>\/r^O\xl[.c0}YAz3fǼ k0<fXN
!$QN5է[2t;:IӮCKV+SAZ=LJX{?<x֓am4;t\ưnh۸c3E>VV<Hݱ܀?&$
2|qFp;ړ4oº ڊ0!p1}'ǒs~et< PQS%,ݝ<Mĵg&/	xHNz>	'.u
!4W`c35|33vDݙ>ez;|C݀Yf
ahq Y;>g5~-Modx$B{LjZ! s!S>Ug JX*nvS3M^c1$f*NIql_`G% Ύ-D*{ڂ(C;8;<<|̕_`5gcO'#kiyaa'}*?}8ϧiz{:8y`Rw]/Y*_An;[5t`}vguPƎc-v-é0LW
h-=K0Wja>vu4
:/vՑ^ Ċ$ÌD:d
W``^T5% ,Itlnk2ehDS3skhJRJEʫ%u펧UV]MP!4N6\(/ˍؘWGy*ڲ^s9u#؃ѷ}6il̚}Jl`lO`d88H5$hl0x(&@F"=<(cq;whrKgcSA<Ȩ?dG7Lv#zAs~J,V(jmۯxMGӨ@R?k/1vE6T;76t_Óc?k:~vFbOK pA'knae88.Ӑ>@hj+A٥e>-q<6w>fz/'{c~͖@uc77τ82L ?؁}<TΌ6u#7o	<ޝQC3AL[`PlDwGY#i'@qq?NI6Gv9`ߏ@򄇶:/$<l&{<7	ɈsŜmGtN[w7?Pxz027$GXH{sIH~eyz/[%ޙb1K1ݠ4G	wOo_1޿w5\}|4тB@WWWBT,ا+ȧLR*mg?o;"Tݞga e}ti/M%e^&gQhB@WͿeM ݴsEJeg#Q eMa{tF=,dHM~vmͽ|Sךe+@.Tl>}D+?<#&{ւZ;y&|/wŻñ	F֐5ذJ_&ʻEaAyoumr
L9q-ACeaFM >Y勥HkV6mUۢd9f<oVv2%4	ꩽJؿۢ(maa^tSFI#nޙ)M/w_'Q!ԡ.HɨP{H(3zEZh,R<CAJNw2t <k0瀎6*lcXr!V3Y	?3!,0:N*ZF>I9y0w#nU,~0۰W[c_*nPqBǻ)nt$dHz>ʼ+[eq`(B|k/>Kv,F3>"bRtl/DZA(d\da6D/2]~e{/Ui`QD#a{_j5VI4sS%`&×+J)/旜ͫQCuuuYpQHg6mW\1ӣ)ym$ɹ1N5!`!}@B^GiX-fp.[1E_J 	C>adaE0|h#O݄IT8I˳@_ƂIl )6wy}w%4`=e]bz̼'It`d,%Ր
:KJaiu&~;HO#z!9漀`.6 #9mi} -P NԌO窋3:a?@Lz<skNmg!jCcP!z?2ռYP"ELj#gnFg8[sBI?0͞yoKJZM/_bl3t]aF6Bz<1bnzZFv7Z.*W{$-}j#?3&:n2t9.goD-d^(Â=BǞ2zL*db\&2ymv؞/RKw4Kk<!=GȪ3
gGOn1_/|W2|*NPǔ5r~zoT0l>6(}vmT>6/Na/PCNgx+\̚+yؚ@1l'4GvM=nF)eU!D`)K&#R&eY9HXtG۟AƤO/zAaЏ6hvxAآt'Iv & '`kv(y]IWbxMJ(2Z&umUY4q7\p\ ,
<" ZYs	-a=ɊD5l$`ɿH}Hud#68#(kZnIIm}֣E<oN|V3a2,:&
J;q mL9:F*ns*y(p	>]M'Y/O{l4r[􆢈9[+K25ChmM9Uhsٚl!|[^% UΖ<	^;fރXIH[VirLkх,36^uls]IC!wǻ?tjyҬz]Wb`_;	u%xast8L+3,Kymj3^GWX3GP%VYHe3BH`kX8..?`Zn$)o g+y:Ō0X]9ʝGg \cf{f4nw[=Ȍw}Ap3d~&2@]^\z'O{2zhu} {LNHg>O5x@U~7f&qBUF9G/nt.`'|pO#VSWFr	mD^eak=MjbOyȄ	-3Qf]"ȩMشfGz~s'REy,F?eaR@*
1-vp?JSeqfQ	H+kgm..ܚFĉ0CNYG<	~ȝaäj.y՟~Eh3yWw?}Jzalcf_Xnc>
1ol#|é.씚̡k`9pYT CTH_{pכ7jל/""-`7摇x/aP ,^]5dÅP1{>$)xiIc&j&j&WY$%s 4\p'dZ Y-+(bp0Cg ,*78U e%fdyHހV'`qw\ uΘ1vtfg6'4j A!L#R"mҎgDfoS.AOSᓲ_ʵTMruQ>wE:}=/f/1r[r/p-ʚq]]P2%>iı`)$`Գ^fZ(as+X !qNDYĎ8 $
\^VKA<G0k\Lo1wBm9qVDV6s`,]KZ:g [CX8hdIX P
~PaeZ.^8*Yk&83U`imVXv%V}\FѯHI>JNG4'aiO:P=Nk*5L<|HFpT8xTSb>8	KHN%#Z5T<
r)bsf^تHrã%N[G=1esZ%daHhh|Tr4eAB%7ۡPBcd_b%d.n.4}zŇm|&?8ŁJT-Uw-dỸ/T63MX
J.[</
+;+1	yAQ]_Is2p7qiϓp|D\ߋ0;[~jԆ4e1A<vMLAi \#z<P<xrr@9RN޻^_WƐBHrU:DQ-,o[g
hp[P[`4XHX
4W;vJ8~3.1<o63+8iI<T!;J6}Oa[&2zzмoF<^8<BnNq0I9paDW!F/n,C 3 r^&E:} c&aAahhD`R5z)@=k><x|u(p8dC8Z}ĉ.VYBuo"!EAT`i*XE!
ߒLY+v#D);wQ0}윱-%v%X߃
YnUO_`d=JA+G%hVO?Gb(6_pn45K7@[ފAUsHEN+Sods3LHzd"ɬY+	0cHEtg,	`H+zeHZDOe}q蜸BQ2qv kW9D^ۮe墓f8UK'P9 ,(8:fr4CmFLǩgjD=沼NZ#z5SP6.u4CDXDFF^d ~i1e26ǂ٧ȅS(tsU]btnPs(J:xv(؅}4MKsI!]Qÿ/zIX_jg4	.vҜ[,+59Zo#%j	+.g<gs5i(e.?82P0T#y1 PZK.K0Ls`'=}޿wbpWLXLeEZ5^/TʴgeqU][u\rFr4US8[ŦmۑX_\YA6i潭[}L|Qwqurb2IϷشk8VQm˱>Їtm6s+ٟAohe4\Rw~>l͇WsaOv0z|JttQ{8ʀb,=X9+ٻ
v@ ic.(
1 @ТwAbto(|nG̹LhgRƪBmpo+¹
IoM`TC6LyÑ.݃ƛuhmw %n9_NW{=7yvK^>퐿yݵ\ WznmP!#Yh*
PiH/?100nAҟ@ٹ;dy<<UvGb0&8"
K<20q
~.mjtMYٔe1?_T4SSgFb7]cg7g4jk1W=`GLLZy .%MnoYl,rFy`֒+)nwtv62=+l.NfF_jdܥVj%Yo'|HDqMo"D!+f޷ˬa:ޭ0`)$,)Jfi[B52M(Y%Bܦ?PZ& ~RV5A+	>"")}NVDFLtL*QjSsah?gI"ך`qpTT+l0d|mlbqU,~<Qp˕xA
Ram5xB9W&PKX!qb.vxB)o%,+Fں_f<ټ8aB,aDq.dt)G8	1|4;ɛgݫWeV5;#YG4!i\+&Ko\JVQeXY\4I.ճ/4Mk7J(qfQ=yXxrOJIol@i)JGJ#!h1<8ogMh8MɉNw:"c[ Ƕ,7`}<˶[
BS])Cxizyy\$E*֘zXZOV]pfFf\״<gsi/ <`8ϴo>I9yhg~ŰWiΘyR})m jo2qFSinz4~=]Y(;?4GzHdϘD!̿Ť?H q`hvPMoc"<Cp0Irm>R~Jf pktG2`nÌW!`!؈E(4LPejJ9ʅnk٧ͷx_;M}CZa<  .3;(L\ss
_\fO`
+oM(l	`,KjO:!pu+v^D4%H'ENuRL-0HY+q	l#0̊iJ+[l@E}F13`dR
zzkxELDIBtTre3Lr1=3573o	$O"Amw'+0^v%bns2њ\s!78\Y$Hϙ]jH9HDÆDJ$2CGRv'6K<FWCF#}$Gfw4pL'`Q̧35Ggu{0!#V	ttE$RőO7$7
w:tU}{Z$Axd`a	B$(kcP.l'p6> @tdgeMuۼSaI>{-+Yf"%W͗vHB"5VBH&ZD6@0	ʺPcMW9HѕP=rs;M)?#/-2*kψ+$M
~݈c80PffsK_l00SPWI+r}@\x_scm_BVhRE3ΦnA*J0w?0[r$v&kN|ˢYu1oy_5^njN+
_1Z|j;=PkvVN '{ݤS]p2>eP}F(+mB0*
9
1%y%t,Δ62ih|B`]Y!op#}A#X^$|]WM& 1A6 ]ͳiSӣ9Ys!f?mE ̤GYؿB	`Xqjhl^V9ˊ5N Grc]^U!͍ $^0d2M/f_4 zx0$:"%t+ӱ_#xGKU]YyY˗p@4Ct Od /K WE2sPS{.S+[Y]M}Ie+?h.j1o4HLaj_EvE­eI/G-QdPznڞctNnD;bՁH*	?qZxxO ^AOBa|]=B(\~~A	*j{	0hN).ˉ;wkvi@myܷ15M
oZ;KW!Y
gG~%gAJ!%+ 䳀+,+C+hhFjﮀS}rSgXopTz6oG,w/@4w/@H߽@rioNLR 
뵖#LfXNӰaWfA bDm1:.W'n 脊fX"`;_:*J|2^⼝5<J>.&p:X#Ux(8Z#ֺ3$a<MF)q#UQZZ7˩59?F))RlI)ŷKq)ŷ2?Rsi/r]|YN.s??4||]fH\~ ;I{U,/@ye/Ů`gogVR.}b~ĮT1#xsE5f`P}Y¥(!}N-8:ϵ5Ԥ*P{q!9;L'xJ	.˩~?;A{🬛w?A#QQ'KqY!RjRR;*ÝibDU5Z,&?Q?)PnTCBH[}Pxo4v~XY+pp㛩*f#ɯ;`o?͐GQsQJ6WԾkXz5~6ɽ*=<**=S;"Lvs 6Wm|)('b7Uy9tftywUۼ{WlvWr;1t>~*#P21Ϗ}D{?-fbve(8	i8qBhpծj.v$e?m&C J1r$U,2#FkZZa BVd<?	0LӾm1V0nAZ6R{f3KHXHg_Ѹ`~V?2V,SK(/1mBw%v&e~,U|vctgq/Uqp3)vFV<\LP,3} ǷL$y]< ?TBCH֑T4VMredjX1JG45Ce[A署^|$_Gͪe-Y%Es/:8 wzm\zQڗ[VC{`SUZnYߕQ5ym'a1H|sxjg}KcF#Ǥ`NJbIkxe_Ѡ}[D ;ޞGhNWoho\cҿ
;9!|ttj|lnj|},ZM8qu$:-NX~Xq55@vE(#Tї!S9 !hB`@njq@$\yj4B(*jAj=~0niny=	kX0"_6G UG9 EQEzn,Y?S9~Xn"z8*5GPS+8*Q̥N!bb5/P{m+D5<jjo4rwEy8T4Bqf6SZb_B*Q-	LP˱04%Lc`!hBpy\oz<ύސSπڑlHEh4
8{}њ޶_V00ߠd&s+˴m?<$~44pd^1RUWEL_cI}^?+mNmc
A,~7
Xq2rvP95,vHβu~W!`hv>Wmkdp	.b
-m,#/سwԑ0
ńswׁi./sg<Wqsd{O]/P.#+f<|RUBRfBLBy ݲ.P3,HL#}3ڏؙ/}CPt)dCOuc ˼(&XērhٖN~1K wU'_\	#35JH.>g`xKv505~p؆-Zk S/˸~O"$Oeyr~w݉FPE6^5[7^.sf /%}X9`vj/RXm:ih7j#g?1__ 4Vl6mwtxjhcJ4è6A[\@1&^Rz"-o/^/SEē: /dΌV.>a@$d[D%N=1Wmucn{mk{۾Gh}еmPXp)m|fƝngi^t`@U/?i7mϩi%7-<8,{o-{0o"MyUM_i 7~S
ޔKMi讛ayK*_y+MMij6@w	5}"~pSOΰOmzܿԴqXbK:vt MumLXo5+|Yijվ7LSn?Åͽq[YLNMPssB?eGdt/	Q/T½-HzfL7AڙlgԃT<ZEK
Al9	|"JwfHs,v^Fݗ	/F:2 #{ɦ{	^;k#Fk7i~>Ta)N&|u3ǁm.aJ&EZr#UpovZO4V9|/-Ϫ\V
pL	 @bx6V	07zӷF1Zns5"$oЈÓ4"/=hvU{bR4`F~B7tqR yLLF?.)'P8ͧ긼Ik]?$
jҐҖᮼ+:,˯%6 װ ys(k%Ham=8Co)a|kNJ
tC1ׄl(Шę_f]fMaʕ֦7MM!<뭖K1㹙p]wYކڼWטY ȗ
^c~09BWsJ"t^y3,m]3;_W?MH%W7^*җksjV*sۤ쩹	lU#`t9eKogkzgqtϰms7Wν,>L̑XFRțR7~cc
7pTAhc
 |;-{>5}fXN"Rϣܘ\E.GpBRLE,T$S*jAfr/"zޭ_ϫn=.|X%rցt[(dѲ@w2STmw*2*UlUrxv8ۮV	 J^U9?<υ7|j Jn<d}VWwzF/(`ːd9%P2`C%߱)esHY+fߠb:y7#]٭P.
Gɪ{ip5bes|cjᾪ+.5qv3e.r*'{ךr
|D^dBaisVG)v	[]V6}z
/h6&p,L
b^RdR)6x80%\ A*wzf&T\Kb@VKSۛ ׯ4=	+sVjK<Q\zc0
̦QCwvվ}^igH55:l+v윿g*wvӥd~˧Gmp? 3:}ZF PC JYP(PIJ	#WuڢU@l;.{gWU=ʅtKPDŔd i@ڲR.*Uqe*6RE	dʱ
~oݐz6o|n{ʼ<e[^tV,O?i[F@z
?W_%_h?3zXX"H?c_+	w"Lꇔ*oLB[yn\G֐oʓ2%.dTjB#߬.d(eȇ2<&-UFxxa *,xnQ͠|>fN{}<efB'00V6zvdx\/س"lH]쏡bCtnwAjMuD:uH`:kN§ѐ%g_(VHʉuas*ʈkiAyMK=@EK7L6^ܶXZc0L:K@sӹye[Uz=q¯ް[Ob<?9fG@=.ɖo=y'Ai#,û;G*Mlp2%1;@+UcEm2mV	Q;++N=:[	9e;5Cb:nx5a5p¸n63D2W6JY!?dnΘM/;fu&N_p爼ϡеHډ.QOF]tzcL=D0,^EQ(aALr)(R&zc'Aj,L@%lVnc_3/#(w>e Es龭	xSZD=Hb632,!Us+l%WСcxڪ*r=+!$`wkUZt׵x< 䮘Uۀ??17Sue6"7U	]خa{u{4.mǵ;m&x~%7[ܜXT.GVU
_܏dh.һv,M`XzT]p)]
JoO{RjKA*;k^kXZ}>67e_[ÒnQQWAsu".GǧP]d'sDMd$ciV|=ݻɂ-뷀.#+,|,]T}f]lWC65pwYxXqz\0kfU`AYJ  M@7h>emf9%5Iڝ,X뀞L.JBJ8tx|*;!.`-4$ej!/	+)s|u@'CV9TuAWق}#,<.gkpf'ݖx,{ـ\-xs~܊m=lL\:jBnbhHDd~>}y
Q8ʸ3ãhQiə EQtooX'lb&趺PFF(*WŎ.gE]vkGlBt:p=ƹwo%l"[)F`ϙIŇ+gx)5Oa9ɾ3D׭v^95uf&ebM{`9GQo!q`(1_EVȡ/LA~*gݖ"DIS2"m)Y*$X[[c[HEqϲQ.H].NV;Anq*'Ä{˪=#&})ҹluo @jf:s*uow,cCX*x0sIbaƲZN^N%ʹG1#d[7[`kab>$/U+=;E+O]F]wCH#"F:|૓X4t
qxf-x߸Ii<B7Fʬy B(0ŰA&ec+,@1pWz v_ؖ(5Rַ,K1fፃ6GM[2*Jce je%-]XTܭՁdqOzt[8:(AKSsc`N͏dI[.!|.9g}-%\.rلJCwG^+fFUG^jMJGs76S*vK1F/,hس8+ý~?WQħf'h  W@P凤Tv/]	h!mmB;&Oeyy$XTY؄!sL* z	v&D4/p+-"64m@K_Ra2S*>,a$ڄ,4ZaÈ&Nnb E%t+a%vp{_,F($r<?,5rӣyƯj{m:6ya:x7E/n6
Q׺L(;ZvțaEN7H'miVX:D#A	%JxxLaUgq6?BվQ{,%bh40 M0FmrsnŹBXq$F9em5+tiA`E!f6?g ,i\"|H¹SlQmMJ B5~9Q.i|f峲;i4
1<c)iGBe*2V 7"<7\av!s;f7hIUg-	tqVܛ@JڅK|	V|{
!(2+^}"DJ<oLwq=y<~z kgIpaSk+hp'Ha} Yﰚ%xl&G!*_sF#mOZ7WE|q`eo5==tZ.{O"0[Emd	Q8B[xIClQ/e)?lgmHJR7;p;|t1^fM	͉Fɝ9$&gK)KYgn!fΞ%nR׳;,[}9fH!wn<76Rq=t=Vz"Tlnd#x)f5}W7UI	(fz$ Vh%sR.R!^B@3A7|م,Kp@?a(-L2s:mGu;둧]҆lk])Z-SFOWa`vjd0AE7_g@[؈1I)q$7݂7n</>~6SJ7qєRMѿ0Mi;İ=_㱩oxo FP,6BzC]%c=Hb<fovh0:onEsrp|%N>޵D׀mKdǢ"&
M#$@f7{!Q)Iӟȫ}SX
hJaW2P#rUh=G8i5ząn"lTu^M#|xtR\_>5__.=pxtOO{fEqA5*v
Tkzk^'ǭ5{B/x11x~Ϸ\vѾW@9,4NJtS3-?y?tB:m?=&-v {EHo%<xoޙv<e=rifXN`#;i@qDo+YtqDp>,xϗawgNH&!{ͫĭQop=`[K	~|Sa"j|ۻZ|6^3y)^tn,Zc7P,8=.Ҙ=d6	O`6u%tD	ĻO=[8HJ4:JF4@ck̤3]]`{Utni~6<#
&a!`$K|=I)vZ/pb dD+мb@0sDȿlҗ{#@G/Yæ4ۆPqxcV9^_{_
vV:]
1,i:_-qҴظC~v G#lP[14L2#} N8
:|HFT4'n=:ꔓ7Ma_IGcc#y{=t$zfm .AҤΙ8v^UsK9(:y0'
=L0agK&ܬIn@_/⒠g	gڊF@i DSnֶm:"bg3"mõvMh=_Ę'yUbb`;2#%.N|pJ`7`hِs#Hz6g#{\f/:;5dv~ p&^4p3L}/ٿOzy7dfID!N!-a{5mG,y蠧
Y/Te<3
rOhO N݀
nBġfaďm#8ԫxnk,-G&Pi;bLSj~mECjGT>lnAMEڼ⛢ 0
́邡	3:As][z"^%;@/eZ$퉵;ʎ]hG*o]M!٤+(ͣq5locg0	:lȝ46Bjio0 x/\W	X,o?Az$`d?zq6S<M-Tn`Q'>].gKcSހ@?!CKb8!K|[#۫C2)P$.N08 @o}:'ɽAy8gCL( #hk:~cS]PRTyԃU2凞8Ty[>la;FSwZմz,Yt]zl`
fnt?zgwڴ~B>A_j\`*Zėjbk? y	x$_|)$XQUMhFCGshM'/h6	GX
grHiLq'1:*hfL[ӝwއ;/~nxӃi]._vG%.)vnL֤|qKdzے:'$+'xr* 0<1NR"]$DT4(锂pyaN"|&@daHo@ľ]XFX2`3`8;Ph:'$vts`MOb*.[>AïXJ<r?Q6v8BFyLI(Хt(ÌIZ?C&vL	(%,Z-JOk.IChN(э"W7w+rȡL%Ō><o^̯EvBӱyOS\>;:t3Vq(͔wpŁTJ&y$V;Xd7$U,%:q%I:fm~V/ \,dº1ÞѨ(`ȱ­GŠl6W9elR%#4tC(Xy|MHc[h 
<_>&[	cY[ʣ@ha*P_":ܗeqcf!bE䅓 9/QchInOH2qS]gt&]L\FdYafEPb|0"~9G~v,AV\Jgk)wZ^!(y(Jq p2s0AodjIH33~6]t*MV3ej-fQc&3BuȤuF[% <?9z|(OM#6!G {9>@t·Ͽo~-In^]K6}Q AM_H@5drAzmǣ`JCj0g{}5%(2"eXu?9j^A,9#?v=wb%v<BiX[˴Jf1qldvD%5JȾ<QvsStܖPb:Dm{/^n7_<|4ݣXHb-E,o<e0]gOvwdʹ)>7ϝi{Hy~?(^fy
uA&>/qb's6@<)
ksiK?m0faޟ{3}y×N2cLG:(Osʪ3Trv~8c#E9nAe6*W(!a$	14߅`<2r~ZF<6rVH~x(Al;|fWnUrTr=OѐCkYEZn(FV5SAUFQh (-0rq[4Bk 0J`fH1at{aCʮY]]e^P2PM ODDTx2ڬ^b$h+)'2)l􃙆U&i<&v5jz=)+Z((ru!<8Rp6dJaK"LDBăpЙ^>nIF=5F7[pH lѣYk<'3tu?/~|vpjh/'нxRІiA[?bDo:Ю,ڭt1*۟ 7㵳.`u$׳QbQPln,>}/nJYpI;;wWVp`ݎo#Ȉzx{_,:IGӉ!yYoT=dxSF:d >k$GӢ(JGޖi;ZskJ:7jNS?볫q(C):+Ȩ-LI47|'&ȅ_hЕ Kms?wmBk*"$Z[o
֝C$_쀸f2]);NWw%ю%M_A A0*#?%ta\5oT^8U6+oY><|ŲW>~g.%qthZeY5Z{ЛH.'.&YQ2Ķ/ØP	)p<%'WZXCuїMh[-勤"`RQGU "U)8[*ׅZERa#ƺ`LY3ZF)6m!ᯃ-Ins<װ+dߦ'Y"KP4~Wsѳ![eh4G	 B$kkS˜tw9fHꪆ!|w!pa0pAA"pt&Ѝ%B_lg).|ghaG8Pt(s\g4#/HwC'?n°H1l"&qPJq(E6Li	:+70'59ieg|aČ?] ?K.ݡ^
S0?mcW``VAad~)9	7R>M8G;gÈY
)b$rh &,Є=Db$iG,)Znp+^ϝ	Le+wgzfoʘ*BMry|x?i%Fvq'<ػc.@)~ks>bXZ̓-$˛<>#mqLqcYLhri
bDjy%z*i	Y]An	F߆/F_!Y>j^znkHI]]Sܐ#XLJ0oCo=y@%osR|gdA!BLsZd+ a2K2 D5AA؀13Ķf+7|SĘQ.=ٍYRO;gN/Ym'5-j''O<(nH'@RN)2Y$lN'БSR=,i$[}HICLK"~Z1ɏa!	/?C!ĕ8NY9~9Rӗp=R\!JН/ܻ&bm0p0KF}t*05KħC,W,	aeU_$uKP>$o'w/GC
WA,JCZ7Mu/:u7xoxB w\a#g8MocsP !Tۘ4M$ Mm(M"C3kXWSqi~$l+ͲB.pME=.| MǠqjHXLF~	aL3x	n2FYctՕғ]jBqDT GǕT-,F]$0±plt^(XS8DJ5.oafy-|j
ЖW`	WD8.W)'됝6֕w	D#M+Sb j`]M[@Kߜt;v©O@/&/LuhbƂ NTxBD23a]1N^gj,6҄!l9b:mzn^!D~E{0vI'.<F	S) {Nmv3k$hP&HQPZ5dEQ|Ӆ:\]WtǉQf.eXuL4$D=}<JS{~DM|V7'%)R>LV;ٲ JYgq` ˞cߙCpJ/JW`6@n6`[]I~nSN3Q@ch:PT}9+N-Cw$m aq÷Ygga͋5gcd:lUf`iF"]wB(%<@̵i)_q	HHrٖ4<fvcW?NsEӳw w ob$T
l5A&9,P0k\_zY[[PWWEDӓ--g`odSѐڬ#j* rF=8.EF7%$,p%7B!p)I@)Z^Xbk94 ߏ~MgMxM8LX>0T.06t]%	l9W2t)`9n{
ҽUBJU ?ɳEbduqKlg<[ܝr{9'ra ʔ\/L#2Wv>^X)Vi'±5B_o
\W%d$JyDwڑy¡^f\VS8T0i^~_d8
*{{o@~:$0g.go7_9_) 8g57luT6$'r$8ьEki =iA!U3xA@ə-B;43_[25{L)$_c$8*C:ۺ~ہN1ޡ/bQׄeYX,߂#9DxdKr3M';Elw;+yM-v5lWwj ńڔ
m ;.sŷ	D#!Nh8<]2 ~pK伉\O(҃9IDdAUw<2UDvk;?wvҴ
Uj	qyyӟ>"Ј_|,977eLry|KzA03!Gmn+iNfqD$F8DHR\s	#<._y7A#i;.e}ޏ[W4W!뛴O%́UD?#Uیejl	Đ-~r-t KYNߟݫEkWo0Y̈́϶VNAՖ+s<G6d?fG-t5<[M͖*	eG`K)}z (_PzmWn+uח{Aln>H% *gYQfCF6ṵ̌ͧ^+hm!*mL4S{?9ԉp>%Lq{CbU@Rn3
9R\arVfR4R_#q2HaԂ.N9G~΂XN`E5Hg7%"7`XLI>8mjńf"LD[vDFFWyyLϕv8pg@n=3!]w&e٠sa`/5mnIå3C1kZ,
bՕzk_.,r	3)Sx9!,@>X?bxͭ~XIT.^ _rt &swJF[v,){<OG2ĴȨDؕLp:fgçX$i>/,FOzjpr3QhxvLqL#vѲ%Mc6Jg8ooӾF_hYk:|-榃/$ȔzzI[c"
 b#?5޺9ɲ[b@hoeyxPNg鲸{yd(=b=tf-y14y7Br5N M<KOA̫ͮ*"<8@ho͠Tհ^b84Nܯ x戛Fir:6vW#BϛXd#crLê42+EDI+ $h^,hW"(w/cTv<&9Fc"Z,UЪ
tf:p7NBeˇE;_3JywݕZFn-%-l3Rta!$e-*!U+Qg'q@UKNPg$m/^TK$PE$zIt9$pD1k05YeOU'k4j6BӰ7Q|p:ho8{B:>g`7g\
jOW"y2_QGpAV4.nd~Aޮ`&ۮr3ƿ9p.ΈR:Ӷvrea}q.9GaJva	RvL<QY࢑V$(9b+K3+!uY;R`<nXNdij̐\ő@k
B&/^ B2<9)%ڎ$	M[i1pyǢ%3],I5%(.ZGG3XTɤd.FwA݆!z2NPul[*ťDs[~6#$_/E7I8HqIg]Gig+,}#Z'
#x TMm@Q&ĈUMPE1)?-B<Itc_ܤƎ"tӚA4u,S}psrg\^ӣ}Xɟ׵bm$bijZ֫h_qv=1/CPǫjoI]sFȊb` KiG#z]Ue3 y<ytڍ"sғDe5o܄*'|{Reqvj_)gj.]	t	e<\sB8̊ޠ7y xƽyJ6h[.Gn+{{;h׭im>3d;	90}'E*Xƛ<ӧors	"5#Jrӆ٪J/jZetr_ct	`4[~=ֈQeblTvvCp)Ard>Y>D/,x܁w$Z̼+"؅RvHI(P_̿;<۬g7  VxßH_.A7@Y[yv5s!YV}I8}m'#7Ǳm^|[Q<h*oyZSp,PpIV>֓"E#=lXg4)x9%ޠk@Q/!ؙ|ylMbOi;y"Y'un۽sFK^DtZ,yՅFިsys]UpXtsXW]RuF]׺lvྃ 8cl 
J4cĘiD;?'v<9\';JQF
Eݐ*bK+m#@	(Mϼ ""GB8P8e%3&dzNH	#L}ƞ*.:&Jn}9RIk[$]rQ[O-ď*uJwq}5D#HuA/cndUCꞰP`c:Η*ZS	u
E-+>d|/|}43N/euC%˳M#\"rT5gCzځhXC?6:T$ZAaj]	GwPpƕa'( gXE8uLL?E	{'OC{C.!$FNITj:=!! Ko}9ico4p3_҂asqQta8a (HJ	+gKE[$Bh0]c>&x	|֨[GBz $,PRkQ,ygk*e@rt̴,nք񁛴Όء+doWV5z -͍J;Q+.[]rnA¤3j2Z
?B8;ٚ8_.'{7/JzչKEQjrq̂A^U±1 ]m*^վ覰_{	B[`7ջg	yYke|Rf :	GAd)
%k@ 7WTr	=YJǎMB- ;5C*5 Je=Z!pM][T5КmwS1I	-!HMK-A4وu,PoQL8̶*Z<a	4{?9F)]XB@ctJ 1e;kgxߚarz44\*\ LTƦqUA0!Կ0:\׫s`~F,P;T*%e`Ǌ}4/FA8#A]t([ta$J^X򮠲9	Oϗ\ 3iH_3AwxiMn{R2O,`좜&x/K~x#&J䍻X8wTr n>7B5s[,qFPg;]?=3Ũe䪡(
H.
CEO`B|h46oC=l,Kfuwǡy>z[~_7TC//ຆf`0x,eD%x'8'2UA{9A"wAH:W~adRD{Ǭý(Dt5܍8"zsvHPblX:JV9<\6meZݾ gͷrFwq&!e-/T!jr1܈xk:˷ЇpZ:C	LЁ^KUF1Nw+D2{_DbbR>"!əُ'%t:P	Z!h<7DV6 &҂5?g2Q\9:,ViY@:¼;E)"C{8j׽sɞa}_Ái`eXh4^у٢ (ゕun[a9֨qW[X~4pu0t5?}ܼA
i6_ɵ"Ize]ʐ@vT2SC;CF;^C3[Sg8t[#Պt3y3`?̗98}2Tb?m0 LA`LP
]DL辥Vd@,\\Oi!ЇLEUH-[Z~
=D@;R=d!ܗRP8kN9I;wG
3j9Rxƙef*?lmOϿy`oO<3;C})aA#_G_z5}yC.3!rj+kxAMX:GsOblb.c<iLk'/fE_9t @yl~>Zx2~QDͪaRHֹ~Ntv+Oa@:VbK̽.\h56 P@WG02i8De< Ko>3x<5;TϠ!ʖl|\&W'a	ZW𯺐,|Fnypx%lpژ%'لac}m!)p#=Ղgb30Br"w+ZaLMe 05sOW#fAp-BpPr\^E"'|_v뛱_8g[.SɡQ+aZ(a5g ޠM B p8&, 4l%}'Tմuϰ)hoh.3Qa{J'_% 8QIjI/K.z14Xp^l}HHz@]vH)#0zt޽%~ w&	U3=MӛpZDk^.vjpp?(j[9wT\Be wVz"+ G=ca\{wBTu *RLriz"a+߸8=JQhAE\	58Zf08t利>Ng7 UpFLhņbdp"g؜ ;9քq)$e$jB it 7˖'wnyEX;M>-;،Phc[V*e^ybB9䓫8qp,cy;{$0x"LlǮ:"ܱ5sQՖ	/$_
GNg3Uh@PO<ð`  hOYj}2"3Ŧۼ#_wbqihޅn5EjsՉs&_Px#Og$xނ*ddS;(Fn:$9I@(dP$FJo!PFR\#L s\uI3İɅ.12x 3<^GPebD%{u"=E,mg0 ꌜ8˹J-"SIk8ӥ}uYY4

TKEvGp=o΁ZVPW[jŖ!7:	;,
f;kڃNl{-AsD50tLU~U7noHӝ6}l~"{rbF9BdipDBai06[_&edxl_kQֆ֤.UYPܦlmx)#r@|Y'p*y
n׺eP6n QmV6rQK	5G|c3WuGiE̠yOaO ӏayChCELFa"=fߵ/{sԜ3dtL>k..-:XF' ci#`tV͘w  ԄQr7= dF줷i8#B:nhqыR35ޞU\>ܐ(PpבwX
o=*ZIc׆b+T7Ei@mxk뾕0="9w5?1HQh$=މlxV[Ll\kl46>yc90⹽m^C!C,ݔlv\
h4} JXN,h1GPqV7*$}[NK8RNe:vqq7X;ʛ-Jh	x%+],ǜ`[v&xaf:/]/{3x(7˞bI$zat({lqhV>	Y Qٓ-J?y<.g|[<ߗ=X?/˞ެI|b8~In@",9jߪؑV=V\nW޾u4|Ճ#Dr
rfPT:/'{_uLnɰK6tȲ@&TF |KMTfCڎn 9[KB<fܐ\'*o(UҭƇo\rjPmS˿
lh_:{oILNRՙԃXm!F8)?2BBK%& y\T)?Bg'n
	m3AdOtNIe@W{,ϓvBJ
I¨('QRY+AV %jdmKʓyʅƘ#X'<'dkB	0doˈԋg.,_r_kgf	*s؀ѱM7maCp~essb}腿0ujn	!9$ɠrx=Jb-nat׆dv -T*q0쩔-%֖>'tFסToaGN։Eth̄8Ʊ"@U571Ό7)濨	m|w
$[7IkM@jlI6  biR;VgTO.Bxm  ʇ,ьʘ?!;nl$M]z`zb=o_x6q7ڿIE;˿m rp_˺y>)cfG6j
[g|Yv'IFCRry@S=,2z»[oMo9PŃou߾LU,u9[(0F#|~4u'\t|G5_b^5w}/C'<KHFo(#ǅ?*] 	Ag3oHqdD5
vDO_62+o;yFq߄QTGX|`ї	sNBS,U0JT4Z/T)*hQ8cI ȨqGK@Rr@R.$l#$ K8\<Dpo_cukg3C#.5Ȥ
͓v[ۯ#&EPDI\)ۍE&UQ][7?=8JE׃EKe_7 \>
 ^y;UصB<<4|]]1@ŋ[};i1Jٮ%gx,zWVb`q[E9tQG7Wvu20G'24X qZ=D}4LiW,@P3MZCϖb̐x6Zک];E$Ƨ3͠Dq|$bF)vj,(?C ]wpcACh&[ΔqGo*N/z:oD|BG&.mr>Ey׼TvC9Y"L$I03tN֮b㯭Xk|oNzA;Z-XFw-M_јiVG@8"9=t{NNZq5Mܻw!bbO	ȖM	.?}ϽjBs(C] V_j룼K^|^\03M@=ވg.9G,j`eAyBa]j]ftU;I8?j@_ٲՆQɸ'z
vH%w_p1pbZrbu,(gUeC%؃,É_ghSv&Ѷ#C>MiDXHXeϰГeiTd^;Gu/8Er/d?i0RIwE<I/;#|؜6@؜']ptgxZ&@,
KYe/÷w[WQVV9ԵKXͮ8(|7tGQٷ[sZߎڟ,iNV16'!%YvXeH]I5K.zvH~֬Ӡ}V|]l{]-7A3:۰j@qKNE<'5WBH5{aeh0FDDIq?"nWmۥW +Cp٦GloQ`>`O@ѭ뮠<%^=!P`ape]= <~?]Bv΅'=/.Xc.RB&K\?1s0Up'aF@KjQÊmm7gW0@5|q-n0k/d{nM=^~aҼ<)Љx-;Cߞ#9)DeaFXHqU8ǙY߅%a(]M*҄+U:`3;R~5HW Z\:YB(߰}_Ab>Q+oL
\c2QN{(G気~/MEQp}a<c2>[M5:yI]= R*݋b;̡LMd 87gښc~ ކkx)@;o%76,|{㫮i;]s!ͣ8pȆc,1Zpaڟ?4*Ad">|Z g-90XѠ\N#63#ge*
dX	0}2xCE=]:t&9O?RjNCZ俈4֛7T͛!5ZCQyy:iL[J_~2$˖ 57.)g	a,-x%%PHGщQaq+2ǟ̳V6Ҏ7^ͳӪgWAѳgo%?U=kz,Aڇv֥mj?YӞ5fJv}5y<q1e7%Z$ΜŁ`ބʰ6D@o̥i47Z1$!̃"esv>+yE/PdV'BܞfbI%.&>J!f|ZAI"2&wuRXS
nTSvl;Z-yDrIU{n#LAO%U*fR`n	\[%ߢm;`d;< 	x`xmHgRHS1b>|fAf]˅-ӓ$e2<,8rhJI׳:@f}cշdof qKK7;z}{hQۨ55y<΅)#<Յ䚛+/ŵTay΂VlFOcP;:7>^WRRe
yC6̟ЖX߼yh
"2SD4M =@jF`Wq͎m.j<W-"%&ЅAXق-`8Œ^!bMJcbڜ{p56;l;BX(i9ʨ ZtO!&TinSq<I*w,uu3k;̱FًSjbuIp]ϓ	v>p,9M\DPLf'ܬ	E4˛5UA*hقp;ɚ%nh53a{Wn|ha?9QU`f'Ec$CãEªa*B0҆z v5I)S/*3,.g*"ȣ)㕶0[8Y#) 
̚QC(C$Fi  =oՂN`dܧӉ#*}l"zي>o n}?	̥ûl=$ljHr}pWģŜߔPΔV^->Z8Għ]אQ䷚CmKa"C!f\QLB.;0ZKfð\KuO[y&Xӱ,x2/8;mèy:__u!vgʏ5*{[jZ6ԧ!hx'~|?Yq_u*5欨\{A%c.h&lJUv_&կa>@ܑ`7ooU!(N/[\?ݑ|/ݝc7LֻvPp\K`QFQX&Hw9j;.#ˀ.L/\Mz<d=1?  _z1DGOr2Q3§=iavđJ)\\SqR66~6Rʅo$~X[<k[{$=qz9#%&
>XZGN"EpQK  \Y9Vo8lyZAI0 CEqq"_'H'#*jX,C!!?@N1zspma^bo6l4^Wа̕?VWRmP|#<Fr2[!r{Q
{j ?8ۑ;K꒥~f9D'OgBjޯb7e5LWE
ʿgo6m,xf~XkE7M_.<X-nZ
]-=Mn&C;5od؞ !>25W)9>(7穩sHUUw-Cx .AT~DVS8zX5/Vty'szCE S+Ncp5tfⰿنhdmނ  !~M_ԭ}Ҭt#ra~h
+d#͞l㸃"|Bi33]&(0Nm!\/u($eC	=A9s;@OASsexN^XZeH@%`H+-՟aym
] JEY@K["Dᩜ)q))/.[{8J/Tdw{O#4(.拊uS#s at_\F=>=ts;1
H`LP0+zM?ĈlMKuSBJ8풐6Q1!P*=wX8<UCJDiϹbqxZi~M1*22s9	i3	"}ykIQ_}e\%ެXhi@Ѡmu7P$zrPlf
jӐ6*GM@sşCiҴK@*Đ {?NNj(۠0`WXrBAݷ?hNWI\	TV7D,kZp\+M׻F!g?@%NgLTCP:Lc-lI6Vryqu ?}ڟ89}RhEkzP+U@8<1"A<)hI(h</tv@˩;9]ٲ ?,߷Lsx"*}ϟthMj1OH6Y7ԩۡ嶉C̉p\IMQ*OM)ES?P՝?(٩Uo=ؘ"\09\h~%\nxxlPgؠoK^;LQ
aEh9TSy_˃lp2cQ=l(ۃvնzC!z L'5Խ$@3jM.d_4x\_syƤ豱㴦0p;%7{Do4	r=<Zط~9I6ͶɵSgmmʠmU#^H%OTԌ77֞ǡK<0GjԦ"Rc@@
6W	#EGʅš\T1HBH@WNklفѨ莑y4aL?+JWT8o.bV\	
aͫZ?T&kRq0Nqw'Z0mg#*8vr6vD||Fii;
209(	JqhQͫ#M:"ps_u}|;;8>{GGG{?X|	jrݿ9Cb,Am.Em	Mtg/i/چanp :=	=A육:&u?)t]s1!j>|oh`;{vHҬ˖SN{sF_}np'C*v?)a6;.C1ɓҫ&A)PEtb8N`F6T%B
SBjZR~Y?)?yR۩סuټy"Ffϙah
!7^T[9$N\9A`S?XyD΁afU$kԓ;fcA"5s;؅a1$.;ɑ=ysGOվ?dŪ6狋 f|5Vt	A k'W*pQ,c:Dǘb\͆U"pF.AOA$櫗bVsXxVXT_/F`j[3Ձ݃C|RN,e
BXsg{F
E<f`p+	x/?(FKmmƉvg޹)`oY:%8|[i!׾>}#S|
9dОl&>O #oNl(ivZb``x  ɩqwcLY<f]`Ш#II6 ~3
Y12^y,}j0djhUx2Ts5԰/spR:M#!V]a>"B9R*v@}n-=|p˳֗Rg]EtI(@ah+ߡ?x$1#r00*r:`H!z#~ܠ(>V!!(ou4(,Ǜ-{'1e2mj!xe	rD!*Vqd9
.ܥb2L\([Il҂s. .bZ֒s@dtҷ]ЉK)؀yV{#Jf*3x=u^.
O뀎B`A8=@I+p"ޔlJ3׼9暏eh:JAPўmsDm+	&>^!3+B%ERR$Kp KP"2|/
3FVQ1*EE
^ϝ^ukjg4ʶFd7`#*YߠP-##l̩CD!Pb1#Oυ lfIa."S3÷Xz4S0/s`Z('K6J Y|NT2 LwА|<,ϏdGaaY打8:$ as4,噵[2s?~6#ئI<ᔀ.mywK;Q]jίdc1i1tº+{f
6"މ+JFJd@	 lGuT5QxL-guKckZ>B&qSto`
}u<Cq%(=ꎹTt	JxM= g&nUWH  #fz1kOM1TΊk dZ
#бS9IcYA;\At4L/zVYk~f)mJ osǧxP`) FǍKjUxV) ^v z-ӕ n'a),1('u= |F1
{shna\vɲPaZ'N <V F88oViZJhb"Si<=b芍Uv
E3#=xZRqlo[P"r,˔"?
Vq9keCðĦ}?K
D)@guRI-WEe[6GŋE\ދhq(;`pGۻl_l|;,sT͛(LL3!EI1+e˨9rRya*okL9zHL膕PRpchT*0z^'Ge?pWVJ|3n0p!( uNɴ8w6<Q0ڊSM4''G4û!qN5\Pe/~<w
'' 7`PH/C˚B ?v@0teaWgx݅=fQ80}bEBhՃ{̔N7Lx4!NAOYCVv93$d(Q$9^-URHzNL]tt!"=@	0I`eϐjWb t1LP@R	Sbn8eU8.b6Ydxp[S	k$IiTb@H:2	9"b Zm5lL=b;E U;'t)6DއTO]M]6LpMW0mlg!A"#<GAv6,>oB!1eRGh@y:LBu	1jڪ+^1*>ٞrsFYrT|Uք.fyoאO~Sވt!Xf{#3iS%,5mJ3}Egyh!5JB''փs=9|jj	7`aC%ӝ!CaG-ڃΣDwxڋh.#K#bb)6gA
<ة\@wYiƦ6͘ɸTc#5a~aڱN2v|uyhJl Ҋӷs'_!|ejqԝ|Tp+O!T[xM3ם/hW99t.sj\bpz!?z| e^ib@q;5D ֤@~ExQ;ƑTΕv~K`)3e`U~99D{v<7NZ7Ŵ.EtM9H59(1&号?:fug=r )9\^: fD?D%j́dtzڪ@Waczf?LڿH4;
c|_ڿx\4^)H2 Tc_V92{XVr(F|%{.D7Tx
x9RΔm#4˳Na}_0\6YCSG0zl Cdp\sjFgs #<$#@IYiHV5-X-:$b(TQQ.?nQgш#ZF.se5^֞}9Oc{P	sN[v4*GѲb` ]Dq'Q7j/\2z?~^z;gFcvKY!ƴox{kڇZ&S.QDL(0.F*>QԸ$|; ŐI8}57\)]-esk谋g1$qO 8<qqڄ9>	yf{FHv<ؾ"w|\ޛم'tUslf܌sPlnYh_dV<owzIu_~Y&,/K8 1|copdsdHw?K|HZhUY--ibr&]|D+,,x*#F|a"ÝNWXPJ$(ØHL tkr&\dt!> r B\w+Bw|dO&1UcQ%Ta,01wԃq^#*x@9M_0}ֈlrjU̢a|$1G]qE0QDpvk	p8$NPֹEe}oJ3$RywDhs<)y?6BdfRҼ~oD0[pJA;h{&ϢHhOLdC[	pABͷR>2`?r0s>hV`;p
tuMG [\P)]˼J$fUݩĂ	ozJv&
} 1Rڴ<VɗT*%5׶\N̒AtWf?j6+Kn.4H-HQ8 y'ﹼ2lIhM)%j;J0v{+h-edtgi[x3
_|?",K):Ӈ
Ծ))S@h|rB՛_Y1)q 6yM-%ΈrqWK
N$\v,㱖\Y[zvyٮmjc-Q\рz;e-XWj9$![q t:QǈZfM9ZM{(qy헛[]͢igRl c>H>rC.*݈|RuII0"ԥK5^GeHoz$Z?/?4v.O-x$I40><Bs15BVN&'0
N /	13LATn2$D'1P3r^֣,s
$60l7SڏsґޙG`?|ǵ9V\^?Jm7px?o~aBpo &}%ԛ/R5"Kaѽ՛'lD[D6)5v :dfrȋomP;:ٶśC*PZO&(ك.<.$EfPpg'` c&:oP(αO.ՕZuē`bJUo7ݑ]둋N|U@6RyPxu&kokd,0gn6~@x<>ncN
@X"nR8Eʓw?G(YĻɔ$hbp$jq1<~vS=?؆wd;+eʊ/T6~|04w .mX=?!6R1W3tO_ˤ^
zGȚbۍR\cvzl(`'}G4h@V&)iLE+.mhg0^NV]̑=T'Rk<ݜx9W?nVp,SpWp0=xm)9qŮ# Y;`.I1:_/jvDu@_]8sXImYaNK.=Qu9 "^CbU		TƼv{.6xDnV${[@6:A^g
?JQ&-2M2;00z!3'`8I0dq.j}aVew۳GٽeCLjbYz 6X
f+GӹYjl
sSEdZ0OoVXv"bS!bDi#wxhQ]K uoQVrdmѿ`	AO` n*ʢ܄TAΊ(]!Lo ,oabE) TpXt@.*Ly5μO ny.$Lq:5˒Ut$e`)\4yar'`7a~k\&̡m(Ac+d6nc!Amg8j^Gѻn,Tvw:"}aYsDQ9NI=5붮
IxoQΠ}u؏:k^	5Є}X
Ҿ|;N*v.e4ER!Ϙ5i<zx&	
4ٳ"s]$TιfK8Z|B NL	4EY&1;g_QX2WrFUIy3w8:
~^lco!'rE/a#p3#%HI֭4ZV=CQNۣvWEUyOT=!;"g%\w?] 0܃JWT8nC.hdK+&YnyA[h~zp Xf#]%KŁa__iڟ^l2si,x8bSR1A"3q~5GNlO;r+'5P"D,t4jMwpНgt{_0{$gECAfK/ǒ	f50P5ZuLGbY,,˕X~
|Jaf }d"x12r⺌ͤl	m>As},k~y<]A\Ҋb2NNu%xI7r}9ݛvh^[s`)^;9 "9:۝
=#/YL?J[F6/߅1<?q&sS*CÒ^R)Ӝ'Q<\CP6`RNL\ցj}ȨS[W-H標	@}Q{Ee F֯]|
 ObN%
v?FP1psae,/I <cnlh䙒6bTM:@=&V.lSucq6ŏvZ^F}n Zs	$~(#2Ӽ@Oq	͠-Tu,e4tX&?H֮W`xZJHH*0}N*>yj9rߥ6TcɸlD-Q<1HOM&ŘP	ȃU}6X[R]L<ЭSuXlU}p^\F3Ƒܡr-~nvNx7[r;RPK:Bp5v~74$O\d+iͫͪ92mnsP+f@:."\/zw#Wӈ08-A;bes4/7ߗbbǖXf_DD. #e=`e嬄yP'nʄ[YnAB02.:*W-/Ҏu`
vs%噰Q$*%'l aRu<Sdȼ,"UYeNLU@,=Ky1̓579i:yŮCEдq1_6"H_0~p)OQAQI
SN4	m5Ab|^.3O'PbWf*!@k?]hqtwrDbڜ8ħvoK!k{?a?k\o֜Ns-NN_0Z6'`X&='3߂lhXa4N>SG	1Hm=1|R8F}Aq(i;ޢ5\:^tEL8fJXIK깖M`Z~)ZZɧ軒5򚖽љaO˸kl+'hPloW
]#>k$JK1svgQ,d0H֥jB6uyya$R68(fǋhs/f_r@u
&.z-MO1Kk3ǽMr4U`ՎN1 ϳ\ksy~Z'nү:AyGߏN-G u/,8Gr%2kX{ts#:~ |#)Il%OF9ޚ72:Yk8OcBjV )%Pq"\Ѵxh0!Jc X(x]Tn#4oүeMs0QzxF3R d2= ҡ,$3#<퐠=0ݵd`ˏY#t2mߙ׊G1l͋L滺3jPuZ'{?E`2; 叢;"zIQ(}ReK @x#UC0)ΣQ 1pB1N0mOBmrDlkȜ`o)L wɘst"}/z#ٖ$>
P8NqDe : Pm#0Rݢ-{+ZeA`fވڟQϞ/~Aۼl_?`Q͡We6Z@^6~ӛl] 8;G}|+5Cmz!&ƇW.?mSy/AC?ķ[ȃ\turZ܅s4.5^W1Q½'T
SpJ;gcWPttZ&\Jm&ƯnVo|T13D [aKpGw!UU$]y(?[Y`eDBPĒ	瑂%'@!Uuj2208h^v~^p\l.nGE[JxdFU<lqo)ݲqf_AuQ@uzqHgEպP2E_B6zRぎ9t+\Kn%tRN sJIkT 2_~D<90 ԙ8h_sC+zf@9[VcO3:3Nl3yjzG_tAN`̲⛞'[xDk^:wJQYO.CGlۻ]$G Ј#P-<nx[]cKne,wq-мj!"h ¥A)l27b|ϡ&9S[2ۙ5 [g\Ξ'7oa=U<|U?Ea`qI2߲$/|[`|r#dPt䋇\5%NU_%CDxVW$IZrQSY722"voaan]P1ɢ@&JHx@FrAiWCXg0i",%S41+xueć,͞TVOyDwzPCV P`.>ۙRŸ{"YXVywh#¶) ``4Wڄ+]diO2twq>?Gf	5F.rImlIy6wyɻ[H54nak)Y8wE3ysx'fI(a_9Y~Q|VM|on;`	W=|t068s&Ÿx:\NVYK19|'+SPUh-Ay<W7o: 6`_,@.:^#HP(Q%{G}AW7A>Rm ƴ೛hU;2bއ.,RP+K~"Baİ'PA:V[suGLgSK(lX$lZ{/%Ć1h873e5
梕^XZ
/{!AƟ[9\/>vF
n93 |mΥ6>Lo~&/*'g}^ϯȡ*]/:+zEMz'59:CU'gMGy6GWf--0!:iN.m6ys{7%zÑ'?Q,!ѯІ]7E*Kh;qxcUՠ`ӌn5rIY ?Xԙ8J_ոۊUi;ǴT>K1|XD
5^Ƴd7I=k(]cY.V_
ˢCvy~CY.Mk")c,mUF;G@%n" *"`u8QaUTNBZ a%hB6ޞ(GX[tR~jS}$63f?C=VU
4j
5Lƫ9i4$m<qeXW8wlXd@=83]:p1ShRFv@^|$셂jd<$X1X#LXG)Ru ]:%&3,e/`	.|rpsw D`FlN7X3`v7>]B;`i34]f-H ff5S!Z,vYRr|2Nw\MnvG5ݩ2Oq80{JI'^	bqݨZFX_]?1SXyW<gۋ2=d9*e[Qk5f;1YCU>WKg+a)v9]w6AZM@A  &'+Ao8Rr-N f%z$["ٵ
A]	ğ\G7!dynM܄R+FvͶfa
BgɄL_zzWM%,Mk;[_j=+*,.]#9/bL7bxJZOi:٩i#"@v,5$`3Qo/qXj>庮e,:%aEl>0N?_w{Kٔ~-.;]%eыa0zYCI;\K.|&mY{@ ABwH4 tWSu Ґs}!7VCU2^H)ENP,iitqsqժ[.E^b_zW}NPd*91d*yXq%FILҍOf&['YL!9Sf/
u^:irCީd03=,^qV}8Rw쳈W}K=ER)w4-;ȇ59og9~]a^2̒3?Mɪ~.HZ1A!ZF]y+[/Ǉ8~JX2iWmf\{cȷϧȸJ5&7*c6KP:zs&sWxBFSƀ0G`NCʕ
dRMq=5'9 mR4ς8YA;==LDߙ=6Oh̻Cp*u SuPTJPDפK
uM}.{
7B᙭4(BFA./sfLAѲAqꎵ`9spA
B	O0Iپ
^'@l;~;Q{sͮZdU5F+/KPx0zS%e(yVʌq_ 6o[Ybu.5Zɦpd:8h	zB`%&<i6ퟭ\\J57x..+Q,R&xeg-Mi~{
IGi<mAI-PpgH`{E9!PsʖidP(]ͱ~^7hF#W\YJH$B9N.>hFI1v[`;f0exwmWkX_s~ix"3G;n/rʨ3ŰJN{9fs!l-]B"q_3:<Uc.=v )&:bJ	-g|Dx8IDzbеE [_&gY2:uA[v`"h"	q=kQuy3v%}ZhWjkW BoP<e|zM(׼<Ta>%E2d,`lGtY
cXbeX&}YYh>I:t/>p&%ü"Av7L-YSA\."ڋ4W5GwQ|#.9,8y1AZqΜOvp	F%ioUɪiGW>3G1Beyeu0C)%f1HE^r^8*_C4nx,gEw.J&*d9h
K5qڙc(JBDd*'Eih'GJt5<.o[TN'	UcHmS:TjAE/gEWwQd<klŗ62oFK,21tu
~ܼZ1b`tfjL2BkJ)0C8Tuqs~˚f
`U/[4mESS˳Sw¥s[Eɪ2!hujǥgg|bN!QO9l*,e\x9L]5tl !Q
*^GȚpѻ}z? |&\At:H<hTϯ7[K+`RMpr '6 m]>qO%bZ(d!]+Ē8^HT
TԻy$:fD5plZY|@O>OrYp""9zb Zui̩,fhd(\ͦ^5x4 
|=Ar,qpZ Ѳ
 C#x4Z"5uzUW\qmOPUKkrfiCC9ސHJE3-4j(qŖ?bnb
vز
GO$lנ'Ħg)SS	n36=8SmK	͢͒q&El$6?.BWhd~){gKǈ7[82FQ*Ȝ8.aQ
]w37݆:!̟)hX zوD\n0­v/һvHA@a7Q-ƙhEϯw86^Jɛ|yQ!߅|=zr\? HZ9Aj"mXg#aNpsg+%'(Bt4|ti~޺K^.*TklyovB_,gR݃)؎H`(B`OU?Tb>b<r	mEd^:V,~6yShG>VnaO<k۴ "YnϷzmHQx:yb@[Giky6w9O+<@k .
!ufET#$I#7J#o<
~DFKhk\O5Hqx䋊ȤSz!*j0q8[Kdgΐ]Zbqse3 (BɸlHI'Hv!J>:5UmgN)|ʹXa*dbe蟀xnmD$~ns#t1wy\@IEP|IĬ= ڥкZ~cc8[?sRZ/1BgtNǯxw >dQ*2)F@zOLһxb#(^wJx⮟FQk=	bϬnf551,|qأ*mfur @0N"<0;pHIPH#,ށ<T\NiJS
.Z0%Za\iVܣַ@?d>R`ݟT<@yAshT<=! 
\혻j$,c``l<'j'A4s_<	Ԓknȯ*/̓;;*tgXv?89 Xu'葰w{y<l1H^P`->J:r0%Kd.S+[6]LbFӑa^Be?~OlYq4gn`T֚{q` Ǒ}Zi*9;=_l1d~eLBX`sWFTJh.;1S~h\ʻRfY[t\y_8XƟb 21 iުXsU@ʜe4栜so8&Uή:eXy*w,Թ}.[~׺FvQ"+d^\MKpl(?xɛzVdxXË̔lBPs>{x[.K;Dg? 85ivaA	槵p' a& ݧo`#a'ri v3+ 9Ԙw&kWyM?fҡpx<A!o͙$QYYb`(*q5b}tgΑKgd9>c*	Yk0pD`RaZq-Ǩ)Oa[v[6V3Ø4yB)kNPZ#Q_:o#LAɏ_HR:2EOA^$&2t*?I h]#To!"hBxp0&¬aT^H|``
<hUϰ7rqڪOgb?L#5XIoYF@)dKwZ`m@$1\N	oʹO|~2p_܅r0TpYձܖ\?46yQt	h=&fJ"Ĳ .쁯wY"ZUL/F?*kBXIs1
-'ʃ]f[w̈y`	cqjqT@~
N;E([)OD+H.;_#_[Jy|s½?{N9	k)I5|~o*G\5!	Xu<
eiZ~iž}(>&cm[1ܴi"xUNEKWZ[o䔍l::S~r#׺h|<CVsmt>ӠjFŌvTBj%ܳvV8Mcvk|9Jc 5+M\rP*SX9\>XR_2h? B7o*I|;tR u#{lGQp6
ݭEk4,|"]d#/J*89SWaWw6-C^"CsRМ2ڡ;8sըg.AEv1tH)^PDu>Jh's p4
xX*rYY{NS0"P@.qDVcT=Arb<4
`6A3$`8*+622\e5fti?D،iRX)IAm̛+o}] >_zH KN9A[chQwsbTMU+8dyAutnkȝ\xTs`Z.>vLFDEʂWڊq3~~T'l$*<[:pzf
O Wl!p
ޤm%m@xxJ'@R(兪:fa"3koܤ'|wmSN1:p(ܸ!\%
t*<zI+68S8P[!q¶_T@B]
1jR~@@WπwX!lu^ޗTn˩;-)vX818H_ﴬS=?s.8"LKOqS2g2{**-_
IxI/Pjj)Hqu#eWLwbMDRw!dki<~rvrTvn<J~,M0 /.7z'wtwLwD?Zd)iݏ~~ҳ##\;R<G1ZP)5 <͓pބ:ϼ˾-p/~[a]|kɷ馉kSшjbƒ)3O53&8xni$9IVBQHm ]
%`XFcDeAxt9'$J5jB%Hl	(Jl뵅\>SK8:̧y,d<aF#w&[s0ғ0#HefCҴ3LK6"3	Tl%I*`.Ww􆜍Krݙ;HHSA8Lr	D)IӯrՒO_bd.Djr$,?Mv1mb0&(_?'-Ti}4i|CuKQ-(~2jX8$$I`.ZÏFYqu"B~pnkIpgd;5k6X)a=!rDQfj䦐|1T2mw6m9F{w-.NG(طBkfi\Tè"
,Ŕ~
De6G9j37[(xFb:LcǊL!,JC}'ЂQ}Xh6רM>Ar6 КQ]]4,~XBSAM ȧdq(P#9\&])3ey؋,Dj#W0aH`Juu[ XZ"s#K7geߺ&yBJ}wx\'NfCa2dqL$DPaR!vJe	$1"Oւ3Ej7߶GƆZ>vdK` Z4'~=/$?	Wh1lWW6v,6%r^Gć
+4nۙrMW⸭VGbѬrUٯW)嗄ͳ9r=mn?ͅ#e:YYXT	q+Hj0bVPc)^͒+=:E|D]7TM_bZKDaqԜy3N%ecn lWXH0]ƼVZ}1n
 kK?/xOc?jee
B<^,Repd>%ԋ][A#B4sX8*V6CCl)ESB).	N'Ju G*]Z)9n<r_i.-6IIU]s>nBq!@IYAZ oo_lP>ssBۚ>w*c- X!ٵsًXT:9l93ҹ?p3h#OM7?R%ƊlM(.VRKdIyk]A/z kLcD
@gMo:OjmFA175*.\5`q;Mw55srģA,-:sڜ־5ƽEA `Օ7jlV:au;ͯmtnC4/ȪS{-5ސc7W'"zAN:A
+CV`טEȋݴʛhܛ)ɢ`n#{'q/*)M;xYu^yfw'
i_(~OԮP6¡럵R%d W(_C?LPj;7-vy'.dmH`;E$(kUG3& )T)|Hqaڀ"E)=]]FfڏNNt.~sr۾^3|0:	Sf&*Xgf(q&>l[62Q
sٱ4 -p\mؠ4
37[XwR0 .e:)aw־ە܇`tռY90x\a
se*"T4]#*uk9dΪlm9Y]e_F,G5t+Ks8Xr S*R$Pr=%|=n/bG\Ix1D@X99'Y4БgEdntRK7OQ,:CKJu*Z#U; ,lLkfY]5A26/F̹z7Ϗ+'y3qڍ(2;[`ŕ3*=[%B >n~z'&Hhن9Jڵhq
m

zc7Y2˱}
h8NUBS".yԃ( O[bx[xvTD{m39({ݺ0 h=[^6v2&LGG+cͩ_λdnU.'Y\ÿŸB\ݫCF PE-[W_5RO.5;m@:4[l@8h>-Ybpf7yiw=)ZD_Oyذ?lE;Te'w6NN*{08rǻ濓u/`*HI~:){'a4/)N
|0H))V6A3{jYl{"h ]jHBBCnm,(hRvI)(n]\i$
 G'i*4ӭr053{v]s>wvy}kHHѠO/z3a ,|z9I?j?m~h{CDQtէͫO%Rֻf\̮;!~)ؓ QJZ?/I;`_c
%uZ
tLuwˠz(7JZEbh9cbnq@{3{Lgݕ>1k)Z^ow^iR?yG\t5lW#]x!rAsAh)yv_\خ$,}jf=XvsxC!([ޗvc
p-4L-a O8#D¸YM( 5Վ (.GŜy\Go&qqjp~kf79ft17	%ڃ˫Q9]ܭ	d*gea+㘹iB^<4+;RifSYY@Ʈ/o;- rH]_NE8bȴ*AnBz2]Wð$A*E%:ne-rEa0j@E	I&)}aDc?P~BsٰE1r4l=#2+HaEy\a!e8c>BD<&9S,RwJ?zTG ΈQ[EKx(m6L(`2]mU]uK+VY7|L4AWc6iUJ	$v	u.bŏ\F=GְK4Cʸ`1o݆㡥W뉬;+rrVbrd:>VHj	2mV8xR6[,Vu|9{M;k~^e8p|7D,΃?KxvOz:s')FC5"HIܓQoG{a%M[`7'#2<tss
w;$s5xi!8sn[
#WդmvQc=aUփtLeȹ;)\"E޽Jjw۳JvrkϻpmUHxRD3G4&pbAy6u˯|.c˺B"쿦c086pw]96.!;.wmq"=
/ͱmEqo	oUX0Ff;xzYObm;s~f-I&0㓒hJ@p{N4?{?Ia*x8	wtosF\7YCq_{H`j"P{yk#΢_V)78cE7Yt7 6Y>߇pptT
CGqgMS<	;AR'hII1̥
J[F՘CA
y#^njTt%z'[!/ŷ/0[m8y[S2gCk-BTPYZ0I sedyY-4\0SEuD8KBPb9^2%6|nȕ2BotN.dEÛ׃\A#ͯ-0۠Ļ^=;]<q4enꓶOtȬ1] rxgjy)_`8߯)E9HQ;.W;@ع0q*raVb.;Meb8OvT(>J!O	E͞C%>SbU6kt{1ةBm>qOۀlTepj>+;K[iɟ}<*a)ZFPǦOƽN\Is0.Her8<:1Mx^"UMaG
7^52D:6jʰA*@om/@D@gwwL8G Jtvś?צbDۿdݳED8ׅ֚GoP&h<:K"' P%i{T٣O2Ujf+Lx}[I`U#H6z>T7 Yq:se/=N;oUӹu\f
&՚ŶQ=nkb6Y=q =
x_ exu?|0]6/.z T#.jh.&/YrLY%ªQ'ᚥ5rFz>UC;׹eLre_ՁK&D,|:j_/љLФpf09%TS?{G0
Oќ$ #E Y(EYh%N@34XR2y>nuȓf&2tWZUjժU ށ]v$33l&>cKb-+ 5,9]L05	z".HgdZV/&@䋃Ja21
)<0.Uhr~ʖ43Z&nʲFTٙ ͼf⢩2.-XLfw/6+$}|j3߬nwnVqX[ ^\aNYTq.*	[b;BOh.*y2``C|"ph'lur,q	o$o8٥f8I^
hư}É
>RJphƠu{tvށUZ;'}򁞎O:oo^2|M("F 8>
~m
˔U-L3C E#VE_xݨPhc.{
Uo.)VˎdqUVr#-
bA`VS|4o^9,0[	&87ue:a1vi*I4!׍u2ߙ@3crYL@(=[tߣ#Td@<#me@ ãLU6ޱK&agz\*y24%	Ҁ߭X uYx
İ"0p[[N9r D+Aʄ;hgVS%r8ufpKťw8H
n"Zp%Br<s9W@jI@aF$"ygݧ2D6纲SV偖%ԆRc
GVL⻤H#LQ4*4198#/It ʂe9N, ӇL j-Sk@:dG֓0L&
*j#ctd+IR1ƨu
(Qcm/@M+P+ׁtL0F@^j;w/#`%w	{vlGl}\>ݨ)	3 Ox(XX<Șh|\!3
d
GF 9lq
`"HH"ʥ8_60VPLPWD6(4c-8йa+dmT!K:װ7^Dl zt,~Ւ VgaA+P06*6|ē&*{.:o@$щRGP
$l%#hinLPL&yW''
lxǋRajxJteO5&+]͂
 \>HMqf̀+4VIהi_Y[[0^bpb6۹nY0LVu\"ZhɼUq-iF3'E
exȉ`hUX,h'K\bYTqRɟԣ*gELԙ.FK+!UsTH"*6)|x+=
S6E&!Q X"-,g^e19Znqީ<Ig|OJ`z+RkM09i0"m{%,Y~Wfb,&y>RfB&p9~',.yN{}TITJ
K2BMmX"?*y%yMgCED8>곝?!u! 0\r,H%_Od)HoBN)$֬y퓅uR1dw<{O]Hh3A.vg[S~t_j_%#.\r3&`es1 'p"o'*
FVpjabs!RTHe1.5C/h$#䀁C!Ϊm[!hi2-mۍ|~bW"n$PǬ(vޢfJou|+:p&/R_E8s5fZ$ea.i2?{R"38Xe)ٿs"@Zk@m"׬ i]H& 'H_lխpu lAS:vLyl`Sȵ].} #wyo,kp\
(.X%
RPG4l2(u	rd#m)	KqP`eߊa]1>$ROjz74#>og5@>XSa[(.>[ry'tLC'j@6kLY\vզ{_řgٿȏ%Tv
hccH`Q鏁EJtUANyRq}Nm疒
LW=ixF4[t	1^Y7KŶa/Rx7%Am@ ԭAnO൱xVQd6\.%mPv>Y_E>.Z>.Q41tM4udT,y@i3Y4ksgQɺP2 T+KJ7ÿ(U6l<Z><YBb4@vZbDLUaهncBr8{j3'Excjsr#7),fBg4J j@?$ġXlhh370kj,uinعN]s^'@7N|Nٓ@'\2(.+VP5qRƻH:FսQL_B])tnYKJ tI@JF1āO)=dP&Nni<?msc()0mmw,тpvN=`cCq`K@eXg OFE+nއUK!0</)rY~7}zR=yj=o}9D슯+[#<I`1TI܊mUdNm5g"ȩ&d@(0/ERnd\=
X'n d7j0#)98 0yQƎJ9TEyLbt8̥oNF
/x;^d=O<7
8H\!K_350QYSk,EK:+WETWIv)X.&@ydn1583`Re*lDqe۷27 in:ԓr[wflK3ҁxZs6u{CI@wȓ3du<9)	(&{)<ҤnJsr "j6~( θս=5¿L%D7oB/.x4Yd|h8͉ءzw%ې7܈~B 2apX`l2w6G
.*-Kcn8[vq%Ӗ-$ꁇj+2!XxH^ Qf~xk\je@>hV'Ύ,{$Ȱnw
4Zp 8]x2W9Fc@~`Z˻Y;ٳ %sܰ:y}ƓAv{TK	^t"}%dX,,V"1q$l$bJ*Y݀0O0K/ d'Kf
5qUt" .s"WD?w;
ǡ$865)4vAG%"Qe "S슛g*8Rďs+LQ"qDn g׮2iwB-aP(l&Q;$諍'ɻ=|hg@2'i5f_F sq`;Y`nZS>̞-tZac|LYC)8y[M6c||﷚=3b8ovj~p Ql,'ӿ-Bj!ARg7[FJx)1]"?$2 s.aygZC EwD趍	Be#NeKY~cd 3O[mFFnYvOsCnTMaZO.VKd~e"Z/:kz^KBۼH"vgEщi&!V9 HK/n7):BZy&%,H}tn6:@p>~.=E%n\oriOg^ρD]`U瘓FfI	yᄖŧpuJt*t=Cq
/-ԕuqKtFO؊abi 9L>::)uԵ璭z_GDpCF	DR?:w-rhNFͺ]!Yw!Ú)V_R50/e ˤ%DW>, ;6̑7\sGd8t@upݓdM9m^	Y 2LYЪh[G]s	X5t~ͬOf(K%dy޵PpgMf\JXr㽇W^cw?k#yX||L A|g&5?wKG'l+^ݫķҺa c@g\eKMr}DA3a1+"@-a}(Qřl18ҎԨ[';!c"R1#'>Ƣ00c8R&"g]BJ,/}a?fQ%mQ` V,,| {nVb:٥sy2.Z`PNּl{M[nF\5nVv4nE@^d(1V#jNͨlԂrt[#ɴ44e4O$E&Wo۝r
`0=16U9
bX鱶~okwي~N2`ps\$i} re2^4v4~^3@h)AJ`Oμ3&TX{ T?+]|	$|?	}K&}~?~UG`w]G}GKFŏ1@ReoF-}kOɭoE&;CbcTٌR[Z\
	GOc`neWp(|L;R3e,Je6	u3t

YA%	&8x{F&>Z16τbrM$9'YʨbJ(8TגVP0M9-ܶ^5ޓfÙOS˂S$8YpM#4Z\D|+nR"dը%YELԂ۴P~lV"7hͼftz)?6kҞ]/_{̭5P%@逢(pBoh58ם[o@RvQ:y̟'-"O)%
6Q+gp:Vt`6ЎplTTv)\ZlT`mP*ntW_[pMMgNo`F,JmUް?˅P3 ݀'71Y-K+]rO꺶ݲ\:J-`VQEL[՝3֪,pL{Rbɠ I0q<ϬyJ\Ƙ?0R;GГ3S1$PZGᒥTD	80V5r="_-#<Eqġ#iܭ sTmGt[n\%t>y6˻X`pf }+2}2fӒZIYF@VڸKi!'n0IkUWHr'e"fem35~uُ {i051.OD}_HN&'ɈIϾ*GT{HLIUIp`Gk6m"
52$\IדփFHrwxS`)g3@(uDH%YƤČb_cbmcbK'bAݢf$Auz-.W1%s^%ry)z5]4=yx{wqHPbw9A-KPd,[9Qiot//yY?mƻ^Y)1lCGi5jvr7Eo:vl~z cDs?V\RTwjmv)6wN3$^xoBF
0g/쮊$=7L6a*`ۑU qoQx-gmʾuK{dCh	0Xk,\Y-C;D炈,A.!00屸y=ޠ߭7k6ۉ#/<nVPj
]-IuY+[93GIN\!C6<mO+e3qIq?ŵpWG_Iip^+e[6lcsNEI#'&i8ʦls>>	'J
.ILNC3(=w%U`y)v$L"i,DpkAhbXDny?i.|"XTn6V4[/lpn.P`Ag͖=f-|X|
:X>d.}"uh:YI]@շI=̟&sogoRX7#|Y&iak! 6*oWB)=Y5ma2-ZaRly9%+*$neY$UEY'bPB2-&E;8ڍ5W2RE(N6%my]PʐKW_h/\yئYư{Fqmy]`a׺A~i|n	hsk*Qq}et,):ƫ*B[74v}P +M;PUfRP l2n?6XApD`Qh${_A(wLl*7#X\+f1Uq؆vM9
-|aT%v_[#ȶrqX#4la26m|-|@"Mr*~DWqzH1bG%yFqC:43NP30g(E[H?؊s5|ǧ+sn7h@Q7*h`	V5tD10FgfarZS_M̻lomKl29iҿQ>Yh	NRA,a7زqg܈f`h_a CxTڈ&O*o( `qDq]T4b^&]QJM1.hcpiD7D;0	F80OH* ])VG ȕd `bt:z֠Mb|6m	"-sȤ)e JXmC=}\@l0$/V<I8éx=/>oak1`NmGm=WW;) N4;*դ#	M[c3.=/S}=o}[$Mm	w/[ͶBEc{d.0EBK| FgcFart^/?x@vlu%୭c#ʩaM'Gi@p*-lWx<a≳&Q]Yk@AJe3
_/<*C@mC?vW FJU\{ILO(Eԏi{z'W`,Rw,ьhZR/P? 2`.f%';gQUa7^S1:˩i;W8\ѣ^xD<דU8Y3a5󧲋"?ɞ*q<^:'RASݦ1&-"V ̎$BgZ	,rھE+{KW,?"efI&z_o7OO>#8F)H!c]o#NCBF0QlrFBuM=RԯVm^6FξZF!&@VQǯu7bNRY$ُiy6Jsm5\kFpXZ _Png%UFS[)ŸNF"X3yۢrZWLcwsFN;OZ97ot#cS/PBxxZkkGݙubnF'F;PQ	6w"60kOP"*h{;(FxgQ& $p:twAHs-WRwzOTj!hi<,5lo7si!YEiý0YOaZ}grwqM!E&CS24q?Fܳ$;{OyN.֮Re!Q9uf,iB No}^NdUpф.ZyTOfI.PQ͸&k$Nh`\mO6]f۩k &Rfw'|EFJcnPj䞫V׊Nj+HNJgFqj[ŧ'OF7A1ZH3_^7@jp.٥ u}TikqN<OܙW~ame_ݼzޞ@.KR s $^OU))ʉ,h@j8]MeI/>oL?&]DjW{bջm(*"ԾDv3ї= >~N!>`a6Y65F{܈ٸoPG; G8(AŬ_3]MN^ogPe"_y18WB(xh.| N!p?lgbsF@EՑn(YlL.M !vdLΆ$p"~{mY2 Q#ReQä#Yor}r!\Pƭ@qٯ|21qO=	{ZM'k%/5ݛ9rSΚq{qvImFmH;}&djoRQDekR &:1.:(]qJLׅ*&lOO*=Y\Bj8Z]0g:06MsՉLykP<ta外լȢqxzhZr9[<XP7mkō.p(v8Duf}=j9zkPl&5I6\=
:/&
-VSgbϦ;Ɍ7,wlT芚l*n`a;B;+'q,v'\f-oK5zGDFJ;n^;8osfRTz d4[ʍb$ [Q;F+ǔ{n滮bsn/,S9CNY{Eh:<V;%2
,M+3;Uޭh%<rFoCH/![:R cɮV~&f40ͮz;c^/zt)aiIVB3n60(b6Op"mQdrr5ȗmzYSzAC?)l 	\:lMq~iKdaelo	~Cy<x(@ɓs?2"%]jCLwpd wPp2o2d$ga,@tRy]I ^b;ݰp6Q!NWb  {DݮS+[Y4%zJp|Mݟڼʯ.%ZF7?:bQIn={ds#J/jΦ#W0(>a+m.#!<pV"H?	wLNYcQ̍q㷸 I#eQ-c=.1#)@vƻ	8kr`D.;Z1!Z?21rEtֱ?i:Ba?gl4bՑ矆iжWj:ށgJKeJY:3tV|%^z5޾]xjK
s<S,@7x;/U|cy͑:wws0>5ũEX2QeyԿ;hD&7WI@kL#Ju8OQjZ3,IQޚxߤTK0)1.\=K<x0@9>O'FҬ3bEdw3,3즘l!TQWZjedSVS5_3ռf:]j2AQ	g|a6i4bT?HonJk`M.CpJ=E@zqx4ZI?Ax;q`2q DկnJYZ3^|Taae~OLZj[Ͽ`4/p6%T[:8S~(QLTT
]vkTb0 >Ť:| 9|zVkuqUi_\,d&7:J݀m(umnM5%ê#ej聒oK=?J?hURi۠H?@` etVrqFC!JY0ԻNV&w+,&}?^'"Yi`;ĐPf[h5xlXV}8!%qF<\q1d}4*
Y54:%0)I0|YZyq's:~T#{_qfkQ[ơu97dD	/Bv&vymsLy8|#K}m	˓Ǌw1G8)P]F%6)#K(;xZ'0dL
ZYkU*fdYZzaR(^L h}05NǦn`)T<7GwLNxmM}LM;F&'kIdN:bN'í56tT.?WJIBr:c|MģG#RmaS'p\:Z+ -5*JH_q2		&!Xj8/(%QM#fPy	Fo
P#Tpgغu/L}s	״?qz(=|)V,^~ņ@f=[+RLd9y {T5yot0pO=	VTlvգl7dݤHMQ p2SފekHQѪ.ftve:PMƲa&_6{n~(Fe0Ys9٨ _Y'lh\l<3s
̆.ͮC3V $>pHݰ?R es619k'qaL
PvYk!vcES0V>p}*=H`csMADq<wN#|&XJEg*f~MrvK'܀P@xd01(޹touҗJobVhk4hOAHn")dij+u΁$`7%'Ă͒%)j~mJ/T	F5],(dRu-kܛD,Ro7kf7xfŭ4o#(Mt;1Zz{& Hkfjתd8u 3O&R'ZnO scQ_?Y&Yܙ>HX_+R(>\ҙ-#]fB@<Υ?/.Z?0T"TUh+ݰi.sK~~Jbͳqxk+܏	[62{9C{E*6\[dω_fGw'sJ1V3~r3o:΅#Fɳ,JC'4ֺg6jOa
`Jٜx`!)6^]tJIx8LA0;[I5\ cPA4"Je;u4;VQ%*qFu7x^JllZ>,-`	V$A4r.՚$?SU $ˈgUg6O%ڗ$Nd|3FZ-nc7Kq-ȉ:VAC$A_A8Xpe7$]/5E:fU~\2NdE8X' \nhEm2P-`\Tb.ih]8gCS( %M SvJSucCI2juuT,qLIdW
(tvnQ3˘NmmF'Xz|:;1'st^xzF`h\8	Fh8
,홳^hvd:J4ɳCqveR Y#e~ys$/5Y)rݰY5O;#Z,Ug`\J 9b{aTʏ@l#;s&@lv&0$RV:Պɷրձ)*tahӔ	j͒'*毮o,Fdd(Y;t)e0<l>K#O!sHPIFJ`ۉ*wTO+A
o̿NTf!]î2Ó:5d
iZRGDc+	Հ?8PK۸% @ϫ9F^ᆞعoNVU"e)Җ=n,Ƚk<TLT"?}_\-"NcOq;`aOԶ:4iִb~mI8ݖ$0\,擺}A֜ۂm'e,adr19E޹Ue9O7h]SgqC[He heRcղIV4s*smS[oo;m^HR~
z+αaI8|Dxi>,YR .:Acb9H&*?ƘOR\D	G]NyT~Η}Wr+iC~tu͙
>K!%Jr/ޑ;2U>NԔ%R}ݚQSv(AWz6)z٭vZ)yap`D2hR齄Ѯ)w`9rj^ڧa<  2.i"pji&U5YX7'ԲVD#j<MMzOi-1,5_`h5GO<FCN--[>E&2,/X2gg)guBvʣ-x75͞ϐGa9%=ic#]eӻG=IᬍaE{V6stb\Ǣdy#西vmvFPqn)'kΉ,NA :kΣ4Zq|K:oОȓ%6a*暺t9gopEx1n}qkFIm)m,)%=ѷd@eQU p8*ᵝ/b2{Retl6Q8`fӓ=+%(l}WkRͦ68qEޘBq
-R嚲-Mo9]6VE0[b,Y}JfElw=+`qUy̿W'j3ͩUu8OFf&ڀ5N\Heׅ?ZL)Yƀos6)	ďʧ̺)&+qK[hÎY\OG15ykvL#O<<?G̟FFG_%4ގ먥DGϣHzAdx*4B-|ov"1IR (ev5_nb&Z5FrFү4+=Q9}/#̘B@wXV/Q:T>Y\_33ӲOg~L|EŒWP93'blAe[ET|ևBY(wNwѯ6 udfND3PWήbfP0UuULGLr~'>ǲf2p.)GlGTϢhAs6[oۃwO/"H|ggt@X>bENFXtGY-"S"8{q4#VGCƎ%bb:xZFE%j ŐywRdpq' yNL]>=l"g','AQ,oPRV΄J>^.( .g;3gUR?_+t>9ft@ʸU.6+N	QF0\m/Ы3\3=RGn-l$ۅɦKFP{\3iOvL4#O+^0H6h5a`jzim8ɕbx{NYɶnb2.:lt}jE1f9nU\gpm3`[/|8Y_0FFf9Bm0vq!B%ߜEH,'xx,5 Hh鋒2um"hi:U{I\`>.e@i^kAى;DĻa#"g4ɄIlO[ N  ,tt/^0v$ݶu:~ 	TD8l`͜hyaoO2
vEyy[W^D	Q O8.{ 7x8lx>H^$0=ZSdkbA
-[8NۆW|_CU]4يzvC6'~-_U	>j]o:Dɸv.iրkz$;8p$ݿ$l@xQO{wsA8ܒ(є_Y@[ID`lj%$a3{,Ym<i&D-JS$nXIuFjd&xenGJKk

߼W7MGɺ9Ɯƽ gIie_ UBd}#A5y߮Ҡ9emޡA#Vsx=,u;n`GW!Պ}x-m$vFz~q=8&XAϨAp\J"U#s5& XI~8}7mޗgfDFˎ')hIc[Bk -52DMJ*B#PnV騷0H@"COklBzϤ"|XimFB18`"ƨ-0M#]4CmOUsJjS C`tSB*oO	2\"
9hɲ`XxdgJ `D-,nWh3ۈ4FN@_hn!JxͽHz4pAU8}=(3"`qϙZHS>@'w6a x"fК3l{&PE+IX 2UK`3uLq#/d!00! ?s
Wj7reqRCJ
c[ԷN&&t_/N&@^m^0WI;;Gװ`SnVen :BG3P؆2:lcXEZzVosZ`;m*xH G9
+.%tvgFzb1JP9_f_HZ[zr۾W}IĔMgP	
Iݑa9yxŜu!zZTX/s uEF
>	cpo$"zE̊	Q}f>6PPm10vc4ʚbi{Av[No0':#AaQao`AkޓjO<ي&U':v.TƳhap9R2&9ɛt!˶\^QsNBVm*6̅;s)	)~ڄjלa`77G]E#oSkVVTlÉNq?._8Z-~Mnƻľ7	nIA
jhBki>cFwEXu Mve`Xy~>^ LTS^kߡ@>ޟ_I  aA!_c1qꆒ^0zr)  -
QRoqN<8+ql-'+QQLbMkSQh,D=f9_-n#WbtzH/au>U%ЖkuyuO:}<ugxZI#*?5Qb;	b:?Aj;قfpzOIQDXS&lAo^' MWNw0[%S8&#xz@bCK<?kw->҃CUhz잡ag"iP{Y !&Ch#H7y(N6#q8l,]zMÒRc0".Z~5~|?#75t/4GWhr5wpx4K%ϭ+oS23Wj- Yp,ʜ$#Yc=pE2u㐆:7@=-1LVDŉu2bsG>`w[2Yb?)}w=5rVp-=G)G(X~wKJ2$yN`4$7@D}Ab[koJ\#z9ՕkْE.~ۯyԛ`bGg'(3f׍ʺC,YO"M0|{XN<Ye4X+{D2&ΡI0i`0qPAϜ},n}^3 
'^}N˛m}>b/ y?	^%mf+-fO+bS3h'$g?Sևς@iÕDx5G.[S)Ua  e
]\85T'(&̈́YJ_x8v-ەXVH iF@x
 I#<Xn7nQMǄd6ۀ<5K)<iߪ6rљ+8BJVdGBA&71`AD܁PH7yo?)~	rtńN8NHFmd{Q5Oݺ	ytҳRԁ-:jˊ\6^#$uܾhM%&&$m4
+L?4+3]%)Mgl'Z8a#.!ސ-m8BPo5g&oFjxp.l\xS9/lm3Ǒ˨MQͪɴ:-},atLWٕKiS)opΚ-A|g;>dPj"FI){/mAGݿ϶xSB7һorF;.gjNeR1Y&Fc
}a1?H%H?OBbk{,Exo&T/&cRa=zu["9$(:F&]	I}!2P3f_׸@*<%ꌡ[ugPt
{`铆$
;xNNS75~Vhz&.R)Ͱ(9q"jQguN8шv]VV`ȲOA.Ps<Vf?5!jhk .Yj%[u;n+6ѴWjڞ%lZ;ePCl QŒ,Ze_^;ãGSav(>ОȀ{>`M;	XiXhĎ$$́Zovp+oؽ۲mƬdb9?I؊),-YclӇ829xZ0h`ڵk`2x_ D|ϯ5/y1bo!"JbX=,}8RJ$QkcgN]/ؽJ;yMoU*V9o`jjx|VeղkǪ&同ue~zXė1n1XWZJ5ǰ;8\M[b65㹢[>qK*:lu8
cn(>1#]ӘY77NG1`z%p_,N\.\85'#´m!7VbIk	p%roULO(4]޶4u3_A9<Duy5܇Yzoר-}B26[x] +xieDԯnɴ<2;}hjP,WiF{7@K.l.-v~@9;_CރC[/]s!7hEChtjXkf)=6?sנLx?ӫp%kx[YZ]/V8ZsΟH5gy+60*⇢B79,ClΛ!@z7l K~)`u0s1|	e?]W%='e7Os]`%]Ϯ/.z-:tSf@}xVuSѫfCmҪU|mƥmzn~\w  K߆~
:kO]vNⲟi.9ݶHjkyuSo&z˺ܺM]W_~5Un]x8ي~]nm+OZVӒb]kvٵ-v;?y=3Cl\öb8H߮[ 7>Y:ZlCO$zڶ`S8vڝkgD2%׵$]u@^L]r&t8jqǳiyUpn-  3<`aj2y.zZjq}Y?njsx|m&cA?\W&\W1sH=:ؽw9L>ڍ56x%r1Y,U$+8v/;]	lzvTxtt	N:hPyN>6 fsjեCMEssq}_?vuquzҀzKZ~&Ű{	~e=͏W yޣHzHV.x$_ת?7ϛV/Q~	~]I7	GX{Ƌ55\|*ɓ5[Ͷ{kVUD5LuZ(|x?]4 b].5jbrYo/ucJ[YUdz/R'볒5aM]l]<]uճ5u;ggfoi,7ZamXk]uW!
tlP5P֪?K~+69kĺ'W$ԣu5;>L(7GL[?/.:u(ɢU	sO5fHTU. 88I{~|hw<Zv4,|^;͋fR]!k ?%X=ZS9Ply/g6iZ"5;& 7h!ryf[fLu܍Jί@zRXN[xLFɂ^%0lI[ycKE۝Vsm]gp*D&<D(W.2켼,asKiu{nQ-Nz	ήHJN!M^ǥ͆z}jָ"<ȯ?<wWAyV\fNHR=eϣu\vv%sBÕ*4}_ߪΫWrd4fI=TA^QSn΅mʿ
@rbW)H~F@v6,j+
+EA{_eYF~3F4w*bEM\4o ,(+
(m'_5.].US :(h_:du
R'P
yR ZMF|>@yVO ]	8~iׅm
M8Zy_D灁U;-%Juztt6(}L?-ha[G1P(].,\qCbS|GWq+{Н'>LWv*k8rkuVW$GHj$l/>bUuH\2Ugq64 wZFWO7JVͧ](a|-nt'kģ'f=@g,Ǉ/aaFg:?K+U\`R*`mܝ|h\ԯ{6b6	Tr e^VIEolFV/Dð`Mn/zf	H>+kuL5YXCu.svQ^{pMm{JbV)]<+{~RXRoYJ>+lhBu0UOy)|[>Gai:erԛb8ߌk 4@h]6dM=ˆ}RXfՃZnh%sT755=,vi_	#S~yC6Ћ.Ro
u~5aam5$	495M (H]IeiX+1ia^7}^5ŵW*kjHya3kK20㱾0rNKM 
r^}f2̷gC]~OHH[<XSۿ!aaag$@^XYX׆^84Qg:M.TY|[xNZXax{Mr>:"#vP[hQ!+~6BcT(⍹/s}jN'yzx}L .1
ol.s[yؿsf.wX Zzu<;Pпm_=I.lP.^[ℝ=>52rVv6(ԡLFxO
6f,䖀-FNsTPkS onY7؈`?g^Ӧ<7AռqƛwE.u]~ (~Ł(@.WQFavģݖ_Jm΃ZzJ:*OSٟ^:!l`:{q{K7o۩V2rFyX'}0	=
D^)
ƙԉ2jx	~JG'r$a&D>amk騼|,v~L/K Ĵ
E1pSd*OCoI3JЮ{;^բ`͓i6bF3p%rD1ԦD}@;$爪/{ƌq1"Xx[eYA:\"Hf"Қk~tc"|\Hg۫x^;^G߫WrU(WrU(WrU(Wr՗VU(\5(\5(\5(\5 Zr5(&އrPn ۇPx
C(| >  @(w ^@P{/^@P~_@P
BC(|@+x
޿zUPWU	x/#
Ua0FU*Qƨ
cT1Tax0<Uc
0xa!&I$DUa
3(U٪lUa0[U*Vf
UDUa0QU*LT&zf
U٪lUa0[U*Vf
UDUa0QU*LT&zf
U٪BC(|!~	_ЗP%{	^BP%{	^`GP
A#(|>GPr0QU*LT&
UR Uق
5o;^Kr0Q5LT&U`j0[5VfU٪l`j0[5LT&UD`j25VfU٪l`j0[5V&UD`j0Q5VfU5l620j~ЪZ< Æ6@ m@C~{@P{@P{@P{@@R= uHR= uHR= L^hOPI5eUK!ڿɳڑo2/@V1q{ɳP7<h6<rM-!SMݺqti=%YB;#h~r".L-K7qee:E!D0l`|쑝hܟclnҹeʁZ)I9Ey>ƖFx܈f0wB	d1z~W<#cN?	K?7`$qmܠT%(+7G\Z''M38- T~Qyuq<Qބs%R6XO*ނbmԝcJS
?A,)y8Z0m	ϭ~_9KoCFBzkÁKEǌwDLyIT3P0I!i$ηȏwd[ITY/l?VP:25Ξ]vk]4 *:bVI[qRlمI"1jҬ3[ßYW_a =xJ4B]t?ٯ;A;Rv=|w+Z52l&Gq	%uEG ]hiy/ <*OpəY 'WĪ,*a!0Z[\]^_O^{#Pהwy,$%gAEhHعh6$1E9K?SYwNwYL@B@>:o|^i0e@WsVG.8AŸziIcAVMƥf8>6J0HĥrVhR:<UUQ2TQx.մ*PqeD[|U8(hE=AhOx63%O9d|gD$iB&ꅻaʤ	k2sTla]AIXY=C\qT#Sdd	`І֠w*wl.9"Bsu l9Ƽ8 h5j6/I^g 0!:w?gglpVZJJhf)9[نW*7lhtՙ*{*yubdwܚ>|R|0XIaoww%]NU ָ ^"feȪyu$jWw=^5Fx+;?hX'p{q2Fx^ѫo~<?vꤿ; _q<{U`bywzx _(gd^ ^/~k
^!7CoZ:$|Lgz	x$\՗|X%zxv5Xo_RLbG+`bG^^"^^"|//nRx}%! 6bÿhF/kx"+
 /kxm<xSxIGNuv:gjꨶr-H!7==XmGe(IQD#o&Pn0sԔENI7L9`/WX|jghS}_K;1ꙌM^v
lj;/~#lg6T@
3:/*j?b?@02Wً7De(SF]BI{ڊ*M0쵽QJe8- SV=&ܓ1Ф[lWNFriz2|4b[HF߬+<m5lyI1*/1&ӿ?t6F{8"=T|pS'A'0|N*(.7%~0LӒm8VҔ\y@t5.d3K6LfHtLv|(bq;ٵ_z0pI1i^.c<`5&EEWRw=JMKtc'H]/gp:FOWJZVN&}n*o*{1愫CO'w pV3J!8R`9#OJ4Fhu ^ovna!vKW/|vYZhy{dvoաG3'OcEH`1RioeigtZ"^<^IS
{YnPVW($VF2Eiǖ]ŏ=JlJuu&.V3"//En1H̭XWfэjktSQ3szjlTv}pǌ`0+|a:uUw`<h(*co^V]M˫}]^TSR3~?
'7`Z	^;dt~/Lg+R^b IoU{wC'9OvA)y(=E(-g;RP4	1jzr>)M2Kyս/Gb]P.%.Se V.YXdrUSX
aj-blrt$9^S5`7/W@o>,~狌"V1"tJuX~F %7pa{û`7g1}T}6}-p)2)]K멥S~Dśn]w;zGrcϊ4UKYS.ij@ɠ&Kh ],{͆-WQ!Jrpqj/ɢNT9C]I߭	T4^d5_ Ayy3Lblʙܥ9K:0XgR*ѭ7]'qܬj.P2`Pt
n06k-1Zv3P	Du>6ٴM.ąm]G7ͻ0xHew#	?WuJk MBk+\DC36"dmY -옽tgk{,|Kbvf].(vg3?Ϲ߉UDӶ8ގL)+<t>Q`xcBOD4-
gg
7ϲY.-oD"K8 -XyQ?`OTb"8~pHo\Jx}R8-a4Ok&	8,k#hKQUD[s>0X̲&BTwydޤFY1n3fL3rJX>=RwLk5tE;Mc% 
@l_1C/ݽ7,V*anI2ŋx*Rm;O`Ye&c	C^euSZ -D]q٢5}3^}`5;q*ǤHA6ֲB+hxtՀF@Ҙx0U`C6pF6jcVP.ɐ;{ˎ@X2$ꥐh\Q:].C4r{ *Rޡbj&h$?Av5P璉<I|٣"Wg0<5Ŋo9id/ ,mX6V
.lp Ni,3%:ZOb[8A,V	N[bS(0L_SAf?UuyqfD(.À4ӪT-X%
oJ'~wg5;|E[8D76xfƋh,|0ozdٹ<$HC^xO2 䲜걖vx+^'?ԁ\b.vծw?Q[}KS
0O_E2dP,'Oz+)
;?bG4vaa&|4> x[@fO8v!E0@@0hn5 N5_x=2yn!0$&6_ږcc&Sc5BV[j: 4"M}- -t?sOYw{g.:V%\<(X)R0x=F)]M<=6G~H<bLlJ`n?bZףZˌVQĥ=ĸ f"*}oɑh._y?\pXn4g+4&Dl9x>A{&>D|Z%I;-)R4
iрx`,Zz$	?|?_LsgQh]9$AnJ9__|>ȉuZ`P>mF",t-QK_"k-`@uzίSQN!& E춬59,o5gMST GF9NqKWFluLAؓ^#C]pԯseCg80HS0ۚgJ%F@@H-G(u'CN%J݁'
x|uQ4: JBl\"LiqS
`- 'u$Nl?sMNF[wiݻOfs-CÜQEи	0Bʐ3L8c R&[6
%\!Ψw0,&JVU3zam[-O۹d$"?a$&8v-b>w>t|d;"@dqXU}FR'>5wӐa\H q!w4)sڸґ1a/o0m5H1jWiSwe;쒰|~n~ߋn&|#)g6VngFOE6`X~
?3Y45y:]8;ۚjQT&/7hwp3iJ|},#"aφH3QfP
Ʃ x\j@) dҍ$ϘGt2Dp ?8#,`.eF{CfbY-  
>6>HB8h|h`Ws =nRcv^C8%&t_M4$ܣ/nW'zτ oSAjIuY#|GP]]ģiCݷ X.|FF;3y q=!Q]2-@ ZS8꺛ހP%It&<\&WJ/`]{j$ָ&jG֒,h׼>Y^s){46K8ɜx!W$yDyH׼s+o\8dN*oꪋfzIV7c6kt#& 054ɋ(f$cSذn&IoK`w~\*/s? $~~J{e8%Vv=La!fuaE)ཱƫj>}Jgb,Kw'wufD½g)"_8 ;j%X)/$';h580P{5@sS)nl֞dzm23@וO*6rT[YI&_:"R\a;`2R)LO	Uߔ#T/xؘOmSw.P+ڳF^#RmFc.k;`kruls7NhS+nB1]ll4_	ԫ{ƆKF%zoE@e]bS!wc8@oF0իQ̌mlBx>Ztc7EpgMU6[\EKw	_K=دfMjC ggH)U B1s!kћZyCPOnǾB)1>5fPN-!G.Hfnz$l:.\AmGdtRaSJ *VNC$'8ZT؇#$M=#=%>S8F$	A(k	ѸtpYC8~ڙ82uO	Ii8l6%8:Кf,hUFXcDAp)0p^,jR*,	S:׫D~ս=8__Ko&	E;l\NފV+OPw|8xG䴥x̜Y;][I9ZC3YvmmIiO5%[gٙa?%͙R@$
ev_q'CDxY
,GK5&(&+ ֪өz3WDH-J62vUD$T`Nd)}U yAf-#'aTm}5X	M֣JZ5/J,ny)8&ac!!3=$YRWLe-_#|qek!ctI$LTj%10'Acd¶2?B2-Qĩ;&t=Z-Hg|yq7yͨ?Y8
[1;]{ꂰTsl:l;놱	
<
v1acKY/iFKe5H,xk!*ыH؞lzirlxxvv:Y`sIw mI㚢TFWKf{~Ed-S7O1TeYI07Ef)b+0ZgMZ
ۤ   H93%O6d۟7śz%8g!I3ģp\`\2̒Јzou#KMxI*0W޾ӊ
Q%5D>}7ǉ: KWJ3+wMI#*.phKS|M'!ڱՄ`u	y^H30E6*#pY6-,ޫM4YMk6՝)_&4fdCٛhO{%bR 7)0ȯt:zi$6XIY8ux;^߼Jag?Đcj+uLİ&4<eiߕJ']KxT<ZB[Y!BffhsUe
o;c$
U[+%Ż|XނhuFQajeu(T޽`9-k~jz/cA"}4^?@Xaq8tXr/Il^腊<:hѴ ixW˄`DKgɇd˒?N&hW|f!_x>xSC	55AQw1Ƞ~{H?Dz!h'#fIzl-Nb'f@CLV{5!o&8G^))B9 ώ*֏IGDGѸ=Jܻ#gެqf'"+Z'Ղu)8AF#NgZ]ٕaykFӹ;}4I"1jR	t-ՐД
bBn50(3$	?YPi1eq:^ȿ%.<ĜPFxH<!1O(O^a~LS1 a"/%8-RM0RόlZu) u#&ɺٖ`|͋	WݔdF&
:a"`HFn|KMH[5K|]$-ο4#NRf9SE;, `Z'j'Pp([m[޴D:Io)y(7਌5x`mJ VS!/Ԭn^$B搚yO*9]`#B@}|4^@ͪH
|UEUhP3>1\6}H?J@	*Z>Z 9VSnizq]A+s^N]ܤۧu';xjn(/YAD%d, NV&7gɚ$[FF$AB$7alPh"3RmY׉GH}#ïBδ^+hm*JrާMw	#5C+i٨g1HS$A FC6F'0hWVݳ0ห]i;'JIk>a6`̎Ր!=@CFGiVR\A${E&P^5QdN9	lg.QͬEvfDYJT("0רbjr|>r16RM*>H,M"+	XnQ.VMZgKOx(
yA(nҢNPPz>Ahf	rCSFHG/SI(
%jDD,_ ӆCKO5[SpԬwP2EYBFَ0ߏC#w/v\ZtT?6@u5F]>?!T$Ȃ$qA;cΊ<|-k,ݿŀh/0RfxST|0-D,x]{[esT֪ـPtTHŔ,&xVǙ?/\iY2_UM@q%+mCw0sJ	r[eOO|WK&\%I@{MKЧ-qhW;L{)yCJ4WxWɦ~-%M6&.LcgE%5&vRi^͎.i$aLsݬc+6Y3ؕf%4:0A%ƥ{nG,H1xcmZ"/!ӫͲDjD6$1E--`l)ӧ]R%*Rs֊㠔.8kpO$iC8	}	] Fx)Vnk{XHT@$a"{TpKY΍RAV.zdۄ?!&Fe@D!dܻчt7Xf"uZW 다P\I4U>M-v;)x@R	'ъM]1ޤk(+qOۆ mO(K5=4},!dG2.:5Pӄ(5W;<DOK."4؆ϡ~h}7ЊxYYbQ7j"C]&8 ѫ*!wβ"=JJSgEfkYwx(3p<gQUC41*mH1Q%Pɫc[HYxJCk;e\"B@kcjgߘcy!dgMKR4s'yg5`:b2k+6Xϓ%R/o"!̒TU;/D0g8 Zn9DmCa:YP `m[wꏝ.ކ_ȦնkS1>>fZug*/a"kPqbu"(&f:ތoǆdn+b8Iا^sfG5fK' ^NLy_e!f5dj19hd_z(.<pJd_e@0*2@,0,"\
R؃llfC팋N̾`t6a#}^S`b
[##+ErѴ==M4h,׍FPёt*1p^JD]zk-ƈLH5x̑Lt %(IL"qyWQJ1%pj> n \<Je*ŶE9Rh
I2$(&`TW݂Rk˞^]{\^oŰg/IVP#	FBX !D8a7qQ}&N`,#-mY$OK-e|W,-m	v?rL(,e;ڲ"R	֠	{Hp=yLxwG7Endr'߮d)B-|71&qEPRld(ciN2-\c, dQ	/,햽Y	rL;i_Sg]u^H":GMge9GlŬ91<fl<;pj)i&!|,}Gyɡu
MF/t;{'{zJK
& A`  vs1iS/`GX4KmX*xeghpW.X WaYj?b1\\Ej/v$;JYWeP.\ǀk$}5 ۢZ@yd@s
#b_	'\1F4IHdϡ
(iz/htf[G6@|xߺF3G$}߄9*OE6pò>i}G1UU kJ-^D߲aKłr},`{>`ݓÊ@(rET0 5\a2ys\jjpz<"^'MR '7<#4(1g,
4(|TVl컟mT(%u-ګn=5vqq3jk4MeNuI^JyEIlYZzL/|	fy=DFO>xnx `xo̖e>H)!5tI U)v*äq:c"ԌcmmD*w&qwSD_x<;bofxvp%%.
|?p0ʾFLqmF5\8BXw__fw|ȔQ9IdR!DT%]jI۝o4
yZ[/]pB=a]Nr\q15vxs'|}u8~ߐ5L;UX9&P;n>&F4P7qgv{Y<`KgZCF%))^hs\QҰգS$}qvN;<U
׼DS>e܆
1ۉ"e;of ]iO,oUE&1V\zfK:,c&CXbt`VP_6)UJGnd߁?`bQe@k_׏sq\-<~(:_ٗ5- v=6ű79)h{ٲ3,*嬕&9s5<0׼ڮωoL_13ډI5[˭HtB?+PN;q!&O=HZv`s^`+'z`y| Wk+ۀr1pwtPޞwU*\QvdА
R 0p՜$+hTQѴe' `1>Ѿ^Nndlrl ;la+	ꇦP	?\nCt9Pj`	K@ta
*8P˻hW&ȃ^Q`;'WF3d+yX!PIPXRLdDGEsv5>Y~/}5&lc!::hpt,
%وc)Y(Y8U2^#]:8}0ghu{'VqF0ͩ'1)@D>p7C%鰡*k/ą1nٙRLT6rQ@O)ˤ;Rzl&-ڗh9:jdf!pxN;'sʑNQ-jJ%`2B+N)e}7Wr*H{շR4V|q)uqMJti/Z9PB,5>]*V1SKᕂVn/n${N	^f8+{l}lUoN@Z2IM8DwK0!T=ǗC0j3*JvtdP-yTa*o@Oo*'5+qgfkI_S+O Pk`8YTqFZ02V7҈zx54>F+^&L?vNJ$npu` jXOFRHwA&hbsQ]3Z)\OTLXHc8dZ5h?NB!(ZOht70R r̀_o2|}Wq?{Z8
%	BؕMfc,[VԮ@TE@vp{`Ih&$1%3V!}aIWgz6
jγZF7$x/)^G1ƙ];2o-VGO﷪0FHo$0z	!|E'-$qTW	C5xIP-8MjF4zvt)1dUe(пڨIZcjBS 2/n<e~xh2?	f^
V2
ߦj8o
ɆOd9'J-/yC}pvn\)+C)keÌ\,Daukvݗ/C̋/Yl M,Y0ː; U(>pK_̯Ly;}vx[.z]s(0y{6|=SW>fKԠ	]]u|308tޭZnGy}tRcEx)5R\q0kq\5mzVÀtdA26BIf@^<jׯ0mO6&ixc,|6;3i^)a%NB۰	IِM,Th[~0gNBJY2[+y<PFi^4Ty\^W?k`r9u!1eI?㿥@a?KeH@r6[oۃwO?4sCW²V{N2,TՖRG>}\8rTjt("fʺDYH*$LX6za8)+奴&:a\xW{Jl`(N@\:Ep>*mѓJ'a.ޜ;}M1ߺ06yMÙˉתw1\OPBT. D'+:EHz&*KNx+IcӼӲ7ǯս(+q}A֜>9`gI6בvMcgzNjU5_CՖDV:15>2x<'*hM!tBhds>D01^6?f3Nfmrfv7g\8^[7-6xY45UkvWF}YO! \un!u{cqD8F/*zƢ7Nl^.]L)\#2;%e8*cݦ6*A;lMwMވ\$SFࡱxkAf({Zd[.F:OXÚީ;I<y) k廷g/Jw9{u﷤c`KX EYi|E@tejl r!sKUsɰW!V1kJ
d%)w+X1@wkShsSzS*?61V X'NJv
~Om6ymE<=wڝLRys98*IOm-ybp<!Q./t?pݲm_>łGV&PXI:nޗ$S:afiiO8/Eo8b{V3(!C]2NcoF}j=?ڔqx\,z3TLYs֝	kon<km7OW_<<Zװ^d%u.lOJOjϙǏ3Cx?D0ZזA8WڶZ׿2Җ^VCMYM"OouҖAIBT,X(2PY4V.OM<ߨ3HGhGBE58ywqɼ]8#JkcZ6&w	M7|A@^N4l|X,QCgk7$[ҵ^Y[JQB{1u,>0w޽1a6;Ь4tRCLX~I_h_{ZYCѫX}ѳ;fxfmkF^/bA{giDP>^`a9Raܡ@0xTK.m>Qa]8	`Ub'PD?IC`BRt>L\-fD񓋮u?0) ݤHRpFaAGjK|S=rݨ̱n6t{S&/
3.Mp.'(mfF}N٥JTLZ˪h/#T.<Q<˪bHVXa!Bpa"p?uOƔئ)IS	+bn5sffyڭh!=2HUO&:/v	F8X>]3P)YY<7EOzیe!TDDJHZr)>!QY˔	ƩUtyZ6 ì?*Mk"FԒU0KUg1_|mjV_>$tQä7̥|	鞷7)GK]_\U%rN}yzIlZIcUUSUOA)DO㾩es=0 p
2lOyWS_Lz+hBk&TeYQyt47
O.`n8ܿD	Ntbh
PRD:|GNL?T|7יbSVLYDB
Ͼ'Bc2V?dK!SeFO&M0xH)OoִSUŒ08P.<HpL(+1czV*ee,.T2^Ƞ*5^7O`Ф@gZ<`6u l[^zw,M#ϻHd(
9IϰG /9f0.Hs6\>=zƚHV$2?]߿v4.c(8:z">NLNx4bܵq)&0;.}q)?tjCS$06mL gsziD78ݝ>tFJ畜yO˛	ܥCSUhޮ/3K9<SX-VMTϞXMY\Pȕw)<o9*IrJl߇ʷtLx%]6 ȧz^ek:"1-#Kw/ku|1/[<M(Yi`evhdraoĐ	c*_9ZhٛVLW9tK.^{ݝÃv^<zqd&6 ^`i	$ta0ƝU؂L&
K[vGĒB`ƶh7IW>݆B"[ZpFsyJЅϫj"`Dg4>H`ke4aڕplBԹ2<Y0~^MP*T[/ĠX-zpk;<>I4|*g
ZyԪdhApe,ǔqP۩U^nT`V{#
~sfhm
iۙZV͊\Nv>b'ť@Y͙iE皳w=[IW/a"_hb	w:oq eNWϿuLOb'x(޾.#ۯZvxjyFa<#)ݢbx"M9[4&Eobvhg2ҡ_^s?z
.FpeƘh4H0XdL5᪊;\fwXfɪrl ĿL%isR4LDOQ@OdjJ"KeluA=xqzIvÎ%홉b\`zƎX&Z.x0dޒƟ0-5idu@ x4A&'ߏruR\*d~2uوeEJtRݣM4ї*wE5ZXьms}Fwc6UݫzW{{{83?G/w_-iI$?ia1-PeLyFFKr47=+Tk;U#~fpRh/"鄐2"w1Z}8bLh˓ۖzciZj0ԕc)|2t"ل8"\sT4&47;_7⨶S۩P\8&1,{1+`rJ=#
yܓՄcn2k(pNW(~xaa{@ebIjgɆZx5isD+@tVܴp簺Sկ>ԟvNnܚ.45B+]gey;Y_9my?v~JaZޘrS+%F(.ѳd_7F%LhzSHRa<N_X8i N@sIB5M(d/`EQ*Fk~KI Y *rmC5쯆_:ԭ\itDRj싙yd_L:&Þ7ڀ$d9:Ĭ{{6SŻx&" 2lyWTgNz%pBҎ=]c $
Z?B8gJgQ á[}ύ!qE8ŎIj>U.+˒-^vʴӽY[n'rFfF	!^|zYьqC΋#.mJ-ߑ09-MEҐ@i1$̓!usبmC~:eH>t,iI@CcZ%E֦J$i\ťiAX\>xZR*FOHT,+([--u8SCDjU]Am?fJp>g!<%~}gcxR<=ERŔwX%9jouD\}h>3)c|Q@s*~uvA<$N	>;;0h21H[{ZߩF$A϶4,+eZTv_BJ֬IMb$6o)VUMkNѻOlLoЬH<O8Z*u|pJ\CjOpCFrѸv_>#:zb\#C;3᪓H^g&FRFEREdbw{|1?_D(<IW+@"_`A(?W2uc7((beqEbPYdokXVS dKMŎUicUo?yԇf/,ce+&-18ɷ#SMSɫn	nWBfx]C@^uvs)fa-N8.3\J{j(JIexab^3]3hV߹f'w֦,'`F$!2Ey9a$sA;חöV[&-<HI?QbsBH2([0{"S'\>^H<`-[:]LQl-1K7PIԘׁ,ogL3	B/ShZKG FDXwW%֟@y(</oRAZ,# [!,7*cfWum/`U om&0}HcFGiUk9rq]bQIZV!|^{4v2(G# ^MKk/8$XQ1%KUYbVY5W=	Wyi!.{Vd	g.i/S@ZxȬxsHջ{E1TտnNb~MymR{1U5{ݚt5OK{rbw[Ţj7$]}Q ufzmhqo2O4hñT.$Gy9j;~'ߧc4VSfy8UVjr=kY;y7	UƤYĲ<^.rҙ\`3Alܫxb-VFy4L)9hpIq_9c, a>Cy~_{%{ﰚL
[ϧ[Wx'#k$ҜQ&ӥ6n/%:_	Ѽ!jmAEA~gx Nf;ާw^Vq+H(^uc.¹馂uaqvvTTk\Cu{T ۥOò*ۥUzVeHK!˥{5CC;^E`:id^s?Q'׻ƞTm9-CvU5e@9͜1/59Y&3.SJ=&.g' Y KJX({~.|d&p3ŶkVOt 00Qdd{ԕRrz:TFbjolSPZ/I鞽һUGߝVҨ.9%poVGe7&,GEPfP5=紴{g[D(ŭ'I#X44AދQ }MDyg@	$h^BuwDYؔ)#1\GCݖ/i<Si.J_nb(Sj`8hn-XW\eT)ܠ!uDGhr`#4 S#<IΜV<G9  3?Kuk_f>`)ˈ
l)u{?Ίl(-IEsJz7[t5_?8қb[m$=,M֗G\ `5ŕYOo-^J,S`62G.k;{;p@9=aٶSҦſgѽR5 }vYy Xvќ*2>͓ЭQyHlIVWUiK:`Wtly{.l2VM~z)/li;sE,<3)>{2<{u᜼*ż6޲kih5sEu-@A0q3f%[/3wBp@W2ѸoOq41.gg6sScM_:j_D1W!nz	`8<rN(@F{Wp$xIՔsH:'h]n O<9D+;حVQ0.#ѣ89
	m!xiS&VsMca`$˪5apT{?_{/kx\NwJffgsSfre3<{0`#|yPK)S"*!!x3(Hb \Cċ,Km"HyE$7yOzv:PbDތT*w_ΑR<Uwk/?!  (<O1X:Ax'5XD#ACk/_QSLZ~-/egxY8E,9hX=@s
' ƞ2,S7&|}<mE&P+]\꧓,2I6N'(,HW"MCH{IJֳN9ԏ;
.cH,hឮΟ0Ģ;DhyG0g(Yciq'kv&J4CIATڜoRg}6d;hF1#O%	,jAlT'(C"RiQvh$'6Jx_P	?7P.zDN#:G=R_> ;hA| ;r9x4۝EG.Llg0	ovʻ~<Pp4{[4;-_ٻTz{ f8J8Y±zF7ϾhFn
be}	G|3fMNjaOlPm^cuWa.vٸbnQ7"*pĒj0?uh*f1a-¡`xְ	9oG_hhGE>45?'GA%m(#8)Bi34=zC6WPw6dEP8EZR`/)!m`EI8Y``C}F}}qQᶝG/g6@UINoGYNYfiht÷V}Yہe)WJ8#AkQSLXO+M&c%F黲ӕe{=O(poyo43N~Tک
*\grf*~#Em5Mq7j7Ǥf~@\4E؄Eb+7{|Wöw||dRoISCp-
˥sǋӱSJ1UB[r1MieJ]5,:FU )U(.A	`N
-2޵xTסpIauU)Dp@[:7|A]'f3[b[-#3Q+vSn`U,냝hؘ{c6!6*SX(9s<0xLfx=QYRg`,Dk_jTl]+|l~Rf\pX#6i^pqEu,GFW=8LVaĴ0bŋ᫝ګHnr79
bJ60Eŋ\!LGw=00=@K<J}V_ԟӜ3[dT"!F@1`tINl"t8pog^17%:}.9)Ɨ=(p)GNiѦf.PHc )feHᷗ)i=DV[`nv_LZ+K+`9W-#1L[o*y A]	7hȊŔFhndOw#V$wJ]hMVUq0Dob{owoϱr/3633-mdk:<1!U79䥠BrvM>+b4Kp$3<"`#3B [ɦXBx8ZBIQ
PWGS'<.Nd++7ņTaw4[\pi9yB+(1ਲ4z>U':!Cuw{xP{<GOTw`UtQ8/w_|EkRp*
plUFBRQYE+4TR_^/RZE_ y՗/dū^d q2&-@hĆt+=<4WoRE=kvoۿqX<msUub'˪XC~X.˦9pV=hkAX]+2#i;e(-	辊YRڧl8F3KhZ0G+qr惁{D
;RIiBʺNʙɼUrhط	Z9Mx%''ͣv:.MLZ̶8``GYPjCEf7=mčσE%{B{{)HbH6][u'Ԇw9l#jHXSF8Nܮ>r5
vU5h0+}`tm
øTmL΋Y2Ľ"h.,`ˀw2Ixx՚OI;qb`o_5˺=7%#s#[u#ǈɱ\҅S&lcdl5'B!Kt|gETm>(R +w؜{Uhqm4+y`mA.{%F1=UF++M&%87Uo4n>ZgЫzRI$o}QNfġ+kdruQ=6X7y^acSR|;'EcWd{D#jkЂ)C/kh> ]:CsfM,3TC22 6N\Kj/^hrҶT)Qgׯ:Kٹ>fIK,[US=(٬XPs:G,	AhV\4_D$gp|}E4X#k{̖Ltc$u88VBz$T,Qexat[#suA]pJgb辷~2BtGSUJ@ENbXx:Na){'PvSSzj^_=RNg#F-)	u03#G0qOACDpF;>Pxˈ@ڦvl0@u8'ծ+XکX6 E;|3ӬNaUelC~lCdz2D΀W#!Ǘ6tO1đ8G\R,,/i]0iu}t_~"9Ka1,`R.˭95S}%z،o0.^rXCr9!j_fH4+ 7P:9x~Lm"noAӄS=@$lz̦liDÏm|I)u3 ^6NlO"[q~9ίkuz:t~t~9^YL(L'8>(N@MmoQL0ǌѶ&Y6dlщQ(vR"ځEJ%z?FQ¨%zBek+Xi|H_Q:gƘ.bS *aW7&NRk*i9f4l|0-KA@CU0`56eTC;ˎtHˇ]NWRveBIJ{K[mf;MJԮwEz`M>p!ޅ{A mEի"&g
iRgs&Z00]zuuSBPZO
N7gb<dOFCk9c;IQ{=LeNY)7]I>>ȡFlper8sY,q2Yotm(~/@iduDr&#1"Qqyudd)??OErIFYru`Wf %Tw5ۙ2s,Z6	f?bİU<zyo2A5CC5\<݌uI9q;p	!%Fr$JX>:KmJYݦ` 4jҁ;i@XDڵî"Sۏ)Fk"S23-2׮T$-59 X9%L	~G	zۙ\䫁7ufc:wq,	 dMFe-;`FJHHE{`ll.<aVwpiD=%rY':O.jo"wqE>6	Ic{EL1;ݍ'ޗpn˿sH5ӕQEqgƖ.	:T!H"g]R2\?,! v`9j,	jbY& <:ڊѳK^VmŻv\P0'Cu8mS7OdaaEzR	-8b=ℭ,=Q*;?!WOt̜g@BH|6VBVWF-AJr6L;J۞彿dU0J4a3ݓځ3G[rm1	Qw){ߣa7+[ݳ
Ԓ׉w/֣CeK@Q+ibu-|#05]}D5k4;:PVa7KY@F@cg
HGKIIH{5cWӺ~~C\!1S>ycg q+Y+"B	z=M_EQIَvs:rzkۢ_mwjŘ9Y{YW6^,Io8'C&{_$ߎ #xTo=0/dH aCy3Mԓy`L^zrJ^#Dϔ+kЪ9rdx.Mo>ؗw<ݯoT(M*jjG7FMVnc:Ȋ脵p1k&j;UϫSG7CjF7;8QO ҩ>]D
1?%9_e%^β~?--:
v7[9[Bdnçcϭ9s
Qx#HԬp65Tm@5jze`d xU[1yjg^3Y-β뽟$b7"u?͐:zw6 :[%LBNTvVVjtu;^XwUiq~0yMXXh.`mqyĿs#;>1JX(܏p9a
b
{w(&ȠdaK&eK/wG>@"@U&Tnv[tVhPPbSN7kM{4x]k=F	`6Cf MVjŢIC:|6L?˰Sf6~cupSW.XLn.meJ{TQ@"i@ТؕYtdRwgtΧșhy,QS^Xܼn_z~7`ht(eu4O8UStyuk;}k@o0QH23p&v DFTB5Q>ddS*/JAO%q^!@T	g KKGb+S7^I, B 4ȺA܏(DvZB2uWs=3G/XtIm6}q6,d%lc'Qv(EyWw9)4+&(%C̘난r>G1S)X1douk;@WN?\}{ݚMirA{Hmd§ٰmc%8c7þHNP))썉RHLM0O8$fc h3?ag!*4fyDӸɟX2KFr'O#fƪLnCάtiXV
Uap4SǪDԕXc`:#Yh8߲U m-J1%21ꐫ¢RV;9(ˍ6Q`_Qax^:	2\ITնU;tư?!y*R^UTUr%US=UUQqVU[`[v֤JsrZ#m:CU/^;Xַ篿|mo˚Jr2Hm}iηYfLO	fh#|
юW]k2wޔ|&y;CoRNбM?#k{{/@nD⯖w2A
(EY!F]GD&śfp,jfVVK{VO/d7Qfu,D`2]zEh'w(NA0y||&)8CD¿2qpA:=53eT9=K'_PɊQoZe2n͖w[VD^ S{SРb1DX')6*Ubpn}^뇎
sFqqL>X*<
Hd09$:~⼄XնZjY"9JOX^ITkY2$@(	Qjcp`J`X	hn=#gO/8{@wZ@ .8)i +̅i:8Hk)A0pƫ%g"dh_EX}iR91ʗPM6NyR(}vG ?TQ`
l`Pbu.
,܉;7xwh3<|{|bN8%40sAsv?:veRUEgӰ[vB@<bW79h8БR#c<{p\O?>!#q8 |	F9ej])P^<ǧ$SXڇu{/0BGW "/SQRPz({}NX-恬 frCryo{ޏt6K&^9'cRN:U?ߝ7
C%$?١h7ILko9/΁vBBH9;Xlb?:F/% Ǐx|W>!u"ݫ=GHPLNIV +[t6b^0ϟ+$&2zu~X(֚}RF;?/:ǝpޤ߫Kqԑ$P0-pTQ4KN@2NjCFEtѥ6C%$42b\C"Rs3-XʮkxJzĆ`#4va؞@<qn4`&CDb<ݿ4u\&ݢRi 9ꬾj۠=u%~k2#6Q31'%Gaܸch/<Q.P9t%j9FIϰmL, LسYOB8B dsUR\ qY}45%6
U47q5*?ƍ
VBN)RZsN=5|ÍXc58Y;[jի)&hwVx6A;uMNiS@DoWmݿ4::$AxKG~^TNYXׯw7CXT(Ѕ&Q?롿1wS:/j/(
vPfR0)lLp	kP$AxZ!7§P
Z(0%)hvkvޔnխKRY6b{<TryUD9b'
B,tC_\`v=_Xפa/d2hp%Ԁ<E&8	!>[H;SCIhc:ʌ$\c{Sk(f3st(,Pm 83	gJC\{&!~`ҁ"d9ndlL$f_)x$E4'LSn	NvAĚbk6V9àq7Ec8a9݁m77Į`9#-eP(iǂJ?*DR}쵄
O"4K5ls:;" Z=j(.4~8T]#$W>'W$Ma	$3MRb_Æa^̀/1lt{>OYwݎ$s#S)>(`4P׸S;y9?2'S/+Z?=$'r,XdL?I$q;c9u<Y3Ca 5D,(>(H6N fdx5Q~xUk:p}	rƘne_7H,#̷p@#m(pᄴٶ8Tߏcd+)>4\1bpص$f6Gwc g	BulD+C_wChKHFBr
Gd?x%zK]_\_i8ol Ā!QFu!HPNfFxl`l{4:FMEr[u`;
 gH9lXBi rx֞@(È`Xp#RNg2:y^Fa<
=h
kJj[=sr@r%ЋNto{N;S6:	RғoԺB"N f+s꒥S۫U0VIନt\	^dmƤK'RP&:אҪ\^%{,{Ӭe;!Wr*<39AHe8wBv^9.PԦu"FESzXm%yxPW+1	'NY!z%zSńY,㑐J൪qpb[.;I3oW1Rl5'Is2.Z*ZL?^欽6
f_r0{{	c٢h_vXX8EFN[{;xsP;x/rvmš<
gCG7Tx3턉q?_PV`YPI00,B}N/8G	[YQGekTXt\V<Ipjڲ\IaGjfH`|"٦%Ů;!FB:G8U qbu^0#K B r@CmKKj1K%FKA<rVwYPM;e"	2l4ΰoV2֌*3*g
kwVX"p:MfShb(KHfǜ9ӖMԭ(%vD>4>`E)5Vxֈ%DK_"YRƨJDٱ	%g2&I˖fJz<PϔmzsRpɊz[VX]'L NY58;L<WԥBG'%K3ڒ
h9HX?h_r8(RUzin~ګ5%|ӼmGeNkkQ]OȮRхmφal6pΈ}Qud@d6Ц8K$ysy⾜(g
/v 4xY"m1C6!0f""i%
}:9>:m3gV}JXyL*$c`Uج@kdӮN9Ad.$c(}i}[T$4=?NQpS)_C9
yE,).#Ѵ?Vb{`o[LPf=3`M6@ٲê1~'cb$mDw$R i8$.:o[R&(l7,v4w/;$a&vVהH}kyYU/d׉^Q%]?	?C3aj{)s-dPp{hvoIuұZW|z?BW͑Q_BWJOOkRy?Z0J$/ʿދY%Lp l|5sNQ>h[X=^^y;>\*_T_35vR X<6N7dmWVIQLȆʣp׫+Gg[Q&ttC?U->"ڭj4*&OgGe
;q+l2_]̺kdK;1H@'SqglhhOG:Y!(جOS)ɿRghA/I\%YȬEs&uoPPItv`l1>LbJ%aTNQ(Qrṷץ~K\S>ޤT+A{b}<[LMTv #.;2Yp?)@ G9.m {bpnI]/dVlGXq=F0ꍳHᡱxX %/-{\8ڔbH嬚n>FQB\iF;5^Wl|iï{KfUlZMZ(
>#RLǉ#
m kY纕R",VCkCϬr( R#\,Eٲ&mxyW!Ms̲*O4ᾜ.qu.6.k`[YJRV&1N˒?TEO3xeWWF(+_ =#SwQtg#W}.$H(!^*kgFt!Y42h59Ԇ{0eZp`J0: 0
Ɉ|'t!	ٹ9	6dJfL:No1=e6eHp$r25}
cV
rۑ&e`*P[0xgN ].jF]+YjIzJvÖF@Cf(uj]4f􅖧ZF);8@s@`EtxvY8j4AG;`ZY$m>k
c"܈z$ `y'Kٓ\I>FM=L=GJfI=GHCYBێeP>kU]s{W)1_gPzW_"W<PlRY#/FV^>uvڄO{Ƨޛwq)̱#%1s0qr=~9ԂEK2-83s/kyMV)
ʁi.W,cDU¨!be*/~ˠ]Mdޘ9>)c6dŊinPX*E6CLQtt_{0;]G,f~fLuL9y"5n'Lnvy	pa<J+nN%eiB,cڻ\h"CUtOgs	J\4_`,G8g	`/'{f$(Ag,鄜k7 ?fxP̮fa0`N:t=O^9\"3& [4;Lik<y}B<?$TVWv%Q(I``F;CJw7ʬ(aSzA*s~N/daW@FWǔqc$V$&,nP5d8Hd%_<;=ziB EYTZx3 agxoOF!ACaxEr/ B{Ŧ\(3ïMxKD#=ZAЧ5㞜NWS?+obf8=ru~gr,v-|+nܸSSsS/K9:ܤ+|e
|{dqՠj;JyјqEjYsQ!쿅8Dk	eGk^0?,Pu@\+Q'ͤF(@Hpr4]uRy褄ZKB#ݱ]f*}tBYNBԡNE|tP%sCjQ	;!IiTHVNPR	<}J;HOݣJNW}[>4'jzOf,NX;4d
e|U6qIj]]<ĩ #еC4:80-f5Lɞ/zaO~Eńe
_.,}Xt#EDCPsj<.B~-]9~Lf+/eIeP 2R~RWA	љq$UH3V RszBX;b*D0G~c[*ג8a)Rb$kT̔u c~E*Uj}6M@"fDk&a{ANC/YoM kT͈!U\G*pUԈ%su3MeLluZab=ihHSWlŽEbڗC˩/w̅n-C}=J8:]+mE3
`Il8_!bNI69\8vu	2^=A>w
ūWiªz6s*A	GD}l6lnߩ(>
` ]:,w>\V7%+R@AE29wre'.#h$FAǓs:8eͬSq/ڎnFFUQpIHQ	++`ȋьtOP!̧$uB3r4L	bk9^hdF5AIEBJs* {UrwyGd2C]8$ Cb{d3٘cFZ"Q.N.ea".Eڞ:2;PvO0gÊC.Ssʡ3jꐩs
~)p4g*z>L5u+j-)taxSaeB}֬k=B?=P߄_ʋ",/Fl[a}r3I.$+ŝ`u6DLџƲvx¶˶%laz2RU.=uZsvl \g%rV#vsy(Oq뇧jg'SXW|LNv@S.-U >'`m'I^}BПCNCwuyCyҟC:i!>#)fСKE.ꀞ1f5JA>gHc茅k+VpğXr@Rd?á[$H%q_T45gM'x-q)ٍ.DN^ܶF>='-qJi5*3+wNqэNܞ(
u^~N:=&4jl[ȧtviIxˆl5D"7-:I׿EhOXD^uZ󃿀[L#x)*O]elR{F@sB@ҙRlm09VmVL0WWÖ[NWAZFL}T#Idv==<)|Ԟ 2>D?0Y)Bi!I>sb}yF&2gh({ 8/ޮ]#EǄ4J1QfϢnA6T)+G)zPUp>f1|ۤO*<<ڋ b䶃Qջ|}m?y_u?}	/U>Q9:M1;9dj0^g{QbR$	pHCh;Ac9"2۲Up*fU ݊|3E%]Gş(օdǰ[13!N1V\"eIܔCP(V.y$d8_X)
Wx7r5#NŌeeo1C3/CsI)ILjdä$}&KVzXGiu;STQ->@*&/\1lp+CI1XXXŸ(Mܐ]0V$mNWlS s#'/ZkHc_`ҝ竘MrFa;e%?@Mc cҕgKR
iJNGBC *ًYy&;`740m,VXr\~y_L|EQ%:/:OeZ؊1<ILTP3QG颩]3M7yMr\M.'EUokBX ՞ǔJ} 
o:~g+ѻzmbl)J
%Hq>-*`+B2G#7)&XVNo%]y9y9(>J/攊5LTccIec{0X+wL]BgWa)X`Mqu:d<6\f$UO/UǞŏ{f
obI|L6pF2ЉI,$W?Lܠ	CEec_b(*$BpTݔh2*$ӨP,e4f({
k]?}ذT>T$Z$ކ~x17r*4uoZ
1a++s?)dc]P'R+CӉZ`{/?åô,מ&bFl81J}fOB&ݡ)+&7I}#It0/>>a$-^o]}#y2:aXd5'TA3hJF#`n`0&l%=NDessEP&8&T85^ƩMsEv48qx{rtzrxwpR<oD3@
ҳNs@v=ZLek+{n=i?Y$Z?᷈ĮasE	^H k|o[VWF<jK9X=;zVU%)uϤz7EIA u4;*9M*2.iEN[U-Z]TQjQ{Eڲ,'&E_[L7*V~0	.48=	ZLnۖ5 +*#+SWmZm~ARvR8K Y'ힾn{Q%8Zݖ5,Jw30oqKuXQur]o7̎a 8FolFuaN׾[ U\VyojR:`mGxS[{nIaPjYJׁe%
:b^D!Jtl(!B {e7]r)A}UÈvu9K;0 GgG¯Je3˿~םxS
2^q?EiF ֢ye6±G3{nm6cDW@0l[+Tp{2U1{`·Yb.C׭uV+Wܗ0QouIo,WD \3S<Xn_yW1' _(k_|W8qr<Dq!kM*-|jXv\[Hx6kom}_2"\) U0$U!9(mJ"f_}ոˎj
+k;P8y[U2q-`9
*}齎[&ǆι߳Yb!(L\Fe;a-rhh]_tNA(XN[]ZLn[i}A=4\E(OubP/iBЛ xUk2BNCX6Y]*l98Ҳ\-s2I7΄ӎϨctpLI*8zTXLm3.f^d&-qX.+2.!jW z0!tǭ㽝`*	6(U&+)ϞOX
^؜;La(x[UߌA~,&6MS\_|/4^-ZGuy/ QG;D-Br+g{T[VbQ} ~U"9B㵳0SA#)YT,N2s)a=jդ-WTdQRAk!E.pLm+nƱ$E&*%1z-;>C\꬀h>-j$TЊbǰ@2;QL;Ipt4v	]<@Etgv9vAO(s q'-!D/#=a!h=r#ZZ M,a07E;=PO1[	'Gv<.\ <f,My$fi4ݖQx䫻h`}2?-7`|	[׿.[|Ai`08'm(Cܢ(PBf[G6믻{`	<ۀNfxihWB﫫V[gXxpI $]yplrCoNjsiϦ;A=ܙi]ЊAJ3T>qbGYoNn;E׌BR
M+@tzV@RQQVz׈RD
9TCxAvR
Xie?
xdiVr(Iw%
;KM	X,HiSJuV;,S9igHJ*ƮoMZ(ŪEY/	C8Rc]N:j:R;@x-\/ Zy6dk =8Beցnah@;ǿ?s~0Z0aD]2v$m?"Mmeg&[݁x99'j9rVך JŘ9%OK+*M$2V%@j@>1y}sK  /{1ãvkF
@(9i_GӶv XB2%c.̅&\'eӿ|BWsp,=r}D	bEu7.+e7b\h",(O^OwəO/9G
_㐏'Qu(X8QJZ|𠍚LZ&ɉS-^x{b̗7#TK%Tү:=ob2PS+Ta;LuҽDIq<S:G]/F!e# 0)&cp(gx?-`1[8(o<+V,#r?!Ǚo9M=nͣ=g@{"jjxP죆&̉iDZI8*ʴY,1oz26I:$szo=dZ@8PzG;⟄fC2#5bզjb8q0"Mq\Hbz#!=Ъi/R#&_淍;Vu"tJ=Z$OEQ5J (y rT/0ܗB2Űe} ]e۝3
DBq/$F+$_x??Xu\jyptwS	EGӓI|Ã=Z-6hDEQu,#43k'B*w oѠ)]O$Nn,W{=2Fl"XW)^Xv=ُ'g̔T
h x<¨<!f],X5qVmd# Lqh֕"MS,!r)U$x6k[@qt
nя&}#y`S"k|XtWDКZnm؍FrM_q',樿-bI磝Xm⌹DTO=ytOLBGXRE㩍ӏ >CjO""2>
)7LD+;^=a}k &͏B8oMXL|*k7^ρAըz>N]b/gveܞؙ5$[ȥ`<C  N}IzE'wՇo]C{+˸vnv$Ȍ!>vf:*>24cZmv ч_t}2Exp~vYjl2ecq	awjPA0O1|Y<R=`*.] N\>&{/~1U.q6453^9aFa$HV7B}ŭOT~X6j5Q!^.UOsbFѕ艱5o+@#
T+_JeRݢre %N_z,rk~U_GO'n	=
DȰRBf%$>as*[GŸvlz8`~KJlrі~*w,n4IA4VBp-})tI\ZZ"E6Xņ޴G)ztAe2UrITci,ń8e^2
''Gmmꖑ`Cը+RSgzltdVcFzFC['Z0Nl'&dC2Q_%2#]Qt<^W
@ڙ'JȐ	<J&tC͎ӬiRPxі04KbmÝk'hXdcWh86S! "n?Qa
n5MiU{n:=Wۑ	Z	Tޒ;O6ӫxK/; g !{-v8	?]wCw=/< S8pXŹ#=~U(;PHaJӱ*<iV|U6v26o`Po6$Jnyڶ)#\o
P3MHNObBe;[Ax=1ի~P=TcZKV0m \T)t[)un3}]at^&[Iylg[>ANP@,pi h~
&>CQkANP9<\: dTy=Q.
{ό6yz6Qyn-qgiH4W &ͮ)'F1;S x+t줖tzq!%K=^wJ9'Xs&J4@F-کJ
U|	-dKSIh1QB$_6@놻RK륧>)LNb%8+JY[|hs|$u0)KH$'GϲVu|^Ip"ɉ%v4W<&k,r)k̞	y(aLcBlhP68l6	-$f -zXS9i=龍ϗȖ?qaMҕ*	d%e$11acQ[ٹo>#`6RPAm[ucFH[YmŎ ts <¦JPu!VP ͒. |W@"q]S*5xH*lcm&˧:速#-;U"s`KĶ֋Z)G澍.֗U.g={Lr*%̧B1t&ϩd7eKLߵxL 	Qb4Nծ#3r^i?t*z ft56YCOnQwheAP[bamED.\/'\Ǹ,0c,oF}{1ad Y.KsBWU 5IfcO"],Կ	ۓ$p6!Hq`
"AW+ǛZeV9QRq`aC3_kjgދ҅U*ti3ץ!浄%cUX
$gUBeJR)QYbqý}iΙJ Xd5(TR}Qjj9sZѸ;NjgMQ=`=dm&=G=kRU	b0ziԱ\dXS]EɅW5r7)Hhws8ӣ(tYyT_YHp/;PnO"-<4۾쬦_VAh~?yy+S;I xG196)0HdFE?d63G!Sixb^{(?lͶYiy~uѲJ3Ap\Pk~e5e̵ˉV/LOeू,13&D`	3o[U夃)^dMNl/|^;_|\V%XB:_S
ujTц' @Īf90*k -	&Jt[f҇O#]W̲WW2+TzUvUOV;9Cxnֽn`T3,륿ڦX~Mbm;
<+՘COH䆲sUk/^jK*MsRFFiQ&AOx)^;OAJ)[2GUr-jTF_tŭI19oL-cѤܾb̶*wS[(qܓVLʶLUNM\`1{y
_Ezb<)YrP>0.b#*FDt?;jg_es@VV1Y!{<h-afLY0Yj簆T7~7_pm85l8ro.rtu	]EU+ShQ2}r uSR4	ltDi͆gJu2/uWlt_I\A&:'~T/.4vOe Ϭ&Y<TXvkWJxr>D 8TξugL:g7AHܔQMN$j-%(ET9CL^y ƫd*J\rnBGm8Ϭ}̩)`I^ǒj35ebLT;{g>?ŘO*?ݟ9r=qso_9ps/3O<<M]{٦b!9$N"?]q5=:tKkJ1Iązަ3Uq0F%ߌ=#ҁڅ	$Mn++zCoDGYFg9-bu<L]uqmP`0pVA  i+GTXvm&$Mܻ h i4n$Zo7Tgf M܈<zC&m&&oniQ@EQ/zDx#W܇[Jܱ"یh@CTGNOFbO^/$#E奺 NV#)p$^jh2PZ;ZEz-?\Gnި9W؏+ `SlƐWBlo3ZDi @z*!7LʲR)BWn|XXRer2.Rb;^ (V"Sis{nRi/ԅ8"n=q%
g˰ĩ} aASR2Kr=d	;CֺPV,f!<cIO$B%+wrZŋWo~nMG@Ҏ[")ڷ]GMƁxR 6h
sD$ä茆)YNBV\e(pדx{:.^ah4 \t<<3j~ݣnUpQv
Os_/ᖬ$kB)*/Y,Tuw	Mz_vIG͢[2r
g-[tY`&E28@
lRCދIݚdByIrwAq~SP %6%nMsF,׸mpN{Aet8yldlTg"-8<p3'Bne݋\4	f
K(3Yy~:z/k-V9`-Ά	Q҂@;@Sq+Y?>2v庍ăHEy3]YXǺ~e:L><B3p3;$bskǄC)1r?,ۢYK*jTYNUc#Eу)PV'&'"ё7%F7{'ʉ==?]ܛݪDJ)ΈɕbeiLCyQ&nywcZՁlJbdN|).9i
Gb@(c_q%zR]6Vj2/蛡)j$R|^K1Xv'9iԛ*fVtwj*$9)e܅zT
W取,4x:NrdSʩ	DpޟwN<)˵4e3|@ymuqu0f
xPdb6X,IlD&N<(Aie+I32דŒ}=)&JGs`÷R+p)l3%k5q`C[]6/N˻+Qxm͔S=;|OLTbùN:\/ 4J{*K,>yzi@M;ma[UEe"VI|!dy>"֚FҗiQE܋3>Zvg楕^]{XYRRi(=|~f@rNuV/FE*}I<5W+?'[N_)tF?eTkkX>~xp5flY&Ҷ8S3bX;ZϗCx3[h":NiC&'"~ϾϕκnEM	n8N/m:&@[	*ZYXJ/NLDju<.1U9P[XZRm\xS3|↼)(T
+i(u8m5|Xpt8FBUe/HChAK$Ԏd(-#	?f&O@ޠ6+a̈́kUZ!c47[4:i}52x7h382O*z`TL$5FkJi'=E,M5}q?B"EaN
>p~:$n2)hwwˑ"͐@'قES̰)gCqll>-AJ(:bxHVCmq\[_ +_)oEQGB::?cT	~=)ks%(fWKG`:5f׼ ʬbsI9^60BpT1N%oMOaiL-"RT)pGD}D RA/^.L_ð,j x-
%[T]D6م1$-w$[>}{QKaYu<nN#
qMkPĴj߿1$5uMk p{"M'+li'c( c8B^ڗ;PWUȑf{q˥8)tPhg8@CbEO އ UsȚfz<xq<EZp9
dfW	ZJ9'OpJ9O`ka hO͢LU|n\V khdRA։\]*d$q»xyZ*nM)?/(5qaQK±MK: tIɒT0$4/I:2r1ڳTv|/ܧr ׭kn;Qԣ8W*+2U(E=+'!A	i~Gx 6uauz5?mCQkV<O)IP .RطKH	K36$;& =yw_;>}a;*kݹ8E8yƎVo^-avG?n?[!D _UV䭬;)%wFG걲Qʺc,QjWYD+5~뛝̌FꐩG1;xi?!ZUн1 ny]Q˸kIXzE'QEgs[@-Кs}b;z"WK	cYJ5/xhu11!E9NެHzVntxzRKm8,=t7lE?Hwn3}g.k:8m4
޳zpdMs>F5/p0 6iݾmWUdX5:I73GykW*lFjl8:s%Ju.ך('<e
O@.(du
s+jgsǨyP{'M-*{U'XwD&VE$Q.=ࠝh󁸨tP
!l#BJo:2^6_OP4paU>7{VJҞ[GGO ']CWabO	ױs7fr#|)6yf6ذE:ULyUnR^B:@&44$onܹYjG9ZsZ֬z+8nlxjq2m>C[6ΫXiҷVwd+zR?$}ѓE^"]D"KKf,*hW58F,x*_<Z`jpQWWǃCS&u?@ ..>lαa#~̫_Ĳu#Xg#ղ/[
o6tV6@gzU]z׬#3q7gL
jQM6_ܵ'c>8CN7wـH!O9tO!OC2<	eyR$9I!sȓ2XS^ sȓ9C3 ۠N搭9?&L"%R TWZyFޛr.(Nc~,w9=SWv%QI]/b<F
T6Cq\ǙPG0\%+A]
)8iDsJ !U?wJCSu*{98jV>Fg[mB3ON^uv~&;SK2"R}(3g%QÊ	O:}k`l857wIEz],\Ax?1)Jp01sdx%1B!4r#~b6$;@ܛbqQ{劚hǀg͟]@40ո1^)4v<<Ε ~" jlgAc3ob	Y3ǂ]T&$}x0YTSXgxtevhM>7o8I0/>ނ7]6ʦ{9~6[ 1*#DfGxHLjV*}8l
a5zl\^M͞|oџtNB"X[-&`7|PZ`0X5
l*b5ra<xjd(b|x%Y+Dh.1c̇_cHUYLצofR\rxTu+Y}WU`|wHZѨ\:c1r-`}U61$$^[g-QY׌aᣖވZ_?ɿ'/y*Ͼɿ?Xm-yn_m[IH֤/e#L,X<QkvlZm[TBLFʲb&QkcNfk[a&Q"{[GoԭBepֹw{Ƿ'͸ɍQ}|"Y*Do gǁ?nOTegUNy9pE{Bn'AU{/]GV67&)l8'Sun;w"rS1xf@FU_
9L8S挃˲i;j(өٓɍJ`Q/c913idu% XZm]1_S'Gu!^Nq~A0mM4xT+ȃf\>s6AugsxіQ8 g?h8GwnR7ics@,kNw*45
W!	m(e	H&=J6d6ɠ022öE;Yfh
$ivMۍaJB"2/~byʳfm+$IRR}W~ؼ;I9NɗAgЦ(]\st=j+EQDȶkceWHtw<LFٹ2i"10ިh2>[v0*#c{4I*Ui顑GSBRyiNd`4[2b`#3m䵃Gfd{Y`<
#BS5GfLI
c5e<VLJ9@9i/KFΌ>y^4TZ3P"g&|B;'=l*g2⠠em}umv,z޶!`E?|-{CyLa?'%vza(TKp>W8>z6$ʑp`DiU/ʈazjPx͹cXQH}f=0璘zk, 4ƈ~&\GfE,p9XAŉZt-4WQV4K_
![c~NB4283ݺ4|ؔ\UUtvm~}&a06
P}q4\9$ucM#- 8-#S;-2&nޛz#z;?SյoWrMXdSP%Oh%,?)?8Xfv<L
;wݞ)GQMޔ%ؠi!r=W^Ø(3#םq_db2K=.8sR,lO[I+ tq=).iTO52u]	+11Ǜy6e.y;wɃK3]̫ҟ>y;|
˿W[a2co_I\>R--<S]^xQ(v8kKO+ZeCQtC(ؙ\RH5%ڲB\NTũfhp2mb p9s_mեL:]]S<D)`O!"*^3m	U<fm4E
gگJXYnhHCH;Y̟/+"Oggf{+˅skPFi(}kOR2}	1}UQmɇ%v(^T2Vr*5Ztdq'Yf 7JÖ]}-Y.xό=*b{Xr,P=O8M/{B\bP/s'9PnՂր$ĞkA2p<<uw@u4)75SHRc{R	}}Hc%@-TT2[Wdjdwj7+yaR8w|̷[Ogv?3;i)U{TÁhfsVƔ.ܒ)gJJM
ܚǰS&X=(E+:`j|L>B=~5ǍRí]W<?W^)>r6f6=e:ݘӢbz@ypS(]9 6=Pga,lJ;vO`Vv[@AVw fP8WgԍV:/^lWT))Tmb8ViWIAU[J:p	A1j%U;eQ*O,oX wbƓE 1Sjbn`7pvPr .Qz=Z5y@Úֽ4!"ar2()#'slXJx2R:z\9FRK5Ej,/4!pŝ,RV"{2Y`|1j	q	G1sZ;v%MvHwt_$Rz%2IZoam{9`nxϴ qC#
{8aDvo7J[˟RA9hߚ$Zm7e47U/ڛ8`\eoSЌ3X^{lcRB)֟-i5w:rDTM6 W4[DXK&k$wL1(jNl<M+XC-{OᅌvYaQ	IvE{mt)Xbp<Ҿ`Z8~ڧ{RIP~YN80f)%ǹ]&	EF z81v¦ܫ-jgMCy/KBQGݨ-MZ^iz')i!pOgFS35:刕ÃkPlf>+SKuO*uFsKNsM#(^IOMm4"/5D˝Y<rjIq!Z=wlA*ldMl<w l8Ϊ-jl5jzVyX-8FGEwPaT[Ge$es%t!8BrB\~eS,:+?OFDPIGTJbFkrA*,V>{Q43Ñœ4g(xn`X@S_ΦB3iGCu߾YrֈXQXT" q]Cb[GY@&Ih4(M!$[\ph j8eDa.U@Q8;-VN(/TR`kDW$zF6d4~a/d-B8P1=.!#kRɅ<GQgC)Pm13g`_()BxC[}IK	lD1J;bB	aZQ"87]@::(髃wۧLO]`6;[6&.&\7
1ֿfovBLgUJhME.C.EюJIb9ɸLH1 +%7al%47]^e;Ӣ!nnsm{n-U 2+bWJ-ɪ0H'T	o!HW%dICsBeT$JSs@E)fSJL15(Л,gkM-%3N?]
=ϒUR:Gv	Н/(*Fb$洫bR?L<Pr09[1E8Gԃ|*0bruas&GLR2f\ &)dqjT-R _&[b	ʶdOS#K 8vݘ"ՍK
F؝ܭ^3z7i;v_)>/|ɪw!SZ|?WߕV;T i;%q뜔в%EMC} S7 c-0dՀ'sDncC1yح,$匦s݉p(.hɵMfH*iriƜx<œ-manvk~&$@w(OER)],HuF*(ijGNQ+ԉ±"j]P)%rl:7xX8쾦/z$
*W#jyYy@jj"Vx:N[FESӼ^tp^2Hdna
}&⬫u7ԯ9w@\¢U}^O|O-w'7Mv
9M8GSPPbIN^L\9H%`Mg].$+u,q('I[ȸ*;OG?Ŏư4[!7S;gw`H^Jc|2ÑAaADDK8IOz	LqyFP{xlK=UfTkA:!5sw;)`(+pƣW
}1qd/^'(%OFx\mCy\SDy=	ah`N7q  etIHOy/;=1$O d1҇P,cA4Z 8eQΠӡnSC"@X6I]_.KZ}͙zCM*ҬePԫlQrp쩠0sieF~MRkKz#%6ҘQNr'?1韘OLj0i>$?Mn<$$PHbB4@wXCx8e=ix#AϿmFՑ"6٩Hխ/S$d9B\PbB9Z޿gR̲ f_ϵp7Z]ݣg|Fᩎ)MMA->֑4.OuqS/so\"w
E/>䟵*WO38L*||~@qPuKtG@ώtXGڍGQÒ3	]W(w~t*e{ڄAn!?&s7ڏO
㤗np)b'c3k6~_ ۗ`xG3B\/5kpz+t/`o򇽛sME2d#x$h;j5d;rIu}𘈵P?оKg褉g2G2crhW5cTtu/<Bkw ?F#_A&UZ܌?ztۈ~J.%f}#$yOVpt&X;R$kp\ܿYMp')*kt0ǌjF-F'ŁcbjaLv]흗ʹ[1V:nԔ/3E-z4p^!MvlJ0lYn-2磓V%2&GB F63&j!G{tR.߹n{0N!lI"2,OV GJEC00lwpdo[n#2h
`V!3R$)b@/*h=Zv&!3ћ㟶6!FL{M<7y!ln5b/;pw f:
2"bUWp?S䨰RWhJ[A|dUp-1BA+XNOTDbc(jPCjAyxO߉I]ϓvcOuÃWnb*r>r
T7S7edb~Hl ,(=uM鳫mK({ zJt#Dʢ,Z5>F6T휟~#ֱ흃acb'fm6bT 6zJ۬kׯIGDɴ^PC.MbRP7uD(<oaSw/
Ma;QϰTŔAK~ыGpr'0M;3}Ht7vtNi8`^ <y\9s?\wծHj(4ͥ^km7hI貊AZXUfgT O\^rcExBҲ}bN-`Rs9m0perND+cz# Lܰ6`:I)0_9..- WMfL*z/=aG)y~yqa<:Q%7a3fFܣ.7=䂑t˫=pvџݲiڈC<O`kWBmLsښ qM#:J;W[xmר[@9\9%MH<]L-O@;V ]J3 )H0Z./5V&DGQM_pmǶ]_Ik@0 {Tf3sg?39 fkP5_Z8E1~O`3kqg,\N/[o!Yn/:{y
W.EF>ց_sTh)\0ޝmuJ7.|]ZS}xbw4s,QU"-Gg5?oMI ]rQtOQBu]+3v!L! )T,B9SNT((P=85i3wp`X4xf<E;2mmI B!!+	CaX^)Z%	%0Eq=
*-TB
	.jw8CHGG쪍y  G3=8 ڈV98b4CQh<:qNa4lSef?"?MT)0$(AIÄ~x&%&&@fitJ{h2yx؍O4gO$/9t[;aL7;6<|x
hxm%1.dMkZia ge_Izż]VN!
Q#`JQ,O~Y U2v5x?T	yպ<Ew29 _j3Ȗ1e$>2!,Aա4wio~w7FvDD:0	tptnDyv\0.1wSh"T;Fs;O9gLa4E	1?`h|OLPCNP]<_P@ԅxyd"Ut(x_bXb 1ZJ3OڨGri|3UabCOO!wHX1F;⛭W7 ,.ExL>Zf	̘}꼅nQG?Xo;<7;ͦh'<d2ҁ}-;Iט٪VR{++D
tn0o#~
;|̬X\K*ɗoːO@ʺCAL>ޑ|W?N 7J3Qnv5xӧa:٧6O>LǗvl<u6edնdp+  $2Ff-XeޗG0S&㪂ed3x]!N< \
G|Ԣtߞ?|_+S^`1`4Q] Y+`S9lك >Crap:Ĭef؏;F䚍F)kE!,,}ZR^C @ϣO*C#W$1:qFW*9# B<)}Q[ޖii3@ؚ7<&u@ηV,lGeYqpH"kS.2ӳILs f[J6(֌ |6V6*H#̘a?j\5WVUaBեT Ư$.oZbl2fhB/A5Ovc g	)kD;Fn;9Dp[yV*4j-2d2]=u|#3z՘<"QkM]8BmQ@vL%30ohkfǄ}B8Vz;V|
2%-Jw<=,:O:{ѡ7
89qKTWlRk2⃨u:/n>}Uܪu-{ś-BtV":A<WdxKlk-x:)P".Eqa5BtZPin[ƱEJ9Ns,j}$["UxсI6Ih,C`ExJ.!|,əXƌX&xd,cje̍*&+n4dy{˵khDg,%fqq\+qɮWMbRQՆœLIR/jCQG;~7wil݈{V:%pLMHa1n(F9ֈpMn1fQE&jJH]&}i3/Ax$dOFSWs$|T&i(HMv
aw<N+urp*̱DTlU	pE"1
~a/x80U~.>$/2N/g)[Y*)GOyΌX`D6m}AGm.Y?dn^^&Iz~.;@D̷:E</o HV> ]2c8sG&~޺蔐Vs	igJ*Egy򡾺`Je{ڙ(,V)bU1"27Xr-BEwE)۾jtҋ1zވP7sT$ĔF,/Bb^)PNsT
'')&9@|%ŗ\)Λhy'|ޠS儲G@Z[<8aGI_X_'䇧4kx$t6䚱6IIQNUݑH_]ǭЩzlsK50}3@y9jYF!T	E-m;^JaIppc(|Q^)-/vw\@]z6%3h/9eǲ'lû#܏Ʈ'7q}'7ߣw'
qdR^UMop~}t$u/A$S!'LL_;L6a@%VQ!cz0ZDnl>FB<=ϸ"82S5SD@2/cUş	hZX>SJaxF"֍Bq"_̫-g4(TT]31k[=n؇ޥ,5
ތݽWON_ޫD@^(n?k>n'>
V$S2Dr%V
%4xI#s+Չ[J 7sJh[!3ר=w1^L͌ZghrdukjѧAxѸJ?<qxok;Q-6Z5cL0-ȱ{M?kniL K-;Iz9	-	e5ݰ 
_DᜅTwDu	+І4䗷ݭu'­L/_"	>]L5ʃC-0Xwro8e_o_y8=F8ȀnJ-D˯.Y?j>u\pB}Fkg	tEjc @~s?!o5YlZm6N _/ r q7;v
;۲-\	0NB"M&[hTw8ӪvbT8:T*ϑjʖ=H7|ddFPZj8{CɣO<fvV{MiGAUza' wML]9#Z[Øْ2HOι`VڎI{"^&1[z"MhDJ'"юz)9SVô7J;ewBi'w?I/	 Q qr,N?}>kby$=`مPτHad,svq^cm5ڗHYh
r
kc1e
2k]qç"zz@)*dpp5% <CYZI_+!;b$6WBk2ߌlAQ0u8NAotUv׉P$eŸ<F_>ќ=-:iv	j^dw'lIxI#ܝnU˰
WaǏZ擧߷(Pn[t耯9?}Ǐ
ɆQK4H<s2! aN.)i==Ʌ-O?|ZR_I8Kq	]xI$iZl|dλw"'8ZL b-VNAUMWpǉl"|藇h,s)T_cGM4.M1a
[8/@/,þKsw1q
"^9V<鯚;93w/wBf;|fm?2ruQa<;XBILNl;ƣ9nɈtjJC$@}U=z'Vm=},_k+
M`G 
brJ)YWٌ 
K Zީm.K8gddnLAa|*=J2;wJ5Bw JjXmRW;UU~h#g9dD&2fTn5&p~Qfm+ǈd0R.sFLm3._Yrg<le(fE,z^ ᶡ<[Qg+#BO5+y2-nA W񂼣T7{A>#xn$HHZiJcͧlvY!-Z{ Hu J'G/4Ws'C?4Fڔ_DHhh,tr_@X*wEܙ}|#EbTo+$nl^B7gp#aCp@]?fdw\?ϖQЋCBcQȱa#vės{	/AOR<?[6yR;oܳGf= Tm;(ml:|5a	vUNlW%{alx}}!;Fo!\ꋭc((s_V3Ҏ[e=۷`YU;;תZjjz.5zRNoDP2O,<WL3]\_v]/Ĕ/&WZeQu9D!S0B,WirPe%ZZm
 0n>6:~[)QjAvaxLEAX!*4

z
>tD7kaUkj2ۥ1-ä+/5#Ao|C/ږ#Ҟ-R,Ov#Yn%ٲX*zy&ZIy+6vH?gIUrx9 .'$»0-82/7\s?4hBBo&ɑ83˗@맓@HFQe'	 9i~ ">)j̜**Ap(W	{ ;u(&%zǈ4C%lwO, 8Nvf㐇27Yg P2v[VmT%${k[=^+(ѭMdM-{`t2~-[pk@Tg-UN	w,_T[fHݥq4"ĜMU2uޕ\3SV}wG;AmrMpj#րsB>ꃗzᆓ7Rj({9}}ABL&z)/P[~9e-Jp9kiSU찂j\ZCr%	/Pp+[s\ut0|fڦjZh%X0>-]vȳ$ IfEo4kMu.^Jf?'YCC)t6$;@N韐&\0R[qaI 3LfcItMfc⧝\+o򔢣fm$"+ftP$ LZTZv\v0B|ņ8LI).ʨ$r1zi7@ 7L<+'*(0tb}cY{1"XuHM-'%$+㹻o؈1V,k.ٴineua=enٱ;A</j
~6)y^'d* X]Nc7e+ީp\ǹSw^S$b^]A3rw@zgH+xPYˢW^ \U[VTTg1ei&GAҨ dʫHqNuepI<)+@`&=]a{t	-Xi_@"J6]hY~|VbFEbnh3uZFH'#DI$>qmL=bDcTfcTJ"&]atl<<`_ICqBJ)*bewMk>	2d_锐fR4Ɩ:!Q~LjN8^,p~-3%ś~CI!CDWWi(D?!Tj)hIx 'ULuRi~2{p`Ώ.
+sh [M_UD2_(GBRx.&$]HmNp39ϗ,j4WAUdV
_TB9@uBy8EUh^|o8ֺ^B+".Kz6F%{Ec(d0*HmHGe +B%
MƅLNf$$:1*TbdzW-D[Oz饤}m8Q?:m;iVVױGz<ʰ$H
g%U{M9_Ĕ^j,LOhjt{58dc0ioPI>'#8	yÝPCݖ;OW'gj(ZྂZ=&J\a֑:ga[/:`	J7uz@E\w=z;̱}2tl"([	B҃l+J؂oL͝pXΘ.:93To)G@P@Io݃{D@cD
'Q&57][6><;ڧޟ`v>mDp6&Ӌ4F.Iy\nｑcuͦ@D~{?mP?PsgvE_Oh9~Y5)JU1x]B_Z;k[y38a!)Ej,aH@|\j%yocBjӉRcLj$S,(3LL|";6HqJ۰!_A$uPDzh@E;ĹC8gC!vbw)kb$g	 G)"zK.ӃrD:<>XdR ވzK-X:ۍJ$mMi^tb蓰2. NM@0KH4\^4^bēxһHƄyHٹ
ƒ&v=L9S*w:炳ouV{'O;>7B#׭Z[~Supѳ0{	ϰNPC5\xPGOsxpB߂~`Gv=ij(&agҎ8Oݺi7}nkl40>lv?cϧDe}d"n,oC!heڏv@E.?<]R381v;;C6FYRGg39ꑦG:*}*SI$L;'E\Z,E2C4v_G#-_T].'晼@;C{D5=eR%':z~VnӘRA䲨*aYȬQr3ݓVl>/G'zvWpi*&5L,y1n"Y^r<ژ|F<ejD/ LZK^
FMA;ES޼"3`1X?#fHUj.W|.s&Չ ZHZ+ZNݣ [Dӛ$r;9izE۶JlIȖPnQ.rxu:z];	pmAµ'Sxj3Ŝ]>oZը[go<^ߢ5>-V;@mF
e'kx]eYnQJ m ӭbgNk0@,bըˏ]??9<|Jӎ{=zos󒋸XE>'IOE;:Y'5չ2}hҽNbceP|9j-6e.jw q/BΘŋBuʵ҄x|\De?mZY0wd|.aIrGRdыGV>7@mHiPLj!'*))$I&'d{wX)T¦8fۃHKWMN7e2L*<bj-<6I>SM9[PE.ˡXX1";tf&e2]|MN`^5cN/52eP0~c-`@5%\*/z.T6>nŶ^C|Kb%UGI"]889}nrHE|tp*tOL$O'B=.PN:!	KzAѺze25q8sZ@<|dSΊ,]);;<8\X[	O!3T*tL^gFj'νaZEφ
[Xhp]wmwSƑФ!";zҞҬᏧ`h1XɀOEFAֆZ+_)ouO/
+`ni:T<ɒ	dUІ0jB1`bږtX2lDq,y$n"%D)Y;[uU{tǬ㸿^kZRB^sW֒gԈpz3x}}	L"CpBb4ND=E=.*7qu/g dq;F23`&Ms*`ۺE?1@Dwo}fW9kd{[Zۤ-՗ѩI:;]U'4=og#j5s8+(K- ,ԣ@<'ʱ$$3dg&雪o\DE#=i*=Θ6
Ҽ_AT	eķa+\5?REyZpOu,4nҡrk	g1)qQǌTG[|GnH-kb;LѰlka<Hݲ\pUELU)ɟcKQ߮-y&'י"[bw4KcaK/S8[aZ;RL^fHνv_?&Bw۹Ztԡ5^o鎶_ۗczl6g	MQMWW7/SB)׉hn^f.XQ4Mވ_Dpp%?TvƧCí;3*>|.tW_q+#P@ïD.6/M#YdT02vj<2UJm)ݻ u)wkkof:NzP#`()/4`{N'/L'sOS:Y,:uu"~i_2g@{z|I진::ƭX^̛o!mX{{{sS{3iG+p ~7;h,{сWڭh543&w	.K{?L#?j=]kGa=N&XJ	'F~΁){%&bd,LSu7)>-A	}=}}רϟP/ps WlqYUl.i^@SzE_zA^5f0^`MCj;;ˑr=.Gގ+nWўFA.ٜ_y%rT-faOR6aSF+>P><b9k5
^ϋ$@ҿNWW|McjxxqM-,PfMr/mSaehp2̳arf;Us髆rG	%ko?V{UE0\U6^??۴?N[}E!4WC)2rdpi]izV\<nE:b&q@%Q٬U8H8֚n71R;XMl[+Ua4e|g?e0FEJŜVGek]FZv)E)ĸh?O#)RڜGqtcFNOtm'E1©3xKN1ntz1=w}Jgտ{kƦdsm;}92~3Lv1(Ng|v@<H>r(0;>L>w:J{|r
Mij_I0\Nd?FnOcd܉¸U dk$,$^hr PtVAٜAN4{=8+E?E߁=5B!fzs;k慦e4kNj?>r?Ff彽5̮~WpJfFmGH#Wh,jɐ&M'Rgu|-.vRF(y=V"	tt{8a_E>3e-u:1a
k<&nZo:E+f)8U{%m>vфX^H=T`B>%!Ĺ%P\ Lhs&U.rX.򱱋}J&-L*wHo2-M5vNYj4m1ማm0̭p=rc+6!~<?R%ff?,lB՗injyg^Zea;kxvYzOl#^ꃃU
)KŀNT3rvZk/HŏnDN7Gw_2Gi"B 9x"GsE07F@qΆa7ɸjİC-לP;lSe9Ey9qDmI]}qQ/0Ƒ,6:RAܪ~fkBeNMltb)MkOQ٣QA+4R1J
)盝6n!k6HQ4Z<NE" PvgHJF`rPڊYᮒkrh#atQmn>Ys+q\?|T8'tv c'Fx@W%$TrRj(|A۞@eh0}84v\7^<$
:jps/GO:!&ـWo#69Z獇a\4ު;9ڇn^/I]Kݍ&nvUOE{U쭦Ǜ"ːU+?]6X_`o5(@1Q*1d'*V6f$)G܂=LqnkL3I#y/2шZknUrf]ab IR,FmsTnat?Q2(m悺7k}n¼iβuO8K٨`o_+wIu7ZUR[t$}jV@X	ZձF.48H'F5,YNzO;Ǻb%Yky~+D&Eފ1P:+]Ld6.u_|(^ԒMВf;yg(;HJt_m\:Ŭ}Wm(JAL	>]ʄdcBB1%{q7l+<Frf[QVkњc}
b;fgfGGHH~hymH͚= +"V4;:S $Rւ_CAT~_!JkDC,G9gf]Nל	/U|@mtWRH/MZfV*?Y>j ލbU8.	{e}+4OU2qBØXq/>(*SDYahjGLzȁn9#)Ź˱Nhu슄b=y*@Z]SL	9>FOVGtKT FLpd$x!	W޹(?)u^g	^O}H"里=v$89`@EuniћcӬ
o;7ã~,">}<?vM{V["ru+5ǧaNV"tʦ#۞w+°#oAY Q_Xb[1 V#"_=h]Z	_<&PGY'OB>V㕠VB	vua!adxѺnZo&oaH0<VdST>ڷ3^fo^1-JQ1ĝV%O{y%
+)3HkѝWx,}<SJY@'H(!-i{ڴ3-(ͨQڐ}+ Q}1tQ:DwVr
Ng3QZϸ3~K`p<v^Ai )ߌr(4)W1I]njɢMT彥mt2ՒT,WjGƓ˷.һ[K7a0uŊy&1)IZ	lGYrdt̻è޷bEDR}Qwp'ԧ{8!P:~Cm*KЧ'W2"PvdVB29Q'T^iӌ7a|CQ[:<xqS=ɚl8 .
HZ{oOߝ>Vy-RI͋	EYBpmCv̪DѢP$%$	Qaq6}YRx %I%Ӕ@'AHnnAP%Tn!1+M7Uʣ |Gϣ#]鑖K6Fi#}jؾh44fáyMׯw=ށ&fZ~s,RM4Κ_=9t/,7c-kB 2(ԫ'}݌؈2YG5l}5 
P|D[M8OhIVVۇiJu,JJh^Js1W>B[&g%ǣ2G~UeF06Z.i2DqWG:|ҏ({+;El0pAYEԷW۾1W/ 23&G.|f%E
k)~-z#+௬ǆ	x/>Iש!%ڄaRB-2Uyi}4=.``X85lçX9 ΨtSz<1P#k[q2lTV
@'5ԩ9UQ8;pF^6$|$5㾼Rњj;(Qqθ 9RO|An[SC1dG>jȂ@Er'B 3ĤyD֪{I
Jy?Ѱ'탛slth6ʋXXg(r>FMy#Rvap	j[sR0gqIkVis~Ab8tս<j===Ckiޟao{ymdr3ooquδTCE>0ԛ>ZU7Ħ&	UsD*FB50u8

˼fGÐ2Is`'ex\46zr(nPv/KI1N<ߖ5^fW9A(!8XPkTʄwK׋sjjϷIByH|t`čyb\44,d[p-3_z ;NBP-~>͝IV^xI3uP'D	{fWi|+vH^[՞N:WJrӳ KAT2Q/%m~,P	%bE=ՌkNQbrHRpK8ȵ~.F.R
W2Zn,	Dn,}w/<rģBJ!tgu0*K4sש5v<llegFodC#(RKG_뽃m^7>
K3z&}15A X8djoC`8  Zy& /GTw|&2!72 "u]|NdI[(my>|#vik`%B|$xC_cw2"&1WepDUIK8sC_λ]ʨ^D2=@?free9w6ưcɕbCQk\}+o";XAJO
B:qlKC*[b=BAnE
U 2KoQ8"CCi2ƘOi:G=*᧫xBMp:8٪JսKJcKt49K`	:f2SC0+U8bB@DA06JFp.I/]w9fZFY8SZ<jln=Svg&'gSKQ<9Թ#%C,KqH29*c6t=XV@{;KÇJ
!(EUZSU)KN	{7ony)K*pK	n
$W	oG~SU##p`N'#0:W#U	4A>T!'fzyh{#;)QM!$ȳ*d쎅B2Vi:!Ɯ=w8VjqUʏ<ߌC2\{j>XJlȗ *qe4Ht՞le}Wp-#7/GOdioKSdJjsQӪS M$͂ײp%K7ё h$ ?dw;d94PLj|ƍѺ3/E`jMƢ-5cy!ni!eM\Bju.*KM4ǚqS&?ƲT$Zzǂ8 42Mѓ..7>aI&܊>VMrb![P*F7G. XSM
|dYm]xpH m~Im4:lC͖+lA!]+)OB1Y\q{jKǈ41z%81ҝP)]R0Z%RvIJ	vTלsu#*Y_Uy6tNJ}d%>u'<ְ֛zhc-cDdDzW g!șM'qfuYykT1yaΥG>摎{:uL))f$N5g̹t9..N:Ѿҗ'DH~ˆ]`fgr,P#`WS{K(-}ijC֭B-
ʚaGr--
V!ַ9
o6v֡!;v9.')J?Yx6Y:N@wrP5b4z8D6[
ʕs.%!t[JF9_:T%W]G忮`ns*>s!yb؃]*7?V8+/ R pg"sFɣ/OsPJ0l4osz67XW(KdzIA[Zo8SÛtu.؃X7\}!Sqfm{40H-Jɥ/^Od zP.#8":&N/g\RQo]pYVr- ȹBkaŢh\^ϗ	ՙhB&>Ôl#
km$@a_ $,Db˗IBKk7|vː72>IzA@<F*.1_ĿҭtAfL9-ON^4ЧTCơA[r!{g,)NAr Kae! %E0QsUK86I|{ox3[iu@FDfrW=> +ϐ/ޚanOMO̬T95|1p~vѳ-C@F3 c;hJ7_5XxG22! lVbB+%laOћ#jo[Ҭq{/|{TEB価[N(ݰԐZhur,*A%^o I*AiE'ȝ51dɣa))A<M\8(57ŵ6Nc	YW4$AMLcUYNx|-_[O!SK&G)Wh?Wn@7iYU{S;{I>cάFpNY `YFRBChG^.VM(cmre1pg)LLbW	eWb<a~NX% gp	J:5lX3GW%V_V<4fxX	en/[R6vA?4,6LsP&lJXgJPR(M)џqB %*_o:#/)|y8:E$lB+NcGusHHd
ZdFzҔ74YdN1\(4#^R@.WjhM:pل'$OGXvn2r%pr6Mqɰ0O:2r"̼3쮄T "N3lyYq,/7⧠}s|IN܄mDg6_⼌jPwcq9$Z1Y86.Ϙqe5lt&?[='_`։"ЕG7dmeQw|a+wG+4}5Q6H׮ajcx5,*:	qوXo{q_ҁ}gL]ru+*D܈kϲTB)yd6
t_{E>ދ[?z|zrݭ+O7%@-"6(}98֔W{6KǦBmWi]|>)-8 )Jp3g"Θ]7U	y;3>#2%e$0Zu-w.dTg^Xrzi%-8\jWq=>|X/Q`8CkJsw
bM% b EJHl<z<g a &-*gAGAZ5	CQM|:khN?LΑ ?IiruQ9Oֳ\@ WGVVo&9Ah^hX%:-x9 X"$;Ǒ|._	8ѨOhBF>0Qx1ɓzhYr~ZQeϔKN`P0gr#CېGlƚye+r)E5k3`Q!HkH*YCwpV(} T6iÿ#?.FS:wO2MIK3X2_=>2bIbg6K%Od˩9;3&eq&di<I4W>1 3ZL@3m)tc9B6S1O5D =Ӕm$jn CNŲؓM0/8܁<
MMQW"ʓcܰTȼXdC5KяX<WHų	,%(?\\C"PUUX-s87x&ݍ,<&=̛cA胠ak@[#fR.*=eN4<wE37B*k&]c,mNe|W>S_c,̲DAE *hsd8) C4m3Nmۿ@oF/h&{@{kB/,e{4]f|<iL}15?S˷Vb!9=~T꺇Fw]pwo9/uqݝL{8Y`k:G76 Z{=٫js*nDG&xYe8HMMO0yFMO~4zhxlyST/_>w#ӷ+YWB_EUIGݭ}oh	t>En;>9|'RC{mv^::NWX(a5;+xISRAE/T"VG[GDxbetnd2TӃovJFRpaUs6y(<>p~|}lb.fq$7IS&~@ɢx=s5H;x|#v>_G4x=$DдZ>0?3`Ih)!GB6}V{1㲋f8'ԜǼ+1ry5W.sPp2c+d۽f^6.q3iaW ~2/z>tD?a՘M1	J)լJ2fVJ_q}Qz7ޣzi"=F]釬_
ۓi:ӭ)Q: P7pda;<0_5;7U^jش÷0_]Pd^i}	}@tglνjzrB;W&_=.?(մD/ΥWFW 
>}JgrTXX{Fq_BZ%xYPLg|4megg#N4N:й?^{ڌ->#!~ Mx5y?8_8AT/=={^tY;(SfN@>/265GǋN}(*n-+ذj\_d,hV5R#Ȃ"jw[Hhm|ݣismQARMwp}wgY	mKP!ukDf3o]~wwbwJa[aʕFjbFvkX	]X9h;h.-<8U>AV6tB1#<	Gw<ߖ#᣾#C[UƏlDO˦O8U%eyn]rIq%'Z450ʋhvOF~Rhfz89!LZݡquw~~gAr_G

ء"_xgd NEʞ[秨)tKg8-i˫mS\]5nK%.o)> ksn03F\Bիh6~y~bI^B'}wOA64Isԍn5yHT hhŞWX582!Ҿ5.Y_Fi˞tM$7<
i;2?Ãz
BVK?MGJ
ӫp}&Y.%"[ ݤ}qXu<w!\â#
C_{ haEvOKywۇ^F6`liKńyR#;h{T&B#E;$=r&wC[x9]N^t8CTe/;aXﱘhRyh卂P#}1M?_[e~l-rUp~	yV2CdS<J{h<|y趼KlrP!X'꩛^;4wGG݃FވvcUbJIq gp2QSvxP@,/DcVۺrv=3&"iSXl"SqpTb^no@bA@^w&d}*= (^~J%vn:,󻇸*Uuh~jcUbOݣ"ʙ 3h%X@SL8:&}ʛt%%.Wk6/ ?g6co	ϴzz.::;>8/%.)l|˜CHU]jieKo ">:x{>F2׏.;gkr^F=rCag{aK	aJC{HNߋ &\y%ӓJWY1M/B7t!% 2PI=LÓo^t < gs{pܳućaRUϗ*2>ô_g,!ϚRd"x$w;]ƓL~W⿕Uᐂ,N	;Pix@{u?gѠ.xw0ۚ)hmPï9߻ '@ǭ-pt㕜#u̇nrrSDr%cN1.Agp{RǻPBúTtc.6a	+%S9`(],P]51[dFVW¿Ń=}6<.S%%qjo)ۮ5,L^>+hʿ+-~B_z?Zl7~޼ywI|cަkfr>}??Fi^rDO` t|#%?}$);/&c]LPb)3W!}3v>1T\*pT;rbrd:j4	;_ٙyG;2bOԿf$|'i0U3!Ϥqdi^5t@	u҇+LNC>BSOe!R[v8'Xzq!vwpdCX~zeV^(w=VP w&w|rSiaFE026\?ѻqwA}#Mq'􂖯_AI@X$!8Shkߙ6LgBO[G{HOJ)et>u_xbfm,>S{;D_6 [.fX\Kr{e51ׂv/?Uja,KmӾ6R+Asy?`ͻ毊UqWT4м{ǅ{UKj<'<F^?[5?<*L|2o߉ЌS>֑ͻoxxG7RQi{'99?ruVs9oNh[ǯ;{?Nf3~QQEÃ-9?
79<7r|.}8ߩse~;dVs|Tp(|ALs~@U7?X+\5bttnٱז@M gK*<?0wbW
׊WJ橽cKebl_[,1cxUǏ74{jܡW֣*TҧBy5 sۭ?E$WotEiEݎ,Ia>-R8fe%J,h/Gr7V~
`Nܒw+awO25r"ZǬ/I<QC&9V2R_$fk3jҺ:sOrHTd3e8eW~H4sWOj0U x7+[%@$eRA VAKͫZ%D?̆7Nj(zRB}
:45l.<'Q1Սf:=y_%Ȏ0}*>Թp!V҈.4x|/~'PP)tl;O=mχy@qtxf1W#;N`t/&U|]X6{ɂ=	=auW	!s:ޅl0Xsu% X_x
EJ;Z8da{6<ZCޜ8;X;6~IoG{'EOkaj_}Iq4قԚ8.)cLn}+Z+#cmXiU:kc,bK+X'Mkḧ:Cggi2LS~@I	?4Z$\>OIAz;,ϭ߈g+ۅm@t)>Yqn:\W
c7Q'?:z=yD7&wB%q?CB>03	gޯ6cr5zwu!˂w~n~φiʈJ>ShyJNgݴR`flU^ق ^lߐ,'G{6 [BFcJ0`5^2NLA2I%S)V(0
FM}e'IʅJlok' 'h<O|kPV|Z t)m\fN&eC5%0o[#!}~o+)=vAJ@,sR8̕}O37Gh.%ta{\>Sـ={M92#y^\ʣϏ?=C,Hr5DőBdL?_CqW *~{T]ۏKntWP`tf74WTfdbMM2W:Nu\BuM	DC$ʊuSuY)ǟ2$n\.rDt'G.}󡵶v1pv9l4ctlTA:UL^*qNY8O.y&_lGvء	"a~ٞcȆeBBB<v5͵0x#zX䝍NR+D51_QX^PةJ'UF4
VFhxe+yzx.3;rWlb|3;^0,hC*cX!"KwE<t- q8'ċѽqFr<uD+/kR7S:eGdlz-Y,vv;pkKf=,ae~ZVЉkk̓[lzNuxh,^R?,xl鞞l
inm7S $_SCY/GaekA$\G)^tCéw|7m+6H/OsEd$TTׁ֠~oP˷=.̤~,5qw>'"=tޝr])$1Fn$뻴 .L>E2r-uݹ+)\Y5y{|zpxF*@{YYNx{;?.B]8kiM߽v~{yTu(K-gKVtYEwI /D^^?m̪F8;U2_ %6wMl'߭Ѳ3ǽbڰf|:vOϤݸ'Wt!ڟGrPNhΚ^xrL̠'[G'%ywulܝ7o].H0R D-K:Nݓ)H NOh/Tv9Xʋ͸4:Qal:y.tpӱ)NZI4;oM墓e>·bU-%d5OOf
LQ!*
+87Zי3鑬{zg\@XI՘`omٱ
\LJ/5|nvϷ242ZpwKdLEd|6[QWl_;C9[R%xCJ/{ݣcL1p_5l
XTm1Ӆ0UeT;D%ݡEޝYЫ2'%0$D9>݇6YǏsOGGޫãn8u>:c(quzyxTQ:n*egKW-nT@¯ܥ픁J>=4sj[h[wGeDsZvI]ik]W26-pK"؟}azw,>L8;Or-H.ݕ/"څ([ˑ ͵t
jo}t
jo:Q{o*YI%>hBC?E"eNJE9]MlO|գd8d\b[Gccw6"RW1`-ZbǱ21*p(t8vW.t̹ie!gq{<nQ5q@Tq,56kQE+hY@/P0w`%#/Ynp	j-zB#"@FlntJ},\

6:v.
W/q%3U+I?LS@3d4Y%$3:tCIcz/QtD:7gaaٌIL>]P&b6AĽi94 `ʢL?Gzc6a}a#aa7U:Eg	p٠E2I*d>vf.%sa[^r<k'xifl͞>K;EhJu4CigD;2 9ot(G3\3EHL^ArLmitCšxĕkc0B3%v4IZB8&YxDa!=FqTigƭ|F!*d'\4}:\ԽUױx$rNƘ Hyb5!0vw m.E^Wt_{%%cQ!6kkh?L eG(.4C!Vx\hZDlz1D42"0PHK>Mz&Oe`DǢardG1 1|~7h|4C5\+Db'h$H1txӈhB
UW/@8Po:8i"C&c#7fx@]ݰۣWuZ=@D>̊sv'vj3Ta 9Gn`%Np2	x?%7钓~XI3.̗j/],+^0gzO.jYYBcHsα0LpHiw|ҞwduNs
_G=<}#mxc`mMM[h~ݮWҍ&I*a[aӏ}'Xl}<ʩ9(Ⅺw+cWrs`8(wܒTs82MFN|4y[\|0$HU9X8fhIGo4yDᨧZ{,kNKm؂Coty9x 2\j+I#}^B:oT2ʲu	 cL,?"'J@^w
-?|_iFʁ0(%אַTz'[;[]^ΦuBlؽ
ֻý@-Uļwu7'`Q&߼;OO	A&(wm9x.x),8L J2g|- WrN
TЀԙQ0x"/T?Jr t-iRA<DI>?A}Iy&7R..bv6WxN%V]2!4s|}J'Q7eGۏA.?ĝ8K+DHcbdCݮa^Zx+<p䧟9*&lxVL!OLEyDP{Touk^+.<>IR~+\#<̏]̧}rjV<u)fH͞ӻ5ZƤ:o*^@ZC"wbSԞjҷEVQjSzN݇esMG?j]NVfBfOL?fQ(ݗwp=Hirv	Mr&QΫ\gytS$.1 '9) .T_`lO]b.aqiP%FKfb<LJR*&zpa'!8#J)9Hs=qJZ`BؒXk7h,swfd*/]܌*Wh
R ]5ڇz_M^SG*gW@N$c	c`G'<onNȕ0ʛb ܠnUBlE{ĝ3;j<5B	٦W:aH)2b~pa) dD4,CxG(,%[7]D1K VɄe?C94̆}|9hIXoDo@?DRdL*vIt))83jR|x)ct)iF{z.|`Lyif8@<Nӱu5  KRZaڣYΡH0:g3>_+(	
<8<GHWozqIKDY1*9raU@fG?vl*O.KJVԟ廃j˒wV,آ "t.ВM	`cY%h6Ř]l
1d 8#A{BԐ!nҾ nxoG$'^b[5D4gV7QwΦR-hZkRVOR߰91=m~/wQj(=E1 gɕcypBx̿6NG'hd|g"[bdgHOviha7*7bbS{5*H<+6lyK-Q84~е#Fg=%^ZW)ptG =_;G:'jԔD>S13\׍큣ӗ?=XҲؖ&->E3N0d}VhX퓣ݭw'{QBnE 3VŬ |:s5(f[*_Tebՠ~2/PƤ]9P1Y?aJSJq7zf2(8FdRQ~CƘ=|F{O;mu"
m_3x60pxED>36	b:k0v+2x/`bR%tˆp/fۭU	5u <. >FtsRʼq_	uQ
(-2}mѺfv ؆?xݡ3#`"\"BWx8%EI=&stTAbME]#p[wAv6v TBO}߀^FFM4mX-V3328x焌`}T]"8a$%5_ ,Ga2z
$2i{"OU@!&OP!V G07s0C
wʐVqOd+#\*`'4ֶft o훿߭[ެ.[S֘37r
c腶lcƚp۷_O?й|ݹ?%?>Q[=afyr^\Ucn+!~ȑ p*=0x@/E9Uvp9[i|]C%i̭XvU{뭃ntqHNKT;=W<E~tv9f0`yUXx[{'/k,EAwp+¹suw޽MqtN.9ʭ`Wa!U=q6 v>jQ,iG#j,$,{qqaAAqY#.ئۀLAP<9"h{ET]꙯ro0%iLKqvaa+ԙkd?%L6Sz'G' ymX0_FU R8y2%!="S!$&`|O# >m5jt3ѽxƵ1x0^DJ-LW)cVqwrl:8q5èhO'Cv"[,G',^%;m>k`!rH&U)YrG/oIu#jQ5(ӒJۭZ#`gv~p8&4N5ͰlV1"1ß8n?}E+VvCGѤaöۜwu#4"yֶ͛mT|:4+Vr5e9;6\u=,N]`WEnOMyi/ Sdqp}@H}fkE:ۙ/']J܄PLzz (KrU`go 0!?']yE+NbR8nbUŮ@u,CHFQl,uR.@(bLctFQӤGp8Qųx旅g'y5m:1	)xF@gOMѦomFѦomF[ѦomFѦomF[XW|%%M't+X r2wp{/p3:X]?ZAzw^yc:~YV	YkSm]o0?θ|Zi.v|;bۄf]gu\d8ݪ5,mH_9w5>㹶;o9	6" 2w}̻b(AjCFVP_p̅ų#3gMurw27]6Esq(_(a}_x 6/]ݷ0v:wIp|gYJ;&JaÙ!eTf.[I$^AǊ,F4Q2T_02g+jǩ|<Kf5jFħE*֒_-nu@ƊS9H<(B\Pi`OuI+g2g*ND_g^s6"z|Ң=&e Wְ	&Ee()\3fHX҄ZTk$Ĺ]V5p.|2Oa8!JOE&2D*pi/=4L;k|z1m6&PS(Ⱥ9\H.x+j,=8+m&`%An ]vH+euuad;
[X 4ER^<.10{lp&ƹתw:tĸ3{)!`MmDNp篤Kl|5"^ ?pi;xywKڥKK;fD|-Ѻ}rG贸C+@#p5t%墴<(:VĠj<k1s%TVsfl6P;)/IN ]oM7E%3D"yoɨc[%ߠ,wp- uk+4TV}ɏ``m>|RL~ͮu0FV6- I&8Yl<Da,6u0JNҼDm157-1[y%ĵx+bEYoIB=&B:,F[u0 [/`k,w`?Aj`_;1)qD@&N/gRXlx6ի8T(`l6(_zBnC:D6.*6L13Y| 0m ;쟹"kEs[~#v0h?NB Tua6id`f{xקT%%2Uh1>:.5f;=.D+)Q/d?}izQGVfuT{-:ERٛ.z,_mI`g;<b!>	)],9Qcʫxl8ʳƨ"103N*3:xP (wlěSB2%(,GCߌfc{bn*LnY	D:2?Љ@R`xYᒑ*~׼)M݆fx~zpnq>	NG3qZACvFxUGb4jFgx't(+AYeY6`O|2Ԯ^VXh kۣQCl)-		9%2AQݲPl#5C@ZD#hdCj!jjv0%ߖɒh;A@A䏨q,H %JP-O>uJ=CtS2ĕ|u6c8Z8yMV$e,Q~Ϊ9&F5EfFa-XnٹO9c?JQ*\-=x<ڀ{"Tx$T!ͨT'[x&(%cJ';"e+x5d"?Oex8n&4^e_I8D)"pB<A<[lKuthO^xfia`DA*uN~ߣZ16;Ylz\zpM4z_9qjyha8O &n".O1x!)Xu٤J&G~RYfW>=e+g[U|6Kp*ۡe17Bw%`AwN;A1cנa5O(BVQ#ESVk% 49+j_jҢ7qΦ7nQ(& !>3BBpit o%`0;ǿǿchIO\#=?:9|wBNQ":Pl,~w>qAL"CT' M>)9)$ ZIJI=P3<Nͨ#*>,XT_g9jmd9gLj^
Dy&Ǒd6s6ƞŗi/J:W	^7RPm"7rtiV?Yt6dT9lm)o1wWs"m[Y]gl0蟧EFصFVoEnu'mZ'MSަ%ª[>Tx,ӄCS-L뻿+y7`<SR;gM$Cn-)ekM8{)z$k!4Qĸø ^(0G*vɓO$xco
Lb)OfUCY4JN)fw97$9Q6"ys#68^?&'aVZd Dh&Q|W=iY>Pk
ܾP2Vܺl{oR)XkZLI>5M䘥	+g%S3I6uPs9CI=)-g1|G4Ge)Px!N=`ט53˫d8l}<bIsbȧM<
%rK&G+"ϸRMYѭ k}2zV+lVD'<&yyqC#PG*4Qh|ٱFT&X lm|5̓,
5 dhrCJa_a4mGg	$.grvơi{ԬK|]tO Jw!eZЉc9.9B_P9+JH8oߐabTƗ{WN[bfM۱H(0(rM6]1G@3T-(^ΣhcUY{9	 0+.Iֆ#7qf;V
4\u mƳQ̒s`QQC5ơM"n^DQ7͵#,OݢB:e)1{%ޢ:eyAS~)4gTk%{V ق:={ZΠQB]$! Id1F1rsʳ0Ȅ)BKp,e?,CIt1ak-(W`fz3551*Guύ,VYdu۬R,eƚ.
d+f/:$@q1 HSr섏Cq*N|tZv+4V yqySt2* w!U"ɤ6ʟL4M9e.8.qQޜ|_;aO4?NN;Q=Xu#,]~<9!xw(ӷ{'VZb.0'bBL@I]ߦ3	 T; #IMo	1uқE4gI_CIt<\2^)|ZQ>}UnPdyPIQ!QRy+(ˢ[n#|	j201=N-U.}H-E1o$WE@)zƲIc=Xן-OVbbS]߰)|)%N"0OVwAtNl?fP6waݩC.j(.D"x%Z5JRRg׋ y#sVt~{TKKѽk73}p/2Tj21e*4 30F,KD&1Hiř}ax$QB뭟{[D%]9o  Ey!h\Ў"ef_ftD:#/[@p
3FקJ܃ƃ놈7,'qC\Myۮv{ƀPn\%*{n}e,3\
II/mD1+ G,~qh>+>H V`e`%bA	LkDJmj"%Ax9D5e݊]ӻ$>m!>K}{	{rud|y A?cr_JW"ա.Qkjr3N8Rla%$YUՉKbP<N5)mo;w|nz" ۦbVKC:.]<inlvEN|5pb+6UԔ]zB{ɟ7ǃ>`lȕ(p:WX!끩1E6ySi3 a:^Ng_tV+mLY%XOT	Z'=SȗeJu`GSSp])u'^dz0k국Y=&q<b.]OyoT5;Ј^h!W§Z$oۙV]]')JrAoH-Jc0O˭Oz#p6N[+ųo }f;P-B-`Չmg<`u<VhS3R(ln]a=\lou]a  Mb6U42$Rgqќ)r&ɾ[`\"GG*HWpi{m !KA ͮ毒~O4)@Ph]/U!Z-1ZՍXb@(ߠq:BIkI2~hy-P.hJ"4YUB}7k~	o!?^4;eIgM$Xh"eu"wjkF#CeԈ&a+Vmj+Ng`p 
^l9Fg|:JAM?xPSStk7o޼kOQ 8Wf058i_T%Z%p߽׮A>Iw~sҞ[t#TQn@4*c1Gmz.<842il3xԝDߎ̷
S&wE7	ݡ JJ2TޠXLf:6i%^52jH+*xRm@S"*WcRzԩȴg=ɴE8˝r7;fm%8j*>U3Km&-)/gnTFǅ.0th$?6g]p1A6>27_qd<0<;_WNߛz<![g: 3)2Gv.W>N(̠2_reB3P<
ۢ9w_RDiƋf: 4TB*F"~*(K;1Q/$BR)&^RkHp®
s*|JT=5/wץRz:7?f	h6Յ?ܓw7\KcP*qjHKg؉	M1PK6J+@1ɢASd4j'+yˣl!	S:}z:~u;9k]C{t#CX_ߨ5^<4)`kqꂢ"@)w`BPQ_zlqelj֠u;~,q-Ͳt^[75VjP?n6|%<aߚºwIX_<mߞ>;Yh&r<\	"F=Kw䠰
6dn<?xy#}|pϮGSX3 /mwf_.@2U8o_MkQD"PGpnU4Ć8)ʅX^݋SCgӦF7\Nw)t72SR 9 u8TBA2Z`aE%FKt
fFM݅#k˴</Bp*9JћU1tSNk4So{\zęFҙu)P
n=cQ4!7g"*+bI3)˶Ʋb%b,Nujx96"9BӖxzϬG8&,-c?|1_	Ǎ@QMh1%{$&[z	K<*fS_aJIuVRR:i8YJ$g<Cr\0a41<f3az$]4&\\G2#Iveb{Y9Kb[;扉GQ>xPBid6kAu|Fƿ]30%Xgd5Z[aC`o;bB~JHoqDټy.q={Kk#>[4K<p qW-{-~H\:yZY&U'Qv ?׃ \WB|%4̌Icw\g\c'od\m6w0
^?oRaMbG)7jBu=M^o
Yѿ/!Dlr޴BaqǛh_75o>I,Y͆2乁 *~}=["e9t@Xʆ[D0[m=:=ywzh
gmc	c:_w~?~/Q;(?]_o[/?Ͻ?7ϽƳGwA&!wBin ?joBfC1s x|62@;;Rn`<49c\'ZXp}?Gl3튕++uq8(lC`Yr)ap.o@?
8>Ԋj` *DC~C MVQ^W貒Cpj-0FuG+_*m}FQ2Kq!"hiETrNUHǳuT57wtiԼ=-ȁ2'''Aw 6U;JVLRIdAi<99Ky~fG#~46ĳ 8;oD_?x~vWjq+_=M2,\f 6<ףD=6R:T0+S7yU=A}~=Jw\Qgǔ#KRuH
	Zɻ/Ix=p#_[/=
m+[2jB{b!P\u'@u^GO2r3p!6AŰ'Det76U$#(,n?
RdR2-2X?%M'ŰwlmĕVP."5nj,@V@L21fȸ=[<9KG1=rZ3y ]c:脽}9#A0"cAr\qāEY0/--,K_eX6(ܚԆQE<W]
Klnys=>XȡcY7E@'|jxd
-Tp5^Ǧi݊`p0U!d	>w|fbՉXb$n
A!i3js(G0?''L׻.q0Vyj2+J;TpeR>iDrW ?X~@NR9joCx`i`Pփ)pUn%[ԀZ*:jSq|݄z";SKiҿ2+sV64c.K)[[IhYN]u2_/NUjovy^VwDqś= /y<3$*3="ڒsyT2*hӈch#T7Dp`ټLBTz%]l?e2Sy^Y[9;i]:?>o맆bzs$gJ
)b`y!/#$w=3o:<4كo7@`07
"#7R!	gؽ5`ff"ғg/z|-Ev"І[;%	5{Xe^yxڱQ/;>P*6>Gk檠c:kQ
;2f]G%_.[(
q.@̊٠(3hp/ma.t%Ȣz0u)L&UM<ڬ>yE;ߐ2mm⑀vzX}@'(^Y^{vCc}Ӝݭy͕ꫥl᠔ОԜΔ_\@2s,#rvY4A
kprYM'N%v
`6W FN*ۃ&#NFm}$iY_)\JIwk&NH+i*-ŸV
n3Gx)d1	Xl3+1o{s7oHNOR8^76PZ8$(Xþlmb~v'kuO}
ޠ *Vod-?}Ԋ- KJDQ p{*>YדQ|(fHyɧCvvv~!8֢(@CZ "0éuIu@h gօy ~ذeS[s>n7
qŴRmT߼y	|UrYg1>]V)fhX^"ur?`n9Pg߆D[G 4\ic-3F=f!wU%Q	 _Mf@6&oW/67|ų/]n!1H	y	mԀ54Eg1!6Dhϧ$yxUr@G5x5_LsYįفX2[8Tl(J`Iu4s;Gqr|_Z[ja- ]<KYȚc8CԹC[ϞxJ~d4W0eIx*1	kX&raA5/H/dæ
#VQR<3q&l@N$:0Gc_1
g6](*3y\"j%_OD3 SJ`(kEzgU|brm)4ٿÈԶ"p t]!3MJoP)یB9fɈf%Wq:jja;`<vvd\Ju7/7l;<y2I%ΘopYH:Ahn5ā>&]?[2r+!+Gܹd$3mfEl9[_vߤp՜1crjCm|CߌVSRX>锵^K*{*liC47K&ˀ1'OЀ0~pS GmmGlAO^=vwtF
.e7QyUƺnTT()!;~85|+V8dw?L%jF,.I\JQg5` R
b|6HjM&,D$ *ikHJxfVD7gQjUHxV1G,FDs/4R!:V}xiֱ6fnvk]"(&r|s!z,}*g/7Q\mSk1o=XlpQ>zA7}Ԙ˨(E_A] #3Q& e <YNX_GOH:GF
L<~%=̍CQ(M3sY	~ErA$ձ  Ģ& @Y((0oGf }!ED'{
25$2W),ݥ!u۷a;~4f mߐT7Mm^DH.ቁk0A3K5ǼaGт,r,[f;|ZKs_790ag>	c"&RuB,<|RORl"4zWm|zxV]ũy^=.ì"2)	|3Gk0!N˯B+@pPZұa4ϼa^S3vcu;dS{8Tf=[ߘTZҧXOMʡ?՚ѵTy]7!"ϕv ZTetW}W3jʈ92paڣ6HH(}sA0ҝİ)r"
^
j[{J>b$	ϸ
)Zy$U;`MKc)ȟ |hü.Q%#K5(}(E
(q.<>*)BWn_ A*JAEDlE5B^~B5%vAb߽\*SNՑȻVE!vh3֒wl-th,#;Aq𗑚_镄e:^KPAQfdqn;.wm6l4^l|r)Vp9kǴzpW3dE2BYMqcVn-eB9l?w'"l=VLݩ$0S'ad_%A/-B6%gi#ӈwۚ~V3C9rdZKl%!/ok)ZolY@kHVƇE[7ꋽNjpo%=}OmHW*ՠ+f.'1DER)bNCk~aq#6o`AVU_zUEAllɟoo0K}L}BmmWģow>&uBGEmsc0XCµPTd0;Q&|i]*ObY123#bLC3COKAP%lBpUSՙ}1_qm"@ Bxήz3,aDfa5&ΦdhvӖ_q3 3捹}tŁ@dKPƬaz"-
~_1BOLE^ɳ7:},F5uն(>[Kh66<E^)~FÝFFTi0ݮ`޷Ϗey[2dyQ?`ŶFI#8}>0o0L?6۰{
y)Ű.?6qэUlv	u)Y1LG*'7X8 64OTS  yٵ&t!_>:ڸZ$$
yآ#+lq
/4М0`nm&#sHh+X!A⶟s:N-*RW)5 2.
\
r2Xo޼kQtHz)@)|KntܓaȲM^*S+/P^b̭
enc+GGK	:Tu X8QOAQ%DaZ
̍I-1M[z뽩{ߠs܉@NpL*w#3똙5df%3dg̴Yid(aۘ?h[mf"lEn7')2dx?T3*X0ׇf[TfSq+EXxBOM㦆=sFQKh~7_\hp_%ܰW+4/.J譒S`vn)7fxNv)tfUL:'&cqP3r[i7g^.ccdXl)}Z@/7s]Y-YNշ2t=K:Eg"C7,ʿ)Lŷ?[ŏƟjm-X/ˎ³`N+<P~yYe+wr;L
řԷ>n/e8)R,iikUfe?#cJn7R/ٱuъ!;t)ǭӀQk |sF1FBY.T1~?]B.YS&t*J`**]$u-5@&wj{0{q]=i	95Ci+nXa`27Oojk0?Q(Qxa%Gdgv k+f0G|P:'4s;~ds(LLfEYÛXpI\T2iOjiBFn6u7AĒ9(Hg:I:tM2+NqV&ZHf~܍1?#sn73:joo|5m}-9&	$kj<1QL:CUjf*8\arXՊє[ 5@4o4"㺡Mq>VV!ɺS2ǭ.hqOgkz
XN!`3q@_2hE:ݴhc:&ح- =TPWHYcj i}3zϚ?fu
<Y bA˭g[Ϟ9y4#G2yn<猝C퟿FVDQ2[O@	 L&DZ#fK#:g31ro|P)  df%xŐϐH9m<]`PȼN\e=2\2e!\LkJ(ͳ,) >aᇝd$
AVd,4hT`6oD@U:yhF 7KlBt_aoRojXL[P_8ӗ8fsks*eKڸ0T}ӓBm_]ufͫNz'KwwI\3</xIWx'k_{+֊jnCH*nCϞ揗КПxӊmt3{e.e~G>Wn|Nv{#E0~٠Me{|j>П7ّ}@YHN$ΐѝefMnZ;^
o X_]}[sEOTTd7MV8-40$rh.1J㱩j02z/R5eݹAzp	p.
<oUY눇g}qX'7d!:(/'yM+i)T(	nAO4*P`!HÃI]$BIb8K7V)x;H:~=$Pc۽`7n簰)!q	fmO
Nb}	HbMYrkt/1|ỿzYFIA+%\W\&;0CʒR
} b~-,h0<:0#c AlZ$& `D2m^a;0L_~GHoAr6}AA9o^rۗ}J,EA<e͛_=0	]B3hf:ҐJoƓA0<>Bl۔1Oy|m4L=lP1Cơ>ӝ$'ԼE^`G>G>',@L1^ḡF01P	!L6ЛlfsrO؆A<F=H{?3=n'1\PC~ߧ3~[jǦ	0@ǿr}J;MпoKB,aX:BO$uh#{P|`4W¤JGQkI!ųTJˤ3weCo}H0-g':ζ;5cE 18!;CX9ؕ	F}xyDޛZˋ5s3}g}axbo/ۿ"XރCS)8^NvΌ0f_f""Ԣ(X3󝶋ã`Ey"cj_!j$ޠtmM8z:PB hhlQhc6OzоﶼF;]QllVJF\NւqKHk(mO[}xlBg:Rj֟\4䀗QZ)=?d.`oʽ>u~kخr΄pW<4ɛushC?;~,ӆ>Jo
ZD>ѹ0Ĭi]!0ǺYŌR|g~Vzw]?V0ʹdU.3~&ۉ
@Z~U7g'S]^`=n9P{I?SIl*>sXPXqٚO'#mj-jk2. 'R٨;2!3]{,_x'.:i˫ͫ~ۅ@/Lŏ>ZXؾ2Ĺ
@bXCxwiluJF>^y_?.V`٦^Z5FIrQ	D6{
DLQ	5]ldEyQLxI[@`]lMRd&{2#RrT/w/̇r^77*gz NQ N˭4I[WI|IÐ*]uTLi)+B*g/IW~dWQ4擵''r+c>~iW/;-FCp<hG	25u|[{lDxh9eCɤmtbdUeER莹OYH@@ܐs+lpb0:01xQ/&T&%H25he? Z>AW|銛[gڋKWyWZULf+ب7\_Igf-\WF^gMWy	ÝfGs:N+W6<n4|zkX|0PznicZÏޚOq_pNk|"e,J`-UDÜz؄M<)LS{SpBܽywF|OPԯc..x⾺/5?_7B˻/A=r+b@ƳklဠLDa[h<)=)QaԡL%w_|4R=x6w6(=8$=욳1G@8H/;"FP9n?}ԏC'DwvmTqI76<K9sAF%BpzeA sGpqqWiصy!'"Ns@GO_V߼7!_S٬iy:Gm lxB ?T!8},$c
2Zޓ. &!CLyzzm/vg̐;^ Kd@|b+<G@44L{q,i:Ie5rxds,{#a°.1]QIH{'VOd+. Z=fOr=Ifc!6%
;]ŭb Ea#92z.24{K,Se{@ϢT :ʇPsnӪw[é,n%57D p(eN̜}:i[tt h6c~52m~:H("U4HIuu^u$lJc?%c0%WUa6=\ 8J=#0ۂ_sW^p*ƛ:2OX)뇛h$q4x%o#b..V);4Db}]RE#tAC6
q"drb@.BD^W|M/rM<B^ nlPLw1>y|97DHxBi=~1W?a'ˏ\a[t!;،i\-`hr8Q[z#lH(3*QgkҩLkgy	KĲ&ꡫ[`6ư!'4S	r˵-DnjVg'h	 ^$dsMtb;ܞBOާ@Ujp$5U/aL3MXx:d؄4?q؎iU:|>aVԎ*2u*[q_#`!/<GXh~C8خ닸~T.JQڔ}PZO~Wzj<$T[6%rCSbx	QXmj]ԃiԄGGJ^$0ъlB;4V*~kQdxmb,@",9`MxPXZ<^vD"usW!|\_ӏY[߂g?qͽndIhP4fGwǼ  [ƃn?kFFBܰolsOA 8ml,9%Moaiw)cp"$Ir>fj< |O0	=13`$7XcN'30f\'ID@"%^2}LX756_Lh'|Gt!i~zL!8kس!y1
BI?K+mjSdw.nj}
zd̆3Pyd𙃙aVGaf9|՛.P9|8wV$Avjv.ƆI[KhË=kzHM,$]ϼ Ƒ5U=)^W3>WG}Dp~n2e>Ƌm0SOĞXrDv8XOnVcL(dmh|``>HX] /{3 O$=AI&,,!=OCq yqIgB=fZ7nwgFR[Cy錌p;ɶ~b%s\VV'9}Nڽa+@|TWMʗO\J鹪i?yGAq?۹[i'|<^z5xfXpɖ߽6_xixlkkً ".f	xX$uiQ]Nht~(յ[xS/d?H x.7GٍV_'rΉ2fh=)Ǩ\Eg|n5cSYj3~BU@
My#z'xL8n!nk*jh\K4Δi]$>ӷPmW3CT*བྷ-4ofrk1&y/ygzҍM@9 T&>Rrӵ#bGkT=ꖋZb4\U-J_zq-MJؙJ~	Tˣ

/I\U&D8}KխNJ;iV3Ȳ,[J[@66EI2x]qأ2[+_)u0ez˞jVhwp;ݽj\\7bg],T<hѤqWw*TלkfMMh1iN<߲r-4Hw6B N5 z
hsoYuF!x1'^҉FfW3@|Ry*P)F&	U,_V\^$]HXPo3̳lc6j_R,!:Lzi,x"RW5oRK['z'gaQU3C-.U .S_yV.olLXYNV]omYTK*T9ӳp뛖fQ"Y>XdTaiW ڗ>$1Mכ2U$E@dBEDCj:da8 EQ⪃a6HšPeF3''A*bd|/ti5Ι1A9A7E<A =	3
)kyK&fѥ/%7\s5>!R*ZRpX;03sMعq6yҗJ{xPWa^j#sC@~0:S}Q*AHXrD}y13
Ԓcn$;rʵtTGæc9O
mVf1E¿jnV*(KP؄ѦG~ĉ=}jx2$KQj'!A YuC}LpvN2ҧ	R8yD}y9wv_JG}M|nҜ\$>HPҒQ[v+.Curb-_fSj{}L_	̄QEe:&N'̂p;WӴ9[XO5==! ԃľʱEp6&sе!q? ]}ZvZR)c?8Mz
tH')Q`!?ÎVleeYū(FT
'À0.whXz"ݧ]l 1g0E,جOYfL-c]#:Q*
hKlP=y7g iTX,k~E|"'#3uͼi<­,w:g^:0%R	ңЙx#
4EYBm#71V{վ2Prwq}Tvõ3'
?m"-aBq2Ar`fڷ*j?b$ԏ'J|nypB|_uRkXz/su_dg_*{$|X|vpr.Cr,W6
~{m\?N	@ ?s1x,Z[i1
]YfOK#OݎH&`mN NbESͫ[eQ8I<=8<~^b˙o8vuN#yp:~ƕ/?s`J{Qy>uPgԋ{.2*ά6O_YŖe&x4՚+°p҅70b-)BGa-,zlV`^ϰOaw6ٕ~Niǆ5'm~OζxM&. \Rhm|jĚiY2W\8u*ܠMϊ݄K& L|<KoSei&l8~xSÕ-P6-)$Ӈ'Hy"y'08Cę=m|'Al\6^Jߦ6^ꈾ%O[¢&$d'47>6G8>]s~}:(k㓺WlTqV|m7]ol*XJ{6>`yg =jwsDdG:^ZT|eל_Tz7e(-^QNߛme.,g0&Ｗds^`tΣ_0Nà?DnsNaޝU<[RѿqWlJ;~:)#DBB$5A砕7%MQ	>m;xvéIr_|bb;3(W[rIYayRp,S7HjE%iwXoWg-e\&B2mdxT_3ux@{Xy6A|}suwU =87;z7t=NAt VY}&wXz1{Nl/N#u*:qu%'9QwEN'.,LG('rXAbX$},^FoY1hC`/`eѹ:M٨tA}	q9o~G/C9QvәzĔ&z ܘru[J.Jĩ5JRVJ[^%f0RzQ%] 53:)i:iVvAmꪈ3^U6
  auuUةm5bms|.S<o&2LK:>~n[O@_(kB*SzL>_[-vϦ<5_/`Ў㡎 PC}BZA߇XrjnrI9&CӚz%ch_INSZ`b^LfQ)	A7	Qڍ*S'Jl'*Cy:)"zpzdo+}új*Y6Ֆٰ! Z}s ޼$8k	B̛s,RTtғN8czbYaiuKZ9+9L>QoU.:_p[q#
Od<⽎tVh85ȀfMܟEֆtCYX檟{wr\{cҮ'Ѯ GX+Wշ->vJo:H{1gr}R<WQnurrBki9ĆgUfM͏to66XR{iGD>ElxƗA`6?a^)V*9V[N'Oz<KY/{<kw!!!ZkZƔ޲*v7,zxa1x14A^#l#=)Oӳ7͔JQVYJqٵ`utk%~im$bE+ѢFz]xS pPؔ-p6@`u5neFQܷa'E{<TVmb:Wj̸؆"n!xkYWRv{qdԤFW[˩3$[+x7Xy&Qfwb`UZD6C"%%Q޸ה{>~҆+C?z}	BBB<60/VgcuKd$چsZ$F>R9I247lCV޴|Wig__	"08f:nHL+Ɗ7S$
좵R<Ͱ6>]'wޑ\˙v+&(v/s,=y
אW)<^']s}}piN.ٰ)V ,BҳgnHKiT.RSML@]-iaʄ!8lM@3|e:wx:]dm\:f*|9ⅅ "%CM$O!lh	UM?5}
PXO+Eiap8*< 5MF'svemٝaZFQSf9;
n+~5' ߏs8锾:bXeyTF!:ºa:;5^ʃdx4:sob>O7+Oaϰkͭqљ
vc9/WV~ 'z~G^l}Am!$ߠ_1,)/:Y,0msr<3<C]x4vO?ׂZo'ן>@Z:4?4Z5⍟PNa>9KCLmLLȆH660{xv95?8  31KMkgI82x5oD0ʌp
_Z3M0 $ t0)xGS-JO1.PS<E+`%Wi ?r Ќ"z=.!!erwqyL٬#A>Ŵ`	ߌe"gG>Yp~?h__^\v >EkT[朳5Y0;=QFH[9;cxOBs0B*;J[&$caф	( ahֽ1?jO|dS*.:HA N̝=+KffzB')/KF35v|[*<gDTiJMDGt?
SE``EhULJO\I3,fr٪> z6R?S.Q(}։&u=,Za%sڹ㜳Qe8 r2zSÌpy@
}uyrTcެA߁ 0 !#B[ejoY&\ *7I4VӶԬLCQQ$j/fk5{gx#lOvCd٫gu˸URy~齹}==/pp]a<  lO]/~9B2(EtN%lp}t!]#>2 +tGHYy̹	űXEC@EW]]wu_5o(TX;mƓ,8}'o O?<ՔYk?|57R;^~|6_xAϷ
wgӽpҳ+>XkȷNcY?z/'ǆf|IȪน!h2%QI Y[gWa8GQ>'aA4qWȕC:
?&(>'ZJw&t6N KgO%K՝$<(M3CJz;Iqh!P
ZH:y0;84v48IfΛI	}A!d~Qh}OýzWxRZZ8%)ނRa Y zڛu ڨxݲҰBwb>n£$R:><:`U0R0#?=A)HUe\@ƪvoo{,4-$8ڇǗGsLfv[_ّ-^`䶫A3yB<k֋SdeEODB@?0ũO=\ I9G)[0Z5C^^{5fR{o54R"Z!uj?=  ,8h޵N۸wi/g z1=N{xۭ,Uz'ތ`aZ=UP-#@5հaˣ+ϏpYێ<P0Xc2%½x2g\g?wx؊
/=ˌ8aa>FS Y= 56[<Fq7ģOEjr|txbnEc}(XECj/>	EC3ƘKMFр9)35$}G\*WӪ#9ɫ[ʹ TB*K2*D ZԓI`E'lZ4~ԋeP]ռ%QӕJVq*+94gʷo߂M./j{]д,Ñ|8'_Gq>+}i_@>yl@Z ,P/"Hf}̫.EF=ugyfE="
AHC#)8_+3YFc$#p*	$3<WE<y,㩠Ogu6b(FP)p,u\5^>-Af j&BǓ"H|~ܛN_TԘ70d 5 .6jMS2ȃTسNw	CŸo#Auh8Zp7e{) UK2>ƿ)eөM9yj[	'Mb8C}Y!͑96쀪tk fB`"zPY{bbAώ4^oJ@58ބB`q<9:nn=);xӄAՂõS~i9BbSwusGNQ̊RxyT*ZJg(>TВ*{ZB~5!K	EFJ=mz6!~{rqtGGdY]gI<HrWڋC5'}؎;sIJ74`\og[LiCzsA<P`mߠaU%
uz]%o14
(M[md_.^9F\RA~kVhX	wSN[b*]ϜB)!yC&%#UJy)ԫWQ"(Ѝ~Vx @=]ogaܥ1]~!U4Ff 6Jx踟nGeZ6[ہзnL=>tZ2.wV3$qR = 5<`)rkO,KdXh1zL`jBgW !'7sVx"DHpܼek2pzSP>ƃPXFw8ir)N|rku)(zq(ٽ]L "-7È5ض:)Ҝ^jo5NPئ⑓H",Dܲjщ/6.U&6c[+* k"eh)UG6_	"E|ڵhnB:I9t&l͛Ⱪ^Jl^%r+wLTAs1[C<<wDcX9S\5(c5Za<x#&qv~f"4sSUĎ,H5[#a_ﵖ-zcY(g7H*v\k{'G6-W)k4m@[&y	a!sYUa_/'$&7<ė't~ԕDH=ǒv-ͧ}pc]:v`s<-Ѿ۰Q<bV ս<?@l]8.SAFԈ~MqZ)0K7@
쓆&#N^+]zrK*N
ch+8#s,yƝӫ#0.֧0X/y]'GGtÓ/4}*UU	G(1|:Ad/4E
t3&~f]훕W5Zʖ7vܠ=y@@yw`5k@cl;j^;!|$gkt܍`-ĤQ|o)D b@#QobXx[ûkD&67t5XL,
{64^eý+w°'Vksm[tnטDCǣs:"+dUp()*نjAo -7Q ӣPfA70ߴy"lԂfv&\_xַ9b!Ɩ;%Z#D4c@92ǦJ*^3mirأ5%**Z-pTCPL#vddIVe-3c:%gjp Z! ٔCҎR6	fAO.pL`PwL?FĆcp=|w+¡d<T\HM'U^n5,čժά7糁/ex`1Qldٕ4;A/Nf'q/ld2Hykv,#@#Ibj<lvĥNrGx/ČrbzsNCEQehDd*%)Y'5sS5kӸūtws\9Joj{ҒZ lSa`a ͥ@['hך2\++ܕ7VmWe%2nc2\$;ĒIvZ'[:vo{2G}åo滇#жC)m|u5-o 	wgg61x(AI|t)bWB4ϣye.%8zo̠PB?ݍz#/
G,ԃ#}HTL6)*xBH;[g=`CF%uj*~\|QsW]x3.,T !2@Ǒy? )[.Ѹ_须e ,]KrKt\ uA~>^:[}OigYK;	^pwC}%-Z\h`ѹ>(xYQccO9Iם}l4OxW@ʭ,+!CحƷO=^sgBo`0sхcR(ɏZn(@7nx@pfo]8Ly萫%wlVzH[Ogl6wc6AejQ\bo7ۨGP{B%
qrހ
^<yb9+re+RpN_0Çǁe|8oz o*އN
')SˎL]][MzktVR7jifej3]g`Q̿EwabrL`v4MSf${Qf#=E2s",(ؔ;%fn		Z|I'ke,&TQQ'6wk9ֶVD<ldq!ME|+zTR!c S\xM\~zKi}ѺIQ`5uRm(ra֗޶.v{+f͙8[3-~$֩e9C!u͆Ne3>oYl[mLW0.hΨq	 CUԔ1!w[ug tM%:"/1ŏzC7,ƀe8%d60Eintf锘
ŮǐcX'̕?򾶌eŴ^AM6%/9SkG6ﮙi2)B,˰jŊ]fh Jvbd2.NN/N/Ox(fd!e7]"SN)8؃bRx|dQЭwQN`9sj'-$^"w7gVݘ5><̲nwyr߻:k/+67NJ%6_à[l	c`Lޅ&z<bBL4+$?z?Rns+qs};prdյrO0%ml+m^̢j<czpϝʮ-z+#RđG*IU.';WGU/}ek,\m[hv^SR6S:R:n;"ΚÌܝjb( T4qH%c@j^J4'A7!EĮ<HWӻٵ%'Omz񮎼1i[D!SfKvDPZ+9*ʅ#t$wt7!ʸyqЛ	 V9A-U	ȍm7JGVrg4}J_aӧ%]eViyTv	,}SƐ
B`股# akBjf39GEPλ
i<3%s#3\-@8><9<<by\qu=}N>9fRB(@xCD@3SA(A
O*e?<8CJp0F,1<1SqcE"}TVGo; 5)ܮsB4vcȈp>EeSDAtv0UMLE*šs鷑' }&	%>rH64BgtO#SOo 4e (
*3a+<Mh~!-x{(bY03UOn@<:{|.HbOAo|')	m
GH 
fdÕ$%ǧݬ; o"b*ɹ~'rshIuJ>0{hDɡ%8P*zz{tn(;%~]n(4WP0[^'l6D,-C{9رU@Ar-*Ówuy ǆc3/2f`p1e%TF˳֋>A[SêVxo%7_lҕjťT{x]eKUs[󿬨o=^EQse VrkXͲce. J`}jGF< ћa; 2 ,N#ztEΦ*`hBh]	i
.LP; [VP&5ڐ9yF#@{s	"K |LI$/;K_a$[!(Bl\~k"yfk%a9vX\97|~# AŇ{xY3jok0XHx&tx:z8Z"|:cAvV
}x=P#,5C2~{́c&A2Pq6VT7՚|ZTUR$BViV`|-C}p校a
4# &)sZH';(<hDNuZWQ[T;2=2}uq/&(l*F<PE"1-M1DbKǃX1%<gL6,RUjs>W StP|-K|rz
߷΍uO.z~ITO|WuY﷿AlF3wpBn!T&VSqUx|h7I'CSH Ƶ BMe1c@{t$`i95~IeaȘڕ(&+c<I,I}gq k#(f%qяr$Cs`̎jKj}`cރ{_!zCo>SK\]f\UѮeqZO3}8/ΫvyRT?.u"_E&F?r3/]JH${\)2MnΪ` ԜT0F܄lVW61p<_{oNUٻ:}W"e3ب:AlZrf
O> ^UҪ)<=ɝ Jʴ$y큷8Bs]S*`oJ.ҽ<`
	<Bc6Jb#37ChgŹ6ُ E|;ADQt0_O&]1l8$4
|[z>9f!ܐ߰RKXX
"I=5o\,s*	L-.An6AH5ժQ͊#>
@0iLwՠ &Eh9 ֚چ7@ـ|٩xT]{q@?rɯ z^;R!cY+oց,u<# zJ:%>?E<dbVgQ@vjhҬU h3J!5vG=>FAS캇ẅטm	)Gد7dXS+{rkcJTL/G^L;# '3z^7s%iyqTF|TW5Ug2!IxE}4̑Ki#7o70o7}TuCngN%q~|:<qΓ5P3
Np!hg#4y)84a<1bRShIqdܣ`h0uA1+^ׯKlR#Nxɨjx9#MwtHck8hB0ͣm_HYGhZ"IP2H_S9:fFJTt2ӑKhGAFyٖ̘K,6"3b%4 Bm+<XNdh(n>؇lk~$D9Dq8LNBED49X$Xs/O1N|K&$;"S tDa%ɧ8LPU`]7j`d&^#O!dD5cgJ
lz
9Ő.1
vtKeٗd0Dj-1+ ~C]\lvsHsNVRX[oamЀ <cd^	i=6 {+8lTi9FP$ֿ~jv|&{HQ@i3@i˚i4X[]j
Yo& ۺP}Epw!ruL!\FԂMa	-iI&Է`ũd+MiaT;%gYGݨh_aH擵']FsiFFϗ_c[G@Omc9#Wb	?x3a_M*\M~fiī:ͬ#YdU\oPCMO̼M?uoJ9<jZAIO7>>W=TTR}[h{iQe	$<OxWF6/[Yc`IdYPQN&^5Q v?Ĥ5`] 6UF8G=w0iX7w{)(Vfln$.mf0,PGxbTBЛzu]. 92-poUvzOi%|Zץ0(r1|ko9}B͟Q-e6ETQPS3n򒺗Ҙ7fp:p@AP޾πx%0ہ>z_w#	5ve82e-[lqq&DG֝nOگ2cWWUMR'	$dvb4! '|xG#\Kw>yIRd.X9FN%OʁY2O	d6l9k?'G
&Y>n]GK*y܅G*pǕ1GZsclYqŐqUB=|ׄbXJ8,U܇Y]~HhkOǠ'H[`&ALOQԴaо؃,{x9o1g A헛s:G;C*Zj֐5̼2,V)$$._"a΂rueBbNC(}zh)bZ%aBیd0[1 $(TqmDW1p]D?~FٚjB6C(x04Ϋ҉@8-i_'nnWm5!?e
k2"0[Y95g7\DAd8B*4F
^8 +=D|]f|1#4
6nt`$gLF҈QDlv
q0q܃frT2$`:,t?!m!4DLYF.!^<'Hj5Y[jB)i1,YP: (lj3C#=Rm78J&A.FĲ-ǃ	(\Dh|<t$\&U/Lӫs4D .:^2kxK,&<O-{a3pL<}@3sA1W M`bĤY8!#l8Bfμo/LZBp|*- ɯ)]^ˮb@5>m
A,%\v&<:xdi榛wp̭sZI簟t)#B1YGoal*ݢ;E,kI䚂NLtP<9(.J@){~No)<iC^8l$'>>Eјm7YbFv"ñ X&Vy!2="wn,Ed^3 æ
B5,*XI40vTl	=ƬEt*Ȇn#VBE񳴬Kں#Xyfc"e8f۽Lr*kg)H҉QĺKZ7ښ]G
qy Yt_j# D.zJ;<9V9
<	x<)QP@!6tҕ<}Pt21AY= 5g^H҆FaLL4f#z1RxF"O^{*h	)(f_JEaXoAZdPes,$WdH R݆8|WuS49 _Nm6f`NGAx/p1YYW2[Ą Lɽl =žq`Jq8%@{k Bzmp^P{/I3"o` QSȽd3$;dM&|!
@0}LX	RФiA*'gGUfOiEy&7?qp=**HL>u82qND<ɜV^7ɐY:XI/|.\nF3PN0K6:c˧]
M1FuLhT{/js*dU0,TPZ.Pp+Cls	')wT6*/l Lݖ.6ѺI	osb=3el#2;C(?|!
8ydcpU0MCPM = MRS{1?:D.)5jsJ2qJ՛t^[:u\mh\ʵY5656ݙڭRKAM|-4=?/jnPHjB
\컌Ua--J[HI&tkJ؂VuSu7sqv̯Fƣ@'䣀Aɉ-Pe]d`,RX`;e&IțO}$|J	WgY. UHchש leco/ziI:!8Eq_dWk[5?#_FGQ}FD<#
H)șG^4HQ`Y3
kphTckX
}$B5bvffhLM1Ě͉qB9^8֌<VJ!haC
2e5q g@XhϭK&EH|}Tܣ|*kC"4	ߵ|yFm@ԃX]]U>t;'D2e	kz.Z1'^fwϱlp vW7RlK+-m!_rB%>'~ͦeOĥ}3`ڡ6k7̊<%=nCitc]tzXɿ3B-M|i)*Dދ7V$ssK>=]lGl3V'hh^uѰ̭GIM"[BM]t8Ӎۙ}ky tzw1%.,i!ux<_-]y{_ aNޱrD*Wy/\|brk,ݭZU6 `K=&dnzЄq` K#Θ;R 6d]r(p?.E`kFr!='Jfh$CUL=VVq^%wkDWn b7JPn5 YMxTF:ebBk~j@4̆bh{ 7*ZV1t4/,Fd8:PJOuQ=n:W BǏآl5purqzNoAQI͜`H243twFFt \~J	Z;Iy`^WujhEG]]_]UH&>%AҪCDR-WS(vda0KB@<4(i0rN;	и45yW.q
rlyTN~^)# ¸3́47pÄO#H6Ȃ}{jGMTyyyAoS qӾ8Gde6r]<	G5@]3ŗpbm~ի][_vm
ggSȫ+REyŜِ"StɚFAE^Q	NO8ܙz=Kms1vEjCkD<<3L(gx-Dr&*85뚟ٳԽ.ف;zQr*Qp7!C}I wr&{_%+ήҼjH9KO(dV!	ݱAg]B>U{l&@o
Z@WIߣ:8΃>.N(O3;Bd,M]^ֺߓdTϷI
4#wȮP}p"r^}CuP0?y_,>?@֒_E~`|E0(b{P"5`\(!>	l'K?1)toa0{M1;g5K`#	03\H_t,dnFP&b3 u̳iN0%}?*XOzɔ}S l0A34+,4$<#t2EW1%1%TGmJV{!]l0>Ǚ
x#>= yz `H!fy-gAG'`-8>);FbIy}Vh,TNg*H	SqngqK%۬$ۦ/nrI	E{6pAM+ol1?23oJ ޔ@lCc
T):%,P>ԹGR[?=\ZN¾${q8!>1酴417Ĺ-9'Z1ZGZ+Դ/I.FBn^ûzZ,$XEp*E4sNczdG7ZtFdp\WVXԾF7Z4+żYAYrz q*݄L(9g;l2d^FӊwN@찎:9HkfHaFlE,&aQ'>HR6M.g<	(@>&:?&&7-U"=k1 מBP(Ժ
i|Xy"3 ̩~Qغ(*F,	 g:v<z0Gm}`ʁ89BKPmiF].h.Uƒ.V3?jHemȷD0 ?]7g8<&F#{|#8釢{m2!pͦmE$sYnboٙӡQô"iRj9B[ OGu[O%0	a" ~2/ם[2=A}](>/UL$Fz`vgl$mb,{p0o 3dpA6($ʭ\^PzWX(hw''D ⡛LnD4CG(bR4h6'PF·0:NduJYdA>?⑻bM*eӃAxZWin| 9ZX]1S%||Q@:^*k+S:'vW{5]wʼKCb{Nb]+[U&94Wo*'df
E/`y$+{xRGN_B;N.W$7%wYCFovv#۾m1K4<\Ǘ?_Rm&~x|8$-iiˈcVfĞ=+pd!l,,Ӫk+`h?@0V'R^"E$$Y0=e@^V<"ZǣfQGX4	SQI6_)4wH#2) +*Gʆk5W&{cB'cQ\\<R7Y)}(:_Eab.>ȳ2dnAr1?X2	y\,Q*`#{Iģ4v#pК`t2gD63)
MP'/_`0;uhK&㩲	EӉ[\K^sr;i,ԭa:n:N=B#E','[.A:	zh[iQ3,GҁaP}`#hϠ{kM+(=M9X&t!J޶$Fh1G#JFh .3SN}'/f@4X0,dwG:h?=LŵĜ%Et*Y`w[7C2VqlJ9T<46+<=_1g?i*g$N*G4LR$8g
ׇ$KѤy;opQ`ɟ}{]-SCP1HePe yd0/ധwqrpǏ1Rr$+޷|irD#gSJ@'IHWH(Qi-;PKt_nčQ>Hv_ua:*EἎU>n]&ݚL>MlBݸ`"Au:nknHquk9Z&uS8L߽\克+L'勞ԁ',QBh<jsB.*k1[
 *ݙ5eb/qFb?Dn0oŘW4DO^P)[yOszriM1Z%զU{ojԨvWe!CÒ6]}jIQ ^Ò2L0I̾vmkr1UkCt848[%r5|V#pr?&U1$_O1A	pQGd	e)U@q7k#NV#EjuvHj$M1nyH.#CFpt@ًnO"J5	~m,m\5ׅ}h3dɹN1ſ!oq=6f"wfMC䆧zhbЙ	Va*<<@Y<jPqv7NZpQRp{3LTK>*"܅?J8U%@uk<BA1\+),]s9JH!tQQsh<dݠ[-
H'j8hN|nթbl$/ৃv 
4,ϰT!qvCSUثQoxbC)I"p5t?LǾA̻@#xzAabWXS͜
Qj|%}ލ)R}SyrPQTt:Kj] M/J^6^JHhdWJyϒ*%K9Ev	\}3	!JD$w,"MPN?ʆ-`S{@8u%t/36n̹}DlrW
luИ"u 4hVд*~QU/|I˝![6z$2Aj7v66d0BsrF1d)D㟁< NjSg!&Qޥ&q :a:nIJ-Pv uPFcٻ޼*a7Y-CW9]!b;;^Sa0K1>緈J*یn/EZMFAlC 2Uٱ%^읅-@ql7F
Z2o0p4pt*̶W
1/g%i(,q$ʨ?(#nug͐;q\'
>|V
=`Ds_=OQԚ(K,3
[ȷ |
FF񥫐plRz"{.ް'KS^.tDm3eד:Ycݵӓ{ưd=R(g5o<`7gz*Qtv$zM@Qe=52j!*J<܈>ĽUx.tqA|PͰm5	-ԋ; m`4dh81et9Hѝ!]ݩBh:;oa< $@G*(r.Ҽ<Bj( '&tMJS~FI鐫N|p{.8RyfwV4UjgGL-wNRLG	{3)!9^y`?ͦU(Ԕ&d/y?˹Ţ`T&a$ٌz0-M$J@0tcnøRv'm(2=
(,XqDMMi56 m#;IUp7=h+aTP)QTe=gAˇQdB(qYbUgՂej-k3n#IES3zZ6'LD!03ERp!o0x+h5\)S׀N*
s}.N	z,])|ofپ#I<k|j v8erIA֤7͍HEե0lSFfeSISXD]kj[쒳HPylZJz<9%8i7KKbr}-p
lVΑAnU^C[8h^T=Sp G[
Iy9v5~G`{.G5s9ء${oPH^jn:&,aEWxG9ɤAL1z]m4[Ւ3skӝ/ 랐*w*}hN_J/Ύ-4"SY*ǢނQ[Y(cBOEw;#'F{|rC^kT#I_;u|s\uBWy4<$>3: b%k5ex
g5o^DΟMh)R\9G`Rv3Lumq!l$W۾А̭ܷ9yޕtMHbz/zRD`ƑғNqψd=S<( yx-4}s3"!<M阝(FC[!p~j3"Nے{2^to><"{;^<v,bc+(hO
,bԺ#N;ѪW1<d)&Ic1vieXoB-ϵJyfF[(	of	wSB6`q8w>H
xru-TFaj=H{zYVT-B!əEu-`	gr9? 8Ad:䒢V(B+EP8*#c	r+.ٽ1}׹c~xt([D.Et)$"4k\a9V碷
}Շ%G|Z^˄M\7Es/UT9+H'^>hi.rTM-͟
ar[BNbE<ڍk#pU7zC}P0:+ mf#M7T	{RU C_xNx
m]<}}mdqBrgT#tr&W" mr;N3$!6	1ǔ=G#IކΝD&S;fjy)Reg_`B젃M=)c҈{vO?ͧJZOVɎ5	_ѭAS֢9w	Aof)y+WO7d=KbH8M1L1j~%CΌR̓YVdx7dsj:v[P1g}/HV"ǸެKRB⅞EddFY	NG8uj,D__pf0.=с4sa<EsmCh~-K͓kRG0^n	AR4ʘD膆of)C_%Lfr%⺆ŝ״`ʬP}vQf_L×Hɉd'[G<X"D_GiʺEu$9tZeViKr
Q
O]R7h6~>7Cˢ>͏p~Q|5"7<rȟ͏|
,s5d]3_Q{)afYCɤ f@
S8Ɵp)=!ݜ&gO}]l 1ao
JQU4Gjz~ǪfAqyFz!\!ze͌?'~[2mX9Gf
W eqM%`Nx%ɽK/BU=c؃mR]5:Fw:tϡל26a?d<]d܈ i`:,3_-(ۿʀNִ?	HcH<ͿЌp0&'\4CIʅY~b"kCtomm;NE}P
U@QVmٮ1Ws"K]_̎E,Z{luo u&_ІZS7Td`Rs-}~Ž"˛b/~+CxS=D3;BGH(>`r?F-vPc	@E"z:U*RhQM V_@qNj
`1+;a,y12IOqhg,'0t9Px'HD9la6ﶶ_Rq[L"^~:>n!#w)cIHDlPxa@J}I")3p360[fXTIe.Z+7| vwxYJ(gH๐L%p!'6{18XBXgT=s8C|(
N|8Nh*f ~Z8}LdJi%w<T>Y$&+ljW#WØA{';ۋw'XovW*3Yr6yQAЧ菔z=	#ѫ|5rH@{'u|kk~xUb"-}3РJWVJrc&C}Ye:}j]+-[j\ŲL!LE:YY!r![J\CYޚT:AQ@i4:ِ	Epmǅ D%/iGKųSQEVYZD f4+*uQ6ߦ EGg(Ko\~3M8{ UcrUv#FqI$"M!80zwd6M cF
Vb ּC"v{n>7pR춷ov3oXܳ'z'9z?>a!;+p+ٟ'Zn`|-B-(ǅ@goR?W)䃫Q8}+:pmbףdՓĂBVcTFX1b.[ͯ~B\ǲPtDw'tst'
\Qv݅0*^n-t"NSDKZCf1p)#/y7N,gLANikDB<T<6@U;\{M])FUwF`HK246Th貑P$5@C֣PffH
Zw\=# yL/Өmy0b.I!*<=QFŖPk84y<f r\Z>$Vȿ D3Ũ[3_-x,eZ[XrLMXLPC%vH
rC_%tC
b1*g.'v@x)SgEWH(A Pd@ \Ȓ=@ =JB:n4B/QcÌ5cT 8u>GŃAdJr% !s`ȉ3YVDIBB|Zsp(^݊q8̬?{b*%rXAtM-BZʰ\n_Sd)iA<k6ȠX<28C02a'lM\t#Oۣ]zh36{xо<88Y	ߒ5t,!gGg/ˍIPO3:nYjh-By=_Ԧv>UW7,m@A$iJNpR+oy a}}^F_ZOo<Ϳ44p%r,t=97x[9cKZ̎apt/PGGŔ4VcIfȳg,iM|15I3kOf2fջ+v́
v*Bzm'~ 3p8gzkby2ԩU6Qiaܼ>Ēj0'î_x|5zhx,+^GMyKB?ٔ9r'
EP	PMK~C@qtС8kf ә_NB/ƶp𶠈ղjI'5dQHdKins(6j"q6<l%`)0C^r@1gSĤ,y*C;|1+Iχ/HMrrQLO<GTׇ:-J:G ]tO"hyn@s5Vѻr{iSۦE͛K0'#UKIieğ2_\ Py(3$3'8eU gч[S bBӄ"ՌiX̤q-YyT('3X4`Z	7J%T!"/] \ncq+b:dM}N477eo>Aٸ~zO.Η@+Îof6%g2߉SYSfүELߡ A͒u: ]~g6wA۫A}ZץJ`nZB (˟?跓*@#)=Ԅ? ]](7`
+cx'dVQ^,Ʌ>bCk_>|[7eRעJ*V#zdm`>A@@ƅ@\+fH~
ȨV J Y-mߖ-s-"+13(?@xr֧A6*ť$q T8\FPw`C<ӞLFY 6CY|VTId &#"GN>٧ٕ<3oȃy
<YO;xq2}\CsO=@XP7%ߠ_,rd>!Jn?ڟja67> ANoh%փ?$gZC%> 2vbhxMdDe<x9xI
?/KuϭP6ETZ92ff{A;0<_bcjJۮs8i!ZVGKn	.ЂR5*ś"UVn"S&b \NJq4Y[z]s?Dkv
\l5FmANoxZf$r$=޵OGyhr;t91ռZ:6be"XT^}yv0lbӒ}ð}J4[D?j*?[1;IGIVBuJH`A.7U
R0<t0s8l$5rOx4o(=8Z6?xkuNٟлX7AoѤ&hY5ZPɰD8"{y:Or@ƝYVZ*gohJq1bxeK锂N+ʆuVLTT%}?kKhE7l-WDԉclfS".M*sv<r.S͹F#i+dN?+tҫ}!l'tH7@)0=ᆁZXr5C֖3[
c^Qv4W` ȑ% 8S' )ZRȔh«^0kt~@<$9dl.n,#dNP)5V'0QR ]³ԙv`uClpm}U8]ԓP.pfe8zFXº:ކzӐրaX}s6MC)cӫ^ٔ+<%~4:D)Ҽf
9:ҍői'_ԂZPrGsw%fקbA')`AFBkpy5<oXM2`^6smGS53al.C-6Y,`,{k9WJ̹G5i:n8~2vCTy ꦢ8@L=AEi;"qg]0`0a.kqb"|ĥ)t>õ$2B{N^aN_{qY_H?m0ܽ@AVFӓ˧U-T_YpPo|4EE6JBYUHAiمf-`˷Ey:gH5xCn0D:ӘZ/&HCl圡Y+?LaMXH~Eܮ8[
Ƿp0BI.<ۜp\ɚ1OP-&d^%̬'>@xc1N-hJubՐyc&Vׅݘbe2(p&L ̃}֎=T^.nY>Lk	!W&ݦF*'y~0ko߆_fkl,.滣$Np0?'(sGcLZ!R穒fY{~OL<K~mcccnQЮA)ZI9HtYK (CRpI@Hao"h 68}4ҵ4ZXO^-Vpyந >`hf?s`UYatO	7yҔyPׁ 7	 AksI:P "ǖٰk"G)jNEQST(i)Hѣ:(jI#sP^Nbo*v~w|o?ǡ-RSWWEcs'&-0\_\0=j=~,7'OvӛjxؕBS}A78w<9=W2meK][z
(ķN"\.g%DNɒEd-+VP»9 m\ku=WpvlE 2>|ù;@fۋL`Q"M\ ABN3%,Eu\$S|o5}/\EˁI:7-
NZ*PՇX=쓒~
5ɛ&HRلGצW@=uXJ)j=u{ic͂wm^xBf0>%a΅^*,-	Ƞj#8j3bu~O?ۢ39InfIh,ȁFYk0Ngd^2Ʉj`75Ryqt	y)WyY,BgT1g^|Ǚ\Й^ hdLnzpL EGduk^UöXsngc}']%PaX=GJ2/Z=)y:rjG7f^V~ 7(RMxtdL-:Q5=FqFN06 "+q2KIHxTr5HKWt(kmX*/ߛ{enXvWH	7}Y#	2 @YPs-gUܖ*K}@ds7V*N00&;PS	@n'p2H*.\wqzkݐ1{XTREIkz*߲5j)y(֫;yr^5pGW;UWս|Tľ-ꋗlU
((iEfSmq	ĩK?XVL`R %:;u|[(y\hV@Wn*A+A,H̤<aN{27<`C(lQlai_
Tb2sM)[^r=J.xyV	wT~=`fX8ڟY]=bECujn<3#ɗq(UV&1s1^	Y{.dsl$$ܠUXBLdujRM!A$w)+;aIn0^8 75eBVpˤ4@y9WX<ٯ2_h"vB#A#Aw]O+'FRMs ^'WT-;*]䥌N6$a8 溾\%M'7fz0$,櫘+`[]])Ia=tmE"ss}	]
Xzf}).*~b {Jɂ̛U}۷neVǐK}Y3u^o:"9~~$O^$vIgjH91и6e1@"5Ժ z-3눦4}.Zfu.z=꠩y>Z~\;ʨ/[Ifb)%]R/ra1kݒ><Pl<6MD)ya+" 9,>plQlαX.M}ayhja3<v΍Wq"Lo&6yR׌cKJ7\?Mx3R8&u]2@q͑f:pι*E$^Cw4z,Dpc©;Q9hT+#ѽRzaw4Gt(.HneEGYL`Nؼ}_o,`n2phk/eu(á$S0lveh姃HE*d%!}jf' i֊@3AWXOP߭A邪ݽC`z
UI$aiK\21,Ҩ.';@<Fy%}{8%dX`׽'ߢIW_8T@-)|pAq|+Zt!E:0"()m8+}bհspmuH#O#)JKp'QqX^id5Zk>xP5v3~;J|;"db-kHR,e{|>
[9e5^8H1]'R
PQ3W?\O/w9 B=%;.i词G ̙N|-	ȎZG2 FH8L1m82SE\]	.vb_6lX3I"Q%|%+bO]t!m5ꝛ*NX.ǔzecqp+p"50\'3Zb#!va?~Ʊrݞr͝ͫ:EY1>^k^E{*!!oV5kM7VR@먷hPԍb[lW[Ү`{ǫEYz#PRd|<F'	{EMAͦ&p7z`h$}59Gh۪dԉ]db8ümG]o-&Oi z nJxJɩWִpH|^=ߨP?<310",b}T翸Y{3*J[a5aЙA:3*`ㄏ2@X[z)MȾEa:	$Oaj)YL?spZS5$9
@4@v:0jjcκ9GDxF
>Rom #6OxZ*1K;ޠ8g`O!6qחr%]^f)jy񇝭V<}yjWq4C'x=n|u|:CkCNE-v8qS(`3gxDR٣4WpRЛ
0Weh*)2xcqق4NT!U/ٲ܈ӆJ~ɒyYQ0MA~uhj'UE>ZEi)~cR>;) a<4lY@|"4w9bYuٳ{o,U1\QFAznP=Mf7c\U.-khM..cl#-	6!Cf>E$17cwIEwRFXaYRsc7Һyk6Eχޗk9+Rjo'^9L"t)P{hQ@F{$/r\:D$ժ \Uss͡X_͉6Wt/EQhKh?=psq/~ˉG)ʦتk''?`6BmlQOr=``T0 DC3H`LAH/#T
MDwaաԖ\!js1Ae}F'#fqd/A5_WhBώaOh;Vh$M\;ZѼ|k%nfTsR l}*iurS1Κ֋Mc?<N'PHT3*DDD>MZ@?6#gq\)!|Hx( <?wp04?W-HŝK êE,Z˴qu롣%}~(XA2=ze=J2$C	^Kb<I@
2hOHV洃K aa_L+O4C3y_1WFgxDH8vhh/ph)*H%d`-\|%%dZ)NKyA-Ē}0$]{LRNIemGgt	*$L/Ð\bQak<d"Il|_[HxI(Av>VƓ5&͍-xܶ47^- d_?aݍV
&G-8 LFjت[~H{Rmn3D?6WmqF4Cia|D3-1VgcJD7С9MXͩy)>tw|W,'[гQDRr/N?./ACVg? 5by?9mz|UZD8ze^aT>j>\eP{mHOMG]-?ߌ^ 5<cjA|N<hGHdx`CYՂ:TRL:E3t!Z[O1xܠw) Qf FRj
-i؏<C*$CC?K=@=毉l<%՝`kj{륇lxO.Z_Nv%5VdΔq p2KG9P|0X E)
T!A:N1]f&	ʓ\I,D즛Iz(.yO{gWtqJ	gZ|ns8Л1P,D#N:.K$TJt/Na(i
;s͵ӌAJ&V̇
Tx\2{@')X-azq+f]Vd<H`js yu7**ʆ#%Kctd3Ƌ!rDlRDBG⳺AXǑp8G=LTT4

`-T#سF<e<ey5(eҙv3[|LՋ	< 5YhjQj21AZO7ק/rĠuG^dX5PKrInGDv_C/twf qcjه.M$nE
#N	 |5 -r=#oX)rJj*xwS4II_5+}E;!Zm>v-#^堃>%\B(E`JDffdzh4< 
0]w0j%٘ݒ1}Ox_\ZsH[S}LYק\@=\UL"y ؏z8F`)4wY°aYSJcvɐ/jF o# kY*k+"AY ^ZXϽ!snjHgn[1νgMN_إ\<STV3aA~HPtY
їSĪiDT|pH._LM>,<ݡL،$^QcX!
7G
/82qY)\=-ɡ<,(.p83=+dÁ
XTyU vto^@,>$JsdTHW)P}8=>	%*[@l<}Xm<rv )Mᚹ|/D֑gf L=5ttʈEH;3&=A;O-%_3?(
{dE2%+ i#j?6hP0oL+;!;}gw54TXwrzѾ<n@E;(l)`@dRX|+fosC K<E%6Ρ3XMO%2#n+'_3b?kt̢xN.^7 3*lZ@NKpnTR1ӝ9hNkaɑ WH w7D湔()'[;U0lj[
"a[l˹5°>:Pdc~X᥂ u!r5{=srv;
Ѵ}YTY,PD3	e(sK509u;
prɰVMzidN
t61TȂE$
HqF3wwٰ:c<".o.J%j5P#Pt"'7U7Cxdal˘Ta7̖H'y:NF-^f*&ľi1ַsD۾'RI)-ݐ|c=+ıu1!9T`/1+^ZOoq[Ca.TukrQ.f8n7P6#A??>j>Y{_1e,k5lujм#doQs\Iҙ+X/^=<i2(ϐ9S4IjFb(q}x$3-~3NɶWo<0㝙eճz\2 3H$H"fvG;ݽ
(P,N4MA2$*2L{f
2:!7(2MUR,&f`,Q-2DHRtϼ{.ce|fson9`RZ{A+c>Fbh}U_o4z	@}穓$SH[ayeǬbiu7xTAH[J5xyװjO)k3H@L]${ca#,VWI45ȭY_Fhl'J$S[z+0I n
,
wUjDe%ONϏ[GA\a	g{Kee;a.&b/ۼ%ZE^óJ~.ZA NdX )64å#(IV*R:I5u2<Kd9	繜P9 YtYml9dQLFqi*}Rkt]5{?CRB&O_ß,<C35W9BաhQp"7'?Z栒\> N\P_Y `JA:|̩OME:Sl	:Xs:orWWG'y(	k:W!Wv4ݐyd6HMnD u^uo,|duqDTLJFz	>}^ӓ]d*HXs\'  q:(-76nwjnm)Bx	V?LHҖ`prQ,
kLjLBߎIn
4SsUL)K,aJ)MPa` s!6O<G2ϣɛ[<Z<QaEA`hס.R":no8hv2,M١xtcHJ͒t0RWT#K]*.Iqf/h.l	\tHZ{	
<jL{czC-`*'"KbJ>mt̫*Nt W/hA "ceshlRr 9S6YeR֭޳'UQ־ \|Ǆ(z7X5tVL,No\QUO<](@u7&FCnHCz!<(]v`Ti`tе@r#H_8\	$}q3b-P/61s TpbM\ L/׽Z^*weS.{y9A&L"Ea,3"z|o	x1|
P$׃@Rۥ˳RvDz7kIy;	`iÓQX~Li̊(eZEq'@<aOp "b9^lSK)u,!ЬI,<
KBCQw%;CrU/qYEb՗J4τα`HT<r\]@rlS7,$TJUC\hǀi竃֑s-c(b.҅ %J Qj`
IRE@сww)ƲX;4k0\SN˫8&MsF0D$?1kvn"h# )=[?rjs!4i&4L[^a:q[Hb1@Y~(ްe01FO`O@QD11ҵ*BqвBx
;ݩr8Nc0L(6] O2k; tFǵ:<!9c+#@t̡ɇ3:;кj]n,:)(xg,O?=x\d0u`Sn$,"VizD)[RbOզ
0+k<Ot!>m0tܪ͈ËEq;TlTr@('aDG";DS/fA5^ۇ)dR{BV!W&qk( [2jЀj}^ FJHlrNhgcvS$hrfBj\=󮿍3ЮX@,φ9eӦzkLl<2ԞRCX)+͕b6+M<EӋh8rša29RڭË`uʊ! e\q<Pd,OK8^ozIJư9>4afwembU,.Q@ ɓ{;<Jio,J&WD`m.=eOMI3x]ϏtZc*->ӣOGp,8LE#v>('Ȳ%ق
,5Õ
^8&Jٴi,Gd>9}LogɏΦKB:ƪB[YV0<dl}F3ͩ
mCQeݟ~0Lɟ3j0ڧ:h3>mϠ.p&?S[۷|/?'v(0=ߪGb5otI35PֹoͶxy߇q9򓰔Θ/~pˋ9DO78>1x%3JHOQAγcKyxϷgM$uw8$pݱYS]WpWYm@b
WSCÓ=$r~Iܝ!u`xSK#]kε|~iŗ^$/-yY*;d~q@?ܒʣzp$򟏚j
Pbtt6mJMۦ/gxKZƽp>Xh(1'pJItc -ddqXCg#'_@șG@2LM9E*h#=M҂OJ(۫˓lΪֿ}ѩx4cӟuIwvN&k_2"soyBJ\=297c9ۗSe^^VߌzGF6ЏQm	V}${Ʌ{:V}r^9F0#ĀWB9	N!L-^=iKcRJc<"cǿPff{rqQ=kvӯLӫ+OKdƼW4!OeDAΕlTcbo2ٺYdls#賭I-*#g͢tB>IOb4~<\tpQ l<X%2AWJU$oBm,,u[}z%ެ -4?2s,giԦ{bZG^#)CGouYu=d|qXt1֖m:)=XJh4O&[GTAuw<Pm(1WaZy
],	Rp+ւp\UMM#d,1[?v>&PuBMBej=j4x=!b'V]?74(s5Q/-]\xsfHLpWta苁g0oWѴ.WsuƛC BF˹;[ɏa-xVNc1 _z.
ҒK&黾WSD*0`ͤ܀03v\Ҭ)w7oF5F͡ڽ/'o?M`1kKo8Y%@+Fh鄜K>2C`cLo @!DZE
3G_vm2,x<7&'5H+`V`
`2ؒB|	]1JrNqi25`̴"w0,1@=oh쫈uJG1 :T  $JUbsRm'ӛ o9F[L̶Seb/=e)ApJz lu+U2\\kAd FAxIj/@J&LY?R #D#t!@~CSAF54%NO2@d8B4) HXNQ'<V'
1/A9&! BOD隄 nhpN0"M''u#78\;u(AjJȡ,/x	w-xցbr֙@^t:/)#h#Cr7
B=+#	WxG=ޫ/-1t:TȻrJa8.JfHILYE_tr|C^Kw#M y=l5^V6kƮ׺WF}
ɕY>ʃ*TRe2$OB؜#yLf9D|$\^݆"9SqW,%kNf6Mcњnsa3'	BY$q'GK-#]02R"z2 f4$4vI{Օ b%#DO@8 ĥ]`H7"ÌЌ:"p0cEv=!+3o
Y'ņH(sSh	M "l%Kt2<ہ;4 z' >$FIVVĆ?Σ˖eW'zYEJjV\
7 3=R0V00~`KW D"զƒD&@LwtwU7wfVvs;b&8@mrxN^h4DjJ#0PZՐ镖9kfIzDt|)Y9s#iK`3﹀GQWrX+4Jv@p(2!Ι3:Ǜ3[.2S8ZcYA.VI:<?W{z|u cV 4 ȧzٌZR[1p@Y
!"ԋ[~SϷ{C*CȮY^bc~yV{Y0٥6KhGPFe9J,80ntG8~)z>sCz#0U	6JH}ye>{\Δ"1XCя岭w|j-	Awd wS@-z"Y{ka
-ð]t@=G띏apX5u,NĐk%h[d*;	SHYjVV*OUՃ\H0=ОAelgN	ApB֟w\&:dbӦH4dw(@L|A-&9Uql&++t6EM,o
z(5Kāknn"krtNWŠ鳾4+#1vga֜0@a/y6 X+4pY\HZ.|B"%}<}v,l}_cWW`1\}8?}~KMS}eVf`1=Ah5y#V) JRR7.[V.C(0z<j\]:Cv\:dfOC2Nb/?V+#%e?y%B6C-ڥ.>w,[Q7H}3lJ
,%Y1`}_YQO^q=T?4-|̲!fQVk{*J4),lT,g!,yBTB,
d &uH7UzO3"".G.C]x~K;PV`mIo:!/A.(ѽ@-H'#A2)Z5}dSfib6ћf
ԛ>-S@ޞ+[ՠ[S"2opd=GM"iRexqtudL1dcV^Z.T>8_x=D(L iZ:kX0P;׮ ~0,cga&~7?f>ƛ7"UpTOV 
_hsG7$Ci}{~g
9="TJc;uCuؚ-R|vR:{+5?a>93 04a} ޱ/)ZZ~HrxgCX[Z{+ȉ!@7 aD/Eͬq
;!XHg&k3eA5p L<0✾KU|MrfD?H	`38EZg8)u7!+hC̰nǦ
]cske]@zhFTְim(paS
5=|߫v6T@ŔA;H5NH#b,ayR
?ܖ`6>=,¨,/_Jc)1yi {ч/rUB`$x83{ք;k22fSQ(Ͽ'QCȊnӦ413b.kx5ev!9\yW4{&rp|c3Yp9psF;IHai	 !"\e@##=@
^2.YP+D$dj	kC\<BR^	J5aҕpAZj:D.E;ƪ1DB6?<99H:3UQD'){By'åHK$ZV3*%ٕaՈ@̐_Oԭi:1 ~G+dEbaI`*0MJIUN'56
ջ%CZ6!N ~iУ`ݣOth!Y@1nhl	?roGדǠjr5s֠xܶc!(AXQm捅Au@ d23G*%*Mf*d]bcħNCa|& nkQɼSM|4w(YfFF<!DY],Q+ȃU5\*ʎDLr)CJk1|-r@=3TU$5/Stw99&kRy4'ybh^hr,Hb|APqT% G{
$;끙Լ67W 7Q e]$dSN<ej\UB!a6J
b.&X<zI "pl&%So hឌPcwmaIr=<+x +l3s7=Of NMx>XzlY{RTy
YU.rdٸPtdȩ?tcvozZ
ZL5!̀}Rm>)C+!!WQyo=/GE$#͉j&x}.gvch$jaYI{~%N8 |Y$r}{
0NM8܌G+֋>W$#V3f>D#p6swr%ݦHȒ38E8%!'6{zYMTϞ_9	8Ёٸ"C}J.p<c9/Ez: 
/2Jƣ¼Ap(wVsb	IQF#j8H:#&ifC~i.6/r@PB`	ƢV
o9OՙŃgW$o$umA(`5SOg,]#W"5!@nCild.F	xg3=@y.(͐Fb|4%CZZJc֬Sxexs2tCťR>.wJF88M1_-u$FOL-|`D$_ePsWJ)yT@ؙfRD
l3]R2M|7Ykٽr eR~B<TZ2p6f{;Mx y7b_ =`K<cTyB"K_;x"@G<0L"GqnEI>ƖΏ8YF1sBHSvZkr 1Fs-U[iwWBLΈBR'QQcPFRY@i	?Zv.0/34ۤOZ:A7KM;?:<K_HB_f.RͿi.$P.<)G;ֿ5Uxsl{`@!,ǂ4UH7M<q;+Ь!ɨy !X!&;).quJv's_T;8wMGx|W#S)@Ӊbwp7碋>Ҟn#JuZp>ѐ<գ|!;I4^1]m$Iw~E9%,nf,ϑAlEtoJPcIG%U${f̴Aʌ̌k|ǝ"GYEOP[$@oVKWf/WYjGJvui8Ǉۢ	;thE> L?k2IPnlB83u$.ӄ"`펓; ˺;K	ܫc1.OH<KݯUU*f2˔;h6Bh'O]	V<Z{_ZFG{oK@:UO?T`!G['bmrPj#cc PV[[i;A}jAو^vPB EB&2hq(VS6>6WGC^V)aZ*h-@]\y_+F۾߽V][3P5뿮^uGpcmgeKUY]hλ?/¶mV0|bKxguRN{#=_ED=}-ˮ\N:_('
QђDW(	/Md-#
mAVgaUltf3RSǪR5Hا'A:͎GsMdm{P''d+P:+śGCplv"da4l80J	.8x^Og&k$w*brs)mJ1^mv	i,5rd16ދ9OȁRɊH`"aDNhKQB$gd`m<<G
	gJ&&´`69:C;R	E+jRL@DɈ\:0܏Ɵj` ŕuK,Χ`-BףJ Njj2KpجGS8
%`zKKŃE4/֘13EBM@ -R%s/6QwӪPȕXȄw!
NGeF8d+djg N&i*-R2
0]`J"#͇"@;9(r > ,sDɨ#,Y㬭<kXr_RN_IH8j+q,t=H\aj_$,ލG+y=һ{hKJ
TRW̖E*^	3z`p,BMNc=-%Q!AεH\AIP6>gff6#5@A<9NnY(=NG"OzG55;iR5g\/9I\c)M
Ġ_"Ws_of-\tS B&4JS0F޿(nNmjjQ\PVoO	X:T5щ5L箰s5}-銤L Jzޤw(Qhb@3)q1(uP`!mh *#CP,rWFdvygP
 dJ]̞ip$>)B&M(@L9̤عqcT@lR@J1G%0Fm@&݄TE6aqa҃':UĜInBv8h{{.1X)1Y0[hPR<Y>Spnᓐ(1u
9.YTtGV4cdNDnbk`}C촜[9v%^(hkg}VWk۵'U,Qgvn0"
%9m~O5|]	V Np׉6^bR^9n%;d#0T8sF9a_WQHd.'A/lǴJDܰ&1jXVj8k':^߿oP1F/CVp|zͽ%m|xj-t[0~	PΖB쌮m+Т(ub(lճ
az{ӏ  zV|"g+WeB=E C3vu^?J#Qw_0oPk,bւUqN! *O(%UIr2b,"ʘvgJ%ޛ	]Ս(ٸȭMҼ0d$@+<8hh~MJYZHѾ|&}톁7K -մ"7DXqխ=H	,0G<uV ҏ$[~
vDK,1 dQ3@[V
%~<E>@{u BM]*\+'`:p&&ljY' C1rOo=!(CU7&#(R3:QBm oFP^WCf
bl6J35<j 0|S=tz
\Dc-樬|稧^jdV$Ĩ\A)tyX2^Z!'Km\W}L.6qtL*c_r%Ҝ89=Mn59u?-%\0IQEqbLp=M(p3&ڴ?*KZ|^6
U8|Yfz?pPG3tNVsa`G
߈l֒^IG0$B
yJqNn =Ym+AB$u	%uZ1ىB,f
i|uN[ ƒůBB dU^ԑ\\t1/#.%=gzʌS6wŻD,s%-@gcЙU3!QIv<oÂdZű	|m1B^~-Ajv\|sK.H:.e;k'~騰RB>JM>u&zVT*[$UX{z#kdKk4#JZ pN33w2+6){#i `5yB&sU5D^SʭalmzȻl˄aqbܵƕz<'"~[04 @Ü:0צƅ3z&p<d>[x{]/܍|"OK9²_F&^胭<s70媱2wC-`ኾ|waL=chȶeci&le< 7>-C5)p*~%̦$s2JnN2(&ș$HC+K~Osi.y+E^JZN88`NSqr˴W٪ܓ]U-W<"VēIJ$M3`Μ 2bdLf#
<i*'	aJ24ewEbe&!TO9sv|n]4NGNٛNnj2=g?K	N<n^}GXs-=FCJ$?(PY	 ~[C)/zk)\tc򀌏ᄹ;JWŰ_64,$W28nTlt%:ۓѩ-[p } >!&eٸDyy7k;ҬAZfH0+HP,K=9^uUk|@v2L!2!qAԧK('x^}4jT!mA3bqqIVQ;]}TW6'\L?IK_ݲ+wFLlq 9Q>@i},
5-6ѧ+k8Kxd#	B&tuo(o\
|lAyb >oI_[VyS1$5A[+b	
Zak 'uo[H't5 N2Ng5+N	qЗIL.9->0uMX1zyY=H5?/w:vxs$ٹ#\)?Ǔv,o\pf&tb`P"dWW\[؜R5btbΊhPC4zi}9WU%4
3T_&-iu*8}W{bаv"?$B(].kωٜL\K%Җ~VklM+8UI |)u(EO߬.)X4v4Ix^䛹UjorF2cd;mb@l\Lť`:bz>57.G*|48o0|+]os1~l.x] "yrE ;Y	j};Jщl2~T*o|P#6՘tP:(D)<}{vF`E˓U4mN\(LCq;ZE3ɗOp`z@?9D{6TYZ	⑏?I?05ZD핌QCS;6PkJu_s\leP;(/kEDԑ{)jˊK_#6|5bVrI+|^ X$~f{AF%`uP8CTMS\Zpp`A@Kwn	yws䕒0y#F_!g֯5$=dG:(ڹ{AK>_n5Z#$TRW=N#
('l`փ;e2yj|ˬaauzQ"r ^uO&&!;Ԋ<DƃkR(bnpa,?
JX960\SΦxV&	ԗQ&/RM
T
cĜz/m #"j.Gn˯< 	Qpv"(mLo5BsG[[kV.ˠOb[q琄/5	ge%V+'e3XD`d
	aStSK~u:5QZ#qA
iK} Od<hwyko*;nKīs9뻺fjXʧ),;b'ʨHW
Qo	z(Stewַ5}җy!QXez 	]
Tĉm1rR]R~_iOzupʚGpmϙǫ*,)jO`>0?aotgbuФ έr`cv6ÒU}nYt eUFˢKMtc/%b#/ީ|K]vg}̂Yl:cq(5O)-lA$KIG(Ts6(q4Ńmi[}&M!?1#:У?=t ˵ůdvxnnW3Xhҽ.~ɒ),$Jƴs&&aNHZMZU:&yŘ(*tԹ% ЀI>jv [L; {j?~F'UE";u9%gG0X;i~Q4OE`|j`jX@Cŷ8S"|YhaQ	`,  %؉tF%aKRwA4SEhprQC75f\oү+ͪ~@34_8dh#w>뇱3~YZ
ײ2FR=#ǵ̛812=ljG|+]7up>0xt)/9R2Lʌ~vQM{##qMW"z\pP{B,5jLV5~>]U2I=xt W:{2:yߑی1`ՊdH9_A	<q9S1lKRZ`ުHq؀*QKC&\U!1[!x6Elw
~fƽ
#ܣJ)i0f( 0>DHwNp;_:H6=mY+U
LދVijEOWW=9`Խ	k\  I})BR,~s^ϣ2'zc2pdT//._	
lƅV`	sf$kݘT
Қø;Q	Uj5fj-Q^~PQS}kNxXT?g	_Omu|l$^ƥG=I
/g
娿A+4N}hZ5Z.ײ+C5(+N "y^_U-5PEkm.w%ݒ/b`q0q%ȳepYE~uhTP׾usXZA]OwKΎXR[ Ht|px(sқ;Uw|pwhvk7wVhܞ5d:]ŠkeXD$wOgG`n"Vpg|Ζŝ8NvT[{^AwK ,zb bG_£RǅxN?MkWEpqWYU}k5w[l|8Y/dRL^dpܾ~X؁޹~pZyzq?6bȺbuRT
ԍ5[pi (ulq5RT;0<$i3B,\~sCL/GCᒫ?ߘUwGqmn}wn#"m4>})`6dy>\[eXj{ٴdnV%q{m$bkxw/{<}%')n_{L|pno~!wlollol_v6˶_v6G>Vo_06߲jsqB{\^'7m*[+ux/0T}{{5xxK^o}xU֗='ދIiۢj>'uhUy2C4E-0Dl%xFj 2#@Z|	ZIi65ɕB*Uo\MWjIA#CV!$|1pJb>l΀faSCUzԎglSԎgoB`U3K}}O vws1SeyT8N&~psM%N@}A<F0^N8_NҰ_,i@j>\x:~6^<Ci$K:P֓pl W '5LӲqޖ/x};1-AM庁{+J䢻z(ꯑs,Dҩ~CaY[;1xO!@cGG,nAd0
UN7ɣ^uō%jӔJt67I`_}6.@uwPv
SA$aa%*5B4E|1)F_kd"[n^Yx)L:)TW[qQ?>GA_#!"2^*GHᖃBN/Vđ"QJ,Bxj/a! riX񂢯l;Ӳ*ȟ
#eIXwt΂hHqZҏ!/< Ts-|
1L?dE&0]'!Uu?R"Өp	&`G~w4-{v)U{&:VF	yqǮ`9'B4m.H[bDY\хv+$OGFQ|&n*ʑGuȐμMDLۦȒ1S7tYm%L\
X[#lKZB%:
7a)^u{M($J!⢸^\Wt|bqm%ҿl-}%`rp-t_Cmn.E̨mA<.@<|XquH,FxzL;߆i3 Ku`'M&wa	VYC~ 5Da_]uc	 <:C@U;*mܑ;i]W>,:)>m?ifD>3i')?}&_14)NJ\lZI`8搓S踛ČAόV7HiC 98z`1&	!%r/qNU)PwWo/	IݠO3})sh4f(un؉Ɨ$c9na
GI:iEsH
aңQz6jQO7U1I)I_aڠ{g~v'nd`#7?!W(ol^\f@JKg]󴻅q(OZvc_)&ڹ/l|Oڭs24 V!@mlM8<PăOx3W\4^͍'=5vxT"5˫~̡ZT,B(fH17߼V..uZPXV[Y\fr+ZTsNJc(,)kZ=
X"J$<<L!"k
89V]grFq43@ҠNY{Upnuy3	`\}ꁚLۯG3+xOFɴ	B"fV"/Xޥ$td$wWkVMeXfV|ث%*6|
yk,P#ɻj&i_6QT1;g/r^BCZ4lp&RTRcx.PdpQxa8dӱdԩo?TF?D))<XмݝH=]' |C$-EqY>
@5*hB,VϿ)>ŧ&Euqt`P? 5Yh7 ސQߵdGE+3pnSxv))TƍsT*4td a~1kz1`j76N1Aӵ^d|zX3Ãc`*2dnFW}Y(&Ud]+T9j%A	tЬaBTY/UQw0!w1
D;&1
*uwz3CP}`v)d`+뺒P	xsi$ːl_nk^SP#6`~v6Z.C~@;\Ny/M7;O6s+]ޒ=QDTy/_mklDHˡWsRh ̤)V>xٺ)ND{%aGϢ9ɢdJWpΟ5žf@עj 3hCzp2*C"㰆y)bDɊS#ߊRCuPX$WDSn,ul}?n5Nr_ћҧ~n<F`FǝhYKX횯OZӋWT2 Ѱbк=m6:hEnRP1.r[8l=uY<0FLud22רsZJ>|q;,m>3'{ay؄N~4=I`Us/wVyx&in\ da `jrI=26,:FȵsVM9lNUk6VW},b0ΨKvTS0S94B/xJfh:#^%d{9:;8]lԴ<%mg)kD00wl71&3
&,MW[i폍+J2E2(xjazrhU+UDm>Q뚷R+֭om
'M5bum`V{Bwa"雺{[,|(*?[UxVٳޙڲK&qbE][1	쯼B\q@@4n^E(]!]a!>	H7\)UU~ߋH80K O#OhNuz˺!#N 
-tؘX]IIG\}@<<hQPO6/H0+Y:. aELhZiޒymTSw )ǻKzُ//$3mgĤND:ћn>\yl$?J<WM%c>nw˅1:I­ٌ5u>{V}]ZSujDPFiEl_@u@0_J\	xZ`8e3B䚄u-tnQѦ 6O?~u3gM8NGfm^xҚUܙVN	D}Pf'yunF6U<iVD+[I3S[!P	MiO	c L"y|oqLG*@StjJdҨcTSȪX`\?3r׳*0;Z\u2AuzyҺr:TakۺqZ W}[IQ;ʃV;xs%_MӊV_'mnwXĒÊ>:SVmHLA黁k"O4˭ퟭD|<c7qVuAhY\,NOa ^n,PSfsslW.C51cݲv˜53lw݈jVFo AD5Rlajyi2TBZt<%U&Сo;-վj࿏SANp .T	XR)CqAI"iEݗWl¥?r^NrK
,bxʴHFaQv[20Rx]n;אuig!`W q~Nd>cwSLc[]!/mt3'Кzdv
cR^jAc19j8[T#E?o(BF5bCzt@Dr\DlX
ܯ͡(V./vǿX+i$50A1(	H,רcP*6zGur꯰L&nQ$ժ>fNZEe('۔n.Kjxq#)(c5A',Y5Q*,  !9jF,)i1;6tTvO0u8'}B;p!EBv$rLp 7/op!5f-qꫴdב6)||zN9A3.x8x*:<o `BaFkeP+.-v^]mozϦ2w߄':=CxՒ!h맟~&
3v}c3ʺbG^'WLFEc+Re9RW`-|(rFp=K 䯥J;Mn4!zZ|B&.r#RUi√6_FZ2E$P@~[$'w
KX|B \D5ҭgz_*#|&n+Gmeڎ(LI0)2\L g抶Hi^Hcehglw13F󸟫i@	#2,0shOɞl)HHrz3WRZ`k+\qD[nl^2;RB9K=2ҜQBOFDMjU,>8S>g@EY}!ZhdO^XG7ZXEQtǥq3*䂫U\Ԯ Bx{'8N" qf2y*)p`곫+;r]pʾN#5/GaH]amucVO1vﲼl@HDf`w/MlG
-w5letIKR*v9ѥ1yt8]683bˁ^qCiEeQꭖ}3;{|<Vݠ[1atӡB7PdH|YoD'Ŕ op(N
{$3&%bHHDXS<äfz5O$J<+J=M+^eY."S)q3?a֊+<'ݎ_2z}qITΘMb^h=vӪ|??>?xV5_.6L]EZjg9[a0k'r=ˑ3Es[?nm,qvz0ƚHs|KOM)hBB5/2*Pt_54Q|hZz/M/OUʵ~3O%u%>1@zuC/	4kxEAx\8{lCaSDm"Y<
Ī!n06;ZJ2,)n!I1ѵo̥(JHՕqbZG쉾DլiKK#o0 SaRg!v1JGHfhg*>JēcsLeUvMPs&~!7}9bJTE:M>[ג~;IpRõG0g`k'"7BJyHjܨÕ׀uE`T3s}E*xJc(B[]X N;qdÚ\ FYfS?h~ iֲi3-λGn~{׃*A*7)%sؗÃIYIquOn |em$>tQ:Ӡ}Ձ>#\@.U=DAFn#=r}~ |%tmV=d
8@I/8[=jNO櫦pVTv|D:~qP%Am(x1ePgzOo/_NdrIBD$cl0ç~q|0 Pp],S#Vhq|]ͦReֿ}}6&c;jn&I8 c|[<qv}v<W95T4_ڝUf6[w=c&"w=73ȄnTX_줨QE
yZ짏az@OFw UW+ƖJqaKUNѰodLna]V"d^Ea@aCaoWYbXߴYn}vv" f!s[.6Y><@mdkmۨ&b	MBVpǻ_eql>*ίn}g` y0w#m6VxT#>trIjq?9=?
]Eqm[UޤK8n4;ι];L+X٣K(0}rznRqMXN~F7&cKM/b(AVr")ǠoaJ`V"}+A&I30FG,L+[ZPՄ4ږv&C5ʸVB[ ^J>N%vyڹ8nɯ"?lEnd98t1y4FWiեcaT8I;ix|)=6ແ/!b"LMM8b6^3>Afc Q^6SXkZDfxNܣDwvvz@w=8`ըDذR₳+ת:\ZE%2hܺ?$8uȨ;Hh7#Yrh_8lx"~XIMK3XjBC Z`d0fqU؞wm
fQw;7wst߇|@9-<ĔoP
)`"*1'=jг5TA!%暛ߡ'ȎSrILb\b9"O{U
F	hhR|G-N4%Zlz~jc+yQT6-Yi~KKawos8}ׄ@5|{p8{u	hƋRQ<kػ)
zEcFc;Uywl6.÷=gBEOd\ic.Q	o/eA:"Zڳxyjz%Hgg)Q/&JC2$DjLK([9']7Ͷ	IǨzb6pRM&E]u
btboaQf+mv'onue|Tob(a1#n536YpC4)ުc}{!<rQ1DH?c_dwQԃ82af[-&uW ꍟp]Q$~q\WV*/AKD
x/;Jkyj1 S7#rK].JCH 7~a/5!i%J鑌&%試N.fvCgQD@gcq$^MjWy	i8ujsud(ɘb*JOR qersn8& W2cPd@ CPbL(dZ1<)H'KJ_ӫܔQڶ,^꽊VYP
R;آIRe/'> VN⸲G+!A8> jѭi<4\LxI_r/{og6i	KykKY'%&SGͷY$tc8,+׋~yzA'~9s3$ry۩QQ>5QiHsd4ᑭtQV7SNh]PgnpUnHBbB/PjIͿЮ^;,CUWL,2!&ad8j_;ck+~9GU{睜H.JS|.m2}++ ܴ0{]9Pǻ#ongq]P<mQtULgׂ#d>+iKxr[MwNڟl>2-)[oNW2ܢ*&=ZGY6O)0FIHdY#M.lZD<Ҋ
(P֏*n9'PLHT]~|ݼT܍]y-HS<蒴
>SQ2+Z0s3.DS*XpSl%$W"%ƽWjH'*ƌk+Sp	BKB`ͅ˱h\_6Mzx0;n-lZk$Eh 1:nQ8-k9/JB@\qVjeŸ9baI2ZF~S	 ^:KwȮ!:G+?;(Ċlz<;k?E~2%]ϟ8PjY.W(F}zv|n]4NG?qI!	1+:mjzyjwB;Cm{\eS]C|M[1.dȲMQ`1S}mۏ?o4,K*;wŘ`pA8X7ǜ@8B o#o%vRc%)/C.p&Ar.%v\( fpBR@1rim'RC;nI_ʲAn{>$S%Bl6i9H{/!H=kPh{huD8m$o8T=O0c?[>,t+阺7^rr1 BA 3|B
F2A$1B5 utkgBlK=2NgOATy;'$̗G7[~Vk,;r
%yҌů4Gja@
VvXV7x{qXVn1tynW+59}<?,χRbE8f`8V{cNa1x>nVhu>'${Hh!UJ7وnIϼ%"/,B5@i5Wk57l"vi5&UBx\5J2-$
,j7:-eϋ"W%ˑ9MqSx[>7f[Gu|ҫFS+X&Ciz%$|fqP(IC>cga6yD>w"\$m[(䒴42)uKKcIdY_'!_ZͿͳy%z2 x{v0Ϟad&r0ꓲA}5͎k~@&eWL!dw(0JLS e!QMrl9 e5v #~0w]Lx0ѧ?u	p<@ Y.v6mYrLyfzIa/?wTekR+[bvl_5'.P_h.Q5(3	_x| >﫯78q+CX_|"\
<C7V?ItyGjwB	A?#}՝l;}B	yAa?-
l?86րH9)	sʣX*5)a=47 rI4J`3Q*Ǣ9$xh]W[^3"_~Ra_Jc# ]Fp 0@ЅPT.T5O/r:S;K  r	_1IɝlhlF r'7yiWQ%ŷuq00#|BJq\$h+op>d-^?rt%;~`5F[G`?k쩧y9t'Ph 7
; /}d[HبNy|o\I)z7Յ7' 
^b'kipu}_ޢQu^6Xɤ-ԏ Z?XϬ~ T92$ʚ.p 0/e%s_1]cu֘&;,K7֕oh~GВ*ApVeܳJ/ g$Cb
֯+k+';YTͫUSrf{8#5
EE._(_2EdJ$A_*K36񣨡6c*H˜sqHZ$79ˇhCR HN.=Hp_1I*[0X ySCGSKNPLD9+51j9-x|Bz+NhEzp*L]Qq92|QEh޻b7˻H[#)1d_'KAO@W_܉.]#8wLv("TdHl_VkjMrR81̦fрZzTkJ/SIRI&o B3<KU:ΒOgeΙ䳷Jk4Pc]A8驓3b%1iǈ^o~DGN]./X'!ouEVsrP{!򊑐0KJV#UX>dfxNZzcWR%rrPd8'P4'6scI4"36}2hv,pBB$݄s]	VXfQȬ&.إFz*|eMY--eP NcdjN><ĳP\}([eH aitpW&г99zShp>JZ qdX4q|t9M-#|@cr0{I̦kyMjH$'GwYixutlAl;^ԌbyK>oh.5cUmtEZ
WŒWdV&Qf?B/+ g60fnzG\=zٿ5.zӊi
[vTqrYd%.fAbS޼!c<D oQ>HI8AyHmIFr Au̇5)?;'=SHU;[>O$Q癤K Bfd
'
r<9{yT	`A+GNЍso6<To1|)rpmoώn5fciWWh?Gb$b	7҆G}l OGMUiߝoʼw]bv	P`Z?M{xۯi@AM?Y!icǋOYފkq5OpoiιK)8<P21%tW|f[Ԋ8n2Jчy[7(0iuEU]?RoЙJQg~7&=V".>qv#Hs z19)ɆQ8ǋ[[jC1$D^^,X8jZqEWQFuMdt}qG_֢?mnS Si<ɀ+F \eXz*'7Oy^+(;Eb[V|1RFSHi
m\
* Bm"0r뇟a⴩K9!a~b=lǖ}x{V+BOKA]mqqLq]Cg	?Ë_9Y$i1'b֤>Cs=yNY+iC`	~J/Wk.ui3#V\H4C::Hh\fjx<9m6:ͽߋ1 Jb*g׭~Sv|;jrRuq(%s?ILMf[[-sҤX0!'\\Qe͡"W<pUZRP~EDf.6RtpHNadWhCI5nrx.*b5Oٗ~>i^J៨9jc"Ugm~6agmrxqIykx+:I%L:SCj3V#_uv)+$p`)8
Z:e0f6zatBђE]'S듢f4g~S:oBu#[]{X7>ҽT@_%dY6[U+rҤ3:}`lϊ\'1zlcՒK:>^`hhsK\`2v<'h+C\@jR:=up%
ٓ<z:ܤSM6y_l\Opl a<ܫE'㽃wq
6Nj^CUpʝ1-OXuoe.Sqdݩ|N㨟wj(j쟐-Kt4v.Z秕>E_D?SL*a4ȨCdu/Nw%i U`u~כ֦Ů@Rhpt6BiNV&ދwuKW֖n&nͶu3!(b=sb[AfpMU~ݠBO"zWbB/!y$FgAʹAR w5A1$5!a@|u1Lml85-܉084w*o*ZuLi6\^T*)E'pѠM7,	~CF|"UdCMco.?JGmL$tMxA2}LD9fE27r93P; %m]F
5븲uio᧭mfB3[v$Z,8(%]#HP_1\tWp)`oaY2?r̸1NYN)"Dį?x7jYz&JR=j.IRKw/ML+5P
?q>&b'=1{`)0BZ
G0֫?9m;jDVl|DսU"+b
ؖHLρ($RmOZ9B
;ޙRz{tr%Bq@Pƅ>n2+EZ{^	OslKQċrz;r۾k_)?8mllTΘRDۉMRcJgՖ]kl"OXsW1Y݄0gFrմD-eñx6/0 8B+fpn>479gdDaZT@`뮥TgU䡘]avS{WզUIGX1š܃p[虄uڑLFzxH'P^$%""|
c"{AibK&
mBGH8n`ze̹$]dFOJluIgdtTeʌEچ䊡ӻq|QÛ	7~JDm8'B>,쩒'	a?gBUM4g䀴>vSy`]Vȱuv+{=Gru|Y'DX4dܠAJ\71Lf2+i p8HVlMJִq뇵5:;{Ődl߯&qOMM`[0¨XNYSG~;
!kF%=]}:Kց]}^
R\X2bk>riIr ./ԇ}=$k}DֳB bJ8vtj%ti֧f7rzkHAfJ";KG^xX7/ FzS^<Ni6ښ`]WtE:%b
S`5ǍVY,xeBHNA&;	gA*"aruN}"5{tr"T%w,nd*fȻ,Jė_rKgbNu/c7r.O{Sqfi_]{	?Srv#-$h5ߞG
$nH,BJxc8g@g[R&i%'5N>}L M &*:1{aBxq<=:hpۙxTUS_L.ˁi9h.JD>a7)IFn*3'i#/; D]ɚB
wme.O);ˊ6s1ZB*H%>Z6_[os" DÑ)"K9~,/{cV,(ڿ#P(p4>Բ"+|M9%b$W#vS!&hA|ӄ|Sքڃ!Ӕvj&dG+2Uw8v'ɣɝ;UPcaTks .ݞa 7uZa%U][-YNT	Mp0VE<.o "阨5[q;I]sS9Ju
PpمXGim(gmC5 S8"v౐#`Zr^gܔTx!N'Wr5[aGW?g;
S M}_ci@8swyhHM4掠G9m65cGu2qbWwmЛ-Q>BLy?A=sYac˚>`C$j[HU[?j	"wus:o}T{T(nT{xB,(g*Ɂ/<U(dH;XDw4r,B܇vi}k'J_SS,RL5{S5y@;|)8_!.DW]g՟c3gAB	Y,QWdHȦ@/e */	pwʘ,e;AgcY
r͡!U8ufP =O
ڂ-O_9m9f_y1@z_\Лnʁ'5AգՍUЊl?uhɲ <:O$S# y*5<|1g򱓬O՛fR>Ֆy8PdRg/]ԌT*sz9V%ocZ2>}?q(`^Z$RNP|]i8|La1+2wzef+e&IV}PŨY2.YI.-wkn{xgl.2X)L@
)<"9-Hh5qlLW:IikP*릮82Ed1qvDE@y@p?ژ;Q }&)T1dC#%.cuqT輠-&h{>KPߤtΊ7>s4E>"NKc$x{CtT6Ƒ^: SXQ5DJH|WxъXb]_a&P*ԅVL ;2*6#8?:Pyplli`\SP'q8J[a/.I_ibmE[M\eYjHV0*)
X~v	rQą#mX	KcpHԾUh#`4[J"ǎUzpKw(ѩc5*$*! Y-'|նjΕTOXD.*_6H+eis
v1'm@6ƍ"dL@$Tr^OVw7ro<iKJXV%0q|UÐ|r9UpB[UGcmamC:@jr`"c%b4UC8Z,{ގtb2"mpVl}vv YXZz>bxÑ)@KnCg~|:)xF%Sk\ө3]5 S	
PA-S):R'}\d30``x9KFa[DC#1⿶;lέ:[6$pCLfJxۖAk5xuHVLBITG΍NzoI>niB*@Պ3, Iu_V|/&.Ǒ[OxLN
9=VɯEmܚNSfcy*%*f7<P;x|ׁ/hѪĀim1vaf4"y=QJ%u^M#Ѧ1;;OkNH0'Ӗ?6ȑMbJl+Q9	K{6jڟv0֖ef;"w<!Kxw̂_V 3=p+`oQtSxZR=-ЊzV΁˦x}*N7̯%UyP[z|?NT][MD֠~bN0,Z~Jz뗰O'+)ph11_IY+	Xc-Z9֢9&[XѿUUHҏ{y'@P"oRdM1{ *
\HGY !GN%}vϕ$+Y) LW4GSkb8]x2MTH{uG_+b^U{ub(`f`WT._')Op
3Rd=CC'8A/_-MfA0	2T<䠙
9˺㾕VlJyI%k+N|i`o<+>jdJan(Wiw3GMu芈w֑/}cӃ\=>W\}@R(&)Ydi,RzonB7M=3JMKc۴.$W{W0%J~9^RU9}HCPhQ_h loմ{1Arg`)OL[?rc7Q)95ꗫYiɳr!aͣL]wKOtJjᚡLrpJs`12h&t$l$0u{fQqzuv]DO]XIoKzNS\yAӀ.OBȶTPo|Z+"5BWeSISqЊ0GuV:+aޠZDo.q"kf(!/\gza5AA0+7	q8$F?,n77~zeu55TdH}< ZFЏ&4wCY:)߶P:qW.
heʊy,HI(S_	ST+yF҅rhSw`YBy'c}`jtl@PW6qN[?ܡ( E)
#ZU/h2,giI5Eh`oxU̻v=W˅oOkD|p;BF|)dr"7q@[ڸNu6qQbA\LfvE~(+9aY3+6/+LOn,x[BzC .~9rߥţP1/0^˓S\V8çjBʞ/ʶܗf4_`E]cρ-z`I$
7H唙)iYIܣRYG9"`vrI0ts<4"]VQ';J|YJL)w.M<J}bo13]);`gwn28"Y%q5#ra𥟬?8	;M:Q@T((pCKqy#!(`D){Ƃ&!qK% _1F%^^8-4
IxpDbH!dF)c#{8uYRFeA\6;N_\$¸?{$gѲO^#mۤNTQ!mP9cXـSO'#8[❇yǌb'
?|بTBIu:cn'
#5L1CA:u#lV?!<:Pn7gt"S-kgaɟ^Ě
w^|,XtlP&nךXAhDv	9VZ]^|22HT3y5j$[d3^8miVCJ`UPfp)YJ"8i*NAA`d@:dF*(6<MSNR򾫼	?\ٷ j^~A6ѷXmbb8:U8T~9դ!G;0henwJTKiV7f~qxm	Wl.3c]$=fw}`ruPߍ[-W=ub=r!dTdHPT ҉$^&+k_]丑_XƮ%iL1Nl*f.kٮ_O*틃ӳ7'NOo%@Ǟ_O5!nfsrAbtQrԄ]K{1bjʂ^HZvZ.PvKK^"?ހgމ{5l #Y̣}kAlo[.@avqcǒ(Ahpcrdmt6RhnV`?c]ЕѻL@C8+y8.,DS9?sCC^Փ<#on6*
bf	%۳Is{IV", aZ竐](]R=:עmѮ[  *& PoV詟BFCSOsVB(4_ˈ?)t?EbS'gK5{ц?V97`**	")aUGBɗ-)aSzKy)jC1te{:ٛAQ+:('=%ʼ:@?$#NY}[OG
֎ۈͭE?am;-C~ɖ!{+]-C6yld g#=E-&`Rv &zOnx'>/L|5&K&A[Jt#x7_P2Rr~<rͦcH2 *׹6I%7[Kg,,ʳͭ|'Cf0w(R{Я+! 1lx~#/oe3%Q*?(3㹔D	[I0rtׯ"w CX%	@-T'maA"<΂+|d1Ļ.ԐѮH*'8fAI^\J]c
)^Iå-K6oɺ٤K ,F]YC\[D=f$JHe03cI:5CaF2BJX$~*L!_Rbٰ+$
vh.( TيN2YJ˙dS2 E?k;\\.TwEھmйQv
ΗPoc5Flgi B-0'0`>̍nq!/|g"!q*t|9XnijlcKǃHRx^$rQ	V؆E;@MwE?Έ˪M1CUF-Nm'k0p}]+rh82ҡq5_98*a7}T?\̽L~c(drk_RH?9!| &wvF U$yL}Xjxys<6Nf:)އu?Y"Xi
oRF5]TrӸEU;r	\gkx,}bSq22検Xj(D`6: EA 5{l0`t#τT6G&K_z´{DkLÒ'13wSw$c@$xnu>Ni.X<nn?UDpLaXx)kǝJ̑rVʂ <u F^^6!$VK$oD\I0h<ͬ~&3t05El7F#ߺ`Eƀm9,O%^&3xY9OM@Ɇ\!ߘbhԎ+_)Zn5x::eTvW*N>G>֭rwX+qO.,p&G=b1Jʈ7T.*$!٢0ICZa	iV\ӭ
(V:쇉;_uxwp6U4GÂn"lO ,9TjDÌVMP&O\^8˓@j)ʍQEHEj3|Bolt\'JXU8U*⠗Ղ{'{ hPJ[5o:*xDN[z܄=Ljsݤ
!),B#螧PykBP+>Dg{;eONtL-?~Q_mĔ%fˀ=`tuFm	R;d.I{ƞKCJљB37LK$jVFiqх2)B-sM;:hpi1CjdL["[{֧ 0zn^x╛j	YZN!MN*-j"r֐.,0 /Z[2ETt1xB -+
ւw-zFMNx_,~o{l估.VзS905oES.c=)"XEy:zͱuꀎ.24w  *q)qcr{NXAAl_fӞlk^Ui!-&<zj{m95DԐ
MﾋR	CQUWߗ 3ܟr|-BoyIG\Q} [8m,bJ9cwbBdWWoRjLxЗ?ܞrJ0
"x*p
fjv݌ըC}nZ<=m%Nkuw}n}msC(:)3$y[Jqw9Q=U^jZTb/O8P?W[oGe?׋Cq$cw+QUEB)Qޗ}!,LqK.έ(SB6_$skǭi)l^ቴn)G/byE;Np<H)}Mz0gԘASE.0_-=M@&9 $+ݿ_CGl`]3NYiG<C"ln~h
닋["I<TI @0s#6wŷJqifSbLyxч*1"--hǈ#K2p##rbxdr*FL(vSubYXVzwK%GwMY<>N9AyAC QH⣜ַܗiȢ0*#LFsq<թRt&FU}^+_Y+U;TAŋjt<ރ/^"Լ (OLyP+G1BvwX4&IFB((A)VcVXY[LDrr>@5.LTvŃD)ɵj"Y95Z֦~[{_]
o^4S]Ԑ*nMLG9W+g*@ PValݐ&p9O9^̢$no1 G6?\Bfp.[i;!LHQaֶD-
.?+ϫ5l߰d c@ꛨAM"H2rGfg 	$~/9oC\QMƶCr-jS}r

|\J}^_HWbr<@,L i1T|;3+FJ@Q8y1Ű3<6^XA˿8CtUh3<{iGLڟy&Ĝ㛁Y9(]io3
W̋8n=(ڝM
S
BV/>'AɸcXF<߂ Q)(ڿռ@$TXE|")2.,'~&M%
t\MMgxvn؏s\9zm.i/_, Iv$r`G0/ԾVU_E]`3m.[`xѡfUCypW
VٰEQ,hb%T3@~bpKF9[2|\PLœT=wMGѾH%d'[rga
\e
0+@'0N2>Ԩ2H'@1)6(;B(GMƗ.0AlWX1s5F]@(PƳ)8Mf"OB'%V4y$tTo=IU(u0lb"QI/)!pU΢wUbмN-b,yd@޵uH|x0Wh!4!J'D.T-VN5Vܢ&"S[uz&5Eu|^9(סϣ~z_Pvi3
[*J	$N0ȲOyA~wcJzk\Oʓ{ddk$Icz R
oWטFk%*"/j=g],IVNo9a6-5VVj
{k<&R]\35{ntWɃp{O@Oty{ӧ{ΧEqy+{cߛ/ޠ}7tNէH{|^>U ,Coiu8
3OlZw*{[`ސ5҆⡷F9M|YO]ֺiޮjzz[7p;v?cEn6l9<R5F'ξ&ib-1pFeK d=ҍO6XUǒ9.5̝c0?`?ĺ4[X?? %{7l0,*p:UUkNj_|uk{>Ϸ7S<wY޺}t3(%sTjy/=t׼ܕ <O`hǾ|? NWC+_$:F-ۉQ?mQ{x!o %}AC4R2 t%׼P޴(A:0
&iv?%?&?9#zqi \HQZ_"ً(;[]>̂fSuFMb5UPWUT}q!|H?֢^
7ؓ&(0DE|:. k?VRk:CZQU4^m?@;t8@φ
cEavB of|+mL ЗISMr_ƫS50&}ꦻtPgt[7=m>ssjj[
A}AM_MCM_Rӗn硦?Pܦ/BM?M_DMMM?ZQ6񎾅:YNVĽa<Zp	HJlvR&1Z	&?TG}8P΂ٴ݌T}JYN&nˢal\!MdABeC(g *En4l2(SFe[EBFQTA=-i}xocþ{󭭗ёb긚$IJVxyws%NpKE=gI7f=Z{uh\ؤ*o~̀HB`w`k9Ԗ^AV+xj/&y2cO׹c&#s\艠!`?+N0;ir>WKnȬ(o;D͵q-:<?8ܟM{4*z?lrf͆a~~Z/5ux:0ɜd6..)3.$)׊$ٷ~`HVgJf(z
O%SŹ	?DɈ !ȢQ][^YrN4*sуXѝ)*=(H>.'|e눌1CHԣݕ).3C533Cg5QJ%S_<4GtC1U*$z (gle=ip/_.`buhcx6JT;"N)Ɨ'??k]>4𖏙$Syx	sʂSLW7Kfc==d(AP
9 Cy"NmhUWçZvܿyK)c'ǝFۭC*\oϚ!y9vޟ6[{! df:${LѼqQ)3p[
ϒ誄tV_$~váwxi˵)ђ5ЭI^܇9L-oϿR*f0߈S-	vlT4RVH]0nq'%;tld%j=_*qA	srBI5VMIxpЗd-UoN7-wrp6X~e[20)dd"K¨} LLǭj*M!fA;ՀҒ,  x.4c2ħ%Җ]b}]v繭`?`SPm5/ڝSІ°L˚0_<ǟb5(.ǝeP^h)>k&hT;# eأETK,^O%S:ӳ:_WM{Yg%bV9({(9DkpW ZEb,8Gkh9$]/j΁9Qb~c*[v.G: S6j%g(jz)$uQ/g%~肋v2&i}
9|$Wz=z?/}')uh! ([K-$WXl@qe\GrEzܻ8=@3ԇ+,2.Hͨ,)wwpfp1oR!5񈒞^nHG8'Ú)ÀAA1OE[5c)Pl]g7ީ9'fl2dHY"+Tc=JU&s¡,DSdH<"1tͦ"T6dc%;ˡn"7*l+Ԭf-=;=~(VLqZtv:~`WF=<:ؓQXՇ}.Mggچduf{ӽZ,_ =%fb%Η^Nװvh8!QvB_fZܭ߶Z2,&&Wl4tVC	s4Z˳T<`-,LN;7erMWqIuT׷?l(r?)At
؋}#~6'=L:|oֶm48CǮK5&@% Xy2Xp_wx)tǽe@	kJlڳuSs -YZ)9&Qv3
_b͉>ⵙ۩oT]_G8}6B'xS0hb'F,^)Uwp
5U t6)K;P>;ϱM	F%䑹STqlWܮ}2(695Iki9:b}6);r[f';bG*;U~1=$0g?FwgQC*qA	( ΁Pڅי%lм̩;083vRyES_X9VX4LjkXŤ)>-$kk"[;@uZeUR×UӀiU	@8zW{=}?ć]-E=(_Q|ڴwy$Orom{I=򣿑xQ
KH=\<H5d*57E_eT|\֦CJT9ܞe<p<΢k|1ɴ{ݚMBb`o}u؆̛
)^;>x̹P>T_uay7G752YmauǻXz4.%p 8XP2pnԞybe2VS\MZsgd"%h[kXbm$otc2h@j̊g9hzlFRvOކPbWn	\ӄ\{@NPFn/@^S`.ګ$:uFC>]E's5Rc_qSKDx qQ(sj.z
/z-}wlBn.
T^n:n#OÏ".[

x9Ӓr 
e_fgIݼ܀Gik2g3GJZ5Xi0>(q;&_=K)1  /O	ⰒKpTY5,AFEk]0Mv8L@'y7NS!JTruL\4pGdjmS7GϓړSNOXҹZC :xZNXv]/dOC73[1)I}b~a^K#yK~N3RoZn7#Cxi"KtNϚ>s0b$rʥQģ_~5
`!m9vpy2|_~/?[ݩne (V@l11┛uNsWgA^_^zk7tgp!nЯ3WbWw H-#
󴧯Pݫ1,<G!v[XY@PkE	3;PF&IMpwe"I:]`ֲ*2"+	|)wv[a^F{0_W`ρVDo/*d
#Sd{FE`C|8Zc&z`D],8^EӒ76f0w9ѳ)a4
U8"Y>Ǣ.1W",S:vfPڔYIh5`)u+1-d7
	%zs'a}fݖŅ:Z_f*QPW[5!!5ߞ%B0J۬>?iPk8M,ggcJcHE_G6;GnF
	]'$Q Y@ۖՊ|e D5Rt~ul]^~_jl]DgD=m$j*8l7jάX*MJUpړ ]T!=<HNpPJQX]6)&x2OI[!`"gux:P{9M)^Gƭ-8ͨd	TpZ1ӄ-)E>g<DsJ|4PIgԛ5VXON>չLtMxe5avSgw
SU<JWWrYLHڞ$0=f[ JW(xr땢c64"CZl!09MPM1]SRgb HFe%[` dW6nJWQ+fufc1הZ΁fl	sHƖ%Ƣ$ik)tn32nڡjQdiǚV7&D98fi'Nȁ$3tBDM>V(E![f&TGf	3S'bzส_=p OKR$%i"$&6̘sBY' =*&T0r.(ALۋg+ZvѲU̭׮lv-d]DcN!.cf`ÿW;[$.Z&Th#+mPI51-&r	,[_oc
9U+Vո!xbmĥ׺zKk5Mjj-kIi
1V`PC[ٶX9a,V;X9CI&ɘ5Z:L>&۱ֽÀT5.5reGENv_p_}|Yz8^x=ܿ1&(C6Rmd)o(.'{/4oFﰹ'Q7|+o0;4tYjR`\X,22Ruytܻj2/뾸@$eyXb(&b݀|wkߣ<Hǻx I뉖4.dvCV:G56z>%Qa^&M,1 5ryc'LX,-z憬&&5g
{,iB^d&4Zo1{oRQo	nb_|fcDX:S;_e1M;ΗF][=0x71W/z$$ܕ V@xZ{g%S<Sz<9=@5@zگEr&0>8i9R&5zu߽*,m:ݮa$|Y`}+nKe"K(NR⻻ؤI Y<yQ"r/rMEϷ UEAhM~.E7y[~5;aC0x|!U9k;j2>^jb</pJ-!0
6ߤX-=_:kϞbt/oDg9*?D]DkVsdOݝ)}H:|^.%5,f iכ(aU%>SHA^&9`@vn.,5ap]?qxD)
cI{-ӿЈ/<dv|  7NON[QniC6VLZq	6:z :H82uAxګ9x}VBgfrY*<+OC(W;0FI4)7-qAаH(\/yCY7k YAx(F.×|&b{l^/!/w]xip`=dr0cy1CIgn@d_1 .ڼ4`mûd|/FH--H-bˑzn#5 %=:Tu",85ɀ&ԡ4Ynh󱱬Q4P^j2_ǰ`A.  hJdZD;}VKxZI 9&{↋}9r^ng-jJf*#{YT$KLfRP	R|t,湞#Ɇ;Gd1X A@*N˛IvȲWd.M-ABڂ9V_fz2ve,6dzpes|!A²[
uo{ыyҧW~$|X뾱/~4exv#޼-9Mm aQ [a2-5}|DǛdCp	X=Erbŀh{4LSpdi/`&$dhHi̼A"pkrY)%d%FdۺҒ&K}7N5/j\!k>'MJҰhaI\l' k3m\ۚpEfgd>֠ۤh&x	X=.r;Լ8W%?^ IEZsMB-
HYHDa5dt28,,ĸس4,l6~?|lu6HDz}aa	XH"_pOKEyV9JaݗmO.TGaLcauX]XzQӹ}DFdZpE@h8_97VPXÀ t9҅Y4Y˥?.Hg3xud}	ȥCdq65t? i]Bi<-x
,~\?.>,]y`	t::#p|&P+D6qַףҲr~S joIS2L2}`+RPCXY<]~A__6mh#pAd;cV	7B8jRpa}Abp[8Gc;./N|g	XdmLxNƆIq4O6HD3eOUsCS$|.!KɸǗAqm2GZַcp^Y?-QV~&aRXVv?gk6Ϧ{P^bZ,u_A<|=OE){oP@be1AaE!LP^Ԟh/cVaBeǶLV֦(-l͆c$8PI\IR_:WQkDD庎Ħ v+D5Z, ~$='Ԗ;XSJ߂Gpv/T;zX'BE (C)ՅT"JVj+kp5 E07Xalr[n2孊9SRsbzG[IV,hа	ǢR׮4=gtecygg{m7 OOv/ڝF笍6;Q-ƶ6\#LN/ńڄ)z0H-`ixqT{L6e`cHYAyj}F|ĺQO"J;	M]۶D&V*~"CbU,%
E+i2MFZL5P%aI3qfefv؅@z;=(	)!PK@^)ɜ]_J8IOUP֩Q#,$^vJlOP6ɜ|*I%70L
g꺾a)iP-I7X1Xq_TkB׷"OUȕzjPNNt莊)`tCʇ=!ꁪ&cO~Hַv5Q>ccU{'OKߦ(INj"r`uE*']&Ʃ1v$6l|3;WdGUkkq[tGw/4cƔ7/U)L0Qwu:-zl@4)`V} uFjz.q?("g<8م 	X-O'u|(n9ua|.MeegVxSGV~:rag"}ud`Tj`$,VB)޼=%}&Ӟw;`o&jŭWgi}d[D8([4	(`VC={V2OY!byTFMTf!DJsjDɋR(LA1KJAr.֫+rP%W]pG:Udtf\5KRDi?Nj>X֥oĄ<=me a<RbjA0n)ՍAN]'R$X0BCu]kUJV)تݪVf]@?%pcH	x%aCiG5Xcp6PMT&HwO?4r8kB{5^ F2^U&ŢjȰ.^tG;8qAc݉YZ0lO΂9(e!pb-"j#q{V:Uj4,[!Wk,$?XikP`'^FNOcٴffcx8\D1)O0EWCPŪs)HpߕKq@zPtVKg u9pu3`&w"\O%ԝWF1;W,L20%nKkz%F-	h?:48l;حA"tUGoR2TqoPB( DdE`dtE'RZb@1u Jb)ji #,"}E愔n˒w<BXpƟ,Hdk_ޡcl6af9U8Wst%Uc@DLuZz].5ƚ=I~FNXtd'w'P͸:* Pk>C]0#>l".Qv<꓁cn\h$}_ΫdX(Y6MԣoyiMFe9*w8NìGճ/*ڝNH:Xؼ@\v1Hωa/-f\סt\LE
s9遉*)xWtp@uv֗>1Ͻ+Β޾SHGGQqe*}h[Q&wL^o;!W@E7']0osCY+ -uY`EǍҋQg&,uMPvX"BA} sOޗZJT.B{`AE4V7v{/C4+0h䢱{_Zͣ`(`zfi\n1v^,2y&2Wi/Lԓ1(S)p]qQOJX K4RLV!*1;V]xaWڌ~%G4˸{ȡ_g*؍|VU⪇,@@GiT"8M/u5/Nf'Zuu,$b2}WmY4,%+jv,B6i_j{mEG/@4͟Ii1KXhEQPjI/kT*Q2\KtO	Au::ֱ")ŭ+,
)	@n7	h\<fJSC.^؏VFקFuk)߳9җ>kU䁀W q<MuS3z;j
R<5HGJeT,C	зN
$440bpRyo_&\{Z?$=uO,7ÊH+|o'RUJ󭫇+l+ZY݋fF(]ٮ=W ӗSQޙdP*ЗUA9/FS+|]eqZ#>SRCЫs&iT@)я;ѧd2J>43ˮ
|i/F~	y!ѥy$)򳈙K s<Ŕ-ъ,%Fk3[uwZnߘۭ MHdTs:4NxzQ_6:#^qJ,+{8n8#UevOrzGf}`rxA
yy$eGVPf^2$]RVS;Z|iy/&ZO
ۢitPX!5 tA9ȵEfsa@4eQ:9f洔Uƶ(`Y|<#+bkX[Ʀeٱe|m%D-*L-'4b8TD{_ho	TrA@0DPdeL'rO
7ǋ	Y4Qʠd6D@RNd6z4YR%1h_xه>>Aw,+W^g廧Eoxz\n0hc}LjM"ģ3-4"#4ׅ\qO=XR7rVfȁՑMy{k"H%Sr([$n"*x`{Lk
"7zA	@257c0"XT_?Q*i֚߭|3!z]x)5n_lmڗ"z807tF߯ExD(M!wwLe<Epqa*b367.RqΊ 䜓VRvėT:3naw <bA|rHZ4oyH)s׷b/;P\ÁP>v&ou+S?vaȚ]fWh~ˣ|"tɿ.N^u/$]xXoZ3=AK?A 	*B8:0AvҒ+xq`6J%l{{ӑyd8Q8Mv>H>';T82`M@.26-Y~d3[N	`Qܐ@
#aX+6)(J*x8F}eiP6Itg%"%0)9yʍGfey]Pp+-v(rBYe#J[[>߬!?2w#tanH=Qy,'tzx}, t2D'n1;%(T[wSTY1 9lyIgit6JYOSYu618һɩVo)i}C>HiNƣ{~#ts?;
Z oQ	O\LNQЧoɖyBd^zH˭?I)Y}"4:/]lOU4TfW_V(ڐ"
<1Eif&mKhYm{[gNKlagCRfj\IHɭUbVhs	jMV!卭k/chG|C#%,O<-p7 }Cn؈ 
2ś]uXgeNg@.%r*n@f;h+]7W܅sjn"߅%s0o8!#=oރ.1yTo%?.6Wǀu1Bg>u(eX
/߉=V_S9G 2mtYnwY;
)h<(L	"{f2R\̙|1.fs^\K!/Gt`a0Gh!S7
LųҍSW`_(.{p,_.[³ŗ1[ha0 &=3a6_-ߏϧ"h[:8XYLtt`\&즺dÛD	M-a<=sqg	0!bRS	3#Jsrs~}3}ˀ$ѵxOƷѢQ]T5	QqzCC	@2iV]6:ըi~!eXBB+` rkx~ V/_\P	LSql.yGQG m`w
'[Vk*fhڦK9/\eЋ^6J\cע2FO;>8fk;m0	ו^ex	9c?~I.!3M(&pvl8gj翲F YopChCFgz|d11TZc^e,rˎ'gʲ?P2 (_4	'Q,yihN< b`'85C(:38jtŧL{y
\^t'$p{{OQ~Ů.	|AOȼe]"1fEnRa|tweo6/S2 nFEkͣȤ&UғK!y8MHx%Ĝ2M8P^"'OnYO&:MG3E0O(H5c*p(BhIM#`u]@d,wv^HFn75/O[GTv*2F<xw:ig6Dm-^cjAx\4+ۇbNZYɖi`=7mdDѓe7tD'[asDKi(v8㏎q]6igɮȷU:zu±Zs$߂|H%yʘ.敠9ba7AOOBo\K
ZK2/s(,<
I Ct|astp%W&pBgGYV[96zk1BzC5)`BwaNd^800zHpe60B4޳9%IVW4mH#nwQm{@?U>Tb*9^U rP'yD@4ʨcYP
!͆h<15ޘ=&HH)IcP'D*{&q2ϮN!
K1>h)yby4u0n:iS>|/d$r]'3-g^ϊ#dY7
|z1("]ֺo.Y8<8n^\Tל
$!i@lK̷Nu'eRԻe2BGRYs`0@r@E9 %W M	'c	Jwq'=Ȝ4T0
	3s>Q]Ǧ_U}5(q*tF&%\]/uIuLzrI2TMB|yf9h6^=+sE\=LpL/0")w<y4OSBTC]^2H7M կIcn`4X0 `]ޡi4M??YzkR#[acIK[X90l(A"nb
OԀt<mH%znJxKv2SXVl))I4* v^k,}`D?(~qnX0PUYAtPI*s$+iabuprDh3'(OQ9ݳI:*ܖjvcŴqΠJF-Dgqԛ	Pw 	'qzTwhEhz)LHtQ_*X竒Z߁"5iK!i6ZNd4rLTV,5ƴ<>MXN6nkيq3HRjչ.)>e	b}0sD^)
L5O}1EO۝Z*=:NIYhY-J\*zi]fVW++m~8=8~w k rՃp {P*A7;Ǎ&Ԃyt98j<2H)|qv|lOB2Pdc.ohkoEUM`A6N-^cX끄\B12
U]tĉSIo+qRR	8ޖV}7g#<$}wB+v]l?9V]TvWYILf=ZT7Ez>dZHZ:bRAedu8gvuNURc^7s{ BtiwI݁>i<G|B>ۮn>'!ӦtAiKv	"=CH-M=7Rm	vwcb`Qî V[LhkKބoGjpܯ	,<Z\@x
vbqLlJt^zo\&3avq%݁5 Ŝ ();?$GhCR[cM|Çk]7Wg/_ŏ[[յ-Vjavga'>TMJn7o9[>ТF<=QK+h nc:K0Y}q;mBH>FX'_Ղwy|2]oCW+(QFic˹ɝ`m*^?%)f%fNϓ$G1ѪqNrPQk'
q֪quLJ@Ҧv](\ntqֹnBUO! ,&tu+M8}VVrm
ЕDa\`[5ֱ`% k.F*cLUFta$No0_%)յW/$OU>~P݄|S3a\]u)?!ĝ}
޶Zѥ,,9$Щ@
P8L˨ފHjAWs).|*n'AJ#	q'7c%Yh^%m&xaqFw?
C77TVdҍ-ԖLRň$7N	;TzȨG5[O=xjeSrMA]}lozn|-23	<r/pa]V>Z`o0Dt;*`@sHQ$|[;V7RVSHiciCA8f.0TA0Vc߁3q(vMv <)E?>zbP
"M梇2F:%fJ	f \a7(3mSMGJl*9>T9?4qŽ}-.%t%}`qz+O:]3}T^ݟm<N&M=b!wh	ռi8x1bV@f*q&!~="0[VrEGu1[.'__fCnjBdZEA'+ÐLM]C%il-FDdG*=.CZ8Ƶ}=uQ3ĵ+,tdڈ<eC˂!ܑL?_,iRB*(?s$wz\~q9?}]YYnssVR6Ar'SpF9q/9)q(*|0,B/֐,u zI%YdƋCS4
\3
Z$9ʹ"Gn>8I}]#G65\&P,BNTSBG\	Dt^>I$B8bB@-6o}K.YKSja4Z1R0Ɓb)F۬JbHmZGi`'|mr`|Z[P/2ߌяt5 +
E
Mj޺lĤ8;>k7.NfyZ'&l+ar-9c#e(OEU<
B0yE,%/vZoaZ"wU-LsnBQ	𛙍u\@[G@,EL[rĕ!&xDϞBK	{yׅ%zDݘw<;v06`h7TVwX~?@G1̂WfiJ[~*)>!.F,1%%2(Y;ֺEg:W4&^wfv#2 O	-6cLw}@Xᑰ]j]Nfe-.T'D]Z2.;l޲	.Z8֬haKw__]AL@.ǭ*Z|Gޑ6:w_pOz)05J#p{/ć~7\ꚋvGW\S=j1&#ܕfb~zbr,J9y7RG,d̊jPgC
ҺJf)Ra
[ћ%e;0d*y~\%HV2c/Y퇲Cևa䤩pyČ
zBXTb)(eʅ/a&?1OƯ	ha"W k<kAH{hOQ&Yf-,<ۓMBN/"!L\v5fc .SrGsHo]*efN` {kLW\
現0Cȃ	:eQsJZFOZeeBZDַ}sDǎ<ȣX!1;3LǶ6М3Դ[0zp</5(X@9$'TN"l[/y[ȗbǣ^mD/G|Wty#X@Vpa/H4JFR*@H+"o'SX	UR-Z ElQf9m6+v+nrX8H`hUb! Ou` TU+n͋UeO?Y4*M6h7m-{S_9+4g]T^9i]*P3{#jMjJpN)QvV7%bJ{r!zCĠ~!#uރr4NgJC1Q)E$>UnI-Uז&9m;86%*^/eDWsҨ>(`깱5(4 _`PX`.e'jҭFtWws[Cl 9fID1I\ђ[ʌty
Uu>|a 8D-j).jdI@PQn7Y;烺0'XelUOC('%r^Gھ7[+*&z̟a^H-vf[=xgcąxܷ5ON!hwzJ ddM </GQ<\VȽXpa%-b
0Zɔnh6ly(|JFIB:]c? |eK>ЊT# 2#N.8	1(	oomn " j(yRǩE1.v[EiX; Ɗ? aK7 ]qAcKH>7h/=hWJ"p#e5Eݑ.S0H{$EġC)qzX>z|_״+ =*SkdZL2=H}=Fc8~vɟ8b\>*OAb	gD(RZvU
:5ZH.2uN?s.l03֪B3_]zo%^w'<Fk,>\6-:guQ|N%8VU(#At:I/K@i&cSP;lpd͑j2$:3y`ghHLxG^vUwTַy>~?HCji5z%WT٪Ud.Vǿ*(h+(1簦Uku'0fP=D֫8cs\*貾dۏy{p>$0>ZV^1~N!D҇`pJtZ B uWXKAEnΪELyfiTW<el2X^<$H!i_S>=Ke)Lpt/>!lHlB\)#ooY .\BCQǊWSjijhUma	@?3Lk5$^,o<4y4uIzRI1R5ǐ!H-ذ+*H"Q(J}U񾧙U\nCPgjzT0'h*wX=qNTA ?"[뀥Ew}$EQO-˅\ѱP@κ
V&	lzĝ9;HC2#HlqBN5cۀcW˟_J(n}7}KaQt5Cy-T/l꬀27p1±8*]4'lfkQu|}q\OH)ۚJ$;O$i6JlkQ>ȫTQ;R}]P0S3q5ـ)G^&ߤ,9
k:uTY?{oK}}7~@oxnN$	_d,= :AeG4܇EMc/xDLL2
{B\N
e,zHfy  ˄m8x; ,~;5",j2C_@c26+_	_$%4E\NXZ&g^hܷd0!<S"NGä|fbrn@G'/-|d}傾ŶYEHRԸ謓% i2M8.&ͅRH[Rq/0yN\\p,n;~4߼O{=iM#c$7[ZY9#Bի쑹cj8|^s
hx8h$)~46,3)훩t"P70)Dں$&Z/~G3B=\kE;h_$M/f3HcAYǖ~ӓwi;{1gH׫28ѽtAm*5oyw%8v`yBƽo#[:|H E7FOԡXSROw={zG,1h'uk6}c]$!([\&aB7lKQ}R{4SɊ6"Ie<l: w&~P	8i["8$Ф.s4 5Ms
rg|	T\KHA ,^sܝ͆vMh   #k
%SBvYtց\?Sua(lgdRCe3u>/#q4p.ӫ+ !QXUT^Bu 	e\'>d	86D5S΀J}	,]>u{6Qz饃|lLj7JtGkSB!߰ɼulڽh,d7j:B0;4a5S̨G~
$X83fŰMBL'zr1<JHWAٿqgS9bP*UnIQuNώΣg;Z 5baM(DB^ SugO0% RsZE&	XtARdʔZByTI7X!?S!<ڌ?}PZqpt7܅G$Vߞy-!	wuL=UV̟{)Y0uGE'muqܳ9qb.㡋 !Bƛ/$ʁȐ MXTjI/Ay.UúYC#pnBLqؼG_t)oА9CbNW%Ǆ,:`9ѭON&*2V=v̷;vG<NUaD~77ߙ%JiB!TI`	r*S\tGc@S,(He7b$αUPda;C2,@wHS(FQxNJ1EuxwN1.HRkEm5Ģ9k={G%;<íE^B\<Ewe	
m ѡ|0T+7kZ/zBF\_'h3fzG`j-GC1Pr$
ř1
nꓭۭf?V>)m	W#:\օ=Pާҫ9E =@Hp!^>w5R2)KC8؀|54F|$<?NJ#h=`\CYZx;GL:3Bv +L(¯ؠtٻ46n-V&%wbV\L4ioeRt,(Bʰtc3F@+HGa{k"38		E'܍C
 af'Sa߿/&-6kz:s:s GgOf^kBPFτŊ谺yA tv;}~#L|p;i{ӽZUeQac ;
tà'=hdU'0U2X|:x82b-d6͉|FФ/?4}N̡
)lIhT*ni5k`˨5l] b${ex?y|G-:5F2+XJeү+"~qpxqpt;ht$=𘅷ħuT
$;*mr5=<k*| 6{i]EP&i\lC0H67]%˺PKt8Lzie9s
Hu-DflYhKTu#.75I0Ryk;d쀐Z|I)0s@a/C wmSSSB$~J-d,a> SFap~)
*'6Ws0ԋr#IZ@LĤӴ,x^"V.@#&d|-UWۈwJ5!HI/']MۭbEUA1e`8y"¾oŒ[ԗd%}beFmx Xq@{lpKΖY+ E}Be)Mh6TdWX|' 
䅥9L1ɴO5Y4b"Yp$\CY6 gXCUɺu!WQBB+j/cc5\h"9Rs+=8ʒAΐ{#̲\([#Y̤h GŸ]ށ}HIS xa7הa8ST(;_F e5D5hda?e!NT
ѥsJ	j&P1dz`#]X$%pP7La6)9I(Ù,7q/ghDTPpΫ,Lu6Bbs!w3g!	`mVs/Z{_]
o^ͤՊv0 !:Z،)}[ ,СIW,wT@镲㭰;}hqhU=HիL}?,ѿR"	_5w]/Nyh2]jx"޶]?/PDA%]C̎ܶ2
OD/1ք%N]eSƀVMb*ǚ$%/enS4\e ϕ=%1Jfқj}Xa9 Nċ#&RfHQ]J>xtr[S2=
UN'Spp_.lelM7TW
JetLC^7uM y}po鄍e~+\O3rRE'[bp8r꧉7v>D\tuH@1t.D#=gaBj|w*3PoU[y7+<57za ZQ1$]Xܝ3/^R|?~HV]N$1w-ge;ar6 +SL䵋fPܽ`镢goHV~o]UBgr (ի\RBՈ*C 6$Ё[<%Yujs:Q=䱿A?TPoe3GG)( ovK5B+k}|M@ZqME [Ox&r?92QޟuАfvC&WR"Bؖӎ[P9+]TȆ\RcWkpԌNWAaU GuxZvQ.꿨0V<*5ISe5b\.i `||TiSm,D32cxYt'i_;ar	McdހI潙y&lCUK쿻@4aĦk!{ckz/X2o\$(TƑ=$dKtpabXܰ)l0Vd%
LɠYE_^w'x5f-QX+c<A
8GeS(*=k{5.>%=wyxZV
I0[{uՋ>f|GWtt/oz5p/Y>CcK]3;%ꑺ@+Ja:5
偢?-xƪQk6m=_EZ|%8zU[-S%dX4!-[*T˔_[|]+e᥌k$՚#-cdMr m2^ӽt:~]=X`-0'THJR<"ȪnU+_C#׃xFXbH	9[wko8f)IŲ BIhmvJ>fDcZnyz^_ԨJ
ҟs߼F|UqDO]$
-c]|]<.ruVb4 괰OG$%kygu:9F{"z'Bue݉oˤ<,_.}ן_GǘRVBse4w+)NY1mLr8D0ۂ4^Ejv5&yLiNUN",\R {PRi0k7467@(`	Az%}e>BQH0wi먆ВVQEg7&K[4)Pdw9&fD-|ȞGڠi<J`'bġKM&Θ_{rkMap'i6SZG0r91] pvS6c]n9G7 `F_6": tC +~B5EW^`hz;-='t)-/|G܄c$[&ƹ#;Ǫ[!??ƍ	13FFYKKQԍ6\Kӱ,gArI9;HbU
 P]٬!:oil+N9lPH4H,V;Zh@Y?j*M,[k=_92#݌u: 9>a05.^:IM)Gf+Nd[nN C&uNޮ:#N$1NUV9o&I>c_,2%Uqft!o$#w,e`6F U50&IT\6!B*W=^24B?,e3l;s*"i5?;gfxFuyDSO&wcf8/M4TKS--Sk15?zDd9X,K&#ůV~d:C#, zගV_W_za-GC'A*nIoj^̱3o43.v?<su+XEs@9&CMǹ
v	;E4>\6;[|`=p?>tH+0>4¯LAbi|H?w>	1(?<aH5$@vyk¸uk+Y+"E!%//ÑBI^DԚ}jv)W-[\D+}.E}s2u;zwzB-,6Ea:L$rHؚ!ȑoxe<Ť[g 0^\4ۉz4.;s	GTT݀6ǸI5{-446tŖ$@ď/M<mpp2_\#%ZcGmp[|T/vxu>k)6
& 0]kI%IFrj˒BڧpLRq:;\.דNeœ']0b~#x=ٗ;%.Wظk`U9\*a9Awt gK6 ⳗq>C7i':Ѓx4B7McQMja$1i1|N~Q/ Z(
zk2}8fuP11[6k@` Ϧס5f	tov5i"3.w}n;M&w洇wvL@3w՝J7ުEy}1gRJuQ,NG>&nLѫV`Tp2lm#HN!}(q<d(z+Up$Ĉi%# QBxېa({CڿhB90U~|7'YL`<.4tq{g4 &8Hv"$RD`N\SAI!^ kܵ}y?OgfornCRKUtR}Gmj@`1=(E
x<G	|#J651	q`++n%(B&D߫k'u)u\$Тb )&TbP&#3
:XˤEe<&xX 3ဏ7h9mKN{ģs 4?pj]]?J`2Npm@MtNV4:
. gɧ#(MtL#ugd^NczAr#Ucd-M!OJ@@@'`Xaϫ]Q#X'1{nV~	D)uO{?a/FaLNAN2ȱ9 R-.g]n XG?;sA7*VP? 91"ϾptSMz RPLsbF:\.fPQ L3bj?H0o6De:u*weQry;E4+	}H/ ɎK6"VVUY_n	::%:lq^g@ꁺN5G"M- ;ã!B=lyܭ	!1}y0x֐Y8sRI(AnMbEiqH
AH8	oM#UV"|bw)C [ڴj~?4lsJRFB&rWOn 
=عv-E(iI&̈́Wu9yxmk61x$a)$x_&,aϿq{~l&:meG*1ȺzB<R?{Ƒ_fV	8$,\89V#5бԭQK2ڷ]Ւp2snÚAꪮˮ]l9YYfKk$w[8(b8N"DpH2(QO_>K@|$cZm|VúK7Gz+zӽ׻liQ~A1JUA"')_pՐYᛝ ??7ߝOi8$2]CݣH'UvV:g䫖[Okyc=RtBz[Gy$<&xPYbi!쵐tZg=#e;ardw%!y]l ~8
!9QI^AKR*vT1Y4Bq10e=N(
'*eظ$ 	?ÐyzUHwbW[3-K(h_5CƸn3/ٴ УnD7zjL{j+@A-7!!8i(H3dȂ"Q$x|9y{ZVK<[TOD(A5+2}:q"
W:ښ1M:F;b 6Rm<UîtKp]2I39?{R1tw:`U~
~3kj5#&2S*޵4
ۓW{}A+F!x`zZ#$!l3r:`r{p\%_SWknL
Gʝ'TY݊$sֹ߯&|\}{Uos -˛wpd̱OuG}߼kflԮOm}!Txδ_y~t$$
7YG=</:Rk ]Z-_Zc˛T
&;qekǿF_pTp	2ԥ2ꛤK7O4d(d񳺨2,QFJ+0	A6ų4oks\13̀ԫ0`3AA#8$ wϰ7P;MÙEm׊Y,|cOhl\_Z,nHdNy!Y`\NE}'xmm)KZ]`%vפh8Mp#	@&Di3OJ~,?As`g~OA*{9Z!QG/r*C򠓣x9lB^guk: |CA%ݦXoٕT9`ɺjAU-@8tV˞se9]M~|EL*ajF 1M$II,l9r^!..`k.F?т|8PVL,Y_lxlI5J{đ}JKj5r@1-Ter5e,%̬I\h'ah%Q+EA~_|{:>Yo9|ع9k,y>J6dzPjKT?O<+!
_s#o8I8G_wdjp(M//':S88U TP('zcI~_[Qw4p\3CN=f*&8?u
mk>;{kay{8J?Mu:!qh2Ƌ'uc+8jZ/t".}:P,MB
$ f[r:gֹ̜Zl!+oV(޴۔]Sζ7UIʓiwz)\`/bSSLX${C707Z$o 8kKB븯>?NQ+|5듛z+C47teK,ro o;拳6̿hAۋ4yrs15YA,k3EcIƬ !]q^!;iY/aQUݓ״B>=\w)?Hh4"YFX=Ϳˍk:6CU;fI*,`uLܓg$aV;)hd4ʫKW~$[&1))4>}c_74`I`4<}vm%+W<<xI`ԆX]HB: E5hp,[gXʿBTojɡ΅`t)ڷ`LP8.<-iD4!Mш
<}؈TdV(>W8Te8@X-=tT /u3D󣗬Φ^4E<+[s߿כ4f,y+$%
P_"ge\b	ڋSWp^+85CAAHrTAF݇552GlZi2/9@MtkIo56nAʪv6^NĬ5)YJ+!/OWW-mx+	*ohKW,D#G4l(Α$6iAt^OdSuf?`̝E*A٘YQiXG0^_ECmffj;-E&[|>j:lp2o9[Y2[&!JrXI-oF&L} sbv9G9~}T<Q>>nrISKN KmzR,̆7iآe{i0:T\hF6Q7iZo=kj`}֌tIۦVr1;Xb;%;%k`vVϋWGѷb6oA֪$p|o#R9P?8 $f<6֐=uв4;=PB_
O#n U`[OK!>.KعBjjyoFs.Ѳ&ɗXJc ڃlžȐH;tA,<HRҕt,ӟw$B$&#?֞-[ƇaqxMu!0k/0pZn<awa#TCVC|ܝ&o:T(lLunwĕk,ʨle2Tn=%!%N  e$cOoһ$mA	3T"IYFg$KXtAm6VZ35sfL$w+Vڻ|>[]6Hh̩T'sFVG>492[Sn!kR)UgZHb0^;ƘzWa/)}p.e{h~Aƴa21XTCP_hJy/E{ǫFWɂFHlHPz@\WXzX>]bqyX`%4-ijYZɒe
1~s4p	1e7WA,dt qבDZvc?ax!,lq6NAGxZF,jamRlGa_h	>c2oE '4W2\N.(2>Io_ vKu'\V]%UM(?fD9-v*7Аcx;b[?+92]7P=Ϡ5qZsŶ}(Q5kjPLVM^BK\RSlk64(M=Cy@؂Z<$A6qs[S`3Xf!LFUvn0^yɄȻJϰv
Ѓbg]@%T*XIN
L${=C9mq˗y^Q(>E>q?>xk<ENj	 `[,]iʙw{xi3Y5N`,hز-Pw) Ʌ^i'ddx%IdmOswak366lKvB^tl"6'~rTX3<^"m.F[bO%de=MQ|:ܭ*P1++*?C-"t0RB$4ϴVZ9)ESepxTDEMtTW^f@;VeA;W-۵ME8*hc?':utƢ,t
zTE\XdRCD찻y1t	OBXT4*{:T!1Q\5
a OθGFY^]r{%)^9#ga S~{zl ކZ\hk762o(lFkAC*+32b!	p3҄3Z(*,kqz_B3ʺֿٶ7^6Cwz#X-y}aVٜ7z"A5eQY>/<BZ<H/Nk!4`P{#ܫ,R'B  @ h.oßkN	pJB]GSmIX6i{σ[y;n HUmrhԌ[\g=LSN9zj̍w}Pf'?g(#~0Ǳ/<_yILT~"HTÑ#T\;#.	nvHq޺0Gg\NU?SsYe)`ZUWPRľ?i$oD*>y)J'? ϫS]tg-1.+@,(K6YаN;"|}AXh.6r0{4bkTksRXqdͪ4{5bI2cC
BW4b}tȣ/>&cQhk8=2Xd7hlT'{LxWڀlc_0/#<w#l HnMNP]r9%%5=X#ӯ:JZ/<-زe3rzKvHyI$i*qzd9GէA|rStcrM1&^CtGrVCDTfG9	jC[oQNhM,0A`䵙EaBA]w Y	
 sXys
wkY!#g҅<П^i߈𺇅kn/>=/~S:եftY<|k55c-Oe96d	v)N`P#LvlX4%hӀB }Z8X%|9˕?{eg2d*¡,`(:5(J}lsm2pڭ'mKw?|AD^gy/3뜅ofY*ʼΓ\DmAn4R9jF)ĕh>$ldSwlsT$[0h<%\Yz~qZM<_6|ŝGuzJ@v>($i7	7-	2R9WX?>"OeקW_B}qޞAyA$Wڪ3&}ʖZYACf\Gl],@ ;.G?I0ZPN L*[l@TjڻVg-bs,Fb krAM:ZR#=3^X.`?n|	#ZK|9R)B[Pvm|iK]z WU&e`'dy'mqI*D#c@=.
(Ö7gb "Z#DסjQZow^7͡M9F`W[i#͞hG9ME^U|rkU/UI_;qNYa4f>ޅju'uZdWFa	;ku$_M1sl$Ol):T030.GpI;mdUf.w.So}cRLifըD+ea-Se`GvL\MHjY0@wjwڃ`l<>:CG; ۆՇIIa7lblzǳ%&Yw̖&cA$.aL#UQLpkl2aΰ*dg
՛O&bԎV\(EwxfDK/ xLL1OwZPKgsZmT'R?}b_xYqxX/x-rCH`xDCR3ԫyTBɥkx8'`^5(kCԇpllo)nQn0c#?J{3`B|5,JR|H\hIS6R0gOC%$+Sictl,8/)J\RA'Rqk(ϥS~I7Ɠ81&!WThjg<q[qx>ݜO+[~7G.<ڥpb94Qom%8Z{H89WڇxS)ɸ'Sj!6 }>l:=ˁ0ѫ:MFx%۸.ziN.IAH6.7YL#LWI0 Pvʨ\nqFsXB(En8 5vCO70οM؍+Oe=%~#*'z(>Rv֠jcC,yCXhhHqi֗B*?l9eI~KG$H|;?󶫦Ѩ Fm;+i Zō0>,/F"y:	U1n*w{{r[
"܀2CLmC{( UŠ3n@[fvV\~+ - ɸ`̥S#|_lԥW)\O}{WG-/k5M9_D$z{,(	kCzIntԱDgQ#pFH#&#
D(P@(TbГ
m%bzyaZn'5pŝ K$ }Z)/@>Ys0b7fL/;wg9/śG6.Tz})TnW?C^^3G
5$=lPУx˿YsW*ve6QgpQͱƙY2D#@LOfvczji plxw_@n4 }+#;#`8yL1O,^Nn# %)_߂<ac[C	?#錭)ӗT?"E"\N/z^]|rq5~J_|z߾spxt'goxOol>ow˸'F99@	_$Ʒ8*VcL۶Aza'tIk|in>!/Ws
e\;[K\KplTBUVWW4dBm+n&Bb8KKȔMӁq>%%0
	C^χ/T`a@]Q	{+})[GUjj͈&.Rnm!X\tweAZh V'%ZRݎy/rpsP:OQqrq~\47eWG>yHHWQK|gW߼4|74cq:\~grm;:QT(3Oc7ukYzUEd"[\Z4\^Z5\-7{QbfI*dֲ\嶋"[Yd8rӪt JNq`(rk>юM*"ܣ&?XW.xy	mZܭZrClnlMb?Q?ߋ7J5J76r]Jgۏ?g+_A{VBSGaa#AC,6gdnF
t*,'ĕ\ʂ{KAT0&F'6}˸$XZ(rXv?J]?(ml<4LKqPn
`CLI^pmUyK3_OP&l!cԃ%zxzX>D93G-!8SR=ҏ51%9> #0K?ܦ=ZUµZ1stulL3$O l'	Nz#kd49SdOx=S$ym8G7dEY_ H3C̵d Íojw{MwX=0F[Fr\=[M"1N3?*[> 	ADw3iِwy?o4ờ'mе$LO l*.\19h3[d^5:{vBDQX0}az:Nؤa	g}ޓ0Dwb[ޱUϠ]OݶЅt֩xԏu_Xs߻o~LD.xvI.=| s4kJPˮE9&,CapFR:<sݲ:hvXrMmϰ$~eSdS9q) 2_!1W=elVu˪%9;}YS*l	 6Hq$@{96`K=6R^^z=4)ɘ;Bu*f/YW?+9BCq<Og>x
s~mvn~(Ȫu'y_3ʆGG$Ƅ6{RVls`{u,l}Iyo_ٴ1/zJ
y	''= J%s,#*!Vc\Iնv.#XuRa0Ģ"6AN/_g̓N&cq)c-.0}glBUiA^1q@t!mxktwl;͛ R4IOcȇr<AJb:ɪw֛Pʤ4 )ХymrQ~ǭ=0<++U&b=_!8ڵ?PΞA<vJSmtiA'?lyOm>[LnZocL.Ѥ8
 者\h蜍Mm V,Aad $Q)qo(dS6ǿF4|;{=-'_eyjГaV
~,{uh_'Bݼ%G@C8ܜ~1=RkkeXmbSa[ᩓ
3nVAmAL:To0ʰݼU>ajǹ]ݑEa臲H֒t5]m_XZs9WbwF@B0!ɲK눲C>4v[v	+`cJ =dJ<3l {'ѕXcYB>#jk<{B#C6%~~ֹȵ(anX!X۳lbG{maQihflpѩna3Zjb`ЈϬF&@Nn{o#@=0>\rVDp㽓;z{rͥ:>F<?\wu!qbiw5	d5t-֗mѶvkn'L[뷭l "EbW/#@f♇G!ӻ1Y,Mpaku[{x
;娚A"2Pbi6!zGS#K<cv_t_ttGfn(wT̧r2M C@"|Pqˈj5ԶAHcٝxL{yGmi?3XMGf'w2tOLtD&eVnoB[a)ݬ~<^U#58<g-$#WU XeyƲF'Vp]"ɣ揷{[M%e.p6d-Ay囚,_nc:(fi{,hg~Β"$m#ٜTm<Ӳ[>=k[lp=b3Hmz(ҞN45ݸ!&.
I]h0OGӮ|Un/f(I%N|YooO1`ꁩݻC \dIԃt>ZzKZ<ZT 3Ã/D\3Y7G].9P{!$NJYvb@v-75z$MM&4; `g7sbbNޛ~xNnv
oOۭ_~$Zd7+&v_
1ye9*X#[f1bBXKd5knZuz,Y['A%*|~x:ΊSasQYYM౲(cލ۶O*yBS;1ӳWw;^%Tj5m2:vA[[ 㟾>zVIZ7__>d2"$Mfrzww/G1Jmh d'|~~`f/lb9*iڔoalۂ<!p`*
GPk7GSb7Z#o읞
gi`7}&FF!e/6С7`7ole>95gbV zf`YBu{FG6'*=>~^rY*4M࿗tycη:8z{~0:Hk8.=/E*&lχܪjC2JYIۏVm6+4nv#/xUA1l~M+ّE	|P"7vW^Aʦi n0Me?\."R(槹D[)R^8E|"Cp,z>?w~ފxW.ŧb^Rֺ_n|r@zcCKZfB>Jeg!͐%Zh6E( קEVߢa_K?Nare筊DGJ&z&'HO׃{x5q.AE^Ѝ2#hCkbG
KH\Nԯ_t_jJO ѽOa6Ax+U4PגWP$4>V3\`o$V^Fw <"&ضSS*I=?keugoi-?0.U	`@J&#ù*ß!X|sgî#$n/u?@_4Eqʟ+th{Zu]KDJlUY;o4wBw)YddǧGd\|xDN)rR./Xuȹ~5(/ЬU̕0qц#l찜H*(젼aS%/2)x	QD}} Bs%J*/":1ў+)PC Gz+4KK5]J`#nPa1Rس">J-I㐰|z%derS?$Ch9C<%t:LR|;Z(?qF{g{ 	8-9e<ZvdǩE T$+ID2'"]c<eW=L	^HЄ~*,c@"oߞj
7<bCذ,ؙCw[qF|+˭^l6)M>xL-oD?&i5kP	'ɽTkӃ"(i.^r~Gg/,dkg}tZ)<wxExӻ*HߙY[s;଄wx&uhmJ#Sך
׭1qGb+t|Q6d?"{PGx"|уY4svX&C'Y5｟8hC,C#-B۬./J)_3^A?Tp}.L-:I`6$S,4YJLaJlJkGT9 "FPǘpǚeL, "G_xH@K*O&˒p.?Z%OQ	{^bi0j44$	XOUNd??Vb	/i~wy*=Ꚓg?`m 4hQk_KֳYMLH4l
mG*K!Vyy5m}=Yb֪U79t/liӗDOy@fR(h^cCNb|=:?!IjPy/?X\ Z,ɮXlk;ֱW7Zk zƬ",ӕ%اd.[-[8:zCo̓;8gZ$x$Ab?y}_%_O7S޷_>}"=U:SBGv9/@|t0N[zڑz;f
kxŅA/ׇ$K%/Ũ-E-C5Ւ8*T.)	d@th(%_b 4_ÚDNn -47߯xs6K4vm2w58"}?;rt(q6 JFIFD 8FPI/RA𯨻E~Xb r,.I/_"0 n&TE)!>R-e9< CU@TeK5tBH%%"7AߔwnuQl4McOQj^\;p勩d|ݲ-	];x1tYEl?@H! KKNj<PNf45sVii~U'ts$8-n<o 3U/UuPɊS*ސ^_{ b]fMjj	VC-bXcUc.d*BFl'<׶7vipp3T]D竱?x'G^c2uWsc=xaFdᡙlE2o-]_@&3?>]ÿ׿ˆ/"]qn+W
A.K{H%VіmP~tQW~As9#iOw#$兜t7J:_v.vvp^4yQoxC3 c.i|
+.biYgw}" .8rN`jtաBVy7a,rh.;*B%o^ޛ:bUW)׹A?9# 39"ުo7OtQQ-KnYMw7M:5g_YaaX{%GI"
 =CZ\ B){xQX䤗&	Er?ItT샥^ǽn+Sۿ3\SҿD?FOPwIӹgw*2ݫ{h / fp4 07	
ÌaXbCXT_:ձ`x5|_$A	q<8]O=(Rw. |g5Y?&O_$Z<*%92?g=|{)Ȕ2=w0*e/zI(5ݿ)Ou/>J_vIWEi |t$6F.1MgbvyiDgy2I
z:0P#˯	;BB\h`.Zoyj|T :O@vÍrыYQ&!v$ޠ瑛	hqPEb)}KV@F jǼb6<O{Uѽ:׃u-+uO@g>!^<9$votYc}^?'/E iMZ^e7t.5FQa3ѐj/yݎ[
DACI *p-}$g[I砺jdV:"wz7}@l>9>9TYt"X߷qVA-1ҶySouӁ"B^a>"
ҧJEcR<D׈m,pΖKC;ىSpTZ'N;/j;g$|E'3_#!?6KD&ukO:D QZ"\6F;?@ Sgg.rt	Zjxv+[$3(R(K8!1)0} bz=N"JqL?[~,[~CXi͍t4Ƶd>1(BۚGSAaoۤ`-h-	[d^+\s,%Vj_:	yC_F>7+˳-UB|ѣv۟yϡM&C&P̊m]%h?{Iq6n2)3m$zՖ\.+::~?,ęJTcx,,)zlySɬ%|[ׅw;[WӟN.tsHg޲!\-gzm6ro䘠\5*C6;ZD}st
iiT};}@oZݘ2]Vօ5oO^;1̕!}K |AvH,DUs߾ufHK
:9N>sΦ~;6(|n"za#ݧzgrHPlRJ<d
ڂT4I=FΚ0{O
۵G}]LmI+_k17XЯԥ`  h)b&vyT}w^G*KLnUQutvk#
Z"l򒤯kɎs"cX*7]H2gO8ıu*=Qth`
m2(?,odѼ~`* y6iwb7_z"0^CW7Ể h zFe,JȮ(WFe)nrHˏvU'_%/vpӥ@M
΄9
rFcA~;2?e쎛2SފAW VbKAEEWx[FN|`(fWЁ95밋Ѯ<iiQr(<Klſ*@mto7V7dn<YڥO\N4A3%Mݟ߂íJ_G~cHk
'l;E~k;+gt.d3YEV*S{&E8LŸn0
cs]~GkhW}iEU(9@
_H|tb:+aaLKs!pbMI;aagp}%YGl[,Y3^9/dy"s\P_~Myc;x<A4` W/o#GqK}3{]*|QaP"sZFޏƸ-m7xdڏUc\.A<ϭ䏙YAܹY?TF.a )ƷZDHc>!Z0|LB¨KzL8PB
4^R~dΪ9F9^dW6ok G\P3G%ç`h
CZhϪ8!#~Pu
y=$q3	S%b'zo,K*6j: 	&YLmGUήmB͟IˁpO*NBĴV1fIÃ"e4&/-%1N-M5zixFA$Lh\!iHW7THm2Ka:MpӧȲ(@'O!ε쩪)1q%g.ͯB/	HfZ]Pnc(i6ROU:!8/%4paEF
<@#	+G<!U"}w#M/'혃+-}fS&r4ӡp7)#4eu8/^7I4̙ ږ ]Pn=Yz<J !{^dD<0z(Fǖ>lC ry&P$Wtx&uj*jAV00GJ0\VeIt;Fߙ~fət~,}FSdr)YJPݪ8e՟;GAS|m7nQC ƭ?G}U@ax|ڊ]\T»]gcg 
C?V__!?,[jL#O3#e6[JAcNM30R>ITe
YR1$.r|q${f}^pܠ@0mCؒo6#!q$tzdVtB5mS"F`*@֑#:?|y8%b*	-{T!}-vmzSy-+o~.kX8(1-[P`AԏR %6^((4WvPKyf	OË

+.oQ7WmʹZy,X.R\<~QGyFOU}W`}8lI>UKV*B/c6no|ٚt:6lPi>ݍk+Yq/K)h2	~jQ~fn9M-+Y;}r`]92Weٷ|<YaĹ27p/U6Ė%9T=%1o!}k^{=Rbº<б̳ͱZKpT`I~5-uC|Z*%fcrI9$Τez\k	hNسogH|O`|$7[h bU1o	,=b(@NWV-tͷpnY *0(SB\j+I-(S(N_[vޖv|ۜYQSetٳ3J6$ 5e#Xs8~K!X4tXd]6]=QIHiG7 3* DtKJ'L!zjJ$otX>E!X-\%;иFYOrE%{11Ŏٯ1VߕPF*(
wԂڭmޱԱ|)~w~PҌ/	d,QSPͻ$eQiRFbx D'&CTMGi<p0ӳ=<wQ[T]M.=UKl0U\͘'<|숸i*wRS%oɒGmni{I^б=\Cp0Kk26$%?Lrf'|eM/CVAҲl4Ġ-4RͰnnlpEytV	^6vdVi$gTtAmOsc-E;ʈvp/!<mL~2?*5qf<36ͥ*BCx^:f fV|9BcU-$W;RAz|C!Q$L"N~G few|*j'/#p%vC?^p{I[wB\㻖ƋH1MzW%pZ6ze a[\@c=L֗oS>F	Kңy|z*(y;"2>:<YBh8mջ+X)P؆*Q2AWrNGM%*>&(.qrgj}:]p?ʵCeIQJjN%Bj][q,?h}l`+gE;$,?SW~-sؕVCBZp6G$F}Q=ux8b1^k4>+zaC[1h2s㯃yy-΀$ԏY1EFSBv O98N>V2ǼWj.ѽ̠z̕F4HsX"-.עt~b)Y}:Idy#kN^]31cqeԅ:ʛ2ھhxE:A#,kHa_
F7ֵE8<uP]=dq!=$:k&G'-;a芟	yx&<"y+qRj]6;2YqAK7]s{3`npGۧû*Rc_5vq{r/gs{Xw߱\?D!{.K	b"ns3k׹fks"kaoYу^twj{<:Qԥ^;3=q<J綉綩?9d{_Qi/YZ
b!͘([螲";7^2f7	ހ.[溚T)A˯cm
Eo<IA7\YĎ}N8ʧC\'&PA:_xǹa-m19-ay=B#4)0\Eg܈BkG|rHܧP&AZʨӀVۣXG]}nZLH!d3FZ7dpwV1~ 3r]T?.GYc4j&3ozĩZV{{)̒]E[Bn;VԦlT3.e/_m lyi+&.k 3*Bnqh7CbJ
]!vA{7|u6[+=J%N?g=-#&?꿩~|6HAg֓1`%WWLS'?@'{{GZ8=RW?Iӑ8,ub;4vڧ*&XN3vO?CV'@ېj[{]=<7KU*;0	͞qx7eZՆa>:9;Lbk3)
Jgq[sW0'c{G];)4)J;ִ望S7{m`- 9{ZN^(BNWJ7j&Z$gËbYy9f3j?CeO;Ft	ւǘj9ah>`? ۽M2ۻGo~R Irr#)8_7 Q"kIn	K_;1klbL_%n<]"PWcik @{p+&x"pOˠs*͝RTB6gs:VkBB$Fo@dXEA9Jo,t@]HF[NGr<Im~#N6_!Dq֟9d(F?oEClD+n쳓AtWF4OyF	1ڐ:z<iӑ)CB~[Y%x(xAhUjLΩq
#hYJX CzV$˕{Z1Z5#~!D?dTD1
j3sov7=t{/j-3mBNՀuj~ϋ?YMK	NtnQWܠx1,^ɬK.j2o`9>coѣ-*2ã=]+LOu|D4j3!-Wēq+帧z-8iuRJ%E1	p۞fxĆ!kd悷0$AhϪF Ma8ĝ΋FVV,Y9<{vCsY,?beF㔡!C#mQ^vJ.+"Bxf`,,`:ț|>p4F%hs<YƳn^s13*dd3UZHRD]dq]Ҳu흀(_$6M,XHX70eb>SWE}6.U6$nj~i0TaUώw,_gg$XJȣbx2)!IW9lمɚ@:`Aֽ~Y遳!j%&)c2:lw^#2^$/qx[}d}5$>*Ơa%BKoK^5G-%V)zX! i)3_׵uf+|q|[qZyC]f?3\0ݭ +s7JJ/G"{QĿs^ZG5rjt/v~%cEVn_ۆy>J8i"-5% nŌڼ8$vEWZzZw}jm='H:!CжVξ~,TȫjP^\Wk$-Gn3y㽚^p$kLhC%z[֏3u۵=G
զCwGw[9Z]@m Ptcrprz|h$qގ+`Ç  qq1TPEYk	e
u WߐUJ`%8J *8
dn~a)+Lr:FEx6Q0I+	z?{|5q3OΊj:v24uc{&.x8,ܷ&V~'mwBM,3I#@M ~Zj C*iҶ}r-7_`-Pzv%6ц.'x>ct8d!A,.jiN7</"1ޒcA @HnP5`l1DQU9MfO"m.x~B
SZtν0lʼ`/Ͱm'Yv)PXr*(Y3Sϳ>93ZnVu
rCJZhoڻôboAQ`]bt	
a`BV\ Cj>LQ#Ub~.++t&:>@T-ÿy6pqmNU/FHi0-6bhqÆ!Rp2L@tq'ž3!_#d@yZM[VyL'a, S˗[ӆY]=BKz<oY3ᤨYh2`$l():v"Wxj*jYظjLǬe],͵HhʢތTbH.tBM\/\W4
_%\ЪwM):LFC~Ro'1.؉1Y	g@`yL~>m<g_e>;[GP}<twޥXu|=tS L.N@ւ櫝؉k5׍6_eqf@:hǼ!Էe##Gn3ԱB<bY @Nv݅rրã㟠}@Bwb&+@1JVrp$ȎE'HCuqņm9oGZ{`܀]=>98:az 2as8l0)1b?:/ ģO
-x_̤߯j8Ucyؽp^@ !w3I։{l=ve!G	ϫ0~ʂU</q+	|w5RFi	C-w5ˡ|l.%fԈf߯WxADrxxt̽) -
_t8>~uu.3e2F>b(;ɄA
08~ O<=-i(k;Vl;28ͥ`PWÂXJˎvVs&.[IYQw_Y1{xgZFWE>g|ouqr^fg<	3|4Vlnu/@pupHEXH4MO9@N*8𨽾gi~{[K<Vѓ	xl"vh3{٠50TۃNϛU\OC}u>Wбb F˗6fb{|I-hZX V.>0qPNҁC QP@ m	A3(mbE?HX͒$|9PYyuC냻XeHfy$(Y]6! \:VN5gg;d4ߗ 4_moszـF\hYsZnMma!ހ>Eq*Y1W	ٛ8s/R[0_dS	#h_iaǒV-]+Hd'o@և͐Քإ`ξMqVn``f%#lbulϗ}o0"58vvk.5Dd2gXh;9a*f7X@'?l{W|߯ ƾ:mPj={&]&66߮qKH PYnBsɃ`Ȗ%023>`\^9>XBT} biͮ#L\y\sO0@wRrxt~wz=t=$:$WRN.9. l?3fȩ{.El5E+Yc)ԑU`[_ev|1ݫSW`eev1Gi㛥YGYYQ^gHcüm_d:0=LGf_\ـ+8j<J69WCݞ-X2Bq0膣|}c*0OANm}7:*Bo/CG1$MۊaȪ\Ǧ0aMlmb**~n'ZlcaPU9QU|v^s=9:Ea 	p/-F)eJcbVE$\maFvڜ9oJCCӂM6;8lF	KJPCgnUi&`c7͠a`LB_=? 'DF*H6@<fц ;mpwpAGm,hKZWx!z&7L_#U}m^,ց^]`sġ3GWcC8vV]BLy!%b>KmKYQwd=Nr$@ޗ"˦ 5*	4h]+?qfᦥfOp!ORPPE/~9?12|I9(唋_L.
	)&鉟)L:0f [f@rXyc-X_QnZvԫ'+,LlnFvrF2:Ig5{:S
M>n^b_fuM&?uHv^pceKpy';o5[q\~D4x%-ޛB!$i:%t8$%:%ushҋawM"䨹E_cMW%RO6`J6`0x7%U1VBVӋU_1n@@~|}ڛM|kj\N
i)F{Fc%5`QWYHB*MƆcyp@,`f7(·5(YوMM|F5qN)<Xג f_\JZUldǊqГ_	W{b:M6ȉ5lr¶PP`W+&_RϺ}l^J6]K_`%k
z'\u`c`Q/Ht-|(NozU h_O:-Hx <t8ɹxQeGӥ/k|LWs,"94*sN/~~ogTuӂ@s<+\a
0 3	zZUSwc[lpqGtsJмuhgLs7Eo1#gѼWA0j->W[Ko1W|͟Ϳ߰R~:: ͮfF2RHFQ{|N2o3RW,F䍍ͯe'bv41at&Jc+<7'	< 
)v[#~dXBK~k:O'RJFVOe[1NKHm{Go3w 
-ZS{1hOtK$BgNô.<I%?`%	LA3˴% E<I	r9iݮ#D?yq
gyJˑ<H/I@aP|mŒ$W*;\VI`c2`\&iIujAi?kIAyZK0``ŚQ.z Xð͟wr9XP8/g@G䨒{4/^l\ܢw0{ax?ly_n|6H)Lȵ
48B"\h-4[אq-"qdKi! hɽlw$!J7NsXn
7݌KL4sB3Z",	aD.슇P`#쵽)HkUȒFYC ct_E m:'sa5`Ni^ByH)[$5/C3 =Ğreǜe!Blw|8^(p\QNR~\kaCPZ6eRߩ:}Lqvc*R,~ٳ$"9;A5KU&7iY%ͩGPPdFeN,|'vvTl&p@gڄb" ⹑γ{Fg0{OB$i:;;sIY+BFG%;X2{@kr] w66cڸ$>l9u3k@V(}Z'UtkCjk%QKz~0r:fAY&ːYLGm`gxt/B
8J@JI{0$i9jr CvЬ#(V馣6gƛ]e>&}!XM~|F@Z,w L} x?<Q~_MVٷH\,(%Bs %&#:ElyrK(`u7&M&pTq[y/3|> pBJ&	Y<"2`3Bg5Қ	IE=9zG7[8ǌl|ӳ8S\䐆Gq]#Plu4~LR- l̻ 9OT>fYɸs~2ei "`3:rܭ;t'L7<Fr:[pZ8Ų/Ia톮3u(嗹b9%ձ/WMc>Bf9?yrd'<˼gDj)t@Cb7`SϺX,0z	6&s;MH#à"ZO;;3tߦϟ^Ɣn;oOtyX`yXS7xL4u<-WRQ1!xJSϋM?G1}4.	{w]+̶@9U%ֺkc>gamCF/]`|Rgܟyì $v)ѼT~SNzc0@Xl`,CNh0]ޕ@s42~*na4~P,WyQ`SNR2gYMI4ӊh@VX=+/rK_0WrnW*ܬXL?D$i P
ZcA>ˋI
V$>9D5(*!g;RUf?0té=}/ ץQ=H0ǳKǾ4#!zIG%;z\pҫ"ַ Ax)Fs @lw˪v(X@?vQǈo
Ս}/@S>ߧG#cÿ4'r-gX :~X+8NGi/CA&^d6ZC\B)9nK	ӍwnQ$L".V?L~RKBOzEz%UK48ڠI Qy)N݅Fi!ƶt~23,U.ʲu=ϣ{/p5 ;'m<mz}4qy?_9;/z	+#̓0'46MקX-;ü=%#xN' $+*n2ʓ/Pyhv66٨уI`I[MWPG7;m"`ISDzr,L[s}1L-B!dקk31VT%v0cMEYAZdѻ[$K][9zgk_1gTיO?چJބZA(~]C`JHZ"]A$o~}tzo.Y:l{*vٙl+_PgVQ+sղ7+o9F33oiK~
̅_/+k$k\ A;HF{LvH$ك2IyǅSd_
WV>B\ > HȬlj]arKRU2(2jlof#OC.~>I7q6W" DU^Mv5B_, 0O _AbGq N> P$9z[ҷqqBk bLo|s꩚% =}yHHdjg 2 }Q\nlK4LqfGຆ奴tO`NV)Kw	d ]Q)uD?*mg-٧l¾Lb/~)%:mNVkvbctbURѦȕ[aZwF}hcg)Zq
@Jݓýӟw(7kFJMX-Z2pTW͍(U#mj_ x7GEMNf>}!YK:p#id]ǴM pL't3_cP_v ΖYIO#UguFSYcbt3($a48@C O\4 F:ۻ5'o3x2S{R*cQ-}+}trHݟ9S~FaoUͳr{jɪ"HJ[?ߑg?m!SƯ1FMǃ2YfeJ(x_pafӫMy7ɧ(<i t:%0eY r49sɍ9!.,eFc@@V_7:awM|-EziY7:&!Йa4WA %rr:1/s^Bx
c|Շ
OMIԬfo'Oy0)}u_0nf3倧@G_ ]˨ѶΟ!y#XQ'9sUCwGs#\10bh"j6=*p`FCk*:
,^-yl7>%w&!<C|͟HVUT	bjk%fIRP[Ft؇'x&_l2/7oQHݦ?ÿ"{64"66)<üԼ.aA˿a0oQ^Ԗꭱ'05s<+WkCl
^mRUܹ^ṏy9H!Bp12
,$ECF=!~*3虔$j,N(䌄4-]3U{3!Y[2O
쫢|NF~K;t$	3z!Jxze_<b{N>CePE+$$8֝!
`=7"D5P)(݅<$HC}AG[	-!@2I,wyS0HK65:ň:CaRlX<X	ynQ>Xw.d5B i؞XS5
-:dsV-An!k(<nOkMVEw_hF_slNFBu9$U+S	kĵg`ܲdRu+Q12&i]txOhx(=<h=PFh8@IUs(eUѺ%b!z QDB<c)\tJ>;GUm'ީ@Huc| dp 	q`t9cָ'#Nfy Y҄HgEu=e6`osl o._!!6~4aL%Hd9Xjg!xg{17g'{G?%p*݄ƞwworO>w#g^H̕cDaY_VX8{(D*ߧBxhke&b΀zm!pMnڕCB/FW0D]X!)N4V"Bna|		%Y@QGkvo׾0PI9.Yw x_ef1/#,{1m2l'pw7}O83>Jx"aц`5Lڬ;K8-Ff~_*_æw$&t6aS7u<K$35'>jʛ\>ȨA_Ey6I#:(i5H&riIQ)SS	)-(aYד-q`Fphڲv5/fX}KgVF;"-ܞ+Gg}trL6@>%(y"5t?SuZ062(BUe!avI2]pc |o3gPJ̮1)t_:C!M*"N5<ҁ>ƐC	9Y`lv~ &<D v,V( pP:(.o kM+AnŴ؎ЗoNθ\e2IލA	B|G1.c"X@/.:qm@[[ѩƦc5Qdɥ|;+5q%QK4"{u'~S\b9MY>	5/Zw$cӕa#W/"><laDX*@ЫCx̸:y|~w_yscC0QY哜|EؐDM-cE5z$%|3r}_}(*QvjtFdA&46H_`0gp\CPZ+_]^*&8I}ND>®zZJ,IۭWqAV7mflmv?ɫ sB.Xg[+vVjzAגC!^SY49Qt!8dshԝf6v}c6YxjS#Bc1pȖ!
Lр+Ӌԣ"
2E@9&V]kWRsf=1SywL/9i2yX;Wuw<CR16X4n|BJN)V4̐A1!<=z6iVS(] BPdj٨;}+`COT3/uEQUh~T²7]= RKu`U.aZd}JVR#1,q~&eҩѵ3 XЃ1#x2Bԅt4UP]$*7C=@=`ԬN$yl9oo
g6+Y#?:Ale@h>%҃(N:(6^>r=!ږbf+#\$kng hgjG{Rbk3'|҇
nSg,'@Xj8jhq#C< z
1;i(kT0i;C 訓,jő]CxQ60a6/k&pLD插JJv;bC)+"gǏ:ґFbEalVثM^{Mt}a;~l!1d"8-a7Fcp**sR2s~0UɝTY<iʢR%\eP>+S-7*iY_AQjX0"#rB0b<IZ.
QZin%-sӜ-4q;u|Gj=`cBVZu`y :x*ŭHYls.*P%FD
T倖2ϳ͛qY"W*`Njlo\YA1'fL>;ghZ1mI@c7V9x+&!0"WCC/|}O$Jaз %#݁ :.!q"qEW΁d":A#v䐒ia6FV$幰n9Fd:bwk7n	]Y'IU{E;K<M6ۉɒ#1
	ed&I˛H6P!Ѕ0|܋{#>R*36JG ԑ/~j~5>Ro^tC*k{Ҋcv3Gu!mtA.SN_ێ#/v^*iQQ[KI(eX~lژz
d+P&T }xQh:Zᙚ'9].k~Bj12$Maqq@妆ͷ41I#HHb8c@4aK%%#4=$\@i@O.9[4T$$GGpl'A+Ejʟv6v;Eo2 jAkDYr/ZgҼF/Eaj,ϝDge~I~
V\@zw=='kYdbvnKD0U`6W㽴ЩTe	XusW3[1f-J7^dv㹺^Nw&|;Dh?=F[Yr1Wu\KG0A_b	 3Pb"AKKe"Ԃ^.eMd:Y`jUI<F;ĭ؛=kgB$9zuNqDoAy%/V$2[1.G62WeG&7x䑙@0L;g7Bɷ؁;@<UݰJ9?[ދ(Bۆh'ǽ]kJPx{}
@02aCԢ_F8#D-Lh.E峔fl#\to
w"9^.uf~ǗyPKyt>jgcӦR;d*pu׬Q2	rƋFGӁʔz ?
t8o~ǧ?|gp-n9!mwl4X̐VC'k(>̿~*N&Ś9[~Xm(vyiO:Qp:uɪ.sN>jy4[lCW]Z1uu2_F`\BwV3YC'98BϽ{I%8YW(X"(5:,W׵ ƅ~,=I`.9I>W3/2!A]j\^_'<m.g!DQ<ԧ,7+Db~ZV.Yܙ@!j"7	o'TpSu%T$(Z]*#(%'^H$_/vsF/	n 9뻄SLsx*3٥k/Dkm@;3c4oa~Vzd+fVg*qQDuϩnz#ø	I6b5 [Ei87zC_|ΒM+2 {AefX}U.	R\lVT7s)q͹: \o]l8P@u]no@E9
UIP[ww=;¢iq;'=~'o'yÏƟ9X؃G]Fo5F}D3瓘H&vw|{0!8	4OugǡI HpXc0qҫ
A?WrC_1XA9Y	mr+Lsj<xuc"G$|-Y`AD`"mpAnZ~t}H Rv0+(<ǲY1I!cd(R6FSĄ6-S:S [%VJ<7mD@]'=105eUhjQ^߃#xL\=%{'7nŉ3tԜ`Z;<O!̓h)/ˠ{U?3<fr	=Z,k?-Jڜ`?q\?Ly0NhF9M|f|(p*ELw\/:*-aYI"#,Z >s#ʢsĭw4N~
c-8bIg9|6:ly)`o%}Q\.ǮՈ5`~29Zbagh.MBFYEŴ9a~&}^4I򪗎9|2lսW"sBYuϒA)1rf\l&FێfytqTE+
4{㨣mwc/hH'Y8C1ax֖ny6z ZUlooOOC@}NVgmlk>yFbޘgiKw`i9lN$OD7(w(2EђEG͵F8>$\ɱ|?E1r=銎l4moF$XhihoZ_L{fFQ:*$ߑP?Wa#"7Z>:@a ѸIXDCE0y97)"T;%ɓiBko^_;,M:|ݤڭzvӣ݁C>hDU͚?=e9
txtcn8urC`{?의taс8HQ !ppRֶP(
vtbե:^/PdXnJ Zk%zeeQqjS`A+rZ֢~hulhÇڡ9).^yRNp5~ZE0%uHuXŔGS<wc"[ %iZ+Kq<	y9yfw6ъVDiҋ@j4JnM	ux2!gC1jٙnmU=5X/ts@g,<4Z6f-*UĞHm*2n 6[?3cA?]4~UKȭ,@fe
+I
,uPJcuST;HhQTMG*P!⢙apV`6:>y~K(Hr6Ԓs\дqG}*KI:ɕQa.^g098kB0M]g)(<$݋^2AvC@wT'N: x7_+   Ή(E"G1P.f1n*a;JDb?4KNV!@,9OO,{CM ?<Ưp!BS瑇P1?z?9;?2*7GOwbLg"F$Ϯ%{P+,U. h y7e@뽝["I#X[ur(!Ώs/rFdDQ+.z',[=Z603Nտ0OV'0x\?<}:3J*/$[Fn'(ۢRZ b+{bPӼ x7܅"+<c
='YGh9xr96WtVKdCȖ.o]9cq7(YU^Y[=?oIPFD+/+#odƇ#45J/F^r"fbi}0nKG&BE_Pp	ʢ# [2lYdҤBGFPEQY'KN0@W	\eQy엊93x
=!FX7q\>;\^@e뎗ev)a:"T<v,:^D\:`ou#ꪦ p[c_fP8S3Cr]RYhEZwb{7Gʑ٦$f\IBbt+`~z?:Cx}?p*4A!?o
d~NO־]X3
F1+}=Ƣ;	UVq刋grAP3rHoc1q2ghOuڈ{'AR
8qKh;ZB9(%@W%FȄepׁE xZ-o*2[X$I.5JtZHp9NL0s99ʋfl/)Im)asY4z%悒m:P5t>!2iGHK 멜Nm rZ 05m(9W䂥'|Ml}[dľڐ툥NV4rHGoOv	*	*{G'?ɝ@@P]J+0[)Hzu4 ~F
P3JY;فQƵXR<"ȷTtu*7MzZ r\?#`e9fKFHGfAغkZ t xIX`6Xqa<J:]i{Z/uz
P;Kȅ(҉t"݂͊{ra#`,5ynxH8`wيnp3iش,d߾FSZV4!:m ;T6(&j+¿McSxAAnZ(lq 9bVdotx@/<$"K8 >J#J}sz+MFY*^ɿ[Y?o\+s5-^zq3>d[LZ(۞=SגGR\:qw͏!#4$dDOBA${Ġ%A^J@E"7
&o1(K@?TC	n+[.@+Z30$MuhIW
s:φ`,(ެ
Q*J##v<+ˑ@$v\­ N[>+7ps^!P$	1Y9XdSUPaT-7W.(	4H V7/9;4d?XzT֒?T&JaH-QBgw0g>#Ehi7Pѹ	{QX`<X/CȻT	zdJ&0k%$qO#QC(BYǪ%j=KqxȻs:'u_sFԡс|R2봢NDE}ɂT-T#؝BڍiWu3|+FIyp`Yڲ`m3AY\q2,ti&H5G${h{)箌1	x;
aޫH-
	q
g4!b#/jU	5%*>>U9@}XEpw,V9	 .KjY<"%JH<K k4QIfŋZqrmeyyߐ/R,7M0{lg"N'-\4%TپL+qMhz8/lՐbH-TW(qdE^"Ȏ;*x2bKToO4y5*8I%S۳OPι:uJ)ly0+ׯ B;BP=X?ygx{,QԓU8\u;7;@--sGGsAv2c%=f/ۭq8bwdΆOѵ"
GZ\H#K0Ɇm͝cYk~Дn`-+Ӗ	+0)ƿWQ))b@Z
KEUa`No$l8MC4%
eZRUqTAGX$l8[Y*emPQ-D lh#/AJEI.>'sQ0GMVV+#R$/{-Y+%Mʨ~B#W^\*䳙Ȑ=⧩2J?05xErV~C˩|VOgm+AFʻ)ԸRɒ_gk'|hXt='֮xg;.jk<IjXG~1m|WS4Ȓjt3opxy(OHG -~43N8s*fGk~AAӁ6fDw)>:A1($!"!^ުPYr#\H_y\õN{_\ng oDa(wk`.l8@RV%%ɷJ;g`Pu{;KO3WH0,~VZ][5]dCT3vʫo̱6V8Z.e|S2{wgDSߝaj2,1כ.8o3AgMKXf8k멙k'))~"r<(E_Xx`#^	tN	k/``HDj=Dm\`4{1Ho+[omʱ(0Fĥmk5a4[^.Pb4` $|Q{vQ~d_Zik+`/v#vn$! hwl(7蠳2<~I'?fvH&vʪ͹X<&7Q ԬI*1+!'Kߖ>G@'R'GidsZeEb80aRp`g%_C̩!·`:@8g97z^w[m+XR9@!C쓨%Wj"R4YA䡯1)1Om 72bgMpdC4WXα67f.iykyZ~yzVEhZo\j
3	bwJPC :C	P%5nvח#߃lض-j3HnDЍWߞ:9z{Lf	R1f}Fu=ԍBHmoǱ䄅$|ء]c
MpT֑/9MrS;<:/8DƂF1iovL[B7&VHK9ނ_V~Kڣܢ5;*zadg>!A sDaLeOcb.c#}h^NtԲƥԤSņg5-L^lZ tDկ@B}{VYגQ/
mEQAEi* (^IBb.
;zؿ'Q*TBA[iP2pWqXhn=l\1?Wr,HqT+մ?rTTD/lЯl,TJu׮"y=@<r Dxc+S~Ԝ_ɊSøsCp!7Ղ\A'Nj>=	^'^dE~UHH\x;Rdab<H5}v!=nţ&WRA[{#ۏu".'GۏrG[`<ln\lV@7d)?~򽎰Rg[)XR؉> }|_?]lDaØ!QsUjT9jT~t=Htx+H2R
t@"1tœ o͋=4.JqRVDr\b]bK_ᢸd)#T)e	BӠ#/U
WߕVQH>l1f,BP;0#*2dX`\QcϺhԼb<I9螖vEPWWx=[YJ jmbtaϻ
Ӓ0i:V]p=u{%;Y.ގfcŧOm rc 5,,諌0FWT#l[|l?ZFI.4STmF<,ivH2p?ukenJ-쮪'SφbzeԎQ Y{g?KTsNoS?9K"mk<DqZ߈`!:$ݎFhEvh)<~#}|B}7Sq97!?524Ikǖ86j_UoA?IhSk~3yrA|l&c3M*vŕDwhcDh}r[^O8|)fȽ@Bק׋q3:) i?Gn%SO9%x2%@F1dP68f(C}-
+X!cB]5'm%Fɠʀ(uSbz#]hїLuO3Y+lRqkh4@!_3J͕ZaDokuk[[{n͂}hR46`Sh WrE"EZ`N)%0؜իI?@(8ƹ.Ϝ Z=IuмM܁0gmt>lb̫vV;En*Qh&ZW6hٽb=D\]JĿKjPOwp}U%2)?
p*UwAa6j=5c(A#ky1fSJFlĶd1>ʦMlC+[Ԋ6ÄYd0i~_u'<;ߛU%iltN/[3DUJo}Sִ`hq?s*K.V1B}wum
M%)"V41IhhpzHD"L<8[J@3İ*Tj`WBڍfIGL"k#W7D* S^K&8XC+Wi^4._z,ڃj2Ȯ%N`{h ##>BVCnGdx g>4k3,^N?:&D$~bSGSM!!G<<@tM	R
bp$SS$$0 ![Q7*eLT0M7<0}e:6F4,E%
>W1;nƥJv6uQI=*O55ge}Jq@n=8(XSQ~-oQx|a5 y=SI{@>H+dVҽOe:#z9nUIJZ2\ F@5	oԎ5xI͡#$zmR#CNJ[C&c	my#w'2$zJ2/Q9??C-	Toc	<E1*򸨘LA +}\³3i,HthvmiXxl%=D>]|ja?!8bGh._f0 <y>#.9o GƿTa/bǆ0([u}]4;nۭƫe1G݇_S<27~'oK8\RLWKҮY4Flڳz_#;Rph̒&VJ
LSF(XAai %SQ6FR<vQUK/se1&tоCSrŌ4?9dH:͗BUfZ!
/!+NX-OB D40jmbz&{A WO;;.Հ.!oiX'?arq5Xn,X)WƔ1#~\tt槖˻%3o[
欠#?sOz_8;yޕ	G#y^I12X',Uiv lF-hѦ
$0hTPQ52#E& p$<k>BydDJ$okCue;:ZݰTdge!XV>Kg%pƐ ̌+	eWUp"U%YP1u^&x_kCKq Ҡx
^?Ȑy}65b)QFYyWV#RTKFͥv_)jRkAJtg]2a|#!:^w{m]'vuh#O`ܮ-amkmU0
};y7Im1k#8/i28,'o>twwҒ/=Q"bAy0J_QK+f5T~J%"QWq]K[ʿ L Ŋ$/sv` hW6eS/?Q:sN!B60m~JQ㠞*n+cŘI?GǧTÀ )uI X1-sZ 'фX1:ǝ87yEۄ(hVRl_ֳfg4zcaV;FFsF`|λYaV1X;UO6 Izkl6'N oE=Fͩ`sߌGԦӶTK^D2bm֓A /69]VFGkBtPJ{UK狃6ϡ;_Rvi^P_%oc~p݀zͪɸk
ZTJ/C,QlҠ;|_tnvhq(n"Xtʩ;- ?j2ԛEzAF^hƽNء)`f6Rݯ76ݟid}z2ZDOɵ=^<qZ..O,p<6+#:PҼKNJba|<ܨ%~=1⁞|̞so¶dL5]A<\iD-ʢn#;y꯿$P34"Z7aݒnEpUny-HD,f	mvASHRlhk9Nڕ^Q;ﯴW{ݍ@=ծ>ySc+/0W1
 ծ}ٞW\B:Ʈ>$ϻ_bp(e?@-3$so|yyn~<ztKv#ڣfpg̐OKS[B3XVC'Իhy~fgedTХgTf/BAdܽzQA[i1ek=@qordЁ嬤W[ؕ0zR6'+rZEL٤wxArOa0Fx^h\>UQq1>b4َʙ"MnO1$Ht8<TPq#8e0"CQQ0uvT,ca><)Tߌ"U`:LN瀃~P0|Mv'rp#$OxP`Hܰ=F;\Nm1w<WX-Y54'r8a	Dx*ϻ~SOxߋ#fިjeq`lqlY@;4[pC{j{4՚ :IE.c׃f# hC$]۶3[lNi^؅k HC]4Xp&~ԽuXn]o6!گN^Ē*ЎOXL T%-j69L'Pb_FUCV%{IwqBt3P`<
ܶ-Ys$	Օ*;{MuH/Luế.vn~2,9è	A(.t>2"^Z6Hxw5.3<Ru?Џg#ī+	Ae|꒶>$Y:^H&mZU34݄n5	5XpD{XQ|NJmŬG4P0ЕbaxȰg6kEM3RAW^IRvlEg8r'hpYH.2֛" B(l=e3w`dӢxJXKN+uXv"`ALq1/9gN:q;J$REr&>ﺫ]})G\CRe۹+$OOmE&k:^U^;.}B	TkJ:L֩ ;tDI9k #uz<A-F*gu f~7%Tzj_qn*Raj;ȣ#&$ڹqDwn9ggt_` e_[{L	Ś^lî6nKHKLTГ%L|G5NNNdU*eKMdji;m#x&)k.#ʺ``e,[혿:qw7~ܔ^mPyOɲf${܌#auJ.NEU+1܌ͱX~t c՜^{),ބdf^6&xY,  \v1IR Cs<$JNum>472ܚ9LY8BZ[n6K
*ƅWqUҕCXe΋)eP=&Yd^qY1S}^G;
-?YtSnM)EFW/|[".@0D:>[*yQ>0xd԰^^ *җ|kⷺ,GEcqJԿw31i{U{͑?reMltBze1fF9"t6Zm44>Uƛem%9+U<܊Ј%ca'xO1L[
l4F.ueV6ȯr{VwEz\Pŝ8s6>P_Qg*{[se%M\s]@!'a+q\I:$P%%pS-T
;a[Vv>	R㩛ƭMʀ8U</Q=tF|->J֪{v=MӈLMtOIӺ6|։oAavC?Kj¸f`#ęx/j~i`yV~b9.Y |c,(@7MqX8eKnp'Tf{!CcbnBӌ 7&3{=(^	2yiɱ(H'o!) {}m";mV׫6A')?/l(4g,懙̖,i q{hp!3§V=`=SSόa73tnjCk ^TصAI;33 ʒNOqXh<g3 E%qmJ#%bOMbN.xʢ
jS.]֡6|c$>}<,%HJS{ЦarQ(zpOm̥Fқ<MnzIjO?gIY'+vlQ[V`r0g`<iNHYPZ3
Cb?vh0O ǇFL	)Il\b,^1ȨܹJu@EmKV1
*W-VP8Z͋ث`'wm&&:aj:Ɨ)X2wEj+1[Q {ta[z𚭈^[XezW@Vh;O/&~5纼hȯ[K4&@(Jx$^~[oQp-?iZ\3o.:\c}^=Z] tKȢ.,	gxxf^=p(JT.#kb+KztKlAV#\x|ڢH0[2_=	g;	_QV@ͦpD's36$)|
U->.+b8J^{GoϞ&gغpwMsз&66NB	)>xNEVTYsЭE[l-23kA#BA3uGv 0Q<e8
?L3J?=yG[k~P7k!1U7U6WnkT^dǥ	d  ͇aLUrj?E518B
JAvb u3N	S
_:0]9`ҫk|<s	E9] 	|1%/)
W)W`-' |/	^Rc~TNhDGW(QV'Q5}dNJ#c!*,~gb2!nE>CbB"4\0R
5*h2"4qrBB?IAf:o ěn M*2A'qyɃ-Q&ttXu"FFbI8he([:;'{?ON9Ӄ7oܟדyP/xK7Шw10?O-/x86Ff$a2G$mvb<ywHw²)(:bBtQm}΄ehN[u]O̹5o9]j1CRBYrKeP/PLRt .(&@6S0/zi-_2_	ƛE녴&<adp+7_gn+o[}M){F}$`:A^qznEqlPYr1z 0"m7.'[}foZEe7!؎_q
`3_s°$|huˍQ@&'ZCB`dxRb`E.XpƏ^+@a{@ťҼ)fyNa huϧ92.Z;_D^!N	u8( మ[EmZ6XԈǽ߶F
YYl=:`ND78UpfY˕%z¥6ag oc b`:eFpnop5Jp3{Uvl~eA@Hm'5wPLĬ'Y&k>}-E}bW@ٹ!VzN67r~M$cjY=({';~$]J?V|L߶.Pމ=me{`δŀO-a(z@vm'a	Gs6bw^|0@v5.ᡋX5
 $2Y<^Rћ2|^O)lLfV{ 5_spѯU1D
]"0-@ltZ- ~`bTj6U4wkţu}UC0L',9'P6ZZB_"/!*И`1eD2l;^!M{W@݉<k.cg@1ajv% vC<p0@{*!^M??{mW\؎Q۾z|X(܍20	G؅D+^[_erKkA,Y_ĎCI$\uԏce@:b3NCd`KOe dЀ#k36I[\.*I7hQ7GVl~3+b\Akհ)?cPKx 5Wi$5y䝤2Dӣ$Y]`abhSBuޏg0HǦ'uǽնqYEw{0J4fԸ *JBy̽xB`iu)Ojƻxsev(6-a1z}xuYӜim_97&'|S!]vnNVH(irV#,l/ۭaԛΔl_L3t4ltnHۗx)&,Yh^!PNәU
\Jsi՞~f  uPW5kf3̷[3owˊZ"J7Hh CǴ]'04ucB֔$ugQ65*$#BA
miyMg?E.ܬuY+\eM2+U=tTT*)'7WY}a;E0|GabeMrYnRF7mlPb-c{cW{E
C£@tu7{c.w A]pGD#n9AHW$)z+Fc'ݳd-HQ.5FgFd&`/̩Lpof6Iq}Ֆ7AJBkeѓ~=.0:6OB0vuwLYՈL @Ĩ|Sg!4HGԿԮi!"sCն\r5wd'dG	~>nF%+vTځVA)-߲-Wy_\J|ge;U0󬋟Cyj+2NB6E|439&ze|:iv#{t u] @)b".S*Uh:ش
T<lf٘j3$yx.kr{j:1\ʽwJL!48s/<=f\)/83|y?=|G/E蕫r
H9	s<[~aEmǠb~_࿚m6)my]u̵^^lT)([2ʃklsW7F={$&Dy=
s;r9=<N/Py#%-bŴ!{kQ۫iR#ƨn~pٻu;#t87(zG{9ywj<jt
ֆ7߿ԧi>^[ &gKZFa}Rv#HshŖ,iN$ZڿQ&q<aܖ Ga(YyҶh̠Ja6^)~IYkqb**OPrRجO&fV\BT-\m\kC*2χ
g&Ŧu4鍉Z
BQE&youc۶L)@-<` F濦|~HKF[H} vǙ`JpJ72_[Q  \ aN1W:	1A_:WC9z1uUvx)_p-ЋZIYbWiQ26ދ|Qb yK@,f<l05X1"x$wld~xpoA(xx0ٜyhk.ZaKL]:;y0 c̈́!zJv0CQyȸ7P՛;Ԏ/iatĽ_H$ٞ&ߦbD1BDpA<C/9z;K2-zXXے ,#&^UIq$|w1Eר,RXEx:@46
uF*?]ʮEBpfEޓ7wHBJ3lsD0\?ZfT9rLͫS-q/
Ɖ"+ϓ"IK50d+`lrtgm/
8Aک^+)ZϢ=)J\@xB4NxdΕ; 0EǔM)t.a*K NɝܮA1C_uG5xֶ3`@1l^#Ŋxn=3kD%uX3) bM"@mteh7AT[XxHJcz
OnNVhzIإ:`rLg61b|zʨ>+,XY8$؛r S낽&Xbk7m[Z.^
=ۏôiʌEhf?^pdGf+!aW%2,40nMH6J8	 cFpmHrBJ	NW=f\(5^ 9Y &<v8N֭/8j3	cl	:+R.:h/EaN2+ۉq#k~X$*-W_:*c|f8N~2agP+뵒%zצظ{Vb4O):^AS2IUP}еᘝԑw3J6Xb㴔I8D ΦRQ"ikbO6hej@)@\s+΍mOo;ֿ䞭Pvb;o׽buISvP6\	#]폵akr-
'?ݵʏ-T4I*ضhF!'FyY$ǌt9CiwP7¡eZldyi
gYW47zʽv´  쭳H)33aץJ{HNIy_/+NBy"cz5;qxrn`'P`&*7iR2mO+(9<H2WbR$zc5*h$ع|x 17 l!NB͘
'/.pXU>&ia6nH>If^"!ؑ"U)(g5z%嗅q9:?;?~hv_xvtv-vL@If發M:^.SY7	)p(ӃY8.aYJVSʫ+.d%a'٥sDyƳu[qBF4LlQ:C-PTqJ_NxLI6pN,X޸]`
5sf>a V%-xO;/l:mE4р|<YSS)oןcn1l \t'&QyߥQVn;w_Ig=sM;ΠM'kCd6'"lh#~gb_ZwZg41é5m|ۢ_sOӏ.'h/njM;-6ٱ[gܩ:<(%!|nA<0wby#틼g Fob.	l&FٸS!6*>3ahpwl;|pI9M_t3b;JWH%'+)1M1~Ay pixl$FJGvw!-YA ::0*aedk;۟#瞧&NZ>$:;߲K+~1ޟT4"k[pkZGIU@o^(aV]Tb-\@ijҨEt* >߅Xv6
·X
JC\V^n_8fսQʰZmZ1&Sa}PGfsM7%DS`@ תGv@肕p
Iظ0&iU?$2˭S+qbcpn4	e_E3Ǯpp	p29m}9^Vn6g&;	'w;[KihV:pE5(g4)֣ԈǼrerA'#ӆ(x|%R/+-(H#;'G0((99zaRgiݦ.pLIC(WL;PF- {֒#P2RDdJaSh'[UV/ˊtt44;2`h{%  ?;=>9sbZaYi/E-XV0->S> &q(bK_,n0ZDz0Nڿ`J@`zT^Ψ!pva8۞^"z%6}SFB`r<q8ɂ 0a>@>	0Z&_l#Cp wsd#vY=iz1^<r\֞|aͶ׿id]/WwY7*20ޏ;oY"	RQe{(>FOy;}j_pו`{c
"06e_U:Fnn͑y+]FۛJ.ZjpٜW$[\WDUnf3%ⲙ40yP/O1x !␟ "TeVf <ixVQ!R9XɥߞOx&\.9Iv57P l`'ʛҧx>*B!?k&kK{?Խ9;7{	W%l!Mã09{P͟4}I9+spL?zoۏ8O-fu9IcM[b'"9)Z#LbaYlBGu@Rty|)RA8񈷗qV:x(GQtR!*,0✏O_l'F_Q܅ )TJ`Pq8°l&ku,IiKĂ)z}}N4Xގ`/3.*/A!6\EI"6KZ)#
CzpZh,]Q gG>FCΘd!"ɞnqjeЎ^'CC4%v"&<WwWt=ݣBD9 XZM[ Nk=E*t 9-KT`A5NY#6 pd+(L`3諦T$J;D76)QF6pb}B?yI\gYTac)#>lٞMe6ff!sQx3|+xzJodME6RI71{&+E7 3AG>d H^ꬸ\0/@xV|荪lUmUCv.4YdjL~=Pyd͘F3Xctf(96=F2>¤ArUiReU/hcX/NgҮcX._R\"B){9'rԙq:W,@fld&c؉c#3i+ kL2F>14if	ۺ%$YφKp{r&\Ѷ	7F
N
i[dsґ<(YcJB\EIgnIO1oCn0BՁ,LY)<OޔODPvi%C|VC~xUHRSFO	n*ɁzUaX~eţ(a2ǫ{O@E4bLn)n~HDxleB/d/c˓,oiu\)V#aY=9Ffx?cb椱u&GO`TϨN8e鄮
$zh4wފB`mo`c!ްZI!kDEN#l7GM Q_etzdow`115,ϾdGXf71epxKXM֗tL^I<P*=q?a1xl:3bOd{gG(3K5%kRnWV@uԶ]TsNؾU2h{5A*|̏49(R!Tפ@r^C+h֒o^o/,<2Q;g'gGgzo0EXl g#g3Α~_bLɗNQD9l0.i$BƆ^ClO8jx0y?9M6a&~<9&s&?$&@qh]xdXhh.5}_9G??}Vђ5J:Txa$ǈT,Il<xμK?=p`O[n}nS {;h{c#Aa׃PDwv] 0ѿڪ\[vE}|m$"ZqҴ%4s+-j#
MR<cPVD1#Y%Q"~5PAZ 453d$a_ut,97֘!0:я.hZ|(eWQ`(mkw,#7JE͝IiQቈ$Z%]N:ߣq~1(X|򕞍E*enazRm#gaxB$#˚u5N .!8g^a}!+au6ĐD	83$֡WFF	cx*P4击'8*H\mIJK'wE.Ԓ:\g)Bj.v 5eÑ3Q솫98gKܧATv<mˎj
ɚWn c4dVcU;u3IK%_?C:袿\U6vC$vH:zjq"m>YBȆ%bƾhh?|
>?Uמc`<VV:Hs]<!O^`\Bf2%ސaF+4C j|e@I58Nx{uNIR"f4C"$մEo拮yONN~38z{,L툱5>r$9qG)4:aqe(֍Qΐw5Ԕ;㞐dM;3؋C0'ֶo7h⣪S|ZT0S	ԃ!IZacPHu5F̮-۞R'}5NþQQټ
U5NGh۟/=rNQakl'nAW8Ke jA3Dz33a
xo{9z=c	#K/UV޵۬%wrSl^_Rb[*Y8bJI SaA׌|X۹ɺ R$ Dq;Mvr'a	擹:iS@TMh#EAHtJK(xYa1>ENys޳8V	%du-J(#iAw\c1huR퐀ltl"N
)wnPsv+%jL2NcDhtFKqPb	_X]^dY݌7z"ic2qL!Sا)y$<Ip(8<Ac*#n7T◬Uv1"Z zȼ`	g*%O/bu1  	-1wюpsm[z$QBp<VyPκ=otw~xtwrh!(Y{$,/vE6x	aIR檚AhcMa	/^޿ +Y6魵fFP\8`LNT"'oz?Z9dlQD^ks >wnl2AC4Z[c>:֐I7rˆ}ŷRb5{!{0'k&J0ZKow-ӝabWc)Wɜ>`!W^Ԩki!k:p{C *B1LUTuKx>U#[#Cpr+vd. ־mYJ N%!Ԫ|a֭E-zd,**Tc@Օ;0vC<*ǻG'.@- p4AiHOb A.g(xlhZnMܸkN~Isڰ!}ZpGqb6K81>5(c6XD0u<)%m\fNc+%Ew(Mb#&ZV(zDAndlt@<x:	AqCdhXm gO*D9ϯǩr܋eH#(|Pq%%=$9&`ԕߎIΛe_dXX@+F
n'`RWv2䀥*G'+ HA7`'i֜c#Dp?A{%"pBB9+^-SU$qTi#@;+	*klL_42JuJ*Y{
|^VƀRe^ز3Bl}ƥaC}}_c'F"yI	WkXMrjP<zm%D5qPgRyՖrܕ\KÕ8HnMZB;>藼yAQOSs\4=d(UOu&{Z*Dd[9C1#ǜEId7
Ά%tpzNhrs
8[z8y,J༧b5 2fdnS^$Q|ʋJbQ<IM$<f% e'}<D-.Y(=ǐBfTxJvI6!f5M0U3O;2>H2&$X݋!n K}b;2pA&G?AWQZXwjwV`?4X θw(dmqo:ܼ6y)?,1$K1\a5!rlr-'%/,D4ӓsb#VP	n(n(	+BБp:P`]LQv抉|RRM^iPO,WLU%@b!@j>pTÐ"g.%+14؇F#wQ41fFAY0RC|Y"H0FxU"Zۖ%ѥRjI)D8φ)ghXQݼiZqA۩i<Y\!|sMH:V^ m+#͚7YSf?B]@H٢A6GRlrBp}E|'95g3yFC KHE!9H˶H_H	]/cf">V E(n>ADqІc+Ȅ+`  auVv
7o%DFa<~+ƠTޒX7
pϋОSUKFf٥@7A'ĊGhYQ4\.
nG)*o?<zwH{/	?PثB;Ru3࠙tD%Ux{WG6ϧHU@ R/-=X	@ZEeMen'5v\@~s9?fڂȸؗg?
|]bx'2dh;8e9ve F2mu;eQPX:P0be&YDf}rL]\-D?P+|9]ŕxd.
c<[J%#v,eL䡔T~ÓբڽiY՟brCՋɦF[a[k92k0qw7>on%g^`[@"N'^nIABuD+PYԧ,U+yh*e*FB*;9	wVB/_793:yo'~1vH$Ɨy1AsVxo20/PHN4ϫsIh_̯G,3ny	M	 5J>~$=+15z@p(bxN!MhDyHU.U?Ugto\>1jj 2/6v
'[Y#VkBӵpK&dL?-T]59Gݭݢ0(X(lGo~ΘVV~.UC$EF~3? (b>B
ebQz~[(rrM>4FѰ9ا,m)2ؖ͍|m#h,zJc]{K/#Yw-v<,Sz{: g2B~
tT"j  /SOǥ4e!*MOZ1#FCW̑3cޭj{G]GDuaH3mzk'Qsf{3WEc#ބF}%KkϘ~>к~GGY{>bhgM~|V.#Hm-|䨑aR;XvG`Z+nf^sںy,uX!M_j&4my*LsݴZ|& ETPAiӸw' '3hL_<]C]Bk]
vLrӾr:;mAFk{̀]CMոuV3$MQ7\apZ=Lt[\/@S~HQ# É'
w4ک~N'p?Dh"?QSB0+R,>vUA+u{~+'y3مa*pj¹4ЮqY8wBMhAxK5Lu#3TLŞOU-b=n
	bcP8ADUluo` qGm
Q*->,pBܶho.vIS wSXw_RUv_=?Q*Jg+H& Ոx-l'jFGMӓbvĹEԀT̶`@9hIQPߛ>WɾH+*?,nεt8vHLp{~iKU⅔(
߁)rUd^;z`Dg`M3U_=WRm@/vľ=|^&7{a&g睷y)<y#*7Jh鍗DS?!BX֬YA[RUĄjO zx0 a[h޹h*%N\gѩSZoys}/̣8(Ug?;\!F쒱HwhD谊ok&66ajUC=:kQ;p6toɔ]Dz<"nvD,s{AdKi-j`Q+zӒX=#RK		Z&΅a6=
	',OL3R9w-@RgUMF(5pbNc^Ewgoن(0ǵ8P2=?ٖp	)x%J2+gm!/.L7IL]fWr}=ČqRpf\!< 8wBxJ-xqv92=BJ*yGhR0#
8ʋ`xO<)l$Ҹ!$xm?2j0T_합Tof/rg
<eXz!`ԑKh66nmHziVP
FӢņUZkTCx)YSpfU8Hfx65>ܻrx>aɆmkN]F7p~s&QBx]Gz캭 MD)TO6 $*O6(JYy);?&&OcevfκFyDl[Fº071}0ӕqsCs+qj&.gAS^JGS <!sM嬓(Rt,wguwq2J<3˔v]NlAR%}j_#Xl=_V]%ՕEۛgHkULt:̹ú
>==&&,3w,(go (<wcE௟jI
3A::h-C?L)+Bo&g?o܉:Ǹ1c,Oq/Ml[J?x_9ᅬ[>OEyuDz^{.o 2O5G ͨ\&_K/oh-CBew
E3$'@{\6?S܆35`u'-hcacP3u5	:`Hq16$7{m-zaFWOD{S(Y/JWs~(\ v\Spb֏)?c3PB"1>+rhlݤ]Ct|^XZݿ {vXg_+Fl˗6,1*ж/	4<FeX+Ѡ,<>Qtl.QX t/y[N8oX.GRl%b@aeuq":Q#8+zT4Jiܔ-8|8z`gdV[r=e{ 4ivqL<h@8ߩ&?nl+FM9@?]	;r->Z]Ad@NɴcE*R).6c󸙪
p P!j1',,,컾6w\ (nzpU]fzaHԓ{t`iKk	nM K~\kq-	*ji@cBM"TeLVjH&ip=;?;-fq[YHpZj [dNI|q-mC#ɊHܕLOuuX2hR&ڂS2f޳-܇DbAPAW~Idy!AGU^ sLxnl	8TaGt@,Tqp.(0:0v 7ҐAˎEpr=2^Xx b̩;^Wˌ(|Ƌz~. {<Qܷ
>&(y+Y^ݿ	n*:	Z-nDP^odoqEe%7>@-;`>71Aݦ a"rJZ OgޤsQoe^FT
mwonҍzN%gNT9/8A5@;1,}>tu-r_:HQy𠕎FRH7OуDQ~M'Ѹ7Y+; &&E@^LĽ_ՠ\<\4gswpQVji@-H@A8
1k|n4 ]՘+蚮4hl3e@RGl1cMn f)ywW`X/x宑JdFsͺ5
-`jы-i^(YLzU8R.A ^>mћԳKXzpYm߬2(>xÿwM1S+5bڴ+Q"0pڥ,-Bj/tY:|{nc>V=]Hlx?Lؓ9 >?9.N̅}C㳏tQ%%[WN	Yet76h-*F태yMnj&Hywgz[j޼q[|\=[|-[źrWH	ķ}k&P 8GX؇N`TLc[EWU"U9Z%t{t액rц@^Y(NK9>A_aEavNamSjaQ0,6y`Xnpu.V=q\|hZ%+|޲}m.-q5E-6~IZǱ6tb?"21qqZ+A#5K1{]+=۞Dhۑi<ruI?tJ+ǟM?|Vins?ΫGD=AA;
ŮʨL"Ң͒(A^2'W~J_ѓb$
xœ|ЋqsZH
wGjڞ.fӦ(CH֖0D7̨gMf4pǣ̍;kC0߷+Tn%a!?
؈	ŵe\q]-SMIFSaSɼ~l
- +#įccO?U	b|AXiF>UM^Xd:J̟(HfRoA,,Us{
6IJ< r4EJ-rv
Yh"輢"R i!_#pnE$l|tc01T@kv<] m฼Z&~Lc⧘	Put"&
RpE=yf:^5Ȑm5a"اFT0>k/#Dz;z-0xƔ='D_|R᪘ьwÈC{V <:zAC6-JǊBma?&pkRi{

qG9:`H.Sк_-=<Ik"B#teq	A5#Oi8p
LɢBN1yk?y-7<kc`X/ O5D{VDqXtz۠_<,T/Inpṵ&8AIϊЀ_WI֫H7;yoF$5nwٚ&*Z[+@kq8hǊ@FKPmH Uz{?#JN{tL`&
&틀Phs\(sSIv1fTk^#^lĊ},Ë1LyzGwdX ѝb?L.mh%o Z*vс'{/7+I7{qY{a~ڍ̋1,թtKN^UBFT:Q;^3r>#!L-Jci{C2ǿ@}?uisxxV{V=ntgpwo~<CBb
#~E	)z17HADNCH6$ϰ
p```g331^&{X)9[}椚~r1#pFvEr2:`cfNpQ3BJyZtS>u;P`]G?Թ3}v>^ד;]zxNTov6*1w=ͽ0^wWQqA|mz	y$[7o$ckx}xip=<I/m.;D[N_<+PB okxvm$9|t/GuG1?Yr;#Έ>$|5FC?e=/V9l
MPSY't%A+CC~K'dŲ+.R;\JEnN]]wA_ryN$|/%_&t
ϰ^Lk(Ù\C&%~Y)ܐlrD':C?<X4f2Ht3(o-*.<1̣$D2/iPzk/|-X4	ʅ`,,nҼilL1mnh -B_M5rZ lq_=JHtD>VXz ˁωP`k!<\A.)_MwBr+@:{qɲ0NU`)G\Z-
'1#۪9q:it MDelQe搵Y%fyS/Pq"n*)}	{V@|ɻFKQ3#ME@,"$Y&(@uB0tCeQ$P̽,jƋ FU܏Ϸ<1xe<>nj}ɵ٢~X+&m"}snt?=\Xyˡ!^t󮏾>g-}̂;: o촿ާ__xvu'xTͷώAޯ8[5U #t2	OQa5Ek3&#! R؜V|(M`4TQ?w:\wM?w6{#Wtqy]ݒgwO/X'AS}ϪrA5svr}ֲ@'ߜlۖ~a_j?g9GRNh$[.+j#.\sA:"5a:Y.[J+ՉV!ܱ*˻ix~.B=Ƚmf.=!D/W}٘F ,tLD6A /U -l(`2RE2t&36FǛVRibi$C/F^r^??r~B$H|fg߸|dLn	نX-"D {TX[Ƽ8|nC!E{L aZ62/y(fW&~xg28\Nhz /XoܗДVeW$@&2Ԣo07P<9|aNB UhfJu}}5,J{Y1j섋OjHʼ$|e@+~yl/Z܇ߪpGK$rM7Gw]*ܫevT+MOZ0S="y#m{Q>yJwX㝻D/k6}ncwrayWg};owwf"}L38>X׀G,Regf
:I<@ߞta}&54w3s'(nL(fa#8ҹOᴤK{vaݲ/]9]X 9brCp+{cT6mE0O`Nc)m5GBa?	;vc0C`̵)9mP>7Js35F+WP)*k GY@ID|FM-ˤxMb\OKSko(`)svi&<LHe*	IϢD0_(kh	e8wG`{%}5h:21֓h+i?^Yb+
7zz_Ç]Y8s
 3<(6CV)1j|1Unǃp'[J]n9U<4ƻ)*HۭP*X7DxNqGR%#rmi*r1CͅIo!	!̽dxsbP/ Eps0RqJЅi)_('Fd:+X-'hC'<§^>|F 
>B/Aފ`<ꠅA[ y<ݾB<f|o	맀K]*1,MAAa28\' y8]yjL_pzg}j.]X5B!U@kn#e<<n)sy8ey)R(7(i4{9FY B-'3ql+kM+I\iǙ-ըY'X76ߩP
YFGICNHSI**ᜦrRiu|$އTA^QsQ314BA?=6㞽#HiLxe<gb8!Üeط~Sr >)\NV!wp|9ojZjP,,B bāIn|ONl<~Z<}}F:vNv--lwRE}P<Z%K!<%-$E:]d6sAd9HJn}}{ێM%{߲Կ޶]h~Nr\gkBraCRs(4uUn8+&ۉ^b}OM^: :+RVZktimY޼'c
Q?\$: ϦܩM*Z4\bfV0o4AÿVd4 ]mni}Ԏ^ #fb|9L^)B}Y$^G=~Wow-(8/{SJ|=QM~L	Fs3vdg8sN7¨~unxPt6ø:3%~2ttbfk|`jȽhhtJgW".t>#|<_|y7w7_s=ӆ܍Jz=VK؜.6KN<td>'<CdGrWnG5MۀD5&b(ţT4K_ Opj  K^M:Lj(nGS/Aq,(ÙpUx_:z!r)#zƓ\a4G?\tT,UG/ח+%ͳ1jҀzըtiTNΞ#FN]Ok~m>WNP>(HX$d)-g1G^6DB.>] /wؽarw ?v'}pLHQ|FF5`5̗{??x42Q#+,eWq0K̂"ǔVXlJnT}aes[Nht	{JC6OFhZ#\f5ow
iK#L62|l~D
ȬhwA]-+U=a:kK	pBW2!
y/q
V:paBnok̂"z4Q.m
؅d	Ƹ\H5ܩq6^`l&YhN12xy#g4!֔wE{~Rby7'	!xs^lKy jpCwH
x6{GZ]Bigc;c+nl1~(y4D6%Fjzh1ظvBwy*~J=XE~(踚jr10֕=H(5Q`"j,+=я%C35@D7ʹ <)޶dBmFț#	РYJdֆş{hsMKްL~F|BDvH0@]kͯ6~9b>K>{Έ>-17g3ݝ|gWӞ|P,K"{emk2*UJW	Ԅg5 \Uj2[ԧwo<8܊Ŕe5URXlO䥈KCw
*cn
\? YgN4>>wܧ~GOn;-t<nw|
`jL5|Q (fZؕL/5X@8.H0*κԛ4Ư7{2Cҵkw7r~6׍7tFW+z㍮ko<}Ȁ .qӈ<0d鍽fQwe_v^dŊEm~X/gF_tɆNGXgɭ&͚;:5dg=DR> TXt?l&l{b;'YmB܊^n#U
r&	Ûxj*F*<-Y*_T/.)?F"2Ii[L'3[hsڴ5d|`K(ISr:E#4!8)X5ƤmKZd$ub{Ld*)qqMl;,7NK9zx8!GZ:z2KN؂1^Ed.MWSOΌ[qð~}kQ枀^pI!'H1!#2(<X혣.6>8Z|55ZBq
(==T9#0foFy`n:<n<m;ͣwSmYӝ㭃M)=wkaf]V`?ȡ (ANOV)	\dUrhLm-M;g $<ILʉ)U%+c1/jc\s:.|;+Sݖ]x=h_5K{~uyNMΈ!/ygx],DM
S|:&\J'wpXuFtD+K3ZzmoQL|HN?Ӛ[$B6j8ǭ2h"#V#cH|t8Җ5x׭zfr6uÔxZל(Evw>Fs'@)3JEcxܟ$-lN֥&nnŀ8
/4MmPqãrw~w~%֥lT<:/(V~x+MìiE9@R
W!EZp#6F9+[_zHTNZc3lhY){tGJV[%?ϭWw] a]!⫉(X1q ?jDCreJ@V$t`3*b	i/32ayZ/<Ჳ6j#^SI;%cLz{jȜ"CG#}68/[!}@p6>¸Z\Ǡ
Rž6g[u46/mYC萚5^vmb{XzET8,WbM/	"ڹlQKd  LکwnC&,/k
o|@ߏII]^lgWvKi05P}-buy tj "*bQ:~^	+"0OZa.ڟp<l%r?
H,t ĭ=;ʄ" 1)>$~*3o){X,{>Q}F3>NAPn,+	JMҥP۾ǭk*uRAaδ=>yPױZ!C|}J)fe|lj*^<7ӡi[FO:]qm,X2ZvqzQj$fe:oF%j/ˊZ';s"T.'/f2 hL/Uq9
(A*?VbAJe	W]Uɵ^}3*F:`]L:hpFj%r&+0x
M|H%u;#!|Lj"N5o޸*?Q좜
K5,)Q5bGw1lTY	|᳹qJU˻P^3<)%p>Gv%:w/Nop_b@E}V`Ғ/L+<BO_fabrn׋#Oؕ5IeG!Y#'09b<(ɹ*l]yivrP4&>'4%-DaE<hfMAݗIE#*Ed%`
\l7?\ iUZ@$쌾,'D~I-h:^d/Q8oy1Gru2URɥcA6(~|bAu"45;RarMMwq	~D|u-#uuf0#3'P x>(ʀS"E9 x=e[k6a_[æHF.ͣ蟢c4رs';`y@XLNurKL',/@u5}׾is0=o?M:i~P[-~Lw*؆x78E)DwQٍ 6ɩ$(p)ZTAJ^}X*ŉb(B@Ժ~\2eF;&AYś3HQ؍F0NͨG";</p;
Gvx?Wx5#$<qlt 'z((Fw1%h,6+JّB5[(Ќɔ@t{Ì
b#wCB@ҿ:.!C@vLgt]Is-*' ӈ,Nt:]w
9
Q2nR3KQAf3wF"SOo%:IÄ2DD{5s"CؐOX7td̲%Mp@ZcJ\Ђ/W}2h-Խ:⸿80Oֿ^\Btj旊F1ar,R2D[3.>nOCO9ᰘZYbTR!C5y ,*<,y)^WRBZ!nfQ|(dǔ	`puaEY&ǈ;&?W+Bc"y/O_jK& etKhwVz=mgmo<9ro1%sE|E3,tVڗS`3YF*P7u6+KkxD)n0PG=PDdi4nF(`[b˺ 4p.{
S!5r0%R#pi%*TbVOJnϯAvѵURȌHF	C!B-Q,]%g^n&Md48'%!Od(eSxDܤpnm	teAAEr9 aVq.)pDi뒗L oT>mYLKi\sJ5	i#4|x)Dppdc<BJ^[_m*h?`4
}uz_ʻڳ}`f>R\)ċikjЋoX<?lQa;,5a9rJPP|lhJ0CEK
v<ƁY݇2ROiMtl!cl\ U77Nb	Ck}۝I܀w(%\2Ғ6|+۲rF,rzUbޯ6|Ͻg-MbH(vCcK$<
?B5?WF0E#覄*郟XVPdFJDVŏޓʭuI@ R&,
v4[Zf1&B|c;h*l08%oC2b+P8bZ}FqoXnɇsF <y-Vr#iIçܿuIե~IT0*RSĩ9MW*Tl]޴xP;١mB.3:mR4+!Y+.`ۺgUZJX<PvX";_+Ȋ`3ۦfnQe[W8:5'gs)
WPyvsKص@sZ2]Sf!kЕĳSgP 3:kȗ@!(_rҩrF!Ku zJq\HEU9K*rϖG+<s~"B"Yܓy-!}<5@uݡJ9۱sQfnwo޺ńgx_6muj~ƂaQNT.qr9r[t$y'XRR 3Js';nIG"^e8_~k*maE݊S^#S!P2%m,~80I`1إ/>|h8(#`iGuuֳ;<**gS	yHr4:n74mZ,Y̧eyeh(\/\Ḻv	jx1
9Abop
-#ۨ:tk^V-w'N),Z	.(~t]-8>VbVR	":~s<,Zr8|\bA	|zH}*p	ur8Pa॔$5j2!5"GhfASiIYYaAFn~pu<W4ZA'5uYf\yX3>,P#*3.4D|7r^*8͸(rLƱI[/"XTpL0*6i\gDNJdSwdc?A?r_]Oir2m@5z݉˃Oo+UcjN4wyvG8#	 0ɐW<adjGu`J⒗2+^HKK$Rb*&Z\ܿJ7F\$xiI{"cgn*wE-z[ *2-Zt5Ea=glx,
6
9"W9#aɒB4XU&|1E囔;/oH)PeW.\	\) @)<$Рs> }Ht!@9l3E^Xw.͉5"]c;F"Z(S&~"t ,kr(fo?9ߏYi\E)=}̋/0;3*.v%kJ9WY#S
N%fCg6CEqؽ>&gGYLZ+-\ /K+vmėtLjD\i&*ajB-UJU*a*1F6xNKXf141HV%1IBlp1[1ԜC ^D T^~J_e@vĪV~:ڧmvH:}\CŜsV+{1NimoyOFm(VfFtqfbScǝ&XB[҄|D v]Bz4G@~ih`ɴ*F6ZolQ\chv?,o-&&|l!: 6-";流=[s,.7DkF	bkENe<zHϱBG	Rvs?ՑD|-qvf|'$ؠ|ⅲ_$FmAnۗzXj?d(28~bm(텶;N"\w.welr1fmH 2w;nP_{~Yv;fF\Nemk,X[սxpf|]޴ǍJI0i
KbAuHD/ϣj&w{EKY}j^&qbA_NSOu	8)ǆGP}*'x&;N2s)wPxW5%V-an&4ӹϋ@vTXGwЯr%܂waj_;0
I\XVjRaVLhWU%-3
\dZqb{*yUc#pO!t̳#ݰ
Aޱbm IdtcbeG: )(h!'iM%q5Rk08r3LsJܛf^C.?`+y~|3HiӶ5) QAr&X(QsJvh9$8ٓ{uo@pes\(wM3:(
FY=IuB?h>ICsC\st(7m]:"8sō}2Tu[eO4͠>#;}/5)9I~Te.tY	H!-hk"O|B:ޖeǱ1*u8F3J4~u(Gdv:-{sICٛ8վew=VO 8=CXnhȚ#s\jc|>
j3s=+_[<zr1+ϥYF
.e\)iyL2 {ztxJ0}drX`MGBMӓq wLWf#|(Hj<6'QQ@X
88Ax0$7eG dtb&Yzi$npL{Sdb)(cƊ) A,k"963_+0R#?^%1cG5*%	hM5'8ST(Yglq30,:KҠED &1!0V%:sC6츉`@=B'
mAq,2w]l0tPg;ZPxK2~?lP {B;σΝ]nِY
KFn.,'z1$2oſFb.,>"Pdq.L	HXS?w$,OM=z;>D>{6j	\.gi%
}YIyrRС+FGIf5TO'x"dvan0ØU(<I38!bSؚOcL]/ z9Oo=:]\ꔖrţ֙'h??nX
NJow,?1м@CB0-˴ۘ^>*Q$=ޒi©K|&↨N}肀8:4`HG`o:Sϧ׸D7Fe}(8X\Q*gGK220ދG=IjmfUP>)ߨ=Uo&?~8FFsR	DBʟQ-{%PZC!2eft*L2P6}X#b!uM$E#Mq1iCSE- 6a2;z MU}PQEkBh4Kb%H4Q4ȹ4	!uJr[иଙ!`F0!ҺFAPWzV#I|ch;AU@F~|3:oaHbOD9SG23lS1FD5{<ѹbR"9)ǳrTMB3 U>;o:bߤ)p$Z=k[hNJ	s.{Y딗Sesd1am7'JK oO(w^p.KC;C{`ۂϸ?j<
?/c:⣳=ٙV	+cLXnXETP+2,	(_Mж wZL>I]dJ	RsCtV+.;ɢ>Y%6%M8M#f9I՜bYi戙}UJ!G F^HP2u8-M#X900[qd&xj" #d"|
eT7GDtk2:^tYdKLQSͫ{a_+hzw8?bFE#/_T\w[eqa=XvT޽/gUn2'>/.}y{s+wMaP,<ځ1@'VXF/`"ؓa{s&~D*zܑ'f+76Dq!{_b@ȆVuRW-]F5a,%&.6[K-0yD	&c.t;1e\X@=TUReܔ!1EyA%\x$!Cxt8/N{<$>		at;RVU=AHE2ݻ\VW3!9FxnJN#=XۊM+D3>+QxVVFc3-Akdb5hMb6!a>vT6ūrpaLПkwN9~6lOe%4d݅?US3߫S`SE"y>nt@^><BWH{v{ eIMxF1NwMȕڃ=i|SN.\2XQ'XOljfS`s<sP;&ANRiNmTO#3-n(zyl$(= [MюѢnl.s-ߝ=?]#.-y:BK>! ~;Hwq VC%[l<te4x{!	s[D3/@m+1,Foa(t5zmPHe9<'F5UKU=r0Xݤ .%V/(3)3T8Lb 6E3j+й/m}4n-<i@E^5{6Q+ E6c䚇r=Ԝ6Yv Δ2,^n؀)nBx-72P4yd%Z?[9);B][jcBծTC ^-wC:i֣2i),X?w^HShP	e9=;K3jZ;d̖L¹z69M/!(5qy D+8tv5qc4iKy/ Akxjz4-*= kAav8:;=!92*w;E3}039Ѫ)+2	4I&yE B/(d}|i_lI?aJWR}Λ&+A [p%(8/z8+T܊H'ރ`M)[0) HuRv0շ>^rC?P@	RF*S]-q_5ݷ,)~sxzyէ2QG9d&Ip8MwN6ڞV߬0,s2"Sf]Z&DLrGJot?VR3-xY_\iyZ!WC^W>k9j%-+S^@EGj#MIk{*ocH'߲&/x
נ&5xf5GS^nސ4/&=JeԱab0"Ý<&RV
@K*7fZ3bvF3-{)%-{dpQ:=|A?9tpKtӊ|ްg?/}@g;I,495'|	 EX6d!jZ<;FJz?gT0B[y}h)ɓ(%wχHdSgŕw=/wx}kU{bs]Aõ' }pL"̠J rs G.&itY9d7 >%
grj ;zC%>}KK-B_Ut׉~\0:Uʞ`5O/S%wbFj2ǓKb%:Wh@!Ȑ0Rdv&7~J$~KϑjVӋ:i1Pѱ1͕s >A	-:p%TUG9SQ'Ƌ	'5k]b !q"Ȫ[,BH>ܸ*	WC)Tn
!TDx@g7_U+\s$\&&AuHVN j
σ$Yp^6A;B[e<$VB5i+!qV:Aqzݘ76m<]|-/OP9ŨjY@HL^T,yg'h@}-!wu."<M-}ݬVzA݂@Q:S+xnwۭ qWlúj~UߓA{oGޜ:/0J;cy+hxz"ohǛdX_q9M;ZiQ7Y?0VϏ&0^CMx99v"14:R*i!ޜs췛j}؏,OY6/߼m䍻zE(ǳU0ӣ#PA۴e0uƴ5XҤ4r-nȑ)۸LOچjt+&G_4H	
{tJSh;)k9YA^V8/RS8zjR|BcSR<~LER+"1ֵʅ^`*Bn"D,_ѦnXxe.)ˋ`$:"{ۃf\])4xTeq6-%)UgCcWfG.Q\4_LSeClN9x,ܼJSiRPh.g7h-jUy0N¼fm\*!wb<($C7`^u m3^kQ(=c[RجXĮ%NA5/5&]dqB$eP0"j$LȄAq~o;Q9<a *~>싻voiշ[Q:@v$q"?@}mbU-}g5 âhcY,4ܕDX6!&/(%?VZ^ t#;lB%yAR紣8KX >b1o u;S`Ӽjx)HsϦn6\
LgkN)md` ކGd`	x{F2}Q<P
X>P,qy`@.1:ɉ:5P*]Y6G'>ĝ˚	wʤQu 6,&<B%vBS3?y `y/ߝpyH4+@{_P440>25c2kwb4iQeBDjRnֶ72҇}hJ%, 44ǀ&]uoǩ컅G|*1}q VDȍ	('Dr:We=p2/݀tvYI-"SU0FX)"'uSC6OEf>!1,N9ϐ8Pnr0*"SYBGulwZyGUJiv1_F_ݗ5ToAg5H^wQ?ɭo]ODtԹu2R
p?ĩH0zց>b\x,5GჁmjNӒ5 ?\4[e"ё7	8b:`j\١H.5A9I@Tl@9[Z0w9QYP,#r/)1C{(Dt{@p`009$AqrўoITj;!Xkc
h
.c~\Y8DI_`@k[؇| i%!O筻_qqF#1FrR -?r@&s1!6/m2>j&0)O 7iNЖ|}v|f$Z .l3XX4JT'
p 	\rO?{-o%,oĳ]XWEc!wYhe*p_:>X{J<Dz1{܌EX)voȊZ&3]D؃~xg^#TSw-^|tgxX!ĝ{۔AńWeygezDvMwg"ō5^ՠӃznvRU9+nB:c٭n*vs 8@~4_[<R " coh]}K~Mc듟e]g%ʟ7z|p ż?	?XҝE]Y9>~MpjOYg$;'CP7=::[Ng}=XdɆaJd/7
jFi\#Sʎi	R`6
o 8
>d dF7LO/w[{"_F>2調?kY jVfP RTL`'/\sǿvZ-;<ќYKXҌkwE?ON=+};
o糳i5p>99w+dҮekO.~iO6T(nzxmR,2+a[k4烧
TGg%Kߣbskl#@|e{"3+bD!jR
d;/Fkʕٜjx5qQ&G.vvO3%'Q'(\33{j勵n^+ td/6'JZؗ3`\}lYG@GСLj$@p4!tQ!F*WkYsr}hOKek閨)VgG&*J7A&N=/ZgG2׈8G#fyc9Enґ'ܡ\ϿLBOf`<q_TӤP߉8Z?BІp<ɛa?nŗ ΧU#Dν4+^&ʊ<!"z#pUW,\UWX-}\ܦz5weuSJMmX:ɣ=yv4f#蝩_:k n&6K?YlYH!r>*IT)NIf&P*u"7t=6g)5Dznp|}κ wWEOڽM8o(܅/\OD}_o>V^2iC}rZQ=j7$R"3!G<$Z}X/\qQZ%	iJO?a(AlQ`%g4_+U(j\_L	pW.݊;[nZ+CPatR⪁נ Ljm\4jwaQ no J)[Z左=y< ś[p}4%cJwj^28(wãN{g9:ToX[eq	7~ҞٴꞣVW'Gչ,XbVE{!iJ"	Sf@m&GVk>Z`
RHքt4Q$͍'ҽQŅ$'&)CcQ;*u9bv Bk7Fj\>INA/@AEQ'c3;VB|r
􀤟V4 	!13 ځcĬ0#K(]vQA8~4/$m[]ҝa,=WY	hgl``B9Skݘ\s@[}e2<(
YitBInlinsɮwE}tcwS紾X
ń%Qp
GOZ!	nE|;i9i!uny ۿeU1mbB/cD)[Ia`#
iiDr/pyy{t3wć;HY7 LTE=ԞbOh)"ζ&mCU1Uml;%f p [3cP^;Z*Hd-NSCْn|I i75hN|jԃ\U;dܯ;ZW,3S\1_9΄> B:A$ZPՔzU*ѯND2FCO,ch>|k}!? ):^	s\ٵeYT[{-dx)\}J-4<,:?0#u+t~+3%<WDnxV<4c$mj1j"5Q;= Loxݦz0WY\ɤհtnҮ]Yl` YB^x~OI:4jIm59AEiN=+dȘ,b.^&4ޗe
FG}@O؞>	`i}uW_#pدi(Tf'7X4=Y%QK~0ER!)cH^3Ҵ}'2`drE"mPEI:( ;Ix*[ȞшQ^@6"n7m)Z
h	Bp	i1<-_;uyЮW
LkIT!-,: dc3
tSpiyC̎S7W0H31j'̔ [.kk"G\7W!Ga\$3,pal]HIrsQY油&UZ%2uN>$f!qNB=p[cE1"FlUˠ"%&p2 ljgZЩϐ2~E	*(3~_h>>`=c+țZas:hDnu6ڰ!FJpb)ګI9P»QbFtLWhړYg9/N|xً+▄$V\#4x8Ȇ:Av*tO n莟sK'Few04]e ~PdxHbꇙ`LW$S[tboPӬ)O,Χf"nRFDn#3˰GO6i5)W?/Ag㴺-K1jfVJ&%Q%
tO1SD`x4I\C{:uxh^.SQZW_fS- #nxGZ+ & 
$\~VR܄T
&WL,pȊ	W\2CDzn)kE#wehוiifRJp(D%
s`?RpjH:RyMi1y7e"KSD-yAwV]1dɈ(^$RR.u\̙|#%Ł,+DrSgIrԴM9Hc5ǒ{Y*FCO(2{fF]d5gpJUbb(&ՉLTGˊKn:q|,{ߥaWIQqJxWfa/PI΀(1;d_"dտ5]zmۦ|Ҽ@<"aciE0ګ"	qwOo1t0zARwQG:KD7!53<%1l$Zh;-O"sͩ{n98<FgGMNdU;kaV`oǟґPx=v^3ug(`,tdP:m	ca,*͆JVY3nL#㚞l:&MKN,/.&%3xNc`-%HKW|Q]`?lFd9_О,~!1(*󾚹oCM ^8\@&Wfsݶc	?ߣc?*$ZM}3;jޓN,kj'N}4QyHzUqpҭxZg -ɧ!;N>onw2MOk&K3&-8"V"*;A"eTsw_}nnx^") at<Ť^T@5qPK(r	 f_)LK6B6*e# m 	ɽ9ח)R%dⴅ@@]{B(4%3(%	F<H?٢G$0aPhIsp<j(η"4dqA
⦷Y,?9=k ayS,\V~@<?A7뢃ơ~	qBb*`P	{^Ƨ/y3Wn1%mkkIT9Nǫ#oNI
Z}	 5"9_>waŪDd@Bx(XA̬Ue.w`a2xRWg0)OkOd4XsSDӓqs!Nu6XsP܇'ʜG7fڨxs(r^qZUs3$>G[ʏa@^vRB12:fߪ_
(}(07Լ B_
ǭdbQx3qh*+ÚgDC@c8fm2eK#I#"J%M[DTbD'O?cdPM[B+f0QbvIR(. =97ڥ_ϑ}	?')Y	u}C`ZDZĨOYh} =1`&$b$U̟S	L݆|Y	{_דԇ{Db"0\ZL&uY}sϢ	?iESk0w(W9z~^0 wp\
ZiV[yd*^Xz1
D'ycۑ)\2.gE,WDoIS~?]_X
C~KCoWaY_Cle']_kxoʛݲf;|iXs<j0RJƀE7rp;;?Ȩ]ouW=	a>/J90H^R~!0Y+Dp#ڐpVBo1/I"BLͨ{#Hq2|̠:؀_${L;w"V>4Xqu	ʾJ]iJ۳ws/:U
J#/by{&_o'.?i/^n>(L5Ʀ~%ܧy)}:è)RW(MKDKh9-]&;IO dB.-vd`f+;}#{x, k%HY>#FHMx	_!]gp݂ٓf:}iO!E>ᤐ"3C]5
W}n+".\Vg>~:eg6_B/QMC*/-aӓeqnU wv3t"r3i59 A q=ags<:pt	g_y\>ޖ;݈da6z#C*N[s  &#B}pS>۳r6Jy=@A#`**)2mx(iW[!('}|Fz֎ˢ?LF!\cT!'6߇u)gNP^A	Msܥx*EKwfԔ;M0z}b<1.}.1D;@)U2YeCpD4q$Y$~`zCXT3Zd>\yͰ4 hDEjS)pHJɞ=!_,ل4c5f&.t؞p85x4`A(-<$ySO<ݧuB	ޝfqyn.9!KdJ3"+`yKjQ2M.m;a+5F4Ob6ٳAkf`-®A!~ p#+qX+>5 ҂wc팅vp]t"'Kz,6^nbB)ؗdMM߆/ӝPY+ŠQAq 8>N)껌mN[tkn!uɡ́[-jxp°
ƼiYf^__nBDEORT&шDhNq	/yI0(J(cWΰg';<aH ET'sɏy%p7'(sG|`7~w⡐ŉ
`on|/0̀KJc_)Dq7_cYNCJ
fAD|0@dQ*Xpu
FSml*HTtˀh)GR6%)R'b."smJ'6ԛMBTfqa>"ՀJWzQ&?<1'Rnʕ?h(1)*SF^TSh	KnFL(7l6Ь׵pxht7Y%!=ߌJDƣc9$δ9514e8$WI%,u+5ԝsQ7܉)[_rR*"ovv#;OS/LdENxU]Ԓ+ʦP$[t<-T	woG*W
]W}EDT*%Eس:ӌv
(xȪ3\3̀Ea9̪8?6Ŗ	OOaNMv1y|vCfvBÏV؝Ak)k^7¬fS,R!~3' _

+O5s,H?zҵ Y-¢Pe;[1u(.'4Ȗw#$	
."7<-$"_0&f82cn`eQ $XC0i"=L$xL L)=!%YroS\!mLoJ& k8IE%=Gcg\KȼAӃ#ҙ祘v/hR~\T8S֋8Yn윶BcD| =/vM<}2"IVF8hc4*"MtLXUvBñDp<:1Ci;4VRЃU:%3L ߂uA%oR#C
e\nqP8} %H6H>Щ49$z?zL(Xfދ3:`-ۓdbz	yA"ؙBR {g$AǭaB~m`,#r+S3qlNԔ39TEYEVv¹R
:v	Jii3!`a3C8ٰ銅$/'nS#1aN_Sqe0<Wkȩ[6 6!׮f&K2:q$LzpTK$-g:5UB24,@dFx<lCT:IB1CQI3hH-y(n"<5}켪>Wgvv>)u{ tZrwG=_مZcS"H~\R;䱯1W^o]b˵ˈ.\ƤYQj&Ӗ,D2u˖نydSNh
{$~G2䔬H.V3lgnLʜf@~-G:Yor"d*YnWun$|	B7^T`R q~}\HH?^DL(\Hkn !)7iEB
E^` e튂J4Tpy)9 ]樈
58q=)>tQ=Y_f4[]3%l_!lK
Dw޻z<Gc4DlZ2&	+KE :~Nd.Ʋ(hq
,3T>Jvl//g@0f]3Ǟ勰J/ZgpK>iL*_P_(4h H $iנ~b_IQ9z1V"xslbi㎇(~h4!&*Yg38%1csJuKڀ>#-.gs22k&XVNp	*bntlJnqz.aa{2T!-DEBKa[]H)(hEwp.O3^YrBahY,GΥoPdޡrڷPpXlgu
) ~}	:b۸{굗Ru]:[L*+XUe#3N4X"yag\i
A4m+T&M'gg[ *pطjBN-sW9>7/>Hx^VpvSf(MP
;;< Lt<$wÜ23q:_==|RwĎGuXn>J7-{*GHHZ^=MiI$jϘJ:# yx#"k/׮/fY6ff'÷Bz#뤂+r\p4bArm|naE6*~
bd$se=DTDo6A
[н|6)\P)=etwc;<P_
&j\H{"d"JCmՕvp$o(?DEe3f~_Fy_BWJ{2۳E2bÝ*jJnnY>d:_zL-ss3JbYº~A\5Y^@ )/|a	%Tޙ"4b2vw	1L|?@{Hga?ϾXT!(=BؓIR6-t	G[%BG8j3]̯c&u+8ׯzoV{n8^_W0qmh%G1+#۔KK>^fBŨ?&&+ZKn)U3}BN6k&&[H14'Eу} iSOZV>\n{X;eLmJjDz5h}wUNi)TIO>冟L.~>2et#urJA9|3CW6K: !__J$*KAwn
-S!'W{L2h]tP8@Mk u*h)oOn@rVO>f"~RvmknX@8U5@$!+W}8ÃGnw@rLb,#_Sj%%YS 	|_ɗ9v׬@nHmRf8WE',jb&fsQEMMG΀wxfq?ɧaS 鉛y\4!Gk=UxeCK|xb1A'0X~1q~
ʴዹ&H^IB*i\|k0<=d 7n>sj}[WQVX-(fKu=g~$~KLo(I?
w$U}fk LV֧zTI+%N|c1L-CFdWEݿnTꮸgPq* 46g7Ů 	I`_M>ɸX4A(2rKL<
9RLʲ0Z6"$>',}CFdaCjPQi[=d7
$Gjwne<v}mJwM Mٍd׺%75` Ytc@UM-@sډAaܘO3bRo(P`ayEYE G4n& Vᑗf,!>8OSzIxo^w6kdT-0<;8Z;UiEQ|{@Zõ CQq0l><qe2lr12J	RO,@Z,kLU[+5I!dӬr
M98<`Hen\;]H!-3ǉps+lx c/2|:mLjí:x}IV<@P.}~C*.d**sEG(gCV3rjfxjIfИ48Y?l`xU&bRg;	Rnt>|gzWSIͿGݎhT,k#޿cu8ۦ2'mʋюz40^<{l!p^<DyP۷qӣf!M`X/ۭ`u%#h^S(ug ))\QO+(A!4.p WoZF 4xX$=+;É%}
5gzZ8h7(3IO# tljh	MF([g>ĴS 5M*[p
|ϊT(my]ŧ9,:w1MD/ݷo4"%av%)Xt4sxw/sUg&vRS]Pt,P3ʻ"RJ}'>SZF73f)~?1(xjI &U3A.Z1AҐEK޲&/ ,=Iyʯ>v|vqbYgN5L*o&]ieٽeq{{d8A&[	Z׋9\_uȪ> l|k\6ЎWKN;	}p=mg-'wʽz{D?k/xd2\zo~q|_K`$tRϘM3!Bv(]0F&®muwg]r8fS ]HDOD?ު]%}wz` 1imkvS"‶z6P0aq\9npp	Na%ljVurp*͟ø?x͗`y{yiGQCmo: MlR]k.|n@Pt)%r:{bZk9ûCUKx(-%09g3BYVׄQ#e5Qn7x)"CWWRx§;]D_o>n!zN96-5vH'ΔAT&sgKWړ*43_\^EiD^76fpVF)IֵKJ	vDg,re0,13}gƄ\AE5l,*+D\R&_%Equc,)דǑQsh;JG^'߬hf`XA>Gh^#aM I@ؓ!u&nO3w7	grL
<`
oy\ ;XhINb$av9.,nQΓb(;oyeqp6cVLv'e0Z{+R flsK- BBAk Nx8ˡ'H0'P5vN0S t؍|+I1"6F(K /{&L2+ض\@*'PQyxe8 !(;	jp	3_&B|rkx1waW!ѮX*IU3ͧ嬅9K\ĭ&Տx{4}#z,(po4YV`	\rm<!ۨ EГ#wO3V!I!v{M\S"X_:BkGQ'SbSrǀ vw'q[.J'u5̹9Lz? ~>^l}4$KF676"nQכr-I5Jj/C
㏝\"ȍfo"GfSAchW%*#P%Ċ4@Q2qȘ4ɫfs@6ǂ̀a&mnUOW2Cɺ75RPX2S:Ћ6lb$w^F]+ऺ(rr-*U&DrH<d98OtQF@؇m$}RnQv6IhҰϗdtAmϱfZ#=ZI?EgQO{gvAK/uO\,89oؠ>`GS5f!\g(欏tS(/-+za+h<'L[T&FuLTZ}H^U! ,mo$Gm'vqyVIekwcNB8ѵ>LpvL4g)o8%
DiOXik2ɔz܆ -~tV*2E&ezTt~n[ۄ&wxbwK Rsx̙ަ/[҃~ܔ*LG#J^127_rIi	)DI_81޿OLpv;:"-v=Ρ6(GiWLrlJ*"?!Av= ;K!A>1YSGlYԚ-]"3:
(	]]ձ
F|1u8LIwϥ<~_XjK(ĀpڿF%Nq)؞!!t˟L~Jn;x@_ 4r;B9ۦ5mw^9qY>z;n-MR	Nq%5.aET'(M=`"y-wTU)(p`	*l&zm ˌA)0B.ݍ*蝓?Yqb0wi^HzoQX\CugRrv8͔K/fTh<yǑ ؘTe$Qm~BU'ư	2 !WJr꺏DԽ$V"lIy9wExkU֛Kp3zM@fgޱiyS~oHT#i755I'ϹkFXF6Nz~LNܶTD$E&=`bz:	e>p1JjQ!"6BH1ɓ1XW:ADf t=z0ux6or.7-`h@gӟ`$S͒N İPXȁL^ArKnJzBRcxMUSU>
"˾b̴wkm8?%I@"qbB׊ӾP;pE<gBGIȵ&7[hҒj֊]yZaƲvBuJ2iio\Qm šǑS&EKrog2DJ%jv.*	99@g^ 5vʕFL]vm"_Uo#WIԲIf߭EN6iebpN)?g:\y Nwu }ٍxKaءN:tK׳Ot]n6GjKl|An*c?%@z+T~;;<Ga!. WO="]{%oHтP0+R /hBEְʐqe:T??KTyD' ɳ'nFƞ KA;Mm4 {sae4,=C&̐
2"2o$|DxL)1Տnr{xǰi	8haTBd: 8`3ZN"<#P`3*ͷAi# *ⴭKtljw!:t`\ w.%<|
Q]MY+{n{! ??>y<$j̅[H94h[rPH+󢃆4\͎jkz=ڝ{*3_74ؘ=55B<ʞB@TPQHwK	,-1@GK;M1ClK{P?Lm7r*>GS/$?`Z訯/twr?r #(Q}6{=,ba+(͏nF}ιRE"!!1}O~>*E (> ]0]*w$yU41Pu@p@&m5myГ.(;bP_ηh0qTXQ=X\WM3g;	քy7ptII[anLqd	-'TPdȧʢLdk&APe'X{Т\:/	"G-%)ոXP̭
sWSm4\Vb 1<G.R8{WSq0%u$dfxȶdmv_?S|GqRkh$F.k]|}O4Zh ~y'J'eag2,J6ճ.	>{HrVʠ.$5܃9 >ׄAth	JϻpPa|~S$"H3  aun%9|.Bcӆa
i*f8:Vk3֧G=˲#YR>>ewaW(jbdbe@yDuECۧ7"Sqوr{,)$#YeΕ:7kV}<Wc	e dcsޠ~ݸАE}l'|Oykͨ>*Rg3p"M!-vSY
0D6C3]F蔖f@Ol@:ej~D/r6՜3NGEڒT[
 8ng#H4Ha?
/}Uݶ\ޕSG雲}ˑÁЍ/k$`)OڝKf)9:,j*Ow5ġl DuT q;)ӽJ'}"!S<Y6L	qj%~!X3c	M	[\G͵Q0DhIBo 0`8J=<<g^@Ƥ?t;
(vSc VU`goݫC}c
X?^SA̮".02k8">PIbl<杧i= JdPu2HI\$(sL:1|5dy	uۆeA[\N
UųUQ^<NV&Dd6tXZjE$>Mv#M",U3ŴHc"Tf.pdéɣSQ&l&8W>xK0=$zz&ܜY`;9pj- 5F6'w 8{u	bl^7!'I#fd/;>`[ѡ aMtqm0fE8!*EVp?=_b3\0#n\YstCzYo$SGLOw|5}% Y74$as\a ?z&Zװ4YqJ);{|qKJgA>9/* j<qo(ph@JPHB%[foG{._;5\D_WRRz@/˨ܳ7bO}[ 	c~fr">!'ਈ UIdW:pd09E'	4HcO((z/I:O:'o-HT|Mk(5p# 8GHj[\1k?X)9pfqfNB9fzfn!ڋui-%-' cHИD祥bľڕ8}O6j,)7kbV(Z~	AO-'LX$-Pִ  &R	퐐2uW!s𻣭א`A% _+`.}թgQ52K3`NGRRYة]EquHj֢Pb%÷"ktn#Z<(,&|qL.֏p!glŨA*&@?8.^$%2|k-}B	Nֽw/^pR=yF9Ԃqk}`A]h,crƺ1H#;@ؓ6˯!MZ`qaȩ!`rd{ԞG(V)5pwHv
-]10FFy,kgVǦ-SQB`J&,xr	܍;(3C$l3PHvOyy[y۾oIN$U͎QU[t_ro4~rk4w\-N$Ry
F$J
lnjQ\BuKM9;ҷB+ uHlO_=c&Mf?֕֗dTQcbC\~(Q0{q}ے.Йz쫨(f-[=p@?XĂFhN} !zZF{ `֚iYrĉ0:/ƣA3YCEd{ɠ]q;P[ׂqGV]93S0ŵkЏR),6>olv`O$bj"^s?k.&?(-<|i눇Ϲ~C-BM~ItRQs>CzQ+/3Ʃ8܅q{%2C	тP Wf)->_+wg?%k
xmӟU#^lz;l}bɽKlD;Qяb:I7+Q릍l0 WӞ4ǳ,
V蠆܂S5]c$zrr'#Q7t'^c㛶ǻÁV;"Di8.jpU>3dqie9n 9!x9о9n Qm~>@dp5]H]V_T%)0uXl6>r&zCk@ #bWCiL:PH cr fx0MeI
&tV
 ao/9jꕏ*XpMt׉e>Vך)zVݖ	sacx4d`b)#8=E[I-'omq_ϰDE~u0o7J#$+s3%rƟ=su% ^7T*G~8j@Fj	3V(;ސإ,f@%~%t!MB.gc/ K+g=+t #H%,b >؄A:YLa:]aE*VP_˃Rs{gQPtQiVTa!O8"@
0Ѳ"*Q*Gr\!%eg!~Rظν$6anJ,*0%	軷1:TY]+ _bAg06Ax5IʚcRP4Lʓ%W8ee8h~k-CM.R6-2
X*3T	f0l?'0NM*#^q&R4aHlf>>?&YbcԂ"E Ys=>H\וd|[ݴK=80A9"A<?Br*_u:${؏:oh}[ޮXi/!kEŏ4^7<̝HC&]`Y  _\c*[5epD>ZPR[x1R?!z]'ݼs 8OݣbjR(|=R^pkCq0MN|qc-
$|H d4)#!~.CZA>$}%"̿yZhϰ\ƾ$q?w?3%i"h4G]v[$N>sꁊm1"9WqkQnڄ)bQ^gUyJPsSyX\Ko\hB|xw	ƭqD|xOۈ6n)
(=}D'>14[<'>ژ'oă,}
߬RQZKܩ8m(Bľ,xE)vMl%7]SDJ`݊vG[]_&OyaӼ&ƴ(qV]M3n1р"DlWJlA
(ȷ[7NyT:<\q^K(w?Y]keY{̶8c̷>	Ӷ硚N~oNs1y>@  l1Ռfz#hݐsIff1I"6Am<tiݔ a_I4_'.{_m<^,/(OM&h'y.|8Fk|(FtoPOmGT)W`֯A9fpb>q{0~'>frU `gz
5ZA!]aIzK;rdm&OKa	|Ĵ@ᮿ]p*$߰/Ra	V8Z!<&{$-<V|Â2ƾ5-|u2׹[JWviyźʣ2a7ɘanI7aj6"JGf3ixi--a9,:h#
KY&crP;m&.)RbϘ)C$vdDEEO-dJե#:0mD7,Le{n=:N`9;xV
|"I/gel;M%ȜX'rgKD:3-5Z~z",	bf$z5q35'x;{:bxjH\Zѵ%xk`Xۄ~aZaeI62ӻ59NnU+dbz	E+Ӛ2ΠպMOy0UE*ony,GF$.w3 )N0"p-ߢ/5'	BJ	]Wd#_$\(BMRw>rfCA2 |vzg;`KML)t1 $O^1I|[sԑF;Hwr4y|W9|Y	bt{kÍ4jsiC#$E\ϕi߬+R89B8Y 0- hޥ7T0<gR{$4W'teۊ'q-\ ]A܈@=̐6;@;afG/KKl\ƄԀDt0	4A-7;pwZ.	YzjM
4kf1TW#ek,?|+vH&G"y=3])yQD@Iy318<x0`#n".kT{-\fAB7Rb4ZA4U300[lP "\75;$Zs7gNLeJ*%gV*bЭ}}c\b6?|IU pdK-.xZ\2!J[sfq RZ{S3s(vάv@g6w.Aڍ8G\$nG޾}v]//F?e[}-Oo(Tm³{TLZY_'LfH/3ޔGN XPm3dY4n.NMStĥZ.Y6Ψ&֫'ߜl>>W@lnN8d	"fg}IAynd`'.oȃ 2zu)^k$uʳ:ӥ55^2aeLg i+gؒʵZ{{tVn&qw.#υ8^x/&j@3d߅I
[[yļ艋8z'ěJz|טH订/jt#XEGv.00!0	QYY?08*)g{9[`#40)a[t3k22&i*Ҹv mL?EIc_PnJ`&ܝ %)嚫1X48	1S;T_~BOzLld1o0eEPnJ2"c-o~!;(J1% ~fD+oU]B)iHׇI!bStfgLAwh02<jFbstt(Sj>4#:cʼ~ϩ?҄+M9*ܗXy;==!r*-&~!KEуp%p*wRfIs_&Frja)9k=!Z֘=ƿ%OI)0nNU]O3+]PHĭGך'|eq<)$kG@i,l_v-ud+Q2D'	/[YgPnJ6_N"m7yZo\~8^}}crjTBvF}	zn@&K;&/-㓨IGQo(x^ZV(4Mjems}df~\$IvP"܋-Mq6iS2Y {3oJ4verχ>j1-툔FS mO  ,xhv!JYTvĦqkKJI|.Onf?;AK1T2;9Hz_߿<]su/@7<I&WU k*$PpISo\Zx(.m5"9PѾb1]wWz'mHpmâ~<p"8ZfsRUt=1,0-Lt0?FdnP'W;_;>=>n"9A/Qd F;bf@Yhczc]7ڈ8mٰY'J/bLuq]Պ4<]U7Ezɕu q/h7:NgC~iW\{Mdk8]
8RG=[zޣ,+(HMp$J"6+ x´;_wԙ;ioco
Nz5R~Ӷ	ךrKƫw\A)9Ң"RZB̈́Wv׃vhPg_8}6I"/Cp~{w~Y\طNRi<\{yY>z ;0c"&{PFΣX@_ph0p]N T{%FiTQO?޽p3L냷o~G"
4s`l|ہ0mWwJҍPJkW#-CХݥ_Һ?B's8i~r>k'׾;Mx7+iXJA7|-IN"W$ԉ;[Q$ 0&xI\d\mj2p7Dwb$.}8L?)	 >j..1Z#ZADcYdש0BFt&=wڪG켁Zd\O'|-DVgzNv1T\yrt8^4OY2O`d~yqziN*ho+%^SY[pe!~;Fq5ޠs>9cAD͠	ϢB_fߛQJ<Y?n5iv%+p 6'\Of5wA5.?#uEؓF&nCΈNGC[ݟmCىuEBڒBGw⹇|}HͤKA,	S*WvDTϳVJjn5t,q~'H0u8kDYnTH7t9Ÿ)/j9S@Nxdݏwac`n3g24N\pWZ~g{-z_O.\Q+
@7.Jkb^odWs|Xf͏`F"*}'Ӭd*Uƺiq)7B`PZV_Ă7Åq]jGjekk!6=`RG}az=@ѝz{p<G7j ;m1:5~CZ<NjO)s#X	F~4<3nf':Wvo<,6zҀ˺HLuuݟ\:v.i78ѕ>ۢxr4_*}?\}nwXʀ?>m)$S֗y~_Bs0e]śߢF̞CŞ~a3q+-Aǲ؟Bnib<j(_lybsu"?aMH##xJ>Pwx yY}a|~,p׸D +j݆M*ʒ/2w]J|1#ch%|_g+hg'ONYbqoD,.{ɛ?L\jI3L\f~ݒ#:[?ki?ٺ3=3iqxɗDl]7jT<Eso3v:|z/#6c9,WSp	S"D7w)  ^%~~}& b=eݢo>!+<~D{es?`&IaO3 ?zH	^kGrAmNa'sM?bxf]6XbQ`W#?6gʹr(s}b["ApձdR#"crim(mZd\2aNl+cPթ7!IX}yv续F>,h>:+e(hm$hxv,hb=(d		^湶m@<כÞ˗B{y7w7_[ʎ׋!v~7X8a]>-=7r<4g$/SJI~,fipA"OTgeRu޽p,A:]U_]-怾go"'\4s,#x5O ԏX7I@# 9PžPCa^[9ИrD5P;I33j1co@H \uz0DRt ǃ[6)SO"L"-CPqHtv:&tOe~y߃cP5pI^)ʪzRrXa
y{N2G%[>.VTH<+{!3w3Q]X7HP^9!Bf^i؋jtr.I&k,w#@Ϊ1j&+)g{.N^5UٟQ ܎ўkXm`m);O/!ȿ :P{o$fRǳsC_$)}lJ+gk}rrp|X;1բ3ײt_0C4W^}vW7*M-Mx}6i7D.i2T_D5vo_C&['=
mC>Qn5TaF ʟ{!NkTYvꁛɅCKHPt[067@UajBkҞ{ӾY&k85.LSwZFJRKɼ[1eo:.GeWփJ5	&K
^^VO_xNf[A6tepΚh7}+x[`[J'{R3ևKG?'аPt-7ȅϯQ:F\5`;wSg0k޽]|SȘq ZJi:Am&c<zKƌ3$=][Rـ	)/ !:g'%ZB\.d'^܉S+~/ê%ǏOH5`pD_]⧵͟I+~$)?[[K¹]bxl%p&nadzX*0ʪcS,ᮖ؛"2dƥ'.ÕL)/<hQu&n  Z !7BR\fz"R*12q-y\'@TJ#wܶP߶EGk+9AE.i!#;N@In0jX`WC@(WilA&s{7LW##,>a	e	x׏9que}aoaC[1
!<07$jG[@+NX8v1ud#B}0gGHwU2:TeːP+1,!omڀTR؟9;{TX8P>=h|*K2K[Tںa-D&2ILjϮ/dQE*%lK:SJ(`DxM/M3җiO $k-Օ~)k3	eDɘ{1:ANDΗ
>Hz5$wV?#;;~|tq. C$vOGFʂ ZXV-ё355{F<&'<3\~%pL pEѰք8rNcنfb&|
l.v8kY)F^2㧁\tG>	Y3e3V-\;}״z9tXgxqm~^hl:/[D$RF?v~M9q6NR'H}(G4&%*>N$Y q΅9B*Gݒzٓ t0,-eqxmB*wX-}pJ['yRW4
x9vnpaI\k.PQf_7ϕQjR(p8X@T$P ktP7=~Inl >%mH򖉋PP2"(btئ %i=sMsHwŷjr\b$	w,Xӏ.ɫjR_Lw6ΩGSw,DQ;
ιdՇ8ԣ<B;usxm,r[:j1B%mE-J\wv5[Wr`W;9{Ity(\
l<+U(*wNATH%7P+xԣhquNFyoLmko_~o(]vKh셟36ȃ"ivK?(6<98<Iq-]k2@Kk=|- M S{)V:ۮ5[c\VW*S¾JɂG"5#+g=bcؤMŷ`BҨO%f$q[sAIyK,L-s4æ[|yeW͇w,(wFSq9)T99i0\y<0f!Q׺쎱/R.-P`fp9}} W$Έ!Kkk] +eBYI2D31A-n+*b\WH>?An1iqx_NQct+>/| RVXbTi&yh5	jA|9yqO4fȰc1G֋:P1rӊg9@MHM`>ʥY®gq!?SSޟLxK'G\%rWN1NU8]# nTs\YܬG;Y &j/=S'GׂF?,y7O_9di&D<"G)`8;]$Y!}<4PG pu޵F`S-b^}.a./&Jai0O4*+OaтvNiohp%$tp"$ N|:6\S]_ͷC<Q9yqEZ0sN^<ȉH¼hkkHz=$;ʇ[Hy<_fr2~(_z=3ԇ]f@Lf9RKR۶
l|(4lXOkAJ4Q]2֙A;lY̓Zkx7yΏ63{^ښVG\Ϩ$rC`8A<ͧ勂9cM,R@|e6$ o#Z0#w-Zd="3ZW\$6xIqr\2`R1d>^:H#4N_#ĚC1(H84(P[ED
]5:2}C|zo%7xqzs1+Gd\oUto9i(ը]Vڶd)Vb/Dݺ.~lu9t&3{F|r
W;)#rC$<IZP1lْJ5=*݆A'>@})S`@P:0_Osg`څ3ɤkgcJ&V5k\Wĭ6|CؚD-[`߲	hΡ(KI}uVR.ųFJ,+v鶂[
	F)}ZQC.),[`PF-̅*U_EI,/jm"|yUwիқG>s>|f(sޚ[5IP,T؅}#hns\\xo}iҙt;?[~C*$6h2drSЫպˬ>#Ly0DC.˱YXs ܓJdBdi8Ũ]Bn#ATp=q=b/\emc㋭L.NtfPK쓥r!%n$8XɟYC]`ߩu,UHMR+(1ų=\vЭHJ*aڦh~5GScۊ|,bfuʲi-JV~|'.qnhjΡ>eFEa3>zA]~#Z!ڂcr8E[7B+A3.UZ&|?(p+Hp"sLmu[2𙏤ۥ֖2<LJ9`mvVF0RV_Yj1ǏBU~Yw}"DZ9f]La@ReT5yxD^?B39`fb~
]e]C#K~3U@!^x 	C$}f͕10KC1RMj4GO@yA !OY[LsF2~
+,qr6Q|m49qmm~ͨS@kMx9O1qucGFjiec]!N̰T"3kzDlRLC+e"ͽ[ʝ /nmsQ j 1,~{]Rgԇxa<3!l-FxI#T`
լ)J~.'o#L_܌IX#rjg*r9 )#a	ɑkٷq@w5X{aY:( |>j
?L 3'.n7QZGǄhcVۚ`xLEWꬾѲVqQAϹ~{]Oz7SW~NrF:e)ƪE-D8q1񏭀zc`?=~N&2!.2ئI
!{Z݅>,0)5Dub6Fxl{e9q	0&'j.1dRk":]kGeˣ۬-s%!CH~}D0惸~w.3y
Teb,d3էI'@5@%e|Q:	ي94TdU!05H46& IKe}rXCŌ
Ij9؀;<M3PT:͡Lο/좘@bN
@uNlzR0!Ywtk2:w,2pK`o`i	|>
R7.i=4~qq);(!YxLk1AWb>gku3
QUrFbݠ9Ҹ傪ЊG+>j;@~HӜ]N=xӇVqAhSP؟%X,%Z!kB Z&6
4L<uaѷ)UZZvȀcagF4UN)-Kp.ƨ`,r&
:Be\3>E@`:qJˡ\Әf(1lkAbۗUNGSnAfhG߲8^KH>>|\RJȅv1d<tůVpd[NweT*NBPvOwH}ZP1s,963H_%E\R4(f\G$c9hu8fr/>ق	{By[,e&;mq{$nZϓQ幺HfU6;`\nO!FN)	dIj:9hq^c;|Kۘ9+qٸEY,e)CZK3m.*to"SuSPe-(,1Q'|4vKB,AMFsL)z~FDA*BH-W-HTi.A_b
eT[M0VCFمN%<_V(D\%z)ȱoڐ:6:()H|da0!|MǈfD
v(G! <=8㤽tMXUlhrZJ]MssUHN#(mǷ
COtHO>B!5!6ܘW#V"ɡG^_ p#3aUDݰs߭T,@qtOS/pwoF[g۴esC
<=ǼrcKP_ZOLnR4"޵SϾUl8x<Q>טn6<p'%Vd74ܻ4F!每aR}E(D^uAb8q^pT|q_GxW̋*˟
iK~u+h.#ή!*iȩ/R|1O9jDtGߟn &'U/=:>ywgJCW B0y#+G^Ke1!*p(gW6rc~uCߓMqC($m.qmXܾDD䐡G3::sK0M>Nrw1vUxYGTdi\PSQAg+ӵOȅڒYa8lYwzn[pPR R^pPIѯb,/-2Okq(0lGG܀ضJ1~B0B:"bH²GAkHBЬz~G*aTd@ǖq=0B=6H_~|Lv2e J,ʲ3NTUAܲ776RbIv$7'rDOzj<Ø̟sKծD/7Vz0d'[dwj1z~="opLbG)L N cXۻr3gB)2/m+ GPSQ~;~+*/{3[OP8_|*74E,N%aA g;jFN\B/ RY˩ .\Lc༾	O'RE{OJuZq_`T)@lc}z2: Ćſ¼B>R1"TDE5xMiq 6{ӰbrH
 
gFUo0[d	KFP&x2ՆEap/	#YnFʜx5)=LAᱞ1vE^>n~ ><XFH=fwocV(o3~Ь{Ћap-:݉okPR|P0E~13-XP	IՀ-K?`a&lVm1p]5 
E|wGíwǻ=$72/"4lht%(vvZα\ܘ6nL]8\
>f}jAnq^;a2#=%U[w(|C4LS껣w͡giє8^MbA_xβXR1t[=PѮ_Wk
Li5bN.O"2hZEQȵ:dmF',ݐ:A1AY%(a)VmYS5B#0^CwiM&|F\h|J n$wI,K|/ƀ(zJ7ht-\Lz]
໙	M;Y3/V2 hxK!y5	ZQܔ!xPorQlq'cǎϛ9Rixhe+sg;d
a{w)ۓ>=/ͤ!5{s*W
& =4|W/bTrrGOEhX20S6$d/q~%z{|Sc3@u>r伕5fFBmY@0IHnkk1-"l ڛPY4p@f
)<X_cP$KsSA{7*SSK	
<$cJ
AxNEZ"ّ&޼T"êT*Z\#)7pA>7jHfq-Qa\ycځâkZ,<0H1(ć$[tA'}7"۹NxCynh$Hn?%W}讔ƚJ*
ݕnwjb9^!ʲNKO?%,9ffS $wÌp`NGKbR1Y"<,ƫ8!BAkۉ`něwhJ[Fx5QÌ&BJ>+0Z]me:Z3CO3U+~Ly,v"PŸӶxyph,kBC߆ZlWo{/~)l7b}r[riRC;q
+}TPx D\PoʩaA|ytT!:/ГMAf,
Vy^ar|
c~nc!5ɺ̺cԀG4ЙȻ_ɣN;:k	F/e/c$uysm-%D#0Դz#	qp~
8C%wB4F)W}߇F tyS9ɀt"` ң[mgwgZ-_I֝YD7s8gm^CƤ)bXG:K*w5Zrv*u@&	HKA!oIA#KaL"k~wNkM
.gK7%^_&Ȩ,%MiL)l\;±*(ZӐsKY(*wE$FhCGjm	nbtun*8*[*&?Q;=
?ބRl $CI0X4w1IwDDlRWwE$/,Ødsų(c?/ s6ƭT3.ڪh,'bJ"Ph$c,/F̟,nͷUe
*տ[G7Sb8ɱնb$!xfc"p̷E{6E>5RvC;,hE&f|:C1DRG#49<,zR)W~ sPXӗ[gmDq,;0ҳQ膾i)"ڜ:FxOw@Gߤ0XvsXtрgRM_n\B'|"%SۘWȩn2雹Y/J	iWfhћݝ`՜@!4-3O
lqČ+gߐy|	&
aO$g]"3\hN,lC?R`LD/&D5I;Yp˵wq=삡>H/O/՜.jY7RS%6CwufbI0pmmK~#wRA΂"Y( ژzEvo{F#xq#7B~i$.( 
@?k>˾yZ4T{G-D]DԯBҭ?o8@}	g+naKVM3/z1Kt]$YGR;R}O}㻟y kGʥ/qLyW6hXks0ڑܬ5v%#YQtΝd,Te0[hV_Ɋ([̰,)4P0AŔH"ץذƗryGƩ'!i.r{bW"l@gaJK#j=|Y>½Vl)j$@%#d,gDI&Bvo.Қ~9AR7WSxE=&<VMn]?flig$ax7JigݖB+%0Xeu]7ܶ%0> s+gKƨ䃺=`nbF8hs@[Űl;!mZ,o4aǡSb\%/ai)oZc·qJ2U&	ϓUyxsE @8rH\:T=ʖmA ANݮEPܦFvӭףRe(%ݨ*e@GP`y.78Enc4<%9*OMBȖT=()Nn*]&7y̜s9-nD3ֿٻcS7N1Rj~(VM򨬄.JmUh7 P[Jo	v#F̀>NwB6a^&ݪܞm/%/kaZ:5@ũ8Wn?AG?V>"<?7j1GtGe]DN"3jKpcVm4tcx2f4<Β`2;$NS?meN(qyci[t(V[|WY9G]wx.Qe#N뤀忸݈\"<E	7%~ ǁ
M 5as1!ISR%$ "dy`dnzoI)g4;¡$+0HUe֭nH)MJN̾VJ8I3/7)Wmp;aG[)	6z\a{Uqrө'?$8"vy"(ndq\{oaAF#G0m WST^XyZ˟5/|
Efo aa܏I)g+ј6נ 6TWhqqn
׎ϝYxQ3*DK­rd+""g$Fz`'}GT=fuD9N7ň9N-3A,y;uq?;ck)8!Ƭ	?L(	 Z".9Y30 Fg"nt3#%qGB+	~Xv)m;0nZQӿ.SgYfoqf3iІ^aa(q ?b7q!8{x4zK3@
ϳK
*{Kٺ3`2%Z۷n}wB5n<YNqr6̱/7,)ԩ`IUI0R2qx]Bȝ|p&DrP'axP^fܧ!TpMKs1/35Gbaҏ%-on8Y	42m22˗A"k	;^pXnzr\`z߁E ktyQ;bԂA#/:V NW/	ݽ2굏Stէ:fKG̒5%%o{̝zoVǝ3byA/I`<iC̾Z/^i{2?QyUrd=OƱ]Ckͺ8w6OMvƤAkY$eRilp߶@<?~-!~JץȋѵnX/H!+%9	ǫjw^J`V丵r2ʥ
{TÎS@bEt鯰^ڲ]4sFZK%x[_CXqb WDwhfUo}K0<.l QaAI|L_xsmߊD~Wɪ,ypp86v/?#k[,y.& ڛ2HVo/~lt!m鼰y:`WMG<L:>8/jI1@DA٨U<|Ǖ  @d}eq`_HWm*BҔI˟xܚ085(]*ߕc&:i %\l^N2q.{Г%d4}%c!fUJb)`j>U!c$8f%8HSX7?g-Zm9K:hA!(-h2gF	PR,gTΏK9HʼY Vi^kb1MGwӲi9]3sŭW\h[4JTѡ)d&U^OXr~;UGi6A6?Lfz9?&1(7
,RԜ~#WO@iwy|ĉk<*#.5-gc	UP@#Ⓜ#c)8bv|v[:jwy3Jܮ_SҠ[݌p2 NHnLn`_/߈dxa^{z:bibYc(4L*:+bS2s0<av4B	=izj,&(QhԐ[bz&q XniIH⍄I2|B2-S>8ߔ'GX	wu@ͼaӴXY 0Acjk͊qwm:WLL042L&#7xˏm'BV.|#{"ZR;K?q#7Nu6Fk1)Dɳ?YЛ7W雁aH.KmQioEߢ^0 Im*:zlnJrI>X{!f6i[:V*ăNZg*`è"?n_MkB597.Y/T*/ٽ+[8cwd0;JŻ#߶RHI!mqG{61
Ld9--SH30b&yK#DNz#&-}ԧ	qtee r4vKkS($h=S썌
" wuWRڠ
=-E+mnlc}bH`|Z{v-uWJO~O2#wnaaw@A)-&S9G7x߀IxfXNd۱2x"XRZ{{|ɗs%&?DDq^@㹤 ''P.E6vKBNޟ[g&Z,చ_V)'g-Nۡ'dbAL4֗Խ^tgX=R"0	?َUuu6=f j{'E,ըgu{GY=%Y*%5B
T!*)ؕIsPC l-cTU, ٬KQGi &Ž,qC+2[-kwkdpkoJSaAY3?~	j]&	^>/<aKaqplG5Vx 1u끲Fs9G"ö&"k! J_}Wǖ/ ϧh{񑰄vǶ|8ab3<5бPkԒ1~k893>k=̙zٵk8°?^Ȫh1"c 
&(%+wǍfQ\2HtnY`Ud/!}p&gN1i chko5T+w|d}%:Mm}8'P_v^ˈeb  NJ6#^@?pd0>rx%
r*bvAlb6u"R8=ÍDl?tC"ECC[l8)Vx`p>нF'XEd6w?ECvӔ.{iWX?NS}qEpcOFE?QQE{:(`OhnQK6#%:BM}In
[%im8$*Fp
 p6>e[ nB^}TNG=%vq^sNka4#ytQWͥӼ 4:_]R?oD5e(Qȴ$׋ڸ5펩t}$;IG.zש	mpWL1Ϙ1s:+!@75+Ռsq.3C\#?-buXb)3v\jST6_U^4lm<@KxajI	$Ao4k/J]ēo	{o5>gDvWNNMZIT{[Y^>lcE`؛R$. wGUMEP^boTE{i[j=5 ${#.D9Yu0g}8*Klzn	6>won2]_4
DT5LRцނLAbLc٧b1ߜ=vt~ɓFߝ8XˍPVA%nf@
P̀ZPH:-AJLQ4%ͺ[iSȣOd`sk,yZU-(e? F6(0	zI3W}wKi<oz^om˂:!9|d1U]4W~*YC-7Nb=+0Db樢<;Qwڵ}E&USqT7B<|^>zkXM&\G>OҾRVlK.ҕE|w݌ b(QEE>VV¯
Hr[p$;pV悞Y!\3SMnIkAxJ^ Or<5$ES05DVey'CEiv#;^cA=6}BhւĂ9q'~nHkG7Ul.W}_j-dӇK5ha hs	-<Inڪ|LMZ)x$I!zoDwmZ}u$Tfׅꙉ~=qp*9%Ԓ_K,i1v%FQ>nM_YRDh?	pA(yhχtd3!$Mx^',Cʺ$sKb-\8|8fW#R6UTY;9_aw;^,tq *hI#cqjZ4gR	qѫtʕz˚mlƜ8^w4. TQTD^pQ	>Eј_-l$IeRdO` DK9or0^	H`-_?7t/R	[:DBQOXq$},xgRX6:V{]wRW
\l%18;IHZIf-h,(n-Yq^JKE,eޟY>*Ѯ`ܱK	zy'ykފڦ˻rYRK/+I?4$T|(؉3+ru2.?xW1d5Ƚ:;_`S<a/Ef	b_6鬍0ȥzݠ۲5zosd!-|[D{޽6!1yv`۷]]/ʽ3AwW.wW]McKı;ߊHrvR4{dG;S&JtІpmQcm&[`u0P&lQ7,)waj+wLw
Y	g~, 'pԤR9UO	q.Qm,Qϳ@˦r6E;6>KWT]=	7-Z.:˝~[\7 9Oi̤nSJݝl=80>rhom%!
lYhA-r;<5&mjRg9_qfSoK8h.܆䑔J|JU ^sBIyb9R5ѕ,f\	TN$90[/Ȝl	rs,F"(W>	`S솄VPL1$y澐Cf'j%2njnCnQ'̫!+R1T10]3;G	3&˵υ!Hn+04LS5"CuDp<ؔ*̧k6^<jZ#|hZNh*8@ 0((R	hHSjvl ! q:ϊJHɸ:$<IFՖH)_״9	ou(:XEF+3 ]D`+c8;Jvºs][OVt @{Yr<A u}5ݬ#ɼ]ş۞y
ZűY)V*gDɇfŧ7dCt
ʬ	F420Fj6"r
@m[4;G+Mׅ  Q 㷔SBT#-~y%A/b:udިjra9GlI$n\Rκ&9'"J=ZOrs:\"Y$Sl({MBH bȸ0D:=." e+YS7J("˼&hD\W3Dپj8x5Nh Z|Ay081t!ِӨ^`DcBqتio7T؛3G(S2ȆS<B}Z>'TGY^~KoSb3jן`h1cOOVzPx`X D[5<jI=í6ŗirKrΰ^E9SvpiO߇:(+T^ gVVjڈs	]a:MTɤng-%1Ip,)g#7L0ۢ4
wI[[.TdN^G|!׷o4Cɘ!(bzn~=Ru/ku'.Vr'L4"ttr~*jZ,z8vεJQ^4N˙?:?_wza-5ĥwvER̺L&Iѝ@2`l;8j0xET()g|_ |{o	˙5J:I&,Odߥ[pm|?2TMPNֆ[G'I7]\PH(*5^\Uם.dH b|אNm"uMew<F ZIP,tLY'xu=4M.]<\=eqp	ݱ̑BtVxy1{!8Ǟxs`f*h}$tB&
,ZWg%řQgrݨEqh)|O8!ʼaBp~ʟ2D!׬
%WzFʌC阳tb,j4>(MyC2b=-QRXVR
У#q}xɩda((ojFH4	0P~/俬K44o7hp>P==>nH-ri'eωhi_4;/	0<4~95vswg\
"_k-to9םv:9pL{}ɜʼɹ5Ak&piia֯d25Mz8`ts~@Ar&b}	{v^yt.BF_RYgC1(SVyUIjP$@]ʝ
~vVF\*($g8m/ՠp;*3&O
_q+F'Ukq9,}(ڐ=pRuʾl,OKETt!bá!>Íc<c9}0(&1SǊ=,osx1:RpS;gtzLYFevx^a뾐9Jm>ה057oja8T{8VDEeW|+&;i1$sScs̰:ʖ~ZWȮ	!qwjvf,?ZdItL[n	FoI0BbhX->mxaZse<9$LV3_GZfq>7g3.L!_]Hs=ozX2r9A g(r   .Q^ qڜ@:j
P.jY[[fc(/pJjx#xb)7G_t_k_߱Ku#	r]ٰcv|}&(fpW:-A5L];gsDxE\MB4Up6ey6dKZ6ʄj"&F&ڥ\h.N!r%EtgbW?7L3J4MTCoKHNfu+}QO	ɹ$cFhYy&˲M܏ȚT()k&pĪ$.j3QH3I<J{1 S\e$P(_bxWP8'ˈO2C|-@W|n{p{E7j7f!KVQhh8Q/Yk\Ի}9s ?:+"Dx%~/܃!Ւf`Jf2^__w7XN ~8QZfD[ Av8owVVV@&	eg$Nu_#O]`4.Q^oF*B0T)3]5ƸO5+_
aS	/ca1AA\*EPZ=cgb5_y^8v"6dwl$t&B֟T[F PN53q_酋{a%M\ۦ)/ @H}RQ+AKoG Wt|{ȗ`r׾ܱ閿!?w/!͵7ZiI]L\& RD5NVC=K㠹x%sts:*\,4`@5j1GT+8}38HWvްUֲCW1ߛx1iO+>${.8dQ.kfsy}u)z";E&eiNrbo5ۥgoDalH\7JW\cMy7jӄgQ$X@3Y5a51/u>D;J>v]Ui>V0s)\H"n^*9e&E	1)I7=n9zQ(F3/rV$Iej{nK?l}N%t?NhH&χ=8zNLgG!J4&JC&/Ƶi?k@.vHN=`F0BbұPrZOzb	(k9Sa:eF9sgFr>Z$VܠWKP M0r>DИT5SӹBVc5YV> lhEl{ιoNSB7뮢aZ-%qi8v8GfTbN`Hgv씺3tfnSA (IM@X(_3	QBPSX|4Y9r%I}^jPW) ]58Q>)DߟJ L)i*JeR8H6tSA"Ae;a9W',>;QTF0Fj9d%?z|<OEEi芵GnTJ@j*HQv~)={M.%3%Lxo+ ua	]S]JK=Wgqrn^Vud00amTyz<~5=!3R~Yƣ|OK&+hևyA;zC82[UM7F	ؚTFꏋuo2v{qlCdl޿^kT#cFۼyA*#E=SDpb~/q26)uQ:Q&9yd$lv57;x)<zh7֩ByzQ2+#15#ih&!42o/.|`CnXEmG*ڰLUeR+z,YͯSA-(tً%£',ڮ={1Kb9OkM$(u`"Hrޯլ4*w!,zp"d^ȊO9$A!#,bۯնb
t8]ݢLc몏N[C:>G<ɼ#Rh^H%Bq{ X4٪f<>>qDI&KA LA8i.0\U}*#j ,+" ZܹFa*Vyy<ɊJ%R|*!eWӉ!A?`lbQf'RszEcg6~>hީ~%$1TACϜ?++)^Bʲ9g)'Sxm+FhrC]?MsIVVǍ18BwkA^ ^zП+h8W|!ޡ^1U-5=< 5Ab!cgӜj@^0^h"4;Ec}w"
G% Qo:2u {oAԫްC)*D	B2̉
}FѾoGoN%#JA(úgy,?ә9,pd4)}ڮvMCД)OUcUФ-$<+cHWZxD`,rRb(M"wO=.	?k
Yfwrʚc@"𰷑fc;M']:@GK,kx9$F_gN?.ژyȜmDUg!Ȕdt*Ϲ
mJѺj TeuVHW`N%`ȂcG+AA:wUi1
5+085$$xڗojЌ-`j@PQT0+hwt[0mқ
ۨوSi:d9fǄNUYmgA:1 $c\zVMUCNH1#HM}Y^B2yjE]Pl)`8zI,7QA S(u׉W&:A<hAǠ}dyrPQ˱*7)?#ԋ)$a3b&dX%}᪍q]BF
OTHgtj\sy2ҙ"h4VkW_IA( X'ZD'YNv;9
>aW/m%
adL)}DyT_{Y1iIn8-+,(ܸLDLpArUnih8B&	җZA)n]MAݹgDG =&xN 	Pt͝-}=Sml5hQ)X̠psR. 85zE$< $qEcAv֓p+JySA40^<EUG|8H!Y"r|@Dc"`8xB`s*lTt x*m0veͺ2`_}2N,m&V,iTa]>xsπHQ_K|w~c5y݇Ýk8$3{6gvOвD*cd7U]AIÏ.w<lCf (xc۞q]T^~c/o{^&'_jfַ@\@;(iIqZ^JwpLN]<&'ɗldaT~AvfM͛wGۭ_|\}aqm߽~hkgvF B.xCoXu8j2,WI,y`>2^bU<}Hr>WtubW-e#]_0AwaB6Iί];6^ȩkZ=~\ˍi)'[>DR'_KGk=q%:a*2!DF(nr"~R*S[M-@{sH<8{-)xT-?6f=bڏ_N̒]ٴ<ftIsO>v%c\hSKQ[dN%{!b5#VTtPk< |A/Fy'֐b:btCBJc`,o`"&2û`H@h<Cw璞&b-c@@'P3,~@_enP9|uNs(Fіּo|JΦ,X.w&<XFm={7Hp;_%QL%rx~R#R  Oٸ,$!)kEAz5Ya-qx^{Sojjuʂ	 z	=P@MvIX>&Ò(KnpyO7j|vu,Ky\o=%S8	i-[Ffl"ʉR"R6vڶ7u ΁"lUd(3Tq%5}4gJ/Y%%yjeٿSFDwҖqH]VbQE
ZR|ິ*觠5>h|>V\^6IW`x}F>!t36,lNFASQ!,HCnStP%~C竡{Wd5SS>WPOȊLba[uJ:^%>[; KB{Z-F;$&s u~}(4v}lQRɉo1=@P4dTV>?
f2DWiK֥L|@-"w	AEufM[,2|!_0`9\_2@|>9ʸ:)}Diߝg=ÒY=xÞ:]{iđ/!D"/sڱ׭	aXR½IRGPE-HV8_)ʶ2%3޹luthN6SqJ6rkxf7]NU鶐9U2H_]m}rkCB:lCKp`;c$&46ρ$j6j@`NoBZ1܂\2xbțrksyI_74pw(6iQ0 |f[R;aBCKOy
5nJmӀ5d<t98&TCBz/b`iԯD)yt"()}Ib4$a)}-&r6fX\0OQOk{;wo~;k_[SY!&TPW5
K+dE}YwoX[ny&&'#U4tDX~Rpu[+5쳁2Z)xA57@.nG3Ջ)*(tB_	R<Є_͸dN^'fyHHgcĲ:BR7o[9Y1cT`xHNUrMW*rxy>ڕ*ƾbp{k}dCgף3.="|-oFOsfe-F}ܝQolz;f
V1(y1Oh!
aʲ)Ț,0$bNщ(&s7CP+"QFM D)p˓ (Zb/&_SUՖ$E[wȧihHz\I532^ 8Mm4Q	LSΑ4sCE(=TYC9Ѯ0e]Z>	7DGy5 ~GՉ0{nKT?S݁*'dC<8Ţ'tfDcg!^`m;Z6"4Hs$mΑ شܐ'Mo($06'vadn1e,Ǆr]Vc]s-M"\%F\q`$\٥2L=-@.|.핁4-H	^rDȧ54 X^a
X+Z1S<v nc(V9_j_U:xb-sД|Vl20܃x$tQX#Bq'K6_wV#鯎sXe"2f,##7..3ݵG"B0ܡZz/?cݪ+=zl^D.֧m:V@)B>@Vh[h = <vxEחPc[Lǵ$M9/&  
qsVIs	?BAs0Gȁ
/^$2?\3&pnP[YAjt=`h܆ͳ[Za6d~@|Sb$'/SEMi~_8)1NS3ɛ6NQ1D	Jճi.nܲ	r"h[6=KN}FE*T@Q0AO9<:t򟎕	Ц!~vu?!\kPS?*c%bh՞׋+}>D.7]\׸q-2i44{In|B	=؋6RGz>>zm'N053
Sגd̥eb=\pk@``ր8:E*<EF=ٴX.oE #(Ԟ*1P |q	w<D0Ɩ@LDdt0A#Hۺ$tdMQF6o(z`TP"qԈ%NwbC[/ղB,cÞ9!t.azOKL	 PsǗդw !U:b':TOҠ"WCd_y2R[dTϵl∴*
H;1:#I{ti~KurY5±}B[TCAy[:ݯqK7?xsK&:d)xuBJnl@ŖSԥWX<g@ȓ&U]rhRKh̧a$DNw \Á@ZR	:40n!]ka(9/2\^4ɚyU^. \j>N)F/eMJp>d|6ޭ|/B#~A?qHmF
L;A%E'XҽX"mH_`ԋ7`#m $ץP3@;b.3¾o-~%zW_Nqj2`oHt#`r|PSxeU1ٌmx;kq[o$,CZ_~*	cmH#zw۠dcAxsǣ'۞p,[G^n#pǝ=>bXgoS/n nW:aa;c Il:
	6J"\hE3_5Zd**2<Zy94ˁ_S.:na,ӆ\`R8<}/YxV+	<#:tIC@8DkjTڳw{s;ﶳBq"THZ n. t*og0i5	g4G<FTfr]+6 H`]cXEjP{N[\Od)S+,!K0Zt\1Ŭ `̅¸~wly^`\x	DR`@	4DF(j]e 1xcJf%mŤ6ۆ@xiVbV]3<)p	J@lJ sV-&d֚!Z'|&B0x6!
g@l9x9x\aB<TtИ#ncFLg4(CE(7pm.(`k^mbAȲMREpe[oן>ۀ#=O ,0Wokoץųٛ flɁ>Oskv\@<yv -ϰ͐Jb:C49lx+
Z'ϕCRY⌿ۊx-UL_Y1ᑞP$)4`"Oד]OR*%lq/r-J{
z/K(xߖ{қc	NR-?2g8?B0@v-[p_k8 Hv"X?--"[|jo#tjX9"3˓$Ć\og4|&RqfME'T.a^(Bƾ׼c7a	t
s^)\@7UôE#)#OȄݜ126Bɣ]`dsԈПGhdmRq.w6$JD2&$ޘ4sZlnt}#Ӣ$F,9X4ֶe <\SNי<D9jTT#.IKF6ycj}e^݌/*'	]^pH)d0aw$y16á{[y=|?7[Jn5ⷮ<ܮSkDEq^VG&5@x}K<9v;o4BKXG1@X^ֺnpiKpW7v_Ϫr^>P:e=<4ԏo׾a EEopUoz fP
lVی$e<f>D:C1 ";"|v G]M| zE!.',H#I]#I:7*3f{Cqm2DN͘/̥NUn2ӳ:r*zQD^Nfy}%(=^<{P[ݡy ͻؐߊ>&Kqt}Wufs&<*gGb KZxB9~`9u2Uag^PCx	}~k+k]r]$qfc^_ZBi{`ˑ,R'_M	sY>ܿD|$֋SblsgW D2= d#ްBo9 Mvf=P<$?"".&ՌD(W	OjM`[ E[Z3Pk
'g-ՁƽF$/Z>nZo]YBhFܞcs1
bO/k0|Í'DghRn-sLo-Ԃ(hI2b\Uh(5ȧYx{g]+')ýf
6..X't(9`5S+4 g0zuk6W)M,!aQl
2u:\Akj~`}`*Gp3|U^>[|M}F6e(	BDh&E9첪Q%+ϮFbUhEa^\hδO>bdJf\@h_jj^ȊNq;rrtغ7 5J,]7ś*
?d>Rs4B!m5S1妶'M-:a;Bs䷌!w}	|
xL@yvFk1/l^*EϜD"o{d`
5"7XF_rxiz
<qtdg(gǕ^1cìgU]|LHtYr4.eU8\AS1kȮj>3>SD,4XLr-z\Ιb6"nI% &uHCxPKyi|<˾=qP勻T~nc+pH) }^f3<Nk^nFP'JfN퀃~#F[ι7)Tem#,ayzU1IS
E<v6߽ݰ3&f7ԓ$6)Y Uuk3v9+6XaYV'oGGM&&n'kPH!%E|P3s%G.t_J	]+:&1tR?^c&;G*#/^l$3,k&<E]TnٍWC?^˸<%#P~UW|)kjvg`չI,AW|ǛUw2&dv1h
%a4H+6Hqd,J؃v5G"3GP\틫b&UػC"nVt1_J=2bw
7%L?L`>P<@\x&{.։%%;$ђ=,-#Cqrc>Al~$P|QG7!w{GiM?lc5\M)\QH`{5nl5\B0ȇ]s<zhԜR֢Qu> :f!bhe?)E9YXNMH⼛;w<hi=7F}y=*M{ݵ3P^iݕ(y~Ԝez1̮kl-n`OIȳψ?_Ycqr~盞fl5{q7[|1RzG@'뙲Zz|exɚ4$1"3h|#oXCZo*`iFIl?9-Շ:5y`Z}q4ل䞽XNs/!>v25<Rx_`1k@b&c#53iS?j":]δ]XڔdIu9rfdF*Ԑsh0)n}G^,k#u6G2Q4-&rH~bT#k/jȚs#ܑG( mn2ʡ	ޖA
y>8 
]:R͖Zle'c}GN3Z_Wy+pvGng%vOsĄմ$Ջ+X^3X6PIY.0kERVI/ |+Xsr#_cӕ.D-O-wG]9
?ײŋ_!	X̏?FlW	sDq퐓׍EnIJLC~$1't=^C Fax#)0[I@i-5Y	7&[Ɔ{llIjrwM}]x-5Qfcǅ{Z)2!+96X.P	B(fR&KFb!5)/IǍ4$c$UG 	pxl(\5$C_ a6٨~xԲ;
dyNN)Op}K.ɒ^L̐i_yŏ}Y)(0Oc1HWL#̊>%:?cz4S~tn]i8]\\+YlNjݑ8n?1E|5K2Z:cr`3b%V>JS]KLVVW[LA?Sj,$su~瓏Pko'C!x@=|d}c)-Q^Nweifs }5Ձ)׊5$nm2*ɴn8QPL?n&MW`ۼݑ$gBч$Wc(rA(dC?AQ[j,37u g٬T<x·??v`_>~*+J\Ƿ,@bU!]<nWoCt}#l^Pjw#W
$%@(Q V؁"V!seќs'w"c>y/lw4؞D.Hz-8l.A#BΡ੦x:lwPvߙ W#8[FwN^8A֏Ga[{<2?=I<.?ycd~:1w4#DwяstSwFw-a,0_mV3{9 G2#U9&g6-ULvLt0/u"﷎SlH JfVEsI3BxmFPqZTu+ws9E|.Z^J̃zտa	j7q5)Yjf~g=94ۛq(IJB ˞~v99UJk߮ȴ&q9p>ap
J7hK?=}ӆA-I=Ic?Z#ig
׸6/(W=Q^苆{SgLy|;V1ƥ1F؞@.iZ"윅><ei]f߯eP׈mk#upWjgqa>;;|(9=r/W8XM~9nRlɶݥ^f	R#Z i3ڱzk;6PbQ*ĉ>C|d	T@P!q9dRc|Px4S#sߗ?\
Dt"LKć-oQYc͜T5Ebc(uѴÖҖ	U$ꄲ2U>cᇞ¡P%X\|pRc(:G8v+5vKi#ؗx\W;N @tӂo,DVR͋I/[W1$ ^L#HCbcRD)b$$&>nl|U(Luf15j&XP5ɹ"EX1``Gu)X&ּ,AF[$!ңh8v1;;mܟs`~ǓݽospLPUTUep݊Qz		DK;A	@p0haY
zqPvݰpiBReƫ/N;c5BX?J'.2ڒ2YA?;F.ajÙ/$}1Tp&?vqT
{abf.89Aobeɠk6p{ H_ɹӸS:I>1ySlOGE?52][fb~v9G|"fkIFu{ѐ6_k̪R d'|JW!h\)$ Pr¥źƓAՅjI]{(PbFhàgZERn/JkYYoCBW9~ɡfb#Bm+iy@X$-2ax^A`;iɓS#k)#;Z:+U_&:a*sGQRmap]$#O
>IGEfo.G+Uy&N>ŬA+:=j|q8GkPtgӺԮjqR޼6XXQ m[l#L[AYBQS;3i1̧8% na5xzƺy[`Y1ƻ)ɦy'QA(Ԥ끘G
7V٧Iu=d;Awl
g='iʣ_3*ٛR#M
-g`xWLקЫ0Զf[;.J= <Nvo^oyc)4;ݥ  }A}~qPyqPj6z'w;}=}qD|D_>Ϟ_<!{:7XAZe&ןk9|BK>zŵeGǣ'=_:g{c5Xow#ƲM/&yln|tr+Y+fQrW}-;DƝf y̎+W\	͓Nӻ [--CPTdUVΜR*K6z<:ಫ;wW7->GnGt?\G+O>Ӊ!-x{~^xEK/9BCyT_ƎlA0>	xh0&ܾ` 炬Skuv($-G_gХ!pmXw>R/*|5{7QNL&a hDO͘ʽ$&' v[:4!꣞oW
P4 1+H 5$R?r%͓47Ie6*U>$&~AxͰ{uwwk*sJYNI6btU74W"IQQ(f%Bk5G
T|>UI`/_'9}_8*+S DiMINۍx[0ǦF*z41w'NlL79 v>bZMg+N~*!#nK<҃ejVzlI<ne+E\9 ꬮ{^PWS5*FΒdoxΈA},p'`-U0!r52vw>AӠ1 \sP3DZD*Z7VrωKN槃x`Y+ٛl!ދh<T0G-;RɮGӰe/MkZ|LdY|pՇɬ`'{|؉XچQ0 FNTb! Q{Mv{wP!)	T`Ea1xdA]?48x`MQs)3苓($`	m!6j?fFRIp4a֌8Wdyp}&!C.n'u-UAYV\|!},ږr{s
$^XC\9'02[+aۛVYo5= >#b6#_la:|`Fm_6L[8勇<muhDSK)1uܷ#$!T( !ḓqH{8<) 
J9aVմjPG빎@Oa*tA?
C\	Q&sϨpldG\KG6	89,%[ t$?	9zezPE?m9GΊ_~NX.92fnl+</tq8lCtlk򻼖lX_.^M-^>,.2[<ޡlrisn1+:Z"uKXh,bJWO`7Fdr޲Uzyݔ='ۺX[[=vNp(~m~c!7ۆ(s4Z91%n|Mw8mޚ νhv7abzk.+Oou4$\jpiS(H)ܒR0`A$M%	Urb$>CnVzg4U
~;;a[wcWe`Hy4(פ`c:R!]JyQnkH06rb(urX6X_/{貕2BˑP^lʄfZPvMod<:f՘
S_5󱆭=mN&[p1xΪOsr6Dmr}IcW4n2G'FC0tX u)SRRt~ +(&"+KBpۨ}BH"S҇rfgá~Zb@bԇAԇo0(#t ?ַ2=z>_!/$AHyDG@¸,ή?Cfm>(ðCJ&9{M+*%"k3*>%*'-)
6Gk$E|(<~(mϲaNMXHĽl"نg `DX5a-ϢGهv9=G	}ĠJ q{U\kߺ}q/[ﭘMο@I	# x4LY1,>X؝v#vSVw=n*ۍLw<ܼ6l>zO;#<zr@I/#3qD X;Rw7{?tF=xL+șYYȇ͂G_W؜- SW0a.:1՗@H-|U4lPe#3$3fGYҧ	ǣyCr^#!M*TSvlWn{ ";HK^ixZc7*vovȓ`6@&	F6]ttRv]hD4oKԛ4.yqܽk>w,1+sv hv"V"fF܂ 	4XB@`Mz"3e=Ζ874!9#0nͫ_g-YQU ʁGۇ?m?|p	R;	yƓ.FG/޾ug]R4+AНQ-/&v_gE8=WfgаG?6j \)qLپP!m<JY^ڙRL>*t|oPv6Cü.袖Kn³Y^1b&ԳnxW>kBp]{e.V./R ^C&% D%8u4;#dоEՏ
m[O;O.5zvŢ6
A?>F
.G7fՉ #QoH6Guꅭ^O;o*_*L$*Jn}5`Q Fl0|7czl F'7n.)uPB{oK"*8B4# r5U+I\Uf<`&3EUs$[\Bv|g;5}-ٽeՄWl@rt.AP.K]~;hVd{ ^Gs#{UC /!R8\ N(ON|V.I3N[q#2!2{yRlZOmx7k
b:RX(0 Ji8Ȧs0#xoGF`KgtMouk&zDK
07Ww7tT!M]uVW\`At9Fp6&I<,lP<pǩ׿?=H@<\3W8dc	V+MkR^PpdbʢMMﵔZXG5sĹ8.S@byŎQ#hF%s_kGڵ8/ճ!KX0OC+>q>W<-)dgwK"o)ÅoƥC[+x5Mt蔶cU뮑}Ɋ6.y#i/6nOTx<toTnhod,հ*&hFlpx+Kx]uT3MSOSWQYb ~vY ^.,ib,_|f$16}FIL.!sݡ5bXyn(/>B8{0욺k4pBxe`G#R|$* x!'!;"VNV<Tfc¿1,p/6)̋l-̵џdcJ\/:3w[aX<6mϒY,>VGܦ4t5RPc]JjZZ<-^W`W΃Y^ö-	=VsXߐPUNE{iېr
Hi @]HE>v9+$`.amzPYnr+n"amsoضVnڟv<`\qxcNܵq]Pi腬_h:uU8\BC'	ɱukP78ݕ[MլZz`Ƨ
\ggd&Ʒh\-4c7*'98'm#%Pa$IU}Q[MMHt06a"IsW'd%L$toAcHxإHadrwԃ1LB^NSL-BoR=;v|]>to\T.#txtM̼5to"@'7Ԅˇ {`Ri`8!SK] ND~[4'?llA:׿MgdPouO_h̽3GvyvtHD.t<vx(ۮ~?/J:B"Ml[ݿ'v>~m{5)w[ٲ*'BPd>k	zM{nFݷmxbZvmVX.¨c%HY
sx<xٌو w9;Q{ܘy%;}Υب\1iʊ`!X2HkM/3?HM;%;[3FMkC3PO|p}ҭHnmGE}6+^T<&[7fbĂڸ&iAN7Hj2F닕淁/LqƏD">Ϧ>(}kp~iγ W`\-В.p)S|-FAYj𨦥+PlCVR&a%Y$T:Hָ<
nHSe
&Y-#6ʧW׏CY57O!?:Z9*b%ͻvcw:蘑>Ұ$qIOg0#E	zڌ=͂KP:e&o2>L ?B*4uXk*j0-TɱxD ZEo;#^	7gfa([eq|fۆYNw"No>~"]]02@vܰq,eW-&@e	X[!(9(}eBZk+j6r3Fo㵋inixvY,Ɨ"D([e'P}0ڟ~b?6fD(C8D?]TAާ2&/wjҶyBxNԋ7nyq@6nFL8pB?LvpG	MX9GjT@iHBiı0-!сc.ēh/@koo<&4I=,bk.Ε|HgMJ!Q'GHĒ:AlDb4۳?Au9^+AuB\s䆋[0!/cy3xZ(t6^#jTaj۷p1Uz[X!<YLQ
Q>ZDw%Jx	zPryI3P.`IASpQĠ~VnS?s\+Q598>@C*!ZVTވM|#cq	
02Yhw"!u _Π+޴t^PCOXoiE%]+uYS'DQK7cҜR5' Gt~	v;
)0m&LroaSX{klPK&#Y#c߱ΫY:R9ǯ*9xuIO,,IA 6&(\jݶP֭nCNϮ5{Si7,T@9r%iwmpc1+o%	ce#:\;Gs0/m*]]AJ UT-^я?Sq# 
TKzMu1Y_fXbs}51CWN)Omf4ԭ[6m>	wkd;v8xvʽEM<QZ6vXZewt~JBcK8zq:4Nݴamz	<KyJH`4db7s~`Lox5g6XfB$3Jme4-pO_ ԓQVd0H_+bqPS6%D[CYdC*.~^/{6##q&`#L֏
"K@De_`*$g<꾈8IxmO/`lXB{Hdi%/%IeZ_r)G1guY^ҕMF<$qP[wMza6W\6rńB_j~"7_oU"JKp"R4nDx}WHfѱLے#w׋{!:~ת1rm|?j`4Ψ5&D<gPA<^eHII9iş/93Q!LK=CY+9;H$6Ph{Shw{I|ECСoCSA[Pcc s@`)6ocnThmQ9%W݇}L5tAx+Ex1լݶ^㥑n˷屲i[%6ٷlʾ^]&^X:_#3a5U7R]F`Y-X+%bpAs9ݏ4촣-LpA#퓪fh<[`	&S>q8ZPl0"RB7|[͔e٬L
"sݦ]Y/1Qmoi~gbKu(1imކV]ѠA\N儬?^5Qr;=g;fАX?1	a	~MmB8^6J=Cib䕙(fa;@Ԁ7(mhF]9ƂZcU@&-`R*4Jɍ!9*w.hqܺ0@KS6^D)Qۇp5>~+]{b@`ͷ5j&&	|-|%b?p$'4s<f
Eit'XB%+[B׋_Wh0˜cp	XLBY>B(E>ՂXx*~#@WF̳8^ǺIRB#YqlDM;T}#ʤ	bzd``COSP.DԬJ.EW3EV>CzG-Jw$K|2&#c`E
b  YxfO3",GpfbG3-XD 8ޭ<aH_D>RE h3^
hET\^|N	
g۹{|uBVj-̀8=-ܳcgKp@X	v].mto^0z7(e /$s!%^ _6~y;{Tlۢ6dUR I>=6	=35^iwqX}xo|dNƓcNl/%e.fώ'UB'>@Xc3+WvY}~b?,CAllў`7|K+e|+;A&vy׸\˞>HOC$ HN3F^ʴq<'ٰaU@"h/«ɔ8'K:ohٿx9Е}vc!3^.Hjһήy}/Ѝln?Ou&`&}|0iqEe&@V92>(BdLMCKB*q&ƅjɚtqYo0k#Yv:)B%`Z"'q%-f|ЧS_x"$ذ"5f!2z0E/'5)RyS˂p{Atm	 eS*?Sfk6lqH>5aM1:S-g{Ɵz>%o>˖>#BESخX,V>!B?ޟ1OevLȿ:|}pA+JKI6f5mf2YO{[Vׂ( g
e̳K-P`=UWbTjJ>79rIxrX:_{;ˡonSgį\/Nnx=vX2}W#xzZQ%e$y4aCzG.{`?Āї4ݬ
e]yNccp=C(Ghׇi3(MΦ~@i^5M93d)w$IXPhYP':5?ƂKVF8+vR:G<4/[{)	\Zߧ<,~&'5EiK7?:A#4,#N/T Lw	D{tʒt=)Ey$KE=.7uˁ^qAХ)P	!1'*/S&	i H JH멕c1# yt{,}GpI&>!Fl I{74ڼu|Ov#}eΔЋRv{ P6Z
0IZX,	cb{q<)G'ߤ<Mȉgs^\;V#1p>*Gt`jEi5@Xb RDx{gi~)07)fhA]!NnIA?jxg̯ځڀFv_5O\i>7Ҳ`6ju9VW.q߯FYDMP*AJ8<vVݳʢWXI[VǸ+eWFzzxya2+(`#|-¨ &V嘮hgU0,]ۺ{-o;*(NA}:R1sU=CZ>qԁQ)dDeWt(EbpZmU	МElPZKbЍ)<'sM1&+RZ%Mz>Ҿaabܱ/&rIXO#1!ـ0	3+J>`݃A7N{NsޔQ=A(HDQ&RvsΐoQкG
Ưʼg\_UN-9qʂyq yaLkr/u! uPAK|΀M	J`ScU}cnA%C ,&p}/`Oc
	\"`%k-CB܍1&Б6:ƌnq~Wxպn-|M3ejn,IUx$ Z.7+hsΪVe2VPIIG%)B
QYb_u#Cg[7shuȁhv5ق'iϯ(UoDQn-˚CFf!S
	¹W
o o:ͪ#NVtn"hP͵WZJ~<ˆ,o3ѳ5lгj
dƳϪ4bl}ӍԳTf=|Ƴ^}4GYY2]s~0YG@yg~E5<~v>8KS>gS~83|p[s	jq[7n^Sh6rDo|#ݛ?N4͟t=g+o~/rEU}_Fr]G]-fg,e58mpHee]kD~_629i*I=XwCҿ[BDn0*9㨨ˋ	U ?ipPI&oܜ.rכfcǨQ&9/[U;?
>3IbI 1),5AGQ5K-jRXx #$_֢(`z+F{py?DG4'{6(IXEUVk@,)7F#GGաke^ݤH&c?{e=+2/kbG።A\~n@>J:赽kB!.~ -S/	04]UR>A>.67[vi˳bidc_e=//f聜a{h)HJۺ$tO1>-#ScU2!(2JO6AX#5>H^Gdt5 P1L)h<9BI?O_eseDǫ5N.eI0E&Z
X^+&W4)'@DW4̲ jSRÔ=cE(bX%cԤ֗a1MÊ:>b6I+e	Ł<Ӎjv!.Zv	SڥF*ٌ1I׵ZK<(	zJV>|hn+GTVC&HűN0q]cZ6t%qUMrINƺ9EV>^"zg}1m͐ *?%17 oB>C	or~:=V;W
qei$(vĶJjv00u8)b'jaG
J~XPqpZVaNfp-Zsu5j^+\.?$DY(iw\3<+%r_#I?.i>\rpy%@叶/<>NMSjȊWda>1$zu?`b0v^;`^EԮ4@3@艫f=s.**<8* l}uU}2xn(*NYOO3'GrƋ\׋9y~GH)R3~:d#kj^acTU9@\+SŽ.p m}'.G#rV0?T<>yõ</Qq;~snk;ئAᯬN0ܧM#N'^x]MӝWjF%$I⬒6'YlNCim67C{'3j6-azF@rx
!_4ŗ
 P/\*SO5qGjdӜ*^=N06;>~ajx']H l7 <ji"!Nt tcR\_67C~O7K
O	5nZW"ld:`E_?SG.	Dq֏ka\9'wE "2cp;͍\fG
gB8ҧ蝚q=:!'Kb3%qp ?fzI;yn܍e5bOC 7,>g#AM!S53ftABe0L8fUvh	|W>l--Oü275_nE46Veˊ)oXw,[i&RA8빴5!=ed43I	&MO, ^AFxf,I] ]7Kr:'Yz[ck{ħK[ 6&60FᛸVp|a 	 
mM]>n&`нGb]nd)l`Ss_f8Xzx8nfWSGvfOmv0x']OA6 k?O#{-u_ۉ"nc^CmX!Jh"|G,gbZJ/]dx?xd*\NoygRJ8 :	nJ Nr]OBCIMAc`^E{T
v5H	lfl5YT'a
>ٸt/B8]tS)3cSs^MU/7d$ZF`	gз/2:zş *rVmא^gC UڧkٞK#`5(f'{&{࠘+5[f olb|*DbYu#{CgKSI%ܟBo^4qs%ˁ)hD^Q s{aG 0H
-%̍@uON4eNtY`f#U\Mzav'%lұ㋸(|uㄭ|ŤfI.K<0{04iXN̊|K	fN;y޽/R% c$ҧVZ>1"|T~ ~LMm;uWц6ȓr `OVcSDiTdF@mwxYjNQ~=2qf)PЊshGr:*"rkfqD?}_HFǁ&
%"H$	IÁ-KST(aſ:{PZ5KE:B~8!M;Ԙ.V3?Tc{HV!]yۋMnEC%ZUl'ak	(c>
24]'w:B+vŏJE{Z@(c\ђ_u=&e5uayt:Zr:GffKrFYQk*j+9)I}Ǔ{5<#2!wJ,&uefJOuWn'Q)fFiAv"P似X̊R2Y}Ӈ8D;O
2xeNϪHH4\Բ>qtj*W+3Cz,`?MZgոJ,9w;E+ Є!
EޔuJ%?dQepYSSS9\~pLBNkrX16 $HoK/7%	)qBFEh`W9zDyC }Z{n8j+PAG)~A`uA@!`/D[`Wij=^"_"i&3l
ݟ&@
@<;<(jnht\vxԨҫ)U{1(
u^j^RNqltjvSH2zՕ7
,nK12j
ZVӿedIK7[63s7}(9+Ձ"JMpU%$eb5~3"ޓ5aw­!*v`~x	)P!eWlk\sg7>ȩAXBC4LZǉ\FVebL<q#]b܀#6 j 
t6oE$%YI]؜]$]h%e.eR/L)))TxäZ7
@:I}tGUf4CPY9>:fi߸l;=E2XrZN4'٥f{Xp2	0k}_.X4	ǘoYbc`J , aI}/_v){Fcۄx>$
Q +T\A-ԎYjk~eg]M)@ځk)tEdE5_s'7ΉB.lrxSVOE9 F@5#֠ӈrM.-OoP)| 2׋,|<ȕ _3j 9>.({gȳi],FU)p@+n&M:ݤy\YvEnC]xj;rO£AԀUKN5i֏{cCPGk'"%Q1v.ô[7x4x#_5o=5X2PƉ}]ld.@Ytn*]}gvKz`$ɱj# 
(B#Dii͸D1!=:(I)
h2\
Vߊzym6kLͺKBEJ9	C/gդZCJř)(	(]0r[ 7bX66Bx^LlmWTen;/74MWei'zںQV!HNmlm1&%  vWI-Pe.Wut	2sa)hLh
\ώ	rdBkhrzHm:[GgEc}pCy%1.<bB-Şɫ="n3]1즳#jA	}nօ	zūkiY\<CY1Y+F<nwDJ	j6 v3nF`KegwT*#Ri6mz@-Py"1ڇGNPu*<L`hS?Q;aDOC: ,[|Hqm׸V<Қl͊	ꙉ_8_%;Q:o${J=<RZ5O@
g"\+ԡAJhoW_{Li:=_7WwCbK
-ٟŗ_<)u U/]K@X\ߥewXwB$
OgΛݭAw'>fQ@?ɭNt
Wqa{ݣfCY"Y3fj{'v}.!:&Sv;ڃ/Dh:jї` Tހ:MV7^`9aLM>6s>3#jC|?EGH{WAH5zX 3W7$prմK/D/w2[|R  yS=ʭX =;hC>!>lƾ;AFY݉A>a@n |Vi,x7g#0?l@OQ=$)N-]F-86?"-yػU.PPU"j\XbSXi
Qu/u5qP00::Tpt<K_`	'^ԜݟBCo\?0w]f|Rb˫\ie~2ut[gTxn[ȿ^:4P	(Y<%jU^D Q]!y6BLecd?V
,[\4%Ky
5t>zPXH^.6>
UG*ADn0{ʎi4vPғ{ )Js&X 2TF8au E:(}z[#\(䯎lY]ߨ:M|hʝpsTAi9sE	΃Q@bV;ZnHӸE<N
h$;Y@vqD$5|] $ٛ>Yb6,kXM)SCvz.L#ebgI O/_Gfa:ҰlCt22s۴Zƍ>Xq˦.h,gs2ۮcTZ[[JtNKS\洩deC`7HpmtؿL>Gf	[_~,y-_?h^GlDJ@wSA֍
bV#53TȚS iaJ|A褁JkN
1:㩿IeWh*Lb8dPTWDSe酄SbşsfEK!ٸf~Wx)䭖dĩ	wR5TszeZAOĉ<\fsF5ӸRsGۻGG;{l|wvdh}XA}%n^6se{<z{3W*qT2px؃#aBt F{zR
&#WŰFx1z&#^/N	O,#P9Χ(|,P[TؑBuZ cтN YLh◠¾r,IuHe>^mXD{sKU>?K%a0> `z/Me-Ӽ+a<Gi~K/,	'.;_Ctt6zP}:RZ*q'giU	iErٝn/Bw-ө*S,Ɍ*W:]pVDⅰ҇AP$SKهm;E9y]LCKeiA[]N^<U{m$$ۓQsڨ?}e٩Q=[kFet\0A [_}>t9KAk}me(|Ԕt1c 5h}+wr7'`5%NN;i)6VխK<:$K;b?op%%{&*3!`+QkpW:2v:+ce0(:wФ:v84MrxZj~i{jYOʣ5V(8OLb>{ubx;5el(BG7\ZԽhmu4Ķ;`IFn
 Cf1DefȺ,PB?Fpn>89<Ҳy6,D!AL#L""04,E[6y#.}8_z=r7{2iWKOXDpʡXHAQ|-+#6ZOF=s&դ?).r_p@{s]NܭD.uT),\ƖWЎHᗼ¼Ok׋WtSkK8f6+n*+mAT
:cgL̒562҂pr'HlO["*mLƂf"!Hi0CRƎ)p:Pk%	}21}t?cb%i#ByאkbBA	3՘{#?c5	\Ϟ0&8Nk/ŕI> $Yƈ`^b:pc-ϱ\CnPəPoM]S<lRQ);ub>	LˀhFGaRS{3ʜN7wT}Cи<3o~8Nm%/ġɻ>A/h
UzZ;XB:!m>0cyϳ.n+(70C
nȵ:K'9U]a~nɔ-GWLBF`Oyc.%f;x@=j	HU]c\S&BԃFio1qjH았sSpqş, vep,%*;KP%5C<T?'vq5-hA5<ر0pUA	G)p>p9ڪ1an@w.Uyj(>:F3csX3V\pѧL8WR(_-nV[9g5JG& GD@r%x\ʉ
_wGNS;Mǐ B<f6]\ba-s9&W% nSd;I%hi6K`LFr/9zMxFyFףEA)ځTl7Z'p; P~ew`#׾WIpX@̈5nbhPAezgaJ75j􂁪pl%PzRR9lA|CA@@DRp.mpUyYl"E|DE
5K~~٬t,]yA4Nl;xN&E Պ3G5c 2ZVUdHihn)Z#䳋Cjd^!}y=sEP*yTI0Vɕ6"9Hwkڈ[Kf\B*Pbڙ XmzSf/%"cK]	WO+e$Ro"
E EA.V.50t >\etR?Ap̈Jlm6G> ӭIcx2-[
y𙄿 =vAgLNdT",`'@0|g0 ze!	gXf*z#>^@w)-_;b,J8	yhTdRZce<EUԸ=xꄴ(nˏ*aK\3{&h-(QC7(g
I\Q ?%w-tcV&p'pĺO=&80{~%[˴v#f|dYoz"	ԐLho(,N0!nkUdM|4jD!bTL:#bi!`4\pAGͳY~&h,`=?(Br8)P:n@ vC\wMZȱy ]CEB`{*3EVbDgsmv;&"׬S`QҀ<Z.URT@	к	i"ڒ>y6\zbC8X
 @(I\i-.\Bi=bi,-$a-l씟ASiҦ*K0oȮM x	@r,Nh'Ĥt/ , CTz(Xbu#sB vvl|~瓏Ma􃈹T@h㆖[&%p6f=-"-7iգvBۏImF&IP# ZF)weC([4=I`KTvw0}.\uňmI;{'f.]T59XfhbDԲrNW wԏ'ampoE^+O81EAq*Khi^1=i	&r{zQfZA|Vgsz6P_:UrCVxo.Nۜ) `Ԉn:\VB6@8:S8MzIr7trd*^6*R_]\2}(3=^70-rˇ#10G@+,֔(eꪃ؞7H2$-AhWrR#oXb,;|9aӨds*8eUCP/`SײYz-2k"~c&n5 Xᨼp`Y*XLYҊ?CJ!48Fd|D}˾[$X[,l/7#PD0$|ۖ$k(Lx}4,"]VCpʗQG	Bz1Li,",=niT(\}M9[L2*OǖVW#+gY\]@䂏",G%=*e_g pC'մD oG*$vC+^4lb>NVd{glaȊS X
9;ƃf=IRގxu9kډ78%- jӊr{	BID kQ(@\GO?	//6,{V7,E*1sz~@<{*.%?O̵ysM?];`l7wA2bQ\rdyv'$[ç){Fp[jn穓
;zJS@S5G	b"$&ؾ#a$-0txn=6TvOQfH.wCaxs1E,x|%dR`WGr2	٘I&L03'zt3.>;4rN%um!3ӊ@Q $	s<vyU9#aJ.TJ).߇Uj*x.Q2om
ב}c` ^51btk"гj5f1[ñwN&{{g^O\'.M`:nr4Vyo6k'^mb^5^g6
LK0,i#-dEOِ5;I`7r*1&;Yl5+*iI?N[H'M@8&;zip!0OݗW9AxQ̃
N1PDJ65+ҏFv^bGz9܈*BG:a"8𲱛sδ\=OŒt$f8@(ce''`aE=wZưj,*𩸩5&V	c~vOYŨFeiBEt=?y/=Ѹpgd;#֥#N̓ ?)ϯъ)`:Aރ>bT3	f3	3vxo_::4faRa|I
{(.ˊcjf;n2<RiE(*K@ucn	$Vs(F4FB~$F ՋA|eܤuzNjLaѷCzEs^1BiSI -^;5A<%?i;b 
!@8JG2fhVQ2,v{`Ń)-~7v}GFЧI+
	n9'+
znA-uX_0W?^(bm;PUٞgS8䗄C6!9Jp XB@f^bKya7	k}mZ=1yBy-F$%OIY&S	# u]~1r4A(Bg:q<-RTB@@b&K|{>Qy9IAӲNrtfAvM%F+gP%32(Y A&>sϝ3(E8ƚiGB WsF\֐Dvs-U'fD؞e(:r{Bu]QQ4@=uRِ]%pgAti]!Ewnā2QzqK9ȎRǩӤ% LLl	<M3D}33hiW_%'_E|dNv+f3w@򯊜! ȵ)rn)y_V3*ǃU+O?;ڣU_hmT u^@]Yu($/I-.:rt!"qA88 610U?u;^81\B,㊼F/*iCèf]KdRcskA UXvɴ{!}'2bA=3]Z_\Ig//-$M'C1Zl)5Plhpf).7qFꍂbJ"xK> _8p<iq j}ı:7x×8`6! CcMf`,M'4lKݴ?-$W`LDx5Sk
|ug+vh(H-*quG8A&AVP6oEFFdsL
ZWl]`l ;3ǬLrqG8Ғ͜ze0!WqY~#g&@\lB?x4CA).A53;9b)0<PCCLDx~wrmWӖ)f/QF1^2 B:YcJFX/;Jš]}uYJf4'-%վH݀s,z=rH,
l;a!x>	/7NBiXCnQSFGҔTyQKu	4(JTI̅:&w{SGT
T!y0ׂ0WZ|[k1A
 j#}Pk'"!=^;AGyrϋ0tsC|⊃4Ɵv?&n0TΌ,C)@3m/XHhlv7Q,fYq3DU'(()ɍ_<Hai<q떣Z9p>	}JM3kYzFCWzf|@ۤv5?Npxȇ"Kir}{`cq?xVwV2r@ҋ3b!+cʉ{[fG>^}c-a7㐠\p|6%y>p]9zǏ'Gb	Em].&U5k1އnR]?]wU}]Fd̨:@.3Fr ml\ZL[V)`pbCIHWBLG@i5=[s1i@Oˠқ{a#WB- ѵam+7LOϋIy+x9E:-AɌʄ!ys$nՒDd&QW㓺0
ppm8>y>d@zX=/HTQ+3calgaE!8;/ĉbڮ
 4^BuR@t#H MбFT3*Y۬`xZR<.hv px;!$נ͋;iI%ŸD[vl!oQ9s6,zh>:7Ro6+˃ATF7Q+cswXdqw7_>9?a󧧇6aXLw ;}[U0IMW=L	{6)% m@V &EQq6vn/ώb|K
.1 KiT 8@!/~XÊ=]K8)LNel~yc8ς]%A/umQq;i*}@1*5 ]`u%SiNHg%h3S{7{n.g>Y%L'Y5hZAi-{W9,+kmٝ8߆i7oa-"V涺wI_wEh"C\ kXx_j$B~UkVN17BXob|5.fzH1)c ~J@W/+Zbh#%!SB(+~e|mq{lAjq 6.|rLF.${Flql_na֫APd3\(%xprf:KKR+lxIdAAƚ*)og7f5%/a~>ܺ<l7%̔h˸wl^ɹ|2:d}*(AH$daIL;زhOdEF)s!(A|wcnR2PdTݙzcf]̯ɾ6GOc|\+R?/!lIJ
V+MqL!y#Lк_4O6M+[!	~h?э
+FdzU	!BĐge־TprC6pգ r !$<tlpQxɌe=݈׮[`ͽZ2"Go)cG>uᶪ|#(`Od1YXVz{
J 2dw9*9F}. ţ悬7wm TFIֺO#}/	^ !	|>nI6)}yt5G
(i`l-Tà5;DW~]P	f?;PKLÎ1bv:뮢cR <BC_S6HWt ִ8oa}\%՜1a1ְQBoѿ~%P7ImDu&Rf3Eg6':¤Ths˭c1ƹ*opzwKwQ~ULJ>P@h4) 7jr<B4J**|ֈwYp\\ǾsMƏtGZػ2\O	5lYX${aۓ\祯8`LH t#ʴH oYWi|A
#[p1:mBjAiB":Y
~eˌb5UȠkFgjJhyH,J4`pٯH60XRO	~+\3:ŗ)ǕbB҂-eRw=*")G?~dW8s0_ѥz>o F3:|f,
L>FT5D,"`}[fa#^ybQ ٪/Uk4THpum?HOoN[r剏O  ^pq^/OD)zٍ[E*~h9?g-di0+_-~ F􇼾tԔAQ	c̨!j{v"ƧDǲaEzsw~w:|@K*hMf"Ava3לp`sz +Ԁ]H?rK'hBk 
x?d,'bc㗲)!Uߎnl5(9pb$`^IZZn[&tR?H=yi7-D\y.@GvK^Y,wkz8j˻z_%,#K@6থ҄I%k$V<`$?hnI
v:\.
E5yM@><UD"JX$Iah#xx$>1?yQj#9'ĺ0b/PNОpQ!TjIqY-$o&y
;l7ӵtۉ؝KTK8Kma`ƙ[E1Im& 1(4s@yS{!Ntq'	הnWY!Y''
)RdC)Y'r2|vLV[.1w&QݾNcFj5"6Aς3^lz~XTo#$YY (!A5}lUG66zNҺIғJ"O7t@.FIy!ikO,EßPwܕCE5O`AvR@pB"$@y~+tfgPEǏQMc;1r*,"[qZ@k+e=Q2OHlp4^D84]std2;S}48~5E͡"جdPԂ3J0N⻃sxЁX
p`ZX\[ycqj8,dJݳPpf@bZt]Cǹ,D 6׍pTktkX_` ༻SW|?H~u'**jĕnɖ6&7TМG#nAm\1޽kcObAaAO;L R2'Ds$m15Gw52KJ68in2G5烏%$lJTe~ sw[JdOdqM
`iE:_fK7X9'N]ҁĜvت3@-kZ~ďQPJŷB<Xbn@{HxwǈJUi:HbՌBk74tzęzA@8 3pd-KlCJ(Jn_rwqlu(>v2DG'r8-\R!e4[y	evtEd=I`iDai[il) nue\KpDHd{N*LF {{FmMxW3Υ<(!yy!־} w;I(Fސ=,P:DbSB}RʙA2K?b4``d)v*զ{R,>uo	IZעɍ㭢}t2g`6ڨM%d2	#n,\CXz#JZ5WoRO]=3\c1(7ż>G İ"IgA&;;E;QĂF:QhbI*DME=]W6 nh0	8m D`
2%r&h_Azҋ8y:v7fɭ(x4i񍏑&::]lNjRE4lCQR:w4bW-.PRXw\6mx gFRT4D]E,i؈2cnRjh6N-g:eS>xس
޻쯚EE]\[[yCmΑd"gA(
HM.4ڃaF%K(qM&)G}f&}t<>o39:rqQ&Y!R=^/)y(kd=_2~%<AMJ4x-71,OҼ^=jw,} ! |/	۝ md+8ق%PQ|L9׶M vnԈ5
c>־/tN4X8jMnS\
1L5bDmuP>\ʥXB}cCQ~0l-;87E.2H#(4
Dy7_渾Qᅆcvbq=}yx}p"D@NBt)C|qN5C!r|2JdtfcbVX;o2 3G"%΃Ϻ~vTe!!yZ[ې?A7Dp/URPN)<mҤNČ~TACJp8!SJJ<U(s| CB0QGq >D]~Uo䃕nתaEVjo++0ۖF6ԬVT(Jrڞl:!5E(~h_tqZC\\__t_<|o/7},vֿI=Z=7]OvvE˅=!lO/_R"}eعWn7k<]ٓ3Afa)E#7X"fi󟇝]&,uO((r]-8bkl*pʌ5Ig\`;[ʸ֐FӒ20Tx
tH%lݤuLZ~!+l%"rTY:≝(k/+Ô/Z7b -anHFlh/%EKR!MY +^_[njITCA[~5e8Dkj8)px)/ŽF9^{Wh_7)$@ˣ :00V3cJ!09֍uU<l@\E &O#+)"qsd-#q3A l4&q=
XgyS*WESIxFxag%%-nqjņYt3/m  o{FĜ ܑ;cpdʂ)&ơϏmξmx=guksW\u.Uހzj-#ǮE"\*p\UyyN<@Rik`Vپ #cp@k;B7)7RruƯ e/9BT!cГuK^F;!'0izޚ;-י؊H vb0Uq0zg|eNC!ױX_@]%osQn._(R`Q!CW$VaI8	-C8E9	F9ޝ`Alxh2rxMծu?G*Rq)Z"hKЋūXb bM\̄o.Wɻbd
sJA]%BЬpzrN0H<Il,~7j۸.`7h3ۉƃMOTĦN5n%H6..?'k[~ֲM!r$ $9D?1 
=ϑ7			Cʑ$IДoEvmUKA#`\')%Lm<\svuN[vvNvlm@GKT5"T.`",.u_H龑뗽oM3Gp|wǼLnnI7i⣴K0$EVOvª?S5>*W\'7nO>ON {'ܲvyG r{-dn%[VxB{һ7x'tj`?C,>&w<hd馧d[i4#'^ZQXicI9woN*ZBL;YNϷCɮ\wwOJpv<]TJeWRJxXXB(]GCEP&?˞nkio!Kf1¯ ~yfR: dBA`/qǵ7;Bm2:L}Lsd*G}i<ƙd2<f]\7 ڳS܂ C!3'F(A#$%bRR
ſ|BGf.P=j.6ԆD		S(Qv&)$ 䃲%"o>$.!IˍہQgBmm·.=[dGXɹkMW bXRfKbۼ5
p aeeݶt D
,MH
!I1\ܦ" #e'"P5D4/kt
 C	>kK΍' d-9D +${gv_	ߟi?!ήDN~lNҬ^SNuuxn5p]e{)ߎV\)Hsb\wIL+!m_$hzh
Bd|!A|~3-7Wg3sDHnZtm扫-4};zAg*E
pӀC L
[\3h|v_	T&\Qhi}CHN\55x/d"敄vɝa +o*LgsC
hzLd 3-b\Yh	6Ol$Z	ҼCz
hJP=C_yB1DID$:5Vpmhe{Q-?s}SLܤȒO)j8D]w,f3^ïM-uG&jEFC)ZjAHVзo`l.6j08)ڕ:ynC >+NuYf0xNiݖA(IIa#N%aL< #K~-Glry6sNEx&9*|cB^b0 H}]SѠ	m$)xF,r:20tfY#ZA9p{3 Rp[O@9ذ
 :v%qڒu=<V	H]<r[oo=KmV&.@NbŜ%4*?vM4(1kW(m@OszS%~6F<3B;js,2ln[1mdc-eq*5 _mbH埩ĭѳ;MK2+YW A<zv5=t 8Cg~(Z _Szn!p~:̐1/(L"ȬpCKD'R52p^:	╊#PRfpVR WԆB,s}rQWKcc4UsBOIIDx۞'x	!~yFWu4-$⣁H
pT]Rv<}1uz[fj bFp~k'; DE΃ݼ<KRIu|׵6璮ӥtT53o۪i]'(,ȇQ&$.#vW!3
^ƣ(F -DIKM$sVyhlhM>޽a:h:+.gs)jHmA4x;1իdʠXŖxk/jFwrTd*r[Zd9ֻ_ZS00F$tF$G8}Y" *@E.Y^41al4;`C+=m#o#0$UXrm_V"%&RhĩNӨ`e#aJb⭑q+h]_opߕ/ @/]*Љ6pG "*{o*Kl
)s%XS[Ňɍ@^ȁ7\}=wv:X01߃ԳBhC\;VSM O vssA̶ݵoR8wMjH6r{rKgyS#OϞgx|DzD(Kb[qE{8DPTz˃yАD1A
T1E<.OI'ֿ04U^gn=cx-
fe4G0Z
ƕ;fG$ύ_I{l j{ؑ
}V#ڔ렾4I8n0MA	È}R
<u'|v`p7~Dwlɷ'd2~m7ýۚ<;'=1e+'"(5 *&<=N`Y>z`N;NE4wjmrt耷>?=P@g0ztNˋHTxoCl왁X2C;Mgy'B	Pb7D~7%G^YPd:Է6OׇݣBW'ғ[@A:o[MމjQ޾:B/~5k~rdrlz-QjhV)5`1<T̟~.i#Եjv񨞝=?oNo
,~Ek]G~@Ҹ1]<sRPQͫOJi$7׳_a^:] /胷,CύM2kꄃIwߎ%rGY0_aBL_rDڪ +'ch<b΀Or$ymhcz)t(05r.8$d3AӰ3>}XJ~Kj"lox=Bp'YK 0F[-Rkje?n@R2J]kQNv;uҀ
mv0|.Qǯ<zns6w,keyݏed8D5wE8)S/u5#zR<EVgsI1)tGԱ>Cnas0tLQ-j-bP'R?k?vbwδ!f`~fExѱnN,Ǳ*C2
J$kc{1HZ6*TɨiƸJOv?M』 T"UV<B~>"g8(OxxhVKHjayJLz;4wދɣd%'QC"!^vN;̷S6:"H~Nl"k/&>byHv!Nb+頃n]O]quq66RnX;YdlH''	D7tҖq/< 9dL,qr!xEbkWddGk0BR.U82l6uHYҕ{G`ڰ?>uW҉c{Chw#K^0j[iw/0^hK@{V>L!-PA'T<leVco8L2%0r˕O@->Wd2t
SHpcr`cfcqi/AOUGAJ'^Myuwc//1&`zaź>	Y1Fi<b~&ޓ@M/|::35$S/nfhR.$`]m ՝tV^^m^"l*ʢh[AIuXh'%vb5	z1ۡз$<>Q7aJҚ(~|i1QgɫWFT6ͯt&ōxuߪ<
_Mx.zC
,.$Ptc\x#?rKf5avG#fkħ;AzfrkP]JU"uO=ϡ`h[ʭ~,ybT31Hv S:ׄǇQc8 QTC')eE}#Lv	ěgSͳSX?0Tւrr|C+	_cS
9>Šlutlh!?LTmj #Ix_Z"\UyȽ-ƽ|݂Ij_U\.'&oe1m<Z`@qbsvt(x?>"U=i
PRn G;k]"rdsƧ՘ߖwp7PtJ,Ǣ2>PD̝ :YɎK͵<ګiz6 :8n |{l !Շqvt㻍o|2Yy2b,_:FEπO4Cn~EtǕh\吕K*
.eAJo:TLߣpN}qu-m7*ǋ0 j%)n-ՇY{nޮ3,,ȭ I4~kZ{/ZLX'oX0HN\ڧj*rxŰ`mÐfDY`F}^Ez<~Ͼ6`Z蓊ᙨ&8GRy"hҝM\F&SCǱ*ĸh}rQpҫ
+8*9}RD'	Y/p֟>?YH1X@3k>$Sott8(w2]#zVlOlY=Ն~nG@2@LDBSmzGTG,°^AֹxSzCZlW[hE|$9v}QKwx*w(-Z 7j 9};r/ըv:bm^{X?L΋e4qx%t7o77gНk1uA$ȴDKPWV`rRm|61E-=\ȮϰrIs+
(%<iMLEpI<,P!myN8h,,[U_enuнC%f}1f5kҰ!=PP!SQdpڀn&1 ZxQ}Ոy"+Ӯr+㰍]o/$ul_UB54ėw7ݩAjoA_4*wVVWRG j>w=J[0l^UI-<`($tmai8.٭E4Yt̒ܹPq%wHɫ
 gVcCn7(]XFY߬!խTLb$A<vֻ a5SN{Mw u0)6+?P(fERK{.s5E= kVFcr|Qb):&yъLp;*Ϧs'B3k3pq
TTyyeF;YMuhکD 
H+h /EZǺT]]M_obqD&;,*0ch0$bz.":+^hMZE"e/hvӇ9&j
	hM#w0@@҄T;40 ","o8a}"v'01d5=za{s{8mBtƅA?,6g96ʐLG"')Qj0D.1H(xЩl%v"NȄ_/`
+Oo*&ͦBg/S,'o|{n'UcזEJݲK|8aDiwG[ՄM^K )u4eoV6\]QKKrԁ.	K/HIY7*Z7w/9ͭiBLƋleL#"}2EP\bRMe
,p]XbHm7;]R4ؗwh
N7U$ng?ǖ(,R+ʿmg8ŭIHB\	t_鯎sj%}my?QsAL*"ȳxr
rmPnFy4PA܅>`WWSyv	XOA$$A|G(lH+/4?0%oL(ᭇ/fbV >8;j$ǸC-fy]C9p i̚8^OojWv'	Q@m@}ib
xl
]p{aߚvv7Mg? `)|0kf7c|	1dh( OgR] B5@nè=N, u, s4d<7D0\YHp*mFK%FY F*ys6`$8VS㠶B?|0(a6W28hVsɫ&&l
8m'^57f\h;?sASlh@>탬WsZL4"ZOJk"]wh8\7!ۛ(6uY⚸Q[@8}Hd*YgAjaATpjoct,S1q7U5!/ZLb^`E磖H*gz̰eMR٫tc!53$<M>ϙA])g&Bqw-h
kE'fdEKyKʹ$cgC_[NFI*&/aڌ@w	
uUng_vC6WqK֬Ln}hMU2Db<<GG	<h`@Joz,钳{wN8Ѝ6*Ph&e_ɱms~;u+}乱m Ʒ+Z4<K>UnsN`38?QqqcR	M A8~7M 3EU8acT@>sn/
'Y]ϱ%IVG:@XyjNAoя./`8P)tQǑ긭6^݈k/`CwX}\M.^;sEW/YT3Npcn
*grpׅ(
j4lX-Hugr6^
dv)bU9Bm%[_FmNg8{f7$^S ,[O}F]%6-CZIks=wJB*Aǉ^vvQ{o@j?`{jsaP$5;tbxv x A.|VI7zq:.khmUWS'b0
}sT;q\3N0J:g{T䔼Y 3;!a5Á䋐iq#_ew7	U?7|2O𗵵5s?Gv/@G|Y_p5b\#U;>?#&k]_zN/B:boZ!7'/T=/E)ϩ]/eׄP A\RjBችθv5E{[%B09a2xTϒ xuRs|?,ۆ3VMwSVu7*%5t3%Q@Mv㿡*oi!?o <>
w8S#tGnyF(>^]Q"!@҈S*dw)2[׋t@!_! 3UE5mz4e1j	q9+$,yvNLئSeXRr/x	9h)ud,ٍSQfhsݡabkl*Ftu⡪ؽ6-H6([ϗ[H!?݂}@b5uN[js+8[(<"1QȎQ=يU>%ѮQ>oMZ}I|t DnO1&pS5`d4Ekv^{pI(4lnCN\:3x0[8윈@3Տ}iM2w(
ƶ[΀vp772'f?S >]hQX-^ROA("Q)D}Ͽd[q;qc# B+nqq߱nįpX}Yc|DuYoD89xIhl	SwMWNNM 8uDGFFnxg:OUbA	-ROg7R+ǧ;N9s~X\}`mY!>NeOù~pTwo~p"FΗ|]8`a<r
kDf[Ӟ~x &Oˋ>r8Ua'2e I	u73Ckn2RPȎ=* Lq<EO(׹RR9#zsZʦX"ʭPQF*Dƫ&M"˞ *	!_pxav 7G'D?|wLƷ8cH)r( Ky_$~"3Ӌn_O"W [h,Or%	 	AzZJ@uC4<pI6W rPvX66@p"bIL1YD+<US]k]cKU~*n/gŔ	Nv>HX!529@0vuyA+#A;Ѩ+`|kg2\>jPc,J>r[6PM$K5Gck_ b`ݭC3
5سSH%r,:{+,f'pπ~6DO;~`"~;]ҡ#[LapuBQ:i9G¥&{[Zr@;\`i<"9@-!PUeKׄ76j;B'ϑJTxNMNf*'J|?<[z.0ɣruM؆wY66s'u2n m.Ypcj,v!<MZLYi#GP BWŋL,Vb;ټiH6+Coi ָ'D?hc"R(EF QT,^dynr"ZJ6ӛ!ԄNnFSDs*N-xu_'" R^ ZGX,c'9LikA.e<~9(7_IHڥc_4;BqҺtt"bes1UAʆmU`2`6EJ!^ WE,H烵qS ('vE&qn9P,zRlOM&lq
y'bR)ujT&|_zuqcNӭEHr"/c`@Qirʨf|tNINIZoA)Cu$%mUr 3Xȓq[
9-^Mo[nB;?_kb}JNi/Iw4@:OAiMGqLİ2.1abJxJJ9_!7#>zq@œkHlA`acZ"7rD3M+u.(Ș^0>)k8;=00at= I*<m	>x^SרiCU:"asf6&{Hjᬞ`vQ@VAgOa~2:((n7/"F?PLm|{m/kylnmfl\:;Aς6Oyp>a@7rl9E~kAtwq9
fgU,]wd UJ+"dR6M~\yynjVg7l;$7;"=4v]Ʊ'$GS=w,f.'BW{Q=F"_6)!K_?3"gL'$GkbL pL q%ޝg}&,Bm諁プ5oEQ?[sl|)J_Yyyj1qxuxیbV<4gsa4htT'hE!nPJVO[xzW[Y9mm[ ?y#a Ǝc[cp8>_jpQKoZU]-d'3s;jz_fϫj~MI5Ld?D&_waZWv ^
l9	A#xaX3)se7BJ:l3F5MT'J1A	 pAPk훧loS0'$lg=<eok$OE+j߂
ˋ "B38.ڙ`xZ+ca 45ր1|L5DM;.؉GPk9?؃{'־ˎG"cv]ǳLs8<S8

;Bu5՘"c)7A<)Ht7L(`S׎ѝk7snX0,*$Y WħIҮ#	0bZЉ)̾@тh~o@s1qOȀI '7%&fG'nJ|DߜEκdǣ.&̱uٛóAF;9P||Q,jI3yٝvGz_*D|dǹ}bUԶзDej6qE@O^#Pė8ot!5@PUpjAݐ6s(J%2`OrxCZ3g-eXJ!dRČ甈0'+P
L d"=sʠüLOx^!VL9sCN{z,{?9={n,ƚr4f
:(|o"1D
@
ڂDwm .-ZQrq>^P!?$[Z<70+1ZEw14P[Sj Zxk]& Їމl*]>'ܷ\I)m[/	fgdo΁8:m<2fK_ͨ\rM.M:U/
rC tP$txl)	839oW'F Wcݤqz %1ЮwI3[,vyyFu9#$Xd>KnvdLuC>?;v;⺫s"ah1C%Qy~:A4I~PuP=
{݀_>cE-lzM#FN<&RI'#7F]h~ZkȂCccpk_]p0ee7V|΂4VEpX/Qw3 {nt_jgl]|ca<0mV8f*`p^0z5vjW}
&`@(
Qʚfad<o@#Bg QmHXz5,~P)LLk(%ꉘUVYM3΄G卅ۆ
i0Odp1p˚#jF*	׋4NǗVqԍH5Z^ů0,.=n4-Pޡ6[`{bi`'?v1sr?8NH&QaќSAOV)i` JM%NF
\LfVƅSUPRgȇ#x{/wh):#$yB%t!z8<s[p'q$Gݩ**d`/@[Qe4XR\ō6\d!QE$$(u?$Wl GW	烲&đ?x石.P?pزKjaM/Nh{5SfgPrBGr٨":F7ɩ=ΔbTd~A	n:_}7AzI\zmׄuAol592e0<FjY;Xwj 8 .߉&^VG}/j)T=~2Q<Z1U!C{s/ģ?wDj+Oj%; Ol'FE"A6nu+p>1v41%z@k>/*êMa&GE]k:Hl8`V^B}Qȏddc=`lv^z=ӭltZ]M[FdQhٗr!ݝJ04$8)}ۏJ[ SF4똤:(a6XSF`DטŒ >~3ΌRGT*r.24!A,S(km6R7	8^_oytkϑX;Y}(Ym"]e>+"ӱ! ,[GC\}ƨaq&[y	ozs]N[q5ޠ'6!@n|p|-Ypf$~DN+n/l!x4IЈaqj t2$|Z53/VV#t$w&hiBsb<|(_O۝Cz D|M=PQ12׽u8FʄhKkDL>q4|3MZX`4(0y(آm9g7PlFHqU"hwx/BH/bzB[Fbk}2)pO9%W>On`P񥟜lH6][ch=1Bl+mFhs/AA.Ej;FR_O.*ĭ812D]40VS
tVA_]kZ^wJdVvQGv_D/Qmڴh^a')F*@9}r?G]pO;޽' QBI.{̘J7_{t3J
tma&ZS"U(ZA	Ga^+l˾t*ш%CP*HVDM]	AnȬoWg M. ME͑/rѲQf6{A\jk5OR})5GI
mdXn
;$z{38E&	lYmG~* V( 	r']\zR)-<)d^1%jFF/L O,ˤImYи?t5-bc%RO}*. =vC9-f~:<[n]p^ոN9Ʈ?*2eICci=Ax: ^|Ʀ=ڧ/'qΎzr
tHzW//2%>xZPMfNU~0%pO:bS6d|CTl"f"L­<CL]6h"CG|ɲo{-lf>[EQFcaoq4p1鴶x A둠cwBh,HޠqdEҠh7;g<C3EyM#wq4zjyYNG)hG`Mmnl{jC ;' Fqg:_~s^"zZ|CDb07$=/w1)m,Ŝ\`HH4=7C$lw!>9Ԙ9a3 5hA)gl`=[N$þ#YO%#9u ZlnS:ȿX5\Eʨ -Մ?L%V-i	Rb*%N6(&Igut'bu<wJHGnI !%<9y!&;&0bm 0 ,AtN@0A:ͨP'!6AFR"qӣ;8n}|C38Ȍ{ +E<e]ӥu.NP]rJ64T%FwiT}bY 4T%
,s<%yhm 2tǒ|l45PqiW.S`>]@էL~ŖW# ba|}/gnc(NĔg>LaYj\ÓndtoGql-ǐ8R?=}W=.},K:k'K=s/)q aK5z!P҂>]7ȏ!%kӽ9_`#GB"WAex9 ڻżjV?=6d-,rE(Ee 	T%6\͔Ml0͌t!PnKDk4Ԧr-䅯'SAC`JE]s`<ᣢ&mN$vs#FHvBGiNGmICJ6cyC50ri|d3)LӜ8nP9H^HM*3hLvHț\Z}т@pZB 4f@cjYA6$9f_>ʚLnXt	P~&Ƕ2}_+T~Jwͥ%q⧒'36
y? v7޿Hk0w3Í镁΅r|
T^0wq<ņ
A<S{X'؉$pɰ^&'ҧߜe_d	",! 6óԟ=S#@=_1GؙUgfgrlH/K|#:u͑Ioz+84EwF"I\hhD8E+aixM\ޟq<+l
CȪ)CP$ZX1dh_u4ĵ9P	1}k@8v3,*xbڶZ0ݫb7~1XȢ+mZVTiuU%YWRi4z`G%A74;D֟>mam-|ЗVH7$#3<`%q|\*cf1	p5ʍ"T$ O7%ڦCs겨S?\8i2hQE9Oe&`*Rƴc~4R^bdfr;0=b-*욤_oiP0,co/:¶?<zfr}K&;mfJuu˽٥e ^/%uz3n>/[[nXoW8]Puf䨝\n܊a1|Xmn? QtF*ƎFL]mt!q8E	[mzoyiSČ|$/t 1.QsJ,>whX/^g02/?N*,BTArucu0t2jis3AJ~t^/}VEa̠<`l4YD0^xd6&z46nvӧ[d֓U|ͮ|хSN3m3³iѪz=hY(M.VV%MfEaj<>M<(p2҄aX9r3Bl>A \rupb#== )x0h-c+\"dJ x1ek3Չqǂ饼J4'ul`2NsQ WS@}Ǯ[\dcQ
jHL2I䤎N07&D1402 ˢ3[BfKZ	pdX]uO=OH<*#fMs̉Vd".&?ޢǎy0,9䓙 98ya3ꨱPY&~bOе^,
d6wdd~vޖm`E޲E/̑N#>:mE}?O-kRQO#$m(6޲l+
_<{}șGCMd&2xӠ;S5Vn=+pShCetAWSM[v+U9=SIM"{M[?vo@s+O}z1&9χvrƭ""qHx
9&+fkMUҀJܐH=ڎ鬊.g7ԓ1嵯ypQdT0IS);1t!$7E>Ha9ڲvئZޝ`IPΧ_`RvYa!oX3tLxw&}7%}nj/ZmSq.MlUN4Kx#ɘ>D	JKȫd}!詔O"³K_)Cy\঴r"xF/V3~o~9|U|I ,[InnIIѶ0 _Yuوҧ3oQl
4z׷{Ӡtt6א.h#6t1|(5c-=w
4~|_QBur(07NY50: oǗ:M!f(YOa"^5鷚0ȏz8Mw`܂P܎l@ae
h]!?ДE>u3ݝ;|R4Ł80h:'R2J拊u)Rv3r_IL°a 쯊&\޺u`rg[9_:|BX4ev2xC?d-/}@p1- sW#(K8Q-߄X*ѰbfOsZd.0o6(4af8?	`p  koS3h3aOZնpr (>̾ݕ۽-H]__<y^]|'>9S⇁p1 OGdή}V?xPQǗuԺs0$r$? *Q!͊}$A'b!%pborX }!%	ee&lIQ@u`	uQZ^t\>۫2sꍆAJO{Ƌ?5ݑ<BJG[5^2;1Ka27a%3<sdS[ѭ(<V?e([u+s9wư_3{Թ3+M?1礄Gcbx@t@&݃oK5 s)7kׇ!Ctrh6FqIBw%6O9h_9Q<pA:H&-+Mu+BKN&44}9Ƚ1뜝Bt'(M:a3:a+^B y%G}i+]
JވSnY`|ϴGt`mfX'O;g{t<Jf#s},B7ŕ-0*'?v"2$a|ힻn၃KG<WB	g)+(ECe.0oD]YP+:H+vsQ+_6ݐ|rKK<z-t׷Bgy	Rh 6]]w
=©ײ:@M͇`I@49̖TrHa]Nx!}V	E=д!V>֡*ȗ:6ǜYV}_w^ )%7 4ʻ(
FWC{RSV~|Mp|U^t2#7Iȼ#鍇h!jV+/[ 3?L.s ~)"aw}U]5@FoDb
dk8@SNA0@3t':/ia3A/dVH?O$N2v\Ƨk6t`n75%>dRM*c3(P80BC?&,&xy]_"^9@\e	E\|z_dL|~G;^$ŗ|$"2upvޙɄw𔳺Bk/]';ػ-gHE`N+)ާem4=h"3ݮٮmްxiįqH@bS&iƥ#rԲ̶u>Hb>ZMs!z\5WXe([x%Ђogo MQXS8`@0!@z.6 Im3OL6=R2${Bk͹$β =
r<f(}$jO0u@	M؇rn6tKs5e@6DOIR\oV O,&Ѹ9e(	mi#Yr5]kufr$z#!L a9*\NZ\UzIt/|yg)L/Ŋ<(چ{|[1CT_dKj~}Ht7:|Z_cHnCщ^Re\07((vÃWfnFB%Y<oi*ltLv!&S٦]&;Hf)]Z}K[p:gi,:K>p>|VMmr-5Pܶ	g?cHX4}AY?xPJ1u^+td!`J= x-jJsx-#Uq>m,u|`O,X9<|wp#a|&crv(8%7y۳11]lk`{u}m|^z ׎n&M(ߏ}Y
np`PȐdt^xgR߇ZQ.r,fտ'(ރO Tp7+aP a9j6#ӔN,dX
zW1W8@iDbxߞ GgKtKE9w 4!s#|2%*0I[ɮc!sq1sϨ/"QaM,=Q#9'^5!HߌC>SW)GZ.LA _Qg_(s*d\1@
]A	ךՐ_B.T||;Mi V6]abPM\N'\nM55W;F%a,fiͼTjCLF	;ffOWLrܙSkü?b)?ϧfj2̵2B6g[ؐM_@Pc["$S9\6F! Pcɱ~2χcoԪ2E?+R;ڵ -zmomNFܠ[x_Hh{̓yi9*Z#7FaD(юݝahOv.
<[a>WHw F"Dw 9/`6(Zv`,;s8z4,,iy8p6J@#:]fΫj6pZEq~5Ich<lcE, *MzEoƔY0l)$$Uw܊|ĂO<~ԅ8_q-1XKh=RPQ#,KZjp8>4A|ě(
rմ`ր5xMԭS32ݏۖfnw7o/D)RBO\[-9,! ;|MܹYpgq_Hإ/Is`eOfpX躜R+ME;LSu-@g6aFt{v
'OWr>>~ȌEQ+j{c}YI/
bX^Qh,'
,\b#AcBʕiQ@YTPǃ"}7 y5T5mt*,0+UE^YiA!t<$>AZ흞Ū/~>}D0w2N@#-vR$-쑜"K:!ܮĤݛ0Ch7L]!s9ICQ0c	x
f9޷s4seo**S{{F37`]Dbn0/1Te>wlQL)8Xh(A㵩	/G優|-}V!3SL&
%k"ˇe1i'lb U9d)~hY-	9s
b!izl_QN(GHߦj+MT&޼y߹h{175m[s67#l7O,X~$j6<lv@177 R9swnRh0^QtǙ"Kb|Gt@xnG''*vFv _Au43!ovmk~VOj%48LZ%fvү~<>[ˎenL0.pu Dj;NЭ07U`8~rhͤM#gyMIU1rvУW5{*bz7oW +X~2dpvfr{A}j鱃=)!ܖ.֖С8_ZM(ƒEpLx]9?y'Ӌb;yKk^^ndߠ*2r+r;#ؖ]WۋŮ@1[ЯSnU؛pLpM%s8q6>0iJq(&C7thXG;CGj~'7b^{)R~j9-V&CĔ8K5ͫ8,N
;,$\)-B	9sk9VRt89"`@ς!gLճhVcj"'UOܧL{%T4xl9Nz*,]m<C7:G!W5MQc ;haɌ#ܿV"ui@uHa(q;Bgȉ Z_V(1xFKOXgs<޲DZDp{X(4=TGmZLNW-Sa_4z:[P"Ujt-K}>%Aב-Dp2t:c?H.`l	ۃƒ!]^/Ç&R"J@~ǳm4v6lj~"d"0  JA-amXCBVǈ
Y	!riE%đd@Xr:T X/Cyh,O2Ll%|ta|\BXEWx|S9h]w7s6щ!94seܞJ zP}y!~ȫ{Ϊ/FqRbA@ ꢗ["gzzdpl $ub=s@GPhC&Wn>uV׎Rrt3l%F&#Qz3q8fx9+\&?&Pi1&(hQŲiz>Thp%-񟒌@\v,d'f2fu0kL<n>zg`2CE}:?=o\>{<22z<#рED,Plm=/})aSl%c=*>폺:H\bԔz+(tF+ym4֏JdӐN $Mm*`?y6$k	xFU|Ε1ڤP{2A4H(:|y%@~zaap]*x֡V-PH|@mcL>4-B.W%BLL)c !2	yʤy("'	C	gzĬgР5YH/DMp7~vc00$+:FkC\00MGL0MjӷwH+|j,z1a2{$  PNǛFlIӾTDGqI$*^cɥ<C<HIu{me5gu`̯8NF/+UiB bīJi+J.`	&YʎtH=FťZb기~yӭǂzt
A!0L3Phm=+􏰁ZPBr`+ЮbkwY~A_fW';IE}ź*TM_jSm_k[5ǴZ x/Km/3^ <~׎ךPh5H:tVo>Bd rvG^Mg-:M'q%$[[肷[H Uc>^n]LY`W-ij$>8"ޮu[۠1gfrG$r/<+gv1N10Tg@]eǚF&r >sآULYN%f(I	ev~LOQ#/"B-Q=O	
 ">0r	Y3a<P1\@h<Ie{$<UsNC05_v-۵t\UI6)	=$5_^0Q̮7 9HP{$ۜʲ20;DZ̨>k"iι;^;gJ7j fbsŒzwP"(@ );	H[>fSηQ:#-JMbB_|1ʑ0}Вqڧ1z>9K58#í
Jk8	>{zjn՗ˁfz`
%ܳUi ZDظUIfzț[1`<$/~¡bisKxP}&yY谅?F^fwE{g,5Kf@l+5I(ɇK	]*_1,;2z]aϧ{l{D䏶`]+3QE(TA1e 6<~L}؉"uv&N@~eRxVBoJhls6pM'
[,N ]%Yy=GCDNe,&EwlVKrסv@L*gS{QH>]lGLAo@P	xhYGo0]DDw&jB3 ?^!)>y)sBff2QL7sJg),g8$sPcS'6<
`e[(8aP6E~><t<~)P#iE!$g;fDpZe?<|;)}_XaP6k,BS'-񇇮!SQx\E`BJy_.8Q_xVҡJjPXOV]!Ĳ%Tv;*}7fm7́ǳpi 	/Fx4LbZ^D'YȊd<3
0#5RT Q0SQ=մvíFŢA!8(c~ #9hr	a<$6τX!2Aw|٭F`*A!U3*o{$/O+>{b8Rf+6	@%`<%Esv @ǥFvi6Iw6S7u;U5*>T#GQF6w[vhyq6$:`E;\œH"UlˮK}?	3MqoOpѧawV7=8cP㏯SC&nyʬN,q_Eb*2DMz"8a*;HNƾ?uᵦHZ|J7:%Rb)>DP*ev,<j2Z&􍝆.ǸX1xP_
!(	0HqcFre䕎@ռ)\v'%<q"<ۊ 	ζu~ "3'd!'H9hY[5b4`=qG.PP\8@'f NC(N]r^yKh`
¹3lTsJ]0+_rųm<[zkb&BKȂ 6ü)eNNN_i`u"!ؾsa݂@JZfʾv: ˣaRq6!v]qf9l7f!)nA:xIH6/ۚl,⇼4`r$B*tUx6ՒtPˬ.ci0&綅>PѦ2:i9Em-⑥k$xU_le']X8^VL SA<xtЀ6co"j$2|R;HqmN`Nĳ\0I?l900?Q,=s_+
*\CjB"ţZـUz2A8'1tjM`>tD	X<ײ7"utЁ_S& W:w`-tl瓵 g] !x/螰$Pmd<-̉si3V;
eʬwbr8K>mNK)x&s@+<2j<N{/yP|YL0R9EW
Nܢum)<䀪X-:EΆRj=$*"@큢n?,:^SգM
bv1xI6ֶ)}

pʖU刜W&,e*{za'AxL'`.)]ޡEvL/LSzo:n/XIX ?-2HF֠ER a ϧBG!|a~Y8_]&5gt\I~y- xs3}]ۉnN,c{Lf桢G"zLq&%)jp¹4W syMsS8/\O458st1-ڝtywJ-U1Ct-ϼ|o0-|by[F-#80ghOX@FX6Z`f 2T-sXHQ*~=0$}֜3JbY=˓)?h f73Ť85L_ļ\	Al^H~c)u,%tBUBk乧Ւ<tpb[$%^v|X/Ղp>DnK=eB9"0D8!r<y`B9Y5.T58=;FC"ְ9\`3;tCލ&9f%Rt v/UO4h<nr'I_,=ͱXHd2APA'|}8ђt@6/q~$eKeGy},ȉ1d)iID",I/h^`Zjo{dr-l𧨗U2cL;D"2
9Gh픊z'%fn>N5I~xuE1AFrfthIY*ml-U&e#
4iYǥmq͛nƶ׺=oO?>?.r4DcHӳóýbᢅwL+&`"&MWB[5ά]xi\.1-IPN"m衛a|ܙ,yft MTG#V[5?/jGW*MUP;	UkAQAaֲSlT^~W,;[ArLrHoc7M%NdӂJ TpX^J>Qq偆13UM+FYmtCǞ±A(
@3^RfiD;%Q~K)L\F6
jaf	|8+'Ҋftn*mt|X)h(8)d܅{{rb#&WoxŜZ[R:FMkt#ʃDMNlq,3R@y~n&2`m*9j^Zۚ<ޒߗSpч`7|NB)'F0BʟLPo"'9P3s6.lp>E=#0u5*}'.LRBԶzAĊU&kB~(I
4F!'*r\&JjNEP#  olU<ۃ_2q"@۞cs:RHb?=fQ)YCz4W -G1}S
e(1咲qک^SY8a0rz3Rj4{"?"GOS:slF< U~߷HI.9ZI`<Ň{QK5]Qv{o&1H'֝٘jB *	^W>sm]$N-c,5V(C/{"͇2b5/LOhXdƆBOCcr2ԅayS#p}$ZEdg%A`iU̫hW#-{P^}Ȣ޷:9qa}褁\u~.Vq<|61ϡ-.\wXZqg>K(ũֺYS%pap-:{A&>+uGoJQ~k>pC!6{lщG_uMȐhb7_zt?(6`AF3i̞-0Ww5|m,p<SWۣz.YX":WegȯL&Ğq"dTCHR_d'18ʶ UH7:F0z,r*!{$=MiyX	흜Dd[yJJǸP%[ԁ'Է(]ܮ; JۭK my>6CHiTLٿPtw(7F{n/2^hFכhS	3=<A:M3!茉P2^ˡ8 9ӷbW?'Q 
`ahfB5G)(n΢$Ou<s
T9|RW!wPkv|rz՛ EyW1γvJz8;%SNvXvRP-+tq?~Aj̆FAnC^,2	@q7MZjtA-Xfx=mFvԳlk@4S(_Koq)K7wVW7ɣ'q7/_c)<;^}yQN=\`KP^I3Z|ƆI-(<CJ=rTeHBA$Z]O |F僠%vϨg9ra!:ih$+H:y]^blfvmV0$$f·-P9݁7dģ
c8&ɣ4 J^6/؋;$?r>qP}ҨN6ӳw{Ljltiw)
g-y
/$ hyh}MJK/h#%;e{;%Ga1'(GJ!8s:j:S; ,1~(	'j_)~p8z5x19jb>IQ=|sMintĻןFTZfIriu2Hm59'MU⚎F5Wr6Im|3B"w#.@Tj>M0P{}#({4 ջv^|ii#Aw>*B(9߽rq|b*8}x@(v29;db=kVM#l
pW1h+89M&Y:YvNUUyALPlzMqk~۰5?ۋM<긘{^hxnhy$oziwϱ?+'y~L'oRu%|j|I;{m*.f#Km^lGb7?$"ű3	OU|E{X}.9 )w5Ap?&d:9E
U$7o[JLwco5c0:='2^޺lө3y|E8]|gFK\=J|91it
-nY?r$\XҰ}Nػq a~j>qT[EuR;K&&W=#)yjgڳDȽ/,a<{¼>:WZíSyNzAӔe4+nAXAZnyhek״>a5UEG9Pr^`@\F>JAjc	ۜL$yq[G٥7oNZYvt˥i鱡uqnp(OX	RZjOwi&r=Wz{Ю@a壍N3<;kyw)ϳۭ:uUX(O@RazuBGag&-^׆-z0;t>bzؙMK33^<b,El
h̝9YnLpDԀRBavFg:Z-@GW_/ͼ8BKkL4YXbaV L1_kbu(5X/fhD!EY˟dN`C|Y)Ǧs2^rz&.7#	O'}9MNYҠ.MJ@&E= ,t7m's'7g]#׃X^|3(E Kpr[h|3Z0Ui>ʪ a 7Ϗj/KƠpT6~`-P)4[,WnER@׉`
ވGtsP lf>[m	w,uW-?z߄'.1nv	v]3BX	#
;(2kZ8+M.,})$zz|Rv,g26b#jE@{^ufAYEx	i_pt7qhތyd!gUO^pi
~gɳ>B;ߔáDx{LjcKդ;ECf7V P#4@;	sJ.0) y氰ܤYquG}ktאkwQIxiQMra$e^ǥaJH`-A]ڟ)a!v$h9^*;:1ۯ'0
$<tYs"yG*9ڿ<!eCN|7w'Xj>*TV&?9>i  %u[V
 =}<hŠYWmţĺ{P#z:.x2/)%&'o՚o<m"D	pK6a:(_&tKk0{"le-8}ۺ:>4FYҌ^<>4V2ǌ'q6h|sgu9]/&:`y^rA'FY|䚎'h>YHȆfHX`iPa*&ᗢ	Z" `
O3
jRq,B<Kz;q'* mۨS|BЛx1* բ_r[9*|+,JNjrL
wcd-M,ljVZ<n}z[pM%,{wt۽ܰX$[;'p׭'anE$R_0$V,&v4Ϥ`3G<)l>$.Pq"~ 床{
B_Gnh?H^]"Z\ocWPb"~л{E?7;Y0֣Ǜޭ㵊&ѐi%iX*dj!Klo׎Ё}DНo/S2oYk#zۇxxʭEkL+KGk3ŋ.K`-d*cl3%5`CTw
SoYQ^|Yamn9B7ZC\_Y-ċWcv1Fii2.g?3Cǃ?Nkb?Vmk7>kA;%cErB]^/2b_r2]mmmoՆ4t]"`BWw,20ne 2Ҵ92l],8;Kz#ՉEYD
ڋf'A*֑&Z}jY -Yi5ʑdBzCwYm}'>?|.sa>EɅ*q+a݂Y6$c<b<yR'w/_ᆃ!a>k+Fo,Kf+:6GaYGF.qP ꆼ-A 	Tu^6uIA\_\_݆Wwۨ'B%3%  s-/>*Czl9sP5@'&ô:IMe6=a_сtƧnt/eX\/|C^(plKζRNC:uci%١4lb9Re@Ά(mƳڒ4?AOR$*T9v
ՠϯJhD̉9	KHOCݣAۛQ7'G}]uVSnR	t4`/{jɽA?3oYC]%A3WRLrᅚf146]'Mga9uRh`^d|>vw}Q)dl|=j?lbt4}_;RM@y8n4&85?M8F`VVP8*هu+"9 PtKh M>U>B+`}@wQ>OKwqyZCpX_wkYP'ʉ
KϘfom/-`U;7<^`:>aT^| B-|IĴ |\El4l,G<K	B_0 A<"(BRoۭ{:A
Nb.ך{k)nS#~0MG	qCnI>r >+"W-juG#L~򧿻%|I#ZG?흼98y#	 Og9Nw9ͯ	˝ve-sOQE'婦
L;M((&MAFo7n^`eʬU+|cRjRTc~h':@`{{ݣ7ϳ֓gݧI1xׄա"͋"k2՗!àRZȧl~xH&2L+j8W4mb`NBM" {$d]^q f.`-wg0B`ٝ}q@UN0kvV(D	RXF<1`ģ59ew8M1E1=sb$6jm*D<cs  V!apZ_}
[{ɁL9uwe-`EA`&U@04EfXt74		!/[㽧3JɃz8g
[wTsj2 C,GTvQ>??{{GԬ1.Y /?#BtG3'_`Nݨ DVنz=Ml=9ȓ<Qe5Oftr t/&9֏ajsY@<lasDd=k
O3f6X.yx(JD9]^pUZf`	6eBݐA>M
(hD0 uqoCen۷_To,ptx7KJkk&RY6~^G{OC@zޖ{8f#ö4xe@H᫛_׃xDm#<Ѧ_t67Ip{_wv/ZuYzl¢߃(U>T-|#2^oogڶ3*.vݖ|Ԏ Vra=gu荆b[WPs깽v+}u״A5w:e	pGxI>{Qo3xɅwۓBsc.ufċ V]nls3E^?wʦ[ٕy(q-=OZΉId04ʹJeX[a@o_UhT\6w~ m}jQ9Ep٫q||s0Lձwt$̋m35!%jz=38.^_
tCS~\{CJ׀Ok/{:͘Mkzub\Fe E@Eќ)Gsb`9h]!c/G`g[pWnFJč'Te2<u}гw5MRu1A4F=H?ԏY~|{lNZ&\C37pع5`W Hy7qۋQ[ C}a(e_;bZP/!"KJ"ܩ>N/fu[gӭaєn);´	_Ed6p<ʹkl(y͇􊋛i/ڝc uV88:pB:y+ЬO׭e#7h oe݄W$*Jjd^<&WOت<aXJȢCjE<eM9Gr2HI8C+>=taj4ʉ*~{Ye$5:=ޕeq'F+lp&vj&J"G'o>CeӝX)-`dVG>+^G,1hx*#qS޸]F#jWDԐΜ
".eѨʁE٩U@Vs)[ϱ2S_ݍu<[T݀<U>T:i<}P*㹒LV4'v'8Ĉ({`!Ȍj3A~DewiE}mw=]M>(o9vG&$(\#>fD *k!R]fMj1Ha/H=S)
:[S1*n2A[U*^4GK/,gNF}U`2w2z\?~ ANKWIYϻ?kOX+mM.l!_nfTP%%g0׍á@FרF!{0ULCEE[Kͱ47`D-61@ȯ9%̃CI(#-3N^ûhi^S.=<掫,J旗Ed!5"rV=;Qzl&8PO*ʇ0_aӺ|<8袆ޕA[ՃHmyh-rnYk(6|%X 0#L\z\`bI5 COp()VNa2$7HUa5hQ@O]8'sYMNEɤ#\5xXpp~l`MM7@w_8T>+F]R-:Ӌ_j׃_P)9_92w߆8鞗k~{Vǂu^5+Ȯݦ豻e'jߋؤm$B;~)S
WHbq4-3u^!u˱oMF׶W$%ߠ
yDdvG_bb`vLiSN'mқIƊM Gv4M*kM-ч@*DE=O=Diz`Wbmhv29'ԡN?d'h{k7#J ]#!1sǳ̧	)XD%U5\Q9'-2/ :!V]i@Qy\Yo)?p_Ծh|6uuɶa)/{fG'~,,WN/Mw!+*G«H}ك<j$QA'tĽ(]=0܋F@kdTս|'רkaq 3<|+gB2vZ(>pHy
v)ѪGa:LS@D'C7)NpJ-Om9^gɃTT/2@ ƹ.k0}O2u:1V5ՌA+6uhceFn(B#`SxO!]s7d>6YVZ~iOxxmF}SЕư|W 5zeaGWE>]Z^sC'jkIC7*Vuf6CRaQ{D$_?b(iY 'kMG`TrasζAk.ޛ(=R..\:9;N;`cq%<bji%FFwc58bR׮V
4}!:%۪YA/Y`8WTtrxⱞ5GcE;vvc}]Ga!xNI`(_hZ^qih4V-r'5XPd\RZ m/դߍ9nO,_FoyK=i#r6S{SQ m`_6%ib-5v9+^pi9!v,w}>0!&ɍ1)Xrw2|0XN9	c}Ҭç"O6
8?:NI/'
YhȏgkgyKBBF94im,0}2Y/a@9V?>2Q]6%
;s^h3mdȳVm$c):ͮVc81'Xg~ŋU
o;?#%(7lC~u, 'tyͧy(TIРG؊PO\l;L.}rdp7拘H")-7:ѡ;yao݃1msɉTҕ%jLf D <df5.=G{X0D$ܞI'.K(p*ƚ]R8#%kjBt#p`soF [~fɍە=&eoLXkU`Kn+aoV_QdTkμ.;Vg՛a~N윞;3[W
MX,$%R啓Os\j,	nO*Y|uN^y~UGY{\㢡iҪGF*Ltt9jP!d
j,uFCy{umT* v5@	e;;j;(/&e:e/X-$V=ٛwrzlw`oM|	|f.?<qK]Ց~ &CװIJkȎ{ɝ	'Ct3iҩs5\hp!Dj췷%Z@rKΜ%f.e[ j2D-ddڍ[n΃\v'Oʊj00)۸˪s̬{b
k׻m|Nn1nL'|f鏼ucÄlY"ZHE1]|¥k8@cjA ?k]ؕ#('5O}&Rt΍#'#f~Ӎ'ݭgX)g&&^O|b	YH'}1vt}@fdt
Ԑ^sɥ	O,EN~7@2xhZZ"5Sv?$%FHC+٥	U
EeRkяͼlJX|(ճe{Wʭ-,`W}B5`DV^-Xs	k$#	y%0B]eoA3m CK쁦hoa6| eM]]^t)E>ԗp|ƷO<fLekNgg@	Ef(!CNZ'VVLѦ+ΐ%2=<K+Hf.*w
'Ϟuom=Yo7$2!K<=XJ
UU5X_#a)b@y<ꚲ-6Gc խO.^ġ$:X>%OS0;\0݊;Ksmq9:2 _)F\; nY
ϘcP^&WX;6=e=ؘ8@ypMȂ϶1(B@-CbP*!rғT`HwvK"y}APKmB 
D)/jv
8y^b7z%KԺ>ڐk'K:I|n"@s>HiL3gO7vBLva()\1X
B$-?TDHƒ,IKU,&L#`B
b~ឱ؞`i_&!3Qri=X:TP['M=WX4o5gI	')iĚrK곋t
>܆I.z=fR0uJ;C"5Gk/Z(RB$R8<"EB,q>Xΐm9,sD!81cz۪5U#'J/ ŝpHn
|C9p7h,#uS#EF; I֘:gK3+LruO04f0C%"har(54y>5Q`͛LCPYNϻč
e%7B"Lw[gߑ,'b!H`Lu	B*LfEȉ߷?[5A.`>Ē2iPgn#4w8YΥR|uyXw4&9fA{2{r?%;.(H"^*}[6ǾQ3(<ۤkp/{y6&{5a\QYB?kQĮ[45gu|ݷ߁pbs5Gc~BX5֋1R%nDG[4cc9GA_hnX*ڵtQ3sé<iߓWj3-x($]Y~s0]o$Z	3#0n_r"XJ#^BZ27H	!T2Z9# :Ja<0lhb%VMKP|6IEPGjpcC^47KgmU"=E嵓-XU[8BR^Rrk5JIg(i>0řl~M	Cf<{ŏǌA7[wlH&:Fov>B$ڙ8Sm)+xߧ;]Co<X]$j*ڪAIڣOB{Ekd!ܧ\2],W7*=\աfF'Sx8BLϫ@73!PÌ7-[bf%ܫeWS̈́C(o :9r6n5&/G$Ѳԭ1|Z?~Ncmx
 ãݣó3dqTrxX9)WD6FZ\
_EO
_3-tPHP$1~I55o4Y/hOT@`j]V ѱN>TGv0Wum\
!)-E>#kv
(:׀<a	;ˋ7^0ϸ|i{ZtwzMI&7㓽GaCN[
|RG'~01o<3Ce^bx}Uu7.|N֚ypE{677:+Baut%v$|z)bw\d/6sg,|ؒj- [cq	um:yl5 c(#fL'?H`@:"n5~pX5	%g4	J24.(-dw>oiU=䒔#X963:j5t^u|?ՎDBꪓ4) (hEy3u8]ә{q.GUxjKaQUZ#g~ǰ86$HE3G$c+J#xU2CI0Bvpe2bJI@țzSr<`Χ@]/Npb:W/n1Nm	y]OYT2zn^sIG;jCL{311i7S&6!)P&'}@COgb-DI豟!Xև4~aT
BϕenXT[i	4,[c]\9Na&L@7	 SvfDxm̎a6|QK>m]I^"$>+? 	u_9}"GLbzk#>r^wrl{o
TFÅ^6X
9"ցqFIP$ڟJ]jR\[oxlш\\p8·T,<mP?3?ļ?#tnn4-.e94,q2qLyh8vcrߘmYSBl$n,cb#1ICx"`C>b@"LLue>ETK&d\Ahi95S(-wFf:^9pCN\X,ыdY}SHKյ$"Zir{f2}5GM"L	s5Q05F`a()iXp/>v<T
|*V4Du/Qa,ƈd#h~%(v@@HDQ[U9uZxoUv鐅OȬ!08B:,` yv ɷѸFAЀJt4F2(L-gzmg.{sg
Ι
?_W#P"|-GbOf.'S2XSWqEm/~@3yScx>k~Wsxqk}{'; p('`Ѭ[*q	G#覍g Bk(]tˍLpXiL?S6pNh;ѐR⮩ő		h?]}U9&泀{Kxoo#'ݤ$Sop=xV\~u1uS/K\ϻ:~V? 9ZE3@ahW /	#>LMgcvщ0yw'l<^ӄS<(/ltt|^gC1ܯP;ʨ)h$"شt1xuvgzyqKN83QؾcGg.%,^<"& F7Tb鮮<lInny$~xzv(hM8[c6qo}b)UMƠ 'C^ޘЊPyTRxVsV.ޜ#D}G}ӁR"S"l2:y+LA?2CINU/JA{':cn=DFWgm-nծ#?7LJs+&gʽT>^o*sZ/D
B3)z,Vd
z<u2¡xaz{egG2']:|8fCMh?rO:|bft^_7۽V"$Kh	iҳ2UV D	_OW\ʧ%&}B#$)<W0AXr!IKy9(|90b⹯_E@@u_jÇ@דa^BAZa;%@D-YG{~=|Gɗ6s#QlqjXyR?S^^wQ1uYb3Jx&Y~gz/;{&h.54}Oh?ZĘK?e/JϢx.>$&TF{/txQӎ;}.d\TK`/=xcȴ60%ƗeV$]2znY9Sw
(>ا?츽?a.r;xa>-b@唸A;o5-W?qtE<Jji9:`̱ZGaM䑜ދ۲QAiTB!} |5P-
I<Rr:{N~Pxt|8<g>IGjQBl9/GﶒJ-}J{222x$Z} ?#N?N8xn'3ȿ52ʎ"M$(ӼvRfx{cxY+^j+4[dI:2{OpGo)
a?&a"Dg;gx<I дCUh~CSPkW;EӑCo;(?=8,ngfӎ/PdS+6y?Sʔ׼*G&e"ZuuRV;>
uܟXFD,̞vi..P%!8?w՟h7> {=ǫCxӇ<9*1υ=x?~ޚDWo,JlPWAW#v@m3jVJ(2{|ՠk$-e=؉B)d(T1BT1{M,<U+a"Tg#ON*)Td&Kqn|95M*hN|`A7:c!HיS]A*}QJ%WdLpS rj3YRuA0Ҧ˧[=>tn5}FBXn^SU_AڮPU̇8gx@qRDÀ/9kLݎ	ytqpZ^瓃rWKjoɈ0_Jݗ׼4B3_HḭċIȏMcy܄3p=ܯu	LQ*ܧ@ph\fG婎$QГTԻ?O{'?`|%7}|
:r'Ɵ	+`XXp3JCV[Io<*zpqZY3@9ǚ]>}3p?u:nS+
~ʻ!=
G,y=ywvw훝@*/(hbY*I'DmË́1f5ئE}e~j	07;QMn8TA?ItR#~UڇLr2[rVGWѕFq{w*ju>)@&A]5hyem`3b j*	xG2֠NYTny_W[L XMBFC2g{s{b&g_^/yzU̶L?Q~WxnJ)Uqfdy:TWQzSE5o۔h"xk'kM%0<Ĝ*}~rm(jfact('`/9ḟwǣj4hԐȽov%F~ҟ&C;j2/"M|ׇރ| WFDS9'B,X8-+F񆑞ƊU@}>14D>I	,4&\ 6q?iɖAdW\n=f/|:ڊwML Gy0]'i,]&P+&?7؛N!;0fbYƇ
v$61>OO=߫ќOɛVB%PIkyAI)-r9[:tћ)iz=N@}a{bQnYHsHz,N&YИݥ0Tax2L*n/pISv8+Iс,ZQuꮺ[bZo*!g'Nl 'F;P7XHS߁Q ;ba<jS9'gRΛóׯ:Rl#A-=G,"f-ρ<M-djZ-ɲk2G9s
M5p0 i;Qg75><x)Y$#褋"8rWTKmB)M~ۼݒjad@c^Ykr<x<3Z^J˓Cs8U>ziϗUh送U_9y	=	Ə{˞$n(U\:b~[(K%+ie|/nwQnή'**QU#"'`[dNN9e鰸u(v62oQYĹxKi	7QE&v+BO5+ϋ@Iɤ"PZ B?ϰރ:9G/X l9s'XߡNh컑ZP$acY @糭p:ЖJZ:ѥ?+\]Bl~&0>m%-{B`->P%&qSpAi0jfJGd>6;2Ň.!aJt*έj݄
2յdW-n	OJq՜
0kE׹/P$5=-SS&`-܀oI<
 >~Uwm1Vo*|H
]*EcRu 8Ǆ8qj Ȧv0;?>O}~$wmZ *2_@b?吀p#_oUHU#٪KAcpvd>KG=ѱ }	/?N{Y)FigXoTw`((eB:at	MehȨ jɌLg"KʜH
[ֲP
zvj{Mj"Oe4戕L4רV I:KK>],pԟCߨu7ᒺy:PS/	l#K
Jq/¹HM'W2c̓xBvf} r﬜h ?Q$Lh-uKC:i.-XŠJ
&{+ 4@`O L V/ݾG[$NbG%$I+X	l8;Q`9:SP+@C pUHPTǙL]x)A޾Q'a\ٲqr\<2M.;\ƴo
HR[1;	)8?I!^+GvLhѷ J@}1 AGc7݆OT
4C82T89iѬyŘ&8N@NSլ]M70^N7'HTr: B
b%ĔU\"tTB0fP ki-gTV3q#A躀 hākEnPN;֌f͒ߜ%E>E1&\5oȩ{UTbnb(>HrMYUݬY_v+u
:*t0 !19Xu*Iɱ0nR%e2R/pq5eowi{Nmٽ.Ö4@9f]	C4߿>V!)$~/!م}^ ]9A{>e(Ct9xw.<GNps<G4  n$̔
a?(>lCF>L# ]Gl!ǼQ!d;ɴ!h51'@b3"J3^}0Y S<ԧÈ0<]'O) 
V)0OBy>e'<B!½_V%=nre!eQʟpO	!p(i1= t͚H&phڑOYRA>L!eئAH wM3CɌ<2%Z 8g(Y:W[ayIQnݟ-p(^"nKE[][NERbumK5N˻{?=UțHa_e} ~N?m
5YʟgA]au4/4QcدbV',TE\<yS)ozn @~'~e1>"b4/틥MneoɓŌGbx!66ϽuIbAQhALLN8Iq|򸉕$b;VPy E&st;Zzn?&ٶ}*o/XܲfSUd"H2f5KeX*CSOG~	a:=~ugp(NCDuuiAfne܊QZBPX5E<<c`,JBd;-%,r@@pٔowtw8ߌ9,<Z1YY+\XZ8XGE&n	,MtxмpA4i
؉$AXjN'yO~Կ% .+l
{G!zxF/ثb%)U8*[$Q jQ^֍Y	%N~꾢?A$ܣ%p`o	ӽP;]xo*]tTv˝i94<G	eqE2)!T M/	Ht)=©TN<z@]j0/.|t]_Y9|a\^Qq-' UܦJzrlzPJ4Bθ½r0v]\	_YP+E9m%;C%nPs8XR#cJ;ֆU*fW>fH|Cz4xO) 4&f'-msg#UQ OpD*XFK($Ơ?swpN<d>*q!͂q[rk

;#աo-g9aRƷ,?f}5:0O`9znfM#`k><mo[/#^L֯@l3hҿӌkS5x>3<	x~ML),VvRgt,@4D:xYwg)G"IRJzQ :tgGdW26,|OH?Ol'beʳ{z
9*>z2jL@9|5Xq~UiuEKXDOL5z-;tj'0o@Mjjo1G7=JPjp}TL2p<E:0ѥ_7 I\2Cم1%{	+#	+ ȎRGVC1:'GGNIy~+.{SI$~g&z x@Zs\<u9*K{RY$[I5|g7j>}腩0oǔݭg |a'g==ۍϺGs))Ƨ/cBlov?=s$K
:f\ٛŅsA6^NhmӞJWs1 Z@Pr8Dǰ;%$?bPސ+5+ǰ'._-%V*v:	عyw];PB7nl:tC0%&Xzya*z-[Ce}a:UԻ܊73>0\bxz-&=XMMXͷ6폏{FZ!1V3	HS4\BRݙW 22"sMpVgM6]-^އ~CVo'̼zJ<}x>F>Z)&4Εnn5@a>	}aNrBgx
h񷏿>d{=t7CHx0Ԭj{TH,s<{8{m]dO˾ʞ>6׳OٷӁtv=~"u	ooЁ?#<"s"W$ǊCx6JNdb0wg%r<??ͥWc_`+U#r)+% ʢip|)I:T-Rδb`$ĩ2dLXg!LH`SهU"ɠ0Zև`>jY?<R"܍̈́1d.'q ,A[EJl頻ƪFf*-i|F^k,zelDǣyWG]
;l-&\j-:WI)^dHn©<R4gEMUWz[&7 >s1<:!ӵuoc#\sjC:;W[:?Gx,I:aV@ 	ΛOןu77>{ "{oI'LB!q` ihV߿K&,Eo;\B4_q6#:#qxJ4Dq 7 Ǧ&n?$/\]3Lt2i  L2{`umҘ:'\Lʑ*e|.Ei^{|*keuQD1Wu9Տe2/c#Q3!5BoRV}2=
c]kpq=a-u-\r'ꌲ?8lx2"
h1vXդ>^Xɒv{|xct'>btMbk<[2JOU"ݍocnR(3V]{S(A%֖߭%wv)NKQS?B$Fӥtd150b/%E<
Gor$nQU*	ޅڪ"I]κR)Aür}(<u"PwA_9]?E p8wڍ#4|?,:`*i;PD+o H7ݯ9{6ee;:桁}  1肠Rt4zɋ*ԣcƎG^}dw>>L
nI {Rп%Xc>0]W/({0xG#7e/e^ע~}5J>_Y$3ÅvȂW@S!"ʴ .@?Lᦲ>K*XA)^<aRpd>jf@3VI"b2%.f5o(l#CRci	^	}wrztrnWlE`~1q.*?i(B?5}d$&/<8?l#{#]tq!|z)uv/ax;rix]ÂK >i <ʱ3YѴk((dHtCqy	>ؐrgEc2E;{~
h'^:wǓ>j>%`,@x^L8ץ,kTg}wg/3@;NXG96 Tk<Aڐ@by/#ȍT 2P
v^E3_(]DQߦOfqQ߫IfgRG_c~)3=N}r{6Xgwkۋ17e>l'%u#~sd%jM6^4g N!cE9GN\Siـ{n6ǛF{H_lG@	
ot7g?w`ozlyL
"~b6~*ئs1OqԪi[I4vmzz$ qg_1-FE@kTznCUACar&X^uXg, w@G'MLK2wLs<x&? oZ6S}ǃ	9?0ZZCy|Z0ⓩ8#R08iuXy *,n9afAWomaicZj (4PD-jhVF^
(^)|#v4nӏa0?_bxTƎb	P%Lñ*K &J#,_ްtMTHWS-k6]u:x=O}?"6}3U|7ҷ,X}.y,bKR3$(euˍr]4(+2?RٵN,)9wLMm;FI;e^!ҧTrf<`8<;@="a9T3L0$|}Pjo1~b{6lt:"nT6Aɝ+cSyh;7er tfxI2bHS%F5E/vǻ X	Р?l܎X{+F>AB@e	"WG/ֹǤW"'J|{6
#Q}Ydgŕw5XFo2d:FuCp\ f-fNXbOSQ"rjAV&+,spj>JRֻ>mp<;.g;?qt>lIX%GWxWv[r
01d=u*G=̭nI}YM[+!Wq5b@1NE
jaM"iVjD)Lܡ98qu-ū(6j3)o?UVGTOc2MyՈ LLM.Nfb\_ -P<nl?%/2$/++_ynj/󓥟Ygfi/_f)W;<33gnLI&)]s^oTln ֠Ma%lwhAb0ڊ;FP;*XLoKԭ۝󓣣NM]R*|S`jnaug;8{{|J>ĽNuX9򡳅c@(|p6?;lѻ3ËmR03D$.>)b!8anyQJM/#[APDhy|NO(F\bq-vfbY9̊lfF\2ƚm%6\t0ubҠ=2յuЈVO_|rD89Je~E%VNɾ8ZseП&v0c Fc:^@mm@3%UlPe:uxc eXTG>W̤Ykƀs~zs|b}7qփµ7ye?AⓜA芌v`k`up7TE֐{ٕZ
/]BAd(7^Z,2Xr0	2	SG)o!*T[l~9mHجɗP>Q5R
{NwBJDL'_޻V~IuZ~.xwZzNG"w?&m١wm)Z𻞹78y=Q%w+B$¯|iBV~=xwӞ 1MVyg42]~#I[n9Y
z<Jn"ϹHsc4&;,i@t$1Azy\ ;?ҴO~5ꛢg`i)G[d`	A#g}{ZU~36Ug59`M6@`3v<Abܺ	<?g#&3Z߾JKLȿ?\8nq	:Bվn3f)5TkQh+U:3*~WZz$k?gܗXҰ!BJ"DCkm~ W$Gڽ'c:`A:85\F+p87*ʴT`4L§>2~o`-ۅiϦn D6֖({	9П ޿0)jqLWo`'޴$A/
CPeXQ \B?8(oeoEVe.=/ ۄ gG.ndb{
ReOHǴp#.V̖=8Nytp<|5Z`zf	RP̥ZKt^B:.^w5wqM]y6^ˎQgw.ef}
UHp+v}a~H]*8<H6|H1/?h~(G} 29@GaNvNy煹ΈHO*~LX4"	gcB7I+tPb*ħz
-y0xx$dWJZ"&˘3~)I$F<1fw!p_3˟B'DCSX*/ܰ:7ܼ?nOcc"Ӥn
 (py>Z":>*0#]ۙݩGMO0$A?DS@BgjTUӖZv
j8>	)YQaEyгr$w3g1]iGFٕ m!!'rrIc#f3|΀1卑nEMav:%$  XrxԳf.vE/F2faB=A	CBQ	`$gqk3 dJo{9I7!ͷc.C	f9Qc3cyנX}ֹ($*<51
YF{Qz!9J	#n	O'.{gC	l_?$tS`5i(Ŕ'Ê>(60v\%=:/^'kWpVKR^N ρpNvvZ9.Ϳ+n9H@o|RN!ZHM$
yUjL&ۙ6tD'TzƇbs#؛+7p
{ƚ]8Ő!vҊxTm;4lY&({]Wk~
[lcgos)h_ΊrIޭС l@0q8MG08SGS>{@آw|H+ȾI:_CτX%z
CLO𪑆J>DVÉE JAqki޾%]J1]b/Vy`JDG+,XX)ZbjE8P
* w&^	xd/@kI1uW{V`	CFG&g˫赠=+M8kqIĔ4hp3,nAMIَD_IW(|
`N/7K셷0	!wY"<K'~6UTd'tӫ|$n>]ʣ7
2畬|V]H-*I 	+*V4ˮkPY%n*،7d_5cK6:&͝^鼴=BL9麹^+䣳?Ϙ#+qdt t{&G\5{ljyv|)T7Op?`JutiIw'}LsV<b8ځG~U  _#2p'rܚ2%u,MJf<IPo0]EgGD!aH$@:&Gs*Uא'03A.)n9}6أgvk`Sn+JCkWoÚg7yS>ɧ.q@?֫_vvj9JjBMN=^f|dX*eE2F pOW_	ב4BBs^ʰ-x?&|XSin`&<rNfҬLb"W48TF	t6$1x<Yyш<6=~&sK=WaxG#SeB/w?oįIB燱ZZGdUvg <6vkCH1[@İ/t2?A`vzس~,_Y34n+ɣqjP@GBFXr\r=5Mwoj9א U*kR~=[Y#S)0HYycèQymvL܂Dz	2:WIzƂjq՚+n]7#TɈdSU$!Z

	g=a;FN
t}
'*Ą ^j`0w[[\l;L5X#Io"QN	f Kh{Esc"nwr棕87p)%$qY "\%IB;˜8!m<^T5Zد_B8
;2/_aLGmk]7дY`_M&D&ԁ;W'Oɂ}<pRbּxX("%-or+|v˙dH%ޅ'}ݣyKx!:/ף!Q{g8 YSscquSj[QvV<wnoR6Ք_Ժ[?ҽ])ٻ8i7gM!f%֠9LhԙaځRkO;XO"~R\z^	cXSY!'o."ِJġ)@ЀGfcͳ3O-1@a<	g^P[:(2bVpO$!'S>V!M ^4:)8<*;(bzyNuh'B%])}:k3;DH5a
٤Os?NᯗXl	r#Xs{F.a@nzt@jbڙ^uoQ9}_$rϠ ?*nۼ"ϙsBq.c	Uմi& vPY䆗)&T31?ȇpFA/9ͺ^e?P+w,$x(II5X<|o~>mݯ&5<bu5mpFU {D*C1M&x=P ba]?w<݌'mf露")ZNBQ4Zg:IDl0A'77HlqJhJ,>lC'8% Ȗi^\AmGCw @$[s?j, ]h?CX!wӲGs[8~<i|74U@Fh2iRPim(↛#ĽE>"P5׋>aB @p1՝݌[m/BxĥXC͌	oLYS!=6x$:!Xw%oI1_׮	Uk>c\UČ wwp>r0w[	tDB78 $}0my$EͿ01ymh6GG$?(֙hwE3)` &[^	"pQhmD`30%<Q,C{JY`.dZԽUr&'D5)fRV'|Q!H	 LjQP~z<AYqaI3HȅoT!!y:`9@"}"qmf3kpE'.p1b*Lr>	[Ӡ_8!P$?(H#l0|3BqJ#cd$KgKӤ f>)),JTQw"QYXAhu 	(=Ei)M7jW0Shtuo6l
JQP#ͼaH8=,iX^Ap]x1^JQQ`:..rbe! 5Ѩ.MMI"w
rt5秾v	D&;kTdSqV*о׵L(X3PsZ ۋm+ToPWbPBm7.Toz"v<ة")d&kP5{4؉{v#.Djΐ=0yw`8QҨXMZ*-rkӁ*}(&ф:K !CXL7i{:Ipf"v֣oJNMhQy2?'CL&<dVҪklG]$S žr=2&fz>]CmQ6됹CsÙڸn(/Fcrǥ鸓S&vӁ^n<C ~vb* dxqH#6onGlXҡ6LHD7rP	q⣸<܇^x`l96ha;>tAl4jH&_o2^Xskpk$\-/j؎[6<h.,2t`Ә1lK&*.9U1UX-qךK=zF$J/!vI%Z
O-0zLF ܭu[&b6&2,CFSY(%(h3*"AF}IvxDAN}ƘV+GSo-KTeϠ.'qO\./TRL{N	u/,Kg&ZѨÅ"rG42jn=0GKT`oyTq~(y	`,3_Y/uՌ͗A(jL$'#,hY_g~ZQ
^bGlsFnAF4v
!}j!9`Fea,.1gd:+NH%8P҃l(Gr"xtE/,褥ROJv+HyqQqNҲE<dnas`o&-eƝ/NL<s4da/GҤwxEظZz375o`D8l[5݄xYcބLI  ^T NuOuIGv_cW?r@Bs=bD0Mݝ^!pA>XZWRx;?'dPʤmVY'\j<pLvx8p;`urC0o7è/"|pigE5|_9_Sռl1]x~P:ݚ?lӼ$CѤ7P1.	j**F.,N4e`8I<}Dg	]([ wY8ЀLgGn}ـCl8elVJ~ܟ^$ @,Ԡyutrv~rtpjgGv	pEMPQZ7sK%=p35oA?fd+łcoMhV86ܮ6#(eؔ$K'69_&k. FԪA<N586ulzjxt|Zv	OalV}k0B(rG>mFaAGz @BPFQY#	$HђE4'h	J7H)fբgXrT;( B7\1Sy܎8'3BPC^feUZ
VmV*/PCmiـyjõݣoϨRWBW{(FP\^BG\wXw+5a0O}`q8Ͱ]sv@/q`8u4]&q>d<ZԦPSQ||Ȃ&An{rӨXq8à	qF+lp"1+If {c+y3{}i\z)8~K4-Ss:ua@~ԚyDNna'n8p(   ?P4%dX^IqiŬquS+J0hLBx=ԋ> ~*fx4r_Kkc\!uVj<ꎁ|?ih+Ō}e;9[øJG-@BHܬ
<5P)g8$$qy+kS'݄ dcԐ3E$w[4NO`^
)Aya ?9Lax~Q"G9@ǂ~I3yc}<хE'
OJ$%bE6 [^LVMlF`/,UóE8R-pEzNЄ}?z[}3eaxYf>庼 YRF"~5!8]$cYƚ)*ׯ3F/BTQ#IZ{qE`'cbG7((	6p)X)Y@th0Ev;rO <%8ޘ뜞FZxIg
cfZ`CmSb}6i$R:j]XXo&]#{ѽQ09QJiy\	rZ:BZp2j\fI_)ҍh9e8ZSk!zi`s̲hn{ŘBԧ>QbY|ud$
5wd.f<pJқG|D<~B3gt~<OfJ8:(-R
 A̳hh~[[ELwdʼl S'd%NЙRN:!X1Tc|s)C
sAƏOKN(PjRcO_L_SN BV9ttv$r8tʳ[~j'NXi|dNNjN]/>O	HkDd[F1-]~dL4REoV!m$.K>{{?
uefmXF Τ]E/(\Chc|6z߮o^wga7i^Rx@C|%{/.)u# ~c&wϚTVh"O=yBRyyVMghcv-E;.'SQ?pk3XE]jHlv{,a'F.5kٺag8L5/fُ6Zo0oSq/+(s{Ujfli64Z4ii0iRp
prh<_tc0%to!$8
l%f,G2_фX-Om#UYKeICr҉$n`RDIex3^K3*#+-v.%j{C^KGO<HJ8`#➟*XH!~gu Zp;I8\=vs~whϔϙvS+n˥k暧&^հ9YӒ>iw/B% {̣}+>mC'aCƐIEFM:	O"ni/̹LpiǁR=dAw&5_4`4&.݌ FC1Ч)T=î|4U"}sW&PjK/Qߛ#joy{ᣵ/^UFƹ[f֙Xɂkx\Gsk݋*tph*'gʔ$%c  3<p#/M]V~v2]jגuV6SſLf }~9b)B+B
hvC1$	9	dJW$cԞ.u\Uk1LBG/UHF9H*Kw4FQ@#̝T 'h#k8(1Q^
Ǻlm>Na:qr)Dqsy0ַ_-v\Wo%
P-B46L?'G_?kem[lq$)
6>
>Y>LNO'*T +g#ax(TI"UcU.F{[}:0V4+}hJŅH7Mu-YfmGYy>MО^\j&f}(z=_1Wh16-N$|!ģ܅טl55,Kq
G|@`&v+=U$eӵ5QDyDWr]`:"=!Q!\˃Ə)SS|;jhpaZ/i1E%#HNkZn% 2.e
ۛc9?`-]Hc7Tp1؃-±FQiWxd'
ӭ*R2YaTTt乁[;I!5䶰CyC[q}&/ōgً~gCXr 7k q|;5uT`8H1IwjP&|pB%X=F.m,y.XR1(b~Q] ab!BM:|-OgrqZWw2GXyw{HAOxS|9r|Mţ.v`>KAAMt!f+~DDdJǇ%* GDnhGLn,n	Cn?! 7g"F_ 4z۶ di;<?<?dX("k580Qѽ+c_0
URQB*>fZ{Pi-{ty,v7G&WȒnl:T*ݵ9m/_楖W+ܳ	qB ĜQŗĉI8<LMA@'3M<V^=+ 1<įܮ9}5Bŧl|tdɀA91ck2˅3Z%G屠ɒX&DFҚӭg
.;vh#XpEhܑunDh8Gz҃&FE3kOL	I_֭q-ntYW0w_>yo4xqpՁS޼9;;wyw[?Bd6A+`S;8`<YڊM9-N?NbMڭ_mo@Q !f7𲖡hեYp7!o]_yW*эE3聲aԒ9SvR9\bl3qߠ~` "OKf[9l=DY0iD:5\N+p䜁5:O[Sz0d-}wHC,HT7sem,O.H`"|>#P!t_iK0пZQ鬼fǗ2D!pgK W#\o!H{[n={t[A-tU3ΔQ>WGY"m	WJk"OR10APfu5czEiF:$(4H@e];9S	wԯ'(U#nb#~ߞgPm@ NҲ{T%U0F 5qB[liOvԭA|v`=V	t4qE4L˞"^j3g@4L`DjlcLMC׾<!v)(@܇(:y=_[hY`z2WD~&ɱ c
'G0Wu֖V3yNT4k­>[*XwOsQ:zf!4ms<|['_N9kZ Kupd ܺ$4o@ۗ_$HtJ<.+_>t~EԇqnOCM!މF8zw\/uEDMagO+)#<B eI+9ea#@v$_)wu%syQU^ChQ8>ul-<h3]j	r`d:23jK/sVWXpYנӥBto0(^?KZ^F1g;w~]x9K_%2z:u}1dQCxŨD/+\鍎~;ysp&ͽ.\FcUFand:al=jZ'jց@%=d"Hʞkb#n$kye*<: z5lJޣyԲ6LuŶ2ZKܩ=B=.ϡL	.(xw}rH5*h>jl:^@mM&	KG(~[MƤ$=g`=߅&4?(~5DAMʣDOi'4k2ǔ3]%!K[;G6vI^UyN#dځJpAjAj63&wN	ݹuZb$P֬ӆOL͸MN>uLE2$Z] $&!|1k=uC?/ʹDm?<fq֎G[wz-8LW*<#*[Kz;2/<3oTbhes*#@L&HnFݜmx0޸U~=!$ `Յ%+#,c6V1,"E OA0KRrW}u")5kDs(pMS"J
3}+2#vQLES\pyO

G3N*W?Вh6d2!@[#4f(v~Zs';%Tv#w|-HNMkW-GFaXx]vTp&؝r=vT
x짺|32r~+x&}pFEX7r1̈}hVZOuFʆ]d`~ƜO)\ph1@('Bň+V&^ B'}Z&Bw
jG^w'i?z)-6z|FpFk݄~CXIKZ NnVL*&4$&dy<dad'{gjj5R_l[A}=<Tڄߖ55s$[;#D)Qr)"ĢDЙzNFczy;ܙVn"sg`24xvWtjRK-	#a͐5Lڼ޻?/k2e@/`#s,
9hJHӱ{}9tC]A-@XofY/׼Hem-,|k:g&ݶx[7տZΚn~2$<X[ufhm>r3gw;]	|W71Y^OC7E'օr	E=i^h-t"~>o,9A33_@Օ_K嚒e	7kLr@Ð	xo DY@bw%á&@/iL:s[wT.(r5!8~麀_9
`U֢`	(P2ڀWn4'3n0e";a00Z	~ݭm#Fݺ?! 1K>ζ[$	<Rd"?,n`ת78⥖^'4\s;LA1Q{{k
Mj VFW$ȿR}]o's^
w%HiG ã)v( CJBMٚ|M31V|t 5]c0x`R>hAwӴ3sC:v%z%]ZWJGݶxqϺ:@FKb5'?}L~'H7]F8YubR;VkE]6j	a	A7#)bEx&tFp<8Am&wB}	Ev,o~ֲ^Ӓ2kЏijm=]Ϣ/FdXv[m-u^'0|O 	S"#^ҰNj#Xqڐl6l=ٶCAo̚>-;g!Z	5iZn]!;q_ Y$zlЇI/՛m=n*v21o9hbm.ucs'fwp.nÄ,$9&߅n'mŜ^5wD`-f?糉z0	.⨻!T"۶Qu,?<}cjNReO4{R)Q 'm#<u.'9?z[m;B`@6r<GC^eU2VIm`zg4(`ZuI(ԗz?r@u}jNϞBDx}v3ܙ{h'Q;g0\.VTzg%zۡf)~RV8M(xL^Ӿ,㵤QHiep9#NBw"Ws>Ɍ1.hV.eh4J>NhZ\6L..&th>`$?*yԵ4m]TZ :Rgv
C._S+|<Bt׍hz27V} gSA@1$[,цXRGV'D_D0*(]<k[2bJ[,6);*rHA"7N".?	x ~IԆھBE`aω\ /5Z8k(ܚG}hi;n5my(¤	4sȨj\pfi4]^AŇТB.O4bUو8\jc)H5޷ML1(#4k1ζVwqNR	ADpO"A0/upfZ]de@LҮL&H?=yup_W(Y؄ͭBÎ2_:MӁƣQ%^K>>n6*r~!e3xQ?S cIiE
jEIk5Dbô2/әeAK͢	YcMl43	.T}%bJϣt[Zըʎa7o TV';c tW%-RQ bW!>YqH	Rt`}V$ܸb`ݣw	܏3I8bt"ɶ|`A(d_d31טm$5`t.@cɝkO9yaC_0X#֨ItgZ=0-w-gfQ>%WMi KʻQ%.,iITB$(m) $6;:|jXEcd__Do- 2rN y.cdU T/RRREK;Ykt_tۗA<$!m
kKdl+|>;Ǡ!g㽭xԳǙ۝PPM#n'A\*a* fZ&/pFGRȂov5K'aOtr*N[A7j{E52mBrM29wуiE]Mġ6qt3.&b)SQy>!wM	"'rR4f8k9aؔgQp(s2:V"ΧX} O4hV.tM*fٿK:ɲsMcǎ7xdF`Ԟ)JDR?]K<KoEx17# %,*azJ$	;vLGh.IAR|pD_^^g^ЍӀ6&ŤtVC3Zb܃k0ҧZ5x&C^tkM]ByY
4YU^3+~wo%a@EG(EPfܼ5|o:PyWtdg4 bV>/Hxvp
Dd [Xe;3"#8r8ϞiVYPXүgJtֲ#)@ ]+z2vy}SVsl_ӜAHڲ94ɺp4>KV~i.vGya	((@-IA;Z$·ڷu-~L	<ѳ^=hƃ}n5ui#(dY JisM)Dd-WW;D|BzQ^̫EWZkP_@q!F"1qjb>5S,hC~5&BBd~8ZMaNZHHNM,c/YyS[P&IPZ	?B@8i^;$ ~nJ2MZR8°}lA%$G9,$WC0HVsYn0Zs~ic(||gNxBiE.Q$uhR06%6&vQTenF
(3"eCF:ΐd#;a^0FlWݚ/xI;%؜X(hyAi\i+=Nƣ>ӒNf8HBZa؁֪ܨ=/n,~ý"լ0ݿٜ7E47t^{*Neow:SMVzrmn'FYYx)w'{35u]-Ûwg{ob4=fp%cl{=yyӌP	'~8O>)6qM;ȲuOCmV|A>E>٠7Zh⾈K,]c,q`X 	 5^00rma'"rs]ab6pΣy.|d6>M,On .bih*T'Eb
_JPV
XmPB 0$<4{/(4<'Ci*7k*ytGUpVq^.]4hw^> ZL+`})t/vx}ᡗy9QXt?NϨ4я=(}<朳_VĴ~2K(JgUSA|KݖTwϡ"-["`:ʊ3o*8`5 D?C,S	g_(~F[ުڙ,=ь۾G (" e'k@[#<e)b3߶h4#c2(g^8C"OD.)d/h9"2lX+x!F
pw](0ӴF{OIib#pVK~J@Cm\(^vV6@
%$d\l4${H(˜Zr-((xv<Sj80ԍ_(_)6l?Z b^G2|՞!>G8 3Y=~!QuH91G!G#&9E˝	Sh&HLrWT"DoZ rzGSYK'uS&xu<%NN.^團	C'Ui$qcZуϦNv2Ă5sw:	dK!8houWiYF] Mć i4GHoŢSJ1"\N拆Gxb@,ۘUN4p$i?p o8Ťd~Оgq[B5 16SX,h/VY_Oc	;G+)Dv`OY`w$ҸH*g]@!wn9?n6;[nf5(ll_<^n<v"vˢtY<즸PMp۟ͪ"Nu[PQ	^Z [N	R0|Z
1e_ _mې:̩_앹C"uAY95 }r\Lj}'R|~iQaƋ45p>ekP7੗X!f3RDzlYНH{a:zO%:~dWa8~PO	&^rY]%?VO舉B#
J"NiC`9}0}Aӯ$0@.uW19es?7+8~a}RnC#,tvV!Xe^!+A3`{< YA`I5=n:Ku;sTS@m6zN8	dJ++Q] -h$?QKћ8+~F1Eof,5Co>H;hzk?wޕe<Pt7jqh>d7
v(e>MOx^M*Wl{!C5OsACޅOjРH6ÔTuP8رi#)!F 0Ro[9Ic {h	
6sf*I,_{Թ,Eჰˌ.F2Dڼ
(>>z(b);mT`0'đ)6ߣۣܤ7u1ڟɭYkq8+dھxaP7P0$L3Ecpp|E,.+ h.Ѭ'r!=$眞%fW/L٠1K} ^ _iv=vLPp:Qvp>JJඤ`f"Y}8c9NŃ9Z!X	[0 @m-Jn(ͤ
y4U.ܦZ03aeSRFߖn3 EI&=~U#Q"fk{+/K0;>yry~mB^+878~݀@;vzl*q44eX(7p@c:`pGڡ]m$Y|4-v]6Ƹ6x H	JR2ਗ਼~c?cGds;2#2;vo3ܷnȚ\x4gIFם@Q D铕C`r"^R>B?qtFQ]#RߪO.n}ߒ7l\8yi}7bfWF'?]j7G8Jo91+*_TUa#rS#v-tbjetڜz]7[44}*PD&Kd͹pLpUK]=)8"4Ps|mɋoqWm&!p} jO=БJ]
M͐L}xMv; aV"o`CնK5Ν69U,W#..DRpS!{ ec7*~qّCAvHש}2A8,e#*~Oj-hOa&12@2(å,#&nhxp)'q"V`%&!*	z@eʩ'~}? .ћ{
(r)Wȣ2fLzD%DKrώ9|UR6xZM?E i cB0	]6[*4'ag8M ZP`B[[NE 7IGGLhT1KlQh<"+
;pgͿD^jF,$YE7Ƃٓ9jį?<{ucܳē;:!z&(Mx5hϫ7/K`Nq`m	6gPx1IdG_f+`0d/_c&A;#:8Of'QLz4oJ@L ?y?.'vh$7YNЊ%}~zpjDxM)\&/ge* 7N+&qk=IL|?	{>O (a%OGwOݒ|JO,*{`̒LQ/_$(pրulIr?Pa92sK1y Ak^&ɓݤ+@2y!#tLFAjBѐ6j$0nТIS7H$?FSVm;~
x,XXDM*)(JАdțGۧFьWDE ^P0,ZIJ5	;l;d]38oMB^rU`s}<o`S cTNunQo4zIm>%Lӯ>o^	jp?~KwK-{O״q7^,VoǾe)5&_%|2)0_0ds?0E
ۨ!ʦ.#h/n}+U	3)ĆYm!FnFP}k;#Ku4bw[gThpS"c7/}3Q5M$ИOA4D`v6B`aRk[έ{Y([F-8pV+8i	?djo}eyf_3\ga	Xũ$W%3N4&{hl)1#(r$5mSU>f<r>DNW[
;H]m&t"x0BsL	m6N4Jƺ(YMӤ,0I:Tnh.	8Q^2^#W  xe1 DN@[e6rTRUۂL7B$)d6r@"o^lCbTqSb|Lo1j7Q;	ŗ6ӻo3lH3o1
<;%/4JH-wݭy	$s0W2+fngA9So{{{0 ݷR_׽i"IDy\$_eWe6kZg6$]v<(N)mv_DӏYug]K77Qc+ch2 n ^E0%#cfui i,l%Qѕ<ҜQTxge$tw1a?%>a-2V??ޱ6Gώ~7*N?31%9>|hUk"ꇅ&VPT+Ԥɗ/k0HW7f}|Ypl ɖ7C~gu0 :x$TqԀg	N:g荅l9oo2x\iaXnKcTyZ8)KF%7H+Y ]Eo
AĞbGUɮ g/ZQv>	ށWW)&)<#SC
{5T};;Zbޡj3Y@=zqE` 
5C,~=l5'2}(KHq\wǒJi9o?cP.vbݬ'iBp+P"v?P:}#tns+#U8	r0"Zhgr6Hpj=5W2PV(:Za߹,nL *RfbKCZOݩ9K>PUJiG%`qRd';"<AqKymD&Q1C5NNu>Gq9)CAt$sV *!L<_HtXN	ͥ%xɅ)'_MzLZk^rPP`N^nS6മ_ӆөFPqÃ/n$8]\y!pv-&b7bnLNO{w9ot7e*2,ӃPq	ot_6tnR :q{qR| 5{I1`ErOWov|Q8C 5"Α{h瘣XI+fq:Xh> 0@g XN9x;K=fTvV#z	G%?=#ܩ}(bL66֓zYwiwY'8$&ΡwwtQ6ga6hc_.*ȧ~ aݢH ưR"Aѩ ޢ1wMwŞgrELvQ>W)ވywӇJMf~ߺwR-l_bԮp(q9&% $~~?]gLiԑVX<ӷv_խ?bXI8eAb+g~C}i,3d#ß5Qa}Uڃ44EJğA0 "3"E-B[
J0Fu1ti.Hhj蛴oBxTMGfRhmv+a19".6/XUB{ky1EO(ViLy[ 7!6pX0?Mm7	 L/wùSq?HT<,ʘ!e5T]@2O7b۴pۄF}t%E<Z1n5,;B"0)f cirEv~+QuV>5H(s pǏDa:~욃Vc"'}T|L$.!³x mB|B5ҳ,.KAeH>]Oz2uI^<s0f\U	;ef'|@P:9pΛN̩#ޥo;K!&A>)eۈ3v^)(9s4'#{!L<~`/;J.4&'ҢܒJTA4Ik߉4e7>##jZko5|o{AJ21	|@5І-[[/H%|Ȫ[Tbb~_pe6sVX&>xJ'Ob:?*3p7i"7)́2!)0.?:f]IkxH?H/}uX.2D	4}s\ּΐt>}.lws8-ͫpʒtDYucs>"g4Re]v.!
Vskbvp϶?P;|V|HU[Qa 06熶an䰻}Cw}"?4w!7;PhͶK>_papƋWj\QO,ŏR 	ipRc[B-^)Ax769@;`z `Dv$O(&Q6o,86_qE%euΩ|~6N'>#faݫT21[pW٢FB4r`SeA)A!8xwqߪQ;@.oFtkNLWlWE4=Zd6uc{\!~LWwǇo}|}!Q:!\ki4aoLsuMn^1ld;H[jR9VEٌg7`O-'b6+>tpɫS4ٓy#Gr+ #pjde921_0
;fNQI%aC;PR 8GA~HҪ0mi}`Yui4D3,553xbئX
v]ןv{ZqU JAX
!25omHe'if-ҐLߺ)_I&=u{óv,HhPC9'¶iz$p zl[CjPAː8XykZl1w
1H|_+#fir-`[ڏl|L-<!-*OʸT=}c+3 _!1C,I`w[9̪Y90˸dMC4kX`!M:L
J̌BcVf3lH9Lx]nmh6E)MGPip]Td3{Hkyc.`r[u=?$OGmn'!Oz~=d]BDrGUm8k/ZNnĸGO\j>̑,
$`q)ԅW*z(L&}0lGi,6_13M~d;{""5թd;{EKpR:N6;OC; C"#S*mTMTkv2Jb|_ Gc2l?Z/}g"ppU>4fHhf0 hIp3)LqiZ
9Tf4)oB~6,|8jIELN_?Ak?hYrgy$-䵭q/um:EUN4U.Ї}2ԅu=o4=sg'#bOg_z=|7~Yc=W-ha%sp촸<{%fpW,I46q^ۣ?6'	er(Ǧ 9uJ]9)z:!?'+8)*'$7ڕvq;oc.miy+ON"JblY«h{'aHt5DܮI}Zg7Zq5QߣdM|y>_kpcs)Ap+fY%ߗ<69)dz*
=PC$:z_KI"0q3
Ȼ%2kRg;fVpB@25?>*{rIU#օ>삺y	zmJNd`QclI,ʹ>Y$K㏻vwQEB,kjҴXmY\̢ުVzu\,T815'X	xېT\#3dN3S~+rwpG)[hSN8?u.%-Eק	"c]Nh	Bp6BT~u5ؠ9m4V8t9|ʝJkOŵk"眄;k\g419u?cTZr#PKhs)oB,6ֹ1
{%, ؝W`4VݒJ?'~q~$<l^O $ش>}OqY:mVY:L fsty4솛:	Bj*a?ʳZ;s w\$#fgg`F9wPEbޑt+ΰ5n2nBNu${WV_3H)t}[~%U]'9=+_@3C}%'ptޑ1m38ccGpQ;~7~Gn-CǎWxU-tiRx6U@bMع=j8<@+AU^3U{иBi7vwCQmh81\~jlKOۍAgjB{vgx,
uB%x=q:}LXY)_!.?j*Mߘw׿'@9\hPȒp2<N&0;ɚ9ݔKش*

~`&%PTu8`+,4[dTa-'BaCq[39:=њegG
>2:''cP2ɷd1LɅ;o1F
DEsW˵FU`.QV	֬w-@-R? ލV%cQPטDkbLy27u{qP6r(nYClo3oԽV+RH=%o	r[	'#𥆧aأź@h?IC2O2Efcds-Yo
|j !ֱYA'QhS	{7REx鱄#FC~t
+EG<Rhdׅ4Y鱐>?2lؙ˖ }$p7O0f9hf@;2ȉ$@N(n?@D:3ݙnaY`؀2k#R,[D*"GrBOHRJɵ?14'6otaIO-8W=Aݰ#wY0QT8tˑ3$/ݡ8'u/c9}ɻSXwDe~%̱@`%)c*vp۠]&%( ACScC xljz j(.?X\)V"iFyJA$Y@)(!<޸a&r0	9F/ܺM\)~v'>᥁n`oX'jn+?i6?,(U5pZ\e'|#cꢢ'^!Yz?9+E&J֜{PBhܷѸ.ᛂHu}94. qw6cz&i3kO^YҡY]bi%zơ{g<j=HLa6r5:K*=#̅]__ۺf
+癀@m-uOCmzAY)/8i:Ԃ34Lx8>ؚ@Fw((R-t,۞w7-2lH~Xzw]R;`G#ܚ}L))<ʣ5*N[_@SzfGXƮʷ^hA+Fġ!/\ަN΃*q4ޮڑr[VqQ%vS^H]*GLp7Ӝt6ۤ8F20-F\zJA=u*hgI=gHoG4X";(辫^<[Dϵd7ǘtHujGaY܏FY2V&K8fvxп%٠,Vtm}e"nŪFs̷iwmv,JEb;`mlD/FVhH1W-apư1a2p1;Xnq1^M<V[A@}DsB*"Yu.P!j56̃dF߃ߠ{F0$k	 L HBlTccË\Qg!thL}З?z%<-Za?iְza}k7UomUW>ݸoؿ-Mɨ8HYvqen1WnOhv)msmVb4MzG!htppbZLLOM7Xaݮܘ.{yl^'`]}&\nb'Rzfba
p3!q0FUGYhUx{Gv$ʿJa Yq#"f		8&[<tZhuxw2q#E
*kjC.;7է@CҺsĖ%:$1h?Opby8*cD[R%
c8ͪ=@FR͑#r	ߦHH, qlow70o3UJH-Lߠ~+I/inS`;1 fJ_ jPJֶ7A9Sp,}X4Et;T$ܿU h_nǚ
%km+bįv!آ&5(ǟKzl4I>\HH cA-W)lvXW_>k=]IJ@ 0#v(>qmL5eA@Sʝqǝ7o~\K8n}鮺Ʈ,5/_#<	}II*6~"ZM|̽v2s	}%[fy
CCv!`gr}H R.GCtḎ3ڵBpN׀f^Xb9?;9@000ֵf[	[I<\i/dFet&W 3ǭDTq@Tq.|܎;JJnE,wiTœh2fq5@v䗎i@.nJyH&ǵz1*l=(=92q'rI
"&8$[	{
)yb~a66j7@$ MuS{ޒ9	|;\%i'Vf ~:35?olZ&8bwu_[&,u+)aF#]
!ʹ(bU_Tq8*oN#zcu9tRiAeDâkn1!qLyKBuU_Zi͟>Yi?Tt|~3']7HF<!fN<PKM#,&² "Z6vUzCa1lBdD@9	"ٿK#ViY6zH"2'|->y6K!YAp?	2\> |bX_ˮyЍw\d!Bq@i93Fb]=(VQsDQ.A1]jNKNڥzUM{<瞬Yt(-	:*duğZ9bˣ۞uRHRLĄBV>_bO/?,[$1
52;wOIn`.9£RB4MڞtoK_Hs5?HDBh :plWsdG(;@F@3l,EpC`МY%;.w[B4@ c 0q!f[ލW/nVKQ|'V5Lެsϸx2U3Lªl:$O(	"5O|losx"g6ck9&ݞ0EV6c1`CaS66[G2lc9 [@HVN>2cy;#T]H$9[N,j26/;˛b&Nݧ!Q+7L(A%ϣ0Dַ>^R4BTFY*$_`	2/qէ_فnn)V6&єLM 5jf+p9w8S2DzP_ڶ:b5\O11pOB3G#doڑ5Eǳ/E7rTLآP2z	V-"#`XAmo<'edh1ÐCEj%p{\OLT'.2ɺE;7?o<.qaN'^ڬlNDhuSUL*#_re+}Nz1Ig>vߪ9?Bs˺A)r8'u[>2٘W}r"X!ĖkgFu˞wg`!wɔVRAL0;Ȁ
F5IU`T)0J~G'`;׍QY'f.a81dbw*cWreYa$:*ݚEaxpZT^oKo![=
胏CAy6aVaZ7l0}KOCLDR>ϕ=4LUk.w$V-bN()%pIeF)a&Av-0l=`3,؎{Q:!#GDԌW|Û_7V\Oj1@lڅOH)( f5"n1}D(d& ~CE):5ǃMƪ](1Ӏ9M(kp`:HOڕ*@XCx[ +}}M`K#4A[v*ȥqUw;w~U0!*%̍☮S@PoF'Xi<Ke{_Ӣ7hݣ6Z@<-gTGcgL<1F98F7ǳQkV\m"ד@R.ΞZL_pR'bM)h ,Py#,u0MB~p}bldD਄A1"A7^Q}H,u3@-XHD$nZ'u	ƕ%C&BmH}z$A0m!R
?)ߦ
U	_?Oٗ(fgx'9֘Vث4/.(wr(]:!f',p[1n3##PtPuN t̜Ģק 
N	?Z+b*]_:UyO)cAㄽB)@Rۢ\kW++x/PZaW/MaG- 8Xtaُ^NpMOkk07;,\dN+=",SG+&t-ū5r# n^ߘWy6ɋgrX:1\f~=)təv@V(Ad)=	
ߏT(-A%yBxޔ
*,?Y)l4hD'p»ۚshOF>e˱ ػ1rm`Mt21[X|q|`Y2͘ զ"|K#Au8لDF8
:O97u1y8AA*;" $u<!h5l&;٤	0)ij0}mĠZ t>gb"RC""F=׷G¹ %>DU"CP x!Oƃ0lV=gowpJAb=z	%a@I̰儆Wfbuc%8F7~h@.FYz&dT2R+(HeF 3fAI5M%'NBwM(i2ƷosmdFHѳ"c
&d)V}&5'P.2, d4XW Yw=pOs3r>-Tl	 &}*{n5W64o$o^ѿI1rgylGlu5.#dȒTFȯmw_ eُb8Wi>eb!;9tCiSy]Q=}p>AȝAXfE,XcWV@,02?ϡs1L8z'|1jqxi1(V*$ D:U] )V×^ЛQ[>n|\c=04?0MdeMW~F9#POˬB+@=iIhe<mL.| Sqxgynvrw4yT
Y~|2apw(={Hj;lHJv@F8Hb%rf7D?ghrB2ˮH,Q
lw3tcxߍMWHEQxtxpz)o;薨G^Y1AÌeg@0i0k3*mn
{kНBmeTkec~x>7#P>l W~ rpA}
(;)$b)d΀*4?:JParl&Q& ' %yØFs "&H1hVױ2`!8WCw@_,b]>_j;ѽ0QSaQP)Tz$5 Kcim>ҙF}dQ
32Δhw0H2$$<bP=z6Kd&g5 `H>Tmr"C˜Y"Llu"~840FGf4 *]#h|>WOķ~Ko
?{{|SI~ǧ~CyۃWݖiPr	`t4fEcVcHaɣTlZ(F{giJp|yFMOqZl[G<gp`viZh`:1oXL"`% c<4 /}Mf,I7x<KI奢&h~:2bBKcK<K
MJ77QGBIUv,xBC
Vw2'8A }3v>[,u=hF6hX^C[SǫC:m=#JM;{Wu; %$Z"5mㄓ$fJ
XGMW]4W],"j1`FA^h3G*rB #-;Sv>-w@z,0C&rUp{޲|y͠}i9/%HڳI*?g{V{T'B"@BERq%izVصY)&.f
I%U$d(Z6S+|eƉSAXlX525μ+vN̔~!5ٙнT\[[@)B t0-+(:p=QxHᓛIƹL>EzSIXF3Sw%Jdt|G:k.uk7_$0Ln~Ef:JLA ꪆK9L~{/MDH $*v(N~#S'_zӮqLv7UH
CDH'"v%PM+]):썆k*D4 GດSMHP4xW}(FY#އ5)P@0[`R-`j`Ra(K6}TAuD\f s=lȆ2tﾔ$wYƄ,1p:A
2C(JkUnATM#GqVR]@$BlpޠAAwHm
d<g7-چ={)tbؖ4{d\X|~qT	]P
crw2¸@ ZLGbl
<ֈuE~(Ԏiv&319DN}OL!Zl):trvA!q8hTJ]j%E\H;+l
ƣjs0=0;{/M_?k.e-ʛ'7?ou	hErOæI8hD
̔zV0(wwVb*$	/D:	嗭@d9
'fSzhSѡښC: =Z~i
vrZ?ybGZ1Ͱ!<ެ>iSޅJng\Z_b5oN⇨ɖ-+,᳛ӥNt(0|Q둭oiټqWNϟ^H4)n$.k:W$>\}@kA::^ՐEL_X,|.0" >Pܬ.e:z]ء*;KmM.]P(ڈARnd/Dn
9
L0;"~LYiCx)oH~1I*D
,.Y	>ii#kL̘OC 8ϲN(0&S )+|^C'zu(:Nq:hIg2Xgx'JNϚ`R>οV~=j)BCuw8		Apml{HDTNQ/hU"ppN_]eC(i 4kS2Ω 9ܻQ meغa0|J.{CgSt*2y3+z\\CL!5jM=B%DjLW!a,ɍaΧf/5wJU7	-?:xSy*~@U*j =+O}-Jᕺ^iO:i$ȔY9/]1yF0ml1G	lNqF& ܟ5jcȐ	xvԡ=lB6ĸ{>'&I4O*Ta^&庙e2Tsbz'\܀?Qxo7_(ỮtJX%y[{uB'R{ ϟNHFEIX`FV8MOAPs'$rXqFDmibXo;*R&pR6&ѫ8➦~u^Z'czhf5ܺjMMY-7~AUފ[M5>Ωu=$zLZ)SCFEU4*=DG<Z_Q˧^KQԆAa\K]x[5;@ymu8,)UuuhP\2FR7*It`oGt"[?'ϾŨuRP@t#2}vE:Iwv3pAL6/BH_>d	~+LMMq'͛fܤY/-P	8$DFsk4B Nזu4$iԛ}Ro-[8LGB86|0cQjͧXe),|P$B:&λtkb
я/w}s~TZ}!g-Y3~O6T{r8G9?P-i-BÄ\/!jR.PC~'PɅk&SFkz:D8	(ܤ
ItfM:pPl#541:7;.H||.s8_~stw@6^6x%pcknӚv-V/n?}3>PҗqlXDk
ncG
"Wu|D0]^w4G76L ;j´wH˧I;d4ZO2`R6q|0>~$FotW4!~=lQ#ǡN~v lRфܲ}srn*1رa^G_Kᨣ6+ԯ%SgVB"

ɛM)B?q߹=Odm̱2*MMv~	~ol"3DjQد:ҍWC
ilxhЖy	Y7LkJ#.nZʱFǌށyl˲@OLp!lxwZ)m>ڞ%mg҄{!YKN)Ih jOLu1P;4څ_͛3Qs0U6( atw?!/Lv_o?\:<.((xkƭM",͹8Z)`>"WmoԘWinj2R<&204ART*uUs<k v-AMpnͣH]vrή`骜	JXe68m>4;@DmE,{kjyڇI_y{->n:F]ҹ c੃hP!>is[M c&1KC?F		|T!L		Rʌh)ږb0!2cc gOmJL&`xI .	먗XANd>}NNQ,6|p9B8L$v *GZAf]Lupck]Cdoչ58=*>J+b]cbT"x~T IQZ\W}P"Z`5LYWBhsIɸP	nōΚ5PI,gUf9I<m#@hS~ gK
dDI$@j<aܾU<|TǕi6+NE^qh߰M-pӎBkŝ_VA3C-Hp0M1cJ֋4clzoRJ߬($Ob<VSYicCi_B>WXDf&&H9al󒖖1;c0ٙ5Cukeqy"<25!v_Ja/DI[ dz> ujc5fz{)[I W 
^R_do;~qo~}BM,N[k"ȵKyqxqJO09UG*SPݼMYA2%V*0.BW1>l^v7SU*2Xqaw6mD}-`39]3ew
)Ey]L֪6!1`;fXh\mzʢ"jg \$|FOBу.;$i\hܲИ Hx^AtvgmI6|y(ŝkĩ. ׭xX;P6CzMoVʽ#gj*ޝXnǟ	p?,c,5THi7P4c'l1vU)9\"Ƶ|
)c
x-vHEuJVm)S+PϙƇ Q/S{cM]AK^JVxf{K%<VWT$LZcc<Im3T CZLKIyO$3fсƨSu㱲Vv[rk))EN,1pxgk3Vo;Zb8ŵQdsz^آjRCe>SB/J|Lj }]]B.|+a>܈L9bAgjzDg'vdJ5"بW{TXpf'TБ5@ރzX;1MQI#x{Fp 	E+N94F ps.aJf.iO/";/ʛƲjXpEC4E㵼R]-#%-/n4??_oVmlRhi/5<瓭W_bKX^=?&.EUPLǗ_}mVD3L
*plR/kqL*㢝I$_Ph;L,KsTrV?_!=JJUO2DT{}O1<4Ap|v@;9OaI<.P0%2vOJҒ.98X((+aѫ1h'
tv`ѝ1Х1%4P
:vpIpQ7A:%{}%@)AW	ajб%/~eR-&<Ggĩb;0"{ew-)b/ 13CC@;Fjywڢ[r}eƦ|as%Wq:
@'&O+w6
}'8IxaypbRU##*	Ъ9l>b
Z؇܊A	"x '!0j'=.V߰s86d`1?jkn5?=c0;_e$XQkNTM~+2:%F'4-Ƹ >[_-Ϩ\sq.1h&͘VJ6^zYoa-!loh
yqU&Bd
 0F'!-LT'Ls IȀ˶eʰ$i/`2iI45L=o	vya^o)tTթE[bsR2@ DoţsTéGY~	vl0/Cdq1io21k Nx
^2{Tz d8-*d-)jnhX}IdWTPgAYmh/)cic4#v(yfi2Ey߂ ,Q3A-/4W/P!al
'iQdC)sM{1CWYk,aeo4>0,Eϩ?H@t)Z S`E).L o[WOLkp2~{ gL(H*2 /@0]t"ju(FsqUD0bOh(#l+y qtA[>*>4-&Z
eM8_*s2o<h1) {@
vrv
D%"a.MeV eFH]9z K.*0"7P	Ӡ [8MɨݼCH:I
Bqcdfc,\>Hg
QH[!	NK
"d|)+e^*Qa7)>(%Cu*B!]:+.]wi+㊋Xh#1̵2̽l{
<sgMiXHDf#<Z$	M*ow6錋1Jqc2?9a:I9Rq0dSB3bAM3oT0UEst=ûF
.k	!,|ZweYJNS`ݍ*'%Mo(ɗA5I7q.j	aWܐB"e*kw.S%B1-Wob׍-'Aԉ sc5 v:>_zDגdk&wnT0q"r!bXXPE})a|iv[0dDZm(=/khTtZ{UrR0M]3"Nz!f۰,ٔJ?뚁֐+'OMo8}!D/O\zmjeqi_q/}ikrA~ Ertv\wRYW!2lgձ|m";O h|yש!ut4Bo4@^:z/iPHQgpn>kӑ<wMjck}N6؆JWNk2V0h:I(R
gZJ0qpt'. $lU	Ih-HLƕ	Uz:}ـźG'0%h(t֢=⌯% >~c(&O	^" 1`8VT% ͜l>SQm(}'ʹU^d-dt	)dsb` 06Ь`+Ďi5CxF)]NdV?NpHlH#QLk?^	~-YSX$tf-2"CJ %@7)^k[ܦzЁ^fc5S@h%=dƄ~bDC;f&)9;JWLHhe $T}frB*U,M$՜(XH"CUZ{!RQXqbQC'Bm0r,SA52q2?1ty(J77Ql?F޳0o~+H}A>Wϻ^m$ltmz&[*ӭN6%#f&R_7/ #/Lf#49*׆;.{I4ۭwԏi7%'A!o^Ӕ땶`zX;Na'qy柛Q\VdZ]]0@+}{'`z w\QVF{"Cz@DTd*MK:$(Dj:rn~'`IWSW""RIJ(cGjpZMs+\ΘG|<AZXik#=	FCM691vdǖ;IX]ZWY		IKkaA5˧f0i	"omCW}F<hCrXJ(V1ھx4YZ0yy|ǣݝ({f@]ms35s-{]NQW͚6&)M0}[i@v( #ytkgv]ڛ8?E&ů*a((	 /nb:o/a4L<O{TN|3$Pq&kn1y~_Y75ԻʧQ=Hj*L2/ڸg+ǍS3VkZ=]'w)*N1m	P%$8|4K8uL:G%oaZCY})HyZi?T#mf\b~wǟ?6Q(gF @cXRnԌˋЦ&E\ˋɼVz8QƨZ8 6oEF@̈́}TirmĲ&5m(<N'3r3J=QSP4Lu59ptO+ϝoީΣ0kuLൎ]fvCOdH/hsjx\3=<U@nW BYnLk4$·]Ui0wyCE妛go܍8݆>ŻIU׎+c6B4JKNr?@2jh!QMa<nL9E4?HWj-CEarI/!ŴC6Uzl[ܖFhfɭjlEZyM(ZE@$o2d-]ݚnޮ4.bHn XNY[k]LMפt\	.1DRzrrCSU☗>UԱJJX}H|0MB~ 2V4DiK:O#p7$4^:ێz}2n[48'X<w$gYG3Yē\( /Jf<&%J[>XsG vzKwjlq>tĬ$FJ*V5XVT*P)M.b2
&1%Q_L#>/zyW+@ytHX+5A@nw.7R;ڄbz희c/ mF˯N;!\錤4xf1M&Q)ZZ5k6D!lݮ=~ˌc4P%I@7?;ԤsehQgfN f Ρ\8# 5a<0 k}P7YsARBPgAm_²wy_,nfx"8C5iDP~$d@Xhm&ʹ__ᵪY&D\<bR'T&Mky1~"Xxui@#5I!'<QT҄W;do㓅-OښSgU{`ZM^琽YDن3I2H G3-郞/l֩KƓVK!-q3yL.8f-j&1AXdeM
e'ܩ5	 *KZz:*̓9%D5mRߑ9)΋}O
< xo&N+(w̔?6uD>7aQԷϨ<4)?RE<m8QZq+:FTFBP.|j@Û*)x}ߗ_gux 0?r(<ǅK  tSW-KJ5i5S-ܨv,=fJJz .NڶJK@*X
Y1H|lIgq=.1ĨH[kV'S:tԷ%]э@^gʤ0=D9)Y6fmfSWlPJU]^흄®^/^]	.BdlƐk7[K~>F}=z7u3 $\=3n~΋9ꈔ> ܁Zdslyȭ`o+.%va$v8MPOcǖcXS-$Rlh E15r@&rS!3*<5f;_>MIJL1+\i8%tR$0W/wy,k@Iu'0)pk@=#xdn78E$O aOB7ٙy;G1O#M3$ـl3qfXst|6MP֍^0IM6?Tyi5iƏL#.R^S
wo:vvzo76	y,QҪ_OVy`<`͵\i&RF>w&NR'lIg9?'GBӆjT1LDB*B^;ŀLnOsm)`%x	ДWapŚǏ=W0<+y"j%PAjbk[x_ YJ{nϓb4||7l}L>RѤc7{C o7Y?թK"6<G6jjv>d'5e=WxM=jDJ}M4n{]tk)ORq/
o[wS!#PxyRCվ	908jALe1j|+\Sbq YLh}tۜ1ՙ
6?z"ף֣mt@0^
"N+ssoThb"fnM,+E&|F2T$Oy/ѤTD0%=<NI9HK%!A(L$qz|=4%,:ݙO-υm~Ξ4NüxMI>Z~{iޱnC?\\	n'aSECJ6$j6 }VD(~x n8l)k	^vg?f<a@9,Eb8 Zreͦ%VudB|	-LXlO'|8p?bJ=BsLc&hā0hkxZQG, OҴNB!4T)}71uD1Cđlc.B
(-ijBw	\`'0t,9&hCf0%^bߟq!_B,E9!"gb*do;
5x_D{ n>zu+
-evd(L^{={\IS~Yfi۝Y(m8,t)# '5';|GޥȸM@w{hcF6*{?a>['5{{\s?~I=|{'s+ZFE~lGB8˿Nhy	)0ވl6XppWS!,<Ie?(4C{=#."ˀ @Q1!-էʠ=ۢqD6BI-6|_)٩f1AC!By YZji;W\2Vg6SK%B.X]҃[PJ#mjboڪ4 ҶBh6Ր4a`.R(9CzYAFY"8ZZEOڧŻ&B7n {KMQSakL6 QQa~ܳʘ"DO8Kdň<Bvp!`Go8SUu=A;C_K@+f;FV5xTwC$T4U?)U@4WN_\dhDExz$B3sX=mV򖗍S9A>g#0]Up:t!%95r֒=r [BR ]D
3&oC6&im#ˮYWP}6u]Hj~hK̈8T	JKʎh!_I,THPbFq>N&e@p~=<`9pHQW`,,r1dF.|A5CﴛV}RlU +JE2y7*g|A6
Ni|Q'%=J~/+Ǚ⹳ПNjldMh_MZ0TZHE^Z	*(/cTv1jϧ!j,S=`Џ+Й5;߱7%$I
B?1ǎ,+Uvu
h ;Eݸ4ն2n)q.-7lS<y8}Hnl-FN \]R5=pnsYz;VbKX,J\h

 gfbpD<`X*9`6\sMD8?%9p2DHu2:;[(BP2b!`z.e=BAƪ)X{
ffyE\)փJo[`\OZGovw(lG2L:xݤ A1_mU:Ŕ
n-L4G
3J29AQ5gbFYmaaiHfo~Q+mN:c(1)HgS˟Q_=~I8S^ƨ-7D4wR)OC?I'A.䫹Uzhp0z1P-abix`K"EqoF)drR[;3&3|R&u{'m<Vmys74wJ#m0d=̕h`6CQgGYc8{gQXRAXK7tG6x(-QfNryX\A5G T`Hk~!4'XRF_8E]0V^pdE#EޒCˏAZ}ejɽ;OLvv3`zfotk0R+~AļK#Cgˑk! 쎫w˹{	͓I+F!2414ȁ޲MCehC;g`g織:IAqJ(
-OrڒFNK"mJdzaV/0G@ϓF\ HU54 c֌sA΅biS=կ-uGu|58A*RnyD
2rsٵ漶GQv"\`]p݀ՊT6d8Ut|m:V
SV5xbdW')TgOn;^9Y
b/zoW4m@n+)"1bڰfqof	Y2}YBV(|,T&da75~BQLi8m*L/'VM8! "39BGVMӃi~
2kW.KckTgnXYy>%gB2og
)v&C쑆,]s5TL 4([ek^Ze(Ja6+84=iBذU]p
,HP;.0e$~HwL:ET.%B)	Nv8vBym<U?B,f2 	2Q+dlboٴ߸FU,$x 9S_9s1!!ju3	EOMohaR`M&}킨8
迮*=F(*Ԛ,lK4>JQ{7cHUZ)`GWBΜT^dCLCzb1v`"e5%N34A{MSUF"?C[//x}7LLp@|$Pa2,x'GB1\@SG`\0;,>7為%*jJ<~?3∥ue҉ʉy,/~fwHxzdL0$YTY/@~f04Aۀnf}SqqI}uJ1#@`V%eT[	40Ɲd,L`>:%="Bv
K8+'<lW2%#4d!d/#:_"ije%̴W,IoqSN|D h0lHuZ䳜@WqIV&,nB q8.H³COs9WU%R1ʹvޤݲa%EN:"Mvl\p5UvfMIY6ɦ-ܦ*76bb?dФPSTX:ݬ|gƛ4,VBTKM (`T̜k/ wW[a<fN5NKK!_.YݳETI)d6Y(P#-D yˑ>-~Q62.XS-eFzPdvSHw[D׸IX<;>H&gM{-6
['rsЩ?8_)<9RY0h|6>'A:ѦN܂AgxԤCۃ}va_D?QP,2>b).ww	I"<n1I	588D-9,@9Ir#D#|x@k|Hw)R\ĺ	T;|hƒ%@e"^>8ujwѨa B-=[5:AjDYQkyhe)45-0M70'XC%d\ 4C:N9/8mO3RK:A~^&S.qt><'="yB_	`h懳#	G?l{UyO޾ pQ	ᐃe93aECXe8qU8mthͺשhت!d.uUAd=76C*`myk!M8iW`^/.3_dɉJN\Eub'\諦	e
2agE5d=Jr4% I:z^!BSR8Wk#0bm	KaE^mwg;DlF>C)-	=P̱VpB(Dn)'
 . ۻFc%8Ƽ"@(ڐqǚ)FV,uӋF$9Wy$Rnn/8<o;~xy(-;h-%6 9qwâ5+1U>^݃ߵOVţٛPC"gE)Skz&t4ހXzΰYh^,=פDa5[BDu"2Azt?nDVzkZ	hgzf;vZ@S_7M}ۑSjM+;rWIbCV+OZ
W{!"\
B5qpc-/hiˡ!(h%1nUҳ5IW.Od;N2hIu(m")6#tPYUI%I.9t=[9`Q)FޕܜDL_c\#LUwJC*:h|>W՞HےNt:qpCSrS6Hwb*[Vĩ[,j
U[		,/wl^aVUPs&6V_L	clP	V^]*oK
h&/uNޟPmpb˯iam5\7dEDmP,_Z4'$#:1T1|;UvI""rWĈaω1[.>S^k^qR!M\"XOwĖf~T{;#Gjm#c8¶~cF)b7NU#TO.S`dH-k/⌟f(_u|~wHw%ko`Uml(P&<o MxP=)Q0YB&{3G0sɝ&j@%Ѐ~li?HsS@ph'i
UCy.+%U3}7Q5	Úl;J,1%lx_2tD=QdtcL<2>?LWz!ܲBӼrb̥DGf0VW_	-4/pOrt9FS0ʊzp&Y%.)nFh%TCx<bs_'rSH	.aiŸqG)EN`Β6F&]ҡvt"=<I,?SXsOս}5OVŨ%ƽ߱T+o6^:C<ND VQނku CW3pK|X?lvH-q(8J4	:)8=?孫Rgdd8U+&Y&~Fqhtd]'wSŇ18_} L'x:߄2aVV#HUC$ETl5疴	}oIg(n7&GDKB
-?D{n^u|
5^#Gunxؗ7 #sc&`%_8S692*P;NZά|Ox\$yA!٩acX&JCTɠ'Xgظ({Gz/jD1b_wq sр!a)).oM[CQ$ bګ6\+7g93HEm31AJ>fysNuBLZi}&vXR܂"iN 7bPM'	~~(03mHT?f3VLŵ	c+#HW(##( vܛ-=۲^eEFsR&eGGW܃qrOzqhu?dmFSG6en4ex0r8	X{JU%R@
RWM'c{)qrbR($Q
<)'p,LIm$ND)fWRUȡo $-H`:rhZ!h0[ ɊCh?(5u~$-Ct?ޅhw{o}Um'P</tXvV]/h̨լlD6jw<t왞)$Cׁdt`4\-wQ+&ì\2M2@@-x!=RV%p_D+{uǬ HZK޶@K ';{P Kxȶ`v$GxDAf,FY:8wJ_Ύ0b78$oôD 6ZԠf΄kj3&ڨS9XB*< ||9.&ZđnDL&R&<ZBljwRlP?vRt­nզc(H/UhsBNq[QT FKg
(3C݇}>lcWP2Z
DQJ|	AO{zypI;nQrpHS1`>~_fyӎa35i;$n	^Y,h/fJfYqzBInw<Fsx󢢶ECkU8"VҨ3˪1	rwdŝ-+6zF:cyb?;8;;.m{xwo!rm/~e̢ $=VVd0by>D#ʊQ!r%t5ԆV`)#
1<SĠ\*ëޢsu^~	@Q<'IeN?E<KB(ؑ	m,`D	X!T>gA4HsJїNh8Nv\NR^9ʂAy*ӻ
6:QZwǷNsAV(s{4"[rӌ$d>޷c)*iNЅ TY.k?+\
3ˉ2i)s3y3+j8bR':5HjtL}BJm| ɜ_>^N:/Wr8d3P1pJ̾_ݨb&">zcJn,$k5LBb-8{G)QF7^긅:1}J󈲠"o#26pq9˔QX>|zW}2ZOgʑWR)yPw t6؛b깃?TafKfBJ$+d#<#^(ƁQ0?	 CSnC*<Sre5EE;|_.<(YR+1➄ ]Ue	j0ҶB{L]1 b(>{Af' `ʳOCB6dD'$:v@S33MY~:Z09ĂW95cI<'D@),S!&MM< pju.B2:fSNA] IbWu罡b*INM:gOh/pbQq EeIzN:k6OL ǩb9[%RT?ܖXڰʯc`/j^yHۈ.Q2KMH"5.O'T2%hW6K∧+UBCRSe$;X*hQ\XwU3^̪L s؋!~(Ddz9p%kloi-uY S1fS
Aue$.*j9JC&9b*$eiP4
 y"Di{<fjDL$`Bd_͔5VMwȦN-jji"ߡwVv,~WmJ-Fn$XNi	M`ʛS{	BsH)g3byH7O|WfFL>D ذr]L!q=٨aaejUYa6P>>;hXmy 3C"جk1P+lV6lvY"n|qG~ݮEQ5=̩@x/`qy臯߄AQtT"@;ߍ*;p	XweW٬P1cdY7r<Yss]Qmq|5
BZUF(0V0#L<WL8
|f_o08K(jCӶ&Eum<(Q*V з]+ipZ}>YVGu7?BR
g,׎\g3}b;#-M8
ct,\~;o|<],?<FH+</jQð7F+6) `7V=i}c2]cwqܚ)fwg5hbh;֚ \gXM7ׂ~( Jq `? A,}op!3E)5Ϫa`#ĸJ0G2Q[8p,=CR202;f>ec
8+4'$k<Rb&n99 'b0 ʷ$i1h ej5D~^rq)ͥL,H!Rfm	bwRZ!7b9+ֿ"L$^Bn1!qI.XCX[Myx(^Eqk
*mJD5,FلRTQcxAY6l#h}j,seu՞,I
m;>gfPM&G-Nxߏ=Z~~+sbK5:Aж<@8H൨q %c aWZ+声RZ󤃽@;<a$֍7wLHj8
EÑjb+=꫎)OhDz!p|ULSY
<bD2|ՀiWFpry0JM"kL$ggEPSW@q\T-c 9[I9JdP^
_U1=	\@펺aXnnB\w0<rS$[A:$ɑǵR;ҪMԸ%DI7yŊQBm#vYH)E " ۊ EQ4P jhZZk`-nE ;%"hCb}372"wk(~L lVuƒA9 N9ykI}ۚ罜g4+7eJ+YS8aqY'U}2師1l*m5	R6\-xk`y1EsQʱv3#ciΊ\&v7a4/4Yo/Y#6B9'a,\ᚨwQPʔpX*\"A	6kWS}MOPf̮t_]JFXYR1āN w* BIQFEz$L<rơ*쎗{Qڛ{oIf]i~AMӋy_3YȪQVt),nrEPhf8@Gb<LQmk"*1dժC9~Y4#;f|6yRͅ#O / ʭDjCK>ZYgUK/t'L3e1޸3[F>qM}U}.,9|.;fQ3+-6bTGUoN>8}
,6'QcnnKW[H]TcX	BDq9)cI#u;"V	醺I7vLhmFJ5FB6bH{Lbΰ7܋!lwek;I[SEz\t,7_"-T^\wqSC=8u__U7PhV:W`"^}&eGujѯ'ۢK(K"7:mR(HD,OƸ?֠BNpx뿇Cڱ4>Gc&^i#~I6<nÏ?cP5TVڒp}vuVY|^:FԂuUr354nyG-ey&ͬ\}I"ZhA}-rs t։yCLja"jUu.Y;|6. LR#IqNa%ډYoWvoIK!B*t	n,5I|ap-.	p<5ABO]
LU_:5gӃ彔
 S0qgY4Kzd1)h
qv4fyR5o3r޸FR^y,h֠C~
Ά^~˫7N/y9C(y"UZs.8	XwՆLD㜕] (3B qiF4r,Pt/r!jmrO/١S64Ql1fobog83M:Z
5OQ%1m:ʠ-~`@3It0s \?C=(L=q67d*/֪ "&SM|Ei]KL17!Q5޼s*.>Exk2 Bt[mEp.ҧcD-߳l"MؖywG wG]uuw$x,Q>դI)b䷘pAo<%_FoZT+u]Lm[=g޳dݡ˧3BBU}^6L"Ҹ ;+VݯK6Aӿ*+j.STG34+ZSF@_J7֗5r;JN`Z>fӐGDX\p%zO[:_u=)2ԛ8"$`!^-1`d1I1%ݏK~YVV<D6ueV6_ކǲu@lO:Si!ԿbX%%f/KXZKeWIbqevò.{0FͿ|Y_Al*){mve*]ZvHH&g ^fAbojꖮ۱]{fYT	*r!!A	L+5A.6wāP-70<y`dbb&@%_ _|%-PmR
P:NoAFs&>eė1ovmՒ@ 3(AIyMߕ6m#1Mwmd|CB;
*7cvnŉյxFL},B8	w $(a]{`lM:Ȅ0ND3D*6 26Ar&;d⩝30RhW&԰(?beGTY(h^ԩhJ[5pZi1ӳGnIJ(VIJb/퇱2%N\- "nkAjCA"L[kbUWGcӱb>\s|51%{Śꑋ	{%sꄛjKl\)NhHp&UAõnW|a!ߧ"ON*PUEy,7(pGY5clڭUmڢ>P꒻j]5p(]p`C>?(Ηwn6k{iQ=b
40ehliT*}&%62լoR;cpsdހ7< V4xy)+)7{vA(C@%e8\h!B-=Y+0"q<|pHr-fh&.{N!_VPjz:gFW|pY 6b۟9.hiיĐ{:\Nȸ+ddAQkI^( ʯQK~5])ܡks@-.`T
Vko߷;dD,Xz}u(\¨NY W
Eքjb۬丢?#9UmT/fsiiR	h^x䳶'rI;<eZdΆead!WH4
l1zÎ@ T%+~Ҁ܌56]dV-ȑz0k*WWC Jc b?́\劆YY
B,vloI3U߃I~5c*'q>Δ`e)0/ZKªLDݟQoalt3Oc1SD>\z|ݠ2s$Z0PS1_>Ř&H;};	H	uEhüCz,Nȃɋ- j^r!D3ΰw(lVOJ3~*FӾnZ78x<xwǕ-FƙNL#uY"nBʳ7t ʇ%N(iR`u@MJV| Mf!(/ ׹?4/MMP:z͖RPex zKK\ΐߡ#v@S;0 ߽6sd}}!̕Z1^L
"q8R+&q|+>|9ٞ%KE1!NQq^; /fo37ۇ?<<88f#X_:^(H[~+hQ[""C/q8nhgCIDA0`Jv M?c}̓df5II'0J
2آg[kǬ^TnQ*wi:}~*$|U7ov>sQԙva8}ԋybO1>-vvΊ[J1:yk+	>Vg֙
%q	*}jAj\8	Ȑ/fL)Oi4$;㱖MYu
g/YY|n0lE@PiŢ	l6M`('ORA"P@}ZAP{%(22&mrM-rG޳KjADYnQ>foD_A h6&kxS,20AvޱZ"kP2fN#^}|P}Ecyag7Y*A@Ne8<ӑ Wո ޢF|G(h3"Xq, u15 9
ۺk[h>#ЊwCnīY	?k,ǇNU:,D)=.383q<TY~f+,70[c?e& (2CH-"sQ	=OeunN~bdE,:uub7h.)-p	77	#3Y_?#s]!OkG֤+UIhk !%ב
jW6hFԤ-u[ȱiȧ\xmhRk3p<HgtQ1 _6j썻S9 6
bŬ'ոL%Fq bd3CW6RdIBB#je,3qA"a	e
yQWlS?f!x"[綇Cw>f=\=WZ$Am?/CL[<>vmX"ݡHl{<P0Uc\"<'C_^dkP)'"Ⱦ XPz9-o($uh+ﯿHMp
sm]T8>:}i"4[Y< Ɓ]n\\qwE곓{&Cص-Q=DWʱa'q1ۨeK4"=zl	*FSybiNUEZuyʛ` ~$"1>T=骏6'L\#-yBׯ&aRl mJBH'0+ysW;3!9Fji=@ FtY.k\t0PnaPD=
!YIOoU: H!br3u(dȞ=kdJN:QtmET(
Y>)8EѤ2 0h:鲕֙+E`BrѴ8De,bWvWX
ꛖPlGBkx
h(M.܆<o3(gְQl*v5$2@һF 掙JI{3&L`ԑ7I.b?cա􉁆ާa?TL	(M*0|K0:,bX,bWyJ~:1*0-ˑ`(sD<$>ů4ԑ~S>]bF``t0iv1ف#NLBafe\pM! dU4ITW؟	Ӭf8XÔY:!צSׁu}Qr%.z)oQ=i+ҨZ.H3T:Em:Tq!͇)+ѥ?.,$oRAᑥ6T1֋ĕ%C䁻+I}c[8GiW&&7=x86
d'>5OcK7".9^/	lŴW
3i9|# {^e<kEհN=h+U㺣|4!_l:mB<rF	]63G!\Wi/| &1~@9 z	^l9O3J 3nn%<(pGG!NSsL}{G@T0(<1I<=U~UWU#vf9nGo܈(VDZ	w,@A!  rad?+[gFsm5?DA Cf@Of<I#6;!9zYI(?!<!`Sqr{QzAQ~&ML'M<Y!))(eHނ6ŖHyeNjCv8QKbsK̥ <y|]9̣,KPY#qْ2V;檷å%.oL6EAN+a>Rx	0=IPƯQmts"J<3 giʂmen}9-jg2PuE>#&٪8!wwaWY/HW	y$cMo@Ҏv~}N'0|0S@EQMHH5,E!twUaDqL*Bڜ0rf<~Zr[ʠԡ.ԃ䗼$PV9`gЪ%* U:3ޥEXQ`i9LWp㹦C3"XKTMv|7ǾH"[*sGU]z=^DțP4KuD-tRǫn6EE(~>g@x!%VhqoHWIN/tgR)h0Ikωԫz%Isl5CG'+E
eq%Bۚ;E<_xkTax(ҏbQ료 t<7hvqs؉ƥ{ DKjG[Sav}{9>ЈWiPuf\}8#$»'Ic|iG4@EലK<021Xr^6>)}CWcި(& @ڪD3wcm/4k40		olz8<n{kPu(iJB}MGE0Lw]P!*cS$@2is0,0*Yt:fc#h;ϰ`e~Ґ^),60(4!)}1aL5%:C_a 3<BPQ°$LbJbuBY$/5guKhnSnqjiFGS;e&$nLXm~~CVPwՍ..>f%w@Jʋ ()fN<@<Cgce@L1QEJw>5a3Y0_^<Ȧ[y>E@   ?&)_rսj]l05D+յ@CۗWY4!R{I[bA0j[ADdqMe0=SخFPS #a,3=^X7Nx΂W#!PpI
2*dT+t|tzyx`wʫ2!47rJL2ucp.9kÑ۝K>`P}ҰFe.Q#ݭTݯ;dKcwvk)S
҇wt^"g`h7)pM|'YD2Ms[g=F-~nlRg'̀7vaU"%çF]}IT,4Z!pA,,VqC⯆wNS*7#j
%;šS;$a%+Hw}E< =g-ν]?i69~5I77w߬(qz榲Q?V 5w%k
ϣQ33fLֱ N,uV26@JDW~aݽ{$8vMPŚ8l&n6e%^spuS	 
42nqr6ͻ>8E>mU\x_BaXo<ō gm{wdol)Y"OfSHS^P7<HHL6)/4zf6	|gБ|>LCR
u0C8`%{:a).X2x
Mrw~~Ck#Txw\;=<o[|Dq' V"`jB ?}B@b/p"zE:dwwCLߗutMAu	LmUΨ@:/<$
Ŕp3B["aɇlJzz5cn7vNnD{w%``BSA!Dp)	i0p˝g~gv4@Fճ?v5{s&9Gb{vZ^xM8#0DZb7$1[KN~%ިTbW4ZcsC5~ݝhbxP20tׄ/*2Iz}?h36xmL_ѯ{oV 5F

63N)x+}Qb#-v$Ί`mh\'C9McJ?_"t<[W_!Z 5MZ&cy04DCdRLgj(p@
XK0"gԷ:ݫt|Lɣ[kN\Z$.m]=u1uƟ؏Xٟ='|ʝF0Ois<z6dy,م#WwGr}l5Q xY:3a׌˛UJB8G`'\1|oc鏕d5j諐+3ɦ[f^>O]7\86yJ#	ѶG҇LgH	Lycdf>ίV!T%<T=,  b>֓FDDcvxD#u\oN&R@lU\[ADN1SA9);+][
]-F4?Cf{HmL d@+$~$|:*E(K75T:{
;
^xInEO1cS3ii[(	1)aX"R)S c>uop&=?q7nH.6Tt3$v,<D'sq&k< 'gg: %yrv0t_Gzf
z7\^9c\`V6ڛ}Ffc{O6u*uf6EuʭO
X+LǪxRɖЍDB|֩J9!>-u[#;pxZf#YPhB'=ld_DXgK?T(%P1:?(N1fH
FQi@ |L@mSD_ys3vנc13aaݻb(կ+6,.-Zha3 Zj
S	SZ6bnuLVCCz q>R YE5!Iǆ2p)Rq:"ؑT܋o ǠP-ø8Xĸ8< H/.CMDO]bz]3}xڝ}+Lp ̪*-.!WaFbѫ<ĮL.:?"S~Dm;,VDs9WWF|^Rڜt2EqKls{.UTb&^J   գ^I׋YĮjq#=RI,=&d_AE#l_~rz\rȐ3'm{xfYAS_vݍ<JvtJ}k+(^GA}ZPt-Y8`:E=l	?bF?/=gnE77ཽ@"QKN(QKl/to-u%%VŖbdO?O]\Evd!&<3U1ZCQDhs},>b6jlDl>Z,e&;P$sY:"<.7΢ !$z D\%;kz"iPi4\B2<em>xf Vt~ݨ\Xͯz9$X[MK>xXeqƉ >W~x0(7@D/fMá~/n`مIJЇW;݃ϓ㿮otoOk@S8Vr⃄MaRTh8\XVٳWh<49!*B@ܥR6r_<7դt'+&Xf)>W9'Zp_XiI!ͣW+GkAEғ% #EyvO ;QXByd'X6cYhrzdC1;,kr3KY*I9hMdzŠ!(0t2~8IB{qJ,OGo|,g/v{l}i
ߓdg06+[}(E|9.wL*Ub#JPUI2ip渲qmPޒٜ~kfȹ4|`ĵ]wCI'wõ5j:IVP^sMQ*'
]:-3#|`i߲]5o sr(2༮3_MӨV%hܖypt'ˇXHIz˄-FDTD'Fj5gXF ?ѹT*q?RCJһP$7 Eqo I?;½-}Mo+ P>'ů
fn}Q+෪t=k؟hHDޫ:ڃ	i&MYQ`\t6fU*H}-M*s5&A<^7afch)MQÍ("
^yWL#)#PW<(R_H;`7{OۿIAWM0JVfaj	T&a|PKhf)oL~R̊tH*IF$niT;D4'afؠaQެHS#Y)~՗l['E*n8K6dQ1`+22M͸",3O~?a?M'(^ P@;9&yPƊzgnUtʹPd.%t?}Ӛ;[H/j;Q۳
^g![Gwq'(ECj3]?XĠl?#)n㜸)0H]8> XJ"2dwb±IZX+"NTO5+t`^֟>{kO8`xDUlNCF0kU|ڢBYRo&[Dy}+# s#zX:f5Q1n63	:wq.-&1 Aig8H9<B_ǔ|U9UixYhi#L-Ws%|(㎂Q4Wƌx"`"iqsz`7)%XZ+Hw2?8Z#rΞH,v5?*-|u|\#+a=e\'i%]u&+QWX9B&-C
jo[7[[*~L7Z~uJ86]7V`zU+raq^<D3wS'hKX>yq=23';z b8d-n̩w/c^w㯏76أ5"	@WPrۺwl8N'w,w_g'fk~ǦnT?9k+bu]E%4WiCށ^<olG*
[IRAFM!W) Gq*бPѵ$k}fѲMc[;I)q!
+4GGE+0KK%ϊ:gݒTLڙN2BDʮ)bsDj<2ZR`bܤVb`;:eVtv(C*Ed9|.}T5~ՂI	Qijhl#`qsEPFӠ@d}D&L)|&k$}'8*FA
q_P,2N&"1XƽKKPlUa>$&B|Y觡%IȘ8E>ep_iIheB-wݙ?C)VS4ň 2-zB|/s㉮0"CS!V1Q`OTG'Wٔq6uRؔ=1/Cn4?Cރ3чNdy
䕣Q##dwy'&6bL%q&
Re
	; :^J)bXsNa7pCi$
i4է;eqe؈s9HC?|F;"
\ŭu7AF2P|4JC+,IC 0^za[!`X3X:lK0jֆ`?5W _,ߩ-o~2l#ty\k%߂.j_t۝W TsJ/hwD{7?dTP?	xoCWCG(;8O<Ec1EZ=JWe .G}z3ؚy꘠G)i6Y"+U}f]~dA"r#BR⹑$-xtU(ICs*I;F^Qk6Sxd9d;}HjfM:Xwi'̥OT~4M_l=jO&Z~ЗW4hVžJoPAP.+3rF"PO;[;{p<}rbWVMG9_jL2d0,@t_^
zIʿz}YPnIj)<v9T~_-'+õpn`]ޗ0r#L7B2)mu[u%C}M3yD
1SȚ*ReTYX7-]#ܰbwU¯n!6lI4j`^i$!A1:Fu̍psSޏ'?򓏾fzbz?!rix]f잽}p]oEiqO}f{!c@|}}ެIY'<_
@<@LhAȖxfnN^JtXO~FK*,v>4aQe:9ʉrS#F	yyQ׃ fNcfIqaF|8&&[F4v)xJ5ɭ&Z$  {mXMKLT

*ڠlj[Xh5w+6YW-9 vW#;\O ln]hH'J[Cy:8"øKR%c>ŬK{jڦ·jV˳Lp>ZS:Ԏps1.0+Ӝl3M฀T
lrj17#xa28C(Gp@A+`&ߌq)y 72Ms01RDQPCCh+2ؚS1=8JAGN1AZ^rrJ3+7Ntt'w!B@qh'-}p<(N><Wl~VudfpU	n Gthԋo͈"Тb{f#Ey<dt[
kfCFzxXk'pd</Qn_vmՂ\䦦øQS^qe+ˎ21/'$ Q` 	&u{p2N
iať|4C2펜>:51{{^3*?z<	Q)9a G\dSd4
xxyG%rJՐgtSF#c8л1Ɠ ]I=aAo[z.#63mĘq8;jD/*Iyo.ܨ@ILܼƊrY_}S\Up;2E: n`tqb4Kn*Ht(:;h;xk{nѻ;
@6
>ADZUvԸekI!//֮"[p(}<ipζ;)+%<E$/ѐJFs@JێɆ9GhAfX!B)l,Ҝ;SBaEXf9HK:)1	`PTkBkc&&	+Qg5TT	zpɥ*}&`{T6[@8s72k
Ӵc+jG-^irӺaI%#02lmWFWrg}7/WVXdjZ\V۳L괏	x>cpS*..ޮUƫbB$5EaPªDB~,QpzGMi)-M7	Z{7U3s~5Aȓ Cb%H,pbI8(@f X9ۂ7WwW_<QümV0SxܻT OfV'Cm_cр%FQ_0ۅO;?=Wݰ'?l{}?zRFȝpKcdK$Vp|sQcs  kiYpql&Ei?SqH|<v5ɭFQ/B3F8&B~MmԱш+[mm%Y)|лT "!Krj]VzkPz0=@0)&Q'WT>&I+mͮ8#wӶQ5B^V-.mu"L	BqmPM(̈aק>;Y04ƴZ,@oz^<\pA9_+HЪw&!닁jAyOVIi2|Z:tӼ^.lFdB-:6R?KxN/j_Kw0ʗڋN9.9PU$/9$V) +6@#.ͬs9i3fRt޳6kbv^M<Z*@KfJL&(zeg5JVkW?8NryrHq-!:w
ytK\r&Hh?o1<ac8FmbTJL'俀3;BcH>2;gђuYpF`SSS2?){vߚ?kKWaHwY[eTcG
:?M&oaiA>C3Phk-VhL.psNJXdsHXYt亣{|?OtaA1)xL?ۡ7f%S͡C4xڲ:N]C5gp>˜6qzW4ySzx~ճ[3 j"!f鐈j-͉$vC^?TZڪ[:W19be,\MFE΍4ka92c` KSHz`FcX{LuL;L	Џ$q>l$d% ? YGSSG?$+mْpM0/4䖠$%G,St诛Q:iw&j|d=uKw[?/
rT}Gk3P%C-ڍΨ6$G R"cAhmSϒZ`8|6Br56
_nOmWzߦJgӌ*;_P>;ims[b9o214g<Vgd6Jg"F?U~%rթX ,g4zcdq.}8
wڱ/8!@+ iҧA38`5*7`Yj: \/#[3,h2$??GӁYKKg({ф.RKS š0TˀZ+ 1~]eȩr69&,kF&RO;,[剦UUp̛_#lDԲ("jü$E_g38ņamOT4nx$5Pu+/Q%,l_$ǻGs@Y5 p`A< jwLPHKjTFJ	FA)lM~JkLz[gk(%
̰`Jͷʳh5L;"_vt:d@  )GT<!nKk:gIB( Qc Cr}7#ha +NoyԓEh0#FO6X[*T;Mk=[-̵5%z%!s ٹe6$:`ݡЊ&w%Dr+WfMDI"ƠNpqYWdK;(gēNNRatt&>S/سO!.hR)t^(gH/)#ߥ$rX[[-_=j;ePI1]P!+'M	`:uXsjfv,CsL64WHkXo=47;&<%E:w̆,\#KAu+H)v$Î_XqFf!R0D*	Ix,TH9M:,Rc	t2(.<PF5ѽk>F+%I2D
OJ̱DHМ>W:l_5܄5Dyڤ(8ğݮE&?`||m:@%e I>'=<<8xuyFö<0OS)z=Kj~ `p_t'7`=5?YCKa}Ai/ jlp>DA5yw^~iUd(hb5>8kZ8mYdѨ%kA5
Ě|upGLoGu4TzLEĈ@3T;<W lj@|{7r1ik؄$,"au*:-{9$x_&hD39]9:@ !|l>
(Nz]}#_](X=j1\	Y 	Dzn, l{6JQrpJ~}
#`7nQߟF|, DvKzTaQ̮!3	~ۃ%A6N'3e4z"oB^~|wu):Q`u/L7B)*OER臡PX\WFm8Ԭr(r?%#e&,nZ&ə Dl1sDvebTn@0]j
2jE2MOǘ~_6@7xb\`F@~J Ɔf.7Ge3]k>}ݍZ:jlr:D*mrmP-/7MHR_	1">ɶjLEVZow"ghGB0,x2fCл&O>"툰ybB,36"i
ġ`;@7.qZ_(gmo_hwV2&Z^%XYۆcdm5ihl8Ŕxꪐxt59ڰ8VP名qKڭ `0R훑cQB$\5vԂKE U''^%utyQ#
ŏfc,*Uo?)/UrqY+k!H.&2G؅$e |%:4yZ&חa)&VO5Ot #~Іoܥ7?o>JjۀCC8RRPZG^QguQ~{ݹ؜wH` %qhNj3 #׻̬[|Zƫ'>A!LsfpIܺ~ꌸP	g(_ )w8-:D4Ŷq;u_C'o[o>IC+{M˷˛>ĲhoQ_5o(;$mOuWlXk |_G(p	×tO0xBa
5X0$;24bUMē?{" .Wͮ-OXu
˗ؕZM%yk5:0IcJA!n7qY(/P~&8e/ xkI3tOn/U?<=ALY
_,ӵ6~oa`{BrQIxW{*nӘeЇ:uK8<{c)Ww2ŊO|AQ1K>s0a./z+m@1!xǄTG0,wte߽sQx SFYM.d4~J2iw&.mr_,?Mj"7)jj[?A߉iexE{zxGG]b
ĝkm)0{n?ぢj#؅ybʿᎁML4x ŹkB~xv	N7)=LjG3K֑XF9y>NfquO	``
؏8@kAh{ZJTq-&AtH`<Gk$X!$aFp ^F<(T +YD@]	o(C?[6+fKyꖦ$ܢQƳxS*3\c$\@8C;ۘb~OB69<\Օɤ&OSJa:9}lڪpul`c*zu| HibVώ*&4:0(c{ d M@zi⎯#v]wwp	;PtҬ5ɩ\`Q^B	JUcjB4H,^ ,ԼIu)r}.+l	ys@>At{Ֆ`5K#  IP|ta/EְpDDlJܰz#YF*#pDD9Fg[$Ihy__촏/F޸8&:)E|Fq~P1"@vUNePs]{&~Bj%6
bcFnqkìQ&EB)I
M6y-'w0k=++M	ɇGIyzwiEui'.r4
@dۧҐ
", 'xc25DL[1:.ȸcrfl4]I Th델?`8^i?)'jJvdժ"8oxuC`ېSRAj*[@$y`
4R&V2Q9j@`0Z vb3ƅXiCu*=xٱH44}z-![]}HaW%nb "!JY=ʴ+z+0,Ti
ͯ-lTM©7IZ͆~>YƴPfjr_AlK!@_]PRy{w1A|B-}ڃ4q4҉<QCZcgB`=ؔcg:J-tD%sU0,׶"*3'nfwYyFTGك;2ݟuXL"jmHj+:Fr_2&XreSɡ>xIPX	cuLݮrbgׯNc?o^DW71NWif#duzW[#q;k°ш>Pll:jCPT4`/~yD3]MW%d&hK2ޜFZ>-9ǋ;"G֘5mR`ABcu֦b'k_NpC)EZP$2?טNҳ>@HFI _ܻM]4 fW/X13prd!}p.Q9	gZcC)mLlC얤g#WO3V\'&fٗwDG>w*yCED%~bp'*/d=x0vk?yZTc=V𑌸Kj
ZVۼns:y	:\ ͋4?_8V9JP0ʠR~9Y4MvWm8y2gkmujCbO[4#	NA'Gz( #kO;/zB]X&z6BS9~EO5&!KrLZ9qm[љAFhK	|c+PfpyUfhST)b^lq 6~`4+#Z}v
5~ {|iK-ox9DO_iW@hWz1K5x^mNO0i>O^IB6i; Rq|\+؈vǨD<MP4ZޝCaƗ\-
ࢱ%- g1~!n>A9^7ݬ<R_;{W-IJ`v;I3ē}߰TYjreD_X̪F֥/?@t!@IEU(j,wPN6~lcmFfjPRׂ؂TA$N_(GY	foJpo=#kWxzAvkkEnVlsJ6@uAw+Ru.V,wvL珯cш$bt:uzr	f.W/XK}ں1 ЉeNDAfŰdGt,[.NN1s͆~-֢ݴHnhEDx`ݬ{vlV""yz
xNi-a>Mm5e E1qiY3k*ݡZ_xض$&X7YJ'KLs-vҫ.P4tQO嫮̨.J@Y=	odf2EOx(A Aߤw6=L$h6=DLj%@ȝPzd<2psjY8,(ԜyJ<Ԅ?9|uz.ʾ	|2o&yHWˣɧHr` H^2u! LK>#1u{<ģߊ<2w<]vM||E5QDd̈́N"@9
]%)`Vw|EX--7TJ=Fgdj6,-! k9aŜ«|QjunV%scxLRY24u5<cVeӘ$>+#߮lW QP_ 8*_5ؒ u6DhHCބ%@l3gNmFx~uĜ2sF&FlfokZq.绹|`X
>,3ByHJ8e[D.V	AV
`Z	$ D&@OkHHl+ڽ-֖$3HԤ4iiBE CS_DQIe4qʓeM%F ;dٲ2aIņ,Wv,d@k2m؉mZn?
plFb{3'7M@hz6BjE 8T$؟tbGApN @3T"a8Jj6VFl{JiUww6ɚe?s/__7b1K,[6l/gAE"r X MQj+)yY9(.a?ho}>81(Z9pi1>TlD3
A2-l*H Qdr6x<.<($L`'Я`O`R=DqQ6o(<r\4Ns>Ƶз~]4B5CGot˄XP|Q>vyLz;yjUxChI9~U%R0lh%` ͱ)^5:d)ބȺ?*QS-iE!<씏Si|),d	w0!dL!Bb\eW|^Z;%R9]BXWpU47}M?厜a2ʯ٢uK!<jWTL][@y8,36קzeR|}ws6RZjMD//hD(of[@:&ElN"iR/"Ї9zT5Bsrqo
7wJD5Iw24`xj1\<"pGd}}M+YX'Q4jd=
ROFVϭFLm3 j9 
ܦkK\zN\1
~xr=U`?)9<ҥ.Ȍϼ+`IJMK	2f}]@A.MD膂@5YyK 8t%^aP3m&320Ci(U:L{xzKm??^+c(W/ i+hz Q1M2rM2 U4;$ܵFf>i9Q
5x0
vÒ
گn
{hU6z_z%B57;M(ASb~:Z07MI^Opi]ΐɁ}H> .7`V`B2C/O1|*^8ˮ`DBT>(&̐ŶKac$nv,% 
7t&fh~d1Rb-(pJAEҨͦQql~,W٦ς0Sfz6EіUH
I@gUFs'Gb;棙7}g+|Q0@cѤ4YSek2&iFg#CQn/jL.v\Rz;YU,DN.7%9L.\j	V7;H/ o:L F&AnvR&;x:~tU ]a^C=Ta^#[XqV(zZ.?p֔{Q`!ww'iɸ6J=y?v(^ߔtWtARɆO(ƘmS~c!/cd#s6KvKr#ɈP|ӒP.oLb>H`NNϽLNrDHv3P^6T`LX#TahxKLKgXs_VvvwzaQ%>Y*vy彅h}]e}?Btn /(/gȦnixnI%!"pekSkNBɏ;;?o?~.ݔAwϺ	|1MkSj_(}T^_koӍYIr:^p܀o:Ifpkd'qv3ka ,7*Ǡ<1UC,xskLZeX/ݦi3~|kϗMff|Rܩm$$OյCo`åmz_x+A3"uSYp6-thgb|(MU2fy$Lϱ#[ N[GGAO,9q&->e{lZ$N`)Ś:hK拠gEp9@;W->ځO3ipQ`%zT:'nQ+'ue7	FWTqڹXGvʡ@{ᚪ"JmbO'3,$<\f8׈F!||V<zO~x1~$=uD{]u{~zZkp%Zb\gnK)ft0mfXE4߆FH/7ϲX$ԫoŶc$dJ3>
![&Cн?(R@&2	b5ىx|`՟ u0}Q#B{g$*^G70L)k 	n#(U%Zm&Ayb8흂W_Kg)(\W{k|w4C⦅/'Fs_~5]Wa!;=Ujv, >$("P'I`^<gxa!z]/RVGCq|:ѶɃ_?8̓վzaڸlO|U=>٨opS2e|Ė[R[fgGOA<c[E)/ì/w;ov_~TA!ơ*]8akP>Us>Q-ks&'oPyF0?TdF)Jаf,$X$Vs K|TJ$:-U:+w/l-bݚWJ|.ܒQ]نkKCc.Kx앇$?{Pa=d/w!8|m#aA`b&8zXZgjU$3w}<	tWUq_uQ 0<t9ņINU5ԁ*15.|Q[hZ 0ORNC{hתCZ7"zRSF(1-0Խh/'oCڡj	<"y=M	+)O>$CE_d_@)7dFX,8MĒYdL	l. XBT[VOnq?MJ!?'ۃ9aXCjןq/cW7mH
տ(Y	:VR!Lݬ^tt YHyV^Q.ból3Os^+5p%:-</4ħk@	7,]|u	<yt<~qyKJ9nQ;MAT uj7E:;n8'jZn0⣣yi/iz(ջ[SA	7Lpto:j"*gn4|ylGy ܨB{vR_X"aqҰ"v`/fJ40x0Yi]F>cbc-T]isizmܩlR."$4:cL]щ.1Ĳk&FZc1RKP7[<Nc#ȷDkpzIBK	-7kCJc7bw+S|%˲TkvxxiX{6-JE*i$,`&hl-zP+yCw|zK	N \5M]	oޤ{A{ӗU"bi>;*RcQ^]S	f墲$=BñB,
i`lŴC%#k9E-4!*jdbKP7d*{芉HM#( ZTU^A}8ihPZص3tnglOXy	qa9+>mv훍m?:V=}$`cz'&mG%fީ'bbtH	_yY;i1)²Vqi/I
߅b5J-LKEL06_a,(^QE1)0_#,LBUY}|(]-^# edj1G&	{e 1[tw1EsB@P!)TGԊG{/_ߟj9=Ėf TڽvyѰ_CvI_;bKDy8y8eϮFȄ6Z)'c;Grkk!2rT`,hI>฻BoSTa2Q^Z/Zz3ҿO/I9c,vWC Tp+v88]-/#?a_r
vq1μJ:*|WY21bG)"D-C4ިh,vjđ	rXAB	Vp7,]B;fҜg4Ȍ~M`Fl*B_\S%Atzqr<]RNtU@Fsւ}/\fp0Ehsv_2{Cz;@Vr mזLvX.J>SY8vb#(_ :b_kw"/\onTT?ZF*c7~70o~:'Ã7Go]h".U7BTq\ϊuQFգD&;vơޢNsՇo%WFXRqsqvJ?1 ؒ :eoȇ#i#	eU!XAJ:ӪiYu ~P&
Pexkڌ&VF"#3؝/4TxjD)H-Y6Vwk$؈~>S08h5փ齟W?xäcGO{'hx
',`X 1%	xH'uh-3?}&E=̍W7676zƿ4pVmZ^"r[ȃx`pG'ߌO96Iݛ胍f@819Wǿ~w7^_w$JLكryޅ	/?\,v]-mGPi^Ox|`Cr= q1|_Ay[_\S(In)FiL~ #	M*[jK.F,C>pd㋅PZ11b?[x!N^NAy$@us sq3ohxF[;܆g7#]-2jQ9Wn|u*wU5lr.WhFχT
@^O6ӹx(LfײE߃,(£|@uN_ eޫ~F8sÏ=P
EOk~$
ŽLK,7?9˒Y
{Cd:.L5Q<	EH铟!j>0,sdEZ!"F{n>aNs*ܐtpb:H?s;i3	k-M\u7A i7#n0N;|$J	gbg:z:"h$ݤEWunBXKgHM%6Qf~7	pXÙ}dk ٢.̯
5jH2dРxedhS[.gMgf'[ܗ!Fr4j2 #x05Wa
|8qd- >FB<Py@&C&[rFG
Pl#<!':XMȑP;'g{i>y E)(DMrM4!)HwOZn]uf+IwO쟁hѼgowUY>&X梾	>Kqu'A|hx$CBvVY"]c4H'Z ,bQrZgko@
rQ
p`pX~83y(71_]}lLmgˡ>%
-udm(!\ȍk ݄dBǾt2ėdh^9WKX(_Q
?kgOaKhX G D DT|}+R-A?疬v̞BXCU$,Ah !`L<`E}G-aᾘ-XU «ŐAop]uҾV.7Pu06O7nO6rjC֍1uJ9ŞxD
<?itK;a[U\sAYX)sWN;LR/C{]I(N+Pn#&Zu%wֹVB5!QF`\$zRr%Kёd]D< *{͓\]xps抷Bk/Y3Hǟvc"EWͥ4ҁ렀[1uWww	sl4q7د@xRD
 !>j%F676ۈ{=U,E`W`g\k"LYEfr4pkv봔Ɯ8	̒阥\Nw;F_xySh6~:%+ !VgH" AL8U ?k1<MϥMOuLPw+>VǒOd&Wg)S/j|^菙p(ưɶT
	(v䎺SPfI!-|γ8;=fpRyry/ىZ/H~D`
mDhe ~ 1>Z{xy6_:Kݱ*|͇&9$PW%ìDivi#-I4[5t{):g+bb9jVn٭IP"Jv
5KtAamQ!pacv_J?꽺ۛOolmһIMLIr@:dWfnx0@lDyZf> 9T@0g9H{Ne4dj\Z؍BB ٢~烅9BM\Uqc.u~XǓN e|P ~˃vh*_|<@-`rg!W̥uZ.SmIz4Fնcz f0"EZ6KXxV`mP,v&-]^F[c *ƉYE8hc# D{NѨ$9hP!YH[/ч ~2`*hnsa,&TĄh>a\If
/L2g[u)7yл̝st ^Ui&U7
x)yNI oUryQ^aS ,.i@6{HІ:!E51?8i;5xg:ܟѯѻ{f)E>/Ԫ<ֵ$oktQJfˮRs ]#uBqbk2r$LfӕG&Ty׿[[kPbiVD\N8{}4QF@cn7W>bdv+
hMOրpb:YG]˗4Wgp9?q+a}u:O(чy9^TZ#6H,⚗>$3ȦhZj\b/_A7qzDl@&s3}!\isSia$Ge&}o<DFXիm՜oluvr$Ҳ(^_VK׷0ȍϊ'hqd%tKT#`HekαG]C\dDqpgY/Sr9o:RYGb/ϋ_՗Z͝շAV\ HiHjsf}~x l0EC(7<ҼόGJvF
@xy['BV+[gI"wtNS"r0d߼ʵ/Ngz*Bj"R<9O]2r莆CK9HѻW'oO#7r6s9؏/%200QHT8H+	H_΂G^d2 g4V8REA:5oY'˳dy'9 idSI3'II}#oI@MW_9g\G9s
-:EbK.(=j(/mٚq A:)@}JmJCOݾ6M$W1OJ"p`ݦCgn A-L/}vRf]uD#8bD=#g5h<^K~A_5#T NH3GXX&uQ\sԍӍfTVtcRԜ(@U1X2˅R
咬)$hTV_/ޜB/ڨ^l"{ȔSUF?PyT	-v83= >0GwfҲs?,}FQ9<4|y%{8(2 Lǔʑ)|'i) Dac
*5:g*"%O6f\N7XA^v/4I׀f/Zge~_xymD_;X,y<_<0>z=ҀjBBpkע uQN'y|&W0'c3Ʋ2~1:` :_	#ѯfH-y}_U W?S҅f) pKJĎoXev#$mK&eHfaЬ	k:j؊9q\_#9<u aRjT"{%:8##?>؀mF^xxe$g5ug{:J%h CT;˗J}{.Vqg#aLD*j>6,@JT
A!_NQJ4NH5/ڛ{1+KA|L~V l;IR=wPrE.0jS<B'_Vei2$R٪aq;`/HFLzRmϡ[mBпVNx M>!73t9"qG̈́Yؽósʒ=(@]rFaढR'}돎TwGEOC	0Hv%Y;-0{XdTnvAJAž ju#%Z-h[͐u˸;<\պbwo6M#2t=f88zVlr[f_oXwކp<[uA&S/w)6)wtD>|oM{[Y-a`W3u%߉U\{Hi^G)m.kp Sw9]vfz.1=оfښ[t`܅{C}]=hpMΉ]|FusOkɱQ.3{X>!)e벩A7G_hHR&"pAI#7EE%$&%B+هȷRU tjjFѕaKj
lWWH|9xƌ0/N6/h:ז춌	Wa&2&41> [b(otZ6FoAj
rAOGxBȵڬdT|lnFL
;Q0Ūt  =\\h(D|PRyQ%-[}&`'[sgę=vXXQp*3U8	@mJl6}1@=e˰­)ocԑ{`hOPܛ?0aA7̺G'FϽžHĭ9QU(;A2/.f]6B7mBw㯹_nk|KڣeףRzKN*Wt	*y29I+y7aɭ9u֟KÇI|1#_?6F?*.,.Tk|H׃귮u6WmfT!y8zzWWl58&2pI_^R36ry><IfwxZnBst?S瞡o͍8ցVbڻ)`sZEZ&7R*(9jFoNY툊H~w9\CٗPGm(9HP(ࣼlxxL6ԢA-67Jޛ$}x	[	dunc{gpU+Ͻ!ae4]sIˇv^n=sr ;.}=ze ;;G:M] /OÁ	4NlK3 .`v)<pXiXnqƲritYqf)ޔAmlixu؏?jR  40OT$-u}E\Le7O](IA^#-yjg]~欅VD$yG{~OkRdc `Wm)3Je8{
\TP1
ADh(Eh⌎` }vcz;`D=GBO&U9quǆjp9>&+E)prM'8Ϯ0)z]0tKY0?Ksp^Nn,@۲E5?mI8s/*" n1O$.HrSK[GA
.[+Y!MW:~wLT,PNXֻt'Ј18/Dʹ5_\<cQTB2u:3zm<jRWj*Ǝ;8r}0($OM6O6%#?j#a$S	oR^+i/7"pH ^V/mWU-82|KE:~=oi@g%"2'3@(e`?g3DL䕙23x-1YK~99b^B'5k~f UV2r:ڕh,ď	Q/:n<ʨO2OR wmP_%qXԐ{LTv=EHF՛d.7be:8[-%0
zC[Oթ2Ӑm&Z[5){><,d^
T}CyQUF((.WFTp<Dt<t	ZT}Z9)dkޫ ̾PB7~@2-;r_XZB&ںp,Cu8L\7=̳Efϫ{1:r>]I05^JlRlo<}d.rIfa}	UnPT莚^"m7CVӟTf#}%4$UJEtA)-נle.vO@`l>0M!;64-d#ra>3%(W2МgpVU3=/[߇	t)g''Ϛ$qWْ=<ֈ)YElYeD$S.-=#c`tB)苆C0i?x1HXѿU/.R)v }lmf
,`__AlG٭nޑPU.L "9Y1.&Xo՘G>j%k#	\7pmsM>	͡kYʢ /AK^l	D7CL"@p +A90oĄE=b/?yY7٬]_T '
.8}U{!9pc4*?C
,Nkm
B?RhdӲb5q`'CSsR@nbNTZR~7ʹ{-('&r4[I?ch!inUب{GZ&=W`ySE,J3A~
uj̫5Gs{o6c:($MUg` !q!o+';d>(9=~wj	w<{+WȮ׫r۬Aq5t_@,"d-oD5XMC^})PMW.~*	 0?x5JG<o(fjkPIC1W{`஦,Ci2v2[g˫so!֭H\,:p9=j{C5J.Qa(8 !GM/Qx`<  -|O.멑-;zMnpq	>]Bt%s )tv˖gB9Bf͋#3#h8;<荊QN6sjЯ*O*~{..Z
f[`M'50|R}rXhŏ;oםVY0yFU;,S9eJ7NcƃStRl.|!%y1y|9Ht*R,Ik:̋1ssG`>(5 ,#3^OY?qc7g~v3t1/Š	h*CC&߷f_%7΀rH$1HWt`t/Srtd)
l^Wi5~p2>Ъ0T#]mCӣOg)Z`xJp%D.Ι:ޔLcPlHZl?87tNnMߕٯsQg+㛦'iXhSHe#~l|W鵹-༬ӵ/~Sz	µb]N~-=~HCL|Q{JS
#ދgG[0b+O9_K!Lp1W3àab' ,>- m<Dƒyh=[&g2&xu5_fkg
X|Fzz|Z!+#9u]@ =Ag-RSJnᵒVLsRa#){`ىe\guRx	22xc-xaf#߃$%m/gKш^{JLG|gppgY#8SA̐ڣў%^eںlu[Vֺj*xq	XԠJVRÙmNS%G>JkN[['0(T	bSלkTlr^Doޔ"k;QJŽrtɱZk1=gމFu K2D'!S6?><ȨЎk`YS7dc%|3Fw'΀Oﳓ#%`)Wzt]YK98;7q7!_G=e`F8CEcjۇtdK\2AΝTJLԈnFSf 9:S+]HQHEȐ{t o017-8+p2umnfZ!9voFyt@g*!$qJ J~j/h65g\!,A	Ə8vbO0q</$
Rp	k=*kH:F9#~DcJ7667nCʤOoo{C;^Bm8UXZq#*Ck9Ip`陥<IaB(O(ʁVK_}*.LIb 6ApdXwaMe`.őDΓ'}9:naMEpSխ[5B79"^	21١#&JD=g#|p#y$0V?5 bj)2!g:UP-]$mHÀh7
^_ERQqIEayͽ\P`ڟ#Mw@%M1û:;Bٯ@\0N[m^%v!m*7GlJyI>W%Ps-6[ HU##3|Vl9k&IɱevBa4E_4;W7Іb-L_aeF{~c#ލw@	?@Qh9R.@C,h[ނ6ttcN@}~p|GJAWe-;`>
f;gOal?yRqa>z!ah,mg8Id{pkk3dMxU$Zd_y43	wY1ҭI*<8ŝO[bzȾ$"8. jI<cRuiA>|#%ˏx^|_nZ$+%Vw	Rr:$rЍu)c(ҦZ5MLHa͞$C(S"BS(CD oqn:53xq=ߟ%޷kI'5fi4B?fT7yENRL3N] -f&0Fky*5u$ƈSHtpmncp65q9[oh!%,"D!xyF2%rI:"qNZ`1Z`wgXGI2Iz"Nf4f~c
έ,2#BQ$m*jo:QuB<Ϣ-jx}TFe3c2̡W<5Ԍ35A
fdegQ22X{@{|x2lX_Pm0ͪ_Tˢ{|~ hx@_%*h*8}Yv
T}UL n[Y.R(0,6p7jUGB\܉M]4ц!fu'5] }[m;oًAՕ``˯D~/D$bfνOǞm6t8\hh8I
:S]/$xI ;mB dQ:j2cm:I$ MLHE^pбڤ㉍ghy@oYQiȣu_mUmh[?~x-ջI>yb $Xhiy"gv?61҉)0=	bl(Krc-{yodc%15=BE#-Gc%߱<I xoGWF88щQ؀CK,bσurpb=zc3qP#91kUPg>ޱ-
T)'-7ANB h17~grh/3jbGg%U0cǎYvN&/ N;<K~:ivYuqyՖWNB+tTy=9A/8	x/{&lj6"¶uc-଼u4`eF6*x8r\s:9>Q&7,hHl>jD.H[0Blz	G9*C,HrcRqWL:Rcţ6BC̩N^\km$mVFXJP쾳(jGȯu<:y4SdOtސx
kCu@aE(غwq3b_8ꎹ4yM Oڅq:5{<~kXyt݋Z!>#(Kw֓Z2aQ||SbBS}u&qJqr j$f-]@,`-,ZB*_Qs=WTtzj&H
'żXԉݤr(1]7j9ۗHο<eCC, e#m$d.lQPqhF7}_[0VмlBp?uAij>eiMp0<ՙ@qBG(vE"֫C*Ex	IN"+	XE;:J!$@Mw7,iՅF#mz[){I(ӁG,!l.g:yxwa4bz^t}'jxJձTYѐN8M 	Bm<}'sS4t;e< 3c2OBaoWy`"aWf3YT>d,YQh'1fbb͉aj!Au)u=>NlE{,ǂi%i:*aNg`BqUA5?dВXw𝡿WӾU䫗L"T3/𪊥$	rֽi	rE^ݔ6zzO*sW+kj3\bɕ0Xi޼QnBPv;C¿B	Xr|nJ?TfIMRFr20ֹbSK! GF
 *1!Mp j!Yy0f۰:j([`gB	]l*ĳdb<]4f~W# :0ƌWnX;)e5EJJh7yD]pH֢3Qs`|˿*̮ʍtmӻoi>Y6dx,d!t	4y 3GޓPXr8w3ּUo8l&JМEWdfĜKk4i&!OMOU^J:7b05@q͋q(5$T/?Im@ѥ0	ePFCd 2oɚ~沿tVh
zkaR@J+4$W/Q!c:,&ˠ?}@vd27ߺ^&mOI{^ǷFBK̙b/	qp3p2*o!Y1W؛|*A>Bt6|'#%-i=MoAcp	(rGU8A0(=i`
J?ϖ)	n=LWhd[E} ^UTW;(Wܣ<k:أGn;,gMY~Yck^7#?YXP[b;m 1\4f.cq2<9@q>Κc+&93\ڗ1,ZG-?PAjdmmu^ћtTguhjwI#5ms{W%ʒ۲OGҘ|ZrIQ%Μ5wNWfRZ"G#'/BJeZGS#7ûilu ۭkeWӑcsW6}O}1zL9fΫ˾ :,2Ѧ9S_$ɻA&ߊ-8>`'K`Y,n`ګ`+8@,?Sepu\ZGmMr-_g]U+g!s(`d\@gW, h@'-]Z ;#n{Ay(&L_Ǆ5cIlTrˢ^2~)e7;|⁖FީZ6:~z%2FV";D[)nplr7I|\pl#{L#p:h]r\Ǩ	POKKcBM@p~vyٮ}Izq^m "ۀ0T/75 W3Kf`>2Wno/-EB/;@}yEdʥR/s>;{廳s-7uY32ʡ=$2W)wU5qنͮaiӘh:)ywxWWc(;~~R@T0b9k}!puc7$!?0'7"r!^2I9u1@h$w%8=;Խ?oaFXbV=vg.xdi~8d	A`쟝I>0|H<@)͋Y3CvBc4Rp\)M 2 ftXV&5cw3_&.(Pc=[IƚUiӆ5c3
wxdmC dcZXʙpRX~ipf!T-t2e &)ߥ4n1Ml4MU|Wz{ևF@V{Qϩ+kĪ(JHm8$2ꠌpT; QrE?< 4T|8ƪDU5#X3Jv@v:p}X:հ)nXCm/X;*ee]PEwk`G\UM1wol~2e3)19PFR oa !\W9 "E1W;/J
yi"Tst]^b`(|3,>H2YuAh^G	;7%8|@r>RWݶ.S 585%YJg|B}pntIEx'{t:or=ÎB\%|,'Ok_r.DPKN9za>^9ET3G[Ն,[ueStP9!a
x$.LJۜI,ЉJ+=R`_c:dԡFowʠyIw:}5ۣqkI7ϤIצShV%nPzѡ?(N3Ȏn#HM"Mh疡9?)4WAZWˀ(4rqJp);퐭t8z~wuzFx*K\	ϴJN#*!A9Atk. >=@aJ{	oF~[31[s`Kjd_Ow.߾?:?Q9j6
CWH1v>tǣƺ)-5ʃ.Bc+%CT",'ǯe@,Y6w~\l=[׳*_ଇ;v\cpkh_#.Vn"Kَ0`Dܥ;|%dw+T)]{vGhc)	gC:^t :knҬ.AB_q>\C]:tCʪ<H 䣒<\K@YZ3)p\djK!v'gͷ_s	de.k}j9-9Ӽ`.8)1-$˹EEhyLOyQo`Sp_-()r=q⁮y/2-l1Nj,ܭEvSk袪g\(CbN{gcfJN;i_:&Y=:	L-K'b0hX~G%G~,n^uDgK5Vf
(HN->6h3V;Wh݂O">Z:wau Tq-[HѓHFFf_ۡ'[-]t+*UU_@DL)hm}_)'yL&wX|Y>yqb5ͻQr"?45Jd83{=d):5oZ߽TCl CYjf3BF?z51DG'24Cu9ꗟO9 !l.zȬ6)SuAN?-lQTڰ'WJZ9d8Tj$eHǥaoڳɹr8(TsdH_Wθkι%']6.ʇ|MMܳ-I2c[n3 +M>|Cqu5GIbM+q2A.˰9J] zpb4x)Vݺ1*Zp:UTIx=4ځS%G>#9f$Mxt&3zܭ`8$XwkuCIgY]Z7߽udwӹ|y:Hkl#ދ?b*{?3?C&ecdmwfR̃lҒnUYV"-BV
>:تj^\>Q}r^r1,v04q4<U,lի>U@E~Iéڽz:6!HTcZC=4M 34b0K̊D)󳡂9KttIn+)0ջ,ceQdZ~)t. lTjtwX(%;d7JvVlt ^\m6`CPo{k!U&J^)h%yi G# iPnxc4?kmXޖxu`;@q+.f2m%e1&.obbUq\԰0;
7?Oޝl%t$eD4+2,s>6qh{1c3g7Yݶ(!|dY?y(Ƚ◝uό:H$߅1ԃK.Tm&[vRzY3z^N-M8ܶhc%ޛ^BL@މ@<e!A a%ٸɵnxWQ4Pd*W~x`O9ZnQ[d3cyl5l+^]=SNZq[Oc?MLr-eoNs@3LnSAis{GP*%%h>0)U>Pܢ7+8*4UvSTbso!&"fpJȅ 
-LSႋ4qagسqdOt9 #;BarY>Moa&GPqd K-qviǶKg \AUPtn鱹<)CDB:em\yPQ`	U{ J
~.̆}l6WZg`?əЩ  ֻT=LeY,7qN,h~eb:_UrΗ'ןhY?⾤`&g@g:e:H*I8:RXOw@n׌MɞeOSbB/6'Hx=,ĈRmW&a+\gMysHD
nFdׇo.tDR23Fl:>ɴ_(G|vQ^w GᮗTſݗi[IFs0!^2r?4
"&wDiprxs1֌ۊ,uhsoBryYNwib^vc sH'A& (>Q@[X/<,s쑤J5L,9EVEaWW8o?6e>,Q'һI
-4VڛŨh+XК<0HITC2Ixp{Oxl*Y#gĢaX
ҷ^PI@2y|; |ܧ?JUrU:akkGODrkryt3Sb<}q繅|/V7;DvqDښ;0]gmtjɋeUQErpNc#RNI~ڙ+-uIKԟ	4?-E>ʾbcס;en&{>mлtO3N=t(ϓ_v;k/Fnkĕt:vD*2jK) f4DJcŝbf^TG^E?4crl;1DW&ͩ|^weҘsMP4J?DC(PQl;Aqk0{ 7Z	ܖ|fw1@{3Ո?$7Ȍ^dKxh(7[nV`64\C FigLEzՋ{atʨlz٤Q=M"n2ܯ?UA!FWT 1=:=|ZkN/pǤklvV^N&a"̑p_n%ސ)
}OԎOI#4Z'بj3_.;h}Y7;=DhӤ%OsQ	)50x^vgVW#DKfWЕE~R
||)idFKIW%|S4cٻ'oNwߺ&;&~`wVo|.m1qƗ~`$e9)ճ7E'5ڶ
oC=HTl
1Kx׶A[pn-ZZ:vzݗǧIv(fb՜	$ 	{NiQUCrL-LG=X]!g#H-\vw+S'4ғvBABs\ZX
}\O?znK'ޣӬ z3cp_65 j)̦nv^qo8F<d@>瘏q,l8`	wBCUɀY3,%ݫ$*WrDxM3k>JCv0^01_Z2JYAbDZr>h؇n	=׼ϗָ`0|ߦ'ږ4LQs&Vo諚u<)7\ϢBSsM05:ṬHGrS>S>xlWB
bG^)[ju4j㣭hH
54s 헼:5~k׈syV}cT=n,y1jkĠeA1钑<W:if"&g[lxh,ӑˠDJn5 MO&2 R׋߇׬@vXz5kUA?3Svuwakyyx2X!vY_!-|ҌG7GkwZwҚ\.[ŗ6%.ýwytdCz,ʖHms} eAu;{#JՁaKaQR5Vz$Gf83yaaBF{Ȑ۱ylm$ld&nHYu]3Q5Yp[5ڨV5CEePFQW[F2YaL/޸%T6"KFm%!t\M^9@=sxG{;P"tޝvqfSY8yb'g^b\^0~	In=vZ.FGXLś3a`@+A~?UѼj\݁gVhV}rC7	B}K&H/ʥ$hL;eF[{t5MP57Ƀ	ccaWƲdTv>$7,'T>i'C$sV*jw|>L#H ZwyPR~.2Pj{.(1=Q0S>3׉f  #4dx4diZY	"/D脈6(h E|LڤuфOѺpŢE30ׁ%uVW Ĩ*85!}=5 lۅ헎eg62ìQ!H}[%	(5N$7>`"3hf+z˪_e:CB\PL4 k#$gm"Wr `gGaPYl2J]"f@ADd2Wt8>;~nIj`s?81_t-z%HDYE^*0_d' UJRM}}zuO+4}3=K2muUI4`%Wf/\USQ{^N'C'*M߿u<1	ʷPJN;KJG/CU{JwVXdFCKS>xq)[e#q3$I3VДL͌%/Xv"Vk[(fjOW](nv}^s
&Z( hlU|p{!.Li|2$c`@>I	,ƚ?jCB(v]?(1yӬz6_fa%mƾ#^폺A7-߷@ߴ4߰(ՒôcbEv;z=*~Py)G7uҌ`#A_i*F	~A0n5YثΎg+>pz)l}YP1#7##ixe!%mUJդ_b'|fXE2C
+'kd|F(X;b(3u%@( u"o%{p`Ki{DkS9?&oe'mȕބDS.xFIg{\z>lBRƲ"n~k[BHO,][jQ!QE	v?Ԁb,%{q6HӸ`"I$S[dhjaM.kev*xP}#ee7Δ,x? \4~ІC+f0h{D-kdd~f0a{;$P:G=x'2G<Es1m33IbnT_2UdNlwJ+|pX	:,86YDW6F@=>ޙ+F&	"v˚:@W.rm@:ӓ3a֬zqpYĿa'JѹaJu<W?.iB2t>Ϳ3a2JבQ3,&Z[ω 0:BJW,d[6EC6x{.(;ICZ%j18zsL =HAɹll|n|7Ep,vMi	Q7ϗVn[_(E:Fn@s7[|E5O$2G0.|$zpKXk&X[~$wLqy)x)rTqDxu"/?}
$ܾ-ayOv#0quj||!H\gW]cu|YUcؙ딓q~uqHY];]ZHb9HYL43H"vymlg0v5UeV;8m4M6!kGelN\@>>9Ikx,<hpQ)"#^H=Dz?Ȕ[U%A{lss)hQ&LZV12bJ6
B!K@E5IvίTň$pq6ޥS7+}9F`.A[Ѱ)\I.h^ϦMo	&]1^W9>,lbrΐ S-iVN:]&IDJT:?wWp'd}3e-Ap.mϾUDjosll">!Bʴ%6~E%c,hlOp?|䉰Y΀{&S۹.w80j3?"W'?<G8Az8(R&14*#_\J*rafFpLHR+&4tA-4XdA)~]B(N?yd./fC?L59d X6}^muBh}ҙ"˱#Kq aeE7TQc⭤-6zZk0TE?}6UJ4jPg:B̀wr.5w<ʜ %{K?SPr~g:< ;<)z7s*ÆѠP%3UIfr5%<DCN~iu;-Hvم3NXhN!@Z0TUwx?]GWsR}{~mڢG4*'?hMplNk$(-^,8=ĽMi
._4-1/)FQP"?zdR?,p#dXJ0zopºAm|i?(X>dB/cP
P#oudx8@>l(dv)(VH3e(trQRSQ̣-4L9{Ҭ	ʅ 驿B$6<!0_a!\ ׸`*_zi9Tdj:k16M:w 1?ie~6ǂMD;s8a~zǹ>OwnSvS[[PnNW#@,ރv9's7)66ccc
ZWi{<Ձvs]؋{XA]J	RDz0`R)Gvu8vSؼ4ĲuWFppi!vm<Iչ?-ɇS`ɧ)GM
W*AwtdpfGPvWe2r 43Zϥ9J;&ytdɚv D잖:b9{?gsg=5? 'ɺzm~־eO3a5{	/4SRI.`RO%tЙTF\-T+;@PDw8!ڶX1i⁂]bMl>u<s&Ŏ$#I`h'phgl9!|3DHE*5zCxIHtC<)$Y1kK2yA Oo@艇+΁p^へ'(a==s6c0:nRޗ30;]ۛݩ®;R]EVF[ڻg# H;/yCTBWKbWD|K`7y=5#==)^f` 1BMZ>svP\9;=;>@ҝ_ON+C$jtLhtdK߫7J9
!pq$Yꣁk;M_z^WߟLaA]a(F=EϚEѠ-rrC+\Zq@/-|as+y\y.Ur: ۆӂ# xm-{m:)MSitߙ~䩍Pa_5?87Ϲ+iXUXY(Йś^PW>c<ռmÝ^ 4IoK Jߴ@
&XkZ|2Ёna[uJ%9 n<aSy.
#t}o4N4XH@nʀ
A!UqA@րp_(<fSZ;!nA~ިP6`(xs~EJװGlM o L+;$Q/U3ϗ>[-Zݑ[PJ|)EŹ*5^2gWf.GnQӊ/|ꂢ'8L!`dJ85~ѡ
km+3 !Th4V-2qd(iDS%6h%@6-{!sy2(L)uï.чj;SaH. Ye<Vu&U/W.X+5k×B+N\i hqT8BX>^rwzyoF=g{v_t6Hu8zlR'iۇm߭h"</pMmow~~yp0mF_(!=	h5paJ!@UcPf*7sN@ؘaړY)iߐ%s"97Ŝ)Dw1!5p& X>) l
!-Ȓ# 0ѽɣ`9;Bu.95|b5X-pVYP6U<j{c KR$==?^{ǇgDfp1@H.k2@"0PU<nZ54%6CD̎U%"i?ҲX
94ai*rgmdE'3lLkVlXȈ{ФE&H r9Ym2 *)dϊBm<&Lw#!bbp=h5pNhbKC\/7Uߨ'J-LYiPkspץdEnGm^ ;m6?ވMnmp_T<]F3̉x_vk3aC6^:fyyw6^'}z~zq~H:<b8(SZ!VgztKn>(k14oP̰PϡM[i'h<bʶ=iCP)jҍ޷j˳GUvʂ&"^X6&.GR-bZ5/3\2w $,U.caa䙦bV";դ+}bWRh[]xVD a<zV3$CTTd+ط[6m W3K>ڨز7&tetлs&#+#MzgtRAvn	Ռ͛-R$FBN]
-AZD}L_~3J.~@e!8NHd9) 6&<#p]@#̋K(*߳rڝs?C9 6YХ[6͏	ߩD7t@Wxo*$s\ҍN?+\h)|)oY?K:Vx9v3L@Au.X
>:wȌ9U,L[o+kGuWbZ%՞qwG
b
{#-Cr8֊ZN1'uZm}(QCDXUs#-4(/K	vT(Oj`p/	,[ȢV<p$L*AXj0ӖXqH3C*îUu7vR<	·EN<{h٠q<b4̦aU15:x(lviE MVԶUEH@WCY{"/InP(V=Szr(#NZd|8:vp] pFr#OulG-pl&"u`WiuvlH5}s>@/Vl3@AB6dq pTmv1չ`aYw$]!Y0n}{g/*yQy_oV^o[[k2u3ϋTneZCb
={v_Ge^>:y!K|`|u6A,Dk.;3- 
T~x2Ch pm^ '(KZDK2P2ߞய eQ*]>u~[1?q{O~[Vo~}a<33ɝ{V^/F뚿]M|ѹbb%:/G^x2_s̤ǘ+s<M? got0 _Ku	jb,\ıe)&J6@wOCe'#:w$wTRD4!L`lzq'''ͮ|lupzci6k<j	?Qeu:}"lZ:~NcNoJkulz^}6:l	] Y6;2B
ǣMkfi,bPl29ۢ#\uTxXBTOKM]*qFiuʯA+\cTI/#>tղ_T໾>/H5,?GwGFX'f7< M7~UvfǗmE?-x<pn6^lT-Jנmڗi~lV\
,G.ɩzM,Y]\E1;#3j*Vq|*$3η5Ok:[wkix2$<ZgHF%ȫd5퀐vգ̉?i*m5X3֌:o:\f!|!eU<7r~]YobulMBirCNcXנOh.mkp(	]3VDņū3pAe!\H6KF88r TQ?$ldt=VRw؟PSã􊪜+lA/k'1P6/Bg :8z# <?`e4*&(QH8I_}9~
[I@S|l^=lN,k,jt~5ƥw9rU}`#?C㣻~~xP(IEGƩ?ϗN~PxF7Aof&hͬG
/g3ma7=zLl#On;굴jFg继wQ\§Z6~ypNo(/L
x{*}}7~:x}At4(|:ޮ*L~'-7?i=ꦎhX{+(n֛qmTڵ̥03.3C"dwr#5@3`:ٻ`t]	ws2`+eqjlL5N"wVTg^
|kE?.҃їl0w1 t|\N C70L;u0Yѝ٪Ge/0W|b]@5F˷[Y3?Ȝx!^ZQs8/@a~{:w[]Nb!0gٿ@47A]1R =K}	JPheR$KUvZߕW3 #"ū2vϷоih1]]ӣ0[4Ot9bjhpW,8JzkYх,减fec@O}U>\݈VId m/86߭U>,g>q0~Î 4QyBWaG_ޭ^<Y Y OiA ͮ\{oD _FOiyu4/T.Oo@/vzW|_uNi~PGT
R2斸T{^j=,7ָ4ϛ=?ƙnIz	o5{bgߍ`侊AsJ^;D??8#@~.()e?Ā
ZE!\9XmcңB|令??|o.[7[0{]OONߜ*R綁*n9/bĎ6TI7ŕ4hPes߭E)
=Y %YK_]% SE.m{7)eAGf ^=iIYN FlgŞ$L;,-̮4X<vI4N2tc>Gy#?/=,V.oT=7Wo-J5ϲtAù3pL+k{Gz$K֥-7O.v~o:H
St|9|NGA`˭va$t3-$8bYbhIv&H2drr4Z G\. )/pqy( WKI-1<z!,D@D/
{fr9-W?)Dn\i꜃'GtL6\w[r_FIe78=FؓWc:O}.yJ|F3Ҕ`]i,$g#f5-*G5=aA(xO`r*3W7:#U< {e9S1A;.xC@(MAb-{XWGXnSZ,Oé3QЎYhސҎ	"\19)׫H!X
lwȩ,$C~2U}_Y	}izK}:J;ifYQت(fX&b-~2૳;L	MN*K*8JLe5s*0Ko׍FWnsQyud i2OHE2˂!GK("AR6@$	byv[:jת?wz?>톈co^j{L7'k&ߕ^,̌eV[.=LZ_e!׿E;dC
h,_!͈üݡ6eQfkЧ3O(3],YߝpW~UĊ;|+ѥ-%+߂?eѵeS/%nI
Ǹ%SHj:T}?4ME/iaC-'9BUk<$p AOFw
G>qy |FtȪmdAA?i vL4Yd.'w9fSED	y>Ȩ$CLPGFj%KT{t'D	B&Fgp|¸T*q"m2-t0fb.)i.(f>Djm	g84ozCF/xD'z"B:Wh	Wϯ1X]=jJWgI8o.`(OSKY]J8^_BG7;j-atp\ob6ctm%DKn&C^kD>p BsB"(clj<wCTB|7TDpvT4+vlj
%/g:@A%hFt*xcXhιy`\x %ỲARYHR¿h^"?MA9^1mn4-@TԻMkwEW ˘|sp!$L#pwm5u%Jg念>h=V[׈,F@~ٖMKDǐXO9q]53`v ӻVryZk+zIWKyC>\N܄솹TeLXVj<Y{"=Zir@	l&:%B_ߔAPǁ.+2VI{ptz4
TB
P*Wଜr?pYvQ-pn.\{jnܽ:G,yM]cgQшNOQP_s.̸e}-+΁ٳG8:>߮`UJӫ.9xCt}XZ @2G,!}i!N{EÍbnIsu'^r\9)xm eýpaݽhZ2^mPdLH2:V(1z52T^i6 Rr$1*SPޟ,|Atao >\iBAmwKH?#OnCKm9#_vwj騐*X+1'*M̳ #coSEhP;>f9E;B&,k#>2~R\ۧ& 3dR$%kJ51gS}fZʉ?gٕ1YI^
npi:{33RBd,e%hyd򓮪|pg R黈7ŷ^cɍaK,ix7VFI#4TiXͣQVo[o'3|~cHRed6Kj[s0␩=%*eLa%ś,"2qqgl3d[wϑ&UFduN$̩ p6']O#@f
ژa~~*۠ņUDa9@p+o MaE9FpY9i\%k|UfI 1arE9Ѵan5 ^qgWJJ'Kl¾XmEyaT-4ЂΤkd!'(kN8~\Fx"va6S -[^KydȲV>@W$Ƿ&~m1o})GjC1Hn@'pX?W[c(а/
h(.S>MجV+]x%]
fW!kH:50D}Ԉj.,IW5(wW@1,-ۃQ.I62UGc[ÒˊrETvo`W6y_15}v;}7f&	HaY4{.&!GObnEYJi3-!԰S~4þ)
V)#޴Isp-`N>m0\礋H |Av@BRg*<j7W$i%%xK)	U.lLAJ,Yv{C{ّ
7L7[qpm}PM^OOO$&XrpvADu*\Y3lrnQxdri	 Kl~dW+yw2DmVV'.GλB&8L`ԕ%Vҭ)1yhh7'goH[;͆ޝ_)V
jspW%{+`DD,&Lū9K89ʔ+ʸ;[P#Nbӳ:m8bN-JOHablt/y]ewES+<|{SZVq(PZ+Ǣ*OÅgآB֛(̶aA鷘qO@%|ӲGo߂R/鯶\dӻW$f	 Gh뺪h#]
o2VY0X·A1p2Ucds_ANM`Z9)N?ưB%,s:XWt07C{5*Kh/9G^#+ȟD )iUN8-#Aa'T]gEl"4:6N𾟆!pF+!A;BccƬOm"$OT`$K)t륐G,JO*&XgTڳ,5", 0~dRJeҒ@8eE&5nYYju)_0>7PuEx9]{(\y"&F#{8	.sÙIone]:{8FIS8S^AY	-P[4|J3|i6黣,CnGqՄ$|w[)W 88QQWb|'L(SXZd  ~E۴HrvPOF;5,{_C\Kv6YF 4 h\RI8?!bJEI&6˱)5kzXYy&2+	ԏV\(уmA4:ºd'!fCʳJ8D~J
R+Z!aU"Kr'
@	F&O0M)CS92HBq3` '+Lpu&nڝp^Έ ew'Csiഽ0yZU ;9i<\3r\Cl2n`M**9.YaGS1+UDmFd<ֺXx9_+8Yp6&g8N'Яm;s-`$`Da5A΢]\y3}Dr9J)WA&u^]o]ʁi^>F5 bjݝH~O+\|Lx>*!~BŷWg_ö쬎<a;Y{P>jbwt-ZhN&NTujw{f6q&],_}/ǋRSXf	,޸:UMȭt]9er<Fۜ<ƃ+_ hu^RGCf%+?{h;ŽjT$0ne	Hvo%4͌Ed}DdDt)!6B
]Ҍ&G/} ^w6tj;9-Yoճ'<\m|>	0|M[;R!#Xs7,ņnT';$J9ɎzvpwgƐ_>pzon\@pǝfZb:
5mM J6pOO܇贎" )@˰,/%CwH##d('i|Ⲅ5cL
0QʵDvdc)·WWB"9T-6ΩKf:d3+]{\^]#\NMnsľr,aYx-0@߲9 }H\>_ӄM!?l#*)g\UAm*&>ˬBLomtQ_6S``t<i\Aƒ4i%e|2Y"u0!zQ	%%*EV5:-IX?8x|l}{ըAu#j_>yoo`|~*~8=~wj+0Uznk 0XOOV;TL	At?HяA!õjHC4Ib,乎3b &F a<D/ЗqhqRŚ[oK'79)dZW-TCnI{dER)0'c&Lw6k3Gݧy\NAR|N&J0j9;Z1!klbtTOd$f]~Ypaݛ%<ڈ cm^n<~̯3)^dO^\1 S,t]n?+"[b zu6mbauiQbjmoTDx7^Sc[t+8/1/9%h,t{6!Ƈ$kF3ewiwR0b׎Eb< hLs/وgeyz9hLwǔFGPlZ_a@{3ş|yWuXL^(BQry)CPv^3BA1'b?AJ9;rU$ޔPbl$½
E\ !o8CG:*܅'>ZPXj! H(4LfyHE)T.ug65bC9w-@Qt0;ʉ=Wu'@F`\7&Zfm$N;' 0/ZTj<f\]yJY9b{;#gh4프ñtqw	g	-h.d=
2yPJ4PPHNG{eW^#̘cE2yfED$jo>Dc?97A<zD KWQ.BXٚs3ʸixo!o`^q@ZTkRr#.G )pܘ/AjQ&GG;5Wt5+%Vdnr6n"JcH8~ @2QH	k<Wǿm7d_Gݒդh>{NHKz(=>
Z,dN`}hQ	<&64^
Pf֚yvڟ1X6Yu'CLrHs"HJ&ۨW0[r÷5$?wZiXj%Y|іS	Bepʲފ/AL.3Rl  Ajs^sN! gpgU½#Kmiv 2Ƭ̢FB}&IfxVM-_lhbVP<m̄T@Rئ
"̑Ӑ\ItԴ@29=Rc
O]WEtykyn=7"W.zJXWB|C3ߖo&N'Aq^ҕ#hȈ ,Y~v58Uc@q_!`2O)cDRiϝ(vו>3 p`^D+A0/TU\#UXQYpvְ{Gpޝ
X?jj/J*ȴBh	4e [OQGWԻ.YD]H~QR5nemʛic5m_[p!K2F$Ax1'3g`֟?n/MT[V0pvi_&҄6	tS9u.yqȯKID±#۬#ai}-r!%.6Xb%$/Z\,~HBk9؛Yq9-(|>ȭWkGmf;lanw翝E:>eUE0疀!ݜ4}n2vFX3DƯuj,jEzXo+|h /޴~10h1
ٕ]]՝;^!(;'ʑ1CRqX:aU].AkqD0l5n-sl:BFp~Lp.hb@)=]h VYw֐8BSZRBB I,Y¤/&a_[Z-э]Fݾ.=PnP{^
|Vqo簕oT{R]7\jEl;bsN̫KW6RB(o!jZ!W</nyݭޛXW65@#`mE7)	V!'I`SaNF3rJp5PzBQ^XWW$s6X#mQA'>Hw֜ݱUg<oz^rg{M1#a_Zy E"X֑L,Ğ#@x\5Ot8^J'lnvj:듒!⫗J^Q9.9ެW^ۃv	_ne{#+~s`!ݕQb,"a q
ln<9
	@p`hjP<DpqcT-O+E ʹ;`EI},e3wdlGʮXZ?4R#FqбiI=7	P0(}P.[#t(ڱaoҖ{wCp{=(7 \	)v+ƃ@u&sz(8<TEm02nw*V8-,PofU.^"c{j5tEfrblx|'rp>\|⑅H 0ETHQٕ] f̬~`CmB4Rv?'KM:qaw( 8{Ц+y%G!v.ME]iVbU -kz|5ɮI}OcXcDaxs^}q|,KL^+;9H?Se>ѰrQ|0czd:⍋@G"Meib%Nn~7#mFҴ⚘[[tZ7IֻDA+0V+U]\R߽M< },4||(ΖQCcf<\kx0R>Wƒ_\H`k"g_ LmnJ '0¹dOMC`#d@͒Ηc%@${T cq9/U|q Om8PQ6;zwdOY.E	?LࠇnUivwPH<&qDtQB(2ޡ/"C4V1_p&^IVzG1pSSl,D鯆"ђWA#m
TOg,9S1[6.B>%DZ!8F􀜦۟^jXmhۧQ1\N	ޒjB3(4B+\ jW	؉Z@/ 3J9D/H:Vրq]rz h;$THw>Ұ ;^
7%td,a<^m! S~M1RCj6BukMT'XerDU2NҷFEeCC2?$I_쟞;BFHֽW٬27oZWޞ3T_Pga:S$#E2-Ăewb+&FAދjrn:}zqOG.̄ppӮ[͏.}Pw)Ō`U̦e%h/g	v1bwʔr>v?˧b
TSh{ co1QP]ы!̗`?䶐tiDęLFfΌwpt	?KxW5PG44>B\Ҁ*&DwߞؒM"{I!:r5XB-DFI!.ٷRPBL%zG%,9Y48Mg}7"-̈́I.bl˷F_b\;jI+n	dsQ7d딠Sy؋N{o$$oO>d6i8pJEII~5ԇ
!s8w6s=mƽ3trz+M@]d¶t`)	b>!N=i5YsֿoIc 
OQd\:Ksoя*Xa:gJ4"
i--KSR}ꪲ*S%hǌbyܳW NĦSQ|c6Wg?/NִUI䅀_i9:	(":UTIZDā|yk(oT8+h>oL;-sLy~}B=ghu'eqUuCGaP2ĝV߭mu+[k?.ߏZW7.5q͔#Den	͍$?!	0ܛ!k^Ktk_~oYpԥq)+뤠>/p4wI@~?"z8?8FiiėR"x~ǿ,I{Ӕ֟w.JvkJ&dF(5;8Đz1S8?.XgD>5~:)<cD+.Q0Yg Lq\e=q\l7 {{gg,!!rIru{c4\݄vCGa8{yTSg׽wg:g|oNvѱg81 bՅ?xR#FB;Xxc
"~JI]0O59%@Z G%5JDnh
uIYSP9~oۜqDx=QȘ"+Ab88ט?j
83?Zw TtkUy1H~p]r!U~
!EÃx.P' 2-PT̲<0\[D`k]FPura1xolvͩɻ
se|V jJ#6Ԩ= 6[z( A/8C:A	T-!ߎv4Cq-h҈wɚxE,$| zXMf3hQC	[.]l*M(ۊy/C4ۂH} 4Rēa8: nшOnfK3E:_}2llqa"<4y	9-/rt-\#{θ&媇
FdXIVE8A_.́4/v'KZtlzKӳ(iby)Ҹ:}tx.s.vA?NHf~6e!LLc@%p|0v!6^//izqiRمtnhEkɿ^	k63Yl~e1s`P)#toDUb=jƐd!ID4o5V;M/G2L`ȇXl%4&[<Ea{i/zfŬį'!ju?e
[]+ZF(M:ΡSY=9m(͖F"%n0d`Z44b'g!iYjGFGnlJ(@NL{ĻGГ#D6S^$#jPz뻴Ch1ަzThH_I<O0[UiGΟ|iyhG+͑Bjݓ0_<6HJARA	=3I}HSpІc[jxՖ蛪M_>P:_4qf5k}Z<+L
-VǷpc~lq	0p~,Ǉ/w~N(<R?=J:_zT ⃫9}5Y;LEj+n:	?bAx-eǜUM;:t{PZ*эg] MNǇB?g[]?v7nkt(JH~GS\f߅4,$]zftƶVp#(AoOV "L#XK3>Wx^hrZ8FjC(ZC񊐵(`Z/GDR:Ȅ)8o,rby@졍aebvDd$B'{0DE
 Q2jZ1~mVpt!Ŧٌs^*ucS-Tشn눊5Es;fK>C'%m_]L!@P@H6|9W!*+[]kkybJ"~j6ї0dZMڋrfZ̸nVO[*ipQ,\\lX^w]f7BAj|;i͝uq7j<C_*0K4R8^kHL#Qʸe|Btq6z'@<9?=ݿ d5c6ܦKݡz\>݈%2s/R/_ҥN'CvLq|qzr7	YJoz='"Q ){7zmV!;	g jg<0טUs`>,ٹ+-&㐔Zf'ͥnhNUC3svm *QjTH>BItYgSF}"ax?]T0dR `(ctFV`1K\USwZ ]x!|NAȦgk+Խ|5X'mg<B(ULTퟋhkU=1E- ! PG@+86.ѯZ(!d`4{(<UExL47:)(EPH;hhTn8iJ'/2@3m2Y?//4?:s * 9͋l\)(w<e]mlHR:~_R 'N*"<K4 <\}rAFkn	z0G-j
KItA9C=05>)PHJh7)5 8%LUJ(a90]Y+ij 8׊sr+Wf1	hf1dwד7 ;F*4-k5"a6ÏHϼB'no8Cn-πjHVP'_(3];#93',13=XA[er5&W]qBJisrhBFƎP%	aUe8GGrQ{rgֱ1-!ԎV"aL`{h@K[S7ܘ2}6{H8WAóh?^ιjkoecK``_<d❠sr#_e&AOYt$uDx-
9bH<Ҿ9GCpGOqiWˮKiYۼَ7ug5;.wxMi]*Zhlyg >M8;=IÃb=_լ?LbS"^Oxyjg [I׍<ɥ9r4l|=8^ka͡VBMߚpF v9~c\i1NBjЅf˘j>%b{enKλ[.7J>nÈ]RmVSh]rb6u6j2~LA÷aN֑IQˇFQyX{MY˲,°bWf-w{B5G
A|52:C@{USc؆rB"FlY9Ox,mE yxZ<P6!fܪ7zr]ཱྀ߲}_I?<[ퟚw
sf]5*?.6aOG*,Vm`A^K,gB8a]`7F^gKSs6͊Cf1pIS~UUst^<c?ʠ
TR5bp,vXw4ͨ̀w87Jy=K;U?HYx3)g?b)]]Y࿤{^ZD^dժ\ =<aKtmѻUTV:W}zgk+h.	fggV$XcPIXUE;c pc:Ψ5|?<3s.Mүx9Rœ`¼i~IQm}s7VNϞ7&ΫkHpŵRBR?t,7P܌ʑjSaj7t"~:(͚D֐5;^eUulaNyk=X+F u^\륈09R;ǋO<79#5_1#bJ5t=`1C<ZFgH ,v:T{£3x,Iۏjo BOe"^ED,'lN8ggOnh<oK#":Mҳ/:8YGFKٸiI#A' |5︀^%zXU+6bS6׮	+xMcP3 {$s/j4%gM@Õ9d,4pY7xmp+"ȇD2#P7Kd Bw`#SmzBolD|%;آt-PWѻH2^-1+R*Md&NW\.Hs"+ˁ 30N'CFpaR,99?p"dȡ`.HFCN3[blHЬC!Uf̹`m!NB$%6:6oj}6ǌTtwC"E8}C"ݡ}}G͉lPS1Jnp=[!$-ͺHi=rW9{MZc~"hz.IL4r14=8;ւ>:ZBX<*x=NGgeis&{eI3 BQS7:Niu꣪∳$p&\ޫh:E@Q>z)59Y>DӼ
xw>7?8^Pn+m2K,ȏakqL)3GLk{>(KTgŴ5yaUU, @W lO'݆y?OEC|]tqRhh'$xAfkZ=&ߵ7}m_˭aԽ7䡬RHB0%&WiݯBpN{IEu\-WdH-^c*6-?{ɴuJq12:LB2cQIv7	2A"_0Nϴ,xEJpFjS-H 4W3:
%r6;0XmWmJDmê2IN(r_eRpƘe
ph;s)&)̜Q]F+F$4q<F'b9Gd0	f+IHuOИGݩ~hVqK⵼&bC43G3Ղ촹Qfn(]٢i[ݡYr4˜<EY70cNPSָEh[^v)4ʰ'5ST+$h++#f2sL@o\qh)!ւgșWh^L՝/[uC7};o6|iT>L|s/l@TjTHi2v𿕛f5{W ĊѨcH#A^SL2$o}$谊)PfFڢLql4!woL
ղ$7GEܟ#xV +2fY*M:)n9zst+b|+0fĄ^\C<zVc,]lzyNS kޮX	%.ٖ¿.yu@.WcJvpbiao
Wm:_B)nS`J>U_5A)}D	֕{;Y79>竾
i;7qQu8!GFv51MͫÉ@ȭ'y1)m
%'o;^}SO٠`^00}_T䠳nZPtnR(B4Hy_`9@auv*cd9}n05 6B L	)W6'݂> 	/m^Fv>6u u H:KzоEqFdỷ5 iX2T	DyΓ`Ǧ%|&]މ J\Tct>Zqy.廼vxM/Ѻ2|7$2ge&6Zl(~d*	[):w~?2bo'/OY'b<2(鮍hpx^p2H^Wz y<ԀNNuR7kue8Ѧ.G+3Fpf0|jϰC~2ء[MܒYHA G2FIZM#4Q8L 
#q!,ۈ{9c#6+Rp;Ap%x^ |0!'O K٣MWs?śm=ʹm/)-kh$zkG?"{u5sn:t'iQBx{8sQvRH}i}rYA6/窺J3j:nRX]̝9]~.^dR'0FaVԼs2SULyGj4O.ަ3vdc}ccu}ku}#؛lA	覣+Y)UbKV%jSe]b&BcKF~j5q%~OEV'frvR쨌.(8۫3ĭ̯r`=q 21z@򱃮Xwbng+%yLfSJ)?9⇰%-^OGal=lUցOۤ@6@uVY5[o~^qe
IiV"8dpZ=	}-;tKGz)ʯzjYד?)\|;Z{J;P===8Z5*&|:i}c<`$AOmDnwz~\[87S_h/UMz*ʃKm,#SN{=\\3<?=29İWB%',flPD})dn*6Z*?ht#G
IN1:>lx"g$nf( 1R^5=Lg2ᙴquj3D&#F)s)[V{cɣ1U|2	-ǈ&ݺ2Gbs[q* CV? ̗0u]v]AtIwMߒR4ap
<
p4\a+,3U7|,GB8.+de={A{VFeOvpop(%pwPFMen SHl9M0h}Z\o?6l(Ȼ=VJZYۦ[Z>owx73S/\[7Oŋ͍jL8.30]c5<үζ#!gQ5T95<ՂV0$Nv,;-mU
D-Yږ`'خTOO@?mR~޴7[ۛO[VP U-X˫mLnk5YqLD0DPb,LGC-D!OD9$XRt&W;YD.#."0`'ctK5Saٓ걗!Shed_EM&c&/4XabI#j|~$ nfJ&7C@TFL%iydrC7]wfGʋZ'R([P؎6;_g0p[A{LJRwi~	xh8P'$^$Ґ@@'Pu*mUEU&U*[cy?OU6ʏ-1(g6lQ<'<*?mM*Oʆ<'<*?mM*Te|y?U~*?mM*l/cy?Og
|<^6l&`^SY|SqQt{0<[-&Q\@}㞁8=	6Hbܕl܋=	Wu>B>7g(f V 9.2]ضEnO 'SeeeU 浽R2-Fv,=}Isy8Zҭ./P&#2kpM^n3Hz5	H8ɂ4͍? :))
։˙>̲od؈>"q2:dk,18"Qf'S]S(`LS]"ͼ@90av`Fܞ^S&RŰpt/yxH6Ȱcl I24 qN_>lq\/k6!!+@~دP`C(9/+hp;89zr$JtqHS
I6#oIS`RfMKʦ2OW׷W7כIzM"y?&x9dЫGX._,G^
Mi]@mDima^L`>.fDX>-gz0!67`潘fH`vJ[P
\H>+Pj#9ƹC>ٿx{vnGhu2x\ >ħ7a	̤ M'a6` PiC
N͓_Dmn@ܺ-jz`\{쪬= e	Mp%O|bbY@'xru[ѷAϠEBCOqLJm Cm&c +ЍJ4ۃ__]:=xW'[rѽ83
VxQNlaUY?lХLzx4A9J(PcĿA}ԆGu|eΨPjYBL2jֺ&(7B('FͯJ߬pnyEЋv`Sc_. FwMF#n4m_+6?Y\o[Wt?hͰ{bPM>~wJ-M4P@/^llOf9n~Ӎv]i"8hq)wC.W	bgRkggPnZgG!ٳpb[, ϑ5kon1	]HgyڔLgy BI<Aj%`}az<4nv!$[%5$%jR2lK;(Ɋ/xAM Э21
DVCoRA+؀U&'00+ki薡Ult3G6Pq<JWeNR?xzYr㍍{Qܥ0
5U
&i<]z4N J!{kuYG
)%U{֏VM[xxkհSXrZqg@b8l`Uza"k5L,%N%ޥyD76l_Brf$*DpQ\h"=1>|
a"ȚZ4֝Ua&B-cw~cDqD)K5pn%'-Uiޝ)Vcϛ3z($}㡭izqr7cg<JVGbG<rD:?J(K#v?y@I{Yd+4!_@7f3_1\%)|,}ӓMjC	,ǂ_`} q0v۫?n>}&ڼQ3+~wkk{Owx	řpƿc<U.xm31`dmPf֏OZ|j?B׬?	s_<	<	:	O7\}ޮ4	_<[<[:W7?fHCgphX⾸u]e8ځ7cX0t02"˵%:*?@?W?m_<CdxQ=zx}Ӑ<)I9rȺ7F0V;fg|*wus|s+*'Asʹ]XռSzö(^
Et}
Ȣ G{4/S4ojĉoݛҕY['?n^_Y}mxv͖Qu6Iɬdfa"	o"rl.QoZoudL >dh5C%a,qsQ>-_T{lOh~@D<(}G2]~U0nݬ.D~XZ.SA8~.&:I@{W>g=h2+āD.ԥ *A*ڴsvP\GH;SwM]C걆$izk *N%	F^>~A9;*wO-ZuhZQt@VcGZP՛/#A5}0R5e6PBJjtߊtQ|)twč-ٌf.QS?cNKVڅA""8`FT;Th_V2P.AX4Q;؆9^m^&0.<Q&@hkF΃ku֟EjJ(%řVHV9]ُgs?PxvQ;()p:x)H>o`Jc
?ݔeN4Al:ծFݹNǆZ",xd`&"`U<
ڎsCNn%syMwD˄=ϷlxʑNtcnUqx^6\/y6+(ˊ;h@Ӻ20L3!Q`Jj=YGZ,)sv72cu6y1ln,}JCdEp_D
9)|ه8ǖu\z_8ZL6?O~&j<6(r9';ff/D#αu 6珯(R*BGG͝#ڳȬTJ6ܿz)"҈(D!Uc5,9P30q"8~ -!dcz:1;mgGiWSh:%Jm+ұW4N~@?D 6X
`#	IlvvҊ/P{Ԥ٧̶?SPer\~ 'Ó59!>WcG)u]kz7-%hvQ4\覠YtNdw%AtUne^6+h2WZDi*%~hkg//k$3ꟵZi-ƫrr׶[<, yy[6OL,~іQy-o"k4܈0@FoFFrZ]'ʕSiL6{+AB-&U$gs	IVX+=kӵ8U\Ǽ
搜?O@Kk5WwfJ$Խ{q|t[=UX@p3N9qsKsA-^C`Oݿ)oS:uѡӽ27F=i>ou4(!'%7W0S"Qс֢Kb*pn~,qلh4RC(kR~8Rnt
=x+Q)~2Yْo@?%{ׅ}:aLn"3OD6mɁ	oqh Q¤d%n#>|GYH|CxE^oUG6t)ffI|0^y)r=]b7VBZqXyRQHF쏾k?|Aжҿ |skrk Vb(٠w%sul
 ^7MS%!W"&J^>3ptG'-HSRry[1V &EB3K2;'fzm_"Ѵij۽ZzEPR'~xs2 =97,=@d
{$9?m
8I1B}W/ o	yh}2Ef_uI=.Wg{6YDz_aLS vnS$="ne^Q9_jE@mvups7C@,rYL+VT#lMUV4w0]0gF(B(-H50i7=cX'RrJM@:NA*]bh=|P H״߹SPQ3Ht$k	q%M~&:-|R}1܉xf^a>3T{xuo%^Fy-]3$pK{5ܗW@M,|x<FM梤{XmQevmzC+A+zxnwZ2TDBWghu
X	
wGUa(=xr0480QmpQNgdf>h`0w#l4J̗Z[PUgw)^i93pa ]NLEiŬA_7SE=_ey۩@9B1OUt oU_%Ceo'Joml	^堍g@{,Atͮs PAJ#֒]P]XmaJD͜^I5i9chZqTpLS)G8G21D3Y_7ϗc9P9{aڭf,yc܅$g?hC®(wE]m
u:%21PԎ$
i(_u]jEY
)g*uno0j#s-g!|_6KA::A.=b`mxAn|A23jl,^Bza)^@mTkݴFoH<C+MRwc(ܴ9E͆*n]]'Xy
R $kdJ7$fJ=\>Dk#BijIf_[t{E%@e!a=9%itrBC┗~䬵^Ha{6߃CaԶ|| !A]߅8Ul[tTuPuf&AT s/މYYUƤ ?جB8GbM+aXQQ1hji;]15phMILGhHF23qeWLnGxaŰXH %M~P,Hn vDWAc	))}d@KDɴhwBW[aIU*6#xUHt_qdO.;";TI]ёt;ؒ9ӴOZ(xm4~ilsmRǋa
$`%;$=Ia2ZVObeQ Q bD:@$r;<>zgXEF
PpX\H݋qn'kxFL|3vPcְP[br9Fuwx075H3I-"O77l?zzX`Μ2(;
0we˺Y/Yggf	"i04KӇ)had7sawA}I]qtK3G-	l|IOX0[Ǡ &FK	; l.?+U	aӺߒ[Lo:fXzAsqy{̡*ȢUI4*:$[SjCCi/a/6?Pʐ5-@*Og
qQb Z4Q Y([+ tWe~ɇf|aGY%S0~!;
hu&30x%5FC^3+(nqӳ)8`[-BN^n?"lTP|'ZL?H;cݭ5߉_[q+0ok]Du!*a%h,O,0o߼IAW>?o'zrJ;c6
#+ཹZCmd#AzQT*GğS|įv]Q{ G֋1ʪѐVKkz^H[*f1ޝ6-Ub'[/y@0 ̢ψo񦃜j3;PNwdd1.g|u`7f1-d"+bb`N7i$5!0SW<0(ac?Q0MKdُ1 9Ѡ(AUyr_:F.hSw2Ӄt:Ƀ~fCy`Bx,<hsΒم<%X~*)PtgP[d6$HX9.hN98.n3OkYg~a`X s4Z{͓+*x
pˈr;?OtJ^9<gݾ-FDx8.8箱olN|\-?j͉KXYw^lm#|s>ꙏ!F4h?fG#}A7aO>aQ#v )쏲n, p`W<Dr@ŅW5(=gP/+t($X7K/b+fVE8&j&[0@KV,AVsO%ˍpy9),"@T;:ٓ{	̴֝SvzK#A`aO|f&C<aB,=y_㌼K?ƫ/04"e 2-3	]pF\jpxq
ԑ0l]9<4dAXHGFNrPyߺzEW;RYa$04앸1𘁝5?*F][ɿx?Β3ZPB`

,6GMPwp;X6#Zp0f.Fftx`z(f5a+ DzOrDjWM $vBF83/veJ	TɎQ-L^w̎JM0qP%{*]fyQ牶\9a~(@`m~A՗P4QIڀAMreclo\WqFHX4`P٦@'PV3>v #〪*6RA흆lI
*ބ2Cm7ڡ2q)_QNrIԆcVXY`OQa*(3IR⣲bl7r03U
XmCnoze_6]8S{VΫTW'?}NӈjUU*`tG}iP#L0S~'^^%zGTk[.S\~^;kζ!K<99bJ𼏥%\R6גsjlkdǘ:#YW{u;2[F$ళ~"ۃt@A< oB]k^K\`v~2{9&/d2-&wfWWwenn7n.|0dPvD$"-@Px*z9z8{!"%`K~H6D4zGTT5gAV͵$Aa)07Y<Qǩ${y:4+S¤Jh|Qw+->Jӑᡫ8(L+2B.z-z!ǼhVM,8Kv`ь\Nª4?)WՂ{ct	,ԥ ´/JY*]M{z/+cOpnu.تKX-|^usZsy]lsΪzTD{gVmMp&Q z<R2495]ň43֭}5(]ڢJD;6݁`^[>wB pZomX1 䱢Ă#Wl~xK-pc_]ȩPoU{US5JKm_g@{# G>Q܃?gs=p	}a
taԣ$ZԂFڬ1%RWi VWlkA`Ut80sr+@⺟T|lCi	w^Vh&'2%d2 wJt G!(90՟lEOr)7UtK>=h<6k懕rƛƣ1ڶ8C~8ܐ'
LJ$֊JEӏiIڳJHUe`>(js7uLZo99Qb>NܣS7	nfRdշHHo3Hi}kDKK^+> 	ZY[)RI3P\'׉Lbzn80PjXtD=kI4Bnf]M&d+tpa䔡@wʯi٠G)|4p	?@zij4hKIA1. oyiE@8KF羄) 9/r1.ђ5BPh^E RUG%J7Je;O7;}g?WLNq_ԗv;jK-Ο/!7uT"2 Kf:{ZǷ	S5L1.Eos|n	ߩù|	}>
oĲw'ʴ7兝
֎Ty*`y=6BUTlkg.4!*fN͟D9`3Y!^N@o]㦽RvxiĴUzꎅjJq
n7U-vҵ.h\ l.莟)bi3|1Rz&
AfV vox@hQ-RYѨcw?Iu;(Sq^zcsTD{UMN$׭U=fޏJ{$7Mq$G;c<ڽ,~pqbn?`BT06fLJlSh887WQ"7RQě+	{=]~ÕT/-*bŒ0X͍Vi_pNEx*8#aɺv
9(+DsTHGhAٵ|pԟ6iגvOTKOg$C
ۛOu4\aC֙7`=?$\u   QdENl)nhZ~ҩP4/))
^TaƛkQsX$"/9Qm ޴	fmMW:l5o>LE]_tLvQH{zTc_]W6sV*'֘j7<PҫXw9XYGxS(`%!:FitDףRt>}'zYyIM<M(amFbZ8UbFs0}N('Zcs	$@nt>.13P݃(ua%ORD7ѾLO82*!r47aFxFƪ];t&i,%wCc  OY3Xtzw0ꚬ ^ˉId/-4|}2(Yb!$o!,AOtA6NԠ\m]\b[Fؾ*AP-:&]jyŐg%>zr0E&IrOv屶0K-lu'طqFѮ0'q	(s[*uٰUg37Č]-Snsq0ژGPSg Ԫ,rC9bowxm|F
X<.)<q$l6޿$jiF=6ӽ^?|
F%q?Ȭ*Iݳ{~簳mkddd\A~MK횭C 0;<-nՈ1!\C=){;?^;³Ng=*ݾY\~|}r@
7pys83D&&ߟ;wTN2Rvru589o UGHY9O:	'˂Y;V8]{ƻBw3=Ōw/gK
o0w,ڑen%ȀGl
v(mVT}|I&hv	%e2(Tg.VqtezՔh2\Bg):cF$"_7#K`!ԣ<rEw:,v3XNY=A\U6ůE.n6x/9WHmG%I箌HF@R`C̴2Cx$Q W|)xxx
6iGF$|JqLLi1,&&c>Dہךigv!Sw	d~S~%<	H;:i7RAU383IXz1ϓ~ ǜb)F'7|/gTFA 0VAUcZ?i؈eɪSWIՐ\!3e}Z$nH܄y9C''}eM6uܴ:tES38mu"b1/E^`M#v
͋]kW)ȴMN]$}zø'L51TJ:EcBWםpHya9y2Q`ieo< #ݺsƽ'df5пAۓ&\|h`/L'khÀ?y')ة7,~^y2=o' $)pA}@;d9rTiTRMD8h-Im'Gl=ǟHY UNYfֲ^j@H^lFIG!$m剪O<QP\%
؀ԁNP4k3ٌFd?,(\02%a\QnAJ˦ cZ<UT%ƲrFʈF4Kib02=$){XpI4
S1gp6z#ߚg,ҝ]ao.KP]$0 Ŋ y_gNNaeQNQ	݇;\- *]*SG]%#eZhK>j	#mKY4Utb?[[!@R Jj8st"ͨ7ݒA*sQ]SqY˶I8N_zt4h`hH`,9ڐ)\A=yHca	f*20_̝2"6iCR8pd<={f-l
3	j
'ikw|UM]iڵ6iFm\Jr,SER47^5-#V o&mbSnEڱ ¬|l
~M	[r:k;;>}WWaZ`~(-ed:m5TarL1zplu(IpD7dTRfv5	Jk{l
a#ʗh`3W;'qޟx@yX3;_D|3ku9֛Ĺe˩?~+ea_U
 ˄Y3}OE$*:93}1k,kbkkEoD5"z=Jnlft4(5Iج
ť0v]zlDvX8إ$q1+Oa^buߡZth^ū(='Z /?3(*ԆI?(?қef%O+<>2Ǻ5{N϶6|r}%SŚ#hw[?hG#FSING_Ԅ4  R^P{6@3MמOU.'Wٻd7[U[8g
8}~3eI("V:|Mtϟ4,.uimn~>4A~qv5ԗpuΜPQ/{'gπ>>6;ܒh#6WJ5+Ȉ1Z-aKLoas:cxu\TXMC7sQy ]R^ˬwO!8S(>Bv.N'鈾,[AO;.SW?(9<g9[[?-Ƴ<&eH9p\+l*Umdql[x)_-j+<QǓLyY\lr2eg<l"ںsg1)@#C_Py@,/1]J;(]fI+ (7hGڅ=tX@gdn#$]AT)a~8<$Wf)-LLx֋͢,^i//;Mk;*/uGHl0'hP,doZ2i8eכgPtLbOr5*Q33>L&XD06WOfjVp[nP%o>J38]jlx  u%UvIiQ\yǓuv&miN<~uw櫃OIŜ:A30
5jsbh,O̽ku3c܈6'*GڭiMY| 3<@A3q:uiw=ܐxTl[dN0x<m7RS#tF'hJ9l6'w6ӛx^Fdڂ4\"%"/
5룼d}h.J[I"\y8ǬӡZXb(@jCVc$եܔB/"MY6--%/2d#azܙaf?;AeFpDŗw=ܮƥX;[
u\Qu{Er+Yv0CܕyCι{\כ^昹0Djk|EH`
a_7a6ؚ
j)v=&FKzB_,+-#E]Pq6gWz"V_M_#D=[~.9T:_EˏyV-Tϴtp ~/6be7\;zgd˳)9=AKTs=i[3?C6D1WYG]lS2aQSz8s͋1\@(0$<>85DhI	seh3*:~5Vm칌QPs$؈T
3
-*FyLO'QĽ*Rto*5g'QMr	Ջ^$uNt@EbmӵrBh %sIo{2M?f_Hc\rf%qYQ>+^씻HN%H"Lk^ƥ<٥63U}*H닂!<gˢqPpHu_HhejVzD0R}fUPM]')#g\V&!
}Ɠ,"
q2&]%W4L&mruP*8Ȯj⓿wۈME_P<' *a6kV__ʁ]Us4dk[Ȉ69YλDg445ȗӠ1x5U\Z{{|rT<^
zhp;;^v(O<gMRa˧,(N$v_SNb낪z1:kc۔]zC ˼=1XFB1ը-9K85´LHt	^V;e3@_ڥs +QH6DD ϊh!m+3	W</1e!J]6A/Of?6]"AFO_2P;F\fl3VXD?'"sOE5av˽9gC\*$Qxu @KI <OܞOo^𬳓04")%z
1sY%ni
CI}S$#D#3D\F,;8t϶GV/F'26$Z)7胃$@@ZË%rOXqw[w]U /)x/XjK*r ƻ23eFi>`oO Y;@%rQI]UJ'KqR(aDԮ#Aϒ *p
hLԳ
?m2"{IkJ});m#Cߞ<!tG/7V1<%A~i(@(ݶZ㦽Rdm(ѬUNٱ*(i4խJ-?tvNvK<Dx";J!ZxhU3{夁{˅AƎ[t#l<7.ئS~-i|}	jRxӬU3r'nfoќ lؗ֒6QxZ{ ,@@7C>湚Z_CzXBHxmu,y8NǢg/卾*KxV+VB=g\\j8r<bS9}@s)j84/ݰ~6*=\Q񀼄\:k:q8kwAs]|XfO/ 6dΎ#_KO:8L	zع2&tYxCMSd	@;]:iS>0Aw:?~ǆ-"'q;+p t	CG^>Tde
狝kRڗ*2ዅˌ>řڌfr/>,/{;._~[Xo\Q'x1(9n2cr: hWы@	A^:m#(FitŮly
LLJIV
>jhdĬݯhbQ _ʷHi:zK#x29muuOR~#'*~Ȋ_؊Ws?ڢ/#|2ڿ<ژ]#)G9|@٭5ZkmPv^IEnxHRo4HI$ͷIG|4ߚG׀zN[T~$ٷ۶⅘M{هxĴ}X#ɾHo|d$#	=IyHo?ٯ?RY$??I돤G#H_$?I돤Gz9At߾g^8c}lhp[(g;`1tJybTQ\gev\Oe|ίq+*ݭUb=J1%T>FwYg~VFd={#H8%08ywaF}
 Lŧ/8I0sa:PC0WHьGl:k%"^ Ga=$yqY>QEt-ŐIDPWg
:>K`Oq{ޭKOD0tдل0ڃJ$/pbR%]'7V0X_tp"Y 1qiE@=.];,sPPFT""򼩢a*Mi>
2 \ǻٝѠ\(y#<z1R
m
ܸFI/HǗ:^2|4bԹ[Npd=)v901Y?F<Kg6ɲ"rGGD|pEX=ӫq׺d}+ew3ZKUƀ<'w$zJ| fU1H̻v]!QE
&X6c\	!_FɰW^.(lr#@m-$:8۝KM'9,jDfA}Ɔ7;CƩ{Wѐ!B]^Å0+A	VyϽ.%"P	˿K0y_YEIV̭U\gY6|t[R>gD`%*xVX65f!CE,80ZGo[{N0Fa:*܁Ogs&zҳWw1Yvнa9TZEu"M5eLUsY@_l<nRrJ~c\%h||}!6F:ϜV`.#8cd,3P A<OESit!rkwH5*weϷX沸r:qtBdoq*R̙\L #}[=,Ls.H¾kRa ;h_!oAys_,3qnu4s<B{<'paaʳşqQmay,3 #q#Y`C׵=7CO{[6	//aEZ`5_q7bQ9	F}5s='O낾VD_#9;YrFgc}q9Ӏ꽪2#'r:	Je
9x^dG;,B,6OFeAP[y ȷcRDW އl{@wg?}|tW^ZO@Z&ŒBa;%Zp@EjkbsrA1Mq^&-.0y {[7n#rʐ חJzB p\]yRWrGsO|UWNׯ?rHqT 皎t;h^{*LX`;<3N@<0`-`Kb[ȫ ld{~XeHMq6GJk2k+O"0`S]netFٰ41P8 :wLo-d$3J'"I)PB4xpجi[(¨-HdFŔe'߶THX;:s};6%:M:0aU]S**?moAQf)aʨᙲiH $"3isqJԨ>4tr!@5]9H5nHp(a%!:@>&e0ank)5r|$sw.O6Ȯm^$ VȘox:'vBK- hg	f7Hp&j%CH6eHsN.'	qЕ`
Uv*C61`Q}Ox	l8gp#@M`E <C< .,2ҟvo:@rltkCŽMaoGĂ1ٱ x L?$N%M|tȣ%o.Jwei
9<7گNW#\,nÄ̆/gHo,	X3Os'vZ&	1ఁ9R~jC72)؜L"NE'fL0W[=pԴeC;N[i'-ތi46IYa;xfSx 2Y4Cr0a:PpxjS!7Wӥ<7R8@ϠȦ3<6;mpkaud'תPb/7R ĕvsA*Ϣ%tiefRCf`%8:x,R Xnbs 'ek)n^VbA^_qu`}ETW=!	#`LA8Y|s!ybkjbOgǿIһr3(1Oҋ̼&*s"MiD7ibl$! A٪Ѓ3Zн=Y3: !kIb0/mɐ]awc|G=</VI<fMOFL<p"81!M87	rfǟҥ4r"?zvdn3Njb/a2RH-x:qy8p_gqA,.S?&OYG99(t<d^%Vsu/w	,₍IgK.Zz}:yZPG	xkpIld}sZ,Xp$PM\+aJr&
^'Gު9.(&`,n ee5I4M1SlK)eE9<rjd_*AsWj"p9AMtݵ'К9>TiƌNh~kMKߎح&Xa%jk	Z ޺4(}/խ̷4Tz lTfO@ے'jdw U/t
3w@x!NWi=|EUQ[`6+Rr0L#f%#lsq#id$Q@W@!~*56~eΧY+}Br	R{a<ͫ!?\lZ'xy2 ǋ AP-`6"sϩea}g0)K!`֝l ,o~(C?Xhݾ7ӵ=KQ7q5
GC-tzƛ e&JD5K9u*.bIdԦ#kS1M\1hٰJ=0R'MˍZ#[_X_0iRZ6WAW48j\u&xJf)/dg[3Z6U)*@a.9(aKgPcʆ6LXJ](njav^ϺM,=l%*8ΝR''U bn$2#j&NjL."!o09eP12*;0IG912tyMT|޷z~pf6ZsSju?q AtB\A.iE*X9I|lkkX)9q֚"읥
61Ʌ0[x1Lnh~vgU؂H'6Z9VJ۞i{VC,T"̟4$ʸRǿl>_[_kQy!bI tO*hh0.?NQǌ x`#m+P+R=9x
侧HnV$PBatM0PΔ/{Į@!(ki%C̙Gz$]lPKLǾ`[dgJ
DY*\+O Ifc(gm4E|م/.mvM6g317!ȧ$L@toT!ӀH.0~|-I4EJKa2`p84MI-dRxB*knB/nЏup#{~*^2ױ<"9+-Cd jC݀o⏩p*۹pgIuxytrcL1<nc;J})V4Ol'yT1(Ec/Q/!BEaJ0}77NJ,ԲӥyV_ﳔ]gTP:ݽnގϯg1;FO
Ɯv|t+Noi[<Tp.q+ME%
n!s;]xK/RRWE應KOqJ.}Zڷ1N`tt2ED+U2%6d]{
~h}lH
#L':G;{Ȃ#bνit]}W)YNyUf7+
zL@jy.27=!DUFߙӎ>q&u.=Sz4z VrЗ|*տrOaj7gc8۔^RFItNX$CxJ=~VyGu;~Q)oIܻwjsψ}&Y,o@τA(%\'wpYwudl'2dMWwCq_@.V[.h=P'bE`,`P<J9!qG{g{_c2(V7kkUѫiJ}L0VH;Uaw\#QbP!p|u5I}p]7؈0'gCpᝓt[WWL	)p`VD01^&M!ymdW'߃T\[Iu]WMh'䡁ƭtvHQmQi[lF[N1)dA[KɘCl2(:5QG=aH9*rE`Rc	M]ogkry/CU@Mu֘+س>H@1K8cGc<Oi<~  oirH(Kl~\Dش!,x7H.'M}ZI~H>\x),ס%$AKԶ()[Ĉ2r["7?}{χ^L͐nIz6tBPcLո[{Pw x\Ad*/=OiuS./LS/޻Q[MFproEA[)]+	~>K
mvM5|pnY\BQ򏺠t@SbE-Wyΐi(*6K[$*cu&k
(n LS9mzMڹR1EH2-l?]nͲq<N@TQ)O\l%4vmMJ;8L6B1"LF7[V0օi̞~Wyd:Ϲ{k17fՒŽ?kb03:tOSja6N6?B~%Vܭ|:B3(Y!r~wě0۴/"gA
vաw37;SbFF(f湭O5ZܕKpa[TVJR
wo֒ɦTfFpc7fV+Fz	[GHa!_yDpXtr5hu:apl)?2\:rn:';bddRw8'Z 76Nd9FO1l=*hU~OUַhͦW8h԰^~c8 .\bӞ!|
ǽk3u_S(6&7eŔlFt3p^Iɘ^6M0D c%vP/H684aHMoA_7aQKQ?` K_ϩ*9&tDi\?e(SI'u^`?tПkDG3v *	]$0wN|_A(s~O&Hd`oR5|qju;oSFuMG^Fc:@k~aX
hAZ2֋EU7}fa/N1*>L߬OϒץvXU3k@`,(^5
LsC09zu0>ez_Aޚo~,*8`xlG	~ͳFf2R9O<V7KlJb&wi<R6b
Gm\OK
7/i={:g,sP ùKM(_CGʆէҏ
m>X4w]QeS3s$z{}JPg,V-]5'SS_%,$l
^{WnvsN3Gu\8/68UQ# mao:G3M0"p'Hu%\/](I^qyE"u݋ʷ(+^թ%~WzĮiaaWĬcҢW޺c3{1+%I1gV[?%;m$rvQWvӴC۽gHr4ur$b%fҊtϨ)D/sᣳ&
{=
)=fkM4FzD<;Vjx/oe59dQ؈bU;@Wxm3rBhD:yI&%$Z L~3BvN;^nɳlC82kc7s}>WN7ʻ54rAe
	+DS[ZjxNg
*zmj&vヶl3d[A=e/haL{|:̧.UCI*>!"/'?xbqT+8x	U`)_A`N'.ɵpv %G
jYQم.Co'\#72^C􅽲){2#LGp?1	K#+"pubF{D?I6:-fg. k0t"HۘAf kh@5J(CTT/nXe:1"BIvR^^-Ƭ3[(mi"p9ʀ+1%
hJ["6sLgCOynDaoGV4i˽X/vݕlaIJLOCuR>pm'1!T>tBrHޘo%FO_y:JD蠥oeO3e1'HYzHSnAgߠ^PW0ݨ/BQup~MռhKL_[|Bյ"5Ҕ0ކ59f w
GUFBMr<X/j$EiaD}u8
I&VW0'dS)m,! rhZp8qC>?:B6>͒U+zql#lJ\|{uEGJ 8"v?s_bU
y5=ח5+j"s6F?uF-orG$nE  i<7PGзq??X^r"3l2te(rk-HZCkK- 6TzR2eY1T(2OB%Ra(EFr].we԰ȊF3}HDEm(6.Li0oN~;8f9RpߒL0M7׵oF s:x]/ nTB7ݽG]lK6]lSk Nvff	/<K^<g,u}_AZxq%fPm<N	p<{UM9NB5X$}`מ-|בy
gQm)`\F=k^0nUFEQsW	Vh,Qf&?*o1Cs/	.'/*Qc!GC8zeW)Hk<j1kWl]ռj$xHWчO4a7-aǩ]f $N5,8|Wj*Gu<5 m"mlv(#PQSj8;ܷlR@AxW|1MfU1ٽR?nE|kwP:2	{ҍ*^9w='\l8=/"	<X~E䢹B~;>*n2JW'.v>A	&t]j	iI7;5^j͛ѼU*N
4a>-8"qEe
|AX?@J#5Ìto,J-ᡲCUٵh3 #oVy΃w	Ϧ/w߲d-|St҂ǔ:3G\s/p6=`m>ZlxIrz׆ZFRK~K W`[El#6
29WcىaRb9Nh6K<OiKag;3|]՘p+`)UAްnʡ3+Xxt`vsS1Z%(~!V
e0ߡ`r
ҘhJ8&6]fnv^O7\Wi]t	Xͳϛ
Lf:籥tQΠ5#%av*7R| >$5sSfgzw	N WHŀEoJ-"p#8oa30v\DȂ0t7ҽ|\|G5hK2!;cθ2l,d919?pǾO=`LqKJGQO9SilS%E9w|BGe2a1ws{(;JTQm ZAuZpyT p@=ڿ60g,5ٮًDڥ:pjj\\bÃ+`/mJFc-ʦz߻+P'PWE=ݯFx)fY@5CiQز^8LEˉ,JF1s/Q']Y{yӟ%#q۽rI(-9
J0[T6腄sw.>!OxR}wߝ?:zΊTT6WK?Ng(,h!n1t:W
<8!EC2&OQ,j%	MV!~t4ƓhΫW|1WAb᪔I?'Xc؊1+eu$%VOzKթ͐"* MϹ3<5/14Ι&<*1fU .,#8 #avF!A$ ;TMCpְcM-@* X:sgdC:{ڗ/XlMA3=\?=kW|/ѧ^S?p}FELcm>pHVE
Flo41]Y'-W0>,"/rTXFf[tGcKL4*\ϕRmYsCElmDOK~`Os؅RBq;-2c27Btz
	)Hg%Bz܇=*+h
=K_[?
piI.%~Qd6F!^9gQBLw9:e{ݾ<  0S>ap~_e8Rv=,9(#~*f^΍	|:v{Dп/i3|3/@֔Bckxl
vUK(6OY./Mh.B	,tE2`G^`t+xEO,Zt#dp氛Gh l^bP~)I;xb><]Mn	Xx{7<)o& 'ͯ|d^zw\֏op޸߻7v`.;'x hsnCn,s:u| IN&d\CE3f8\Kἴb}Y	gywrKZhQ{{UƔVH3Tlb[jv6s(^0;1>Lc?iZ*u1au"]\XnOQQ>;<!3ѝ2I?+[t<摤&׹"iTM:c5[8=<+!d:]+Usײrq98{`Vݲћ/_fgk<(a_ǜ .?DFбlԙr3u᪘sD \?F~W~Vm&-P0rWËKr	!m9Agc? 2wQZ
3iùZho|KC
-S XqxCmܕ.&c`qVDӭc(jЃ Ԇm@3$lGi >tNL{YgNksD\8ުg33xU>.-V	zZ$X{}|,;E-ϾC=frE⳵g^;zxtroVDIiگ0/u~>POCӀI~[;T.-ҡxKBU3%>0g\,Fh:?Cu>%
qCydb^PX-R5cYNVgwR!5W2,|a]{,p0}^f7pa=29[Up%-<{! u+IO4
1yJ6ȜA[H8lonvd_iGx4f
ya`TAz߁)4_m-]Ftbdw*!>'+uQ4mt0&{_Q(fŦ6`$pOL&'dY5Nwy_\v(}Ɍ67A\'V9jj QBḭ[17^d㎎{cV2}х7`]6;#JlC̋7ke]̛U l4EɄ c43ˠ;fwjVn;C٨O:ƿ<b=Qߞtb,f崖jՑ)1:j!ںXQ-il`?TKTZŹES
+"וUU_+닝26lyM͚EVD1S%=4u$t8Վ0F=ǟ҈ORS8ZmƵ q]v(&J8VtNoB뾎Wi.pr0i/Mi6 T
	w^ڿrR)AWljI)}Cw	%#;6 iCtٞڋȢQ:U+8=)oY[p`=ZtbJIdV,PIpC1A%fUuK.882Wo>Y%s'a:ZkbrCdWwv;۝(V>bxH/A`z7n䙍Ȓd%:6<n?b2|ғ(&o[0^h?<M)8v2ly68`)wqW-h* Pb?XU[#Parw\tr>/1$q4{״㫂YPkN'oZ e8F$IFB9ޏ&&^lrP>c~QԶ}eQFѡspuU]fD¤]nOUxX֐Y
`ecg4rTMԧ#
G	BY&L Bj@0mkC,4u_jR8M,L$LFA*b
>3 	\P-Sps~#FITF)ǀ\V;![G;3mC}u9cXwx_-|z	*[1IlAl$b#qg3Pދ즰Tb@w)d逄V!ÖG`בy`]{ؽQP߀pSǡP?{`.  }Q&33(U2"BCx,k:_.?K%|zYѱo[:QBa>}_x?s\s}e{y:ydS՚]T]uIϩ[]MkC֚-h>ecxR?r"ziwM"c&9k.Ge~\m~嵭sh(ㆃ>U9]G5hScqȼx&`'laqbF
sO-*3cl\KpGjo^
@YɕYҚ:'c^V2m%:nٵ/9/x:keH8cT<BkT(g?8$W1Ɓ"Ak #ʲs`egF (g)m:X\M`^Iw/)#ϯܖ 0ł,ܕ)I zocG@%GS67S?NI@#=LER<p	Q,䙙RpƂ5d_ao05~BccItJ	)}L@ݤN7LƆ!:fO^iq>(wԅ(n >H%?6 *7%L	l -&8 |2ZFj,P	Eɼ؍C7,_@lxʫ.r6dnϾs~E@_NPrX):Wl$%STTwEAtPBfI!T)pp4OWɗ[t	9Ɯ6>w0*_<Gsޓ)/[WMv\aϘ`HY+\R}{lFO0.aEj@0"ju`MW.WrVD}8)#@s'cи*1#GV-%p:4gb1X߀>X)i*mޘcZ;y2S]s<)'cݔEcϧQ wtw+r$::I@DCJchmbtڈz؈V#_m`9dtWT96gN3/eq975U`s=lt<@4c
w%/ʥGH}6bH`8 <?a#bKL?6!XCbk<A[eE`rw'vr)YyL)> ub ?Y6;ϰc0]YOʢOC	v)6Q1-Zߨ~?^Vmysyޫ/{=jqcjtRo/.rlV7u) bt#StPRA˗ZK *"%2t(gt&@:0Ԟ.⍏7B9{bnDLaɒ^|mͥrԿ@~rUNI;>Gp`mD붤:mFkH#4#vM{X鋕Su%|JJBjl[ybr89 .0R@&uE	R/m|: Ғ{%Z#5t:?r:aкpߡd]{J	KtQZJ렊scFя<RxMEwAy/)))%3#Me>*Y^%H'lulZNþ(ljs7l{^3<wpa9em\J#'P<V5&jjaPzĂ#<j	
(RT/F>#xK?K 0uTU}V>3\uU<%՛IY,",ĽtX[;U}mh4\lj.ʣz̓b
[~1Q?̧UhopHEY=>x7'*B^||v[%Xze~a3߯.KGO7?[^O{l&TV/Y||)R69i3f!s	\UGjRKէ=PD[6(rds]RJ͟G VCNЌH=hSE.q0ͯ1[]aq4k{OZi2usu45ӥ7CҡHT>O6#	(!! $GUj,6T+?`(B?!fgs&=Jڧzx2aLGMz"0	r&EgKW&_^& 'dq̦@֒>ͥG\'%Rib.z	+1Hc@%I(io%Dl?}d+L
GQ*3t:mF6T`óbdKzp1_5~6@kκIbY(OB a :G6(nV!R77kO'BFv[鳌 A(0 Z@cL.#Nzcz}1Lna')r">:>7;ӯ6WPtN7[E.8%2x 2HX P.5'.J;ȰyFΞ(`j6lbbJV{zV5_ey:1<#ٮ	Xd`ֹ@5TZlqfZ!3
֣m1m9#F6(ŧw
鍅H2g5RSnN4^	+Aު0YB~xcl CtUʙ@!0	B.8#Z,?.&Df3Gkټ]t?kc,+}0\C3;Z-QH(y.#Mas8CiA=&z"3-a&ǠF[\vA89ou,:+z:P3_dM(u+E7K[!ތVbɇ;!βOJhN0 I?W
fSI7y[2呙i\G5os2ns@/\8gUZHv		~21?	IЌ{Ւј9;5~Qv<3LElXؕP y$}?!sސ
{ {XNǆ lU8 qMQa+~xƘ~tKףvp\o+BI.~(16'54&t80hKEd72
BW㓭w[ OB6PCike+"x C.6yd{b
SCˎF"Ʒ։|}7rƴn筡6{F9W0K>umwٓӁ9+/!_s_}EM`HU[f4u*d4E1\>7xQ~mnfϼt`74wD!L~:ezWVBMҲY&+[^
;w?w"{ #m +e1TYG:J5H򦟎hy!S7326"55!A.~QmAsr=rWF3%uU
ͩZ6L-jjF-|"T^A9p#$Nb=[qX>Xj0[lzu]ۢWwoSs\'ּN*x$Eߠr_p|
L[dDqs32\('?LBv<<蘎uX'o~4G_XSXX`xoW;p{j8&"+gӡZ8(q!>ƂFcvNOǽ}Nlwj&ޚxs~w=?'n/Z;f/"j#U4ɮudam	/! Z%۲PP !XkO{,rឨ0oiL#EmŵŵJZ_{mF`>Eijw֑0bp%BTT:WF2߿,\1 XMJp=s7Cɂn ǃ
ueDZ0Goԩb8!:]7rbdC=DM<Vˇeձpj@XSw{5QR순QKWiEЕ9A0VLQLx}KnZ"c-xok{%в2(fdb;hc@_F7@~Åd#0/TpzB40lHUP7W,	9Ћ8z9ļ!_>Db|4PZh$1[y(7{m|Poa'NOFL*C#Xdv#D'vƓC\IǬŮ!0#4O+)+LP?$^׷ezz\#K#=ϭseBIWb`aj%'OJ7Y48doՉ[4OU~h	̞hFLFچ](ˋ;( G:'Ut`—Hl$C	3ۀm{h'Cy=`)h_K_Y;O#2
u&с|:ɀ|̑,yy-̞1a]6 هf|+xV2< g>>pYS},K㵰A:gf9H䆪K)<Eem|^Gu]k-gȽ_K̽-8Ӏc!햑HFf=!.d<1b=m
R;#,bFjww貑g7bUb:/BiIz8ʺ2)&|PD=QR%'@!0|ƕĒΪ.u4~2ZPP'T,
$cI:b4E"&j'5e"#2^nAc5X>2g	d ҜA}_/C>=:9ԗ$x&Q"2oOU|H.E-thjcY(_c6C$0T9e*h_锼-ې-j_:I4(o
x@y~3{ed5V#Q>P$ QTYy]SBP՜
KZW"MM7bdx+`W^hp!Vr%e- LRA1(1gfX-BW gץ>'#'ͫwh3NqAŕэ۰Ezjݡ֡	FJ!l3\Cs;S ]h׏p4֮crH>uG!WM:LoC_;:hpu	 qUOH"\d,2iI mCk}.IvIÖt1\.ꀙlE99!d\{	m[m::|P?yy\MDe	XoחMo?U$0@@	/ _ovYJ Zϖ}l谹?T]!QU;~FlI1x}f1O4=WGMR&BZr4z&CԂgPT(tP$H=A(&_$ ׍SrbsǸ+8236HjPs۱ 
Vy__CL<N"7DyμL@*XpTpj$o*u4{] PQ-!;P}uEYmcVvyiXDc5OLY'W9H%<>1>P!2	~蒃Ndta[)c{Xm4^n}$
etB@) `2-l6!_AF/[/c5(|Z&`/c
@0*&A2x+S.>m
6L"#u^loy!TN$x5 [Y
&o֕:|:?g&Y
H5rP~Ir*k^f cufnƐ>tar-x_uleP|ch)gbbqa;|BR)5`9(Mn6)}x6('JY1hp/'(xcvCMeM\56^lv)_B.T͇!yhhÑʰ-[@gX3,?1jVCx4<oqnܸzIE۽#8b/1RDԆz!uB0ԱlvO^],Xov>tZ :F㖺Ren&5/! B>k8T0L'D("h}$,v=kn?m^>47aGGOf&mI!L%QrhS|YIT
YXjAd!*=:K{Aa}c_6?7>FZb!ףN_LZ1#u7TLo'Le;<랼
C/|JYaI"9cQe-\܋aa6Q] I@%1c	s3g"_WTt2MCyOO S%!Q,aW={jd%CyݸV%|?rfv ӆ.3~?)r{*I"
G_7*ӺFU-#y1]B)*ksǻD3U6cwBBtnU~#PL3 	,1I^bpA4ּJ&³~Ea&kiE`t'+oT;pg1_6q:Jw !T}>=0i4Q<兮E=B/hSˈOz-[HhX [ŤȮ\UBţu%kcM`Ѩg9:f
S2aZIXM*q("YZbcs<U|3$ߦAT&欤xNP0	p3,g21
h56\!{Δ2@J<ʹHԍ=!E=Ȭfdށ0c(Duom⛇F:Xp 15<J[Y^2:p)m_:U~s^N'ޥCb|]1su Ϫ!pf[L.T4C+QoJ܇7]RB84J
Pp=4X8~0J扚^ޝtz0=	F%piz:~6ֹ6S]Zg7WIh*=KΆ(=N{(\x|:iJ 0[oz_ZN+dSSWB 5*)As4.:C"2Ǹ9
<8u!i8e:p0Ey$,zݦ.Voٹ{Ef˳iaE/N!TًfPVfHRa(w2Oj+t6`HӜ vz	aD?枎$0N!<ϑUAC敱ڗ䆓,HTf#0yگQiooo|y!!X]'/!SA~:{ \:b.q[m1KK*8BɌMo\B^ELYef1A3rmVk_M5D_c~wWcϬ˓Gv	)DYM+{7/_>o/aW擏OEfq'94z^aEakmo1{qkXYF߁ wGhbov^{/_MU"CO[	죽)':fN[W,sڽ
7!3-q\WXB.kO]
<q(e5hdb8(fiA!f3  !


=WOg7@W,㙕JBeG[g{ΏͭlVF6bzJZk TW/')6\WC%bJD iCkmmOзD'9?NR-, lSsЖPdtzW"zdX-PߠwKn蟞$WH9}LP{oԑv.KӉ'V/4Mh|CZQ9}r"N{+.3O~u(aY|:srGys:2at-.WW?z~LoF5`%dZ %ݒ*IG!i4"i'CQ#bt흞uOvh )%,Bߕ:R:s=>9۷c|rCqb>,hkɮӫ(#w%?/PJkQrCM8~R2`S$Cmq26(ɴ)0k<P"zFLvasۄM2lBA
5Ԥ'S*Raco@Ճ滯T	%
+F I׽sb`NTscnW
&Is5%plaTى6!dGmv֠4KAVdd|7N'dHKHjB,rHCmsq L7s`OJ& QFȩ҈NݹTp/CMێN=WZq>  ׹g?K]	ū7*DTͶmA;UMj0	NtrB<(9:}g=mn'XŨ;za|jD7ϯisx!iPA-t:S@8XRל#א:C
|4FPUQO"))TQ4	n^+󇛋l`n6u6D!1x |"9!DF{b~(kJa	A(Kፋ%Eg	5S=HƏuu0{<r#hhW<=.?aϒLUF%?옄="f*fjzG^~q`9Ou-ZvU؊&a8 seB.K]hZPݣ~L9stӥ8uQD$_.)coԈM7pҾS1߱ɘ >Y;K%TڴvE8\csX A6Z5SCaG/7 WG2d{zzvkgi61U^FF Gs隠B%P=	y%t`Ir7llTg/vGmگhH*~tDae74n2S[>c߮AD@xfEJO2$O'gYŢ']̓-	p=PuMuדp|Qb\lG|cL<@M@:#uYѭEo(|d>yc`3q^bjwӳt~Au$βXcw@c3qԅs;B]e[/L8 $Kte"E&G?SÇǾz7ae:rߩO=vw`4
j]S kO3 N]2JÞ&)+{1~2;tWo6YIf8Yܯ=!½Ei@!p9\@wHC<*0Ub6WCɭSR-S/QߎOT7-jEyAUKStoQN8{DE<.J𣬜 `
;u4bf.XOe:l&uwn/ЫZ%wS
¿M!S zgܼiHC+ƫRa#Q}ç[;Z!ZvJQ )k9mٹ3<{	bUzl۴@<77IH{8-h ݺ7; tެGq<^qItri<|%B7oHT+t{됎An5@[Af,XM#|1/S;ibt4ғ ]isCA5^\МE-P()MD.!-Hsx <%g)3ā)H-Ri6PR(Oi9}f]03B6WldvdvqyNZI^ݚitt|ﰥ-n6|	^S݀Y8=U t7eQ`={ڳhNy)j)j/0EmڏS>kֿ)Z_`)Z_|ޟȨkj:OXy.̰άx%GPc#z\:7"RZ30Ao]0fYN5o쁦B2#@  o#si[y8G-L8SLƨi6MI|AYM&aAx$F$_elk9"Umb[.N"ai]gQ_
eф OY"y͈:UmX(P[ 0c`t:&LZKg&4:mS艤~`=CxP1 nCh \ Mx4Os;evV¢wb604xI@c45޷\^0ǨD.NByaM.ٞM@Do:p=%.Jz~_sWWWy)239t$7pM(ܷ%GS 1:+b{D*N𽳽H:{LA2_]O(y!m9.p]ܰo>Q}׫'NvK}wtj[N':rS?"$(3+C>>_6 a>CCi,p7T/f}iql\vA<$S0atR!~SWws|0H|7i(эx?\n&ʟB9P}^Ί9'ЄA	Ap(0MA;uAedO[C2f$!'P~2`R8)9Q{c5̼NFTf`d0L	dfwM&fLhF$T6Xˎz2_a;,UyF%rh+ڢe(w?i$?Lyir,l9m 6/3ji8	Ӝ$WKhU_BIyw!Vo
pÒfI@AoQc-O):,
f|SB<Vo>!C^< v
\hRz!vqlbAܠ964y%#Ns<7`$ژ4JNT.b.)_F$ھC}CAl.X'NVbm36dYy2YA6=Dl)љȞw&e`ds4m D_am;L,7(OL;]-Ъ5)Z}=`6=1B`I:=wtxobLZԨ
jMSF!ꡇpEbx	v)INM$H{68X > `cBg7`O-v@މLy{UO"9R^>!%־V̂cR7;S߈C#w.+lhv5_[+Q~NN"11E9dٙKEFy#(W"eCa_/	Txgi-8]&"*`vDŚ.ܮԫJHե |zqUcGZun.lt=&rH_,!eIdh׉3Cei)m%P30<1nKA e}.	x(\"'"1q	avw;u35<	XO vk;NoDx{_O% Å*NO8Q$Wz}Xo@.DmM#Mh2"r\G'<.]F2v(	OX3DEFnoY3<_<0q݄DB)͗*A\[1AefcKr7gӜf陶X{1&j!|z(\V{QU"2]e
{fK,?Z-۩>VղgCiۙ,L	wע0+eo5no\lQ؝׵AflutI{~Q)d<:R
kU@x%t28^<NuCWr+)q1gw/.j&yMU8JoS=;2h+<춘vQ#<R#P6%6IJq-ԔhuUkeKkWWɖ`-{ٵoJbՑr܊iobNY&ZVWtr[*2/noݣGWdm\(\9U^F~	CʲUoPVEbn#'udXR)<C[]<:Trd{mY.4׬TJ./X)%Ďpe\$zbp6	-:cjftj]oYlÿ5slKwl9Z|਋W?4ѣNO҆ȍn+[iffǟd?r?9}f<1Kp%dn3pxZph,8(t0}sRa6ЧHg,k_nжEZ9ݽ[\͒ҺkYXG-PLa[Hl P֋.uOfy*#4 ͏AVMp=rG! \S&dpIܔLz(?YN	-Zۏ'|a(+mZ8s2H5.ϧ$uNJc8c:"p:R&GdL9 /
fPҷVqP䘐[3C7E9jmRr\Lvt
Ep2'<>@TCv7aQ:g0!V.SxlF!fb#(	U9mm	kY6t$dʹ7Ϛ0i<=<:#ΆVcDøW".6.#[7Ŷn<Ԇ){t{wLsBukev,m~HW׈WO8Av8 I#Phm1lmd}y%Q<B5kuR7lhF{0@
|zS=byG*7bP4^yieeONӉ"8q&>5.bt\l]p`71=Ʉ`]hЭ6ۻ ~$A%p@jFmMh3wk5j$nACf8[\EBVP5Tfbqxmlו2Q:=Ƭ*.6{ِl/GcIetLڪ\ Yn.OCqFD:j7[dE^:=rz5S=Uq9!ޢ)42eIyRq|@	\BD6kߐ>Y,/yB6HogpoHOϋćќp5M'&wc6>z+)?"$7W
5dEϟ?]+ZdWp}6{?4`
X/a_DX{rrth;Z0Xxe5׾x Ssq;<w
ߣym\+<޻7\mw_#oiztؕiE%%`KPN6._.VA͋e#UdBmjEv4/{SD#G/6]x8VG{/6\4e] 5!tз_1П~Iҳi(Ӓ IRkn`Ƈ57Ȥ'MTdg8/M?if<PpEK_q5V%̭H)uA]$  -;J[\L~I*$[z&Ʃ''r]Xrb'+`j5t?332c4oƳVe2zX >Gv!4j5j@F=8;:zNg>OYEz^Jxopȸ2PB,:NQɶlk3<>ˌ~
HۯI2	;9|\F 8]&W逫~4Fe=w[N& ,{@qwg?}>3NLm}p5&W0KCaT3Ј$u%0{aYd:kNTs&.?+j*ҙT{I)[@v(i)ͥ"o(p4X׃KDNԜcȁTr45X󟂊O[g2x2]ss^D:XGM6M@EuxZ?3+J%x\!$lmr+b{W3agɻgO􁷱7ΪGVC
D]Qzt앿dNjR*ĕsS7`;IT9"v..l%ט@H[L=9
P+Xgèպq)\S2OGdhA~w[9]H!RF**Xv~L@)U4ZPvIj75yjWU2uXRblᐪ8!M<)N/7ͺlşlIPSm.,G6|}!4qÁ~?tݕ%wIMfT0RW4p.CD.nxt:0z!)]Lwb=*Z]3P*I!KW鉸`1hAyC(V_BwɞcCk{3]EӺLy5#ŗr7_H*@3?z	ė{9Lӎct@1:'V[vͅ1&weT++(!Nvn7~/$aR>X^M&3勚zʺ&2Z+/Βs#nzJpU"xJr";wBhy{|!t4;w$L²s9I $m7Yy1Lv)!ylcCY/'F ǃʰ~˗Gw:۪HYcܱ#Ms␍R}rko4T6vLvҾx%
ri|J韭!A׿hj/<aL3Uz6fs2#8%H%
H@1hpÌ&mX@!86-k	400rz5͐&akgRfpVZSޒwwhӟY+՚Pwd6GjVY;n57է,$>Bt+c0CC.WsVpǹ"mPyGwlJ*_؁ARNV_ȵo@7=ޜe ^㣆%>T9̯¬shϲmz9]rE\mR)z!zӁH}܂DWIð/r6!"m!d'j8Qd|$)0xkx٢PK*6!4& @w٤vsm'rrTՁ0C:7G(G}X:~G [!=EJb+ޞS0Wp::R+ХߞL<-Q240w{F{MT,G х\?JzM~UޮY	?5m9_R5N܃R.bkk[(D@V(;I'MDn#f;_\aT͍0݁FeÅVZ!_^"sƄq vFLIhۛ$běK~O ;f3+6#7C)HVلuf109J	У Th`>MT	)nؠoJ<3}cQG+@*Cvpn ʎOw.cp3+7"dZUJɮw^MQ_#R4tXF賶5h@vB0hMlO\}(PPUuY!R[vE,Cozp8f3gTko4S69H/Is>Li?	(0 xsl^Ak3Skӣ-%8JdC5,yqիu&;!٠I >%BY],f;]nı`BXcN%T^l?xOco[T9f=Hsl}kÀgnd@>gwrڴ	C;SAFB^`KگPסZmJt9v?QryqZtMY&6pܱ,@nM[F$K8ˏһ?@CYR	IX8vxg1IRjxmY7ffsa]3\R"vgbO$'ݳ'{8@^D:'#AB(C2WeiamRRFR̠ ]WOc $8I&>(X&x# 듣yapI9  }X=ۜ7Щ{7GՎ[UUClsx'U@[nX6&7vE~GvЊ;TjWyۓ1՟+QEFL!+?hl2M\殝:+Kg..
<D{Ia),t@y++!Jh
H6cM
0dS~ꮞ=sOI9))cٸ9Q%JQNZgxG$#'Pf*ۯ9S<)W.U%yip1q;39@!-zKjV5 Oo^JW#S<+ ;[I- mɋpB!#mrZ)-M< ,0$3kPmnӬ>dc?Hk	F+#}ƒN%TK:B΃Cӽ mGʻ\a
}"nmpcXn}$,8S^@@)B[/eXX1=6kYq(e"CA
04ߡO6gƱw]p	|"Ԫq_tɺW:x게ue,ww5|@Q!B#͒iQk:%~eq_Y6ktjѹj/4WAU+ % p;CsPL#3%_ &V]}S>vĠM+a)= J)2y֣N'X.|4m?|f?ʍ2XU%G?0SS>;kg+"/V},t
?D.Pt)eɥ`>^^<~y`ޥȖPk+_W?kH7bgSY4x^hx?qz4ʽ ęVi݃ȃx.2M'Mf{=SnɭH=/ <	S/#HrixʇI#ѓ]?xiy߼UZ̬ldV%D!o4K;.F'݃[m#x!8"\}kPnׇӛd"C'YivGcTx_-
nQP~vW%)8\1Z~FK۪O
̺ᤢ4Ny5f_~Y-~ծR5Q$-.})3Pr;%-[#2gomUdP+Jz6OɎ4}H9:'ׯ#mv*3O2UeT&|IMak<O!;F4[`Ov:[Rqu`o'^/ŵ\S &ݬ|?+ 1Mu쪩;(\¯[Y?zk
Q]́ծt/c|<"-FX#X_d,)VA b\-Si{5!b2Vk׋t
RIv)Rs|;O@LƋiTeVeYd/	kQ.Tl9Z
4D"ȑߓ4b1XtؓzuejxTdk
r JwoҨ[40ǟZcd&M#ߤC&. d1;{FThiD 9iĕPD6xn͎"mCvaV06sԓLo\M;6XJ0JRtX+CWp/*^ @H)b0Ns/Y(挼ӁGFf=>l=:j[2RzBTi GITiYYm+J'[WO &:|
Io!G?UavЅquz9هB7o<|\*kpD,x@@Ci&Wď`99BBbcq[5^ޙٴJ>zfZ,[j?n*2@b~og/	Pp_~2d	(FфO	ex*>wsEu%KoKHj/=DGNWIrxn}䱏o[A)}8!WpP({+
gr%wl$epӷ拍zרi$KK'H_pik&\u, Kt=M"MTnq5lynA~sSǕ9MM#a*Ӥ@!T>f꩙WK?7o/eT{a5 u 3sӐi}I+N\F5pFrTb%AІ5PiԙSy!;#?dw-@"W䘛-Zf<gpL
39 Âxo9ϲz3Q2T-We?
B,<G^Np PH=UR;L',ؐsTcs=;E3ųtm,zs˩J<./<6޶|mʋY[P*c.2SGL[`rA٢:2bClI<@X潘novRX!U
dl%hQxG]A"H<kQ Jꤻo.U.W
A )hHf^>@bꥆ̭/
X.CoX@_(J,3Z?k__F7&
|r^J#UiY:AsOHG_1]w<@5 7&;H7cCtǯ)־;z۶qwkH&{@uOx%GIJX!`h!ʈ`w[CRaL"尭/R'n4_'Az6wI	5,h\R5l؃=rNy3F3k_ZHb^Rl|j
娄*0=h(|3NRz5ڂlf4x>czYL;j@$Ĥ,gE!99CZѼXq j>Wl{hX"OY$pN^@]SWa0uPy`.^ʣ!_Ot/s܏ܧuBQTIDAB>?Jk^BTAN7ě&Z$SE<jq!i\֌<F-Jd0D!8$7fپdss6jTApIdP2;I;S2]YQ8sG@N<#EHB4V
i	/BIP|&:CO2sh19d<ru1lJ}/#V>AQܜegqP0})#y!75V!znc*6YΏǜAsqW"sf5n6bcK.˞*-]e])rmp7po?b_"e@uBPsEZw:B[x,U=mP'*?QQ
_'+gbg؛ΰcϰ*n> ZYznn>p:Q?)S	BX~ogx CGlsޟ9m8m	K5i 	sOPa0քiE<p5YS)A fo3
+X_uUT?UQz^\4ZZ@~sxDVZ^#qC7N[1h(TV~wgGmm+1D_ۯ֕L\p:ъvrzf^{_ꢡ{*ؙRs"-VB|P:8DJEkyuڻ&f4^V+B\vpӁ\k+}PsdBzIB2 \g"ж5|T{Kk}.IHԠ';5e<&'V0zIVij.NgqD
eIR6@$:4җhXH	[Dl{!.NoۍoU8נ|	V13f"P+&r:n?Ϣso7 p$sOS,9,dgqt2^|x/5bTIMáΚ:
B}b&hS6uo>%yj\:,rt+:6,>dQ	u9ls++]>PX	ADQўG
CHO|Gֳ:缢3׳X#s}\/\^:tx^J,3@)%y/C<ګeo%20?Ex:#<E$!pyiVExNm61Y0pTC:{z#+Y-~&SLA2^%E:^'0K]rPQP6F440}hD@&	:7&Oͺygz4;sG`K`
+6g?--ޭYL L!sŭG喙U	jE#{G%^?,l(uBa]TzkkZ)*g.ޟeݤl	,(g2Bon.$VrMuQ0p!B6=!MM6igkSK:C6c+BXm
@䮷+;r>@&INhn@loȓ#h:ߢk5Snohΐd'%9[
a5B]&%LczT[>
OA6ᆷNfq!M*5Vunsa1;+q)}S'2᫝uǰ#X/}vXfˌI`)gB:G7yy:ue y4dOP	BPQ/	]"@;=i[Ώ'ϺVrgm(x? ^ueAL'0(hvoC#MbxV5je/d~ћMzȠ yO̦WjW¤Y[>{	V?,c;c)О҅59䦼'P,AEM,ɨMLM'E)=pʭ&7AA2@A.9y^f:l4
yȕ+@WC6:s=6X/*P\zȺPz^1.yi!3Ľf?08|;:o>兮Ge3S8Fvi]ojގ=*5xvaΚ|6@ZV#tw _
.2n,ǴY C*7^ '&&uRro6}whEJnuŕ"NV((A:YʎS:58F3sy(rpD3;kv 'ȧ7C󟕕O7kf:}^+)D[+72x%Bчkz-/lReW*f۪Y&0pvS[:V]1ո,,~0iD~E^Ѷ.*ͧoTdvSH)& NmQhn8*Sn0-Lo{GG';[$6ة=>olA"}_SoޡTARӝ*Gy
em⡡m[L8G^R!o5$|Zj9LFBKѻ8@a?TUbAQ&n@%Io_'w$ԔEs%K;/*|
zE_qkkk+]!a7q b5ȮRswD<-d8xW M+̆jkQrL
hNoڻ%.n$_bE!
Qеt3?àf5cU=wlt[7rؙ7Vg'BDZhu4YEۭuW֦7ki:vãSӖzN41ݶYf.CB
!Iv^GtSv
g
aܛ<;H Fk?_tWvf~y-5cD(JF|\œr4jTYBZV/iK0uAzx"I:ӈ$j~;<:ipfI`@='3rr`VKY`Dbú͞h @UDRe4~{Ƣ%@dAzº77U9"R	 GQx^uJ!e?lUR/e_K5mHEh,3륉D7VSTJ{m[d~QV̍Ƴh-l:N=-F1gqC<fq/4p0%9?~
g&j}/ds"g.BUMEDN[lM,k厗;HR15X)Axl
	8[*{wm~:,H:YGNׅfzV9ϖ@pj)W'3|lЇ-M$Atm/&IqjD"UFrrTr`nʣ3Z/מ?50r+fIɋYpպ&K@<cQٟlK@ 2=s-J15LB|/n^s6cwF!Lvl"'Q 1:4]4#uG!lE~-H'[3z<F&\6i'`2N{&1Nzq7iS
<<V;c45QrlKC_hÚAqw"Qh-n=3xcC^^z<F?י( %/o18x<dmoNc6:^ە*'h0f'bc\k$tTZȐ,q]F42"VIȗ28BmP,dEz7y7ު8+fsfhiQձѥ)
/sVRv?m}r䀹*8AXA^|nqwJ׆E!pi߂QkQidGcP%lF{f&k ]((Wʒߘ;16ڮ-Fض о2mS4+vwG?3;FzjR oe79&clzlV\o1H}4V۬Bʹ5P3kAh*X+Ы\PW&hm{e^dFӉ7nN8-_9JjYZUrfV5p͜GsC`1c 0*7>rkg1Jz	_dwqkui4bs@:0q()i#	pٝxciـDՠNk*ZfCHR;5Gr	͇*c7,&_oM15Rh;[Z>Rr_ޚZxYߢ=L|i<<})V./aa|ayW	y𻅦/DerXtF]?zCcoj"Nj[ŝxHj=?⺅2[B|he7|
{?rS^H=wP'tSN
SHm_$>K8. %W*}ʛ;3T]\'򘯡9g9R睴</]Yӯؒm%{;N?er-&t:O~;6BI`Pa`*4{21?nV[bm4RѶU,-v2Nꈝ]&m%fuD aAjH
J3W&x7` #	͖f)|`S~LM TR11	w֣K	$4'A[x""+sbm%~X(fLp܉YKp1"hLxb,eݨ=87"V$VS~:yO8څ@!FVٯꦱa㓄c1'&pf`"J
'ݑ1T&;{LT'0'ŧt4JLBbR{oafPCpU Q5?[N\ۉ+8QE6`~`ӎu 1(HY@@궘|f1%k+S҈qZeMGTdNO^rÍmz|ݾm`X4+$ޡ	<'GF/;f$Jt[۟&P:4$M솽Nb顾9R'Y?:a>ņ[MBUT2),s!MՎU7Cs\yy2gg$vyd6U긁r8ġXFD6+7T9j/ձi7WOh23oQ6AhfQ׃B/g[o)}eaxztrF`l؋{$L:#{޿o6vFKbYd9 c+Al4GɺI|N*v.SY~S/TEON-uk[.)\ )W<(hs3az;/ӻr
|1>RJ)MT[ŦN?L<R'hFxT433-N/V|q+PžZ?[`L9XVؔȹa&J8Ekt?Qs%,I]6OF$X̛26	/˯
ۑRfmYn2]%7o:aGf}fzb#CNW6_lN.
@yBֵr,6_7k/Ǎg&{
dK&cd]6rڪ;=045Dsz]Y'Ν]Eo	$횓H)[:{ɕShH[_LX/[nd"5)8$.i+67]]a|!-RةPԼ)\N%s&OЦh+t4qXp  >(av9!Ҿ93cWZ:A @19
9xkqCPg{eX1e_^`e.)ܨOI|Ûou02֛x\НJj2|~FLA1LUW7+] E(VD {k?@V	nM*Fx5i3'8fHXLvߤcV} +d2C@j\K_Űv]΀%iFQVư_d4p+RJ_J03sA찱HhU:~R=:P^<<8`cw*&M@qd7vљ*L_広fP}ruİG1b.tt@Ixb+SU=2QDŦ?'xb?V\^Et@sjKso@	f(r qRXZVBgm*2TL0IEnm2K*7[-Ӥ)bgbb"g) j)F핖=M|M[ec!Hi;z9GXeQ49ϖvR\a;m@UJDmaIh6sZot|ށNݴ}|ɫLJ udji?hFB SP>b#eJI
]s"My
EB*VvJ⎮R"4zfۋvmnW2GQ|BLmS^6ּtcUss͎|cW.5oF:<ӒktteE_V<9&oItjw~?ִV$XD{2Cy_S3z%<++X-Rk%8ksӧ87jX(YE.  $Ч
1Jy炓J7@@1~^Ԯ@	ڧP7z(N`Iꇑᒇl/hJO'̲߅ njNpkLϒkG6.p䀷2e-D~`. WTO@th?><ި':5:Yd?QP١[Eǫ쌞J!1Zb=jK=|tMcs-`UG1bϖPk]:nvEJ~!9Ju[JdV$#8 S{TȥB."lQn&X%Ic;v}eD(	
5)ntHbR23A{-qrg|Es=Z挌+<yvHe_Mj(mqΕx3Dr@Φ#c9<k75td˙^oM|UI%v	KXf($*	4yj:h`Ve;C˞C3$IP|XQJܥhz\ϯ<M'ֳ345ߘՕ\ ]#2d%EI1z^8}֋(=018i6Iծ?k!M$o@ 5hf~zN>;;c_r9dEj}Qְm{ލ;aۗٹ̓@+,乐W)Ԉ<Ms`>0?zk6n񕌖VtXg2r'(&΂e)Z%bM6;-kf$un@b*JuθRleFF|TsVc}ͼRm*cbpָ G*@jƚ]i#t`PFvK14c0	z*,?ʴ[0
Ft?`͠}Bg1Uu1xp6tP.WW^*lޙd2y8&jAd{vc23q'fZ+q#jbF-Ty 39?Sֵ
'Y,y3+T>뜥P
Hf,L*g[;9	[e1£XAe8?2;#OīXDA6{g/n\D_T  CѾm
viTJXGI3.߃(`4jA 	]cq,mt1qkC$Tػ$yeOze`lˠo1A).O=tɬQym"h4~mg^7	BdAnY"΂EO@E67D{=14é:huu5:=:۶QD.&9凤,s*K:T^zL,1Wqr($Ǹ6HN)E<3$0EI҆`LAxD ۪lWqldo>XUd6֐p2s{<©#/\XeR5T˹NiF~g Ջ冇>H G>VF*|m@(ͳUrү}5g|BbYkW<?A^.X']]ry.s_hh:FumB2@e0#WWYqnACvSTh ^U][ `-{5,	%U'ݭ}akV#.#gIKs	#EpDЫm2#n>)@^T+KOI2"4614Y&U0B}VB]^s@Wߵ"6e}XqǍ/ן?_od̯Տ~ƂRMI7^o##?+^3JdoQ`q_NW^M	[w{r$nӵpD/."y0:@qH7F^$^Q>2+S*W3AR ňV].]x:'|g s}.B`l餏Jv,6W8>ov߿Ys*kE*ouU?xu.̡QpC}C+˭:|S7&*Z*$oL׌1Slv	hԼ^Kȏ^O}(x6)	|R!}d_h%pR-P #s,u^ٱeܧC3eUUkʹ~xt2K0֕
ŕr>V7T8bcG"BOE$9|hZLΘ+ak+Y!ྣw`.WR |'2lS}`'rHj4uX:51<0#"{O
*=>{ht oa&xT/9p2M{,암%#C:熏]b'kI(j[Ņ$2Vs߾qEf; !i"5a}Mz:sQ4DQ"PD 7ͺ]nvAOraOmqghRM2.p0kFۀZՀwZxP؉ 4RjN=6^@s1nm$	@Ap.w^4+}huSSIỶO|ŅS}mm@vO[@Uu>8R7#^e0}={8No}PK}I?p-hd"(,f^03.մ3<0LD6sdV0FJ˲,f  DmQOb=eA [\U X~T-&G M vb5Q>a* `7ھDq,\&/`0? }_	}*a.FO_i'i9p+,ZayrZ3ۂx/;NF&H90;Tр@  ]zuSv!\7yB|f2 t
XW!xYp[)|qrd3\3⊗x6>(6m*0?#.eLP]"0 ~iᕐH<ܞw6;{ZO0wSsR8jAN0th֑-r=G.p'{sk>LUE͇wU%*︺s۬q#&|-wMpۤ_$B4Iw1;t.qur?LJ m%NIo̎_1b,d&CQ,/sTދpP^~ #AHg6L$\?A#:fOWMVUNL~cXnY1sfSMS{q&qD}ӡ>(;HC(L> #GۓVS lXz9%7#'RRݢqI$tp@,:ꑖ"Z--@NYWěw[A;pMVf|{NA9_)"(rN{n74RDzbud]S2pn5Z
8eJGgC!z^+C:8B(;c"]XKMe^n@?I$3Uʂ5`i}"s":(%'uYh@ǜ >4]v&9V˖qZOu'C}M2Mg}WsӜON_CMxAYRzȒ7."_90h!%ЖȚ]6Q᤹Y֚I0Ȓ4yGhXS[Sv'?U0#-Y#gK'!gXQug#AE>3*KWl-*j-'bv`3Uf:AWO7R0P\X̧n:	Q$\jh*+;BP7t
ӊķ9=N;Lʋ,?"߿\ZPCYڭ7^ЕTKl3LabPM:vGE}!z
[;J+q,sƇV6_Kq^GW)]+b_dWk[RFUuՕqI/j}^/_{+?cN~<rGWO Lsn.Gd
YxHJE\WFAz̍o`y+X l%"?~%?<qέRA+^5[rBFcƘuӚtEOJ,? RZhXh%22
F:t3+Duo@$ ۅ@@ӲW{,v]Ax|rDFA=2qiS6T-vd;փPXԲ*/{;nhUtlhZ5ϜAogܥ%wlbh Rg~M.=(zziGP︳D?:(<zCePɊYh|q7&Ӡm\/")vo?6ZoM[27WWÅGZtVRD HAEc>|~t~ewIa0gۃ$o'I3|VK-W	p{pp8y+t(ӹE %2 0yVA3
<$(VEP~E4zȸ7jY?dYt^p@ZF0zdpgDas~pbo!RS"TcN}FH"&\C3c9>(kaE^BAj`#:s39݃lϽ@`[ZE@>|<2.#h*{ :&_Yڋ47~\юv-N<M
"i`b#SR5.4b֏&|&&w(75**wx-fMG]y§A1p"v2fEPb#ufE9}΢X䭹%m$Oo]4\^.I;4<܅)3C-SSw~ P-I]ņUl2nzn!$.-867]d_@|ߦg/)57u	՗72TeO	l	3Ax/ ^^J$Qa(	-GJAhKJ>Y*xL<*uQ%rNې=k^تMH|	A4E"ni6%CIdaiX.xh7H.k4?iN8!26! 2)CKIzcW'!8ɪfi!(Nwfr^+ϮX0G 3Ӎ5T6%9Iyaa'!'fh'*ψ5JqM20\gz@5uT!|n$E#L%#жEz55Z1h{$2]#/FZ9G!4MHgh|ALZM1"ӹrnc+;33)ԎdxNstQ~c8j[t  "umljpO'uyfw"B]餻:dTh{uOh'\Q+DzC{YZP)6:?cwyt܅3+Oc
CBp~jvqԊebLPs	{!X(vB'PݨI)F!T1S_@y=>-m_	Nv3{	i.w]q 75bn`n[UGlsgHΘnt՜lA|ӡ
 Eט /Z6Lqv5NtL6zlgG`qӉ)2}YJЅu4N=phMjNmkvƤb.3ڛ$tSױu`{ RE7Z$!5X2庪n7@	O e]Q=;dHx3<8#.@U`3B)+TuprC~KГ$:qan|;<q||=v=\A]iE;䚿 .tԟ-?!⍈qh}^mpx,V~3C:OJ) !Q@70"wo*'FWYTF/`p?iGh0DrJ;q;\򃽛oqڪ&3H*Czpf :ܮYY y&^#k0ِSK+;*oF5Q;.t'^;UQ2;33*쑠_t잜\x @kbZ'̥4O1(L[H:%6HZrx2x
7;b~-<Lda&+,JRSP@1
&yj\>S{Xa	ִP|<AѾ/ӝu(F6XIOO2A25`˩iaX?qoӳL<L׊* r:X
R}6:\tVџ	tv,[~եAF:IdIzSCgt5+Ǧ㝋iquv2_V	z{tƹtGWboק^뫂?oE\[L0!:?nv<U=ޏqr<NFTr_$y21tFUGFpRMP<RNfR4<iw\cc8u.ZI?&Ֆ~!4*ف5%V
TDc/}) QMy>]){<sTbu\NPg~]jzz	<;RY}Êw`8F4`<ho84LiHUu'b>c]V0`RUt3s!侘S8p˖Ԭ`%V\ *.e/A6gfku*WV溴M魹  N痝vfVld0U\SޒvG$=$bZZw4ǐ1P?N FOIR]ruF=PBEME$u};r nߊ聙%rE+ꑁyAEO/T3bFkX؋iACRi/>nƝMWr¦#<
|-Xg5X@Y|N$z%쥕i"%4LKPnd(N%;'v"F!o0l?)-Fa	[isEe6LbP-6Ӵ;(Y,7tдU`,>3	'W~*i9R%+};.VuZYSιWyI- 'w>`A,Y@whyY>%iI]qBT`Ӏ`W5We/kobUesO^`.fl줻SwgC	tT9~o!#2?+.SeլSwAc͠"\20/3--SSKbSqt%:SqIX
KLs8**͖^R6d/t6'cM1W*R0k4,Gr31*N{:a#\m2WmV	0*VɿfS'Ɗ!5<))(FқMDqv@5\*z)ωLɛo &-H>h&e
0:RTPsnhJ?caȆpR.ni{6͊#B(4p/aHC`{>X1(bķn
#BD0s&4*C愮<9ҏ\SseK5
eR
'~J0l^<d1I&R͒ Η%mqTB٭gKclazEgŜLg8H1pe	6F#37w(~\i<5'B5b=}қ
aad@ c :v)(B<BP
;ʍu<E ".CQ9Q-ޢ`sx0Z`<]7*dt,z1_GCJR-ўE$t
HVV{VRUhBxpm0/rK_REX(!"eX''[Yafs j霝>QoQZ3J3"0qjO(K6;:w+(3w S1vF1@fo'.K[OPDɄַ=E滆Udíӟ΢%OGtO~ EB>]67Ǻ{Ve^Wp+Yߵp#'6[쵠>,+)/v BT؛~|LX͵kh]	>-7*UKį+LGm=Krk\Q6mgr՞	|Ox(Sɹ}qD9f\s+SEq(u|J|.٤Y;hE\9UC]GBGNd}d4k
%Rjc5f×x
CHzt(뭗i>o֟G[9EzʳȈTRWg\n;,B2Y5$$Cog,H|3&x|{QO'xʿJz2M1`_y˕H,bzDH79ՒŖ&25~&5W`䗂Pפ{6^A>1/.~z~Io[ذJ%ptL FeĀo,qdR4L*+%'5Z!7Eh?L\Yy-0ԹpNe ,p ~qRZ(Ճ9nbjF*DzgJ;jta&h7>\کCYIVωe0h<=H0`H%/VBڈCS=,-pvb[,Đ'*kRs28PK-ox`U:iaѶԸ
6 nV.`6Ǯ{w%V[Ȝ9Nm[:qu) 7f.A/
cwb @G8ojE+-4T]vUIl$Evj!X4uC(ql1z A|SwCw\]noN5̹;	M/oxR|Al˿[jY6֭/:2U^EwVܐ15|"HQAvKw_MjmŋPi،n.o_a=ooPT+ڣnPhܠ[><k#Rj:d͵Ԉ25[um2*.N7b
 _sVzN.9Tv+h54m4lQNKrMEGM߅R,o3{cmsX+g2/P;rJ=	"MRH8NtZցIoPvI@LT4%YI.	:yK,Sv:4;|YEO]RbsզEDY	wxl)6JK</Vl^ o*LJvN|p7k%A)D
ιw6r@؞1o(8s=8v;E¥
'5wI/x!kO8* 0Zk ,t5\t%"!9c)Iyw	D#$4B^K4w x8^M,9,׶Rm4:C7K:QKFY[n%
@PҠ|1$de$=3ů4Ǭ@fKPbMH1ozI2tI&W[͘戻0Z6AEo.6ڒcoo]ls!yHOP̔6Ax\~l8ũ! .׿w3?cQŸj6^*S_=?		*</3u/~w{Tݧ;&{ғQ:]@>tф#pg7PuTWa6( AUUqTjtq^I%K*oVVzPA`ң[6:x;1*f f͊HݶwSNYNI <D7{BI1\ *剄LnpuiGHJ!\$*5:߰6ZlFmc5mΚ 1ގ,Ũ&7S'*4Gn0嚮Ns!5Y-ާSϋB᪞fUvM+.`n`H `l
23%	@-,@5Ղ]c^E{At;=龃5_."1^mbiswϺ~vNO M/hK #٬a]5)] ldģg(6דa6aALvyb~#F],q-E(<*vޒ>\fk-4\Y^LMQf_wT4DmhBtFi̪'#94?tG.%LdyĿCPRQ* '_ȍӱ6Je(g!VAqe5/5֡~.gȜ,/JLkY~8R'45؁U֕?9ʹ9aw_o=:c8ct3_"z>C'v}S'^yOPxUb@G*NcIC8Y]m$Yw~EgG#]նqf
U5DJ "Soc"vDF
LO2#;<9i/i^IQ 96Tb9,-.O<;85M-XnϞ֪ޢKFBy Gityt*$%jUsШj|OtE^7W<K
Vƭ:XqِWQY59gs)UO:aX>;&UgA9yO7z:No+^jƓ.AaNЃCtuݱ/")וډ|3'C,j]TœM6CɦYU5?5误6h KnFKhM-Fd[fN9J/ӆ"79arp~gΞz`)*0hU~ev:;8Zj  MedN=*ay-N>\2L0qbSo|xkZ$<MYAlF:v;ImZ弢5x~0ήrЭ"ħXQ'j5P1Ag'v,N9:wf>U:~ dINne\&@\äD͇*-fM׉b*3ix3qrf[?&k8U5h}kVhiۚ"(%˄qDf621pIю&߭QiU/,+TuAzR//]Tg%:t4 %O"楿9;p4W*Ϯ+݁VO/5^66/O:'z㤺chg
éFڵGp0-tpp=DwcÚ$WN~pBSpqEXyvgx/&:~;ZEc)J7^msျϓ8Ak@ۓh}ke>q{%WRyPWM~' D"mmLp_G-]3,3Gdm!ΓlkE8_z`ziI@:B>*H^톔v]qzxTB

-ڈB)%-duWWǳMT8J@D'b@+`@z1Dk."{if$_[;l3=S" f/A|>jbjYR_&)FI%n,}?m1;v4t074(Av2\f:Xoo}5He1mn2gd0+΍P#g;pԵF^RnɄo!yaL }! \Ȁ!gE*1t2B'|D)MD.Ӽ)Rc
gQxak<djL_j6ogCSQuV:xBz{LўFnz?o~8KZxÍ֛զ0ɓޒL,dNT59O"nfJݛtd 3@	,)3uʷ$gp)ZQӬWtw4I2nJi	_@هEBhxylQPړ^`c-88@k)qtSSF1&uKV;K{R%NbB5= ;ùjPXfٙ! S' e:lx%Ls6^u!e,D˄$gf'#o,3xM[ӬjZz͐hMt5̈'`/s	pXЬiS`Ym˚7D%R	ðJ'P^aT+gֵ4\Ns]/,O΃5ٶYBg.+ԏY.l=Ao#^uK<%?[W\.o+ϖ7{ TdڱQgieP<C5AXH{[ǿ3߾
B;oBL)3_gchb#ǯyU!/|RuCPsSދ.CY1yy96Rϧh3"ぁfQ/΅ؙ7d1`K`{f%9i x'W\;E߬Fr0K~x"$nqo`aӃaie5ӽ&k*Pj3<'8r%,Ctܟ?6!Y%;;q)l_#<%+ilbˣrb[kn= .G IX5-m'`{q[@a-mAMRaFei`gW/"tk$@,e7tqάRRZA-A?m`RFFc7"(ꑤo8#mgE9?
Ot` #@t9W`
^+$S̖%8򘵼\TxQХGw{ug [9Aݾ^v{	Kakۍa`}Wc=B AK"atlzs	}c#o*=ˆ|\U/I	h(숚m~66/pL0~UBm =ĂT_g6<Jٔ|ΒNSk`@,]2\9
ƒwaW^N{h5J&ԯSM.9=|ɇ9$` 3[HcPY4O9@l|hfba+SBKD&v7 Ŧ$ϟ.@Dp m e'k;BGu{vXlJ%BkVY>/J`3JB񓅲>:|nx`KfC>AOۖ;yۇc@!&)ňMYOS1'-8Ct_OWfl[`kc<$X_k7&-2ʍj?xwm&J=JYH`
OQ{EfP=+7"C|-b.x&d;;E)W>rg**[%"N|~ahSfh3X疀LUvcN9t0<1߫^'ÙuhmNz߬9%#5cXh&b{U~4wVSqafd	[ZTy:"L"c
KAWe]Yz'`)!#/Ci'|/۔h@C"Rx{& `C
'zնdo7a-<')!$[)|TF.{R;w>W<ccs;p@U=|ΆL;;\;ec:_||vٵ
o<5.V(	U=;X݆N0ΪhnntWeJW벉%XkBL@9L?0YdK[=| ߫yڨO7c2? QǼCtgA0zBZ'b`9+[/USUx3BF7۠jԱ_j5LQ{4vPe_	D@ԦKN
EGe$iu#3Zllv2ȮaI^.瑶'~HC}2(?KH1V'W<g!3pZ7Iacp ,e$uPς_a 5v \<3EG;Q S}M>.}ٵ/7l}OL{N0Nw5Sώ,Lw-~(iq(ʯ~4$*h45T*3`59neLa8/2<V_$,SPc꣞<AX"J%mk<% C1ߡxBm"ʊKr
]A@h(J*>tvSln{	e[MbކU_;yE|9ZΪ񂠟]ͣn7"^V)T(=9٫Nl"tBGւ7];lqy_r
E$"+" $L'Yz(_/'ٲ8$"ցLOdYʞ{}?(ц^ۇɳvHW*DX0[^z!pʺfǯܬtۺ	T'\w~bҒsc[w+p_.Yٷ,FլUsL֬~m,:q{n8.9Ldx".`mӑ^hKc8.YUg:E|r7d#GMe""b@0Ksn;B&*+K-e6	8#&GX\;&B|h9+_G0(ٶ,un
ى`L#5|~^V%iTEhͽ>WU4
h>6ZuVKRkͥ.箜#&Qtٯc-x;׶ՖE"$CG~ܷѝ3mw$4/d.n\qR# M[⽌o~',(ju44wݥvg`Lki7]R7\{|6-DDAҊH\q<IF/bm+/#jS.7]z.6,vcpc=ysL*==U
m?M!|	15'}VRtD|C/s@+Ӥg$^!dN-*L	!T[̏B]Z^ Mi(x#얎	;_pލ*o_ϘL z'؀EIpO<h(1ذ!I3)SN[ &h4zj{Y0m}dìQ$x z "D¤'Dfʼ6#cOMq4mMjV#P5 gdھXz6;aQZ=+X̚8rU۬b|lW`!ŬhFdSA)֛YAC½̓z2YCB6?XV]'OMh
		&HI&>T2/\50_dj٥>Kv8hyqK)ltlhGl|i'o)faJE!Ri@	Im)y\}qQ&7ATuIefyO8Yo|x7[Km35@Li]Dq"^;{ 	П'o7	";\g<p c}ni(| mI$Ux3ݫ~H'RE7C$T47Z:Efȧ"nțz	H{	:5l6H={U7([W:gk`WA6!բ6WctPbxUڜ ђ!9BCp9Wc4Lu!Ïv,W'iLBwWl  o`AΦ!A`\,Ȋ@#۶k\u)k0]䑁+BcDZ.36"-q8^[omI|)6(3:f-XV	n!]؋_Ǵ!\[X0?;y/YWM{#ڰpFtu.?.i*ѓߍkkFsx	Oem^(U GߤP =1='fOe&)<_C=]m[U!z΋9SQ	F^{ʵz*hN4x_OQ{ow{ kٮ<;a=ONN%D`0P>%5ט\#>Z]KC;nd6^w}fNr
N_4oY0GfS*jƌk(	ZZge?`aa6˔C윌]u!!Ƃ!j&%ꆧWݡӈA35,s̯)X`zE%_䅐=KEwqJɕǋ:TxV:FKA:%J Qb^5g#KQrיE؉ ;)B&^:gSk}ΛY4('PCX/zo(C:ŭ
e쑛@𞚹+hė[yjz^
sv%箑	,EW%&$fQ11K/l2vJbD%cBdHu[+0d~ET9=ClqE^$XM'Ū#0QeKB/	wbA
JȂZx
SBƶr.SuU冝$NhWBpgHuAec|@6
 @v0C4٤
`"}y:RpYa|uz$L96ǂl`OYAzTF9|IG(ߺL@WP:8=@-@*KȞ\tpH3шH e2X?&(wY^&ZȌ+7lC^(:DW~3,7lBPaƐ_PiZG=x!qeٵUC﨔a=G?>{lvVN'hB0X~ڹik;b@yy1+iPkU[ ]a%[A7SJȘGAl	g	,ɤfP@,oHi0(c|$.ba0ԼeLaGVFڋ1"ե#!:kG$ָ$YfJ}~܆&l!u$6T1Q	kaO;v /nSBznij4l)	
9%"-Qs`XHg"8Y  [h/3lǐ*dFh9nx ʀȐS0]&u\^9Cc{a莣!gdVf^y馍'?hvQM6fE8삅[	>cπ9C{C.խF0fWjzf1?G6GfFǁD@YtӾ8AM9j,aU qJKɌ.٘Q]%q<,b8k6:{|m'CFN'bs'M?N	+sGqxh3S5J|RCD7sG=Br/Pz,O+u@w0:u`>oFG	)qL)s# 姰8	N/SQ3/|}N
>j)qh'@t78"{\KA;Hi[/pt39{w3"߀5}F.pA..?J,xlm3ݻI狶l2f{yٞ=^V%>cP-RP@:k8j>Nl)B01	|H[1R!uT9d hfU\OPqP=7'2>imsMTTUUֱV_vO\<6]:L=rP]qW"A3Lw`f-\P_"$^{Z!]q7Ń:p
 愿~	`ʆɖA,Tj90a?OU)<|.є(  >/Xyh\#Q:K]߃QyQNV:agJ%QCs2=0T" tL2au!HB\Na# 	cZ:Je.  ,RӨq5ؚrIKYW a^e< >Ɠ YfX~'eacۤI2!SVl'*?kƠc9s,ɚQ@WLŮ/$d-!OSG'"KpO$j%Q[_R>&w4niǥ|2XR6z6_DZhlbZo\1-pa׍a[O?Fc_ԩ>i/qAO9xΓOp͞L)ǘԺ3pseo)TO#יy'gUz	=AhTį	'h`3vI-@_wjZ'c0of`gؘ kLb-PW`@p݆n["pbԃhm{w`2|~46s4}"s-8(nC
c"T{H\olo}x;$Yab[7j+1:dfy*3K|K_fQVUiGk99jS7`ѕ9ޥiB8c/(~JLNi1#*{F!cSyUV @2_u:VW"D'q_8pfL_ۘ3jP37͏sos̛wffYnf.};gBJ|HipZvmQpi
Tey%ٗ/X6y) X\%/UL-sݬ~- ,{|?os?28S2tyGΌOʮҨnw ]xZ4y<lea6c&!k{5h$fNPZW2nZKc@C@yMQ,?@WN2{B1NqMz4jΰrƑB 4j,icHI%1rڴJ$Gz%2`F7q4(ʀf%v-.԰Ixgowegk v饌x@0?MW&猷:rA:n}/&79iz_ܸ)"y:ßAs|#ߗ~*Zv-4v,ߗ>xɀ>Zs?+r'GD}3v
c
%Gl2	tdͨce~=m4r	$8/dEr&UlʞC9ip=h?9	ݒYG2'^c.2UXAp4.O|-ݰQ\TB {efa@U0
ֱærZ8J6Pp" ?wQ+1c#0VweEUo6w Ҭ1$pc20Y~A6裒+!QpZ$'gK~dRVg""S˴?JTG+@;o>@fnFw ѹHZihƮwWVɯ	?&mE$HEj	7WpI~zpyOݧKOXgQ	(Ļ`kӷ#m0cLO~zݭgl+@Ӄ^ӳ֞ݠӹ.b-6y6Fޓm/Ҝ~6.<ZX}2)>`=xf[+[܉}Į]>lL z[ю.ګ u\nb,1Αm1h,Oyܘ|^ۖW)jJk~urR	P5S vTy3(?g~|mE=+/!I}<v_v/׍'Z+khx7waL+?~ʝ/ D{\Dz`Y֟VW־_]Y{óPcƹdf[S
۠},7AU22H>tARHKq9J}SOBnqWuTK)̘~)KJ7C:PU_u6w;=ZOZvÿ~5WT1OU-.KTw&vu
W%n[i2^5FbDǏ2Lf;`:N#H)?-=[[YYJ {lPӕK+kϾiV$ϡ-P]5*fw
tf<먝c)XmĮ$5#DP$~pſM2'4MqPu4f u&$UQ*^p8f!FYeŖdXB"+{6l3>8!x]Q-;s d7nfwHy!N̪dl2`amФOr6'XGM
V=cSga&TS;{Gv&ƩȥЭeZpKAa>mؚ	{FYQ60D0f) -X*rEJf
Kass`kg3RIW.t(q"FxdQtܮ*ĶdgwxՊgUF4g$Eʄְts)4( 늹zfO~Mb斠[y>_&UNOiB{_:ipogEU6K\m^ |z+>@my]"9/&*œW` @14]3NJ8Kj*&ƮQqS$Y`r4z7.͚]VmM!ps`:XbΪg!7cU gY熏t[6e!4/f	%-yvM'k':A)s%;Qjd8?#&}d!$B߰2D>}:%Ev
Y^n+.̿/Vî5B(Dz;,ArÓo :{VU)olza,?36"M
Aƛ]^G KnQejVKxCcdَZM,AfFDbq23
	Y.;@wG't58m8[]9VkMN?輈7K4y\wi:|R\
C=98a.88ۑ"O0`oƙ>Vcn3-4p߉-u-pG6 uwGBf6ˡ'+%@UDOa:0HpU@Յ)kHYMZHeŏqMC1#Z܉mE;M8'V.QAsy,_}?-hV}x7$-\^0B*ćSz#WlEde`q76bEQax\_%97mǍ<eW;횃\bwR$AvRLcڳ^F>m={zYTBXZzEą;wχΌZY1p{H'ԗ7HR)?\RL$"KI]`PD~9'$%H@)0Ѳ/IP5l*?B#Gvɣ܎(r5y[kB uEo$APLi6SFBaV{  FwנNBʪǓɫG~w~
5ZO랔kQ-]$H)	'#\ssQѦ]:^Z'Qu+MܚhaHo9X[🇛)ҾV'P{fF"ңR]	wJM',bLN/TOxWj-9-Z3LҺ.E(7!YQεfY\,C
wqQ\T8p)j)UApIwa,(v/m±C*lFkt6{J%MdZ	Gėn[ݞ,O@Ymq,'M1\tΧK4t8gA`QԻI,@R6o8LǷ]8;6lY.?kR$-1]`5iyev,H3̴8fA6t*MJ)	=ͿbҎOufD5ny?YaLYcNUi%ӑ/y*u>h3,ͳ|:fj{k.c7i4ծtz+^6{tw)+X7tKC*a?[=^gV1Z$ړ-Fj՚%BywGAC5Yj@(U<)U_eH
XxBoAmcqOc99X^ R	ح1+bM+-
؂EhfFTXx JaG©0L'Mdb.Sth5KMߐ9֐}$ ^R=`-]	CU=f,ǒVdN7e 8_AEAxVn:HU8-6/o6PpǹyG)P;T|h>upRu@l :߭nLyZY)zܹ fuL%WH]TH5e=SGˋs$bZqȝfѱf6+d,K]QQjGzѤL1W洋wPqZ3ts-Wku}+Wpheϼq_opw7ZQSxxG5!G<]. BF%יa0u=UuVdTMBhi4DmQ/pOv}xplxw~sixf.4V0`B2D<`w)7f,^FJ^֧
uilRv[bIBQ!I+ιa{L9F9@"GwQF=n78sM<;Ku5e}<;OUTa_ӧDA}OJ
&W**F+=0)*Xv@	ǬH4=GE'G^8݀1[x3-liE1f{jU葩<4۾W`^plt$oaD87.y*둈nZc26\G?лqD֘vH!w
yEm=?(tBE6 #lAZTlLyCkwh[qdxR7NF@jg޷"KPk훻3ڡrky-1WJ5)"$&\ 9gF+A-yatT}XĠk|/=+VmXj&D꼘nR*cHRjnN Rzc}Tɫ|i*rjaď;}ˉ)/(Zv Ӣ:Jl,#\|GM>cZ/T0Up:?J^w'x!sEL(eiYRALlO36̤xa*b\Cmy+\A;U^*axr#u`-LZõ(ܷ5)Ee=HOtI0Ty vWr	n#b!u*62N(=τ94:Rą0PWM=H Rz
Ϛ԰=.~`peȊH8p 6tz;<8id@VXخsCXJ3ZmVPjMvYYܪ'njr(MLva5wsD#CkSU zj/wKOsjB;M,d}Ecn^G&׮$#˒S =^&6Dd{*cWRTb&H%[1%/7ć+iD)ٚ\TJ[FGZLȭo[ţ{,2!ʱX!Z8NO)ADq+!!>Y,76Yp	/D_3.(KeL 􉙥=~ki~.Z|wC6Ͱ~ۆľ[YMPlۼEle*IUl7ov^6F%H&6"5՘AX`e)ƔuQVNphn8Gq*OZK#Ý-HQfD'ޫ"\|^_Ć``3v2C!iAEf'Wㄌ]d`<W?pG[bQ绮YI;6am*3Wpo}ŎsxacWl~ېp%O>Ɖkn5xm&SV0h9שy'N^(^ZnJ*q3`jo<qC:9Q2\%)50|#Ы{7ms
M4?h8
ӵ4	A8\$Qoz0h&$훏KU0oqÙ2
X	w? UWqcY]d,0pCO+iu;SÀE_|wX憝|ߦy
s,eE*]`k;}k'1ITl-7)&'SfpzݮNǶCgLtx*he2cweۢ܆A6yc~^1QӦ+̃QяQG#hlUiQa9
c(v#ovU#rdyx(PtkI9aH&RXkPD:3 _.-I,]AVrJ:,Z|+A4pBi)UUP& vhrTWxgڱ	oNGZф$8{e FSJzq
Ca~A6c8,Nd<56U
^cU0!9_/(ߒDOӜ@Yb9UlSˀO̪JWZrZKj췅fOӿ|Zl)!pIlgT06Fj1b5{$ÿf$"RNr~&u`ka\CV[+Ńl"cN!I׿y3/H]Drv=C &c	y]#])jtem˚#Hf%WbR%pATagp3٣`Xsch0'RAK}4H{lKbk4V+mZ-007*e&M7̀dt@ֳ~6fL8O9|X*HD3td#N@MyuA$R*yZ;i牉Aaz'	"Caq)-.;&FlZw	tp8Ά3BL:*d`  <&.8"CLXʑ!q9cH5"5ހLYqu.'>p;:VIh%W1WX =E[t@w>Rkb'Vࡉ3_wXz2!\#\>\=qMl_o]mj{Hn9w;Q;/-me%ݗ,mf)@BHsJ5ZU9f%PL4wo16(oR2O~n(1#L7t	fCn{'iν
r
iM3*O!tC2)c|ǔFmî!
$ŒQQ #=]ne[r:pJl(<DAhV̯Ő@~Ӫ,5ף5f@/1u9vYQGuv\юs1=x,X 9ٓH4i3rδ"~ERlpF%YW8aԦnz΀LyY	GiA򳥮0 ̧A=/nz~Lt47pr*9f$=vws 1G\wr8:sA=WNȸfN^pOuA&gcu7/ëm4AgcRϔ\n;8qE( L7k6	77Lgՠ#AY?"P{ɷSMRHy-<<9HS3,$([tsrmwn`g>Xy=G#]9+)Lbhf/*m-*\TvƢ2O\xwhAT4+%87o	^c	g:;ݶ^O	ɳkx+okְ˗H'r;1C917	4/lW.vX,|,&c9T6Yc60YIYCsEL֎@kKc,E>L@>&5dQmZK)юjc 39u3g;.j2S[9jB.8.CE<Fv#{Fa.!9LoM1  ^2q#PIwOK434z=hfr:%3Q'`9J+pslse oIɰ!4#EvᏴ8σn6mxPgG;f(JD,Qحܺl&慝\~Sܦt+]г~H)e[UЫִ6MF\yz^sN'0{#.	a'aX[E^̢3LTJv\
{\!b#?>/85	VQPfW]qWS^V(Xڵ>Ap3qc,qgosS@NI'FѺ@Spw')m5H VMG"-o#%jx1i]FݤpHϛI:PC&w`Htxaz!\cXYX-3fDʆgK!EY,{4nbT(_5pfv	8Bb5;;ACjz-=9mc3v??e_Fmֹ$q#IGspl[nf|;l!GQ[nwMsq[9nŨW'99띜tDWMG	<-co7@)BCX1󆒜pTClrFhUG.֫QY\DQXK4ƐZa׆`U
XZk`/Q<<ڡ^k"$")!td_ZO4$1pP!U/mc)d!VI2胴#D^Œ0`z&(%"XD`Ɠ|Iתϭsr,C=ujb+jAzq-](dtW`xqO\h$
ǳ0ͨ)%dSTON!(k+N3̃bKk>E~uG({G^h$-?+N>Il9HU;#K_߭ztl^jTB8Y\B6e49JkS4aw+lU=Ve':vS8RCE=uyY)1Ma6[m#z,eM&|(Q>bᅻ<WBl#gpEc=qwwwI=|~W(᮹|SU>ČکSaE0D:=vA7{a=Q[Y(#V;h#bT?ۄUJEUxrݝ/ϑr^.]AShj.Zq}=TT4_wzn'Su֫ۼFÓ9M"7Bp
|ģlTˏ6:?*lδp0!OBP~<yN5HO(;4q:F/C,Z2x"e1Fb-1U	eJhY7ƨdNdfބo3Ԟo{?_O0]p2@+9>N%Ý$?~YFxƕ(2eɹ	$NB!C10
2!uN3#*1H਱5+F9g;"Ǽ=ײX3x皉ɉlϚQwIs!r
]jH9oY9?Uwٽ[ho"wdwS'>sf?*߽Z|2`w{6>7|ۦwj_&-j2J]]ƒ!1|+;5i2Gsۉ;Qҵys[	.A^bZ@	b@v_'()+x@ϟ&'P1s>L%{FN
Vw;ۙRl
b
E+Z9PfcUARs*&c_6|Ux1V>*#r^^P|rn"J,7?C?;E>i=$Zi lb	K&|$E]JG_Qr$_ƺIP~-ot z\>|j=BH߾ŷH_wRՒaXkvi7<~e~r ll?.ocK(+5nDHId\fz $1n`!Bѡ}TdkWui>?!&mԡbg3eXqեӛ|ӫӊkʢpe8Lr<쁻q!0%ƍ76?|x1nl5o#4cu+kaw!o9Cilh{zO!"I«`Wzr{RùV	k{a\4;ɻ[MVf]g6U&GmC*PI?(aM+BKLND01W}QyV5
fmB	52X(	>F)WdûddO0G%YiY7|{~)&$<e -ߜ䚆Wew"S)TUlGI@rSo/Pi3Mr"Nʫ?!9a1#oFR]Q"|Nϫ@XzfqԷ7@KZ˂.ty๦`ۄ z; >nO#wG[.9ψnO/,Fvtˆ҄2m#/C,tԒΘyf QS&yWdp[c.Ȼ:R	U9vhN9X 9$Xcnðn+mfuQ|=ObA &y 汵=G#	Aam`Vϫ\Z!chdZ`;OĒϥ-Zh#
ٗnhVɸItHP
Sg}9(J*qX&_BsCn4MMv;igI/T#v'b%Ҫ:]gcNSڳ<BIizLs]M'%U3Vr/;?;sObp;t9ik4byyEX/2x1YTLd,H@-٧8xloy=ADE܄Eء/WO-f3VMޝ.V4)LϺi78s;AƈrAp<LfsB*8ގt-@E	R|*@>+x9~mF6?$vIJ`aN` >'lK#~-K@B$q}]Os^/x扅A!d^Q7ތ\m#4R@! {ћ/r;tIisix-sA/*@-Fa&Y4SNhAp-B-TŽy=&pcIm7o\(zN2('jw\h AN=IPP智B9Ό3GT!Yz;NO)9_aNI)EbqUۨ!8B݇MtD])iQYj>3hL`RB ͡&PQnHj7ä+௨m 38CU 3؎ (bt,8%IT _y`X*:i`4q#ZƭSW57(cSZ j*CkJ&dڞ5$]M!|Vc'N	VjL@D3vjnA%7hsWR9zGǽC[zC/tf =9`Bmz (/uv~izd:}u.dY_-f:jvt4@>9n/'Gz7Npb㣳<086Cxp"	Hq}u>y 3ZLzz]Ť;LBC׭ӣ2FЗu"ͽ}F\ϡY
|:n=wlvW^0CuOҖEZi'F@g-:mjVo.'7:񱾤-17cz5jv;ֶ3%Í,e=3tExDx?Qom׾ Xn{vU7J\=CpEWAMPB "GtT{!f;kˣ{g&3FoXWf C߬`7q	|M?<3\i"V~H/h)T@#% ,ieؚ=z1HrYJB>w*쒹,3=._ QVڪLblr|ƕKQq:AVǹۤ%+RHLs\n(s+kE}W_IԮ(3Dt  .H'ZZm2{pQH'ZTevﶸiQ.G뾫W8{.^|ZiSǏgA?T|ov{ow91揞=Dn~ֿDM\Pcv+IxOF$vi1yęs*LA/ݹ$;##t?A(X).=/.m2c
97?2/JIpWD[kT\UcDG!-J4)GM"25vmflD[з쒀.I8eUe8숃P)"H[T6w#cvlkMPf痩*
{NmN%(feZ{*lm_Lmmk(d84!n-#6K-V~y|`>{qyP `"aC^C3^TF`CB{$R~`'V>`rTkD$ob<:<gNlAɣWv思[xla>Ka#Mvsª?#0iLh^7_*JPV	2үvrҞ$KX$ĭƬvƈʝd7:̠u*'h?qh?{n<uqP+sT³5N%ڌic0lòW<OF
Sb:px8$rbQb4V&|.]Z/zÿӐ<}VwɋTUQeYvzNCfYU/Rm*z-kMaP雙| 3mkWw m
5fy;نxl[a+iHǈB*[>Ʃ1"y9plIS58A`v"+*5adLS"ݳv3X;7W}i45ei&OrΕ);u=kk'#@)~vKQ/sa.w ?x`uKͻ@373cv-~PVjzI,%DA<`:,EUQ:x!68΄\ĜUr	(K#jT6oAH3CreiT6 XBeC?h8t4$E=ҠN9ʼ4$"#M!sH:A u݀B#zI@(V^Z	[i4m*}7Y6?`69q>M&\Vʤho斺ܶAr[voKeQfD@_LB>ГD؝M'& %ۅmGn! ,>祿XSӗ;To(b-*@EJ1/G9L90-n	$ꕔ)bH]3 Z@ty }ϗ ~)s!qkAw|k5;M@xvaKX}IU(7Muu+nTuǷEUǇ;o}+ΫStyeI:hذG=x߶]w!j0D3ћauUa"Tf(Ǝat)wGg.q]wW)YyC/L}SnZ̰͔0+U3u bf@ZF*p6~`$WdPROEm2k-dn(SZ}Q?lJ
;C#BSOqgg@ZIW՛IV<T)GIkvru*3U|UB(dԎt%"Ą5``!$={q*-:3SS~|4=j8^G /3\MS#%>tI3*6'3RsVT߽噲64P3ꕐ3N|UGFPf*B_RϭNBu~^ QcSP`:'5G'	Uxxpщ!""'E\LD;0Cs͟e /'̰\ISQEj뵘vOͮ-6
΀Re{9|q^֍([ldTI0 @Pc\TU:ceYd.>o oV:f`}"nm3^3o_{׈NO[ϱaM@ypRB3{R[M|txK]DpO[feΝðw+b`{82|FW<b/0q2c4C0J$N|O4cL"&|(KLtlT5\ZU G9Cnʿ)EP 4j!apUKޏE>mlHT	)8g8={Y(MPCųRc9C2XlW۞yL%a"~[nT]hǺ$<!=B{BP;XEs%0]íB^F"b1)
l+񻄔^&x=~/CnRf4')YJR,E}mDw.`
;h#z?)7x.4?`'GO677?XEmfx4uLsu5mow6_ `&So w۟jYW"6=X'&~
v}b	n{0OF__ZG6`6ů=fa['}bX!0J׀Fti7B.߅{Nu	]pGpwN+Ʀ^ awDj)N=!+.4ǴIFnG|N%jsF/|Cnm2,"vLl9|#Ktsf+wP1Ñ}FV&9eAf[N'(}pjB(eg[#")ન!/r	^ &[eK"x@ʅu
!O15"fA"zH;B5vJau:r"C;o{b.N{a
'fFǹ:F;ի"Θ&@UaUEd0d**X}5iOպ(p`tjZd3m)w$39'5JJ8ko]qx I$~Uٻv
T,Xw'wXͣZ4CйBȋ;Y0H6/~{v/^b/u?:~~nvl<NHҨS6~jέ^}ei-ji#'b7dl f"2xrA 0E)y<;p<\SLM2
,ؗM7AɅ\0_v@l1fvw.P3gMZ	Gq1.ȧHW	5,6oJ"/hz9a2@dq]կrHeɝh?M`m޹__ߴTߖyMYDm}NV{~`.v!\x0ӷ}lɎD(A)? "mA6WffKs~/ӛA/\qT|NB|+X_d5 /ٵI^OՔgjd$`ͳx6Ni}![wQҢŴP%:GފoÊw.k'|/&@~ bνez֧D=?FȮqH8G-ty9;(zm:5ygv n7ޱ!ƅE9O؜f?wA!9TQ6;>sʟ'_nWYK]F L Kl<PzaIzZ.GϘSJjO0O95J\1Ȩ .'5%8RgӰEJ*+:P6=M"g?ٽi:		=HBI91{>2Lv:,P_1CԄ[uSyGs\Ebe%ďWӬ.thIi=j+jjy(<,DU8<״;!HYǽN@P$,P.dtܼb06QWlVv3n1,W|НDރ?%ɗP~#6e樮אH5 i['d#般aL\@u~C(Cx a795'9ƉtKM#trFn,s9R(w$'Hǃk4N1ׁ9$ؐǵ8 BxH j`H>OiUk_4jJHVjtZ*f敲sWNH>XoM\Vª3$KQLPyW 
Q>iEQǵ;5uy|>F+.gĩ87ΨX"{r,[fsp[Jھ@$~f7:go\)o0\`o\WjlT4(w\Gl*Zo:q'fUF X>L~@X3->YϜY۸c5|mΜ!ѕ]߭yƵp2{[jCHs'CUS Ǔ`^w
v;9=R&7nnK p_	ǈ=NucVw)"1WfͰ;쌠:0)H&/ 9OL-L%ێVVpHR
*Fip_)tq#EHUyW/3X#MEpmm3G7%sU]㢹سWBn듔azͰ";S|uN[(gNgSB;m+j|R>	/LgE=!_l?jCs>Z|r_RKIGV1a{GȆ?ĉU_8w+tfش`fX-vcG37Vy]~TIPocKz8 Nr}]'䑮6˶(!lҶK$bt	'ᲂU03NfIm|O=YtEb@NSt^`NAHe+.zt'y^RtoYΙrdvMdk
/t6 ;/p3`x=o/y2僌mDQưpj(u%s«!
pf-P~j""_NЉ
Ƀam ,f:q*~^>č;ڤ@jgv$:mCQk9hReFvhi94=4]lڋ.fZ/hUȃm|_]!,$+\Ot~Yof鵜6>s^Zuz"9\Z}l
)$ד
^W慎7oػ
nH^淠m{֒mqY]FpxDȁCP:fǀCKTp~Ofcv>a,K߸ݠt2D~LD1Q9smScJ8;&qi\Š♖-kŐձ- U9#S
=lXFd~
'W.VMrGaudfCH)6 d4?I~J݄2XȠJz>&KKS4#¢?) CP+ĤD4Qm9Ql2R.iIBB4u>E-q<	qG{sJ69؊}96`Tӣb̂~ރQ(/1`:+R\iHis)/YoÆbגLAFa(93([Í]/!xC8$ꭇzFR9r^p~w.k1c2EjdI֥l|u<ow:=>4;Ќߜ~''$9[d:&D9n͇_Уtʎ2L?5t1{FFAS'{!R7Ԅd5$,
IH5>+k4 uBއOPl̺PymZa4 <
bĤYՆfTc
s=y/avOm5txզoWQ4Z-f0lJ򞟯
S&-\qg/d} 
&+NE7J?rA"zʟ?mc[VvхH$h*2/`L]$ 7"ZזS``<}?,aZZBB:$㒒W6W
LBK᷑/:$K$ٴ;^M01@SPt^kf4Sc7o0%'1AڕWF'9唛!VR/QeZ3(}M$I
 D\pm	:?E
-HicZv1ˮ()Dy!*}#MAr;fCްOuˁƞx~BrzXlv{ǚ6TDã9JooQQR񡇵EDrׯ@X7I~T	ZL$s!>W ߽&䵨{Mx/VoR"B"	q)Jҹ`$1DZci A\I)mfr%4EQ9#.xQ2(3ⶫ3cTBf{}9I%adlҲFa'(`mOzdL:J(aEVk-]?Fwǡkq1N|9k:UnVT8\p( u!0IF]-CsuI<a"yHC[ʔyi+ ^pS˭IòO`&Mtǜ[hfJ17sZm%֊wIu<Rzahɴk&7`4A$r5TH)^YK]r}gqrٕ
_a"桔M(F];U^7$Rbn6Uk`8>t}u2km$`]nFJ2a&iaE^;d"'Cryv6/ùp
Nfn[>}`o#ŋ
R?th~SY;B.Z2j(DQ]'vAӵYIrT}젗EKܖjoe{ ^r\*E.-*N7'ˆA x:ҏ>oOWz|21O1~G aY{+Ȩ<$Z?`8䴵j2I<{ <v桫0S_yOt)v?y0c<|"-Rܦ@.ERzL)pSG&'ZfϟW/G(1k)f7HrQGC}8-賖S]n'ݟXsW5+|y3w@a0>bNs@	Ƹ-f[88xD !hih,lV\"ij]5[]$nTVcԭޭ(rߢ(nF@{nXeNcTG}9>P(B8|Ё-yB,8Z}	̭#ԴOlx㜘C1)l?=ZmY Bz2R+$mߨt$i,>E#'|
kU?ZQ,$* 3#3oaIcn#HFTy}@W8-T-5|Kx} \.Úm~|hXɵK;/Hp"9bĆfYةf|zvm΢~9`fic5%-ˢM#ӕ.^Ǩh#;lzUd6qvZ=#ڹwAǧ0g}9baڒ(
f+}26Ye*[?4qyM,ӭxGmq6DZяw/7ǇZ;o>G;E?{{NS]E5]#8mlShrʷNk Y7e\AJ q(ԄPk4:""\X\AlqIE8JtWWYsX B1{`lZJHE' =aJJiBz00KȘ>W[T%`F5AmqfYg.R.;^Bfi	el(,
`e}eQ懢JO Qs@gǞȀsw֐U/t|]8+-v9%l8UY<?Zn[vwޖVx1RݢA\Ў./(bRƹPN#ǝǀ
ipN»2ct!˂GQqP<XqC.aH"n$|ӑFfKI5v*O PܾߩW)~~bۧ@xq|>5s>Nfa%'.+h;`2wY@D}wO?Xzcm`	r?ByÅęZ&o[kjjs|#R$ WJgg3GE7R2D
Wx$Aփ~[VࠐQ#uFgX5gUm~5N4A7PZBiYMƑC'L	O	+[&־XW~vK/NQW`Iv}Gwo&z#/\ۏ떹孈U}2IΥTKƣɅlEQTl@8^Mi8.N6`1UGK1k$Ku`(B3wL* y
G͖o7B!hk\\BYàb2t$4I_^~|Q`{e4zS{YAsꂠ?zL9_60;lI)jQ%"Pfr	:Um	f: 	šGv\JRFL7@/xd0]"WKyq$-mv3#`.U?c
} D&8Έ(%lՑGWZ9G*`2wkt;kH
cչ&I4*L'ndqW(MX1r娀j":KADCM]NI"}!bE4V 'uC>MR~&h=T#,UbW`qtxQTfа0fQkպ;-a]8S+v5~cs@l1$w0wvT8,܏lC!xӂёv<޷*m`qt|̆yZQt?2>&2VX5^l6퀊]P
H;fd f	<CZ#PtѢ<u 	<(KO0(xNH uFWq6U/GS^I幦KBBq׼ُm;$C3ફe1Vr* ҡkb0Mf(US;#A;+mUI69eJO9݈$";QYjl=p06?`:%ɖ?7 [LQpmj1aa'q}QOLQe-(lZ;lص;م;iW|˙\4o3g>STS *+aj=		;Jp@R;_
b}C]Qոto1p3k8(8+ؕOc q;8G
	lq'= 7\ՇHp572+[L3.r8XŐXujtD!i%`éʂq<6,Xgp _HG*Y6a/Br)Lw< Tݺdo[PeORQ(NP`<	w>CQrA"@<6rA|aFF9{#=~q~4n<k~;ncrT%rKMCTm/Hn}f!v/z
p)0щwS}Ts]L
h_j/g`gld࿖Yq+/<X
u3#%#;4u+5].tɽY-|hv[Zu5[jr~8M<8bi"<Fv.K32͏@}ḁB_`CiɁHM͓~ʘ YuvQƱFoJxs7cJ;Jr0Q8VP[:5;u<D8#?PN JU=X6Bba;Ì11a 6J4δ>l%(nR
<g&v'̛vT oة^Po/x ڔ6
ߎN9!b,qb&$vlJyHQGbݞQY`xwDN"90zNAlnaJhҫ|1{`wKwry$+ ȯ2/Nxrk%8G|I! [_aijܯ a:WWMoޒI8?];by}!s=kM?m7\_wPȇ{0 yD;j$)$,^Sz|
(;*q'hT-L])Y:PD:T0z.u۪oҽV'IFgfVuz|JB;{Gc60Fv^|d+ 5r1xbzvS-;hbhA~5(Au'lk*E&bj$TJ7<)^;QMOSh!pØd)qdKB!og;&1^M7yNry <\mƽp+h)ІM۰YFp}lɞP<UjFՄgA<s2fhk\Gs9/ʱyMm602Dk*58?R)!J֦r@s4i5ˑ=Ä۳Cs$7h=OP顀?"?!p&Z(EH*oq&[Tѭ[i*xb=@s|xc_Zg:!m_l0K3럣R'?4	ǟmGgZٔF?a%Aq|\,M%n?Zqlbb.pz݅"4mt
{dǤgE#ê~Cr1۞Ѩ!ω2/D׌~Vy[>bnǑO#*G/+ֶlqY>ڡmJ929DBH+ՠVJ 毴pߩz(f̘x&\!f	.]ن3*J1ҨPU}Eaa,{U{*ef-i
)3$^-V@tSO쫤%}o\Em0Y1&^3$<[`<,{6 +S0FދȸtvD	Z@k
MՆk#錧E|lU. P\;O%dBtIlÅ
SpmҊ|uYiGZ͕Yj*FI
>kKF1V_"1_,pQiIN=APBI&åA'^R%pP)
:mH&	2Os׍LO5|pOs94-N6v$ԳJ2LY!Ck} .u&ؤ,YpĂ___[N}^/.0öA!wf 0mhP[^2If ^Qrs090͑,e$jX7t'KfO`1UN2
u53Pc211ȃ"IA+J̱U9wK	E&]֡#̥EYZOLHe<SyEY9CqwʅTADWWڨ\Pr-¿~E 6Uu?(5c-tj}}ĮQXw(ÐϟlvbsDcWrVDUٻ0
v,#âxӛ->d?2?m
K {$0f=9ˮQoѢR5VMNIR7Iƨ;ÄGS쁄);D3Ƿ0KIw!7H'd^jyeStB[qک1Q$`@C:趓ɗ"OlsIQo&S@Yc09y:$ݩ{R1C튈a[8z"
+zssl+s$ͰJ`5S!*"9t
vذ*խ<k}2Q"acAsIHGe462HW&w㋎/6H[n~t}u9Gگ(R=33w2Ml6xw8zbdVNC77kj84gc2035Ls	zN#o _@*#xЋt|	65%cE7ͮ ZZ;]wH'Ki6>$0XiD);mq8CRLuqF9'qb5vnTܒJ$Q_A^;<gjIUObڜQ(Z=(i	tGIV2*?	BG';ż9,f9{wuwl}aVo Ahg3ħقNƯ a{CHM|@}k+;p+7ߟ
Fmpf]G@Kg=GY?JR{!V櫜@̰Q&-gnSzLpt)1%ZrtAC>:SaZ|$6,O)AC83pdEry9D5Z/ 6)'lcku8<pp*h 0/~>i&ybDTR%sj	.|nr\h@Ʋˤf-å
t\%7t~lINXELN5tTTsKJ\尜k}mA4K+
"%(7̗Ql0B$paot2w abPDt0?΁C9CRl4݌lMH@}:QK?4M=\JMv>S,>}+jReܐMv%^w(SysI(̯ޓۍ_lUC(qydR.Ǘ곧8Iztr8Q 㶝n#GJ[ލewp؃[V({q ZmZ=usEݶ|Cn8{#,WVܴqNVb@c,]l]:q$(m;4o%cN䱟z'ۛ{ǻvο]ZcQ8Կ/l~U(|:6Bm@̉_>/:=b,iMX@ jƝo:zdsޗM3K q5Ȁ.jfGY}]^5P:|96ЈՓ &V%{f|P
z +DΒ`+??,M x~1z{whzw9Apt%'˓ ОZdEHpt縼cANoCb	)X~<nJd,1q.#5T~/bʔ,.͑"&{hfg{h2'~>8+,tg*X2Q7N7tٍty+A;e] рȦS9AZrID2ewa
#*<)eVE(g`/8*X_LJMG@a1y<g"xGɆ4t (1s:.].FEn7-kʋ逍K`߷Fqւ$C q	zhQgxYc .	tbM./i1'^vCu9Ϲte5f5eq"S#x9
k
lH|n;.$4U:>z0;V_A3HIm!I? vfp'C,UX*-QM2-zXdN!Gtޡ .q'GUfH@_@6S
:;g)$-l^M0aqU6.7۟&P~(8}UŭK'#rBWe:fo%$R4;Cl	8'A&aƸU'1E2TnQ2rv"*[H~OJ7}	.n$	 !%!IsċJ3m~L"0GeuNl@<+=k9,h,cfBAZ'tUfɖ"9eHuD7:.Z>Dt97ܔ!};8E,Su!Hu:
me{jA1-ŨIĶjݩ5^pȲzt_9V(yq㛝V'>G&-C2YaC4xDfP0I<$*32y(
؁{b/<>D6֊@UReTj}}8"4 ^z$-&xW.ãGG`DgWBX\R8Mu٣Z[K?UMd)R{q ìP+nHv
q2q#J;4PG!w~w9@:f1=-<`K8J!Cj~A}T#,NXE{6Y,}s/Mr_R90=e0ikkP^"YW#0Ao >~z;98+`6G8Gf@0:M3?8jkսFt6]bMQpJȋjtXX\$H&R$ݝR>Q6>xVAF$4K%4O$D
pd$&Liv'E[LG(0"yb{\GY~f
&M<e|DIםf`ǀrdȴ{]]e"*ށ$Š+ Tt㾷T3նmNni賭fl+k4VodF-~svkG+bgnLxF"j%=l=cL!`htE,2mmhl N0d,ik	dnGlog(>5˗m<1D/.kζA)B'EFb9a2#-odgspng1TmkuM0
:H{oc~<8^a~PGZG]E;̌Qcu<kݝ.Qxf<CYOϋj}Øƛ%2Kr֯Tm~`&l*:
.ܰdlжEkp[s.0tHZ1Cnyn],Kyނ1>'g0wg4Ŵds[iwd;jjcucLw~;k@O%G4Eޥ	ӈfiHy|7aК5BUm&C ED+ӕC h0~ݩ¢gȨ-]n:+^}"A_S	HچUgIQ+$coa.(k46}d(標	AwttfcG󽑣f#/!z>L5"DF>p+|LrūL ;Tn|;~gw}#/Hjlg!&u2Q
`ErQx`]&c"l=$v䔮AZW_9}H+沸 9e.J@ 贇B%'eyrXh A3xb?tbGB׮ai <~|VHWHpN=;=,(!M9BEX[N2ϴW;Ryq<|b#6r?GɉA:aܣ^|7Dr-n SWav.Yqq\Pۛˤ˦fKٶ0Z3?m9yYrP0=ϯyG͋1 *'3T &)x;f(x[4Ӹh6TEX'O^f"!"*yj-P)v85=b6Ä\m+D Wkgo_aZD1vR^)R'aYacWL~y7L1f(Syv@*J9oz2j4ߞ䌨0$ϓ|#Aτ "%	=|3qW/ 
0z(!aKK:.u88' nLi}ҷ bi	NI#s"}{`UA0 NgĿ=YSe_li:xB0R^򕕽X^Y<%48]Xs*c`ҏѬcv\ifݺ8k6<Yp<k`<(H>7san"F dg.OFY'lq`E6]C ؠ6*/Lٲo	 *'(9 ]~lr%բCd;68
3q\dc8TWHlto[0cgw:F2&4`GyÔB%Gfs,A]u4)nwZP]F[{{n5̀uƴ[J\(үm!c(B} sm^6 nZ`@Kf_!hZ!-JwJbϗ[F_1 s @i!:;'q7(Glod5rG<$-:װWNztZp@9^\[RH_-ۉݳ!jbAi%6LϨ$-߾"gJ|멼 ċ-;U;ҥZ)PCܥX⇷wKz{9q:,aZM ]"?1O+xs!s<Uwi
l[YA|7M##WǕ??$(_!\>o1/.Ё_iK7d>1M6~VU"_ţlCzoI⫆ޙB%7}u4S ю9`#vΝRg]+F{vf޵ޢn޵IlAa*kzlggk	H	9Q^rE8~1,s(A[[	&LUhQ	5騯m'&F7lq1x3|kUxLs8wKo$4hX;b߽O7!m겜WND
rl\ż@iyS^"7:=@[H5␸ImvCo`ʦ೰w řଲX۞)A9Jϲ-:-%h7􃶋ƃk5ka?']/٨jp!;Z:o"2\ųU $PJa#B׷baG|~@m3І%6'ױc /KtYz0P#lsEgO\3(DŐ)M֐ݝ#eheWkM,NB06<xV\&71ҏxO)ʮɮ<>=36UVOmԶkpը}H`Nvhx
Pg)MLlY3-$	m%l,|>_Z=sUY:6%ɷu+AXs_Ձv-wl2,PXYPT#.lC霻T=Yw]5zX>/Ç
߰$;|6CGQ.1f`E	 pDpHPY5gl\hH1M`{v/jԐbG?fUz:Rlh:ڄS9XxSabAoD4+y2k#(
^JiEUt>F%r7hZ.J]6afqJ䆝j<0.:&ʮ ^t\T[Y9%VMh聎vErW귅Y.1yFWͨa&GY.흟^$oK{iCo
X@VZEivҜ93y<u;қrFȬ+[T5ܻn3u׊w&Ji'CV5`jSWKTd^XE*4pq' eGL&|q}`0?^ț6)ЦEWxm $PٗrsH"8EE: p2j1kqj* N[,_jXAZkK6TUCY9Ni91{b@"ǭ:c#q+
MLDu	^>V%Qi(C9ϸ*Bێ
	dq؅Hø};>Vy5Ҝ}8n gّ+#)~a
+u(H6Q}	Ӫ&P1tQ,5tћd5*twA/aY'r/V_ ,`ֱ6CSc֒=#Iכxe=Se1Rg>.9IW?JK!:}0=)&~YjvD	5ޏ
=<χ[4X<._3jJ$\3qqy3\}N
5hi%P.Rw2xPesj0()Bf zz'5pSfŌM۸=nx5t}mN676\sL& >Ōe*	^OeyϺŐoR;)ت$<8q4XaFu!)\%E"$sZV\dd.ө	%q^aGMZm'{ǤvyRq5TrrP_=JSB.|oZǰ!(TWFe@ěuy&9(ա?X .eӌ0M$|G¡sZnl]XцdB&;'zvpwV+Rq/m
tڳJĽ`nѓ	d-M_ވK/(EG?S7LbR]31#&<Rr"=~,u~d/p)C(D43Q^%tlF-=amE<d=bq2>u7ъ e;(uJF5ڌ>CgNycsC|FzFz	ty D@1|PS6o{Ť5Tvpfכh#V<(FA,v`=ů!EGomz:6Γ)y>jr6.LYy"ukvxmͦ9xI/v,eqgѣq)r_9#&}<vew4z1DӬ{
Cl^OBzʭ%lT/缁
 kr[C=` 7ςH`Gݒ[(f`{V Ĵ<ˆ5:qX*ޓ[?zfmwYtTs$7@`k4vW܍Inho&<V(K0[>3zlƅBFr%lre	)V9yVo qF-IkEABvJF< P!&a88_SÆNs6	NK(Q<${ $dˋD* X+)8<f+`z*('dA%6Qp 5Ԥ&-V1_ TMC2cB%;;0C1Ol݁Ϯ"ɭⓖ4{C9|.n/7"痲A$5/J{=mB^X`;sZJUdUi'<#A:Rul"Րwy\;:5I#spDFcy,|549ֿC,}Q{9e?Y.y qW|d̻aԎ0cvP\=A8HU{FӢ۳FEWLȗ3,	jDO	:D]y9b=2Z+T;=8c y|w-<  b `<̋if̝X_k=cҰu3+w2!/DaBdɿʘ@/͍6%-|vZI	
CXݺ`􏑆b޲3E!MR+|oyw\֤[cޚ"m7O~(X	w%X&%AϊHO((
D<;QS4&nwi?-E 7>hEQ%|tx.)VQp v;6$ԾyngoiQɑa7+?&o~IFVqJcr 9I4X!uhN6b綂 $_\ E5`d.3(bx^f]T+'&z9%1-&=*!ŉ$Xe~݌҈΂!4lP:˘ 
Ɛ`+DSCG<aD5#>3tP0I	>fpˉtcOfBpB+"$^ށr~ aZ,Y;DU	~bt	?C'_i"o>6avmq'C&`@ضww d=@ʹ5cY}3G󆑂<fG\mcР;Pհf2:[5WOUWZ+|8Glz~<
qC1Ik[p27hZ A  U{;v\2vZФexUo1eqpl Zav6[V`>:_DIτWDU%0-=\1T ˀ!:#Od !j4\GLp+Df@(P'jБKKjKRih9ɗ3dpy!㠷RL6!\p'm<u
Q9ʹm,9[iz)J@<bq3F|Dҭu N'Jٸ'; WrXg }5q.cevp?))e x[`mpArj<*T-T! EhCXz@W9t!h9j&4Ami PO| %1a:xf)FbX*f~R B<-1\Z.'jv>$qThWyJK'ܤ<bZvE5Iu	B
q)5R\^*;
V]-GN0.pZ]fE!뗙+PJrxk]zX}#h>dgK"ǒ	/4o)u21CYtn5݃ZP?$Io4Bu:i;H_:X0!\I,8eʸf,au:CVLrq%\ɭv><34Be{"ut.1!dqkkBee1;h63=мtdOvM+c,ZuǠ.j;Ml'ѦC=uZx) *>1J|hNqBAH@G\[^CᏽÓw:t9A;G0=_pq{9mvXN!`&:{96[=i_Y)~svOwKy$>*P!,uw9vHG:vp0J AK^}I oڢUy;|fR/12ZF\5s'LYIil~!nsCSPe88#dU&A6I!
wB"W,#ɴka2 oni#GU)ǵ'vir!"kl3VG
M}0u )OhԠ4D"if'؛^tAɦ2l@as@cw-!u|ܰ|{tZGuH%k6'˒V*;N=ǯ %D.5OmPtjkjw<)yf,e9,L-̵+6}Kq:؀γ
]Sgi[Ĥ@PLMA@@Ukt(\Fx|d5@PyzeHXaEӀ{Nu*2Hr:)Vx*?C~Vd,οr"K,4JO Y'l<ɋ !ZnLEt(Ȋ]
7o[-p2	VyȺ*W ZF`	,Zmn饒cO?5mrCDDy)Y!7|$y
k gFܗ<@Ϻ74TpLCG	
Vի?K8.ӝݜFPe~'x'|b #txyt 2vͨk5!Z,/fh;[C=G	Tۉ f;n6K7"z^lw&a^yZ8<XBgGLD.]hΆXK}R=MpL7]Wÿ)W	lbq=ïo	<zYV3cݻ4 O$Cy^e9a#{}Gwĥ2E(6Z U)
Bo/O<!lQP,|l&<vt!<ʱ_UŝőֲByC!쳣0p` f7lW2*TfcྨK͟«.	bRf!scAOZ<.bvFgqG܀]'(8TɁgVɗZԩX'òf`ϑZ;YܻJKmAQVAb@!'{QgH4ϊ4b?L7.J\h7}f
,pnhE%uFi9O6SsAIk*7oaި&Ūup\2ͮc܎] G|"j5gۤA4[mowF:tBZ#:HTl=;='m!pWķttQQp;<xӍҜ`ļqUL[b	~y캼l[8ĞX(?`l6!7%1{U	ۚ}|aN.-PNp.Ͳ(6YCHL#PE
m.@@cCKWӬ:)2v?#VoyIDS1=uԪ"@t,JPwg(|ڭzXAz4-D\dsK7ia/xWY2|zCSC,^ S|l<ƈVs|55^}O=d_'K~ %=O~SHXOu|bGRh>P첫LWes`y42f(9e3T"9葑A~{磡59zȁ;<pv)q/P[Em_q@]ϰ'uViԀ&-#D߃,B(}`ɞ9a{T	GBP̲Ӯd)yHok^SN:>¾NN<_N nEiyҢ#lwX-ٕgo<`E_}aLO5v3ұN2,W[{萿\ n5VEYQhsWtPcnZzDw 7MS`* @y_Մ+9zFAiUf&kq;wz)F3۫L:ms @@<:ٯYl<3$rH>Ipr6ܮ "(I04|ŭXw6[V*xbd%\cX5UeV6pJE@Fش=ohS(zjD<7(PǩhWr	,y.rrMdI'h51Њ1Nw(T ȡhf$#MEWxG	Pg4JxDk=X"9b
2`I1j#&G:OV&SECXYC2!Zd\Njg ]5zCz4-x'1h BK}[FJҵ"BQ!&6;t(Յ>	{(-獵d_rh8dV5~dsђUe]^x{dgg2M<A-.+m=n5pX-5ࠇ5HZW6>!@[tń>n[j,vLŎ|;0ބ[Eݞ7:	tqf	i,BZ/*_x]TLR6kq$^j-ѳ4itC|I^sbQd+aY)|ݐSIv%qۿ_dﲯg?b5>'A>VyUߧძh/eGT=-(+kG(7N3$ &юyu4ԜٓJZ":TvXp`"K8a6	0vNTf.Z\a/Ó^<hba[FfvlͭWaXdCg=^.t+pm33w]U^*MrӏB)OCzo&.-,|׵?ϑP嘝Wf<VUl5F3Sin{Ga{}&f(BV,j^e,1y@}YbhqmMήLELPPo䝄j[r~R~LtEQ+uՌyreyVw
OnY||{ թtsxTT^H@*;&+7+hLm~LU"6֌}:B`Rv$r/lб!>Oi7Ic]	\h±	>!	s<`#@٘2~ϧV@Vw*y{SZdŀ\G~ח@ Y&eJm#ɑۿ6G:.^u x |<vDBL=(4cLkcۈ|䤄r.%'x*$7qZbgpG߮ŏ/-R.OY5\FN`;79^sw/JC;+w/N:=CMzS#6zoؑϲYtl6pֿu|5TQkD4ZaPHQbg9܋N#%P	<6j^;KŷR44T6rHq][JR8^V>ͣһǴVW{IvrkR}BӓtN\1Y[rH9##.Cn1ᨳw1cը$ږέ$(a./tRW {eĸLUFH;QST,b>5
{ۅYnCm:h5.2JJFǪ`9Ȳ5䯊D\5uhbC7Rr5/sn>_y]!F\ 3%a;/a($v"\A~4IET DKQAw1m/'mVvذ+ס/F	n氬[wRdŢz"}'ʹ@L-:F5n(=8Kn6 ];Y˸b?}I D"bhV4~@vީGaC)ժLWmW&ࡶ'aA}r(JqڼA~aW,vttP%B_!@@pfLǧL7Fy3	!*B5
6VᥞB$lTpS̱}{Pk+? *u<˶WKVdZ#LZyp̉{uon'ع%^9"	+N]D	Sf7*'ӣ]+yq<Y|"$03bn1aS inD[^z@YvoȮ"1JuAT1KhgkeV4N֯Bd3!e9=I8AZPe6(=| =dQj#Mlxe}tgvǙ Ŝرai<=Ta53G ,[i:cP܏MGgFv	Mq0O&0@df;d%&0.($6Erz6}LshL'8!T`75nEQr5m|u3Rd
't{̰Uty>FnP]d(I=7-@xAG7v[Yjhj߼?nqWۼ{tm`Z2'nAɺz0n|AP:_6},×bu]m{?+t2ò2/d	)p@^N;vE+ID23C`ZVizlm,BSݸEkҌz {w "=sPYՇ,/w<eѓlK|mй bynhVBPд`.j³h:	'N"*NPhn9\U\ܸ1;	kRY_;]ۉSDie'G#Br,UDEcYun_hJ__-TgӁaq	qN뤌!h(#s跮Z?tlV;z_|tlyݓ:M3c|یH'^iaRgCO-PFPHV@u7S$]<R &89"<>bT+/Ga	wj!lPL"Fz݁(G,N{K9Gk`} Q aM=Y0#gJ,aIˈ|m5JӤ&&H" H{H߈omY6y'.Fw{'GSqI3iD)P 96;lW\%J8ȃBq<,E*GYbf/>=tLa<*SBf0\ĥ)j'yf2=gr2#mKEcJe!qd4<*f_1Ez7Ι_G,5:(iG
,a[:bkSR5~ߖjE7mZă/6u	o6܍7;0݆IG \!/Y-f[Vn kg?4o,0ŴK>HΌ=,TTU	Y7k}dz>WKWLn#x;*:Gް"7u:j[}jK)_X_6;aum5et:;a-󯏊%BI{bZ_K/29N( L
fH4/LM|y ل+w	`-r	_ɝ׭3$>uKu JGmA)6.ed'ǶobnܜAHhiiL?sأ.HSvm笰<ï#U\O#!3THXiLʒUf<%`[NX׋Bvq d@
C/pD1CUP;FstSꪟcߪ;ڪ:3P]x̡0I.Qj@3sާ70ssxyM!ic6짯1mR%,UN7fvQ5cY0fӒpCwgM/Ȅ(XUfǨ6|-rt9^p	-m
/lZQ_7%.s3=}˲nEKeyyPޞ<9ICka6~Q:x ZH+bA(NQ~Z]k,: MU޹9ጳ幽#q^WX״@u/Z7ttBOU*9A4$qV+'~rzPM%;LXlBgTq}6:RscD
)͊Z6{yv<Lҥjkg(GNzgB&Z 1bCoAА:3|Q6hiwǙgɪS^7SGzYff^(yë#I骣gt&#f݁j{Bn{ď0?ΆV"#;wO_<xҹЃ]7ǜ"	{J]e
;9r4b)%G_Ab`ja!q#ر>QP>!#hAgc#'zg}I"3	QRtBtb$=ko6})>5"ubțG g<Z谰;&	2bN`q>`L=cxJ\*`g;Vq޶+4"	ֆQ:6X6}!*(F(^X<r@y\$pBl׹p:G-gE=((&W$\("RG8B,ފG	oohQi%pdj^v9ϽW/	^o+ѩyO|pĵH#V&|Bݎvl f U~}=9x#񪒊l=(o؊RT}XSLv{=^m~V#6d!^b~%xx6Ǧvc^-Gpan=6v$gJ/Abl',?SOA]-&)6,n`'$6sWR5P/T[fhȥSL8O&t<K`&TFlVud|
yYh"ֺmB-\Iw?<Mۻ/+;h_b,}P#,00B jeV4>hS/w_/kWw5u4|~j.u? 3'2Qw]=L]*Vj*XYxS¬`U\T}pmu]-|J/(:/G+jWfZwZE%KIwdqY}grjO؆4GXu#s)?"bxwL|#*NXd=h{W`V[ڽnΚqn]k\/Fqd5#:_Xm;>ea
UhUרAo!ꮯ דU.*W*fR	_f2PFWt+U~n(`	xۺGf*b?$;h%VJR~VW^&cg*VͿTXAYN%3oLa*PENY%T35x=׻*ܪ	Qe4ZҥWxAg`OI{VsTv5,8r]rWoу-n
%)ahߔC7P\%imh]Eo<_j	V'S(IB%_tXҟ@4#PSN+B-pߨc<<mmFB}|~0$>>,FQV/K5/a.0NAi)Z 9NQSSR{X29"+BGIKFB@ +m49-j eV96aiAnX**%y^p#ldB`~)<ר!KW0mF+笆::Ie@.~qZO@=:؏@::k0R;; k8wSc<IʜŽ5^d5Tgԯ&* oJdg0Cp)}(yWl>zexDb~Tz,Y>9'wϷ58%=i:DGMCO(9nȽt;~8gнY*%U(K	<(0@)%e"Y	" wOzCr6W5nٞ`^Uota.ϱ#6r}}!R=`0SU<,uۋ\~.r}"GA.EytĈ[0p<p--LS]uj[ko io&ND<`wBWT J\	 ;Pĭԉ+q@I:	GEK<8ZfpJOfu]pUJy,nquCj%ŖnX~kq"5AΗ*9Tt6Z=h"NF}4A.
/SEB-GŦ>EܛGkD;4Jro^yz	HfX	Gf"+e2¦QZm[~$6@\Y}j5ZЏwNOʁkS|js\g=LQ)2Dߗt9֌;z{\v	c8futjo&{]p+*{
xO./Ǫ"!W5*zNw96yfu6vO(MoJRǅx ~e hgH-KB<NʑŽNV8I5q幑,l!1*&x#"/:g^DEMHSfnjYUNǘYp~5s:^%Ulv|T<<Q"_b:Oi(=Sq	E;PVN3B+	('06tX	G
.P}N	υ\IkH#)B+$&2)SòʶUdS-W#0]v(]'9H{plA.h'^kʜRi"v5&:kd4;`8/*i48t$hqF5p֪&l<$/$UU<$up?aZ$IAK*31Sg'gri$lQ
5v[}wg5;ut4{!?עӲ;ƎQBX\gp9kh]Cn4RbUGj/ߛm;VBx	4գ|m[M]]Ӑ:SL<K|4m'$yF]0ҔD2KHHI#$8xrrp|'U&lTEN\GFL{r9_470 32i9hWXiPWañ؂]̤۔c<-3|ƐόK$5'4=-vk;fՎWa9䔰KIm2I? Zޔ쏈DжF`UF6wxKܐJiZ-uÖo3jmeCIDCi.MoXV~3>']]$fL0q;e!ǹʻI2 :c]?**?Du!ו-u?/pE:Ji)i)(3rr\&)4r! !+ۀ3duѐwCHU}Qt=V=ou,%^wޛnӤ4p:veJAKZm~#?Q"ÀrtQy12XtR^DN$ ?G5e]L:O6@}Ke-T(=X,JR'm}@抎є$(cYH«U]`wǝ}h-CpN{dlm3;ד=¤(ؘEˎ@I
6l'鮬?'+ɋD("eCA" <3gmK P7> *al\B98l	@y $1Mu EAN#!,i
9+G<=P8LAPz.<ݼgNX2DbhwxsV'
lHU6Wԝ7OPl5]S(/EMB]jxvr1pGZE	棄
wcM*X,
	?񂵦e>3Ck.w"eԼ[85h~|o̅
a+N]{[Ӛ&Wv$hsq+g&\ ia矁#Y"U\Їs[KgDD5Q%u![wY4$ogϪɎk!yq`zaRRR󺬖I*3:`w]/uǘcW5 -e[PNt}\	E56@4A4v#oXOܟ.2XMWSlдBo1lL%0̰l~9R0MGE& p6t
a`ay»[rNJ)tSν![md\!t{?n$l}{5;KflrG#%m3ݺoTF:+|;GS)Al  1V!-E۠Vw_]IQ]o .N8sJqwAMpS
ɗ)P7pA!+j¹\m¹V`gxlYqɿ8M~ C'{z?o~8j;m18d].;N/vp~iԯ&/办:^ 2&.5nQ[jyQA.+|%8Np͞\ۡڑ)D$8ҋF2NIYŸb5@"	ڻ#C?90a$!,7%jp*{7OVA2&]%CM-e9D~4ux&E-=zoW#T(}6<;BHnlHZ( | t1jB^|C?<N%Sv	u͖UxJ 1l-%yGWr6J<\W_p?VsoTV]ZWj-GYo@d2CLԟ~0&q<!QL{sQ1~@z"r*D4;j;S\+Kolq99@_e{k,/B/.V6cNH
EҠx*ScѰ|zsۿKz莄-"3yDO<{{ņTჶgm0>k'$#`\zS'0}zs4.JUƹ #O3cS/gߒ1Vp	ox䁫1s*=ּB=$)םz6!/j!<O^nRmhB	f)iBVwG!\$M_ű0K).:ZqXTas~}kbr;=kȥ)		طN۬;6?'AF^Ow[B@!lx<Gd@2_
NY	P~J},烠"K޷TP#bޤ E=7'V%?,Im" hq+n|rBmY0?j-)`٬pgJJzY1
gPA?8Ni6c/s\r}=UL '28jo$twN}R.ޡXх\}tۙxgeZZ82Vh!LZI	(D>#F%( 1"ܦ80$'-D	9=Jm~f<P#BddJ3:[3&u*"g3I0l ~	F*q9YFyoz3o$h C'"*N#/.<wwJ:#pʓNX1ۡ){e/=A1GE(`0LF_$ep	駻(O]Jgh6W(X2b	cɥ[D%]E"ki6, MT%$9!}p}J9[~?aOy"{óa2,"%^|\w>͖A/0%/R7+Kr	)+PLi:S@:˂Q$ErAɩmj1Sq* KV^쪦fL=xQ59\[w~;\0eh+WXC4bFHXSIZ͈Tf3D^\_"=Z@Oj֮퀾$JK%,1$|u:r^yl
ڻYS7R6@UA,Lь 1R}43l03ɜf$i70Z8l(&VU0u &7̉./N
]fo` @2+UZzA;>O^у`Q(
51V$wnX@-Hp|6XǏ_z m:hSjCmwGv,r$ioMR4ZކlۉGYNdޚQ-̣Mgl#[*CqŨ
C9ǷxSRSe G#tًIWM$D] A~&sVuh@st+qfv~R:2.=n=){R'c֮ۊm
l0Q!N%6ޚ-p*ד|Nuw~g{~@˩Y{;,$D=~V]m$Y0?"<l!ꩱK]5>%eT+%o[ĎKJU}<Vw2#;Z5l㹮M6ϫ!eƭO#27Vs\8p|E  kԷ-(,|[O9X
ڍիWD47F-?R1u&DځW>)$d&]DjABhaQk#J5P4)me|B'Hݤ{Q~QPSIe	Ztr_ s"we_hb<`-^[[LO+Ld$$˫j@vU54Q Jt}$w4}uWUL⮞tUjOچU
zrAU
淂&U@
[O*|@-4=HMn8wlLǃr$ZuE* -0/QReHۢv1~NPI64{Ņ5#X~U<ۼ!yYg,Vk{3Ajv5akH/ CO|x$K$y-5ǔ	k堪⼓os.*-jr,4Leb OjB@ wq=nKUlPVydM?)MYC`$|i
UZmz# !J@SxIф|1*֤VfhEY1A>^f'6O*.ĸNIJu`YA
*;ݵDInBxj =dipb6,r$aWs)$)-XAz0!ؖE]OiYXLSr+F"Fg Ըhڕ}"%
H$`@akeM+I""4a.Vr+9xg1t\rB|k/^J-1fuO%>٘)O|U!oq3)-3*B$kͯ%	b|yhj\gIzA)*ܪ\5>m /bkiS)sZE6דC``U4P!3B)Yi&hdEl͓ R:O{ZD`.|!vE/,:P]L%o(QuZ1#LA@Wfp譖qMm;7_{qֲ!qXN̈́H/l9OBtaiDa:J.${nJ%رqDf$}/)kȥeE@Èr6'}Jw4']DX~ti:!j}y#M`*(^VgdiV^M&&Fl4|^9/??-Un
P!qYvtF4CIA}t!',쥵1aԺNysgŨ+ZSoO ǵo􍍼[PUy	FX0(?%d.z a3@.9ͮ U' #@9Q_l^cE&}u=y.8V%.XΞnu$Gf살TX -Z6 ̋ʕI
F#)JZ9#x:I|PUxa5:	]53Z2R%xrO`TV7ˏEnn>޽-Wk	\I@2Y93M쏈5Q#zd:|&V0ًD	֭_RXB$4>O iz]Hn6IFV㣱,)pz<TipwBͪ`4_Vzy~SR1q.
e;(1!(-%_g#DAhza(`ęQM};+_b1de4ϣM/|:
s*yC <d" P: ?_,8xϓ7Ŵ0(EjNj`OB,&HE$%b-6~/;<8Riam:BGkJ|nN(^-1,
kLˊnl_z"n[5WҾR`࡬
ABDR5gD3J#41A; ul,^.3MWנv)Oʆ &`F=ĞmNh)fSEhЈW[=7vyh=?AVt4<Ue7:>f|WH8MgK0W=y[XBsR:FI~9WGHfDlJ>>D=~~ΔR^3HWFN +~$VX1P184[?Xv綫NSЕKpvn+<*{ڑ#&ط^GgE'TH>mK-LWud#e}b}*/}[mio>q,Bn0kGnVY4f%)qCKHty\p}80AQë5V IOVDsdʚbMN=nĻȑZ Mz\qdmp:0]n<WYv/j6W5GS0r(\J-MkҞ!rC5ϙ+6,;ddspH@1,;4mP#cV}ΘXgq=fi9+,,AɕeM>86a~^X^EUaOԬۋB$yC|gp$˅(&{0}ˢP7aϱ$*O2F?y?Y[+ÂP¢,K
|1BNo*֡;ʊraBdK׌49t2(ψ#ŃD]98x̔5dπmWC&-@M	&lw1$)NF_=-R`9>\,WȵF	*<&=ԌcWBi1qW$qV3k;$dPQ	NZ9)Zހ|qB@щ߱ɦG6IXFZGKМbhF`,ҭj1Ur3GMBKA#1q)UԵ`RA@ E33J""z^ ":F!wYȵ`\`X60kQNvn W;I!e6Б'ʱpG!ꥥ=XMM77ZQIjm7*A9ڗw)t[QƪiS1mSuİm~P&<`qs=qhͲ>l*lHC ӵ	Y<p3dxcv'%)DxO`رrU٦9TXovΛbmKos7(t}_S
N:j(iaXjKes:  csdX(ӂ/WJ\)Z-I60Iȣ򁰭D6qEnuW!PI24?zxof!67ͦu&7xRig"n4N_K=!g5)2Vf(/ QAkQ+!(Iݚ"_-֮9U$"CGt&FLC"s|&zaUvWUò§0;[X%#)1 EDi+ 	GWvFJX>8@w|wP <g3g׹pˁPD7NEyh|A8ƻLzyZYBNk8d5p5&g%jĵB1<EvƝ&_\LZ⚫m	iYPKǡ<}E|+JB7EYH<a(bK@&tMAK6G+7C;нꓗETv	MU[4̽)Z{+^^g?=],Q<s"xR\PSŭm`k޴e
꽎7F6zjۇwŤsLo!H*1RgT?vy%6d+~XL`yC6l~8du<g\pSp:py)wuy8gfr	=P? 9Tw$ח\Ǚ<@I9-R{D@Ȓ(]Bq]t9oEP[ukp50	Z9tSQRH^2A48(h	i*
(r^\`/0YhQ^Ѽw,a=.J#3[	hõ	ݦu(+;CZ>x5iϹ6)B^e1^~sYJdp%ekq$u9gwq]̔ŎB8aaҙŸSp(}?-Y^J 'UořՂEo<lfg(D8@q)=ω
Xͳ7hczmy0b$gg-,̇
Mhx2kՅЗF^_a8%K>JHuK^=@DN53, ochљ:=1cʘT#ZLGVgNH׊΍Y]kx_Y|zH1Sò/G(gˊ2DK|F.2-7C5lM>QAl]J_(cZJĶYs&~F0oyv\Q0rFsx$q((NJNyHf15J+҄++̰\maz	Dj	T;'z6? o"Yh&7;|]~*SN!c{s#%m"B/G(e(HLlbM>;^܉y{ڬ<} @ӶTB8:	u*pDͿwFBG#0XpʭSb-7;H2C=Ҋh.([h7;6r@C#&Z˃oT(XN1SgY0WW"ϔ#N&;<-O<^R!NpBW/
 <?[R~x
@~+\mEmcLR8j^^ྜ7p˖ 9:uQwwOZ,%P[Brz6<AhL]kנ"SRsV'[p-#1_} EfU.&j#F"6qnjb7ANKz7L4˪ہw`Nm
 !8k<cJklQюop*6ܨ**  'A1r1!S9_=P%8fh*C&,֮:c侟F;QK)L(#޳vtXtaݺj Ϋ}Q% t
y	O43_{Ӳ
8bΎhLo^H6ɗ=ٛ^Y<c6FyY`{/i'ft!I*鬢!QP''2uʔ%ڽՅA25v<o"E	^D%;$R<Ms!,xw$YX4acX='@+=0ښY>RmG5*LDT~9^"e`v]P79#>(Ɔ	´SwI;N-Pj|.@e#_ON<gu"h6/1@cym-h_`k/2@_3Cօ6KІ.o}DFxXWPei ($8P{6N054s.	mS6ucê&{u0L)pkA|DؚNM{RyTk\^^2_w2$Ť
滚+;]Z*ۿucTnZD*qA8ข)Y9		,hpBWhG*di`fvAf[]1]8\1DF~Rj1H,2)E$15$GIZl*3Qö}3u,{r$kww	=v vHor*?`PvBH5tgS!ɼ/@sP@1¥~2w{zc{j9`aC
b
1Js{L8@>ehd PkcX
75׈xDNY͞uv F:(.udJts-q|Wp;rE5.Q^$CcFy	7ZDU D8vzL(/NR$֛A&'
mv+8Xc
)$8(2>.h5^;\xAm~>2R=;+-z-a9ЃF#,&Vb76 vp|ڛ1iQ?$F<"󇪷D6I3Xi<YsNeEZw.HyH\LQIZc=\BsKx%Q.u©?Sgቻ?!܍~Xк^#iA驰
}Żv˗5F[&[Nhon#^ȵ[F{V(cIK,.~yhjJ}n,h]ȬRWⷎDjYׄZ~t[.d@s+Ǥ?)vYE"S&2(ƣq).VN^xV|66HN|	Y#\љЙC/b[Ch2#9`0(ݍCPtͿTI3ѐir]<z	 P&qQ_I'S|L6_&a{]Lm;OX'do>tUkkt4`-?DJ0at*&2úpӃibc,7chpֵs XcAXlɶvZK]!ݨoYx74$!$ҔR$Ԁ5B_Z5K(;"8G4(e%Ǣ{eʟ6@WL>1auj2?jʒ4Ge o;anJ:hr2%kpf:G`CAA<vsMoUѤuwO?5#Dxc{n/d`B Km'6$6ƴvp;?`8;Bǚ%xG}3(\ACL{Uf@3/m eYF.:-c=LFNcuMYrSK e@Kb9)k|CYmRˮYW*Ĝ
-2_C`=5;]M>w'3=BU)wtҬsXo?U(9#HcQiMClO~KjOsTg	8O-.Af0=PSjB),ݸ("@bG0wB,bp}jNzD6zI30qhڨ֫<]YbhjqYHlw+^Ht	g{uF"9Darlj.zz:O	c19b"Ge2o$RL7MKVx;	~|Y8-jT% "IJ<_	%Ds3Tz~eUئMc~FRpK4 t/(6Ke|R	Bp$5VI*>t#0|t\DSPK9omP$g<lvub}}r%rdsNClϛ*tolA'f%BTT:_1:N|<uk~̦3ؔ̋VSS2-	0TW~PY8&wCk rcnFė+UˌTZC+IQU755ܮYu`}1HDgLeHFb	N2lZyPA}I$^pRQNor~<ޱNʫPe#lnj|1μ[iɸVGITĦyn6[ݎ80$;['<:No3Ssb=,hpXV3qFUSHn@ TQ3WφsѧL'Y	?ۀ t6H乄>y)2!fxNH`#\ݔ<JDz1X*h_oD`ģ=%khkraf}KNd ?ڜЦCI1S#祹U>Ѫ.ቤNs9d?t5`aFƌW~T'$zbÛޞj,㤠ҚVp6*Vy܀xHA'?g;\
wYo<C|Sd9]+|*`gףZ ) \=crO8	I.*"g
Ns4&MQ	ȗޘTzhf%jMX& 
+{=(relLEXy;ML#={Efh87`y!aO	Í.P}	PBNp'z?Y78=~DTYu~g	ٛkO68|6в>ul
+u5@v]J>ŗnn3.0b	
Miw]5%eU"ŧr\lKs!#y1Ahܽ$S~__p nFiη
B|#A?+z5S95UפD|D#T'yզXZ~5VT&z?}q`xeA7ǧvOᛶ%xn|no ^ÈאXu:ajiWR%QS$p6h-A0x)Ucp ~]F)yvgs&9SFZ;`2=ڙ@/iʄ9@g5	-l݂:zϒ&ٳ$.?8#󏚒cJKaRnqs>j<n=RreW^WqU`zRh㝊brgpj09'$Tt xjW8gqJm<8QbIμ߹p٣oI82,{r)0DGjva%9:*oj|j?nnin;60G}Y CR.CrϤ>t[>a8tkv6y%<	iݼ3t=O&>{C6umH`!M7Pyq~لl,
.=!z}luR춵jn;	]q'po?&[aLODߧgXeǍ[>h\Y5IUvqF0ɑR5z?2{@2k	z>j^"b]u1mQlzoN{əW[d6i܏	ͰtD
f	qR'&N?2G.бgLtuZٚ :w;yPVUllkm4[F,'AEXsA3}65 =t9dVjrhV"+w`86mmKclPb
uXHĊ]:cϹ_2Y+z&KA$xD$0x=kS(1sS[ɣr>PQᗏt,V94#8]B'f@a' HP	٭;=܁H/~5{7zwc~\p`y\1(P)||"!s3{fh	7uzoCo@4J0"3K͛f2ˆÓ'&'6Ж}sk6UeԽz<8%:uRKD`CT[P&Drg_[%dֆ)n1tΧ
os.ǧ{v=,^8h;i'< q˺8S'ҤwӾe2}s(}o]	 \< n_W!>8;Gw qOݫ
t-݂Tfӕ	BrƖ̛|ڇnԹ^z?>OڋgTA>cEJX|s	:HYg#%";ͮ{= ǿAgl)XM~
^hAq\G?̤@n[4sAb梹+ܥ\ :w6@o9CL,XP B胝XȊ:R-hFb)`zZxhv'+avw}o,1V$u=6kooo.|X4QD39,vH<Nyou6֙|[y7#$j6MI0աvtoĽکi`aò}q|,/MuJ{_jyHzoOAr7XmDtVVյlImG{chxtX$L%B4Ryt-֫W;75EVՍe,FE_ἸMfܪ3,&ji2ס^c▖	Glq@ܜe>g6U2̾lMDl'Qn`X.\Gl"?[*7zԐaX}`q|doPA8fŚvVY]7ᴘ4ʥ(Lo#gM'GFP}$ZKGR+5x)BRϭ;)ΛS-73&0mY.3sYUR$9|VFBjf#siS)P/Zᖭ.Zŗ}M`! 2Ս;kU3 ZC}`-~S_jxbjzU}SM14YL:_U++$t?LJT~5{ʾ$[?YFYys 
Gơ1P[/l';56x]>}t|hc@^吾e'@4kFIϜwA	{UaN~nTiI^!׀C]aXWkP
>"!9#by302=r͊@5$Ռj!IRz2U9!RܥRxiТ@bH;/1#ơv4Am83iSpnrN9l-V%`6Uoy޶|WLj L,-{EM'< QAF:{c˂6
xc;Fd)|#Řr&)t)Yiui7RxT9kb'Ajȫ:z|t7:Ǡ(CW!SXذ7.PD4aZfqWr}ut[g.etP~Y`	{`	54aNih,R[1\wMW,YL@t^lnCpOCp]\ZseZ]w_8q6^El{D,TsC'-?sJyAFgTU S5g䶃ß$ΥDm~]S=HI閠C :_#N/|R-e,M1Y3[Af11CJ!ckVUvV^ZbFE9:45KKk`:hEǃ]p	HH@<XSΟ06gLw8z\
h q
{qhi
TY=C`\>n` QלX[ rd}a3
<xS\7yX
R7,}5}t=w|j<>X蕂#CtWFgjq^ 0;cU\dkvgWgp#Bs䃱\I鎰MwdbzD균2GHG<Gw<ّTT|6Hjb[iXA7
 '[{;O_<?F"FBAuSh3NAQ_U3"g CEN^{hZng-5YKYݶނa;F';JaT .ļsI/O2嬇fBםG3p( YF[h\F:kIV<6^N(EQtX_XهU@͸3B[yb&=K4NNVu*r0$:0!TY8{^_\]{vj41DANy^_JF?ZVB0ڸb[ģpB[drpp2+SL`VE-䭚W1dxQ"Jn>Be6?3Lq狅<
E͍3%@i
d4Ĺ\ɼd	Qv`)nE'̷3Nڦ<0}n3
VOi@Kȡ 3rYeɞt
(0t>LI`P `1ݶJ[<].mlL=._^YJj$AǃSi[A"$5	~EyS>ќe'/bj Dim	Y|xc{{~OMkwF1Cv	x˼J&Ԥ(V|nao021&7r] ~AH/%؋A>#Pk8Ӭ1CǸ,3zD;}@6+|p[k?Tg7c88}V9zʳH$A QkK[:
0bR
c=u+p!_ˀ'v,Гۚg'w4AH]C&x99Q.`!=ţ@1PcvSY cڊLaipfyPI.ו+Y)r3w!)#ʘZyԿbuIO^POn<^k6N$f2"0=/nrPY=RwaScSN	:o>|y I <ILXJn(	*FR&%f3f"wu36z㔚GCf
Tf E6ut	IX8,Hq/|\9sbp_(ghiσ)KҖ邡.5ݽր226`%/؜"n#?.^鑣JX5+pV =xd$4Վ#FY61+:)FDN#GKP،7;.W7</!	Xoz:RN+ǩ{hrRۚ%yEi+8A)qRABl<(B?(QN]z~RsV"Auݞc$b*	PSᬀ͉懳;Њ90 wvgZ]k4#ip׺#ù),UEޜ\wX{haAj".l}>H +$ds\UJft͒]RݞNeY OϹ=I&֢ʤؕ*	e*2Wk?wEccU8HKvIrTV1|^aS]K"	_sOIwuIT2Y?PEpvДĻWaXA|\}PyF_~[T/]J[WWc_.7)U$?#C
lC"9X_Z~	%ƇSKv9OhtT	Ֆ&6eCok4=̑(j9UCb̺),JYG)}Z.}P'^2k'Wj=4VzJb;0AK1O5zW(D8Kҍj01PqX3NQ֛qp*` zͅD~d>p.G1s~M1t5ugt5'䱻^k^dRH}HmZ]\&*`o#]vjw~/kݱ'YOv:8hf$=,?XT^9FTyŎ
 _ZSyn(I>1bK1pznWo`',(u2ثbz~<RYWvT	tV\J2i נXwf
070I샤O04pFU:o#pIF p	V}sЀw N.i-'-f>oӌ	挦GpdK*q6YgyO	A#PQ5d9.'Т3"<O.*I:P9)к(^N8i8f8^-
5[s10h@_$Nvp)1!rG(( |:&7SEA>|ƞ<qMK5U#<caomq>R!PNT8Euay)NKla6UӠUiŷ3|/5s?)AAF9i5|=j?"Cnc7O3Imxz3wQ/6k!x8n Zi $:n2>5o>}h\)!&dxGDAqc4)q#rZCմG4)XAF)N`˃&ySxwbޒmt/^b"vAi(~Y$^ka-SaKYyǣ׋ ZU7zMIW9	=|U] T5w*?V+Mo@g F(ƓـC;&1kk^jljÕAX܌&{F=;@so!*ZN-`;9w?UK<lgGZ7,=%bbL$)K`?*̬]䀙c.w.veN Fi4\q fFW)Yo5{HD=`.2zzˀꁾ	!%94gh6!w?{׷"r[K@/D#RqS`8U+.sG}2<^H!$gW'k7=FѹC"c ނa3ā1Qaf`Iei١* 5h=~sb闎ThI-zv0*mߛ_<yFOXn~ۂ	7^pC^yn=Y5޳ַdZFuRXPjײwNŶs#"T}$OG0)pUtmP:)ѫ즚W
Eئ|*kE:7m+=Q..y(&+@.gQУ :/8*.=ǰJ3b7~;
!6%b#63
2Pp/rgCwn!'3cE51kCswPowWM*VJ_5Zx#*O͟O -,c^Nw2kaicGHI7W\r\;m-|ˤv6M:SA?-={E~n'\{:=?#h۽b
MLUv#közy4ϸfv0ٺ^$xP.~:*ꃹ2@oW	ZNZKɰ[#%׫ef(i6
fu3ƾ.s6Kb4"z;YԸ fdjnnX׽k=3Uϑڏ$¦I=>BTuM.4V$Mxc>yVܵkk"%7P.:{u#0zA)@dƲOa>3=5x`InֵN~=xgv}}gh-YB&TcX[WQ.V%Zi9Ǹ	|RXS.8lL[rsMq9?51F u gRIE'jK,qPhdv<
<Î=mض˻'è.]+ˆ)\JS`#
eTf5_zB:p*!=(9/jx;yo+nJߗ:u:,r"!Ptj	\t%>u*F9,AUŭtT{l[:G`M`G=B@g\(10Z|FGf15.wxSxLX'ȝHV74Sb6AIeRExi|,i|e"x49gHf}Nov5#@e򗉯y4sgpWs
^amd..xco7A3FwmM.}X+'CӦ
㶍jYmQYq53
Ӏh ;t-+`YIoFʹjgBH+#CuB͗ʪ*M8z&j uUMGa7NcQ5Z"Q.lKG*re\SZ.f3L .LVB֣2R~s-z)YYSpP%L\8qOSUY#}%]DeR(MERcAN2c6&]a$N16Fy{[BӧX_]bqsҍ9/;I&P9Ӱ@<*vitVSE,YLc[
C KP	,(1Ŋo-APib[p60y@ܤcm^ğTI[eu^̆ކdɥ̹#t߯]jRY)n6D|Ҷw7!Myвa{?N3Q$>&5[G{2\yQbx>LB|y>A=L]
>|_9{\Nv;\DؓGD=ct?ye,Ps#rb޴+x}.ϺxӬA1a36o[_nx`]6%pdjVLP105*&AÈ./_ds̨-&*E=b8*k UmݸG xZ;?jn灇Ŗ_g&ܶM~c͡,9ɪo{g>oD\@ϛ)cmӟ5;3B
;G:DO+KM֦64#nABH
MO" {{p0V6\N=sxXjcԝ
\]:cp!/6lͣ
"Y1p͞ce^rt$D'Ћ2SAJy}Z$ě|֙"PN<B_ٰ U4ƫg_዇y`Tj$k3I('Ԣ00Ya	5n7su5~|mA!S{AX$7;(O~{R|KoydG%YOnfچkcًTNtM!O)]92?+0z+FFƽ;0K7O\l#L&dB^	I4()4[%Ư_*^&_.sUJJØ |n(ۯT#BwBxyC^k)pZ6փ,8`MN0vvP!1;)&,ooK#{1~Fg&O8+aRoL|TUbT+Mw6QhGi<[7º1J{-pps6{'hk=jK<xnG(d=ڧr:0A&4A@Mnˇq>uDʶe~ي'oWX{-ՄUɄΧW;ىw!:}ZLƊe >&+	AԺ,P)}L=)JBL옲 zv\Cdkfά
Z
׃ٟ!#QoB`_FFxsϳtD2n_[/pAFm2a5 }_q^p?5l6F6(7وcOr<(o?g)P^(rT1)"`ysvc5DN@`D0Rjm =wnomP-F6N M]F%@,kWP}[)Dm6f/ϠSyLJ$iP\jBvYk{݊8Ϛ*o_PWz+˙>̒QFZ!q ^2{`hrcsCNQLnjc",J􉖣}
F(9r'#˙75?ֻy4}jcJ֪SE^@FW-x]@&-0Ӱ&Υs-Cf>+3y^\w12uz/mk5M.lRC^eϲ7[G3tF]k~Xk*W^Z-ߏ-Cs°6o="0l8~÷1j;yW[~qP=H+=ϨõV;t6Uy}6(5lP5; B1!_#.!rWj_9J`TTױ/dnHe%
s1s2$xʒB/opG{N@#-yex_ Ƞ9=>:=>8k!a`G	5b6tڴ)'edj
9b!e@G+WɆU1IۖOAjȏřxeTYu"ԣ^$r<kK@|F}D8_aӫ cJ	'p %&L$ʼOR	xCCfݠiڂi"&
O՗济<Q޶i@alf^?j>#&ws*B;`X̵܅+LG5А:0 eAPݳ/ϠeOHHa8]՟Vےԭ!s/yc.u7Cl[ZAQLyA}0?nBuSYhl3]	RzD7*C>Z]wԱpX=1N5lf^jVAlVke9aC?B$]?gF@:gc蓷7_"q?ԁ́SׅjPWxϫEAdȷ+RKIC+6hQ'`7H2eB龙Sh1PXd6d*X|D్99l
LDEtMl$+rJT]o(Ԥk]z䥝	ᙓ1F($NWKjb J&T"K."F$;"]Ja`^f]r5ɴW0TH͛ ^UÁ0@~464&RL"ھX0	{ǒt0
'5u~.NCh9-d1o+|ss9˚/a"u
'AJEZ#U0g{,{hvlCh
,oW2Z q+ҭvF'D#:|#HoIG}Y3;s=L t|/;MA@(D+(r5hJ=8tq<sfvO4`
K&j(pPm4樻p SÌ肏!ÊQX%)\dj<Jk١RWi{pAT5U~ꎐHɋ;EҎm8">U9/=9eHWD!"v:3gԜy`F0z`1@}}j5S0$zb~g*dΣbv]'D
#gS<~n=t홉I~3	zXPϼ1֋ౕ9jH;؜:-_ݟ$6\WWpi)gG~Ycb AR?-KJ7'TyvӑczlW݊PKF8|—Oݮf)TUD4/=+/PEWKfX\݈hM7?ӧĀnm߆5iϓ$?xUFiu0DiA
j7QMkhy "Fds*0PB?_y=2ʹ;PiwUYn*;WRZk%FN;XQE g2qVEa;ް98!Ue?9-w}XP.4|/	HF~=RL/;[[9w)-35v0T <z)n$j'w_Wh^WR=ĈE]E~5>8N d79m~-`ȇ 쩱v0џ=Nu2U*h_	3_=}n5Fp] !<$W{s09Z5T"/}@TvCCef.W;g'^g}6U	fcYg*kɏH':g??\궔4!HY|N~/rgЍ!ȎzPjC3֫- |޺߀v&Mק
s}al]&ðLT&`3(a5\{qAzHG?oxUC>?ر\saga.<&	zYr:c)Fz_p?yʷ+a.Vu	 -%5N{䬜L?Esxtg׃g3Eܴ	oƎg{wHyIWeg!5&ȟkKiy@Y=y֎1_ J%I)Ä/CHyb7Awg67O^LTÁejH$6ѐÃ|UI P%d16~KKr$apla, E\W[$ݔFfu)8cO	5cUT5VA;qcv|&-
O΅Fӓy]`+?h+rc4I{5۪օd?p#<츩Zg!Jq9 4C]A1$'R.ӹCzs:dNw(Yww,!>+]&u3Q'xts|,@h̿bGrj8a<'Tкlp@',ގ'%UfBeRKG;)ѐ8tX`* bg=+iWHժn 5Ke(z߼}}7kO7cc=0Xĝ\ZpygX}y
e,*h#^?7^!g~|"6 ]*r'HV]i5/<O$==:t6
h+__jzd1*慛J%;#_<SsH#Q~Lmpf^MՋT$ j nzuqRBJt#GRRQn!6o/DVktpibCZ=a3.f}Y]W$M<y$br|Y{IiUrAid>{r@ 8.0L%5R0 Nٓ%O/G4gGЃ"ÊFQCsB~k>'C@=A?, Iе?
{!Uh*d[G-; i:o`}KG!wLv휡PB|*u!J1N֪֪gb NûT_MBp8!\*aiy]ӍETLF)fIu	6>^^ܑqN./ǹQ2m8ZUuq׆%Ƃ5,kw;BF|Z s7*˺A);"?_~:.[m<VXAGO4gJ^@b5On?=9Izy{~u2E.?.r@ܼU'H+Hq|cXלzKLO\K[*FH*l$=fyh
l]^y="ߞBtojz]L&O58ncҜB*h%dLQ9c63ߐUSAX±Wvo(Qv
'`tg?j@з])t޿xd3ǨBpM6,|e[OVGభCl80B(-b^ܭbJg>d0GDI|%9l]BYvZ!-1@1RUzJ!X%pdd,Zxc(Ԃ72){ϡ,#M:븐8џ$cf0ε}THx$#w>7Qf䙢BFenu	QVd;,.ƩٍxJvttN:ܝ!9g> "ϐ1@qKqis
p!"pș][fY#C>\"O̎ Qu!"k"z9+h>jzGr7wiN?tmcJBS:횁du514:fՖ@tR }.!]WCcz\$۪*:9W$۰=:B.&3rə'OIn䞉9`3kz
uksƕa1\G򻎙+o+f&nv22>Pނ"(Ϯf·s	2e]$.Y,	eѹhрE[hmeI0&qϲ\2+>37$jlnpVlDcas wĞ.PGǇr/
hz5<sI/!DWǓY*E"/b(ń(%3][ņ_
3U~~g	=WFL:0 ~!s<tzu|rmde+K$%Rٰ>.g~/~jc]Luk{;.´ʱ`ҁ]  GAPLE(^e~s稀 bз=gBˣ1ɨqZaw|.VVy5{ZW7ZrlJt42;SȿnWq%+rWԇŹCP쁂iICĶ/շF*ȓ?D u;~]O{/vSΥp-7u\absa W"k+֑+XX3u	6m0@x$é g424ԉ|d/5O'(IfFN씢r2dj<-n
$ - Zja$g,#f3jsVx
r	Z.8t) L?V7CcysxS>|ebi:-gƍby>G/gY|[|Wo|C[O"nKATwAeTG>NWØod+lW{噖7"HiRwptz[!z24(5.?/ "(^+\rO-j͸X2B*醈
t6("49 kĈlX? {KMۑPZ9 Z)<$__aTrA~9`^cp.YKHX0¥@w=@(td`=JgS1#9S6'ey{>+ ޹<׏8hanyzkOhݍw&ˁ
o!9Gbdax9:ܖm(@3'a-hh8f-YQ6Y<avm!,dӖL<b?l6$$.ed0U3"Vsh?87޷2;$CD	,}F{!QiO6L-*rV(P	}՝#p@M9TWIcL#0@Yf.~yۊ6+)·F8֦\h	c4?Or1U)BdY`Y,-*B޽Z[i\W\V-QiE
jG-E(BvX =z]E2lv9W5c/:\PCC/Ss;l%#UL5a);_G#2ZȀtA<SyX鞯S҇m ~V}~o;7:a;O%Z?'o{z?q2snOʈ8 gC^bϊ(mtב=\wUBoЁ3Q,_N3XnnCvR$dFl<Ow.=,7;:v=o2G2^N5B*'1,FOuCS7OPU&/`A/%1m&6~]w\'7{0myfY54-f7ti)

e4uŨ*rF'~T7#I;M(uC"Oxh%7A^otNphbrRA53HWAִ/Nވ:A]vP.\*O)@3_wմ:C?0d	,Il^|Yӌ-x pe&Q$_~o}j11rAv&09zqmeZd]Dל{ōisJFGByt)ٝTe-Ki@?!0K.wܰ)Js(tY&D'
ΉA8:ϗ	Q
!YKϲl<1҂/1vcTZͲZm(Kʾ;O찍u"޾ҿM>@*X>q]z:F:eSƔְ0x0kac} w,BXޏG޻mEփ\'[ԘQ=a[*` kݩI080VjpT`:|6P΃6{{ilW;*YpcLdߡw'i8^[-?BU$qi{&P>>q@͞v~]"TT^d6gO'3mʞgۭd@~TQ, z@|RT
+lLiD6W33MRm%,KH#\03*s>r淃c yu}ºq;9Ñ#Hg`)Hd"RpxCL3ڐp	t\}Acr
eN;&!Iba|cf8QF AkgksFGZoƾY\qQ=c}C*ZF}~'AkQ#o<熀>㳆M,iD]-_Wdvf:&^wyv@e2뙐T̀`c-wɇۨnܝrc,EX
Wd=>⥫0uBX1ezo֐\1݅$Z#_"qTـn9*˥C'g`$A%)">J%)Nf'#^rvŭi,0ڗiv5zYiQY旗qbU
*Wow<+
VN]B=yvGxҥz6ӫTf߁b r\Nyś:7KK_[\Z-pGZح	̂P* =Cw:ÏY[22]|3qNfPjلKܧҵͨzTm̹آ	>'6TSq:iok/ӰNOvyYp>L'm.i-cGnpjǫ#=`815|YiW㯐sXf2]_ x~"<W߬m7@맶8tOWU5hԁ!ev7&hy}cky\_UM/ӿ|o66"S_OyoߟiMmX]8lzImLE\Pce#/z?lwO/ҽw(ht<!Go_TͦW'#w-mg=",Pპto)t7(ғ"f=^J?`F~$bkAüI+Hªr-oc4Wl&
T@..L;l `W(#`aϢ1?3c
&r2E%9[7bz\"(]09?z(T_;xWr1FmOߠzJ>9{cR@fe0Lըcs5l31s^]l`ݞ &L$0U7$*kw]ix}1)6EϯYY)IɅqU⸪( @}礼o>VHi_o_J!3g!9nFQ4T@0~"_Y (pJ%F|G ް=`Xqŕ>.;;{Y{'empk-C[^=w[KtgqÈoA	
͹B˲Fi!JZ5vZGX`D 1)9oi"geR9_Dh"1!5˓\iwdhUmȲ^Fe,).)%z)R;$r\fwO}s` ѣ]oԓ#"
*
/	Зe!t G;Ul4gre4jb0`>KJ;ɯoNOnZ#҂xӄl[mj5^
OnঁN7JZ~K,5Upu]iXilVĤ8S>	.H[܎s.-3W.;rܢjZf]LEgb>.{رK$g0sn*"jw08^\r_ES1?{[1Y`hXA%bqm~eՔ|!YR@fnK4IB? XQ]nIK\@ߑG@
w̒3Ltˑ\Du5yʜo[y${=PDL	n1hSAl?bwh	W9,f_"kO1+eHdPL^.U94NrC_$hzpV6B&|ɺ;PX WY 6 ғRR;?Ol$>?WHRE .
k,tAt>}PRkvd?՟Mbvp}-0XLh`6E
;%Ƣ#*ޔ7-i;w[?>~'/s}ZNҼޣ
P訚7_FRܬ!zaNא?Ж1$:tVl+dnBP$qvBK;SO!.4$=:>zyNT =ri`w?.w}0;Z% %t]1Lkj~|Pλ&,ٲW\V^=;V!a /z#Rj{gzв.IvӼWmܱҽ6ҽ}6RVq>1FÅ6WE1Y(p*GKH!$[Ӹ~KG6@ۏ1.̎]$W$AvZ-W+8DMQ7h#"z8~p罞Eq	XgI2SG1?Q,?`qf~A1,byzaSyW˫^|?~W{ոF614P;+GlK%Q{N7@7#1ύ^9I4%o>{Jff[RAp{M$Ŗu㦳-h͸4$^#˔;^Ru^Kյۀn?XQ]ѯKȜp%aMv
zv,  ":ͭEs8OJerf:r=6FmwSg>$5n$H"#`R@|]TXI#SO1WAh0,Qq)HDpA^	@"Yɹ U.ǀ9;\A5ĽF?U#T5ٹ!h~:K̍ccz	C`-x?baSAs7LlѱDc22E C$K/ӃHN	gС׭+g:3sɓL)⃳~P\3wNnnZ.ݚ80j4)BƬB(S?S S"ѓ1%?K=)`$:tҙ.%/L!Y'FZQXw8W31NTqN87ҽAjuu:Ցw4;#6Ö.[,ffKŝjpW 2`6y*$t(!vYHWT#ͼf>yx8cXڄy5U<rm*|/)tT_ UBԘȒgJa7nb ?/Cb:C)/pE  B+l=@VHrlqeM)j٨p`%9tb\{~7dT?֘ѹӸ~0;.~^U8ގDG6#1;qFh3DĨggc3Mdfߑh6\7M;G.0	0vt͡3rԻxXm.mVH"mplbKsDs˒]l^9)G]dੂ=h%z!zFT\=m]+/Ahg+a# e0 lF͊VUUӌޢũZea'w~{.0!5"mrh׍51_OW?F*+dCZ!U([>1@kS$;`+5Qnnеbm+&<3!C +jpLx'N~@#??KWq U#De'-^$m뺾*
`JkLU_
vi^k/喘Ӵ	xsXZKiv`xjo5=8|>ɻ^c7ՠC1mCHWF8&BWX,\_$3?BJ9"pN@ʳ5D:H(<e捌5Ku%SSJX9y)NX8Eޜ Te9an:TR^/LVL^W'ú!3	)異pKwk̵Y^s<g3QM
	Z-O"Sx,G=nO-:pդ8v*W0/q&^od]d/|Ej/+/lzGTE&ŉt
.orUr\~^` j3f75#ogǾ|;)VZ۱6iPQ5iDv!ȣZtvnmc.nԼ50N2% 3a{eQV
!f	#)CIzi~4Z}z*s |q{]cr[m8 nچc!G=z. zOͽs*{ˠR1ԚJXIМ@t&jd3v)'.(&fl&St0QBүu]LHAiGr(sꄄ U$rkY5BhaM5R-wT_q,;lt 3R	j]y>Gz#t1f_brMzvش!ľ
'Y=UOaEغa3wW9
'z51`!:kdPB!^ˌ0	2fש8>	18b>~BkwҚ.T=)|, `-g9GDސo 'ēnB£ldPށ]#3z֏
ZkƊ˱"Xы𥼰j\d|i7|G(BM歹ěKERnIL{#/`]E"GmLY6uS :M.AɄё3~24~IDjx̺ݒl/mG|^W󥑥/b׌4g
8O݇@ZٝJḇ_"%T&y&y' Gwe#4Xub mg<&Ly7:?,+B)(y1n˷SYq`*t;m$Ucpfu\L*tOUo% )y
fדj6K[2yhqe[慡6H+A[iP$'$Ǆq"()hH?jv6hI)AhY>Ͷ<^;deuWߐ,,w.:Y?95#2.aױ\Fc#,0W/"y_<J uav~
S]}8L+C%mL/>89jL6P`W6[~5uF]PG3/𝈽:T6CӜut8߸UqR5z06ֲz΂˫t[PaW̺寖n<o';3;y';k/)F	R6=y0}98%@%;mPXD|ZY'S"ձU-t:_SڙcܹY}Z	ݩlN)OV[\=g̖\ZlsLkq6kZ1#69(KJwΕ4#%dC}ȑ:~8l!'0ɀH5xek>
Un$@C#!3J4D2fذlJH)l1̝]3ph=/ƠkqR\o2mg2og)
9m>5Lp>G tSﱿ :[	ǪV 7~)Oj̳0׌R-.mãC<>>{4kh<\}Ҝ֯.SK5;I?I+|H)8wID %FF҆<Q$?mC[0g=h.	,P%z&3d)틮kݦ/J5h3j9TE)RG]kn36օz3[`!r^+vL$$ν&ґB'9~4%75/.RcjfoUe<S r6T]b{<#7ڑ;4~@%_ &WϹmkr:#=H帿s`?%YxtU"%jtByT"#FGH9iTB bٌa5c	<pַ>7!*Mv:yek1dbcS>fu>F5~kY,Rqr,ʚ2yjeg}>~ISB{OS2B-]̘\{x=wX9ЎlA;MRCSYqyx4NEbKA(dcYNa+*2ƐJOj&8Rfނ[/O@\14Mڥs3Fc/iId5\osfN_M/98ӯ$#k8c蛷s٠aX.0!˻!7Wy>U2Xz#~	Z_x]7VWDZq,=
=ҒwH(=yp1JTvu6N
^X1e?oe{c֯^S6#0~aQ`;;@fx;}xy&X.5Z,ı4BBhj9 4s)@p!'0H.v78ZHO#S-F.S_i{؆bPE.fn/7)k~W):Gٰ:( F
4!2,xuuݩ%T/0JX)Q,6o}ƮStΘ.MgEBԹ	u^#.abt[J[UH9YiVÍxX@d0$=p`Wi=f?pOozP͢ӫ}r4:*Tg&Wz=-"
;8Ϙ۔^1{_8mrM$GMBtᢧ[;z<"}݄m59=rvZ1p݄@Gr#Ք^t >.+`qy=XtMg-sh5jƘQ+<9l9d*!	j2}0@%F+ϥR'M,L3TP5|!o)˷wt2 [iM&b|\8,ɈdyRK+ӊP.RIHt(qB{!Zv9ף8ĥ`!_֔	W^KLFFLnU[R"4[RfE
qpqˡhx^ϴ UeP}Xs.=#=lS7y6:nk0=Y	t`ó0:4}"6SƱ߾h=[4ZVߜ9%fJk&tHۜm͡]XUGl
\AVyz,Y#'c(49,r_ ~0?O[f?5w4:nw,\A*WcAĪ踀$F9uCΥ5dټQfq~b2 6a}FwnM.!:F/jXžw	&\a2`ëý>mJ`X"cv Y"!t.%b޷yZBǋXMQ4'qF=W D)Z  rcR8!uDfqt;G*UPEM1)5ոtiGS^RYSઔK`ͿV|eD"@%tzͽHd*vt'T*/Ú#%w+Q,auw	SLh<
@P|=Gd_\9.$r)|j*;# Zԇ,Rٴfאj
d	q1XAҜ"؀OOjY	iF!8 a>ъTNa}ѲMMIԉbDje́\J*z4n\74?+,4'%"Z"_Ο~~=L7/tvqbf>D%\bVu˲z*9]mCCTU!ܘR	Q4υC<8>1zv).ųlukT}%(l4l>,
'X[BK(]Η IΏ+LaJxWU;AlL0۩> sɇ t:)Hi=Ah\wTToa5Ck
AM%۱-i
(P?ި'-xfg0܁~.?B*8??=2Íu]=1W'7h@739ՓuYwxk5[4lH?SC-.#
CGԼZ4Qq5q8{NJ.q*[ӿXkhNKِafbOc#jSɷ Xs1v-)̊JvlE&*rPnJDuP\}0*԰6Fmld-΍ggP(oی}Exq9_FTDQPFԞ("}P%K!K#b>4D0p5m~`.zcLom`nͽx љn⫷70`.VMͫ$V}5ڶMi]JL\: Sڀ-^xJܐ<0s	xZ,bZ>~
^#}	SfKtI5]r7Ug=)SLoJjPcay6EiSCsźgiH{ ]i
88?Bz|6cb?GA83KhكбOGh"ɿAy͒odz K_7ݦSuc.D<*H-l={{'ڴv]t<VZN?=<=ź=DQ+<zے:q]!*y[{#$@x1$0\`Sڭ@%1,(g'{NLNe</	B>K8;xmQ>u<$l?zop4P,g6='9Z2Qg)x	HzɾO3n#D4zv	(40ؿb>r#Yxp}!2Ki.Xj>[
n:ܬqQiOߗ/$	$yyLazMwSx\ub~L??	(oF D^ު؊B!	Τc@8<$Y=#&xUlq1mK^{n rQ䊣bՉ$M1ɿ%D]"昋d+v6`V B4zSEJEweQwRN~	,/9Ʊu6:/)Gyf$xG!wl2`.gc%^>NTPXC3T%Y8UT6|ekꇫhmo|'9~\nb`*u3(b1SQ{pFc)T=H(T_nkM|ХwwCsw8!0Isʺ,쇍.,֥R8o\QjUhAmX奚Ir~y
0k`l9Hm~xVPśYJdtX4)= %pO\vnQ{[4L'j:f
z$o_\gXn|@u*33H<±TEwG*Nѥ/uq4%W	MALgr][έYE/킚.#!M|+.>BO(
^+uQUM6@w:ӈYw6_# Ξ:fim%DP{+BZo&i;N:s.A1эx~B0rAgu
^+\21*BqP2O7 g$%d.Jݳ'lorl<l|?lze۠%^^hB]*V?N>)hm:e)WjF˪p4+>nPe %y&;$A5 "NpքQ0U& V4 gbdl:t1lf7l6hڽZeF&b$#E	[Vf2%E$?)y1DZ6(u{+~`GzeVYd1`|&j˰33R\
rˌ-E!8n!#/BT`JzJ@2BOs$Y6?CGc eߟL/,	V`߈guTg7Ej!k=uYk;ԨL%ArݚCeR66xkWp4#vtjִZTܞ>l$Jl2hmn[ks2YPl-A ~vaR ;l8<n!kM
a+Ã^_zȀkG*[OˑR4pA͠ Xf l0*.~6ǞF4]Ws!Tdyvkqq>$X^75(`IXD2QT"'˟
3::<	g(W^NKZq^ϕ#ZmN"hZL4|o%P_BWsrwYZǼX=jޙ;8l甞Kmmv*i.;N#"t#F2
*#Pn$1E71o&	OW%(+YvrQ.%?%sykCtW	XE^k?ؓ*}g0`VLt-=Q*q^YU
'ѡD2	1uB@8
AwUI5-#{gjgDbyQ.)9{sTfo*eS9{s*oc؂rI_
{h
i7voƐ&#jGmCЮQ GZ1缸8Vb]R`
jxTYB&ꥎRn<sYEaj[-=b cO*z?	"Y^UXoU.9y̽&aSyñ<?HT|[6)zcA^dlGģf.A&|U$uH6sL0:8VaRg>'QOܪL`G7/S.^p*
yf瀑X;iT~<Qq(4bhAT&g|
f	5,!*T
bK"UbsjJqʑFݫG!P%i	(JRMbJv"rpa#!Y$AaR"J@XKA2+V AVoe@f?լe^г]Bă2+M/;3__)}V*gv|Qd6;r#&EQ^Zdv+{vHi`Atm4-Z6i?Tf*e1T 5׮ca*:H&,8$ZA:iAaXd.}>­ػ1ND`SU,\iZ[7%NfuɂtY~#.y_>k<BN--4Z8ٲK~<([^ؕ_Ͱ!ĜSCE"	caK],5th}.r}.we٥7b8˷
_U#_ǥ3s1reCě3Mo|7 )jIfL903>&
~gM/?̈́4n_[4?MM3guSf`T)Ё÷	.#W&q7hqK[ Y`(vA_`e?ýEϙ%"d[{(IͮIIlPeMS2F,<zjzYf{/^=f}Y"tnvR[59a@ȠCDpYXaH*JgO\.qN
TAaIԘ}P9_iL^-(<=aݏ큠eD-y'=J=?8\\̣baw?$V4.y_ ばc<|smIM$Nbpo,de7sϝߛn;V4PnOgdU}C>Lfx0@	ʯ؊Bcg#vIY׎w\'et|5Yz/~Ɣf~~M}Q67	#?;u,}6F_75ݛ}Yy3E`OuvUtj͟3:'+Nr35b1Vv#T$5=lIhSuy)Nbݡ7^N{3KlЂɂpZ(Oi)`ʀ@]\ԸA+Ua xm<#JE=ڀjg-9,o0'hGB^s6b("K}$DX	7} VwͺU`iawlV][5A?o^m6(@xR,s扳WE/9h܀fwC'oΦüAȽ)w=<Ia$3z2uդ:}L}Օ,
PHM=^{ֹ#	LO29,H?ɝ"o#9=TbmaYZh&W};AT$͋IzbRJqx^k._h]G@GIt+)7zq>s)Toة
~TbCKbcK129f؜Ɓ-% tG(L|-6k>IhG?qjf\g`p0ƺbYn$WӂG77h:]ALp)rE<`t|hd.r+a,euџFU k:!1){(O,#f3"xVP+StGdv.>/AAh
8	xMr6gjJ#*͒O$hQs)b躡KFQ.fV>bT̮j(yhxBPg/He'ԙ33w0Maq:JY6K7QzZE[ӭf/=Fcֽ9u_(Ncd26n!lOm>8)U>k+G%#բa`nX<m<\}F8IȨzgڤ@W;q$*W+7Sgӕ9f#SC+plS&3γoTMl
\-("B:Q)a	SJCm.EXlSҒOUcv%|i^ppDS#^ZCnOI1wr@to\CWWզ<;Ͱ/f7|Aq7fʹ\Ӱei<u6
89.!v#qOTք4_BIQ-D$IfJ˖l:zҐ7ʋCHpp(UaG_CܙI,D$m}玅	jSpP/EJ)q
H5ltdL
GTDN&+:#qYtXJ.+UpnS
`ԡ6YE\>/)NCD	E;,zUAn%߈cJE1.ʧ+Nm\x*]BqqDn/x#6ׂ.hhjC%׊?=!JN; 5̫ḚCw˕ .6\ؼg 
(?S#ݡ2Dc!܃6 U	\G1lY߲ӭmta^ U򏧟q~<b$J@CZ_9I~Gl!ҲArDI4qǹ27##٭?c<<*)	e	5G	`;qtTbFaWHF|Sߍy41gsśI*nKE(X<k`5(d*/<8N'*.cgB0 SK1@>,/嘵	<{,g2aWMܑL E1!=yCr>"%_ T.|ɴkݪZ$Z1R)^zZxHˁd<jKEaԦo椶*AC㡝.Bȼ4]o%p5&RMBZ
fG}o@A+:+pt'ßW<KX˽EVT[yWm<!Y9Meȅ~*Dz199|eI%p!ᓐA!4/Mk5>NO;pH)aLYǺp[;< ŷa2H|o۳^Xx#Өc&g!R@usVhS|jGd-$/I*][rR_([,SBNX2xޑn~MX4)ׂgl%_3`"G$L祯,iQײUltgmV= ^t'4nHc=JM'V\՚GNIE6"<Bs9qqUP>o康@S}C囻ybNlޚv3ZQ:`<3C_xQ9gW16g6n& 3B} or&_xՆ:DM%C(\ō>xZPi?s~oZ`۷U:Fs)8)	ƶ&IPFAM{\GgX?SD::/ߦ7>B0g>+?_E!o^1G>ٹ5eF+x̧G&XgŐs5 Zh_*Xb߽ۊ?م/F#cʑE^al(y'3eU
|ƾ[>fTƜ@ПTL7!4|Q>)ﷃ| 'E36opx~^ʡT9i%6[~Kp $?Sц!O{4Jb':@) \qޑ6*Eh7dɽMƟ6]~?rNĤs?&1Cr6x?
+;xGF%l.}Ũ"մ)|j|>qA6MomgcymG0/lB{fnؽ0^*}U4|z^[z=Mm9+xj^[Җ[P앥
o=mrHچ2u>a]1{vo|=¾lؽ6+x>oaX	yN6rMwؖ~5Y93a/һrՕ|A^W
'GDlIplŴVa|~b>ס*St1(C0Qj&?$u:	`Cт]ڇu3͏! _mt:2Ɯ2[RWPUytwsI	m-kr_Z泲¥*[O*/(Վ'V!Jr@ω+hBAn !\[moT]WTްŔCFfzc7lݞ'.Í(Idv>7D -lQωY^5$jjusDAM.󚒵FSJ$Rf`P| fd#5jI{S%5=\\!N᳸S(HL}򆣾ڌrf}ogc{;~vQO_Tb*rE_Or13dTK_ueo}'%ũ<qB	ML::&PhהԅH<T^Um
{ESwz
 <\\7&8Do\9GZ\h"W;IcN2|& "*Ғn٭&8c`7\UvEZ2G n5j>K*fg8H@o'uo2׼I6'3K;'`to6 4aEAz[rځ]MB<8T)̅o<}6^䡚icj3N8xlól}8R]Yq}w4b;{@
]X771)*/ )&"f)/wmXQ6PLU6\9 8A56ː67apW}=?NOLr5F!' #=dm6HeG@76O,ґF@4@Xu_ޜ]faHka%U LDg2#A(5W)t0Chc	o.<Awc+]zr~b`;)c
ttT<P3]$<	d++t%[vYkPQo;	ok,#v"\a~/2XU=q+S_ѿytsDA`J;-sgn<d}$qlƐI9YDZt֡9AGlvB.i^hceIelhf0 *8?vKS|?	_ GΧz$yC	RO^9|Qv2b&,]1{*Y{u15f˖4/iaK)8z!*Bk^8X^QI4ZrTH8+<];1	A)quycճ:.A/ Qq
{E~[&xWxҪ&{@{<oR @fD,Q!eルZ-e)H^^`3\]oaK'FCE>ИحI/dd9T'	(squvV`AuLdrX# Ϗ=rDUbrՔPة ~'dzڗbRv?jGɰ=]o)DC`6`o$7[V@#2љX~<*pE~`;h̞̠5PvMwmiwU90zi_ iFxI*`#nPhX%@[
KYN/mxEGr!)q[	}$A:2R"~k>e0DlS@D|ϐ4I=ьa>?8x$Z[@:zP'O
kn
?Mӧ""@f`M
8!|P#l}q5S/D)t?wcJ6fx%}<s"]ѭW0րpfU_n$vP\*om47ѢNhrK{!T@%}Tl]*"BAS!ȌD!s^ |2}M!$#P~w?"@cBmd&xHSeA-"|[Udom/Cר*IBu*1:TCu1d2%(uLYLo-%~P螃RU!+|5Q_dd+g}< ƂPߺ~!e=Ά|x͊eOjˑ
}4f:>o%Z--Sa/62I{<kM[`҃N6PGaa%x*].'ZFĬ9=AvYb?p{۱64X}o,r)y	>IVvuGNi#v$@Bc~R*/4{"ߋ v[4H+-0lP;U$>+a U(759Z[o8VVIFȻzSv!̌5兦~%V3(64n"P$&	XT6Z+k('y?H@QKm-350@\PrE+V챶h7i8jꬊKc! J:!k{Qۍsti͚*f!l#
G 
nky m9޻ԡiK:7+E)msc"Pپ0%Cgcj(LuƐ$Ls,dyWuД_&mxzvu&҄38](ư`44wsQ-(W.ŉQQ19Q`6_nk/nO-3mg0wLc?LDd/:ĝnU<FyOvJ+ipdiΟWea'f8R/Dshu7s?RƻQ}:;bWY] "̣Q~~^M$_<ZCC_Pw{AgOpQ׆'ۘum:NsÓ7[l\IA8?Vwzu'ѥ)bW	h"Wq~It%3葹̗ggz?*qK1b[Pghśxmmϼ%%yewggˡh5n  ͹9̀_y[lmȶWY9]DOeqcgoF;؀n`nxsP|{0Q"E5Eʩ_NR@O?t9N:r`!Eւ!JEq2ѧ.m3|jQ_P=sߎ[^Σ[L2;Q2
h<gah1cr88'"/(5̉<l?	kC <쾴*.j]1`픳\L|H^O=gFQ^*5b{pOQ,>Yt=GGcZ2SyΘq_7_N`j6q\,s/kHB821(a圢D-39CB"W:EۉDJRVC,.csγhYTF^l΃W;Zy1_SNK$ϖ'z$rh W~6Vp8`3	.]:?Z8ǖ鄿C)#U`6Fu46)/N),rfo\mف[^otta5HJ0ӿ??P׆",j295i)#zieFz-T'mtr:9~*ˆBo4<oCmn܃87/~osX3lE(%"7{g=QPw~|~?,[!X؀]9?8UԓvBIOz뚑oB6C+P6t.m>jq+~oAypE7;,yFT;w`U?Hxd'*͢L:0{6x[*LjIt]Va0_o垺] KX:l^&9'<&p{1wC+*'rR't@08Q:Mqqhvqcʛc7lmW4zm[y0Kw/O^7i+Ǝ,W`g)uWN>;0#	vBQL!ďVݱuf# "#iytPܵ{a:M7/}[Gn'O<0P.FDۿug[;h6HJcRwwSwƢF̑y5nv(N_G{S\8<)RU;9HRV#tcisnFɮx3Hyi!g$k?Z 8cEw*E_Lܯ OH(i"(/S׻xSu	?y~Bn$ht*D6,ǐBRib<u9I1`!rؖ eR/mR>hy}] =Vmv!kun9*:C1N-Aٹ(&.@,Otx['qjx|t[sZjrۖ8ֻ5?4zHsY Rdc.6]0D*"KPXζ`dW'{{G>9lw!]o}Pv&o M7h\:X֠lޘC=hb䏙L!I`Ģ`$&:P죈QF)/.0tT7U
u23#j~0VW>>]Kw@?3=~D5\4?G䬄UTj+xu,MRMO,'< [22 9N7n .3@WFzZٲ3O!ϲ9y3]⏀G0:܃y,pXyYt9Ly{qq14ks\[U4(W|^sgOWs&<`ȳD(bkw--nxGf(Eiqw(	.G] Iq_9QǏC]CDQ۫*Yz;dQW"ιK8zuś|꼵a8Q"0lɛlG4Bd*Ar6,.P&h,B8xiWYN!4\4q49XRj;sM!Ŕ!hޢFhC(
:   KT|OEpuPN@|NгI="q oE%$hl||,@2d"7Ho}oŕ\.'ux.gE
NHBZ!NZP{hW_{P|c(2g|g]:8-y9#mLwMSK33e):`>w!git~v0rQ4*Jyx㹿0';ߵ<&cS`^/f,ܤCwJQgG:O?edz.EͼJσi]/,Y+Q{^d+7aܒg7Hu+XHDw!؞!XyDȥZm-6YZAu'4͝+(G4xJPZ)r~%=]j%q4S9!>N`w`HF׬%LOG_\?XA#@t~秮gל]Sd岟	pU+O羅_~S
2;dtq_ &BXkȡE	Pe$#
Ԫ	N27σ>1j=vmYZxZľ5[}>;hίDi?HF4AG%qʡzho]UVOM^؃ےCg`'gx:xh]\>ffA,.k]ʸpm	lM!v沞1}o(xPD{A8m*ֽN!%=!,ϑyc]7 VCPS=r<sL)1YTvA8%S]TJ3Dߥc;+ȱd͌]
dV{^E+ ./يQq4GP{o]׺mHrճ|Q*Bf'evEGR:4yJi|mDmieT/Xzߎ>F	HU%Xa6	{w7-@>*-܁{[uAkXw4q:,7xv'0.@y0pӇr2sz@i/?[Lp4H8wU͓?Ǜ//3o.d{ xWwȢ*p`gB5@й y«<*ŗyoH^&k:@ˏDi-+/Ő嶀#vdr[Ͻ,.5ei˿'F@/n=skJnC_b`FqI/N͹#aU%1瞫I]_r&5mRܺ 4d@ZNbu=MۿA-
UzPceWuZkNkqlVG`؀@M0]:Ʉ>Y_]SrY#{¦WK%Ͽ+Oߝf/X*LL`|i&и^%Gt4x#*1@f{jaU-"_Sק.L]v5^Xc%h@͏aL=0	Ƴ`v^̢[f\ >[mBhJ^1_V_'6[,?G*+SeКM8xuqmNݠ">, &L)p}6d3uVX5 rɉ vQ&7#DU+]# a^ljxdL]«;ח`[xk?335<=aLoF=pt,G9Fv紐cch'F:~CDޢ}4S?gҟe̭7]v̴4 <e2=gy8
PelOS$e /CR\Y3DuwG~C 4T9sR^;#t9Su](Ōj°Sqτ:] fl5өĕ)~ɔ|3&pfB2c1"uöyF^'M33MLHU\lіw}Jϟ.TΜ&IfDŧbRVg5$
dB2:N1L
 "Ej%pY8[[o\LRZ{!vyR$!q1A!鯗Y$kvwJTcC@Yn'!UCSPH]=i= 0g~s#/PYA1tST 77bjr|L$<jʁءʲ<etK@[rt3lJ5Hx\kl74+It:ڷ.>
"'?\/|8펰~_oDo(HzrD_}Â`Rd4VhRܟ']Lޞ6e; =k3YJ
sAlaIMN),P/L=LxpAN"l8I"xVN/JAs{inbnSow_\i,st'ßv/s,b)qa}ި?n"4T^˹Ab^m/jg3'y΀JcܥTC~)?h+.c]ͿD@뇞E?KvTrCְc&cH5R,,
`s4;'}	UekbNA%gW`x.UOj7;JT6c!!?%1{ûɥۃ&|;L|4ywIPˌ|:kI1jjPV'K=ia{DLM9,5QrlMT	zYM\K4{+%.%)K$Wx-(Rq̓^̮mh?+iw`nG}ܝ˚m{jEO/U˄41"._5Fm0ƧT,WX66`Yx3(QvUm4?n&BIP7LO&ʗQh|OvćA?/TPOyO&bm. `W-"{!ֽj4dSW]IEcP ;lzWbaI>__t0.F嵡fKx.?nr Ü; Lluhͳ"rJPÇݚ`f
ĮPz5$IFwR;_ARy*i	0*"Q:\UCal!Q*]5J +yuaFD}o*[]o9}7t4I	=>wG"QZsq>e[$
F%t%4s`&Aِ%A1dhz~{byɺ
YV)JN8H{Jg)F]
joI9hjJ9$)LapJ
Ly GNLO4F@`
DBO[tTMy:%!i9!sE:жU$\:.g8-UN&ltH!!}0 ,sytBFC! Zf>GS%?Ae}wΈF7]`Q!ʕ rM@_EmDG(ͱ߄a*ʐlw/շUlXH1lf9Y(&1OEk/^IYhBmWնhK|u9R_HmU?}5cS(wcXUepc<p"v[1)>Bs0󑑣-kCaY{uvA<ܞ,k坳yQ7OG`,(Ǿա]}%YE!aӍûr`#69'E9z.;	SFn8GWYM*s;r9j9<V;{b&`l#{}U*M =EW|΂9Z⑶Dhe0$S"DʇH~]%#m;״OiJN?D:ʃƢ4.2D*\Yis
AHh >#(LtZ}ږ/f)ZJފ8\}y2xA ~6'vTP(8aA^kS2N!ea_c?AR)&ƒS<# _~>8y[5Z篫Ъ>GرPY+'SdeXU򖄪TP,N"xRS#J|2I$䵍]F׉w~M v	,x~#} ѣx6>2)W7)
Q@)IGDTfQ1#/x90 \%9H&D,4bBװOXsS=9Mg+PyQPB
=WXDa23sY~*jm[(g929R]φzi)8eX]+/G';WF~N{uzvG/^/Qs",iYX]viۋ߻<頣,[O3ML+Lk^g=Q	[}*֨컶bаk1uf~Уʔ'H'upzp?<}HMgPTa#Ju]asmp7ͣ|VjX7=p>RnBM1-)u*(B|?j` {Bd?IbyWæ:Nh Of
K~,<~g5!\IzoovzSKZ@sLFj0T{
.B}0xPi,'APћׂ(68Ͷ0ңh6a5t㔝;ۖ7-C38| Bg:8^<h>ڇEKmAef+[ڇYTlîh_IFwu$kVD AID&ə}3<zd v#jR_&<#Y_0BrX6KĞXvbbt9b׷ޞHgn#ae|	@MBb/z*N=ffTŧi3v\72m~޷SIY]:en!:TsʂtƱu8}jh2[Rs'zUޔf"ȶ]
 eEy>'r#Υ?LZQ0cuiG=+:D+S=E3(dd(Vz4ZAV uEџ-sCx)&V/Uu<))0;\XA-lr}fAź+]<,~Է(
lcدcrr952N-yD,
(bFaX1wx6I6
I?"V9BeRD?6OOtbQjoD.Ǽo^A08bjg}!NLږw,p8y"J $z>Kfp	fTmK8_# @o:+Fˑ#1Yv9%haN!q>Zj/K Be(xrᡆs5ʇ ]W0&\z}(7 ?>혅9boDXR9ޮ	9ZW`d'|o=H vu˺u?]bTL(`W,7di
	u
Y c|`:\+o|/|0%Xh:[;p^I!톌1MdR+YIQxo֞,X]駹!qL_^sh\gBm垏I6{^2/p/.>h67aB@;lIf?K/x-B95L"b-~DM}d0 cĦ4t7(PxFzZU0`+L:I|u\sQrm<4rENG<eda2(|hmN^Bv/`	o>zu]^)<R jKL%9 ˻1ZbU77Lx.!ʈl+AS	ܴڏ|Ƹۘ[aZ#dhnHXӹ}0opՄ5|[ \@`Y6	E471ƪM$#w;CE,J
=xe;>;}PBγ>м㭗{/"؍oA`c
+}/W 7T:6j+;ùrX^e$ejqm	!)ęݶI:Y=	RKgթV0py˳ZyXwl!n}TlWNօV,kFʪ3SI=CN]QV@VG{L䊘vA&	4 jRŪ Gt^$X?}8g'G خ _Z٠9J5ap99* (bBJ3lc!"Hi]6Kt~ic{jsԼoD'8rb"R+c#Ҕ,c%M$tERDy}t똃
_S 8fRq!nh[X{sя
0pM✩);;{
 *	IB@oݑyG?V !Aa..%:Jዙ0h%{P`sT;o5mZy`x:`(=r?<m~'F["=]˦2o~9ݟJ5'+o)cJ^hO"G9B.0=l+Vz)\E==:Ow|xMTۋjNl]YYo]8`IBAqC6p%R$֤]$jV!Wj@rh67lf	IGsN[Z̋ bN0:hکLUX590_>Nmj liEB8dk _| aOT#ۂ2&9-.iD\.N1+dNTPP$ )flPnA,Pj3O-G']1,+Ƴɸ%a؁Բu}gm[w۶)'jϦ?Cu xNc]i%CF{:t$܌
k%WbEg7CA_`N#o)±Y~`GA*B=g	yO*6˦_6d ⃯`TOHco<WڢO10yA,.2;bflY==05qZ6[pm]<\fn䞦d1+oɀUA&`'M(&Szȹ'#6[9luyw-"Fz~vDd\'phQGH$N)M$/) е{DplTjQ9H]=!@5K'2z[/Q~&p>Gx2[VNblHXJܨӣbc̣n<kTF[ Z\#\T8`5nZU*4_VKL,d$rӻ͘u(K0e;S?]ߴ	zPnii3$Рvu˦:gԟ~kM謝8G@}2^y:ؾI㢑:hș
n73a_UB`?Ҧ7Kv7[[*C<z|w|p `9r9ആA"n	̓w:45I睦jootp!犽.@o:H-LmgǯC4
/HYy)yt}0F2mgv1Ǵ:&u9ՆA~Aȭ'y [[(t!t56,\k
\B7.[ᕞ4P3ڐ<#%f&Tou
TOyoվbUCgK3ipA@NR \#b㈃l?=f]$tSjFvAyu3xdID>)A,ք6*;'	IFFQ4tA|gW1&w?vDRnq0baHZ]ŜRl 	0Swm4yXFU`gDĚ3H80Y Ԃ Tx"v?km^fF܃ە
_^UƎ,akGV#Os >R*dbZ&$88B.u\0xxKAa\帅ĩC͉m8ר+}$1 	`-9 hiE^!OZHE;h^MdktY]Ax;p"ocYmI2&_X=}kKq(ʁ	e{q	- /lYY0d]䮊:FЇ01V(t2.38(P"H2 (	T֢[~?ٹQsrۆsf%$ X,5DPh]ëj*]aq&E>@Br8aCQJSNSMpJ;tPi+u$rOJ8oS15}!'G?-WHKvAc	fRAp*umnKrx{{]%Rn"6kвW;tSpj;a*KBv
x3Eb.Pn>zvVOApisQ#%
$T3R@,U<+/1.WC#hi`x\$9.X@caJt!+\E(jEas+=4$Ag' ]:11,L%{
J9HU=fDuhdC|:N񺘚BO7CK=K hƒ -xngW{'G2Q^K94@Dh7n.#@'h'O!+jF֦''Sfn>)so{t/-%0KlC`HL	kr,AP Ŵ0;jsyd g(C=QWlآh:y?loA (VS<9Y~UijX3	p9!rLFA&65؁8A5|:*(KZ!%ytHʰX؉Є<koŢ[	䣗l
.ܒ1Bcւ ch#<VoGGEĵ!ATD2('7^l^ taY˥'uD*TeM3]1JL qD5D	w_9VȒ^MF	t)k,&n5kCלq)\SX-RJ<L/Fp07|Ġ̀P9Mj.OnJT=ty*ZUk{]pV+@٠RI`4mԲ]02Д)ЫIE9)	ƾfJƲ{n'#PoѬܟ)ja^³8
H^8cXsqB|Mpw;0kx&Ĝp)?jC87L0W=&7xvu ϶{[G(ϧh$# v08s9FjcѭQK<o[ժjIؙ==;jmժu_?w~Ծ"d~0Mbݦeւx)m!LsRެ,Yձf~F|
d\wςg==[GBǿO1M
6338G!
FGa<abF)\k"O~_dJAF#Uj`O2ZMS$H$W0̇f
{d8O}:_NǕ\Ч.Kh5RGZg8_9p& ;BGGv\m遄|.̫:;0O^
ίlWsw~2 @rk&y?4|݁:FLmGf}H-NqL5V;YϢ v 1SeNO1y #0:ll8'Q3B=5pvTiy'<sf]&~s_̗pmd:KG&# t-jkzK{ |;ISm}niDgX۳څfXĉ,3[|3xG)"j6
eNO*+?GCqN#(uvbDA֌yOwl_CS7iJT[	𕴥8`Fds-dd^U3E!+퍦sdSD_{|77ĆR]eꆞxețouJS۵]JR;R#oo}=#~$zl<;uho%a	jAUtz:҆gyb^9sv=q膋m{>i/Y'r%äOQۜJsN7Pe>\N8.:D8+C<"] řan+a(Td0kPr嵫Boۧ^/(azTu?PIJTXZPqr~Va^ UyJ `Qfs<UM!8StQ[Rנm'<:zp`MXY;S@U=o|,XhuB1NlOC6ivd56}*0{G&eJ|6g?)dD"_f@hTU3=RGvTޫó$۱ڡ[|"X_ 
wdg>j kZ@%Ap0 $,ƝxFG6Z8pGGȠ&yQy#c`ۆSs^ؒm^ul6̳:1E:G}ޑ_CbNdgÍz[&y5ٝݢ%gйN:c54\զGairl,}&z6',U1*l}@@b@O3imG'iaK$$xB`wMQ*o5΍F8UX$*/Hv$e$huH:|K{y^_~| w
,Wuq7m .H f;#UW<Eb= |En!06Mm3[;*q&>Q9~!(T`Zr|ɽEHLemCB($>R"miOBPgMx(`2UAսΊpC8RQ+p
`
Hap0^=T8̎pH*CA̴C!x`VυF$R0'LvXK	լ0y5-J#Op|pqpK41j(%X''^2"a޷̐9toB'eMF O:cW^yQ}	vY++5SRKƇ:^^Bt
1TNcJu
Ud<1h#b.n0wxCeSJ27bעO"W\}L \0Yӳ`o	nz<pC0hW57uR(BCTTsF[Yȕ(p>8OƱ$[0Še ,0i*tD
XĆ$S?RԙIXYPp>yd(jclbi@-APUi8Ӽ#j<>i EޠՔq2Cŋ<4*6x+NrIęO<=&y"44~ 6BXb\v,c؇̫e/g6N]rMЏ3?rg:\3Ҝ}4my*prSʲxc Ig0",ڊ,Ɯ	[onwKMPGoN¯6J&G;B{1ۧ:.N+aƚK;7(meS9i2qhR/V*n;|M3Ӷ+60r%Qbkkw\{zPRd>.K9g
'Y	~z)^ynz ސ4=u³:w{n(4w&H03 6jtgwh,L'4"uN	lj#ɀÕ9v77Ƹ6f5 `*6zm[bWu&k^XFP2mR'sƕ/Ͱ[ox^t?'6eӷ _
*K07ɍO&\n1s^[cIA"#-WiԋZ.fE]@I[/hg01swV_.[rۃHbO0&TxUKKWy0,/N)X |yPrڹ,$T%qEX)EPt}Nl~9Wۿ9wȖ3vLcZ^oS޳>xۘk`rVfޫuuu=	ѫ
'0,J.[0ܪp1"o)Y	?G-tgTHM,uuC6Yȼg?A|=JYhJs>|
JGۧGǫ}v2g&ne&^tm?mN}LŰѭ1YN$4rٸ?	U#@]̰u2/T>D0*	3ʪkԮvXIG!aX|qfV)>49쀳_)e*'{ .A@jQ_"ru еG[	8w@w"Ii`2+j3 D\lۺ8Vv0S*+8bMᜒgjx.P=`Ⱥ_uQѷ='6,a6l*1}w :n鏁jaǾ8ܓGH@=dg<jX(|q$҉!7,[IexP$'2g	|NitN=~OP@ ~fOD;m{9^rd֭΃@av,$=rj~CXp*`L>W'[~b
: d6W W'?
b	0h-MpxSmk[\Z5d0cvg 4Iiߦ%ZbY2W"A*x@P+wMz	E1chsi?*W<pe;6#RJ:~:l>;Ic'Vsuiـ^C6R]ؽ?`{R?>yc67]n s.̸&aEȝV蟦)}>aHk΀#<GEwW-:瘊:E(di k&ǳg_iYAA%!Bm7EBzjDS5YZT'B_Z`yeKydJuTG?M"J Hw:(=yґ ~4ֻ3SA`~}^TU>)'#ȓۀ0j:囯zIw!q[a&5v$oj>g-P>~l:F'b&B jD*B"dⱎXx365\ڨ(4JD)(EڀzlN呉H:A* @0`y#.`e%	<$k$\e|u:A,Uwn1ؔ{XTbX3NaDG={җZ7٪{(H5pxߏx+%P烆P sCv%S2RxBEJgC,qSqg	w=X1d~?j9œke|&jC!*J_C|!JJ j?t&ɫ÷Mv`KUڀJ@DZ_sB@??tDjUcoL;ZwjEw#8%ӈ'uÃ^!nzm45D&S:$RrDvfZӜ暈DV\.CY"j[Bt{4ylΦ!wR>@hR*3XA:Ӆ[.b88 sFdE5(:oX!{opRWp||gJj!/Ko
jLV"u_z)տA>yJ3Pgg5.64s=8p޴sܵةWtUAU:T^2|8D(ݹ&-_ԁMmEkh>(S9Ll^F{oPUF")ǷRۋh5[ތ>V#Px96k%$Nw8؜zUui_0q9ѹ}J%Gl&*ښ)V?h^](+o;(#U189*9tT(yT.uȗ:`'a{8,Lqޙ%JQđr4iu @ɂp5"as Kng3-XctMUUM
%r25(l0Hk/^ |B!,^H"g1yTUdtj1ճ8,smjza{eEe-l!wCΰ#V)54:Թ{Ň1'Qz8:2j섔Fc	ĺ8?;[.!<KVmI5УuwƐiO		t0bEY>*BEnAolyP{$<xAW7#QvTflHV΄aB^>m68P,gZ[iv_O0ڇNMϚ.:@rC6S#6T@jzǏ[ºkA~s3͇fHLj9a Jx̋4]ƣnR|fb܀{t"cd`3Z3hV)'ĳKT IM(|,;#iĹSD=!E>˥X[CCsd5d//	AdY =uSNco@)h'G^cQC+OS9Jޏ|3:q.JO+z`֤ۿJA*:"H̺fs/{4;3]F:oy6ͯGʒ(ϧ23&ߜ2Mh󬆳:)dfvNWL/%1~'"i<ft#C{[mY/y
oɿ/y(F{VGQpTCl0siP%-o1cGk'v/PSpRwqmR-A\1bANӼT` ܔq!,{۝85[$zյ,l0`{lի>ԼY@jqbQ:8#?I֊EMA[YSU|^w-pʜ!y1oIGYbK-iz!ڜB w&	úaãE/9\WWnh>KOd6%>L2cޙHg!JBDrlISzxsܻlw|=>܅aL"<-T	RBNrr|zvL%y00HxZ*|N	\UĩGL^j=	)?$D-wpP-όu<֟_]Sfn6$! 0ʦ?f#n*ߔ7$h^*uy4`(6e{!mk+	#W գx#Y4+**K1:QgSщ8ږqE-Y{M~i1|K2kλΥS4?a0Lr[>46"xp,Z{{Sk .RrBV-pc8PRyo<hc<-_M᩵O^>DL4>˩=TWNl1S.hB*v+eptWRҋ'9o,%5a\OU|oN[ֳCsHް: J'Ůܻ/A?6[{,59unoaWpX.^Ys<zEG(xs.%o0X(a)	i2͑Έ˪#RNm6GIE%ANɬPʯqU"	BlFCV;\ǧ%zW-nZ#tH*kUpgX+FZaw<[uCXʜq6('/$a!V(}zxnY[bǆ0Ot4۲bԩ+9NBsZ[:<P@4=(|5hU:T]_ KZinirg=u鹓8Š7wLSڏeʏ,+:t+ߥ`OXmq2; f@N5:-063i~N:G>&hX){	鈥U
UʜL)0Y2Xm|8A[ϊ93W䁙蛒r I:rw=Qll?b΁9ES:	l6fxZ^3#^
ݩ"?@N(frUz?S'i6-@<SOP5D~$#TCl.{Bb#,(w#_6^( {6h	oT]r/#E6XCZ!Ypjq-c{򴀸AKJ$̢5ڐИД2jc^t#N	24n|WWkE_a3)tmfaB\\S${o?ӄhG܈$&cs:<>њ&+6|}JMl1KϦ;lf-cv:&e [T{׊T/u^oN:.8ys(+^*θLl-LjvE_kU([0>zxMan8ɐGl}f0MNv?$LG{n'|BMqS
P3E9\A<#EU+ZZi2Q-5iuAzP}LOaDDafv;qN&"+.DUJSzi DLCh" Erjw7m*+xkWzSd܋XllJii\`J/Z@?O/.Ǜշ^xr=͘j`xM`1ev'YCPZHm" kS$ƎAF7gS@~ao`41
҄
cݴGXs?yKW)2y4fă,++5ezbsudR$i[$B@mI"\Iby[*U#wy+Uc-mmCbټEP-Ȁ[U`3J\mĥ7zJ}*J>S		/mDV74ґWHɅ[ĺ!÷㠁{DƤp[i|@"&N|lVM]-z@lK%|&{*1u9H|eZVB窠a7G)er!E' {y@WZ3K,5[)Q@@(еLh)
 3
7"Q\.WD
TQHSk:50I;=<6daNnJTF;T
Nχ`\`!e3FUd
b6Xf<E>djf5e(pPͫr6J:Rɰ$9t`9T7XT\^<4 ~z #e%_(W 
m$qPER*6>谫0o԰5JUXGhMZrwUmijT>#CzxmX3s⦀)[$hS!.&X>z>ݷ1a]8fu:u̟'VJgw?S)V@Pw*b(Z̋#Ǯ$r2k"i6ҵ1	+	zWEd/'[u(LdN$!h")2 cD,)\<λiJLTW\9v,HMoh[`MϬ	zP'If&;K;D"@j̗Z)U#\=-t^lr[fA*e:DZ$مF3JR䲄e;+345g%	7Q!ٸ6x/9?a&8	5'wQ4ANϏ2X'd6vۿ3Aŧ~Cwpۊ ?3OzF~Y*I"<4\3V0Z@)d3y<ԅa9AmOAyhlp:A%jwmcv/޼\|rMh&-_>0i}q.[=w~p;4$BUT2$\.}r3\L5,qQ'40Udmd9VxA]z)pfl:E1V3gൄ`})ω!=̌eC6ai9%sK2:%Cg0	(4j V_w 4e"LX7CJIaaFZۖmM.LmP?R	}a:9\D*X*I~w/#8w>٨B^q|3ą*UYq.a8'3:bxn'.|eŌۓm{gKٰTAx*:dIrh=wɤE(!2kwͧXͪr<ǲ.|Kg3$&z퇹	v/,beSVR(itL+&3o%}rѭn[IL$]+;erTh\}ERsT8p>/pz[;<-!pM}]S"G8-5/|'y<iED=X"nCU_Y:^ȿӁ!:Dm"Xc
>%* Qk/[zx+waiJ6N8=Ü4'8F۸H0'\ڈ1stppIzh-|t>o=>v@=kbora6aFǸ_(!HGӝ])[~\~fq|("!yh|WVmtsmw/% SYU;Ԡ nʆFN
]˚0衇2N%[ČNB{qW7صzC찶p{lB5p^[d:ۥ[sqaw**I1D'Z_nPI'nY?l
e f r<)3ȋrVZ#Y̲\%=rBȾn,aôh2rMi&Vdk[.
󡙱>MU}%`!@)moreڅ ֌Rq_2ZYM6":(	$>U+t!LBBKNBGc#o<Şc	-OhTAzBJ|6s#3#az(I$r{+_XKW5w%dʧ1XOt$':M;BX_F") NϬ}Ņ9bE*;C;kB%`ɹ#pFnbfFM~IySrL)B
wQ8XVڥt4Z	.{F;k,(Ђ=P
ۙR#ѱ6Ջ.7ўfd#{fMHMyW3G0;ݏN}woͯa!#
I;Z7"3rt˲cF'5%ʽrgA(<i!/asqD=i"yMR'7/NK!rV.BHH[ }wv{4V$4<zm9kwOy#gOl4sf `SyI9!f&a4gԝ#<uCvV{Gۧ/^~fwNK.]JR#@_r4:z-6-]kg%@FAbuA{'R?)K:#O@V9*kzѬx
}Iv&٥0$ӣaᶚ	_Uߞ{-!;!Kt2ʊ'ӽok[9:Lɝ9N9	0?LZ@b%FEVᵇ-P5!y9"C !J-BACLpˠ#\֍Φ7]b/86nN	ܘAE&^p>ǡ.9kl#ͩ壅Ft!S,PiT!wK$iI~P		U68ݞ|nZMk=x
^VHO7Yi}{WSNZ\4Vu׶BC 8]vtu#fAUc"ep5Vi̕(ljg@7*M+L_\r_Y6/7a&(;!۳)x/KO#L
u
mXQ
eP([Ks<D5߁L1͠)] ͻ7@auS]!ϕ^TCX(ubcNR!Vу|;`36檬Ʌs&ҝ" >{AuQJ hdL$St uv~CǒAw[}}l&eM
z6[IcXS{P{S_W[E%ỳvrDWL&0Kx{)6z?].}Vsy%0(\[@\zE(=_~ʜ3i.C!kc,E` },W^xrf`3nT!jOg e4%|ܾQA"qyөY⃠N1;^ϻ6/l'Eùַp-@K:i&mp1[YC-Y'Tn%RYx00d
Fמ=~ }jta[,kPfЩn?;<pq.ŝQkFcS5D,]C[4>=3w5ԽZ`PAژ@Dc|8LZcqj['hW?XQm&3m^.f!i[cbClm?7 YM罃g?Gŧ$NDt"śߖ/jf:GƠ?x$s<طcOBn5X5/'[T}#4Na/?#W*(i$DYpAWĐVuZ
dZSoJyȧWRLtry1&GFt}C0Z3Y+Ǌ=EjX!νKrz!Q4r8TJXF%$d3g!cFגճ2UCZufr\!/R.CQ^>5"XQ{8j`YlXkPZxLܺl 4CҭpyJkMWaof| "XN d3\}> "Y,1_RGcs*agh ⵵3y!fJ9ibR!W3w!M{cctld=٭|yZWrLX}t=-;6K/[\ qD .,CNz7
ޑO_n1o&1\3HÄHLV@V}AZ*I&wBsWWMPSS5Ẽ.G9bxF|l1s5FqcKru].'ؕtx~jԥ8ή0w/JX,7xɟ͞iK,ꑠ6-?ͳpX>nvrט}sE3IY`17F,z`U\eS=ΨL65Vbj?j-n"TМj=[)qŀZ*<ַbBj*Zn$YqYyGE4,i4xE,<?|I*[? V5(k7gaSA<Hє-`i,W%=cru6~zidͯ1Ҧ: QU2cǡ+EVϮMwr
$sTn22n\c-Ya3תǮ fv<PTl#@m`46KF8Y5KG@wU/ T^Z",K'<$]6ϟ3-T19?\]PkH>{ss5;S=szcͼ	,A.`AS _S G#{1Bݠ 8A6#+UKRpg2#{j*3Gs,y*Pmnmhom-8Gh"6g@Vɬ(y;;Ʃ0ꜙEs1%.rHz[:BbaCMߴ4p0 ]$߈UqM:zmaJČ[{vAonٞFր3wra:6j= k3Wx\>fyg__F=}!3{ewSMŏ2G{{'}êtpnxV^\۱6ִġW݆_"U/x$<oG8%Bv=%xy!i<"?~S8\/,':_vkpԍT#PWߡ:+cbm
Ya6_ͨa~㐉y*}?99=>@m#1P}&̆-$<np-{ yDFLoJ%<Ux;ciG͙"#lv"Gi?GTpuÎgi۲O<=
~0$lRxtܗ]FF8wĹ%NZͿ80翀~GOJj|{oop#U
?75$gʑrhCƳ4(kzbӭB	h(ᜯoT^ڛNSJVGj'Y9	+l¯fFG˗pet٘VP-.	n$)3OˌQ'N7k1Bj4fAE[:<"0[.f]""o:M& <e>"J˛̄VZ4U]RP'8RrrHGM[''lh	hBV(
ƥB|%3ApePu*O	(NP|1wX' Kx5P`ICK\ݙknϯ&ҕ˚*bLuy3ܡc>ڱԟz1Q#k
PT#?TRwvcEcڦ֑&H3w=OiaD/0; )Kh"r3!b2DG1j5yKf
ܣ}y¿T`?5K9G+
j(sD'IWb̏x&AzՌ׎N/d')6|Sg鑒kafK0I!zeE`c;f#{t?<qV6iyPӯ)әڞjS
ɽ*5w&Z?
rި-tL-`,!c<797RP`ǽݵhrdẋؔ3 r
Bs^®"oJ;%osB|;$0FOm&O~23kQA
)<&1r6P'`x̚P@`23a?sP5a:MgN,"ہL֕:M9˹c8Xщj֬2$DWm .'('6'!vJ|'Qܳt&[ eŧ܁F&{GۏnZZ.vt'.q ;Qk[o17;nyBX0B4Pޝ;?ۛ`c17 5/`k)1Ae,)SCwYٮ/өys.-<uIce#,,R
+8:ʪ2hPxKG.?< z'A3.\az 18c~	?2N;zϵU=ךQz4 <fwvnā12.쁼^޿mSnὼ+1Ǖ:W~xt~?$y@=-=?iЄ@2/ۜOfE{B:0(Lwm]jfD yakUCvMM9`q/r@DS;qss:j*8x#*C&.C̥sVK%?qupSR%q=O,\]w#YY:_
%b܈ Mss&Pǉ0r3X"$~&" QS-Y69e֗I9/>Q5RrcZ5b٥ԈX$t`RCE-Ҵdg0UZ _7&@2zew#ji];PL)$(GFl6M܏??\ di\*`xox_¡J$Y>4to5b#ܯW>ZHZ٠ٖUIQ	ke^ԁn87>j=ooSFav_n
mc#CvJ	az͚*i<P/:oWIFi	
N gPq1dHQ&+p`orPQ&pt<6hڭ?0aF!q($&6NvO>ޔrrr|m)Cf}bh4[ޚ:!=_[3EUcuom`z?uVŌc6qt\O_BH'OAy/	US͐SM<9ºF?8G7eO5Ԇ"OIZXǧQ$u+.ODGnUtơZ^bhąeuxd`l)Y._g)\E4 I^qDǧP1/-,q	lخzD$90Wi	~XOӷY^6^262>47ewj&x^oKΛWT$N%0,B:J45MtP{4]Lr
 ڵ[^g"^A8ѱ797Daim,Y8?a/ Ǒvwb2>1ad֙Zp4	 D@/vf1fQ M0p윲X0lbAgina24
NPٳfԴ	
olJö" }4Ϛ`(1ثb/<#`C2#4-5uP3/\	>#hL5vy[@IܬgMz:5j
UkRגL˛6O4YNQ<ix_S枞wQ1K&f9/bUG~u<wmlk21mo4zj2+_Oj+tl.JӤB4G%5[@[|H>׸oN<*nIp1O/\gT6w	M#wC~[,ׇ>n=hnTӡScPGF5x'Ayx5@yU6jtk,)duk|eߌXi<Sl94^nvoG2bv	9h>0'?%QKlyoNALBu^*LY^^N8mW}XSfzCṺ/(C,J!lCJ?,gwkc_/0lOxG
:͞lQWiĠ|6@!D(<Iֆ3dx]<\%%M\;p:Tj+eҀk̈rrM~~?=0XKN7O9xr16֟GrZ@;p djW;|l2/;)U `JFrR&Fbɬƍÿ+lI@T.Wǳ?gH_%h!"Mv@<TXrСqt|eI:ӨM]Ā'u//6ֳBe&2xgo<<Ц #33-62*
fuV`W{P1=Xj=^F ɛ{V[;9<uw;agHm4#0JP<\ɮu,MU럑N]fӹ=/:_\,y3blR}`z']zf%O~4VA"߅ztMhB5:Ұ`ڼQ^'م	 uDRGٵ  oE
^Q.\P^\+,	Oƹ^湚:X#G	&ƯO{?3_7>}6ay_u0^4(cx$VGsͧ(\K$S1okj9Ib'	 G0ޗvuu~"ƍnV45wpq1OK%
{w?8}O\oMGcl8`24UCKP`X+(F  _Nx6ɚka`".-I^$__SDӝ  K$5BV;NAv@2Xjja)ykQ_F<HVN20kp {ߤ?ȍ9)G jCJ*e9SCH7᰺\UX(
MZ/:*rogBة&^$PAW/TbEcvEٜOck"<ͿUK/fyBCX3xb *Jɷy"ZGi,]Az0evFi;BBɻPRezͳE=
W渭0 ^ya.v[Y[_ONC'L8ɚAmO_Sl/C
X=p*n=j[D{16)5WufFI]9<o$ ª7sd35!88O3ɴH;G4)ёYؙkDnRVF|?9E1O73'O{+R|BDKHo>#fPG86ST{$>^hK[}ct^z0Taywt>z7')mk 
BQ-$Vpc	z??Lp#Iky~A
]2Mh6om?߾yE"dY'ka`<ۧ*4f˸wɽ`zs䫗5s9>9)CM;	܍p=̢z$,Vz8_o}4y=gHae8y}\o˼}޼NNf>	\rgҖpU9\;.:#U$\z4*T畣e\ea5d7!G+(Ɠr^W>W^EDBjW1984ٴS`:PnUÎtӤCV_rEDt$VE<8=sZyV>up-54{2V61=K!H6ʞPJjsw=UU9 I!S2e?f_pQK5zQc3ǹh}rHC:.nS8"p2	.2^V]fQ
%qR"0v[i'95@Ƃ 8lb=EPw LI>rȖwOw]{|=ny]Ͻ_{]ϥHv&¤wxLr/M4	+[`A)jkF[wP1	N3e]u~uZ~6amn%R<gň$^5ڎ48M[JiZ{(۬ږvuwo:S0z)S\9NeN!턢k$9m$Ü*XfZ$]:'b[Nhir߿z}͖$Nǌ.芄C9*9|I,Wps\K	˄O,(R݆֞Zbgǳ=ރ,n.=)
:^O=286_	,fr;MӠ'%p;~ɅWA[a+a	>G42X.h^)%i11՝m\ۤ|<ϔ9J.=n);70̩C
s:V( \}qiF:g鄓S*S;(Ϩe^@ƆUЯᒽ=Ֆп@8n#zsܟƴB\&j67"P:~T6P*̻IMNI⿷(GgI"&nA^ClSnt4 KoimΩƋӻ4xST.6KLWL%eʫi%	E`,L`̌+8#hSdn)p9b)kwu3`
T!J}W^S|
XWKnbz[t-"_?6VU(ceoOMN+ scIڪvEo@1l^4 oyQ+Abo5\옱	)v N"m*B0j[%
w\@bz;:ǜLһ&x1gӘS^`BSdEļPV/-$vm@?En6/`c4Ar;m4X8ztʍܰkR]~?bvgcU
<g2Pi& #OM9QXs Ty	}[ftqhcìRQ^]R~AmKHj3;e$t2W>;.><ͺ^|=H}ssGeӡH`@ƺf>.
IUHR@j L2[Ej-)Pd\RǡmgTfc1_ٍUe{0/A1 ɂ%ikȁd'o],W|c3;yU	e(]ͫT8:ZrG]<nLĴӒ[gY^ $nHq\_S0p	Eql48H0Q츤(n}^N[eQZ;J>O :lcנҳ?;6PosQ<"9l\U]sSsoڵd_wUHI>/`$hjyEwt44G#IC%qvleŰ{ɩ9C{֥B`3C0Uu*J;rfNU/ՔJ}g֐T<?s7rctgc4AuR	d`\	r&c~h<2	Q@P3ekAC2؜ *΍3Ts!5{ C*
+gSbp̿*+=g/6~c):WʜޮNݷNo8&d&T~R1nL'tb%@qUBD0ԩi1l]N0+ldYW~	us>l܃tkpCV0ZEbx-/)Z~(Iz@DfnpeUoCė#}&b:FR4ᖁQ,7F0}h$Ip *҇ őW'Dikb;q	8qx*)"HƆBYg?7R~f}ݾh|rCnP}?TUCtn%3ja}GAܭq)B\	ěyb>Nڽu	olQal2?$5++|i[d%gзeD9Ψl1M؇ǯPnΥL 0b4lwPm#Vbٶ_gbsN^!RU3OT5kk ԫa3)i1$0CTSpY"E
+T2tOA/[ՔlQ1;AN~/r,)W?Ro*>V,>U1)'Cf ``@enCEUqZS,NOc62x.1ɵ9*$5jCcySWjoRSA;Kf8"PT4ov@1+Je3-=jDE.Il:j)gIYq|xCT'Ds~yۀѤZvcViGAy[+E>& :ݫ(2~dW^˻Qx:ư;4u1?gNEa#VwO!Go(^=Cn,ꔒB"{M)FO<Q>-A8ܔw)F9+7¾kl_жt>.{Pzl{lˣ:.b@Ձ5(QJ"* R  *WeYeV@1 Բ@0fTƗmgW^Gb=\LϪR>#iG+v9ZCLMW^4;vNFMD{Pf}Dx;ȭRg&qUT ӃA&	$Μ<8_"4,}rTQA,m)z9D#_Sjco3[B+@hqvH1۸ȏaqʛUbZb4H8SMaR)J(ͮ\PA[* 1
t&rmVh;bfn	mФBd*:@VQ1H|^RD̑L_H-Yo{I'l2yM׸(]$t(y&j]FB)}O=jkw;mW!M(A	Bǁ
U4(\'YiCQyчӤ?Rp6d<9:6)u"$N2*Oʉc٩E(+W],ڂN2pno[X1PBwr> 5}Ya;seyܯ7L[~ZvMzm4WxmQS2soZOI6=AwmМ ݋w5=nwӿOw{=]іn$s%q^k_P~Gw~c9)}K?Fom^L	f(I,ic-}Vz6*f+X;|Sz|}ٹopF5hNVs:y3MxӪnvLdeiVWd`~oU	 WyXzr_\'^ u~XWx`$*e~([KXRpF1,fN>;A15u;l|ց:2n֤t/CjywWe򼍞IW],?Q{eК+ԚLDp%xåvڰǞ-2mZ ݊kIk;kD9ФRZUMQx.؜3[|-n@[/ub@]va7q恺@t憓DhA]ς&"*(A |G@OޜTb;X$Tp(]A˕	nC;ArU9b<rQ^u8'`9宄dԊ0W|531$>;C5d arkFsGT{3B)خPiK%A%O%9hĿ^#Џ>ЃO௚уOih1Oѧb@3P*L0j"V
<`/0X?N CZĜA )J=D"W*4e0xv1/]ǺvNc̕bPp2CbS!M1pITVarkeO)-J>Uh+ՍR1ɍX@=k|2y:BiEYmc`#UpWͻL1<^Q:I	)^ف~dX|36qFmK,1I~q^1R]AdCZ`:[ƚBck~Z#ǲ)aC-3, qvP	>ql!Uzo>}q;MR;PbSo;;5rA#m_a%ЛnO"Fx;/~uOWVثyURۣi 7<G"y#ub<ǲ3ERbaTS'KG]EN?2 ʓ$[s39;ãԸE3wn[Oފx'N30ѰWt᪖?ަ	ݯPa9uetyPW-4]U<b;,Ɗ~`&۠XwwKQ͹:gU-0(/B O:fۂscW=-А]Jm:K;Ŭd5/%%,5[3ϑ=3"fW2R}/?o=#&IME:Mϲ[(>@
U(1t%VN:͞nB\4=/xh9ꪶ}X+񪾬CwYZwA"^^r^2626O?C/mBڻ!mal#d{N94#^rCG6#j=/8e]_HCX$Ν,oɪTmP~VI=cye-<xZ=eQ,7үGj-}kWxOlEw:rq	u^ߢQE]gTA1WhTBUfԧ	%}]'vs9 a%:@QWgiPBT+jk>VG23(=|6q~ʱn.?h]7t܉qHPxՐ؞]?~4lsm^mcpm6^fj$(woVH}8Y+A
0ь- '	F(bwK3Xgӌ-1:rD',Q GfО2^eea4#sD(D7Aq4%c"/X dY>}܈Qs<V5=8UM_o'r:K`.ԗɒXUchuZ|h/ ,7X8ydZvS$!KJ	aq+'>Ljuٿ(2y4MTi<E§qF&b9üOϜ9Y3?lh9g͸5wZ3fMF 
BOtN帵 QnX"bhj _o0ƈ Hm/MJwayvY%וEө9Pa^L~12#*jV#^uxA\?k`rwq͓ҨtTSqfs:.JtSV^xH&ޡn0+E As)u:`ʋNr>*W>rceNd=Su`:Ok!G)x˒qod=TTitױ%V'b}nё;KGp$-cy+y|r'dms.hǂ<ME%vxk?k	?V\B3weMEhȌG-ר}ٛ 3wiÛӽoPqF48ɦz,T}|s/8pVI1:&p~oNmx=<<Bgʬ@hCg[6,̞%6Uvm_s\cbO
GfRLRtl:aWRL`Kik?ߔ~(@ h6˷u	Uߙcff-W
F%h`ty{:.׆,O`CJֻd璲RJH,h[ح"lDM<b`AILv*I^KRyyxL_"!n V#3@|S2N!UJYȼN{nQN'^5[ywG`'xFJx_f\Wd?)i2~:P%[޻r&iy"n9l>˻@BZ\cWJ{	G3}(@.+,cc~~0"caѳu5d٪u_'$KqQN|jvL'WH`8dIl`Pb8óI~/,r-?Phxxc}<uqsë8ȾbME/SH ʿ<3)/lxX!qL2>ÍښȟJڍ2-J0X>6o9\%05^TT2zVk_b1-'[@*jUؖ/K/igfYdݥk=Vo7|cv0ئ	<Ͷ7w.cY#,'@Zu3f?3kr_j^Gd(9=v{Ŏwd#]9p8w[Iv$q}h	fv`RswR%aOǰ*ƤL';QCt/{+TG<id,2}JVY<v|=,oby16_vZոt
-S"HpcѣBH{ǻT敳P0iᔰq[
rPǖ9r=zF8 /i݊d<h~ubvӄo!$&_t&kfb(ߗ~,m ?A),:9=?|/V@圃:xL>x[gMNOoK^]@]ɟP#7bT:PrBIyƈDN($XYyyUQvL$Wva6s^| `zOkL$we+'`y9k%6
P%9Cp͙+j9A*0E?{<*(//%(')@0:@\M>8բ	p7M\BДx>{ѱ+\	p^B H_(S\~3Uض\ZޕnUE?ܨ!Ͳq0c~Hy#6i"漠j5sʵJH&)x8Q'iYJ>kW^Yz%}"RwsqcTTHYᡖjEʲ8SgQؤ["bb&@SrO0!刚zNCGVzt:	L	ٺ\Rz7TpcSn%W83C'!:	.'9<t!fpk7~!x<o;f外q(nklYEaTHEoZ<lvCs,2R6EV@yEլ5Pi;*/h·v!Lls@΅RgY[nVMj0q0{g;G;֧Yθv\ON_f\99>HEwHvB#>y}n2oGy~ɢbT,c$S毥jc>70ۜ5e"%Ϳl~g+R0u}b1&ȋxjBgz
=twir}̈́cfTOIŮ]G]'}n=Q=%CBf|ROl,~5oYB_3qEtAU#GVnr37o]0XZFa*p$ԼX/яHLzdYo59HfDhqC"݆r!W5('*\ՆnkVLJ8j_-.h$l,\#B5fCYðO<!Xtl՞7^MHɠ:[JiUW*E^3ԣ-8
EhqX]ڢldPwm|Q=w=]j),la>ٗP<_,;ci{b3"O*fi8OPW_aYT˛V[A3XK*e6CfW/t".ѳjUyf7Dr2j1JO\iOh	U>572M5ֿ ڤy]/)2~ MΝWz
dA4w~܍%b+]o"ׄb\{rsz2+0¸xLMаRs&l~O#fjd f^vtejmhM\bV6%[C6O2M]m =:۩%zn)jPYyӲi0'Œo$7ouSk|]8VZrQDirzvzn)Xg['S49-q> pӊJ<,9)
ڤuWgZ9Cy'xI.["d,āߨ7
HuHA]zZ.AtKy
k6ƆlT!RMt 9幯8p	:IߦR-]ީV>,Ĳ73Բx.:ӽu-;l/tPrSڏz-oYkjۖqy-ͪMq$޺>NG|{TUHb1CG <oJyM3RҙbNSX++㊆$5kdzn\d.l;o&: s)ŅզE;RZī>OeųKm^LͽneV;qN֐ *~@:ɕ=Ic#Wpoet?@;nU'RpuRe^!<?<!'fCUt)Uy]WHN+d]b9pAK>vYq,a)*/Ä2U-,Y*R*Q1C^U[^pk4, â6y(R>>g{@}s2filgn[1ٸEuh3z5#jb}17$8f(ûlX>ԙ~A1/ruH2ɲ}<4?+c39)x%2n ɀryW{Tib4t2{bOte̅b$5xpKǝM*xMx0zH%ѥ85ū5Jbg.1qh_ozso%I.d}|f}ʙL9E|@}PfuRҜ92+ԓ,8k,VZ,& :&/-Cqܞo6'ռ +/kMlcRn1rgE+*'U#hIBˡ!Cjv[\g[hbtE0k ,9:[HT:3H,'n(n8XLԌl,k.0xƽgwS+HGBw)G"1BRD*ăfH!55s|+P.hc/ |Nh,jj!PWHF{@?%'NqlS;h*$TF })ƾ6Q\ ]%1_<9,S3N&0: ^Q9`WN׀
0𛯒O̶~	D̓;lkirnEH4!;֎Tm3f%$SfT@:D$pTw|z6,N/"hYA	kRɕUVGBҬ?.6fq\ye~̼g7y'8?n,goZ?/=?TFA?,ܟ_Npb)3֟[hPkL,J R롭:;qDM_e7,s>X
$q`.oC~b:}6G4zLͼ94$#ryŪߠ9=^ŭN%ꪼAwi!>aH'K`4,[>HMR8uh0;V|E\<J
}RwJ?-6jWr&3}Nq1Frv"&]PwnnT&ΗWBM^{n	AѦ3 hAJ$h؂>`VQG}%`)`O;ID\H򩡵n*P"Q)JkC%-$<O(jUzҋ]]%"	(&m@>QBIcĨm|-w^;boMVwKŅMz>֨_c+ը\2F$5-QEGV*&gD<ѩE,ec/Kd1h$K{+вI ,G)T[YOqy6ı{z70	/
kXӍD?Nrr'o_^Əv6P#け9UgϒaNE\aEzBs2e"Uwh]fbZCh.`ܖ:dЬxu.v.}
h>hpsSQMs6-A`kwzR<gpJ)#m$۟K)o e͗[zt˖2t.ׯCͦWS}%,'{Ȼg DΣom`+Q""d)}.o7;0\^ >XZ5>!">V8 s8eY.o#Rf_I1-_<=L~
1{E-
jv:h[K2աǻŸE^Q^oﻐ銑CCL94;,˱6~~nwfb5XX0u@"9U5?DRZvc7am6g^ %^3>3o]ñG9<Js65|FrvnM{[lܭ:/QVenb ~5mV|Kln#aLZZ[Rjt_ב9Lk0>	tC;Шuh&W&J?hv -@2&$_-g9Zp.|Y1?b^۰ݗQV""xMk8pt:g}}x]Մk{:G;:vV<893Ĕ#4'\kO&D	O2N(;qQIJUQBWr{g56!@LdWh:$I;,rј^Cp	 ;@wu|b
PJ>RdFu"ë~>4j	B!BWsߓ>UI{N>9[R9շ I=v5MwuZWHl?)MO4X݆e5JfG㗓r6~qCIj|]WTPDl |Y)"f5;sk #J&O=@ffqBK7]%zfpcoE}m&M^\W߇ސфoG	bͤr,$XBkb:Ptm*!g/>[EĺRPm5"txΦ .УjJX	ʻߴԫaG8Lԣ/Nj͍tòtF,Ou~ƗV/ps}aI+{7Kr͗ƣ$;y+(ĲH<b$Yծ볢 T1gz}		ox#HC͎҄ֻ^9w5ՙ3SCʜ=#eREIKȧ?gP`;](Vg=	Q)ܺy}3(t3F<)5F9{Og%{y1㋢.hyak$sxHЧ4tυKn,#.omL!Tkr\hD BQI4d{#<|{/Ro>AUelYw)ںxTE/2	[Qt!.6\J)/;HtmbP<gXhӰNE60H'w9<"!`/%+$>ϲp0:{`AO5U	a]AR>و*c+e7]KXoIʛ9F&cyNv0.U(~a t!0Ć`S<|4}t`M,h86Q⨠jP ^jD*l֓ܜD,4pXs7'+/2"r
XٰĺC\斢?z\gC6<7T*M{<pԬ4(b*_[/)u˖	O G_^X{)zd\V<c:b)QbrSyw.CwhB:?8%+ mccA#٭s;[	4jIǞ.vaKYa;Q 6u]@%U\1[9k-41Y5N Dvj`\V\niY-M;JOI%#n?SX<nM]>z^`շ@ɯ;1s\N bj\PY\i٪2)?nt3Usa0&n]% UVM-G|`;=J 1a5֖^Y͠@\DwAOEvUyB#LJTu⿟Q-#
W	bO߱XfP⇨2=P1<lT}f*`&r_xr;,a~|5q;7R%#ܯUx9%G8=WX9O+C*iw'G3ë)rD!'^k9|jPIP
so{|Y``\+܊KFͯ|2~[
ܼBWNQdI2ȰL!1T;)zYCt2GA@}L L/&+@%Ѳ*_]y12H@ynĦaVMeVTlQC&,^KDuĥ*5QH8s*ܚ@Ra?1V ӍUFT9q+3DB"N-uN9:Y=*/<壡Ь=v~2s3JT`7cz	Rzp666~rzOcnB
/sO3O]~5:bːנ!|O&IKé0}Jur[0$%mQچ1ZNkc[5PVW[d:9{(IGPl=OߘmSO8W0kY\w嬒z0*7m8!( Һrv>ڇc|U9t0؉Ǧ1R.B
;.2u,P?  sxm
"fcXpC< h8GY+S(WmDXTIoQP1K] gU hm>ͪ	v? k?_JD<ɚZ?Hhx&یx̩M`t n}*nߩX؏UҭK(aIDvKY-$yܓA9B(Dr00%KIɪ|[XAog';?_m6Ɣ)?$><Q=GIdgGOٳLՃ5zEtΆ/~ǆߍHؾ0Wbtɪ0F*(G簂.LCRH-^n,O{}w۴P &P}`sV- Y5X"7|c[uyx|_$x$ZD|P+Yau|&@9b^(@+VG]yVdhp}f+*M5oU!/P#ؑz!1xzy˓)"]/%ܺVIq|%q)}eu? v`snTC`fB{nxkbW=s/Jiml4jc2k&:dR~b%9`XF]ԔR4ni*GCw";dKiJ򹻻[EOI=&~%0Y6N淰ǩ
,$ݨY$L\Gz9ծK;U:TRcBj@4O$gnv$-t`AfuʰN!rڔ	pVimoNֿY~n%d`,39SozTUҩSn@quRb1ǭ(j/G\+ZE)[x_@hhѫA{_dùڳp`Xe}u`ytHNlHb 6'=݀ya>:y	u4~DPZ^I`4&5b|ˤ\QO8n#&ĽZ+QŪ0u9AKŹgCXk@̶Y]m_)EKE	ǇTK`SP&_T2X͘O
(&u$1`$79#|<eO#wSAȲΔ_RicG]tZA!' 7FM{ybW\G>tbCtYAjWe۴ʹ1G!YmOԾΛoTs6DGIr?;r-D?!ݫlSx@dٴRz)wq KweAV30pJukoxN[;L/`IԈŰm\n:ܤv)E *(,Ⱦ?+
âTｿ3W:UY@%P@L[ޘywun	һ(SO#=zox7Ӌoh290OCuqv3Y1sonNrz9B@r|́`\'{,Z4&6ȯGNBBa?=P.}SՂ݄H'E@Ov
NW\41WVh͘=2;92~B5Gd/ihic!Bf-ϱN'(9O" !aw/ǎc-U =6L	y5ɾ>~GoЮprޮmSOtMEU?UGghW	֘gRvRZq6X^AJJ氧' %y`Ub9Pi:QJ4yL>1e6lh< 
51S= Akw0СJ|:	@R'*-8&0P<":j@gHB̓M"d[cNDW8LGZרUns"dĘI1}.bD<t˱;QU"{kX,H[j,XS4fIɀXkԷ!Lio@
k6G~i9ZI^u]DJQ3<\Iys5үJ5~Vr1nG:ڃ\Z-/ȶZP,S0ìLs<| x95,qXNЬY͚l%"6H|Mԣv*o-0H7n}/[ 'e?mY"VOhI]s\xZ:`H4M(5WzڑhuONIDY#aF:77@oNT3r,e>1M^]"KBg+rJE	)7U*#Ueńb7YCFTcjipӁe R;{	$(7Rm#S{1wnjRRo9(--1|#HN)+,0LP+@HSu}8U7(Ǆ'c*Qd?дi{^2 BR`;vķ7oJpQ¹]pf"B~DH]Gdt IhJ9h'=}c` S",PPVBPpـECm~}[c7,yӛ^
PV+1*@`xkJy*ߪ0JpcZ[]iw,R/F_FHȄT[kIcR0mZ|?rWgpbsto#N>db8Um|?Ad
\9.( 0@2"p7F3+a-~N^oqBJк`Jܯ&*ۻ̹Hh핓,,~ S@Tm13y94˞ЀdEk<l9pbL*-JT&/n~>nn}	쥽DZ$% 78g_)0@|#@~Mm8`#9x&*ɉ?+|oNu{oR0kKRZ^_'J_9$^I<q#.
`L2!&SAv8҃64ٲd踿#sW-}9~M6h:9-_cNb/,$u,F~7\lldh{CBH=z /*?X_7<#Mi\ۅ'@TQ)xU(#462._3180!n̱PSڼ&ӛ	WOwFɴlA=⋍/1k,+f>evoVݺXH ^n#	P+FVfꞰ]\rF:ET/'"A %+>C6vѠAexX*ޢɎMtD2uOX	V7zI8=ciț*PCix1__/^UMvi9io? ׏5_	xI rL؆V|G-N_q_,s&PhPڲQv2h$X,?wg1}i䑡Y;?y)hJNj-=wPNԌO^OtpKY2Tϟĳ4kٚ2&m3qqInٲ|w@C.jwʼ_&O *31@] hD0OAEրRr*InXc׎\S;BIi;55{Y	:C.{0TU|dȣQ0A1!.1jFKB9Z6=6.1JM"5, ,DGǶF`PSZ_)UӊLP(PiUi^DD"-}tfpl`Ŏ!56JqsUܨk5IC3bd.DP[DRkI7&8b ?9wݯq)1D+c<~4k^!u;L2>`	b`X(	uab}`Z	4 ۪{lF0A,²dPNYe%+r&T"VTO|',6ôp3VydeO ahYDj^"cUreēbh}*Fji[Jok߶S=5ac/Qq8sݵ[guZi+\T'ycgC5BO4{<'â?РGdYzt]w-7̅~Љ7:1MbƇ2F2{M[{>?U<Jt-6\INigm.<dh1=T 7ܳY/#׏>cnwnRA%bO7C} K11+^54TKm	[!Ui}W,-GB)McX{!Է5|븯8KGp w4rbb70zq
UAcE+ϿXrP槅{|_f@9<MV	#j[i(:h,0bE·vڴyn*K7
}bSӧ=ﺣd|4BP:Pљ[Y:O͋9xJ.ϏRT8	 P& .>$/m67E|XAK炘c~ໃwȸE6lZlPzF:qU^~%NԄ	W'3?NH"Z#}k?y㰰;BO?SvǋrKC!7E*\ɀn53s˜--Ԫsg~?7kQ58I푍UZ0$#'4Uw5Bo4#0߫tz.2DcfBJT^EBs$tpm]HA8\ύ)J˙nzچ[bC?XQ(LJv3^.ଢؓl0@DB\BflVI`'45Y9L@؃BC`NnN#:523T(?_yA .ѿz$RѼ:`hfDݘϣ9C>.mݹ	 ҽֶŲI['}6eEEHEҴ5[y1BirCߨO]Ӳ2gB$]cRTp0~
QDj꠴iװ+%tO@5蝘n4JfFT`O2]4YnEX7B̅F"wx/=s8Ե,WE١V3TplpkLU I.ȢhQH$w[i`ۂc%y'`6b27|GE+JnCˌ>6B)~mxFN-96qcPGdL@־%(+RVqTL#Xg~Bp<	ߺ)xT|, "l/­B;[۳w-R-׊1pd".=\1Hwʪ5Z{)AKF)aHWFf<;Ko. 90[{c6UTv7(=d_O'ed%#Gt֙fX2TINƐ%Ml-.e823v4C9.'P{!xïW)8| H"[y[meiZ(F⒫bIPE_Krղ^8u9[Hʑ^.U*̣aؼ*n4lH,t]rTYv oɻFMBr2U,w@X(Ĉ\h`pJ%-ZYA@iqApޢn0#Rn86&IL^TR=4* sWMRlF<KR_#p_A}F$BdeGDs)-ӳo1 _`q>;1ux7|F۩u̇xAi
ȡvZkZ-( Dsjǒ!_Xh+mq,[qS梀eո&r irqs@b(,$,G$`=63HvB9#Le1%zO@?ҳCagI(EjH6Nz<1/rq^f"	2J`0Kƅc/#ukN14zZrǶ~f+W0{{}|?{u?{sj˳E<j:8%r->Mod+.UF>U5	3zY@]M1H}0B/\\22 fAʅ8vZZߓ%iP`
71NmQgU$>p¾6mk,Vz5zhM%>o1ĵ1R%m'̓S4Pf
¥3̶-)eml+ZO)j|WPacKm I`n7NXu1Ak`O`71~<5Oƙ&9OoQoy8=lt Ӱ4宄g7`۰2;!Q'{ghRȄgfuf,[ͺ@0<"bP)4K.OX{潚\{m<yk\4FS>%?KFAo8+D#;;a^nвqpt\sȠn0u+?/ia7+kl۩?\p6{|J"а'ٸ:uv .X6\(eck8K"v"zvQ[J<$Poagk̐s:Vع?$-@R(ٔ$[#k3I!5`kcE[=Ɛ"AFҠ>xI 03;aB3loѲpΞ/ Z$*ȕ<h42w_^5t^OfZv
SP6A<Ѧ8/6G[ӋˍPz:z\bkɝ`D

eu0aUD5ͲgVc]KydxH)!u=n\!ri:pps|>4;Tم
"ܪmn3]Bq$&yB~m2% bSѿ}e)O5c|u^]3A6bnuDdZnEN
]G'{h3v,CbY'evKþq׎.Ns	"RDZ_[B}"֞|jJO0H#ӷYWx24QP
bw`K'Y:`M+/ՎSMqF).ԉcE^&	ԊRF"v.2w^v`~,'tpjF:b*nhaRg͂zclz66}#ݵXD2"{kJ6Hi_5㑋:ױ/5No5Y0_Vδ0E-$`(6rZHhا"Nm|jSt}'V9OJbaXAZ1;]_YH{Jue P|=ԋUqxeK<=͂簐T=P&N{%yMTWAQfkϫDQH{NHzRV"Tq	3N;YwH 	g,׈|j5A2JƤČ\8N.{`5[_7gizmǔ_RQ
u*[7O\fx5mN35s']O,wYD~*xqS7"1M
#Gi5]ǹZ~X5 x§zMF.7wL\̘@|*񰩙0KsxUdw(8Uƅ?(EVEPaPB 3ymϧ3 kN?f=AO^9{{-`0#LGM_' tֱbsr%gv̛L ]SIy9I)Y@]өe0%ֹnTrB
.5;U#_&B+~82ִ\6;b{ZRbos6	H6eC<Pg0u=\+̈́:XBVnGAT^nܟ7BuaӫP-MvoW8JZlo6-<UލIB3]3tOU ǖy"=US6'
S!QXCFCQAHژUc#ǋ]3<Prtu!R|PU|E>L]K"9y
+w8*DppK%x$kX>jB|Hv96	N?<ZIE:-?'"2M.In=)}K"8yzZ#N0(mz[c6t[k3{RLqFS'$=.ݒUte1~(U:ҔRO ~s. dm^9f /'zLB!z͉]n3GecNSif^|!˸Us]	קg/~|}*WhR|tb;fqhH1W,X3b&AyYcI^%g)AG?bGol?X;pPfe<\(?Hpa	AoMU^JEЕ%'*phO6[v9_xE7	p=$xfOwo=6äs]> 7`C]YE0ƣt Tnb\CTޱb#+|Ia%FG(J-ij0!Xol@UI)ROw1`C̚J)<(
q,*!k]Zo<**"Z-hBDw):9?zG].EA]D )t`8櫤<݅	͂K,
lx~F+tmqҔG%²"
7ڹD~1?ڢTAp$J2BS2`$A$%Pȵ{ZgU+#YfbݢæSPCe$ؐOgT3IWQ﫜U,%HVU;tӨsh׻BW􃁝Cgclj1#?f51y1|mԵvf	f@wߥg-oqDaBЈ.>bY"hNM(KKRԑ%`7X1^W=jm9B1*fp$&Qat,:N[Q]_1;\&arECF)TӶ>:'ٓ8o#.zk6o?xAT!rmJ᎙Ak)=7ӆ}aRW%vf_ޣGF9.#	Ȥd48ڡ899$`"VD{+HŢ$6(l^Ip]\*zޠ.i=EEsb&U? %zYȀ얐]]^W Y(iM9OAc}H^s	H.2؎B	sqeREW_sh:gڮ}}V\hyHy	>l&GjsV qߨS{>+u2`蓳dl)cgQ:V[d!v6o;Z'H׍LkǶ[?Ej5yUs1MWvc&FbF6uy,¬wmÓaPg74HT+P~bd]"Ck63lexXru2{!b:͈y^F1wtaa@˚ȦzťJ^ <?S{q
^lTi6`|ϊIL+Cµtqi0=lTè@_6m+?1X3qɾӶs^.q)>``%S+mnhH1wOEh4jڞ ^B1`{atQ]BEM:[vؔ.XhBA 5Be~=/D}XDᄛ#N1A/*fЅ0jnݸן8M'Q3T|ϲCV^blmŋ"j{4l$5>sCyϢ/!>,$ {g?>>:6(KƂH0D%8(nW&­k'NZP7y	Jlt?~lř^oh J?&ˇ>K>f-JF;ZsO^d&rEF\@kubq`8]t(A>ʐubfx`Bd֤u/]'~aY<:(hTüYvYCR#sejnԿ I02XL7~s	rPdEHHH0	-@n4,%Ԝ2hjN5>򂀡2X,6.3l,+R\"&w^v
XvEo:>B=[w>Wߓ͝t:X0򸬹VP-1dQ+Z!磹̡+6 >҇2k"]fE0zi..>ei1SABwlŗP;HD~;<G*Y JE:c6ܴ`@=3NP/;6GTU\f4JTOje'IfLU%pAê,B=Aio49z*4st9n\;Wj"ܚ{$Ü6.LX *Up$66c.,|Ɇ{ m\n$`]\ep_mPJb%'?l56҆3
t
Ius6`grţ!:LJ;|dvK	\k*6Z/aOJI_u=WPuROBpr C+\Rpհ:NQ^q#Ήl٤@8&zQ/Reo9״R>E
! ( p䒋R"4f(Uc#50ybdF`ONwNb@Y)7[m3u_@a9}cY3X]f'!isɪ01zjT:	$[.૷)R~K5:2W]fo8apȜ TʚN_8)2dP+W	ߟ)7oNgͅ6wŨZwV樨~c#9V?b>Pc~9V'1ׄ7KԴYM媠-yRX
`|nt];>YG/uI趕>QV@9tA|} Q^J:GG{/)t#uaԢ%JZBBR6,8_G,8\6l~Ac-MIaKj3[<hF?S@0YxWuiOXvrP:@Xz AUQq/qbT?M?ri\HlǢP3쮷LVG$ϴYGXt`tQAjT[i5a}"DNjʹɼƘO[B]y{b?C)Sb9ŰM #6c/aH8ě${hX7%:WvK;.Aܷ<Ԋ}g_J*2$D$Om΀[7> %`59 XZ9"$'ֳ)@T2|r"dcR>CMJ
{ծk3ֻ[65wu1>xPp؛&}3>੫k>,ZobJlvHN
QcW'kdj&;i3 i]e]ΦX@Gׁ.;;O )\++.zY|&\ْˏ(:j}:YpTYJ&_+ƙ-ǡ
g )ƒ!Q3!2z)z`g@>L.dIL7++<FMVeE.⧫2XxPav/[7ϐL'Rٳ!b؄y_	GFje92'xgż.Rjťva"qK,2^!e/UWct^] aȗ7[ 9fwN:Jx.7闐nJ΋F^ U[,GPZJfh\x,yL8@16mll-M^^vQc,KFmoz~Y$;|LQ~VYϖ-ɭ|^n>EPqnOj/MP&RI3ý^E]P`uZ0-	:|ԚaSfYLp=6M=e|8AyިoٵYʻ!pmw'thy/$Y0v'Zc6}3"acDTK؊8xo/W&Am.l_KK	QؤGlwuq̮Vnj僧Ӵ9!kB<[=ՠy!c.qK;D!f7״]u];\D4sJy&-|:jl/̮t34n
H0YdxS&.f!*?KYxsrMjH^ε %5.2S 1txK@#;3eQóG]5 'Y:"V_{Ooؙd?$?WZȝi?p&DB?+UqLG\䷈0$ Н;?*`i*xr
$?gf]_taI&?>}}*
-NdȞ|sBs]3tOiѩE,2/ ˌ[hsCg*-,FT^zIx=u^E1ŴSv
LaH,JŦpMNoY5?j"}3_ffhq
3.{>DzQ@-	j&-~bʱQnS:9۶i7ɼ70s1_xÂD`q6k>`sXlk65.>e}ti4,aQax>:.*qkFDO-k]Ṇw__}{>+5[DXyj;~N'cI1E oVMU; uKh0/G:7*TtA8E(E4^	5pPFQ;"{ڛtn5m!@ne*Yb_dD 8-;>ze|D=xZWLMksmlӬ1d$h"^NҼr  O헯&gCǬMw-?5\&<!ETt?E{K}JF\8>ũ+_\BS?Gָm(1E
E*aY:@AjR/.f ?j ?K+0(fɰz 	- ?s5!pI.s4 cq&gol.0}=\ZXXt?ǢH,<Ww5k=$MM\%Df!ODRۿVt+o6T;EIڳTADe='ݠ)j:?'4 jXْRO`GͅP5ZR+t~ǟ+i&rs=rQMEo!PN:x>P*bKiX㭧8=⠀U(۪|b;o=zTA uZ6W22[3qH@$:ﰊ-jVYrQ)y|*RASɨmQR9slqN^΋OV	qA.gZہ5qX,'mBgrwo$E|O_+&.Û&n|sEZ|fy^y;Q;mgO(h?z4Gua=EEŝxCa| kL-&`bb2"!R]ipVkKjWXN<R|GÅ\g!-9.R-[m3]ϰm?Pr6cƗհiI.;4pYt`TT3DӪ@^9cԅʹfz8)ǒ?-<vۜH@uVs-JsEw`mo-U'
#>ZPgV`)H$#s6~؄י	41G{r.Li)(7ȯʧ }Q0XZG|7{e]k5@gumr9>F.h^/9.g`$+f+l<QS(fc[Fk^դy%HǄj~M!BLVޕc6}ЏI@yc}\S,HUWGg:P3vpRKmj}źgd>x%,"_lUXh _<#
ָ=J+H_CWB4x/6*W}l*vt;jI2N*UV2aTkI8>T P[+1]Y:"󯊺BmzTiʻxgxuD!v׾~ێDg@n2^2:&6Z\?2Icʩ(9t։w}MWjޠg4hQP=kHSUw xi2kRTA&wl6 	>;8^#i?a=U$s@-okvO5ˬZ&u5̻`oPmtڍW)䜟I'w7zfiro dɫ
<]@«7z_TX]:QvK*|5x<Q/<W/mp.(|ݸbF(zbm{P|U]]Z-J(&_Ǌw3+DN1CӇ41doɏdkˉM8g9^? g]jP6:<7{/2C)M1\&,'EV,Sj#MG'{1>7;o)]XrILw6Ϗ6)خ^V;*e)S;y.-6}Ds--Æ}ikrdA<+'xHE0'TO:C)Ąie;^#dʿߢPk\К2r*"_nvvC60YMN/]TeyO/a*ѿ0/m~^1Q}LGg?y (JЫ[Qɢ+x:!`댹~f̣x(@KݶURQ2)o*I0ީL
(YLrš_:tK F&٥qlek|p}ze.l+
9Gwte6\c+0"8+|^K{ZW¾ahmٍa0Tu|oˬ:_۹ʮE凴:.oa}%#BcmU<TuOk? atrcv؎fT&Tgk*.	/e=;-y&gƛ#rX(dxX͔o"wr(<^3RVu3?2MWG=--Uz0Ldʽdm8F(H"\Öp= ^F V*k'X}a!s3هv>Wo/~o~}շ[	Iw}Q^5MDFsɐt@/2{j2~<"a@cd;Bݰҝ^M2l}tlx7n0*h4x#`_Al`2Ow˖TN4z>G*@keϫl4vf>[F&uI%F,f plwNYj.$2;K($3YB9=k[A(Bx	,{KNA:[2@>*<aVxd{2INV]1}gkP Av/k^5 (}K[_om}[e%x(ͯA0$
da7(S$a0d]:*>^xV*KY2Z}>`؉S0J	lÞ%	UؿS0\ރ&}GI3 -ϊ2Ym?l H GA4c</#Oۃ5HX*fTWʳ2B'l**2rmv:yO?g(2,i	x)J+ \8+Ӕg`krmZJs1gJWLudUnˈB7밥;`DdQo;?Q?e,vKj9 żOGUrBZ5BۈQp6f;+2\?qZ5O+0sy*NhyF[D'֬fPdb@wA"^ svr}ŵfIu1sΆjGJ\W¿Crvye&:-"ejO(	;HDtx_S4hEش7ajKȅ$+@t0-#XF8*r\Mg,ۍ.~?JLXg2f	FE"7_.ct<THV @|d4`K&xCRph]DFNC>u4mwiru"A2t'#//\eR \	=޲ZPQL֓sNKXnlT3&}1
ίm4S@q1<@Dv+e;9[l:Ui*XKL-bBBfr՞Wb&e?]!S85Ջ[U>6ݼyld|zDTʰ-p^N@ Z<£q.PXZE%JP".rs}92
tW!FBrLtg
B=Dew79ՙCfOU( [%JLy'aq;NDIAg*i7$w]msjm.k@&7)f浄:v{?3XD05B]olC_-EYj.B>dE:.#ovӱyqkeF4|&*.emժ9UˎfWx}u٩.U3M)XG*]|iMjzQ"2XfxWwzaQJjC~s1Rp`V"CJ	M.r4x]ePCbN Plw054a f @Eo4oU!ClKjwV<Nv_Nֶ%y']6	wx>%8<(yi<yK	χ|^	KH [?AZ(`l]O
֧)Hbn׃O唋,GyP!H5&W0\HPU}@r^]2#'py>0dC`(Mp*
W}2enSUr^EU&i>NDR8[M?jH*"ɀ[k-PmKE&gTsQ[l4͍(O8hxn.lԷP2 &v>yS3x9i,h!rGv=ey1Qr
>@-O
=$FtE/Ev{nJ?#<pv(+H;,̊X)etN(i\bg,;fxzV	72S-UcTW(&X2o74bwJt=xٛ/8:?j	ǃr7MGɏލp,bexJ$KRwQ0795O129fmK'tZ1JhVoc795d<
N:˵|N6-kBTVfo IYDD`pzD΀:4D=H!D^>F\[|gk:5}8ZMLL[?@*k,C`FhZlB:Selwʵ{9&
/*X24@x躚o	4$glt1!HJ=*Z=MOQr"~u ?ݕ '㙞B:;~ľE%}&OrC(Y/MzW}ۡtP7`U	h ͻwY<:Ltl[wl<(֧9cr_6ad]`|1d\;b-Fqh,DXJ(]\fL0!!w5-4:LiZ'@H`lU1*Uy QEiE&aJ{?jptF"a6l
jR-m{E{C+J
0vauoΚ9ע0T$;Pf]cb6
iK-)01L/;Cc83 E89xarIg\m% #:`VŤ+)FN14g"wޤ6s≴`vg=7.:<{e9]PZl};HNG6f[fQ]OKDǞJC8_ !o	}) uu8GC9kAcتvg[1u$*e'6H!Tֽ2̴נ`hL^h!0	
	)'Yh_^bPp_
(.b®Ƿ;rj<جzZ.'m1\S_^]N_F [˩ԁ;3Ozfؐ(#0Q&&c0)h0;Bxnin$b̯AfX<bQn'47V%vjFϪ/~j}QWÑSxԂRD Z`g[X2Qp-gZD[1ր pjK6gUy
u8j?y3pSƍ>(U>ҷtLc%MG Vw}_T/~ZF½F(}ܧ~Ӷ0${Ŝl奖YOZs߻Ozۀy #vkѐpb-V*sX&FYب=LR`#DR-}Xq[R'yR}=v!M;5_v5]Pp#Qn}U)x.JQ%AͻVƳ
@!>̗:15%-xg	Q~bz\A^}Nn.A h|2`0v=9!mJ[qy30ZZJe	"{0&B;T@c0@X`㠿oJr gY0@[x!g@m_A/?9M~ߕی`>&3N0_B#J
3zg'\SnplY:EB0s+(ѻdIVVW aFyvn @+yxHyVs^Ό>F*Iœ$4]Ϳ~y0_ŁwjH%:]
#hzFOYH}9A4vp$"uh7_Gʠ\q.o_WY#(TӴ]O1Wf0@v(f>A|
F:zYPQ4 ˋiF	Wy6v0}m~m0.u.6h^WlXO3QZx2@ ܯEu*T&<'w_YP 38r¶;bͫK2P(JiԹշ5&30vY3#rܒ^f7e	*vVr}C,XS'`<7
@rrg]5:Gg\5 GR|<K@RC`dsz]t*niqaubǕ-2{íyJ88z/)u^I6Pv$<cx܀%֮vW7حma{$na0k (%s!O> #|S_A.1ߦr|;'sluZ/0Bq%~@9f[|Oq(|ρT;VNAMRu4߮w튱HKw.XE}S1h! 4Av~ĉD~&xXqfnF_\{mjWDzyDv%ÂqD ΑIݶ(<½_K,|v~tڞ|N3Ii6IT|TOb٥<2Kc䆿KZ蟻m<	eMvNPAI;_:v`/ӻO1`x sy[لl'γ\D$uz򴪃]v뙖S1n˩.'G; 	weL18MY|.N?>~Rg`|e1"ǂ-d $Y?2)`)$$cr>P	T/Eb1SUzE;U?j,HB.,vșdN0MÐ[#-(<\g	״Yq1

sqJ(N@9	PO+fܨ-BypK;&aj_hrP"wS\$۠}eSO46yM@S@?\pvd.kjz7AYl38Zs@G|y9٩9لg6޼Q;4tGuw=J]&C-XB)*H7aZ]t3AXF+Xȇ&}`S;ѢF'*CPh8OxR!̀G`PR2VyҼ0^iDiPFz0aau=H
y]tr]B^RVbΖkcsjb4KLxKM=R">Ő5&'p+C@K)y9yc,SL
 2мlj\ֻ̺NDg-F/[/"gPWn{X6\~=yͷp=;x"7ҬoiB恘K)o)flT[ B䕦xZy֥נ
D[薵ϵxǰ$kl,w>#[<x-N;9nzE"-܊rD01Vn>GqL<sN䇓?ro:E-V0nC|E+vBz7O&`0mT;ȧ3+RK0(nSk"@M[9z#G9/f	psZ__XG}}{l~ 4[AaW;~ArIVÂG4ZyqH	5PA9>%Ts2Ctz,8V- K^ d(' %O9Ox׈݀aH}D~=md(<:q!F<fc9E9Cx/ FKyy!Cn2N5s.Z0Im3$	Y߉ *W	r`lg &w1grcK
fsWnܯ^`*%U'R7	sgf$TLvwZV5D]1Go: KZڳG@m?'CtOϋ`RߊYƫ ? :B!`GٝC1rhH!ә3`'pKԟ:ۡzPrʕnm
a^l`ZAѩė-_4=
ً럏}:K! #8$ 	BaVXEB6)򑖅9Gq9Vh[XAgS3Ǝ@-kJ4{x3bn(K+/Ә=z'kO+^iD[:pxŪvD뷰@xZ{E[ըz2ϻ{8B{kH#{3@"M%1!j2Wf2LQ
 9P`;@
Pܰr \戁B+PNPlYة̉#ITĈL$jY1Ruáe.r1b0'7C+\s.Ny4cnos׭z+1o׽& 452O@A]@zQ~dc@8> =ҬWLg",'΅.Y	mm_
,ϊ:/"*/<:nU1ܮΈE罈!,8z$7sUhQM!LkzvEoڴA>3[+UZK^zWg.ޯ^}':@KWԢwƎMO9
cmސ*bRE&0[C&UB'󹇯_E+fvUF*{v]:|-yR?e3	Po>Z<XdD\TTcEuICe3zhƂ{;C
OfDM.ws'V)繻cȨTԤ>,w_ IQ_c_^gRaH2+3jC4HVhZ\B^ⓒr|*GTY͵Q=%7-3< k٢v;OGaUldHcMp3ԟdSzV]=ENq!qP.,\RB+cbRz3	{-[mxpb+m&`}4neLߚ֐H]IP}ޮ񴹈3V:PHeǕ;X^쿡B{WW/ϧ(Gl	Id\v!P)*\:9]ZU%g7YRA|6'%A;'	<Wʯ>=_fJ1\^u,BAЈEv0l2r̲̎W4'F1чӇ*Kk4B7Byw;iN0@'8ړQ+5MaP-VH%a#p-%,K8ZN3?AXZ^,nx6hHqc3Dk9N^S0SpaMiHeH N,s<gA4XJNJΠaKEd`]RcZ!(lث4]'?!Bǽ$Sا޺
#]/ֿ.xҺ84r4Y&}I#TxO<lS&Z"',n],#&38\h}9	y?O2	ՠPUQ]~r%YqqGox@MP	L"7
*dz}ȗ\@aOz0ǚF	K(NhlQrajKp*ۀyQ#j)cO٫ 0Bdl!{KKQU^ߕ\oʌw!sB[h!4ܟ:Je&싆뭯_|~I_|͚_DG;rTd+E}1E!qj>jGOӤۨI۷5Z2=mBG$;U*7'T_LMƊNjLlr?Nu_rcWoY{'g0xnbQhoDhU?hh|Gq4my+zX%@:jA!!~}+lq+S:}i3]Wy̰4EC;/fY,p{2F͐$	% w+XDN	NP):Y^̳AtǐaO/@;`B$Dėt@\@O?/5	ݹaJP?[thT਍ '!r:vr#жd@~̛ވ4P!RpN>,[&eHԙTlҠex$5%ˁ0i\5aQ`
1hpDE8х iia8K$lẟDP, ߲#oFQ,:[?+p.3u~i+WQTlnbt$̫Olv:V$gcgawN5 +ɒ#
q.Tp[hSV<T HfTz#- 5N_JoD$&\wĕԮTX/E!L06HTj_
uhƥjFrRE 1`,tI'zs<+Q!RzHJ+>ᒨo׺hz_s,;,nmn *TN#'uwYq1ڂuirkmUrrH~*ą.'6F#qþ~>5]X8.= 
GfL;i~<- پKee˼vk(lml&KJ!]_P&9SJ0ib0</F	$W&wS
9G2Y c9ġ]F{IyU<ާΦ|11vbۜo=ǎ2_jկÙ
4f߼hJwO'VIhس]d/Ǹ]wʎ)9)N'N~?}W_/QH^}-@I5JhF]|ɩ	ɜǻ(j5_`z)fuVYáyv5SkwF[|:۝PcWVX|¨,"(\:?,@dQWtOw:G:Nc]Ʉt)*-27Guna y׋A$ɸS][_8|"審^|
~f(ߘԎՙ\
,"H`B,1k}="vpy<j3xn\-	ūQY*p'!' Pǳ;}szaZB5ϧ[ìtFʒϹP>MT'9ң6l-"[ް(}oQ+-sgwL5oOw߽s ܠH>x2&i>quG%=%\ !K[(wf,ԏF촇mI	{)'$HўxFSQzdFd93cD:K?FPlqE0RÇ)nׯ(%6 )q/ *ΏfGQ$_ Uy RQCi&O_AK4V[m5cnnaGi;BNbn'ѡwk]$CP&P(9uUQZ;&q)}$o	f*E!AEKp<E M.XGCZlR%{q(҇[ԓkrzcVgBG
,Do^Lu|FBgzdKuI"5SxTj<vtTEZ[P7ZT
fL%x$u9I<,ٍOAAnG:_^Ay!-Icy)!}+@FxtMSD9Jo]ǿsQ5yh@V!.MHIPͰYܐ:)T8-TLEÚǽbMoƕc/rE
}F(]5
.D<}A.h3pSA[ZhޞwϺwݿ"e]뭔&"	awvn؏Z8"|'Zd	E
&aQG1cY	Uq4dsjԐRG:*Q'z3"0ump*=q]+{I3t7ޝDmپ<Lozo:!KPE*w7I_2}Ӄ;s,8pD9j"r(<"sJg|q%=<kjH-qH'zlI
 RA+q>i'@n:7A[ڣc	$a^G{"GIN^r`/[<"nEc{!&cݭٵRb !8F<'8x% LKɴ~濚BOZpVb )g`6 &G3نhG/m@oA)E?di<X?&2ʌK[UN=Ck0i<R(fjg'!Θ p+T%[$l$G:&۾2KHYurĥf`6q3`;wwZ=H1ƤdcXn]P@h
Q>	rB?(ibqwH7	F,I~^.IvgGfvK@I,|֎٥H=ld]q#lDf}v6~;ʧG3'-Ǯ<'`lu{Hv]9=[:q=	jQ쳪-xgMjAjCY<s_Ut5	9_*C,w}<܉{۷!VgyjjiVVEKFUG3='jU&Uت%5|?JXVdAeo*)<
OriQ=+ -
D!*+)hIMʁNE:Qa,-A{ԙ()<KK`,ٱl~/8d2S!svgUqReĈv^ǅŏlMSDY ɧ5ӓ\SC*c!s~zh
Oix?̡.Z4kͥaV `}u"ff{`'09t ׶M%j%%@&:{nb]w|J-O!A#րנk)r[
-Lߵ-n
h+ZtһJm[WWf-ţ#eT]~.?6XWnC"*V.VT]hM|$|ԒWtSr^F
g>1	O^'yv^W&ٌ5x{jZﭛū?6Q'0$d#	+l2Oo*LRq3VHl֊)s5'9Or[m|/M>m|Y\Mzy-N)7ΒvGx1ET//h`$զȥGn22dtfoȅ찶.F~ ,*׊ǀxIUP'o^C;D^:KXWܻ͛RU- ^)+ɒџيr1$v4/dWR$nz
8;><<zr6<$p s)άC:0F屪$|%iv<[#.iC{'1Kq󇓎Ŀ~<+64-g~\rR2r+f:Z5Hϳgj"@	]R !_(%5Ztg.;vڶl\Gp]9lW,*xpk߁),OOu6&i1VrϿȓ[P_O&.RW駰/צ0ɧOխ8T5Tr729s]-*WJc[+K:n7I8nU5Gr>("ulkr6W½Y^횣ix\Bik	&oΛS]Ky^GC/=EGOޢ~ʢ[xs脇E
[}ꯛph͛nnE5PssqKVu4^oեFsbqnC?৻J3@aO==9mnO6lopRP`	Xrlv\I{~}(DZyTO5FDU>}/a`wUA99{XF=G}+Z@A^j~-7?ZtaEGK+sÒQzG٠x5_ s:w^>@<mĳJXi6C[F|/hC7eU_s**?( g"'(ee::),#ӕQu1P.SΈ/ķ5{"%>{	N3B$Q
Q, I=A@@ #Ӽg1L{Ggz5/lEZieyY.'Cj0`>	>$K^PH%N+|
^0!]
tRL"XUD+#Mh.QVe84zw?|گթFm$%&LBM6<}G1@CmXavZ:mmP򻻑Ȫ<DecX$`[#4i&2"ۧBNP%Z!7d`Z8v.ؖkvz8KǼ믦Cؑk?Su	,9Ci8Fš]
SWd}KduEVadK q\k=iC`XK2QSݡ.NVH7j?Ψrq\/[{e>K]1!jP\S/v]U=Ϻ޲sFK0G`siV01eUjlvzUU\W5jWKTy`oME/~Uk
IcE׼lgaC!|^]3VfGL1#BQ%_[Ñ
^~P?}cic[Ko	kbvc2Q̽؂lUQ>\tW٥8u_Fȴk*peUqd? E@Ki1H';w9X -]U@tZBCzG"SӤyww{5ERhn$,(6;ʋn6_S5ׁES	v][oT,J6)YG zLDJ=`pjB~՛I~wNc4Nۇ8&Z7ýG!fX*uK`1	[⮉mg4^%t۰sKavxuhb=C{vSD'J'u@vL&@Xq
WѻdơAg
:Mج>Bg͆z/z
axVp㙠="
J\ FStlgM>2X\gx24p-|A#DQ
~X; ~F=x]P{'x^P$A/cm:6㿶>DI/DlܗL#&jf	 3<+4S8~`EA򹑸=gdx1s#iUd	Tl?Odg|ĕR,a]ps2=?CZP3mKa}*Spmœ	l8D?8xĨSGNdP|g#ݚ(T3Ы	{Y,ՙ4
?_*5[<\VޝYsBa/JnT<Vi
Տp08ϝy~g|Bwϋl8E_P;W<`4wGtӯ9
oiևi"su;D'YkB9M47lEƍl@9ai\g9ihIo)#WnCtXfNJ4`a|Ctkc`.Z>A1@8ʧ:1
8x.!e~VBu8@uFϫsm7xP-,v0pF}mt,nΈ´Hƍ)wJ3&nbBʹd}hI.&AZ^U7mS^ckPȳ] n),'`>SH^'XD"$B0hAWnI (QqH&
V	cQ0_6ϙ,*py}5^@DǓddAkS #FQ,wDB[%ĉBk=k%6CcҺ2tqqiSww*RV{Ar\S%ǆaB&KҌR4f/j{uˋ>e	<T^^7nTxA:L%z+ܫ>">fR#uGgp<7OnT4t7á$AvMf|pk+ƚ\/xQBAA[iN[z0f&,YT |)]I @$3<S3P~  O?%:)#48D~צyqhjBR-Oeĝ2;@M_Ӳbr>"Hһ~:&Ђa8sI{p&+|C( +'?HNyx⁹aۏۀ0tD D>i=6P:cj\W1f؆hGva>*Mw'tIa)Vg$W1A_My DhG[޷R+}1*AmJ8  IEAId{]̐gRG$,dexGl`^d4(z<MEu1_2}҄_L*|Dp5^{zN__*qY:=LIiPMƳOYI-1%z"x}KѩG46qMVLWP j@1F{:96RhΨi)c?tefb#M-R.?هshsi{h Ox,<=Zy{%K]ĳj Z泆uFYEmhigLƱTb0ϯ3('f q# 
Rrlr(ig`ǌ=% ;zI,ť/󛤔ȱt?ܿ SUjG'D>z*x
o(ʲyFdE_!oEeL6&Ns5QDXB
*pېRo(Hj^"n<dh Aa`gT|u;{]nKyc9=~| v/P441Jk&n1VW ׷n5gNr^Dq2>CDQM,':ptRisHm6[؞/#jWM/6#~9bvV"@u{w3El(A88ϊ_D Ö(U>զj$hH(Cie`,hAu^@@ظpO	+$0?Oe923^di#,z]NJ1ц1n8VT8RڹkO p:7ɦFNj FA˒`iC+{%c֪QAM_NAzoy!vJd,:
Qc=ܱ.3>&AKii!K#^cu
adc斶Ts@czU~;xޣQJ3潶Y
kr*a,M'8DKZ?-*˵xoΐnP&ԯ[!>ղVYKeO!̝
FfScіk@yɉg=
Ӱ"gz|ݓfFV=yW8("kQٷE븷N7iVP{[2d\\蕪,V?IKjԟxt$hCr !uSFfhHv-rhx!>j+j4ϗV=Q` BjB#)wo͖lᗶ]np/޾6ߐr|/1vq'wŽdK)~]^$]6Rd#\nv|2Ahΐ17Hc 'PҾY1.L+f,0 -8m :rC=4OFt
9RU˃JxS1`S2x!̧Ta.LOmKZ5't*M<tv5⵹3*Tc*jrhW+uJ;RiNdYBGA-ꐙ%w
u:u
GvŪxD#JNF@>+ 	ZiVgOV/ʠc'H5Q!3
4V#$,3	6{AZU״Et=Ժ8Y2AT)+i!AU(
8*]^nq8RPTB$xvEM\`N;?J:4Y[kQ5].CEHɰ[Vz'yMyI73(9v'lwA$7='P0)7ij:<^Ab8. Ch@tÅ[ƫT"7	6eݐ[p3Í,'n5^Y	Vo JdB$XSX!ȝaݻ] cU\RR_U.DhD`U#BV8En.twK}]m"Y#3yy(o`4O	elgPYH^xwZCUz00	d{K\UzL)X݌%h%q 6s^E+' ֣wb)5{dN59GЋ\\0_JY!OT?>yž-ɖJQpB7DQ6i<xKbuq|X*є1A1~乇t}ϳR{\fw3goon>Ov&0fӏdEn|?`'KJ>	 zF	
	7{$IEmc@] M lAw2PC0t/&E:Ě%]E\s&p~aݫkxo1P`"#G5I!vwYwW{!c<]GLaZqsy`ܛLuV
;2ݱ]#&@|-c .3-""BP{"#wM\,{kǴa02g2΀;E4ww:'gfISFJ6?I{;&O\OpVhT*Ͱ0N Az)^$w03䪎ȃ`b	EK'ތ5
hH{e|wSi%i(nc!W_G'TPBE{>+#mֵ=M*>z7BIz&vR=Erؗip@Fܿ8(j1R!D?!w6݌l5A!wDa؎a25]6FnE&*K]Z|rR!~6xIÎBId
fp8wpc5c7jqJ!|%8c#jRܻ7!l:ňVZМP(3tJ64@ޥ7Nt"aq
"9[P􌺥^"!|f<O _K`\B%5E\h569tI5e)}&e7(GD>jD*)e8G9)ʏ$&ǕPu\W}ɖcq]w
oHߏE;|zxYF%4KeN`&Ty/Wij7.VK ;gӃÃCI|	A$HFjr(ۂH*~@ahdJL7;[@(Ldbfdjq!HxBНsykQ~XUks%iO<P<Ǝჩ슭z	A`>>R榑mCm%w
IDZX9?v_W`&k*K1_=UnW$N\y8QŅ.ZQIoTE˝>p݃UۻXZk ujbz_yy iԦahuZ?d}s|5XZ=sIUda0js), ĉ!&܏o?݄.8mrS;Z|*ݰ"jo
J,LH 18ܕl!rFo_F@)Y=kՆD-uKQv4Ł5be&7 !GđB7p6u$>@!<:
C({92a sVJ՘Sz8ţG:aGZPw5J|aB2 '8PjE FF @
"m$㏑9ݥ3Ѥ-)	G>(d:x):ӌ)8 ,/֊WhƋQaŇ}<\'>K5B~qys;>r}7pcÒ$Ky=tLfd!0Ր @Psy;euD*1)rm:rsgkj!j30~q@VZ 4gbLc-~V*d}yA. :f\|VÆRd/HJXۀ~ZJ8}9=?9}nbTSҽâ~9Nr
Q\
r8Icf*Hr#,~R.0Vw?apE+t"dތ?VBy2+OAMYµȵ<RFBVP:	8ŗب[bO "*!P(@TS_smz<ZiD#wRѺVgaJV}W y0&7טxvt|mi6|\gH:3¤22TCmwwuvGutLfIٝyeO8nx-uU6AΏY6E0mU>0K}.-f\s}h|ó2NErc#ǥRjȀƲ{)%ixcw^`q|F)_l_fUblgaMǦ*ΰg"83a{z~܅%ZAA(w	&C>F4]o[a_42hGGP>^2n]aZ_?llI_STM"f
ɛ)jmJY+KZ/սZPG49{!ukT+sˋ4G43ܿ@* jRrؚkC
9oS1!`J-RWGYL	I Kۗ__7 mNӽìA5m*k4uP^;&IZo%D:>,}'N+ğGq* g̳6֓y˼`QkYƹl
3Q~9[űӕ	\\cV4[Z"к߀,'eT/q%)kibiT3a<BBu|8͠Bt=sjw+_l
Ǔ]QU$?LU&gu{<2ΊG	BQhn3YQBOMA~Io#FaHQV%Tl^}dhm K~;ǌmE1\3 ;0 _9G{B';NAmKoXmIKG((s*BP%ٺgi:¶Cz:X_o(_or""|)JI%59_(ҒL͐	\f(`%68Yt.=10IL҇[|QEګ/<JGO
?r֐3"!j!	(muJJVG0fG<O&NLZt GDNfT>coZmp5Uыf^c	XP.9ەFwl&G=(O!E%77
.tk~qw|f88Zʇb}/ÞdOI'ב"/PкV#DA(ڀdUe-z<B)V@ 6m.MjOƳH ? 0p .Lo%8>6Ρ)?߅ZkKv0S(a8-x`p!(.F."b!7.AｼZԭ;7pdOD}	RrͪfƠ7u~#t|>87P
q+;}N'>j9!
%tehWɼ~! -lS[GM8zNVky-Θgh'm;cfݡF)y"4펤'xA[z7NDk(%Qc} P̄]c >̎ڏ.xc˞f3Ŭ7BtL +Vx :*uXE>Z+vOeJ:ܫԟkFm%NgOYV.'ońlߡ=f(?[vu~4
P=VƄ^76X&>vAeT$AJEu<񜣪;݂pʑ2rFР@U7gVB"K1Zv0 !GmLgՆ,sAXmhLb83y KT<:iӟ>etzʊD${
ΞoGԮ7P.@Ars~bn9MiP|^*W=u%L;x͞*J=;;^?g1 4SJ>Gi_a~(͎1E#&0$^J76WvQ6#k{)cCqRFx& M~Upi&*b j wdŗwHK-1[4oы%V~ڙoX
ia]*b@!klJNʶhoˊ;[==(&/1kS6rhvss/El[dӱwRBD8۠ )`6_Ћ&|QY)A^pކ{X ~e-+Xa0 Bkz9&`OC~#IqZ~@Sx>>hz1h YCbn NMJƆAp`@|$@Hez&LdMM+Z%[!K8G0>	LNhχ"
)Sn7ar;d0D ;VU1UeWQ>ZH'ϻA+}"KVֽ#C.~wdbA*1rFsݪ݇?,$˺$940p.3y\)4?.=&^xxehE<o;7d%gh^FO?1uhRe͜?_6񟛶i!?<mt	'/`F~0{_㳶r%T$Z8ZjJL{r9̝R6" lKgTd'"	~>}I&޷MiXjj^nMg@;7HiN'{
6A\:̟/灟?"e-?f}aςQ/tz.>"餁wODf3Wx$.LmչHv{Go8ٔXQ
	X= %syJ_koo-,b[q׏qSƄq;tAx
tq&E"/qe2b/
W)*44Ȓ;jR)yP=̍48ddP[WI4aAXa:u
؟
sE
xZjĐRtʣrN{iʤF.w~/:X܆W ][`~ʪ?z\7'z2Urկ/Q=z^jGS]cI(}==:Cd^.<3]y(RH'[ۙHE1Iٷ8 %\c>I藖q<x{t|Ai<}B9AZTLl$y$t9j]]$r[M$+>ƓEO./fS` =%P5X	{0t"o3rwe*4?<u.'g׼یV$wDLG!;q|b^"TK(Gc_kZ^Mh
ukwXnx继OY{H"1=)B-YBWi yp=E;%iRflQܨ	!BTBk]IbTm8prtߟ/i i?-6@+)fkx8%m,ހG00XSÊ?M(MUCn,ZTA5)S9Cz5 nk}ؿ`.[xQnRohJfU&*ѼXfC;mtTM*G2'yFrm]ʦ`$NCÄ&7w[S[njCϜ+eDC>=WPydXCƘ?Qn|.h:擭3ԡ4'u52<z♊F	ƄfG
ZJ\,;Mqj)Do[cK3g5@*Ycބ'pW1I0&n^0Tpl@%İ9?f,FyŅEC=JQx&IW=ӽ>/2!f.gwG">,'j\_UYLŀ	>=>4씟U֨8"(606Ju=Ә@r֟{o<M)j	5 e8H!x,;ݑama1P/G/e2\OP^c1$&WsQ|$tEMO΁-s[L5jc0p&*j8L|Jb94[I]Q2Wu>iITɄIrB 
Ƚ Gyw_[U|CIoP7\Z	6RwHOΊ>=BBdAfj6>W1Gis|ivZ@l{s*.r+\B5K؉7^exm{lo6)5@Ke<V8u	2Nɝlۻ1d\WT!K/)x>W(x .,W`]#S?mWɬΤdϿfTQM]^k\HDRz~^
+И㞳S͇믒4K d#2.*d#$Lɇeka₃~(8$6%D
:,=LJa1ZsXޭ>|OpWHnGO҃hTf?O|8U(7Im8C.SGAwlRz5(U#	k@pO>pMtvLD[x^gw/o6^+;t2RT-e-)h'F(FKG+cMeÂSʑuJt^B0\rDsW۟pٷ;2o0,|9僝A4}Ӿ<պ5?Jkk~R$^6M<oU?,EJs g7B6+s{0,+b)dV|xh޽d9K[
՚? KghR1,wYj2"$x#'E<0%K{s`?J֨K|IdԎ>*Z/X|ܨ\@,^aYKSf;}?j~<k~z]̲5@[Y:vRʅ[____=Zm ٝ8MWIc&!Ocm4pa1W$U b) '\*p-R'}0#@p];o
;w׻{?Lhgv -Q?v)šc|$ޒRc⎩5J5;yY]#eȍ+$1	%eMWA	OffߺƹcKBJApB-	|^$ab7c'_: %. #fMzS:RQBt%]N[aG? <3 f,Ίh|	Nf~uzil"YFhIdE3]g*Ǭ3a
80Fmzptxp/8V+~_]<fqM˶v=[Exe^uWȱbu1jq4pO9VZ!(W|lw*߯i?r%VR=-X=7p</1eD9YxZ .ɚkjbvT9͝i6g8`@:6Z<(P⥭S^pZlaεؖK	 T%+c`Bs	ȗ6\[AvZE\ܨ@̴8Cx-TUQ땦"
 jy]&=<f	5LX=we7%%J8M#z
6a%t:"nH-K#hHZ;JՒߊ.}f&?KY?8]wMBLj;+FQ-Nŵrm*SJ.i#_-#NMNr|JH<@A8yqB	7%xsӯ!ɤofX\I;ofnQG%RUhIk
䊧
xv/ x_Mz7p=w6eyM}v7l<|ɗM"gy$=r)c-|\xl<{!{;fTb\@9@eG=.^]aXZgHxZ9 P]~5U A4Va`B2cHeCxm3Q_;BGI0BJuh#Z>
*~1MҊiuEy=YqQo!>w0 	)uofjX}]Wv?&m&8!wh8ɨoѼj|ʹW T &Uv*m|6_yDO+_2YHAU#}#%ʑ"!-n/4ʮrR#_[ˬﳛ$N|3F!ۗb=e`^'E@(,*	2|Oy@^>e=U@t0m(b5`?ϯ3t]x.Ϛ( QiL$S|OtR[fZf Ȧ9~x/q X$@rhD2?H UVLhl 5!'F noJЇBɧ<"'x`	9863akf3nY7M'1"?ˑs?BPJ+@EUNS
m2pSICwA|ǧ"o8	y֪X$[Xk;	5؞j0e'kje|Gj;Y&vM{kؠ2.7 +Φ7ӿ3H>І%5Pӿ)8*ϏdUǢ;^0sQX?Ғ.P夸9O~~DX3tE ZRO'PT0h[H3w@}I,C{:n'hS_}+H	4d82R6(w'hG{N;4Kԏ>ȳQ-nHUے`u5͖[Msāp6rW0 />AEjoXV=e qu[&-t#)`ߎN*؞d:::RjpU>k[dD9&MYs0,S~_Q-,-xs|Ob/,Ȏ-X٫|fNjm&z zXSlU]I[$yR, tgw-nA%
sQ3>9ӞRhʑ&*%+ܾRj8r}9J(J)AGjRbL+d!L>g/ay59gk7_{kroǪ]\<fG=hV]:{(zk]!QldBTȭr2q2SjFMb%mu>UOd6j .:*KqPjpdMWW	<S05ŉ5Q\ߣ99V)Ŕs,N3
VG"tz o?j6xR Ҝ3РBc4[phq,8w%uN2PjC2.3W={:Pܽ8C`w{[^Ͻs|{hkBg~vRGs Aemʼ]݃PKM%-d7LRR$%:0]%q@(8L?wu7xwa^MKcQ׆;c!Rx8bU:~^)(9>~5M]?Mxx ,am{:W5'oDV9v@`GKjǯކ$6*xST&|@N;MpU7	o'Cg#sy&ʜF[j4`JMi՘+f/#l}4}6
 	-k/FweACWVO60@_xAA@$A1&p7hi*hPVCHHw'Sh׎poiџd.jEߵK-j/-43B#(mP~3>=wAf+q5pп!Qć48
`cZ{"@IXg;;Dr9Sh7ˆĄ زL472XB)|BhH5 0DT؂=O4Q	Vcht5bۨ+2sqh|uΙ׶,߻:HpA;M7p5ay`+G}yg}ZK.vsWԀgZ")qƔ׳`艴SªYdmthˬA ܛ&:RU0eA.de(y0g#TΊmvWAҢp9(۱csLnbLƵ)^FLMj+K)'C.3C;OJv8O{g{w߯TK4?a/s:˼ȖV9KPxÒ+\1/QYnF&~Z.N}Ubj66u t7tϻ1IP$y,DMkid}: ӛqQ5WI%/߹ygǫm}1IYHP*2OGyE8CU 6 GA;MQ.1$ٱCŤ8I,$a}K\eWjꞭ	 ~l8TfAWt	2t)cb<:v7g'C	erx *0}OF4_3F $oS>nQ䜅rHp	.KFx,"?8~t|-&Fܸ/Vj}% >RV5RrK]l~F1n(5ip%*-؍((^e~%Y(MEҒ8vko <(aUmz4L;d3<ij=}[-#R9nzgp]a鷺dMP#G<J0
.##`a0%ߍ4#H}zନ'ΖsGƸi}9^'qmod	 "#)fb;U/2ʎy_%
辑kna[!@ȭi~`'0S6I4 uqqnN0?M[RTx4(
8kp\zN
 z4ƚ`i`n$kAu]SD1h9O})ҐU<?M"&ĳ +6O0tb5Y`$D痟+!VƐԐҌja$y#$7(C_?#4z0PGǘ"puh1}G<Xׁ[ya"a|_(u0T2_,o.iTVT:hhyGs*ݭ4E5~el/
]sz*@{^qEfTY>ej,cbeެ0]k eF<rVloV\,oesFip_n7?[F;s^lّK"D/fu⠀'u'UK(>YeY;1Qb'J>E~n'+Ρmhxx-Y~QpY' o+^2E9	('(TWbҲ	Yq}YQA=:T_n/6K)C(jb(=Pxr;p.K&4O~ѝAC/12P*}`bN=mpG׻9/ylAn(քX{%J$
ßv9kPp#EWwryGHmV";YBSA/exa 	s9"n11]pqJ d#?gjI)(%o*)و\\-w>Lk"9zx0/ _:*ѹGTk #$댦o&h:nS,% *Δ	LRF.:;"CpI@]|5w1X{(y~!*lҒt(>jZ}Ix	Y	Dvr6G8OBqmQ:_Hc;uh%k_⻴\qaa
vTgT|<m ZVR^t_cЕ=d2a0;4/erb5g/:8Qʺg.D0W6kEp*pڗ} D,8ջ_@ܓ^[vdh|h'(Am0kІ("8)5dAmB[Ocf#rEuߕNAFR$zd$0Q7Nډ`4rOVSH1n׀~߁(f[5[d
Zy9tfv4wOyϬ8C=D6ec'
Y4ttTd_gCg,"w?R־4у.;BwwHjrE܇+悉KJn+t!ׂ;{^-[SO3@+g29`PqFpMD"c_xhZorlHRXE6L7éC@ sUߓΏw6˟rKSۘͧ=7-tu2U#L>kQfd
(k7[d1#]H+#cJܓ	hAI/\*̊՗6gFIyVqo_phE^(@Qn֖<,pLFA^}2*h.
W(6Cz_JAȬr!C8~"A
/No-ejjdlx0=l9P3yJynjw|g_N4(y٧#m|PHM(%a*⪒h[oQ9VERZ!O6rBImWg:2Tu]ΊCc ;@IgZ{ e҃)A.M[閹yDE[*UF}CDYt&Z~0R״ưE(i9Aw,qseІvpTd$`t*S?~>1vYP?j՜TsL#1Le
#Q`$OcUa	ɎBϗ|R7 J>>1I~(V?CYBJy#AV\S0o	P}N$kr>՛B8'ғpR6%㒰#ͮFuz_Z`(KIݙ&:+w>H5{B  l^4V0EC9 Г9cǵIB,T0AV>%'L'^An-=.ᨈ,r w^¾g	9*/ ?1 hbM9T?`0 |b#95MÖWNcpy(JwS;L(,ސ!B0FeIJ6)CNN-J4UNMozr	zu0Ǝ;KGQ3-rjgh/ƝDw%?9W4>^}6gUϔS ҊBVƵ$GWz8i>L5+?(`&]~l?Su{rʦh{Gh~r
?Y𗤡wx
ۭh9b\gTi7[z7@-Wb"gq\<+~k/tݯ潀S(
dEB-MYbGg*WϜ2]e1S9(uM* ZCJ4/`ԑ?<͌^#>΃C*

wn2h3vxyDLw".66>f	s<
S9̤ä?ٺj}s*v7T7X	.9*>U/].k4YX_7?Actt5hܫI*<:k_Jքe`yTRxίQKV]{w :`EO1<t@a.jBϔ4w"?q$D&x뮇I:Y>%*EHKUؖV}J~?@¯oSg@d|iqzR.w2(^jc'.AAǋ#PTȔs<:BղV5vΪq{1/@ґk*UҭX-}t6&JO֚X=kE#) Dvf3ַE hALEhGa; 6<uqM17e˞݌HÁ&xJ:zp~
t1fJa]tĨ6.+KF&4hfDcL"]ic6m>DXVOjDu*2I#5Ez--#cC?!FַD/@yw;̃}\2-k	NtlwyWRXmD紶u ѮzॱBt~l6pٷ%SEأ~?G0OO@=<`&9x^>ЅM7o!&`NqlŤtU&vÅD401#NsWv]qQ7'zQzZ@GzzQ!Sw32yƧ&(^	DJ,c7+]t>"913-9cq_|uv9Wrb`[j3'wwwI`@wy$}"blfɪӓKr4<,0H7*Z_fT0;*ju@lG0a!Ur0ѝnpotK}b(t5u6fsVӆͿp"bHTCq)dV#3Ⴋ|JDץFFxu#E~9vq^AV.XƬ.Co8IGUeJb`)PO&Tσd}jt<֞fJ݅_=+ 0_uW*GXدK9;UW}ppt~v;=<GdT{1WÙf7`rnڅ]TV$G`ACR@}"\k&ܝD.O\k81~P߅I/C$fSR'I_'Z濡%{q'w߬+*!!Eyg\m?!Ɣr3Q2/m_>TzO].ݘkAu=vF+^\ T }(2(Xq{1,<?3X,
%J+\paP1hD[DsphyXA 3*qWѥ:xk@FR`kֆ6jֺb7fhظKÒ:%xHGW{}3^ dx4'Ouxl`3szXș2(&4ͬ5= JȣVBWٚW\kCfw,!!'tGb[ug ;>^$]QbO, 7/	s?h2 5>@pˮ8kIŏXs+dE̱rt/_l'd!'/02t/hӱz>ng쎐+˾ K9d#w HPGȡ+0MbK=dn,iP^pB.?id:4g.$Ead|0@&mT Zl}hzɪ,D4pO<Կ"6#?D H/2A,׷$As9u?;>|lcr+UmlZۭP
R_ .D}&X'd|
~)qmS:Gl-녳
]
>O@uÅr/l(/8g4)9d1³zЗ8p]V纝	&9:Q-ġHƒX+O9$rIK$l4yʦQqGӏa6Qb &!L͈(KP¶L"9P_ExP9Gub'M֗ C
v1TX,+P{e~S`	R*7J-ӡz`m,8Q%X$7Qt/!t#'ܓy|rvr1F=a[O2ݻm$1!:"<nVYA&g>Z?!`8<K ML3	*ueJp}=Ly":&KfS;Vh WDMdvTG'gaUZ|dgy1&1Y"ifQ:RM!RD2 xQv[u,5*ͣ@oҫW;=`jVd_y<i2AL܇ɊZo«2	Wi_f⇙#F˞u/oF=/яPi%va&	&#?	VG"/+'~FfIm-t_ƓtMFƎ/{oh~#>iF;v&9:&κgÔd"i -QRAÄaD6Gb%0:rxK1!b(=ʧO%Ep>U-ƻfg
Gs,8ā!Gߏߟ;}r6 wЍMN0"6m7F[jd/'NǤ Bj1ubz&Tk3cAKr	5LrERzR5ɢE7cIA=43}i-~Pk~س`Z9#5t+<*~;>=evoG R¬q,[me'OBd|QJ3-|]di$1VmH>8hT؍ciO}C`RZ=mb[5cDKRU 6 [UCO(cԚT_RmGTB ëbzQLQj!}PV}y#Khr&@eXuO:m($Y%۰SP'UFc`5@fpakp^)]ƪ9N_saOIQcra _YA1 /o.ߛws10B+[xluDup܈4ƀ3g|D(MoGMpQM>zg~-7wjf{2{:Y	5I)W|7cg}cTʜ5i6lUn<<[;:?[w%3)bzc5ٺd[-\^zז+b|l-DdόQz%U*q7\sMѭ4[dU뉠lEa88h-Cpfi&	lW;MU+ Ƽ=+m[8sCwROV:ݘ.Q2j ~'{O]pOHVz|FaQEH/h."R
 ^Rڈ_g$pyɿuPr>cB%`` +pias7%YbOSnW$kϧ ~$=XF`7H+	@b	\V4Kxx&w1JȠB_MrK
㿒 SN-җ%&f (ji8+C@VeJF]> u+dU&nB	TRᣒ{L.*Qk,.הKF{Ybx^TOJ,bzR>2Q8RN	B>r0O/EyywnXf/pōx\|\E;rV
)oKrB9:a~ձw*$bMeۛNunltkŷ_B.a0+kbWHt:髌:)"UH%Qk2a;ơŽrGw=lB(k %q\75dv\GxUҫ!0Rw8~O\$S$aayR@oW2jf<M%	Q.	K'ޠ6I ~j|G$l8t'13_^"5om׈JYT0v3|=GP^DǛ<Vysk"avޔye"h=#y@E:g§	FF6>񖏫-pb"J9ގKkӥy_Sb6Zisnw?x4AÃK꣹JW2d5RoDbR7Pfo`rw?ۙ_4QZayQh{9;?8zJoYnﳛpQ	6bt=Q5=t:O<7v=9
i@IMxN	BMI5tʣ1V2`Tx--eDJ)ܘ)'&۶QfeJځr ϱpBJ-se6B	~|)d3 nX@,岎/lS"d9!VQ_V\qlkN{x<xZ-X*|W,VM1]xd[5_p܍!`GW{hYunT''ۃ8}l8\w+>pXKw8DXyL
u'7Ӳfbar;G겸DXTe'%(JGƫ S֦͛KCI3v"uy{AM
]'ީ oUTy||l,9}x)d/pZN{G;Y7`A4%^j֛@Ѩj8d̕cʈuk!"~0Ӄ D0Rô!bS..JU$cA7Mldn0{(`Yܪ#lhscr/sX#7UyP45OfN*3U֗ل<o #Xat9u}I5|	H3AbvjŸ׊")xpB.a^h@A~$U9zw898h|YB4 { |TVxx
:З&:%Ƶ8v'RGx~$%"蕳&uGY8߅
.$i:7ZGOS|:Y&4ap4W-%_}n'EEDBvdQTc	ݾ*	Bn=P1V`]5l֜i&0zW^*$"uI<f"I[%k)\̖q|}fj%m<k-27_%60]&{Җf4|7W?%9u-*NΧ7P}휖U}Y9Ҏ
2χ$u>'enؚwst%5Y\@q/f1I6zq~9U
A@Ġ)c!90BMXrYV{#HRJOrn*Noo{K<($į	9$]B>U/}Ąßqyo؝^øRGQ
ޟuxtKP{37_k،A7*1<z0ɦ T:$~XBN<E"CFǱQGB$=.>`$|K΂2(;e* 5}pyaftq+$U#Ƨ"L{(q&_G퀇:1zx<<_F4[}&%i"z;#,m_'_-5꿺Q ~_got@wqo*s5}ߠ;p}$I"pW6jWZAI byy*!cYwQk;00t}x+	kj-iUny$+ )=;/4Il
8'L6u 
崊-f߼h"ssylG<=>X'\+R(=d)8,̔_dxbCPDZV}gJkaGZ䇪]~3ҧW;{xn>MI-3xȋ3DB΂~=N@5(?ʒxJ,RL)WS#ƗlzhF%g@8'dK)&(l^'
4%C7u&P
^@?;>uo:uK_v΅>w/^	};/zCFU*rLU@8LR)?8/"O܉Lw|c<(e*m	^>[3Rb5BqxG8Eis-IY6 #7<mpB &&~4M'22TGhcз
1QUK]Gx,w`㒨Q
+,sVڼ[a>OdIcmgli!IZg췣p9lncI<A+%rq.qmȳr<i^l)H
~Hwh2Cg>ǎ3G7PC"H͡K$,gMKj{#{:5@R~b_oԊ@#<tA8lPa/*X"a+{`Ĵh*=ѷx
Eg/EhbADIUO-t]9		ExLe@)Ѩ=:v̣>F@ɴ2!(S^O*K3OE1[~YPum+q|E.(#.0SƱ,'!޾:{pQ	U
<
X<,$^ #G@g/_~{@E懀kF|ywy2[\ˁ}l''/_nh>m<~~=v><σ
DW&$}273K>sLq'S$Ni	J3+:	jM#x+&64HRҗ(cıTN*VT0,6l\TuEC7eCu(# 40Gni2ԨtA>=w)cUJK"2xϣN_"
o+(rq!HgDV$Wp"@/t1(VaZJ#e@ ;5Nחvo%	
5T;ȮiC
6ÒJ%V)\I_%vًNF0~|h|:i%?+s[D买_FQi[!\0NyuޤnUF2/,1%g/&kGDK[H2ԓM1VC}}p'7(ܓ-vtQhld~
>0,*hLߠ0X,)>>3+Pfy-,C٣ukp;N4!<GW^1-l/nn~bw"

X%B j+3F)lQet犛W9r#@wܬf(J;kAq0t;!$uMy0Ca6̈]Wl.qLt| i,[G%U%@m	r1i;Z0M0vۺkA^55uid:x3>Fn=\^b4;1Ed9/tKAw~>9{9?Q{x4|nAD% Q}?1F6Jg]ǑAS8u3v}A\I^3d%'.Av{YM(0j7I^K-y'D+jـd;0C׺h[V2=$lQ Vw!4;?'~r|ͺ
-'zrtfou#'c6\%M]6'r&4У" 1greGE3+?e#LmodVч}pw7$}@c2nU-i^=V4^*/!|U>n}T!M;+UdRv7PUȧofdhek̡'q؞*_Ti?=_#\3^¤YxݖwYwq?-
Xݻۉު*#M!DFO1vyT{.VH'0eIR׉9òmiخHAZqi(E\g::}WfR
b84'z4eS+\ZLG⃕@#u3ɘoThj-yP 
*`Y##;@8oAQ̲/SƒUDkvM |+\|YLZ9ǴG9b)dC%LC*y⥉haCV9Ą2XlrO!=BhFu}9$"\̦_&Gx9*+6oF_=giΎw>? n
N_*(Uc!F.'n]6*0.pbLV*kÿBc!(Z_1
ORg8*$-xM%^deؽ
.f]|ÂpZ~^YI$?nlcrfVT(G[}lh0fGPws#RH5-:5K]`^YdShўW9ϗrVrInoDm~v[lNeV=jDiEp+Xh)=!-V cy\/I _{O)5ҿDw̚?lObIyvr}σR\˫l@]	sM=X: i@nx`;5x-GΓCPv!GW嘮V0CѬ )SEpb6@͹P3|Gs&,+J] #;{?X'H?~a{ǫ؊"^w _mkUa VTQ\嘢q0FLEy(/ũ䰐CwT#^v|ZvLo)$Lܢn94܅eB젏w	Ф
Eӝ8 N"($HpNTǝ_)
矨]_їmԔuc\N~Y))j5YE(EP,Nr<,ءY)z*CAvl!/D=e4//HIX5T\o\|rGCUhZ!"z"hVmP>bEىQ!X}	k*$%(A^*


XApCoR9X |uM0?ee%x66L"Wb%ǒv'!f3"^+Bnx	ox+rx)}Q,[gVc^/83/Ïzv%?:Y'h) *sHP+˼<(rd,0YҔ!V2)W7ZE0J=+UbL
[d7v/aѮC/XJԢpIT6MIL߄-ǉt\F݄C6U5JksQo桑ZB^y˞t}Qk(\	`d͖VG+lC}ECj
Ǧje_,SyhW]P<,EDWGƳl[ DtqD )R!l͢⩱@)0
VcUR!Y>xjs7550
KL[b7;w~4/Y`g!lرn8!C<( Ew0l4!eSt;i7gAOdxx`
M:p{#7E e6t)d쇲/ZlsQ`<r.(\I'@YΨl!f	rQ /zऀ4Lhl7V4EP[|pyr>@KSgWMgw7׿f_Uł^+Ξ<ػGo3F*W8?!|"Je#ȓc{X QDd/~d8?vNrV*HzژU_Ѫ>7ѻ(ޱ_M`>97ʷx	GxFJalѣ H В<Ftɮ>ۀ<"  9uW s9 02Jpf]{؁N'O@SqIIiyN_JBwdH7Z%uWa\_S	ت xy	~wUngc	:)8Km[]SG4 vdxx`ZF82Tv yR=eu_6hm;H34UZQW#=J9p&&@pnA:HUjÎu !tڻJ k>H?mRP<n3\X)4C] A~%.'iM\P ",bi+N|jHI	n5;ɧ=ReoIz~rqcj;{EP̀qa7#u06>9L[~DSБ8p-VH?bRUj%w+&]6$m])UHqz^9, :k@\)ioҧA%J -S6{B(gӛi,jֺ\Pk[vl,UOB@0DMRCִg-KRQׁGת4q蟐wd%ʿvȑB*(IJ	ݨYI1pH}8=1>ԛүbQM/5֒|I4$i$BP~5ߴ/rʝ5G.AI`6	+0ap\mI	2ĒڂbƂڂ}+}dAprrouMw5xShsǞm<<͎'PλXxC^9b|Ydһ?{΋wT /_PGɗ#VAIW_Ρw۠UJiE?.>3iS쁥"CcAw=h*ISG~?M1|Zɷs}io!>_
3Kms
;uE	}S6?baLtt~5dݢwUH~V@ųVc&E0 \ߔ|m}`]5ˢ9S-au~Fb4Ե`!HmJ<]s.)gQ 2M؊hn5P2b:o,4ݘܾ9yCZc/>GkuAn]ea(z6M('jJBsN@>JHvԈXW"qOG>w$$'濫k/uأ$vWj-!ir7Ǽ=ɖ}Q㕶 [$wڂZU(˰έ06?lDN lo5S
`*8w)0\G0_?l²%\C'禽IA6{wRW)`@Zk80zFBCz*ٴv{cwkofZuHd`M޼fRjRaToڧdE0uGT(kDS\C5HllwS~:~DAWʑ>&A{VTXz aL(r)'lD(\hJ7]onWj|i5AhJƝs'>|lY.B+JZ|E9ZOm7b7TR1/_#O[cU(,oU^w-0c,ݟ=-Ң?_hlpG>6?eӏn)Ak]vĤ
tmi,Hӟ>: MRi5}zM*|'eh7̡I 0Q<ʧ3{AL@h)\dӛ^qM7=G/>Aap[αjcBᢃ?yys)`Docvq;rFv_=I[ȡPW纽%{2M_7!,!q	}BR>$jS\+I1Gufh=\3?TZ(Ș8̯dwBKt-Qc8A^n){8"lys;Fdbg] nإՋȼ\;%x<A!'yP:q@>2`au{n3M?,/,ۿJ}U:b|n,É;E4T/rDw} T֘qt
3Nz»ʴ5yXַfн%Wp=Aq톶ucxTիo7ٟz2[5PL	6?J-潤pw c]3J)	ŻQCOQ(&G{taDB|
,XIcIQ@@"ZmYIWc9'vl6'ύ[fKC	%!ǎSG]G=BcQ6e71Abb<QJ?@qP_oq0-ᥟ͋䧇zdmU\E(SlB7$${]a4(ݯ@سoz1y+%9l+UǦ.c  OY6'OB'Lcq<~#&(`1WpQ&w |s;WPIݢD@N lKN7\6e.#g"=S_U =lmVzkܕ(/>!*I 	f7]Cg\#p9PG>K$AظjTM=&dPYWa4/6ģ[.Wc"!c>(@qM'	0O`S[A\Ey!AHaXF+TNT% LU4j$P$[ĞM5}yO/ڠH:Z #	YlJ: Bj%fM+G01zf@{h>0R~yFD*f#fUnSsw%}+eƃu}pq{9)Ycd=m6F%*^r,q1h~_z'FḧrO(	K4j   JAJkG8i7#EH:zȌRPc·Ьl5JF~BU,Jr4I.- QʲOT(ڴS[XR4yc|*S>i\6ssg&͌sTkfGޮɻ)E#{|.4`14R̆zGȊ_`CRa خLk 7ǘT	,CeC#lZ<ψ+ӫ͘`Q*q$&ͧyqtYJPҪXa2u%qڶ9љ5UwU@TdޜVvDıB(^U@YMDHk E\|1Dk{'hգXE%p\D)p(ROFBR	VRsyŭAAc`put~eg +QL'GaGoGI;:GAsb$Djֿv{q:={v{{Af#\=+&g2vq7/zeFv[ݴ_'~>U@-/P?%[ZS'\(H{{L]	eEn-\u\	j2TV	ˀ9[:(:~g.7_>8r;*i؀SrfKRcSqW j5rг	 @DCÂU)A1g2oǗQP>fR
B~8~T[v+
;\ׄ0(@2*scGҠ #뎹)`_$20WLoi<ƀOVm|vS=NI3Xrc_5H//.{G'r@mUhn%ywwtCg~r684H7|"2!B#(1In|r6B2< .@TX/:b(1$	rכKFx07&}T3R}sNԧ"Ao;k^̹_z7]$+q]W8`KhA&N~sTByPw_I{5K_/W7IEei#
@3)GjXb_6we8Q&r0U;rN<n\Go َpY%B//DUb`$p5($I%hPYi1CvjŲ9MD8Zq&jՃh)iz3'I6wlՔ+dF`!oGA $!+I 8^&b|d()nX@J$Ye1SQolPd{À7L'NH	XА;O&]DDm67A5ׅ`\a_	n'#lHo[A 00 |1 }s3c{zO3x 铓\!󚤼M=G\C
ƍT/~RNqۣ t8N |CXg՜ uwnԻNc``Wt1=MǍz )L?=g~:;S
Ger-A܈̔>G2[6֭Xo7Бqm>gҡkz>rKMm`
2'0x"Қ%Ka:݀
5+!/˨eE\h3ӕԦITH:dF#d=RbQ)#z?g
r:OBE)3Rnn%яӗ^/qܭsI{ Rp6+:m\әg֯"X|]{zF6Zm*J]"HJXVL^}!]STz2m|uثcD٣4nE黠BugC0黿V͹Njġ
[p>^Ƒ|L"#J}QOCq,((LI	/qvxfЌ6XlRR_!'XTl
Ի9O)Rv6=6y(|&p	dR`8s%ldIyΧOTװrR3>+0,K\G@!zϓTRWX~8s|4%ȝ&[c2z#I2BPK9PUp\	>v?˕!PZWIXBǸ?UWRl!>9꽡sG&Wq-6|Zaҿ d{B77qUG"*430b{B:p-.OeѿUZ&^Aco-A*y=(4ǟ0Ħ(YՇKk &Oӡd NvbiNֆ>oH?dh/EQ#F<9uIGNy̰P_z\ӄO4~jX4@2"-L$3-,<z8Q;knTlt=o#UU]5vN+DAF=vW4`,ޑ՜Q+xP7Kٰ=%p*g1LhͬCvُuFl"A;oW_O!k>in:$%`J5M.ͣ?xw0)5D%"OYyAϖ9Qn(}
(DEU1ū]ixW6aa8<?fl\|&9gut$'e#yI0ȇSMӍ/W)˽&1ӓc<Vh;-BiY2[`lҢc$Y+AL@1RxSvݷv--`}|)X7Pu/;Ĭj˂ZC+1(pf_i> [?"P++ *
S
)R>F
Q	܊XQpOsPVϰީ(Y|ZMs;HN|?[?w :rt`	x߳*?蜠f4 `*w|HiMMX`5p6!$|틇5#.a^u>=@HJʆ7Db)JUp@₧ 7vӞLf
	U0/@
OdŬ3"-	0JS"R`;rϭ /ǙGh=yQkvz* 
BMd>@,qBn\
|Q
,tBDM=ux$:p`28[V=4n)0?ldzfw0"Rda4g=P,U+M:2sdSh~[RyW咘;\ǃOTuqYv97f@H%$6k>G4q[^UzƸ¤@Jʈ`$	(֮l؛X1r)Qi}wj|2:?yG[	n˗?fr %KBȊ<P^EYFpy{ƏUݺN]Cǣ:Qf|@ ul1>I:Y&wH}0&	4o7i2!GwǳOcݽ.b%dBԴ9X	NBFr)uN?(7[H0G:i]+.z;٤P2ZfcY?lU+M l٫_@u.-]7uL{ܛ؁jqiߛi:CD1O#Sm]3BjSOdi0)GgW.PеeVR,dn_	2Gn삣>y̞줳w{x~{z	4j:szz|S*gJ<ez>ժ& +sRKrQ>kyT\_"`8*nvޚ
?N7mpc{F6i|FTEwu/W<BY}d0h)'Ƿ_2Vޝn*ذ3j/5(򯉹L$.gh/gun3	'a0 tKr=ؓV4s2:磮g({Gߡ#C30||`پ獶:'ƝE']:=EZ`5N#n
ID#[$4x,lׅ`Ya^e6cN*~ۧr/ ~L|A.6^ۀ?!qbw9:z ,Z\šw!Sбw,֑ z`e݄Р(^(ʻw1_HXCHd[ɨU9[j󩲰̉`,fa:%'.1ZLB7PPꓷDQ<m3oGg/bdY}vwIG\̱"]O*aoǮ^kW4iOWv(
1qVG+rj;z,ㆲb"Z/RQs)"'Q)s&ɨw]
p]8k+f1
r3wYp1p~(Jb"3#7zT^_8vb`ٜzmdVuKg{Iv';Zזؿ9~Q^rP'3c28Mcm^Q~p2cx` +H\wW=TbN'U:yb톭RtWH3p=DI7I#@
_TH%H{^i%;KFtW8jYkJva; FkpH f,ٸ*M+gviߛ_GkJUES "&;hILPK/ax7v8Ta%:]ZOx"o(U+AӍ</Gє5@hVCr2}R?W59z]N5)F:@j9{7K8dxLiIs'20k>?,	:Q ApɑYz[N*
gא4(Sj(Ξ!k.lbD+m#-hWVU^䭄9eQ1d 8#	f0򦢰(I:1fc4Œ)4qE$JpQe_1 DqGHnvaى6%HE+vC[՚2yP\hrWI]r+9<Oף43*LhRPQ3ΆGgghV衦gl%U{~!#-8㋍uL̡tes*x/ݦ3I$sS>`0 q6T.Evxx8w<8Sa|$&A
(dH<w1M+'8=Ty>cmuJ5Ç|n)o-븯g՜T?hzޔﺆ+T#	#b}B"@w74R455
w';rɺyćuvOC2 >`IMP&W=PٛsxQe\&-1SZZQ5ƪ?q#QFIV4᪃֌-Ŏ1rG.$t8Ε&H^=P]wLeSXWhlTTAU?H)*_{^kc+,EŸD_G[  I}P1}cPE.k1|U6c"VJ4i	{~!mF{))HgJ]h3sr(`S ('kcEhA.:z	X!
B6GHTcpB F!G	{p,ca |NɅ0Ro@F	}#.8RĬzϼoQD @pVEWQ~>e#>MxPָ+l+R?wG~pwv}*>R㼌q>ސAyK=(%=Z2O
	QjG+*7NE6e_HS&1$taT	=_rd
ANc|}τ!'ພNp4"1
VOQ*5j"_癄ñ1tA͜4̮	'LL\QZ4S],wm.v9Ѐ܌. 8>CS3p e4#|2\^2SL$jւ5H$DE:Nh\	=Za7@9|XjQ٤^o/մW@IU$utٛPm5=U8w("xBz&	3&
dڋWav5X8-;ٸFPB|SNfrMoDYrN;$:=/k9hwz	Fb	oq(Ĉs;MR<h jCsedr|[v]I;އvK('ōݣ}_@cG 'ȡ>*탇:gwN?OGGfeM}_Ȼcs;Kҫ[3A\:#&Ѽ7@VM \zaր@ (JsY~I`t"oe> <d`sg5	gV.i*M߸)*UȤtcc-'պ`hBCq0^,a3"g'6X<>rO; d̜(,5$qџ˺b,NH엽&ë[.i*LrmhI"Gd#b%l;\WQ \y.E_,oK͓T0s[E$c??)EZՁg+jFOmWu:sPբ7L{x(SX=M sj
!(Z8IF=$=Z/0LU)J075Qd1p[vC3c7|i!`Z<tjv[tHr6s	9tQ]IhGxZaRa9vW6$e\S#._(q0:HBc/~Q-7B,
G'ш0vT擐8`)#p#HFY% F]tSڴ\"52UMAh_Ը1b
F6`'$݂t:ϱ~c'U&*8ԄGd4_B^Plέ43\ЉYPJ.`)%/V{P6s5tm1qA2>6RCk7'[
& f]Oikjԏ{߿A^'n`'W.#<v#'C>i$ɶW56JLzdJd{ԙąLKj*idݏ4[BL)%aSүSzhz	0PՀ]!ԉFg]o	oOiQy--+%?0MaoNk:7`$Y
&ɦ17P#{]Gsן%~Bj&؞.>s}8R"s^ $rqAR\Ȝ}TK>q{Q(Jq.`*|dۦֆXo] BC:➧Uȏe!fzt@Φc2'#WD656I/Q<	Cz":
8mkjD]Mz77U+ܵCp~y{p휊U>`|204̍]X\
EՀCQ6lEBa*8%8-S-9و⻁wR*/6b(Ug80E=3mf	E:GWl4[k-@@u	mCH_ހ3pC-W7&ڛ͡rE3hߛehK._
ʌ{Fu}eZBq?6MC?p֫YoF$02\ҚMx]lǅ(q0s'dbeStBkjVEI8krIM*qYu|xl 	y/^qfW8$ǌD	Lr_C9jcƞw=Ǘ  c11cL曮O+P[I1#^*H5~=ǅ_^|O@fR2,b=&mc5w4n&DcBÚAX`X	"sƙ:VHR$j5"o/4ڿ+~C8I׌E&=2#yZkl[ϛMfz/?=>I;?e;+{Qt>G^AhC3*?FJU'Z1p4K#`(yhIP'qsa6)V%y1S 'lRjv!PTO鑎1Nxe}㼐aqqhwW3h_@rʃ	lVbT.k0/վ+0*`R$]ք7)2V}	8\j<FCkۚʼqY*TdqG<#^mc4jQ1]1aK}T&_![LSߘpw{Jݦq\ZqX^r(Ԏѥj'Sȟst7mR\xVGF{Vʍr*p_lM<Yp45#?BkMȇD+c8#d$w_"ՙxD;Agb\QYw%e+Q +{sQ$Ab>H1	K;*n=Y3eYF)N!*ɌB\9zzfp4HbAo9X/Xx.2`^"6rS, d{R:W}ْy~q64!9B 3sXbt)SaJ׀r"yW3DF9b M˱kHF Krx.0Jf=wFE9fӻvҾ?ݏ jiWx<^Qۚi4@e*RDS?g RcYê̩kώ뫭/`Aŧndދf9rcfe;3ATt~f	k]zUq>gE]ŊMO8 |B;V5R$lܽQO9Va7\5GˇDYR.ѨIۘesT)1OI3C7 B|%S)\0gWJ`[~H!k5>@M\۞N?l@$9J0Ϗ=O(t U1BvHnX]]RjU+"kETh
ܷH^8a@!p\^fI_www4Eu-xl³fyEj"TEw'W&GX̎:[Mnl[6QX
֔8GNvWbv_9U}rQ85TT	J/ÉX'>#l@u6wJ(=!xC*
GX{NII,{Cz2l*3dM@"g%|,I#.;ܰ{5Y	K/OXib$>1ٌ	8#΁P6h(Ry_8@RObAF6C]/q+9R
[1ɭ)`ȨZ /\{3`4JNRQT&'9_h,L1kS1̋c<()5A61<#V|Hh1#ci?0NXum2iGoq7D@)|m\oK 97oҠj0Q3kHkaKHpg'em@k1j{9RCHf*wMA^I#X~5WJ@-L.7?OСQxYi|8NNHIū;bՆNu`>7[]?1ݔK̚ +C]~MИ`[1r!m1|	SGԈ^Cp]7sITɌ k+z0:Iz~s|9x{tCWO[19pL,*y-|7/i2"PMgenȢ cwO;Ⱦ$}y}6f0u?>\(ðfMs` bNiUaOY({וMVE9,t	7dSYUׂj2'CIR^7>}KSHdBhk(+,`jtޛڵ@x(@FQԀ%5"(08X@GR^44W}p+fy0< ro6Np4{AXNrd<yI*;z2h뎩A	*~ W~خ&,ʃ{Ƀy)H)$T惿0?oЧ',w||?|eFLH[5
OFS&sv e$J~|Op '8%!zO`Éd~":po@3#uWmIRFMY3%~!pz@K3s݁>9{[rXPCb(YHѶ>С~7M.܂F4.hVxV.'ˈFʊ},v9fw!B;m6Ĳywy"'-m{*1MjKmke@83虸&7 ǛKwK=>o&ļ!KMoOHpOi]D1LЋ7NI">90]Bm(T/
4W`Լsg;7L
-y,
m7|z3Dv JdbU-hȑ/FFQ?u(*[a'OYM#WLZ"ʛї:x\XsOM;)njx
UAn:P6FT`_I,k9мtAK,nGݛ9ƽRVKMQew׷Ȫ` Wz*;*a;kʩ!sQMI5],9P3uG!{'QS.k?qY>AE⋤1pXۉ¦A 
ԞHQ':A? A!Hr!͗4wDMTT;(NK ot%50j&%`TGк
	ĶFgO*0k%9:@հGG|Q<=m,09!45?S	*FC=mmU5&{&0D4=f7cfYPݞ'aN]cz4	»=]଩wՆC(l6+*Wi8,"Y2QeĥU|(E{*+2ݾ*49p >Šڰrc)'e,Lq}je3!*mrdBK'*~dFv'`GiaRPW^g\)&A
TR|./m$lAN>J!6@|hIiCj>oLJDr@_-OO8T2kt${m0f+9ylћ>N@Zf29pT=\畦uZ83o$c''"W+  W%iz<5J2㲓"34"/B<qO#[MwN̥ѶKU=ڢ|
fϩm/tn 
z?ݪ^G@uYqW4"-JEby(C֭Dl	?:rX~FH\٤6ͮ^fz?~LbYҧ7ɳ+p	w&/I;
´;i0?H눡mstVFzat6{
O^ڃi=-$r$)	g ;Ķ@XPdOzO3 yz{H[3o,!ymc- IB#K[E)q@0e`)|0 /Qd`IDO 7qb SHoh9.̖#{\=jqISRsWQU-σ;^Ut($q[ݥx=dd^CXp|uZ/{;Q겇7`WJkkLy+?&WAo'pa	bwi#W;g{nPƞ4%@z9Ks)㻩T>,<S.8=@|rγ_._}׋/25Od6+Ï\_f?u:?vvC._튇Y9xPS=EdAA[.'K'	!Iv	PDYv ^eIR"uv!u)#(^&߮_vvJGmBCAX8q,uBMd)4ĬW?=FT!gNa~VSTzex5I|..1g
S2}2}ȉ]4YV	q\\lx5	͞QQX経@ˀ1}7q9=~MI4$j˻yl	[!iqv6%l:L=j08[d-nȝL8-9oe-Ϩ&V@*Oy{<tHr.O4dÆ C|/ߖY^ VVvxy!7	)5[K6mB
sq..Ez[v;B~pif30FG>l	2Ȑ΂Rìգgɛӳ.!7[qnZJ-10+=~>?j^q͆R3	h,-uCu~a&A!n-f&%XRR0оz9#-4 Q\~yL|hyLcW'ticݳD}!pSZJj1dw/l!Asyqq7qB!RǕ3Xs*h@Z3%c.N(E]3n} ԍVA0^8Y^dTiZfX*ȋPɰnV8WI,}Nꟕ Tc2p#:Dù#G\9IϜ 'f|ܵd PwW5ئ͒;;g!EQ>!i::yĜfǜ<A*{gvyHO`$촂S@DW1ՙ'"'B^|.iW=Ɏ#wװ]]@!l>eL9
.U	a4rfôcLi:zQ1KTat-72ٛf U\_ʤynlW\tH& (E:AlZX*A	>E|e1ۢj[Qw"DWt 跙]@59RTnn@ l$ uM<3Uu~ΰ؝f MAtJFQڴ_:.J3"vy]/*fS⏱{~~a,vbo (ϣ6?w9WZh^?<jAX:]Ȥ/
l
j(Br	nqwŖ7d/(sE^ǜ93٢B&Sp[5&?qD4/Bp@=6mXk }CĂKDu`a-#&P66xgQ _=Ԧ0&DYKpE@yr4 eFF"&x]kE¸ɐFO֖-6r΅Y~EdPgbV{10DzaLnu>q1#m7&$y73Jpn܉U'-cuybZ]f{|mR mB-&+`m%]Wc*bKG!7J)wͧ[iT}g>Y.ҏ^`v8dě(Ʈ]r$a<Ǭ%=~BbvB-CU@x4G@zry'Č?aU1˫a#jܬZ?"KǪbghMψR8-c@s޾?뜢{^{R%qp?=k.}(ɟA4x~FiRv\BbPˌ&o3X D]Cց l4BW eKb:q]Ag)}5Ѷ
b^XkCUHONRy&3J$.01tMa2ejCO4o4)4WY8q<,VTj:6DxTpUʟR63Zg<`}Ril~@`d_h"TA	\,f0[0%T6}%t5[/z")N/5>&'ƚGƣ'  U-91[_zb:?+nPaG*KhďTBt0mKg㤕 K{/GSG|wB`'M!k]∄H7D	G*HihgwM0+cpJ6O-ʽ~Q<dNvY
=K҆DAf^/h0Uy:lL@ # !*=lբ7\(Ig`d,nگ yW(RփR1nD|fȼ@i:KaDXAK2D\@Zp~}AЇQdeBWC f[hA7p*@o>r
3u7_UUv84gڔ@̆&*cc6{<I?{A1BЯ)gƈ79%<A/3FZ0AP*j]00 +
G'$Ao n6@c9V8 (q)V,I~'-~Qg?XP/ ;@Xcd+5@~o݁{5أ@yRH:/;{J
},.F'"_
U<+x!pz񕥁b6;k%GhF!Cf3:#u4jl%O`!lzi	ԛ<4
YskjAu7wY4UWƠv|/NĪ9P?4᧺!to[N>n9x}/=6Z7j|~5kڥ`AOL7[Ka+hͰ(``Wlpq6w\!.b
vBԖs%]	JUv/O,B=;@VD2I[Kr)m)#cr[6I)V2J1L!'ossy~kdmn[lxw$&krxNoAs!I7ٙ,GAd7tMS9RGy驽ŏEAS	L$[8UENeG睟ONv3jި%E1ØvJ&j9j"1n,jMYBrr˄h)Ft	`ASu\QZ2kz|[~[G<@Gh֧yJ昈lxҁ_ֿes#-
) %j}dNqf:.G1#$n/ }5u6u^zwGleux.2Ne]AКՒNX5eJ<&D8/J?W-a}/|ƃdϸEiD޽O/ۛwS~ze'TL؈`רQ<VN.t{ccP'ڐH	s#1@m(K$^-pcD.Y-}GE<6.{#~/[]׃=W<Ӡ͂cʉj6B>8rhBI<Fn
Y4,$=ɗ_pm[f؁	oQb8_D7OފOY$r=vztfێ@XOmp.ڕM!T}9
CXumŸ{oc6(P\S@$d)$|A?~ûTLJ~:)%*cHbYofUt߼^ i~ہlEֈ!աǏ>l j:=#(i_A5hvL4}pVl3te'~_RDo>OqUz> ':M|	U+c#+dB
OdVam[\9@eRvAL>;*Jً{l(DS-`1{nޞGB|Ԓ7e{v|ǟWAԴqg{l%L*
/[<EF'C޽zՌe8w18wS)pR'|Yp+h I6J9c5&!,Ҵ_n/ LpInV|LٔYB<^4m.vP ghoso`8ԅEL6\x!F~$4T"lME"X@k"pog#hLB{Pg"j܆urNm
ħX_GN=	f:,b<}U잜wޔk@5CQA"a@_u~^1RX<ڔ7Gh[7µVv_(݌{ڄv;XÇT=}[yI Sxw@l7gi/W<p#,_ԅM}ߢ7'x;>zsxB1xjL=DdbHnUB⃰w[vO, PZBdvf?m~7)osY\@oVC'uɭ<أ=2r·[{^TH	Cӕoi^:c:|IKN:mPV:/pZTJ$Ƌ31oқ	%>FZ[S̒ګZY!4P6C<
#Zun	6A[AgC^ ѺsnYu&}u|z{-ާW&Hv &.VyOWN_ωH `/ɞodmeA_wkL6E*L1ShZ"fbDc"TE{X ]>$r$))ǣ{FSw/g '©6RkX	t%xgX  QǥCZ**7,mD\&\!mWޡ^;VY$I.0aRDH;T(GȒƙH4y" 2+MW-{:
)'sgxa;6?}O@%`BR>[	Rt3EБ	x&qp^	R07q!9J9v}ԙI2)1@?@91dwKׇ%PAfbW}*oo+2O)
hzWPO6zp`jj\D_whUH	 ^lB^7'u'v@HbwD[is5gm5B23AVuI${L}Rz*ŏ!tC._q+hxH534BGJ:Zn?y.1T0"*YӚTTP
Ze%[[L`3jyXr%<ըI j䚫ժc&o<sֿ!6-!Y14NUη|p=Njry˹p+Y	v?ܱQ!&fIqR7°Xp{ 
yNҘHrEus7,ѧ>`QMO fܬAl7
%Y}ʝ0'
k|{ID]+|<ZXpOI{Im>QfC%EnY:5HSZW	)FcߪmWYT9>*[eܬ(@wB|q E$'C\en:4pi2ƪj0FipwcA0puxpYh)DψyHc4.ENxJI>D;]6XCFd$ Ex>~ )A GNR>.aRhXcV;c-ǡ6,_ Oo$,/)nV"%eT+%g_;"#%᪞sau!3c?kgּR=<5vfӕ[ΞՒsᏚ
KI/H=nRXi=]d
WPv6 y>LwF7g2~$3-o
@Eh^$lRͼp	lM8WO7SEз NWBUv[U
r.j:&{kXNR0򌗩SD~gT-_@Rƃٯ	rkMCjJ~ٟbjY2j{g?Lhh[m,7%nK=489&$iU2\A$f>6y/horpbK'2Ӄ?b@t@:]"x:=f]c7[6zi}85m/kͮH?>9"puY{e#1vF(yV"*9 E@ܮ@lKJ҂32K|cIlB3/ꪜ<09~:/L?6(dFVcOLG׿Vmooۏ?3/Z;mo='fRɛR$~_|x.e|rð:$x]w</o	&ٰ?'cupT^T>!(+fCCp1.[\("ה86IV`=s$09e`T2	9J#1ԩn>y;7сA	[d-C-Z7õP szl=]o쮦8A7-ɓ n?ydx2jH?.ߑ|5{(6]@lU@R0;c-=%2,5^hh5H=K~l!iMQׁn
SGމ&=)	!2QG"Ӿ׵$OƓl4R塷ԥIBh.cYw|6-7L KasXY*Nۗìăq3F0 HIrln0$8-G_ǩ
Jf"Z(ɺ1O]"Lhm|D}VU,#SРfWEӬȖЖ9Qrp'Zbk	OSݜx?p|ī&u; x/>.{IDuБ
gY?\rIp"r+,(_I,N(cG. WcR22a%~c-yulh:@}K}q?C-=nR+o*ubgsT,
-2mF(ʢ1l56f9q _˭N,WP~XD69%Yr%q~ڜf&pTkY$ϔ]4#)P<?Ym͌bTж1zxʁPbԕFN&A?ؤyL퍆L6d:.kL$MeH5 ̋4	ٞ 1@|HrkPF,Xy'C-#R
49 S7T ΃8l&߳ƺe2YRy8aV*lv(%V`T  JvcsDDq'Mkb㓩3Oqi|*g0y_^([o.6	/bV9<ﶨ̗meU"S\gHYtbp%sJh0lUP];fT_c].$O>4VRJ^ˆd@A/^i#-$)V㱵h$F&6q˯cGO]t]ڔiX-G2UlgԌ
y_&K2i]{g5u*E2] ʧ&yb_Vx
@8J"H8Tj38x;:ΓlyVpl6	{p=EI"`3E{՛樭G߶uy5r`eZ<F	M`
YÈI]rs^:$#Csh,Qx3޶d]JD~nJjb"5`r˕r5D ZMVUfΖᡷwqlp}Wj6;kDeYf$Hx'[ o-DE6MC:2촽IoR;xk8
B-EnCyK/(
^ݢ $v{ qLQ"7I;JI܋|C//d. onLBl21T2X2䇏50`8Sz=ɛg'ǻ'k,.nRZMjR1D93pF%%D02HfRar{cqr=PHv%&n\9RЧBI[1,B%Vv
1N+6	ly||Bwib:l%|)+tHtRVUPSh""Ԙגi -vZ"4r'|qiT	)oo-w"W=eVt9/fc-`dSWAFcSo^f,]#zkuK/<P.'߼{5 'C	!RWh HKط7TGc+㙲ORs(?$$
3L;-yBIuУ;T.umAt"xp;(w{	~U	릌K}5B[{Sm+a/\Z7BN\!^e)e^[mp!ݦx몛D8.a?YbF03x[P(ieKK'%}<b`t6%k	Qsqp|P'Q/tX̯":t伩I?w 7. LCJXB [3u;DgsMΎi]HrRiT3^Zj}%Xta
Ȁo
{	"XX*$bp=gkVq
bEvH*]s:Rh,gPwFJў>b$Bvl۰ VŊ![DeM"riIRr\	p{E}(нxǺ @y#[ouZ~[E-sHBcUZcc2qMl&,.}%V.BaS!c
Pfk,,]A|dWq
oe$V۲	_rC v:8PtdȮD7]y)M2$,I<}qJqN+Rƽr۪/Åw e9&M9LQɷ~380p{IQdísgl}wzpM^ǿ-t lN%\[;Hgʛ)8xAy\ԣrȃpvIf-p(/w%
78_*_]~~:<l]En㇖ZsctGUi=#	3lt/WPGt*TX	ʻIQTA@(h_BoTT_z"r-~%TC, У+JG2"RX>xN^% !X?U]ֻXV-Uj⩪n3`A{?~9c=Xݢʆn9D@payosI0T:]z*՝alLD9|x/A+-x tu	^3sVSNG3n	>󽕴HQMqoqMV^R\]ü~XSpに&fe0l<]wW[;nXw0-7rw&XB:უqUDꏃxL>QqSѨ
 ,7HŜ3l,O֝BT8u"JnO7畊z&I,2r5Bio1腚ځ>yVZE+¢xC?̪0f7ej%wU")GLz"2įE:C1ь(<1Ha͵N?J'󌳂@&w./:#BҐȻ(Ui!\K[;f[KXuV\
)qbm%byPN	V+YPV+^lDȩsqjzNAy Q;f(ba7{n,=MYӝ"+:MomHqEͻM@$̨wgr 7@d '44"MhvZ#hZ4(hdp"H?Y& (U aD$P&P@۱6T/ڒyP0<K4&6$<(k+DiK4pQ(ܿP&HGN&:csnPeG=2Jt,hU{	u_(Km(3/ 4;[Myz}_}f?v	T-f`PLN+0A-qqy(?[[zu܆%fZsnѻ80§DãSD0QiopXٟV⫋tm"4oʊo	C<O̱|Vன%	clgmZ; oKc/@GA^YJ?:^je?2BIRg.D	̆gd0FW΃)B0"QIBqV-6҇ȑM2-PV\cjNٶm8WCYQrbݪhIbTK *t+z-I*H8V*;m@^t"fZbN2ՠަ
jol'O5aH]?6 6UnF_m:I-~7Gr77BN@gW.\0L^o	}hD:k[<.[զi:c9&D:rT[kWQTc5ɴJRDc\)(;t6KW8r2~=7S8K*MuP,U'W8zRXO؆qX{'	;kmciQT䥳z֫ߊF-<d dPJbc6,z&Z0`n&OSI.m9>YrwcHpOR3Kpl	[z]|49Hqt2ΦuUaq2^|pRM' (QHV$x POaN^|*3w& ,AY!b߻r~W@7nnMF)lzM8KyTo%6.v{\$-!;i{vet~_]W&Vrhևf;αzy3*XJP)e5ન7mpjvwnJ[Jkơ`nvWFD-b=Ylq`dN VY,0k|̋hh)?_޹vNo:9}9!kޛ](+K)楟INoNr=xwcm35*FugV 3e+A3rN"Hr\~:s'h͛SPBtF(Nes ~rPEWL7%g{+HâJ^1z?عSg{aN)U%R#٩Z0i##k>?)//- &S Jc˥l|RҮQO:HLzZ{ާp _~羅ڝ/9k3\vV\][bF޶HZ{GBw6h/7n~6/ FynՆ&s1Gt#2$˂FX|~̤a'Tivmm>~_h}pwE|)H >YͽU7,|HLm޲6XmL`͟5_p֓׎@wNBLܣߪf]`0I/JA%a8Hx<0B|,uXFT\=_ydHsZ]></,՞u lYT%_0x4M;;qʐn)(Klajו:))/ҁvH:18sPDrc1Oɖfds}FĸEl
 ˴w+ü鬉#-WovZL=K#AK<=s1yq!`ͬ9`Xg~UKRWzm	nGiV,0۔
{ f[y 
/`dU3p!_2HgtƎ`9T& B(\m6h+`h!𢃶Ar\qL	.WZ,/.nL9󮓋fw`@@8az]_!UXlVְ 9`&Ԧ4|(782TlYMMAlRZB$B,SУ{[Cތ)#'$L<*ͯ'7w3)gSa-0?vZ${)4s*D!Ϯ$]^'s}Â`?aB#֫Xo^,h;C<NiwN^V:fa8%B@(fb]8Dl`ez5f/@-PA>];E	᳕H<r"8%7C[g5JsmS8Ldb=B#:Tdou0t5J
cXR2VSn1 A?G,=E'$L WƜ&>I=.5-ynm"bW쪺GKRGk vVr .Jx.)^,siMՖhq̍wLyИyUC᭧L;D 2TrteۂjZ̲MA;&\)J~Ur2s;
2
&߁>ż+c6# Y~N%i +7sEL0,]vCd}Fe%}9| ie1҈{k2\s:@SZsCd<)0A 
Se"Ҙn5شAx!tlǆ)`" C/8iD}\^Ća}R,$I}WEIYA .2<t@f|0לyIFsnUn˧센>(.arO!	[db(۰:T\d@i3J:cTxv-kh@t	I(ҦuRn_=^G$~I! ːֿq(>8;9bR)u]^2̣7t"4aTRZ;kX<Ww7FS:Fog'$sE}k=qJt-zva ,AU3WۇPbs9aV6i0}/fU.KN-&i~yIwyD&
Ӝ/Fx+8xf||n85RV0WZScg`#ק߿w^6lWlzF.+K0]L oσA)6<'Rb_{9?@	/k[_v.E7/Ƨsޑo%XPDUs/bszUiIwi>#˷f]tBiskv<%@Ms	PgO ⫆@9~L^+/6_MZ9CSG#4"T)H2c#5iOjvMG^nAXM*mQG5iөɋJOqivݾseWޮ\!9BNKeI'tZJ6ȒڑoI&I>.Ïf!JK4[mxW@8q/8Μ?eLTXkcTΣ+Y[(gB#'l"rw$+Mnpgk,HnX<PY2]T+nM8
uSEABo?Sa/?"s,il^89f3jAg߮F"3g6Hy~h~yPl/bS&Sq8r)d+ts !D,J.t&'365Tq8dN4$EьAח:-LyLQ~WD|~GE1A/:eU=Ī艓طihh[3=#ae yZ9ب-w8$lӏj4YAρ(4>4]1	VvXWPўD͞-8~8]𳹙tb%[Zb;V^l}wl_`%pn\k:6L~&8srȷkGh=JLBl8׮dR+'鑦Ђ&-J-%geW8v?)tvIO~;
-!JWiپQ>DF}!3$ϳ^7T<,`UdmuD@8d6:Bz-mjgJq+omo%\%6cA=@|E%Bu#~/CEįrFd.\|Quo;)翯uÍd=Tfg0v?p'KV׿e!HXK$-jd#]0ɪnϵeIU*t-zm
+xr(:ZodcFBE<=
,=vڹ/Qp7 HsѴA]FoOC ԒsTQ/E4}2!) 	IyguX3n'7S\_iAqxX玬L$:h݄_+ +bʻ3(~=%nv:иX4FhT$=-uN3rU%i??B4[<)3f{<:Tef e)|,iΎg/_Ub_Aܚ%GgoO #lgeq`xםIc"=0sR20.>o+Gh٩IEL؆n!/Ũ ȫ9$+gGi<Й*SuEvs*"!}Y,}R&'҇v}mF>g1ga!%GջT{[W5ZM/*EMT6Dp1k/u<BwgB٧tbFuXzZD#4RZTX(D".nĭAItMD7f{#w,=
MWZ5R<+VP\Lbx<>T0E/מ锇rqiFE)Jԥz\ge6ȩ+ECJ`)J$$P%N1'N\ltQ	a{AiwK-XOb9N8G1l,ۑ?g0/vBF\LazQ}on2Zjm>3f`sp*|&9xa"^"LE0^c
`!U69Tl-~ݏx_C㩞	
c_j6U
#*(܅$XE[89Ip0V-sŇz sC/HdH xa,͌Bu>܏ tGg*2 ~R, 19/Z+?R9>k8pŗѻކ) +f[6 _l$vr=cw6
(ۿ᭜J¬ܻ:%(~^MŮ
Ey ݟ8޽rWO\I4;@5pF7QI}IL&AqP!`V>v0ycaJ+KCk|&7I|E07p!_Qvp
`ą;FA럋9bE1D;dGN1FXԌX4b
KJV+́A8P5H&\u-pmePJqJȜ)~Ȭz7J4%	Z=\Qֿql$ϛ#Q m_Fl|iN4UYkSt YbqD޸J2:yoIjܮ{I# ۈ-GVm&nJDN_u	WkvnLN@/N Ppڀ"|&=ӳ}*Uo\:WGѡ)c_Ϳ~*C:KUTFI@0SdX&U]y)9elBD}g!蔝gG휀A1*3}_  BBGl`1@I@-Hf+yڰGrOL418y3l6gՕh@M0dxv%
f_\"J<@<,& 9/evߏ	H1$;^cPiߣb݆{=uFA{~fV!o06&]dXHf)N'<GZ<7byS6ߌxF
+1R#E ~rhRw<."P+-Ƙ?7t᠜~fh4l6P%Iˏpe>wi"`of3FLkzch}\=vBSM!08uhWC|.1(S<[J
%v97J#BcH|IҾ!x!qY^*|h+lä)w8,zBE2i7mkGlxʀ%*+	a!8|LN7~AkflGax~9|z&',gybC8ө*+⦤UJƖ	ҍ);Ғ1} ; N䄇r}3 m62BHB20="rJYnX]O% 9j|7CIp[V|^XpJ8of)[*ۭ3d[ y|õk9B(ې{w|}QJo1̲;mR؁L2mWTU;VYEq@[*7>4 B0ͻb}l,_tVS
x,Ukێ֦';Z+=}&OZ}D	>l^kvぇbB
@@2W"j#͖zJh]Q>wFS7=eƦ-|ճM{n2NTʋ@6ݞZ4tF-5W\6ID(_PH 2*Ɨ>:vKaY,5uH)[哾1}n[!}ϿQ\j=[TUG^Ҟ\&`ɧI̧)t
ݡƱ[5BM΅(<P80J,+~n5b '1{f/TOkz؊pp͘+ЈDw"өhoh-*1ۡz,Tg|W{uN)̘_uYBPZp
]Qz }/Ý {<x¸)b=圾CC2SaZr#ި.fQٴw1]b3G'KM?$ 1>^jd.Sg3Py_B[SfcGk 3XcY'G&Ǜ;ǛoPAv7K$&/NW#Lpn^EG2t$mM=81'3f$?7ukS'-:YX+{~ꁸr/-A(LjFu71)<&n^ i|@#JM]Y`(*><6\ZHI\eD2Rʋ)M-{=]|UrJoU*uչ9^N]rJ!ͿT
j6
û*ڜ$[rpA-w%No3YB=,\\SRMIU.a\S^2HsŐ(ql"fJbN,9l50!Lw͢U(4DCH;<ZWb'U'<Rx7}MA|o>p"Q?cWTrӂś/vlq;DYy|f)=_{ϬZJewbˬ͍ûg“5+^UF-5uf)&[d麀z?V_n7" !0q/Fa#rZ[(E{\$[=uk2\m3Yr>/?3n"ROU:J͖ݱm!B7UWl4CmULKLTVUnG%eɴdaN!*>8UZ|2ҽc"WA|d vҀ[~6ښМ}UHOo\zWɽdrej0jffBO5e*6;+
kK%MR|yz Z,̧b:,[UNJ;aVrD}Mcg2mkg&e:H{1rGi Vr cn".uC:~.a9>鶍Q܅'r԰b3|Tv&}ߓALfӌfm*H8fYVURm;OnczG|l+ٍ F{Wi6:/}}^ }66[!1zs!HhڶsX5N>5Fɫwgoǯgoz'vpЬ1OyG4]`g%>Y `2qʿ1CU$Nۅ	QjzK$=&j/Ƅ#䁈XӺCntNͼPCRRZGWr)-t"Kk-էEKDX?JLQUlt	Le&L&ͥ<,F,d{
s񵍢z-bsÉ5ԛMCTrLH7@;`l8L֫[n*csg,`b 0\	Lsǣy#ްV;!(s&(G"S&Q#0j9fYsdjnLYbK	XcKQ|"JFok##8Ml.Cҥr+3#+,|kW^w1g}`-HEY"3ƳYp|]O*њHZpt_lů)V0Ԥ}⢅f.W#GVtp]9m_}iqBPN>[\-tr1~ze[ P]#臐ˉK9aC|T2aRvd<g`)K\oa*Z':V)#fKk4ZFl,HH~nwwjW5vשDWt)[#;(xևv(ܭLҌ`oaT2/TLJ,bTtǲ؉Hx32ɰa/BFdB}5ZdBV3^jU/y+7?ƻQ!Gl'y8&A`19Ҫ W[@rǢ8
Vt{MrWm	
U2aՓ"	Xdpaf|~8#՟`/A[^t|JS7[];A枧?!_U1s ] d2tHbzy X7]	_vÓtZ(ڈ}%'5rX. 8kPg\OCMx/t 3,y=aشBq\|"^R,]Ѽ|@<[{y3ӱA#_<{/_^YᛜSQa:Bgjg
J9UYʂ`+ :Յ=߀w m9		0 .+vE~2e0zk[4aEf+b!_#Dި#/)rKA1ՙ&ŪN0^Yh#sGH*@r&sf5`hˮ5ww.tl;51wOQ#lUA)ژ?n
{UyPX/9ؑ]{$TxVXIÜ"!S>WV-D#u{nȊ˰&Ad'yDy.NCt).|׼^u=Qp _x@QI>?99E	{/pi֬y#1' ]ԝ{P_M!SE*k|-_ɶۥjmUpu%U/;TI> RB] k ޠLm^\<X'Nx:egXjBSB +o}aҮ|s;\H!4g}k gp#ˎ!4.mxXao	.ze׶E&<`|9Am?w޻i~)/	*_5h4|xc?C&
⏽h>KhPIbæD(tn%ϥeW]X<j.|4یȰMKFYPvl$'uʡ;:&90,nv#p*sݓ&FP?=Ķ=Tԏ !"$m.(]9T}|o̘B,eBi/=wVE}p˙9L+B=*Mz=FVz\,ĲP=<#>(N~_hzQS<O 3xz?M8BbnU&$'FːK<\Eɿ(OK)k$oyk*ϟ?6.thp0VZQ4H 610b6;gt3HU5R|W7Toz{:L#bCl6cgZ w:&'B= ]swOC3I_k.$Z $wVu2\X#8
4ɜTV5HNShV ;!r,:l'oo}>(Gr[地l"7"-r!փuOBRٗ2OWz
YY)^KcP$dLjNxЩvCʹK-9UJ76=.\t,~q%zZ6?	tJ[j/Rm)DBC
E		ŧҐ!:14,hOf8.5S.586MK|MbzیmXBl7q4DꄅA8_VK({=f'?wY.ZDp1Qjn<ҾtMI>w9ri&3Q^F	ʥd:3\Đ	H0Чv͐0B5Y)+ZhK|bZLKͽ{6oR7aI.!/>Cc|]dxkL.E%p;g5M[2/N3+&#ô`sF,에8,T3,Lju{Sy;mkADV37l'8fWjԺK,?`yɈ']-pCۻ$Yg$a:3 !lv~&
UqؓBW*jFc}:`]3#5ƑQNF}'Yۍ#8IW)l 8
٧*Zga}Zo-!:Ts:ĠׯM^}Kθ7ķ	è!ƛXlbNYYt:;1pfg	JQ2
mcoCuN.Aw
o 
ĸk57xBak7pa^G9Qu`kC<V;vA~ϢA74?a=$`3$I(g`lMe	1<#'-Zs?/2oA[B`be(;j&s4?ߖdcq!s V]ċG^>Է;[ԩg5yגڟWg>7`lJ%(gfӳ>JO̖q`)>Ni)j4)@3wH:Y_ɻx?Ek}߀#|PM<S8J$7-K6l.yիis5OB*GktSCGR>N.6_g?#$wEb[%j)r-(gPSĻ"<eD\?XlWH	}lRo#
#AURWMb	wKOf׳S@Po(c&%E,^g ۞m||Azǭ&]l 7a0`kV&\c,vsA CX}	b pH
T+i+ǂ$^6?H!,\'tT.C4W`"+3Kx)ٝ(a6#o	_i0J|D=AOZS+s^O<Ѓ=|*EmQH#pd6,v7i6T{zQ/VbnP/XOg&TY1FQb-FT1Ta*ugTM";DuD~x}︷?'ŋυ[Xi)lyX*JNٷTu:i1կ(%EYbQ.GўQ_\b
B:;vJ$@AyPubI.29pԸ$8&}<n46jã xhNѱʘrfks##%
Ye97lEt3ҵf{1*gAꁽ-޵ꋆv ԱYų۸Y& %}uv5)پەA3נŖ/=s7^̛w5ZU{ߩ(ʘv?ۅRfjivŵűO~0˟M&*ȆP:ؾ[Ȕ.}Juũ J2%)1Ί%B8H[h	eAp%BAII^yr[e. P[(%^˾D6 Jz-VCkƗ Q/E+75<tXYo;f	BQLDp9Ou@y1WO*&9p#"v]aQfiPIU+
CD3{"A<\Ef~=>3m[0Ik(3/aXotJ$_MNl]58dI[̴V# ճ%\G6UIDYɮw3/0FY([D%!ܟ6,hG-+K[Ov4ďA<:흜D3@S<@ͻ}W>M+g0Vb+`B7B]mxaz(xGpnOƿg$r)k$Fug ̓ o]&'B_dzHG>d|"psjfסJeH:Rfak;Y @elpM8Pl=@S5m~=!NT|T\<yZLbWʌ]a1R1<sC,8cҷTyز
8P|E^rV͖Y"4vWoQtq 3
håz;dV&GƊ6q^fk4
'|YY""nUџZx@I&B!{5fO La9O){7KD\SAB!l\!8ӗcRgB2EY nlJN]!>qaD[@m%fY"xӮ@S	]o;78~Pbwop(WӤN5c3sP$7];mK"Tgp$⾘F]hFYPzzvE[ t
qwMm~'=0M@8ؗM{tvjHgͷ Hu;!zd<֋kNK(ڙ·lrW#4)NSNE솢TQlZQGUHK3=3̚k8(`˸bbYwAZ:ON:W`
>cl* 2|f;E(&`G&H?ԼMr^ׇG*KU6m^	7H$*|KQkŜ$z^ 59Ŏ }҃ d.Fyq<KHY@/8
_[U'bU0C߾Wv)F*G(fS:CG@\ 905WG{/;
.фcC8kQg_ae[H 28/\N%QX?娹`5CFx9z_Ky_kHN$j!ǬKx KnSo~b]},,;5tP3Ҟ\U<<*VQ|e6iY]|xr'7s	QK3s
!VV [E[ua웁_BY,@hG~wSgtD[O'Ҝ"*3*G
|nӴtUE 1l=zZc_U3ө&H.i̪矩J3,vFuMV߀#4#0mJʭ>%xxY ͝o;&t;a<S&J "ėRd~]uF".KXGh|8;6]O뎍\wgV4](hJW?({g)gN,޿zdnlwdSGz.<^!-Venk]Ab%vc~Yqk1_\7^Ą݁&TE'0@25.%éΣPiOnqwz>s)epM:`ݳ80*- Av~&Lp|
b)9:)Ra'H){{SVҲ;+yѻČzO!Y`+ܠ r-gWo_|G:Bo?q~%2Yגq3vΩ~
[ZvӕM>zTڂb,8q?(4zRެ(M1^+0x
x-%RX""EoFӐu-Ԯυo|ťm{
N?hUjՑl|Xc*ib\PӏYIS/]E_mv2ǻ-8wo|nbGQ%E<~b.h?oPU-&,9Jwޜq9aܭ)iip0ߪV?`߀Ee-{]{{exD^^A+nVY61 q)bդ>[!-k%
_-&	:<	Pei%Teў: XY%%Ob]	nݿW\Eҿz^._W;2NP0]<]`Y4ˉhC2.eC0ʌ`chKpX2N7BsZ/X*b"{Lӆ	A4!'Ĝ3k~mc&!*Qwq\Kxgnt[LaE	v1AkItl&ŕtUYPbRU8,	\aSs8A}~lW$C7E~0]'6|q1
V8vnHs@·ߎ% G'QwԟOfS?s>iw<5Wێ8"q&V_?<,aILG7ƔwТVM]W|ll[3hKw lwݽc?Qd"qI[)NN~<bZ!_.0ȉ/18u&'^rʲl-ƈUY/'_nnȎց泄FxH/36L웠܌'.{>j`d	8Q_/%~k	]1 d ɓFS)69SkI\'61|m1,X&8	߁ucI~I
os#Ɋj,=/>fivAtoZ*G"w)8ze%|X^Qܝ)Dz)Z$`}w*g:8cO膨?b#jڿz|*lU箪*	uCQxӷ'qXqlwSPsTR:p#5CuV*;]OQVl%w+yޛs８|J%[c<\*N1Ťu]"Ѐ70?wQGh~4S !?É֜ 2ՙ=P0h1zރ>e󜣧vPdT &׳^5KN͎Aae׹9UزbZxym
Rsζsi>jPڵxHOu$&HGhL SE^7՚!Kլsή8LoBDD/B21/ٽ3j/$;]C:ɯ,CSp #/奄ڔ|VU
Tpr*Pe۰dϝ᪇>VYt8:7##bB:u4L9,!Mo&50q]{~#zPG\sq86Y!i*ԅqq;H"YQӬ :Yr\KfFTB+F:t(l&u:k@3!bJ"џހ0Őo<؁/Gjw?~y>|
A2h斸)o4M#~e}).DK`xJ|=Sڡ7hmָIYUGyo88
\vKy	cC9a %gt5'H2rZNja/5!Gj*VAbtxߏèk5TKLtMyttf.j{ƬU54L0j69/U);N
eVUF(vn6ص\x:GJh]hssFŀL7x7<om
>S%;06fms8lSZШZ~WT=?KNxVI"I_MUq:Ah	Jێ`mRΡ!U=1SF5!Y$yV1+PXwp*Z35fd*#$6hjKޔ@KGsT˪Ti|z)eօAfsʖjpA5QX?lȐ0񽂬
yT*g)^%~h/[nwۦ!Z/q-=`b"x&Dm1ɾANjP<檘Tj+$yɣYg'y-Ћ|f cya:C'0/=uAVɵ(2Z=2EW*\	ly2~S1)@ I*
A$x{# 8Co`AٍB54Z]<T)p;IޅfSKcXJ.nVڊ84Cau}᫃]@eml7*u;%F:|E{_L'ZPvI6xL@(?	<ҨmP 0b`ok):(
ÐP"8g:xudA0UL̚sSŦN`Z-CKAHGewkP:__>"![sPU=Eaf	FS)c|!TYkY<,7Z9 2i,t2-.V@!B,	;U7#s gn"/ӂزeT: a7WPk{Tak+jZSZc촧WFٖݴ !!E*F-Hxࢀ*kЋu4|g۰eEBfD-EllKy$=ۤGUe*ĨJ6t5 LHF?;z"gDad17*Q~`5 #-c|y1VBTX΁mg4ޫ,-]X_lw~os$$9bh)I+H9)؜q>uA2+dq 89E XձiڸlL`<p;Mp=4>w#!4o.ԼXKwGW~7×]%2ǎAՐOnwӝm|r,YOsRruODGn4>|WݐOZc^PY/]r'kPzesHyc!egӲ%(r.UYEk#īa &(]i
E&HPL+l:.Sj=Q0p^RWHY#P^Rȓ@~lv<]Q[n܆CɁ9ρYMh7TE? 8ԗfC\?MI7fN&!4a 6ܤ'sWޅf+1/F[7d+Tl	4BD8*@R,BZy^s'|g펢.Dj:ƙ29ߺf:{:ʫߐfJ[CG*9ZB7kM%Z+LP
k34z)r0`lJUMM귑YlπMr{5T!`"ϊx'E^B?٨AU|k/
'A5J߱;}?QA4Ӱݮ5c~IË]SوZ0o39͉Yjg::}}pz'.}SE?#r?Oz?Che-&}rS Qdgv) cZi)K&$Ag9$4^@?9w` L-*
?Y]#	1ҋ91UqʓQj8*7pLΕ*ZN>ΰ_kɁȌ1EkA\oA)3OO
o	hlf&CZsiSs_eVb\B-eYrt_1a	a۝{hɺuZiW%H6j}d6[r۞>ʄJ=vf|&Wxi3;Zi]!cNeƥs\YcЅ8^ߢ!֫gUFuY/,XXMAfZ6Ҕp lUHAtc{Qa<%R)Oho썸?b"ՊQG573dہtH!I6M^~ѽF5>@Rm/Yc9WP1-4eiY:dh+dAZD*ɪ5gM0
*rX\0{Zu!HO(@S^&PJIXb~.Fږ]/knSHM1C\p1K: L8IfBU^fѽjz;B`L5 P,gb
q;<<,fa֞1ބ7i-j!i'H'cm:T. Cx:Uv5*rbG,j5T^\g|ќ@u^%?W G/
_,x;0DcHqA	+D>ZwWv	Nn
;3t|w>*3'SN} }F`֪ae0zEYQLfh5*.dLf6&xk0?;` |M'3&z*!_9w{ʂ:zAss̴іq钇rB 2+9y[S%!;$D^ψx\U)%H?,@5yVa[| qNm3,K:,y
{:Pԥt`IݙZ%Lq4}E:<G;3]pWdttA#cb&tޟD1Qb;Fw}]'$H*v?pOcR\IU6\GiCLʄh`x?a3K" G|`9YrSךŤ`gxRdxJFp#I/}ڗVbin2h1%{:L=KmϼT|M	%wo@Q"Ҫ	p4󌿔i+3SL
iQ
zIǼ79)"XZ&"L2UWYkeZhl|c&]hʾ 	*TsHx.(6_hOr-޼|Q'rKdw:N%ΓNg,	0=x3j@Xb5eWBa192֟B~pyҧ?.X,dAӵCCI~V	u7,m='/߬kߨR.Ѣt><? Fd$
I1fӞZE.Ǘ/8?;)uVN%+rȪРBc^qw &2,dyّ^Sp ӁdxFaWԊٔ\k1g5`#a-WLP/6"))3,40oaZ	5zu"?H
ٞixWB{Y|Wa?n(	4o&:-MUJFeJAwXX@1
T^&KDƐPR3xCٻESKi'nA@n9&Lsk&((;Ψ垁uޏ_ ٸJ}D c$!5unWt(3.qD/Nxld2JQX!)d]U6̡a[ā<U`~.K|YX1V2h6^Ib
dW-('8ˀAgL{5QCfCEؿgM \76Ip92u^fNeC2'A=re8tTD!Q棔.UBl l	vN|<ydOlj=	^>/gQ~u&Lw!~tv%E)dGs]x ysgثB]кl 0IdVgY_p4'u6_pG_hy+36_нffɃ탳ݣ?}7[A
m]`~޽`"d/ܗI9%kMkdWf7/~.up	̀w4-j1tCwNooh3/`5]Qtz9h8QyQoFH܈@/BeF>vm&]}3sO@АYh:OBѧh0#r쀄ќa/B
~:}߀)i3YivY]TgNNE"D5D@}`pMO>ǻ(>MaZ&ZZǉ0@{dsQfXu7]oh^#L_NM;迒u[/4str,rU#;"$ƻw'ޛi`.>m{p1af$X5^yvign'nAn!8}Nc<62} ڱMfzyIasړS[7Gr(^ΘQS̨jAûߍMu&h9<e.mSr!d8C?o:2sZwV(dd:7Fe0rKoQ6].'}S>-aW/ !SxZX'!zsC>87{۵Etq>TD T	li²VP/͡$6~0\upKť>(a)Jm#nWXi-R]	m|^0C
][Y<v%RQz^dmouyG>$|ڦ⊊XXJlj\ϕ۔SZ{D)>z?ʶ7]~Qc>m7yj7)4dj}0;G>|a	~v^#F|v{Ǭ݃o}XUD+3cŨ^96tj7~]gnƌ&ft%lS\̨8]-vi0O	u$y]6gKY-LH"n7%΃Γ'Oͳs^6|P
LM9,+jW=TӐ`Srjp6fS3CDvHz #M&dbi4vTyVbgugU
nN^
h`-%q!*lCFYګ#wWT<H)~eZ&@ ãuP!ب I301|O9
n5Z"#l"y Gl,ů:+w_[g_b^{?k(f(NYuDݎ>*o[Ywp,_ |puUe*qm|nRu~֮9?_|eY/5TB~Q%hw|}Ju}vQ}i|RmqqM5-MSAC<ȧRMO;+΍줅\*é^4nfwjÒ6@6^XB2͘bw:fHn%u"f졓'mۛ752pydp:lyl"o6zhUż`/jCU0gcI^{KU>b.WH>l[&Q^Tb}=fCNfS%8?[WQ{-9M6Hq_Άg
~t	v+!<1ک!7[c3ShT͎lG27Ṡ&@6QerHgק2x0m7q._zB`/YVr+kp+K(!%/72y)_>iM:v3,d[㦚_12cT!'6tol=NbmɃ9q~71Y7gUxwj7nQT%P`?fk)&M	 ]Ƕ_i3 #N拳fml,N8_Ǹ,).:WFUga-urSWt;(
7$<uD#YO\]!LEߑNXˤyF,=WJZVidmͤ`:7|,So}lb^>l}5qD^')>?ڭf~pa&)}ց6iJB3I*	@-KLX10:Mp1d2Šph{x{)vdmFtM4/ +(cMFEVT7_BUt\-3n?'\}㝝'qh5T{rΚl]6']ȊbX^Bl^W_l"<;Rt^AWom~+r:΋f7I[J6],}ˑ̂XBݶwcG:T!Jk϶7XSqdx(VCJ}LC'KG@#IsAs]j,{
;*ь#OBLų
7щr[ck:؁ńw-8~.O~t]~ UzsH3[?N@"Gt7K286}a{'ɣ-ԤL_܋E>G:.͖&LGۦ,=wR'j4+ɚlL5m>glV \_ָ5լ~{w{Uj6bTKMU!DmTW5Q[T?=A_4l#4('tSF)vdӟ\lQĂi҂cg956-n;*.YcHR$oc50MsJ|*kqi܄ -Fޒ|+dTLCwK _WJ6إGcVeppXj]xi2A+ΨC_I6eGQ	JCğ<yǈY<oe5vtu*b,%Ȧ4;x	⯛J1 bSMI)0awy7>b/GұUs㦅dƢ_X>SſeWm/˳K~_:%}
a='{" D2d!Kvz>S1
2??HSKΘ0=ǤqHd7C~;XXzaoM5<iA2#U	(!"F6|74#)5Nf3w] 姌#S 4_6:@%7dqA>M>łUﳩY:%r ܁_msȃbI$	ж"m;2ܝ=}2ou||`Jswl""ph'92PTLS}Z@E3R62â4|hah DF
Nj}(/7%MoR`pben~Ut,܇&Am#kir79~uPe9]O 񇱣΁,9A*[,:)xU/rE$p#&eƢEJ9v*Ŋ &tc$~-UvBQ;W䄈3X>=,*uN;;;#ƅ[<h%Uӧ)X!jxM{\ V+ڇ+DP2'~;"4O rS9f 2v!OГ򀖢m9*ىuUv}[i]g,լ*Fp [Ng퇏3ClM~c~,/!bH4+6X$^n#Oi^:@c WNf&g}cԌ_ãq|}x|x͂]'Gql\`Mx~E&R <d>^
ACzQG:N/wwALؼl
TZ38^M稌G_$I-$]<04"4
QnIP, ؑH`H|^&-vW@54l'^SfhlFWGs[P^Tgx k|GeHyG6fVw_v43bn S'͸Q(E6=`V 	Loooz$
%e=rXL}ȅ :ͽ޷IIM~}i۹~po$)1K*i,j#f|KP2r7tjaNdu <7?9<
?T?i`ow'nK#('0S7S1leY+Bh +b=Vʡ΅P}vX}4j0*=@A:Z78#RX	.KOCEda A*Zk$e~z.Q%ᶭx~?x6"$YnNp|U'1ѐ#Pr6e`B$Js qrYm!\EnAلRFhk:u[֘rĠv(QSc)ژ7"hZw :Z{)Gv߿rQ%TMJm[/2zV
@fL~v\'ޒL1x44Kf.D;U*e9! &ynll:}*pݧzt%-6b/oe˟{\8=U	kPPJ2՝r"iQ
j@Q̌@(&HV8\^A鄶TҀ |6hZ`,`&+:TY:<dnh{70ŋxp)C&]8O+30터o]$H3t	1ENfF^*
4t*(Ġvp`6, 4 v>QO/pC!q*̾+"UQfb-hNp`(\VyaD6;;E%ݮk}KrpXM.Zap7 5q606f`q\Z>{IsnXvXx1cN-&BfҍfБoבXOrs]ss3Չ5IiޫzBA\(tJ$%BhYجk0˄E$u>;-PF"]^Uv?ͤ6:/';nv޷䎡[ZzaW媎gToF.F`bb	/D-Y^g&f5X5`]Ml\NIqm[$[ڪ-Ls&ㆅ[?kV)s<D48LPET0T?H#xQL~ymgkTWwj]'nv젦vuC	r2nxᕖ+Ԓ_T^*%i]>|u'؟آ+{ckP[Ͷtik@\uջ]]pW1Rϳzk(g0`ZLv!TG0ؾͤlwo]&]rT[x@2W1>KCo$ qh_CNd.ڦ_te@wM'!v*aihNYy¥W(#,y")U9mč}ݤëws֏%M2}wf׬ -33{z*t+XfMyk%@`y F]~_N Vd|˶*7r*
0wŘf@WJp yexd=oSrRPIVHu6Th+UQӱ>Bd([oLB4HAī.Y.uLJlHRfƔzjL*rZ703BH@:*žT	@JZy>B7qAu$$5\./Zb&fgV?0hƾV=Q^
]eHwkz*dlG%WV_h;/d18D`>c](%*`@dƽV=$8α`OOc=\#&^?7S9iVTH^6~1JR4\$bLK:XL\ R%Ca\?c`fl"2;8T ٴ-VPf 3Xamڭkՠ/WlBؚYcD3#!&U82I|E0ϫ:Nӵ 5vo!	Hh6HK;"t?>6otZ1\/j!dD@8b#]GZ	qCyW@'AuTWZ"'-P@r9̗r(E_=^hn O"zJE[ռ!jUY=Z&aap|dJ$mJ%,^1t-f0  YN<;n,H0="3a$3JcXާ(x-^VqϘ?Q~>ta2#ZeUT<_E|{=y|F|[%Q=9L ;ˇK(.hOyV)>F\A#ؤv8,,Ȟ<ŖR/s/,)֡ީP(%$ʴd7S+LIiff`V0Li#]N'AWb5nX࿗a_yMeGY   9%08MNrzgO<ޞ^a5P_-3?~4(2Oexу͝G;JxH]yF"b!JLEIM{>OWahuvfKvu)FFѿo_+ץi]~d{>oZ_\x[lZŏsjz0fW-knSq< ZQ¯&E,7Ɵ!+qr`Lr憪o 2{HhFMw;m!o`|~^v?{>7*bp2"&zg.H1~v챁D'?RƖŹ1/f~ٰH{ýP&\&4VW͗dy'A0lCz.ΐhJ1T䃆k쵆_'*H-jubO]94V<,VA8A 4;~jm]L#"uzVRNH2~RcAw6Cpڦ;i`֝m<;|t]daVJE͍F
G1"ă.,<큍/ Iה$BA
2riEUW2g	m'	Kx[H:`W>OHN71wr(k#nC6G8_xм۾izNMJ1y"oo~C+7?WwuCh޹eyvJIPaRoA*eZ-\O~H7;ӑuXǻ~$ jk6#`{K|u<Gv0u-n|>FP~^,蹄umbg)Fj
{!0c"1R 9,0f4<*SI%>φP,A9,_C2 5' btȢD̮T^a N,D
EҖ~T8?Ad,mnTTB嶼<ՇRg$@)'wuD=F2vY`6B]88.M%Mq7Hy?9lRn'嶬t	[jPVGOe2:wbr~؞sy9]Dh,⁂teʛ/.IAӲ1X0Ipr4yྫྷʰ<[mǗmQ4n}+צQz}i_t>ߐ&8݁/?sܵs=,+tqbXq;Z}6o^x<d=N{mua]uo6uߑT}^/{gEAdd0=R BQ#{/}G4	{ȿTsaSfHR/U!DV)+eۚnZ~KgR/.תjd,#|q
a`궨gJg(Y/k_|{~Wb|H/xc{1T!pq*!z"G@WK&ؓ=,Y&+ ^Fv?yi2&]
Ov6=xJc1Xxt[(#AڌͲ^5
伧͞I$݊K+>_ X	U=U'r_˦h#g"/ BKU@S7m$$^iO
K<*\T8mI@U2DPL~*Oz8 S@KaJ5jhH#=QQLPb~:i$Avc]E-i-3a'|<L9zf??dJD=N%{&6\Bp͖ʎc/gbA[Kf39_J
ZMh}"?)(	L
G]Ĵ{}Mi5]F;aRa^ꥍ3elXiXłh$^㮾G6my:*6*Ry̢Cya	tdQRBB N759A]NtվSV"ɤY={|%"#Df_ؽ,;8GENY1)P
cUO5	򿧔X3G{k8Do_7;j<9XtAU>l;#M&G	buIA+yJ:ZɎkk+A3ޙas=<65i[%wSNNMm-\x"pBn[orhAllvfb3yũ*OW"Mdio.CBR*lUd%ƺ7:{  <?dV7 =؞*yG,1u<$S>;/fWUlɿ[W2")ab~9ȑ`*3QU ;Ǘj*4cHA_~Utb86A<U!v]E\f#H#(fL[T*H)c>D,Gί',7U65g0jE\ᳰS/$VVjgd6X9.~q%0&~=YeDF㷲ib]5݄ݫEqUOcr4ԢKh>?6"NBn>zR(ܐGtr5n/y]*wguR_a(ɀ7}Ai_f㋹VV*^S8+ut+UF1G(>Zn"w9='-yi8	Ca C7Z2+OQh0&ѥ3]Β?`mfDG?=SgJ32EKjLlU~}7La9?<蟽;3ջ](Wjø4^@ ב{5(Lqi6(.ǆT]-cdirۃ!x4ȯx?%1b莀Ǉ ݗXMa	MA'guaAaJ+HgJ@dŌg:[6 0%\ec`|H9Ϧ99dSnMi8|cv^+{\fcS@EQ#2}6%@85UpQg]*,+4pgqJg쒂v1G_rrpa7"AT9%-ѣƩS1>fv"Z`O2r"cP/!hү*P}k5D%ZW0A%	{Kʐ>gGNϷEeG~lZ+t/Jǚ=w2Mi2/lDj]dͷbޗ-ÐV[,t×>7#ؿʼ yzk;19j(!VYU&HTc,sl0b[Mo
w].{уOl>llwtRY]Gq@35PܧX9K4U,XPhl@_MOp3Ƃ7z{gO!eznQ0̀!,	ӥ͡InW*f(ze6؛,>ߴ(|h:}S^^$e//e#-33;KaZf&	5
k6bl2!Lxŗfc`H*q`,Ts~a8b
,w 8r)aW^0h)ۢ6CMʃ&ڐk5R߮@)k{Р':f
@D%{lW_70I@%)$\	:G8pw2ޝ?0n	4+3{C^ysK}}55cF(p-3-
@.̔nH/TWfZx^5\@,@f 8Ǥp]D|f-4Ȫ"u0;mA4Χ#KxNuҡ<"sPRs( i@>[m
MgIϰ>pCZ\ }J?J5wy8l\Rw(<Bu}cêl/ȅJ)v̮
nNJV^rT,@<fbOtIfvucBj?h}߾9A	=xs'f_lL05EpLB{7G
\7PP}Lgü3MV/G{>z|$|J NUԼS4;2ۊg#$w(@ev3TvB^HF; efb(9Pmf9J?RF93ǯ~rҘ4qP{E[EgWj'4-=Mux$gѽ޶*d"MT	|Tѫ;yI[t`58uXoYSl;kɩiOr^`$lWhRqVҐa6t<>F\goMF|gSH<?dBpC\Duy/{#<Lby_k6W(_{9SσoNkbPnUpaK1GCO<gV*cյs'W#T}#t=N{k.f4h1}7KI#ĆnSs> :2(P0iW
*C|1x7h nP8rR=LPiy$l
vng^~$Z)+[NP e?Wj\;^DƆWKg7GS4gCST:=T8L""=G*=+rViu
<8RM~VL1NrJ@o2@$P_MgˬE%;>s܆&CIGPMmzwCOl1AЏz_6z^XCNs~_Iw}͢zfgXXcʖX#؂=6	k'RTR%K	%{3t٪S8flvRZn*w%`Bm$90RNZ`j8#k7p@;)Um;@0E%eK3C8\
fWָUP=d<o71N!58<ϰg]f٨ Aeޅ҆7,;wg%t_ WUMrXE*n}2lu2nRS͹tT%B@Wc͓.|^q+WwMؗeaܑ(A	ȷ /Hۖv!'X@ɧb>*ȬdNv]'>#5`/U:b1l1BasY` lCr<P~f+1؄=WiDsT7*09ʻo/e:]	R F@PK/T8|fc\bkÝcE܎Wd
^p4fF27ݘs)J0]$4 dҹ@KGHY~ֈ<yĂ`6GIcI1Mqpn<alE~T0~ocyXb{դJauaX|UB72Y!jD6Cb*S|KtƐ{a:zwepY]$"Z#Ǖ(<tn0{cM
}U᭜%8	6i6ˎq ] P+<PzIㅂP\U]Y@hwmMOՅ3fDBNƈuO\-°8cdq")>禈{xqXӭFPM%sH9'*;YPF:B]ZMM Lt:#-0SuS=X##ER{L6LBm%V*$*gXS>=;lϼo	/nlb{t]Xˆf2LxU;?*.jU'n{wQ~Ilugl qio"*ʳ֐EyeZ0oY؇CLԈKiݤPN'K:`U >)>x>Au;c-Ã}JckC E/W1:Nb=ck uoODlo*|?dq*
!	&(?	N۸	3'N_u@9Yxtr³d##
^tmX]S#t^6x}z]_FVw:ՆO"D43QN-Яk0!6ynAɋ.vd%nYT)j
oUI{ϫ%ƈ[.sw]:gU[T_4R9QnQ"ىB9p"6r/_rU
Sr߮/EX<qtrb8$2ULܒcP5pR`Aqnc0Um4YeҙA:1dtp]ʉ7eey*b5=/RRLrTV-,,0C$
eJgY"ct6}Mw^B_sŞH6-cVwL3̤zr~*t訸~8ۜǜMH@,jǯ2tzvOWK̰+*j&TTKmA!8}d0́sx&֑h7um4Bh7b N
fO~N|hyo~1*Sfۤ# fS;T{;5}l77_|#VoYMajGcҿLɨ`33w08BaK\Jy:QL&P0f'}lHݒD8
{	s1p &
(ܹE|rzp#f9<tРUय#el4{O6|eI̙oR"x-a!ĳ#$1BeiV0wR {3v`^15coƅe
;Zb0i<E	s3hK9 F)@CLK3JטM]iI냣MZH<ܢQ*dVɳO4mjVj13dV ).Tg؍@I}?bUw=|QL|~>0
p5>I^a7vsl<@Yc2nin?2kQ*T-w[¬iW @73<?4[(Z2ykMcm~mަ.am=$f=:/Bҋߞ,vi"`Ak6LL~\4^cݩyF7F&[P͑uTxظ"f^QKzFRDG0߁|rzۦ؍cG-Iq3r^10Np`bE^N3;[{~.;g6-tIޤ`"dY,ޜwB"eyydÝ|dg{Gۏ<;m]lo>~~Ƀ?hw}ΣǱʶNMmwOtlw}dfa4J{I;ǨFrst]Eak-q=#j`)sdsa_bJ	osdG??ׁ3g:L	7[O418K\BQ,-d&MSr҆}ج.5v>cHE#d]h>]Iوe+9#l"3kp0JaY+<{)}Nrȿvv;Е4f_</.WhK ,#,
GU-A"5g|4l.LƩ2{Pk_m_	z7)tI/P-aj%瀜Pbz͉}]{W+N mѐso$4Q.)MԲQ^C'Ǜp~|X"=fw؞?G7Xs,*e%>~jokۮintWKĴ=_9.!ͳi:̡g@wt/"׼9-al4ovO2^K݇
Φ5m=G	MȘ	)*AY_.Ƕ"Fh-Cv`#XNtǣEADnK6su/lp?~ϲ~Ytm`kjwޯVoSVOƏDmvJ%۷$י}8]k\2f䨸Q̫BCDC>1y)JlnUVs`K6;StARU5U_s.f¿J+#>K4ƌܭ	sR2r4qIݑFw96M.ҭsU[\37s@Ch,n:-DU	v7N)@ZfbkcҝgZA1r^Cf<whk=̻&%K.UusI҅>+"!ϼ@0Ivqr[ɄҮe\_0Q<lQZ!248 5{.?9==>w|;$
~Pi
]aK6@gٸٴvÃ>h&0A%_SHњO5f dWS]f֘(*=[:4#k`䋠P*PP6㒶vsaE]/|{w}tw*=t34l0<t6yӱx&v޼?{OJkOx-[vVwցfIUA&^%/y
]"/c#^k˻CUQ[3uuEG^O(FqqQfFm8|oOGVTeaKOmo}KG
C;__z{8,~QW(R7\׆As.
 Z:&X7׏zj8&6!'Z@	nQ\oKzG}^UϡH+VV|w~Qpl=__CLOЦ	\e,kK9d[x ý6\H;mi+Ra|ƀ/V% \,ۋJ$t\t+/ʪĖ<*e3FPuŠHGY	vն^:bu]uWύT%]yW3nt'^8S]!Hfs~X9F6-MsosQq
znMle?,-2[ܜ |fU6]=fn(½J#W-{a7o;vzFӳ&/WMc{n$Rz疥1(K/m[ g(>\VXe
39cI}Y0J:y(R-y;<3Ut$89զFRr	lUZo[z@ŻIi.F(v+
=?Ԍr]H=;_S-U[ދrN3ùb6IMI7kSMZb?~l%uEWO߸&|T#+J_')jJۯ㠴R#~3[}7p`)IZ~iXyLSU%=U9Yt]]KoG7_evSL"m)%VzօJua)7(}]pNE(}{piY\AitqY+.-]5tḫÆӅmWӅcV:k鲞GJz)oEx+^b#㭸Rx+K+ʫYdnӅ]`^G֒*_xiGh'1ODvjGNK	2M	!;ؾġDzc:U4~S>Ob/eu(q}L(c}ЦV'!j]k6 զI1%W3&IJP^IagŞr$Οkg'%mc؄/O[In=2IRL<1N  }3ñs9MGxپיv6^Qn5|h崭jՅ|pje߇m\`M{#6!Y!x@-W{i}g[y3B`2<yƐ'S^Fd!(LGSrЩP7s1OErYCt7c	)79!5_1Ɂkyaˤh2,~ĔqF`ׄK>E?kڂk4$ʘN~?@^
CPfobuL&t&	=s,i89"}[>u:EzmWGׇg??=,qvdS20O贶Yʍ
LK9%EHHp1J?>1V.m_`"M۾-rHc^ V↋܇ǽC;|3z/6G$ eu1ܦq2OI^-QW@.0rmy+$-:Bl=KgS3\_3нd\uo+hVکFr*~v]9ll̥yGR7Ä!.0!@EkA@[e,BI+Erbp+ղ!F6sG89nV*'s<Zj+ZАD]I+aq5UZfl*okXLU`KZ=95X 3%+i\WVd8M?Wo}8'|eŴ	d9ZFM#cHiÏ,pNyClKuH6T;KJ5<-[t^CQ63!5>)p>w$͐?J^[~Cʴ|AWR\a4{ЌF㇉ouȊ'x\CaWhHS:_&O,	0 ~ܓ4=Iʝ]ix))I9'U	nq-jT]HM9UM`'}^ڏ.W.d|j"9EěR]zTkʹisjLW>PSD`dÇczvWj1}KC"A)WW?sE6%5.$׋w b|nj?53ݷŌaAk53б[$ļ7GvHA#3iYR~MI *Q\Qۃ.L0b6s,F¦}s3v}]N^jVM2jyG'.FV(AJqFBL/1)[W;W!c8/)qwCYD`gOil_S4Yuģcc>|~AUoFp!TKKkΘ-I	c76Й
w)ټnTH;J5ū~7v  TZ4ucma.8ɰfY	yr[J(*sny[68>5',#	 >cլY` 0pZL&4""qߙm^w/RsIHbb/:#N5.5a؇}jXnGʹetł%9Jj%ŷB:߰vlEw
oYADa}VW>8L~(1I([Sz -[;BpOr9V	`"SNu5iQ^uY6C:hh&iF#Os'Wp+h4NBtqƛ-7)2lAp̽>ڞiPܽE=?(ZT
GU;ŭdJeuo|A=b	A7iA魹]Իc9]޿IaûEÅRM)J>r$N#5["oIJ Vq#S&w V?oŔ4nOe݆$nVב;|-_cJ~|#JŐtVW]_fhǋ;R"6 Dc9xwwHt*zijtXQ{ZsIYʚ*%'VAZ)8Q_sK/uрFi`m#>Ң/!K'=:5 s]Rskf\)]Ei(s_slE(ԥF*pDM`	r$%c1W|)!"(-KncU66"gJ!+W\FbQ< 0ݯ;UUTԏ2a.#
"r34qh$Gy@)miU3,Q^;M"bZVk(KC6K9ˊmS$[w^>꥞q[OzD|E.oGڹHXǶPE
)B:MLu=Dzi90z&@%)::zßD+ڎFTz%{`-A~ >% .*N.@	0@dPfcrl8eLm2m"Pz]KuotV{EY̛^=hX>Q:!1Zޝ>MWwB\XyޤGb՝a/˸FJg?1OJw.R_sy's)FzcX+hmm/\+e+.
IARB"4`יOAJηeNp)0wxJ~]f	W)LR<ixLPS;tlqI̍oSD@i!Ed8G1@VWkI CߚEQ|Q^,i80Z	xK!ValpMN}ͧꇽ-9hey q\Gw;ޔVH (@*!vO8v0;wiv˵܍$Oi~7pBE_սKl0JYiE/Aѩ[s_tn |(aBWTbL]Pe5hFx>^tĩLHf	 흿|~:<l˶#	qhܜ9yHQGW< >v%ۅ͜Fzm~IQs'ئ^>Hɢj P;0Ig\q]$UIٍ5LvYрoX]9Φ[	_2Ea~_"Ҹ7MIuy[{,ʧg/8tMG(R,+g[Fbo(v}|LGΤT}peWZW{*_Zґ)["B%#HHU-yKKcuKepo+]VeE%9)1UPJI@{qZon-vQ¤8xeEXOeܻLm>w]Ͷ`HGSuQ-[%_@IQ-zϴͰl% t'o	nZ` `KnYS˯	r0K#ʡ'92gl>YHL+ <koWE-/79mA`\\]MpzxoRn~&<<Ļo$wfޣu5
5Zf|FoԵMI;!X&ҧb	Ӌb
7%AOTl&On! ޙ{yJ'0֍~9-<3{ihKF}Y/NUÒ52UkqΡ9$4 3ªGTG pgs[T<<f(4fS΄G;YߠMS U 4u&hS!Ah2Fv%=;M^A6Rl<?HzTjy6W88wvA:V1VSNABpnGk0RŅ22>v;ohRK=t(ɊfMDBoyĕH\P֕st+֦f}VߗtMWtmNW9{c]7*GUϊpAaAM:x oEaeʶ|<P}jѹ19M}}hqV)7b5ZڏͯZ@'y&D"BFŞU
%%C`:@kԬŐqnC0W1(*.PIHn݄hM*h~8S,	<y|gé>p#۝O5{~C4z'H!m }Wh!y6]26p@܅DIP	{^RBr߹{7V??CTb2>fȻ|cDY3.9a+MD)IIu..lJfRp7K;],F%]?)`.<o,M!PeI#8ݬ@rk++mĻ$<Erؿ1g;+b땋n00U87J]?PjX :l<Ci&f%Go^}ؿO\ʶkgBԦdR8!H<-N*5Zi~c]h@CDƸ^SECզه"&yЭSGV+4f^^BgH[{~FstfLi
̤YjFc l(1F~n.m9[!enο=y=rnaiLUW4}q41SnE{M`d=g z\'fNjoܳo@έtjZ<em**g;G}Ǧ5^ZNBVz+*5B^7!dkT 7[^F8o>tk8%ڢKzq ;f]`pE#WؾUKC`]D|c7ߛF\-7tha1'T)Wu1+*wkyðg:qS,QS_È>>9ϘgͨX^b&ƤZ22mQ,Yl'4]5i4:2S,^^ݿy~{/ҦK*^VpaT'ǻ7o_!f.*KIu״?I%fIĈ*@W#{γ~uM;-_Gu MoÃ#,l55$	SKpJǋ)=ku
z!W2-w%vI*&J]{~A׽B/C
C(:,kP劷3m˖Թ?X!
9'lp{6e4Ǩ[9bs)2js^`֬邹ED&m>6
X̡hcvP2*VT2	/tsQWBhKDTݤ4t,Mj2x!ѡ6rU*wZp
yIT$F!Cח;Y(Ox-#(vk!itRj8Ҫ~^q+:n&%5 c\7ڕ{-cƑTу0BcMؿL%x.^aua6T"Ϝ ٫.bejL``s
ڠYS\K/V3DCzY5j[}1-q0ٕm^WcbsIXR:#Q!'2EH
K+֖g(y:!<v2 T#Rq@b	?w@96S۴\(aUAkpqiX&`J	CŜbNߘx^:}ZSVkw޽<,Dh֔J/.xh8|֙hKtHl)&^)5b}L+>f|jcwԎv+ij[ѩZ
DBfdZ(|7gJM\=ѣKΐ3]}g
S9G1~JK r\glݛ&W7<{Wf7\>oBtq=7vL@خ$uCfkB4ׂ~E즂xL"?"AB拜PF``)SɃ'f;苴IL^Gx/QkX;6FH01P3s1S|*.0s&㪭uaw?O2lW^/k*?>p= JߔkpQ!{
b_n
Wһ^Mu~H_T#u^MuH_T"ɫiz5mǼNG٤_wtp ! [i`7`@)aѩRK5*4oWMW{=ʍ1& ցcP^e)
B-t
WH!c%.PyvW:E	_Qһ*|X[,p}wxbNb |?'fk yqP}׈q|l2{Oo_JWfN ?h)|勲#YZr'ZLJ 6)\.⾱
gߧ1(I597▣\t^˅`v2 E4hęȜ1$ϝեt9kw??0^}Ż d^W_IV:]cbMR<.oq-
Q؏mr(>Eţ'Q1ڿ4puC e<8L#eDدϺت,PDliCyYzEĎEjW`U[E%UM6S㳔é* oQT:4c{ *GH(u/XBh:O[Pe>EВRrix߃jٯBEL>/Ň\+:|v5hS6_  |m9b5'ٯAn(䓷$0l:ãӆ&vSzy{O@ a4%ni$)Uѻ=[n5lДoibs+֑ZP+]f8,C|=02<F Q?2U/h6rdŷ2F6l!hyL^{{	3!<V'w*M1xޖmvҞP8^ 1⅄OԀlI:I FSB,{[HhUW*=堫XHOs%{Ze_!=ڪJgU\9̼L1Y*4g+uv]f]-QiP	C5@ww=DNT&!(
ah6YtkĐbi$íHvD
eThޜ9oaYdlqb*cklwTVBlө20VǌBEҿ =ol߇2GI3cD,-H#eٸgj|xM}ɥ ہ1=HTW&Z&FӢd
MR-mFgzبZKN[a>n'Wfw'X
PCCdw3<8OC:؁϶׷>v1C{(Bl$Ԃ>"U7cP~TBQJ֠MR^a|nZOZ˯I@9PVC+D׍!ssLVp<A3Rz`	%lQ5jТ9^RX:R22/GwLJoΛ{DF).-ߍ	fb o=L9D΀bxףdX71h1\/s(s|M1Ѓ|RN *7"Wj>8lCh@LҩY9$1C.W(W5<3ա]i3s6.3(N64tfj~e|<c-NIHJ,`^Д切+`{l_McP,!4xΚ=323Eu%+AA@x|fgZXNE $eulQm!<<Ʉ>{R̅L7g.6|kjT!qwM&@@(7Sb`СytxLY9i!\c/R"_|}dU%9H@)"@M^BfKhԱ]"DFp?O8@E4)4$6~^NL\g%[#2Ӱ.w%Y0вI8Q:F';+cҬQ^qqM7AvQ|̗e79c_jc#r04	1^Cu+3s)XGפS`sհ| rS ~od<f`Nִi8Cvfb^wg#n!g(|ZK޼A-|IyUӢ
I8̣,D=
Sb'ұߛO薥n*|т9@,o	G[q*xd D`s/2%)*Yo_(9ltNQҢɦw
&y k9O*,uLC{XP4v.	8t64\\GxN2+W@XC^sAŋcTBFDm҃T5,zJ#etK <'a3sdW>x
(/Hg$e2SwYE\'̥+gI piT6 US6fm\Covl6[ϢwƗh0T1>@bzF@
r,
&faXQFj.N"tu@op[ݎs<"zrqh[*9ZXDip̢T	S+=-|eaCXx5&Vكiq~Maz9~ج _DsRPKɌvk:CFюWĝ/+Z3Th}Nǋ5;rZAL ^ƅgP)~^Ij	2.513|GzAf#5yCd20x/#)\fu[ml$>VIM?k-~㢄ۼ<f F֑PmT87P >(q-;M2+KToEVF,T.h9Qݮamyh_6VC'VC'RXb<۠
-wDN)i>C5dSttŊˬKm撟"㪀+%g]*

	ζ!}n8stYtfљPJQMt{[s@0*@y	yP7-e:w}rÅ(IF׳WiU'MD믙 x|ԙA5sY\"@LVr>.S2 m`
.tZaھԙ8
\f`#mA6,^(Z03||;zU}m
1N1s<Ab c^KJIvB#q[yg PRg#tf>ޕHY\@k|Ph*?QJF"yJ=+T"Lr?5Ln6%"@|Q2A»biJz,w{&Cfӂr!+cA	Px
qsdİJ.},r6[Auz:1@Y6m[.73xD%_ܙ 0Day[ 8%/ȝnۖ.-TT[n(*j\Q)JZzm&8Xڙ*fKeceUH3HE6pa>9W>fy mY4e=K۵.ށJ̀R8]ھJDwŧT;~Sͷb#1.../9 87	ϩOthF;%]nnn}0N]~V=&>|16@	- ?C3ZdԺ/0QJIWz23>^}LׄMSηc@*)L.wF/WԑuX5!_0|0ڟfŒKޜ{]ߊp0GWW2\
fQ@0zdI*2|HaJW,qݹ8-a-T6;FsW1?_|!fԣ7gwgt萫sqfܸ(a)j5{_(dcj&;8K9Ap3h۳.ܖtv@>z?zw6 7m*(N֠]o![fD΋a:%
}n+o:7!`NB
f'r P|{H]ru׆	GSg1ͫ'(NtݚPf'^et/aH -,
Jj^X5>gFm U8oUXq.f%םPnw@d/sc ߛ|LY%q5Y5(5X%ɒ!f4gLize.Ӱ6}2#Y\!&hV\f Y`$?ó}<Ҥ0$\AaӪD*bվq"OUG
T2㬮r@d#}@;YIETGB@\'b]E>_"/e^+
ȼ9JVC/+ǎ-r,ӾE~tgD]"8)8(Pupjgs<V	{<ċl\Qa9]nP Xo<q+qh*0Tch- w/jCyȢ J3 Xht%_f	R X|Ićquubh
.[Y'ƴ(VOZ");LKG17<88)h6\Z6 I-𶉞(FJ<O1^ 5}Uf4<e%'uy3uCL0gTXU33h\@@H֏jxiZ!$? ȋ03)"Y)s52Hyl.IoQ
&|ef>_w3Z-F	l*e{6c&RZW$+nNƁ(W|,lx4	Ғ#/>DpE!`zǜsșmSO0iJwe75515 G@o"i-HcG򿡱+KMM3i4_t gi|gyܼo6~ك'vy)25T3V<LWschuZ5"I:gz=.Kc⼸'e| :I]o΢.V\
,^ȤZj*ͤKtFY.i$T̋=EjJff^vA[*1e=gJ@!"rU\6zafCC$%긓mg.NdZ&m}U]<[2$ڽ]8#J,9o'٫ZQDP#t!}=vKɶh.5z
-I#}F(CxC>%40Dbi3SɁ3o=~8tA.Q{:24}bƬl^U,L5لY͞P5BO^;FQvWw&w(V[SSyw X'::';0]_Ϗi9ߧ38=~AfI߷zVLr_z:oyŚm|)4:ɠ*4JpWpkռݔ6jyT>S̹4ls8J:),Xx]Ii
.LMj|ik׺h) xWXҔ󶭹28j09_թW@6͔7*%)~z`rV]!.4s'keq*8).kKj
m'{#⍔jDL_-ɣzU46Cdb wiR?x5(!Ѥɕ,Ǉcil>x3ġ̟[@$Fk^@ljR`u?/zdBƯhHӇ!4
UqV9:hYeWڷׯ'Ca2@6ASQ[<tTJ-zJN6c"J{1L
kƒf1."mWSew+Ǫb4+ak39p,l*6
	k#1k	)1"u65E?U)f[]`D0V'?Q.v1LԐɹmF;
SGZcezߋ6xٕpK:wAtʘU6ҵ5~gK:B_60K!m~*eTكl|ia?槩X9BN0 >^TmRp:1  4՛	s"r<Ba!U֫*׺{~Kb@}VYq/~?17iqo߀z3+U32/CrY9EswV+XŇ 73Dnu%\o%;4`ۈ[iBgeyMY}"<&ZK5]Ѯ.=8dӏvx	B@O*PҜX=Qx5KqFBX7l;YM[i
K]Jf֭Ku?" X_ژ;Ut8d_OQbtqdY2,#`=/O]@YMwOW ?ɸeF^5yyf,ʌkdDd/v?pu<HzQtl>*ʟ24(Dn5=`f7*stO U:=WtPYm?
-,ShOM8VCyP#jH"sqyթ"w^!᪚@1c-?Pw]
\P8z:V33AHjfZ6`[UөTXhX06%F{{s +I,r6ѭƣT!F$|!vy7ZL E (>;NVPxiք1a;~2(	85}rn	|ү-n
v,s@E#'>}x_pZk_D["ͿZ%99Q_-DEJP<V2tg&vVl~cOऌα@/ ?JS\IyUadj[,[
C0@I'BԨ
U}"O`|bzy]ߴӱS4f:JLionJ̪j,H,F'^Z̦:rGq*Mqzx24\@J)U˚v߼EB'%
,?Q,9;@k* SSA~hW>ֲȌ.#8oglL@;Ƶ,\Mf+M}ԡ QSިf+vhvjw15?;>7ݻm&%D<v4Z*Y=}&)Iq j)_'r1`8P1nʥt T&w3yv3s5%B9ܨFA:ҴuA=be3~Em6*|ZUK}&#15BP6<p2#B	/O7ޕ6kD:4c}Α\W\~}H+FQqWwPFT̼l,Ywiltcb4y9r)4F"\ .XoN{6
E縐;!\%p'EFi<wEŋײj:&nv-RpY3pIpM.bɒ60vnb-i>?!.x1=P(  6]$}@h/<BI&/HSYo!Bxa03(&d$E1# | "#pB|l`銶,4N!3 a
Hs tHKs)}VJ(Ycjʚ5a0!/ى-y5	/{ϖvjN~РLE&Dφ{Իh*yx\ clXa7G:@xNWAQk50:E>O0А7ɋwdb%2T)%_f'k߬}wiP9h:ݾYM*[lP'EBz,/)עs/e]Ph6ѝrbF̼9)/'*Z`:cZlpt5.F1$B[fKyCDg}Q}ZvZ&x=S΅ʱYr%]NN݂sAzϳ~qckJ+Ce='~8BNc_	 ЧY^tdVXj9X_RMG,tĤ]C@F̃@]YςUʾum4*ދueSv~1<jrOEZ)խZlkr3ݭ98є]o;y%8bh"7~?Yvrdpᆎ+^vRv..4H%G	I86K8F;Q~IѴ
,59䆮uumEws9@ԡ?:;Vb$WJ2z_/0Z(g@Mk-\WB`9oZϵ
]] #&` O͆K"Š68|n	Qm(,Z[Bč2#}P!O)jP0G''wd!y#aqUbry9tE&
a7tF0'e$വm9Lj\4Vu[XR)څM9@y)=mI϶,EWog?mỷ'j{xr^np79Nj'<#E.,I:LR.	`މd3PyK?B
^`|_5@& IǾN#敘6ĮA:
ĵt2uhMh
GWD5u=W-yݲdCRv|,UD\2[<3M)>q6sm492)/!M/]pY3~' N6xş[	SNPЄ94=`nCe:򓲂>17\^ݛd.$mv5uuˆ7{pEakr{-@=lw^b'|û>XUwz9F[{{̰jr5N^Eix#E\mnof@V6ij0UW~5DE~c~~}"Xwtuy%`8)ŨyvbZd`mmj5(G,^h	#M
@-/k>o8X;6թ$q-7h)hD	G/pa82̙a;;KW@Ĝ~jg-ɞ`M
KI(Tqpy5nBrMp`nK-z*Sbh![VPʨ e٥fx|9\X>*0iUPFeѢA@|Saџ`Nv$ <@	sJPB)A^TFѼܭaRTFVq<L h|4~@ǞMfdC}gRCy	}!T,5n,mCl)QP庶}:sCT8QutbQHl$}B'VD̒"]?7EqC Q2ͦD'VÁ,Y&yVoTA^~cآsP{/gls$4д<Ԗrp.Әǒ+2U}8_=^I'|/+,M=up!2wxvϠqbr4*
}(LG0x*֤;	kT5V.ZŎ_ݯ55<MÈ Jc.mkIؙ6G$:h۩&l7 V}hn}L%ULHS?yLNCy]BЮ56_IZ> vJ_?Wʄ¤7"M)hE+c*m_݌qSK bln2@?<lq)ks-CM3^n-:64 .LDpM9O`SܽEFh\p(x!+$cF~ Ґ0^mXw#Ւ,U;
ѡd"_J)(_g羲(jLhd晡9Aesbl3ڢ,08H\uN]&hA
+wɖx?#Jޓ-(Pnaܝ65`<ͻY}49n>H`s4vkx7܄¿FZ˅Mbt^^l'舃w %/ߎ]@tteެu\K!*29ߛgϦyi&)PF*t ~/@g/ɝ'ζvz`w8!4_: nbEn8<ᜀq90W 6π(/pL8axT0ʟOϷmpL,::cůЀ/sݻ3mE65KD/2XH6XNrD8Oi~ańwRW6!`	F b`~hXx#)Xki؜qV?1EhjU;gqQ/q 䉨þzE3t_#[ámIʹVYoګx}"S*ye
MnҧtSdj!P5$w:7oXn0]MǜkZnjK2ػ`-%OҢ9;eg
NUZùmͪ lܱEk:<:m_;g2ȧXX0~Rc3@7`ջZZ(\go(UuCC_ňV>83֨uI`xMK}_]ҡON=Jg:q˒=nK-SV`+7t%,kR aCn8Hq6n4jŒC\%Kxm%:AE~V903oD2 ms57ێaN"}4:%4`)x!kmpuCL
km?&vD+6Gw `m S6"(ͼ肰CSdJ=`dt2^Ɔ)D4>XIm3m
+>+f-1hʧ[v4@\2hO+3#9.7%=`dE
ggB9sƐ&vm oT[]=Mg,v궓B $ɶk?f_n<ң ]{bj9i,$"V7A;B ^ Ai U+;߼VWUۇfoſT{\OܧBE4{]hpdJY38dX8G8:׀
-cDy|ADrP|Hʛy:jbq<Mӽ.JtW+Sﷶ߽{AEv[Hҽt	,MǚJ{Pp$;P#*xTBM\uSNhq5ap䃆$48Cނ"}oӭ(]@O2+rKH^T;==JhXyph0Δ`rQ>j:sfLT1.Addmҥ126*\)^SW1=	0%h!Em kF-#\uK𖜧B3,Aҩ&3;~;^fbBxbM1n	H|ׯ7~Oڦl'a
d˪:}KB+< :MfVyCRrޝNoVo&4YK?~B~ɱ2?Xn&"ØgIpxC2΅f.ǜFr&6.|VEm^37k/Ӽ{X^}Y4=rm_=i.JBm,$)xi2S>M;H.}(;kyͤlB"`!Q/4o<L	~Iϟ8s"Yj퇇jwVX;Ƥ[^o<;q!C_L1ܹg2]RIvH]HW$B+8x[ܘE?=AiؓcϘc`{^ \fG¯=\WNꎵxe0!GKI׺˄p/xBqD*?eC+~qerԬbϲ{;í3{2!2gNki:(ͬEM2V04O`t~Fw9۽2oTP1ˠ˒))&,1ba&2[$C%n
QLr6wǂA3ɯZ\CgtB9t f0G{{gGF<}נbyg0*3*fC>cV;J㊭b'm9Qغ-Fv'Mm}TDE(MP(NM۞?{ng榦m_+jya}7ZoTO&z8Rl߈Wp5۶l[.ˏ8DQā6=km: j`4~E+Nvt`qz0{'npёoMK/t ubԜ-ll1uf!{(o#AO.xC?^w/x<^kϜJ<-{H>K|Y_$ʯ%FDaa1*wha&28ׇ 	yzsֈql?: 2 a7t#w񤠭"q'Gv,*zcBVz{-s<LA!9Mk(4Vۓ#(n%>-uvhpg,n d05Jn Y{.x0
)֘]u>8K7@fHQ`$ 	Zq bl}4v.UhH1ZHW,=xH'j2yOuorYlA$k2C]T19M+ؽ,Ծ)1rbKHitF낍4G5t_ÛޙRWYq32og|pPt>Kyf/&F@g	f9`łVw*I "1`=t#E]䅣c#ncH5'7/8Z>OZ
 I;fkvaU*o3(=9	=/⚭\T۲:o:ڎ
	Kk."]b(Pb+ke1>RQ@;NSVq]0w0a4H8[t!^p\$ˡfS	neUwYvÚ?YURpf\dLd&ǆ2wO, tԯ+++	T814P]Pz&AԹ+>In$G,Ȱ%Zr]zŠj+)^ntym32d!$7XTS:Itɝ-{"];2bx~K2xKGf N-D.9h.R2irSMX&SV#  ԍn'V,,d<c,BSp*jTwxMlkv $uXto;N(xd	$D6>iỏQ^	F/վ#}Wkgd4?ϻЧ\ϘcӺJ24f$F"9mzñzU8 /{|~3>yt>]- 322;@[~qBIs%Q9}s/ߝ;NvvOwj{xK$Ğ9#02r1.G4G4P
4i DDA'O^7ᰒ#]q0#<nK:m/a\m4v0-*Kgx-I;3}Cy.JB@3ߖNrRA9`_8(9IS^tg8C6zj]#&+<l4wHqO(N1vJcgcOT7,C
 V؃-mV+xS"Oٷٖ~r54>z	>ӑ]D]-JVZBڜ|<K/g?3 L,u49'b#^/uݣ=Q>i BwJGr|{Y>J?OE/=`V(+NaE@vg5;_׀M#18o:D85 bpKk,	+GPMիֽeY'Ѳs?5+mbe#Ɨ[lBi 'o?se WϘMfyGkp7X'YFswjC?&SRe^r^A	L_:ߓ8rṲX;-
NqC4U~%LF2F}tm3N*>ʢkyjj5:R5-WS
þ9+2|nQ$p2i@7F@SJF~
s-YmA)5CBJruGcD)őS]R.Cy{:viFx^=U9AGG	Gm $3EWaf	["]lRx_}{.)^ClTqW*V2f!=2{K*ƆcaUN	>6lqg/@mɸ+ܩE\V3UhyG zs.(+"G=9}<_`F,"Jf07RKo,ɀ.c/CqZ:΍*K>L`[bG^1fI,C(G<<>l%SOz[G9Q:ϬL8Cх/]Ve7$Y6W_A)L`"˛dQ!	Qۆn*mt9S$|7 * AZ|5DүgpX<wTvf$x@͑õ6ՕEVAsR\gMeZ'$A*)8t&=bmrD@<ɗh=ɫi_换EpfQ"
r MWE)GzqXAa|βxk~jSvR7GNGh5wm^@5Um>X Q&^
	b3wl^n/8=aϴȌts99CQa@-13=#5lk%`D
ڨrw?!X Fr8V[]]xC;_ڑ.խZ0ȾR/it6RYÖ@̢3索8sFGj SW4'暊r |_#̂m!s;\bnIfo+}=HX^y	#/ojZvoB4VCc.D-g?؁tiȑc34䛧ޑOu([uϐ~Vuha?
SJ~laj;2ǛݳC8wEv6.1$*[[[5?k!V8 2_z|o`~s9Hq]eYlnv2[8[j9?퉗y?.tbBMUQA░XjڝWG `<]h?_)l^g}}&6ʰ|'<ڠ-'GSVNʾhЧH2.ြL$Q{r~t|5{\ƾR,'q-Y	rŭB周_%'H.d˯{F6xgrMf'Mh ;nl,D{dyco	c!B%fXf
[v 82O64P}#Pd3c UjAe	Cm1uY/S	{ZeHgڣ)0?TXx<2<붉@
R0l eM6&_>!.XuFj_{keO9%^FLCTp^J	Xn}]v>91
7K[m8'~.d%FI XA*vFSq^[<
i$pԤxV#EdX gW$KRsL&H7hI?+,1X)׋tqs֎}JC_~ɮ+hW>ilC%G OH}_-8^e]U~uR2mCU8M//lZ pi1uKx/AqL`lp|؎ɖ<\8x<yd0	4]%7ЃWxxuwOLT8i,)6YMPjӧ+%ޜ"!Au!:pQo
WA[GdhW'k5, L?y(+%Jx:o[M?8~3+@{ lq U-vI	СRD@Ss+V#QU~Tzal_*k0L=uQC_N9ݗ24gg;Y;" %Y|ȶS";Mn^*h[MIpʞ^qxϢŕM䤝F0TΝ{͜lw/#'ǲ$P&kۺ\Pʽ]YJ bi~]zA4tFj;xhDC$n˔AQ3oKil}n pBfxOjQfH%JgMܔEAdA9$]BW=9=9;O|Cvf!SEEQ[BC'FËC_kk
Υ7̼lcwгC*	c,%SH'KY~V`
c˃A\^wN\.>KGI1ފAڒu|^듡P:8#3#	
1c|0'`~}-<Gjl)6ç0Tfy	ZZt*>ɀ=B@/|ֻÂRq&FUΗJWúFwqw]ÅB.$IDlPhQ$Y yаH >^r$0|0#3(cLۗ5;hhrDfKEX#bAZ{B{$_Bth̹>i\G=̝ym|]N8Ь@duS:<|_"z𱪯Nzϗ";l{:<B3 GzfDUeD HT
Dh]_8l%JN-y摋NB==j4d=C.}STB)TdA6||͑7T$Vbwvv[5kzv.&mP?yeL6³&:Rk>OԘeE51:2mSNR4lz2-%h2.QEf.U m'xޖьܐ!d6=$I\^sv{rsfo~dIFd^3UP͸pZ {e77Zr#h{䉓nn:mkƕ6$F;\y~;|ƶ͖2RsU7ťUФf,jJ$o[{䱵G">ߵYױE%h+žG%cJ61(HtKclbkJaV?=)§
`3|uA]{qS'iDE)9KT?RGO%ā@
	8,NdXu|%Q#+E}Ifl^jAa
ޝJ>LК{aB[$~eèatdh0)լĭ?~Ab{ThEڝu5ͻc8g#08"4._UDA2gN4Th%qci->{L`F4ˈ~DF: ܦ(M7lKS
W/?-m8.*e$Sr`֣fN[ωKpdXMH;<Lod&t%@}ci3hQ6ٗ\R*O.q/ƼW>38bCgTXGՙ{:K
kȄnMSz@`p``QȦ9*mE^Tb7=C-{H)9Vmjy}u훵յΓ.vFP*M佝R&2:˯FX́5Bⵡ"35W ʥzc@6sYWYHWlhIh[yN*2l:fho|,=8bup?\!1I{&cO[2nET61N=v(<%{/f7}E9DґTg^su@i[uY7cƺ͐כ6j⍶H`_j4^ ŴQΰv:D4z-R4^^HB]5ʻ|<2*J@"-#-XEQ4ct{4;PFhQѿߴO@gf?Ql[-kE٬1~ZrY/L]	,u!htdiǎfP!2p`
Y2Н4rD3GZA(591G$p21lM2-<o(XxgE3(T.!q"Jp`\*40Q:+@_x%
yp?0޿7Ii_e+wNՅ(:hl[Q6xyUG}CV8]MȸQW)E.]S뒷~m_)58ѐ$pNon F	A5}W}Ync0plYEP,M }Y1Yy;HX-#H@vQsg#M_ZiNKvzC7j5C[ӂM1Y'$Dw8>2HO2	{o2׬ݭ(|p/E78$l	cfJ B3%Xx|.%GI,rbW'T .I_?" rV(٤+@sc
KO}H&sJ./fIԗ"F+!$,4l挿-6Dޢ6cD5{;,,vb_PګZNA+n˪[#1HGIems֍Z%c`0J,y昶FgZҶjdS@}UJKWp4mjRku!ie7?a`dT-+	<H@;Bj%&z&ՁI#/;_]\^>/VѱmY*$ۅ,P!F#蓓˄<8c(e20랐9g,ᛋyN,4tc0LWBUS+LKnJm/QĞ5fwh$n4&+&q'	1#14ۑ/x>(/R8kײXSVa"	 L/Dǩ[XDr9sfo
t!DK>K )*% ΰ,Kk_ߝAVyjBl_su8csaƧS(Ghs,>ϤvZ;
H<<|DGW0ißh	%iD2)!
c	Vѓ
*{@_A#nQ<4u鹄'_wֵ؊oTҲߌUZow{zw\	ajk&5/ML6.?ډ>*$Xp
ُݰ!TD.t:bU"Ζ,(e:=-öޅg)edaAOy8<i]=JOߛΥN3 ɲ[.?.IR
tXODy._&gqq):پQu*N~*$yOww8=3m(ɂ۶D5b.mz_x`J0OʉI^WL->#j?*¶wMCtW_!ɴGֶ\!rSb`";зnPCsFE=V^'H#Z_Rv#D} OtA7	 8Bf3T)2u.X9YO j: EYGcg,db+Yj/!>;}65j8'@b׿_v%% kx<7FH`ktcDۓcOяx2P5='[Wh:2+7Kw6h8vgfj\z:֙ZbVDY0\zk47c dAx\Ǧ"mqjcsdb준mZ3fty]3jn`6dx*7=:ɂ,Ce=@X럏akLQw*V봆kpm)]h0EԄRwjrޙ_MaoeoG˔fbz.*ޗ^9zF;R4q3?Bf@>{Nٺh{F&G.Mt|*4dP<1|7_΁24X&xMcRoM~WLoKf&ph02ulƼc#XZpȈc[A]
n%H36Wr*<b+֚O\	ՐBAlDa#;s-a*N	#75| 2pXz(2t<5nWXXp]2Nm\޸,!wIHE)#Mmt1يCuDal\
%EHD]	dZCD\[Vщ4J{E4pv}!ˮ:AB([hGJYbY, /bK<6gON~dH2n5L`pEQC2Y"sj߂1hή,,:Z<veUOje{ eTA_cfV%T9w;NIOWE ^}<=7#7*𗽚A<L.} s{VDU<';ӕFblyjH7ed?lo[Oð$FovU[fhAY㬗U=OȠKpKLq\\
%;4Rc)Mov2rܲQ*ux]!t# 0H6e.Uٶ1m>rڨb66L<cIZW"~&vt}u7k^r(Ǎr <,+f	
$8F̸va6.tI[p	L8}8%WS^I$,vBd<J~tڥ%ZRnR:Ѻ%HQJ7I4lj[ܮCە;ccRaf\S24 ]XmE}:͹A_ȁBI1`$B7ѩ> r&{HҖ˞Ynݶ{mZM6Y˪L5sFR)h^` the?ll[PJFVa0i܅'^O2HRT.5oJXÆO` &8I5T2wuM7yIcƊHw7ȋ,
Vr%b8pP>bUQ-u5(*YvB?g`QGS\ 걾.@]N7kq7[@"SY鼫(&mvl+j~ihKS%
@Yګla@P k
dv;b+׍)
Ճazӿ"`v]1&t('-̦L+;v\2k?8FeȗV["GwVO.UV]6`W\-4\Aprp(K{ΐ>qj2G
,\c!Uddtž{-ڰ[ۊfs)ʇ`$Yvga:||ģay<F_ǿv*ÏvcZXJIZ-@%Wnc:Xq9.[c#O8?c0(x wfdf01ͨPs: rcm7A?)QT~*]TuvSrn1&x=$93wt99t\4A0T#Ko~hb&LꌺIЂkiskrLQO}UޔCMX|YQ1gX |W2uߊpaiIZ4%. eu9yF2KfrNVb)0,XAx[Ğ)< Mv1:LkRð^lJ%T(^~QgJB>ȡ4jhuk`$kzl\Mͬg$: C%׭5LnN1Ī@6tM.ڬf^U,Gv	
$'tIbC54+ZRY1M`@hFr4r\2`sB8E|L4D=U
[+)oY. 1,(-٩,30
8B,ڛ
#JoдWJUu7 Lf[N$A/<V-_^}u[-{ʨKDܽt(a'J%b]3 btҳ(g
q"c88<HǰP.!ثol
BGo:&g(8r[yO4,I3k3b J>ݓM]uov9ܦR'tX]906G&1fZb{Rk'eЂMe㴋ڔAY
~W)6VGrs#hw^SU.^zÍxH|0o=>'גyfW7,ުxc 4f}w_ﴓ!`fL2{}2,A>RAGnIYgBL-h֛#8:
I-Ğޙ3!f`=2r!}~~u=:$d~Eokܛx?zC[d0ۍxF6?l6= LZ5;)AU4\,C}-sڑs"փ-6{qK!k|C!.6΃B3$0j j8wN,E`9",W5C֏ikD["Ѫ^RVXq} xFAx<X0ָ9&<RL#N0Q
HҖQmiC5|˨/`%[hU]"OANG@KH#Dc-4Fb0hAv3*]Q׵el2=!j(?`Cz-2 Q0 Sc#Ǯ3Z:A.J?w=utX"`P؋yX$Fqyօ߂eUeI重#x߀y?g~u	L]gӾ# W"VWݗx#@M͙mɌ2kKv[Pݹ=%2![ޙ:AS-EZ];|Q3}v}8,b`V-z;8vqUbfj?0(f>6<o
qe3x'jһA`1`W4MPBm0oWw_afD}HÇ dbP@P5a(W7)"ҭ!:l O/T==.:gf'/f/ []xqIOeDG򼒬%j28d|EjR\ݻUQt0K)kvU?sWxytOJ8q\<XHod;f$_q	(فU隢,#G 	np?_.@l=ɚ1Ð# % 
)i}?ʫJ.n@} L՚dm1P|d=zLXM5x3^y1^G+T]its`5,"Ȭ6(%;)xP;ނ٤#ZĎ>%
B*8&]ĝ-caxg`lPgAEmȃS|ފWf,9}L(,hXt*JͣΨWGq~5QHoqM:1-[8Xsy*4p9{xm`f+pQ1pD91%M4vIpΑc%e_@>PRi) ET1c
mSZj	b<aLog"dQDw0 pgw/amQkGil'
dp-?8n˚:3لUﵝvAdQ,F{\zphf66QbDID$sZ{JچjG,!#S.kL}1q	^vDcg"~2z昨K]XP4"j=*gs&q qJeENM2m 0/)uCdq@R]f q$0K spBjHl_ $]vyt+5hIȄH:	PŃheWk;d9%ċFI)4&a<U6yMqʫ TEk-Aqm"%#ܪULbzTUV\US*#,v2}eNJf*I\4MLIg**%ֈߴv%K{yzgSQԮB&7MI'0Bz֕XrBSsڻڽ"I\_fZDy i sԚ*hg! &3CN͉?(׻{\/SHT	e r~i$s
IM6owU@aj|kdRƪt͘=DFC!}'KssC-VJo!1B 8oolUtᜥX sc?/_`% )V)Ay<u$zW!bѓlFT5KWLJNiI*%!^e/
%6x8ː3衐StV^lHHikw#众 'yG-FMiA;C*54M(fs0sͼ,.s;@l0Z2.ʾΫe#/^#fk6IB-$#HM|j#
	hl_8iѿ$+
߶DX-`cD~(Gv7rX5#tS"c̍ƒvj,w nAdK",RV]^`W9^!7J0f*ŢڌnyyoьMQ9	Lp] ~¯tΑF ʼBTEjKpav#֡)\m&N!wK98J[{{<5=,!!*!ˑ []xM,AJA8N,W<NןoX~ӧ	⦓ǒ'y+w⤩~x{x6'J Mp
 cWp1HS+:	i\ yTiD(}@i! gAFZ;y#NhS͎h/tcAxi0[oZM1q Kl@U?j=9K,K|ѵЊ~:[-=_`Ork=#3#8&3J8(VXʋ嵧/0-LF'OnooWhWOqI9>f߼X> B^^.rc7nX
{]_b
&2xXMƅY6:|[d%afHFf;uU^b@b\b[)r%W2maHEX(8yvN짷O禞	c3e\IXjor8sODJ@aw>kZ-ua
[0)BōNcEv6cpڧeFb;Ss,fț>9 VQ#6bpT~dJ/g)#YY	'DHH[$NP*`?1gWV;Cڐ%T7kt58qǨ{PPMWI$2<zeCdm3]*T0my,hkǜ3G N<LyCoT QJd~\ډJ:ٯJǧϟf7n$p x@
`mz-#'Hz`:un/VZ|2?`::cy6VzUJ%EU)}Wm+(eA޶5}*Mc(:Ά ?
M*q\J=VpGPM̸&y[\Nm_|"j<DuO[Pl6BQ˂Gyض[_%t0nSiG#䥲J,
pkg+[ng`	f{_}ב7CJI2N<q(NT|g.^yCAf)9e&$S:uVBE*-%b(ub$P|Dh1P\\igbUM#v1u~|5!}怒p$?l_ilFUhU>XB~W-ڰm0sSSR0g2(gb~Qa~50ۯx!2'6ӥEjZmaߵڦ`8|Q`NN vκ*x4B9_ "@Rޑ96C`e#U! c@ӁȰ$B4I4!)739ȴ'QrVI4Mb-AW YC٥/.'ClǾ{MEX\f, ?舨xl㴙N8ck<IQ<EAk''_ܑm9](P$:Ŗb=N.ZMSb,2fرj, E((pןz3yR0r3yaA#U:röޯ߃I>}hͻW^A@a@AYxÖm0炊"p\knF9}|\KYv@ppnw7XUƆDy).쬦l#T5H7XPDgD	D"kѷ[D_Bs@M5F{Iqҧ%*5v6 f֏Ud3YyQ^Ey(QfA
tܙ=mAs rzDhӭ2{0Qϑ9:Z2e;xA8}4dEG01QV2btRQ( P00Rd̂\ѦoNo/4OAGXxyLRy,M
,9'}w[i9l\djOV"i˒|b	:ك!́^ ..	f}00~-f-:@pqARXعN4mƳ:AV.ʗhlr``@	4p8y"
vI<ĕ6pbw5#S¤yH'|+|+'^Sn;K׹']ޓbx;Jx'#Vl&#\m'\6t\eDX+Hס\bgzÎ1m2)2pc5\Ģ`S#7ĳL@]aqa]`/4YuSSnǦ`44!88"P	&|JcCOƔǆz]	@DOM
xyq%mBBYLXBSBk#@bz@mk;*@5:q*A֘EU1"c5)*0iY{w갫&BU[Fq2:35ب4cXn\
w^?	ْ_	2-I8^**5spώIv~ic昞JwtHfF"'c^?1e*xZ[hmO\%58~ORjʏ}!'EU7].'L='6t"&7a\ l٘V21ѸX&3}u)5qbCW{a*Y2i%*vkV`kCR Yizـ\%2E8%ƹOk
n06ʙ[}kB;9Jm-ͬge^[Bů8)ȋ_sR"HZ}iǵMFΔ+=ip\\4[NB% ju"NZf#нgb@9l.JV-\ƛB؍9?x%,dcPö~;ہS
Ui|-,[~,REv5KeA1-p,9Ha</9Ȏc}P:W坝}EaG6T U [eɜb5d;485^Q*/ ϣ9XLZ++D|	6Gx!.'219F ~W8k>0օh3eٮa>3ׅUsgD|7k+"P$K6CCv#k<Aݓ]D-'73>(#p,"QcW;z:1gZ۳O Nq:d7AuiQL$
T |C|g=Nrx"pZFhBNWPl:Gn@asq _iq\G;lntxxnD'ƘPe8~?.IMmX ~Vc:W>#7xRo).è/MIsf`Oڏ6y-*7jz}>+t"	nae%^I1I
RL;9?3[pnx᝟~X 聜rb:@&"qOwfqv~?Hv$LJR>.(W\s:{-0B9xc{0!]$ɜH+wP*x)N_.\wr9x'6"96Эz, 1o0Yʔ\4/ׇ{v{ ~@ܞq(*_W%8'zWl	mfoɄq7V33/eu9_F)mu-RMh{삚cZm*>m ˶G֚^jE\<E#'pvaGp'dıbZ{!Bn/
N=v!F*v	|̝8 7=~HبfrV<XoFOnT&?+NTنbzW&vEeMSie&?61Pvht;yh<]1iebAˀQgwcmYJKV'qm@fhCwep pU[ȓDbL:yR:	Kf?d57#(x(cŬ:xA}QSh	ev#
l&tw\UjQX
'Ge"F^aV'ħ2sZO-VE	N{gζ$RL)K/=}lVZ8g֠72<daPNF^(uz2Gid-SҖO<]M/?P)aS*^a\dz!CbUCEG9:i1u'Sh-@goէ+`ZYH0Դ4nOwM>AX!f׺Vo&SSc1d=h1i6loo9<6M%$0qT	w-\EƬm$گ"@|KG3΄4z
߂ߗܗmpz'	{)KpFo/ûLw\<ʷ`K0|ĝ;ul;<ŏK3O!bt<a6WI4"˼%.ԁ3FN!#m:/0~Y4uqS=ve'wW9S~G#UeU}!E56VվOdk!ruEEi	5|J[9`?$>K~f$jemimpxt] HG{{m'sGݠ?{&[7Ma\8s _5oG+Rq-}PwwLM0{%hI%{6B4=QC+gg%aGBAyK>mR{Թ?LuF,vg^p*0:ۘ=#<uѦ#*c"Mfa#	f~4+m?!ٟsPXoST#5`wN`X~?Ί-7SېlZN4B j gI%h$fb7v	mnH>TXU2ZwZְrE+6#xOCQŨ7GHx|^ߡ_S̴5	~jlհ|i5|:AmT|ώΏNZPllC-$T5p|c?n HSYT6VG6AQj;./ڿ,'1/U55
^Jڋf%}ȄI[Ӂ~HYfegm2}׼a&6|Y;_}pwS~q?w]k]]5x*T"
r.y%)#z꜡v::Yp6ph>T̒AqirbdG1ECavU1/(/\'XK8Iˍ:-yP\4@h3]h֌l*]lw&&j^5bvpV" m& !	ۦGSnp=s:k-&h5lwwdŎПdibyav<qX&t-wƹ@8@I1.'5jڔ- uފƜbQhrXt
`~2a?>.^ena%38 l&v<+_9I	Gl C*ȁ2&_o'Q 	/^zYڊWW-/Urf<E˯/tNvABe^^{iyY̵+QK+9u5aװkUyI-3dcPB	8֦\"Dnp1rX*: :G \NhdeE8ߏ3FW`	!Pp?+b.`ޏtY,x\зZfˬ?1@A<n'Lh8gs\+}PTWdHBJ$pv#)f/MEUTivl75N74}tr|0Y-I%p*Fص[/NvaQ̰ljXyc!t?@mAu̊!ȳ׬~A0oUH2`@ahjTpd[(U=&`V(K9a%r觝E buB!2(~Ww@#0'6huc#l=ldI{5Cһ%dC!	sd=j8w+2)DK3pqh+sh/f#2YtD|n:h>9G혭k;F6iޔye[md
! hڐ5PEakv$|ޝp{
	*hr ψ#K|<=3,ݔQl!?,t5fPA\t!j"hH_n´=1^ Pi8Xuk$9<XB7֖kOb9wNQ?گޗŭ=d)?X'	fpc:]R$tDDOċy.ry^u,%\Ɩ;sjǑ47M9&vhwKB?| u}M[JimB@$m۩3Hу=W:R\K]kMͤyN/؈%9;mѶHN
y%vQM\IBt.57K{uzlwMrnxpG@CUoW$Sώdׁϩ=Tye=ϟD$T
,6dA<{>,~i!S2A]&bĦ_t'NmEQjkTK8C _$Ģe (@TlX˵4	 X(,+Zi Ȩp7@OjHxG[C[
2xyP\Hp9_Hjr}ǍǼ\P{SZѭ.;80^tQtHR0jJ3
[F3=R+*,Wk1ȝ޿T&\ꥭ8~چe4bDRCC	&kg~qNn5Ly1 O+11T5k!]X6Gʰ	'f,띓ßic*Kѱž'fZVR9b{@1Z
$ SiR~6o۞_p(j:mptUC8VNۤ*	P=__qJiZap;*Q<E"z3nT4$0mj%;@>.hj]z=Z03?AҺf~ ow>>-7$9 ٔ3gp$;ÎoǡS[P߂B,U\9hg_镓YBt9K;w,Rrfݹٕ/Vշc61ى֡	vⰼz2>cj<-fP5kQjў,w'|K~!2F}1sr8-&OkC)UqÉ}R '!f?j\Ϝ힞Ys{/D 1w4ca&F p4)orC9ɐC<
xddلѱ|x}pL![Z93s%_aPioBtN]6i=pV
Y_Nu  Y/9,CFJ(KH%KpdT:y"BG`m<̿fwg%Ǯ.aI*:lJ'+&v HhUCdl׬ĠhO4,Ġh3vwӱZ_|L'*`+}z	/w$r!6H).@[VgsWvljր'ZIăZYB}IXPlTA@qvom4% ,RYco4izY=NhAMoxQA­ځ)L،ÁM"G5Rf7)R`є6ތZa7mد禥p۲+]?UAº-Ak4+ciux`Rt^X` )֏tk67IjGt߸CDn(A~n2;9z_)]Qrq80TSi޲<(n3lʛH]7W  
A>Q4*Zd&'	5.,'0ԡ%1`hЊ}nzVZMdj8HI _tInĮk3X/JaQeg' { ~Do
SѮApA{6E"t,7;AC^(pce
X0~Ѳ2ipK^07tQ9:L(jk<39
H"h""\Gp][wpkxffa5~oWCN!bgI.RC<vאD_.spatZwf*awo#2OvH;Xw=kbf%ѥp1uάt!Z(''aV>֢XDo|eKe}N¿WYYɩלxi$peSѰRKq=o&̊DoL+N1<zoHzavD"1+*=zjA0æH8nl%;I#˴kP2=JљAȎJy'574"+z[jk:
oߊֻmG(^AD#A_cUWJ`:F$ʧ#.J(-bkࡀ:]w8HC2}߻trjm(䈕Jvd
l>۴ "N>evww(]
ry}(M)+w[x	 tFN.Dַ03 pnU]:EL[%ks䶵ڦh5>\3Mc,@QyR0]enzAK#T@(X@j!tImK<~=`S=/HbQw1(=0O9!EiԜg}wr8-f8M`Tz.+o^ִh eꌿzfN3G1$i.O|&&$U.FIgew˯Gg?o&w֛[\Z([q	`Rg*`e'1^.Jdit1p0.h`OrGU!KNѱƨePfX#;RP:.
 7Gl6pZ7eb ?/
B&7
;c$!j?Ts_Nh+p2]>k0j;YNGnG5W#]*櫾'E0;LbA*B=`)Rss(+`:arpL~ll;s i({-Yg:;?Vz6"'m.4e0=!S $jſqn5_ېӱ}Җ3=b K%C=woOXj8dܰ6V[឵U %})$n8^qϯ^SJTNlxXcTi]MxJ	S^؟h@Y@	B~<SzhHg\4@{7
[}(e*8cDUn^XJm[fÄ4`aeޓ.0FIHTl?txieP+$n}zبdN++-OZ?l<4=	ŃaQ/zm#0Ŀ`]ªz_({5#q},Y1IX9Vig>#8G[Ϲ*]U
 @}R^δG]#m+տYno␃E?c68/'=-5fU9Q
(6ݞ]vYkM=!Ic6<=;:*My
&4VV"mAr~F,/x&*|Kmp#7hpc'k@*}=iYE@LU|!f=_M//γCL9ӔX9+&cF7͛6of3=ߍ&#t-[b{v7^_+<4bwKm1]9Cg7VӕΆ)UaWkj6ehA,n/\zx_n˩C<qGŖ58I;e	:iLG}AXPk1Bw5R<rwExLc[TnViyzֶ"~p1<myFD/T+yS)pMǘk;~b-Ud]NX7+"QRLTh9Ül)BsJpnFUVEbRJX:t9"b3khPB_`y©lu.@!!u%%aCYb8c2E(s4\>F%'i߀yHRezA:uKu*
OǂRUCOV-- YYy'\b}]k=S-(D||&/._|+.zŋկ7߬/W\<_[{Q"4x|'6Vq6QTX{0<-xkm)81kP<sawoAF 㓭n{9'ǎ^PZ/U|p<. [$&e-:=ꐥ!2cE<a>lCddg:oWiN;q
 +h~tW@Wi+! 㙎$B~s;^TF1C(۲҉FN>Ćvo~%瑗ȄJG[?P{]niʖRU>V\{k{ #n9No	qwYpKY1~zIpe/mb@G'l $@ViU3	!G h3c
y`а˩qyڂ-cq*D4kxu=#!-K O4D"A:# N+2vNҫNJIZIh ȲC֡p)0g|:ojOx6gKd6vRܖ 0YM%:[sFҀڽs/yG/4::]9$S;I'$3k9'~B_ɪX3ӶJKBӲH4!ob*ȸ԰b 19:)F<.wqfQ?ŭ0_)_f }{bq&8~K" @ٵ-a޸Y{
GYbbV{?{!@Z?c3m)vϵxȾOÈhK_.@L2Z1fdW&
G%ȓ#Ч=M)V~GPrGo;;|YY;sJ05Dh&bD!ac|T/bj3d22Atǭ؊V5_"A\{QOiAz@{McR--lXţ	7~>=imןE|԰8ފ^gam)۰5¡n(mf-6wY>">эX+)7I"FFѴ3Pcd316 n}y(ԟ 6%d`86bM9"u	{Ѧ΢t,;*q.#է0nQkL-lAXꤰ9|s4NQs&bDtQtk;Bv]D.)n2 L(健zŋ5+_-#5CeKfru=:r4XS$8u4a!;׋)q.CZΣ@v3I~t`U}u7#~<P/"=șK8UIF.0([jy.[8lSTa7N4C`iϿRfgi5I'=nf0c}CfYNz}ޟ|UG?$+ꫴ3F6{sрDypPkdv	ߕn'= cN|` 뫫ki1L\Sp:wyySa.Prd=$(%bdXhRA<>0[s{5ǲ1>:^^)ԘcŚD*_]LNXf4pCbӠ.<l~%os8Ib7EX(*Pb=ëqnNDz$&:' xʷv$>$SoA>=}q@f"[}?\/Jw@gJ̗2>  3c>[)܎|WbP1@2Q3X;X̞0S6Z],St E-vN76* }
  JSd(>DKlDL6CˢjB3:@%EuVЬ'߉IA%
.%w&Yb9A?f	9dԌ5M@`eYطxoW orq|f6l逃XyUMnt>tg.7qqTDJ1iz.n7*KABj e|QubrMh?5RDP5F17ӏE4ܘuw`co-%z)ל,3?Z04onHQ)#JHsq[B_a-]b~^ЧTP$(q#j<#p!SR^Ojw/|UU1AYXS3FX4m.kQ󥄄\:+IxN~4w:e.*+I:hy)n[rcJw.zBl/A;-Uf/[a-=R؋{]jk]KV0o/`nK
 -5Bǆ0:@h^I _^e^xDD4#T*Bw9א-jc*9Ε.w5RSTO2Q[F,s
˫Ni䪛\ʎs
Gj&-C)(hsޠ5"O8QWI$z0/UC 壽Ƌo=Fј[MҒ/aI	7 ,A)dCvYJH-Wxoqvrc#-z$ʌ|{\N|߯`lfQE'a\GKNzCkƂ|ξ6|mQ{WNxFkEw:sN'XRo+Ju4a4XFYy_m6>Q c(&Pv.z?bc{4ۘy0U6Nk]W[T2W8|{#[02L*D\'IA'x>:@$%Fbvu=e`]]>9pmH^qܔ=ÄU_B߂~e߶Җ햜k?1a-1R.W
l|3\#'C>p_ ozZJ&,Wd)xtqJj`	m+גf]mÍݟο_w!?LX`7|뙗B@d,0֛-$P-N{kBbIxz{.#C_@JL6*BH+!D,8SFL#>yM!QY4eK4{/V䀄] i|T[;?92k-WWcHsW3LqT|A;қIA4|\O0\?p4;C[nvD7B)~V(u\ix(i0#`'*EFhfUWLeplK!+|s֞1a{=yVg=A>wuٍ8ѕ^p+q":gj7&hgfOQ'2|Xtj:\lKaY)8X'W`]thA5ntɆ6}^G^au溮~$vC!&z~']Y_
Oρp./qR"U;\Mնrr~=~9gbnS9Uz^X
ŀĬW!8UiSG,D,1WSp[Kw{^Zkhʑ/H-	Ya`ghYŇdf؛_6PHEg:@$wSx]nom+wޅ$V 1p1?

Krf^Pއnp/e@c%k[E!|9|NG[BٖD䪘C*v8,IW+?PsH9ohL ͡ϫ9"1 ?9vq1rܻskDkniZ7yv靎H.ł4]=RoeySlh<ZG1DN۲Z+taZ/ݪnCz~'MMhgvs̡BR6
z~NwmU-ֵ<UL
kuEA=d͂5f<TfH]s%É
A01{X|蘹6oƥlBD55Rܢu)Nw@x968jj+Oy=YI)&׺1c%:nx5M~<'N슙nqkG	.[:E@5VԁxY㱱訁<R"(nTm\75|MtV,*Bu4#@
0[ZuDxUn`P1T?j~MK֘g4;=4Œr_r%3yzȮp/#.-IW>lcecemCwPTf'{ղDny*t}y6GleUoz?P)r	x`eHMy%p'GD(~5,FA:}'Ga]([ŭ~3h\OF>^HLhu~]^]ߚ;$x/)|pC==e
pbdܘU
]hd|P5wRSUqL44Qwu>RMLP~2^W5U 3j5_Ȝh	'eeuH^ux/yUtY-[
N颪IU~Yu`<_<eIjVID^7,z6~0t&}+?b<a!Û=k-*qxouKY"̦sO7h,VWx6N6`K ha /'sQWӸX"^U1mab^wΜKٵC;ͮ4.FN+S|c{?]=l?bBt7:Z^ ?SvE*? 9x^ޫDQk6]Dc-ECX'JE=!exJhGX	cttaTW֞0 l=x$Y 7zuG7wW֗ZaYc!5
^eM)5*Qlܸ~!f/pBen̥%HXK4;3eVߋӋ&M3iv#Mn=PPYʦSKvL'6xqF`;É9uZQ˵b@'5Warz8ۋ 9)O^pҳY7
u줵p+yidZNVwM#E}908FV͜7jGҮBcNuհvL0ĎTӋZ?QIM8njAZ
~?&9[.S[%Vzm.s`HiOiMowc&nCJd(GF"nX5iHډ덆POYS<Yg惑b(v(uFpvE^ek15rȃ!]<6]6)*]CS*1}ڽ{<(c@QW@7"'Aq#<x+A̘ޥ_(5oؚ?>X&4RЍanG%TtvX-r
IdH1$5/z"|nm	@_Oi//s|b}^<6[` \z\UtYS!OԛQSmo<=i^o)rk1P7U{m8kE`bcbnM_19ߦ ־GI<3V͕ %r" .^Z2 M+Z5KV;3U/\g(/5>`?kDSZ>AlK}E
@~8f@WB6ee^QRs쌄m_Q?	Eƥ_3M;[fRN5}>Ts_is`lr^9J74sD@mMF yv0`5dX
hõVhI!#,U13=N$8i!a6cRBV]4ك/X]O̎ؑ4	~ɻa%P1
;FSm{ /FWw!c((C7ׁ>ZE,"39e|c52"X-ɣbs)92bE $VJpPȫK2!J,B/|f1)}YcٛBmeKJ_`JG*`Fmt{xtض&v0BP!Z~I=>:it0	^S&H+4ERL6զ2AmzPSigU~4]")f}ʤkAY(YP3!,3+etʭZuמϮ<]LL\]vVWe h %uX3e(GfPf&F")TpejoPZm!LBNIY4dxh4$89T'h*LCu8=Ȭ7M+cAj)2s SR#Wf6f*	α$9恑̮j)4,LO
L>BdOXVŀtQADYT"efHͰL2.LL
LD!_ϭ+WueĵHFmmU&"͈$t**{aI5ej*Y5 #jXٔyB3b:ET=HH2d/(HIsE*UB25$0 L~܁>waꃎMo)$ʹeb6pITT,\I}#\vXDT!yR*96W2Q]ΞELbn솽zrSuNکNx "9I \jze"" .V2TSo2u芠i$Pg<ԑhM].SG m$mYxVA̮_?+0EJ4WS4:L]&Ĥ)ejH4U!շ0qI1LT1	TL)y-&ebڽ^x,P!-BIi
L\_ ]ziDK}mWz`8NVO=LK#40gҵ'G5SW_!!%$3z,G=&Q;/I"9ii߯^'Lle2NzTO'@7i~uԴ+S83ʤqEiXL6jCtmw\̴*g/.0,9$f2 eꈠN]+TCGLMΖ)LձLM}pjyS&iPX$T iT)	&E",LPpPX tp,B5}̅tML|21NץL4U2I+SL ZO}O4Jjk䧞+DDaqIAQCI({HIw?ݝC5mx[5VBqg2٬jze(7fU-SGĂ5eꈄv">J.*VNhbLꎖY-M8B͵Lrjakv402GQǄ.0Eۚ$x2$QǹLlPG52(I	H$ ZR$V0T[YT[_IWIUHJvMJM$eR\j+2tT_ʤǂ}\Q',ISp$ng\&];v 0TcӹL*Tm]U&Y?ۏm&TCm[&I!a %zXYhF
IvUt}jOebz
CL80Peb75-w)WbrKQ5m=|B-/*t-RkLf90T rpXP5.Qi[ve˕'eLٍpft7\!TOLBۼKLjԬeꎅY<5NP6NYK\!I䠨*23R	>23j/6GipژQˤw1eXH"HxQ\(<s){XSuenC&֓PfS_@j镩(9I
I%ö(≀up'Bd>[cT YչLǘ@Tcz~*P=nt55IHxcF$ޘ
Wvan5`ɛA𜛁Ucp"YfaTd ,JjkntZ!`$23`"ISͦ.0*T%GeaYLdVe>RfaV-A`KZqUF]&^R	hI%,ÊcjXh(񪁸-7GJ7/0K+eJҘZOef_%nt<gQjW&MB`jIS((Bk TwLR23 ^ħ'[k7ލzLBKԎ<[;~̀XSe9!/ (UԅPZh"U#tFeҒBId.E5&+tsr뭏mo7?ΪBzF4hx0os_fXsA엃P4hFۓpy8YFP?Nx=.!fH_-aa+ɒ횽=qli'L׌،|K@
7'VG/ES\,RQ"FV;ie;@J1i]yW	Zq_e Қmt1-8Foa'Ssểwꈚ7nʪQ0L}ppwomlm	@eukJ$!n\%[e8[ξ?:_[g0ɚhF?$U4G
רaft!~K-MLbfJ-K555AM%}#vsɍ5%瘣Y%M%k]fT-3JKn 3sl=>=ۭ3L#탳'?pχY=>9d|{{7|rn1$x+^kzbo[';f O8[Oz?;6'ߺ`vrTho~gc׾5MIϤL7GoHX^)j
8G.Ȩ# wkf@N
݂3Ae.gWK mIIB-j.h<D`e5#(zO+ {ou%FʻC+H?7epo2q@N&FFH25pܣZb^p]IѮ|?S#ؓe#2mJW0v|`*`{Џh4O2N[HLwsy
1$QEh`	j!6ipkdھSaG ÝY1SȲ$jjGC~!7G9oSyO"z6G܆ DiמGQ*X9lK;
`58z$hSbI"N5J׋VL?Wj'?dNvn|NOLHjpd%Գ{6.YS8cëd=b;=1r@齦ќ'~W|%MKK?Q7>TV)K#1+!ڝ1q>#tAf!7'{iSKr~d?lH<
ˡ<=}GU1	nqh.~Q$x2-*R"1f$^E<T/|d&Z=#w{jmP^
Gb'4=<@E-M8cmDEp}:|9F,.Iz`A2@nlKgPCe(N:S~aXQf	Tf!*Q
&ke=T2Rdin50ihQEFo!?VB?@KJMgAMVF7!XXY;|Y<hK+kwB^mg+a]
.=Tko=IPFF#xw x,Oݥ#Вs*1ďCaLaď'e`au:Ծ%tX0	lFj4t0nVlzᝐ
«d!*|]'@mxK%'|!5PM?RKm;^ymmЉ_ 4CE\H@
w$D?=:{NBG=$c
!_qdë'OS}9Gg{ҙOwq@;7$,sUcJtF|w豺cQ
:QP!=c)U	.X:|I^h7$)M%C&)UJ↣MH*4:x7V}rjК#4
QlNM`eAJT-[9?t;Pv޺pa_b
Wq8t3AfF\gxbEA!?i-14WLJK ǘX"mE*z10&=a#e3x-ka//[x$^,ĵbQHE?<y~^Ⱥf7M_3"(IđQ)-9+YJەfH|JG
h:iJH;?H*iMTf	c|ɡCwy̾⠠XXNHH^ǲ9GDĵ0O#dbZѡ/q况cZzOcY")!*ы2%$b@w)<!6\ǮÙyP&l<- Bd T_1xEnJ,-==q_9#b	77䯿N6|;pښ1d)AtLbd!?;m-Xp>v<v+7ﳋ"[e'J!#^V&-BiVmlIJXp[Æ@ ث)	#g	_54z5{ x8Z3HHbxYvq~fƓiH<bvW/(_`yv.Lok].r`:
ZΖ1JZף}jɠJH`,;9kpAG,*	"L*SC:n6lW`J0Ĺm2\z˯W=dKd{`9~oʶZy6WaVB={-pwi)FQ0=̵ӌ٩/10<[787]@j?_19Xє/R޴prexTW.}lVǌz|Vv??^<߀7r<C)Ta6w9~qSrFsӸ,G	{Sb~:*"|aS
gR(ZpU0lwuGp3=C'iXC;r";#27G{߉EuN&:Nc|ɶ^~nWSk5ÝN#=˼ٴ(auk"y,c@V?M[_YFjy}u}mrAX9E^$pTXf_3~T~3CL/M&*p<k<ڬ?txZ62On.ev=OPW'fOo#Ӣ'/7nv뼖Ώξ?=4[j{~i4#j<vG0~T;p/q;	CVbZ*!ohr!/nRǏym9.RZ&u2^k0Br=y&Ե}r\`{8DAV:65ol}8+=qFE,<q_\]	ڳh.E$oj$t|Hb\ݽ}Jffg[Y]9"kyN7H27yb65/,v2so{7B&,©[w.S?8j?4S<]X1cs0KD/a< V+~ Ѱ,`mV3}Ph{:Y}3[U%dB}(<X+VP܆osT	w7<F`[33ys!۠6.xM#;0*'}|u.yqt:wvx3Pmy*kuԟDM>__W]Zݶa5U?W?!\xϻѨ`/ܚ^pevO#X"mN\=,="-FN^':lcuU0۔7U;	߮}}I?YMȥ-FV}}jnGtla׃#T Ax(D0<w۩2ϮNY7bdc1l\(b%}ŕ <T43gZ/cݓ[g$^5,F4z 4`(HSbv\nVaQuBaR.rKш+^YAv޹x{!	m	U%xmimt
+齶ug1NЉ]>vǧ̬ zs}dή/2RƩ,{{8sK/i*Έ,!;U=}OnO7*_hXLίYx~
C}E͹{ǧƸێNiE@C?"R>N(5 td86+@t7 7؛y:%$7O RΎ-&e.={*<ht
6d??'CcKβ_c3ΕgeD@Է"kX# m	Hf ikp0Lx0{o&{zݐWiM?mNOjn<T=DiU]}po>Va5&Vwê՘/<7ӳms.]R[uYp@ދ\85lFdZmR^ӝ0Ӎ#0bx{I6ϿFfZZgmB:{[AV*I@7mj&m=nE5gNE8^#9ڿd	<Pt2.H|xѧй-΋Hut!%"qq1Ûj`nZM;l+:y1;uY?|aEQڣ)\wOwܵiTz,ݙy껃7[}oU;E>yzO^?$yϭC򘀂Ǹg"(9ޣ-SP䝢lSֻ#@sf*M%`-ݭӭ]O$Dￅ?@hձ>)of?;<U_!U-U 9U&م̀S_VPK	\C!E72DZg\ِgͼEZ=ݟ(⫺?}El'8:l='Zָ{67a-Je-G8\KpAzXc>)n ƑB@
,LRIQ>?pLw8Bò #,ez0cO 4B  Tz6!1A_ë1vZkyԌ&Ζto`pu|r8bĜAB-h5BJ˯\״{ֶV'mG@iK')B'<c}(YV7*e2|?gkrDkؚ><#l0\$«ыyjSDKFy3Zys[]+kM+3OE-,}νi_ZMlL?uR> cQi8t~/	}FG}hLmX0/'4J(WC-xd&!+! زt욫<vЬ݂zILn.nf|7usR'Jn][J4@mѮY}o+*WtM\2<eP0H1Wřwx?]c1=a-D	ՍlH{칵f;78Wɐ%Q\}na{3^FIGKygiA/QǲpwZ H_bM~]
룽	ݍF Mx&	7p/ /3Xތusd뻷[h0=#b&{d޳?~gv3KV AI6Wck_n_g"3$2PLo2kh XX C
U&+籡yv?*2?l2.dy?A?^M o<Bx32aACc /j2W @|l*@'1;CX=ceE\w\&hıYYy2On>I!bmid皇=4Bse;g`9 քDHBUޮ1hGqGP+Yx]?,ϷPdtɩ>V
[??=?7BME7wQ,[`tS|ݻFTa`TIyUxgow=ȲgQ>?_dppu©)3`O+`S47
qNAx!OaG';'淿
LC7ЏdzwpV3kLns!9Z<{s
L
q7{w]?kLu8ݷg[mQKR4UHv *3xYjPMx݉aov[h=i "xA觿e~!i1jwGaz~Lr-Xg4A1♆F<؇&m3Md]6>~cA>do=">=;@Lpãw!
Lcoڈg*mxvoMVgUH1Li#E*3mp>>xB0Vg(XK41Ӧl]Lg(bl$Yrȫj-Q[R 2^(zIwk`ZCflE#j;Vp!DȬ8╈
 ^.ob4O5EvR佣Aj/<Zl̓ϒV^[E:t/5Y#"uD͟CSMԑ}HU.a}lzR-gHĂ6(_(&%7RL2ByAoFU*"g0,
g.{pâdߡ6	@/[,{
5 9xuaժbG#X|vϞR{ Isy+ ܽ_%{]C?|W.+`-QKiF+leTv۽K;vo	(`7C?ky!IbZµz8t7?kk]:UȁY>YAڕ1i$Gqci {Euh$ =u}%`cNcY'&bp>ǚ{H\k.5k);G7q[b}n?'?OFb<1𔆁SQ>HxC3lmҰ З#Lcx{JCsK6mEފ̅3ςEbhLd=[%Xݧ'>?to4[{PMs.	uNz~spjha}JtOחoThYpfEQ~^'AJQ_p~1dX!v:u^<7xJ<},T
,6)WܰU ^CD)[c'^N'f/;	tkPQ90"b" `3OrktHMƹ'w~RcʗdVxHߣl05^aD^;@ֹK,`|PU~j	V}B'j WeEPh3TikڊLfӚw8HJkK}roNvwm;jj Tyt|9m<:s|svmQZ;p/fqޢA/x(5YYx4nG~듩#w -ʓ杫~KaFSk 6=N\ ̵}`>Fen%PM hCcu:iY;Oɞiީi<%n{Ќ]~6x<u9S>bjp8jAOh𶚧	ΐXsUܢ6A1`NY_0;|[R>,wK"Ϧ4{^gէ_wϟx	'nGƟ}\QgrvK螝gvh28o*V	6TN)d?4b67mloyMw!87wPܱ-o]̘쏲)hf1 	>o,Y)/?/ܣ` ^y%JL7X<-G9}m4]6pLpp]RkU3F;4n糹\)H_3cK9y21Y<	8/?VnC#yg]锃PsĎ=m)bVO#_+5]N`G|9]sMCiͳ膺7) xn-!6sAV+^geyj-oJ2p'ssؾ-h{g\ԥG#5ؾny]2}/vOj=l	@w\GGzh7f)GvJ韍QebEF%[Y^Fg\35C9b8Gk@VT`
w`X8+M K69ƖA?|"pbf&CkڅA_J#Ǵ  w;n\|΄qyuUdÓ{8fgP3PvN~wZ 6m_e'ShOkq9pNgLŘoQ~!	^N1
8U_!aV*[/ؿ00<c_(ml4^;|	x?^,󗂋b}[\9Qp8ڻ=9PAk>s܏dcME5p>/H6h-A֏'3g6[f)|t~Hb{yGByiJe].]7\GVc4{ݧS?^xrAzջ ɮ	V׼4mFb-g(zj+Gq21?OF;edQ#&INHu`PÁSݜa%\f.M9FcI /ɽR AxC9<:yu޻;o߻?l92T@ؓԦ#oE6s8&EH/aI
@)gIÛCQ>6k|}I&yq3A%B"E3	I!R_]KJ$5Qfξf2.br#y jsGɆw\yMbPVτM`>y1BJ`CBii	n{d+7}XCoEa6N_dW~LМqP%K_|!tRY	H7ELu 8@)A⫰&@B]^V*=f,{Yt '^_$qP&DboX#j4NBϵA?H,[q 68DvkEh@bN6I^yUNZK鋶do6e&:`cߪD[q~H-N~x4!k ,ͨML\/:*
dyd|2vqldvX*-,Fی~*oww'܌`Y`Gfdu#ml	0\]L'e{tMtRjTtKn?.s:ĝN9!
ĿW"q*t!aw'hkl=2\OtP*֔25[["|-w.i͎)#ONﾚAo0fbtWk\2gdڣ`Ɣ,S<?$T #8!"dv
Ac81Ǵ44lijA:7Tͩ9"cM-à3qL{DfzĚ(A$Rr<Yqk[-`W巛/W۰P\qgs3]PmL~@ĒDcJǐ&H$*%I[~Ӈs@ʥ+N[ZUeJSuXJgۧ`?zvQx-g`o݀w[e+dk3kn=^onᥧokIY`_]xRr[-EӐ+F6cUh7mLn鲥cSD/_.d._;?2z3Q#|kx6ad- {)]?"{e'rR:ty@{C Yx(E+A"9&Xf*Gia&!1''G'ؙzBQRL7z]]n۔^;8lW_x).YQ1d]]ƙn?	*0T٠(0ऌ:fZ\BGyZaVku0,<l`pxXqQaOBn|+j=!NKɍTMGN	64ܤzkṼC	ɠߐaQh`̖>,@NSQ 45Srq
,tpzc\Lp͜/A[nN&٠Ҷ>dbWJ7-\~;@ZeCʨiB_I5LC~ǩ(d(k,e\T	eWD)Ug_LG/G8d8hUaRdOuc trb49z{ӺDBC>32-^B' e4*/]L}b)˚NRH^1Ltp@Řaܹ0'ghH$0"B}2Ǒp*sC=hA:V۹0lgN>_ٝ;yfhlnR@cJfS [r"UZac~ϒ_-o̸\]Q!j+)/j$6Ұ6X^ng3QfإLYͽĆg(Ѻ*n;rKc'|Hj{0\`'K]S'7`\P0-|B;8A$w9SE-Qm<M̱JÄٳH Ȝ2p/3!KYvhۢMpazUXo?	U
]o{t{kg}.UZtNvONϒd[BQGum#4dGpgG
x?^`"8b%-[G$y
A/`e\p]R3(ѲJM.8Mg>S6b~x'ՃC,dI8W(H?[x-fKnNox?nЄu^z:ex7!)\<}N67f<\U!snnn*J.Og4/3﫯o7ݝd|bͺbiF.7X%$@VnJ#w֊ؙUq'ߚ!bqjoʘ_UwhvJ3k$-y~NlbufsdF`"]BTe.>͡Ĥ$9xؾ9)/f	61acqIhbz:M'ֺ	r<tq;f"A&ރҁ [1/
Ut=KN@c+$Yi߬%{6吺P2/Y|U&,zxV4
H[hy%Aog7y!ig'o?72_m9}ǻãw5x m	ƼwAlU62Z"a6_o.sjF^=bpD?6BqlXد)l/\۞3=?إjغ|ck^;&f%)+h,M1\c(ՖNeY6"L#P=
{Yզ	fV	J}ICA?fxUY4l#kqY!yÞq}X7h;v	my_G2
zT ^}fd`f'ӣf-e9yˏʷ]EEqqeiΆQw
ؓs23N]{ܼgް|е"jZB{6YۅXAz9Gb:U6ruy<p)1;4ǭB?hd2Nj=pgHp;l:KA Yg2b؟7iQw'e	յ~v{mj3;zY
xDz`ZnӁ51pg9.Yvc~n#!':fI_d&]+E_){~o/B@Aj
KG

b(G)ܳ# `B"-Nvl|n	3TcHIi뺧a8TޓJ>ӷ8j%GSu8nwX 8y IQ91Q3a_ߖl'YD4%"9Cu>,Șt:^w0-ɴhjɁ}xvR%\M{SYpڤѯ]eeɟ'K«hoG,=d]{JXnBR?Kpb&Π|s\(18 >hЕAFf1\GIb7ݲ.9:`%e֕vջqÄkN
\;wvh=A\s"6޾m7dJnM_l/m-xGlPArҿ=փl5cfLxw+Pkn)Od׹$O0{VÎ#*;߰=6hrrfQqX1UoAo_E*S\/Rxk:'pR[ׁ/FunU.<p&,2az˷={KӼXçZg1ČҸ6zGH9c%|2;Y^[_xjizIǆJ\UQdT	4̌-Q袆1ht隇eZpCjf׿y卵_@ޙMy	:B rZxVf΍&ѧS˙75 yߺ.="$R(D6J8p'>W$?Xu|K=ݰuBq-Wo3R#0NuMLLZ|C=%ÎmYdL+j;4e)IאָѻD&m_Ÿ]3ZF+-r;)p2ɮ]V#[p(CfZ⧳yv\vڹy6ӍէVfìxTWa=X>%e t|k_718m9ʉ	-#8Kl>_0NhjQ<KNuPɩl5o%P"R ekhw9&^IѺTusjD=FGct||5m)/4sdAs]pP<QF'ttɺ'jCvE]r2d{6PħSds$'AztTbM>\&&-S"YPDn#CKGf
Fn1f=:_ˬ1ZU!
OD6h*h}oY2<kѳ`=d1qiL'Ǝ8nt)<{m!xm4<3S}0(GBzJHr%{/h[8 w;oRt`p.竮YLU̡gΥF꧴)4r 0! +Mt&3NuC,g@iT<IW)43Ytz	tyGy݋c֢I3-GH{W:t{΅~Ċ<l=b\^BtrrzeZzmr%}{ݭSNO[[pZ#孌LCJ@kWt7X,u+v(1b qF AHz
GAٞe	zEn`3)p»~$<1.v/=:ZJL|Z	!A A(}J$I1x@pNNhKZmB
NOR zGHr*Ȗ(GK/SJ~ڂȢoZXid+jގFE"\etdD[I d=&AKz{ꅡRq(fCݩ؎b3iZ[V~e:jg>|$YnFi7y<:|bd'{[g_`y>(%,uŭEx<~M Y'>Nqv.sl:^̫%S).z%2okEK>Q~+w303;816,1ְլR׍W/<՜Kϵ3W/r!b꫃ְ; 螋?ڕ^y;
jJЧX:
	?aM/Ql4Gp3 όR
`QMaJn4C78}ܻR'5/֡,Ŵ0pWӟ?Hav>!zQ쥛5F@pz࠰	_KQ{4;?*<嫻=A;T ?u,}P<Zj)r_~Γbpkc):E`E~h%	dyf +6CT+_]f/˛uuZ×@Xz<l%otJ1<}o2FpF<JBw%-^k6{0hq TCbh!;a+~7gSF1V>!4^m*5n0)d4ŭ~5hМ!Xpʪ!A)
<VM/,;-#=A#ŢK3VRgPTVYoxh\Y((ږaA5\#\OprD}֬
oҲOy- d$}ݨ-nQ=OiaJ)xYm(AH/~^^._S0'NEZÐfEU7~%{j+^GMUADa~ń{w`~@G3bqog]sqԻF#<_@hCmFnAP8j>| ӳDPQ|d{yCd7',KϼLq`]1=%5~CD⭬ZoqYP0z;CQ"Iu亣`v0"MNB5d { { b#ɐgkD.3<)tlL+{|ࠏGksȧ(6܄:f':
^ǨE<Lp9.AmlxѬ@|}]*Itdy$mlf^ojgG.6-<XK'<`-VD0yFC;:j qM_WWLF?p_fjhe/gFHhfPk
ޜӫ/{/j$,̤(GjVh"!+#xxaF]mS Z}4
Bk1Bn$&C)hӚcF֯9*)	1q8K@FeoZP]D*{:4޶}(2NËH44Pnj-3}o8d57%D	(檝ci/XxSlѽx^&	畨r`1ִ?K)
#a=_<ZZt~u1O Eci뉦Aآ|vϷ..hm$h)17T;SMKG.'ӾxI9jYmEb^[cK9$$%bݼX0"/Ղ-"wXi(b6:l+Af##tS3*J@1W;lX<3ZC%R!Ó4]EZw_+t^ϝ:ߺ_7futWRgǌ?onP3YUEsCh'_qR:ɮa=&|/b@\CD>_UOĚFq;*"kɠ+C*[>>%:$-ap/yeYf3|4}os,p@6Kovg ](rPCf>8PÂguC̎mb(F> RME%~eA
1oT<nK`ߑ J]31)**QNnQyfXIb;,F7~ő`E
\Id@~9S&kk&R"vE}vZk`fOuU F_=?%Ul}ɍ8{Oki:@>g#\Ҿlu3%Fj: B}\
f&^m0RCt!ْ 8*1e \LJ5-\8^شoOupWֈC9K}[G7?^H'cGK`'#jE-y:U]-${,;CwUu:s]G^sp͛1ruYq`7n>4sGbL	3@8 Dfߐl6Y &V> FMO5[0 ըٷ@)=9A
&7]D ggvltmIzij/&Ϟ~`g:/=7f5hPY[_D'd`(!;䙙>+[}c*mwK5(Xqmg},hWi/B]$i7r(".ʜB|gTQZRVSԹ3DV\vDr7-jb PId1$mÂE:.0Ռ;l-!OSp^Q2XuϊҞ#ϔ3s\n2}>`+wU2 ;ي%g\T=șy1g I$3soo~H{',ʸODø`	2v9O%BFwkĩ?U\}U]䋸bvkk_0XZ@n !^ /ğiOOA<0ߴ16`Hs ey]}%\LߢO "vYzQn$/XGT+شյvʵ\H"dV[p3!,V	4bDU٘<//oXNÍǊ9=E=PZ[t.`;MG0cdE}o]۳CGEzw'/LU?&SK+zX\.6	?
:@ӲI@yq5 "* 0~gz;wYNwVGiؿWD+=jG-PN!--syn|7ww"ӆ('O?-)n8Cjs!{pr@ӫ=3{ch^5lWdƈCFr^AOb4^:k}J 26skOHM(ZaWE_ŔV
pz8F	kvT/Q2FB2hBqFaSoz'r
!\QqQJUdp)*Ƴ>3 /
:Y"Sf_A-GˎfL)|"vv2MϑQkd-+wrF&\@SpX}4#Qr;ӛ&:c&L.nkzUWކ?{*)
ޙ|"*d |` ]e;w=1ChnsAKz84ۊCzWW٩YYucFN.&7>?+i0J/l7Ûx3Tnvy	S34-2iA._V2낌nXM~(h6ƿ=ǀ4$2ȯ-Q e)_+/9`g[mwb!I۰h3f@ݤ5UĶxN-^{7a|Ն@|--6{g/4B⚝7lw2,ڪD=5Kf;FiRKU:|G7z|"ɑO#(2ĈF`` Z}	6 sJ6~ұǫ;hįM+oӽ75Ɨy{vj96,*1c&^

YLZusA6Xҁ:5pPJH͎63H+3K؛~;zr7	_O?|)mbsӥtah~a.r4;ǝx\'v -\dC1"fRT7?tG|z=1
׼YMi8TtcZho[)%q:ӱҼV'yvMdzivӟޙ;c9϶m R	Nt3o2OM&23+ɾףGTpG_Db1qo-O7^#GH:Îazى*ik`rϗxx;kRޡ;ڝ	b_`bbf"xXaP/mV}~_T}{oJq?SIr)5iAavutz|m6}Fgw_53Szl4IiJ8*5Peύp~z`OKZW~q<5tvWQ/.'<!LCZJHL<Klf{HJo8z!sAZwӯm@#-5@/1eZ.Us.$xUk4t6O!N@&é0шн1%d}>QfI:*pLSR:Iv7¶҉[cq\bƷݳ^r}{yXwrs+8S%bCV 4G}{d2ܫ5 
/x#jGɍEjug:1=T$&RQӈ`hO臔ۻ茋THnV?
^&9dh0}sƅza^I0YҾ.FЊث^dWv,R~cC_ntu0_4 w~	kׁk[voRU`yl1×o6.ƸL)SÝ{'77EZ^>3;L UҜvM	i ڍWD5P*-`RžF;c
R5ZFN̅ :ʲS>ḷ:yXF]Yn}݊%ԒLoҐH+2B]$K圱
;8?뷢10ֶ(]eUْ<`cWJȬe4j*]?q{\lޜwk"i\0]*~{Uȑ5pvBEE-&@x|q4BSǬn³ o^[a+ҏ(jKYtOKBWE'{mF?ljsd4|p aaNgv\\*~J5_i8xxl<$mޮq,bK6L`i1`r=NBȈܯlxzHffj[d7?ćqXP$zǟHbO<љr|jk|)+|"8tF& 2wKrh3+~dß21%=*$nѰ;ԛQzIw*i\	}o>WPpJ k7=T
g/J|lY2olV.{rj=
C(A,S"o TZU\FxOg01F|6]^f{Œ^l[nҏҭOZ@˦d	+9!q.iÀ[|R#ZNlLm esz]c-<emlqX_)rSl度l	753pWuQE'mETjjamF6!oH#gzGUolLpDiJb<u<N)ćItvwNB4P8Yq}z LVR|uQD*vz'NSYg/>~`|IQ>w8Ǝ
}+=]쐱DBYiˋ_/yff{Qě}ki&`!Rx	I{||Q3 	|LG&xDFMGvx9J{C-,-R5)xp/6-N*gf^0zPڸ!s:A:88>x,Trwힴ_u΍XeU%w`KzJ}l,.Cxꋗ  '54Rv^ KWa|WbVeźc:컴o~zp:f7~ޔכAJmѧ؅Ͻ<IKXn3;NvnWCN
-|:evc}l(dE KѣL_B,-PaX\uN+WE4F͉c:Geڇ̳i_sϜvDVP'^tͧð%sL'Y~Iɩ2zhݞN㏞8	a@=NaЎ.ĪanH,l!9!~׺7bR^
Oά'>:pZ	Zo_<opk{$y+ Դ)Wt~ <nBJY}H?Q!Uag؉V$Bqˣ0v5[Ekϒ9/ʶX&hppîVQ(oŵȁ^fkTkZ)xCp.+({Xɛ|WV)  S.$]V ";c<}eQNqi.~ ^1,cG">*E_̃e1ktPVkPI+UɚJJ,dRsz}Im_t<Yi'T,+#&o-DeK6Bw?" "^'J&%!h2?E[efԘqvԡbE,!%y-Vt]ʹ~I2|. ?IoŅ#9\C7p9M>mw:7"OVCNoQ"9)[9F, /K(̚Ko<|Ȕ{s}4FLYVj
v ^S9CH,&NF2B$u6\^ `'Ȼ
y_M~Fƞy/1)Kii2[t/i3{nEnfi
p_w<X9%wTbs!SH`R^0;hpFI@5!*`:ӷFT^\^靌 d<RӰ@?Bj/m:p@d#^C( hgQ:<MkN&ǋ6ܫ|KuٱsŴn	 f4NKdM&eK񔏶Z!:,\I#-۸cbk#)-\xU4VsxTm7Fr\jXyگ?CYvw#XP~h"}uٸAlRx?ɥ5%qA=sB5/P)p+ Q-"w0H({|uVxeԋR~Nѫeש5/3zc_Xx>9 $KK&[[5i1ĹVҫ4QGqX%U*<\+W~mnH@3LZ['|`8I,ze3Ev5&$ G!9%fkB4/JCtN(1ןr'jQ~թýn7x~qC^)1`䀕-ƃ$
V<li5,iC#< .er8`# Jqǩ	`@b &bJ:L(Ѡ3IRPw 2ӗ`2
<&W+ch5" Z&qzFYMHn>	ڷ:v/>B==#v ,5.=ƫ(aQ~NkK7/"t)_(M*~x2
=^'1OΆʆì6,.dQ&/	)Mc;ETRĚmo&C"|4&n&q:UZ/z#6)[1xll¾KU*ui8IK)pHϿtT1gp1*!]Y~`d_R$/HSFT<qe<E.ju.eYtD/߇zuEsҁi;Jkbǣ~Hr$anPny2]-[k"4 cu~L(l],<0LdtB
#o$Aƽw2N\`9>5)Ki*w16N3~w~͛O<LIi҅Xm~@ vV2#KKW&F THFfZ3qE2L ڼ-o*it"]vd]ni>@!s:}+ڳ0SLX O=|e+kZd%Pn	U\+MCe
(sCU8"7\ o_s8 vPe8]ۺ鐔kf&Уg賞FMDf=2R04]͙{"R֌U"OD(旗 chsHy~ְ7ur>[e?|7phNr^a(7͋B
n*ػبWQ萇uS`Z''c7NAwub,5!vVy&wȀ=u1hY<|F,:BǠi9ܫY|Fӥ':vŪ\We[Rr>rsHb
n@+B4b|W>`.O4ۉK'/(6^=]AEW/ zJj硅aư^PƟliyfO>K߾#*Vb1mdGjճ{C\é`Ƈ{rvo~&V(dLG ֗MRw;Ɂ ۍo+0f^ऑȩkiqxc.oQϔhBؓ4Q[X2{u~(ի{AO݃ɫlkPx&wNE ZlW \:A;P5T\>DA5znQ3Wa(OJ .Vd
Ÿ!qWl`87j9>yy@9bi3Hn{xj4MkL;^?l:(i44/kKy:NLō:@4Iٴ+^:B*`E0mcZ
$ITp61)r\~yzFc#ɒ} ~3݃ 䯚{#VJ,	[/*(2]VJʭxr@wI!;GA!T}ӟ;.߻]!EiîIaViA
!>7׏V^uƮY"lw[8X(?#Cn?ٟO>
bzwgٻ>Sbgx@uUN^wN%;
gnm0|2K\\{ֽ-/$:yrnsBjhQH-*k᭠nxW6xT9JqoKtkesW!Pjx?ﾼ?OV14<(s7~5ʝB
eB
ʲpci1#+2	69kUXuAzM^~D`ɻ6C'nZđ~݋O?`WᇴDaV[RM{(7kEײX-]~d'OiTrCwaR@gi%aV:*l^:A˴Z%p!2i٧uQg})\2Od-gŌpA|0sZ ?yeE2Gt&pƩmt1܁aS_KG0OPgK`Pe
|bϯçȿ\*G@'%,qG *w}.l_B_5#X	ctA1Pb<}iE
?KCC]^&;҇$<<[V 2xUTjzlHM^<L[(@z`"Dʇ븂`Fg
r!SUO㤎mkT\El/s͍ݕ\lXAbK'+qUS^o]ۿ2Bi{ŭ?*)l]러#H[!%nw0YaՁ~t'HCVȣ4O?d"䟭/7u/;4oPZۥZVĂHJvJTRU#jn@
wR- [Z\-I+<w'Hm~+XEK=ސm}LSP;AM]^OgoD| ?܋0տD",uONΎ{ƘNjxoh9+]ggk$Kaˍ_F"Ekঁ :-Y5)E$gJjjUJJ*G0Θ|u4M*3`*D'15܅;RcE^^P9?q"#r:_e'	5Ppq-(%3ĝ&*@g7u2NڀCAGbk)CJr_xEy`l?z᪁gcP,u0e5"8%=&H6G  ̂=7$,Ȯ'״<57m\՚b^G⟲tޏ)qڝaǦtrJqg5 gBWq J%nn+ImJnphIrP.>"$kAZPl?;j/ld'EF{(܍s~LuMtZZlX'i;-%O*9<~x+sGwD|>)
6ziL丱J1z^ލUv=pB~lAgxQpX)jOd͹駟4xmK}6 Q|sS/حLZ+n7xr<g2PBi/뙻#NX<8:4ā\ Ck/zv <bYQ^続rm=.2@S?s_dh^؆f,U:+G[Y gtiL+ԨΦ:r=G+%EvK0LK?ON}9~RfObUf.kZYa>G#¢p>TO&#x5γj*:R])`k>ȩa"XҙD-)t4g#lL 	.n3g]KX7yq!8Sl13\0bc7גDuƬBlcl2!<=0KܦHӏr8|cg.4Nse(xzň`%Mgd(âAWa"Fyh'p9gD1_O TZJ^Tःg>A	`F"/gV6IΊX =0j"+74SM.!H[.۲zWFLh`Cz[,%vED)YxE\d><Rt^[[GgmaFςDoql0"6RLn[aĻd5`te\a2I\F#¯*Cf7'օzSi5PgQ!p~C_!v69ǯtUn>WFGw~>?<8?i{秽i|3Fx1Ey녯fyV)}"+ޭ|Yf9Mݲ][bxٶm}}6Iy_yyATyj$ãv~^E_s8
uM l1,A<|P21ɔe(29"J;aEC<Ðנ=}ӹa0k nAyU^+h6=4WOyFXV^:Z(G숙Fqf9IS/\XiYM/Ȱr=irv)NPlfsOri|.`̄:t=	TȚ,&gU<hP^뤷'dmYrf/S	*v4`)QW;O}۲SݺGo||]aft Pad}UKـ$S,ͤ;e"t	;s:u#g<Q1E*Or~JOo=3+zgdPzmnov%Ve~;9ub8?o/{Czoқ|zVQMԃ݃ΓOxl{Fq!.<jRMP$	n >`%;d9t<Z=ڧO;?il@EʗwcآӚa~MwCbRէr, /(M,*h+(5ifi7J혃<Y?!3õX|5	|*ڲM?.)ee,=cʸW)jFdAԇP	@A39Pc#?2]	LuyȠT[b~upCsދDuۘA1h z0 DEn,YqbؓM22d>NZl#R.Sc7H_/qzew\ji!AÌmOoJlS13z 7Ƹy!FiCLYHӣɡieJ'r#Mn.Ý Rȵ[&	CER; `OOG0ԣh r%@@܀SOvb k}>hOhEiR+!)Fs4rƋ{}̳Nq~ >2B6c΄[bF=＀90/݆t7{N$[:nndo'o;xm'݃v'uØav;Iw8}sdPRV22znPCO穦{*w2Tw"`g7^+8o0T(
O>vUXHāS{˔K׎!wn?jfvF' V~àZ('Nv;o
S.8,!ǷD?n:qٞTz,1ʮSJ״3#Xb<gdc^3t^̓"r[<6gu:,\Ri N4O/FH|jQPP[.%`:WC7[WmИ74j\S&Ŀ{ 38z#/ ؓഒ, (?0:䍡xa7b6e9GJĴ^_yFo. 	U6詢mtkiɏh""7%>_Aa!}Ӟ`8RRgN-A9Eab:;xgڢy5}NsX"fB؏x;VQlb6Ȱs35` BPm)cޖ* Cߚ2*XB>뒽@L	v"4F.I~QًWv1|LG~IrfraK=^WAE, =\]G8ɯG`iEH{?v1u{A7lW4eƄJAX\?7U ^$Vo73Ŵ0x{%n
4͑ݙ7-	24ɦb(.9P|jPWRt96eFs[JH*BIg9~6	2{.H{G2N(]|t6+8\@UaV#ZC=;pYc!vȆ@rf3@Rv()K|5KhGͬGrv>OGFI6)q'Ol<O<4)~xV'' ND$?4Ee$7dkmsA=}ַϞW0lQE$/\ݮS]:#mjJ/IU4kPmn:i҉ptНN?CmyS[βpS#i6ܧl/¸l.GC6
qB`a$5gň nөӦS#	6y
*>LmmԷ"&s]ZǇlo适【I.V>mWp$LiL\?hئx6%4uda7STϴ
w^"
Ejreh[ZD;q@XğVuͧHذ[U-WkBpj9a8ֿ?]qi%N%<v3޿\b#΃O^_XyEBE=uxRM6&&Q1?+m&9Ǐm:7p?ll=_ildFv
jsw>x7;@'˹={U<^WWrzPBk_6YQwt?;k~> z(yՔߌN?~M?FspZuQYmGiqBd׆yu8?>cJ.S']˗N㾍%3Ix?c>w`6:uk|ݙ#sɹVD[vក-;<n^)+ܶwQMãv{~Dz?O=HǊeARnjt7L(k#<9=<{=@6#3Lvf8<W`"њ`h:>onBq""ם_k|6R|R#e	-N VRJ8<+#8jLmjJ(PX.($X	7:Έ8`:a0erJcL,y'֑/Q7Ozgl̟5	?bn ӭF(ϒ4x TM~}Q]k&#<ZqE'fHH=A~EvZ7+ʡq:b2N;QTi]2~=ycAfU%M|L*O8zN3ԞʁPS+XR	N--fq	BmP[ӫ_vvu=er]3D1A@oùm&ύcj2"{n9yҚ)wz5h9:z;>а~8P5QĢ::R	cP? 40E'bp%E>/zi{uz~356؛@J|yKЕzOsp=#	A1wit{{x?zʟ~=05p1Ĭh/PVgf,@Ͷo{7Yvq/;6Wvդ6̒%>Y|7Ik}ABTe(m8+c1|mͰ(ӎK66~JNS<tCQY `ޝK4vN(5+QW	ﱧ!G&YqF-{_$v\rxґo+'_Ov#&fBu`tzS >D]1R1Ǖ0~DG:e;`?++^hͧ'\}BҮqA$BRaDÑ:?5lopëzJtP?xCv7OݦmrɘAEӐfhJ\ER` VAw­L*cD"p#0Be^c.ՇvV|@q&1 p۾VyL.>״zLc淕6 /7Jl10Hp2/MVUs3m{OSJЪ34}eOq-UtoKCᔊ擯v?u;>eK'waE7TZ?}	m{'VQ˼ۧ=yU5N@Le	%n3D@礳wqK+LVE98ھv7*a8pnJ/*P;@ 0 Y,-S +0*Qſ`ź2ZES.Τp/ҙ%<M¹5N14%:4ojQ&Kęq#
Z̼BR$JuGYWL|䋝!P'	٭3ԭE7woe؍O8NoU57ECd#q[7:dxpXC$cPɢ<hIBuv=ۯNJ'^ɓ늝tq A2ƞ)N'~M]y3#mz -j&XcTy3(T+ڞ!!顡u=4fEs0(ov@aKXXN_|ӪCp'ja\ZMr~ q+e+`9D>,x7HVPG|MxvU96|{<+(	z0%m.>;J'_#ĖgϓJ;\yDt2M'jکɊ4	pBit4Ԗn꫸n*ɼ)VUHDhGR߅Rv~2/ȿ IX
0|b:lXڛsJ0E!aG@:4Peʡ1`f]?SDki5 ~N/戉IszB>$d)ndbʖme,t3lU䏮	*2yU1PKH
̈́z@H.+J#Ȱ.+nѫֽFXb-F,!ژ6c~JlAu0K¶RkӘWoKghtkA;|R5A]h+cSrNN LB9QJY1㕉-oua?Kɗ'2xl$Xs	Z*m% L[ BX\y`-]׳ɐv>ޣnzAO/ߙr\x`k76!-&޿ü8ô$6}yR@(%_HRC {V/
Sw-9#h7JHV(l.S,ahF
g'&dS
D2W"-i Aj7|$*VкVkvR!`=nM.!B\lUDJq6 /E\g4Á[ˣƣo]m$uo]
:O`Gᑦ,8܀Q I4wz!)aQF
'<:HWf>>泶M &Ϊ(!~vS=7#u8 [̌+sƹԢ@R$|.'<sr1me.3J13/E:Ě2͡a}tBG]#a(5fBl~ (@j9
6/k!ds>
Jz~gkIT>Yk$TfA3:}p<|{j@`z `30M	4d(ȾG4KDoAu0FtRD9f%'OCCIChS{A=H{&)LBăP'P$3őD+*t
!]}
,pܳ(c*:aE/[/+u*+m?t`wKCb;=L?&OV9TP^'vƁCVfPE!Xzʫ|]s61)msU j	y])ƋzON'Rn)Rx1{Mڴ_UfAO~}cO>WMManA[ZM	7TVg>[s)\B(95cYiBÑC"<	G9d8~G$< dۦ/(\(D4g? RsMOL/ ֨fѪ0ʿ~E&Mzi&S1͉dbi+_+~>@OB2GZʪ[ѧe|?LrX&	WU0' %tfFЏ֭ţt|e.DPD|;lH7BR[;IaB [`X')3^|T^c'SD#xl!4'FJFؔt߂8GDlÔP2f&$[!ރ
xI Ri9XA)PR4ts?dHi̫AjqlC,
'h9D76lC{@$RuFϮҩo7mNõC\n
?ށF#*abg>U|CFK%YL)ϡ~#BPra35'ZDy85t\sL!t|m[~}#HESh(Ql~D;5L#cxOѐlP֌f
 aY`^h9gGnkSf}usߒ{"򙱧E|cy02o/x?Z_,6i/? _j1OT(b	)2)gOtJ#A/U8b?X  N<.PMcLv𛀠5o  x#s+̄)Q/jiʎ,SPZэTUZ$gR\~e>i]@bF]֑Y[?YG(y!ApsR(p-nOLق%9r /;N3zCXrNwω؅	{;@578oR}ʑ`'JHETJggٓFV=sޏoQ*TdES?xU'KOqBؼ@vY@;̥LA׭{=Χ1{|Z5gj5]Hi=䐁+fB?Kgci֧
b|!^]1*2͂VΕWM]o1+W-7.G..K%>=QrZQ7 0[ON5 C250,؝APzVSCi(\<ڈ!o?M/}'leK'x~EwMeə`7F5Pr0bY^`TUfusC|/Kqֶ׋!k}c3}!rv~
5,|J S0#J)%`q.7>`$!`'K5Ȣ:Fx>H/vꡐ]\7.cE]X{E.k~ruUybeD׌~'!Zd$=2g6׆dҽ |y]nVO(O4Vg**v` P3+!H;f6Yw` ^<⪁*2m0~o!->4$vG76#	I773EI{xCS
0<Jߒ}MQ~ ԧ3) [j^7DjO+<I :7Pmwג05sa)lszNF>3x.Y9?x,tS 3s 9'~L3Or$N69 /?JEHi>#cFZwPdֿZz. "y7E#>EuAEL:	ǨP[V-V,drfs׺b?r?kJuo޹I{SgLgE2ȯ{eel2ދn;$t8
| e7#]]xoE)u3VJ9]W9DxOVq5]L"{w-ȵD4j0^9@xrܝctv<|;dǌ4ҡ[4bD.62IjfZt ٚv}2
אMbk3A+P
!.ɻ/ L645\NEzEJY	SHv,^6I	FXtzK#ȍN]j[Iac^Wi@U79sQ֏Q0&顼fE0QA8eL6&\LWP D;
.w
J(y); M!GR`_;<udH7Leq~f(up7GT_?{BjG_[(9_koF2a`8|P^Vg{r`,pl4@
"`
N쑡sj(yX\:/F+Ns4N1Ў1>V㒐9lΠv;tp1G܃Lvާ: hRJLRYW4!R[/xc[@CTB:yꝷ;{ΫiƪU,l,̿Mƥ&qamJEslz*M^}W_4F&58q;Dۑ,(R@`R_+R!x	gM
%SaΞS%wzWp`?zhH-җF߱ŧp2GHw'e:xPV=|.
ioȘk?'Yٰɰ^mkd.(Z57bZk{T}x"OL,GbĞlnKmo>1I>aQut"<	xJ(9x :gGG4o
MOH3Eh\y>J%ĩ?YoTeupxd=ymlH9#\Qe3޴~">+|\' z?3Gupǽlpm|ye<G9wgu- d|ܝQywjsyAGľXɸ[PXLʝlR^'w5S?{ZoOD%-)ѕ5ىgIMU #8&(oQQ{S}]$ݓ}C-v&Z"	dYu	[O|j%{avc'<p9t(-ʽ:E&Y)qټ Ӷi? =26ѧ-QLxJ޺drAi5ў){Y+tLbG+Nvz ]+8J;wf/<WvR.¥)lGb# .rvԓ|1 ~욁d9'D	4J/6-c}.UyzފTζ6o&و9db޵V
G]ȼ U1 's`;5WJ<,^O#c( >Kb#@TԣU:Vpt\vr^'zfBVKWI2;@=8w9GR8TL7U	Xòn)Bq#kl絀{֣Yb+IFP#yP;)8RZ[Ng1]=;(trRF1Q{ʅ,TǠZAH69i0hh.9qܑr3ZTw3 QX&-DaX:Zټ9t7wvKSb.tdWdq̾6њϭh3<𬶤 ͼ.n9jhŢ>+5/
Dn2W	0~ŭ2Iē87/8goGJtw/u832N9WgR	܍V[/K4eT=QYliq}q}M_]C6R\
a]k蘓OE0+zU a3i7waI9F@Z	LR:^dSQa~ "&O̴Ca8?\gE2</w(04+&@|(WC41nD{ZC5bkMA%;@KM4N_$XhtrN?`A9EOMtI3p'ڝv=E|e -."ןf31}vse8tKh8獗{v3JJHJ+>IQEHfdDB0-2C0
?Y(Nfn依(fLu6_Z *:bW͘_hNH%#34`˙D !wgu}|H0 2	.tvXAޱ%vFn5EaklK>XΰZٰ5w<×CN1dg)K/!TxSM(̲ 
a~L7!G @"x.6CnTԲMssI+*dF0R`jLN~tI$uW9?TG`fml(HMpmSU25݆
<SM(Toزyz4;5ӣ"	I^KrCU˜һH?R:ɨOnpXA/bCǸh6@P8]W췤+3Zwn⡥.jZ~S_|N(7S2(CsD492>r 8(ŒH:	=CʹP{+'`6tL['}2pRA8 n]`0}nD˳mT a3 J2?oUWۃu:^P]Q"uӮ`nH(+f\]ѼMKERzt$\}Fur33>,ElUmJ\|Ѝ)e\wy%og!AL_ 7;oM\_0I1"bܰ|魡N(q0g ߤ fZ
 QST  Qm\\ d.j3"C]Fz |G3!-wy1oK`$jP ^81(Wnl&4+@"ı~N> XY2 |\P8W"ׁV^Di*H/[un6
|N{xO?jCdNHN>W	@Qz2uId]ZP0q)hfwk`9N]ఁ@
D)a+ׁ\uۿM6ͭQcqE}^Di&!j2taY)}.,}@͔Nvy)+4H'3/9r{pJfk1M2ųB~dt%( 5aqn`ч$fЈ"#߈닝lvhOlƟ	As85TSZ`(O`yV5l=H``[:f ofsrE<z DFbs9rrlW/66l+ i:Eg=mpg6pP!]WUq?.n|N!5MQ령
^xȣT<Y$Eƙ0|t-;y<^_y,Er/BxkZU#E@0F>`cH
3#3qLP!`{Ub
HE8n_>>=?'tux)|Yc(#<$PFUE3`$qhK/o!G[ę3!(_O[_z~Hs*H}Xh?xU e>EV\
 &t ?.:v3IOws5SZ-]T`IYAº\_z6a0i.+%:W&d͕	7*B%]IAzH,=P誖A.6Mx7@Ϸ=.zNN1bN{s	bEߏ(J$e/w?Zgٗ:6SvF"jm*hWy-
aҿ*[C 	0<}a2Qm@S"I -A-b'}jT)8ٌ j&P@+=)˶Jn㰬[}jMYg<ϝ}w׹iR J *6%<f^='i)e#`fƿɋa:G̢n(pKR`2b8P.3=n-VOoZ#*B9cjk42}x(WN:)j$/$Y&  |`3Jf&N.gҐqJ^0\0n
 aIE>KUδp'b逘[3m[g7^{a`--2٭[ ZܫF9|j*.꥾vʣ_UhQyĝKȵDz}#O{OɁB<Ft6e S	yy*:?kƁgLa槟2U1,^'1l+_L/dc^>c QdXjyW25Q_ѶpѠ\2+,ϑWqQz&Y;ymPšҚٴ,lh$:QT+wǤ!sa8~`rR 6IeG?@cx:JY,+:_m5?LѦuzR{I7Մ߆G8 V[%B
sTAEEGk.g҈2|_mSjjRU8a
SQ^c|:2giGZM-1J=52mA
u=ijF$JUnY!4:2JJ#'A>}h`
 HTI-*mx݄p{?blk>W^I\ZW0ҁ1ʫ`ՠAU
v[Ǉ筓7_$xsxzvfm_S_2ݡ2{lu:*>৉'KрN2 Ü>@f):CMGF6 l@tX"<1+6;IA&f@܈z7T~ '8()Eڂ_nL5c5DHsn)8TU#Gtj7Țr]iTua!Y5CBƶNfSKjT1S? 3\;k"$4xTp9Uap''Ghl 浥2E{HMńFA>6K*z_;ζS!H!MV)ZB/so_Dn6U.Hs;&Q}R[ݪO
?D
Ifz~qV~HgP^jD)hnTpr(hffE$VdU㦭A4HYmYU
WIw$^O4Ext!",^h,1J ,jL4R\	nsAB,D_^f?J`n9B-X1(7ӁqIX+y*q-"O!S/CzgɀG#*'<30Mzi7Mc}0I_J:VT|m^Ny4ʢ`OcYńGeXJK!DBmw/^{|!^{{<9x_wlllMdKX > X)j?%Ӝ|_Ԇ{i>cgd4\$>@}xk	cğ-SN}qgf6<}43N7Ͼ{t9Is@6C^T఑/
G\;i
LgHBa1g=ٜ'|/?`ǆDHA-yi<JiP4']te7xO~yMGFUg]:ՠT1;`VAyshWMN>M4_<ܺ3n8YQB9Ԅ9jM C$b\:շ+D">HXwH;Q| >R|ƴs`v7?"{;K5H**Mja\'Gcffw~il[5U|WRVl9%
@;gz]gAY޶J3G}c#r7gJn@fIE:xAi%ҐeӸj;޹R2VQ3Kݞychl?4\'I:6.ݚ<vli}sA -}d}wO0}xj1o%̿Nfg+4Vi({O]?,N_܉CْlBz?vh6<.m+EXFj11;[[i:1L7k}>Ė`n
~"|:H-"  rFd% hTh]r]*)#~~lSL`KC%d.x' F0k0Ѭւ[5	2!I(C	8:b/%EJ(g(J3٠i"([]
ƈPi*(wH"ќ;['_0&HHLA0Îuzwk*"\^ALҤ_B&$Hq:7Z]
9AA累sf/"^#+zK䶞Cl},	hfs7$l6QD2]巯ۆnIuC)$ 15b'PN_l
怶ɶp8V#Z33_&$f	n>wOC3_^k 7_tώK~okS
:P|i.D/X,3R@醅Yv}w
\#hpCE%2^~mzCo$(H I2vSO02!ܑ&HQ"%Rt|n.YQ_#ifh3֮solu'$Ld:-mo%,'0hR7d
N.޲"6*7'HG'ȝuYx.3gZnɩytD-pW^Վ_Wcw?ӁȦ~jgl+j^3qeF_2(y(|d]izE/Tm`|]ن9 ÜQmjfLEmbd}Z+n3oĥʨSKeJwll1=FIc'u|F)jtwF~QO.G#{CcLݓBecԨʵ,)}aGŋjvA$m9[$MU`L{Ŕz1>`$L`WGv"jH*Zoƅ}Jj/|ȘSzI~02qHTS d<f
擘Y"$[ æB-Qw%\;ާX\OO!R)S\'XƯVAxN(ߙZSԛYUn]K	~FE20=!1gIw~%MA]-x<rQ`%mx7N6F5y4\*+C&wK[|+hi#˻?޶~>=k8lpP"}{p[ YzEԼcY~#k:	a[Eg q}`ޘ\׌Ɔ{͕)Uv%ձ ~xkR4[APbF)ufx8&½N8$ov,&=ܺ<qy6vϜ+lKE$e1D|UW&ÛNz[#ǈXA()(|oafM٬3%8l	mCԠ$D1奍dM(Zbb@Z)4(*̈́=gp [?v^U}iepu0wW.kiݐ̻.N\$|H<~:Ψ@7:a	>Qiڋ}Nd+_ !w}GԉBpk-0>P9fq[QVC@##І^֩aTOhlr\//hJ{.;̿Pzֽ/z+葅tE@`旭w u]v;|ˍR&1@`;yx1^WzIoSx'{)|TԏdA̦V];qf4;#G_s$`0 9Who-Cb>
OHEO}?Fto<@l0Tqv9qB=}8md[D/csсaqgB5JCX(	4 k~_N
	W|s{dCӉ246߻KE5:#Xf*X㤝iQdӦ6)YSҳ鰴N};鞞g=};;i'G탞EjPph0Lr+!	m.9s @}	)UْlI@"-O<QقeL}XSfF&^p!6OzGzk[tJ-o{R
n[޷6U/x0wfVx3|˨ႿihEU)7FsECK&'俯/Ptro	c 8QT, k4Ynͭ^䘁 8z3t3Ԗxyw&?D~|v-:v+@pA	T\0Di#=zmB@	"ZQCy$U#,D=>#CTdYؗ?/Za=*զ#?׶T7*4A3KUuߖX*͔/ՍͳXf1ph
hـ]c	@9v]?븬f y%/^ uz#Yqxox7qU7<FlUG41K0M"?w'L+:ug`YpUX}G~yN=v1ek{o}_ĸ
ZCz3,/ Cr>2`8RcCcݖl}yVwU]07ښ~6p6ʠUOx`/XHm)/[w|~Lݧ3SgnHu"uIuJ]J}Z'k#sІ]wwKUgFr]d~Mxm	(t-S:I=@5d={@a>H*@b	 >|S=T7Uv;T{l7v}xY`c-l9ܻj+d~ 9]u/qTfI*39w'SG UQ$=RSieV|6mY7yj:X-_^(</&
lL#Aapi!8sv+RSאϓuY{_f;	g~v -/dBM(k0ݶ@NfR'i)e6E
9Phvt6Tu-PTr)SaTxԿ kXSp_#!{x76&h%(QCZ|=
7}

|C2/1T*2TR3Ē_@K]gMYz艙2V
JY+1_m̊nl&fQbyeJk+i$ʈY$hlQ3u3&?h/PݦE6S&Sk10f迵C{"":+!u5 N8@A_jld.6E gJ}	
 8ķLzpcHW1QCSf[K2~TJ	?ZG0<5X0:Bgyᚨ\2s	┷؇RI	PA[a{@-p4 %*]U*}ݦ.4}fQk(yOĀ]JIg8
1DD>mtnBcEcϽYiSB/qk,QD	e4N C43Mƌ	&oiB4e%2ZgO4xMփÂkFye!$H[yt8)KF?Ta3N.{w3t;?1Kw'	2<;٨ݒKCKv3#4O2bTЃ#\ؘ!yZM	uGse MG#*T(2ȄAŘTݠc3}3:;U'K4icM9F?GPCL+9D`AΥ;͐,jd׼MmFiDUHKճEV[O3E٧GA/-(:ݓ!slA lMCj!=؆
UձTl~hc&u37g;I}j[$<т\qSBf@G늯wKi2BmARIS\1\C@s<`3󱯚l戁5@'/̻|h)u}ަ>#ÒٕMQwX\pN˧Sr]U0?wŜz`ef|v<]6ʀcyD83e//WPH[iu7	&$ ?Z
{RNQGDnpij6{?WKJ3	2%(5+ROE*<nEU_qZoyrdxʶa]<0QS T8_:LM`}
8P!X"CCEA*(Iy'Ax)z0Y"W9r3}R#,$3Ru+MxU][xn;N|ExzkAზ]P_T^磑\A`K߆Bاނ9Qp.9g%z:%.YV얔AqcNNL+Y1 m.{ ~&\9CIw/2lOS0~6?O{$/f/n=o~3ss,!cCS ;D7I,퓝P0Q;((|֗pA{ïR.]_!6XFnXLK=h)XM*:;CH 2qUtifZ*ձ\aƾYR;޲}kpk}V-.3ul~!Sv-ǻv0ǁY	U5Ӿ	Wnsֿ\MJMEHi
8A'r8n-8ҋr@(P7OjMTx>o1GŪT\wԗ\DctD!+~ f$62_;g.".:Xih6Vˣ\{X>>A6 0%ZOGzHNjadӯ܀B6M@u)RvLXvEJӂ89zUHmyϡ/CSnl:Ա5iw%[}R4lc_3WO]^mSo<W4;򘓭u#)fO7\S`8v`(]U)/x87>?+(b\;YA%|n?ٜtf8#w:	;Y0욋IǗ 3&m%%2SROûf׺&>_x߉j>cd'CX>t]O<ˮ+/wUE9@ս&!ߚ>JB_Tm3X2*.:lx~Ywxi=t[-x
yA!8"~	g*z+{F4CƂ6YHmZ_'jv+S3xisC-w-̦OOgRcS@|:	sxU[?i~T?I!C`Pf(Wa%0=EV)V	+wlAٲ=GWhr2p	+Fş '8͆X@.Tm)18¾梖_	iv+(j'Zգ6>͑zgI{ڿf)j"i|ڻ#&겑}U$o9kdw,`oucj2{.8B햯dC~d*O4cPȳ	N9Ry-To`X#NO̐j1TzWs,fk<uOܯ71u3֔ue%K6gP!SWJ͂,R'#Qƴhc8ג'֧U7|#lg<):l$>-̮x"G}S{ @66(9LC7Qp#ghTvC//RW3Q
ފ[8@|ȜRBM3M}r6Mahi'iGCshtob0gL!(B AE!ue8uF 7iS,k0[8'n(JbvǅP6Ф\~X^MR<D(u8|G6{);loY.=X$\dW|^VQ[V__6'~<twb[7K(]Fo۱k_1hhnwB,K&h4xIZSd8AkNUgGUD{G@!ڿ8/DagU7@e<78:عftba2[
D툖KR&W-@<M=H>vuCr Sh ڊ2Ó4C[̽+ڰU3<=gk5P)=⏯;~(N}YxfEz)gP8<E^6 HFcTCHھ U7-6~/Nl
8 px]OP<ܡbS99B?XSC*ƇVCs~q'Tf@X4wj^iBqОuhVt7 .72ЈefzjKhLaWöșx(,w,zG/~JZ
*آsGFs"	1v/blq	q]IA1Xƥ֕tվ$BKI7JSl!rM:=r$C7q2<"vCdC-a>.h@pJFRb X\yþdi1oNu'}Ou(=,4"f6^2yɓFt^f󙏛&qR\'5ʍb9Н<}lkڐ?A5hO4*oJ@~{2AvOA Gߍm#I/&d~ה]1$Q.>lxtbﱸV瑼%#MCq/Jӝf^[KڹH/^2q؟ N:|x5Jהk\٧k+df7O?IPu*)6[7WF0 j|,x Q2r)NReQ*`7GԳGQ)Kt1#	4D %
%usVl'{-Pw	Q0::V9Mm#G85	 Bn$12Ji	[ )S(w~\YwgH8v)t=v5Nѝ9tԟI^v;utZDUcxBAR4Nrמup>.osPcn!y ~%ie} նY,>wC4młwnGpb[9L:WɾNh]
reev}lɺ!Ե 7&RGHgufiN\GT֌!٬46[f\"08H1ݢ=NQ[R:3~Y_Vh9ʆǖ,F?;N~Kj߼p'0򸂞4efwM9(m_%~aXoQpSܪS;%֠vOt#x"7	uF2VA y9\0[U~#k*&qkw'[jA7M΍2XO(:ߙ<V,Xá*JF^yKf{Jw Tf?zG]x=bd'2~	f] >cAHxod)z1!8v^DT݃`UZ1J?Nt&D*Ywqi/__ Mm>N~8D0p(tsݤ7LLӅS<(:<֐˯]'I!UpHsq:@)ˠv\~ P/^]Xp'~nV{q #B~MgŚIe̮
Ӑf2kV$`+\˶B3Uߊb~((brO8;z񣎞WľFRQFcL~	{
:и%\eei
L41[fͽ{ޟOFwSp B W~	Ý!N⛊ '~]9dpDLMP:~=88m3Cl_D/XpD0KKF4J+mٯi/n'4뼀"FvhXwF%0 ;7sۿSD֓!\\Z*׳:!xUkؐf>;|)RIC=>Ӝ$6oVjی'wZwN*3EѻA]*qoҎdeg;Ul&9bM4's:**r!]EOawɣLEV 89Ïh:O3Q{KRnxo~EA(G-2,YE+l:6K!@ E̬k
䓸ɆuYdR0~Yfn7)Kϫ/OQp;PTD*Wchʒ7|4C^~|4FV*`Eҕ{$]bR2w#\)m~I7Pb/sZӘ&~!4NS`	( %P" (f ̐qI-lf\ʶՕ$kRףf}(/X*n>b)L
vH5Wi;m3sQ.QJAnuγ},[<L!p<U{`Ic"*UNI/y,Íź9ťAK?'W*`k)g/MaOHƹĴBװ']s91;4)	cF$YoMśUYltfSfB7q6>'w^ܬڗ+2c'|nO}`sm܎KN:4yxEs:@>׿m?ԓ[QSñj-@Qs(.a2\b/v䞫yg*5^p̹)s.K҉Y/;ኳly1_N"T0d?IHNgj& ^<G"md|W{:6PFK:nk @{nuv6<wwExr(&S3NZt1wGYOyoNd!2N=H+X]6:m1
6.S׈l
/xJ9d1/ѥzUWmYa'@mȑ;/٥OŪޢgEѼGyMxU!ힸ,hZ!wA
/O6hL}8R"z>	)*SӑJyK򾻀*r1RcD?VaXwԾ/ TQ-F^hU;w`IQxXh jIZv⣬ACGi3)-TwO]9F^rHjhpqm1WnfJZxlrgNT#ыm2zTl~cSTno^g}0UNY/ݷqTS Ay/hn+ʆ͚۫tjݬ[cRXONڧgGΉu\f"Y]֬/~QEdU.v=qƼq
uJCPzf~dY*Wx1
¦"bT<k1	 Wy9@;

05{"p fs)FPNmz
mAzA'DAZ-~1qܓ(퐺 ITj+;*=%P!EXfJ@? -1IiN,sC<&ZO<#Ck:3rIw)S<?ISʓ)7im	HhHO`lFw(wex@fQ^Dg/jp5Zey袏 [
slWib|9q'	vxKG>1՛90r)i9GTpև\ټ/hЫPR.S,5	7ntۿ3p1wҵ'Ho;
BRA	(
ߟ&`&iME%f>}wr0ujηOeu`+g65[<݈,9 Xutjlg 34('*,aE[
HaLY5/.FM`g_-&!SAսέuԠ	gDfOq[Y\nHT4.M>7nvP僱qSĥ1N-3i5rvCzf!0w:hxDGǉ1_la?3hZq_NYDsp\b L.!.)]\Avp[͜aѲN/X>̲GČN) ł
4u`n&~A	pў2)tOA&ۨbjO2slvwb0'
$NԒHd R0An\yEDf~jm5bB=];2ہE@p}EuFy5za<xO)8;B,qHRʽ͌]k(8'FQI,HXcЋuF#/y:zlZ+b	RSw
}Tâ"X]#*1G.{s׫p.I$BSH5W.[C[az6JJ}ߔac#=ʛ Op9\z/NlHTEE;1+u^5MNJ#N Z]Z]O
JNz N]oC8	*!1-CP[4Ts@snD0}~9&A-Uҵ4Ia+_,Zhs[a`zX=z[+N=NOк|i҂S#Nr]ՙA=;錐fb
>e#1$F"<7t)cp>T04	4f=GX .wl$`+u+cs
qЏ:FÓ$G>igA5\ѡ>,b8"l6L*Fd<f#	)A0!efm:Xoc)r$N6f}lJr#|MY~@/F(%$GlcY  G(8	!3_ȼ&гN5hN[gn?_T`yL?o\tpmEGM:{k8e-"T}E{a>RMKT4*4VЛ-pabN¤kK2HGГ&5_qV&\(V	6 hSV5xYQlVj
۔pANKD NRF|~|jQCBw$ @Vk1.̔l~6b{'٨pus3i=7RF%.?`[(Gwo	Wk攗sl|(":3,fJzu÷ܶG*^Պ02f&]ˎ+xޯH{|q`Gj^-h5qxɆ拵1oe?d55B߀. `&OzkaZIDeb	[y ,2I11,h)VΡ>#zk2IÑEw9FM*	{
)v%f7Ø7_@H_S]"MoҝN\LaM5ѫ3JۈAfn"Uw]JƂoxmk4<mnnF_r	vgBb@dMhKЙGd{ѿ [!:֥Pz8MFf`uOH"`i&1 *!]z+H]'|'i㞟8
*}ŸEgJWz&w9\Js&Ya
{P	ҵXDZ}t::7]cH@Q$tk)~D-%%&Z	~k&oKzVu
` {[SCzG(/x`}OA?ވ`ym d6	!iO;`*>ܽ%|Ά {5.N\KMhy=uT cȬ^
mdިf=}ɥGN7CaaBf.P\-PU`>dOGחB!~Xyh{zNC)*FZЊRy@T.Wm-lQDNI
'J;M_	˭$!{բ	xH9nh}cbq@0Rޮ{Ss-.XX[Hʠ;>b>UU,Lߩw6C(%Ϧ洝b\N@ǻn+icSўLPCPD]VrM!zّ>:( Y%=,eG%7|* O=VqZ<ε7%_V(ToNbjfR1o`\,FBdi:Ջ(pƴI/lmj-OvSjhdѸ)yP&:%XrWzw؝Et5}h`{rU6
N"*d#/Rރy+mRDyLzhsp݊Uw}s=+KʍͽFjb6*)Shm<EGGW0cK&~ej$9	Ұ\MˊhQ'<:?҉
~,<ћP]l@MH͈;||ću]Gpr#Q<H$𲶻C)ls+XXƪ/!-)"#_{I-ʔVd'1TIa:L0
kVk)+|۶+"beGaieI$74<(7ٚnGkF@ǸbeRs"9
FC2^Kq+DDSN~T@yvVP/1ϸ#$Z5P[{ZHwې|r)Vyu[thsxgA-K#`EHa/wTVhtnV:	Kز:bgWVSՖ8)(7(Bώ[6+`R_Jq8la#hn+;>3|I*;%|ېg|?]a%3c):IkSJlbjE!ϗ4o?Tvߪ{Ahs1b\yZ4"F>ao3}п?_[lg퓟 r9e|
!	#v3t`ZwYU,8J\geo8nK9TnGL/91q4-J~4W#Lwϓ[-Sa.I%Hk	0:)#y&N4Yi
hrN(<_cԦ>s5p:ϭK0[כMZĝz G-dT{񣮎3iPc~	%.TRh~gY*iҤYz_<rgv?;0ܰ/H!J-.)I1Si;NT^Q+=a'Sj3l>Fnd*j}.czG5_~ȣڽExv Ue*w
bYpzEUT؅o%q`C	ᲒAP9ϟj'Ywn⳪6I&xTFvWm*D}?x1]}%20
̛vy:wL7]`0m.4G)ITN O !|f(TGivۤ,E#LAkF'Bm^Af9A(Zd-q}il-Ay~V*TBlrN0ׁƏy>C
h vk:UT]gc:P/4PA!$N1}4?r"	XvmM<,}Ok4Tٰm.Xr7\x<	T=a[$YU(>g+9
8Ob:QqVGt|bɆ>5\Q<* O#ZvJEHaK|.b!굑6ܰR_Ez'^Or՚=O<VTE>$_τ?d>8b>x1\2I+ -쫄`̞^^B}Psbk T\i%&aDԀ^Ffjт9ׄ KM5+X{""D)|8&	v(#phT$P&dYt0RF[mчžw'Ʉdo	OhVx`ϩ}!qC#PZ}N>żOa.U0/ޠIөG&FS`+$1Y(aF1Drʺ$+}my޹Cp^FpiN`;WC|&c}XI7p p}pىIOU&-T5,^-3~ ~(.4M┙|TQ
é'p@+Upkn{v䬍Utdn
GE:슲0]<jU8HL؎C.3&بrLPWWXT`l7J]Nl{g/eWq6@(,<^chh
Gfee0Y=iIXEgXlW٨ghIiP$1
n Ia?}FGXSV?ҳ5+{wF2(hX$b 3 '`Hijݞxc&iz9/ZTެ}rO1tM
gjGWuTï<=]FMDY5;غ 	_;BEɘ深:hPbXVa2C4X T
@6!C\;QȔq@M_=F:s!%N(􁸒GtJ
ʹsSs.6<XrNU0D@
Gn68OC1Y!7|Fl.F60LW{sC>`Uâh筣#Q6C\?v;y:a>95T9UWUh>=__+%)*	,LDIu8cnKl:# 0H:$DK%R@Ct,7ڋ?H'B%!f(s총o;iIӧu.A-,n]u<W:ܵrٮoGF2J Ub|;yoR]o_j##pGqSGǌB]9<~&}DMH-^.8`1%G66Ka^NwzUѥ
|%H:	d6эns.Z./OLKS3dw96iF;mȒ3 zaN[k )i/駟TN2D?]s}Q_=8,A@K#nq`#tѹe:0 ]=i\
gGB=XTR,v̢-@"uN {t.\l~6ZUVͻ
(as7>w@ȷ:%.+oOY92
B$#]Ӕt@ـd:Di̩Y(זMl$OA~UEQhȼ DBrJR'
<%aO~m]aͥ~@C@W]ĚT)1WҮ	څaIx=ƃ|'4TL-(0U-6Y.8
Te_#_\E>cUC|z^	3V5.;ֱvsݱBčN}z匂j<3tDP`@E')Y5Ԑ'frcn_iT"MYϼ܁s	XI)<X?oؼ@|>4o5<p/HXs%'@Omk-q	`A(K5[Վ@MxP`0C6#TX#i?k!J5n-*(1"!<wFg/3l?Zk200$8Ģ[FǬTdS<:n*jjɴܴFC.>h`͈KΥn{FRfj*d8,y+CGM8ٍmT`ɐ/(aV=0 W%*}ʝQG86,Ld^,$`X)ZIB]B`W=(jf*BoHER(bгҜvTm>	<Pwf(NEoa>K1=V_Q_NzSL646I]Y9o,އ|#{QjH^[@UDcA%VFt Oh%K@-U*;$pCZ''>jgq5A^Jg]ۗz~Xoq呼ײxi6dUTa@NF\YR®gћ(/TOiR:zIϩqYBEOJ6+{HYuƖt`wJ9\xR.C@jtO\
uj^2+'sV{׳F4+n)FğYoJTi0T~fv]cŒxomb1ZRiuU}Ԑ?N

dD`ʹX̦b{RI2LYlI^;?%̔MRmblSqjAƂ1 RFH(lPFq$-ec@j.fozF|R0Qœ̐2|]aI<Cz*Tf70)RGzCH	-ЃM5p@{%RaaJ|41i'%`{_pbP1[d}#>+o͵ )G/F/7U_.:uϥJ)'`\zD;Ls\4JOYS
S,6|&E9ߴ{VK Gb[Јp j6v]==4J!ª߳LUsKPڐHĪ>5Bξbn=[3_T!\2$AF~fIkPvZuM*"Yq;5igbӁmEQ2$*JzD13ݥ+GAScS:D_cvࢸJT蝅9WNnEk:6h=BNKQx=C8ҖU^>QcLWOoRIlyFi7~0y>SN4b~|>2um.,eh1'	WXVIZhdMe7η8.Yʮ xlSA%H4$;żM) 7ٓC [`2ޅyhCg}#Lu;@WwJל={˽hvz%>6ۮ̕71b	j!pvALbu}tvtjz]>A F/)ːb:M4qycPjHܬ&O?v(_i>]}=X	J&oN1+oZU`n˭10ӥzj4Nɕ,S>fso
4˄מ.YjApLԀ)%f= QMt\Jfn
w@::=Gsa#f^Y-ܗ{ù@}!?!1Ug]ёaaTMNVx_^4TP?,(2"K-PjsMc
]a3r7u-:{c^(3lZMmIglt͕^\.#"L=y 1?4_pm"ӼDӟOWp.W槃-v/r)V)FOm+[{*:/Կ"3h7e_ݺWQUvưbKj=aVdx%F8@d]_SJ$pS_߲EݫQ8JV1{.4r2][X*qJ9nݑ)wY[Iu<a+	f\۩>REZoz	 ҜXڜ8✔s%^ƊD	0R v^Ց_WDB(kUHn0J͗mvt3*b᪻ZFrQ˱$4;ὔZm+kR@2шQc [%v;a_mmw>Z%;bt6)uX:+3^]_%yrV-O"aun 2@ԹNpRט2.& 4LB"8,)=IBpe,7{F|~Oe ;Mq?bT ֛9nHDJNZvG@ViuhHRhcX[*lPѠQ)iU_lL^~3<􁓘EVe~˫05_2ؚC@yf#YC%Fؤ1{Մ@9D7.c1@{7]G7|<#tO@CRCHw7W
hnQo&Y'nc>Aښ!	ftfAG(֨ĺZ^txbcuss,<Z֫7-POMg4sZIDKC3 2i6݄9T &o4A{)׿nk!^&Q^ kPo1e׬,OCG	$bAn*4[.\:upzq{nem˰7X#vkP2M&$fIoc,~:鏝Ҡ;1'5:kXw0bX֣;u ]DB[*]oU-<!oeQD,ɢ)2sE,M
]گ ,H&k09i7y!+<.~^¬Xe |_DmS	,U<=@ǹ[ϛ,_-l2W@J_}M(Xly@ !dTS*:roc^6nr8Na9xAJ[
i 6_M>=e8vm{5j,O[[Tm,ܼU"G,[E"6a%{pA?v(=0, G)ng^5N*0;|-dc;S`1-8* /7+fM?_YX=wLrKԊāг49ҏ,LSIl8pSwhiX)2
ϗf)!apL&r[K^X

)+./[-44DԿ=I;E8Q˱Z!Tlxc{uq\]9ğWSQ_'_}_b([Ҿ1o<D`M_Q&v(t-yzfr=1^랊fןo	"QȳVڿ8M,9lT%1UE0C,LjcL  }zG@}Y8:^ɠ]P8J׊:X2Ҵ׎(=yDཱྀDJs;jN:zyhԤP_ | 7	H}I(Ɍv 5𓔹L0ENMh	VŨ1N,Ƽ2 ѶCH4<O7	xߪ'Aq	J@![6vôڨ}UX| 6:8ܥ cd0EPzo}`T;9ḡGGBR~+})Cm؎b$JMBn4rj$ه2<-<T;gڃ3DsLcf<фdz򾆏G>m]1K.6 /,i>AOv}7Ў{F˚l̑/&m|`MahFkc@b	(oDsy2y٭J͛C*h6[z=(k~2<,_Ř,?!\yP$`R=tz2y?EO
8a,a2
?pf(NGw5诏zvPVTiӮrrTI=&vKZfGJ6Hm@t10ի=VH H:Q2FhBV))"&p?B+(c";;ˍ	,<ϣɞt3c'_h )J+!LSH$iV`,+3Y
_:, .;=aQP0oXE WJ29"dolJpBI.r AmDl2bARS+
u9xܛKmۚF]%LOՄQyp} Au@Q؋3`*{j.)8&:nuC*3b5cɗW@|xWCg/ޙPTx]6y?.Tl>z[ȣGf%A_>q!F(7cs$h$\E ͬf7D²zHE'7$$#*yD](e)
&a^C}@iCBS(F)>aV\{{##&z\`H|>3Q8H^\`$,5EcffK2=aA~CP<3t:	d @x~~c;#ob!Yb;l-*o cGsbP|y4b}oh/dSFǐjCƳ2KC{N8DІRq*<IǪ^w|BuXʘYky`>X%.//lv0 x%.ע"'OX٣,Jx_\!Tr5k3{܂\3ð5}.'࠿!D$JYM%zmYqIɒ;r`}ʄuERLa"47)&I-as>?C<x'҇mcJm?*";b 椨!=yOk}a7]rcm.{ 9m++j ߖbvLjA9֢<VBF5u
nӝT
n ڃfjAף(JYwp`c_5^nG3]XazcJæ=J#[^,>x0X46^2J;-tivia'ʗ6fK]&o躙zUIFP40l:SqKsP!OӉ+a=s5>7tj.kG(Cq
(ߏp@URKe˙{_2,E}3#I0rQu¯i3ZAؓn\=2C"$E>z\$":Òw
FÈB
;)FqL? L)گо3hN_S4b:/zrs]MlR/h6(T4hw2nϸv1P'siwnέaw@E)ibh~olk!9701K+aĊ;zʤoԦ}޹EVhFF}$#݃6P(-bzwhfM\_?JS}٧9o2-,mN{id?cV%7M/CJ<pbލӫ>䑊
lYs+(%	u%}@vG3E
@Ul0 PǝwZ T3k{Y M	J+eg*f2b	܅	%<ڮ*?JKAjI' 1lR4*h,h&Ç>];H4/,^7ca՗1X@XC +3y4@ˁDˢД˟c%KYÃ.5~@[#,0h-&dFo5Ϧ`?/7r:|4.P.+B+wiEff͜Y!ZGsSeCHWk: Cͅ~^9Y-C,eG_oZ\L]Va!	i\/jK\i56%_{r8kOt>mhi;ƴg'{in
/tq7 y{h	Lv0wUȥol7= ʥ;nq2#
r5[lW;N=z>-ÞDݕ`GLMqc7ң{TYy	FZal+7_Epǲ3}s=ғrVx*u@2{`"*Bq 8:NlC8-kSR`p+؃-G. }2㽰7Uv*&T3-A/?I]N*`Y3HJb3s%%qO
/qH$З{qjV|=381hAMrLMX*7l{OIa]}L"U`YȊ=eN2:$[-YEhf2@ʨY,lnA՜,c+hXI)Ku;%kR8_/@fv Y䀶l	`ґt\^m Go4e9^B¯=/I#iA)A}t[)sNv@ior{n4'Zټ@/';YƹZ=J^z)96HG9eک_dCz^^ Mac2Lmdr4&֛."IӾXPOXp<\RS|fCh %'JGgh6
ޞJ .jLG&F^Jrq	QI0AVķ8qx䤽wvrzcCPxB8tK}odd#m}QǕo(pw_xaP9KHWVb&n5'f'%&aȊ	|U꒳HE#֦)e7ڏtA*`FR8xSLv֣:pqj2^b<Hlh6-h	uٙ"`aY3f.PLS025V#k2dVY6*84v3٨<MѪtC9p?.0}llltB<0jʑDGoPEG"^JV,hyx-1&`p!ݺ(5nf㺄Cy2T]L
:fNa7y2~Tcf&KǺUrX-KPEY+'1Oh˚E9p}(k?+.!
Ljsjp5>oF`9{(P!!%JP<93EL|ʃxyefu)׊x!]E U>N9GT485İ3u)h%͒bY4OMl8ΔSK on/hèփ`c+YpvN GR//}?Ot*8Kn{Nsc{nҢHU`cY`M+~%l۹i^E^/b,rxmxlolb2ymqs4n)Rn<1X`֟^1WHxuT̥AU}V+:Єb*
.8%sMXj~c;Xiy.PTy{=8)[#B (N[e9Cʢ<AJ-{&r8?f]T$٧DD_A%ejO׶<H+}9oKW.pܑ:`E"JڦaE6!F=܈
*m_>fLaܚ?U8PmiM3/*V{V$Ⴄl/uJ}-"GUiN8#R5C/<w~	e.)*4	QVk
y8K~c⑩ b7Uj
V0ͧכ|f{g1xJv|%65h],w9PB`ZQ0C	WQ{alt>v#6Tc)Ee<N*y@uHhrC0'aG2IPз23a]zHsDBWȿYQ;k_"GnVۊ'n~z\h@8f[煢+YSBPX"AvL7f3qn2xʃ_STk:\u(=D@UJ^ cQTr^pэ6&ÓQ3E,.3F2qY׽^ۺemNeEoI՗{G	dK>1eٮpa(3m:\*R幭~A;XLyGGίV[9ډ޾r>Ng9eaNeL0_طMx6O"xm7 ![ޝ}Mˍ='B g⩖3
140uZ\w	4P=\;bȲ	u7폋KRnٹ0ҙFa/gO^U7C W]i]5.V&KHW8Pt+ k˵M1yt
°,D	Q刽X$5~:}~3'&r¬bR`{tvv̡۟cE~8vgr<fRSjMZY59Um4XWy!M'`YAPeVĪR:64IwYn8u|٤ACLXh6I
TKZj&ՀNQB824Qzg5(mAR[x*_kspF^QHyC{qpؓEǏJvdZ>辦h74[R'qMG 3?H2-vJhh&cl(Ul'/D~xNFvݙǹ2MЍؙrHN,%#e[toty^d$M<$mm1SSxq[QtPl0=_fBEgt|2/b[6.9('mO!{2?T3HG_RK Յ`S#NF#Ul7078+t &!@3F%H6"w{{#M $DlJPb<PG_L=Cl eA;<Q<VIh5 D)@ku`::Qݸ4ߒu@;eND-W\nl7|r)`[͛Pa='FRq+OW~4IxBB_ݗΙax+K!Jl 10DgQ䫠JI>Mo+<K !d۪Ybao
28eX4Ɠ~Ip7mpXNb$Ji>5LEt'teuR֕#>_LqEx,"S:yEZ'>thjD?fNY>3}T`B')%D6D)ӑ+msoO}Ntԅ:*WezDIΫ&ax<Ot4;@3|\ /?"*ـI/"ϨjQ-W:YL4pIa)1u<SL&XNH,JN4)zhWȗǻ{$aGs9̹hoδ/E'SeI;+!VފWɔ*N01	.$ʌpB|2+3"<x\rQX;P/d31oG$o&BST<.6e$/tcb8߂1ya*yEw4$8fⰻV@ke\̲ГO}|1	dd !'u;dKwM/qcVc;Q=q&Şo.Zt;K܅kF)~85Id}@Z|4KfR@DTxcb{q'35@;:ڂ\$HՖ6$fRX&^&X 7aH֯he}%FY7x֤X%r/Sؠ&PE`YXuJ0$XzwnQZ8
k<3Ap)b$z@2_|ͬT	^i%zVym1Go:$\B]Y{\ȳ_QwPha#4aP^/,?`;a\-Lq>YEL/v>mӳ]zbm	 H1 .)O2xϊN'.L^/jgXɄ
:=ӛ37#o?E3A+{{&e*\RqG83%jO՞S~	6I,s$lyg[d-dmJSo2nNYB
$o*'70Scaos9"E<!D_dס/ZL.vKBսvly: ૦J$Oc1OԼ/ݳ0UHQ0C;ӫK^]Q	o=C浩64FiQuf )nƘw0 8O/07KPfʖqcq 6xkeź& )PDQVEz;t5XP"a/`u4k#d4Z$zo1=g1h9E
{
3JX$	q%݃jQ?4C>saH!p}zzɆw%+3HQ#&?Q`
U(X#jqc̶Lʭ M,ߌz=I.@sb$a{b2;3(ӨЊ0[c!3je
r{rۚc:ȿô
.{	|pcs}ȅ<?l	-[KO5PlB?v%*'v{}-ywNp&꿇-6clp9)#//ؚ%$<38]̾"/HRdeB<JK:%B	QI6[ogטi
lQc8⛃~e6V@m涱4ә'٪!|n4/Tҁ]8hjZr. cLoF:fgyt78œë/(Q&kX#r ؗy6w-\̂maQՙndK􄝹P&4]l= <.I!ȖMuĿ8t4['. K6.\vlvW+R49w+r/Vy+N1+p뿗Wrs)gdnZGWvfq4oKr^o㕓wVۀ+lso-h5cѫymv]f3>oRE=˻j1ϻ7yޏ?׹礫i99\8zf*M"p;t{Agg0V-ciܫ	F9A~^TJ:|y1+9k1._#+~\ *mvŬq޴..a΅UqY?yb)	]OI'm}'h,@)XuPmc׮%oyDussi\grizvvZAGt%qK&cT0 
žKW(T#ګWܚOy!($Jb[^n͢?*8&sǈv"<xu$"UwR!TScV6/
ֲB{9g'OA	o8.*Rh׼NK3K1a[ͦTTk+
h+Y,{77 `w|nՈ+{CvJYwO <D熾Uw	^|
ICg0(G%R޸32w,xc"1+O]Y7IzYV_Rb%cPAx?ҵ:mNhZa)nH:'~9/	9/> ,7xnY2;k\a<B7E$*"HcL;!Z$E!b^pl@Kj	O4_:v2˘XAv'F*?\z6GYi8M.D#.U
#^WV@ܧe\7,C񹶁>~/X ˚ꉅUy1" 崀c>I6ea0L1XGZz3MˠaS+3#4.	3B-`uRU̦4r輘D<}1$`bd L8#ڏY>/8oқ_u;_eDə+ω<\^9hY4yc^Gr 7BŔSd# ޓ~e0JzJ4vCBuu8֑^{xZ[-dpc,%WTi6J7o.,zgv,)T4+E1ڢJ( t{Kjpхb.+z*5e\X}y@ܵVlQj8NtNPplwJBts%	VԂQn	m-U^WaSl<,}V5~Ukr<lTSJV'){Fs
C$`?OWn9o5@<-{2KJ(<a(I*$=R>
Yql̾t*%
PNVVk=oOlp"Mw3mDnWUgju|쇅TʥV=h8[ bJA -=&5777]r"Snv^*j[A9%eܺVlE;޽?n1QA\,c.XNѝl1VhLk
9* tM΋>H7/`iE :4Obca~24F^O^2J~Ap|fJ|޸l3Yߘ[KYOs<Af<wGw;ՒN\[cDN8.D$jF!n]`ct~A!\]E|-(ek5p?Q /?%+:\{W%3n'xDQy֡/KsY4`hƒiB@yb#x	i{۸V܆C3 j!h/ŹicRL]`Wk;ֵ~x%c3fRzo
ȎR@tD#* '-?Zs5HV/^^~rJN+	]aTiPg[9U}ISWe
)Hy!hn4`Q=}*Kxj?=ySPu  QԉŒvnydLÅ9cpl%;+jUPc@.!&^y|͟tP5$fO|q00Q4=ZYdږD<i=_ЪN/vKkk~Q!>/y]?$;Zŉ̒rORiUN'=GD2!-1bj.RB4뾻Ywc7Gƾ=m.r)z
T]i}f[j6@^ec {splJW~r?&`f"&x0R]%o-d4X{?c"E=Wpx˷l"OTVeIo2'kvnio7mLjf^on̚jH>,Ct0rikkRKB]1Vd 2c6v6vNmcd[cn3'Gh18}0p=#i-,-y<nɸ(NU
PͷQrznjLSʆn`ȼgݓ-iZݵSxS⸙EenY@&!.}$DDMP[ [4n*$0t~ߘy8ʮ	yH" 7p*Z
8%w$%S[ZQ~%(5\4ѐMq5U#AT_a"Kvlp=ps=}59fhzZZ߻L'lwI+`)KJC!h7KDu֓f:)=`6DF̹Un*ʁq6RMq]ӯ2\SuC;p'܍h%jf(a;$i`7$`5/`m$J.Q<]\sT#.NI 7cԖ3ؗ.TXіEiW'r{Ҋ]g3tK'
-	fC|a++k4wokS'dpnc""flHn[Hd'9uUBv2?{OuU[;Z&"}'ۇ|@nIOUoaЭ+HB4 (ܲȺlxJoTG.=cVMzE+B/IߺbNnP~I23}fk_}̗8G[:!PS+P櫪 -*HBH1gΉ	B}LO0fx';2뤄Gדn,YXwP!y[qr^Oπ)=hFp)x3RuÎqH<*_(ÚV9%{/
A4]7%|Iqk	ʃ{܋OVx=_ryaw|1"Ox))jдJ[q`@ad[޸V7ۜ2[lH{M sKS1=++6'~w5W!Lbdp&J啉1xvxq=۬h+kL)8 $19 HMa!ͤ_{d!L/<w`/Lf:(Q̧f巽ZQBN[lNm |Ӛd5a F	<wOwݒ۟n:r^31>z#fa ,3b}4NO(Gî2,J+qqE1{YwtaX)̽ `qu29zn4bvN5K0c|L&%ߛA39dOĊ>07ho;$WZ12ePPM7#ws\2gP҉b֐LzUBR!&eIB3/Ɲ6Ǹc!frrWaaKlgj~ٗelR$UpTǓ2E$ay:3_ʸ0N,}mI>,5lZ][> 30l4ŎbJG$gdr!\bZ6^E7(e~>Åi
G嗠4y\+roY]h ޕjg!ɉ>8S&5qk$ltTfp&҂6O9fc½ê?M	$1-!ws2;=j^>ǃb1L+1lSSChuzaYoRi&"kX:e93%'۸%DZ>mC<-gG6i!<(([#<LS17yh0-gZVh:qQD'[G`}q+:5P%X7ܸɤr%;(<?Y'uOMvXjVK_+rSBsVq 2'KM/A]9[tBv}ϗ{M_^]N}?k}R; n8EaM\^32d[]p4N{#ǲ@`w֚c|N9O6)Zjf5\>\
Y_=s$DKm?[ۓ/nK/v$Z8CQM'/,}z?/^;n▭ƈB"A>6<]hK2L'il'r9;scyѡ?2;{Fe3\vd>bSHcދfxCg8kH0 iݳ
$__3Gѝs=- .[gULa&ܞ7|PrU`kbGȯsTwLd8X~~2ȥ9ۯ|Ml4?N"JH]u]d-.]v|n]>tZ<(kNw[zn	'ßd$B-u*lz>5RrEPnć~I1s(ռ5g˧vݼѮ;Ek`	>cgOGW@ũt8K~^Pp;Q;נl:xvT?1 ;,Nir`*~(yԠgb>yOvQCnB):zWFwFW+zz+&NЯ\'5  kA96KJyM)g6"T
aFM)";MZCݱQE&`@x; ue`( An`=Mf
a2yB??mzGD]+k @ғ%~<Ԇlwq9ţ2gqY~r8SwP򒢥*(PU!ťP!nIlîۍN,H@ƨ`EQ7%n 7p5RE(m^zYu	{j2Bp⁚rS,8O'Sк1|l4\<8;qd41[첄Q AmK%<-!ֆ]XcT4czVIZ?K pܵ[B 	0Ms-P
P-F#'?B Մ]#&n %Yd6#xVߢXHHPa
W &Eq.g@9S9EM`,H0K{&x4|R3dl؃WME޷ACGEh$F|r%B(N*LJR"hQ0#a!ÅeŦ胼w9D$ rwO{ͷZy^[ًӣ继dw+LzB,%YUw.;7ws׎?A?߳ݳ̗ng)콓~<dMVPI>1Jz\ජM-W3Ⱥxޅx߬{oE-M!F;}bFƓxF߈ :k~7- :}[؆ *v>'*WB	/W)BEW⸸N-eYj'Mxx3yqz%/b7jv:s_^ه&&>(\T{PUZіaG;НGl^>~0 {fJYB+c rwRsi;s!}[Eۤ	Cō&O.lR<Ō"Ɂ8`p+?>HnGk-0$N<'Zc%Tk*	<ŦN3CT3)H&\1r9;AQ)L.!3 ,gGb:'N!|T2DE%{&$$#(8oNW/fuZSr뿸@rr;zWq|2Oo%p(7ҊknEwnrkǔJ*ha'O>B:,CH.@q}<G(xe6K'hκQAf,Pi6LAN|N܈bkoݩwgKb2DG7{JU'	a{T-Q:ȋ{<{X;d";YAЋ#e@jn7k,j#ZLu_lsEN!JየSd w,Ok&Xr7UիE?j>8gס{*A
{2pB||VH]+8|WdNӜ4Mе;=m\3S-'0]V6t+EO_wTDfg+|ފXv-(0&
7Xbq$X:|"9eqk d/a@+a3z[31$/r)-?Rg0՚JrS'8*xeท=46Yb?Xڠ&}\EaY~$a~%L  <~Y?k.﹕uGn(?tG×AoOIDНćӟq:&ā4=6*ᬯVj=Z-o?ʍŇH,?J/
ȜS4|HT#+F+q62m	
#[2^[`[OOV#N͝yDAs5(`dl'ـkუ0.X`%60(X-nyxCTצ<ei*of#<7VƁ*ІG4h8!>P§[76!I:I|5*D_]w@y'=y՝ȱ߲=՚dmK38)&=l<0f`_eP*(dШnJMDby9KcZ^T[-xس|WQ	S>z)ұ9nbT:S#DKBCڸSi9X?Qǌ%<5{eɲbnʫ/ի	UxFD g^[ӖBS7vlDYw8wNoU?Ӹ4GZaBC?pѢ~ 7L}s  W0^"_JhvQ񜍝<ŪhRߣ-!w#&~;5QX@Cy>,;=	 X5횱F<mA$lځ>^/YXߋ4׻.ٌDZV"ekMM=|9b@p%CPsK6vMo[dt\4):do)t.&-K (A᫖3Ԭ|y:8hÓzCp@8Bu<nNRǟr9k\{Ѭ1S瘒 @=29JkRʾ-X&T"ʝ(Jc9勉B^sU%FzBp'x^=9tִQe{cζmlAT:Upݑ&C!2
	UHYз	#\չ<$Ҽn496!G+^r`c8.W	S]i?^\h'qAD˻hfPӡ v=#?[!]sAt/iM܎di$vz9OPW2?_k3|axKY.t~Z/Fd|[cH*tzo	ޘ[C1A.v<
nFsviWqtȵ;&BꢞN%naDI訇o>0LJ}[c6bP>q8*|=d%i>(ĳ5(	aƳKsEk¿!s0
="Ӆ8KLj|'L[n/E0MZdxgTl'+.b9qEُd]06e'h˒_zvj{ჅAR-PԀ͔Tvfh)cn7p<ZmtT3;G$nC@6xbȕFHz\|V3E Uv!i-xVOs~ۭ6?0{ΖP4Q❻luqv_Lv2^S!`s84H-nѻIkXE7Ǳ>Ql=O<Tb4Yr{9OL m!d|oYqXFNI *5#rDvhA6a\
mW u0+zcǬ:[}d0:!)>/%)UA$zAC6kݰN°ZJpJ5П?ł:)g5~iszAJ
F1\h׳XONc=rC[W@Υq e+UrWw3UE$o:y19~ ^[K}+Zrq?̘7<K	fs8,E?=EGsv簔9!}כï_^=fZU྽MεvVj3gZ+v,?Yd%MC_dHGH'.naXG-swåiE9+@&n|զ=Þ`肉E;:e@#͘K|(R1hjj}Vf?`]t[<jJ	-`0Z%ҀN}v\@?weQ`&i#bV+$#)z!vV]c^B p<Pkn5'A] %pس6i1(#@&s_
	۰JČ@qpS?Y=fØ=~dWb{sxZns4sK'.pʯnl}D\񏿢d˶cr"
8SuxonkDqF<%=O6(y̩~6{VMߓǩ5OFe\m/В<mAw!m]S	7|վS|5ڦ_5v1nmjZ	Mt_lYHp!hl2\`^yf_35PVUcGl׎OOdKT::՘ T*8ä#XR2	[ʗ8`d,:7EO'-yV)07xpݰ분;xTE;1g6Rȱ6e!DYB$!-M}'Õ%9݆y܇A\qe~3ME2]+CY@GCT*1_9mSd0C{MML!3.{;ꢬ#98TVq*;3zO46@cjveH!i{+鮐h{hAEf	e~=Anxr4r`6a]RC<y	n?%r׆3
Ǎ<2-i?NkŇH`2-xR/;l5/쭭?6i)2Vxbl~EYjugȭ/K<)na;Rr]Z@lȌC꺛ɰYt=݋yqFVo1&G"ԓS	Cׯ.⫫ѶNNԙW9𛐿XodY# L^y+0(ۚ$eRΪ(\I,VEh#ƕ<Q\.|ca	=lD>;w50*oۭuQw]
w^m	.GmJݒ4-ogEZ,8,Ngbjct@%;ⳘdtnT@&^!NzelPW:7`UW8XQn&tVA"rs$>rgYXS<2a,T+!}({t_`&mD.~ZTouP`~+V/ώnǢ󗧻)Z2ziW;	Q]Ę/
eGs}:Ar#{{qN$1p6=ڽF;|PHTn:FC'a?uEl[3mΚ]%cT1ŗ3`]WNҦYBO>(߹A2ަ2h<,ޡ_="hl++N_ꄂ)&̲1bJB׼{xNwT(j3DiC*;\IX|Kcw.$ݏKJ-熅ڰ 1pRNT[GJm-'4!l*l9W
5V9M=q.Ex.CV,.#+u^#P_T?F.?ŬBknug0Ai($,?e2\W|fmưC|M(fh1*в{~78@=Tʩ[|Egoǀo/3/z(u')
dх*we_CGBQ+ 4p!^37Gd|kQup 𒌑-Qmudf9pEB羾bIрlڷ*Qv-/N4^NP6gVZ}_ wў7ok=Ӣ7nZ?~aƦ3ZN͢
Gw]^&O"W`Px8O2cV [QĲ%mnVW6ׁ4rkU~j+J?*Qp2e$UU]WwN81'=THYk^Lt<CAoOHyV	@i&j!qPh}9ec!VyÆbN:0/*onsFir.Z$l{đe7^M_{MS;ry%wrRMWo~A
ǛAgd ?/p~w<;?9G۞vİw@6	\vᤛ/nօ`ve=t#r}0GnfPF_hW	RE-

?^" fa!/4FĽ0&8PM[jm:,*kgP8fԁRce폎 G&gH`nȔ*;iGJ
s=(fΣWtZaYƘvn+y!3=]lwK[^{[V7um{)THm;cGQ!>
H{]1eeB(A	8Ht͟;<0TNU]9YW*g`igk.pqiPFm_t2+-jZ~# q*m	hsZ-Aɦ7EWBt/6c,j@
OVvVbG{p:Jg<e[v-:GtDeEE/Ed QQu睗fE>s@y5"XQS'n$M>/R^
xk4"WvǞ.ӌ)5AVJ|9EeihKر)]und	b^5<%1KaktSy?gC9қfEa=L"BvAÈ zY'm<mDwqr_Q WV,[)-zoJIJC=+Xy\i
$ro);>5WyTԤF<)Ö@aTX%0H !$)fl˛Vbȸ@cCʰB+ QRc5."Lct1.y඙}ra~G6|SduiDJi^J,5=eikբl2c!6}qvNsVTmȾ8fw:Gؽb;xs[.#	j_} {u}<oJk[+|f+uEzv~aZ''S AדJҏCd)<AȺI3e.8??Uf<~2E>E.|SW{aS'5@\=b TARDECdҝu8+OAHX햖ɻ̫gXc\@4c9f}%zi#
u̿n}"7)m?obpsYX=LYu
1<mgߢ8OM$7(x4L>7(> 6(jL4N]B&[:6l
'Oވ'^6>cQHT]q7)t;ձn qgԇl+@X7,Wh)CPwB:7wM~Y?n۾m<}8@\Y m;t\d2w+,3ul˨UPWr?d7;q]LzV$9`vC4*yOK!9z֪Y? p	^ τf<#<
pYɄⳠ/tn6]D;;gA Wѣ_LcN}/g8Z(DP؋`gkKڏz^Ąk7;1-mƓSSYKh5E1L}[eo`^A&a]L.KAHײF|=$!vgG&L9fԙ1ռD; $a6:!VA;WI4_/:gCn
SbbK*a
Tu|V"4{>qs-/eH9-z=#+Md7ئtp˹M?|NhڴE>q*Ԫ6{r҄^6y`nl\(2:4	z@:_RRpB
M9fsS@mRlᨉyCutD D
̆"QHuzlLQ|,J1Uk	]tH&Y .bɱɵRe0
x%B`9$, hc5D!5i?ɱ݂e@SK 9565QV`17ٱen%Ӕbw"Fލbqg\F~Teco2US*dAMEZSB<ZPgIW[uIx7FphﴫS	gvOy{SO&qfŃV5.cItnwXS~P|ǅ9``2$HT%M@xX
ܖwTVKJ嵑Yce貇*Hv4lJ:_L{;Q5Qa:V	 \q0:SGsSDLK8[JdmX0,n5sEukf ]XF̆_jdCy%[!p7ޛϰUaQ1DcD"[@L>{7*3D,63EbXM2^`&PZBx EZLGC6HՈXn]'>
%PjwJ~E=5A%] ?PZv'KiIYyCǱ/kS8i`kNjgd VO#.Ft`Uʧ/;íc+Vj~mO}nrV`iW7Ox5[ 4YDQ[pꖭ	[o*[Y];BB`AK@vy`4H ;$WpBHc1i}rӑJ_gW󙠗-Vwfg"W_؉ \	ag4z4_N	j%I0b(r^~!#rm3Ly%,Ru}=
7:yFxPdP0v<tZвE"PF\<DX2ʿ*DO>vx`h$5{`bl5Ӻ;Po,ɹ|p_ִY|:{f37\3JMiJ%Ư;^r@I8D%6YQHIgϚrkcݤ;)?IGWBٷjli=㟪73$?}@S2@5mSC/ߥPO',$OtsxZ1;yrK`'		9˗t=@h&yRqlbd
ԁ%fumtavǔKdFA:ϒ6yeҖu^'J􌺅k!AO=,%`u0!v#wM}1020[^5Yr}}4p?+Y2Pf_aH>\_h=:糢p X _lJ/h76<H%;iL6b;娛cH`t23Ik\ÃUٛ{6cx^~}P# b'-kd5;k.	;&AH 29R^xD|c#_#?9>;=>gڄdySQttQM5Zմjjo4ai`T՜#Vpz 

e{Nx
og7}B8?d'ǡC0	7LJD\Lf&2w X<.zZ>ƴ<)x@+aeJݬ}8Pte!4!oDPMFMafA>P&!wV?1*fWI $NX_%V8^9۾R
:wcCPFWSPО't V6re?)Q
_?a
')̛*ucfpELjWEcj_2;L;/@naasWǻ|ΥY?`W]+|NoY-;n<QX5non}/ot?7ЯgN"=sà~I"Fr߄{Ɔd巁LDfvr%$St@|BҖ_XC4w`qk;
#3,p[zw/ON|dOLUÉ~ާޓ'3E	7\ۤ4A=>{Vߖ>#A߫XDxh4!@KR*C0ېˢ<~#%Ӝ҉ұxnɴ{ءpݳT.3tJ]1qT!c:&$_Ne<4;)ugoo,"aA0Rmd0}L(vTj^)uŒu-("mQ;p`2K}Qr|{Å竷F9j5)5	SXTyJ9<m%貤LWI`fGWJ px8'i'aM92n5n>ȑEruZˣ*+oJ9ˆ0ɋ.r4^8d.;"XF{kmŸIHaM9,NtuڨX1$el!/rB
i2("^wO*QC
:×YǇ?D˩!Qd	,*u_9	Yb1U;+˶V̞ucϋCÿemI>fr$\$q07$ZHDT/szL%v)Tq[ 2fQ{wZP/L3l]HoUlgT C'GF'A{mj㟸Ò_'DY)\5oLɾu{
-s$X	鑻̗T Lczpymrx>ZyfD_Ԧe=yG[!K>˻;qYMF2n "SfxQg6OXPHq|0w $?8kN{-}P*ToruK<a"5"(!D Z[j	_] t,Rr,;>ACo_z(<$=d!yq
Z 
) ÓXWkYǞ[ܶcV7=;&ow/{z{哲piG~Vkb- -mrƝ[!b]BR0h$MOl?0]@9xs'-t|4c]oeߧGG[vө?sDihy	w"Yޜ &Z[ۏ;m~i+z?mǘ47f;8I@<1CӢU_xf_'ra"Z^8`ӻf@5t^e2L5 gŭj1POəל*Zw]Ͳ]]^;A<1"TvX~}-t-`=oDj0W0'=툠B-MP>(Ma
YPcV3'y}cXR.il>{4i4G
lxߌ/
MJ7roI;f&MxL 7ny|w!no+:RzmNԻ?֦=U(R ɳw~|-[l~̛S^"YWmsJ:||?rC9T3`JHy O[}m28vu%+IA_90NQ^[,S{ǜ?E3-9[BpP5;];HYi4V6}DoZ
JTXKRcdVeIa?;M9iC9԰詧֌`.|0 vCwдCOLC@MT$4tMU|Ter,
e&gjR's	~9*\yr=A{(X#d]:wԆަR;6\;ew
*!6$#I6yvߡJΎ.53 l[/-bhAB,\zC]t rH	&gCyԓcd-=_\KTr3>ik˚j~m>*L|4#$U~UtQ
B?Ԇ{#dҧXQ-[l0CCwKx%m#-}У^}<TgT-GWjNQ?$ R-S2y{z~t~tr)oAZ&"sd"toӉ
#pIP.9u7ҰIZ:>%AțcĈgW%'5TϮ(|X\"Dw&C	JW*jl[?1	6׿=/$8Mrkq}9|G1ks.1}IZaOf߻gwC?Y lxTϿĽOCt+̭[_h R`&t!c%D
"ݕ<owqޗ(@SCFTAm׮蓖tc	%-H%U!{pȻIQ!xB9uX1ZnZiB'  4lon}S
lsHD=\X(mXQ.ޑb89a"=f4(I"%F'/_AVŴyrL*@aUՄg1%D^cx2ѐQFksbן4 mnג,J:MuN.@l||}zKAZa˓o\Xyta-R#lobx2.P	ꉎ֗zrC,E$g0abD&m2`,'#0|-2m>xR*$vӷ0|w u}_;5`]۽N0s'a%0&PdgZNk{ېV[P3rw%(0H!:_\*3|V Q z;k}n]sFl`[|ʼ8T}wy3,F98 wV\6{w:-@>8;Ȁh%zFTv$,&VOmԸrg8`B&;=-\QPf$MPs|t}!p.	jޱ#[oh./n{
?Ӄ
q*QZ5.aW范x`Z-4zUO[nM~J`XA|'fA"|x
9Tј["
U¶[#gN0z]O8 FY[C)I5Om-YϠ$S$KAj"ڲYSH:9tDr]ӥeȵb#vFb lp]&'r;E"ne`Ũxm"ݑ#Tp߯Q|!KC	-ttCÅ1h)=7vryxQ\-(8,Ϻ(?zӟkU?/Iiڅdxalc Pn`y-$/R8 {[ϟUQ>wۧHD30PU1{-ZKQHq.I*-mνSE湣MҨO6`XcnL&yہ6qqk=mOSl1,	@olu2Ҷ
 ,h*`}lF-ǿb*\|J9vKfD	lҘtB,d>IIc5QIaA?nae2n<?oKx΄zc6MUʙ	j\3UaOG5h=ѻOΦ}`+7a8
 rMnϾC-+#ڷy_xDjGىiAGTus~'~Q]4$T0ꉫ'gYd4	EuqA̿`DEeQ`N@=UQ4ʔBX'j|tj+-u/	%9act+hpTD9wRS6X#'d~(vGU<$vw{m" pCH)sn9Qn!z=Op""(ਢʷvX*~GmQ?@B'xYAo׸#^_/M+Ug`H#,d.|Q泣i=Uv_LUGwS{dnɬQo4081;єM߭]s[>"cb<Y`zՋ'AxB[Nd~H _ّƚLb
H4ǜye$W?-)Gh.t1"ջjh4@O(	%[ezy!Bv~9zE c冒u$φޖm7*T9R ay&|.Ǣr
F`v1C5 vfddþL݄qlO3l7a4#Kqʧ~^&6Gm*/WEy=Ef+Uk:ZBw-⑏Um0˫Wit6p/+jiq1\CcR \إ C\:QF[Dp~DFBTg'ɗyJ(Kķl{;bх8g>hY|Y<$hfb*!QWrЃ(<bnbSꚼ?yy|ޮۃc*X'¥߃¬	;CI0Y< <p%!^yqXA$p@ψߧŠ*њ1,	Y'+$Y;{!
1fxu'@"Yd&'tdIᎰ)#߉hO$E׋ӣ! Aݳ3b65U`Ո2!7HRK,1.?{JhN6zz̆*/<挣m?Q!}$MiN5Xյ*JdT!UHx%$Eˉ;%fdⷻӣ=^&os9MOc5DAS`}Cη7۾Al3>Q1CsG#6Nt+B]=Lo)(q	.IB j?o?)@|	9KVe8M1뉛W7gW}|_":$AEE_'~{{ۥsԝ̮?fρ7_󉺽qQYEցkڈ~7*sbb+c7Y|Md)i.(7i7@':	$W+9{wLq(?pqsspxIعdHB?{[,`4}Q1~^X&Tu
V	mQѓpeY
'Ġ!Ep'8#j(	U$|%t=ٻmCt6CC#qOڝ 煓=ٿr2(":7
jca`dz%2qڂT
+NV>E`\[bcF6Ǒlm[f"W	HS	27	?K5	xp? *8![4J[;uSg݆
cJQ-i4{\ءM?A_4T;y1&lsMyb]]}FRe9s7?-ksC$"O:gF1j>׮S)m&*>>(JGdj-EI'F=UлaLkp-&a=0@NUk_cxa|e CM]sTubfU?Sb`6;SP+
2*#p{E>>9鐓[2B4-!^|#q\ĝ-ǌx)cUBqݍrDn.!pn&\uŤL(_fnHِ8#.DlЊxtdNPtuu+պH
tO̴##	@4̍p:G]ﴄ>YcyT
,FL,U2u{K C>HEj3$SIX:c^'A3kW˞$?w$Tfď"it\bc`D%:"LIlc		2uLw=ӟNq:"t1ox*З.'xFm?]rpfu!ԛ`eА٦ks<z7 ϣTd)ǰMVLp>`c@-UAl]b$;'UGW
%B!GM?x$:qqjKμ{rLL
H]ws'!hٱ,1{|6BFcj  \t%QJ0>$7Z>|Qk&>	G}:(%J#p?y&/!x _1F!l%!}==5T"/=MsM5`7B\?xR|4jfAAb]讑.K!4}#ћT%a6Zxfb1)s=28
1SN%pP(f-b6!oht-]< M˴9M+V&ӿ,94?IzArh#b\*L;F!^pD8?UѝDl.MX{,K(Y":6Gg6Gd	^+´ra%ij&Ar9ՄBr,L"en"?m1!Jd6]lJBU+ND<@vl6t>rZce# *at_#druGr rg,	 >?`==dKV_|#5`BTjoJhefHV"J/djѵ.W
p(q.tsDk7!>|>+ھPBU>5/X>|wNAj{:
Jwt勃]KzārNbr	&h]?ƮPSG\W˥O00&AW0<X Q_zpJ%I%;>ډ*8gT5A)~}7	ԙ'$ČeΩU	CB;(j8
 u\!;n^VLp_VϾ{N/N$73e{ΙP\#ٴ9lhf?ltMzV@kCXI\5mYP\42={1ZSil6ӲKK1X7fx1M_VA
|ؾD!.oD@a$ lp&(;Bl7tc;Twl<-omuz/fANWŃI{w6omk7wDlg>B77wt?z=nJ6˯jgAŎrr?u;$~?'?ҸJ	py#DlZH w2)|?T䁗R2yvsPW"͹O{L^{;n/E%-(IOp&|bX12^bTqp˂ҁ#S}F,O+[uJ7޽6=EQ?a1NmhӂUP;kUD	.f]%0L~{!=M/3F%dq[ݲ(Wehmj<i]QUZEgf"u}0D<9t*ʁ
RO>e?/7O&R/[3@CifLpZDA+1i<&i	5 #}uc&U1KaG*YRFz*Ard^ι
b*G5l;a,F3~ej2-	F$\b D|\lC!
>Jy?zH7dn+c/X;uX)A[)}w+>#=!T#}֩ɠ=`jQ8ZBu@nl1 0@:+P0on~KT9EGtLWc3j5̨V70Zsu^\Ĉ䭶O;J@q5]!m:yc7xљ,UVI B?	.}ŁQ!Gq~=ma qr@ךK~5ؘBH_jc\YD oiM|ԈMH<0L`ݠ/!FD;B,VK+Ƴ
IL?CHHsVUCVr|#~U'@żf60(RW%dvVJc)2['S*d=Usw󫠖OB7+XHsSq<oOj{eٳ.NO~::8:Fh55-E>"dDDh x>>F)7X{	1ApR`u$0IȺq#誌J|M?kőUq|G& &Ƶ1"C!x$hGΒ]c,@mȃO+v o}*ьk+zډb}9߽#>V`GP8gd<lC~VinF&Rgo`	ngpTcA#<`uNz_<Nt;Y\S@MPZCk~jIs:ሃ ,zוka=u-CE}_#;&@JaWA {}pExqs	.?zLep	ȴ:pJ3@$Ꝣ4Deٝ
&#E%11:+K	)>Q SqO&+->;M̕*(?t@@PMpy!-2!jϛ o'K}( a rFљ]m*NQ26@Į<})\fwǁٺҀuf	>|0\-.h Hiξ
߮?\ј	>\:]VO6+b,I` NCzSPx쯐Jd;ٛ2<LyUrW逿>TDW*Bz6>vȵrxb|PHDkv9
55V~V?"|z/ӂ2LDRi<Jb8j98KڣGʬyEPPDMM^fՇ54ɟַwQsaB'&=u>Uoz'P.u׬R%m%ߤ+] ,h-dr#<r"Q#N̋F9"'F=g1 ԯ|aTT1f#Ѩ::hqg\9ejSUYy (γN*{fGP.КX
B=B63"19z=WNi,w
*kr*6CЪ6SYM%&e/k*Miv$ӭ%ICA3zB2
Ԛױa\6+utʪ+'@r?Y&C:/|eh`2*k3
_,Kr]zۭr5&#fXϐ{lL7r*'0[bNj;ZFmKlk8| ڪ1Y<[ĉ-)HT<]Uy~$y}5-(\tsH9ZT&\v+ԃg[,s;ɛŐn~9-7ӬZ³iA}b5.b |%1whR??ycz[0NJ{~2&!s̸jPiitIL`w|=KUi; ;>y{G.G% t>-ƪk"iF5XERLTBRm3bVU%86S X{tL9!1Pj*TP붢Xpbx*	fDQWEpbS4:hBGÍ:aoTՃZyr:@uй^KqAG&`3h:9Q3'gsM&SO*xπJJD;7 :ހco@iB1Ш=se1A`'x.p\
[=8:hb!`~gW-Q4k^M<#Lviў.TMR6[JFW,&"YEd6ֽ8'k;fͨ	ywP]^PUfN	 3
Z}8\F!oh~@}yjzƣ K~{,W-!>v?腤GGTO#78$ ='CLm9E	-JPg4__Fo.Xsg(/JOLU!ļu3)h.9fKQН^ǉ@-*4BVs4Fg:lu,J9ф|J6!?ks	ji$4cb{Bq|3(PXf?H7F*$%,-=HXtXڬ.3pm$Da]dw3V%ԅN߯}݃L_E|Y/<6	1kA h$pz݊$HĒ'PZS;HC}_jva>jeD)&ѽ0CKHYeL8j'	3ͰF|B)^h*2k:<OXG[g|)'*M#+E<es~4Ъ0SxXhGė˓r*Rv!K@|]_j5yIӟ1/ɾĵK}5PuP7.ѧ'Sxy1E/qY8`l+.GKtNMG kF5umE}kuӴJx!.IG-G)Y8Kpl1eץi@Rs7(	1܌SzR`*WgJ7:Zm0A]
*Jj;t4F%nd$jk}TK>Nfޯ`C.<;|Iu!u9yK[!q=aZmd͠/Vpjw5$	'ѨF8A+M9j`f/2*Mc܍l",#+\{	bsOX,k0%{V6¯Լɍno[dM)]r'{ 'ѠxKgNRw|dA}1P~gf:Hd,)/>q$[B D}TcV&Z$zaD͑:Ś|DE:TIhRӘMH->y+3+1	zPmi*,Rj|s9Kl9'U%I@ (m*Nd~>Q[KPjU|<Դ@l9k
R]xE6 }GOoYĚ3qVu%BUܧ3ZV%a}nQW L:Imn.ֶ)W6p=;Bʓg/T%Z#c/.~+ye@;x[p;?Own=nl糢897mmjC$5-|O;]ndr43ŻݴiMYKI:^^n.z>RMgE'Ɨ㷎 ?ؗmX9_VJBܙ6Ng$O[Z^	7W"T[biX*?/EB|H9ĸlJHF -X֍#>	"Ei0`j(vezi |.Oqe7bw7vE /UL̌9b^v6۷^Q2pRADX{gj jtMU5~O)(f@Jxv.owV1`ޡd2>BkEWy%k˵XW=vn{h[r/?Mj;R۱+PaĞ]=a	ƭ;œiw~7- q1UT7X##, #&< QMT̏f(Tci4_ֆi>) JqmF3xq0#@5iL !zsɣC01^ƾC';Ԡ]#y2SqZm@ g\qEQu^ȔKAӑe V*2&9\+ŧE~dJUee$ID?		
QD>HblC'҅JLZD|mRސZIҜT⣚ &0zyolxGL+M{{K~ܯS`<}&/f&LtQH޻;S'ͽ*"sEL0@Zak*8*Sr#oy>TU*E:E(>9'*Ã^ SWqd.>@}'ErE!s$P+Ar\Lb&~/j2ü8'FR=$ LAn+rf0˃0VOeeJ[~Ղ+?N>>#np3@DxyVNAm4k &0=,n 84M sN)n&QFx5k|*9$xE3ne$|РŞ!v <ok\SC'`?|k1QMvr00)6>-+b5>d}H߳ܥk\gQ;Z"XIpW!j||]x+@d?@Ϻ]L_eE]E6PіO)P6:ZoyqU9>0&6bySiw	|pGRuqm';yqq(<l5x 5Lp/H'[2pM:l<-v*ǃS+UlXnzhc6d
cT&~n;rl`Z)(ݘJ*! Iq xٺ. 1S0MQ~Ѐ`5q2-EhpoOöt_OL\wG]/`_q<g/0d''UKV:!KX&ĨV'n|Tw)oPP(J`+6?~cE.;z^MOC9>݌6n@۩o,E?*ʾΞh
4^^Jxxa/f)B098h#s*2ltR,'~}8I(ޔV#wOsxɊq,L0+`Kj#;.JC.yyH5q&Kq}.5ǅ17tb\c;S;f˴TU;R\gkGE`2k?,T8.YDswƾcm4aԟ:uTT[Gtk!bZc\P}
#kjN7-e=T8O=khS0 SFEz7	UVMmI"x<;<zv?UHİ,"3h(ܟe[QG	iOsw'߼r6ܲk'MV~;D_ZXz!p1)8׋iMd]vjw4\UӖpJjd"GK&k3Cfzcy
	rp4wof	̑ڝ):By"*~b̞~fGW l`?`wʎ|A<&Cb9[L\8"}DY|+J|7(8/nֺUπ~IL Åb2[Bq
0<-|m2"NsVa҆.ױ$@]Đ퍞"cPbTw{n^W96q I:p->D*j
Tgy$d򀄘d$Ixl;LYҤp}dXE">VT>4ŗIkM	U+*Dc>gͱn[dJEM=ߩ"C8-+# 7n6֐Aʩ^^_]lDTؤR,KMQQ`x/w2{1uO8CD>r@WEs E3,}Ά}vYQJQ?x{ta䰬ZX$05W7NLdҷ%x.)ElAI>PT|0ǈpn^z}	4(G;Pi=ⓎR;f3ݮ^@u{}RGel
?
 {$xZ#bНHI;A;ʈd~c^\ށ'?t)^c8X<ր&9>r	>a&ZodFI*GCO&Qލ2;Sd 霌-X@Wp03hQD[f>Og+Z9ObSrt>c6LȚvaz)lo)L%CyY;0zH"n♭.֯ix>Xbjd&k~*>ݽ?Uu	e_8q50B]A&$ksc	!I`5A@US2wZyfX`I8 :m*NЙp)œʼEBYdG+UOf߃N`qŸG\,;rgywbc*f$)BغdG@?Y<>?
KW} :v_h)ja6X.x#f'P~~UG"X?%LRh
`&wԮ!Ag1Ѹpܾ*!:*ٹI]IQc	?5ygyKrP)G-{(qM$N[ymOO^ \Kǥ{
pKdK]¢`X LfݨeMJtP;KJTL2MG,B,_֍+ !h=+6MqyJMc=?z9%nH[\/6,rCn?`m930
PviHs&x{Zy#J2g1KCxBٯhtXx+-b+䊋rJP:ojp۴{N]
w|-2nDg@t$ެ57lsRcLu4:mRBʓu;n_o_np|`r;ځm~uDJ*nyM|"-/ᒢ>gGSn8h+[g@My},݅cʹeۑf{ನ
7w0-(w|4t>ےDK\n>o+ 5o';y_gQpǲsM%c1"A8a4Ψ,\ȢFY/E@V$vUrqʹ$xPH^VI%E˰ǮXM[4^SCHqqqm)	QLf7½	3ϼyRAV5>{&hL*o%o5Ja'@$ԱBnjqā')~gf<:&+Ƌ8Br^Udt1jV0ؕyж.F3<ڔp3:hSxYLںwz9S%Cxc=v
r>CK4(4̟2ܝu8]A֝MF+SzD?UL\`CPw-X*LNy@
RVd#璗=bSj7'uA;a@#\fm'аi򠶖xαz.e T*[TXܽ$NdY<@!pk޻
%LD䘿30H}ɿŎrTVm^O7m}z]j]j ʱy73la3>tp^tjB\0 i0(%N	;#	Lx?e"(QDf:߷/s,}65XwVUk<0|A 9httk?=C!ºie>e1U`m4z:1yPFrgV\.\\dO2cfA}b>nw#| B=xM΀Bc--X܀~ep^<{y[3:?㏵,}fO|8jM9_PsVۘ\m`e?qaY.h }ܠN*OB:qa
pPᷨ Ea5px,)L
1
Fk4j% 5hGc!m!7ziReSON8뢻7{)0n%2`k&oN%ѕvQOaP<
7,?ciF*ov]E,fc%%?j,&g,G~OP[BK. 3[hdl15MsVh>)Bxc<ݎsd:M3ᬁ*DKܛ3Jv
jJ|}{v (>R*YRƳfcbC~8ЀЌfrRN^OyYx8r		<Hd	)![!^q9A$DLҦQ@1gWIPőKQ̎}T)u֩ lK 8ס?\GuOY[V	N+&ٝXa"Lj_W>&KN|I}^z-^ܰP ^oD녹w`ffHk_?vtc<]=]d9y Wolckuߐ_k5<S H+\I0k?ߝػ;wh ܔckZ|]p)&z>ov ַDyrKeY0cUb
<K6٣P64qlZJgPeh-]qc˪$X͚)xhYmzI=qsqqxqq=;:vI(d)o[Ym6σ0v>ˏ
EV|XHErնӧX,ڡ/@~ݮRA17z8'@DyBPyo4$L굙B)yDo9EϲFHV\5q4fcL޶/E0}ب>\<vRbz}[莛Xv@ZR+8&(di6 ih'X]ZN'h>
&/'HUN9QCǇ$eRBβQ%D	fʖ-=nU2˥_HccI g'C!FhB Kb:Bgء[`ֶ_L5
vm{Ϥ˂t^쩒rCpT
+atGYAσ)EsuuʓՂP5D;e8ubo>̫?~쌚g58VmFj
V{܋m`?^bn$uSWA8wQ 6Y&	ߠGnjT!j{KGA̷01QVWFJB	XF6P5(sX5I`Of5CM!sOy!#,E$.=$)O`	/	Yi'{dY\2n񑴿IVԔ`dQf
q
؉~p
b;wtOoY	LUWC9fB;z=Ʃۆq;6%_y;캘vW@Ee(hJ!zRUVU`V6Yط5~GFա[gϻ;(;IfEO.<L%L%S[8,$ޡC	j:+ipGT0I*&Y<1*vepițU,܌ڐgAߚ~|nԤkA1Wӣ8v.!qN 'c4;ܶ[FK?&Ǩ?)j*k8H,®	uJEUG6O(wuؙ9yy?"WXS^h1vtC6Φ)Jk)y\q13p<q7);rfEÆ4OnJ_!J/)+ד7,\Kް"9 (:՝pH>y\!)  mhgT]ՑA'0Y㰳9/|,fM&_9򰾌Y$2!h!F]J踩=7a1|R\>e:qC|m>l>z̭ZR$,	Ҷ](g֎mjcT5}vѠ;!<wCo 4v sW<5c(4t1'-N,YcNfן1|{WWۗnUmn'Ո2 6mѠdȫb[S$<Ό.BO]Sx%uJ,Nҫb4"vu#@Z<*Eת/{DN	/{{|x;Jn&/hguBkRU)g@ؤ}"NQQk6'WOj];y>F<&!j.HM+wͳͯ_~[n~>!g޺HsTG\$1q-	X%z>	i	k
jIR1ia[kَjYZ-nIkjs;qa0pJ'$F.іV>9G[HT1rcNuwjh>6E&ZU<xmu=\9ߝFUwሿJʹ&7ǊM;:Pt
}yEƐBz6"M0[
`3,bȤ8[JWxkb91_<c\?bZ3rQql$SBc2,fNpa^	JJMs+մH>fVe/"!R%C^$L"mا-A.?=9;Ôct0 ڈv:*(|?,_:1Rԯ]OJލ¢.2ߧ|yQJӺv duj#,ܜ ;vI)CpB-؝6+!W5|ҺWe5fMl'̏ nq\	F_E62$B~'C7Sx6_J	*a f4f%OH9~0ťmY.Ea,D71R=	gLGc ~wg@T<h
cX˖{(ZBNr^	MSCxiV弖O¡.uhLY x>*dʢŏN&Db]-ZȳRxMf{U@!r9'9ӆ9pNTh)vdn+/`8ߟ9Fn}Sc#2E!{鴿{<lb+DV U7Ϙ=(:Ѣ^5>aWAP)C|8^lsFto76[]F?ugN6N}?xm6f:)PVq6yZx:phIo;Sʹ,i뇌rA6 (e׹s>C!()ɩD{ԦՄ\R+]d|V3|pnE200dnltFkq};^?{=αTFS< ^j
g␲[B$Ƀ'&;P{_B{>OD6A\,gEBm-lEg3'|_ҞQ,;SUԽXR(&D࡙3T|يeVa%tu+-.|g =88a#GG5/K"8S޺؆9DC`yUrF% oypT<}e	\
e]q4tv_j*VWP=Αd`.XinrP[X3؍7s{YNb;u_7Rco۾ҎU?xUU
]߀$.'C/-I598V $U˼TxCdB5A{G{ßGt)ewO5u [QS׋| 藅9#kd*_^7K@@iw50$}!#7t/ b$bA%*f,D-Ø1u3tAߔDzf]eJ$5T~A^զ=WDǒ6Au:Sv9؎>m+((I7uV1	>CMW
@}@|2ɵ޶mSYqafl
Gr}Z}]RG 0լLȚa\縪W^
>Qn'5wMjN@$S1YadWxaG{Oɣ"^;(4P-φ!=׃.&%@r؊7(6-B*I#Fyfp<4mܱXwILO (!af֠rϜ`$Mc<O tOFNuc3Wʦ+9TȆN^:胞'ZL`1fAMZdh:2gQ}9~['BhX 2˦DZA[-vMqiNTX_LTlw,U67&SrN-,	o;z'3>o0AYɅar\BldY!g&Sw#`9#\a"?ϦndUu<6QGǼI̋D r[h;uv6 eͶBY+7cVi2OcO9j^0(3T Xɪ\u|=gj,]Ƿ>;<8]v"%RM@̔ Y=|,M@+y)x҆V$K4&"Ћv^_K]AH5\5h?tͦ1֥ 
EfiX#MKq(r!jQhgGgQbqmsXb2<@UY1z)+!Ec;>|XqIC+!C5|.N]y9-vP_M{-.ݽ'NN;讀EPiP"!ӆQ{W="6s
Mm4O\r:Fa	cmi<xmnO̬_Ǎe&s+#RUQ1hX!zQ!k&:g-s~Gڽy? jllamVWHIq*?џq."T-nðJnzJj>7& AW`18GY3pj	>LWB{!űgAdYuJ_fo/!˫{H&Ѓ?3陸7DNLC)큤tq3N'}#=k1$ӣڗhGdŔ lŘb[i!ELH ؀DO0<4W;1 a!o1ؓo	LB;q;EzA7[IGDOv)5J),	sfǫ|PuӾ'&s¬oǿIJ*gY	ܦА0쑊}VyB{RF%kfmaqGw:0öL&g.E!C`_Xq  dVj2.+#:jHwCdH[S&ʳ27ULBx`P!HPb`BrJ<%g}.K4-]'ب+v v	y_iHSA?7bM;mP	ZapNJtݾ;L~]jxVB'էw!FYi|͈_dn P_D9UAtr[Wħ3'SdH|*fphݳG'vpCo$9V'8MrJG'IY-F&*65͐M噲.itElv6ۍzʼ<kd/X:9\?i*̀0ZˆsՉb\|ƻjwܳvϵ{ٓ㕢ߗ$ 3&+
	x_](r㈪)F&YCPB_AYPn1k![>p'	Zt ǟ~3tB
lo8-c:ik}x""%ǻK]y8R(ZINZY>UaX|3ddȍ^<}{${X*㸺͔2w,`u+{~Ad2f^\nApȔQ#bDD|uVl`}1*oB<gl5RZ'∄X6s>p7)6QyJUuHq-	|L<e :ҷ<aT8i,!vo]Ej[\#rnlu2TIKfZ~hۊp2mn}IwlǑ}Z/ˌX>g:[GϲU ,bTՍWCAB:Uɻ]fxV`[ցa<㉪:+V8Hb%}< YLZj?@:Ca9s}uBJL1`(s˶+ΊhBL. 0F0رiCSe\E*i\)dU{Kz0@+| *1xTwMR)  wrLb49TԂ9L	>0wn]|<L/b1GT=c1	clE9zP'݌ʃ	1!T`V]Av4B%e37]k4"|ISb>/lśƴQCw{4Hsk0:ǀD=/Zgu&{Ӌׇ}do~щÏx^tuKBZ1OFܖ>+F4Iߴ67Yӯ_$Q}arn@͝j,Yșv1}T+bꛯqH7hP<aXɣUSct}''0sadQ6;BkH53u(`4h°Kǂ,f\:"_M`SmHΆJ4'(kx8ktPW'C|=?!hsc6pBpd;u~l>94pi`k8*`b	&Ha\şcW&c	BawNP"V;,Hk{Ўd%Zu0wslcje>Xz	X~+yR?!AcnݭzSx!ެv)$<C6$o})Y(">+_k}ϋg/;3l@I0p|)[J2Iw\*5״xI1R
SR)N;^}}}ү%Z
Yu^){2GjЯj%8Jx??W.#y!zO/PJ~q/-,:=޿x)v4iqmmMNgv_j|F6Mu~_?`?LƑ2k}&$ }C*cw";l@l5٨P!ԓSjRBZ)
?=`C5#NdAԐP^TR<7e<<ZMcqds3@#iT0TMv"Nquq|r|
k14!䡎:XJeAd˪̡|]z
N{pTuV
wT_\v"juA6a9rgc13CYx߼1iWq>!Ss-;dʨ	r} 3׫ϟ@cdlnk[SQo|A6&CFwb857'߲-}Bz(k ](|\8}v;[yLL^Voa<OVQ~)6 &Eӽ̨e*A'b(Al@F![v*3%]v+oQ'.^jw7V{k'wj".BSI&AM (܌LNkQzݦ{(vj};+Eğ|)+$ L!Pv&Gw;u9ʢ&ZUc'ʙ)T N^&U[}&'d?V.;pcDC0kבXklR֩<Ev9k5Z
o]Rʷ(s\Jdjٰ,ﭿID45kPmƊNݮzޘ+#T1|}e}y5! 5ۂ U\+l<p4	տVR<y#%V#!aӺw@̳)HJ~+WU]\/s:>U@&xwI
S&i헮WK;8qLM.;$c3UFYfXސKyE$V*%Vx$d^MX&/@ po10>]K\$:>?~"{Ȗ8 /XźQ *N|!4QV:rP#n!cs!m88R02%uW5"w߬:7aD|bO^o[]sb}X	1B ]9s$zڤ'!@úސAdDVqfN?f n0 `iLPY,- j``6$TOe"2rJ-VSD<arRa4`1@b[
! cΣ:fUΩQU9\K-HR#82VS3crtDOTӯHL우d(̧F%uЯ%6
:p8hӴY\7HD:裧ס	YYMnoО}_Y\Cu	8 7R=yb%.x1pKpJimv	v!lrrvUL$UvrEؓ)Q)bvu1KGư63kR=fI)@l9yA\YRiΗE6t0݇㼋$;:Ǵ<o?xpÒ3eGHMga;rKq&̷LV5D$V4^Dw/f5r[KȤ>qU	q-Ryoa
N"1pE3]>n}^uQ#;{69ۈ=϶B%~{?;??}&q r;b%;TbtfӉbg6ëߟ[-gR[)#=,=aj턉i.`ݒ[ݮY&HB:G	B|[SsUn%p蠵Gא>2rW.uVO{nBCdƄeVKq@ FZr?+4uݧu͝ߓ^׆VF%(sRc@FhUOW?eHFW-ڝz 9UvU!]k[p6Խ}
bI	1#8Yii4+y΋_=z-_ť#ow!Hӛr:lPGI>lԯ=rrP/W'@	!pt S,Q,h+k{DVDY	cS]@BjbZC%7)h<wCۗ7sE*9DwBt㋖XU{bRYњj c2%]^Nr&wy3bDòy.Ѣƀ^Z`7ǜlL}/(۷|-!i7lq"Ÿ6\ yA.FI]\mm}5k2#q`buGm=P	mo-sE]˗xC<jT8HN/_ dr#Az<w/fN4h'~JM;/ԝUJ23f/	&n>)s)\ٗn4*M1O*`D-`{,1~Trh;/Pb9#k)dӅDC	}+ahaH/KT/G[)j_oj^2a"r#_
7 M_Khojۇ<VbE|u2ޘö°!b7=%&%lpzuw;xZm)P{0D TSP>UrpK½cjHܿVV(
e1J!o@}]­Ҝ.fU舀KTn/GO>q|Ĩ2X_B/l+Q0BgIak2JPcP[j4y z-SWP0"nwtFR9D+02 iܠM=
ͺ)]! nQ\&*m~g
izQM*欦uNA
x2%(vtd˛|Ԗ@S*`yS~mx9!}5="ׇSFn3Z}M%5gsE+AsׄQ5x6<UT+GUo>UOt2Hf'
K[:wU,E*GGȮh]{pY>$ɮXt@j)Y685hrs+<p766/H4)b<!jmY}7676k}HΣ@a8K.4VVe
А$Wok)N ʧӻDTqD/6@U>YykxX2`'t=6~@i'dt{"]KY =/`(Sw}K-U?KF8^iMCf;匆∃w~ceD;uOy|reiotHnB:^8r?vhRɕFլ5jس$}G4d+y:&
#ɢED4(diobyTF2LQ54LܞW+ҥÖĭt2>T	ج=--&%$j@#'L=tܪ{ss(Y(2C}x*+,@ᡩfჰ21_BZ2nр0!.9& M	֒MLm\-f˩;lmyHh+נ
yf7k9Lȗf{o˪4)Gr
Br,u0VM3O<R?t.5J:3NM?-lj^~S
$_'Ϟ[U"kMI\t7s1uCNݲO>fCcEK ']G%'쀯
qC
ohm`3=Voq\6|ٵ~p(jw
#c%ZEpsց0xM7&F莐& _Ϗ|Ew$lM8tnp$f2cZ:~x^
>9ޠg¥
Ibmev>4ccQBesc77-"&$HS1$q!}lǇF,3em6dWS.SFt}_*6qC2U+jS3
Gh]8dOmVa0QF%כ?aLZ^?T߱f,Lo)
zy#aL
T	P㮩UUZ荠)2A2oWIDR$&M׬}yb<;9?Y_yŖC"X1 큈2A	eazQee8b>q3EXff?5uDP
r&d[j-7S00
0gI2^gT`.'o!BI^-@Dڼ8^7nk,`lA=a*_'F[ye{/_p	!p F8"!`H
޸yh
ze?5v[m	3zgy5	󵽹ftU[N΢e0jꥇ%w(cu||^˫l@AUB}k7i[Y17ND=\cXrű+oxzGx+iCsF+#F2FkH	d=	XaUpky~M`LݖnT1D.ߺk	n!FW%U}
4\WnGwN8 D+BAK}~y+^\\Vx~kz]删@Hq>ΜIG4@ZL~ۓ3A`h3SM*!lT5$~Ǫ9p;fshu޻֑K&~?8B{=gҹ%!1W3H,*FB-_psUB/Yy$!;==c8/@L^%P|^}dnܖK}{-s0jX<ƈd3=&:w·]7%/H!y2"rM|'YI>YJH<6t5FײCn9a0㹇
C,X~vdPћsHo6`3g8#ד5N>?32~kj4E@x()-T,ZgwYPJxg_.13'	@GV-^!ث?lC=;<Xچm8g-@ǬD}G+dY!;{Ҧ,3b7<3*b4"9%Y1Ff}h&wrD$y0pLDߊ{13BvĤa=\ևȲxyǦ[J<'H-VW-tHp`A{i۸egJ)Tib=&a"qWkwt{3)"כgएb:	"B(2hsDִ8&p{ÀgfTh&_e=50jAýfL2r  R[ׁ$F ԝ	6
9?au7b4ӓSz<x|߱>XсZNRޭH4~iqFfkj?2Nꋖ:]޻~0kH[Yid	/̓:!Z{|qn-j/095wA.T"#޴ɁfsGT+g^\BGZEpzcjr>dQƦJܫW/:'@h)@z7#Xe8}DҸ
,,虆ձ"TBs)0uM\	 i'w+HJEzyw_YWdASm>7ٔMeZ+K_N*2̺tOrWX9[!y8cWb2^VDRО_BVk$c>keg-ÑVb)SBb~'oZ6jeΉj
Ah"n1	+޶r܅132/TF&^+khRM<Ua{(#mkKO)Oj>dL5؋tn	F`&ԇknc~gN`JdkjO{,n;?:>8?xq~jQEl滫v'Tj<04hh7Ò-(=XӐcli)jbFmHnU-n%V(Nq$;J>ulG?OkU`,jSrȿs|+ťQ2F҉hd܏{H!hS`J]S.8&Q9VkϢM*8jMK˟Ң1ȲFhj2kP#GZYo
)822;]<,
.Ϫ,EFm#61+هʶg?aPyv~z5bZ	P6Zi@z,xqzy?TH҇Sy'e 	-Ŵ Еbxz[.,!15gsWr1Xb&,Ovziz=kaٗSz<eīH%4eޟMq;pS"XliA+Xeu=cEn%jJn%* ǐf@q)LRJYr
K!Nչ=JfA0K8A/
#Cl `* _,
P>2!x]\S(]&=%0CUL(sKDB'Q}t5
^1j5~sK"Z;$Ԃtr[@*\SW)5I'Z:y='=tb5;4ϛYum|COm>ay?<D,RA0{d/Qg&IV~h&"q]7Uw֧xEl~vh;_hݒ'm4Rz zd8'=ώo-[,kM>>\)T~j\,|0}8z8퟿<=>:jN]?}Fvw0'?qY
S-T[ݩp2:z<.JLn٨WoY% طiK./pQ#=3s	z-}WEGJZ཭䏠]ʯFUA=ĄR7 "f|͎W ,i&qYLW^cc2tRÃs4?)jgQlm^p(+9uӺ3eL>58D:dB''wov@)<;2l&%$!`N'iqc}8vԈY7泋M?!/&G'><oGg_d݃*\9~Ł4z?S2=;T?Nz:$~Hn0ߖmצQInIX;:>Ȧ s"*<*p	8-
?tMqwnb=&,ųCޠlefwwnؕe«~xhxsN4lb%|u9ui!3`cv,&I?y߁nӷr\?1;Jc +JG=\qwN*A$'Y񷮫A2yxIF_wxBE: > LP۶1s$t| d-Մ\&m^ةIĥQgXRǱl<?kyy!{nEk/"4sşt^#ycDAn5\69/gF3KIt"vЎ{@hSqz\~kjTpTTf%FH̟\.iwywrK.C
J;,n&>ocKTczr>A^D |62q)"uz,TEh}MI<hߒ314WVI")2tԛñ5墺S.RHH&>:`ΐDTpoA q=!0<1I?(stǜ<f15n Gp}5=zd	$^Bev1]6&WdtMF[^.ӫœ'YX,yLm߉OH\<	Zac7O|;ȦNdsLt<G"Is՝׶͜`A&||b&
Nuc%9:Fa4:mt.TAJ0oNL/Pf#E+p,nMqYjњC4o\\j`{?#;|9G@kcR؍O[B\=J	v "ӱB~raD"tȔ?oz\JPzqBWH~WbL]5_5{6PW#v7m+Ih6<	6Jj`E@ or"?k:"U@s[&8AAH6O*;hՓ쓳u@wu#e5%(5ǏH:9\AA(?IeNN{^ kU	M.4peJ~؈l3ʳ-2ÿwٓjd8'`S'b5zw14^Pui{U鞆ԉ4]g?Hlv\E4	hWx:fRQ	$
AG̛$,l|7& ALwY>/#qCRL@s ;6)=EwU%)Mtp9.f<1|Tb&xӿʉ]Eǈ9}KM4$k-iOQ*x>@.DԳFdO],?Lҹ	Fj[,/fdLdIHn,/m/YhWIx3vo㭿31;kk>|R
Y_<-<|Y2Sb:qgFt느VLyIb7[#H1XFdyr&P#NAj>IM\6O&s# )Dv<oPH!Bn?%./"$>7QD	TSڹ,o;CB<iĭg}5A?2e ,nq\^&Nfן;{qCN[_~=|!YCrK]Hz$"Ɖ$MO6jLUmc--u-mstb۴>4-Nu$׳&ŀ+Bhԑ8m3&&C<"E/-ЊM[QkE3Wm-5%j%>>0GcwLzU7k&A_Y1dlK_rkt<aU	-ʄbeVN@n+FGN^qEvug,ا*tx{AI|EpI	V_UBj׻V>+|ATx,P/] 5\ZZF2C̛tjK?s<	+ʃN& upײoYf$5NR1WCa*uۺS_X'ӂ*˾iuz#Xjz6. 0/VW³ƏbH|l <:>?>z/V$ُ^Z?|_Ϣ}z@(Ps;zCɛHHCN|MS<V}цxQǛ }F.҂eG	(}\{UF$M ^E?cQ
T"aTeNf}ldX{WjqSu9;Uu9E C'5eͩWa{UnO+oŸFOI;6#,#N֖!0|b89n.nv>9,U1`_[ "<].	9 v ]ߞ'WH{{%>ﳶxk٫-]ce^vF-r(HRI82a)pěٌ2L$3˪T	r28KH	Ch)C&?pS}gU#F28po9`XIfR*մ@-T
"<dJ~1Tbm^viOj<]'*G<[N48)ަsv%wK|Z0Sq>ܖp\!ESd^u]/y=0ԝ:B,^}3Tp0YʃW1T1=s{7fJѰx1	LіTT5
ӬA6a6{D. ZVpi1-űPk#Fbv{#xNK	J0I~].ilǡW8e.d
O#tcaGoͺQ9knV96qU	{xuW*;IK|"_N2íHğ4~2+nGv#t6-	^@ĉ߯nv)9NV6GQƮO8?9>|vj)*S?/)a4?BXA/K«S$tDRFhxn ~˩
LFڼoR
2E:yA!-Iz__Ӊ^O?m~h*P-mdӬi0~oK{ĢŔUAyI2	iu^^bQvLkzo~;@s,+ +$+_5N2x"!`1OoB`h=Ƕ!.-qgAUj%>K]ͷE7.0on02.i2+;r2+
2s
u'
7o"8[UCT*:+cǐ*L_A[=[f(B_E3E& T
!6\BY&H"$6j-#RKTP*'}1>-@+V-Fwͼګ?y+]!O*`!gLѯ=~dd YplҲ	7D*	ksFpOk/DLpY:#|GEstV,nLeD_<s@w@}=$%C؋wb:M<='ǀ^sD`	BbEqGL=זG1_h|zˇARTx(.B,\|mέó?@wٛX=&B il삄)`4a)1a)^&v}V3W3wϢC*#<=:A0O?G%5`PU{?氹ɠ[:Mbbf4@>Wr$(
Z^<^C?g{vj@{bE6h1Ro3mnϺwN)}F&3bh=I/6e9
P{a'Q!TشW3\.9(L8fX`RQ$'ymbRWS
u
3bA0B1 ROKs~7`,{uMX9\X9r	C43v?ه	ΣyOc0tϕz3$IU2 5	BZ[;e,֯s0[g!}>/]VK		q-8Z|3y[WG
W?jvz9p4S"txZx_h5Tv95аK߄GdN;1O#
er16ʾ	M;{ǦČq"({/hJpEٴ=ևlI͈ZA̾-O{N}
QWE{}Y%.Κ 03s~Oq^pl'xfPakt},GA>c$%s=+$;9@`6!GbwMGAiVcPeqjFlIp򶘍iK<5cf)T%ӂbGB	HY|Vwd+jfKak.>Ҷ6FyW3`z:(%>U[$ze($\Ґ GѦѨm.B.92n:ك'c-{/1e!dǃ!]ggn!(fpl=){aFId'%d;3#DȒbn&C3yL0lrG˺=
wIT$(.I#'1QOaS 5)O*%b|/)Rn6Y՛ZN^?+W=VRx,k,T L S{[-3j^L[rp|g7}7槚ll}w<HzoPP7%ߙBs+
՟pj+ã=)# |9[)G IKScW
Yqe&NM+.E/R] ppYj-EL%VLd
M&өױw^dB@ICGK|A)(N=[LMlQuuf5L-x*JƮ_ᚰpTOm1]#c/0>0Ыoܠ)8L{\:[\Aٓl3]^p BK~8 q+mYEpZh?3*[r0Fj7k6S0>q}	!tqG~a~|Ǥ	
UHx}Pgݖ@ kYc7_q
fu֒[#Y`EZ"8Qb4n\`wf>İ.ȇC"ufk'D/CLg>^"c܇ƠYqUph80n%1)wleaMSRJ^pF[=lAsqj:Wޤ/aa=(F+
/ބ|)7B[%%8[N%MߙMN!pEo4;5Vgա]>Cvcz]Za=&Usқf,۬iSqjm3j!\_[H]lryNʰrR(v?IZ;; x0Ky"{>|N[n|掺J/Msuj04ݫ6_fC΂4"
=:9}yb5;_IF#ጚ4[:kAlqUcf#wu_Fu5+78ԍacA]"cmX]'ʽ9쟑/(yBp'`kij}iuw?jfJ}?Nf@HD9.V.@}gsqP}&يvp;\Y%껃=R Rn
>ÝX2QE_.k\r.~Mc>sDS0-Rh}P@ݒ[O_T粬ݍ(I@1wV|^Q޾~}[b!45]v'mU?a	Y(_^ 'tEс@B%~q MU# "6
uvMBۥri/)na_\BQǚoSR1NV]S2o)NODihv<~4NkyyqИg\F/qWtjq)|_!NoaI8:?JTDJVbNV|Ȱr)iV҄	b&Յ̊qf~-iR,KɎg~w)<>%
$T>VBc*qqMvz/{A~͐!9IZo(>$xwSAQ;,ǒ/QHOt5)?bi%iKwL"QE̛r1&@I7V^
`b!u8"tj񼉀pji??`ܔZK/W>x;x?mlewN`	3nYGr/Sƿȇ_bDybǃX76Nj2z[ZΠIYhz@3zQk,wezkgyqhKg<GMkj9V毉S-S]V9}!@\-&olS~	ntb6$\\Qq+@ߵ_Ë5'}RQŐCkhSZ::Y_>ܖNq%SJ⺄ZI\m7A#'^?S#NAYuy-&N-yWįa֐.踷nQb􃆩@`Pď]6cF7=k^ё+'z`YE"L'nXÙ4x
"΀dփ5Px9քHh	W4g|I(]ca	H'فGZϲ؜7bTw9{)VKϜoQEO~pt;.ny+⍎vj=PnF >ɵD4P:׹!HTqCu\yAHpjCMm̍bms4yt1>9?uc̙%j3Dx|t-ֲ._on7W⋋_w9\|J2QSO2TTԑ[8 .Q&D N4|ah=P!^Me6*`)MmI_5}1Ej:֎>K^C,EU1v$1	nOC"lO\SS8zP>Qf xFk';;=8(+,L7@77 ,0kt2wdPuvnngMpL\vrrJ%-s21sZ|6.nR_jaq&lWRm¬&c;>*ML|6	<yYNPt2A'ZjO -bmZ=k#|'ЌDꉩ2vG4h1>!|}y.kQr)
ġ~獷nVĪKp	Qxgc5rˏq4,b\ki{=.FO:*5"1j0,. gCVdԴyK;Գ=0/Q-ɯaR'm+C9]hMek[vg/2)Z	dE7$b9C46LnW03I] !5l#XѤC<,G" 	3%߼K,DjYr鞺'B-")ro|c2gEU)DDgf:Af8 rpI!b<5x r'Qgꏇ4,,F0Y7SѽqX-jAq4ƣX^8Y)Q~5ٔ+Ax~n0:lfT|
I9UKQ!E<oXuȻS&#^34p&Mj2du<&SJ
Xܕxq=G&Sg#w߀{z?!}tqŅ'ӖY66]! wumlc>Ub+.5
aQ]=Iv'q%8}'"Mf{A&
߾G|
o/>a٥"_l_{l[aX=e%@*t}k@ :=>TY
.O*`{ڈ*|aI&.D+Dڍ$۲hp;,:$o
$#'&7>i7Dp*8}xJY66|0T;ӸZs<aV+[γI@/TQMJp/!m!$Tub|4pAszWzFcEj(Jy"oz^v9&Oe]>ԣ<x&ą1{|8!@@=y(v/qbM3ZXlId~NDkXdYBQ";|}bBEb$8f{N?^;hM*2WWSaMRQHHƙ++ydʅ8&dns%OCLofw`LhB`'._BMQO/ka;9|}P,iEdyێU+n|PVW;W8A:C6&,Rh<aƖ
Vq'ºL	Ì'?i_SYt( %XIq]oSjԦc0N'
JByI8-K*z|4+)5aXP
6	yAQ	dMe%ef]1 ~z3 Z䦸[>fdJBep{45VPV(>X=:}=#0ef=H- -7m  7z>u_s9+ވVvZ=>5)fRWfR&oi?Sq{y2(r i=*PO(:[Ci*(b-<AԖQ&>'U	燲^;O>cJkZd GG٢>
F5A!.q'Mp)drj#N `ԉ豿{toRiJVZ4u2&$΋wq}1<UU{Hy}]'@
C3K}dRVXR+pxMETvdo׫}}%ma[x9K=Mn*-kl
D^8=tyBJ	ew˓7zQ< ŗ%!eǓbqg:2fzV1@%HrR"(
*Vޮ`!<.BGBD8t[I8(juI)eF9ҵ*<u0_
+ߓY*YBfӓ#Ey#l}Q$֊GjKB_\R]}!E/jڰiV׹O2]؄\' 9S'w̕%>聓!GOӪ#FԪ7<ƹ}c؛:Ir
3I/iL1w636_3j.{69KƋKW|x7mwSB`Ö^=	X**$oyGз[I23pko·F|f$ң0[4?O_qc3so?]f%mo3sYwCZp9Y&l-` -AMc'R@p 7G;tHe:GtgރV
$18?gM9g,7T"|29-|p~8N$JJ[Ly'N:|@Mt|G"!cL!B	Wf%[]0
!z/%G@ևX4˟-vK5fv=#ȃl&#A3N y4,(%fH>b> V?t; ͈f (\!f83^ƛ'	h5d$:NV0	+pao|N9uB+Jh(u`hx'cJ뾉^ꅩ3 >zxRN:=Lr.'0bm0K>S))t}(.73qG7W>˵A9^֤Ҹi=&RQ+p-%Sm)#  \^X<6_B(%0^s3'y~NI8r3J<ΉgUϟ"_vW&\L:G&' ZaIHkv7<\-" 0"hTW/|X/jTCZ@RWU|x#BfH5Yh` *z6	AӪX'Uw'0ĺ!xi9G$L$䡿85RO8*9lKM*+(!$s*^ob4ɇl՞3-NWFf̊w`򘣪 G's)""P+FK!!*&ӧ^Tb[!UX9RMETvح{ @
@Ч<(2f)ehiј;FGRUh(tRU%34lEPv@@2[O!slŗIeVxlA6u}e%!vi:O)JaczX^_.:4M!oBhÈtg7W`ޘ	TXەDG#hL\Tk]+s)U.m+)9frYŘL [%m=G~paŧ?y\*ʬ2)A>S$%ӨLw^ iK8Ӏ:w~F-eZ8
^kZ45L2+Z_.e6Ι^		g֠sUY79(A :v®y"O+H-㿂. {!?s	n|U9ۛ[Y1u(\|1e5Mzkn,fQ@q|nxs8&:\B8>d2QnpEv=\rԍʸG0Au/]
/	?^I\]o":B~֔SL}"[cf-a7 n:ϻqoܩ<:=_rliq
$DG1UU_
KsϢ-9%0!Hj$`Ċc
OH)1~
ykd(;sA>(dm RKyX&8蒽 9ḫQSJvD!-(IA{Y53ʓ2E&ܘrS`5Q#mӋ/.KZA#VݎdӵYdPЍT0Kw_>l/)QN݆P- #I<3LPEoFM¾38#]"1Vͮ9IƲq7HBҕ.7k,kΓ%D=ĔC{ݰvfX_9ʊ2('DuvP@r!GX9DF1.0CZv~jՐyD$ )13fvl7</9^o`j}&rFk:-1>"nH(*v"6 3ge}RCº`e1ɵm ޾$OQfvK{z{M}0[c@p
e*J2kgoYY}A|_0S9!V"P"'y$; H3GfѱtJ.8\U+1, *"/wS]W\N=]Q di InB:d'6;:/ |e-r_zc۝rj
=,eal.D̋/nA8bOfwiHeh26 vt
/dK<`PIBєrmO:!.nK0>K	~f|)-.&F TˆlFg_iRԊwd|HS1Mi.YMz Uר,0^GCS.CMbxaO.`6tp! hnse8D=R冝`}nxw,`DyJ植ˌk9M
-t<HI&I0mmZVqFVSGәY:N_+GoQ#,Ҁng	PӼf;|J!1QSX~bVz&˒UQX|:r	JzO64#,(Eo"4vpf7NRHߚ^Պ'nh3[VHROPec2^ߎNvxZo<w9xR_p	(h~;|W :ظ5B3k殨{yKHe0]5[yht6́ϯ1sF(nDCXIfAnL)?VcA"tQ9`bʙӷ==r6篠kZvQc=&ßba\B,أ7[cY{Wܟ9Iz auE>^Jt;jy-_*Yo7ےq	3?hW9CB-Vvo0xbCW[PT+'%]3-<ف1Q.E[HlKPqUO`gLR7)21P`6f/nu݁T KIق
9895ddp-5G?a>eK01QΦFF8547{#,7.짶q+S,vZ)]*]jF:,1f~<rp`s
6Z;ܚO^'/~з	|kx7	)O#5,e1VIykOAXk0lP#h&$WԶAREOocc*\=@3J .!⧔(Ekjf#d'F8s{:RG"Y~fHlRQ(f`XX$q>rQ4M{UCv |C3bC>(s
JK~9eżP\dPEyeŲ b2oe*ة:ȃBbѽ`-G@R(bm J%u90";b\$l7dS?Xn!((AS|g" _pl}ioEF\4gtC;}&Ca !б|*8B8f؋Mo@-E@ǌ\GsF6 l?~mEAگU SXFn,Ɓ!g[l&mpDړqL${zuTb?-E)* i7}AM#$yag_2{s洷wvssh1"$ZuEF*4%\:Z#[ի\72<2d޷a15R^vW酑*Z'Cuv[
HJ~begzOuݨ#f"`Q<ԉFmU8o/*`KIHvh,1?L/✋9Zj]-VZ0lĩ?3sU\Yolu#Ŷѽ6ѽ!mSUH!^Ѵ"_EjPv͸ip\VCUwoCn ٛ}gm@o$R/s#P/]OVgcqj4L-VKYkHor3˲p.ʶ|bavQwLʻtRIx~ks\$G!	W$	~~ߞOO۟'1@wv?ڮP5o7K}\ħYXRpAbD)A*s@*H	"c$
ܺ)ƻkh1߳eQxa-ץzZ;%ȋTMǼʿuޑ_$;ɧ !GPƆ+>x?{  @HP:P\N@ n(a_$	6-V\ySٖc)>iM0	`6Nb1N1Cʔ&#P-#f1Q] jGwDǈpY䲥3G2,6#覱ʫ,jm{*1P&2ePBG\	IEV 蠓F6]bWENKMK i֎MIFe^WX>:9O y/1IF#s]۴WE劃\d8,F
&҃$3YA3,8$hJR'DX>_#ģ5ۑѣR ߘD^7Nx`{KEuKFyxp
j w|d֛0h"jgumk|ٶ<]EH|31k<zm֎lPdfz;gDzqD!9FVk[mNe!(M VS`[,j֍WwY"0y)!k֨ʦ68 8#ަBj7p>*{C=COvTFa!ю:Qǜ`PhX:N,ճE~l:5wg[@,30z~ju^	6DiO/o'{7l7?ǟJX>xF;0_ɤSEZ?uZG
jZ8?|jbK\0jCa`iA(zUN64iQ	Fh1r7Yt>tm1ж5JeFW.>uk]`2[н6L0<,҃&=JNxV;cMj
!-`z|% FAc+(_^eqB@r2"ydX,%pbM66XaҢuZP!#JS]RUdF*k2'Z)CazcṔ(x@aJl c]~"T>^@po.:zHEH4ž*@s|WKr؆iOeCRRI_ "#)C\۽aS/,dfs=0MY%UϾvA~;	!j6F!2ugP79XؤTDI2w78)J@_S s!	X+':t]!3Ԋ&̿6+/܅3r	P͹-.>IbƕbusE:,xiIOi RA%ݓ=n$Kǃbrp-Ow[	YAT,hcXd:ưN%x.]|!pL
{jnk;	5I/HYGO I 􌷳(+a ̀ z^beT6"vf:?FFO1ENQ~V(hY_9#=È&|/1Ϫ9=ǃ	oK?X00EvG2.}rb]y#
^$>jφuA!R& 
XBEj;'ja5nv9luLl 4ƅ<VÁ{6>w6]⯀Evw8/O'FWgArݚbjwGGx}O|qs~L[`ɢHtH,c R.X⧥m'O@R0"8.wpل您|ͻn>姛ힽ憎 al,(dTy0'h ^ѨVh.6NJuMDK]I"n-[,D^exSDD)(L]1$Gv[sӉ3
Baz0AUyֹ'<K.rZS-(Tzq m3iRJ%΃W%0sGiHl`rU~*$H~܂u|j_Zwy%\YK]4Wg~Jome͏~%
ʆbȀKa;8?y	a{貇O~7/{G8>sW7,J|CӸppbI}-p5'>Y _Vo<:/qކ@Wt}s?}=GA/G)(aw{ >y5q%{Ǣf>2 %#;*;o'Gu0.E_Î)ZXb0KhFTh$(;;7o읟z[g6{X6iU9LQP1;Ɩa}t61a/3cqq1։>٧#0s-://X90Y	wWY!dwPڃA
H׳@+RBJgHK] q>vH>g9_aP^5~E?Wv9Hz9/:'ep=Cu@Gۋmu2?3K]늙IM5",Wҝϟ?>.v!^qJ3L1z{F_{j׸SMé%mG<Di֓<t!esp!U4[GђU
͟P N1hۙu`[O ?	o]0X_JLC;oK4i!n!jPYVZjWe<|U/IOXUq3Ljm]FCqBV4վe%Zc:L$Yj?~ﰟESbMMg-a F#T{$x[7͏BGo99Gt)'q=#1N "/A@Le;PQT?KbMA5J-E(7cD\Dyn|6l ^}A/+ImѺEoX5qv9kL(տ \;?c8MAΩ'|Dij &eGDp0V3	ivu56ǎJrB8:cMBH@J8֪K3{fQ[4f ƁEyQhE_ZY_(
TCѸGS,!iFJX?*ͭGZlq%t][Du9и.נf_A9z<%tu9<VaP>~,O	[?D1e%5f5P\cǖwK _ ;{ .:n!,nd0ldrS6܏QtA,q{h#j2L&ot ^LbѢ34zkF{q#-h}Gxz"PH _4&:`@Y(tpG,}
6[qA@$H,fhPRm8t/(ECw?F8M̖DKߘj5#rh#/wv]Z2xC`"aHh%ffE¯H*?u=#b%j?j4IC-FLJ
A_n )7rLTvkL`h)PS6&iHNsqxbapP64Go}WSq7'dӕC9&\^\uK@1yf+.cNSc!-$]Ӏ070֭W=J>5a$}@.E<O5d~a_~TþV;q/1"OU)Cd:6\s<EPk͋,5hwu|(BQ|svtCbLb4SJ0{~rDHxR7OJs)O J#Ep`%Vd- J450p;E݃1UFSUHq*[U; $_?)%'y?<ܿ@Wwx{z  0kQZ؁<r+_ IF*-9#mfHt{iAMыBWS5bQTJP1PeĎ 
(;xt0lcss)FL{H]emdZfxc'\қtjR[#>ID7e(N'=ͷR7#6z`?֮'5n\wlKKȻUK6lGm")\0CK.;2\4DzQI)E9	])5U"1H"MwovHk.L<SgAspos8JJiS#WĵY8X(wޢr&tml_3ooJ>ߎVnsCRݮ7D(xﵔb9̯V|0Y {4{~kF5^W\=oǙ?7x~2zGcȶeS%eSr*G"mx:NLk1p>uXȝpqwvY=>iKv`GuXǂ@>;ulq҂其XzhTb#&OĈ!gС90@6GGR-X``ʒVUG(c|VqFKI:@S\bmr,Ԛ8}SMvO2)y;Q	CTmO ENHx~Sp"lF$*Vs:őP}9\b._0هm35Ϻ$n_`+X]|ۺJ/8]IP
Vj9PeƏݣo6RݺJ\FgוHC֪7n?T{fCJ62^fbէ߆)}dPD.=8jvjeu:W ;Ύ˩s{qp1aᤦrJ}"IPOuRy;_YGqVa1^qTE	-h"!xNx/,nJ6ifϴ̣h/2à<y
Fr)̀ecazHMIGY<[\QDXdy(;b^;6,2=
Sl,T/-]˛y@P-j[UCj_'y7`OM^N֟9m7o˛BzJP`TGtUj"RY ƺOU"2J՞Ί]GÜ`+* ^Ix-t1ц*(c~Q](ھ)+"wµ(cN Sj<w9%)8z/2sWcJҮ@LYϑ 'Jw WC*/.]U	y}nҢ~q1.pcyKcXhYt@&"NdnAY!N#FhSI<A؀2OeXB,$k>OGA<f\|+ӭVކ`~~yg]0v&ғ'hivnsPn}Ĵmt-EHێGX19nyQ+1ڟ8RN.WYw%T!PuZeCM᪪U̘K}"O.&Ne*CU:ΰ{%)dEnR{1DvtsTΐa(H(qZim$bI`$m)31+!5+_A@f٤LEVɄh06pmOBRxy䪽zN!e	.K
]|$,PXxϏ0nU A6]&|Q4fȆBxE5_z2yCvYS>%mˏ_|"6('\MU BTi
Bjz5Khu"Jhux}꡿ژN)&dw>@`8,-lgJJI!6XPb
+cfEY#vOnkTJCHLL.g镃a-
Ԯ|Ji!|FL?ŷ$7g,Wm4ΤL\k@ÎxI\e	$R*x{ř^ZO8iAi_ҋqN83AL8?Kʓ-d8Hvkru.[Nf==IA/T1x0ᨈg<3};kX6֮7G{HaXL@BRp&C<;.QFl1Y[k8|(nl="Ml5;'sĩ4S@q+Vs,#K抴M;'I;R:;&TI+q\=NLJ1!Ȏ/l:JduIa#bV{_aw( /\i}#(Ok?mvH?ΐ3_;*1ctoI7=C럗\շ`U}U?zW>Os|zQU-,9TSɞotmRAȢ́ZQ$%٦t)wq!njg8>`y6HKKKB|8kuHZ!8l3y7RԦd4yjE侍<H<].PBn1cLWTW?3<ab׌T* zi
U':%|oCSUyn:~kQ_f;5B(X V&He+=ϫjQR,nX!u
ɃjAf&ohD+$Ӹg݊a1n+p)vڽ.Ot-N=8x7{#Z`rJ+J^Y؇$
VE=t3e!Pr lD?T';VZ.@*bEn[Ns6^F9ź2[clw(?ti6D݂2#-NtCe`z%YZ"B(fOY]Z
SGCۧv^ϔΐ|<ʎn_kO4=:ygoIMuY`\[Ɣo^6:hsBA\1ͭ7
0"(/v#y+fnl?V}.~T7;\4PttwgdH	wL19G}lLu^1yWy1j!&C(NT,Y1OQj6v0=ē<
 )F3RC\UtCNlxGK$
oΆӌ3ZIzVBxo3qD.^UY%V;}iHh5c@glH$;ZAF`iSǂʕ maC.!j
^M	7'(5Q*sёA[ˏ}YaM~bIuhgH<H;x8|$"԰:Z	r᪹H8 #B3`Q2tVaQc!'[ߊ2]x:-=V|V~>=fTN]4\w?˨<r6aA Ez0\뇪>1Cӏ
I\pYVX,".J+_WJXJgt4++,sV#{[P-.r8>X"7.$yWP>ʜ. $q~0H0?dX!	*^˔i{]T/~M2A@U*[dNZ+W]>ye呀.*9 ӭQ	5WMQNjYdpiLct=h `XpI+X]3ǣpy]PHl/m3JD W/Z н$6TnTiCLe¦s<e*:ARVoxJtѨ~eg7hAH@-_bzɯ@-
3l`YD,k`FU1|v:x
'B18J`ᅊ ,͠&?Gkd;(AMc0,*H$Ja/a !;R:	^v=,֡ZTd۶
8fvyFI?شZAjY?I\poPIt
VÚLc8wUAO.n%Gݡ۬%@K}VQShC3*	{1NvaA{ɢ$)sD>UⰖ:/"'Gaְyba|bհQ[g!
BL!`N 0BokE'rxBeFNꨪ%jho>ĐLV1|ïFkY +Z)
KX!v6%p0+T^a~qKXL)O0YS?ޚbX`Lɑe~1tf4-g,"h2bL&JaQX:{c	Ӏ-[CS&#nFu*ze|4=Vop$c`c^J'.Ŕ8~T}okHR#yeP&%Y(sb*.%-Fr4ATauz(-*XÂE	
j%buGK罚ħtZfJϓ}qƾ'Mڎg )QP6J%꾵D,%R#+Fb$(k
"R[6n((hbɐ)7tPﵙm}o-]iO{moxK#/⭍7CEh;:zf~~gEIʍ+!Yvܕ]`x{jy}oIO4vc΅vcfM{jxGw,3?J_8 o𳏐i0_,:%#y5QY X`UTѸhQ =w55NJBAby]T04(D3Q!:xMxQp<͠M{RCG~"Y×b{enFNK0>6ZL)sMK9eS(Uƶ"QtЄNlgiln,Y>;ymH͞:;Ed;]WQ{W06w7)ܡL-cgY_vXqܦ
g*:!I/d6bO;p͵,'+j`u}br?*PȠ=G>wuDa: NnbvZՐ߸(ce#{w^DU%1윗=jMIo۰l'`M8\F!:t%Eǟ*s٬D?x,Ղ
wj<n6\te6B+5֧'YRGɣoyRG݋t'-唡 =(rȺ^F4\2b34'eɥ̵M@f-bm˲$NdzВy
0|a/g[S).pO@tW9UFХAn[q0eL>3,㚂<r(CUtW]MUbahG̍ XNB@G4*t1AmcGS	R~
 z.Him0OӓCs'ev%K}87eKТp:q)_Wx6ZL=/mtnvm#҄ߗΎh	wW[<6elxGL@/<֖P^r'ęiWYkܒD;V`QRٹ!.'Ar0fboݮlaNP47FؓSSzv-S 9_z׹wJE|5zdVTз2"pUYy=d˦Ÿ}7;kΛ:c$JЃ!G()0D4jo^jpݻeǜ[FlqVf9sD',`x9.kt$c8Ex
#Qu9D'	z0ş@|Jha:{<<Z'6󷉟q+ڪteϧO8Mi~1 @!A{U=`C0]U%s9q,1usZkƥ7vTGz1d6)nDYR/6y]>ƶBfZ:B18.+>`@OkJ.m<`s؊Wkm*9/9A
ovRoҥ\gjn;Ie8hImˡ`CJBsSwdXlndUZZʫFUECɆ,}7]}ƈzVfB6n9,sF5T!+-Mdʙ		}y^D͜'s7->sNqA3̎oG`:a<	w\7Zå=\BqqEζKnNBl9DגPLd'>6|Av`q!En(W<GM#/5L $U+/2H~hC$S E
ʌm,`G)/9D++M:@I PjOl(Cj&.'`bx)AveaNx}e)y=|h`}՛""cybzPgAw# ҥ<=l(hxgH;|3[@1YoYC%,ǃaQ1OXEqFy`.
?{dߎOYF/i7|c54΃{:CAΰAxLk\YԯaK.e 8Gэrl]qM#lqS|TkXeb_eN9dFr2g~FaM̹?~į	'2yaETc|QrAM~	DW8aLgP󕠜jDIDHxa /hZu<F"8	+h6"PY6SI=s?&OGU׋"w,Yuy),P`8.-_YS$wɭ|UP}7=bǝ<;Kdpg!F$N.$fFLlCQt)(rN"D* j4谲{`V`	d,Mw{;ivoNvT&қ
Ā<){.Kz:t̄3u$-%zdfwog3P/Yg*yI48p܎kzTtE@hq2.Njl6l _FD7$I:]qJ潤[iI=g9rⴐ 6/paaa[L!TFG:ùi-0	Ţw0/:[`H,ۅ&^ނ1)Vaue2ՈdL*6$rWڎXlߘIgk5tmj*&-ޥט\Z3Zi<s9c3WRb;*W$-ydpNvaFh[AQUw]metk[DBj00kdq i"*:Vwf^dZU&hLR鋮/0dag:`c~1 VW+!DI6#{]3.F=Pqc.|_˲siJ-gߦ?<ө'd+:}eRjj:`OTKرfu-SJ[HUۈڽg6&}NgwprxzMxӱ:*gtn뵬bpga^cZ_t@e)kp(5|ɹg#( !<{x@kÀe*NQ~i^.fy#޸-HLA4n/5^!CIo ˇ	aql%#Q?r]nWawBwvp/؈M<_~n[<)l!<ƅ$~i-ijxAlex-=<dgitX\ۍtOW7*VJ\ .f"ys+32QjqCB!"ʫ|x|/N- fݑޗ͡xk?hz~3jC,Pl$[RV+gˢ]bM:%,p[͎mZsDu@@XiӈV	dukmU.RdH (9x %O&t7J@5bÝP$H|N0L	T* 6pQF#$G?z3,v<@	s~Gv?A%8W>K}W@c;,j>6c5Uoʳ,K-*=$=*)$Awߟ~v[^C<+]zq[ $sF;4dbj±.Y2<߶"^IN*6wfut^7	-ٯrnxː3'' !!򛆄}Ȯuy40:Sb*p00 7ɀ0s#wDL4'pV]*x* ! $`iΪS/_fk
ð"n9$(C/{&_51QJ\{d胲ꥈ~hyeUuiѶ-0M|oe߅C56otu5m|NRN5+MhS?sxLűr̫Bl6w|1V-PN#!_d&"I$P^##}qe.	
mKslYfq/Ao0nT
pQYZT9jFr
y|
ҟͶo$REd~振T{熝G)o(O7B+|t'ZYMnn\s4$3z"pD3 r2\E8^z:vxwG+I{iGtd	_o'(%aWA[7a+xFE!~zrk"S
% 0'KؼνqTi)ef~C,y6J8Gvfֆs̘jZ'=6ܐlYĵy7N-xx3zú$$J1
uT(Fާ#-uLț@&y
3/bbSYctq$0l~N|(aqjh&[5Vy+zj4ig[\VࡡGӣD?|i-?]xYBd|F{Lk|)/޼<O*KgM\
;eud+a ea8ʄ8`1_&Wg_<4U͟Lz	T .-qD`UO-:j`Wfs2,gVMz[`A>_\xC>LGN ?mfz0OgO\__'lɟl_e-uj2m\޺z{#{=7}&EQ^Y?[r5b<gVUq|]O<px؜d.2MGf+f7ʝH@*!526{M]z/=RniRټGv]O҅v
koz*uba9Yt#TpBѥ@<pi^Ψң`1;J&*p4.4X3)F&(8rpA,6g}xm8PaApNȻJB.$	!ӭJ?g㳫=hp
{bn_^gjy:^Uτ7~'bX K!>2WlP2%}eS}sqW}ճ 98G#c2wei t;<sN5CaѕM%4p=bz
tYΣ#By|`.ў)cjxYVMs)E	`i	xGfГ?`NRNSS~xI5ϒͭM#/O-1._н5P*+C{Åÿ[[zsbPʑ^Dj#mkp~ܘKQePf{ƻ&	l&1w-9z
?uopt{/fG"%|ד>*+xYUJ]ιY~s-3[]3ٖh@+}}-X%GRo.> @W	k5B-_IVfF_>JTV^7@tcv*0o$5j-}m='haU T->j&\b<+;#c_7+X`I:;bևObFyh!M+u%Y:N~baV}4W)K괋{6C.8	L+I,85,zR|9=*bb-!e'"p[_JJ!P*ZSE$ugXR6.S`R9؆561
I-e}!6sc̞>Tn9H=yyإXgg`WN:_qܺJǙϩH|vF3a'LqbktY%I9,k0-9NnW[-/fM
l8yhg
.NR! ʽ\٥ 'E0OR1[悢rhZc=js<]C~ Y%g}ߓS7+kͿ5x%<CXujiq16EC%sS<\MguyaQӁ HxT8O k8H|:9?M"iz@GBfPSpAꏶ3pm|/Bf[Ƹ~$O]E	Z:JBRoJ.8)8ڠKu;ׄ	i>h"CG:Zx9ށ: tq^OÂBOQVNO5!l0̷vckS
&w,0b~kKKm@ *%\I@0_w>QAqjc\G|`&O._-(,v$ƊT̅Q=x|d",.=tAY#>`t6xsrsp83 瀬B6̏}ֻwSOT0<@d8gxm"vj/1ݣFy ^>羚q ʝ7IDJ1>L}Ӭ6w
%=nW9NFiQNx4<#slgj!1x8V
f2e}_]$ux@~;G{h޽J#V5+9fƪt$3Lk?`=7?@XxHa"Yp{k;ֈQ1x{PO"髂^5=;/Xm˗ﹿDxIo!mj|~>c+x=家M&Y3|͈9rG3%(aw"K%F7IJؙ5AVU(ǴA0Aԁ
aD؁V>ڍ,@IyBV|S5e}0wYdp
wlF{9X;sq`njI3e`r APhnYvfWNU(ٯG9D5Fa"#QS('56W(o|X7KA Y|.Ơ	~jMCxy%qOاJuyJJ0ܩu'FBv)UIS¸X:I`lIvxU\\"7.DȠ%T4$~rdQY~3kS)BAk?ū)
u<@oU=<,g%K' 6u;;5Ι8O#ov#fKpd!Λ!)ga/5%Gʠv:,!=pjv{첎CWzʱTT/NŬ,#u+";ݝq4Q InwiM6ՇlxS1w*CoSK󀢾KT`UQ6WAmȰni=#R(?`dɺ(Dr*ndRc\O5wm$֕ ;Cwj=Ux1xe:Oh7%Pp^MOoC/G#WTKNaKtMP[@}׶NՏ&4,1 79~iśg+;Öl
7,CTVW]׾0Q8ʼQO!dDi	gN&lܽMÎJ46r~(yX\#(fa>> sd؛:Zs3ꋌ,cFLd;9iU4T	u;"UQƤOr9{FK >RyfYGT $|#kAJlQ@XDDMf*v/FVn(ֽp68ɄV""IѵD{gKZ+'gyHQJmQ@-͕Ε6i+yV;]Buh_#%ݐ%rfRodjܸ#i|֧Pmw~ ;	kTq(ܴxP[/BPNN>Rqf6/$ߚj\-Q曝~!cN(᪳vTDBxdb0A0C-ERd!"A>}U
+Ii-oǐ#9Fw[Qܶ]XYamk 6irXnDbίt=n㸥\.Rsj#-DB9/sP$NgN5L+ IS*Pkיؔ&@|έyB0}
Q5G:vܫlW/Þ.ja)gタ$iJ;t
Af@ĞoGfH"mEz\EaQh:T#ecUgVvpHYZʅJb2NC&Yto[+GJ߶LqJ>HbXS=8ӅC*Mo[Ph`6/0Ε!d'S	(?e7_ɯ[iIU6FmJul_ۢH 4To@i@IC!]\L==دf
71#/nEEg IiPoYv>)+܉	ORUb	NǟIJ6F=.K"Hꑊ:Zޜe=߸=|ڍ0
4vhܶah4s|u6jlruۜYo_(Df`0⮛#QXZ#+S M)JfrvN'9E^d[|>6ai#Քoobom`A7FC.*7F`M߂8RlBeE H\HԱHo~B>cyRe{;.2'
R#"r3{S#06?uW8c%CB:a"z%aܰSKjAe6 T$40a\gXOٲ&ه4ff&Q!sҶyjXs<̂5ov,y˩_Y
t.È-b~ X{ %ؾ!P%\[Ω>`:SĜ*a|¢GĚYQgZ`L7<(K?	#D
)Rt
F&9C2@CEǰ~4) $K3[cs{Դ<&./F[c-4}HٌI7Ղp| ޢ`%c8'5zQ1+|98|k#D@d+Y>"mOt۾xNee;Or:ç, ƃ?򇮒hj3[So~UFbW63=o=OVd	Igw|Tp;yPx .l0(F *8e*3_h68|qjPqTab8Z8ݘi4w;%Eŗ[(?%wqK23}c
Q6q|-N<E'(Ob<ڕ L|_Xꫜ`Iy|ʠ~
B@
/O<f%d0>{9ɬ3>tKĹ~
67+UwzE]ΩL>b~
nq
$t6tW}?4$7tDv[ RE\Lf:I0Fc3亪NnH#T"F	$Nqj8$<`!L+3Mx@*_H CvҖ𙉭lI0ݵDqg;>W݆ml繡	2%Ra7թ/јqx*v:`I"
ͤvb[t&LqBܕ xi}餂[o!fgP[x"z`	//J0 3I T8t%R2=X@/Q`H>TJlmzUNƕxbl@gZ|Q,tj.Hşp>WTҹ]<L7H"":uBEI6;\OHo)<X_zYJ؟CobĊE `se=C̬c`ǲ!ы	o`7xAI<KByu>]g^v^$f^n(sYu۝-]A)*M6RJe9Oշ%7UK"gF	d8$qq2;0UgV4:1bM_"+aFCH(y$X\_R+zx7'#4e'sT2eTa|jI21Q%#EzKB'n#T(
rяع#V d7);G:Z!QN1AV>ʒhc?{Bas9"yYP^hɵ$EA+#08'p'P`w.	"X{=ٱAYZqT`j>KAߩo߇)PI,\1va6"w	E.M;K.Jf.̳~@A0ߘok4/t>=emkݼ\vr
Vx*U{#Q kڬ)z	T^ZAY	ڠonq2:pkb
}0wf	-{aPHF+mpuQ4=jm=&*uw>G H!{wp}׋KWܺB{EB=އU\<蔽s|~Tׯ[:<j;EnF^dlF7GbxႯoo!>/$ADBI+ yOe42":#`[<_HsX'
5BA]G MZٛfpS8KK*s9et7oEKфa{VQb8{jn*/O;trޣl|;AyL(W10el
p3~{aS -L#97;zl'6+|][ӖH:~Cݮ)Udמg!`9t?>{kEFμo ;h<-0}#ΰ._{6O3WTVD^w?Tr75'<]	K-yw3|k~ѢҖ7P͑yg\֩Wa<w]mb:M%IYxa|M8LvEJ$S" o
S͇WbC[=Ii$!FЛDC7,쩡_@Eo+-ljX2zJhŚT17"6H1Qf0
[O<T_I9*zn(eq#upT~'½i/t4Z\-&/YI&
fѩjuH٤EA~'NmsEL3,_dVm*:񂐳G+@@>m
ŵ³rDdeq4Kav,`KLsPrQ%+P&A>"~^*q(Do]WtbY_lk;5AK(BU)z&~ϛM(5r@et vq]6P-,2%2
)9ێ؂E5#Qm2ԵDYn4LBSF	F(P5>/*<')v ko;Dq
(ƦxeWx횃KMZYUr.[Qyr	$kS\*Ҫ0sWpmu!%0xV&ɯ"#hvwǔgeξaMPq`omd'qLN¿1<Axj><'|@4KTBN(-Ę#Z2}}59]hW-~aHC*k!|rfptxAę廱ŨJ7%;>-	N,#~8BnEl/{WS-ߵ442$Zx#1k?ރ) psΙ31EU5Tke:fqhǼ2=UΌ22Sf.F'
qĎbjIbS*c0S9@Yv]B<Y5x_B'TKq=`p.ĽMhNejњ5(}\^uX F5Sj;1'88mlѦĹrp0-<}hC>rFBrx4J&@Q1nI?POd˟Ǘ/ϊ~$/AbˡwBvyj!f5Z!@'
mcM{]i\A\}ۺpI;^<dV'vͮu}ԙ-Xm+>`J}`>hG:#Q2R[7PMUӬ7ڕǟ8caa`TiҪwv?0P Q!5Lb":Vh;v?+E1|нUARjspv3Y1}j|E2j׽=fVI;ò?PԯIi 18WU0^JA'ڮxpH_}&:c{gv()	r)`<韾>;iB;ߪT7;+6bAo$/D~LcN9u$)>sȎ7x0$PJ|k4t틹s!jʆ~Hĵ#Ue)N.N"r6rKfENղY$E>}ur/DAG3ho&L2hw~/-dvߌ؛_^1$١]QZFxiH_$/u5p
ML{|1{p*a|%<\;t}4wccb!C7=DC,/%r",6Lʲ|YB'D[\9^@DǢQvu]A?~8/*s0O[亚Tf[P3@CLWJ9W?hW=3ԪBH>`)WA()0
(#(Ag.*%~0̿?,~άLy3*۩p'WPx(%'bxb𹢦刨%'qâo{5mɺ/"8^M)(1s?>G7Wg;^RCh0}
1y;lB~c7NZkퟻ<LxL1j~W;$/όF8|i5f=nθkggҊ8~R9`08e%][pT3=$8UIkd	Ktʆ$
Yg Qh7YL$˟awQ8ۮUD	Fu>94[<[E'_񍇾lՓUq9oMq5BUR"_>DuMev)AcO9evD%Kf?`ԩ;]Hf/'=ch\X]nyx835{ !Lb\geyEYsHd3C 3<9SAs*tS\(ܥ!C99{b&寢6IgdOS\z;Gv伽m~]cџV#V2wO8kRY*nӊ:ֻQ=}/Q69v7o		"7fޯ'S G&t
v[;,~l⫆e}v|#-N/C"eFvuUS{W<M@g[<J ?"ncU1=;BlkW\MCbTEzQFG5S|GYo51!puVچ<}B[;݇77B 1.ѱA7FzC| )m;ƭ0=HX s/Rzmc|m&ezt;·R]pWcv	B;%CjQrE$i26!+%rhF6j/s:dOkS߯dv9Yw8̉'؍I K	<=RCUPqeVC>A*]Q+cm;x|cs*,䤤UulŢTS%0^52?<%=%G!v.L碉V;㖀B9{9W9 } Ob-?pw>v8w>>+X!W˽C\5| m3#^JzU8u;I*uK4$[yqxQm{HXIťfQL5$;}@f.ܗ^cAke-'#l
<j$ăXz;HgCR#\sXx҉FAǅ%p_M
N)joUGbpMt{L,]w1mlq	[KmPMaJG}Tͫ܌?qm[Ʀ?Bva[i32ɕY-y.ѐBDA58=ʲfPs_t7taᴸ#]g	X]Ԡ@B;*1z杖l_YaB'V#i>gO@Xk0AQ0tHNθԮ'dN}SNsptM/hTCG'1'pZD`GPXltkQ-
oc7Tlp t7,?qguS>y[5J	xhddpc	`%(X}?#}I@GGx ~;)mHa8__W%Edzu9.`/A4_V^'藧r <iþ-u8aٖ9t/P)p#v-U18uaO%vxǮ%ZRf+ߏpU~U9]!ݜN
2*1UTQR`cV㛜\.dh&Xp8w_Xlu^VqQX8{q$QEU{+NZޗ׍^jGp<K/	+Tm`C~bH=jsjϵ[ඓ2o
`0
ʑݤ.?P
m9??d<CH"XBV񰰇ҹM iB_n.3	ʩuQ9f)a|c|Q8@W%6z.嬣dhu=D@p¼ip*]b%z&쉨J}fyh"n4Hī/4o {L;~P6:)c޵cj:/*&cH't";v m-ܲzU?3v?3rpQYSƖE@ѳة~"^*A㡪өOBY	ʻ f/,ߋ^ZbRa¦r
j<f,U6EH0W}-Ag4mVX@FR&SXwd1,Il$.gm%!'Tjnrp9HUU]<_vbX+:gyZz% ߴ|HLQBh5!#vua U6I<_]w:J%enBF'ves	fӎ~Yr(,.2:<}|voF[ʟ^pL<ŷCpސ;ڦK,w鍯U>L	2Z9Jqr]بΉx'GGdgSA$NwًQ'xQn^9*>"iO&*"Ndtǵ~%	K^TyU鹹\hA퉆)p`*4iDhC(3^ԝ=<u}|&J̲
b)K1os܏~(kywmERG1k5u߿74%RyE\5|0 yw+b/8U-\ۚ"Č>
<S'	wDnf-<%-rG_Ϲ8лYJX>/ =ޤKon-{bM.7jZˈUHZӽM^z.%MW~m Ja/QkZdH Z5	'뢺Pm5D Ý|>\DX yU\1Ē?$>{y0x[1ەY%-J
nZy19s%C0r)`OI?t4>nLqYUsc74Hyg3VGX [LHaBX9ܺh͔jN?LHf$g?^|D[ݏl,,]>X<i+EOa|36Xd=z˝TGQv
7J\[H½Y8N<бWdLnhzy9}fpro!?@LtkA--|Jl1V}U ZZBoZW#ㅴrǾaE)A=N(F1{aт
t Yy0>N[uhau\G\J@ ְR6:0s1XV^ &y>hC#Cz/޼4_4'J.*6`ny5qyohw7όmcJFU! %'@^CZH`d>f=: yecZJP#/V,Z v@mX?2;!!|nW*MoY	Y?S/9Z'԰ܰDEtOX0,^_Ix612{롳 "Ͱ˥.d"͡RR r:B&9haИmz,)+X~}%k\<d)hn;!Q:n-]RHb+ޕIKѠϰ$.FG%Ae'n.$1"@zT/^ܩk|]t qD=2"
ǵZ՞<eh4-
ŀ9+;-۫rQ* n+9VHyb2pҀq(xC톆-J1)IeT<U)A5h p&`{tPyE̔=cRs>7qkt"=r6f`#o8MXxɍFOU":N}'B⚳[ԍhHzU<S9
a_vhǋ쫎UwS/W~ISkt9m {>m(qfCtKIQ?ZZiKE2F&I/Pºæ>6܂KHu07&TsL^OsVDSM}S*f#N	wւ)`O$gJ/va7\;|P)'C#YjK"ǩ胧BFzIᏙkg)/KW5w4Zq>cv M*"ùDzB%Zos[),¨?78JvG! 2-0JOl˥l$1+/JRJ\o"32xT
#K~Ļ$YY!bJKo-H;Miq*M_;Gg<`Mv,eZ{i4&ܦ,n>ieao?waRWQL`.Osj.QqϮ.|E7MZܴTs>$L@"%+.	
v%{<όSj4	pݽ-aOq:nUzfd?t.|Z=R󦽤:&$`-UPI,%:s%7C">3tx>7P?జ1dsRr?MkSӦ'^;g|_~Eq*KֻWYSO.Y$UOr1QULdr֠VדGO#!GɣoyRG&H0?'/66?uSdWI_=qz;3UaE1Z?
P-/FPned84*0
>azܖe,K(c$~ h?g /fL5K
 M $3Xe`bF2<4X8/Y6ö.1L(v*yG_VDf}^t6s1m55;!膄u1[cnx#.(>M{hI	'K9Ke;R%"g&ct1$(y-~(raEK? b,dtr[変#$JV-$r Q*'nL$﻽y~<xnsAd4+:F|R^"c{z9}A&-RA9A-*NT_HՊ|wZ_ήDc^>DƷ$Xkx};aZ}:?Of}#{c  }@׆FKşf+[s[/8pASߚfnߛ+6XvBϞ [^T @3@3zqu4q1/A)`	cU%v(q&uY9524LOa4j%@}2}HUW	'ӼGh9U0۠T[gaj\ṆS1x+`d7jNy] YviC fm>'zOyi۽Ɩ'[R$7AŹX,!N­
|)WʝHBܝ굄膶^O(Jl~|	/J<pn'rRrK<t@"!bakBo:gG-6W1Hl
"Z<[-VC~1\odp(BsK+a`M
orTkei[ItLdR7*w܎T͎Z7zn=[0"g1G u2`ws+8~Yp][VG8(L,cp;?Lo;,ܰDN3#ݑo+yOo)	54)HEh:#cЖopiWF/q1SQ}ʧqB}pqk\8tͱvlH{Mz)6WEMO,kj3e;	{J}pb2Q<\Ryd=TEijBG/>SX:#ےu Cޠwj`?{q0xq
-srOI65y[ZW4Q@h/<y:''X<x6^Z <
2'aS/-\ի2FSUI&3*ֶߗKW9JI
{b
늜scn+Nz5.&-_ wӣ/@y)G%ҘccR24l~1,}~ey49Sx)9a/Cd}` nW@FouE)`	Ut>z&lƌ gu|Dސ5?;Z_G$A5oJ|G&k(De	6C Ggb\7sBv? \@sLY`ox7H}MhGԍmҫgXB:/sQn<@68؃9YhZt7;Nóݝͩb `;9^AQ
^=R\dM,BIXwaQZ\(m"GV!ʮُCv,zq 1e)o'ׁ	MϤZ,씍kVJϰk:t Xo
{Sᬂ6EAJ$CKkcxeWB\7+F#0k_EPVY+-@c(A K|R$)Rƅ1c$+,HD"-&Q3 "%cE-a
tUfU}ec9!+Kp?f-I+r9B](L0àkҊ R-
N*&!!J"KiLQ\bNoI>J{	a/./qMI0Tcņ~)UȨI@촜͉qq/06ݣRle&4/@Tdk %bJ۽<^L)ՐoNQ­GՍ+@	sq,f+OS`8rb؋Z7/7cB~2C0<I׽ppk0ͱ6ԺYGCGʂ^#?Nco\ B$&ϒM7|َeq9#k%N(P2S~&CL2 5A:^RoEKpLoEI/E\i4+rE	z#Jk   E#zvݞ̩,i-NtUJB4Knta"໾)$|-oϔܣp]v f'qp^;o`Fmwrvo^tRvW+e\Xs=z)|}=Ͳ8h&$&+oa&z6o2)y?VI<XT]YTQpW-I9l3%y=H2䝜fvPF#B_Mr8Is[m4+'@|{f>Mv*Z&q#/<^iUXfp"(d ,:92jth- =tT9CQX0MT'Ͽ^m=S-.W$jř+0hjT\
)>YxڱM)ّ<Lir9K8t6&5l{if:PHVfM[Cr0Baz
ĈC7  g#?W
ar(5jpɫ~W{[5s=x#^zb!a)pŋ@XV |fwQ!Qk4ES-=έBUUم=W))ʺVRm亜}rܙGn9ɊKR6ɑTX͵hB"iR+yLt-5R??'$O9|\!_ؕ$k;w$#
{8(ͱ?k\u\zOeJʒ ""fa+}PIy}K6	z<7".y+0}_룖C6u-xdyymͥĖ&<Jdic5j:MtIrB%pJ}&]-[F݀+/w?3bޤ5v KsnQa#jr%44'6T>	@bD.r-z3U)P#14އ*~l[_wמ?0:{9'Ęo'ĵ6\N'?(o4d}M&q9H/5^	fAcMw/>Cۺl B-Q eb3[27e9;B:81h/ՋPW-4XPP޻''aw	yBAVavbq)uίnC0N6YJp溷mPk]F2g3ཞr%Ba>C#*0i(A
vTN46ŔQtqOwp0,atyB~( Iz1*^d̀al >F0` N0ugbV#[aѢA!㾙B k!UAHs]IIa0OJ1R&*6cҵ;Ha+7ݍkq' wrZBٱ f^՚cJlC:gC- =NOq4sRW0vI^Du\UzVj"0}#Ltf$X QQdS)7zI&xYHG:yI~$I6
nO~$ᇿ-3N9`)p6Zx$eVQPQX!MjF9tzZvC2EI&90r_KMEao8*-8aL̞"~60sb|AHlX\OsQwh/krMSR~$υ$ мeO19%?}	EM҂<Wß)A#ΒfMqፄw; zeyCA@Nx$V<0
 3w5kqQO N	i>a(Mڤ.8Q"$mPOW6P59OioTI.+p߀'-m@(k}}K#Aow}߿5lFCŲ4t"#l|V/c&(&aMM-M%Ԑ闣	LJGJ"urJS-s*fq|sDi-(H!צP<{wэM2g*SKfHN G8J@, ^IH`Wv{=C"V~# 
-VRj/-/ln虸1iLvFAq"ܺA٥bYr?lxm&1sy}seA""Eq<G .*GxȄ67[u"O具Q5j=Ev!ֵA&˔7vDO<;e"SB]W`@LHAdo#8Y/GUbz2~X)zv?%I<1+P]5V   2׃AYWq-N=m5fz|	_7jf6p"d*̙۱_)#EdA95#WE]J	ebgO%J؃~'=ڡ+WFyi[hC=^t5PІ4!o	`?ȧhqR(E( 7O$FSLOI"?>9A<3eSǰ#||^\DyA$#<TNხ'9V{}&A4$8Q*J%04|_H:9|bCPlK'[ǆHKw͒SbL;ۯ3r3tA``?4gI6 -}4β=٫E5l2@32,51׬)[swD1Ӥg,eSStXőŘknJVmӫԪmyhlrs3..֧CW,KdWT>q p=h1`WA5j'fX7	I7> LiP{f硂Na)Վta|R|Q}6И]
v5j:!G2S/\tr)v)Xf9=98 euk.=EwmThQ`IfhگNhG> )`8m^Y,{ɺ'n$1G>W@prtWd<.?uYT08^jD2i9z
\]l7 ͫ,wJdL+ܺ(ٻHe+֏#f[j=WnHs® C,P	쐸)D;\SG9
:XŕG!r1'inj*hw}4hkMw;	VMjyKH*5kƽ;UcNf2JWۿty*1D@wf9(6͸WQ9g"hP"IHH9D8P-{Y&Yakϟ=4]{c]{ מ A3q濲	Ta+L*y"
[ЅO~DNN[S;R]9{|vR\:	響Mg5ް1H ~d̰S%jm}:sͻ#ĜҀt[^`Z5e`]ft
	jJBi	s$&h,㩟 щÚJJ𣾃afUXl
@N#Mقk%$ySS6fZC]PRIPfw杷O$c-Ok?
p8VG`of7D!͖)7pU :CYR	6mT<O.`P2	o9ٙ@oDuv[5Ə6́j[g[G{;֡g.uWoMsXx=v_>),3>lԐ3$T\?zS]R>)H+1܌D@Md`EB	iFM1QXD|0Q?Y{;U*mv]&c
nKfポA?\(8f.|C34=1l>Ge@Jd2?
zFӌ5.fEG\,ç)0h[QTT9@)W0<e<"L Eƥ -YpElX4qCeS_
<F0aHth)Dst	 ÁӚ1a'Q!%½j=>U%^-]-`ANwE.b<.#	*^=aIB;}uv> ea1R`Y>Z 8(w#Yn2
^^CsVU[͖X9)CuEq½g&=mLvZOTuqN0(
PǴ%2||ap	>*bsC2&ZW6e>[ xqT+~lC L'~S^nf~x`EVvHM.q}p>jޕ[oysf+C^8M6FXlHT	]B";6ݖMpFDv\:ਇU9+KJj+14! zIA5)TH^iwslREa30*RlQ^(_^[K$\&qQ^06 bhkӴ5 ҙ
-Tr6t˃?`Р<z&F AQNSL߀;l[M@Cʛ
4iB b`fH*Qɹ_C?alVb
RfL&Ȇ#~BGb_{pj_,j4%p5T1Rcy/$+uV'Y$9BqO-x}'o6Z	4L^UHa	(S)_.lAg,:&8$Ii˫
E|PlzZ+ضCHKENA ]+,YKD"Ag	"J阡>"	"Ud4~!FKVVojHήاScS[=u`NeNDz:p>FmU.TO[scG3	܈jQ:!S:d:+a}%D}<1O`:Q,Cmv>BxIή
PL|$>3	@'ILuӚa⒭EX@߇Сا	6<TY(`pIFPVX$C"o(mc\Komcy%l#B/FB)|֗aZ[6pyBSIoE{~S/y%ߪYi6Yt>w;7dcz:|!Zqυy`-ގx9#>Yˌ~+;mt$53$1cüh<z#[$0@#)Ov~I!wfZF3$dIXjܷ톛.&sj\v;"D oHCə&ڸˎʀǈ>z"t  
¦d4>1p+Q`77mѠt?-3؊Υ?/ѭ.|OĺGۉG%?UzuQg=6	>TEרv}+
pTxv <Zay}cQvfDԉiG/D
1<jl'DP"W{&=>fnû5p,<- p)$3LDt1ٶso=06I{_#:u;>{w=SOKM]_tbyÈCNwM4ڤsk|f{=ث?؋=Ne:ŗQ;o~ᮤT0hNO+Q:bp"o@fmw D ΂@wLn(Dzkd}a(8:r] ~|.梢v2΁9%l,=o68GŅ{PE;gUTvD" 2ERA,:T*"<QL+d0y{a{d9<㍧{m|tr4ss٢w~wb2A/@R(`8f7GS&O7w1EO۸qfQȁmn	4XUEh()m1{P_YRB)QzɁߔX
#'7?lσ5! k:vIBR}i8,Ge$1J(m1%w>KxyrLFU^dv8ZZL!~IDkp3Л+d6ACQ1#$-}(m	%)ry3м[2?7IM?}rr2G1'T_~`WқcʞL67!8kwN٭@c	K]!riam7C	?"KUʰY Yuv:82%$?HN+Nzi	`MW>|Ng)OY-GcRt0Kbj(qh)[s;8,)@'PC[nP0	ts]*\G6+I2ƻA"+-f5iR~9hA0:C=HFi	hױ0U(k3_2|ܨI'gdqC~MR[q.6$]P%h%yhm)g@53KCc|?6h7mL;bWzqƅ]'SC;VX՜g*Z
x@]x %Ds+yHңtEvMB4ۙ󃻖H'[U*)ljqNIUiFUvW<7;SמhGk͊9I҉tK 3yj6'R 28RgYq7OcbmοNv
O4b3cH,8q*.ͪu0iQRH^1g6o<n&m9;5shgԍ-wye[1w7gj?nXޥt:Ny(s`a^>H7ͭ̪؇yԟ;ۦ3A2g䦱p@ ]GqOUt!8'W(ԕ{x3,l	GnvxJCN#-+kɢFj[,E!kC`эtFy۩TL2Xjek)a1T\T׸Wl1#PhEUGqOPaC;!tÇIkl@%oE㷗VAE&w<jF8z'SG]_/3o}WG\w0sŁWQP/؁Z}*5njmMdC^8;X9X3[K:F[$ǴNV0*-T`+7K]@<N1gO6:jQv\J-yM::xSإK' EmPFbùm= U(c`nJr35IēC
:5hZq̬9vXS[q϶wo;7j):[4|̻ݭGn<ه X=vkc{spu˸ɣ"0>{9 0=*Jy*C4ebvNv_'餢`օTx6yYIEoc!5&m
leej`~,)X9Q0ٽ◂öxxQK v,ND(\Kn]kJ˗=89;}b`i	%5z򠻱Gz]vv )9F]#ВN^~v?|["!&+VVc.?ѕY!rv;z9|%|>}^яg	899h]#$ߝ+α贡HlI&fƬwKdZIpdOۿbI)cϕӟ1 m4-5.pyښ;ݴ]C0\-2n!Wǳ*ݾnmԄnXV'	Ȫݬno_!
,ЄQ	?NyImCMc)o$kc>ʧVZ4|Ho@$oZĿ</'(w-ꭺH.Q+׈z9awа168T^l;X*mK<J
ph2[~;v`s#ct ;k	~5,\cI,xwjAP[:xz.~~2<\φּKs2\ĆHo.!7M1ܽvߍ~}Tg_kNgÁ0`-ENpfFg0m*pSNSwl3$^\C51<AhUϛ'w:4gbwϩ=M&4&Ù(rXyKі^=sIl@&ϋD|#d jhcà=ǃv9q.Q*I6:8R<oX6h[Q789v1I6M9h-K7P ӊ×i⠏Βk
v[CG"w?g{L&$2'OOBNpr+?asV'G`Ӂ*pcP07Y[Jv%1	Gn	65v-'Ib}nHFtwZ(^%OAJ#>'ù';uq끏>wܻ/~-wߙyHv"bx/aeRE*njDi'ngW@ ~w95d]y9GKw8Em)Z>:ᑽEDowi4l-H*"o?p+a(GC«oϵpԬ`Yb$>֣m52$}Ѻ{Ǳ5Xt'#!2ыpo}Gw!v&I=沴Pt*#Hz{W4pQKTsx4w[|:AG1G!Qt̷~_~EX<bf;~η@o]CFBe&mDI<b+*F]<p r>nƥ<(ͺ[Lg@z0/rLwkBXE9s#*B잃5	>!)73QT)HvS1S C@W9
@R]&S@
8	p6#M@X\k qN-`LV	+ 3[I8!=5ȹ6-nO!c}li^AqξQp1Y My3̿T_ȓ	\
6X%K+VTB2nVNv(3-g4;
 W&Bxow/{'8Xݏ8W-Smqe6qB,dKu}ZA)PfRnb1OH4
;NI(ia8ju
A".ɮ%5q	ƉQ0lK PJ65׫f	ArpᚔbϘJA#EHm8<@楬 pD]E%wIjq|b0,aYPeXc"E!%r @$	Ѿ|AȀWiu<PDtN;>"U#,Dޓjܼ!a^ޅ/]D47pB~
Mz!󐳈|qdս)PZ[U 
ZF$kvZh`Ǹ>Kza{"^[/4.$|[; ϰykZ:&0_	[(?K+T\o@&X>d@n>;li5  [A	U[0L$t$>_%Wn[ixh"87NR;e@a!RU^@<n?="d--4XtmVPV1$:iǃdfeS3vZ+sOsM㲿*w
ʈ5Fnt`\# ;>1'f@'wh_<w֞* \&QEp,6$'qd(&ArnItAKK0&ᎭfJ~c{;8


LH(0:D8:Nddy\&ICTA-=玔s'*
TTփ s{sFn|Sp}md=f Oإ*6K~Ly6eE(@m.Axjf1懑NdHs^c5K3'<
vEov7Ș3Fǫس}8j-,Ob$tc3(_../YI?u+}_l[t
",IZmD`{yv\.Tuc@y1u̞WfxbRu"5(^hET/^ON6p9Rsm_j> Ylg+P5Q2VSEMɱ0¨VBF3=# dSԓz5CI|4lΨ3dE07o6:#LCmVvǷrQ֏e?Oq?wiU7`]6GD#<	W#ۥamE1g2WO=]bB bŋ 5ߴy&mީo{1M

n[/CMxasxeE`X2ڒC&x5}eWo
g!aN}s2T$4=[F,Sp=QPfxP;ӆd[!xۃWUƈGjA(]bڂoFj)2K~yAe<Q~']{oD6HHI {(h
e9U%RT|3dx<͎02߈\&Zמ߬s`;MޥlaK^K=7wïU	h9FH|Hqf{Q4)~m!6uS/ W%9,nipp8!۪,o5ʱUi+=~;ac69~-=oVOMΦeu[Uj|FѨZ{?O|jed3_W@Ɉkq샱C'xJaéy5v۽	5sOeX;|}pȑǀ7e*࿠\Y*aςY̤@R'E`Y1Gjq.5Ρhѱ{)XS^^5YsQ>6൨s;vOP	~u1]dwKm7t]R"==%i(xe`8S@1sw<k	ܧvmW魣k,EhiE_!}bTڔЅr
ŖzC͊Y{ hr )g	`ŗ`#E0%XwN^ _1#Ju
SxՎ&ʚ}OVV{,5tE2G_{ik#*̟AgSx)Ǧ۰t]`51e}턿u3*fEq*0ו&#b3A
2HN!?H)baJ6#W99} U#I:P@63/X+CU;Ju 0U!<غ<jlCHH2Y
WַDk]VTf#hTOYxQi}'sm5{xf'mwgTYL! U0DiJ`cKرoZi:[V0bJ2^Ia
kowX`"P
Ƥ.)@jC	w\`0I9H
T,[#5:%(;| vH>+jՋv/KOXXòR\w@J<mrqE?!_QsyZ黶c緼K؏tLu/QYZZgCH*0Wtg%g[H}#IX?'j}(͡]A|C`._(ǃsxlr6Gio$[pV=}}u𯖀NU+$q0;#1ޥhcS]'ϰD_s T)W(#{	B>'gO`vsd{݉%Zh=1Ùl өQE;,*;6&i(
fDCHУS;@l1zdY5O,vׄ@O395A_^7A.<6b 7]/OWg&p緖NVəJկEcݮ%HdÇ 53$F:.L2n[?7<H_>ڽ65ѽXϋu*p|	G7Aa);H8.̭KltDꂗ<&	X_,EteƪY`?W',{(vgRmq4H>"}>лN2)}Kȝ7Y{%Y5O_N:7Ǧϴ :ɚJBت'qg3y֗/+\buH!+eӴ>̻K~1,."8xl4<GFs"hN|!܎*LM,V`i._8aXiD*_ɿ|7:ČDj=h_c2u)0P%q||7P؋U7vYk{{bT߬BօHX3gAG
XAxH
݁D0¼¦p%YB98oe:-h]NE7vd!ZP	*vtǯ{jHP]DJ8J#:o&:; ![:Ӕ0,0OgOЂ'Y\e5Ӥ׵ HΆBkLx>lǷvK!6?bLtW0+PZnLbD3dXKFaAM|dsOia ,6\jcx)?"yH_	ͭ6~0zN_~;51Ì~s@YQv;0dXFC>'UePQIuɹz,8v90,GYyY	EKhG]Hcz`:Gf!WzQU¾qh#uZ<en X^&4pn ;IxTP=${D[	g|1?0n]%WU	 0bLKv5] )zP!(|rmd>?s6bEBNLI34`FMOيj/jGJY=s*mZΪlv!h|88fB~F'Had'Ւ 19Lzy":VRCd`DIe纛*^Z)HM# dHX
o(t|TTZXE쳯E0s˰?a)
ܐeQ4׊JN/K|VciU)>bVX20	v7eGs%ځXZ8N߆dJtpXmq;|"%IeȆ+k5CQV`2tϦYt=Cq<8tt^vM(Eڀ"Jqt"!ѭ'2	!Np~1ḻtuLJZz;?dCs}5`[\ztkǩHآŜD&F)3.3F8ˇwN0  קʆa0x3|<p	qr՗TcmvΣ+N"֮J@xxIDJwbA>2$bqgK	ƨ#.ι=q5oC# K0G&,ykv熄 aIb͈R/&p#58{I
ܲHMB.H8Ogu&=ɓ/Yz* RL}e3_ySel	ܥM}Eu31B{q@9!b}.mHjx0pg[Xʯ7;қ ͖~ 
"0[*fC| w?Fl<&s1_IYO;!..Lmq5}e/<Gs3cSiE1j߫"tmq}A-u'Z	 a5Mϻ(lѵ]%*&o"Nx:*Q&QKp8W,S#%O|gkv\p\))r)LZ.0fjuN!"~48]y ;N>&Y
1WSmxa9rlnKHiҐ܌jߵϖ-r!`R0kw|vӯ8_@Mvub5&M,@irO6yO)	EKn`h
85_u2C43ȈXM$"I?6fG4,% dpGj8S)Ǥc(ER'jYv3w:6>Y]D^X-art兪CeZOU.6:9] I3ZZWg{pg
\bNAmuĤEJg^I;\Adt,jL0|Җn;nPôsI?E_%D,6N&Va9dr鬜rҖZoCZiIzCOw߯]<΋]Hx>~U*΂©PޥҍӋksw0n<cƑ_`4-BY?E8cUÎjԇtId	t΍=镵k`RW 'АAIt&.Bw)Zs> C^ -B,f\%b|~6U)``%ǡ?n_~ ;qR]e 7߃anCшJ4CNl$ccdj*)6Boʭ@;C3mf36I6Ƕ F40'tϞ;mhe/`
Ud]4m>pukO
z-,{x>0v+:禛d A-~{tH+KCQ{Wt^tvm8٫[aXW^Nƀ0JLT#:u~k#'LkO)\X:#
Ĥ]vRGmFPa
ir!/hxż3qzZOpP	n|n͖D8,oG@TRCcvGDl Os5e#i)C]9_$kXnn@go$x4[B4sNa
#3q1Wۏ'z
/G@("z4T9 pv
'{+O ?#I;=YE*4ɮbA(cJ0Rۋ&(ڹ	sn<pppK2Ӈ:R!ݺ
6<Ts|/	@zȱaZ-
yA)ʌrYgUn"'TQSAzVȷ@z=mNU?'CtU5M9KCe#7sկ}Lwica<qc7W`tw@轻hwiC%oAg6]qTpڙ N>?ǛCHiN*Shӱ Xe\.RCQykq]B¹mOheO9%io+c !0~=0.'6Λ\Q怆QfJ,bҚf#H^Z%SjG1;8х^OzX#Ц1Lb4lդ*;YvBaf<WuGTDҎ_ ð+,-۴znrӋ2ja(Kx^e$I hs?!4]ܓ22Cw5v~W61,.ִdYrYviovj_]=GLx&xoټ;%ka%"q^ه
( -Nwz:|_Ja97|Ch?FQYx] a%YgiY!&1$1l2#QU;GHt$"FҐTc2˳#(н+%Ԋͺ{g"H	v%Kļ푀lTe(]i+[VW,YV++DF$S~6^fCc[Ʒq(DG#)ӂJᢼ&$/9 ]OobViqĀ]鯻+`*y|	|Tі.6h6ʸQQQA[:b
O΂9[9  IBT*{/ʮnzX=a#?p{R.smJʭh4X

2k؇\#`ɳ_\(P%,s˭ ZT(!VrI mY$I/HfhJ,
27ƋbҕH^}29BW;jt,Dݫr?d7dc1*[*O? /:Ra%UۮPH4izk*wHs4y9Rd`嫥{tQ}0(Y6'~V1|,a2tU 4-YRn;pU/MrME"ш7Pu,80vlQ<tt(쾾S<qkKL"mDBx(f@u57߆g;NH&q~83za; ?C<S,_Pdr>qO|nԻza חFm5xȦĉE,sks"ȤŇ8c<G2BA\ܑTqv`-tH8͍nW&q>@srQ!ͳ}TD]3J2rE{̼kngߎ޻S;N*qV-ͩ^^U5mQUÚu׾|}PJ3!lsv$1ΪhIFlSQX~v42fw7m۬ꮦ~sȶ"/66j9M-%/|9ͰXM\Gm0@
\Ł։^QH4zE\΍L3
cCN{^wfLlPf0w$^YsJyx+$GW6;z1gȲOB8#ﻘdUn VfoqPl~͛r
~7(f^2s6a&X7, MKJO\8g$Pe	PLs?>%>4>?wW\YrM7?--d<H@Nz|mAM&$؜<fcR!r<tLUstp5K\x{v?P-~S+C޸ǛN=r.(M_,;67z:^V`Bgi]cZ^}(ױ8&F0\Ru, AAn"u'`q󵰨Mj4)#N,PpoW^Vh4_?gPaq.O]_`$\2-Ah:M%П]t.!؃۔sxyC]Q7g §o^91IX-.!YdB)iefeFk2S2-Š[Fb4϶Ͱa9*s˳"jT5`73NrˆEZQ7vaV6?EME%l>
{*Ǜ09jQ>1"ivNNv~R?vpP:D%c+Iq9@ dX X(A;Iön\7bg0qN'lC[EDh
 }a\u,w;㎖}x ARHbS9YM4
VYzC$Q:T4P[Ħ{3WܼhaH6#f1L!Jڐ*UgUwjvñtPܝ*d>9m!\|8ol:ԩfHI|eުEM,~nn	!DFh1N!ct	'g	3c-8@,*֔p
Au7a~x^)]Y	jZ^\#$1x&]慨m*nM-*OI+2[c12[&}l0AF\&V=Z	CqIkxtm#!juXs^'[mǵ_T<yzC4c)/T"'Nw]eWm!}V&]Ł9ȫ]V5z`/w'r1_Π3+enȜIݽO#b踶{S*պ46LͮiK"vsglX-wwĊXqЙ%Bp1B"9bҦL %ҋc_1r__/NTn~)&Jrp6 0E*xݻ]z5T|#rwl4|˘8w;xNV9J3a<>=">N%+J;d$ݻVkپ+0^"ZA~aA]R_gUI_|;XE`擢@H#;}L㮕 7@(#UGf8Dbҵc'q/4I	6εU]%Tn]XYf:KćJw\P䅕7}v.ȝ{G;O]+jYZAO*-z)8dާe&+>7JEHfER=!f\ATm2ӤťQ+=	JZeЕKDq-B&Hd&(=unEyJq^z*|gHڽL>s4 keί(LFm|w#X^W"p6nt8SQф]v؂C
%>0ӯ~}6"bƣ'U<DVj8ӊYj14=gs[P=|$y7gu)/#S#F}n6ح8~zw_휚_:_gݫi˚`YA5M@4ȏkEhwX
>so3!	`X}ZOd"!!GL*> $HFk@wi>HDa.TAD*9bEa" p{r24i(3d?#|["{Rdc4):Ebşk ^h}MקRfQeCJp d!L2\U}9COH^'kX#'$
Za5B96̦c6#\Ovɴ78.Lc3Y캖/b˝@T[!(qh{%p! VtLGwZǉTum3J`r ^u)EۊKXٻM*IĐ}UІAN%lBD}v(esP$k4l]n*z5]q88a3<$!8>ֹFXb !/#CQ:쳴&w;<EyMTn78ү4|͍՛\(?xܤ}36H9qp2ֱ-<
ӀGt.Z&%3SW׌hzZV9e)vL2g%,#Tp Cd|1>fgERG8Vwku-Hjf|G1YjĠhDV_
FhF7UAqhV9NjZE{2)Ual;&TwLoJK|E>JO+ѵ1(5mGa=P'[?ceUYGI

"1rt֒|ZR]U( N3}A]JpJ>x7%kLV_>5o@M*^j`!klt4T6m;lƞ/토6㋍a=t%ީo*=, HΦb42Ch{+hCii2\b~{@
W	t"^(@0m/&Μ.@NR^OEN?֤_g&o/?U*#sRx -"!nqVf9+ooOoZ(]J|G`7-$	D](5>p&G΢;ɧ`>uU&W*(tދ^ȵ9A-~6XC1TO;V~IKTz hpvR*w\ЉNpok ~{ Ee͘fhml
	ߍE5ڻM=MEY#~JWFHJ',dsʉHu2l lѰ(xYS%J"lfa XG>EuFq1os_26sɸ6LVߞss6U3;+M f@ӌa~5 lx?=d$Joß\c7Lzx~!JXXqye0^`<7~Op'_-XdgWr`m6n6~p5cx3yhG$|qy<3xZݥ
at|7uى~70^ZF:_a$ŏ?}U,Hh#qmmlO
lw{S1gfh84m]%~#4CbH5xʳ=_S"($jsgʲU䬫hZ`e
2^a!Nh%}Z1`Ln%yi	ACP2TvB3)*uh&,Dp"2	X~>x+ZbeQlIUaoT=c&uVrz]ןݨyd2 :\wW$[RX1h]o Ȑp]b11[󼮻ʠ##vUpB\LDFP0.Tp3h.g
~ ^\XQ)mCz"!_ND;`p3x  0@9FmF<,¿)5q2jbbnVEvN8q
BWnj
V!˜6bـNbmM-ZEu7mbg'O|CEGE)9"IO͌kqg_5Zw=y[#PUv{Mƞ%Ӝ-7Kmv,)/p?LNq
ni9~5h%nD>l5	Ic(Yr8yWhQS8
ޛ'$*kM2pշlmY~|Q|8!N
c[>7#i@>@mOU!ȝLOb]g[RA5W]ΑױK|v)x6}sy-hGJݯ=wzsEt<tfׯ^d¯$~}ǏÇvSs6yO.ɇjp?lGެёpg@Zro-ƴn-)֥D{Qԓ.mNnBhg`7t{U>\\	~Ov͎y[O<-An?Ki5=f{qRBxBS$v;u/㛣ŕJL~8ox?!'M̉jOF,X0yI{wgpg]v6Ja(\ԝFn<A2*	ז7Hs!T/~R0Na\څsW/d@L@v.	..\aGgؓlhf.oᛃaߨ!%xkϛ?MWcW2sLķŎ5	kWf{+SBh|]9k[~),5xs˹zIWJT*{&1<	X`2|OkE{Mt%/rNZQO(Єͭ3&ۢmל@|,/4_H/T\|VEFhxAf2"󄵯W <OTe4uG˭ %pv~Yb=/)!2*^Ow )bXNQP3Z@pcݮ\[_h%'}u+7/#Jr?˖4pqU8zw[N0X˞62"E(UnFdcqk}L,3_N#X]u`v䡋|d=̨jQlӨ_?&og#vpbQh.8a0/.བrkAP7ioV_T0BP곲@3M|Psqxhsf@{sxǢPB`݃3	k#"c!Wx8=h@kpɾ#g-0LK(fقZJ ܋F!t.|Q`+ȸQ*[\Bhk7gtap酪D*0gEX1hPD:%_ZAv`.z@3Xy)5jrS5nTY26>h-24~%Xbf5*7ZL4Y%Mjk4l8gB<Mɹ4)ob'!lq%oǶs~(_\~|Z{YcX+H4qA;q=׬{2TqvroS?0zA?Q񊓝8xJ܂-G_K,XcN }ϫWɴn/B
GemmzSF')&v?~N:C32Kǆ8M9#X-+-aK$qf,ۗ5ٱ+z$Z%n$Ķ H%RaT(If{.+LEj;tGT|PbsmDʳ,ZMBQE,L?WPkMDɒ9ZLAԅ?%;[볗CN"|SeA/G FGeOMtATi^ýkZ\X_w4BcK1lUB(d^ڮ<4,,t2"vv}6%݆w
B=rߚ28-Р}mt,ep=[E˨3c7Z<IY)?
OFrHGrQ{W]E%k|֠)=m'_?
֭`x;cύn+F[88&_~OQxo=md7,MҨ$l3|'cˌʒEwYį\##cŵ5o?@ɏ-\(Q7i7.pat'XcLKaZӋpr~Z=szĽP@AjeUYL %nt}OM"bM8X囸4֨akhH:Vq?"٧n;A<Uh<jGgpSևkiNl,$_cN^/f7lxJ7z	aAחint*q* vl4zQjF,Kn}'AbeF{"gX'fӧ/a^Q*2__?Lv) J4j7<#J(z]n!uowܨ:R!`#pjUMIxB;dteݦM92ho[(29ܸ'ꀈCBb:WmSژђ,:2˗֗cNI!mFT 4tngswV+~v_-/ERS]8+6I|@56ýAt;Lj<}TzsHXT&8oABf.D΄<S?\] ?{eP3B
xROѓQdA/Jlu?n=L7}	akrX3[ZRƪ9UbyE*ڃյPZBz5mG#G~06|5©F/e~ $ԹP'tPiVPrM*-wE<KQ*t¸vX(B0-$x~b7A69cNǃYFpO`@ZE@.(xc*%j)vH+GaؐfUXiʜܚBdjNJ\n
ݮ41\5>1hRRJB*˼yA{THG5
ѻ4`
&DB-}yfxlmխ5gEQY^B˰/9_a=.BipLL#3/U"Ԥ#;`ad\ޔ/-!/
撹b|lmI~o 1 n;*ˬ|ccp@6rP۴At%jиT.|[\C5&ثwW'ՂfNKEok>}Ӱb'|(p[b8\`iϔR)]k+_{/04ժnMqTdi76҃>r;?ck؆m[iX$PC&4k}ЬykQ6ݛ`xJ6r f7cĕb]njMT{6:b%7'$r_ &l Y19eg(F,=Ixi!j#oaǇj 9wǷvsMf*V9iծޮa>VkÏ;0wIg0F`~|Ox; ˘gGʘ1;ILًYK%Hrb@nX
I @_O87W$>qr{<HARSh4EGx\ɀm6L9y*+3:l/
GMNcDڕ8ͷ%EoAu ycOzn%+Up`|MULϸYd{&'mdu 6,^a1*	KGj-<?^<0*;I,@-mD{܍I
rA)r)VSX8 ~-ܳvX1~h=enYfC6U	ܗ[z	
[j;T,V"xZ`z}AVVw]l[*3ۤ9LL$R.2Br}Pb AI|./t#$KRe>M'R)"hx)n@O1{:[E[dEL}ebẢg
T ^S|,lrot$VlJX[XNEa1a')nHټQ0tHqCupCV+#gKiUQ@p}}{&7t'lW"ETP84BaiTZP5tAt"*ˑPYK\>؊P=\4(ŵK F p8T-x_.TtkPWkTElӔ肋ц!Q1um:^|}~P]`b@왨0͸4dHsG]O.Vyˆ/upQ4^SnvUk x\ȍ%i
&uӛYKٶ:,N0źk3MGlz9}ËK6Bi,<,N.p9@C,D07Pg?	Zν#]g}
	@"tL&e//9
'(%JYxU4(wfoMj$
E7s\dI2,QG-ZT>LDھL\q;'V$28o&,Sus`71s"βтLH#uNYS ,!]S9K8ӱuF*"O#S|0s@RaxLr%gpm1K^5ŶE9zFa7B]sQ,8>F 8IK	rI][[ʣCa$1oALM@oӏiJgf8KO.ʶ|sʃAq+mSngsu`YF*guqUV^'xi\*40z
mZFFoE4VQ
Nin*JUh֩PLA-$՝րIilK ~H-N}slO7wwxk6_u;Bǰh0@ >[$U8MQC2',T	K~OVsclN\3BB fקwC;ɷRE9ç츸 gtMp}^p9!vH2|h 22s)!\.򒒴z'$XiKΩYY$3JMJ30m.̐]
(/Y[W5L;p^lt:[(\ٷ:BB:ό+A&U 
!/V42[t*!u]DUO{)Z@뤕KJΈkv!ka;~XH	;rBY08-VBIIIwϷ@Mfw9̦fIoMl*S(nXO\+tI*@i{O՗jkvt!@Ҽ"'&+s7mV+|Ie$zד-'qp}+iВbU#j~1Gץ*U32k4 A}Ssڎx}tSwcky5[IZuk1|&X5*m"W;joUrX=|.0%#ɞԿWm4t{\>s͏	jZ[Ȍ}x!sdkf3袟SnτI
wb9ψ67~IKohL*6#ذ[,qx{+$|ItvkvoX017v&^6S}<$Qmՠpb;u-T*֩)qe..la!2FPщUW+~ԭɉm``$؈gLl`(<`^y5	0U\1fP&PuAF8O<t`Q|٥,e {u=S3XRPn{hhPϦTp<ؽR * 3;1"}q):܁& $!qԸ8̭<Ps._6!ΉsߍN9X~Rr Vlc .ђo,ԃ`J )F,2ve}>ݻmObvvB??n<<yF VGz'ק8,v#noiMvo!@R`GP=Szed{~XSccL_.(i9?\"a`Blh[529Uh!S٬8Ǻ}5Knq{# װ^DZ<}u/;=}CNHg䢘}rNQ-l 5'F)Aj:N߈4G_	bF<rcYU)HfpG qQAFe 'Y:ppHŔܸ>MJG0^ة
kW|נ@K=tŝeO8Q^UȾEx׻A	~N:p\,	|.3~| 	^
6{}"ӥXN5D^[hЬ;?%3+BrP$h|%E8;e><ZS|6Mwwi5lVA$$},X_dE+y;>?0N= 4NtFνf@d}D
A4˖ZDX ޲C	`?N-hȱ0:Qsf.?iY`|:ൺl,SaDcJ
L¹,HÁb@D7	cbJRJD|MݮLh{	לmfOdj8:6f]ol04+37N0!B?[`F?G#t([6P$v4`,T	$,Z<{&Eʣ:!n@Eӟ[zLCq@v\I^~Mav&0;ʀZF2#Y챑qi
-p~׎oc.7el$6Dѧ*o//b/F-D@:5"R6`ĦGGZhŏ)i`ΧÜe菚mz((3,}2+>{dd̓R9!0Gr`.).S!	ɕ/V-ih ^jw+!*~+ia/}`OH"G*]UQ|
|GN?1X,Ԑ=U3'8Czqv988c2sELG] p+
w-ɍE5K[.E8Ajdrq(P1aJ$ޞrba/36z2AKK<3G:i-<cNd3Tsa]Ks2.,c"AIsعpœD'15ÖbxA7%Db/TT#"Uji@׆ oQ_rEPJR}n\->saæۅ*͋9VHvd ^<Sk0-GxJ%K~KV6(iq_ͯ$||)f=d\ƙcfBeͰA׽R<;N\\z?qP
e8A6|v%j-| [nT>k%v3Yq6JC`|ŁLgP?/~y"-B!h.לO7s:8ۈGS_F6b<&;	a:em=Xf"a7-QdPDCz&'d/
t{`'lRRG]Uv`I>a'b!GPhoqx,c{=󼀻a`IP@)lJzA?dCAtwS2+)P۱}цŚ,R2.!Pf1q7HȊBR<y`ow;~L'JV'FDV2BE6H;ռcGȜ/cNmU 8V`	쩁/EW*Lfi~qѳIҸ쀲rBRkw>$~KAEp֪ŉ"!H M9Mht;t5MY1
PR)kDS0
'd^0PgT1u:%a_u/ P/@)Kht؇3gѶYE:pʰQ>*I<F@t:cҀo*vM<.g#'[m%Oqv%Fӭ{to~v?Ʀ}T=]׼A:N7yλ|%{QFe+Y| WAG^+a >}0`2k\&B:>#>/U)JA@vb;:1|%q34e?޿rN?u2<~FpИ3ࠆ320p晾zWܩlOAxkNL;KF\YKȺ]t\v4mKZDlsӠ 0֛msFi{tU~/d/ZӘyzyo^*"x9wZ~8ý{;sKȩ9/ۮ&?}9˦aJ&mh-i
쑽b{O 7;6b>ƒZJCWG&}EʮF@m#'xJz/&l(x+ӋycRC'xq	B*~ q iy4?1fl2;<-aCx^,T! M6$$MSTS o\,c&3` P0;SX*ȔCl|6\~Z/2O +`e_yQ*G	2'Z;OpO?ZчZq\H.{@ad/	-7BQdق 4Q)P/aǬc4o#Αۨt7WWCX{+Ɛ[uQBbR.84!?	Ykr:- E";aPmT6|vV9jyJRȓ9ʇhQ5S PW)v;F,oڧg폀x5}~ aFC(!>\m;N"{g#gm=h79	{u:?|ֽNGSK6)2M	CwEC/2<]/4iʸx#bX	y0-^`9.o[;:hwؼ<5?n6!G'ćʖmfMݙ
S=zoSPk3Hy(f
zs@.sPR
xIWܲM U[# y:_\KOԅrk}0{jQEY##;{Y7 Wd,>!2ݣɯM{^;e\{JH<SR+攙-!JزpWOׁFjWyuSo-Hgٜ"4Ox+yntZV{|-CgIȆs&T+^Ϸp@*@K?@&e@Hŧ㙷eůp0k*ѹ&$hڋO(m/tF
B߼Xkv'4Py!84t҉kK|ʮ,}Hu'bTTqXB2?qr"Z$hUP	l;yb%|֝kOQvMKùK<8w*mjtԂ]H)[p.(5tsFq$d32DViIDL?DK)e+u=h7q&jioNx>X"}iʒbi8蒼IZn	Q;nrxz콑2wR~wcؘnqF]]	$vDoK=z-VwY%QpMhdE3'VkuØ`0׸jamD%p<KŤ'[+5BOPgmKQ'W HBt$JKGX+Qj04+p).*6\ u	,62#Ep<"QL$h2DWP⮆%cFN<
HER&a^p*t.xtO˚E$u3 f8VgNKk/wbQFVrE&;|D9 ~_VfA'z6A86fRԒl0~N1n wx+q{:;OU]}98a+'V1"g-4WF3rͰ^p?4n엕Oͦ&
G֖|ǃ3=>Gns֯;)ֻ ͭܕ~	Spn_\#WqM-5w/մ:ص.ag fz	j
m%mX{8Qqa.'/RUmCpp}RDO'%PB>d">IWf1">GD<vGmV/*$G,!-oi.OȈDE瘮I1< b+lN~7x<%8 2?0HI6?6IMI Db`C
>n)9чl<6wmQJu5~c/G*nF(E	᯦DXy9~.c:#QREX; 13\l<ԋkKksc$DXu%%#iբ,hӳv^YA/'$^W02-蟖bTlnIb`aTN_"<47@o9r;:ɝgIj_qлx)q[7DׯTpaP _eNa&iAfKz)!Vc5ܞOݽ=S-5숗'~pd-w2aqgM9`!t9d2k)<&B0,'^ge+AF$5ѦC`t)'0Ä+^p%~4}-39B][$ #?Z!jE=Ӣs;ISȊ~FbtKvJ/bn&P܊aBxZD;7N.9]q@66R%K3-)gh_o
A:gfq23쟻foYVas0K0~UzoNal^ҕ0ԫ$NV`_xw=-t^o~
C51Ñ\XC\N:b"4D|w]͛ƃGDZo8br8;<-Y,%y/=9@U%瑅^)X؅(dOP9_텾0PJgDX(=w'͜c~u޾G3Ρv#S`+_|`ay:vi>9lL+F e.<Vu,b43Acr O}w<\a  q!'wBV|{W#Q]n1㾴|w;=<L&ԅXdyӽ<w	iԸi,	܍˝k,&ZcuV+iXp94$754Ns,zqx֍wIIV|~G'l|dQ51yն2}q3$;Y0q~X7-.q;QX	)4iސO9R࿿|b)[e<]]|/w5ȶ^*a~_P&=@w%"e>?uֻu˛-c/CZvڝoOv;[։
	kHӎD5ߢxԕD>bd?U^˰TXv"RճׅzyyJ9r^ۇR^2H܌Ċ/_V7=^Ƚ}ƣVNKx.YsV1&4ĄējC^QNVf\r\g0+5)__YQl`HmiGqkO+թȮ1.Bcn}q7*L2{sS-n\TAk(vkY.Z/֩-~0׻Gvfm5M	xb-yEJ$9|ipPSz'k vlBObC1 ˙3K}.ӭYDmV~A17Kw%44
yu.2]EÔȠ 9x-
)5FWU6:6hc#%'_JV_
Z >N[|zʵqw"֌=WV-\K{E?KʮfW9UFΫw:1ZɏCfNOϳ=a?o~O1t)oS]J\vʫgyYM~8֞9f'@	Cq֞[9l6aBFGfަӪ~nurFԇܝ)x5ޣ2=H:C<G*%L[y	w.f!~ou{kncT
Q+|1|lY6dK)RQ<,-$2P߇cp1UgW(׻@#D8)BpbقCcϙEX`%\awO$ZdԮ@1b}M2Ұm{1}/$B)V5E:V~B/q5wY^W1]c:X	 =頄LZqNrHHnB@ioJ  1TVh$_Zu֦Uԫ[3G7n9/l(*+=zsZ5fI}i\d,:R74gXÙɸ{{E֑#^حל6T2d00k%Y:/,jyq
=}`K>.{vB5yW	4! 5g\p`ڊ'kfO#C1{VϱԋSf,*)WEk-'r-P{uu -~"n.HgQ
r@g~|q:
y[>lB)h3*^ CbJK$avb=WCݑ>ՀXBT؁ouM~W\J'N`5Z9wHyTHiQ%EVXK`a h3D5* \3AwQfݖt\+w6dP/B:JK,
Q@RMѦqJW[H[Q~<?D
ǋ)2SzPԌF=ɝ.TuK4(Qզ]YF}tFqI]9#w5"5Qd7E k9WYʑ66X~!1yV!kEF4yuwY<~cGcĦ#ܘr̂6,\`*UX8E5gg)bCd%%M@kyz\p;+

s>ne,l(%ʚfƄ/	F O# =fFIp9Gw˞R);5ͫ'{"PWI @,kꋴFb,H&.lН%1o.ps$7/pQ>ǿ1wls*zH+\W_`Dl"-4޽aius?'KN8+H)sG(;3Caڔ5Ftm/{$'^F *f <Qsґ:HPB%vHa<,,KS=㩪vgqBDzž5okej; 43«a@Mޫޜ;\)CG:2XBlMiYL'y˕!gc=q7M-蘳ߠ2i!%T"Yp> mzJ\{K#ʹǅ=fG.2dv	\|$G%Wi||3s28k 	Ui$%ђ|Vٕ==L!#p۸8jS8ptH$!4)yǔr/nԉ:2ïqpXIK2`C3/&^5#Q.ڬ%V|/%/*!3
,3xy	ZaG9ݓN_B(Zp{sP]~%wۮUZ,RI'tDu:گb6C׭Ki7%bSpn)}:	ҹsc#>wN^}cS>b$Wn
LY8Ɣi.[?е;^Fi?SsHs`4e++@#4,7+4Cxl޸|E	ϪO[6ix': ^ChA)NÏ%E)gg` T|xFxzwov7{-GcڇS1_#v{Նn9C*w;-j=!}w'z>~tk.D)xDOpY1 m  J$WeEJߘRuNJ3Yp-~82Կ's]W&Ca7+%/Oͮ(j	vqO>6]_%`G7a	[9~n|GHrx6yKlnoeq^mcJҰEgN<G aVlϭMgveylLKǓ@:''d7XOPK,L	'=JxWdP֔'؏n?d;ټbx)ff+7|2vm[}%EX?Z,#[DTP`ߣEzH/Z䙢,N噢2ayqqgD>"F?ja,OP?ZqcmF"Eui'Y\Ki^I`n3Tv.IΓ_U@hc|0:sوUky
r5/a0X4Ly4H|ĝ#@K<'Af$pL#йaP%rb}ޕ >Ξpτ?0"mu}K>:m>Y!aj*~{:}aeSւ$ǃ#HƧj3^` Td	d=vkJہ"yA^)0/t璙M
Dn}arO[
#WWtKgB~W>oS@Z09)ʔ:aH@]%JѢE΄ٟC#4c\' RPO6L$[mc^KZpOwWs³H͖MBZj	U9p`ZDف$v3J|˧A!`fwSֽ]p[Iy1wV}i=DbzdbWSձ^drIlX%Z&m$x&ul9xKTwmZ\FQV\$WGVv<e{/irefL=Cgs17,zѰ1]_j8zl$>}ZLG%\*zoN}_MUO*d\⨍`ܕd6:=?wfT,e4QѹfhCYŏEˠMD}o3Aˆ.,bDbrx}cyot|~߷ީ eRVŉdu]ʶ?ALLOFxtX>O*oQ˶2-#d61وeƽYJǔ%%vSuPZ*W0e Wiq1)6l%yG4$	 9,R .#qS363(PSR]QNXrd[AIxIi۔1q^7+փ7f4qAmZl_w:zVrb7Cɺ63/`2oSߛDKqf+тtN2oxzbK!H]<U-W?kDm
1Ս$.ܳz'q3tXr>s%K@֡'A~	{XxPS
?Reܠs>jBɐ7N7 V))Q&#\^x`bSO%pKTݰ% jۃ+{'DSRD-T5yqj#"nշY?t*溚+M2w=N %s8M[!]tqcf,3M<>O'tT~|{{T-Ld?޿mPGe?t? JR*~[RGE¤(HiiۚNmƼ/U2'l^cc+'\1pq1+R4r&'fPwI0F|Fdٓ~%oߝO|Z-*
/O !HºST,m6fvk	w4Gc EAk@0id:o=4tQ7aSBpBIr' 5_rID!k3@1)4)9?E)@w9}q-#xk5QH3.UewD JܨP>X*Z`]oG܂:᩻f69|'&J,j/޿EU|ϛΊ33~jrAq}^Z\Ou]'Fӧb
V4!q.ؘd豩x	@)k#;&ƨY6wFG^Nj@l،Q}M1/NdH "(LYm-qLUpQ{`7/Ȑ3GM	}
o@Fk.qV)J¬z;[syjtн[gO?|@sxpx7?K_KNDdG8OgLd$%Ƞe+RKJ[*˱VFwTzzo^tPiK灣s[mK=k47]gd~0JsV#S5h5^uH0DU:]XQ4y8gyStP/#wv-w*I]J͆TJ97;}OƏMmD7)5ՖBQE˂NTE3@D
tZ/t@Ŭ/'(Hՠ
MkCFA?4)oj((r]aIZVZOw^ipƚgfj%eVƄZWoP]LIɄ3+<L6QNAV
e*|,/Bn@ǘ>9Z1rN\,J?}#Z@t6O`][:`eܡj Iz	tku	rU	Xzy5@S,;3޺:C "+ckQ- q=upPO0ot^m|9 G ]Axd(/
!gb^ gt6ⷄx6X.\`I-N?MW%4~I|PGJwA4degJ%OVf(쪚pǤQY_O2ǨF}._ٛMSY/A+6;\x[wm7PgW
9"סּbʉ\E6eީ#9*g:q w\l$E`|Fr	n{<_@%8p?|;:8}{P+r3K`Pj48+]=gswB.%=lcDBЧK%=R b"[I>,q"0f. Ǹޞ>/l6n_i)Y \uEW+SxEwTkM5Ԏ(<xoL-36@9QgW4iW^$âj ֖wLU3N[X]/fuė=<|-jX Q{o;1Tv0U*[WP{XPlb&뤥xmve]w#Mf[j=6Ez7$wAt_ՒsӨ׫j5_@OpXjW#q NCPzub82 'qG>\5_oE-@"eq.N9yV=@VPH3b
\Zt HmϹRwcBoQXM{!@fA=n؈xT_hlp
Rh{18$'Ϝ+< }p`L!Do[k;K&~v1ۣj(z	]:okdv9BRJS	şsZ}G(Ļ#<;Obi>{"*$uӠbQ?SFLw5yf!F'?s7/oSi 6tnŋŘOwLt:($pBo¬v/Jbm$Tĺ(/e֒+|sxYJG_7EȠ
?|$Jx3%A'SҰIT{u7TJ1rS49ExҐ.+Z9@0 òJD <2,y&)}rdrٽ66vzڽh~l_U	jC(6渍4e".gOxqSScޥm,:U|p)*
>$k2ji1tq5hv;O2+*D>AzĂiQ1U5uAL8W(|tZq+*
J4h,1GX| =+s_𿽯I6?7L}*@awi7,b1^~EaICb~ee#znlMiE  @P§Mk!EGX.9r3&GVEi1h8pxNЖǧ|>2py$		>*{q )7^Pٚ+F>B 
aHs,7  
x)UdGx Ie0}#:<C7Vm
|}МtrSSK
qAj1e['ګn4&
p??n_=F~bNA,A)m|4g|!i"vIb
t^`cABs 8P93 iZ|)E&+=IΌqOEHmf1$='u|Ed!h0G䆀zAN5$h7+פ',XAӃmNd&|?^;L/;P
~^p	ܳ"k LN/߹=ޘBO,IjîI@rjp__u/ܐ]qݥ6t7yDv{IGל=z4Pʠ̰y=g͚"pP'وf'7G]6`98fLt~_Ir	Jb62oE@(_Z&օytI{\^ŀ<i1G;h\cKD!})b:J]v
[_,ŔngzE.Duh:;uZh[>]Ţ%ֶӈu7u^S. N&fz@-[䪲jY7cX_;b.ã%\{c}=;"+up]b>X-2;6.;6,uFRW)o_6R)l*ƢB@jWڊ`a\3
|%7I: cl3779Rre7Iɥ.%ux8[}fH&D)|@@ԓ'b=bʰ!&Й O{b'z^%Hw.R Z.
jb@lö+!&}4=-S:aof! IȬ#X+y^ah_j=.<*#&)I",c.[&ŅAQ5$r^{F+r4<y6W1
¹
@&FYTPZƥ@h!=V6;s8Ԕp?
/\LC"4v!o@S5ʂ&$iQ*ń&Qqq#*43Ng쥾8XSi:
`AKzSǂxbG{ÆT8	P1KV
pDD١Q]IV_ALYj,#٘c5`hCD̉R0dK/Y_N@kR(fⓙ_}	JZ%dx殺VUGsSmbtՀ0&,Pg-(8.BkD{Vθb]0a#k3_#LHA9L	!R85I٠{kb%"]'aY#n	-\@nwM6%Y8-Uꕁ Ȁdfmک7wbpv-hs5D*h7_Kc"դLb%WߍSz~L03<9!2l++ T$vc\Ef@ E׆	#'Ǆ(9ҏjÜHJcȋ`ːRW)B-;XJ`[ yc$^gtwq4=UJ&tM歾![4c#G? [e\#+,dEln(rlt[Hj#꼍:ʂ?J/}s٦^((9Ȭ^2W+rуPO'>u&ᘩrt3{[x-Z`prDI˞bMj*ź5ZZ\Ko܎7HݐC/ ʍ*{О?v74m;Lp>ʪ%Dk@%!k
y?נ-d
|㕭#c,#zK[#nMCvp[Pc9Bv¹l_NS>%[!
]x0k0$~KP0V
z([2830Z }PN׎cu̫6}¿los7KHܺd}Ӽ#hsm2.=nzc9bGA aDGbș}	VdD-ADfWN
znIw#iy8sY
NqE
fHRN!5F<lKqKٹmMhR3,O͍w5灧<ߢo2o%5.KM~DH@ouٕC^kvp"]QXG[@664+Aʂ3\
9"43r@Oܽ67Wv8})]UtBtL;,މͬteK/w|D~`nt}6t)hS㡱QT-X'@0r
.8?&eJ
P. 9f! 9`r2mNf{vf̕XA9keu4jB
^mSx9 ݩT$υs
bN"bZgnNW4H@yTfKm
y8ݪŞ>E۔CM꼰`FX%&c!1& =?uhi2Y<7n)"CDn!UuIbLPsz{fRcI15B`>B(;!*ɍ R	7,CB(͎:"ӐI1!7:h	?~W[XK訡teҤ( Tҋ{iбJWƋMC<ξ6*&MLAJ=(LMUZ6Ӝ111!&0ǥcRNF9d#mMr4+{LCXܻ{4ྸ'vFl˸ch;.x~E=uoQ+aۓg}L--t/(Z9d5,444 \O	f9t0*ho%WL޶Ҫ*Cã
:+HSQ9"M4tI^ )rѶ`pFabw6e+tojUmly_pSsA[+)//<(tژ|(?xmuB^`3tNgsq6D?V;"5ug߻77/C%Cо0lpFǩ/^W*|]EQ011!VZpT
zŉ_ `$!]MÃJt#ffW49u'ғ ~g@d[
&W"`U*E5]O`Yv^8/`sa0حV}|Z.{uVe2	$YĞTصd1cvI'9ZL9&0c `pz$XaZ0
#1g^_PwɅ.@:ªeIyw-W'bblǖÓ]s'RJods{J̒AYF]E*9'(p>!Ph˞wi@(o~0EATJvD3Xׅn-\*vnr!iAF f,q&϶qϩs$X$j5"Ǎ%h&ŝ)נM5bJڒ՗)ӇP>_֣VTRi6CVXY2?ɌD0}׈syAkV/ǶwTmbnK(ݥ@
S%d~ޗ<VP+
ֹ m'@+>J'()j+E>A+jFuUxCXx(*p85_#1=ܴ)I6TJ򈘻sIC͆nn:'وl`C|F&8_&tBXW˞[FP:(#o&̱UoRҹQy¶e`$N,e&N p5ez%-`u) e1"[M	rHzc2mA%eF((m$@W61sJ19:y2%ǽ@ #w\iAFTQxIB,(uleeTÊ@yЧ6iű{aQDRj:C+?3lsV?VVŷ/g3
@BJ7 *4w PUNnw)HY;/_m_ǖ^{z3Wl|ݧ;)۝EV9/ER83b=w?b'0`0 ,fyY8hc LA:E"VؐfQDAowX\$ֈxǦfS#/ah1PRVv
	 @anaLhũAB㈐LBHT=IccɖP|k))%c;P?@o,_^d	`-5'_әN d[%8@݀qw1/YC<$򆳌7b~v=[~eBtWA,j/ff@䍙$]vPF#rx{!Xg9ϫs8T(Vh&oMˢ5Ŋū~,bevB 7S0ܙ|ҦaC؎G	#B?E?+}z1ǴP _+gzӘԏ>`ot(^MvwxǭrC,Z}EU//n ĊBPÒf9o34l$JzZ#ŉCGH*Zi$M:RrMTɅ"#W[!xEG;dܓ{DEߎT-ۚb``ݬ`Yl~ʕdzK}5T|\2s]-tZI;La~1[EޅinR#HǎX얖+D'"0]p!%_|] #B ㌬#uw<ƻ#+>'}(T)'j"&h1]|,Z
~:.&"ie}b<$BxlNF|q10"@n;V&{oo}=jS6̶"m[h%H%v|%D*w5v5#*E}q'Kw%mOUY&U" |=HCS~#[3C@!nG	)|t`I0:rL\235AA
%|pFǵN<*ĥ"Ԧ7
clLM2ĠYϝ'VH+ib`4tFzMLz.e`5,&A 1hc{<`ŬUUN%R!`KlRe[L'BaA1pQ jY/cswVY.۵0/ɪ3첸ZUMo+,JF"V;ݺU?6N5ٱA̵N<}c- 9 3=^f7#z꾍ejw1jiɫUv"YA[~YwI.qdkCNI S|/lzp%Zc{tƞ<Jr%EwRX&ckct]{VjM$j7u5sC*qk~I#)$Nhښ~o0M7=FaSm4%(5u0 vxU'/	MiЍݲ3O=b5>Z$ZRdG?40B<@M~UGv!o;yU6iD˚(ʲ"Afչ6Sr)
0Oʸ ,yZJpy2f݊)p3a{=|褽;;NRk fy钎˼L֕Gs*nvh:`!f݌ lEj-9w͠AaJO|{Mw}G΂1JG^HebDYmXiEH
GJӝh/P=~.vBAQ1oA4j=uPςzU3Hтj0;>,^ld)DX7I:}`px0?Ig,Nowɏ6`;5Iq"ŴMnQ"|^%9`[J%756
䤐/rR_߬Y+GQ	{6
R
qW~7VVJW/l%RJZi܆w׏M/hg^`w55a%QYu9OtE;[zeXIzj軆]ceyO,x}Vs.d6P/_w:JL"K jgJ5]`y[;Aˈ?kbur%MG.!<NFOU<1>Wnl(ToTiϺ%mwOM_!RX=v^Ea@p~*ʩ[}mt|/m^QARmRWle2W#"Uox8'7/-\͐GQDԱ䎝
i0.a-ݴa(Nܺxl]0؂?zJ%) 
q_kS(z6wQDݿ1qo{kbOs.jؖ$m 0XM#PZL XgA9| [ `JF:gIw'vwT\
;e$,%Yg(u ,pz#W,QlT.B Ez(S7,FD60!q=F`&10Nk
+i&ӳTu,CX G>veiŏf}пcze>iꢜK^IV[ZyXm^U,Id$%̠k 6,վ|6gm {)jgTzki6G]'}F89Ɓ.W.cj2NU %ƳN&©(e[nQ#4Lj^ߟ5&nÐ;l]g)w b"jLs#C=T|R\yQ;8=%/M~%tMD}myzvk˧Ȧ#*pY/þY;bӒPP!XDoedWd-w\ѲoK`&~+_I=ꖊwO˛岫	"-JVrKWnEڋU	SOߘoS4AB|T?;)U?jgh1yD+JόX<]RO'v6.9_xx;t]73Ƅ9\t}Jߥ'#]RZGEj(NId==S(		Ԓk 3)E-84`2.V)^M>,'cJ:Q'DZBa9(f(ŵ34OLٸ8Zf[ϑ׹?GEw*fp>{$i-Umi:Ǧ<<RW+zQ<fCzss>,z`vt9aҭ;;7(divC8>B|+=ՉMte-]>}c8m%?`CUFzSeI{ߔm(t~C\15F
@\reuZn/;PsJ"&ڠ ]3;N1ep`cG8b>%ajH59nO4IvZ0xr>H_Xxy+l*<g{}sé^a%JXyOo"Z[o	\,vġ(\dww
ECJSJIJZ>dE-a,!p"I7Zhgl5XS! -A4 +S1 ]#I|I-6t%Aq K;i&0ͦ0#cBs|gdRד[O<V "'hfr3RRmn܊CJhm:JmTi	֒=ѡݺfhVڭn]?[֪Cƅ/nYթ^Z>dɹ\: IdvH[I^6~n%?72yT6G'&UㆹJ';焄n|enjx˦eR3ox|`PEHx %>l1ZRУ<=lʭG|hLB]ZMENO6{OzҙQ*6+-we+8<-x(m&oQLA3 񽺆(JVi"L:]
0<^LkBOlr}6=6t@G_k.O<n0Qݮp1[6rv%*Z>z9CuM4AR܀FGI_%)l 7&v}s;VhX1xy:dMzW48%ZA?l/2˸1ñidT\q`еZ}gɫ*|Etlbj'ATOu>W
uZQgwk9v֬V8M(_..q
 ױ$K+{K=6{8 /OCBa04B(ۏܦ!C(@PW.rb6" LL.n6\PUS8]/-PJ(쮕趌db b	N,N0>|ldo҅Sů>i*zo3$vQ6c+\Q2+aozOuo*Y`Ei\yeZ/vݼ!w3z!$aMyʏcv5U|C_'G`-\qd5ou5rˁZϥf5TGMN;\okQS/jFO꣥kaiM׻/0Է㷇e}>:-`+q~ !"p1|`3ûKSI=W8FthBe*'tF7};/u?{J1 pjx{R+HғsgSThRU!2ua!SG#ݸ˂ocsHVᑁ_hN|QHXw$##k.@Y
h!dK-I2@JTHG-͞.&i݇<އEjV0k:vgdw:[7#Lnm5״?ssw}"I9. >x;	M\8!t}E"

[HxE25BZqI`A&9/6̴QYn%u
[{vjfpQr63\.0)}Ǝqn18HhөWذB/l m۝`̲6N1vH[7LeYMw0ʆ!YTDI$<߲BBu_`p{s1gRҀt|4w<).{chwJnSӧǽUkRᦾH%[j:;[[u)!Dبgy	v(;B'Z}XeCVN@\W7;nYKS\h~Nj\l{lY ~+s8C׎
Q_C}=\R HfY13714nqz
wZtȻ
(k2jKk¸~өA":Kw-VǢ_Y%(?k*8
,~OWR4^ t p)^.\L)߇u\g	K"dPj-4PZA2sjѥ5~1A^֚N}w⽭M858b^P+[F9Qd7YD^ R9	)^(
eqhN> _Q{Zzb}zvf!p+1Ĭ)5EޒSg8-D"0STd~+JRQ`ۜre*sf@x·[hTu9}@\t3.r$>}}n=:rMݍwSۆ$,m_^!,j5j8eȭeD,gxD()4X)]SK9Q%sxњq Ǜ?Aņ3d8}Ք-TT~۽%`̛MGѩFq8]JšwBOR#-Ybw~-tf fY47)vwg<>׮`~{RqZk-h:Ɍ9lI,ۜWRt1LHhKV(|m43I#8#БJvZW	L/ ^?V]NfKN?;tW:TA	6v&B%)(:
a'仧gm3pv~??FA_q(,1xXń;a2vF(:1i(eF 4{VC׎h%E,iC\"k!I]:1ܿCQJ&B#M׃HHW72jBZX*%фm`'45#od8xEwZTFyb' Ng;7G並#s> 078UD[ E
UTsfQk~q4IIĬW,?sTezi\3"__VݑT+6w*Swc1UB<Yó6ÂRFmenyBwÃ7jc;B82k>hO&_7_ܝ絙x8]ZpOR:s'.`	Zdl\f
R
9s4K:7hnІ2ɮ9v(Jڴ::MliCkzFwifM4HDkBtF2?Tv670WyC[%ZkCHZj+˵OL>V5a3(}=뻉6e09{)AQi`:W0}w<S&Ԝ)1{CӚR"̖)eB	i-(@e''bSZScpϟXpXj-؎'cSeݺapG}q)R1pz	L>6Fed)/-_3{.8έ)b1|N͚CWC4g5 P!'>.vQ/'== fx5BM5͵H_LJ|<Zgux ߾'j_YOLv(<H$G&KYuy#Eag|8 S@Cs AƖdvLFB:Bv6uWcn4Q3er3\F.7XZj\I
ͿC ;L2<H%_'q
3'K@s5hA	рp	5ysPf"x\PT`Q-y6 q|	tpPP%d[v/@E)BuzeM.S7g34Dpɍ-&]ZU@	vpmlb>l#ɯ6t	z*(e6+$ZaJ^=WV|+:8f,NXbSb'=fyJIE˧f(ɬ}=bU#9ZW5CSzs
YoIzUzr])#['%eW%:NqN4;:z8_o;(iWVD߃`~EqKXU	(P\Bw4]?|ڦq2(⟐Ofm~OvUy?t5k6̋0ls[shffiyqiC_ ¿|BiJ}~szՖ/(p:A".2ByTzPWF|Sipy $ڲxU%=3K/A=YKw^8xy<bK/UlP-ZG3@zO_m^di﹠^ZLznH68j3tLm˒ҦUD	Hz$4 )8zzsBPH +=8g67;q65݇vk;]?#s4)Y0cA%p+=krТiPI埧WU (H9*A|1gl̋Z~ReX W-)ľPhIy1Z3#/=D$szG/$OԵ[*m	;2Q
5c\SQ#ɸdH7!U0ʇ&N+](Va%"ި \=maXҀ)	K;_c295ɒ|fefbgexafxd//N+xQJj:F_(;ÛC5`/ӪcK-:[gC6IY~yȹ#4XZ<ls)HzS}lZkD>Г2h\|'F̄PUכͿ34(q]ӑќmM «]d1&8bt_rs}د?Z)@XlNgzRN;*g1ş,D.8sxaơnͰRT#;Ol=Q'6ÿ#b&jĠ':4,xm2vj$a3䲙2,*`;yxy{<-@`õnDgJ yG
5tG	v2fUb֝j&9ȁaGY	<[m!J!1s{Db0	%a!6yDb1aL⩴دabzʹ[ z//GFQШ?2<xG}^Ҋ!&veFR6js{C4E>r@0CIQCfSgHFY(

(OHANjPL
$<(o|Li(iQ戳 'C\:"@lO$\V[S=Fe1/$t2"MtI	Z
'$;yׁ[; JheVdBViJborO1
##̃ɞqEF)G*.3|1پ''V"q-@pGR謊b@@o g<k6b-kgcf;-g̽	88nk|\O-vbI6xkF^$:FCP,ƨ=$ʜ(o+ lDbrr9a;d0(c|^[dz*ʊ
qo%M$#M$w2ec\P̴G}(\v#֎6A h`xLLĭ
FGde՝b55wǦFt=`A0@#,?.I7)0ŷ q*F2.Y1lX.R,qu13+6842sn2UbSl4/]!=aH@A骯8]zgIz
\	aIG"D6b!hb"a]FedFA`hN8)j9x !E 7T\hE{{	ȈR,F) d	_V2(?B><A·'W,ۚ6 VCw[Cl"IShPdt{x%3sU4{FnFܪ:u/۟bn36.U#[l
awkhE)vI~g{恂qo|nVZlڌKTtjv8īzM@Qj@\rna,Xs	QyU?:dS]D,]6{{|IcI.y	|.}͋U]L8ۏݙՊL]>*=-a"8?;%NSxa}D?	P~~˃~ز4`9uխs#STj15a\ESjIf\tRa
RИ@$- Ey;<_fYawxJr|"-$#WQ@i8u 37;L5͇tҮnC	FPRG\IaiL5.@Unw"ج$@~:d/bnR6%aϳ?H+Uq =m@:Vݽ^y0U╲j&|,^O7K͑O9dIֽD,ָr9Hr+lh8/?/ssg'3d1a^`ȚX0c1EʭH^V误Otl͆O2".3{Aa䑡Do7C5/_m^RoSyf/yi2mueN5rRiB7VCAU@\RF	S3.ȜސAOY6R}Hwx<0WT9Mg!XEkdI-%tzlh:~qk:{v=P%+NFvi< !	ǽ=n ʿ  nZЉH ov
g)y7}~@>N@GԻmR	o\p+<'hB<=0=rE+*
]v6%w$ınP^W_*v#$)4H#9%L D'%7Q3ǎs׹~w`FjChuA~i_ӅlEv:ݮ^XzqUU_yܻyg8ٕhsL+H<ύ;ݠtx:mO5Θ~2y|5ϜFyv2/gzbɣ+-"zg)5=߇vSӔAW{>+偈mT$g=5M)YQV;Txz8o<-=-Bj! ^Է㮼7Kwll،6~׆ҰDyA7l3ABqj3_dy\DIz`#"lV-$rka)AE.9
3ab<5*  (JPCP2鸸 RZolk3ZءYAOpdNDPyS^՗k/"!M3pwpcExb1uБ5U`Q>Ycz?M;FӉCmF%h Sp,u f垗(y*(rϺHKPĬ|G(c.H5a4t@+l3K=C
`Mt<#ǥUA25WvYlF WMؔ]/ax,g~(fJS=UK##c2*$UȻl.C7A#&<X+[gsu?'g",:td-p\*'ymOYbVSRM-ǣB)p(:(c#buHi.;+@4!䶇]rX$@ P6ޛGi 2`r'/25#ӿ?DoI5״`5uمU;<QB&ꄘ+0~pe>A FfMm{D;v.{㣹6LHI8kv
7+	E~~_rtro6²n)fӧ%&WXAL@Ƿ=ҏF22)WTI.Gow01)步X؊?#6OC?הȬs}wy?ҲҌM3Bs^y?m+9FKjRY"Xh'yl\x>;bPƟ'ơN?j	9QxY_$7 6+Ua<6Z6b∗,AʨYY"{%t|qUBnG0T6UJl^nmj%3W7 ,9}ƃ#%\M3 ak.kV򯛣7Gǃ4ZNoVrw{gWAɏ\t2!L]p(,ȁ)ˑ@x<>;Z_>47^YCJ_%ppksN)~ټHH:$i
@P%Ji>`4\Bb_qi;`xlN=-H?F`(34 2tVE(v1w|&6!Yw^"e`khՁBBP
q7vh|H(N^6L XtJK&.;6J<%T%5'4vj҆A=
}%Xm4OqF*Jƨt%$;>ʋQzx ϓ7ݷ[lT>#zjA1xQ-@kn	;!܉bPMjQNR7$oĐmT0/pdXù>`FphMkJ
Z+qh:FRrL,PW)5*+U b+Z6(<6kXy|.h9lX`$s"UL
X~nMs0z΀rJt%'>(;s!ARɐ?"%u?U0SԻ:	Xf"܋_3HD>itX\bG_?\][z҂h*PˤL8Ȉo~UYSm2rw}BhhbX?9A]0ϳ/;SS2*|%+K:Lpbg\flK<2p'W"Ykѹ+Ղ ux@>s]5BΆamC;N2 ({פp\S{vdwmId@yS>"8P4#)@4Tr8lӺ\DdU٧FEM'}w7Oys
ĒBIҁhs:&?;49A1IY/3xE3Ye@W&7q %.7kMǛ.no[{[ݦ'?\l Y$5;$ٕs}&q+蟏#]Tk1oA2dId6]A`vcz"ؿJ&kwɩKTCj[lp:cdJ	$F^FɕZԌ<ڰD*\,tB@D,tBaxf.Am#@$Xl=S%a%%XFW~#bQ@ș+I-9+"6a||}1)T<pؑCQf0ڭn(Hՙo955슪T*qBFQjgziX)nr}BaGCCE_2H(
>vu,rS
(<_RZ!X Dyx8	=/f µmڻ
"c(f>`KZD,xȖEnԌDK1щWwk$"I	C7F3-;T<=^E6z _z{YXr6t[w	 VsWe#{d3}+汚Q6ݥ.s :O,;l `L~1LoRk
.؛gpb!Yu&f"vt(zU&ru7O͏n	:=bfɚrqYտW YI5WgLb8zșĤ3Fs;rHCuJD>M7 YK\HQ9-Izb=Y0^WHZ/ǍC$`qjexH*ft؂uE"J@H3f{ ｫ>'8pc'fFY 9pX{9X).9}Юzݒx0t	7r_ʅ."*@fo-dl2TtG\;ҨFl8PhZ[؜[1VOSb.[hlڇs<H 3ІwUٟ;`!557|\uOm 4`/A!1
70 GN/,LFNǠ鵺wV<}m)i^Gu6擌O&< :2MIH11̪lSrowߠπPԗRwʶS]Q+,/Ѻ=`V:k/EޘSc%9#)Wk֭!1A.bRy;0lO1?Bɂ+%XI(	No?l_+kuN't&&ې]&.[ViI=88*1J{u0˵EPnFJVaޑU=FKW7u~9řYnI|g<6`5uvL~N6ϩX(8e!]nwS2)ј9/xDk
<"K, bd\azu<~0/"߷1|֖:,xLjQx1b^KK6+G'D7yIē@ X:xrl?kCF*X-2"3`#yؑ'ٱa0ur1)&XRiSNq]w[Xi1iB#v6#ɷF|tt&-Vg+3rU£Gp
|JBl~8#Ӧa+G2h4k|v1)9$q~T4s+k;z:,G崃)-ԖmB<z`mMz"E>=8Ly iAh!K6xojeyxw_W(VEQ;2e,{pQ>9<R[KYPqƬd%t#p=CeEb+{i8ȧ:K1rT3d p+UWbJkf\3qb8c<	7%l.<tq3Z[LzDn=׽9B5o(qЍh޽Yj$6E-+KJȩK%/@D75#>μf̘{rú>?$Ln<k eS\z2c$n4"3\P`>YXv.2l8`/na,QAEjf	0ݛgB{J}sޔݛBޠSZ%,j,<(EGD49\p3QZ!rJI@ʃ|Nተn% NpFZ>_ӡHU|*7AK'OfgO*բh/(0K~@E1aW+N)"տB8!<Z0b%L,f+OW
]ҀT"q?	2p)3|Q_memJwfoKiZJl٤59VSU 좡9좝C"`ZUl(
n~l@*nmWƒRhw3X~dv:yb/Uhewi7b}!#/鴏=zb@.$!B觨"bcGH:TwO|	˘kO/7cJHE{.زUJEɗyp,KN®eKfes
b]ؿml	"cp)B<iWkyNI~<l
ag]WQDGnWPr:Ԛ=Wh*|"~{Wu䐖rzC"dofXSMJu#x1Y`R:@3ZHFCPE,d=9B`uqFj;UTcȇkɠF<L+]YvvxMӢAbӈk8"TBUHCIiꫠRz]u/Ε+Cʉ4H;C(%dզ?`y)shM=܊Mkι	CQ1.C|=y!z0qt?Q	$9i;SJEAS"} Qs#d\foTsNq.Tlw2doDcfo>
_x(6#S	}'ѝ#-AEmލ`59(nDnAcTer<Vͻ!K58asYD5"~v.`Y}5&hkvgr=	ń1DRRvA	`:옘!%"(>#4Q
BB5d'PR<pNiXɝrJ$33ᄖ`#AUVx
t;a78\Ⱟ-kp'kl$K­*`-WI]obr1p{ϭ[Cfęs*E¤XBUK\,ųuVrŪNk/aϝ0ň gP"7А8m]K9V;??N~p/p|WaTj+<be/OV>EԳL,wgx?t7&سtz(w/{DqdĢnp EP&O-,N'Aj#}n֚/]+xǔ2ɤ0	Mī ?_r~n1%5Z	d>˲ppr&K򛮟+?a{ ! ?RV\vE+Nzb]<\|s\#Xx,dM!n%K夀ba3bńXŅ7
u|%щ v7y>0ާ$; :D,~IS^MH{a+;`e:bj>ӛp8@r<FQF"wUA]On)iف!0f"zMK6`w|ͽzռAvWg&,o3f+%.L#&s<V17O`ؠ:YMDSbS~)`|uGXFL]7
H@]|fr=vNMEnQk9?':ygGo]C&1~7QU=EuZx~T^UXR'Zw}SMXk=mkqRV$$ĦѮw?eJ01E	[Df]qkP9/`nwTI)q
|ip7v2*4`=L63<|<͒~<;w<XC|؈*>,'W֬Qbtp?6fO3 \1|r]U.>)PNl-lI#k|xqt-bBä{VliWLjE۪Fe9_ۉ"јM16ъ8PrU=bNBTUHڝ_?EG-;W=?\eAvngqHra⻧AeZN+[wt,^**hF61|^jEѡWu.)Rwnsh/޿<z_<hZIQVϼv>\TR%rG@k2brY_Vo©BieFMeԎ_R[Y!8N㬭f&?<v/f.DK6¾qlw^#Fdj|3	zK 'Ѝ^4_Ӿyt#S1ƟkjZ@rw؇焵E|<t&y"-azxf >maU'RVq9ĵ_dq.ml
k +s^ZzGŅ	K+NO߯%6ߦ׊wz
srP8Fц\OǄ)pNaJ!G)9̩gVuPhҒ9~O/ph
n W	Qy6Aǰ0-BGTHkDXÞIabpZGzjdt`/Ivjj{z3|ʂd[nUcJзW~²d;jxpǦg7:V̄=i(|n_ٷ#p{a\l5."o]cjX7O*n>B E<I""ObTZrYG0tNXiTTx	*,h`]8\ s
hvoqC ~r8Y6PlL
"ʓq+	H<\BO}Vԛ 0$TOQ7b8'K3
u-NJҟ\ˮV%nóYωi3МАϑpC7l]PoyK:qqf52!ӝO.9،mbFOil10 1"6yqk
1PUD&5y]Рp@5c+Mm#E-%1׃{8:!|@Ls36TSZE+qLEA_#(ozp&-䨸 |ƚR`Z~5]rjK\%꛼Vg{$\rIJ_n\vVwځ!u>Q-ό^T9 b3:i-^Y7VRTw]JvGj&B?]3H4u6yDo'_/F";sN,<bFy#'XfAYǏ9Y60dWԨW+WPTɿ+c$/[YD#hc_%VnBYM\EGLM#d߳vPFBߪC|P<(().LoTf2_=G~5~ݪnިo1TMf%ΩYjP \AͶfKfby>Gߥ5ZłKa@7* 9(t^b,10S$jWx']c)٦$2;d;-̠h
KAXseS|t_?c>!EHCEf,)l tXʆ9l5hXJz*z*+2$_٠Ԝ0TC٤+Aشߞj,afP:fTP:jf6*p-BEC|R'/5Ujr@-`TR ,L-SP~Glb׎)AOE1$
xeU, rI}ʟԣj[')n|%8y_gt>Ep!>5LKfu>1r$zZ|so>xY$ƷmXJZMtXːW3d$#pS	Dџbܖ/TxQ\d3#^1KbKZrCQw1jG4RUyo<mNWV*e\ 6FdsN<?]%-"#3XRGIas1+&4WP	i0t|C)âI
# -şFc02 Jeion5F+&İnjwrxw<~[EfOtxGC]dMŒH_x^JrxMn1f왯P*5w⻱zB[S?
Jn1"jubepmHe&'Mbss@p18yt<Jk~)?CorO	$n9Wpބ@Kd\^Y.	'^!'LVZe!v9
)лiQX/Qqݾf耠	sYifOU	+LY*n<F`/S6DtubW,(jfHdfŵyHDYFR_ա5HŀX$B(@*p%LLHߦN(.%!AoWi<m΃>rgc"0܏zU*;ᑩAWj$xzAmUr^Mx4W6+<4\ӆG.GV<P}lFYd9!MgԓyUIpM&qۡܜ*K٬=/iyv^̮;kgWnޒ!7UN+GlZB&75A!&"2O-lPpPrJQ_G#t);$~viԪ׬Z;8߷$2~Pjb(b.*,t"JD փXq}za<7qAfU[#!|I7=P2ZNQA&=f}G16(ǃz0MBc,`ք9AQP1.PbU< :hkoB1
tN|`PU&1y*t3_tۭnNSUU*%Uz*ϖ|Y+ϖ|Y+&B𿽯/nvJ*4tkye8XղHx'q0¦v$ǠBbǦG?+&h@eS";&A;PA_UpſF;פ.j)z/9UDBu ө&Iq78s^W"Re<8k,V˅ڪ)je엏ͮ!l*Fy}EW2^FPŜD{(kWenwtR< `x#/&Gzu 5~1JKmls/b ӚĔpl I`G9|.>&ȭ!Zl>e1t#Q9as'͖@cAfA%BZ,|AJh"ne0Kٜ-;S1dH-٘BcDZ&)B@4?[̬n}vuEyH=ǉj6tNT <8hAA WqIલl4(`c<b1Z*0>8P(+C~ͭ3tghwnȡQ<ā̝l\>9CvOtLb 2J͐L	S@ W`@L"2Z\~ӀOSxiYaqfШD0߽5165HV.?E^-83~B*Q{?moh?cU%2#p/bY8μbTxi%ߙʇ@Wmq5h+D7KC۝eCZgIxBRKg{0f|)DzzNS%ġzgb<6AP%Jc(G#V?;s3@>%ɢaO\Xq@L"4UQ:TBB؃&5/W u4/{yR/L(KF9 bi:[64sTz08p 0#1?BwUR#Qq15Z!×y^&3pS@W AXyʳ1y=d]L'wefڳ"-)ȫ~KB'3E(;"D|O: R;+^<3_);(thG!!m]2YzxٓTd nɫԝNf4*8n0a;[0&y{-{ޑ mĦCz4;KSü1wdyꄜ,QhHrjEG58vW%_C)|hA8_8n[<E2YRDC#7L̶8YvZAUT#Hato	yn^TbZ&t7"2b85/oi{i~)!O4%\q1}|'pOmA#/;[$^"W}kIDy0
5B+&=)>grDk]+턎߆JjIT1;K'fU֔c`ix#@pl7AS<ދ<o<Pȸm|7amˬh;3Rvz
2g+Ɏg0o-Ke'DK-vr̕=j-Gs*Fi+9Ie/jgiy#fMuلam#뚸rS)Ӡ^7H["D{oD2-9{ޥөYm<>*"i'3DE<iQ&,8:HS;-1"៘Hq_2?dZp͑48%h_dre09>e,> 8l?$09)Sd5~`:1Ȣ!nRŷwIZi(C@rLobKDwVZ͊i0\X;lw;	Kl5p|ŇbqD,B7MGA368"'M&C'mN'~'wm7'ݠ5No6M|̾cfǐ%{O TQ⶚~+]vNu
N'T2[v>!щ&<&>0u\!P3OmKub@B!ӷUrOg 0G	CxH[1餼 4YaFd.N
 +I:t@e,K|;\jaD=n6[;7ԕ#TJOǐ+qBئ	Q<UvGr$Yf^NPQC,gKt%2BnJ?"ܤM&*yCsퟁ@Vv2\sR7K~qhO`:#F!?>U;+NrrXۘ
&cr%7Yi'+/8;`82'5WD	~%أTec6h^ (>Pv&Ul!gsMJt|i{}^--@&#_TrZp]ZzJPBTRHb̒>" Gһ*&śgWv)F+_;|in`g408ŬHkƢAя"ƒyaN&u(L"dAbռ{o	i}7QU댇ijib{b^:!d&.+9or*Q\m&Tط|K2\T;('/?:Ԝ6fJtQAW-qxO	Js^~vVń:\*KؚEG閐8RK?f)n&}^9tq)bhdYO;bLrbi(k)m<g\)t1ޫC0,rq.

3xIpMRҍֵ~b+i֫h["m}Rm#R9!BKJ,?ɞ~FPx1+N@t+K]hbu+7ɖ3Drj)_ hb][2S^rp^qj8L+p6%?m"CïraWIrs;KzbIB8ǋ;)`=^aZ/2(&_>Z)ȠvվSpDȾ-J&z0Jw j{3ZBǽ ᤻Cwݟd<^zGCpl0hm\i(M"	7'ݟU<Z#	i*=	ʀnT:F,ٍQAdSKG)01G2]lIp 8g9h<ˈ@(6tU`>bRUɜ&5{#} !;aul65ń9i{Jc'XMv#0|б5+ 	\u:x:ߝNZ}c7k	M#((]ԗq^J3H );$b>IXKNy>i4@9&wͧ$!/OIf,"6N:Sv꒹zMT9J/}_T,bYMgʕ<kЉȐb_Aq!V064M$+##G|FgYvqbL_12|n0cAc^.sMȗ:Y	hXŨ;/ plF(}` p-1><Q>?L/w:[֓>5Ӂ^|#EG=T"i80?6 hp"Y~倏[jmS:md>.QZEujowKt.~aݍcJ:DRqB5X[S8mꮜqX[ҠGiJ:i$N L*I]?ߩdN!qm99z8G+_-Vrk*玵oQs\H[0<Tk̪QTmix%$?=?mzַq5'ZL2\ЧWK4uM a$<;nՐWN`gj/̢Yqb9<!MDDmUK,Mt٤@ iBz8YꔰrHb.qf,mբ\L7m^aF+ѧF|8I4HbP/ze:(/JcJ(-,(OD!K)wfsZpntiu9;,Ν
MG*Dn5#Mg_R"FWH[9>G{eg4Yf/ݾHX{,Flc%|̹gwu7?7{UZmrf*)̯Ȼ|_N_(UY}RФXt༅dO[ijnoM v
CK\0A%)Ar60/^[%uq[.tTG4ݍnjdim~3%8#~jA[]!$o|qavkқG(ه#seԂX۵]-	1}#م;Rn-Z7⽽\VWhd;rEBəܜٺU
_IueviE6BOeKK.*~wYFD`+MiP}Vˍ+ͪ5[5MEUp5RgLSN8"#he`#$
#ۭ)q9l5V;#U`8^MEpa}UfguZb3(\FfvWȌܗՉV7J`634h;ﷅC0^>וퟛU;֊h/QwJ[JEt9 \)EL%jώqHUmA
RV`lbD:\v^=n" (#or_a c|wf"'Cۖ.?GlzEdzenSVH+I3WoLNF`Nkã8# "&)`6,V㓡03k{:r&-xrd5%ZPNd0@< V9K&NŬ4CNP24Or]mbā9 @%c$VtS$񢉦K<y?Vb IwQ<|cȢ_dK_To/4[,ה/M$8Ōzj4iq\_#3K4Hw&
9pdhŉnU6p/2vkmIZjFoc&PG~}t#˪qe)DKTDs{xDӍyTtZxWIy, Ң!-*2#=4?3#FoD>g \goH!X{Պ	L?fo Ƅ6D\=$1V3Nc-U@pcͅRXd^Nªb@Xظlh_C!#Zb6G/Y-;*ٵ@:hܪSyas#7j_p.W0"	5X]YA6jDԬ3irf5O=	v(:6LLUs`bf òPE+y1	a8/lLǋK pFۙ :!hXăA#bmva#gܣd*i\sH~FN;:/ꌙ9(N+\:;׮^iun;xVXRt	aL Nj;z&w_8{}eaazAƜ1@tP` _Eɴ`mbS
((0я#/X)q쵍P{h
2&&zl*N8fgSTHm tQk/ve֫1@8|g3\RXj,Sb3Th0Snm</svIꐖ'dJ[^8F
hJ]}[šbqLYrRq!^ZP\Gv*f	߲0Ƨ Z)X]	Q`=>'4*8Mv>	Y-ZP|  feXSz24Y4O`A	5J:w=oF!rEp+^:bלsSw˴Ge*@ZX$G`8:U+R|HD$'Msȡ*/3LVgaw4
yQc2!Z|%}O8oKؑf=-̈ms%F e.ˠq'fqM.v^p]ːdc{3z8hc1QHKPdtF˧΀hEn5W	z2($@rmaZCg9[fa)I~%CϙǊN6a =5Ahti(2#a|F3q#fQ"4y9x
C
PtAJj@x1p0N=>Lm|G%I:װHSmi%0,%/0{Ob9y#jsw@IcUSGX x>-NGyh Ԅ)6wm4u10؝_
oUzv/SZD{V\:fN:#s]9Jpe>#FfgEic.s-IZ ìd{:J9GbCjGuTP?-	z\Dz?łXlD߫ê=˵erl5.Z̰YC&('Hx@PJ?/5:<d#y k7I؃ʋF1$V^~	
S%ĝ%/j/$b2i}j}j]§6k4@(V(Vc8} 3% >^x!hGf)~5zS\XkF+	5@_{LȒL˒Jxirȝ..>9T8Or˩F_u*Qml*}T+R٭x!V0bKoOȣrDP059[E@*y|vN|=QM$;Y!:h6nn=9m(4|\M~d6=$U=sUu÷낊j,(Edo :w)rUb!lw=U3Dp{OzOܧk[|D,+)V#L7tjW5ɔ34[Ok=9^OΟ<iOYIik4=@(d3_a6˛ݰرuLYeo[QR)%TԈ͍/ton޻Lx]?崫ys6UVV+X02_3̝DplN 7윁"
WdHO@{z66Yp=ރ(]TgLrV7e#c8(Y[We;TBjqu+9͡u*g׭uع!U]`D|qN@s!wlV	q cƅrQIusֽ޳'<U^p|ޢF27wNTsZ76G0gE*=*JMWLӎc/+~@ͯX<k޽E	T˧c6_*ęjT^>DqF4;&&Voon77o>cLpTmFppq6>.KGM×q1;K
nGˆ3TSPu(I"sj`!rJ+9|6OYgsJ Όs045DɽMbg~_uQE;Pl 6'msX~o-zp?4dM3Y/Cv6Cs7G^Yz.U4VIqϟî7K?=1@H	}ެxU~Gr29ڠ3͒'("S>o$(zQCuT+!J@	JB1k"#<>Ä~?@1&#0#kkd1Ě7A*[(/83ls_Uڒ?ѰKĽc5|Do'v>8(pXr*6CjRA<mi/ !PyLZr><a-Ҩ_!e.ojɵ\>,Yrۢ<qhU
}TڶnC+v3ԩ#%7bǫTAxdVeFx!2Uڂ}ts4u-HG6=:0
/lSaì,H$p:GܰN:qy{jUa;IŘFv?L=Cֿ@zONc;Nmkޞ8㶻b EY|ԐЇȟqʀi9QM5\.,EC7QK)f	Eڹ~c(l*u;(8ߛ {71RffC	s%tpxՌY]MR--WҭnQCopaeA5*aEil:㖿/_TO2|0Ȁ:'ဤmA<o|YNUA%+޾FTCX4~Ep"(V=/FU<M|S*scLs?k+pӼ?k*͠BE@+!y9%&`X<v.*ɐ4k  )?fR|zU2L8we	ޭ&G)[DU%-;DL7Sz,r\)@CK<+0-1Aԁ!k*25=S|+% ]= ?<s ]V:'xɕ0KMX!gBaLj<`{ Ą;>fpLZ́3V|CH8UP[z}"=PCJ
s&q1\qWEٝec<rU^(pIDV4]& d22@Elsp:Ϲ3tyQ<2VA{Դ'U4c'+nMr(t	h,m]!KM1ncY:*Qo[SLlװsEfJaګ
+(|Rw6W`6[y;%n>QjycWBia~OaTI\rQ<L\@3>Qj5DOS|쪎BGK5I}4<~CgUUc	rP>Xao[Ӡ֔Ree~sR*Kg^z%YJ
;I- ;1Hg;KFń@tp~LR<$#6mwiMq]%;%9d/sAUWɺCe]=yg1:;G"+4FM@Q0ٞFy7OgiG^zOd
%S󿮖5 ;4fuӖӪN-(e)4$4}\aZTAGpBpu
j-Tcjw *bH%xмwi&埌T(kjWϻTQ~y'fκy3eڧtPw$a}GKb',UR`#Ə:r@e!Sl8k	K a9":H괢0o6.qfvf8K:.
8Y=*x;Ȭ.fXG`>񚡒kL
lXjc̦U'"% ?}IAGeNCs'L#^~I.0'ٕĔڔ͸G}}4O- NcS&hE~+>8<Spm0&{>
JNHR7ÔT@"(Gba4E:iT^j"D s2-ϭ9ґv@Cq?Ik_9UXpY]:!nDzq;Y6'͈q7K6O+u˘,)Nmzy::6$%U)Ap17v"t0ض$ ꥛Noqy^PQ[U7xbcjh?]5|D <f^?=z{u/P]炩nK"	ٶYau7^BŴ0~Atּ먅^>#Tmz(=êUyuOnnY
Sw97Qnw6BZR~P
v:IA3=ʦU1YY@w:T5(SM֗}OÄVI%#fHa~uۢ?H$$ G EzCKe!Oh
syo8q9o@)ZmDG2vlK(tKPN~	pt%vq_P`kNG
Αp8A܆>W<!-6OG!m$ ̅zb`w'1G\,D9D**Yۇ397M$~ՅT 1Mm-?HKmf|AfyXT5dshfCX:68(@'?bFe`M9&/ܺH"`MnTiŰ15Xs΄)ᑨ
]Q/Ej|ʒ4Z,ĳ2dɮZ)zkﱬMp2X'AY<SgdC
p5fceZdݣrͰ|sl|)ˍEݏ\s#i5Һ^6Fֈ2VokV:G3^ $'̴q2"(jG<ʎ)NX}	p}eALwGȜlKyrE DUߊV]+@k;)>eY:ssCtbdz%&K~ [,D/`N$'z?J~pt vW{XUw*zťPQw~Gw6x_n^Iz7 E~#+TaP'JYɲnXMb*[,i\U)sK5M:bdA u^`cK{+MJSH0Ys֛蔺p-l?.2b}A*&SEB^޻6U.M,h?4Yv2s 8
zDF!Zʴ
´*ie4ɇrT΂FU5Qcl[|ߦ
q>pnmtrK;g$yVZuϫTK3\_EOa"g0300L4`͎سz $DsOG̀
>Ao<1 ĳ'<
Mœl,R.}K*ƯϦ݁Goi֔Q.(UwJST^y۽~AV:ok<g856LS᳂i$c<76VB% ,X'oo__(k#BVҗ:$b[0O θ4Y+6(5 #Ѓ6Difacxp)XBQЇP <{B5+لAA^&۫yp(̦=7wA%j/ԶfO05K\;i%Ō,aB6"LdsB'N"}H0OԸ6gNetoSir1[ht(٨?zPI>B̛b1GpOAbjRJoM̃Yjw( aԭM`6-AޛG7筊ֳlM *BB#D:95&)%g
y>757^Nx36$| 	?|GL:jft-d侭_3Bcmy&][Ui`O7Yc	(ڹ-l0fh*{W3^	:c+~Ia*{I~y>yU7pt	XY _f(wC<IP'XӐ|M]!|<ip#i1=II|Z#1踨'gZ8zuR7${ /q&qCC'5˽e]!\uԫw(ks}GY8&sjޞ"w%&nR(fʹK֫M/Dd;Ȳ;7RSX/lz[ҥ666ml7ٱA}@]*MBU_&&#QXAUIrҬ}1kީπL[P<x=]4@FKA+;8<{]6 =3-em;cҵX@UV-]'c/lݯɁxRxه4Cӭ4^+I i̳KDΙEF:9Qg,JAg%W$fk$ں@\I?nK"lg^~A=gfKn]y߈85UIF'?[ԫ^L:OS%~?ggϵ[O;`ïۀ/o|YX
IQ-P ?6;FGWI_؃0Nk	W%ҖQ dO9:Pi83Oz #򸤩Y~GQ.+6osDLL&0ܫ6})טA2/Ԍ&&ja+54~n%?OWT#w(=vFJR+Ʉ 􂻆ƅO>866ĶKٽhX&&	܂dxqL꽅$B	q3J42f`^K/@Yd4|Kc?yϻtW	\[k56twaFa"vC2,(=nvnCQ=YjG]9
rD#oSsAz\bKOOi=]<.6'0n>4̫k,04>i~ BO%\;>,/xހN9D";
9W:UR窠DC1c)!aQ) wkXϽPf5PB AVeGZ\]JlB%rb1ZЮ__Y+P5Nczç@@WC \2d(=NWVnB4xrD]|K:=.k+d$1`,;J8,Oܶ4j	Lέԥ%df.;CwUu]O{[Ouxn+Kw]lY:zL8t~On&ki r/L}ϕALURjfRsVC}e9ʧw]&*%2@ڥ͓ٴo(jڴ2<6i&MLTЗlWkTxzY$C%]Oʡ\|xÓ{kdnHَv%ni(Jsi ]Ajl5\uE*jF3_HJjnq{>p&:ՒF+.f6zMQ$M3p@N~5G>FA =21x'0OXg5v$P~Ld{{暅(ѲU3t{;6-{Ay	F59U2qCJ@o>&_{-Rd|xNّzT4ۀ*1<5|3$	EU̴yG۪kI^<tޫܢ9}wTvFgAuqs]#+;8Aʠ$WvT!׌uxp%Eqj?s<dAh3Adtȱ1CTH94ۍ4c<&D7G]36[:O]3mEZ-S1jt<NǓ1KmBxjXʨkET|p 꽁[T:)qJ?dMʴZ\d3ozexkn&3veSv<fk|iiBHE-4s0 qz#-ol/{oU;kE/݌{	&UByJ[KL۾]zNE+/ODwZ;<;m^/ʈL@Z`ozI&MXl6Oq=`iӟhaK(s<	<3]L}$!㔶.%X"t(cJ Im^Z`^u׸; q]S͓ZQCx5O݌\ZŁȹGh 19QdRUhLXi)dxGXm\"+1'%np4@'y@:44B(<km0oGjJ\JU`~բTV2BnAfT[vY~E堉.3nג z6q1qfIcߧ|0̇ÆHv4}$I/yNHKUn'pm'~^xu'Yt>wij֌\~";RYjjߎݭXצ]I!Te{l49422vt6671cY	XBBbUhzONoڟJ)PB1Cɨe营A$:<No8ִe%m #DixAs%Wa;gI;1׃?9|=yu)M!hq6+=z`2IBXcV7UaTY/ag״!GDmdDD$u6fչET!wѫiy&śZa_?_~ݡJ:啑_p0M?޻n_:mkG^C(ծ^V毪	y&vAg?}ĀoOz;*6,	PR{7u_y> Q_/^RNʼBeƟ>oDhUD+J+*B6
+S=%dJv?8>rة; zu"{k0fFLj?.d# 	#z%?-.N0b"ۦlF|{>%n.e]=0$.~%#[_-
~om7_~z[_50+hֱHuz'A̮l|jewMs$3q oPb6zc| Doo;É܀mkk?f(-eZ?@.?B="/,(C4^B`3Qztx[?8!BZcs[Lw?Nv2{דlǶ'f.?@6L7.N}^Y:'nsdapfZ٧m=@Pe_)OHW
ws0#{Xɬ쌷Z%^C#8yr-53d-q3@+v)hZ`P[| j~׋fJI}K(m!hy޷~smx]Qt?-Ne#0̞g?௎
*Χ68f@Da-#@Й
jmA03#/x_8[Y6٤s߀vkfp~r ^ȫwkm u?/7xKfvAx	?Yش	z>Eru%8LUp[xؚ0TڛF@X*)_K|/ rZ5CEـ,Z!l!H%{S݀1}1Tw!c@I?EP "k>O?lWYWv tcy:n>Ҳ01+opD%8pRAMLE8$ɤXLϛ}~CNzfT lѓʮqHtYyBɜJ6bTz`F,t/RN8z-NG©*o:g8h2Q].6:6GXOe1nY:yjt
E3QnU?'=w=ӛۃ98-Aj7 =P| BW9sNvNһ d^8L(ffJ)g&s{Θ|֬WT"5vMĳ7E h?D@h+}8s> o[-0Zh[Lr#>qQ͇ص;{poSdê0|Q`g\֎|lY߭rd&Jc%]['P\j CwŇiS4pɇMaVI$ 7%{`\pb3
S~FwYDu]#軼:*4gJ6|Ũ'20NQZm,ڇ$Xg %		`x)?PYu1|ifã| XL1FftʩA{/R.N%VHKTBӦ> 59W܁ 5Lr/laDb*^8鯒&ΡG [huMs}Hbd ٫C~{jHC,+хYK3ĝboOu餼nl{D8uZf>^͆7s46JW^&6i[d6lJ%J:.8:(=TYMn?Z2M3O_=xnSkTj:w1D|0ip<h:|hH
r6~@*[_
MVM9[g|gH)!7l
)jP?}ل4I6Z-L0mYO/ #x9XЭ3Pc-')*<zBLda Rba8'+
s<fir.!m'[cO#PZ!;z2'3_sl.[g[vNNY1QB_v>u4co߄X)"|#u6μ!\Ԫ:GѢ	z*lXpi!6g}s6v+6a5L+oі'S[ P*RC\dBrɶR"{[zviH!C?rdߩ9@̇Na*3vPy]Vއt:_.3P*?f,7Y#}M!S$՞`TލifM|,u~:eG?45o
Lat+9{|ܕǎ;>~}Q%4U(y6 ٷbg	/K&A"ɂ[2!zq#ohzE^UE7D+ؙ*?KO<8""UX썷/
x:CKNB5PbwA+!Z5nrN$:tl%\AOLUA(Z1)r86W vAG)W4Tx|y^bGG妦,S:ˋjrk䎂Rn:_5p``^N /Ut_&Kqvc.Te4aLc|"ը,|P83ZPnk=B7M8LjѲ/wR1bQmv~k댡QؙxwYLᦚACI׌ǝ_^trT^'ѝ6YRW2GSJY2lY,~ػxaXZCɦ.c +,u`a4F\#vxj~Q1]-4
!0*srhe B(&0yi?` g[ɰCz櫀YzgByB^sp Z'<X\lʜ4 ׋?G}RHiՑ!>;5$7vYW_,]v YÉ APƈ(CF;I	C8aɻrA^-A$Y. =DG×ރmQ,c=#q^/&K]ee^\>7~Ͼ\3E\{ .Kq{vl&Q}N.4_u<F2!59#B\fMx9{mXχ$L۴6@?aGcq`5iqZ3XH-d'|xHm,&Ė=Rn#/,i,&63G6	0
vu4/<N@Hd[Hr`YaB&hVgPoj}סBĈ Sc0uZO4$ƸDx;k%\*EyHijn&0[ *׃eS'	יr!CƋKD̍<_NހYF(mw3|0$DWԗ{XkDBG%!Ej&ŷ7!&.kH*S.,T溕I Qh	Sw"Ix+FaXAxq8p;D8AK遹E
<ϧ6G jRJ)%:ú*s	ڈ"(C/'Na"^),K'İSy5֜zTW3Xi{3K<y`DW!UK 5OGsA+GDƴFbvN, ^i7.oyCEgiqLVYpuO NgD%QX;a8ǵL1u){J:@^ja34uK$kgZ]p";Ng2?yRpڻ@p>059}ˬ)Q5se3V ~H'*=G5:ٞ^i"'iي58q%. 5j1iL^I%9٤4d]>8Mϧڠ06}9&I+Ϫ@"ŤLgtA{1R{e#q{WR˹+^L1;rBSs'U3d03D{ե@HG'Y f*EO$1m@2$Kw8!="nr~ߔ^UR0 Kl)$ξPf~9/
Ιg:u&AqqKZ:^.-i5ְ91$.Lv/$Lhd0|O
iNZ|ɷFӻIYSǹNX$ʱD2lzXxEÿ'8*U[/+-d]:@>LՏ6\=EJ`ʊQ_	s;+`Y\g$0JFJTN]^Úo'6OS<09#GP]&~`QwE *525[|ZpӳO
t Q<b&2BBsCld.Ѭ;Rħp2D̯P|,+n[G-ˮkX7 K7$мkƜC^
MG{KMw,{gBޒ֞{,3v>3PTTJ]MؖFQTѬw=O(A<#LuTXPJR`.-n3	P.]$f{2XhYM:gDc	W8b.ݙ̔T.ENց%u;5g
}{1': 3:<>;yrwoI&hӭ,P\08c$M`[&ujHLܻwoO3reOg"Fok쒶[).=JoV>. ]3WyjqV籭W3xf@q,^$<oQ`>YE> OFQ"Xx)K}Mi9}h;К~@#o77=ĂYYC|f.*^JQ쇰	Mf0=F	|E4,+ԗN@֟ VX]G1@A	á7M,AxMdIneo 
T)uĀm8@NMUSY*))6g""stkRdQ]QE@tm\@0c0˥}O&F(cz*Ϊu[!
>xx>f3"?_2&e=\feYob:d<mwo07|oOkWzH(ڎS tY׫lk3w0X+4@O=!75#;ߐC?>
a)jw'5*
pT3֑N(ʾ=*:ΡpIS4lK7'̐J(JKMIF(؃zfEzAarcHXM]Lm885$UNw AGAuI>l3{漒ncǤh8Ȗ@kZpøn=0!*x<z=0HQ Yߟs/8oΧ(Lc#v)t{joDp0Yie3Jly(I&XJ=Ilx&TKJz.uٿ[?Eě1$qj Vm6*D;p"| y'svX;6o7Pjja|nRur|T``	pjPV9Wv-_8+rc=m1~,gt<B$L<LQ>4,8ʺ[	m˽Q8b$bz!nъI`_hŽqq.kfLoqvxx$"MUM([5,%oN%fKf Tb)@mS֡1,Y^0>GdLBFP0Q-x\ϔF䬿#/1-6R\ضp4-*ׄ3QvSiz2\,VbdqDaOAϵAڪQayaI\[k.:4$4ٻBCs.07J`PomT$׍%y3%lȳ(ȟ ~wWe7y>.˫Y]%EzU	[tFOo<SN#RNJZK)̝9`
иbf"qZD6u"4X'a0m1g^F'_7*5MA?e:pH۩̔WKHwM"2/1T?/O{toy7K	f=P04a;|bXdK_eBBP,?~@)|cC$XMB@
s{Nwm#jH~|p	3#v;g5,z0gbqmXkS8;!1ɖX+#l퍍"گv3ۚc~n]6\	ݛZb4>Qd%ʹa(@K3KDR$ErLAɸByHHF, t|jQ)t7$>}8JeCRim,#iM-Ǎ[!˘|1ُ5DD
12^I='UGqLD>ts΁^vLd3[zN `SQ_t׈Vw-%p_<DH_Bz!&)V5ŔH%$p(YׯOz7%^:&݈[!&RI*x3+xxV[0Owqh|:`cz50lbXElCsVwL8|%Э]%m71Ňr>|Ą:sp36R+
(G7E%n^ՌClS젆Y6A4펗® wAtjk*5O9į$^.
d;Us}S0Vpβ׽O>=8~ϧz)6\_ճ(QJ`mٰ#dS J:/lU	W3t0$fD{Ƚݛ=k,a
" @5@љziL]
)hf^`4C(kE@@c+9{iE~\$]R c;p=˧%ܠ.,:mAי#Kr:ϮOkH8Iˌ{"e{&B6Ӓ3ư S"گ$w٫#'
=j>9fu3s3j(k =+>3[
{l)/T+j?WMo}-Oc{ }y8v?zgKᡜf+d/~"J,Y(@ YH/v>܌r`.<j,YGj{yKQq$.*j\ü94}cJ	Snj<x5a	ZfCCkxTW$10':׮16萐|`7HTZ
١Nv'?o|C/5̦uuEJ|a7~~0:6rq(b[٫{ٓ1aj¶m}uHŶ Y@ξٍߙ#4,C`Uh
s	2M~v	#HW-D98?lW1,7-,
ÌiT쇑D')tp+G%&Fc^P׀VW^=K0@Y_}C!xmO{ ΂FRWuM	%p"xo>RA;^	H=o?@	K(yʘԔtCn#4=435VI|쭁Q\>:i[l"PngRzDфC~u%'y^>iwCDo*kG?_}śnՓrt
s7jxrI@9d%,vqӝRUj (w)Ğyl>d	&vUy-ÄGN<~	73ЮxiGʪZ2wJO;9eVLۉ6q%lf<Psx#0bhrr7)P4$d6RmG	;uA$~#!D!
$rxIkOlu`y#7f$ȟZ͵bz0ew<fN/,f쿽f";u%Dte=H67Gzo# )W]6%mhY9p+2VQm݁b8l9%fPMѱCTjoxOSMQ?ܻAx*Bb4Fl%~}1l<#tiVwf KNuYs'2H/{1gȆ>oj>q^7t)<Sa$s?]Gs}b%PJBϠ_Z(/k*ܭq+9)i6ɯS}aOmpR;׻6+5һj4اFxo/T`e(:ZL15_dE=nm; e0Sj}zbA]
WũH.
nw!ܪ5bƛtF$?<_oHBjd椒HMxÓ:f-&mPuXo	N)Fjn?AZX"]}s/q:0ӂa*1yd%pM׆FWE
 sJZIW&ӕ!
9q\LYؖ,N9kYo1 DXyYNنC9_Ѣ'G}wLG2Up(g]8{T]ݗ6 U4X s2Mv
]t:u_ڑF5""dv 9qC|7&t׮(Jry4L3ߚ0WZ7-M	*v@j6kR-pl55A`no`	a652#\QzTv0s'3:aᖆx[\yӯ܇߿O_+Ȯ4NB{;jQYGt\[L@"FyEd9D"w+&ʜ)0#[dc>lf"vP:)A&iun!2In8MF;,Ida3T|%Iz75%Xh7t	J}:~[tmsId:xF'oOzxW_~_|(^)w*wQ%	V&D-֒w~܇vwS{dSk_>{wEV	3q<^ДY],fHpf4EGL?Ӎ[7E*Z}(B/믾%^e Aey^hЫi`t))xŅ7! /Թxf^'~wJWim^xRf3O\4GM^]!nmZQdT~VI:%0x%aӯ 	(ǉlàMaLg|TT<awy)>t5|j¢RگqnF9j+|G!ݪGAKxLUQ>O޳ϹZWyYYJ) y Ac1-/hd։L5@7SU9P~eS>$7wEb90uxV&ds{{|xrB`뒀0ܰ<x뷬7Ƕtӓ,0
u) B(_ؑ6C[#a T^Iy]) pmFt>N{4uT[R5Fb5k<{j|nfzg__os}SMƠw1ܠ
`#Λ-#c[&뽧m5	ClCh%۞caYbsI'~.}\Yi?UksS{%2쎐E;`U|B%or6BNH֍j>Ƴf2D{CǙoV/9=pXAYמJS(D^Kr{WqBt2Rb`uWE>5;ޣ]! Y^ǧt^ƥzνUQ;uV&Nvph禔t͔p3d(E98ad;ʋqHt8bn')tqZnӚiP1X,*QֱZtV퟽t/DRyTME}<O=z ˖wP$]Gr/q&fG	:@̔/{o#A)e`b7vkMgvYF.&{쟞 >ihm{H't-s9sv#<٣gҫ2-5+FLDA"X &$JنmL`8j<^X~?|k6}O
mZQׄ]v	{'/3DtGl-+)ì·dK6'1'! ӳ5yGF֕:FT	EQQ\P"گ*=0;duE7:Cd0خnPc7݁C_o@Y0 #f	)__"~хqjJ~h%=~C^(ۯ?fi<[<pUMc'L-jWw׿ovڀCkqF0.&kD=oY+C"o2x?/L8jnm먪3@,A`ن:ipM;H|hfO56<vyfB
U(hoܠ1ғ_jpL&x1Ɔ~d^T82">uճb䃖o8hPN,Gw?xw>OCeB-sf5=+ⷬ%讕rviKVsUDXj.rH+7kh>-9><~	`M^r0_=#g:&N92,%0^RfAZjMm#kg\=pF	*lBsxLW5CLGRJjR ,Mnj*pz&%`#Җu?%yG8.0^]Yq~GZw7Tu2uz%Qj66~؅WV	]3Ҹ	jTQ}kVx17Q&LQdI3f1t۽=#iԳHsH0q
G0x*5oO6fX?afewG.øۋm]F!)D]>EE@%[%j4N_9omX&W/!߇bBtP4]X3~\f>zZ[z08/6K3klaq9s	b"as	0Y:KF}Jtx;:w~풜G\豆1fc*l^2[-_@b_`:I еڍ!{T3ߘY6ȇp@RM'U2X
;DBSdEA}ь;gOPj#ukTӱzoimՃW=xD{<ߵ=RMcZKQSn<SDG~ZG{˲oL{|cl.8~$㷚K9X=
8R&X#.5bG"i!-N!˪&	&ֵ7?9=a#oCH7.{ܒqi۽CiˎU%B	I 4c^$M(#:&w"i`=D]g'sl`ܭ\Q=n|Y_Zـ-90&fb]P!4W@a^9_ClܔaDҀCvk;q>qvڛ~ksQYJ!%@;5釔a[r]Yc$I~LU>4,?x<h|~kXnrFFi0lÇ4>AeCePA0/ǡ	bļXY-l$/r߷$9Ba!M<d5Kl Ks{uZ{)"Ն3ۨhD#dzY-ɷ{713Dgc7G;4Yu!KpW8ǍG(e5(-r	)$RƯNաvdIT߰K0
/o{=;986`YݦG'(kB12;L5~>^ѳn&zƛt.>MkLG$u2Oߞ5)wzx}3|<;;В}w˴~*r9)bj+k%gf comxXhnBHY>DYqGRru7@  s!3BOe$_]ޱ(HTKƢmxC͊N(95ʅ(uO!;BĊ:!tU#96kAOnHH	lr.S[yP~֙vS旋쫈뎶{ZC,لI$Rx9wmD%$(k5)N k2[G7I%}Ki+f/XeXk?m:wDL^HoI=U)y	x=Wב=>6_I8ػcZz~~nv՘'5_eEvN`+j8i;el>c~)ؓ|>k-A)XID*ޒM~I^U,W̬H"40iAIz$e̅ajHށ9xaoD? ҋ.<߿sdewf@>k0V!6mEH3sX`3# \D8CJMˋ煴s
aɍ_t,o	KH	'5Ĉ)v'\cI 	#,w8Ƽ{f#u$ %ǿ&R@$Bq)̳CCNYHD4!1Z7ffdIx{\),a,Oq#ow]$aƙGGB9f[}WaPba$`hqO˿T/PHIPٙ
?B.ȎTAfZ丸hKnSH"nK
	%,g0<Df:Id$b8 TrL	͔ISLg2UshpW!Y֋RZSmC`b ,T!xiTR| -b5tnoX,xkR݅9/p/PܙOSn/B(8 ňz>ϼ,S3	\S|!s*X~[؞+O7k27#ԎT@hRN57NB'qG0bZA`YڹѶUu1VKh /1I Q$Vo*FMl%E`'-ޡSuNA&n=*(Knցe"z,6ߴ]+{2}WԔBPU7dyM`8M(QҰPwD*[7C0:WD^Sh m0 '  gZțHi)B*K.sҖzFw;h!1l9Ҏ4pAe5
X,n|u4<gϐ6Q[»Zhvభ9VV`X#ʈ tFyuʬo4!:<] ?p:AW4`u)3 5Lb	W?E@'t@e굀\$A6̈S <?B	0(̧HC'w
OK:{eES52fxDu pF0l.{4BSI N<Wz0@z@݂ly{:7TolO 6#^YڮƋ 
:)?~񂟻9gzY]f$+7y¡\(Xf,}C>٤""ZQJ	7O_Xw{ѯ' !*0_(F$:_I0xx1?W}y(AR*=jvc̓u錦'1;QYy0{r-fo"XW;rYxbqxN(	),%)dRS&{eR:]~bޔ	]ۣWN~vNS+$֎M5Deǝe?9,	6PE78d̷8"5VQj`ۤȒÚbpg4!bBơg,&ȩ'Kd/3]N^^AqD|sƓ-Cfy%+p<JҖ 	n6L`#jYQͺnӘ&3A``Bd<"txS뜿ЖXAGԜ/^dNnݭeC-ק?UA|4{r>^uAW݇_=wN^xt(|Y`kiB!E "KtXHcA2^t4ֶ$K
DS5e5W6Kw)&w'að`YE*σiF>RD\Ü7rJ&OyԬlY<d_UyΤMokۑ(TW;GWҌh!}EXK~r#;-综:!Lj{ۥ"9͍/OgfUB~}O}bX䣙o#|XQNeM .	H'0nɹv1Q^@ 1&$νA!Vg˭r^<3D"IzJN-ImtcVL?O\x~%9$zE>̬=aII1dvJ8P?FL
~w~JЗP5h
`Ugte߼E@Ϋm9vɶ'`5}ÉH^S5A'V?x$dG-j,`:TLMPa}(&-)d\#["ll="
sa^)0cVT0HDMIzq4^)ǳBrq@<2ⷭo0^obڛ~KR)R gZ~Sd%y}^9޲Ӯ~[fAc8ЋPg+k	!{!CJ"5ڂ^ɰZ?qbTa5/,E5WCUl,6)XHܣ1sgY{דA4\sTKHd63{	ԡx94L;.->&	3/Lfsh^x^e\ÆX

o"hI~ړ'CrA<~f{ֻ]I/p3TtLf3u&p;ήs@,R|VcaZу( ,lX~Dky4%k!]rgz'^2~ frpFuY	Vadª^BC6|/JVI+b<[b(ۨ9y>C[2Gz^SyLwn[m:}0XLx[h2?9@]V.:p=Ԉ2^zwڪ9`aZ)s~ '6WkheyxWQJFʾ5R#M"d!ADKaB(]+"R6wͦ%jY(l+YV&9yP8kr61s=c3[" ͊$B3҇ǝ/Y	ꀶ)b_9C"&3ĮTx˩U^ߺrXzaG 7_=كnR˫6L17s \i:`LkaTbgCM~Uǰ݂*VT}f|&sf4.֬вq]Zj@!O=vxUt $y\	x@ШߠWȽ'Oux~I6K;(<C3={\y.c:w5pw=Xщn\W:aoH
Nﵘ!՘ 횛1I3x%`d|->`XccYQ 4pwG;/u҂vE胚-C@Jol;T成f^ѵ|xmu^st
|Ɓv}m%Jo^)nr^hS1͖WHESx~]TNx!DN<逶k]\5!U+4q$\2Z4:ϑufET9xHQ$Dh=xC4x&޿\y1PCo8ы5L7堨l"oZwp5kv+ܴ쪢rR?ǚX|XwgV@G;Dm8%!6ʴR,vh&a87q{܃@OYYAfd˖g#I8O-e '_`<vq0$L$Ty/i|uŚ	
=dx6o0/ӥ\%ErYpPϯภhx,s:Baf#pnIh̟
|>
7.>xqlD1Cǿ'4T[jvex)q.~,zpnsE[\r#h["5$r&:. (6:k	5<ų.zAa
+sA8Ax1lCNXrZ^ˊHu
6B9M^5M%8Jj~bv|>#$r&%l7Y~Nr>_|ܐEi2P}yW'?5UipgkӲIf/>f7Dk\ a|Te5uG6믻]8dC8~X$Gny"KYA&o}10hGXs42 ¾,neNmjZsPv\l\C߷kIE/+ddͧ0؟3@VOߞ!r%42wm*O98wUF9)D\a6zC͂uČ CyA&n5d/w6ݻ{aj@C;$MyS0OIT.FNP(pΘ?g;lnJian 詢2[H썘,Xȴ_cst&ȝﰫl^`fa(Z,'@37K 8;WiQIf&@CFb¤s7*Hix)Kz{[/#xQ$oz8*5|vM@")mCý|\K_=]BOZMjUB Z>* ֯DuD(\RK2gBTLHhԅߦVu[0	XHO}땷1##;QI#_ 8>Ts]f:ϲ#XOZo# fj`.-9z=_o׍
E~:Bׄ1 ;gx$L8vN䯰F 46eq-M=GBԊBcFqsQǂp6;, sYoOA_޲B`Pe	616効\fa~\8UIqx\Yinǟ|vS{1
4cl8i\9^CA@H<m_JqB>\h91BJ37	6n;Gد};@x+>Flv-M%;}#=v_;VǱt#DLcq.SW/T.0}{Eäyqܑ"/A5 sUH5kȁRbfJnךe;cLS;; ,-0r\NŠT5fTo@ͅ8-T	E`A'˂ `(@wΛ^ͩxhɖÇ@ &2p =;Bta2	lGG9d{?vmVk-X+')U^#8o0TryɎa 珚Le[nkNW/"'0N&M5RI1	Ju,<Qnlc	f_'/v%͑҆wҖ5DD9Y`O9t=^}BLLEd]ۂ-1C<<nLɱ@xCP
;YL:x&Q{W4u~"#l,)7W|.Bm=&i+LGnCN/vx%/B5BgP#rah-,z|k"!;o 9V՘s;n}c&Z$Lybr~$79d7Z6C
d!mVl_V"4o"7}1Ex%_]e#yGk堦0+6h Yq[\0X!%P'b+KS!2"xQO`xtbʪ-Ja;ޫ)L)_JK96T)J_kI#bR9`@#i5cbӰ;R.]
0HyYL1Xnz992T)i$lb\-yD%<hр}$N}M{ktXG^twZ#?Auۙp5L rG4A"K8K5y$15/nSu݆DeZo&ӻpr\	YHC UFp9mMٛ/L!
3CPIGnӌc8:W-0aSyY`?R_uz⣓j4).f
X!o	g=٧?Pk#I?Cb8yaB1D0ҁ~ߞPn0aj~7|J  XQK64u9ilHİH#G paݠgQ+:0e6jh,Eڗ-m&8Mjӭr2+-g"5.,yiTɟPfm0ZC&K\Q-n
R+9	/I	9=W1/_,&3Zu ;PDKXPD[Ɠ[Y㫦
 S_eat5/F4fqfDcRIm+NHDH V3S Ѓ?XG,;SԺ4ʋ4{2m@R_l<d/O4͠.gÐ|S(Q+s^ i幑x?j8ͅǄɱ4ko!&92YGcte|mY ;4+OMɭ:x`EVX|]`r3R/\ۗ_f>nN7}NL 2P *w0OPAA^.q/[o4&c/!;׭s:>F3΂Fu+Ls#f`U>TO{pne2qA>q:&܇G/
D"Ynn/>}oܨ*A]ӣN{dt|Z`wb83
]%zS[TdJ,~C#iOe:>f3@WHzu?Fza^U'|8 0(|:[au7ɅSV	e4L
FX@NL|XG,rBݺ_\d>a&SVF	WO417ߺ?iOٳO)JdSeqEpܲ­W9TG~
63@$O7pfj!hY~:Cc1@aiIq3J$Qf25܎И}-a0ʔsןu0AC0 Ȅw{j@N>vy*mxH, Yx(wL]}!f?]V.]3o4C&dwF2 Tk<C41͙tAӲ2/3Zv顽]Z3\]z!4}FPO)6<m!<&,?>^gtD<,^ mKm:]p`xᠽ$)8H0nP
2&)Q^6,hqu/ ǉєǇF4ScaG,ui-NpT=gwk	?A;]1uZ7}1mRQiti$̜gytN"ԓ`̥FABikrZbrG7c;QXGʜ =|n$d{#nv0P̅`uhtH8$sdSm	&9'+B8]]N\&Ç*JF/ p^tfr#L p)LAh.)0ӿ%L<M[j~2h5#f23䥻Π&>ΩL$D|!>+JskG']'aG&4JF:>#p_]Yxј$x8ȀiQy^feXxjP%RmuocȰtB\FlHȽ,fMC*̻]=Þ{&]v@	{1GV\ۺrG@y(QjGjq^G> u7
uT`|V򅃳KqaUٛF\IF]!e&_dVvsaYX|
".8rIr񄳒uU@%PR3;jYFs=)/)P2N*$hS;{9{eV{=0羽= h6%ic-;:iƆ#k_wiï^DYW药u(9jFJeO$DJja;KFXx뷲R]SmkƏy5+A4-rɍ`h8PwNnbu5(F~Ws3!)Kw7w+ۭr:$<ypΩ^dejkƛ2(<5u'yI$,ܩČ:vĜ+D}8㸐)I-bL`m)1ݮSxR>Kĥ	횽9n=zzH`f]GwNh1ܐ<OB;LvW M6t۴P]k9Lw0
E,*R<.sS#.T~_QKJ=в[kWr==gNr^>pGN}^>lٖb{n>	}I.t5l3'0϶;Pp ?Hpgg'o_=y9Yc2G貺'"-Sk'"4RRzկ~,O׀܏.eէCdS̤%/́7B?Yi`n-؟$*JF2RJTOExs9U%g.y+CX}HlBD(T;IsxJ.6Oѫ"%.rEdD2}rz9&^^J	]NJF	WozΦ(n)y%>}c+q@30>.n3ḳ\ۅpT rO{\pd̿	\4 Q>ߐ(`;yRhݰIi#X2Sc.Pgg̞P!;Zp|hqg]qpӮ>{xvÃ7IB:{r$!F	D3e'xP,@uPW?.5dx?z[Z0ǃq).|fe3S?G+ꤳ19Z0}qq.θ)4΂BmZT(Mfr(0p{d;90u	ȬOm֐7b'P){¶N)OJ.
&/2B^7J>疕-F68tu{xdzб}mOC^Dv+?nDJ.$M	z٦['+o}Ws 0PׯYw(t0aw#KK1'?y)h_5?Ĵ'⻼:HwtۯM?5⯘k4 <wǻg;f绖$b*_ԏd7hB&҈((4:B&	9'zJpGȇ`-^<$8ђ po5-Eܶe;'f]͇C֭9>~C'^%")0؛pO{.̕FaKAUu36e~|3)DP[7uYPK*1b3뛝_~h<۴on>}S-Yyw?8<Xvsm`![^ K'ylCB2@ݦA]I]kZgG@^^_g;;?Ĝ"2E~y	';g֬ 8闪Cv8ߝ&2.aWAe,}6gwB^i!dOY0cfG(┣]Ϸ'mcPj`E3lsLKAF&6FS@ŷ_Fɰ/P(BUݸrxd		43.3:*@aS4HYww
jZMQTڪtALaOm@=0Fz@nm#hYciug[O3YW$mN)\'%,U`гv\j9}+k)6@V5֋.*f HyC9^Gߗ|.ë59\poǀi3=j<Yp%j0O{3;TÉsfxHlvO3O!/xa@IZ!&1˗~OT/:[Ap%vw@0O
ȶ\5''5rn<ߟ{)'Y<狵ģ4 -W:eey^Mcn#{TIjʫM縐hN ek>$.n
^q@Jm@5@gfK̲o4^TA J&Z]4g'[+Wkά6w{*T>hAG F	w5N#$^oqh|i#eQLmc@5Nz;ǻq41yd
Yk)y]C
co'>6ͺ\
W1 XK`1ÎV9g'kA,9W, >Zm1n?i=7z{w!4&Ub5f~aOd:Fѕ 
y4`\|<h#`M;;{8LL1Bp xp.Tr#M`_&pTj^quϜZ=WЀ\4$v|yp;%bAXPS1@(>vxz G?ޯ"𶤀8܀ȶ\d9`77=&*F1N#=କ"dq>41ssVFhĖϯm#f7"Q6@6cLv|_bBywߍڄbM/Y@ϕ"A{l椻{ىŕsfo)^\RP]МavŎKL+LqXGj󑶵ԓ,t^\䌥7\'sZE_%VYt*psy2fetNkAuC*KtpF𸫭t۬*\3L\!^._44 ]ũ|bw8؝ļH? +PcMr0XVbF)sC?Ҝ5]?xK'tiQN7hꞠ94.@$4,fskB gMv3^d~`&Q4#.INp82fI/G@Ul(xF;Y97ͶaT^SnKdXwkNL4ӵMtv4r7)袘p:aWܙc1t`??^t5断+7KTbO'^F=̩/[{A]-TN$vJg޽1UU)J&E%jUzeu 7=*#l(B)%_p=8$db{I ]DLg͙z0{LpkN]2:V[%x T5Br5(qtDl9둺W	\3"6x
jlQF^3WSyQ>^3LeUt844)UW/{2\qh(ͮ	{Ɓtk_kbIoaQ'N4,o|F3m^ i/S-HB#Y~6;<љoo<4` kp͆5u)[& z2Q>`	¿ѰCD*mFm@-
F84tr7_́s9*_^1<bX^ҝK;iL.a<8 Ax3rhGNJ\K\>ť-2>beRM Q'Sҫv3y'hzs42Ҝ, ͆\9`Xx{&v07:̆	K'AelJGH=.<F:x1(c5? 4C9 TPJΦ@YqƄp9[PGDR
 4nrNR2c$SXPt8	usl:{ !Km:K0=87*ͧϐWTvyVJ
v?:>흀X[P(	P鳙r^@3i]1L1ưScUI=Jlņ
0gm2<6gSJ e	m&ѝ*$f}#MKДlbJ8!	dPgqoZ٫IvTnJ].Sߠ
/RZI;5hKgqDpCuGdD~ YL%iڕV0fHւ-IOϙy2@0)-[Eϲ-fAHNNTT^R=.xj+pl,WQ)YmZ<"ױ%Q`hD@B&rw%d~rIԱhF杯h%g2uѬ2b;O;+_6zv{<vZVH5g4l:'i:fh8{붑=vQc71jtOڂqSpU_PzjwZjǁ܏nT	<vxC[.l1	$CmoD 
6W(Ɂw{/dg+m[UT~S75Z#Jlj}>1=sK@؏˫6u6d01+(3졌>oנ&@AR^9{/3KE2T`"coN.&(/ŷS#$Gvp1/g?ъs?09zaYIiP"xb;OY~
\3lkrtYC13ݗ'v>e_@Yrg<.6])mWEyZk$[ˢxQ]ꕋBdzja82B2Uƭ	 D9匧ݶ|#SRA ކWr ߏRK(םVm/r	%qNq2dmY5TF0rr^Y.N[]"me<H昍Gh@2AZ&4\-m5`CRf8j	,4QnfpM9fvz wTu+*Ú9)#j|WP"37&5\Ye*s岅W"٥c#Ȧ%s𼂪B=
$NAERq`,֯_*Ӱ+q\ xHZQqd/mtFG	B(%Jr|~pM݈]%xAI̟u@1o}c锏/.Nl?.o7//M[ջ&$ԍPQpRv3b֤Y~_CkB2}W\X|bW͆)%
n{Vyd1߫?@)V9eMMfT<~Z0>,?ON+JЦmIKt#hB)_O!H`wpڰ3ԭ1m] -aCYPVgO&r@ Z;̉z7]/"5+TrW8i=tXZ(iN83s	Aqgf%ec͞JWMN
=DsmsI5S>qm^Z)mz:4Σa>jXݝbOMwnB 8sF<n$e	'Kʡb'@yBD^#^n?c
v??H6;kM[]ڤNǼ{%#"ZS?).M3Jdȩ2aDausN	8]|2iy{*_#9}&ܓW<Ex\d:2j偄$iʈ8M]* LjSa	IZX,(0t阻؆}O\Pr |[h^Xp~qOy4ge|L$[,OOЬ74B"%skb>ؽ <kY߬#1}ӎ \f4ߺ`^xkCNҰB'htID@oyvc3{9^ GPav\Pq!}5{aBnR(ع9hg [^@F8I)YIb>^L0ŝsֿESC#=S6iۼLS3FzcmVlP5-5+utKVfNpf4+ܶ(\C/b	(cmS64I	h/_|++-k0Y
ǒM(dUp(WRn y2шoʜzd|@<97itx贿@M9izֻDd Fm3Eq[J1ܩ|Ci5~5[9Syc`AG)U2%3TSWe1fװw/ yZ)	[+0D1\r1nJsmQ4dqaLϔX4ŧLqteEe1Rϲ/TA^aVӁ#+WE{&zAj:y}$rjAu^5^hetZ?-Uhz+1éSwg*gP*MC|-K5ܔRgFs5r)ÀU}OI&)6G~h:>[h0*J'*ċ9s.Ck ;셰FBؒL1/@R1'6x;fN^e3@Gݾ)hacxD8ýWζ^^Ԓ$REy/-[Zdb0$58N|㷧T@A_MIiU@7HO=L)A
gݪkf{8mMuxcSт,BX Xq	[tEvh/\Ǡ
,af^_OO<9j.2 O,M\X{m0."&"Lz3^A ɤWFڢWq6(FxHxtE%TUm8e=>6T|B7ʱ0>\+j\.ËP P@UMJrWuskEϩ%WөR8@Gr44ƺ(g̵=@NpzDܒ+Fa7{{;G劶h@NkΑaw@7jʳ]6LwX281XPa]QfLHZCd1E]$զ(,V aͪyôP9@b4h[KQA+? BfYj
-pk|-sx4,g~IYEd4efJI7?[Qϖ wIz)&<_% 8ڲ!'A_Q#d*n ٪frr{lNjZ`+{_}஠<
mMЈCS|&Apoa4Z(
FĿcf2L6įVhe:tj<Nk<}aIGs3qؗJ";FD
>˫G{]NXᝄ_F1R>%{ZۮnB4W7miN(EHbZNɉ@xz41`zAf-]ŭ]ٰnWDn
ȥLy)K0h>_bڻ	cxN$"޿ yG*r+csFiy{'ɾ/P32o5zٳVE|WԞ1ѥ-df0:#pBK+ho[)J`t:xp23C5DΦʳMG͎nKgBV$ө=cu:c(*Yh	Eq|S~	|mYVW{
3}q$Bue-::,,՛֌TBq+IMO\;;}/mY4yH
G~((QoُvryR)|wɗ@X^m˳ME(kWsKGӋIZ1hI+@==<ރo)R34u߽3;1ъ`U
Umx*VT^~n[G-tU_;zU?2^#MEL#'xi_s;2lMUffu!!FN!@POk25b'$ |:}/(T僛Pe4sA`:̰G#Ŏ$DQd2Yx{ogi=grpng:xie#%.tAA&33GǍQyt+7zu"S\@JPLk'zzq"zLIC/:~$Y!M5S3 4DuWë(TfӏIe6Qa3dR!lb7h%q4攲Xa.zFD3{[?SM/wDl-b 
q%TSv9KAUU"'N5"'m ѴΧw?wer\NJ(Xgw :ȭr|`YMO;|NW/`Lwtv
|ű"*/BGFMժll#ئLH+|2w=.{ bo"`]t'.@qBJQ`_VԬ"w#$eVv='.l[a3U)PvLZ%DBMU;FU>)fG_"	;3.0xzEW;ozP?f,'|e8ҞtJKq>݈~\+2~?mжw Wa(5Pڀ_TtIFr͐d/3Iqu>|O}3bD,F?> h'$X9xM8_OM	lqFĚ ~?m|ФRW#7̔4;0o~177o]~킟2])V.Xr:G$sŴ#ҥ5	FR?k|t(D@a̞vՄ ܪf{&!p Wdfr	z2_}T3 c^ǛK ˗0 O#X\KOs+SbEЪ	&U0b֐.ْ')E[$Ajڀ0AB#=4ⶵfӴossv?DJU'G<í㡦|t~
B,6ϋ*OVKɜې <@/0 
-R@;;@{B_͌XK!򮿉l7J|k)p\S@6<m, XՒF,S/Gi2(,X&~_i~AFeG9B=롳Q Z=.~fWTfLX09a-;fWV/;6[`z!ot"XRyy OI;KV7ȦP4(;דBk%u%iS3IAa})	A. lnLmKuv[IVri%2ey(۩幝#"9;|g'}svHӆz9F4[=iDyB݂v}x;{B_xDByJ4j1<56DˏF|tD6.b]XFZJ&2y86_f˲K0/aִu&$lNwkR)6v4;2%tnKI5S([*ߦwa^|6]*v8۳R䕕3X<4QGBvmk6'l @G]p G;ow~gfv
u1Gi `!r@)	#?ײCI2(9+-f3#xҒ:k`ir"6!۪S(|-':+hGlOA9<@pVfbRXPCX>fpzQ }&̗;Ic²b:L	}_8`ߖP>6G<MpX!8󠋣JC	:3.S0HòLÍ+Y\L~5\:ְ۫r`P#=`&R&L˜y18l9kA0D.x!1zt0F(Ӹo<ug	TRZ:QtڮɈp&ysTLmFY@`Ijnlft_/ȳlH@tҢRy^7#HN8G㩗n,l-+V\~O-qQA"!7޴"ͩ& T/Af:->kl4hbSiVef/*yz^O(wWV!BC#>9&gK8YU4*%&+8E497տw*mmv}Q! 2shnx8uQ\~$#=h 61ϣ_^t~E;ZQ_\?l{>	=#S;8
--h}y!iҽ#ώ0;eͩXdOl󌺺	]5B>AK=ZJn)9;kۼO${5\	Ƶna@ 	xJ[,ʘ-nMPaߟVO[ed/^`wa/^Gq=`)0SZh
Uq1!?0Bq=f3h{4u<)ٙ7ȊT)	mM(/3o?	?b?җه6^["FS8a acKZ)$[R.GNӓ(Xc$DY6.Fߌ,w7*gB\ly[˧ûùѢ1f#㽿=uaK^+.9M狙($JO5ʽƍaNMB9^mqy7[.>`[o11Cy+;o!sYrߝWȻ6%Uz>c"l;lJgQsPjqwq;,S6p܌dl0d79J BѺR9'3ݠiE#˃B9HYjEqevP?E{ܝho1h<ǜ}x+U$[͸H%)@/dBf\7{Ju9]Ser,fU
׈=SNk\^6+%;uuԂ^7mi:]j˶. x_Yx	F^V*}%`\rSӨU,0Jasn},'ɯ
Q+V*Sd$Ɣ~W,eG{_|;98=9,/OW~4뚞|p5͆c"lEY0.T	ټcѸj7qORuRo6 rKFx|
OS/{S	2rteVoǍy#jZQG^﫼=\Ow?שhO{/Y=DrٓP̴rO壎uSBQvཿ<#]֐~8P:H\LJc\ @t~GgAH팱f%␕J-Q*f
(&^*Xg#4/KAΛ*e|tDqE< T}@n[m+͡u:4Eo<pQъvTFȋZO
tas%M],2fOPens x<2DL@m!+Sc&YT43+Q#tv6֊nqȵDh73-=c@9ԢM>@XU F"feZQRH ' Thp*RTS2g?jTua{5B#ZQ{q%)bl]v//eh?/fo	] u5k	} dCda ,jВy@b/)7#jBbfu|,	cc6ZEC޹JT:\m7SyF (<P^`PH	^H^ruq;aȫ|+1ertw'wzspvOΟ"]bn1Oț7~$S/T>; 90$Bʩ3TPܝwս8O~ԵAklf<WWOajD}bNfQ8}N*.9非goDi_/LQ8
'0iAȅJ"¨^siW4^ 8K62؞1!~FA?$~°mg^8ӃVͯ,oĸ>%B5kX^*H~mO/|en2}Nhb	/[P|t.fl#<]&fFnx
XL:!:l'77Gmh)e׽+ūL!3RaUOt3mzKvUh)mB+]\"F;3BCm9Cx dDD=ݴ2*D֒jW^cy6&-^x.bX#UY("QٝtΜP@b0z4tl}=ϓ=.!ͭ{5ɷ6;d]sy콑eu1k+ܑ*h|zA(	͓!l椅<C(	(b0wTSk~7Cx<@	X2f N^F{ DK¬kKu[9
Tt!:PhS5pn:mh~wFP=|s<;؉A@x|@{ܘ:m!MIȆP>xpqT.5C@Am)huFZ+Glp	9G)?AW|ʁ~hqAڄqez˴V6hee+,oR'G&Y7? h&qs|ڇT8n*t`Y=+܇5
|	^Hf@82^fp&KzARkNf/)Ѐr,,,A52T/0U&w^R.36`MQSWr[[fdpHIgOlpv[ā2 뻝͙_a84'W߭il`׺,N+|.w{8FQM'KA!CNP~Q]ЋI	'ѐ 5	[Hg{
x̱|:äqRSgǅy#?I_]MfdK%Q #ofɯmAa]Qy9ku@98a;EAm腽(cHJZ(Gby5A^wvq-\Qy(=/SM^>YPkbĉcHpĐ#ca^wƜz{d)& {N;=ġ䁶wmEP1'+1)26$ࣜ
4ytpOL˟UQ519@R{ۙ+φT3#@M8F|!όg\֐;l	D xG
> i~gޖx@	Lrĝ󲋩!NM0
(F7ŠWvZ[ʿO;ֆa/~Qa62w,xU5(ўFҶfPk ډ\O}JpAR_ln5UWnBBvmOӠ墆	mnEEn]N񦟕ACyq	7cدmv4֕$7mC,36wz>1B; :"{"6zk٫ܖ2/N7kl]qe"qUn"޲f2H߰r>Ũ*gYb~]AJqȬҰhؿE>h ǖ2{?;W0Z%x8zʰoV()]9ɑѸFO;C@g}^ρGIQ+Z%ʐk2
in*G9(9&GdCE;۱!AzhMz)Aΐ+Et\3w2UU5O^F,̂x.4CRCd@*]åwGAQQv]I |	))lJ-'1`@XαOiRD+@tIw;<|{*;:^h
Fo{mwrP=V!LFhEG0R1enͽKO$p%dktGIiڇZILbi)-F-ٓU5A + qU2WkņSџ~"Mvg7qvW-U|(='SʯͪsfZn`#htF q 3L^4AQ[gr@8qgfʾK6&ٷlTT܅xK7z˻[}`u3V̂."dt#mq:Cӹں^c&Qkב?r_GJܨMM?dXe+ֹҙ'OfdS;-8i^36HIN8([ P։ 8O{o_I/P'쓶~p~;>YG`e`N?dF;ǌ1T˒{`πUBj{;~&j0h9plS牢;9Չ9:w)t*6t> x6!{[ύ>ծ 7->G ܚ>r|J<IɘOx&6LG%>y)QV	F,҆^
H]n׫9p,*1`r]uH82Ge:.M0)DL-8Ж307"zl
Y7F<`zDpq){b9ך7J b,uNjwl/MeWj7y.Eޞ薴<m{>`eޟ{@}jtpJ}q;mpozzZ_kipFc:'WO'MAgױeBp_tc	 -{ӵ>k*
,",`Q7m`}"if{ck-['ڤza8*a?*Y?Mɿm뗠){3IT~h`x*j `]#k}3r4$~xk=*QnHm}|[@"HAN ON7*GSg@܄kYDֲ`Ȱ pԚKp{o uVzמԔH_feVPOm	/,WӘ\\܃T&)Xh94`\S>dPn[V鯰`*qStSIH W#ض*_ )O5kjIM"\W63InzִM޴Slṫ%WunCsԉqJ9fy7;ܞl
U-aHۖ2j;Iuc!R]QM_/:ugAYdi9BV揿0+R߽f;{vzҘ4|c#RI&v"o2i36_ǷzX3U#[buC	(]<}.X[<i^s̯3!cKU\򕀢*W~Iiԧ;/צhYDDIx̗܋x?W(GnԹ+sTyA!OvۉJGWrO^[\+lu4Y͊Si^ai;ziGGu#Q5Wk]=MwDӚ\Ea4W9@X$E	݉?q8~B5+
x?)8x(%D?0xFCpo#DiB1,{4F\xM/1 p|Qi}"@fb	XRifGf>-!&2a_e-&,ΓG{n_yVIhtACX#c^hՂyMAv6HmX,b2%G=zuWpW3:w->r	A{S+qB5k!i::͛٢4u0+?{{_{!D7zds⸧vMc.:l.\aED7&hN&Q)uah۠Jg-Fg~c@KhxBKc0:Gd_)]xk睲9kS&:0WpFL).Dni
Zl쵴Հw,)!I>w+H+chؠ8nȂ@5mA^;uA!˫27i	IO~EZ>Z<^:X=n-lg:@=gL6gl.bv>H[.&@BSLa,䴿{=att]Jdn_)jh+>S1
f-5Q!J/X$=K SuxQO"dl@;bYCau)HK?_꣦:9"\4I{xG+l򎠵/4+@,τ9 ł9WVn.a@TrnqoPqmi#G:DS~bjATE>5;fV	x&zn~ VtSvex>2P^Zk5v<p1z#Cь xrܨ"[E X=O (=X1y \jخ[щ~ǇB/>(v/)P1ohb7Sī.~DgQđBTh)T5gzz}z7;as+Rନִ5覄pc*& A	4j>i]nm^ޭ9heTu,U2U9+Չf'׈_~O/ly#7qek3)G[vEx)8pA߯lY'vB1Zj,-4:6״S4/H_t4{48WXh_YL#COqmtWHҭ"lsSIWL2{hj<N&c۾홿	S3!N ?@"a;_PZ	_/MiڄL?n"TcI	ՕaxjC5bvkA#V҃qSROD{Hݺ5B:uukqN !p+YČP,m*2[`qKԚƎyPӅ#6りs]*R28"ԩe5ʑ0jGcC8+Th`#*ukHZ0oZ>?%cɅ?
0oC+L잛;`! $=גe<p2@dʓ5__
3Eh6
G%DUF.9(OZK|j69gVs>eP G|Dkd$~a!#Ǆ~il?=5#@*.c GbD;'Nl:vq9k^Z/-{QvV +\n%\(Y$p؆`CF6?g]**XrưOO_1{՘ ='֡y	
h4-.ng8]pƂVO-.)xu#䋕2wvLk"FN/׆HYTX&u?QJX#m@m4 :vrA8 9ycU 3P:B"]st^cH,.$EwX:\VM9nGdQSx4[/m6F9""]}|?;o-oh[:PPcpluOVǱs>v:^\g]˅Y@/5K~wf+q/6:QZ#d/I,Z<;<v#/کcjKtAEЗ)mz(rȔG:NZ`km]5 Jz;]?$hr&kvOזwEc8]#hLWi6bشNxئy$XBgq]ⴺroC:?ċJ޵%kNW
zurB~&M8j.ߖSt˦8*~/UF@evz	/IoP]I>`wfZ<;2vM+7G(۟QaH񷀘06
[$7TަLD,1VG<(>WŐ! aq aAB2ʘS{9Jq`S O;d5u⌶bn}Eq
1bljPtLe/Rf'J@+g_dۥafq'oOe'KL*wLVكiV>b>=iŸA$R2v{$ik3	_ɃVWɺ[/z.&DYWttR{SO )}xg4}7<*_	Z	=bͦFr;ȃ5sq\msx81>w$hzCR`/}u^`OoLA/nhv:l{SF?*o}K2ȩTR\RXlX}#G(mk(l:Q9tTg\w>^ͯ|F'	N>fw`~,4@&QUUt$9</1ڎ޲aҴpT~{מsC	R1Mz-j7e?N~lUPf^TV87r_8bgY7|5?<X8Q7.G6SA!ԙgsc3jH7[B$wAlPFttw3n{0ITJHY/;WW}iC!=8/Be60೦>/@K5.a@ѵ"-YcWRk%=
ȶ?;VGzAL =b@&ґȈ쫝5y2wZޒ^1=բc	2R^,H@R0e/^sb!Dݖ@1H#ˎ]Q$h-{}{b3ǌٕr.9xz^r[LRG):B1`RDL@>!ܗ?XTrn`CLG
~A+)?vͷ^~:~w l71eckXm$?2ג3dxS|D1	lw1DnEP.GK*@DŮt!:X@sE8 @bhʥܹVu	~mh:AQ?_WL}db)?#}/,)wc<dXppW@bv1=*__h?4޶U,:{]4NFBeU<V%[͎)\l:ny̍0zq_>A=gp0;k)gSw؞~˜Ab4~ĄXִCiDnUey!	S8XGV&%+4E\#ѱ6_&?Y{Ų"KNּZDÚ}~1H(6:1"gO%E^sgtGgC@pAFX,&c1͇yM2/ǜk:4kسuT"tǬ| >)fG4u^@_-
چZڑ!ԡeS>JiRhr	Iwsv/^laoo3U5(ճ..S,EҀ
Vc]ͧ!Afiiq3rP2؊J%Ș<7_)H;F+'ey2+,8_C1`,ݥI.;o*,*~V
J83mŖ!xJGu'o_eO)2V=~sxÃ}5[</EZQDID4!gg+pg08l5nZL	`/|4vٜN?3u-wN\pxqQL>QզGJTe-9LQ~/I %nJfP/0;rcgpn "P<
=E1  />>JE(ΐ>P6Riwz&A砸uJ/K*7O,?kꋴF;F\>X7S{]ۅkm$ $j db= tP;Gv#J9d@,?o00]@޶I[N),mq'ʭOO!NL5uDd$Sq/ߙ9.f}cnڝKq	Q;ժ v^>;8<-tN{@UҬE"h62\A?"  J`!ؽh!B)eQ㪘鶴?]7شmwy:KB}]\_L>UFZ/<dԬ\lv6ֶj[݅X߳*Ռ-N>JV|Uk\s)pWe2K.+4Mqin0I,bS6 AݯpI^_=(X<nM`	cmo@pF?EZJs}=-
lyYsP;A\zt_ގ ?;o5XL]1+lh4?]1|wC;;9T1{䞐2(r)TM,BD,4_6|>֡,15S'o+2+T׬w՗QtΗ:<]ejufXz+]/nNٰPn6NmԦrc%ST]<+)`H>
v{WG*hc7L[!P|iA,
6؀C.se:c(a,b PcjZz9%(11 ]h%R{v`ˮ/X[C"wlW<[SIYՐ7u*F׹<3nVy;pC{IH	']Op9:粃xT-Rï^Y) v-W綇?^܆yV6<Y]3bTEBC2YmOX+S!.J]5hc%pԜYׯ# 7UM1"wKQifTWX&ɰ(g^bXF_jh3cY1/i,G{IhM-!P=g
sW}~Ay[-S@zv':>6bJL= &
-8X^r`btrO
lDVa	 h5+r3|MeTMys/W<hf:.HrZ(ɑei{՝hND-٩HEm$ÇF۽<FAz#r3XTAIqQ^ ]X!-ıDd=}{
p#^mcD!v"%"qɬ.C~UVV>MbYfGL q(EAq +c4EXjIcVsDȰkҖ2f܁%Ţmj%./BBh=q;Gȶ1/5KBA͇u9B|6$:g.k q{kq2:Ӷ\)9?qi808?U),pnEM;Mxd(dFJzj"WEykb~b"0g<ônlg=}o]OtVVS1eWZmyotYEz%DC0|#vVNCWP'@[*_찕 l3Od]0q=0-(+p{_ LLLDN}pc{է?]	l4\=H`[=.d 
,LKs_~>Bi[4B]Y@p#7FzcXZu(|ӝTF}W(u@(wFA.D4YSs5%
Ěd(("2egwak}@3ʎ.B0lf>p<uxtWӾ0&3O
hkSz7"vd=";j{I;[ f@>Y#)ɂ0a`F͙L-jݝ1n;RƗX#o\[R͇)'w%vВx5Λʫ&0mlWU>64^D.7t@xbH|*4[P O7!cfmK]U3ɻ)b*[Cɐ=qѨUw=xT'?#,)E0f\C]IEhb#
'ͣ$[e{<kg}yAݡ#5FN:
Ӓ^'TНĳ-yxN5UT"~9ʂocMa'[JPSxXdᚂb h"]
\NGYPBu66ir,2l{Hm6a<-o\߷%m%FJ`(zS#H! 8_sa:aeU/+#4xWƥcH9Y>%C\)Y)lyT?ヂ2([V 0Ʀ7y/14*'A*}wkQI/5
/\wBXZAIˎBkm `_q'|Yl!<MFu$YT;;oLy9añ#5ܲ_B^59by' =?f5xb1Zq#~ԸXE5ݙLjb7׷ս.ny@ikw߀ţs`VF	=EO<84"d.$򐑥)!Y׳|;)uCJ27ΰeH-+3ˏ7eՐR	;:eu NВcq\1 CuGֽcqǽzLL\ x$RO(,T{Z3Y~Pu܋_HQɘN>$C4S?w~vTIKZVUm"@5Ta5Lo՗gz'-q]G3DN-R2Y4K̱*t5ۜ[@9Q2P C9(>/d"Շ:Gvj	M	~K29CEY2?xMvl3|;xe_fY'|}pُ;{o{XbYq|e_Zp}c=kcp>0[!,3{-D1ߞsH[M0.(9	rFOȲbU>xvuȩ^FΜS>Ap9oB[6!R(b~9Щ-m*JG#1rZkqpe/{\ɸ*?b9*RHrN8ogUPUPx+wZ\O+]zZ ]'fc?m]mP"2SBKY_r'7	Z_k|[ӊHg0᪶*>Li	)G_A{:~︿+vR+U9i771=zWYb*DȎ-/>a,{fS~Z:e:
lY>s%yŭFhq@2¡#͘"l"-oCmdģsVӸizWS9wخ	Bݦ.Ggt&.BXO4;>2v
Ù
]<j1&3:  ?%DvT!OȱKTV7&5x4ɜP'6]ڮ)k,RMkZpR_L6-
i|Xqv=D$`v͢ZAJC#\҆q|S;)1`械9aBvG"&nţ|<= r^ϫ}1;ßV
l0aE퉰?t iZԛ!W^yF2Md4bMgz+z 8<E!2(RSKbjRN
6-e7邑q6
rPn.ETy=!LŬ.d䐊lA5$Afbc2+~ TH:Edj|b- fq`btCwѵf,\gAБ[ˇ]e#CaV=SlM+]ڈLN@3*vFn`>(|
Ƞ;Dh_ycw/R{Sނsa(Kt-g5;91"j9]Baźԩ,}^$%$Ckcֵ1oe5읾-s{l#?&O;fc  zj}Z7GCZL 1͆!PKHF)w|*xDNܞ 3&2P?&S/KXQb&K.w4xݚ׌ŏAH3oȈ]JiPUGm".p `Ɔ ;f5S0{?؄I"KNVvx<y_X[@?];;jNS"eFvjhY}D=h(ʳ_q^΀CjΈYu%k<ͩ)w2ZqFklՍX+dLB2N9fUBӬw8QK,R*;7,cG5:SE
ӔGlN3m?!kZMAQe7j~}D>xaE(
i/ݡV	6Qf\o@2D04\D11L(`XQI|YcUgN"xj}r3o_ߕ'Ua s(uzuc#?WZn~@g9qPEh	ժ鼺UTʇd4!+Wgj[
1UO&N%tS*z\qZ1\-^d.xfhBnhA6h֊<%@uH0w0#Vpp}q3cJ敵DB}s߲&pV:"!xkJ0xh
@K N&Gwή47Ԝ^Q|Pc\YιI*uP.fZ0n h1-L d=EFfg\]a
	¿xꖗ2C`ZE,F(=^qƘnXdj[Q1[VfYsau7,q=	#e51{K!6mF
nu88"MX*,f)툾>NuHRͭbk]D?~Kz9=l\ V+3j=f§6'Z%Bw-*X6b; PjPXuicɸ%M[|۱]9đӷ%<~@r7zxх/X09feMZ_s]c2$gd5bXk-TkR" ݯ0[7|G9VENn&!G:r) =5obAmYW/Wme[AwVK`#'ҒeeQ|P'M7n=UaԌr(,5Iwվ_O+̩Y`
Bmn#
|ǙM0)ZxngYHU"G;.qe﷭7܍ۉJ}tBhx+^Ga:żkn9c௿?nҺh g~I68Ҩ,.J._b`L"Ժ:lݍ֢wf<_r>sxPzxGŃW;쑾t<cԗT=O8)Yd->3lr8`x8 v^]@ddh&'^9|0e/uAjpoOҸ3#b3uW0جwp]S0!<ҸMYùP>jb/гˢu8]w"Q{{oqZB:;mMߘP6^i׏8El^@]8cig΍]٢
|z܏|1	Ȫ:K5pu7ZpE7tXo
)j82159DW|`5LiYO盡T̨p{y5kؑp(ХI+ t3yf^5cG+C]ǺDd\$54	gs&13zuyIBwXl9ĩS庌xݲCQ;C;	& Li^;;p5jV])me$W|^|
6:1݊pNbx5ޕh.$UuҷFw>#χc~o{CC'`_QXoQ?=RDl`Dy&y<t꫗Z퐅Z҅^-GK(cįUEXal-$Q`Y؞HԗТ/Or
$LύVm ^#ZusHojlX+䂉)e{װ=c٣.cޤ{'ݓ8Ѵ.X72B &Td2[m-Yd8nN¹ڢgr{;prC*Vt~ߌgc\n<~^zBAyq61㎵^d0^_Q7~j	'--?Tc@%{/.\A*E_:RLDUGdCE<E8܅=Pț!ڍ$W==x0η3Y$etb"(:ވfk\^1Lx6a>Q@KnHsX571Sڥ4Jؚ9}gvv6y4̯쯆iDXQaYIrG~ BM ܅RB9ɵWpC]iIW%8yý7u!<
Z2œ\~7!vZ4$t?&Ҿ}4B78H[?J˝ WT%x@dB&DI-3Oo2FO;à?]|bWVp
ugA[l7v[KRk'K:ٳl㑢e+BLӋ&	>,85Jѓ9:1qAV!+MRdƖmHUNGM斓Gɛ ֋\8^-pKOŚ/N\ڟ	Bm;mCGYJ.}fifE-^mƕ}a5W1i־(<sa@.򖰒Uuh.*|Vt9vwg:.6kCh@D&>-4`<X q: N	<Em'ʡqWB踍mMR]
&it <"1P/uؑ$.<O/@\s]DO	>(n)\.Aeξ!I,*lW+s0!ÍmS.
B{jHJ?U%TQX(?N[uF!w-9t&BƓ0J)0`zy["DeԬ@Xi!7S͚gf񩸘# f	Hi dbt>SMt W2P'f!4)Di6$zyœ0lߧQRVU/8uбD{^S֢*ɈeAJ3ԏdp20pA_=h6o|2rfPL
+C\(c8.ObNUͯu"g<v䖥kSoWoƝ,gZxXNް&lcazhoL\b̎uRz͇j#s
.կ"l	wl3=*Y:MݮXGu@gCPv@ٰlv;i
j~ x6,XO=Դ(X@P1ln"|gFfu365403'M6A!n!xl*2K]0c	CMK&ȇ ͥ%"5y	馊fes9=嫒K_E63zX
,| _9<^uv=GOwK7fMǉPץҖkT&rAEF)rFaKz;j4Ej=3[lL5΢nb&yV-}Q?IqepzMC1*UڢS}"ܛU6īXvvfdlEP
$j

x8
[ANٔTkN_FF6?fC=ȃM:-QsUDa.1PHBРGi&ڡKGG՟1|wip"vvYl	
]&YְÇϽofT|Mn^ 2$ѐ!Fp d
=j$r˲IW hS]F%2̉8nF"Â@"<E>Ks 8x\ck懳7Zs3CL-
*dpeޱ:B6(EN"3Ee8Hs/ؔb֋Y?ycIxh濒Ef@p)79uZMLv/wqʖʷ,Ml+ Fbl!W3UڻAUvT)A@e1|²)MqISdaG8,,`'pKR-vTJ:J=魰ZKbs{+t_!|joYFЇj%%p6MSOC(+axp.U%(=7>QI_FosIr:b޹	%m:jG+s:y=4nMN3⛜Y[RHņz <'ǀ0l:rls V^%!l<7*7Ƌaݙ2ýru=~.ºѓV+%H/C }:m 1nn{;ʌbjy"wr2qC͕gT5wКf	 OXNj3:"r,];GKsP3
4JHSai.totwO(yXbO_L3vPHٛrìJW%b6G7!W6
BO؛] MDQ}eԋw1s]gXJCρ0`_wK)Ψ<2mlQY/fx1+FaJa5!8_ϫd?锠q1 H.$S\	IF+tށ`8|t{A/CxU!vŊ,AC
z.E  5öB
8hm$[hlbw8/k:l%2ʯiAzJNtCnLܹR!NY/GBJ#GU\^M(IƄQ}GبDf32	U,5΀O1}űN7@׷<DBa6RV?#Js'aƜK[8<z;!5d]U9\c?6)ux[\8^Tm-rl^oCQ'..Z;K;3qQfGH!(!~wI7&R`MaƁ؂t$YΕ]N1srXfP<KDZLJ= yP7~EeKHdBHSuy~ru#qN"M2@˒s f27wjL/elAn.XsE#:iϣ)G.FWCX-Èi6<9{i$2Njթ}Fu~k+w.xjis24! Ewb-2?tg4xL;f"n5Wh>Noԧ&t<9Gh*y t|d}i&j셌OY!<Ay(B,ksΛ{G'A!8`z7΅YITU}5WKp5;kxլU)SCㆾ/0T
sv1v1$-s,tqpˡw-͔!'k$UoܒlZ8gPC%)m9W-+{H!@<Fb R2=lg' lXb8F)^
VGwN{V^'~==\Ӡ%G@=J뉹e 7|B|";ƗzEA=dHl
P#̫EUuPE0=%KNwBD
~oSomnK|	.hE[
ʀ@A{w'=|o.!TI}/3]aYϨ3J!/áTJ0B8 y]a;cg02qBy'բd^vo5rjcU,qr'WT߻2љXSʳG« oyՍ( t"52Q])ۍyTۋIfd d9	!Ẅb6V^!+!2HQ]%>'(ajB^JЧ(KY;{j :(;<ϊt<h609R7y	܌8Ŋ4yBJB^m+:8WtBV29IE~kes).Qq볃n>	k}Y	P)ם.Eö0dۂi% 6{	$ePUz;0.ڿ% vY,2M-]0 +X_r)FLkəAx8Mt9Gmo0yPBLt4whSaR8{
D~VA8Su9g:Mh#U RoLą΀Z4tJRCtvBM>-sXHnx<!-1kIp1̟(Gƾ2Zz~<Sv%bw)<&o>yb7DQ:]![6d`s;
,6ʃYDe0/UY#,eSDa|e4*͐l@a٭f"@9,7J'h76ɼgo.5qkf{M[b_P<s%A|;/ny,K6_8`7)sja)p9GxZa-(%ejRwW?f2hmj0nsQz%7)eha}93GtNi^
^<;iYw-ά+{EΗ@3
؉3?
,nE{͂:P5H￨Ս xE_"AʫQyY=0PAq:2ٺ$p]o+G"ӈ.@ TOHFCUv ߷FȒ=SJ<ɴ]AbvpbSbh@H}X92=OCsDvyY,flq.3]{[1y_uwhx'dx&vj;s}{weT;m[3ܘѺ-[.-^S1	&=*q{dQA9 k\(T$vxí	qT4-tWy..W1b7rt	Hw)u}b]mv3^{MT% >1_R]QIFFE J,ւiXW
S{|]]I"`CKŧbB1D'77G
Ws.!_xI(;h#yRiq]wqUjŌLT<-tXDR5 zS<%[A1)mKDӃƬa ~v;p9q55*Uw 
B͑8btQº^w	Y=1H9plЃQd?讀6Wٛ÷G',qp\bXvo*(JiC#tI1jf9eHȵ|}S
+#O 6Bʅ[#pW%ƈ_}[~jΞV?8Y\|I.l&c0	uhmyXq*jjҁ^U娍j*nUΆ5Ύ9ڝ=?'8UU!
O,ڔ< 
\ffh-!Qn&D-@#!DD"Ԕ*fڕBaa:#<PASyU^DWq?sgSQEʡyBp-YWqVMl!?ςɀ?6|d]\7/gE>i%V$w@Qp1sqP)=!Q$J|QBHezY5g
zfx/Z1/sJXSUw<7PO(ֲu׃uu"RC
:6XGժUFwnÇ /̭($~|Z<9BȢ'cy` 	`M~ZMA5><=	$4GM|v#SٗNtɇ!Cdm[XWĿӢ~<{<+wfZ<5aAY!8N>^0RIlBF;A/F06fzUJlp`qYa,+Pd+Kl@U"{ƍ,St4Oɑv7_wiy#KrR5EjH*g?^ nRV93dw 
BPMr\!,)݃qJ@s,QLML .0|<\'7 ~8JKAWk:aweA[4#I8Ǥ<ϙQY6X9y.)$3,<y7!<x=-ړ<s=CFFo.sXQyR0XEUaxWWUqM?ڜ>x6E1!^ڭoQ#\(4 {'SaeGh2ч
`uvȖ,ʓsg\<L,P/:hzwz®ϬW"0C mdV`|t'&B ! {Z8//(!OxgFw{vn԰C8@h|w_A8B$Fh1{/w`OWpfDp/[E.@ҫmtՊn#C^ě[bS6*-~8	"%.|igu* ST>cFq-6BK:y6ݾĜy2J
Y2NEAH>p6s>*1[_\ǁ6ՙrZѢfmjt{!]Jcs݋8qBZJY;IBYShNAQTέ1J~m)Ŗ.N}\7x'?-gAC	P;=Fz'hD78_fd@+	UA}AorhцɓETJ<t|`|rr#X~ia^m>\НsᯯV@3?r"ńQ
8{z/nDM$!̍vOMB[剉,^ZTD
.-ʱ
\XTl3A.u+$Y5`_-o"IЩAo`1avͲk,ڗ:߄'|Lmۏ,wߕwcm.SJ~G?+<SDM^;xj䙩"ɒx<:Mb`#*	2	8܇w${4	!adDm<JK.x5@^X0Hl΅@`#GRXAh
	#1r
 _Gt7P*%bP,-&DE`Bd28ƾe%ߺ]'6gz,ƶoI/n}[VE'db,Z% QǄ2g!`'#ǰӛm";1o`9d".LvZrXZ>@۩YOQ(	SM`g!MnΎT Jx?mdd]hѓt!%6?Զ>k|zZ$WnPX)=h%;d?D6/L
YĊC#Ms$F5^1qrޤj|/ZRfHPC7Fэ &KtZl8\ld|o5ƦE<1SmESetEm#	loB[|4eOiUmѮ:ۍd7=E`qW2bh$D"4Bʛex˝xE}{"Lqy9t

-$ЬZ}o"Ri;]rwBؤ*©suFPUx&'bu,UraS-@'97wXB,:
%7-rXp@LӴYSU!H5d5!hYFW;,z޺gd /PȃZ[9_ߤMր#.i~RDCFaFT_lk2= W:V,x@G-pyy|%OCwjӠVVgIe{c<iزz-69Z(5jzp%g-8Ѽ`%ILelUZy$q	s\XO׽U[VڽUiw4}Ud{H>X#/HFjH;o q.-N_X?YG܇S~2o,4+Ujq8#FE3Ś>K!TxЈ@P%&>7G3b]tuD'C?c\EJQct]C4|eޙu8Ȯ!h)8vsGa1ger0
jN7)U/'A!\Ix)ܓWL	NvE&zBy=f,z?Ǔ'$Ns r`bKL/)h/ByMіS_hN?V{S8[B2QhG\TfX)=gr:fA8-TtU0>Ԝc^T5LU`ezC./5|6jD0&tx<~18h8/bSdwٴw1^. baqH{8	{40!1RLJ=`qrQ;AʉFd:}愙Ce}%$6x7H-uoXVn߲AS</[93	a41Ŗ%P,hzK1:g=9zTOOlgt蚃-R)	,Ⱦ	X~Ȧ?Н)"ic:zג=(p!4731&X6N=,b9:kud:ZH8C<ޙJq [Si2j=4K5&K`p;hzJSQÓaw'5Z4iAK#%# '#<$H6<Ҟ*z`eotR;[zlsp=EmnZ8>OpQ#r-w,jLW
A@5ecDNx;T?<Z"{LIH"a9~}e6z$@m`N=Jv?i;T~{aċ
/Ы<lc2qd60Z V^	UP:fNJI/8`݇m>S
ك\ftCxK<UP.)d~yhyO1PWĀ<z=󳃾gyF2nKliX@)/LJ0Rp7]:9S20(0jJ"4ߨ8+уb	ܸ	#\xcqtOiT_Aby^oZ'Ҕ-^#PAS#p '[bgsVL(lP£Y,(&jSj[v3]֞>#5{ /Xҽ-L:SWpJ9u/FnU7CWu@Iυf	IS,τ4ߧ[aٟ/Ϣ}Qp8{c_rj:Xd'0xϑZ^r"tzc[`a+2t#!И7Sу|Zctct|cojNpD2	Tj8klP^,Gٌ@V@(9.:~eUWUt,ӟWz<1{.p8$ܘZɟz
eЬb멈}t+ic8"`%8m5
dq!	䲼
	ql鴏ѵ\t+PqH$>UiXpT5w0xxtocfORZ2nykm=arŽmoYѦ./YSA=Y,WRAZ߼g7J!}Lw⧐p+9.u*n#n0G^0y0"H@yPw
ixzN4J}ͯo7wPӭ _߼*>>].06Uhǈ?[ `/};!~
H!o/g_J9z^x[Jۖ@)N{gG/ Q;J[&T-)ף#e@)Lٟ䛂yH	MؽmPFZ$yo-8M*l'y=N?K	oͷ,[@<QeB^KFՓԲn7?oUJPt1s2ucY.:_<wlR[ൕh vOzoFר{K)GCI*)c&Tcec]8ʮG*VdG9*2l"r[2h}(WM`q:=2R/qu<6m=z2=~ XRhkɻŝ?:jYAT=O/ԖT&Ws3MlIڭ-iF=SMxnI=Z/y&
gZ|g`ǃ#Oo9H,q/^sAEh41+<&3@1±TVAXH/
o1ZW/z/KE	<tOx7הjJ^~냬]w$S/9t~6`gOozGÂԶ{RԽ(vFpxT(vGA%z#/o3wO
g%g@3
`gEϢ`ga|tZHA	gK&6;#%vҚKb
p}UnhPϩ3/vGP5W\;ERgj~RBuW*`g2`gJX9X.'laYs!peQ
S`­;nq_UרyaɂYU"j8#X3|YA5rh4ׇtFp\+hs|^5<,e=8(Mwҡt!ˢtF^4o:#xT4.I/KV3nXT.=-W-n!PA ZjxeB @;#{z3oF:.`x-mg@JQ%oKvFp?(!mW\EWna`gm0p˝)^OΔ2vF^u\Mvz]AWj2WA	3ݷQ@ۊ: 9WcvFP=wZ+*RA47]%U\s?9c?,SZAq͝'eWVA;x|pZ!qax\sFd-S3'JܔHqXLkQn	M\T]Bȗ0bDS&hg,qbHsDhg,X]3.x]*=`=co=-VcPShw,bhjN<-1\WB#B̚֚PQ|c\C%-qwPW%;C;cYk!Soi1NFOm"q;c78*3ŮF|d]M3JN)αkagbܮ=8-bv?*,׽c{֛Q ]HRhw,Ove,@;cIJ|}S*c]9W@;c,uo]3]rqNZ5,
]/^ϝ^rtRZ|ƜݒnySʱ9gXke6Ю]<&^kӡ%|S(q,b%˗gp`.Ti?r)nk)i3AOr֝CwT/,gT+OhƮZJ6Sq+^PxnbӅFO
u]#8MDAp+:p ڵ^ۦb0yl%1_vbOKGщw9?x7gLm3<<gB'޾=+PpIoCyXtq#/ӦCy~qxJ;NȻ t1~rø'p>b)KMS]悮,/2K# (C05>څ}p-ڇi w[ C%]za|i_9_Fwl&Ya:ً~6؊F+
&wŸ{U_1Z/a/K1jD7ou[b̮u+FEM/>Z7ދnml؈v?&/EިQ>ō왾c	"nsrxS϶jg4*y.>uiC"y}_af:ڷIcm{3vd.;8TlT"zpwp(ReYVl}%޼Ļa:x@.@,2|0Z&K5Ŕ[a*0t:
p)G1 JNp88evz1%qwW۰CRzi|}{n].}g:ӿS,䂻
I^oqfי8.hnoB_+I5KEhZ5ų%.Mv98\CKc<Kls݅sy4 1#Bl=㢱!e7*ŷ;2@wM;)?4</'BŁˬbz	(3ȂH(lcR h^pp(P:$yX8EYٟĦ^~Hy"IjƗKERAoTm@^A<=uź|8q3hpŻ`C`gGdalgvҋJѫRNjhgG6Lcw'z)"^Gs/$8+r?v=瘶@m+`A21 =HVjung)FǤ4𻎷:&n9\qJcM&	A~JGOR`	!61imv~z.3E 崃EOov;6N{#nRߖW`x06<OqEV"RzQMKjVOJB2888f/~}\V׸km5,v8wC퀗@]F뷃Y)J`iHȕx[XN{?ɦC"n Cer*"ظ$
mp\@R+<0I=BIPP Dԃh[;+~MwբwpwÇE{"dd|#ZqN ۝V`Eua{s3SIu~5TȪfGmD[||ysr[{B\cp|Z']^v	ɂxyZڽ-ZbJDzɣ>-`d/^dXMF:DC ?wL^Ef>j5Yu?TD36b,$3Зɚf˯fۛd̃ R+%kHǪE?>#(s5m MǏbP?t&>:	p:|bwxjyEmNn6`;"4$(pC䫔{,,C_Q1cT9O^ҚHjkaxeQ^ CE[t/S	fcɭlx$ˠŃ#y4(9AμxF[	"d~6W'p``X-ǭKIsM_qhnl[ynш:+f'EED/D
ا`D?'D(iv!+/@S	Y|ozu}i1g/26+V|7Ofs&Őe~LafAW	"#ƙ-Q\B!Ǟ\ '-R +r>]ڎo\:W̥0-E4M©X91\Nc2ElpQ"3:lb?xm}@>t}ɘ_&詨ocizD(l+kPY}U	a0LjCH_<!'ԢGpQWᓾ1}6y)|1Smt6E;}Ŕ0e0IzvǍaZ2&x~Y;^z>2iuN+1MֶGqOqe>k~S0ŵ:O؋ztj2O;	ZصtQޠv9>4iLmTGLQ=:m%ck&j3>cYOI8ANcSN:R >5&&n4[8[hw|Ҁ]c<15RL)۾Bבc߇N
:UƤy8 (y<-}S1?Vh$[Zrj|SpAA91%5ӦиDA5yhW?(V)q#'y/@%$k{!MqtS:N-و3Ay
kL-;V1Iv݅ ߈-&㴒LU@h\W	~r+pAjx<MW!yiLV C]oީ<4&$ӠlI𤞢vՌ֓9^&!V%:H9#E/t2<8&(E4,Jfɼ[miLrDJJax<m˕SGN]Q&ẛ@r=՘4Gm%M Iб}QǕvsh)1_r6$"5ԢL$[51i]F3,HCF˶x.5pnpLzͨpD3X_JKR4Iڰ<.ײf|Yo&3iW,}j1H*u#;mHfNJ'{+gCx97P˘#
dttK9'4D6V!U>I>H*0tԯjB1].(X3Ihs&3UEc:I@Wi0Qm1CBt2J^Dy:3I|NxA'-z,Z^][YsVYopzڸ
Am+k
ZJ<WۡiLA}|Ƥu4-mu8Z`I+Im;/4gҢj.U7fmJScj=li2ǤuVi+xAc*IhGReFPT3 3ř\:m1i]j~Bh#nF2d*h"Bli5[Z-F`h<kLFWiCvihh-*"ݷ^C|⧒OZSИ"w)j#IV-C͖q;O>l.hvj^Hkbwmm#ã#c6<*_z?6p;GffK9{jTn<li7Cmv<;mL6Q/oaJ4gL%5-8ډШFcjKIHcwZ͔Xa;5[:FGInlU?)^{$5N޼smcwmd$]:;Upeq@Ҙ4'XK,Ei<l4jt\!bnn=6kw#0*S"({>eBݷ<r<j:=FOUg¤4GbW4&vPrlbڥ13N4a+B۸^4h6i}-9_R?rt&cWANhiN"2zmlbqv^}iWCfͳIX;n%gKԡOtْ&MÙXG=h5гcS˂؞s6iǹAlO/߂1ņN-"ԠyG+dxҘOq:)G-HPx;jb6J?lC8v8gz04WOs<5:-3ƳW/񪯨aĹs6.Ԍ*朳vnegSMkq-/pG%d=Lnob;zd }pb)n91o91	-3E-0i9#}Sv'5p)S$d:gv59;>ߓ-mw]u+9g:YȦǟ(qIc@vb<Ӊ*d]%Nty!b۶Sjl(+HO_JK$ǑB]NgORti=jͧsW_=sN|6hՊ< ?J6)#&ǓJ橥tڀPuKshɧ5N`j:Zw-#T53{N<G0gNM;v#ڷ{lϖPןTwm7GD'c眸'jI\KlkLن5V_K-Ī1%5PuP2=B_lΜsFxӊK1،TE}D[MZW:b:Ϩ2<;nN$b}ΩXV!-Kt?5Ԕm珊WkF}y!OeDsI&pG'mqsҟ)G8cR^c<.dmh,u{oggL4u2J+i~ZkLf)}9JQ7)jԞC;q!R[7)nlRWr(¹шm=iJvd&c;gJ+$IAvh5FvlXUn?}|͉i0J{Aaz厴N	[f|s8lwWNc2
J`_SlyA2isDM[fP2	87S㸶'Xk7[c2{NjGJV _ɮV#)U!k3mܜs2LynɞsKmY!bs7-h{HልNc2g@e[WZKhTKqY(*IwwMc;$_ȻN1}6jOj[F/0QDtzZTmw,&sAoR|W]bdD̾0g3>~qqZIq-wM k6NiR2vFCEMkJ6ѭ	w)Ɣ.E%S)ʧ^xj}䍣' ʻk-4&c;ĳ4qH#9}09D5SKL!i>#Ar]9gRZG鄴F3SS۬[&+dd΀r(!8\C{i7x.1ɢYmA{3ĸӮVN|[3؜sߴr!F[oZl9cBŖt:;fvv4I2Ns7cCZj9iѴbKX3f$??%-g5vMWel9qLt"+Z\"1vMJmib9Ua֞u!/Fbdxvd{wWf<7*"T4<ݶJїAAkk۳|I-O:'zRo]*3ӮOkf=H제Ivw|1*t:|Bk0Xf	t:\6iIsF	x.ql'$[x7a>?\̼31)!!bH⶘|h׸cTL{ߘd:Bj.]wc'I'R:i!V;c;DO[).I:ڽ$OX~w$VU+KHdW#J;:Rؑ(Dނ)t\Ԍ>N>%)y;Tl| G,R(ͣY-&#IR/5]M;<[֖qO~8zj4fl(0ȶ\mЎ<iP`p`<јP	MҀɫA2ڬh05^@w$NȓCxbh%?{MLm4ފcM9gV\Z
A>*mڋ$M眸SccRs}M6F|V33I[֎57;EWkjI{G|6̥S-;IZ6	*"b'NHlum2-5NVLo,&sJĖ>瓽RdՑжN"4=մE9Lk`쌤sjA8BsVG{ЩsO:V2&{Om&K-1|\H!'Ph	;j7Cd9Nwq+!	<ۇ6ט=,&֗{b-#>j&Lº}ԨS5/hLeM^ږVsbKtkA9y}
uRd4lcq)&)6)$$VZZY\jLƣ%cKZVopƎ\d?ʵ<kLUrdN<n5uhԴwj'h7&tV:]pUv57[w%4&{nul]Jc2r\N^ Yiu{SF#tC:>hY.mf~݉%VF9*k'~^wѶ=cwRih=B4=՘7Gdb$K3Yy|objOc1vE-Jcht{YEd%1鋖D5K!6̥TwW3U3cgek1YHCb2<.2I)3rBwAwC<1pY̐".'?3$ ,԰:H,LcΒ[4&ssuRi&o)=x/ж+բi)+g4F3INŔӘ~")1HZU|]ИnsK1T'.|~KVǚdNyU5,/&^+3,O&lӘRyAc2r*d;[n^}I1Y}ܗ|Х9մmV-g9OGX/4&@+aN)^;y.Uh(}1+ı1]tYWSș-Vsų6bVy1vǙB;*OT8v dfz䳐sf9ru"
j^y$jL}<&&MFW=НޞXjjPxbn5fKb嚳4Rc2ÜeWsocI1VHԯbNx[t%&[}f|ռc=Zx&-߼&ޱ5rca5:H{Ύ=	͖Zk|i9E}Ng)dx|"תVO4&skN9gbE!Ocr[ͫkb,hLF<ښB|䏽KcN$$M?=+;[|Igo5ئv~iyR18ZD$Y6{{'l5~dArlki/iKHju_gx$x_ɜs>89kAҘ]岙t{d7(OV'{(CgTڦf0M\6=mNj	)KZ>[ͫmbsΎw	yL1%jFSלqWir\{U;{)l'}ҟO*Kj[͉8mMY Sj9!`Y@)W[L9\1Y/qF3rO>5&L}!ڐxDܞso'iF;;۬j溉tGlD9tgoƺ{Ns%w2\1Y_%טV;`{1
_tW_^3bew9'y;jm[T5]IGIU_c2<YX6ss{9j`M!ٳ>w0kBHbѽ_.EɆ>.<H	\`\w"Ns羒4ѡx=-8j⊋6ٳ|%ۨB]}#S&Vs#0	mnyܜs:})9֣?ޏn0ѰKyޗBH+fyvzcN7Iy)vV).FҞe98ณ}-ƔzkK[u՜ۆoX}cgV^hSӡSʧ"H)q#qqJn#4S\xBc\ӂ2)lDfP֪:u9'Fʋ#d9U҂Xcry\2zm#sB:UH=KqQd,$##V;yy8Ioo19v"s:m0Nc2<&~_Ĺ_`~ֆǛ5ӓB.Q9'lH^hOny9{]'ZpNlyGO
j%r%|+tS"߆)RnwO+s&a%VMqjoIAyEpЗOfo5dM-M/Lk쯔wFFhL0':-)JS~ZնqzO=v'[mY9n9,c:ow='KVjJ'J:%;t9&Q$}֣-'w?sN+@q:J\	J"-=Så8OS.Sa8;IqK;.(7\3ٓVkTC|י~1sNۗ4➒>f{g*m;!o\#\tdSĸNAf~K擽hg/av_sI87I%{&ًjDc2rBKb#A'k;^:&Ec?zWhFR1
zR#жY3ylo-IB3"4`J4|쒬do5s	Y|Dle\c2r<TZY"țYium?)Z$n5IN҃OmݗjL>2PuKi]ooKxvKSKEVTVs8uOKh9{s߶>XkX{]hLF=c!13JbDåiV3ϧԩđM<akզ8~0LɃaJS05S0Ӄx\+cJǓx<y0OǓx<y0OxF"O۳WևFf-UQ}Jq;]Ohq5/t	)WrFupŎc:906ER>m]!jct6$K(.\Ǹ1`JԘX0bJlmܧdzStBg(Eaj
ߛ?DhQ4__
c<qOh)]SG~D-]FyӚi&:Ej}u6 <~OL64}Oh_uR p&UlaL|ShkLGΔL|}{_"ٕƞ`8٠'Gٮ6S3aiY)q)$=Ԙ:_c"M'AQ68){"Ei#E6sJc"i]h3m',MηB	C(2v3SzmQL/(jS2gS3"0,,:ʷkdPW+?F۔r3բXhoj(C6E7s^L13OڢX.N)"oȤ61i9nDٓ{RdFW_ކ^[j%Lg1bVŭ흎'BJ~6Ƶl,&'-sfSp^|wa;WsIm'_N|ϸ"+U0WtʵrZ.:P>e+[>͓>[u;vFWmAV=eXx(/"i5H͂]
wP+HNƤV:H)eiC:gt\:S"h#R>]\3)28Ũ1in`DscS52R>&o 7QR4}VAPV41`MuPK'ԝfqyahUmPy?-?\7+K4KڔwRE{m2IQ	[ȥmfк,Dl"mJ[Q(<ޡto#;8+:mXfTO(`c h};m*ucSaw:M|ѱRE{m)X|q;8Q1~3@}ZL;8JlAO)A|6zRPMm'RQ$)0dƝ^[	jI-6'5r	='H?-T7)EL)bJG=c@SSccuQGu,ݠ47h86h u[PP6V-P6wԞ?-(QOjrww6.nϳbh;$գnevbLwvdYavz]1v8BRljטLU4.	Mܾ4qsѥբțLPFm@L5lnݤjRP(L6PITHX3`ZWʭIjtMtGeEY#
[#n[aL&<ҦR&mI@`j|jbL&	2S*W\0J
)zBmc29BƸQ14t1qjZI#11't1͋1]inbLQ׍s1|9h	-Q*L#S
`7$I8]ݡ%[&;FO:^7`B>#rInԆu5ѩBYw(ȥ)Y@|`dC5bH'}lm
lIJL:bֈdx$j8sPV&:|}͝(;u'F"Pa"ت! 렂nq 'N(vGbA)h@=8r|6ܸnZbL&-J@Qj:LK4^'ƫ
1^ a0@^aqO6Lc>5qVڰ?dcpu$5thlPTqFŉM&p`>iKT)=&)xc~$FʪO,S6JUpҲx@b4q&ܔOڤu;ɤ$%8	Q#yrm75C',ݠǱA!Lv8rzǠArҴd67h;II9PnҘ")2)`º:4qi⚉4)UzB[UOds*F#V{$:5;ijoryܘ:rM*V2̧yISD>QgH24k	ܧtAݐY{Diӑۚ	C&CȀScQ҄E0詞yWq	}8'!a2M&=kبDPܢ?cF ww?:Aat;)<4k$pꔚY͡QDi2ôK(!?4WI#)`j0OZPܦz %[+b2+S>Ε%ZдN;%t^O$힫eڔ6ޑGGVwǮNdw _)~0Lx&cӞGAk$39J:l3Vs; ,ksOlSwlZ["aZx Adr@R\y;vmjD2 `쾌S{Kvn->1%&f+$xOpr:%!9iii5_y|]LBLijUq1;I;NiO`ƙ 4\k0i[CShK1/'͑bFC'JS9Z7IQIm4t3whڒv<ʺ}X3; L˟kҡ.I,Fcb2/	+Y$M'fmCDL'@8ׁV>w tC|/)Rx\q\LvThOJJ07iǮH:r~kNGxG;Ǝq}X{| HQN%=2yc`͂
+*3RxhCL+x"8Ygw<LqJ}?4]S=NxVEb:]nX4Cj-]^mj{~1g6mQsh mI,O+d-9Űi5oƤ#.$<^Д:VK8,?6Qoz.Iv=Ϧ|.|1wl=.h}ZRzttm.x:Dwbgh2y7:pO/\h2EKr6>& 6({/_O&S}Pah? .;]V/mĢ'Q*ͣ4rJFп1TwsH0C b6<2%&4w7.J@s~5WàV  r>V2LD|Z^-泏SMzt
\ˢEv=>o&ДzGECvq6@򍢉j}%l_3 4vN}U#1Fv	L*#Rj1.o/?dF-O94
xY^0xF0_CQ#{E<T/z/=}Ae^׽~w{pz v^K)T:,h@48q>EzݓbrATϨ_֔ã $L𤪚aqiZQnn)?NOhP2xAaoP{=x=-{8*|4(E(^YiQDݣn뽮bhRz%VߊK_wy4d.	rW͔aqK?~/zß{l͵rxzpP
B%V)VüCH:X
<+pQBI_NaWHd{ݢGi?T5_Dx/$ 8Rnv^z'AڏT=)zP|Y4DoK
~O%a+~BKCd+җuseqw0jXTex8:=+DY,Y_Nv4|5{_{ݷjW=뢞+uB;|[.@_KZ&y9`Vi0ɰ[N	r^Ww=j:%, ח+vq1LY0htyVGFJC2t<*x6U;W=|a}J{:TڭC}S*8=ޫ^I]dG>Uuvj0*xUJZ$ze4TnO`tN}OոWӽ깼?8?4|R5a׫ږü꾩90?఺.r[UG/*doJs=-Fr~WTe^ڤսuMU]aUBUaRS@
-=w&uF=,դJ&VQe&IJ2@S8sH?)Y[5;ԚYiRhvǵp{W:M/Ɨ e8>?3\<gl*8dQ6ɮ>6c:jv
?<Qm^ףx6Uf"O'}apĒEwOU4Z_E4~&*>zGY\s9"f)b*6G;o'[gף)QյEt6^jX
Ƣww|txg%rg {̈k#M.Vt_fYt9&x^ުzHm4.n\d
<#³7>r;Z9܎yvymq5>BEE_#&%<1;ۛ	@J
p!O	˸x©re
p8c9C!}6	/pӤwwjl<ExiXOO{JjtW(jy5~q!+2jPzA5udt& ;.l]M]۪hxD^o LF0lr}}ZGg[2mw˺:ZQg5 a;Cs,G<'૧p^5sf%2Bd,Pi8fOTv>s+?x~-哫<,ȜJ~q\,/3cùm,ٻIWy{<WIﭢACnS-B<Pb[ǿÏ3]}_ᗹbSdPvE7KlE *Rkb&Q5 $LxQ04A^?djL9w2~&Ph)V/8,fp/i9_"zZD] c&SߏS$e2wɘDnuS"!ZΦ.'<{gǃ0$>_exp6HK3ߟWdYx?ܔş=E[B5.S_QHM1mE?G_ofY0V:#P@L"@|v'Ó#+,4r;ɯ(OUoA;8TƳ6͓xCv\S|Jix$6pLZN{#m|aě}D #z;c2/HgxNGcሧWruQ3r O :?!@>~#PWbk
vS!O?H''ṯOQw=r۶+QF<N(-S^Mwc#7sэG}j/:˲?A31:~2!uH'N}SE<~xf2{xN<7ȁE<5zϩ[TTuꥠt$Pt C/%<Hc [S/3{bV7yxP4#"יh"8xdGԱz8Hf?}L!S}C<eq=7!kiHE% f	lxY@H1u/CY~yl$x|N)u}+Sށ#,?ȕB<o2cxC}4M}'ěСdia%ěخRu!<A:aA7e[Z,9wc1^ߊgYrgSXLڸƃ&9dMD<䎂\<xHCguAx%g+P e5}TbQƬ'x>$WƬxms~*K籙!wc'ҋ<p^byro ɫ<]:jY8fƞWf%St:a]S@2]ICc,\<=pUcxmkUVg`peC߉oxڴ2M<ҹxfMGbgl>m'Mw$&Zyb)OʃaÌ\bpxZ|ֽe=g<dMqC9)cVtV<u`=Ncc7Ny^%Zg&.B/j9HobJ>e'_+>g]XcP>/t)kpӾc=Hh?!qz^̊Mc&Rϯ/&|N񰭁?d48XYGWśľ9݈3Gxl6#^6s/2-xA_f7!~|9-OGٸx'ڞ.t>^O'q^8JX17lI &J6FxxdPZdPÇ[MǼqqDic"vq64bz<ͽ!*,GSIVjxά $O<sx.R_gSR<.fl~An/sj6ȏ,+R`E"u]f	\*xy,9t<|l;)^ÛȾb-kҟ, ,x<VfswRMl{Ȝh0I.)d8k`4}zlv;̺d9"5CQ\&q9	gd|v{{GDãf_5z >g>b(Xsu`"hHbhjjttQPWU\	pJ*߂}j[IͩwwUld[=s|:?CXӕ8enpγr2*vraOMr^py&|{@)XKC8sx$w)wYɃ rPX{-?fԙCꍽD\ǅJ%v2_>z;tr2]nk`2Q^<'R:kJΒzr>~^";M3- ܞ˶2=ʢD_5뇊צw,NkRb%Q$gk#5Á>LȺ̓U&..H9:OEV?|dA[ꙿ;"<+֥߉|*^)+Bܥ.w:/8cǊ~,cZ"ĲZ|g^jW1\ҡ^r{ .}^U6?>αHMy7393Y{+km'tzCll^+nGAoq{o!szJCkY.0g8F#kifv _fG9;Hhyȿ65@17BPΑ7Bgow55rq6H@"HXZ'UC$©|C6ClHM]Q\ !ؠ!pY꽅o@lߵwq'K#`#`-<ݓhJ62k ɡA: 3ޑ DC+4lpcN pNZw6; 9b^Q!_ܵl{-s #ly3x%i`oajڤ`[POEF(^$	"o)"+:-,+"pN*hJÅ"a¼9[o u<-Hυ(,np{9F=or,a SP20ěH!HwvZ7lo4m"kBX "SG5|!d[d= ww=Hkx;'9ww)B4CZ>B :CE@0qgbqiąxVǑn<$YE?
E_3F^b.˕1k@ZXƳeePT1jv<,d\Vo'|؃̹,` d6 $4^{/`ꚨ[U0^@=w,o@ B(ww*J@2.$yjΎt*39E{:QwJxhC#GK4%lУ-l-U6rsHh=0Vj٬,ڵhPr88`	6iCdO"8M8=i@X9Jh q/`.BI1s %6
xJ{RĄG8_´0r8۹>O&U;	!WoNPi9NN!OݭYht_9c 'E4pҜj: Ol\[=0ʣWD˷^C-J*P@ A 	͂lя,h;,A{Ezo}4Пpt=$l)ry69XƄxꑟ¤>@ՋT`ЇeMPkUsAZygh6Ѣ9הoShx
⭠)^<P6)Yczqx^OQֻqn`6F
sLMOoI{}y +$aC0lLaW>.yN|rp#iyB':dd6Aʿ(Iv)K43 T8ٖK8r*;cKt+;&u ~B( \o,Ԭ_^&{x'#{GxzC`Ǎ5)ӥB~f-W8_C3LKnY^-'6mBfqAhT@-]N#51{VcyeD<:%K{C]~^I^вF\IԵhp7B)l _5MPn"}DXDq^kڎ |8>?f-7%>`vG7o	|p"oQ׿Zz_Xһ]Ho(iv=|pS[tC,
Uzc)/4Ǘ֌!Uѡz`d 4\': 	KW~>0k~9ıS('pSj38؁c.g4[\G4:(C%t~LhgqkACkPhICC` &3\QЀR%%!>; 0S!B .T@4(V [|$D}vMU@Ke`2y|!pm6˻bAox8Oo`W59^
8	"aO0\,4V2[] T'ߥYwWAnyXLz@Se iSwhѬ7)UAuTʽt0%jRdy8b}W%n);G΍),
 -no
D}9>at9bQq">|#ryprkRߕ	&\@T@cݨWwaFE'_4k<|6׵"pZ]7$[{/Bg8 rҚw)"L~cpMD=	hv|3g	a0hDi2	BשMfd07~a^ m1 X"OXX4Q6Bog+fqA!JH2f[[_,<Rc}[J4)A\6ibc4bKfd"z5F<cn1K8r"VLaVRi.EPb<EEd; b3d"!Dб]ȁH܉*cQS]%8a)\ÒS?z9ݵYD+·[lV"Bo}w	e:RSAK
ay,>N\ McW@3 :*(*h%:Oܬ.%]u.«)|-\l]W8o!&[{9i3g@ {鿉aʁ;xQ/rˁHk}X^>7sd]yBwz.:<&<vܜcQ5QGs~jj_\/Pd˹6&]Qn'bJ*1d.F9IKjee3Dll#bM׳lZI X&p w2b_FXGuc>utZMdAr$i\c^Wzd/Ɋzdc:"dZ js 
r;!JߍxXYy\+X.ٮrxd
IMr%o\NZ4eRˈŮ!<*r{֍e]GBzyVds SawxSh ߻M+ɿ ר	˽=2	Cr\8B+;^^Xi2_f1p96S_M)j{Q}j6"' 2B>oL6Od?L.l +"jzho4X^N-,_>ѻfh6C\[η|!m@30t"
_1M[ƣ{?ɉp2_nI)疇 wy.e/r
zGn% lܒ;QcN۹б|ڶǌc*$"F,l8nW6(.n^)C{Ȓ]ĳT:I$ #/uǩ!z%#h@I&|6=µތP(@J-nkZe"?:hNm
1<('g!xk֨{/HL\Źwg<u|A?Lh: 0p@A£yX 7+JaMŁjStS7ǧcԄyY'wp%1(-g迢Msk<J9sgϾѸk2~z47pMxk ~+7X_p Vm+Zz$aT,ԇ3Ϣo,ȯP=#lA=.o抖&-up$`l(|s2m4fbeE,z&A3)Ʉk-sɈ _bv=Slcqn \DQtmEζx>B+0)@JLL3z\bRi4U\JLZg4Scn9n ͠K3l))ԟHk]BFŝ҄Z-W Ǐn,r!U'҂B"#?oIDãA"]uZf~+iS/k6^7>0U4Y!S<;S;$ȷ0L%40e0ynt* U$;o'o_{H^>aZ_NiNipTf:cP76L{g<ɧJ$TbI ]m	7Ŗ~"1,ٿo"9OYq6I/6Spɮ5bqr5«hF3@^$]5ɂOwI&d]R	c BZF$"vCcbv>E5Q~7p>W>Ҥ Dq.s >68E58f62$Дq~J?: `13bsPE6 P}"̤3F̾@,9,ϿSG>;3kwwfaiyX#?3!T($l_@w]KXVeK!	"*,ѻS[кk^(8ԍ3EU*g@va,FSg}8=/E#,BنhaVKJ)YTGdP) 1^bbRS/TJc7`97fօe `IǸ((mBsp)]p~0PQ\`'qty5[d@S baͳt;zwԀz:[>yт|P`-/z[#1{P>^{pqdr^-d@ 2m$#W>bV>A="4)w_ۆf};x*MDz@\*aܷm|+U;-0u Zw 5۔ȅΛNMWm\|4{J$ǢT5]:	U"\F}ޘT5X'>.ɭ+
a|fj9 #!4i$`U&I逦	RŹK-1}MU\|Z1?__qN#5p9vƮm[4CӪUrLԿXv5=JoRKG
u[^u;=y_H6/=۴+ci5aHoOMlM[v*"4n׶+(Ⓘ?[x=VNc@+%V|%Utt;YkP_*X@uǗ)%
JDDq<.X)M3c@ݑH-wK9EGe")ZEbgԸ?sh|fh~=rV-.	Xlu5
70:_/ݵۇ&=7]m9vۀ,64	<\l;
G&J&}čtsbIHFJH^<bP}_3-,֗X2ciYVgLtD	%X`\mO yZuV8Nz^7@|&XOIr6^`=ghsM{i+7l0Hم(ޟkzqLJ$'cryNͱLk=SȢbMy*k{778enc($7jQQQ"
dMߗx#NsPL֞94GwЅwcJN}Ȳs?^Z6zAj~/7Gw3&&-Fth2}]e^ߪ*0]>fR<ɮiY)ꓚ׳	^D7lsRc|)a:ѳo5ޡ=>aVy1BZI8o46c翷>]S@0Y(L(݄q4E0'
|L`.G6Y΅u=ݒV-JVϻLM\+w>ڎ.ԫkkjI՞?a1OU1Ɲ-ƗjtXmŀQ|h0k̐wJl)@-2Sa,ݪ_wLﾓ%L;¤ooBL4jOL!FGm>lD?	4|cK7+O$gK
`]w0T:#mT߾%a>G8S}BumGI☫On}ʫ<g>]@߾=S~+u]׏Tlpf#fٽ6t~B<jҰ¶ЁNO뒂?<8:
.Ц_=|bH#@gomq Z}`KoyZHWj;40\WS?SZ]f#̼4H1Rhr	MIy%7xiʀzY9%=ĖB77gϓJRDY
57-8TYfv`"g QO~v{`	k#Nynf*8Dp0E`9_E[c71x;U+sHc/Y$+*H$.D Hؔ	T-IW(SKs5}
4~c}_FӹHW[PX.i3]sGz*Aot862/Lz\RAP|2V,`%S3fA w݃(а4P."`l\\.%E>%yZ$VK]u˾aOrd<0>#n:] ǓI}oaK-MP,d-]0F3C|  3=M^g6k3L3`c[_>ȱ	%On$>vO_>g|zǤOt	9OBҝ^'Y̈́m!q}m춓=0c]X*]6׋o3\xjU.Iq[u70m忷Jf-<Ғ8;myco(@.,|_ٱKcQmR8)xcӜfpw::ɗgb>Scc_Cy0
vr'%$w~[p[!7|\2&xVő{Z{wW#V$=ig2R/	,s+;7ٲzZe51iB
	,Av.Z?ꃭD֗x70Y-"sz+)3m8W+7#HYvd˝+_5?OlHYߝm-D~PzZ-X9M6H"^}ua{S(B-E}ӥ >ImMj^=sp/!߱>t\&oBIicG(Y" 4FV߲eÛj%>c/xKhaԡ8eSlup3i	08Χ'"&I)Ij.!$ -n ̐.2T0@cKFa( DIS	h&RDjq\{rD<͚Ig+r&.qJpOџ_[&|)LglæOo/EzȺ+5C(JryVYD\,3Aph<tGB˜6Չ}DIΰsT'Εw8ϔ<1	FN+Y7Ø襮_S\LR;0lHD}\kp+bRZā;:ԉ] ,|s"a=x--bz5spz@[nd˃Ai7EKjT#L3/n]	lq꘴6TC^ *π=8x+C}E47qHzׄ	K&zR6[XjYضW&S\		WZ<ůǢh4חEbY
B_<+Pt,]fVcObGqk\OF-ВXcuy}4"b2s<(gmZbFy7)ԮmY(r8{؝;7
s ^_s\ݖzjpEh49twTk+0!Tv{+{s\NczkI]]ipVܵ-~?C0IϮ}ucdH"7H݉ZI'QzJqVޜ}s^{C7ũ|yUdVN)j2ӆֵ\(6}ĉ3 [xt[5w:[1Kq%	qiqϘ/ ljmlu5w-ۦx6rR@@k,48'ϗjJicu$*lh	hPĵQ%U*ڗa!+x0*H3}o9{^-LN P+"l&V˧*B	F"`gJ"q;LLo7 :7* U
E~ccaVTE@	 )Q@<_t6}~Wd{b~KdJ
s%D$#MC(WO),-P'8bj[ȹk-`St Xl@Z>^/4홇QjR$NyP d,!أ5|RC
y f̴SP$n꾁	&ß`\-H9KTPSRRp2mrv$uϪ$AD~6f)YւC`͊JH<PMHu7BteRrQ>HBdlh\e5cAff'X.4RmY]m L\`g/JQDJL'ʾw$jݫ.nm)CP<VJj[\N:zXxD+aR_z0LHk@C@`?EpV#-)Sw- g# jTno! n/[x(G/Щ-P] q@;o>m`M*@٤($h8=Pjd=B.5x%S )2z3IdqeBgau/ȏ`< =ٺ?L.@sr0RWTa!tۇ~V9|>@,@QgrIj5/yy{]T,ϛݮ۰V݀'[.{S'Hԯ'7\tOj9&蟠RآD+H6¡1@2Mw&qnU
ʁ/nXbH9ЕxNٖq({޻l1˦D*6sd^#7tP괌XƦk	A|RJ/bIaersJi3r0Х,/OL+jl+rʹV;W8䁍- H'&z44Z!D%E5S%d88w|`E"fdq Tkb0vK
é\~9f@1캅k႓nj8p}]NFɴ<wԀ;=|L&yNaF,@q0IL;ayTۖo0pTx1`txV=$uoTI۰=%okn is6񰷰I!lRJBQ/dRlUhu9oU$~3;ѢRvC.:}";.^xX
BD0+Kd._g^W%S{ē`tВiCE@
$:[^T/TbVQZDMN7= @<9(
rP4\j\NюhzK-t0|b)<p\in`%ib5bv@P5*VW fa{=nI*;A'ҭC)`Z@hhA[}qd }n /$ynYKpi=,u,HDb#ClV `jRX nc-tAT<P;T:Sl{_y٤SbťѠw}݃IsLݽx\!h W>ü`5
cuꋨu3H mPI N}s?2{,Eoi>(ۘƧ5&PEXc
6M7m 2@NnDXS&1eyLzg4^K<d݇y9͕20V~u4]jUB\hX%B0R~XiZ!H2-;[wq@选ͦS&57CSM94LBIʜɚZS*1itt*;M.F`ǫI3\Hd5|yﯲ--o; ;~Ey`mKhj_KaAbdidf3ε+YЯFY/3)G.b0 1
7"'ef䆸\T9=dFዣS<zog/9L׷lVm_G?ڌkmt?K+1!dz7 Hɡ&@"P2sCh78	HCBE"H0;5b*Rd9Ba#dd'Q+//ЮO `8Q8Q-$m1Y5خRѺN?U36c@JiP񺖖X:ig"jjf&R*H H1p-q|R%H C%OQ+ʵ`uc LĖ|$TSiyu¬0iËal`AO҉7OQ QxeۭƟmO9'	6`߂te5	u#zhXS;& HcoO	vMC6$Aa^](lt"hjװQVPzm<|a'FnpCBF0YjC4_J2Wօ3ÏK޺Seꂀrڪ([i毪NëLs#`hn
N~öm.fD"܃Xms*픩(7!]wN3ܥȟ!!DKB9v8V CsB<3RyGAA4YC?5H;{jLWaK4%4/90T+ {tpЮ8KcHÉȶ<pXHՅY̩1R)Rv$.TԀKŬΚꎩLiIDA 4{?|:Ef`:7\_N'PoM4D\4q_1ޢAhm12hh +C-H;&J*qpEE;HGY1dqOyEC#,ZZ`V]_Vhȯ\4"!V\)-֕*ڎU1>kEUܱhrLEӝ`HE6QWPJU):N¯M[/zmB)	Hf)JGB+DQX)!
1m7V
h`E۫ M0~J-tiDCՂ'Zb'ZB'6FN`UVV7BMՖGM4~/hk{FL068^U%TFK1(XkJ4%cLHfd%ZPD3S
hq$^%HbUH!fD
h(Pq{gEG4+ha؈;_Ѷ22mFVE["EE4h՘	h UD,(h!Z}!Z+EBp$Dk#Bq0x( 0!wl̾0w.@C;Ѯ8V>C
|uu{eCڪQEV	zcP4<@rCQ@aCK.ж8ءh-}ACQ-7:Peq

WD9AmmaCK"
EE'Vo(07ڙfpCQp؆vyІĨ %
jaEuZJIPoiheԚ!Yũ`U@C5&>\8C--+Z\9Nlݡ->d$C1
d(ڑX+(ZCq^NaC;Va(W`([P ,_(0/pm-ּBB\P.@%qEW[hu
+h],WYh!}")X(*Y+^p"Z\5X(RP 3TbB@NBQj8g0
Q
P4laU!
hEBѳJBȳ~|BKZ:E'P	`ulBKЄ#22h*	֍K(K(R6`="&`}"Z_1 K
T_PahvܫZXͪBZ\%P8嬵f!՗E!X=1Eg+BE  -=V?hJW>(z>h'ǪD\3<heA4C(젭2ՃZUbB֍8(W8(ʬoPt8WZAjAKb
P+GeVA0 +D 5cF`+Dͩ0h̚W|AcZ.(|[P4{ЂvUF\Y\A˵
-_UЎzA 	" UaDAʀ_a<A:%}	s+hD[#EIP443ک"hzVD^dZ9!hoUD5@P((_-zxx%mVh9PeݶuR_6˃D7	(zubCZ.h~0p-֋(ʭ,Pܐ]3VkP5#
Wh*L|(JA1 "PT~@QE[W(Wh:mZ9y؀GeE{#
ŁPA\@QgYX@+qW
hgZQP@ѲbVТ_-"mpY@@ьuPDh.(
B
H2 (@K 
(|UP (EPR PODX7|i?KڱDB	U"	h	UY2b	* -'@8ܟ ('J	UbYmH%@`?Q~0ai?WOԾB?]OD,~60:DS*qglt~,7GE6Gh/SVZ}gsŗH	,#@rIoUX-C;(~1  zrww0}]e'~7#)n!ӊ`n-rLF%mIx2e۷GG{=@6bRRy4QNP`ݺU=Uhq-<Wg5N0Ԃ$<ێ@7Y~7	t3L
p܎>^ϯ u6%.gI+FYtC5*
oMŷoI=?)7iH}OuwS֬f
CHlb\H%K⑙!"fPl	E0)P1-=/?<;1`}n?yl_ΎzQOaBeoP~Oӵi!q?aROF,wwwM;@%Ӑ~?X
ݽ*(57

[ޡ[wlbЖ8DO7ѳ0lĚDIMz[5E~<EEggDR
\0ia1VSM$S卸Z@"j?pfj^j>%ɓ'_fG0w7719]d8Ax)hcGbx?ZDã3j6LS~t gȫF4N;5(~e*00B|nuhjOǋمMBU0_i?!኶݉{4~rwӲX}.쟄Ť3LG*EBsif TRZf%niYs˩@"ӆ\$iB=O5j>9*Q\bߗJId]]}`nM/&XRdqiO+OY>ù}mMإCI4(՘jP
4Fx0 O[7s9/E󛼄mک٫Lڶyx2_uѯ\0?/h$
QR$MY)9<+$uO5JC+ē8^Pдc&CpvxR2ˣaRQweiW+gfrr.*3[.hEKh.<&xvqYE:%Q#$pB~J%8qKXF3M7Ĵ> };
+m4͐@yTd$)FbT?n*z94Vغ 8q1?-I	G˘/̓dY#=rg|:>vcKE͚1?y.P*OgoƋj->1ըϚ%Y7nS"CDd!FTO@azBtVˍK) h9<C.7:U_݋]hŲV$	d M\m.qjT@J7
Z+Lx\߂MuomT'bߢ ?քj-Zo<`k5c_ *IjwPwBX(gt7o3c2FDɅ$iQN46M+ۆZf4 <
?j	2Gj k^ty]n'K4ͻR&j
ifx|[ZY;qZP91)B']LË4p2O?bJ ]jrwP@ynU;:5~IXT!2h7ZӪBWh8GJeۼauHf3UppQTp+bKRAeO=.T8GLv2;^8G󻟲;dn'5չ>y[(3?~3jCEcQ$Uva׬ku^)K<SALQ$86nʷkn0Pfm饵ZITR3OU:)Q
&nw3_SErChϼLȎzgib8jzo~;q]Kwv5j9XtD \zNɍX+sli@4Tÿv$~;BIL{Uړ|I{@{rYªbٕxyYzdi?J*6LЊ''*@Hs0MӤ`H`3Tpzrg-j ݑR/{kʪddQ}zj;~N>R*p)ѫW+WxVnKhƅUN%*8-Y).0bk<UP(:K.LQk_G!kiłݸpr0tec/,Vt(r%Y_}DLULrV_lX͛ۋv+mmxMʦX4}Vͷ|\ym)G"akEccCIǲUudDstS_/.0+Z$s0b!|$~kJokq-e,ڭn߫Y9vC,IhE~Rs!)o,Z(Tg7L~4ގj]:L~iPpoGγvf~Z>]cf;^A
TJWsNq>TJ>_ǳϓvysDqW@o &ٸb؀TwG
<3GqnY<oka:
T;H{[pO?xsc2_mэ$uz9Zw@(= 7w(y6$:M:C>яOկDPU-r5ݛlzՆC+kXьk\/im{+(О
H& E\z()&<܊s5v"yN^⹤Xe]f}ow˸^gG{\ֻ|O
9HjCEh݉ܼ]>ޯ9:.Eujtǅ{iRIX$`molSxI@+E͝}(wQLwҿ+GV Aփ5^r{N;dy<݃@tPsѬ!u|aU#]QyZ!ﯔNԄri^|}vm,dOZ?՗rlY/,zbV<X-tP"XK&GR]A|˔$<~w
N&X;:	Xbvk.LeV=	R`jOص1G÷u\"{-lC{YG
w0:췌6Y>Zsep0# Z/
&W}CC}Ј/1܌+}IpoT#UÁ)<Jc%Y N "Oځ4h?Zu|Meq@".+z;%y	
:BqʪU&b]u	QЂJʦK$ObWpTH=Im
$S?el7k5䁵6N@/ǟ*.bXi+ڡ&#sB7aYTYl"'g<V2jQj^,R7߄|Z\(nJO9x4"2NE;Z.b-sJ4jXe'|Dh4+G=Nֱ/ G#Lz4*&?ԫCYAQW$6Z_@V5_q>oOa=mrZ^I+dZJXtEp:(ֶx6QS_\.<x-lDKZ+FljܶW0bi 䢈
-U<]B1HL?AoؼCXiy"?`8T[d,[>/nlށ
!ÛtE<{*/환pj!l',Dbcu/_il(%f1)ܾm6{LV:1qHemG5nOX݀݅SXg
ӪA$6ABŴ]=s>h?<ggG/opM0&Fף@pLm(f9+V+H-MKUo?!$?`x	KpQjm2*jZi|pT51uoknN#9̉Y1S.H'Ӈrlh2>CJҋL=<~9(ŘXwWM
E[5ES/\ѾG*뵸Q@5}?KuװƘu K&7dm$Vۍ9JyfBiF?˽73iai[0`$G\G%
̌q6/x0Ј}[IENO䟏dz<GF1ش\mTti19gdEUmρ`՚#hf)bTJnA;[#KfB=wKRvљ`V ^oU YQA;P?MIиݶ,Hy?s [/\?a٭ů㠻r4X,2Ddb$JYNh5N_<uͳ*wΖqRĿ]dg-Pc|JE嬼h#웤DLjη|}V&P){q W;0^=GV(Ir;ã
$uaAP)-V`_j0rtÁ*J	5GoYz=}v[+/lle<6ܤxڠ{5MH;e]\UC0)_>gU:D&/Đplsotbp^"3T@=|+s䫊lš"x`/e=8_^iZ@݀K?BncG̞RTnݍ띊*Fy!\h!jk7Vƽq\cRU!k.O&}Tl3^Gr/vwQcZSAGs%zQb6KˤQ/$Viך\BC*NVڗ[Wՠۋ\<'r8Gt5×;|wv{G>z
CDH}"B+4]1zJ=amT)j92HqtPE"dck
H:[[%Cx6{HkpRIzcVrvh1#͐-w9Z%o{w7g
:Y^θ4t?"BE:*epK[t2^t_ݲ[͡;l`qt-_)dc"GcP5oYz5(<$ȵTS4ȉI+㼭8Xd+x|pp*wp ;.(F&6,wB*OvmfγBа8tP!N
M@h.b?IE]"
ݟP9{*r6m*N?i[$i~ZxBxD${w774.o~~qp?΀WUrQyfhWw2Cs2zrv|2>Āv)ˢh<)r57ܩ;c(6WFϞ}oE"b~ǿmmr&QБdT s}m.L;BHf4?~ ?UӔfԠU6.f换)ZM)6DRm"C+z4T)"zxj&هh2Ƌԛ?ɓ'Q4¹*
/Z¿ʢh]ίLa4^y)Mep$|HMgI%̤DWai6G6~wSԆ_KNF\:) ->tlٟ.d%wHcL.GjsChJV|6Sp-Q"[iOY{r5	ÇZJreUɤm+'AaCEBpV*>vVuÁܻs{"5zЩ=p㉒g l@,؁npN3_4!y\\*+\;heӣ׻þ;˺^+_r,Di]nµNk}!{Ƌe)1l(SQ;#P9;?==ZmĦSO;]ό@Yw|v<݌ޫ[(cg]kpLCW\\%\_mt4:};!u`A_
z|Xcj0}?>??U>N =uLq*ΤZ 'ݓW5?O-j݊Ϊ+
)/|9'&6h"A')o^@f">k:E@v'G[nIji`G(5Lu[ĕh>$k]J97 ʂy-4kR-t|:K_,yXjZZ'Tf&V4qo}JWb (4C`	0sr
wG!6\Y}lXbC_T~aÐ&?AjI+:2yBj]vWͽ)X*Z'\AQUt4N?dK:QarIj!Ku"UUGOohP
7?@"[1?$%|K|WEJ"$}f1xH:"wu=[N.q~Dh 
ۂ~~ER{Jm~Shu>D*%`N+*̣?>yQ(C
pPa|o(V^ֲ_UƐpd/9+M*nW%qhm[`{Xs$S:6{ˢ0GJZԈCȱsi"]l~ /_,9|É[_LƗwpvG"E#5F[Z6چ7gmd/&ɺ^<ѠzZQ?^ng6uNXfk]P+|#4/BQ+l'
$hQ!Ё6h(݄ʶDYn0Ie湱,vd)o#X_ Y(X3rWӯ̏nyHSr$0>8%JpFEKubvZ_tpF(w/.L; jO\r-_eKC	\ջ-+/uX[ǹcQc܏+ŗr9G+o3RUN<I2{)O3N9yCG/D^0em/o B=
Ò)Ҧ8ͭd {?oZ)f?<A`FHlf̣ 5dͽg܀GGOww[BjnUÖZ)*ֶԤ
;u%{uy암KӀsSDj$O~~㠟CV@?`-kkO8hNՔIjsM^G7fzBZtk*	G:^T+08fPn[FJkވL8M>_gV&qF?G'^,?%J7wt هtN)&ZeI5paTɣÈJv5V2^2puRF9UwﵭB_hM?^P=Rpg4NKSZC~=uz7܁-H2MB's)	hU rR7RӞ?J|4^d]8olx3#Ew+xjbA{8fX9op&nkg}s#BV,dQz-aX$ZE	`P	GܫU	+Hk:poptl>FV؛n\kOA`lfy\{zx&^Wq5C5ѭ$Zst\]&.5`ޔJFRւ?W<[ٔS
y][L`x]][Xߵ70ja#+[dl~vOCHDV8 vh?4ZxV]^j&x:^\e
S%UK!H
n܇4V]b9V"\~ϦKPfp:ϯ)ҤRiԾޏ~jhbAskOFE/6}nX-;fY2_l:y;+@UzXJsdCg(fhrZ*.rP\'^w/:/
FA  gpCb%lϝ 5V: Z{ޑW`wO/jX-HMy(44ո-FVŢJ&0	ݝUP@<48A_Y䜖5s-¯M\1|E(x^Lב&
Awx촢pa~wVwY7nҖڜ34`2<*ah2g$"Xh͖>wiDrn6:qnTu~dqUJ,
J%A%yr~LHtxѥ'Z?abqIuOGF/2*qjЬRevS
aX[yJS{PG }0ͅ`NK[ t~|_|a4cAoW<q˓6ǡ*8i-!HwH'X)+Ɂ^{	;p/ !/`ƺ489sAёs8v1٢+UT@[!ud]"yI,)jb
p˝Kv<߫7
~R/{ha_`ZaJtC9oj4
$*mG/?Sl2y7:P8nAxRٵaߚB}ˀu߳r]nw80z>;:|LoVBt]υ{z-ZfȠG4^;΁Ir <<mp`3݃9!:ԂH?T:N sCikGJ툺a/WpI')l|6v)8}w{U0E`j?#Z= -MH&SEզҡ$KZ=l(Hbdפ#{1Bcxlt0}-|Zi?OʐlacbFZ,qdw%a8eND+g{6WP= bM0<ȅ(03dFd({+Rtp /9RM㥙eR(*-5o=kqrh4~Kk^:TG˺>tE1ާp[_RsH>[/ h= :NozPQƙ\^.JuFc|*+3{7՚:]uw4ip*qU^6[T ŢZ`-J\WKM>t!`xh7pwɫ.WÖg0n}TH9"t{te2/IXABܣ]ji552^frro{]NA}n}N9(]eLmmi9/rB^%S=Q'n{r TM=j;P\H50-φG\{Ný۠Q}<Ts[Px};C<3~Es{i(hY-ʅW)GSqw.^>e{jHbs^mL[1]0.py;Ocu+PkS&Vѿmj֗];v@zqGG{=@SC4tpA5?>.ݻL>auiz@܉3o4dû*(^CۢabRI4I%O%gcjZF4HD5di.U'۾.e
^$gH[:uOBOû((觙d?NVAm2),&h=ͺhpTQUcɥ4i;}H"+j~ACT*)U
/ϑ/7M_vNzRQHFT4 7ڢ$%VbT%,j.uim/Gǟ^qguko[
m!ŵ7*(ָ
ٔIg/["k{Tb`1h|wiXGlxX(^+bG6d-b4#<yϯY<*liOà@վtQIz	_L,[7j&læ÷Sx^+n^g/g ڇ܂Ob)#hD,
ZQzNF]%KTRut;Y?U36z7xnRt28-ƒzX.,yt<C`cԘz%]L-*h*CQ#^Ѧ(|+MFy؃Y0Np-*/ [']40h24805jx+Z~nf㩍fr};>s.$ǲbY9@7?䏳TN5g<-2Y#N2b~EEm,`U|<hy7wD7ڦxEn uvLV,Ez|>7`q/*8oR>4=nsO3bЛ	_2_w7Sٵ6ɛ 5;P2qKt!*.jx+䳙M"N1
=-e7Ngl>H=m%qxlar'ؓέES,zD_q<nN*/<6o)6-)e-rlq4(C/}-f߭su5_- 2מ4cpz&E1|وzs}cWb4
}E)0è[4k0t<}_]mۊ]LRԌ~ZƢxN"'b=.qs__PtU,㶛K6ݒ%YqiOm~Dl{VjGsn9;9!8ܬ(-v<> 7zI+=~(~/xtCǍFS1;73vZһG4ώǕŕe9;#x)D"$z5ZUږ;nE굚-2λeb`Wq]FGnEHRbc,k1?6Qoz,a6*z';Grvp>o[:r%^` s8) ٥ZϨgKvm#D=۷G{=hEQmz]baRjt6{<MѻE#]#Êl]) a γw4}ľ=u3ʐeǄIK/u b1Hרqt%[G(	n`p48c{Ճč{{=Qs\lOu<`}0P7\4γ%h\65y;x	{- RqE=Rsctq糋LiCiw#DFdHK<^Fo!m]?}GXenji4:ĂF2<);_^4vk$~՗7t	ԼzW6??ϮotzdӋJui37ϝ0솈6NbV=sɯ1(T_)8 \dp*H_^vq+[Y A~:=%uELP}bnvnJڨO̇Dmc.[ Gz }oa-'9O`rxS`
l%q	{i>?C`# TSs<"^WVI{Ч'ZmaLí5%,jso'ۋGՉ6haĳUpҙC5BN6X feylZϳ"0+]llRzڅ)~;J0˒U]uٳ+KT8s/t"Sf>{?]?1WY(7֝|	kR!ŔXP~o^dZ`RejQՂdgȲ%K ^S%"_^

/ʁ#s3AJDsp@96!$Øz4ԡ@ߕ2b51Vj`Fx;yG]Ip!TCTG <2ņa-QrS&%%,T{j7|?]@|TC8ybt&>YXvg&vQWغ@{=ȷH?iUFR,o߾dcnS|gi}Q7JG_svo(O޾~qt9Q+Oo+q>u!hFi>ZFfr.*B"EjrZܶ+_8{c΄[?L ,EQɢR_DoIkLu-n~=t?F`4"h0iC4Zѷ_/IHP(m7_{mcldrF}Q3v2FIl?z*	־\(Ir5orCv?+){l%kVvbhpS!0]_R^	C0qjmmEZ
[RbBp'sn#ŋsѯ_/~zœG轢VmGa@ z6W)qڨVl*HI.Za]<Uv^v5F}?l*qZaݾa?}DSnPri;ƣ1i^'TDC=~LJ[
2)-۠JgS"4j/ɁtscX<<8YOzWL!<KNq[9;}TJS'of9l`Uw5O>Ttz;Gjsq9}lqߥVQ7}X2Gd/xV`?ijmϵm5B`z#
EyNmCT bC{@c;FQ-'6`ii$dy@Pk38*3=0RvP󖀊j6E&Di\FOO}
,J	4ZY`rJw];:9ЊPf6sƙݎ\d.[
R !>9m1&:}b6nV)Y(`u1ˈ9S٢x~*6LkҾ1\LgJU.6xT1bCAj2ޫ%T#u~7lBXʓL<֑de60@c}YEpӸ<[ZO6JdV8_t,:ű6d/n7]sǚ4Yn,LO%]sq	$PrSOD~7^?0_/{^hȮ-
-HEV/
]չ6zU|ߢ`X4/nChUxDY*sR(<,(; [^PʳjqO_y3wXqd	5=:0Şpb+V6QK\ˆVQ|>uO)p K<e.0&k&-$8ά?],6ݱiDboFe܏L	S{?åfkj]X*]f2>ӹةQ/7:}Q-/?}Ȱ@!%1Tfҹ9rtZL7YD>}d~-RDrFm++SxB5nf">zQ >F#:W>¼,W9Ü"TM܅޾[dSehg6H E@h.U?))Rr\`R/XV\ܼcs6~޼=S Ct7]k{'yh)~oO9[zw_/6V2j8ݓ[k/L!2I0s≃JϦJ,O\vnGt[BpS9Q,;֍}.xd75aJ׏)xew	[XE:$RX;G;K5Gk8b_Q* >Mvyz㘌jx7bv;?'W
1O1}Z@Jk(z7\{-,Bg\5`~Ox0d{?]	HK,/ ~HK%'w;ό> /_%LS@ВԌߐ]_]:GB>K"4)y3$:z6.h75Mww;?=,	Up҆1yR*Litj#^X^L\=gGhW])
&5MiԘi4_fasXfq<ڄh~=@MfBMfB"+vrUMӑZ.h~~e|q$.J3L)pv@I8<;<Dʹ)y&4.G~qAkl~q2ݣt@ *R;}U7%ַ1988z~z^0ŌiUgƅ4E(7"]dٷִ^eHRƴ7~?&?8	wtp \?z@oz@/Eo?@l3qRj3:5VԘ^g'ŅOn@ОIѐKuu7T~BsvFE!MѯO<MǝcnNXxqd Bc6`=u1\ p?"1C̀ՠcc,?>^ᗶfoϡg^?M1ed1_E%3|,_{JJ|d-'̱ifo70@| B@K@<J@0yrF9L.ĕS@fD b2#APΌ7>аų̈́| H˘@<(W/\Ŕ5®OAe\=	[WT{%zpjj5^3TG;rO=#Z/>ǋIݵC89XZi7F}gݿ{>?OjX>)RDhIƧN;W.ԿLdu	(B#V/j?bM?@0*!nFo]$__MKoTm"TRV1bUMkTВ UCWzU[պG%q[0# <rpá}8T{ Vy',{/vQ(^\A.**}8i]zMP"DE𫠉BwL\@J	5he*MHu	;+;XyB Ջ5_݇áyZ&է"(G7[|w=YD#Zl:BXAh@Ngvh6Gjt4
(mSodF77
r(ҩj'm-b('o(_rr×0: k5 O6+C_f#Ʀ&}tA!؜r5Z\=9(P/[Vw
n:/o!ٻp]|[Ed="la8؟6P#oWX,8e@ĕ< qWpu.%puQBَk5/V/U_WkM?Oi bjq.q+U$VzF4X"REbJ5Q(}@zx@z> ^.°v{[v	e]=3< G^XjQx@tQ!&ͫ^uQqYhi,tQNQ3a?؅E4cKsNBT!SS6` mEs3l6:0aNݒ0e5[׋>8r	SWGb^+3 ,]hƞ	⻻G|ۜʽ˔y_g*bB>i.=vQtJCG5GzcGR@A "p@@"DHGxbLS{+ð L3Yhy@^#<qv29O}DIAse>RlDȹ/n.'bʈN/sKe#,H޹j *8!\ G=
zA]'1.SӇӯ#sv7fs?<>-Bz"Z/Zh^@Z* fSQ4qDnMv}?R^ϗ_Óa:viFz
~o0'{>>to'ĉNã!Rz"H}wx:BnnC_'ÓHiTG
px/_&Rto:}?|ypCza[xtZHv4|0AEOo*HLѷW_ Io0(joP/e
l$*2OiC\0Q^
Uh0C{ýe=VFVUR<_wDwq;v_XB3r#S=
D'P1)g)f(	Rsj88"'&CR/twOO_(ыo׊l!NOOfIۼ(v={}]u٫oj >?ߋ/{ژF$+ʚwlAtE%d-F {{:%(I<'㖗ٙ}i2#3#####ߏ][n~ր[:ᖤГՃ#ϛl@	=Lqlzu%pϤeٵ3`Nf{+!8VdmkF}lmͦJ[=iazǚI2yoJ2f9Ŏ?iU&$6ǝkБZ(2su½݄c.{_T\{os#hrp>72HrgO\fc}P֒BDC] ;|bF1|29d	]s.sjHTe!,ަAI+mz۪nqN(kI Ef-ri,s&?<q2rr֒\BujD$(AU]!ճ'YRW6ۓueOM{O\g=J*^;QDo^2VLYgEw]S63{J P:A(]c<^CFO	TrQ~J3xFOʎesL٠ޙy><q	Y[uJx+NC[)82Xmw't&c	NSr8~xbwñUu,lb,^'ҳ탊9.|C*X	B,m5'<ޭxtEv8 a`ԷuKnZo`ty[ux/])O5-7V-ϱa=nn`3 hXسTڃ
u<|k[spmץxsozjPB{: vy^ۺfh_owb@؂Ʈ: -˾ڶ!>4*@qm?fq0M[wHC (u(]rpPc$D	c.0s&WD:TF\pXdj}s1)j4kНWǐŖw$$G)&/;q 3o}]mi!23*Uh}{{)LNVdCڶ]hn72R:~y҃ه%Y[s']=s$}Ʈnk[S\8;LcGͥ=kkJԲeQ4?lj$ 禅hJM,]E0s8QִՠgCwpg44t$fv4SjߞU˞=]sNpm6}{b0nMD{ܚmmGmߞm=e4ذ·Ym8[ѵ;5'`-IZƷ* yMAt;d#{Ȗ+P
72d( +BI~RBxR>}bkAE_}QQ:f9K?4{([&Z]b
j ֑q%_G9} t
@+PE[Qb5P
 4@ m?hvP9}Jr[-rq-@@ނC6 Gnmȷ6 oZ1q{el66_aֶ[柝:ځځzfh; | vHv Q;{`h(@.80]hah`wp}ƲfV&XeXr);Z+%_qBC
t~	~ҭh JM͟ZKI7שI=.%|j:ytdC
lKI׶>\2N,5ۊEuoE_`̂pB@Xbg}s\at2[=7CƴLU F,+N36?uv­lnO~o~'>߃3$7wž|.SԺd1de.֑pB]CuwR~ZCMŋxICx/oQ;=ou= n+l!_xπ(=6Y )  $Hd`W&[H`@:r2#Ȟ$M`a_~pY	ZX+F4x4=8ZAc`I]hsV<w*1Z6ثM*jAE16 \Y͒^_w,6l5pϻkiWbe"hhaO	\ʹ^T$A4k;
Ԝ4c"*6Q# ~bw-@Dymμa ^xg]OP1g[zMOv^xҏ]nkhzQsz]W]BBT?RW<l,Lu XAⱤEϹCu!k<1cyУ:U31M]j >&[PM6v.b5T`C<flٷ>>تQ-G<g.}b
$OOOYw7#*I[
VX}HHt[	[q0IaF٬wzC+G=^YF^mF%;=6wU٫< 	1wLx^w_Hzq`p譚OBx1f!;b.Lvz,~qwUIG_/{yꐁoj@A(o`&¥IJ(a~mAh_=C4{н]>WC{/0Oyʴ>G)ׁx=ZK<6y -s]lNPcHo^!4dMTnЃՓ_=Ynj)鑈CϸaBUǛ
wúٱǂ+T~Gb=6xV^>K?U'qD/(~֣cGz+|);^z[Ѭk9~Fl`j7%@xh<K{uW1忈E'.wĻq:l#6 Z^^6zBF!92E	l̶ڜG$X 믵	$hpJğNA"DYZbscڇmoyCiyd]5ʶ"tL2IZCbpG[X~PN>#Y9y} UI\!!iycg=<7d^7Nv>4j>Kė:
%F<:xeWM~.>հA2mԀ<]V~t@`T\gM!?8o&iLAM   ӧ/SI\TӍy4Kl?~g>tڴ	-̃x%5ݘRc":\ҜRTN-.{Nm.RBv)d"\2{\F9%9s!bsX3hL TCHy׼)Fbq%WN6u)%hǽ'('#\	yEqpWRI.Iz+NyN)A>"ܷ
 ERv
	y3cr

SFL^]S,Ȟ.WbBC^A9sf:2Ҵn)r
K	KE*)9r
	Q+g/<SJoN3yR`t9"TC+!x/ )Tbyv4NᬔSHOy4Co;yRP̃v oa=`:x5۪v_))cK^)A?*
	YWl*WF0üBzxt+&'Ndpbѓr489Ry+YN4gWrD)gmm_Hyr/2)cYP畒	@x^!A?hy77yM<s3;͓e"1<~.gHN)?_K>sA!WJ3|)N2̇[y5`yJPOZʼRu(hsii'W״Bz}͔[RcV斖Y-=6sFߔx7=ﰪy*su1R)@vn)<vF;nrN3

ɼ̋>UDzhuHWW7OJ-
dwR2<!8+e]JG_Bռ?K+S-%7yuC1r}Cn=]0䕒9<W9Ǽb2GWImiܒf[]"ۆE.Gށe&H	_)KP-p-GgߌeFY՘Tέtjetyֶ;x-\B`,JUoT6_!9V.`0QuZUdRcr )ˠO/;<p}mb!v07(K
W Ś{3H8pdPE@_`_I;&5x\cW$].MZ#ܑ#ɸn	B"G)UlŒ*;f?Y4Mk6*<gW
 䰤xɦ{{U(nBs"O];GoeUovfuARyJyW9%9F	2gAupIuOJZU="}!9:J*hrfxq	Qƀ/mDL^0N0 U*TA0w2
aJ%F\SO{qn{V.eLbkImaL[ZQn"B}~xwݑwTKbkΣðUd흻]kv\{oܟP{kvm@ռ)Fv3Ƀf?~W;vmMӬ5[_ـ{6
ۘ
>&z=t;Gn =glpP^8QB0sN~]9#D2PS`z\nQ=.=L#)EM?\
HCIHL1Z $[T<Nx5	044ؙ PPɥ)o7Z+]=l %<ruzuy'E~t^6IܖP
%dέԞ'Hb,K;>c<? 5E&!y\{bg^s	aV>cRM;R0@XV 6Z$RLԷ̾<<Ih|!&*8#
1TZYkǪhXh@Y|,|#D.@7"xb/ƥ2sS^sJ*uxnZհ g(2
XP;Kф1n>	

NcT!"8!}4#KgXw0L"?0/^JSӗ F`J_a=KscQ$vaĤ%zA(&FuksLiUBNT&3 p~9F!Bip8KhB\YrƤ=?tcׯl>(F`|	x5q7s֜JQ&.}s0+;G~<Դ~<Lh03koj5OHx; H(e:CI*!S$7-F %|a}#7^J2K-Mm; p`p+g">ш9|e:ZhFngצ%'O޴)5hufuR>xO<_>o'oάd\iߖK/|o5TRO ѨF"0A0U}>qtS	:ò<'!]ۧg/j|kV&{펽v:l2	=C$zN@NVp^ |%z6]
͇oWKy^v%(7M6BY+""zr≨; @V+ٓ2ZO:to9eWu)u
r[k\unK"FR=̒,]*O]VAtx{x{vޙkxnRG2k2nimgNv;͢(f_z~CQRW)uU ۷g`cF4?JFJKNVQ)WzRz=KJ|=CĨgs!)̌מOd|kl{o#+Qq"0xkm-Qye:쫡]A#-3ÛpNi^"Qw){7NT`&]"uƝܐ~Yʆ7Yrρx_w:'ђ$"Q0U%(.UhqsvTQtʩ|nNE[/S4ނR  ߵ~Ξ!#gLX?XNȴd<vm(>f-'	Z͂A+~5CV>ɽ3o%bɕ^ruhiVÊ9 Jµ<ONӀ21w0?2dBsbkΤEܧsIG)Obⳓ)T&eQ7;"z|J*j_$<9{t嘉H-rSķ^TS?EyG_κ&eOt[FqN(%rLL	MԣlPT/?yptZJs͋Dw3QN9AeɲO|8K	iKf(H3Q!{('az.:rbr}ء6
(]ߋ9(؏9?8ӑ_l'Ta3i9O,~s}s	?cw:R֊s]rx5EĈGت.V3zZU0vxK)C+G/`=Å7#*"j)2'%GF2bZK9) ra{V@$}IXU[*iAfAEVJ[G| l8j0,E-fIbb?/JKv~
ڔ1ſ7"Oo#}7if(xy5,R.&T`ɭiMa6ȀuNZN$=ie.2rSFgԉȺݧ5jBg^4+d+f5;lLtwjps&Կ86 ԆFlԂKX Q@*O6ei%h?HUU1g`r0q4EW)`z߿o^v;'žHF^U_a!FLURJ0+-XmJ@Z_y[֥qyZG`pPt~x4ȺjΣq8;c(oqVl1Uݬx5SyQ¼W# e2Q[C#&k^XM	̯K봰^x?dML+B(*N0bhFk
0ۀ@[B9kV%Kp
S2ᓫZP^1~*囟θN;>D=R,1onYn{?Ir\ꂅ$-(MȩzyU
z+WA}hTX|mTMOe6Mc4K=%!*"D1Uֺs@JMtxIYs˚V]t~qfֳ6 r3PMd8sO-q*Wap+V9z)Z6j`	o,yu,h?\o:բCԦsHBmdd˒53hhHI([4y$J+VXvV=!	[T'y1itvKm-SMo$gai_PNf"?'W-g@ ֪ݤG$dg_JXy|W.0DFQF{`JF}V`NX dR+RŸ}tDtpe_
7J %1 e9%_~+93cG;#~]g$u
/J%|onP{/z:VD ^U|:S>wfxqUBY=-7C6klsE|wO,w<;_Le7Y$qmu;-og tdcZ&<=J-?ky3GeG)E7VZ1.D aR'1|Oaϗ?}'h"%tA*`0R:(*8P"0B0 5:GB{o1zjWPKx9(4,3]AP!bQ7I y=ƂH>(:)e{ FBzKHW`;*g022m;F5_94V)W	>27ÐZgAS:ɺveg:r{A?z(֟G_*P},1Ծg'պ `_¥dԚima4V7xM81ȋ]g~ss&7=v8!NKzj]T3D!MI96sEk۽ZP2KOKWnÝ
J^H2rn]`:IkRibl\	m ΁|2t)Hn<f#-5nQV
l-5kNмV8]$TܪƬt*Np]ۚP1%GgÃ) Vmy!8cw/:RCr9(.[߀
r*86KE:b<lRi$㣫3.lR)\E1	ZNT)"jNՉrl&RHtHr@Kh҃yh2qV[H4PA띖:&je[7[׺Sxc&}}aYBf*^4. tK=G<Q8}Xcc@2oE&l|6Vɇbǒ|6BgۯHK㽓01K|m:+_TzȀϒd#=|;ԁWxu̓y}PRܮGЌ-b̔UE/ENkYW)GF Ͼoy3ֲ<(1kKqvtt vSM\&i$k\ۤL[k{SdoNT.f|-P}ͩ KzVa`H2U(g9싖PDkYL?0(9,{8&eå\ޓc1yhM5°A3:<g>G`Vy~7}[mSk_ׅ`ʬ%REX7BA9e!(ÝQ[
XK*lo'a|+ˈ<s 7" G,IG|>&޵<?3>7jc18/D2Ǳjgz?/s6
'tk᫳֍:Ny8P 9b1hALԿnhwk7SǾf!'PP^`t5A\8Y?8BX?tS*P`p4Mv]F;c9#Iۇ7: E5"WY
3
|t%)Yv9= mP,H(0%DcP=)uEp>gB (|b_V.0&S8
:=oޮ?=잞A!2|(!~NaDES*!v%ZS-L\K19D08Uq}MИD! 1GDNӤI84yY>h[0.zvx̦&۲qozg~Ymvmx#ӞoD_D%0WUs2 Ki00.Xmg[C&1n-MoA0!F!@}
z|r}knPT 7F*lZkwޫ0!>cPfAT_G7&e/hK"YS0'GPup'
&F2Y0|=^TC쑤*`NV}sYHJ5Uֹ<$v<cCiH!:%­ik,h.m3%MU<wz^]H<{KhL~pbv"kNY/9ߏ݇Xd5jRU(r&c2w3>LيkIy%`,>ZUYcWݺ4Ջ%gڎ)U0h1ΙHY}	lo(tA!٥k%M.?3bElyĪۦf+S 4 EQ6uu=Sz8Y׉4`TѝqQΦ:[4gzek_z4a{ekON9ڽ4ߧ]l;\O;8PI5;JyDo])``K|GE⼃"<ɢxJ;$ 0,Oe+7A"1(>em:Mӓ
|b3o~_v(3"3l®6I(ԑFlHں7kiWB"TfDNLs`&	)!i}сHl.S'~DD@ "yfiijU k" S]kvoU4 J.F|i,%8rr p[.<Iܑ2 w+\R1_x)6p {Iw1c{,⍴kS8ˡU"ěѳ95]Lt5VuGY"EUe%Jm1vi|YZ{6tAY}&s1Yu!k쟼|;ofǴi9`nۿ'&̓&׺_(xF!&z+umG$~A8U$ɕnŒ:\:(}7Qu ct-8'BҶ}`UY&gju	s :pA6Qz7߁_vN,9w$_777?hILޠ>>hL$0[0	_53%fW!{hdpzЃ"axwU 'ד'ݟj7\Q7 κqKe7 /
>RZџRt1alڴfX؍GžMU Ck.r1e<铳S>P3N7XZ}h%{-ƒ%aeD@!%pUEsG/^EP-ș@QWhK4|ICQxGkV\nt=okh[f=%zMJ-VMa>V-	#Eɂ|%{5w KF<+Xf[RJ!)'Ek_S G!)0Usf9KOp7sqKO.U7]2l**.+($VIϨۘQM+`}xpgjgoCDJt'g
a60yT	j!>stg{1u2jHp:~}K?o!%%gS\cdLbA䫨6Lcvw}jb$_EAwРi8w[M+ML|]
cnƷlF)0.E\5Xj  :`1FW)G({%aéTtpSg:ۍR)[um(0mW|Z+g^ffY`h46O,o8p.I̬wa&RƱT6,Ʒ,
jkjS[?\S=q\^EaXvqqRChV+f{j&g[ g^XM;[\0+|0(dY#ÿ{@:{8BQOe
G13?|zeĒ"}xQܷJ?9A^9%*Al% ˒Y8\}JKjkXXI¹B.Ϩefڔ쯫єǃmT`@lv[_&GXFňCyĒ]N+cA<oSS^0h/2pG/l瓑(H8.  4 }0±dŲr߆\Q@p;v?W@|<(J9`yu̟)q<"d1^gҨI fcjht$i0oF8i~,YOz٬,C/9eKl9uVI!ŝ"iKqŵޜ5߶.,w+Y#V xS  R SAt=J`$%c2Rv,\GM0ֱnqRq7[ݣ$b΀-w(GIj2nVw;(+((Fȸ|-ΐn}.ic0i9dw~gkgKut^NوGʔ̤D`@3;ܡ5vj[Vcߝa@8z(}傥{q~؂q)N"!-b0EэOc	>fٹiHGD?U'83\(q}:t%,RiҘt')	MӨת[;MdSoKOg!PB8w\v.Nߴ΋.ӍeXLj}puQ6%FOF|/%bQAQX2yykFB{{@۔
A&LC5v%d#Q;Vh\-nn1vWRN
H,ĀN_0u{8Eˎ$*$ Oj)7(&!)l-ֻDpkܭگ=%G#ܪbj/R残pSΑeTBb8yE;zi6N5=-.<k̙Ɗ)%lg]Txed;aInMGBGC4I1^>Z'#D|٨xe)݌+y4Y"bg!P6~΂<kvaL 1$ StMQLyi^bKyWkj_vX=V7]BKtlH5EӚP8?e,@99SH.CA5@Sc1@I {5;/{%cȶȓW^Ơ>!xiC(nvP: 0\@m"ZF#ǣql\݃N'u3JDaũ1-,fUҿs6Ȏ0b|ou5,g`:8['tBC	:`ƔCf
#V&boS$[[CE&fS[Lĭ&3T.H@T j B~!TXm =(!&.(q l&yيDI?F.xNzZ@8۠	ٰ([^$ۓ}4`8)-=0g(=d٪ri.Hzf<L{#~cujMS@Gc B-C:B uzo|y}>Q(1KM10Ay,m\Tb9ݒg$^$?+o3,r %IdY7zGI/1Wڮ=߭xmщ
z(A{s,2kU/i\	]O8QWCn~9`?єǰsLCdH}ul$.<5 |tO9sޜ^ pf9Ԝ6$NNݶv&TXU oiJp zJT%ل!JǽN vGuxx(g,"5	6
#Hq8IȅP67f$LĦI%ơtGݪZ07XRnT?kh&8fQT1x8L{0m`L-/x婳=<cB9Jxio
5<aSFNK~;6Ѵ u9Ņ#(]>eZ`*;ir5-Kp F+JPGlLψ;v$xcQeyYFvg'IYt(,^=%'lpC6Ǣ2흲܁ױ߷Y\*/k;|>W<-wD(E"zSbeZõ KvY޼͑}ޫW2?Ǉ+.vM,V9hH8Ѓφ~ 6UQ,,֑#pHzK|H <(_l(
`0>$˕,z!:e_\t"A@6\I{tjZuko{{G;{ٻ᱖ ĒƁ}H6LZFB J(̓8Kt
tEl#rST<s|S!!sgg30lRH)H|:'j[Cx56_Ul
|\W8+)ص`0"Kym$I=;t|&]2=2$vLӢrn-9/Q:oS%pv`<J@7|,7v)<̿	$^*X*{;WI< [mEՊ6v[Ƒ}ˑAh(j\fg#ٓj
yRӑO(Eޢr2JNKɾbʼrxR/m6s?;*$)JN¼IbpP}
TQG,u5C4p' JTF'~
-R2ܼY9<B$aQG݋  &L<
Pz,mڝgv/CɁ`DOb_bFd Eƴ`:KZ_*6/_]`>vRVDEwT%/VE|aV5%-0euˆSRavbj2OWoPE	d~5wkĮ.&Cy1-Nѧh_:T,`3H'Ñ%uO)LLUO	Ńǖꟴ֒iIG}x@:\MHO!k*/[OЈD9iutTu1@O/WfSU/Wbf~EBjd:Av6`~	Km[*ؚU$քOrjO橰9G]ѴQ!R((Rrb-/~!Lށoj*t}<lmq:^YkAS$PA7qvu^6"
ngpi ql$KR
(nPw(p_L@Kob%V|8y@\ld@v]9|3-,Y6+z%.![*MP-<_NuO雐oK
0N/1h&F;@_4l\33U[~	S <%ni:M8I$LH3;ef@dGd!~gG|羘s0Pio!}tQ4%.R.SH*0EkNNt@RN΃`P@31CXn2ee2s|5hJ2M1ҁ&AGSJ&jbP	:̜fyRcVk>=Cήw%F{qeONZ}V%~\	r'EBs	hDp8kzP7iɽN{ƈ9:_GpK/F`̚Ь0P
]V3N&_4'oomWۻSc1u`k=;woUzhIZp~!IȅOݭ]`K{;;kA?f0R[\uR"}P!6ƌwWZGࡾW=;
O<sȊňXaV;͓aycmjYXHmG\IaA<cG	Ε IX@6PJ֬bflqȃ֡	+` xYɥ	n@]q1Ѹn97[Jخog̩;E>TGAZmp^$nO,:޼s9T6,`~D8-[)\&y۩nwp&9a!4Hs	l}EpR`߲Q8|Ȗjƴ;=;xNJWMVXEzOz r}ma]PۭWf\	35+5Ҵ~F'4U,W0\8ૉwl0~)Zh;9$]"Rd6>E+7
0~42rM!^/h
kjcom(9+QYb-9Yqs]ʝ3nzsjLN(n3[Qm7À4=Emo b@=-*DZJK3[<ΤM̝Em/Ϲ1:?GVcG	[{T}P~S|c:
꫽<GcXXVn[>XZaAtKn}-s'ush
ȏ\"R<dNdV2IY܁QmVzƬk5d 3Ѿt=ٲӵ,_fA. lXV-^A,nGB	(`~sY8HѮ&HڹB,#I8^12Bu(Lҕ-y*ˎ0PU=cev&EnץW؂Nbݖ]oQ_\ 	|Q*zvBGG!E$m`NNec^`L6#orNՐ8D3Z2(.U"bbqf)h6N`>ǋLc؎1.zѲ  8'jK 4ua(Z."]%VkB.8!-2y&朂Eܨ]uhs"Y"؆>]x,=m̼xeco9-l wI؄!ʓnfOMX=zE8>HB4NEEW`0*F>J$jÀwuDq> &)P:b:rk:[g>?Dϵpr,G\F$śg=rv>x6ǒ.nS	=>]={[O	ScMo2mT@d
PPR=5<@5;c՛zY8rBDi~ukkcLm=sji5	p36涫ewDoYUN]1:JUNd)Q2% 
Y3/:?YZ)[AdA/Sqvb>-e`uVY6;jݝ0(:f YSaTSkRl Zwb-2%h66`u$PNCeqat, RG[3;._.koN@e]ܱ82;ټ6.!A>:oUg1!:.M!3$r`GQ8R6cJP*9ӿ/lkIH^t<8cyYo|jomUkXyײ@Ѻܠ@l@+»k6ɮԩnS۪snى֫p U$ I0YCMy1:݀ҾiQ
͟1>Vtl5dLj(II?]{MYuAn*}ewn5\?j{5%׋`6詖-EuTKVCo[u,(0+E;b"Y1n!iߔ\}5{x wN.{g퓓'k7yu~y:nürU^6!eA.(rqt[I	[0;WC;JF9䜐9meC$rXꜛmp^pW<dpP6}u;Ou
`2AԢ)DA#dXc=FZ`M\i@ZQ~shuO:ݱ֯i&EM1[\P6&iΫ8]<[A	_haMYE`<vC~ Jvzo*?+Vk͓8xOMNQCI
Oބ7/i9Rn1U#+ѵmƆ:BK
Z¡͢?R}^I^``6ZkhЕh?82·gijB[S(SIKp,ëkݟ+2RdzӐ_[&loā:ϻ# '0-ÓP'JQIU`Uш</m߄~\,gJw==?G`+C֔8
4JrU'T|MtLH&(a{Wn^Crd{DMg7[Rɞis{"*Z] .@h|}X[XSJ[OaƩh%XT/?KTq"F^?TI,dkMcWqa/k$j(`{%^!g|ɷ"pKHGT}S{.l^Nb\^z+a§O:v ADpƝ>eqW)Rz:ak,=sUO쥫E$7vOWDPbMl=dIQp@S1%f>'O=_f̲$\OYǐt_z'LDSL׳q"^DQd71b>h7E>B9$eji|͍!~RCצ3\!Ւ>HcIL&IAr/\ R36`v4V@չ$,~n9'z9!4bMhb܂e0âfXl¦_Ï%	ؘT{഍JxRW/zpD50j#80L4/X7ǣE|ga8ߣ"*bs=t%D<Op YĒf߉LNb3Jn҃PHYϝҦ">'x[GiϚ602X|½Rx^nqX4=+&x9B.eJ ;
G;J܆kD? $Zգ7,9zirخ6wzR6v;ЯJk7]:(հMZgX}Z忻Sמn[iP{ɡoիI]߾Qޭe1 zT"ߤFu=&=L@M%Zl5ߩ.HWyWxzHڂgykuwM'ThS뗊g>\8>Fo[$rB4[	vCF0'z(G7ѧ`nWtmAViH'?n@t/w\t{3Nti:NG r>6Or9x.[=ˀĳ^.tG~MSMC:cG«![v49	`";|:mV\H_䢱5=me9imr<:Xłt&X4/_{GG'>-V/N Gw܆u=?mӣ;Gx(/zQbQ. %݂M}-kC{i@.֞+aO9^ˮBd1aJnF""L |eۘ*ᔃhx	38T5/)9nBVI|F@	o0idxDr!p7g,35:+ݵrQ#TqG<|,i=Dųشi:%7Nueqſ_U89T !FyiM$N4}Q`b2 >7k9T	|Ggs%+X WQ:&o(NSRBstz+xǊ82匌,㩝KWkq0f?zmCpATz!BZlXP5HSɹOo&
pSf]3SHgtc/a֭<(#2t+1.qVjWM*ޠ,HoPq{1d<<VU9C
WM@zߒ+?Aڶov&(dl̍)U)_OGZ&H_Y&Say	@6 k	:͚Bl*i҉-.&6혮׊'ڂu<цS
JZaM)I}D_F-)u {VJ>XƜYHصKX#xӚ܌f6aaEOI;ܨzY;UYx,^x1ᵰdo X;8i(/*λG:TCLHO`5dMF~<◳K8^C6o0n2f&{CVgJ~-!t!V^-fBFrh	Z{"߸[LdXyw($!vp.,Dz5|+on'`S66 ;hއN.ź3p;B)A	9&JqpPh(aR<K89=["{1(3n0Xa0e6POOF@TI46ٷxPmV7ztuL&,qm i0IL$}3i9Oȡlwĭ?!GM1/zau
01!˾,+3U읎\hGӫà`R
ؙ?1[q17d%c4^H0ݻ[%m115?^Z8 u7~cdnIb3V)D둢/Q8odS<7ynS\k;
cC!yi_f^*qv<\ 9	N4G
z̖޷TY7y6~V~nL{gMRz􀚇>Cc.W}=KooT-MZ͙3Ssl vzԎ߇3PelH%jq .Nb,Ht%7 D*(5`LtY#+d[@	?	y=OhqRⷸ'X$ obrN85
Y60?d[LeY&OvF(LЕo$`	Ԟ>N~umTR,=yEkD֩&Ɠ#+׍3f
j`?!}@q0+!{5Ч"Zj62MJ&|#?q*Yܠdfϕv{xg[`'%/&T2VM a.b5(6Rwt
jn\<Hcڹ(-H"jL\b"Oz5&)}PlQIİT2H/5OiÛTYRFQI|:_?*B<O;W5k&c-vItq}(.f'Hw	g0%	v/>W)D"K6 ;d>.gCD"@drJgL<cb7(nBDl=m%gQ9"8muN?~^e/&zUE@9r..zA{C;3ˀ,7mIt@uvpI`rCMx29ih	?9*^#ھQd70ƽ}p)P@<;J>޺v.P!n:D@"fm(nuqPl-Re5Y89.F"afhH qA~2QTVNB_]A_/8'ã+.7R*.-@zPrtdLmz'svZfwq2{wB*TSDjBI6ڋ	m@h~ϳwr-H>uNYR8PFz"|2-wTgm Sv0ob: HRp8(-C eIC0e[R.]&ߑS楗ܣq&9g3+<*1UcIr8'|ఇ	*}oip6v`&!77?Mi&-1$.FtLǴL7%ϛFͱQ0eCj,}G@&:rpC@vzKʚ䏘PMObr7zk
4\\AJ
oWԏGKƚ\3i\/gAD88' "%?t¹&9m*Q-&:^@cmZAZVF
pC7NzH23$Q|82j[=R1&	(a$t_"yT[h(5^(h6H4Al<	^#~Pa/:su.u37UGJ^md1EQ.u"؎kC[ъO]I`GNq*º8т LVuz&֊'K}+Y`Zǜ!҅	),Ki-GA,QqYƁXͮbDȓ窷G8ݣ~ #2!&+U9%bIZ\a*2]hOā%,$k:UjwfXqRq[DjA^.zY?E+nyE.ꃄVm˅čj߽{y=d@yS߰N$EA.A-ÉopW$/')i}IQ$HcM.еb=[6aQ0r]ƵJL@eh\Fh>MtzqJ'9i4G/[5M4-Uױmӿʑ'@vA`-ݝ=%TA#h$،evcu$1Tjz)(ss&ci8ȧ^M3dLX<EC6YR5+NȈ:,Q<>`D nU*7Y=RO0t%D91F/#'`0zG򻁣fO YUӂ-:I6Il֊|eS}p^]<$ӏ7*Gi9MVʑ,~ppDIǮL9Zm%#Yt]csA
guZ"4{U%wR0`N}J:E=ZY/a8
HV0RԈaH7gBV=Asał"94u᠓4823fb2\vOQ]:A8k*$܃Ed=#&hH1)WZ$9eZPY&c#*;8ֹWM9ӟs&pԠA"'>ŰFg|ͭBD#t*ѧlGCh
^	Dق"^@.	ҳbaM5V4^RAPn78ä(qEuWsQlZѫ=1ozEc6 :q븊'}
54#qڜz++hm6QWx4!|kQm}"hrad='%<#Ŭ kCiѽ}2VJPSVSVmed"P?V$(E#*;rA2/k y7Kpaa #pUQ~4$i"RmLcdZG a^Bčrro/ `bh95!Iw9QpV9OVOAZQ/Rotz%?ҍu]f=vOm(p(e0^:ͳ޻nE>@] lwNd;u~b Ib1`MXfUbɛO8t,!\.2YyPhr@]!t&K5 O?A'RwK ^5[GR8]fe.N$$@,*ٜG/E+EʬR=y ^;~@)@k, ޜ 2 ]@b>@)S@6/l5 :2!A(e% ժ`2BQd~QC,qXfU, u`sؔQg2eN_:dUf!_t(He2:<Zʬu2t3)XfEF lzR{6ß ӹbwN}dTċ={y`[>P2.A7y*5@WӝvZ1)L҅)uK1@(2@k^rZ)_PYd{R2+-i[~zO)±=^÷>\۟52ĠTKyW
Y[v2K qČe /o.l:1(JIBJ2+@ BJ=0.EG	;]uv,#)!T"օ-hr_NOڝddBvRfYVOS(|O!Tfţu}~[ʬPM\lw֔YJlE62dc
s͌*SLyS뗇i`e
w+ QpXۧ_~P]xX.ڬvOOwwϙ`V"-r%SD0}@ɇVдL!y{"+eVbS̾̊=9-XfeE2Qʬ,P,!S|m-2Yujm6ʬKYl(b/?43WL)u^96NeV;0pans9cO)Q@(SJjP_s yjfqNs	~Op2.q0(U`ENCay]'2]:UgӮn
Lp͂A<Wl)*&jѶȾrm]lo>b؀ag:ش@z%Q/)7nTגJnǤ4D(o[9ӥ;*k-3ЭUFvtʭJIh17ZSC#r,b/B6P@$2

ak?L khzؿA\u4g`1Β'Gl5l4%>h*Q*2΢y4ҭt3Etq
K#u.QtFyWMdG,k_:ݐtv'SoY5fv8 dΟ
?j(Qq/E+56ˋS0cRf8) Rp(<wA!-Q*Y1#@ݬe.S~'TCGǊm+}ghgd]k`KR9Efb#eK#q´;(|,bsd$I1 W홤H6͓_zAVP<A#7 wN&m3)aTdpbM04r(ģ SG?CdM3@ @dۍaQ:u>0	iɖ&Ѥ5El=%*e}<j4{3dc2(ʧM<xj5}>Kf_]9=Zt%@-qm/nC֋:[cG8YBҎ3ŷ@$bZ|v֣ySn@Q:41dkWՄw1@2'۲b_+^TzM6 TGzF\-	:`tR7ߖۃ5ހobJONxf)S!egYXKǰ@fOKF^#
"@W1Gbym;w*  K,샢>+;+[`W[)U(!jIޔU2xcu.f\$:Na?W(޵?ꓢФnb:cXcQ-E=^%(hJ	`$ȵ6	ٝm4(8$rWFTEъK['Q𨙓@o=nQ:
{CJCii
9zJ.FhmHI'$jTtW-L,6w]ߚD.B&i&|yLrcjI*99_=}Ѝ`N۶+QpbŜȨoH+Kc<-_2%J2ڨ@ټx?W*{=	~f PXk$WLHY멣;	73PqDbjÈn{;HtIwsT%'̓\B "3d$-?$	1AF*_yU{+$Sl*\r%D[6j`aA
Q	gNl$H|9LF=s.bWIkKy Ү آLvifsɑ3i6ۭ	d[O
P{E9wbH!-HJȜ23mx
~hbP\Q0X7ømJ$7r{Eiw>'0XGJ.QhUkSLV"սk~u+HHh.8ZcN jle ܭh=?)+e$c鋃Lp;6'y;.a2}@:jn#I
#90h)qV!iz6*΃;xNLP}@@r<S g$3v+KQGBCxU8> GR
,mBR7ADHKTI
Z`JDu蠄3 P7	BϪ݌ @#<12֩xR܂ZF1ɷe)y%|r>ZAwl͞|}9˚f֏ -iۇ.%"(B*ԶXYxś/g-t݋;A5wjsx$_v$btY:scg^No5.Ab~C	^@SI6jdS<\k.:jDn*nUQc=r`%O޴L^5;t:4-ff_pȌP{/od"=
'.CM6LrʸMN9XՌs#\Md J1 aȘ0S48B̰챒bkYXuXEc\Ȁ27o0ZiJyE%+ATxy"Zns:7(F9dN%e
|gpLА"$r#ҧ=DӘcd\QtVwqgøGI42ñhd 	CMgJ{ݭYňA݅s+- Ab ou僃bQ1KȃW(UL OƯ؎~mBӻeB~1&bU _3-#8g]$;τsf~XԚor@ZrhP-cS;k o)2vDiϧgϨecwg{Fy}w8E-Mmc_ߣif"X,a۰*2arL"mpĬ`:(5(7'd>uy:<o +/yٵ3U9@S//h[b	Jwy%</T<z7zw~7!%giQ-OXZ>t/8b~]{/%:}e|+gXDZ3R^UH!RM<9WQ,W|*;5!"kR[
-PhXr N&^'aHZ_n0{4>ɰ44MP&bnN1KsA4,.{A/ܻ".ÅgW ^W'}1,bJ
qN`ҩ|b2QNߥwaZ4+	Ǥh}-F\;Q\sfG豦/nӤ7s.0sqztORr3wG]SδIW[ɦ.+<߻FXYΖ`(yNj+M(%u/yub+ݲr+W59t[<Iw{+<<J5%@Yk7L(>X&-3;uճ_LO"@PrJQ;@@k8RguJmۮ(ݡޢG|p˛Ⱦ;[t&Ŭ:HDrT"{c	Z#/};Һw90bMk[k Tf
)tjr	[EXs	%ԕxeI:z'EO*z.,`s)CPDjzqD.Kzjm`%_)ۏȟIf	K%..!9(xpAp>7ՔwiouY`%=YUO&z1ʗ.Нɛ-&U
Ӷˤp8AK,1Sghv-FCΗhy0]407^3PG45g hae(eUeiƶDL9;a41ll
{Km=u!'G+^J :b+Q/P*KdA}
S$b㕜MB26ɗ{Ö"@(,pQ_SLg0Zj2dańI,Qy_5e(NPP#ab@_R1dҼǐ0Fv%]DOuvނG)kH	p]rmZYOه7bBjqˌ쎆?L+RڃW(Ħ8>˔@G_ʁ.OZox/y?n$-\¥8+f| d,t*¬ 'C(ܴbB,U@jZI)) C(X<XuMk護c筳13oX2_bW	=ٳX..x y8Wh0ZM4J$ʹ~!RJdp~\.Tw3j]j7`x;Gۡne:H{>ia;Hvl73n]~Lt×@2K'LP]@0t.t@tN5/!UQYsJx >qZ"ڭr	[b ǰdn!Coo(ѓގzJGzJlD~8zSLX$FhOU6i6	M	D:o?gqA_<U</p2l'+}y"<mZ!BZ!IaT]?RN`*^ZfbJ	gGUYnЭs&\%<u+z7{|(EPR<i~]PcJͤɥG=KJ5X oN8ԨDª&U(җXkderJl	9-_2t-KXj*lSmˢ.`^X˘hʏJ^nǗ'Q;qtq`#wZ2u-'֍@⏈ϱJK*DMFv9SӅ[bQt!X5A_QlN?#@x%T}⭮ewlY./qW-qw;[+a*"<LhI#]ڎyOcVrYC4@R/`H,ZB.-Y/'Kd"'&nB@d+$x0b'*B$V5cQ@sUֿʢ:{$m;==¬2l73?F&BoNDtI 56#z{jYWz,ҹRbޤ*ҵI>Kx;	?_BS5P^m36̴1>o@0aVvk)ږ3ָJZ)M5<AIZT^ة00L/o1+Lxh:Ԋ{T	N{N6jHbHU6UXt}֣Z«HvD+yz.7[|ұӲZH5Jtۻ3ZBR?O&,|D|Mߓ1dve|Ym	&j`d.$*"8yVtȻt[1DYgнpXj=si
CԴhKE=ͯd")	LãJA
cنt@'lk:	!Ib|g!oʑWÔ,fOUtEyV҄밗
箬g^Xt[:TO~ItppP_V7e%%K*`NE^ó[Ga=~Wk[ϟV>n'Qo%%0:lkv+z 0G}?rmڎ82%!PqEˣ7/=ͧi#s/WZ\%+&pޟ̮FL̻g8.Lf{DtWm`0~M<ҳ>PoƗxc7=v,"̉l;޹dM*	Rj-(.-,,U-'/0V߹Db#Flv}UmvvRQ2m*&@Z:|)BU+t`杰LCRYXQ&/("+L6l`6,@V= 2 OlDr3ؓ^^I5P/Έ$06/`1[L&bgTAE͆Ǯc@GtDj>E[%A;vjpzg6&AW9&0ǯxW9JcrO^Pl8fA9C"X+lQA-58 Ue)w0HqRM-I-O'*YJ,PTEXղ@;%ے%~gF(PRjpu.Ъ:6opXZ3ye	?(W^ؓw|DbOz
T2&¼7DjT9<3a1 j"Z$8ڥ@)|<	wN3S%<8E:ʹX4T}+19}3/<O5O	I".ΧLR?JP(?D^᭯|SAecpv9%*岳.f*Hp	ZHـPȘ-  ͇f *ǲ~o7UM^ )@R12N}$) 0t,N.{yrBLJ&v#ьoéK@%"rvaTF'5FDj0.,UQCRaf;F⃳8O=DӇh1Z  2ߋ:lH61 6"뱟Y-. |ք1,~##ҹ*3IɄ
^r%quB*fؚ܌ywSp~a.SIjp[hM"|BQ+GJwA 2Ԧ92p;t1Ʉli	5-%(W##_LJ{UM+	՟AWrqǜT/
!Qu`	Ljߎח)Duv8g]B_Rš%ضrvQ%l'Iód o Y8BY%Zw/iwSwDyZqs+I{ks?ښOF)d5~6Lsm5^cTI9l&bXj򙦄$?H3{h8r,~Js<fo#٪=&McSN9*" Q6gW`S'8.%XA){Ø{UR~lzGrQ>W×9HB+_%9	s%ujNfyh|;HIbvzI&	&tZȑ&p*t9U/`/`6Ml\]W݃1g=l-癄.;xGb)W\0D	DiHJpa>nAIڒbϗ8Q |
'vMfɤ!It^a(bl -?/) |7=h4Y^3oQFSb% w22E8-^A̖žO1rSh4~qGnP\Y/תo/tòE>eq5\3	RyYIm2CAMbܫm^"uo+8P	4f}4
3uET+@&YA 9
9pV`S_vg7]^׏7t+քlSۏΚQBܼ4!j.2zAx8(	OiD0)oeB@40UVct2#D3&+q@U&MjEP8@֝9)frlW5hΏobdbv9l)\STR(HGsH}a`R@+$/<y\HoknAXLŔ)Zz77.{cWm780vU]0C#)ǁ^pᕈ2hZu;f>5)b-ShWS&8d-:S0@vj]QXkX-I3%7omqDt=К&yWq/'g#Ystk(|%	J9SLlw{yF9==zuVyV>tR[ͣ^e;DN@C	ހ60Őv|fyU[cZ9I[}⩻wf`ujq v^5LJv&mvlU/_{YMetr\]kf.k(ղPd9Zi1cygs` 0[L{Ck X*\>Y.HMN&ṅrfeGM'7k+oRy )~~44Vl^"ogJЩf|Qj}S3	A1iVg%N2aSXHH-4!uE	*cƷp>qix]10%b4ࣦLr}X!mCvno
?7ݜ}s(v[vГ>P|.٤<mɁaƱ"q.03lMj$ Mun}]|UED7VXs},SѸX23bC1fM\^}͹0o%8ľ\VoD4yj?]4!J ytɦ{;t8Jdgʸ
ɤ19Y/[WM}@gs;Jݲhz_9'aqU:aflӐG9
wי3k;jcoa+04qҊ9K)՛r/vۻ[ֶcRm
WuPq}=6ln2ТHĕ2ֶ:lןCe[J
HCCLRqގY5hy7AoJ# r𥰥{LCH4*aӎ:~!8Rp@'&yίqOr%(zѽ#2t</DOl,Pā*=4ՎJR.I&eHy1©3PSzau2c$<c")1Z@6+un#Np`jYWclċ<׋}rz\@5Z*5HA a6a1z|	xQP_vQ㱊Mh-E"?vH%WXEKK5$12Zoэ:$?(#>ߪa,)֠)2anY[b:lO/׿"zL?*CњNBTYTӶdd>u{<U1
e}NVGfHս·bq0flu%Q/EΡR9T	yFU@6fOڝg)Ys?3rA	G#3eFzǆkDVsq1i9J
NzN	ԑf5jfLϚk&hr>QSh.-zV3[v@6Rތ3TΑR;խF+2|xk(UWI#>CQ2z}_%"u`I/+N:oA߮nm?羰Nbm1K{} Bajra{$)3@ hnFvbFqr/v	Xₜt[@s8D	e2ĔEkUBz`!d$Tf
*c1nI UXBO>1ĵ'מ෧Oˌ˯:b=yDЏ)5AnJ]aYE`Vt
ٮ9Wd`?18Uf;ɠ>͓e{{gY.OwԂyZ.[eԔ Ed=sCN [j 6K(D|nxlõaGsN|0.:1Unh(D3'	4MԶNfr1[;U4357j	h`ȏop7 \PzRǼ
$pNYpP4L35s{#)W,1G8UȚa%F%
(.X!G@ng e`>ہE	!߻;}#÷<:؃%JFN[k(<F`{+r6 0;~:ֺ((nFRWL3	BN`:sP׉͍1QRs|fttܧY&qAAQ߽5 ek1SKiAhZ1GTNuXY
5$oUUe)C"Ѻ^Όz05&HxO耒<OAKQmLK@!Q].ԲӎM87\yBO뺘.FqHF]p׏ӏe+tEԘeU}>"|bׄYaVU`hQYQb]D@AnϵںO?mblsbJnZA(hz~[aku
`"iOT_.(tNE@Xi`L!"_l"
P%~D_g	<J+ȏ	/gǶ~NKkoѾ2(Md:A7`>c&Em  N`'Yw
BZL ћd<@y| 쇸Ö+Ol*dsJ -ċz8<	0M{OT72;i}P
mOĪo<Yz#mOhp^r:A^4cw
VuW:Hc`_J^.}y
1FMjt]<ºX)7DžHjJ~:d+M5){)э;VS"(;)߯#hP!̊sr/<s&hP,]+!8ze: Ա  tX+G$j>C)HُQm,⯂LXY% 9oJIzwwNzBhA𱾳*O/$L=]͒Emb$ǯs"|two=wh5[Gp}$mZ+s*Agg'fys%bFlTi<猑ǰiVYГȷ9En䗌ɘ}*\,=HL)z	.JPN[=|P̈́|̞#"G.cbɹdeC7PK -4.l!{Վ%LiW8:VL Ń1C@tڪ
/'\O:'0Yr:`lr	-e'\z9\-E_x E"GVKcr4_=d<<`Hcʢc?k~H,%G&K-l(Rۯ@[ZD"v\8^,<L%E4VKxcg^}τ.(yueFQ.+kpwFP1k@,Y,g%8$bMYP-<	FMĲU?51d&C@ftsvd:6VpD넉C"C<WUa7K3D^,8%,+:9ɇ/=A~`V{|taMYC.]-c4r/wr8QV=kwC!R4u?9A+$B. γr)Ԣ.ȥ!}_Sp0U'W8)S%nM;$Ħ2ϼw@"sVReP:gd}![%gc:uo.[i}K)+aKlY|I0͆esaJD\6@͖ 1@f,	r{ESϮh*!4; 1Y͋~iƫ0Ulsxs׆Y|N!SwʲQ"E8E D̡/F#Zw܁l:=)Bǡ'sc\3:W#
+b=uo=kIgc`}A? }?Q-bbW|K yp'_+8%PYŨ:Vq>4=naEFq4F`5JM{\64\ Bӓ?%IvO=uNHn\PbvB?МK7;v_ZyyB+]Y:rRVAa!$
Q
"#4(Jj!{B3E(]lDyJX<+9M}Ӌ~HZG3ۃٯ~uRZ@RWϊGv+}^
۷ 6c7?Iwrv#4+z7>gnWDR?E1^r)K.:GW=(>7(ml֗LD٥|pό'&MيS /2C?j7'
hPyt9@1E9qTytOsdzi,tC)l
ۗ!h^ҽ= L6!%G˴=6ψ`*W<~YukskoV1J8nզ
>>jjF&>8ƫHu
"Q(hdRl?>x9(,ǈ5D$uEgB8vm$[#|f)R}r[a pQ< Q7)=zjvwLK4IQwF#8ٖ#qƱ.>B02BGl l~+~SYp;o)hFbu$wg,yמ7L7)9?zsˣ[*uߝ vI`yNOj	 
^1o1H`T!$C4ɊAz |jmg/Mmܣ&I&0ϖWF[DsreFN`ZE*Z?thy`d23qPG]RLn^΋:BF @iǡDI.NU'5Ixa~\/S"G/ӣ@9egAp/۝6c)R.lmpjȈ":}sX?Mp?Ojk9.G$	܂ޙO#%[\abF]E-oy y0%ALxsSj4z ྨ{E{~:oIx^H2Aw6T{d>l}Zh	^=qu(EPV?L r=-G?ZaB_;u*Z5`'_.' :Ei4Gs3p*Ҝ  n(rn}sAF(('6CG i^O3kڶ?U%qjUR4ݠc<\FLWB~9`ޮ^к]w5;޾8Jh<8W!&8hуa[	T9V$zCAA;f$CR@Of)eJQf5|x׮rGbI%#ED@>
)EzʘUtqEW<SMbkqk 0BIWk#laOR O ?\!+;4!Ʒ&{_XHߐLm2nd+(x>$J3Lg>ŵY·hf'Ķm<%]zE{e0#px =Jd*̨mU-]KyKn=mg[Vir}Qv%uod_{n]#?[]܀31b_|tR9ep$r ՌWIeygȍ_?3ڤ9u_ɸJ.3%Aj*s$^0j%d3I-Xuuah.,f&ҷ94Q, ~uDeN]`-xO|QDC drNMF`tHYc̃R#o߻ǜUzLH^ףZTxЃĄ8]M)^!CϚ#xR>,!57a
pA- V02%oՒ
^UHLpMa 0@:b9&dKmӛ0ZrUR89]ew8r8	`Ά*8Y6|>#>q6veG=\]YgLӄ9g6 RC=	62>ňfrà38wݷv6Ot󠀂.b:k=z?;lB oԮ'DKA0.ĄJ0͚GWrp0Znzvi=?3 >RXGZGB{*}ԫ44wZz¸^'e (`q
PO|LWd]f9iOVRfSn@]iOYb)Dm%jRHVŉG!+IL|P+t&=@1YMv?9r!N\cȳBЖ\VfP)AYi6x.{rnh{0bc.^'c=;dNIZ]ooi>nzb65fdM{DRvisvs>Tg:T0td5Pu̱1,̝CIEѸy-x-iLf's̖q]]@xM&u_^x%T-"i2ڳk/a
mt]{%Tb?2~?w92nX0_
_CImԹnx=A1e^75d`t:WV6uܢ&:R>hSu~Sͫc)3ZCff, 0lcIܩ=0E;?>,B	.Go.Iw `h9Z
,^Vu~mLηFl]5Uv,V*k;ϣ}%FWE#l|T%ttj^`?`AԪh%?iVa6?ZՙrUY
GTɺ hG,$2ҳ.]!nyIh4;άEF]7s1Σ}`gNof/\/ {<:&ktyM(¯}H2IqJ'_j2! `,8E=
>%2ւlAks2p3<!
*a@~ofDWF5ǖas<,60&oD^G~0wW!1ÃeIGX?Ȗ1,<j(/Ʉ,T?E0-Xf k igE7a UrmBiW"{!F}U|hyfKɸSsҢ˚Q˳v;t
m͓^R-tSWH(AY޴޶;FQ;#y2${
IԸλ''o?"3_ى~z#y`dqEN;6R䧋x:bՎMb=?8W֌3uK9NN砋xg{v5Չ,t+7>*{ZABSѨ
cj4a0ĵFMQv9h0ucU1<Z<|ƥvdnP1
,ى2Z솄  L|ȖX;x6d~a%7(/$`Wl8	&Q"yqTT3*~fLEJ1F@1ͪlZo)}3Fqf5=5&Z:\ 5	}_XvAMzaWYYclwYR]Kucmk1xh6Ay<{閗$JSozC4^}Ex
+X6@кG
GSW,@R'?[.#vx;cYS$ֻnc_lDKx"
-(Lc$ۚ1h:a-8ZCZ O1F2{s:H7FS朵G@艪5 Uڿ(TR(C%@	ޓTD̤8X5a,+E?qF1ӐavQoJpR0Q\$!Kj-&OiLy^B̓uKuWS=Ā}蕩fDh<vqh6_#;3&=
#CD4Y]FNɦ;(}*00b=:>BxօTұlO}Sd}<Ɇǉp2HOs>UU2Zӊ4nL_yS yB۹t|3cRDa~4%}Rg,Ptlk':TS^ݹڈqts4ʲD.a -kWQƮ'&
RT<K-cbF\0?1XQ[~	~cMaE݃8"!/!$P<쮠5؆X+T ÁY-Z8̙W_=b
yLEgW(aBж2uJ=<0]\<vz&/q)&RB%5lpvM8Y&FS@R,LS77_8$\2xĞUQk9Ԧלxé4U[u A[yK|:) 0t%J%r QF2BlemMo&zѠ^0CtYb+BJ\<q,7IYRFlE\ zݓ8%1rf8!)@ڐ 6R9 EIVӟZuEgY W$
|ɻ=ʎ<l߶S<0QK)BBveƄN0zc5 fX[U.*+
{)_	r3^CXn:pJGe1\_nM1\.t=K4h.1JW]L,'u)#=bA5պeKd<Jp !;voZ.+ᜉsJΛH{s>z_EvxP?QLQ!bl9iAc hA'yq0ǎN9׭"vjVk_ۿ%j3)~B@ ltKK
zq8E\q{/ZjOِ̚EPrC|< / z R:'opI.B9vcDIt}uia}7!/ w`WyQ8-M,jק"rxZP8e5iף9\ =?j¨?f>&V8Wq{unyj  L~?N9?#v	W,JT,QzhäSm{|P!tiFF}%d^E-jq.M#7rG9cdp7/1PcwlĞt5;p߫eKszu8Pѽx{1ѷ\gإ^>.+МG:h^d/J27H$w&=p@PWjhg7ꇃIZ<tg|x&,) %JGj]UiK
9Wٝs݄B*pMגZY!.:]5ϛ-JѴlX~/ȢTl%
x$K>OV`ܢw:l1)wRՄRPKVlr-ZIϧ";ME?ciɷY@P J<w]*1QI2Ġ:o=T+99E_%l{
){Z#g(ZȼDA,|q`13Ң7Yn	$PEJLɠiuK5B	;N&K05BDD`zzE@q&jJ	7'Lx3u*mPCHөׯ>"ސ3SŬjy^"FUXK#&?۳gxeA9HCp~s2"GrSA9\XNPu ^ጹq5c%*Ծ 5;BY3h̆ :,5Ⱥ;ZZժ6LDR
)VnуKg-+V]8:s:H%j?nPݛVkZ8p0yZЊK41q:1J-e,{KfoCD5EwtItsT1^tk Y	;u21Ѿ!p$r3H0ʔjϜBuK>mBw)*d.:"Ud[`'آq8?-E?$<d벗o~]8Ի)lt!$nd3hwvr~l̞2	(
*tQ=0sDiC1d5Eдqmʵ\'X3ZdC,q0Yq0-nxx!!<
F/~21/%v:%I5ј雅l(*3硼̜2?\rRi!P9uzpO:Đq.:6CG v6*&ղZ 7?#F=,<Ԣ4ong6I]7}z|yUPz
L'-ؕ2/&<
?P.N\@b`'9{tژ7!ul[#4eI;Ke8j9?T&(v%u<LYƢg(oZ|h{x
flP[aj'[}"U.D2H-h)$YWg*#KRyh8`|<涛( RZ6Ct~Kv(A PU?'g7\ǻͬHxP_~
Q&(k%ٹ74ʃ0=hw4IF=$SOϺfGm!tCgTȋ!'}
xDQ"QGfA,}ͨMVIa0{TLq&'䛕l~CNܡ7Sk8aM-
ץ:0{(DoωAk+t'4&];@ܙ-&Hde(]ߑ,J9^@-3 BnzdĵI1d-vT_,7hW`h[2	bE4N>Ct6twPf?ͺتEfkɃFVq5+^S).F:4|,[3#@6Xa]\uE3o>W|6Һ,YAN{E$!g,-̓
EŖ29is Q9F_QQE	]<a`~?"y@su Q->=&Xi4_|?c*(QAQӏeC#0oΫJi⣍
{DQ%qBQL^:U,_恉U]3ԭ\g֟;AwDᎉkBFƨ4貤?B4ΓFڋoI3 3JG6>p ?g+f p7y8cMԣSR)7
2\KEY>E!Tx5^]Y"H8;]=.88n1zkup-imd/V,cBw5d Rn@ }W"x5LGr*f = 2+VdG>fЪ'ۮ*B=ut"!g> ǦbkȺO]Rq{Qb"2U7Wi5]H!s8tq9zOuv҂sYޘooۧlbi綖NrkO9?C!08iTZġ.&DXqU8	P4$N2-D2$nQUj|X;j|vl6H;

 OT{1C";v<^N9撔5Czͭ:_Y*٣A5pŎsm4+?gS +at.c#Vcjx=l~H^!ʊwS<LI:&/`,BxаfFrq]܄**lC-`^4Ml՗ƽ`4Wg5MMv YkB.)<axA|4K KU
du+FQA|J$+&ܧH}"SJk	 `,@
;E[J&'Km@\U@$	R+e\L2R(@Sk'B^L!Hu0IꚗUtjIQ2	aUCQCbbi^G_{8EFUJk>@1Ǻ"l.gE}"-a9|T L>(˱5uLD~0PR?Qda#Au ;7əІPZcrJs&y!9~I>=4ڔz@zbtlN[s=xc_.S:FXK^A^Kq)A&rkG
,4!xFZ۫6 Y@G!+
:d5Y1#?JI!&gm89Li4m-84$O;oֆ2YCb%	r`56Э;5 B.7WDI/#<r{vٝ`J|ZͲPvGn:WB+ņ:wFp=+Ҙ?ת3:ΒHS,8ӐdVѱW@bmЄ,ǘF!=agV;-2SuO)DGo bͷ-ːML<YN[k{Ac,h?r9}kFI$JtTBuWE	}쏮YWUdkE00".]0zs|z<L*Sp:+A+hhtOo DYV31y&H8,4D\.c7,dΙ(!	f9c5tu{jhaMpğ-5CMvՑS)\'d:xw?:1JhSr2oJbXc#:.16y	8 c]Bŝcꪊ-ۍ~gRBb5^;|+̎?^D o:D!oT9&2AK l_(9F ZEȀQNU}]#mPXͤ@\AY>tʘOmq`)"A@H	j%RB/p^X	*iJyiMcvs3굉$X&A:d"_;SDnY, K_}AQe~#.NDq3ֈu{ymZ/"ƓϚ=<`>Fg;#6HR\&PGVWIVQ-SU$o^<I5YNp_y0$a&j;`6ux0ɣz7q:P`+޹6U#]x#Kg,`V޳M" u b'\#L>]ԂM\jntv+>2Oռړy"ZK_=h-]ۉi?g!f[hw8:C'T8آs<A(BSpQDT;bZC!);.ik\e^-].6,!M5ܺe3_E'<}%#Y{Oj^tz䞳Rg&*
m5I/>y\N]OPapº"p L!&.{SKjCtD&EY\rl}
+ˉ{$Fy6-TI|:qIFkBr7^$e$m6ub	s'wdy؂G(ϒ bvڷVk?|S_?!)udpuFA[ƭ*9!<C s`l#uAn]8%?Hs+RFzf zt{/mYYt뉼M+GY*	?Z"nO83=hsgqczݴyWxv<GQړ9GNGm0fvuKXItTM5ɩRX*oXFᬝ`\.79S\_i<x%y.94i&o)͘).ih$K~$Q "%ވMA޿cY"s&:CRr`T5u[hY"a
UH-٠P@}4+mUڬڍɫyQ5RUmUs\Lu%Dr$J-CHMQ/C*`45WXwoXJ3MZa&w>*q-];37vxf뛘+a>A#>7O.Z)a.@N0/0*jHL&޵h8ݣiK_8mmXEP!\ǬAbPyn1تlq {ThR/Yd&q̈R9B6WdDr4|0})`>0Dw?ir2au:_w:ֵjVpt% 
RDOJ-]ПS&sR<]BprHi&NʘDS4]B9+G7?>2T|Vdzs=xjQIs
n5}LG!48(f`Hd'a 4
a5<Pm\!2| DLJ
~.&Y%Ukś<!ԦO{RE o阣ʜU߬uR3aosF0^(@qKi1u^F,qŬN6A8^Cg9/s6L9e#*KC)f#WPt4ZCIe̐iō>*O`zt,Ybלx&o4J x	%I'Sg?@?h0+FC}Sg}aw@L da\+JRx$NmvYK
CHW!C(MU1UhQrḿ}Lv4,aާ2 tYVզQ/gU^C"vx0)LtkjrPI)*ENho S23F*܋PM=\BiFB;8N(4~mB!$B>f$)pqh*J8vt
1OwػR3rP9UKC	(`Էr9-H1Vf68+d28SCk6-^B6+ބXc쾦b]44xnr>TtpKɓd:$g,rU)C9x;a=3_g[5(l/ˎ{u0ӿ~}0jl.҃+2ݓXm3=WQ$43 V'oѫk=)&Yz#()
5~!oJFKVvW\WlGBAyJq,HfctGՆìܡn1aMWL['"}P]p׏
Qj.[Yd?'(>9EC86)cD)mU:lkHK甅ndrƒ͔Ũ`\+aRprX>ي 60kMpBry$@P LfVk	LFMd0Xl1.szjmƅ:'s	EICiV%#[ѻQ ͮ;]W4OL5FxtwP6AO0)yM+sսd0-<w2sbaN$#O֍	J% d9z) kD9V>nNd	T8ڢ6tWu#i2BϯtHC.z3 dXe_N1*|akM5!=R,L'VE4QF{cCu1@_Həd<ɴIPyGt0^sD>d(gua{L[֗OB:aUGѝi|-դ Hh_zR?`V񹌝'Jź:ͳ޻n{E^<m4rG֤~ş 偉bbxUߍ_d*%kzi9SԦ~<׌;d2<cvvgYTIV ܤBM\MϝۣwWTg:١$SEUtOYod;*^g#_]fu,YxZ;p>4bPE+PKںO\@Arm4$Sg/ P6]L0Cjz>tP0tqlsʴWX1LJ1v~Od4s|/«"l|WpWoyjgY9\2E?1:qbT5b*Q`M_؜ y<@ r-9ǖ{VhfԑBQ8Xx5_-+ԄH,`a+psw:*]Z&x)=eP\Wז:&Kp?>bwe-YQˣvm#W߉!##; e4Ǆ;i
N*+[ 20*ֹ:yBVzk4aop|"c/;7~3Q/_,v	$DSb#MXw+we3>(=NQ`vڇiI:S18x{t{
=-2T1I'=ÛpW0":$KS4ynv&"6	L|k#e4sՎC5ϥ$QG]0UVt,?3_h?b,@]Ŭը
OκK;_f`/8rgk)n~Q[
BV{jز:R>a̺9ol@QJ&0Jn0=((d;x/59h#&8}xnt<PkϏz1DjK[t}P;sdv	(0xA5ˢͭba/1.(_D.Bs,,v>Td'(G.x{߮{ɗWeW	E4pc4؉ɝs=	ǿȆ>^3-";G-F\!slFu$xQj9=

8:tqh4lEy
B߻`zfl+]!
#vtzo|7fSVr`xc75IFZDic`w)b<Pr$y"Я	u0!vCLuF8aN'4%0C(豭wEtG BZ-svн̶ԮםI0!h5$ sx'хmn*0tY/{-X^\p0NŽҘp	qL"cble0ǶC[!2mQvtE)ڭ`"'VYeʦjS#Wntyhب"DC~vAdy2ǘ@bgl}Tbx	i}MNp774@4@/{/xeq-nSxRyx8=ƣX`[CQ &\2+
"Qjj~9Y['IͣEUh+h>;\&ܕId1dtH(V&Cfk?0Fưe$E3*[OSFq@=o
K{9{q(Q/BTX+L<$4ح d\Ǌ+œ%[)a?!Hű`vMp$g<B;K/kljkI2:f,qPV!3b51<^Kt3s>lTV9/aJ$0I M*x(!b#Wڄo 2qȁ0	[Gly?!YЭG-iޖufṫXv	ߣKp+8mLqY0
՜6,T:N" TP!\+7pp$+*{nX͙`U$zs[	JCm`+|xN߭gRdnP)0uQ|@>u5<b)"NȚd 6&~Ρ&i~2(mksd[Ks8b!V\uisv}	W+ݽX(CkS֦c"搲@Js^2SVMelֹHWmSUjuxh	Z%>>)A88a0f-ahFÀ``*~rEiYH>
Gܝu'(ysiZ&ly 6 kr	ziqGӗ֖Z6O{}fo-i i|A+YmAr.	ə7RRi(67Cc""N'O\>&X"GJB6tE6ԷQ #UdNv4ƽ@b؋1۾kLk㜫vE\.4.kMѼOhZ3NL
Lt8Hg* [bc>}`k$+VK:t<5%MAEy)B*@P
>ptp@Q[*~TL̥99d)ep-Vc]PkY*`[Z9dnEfZv_@аteêPP@@W@;^|BfR%wC:E/֞׍fFu x 5	AUjtuKS~x+
S;[gk@YǗ6U~.e:c@}5Lɩ6N6q/rYN5dWڢgrwy:bM%BZPQlRTojP)с[XmZFN.L&o>e`LN+3HW/'rZ
:KrSN{נ+`hGG},Ô~%jhMRg3)\4e,pxMC̢/&p^N^~mX{卆5SH (NE33 ebJ\8^-s' 2MbJ0MBHt-ɅtNВfYPcbl	"a42-a{6uT\H597vMl Ї/)Ȭoo8f:\@OP;
'B
LC=zq:IHxlU /56sf	 (l&R08^xt	NGa<1	^pԧ/Oj@󐠀M=MCNK<,pmM!ŁZMF*>}✮)F,0kLt}"$LTj^$;$Dj_U3#9z&bB-/{+ \eYGS|ĥ7$h618_U\EI,EvW]sŉuԨd)lzotG>Ur`&o@b2	8L8WH$c~4r3&äX ;l ӏ#T3%)ymu/%5j̔@L0gI\ϲnq\ꉢi54u&c7fBl0քXH+78ZMF
'"-R6I8$Vܮ5J{)Ϭ3/[\fYǔf*J
UReX~'|
-J!Z^w0굵kPGgͽuq4\,RγMw,vQ:]IxomYm-a	d8Lz}ԘIxYpݻYv'שSΨ۫ӓ:^2Oae_k3dE~mpvϐ6ΤfgTV]G'z/b.>U1vՅDVJfg2XIDsje7́,g\`ϖ=)&h!9M:	SwW@B۱3ġ kB[	EǊ85`h7)ϛ7/EP܆0^u1[*8t(*Uwׅ2Qѓi 0>#LԻhFXN.9
y$T(qd%!lruQ߿Xegaaq|{sn??_7}	3=]G$WI%rtͯ!oi->WB{ZSW{Jyѯ)iR1]3/{Bf;`k5h-RW&mɁ~J*K;صud}ɟ/֡QrV߶hc.n.ze[A^~	b0 Hu`6"&{Wt׽ur!D䖚-fRJ+z4yԄ$؊' @!&kwPBc5ܭMI!rVk5 6H5\f]\TTjNч ټtsATFC)0Dd+TWA#EBLn~1pWɧ$8`觥ۃPk/[kҒmm=1 ~{twoaUA}O>i):%zDSIkVk587XޡwUJ ZƧ+ckG:z?gjOϮC9V,zRUxzed_Go z~G1q-=6(@U'>r~K^54%Ty#XS)tCޱB5 Q`zL{h{*3q\?y2Ua(AѠX)ˣl"ہKJ` &5/0KyqQIxfdՀx<62 b2/l7˲WYc}e_O?'tYOZYiЌbC4%7i+OB!EVT旟n1ujv){[nx͔Sa7Xw'r˾_C=udE$1UN#I:4g8g<٧n֏7dkάO;Os|_#@6=3ɇg<ř?\h>~eEʫqZϑ.\-.DHDUI}#\jBP鼄JQ 1 L*5yH1][bhY<[`7T=k+ł^/ ,}EwK-A=J຅gL|E	CL` nxS',E
kcUVNIWݥeFꉷ<ctr*^}QX	HOzI7)?hυv3].@w.Cf@CmCZ,Ds$	{0}}cCKp&10Z֐fmئOKMce9<vfd)a	l`Zz]!Pf+@45p,>lY42LseP0+8刈ԄgfY~Q}R9SM֔;.S_,DH/=|ܤcSY_gZ bR0'$;J>E{ۯlZ']`X{ ͽ ?&ud89>>8:+Ƴ6XSG"s'aBVngM&U&Mqxn҃V8OQIWV4lKQBh7ՇܞHMu.͆޺&C^'!l
0PP{8e1QoNNe:`L}ảݣV[t*sш~++Q&qz!^;hv0oiUgp$X'<$=4"1hpm
t{k:	$Prb:UI&&v	V3L!K3IT`1zhyI3!SZ#aR*	{O]䜈Np5Y(YS ԙ8O)1.-dLVU^JIv@
%GGʐ͔`x
d'\<>N9Gyݼ<n$[2Ix+b	ODvt!,0s ><ɬy
lbvCƉHpLV<r/E <*4JQՎJ@gNA8T4LT`{Ppp, KT8o vHs!RptMF#$oz2Ž$^A8HI뻇؝֬.Jd-.|$_b-!5Yb.wԇP)J,_աI/_/bfPRc?O?|͉ovth8~Ȣ_(uG[+r6"QəOgٜNrt9GGwj ?
'-p(>/ю骘|$Iz1%+"Td% YU5m+͋P"r a^-GG)dA&5Ѩreɡ58_FM7 E6DL*7}q!E8Cg~,lc E7U6`ۑ3LLXIpHlu4.SJt}ۂ`tnٿ]6g3 x5 ETɒz\4gĭy.)Ȃ@}6A-%c	"Ima!Wlf\ou	En$~!$et=. P^؜W(YU$M3 ˸`:A /VP&ډ|"IL>tB~o:sI;i-lD^#粏/o*$<۸qs8
n3&Е2UfGpzwxj۷m?tntW<j庴DE.~¼x4&x23`3x oo17pI̶g'sk
:(ؤCq,N bG>ɁOI_Tj8d1l.	J$IJO
:(nOn_q'돦Z-9}H{ױ K`hCu|Iad4it+f nwֿbWAlp,(*%PX]!#r7(&Y:80OE5x(UILc5&kѷ>BxфӸ8$/$k9`3%憻=J\nT|!9=k<dֿd?z۸bT4l%1tH?.Q Pu9PgC{}m@JS[ZHI?,Ɵb}|~fذ/޷ʀEN:@J	d*v|D>sa`ἶewc
Z1ar|#auy׃"'?+n]ZrSL)}d.==/@	{UIs(.˶_/<x"
KOs8A
m|'+, ŵ]kN)xlb=.X@ x)]lu$PIFሽF[Z/-B>`TX[aaC
J6+3S)5]$\DWwD$NSo3bvt1i@2\<x,
WHh(Γ ׃h||h4C-ʢVZ2<OCԋN!׹WMC%/Pd(Ƽʬ	/ģ<92D^`eb>ւqg0LuMGB.O0DC0kM;?8JE鏱 ~qRJMÊc3&d)Vݘw8빽rWϢ82c~9G	/
0Wyo2/^Sbp$W>O4w+f]̢0Pe@SK*o]&S+'O}!+ )@3&sgz)¨J>S&/t*&>g9ꃟby;)f 3%mw.<">ǡe( ȩ+OEri2hpG-%|T(-o E-DwJ\HWhSCP^,e6MLsݚ[^C`NcY5	j=ҁdaƩA^$T-dt,G.t5~Fep>ޓ+u32O_SybR8(BQ瑋V=1_=Sl'N:%b&9uhvۇ$EB3$]<- Wa1q`$5,Q>l)G)m_'K4R>/&RvxPL~LOo dNtAZ>E/¦&Ҽ-KNrtjAt5>/"`XP!,ρ@i<=p$q\G(^~w[B+RX{m:-]lRC[kIKh=&6oETU:T}l MsDBd2BP:SŞގ ktF͗;!?l[KKwM_Xm	}(q5Q8}fB:$ќzOiӂS1+?JK¦Fǲ[KJ"\SyYEMEAa0k{7'wy7C 'A'sӏ\:>_P-t6P>졧miM;	f#fjYFfѕò?ǭ57	 $
߀KUq%BRrjuILK#5_!<<2Oc)SzdQ;!m܆
?m*pI[i
~TL9L@No*=Pޝ~4iw|F,:O|n	bRD3z9:'6o޳+kyN_B{K>Y5~lB8#oVM+)=5$h-_S863݇N
gKxfߡ/Cۅ5a<Vl;467
őH ..Ḁ\EI	>0ʏI07KLfȲe
w+qdїcы0AktE`Ճ~A2UtETi7312+V	rQұtݫgϯ'~9~
6&]4q	bhWًnfwA2%q?c9p{6c*(9KxVK{q2?roاOWVɕhz$NsX#r{z ×90!=⣢J,LKG`4jc5 E7/8]dOsܡPs%,&D|C#_,]ܾhB2o$xB̸'g_I@XLӃNX:UӢ'G[?BWa?Kw[ƀ;E 	. D,O96ض虜OKEO e"~RE{%e$=|qnٮCٟV:ƛKΑ~3ȭG()ͥ1^SS9y^B[ɁC_8OfڒeIn3鴅E}'&y>8tRB
vFw:vKv]q<WSnف:j|Mp7uaCrxA.\kCZNYl̭%8KF@\Vc zeypEjGK1ܣHWDw?8+](Rxrv	uKugO^>) ipx5a30~H"5+aKMQ*_Ul\ٽvќ\U}W1ɵ@߫x/se:dZhO>eD4ch\<7F[`I,CK(	_s[K{=k!<ޅe,؇a)uNE(8{1jhwMW8FB."8~*nw>k#ݙ#vG5~;9=?rp"" p)n:*2<-lg. e֒ea]AyhSW]!9pgO 6c.յ=őkN/3)AbAtxLY?V{I5[JfW{ǵ_ZYew>(?Ǚ6M|pCܚ?%ub,	RAUip5<ޢL+uMpgUC1Q;tx5 J,EeX+1*I gbΡ>q':nLh64W)#WOOYLd:^{
Kޑ;cȋ}%w-U1+r#eNb^չjZ?(s5nͤ biW		EK+!8B=}<NHz[MO3ގ<;|wp v2SmBtg<8NIA]*GJY:z:)r^@.4FxI;D)1'"WM)-8qpEBW4E 'qƈy9,#>5K4ϓqvN>!PJC@ۆO%_$PXֿ*ɃD**xf6
9jK8]W0;}?]Mi	g9 ؀Vd^v@]ksk5wt_KZo320]HԈ[KZ،6]dj;"׮^XvSr?Z[CQzߔW+r8N-g' 夐dOcѩmufd|#ٍ XڀRadc_Vy7(LhW\SYqv(trhAJ _n$r+8](jC".p@)Ĥ.L3l|ݽk.6!ɳJD]&kW!J"o<h&K8oQv'as8qqֿX,4-b4%F!	Rb%d UM>9L7)&(	f=h-^JYo.McgI^]A<pB{l'jMCCSΣ	e `A4{B;uvZ_lvZ/ÀS+a n]Rc߁7VL#G q>u1zean9|X\I,߈~7URQǟ@>@}%ovn:u-Zmlm컽Hu]KZJ#qQ %8 V4vp߈L'*j7?mC<$Y_[
{ի㳷ۻVwAQDJJ
ɏQZ@jiEk%dZP᭢B{V>/Q?th"ĵ"'{
t*!eU$˚G*<TtWAx'FvZϟK?$;V(n䫠}i΋5qr,WnNmf&XBM 6֞ٷOB}ʩ\^_H̯7d 46vJd,$!K2؅[)(g]+8euܐNtN~ǜW{?V m͖me)N|Æ͆Ka0bhp@2o:1A;UŎ΅IOũbI6l).^v|k#)@bM;].REeT{v/Uc'.:l<u$5ZA[;L&]AюGR@|9`9RkE?M&#VPE <9W!݁!m6-KD7릆;/båh%q>Bc%Sͦ@<L$7?ZT%'T9IE@!ے՝}9;9MEyw35ㅷ}W{?yx^G3߶~L]uұ~?>-Fvg=g hmڮ_a\<s>[;!D̆PBwfs]Ps}ՒRT}{)dm#oQɎ͞nzF΄o}l3f{黛ށ"b1Œk{ӣ2bC՝Ȼw'{C=~w,£iE=!B3z 0G쁓spNEΎ\*ɘy78fq0Fp3UMċ_'Z!U K;s|uͷ>;vL)f9Zss?x6TO7^xp~#d|Ev/L<sc1 ;ؽpO/S}j't{N%%O8lF%V\'_mw'j;QO#	>`	J}q!7._mڇm9gT J&It/ +7sF5
r7C]⩢Zu1oŉDd4Zo%PbUR%!u?Xo./6fJyK^&uw^kv[K7zCq}tENP0uM:TPJ^D_pʢﲕ*A%#=F'&ɅIbHXzPA}o9{Tfvûaf0xV۳z⪎(w]#nkp3cJb>r:m? @:%н˦J=P$<t3Mq,E*$I{~~6edH}BTƤ/Ջ_^M?[Yj|Rke B_Si0Z6c	<҃cZáOjr2bIjqj>k8ઁڷCR&P^ՉFߜcc6fO tozOB
ƽ;]DtdS K'	^=CGO>B@Ͳm@~7KyR\l%Wo
'j	n1E=ymr#R/+p:_c{fdN_c-MZ~8ubNcoCc ԡB2% *.T

A coFk86 TW9tD3E8m88m!]':<$T#G*I(S -9kUlqm,1'k<ÄW)U2pInG"#N8Tv~FܑJO,J_%(fj/98&VL/CL8Pm'yJՋ|Nnmzo "Ю"N<ucHݤpĠtkıӯGN_#*6祔Ah%oYLZ\|8L7e1pݷ!pd"%2ՙrXߥ~z}OhR6} vB70y2w@8*u3jnd5ƦP]a$` 7'%ҕJ+	+ɦ-3>,>92o.2LH4<+7:t1xD^<X9y0/õI3=\s ;ZѴEr-^U$>آ/qqlWGG]eV~:r}ZHQ{"D)4ܔpп3M#θOukeh/@?i;XMz.]<o=ۄ
#~[E}mB9K2f$>I:T,D@Gz1~$"jTf	&l3[,Jҭ-EY. bGqQ9n2)HMjXa&I%dt(H`(E)MbTOsCt`TP]5͉'pHoOw^*GxJL*dnw0n hj	MKW*W&?3J&ˉ$&hSFSS7w8'G}R䳤~dbD@P9ΕeIx˃"4b%V݌ }	X-&?ų~;?lBm"(CiT\Bmaj*]*r470d?[r*Gͼ┞쏞j8D#fx(TA9J]i^l&YgoHʚxf	?8;ko~>ٮ'E2ȇg?Bj{Nٯsxs#W٨^N
y5TW~>=;>yMcP;dzɦp71T59*862>pIS#76d9:}rws#ش5'(pcR8!>mZ|h/f(TjCh=&7G@שvv'{oOj[hnנYv\&wG)bdI:?3w+9guoFhr}M5R#PF(	
6f44ë\'-|PѤdbfpTiۮxTLM>`wa߸\|x%}8OT5hC9*{dmfRZbcrb`k-Lr8aƑGG˵u5%VC`;{}#Ys꺔g?ο6,gT 'TwI`jT `b5"kLx5Q/()<֚+G0eߑ3C<@]V',^8c #B6#! D~;[&zYPJpiC8eY zE,$F@r˯0Ne\#fU(-q\eL>>$@ޚPX+9k]jh9N &	a5r-@u2\_,ר4I#;k2N?M-7~JSּ'7"a΢q>MCL:%O=<cFltK?2U2ROGY%i38?n:ث&m	zA1ߌؿ5|vWߟ]苪ws QNQVi2%!f_4>ZQ 9{;F-!ѱw$$ң	CyhB0BB\MZكZ#'d/EshҁDњ}O=YaS%X1ÒnKrr4,*~NA*q$ዂ:+z?#AÚ.TWZގqcw{?{xdMVI(/('hQ7))b*эH00кIq&]ͶA$F?< e^eJφI-?M#3TYQSP䷥=Sgf_Q}MhUz5aF
r=f\ kGZC˕(9Q>| l~ļ,A|*8^(b&p~_lCDuh/ڨGN	J4bqrjԔ;"OE*nB$V֞Ke3-h$׍(zj"RD8=:tOhr
q.@́/Aq1ڢ1./b'v9"+z~zݜ%3R(v)?<zyܾ(&V	0m0seY"Gj3rk-y.Po=سN鮉y@N	uLy?ip/%-T(JtÉoݻG@"8|*dxO@Bo$qDdFymF3En	},b#
J1Ѕxbumf4gxenYB%-ܢ-n#}!9BFm
d}Z5ٳ7|3Fq/OޡenYJǵ'p<++&R\Eߚ{ZϮ={uR永oRNL{ _DxZLq!t8~w0kc
Еg=`҂e&vwC_sy 4c
)!]8QI|3?KUEHVjr%lv^utpb|Ow/ bǠ_&?iֹ;b@	rהiAUɎ*ЃP#Ϙ|N4;zӹ|iR5[rM)؎nJ6c*q&9 wãuN[Z3oZL?.J(D"NX	]oj}p`$gd@:%_x2-ᆥTp!N8eiۉ%i
`+g~Z_)tH?Ř4V;<=;cģISGlkMtk\"ں[={.lCZZ5B'.36wM2#lD NMw/7cep2*גS3PzR:R`4qrEmmEaϚx$>!NU>܆$kLG#kIE𶯌9X	c3[͟%;¨#Jki@{ T!#Kx)Ebk#^H=Eb}I@14pgd|C6QVNF5c]c9d
m!!Wh6I쭲Ťm4oA޻,p#Ȏc$msZM`1>&«_|%H>,<Ώ'̻t5dO;kw'nU컕vk~vZ;'=;zko2yS}lw3\K@.A,y37`(-!{9!Efṛ-agtm^y(5`]KPѩ%;mmhsL07-RxO;#TB_me|[H݊/Zн	*J]x F$~>B"x,DVO@Lb I(N8оtx~5Ƌawk&TRC:E02pDuD؊x|u ̾Ԩ9Zmg;@$0`#UVF]lP噋>wuQ(Q	BX>:Zv̅+r|`^Ac*&#HE5!3IK9"ߞD˿$apF:޽o	ѸhGԞ@Xq!IcI梯/5"  {^ROqD֢hP^,z Z+yVvٰ7VcoՌMo9d+65#Fڰ[_u2Mi^Dt{| E?8Kd4|]-&xAbHTYr;2mK"Z.XXa2>/2\y7noQ6Nw'M2nraE6ƌzpLӽH>/!\MrތI;[Qu5h8.z,`WiY#Mi.OpKK!TSo؋XӯoQz^:D#(:xɥr9.ٔ.9)9vv9p
A&h`Dnv-!omIcY7)As7G",F!Ɍ[f!Y}"R9Sˮk,/YQi25	YSP(:@`*|Zq`܆fm^ۤVY;mU<s-?Yǵސl5}A.ZG3mb[ٟ_>;}`k-|]=®"b,?^B,>C%DH^q:|-e=ߪ>Vgtg/u?2ӽϝl<Ob
tOFCQl}(я`TqN'M4EChoF6_'ޓ^̉niTk_;!$<OkKJ:@lw9F;kn(Z^ݎw$ ;=p):n fQ?c?.G6;?sc<}
`p!w{mczolϰ9l^W{MZ~6i'o}}6Qذ2~HyN!c<}	A'E	[ w5vWN/~x?C՞`v4T]L&u 5Ȅyh`=oDPHnKS`18яDt')qs|Gwz&0&?7vTzZE4^еEX,n쉯;dF!Y)vG.]&9-T[j2xňQAD;adM4'ߚqI9ɾ2H>0Rc5QЯ񕂞PA_zKA
..6@(];ؓBX?DuäTRdRww`є}TW
Qֽ9?VR쌆Ln5@|]](TI6XR>lҖa/@zaSUw<1 }_KCQQ)8:͡M}(tDAyovC?ɗnn<
tȗ|tȗj8?Ns\hu1`V۴i[ٗ9~#P_(s9<>j?D)<9#(iWxhG)0 @k*ӭV1ۍ*NG`6qчG:pں&{'d'}E+kҏkcd$zC>=i/Vc=1(@A^1U>7(z'M3L#F5/ (} [2)p%&3[y/qY BۦC%ޓ1o=Apяߠ15J&	
96`:O̼|<n=&hnieE
x<HT"Dc9vV:5G̜/5c0V,wxxxB~ƅa˺3tǔŞݩ4Zdi^pwq{neYM;/.@QQdq< ٝ@P}R2rr,B'ecȈ0&pnlf[|Ef EUH\=:MHz)ùb`C2.VꥍKn}aS[o	{d %;8NRyV%$"Q	!TE|+At+۲ή]Nmg#
r"i#pplfnH7eb0ϣOϸvod0Lc3:m`pX[A_e5No&hUaу!>_&9
z/0D'_U8=6RkEo :|5{zґpP`M!i[ .rG,$%f@|b!	 wgr<99(c
 Gb|赘& N<ӳj5oew`Vj(@䐢?;MR8pO~.bA3'[rAWn!CpR 5 lw
.4hG,,=LPՙ%;*S;N"xTʢ숨Q+kX-CN.x]C]kHuo4cw2#x!f"ߦwA,ONOojG5rM׆Tټ5ŹƏ3![vv;H{ܿYX]:z4bEIj{j7uE1<^I@"<	âJ; M<zk2-Oz[[
ʭ>9qrnS&=z1.V'%?8Z,Bۻ,rBB%]'sA_uVQĦlJbv]i˲یZ[LTu{T +|衤o=D[bҪe^ܗ3u1jɼ5<q>/#EP'3Ti=sUȻR cDM)DO		yew]8;*]Hb)|G(=9:<9=FoOj :3yJFeM5nA`w)|M&vBh1Iy|!E8R)#r}9rX|Hf_@0'YkLT@nZiݽ'}6?,VJXFmo{@/7n$cEJgQ~J0nşÜ52sAmD)Sտ)1PM4p.؀:E@:\q8s|}/{41tdҊ1V5vRnR	$F9;!<U0{oX_yH\s&'R8Lv>A$$^]
vmfm.9FRN*hS* hITU&.:̌v!+j'arpxb :=*{jݙةgp.fiū=1Ц/Q7|Dv@){nf|r9*.۴$gċxu$Cp$<1=c_F<X&""olUma17\@njjL:拲Bg4׎Z.*P4d6~h6v7Ӗwc֥wQFCLN7ڂ?ܓ
|C@%uY',M#,}uRK]\L`-X}o,4[~LH%~7ۀvpgpFhW\=>K864F@mЬɺ!.ΫziI<)ƭ"q8Cf<P4EooIm;}meF^_x`OӼҁxޤn<5x薉u՚a)T`qT?/PQyy'T䛃/<q3.o /oJd!( :4V=il%ŨW^bb/%1Rܚ`Kk>ٌAT`uLmy<E<q+#BQFKl M"U>?x?pFÒt<W+ynҳEL;#'BMQ级M@_̱Yٞ%L&$&qSz,q`ڤy=ƛ@yoZ|	2ms/61#ɗ,6҈GEijHc՗BGEn=WjF6wc̙G._b>jFmQ$`-jްYQ1	4e_*?t[˳a_,ZЧƓ[	UWwjŶ9dBCd.6}H5vW</][߄[&OPh^q
Hn
tkNX/ԝF;A1l1|)&Wdv{w ixTD/NG ? ֶ`h ~D=8XӄH.*,UPy:do$sďԺ}ȥLg1YRMjtZLF'weUKtBZ;zü0/Xjy%>@+ġèa;
F_^91&D(ޱ>Hsvћ͡2'rp:"3}QM?3GXd.y뱴jϺj9O^-G8}LD[hݬ>__GԱ.Hrt98}&.)܊d#3>YП-4)N=~SKD]j]>`}Tw4BBCD<K:' #8EҶ1^N (i-n\$W@%zE	D2CιjKzx=qBm7
?KE!7In7|SApFclAd9^`fA̿&dLحv.fkުץ9݉`TEI}
}KHr[T>P|ɑt(XlihH_:̪L>q*=G	G6DXw7.<wcv Hr0;w'8Iв9	Fb[*[uw=?87|PEih\r~>?OyxBH
K)s\h,:P,0:Ș1d\yD
bT؇;cφ}g}.&P":jf=/Q[w&ߝzƁS6sAxzM[=Ͳn:|%(\]Z!E@a`\)Z̗/ 7Ŭ03c_+.*J`p^OOy2yCC0rλX6Tz:	QHJK7^m;(5p~l#1 En5qLje#S9 IYPC&wHbeJKvJ;2BTO~;=FOÇo>;j(`C,\+`KTR(0m.&ŨxUo/tDF
j
l.irNUGyT-e/hp\@q(TKh!X^mb6%kW[;Q1	6bg)|fZ	u=sѰQ`qD[rA\PU\-[ oP3t.pq9N#cɽ4%,1X8,!tB<
G<WŀCp5@rk7i˱>qMA/!ׁה9hB&:\gtaHWB9ʤ-[A4gz{_^n[\!e`5#' d2q(&Pmdd6_Sx;D%CYG2Eܔ Ċ@Wg%(0G#Jޢ~xkQlaOP䲄 V?laQlCN>pU\31vښD!v`{ g?GZ=?{#Z	`ܼ]R?}]sBK@/5Y;08\;*ں>Џ+C]LXbⰸ6CzEIkMMm$3(?	vձZ*ya7Ere ONՒ6܌G otRK'8VrWd:zc},] $O2I~zVKp"k/t౾ju:*X^VpqD,aфY"#-(	2g?f(;h^=֌2ʀAQ+ eyC}V=f`ڂ^>d,FNe[bGKc&V*:cgQh'#1ԇp?xZu>:D\gŴN@;=g| cG1'0YZKSxeA@y ^B,tȂ4sY7+bj;beCXÑ\m [[qE78&7[%#ɦRMz!a;߽Xk	M8	yj?aڑ,坺4ǝ7{D(~Ȋ@c4;`
5+f;*-xV1TEe$43 %UhY#L@[$3K1|UO=(|qLwi6'ۥ2߸]\׶`m`+FiWeY9O#-IBgfEm6b!zhܝ!:tŏ}#'Ʒެ@-?HJd!a(D~#	A-QG>%#T*t&,t oĩ4$GMAΑBAVqRg՜A
c{"2(gmc{`}=岡d :Jke1u}'ob	UgJ&GڠiFV#y)` e3.=7ޞ%^q>+rd-s1ϵ0΄Jm:orV:Z:V=h,@).lĠȢdZ>L=MwK&1ZiÉ/~R-?Sk-^?=[xD=R".⑙@#b"IjǞGAZZѠ_glaM}N.ʎۂllLHvqe+[s%`tӪ0R~\ğ=jo`IYg>4JxϞ:>V9+/d`v!͆%%Do5GTTn`G6\[d*&DT |z~ Ĉ][%0J [khU-ϵU𵯁z}nKr`f{ bNrE|7 7E4~w7 'vt  /uCmD [`wafzmydXҴ<O I2X i/w~j{?݉bvB+0#2Tid<XtUGz]*</&I_@l¦9J(kwȲ["ApDU4~N)8hJjΜ K?ǚv4+Hɳ%JH;<7[Mi롋eA-}9xU~ʇ#M:hr?3|xP֠a-hf*=7E)Zj4qҰO8N`jVPTp?x<,2k2EnF4W7ǊAHp%_M#M2ˢ	Tq?i"<nj<hN?[ڪ/Yގ}NFv5
+-U@(R QA9MfhL蹹ҿ"T Q*WLm1=_</ٯy@}zՑ,{KߚnЍ>PLsu;9zyn[_3Bw0O&{wk
jgO4ӽӨg/}|nϳ/~~G{?~u)R Fj8`6ts]MLdqæN۷\@T0R [ rиS);V][@$ǝCeB>p|{p_Z^*<l8)z@^34|wop7Sozbܬ?U/m3wj#1EK$xfFBs{[^gx~g,1eNy8WS=nxsB0_{IqNpzYGNOI 0]Em}^'~D.d,U8Z/\i[܈\Og/.`JxCp=sGyCHw(F!R!,Zя%7As~D.?O8&bU8>G&]_?R>
2yKT\ʮ|r^.=; Xw0CQ*T-GPal`Mp!'|ǚ(	=_BxQ^iE3NM%@Q?hМ􉤢׉c,UQ;4|hG~2֧$x}>A	xCZgY[n *JIR]}˻k`*@51UmZD߰\âk2z^8"oC_yo>bG
yp3ѓe0R<kCxbj?P۔-πE?k%gEԛM]a7ئG}4CO `B]yԑ3yvu!eҝfq|GW1s?8~8Eu29L=РKM~x;?lwt[$Q.+Mk.6 XE;1W׾0NnϦr؛\hQ`.v8b,:̆VOMgؑKdsӉI.D߂FW7'B	Xkl9"`w>u36otH!|z}S_y硝l`Ѩl&iA(5JFĔsc4KɝHRMdᣄ <ѥcI̅ s!kZG<Qxܿ⧉rHNyu4Z 8iC1|aX`]_&DC[:>5~A^&'U6x^]q=)=)?n~d5z% 0Z8;
\hǪj0զAhpf3L<98.ZB n'.cH?4HX^geB)QB2.5NAR.c)6LyW%w}S_A24Ü,UJ2lVG&=yEb9LMDnqƀ<T*=5ܢ,q(?9_jvz{=0Ҕ~.&-0+e4#i0b?$5
`gc޻~&yQn?N~_fZJ65MV'8L|!/	Ӆ\o7:7JNUH׀kWrtlqesJ+qSQ?϶4Q~;	l1N|c_kC!Lwsts߀/$Ԣqf.a)ql4_}nz0W;?GsLv/3L8X+$mKr_Nmq}ui}N1y}VӡPt䉭8.7.ָ
	yjZ^e	/bm͆c[(+)w4](qƹa?4Ze`P=>hi2cF~?h/R=ŨB-%Ia 'JPR-猛U}DSsTt403C3iI- \Wq۳Go	Fnk㐊{'Gg޼;~tm 3(yygjkSewGd}v}xpAs<)pw;cz7,9+^9HshY_d'So`UV㞧Oj3/Y6t3S2f<r#8|,!ۜ2Ik3FW]V ٟfc8PLםaf^)2a PE>q$BA9ȣLAm!gĤ$3فA@W MڄTC(@_u`sDqݰBMp2Γ2}	qƛYe̼daPpD3]8Լ,@<<XE }`9<w\;q!/G=Tgbgj$ls,YWdIWU0oM/
c%ջ'{;7};%;#ԾɧIpGg(0?o&KH%«eSr?#S 
w_*8|;ȧ)YO$7Hu9φ鑟'YHr8]a k#>cBbٖ
E>CU rPGrY@ZX!cxx<Qaw6q^|Tf%fq;vϢvKrUcbZ~Ξ?wXok1֒%[QFg*Iq(aU6>^7%3|}˶HHݵ^>[QcW4:*"u<G;4̪~w6]@Z`4+OtEesJCy9rɰvN&wj k	XM i=s0'!a1{L&p	xj E^
K!p	ivw!1Ob{'i%WZ`	tSFqX c91)+vfb)[F!NFﴄ;Q~0<XtMcĸ$"6m /Uo@c7U#Y;![A,*gg\;PvVA"N J!q>>߿_}㧽3p߽c<i:>bws5Bc{\"K@'n hqn6K|4<e&%d#vkk]}S;ve5˷1~OgMa%wZ;Y%o۶1Epc3I\WA(Ф"㏨8+RD 4D»w'{gopvaV*Ai"nCԝTEaFTz;K1MID/f}Ò[9/-l"2{WPcsc"YG9Q6J7pr]rcT]'P1{9)O P꓉lu,-j0^V埣$)ŜE8[&43Aī^$*x	4)PE/ "Nj>>SDE+h4ł{=b`Tm=h8%1'HH&th8 &.HZNC#yUkF~ZnK!17T]o:d؆oCmL^߮	J۞4[Hۑ8ֽ3}J0D"8V3S5Tcēc^Zx<wzRcR0ks}LƢ:}lSM8 /n\2&@ɕ(s^^1 %[VłT`M$M)*>$ꆢضL|!AejGש9aA8wB;Hg(㻻~{s;;tB;xw-;֩jzC3$*XgʄEhɲlb=<L4%D{\*֣RWV%~BɗםO{oNbJ_-uk'=wB$)-;~?bExxG.8Ɣ6	"a^]']OXP9<Bi1qP]	ǩGe8PUPeD#l?`Y"Xa_)2OCӓwoO~:~i|{ߥ'kcqQ:pkk9hJ=聯XG"kyw
:Ӑ$t/R[kF9`ux>$\AT-X|4[B1kWX1^U;
Z:iSٷ.AVvUO
e)}:AԊT/ݫl!3>$ص+\%eR0$Ȝr((g]kp̸>i Hq/ڇ3^VA6+ݣ[cs$$uʧtR9;?մaŬ4 ĭlQ __&.T+a"Q!d7!`)Q|L7-VsSDf)2f
 ..(.+T1`"$CW!xXtzN1]K \Y{cIHT6Æ0hO]AH=,L=B1Q
q|*5J SE!9x,wi=	Q<KsS5&fs1]lsPYa ?ċ[P9ib{۾8`qer*nZbk9DLϹHe1_VK8$+yb7ӏ3-ҧbAIߠ(0A*J.g!k>S؂z<`bt۬z/}),OnJ>[(#'̓w,j+8_LAsV->?ӟCqCB zV>}D0TާXQ+C?(sl7`@qs*:q[$Ưn}9ʊ-dbJJ@
򓃏,4{AENkR W#zamP}!8Nj,hPcA3{dѣ#aw̒RE`!v1 Kᙴzm3-JyeH~k!ŵw )(6)tg$8cY@#^$e]'e+58,iSJLgD|<@ P#fj(5fI )f6d' ocpqOPnJK-,F~0}S`wd8%@"#Qϴ+.s
@b5;9qƳ$u͚׷fP"i%psޝ?S|[!/H|Į{!	`{PmSI|6u/ iD!-H"F!yi^׼mBǄ2Hfj6X@="`W#Y)aHf!*}P86&NtHcQU@KKcf?Ԝ_UiMK֨4!I@xiEc50PdA͍N\ڢjڹl4OfE`Nwjڱ!iiOs*1K:
y|=R
ct0
č%j1Nq}[׎kY^|VpqS[W2Z0TFW@r|mAA
m]]SB|BR:TfΚ[XNQ?:V՜]7J=TcFORJt}["Rb.,ԓP9I5v!LXkd,F$3LR2wO)`xoƷP&B}GE)97$:@wi(P2X~		F'^<0kvԏ8H]=\O| Sx!ˈ~"~ʵnml8baslc41?'%33]bQsaCdle_T9<m3m4BS)G1]p_jlP8x:(Gn%Φ0:֒O{|M>Ao 	dw*.x=)SPp)p%$g#qK| A$i*@ٚO[*&NmHu[ǻe!r_[˱wގ*<p9ԃE|)-rБm_`ֺ)ce E0C Y~^DLB±5yiф␙AI	VdDIv'ٴ)?C5K4NKjI#K0!%cpISаps)wGN"y{rb]yPI,16 mh|2@.чc2}6+Hbuy}'Igw{j[uf-wAa6T6dsaǛ^A<+|Z^;M.tU(#`I"ϫ2

swz5:d	ByikIQҽ$N3k<6ej&C6_#wȼxhK͸	GT#Z<BH>|8{sqSxle]cv5k{2ĎfC!yr"`;j[8ɮA=cKt}~_|DXy|+uOz0w;st!PQga=1$B]L/#HY/"}ոЌ7,@kbBO'ۉf$/PrXM%Ӫ6>]ۓ7,X
}2N' ?A!+#TkZ@b?ETq^&c+#Ǉk7EH%o&u?!/.x18aT\e(cܔOؼFuxQXpꗃozr쟜"l~?<ٝRe1cu(ÿ;.ReniX3GPכy0]Ǵp)))T* 86DӔ3&#Q(*mC%2V1GN61ْDĎbhJhО*K0Rht<Cce)Br/]Hp|Z%KWdkSg(akqxY?~
88t*0XSӲibVRX	CK-X6|@㭠ku%IW[C$=yFNzFEn
i	$A8V24-Z_Hrwdl1c:6~x=gpD=EUrVD><V <ҬA*Fdkup![kA߄QB]p2āRi`p:=럀f8qZm:4gA=,?D1$Cll(<G-ɋe7D#%ȓ* H⚬#vl F)D;wWzwI L:>d2OH&&	Tc7bɰM8EڔHl9Tİ(@JlEň9ìNm`?jd74"vRud|AmlTh/%Cs<kg
Q\`Kt޸G&eegRuMqe>A{X94%|Ql妝ƢSSߨM}kO}c7W"lXp97?j7؝M>	~x8&qMKfsI=%FiU?:-T1bH`\`G

1*%c?AxԄ\UExX|tslQcrvtI֚aK[Z=PJH㋎OT89HEoIBoԭf.KR\<tuw`m\0$c^kkO|aq/etןC|Úq_Eª	W!"[+.6K%ap,7Vn-Ֆ@{ؘ0~Z#jITfr၍@
U#؍nݯ?&FBoWCaȗl<9Ou;TΤ3:A3T1L(	H&Lv$E8Uq#^UH4&t$279pJ͉ q6yWGyv&;,U𡮀ø? Qgng9"v4'3l
V~{Yv	;>h(RDc^b]}Y%F9A~.񺬲W *p:yu6#M@xb^Q2u>q7$-q4u*!6/K>Ϸoʽ|Z9fII

)~KFV%Џk0jR%b*Lύ? d4#,񼽜iq8Q]"GQZa7My5@}?"+HSNv9t߻{#ny+ʞ. 6}'_ψwKf@Z$"J;3gTDc;\,ugRWimsHuMu7KsBHBD8.b-?s=m%=3vv63N.`5W+ٶ7y֖lfae#+@̄ (J.!<fr\k4A?nFm咏\xQbzvzw<ؚP=̺fz~`m
/>|͆WAB?|$ҮꎎkLŁD	[x@'!
mm
ۨ] OR$ptZve!ċ5ct3p`ZhSK?GTrC<CJˋ<KKaXO{xQ.7NwgZ8*	i /mލ0xgܲQQި5mA_#3	09֖zh	siĈdnn75`
l?>Jf7pQBGw^C	1{7XMԃSaEej/,o6p+/Ѭ_ 3rMlY5dU|9h,?..0UdA\WiU)n0e\}>m-;V1%lϡ9=BRda ay	jBkثӫnx5Mr'sGy	Kv%?s -46O76R)2$bfÐY!B)㦌p"H jds`v!X8Jn?qd?,oZf
"ua_3<Oyy	ɜ"},!iGZ:DO)ڦ=*sf:!ɦ"QR!BbhǃKHc\HT_<'~07RK8$ҐzK܀Pec-!sjjtE89g0z+>KG@{cz&]:uќf`=3o5Аn@ӓ-Ѷq
1bAuR6Ss=gPmXu[T=%UaꨋU%!.Sh2zNfI |
87NFu^Q(q>U6l?Yt 8MclH' <1L<bP/[4HqpP=>~n^lMn5b";MmӘQY4FYaZ-7@>fo 5vytY
|;
Yr^+rI6Dl)mԀk^tSeB?.3G<
'5
^<je'I?CZoDv@ɣ;l*jGeJI5ɱXp<q=+%͸(i VA	?"8ZQ$896<>Hk3c@I]?6}MƽaJŖV9$RDF$>z]@eĮC"gTƅi$y2G*ڢ<dil6R۫LjoɝU|;ίj^^ou!b)*͉וz4.1y퓒2~<rIhr])лJ" 	m*)jޙfUOgE
G}%<.QAĝ7o;wZv~Jklg&`_?jRv;"Spy؏Z7u9Mc}c8mE&^@üWy
D_Xa.#-]qa\˿ԭV+cj`K*&x	7P/厴]RE< 'Ө<Ք*O+ݕ$xHSİ {E^^^k#:эp3ϱ5I[ |pC~~a@m\ˍ6`@,|ExBA6VcJ*:d1jd~b	%^:4o@,|Uxp
SB9= ]A=!	GJ=/̓`IWE#n֒xz M
ϯ;C,;
ӝ/[0bmD=sta#},ȭfn=ҵK[)6OlaP{N_j"H꨸
kHLQH a,ũYe	?Q~F~슎8ha61m7~3<8q7\6*3W)	~!d762̼m.8%9Jp0ۈx@k7捫Vώţs 5$0kD8QH.=LnIUKTP?+0ܬto/Z;`<Ef!ނ`j/8q2Ϊ[M?(ʻparhnü7C]>돇dOgo'/߽zw|v{wwG_!6\"yR*NA˟nAM7)[؅T&zw5rSI&i9탼)
xWܘZ=Wލ}.4_`bkGܵl;ܰjM.J(-CڿƵ073ݸc}ÒqOV|p5potF~sےd)U.(bV	{}n6MWQޘStuw$y^YDzsq&QMׄ}q4Bu(JmbB@@3샾[kK" WR^J
w)N;
7i.P>G"~D_EC?:i=DZ[dnHHxZf%{<4+wiBBoX{\fR~e95iy<TJF'w@MlU+m=YD*`qK<"X?
.`tb|q/iOߛ֛7s*bN5cLo.eQ6X4լￊKd0bӮeu.V%̓^\<nGU9c[HamX*tv[dA$S{UkJ7eTQ!%C@̭:jbNkYoٓ{WI0/k@-^SK:ULO520Du"k
2  &P">ɷ?m!y2fLïʁKY^JwǷ>Mȓ5ݶuH樌hkɤG|댄oD'0g/mwv>0'^	>~"V b8L
ǂju8&SC؊<}D|
(и"uO,ji*B2=flj9¼-@bSj6v&ѯki,hhf/xOP"w]UN[ʘ bVK0}Y
_PBZ,6jSyo.08\=PsMȠܒ	n7NJwK2xt)x@b[)7-#RRl}\jl]>\%貸£r	=o[ρ.RMBCǆ߾/?W^!5Dڀ&45-5Cu񳠙`#BٴCjڔ;߇0(q( TIG?M81j.Wo<ogv^Iebpz!е7Wsayd.TCf-͵!21n	wJAR֝>y:2WX`:Zxo ۟J-t2tK6x'bDC2A-8</ƨ@+0%+']Ifps0٤7K܌υS!\tZ}i:/tOU_@W'{Qd%iJ[w:
UOs>ɳ_k=a3x2+FŹ]4id
	q8z;ͻZ5_4~6DOޱ]@pQrSFH#r̴XT?/?W E-EV}E*ѡPIjѷOvDN	>*)/+ xQϣldȗC:x\R5P]AҪhf/gS38-iwd'ʫqz'뮷KAyB?	OwV}įzSM)V
!M'Uȫ'ό:
eHf$nb LbQNiSCqk'lН3O[2%~bKB)_k_^5(vQ
45]ẔA_X	;n5ZVa:ɐɶ,|{3<a.M2zb	FN>vCy;,_3:S8fn1[|IoTc}=e-gj1>D}ф g?t	h!ms+XO'_RNh
ϭ@[aA3-#poаFyЯ]34"g &6Q3:pH&!M|N,h#K ;`D\\\dI)uEum ,-K#OccDÏXg`k.AɬƘ54Rcï?̡\wbqA`lzߺꕧJS [D'6q[Is	Erqb^&dr<^$IV+gOks˅F[Fj88u3&\#&(UH$l,.HJ>X+iX
Ƀҫ1P=F,"P_b!_gʣ@ {s-#PٷE/r;ji9fym<	I:$e0x&cF5;3{TQ h$5	V o53%S c9wsz8b$ȸw|SXZ/ȝ{V
Cěyd2R5~3lrλ㓣㳷{h-2P}'⒅څ>{m\o[[-;ŸE#xPKr0
uuvwsJ-п4*Zm,pe"Pj'&D7/e	ʂz!̊5M=]ϴ`nKCv-|)4)0f~S`'!>\H!,Y.f7<&k4F^U~g}f%sgAẄɀr<}!Y`4%Q,rcR^:Fu+LжG3QtU|lob<X¸r\ևjOXq
ye7;0p\͔R"d [r-y%ӿϯjE<L"zh6g1[1}p_F01z~;Afzk0:by%HX#Mh%Km <F-ͬvW`MȇUeJ/ʏINK/A}6Iόz##blFk	NZ+JR3B5I]"ڹ~=l	FΧ#0;3uA2לtR}	\9X9]R+q3&hZ#
;{PsY0\P}1{S: K\ҫ&Qd XNwYsnCI;T^LRuF+"GmF%zq#|j\sfm?dUe[7І$!H<#eu4;:$~$.+Ck;Y*@}mURo=53|?\
c1վ'b;$qCOlL!Z>-7y^"yZ
U/?I!RtFyQ	?T̃gʅ9 nFOq8Zь{_]l|N(=V}Bє~M93twjVgKbB<w#h=ݒnȹ<E<}3&7`d=<0J4\P	)>sYEuk1\kۇ!ws\yqjCY9/oyIMZw?w2S(,XC#
O@iE+ƤhPKq'5vBTNUz1n*1Y\`p|bv t_.gnV+iV^_H՛ӳ޼={K_/(*8:={3*8ii9Q?WAIM]v~1ov㳀h|@:Cc諸5晭aw<7!:KѤ[I≁l@%0i؂e6ۡv|kdC+xSYhIP)7*b;K1S>yO88#c>?Ѝ!Q&wG)D2 \˾w7a&LXϕRPdhK>.ͧ]ysrp]9Rv`wPKa뚥,y`y m4n5@d	TS*oU0_YɎ&V6dܨen->?ʱ}(|-=A{$6Q;+$AnFCUHjdtT7Sg$d	g	RIf苟goOw^mY%SGJܝb8x˄iNvzL=h*ٳ)dfI bk-8ˁpGÏnf0}~]TK|M{`챿7xSL/GV'zİ/\fՏ bl!nKީvS=$۱j&hM.('	lݡ.'{G _ͫw';ۇ̸,:{H=
sOr/a^:d5˝;]؀l'x2}@<L5V_Xn7zs4<0e 4W\U^j{cL	e0NL@ wU9/2'ѻ)%%g~U~1?ׄp1s +V{_z`
@H>!xƩ83Gg3g3qXZ{(/xcVchkf%%&|1/lPbZR x$RQEy2@bgW9_)7jK"?4ŏA"y`:e@ʘ[_ϧP^cZЛ@؏(gd҃+@1V{A)3&
t$%%ͥG/oӠG0VJ4boN=c( ]rU&'Sx
uwM:qw6x?9	frL-VқS΢rL\k|9 y:nR%*Gs]]574vq7(a$FƲ	0yiLɝcha!P`ċ:h|.,;|w{vxqP~!Kj@f!*Shw||t	t+=d4kkOM)zJ^lubIԪ4S.SPRK\4p Y׍_owv}.tT<[+=6?7A>ԊrY%v0#=<1-l'ܦa8f_\LeMf1KP%`w6CX0TԕLr+s>u7{'}K.;>>v.&^"VNݗbk؄qhV΀	wf>Kx2U73i;d*-i	Щ+\bW
3;[2ʝkXi"̗MQEyf<yO*FUՓҶH,<߆)SwvD>̃zbOaQ1g |5Y`n/ 2&ʶij\Bt	<rDꊢU-Qq]	PS!`ᝳMB-:j65.gLB*Dxy'@["T_X?3e5/~~Se{wǬ˽ӿf}偿:!߹7ղ5;ZyT6jԻ e߱}-oқ4,ӾT<ɃyxPY4BI1'秭p* 긫{Ys쟜vZ5Z8!?4{&
O\y䝣R'(;iuCKqz5WZ=VXHP(UE}L*XGPQqlY {U$^{Rvՠ%)L`
OC261BQJ&8]4[44CbqSru/q1T`-#֮fGftƬp6@P::b0kxv\HWCj!QN#[g|{|&8%)5|aE`N=bo9dϳʃY}a2*K$%(VoZ [[u oXybCh.ZeTװK3:%LBexLoB
1]{tvssj|r'S'.'ogh 6E߈誖&NV,@B!ů$	r>߲Bw0wImƛF }p*^s4="̵Q-:us_l#Z$'MoqD1XxJِqrO*yK=HbُrdՇA6$q#ݞ@:v(seqv.#OsHJd)$jrU9T)i3: ld?l{hwnX	gF," sYkrA&H\`ݼsϡzD!Qr@6$r^ιsN6TK2s$Ss'0xEf@:l	+*+5䡢(Y~qC?E1oFo-ɜvvsp¯[ﳖ39+$O>RDz^&4A˛1?oՙ3e(5:ºN
Pz}1.ql<Dn>#f.Ѩ x[RUSS.Up>A4	89fLO  ulHwQWzK[IKZMwypxNtf	J.ԉH)Fe^	TDG	vr,8yJI0gw+Ǉ6-ߑC"se]PLy?K`
u:8IGWMUXg:Qc32hӿ'\u<g=,z=|'*fӡUX(mസO)	{aA$_ZxԅVq Z:ܽ?z4)֬H5tQfcڷXS7)bDK[":$$g|{*˯ypx|}Eڻ΁;-LggB];})BZ?B~EKd۶i=`ԇPLb)枫JxQwop''ŀ6S*?~@mKnwȍBtddV,dEb0Ve+F~|kmyj/	Y0`1myq%z{tb&!|s\ ccx@3: &"=hApi`juEkS:2E
C7/IC7n2Csϯ@A2=  #ͼkhy%@ܨbW߄buez4q0b.;y_[sI!@wx~_O}_O'Q4{Մ- '|c@4wv\@EȸϻB7X'3*F~8U8ƫRQBt4aE:#}9҆bT#]SBaNNN޺uSeuMqMAJ8	C^>WP\Ͷ%)+ )ݩUŐ6h|~2@_;O?Pd@n
 vbQy2Gcqg5A[YN	c|}wۣݬ0fQ5"Up+|N|Nk K,z5+?
%vge>xa_sy>%	IlJI9G^kJ]_N'Uc%
XVokeAv77]]8c,'2[pc^Ŧ(4<]gS<,(x90.ټ0q;=T{{nl8H=0*
p;4HxS0sVu
9l~
,B4[n꜈|-=sTJZȯRt0<1Ti_03ʞKLm2M3I: 9Z~q:x8~QdL6%[a"skf,I0q}2mBlG(*셈ȝx׼}58+Y录X.\xVF9\jXǐC/ E(GiyU~r98/ġD04xP3瘔ҁ
MV$cKrg*ov,0da%B*NIf\v<K0;LT	ދe}yvԅ;Tȣ'Fx˷'X鷎2ڸSwɘtݏcAh/(ٯ)bc$H1'|UC0NٚUY"8$Zk5%^gGOFb]akwM`O f@2̶Ca%#%(F!Fj?CwiY(l'Gq	9ܯ0[˛IWeŽWWWqq'qa'yt+`GS{:P_o{rrxUD]l5o0ДnWǏؾUw.\ l=Ou/ג2]aIސes#u)$߄eQtagm2C3ط#{?ZW|^ ^iguggME2ւF}[G}
u[l:PnbCr<8{A󳡓|]D"Fe
tt'iRE2z0+D-;y<Uyv툚=oo)eyKwF>H)߂y|q˅PJ|T-vԚVӴ࢖qK*sC?t.vM6쟂*PhH /}Ԅ1wn&oCwBͨ5!YW٥f5W6K{N۰>^o;,vf~Kjk41#`1#7cg$WU
ҋ,Wʋ׍ǩ$_@V0t(`|Lfnqgsvp"XScCyjcTtW2	="\B9T<<]$PE^	SE]vȏm ;koP;Ԋ.J_RQqeG
l.fG^<O̝z"d*rqZ~H"Fm߯_1e9jjXytr!~NV_;髥ArQD{W*u;öaU!MѡQX\#{	8zQqC]D@XRA۪{l;ъڅHЊZy|߀s"&CCggw|	֏|JI ;k*n
0-'LCdC̸MF<"f]ձ\+:e#Le33O_e{f&UA?(4)D%x{X!iM䓌U I("Fնbck򩸺M~A,/ɚotC[0Mk=:Y\|GSezVG|S/:~okS0;WͫOk5	6!i69(k,2vȔ~cˉ[j}L|kK+$#(էc<FɠKm9鷞"wc_:XǱ[fwq8~+F~j2{a`*jG;&z#^.:#WN6vgQm^9N{"n޳~/:g,Wʺ]'9!Zn=r(^~`?UY52_o "lS#+~~C]DLדJԡ@"R BK^#ْ~;&$v=ɞv苛I23BmmG<؎>,))&}C,l
7QrSYցn!gr (j8r̦ӕv(=V'nFch}i[s;Fq{TcX#p&D/?~'5pL~( b-%f5!A3n}5kBWf:K4%<Ļ=Us"rZ/f<p;q=8=1E#jD}4QN%!#FA4+-RMt&9&*]_:ߴhϜhy\\555DOCnJ9u3Q|,*tGw.豹\f] p<0K3#Y!ZQ~.sA@8er'.7) /-4!wUӒa.08rU4xY`SIOʴdم04$ԛAd,?mR9O>ŷV^md	g]sx7,59氿{߲v\맗2^e*RyUw|eCxo	͉'Id|C&Xv-SR):rۂqv<ߺYsz:_6H;CDx#R%vwH׼h㱭-ܜ5_ 0kqvoe=!4m.y󡬦ݴzS8pZspm)Ӏg7	Gjh:>dz[˺ɀ맙?*9*X;W?~	G}7вI(xN&38JBA*	FD=c*w#!gpɘkY_Ryksft]w#Bؕ)ΗMk!1)_'{fY)@/lD~D@B-HPc5 |RH7Pњ]O*wt0|͹K1M =6M4Րw$Ƈ1A0QZ]ƻVbZn"kGEpv!On'"=W_>P6~=[bs54ORyz0},2TUyJ	ԛ&NiYy=)Ͽv~>7p_%o0w1a `0>ܰi#qO&ƧM3HY>b;K:*:R6O1x{(ֈjfG*~]AфkQ~[N""AM9֭xf|G?9UTenb
ٓgtKsJYC7M	a&p.ǈi bS(+UNɒOsa&KA!kηs{XO࠯/%m	7`3eŒ<Op8]oJ@0'%[Z^EXIy(1"N{Y꾨TFQD9WDJV7Wd632PC\pGYwt" L1 wK#'qO	w;>V6\`_퓽0ViX<0~[BBc/t eȇ9~U hHӃ"@2ŰKG_-^D`Y#8@Lܜ<-0Io|#G˿jtV_ra&0(0fkcӥpFW=͛P[)I_m"θKI7;1[HQ04BnAO?Ƃ3Za^_;Ԅ:8Q~>j!yZ+mm{P$(&LH$ₙ	17#n	sÛ@M8뚠Pv+Fy*E#~5rv*KY})E/(=p'ȧ9%OZ  #D,!~(Gh/*)isyfREpqrMeҸ4s4 dI,i3z0ujfe+ǾfB7k]eO~
SA6K7L/}0?~009vyx3!7^4R\CCt2~CytZakx,$pVU]ZԋفZF/bM#b$G
 +@ ,1w%QXt2͜L&;1eCI)/͂t*[jbz21uMؠO@{aY9Lapw|`B䘜_Y}GL;mC0CC<wNQ~0kQN`L#~5ڮ÷:gg{vn<@_5aZG~Ip[>s$gR-	8r̠,΀{a.

nc(ӢHzzQUkOr@QR_L\)D3rU0sG0%d"krA[u+E?-	*F!l,1߱Ɉ}潵Z\`ՙ<gՑ=u8kbmDvErvF
V
4k ,p վ${U#B#}htݰ҂GL-vJxb~0hR@Iy8Tړy{h$Ot	nK=h3{˫L-Gngf[c,qbY\tyF0H3à,@Ŏ>
CB%Zn  һ~@Pg1I|kԅ27ͻa5:FƅjXR-DdsO5~pAX&"4ף7¿[QEW,seGuT?zt嵙Ai5hp/LhZaʎxctyc`n<*+LI@y£cU,|*V#q6,sJ@ҋj7 E	Ew`eJ`xvM{?i0D&)yTႡҮpN|90^E%sҽlpfgG;<ɞ5FN}ˣyB@?gY^%B 59Z͎yצ}'ubhe ojD#%i}9MfɇmN7r6L%u` b5wSZi9)lt#P	r1cUkaȄ-i"AhZ&u-;u P<DRXpBro0F\Ѱ 9ꁏȐ\8e4qwО寨flR\l*G	S_/,&<r%7@o@=:n	!5OSPL1~MqK6:YPjomni!uF/@Ul=6(/-T#*3/A xEKtZ9#GPK<>v]FOyAz0nT߈!LȽZdnyu(DӶK]zјS^*w{VdwXMy(,XM`ӈ6zIzܔ+GRwHSsG1t#P$Th`o(:7;RH@7wM_jT#bHfFii5Q(nFo`[phD}xoB5JsBc^3< &'W8ev8%l_M3U	LU34T֝@;#;@pM<!A^nKEfrMyWSHf+U j8EJv%E?cvzU\:@D7ۉޏ+be<\uilvg)%'eE'Ao<hXE!wy7wG].GLj\	az\޵Q%<3wp؃t^=+Bx2*T'	t~ PX>1QHJo!@xPIV4c1	K$ƌDWDhNd%Ȣ	|jt;mkTB;&	w%@8uFo^ .͔[2SPϵ՘לF?w2Ot-Ej>/hZ)@Ӏ5EznE@]~7MH*WM?(=VH޷A5
=nY.=13+I^K:D	juE,x#ZfD{BKs {@|{ն{??R*4}	uՐpCRl"}F|Z}`]!StбW"@pDK"7ɣOMsau.	5z+|NLP["LMXZNYȣU M*]	[-frC~Cmߢ|P[bcW6`ăL+iD'*V%k60w)]7jP´Sr =ڸ)<;r84Cģ*kkքU%DVͨWףk7(;6!G *%˹DqoԾ.i8qdC
r`MP̻_J2TM,tK;(xK`S_Z'à']Po{+7k-bv\rEBY)CT7Hxr{ZȰcs)_ RȧbMAP2 آ:׾(F]bhiH4}4xM	C1Pw4XL8}-`kh]}|&$#XĢH&$kZBRؑx/>7bZHբ7'['A! W@RӍ5H:2Gt/\=h@)rJr";yF||L~v\4Fg06;6Y2`ڷ@ygPc|\x#c0S2rs^yCX'x<Я!wf͕lMCCӂR(<\2],{܁,誡O |'2Tw,τ&KX7#`p쾕mZэ(A?*!>)(C@.3>32^|b	$'#tg0¿映vpC00yu'V37dc}G2z*NhEKlj{Wyz&sS#ڐ,ia_\%dڋwl5(N,B(!X0
jŏB#L1RIKIJsKzߓXur[C	6;UqC$n؝a4js7+0:Q\ݸFk@@]CmPVA&MHikSP%mTS0Ώ\U?(Ӄ6)q؛b}}	%&x߬guΛ-`v&χblow֦$5w*"~]h{f̥i/E16;1"R	|adbΞl]F?<w:
 8߂35F}EN܅8rCڹ,zD8X<1EK=>fEؼ	l㗠݊.nmRY-1'B.>j#美D75h~
Ѹ#Pc&1HOn1fK䈂L'j@Q&A2nYoV7{{OoG Fmj'rLϾ=.pVp Z^[rHYƧ6'djCxާmR?5IMT)Աì,#qTVWlcP_+Cyaܺ.nVCED F(^DM"{wL͚TX7vFvU#}5JH'b4Σ蹭9;cQ
+
h	Y&dm}0繆X_L4|3{*fR=ALsu43dZ|yUG ~Mr8ÄFQSڪfJHd͑6ORa,.&͘hԏ  %0.u0m?#Ѻ%_p!UW$8Ql3 Lq47ɡ44B.ART.{T[QT\m͜C87[4hai"DXDs!OU2kc"MNJ-ώaB25$yJwHxS7 #IćTo(NT! 9e{u]vDN+CJD$c5\hHyJȚi|wmgWPL\qk($|5] hNh,Z̣c8<:u>&CF<Y|5(+#7jSш b
&唇7k{ex4"▵9_1cLe̍Lk1,$;Lz`/݌}/jlSmPO v	=|1hVt?b nPw ^/Dw5RziN9;R|oȠf&bd4|M 〯r~?"Uίva=2ݧ;oH%J۵? )8!98G9$P3gA(AjҦaR(7jjÓpolg:	}_
kW &Щf1|
0[1	3c$k 9>^ЄISNnt;wk7[֬1{lIt)rwQ֛s	'D)bp<lWzC/vr3 ^[zWk2n!x16cF2o)⵨i-kCuM/?=|c3N8N˼e^}!CRdP89dHfɧ▝$$wz2YMZifUWϲ{$Žh7[w%w;MnqLhRoLvi")G(\Fsx<90䟳C\8bW:Qu(0#Ոo`g*w{hXY/L`t.z3!+6g` B`xO1AzCvlpk#\3\q^<@8b&t[2˶̈́\Dzj̥::e	*m}[`'<R؄,XD>7M*r[n$7	ec#lLӴgh-d)[M׼`<]%RϏif	~	4T}pZmCGqL
?7;`-sE1m#Qug;GޞtRZ#6D	`"g	lCkc>#,ꅺٳ-^DU)WR-Qoqaj t3$"nLN9];izwڪ6=h[?pXc4~P84ꊨm~.mL66(.ĺ1&FP38Ӑ7!ZmB\)ptd&I#^=1	2iPFA@~R,!6k~-AĻ+ 8lB#1([&xy^{<GUQE22LFJ \_a?NʹMzSʅ!Mb1e6<P&5[~g'VyjOb;U hʖ[գN.n@V8E)RETy5e45S qMF2r;avr#w\ A4gȁ"؂\s}FP_V$4-ѐ/;\.RIy?FDZQpQPb5Ta'XnJ|`Y($9u~Qi-!j	W{":U@6iF QW`	F>57JsCb9%6(pωd]z
92^<`<<,mI\脹0ؒHsiLi`[T uc)Q1ا;JJB/g̅E	i]Q1[YU[An*:~H%81]b
ѸW"|5{+1éax䯡p	r/)fx;΂\PPLRb}SuZV_vUNR>W
)]=kQǵb'
xaXx6D[X~zOzzMPͯa9<*G)Els]fVVt[!v&ϣhk屙Mѳ %]B"'YK>t)+#ApAH<sH=|(Uz 4z'Un,h[;KP~xNw]Iߞ.{$*y q[SgaKJCwJXeI)p O':	f16k{O]őUpǩ>"{8ow@2!PR/Pɥu"ÐhxncNSELb#u) 
:r֋qyzrҬMw\Ytzkօ'l5ۻc'_;5`{},3Ct{^bc!U7ksϥr
,(qi-k /\>J7	ġ9htif2u~8l|v7ER'\tkD%@%b
yR}I1٢;nEy55ljwWE=ӐMMZ;ds̯N73BdAP׫t-[WNwAytyh&υKhmC<0̒T>}ȲiXdEJjS,JlFc5ld.o9|~]b{Z[C%|;	-OM5n6Be~Zu͗j&6_*͎ÞΜTӥcmN"GPI]"9.ir LhB)B(XqgBCzbɐ'SE;&4nض$7q縒m,1EQNE
n0-Ƶ-'3Jݡ͝_ %+c,DZB[s#nx5s0|;`a+1th2<W:V[t8;hњFEY-iKC}O+C쫃F28͡FMdFNx/[E`oWʚ_#kn̫zxEZay8%!EU	.ʋ饯'}.6E 9L + 79hk=STe_Ր!׭d0TtK6
MSy`J@XErL
mY39ĄnX3}x^EYFEsxNJW7f`7j;0-b.1DEyjvqQJM#{1`0AA.lOx؟%O2
j'?5R΢!DlxRg<hMmo \^^	iq5MrTq=I|.ËSzXٖ`.9>ջ%WSZjh˫@Ki$5q
ez%}PVOzs)W(G^TA焸*U|)Y)n҂,lW1mBT%(S@o5<j_J3s>9 ֣X{%nɔ2187lbA|I[xNL%6[)yf.Cɑa9IC?s8S5'YHQUS43JREULr5E4]Ƥȑ)/\>#Jf:Y1Z2kɃU pí'	A!ˍ!WiU
`Z_Q,v
RTGHb1O)ħv	68
5:HncSnfOySl@]`hL[Ա^wFyӽ4-3ZZ=C3gSFhzj}5*8I]6n򸼦*H?@(DV Zw[ 
)9-Vt+yz^qN9a'MK&ݏw *%
ͬ-L;Q}J	uD>p;+kG+G.:ly;{,\~L5zZ'W欴pVaF[WќB	TÖӚcݕJ'J,7-j-PeTIUoUXacDXQyM5bS.%q[0Q=JT¨#l'ocWTXfڛ*EN|Te ]޹eb$wAo}qvi]11y0Narv/G!5}px(.
tX5V 䙻(K+\C`jwA3O4L7L;IG?&fѮ!vZ=LrC3FE[sX[
+Tӿ=U6@hdJ~:,lHv"<LD0ZZ{nV) +QeO"asBMx<uR97_z$=GA`JQ_FD+*7U}9<R2/a'_{i<a5][PYcSinɐ79:cY(\E#T $?A=^T<3B]K~D1LGHp/>FWWis|DѬ}1G>߮6.s]Y15[x!j~/z{D/,@~&.lL%1WzQ{aD/v.E49;1-*EdMY|Sk\~Yr_[!JDlFIuiݓ`Q*%Td-ThA*. "k)1"SL9R4=fMO‼bS0{NL~%KR:vBrT$ҒVpÔl\IO*Wj:g$҇SՌ'-|oc<CZB-HB"0_`@G(j>zm뾈aFOd6{wFs0eԅ?}F~_,&NFI֩z؜_hۅ9tݮׯ ,0Z0knӀÀ_nB`%F_o}H,-FFJ&$"}98T$'vAn#G7<N*
F njl7*DOP$IxG)飙íj hEiNMT	^c`.wĚ5Ŕad&dӶA>U'<L  .|*aTFu>C/L㭻;YiNdW6wla^'Uh*8$&	3's;>EM 1'r@ԣ}'X}é#_*pc=rzh.0;6\q0AkA\TI69o7|`J>pVkhTnaU.d?$7ޠBik7rKuIC usM貵J=h}qR;HD<۳ATBSzu\FE+c594ٚ@xYd4 ןryh-%<(pppOaF}y7j&`Ё`Ì4Ȧjf4lw|{ډ4ŻѨ$4'+w	lm<$ٙzE_`.g;S>{!c_"4x\L[펅5prl0q1_f	*Cʯ>%>/E01/kxI,#޳!iʢZ GrݽMS+7ۧ;G9uo N%k@p~)įsƃ7yϊPQr
9r^:dZK"+;"Z>_Hu$puEpm8e
*-h&-͚PB?5>qddqP#LhNk|ʂvkB?|bX܍IJگ~N
Yqwr)9 jtuS2<]:m9ԡ N[XI]V#I[ڵ빸
?hpn?W_^?!H^u8`w2ID|Ĩ$Ovs097*xyPvvGN `@%eAWuSHD)Vmvg\zVaGWACB(@ͽsOJnee-YDhM|ghW S>v*Z-F>p@܀<jJ>c-E̬g]xw;9azM7gx6b/֊=QGY:֡2V|'d")qiGT14G tG`5ٰ5yƺtUWݍLzn ¼9o>G}֢ aO6E|SVLliѡti5NG
_2hrLJ=ap"ǱIX)_5dCn27]Nrd-<S"v;b%d#z'E	<*:3mqX8oWx6GkmkXxj0*حGԎ`Z 0A̛٪%յmt
ZBr"M	DLf؛lE	EC$-%FG(7hjL;qD4HY(euL_ K#ߜz- !܏LTzOޭ[<&LR_af%S~#âcո	3[!& S!<j2 Bb<Hd
j)N!iD~s7'|oTj!m1n[&GjU//7=KO3RqSbGf6=-D\RFv6iHH#րA1{ȅǵ|_/\Ey.gsp|?7TƐZ]qi$uYDbbҵE ;ŪbQ r^̹mZ]TҮ)\̛j˓kJjIkMTr)^&㣉7-E6̌>5ƪ+淎x7K\fW&MWٗT~,Z/}x(D,X5KpO;4!Kt>+!(](K)1jO%5l`4dйlwCnVi'<{Q`ِ)G8loߙ_E#Ofe,ȥKQ]n^eRgK֋aõֈ6$WQf	K2cq3{
nQҨ$syO-32+K)3o 6IA!.FJ-[<IL%`s|(W-0@₇1g
C>}x(BօLF$p
mg!C>|i	dk̵lqŶBgu(Jrt$K2{c
?X*'[\4d}bAZ8՝SJF:.Ma꧀r#mk/	=B,0L=Kz-]s.Ef4+9!G/,T-vxX>u2ΘEP鯀1ue:
D:&C*tO^2ȑpANopk6ڭIB;I=y7IӤ;KOSbXDʢ7N+L%nΏN;b	wgMQ>Ahߍ_X|$Vπf'hzoGB.l9J/R|+SDWEW{5r2+H񌓫%%Q&iF	}HsKݝFU]S'E]xFtRڻzP4xIx|gdyWTce5>2.q{n
6-˿ćdP%v/):`
a%Tfa7>߈֌/ HΚM((F,;xL9/l!Wr0^mPe ,i9p1v"yJ26InVGEQowy6$K)"y=(<u{i:5\rճ\C4Ho^b ݃s6LҤY|#K?K%k	ٖŞH.AR\]Z|tȂ"%"`1~;>Vn$8xL6gSY&ane AP)pS(ۥWi>`joޥBnV@Mmrt]rĴiT8XR)#srJl61G|v+8XBWQtH\,D̝kݮ	C9:_pc+gl:#_OKl<q%@|<N1|WN'7cS~oe')i{X}>{sE`vth1hlE)#NSފݬ-'Z*Ɨ$`6ѭ:uu6#i$$ʪE(ܾ#SM$:+49]\W_Td xī;s0_|@f?p0; gUGwWzB|p`H_ä1Ȇf0R]X)%rH6n70.*K:;cb*OV^tk?hxK,0?<'Wv7iAMCİ$_5?Կ,1΅sCBvx{#ogrQι(6idنQrۈU<H1 I:c{2RjX{?Z	x<&E{DDMBX©-C)3d#ĳQਅӉ

j+'0L0,%VMr7SˆZ8s3LL'j}uJByv7-\TT2]PNSWGZc˱ĺj
ẘte(XЀ >ޣzi۩|O=UOi}q_zf*rNW7L:x%
	}"ξ6	-V|&-Ǹt!
`yOlx!N!'I;j5cApmCp]4h5EIv=	KPEtG9ಋ$䖢p3STo h:+턧*-́ɏ\v\cj;!13q(=7_^-$c\EHbB/ߓJ mtTЛO9W<y]k՗Vmh	ns6DS?g1Nw>W؎=s?;> SA:_&ozJJx:f(yݯ=mO,GDr˳wfl!lS|d$n[Hp08rk8HĀ6#BgUGFJ*nU;
(<{qKCΛ^TfH;+gq{,#̮N-WL-v:uNP&k!k9` tXrPX7KÃ+K\#RGoGcv2 כ~\v/Eð0| wG;uU<x~UǫM~5H[#Ba:a4O@4*$:%u5ɬ?%w	#acsX;l"$' GwJ~Hk><hTL(
Vch`~=ZݡlLg}xfu5*:3֚/ ݰH7^mC'9/2lLލZ@EC~!#^}~l׼.gi4^FG̞Mqh~AM	tO~?|rv6C4áy8&Ӧ4MQyrMTJ-#ߛLޕltMFi^+xgNtdlp0S&H18oz>]~=|wV.:4:LF:} ݧnnwWU M{%/4nBClo(GI?c4x104<iKHf@)Yr4"K=s9e09 2<iT<KRa
^*Ӡ `oa?5Y4\&t4G'P	RIޡ<kxD_{ٮ&oV>G)F"c$սP#wR>Ɛָ{ua>ʋR7G.w.l4\cocXVSM>o.4?Ƣ4/$@mV<A
pFĭKdpI2wt2CK]@? x'Zjd4C_돆k/\@Ŭg2uE!8  'f]dִ4ᆷ+r|dDǁxI*NL6v1
Zv>tvvN_g!bV2e{ո`2`b&>1^`~8F3ҀJv08|## WtA>8$Q݁TaBafl @e붂rC(Rl!?Ǯ̲afLzÓxD,X2-G[@GwRIu+MZ|]xmhbDr<籐Ce6YFֹ$i^6Up%d`gãcFUc>b6nxzjG[7c|[c+o!)dcHrkt!;HAi.Ih
!C>A8D6N7Ň'{;;ni3gL?%cPWa^JV}?~9x{|8?VFmcGm.BZdQ9?%M#,9Ogl6y<HJ~0KTjKQXУv6z=9jǍU@_mA;
U?NcRF,~k<0(ci<8K۠5h'ku*~$A8˱xWQ<¦l냊$RmAEj9y2mZ1fS}-| ͐D*y_DrwFHe{lniaOSP!}6fs\_~q\bERV4k%9i5K?bkdd5;>>:Q@Fzm^ZzvFw@Qb_\9KےgUX8P1ЫASppPE.4'd))ݢsjռOVLнy`bNχzcszͶz<gG';I{e?޾2MޙXvxf-m߬X˓L3PvenݵL|{\4&?*@\c3pϐ%9'd!<ڒU<bNG^{E_|a6,J.XfDEBAl`da=5}Jh2%#iZ!Sy
vU>0|%YuSKrBe^v-}4̥(g%7f%#\NEy`K2ZyV\x4~R'Мg@-:8ZRkkj}m}Z{Z_*SSev@z#o+BZ|pkS[Zth~8#~X0#4t)0ؘ݆[{s83m|bOz`/]ٜqi/t?w`<{{bSF׻ݶthlX^;R\PFK4@*wt'_wV⛴CJ5ի	,|8	[1C	Bп	E69ɢl"Ry#⢴싺UM~'gNwɋj<&{kԣs@"B.AcHݗ'Y/!W(@0FQߺ@_2v
)nzXOb$ 4a:+q2dŕsERH&sE?!~|lEF: ;AzV{4
y,;(Z!j(y|N4q%FǓlO) =_$,^by?xʭRܗ}tE>u$>@&LdπIo=#' E|H8Yf`}O2z/dBG㗪K ;"+tcc#[rVWwbڸm#۪pb~eY7Kp"u^z4E(À)P<#_c'7|Vo(p4	ΟzH<Fj1mTG!_? &7)Q[A!aɆK1[x}K~Gݰ7dn`$RAƖRrNa@sS@-0 Fxj&	te0;! +6>Ϧ7DER	}LUTS 9]@#D8jP0Z'$l9zraQAw"5^Nvҗخ%̎ _4?a?HQkpqQ=^_݌/niԻԽWʳJ+L+h7tvVS0Q?!1~FDUndWTzς}E<{GeiFum4g-fsphjMP,@ڡ7U0p2l
DHLDZP.n%vXON|0#!`ARqv1MVX-t)~H8ٌM/Gc$J97>-$M@`HYu~X\KJ10# xj =t^ΥCs8<blQ" LpRV?dOX (XlIY)i#QJV*6j~G`NJN:56OR#V~'rPC Jj዗v4@Fd"yLeaF
)!^鴂FHk4f߂ǊMsV4B%n}nx?>?:GwO&zGOvwK CW֬(KpɄa6w	&9C|bP}7Z8KKeTph/1;C]I+9UBg/Қ*jz: ^VH!Y&73ڂJ٥>3*<܍Ԃ:>%3 SKVU1)yA՞ij
a\}L2tHV$?	\X]'є)!T$AN!K1$ĬoǪLc$6S WlU{<[3DIi=JTvo=BūvЂu.WFN9$>2Hvj,/*>#/fR!@=vgg	 j[Hg;w+LP3ĜJ+2q_gy_dPaIѦ`vB{j)1@2cF;<7kЦkt"=(k.w)1(ǰnnvvtt٬MC.nG}g$~~2ͨ &ۊ|tRsW~hjS-T~H2;3P^H=8odFQ'NJ0 58!G]!dNp1Q/_Ѕ㔨=H2ɠlۙmc8[~:G%iNQK f#;R$:ؙ<V+pmZ=Z+tnZw!<C8VO8Cǿ,'^KH[^-VFk9A)!jڲ⍷U0U;.%d=d%ZKq`6<![ZZ'wE~tu.stpxyX-4F;o++ D=:R?h\1ؖHךSzxF746
VyU)Ҽ(1C*ω*X!ThkOs E?E tyPdp9v߀"@	aIn&@'<dW@1R)"Cӆl|9}Y1;a:driw+D>Dд!ۛѐlV횳C0SWw
hyz%`d`8X mT-0"K[m5Uvd:tΤc'sN&x0p(=.i8lV*+"=hNNr^O 9|8<:[f~~#^`ENB5txm(EտFIM۟A3p]=|tl^H')` j9yLO'ltE1RCƿLRL+snͣc2	SH{'g`JIT]`r°3wrdөͬiniU
<YR܄w\:]JN4 	#}LGM=SHB	3	p@rzΠ mK~\om<Y(P;La:e~NbCf@\[H]rp)ŐaHXeI
r
pH[ŋl=ѱ\wk(jfk~'R gf`i8y?ۧG;JAܭ\@p^#m`ޣxjxz{Ǯ.b;w>;|Q*~v:U ?8saG ZݽB]S)/[e ,CǃyM-(ູkBq|88EfuH_F=ҩR:b%&o3]?ń}cZ6\-0 1KJtBh6j͊4_INw2@3Kʹ ,%Viݒ6D:q7PkzlJC% x4a?.WNH87l=aNIV~Z(5ݹA/6% 1)V|`(?	WG;S;llp\>ysMU'.[ =EšMQ6I%#˅MP=mE$r-#Dr_S<U:	an~?P{I/3-<ό\cͬTb+9tQĸ@;h6G}pf&U׀jZe 2MI: ؠ}4;д[N N86H蠘H͘E@4n[K	Z_'׋5eаY	i\8oɬAlegZVR)$opf~|*:{M>2piZNcgSG=RMc0|8|{4G-iƽ|_biUK9] ΍߉u͟nm-lJj՛Lbrof7<Qki֖^9)GCb)_H+>5ۥ,NU6|÷}3»=ϔ7Qi	1Ȇ 4'(AJ1:H|
ʘGd~M
!(T.+p;W'ܢkTr'z^{SsuN]|,fVM;u1(sYtM&2cs'p&d9HY)" 	<fZ1KUx$#mTq5
itO9MD`e~#ȍʄ]U <?Ep26 KYO7Uhn"tx@=skb7Āip/YرIic$smh$V\&""~᩾9ȿWx6fɇj,i+/EḰJsFBV%ѡ/1cYL`:5;\dɼ+̋d|P$(RSa:ͯg*r\ (ǭWAjq1ddJuGsC/knuMiJ*3Q/UYuUY{i{_Pa0 `K䬽FAѪM;AB*z!9#c_0ǶwSMG=)MiG SMU>mیNx<"1,:s<g8}m\W/iK1|QKB?;("58
b7s
{mF'cNojZ)*Č攚ᠮ1<ko+񆐎d$ wc4n:Bkh-<~A&J T6Z*k~ZI<Oʇŧ;'N|[JObPx}t<RL	ҭ<9T"zp"tFοb"xN`l]+ȃl J)BJ$9lc+(؏&e+M^!Qe,.w/(mO7>Ձ"W+i}#´YixVJSꚺ`pb  *ޜqd[lHj^I)lޯH#*+Bi.WBAtO!=Rz%-#ٷdbugU{xCdrm7',\hNOQ8}><y7$R"ă!y0.BB_
jΆa[CqIQV@fypwZΐ
?~nD,Y@r0
d#'#>DH1rnBMx@,@^4'Ep+of(Ҳ|ӑ!`9,ҹpaXP)4EV9MeRLmkxz-3]^s|c*Ky7VV>[[e~TKŐ9DJ=h$Ƴa:epa@0.B.3sy>e<HDZ=ܬ\uf"7d	g\M
{'msYΨ`` 
+e
DՀbyW(<I7c ochO9I̕n5Ni1!5k
?WX3]`NbtfՊ
ՖOtvm1|\x_̤l$E?;}`wcG'CiÑ{eY	zl^.J=Y%q^pzW~XkďugҜ1<`0cPsTUB!-޹݋(Ru@xh4Bml'&nmj*<]՘H]BW/{L§6p@#]^` 6eS@Veu`bّq3)3^]Bz B@}B17NZ$YF55*LV/@naiE$">yhNx)3Z|[U	q:OMXqg`#
3
	9%
פQ<H,=E rH~bu{5&	:8ؿfwfQˣvGJ57]IYT;\aO¤TP{d${|P⨼+	uOQ#c_?F̬&f!7.M9|j
=kP-i8B{;Ǧs9Fkt	}ȸUKXbT]ݪ
B3ESn";Vp105-BhBbGEd6Ҿz|@$KX,F3:})8bVT3>Uh|EOOdi*W󗈈$d5Vњ嫦=cv,n|ong9U]`gi>GC,	7q=jഊ-OK^~)x6'Ը{E.o5ݰW1߿t nMڗ>@
Tح({`sQOKb)hG:x[?y[K`B¡aDh&zHm[}Q33b_dtn6ŝѯfL;Q4ed QrշwtT`^K؀6 s;z#v!IzB٦䡠jx5_}Jۊ* 0׈ẆqgCs;}YjHOxN5hSGw{W0Ibmg7*+ԩ>/6$7=h-j̂c1xȯ9ҥ~ï>ZSV4Ha'4:h)$eiy#ĪCI&+1<8WIfօ}W+>*+H?=|&Xb3OWL=Lѱ<D@%<L(>"(-榱pjV)Fs8~Oͅp+톀շUdF?dCި-_Ƽ̝9g٫+f7pW,Y&.ۑ2[ W5j<-أ]SO}Pݛ"B|#d4L.BE],!p"$A씔"8Ǵ:;b\	&~#0|"DmL290BX'pN,ö<{a^\bTE>CTxd89I9h'B1"ۑo%.$)a09sos0S,"4 pst@ pHGt-!2ZZ##Fw0$|*9f\_?وnt<,<])KauVOg,w@UM =7UomR@V,QiK*g)	w@9e"gs[m1ϼ4xoXHs)AxsKZv+!eziaTT\V`"uэԝ`c.'٘b oexgD۔@Rk!		s׳Z:G`O2ތf1%d[u]iÊa<3iR1p8yhU1$Rbt\t`?ߎN*5S(T	sSЃNhGz$+R|<Q,&r꽣6ܹnwaʦJ0I:h{?yQ
C_cN<oGGv`>D|s0yMPޑ 0FJ9¤<hHV:B:'$ ]?-3R,ß0:&%e+.D4c] OLF#/ܽ+] ]9VVf+`B/x1!)".F=e'a@S`$ĳ!/{Akv__bŠmډʙieg9
N4GG!,AA>}[pp]suYQgCH2^am>Na]툉pYGܖzWHoȹj&?։fc%=POϛڟl#ʒΏo]1~B%3&S%},>xt]Z#)y!	*b#:$ȠV1i[KHkպt5G<T+jk3P\ꂬ+6%O!jmxӐiACUeLR5mMO6JM/HHEs9#zChA7Ήhc=zfؓ^'Dط*}_]i8Huh)"+W-U)Ek)=a]np)R$v߂JfM@Zk.zBP~H}e9	2yP
\Sse-:i J8FKg͍_GW~
;}Ega	z;hAЉ 1xe=-m6Fվ#	O@|idǘNf~e	U_S@*)R9SnsK/:%iW;*vTsSG!jmMh_ĦeP4XPg4	p,AAf;X&^nN%ރI thm [
žIt+TAQN!SZsÝ8̩`["3ckYͯ獐$~P>_8jĳ3He8ANnJZ`|TgOP=qR9VEۋxWIm ,"_5Vt.@/#c"BBx)FIQUA>
TV%k)4`w</jHf%=f.Q%,~L㼣_NzL8ln&6l켅Cy$6z&(ޥXe RC*<RN^B~ShgsCDﵸٲ6lupKI&w)-y:jqLMrJs
β*DQ5
D$S%ٮk4oa6&R#"4@jGX~h\]_QonɍjB_6B!Ձ,`y:TF&0Սv;Ρ+Bw[@i< bX	N_T+j]TjRsSpEnod1^~0s^V8˿P.GWڄqxm4a|lĥ i#f=<[J}|#-(0okTƾZJ̞3h4N&3ExFnzxk PTʭ,]ҳ]6VX[lٟ=67}G3y$˩߽;U*c7.ԜZf_kҸ㥥 MGGSOGnV/p5.jȨ/=MnhPe|.Hpȗ+Uqq@
-XOL!!2}O,3nI^H a& Q؃,Fp+9fϾE~>r]ń乕_"9x,惏2'T*U!l>hb<f:X.i19yFUpG
FP`<|2<|i {Ù kŕ+e䟪,W>ܩM[5GUQLb|0˟e'r)Foϋ\
@X$Dl1޵FC%O2ҹs  X&}~U9nR
#3&'N	_s&b--Teqp~<+/,)U>R)WӤޱ	9yǅ*~Z&^N8j){D3i.+{QJExJU@nfjBjytk2'ķ9P_En?vc^uB]2F|VjoZc`V'V	7:~ifV	TPCEafx~t7%#E "dF1M<C6\/R OEPQI'Ьb+8憙[$*02q7PFsq"LVlAV3$Lfud.ٜ
g E-go:}XiZ8%#k*%;%:A*T3'd[}V/]^b*OJq?@zx31W}%4NoKɆIhC	dH.g~^$!8+y$A, O)D.V.C) SJt>WCFofTԝIj>m=| WנVQ+zt4nl`*T豥vc٪Z!~Wu^Ee퓂	mR;r|eIFsVEl6$"uC6ވQ)wYkꌈjy0nK"_A%IQLxt@鴓@:|c	gr;Pkyso%V䝃VkDsSubTEC1DQv,ѕ(j&I?jzslc^ʬ{[SѹgĊzG)`\B,$nZw8<pM{)i"NwgVe5zA&?,EzL/~oRoyo9ɎUIme%ZAkUx,8C"d%m
4qC,*ݧŢP!U :_`]ADDߠdr'we7ϪqE(T3쏃&P?p.d85NFB$9gtVP^$X~Z5[7\hNņUB*`|آxڈr,Q=鐾ulp#~7Fc86&'xhaFdQ^&̙d @RSг2Ն6!Y1" p+3JTH@2iګC 	hBic'ԇ:u6xjŹ]Q6΂?i}Z`_$9ϗEkz=Ϸ4/ȑW^`и*}rÞNCDÝ)q]Y SEd(QV~Kbl̙nPa_~'	E@:]읜(?pe96<y.Ͼ&{ m eI.qmM??:?x9*]wF/u?>2ù*8:zW( 2Q򸟺,+o{Yp<A|p@U)h
ͯsmn`{)dDNG,	K.I(Zgbl(M/&77)nS\/m!.-a+%3;ũ?A&.*XvaH^VRߚ>?v?ҨUOޯ׈!߭>Y}aV]D@,؋3lFIusJ*%8:)^Lܙx4}^`*45+LsjEolkz5Yy f
pNE+#Y12$0txhUW
2^Ul1˪Sa&#C_MuAZ_y~ױufG.[I@#Z*m%]^! z#@Ք4WZ"DQyܟKFV
,˦>3vMHZy=5vG#Z3iE_Z\LH_#uR8ڼd1*A~AJ&\KDަ)pb0 5xJ*cN&c͌|&%X344th/0u
xKiwWFl2[$xhRB-19&40i-E0f0*]DSS:+FF0%x̝2֥苷,gHz]GVkyV9\/F~9:_JllDAŝq9}I[NѿHZ3[;/'1!+iz=S6`?z!ܰI/\.fsjNZ6Wwҡ!WuF9EZ%LitURwE3bz]<б\;'{E1wތ#VHFkSy2ko)pwצ#F+3࿟3u}wTSVs%h$&mEkF-. dQvYJ}lY>8obo:S'gQa"P?4`y֛|Dvvڇ3̔arrt/qaV0ivyDtUOG?v`~ m
=J{N H{yOyOonltl<8^blze /4wa٤qdH3E8D1G̽=%yg7w8^F&1N5|1SeV/	BW#6
埦aG@AgeibX g_$\ ΏL!.1pyN $P1H"C
AӒb634)pu =ÜsvG_j'DDL«>)Ey:͊1i3(`^iK7i#o1MӮq5 ӝU`
</0@%B0?}]"#%1aQ:r
.C8ToyR ϧcزO{WX6Y8&(@(JqKFc)_wAG2:\`	"WN6 /["ƋUj^%~vsj-ΠKv;$Qxߐi1Eo<Kxs+}vrzpH2D.ԷRh:KN)vC2gJV.kv*H`!ၑfti
R0M.RQ]4Xgs|.c#DǇLLi)J^8Zo_*˃T.oVp_rOwsoҳ"j
3BC>	f3[`v1L<V$d蟥	w7.!I
p=al%G^ӷu>3w[nzsdb_3%K2KQ0+&xk [^	޷x<	e:jWmNl6̟qvy/E'$eHE0KUy}s<V-^of&&\x7BA:K5&qrH@yQ֤17o8POZѼ@ٜWV|A<_"ŰċLP`;ٰѨz<),e,c6EWdjػ8Ye]:=a6Mk.zŦK熉O=SR6[E[,4BʋeܪkqjqϩՒY+}8.ь-HǓFfl2p>~l~+wzfE8Gל\jt9I3)Gd|`NH1s5O|P},*xYd[*>yJ/aWHB*⩶rS@:+MZ'FӻrF!+dRV@C!ez3rc@acUWxr0o.0l]OeM[dJ^U6_+~_C9W#Iey}NHWp 'k2e<w8t{Dd#59ŐfE̒+VMcb@@{kj&iG%	H^<SQe.d=]%3#\$$3r9Rf~> *zGr0٠
'KB(@W7"b!N!!ocbW}t?3UՍ_Jv%|&KZR>i?4d/b:j*qvAXDb"T-=N6V%"&$ylM-'HG~	V
&3V'ecVFslh_ 5.6Xc$aq/QѾ&#J4vvaKct>px	|y5CO)<^K=/><>lUcM&mÿ(GbCFfD{lZs/p@fgI~3M_ӂ'(Ou[t	%`ll4gbϞ;8`	2] *m+`^Y5E`#>D-BՒLWcw3@ҿ#]s$iԧtY>'hMa~e^X)Gbvn?+kȋʫ;|mGny%E傫>y!dMu ]$T9;tjV:5!ؿWx yyRR!;$HX#6y5+@b>JL̞5k?IDUaN}(`V}M#	fޯ'Dmw	C yeu͡RsE)/?,:t*CVQ;F4&R*-.BDVGR)'P5<sHC_
I9ym(2v7rZS2WPȣt<\V9+I7q(U$Ry4nc7p)p7?Fvvj;fI5?~۴@@/WRMmEBůl\6=pC-%Α i*%6w'm<HI
	H]
%=yB()~)[քyCk$
Uj*)_hXlhr"F:Moe+4"a FkJC< n1c6wss*fXjiVS.\Ug&][U-KvǑ{sU@C5O]gӁ553]0L/!ԜR(PgfP1N]$C_'A3Ч29zV`<Lɷ!aT&	~p4G,ڰHt^So
ue)A<oфE1B*'69yكHV:Ҭ_V~g~OZa2
N!,AjT#ISVkX#4\"{VB7`ˠF],J
7k\Wț_yF,B5RSTH0,\qZG˟S"+N	yo'i_ŋqM3/Zm/Bmy
ViM_mb-乳RvOOzXC7oWe]-mjxϫvN%BJazB_TKu{I:z(
Beطs5~d<kKO"yS8eˊ.87t9A>l%޴S7KRU(g+ =+^v**,LR{\4+wzwuv3{w&A6ɭ _	φ /a] zJ\7>mYBa
te%]/)+/ƳBGb`*#*Ƈ98ȣ>hmT2NPT}XշਨDN[u1?(}t: p#PQsj10|f@m	QtSm!ʘn5D*	?0r iC-W9lᇓgwwCLsE7	mUĉzhё,U]a|ޖP#
A>$+%*.Qs!"!~P뜎dc:f?$=#Au CK+v)[8g'tIwK=D_nrʹ"~=gŲ}MX^R,JXN@Qu,sݎ +)4~`,~x ;#HQ黣ҟT6K7)ZH@w~2Zԃו.]>|Mt i}iGa*DW<!]B&J2MbK);!4[Ҝ9#TV|P3IGhʘvn/ظv$
*i0Ɇ	.QpìsG0rm7]?
Mߕ/VZ]	8:`'_6qi
_ew_v04[I79Ι̜ێT{3/)" REBܤ3ZC#lk[{1+Yi}lhȒ[=jͷ\bx)&-E	.H~Y[RoI?xNsi nyK[VՈV3ۗ5ArokkYOlq'OnwS_m==| li"Cm
NH;$AFi)(풛WE%N]XɍيjM?-~>~J?6q%'Å_`A!nm$ۮ85%$Y^|QX~p*]:]h=Inu(u۹` )ˈ E푸סn{g*Ҁ$XЭ)#뽹?Z@6/+{/̊aia_d[J=s}v9=ۈGvApꩴYkrG=kB?1s9 )A:޵ͽ3ӭ/Y_85mFdFPlovݩ=\7:_!UZ{}#ʇF3T |",I)\gN-IҩȐz!TJȁ'u`p4rHM0C/v(PCٶ݋,|d[]|guB1͉[O;f =]eQz6c2p\?ě?nwkR'ݦL}ŧ"ݿAh3[Ss@xm}cy`H4 :zͰcXPc^+11N:Alhf_JٞD]Ӝ'ޛd`$#k#RJqS8tgPi>1+Os۰h3V?d$c͈<.F#/;|:v+EOF";9\Ļu{1B§OE8{@-#a3Y6mSa#HܫMsmfJRZ8gdB٫UY;66|8ikDB#1b~3Qoli@*lYa%)C).~[<.bh%\,g<>{/&:80'rJo[Rf5Ǣ\^& Ucɹz|<sy@/>"l?i'P	p">NBg{ݪu2kxߙ9~af: ׷cE3ߵo$7=srr\6fo%6ÉYp¤	'|@,4P(O\+u5hb?N,Smii8+ӂ]/* ;'ͪd6g6P%ұ;Vǝ~j*3EZ#b$8}HW|j781hz/Yh5f`$N S&w2,gGr `yP5P݀%-t7	ZlD$Y9y^VG[eJӵ5bδ}KNDx6q^7 :Fq*ꇽ1?bǈ;>	M5X.u">q/,߂;=KF7Dߦb/b,]dW>'pA1`ų28aBc=y#RuY!eĿp8t4W{
+@2onLg.{MhHj\<Ȍ80#88(T?`t˖TOB'$¥+xs:OsI7u7;VY%#|t<6;y՜NH;ݰHH%r*-In"̦p]=ovDYTmsGc3͡%O<s$s][p\8:?
SGM?i
U0KSw+4<Bùi	"~Tx,T	ʭ_tvyM)уZIWv2=LJ |m+$^stX\0_^Sz\`	EPvJ\X.飨~Mys6E^fҬ#3/Gp+8!<NaJfS>4nG;ߏ"u/9eFyшpv/fʱ1AOnM)Y;&1ꆮǰkgXY`sO]/Yˌp͟<!^90287-Mo(=÷]lEV'dL	G3ˈF?5\ϛI%/W)JEt^?MZ3MRi|^1&aX↟yig[#Qrͪtՙ27uwz+wϫWy'qNb|[ĵ&?ܲ{+]ѡ,sroR|ޭ,2Rf+G?گ;mZk5'=i+O2b𫧦b##Ҧ]A}zbbtc%uSՀfn.FT
U4QW]ISkoƢvNN퉪R1h!L95ЪyPe|[cfbXyqFҀ*"mi IIy~,b vJ_wى,FrMn7gO7ퟓoۿ$;v7}%o߭x4yv+j?]y_7_6X(lװfh4Wc,M7ܸ}Ne_Oͦl)l+6h"*vfm=l)G1 I^	 !ʼ ާ(p~ڨ
_pq2ؿ9,܉)iLq~q!;R'"R	'*AGi!y/=NK%glưy"t?-01T-v,>1MGW⓺Oݧb"V :Б,H\2|=Dr놃xj"ԢjFR"0;~yKœ-xTP.!<-Q굡6JwM=G=r h%?6lO,R`cs}d_$i23)p!l-e!lE*JS(ؘCJSc>A83!/PTw8m.bzU20;	ǆyp]x쟈Jy	,JqY߉6gsL"4-jp4	0	FcIqD*x$s>u*U|xHfN'3`@U<>[@WiI#OaA9O+oasHi}_Bd/߫ݣ7qup?f.jl
ذ0sZ,:=3Ι:f^tdňgǖxjG(i()Ԧ}bXjVtCYR>Gyw{*mMxKvG,U{ꬠnyPG/>i]q9ztzv
#| \v5/5<KR+ϧ*Apt"'@)8ځ 4Dqn:A9fo_@R[cGp +YP"P?^e+RgcG-u4#ٖ!3Ww#W64ǎ هoB CV#`Ѱj0Og8SLSA(lhAn&$2f<Q)z(pb83A|>n|"h1TrO[%nQ~.]A_,4ws'h8oc~B8h/$,gVrOr6I.\  u%y17_P|isgLusX*=W1h0&Eּ	 Rvb4b"%_D- b
hőґ3Cs%}7|&ٵ{EcuVR@*h{żH^* p=vG>RHg);1Lxd6c$]zI|KҔl%4UƭsݚQCK6rkm7zk7fs)GBODW;Wxl@Emcߴ Qې]{g b}\MKʂz[t.H}űФ_k/\0v@6.I۩vytwM''OW_ׇz~3Q7HH-}-s;E-oR'tY	ݬ|΍«Wf'hl4{%ww"ݮb,߸lwS!6O({wi
~ *Dؙ\F2|Gٲ4s}uZ3THuڼS;`NM	alV."<ԟ{Ez޽(& $	Y~Mb;&$nZlGTT=->wDm	rL,	mj6BeZi0Xg_Jͼ>M371 }4:LƘzOAxYzjA>OȵW+`>5/.LSq-=7ύ8Lf@z	~琢wSy1E yGH' 	wVKM֊#~O5>}Ip=l/|h_Ƹno2XoAs.L6?Y{"^XJK]hPK3{]_j֐W*Dv! dky>읜gV{ޙ=8{\VS;gsLsUUlJztX`+IAƪR
"CO>$NCK2A<ioS"5TfdDn@>ZKn|Sٲ\^+R wM>;z	sΏǦ(.U>N:\gŨB6*{ل=uziJp[]j@6(:d~iWD!! S`C~O9Vp)Ϭ5jm3!%W5nKRB5֨ ='Q,ݬ]	!h$O.2M{_V^zeZafC_9OO'V䋈9%@81](I7?U8X݃dvNe'$ߏJolȳ͘o~Y
UyQ..~jԺG1%i.	FfYDZ06-rm+_-l{V#E{Zܡ_c]aTZQnƗv4#%r~џgv؀r40Tz͸F3eXzONIޣ	ؔ`J/
V޺_e#_H*rA yLVRkaN7Z *c`Rs:F.uZO ;=vҦ|\/e=Hx,聹
M֮azkے-_@V-t]JA եw9!d=sf2 ,߄[oځ-(
J9c*B@aKGPP3}64j J*0='cM٥YI[fi9rU{Α*B]-נ>17߇hfYu|OZ8T%g7MЬ<VȷgλU=7$h	R+jONwNwXX\qzWyJ1w= бE=lryki?uM9>׋,v3ppv]iaܓ:8zEJ /H8@Y&m>R{pRemQͭniƗ2=T'cFeVh38^h84Ui9\Ja|/3<G%1pq𡏘#*( q
LJSw|_ ]&J-ScLBpw{8D[xRx.M)A]=4J&3TДA/,OEzbRd}f^~XR.f}̖wvr;[Ǽ)rEhѵ]-gbJ8ib6x6F&;Qe{_FL.F4s[@KȦ5<GO'F<.Ϸ7h&yy]#w&L@uX^s&uE=nRUG%/ކXWQ>:c )sX$A9DioHDMns|TXqݼ.9XPYqKvg'*XGJ^$/+H#s9z	Sɾ1ឝ/5Sz}S騸 =@Mk05^Q+M?. KT7-Ɵ-Ǜ0x)Bdi_ 9<-}'ˋ:G?ɋj
?:MQS՗vW#6|OoW6(KR8*ݹ~r|LfEIل"+JfqЉDE9y;b`}9[64mҳVMt&-\oMo[Q۟
w63ݘܑ9*Fj!EOshJ{W)! `*}/ʐ^ojZ)w'z~і$W9wmm.Vt5E0tSHb톈P	x5PZ3чEzGUѣ$Gcw7V<
歝F)ZTg;A`|	:!LCOGY_p#8. 'Ǵ~1L/W(K2=lika_ |i{q#">b*60"^ȃ1&&dY6kXVv*"C.'cvɖ)Qܧ 膬Hd˫gS\PPe$b)`u#+sK7l%<~L۴	2kpMn5ƭMriV;T:)]	CGS2J()k۶	zV?5CPMuQ^/kӏO]~Gu(G啹ek6ļXZkU0t3ňwZxpT!%͆
6/W yrs_&[xVC*`.~Y|=^zK:òig$<Um!S%8ɓfcT^[͏/0BFj·%E}s4o;W\#R3/F2oq R攤ח_='||g)qVR<| >_L!:t=Ҹ}@K%^99<[6Iyvo	b>X!s (ϺvB=3Rt.3HӫLJ˘ZROP!^|vLEh@R'ob_0c!6v.06Mh{*}2ZT3I:u,!~a1b1ihs6U_0G!:җZ]6Xe=9N1A_8%f9nx]\Sdf\`Aȓvm=.gg/{BO=Y*<ys#x&;*\KN=CtgM˥m0A	pQ>H?ѯ"X$49@
5
;JP{o0C_>$?\m:)*1'+dm%&uO.}ai9uߙ_'Exahn>QPJkO˘??պ?u*.nZp#i܇'*R,k)k,o:<Mudg<7&E[PV8rZ dU'(JO?$rz>N>~nXK{-Fb:lw)){#]bFJT9&t-+@0G΁t,v4^bv7Y3A{6-mrK9I1xЂ#u6[I$!onpUczɉӐixhbgegxQ9pPdcƔ¦~fZS
\7(~7慲1I3L,܄
3Wu6X_w;lev[jZfu 6%Y%|iqe;ճ{֛WC:WUS__V";Tq6eJAɅc
@Hj̭T sͅHEl7ݪYFYd8T}1^!mKR@m1r7bD:39-?l5]@5%EL6vիlmY2}q}@}GTi=6kRk5,Du[?z2JF=]?[f?*Z˸I.Bj3Dߖ,Dk"A\mcÐ@?R5/.l@{ZEizq3LRRTj:eT2	@dDNB)1Y=7_i'ٟx@ @%JSGl:g-C ,n/a+1_`1`y{Be+plL	<53)Rf\m<wUiI\%$G_Q8nKe0ɷǠfX\4ۛ A'riz;Sߥ9sސU^yc8"to"i:=#	RgvX	8{2vM)v쯨RrduK@J'j9"D
;C<I$U~= 6AeII XUzF:RD;4ՑRRGԸcNcf9dJzA#8eTCaҤ!:"x`I'NvIV2/Uw9hN>e Yȴll(>}FRKɏvᬐ41p/)0R@ I>T,kpʎ},2yKhH"~:/\JݦgB).Pg<w83aHW|-SeQPZ{Ӝ,c2/SSdRԻ,=gokuѼ%0W&E<AP+wr3}xq<&^Šh~cJ" .u)Jߤ(ld'-r6Ԙˮ@j\#7+F2 @Mmri~3\	"^?m0R`ͽVJCQCQΒ'pDGg។fܝIj*,%0,;AkO1Ȍ8C%(Ȕ@2ybQx>@qy r3ʯ/f{Mof׈e}2XJ|A~=O7]fo!dK"W> lw{{ɫ"f̖JE&>F/3pyFȋ{Kgj{1IMu-@ H]	#vf;65]d1zA؞{?Vv'([#8$B\@.&Zʏi(\cwTzϳįTLGhow7𧳑xpHgIQ.͠L͡B>l9'nW+p5FlUhM WoaMWa.iǸoa7ets8CND$;%(hrg	n,'.Z<)х3mO&Ұ;7RLAoNZ2IQ|T-wnşyYG:)N40go=dX(rʢŊܻv+Ӻ!"49:NF7S5._LGI{30P[\IzֻB`nMXoӖИ~vl̕$ѯۼPzZ|
voYu.N>-QRQh\ΉZKX@%	g6Ǡ s^qfEgac桠ڇuvu%cS+Po~رnbp.[O0oJRM/<c&2^s!K	)cV/g_~QEݰaroum*ZJp-Ow#~b!ۧe>*׸}DW4RAUoX43\d $)D<$Gk24Mav7(zLqA?['`q[az5ɳϒ]<fƻ[_C_PnooMojJ<1cAгTpR80*oH^F͗j1GmCݥ$	"˷YN^͐0SKٲd#3Lz[D+LOOKz >JA+}a]{KIɌ-7LXԴ%F94D]̾~ڕXy ߆dX [͜f0k<Tl"Hz`4^isnԉH9	u|KZUǱZ%TjjP۲!XS9}*j3	g=[5ZeㅵC*Zˉ2ai^ӖFeq)i!Zsh~E$urWK]G9 <
kj+Ü`I9GeHךSzxF74u{81LBb R z,3fNmpHA߄,\,B@!_YpʿqY2\k'Yt?JN(]wFnZ߅X0 ]iaS)IBh1F\U]gKy{:pW2Am4 P}dlHl
BZ"N_|v;{{'o{t,$+93#4kQ
9p9N4,]+	OԒQRT36!v_66Z+2lbO;\gi!1 PN.emql#x1)G<nFY8|0r6jq21S`I#0bE!e[Pd2zyxڼQv^~1ͶXl&P u'5ݕ-9'Q2aMɾH}y0z:jCUg:fVKpA865P3&iLr!W}	ƥ{ r@hR@5]0{>qM*@* 3N{!D-rW4q[R+>zn5l2}78OeԺ}goNJ}a԰I'9(լV@d?u?~wu\ZM6i#$[Nn'5,5"lKhv.9@J0
G"L,>uf-(S8i`ZS* K֓7.|ˊ9PX'gT }^8uY/i<_nl>72c]3Hc[^U|
3p~傾Ds ]F:TRR_7
{4+l~]C u6
?٥<sFogvONwh7w[-J6m'<gGߟ7'
ŉ)2]R$CH<F]c
4S&l#PfxPdK86gEm 'DYIIG*;1s* )wPpX+^,wg-V|<0ЋꃹZAmnk P'<08zr]΋u鶕ܹ 
C+'$׿וqI_夰(">;	l0nD,󳍩QKP#:Xσئ[p(`rz5펆5@+
֮0%xzL'$'	_g H&iIX-g#wh3 ax⡁ec^ȮXF`"<۩
>$!|ŉ([qW]yM	dܹ4Kjb+E[4ik@r6aC sAX'0txڄE^@ C?=#_wUaҪ'98csFƋLȝ?
CcI__0!uz9ͯ߅1/@hP~N׸9Md`,/`o9S:oٸ6\Njdo(IKOF Z߯EXyBC"f
⥷,̓CLPH5KoFjGϧQS#Bs܀oF1X90Pr݃m͔+@PdjE^ɼig0F)WI@SâͼoU#i%XS86!5~1?OtS^RdsAi`2c,<0#̃9<!oaX
aa>.j!4PG|%-?O_`*z)R!Ip$PepQ2,+O{]#!XB+Ӊ^F!gnRZO->H{҅-6G#<LQdoP&.$0%cp6qROcY%porXcL?mw0!1_4\=X롢Y_i,FnJ"(*Yy2Zu>dD$vx@ʫ7,Xo̠_jF7*b:"My\lQ
^S1'<QE	A"ľ	D9 C%/rޥqF3.{鍩f`n߀M/>][[K/tuZ^N$T"jR8WC(LSj)^}BҳiL~8B̝mȴI?Pe ]m?O{YCe%rzddz駟c:"#C+sc+͇c~h`֘9 xAi(Ӡrl1IOSMKP`gpsinS#h$ҁLԘ%܁`]`Sgݡ`KUSZx`#;)ecTф&%/-œ}u@w/4/2̴D)jn `]g u	f=M®6xrw$IL7	2-c>>c6+ЂHW>kr̹Rlpļڷc@p#R__zE<Ͻ~+ٻ~@l ]1̀}x2rT`yw{^^wOc7FqBuL)lNǮu_*]"X7^A6Y@^P^ýNeYo)~ieZ'g&FEoj`76ܬ-xvsGZw
RѿFzэ]~SS&u믌M7ocÝfFlѕ	"܌6]-l%F7n7k6-CL)u7yc
)M/m7d;9P/shXֳ`i9KŗzKXYxhK('3*=4M<NO~gDw:ٛR__R$-/q S~B5'tgn4lzpvR Xmn.i b<0xHowC8h6PФEF߼|JG(w:Aau%_Z+hQ<>Ē:u(;!rpU=lqVa^	9 ]Wj\!zئe+{JC8A30=kFyNV@thuzof'Q27@[$ْ7G?GgbHn\|rxtrzO]HQ&\*ȸ%(7sYR揥p[uzQXg9@WxxzTAL䇝{'Z,BwUAc*.R#ةVݹan+65l}43**FÁ>n%|h̼rA$gY1Oԯ&_]ѧuuUq@a=H_ݗW{?6֯m{I_Tσ0+&O<Xb1ܡo~y1# :^7K9 Y[ibӛ'tGGhכr4.jSXҦ\ҩ8=sıF?ٿO\e9P2G	I&sMցo,[*	03rؿbbw]AR$-`'߈1z)\CE0o%9):m޾S!;Gq/F~}pKE9-_^sYguV/{XsƖZq${Ǵ Qv;eocnZF ~]^=qf.V(ChZ0xO8}Zt%EE"o/?oڙis͖45rx$m}5吋}աE!z^M^W6X^SLz ֋p)vM;A6^zX={şwA~AE@VJ&1YD0qd"|w*}ku1fպ&z|"}
-Y|%jKEIiРƋͦ6cv,DThď'ϼ-MߨK{e3ҫHyKnHCƀoEu/1;,aN刧;A3fw	w6M	3;[X̞Pd6B#Xl_nE<x`WUZ`,"YwQC$7;¤Vg|~s&=ϷR6T! z4e/r;Gɛuow[xîgh/kgD
1h4	RF 5{=ٸB%j.{YPvO McJOW/ޛGαwd/9<:tCVItak{n\nSA!,FĽmA_ӿ~C2`vv"yKy{@GvWX!%z? z AT Cɢ'w@ٚ>?IG[}I
X7uVbs	s92K'A&\yɟy"KI:dT>IEn>8䖘צ6UUzA6GϬވq3LGNU{!":^u|&F3Zӎx;'Zv4cPo 3NÏ8HT;-UߨnѱP%=:>tnjxHd?6zE/yL9g7߾n+.՛KmJ`GM7܃vV08V:,JQ_lA#bwun3Udu~Dc,F$&c 6{V4j^K&zK"(D+q;}˛y3T$x7%eos直*H^7R3Jo&VY&p,[1A[8kIkaq=7wЙ7Y(e%:[bNvn>97#ؠOWMq-< ׊s Z²EfxLrHLHC<g$N!&!aQLte3ɩ  \zp׽	AVg'oC=v=z0>Ê[sV>x4x&N+x*oxܮa1+M>bh. ء+nx Pn<Z##aD@lCw2re1SN>)LḾ_BCn^Oǵ˯9^J*s=i0Lڊ+c-,*fue5"[RSاV*"0-.ge6[&6 NVLl8UɏO^V3![y-]#/g̣"%a>g#Y2d4Fnzd-`CVVIcUԗNZ<LBU =ƌcDЕcD}̲NK湞oiLD1h3Q9Li0e fT2pc#JXfA6e8\<>de=>l<aVe׍bc?q~C'7ڦgNY1)-,jΧg`͍Z:Ե璐=@~}\֭݅db`BH"+H1V#ϥVE*=&''BhT3Sɝ|W-L</an&HKK:Y֨PuF]u|NݭMD  VL NF]eցД)_^ Oh8NJO;Y(agH38m(h.V|AĠ<
񏗶$n\ v{H
ի>lj(U5[Hs#0ʉ[5'v TZ0kywڞk21'lT.&0j0T{!:6d(⪒r'eޅo c}拊坾x"	>y΋S/+;S>i<[P$,ܒyPu稭} _%D Ukӽʶ:rws*Ps	W''z1΀捾e|s5p*:kNg5agD5_Br6mѬ76% ,E6*ngӏ/9߽_3٥լZ+j$]SG>ӕQ(ʷ.]'ՅIk"$3'3qXq=o
 {zЌz+؊8H^&hj]F ?|SōWg I6bO&tiȕ92d-n-q	SZNK䌌+
%+61sj*3buBt%/>~k'kJYˋC/{Vef63j׌0Ka/ٽ]Z[<A_dy`]PՁ//΂o'IONgS{h')rϵXD_h_kg c$Tc;ZE<ٮbDPKLyELD%wt$4fZo꾯 B+yB' G,򘯴V6ώeXC\?L
IA({Zڥeo1TH%9V-2a)v/{4JzdKGgCb3xvm16G!yNim NUf9~nxkXoNk6]?/G BUy6M+ϦvwTqOYx=s YmLm3cZjnrFǎΎ7bg趮fҀ{=of-'@H,-+4:5/gS,G=Ԙו7MFJ_Fk"BwnG.|f<**^'-Qj o߁O$ՄU$aowi96_1v:#j^p!_{/9s-.@DIPV&G5nc|<Fz8dN˕Ǔ~S,ɠ1W|X-*8EֱҁTlP_[I.C m,PLG?n79+TM ίXC+kW:f$*8lSt(Ab^1	Uz[\Q0s".dA&;J;sT2 !#Q5HgJjI0}SE|ɠ)|.M?ƯLU\EA(h.TgЇRyg17.~Muq !XWX]d-bkR@|Vrphqhoy-	0'cG{+VA,skwv348ʕ-lc^fc^qJ͌m!=. AN7Ek|.WJ0hnq
5ݷփ:Ӿc[x0:+'en8Qb^ĔJpȤ+qQN6p!}$a aŔߣ*Wܙ=6~ _ŨޤϋkH}L?%.Xtsr%	`!Gִ	>}ݢ5ZDCn\:Hfh*	뉳(IYq9O>܀#/J~V߿>d/rA˘@ؕt0HjgR΀s5CA^g[RBgD9oh$[^AF/#ud ӍX[ҟ埴;!zܤ;,$ER&\͠I˹sY05e!N /HiצLgIkVK˻)\=""	9Շ1rxJblnA$bDDi4Bqsz@&gׄј3s௑AKSI:x<:._==z}(LLnCP\eZ3!<wTuhּXh' <`wRR!)v%:s["sQ5YJ7XN)R`Q<̮eBkQSԹa6eXuH=H\fyGIW&=-KUGJW}:s@֡U$-VА.Uj(OD#ƞ~r~+Sc5[`xy}Jo37LwFaFI~&1_(eB uͭ'~-7dUYT촆B{6IyJƊ0!zKV$O󓲲ح39
,(IևQ8vu`.ڳ-%9-JJ*fE	gaˣإH԰ߵLVjZnNOWԦe"y[DlNɦz?Eڛʖc!@J9e>\:Y}ww~#V0&Ҍ)ɡ.xs:nj>)[6nn|y WFupH)iåeHI9I~~vtICCLݎѭ@Q]dRr UBꏪv:^3j?spbJ][JͪFSLՐxXEV*0OKNaYCGD|sVɖWQwQ{ICIY,~3LWEoiS.I$4;[	^
W=8=1a<MclBQXi$sGx3}Y{f{yWR]#@G+Xqw8"*$+x[kjFC:O/1`ZjERd5-:aa*!R>a )\R#åqGAp#򞩉/,y೰"ɠ;+pe4")
,m}٬HX89a	igP*/[F.Zh p*}?67#R3B#Z=GmV< `B(;XP\B"=bw5lhX4.G!ې CSۗVyF" 8Bۣ^mxD^͈=Z~
\Q<B0O;<)Rs(8:|:{0YX)<:ޔ[	Cå-(K{~ƂR+d3N7e5A\Y>ή!#	DTQcGGwÆ/E6GWN@<%I[zdluQ	
lW ܹIcK0`J])wvE:KgOI.%b`S[RM;J zKb2!َVFU۴d\KW޽ Qlw7f	&aq:PL zDJH
D[ezKP^ٵRǜ8Vhj"'9	*sYT«g:rtZ!7y{{޲V]'%}
Ö3u!%N&3D3 A0@Dׁ41wTboISzC!AIP15=2q7l挬qcBҳahRo玳o-RCY^k(jM-E!CtĨg;AZh/D(C8-@~׭cKhb9J&~ȣ1?LI=>T?g6@Ɋ>Lo2B0r910w M}
~SVe7V\++%2PU3,Æ{%J۪A`@I	,β)j7Z P\b䄒YL%y~4L4Zvt"d˹Ұ y)5!嵴cWcZ`HL0 ce`{BȉFyv$crz/KX9$l _D<@
auݭӺR5@o
ʤSαF<,NHB?X8H^Ube2s;>83_mWMk0r^Y6#Нn-h)5BVQ;bJ͚rKD>/w"||Jl78,4ylT/B-W#DձږB#|+q=]҅a;*uzRt~S%gft	mF)&u%A`"vuoz0@fXT^fE&p$p_qQƩ}:ʎ4FA>I]m|yXVC6h89I1؍I~d5FS5jϼ`v~5K%|B'cBA@K5A'׌.m.iiDsL֮`bU1R5gFi p
c.:ErOdʥ1XR;#g۪]Epm	 W[зޱtH4:5rqF<:wI~nemvW-mP-f2z]1(13-D!a] RvAoHxȸAgy|ֹ4nCx/d~i3_}ԋAZ`ǯL}-Ղ~_n'IbU|0ya,K *<tD^xvr\UfE:c^vn)6`:l/3ʍ$bf#\)yi45ԮcQ)odCG]e6T^ t߽[}/YbVXyEh,ՁDn1:+"ߒ۴ŇYq|`be"ɣG3 sq''$6`ｹ}D^<B6CtD?n7\co?ۣM_(f-rNA&W_[1>ZOb~}5'}:VLyn-kh	Nt,OEH5U.X8iF=I|'z8<;U\ѽSPx<'U&6@,x?M,b9{0wwƒX`ܙvqډ= ZUpGFxPɟ>j{(RVu'c+u0{E%4(#1?UAռrX9GVIҺ}zL(p5۴ŗ]-w	k #¤ ^myG6eSđ,2vͧܮv|)?rQ=	j o9rM<IT2B/.ch4=*w,#	|/Kޢ
q)rJ	qw&kw\fv!r{M Vw[I/1_'ac"gvW=A$FoOFi^d~z6Jha&x)^x+1);2'1p2%Rn܎)82ytB+doO"5U!&4xt^
1deF^u/?^:Y؎9;9W> J
B`g&QZ{?jnmKCiOM!WߦDc2hSu&bO#wPZzxZ4~
^MZ3>Cz=*&Ge[YLTJq 9q/WC;]S!j,[,Q.x'T`6>{A^6ÍANTp34eI/N8<QѤAv5e@K'y&EUFYC&$&04SX
'O⍷ 7h5|KX5g	,4ɹ˺GUߵ꨼unszH-?m$ol`R'8%_*O9@F`"g2 ۰y%I@;D3 0Z.1l<H4Ohgl|)&ϭE2Ki\{ܰED\$iD`#krX
xѬ7~C?yٵ,fmNGND¬U6#(ȿypiQ1/$*~osDpdFe_!8V\r=lxT /;<}SʗPF	B"gu"L)qa,]\ٔEaAWlN9q6k@䴆 `4 lОxLS?2ыH
6~vrx򉐌w6EYnl\͋`ہnT&^mtj]Wksd<zabs!NƽG2
o9i>:h쁯๊-!J6
z]]S;ݘ篳?f|ξM΍ī@,&Ex[%qD [ݡ#8-T1	}JKv5V"^-Ved=7uJT;ϩܽ5t<Ԟ1ĺ2ޣFl9 usEsjx"==7:ϣ	kDX׽nЄ(tȪ#`Z-]^3\cC\7(R0z#Reҧ'Fz=o}#N*l1Odځ`TֽGbK0aX{Z|-G(h?.nƦ1qzӢE|ѱ0qJ@T|8#Q9@IA,HPMYCDJɨ [pj+nl/?n8Sefu>v?z5Eǁ?ceLXK*e#ʱ+p6ЄاX(rqeQCaYXl1klQZ5TxsJ<Y5!"Jd8=n^䨗NPE`:ƬޜI(s#J 5vl%Ev+CfH$H[a?r#+]xv!c(>U yaMdfB5ZxRiBEKS@҆^ix_2Vz\Y-l:0Ԯ\JmRxU
~{ I1fBm ~a]Pl$!
JCH+j<O'uKdI^QgVdЗZ(;nOE>*E=Arh ̑_o*"*~BHk	`'Id#D'YU}i/"=@HLՇ$*T$$BpE[]99|a4"vߕ*X@u^7WH=7[\k':%C.U`t|Yޓxo~]ӂiygmvĆƶ/ad,[#3@~yc+EFZ@x.Yq"=geB~4>mbu4ʏn՛agrEfTwC	>y6.ې1Ð].UD,ZFp(AFAR X҉oL0ODnʶI8 ^-l LB)ލ-/7\2[Wh,hb2)&xt\uT͜0Q,nΤAlu5c;	PQMBXT)G]BZ
N%WG5*;6n1EŠbH7ޭx:LR \bopN~D
9~<$bu(T*oG(1U$nعX5蹛0`'@fKadlj	]LJ6$6Y `of6vB[Iκ_((@ ϾSR`#?۝:n5~'\K-%'|?8䘊cwiVؿY
kOsv{&m4ӱUb@-<7FGcd(!@D"Ef|ߍ<m41ԍ[$!#C2	`Y(XK	_Yw8d44	|3pD{uC^
(0hrUkY6ֽ,7Sdo.0
}YV\
"uW|aX 7f[o=m9V_1Ztx_X}   ~҄RTݸ(zjVHC1'T-pKrz؟R
)Y߆4>Jhג2ߺwpDB^9ґ|^-
Ư*+ 4KezrXE-,JVV/3>'U5#q9/+\BYnC0?(97&/_'wK?CӃB"I,/rc?F+-#SVǄ2T 5ji/-{xeptL{%7s=$jeN~"N6T|gʽ:hΗxuH6b]w N}(EHBdpK: 9+rlx誄%$U2{P?.t?J@e|wwJDy#I?Z$0 񟫌@w߾^AJ6C/M0 /WKA%!jOTPeGwCT\V"µIPJ"M*!}b$oTR3ZZ*u~A[t#ܩ*pnƜwǁM|pO!6!/*&XP|tm(qb 	Kp^UV)	HVYA2:EmȠD,hDtd񴴢J.#4\V8[j^wQcۊd1#:|o9H+4gbMriQ AbϨyWB&JM-k)aȣe|0x	GA<%,E6.
14a^LĂr!ԥF9Ũh淰䌄YcUNe^!8ۡ?.{7Ad9=ݑC;<즍PoK: a8j$:fk답1<',,/y!+)<tP6(*+jj#Jyfd؇Ͱ>qv !N
Atab=8@ *z]Z[Łs&XW	8QXo&{Cd҉q?NQ;HPKsN\5WwGғg5Kp׌ qʈU&`jhcsRKi\嬙/d<TU?f$.IBDWImz/jZ nCM|$B	Pam!H}yVɐkQ_`s3";xD$"`[K.!j %T78
Ώ)-7/H'#.$S0	5@78b_-Oˬq7INS6GĹm9`'yko6;6+s6a54aIq6P=Q@9#a#]x~◿GglTT1eq$-_DaCT()07דi}l1㻴d@[}dڟ3#ERr;4al)+60H$SV]m^tII)s VAC|O(ޣ@J+l3^~M/Kuc9MqE5Uջ?+m%9Yoa]!&V秔sh)!5	eG9$Yr2fHA1!miUɀSD`(fC1idf`~J^~C"CgN, `Bu۹Uh2V@˙GnUj}(xH.4 Vc֜fxyU.&FVLIn˞ݘ.lF/6ʗc?n%6oۀEgzKMXkPaOD	_	4@畓/ObBW_J,L	!wtNr:Ϧ4$AA.s@	vBV0J.T~jU8FȑKEURy*|E|bZ[0Le3z]*e=j_+v%7(7hTywZT/^kl8ͅm$xdQYpra6 <@(q.Dœ*&>NAkRv<[* *7߆Z5U+lp~:a`靶 ,\7U{sSs~bGfЮ{gm:OU-c3~kF酂6*nNl69B-~H0
Z]kژSWS"J?gYFf>׮"Cf+!Bak]w	WKu _8 X7<0qoru4%S<zZz-,o-ekIVkOUY_jKP	EəP0jK< LE77sor	3 696Zbm.Z[{'{hs>XD
I`mUxWproټ?-LjoDnLρyY&4N=G"R_	Z\-Y5z`QKrM<=x0/q%a~Ł|,>zH U<"2/+!tĹԼ9hʲMUiMa-bLTL_W*jBwjO >?:[~XgP\yWZQdf8q\Ѭl1oZpR0s7V$'l~J>pv(rfN@A (v#w,s]5FLՄ	[F< s.LwvOM9փ"T6t7R%4D@L,ϒyj mv2C05XP1"OdNHH]D|<g@s̫CHgdT /`QbWc?E0KY@'oPJMwJg?<kFƶWAyHf5=kή%i0pXR21xA5NorfB4 N򡄍QfVdsؙ2\:ŻIK;PtmR2'0P?)lƘBv01/Mhdx͡YoZ>1c~v*N x22*>ZK'-|J/~.v	o\mcSN<Uh	O!1b{?z$Vq~1&
?4VqH7E.ق+fXV&	=;\EXf>6:1{Yv}{*ݔkgs
S݌PC}u9+s(y|bD>MURjUp%{|l_bU26BX"ʅ(y[	rNZF[n/00,z<+u_xrTfJ
BDA TNh~#RW)/,B'mIcFud皀iUŦA["bڔҺ		q+
Ha~>1,	?PXwys#u25̂u-|䕋7B_:Ia+@J	{kGR?ϸKN2r~*1l84)xhƞ@yݖWP}
Q6u?+U>(	d&!շ{]^v7%I*$($#	H&7Zsކf''yKZlȇi9q=9ˆ/CʆVD2i6) mOtuyjϹE<h%2j)VX/
68E;g}Ltss[+	A6w?v_I8Bt?aV90V\̄:o.C]jtntNS[Eߦ6>f*}KE,P5^v{p4ބchCM֞&AZA2mS-Kg1	-D|LU_
xYN-=4@aS1+.f@^L\e@X_V\4ߞ4oA@!^ ܫ	~^]ɟ"jyn!tn$IyÈyS[nF@ 4רTpy܄dt]Ϧ8i
BrZOnQ~ƭ@S4D5Z9rjiK20Pm.GPvPA!.][;LzɾVhխO}z{҅̽}L:._IRX@kk5J|;F@KRP"/l,q)gxN:@u CEUÛJ-WIfCFg@M_Gwj?FFzZ':!`fBVcIF.6FkD$O~/3bzA/s]T3""vj*7v*O!rγ=b<8:N/5B#2QWϝ5%^kQ<D؞U>I@@#|j*enY4`r+J0?Dώ?
L $̮	yX'δSc&:):t^"O~n2:ý3)/
`?5gix<Wa/ #*9ʕEfzJ|{xD/7PۘK#oaw% ^n봸c>b2I(\3?dy?y/^j0gi/ JjɩF:KUsB\%e5llc>J] גp4o7(V
u
z;w'OɓVp%hsJxYUg@ CBUE03_9ۗ\+NZJgSNH{ğUAV_9R槢,C ǁ-":n9N>b~.ٍ-bEiߴώf4hV ؐޥ7b'm;TxG6ΑXY("v Ώ]n2_+p#Q佱mD}CElnY.\p'u\xY>\υ.	 Sʐ`4hLba7䫶+.N:N:Q*ˁh *sC6k%줲bOdȒlEKxr 3!&Γ<.C)p^}Vdl f4wt|AD]RAۘCUq*Narʎnm%!~hɠ2`VWz j!}	jLyAbg>jѱQ 彅	@;`\܁@:ðYzYQue"<]pk=ߢ^os<D\P-l;t/*ty,vY/Ҫgr>	Vq~_0=VSC[SܯAk4|-$CqB|=UJV_{_u؁["ުB5^$pm<GQm)k>OH ggr<K@;{$}qM-b<R<Z*t9[ _ێI/Ֆ~+ڿ1'8su;:_0d$cP}3,AW=5?;vvVD&i	4 Q%խ8&@*zƵ}EW񙣌W{0ZՁ?1kV:oeoCgSe12 GiMOgn11ܸA9Ζ{myxKv{viA@{P@1=1	YX">ǣ``7[ZW$ۡGyIz}{qGvZߑ[:%^FtIW޻Hͩ$ݒ:>(O#9 ۧQ`-Khץ@_ N=KNχ!̌KԻMFcOhaxɄ[Uf1nc'g{ޟٵ_2j=^%bDB>O<$H*Az D.\ddsUe(lWP?u2%Au;{(E<HKŭ9g*b-&9Ńx	媱jX:Rx9<ML݋,cdw<JC9>z?:k;Z۽=^W{?&%;Fwc92>t57Kv'#r'<{o	li  5ͱx̦;3D$AN 6EHY3,U9A쀖j[8;>7# *F`CA܅N3%g̺t )T V\3PVhA5F}>>pl}yC2٠(rT.J%,$C2GzyˌiKSsO/P^bg`Kx5xCK֣lxLm"8498sĊ0%x;yuyŔv\(Y!_`!25TˋQ**z0OPYӺ a44ks'q6|sK?!z40n_i-q:9~5zEVu`?XM[1@Cqs<9:3̆2>ƐEE1b}< эi`.m*'5MINtwO4O:rh@J,₹1N7d4?9i1
Mb1	Xź%VE]?$L'!'IhڗK4/|q޲oSM"uIC\\#8h%ͤBݽΨֳg.WsϟďՍu˰;AGrpV}x8)<_Ag[nc9SQKn	M3G'㓣㳝Wf]6 WCmj-|,O\KTY	M6;<t^529sW/k~$ǅ&SoK,V1dI5./Ʊєi<*sB>4fxm׈"K1^$z$KQ.7%po-q0_mɧ.g
tr<*%Q~Vpd{
(_-h)c]ϳDAH5|OK PN0 V$uEQP!ww'Us.M>4jȭ㬽
ȱZ2RqdT8npV5#b:Sc\%LY|5U^oToeOk1'X#~i8;[kY@5e[89@BR_bnmo&]?y<N6nUL;e2x1ƔX?*qQv]ȱXƻb-7
d.o&z ;daNpr47q%n {&v.y~d|ʩBc'%ޏ,4'9́Bc41{#qi6#KxHoGG}25Mb8P6^	,gL)P6?D͢_ԶY]js趷CgWT+~xXWbj:
jiLfb=Q0	8Zc_-H</BqV ~#zuť.w$⑽2p~|N>:վAmi\8˧2v[{uVa9)u_Z/54sS@See>n|Ri˿4T1XΖ*P>SvNhI2IVH)2x\?v~~Nlo;+>uKZ<Ne}!IIsJ/;6v~	#
EK"킝J~naY*#_,^eC/G3:\#ƧYXZzT6Y?,(kmkU 2Sb[fs~ͰfNw}p
|ގuAQ܈ލh$ru)E,`2h=m<_.^bVZѱSig$d^<@ۧ X41$emf4򪦫bbEIy0N*ND`cD]f)Ǝ@ά(2Qr4 ԑ+ &ψ)bRDBdqќuMMc :`u/=!qz2XzKeeM6JF=:z+@\Ǘ`n_o9h4I/=8b FƈA4/Ow6] HvË{C[+?cE7	oifZ\fɇ8!b*	ɥ->>m;'AJt
̢[ qaL ԰A}IfTf,6 MF&Z6Vw&ԩCÚM_g[1Ԡ6wa3uޕީ4aw)BN\si^<bA<T8;:to#j̴NCz|rd 9b;̛cQcśH-9 Fa(A$5PS@ VL5ьKv)0UM_wv<cVMD9_-qШ 
u$dmn+{6l&ͦ
n
esO%
{ķ4,<6e(%E=q0 ,ݜduUcbÝER=X=ޞDD
/ߍЊ<
]斅sJtحա+lAC
b\k
U
a/zl?RGepsf/Q~88/&%8'ixbM{b^c.gQPZ.KN(~%IǇ}Cщe)|xwxftXѲ <-rVDN mgi)"';@=ěSb=sU_Jy|čqo =jcp-waň;-`GHtNG8d@o $LCZJZrLa(/*iW<@NE2jI*JUвY>2O1|F^;zJn	(	< #<[jB WQ`Jʩ"NqJ٩MP
8?:egD"HZ@FBGe_A<I:
A	y
S0oaJSC0CIC"n۔t-] 9@p	Jw7~x?UW:2#{S:vRu(pC펅Z.8AX;s zTH62,A
^l:2dGXyB$DCk>bHy(de̅h04Re&].,/mQ^`N	LAR]"%XcWB{g.FWVl+MQE+B2fTAi65p0;6ĆQ%_h Ig|SE`nlo`+\gE'$)PԥW^}э-Ww} G?I$p3X|B~!H"n!cr,p{ {/JF9Sr($a `wLS1@Kz\r|z'~ށdD1}!8{^-]t&y㊑uyK\Ҿo ~o!CV' {߱SϋJ?ލׯojhV1"X]ۡ?J˟i^KǊfv2'U]lt4n}-;25i
2JֵYq뭝
~d<k6gbokւ\,sH9á&&zjh/'FdPzOҫvPhB2Ḵ3\M8,TpcPLMj=^KOe!-eJ[ΈJ3e8rzٚ*ǩ\<`pa?p2f6MuDA3+ Ků,1Cu;P|,[n1@f6WfqoEvi>	I)!Ef?76n77x%f"&%ddKja<%(X[n(Ηvm4P)\^EwvQxkM8Rr'NR}s: ͊2F TPK *Іu3s3'HnsD1m&e?LYn$,f{GYKoPS`I^o-Y3>Y;X*^SZ=,)Xq>WڣoxEl&<p5u)^ ??+lJIOF# )*_TO
憈|1-¬	^6]Up aA"4hE"JyPa+&ERȍP^+s14sc>ٌXNfsvA#I^HlY3R̹5JHEsS<!u6 DQ֑"洙ie-2!ȑ<tmF	&w}<B̘ō!x"^so2rcH\XMq9;MDe
d>yIq}P|mT:VaƚC9ƞW)进%1"
:b*ƥhGA]i 6"rd Q㡑: y ?Zw*hK(7zF{^> .,Ls1?͓럀r_цӟ׀Y$hWD+Eꄆur$ҬȠɭI "
GMܪ∖C !ΊP|/LLF4̮G	Nev^5wRTO_,1)E W4(El{[}$u4BXJ&1%,y(ƃX3wo*l~oe<KCCd^

.m7żln{_"[#ƶe5.6;tV_f"#+0
0Z![E0I&" }-̈Ƞ#Skʝr@3C0}t`t	;a#iJ҆QQlrG{>u6 9H]zxI˾A=(0B*h?Ũ6Bj_HmcA/NS =='
$ (I	7|-o,XnY
sڻ\B~8w$gTQKvwr:!o83eD&Z#l;]I\CAE=̡z{`m$~󗨖/D}	xZ9~Kv}5tf,ˎ|9BX4r$*fr`A:XgەFa_-|a[pPm_
*R aw(|BݕQiB*T/8ɅcCmM:I;9+eO:(\Wp+`RY1hKqPT ]va+N=9Uو2wéj?=i\/&=YO~iHUѲiݦ\G?޵$Iί(3gK "ڜgf=?T`ߌ[fdV$ܞ=ǒ2#oq8nz`aXIj>uZmӦL9$V>q(!V2I</0VMAchQ8*o`AFD_ǁe1ZtBk(tR,D)J~|d1R[:£]FcNBϳ:r`.+!<}\OK׈+3xN<̣0|&'l1-x?Nb+@O]Ǌ($)xa/L9C=Q>am'M1:خԺ@6ZE՞8s8@Q h}EqyM|n٢p
xzVdk+[Q>^?z,5lq4b^kJǹL͙<\ڳLʒ!hyKמ5v`qx!1k&:3;7`2ꊛMN^qG0bV0]ݚQD=`
8;?|ݼi7'R)sFM5mܴMC:}N8TLEX iwꓔ?-Ciǹ@JG@%31w١g1w|}9Nۖ X	[&d9Dz&K#N5>^]>@#=7œ\^.n( q*G;c,B'*:uvq[o
VjgV}tt&Z5nW*Kz尪V#od ~n wY9UQH借Z{)õ/=Z3#`2=*C5D*9h#6n׬7* ~NQ+IWJ"|= ?b<hq	P3J5)ٽyy<%%M)QDJ!͐⫯j*0}.Eq+@`	Өϯgba'nCTN,fMnEY"j`jZSrbuH=`0RR.0+B%x&I	Rz%1_!`~M47>:f<a<ѷm.~&*Pq{.SG;^ՀQHxianڄ|cYVkQEP~om@-2_-	Vai~m>j`iƖR|D8 <h#yRwuvU{;=Ukkk՟S*WN м?ᾹiؑݴP?LQd'1l+td`rա@nbq.RPy0@}8ًg*H.ZC#aoIAF5f(]	}U;AR1)tepԲxdgAb;Eo	V<d:`H҄RI2=śqsK!`:;nV{c=K,pV-%aϞ˘cC7N))'`=_oWAGnA8Vn_r@)]A9S-E].V|gE@wQd[=>ZnD'嶔C5i k
T"pOw{R_*<LVW}UCjJOa-F|WbC2{n׶轶ctOQVxb`唭rE2`E7@'h`yK 	*&htr8;Ke!I{W? MM0ySj|«TJ$=*|UL
9@T=?Sd0s.&jp"IDA!!ja@{_Ǆ\q?J~Rnն2rRWƖ=fɘB$:Y_5/E?r᫷ͫav;tE<~q;V:Da&X\I4	mK"3ke[1`),llK@ pGZ]]<1sb r*?[_"H7$W^ȩhPNPBx)թz*dʛF<?#VZRٛE0cذ|l}WZ$ڝy a
!r@RJ|88mN{ Xo*.8;܆~q.xJVju+%/t*=E)hag)DqU9"Ӗ̷w7^!¼%;张d{ i^'"{HZ,+bFU?]R9v~I[jHĪSÙy4kB7:'Y~+p<N
(A^y@|QE2׍7+Yu-KVL|L?

q,0u $m::F\eOffNt&IȜi~Pf"ͣNtTxg
&qkً?>G05gR<Y`NTSms2#AJ-wÞ̚gٷr¯X5l =3h8B\I(!*L\]3(`ӽ^RuDD$/Ka GLVFaf*a޹tD-EqܡE	;p+\L.2+4sS8IPgXsimfX!S8Sx"<eѣY^yB;sӦiPi X'd!c2O轋07hAtqوu%b)CG4"PG\dPpb=NJ9\}͕B*bv{6AP;	" aBHs@Ryd2ęp`t @  iPBrm͍	&N[jK.ڥw:=;]?f63nlIJG
3%Q8mktKTCo{_=#m&nl
phyJd[<qfc-1`̸f_z+qAJQv6>)1;437ggl#Φm0טMgo@5mFǿIO)cOMgυqBch\?Bñ-hm^U=0bwPăqTsd7vYvh֡y?O
zGA`Ӧ0(s!n:0됡'Hx~rMd'=j{SfPu8`Á]d֜uڵ4yx*j<嵹nMq(*8NAd ItȋeY 5hzϞGgMӧS~eʣ_|i383l)x+Aі<@зDj40Z3X1kQ<`hyjk#Ӂc g4ms<6%d$E+HӖ;3Ƚ<lI.M&DJ #-|&|0Eh_\k2}"1Qyetd@ԌTЗ-T /nms6}8#XKd\&Peiu.ʢ]Z5KBΔ:`YǏof"&t-i~W*(yuP_I)-G*CJbor+\]6ͤ.[T/>4\ Q"U`gr&,!50	8Xن1)6$]hIJeD2q( RvudyF4pq+8,Ɇio_"vE/͋SoXSqL-^3S@.
RLJAP8 \A aC%
Kϓ6ab>֋_dHFGIGf"TjY=KJfA	Ud<t8]þ5	8ӦYuFa5b7;vY;..20h%xX\X@Ƽ*wXҠy۫HVU(0uꯇ>kTV@>&O*<g{xߞTh,hJy_u~3|T	}ڋE5\9S}rr'@NEp3Fɰ!!v<qy;O<}APwPY\a@Bb
,$|#VLxf6q.7G/)S6*/0Zp񦱒T'YZ`AS{Ґ[_N;| ۷	= u6zHaCFRKV
ީN&A+Pӳ:z =~6CfKl A"2Xv;_)HJ*'>'053;xaQHBqîs[T#fB]?(a;AYt%! (׊ Ss`5QɆrSSo&.,ŭӊPlؚƥa	lE(K:u~Q9]8ܩoƘz4[ȫ	H	TY4,Ө	;AeO}"Vg8^͇n-r-EG@?):k>E??'Ŵcc`͵wF
R`Fod{  yEá|5Jc@.=|]@elF,~s'J84_0t`J\b_ sZ,IRgJQaXcrzTFVƍd+@ٱ`W$N9rL#L \FQv0%!ȳN©{s3@R8$?tA
$].' W"_qivC(TI|{*4WJB)QYTX-tB9)p1p8r4O9Qޔy<R.xc! P\j\BJ.N\AiYz! =LƂ[ Dw.Z4* ۣלlR
i;] P_Đ:{NʤS6@{_?q'4s8mF{m$ӊ<ś< SR;ڿs<7Ԡ5zlM/Bm=ͤ4VrHąDl0Eyv=1,3:u$K;JkՅ2sRbx値j/%uWΙ!s EGGw*GlTf<:0K80E#V?JEn0ddj{1ZH56RQwk>9\ɤ3O|C	d5Cu.ؼxG$LGx5D<Ѣ{v|kQ5G
(,gYOԅ#`
F~01F/0D1BNtI2C`νfMGXrC`}#ɔJ5.bz"_-DnDS0!$*$@O8Ep82a!x^K.VlRk5v\^ˆ, MW9)4vNED(,qe[JdD5W|S_2[BLH?v2&`D{ZרJZzseR|pAh@rQu'r,mwOJLM#ԋ=^/m4הq@)g)\0~AQW{szwMk
wvWM#lA%JqqRh!D~ǤKemeϡ_kCq4ѣ-+EoT10P$_D>匝*AWw 3ѡ8<_ޡcǨ-*F]
E zNHj+nŴ挘T~#3bN5R@9R/ŏ=TŪb*Jܧ' ݯ9W;V$-YJB2Eԅ`Ugd2Β+B`6Y?bRF1G'5&-
fME DA۰I͜0?tb򃘔XDPIM=9l|Aoۑ9YQ:։QPJ%+s蕧jhyX\1@`Γh=#mTFlu50+Ek.^{굠0'h	$F^j${n=$6אUJ~
H-*bB˰a*6Tq2G"?DI"D1Tվ[5O(!g ΕMa#ʔbÉѐ|RB2fn.A,@~ӍP*jS.fW?{n>^z}\?#$ҪhӖAkl:Ip1?MRfC|JQ-͙a%;[	ȧiZyE=*;u_F!˵5Pӈ1nł$UNg >g*&Vys^+A
VJ`FV?%M7N/tLIG	-뼏~o}Q.b뗆\0v:O\LߎiP'eSf(؄1F|l2%#=f# v#\ygE°I􍌿UZ(
ڤ|mB,P(rQ_*O0z*vdN%Bi9U܁xe}YO}9ޭܹbpQTWU 
c4^	CFCĠ+
 S՝Q/-9%$u/!{Ŋ@4cJ8b~0웊)c ]?$`Tst$TEJXZ;8_es,Z6Fah4@T}Agfo\K<kTCI8l* Mw}|I3H$\Vwb氄:;YroJ1tǷ%A=ށ#ȁ|DPȘL̄vEG'}?֜meu~v_ITfM]풐["5 \˙WUkWS-,,&-NC56=Ӊ7,JQKa#8sL3<v,-ͼQ7?q,butL4,cΟrKxq9ߡXE炈;ZeuًGѺ0^ V@ÝHٞ:V3(N-XZRt9sÈ8{<+|A\dQ!0LHxrp<i~(O;OׁV3G*V>MϾaabL҅P\O
S#^^QGΨ5a&eLj>;/Q{8VK:ï7Ѝ¤҂hD; P᪠'l$vz:Bw.O!ZVLٙ9";8iKEf}
4EZ
KdJ&Q(D\Rq5b1$[Aj,z㯭qV?/|/Yt
EwC9'KRrys4]`2\#{NIN0,~!d$̌sdxNئ3%CEI4py ;=H]׏o_7>3oǢqMgQqšJ.4̞ƲPQ$7fYe@t5aʖ-ȒGV& D9lipJKx2\<ST PXTLO8Y(qh'Ðv\ ϩJtDڒJ8shL_X9ڻ.mڒך/e&7:=5
p6Y f/AkǞkJZ+UmeQ7П<S֓*j$%Ԙ.V߸#JYp1"@)q۩DRh5>9Y[s2E8 {FIqk(RN<ϲe^aB;_>D<qX_6PM`΅&;ЭcM X!̖%~}0X4b'
YOjH
*.^`!bb>!mK.<U.Ӏya)v]u3\_ν~ݾ{ZAx$h흫v\K 
/pÖOS\q4b$.cfz?OQY"yhZ{ξXo	&N1ݬwoXt+JWCD_(7,\ZE/2[Xq؃4)a$[\6TCGۀRVnTb%gCB_WM+b.FNYͣA/?F!Gr¢^/(ۂ~	Viڋ9еXb6zC^y?LB(@
?턚T=EB<$\d0cNـ@>]L SEg\}IO?.y\rB|\wA;W1
)JfX¾atsðwrpC8W
؄E >uG	3VXܮAJY_~n_<K\C@ 1ͤpc#WPw~q|gq(n)5}ݝ Cj,ur].Cck!`pTu2$)>ʿG7-wN4fy0F`j[z|~^|:1#[Iݼ.[j}pA<W-A.Qw+rn^2$HD<?=>DD+UStjyϢ_-O>Y5%%$?`uzwpo((٠YVj1(+XAYEF2^/w/uf3f Oә|)?=or}y<?p(^8~-AE>b[tyoNu~(wiT-Yg1q:ױˇYmZ3_HP̧d`STUv|!XFj>Ȉ6gC(!<
%\?gEqT{Q)acCTɃ
Ұ`IbiBydjP',twzU,VGbJ n|//Hit҄ItE˫ilaLal3|.av5^N>׵hDEs?	@idt! }w)V:H:6e?X?}bq+ԡ%/,Iaѣ\QAyk[>xM[*b}D7yH[~Rxz^4EwqуH._!t92p9C3 >Ir*q4e޹818ۖa]ћzM%YLё;U85G+EoFrON-_)2wJjcC06ϝ1g975b!5KQH{ǣ+g'F[f.t$q_~mVWb)&׳NIkG)qyf ]0@^6Ű`3p#!я;yɨ;-.+/%6D_lPW}6]eݬwgEeVQ`.qsXН	o	l 6Q>_/[pғg.">ܧ?ij^7ˋ__6/4*'oߜbj_5k6lxx~.	a~s66)작]2#Ox(rW&/Kκ8S0pӸaXD*eTmޛ3pBb"<+")P
=s 6C?k"zC1\$.@׷r+Vd3t$6
 ӟd@wPido^gzWsZJ{O3f~Q*XΡCn$B1qvHX!7 |Ug3Jz6Җx!ňg,%6i&
WOBrcZjbu|L!4ғ<t\p-xDr7x*˜ϰz^-OH'RwD4q\噞ɚ>!<;Bo 0GC8ܞ̹peNtٶJ;ʰ|npLюE@XͳFǭ}8.WŞ°3rhP2vxzE<NFr:Pm A@H"L"{D`Tw(4<aN_[DkCuGvu"!ӱ%9ks
˝=~H4V.=$>NnY#ӠC`Kpug"'@DҞwۦB%%_|9n7Qy9kT/mj.ypKHrw\Cj·0
փ@Q/:c2oG3Q Ă[zyp1avsI>t
AHVJroghqMsIJ6׮Jr,0(ӷl,I
)ȶpԅwe&
aBF9oY>UJV`'S{6{PjHwa<YGڣ^{f4O*ȰNfשxMlC~yy;)ۘdQQkK>u̾Q(d\a32m>i6XEn䇄0ơ"jI0#G)Q飉T$[βK7XnȓHlD>#zIY:Բq2U'.x>ƷF\s%}nOS {\8;{4&:x<%r:vTvVPKC,p_N,VZ8]N`:{rR|TEpfBt6n}(`m˰n--)DsbD:ϭ%VyW)TDE1ڨ  Gm0_E-Gs \~1{:ڄw܇f	bqIDiyj1{t$ec`
}^<4yfhk#}Ξy
vؕĚό%/"Tvv'۫Ga3XK+9[J'<<j@DAR̖^N,)>yҳyĔ6M#L͘(:վ{vM=>SD޸* &xϞMvu}x}v<uztǈ7w*Xh%fzt#WW4<=%Nz+!,@!dYŃ9fD{vʹ7SDKF*kb4P1UMG K):.B`)2EPQ%s/2{I**vQ۞REZ"<7GTN"ztO'0*gTHJ;!2$-@K $  Ӵ}`aA' )	so,GӞ~%fMYcL_gJ#J4!("q?4L>*`KCyL&ZP$i7O6Ts>~u2Վ隽U!e]&#mfka䍂s1 ] u,XH6pA!_֗t(6ڦQ9ő;[`K|GӕteWzk/wilD0f
wdJ>HBNk7pDuv脾9煒zB4OPH90~1e-r[O*5tEΏ/_7/n<;]mu4mҷ/DsnbL*EEъD?wڍFc0DS疩s0J|IWg]eX8#V,v-RIB8͌1jGXyGSd)g䉖^mS*ƁWXuʾ=,pmFtnT⹐UƗ N	Rr8><g )#jKWOhBуC;U狙Dcf]9LBT·燢\yxY'7L[H4a)
zOމ^˼,#I'>]p)LdU9gR-mJR_0Y
	-GvP7;)z|Y2Ml90h;ҾEiEvٝ,"¨!.JA`8h
l'v5Ͳr"g3r58'ȨNJtvMFfo:d
hu W\G,PdG@?{N$KIq)&/oHfV[!tVW`cVv.>Br hށ16jwz=v\;p;Qw)@	9_Sudyȼ{fTHUQRB^/9ˣ1+.% .c⪲0: 0{4OH.dyCXK^SLJpFO=T-9StM^7gWrm܅Pwz#Cn3ЏQXXB*Tkvb56 qEc vN_tA`(惟13",pXӝk0AD @%-Q_;Ig8t3۸x =TVeڭ!ʶٯ-%5H;q"UxC	DiG^dkHJ.<ei3[uxe	"!qK+nNm6<ap<zЍ< ZUdQ(BuP﷣l&b1yDZ˥+ B_. ā:d'W[4WY:l)K6P4TOYlnQ/1``˗5řٟ7ܙt1~sщ(iLBA;#-ej;~0g'Q:08D`U0@_BgчJQtES zULNAFf)Q̧?19=D},=BYRS]wn&{q@lJa:.*۔GT+NezcxKh~@j	iv6+U4BFu
Pz[ẗ́ޅ|C܉ e;p{y"W%4/y}&nؓ@eoFrQiH0af`|!fΧinX,,GSL^*H	giE>&b@6a]u8PLRLI}6J{1EɊHd0Vz՜Ȧf4xV$9Ha\SO5-h"jRļY˼W6(ԋ:ʛXN^Pfw3yy(&ؙhPr
ɑf$̐cw{7!q:~aziCe7D1Ҽ}>?@aтyPZr`iX3!`Z:,Eя?D6aPCIq
)lS:hS[Cb-нc`9GB\8~K^vtzbQ;^
 .;ζ[t5##$:'ћ-z֩Bɱ&l6ᗯxS{'Y=#cp濿=lsq?fFv KɅPzu?~hwHa(N`jk޹<-Y8N6w*.)=ϳ/t6_{mR}hH`YQ4*]
BHM	B<~	^)@m1Ch'RBImXwFJ^AloG!ìnl3aP.|-e7F&ѹTJ^*lW8P>``bjvW{mV<͸0K蟱
U!r==7"}@yoxwt`%6XESlq`s&r証JW3I3tG7B60BY̥ckZc:ɫwғ#a|y##ǼGD=i=~n;¦$^yH8m'6K>"'#ƚCa1lm Y_Ět5^E*$Q"CRs~rL{Q$tǉ1aS
CARxȭNA:rѾr<ΆuSt<.:}43vA!i4;.Uij3`[LJ_5?wSzmc{cg}kTC\K_WVʆ~FU-JG
)
lAK?;j^^B[N~9|yUzNrX9zn@"~Üe'[`-bK4u <Qw=lx#4YT<@.زox6{H-W|]%>gU¢HQ99D41R.DJDd,c)_Zb
{3MWW6@4,VTr_)FwgCW1Y	lWdm~ݣLIXӱ1惔Yy!6:jΎcuJ3gГ*AQ֯GnnNZ,F5I'>Q9zB. Ck?{Ho0uYCrMƳRt<"x Y=QC:qwI@
xo|P=zc
v*fsY{~Sg#(UWy	0^7iEL6`>|{}aj+*kͦ0q\{B;%XZAn9k2J4VkM2,	7wdk1爡2isce!*wEv!0ghq2)PF`
P)Hf)W%5Ğ[(6Úq?fM+ՏQ*<?*D0 ;5܆Z΋Օ:_Z;7gF?'QTԍ3qlk='[!lu0&H\2cvqmgiC>6eYds˦HuqŎ11纅9Ќ'`v* Nϒ̧ 1?
6FGKZ7oE^{Qÿh(:`j_CNߜ:
jD쎥{Tk1?=]IJ,:><w^1=J$67 * ^^]\?|,Z$C(L,(H i.܇YRμd	
bcuKSC35<ttxB6=	+}젒a^yk[1y	֣ҬGP	2|ӹǴ%OÍdFҭZ@7b xhS Z(i UDlfq9a./W+G_MB3ﷅRh${}Iz검#[eՖ3?pC:fNaNT7Fo}ȻX	hIz{+(v밁zRPqNq!
XݯӋנ,:墄4xNWS󹎳ag'∀0;@ej[1Zs`V?l2n6"9xW;m1 *<gӖl&q!mXLdUZؠ1QկĲK\Ⱦݗ>XEf.0́&?ԽΙɫ HׄJ2M388iww$2+pĸk3lC=f,ZYX2酏~_F3_=a+-'-&P_i>!{ |u>wV{ҭf?Km{T@Pǆ*J(h%S}JH)o=Ft 'z#;[zGno0ޞd#~nr xe<a9/uenU*!- \r8,ofq,p]oAuڼJh#Y-gxC[uc~<|YFѺr/<)brG3X=x ̀|g>M3BVߣvI]/s1DqפUu4[5Tz aBJgN~q"Rk3ǰCRSVl2#i%Ib
Xj[44jIY _GKJ#'+ƱJ
@`:@AJ7e7| "`l%&	&	MʹFڐ93l-T)ݬQO"ic V;$Jh`Y/R:СK{>%[IDa6n+>t7Y&Sxub?<4!A6!sC;("4?U BZaM^io@8pQA7˫%mCuME\(}ʗ~id%G_gU1Eo~EĢprQ$̉<gPQ$\oQAWq/]d
|I8(VDaAU%)rQԭ4y\K'mdoO3s]9(/f8YT]r_(p
p718PB>Ɲs~=l29 zŒ,9'y֘,T/Ѩ܂\|9PHRaz V%Y9\$;圥Iߗl ﰅ-I6lb& m΀pJm3L"lhwL[TyukVюTc&UZZ]XZ6y2Zͫ':@kj'z>2f3h=U7}a.?$tШo O'}]]&hҐZ1Z--.*6![<?;!wu`Ct>,W{Ubo*ьhɺF\u5?>-Z`fQ=i>@oϯxRLΪ59[]srvuxt`SC'|Jrr`Z7\hzBjZ< )$e	8-𠜀ʾIXQ	aERb %n	0sHKDB?5T3W]{dꉰ<*6 @S}-ir!L/ngb::vtSOR	4w-{(5J@cWGԂwܒ8̦B	,:e@IHs|LŒ7o\LVw҆اc+fNǦs)YLc7{G(z28;qd<teb /jh'ٮ)=3{e0ae=VruOV^PXmttEXךcc':Kjze**ZZ!P5B^ڌPɎ˘8T3INZcl%Wa /~"8>-܅aCwLv!-YNu§ Hjo}ht9>FP}s 53J~[\GЗSr!
9֢Z_3_-	8v<_R,lZ#\pH]qWuq8]Ug,SKnl[=oNrW\w\*G! nrO)e6_;m "l6)2Β`>pPCx8GHy7y-AX	")ڴ@Sd	GW4qS@3CY
Zx5o*]p9-x9HuachDhSD89O+OU业q2!R՘Rp#0N P{m>$/EU|pt**>nLCb3gTLbe%sor0bBI7D$"\B:@ 7$3p?XW9\42A1ĪHPAG@Gbv<f[a`x8i<@
б/8" À8KC#}.I&d9jz)Qyt
OB%L-|!c^ԭBGZe$_PEavqfP@p).Ĵ#?zF@KKPfW~I$걇nBbkZsoeH!3i8.rbPp} B2$;b01}	c4'*;7|IqX|[ՑszLsr}ϱ!p1kY4T)x/ί'ދE4>цх<㫳hNkc*KjPb<?rĤlpkE4<C*b.(yǗM`AS^dW[TU>yyvr<Wo`"x2P8%MMo@Ik><+v|v8slglJ[9PobiU3g[2)"{e>V5cT(1GZ9t֋( 0УUgLr p,E.y=Ftak"nI.65&*M!ma;vx@T80a\Eޓ=ud98~* 3-XDkB͉@V2-d1L޾99hȕl4hK䢗6$0u4~/_K.~	zN8h j0I_Y	78լ@ߔUCuoJ2iy tHei}2wd7|BKsdWXC3ͧ ç~0ra	eg7sQR6=an9F
qOxKDmf(etg[PˍD蹒߂<6	w6yэR+Ղm@Sa;$dڙ۝ol$ﭚwN[C#Px{rz}чĠmfx.ӨDzg
q1NqHяUd#^`{'>*6Ѕ	8w6"q:7'WSng\y8S7!sOHxF'QM^[6ItϩE4TVyֈv=A(eڛeN5,iP%wi+E[Rso6q^b|@B[JZ4,Wl
cQ]tA-!ql IuN)ٲoq7	SlesMf0X?-J>CDO۞Lpx-+ᜩ`|S@>;^Klx{84+9;'	nøL9bfìu!G#NuAۑ~2!KT,>9\CJĈ.)ͥsO=vBZ&i볫ׇ/qr"D>LQ9Db>#)^#ͫd0J6.uL42X{/IΎӖ3 ZD.p"ѼJWbDfq|<_)D%]bDNbi: ̙y)!UtoŦ6NbfA{Vޝj=	ؓ0(q*Ngb)J=IFI&Qs|L^>io$cg֋jF !:RoJu!m9TN,ZB`§61iw2t32fuFϧ¡-H: k(&tL/N\ഃN9q9qA'E>q0;/^|s{	o#RUoV0o8)(EQ/]?jڪ?+^6.^::<-eg:ݤ@`>1+13Z+YE\G0G`WZM.o\__pvFr#tFnyJ$Q2lexA7ulQeE	Fa_'osZ.;ݵ\ZcXOFb>bX_=
>)6Х.0,vKZ? f?oȞtk07<^׌4`ݧHk\h,~z>||X!xnmc?rug?|;Ƙ=3[aO/ޟyy	3IO`Tsɋj_[Oyrq5{Oyϯ?_L&V6WvQ<=˳kQ^_=2/a/kv(V)8nJyzյi~qz\) $,]ch37$#)Wݼ/x$,Fx[휶
X<VVWَ{4>
A.P<[)PJ> mOO`rȹf1To<( Q6_щYMdlV?6\VW+(**{:LFs5sp=g{qE/ tLEl?3Au9q zq1֋Jr)Z[!!BdhQ;@uihTpuʁh;M2K؀G!Л<T!m揵64sv3v~AM|,jf;BHpPi䘌OZNG>`
@f\sk! E9i
*՚<@yS5 ɯܙ)Խ`LF$nഊƺqppε
ַb 7܀ɼu̼0[ŒCC@_CXIELh["BU0*Ou`95ӵ*#yujg@fsL`'T%N^fwotC~ߦ*CK{,ҮM3ϼxԌ*vid%w6BTj$[:Z+@6^}	w:鹄6XAxȫ`ٽ9Kf$=nCB@Vf$)eZ?AB{hwψM
8oPX$iVY[pW0kBQ)Dǵ{XbP:>{MEad8LH+}r`DTd%=ߊ	Z/G6펇-)$%m|?aD}^A쬊"|tM"(|_=PԠzri)vyRDm'ݏӦ%6C0%{`-n$~uҾPi+U]M5nՒ0U	 A4B>e}wbbZw~diMpuU Wr􀦽u,Mn^nl`'W4Iت!յbS$%t 5
'j!<H/&rmb TXB,:4hnXY5Y/8#Ėf}jsuKMr4ග	[]ѣGpA"T'%e :
kM/`:vAgmiÏQG"Q]y=H?o2 L98BɄggy2+-.N$g5w4):<@n;IbZ^,}f!rQ@R+X@ h1)}3:9qyu+JZ	^w35Wd¬aƾ)l܋jl9z^`\iR暖>uk~t's> Xn??;h#Mj5QNQϽО[vRnX.hKZ]r`@~aKH{?ΫVry-<SÛf|ΘWSl(vfζ6;͂[sƩJ֭"9KKM-JVsIxdgKq \ LrsV,<V#fn#hR	mq):$xk7Gb9nXrI\1*eTH6h06'
;OE
9DXT5+)vͮAgn0'5$7ts0{рAhۼ{51xݍߗ(^m<TU͉k^L+a/#eְc},XbDUȦr @@6PQQҾ:F`IƮ 0UpXul`D}LQB^dK<]H?mG# r(Q΂0SîjE(8mvn"5#+y݉=l?U/&C
*94`((w̖i49b/NYb[&s1NTn~yNB]  p |4 X`ٲh@8$ %`zl(RᱨKߖrXK2wgCe(W.BD>,~~{yu$Ddz0ܦ<+w,'~W,t>AIi ]*Yo˲~smSݐ%GG>nw qDB,}`hI+뵵CL];Z
Or~L%>6(y3nh SB	q!M[8Z4}g08ู`ȅ9`+F[bmΤCԤ48E,,ĹHD#N\*	BK#]P _V{AMQMыHJ%\T Ki1as'P8hz:*}oj{t.iVYl0&2]isXD	,1'ֿHSy"{L
2$̜@ +0L2Gf<
w]=Ì|e6ۄmq&mD?|,n4`buምhA{FXJͲm*Gż53K<%g@5lyy-^EpB=e#Xzt,K&ʱz3t@tz NQ}p KP!gD1sڒpFFv!K8f{RMJI>(e^*F-VeAvFξ,m?w+mx[;;,!NiAϗjStqK\unrz2wh]tyСk􎍈=ҞWO/ǎ]ȹ~"O8(h!)58q&	@R|#@wU,0σAh"'N7ذcvؓȣ2C.]v.NŴS`SNuH11NA$MFv,cqeþa4%vqE,p4iP"C̙<8/l8qGwɎ
6g(7541AOwK
|]0#Ef, 㻑7]dD'hk)|C
YbPl%~0~0b%<(hx`чYˏ5Y*Zo?a9AWW}r"o:QS
b(V	I-..$}R=jUq."#PZ|r*t5J0ه)^̾ϼ(X-
`2L*>G
(q	e9zh:}z#sAQ:hQܢtprGOsN57qBɬ$O[F^N%8'GTJ m3'XuB|
YS)3Xcr1"9#8'7%l?I]wVG9o#aЉx4P̵BIȿupp3̟Q}ʟ)1{횇ܔrn⥂|#&3qT%gXs?{:Q c'(&%ЋV Wgx1#Or x <%3IQ&
۞y)-'+5iVPʟ{Z[ gcY}TX$ޘaZ8231ʓ[}u"2)4i#dmvu `갠}4XN\^MEɿlm&~m{s=Nk#Ь7W^qoS:x{f]rB7ItDPf z:5;*혞<G(%1(#k#!#u/T<z|`^$Xh*=lj--LZЭ"R94"96nh>1}$lvi?0A1TiCGPSQ-=Edޡ"Sc%#]
"C4Ix	v"Enxm^|e;cO<UĥJ/oAːBW73l<	Ïr\=O&PT 9	=ˆPw/s$Og>tV+˴Vy|)f9[w5b-WXzॺrZre{5\5%)Zl-#{%T%g'^?\xlEBpD2%ή`QO$zzH 'oww	"5<$2[E=c#DQI*|~$ؕ90Euwzp\lLXQa{>@&IK~Q,뮺<0c|jVz~2LBL%v|^T^
;zd̢@X8;G$=Gat`<cK}׾V@D哨SLksW1sd=b|С`"@4k$L|m\4mSһFިQĞgP#,e&)3i2TSlsצHQ43Uv9;lXoGAhwMShůȀSWٌ?pDhBV ڿC#N[}GI! "+0 HhTT%:Rζ)go'x|o:w='#[\E׸@[U=rodhC"s>av>[]\޻E9?vL3MAY{%
u(p	²|]pN5	kݠ@]Ni$mVb]q10vX 0Ȑ0-)$VR'2 A>6b3ۻ Ќ)<B1JPߘFn8-$ʒҔŘ"
s]Hs, 9<7~0	(:aA#GLE,SGGb']Pk"{ED@aJ{A(0@D5MM2ĚN3M,d|/àFxiP
/*VvgMEQQk9M,B!NDa|hjuBh,[*l4aYH`3q*=bhV\$cJeZH6@B~ck+uN;)e^ԝP>+TS[wf0}=, -,M't\>fg_GB4(=,`}X*	?c(b[o=x{]P pc'dn('/,*T{{sL:vkuABi*q':%7o-ZVa<m12uޘE@߰F9:q65ZU82>HR2a{Z
GgD%ؚ(i#ր'o_"~2U{]}_q*`iVANU4@ɗ|YGe9CH&	G<br. `Ǫh߰=Im޼Sώd%NB31r-҆^A94T+ F6P7dp1f0WSZp}0s_:לe^(Jrᗉ_Ƨ.}2bRA#[b;w}ng0h8=
aeJJm"Eu{9|&aVio- $;$ShZyd.RtsmyK|VY˜ĳc7S\^"$Y6l waTmY+{K擻{1Edƶ-gI!LT.Ȳa*Wkq%U:%G`4÷&E4:X4c:Qx5~d1fV T<#J `hުIGoz4i%/h֐1Z|r?ƌ>>,!r> rw瓱Ѵ"[0PJ'hDƍoפֿ	S iZ̨_syt &X<X;OZ24$N%
mЏ?_r=?8ioi֜ e~ʴne+/ KL0	1e41 BHs ]tdn;|5_>g`I::kbgt-vLr_e{ĵg1d@ԨJ~l@ޑX ɰHJt< VsuD5{F{{۔l`3g"SU0ϩF`oU`		 [ĶpM,ph+ki:WDEL욆FZom~:-V($PwT@]ޞr \掌ҽIfȨ^l/])PU&Ҫi?RYg9hOٗ'ǐ܍c<kZd[oCe|R늀|qmmmCN$ mþPo!6mKLUDCXJ`M6g#ޓpc)ɉduw*+/^~:燈.9!y
C֡-w%(<}:Dhnڹ"ф` R xOa	ύUVfAˆ{o2x&'HkZd9YZq	ygä??`	 ݒ%eQ{iv8qj
au*QUٌ3  _9_'_O)>B?	49;p2a#:qUTQYqA- r{h(F9A0|-@AM~c@n1VHt*[I^N$;6ayF."	;+pڟ	zpRJ}lSn{g [!+VB~AT!22LYӜdfRȗ[?{Ҳ4=	+躺6?kOQɃc"PI!,\$jn~B?N4t{Q(`3"w'YUK9 i%KbT;o=?ZudÜ+i\ `:z\9r ^\6܁7kYr#2,K%$r"Y;QI0Ycd+ܧ@%Ie$w0GAFe>4`Wrw,dGlH%Ė_o_~wX;-_AB8$SEVXޡ3?,~ZHhJf	xBab3t|?2t`eNeOQ&}>
HvchZo3m'¼k8&?^$x0c5 xrH.B`HHdsuGvw Ǯ^D[
`m\V{iS`X9
`+1r$:!gyOd_>⚂*tw"U9KSz(2Q"1L5d'pI}T)ufda tu2I	;Ѭ̧ǲ)Y:W\w|&.Al!۠.i*B."$!c)?A arz~oPsp LY`b-!]6t`h7zCWtEMryވ16ye4&R%ZdI=ܵRI!$f<1@Ҏo E*s\DT幃t+!w{d1HaVrNd AK9n29@ ?"s(%CVd+Ri'͒RE Ǥ0}P䂠ȭJgA*/ZaR{a0.pѾ~ѱvqtJgyo j6*G(f	h̅.`,/6CW׹9@Q/t|jFcvkz1/?j|IrU^#sW Ab"D#pzt_${vLXւ[߼H);=<-gѢ\r}R)7	Ybf&biDd;u`Oo	U0ho?xbYFa]g?
ZǙuby(T)rB, <@6d\ܢ7S|1290T>DܜF0)8PN(-F뫅5xyo<H_eS#x>In$=!0KZD<Y0&C\
2*xNHh
ލƤRia:Ke7C R+Xڥu 	{lK@	\z0PqgO6.g)&V/VD£h?&Yem Hbb ZHr&>-Y{	9EۇKUGhw©M\w9(|;$8$4<1Ukt&w\bc	9WbLf{Q>$edb~c։/K5^p3n(,F~q%p.SN"PF!4:͡YFrE!?$:nEpF8H?,{./.ߟ]lQ3b )+JS{s6 IX4.<NZc UL!QƕAjS$dRGj^$@7U.'ފ3#)rT7i^DsSv,E%yyU·O{NT⤝DDFIB{r	*iHlcJ".`MCj=h"	LZ`{7VYxY`(0%Gh 1&,-dH¤jq+C@ǳv،$kCn1!t@2
HC2n@/>pX
Pب\x,HJTǕUoC)"@&:פU2"!X#c2鶄B,/
ȁUo  Q֧L/p3)HHF:/e{ oJLhXalİcC#qَi}M;@pQrS*x uD#AfNk~b:KXq|diw7D}25 ųߙ㵅
WS>HN)#i	p]j/"`me쯒Nhey2OtR+G`ag[o$Em}Þy!q4y';Heʥ	gnF}xu-Ixl.<}hwXRSȈfm +5yDvE;|)#,Ϋ{Ǿ:9(P?-! }oi,>܁m>4rȌ3
fm$QD,QɧZ@˜{ pv"؄Y&05E[g8QxX>th0HpM?m:mr-f4 EH5 +eX0T]_%kQekJ2~q%q:$dHjB2ret6epԗ
;DnǠkFKxuȉb͛TU2ß3gOg!~ʇ26У#z8(d*gKʦSli m>]mo!S39VͼpՅ\ _DXTdr<N/G0zSFzfkܞؘ҉ՒUZ'n^e3ʺHMDڑ%^O`jY*
=a򉃵&}s5&kWBy~ֿ#.	]ʩV)CX?`uRxzb%spOy?I5`*@Dua%Tyj(I]ѥh-lܥ}PwW^xQ/j3WsM6MM^H$
XL
EK0u;k.5	c(mBn/$NdguQ)Oy1?>+ܸbCB$	Okge2;!Kph@<@}gZh{Rlw+ 4w&6$N"|uUlb ^|*	-W"vb*̰Is*Ü8QȀÉ`8׫jd访c<4<\$^gZ[cjg]W$~OqQGtTH6ucY|{[aH^cMӰ(*ϭȁS;#OJ^_}x3VFcJm۝.͸z&+ګ)R) o?b[|U*P$9f;~ws'r
)-?51oʌV		goGN~
8Nv*)TVp͔V[N-8ZphQX=e2powFt^9D%8!CP.-àY==@4%Ք\&.aj*Akγ{ȉȩǝ	]-r۰7M)_3L' 65]TjMPZy:VΕ$֗}Њ@5RZn)[ʻ6Q˫XG}+j-0
L9'L
\Âtq%Ei:j9I(>qPfvRzI}%'jlp^	0ia8TbQQR\ChDJa)vF.R:5Mjs w(	Ý(R/@4tkT;vemL5w<,e*c&1NNHA'G#ݗ#	\;6cb9xr,lL`ty-)/PJvt
;zMC8c7à3$QnIWэ2lgbJQ.<	o.~9nJ.tARCsE&6S2觖-5\Moc!{<
 /
 ăr~͑Xq3RvhE]|?]ra!X#Jo^Psvnu'bdӻ0;!X/zocU`,sE*ctHuA6t<d+|!`#Jx-iia"g.Fzb{)Ôb芶2LJd&Mi.9ʏIN?vAJbz`:nENŖ3m0 X]ީT>q|..V}su}x}&	8_%W~Uf=6l 2wegj~yV+P`/6̴l~`KkO>յ5dI3-7̇PC^>[Ld h#(n@ޡfJsQgXѴ.~zJVo: V[x[p!id 
Κ-?)75kA>ٯ8+a6$(BMs_thKYodþZ~t=C N鴿C]v#.mr%zQZ~""j#|DSz1:U0R6nt10̼<j:m&BpQR:@e~B|ٸqYk. MtEƹG v#Ib|EXy-fCBpaCcalG@,к;<uw5!HJB7ZQM/d8&9;iQ<גMšD%14$IBwuoX2k Bab%>;5}zފ/Xǔ^^\9,bDC/l^q)p1~d
V2O
&	ᦻJdSĦӗ)P.l @\[l0r1ӗg{BCmb:1b^cg$GBG{9A/Tع"2񕀇S\ȥT.f?uƥkJ#nN)PPrz8
OBH+VM|2';5?2`:g"={<yuyY(9C!\Nu;̄Qo4ps2)d]	\"ʿ8du^<L>#k`v!<}l;;6OLa0/Vjͽ4+!'	eW1
W:UhDz˜jjҩ3{^Eub$D),5x# ߊ%pp+\7s)0/X;sWFMvޚU46+$s"0dց%α૿<7aEZ'ߘ`k)ȒAeD堯FCAq^wG ;Xkbһ;<ߧ+B$p1Z@hʫ񭷴K7!.ڈtzX@}8@@6 ש+37֛tSm)2|]npmD`v]J(wu3 nGޭБkM3=彣N^ϓ;hJΗd7">PWֲ;vB7esy$11gx{zkv%#Od NItޥĆ`Vf3эioƋd|Zۂm\h<z99WI0Wtڝ g2>O	,	'>rK^ArڝI{hFsaR,{Ӓ}NiRrwۜ㋘RcH3h=PcN`tcഠV7?Q<o.KKII,r)}{m;Z*\Oy pVK.Q,"V6sIIְg˰Z%ȻDSW'Gګ  AoŖm>+3Btyqq:Us'/7gJvb[%4i+ƱJ?$>DEi Ô6cboOKjp+Ӈ<~$iۼTG0n½ۜMUW ?w7)h99<t@ӻ=ɹ`_wц@;v{ٽ<No_][	ŜO÷Òg9 gfh	yP>ON\ YI.xk,"b9u`	ozVO^d}ceK'3jup/CXa+ k	X)naݧ]贲J"nibp6c.[?`#>S,se@nx{s-HȷQֽÚz9Lz`po{<<	Ä.(K-:wYr`gWGq=?;8i&bdP7^~Cn
y.@Yp >7q۹-x_ +owb&U@[CÌ&ÓoOw1z	5ݡ7lXF-fk52<CnaRp"kLi>%QRBglyBW?.m@\"}i5nwU0%[w+Tc){6wTm԰Q6jFۨa5nm԰Q6jFۨa5n_1h~^Q',!-FQ1έrx櫿,pQbŪpOLmQ
n;-90=%xƼ-HSlZo!1cqT(		U)ǎ=2aޑ%s*|yr&V/8K&~A+A3GJ_I`ؔX[-ǌ>/C++ma]߹T7A/]>WǥV{溝c+qcE1610jHS0?69Ȯ-cܡVvgLNEy7bOgԤg΄+0e9gCSv1\@Tɓ崣}7˽)/SG k+sW#zP3@=5RmDj_fcc쮦]aF_N)Z2{P%YAm~agU\`K-E i\/B:~`Jy<\v=Eɐ.jGf`P8&WҰx36j@lQf^9Wp䗳뷇k-ɀ9ԙQ%NhfjHen$CG5rgǽ	¹.&%Cn_НK
.U+KSg0Hsz%pd@7kq
--(ƴMbҪPv6G ȫ~BϦtxd`;=Jvtgܣb)Xk8v2^:_2ށKnڈ!D쳿ݵVA-P.׷פo`l	#1dI@E-]skH{nߦS.fF怷!E| BR5^Z\v[^vHI'`vYŀE(zXcMÍ5PlD!>N52x"G>w(RFY6oʦ˅gWV.}}g2\1m#ZKfIwV*	cSm))nFLBUDm#0g5=!0ʹ*s(^<b9=>nW1*(bnH=1ƉEJFp,Wc>WhTe֢vO&zeIp!Pnc6Jl^.HwU%Ԯfôӹw¯A(cY]-S o5f	gH[Q׼ͧ}`{6@1ilro⻎;^p,:8xZ=F(wXE섨QMT 6cQh(W͊MAUYCqpm+6b^!#ٽcE\MC7)a
-nFyه&>^PuਓGAMPx`|۳W"N'\5#Wͷk6"&D˃׃?Yuyc+>>+0MI5'zYPrEֆdhxnjτPl Qi1Q	:fb{Q%"zVav [bۃoԨ-v˞Ѵ18biUP{?zFRR	nVGޒoj]vcnӫ51լ~|_
wI54-Is$+ZVeĀ^ПFRXKq?1.#pEM(o@*!߰ʱb<$<NN
IsIT	P	MP!6z̢DM	[p9^ lm5s\sHJȜ\v.W#Ёp톎}xK^}PSԙ ^b$ OIE±9@/Q,_Z'9*lϑ~]r{&[<X쾁jNRN
`}'#f;<%FJ5WBCiaEźk)[V|u^zEYb(:YLظo7gF'p0y!O7S6؎kg`?5'N˃pO?cMX7ʇR
R@HBPr=DbPcOycZӐvpWCrH:S\")DY:Z(]Ҥ;]7ȯE wPKFZ&w#έWޗu!ܪ$4՞A~8ҡl6
Q10Z?v`&"s'ǅ"*z	Y==`өfE~7W
"@i'\hʟ*٠M^wLV={`*L:ÈP(WUplmxRgcՎ}	JDX)~l%yLqs_vAwA)Q?4erKfÈ+nM1z,#7.dN}"!{0c%peq)|PR-M![ԼWXOt	%Vbb^rT: ycֵhsqG;0(
9jsB&7iؙkJ3\nx1K쬠$ǈ=taUh0V#S{π=ZFK#lM񬲾mbly(OsP(?Xǉ:i]'/ϮׇL~n7/=IN^5w8i8<7ά]dAGRK l2L(:eTZ8ڍ2̡tbB),+="Må.P"hAZjC1	,[>Ƌ£SXI_cY0
dD^ I8}*
n;LMg^య2>fWImieIa@̪ Kv.4igYCIQ)nVpyy1 XNga%k.*yn(gRqAJz΁p@:IɅtf#c&żV6dDL:#Nd#`jS4NH(
S6wuN5{~f'Uq1wѦZo&|wOܻ;;զ|ݰ::Ht~o֪OOlZݴ7vdԯm{k[ܷ-c`ow?cʸ㚔=ym;SUhXvtycvkLkGSfwW	mzu˖W:j:S7fʸm;]3UFU}t毾aq毾Uu:5~i篾_}xi;͝SחަUmnX\.2'U;S{mG;GcX=rOTOTO6ɱ?ͪ[&}?5?u=!-2zխzZ=]m=^s\9tA}1];몝uuƺ?
`m*X7U7gַuzUs	x-;;ޫ_Q+߷\?lZY?W^nN廩sO7jAͭ?]ߩqMQ۴ti]axr,ݨdcczH78G6mn<:oxc}?jdÿG6'-K7OmAU?thƱƲgo_wuKw}|ϭ]xζU;/̱*jÿcwNo<}9ڑj"w6.O:=s]5g޴߮z^=mP+ߏ켚-kr{U[<uuO7m>=R`f̬Zݩ5,ŭ 3;:e~F]s|nǼ?qq㾻sygWugCJn眾瑫[6ߙ![6nssnj؎֏7-]9Z??ϣMGf6wdP^Ћ]U;O]X<zqzjq̞L8Ǧe֜yx.|?4(鳰Vwd͎j֯oÙeݜww\}&s2	,j]?Z|c}GUD/ډa3Ҳa:s_o
m3|W~ix|u|<{p{۵cbV]7mݓcۗݦshyy}rl<tkvxTݰuT}aߝyow}TX74X}?.c[Zl+*GO~3lD|g:tϢM)}k:njodˎ#!HC)w9,)`34mCh)n@2g>n[}?u^ewj~̅n|W^qSU{*7o676T8xpI6fr56`']7m5Sw)B0376YmrMgco>quN]#h~?a?w<F<Ki~>^8oop9VՏ+749_wsQk`E6U}՚I՞Y'5KΑZ'lksqp|7c'5?m"nw3m |7=a7VOvmptmh#{*0w<h־֌7J͛d	{TZp0e2æJ5	[_5_/hD)תwlT\fD$7w՛r*f9?8h8C]M88O;}L{i4w/7R@> 0RIW98%YIK@|7,li0
Ӥ"1^WmHq|1#"u<{Lz/v7!s pիUy4]LNͫES[LJT˫ 5sC*hݤpJY_ڶ`͍1CGRq怼>'Ti>T;;anF[:>L:^L94}lAz%;[RKd}g>66kXis?z]n`iseƏ]I;K t}ao˒\?O[ngںTW.vo/<ͅ FM8Lu׶}w󱾁ؠac[ـ	ezASASf8+xU۪p---:nmk>
uݪmBO|-X_Acnˍ|oSJ1Cwnݥ h^,@u3^bUb:ΜF؋榴[$[Uب[p{pzu,z0|lVclkATil0w?vi/ώήIpeT۞mնsU~ʷy}׎{N]~w&Wߎ޻Pٯk|U}J{6E}썊D.[ nmɏI鮨~|yj$IK_s<֭o(\"O	,%]!mAt0#h3} _c|N8R?N6IY5}k|.&kٜuu2WLַpo̛@'vxN/Utpd]
՜w,ͅ )9tϱO v%i%?%d>-;4>PhㅁJ`~ʛ	vvgC:1A{zrsׁ"5*}k{k![;m7USlenfDIVMysL~kSeo)dUu%עG7/rpNxQJSڅ4P?v!{)5)(òưR yT:C]3s3HJƝgsDi]E CγY6TO.MB	5G]:81D{1MA'#K,8ޏ0)2D{IT=ZdgE]Aӂw-^{acu)%CmPĸQ6{5I칿Ҙ#nuZ)LCLxRpZ DC]ݽ!8bQǖn3ix}	X-^o¼JǆSإڍIqI,z]]Zp$Mԯ#A~򷓱oS)J-9kU(a<ϟ#?ǭi;Jjr.fB*ДsĹ E`ޠ7 I}pNpA׿[$h+Y[=^-̓:\ҡzxc@LtIWժc3^ݻ;Ѡ>6r6iܦT1NK6B RCUG-F=_n.<ڬ{awb 1_o37M` oDq--DOz8{p67c(7oh70s^077x+=<RnvPƏ>H#wwb9l6jC	' zT#؊uuD۹osN>r8	¯U
qݫ@?0Y>PiZVlwqs⤚vvaAYm[ Ѯ_P</PEZ(qH~4iouJZ@>cSj1/@E5<Qlsv|*z++;c{BNkovm^\;;uP!.^wt jl1a[0f s!6Vm{z0汙]էoۨq;eac(2,%9gF5
a[;;ąŅ~Q\CoxE	r6>q^}qEcӵM=l7vB@Auw~gx]}2GM!i١-M;x4fe x8.2pHa}]C,ƶب#<öHy<28c8w6|pl  9ma;dZ1v[<xcw7iǛՐ1*0<f 9%X+<6aGa72 !@fky>:m\SN:ł.5P>U=Dy׆AMsk*Ԩ	Ruؤ~G*֬*ըm6}Hno#mҦתۈzx:|^aخSgͷMlos(e>vc@'%AUM3pVePf~ mmn|פī@7걹IERJm*CPΈ|j\ulkMTЈ-/Rh1wU.=	g{~j9I]P<O')M׷P0eyՔƤiiXk^Oy}&n }p_-/m-=U߼CinD`BکZJ`o^&q iRUVuJ;D
9WL8e\6u6>0As9c!HyZfpޡAckw:%o(V1h\\@	Ct3g{B@a6W;M|3h"頋sf&{%8("x`V~m+q51fZBW~04ΜI}q7钖C^3E|BV2Ss>anCF9*cu
B^%7iMHrglyEKbJs*V8$Tzh2 xA-q#.㥅^s?G;l7
L#):Qx}0IҠP^+G_>~|̤<yBTA0,Wr'Nc6CE&aH|&#>Nwωz1RIŘѠ9` k76jJ6v6ǭǭ^0**
zr-WY|]+B =jZa.PBIIxS^?i|_?7_7JJ~7 o}aaڃ<blc-(Mlz[^\)<3(fl18N\B/#Z(a[ä	hՇ nѤHجerz#|tl8CC; !M/W0^9չK&a>U ⴰq91B4gI(V?=M?.4g&e[3#a2+0'BSHw+<f9NZInti6po8{p!,_iժ*;:0%Q#$>x*4!޽Ǽ1Hחo??=|u/kӺyH7Wחg?ÿC-nC8.,&0E04	zoL׷7-oJ/
φM8"	4^rKYMJ1˘=h_,zI宄`}읚[dݶ Pt;x+x"M(Cj^D_}$$#Ft,~pN	9q?u5ɮIuEқ8%Uޤcsq7R{#F^ɆhHWGWثnYgTf:?w!Dd;#g!1B߈@eyvѳAqh"bah/`39)Rn҃#%{] szIz7O*L [ВO>7cdvig+,=5{VPڦD coٗrsy?leh'Nɢ2S/ęN ~~ph;!odOH֡iEe<$7Yzx\QOƌ)2VPWu̱T:^qS1đE2,DaKzہr6=<ltl~!}oCl7=ȏ᭤ԶI6PІ*Xty1-4ɣJ/ݶW]wˌD=*GcĖuy<$="2+(D2N	b`u̧ w8O(1҂ų"C7RxCBQ| 8dq5f.Vo_&.'\2c._D4bܴkmid6@)r5O&'Ȝ*l/TVu^cNGaU_}Y
B\7( ƜE(;ZƤSllz$@#yL(Oèpo!%vw2S\ȼcv5i -Kh¾m/]\.mw3$ߣCxj:;#1|VJ<k4OM=ƮQߊT}N$(rfg,bhjK5
E2Q t$!2='*_fC\O~rVWj:'q\v1Z浬Bm 9̓䦡*_%eV[rI2bU̡~\,VKTnoWB@?aH^~5:%!H^k_!`zKN3Y2a4
|DNKcnl(<=yy,JM{ ~0#p"Zl${lWY<PsƼcv伒LSl|Jw;)q6ݘ6)^ONOԼ㖼}F=sҹP33U_z2uN9T.=(V0q-/:4spZW5;H/Eٻ*6<uZ</91wSЕ49h{-bFnvc=`5#`6aC\}^y.|vbށjA3^dR9h6"2$$<꘦?f9<ɨ>u|13H	*q6O`x_y5`%~=))RNVꀘ90sxiowumߗ	r2pB46DostzO9.RGkImAu5P^lԨ>\B
,nP3(D' cJl'QCrJF S9,eo>ZM/B酆Xh8U!+Z^h9IY	ɣoCG((WXb2@ ;X!nzjgwZKǻk?,XLVdq奺U;{*$BpZ=dpʑEx#%Bʏ'&t Tb9:,'ZLڃ:xvgև=HKŚPoo_)qfrr8~A;;nܼ)k;\m  1@RL^#뫹7/D)hxBE9qESe6v:{t7T)D@aiN9Yoʎ:H}oL7ͼN7׀%Ea&XQ$72G&4.n4L_,^_5ϯ<A48\y,?N0aspQ,*zYtjFXX
tuz(O{t	7ZPX%jJ6
6mrdF#&pnؤ|jl!2PLӦ|}>f0ʣw&R@ ?2+ov>p:l1"z+5j"Ebe34Lfṋ*Tf΁.{@9'`j4emD"e|z<['V{ч"^;Py;a$}Ϗ%ğS+|i\< `&7мq(?<%nsJ-W6dW[sԺ4`cijn[lkGlˢ0@	>$ٞG	͆@ICz5)=9N3^TtV;
\0{.@_Ir<h#8x:ߕ%\E^_~UΒ\B8WNm46KH;͕@zǕ1M LPM[d+>RiLv0shW1]ᭀq\o<12ۜ Y\gUs%̳=|>ڪˎ4קWfҹU͘s!:N)xfX('6sd:'h"6I4>yޞZvߐ~Ǜ<I rpҊ;jKR%iWt	ba:4Gy4k]ר+[w$&Aɯ6unσĒ>+~AXRE#|Hwd%{ivzB`!&!4x5pb `̲``*
w8-keœ31m7,fʴJkj4Y2(Ģ!x觤K#g!KPPJ3Cs킓UzΌhf\#h~C_,1mg,hOIR][MNsGgڿƨ౵s~sǩ}|ǧ汙?ud4rz];xE}K.vJiqJo#o'
OZxp6zlwv} EjgY"@-"bV/#Xɽ띢ux!oDWy	>iwD!$LTE3ĉPjϹ4.4%K"gD&dS<L!<<v^@[I%	T{S_9;F*hГ++{<f
X? jʪa.R5xkE:2l5>^P3+~j4v+꾩fVMW:" G$$Vv޵(qCl}~;sX{phʨ;Nc)U=?|rax0s}vqw<+iᵆd
M֫J`v3G.@4ɲEU>MNUrp$P
></lIKeQQvz82r~4 XVORz uZ)1xZ)㒜&WhT2*ޚ/Yuڴ*zCs`cVZӹ={MXts|zo:1z)͘Ǩ)Ls-ЌwYd[i;@5jM\3s{Qٶ'#^Y;{IN.E_W:+9݁F)qzVw0Xŧ6d8s*U[Ӫ@,9IrO_`ݵU5j5W,e+`J,@KopuJ%
^[F&4l~B!{ -3Դ핧+?2姒o+_;YNdO:UZ!_pKԅF(+0---{7noJތ)u3ꎧiUїiWAxV-BMY0ԔgPr,>CavEXF1X"׆0yH[CT;]IХLkLn9ZfNہQzI$8;uvLF	{޿/z}UJ4/њZ~4j4ՅGp.jWǆn!Ʀ80wyv.V{AdQ.)b@Xyy"Q'Ȍ+@* DGAȯO+e_A#0Qr"pNG~9sPڨ* ]-/`ey;X-4Sd>Bn+'rByj 
&=37vql/oզ.݈g}VQ~%?w7,&ۿψdK< $wMkn
+nZi-PSq5޲zj j(P=9k/	ka/wuUU񺳲K|!o!l7V&fEpla
.)RsSVVeꂆ=.y0dOP!>xFJ2K0ZbqLAdz7Nɻ,(o
YOltA D8Xpo9^UeZD":PDwCDcx)_)`7@UY"&_bhrPJ=3J+W×0cܷ>*M|i>	,Pl 	k7IXVGi>{+U_hV3z<Y'>z*bed)>[J/w&q<k<yq(e+Z#&봅>z

t$^A~2wWQfU\ġ@S~I[tÌ*f):	 C"KoN1f$^hzDbd^#{& e"sT.%8GTX3]yAJV;B8]Gk-/[YÞ}=a3ػկ+fYt_;Zz\MFrh_Nz0щWZT%9{57l	:}{j!xk=@UPaϊ@9no ƍ]'js|SzG?w`N5w>6Cx6[}NZ3$XD<y?j'"F1ZZhP:{6]Ù:Sl}&l+0[kS [}Pv;a_,l>$ƙ͂OOsFwduhVjb)oJOa?kJ
7O_T9caG*[hn~W~{HV{9okkk8zW&WqݫTTժFW]A#WoF-\)͋q$`5UF#DK E|)0C
|iT\~V09<[Tw udul4PSC#ɩ⛯`[zD )&t%t7iڜ8Xt'a7 .K4=4~$r!qalK:#rI`DS|oH&:C]sXRCIv0ّ^"컝=4L3߹n;8}QCP\b"=ږ2ON>Æ%B]Q:1fvht`,lCa'P/8'T+=MLq7zHz_,*")O# 0!4sBQ©\"Δnc9nQϡO읹Z\ZAe)8Oq)͹3iw"&XHO;6u}TƉ_S$ؒ#;GE۵ge_a ɘ\\{(SKN@fm8apJ92<Hx}:ylTM?><~|v$ՍNe7Z?e,\KQql,YX.0fY*φݤ׶	CK\<DKC
J3⛄|	%wN"-Rh>)j˭d``-|aVnwOg:
CIqN݄3 ㅞ#/g~S=Q
,Y4V;1-K<Bĉ,@%Z9:Y1 2-t
jf&ט/zAӃ\#63*#飼,*nlݚ}o3{aƤΔ[P+x(!Tɐd+,YfO>(q+/r b#YNMv߮7v)7ej\\.i҇M1[Y%Iv ^O	*&ciy +IM5~+w5F~SWQ3	Qq.ޑcc	`Wْn!
b0X8z3(m8okL$%`Ke\.hSmK~HQ(ߕv#Pϯq,29 b+ЂP87hma|OTYO/턊L7DN`=EMԟ0ˑfv`	>Y48Yi;YuVxUIHI!O}[340;uT1L!
vrK02K7bVc$3^\1`  BVFSx=n.dQ8SfSx55;ކ6DPȮi#@ҿp))#T-egi&Fm27] iT^1pdyopM#b~ "_|sM a~E	xYVvֽqHXAcc@`eaMKGa
 AA&2LCR <ٖu_?yZq~vfzԽg }.лV;^.^Q#CsRjAQ֕σZ8wEգ!9U@"L腚YAL_7f"'ϒG%_>a VGwLq&6Fk,b⑖D
si]:H$s1uj`f]1) 򫻕%4#H>PhXJ,K	W\]%Yrd-~(05f:"8NIQ$Z5xy!o &
R:`3tt
ߏ@pg"
ਣyDH%4'^Ί,EcHq\{OH0*b%<@H!l{^:'^(z u~ &徯"Aipu6sxЉ"lUe/+<A`sǘ'){.|t<ᓸ95-Q_pƚ/`.#ŷM;NMr3?afb1/1@C̓reL!,V$$9qi+k;)ԐqBqxjP"6@9Madְ3@aKZ*j\Ь,JsJ/\2SXt!1IȉhV$y|uz$Otr쮵ŕY4p+Gz~֪c:E棈21:
,U~F#MIm2i3O\?^m<nFk!rEe/3՞?/!c<l(/%p,$=JKhI~O=|ƤDP&C[aNn-iWv)'z˔gCg40\\{TY;EBۨ>)[y[rׯG{:ޚpY1$4h/|(joE5$KqnH4_pmBDԬ$ XCDx`0rSSRޅvo!蕜ᎋ 2^J/IPZ8<GSKtГ^<}2Oxb<*1E~p,$yrKoE8zbF S:n_n|펢PSXS!JIp_E|l=MnjHv)48ݻ%-5?MQh:CJ7R|7kg{J^,hOGop ^i,KD6 >TR`6Kixo0P:!ypq$>g*$^EiGH`"3Hw^Ps*zjS`k(oo>S8g ,bmǎ.6/C@q^	r4ܜK:@>=iD첈.=u"w!d//N		jSN,"Oɟ5N&`~5Buzlo9vN};eh96.L+,(vAƴ,t=#"t ĥKdTEANP>g=M60vѨR V^sy(bU%ЁV) HHi}|y}q)JV?fvq'a΁/CcUeY=
^\7Kz,kplX-HpNDcj/$uzRUNvox L0'=,iF_8 BΧIG+?"4r6tc[MYwtuEBx0󜞄 vc0sF9 5x%1f՛c0s|{5᪹,hoE-s¸?w1ů*ɛP`(m̓׺q>eD]͝[faf^m'Ss2=k""=BDh;2<gݮx]$<tBĸXԫkbEMKUO't,'pϕ'5ɯ4hNn=aM^߅ҭ4=tMvbsZB1A|-'ϯ2yg
*熆՚BV"^sedq^u8mP2}xk"a❈G9PgWWkȆj$(Ny&VJGX\=XBQ, mL}9h(Hj4g#WZp\3|-dBe%''N@K3a60xgWG;2sx7
@v4W!>Nl%!M%>|5-(iy+{0ǟ-z|UTpg
q83V<btT-#."3TvMBR=4k܁q'8|}JJ `Όr3lx䰌?fۆ{73rRT3b(0*2)Z`Y	a,0ڛt3E~$|rudu  zGK8H~и^w.l5{x $o&Nn}1n5"Ř26ʳ*.sq碝ZJQxi.>?rS],v
S2RcK];,jXd^NWw,jx>?5["γVTg06ΧXJaY,ǀ}''<<i0=DtFff"@)bmLKAЦJiś~Xw'.JC+ZNL 6g.kl3	SAHA\<IȬHC\B|\1P8^J^gzçCq+]h`k6hr^+-۵L9ZJfl.oF<A7{e{ъ5T.X>yݟ@<}Ы-"c L u:FrjP)RAzX`Ro1*>U4clfɱ{{y.bj6U)z RK#?!tճki#ŧNCGhЮVb(atfJM-K~y '5mД%(
hu8fUToyه5sܳ[W_pzxr̈́jr_LfX+2YehIuX޹Hkrp, ?8~lG&p:\y<UfjOtʽYU覐r23|^}h7
'<(і].DXaj4?  lUt3ǧo@0;6Csk#EVvg?ϣ*LmxPϞ+FJi4?"/ )j7|zZ*y!_f/\X!q1NdCo=|-e^l~SvҹYʜzsy!{A<äJ*l$s{DSE,զ*/=0#!;X̳rE<?;
Tu'؊TsS~`uo׎A{>Оu<LF6(~踀VNBʘiҴEUӈ@,&ſ_@Osos>rM)4O0"SޒIO
7֜Ipj`8 aIC\$)h ut
Gꓕζ,kӎ?v:c%S2$DP}2@h-GKq94z:MI9Y(f7ճ
o6"/R
1AV 
|g|v͵q!`Wga7a8ׁ˝xn=;:xgεm?+qJ4;]~oD/o%ʓHy0oLAc iסNd٧HTnf\3gNUs	Stˮ	<N(DH8(!PH)dVxhs5e7/=s#c[n6MNg)4#ţϡbߕS]nP>z,4^L~Ji[P/ݒHl@s%˥)rp6gy9!PE=pEAP·01?$Q8N_>*q Px()xP廄%Brпز6J[HHL[ʼ!7 5ٱ6ѱ(g,Z*i{.V?﯄;~&T@XU,ןF՘0ɺ H?'0V_ogkv}p|^̻[*C)vNX?ty`M_zSBP-m'7-OLyjxXz&V0}{@ItﭙZ ׯDy.F~j@q+^@A)JE#KKPNi֑nBo=F!W4mey)d?p.͸iEHD깠:B&ȱtax?~=Qq1ǵpݟ
F̟:w=\s+Yޚ39OxWE/Er1Bi&<{99rj!MJŲ#;jVbVu3|.HL?n@,?Cz!ec;="a6W\\ׂ(xkkR7(O_,! 
9k鵲.K7B3JNC)KnǙ@dIАBGI#tt%)(ʁ0GŬ9:MdHRv+KH?OM;.;Υnl)(cNAzjG3
5K_Ņp3="m_ߩ7jHbcJ,)ap&UY؅<i2Јl򛠊%اp
)g	Lo
tn{
B{YbA̵bO	`}]l998WׇG?^Pcca$Oxbpw9~d[/`u`l=C@Ӵy<S[Mb[6e{f&0wsn+04,*L{#oJ{:Jftgf19
X&Cs	=Q|R┢u?ꍀ["KGP;	J\0%$o/3Χ TH6"ג4hQX{E3\lR.v(78ފC24{ s&pZHrJ6ZD~WTrh=ґ<.粑>t_̗'A_TuaK֝<=yx5T#kׂ@x|=x~x}Nh6Ǆ-i+Wm/}<2Wk,V0a 	.//.̈́Li$ѵ@I3XiȬ?iM3g= c)FNm1uk-?i'x4Q̦:`$ eJoyxLJKf_*Hz*@+P+[tPb9'/NN!e	)ٛ$9eWyMA+FȰ/^7_)f7% +Pua/fޟ_x{e9n$93<֜tF-&7I#{vZ;ۀ֯t0v=Q3nZ^w{A7S~"e#b~NEASG`lw|57p)?r~-k(=KՂRr.-\m4WpADݦ_Qh76$aOQfd$AXvkp_B*pBҨ$=ߌ[fdV$={yjzTy{ 1_"CSڣY>fÁF$CҘ"pIPӽ7@DKJh6wJ<{#*%QdwڧNbUv[|*3<{ zaQJ>	wtG9F(QND?lz+,ۣbǸ{j!X9:Zp'ۚVe`Hxtqx#g/~B6*	5,R	eE4lauLi%i,)|KZj}\=+Hiߡۅ6ۺ	ՙr֡3TI4,q$!V$
5#g(K>H)!
P|8+5Kv	籛:"<y^BANfA0 B7RZyg~HF:aA%( $KĉJs	40 v%
ME	A?mN2ǴJ,k1n>AOv HPp'H5kJOžbyE3M,{	2=D6!u4j$Ճ%r'b4Td1ço"t&],ڊuvZKʒGdDx8Sw-{=A^9}ym*!(!{ȭDWRl&@lzYƒl=U(Ӳ
]LLY6ԅw[vz /
^hj"{,Bw@E⨃TO_:m&P^jlHlpzkvBk}eH+*bKy-ԇbU:P 4FK	ۈxS]BE2gpaJ5"x	xaS=(S~ߑR
Wr$ajnt}HJߢHg\9A:oQ<,YOݵt
on tSzLfq{/<D'ڢсY}ΐUvTVuWcw#jQEe!7Ѹ1T CWa iQkVU_yB
92J^PuxphAoaVQS8g#}+
q={1̲QQph#)p,Ta ʼ-AC>lj<3zU=E}!tK&mvkS֗v(ЙEbE+ۅ|"1J)()8ƄN]iR5U:lzV*f\bd:JMY@60(?c[	@OLG1s#j4٬)h(*!OHUsyA	gV-)ڗp @mzaj:d\0p)e>o:2Wi~3OL#0$sNXq/kCB
Ō<9*}i>0o3@-$|b IQ︪M `uH͓?j]7&:mr?tg&XVL8Gٮ:&xFY8%l%q6[yj0p<y4wS=H/+3Re9yX$Ão_2Nn*60;\"BXŦ0k,82"Nvv ^󌢽]Ϯ"s4Īo_~>?:<9=;8<=U%*Fs4":y]z\R? 3aѭ;G+M:	$3g Mb}7mYޱ;gc-ԧo2Wg&8y͒봐x$Tb|^<|[ZRn!A˝:".mZn+z(̉[SW̕sVsJL;F[v_V-C:%Y?h0|8ʖ"MFٵ_aB|#D>HqcɪZIC#qy9v?%nն(`聼C52Pr Q-'d$ױpPrSrkmVЏD<4Z((>YkD]h8T+
=hfӷťeL"lL_H{RѱfŪwgW{fj%m0_r~~^3pQrX%v;|xN0-jU5Upryiu/r  5uy5Tڛ'a_Rms<.GX*sR9"8;oW2PhIDCuyH-x-"W6^E;`V[X3dX3UK$zL+iS5&_p-iRa-Mˣ "^ F#3:|K?(ti61BrYX4+iE_֊wb!+ȵō{Rt|_7?OFǿD6ªꢭ>kWI-(!xlaiEzpyI7'
JcRh`Fq
?˳FR%\YV)JXvvWWj;x<5*,{K^B+4j_8i[Ɗ<sԑ`|}fǶ*F>k-{nxO{0Q/=煮#ӖG>.(1crpP
'a){w|#8I,P+T6,?I4%RFIo\	;LKNz#RbnMU"-x6FV4	++WܱAL"qVm7_~7VP!J.H#ǫ3@˾9R&NW|<Swj"uَU)/URNW`g#	:RΪ0mtvm<ZS`
/{/޿/𴈯	&nHv).H$ik
g b ![\زPNi?S:/CHB/ǻkЌӓ}fz1_}/G뛄,Ew[F.K  x@S.JJ]d|YztGzp HX7lPڞ懺f@P!<|mxՁTWlU:.w92`tsJ%X:}[>p#Is?y\q{	QuŤIz@ĵ]}@E!<"/r3SXԝvrMfl0sC{O`Wّi~qf|CJS0@îd]}46;;Q`tsN"]>mz܎琕rPtY%2f0Sya0kK*+G@364HQfgM_0yP`p?&dql
L@E\~	\E21<Gz	jlIpDetDiL FW)=n±N_sGmW	ͧ:]Wx$#A33aؿd2,Y$xauт2pU"Ň"4k6]#wRg<"4#Jl@	=iՃ[8M&e2 Vqb.{ǿ$A	If!*a}Z5
oKUd0:[`37]h_`BM[GkfW5-q?OgJB*(`0u6qz#h	'`ilif@&aFYly0a7.C&Vl"(V_sYTzop8PaI;dsOrpPv5ݶ(YDE@n02N7C`aR}	@d6piL?ZO`ҮI
[Q^)E0Ms~DdM -RHj<.imE"0 KaL+c䃜S
p"`#ޖl?]/NW)Ncc.n aIG6,l*OKY,ke:s~2֓*ǘ2~!a^ƢXy.0\aA#$Vpg807|80oTIBpЊ3&,/{ώO{J쬗bqB+I?pn:Δ$&>L͑չ.3]՜lv:Rh07dɷzLe"97 )(2fA7;@,ƀ>Q,npGĎV&0{o޼6 V;]tPϴ/djN7YMaHl3kwpR莡7.T80 '
w{k}rZxg
}7B9;{;lBEޛ~9\[kH*mPD}yh6*ۮ?&uw<AԹCf	ޛA>TTQE̎VڟM1=&mS4M%XHɌ|8xKwlˡ]V+3(~(NoA7˾W)kJO477oF5ߍmGljV2X̮!YL;{˃t9$ܰt hﰝM~57uH3!a؛o&ٰi |LLZIwٙfA#8ƐL}+paΤoݴ>?gH"=N~89^?-E"+{4<fհj|RPJaNk?CE@|</E@sOE3[/Ҳ>2@ػmn/O!ܪ&NU>@Yvęhe CTCEje7ܔf<yݟuV>ÈsSܤђ,} Zȱ7rq%n"bsk[E]GbA4O7^WQgLpmb'VuG@V,`qoVӃSv]6Ez!<>vpR74="G!͵;H4(N@7U8.4"dOѻ7&ǳù?`؏asdBjN}<'@TB|L uy</WKm/gΒB}p IL40T, VIn^̋x/d<n˃<7A0ܓ׽":=ċ^
c(6" PUgU-iUH'9G?Kf}ELi0ڕTh_Sl</PDR 2$9NPI2c|r;Ng.3u}S7F!Y!-aF&nM &(]\I``>fxŞ:\Sr@aj1y	Y2=?TBj	qoDJv:%h_#xxssBd?9 !(,',cD1]f<DfA+pc}D԰J@k@zUo_,LyU-uM^}mǰ;q|n(l8(,vVnוKߚYRU(QxU5)6;~$=>娆en#6/nHJŗ 7 q<CzRKyN:{zQp067Y>ZJ82wu\0I:0 R\ϧiVVT Yҫ	oPȊ;>x Xqsν5rwq6urhd%'ԑi;,|' ">~dF }jZ8ݤ]=E	`L7y+%d\3wYXJ 1"kP9R
5$g2xiR<Qrvۢ{S&,kqvHcd
P)\F\Xvl@Z ~kh.-nDsA*%.Qi'o<ŔPcV#r!Zr	d[^\Ĺ/ST6VA1:2'/:']yw|旳N8x}18Ùq>l2)(*iȾ9ayW$B3U:z"ĺ%xoo<Kd摬0608Җ~4T=Qܸ96H0."x{p{6tR3V0|RO<x@9OJ	nYJozu
٨"a*c3?ڝ'nɓg$h ^(qO&c9O.u}a}df$@8U?r[	O,rJ`M%ZM>i(Mclv`؃ բE[Gޝ`ı%}qnYi8~'ԥf.IZ9z(VNJ*_1(4%4ۡiQf{?N#!'%Z?pIJgWdYάݻD+N((h *+ã		3z骤Q-RGޫl&3~PZ1Hѭb(U?LCP/wYKuk:,H1v`RE a@]D.Z.bA|ć7%M<lA'ITx#/?ITv+`پ莔{I>ɥ_aQy1Vf1*%5'ѫ'GհF)xTZn0K,G	T~B)+IJ<)w	dv:4u׎ WlKDK1zhW~TNHF4#!V'56/|/VSnJe'?7V9>N)2'{ezxP2<2T
+I9Jd2C|Z;T6k"V-e-K5uي4:>l%62S74ѨN*{]M%w䢞<_VV^_PjLwkIwࣤL689@Amc$G
A14(>6<m܀%AE
<5_Ո؃i Ђ@ƕj|5\0a!jPX;6;+ܰ[I=
#ؼy%DHS.E].Z`</#%w8 %}bvk_>P_pFp'u+&Yt-Ad$[=-)]n38YY>)Td	st<Ϭ=1@E9!p	؝1Ypp\$7o$5jInP9 yxsCyY" $n]$~_.@a7L%-}T?|Rhx})Q"G_;0umDudc#lP|Tx̧2g6(7إ-_8TMl96'rU&ɃaDP'C\KP(:͆j?=G]믝(d(JytsA^祏3:LY AEG֐kci;^713g5R~?bm5; *9tnQS+s	ۇҾ!=c*QDCЬ;Q <+ȊE^qM8IһI3ĭbA72h5>HHxH䤞O'lq^L\<Nc/ТN5*EUyLnFg_:ؔ<I!R=	F>w%{0"rѺUr[3{#؁&QL#2%<?24p'bzAi~d8xHF֥99"V-+6Fab9Sa1o?M5|Vq
]Q$wQZe	[l߇ ;PؘNrb Ś?8GG/l=6GqM=Ij¨|p*VV'ؘ߇=EiFј\eY~}bLiM{pG1tX -CzJBD~(IKg$Vn`0tLNhvs*] Z#y،g99Q>|v$98A#CHzzr\X(M<fݎ<{gMj(1P7}kly)RK7nр!|j8rqAm03TQs<&.=a/A8KpOyhDOI"b@jsRGnrvwv|5@xcm005oa>T 뗑__bsFp?ے1
h:LQïۓ͔ 6,wӪr^rgoOpޗMD=ps~.M{4J݌(u:9ǣ*I4H%Q/l5*T98rvzBup>3@%jg5D<ٔ=R=Xg]RGM
K:,%΀9*q)KG}^M^t=6MoͶߜ0#(ĩ|@+"K?<5ً_N{G/{6hg3RdAyB1Mxcxp)8;ǀo~Y"LWT1Dg(֠! m7xbnwϝT,ѯLK=Û%VnSHϣ5NNrb*bC^Ԇ#P"~KkLu[ZC(.P3;!Y'$k	TsL0M 3γ:Ǽ*_PT%;ItkzLfem&9DO^|-ۅ\;[S'ݹQ3|gJ5lEHvͅfS譳shc
|<Z>m-ivjP>N;;I G6i?-ЛYJ-cvoOU@7*)	flmhZ7wkF\*/a=WV;og7O6KoxMAy;7Oc{j0YX:O48cA6
Z14'H=Yp>ͿdۺƜ_IM(^-53`+LC9<1]eFse w@ṣ̌b\HfyV QGomH=%$Mb`lw[j#']pxTKQ%>=-^h{*}4JOEWftqQww4|<v`ԟ^2)!yRQ$N#	^l.h0wm~@\NA3cPQGpA7e#o`(GՆ|FI{euG^XT;+7diDSJƤ7^9Q(VoASPf5^uzܷT8|U܅|>&R4th .@OiǤMNH}6Š	/.+M.*5=6Qs7&L'}ha! umʙ6Q2[K6K77XaƞKZ+5[ςuoXuAqyP7&6]=1j$T7- 6KwBg!K 9ԓ˟ 2<]@~9u^
/ә}uf 03f1Z4 =kpDEۘt0ɹ0^DtUXf#	5JQ׽%;/	F:,NUOm
ZI..k.}Il&;s>w	sJ)1]tXoƎ6$ފ`ɓpsqrn[OkӦp0WNՃ{tNC
2)0K<ó>d/5W<!>|TMo OTZ+V۠%uu!pyCXasKFf`GfgL"JEG1`2EΊ!B8&!䆥3|댄|qsi<z@H08:tҡA.v.CVyE#5 )j0
׀`WC%yiKPXC\f-SwK͖&!B@} :ܪ.D4ĺ0=, ?mBуv>elo16# ;DX!(8aȸP!* ɦ(g0%<`n&'nٙ҆-'../W|yTEp@yKRzX eģMܡ1*ʳ$Hd"S+Y`KnxXdA߲阵 0*9 STlVAq@DO1LQۀ /rDTX5ĕyWdKJm{* 5vC?]4#VTɸ1q/is"2^
1NӌĲBJc	w$]"2o4$m0[+Ylyhr.!,b8QԍZԞjĳQ˟]^cW:NGX/ٔD ݀?,AX!'H&P0*r锃i dز;iA6>L(
/2"q4X*՛>wEuQs)%v|`:g%:E~S|BK`""=M)cPhci$[DynyHI
}Ӕb< ȯ
X((ϟl&zoV0S5h,iAq-t{Ͷ
ׄ[ME
g#	V_Ȟ!D`Σ#2Y<C1u~D͸*de};#_]>9#E=H@%vqoӛ8ho  Waފ(D^3o2f֠|-<#XQT}#ְBvϏf 0|Ee2r$z_U]TiU	#p-bq-ʰnv+yW9(	Xw&2!~ (f٤6ZߘkJR N=>O,Ǝ%W b9~9݉]dY-٢y\H _	RN6\]aKw=#6|&}UZ3<j֡.NV|$g]J=b*bA]ɺxGFO4mW<'DwY29"Hxdnu#?MPt	!UnջBRݕ4]I 8_q( !
| zx6pFw#͠"P`Z|e0@2"[iFC%V25uԛ,1X=J} 
<AD~p. ;ݼ}A`H^**)D+y7)NHIN:e
-8nY#i09t^i]*?!2pQC&f8υ|XP%'ڲEKZn@o'Dm>RGOtGm)F}Kmn~t0(aJv:;Oi)N8@b-r'7(h7u{1QQrށY{Цa8N/wF_S@giQ_kўhּd;0{tzُu<XKO0O~Mbs:[h[A	H&:_W6-qf>F	b}ggU/VhbLWrТοO\T.GXra'|\K쌲ڶ"
e~/O څke1Ғ.Ң6[jͯVTeX++;VlZ̒ڋ<BCEe^c#W#C9uzx֯?3]9*R3lZP-Z B8/qjeA\X,LF3G''eD+Qbe7Y3yvvә[KT&Y1*aÂ=vL6/.ي+0tTet<mI$6CS[\..8Sh XBG%Ch]ցȖ&]XhHtvjZq%6F|36c&'+Pڮw1`7?z_TsyJh.H!ɦɡ;ԨyF}E*K,ċasנl+G3(H$Fކճn}ʜq+2`xuHa#ٴV?zsX+k
tއ+2&`--As5St͞+c5Sc{y>xEt73[!ڽF7p%&6E rxwT`l\pD^|uӃmu/ئ+,J+((t80;I\U*3,:In5%F["K%Qk	"#?_ظLMJ't
N"/32/g8HF$gRi  R#ߧ 3]H Q.<+803	4 M_<`ڠ?DJ-N3eӼOo0z`$rֺhYiߏg#5<L&`IHU7-YR2;wی\f.Itp>[9Di6~[xfWKg4I3]dZ0ѵ+..fΎOԆ RkR̇l<b1@d͓xGR#q_>,?jFu07uDZRPf#_bQDI^BrꙋL7UiPJ!bVqs)0g
N&G%P.1fמʱ*}ք~5>)PɤqKgSN@֙ʌVy>]Z+Uk/L+\Si8佱=4	օK-	M
V)C7NIt*oiL''6$2xhTO3l-hh7w%O|}`
Ǟ8goi8\3@;:?ȝ$7{ZsiFon=^@@kng+jw|;OOcm?l{ӯݝn$mݩm3i^NPl԰$ݾKۈuMu[3][3][sŶ+fmWlwmۮؚښ]5suFKF-ԽEUEՙE{n[V8ڧrp*,yEQ!)ř`Kyv\5MtTs.v]BP]X*KVUe<Rt07w<Jթ;vv w<;̦Ƙq+Y-1n͚+E?Q<0J.ep˦Ӂ"E*Ï=9{|#exeNՁ$Ǫ-`@ 3 #l0"΀ %͊k'k{>c|)s܌hC@5AkǗO侀Ă%: (@z-l/A;M4*~Cb{tZzǇ\#HXRz
k@BaK6Ʈ?'0ǴGae%}};H|.s{I1gk>lUiS..9z<q];ZUu,Nx©~{^ztl@lkV]VfuA-q)rs'xKݫql,QCǐ0
{>lAmPД$ss`mnXhʛW}7g
%c UfxRg3uU&D6M䏽WY7d~{.˝>[VF^n_{mޱ^ۻ$mF"y:M0oΧXfGK1gniZ=ڐ/6CϱZāmMg,nX\#0jQ
Flg1T8k,7E;A9+މEtpMyƜnPO0+
hp)vlIAK1j1iI˚fIZ5o~qQZIGCUdWmw=4`%ve
y] "E>-$֍Mu߰x!.3H,4U: ,Mu.)d!6)5'MfxCMqz_ׂPIFj)I8S0~ǋK قuAQ;|bhkLxrS2Ď5؟:8Qqi |<jUx' #׸Ry5z
&/XNvn# B	Howc	$^$½|XVqYMu:	90@b
kAΧDk^Oן5GOL o0vgMe^?>9:Ml̼?XR=sr{/ƟՄĕpO8l/ص9^Xay(}hl lz |H^T=cWY󌅣Va*_.p$jdAɅxPsP'6s/m_MQ.:sg~sE /z2od	hEZ@9/1KV *%_}7/>B(:1Gu#{q<3ϳy|oFX1&aVvg
=# 蟷ӄKgppQeG 7O1,i(_u]hTCMUPf$p@	qQ9L``Ե"3s7$f㷨-O(}PQ;xtNE/VxnZ~jصg,J:r'0a̛ԑ~?髢O.+5zVdi^:Hܽa$i0c|h|X풁t1cs7apC7أ*ɣp
WGs`eߖ¤?va2`NG)yג%oidTX6Fk:{9>6ZXۉВ_]k}׿VF'x3>ٴԙG-$ᔂuҰIDALy-h!KRسF}`,e=uÅ`EhV"Q(3w '#)!>@NZ7Ogܿ4Oq_N2@;#9M|W?F5qaѺLEʛv%J(F2fM n7"1]>ac&keK?x"JnqKUKnʼ:rO'?W!~xQ		&;>:xQ8=Z|66SiDs,ZfթeoUT߻q^oC' :'
mI2eWpOiKO1Qpě*|'$=jPI$,M­ot;#g ٻټ(47/Tbf`L!܀Y4ApY{}VO~~r!Smչ6#%sSbHx4s( J*93剥u]źM=Oۨ"ɮ&D;L{9#WbAR(.'e1+dU:2*\ADAʦ3/#RutxkQZѠ/M~8L~wk	ft8؝-I!ۈx0+$ӖO+tZD/|bkQ#*{HR6SZr;,=;153.?uegcTԳGqZ,ge%#nKaɦa~!EB	x=t+[k~lȞt96f ǂ~= W":8rR6g
)vZFhPH6]l+<'\z~գc<f`?I܎ԓsō W%&w͓j1za%JY/%ˍdL`º^ANiWYT)S'髽*bJd
[D&xq0₀O>9@w+RUȥ5ZŰ73?.JgULX/~-mO|!x³o~@J2Lsr`)GWcLVѭӂU$۩e(Yihbm!<8RKBQt[Fǚ1@\6Zce?ίQ\J46e?ahl.jˑi] u^"1geǞY;(#艩$H8~pX6PAL&ezkߏ0]lu"|iօ=ߵx^C-d><bo;?
<a/Ov2@se+X&QTyZ)|C
 u'V߅S:jqOTx:ԧkޏ^`"dq;h;MÔRH89(iC#gISL As^?!*"yLZ $NG2dc]<E2	 Mm 5ƔƅAq&l#T]c  `C/K
tYGqV4T	U=x0]%K9)ƄUk*t)Vg3xO{Rz!tv^x{LΉ,*oBr	||⮖ht$_E
mp jΰ솓h+џ.2g-)ZZ%̓@p}$#սDT͏pƓlc?>.k/NoBͷM/z8>oP&mw^9zSO$P$T){By +N836cpֽN+w||t$WP
.AiHGЪ!饊1!HH,`-,U/ݨ?2NQ&bգ9Mqt	tsޒ]:M\)
AT`b(}"i^`ěiCx'ga( pMU>#Pi}rʷ0NfS?P0bSv7^3&K`ܠbdq͛P_;QVu':`>sBU#;E	Y5P.!/-ͻ>b-#H6{ }p<< L켩gnN-a!g(DryFHԉ=k-jJ8(1M,WC]'% #sM̼N^|k^	e՛SM0+ŭpepy%`z<q#d$bv8K-~92W1a7-q:ஓ,tW4_ w|Z҃DAP;ZiIAT_X{룢;&7G`pMCmɉ ~˜YbJg1k7)W@=^LAG0`]y"i2q6軥3HP@UB		$*uG!2!8F7&'@X" QI(ϦwCsSuF͒=(gYY&D>dpqNh"wrデduݼP\b27zL?1d-ӄ,p Qkۦt A$FB\=;HE>A|g}L`4N-<~)qd'jj:	 kV6E(ۮ(g'wUk,P:[Gw8L݌Ob9ꔍfOfVԷs5,X֧8x	_,<D)@{b֎)+A
k$¹[&(	JsPN;jH,@	nG>Q*r$O M~
NɵH(B"&~3fO?V.>WL6bjWp1v&*pb7Bĥ%7,VEVPU^GS%Xs3$C.Lda6:trF P9GHDb;~VdyiĢJ턙l85&L|p9M73o*(n+*hf8tU6ƴҵ HUtuH82at8pƐR8H 0Z!Y.Ddɛt<5f2F$qFJ`
5SH/_?X]>I'٬PGL]
g~Pr7Gl4/rgqÍii2E.ƆU.N<F	^kT9ټyNjݎ~1^wpʾ2ݻ]]yRU3zMyJ-}N_1 kma茏T4.f v}>lhEͮ5ycOg:ۊ ܠȹZ,QFEvVw8^IQHŬVBpt<JOaY~A_@}kR-`?hBoDT<{devrYp򣺕GRL2Byt<ʜwd0,n>XXy~$d
bwHU|8 `,GD ?|h@;xy	d\7K5}_Ua2Sϕ
Pwxl߬)%8M`ۊˁ̢=<l׽!QK~ՠ9*Lk9hЀٽvlE3/vƁF"yG`(.#[' O;#?#:r ?}в7)_je@^i$l>ݑUny`[>2!EJ-cjVE"hAE"Ai2GibhqL5Znqz!?c`"=Kj@!pph}fD8lm"($SjL+I	c|-*1х30,F'd_7\zС.PdNfxJ=2:}!gF#h*WeB Sy}zg Tyӻ;ROܽ'K=y}z=@vƴA >QWףG{1rjJ(y"f`?^١O=6{Gyg{	Oǯ!	0TԚGt$7ZHhՉ!Q@@0hiHdwכjV#cik3ٰc4G%D.as_e#Hl0Ze3eƤ@=AJQ!	tT=ҔRܸm#Tv%+XRݎbNX;s>eN.($I6t?=	uz`z懕z85ս3ਖ਼r*nPQOC[BxBTC؊B|ЎB&\%~ܯ66Gy.gH#)cW(J+AᇷNY,3+cS\瑙͗a {g&oM.֐'ZQSұSK")Ilfk.rRʢi?;*h;91sDra-|08@۟ds"Ϝ$cf{HU$$/$I^5
>OF菿 {1:l۸\
 AAÐJA)8u^aq=E-ۄ=xit;:#i76J.`N=,0gi/2`OG7+{$sU̹b^ͼynuz5:%%+5 MD	X_ &Z1m[a>k4$-LLYQC;ǠqJVő91tR@Af?ߚ
O	J恋Ŕ-8O>1ڃܴݕO>rsso-0ލ xx)o:;7^<L}7Ӽi_Y(W*.S]Ȧ}h:H]z>JG>3$%'s"aqMx8Ѷ̣
-	\ʉ}nDF6USjD2?d`uǢWp1+3:UY>~ILɓ2c:"*,3d^P-),><UAqY#v,^G#Ca=Bm:R_=)^!9,	"zёr:B$.h# lfCA%>
C&;OK
"q
@,,mqUIĶ.&PU5*#K\#x):wR]Е|ߟ8sḻ'5?Ygݮ{h;˼27(6Rv?sz{F0ي;Yft]]ݹRԤH(TJ%gEe#>+ضC!V$.P+棃RNBOF{3I "a(HKoAkP	C`99HaJ,4CvX!Z	<O$W\9	
9Rf%/RӪ%R64wۛ-o,WPRv;)){JR2KEP%:xkM*r6B5xv{4 p?Ey*Lq ɵ{FZW<W%xBf. 9&x,-rJGQUku!ܫ仱⚫p
W)$3kRQRzʜJBs+ͨlvlrւ)(XqJmi-[ĥx*xVt C--Iz aӗo>
FThM	125IF0jKqrc Vk/kPٮSFXd3!K$7G8J~M.eW5e8WcLؖݤBb~%4l>g㧛ؒG$[P);}P껖)ׁ+
!	t&wD!,@d<xg;hz	ц3.OL2_D5ag淤^oPm
B~Ɠj~<uA.7B+<¸˰{r-~,_XzGj^/ DacbG7V뱸
2, Dvh <ów.թ=`*#F4_b\t?hMO5x,Cw<f\DWQ*Z@uW̘҈4Ҩ"=wZ*{8QxrSTp&\c͈l(܄V"Գ;,ӧfj=*X& .U)	\uJw ^?MrPّqm`j~qqL٠60p=ra\7X0yQ2OQAWHSɬ_Y8tV~p{!<N Sgx_0s.H#;++u	!Y薯)3[{WЭd"]Esƥl_q>ۓ]߈v[.rTmGª-׺ϼ	+C]D]d|oK:SJr216%Yrء'e
6!M^o9Vp궍4Nump^G۷b|AfF&~Ԯoߨ?Pw]2RaKARVYsa|TUC~eRuCv3yʄ_yzXC<8i^UlF,mejc.ԧ;0ӈ^eq4&tcrړPev5f_#-xOڻgoRb4DRoE6?| D dÁϟwx7g,iwJ∨zP?QuJu؂Uzt3UQΈRIE"H4x!wsGXn;V-gj38$N>Ctْ֔s-	?w!
ra8,aA/o>nw)`+6:Vp-bNmMMQ=<ωQ[3J2`ʕes"QK(;}:pZ5iIFoI1[8a@/Kh7tr`m$1yZz2ީ4+Uøh=0]!->AO 6zƙt( N''v0oRP562mtLRkpF:y͞ac!cJO4=<LJU[Zk(xPү8Uq!K}lNxY~ֹ9~[x5iI;b%:'!<9C0OHf"5f+#܏;<fĲJ6W)!,a1 /	tl<V413f<K({
^*NW"={qD30WUg?0福\kuT`uD3LreQ8Re>:>49Ok:g# :HG
 q?lG]*so"{O${-6TcCAHk$ϱ/m
tIJ8L!=s`& 
}p>6XYh~u(Q&
	)Sf!/PJT0@) '2e):_+y1)?3C6I	=-v0"tLQdݮ-x&NnZQAgyd4m&
m،U\,_2-[v,{DQZi\ֆޏ|I?fpAJ֕^Ene6>γd2@5E!GYV,Bab̛̅xykU70^0D:<_A>,jn)ѨRE<4%y.<-^|ʳD:Dǆ^aXo%uiZj^|kO涠wD;i)hX#TSnPi= "=Eת-_s68Wfz!a(ps{4Y!h):ZFb78D4 ?B!S,xGyi?v%&eyQJNd_\S+5fASS35HOp$EG&")WЗj!l8d:Y6peBM*!I<O.+o¥ېt2A$<j6Kт6 czų]2r'pۢڡՉ[.F?E(cKE925p/pCjvWc_Mh{wPuZ6Ymuqc2B%
ME&
'f鑰xbxBlĲ0ӆ&Q4#hpM1$PhAŀ d;;ZȞ_852Yƣ3:%۸K#ZN0bh)1G4Sb"ϭJOehA"nn{^?.JBq X Lکz#Ʀx+n-pc2/T0þ
.W+RJЎߊ\΃0Z7YDGf()E%HN8Tr|Ò]-daq8R x6ӑs;U`!	jڞebi<777gapZ~Z']W9Zv\%YDVUvG[nҗ]FƕWZoN/i]]ϔ7n6^76□P1৅8C~5*~YhNDt@ԛ!v'c8kXIs*>_oaSQفп?\,#!"L2yNT93m@ w𰖻];/VU̄ǪݒPmUir!t]h$Z
$~!R$%MY3Tcaa0d^죇lԑBrBސXBU	NceDg!r;-8!B:UsaN*Y10i>p-S43`'yF!`AM0
`SH)O"$t1zr$,RBa|
1qLsxﰜb*TT,B25:/VI"+7
e**7\O|XNYu>&JqFoX#ԶicyJQB5\`I{0f]mMr'rXtb#}U?zl#/.@a.IavFH>'dfw]%kZ7UR|wC9E
pܽvS
I7jV^T٧'$)[Y&ﱎP5,X-pǦ2סߢ$.2p2ɂ!%c0gGasp<Pû`w[.tJ8ҢYǴF+KjivCͲt}NoY[>MIs-YYPn@aG<sWv"qQ7?ZP,p.U,~7QD{XeYu5f0*!_V£2ϒ^m^@;&S-_,`34Y!1yFlc*'	.Z^QpnT$KF|JrGu=M)RZueag|a_ɥ dJVͶV w~CM>*I}6_;?NN};C(W[a/ADj&%
ʅ	,|>欱cm-dܪd!˜ΚVKlM~ձ
,o_TSROBd+QRagNpnkc";/ϼWN:)0Yɀ<k0N3%nk2m;8lLCkP4۹P@-\}
 TaZSG[yp^It$ջ9
N3D:z	cY߄DIy#fӖU@rKUS1EPKd344kh(r9NNhFY!
ɩ"WE,\Zt	=3n5r :Ѿ<:*~{3$z4O3މ%Al]bŚcC{W~Qd}139$DtdVըoc(planСyy`xD9m*i!vGò,I06}9:p$v>Yn2bj,4m\JpuFfu0EUݤ}#mO	ǢsCl0̱r_!Av{sjS/l).PAԶATÌP[m0khi9PfkC:dHggtЄJG-  0e'4_[v:<Bm4x7~
5\Ed=ZG[;M!촯L"_?J>EKig#
fK4kPj#fz)ebXǊaT+XǰM;l{F$1>3\y:lʝHL0x쒂C3.Q
dSO×G?<IZ	)e[m={tYkΔtPc什_pƣj)(ԢyC<}գ(0gM32!p. :}PA>5>],ɸ;\36߇t^~}9.n|-|F/j_Q ^DwkeumQl&۵xVVBv\YQw^vsJDq¾Zupٜ61`+% y]=E7P$hhMlq߰E*7
H1`!css[ӷ%Ǉt<Χ% ֽ#{/&גZ<sޥ*CPdй\D|_0<'~D'療Yo6(=&RSr{TmbHf; U.h6e<jS7ʼm+&k`(\Ǧ̨\=X蒘Y1sD9?LMA~d㷓lJ&, XE>I$?IMo4H^ak_!slk &R)ٗ4|#ijY3* { շR%K<ΐPռi@LZ1\?<^x@~ޜ1a 1~>ڮY^Qa|N~Q@tXup%em\iiN!lR,yOf)~3ø#tH({	Sڜt]΍2;k6I%Cay:P;IG0*uvDv?_2nnPN2pIV(6v]ُ얳
>t#7t#̒b<%"c9@&B}0Fy:D(N~n'l;l
 je5֛ｴMH@w5)}2r=M81G1 Z`\ibRҼ>FQ0h(!3F\<(f0<WP|2ĐwxRC0anƆV_fB[vo
hoC4D&d_gM7_Ա޽Q+RՆc_aoٸѐY,<rEfDP+
hh&*{D~;M׼@)Nr 3P,c8'lꍒ '{J{0VVFVȰc0٦[XA!s8Lzl
0Gh0fTeu"gCxsZ_vQ)QI;%?{*kEqľL}ff0N"0mNq_U·x/Gf	03"K:
f2j9Yy8^[y(c7,jiCI$A}0tTN[(煋uܐ>y!`(ܫ 
p.Kiv[R{$I&Z ko<ar4}˪%\ xG`
B-CpfaC 膟ưU5xAʖ6?Ի%3U߄mgYQ*\un67fƣ3mޅy 27VOA$*'e࠸R5a?&⁕"acdSbu6PCfO1csFH=/yD͢=hgF/?Ȓ	L6l:^=Э}K&ر32;lHaP*:ٹPXG]2K	45_{h<OȚ	yfYmo$M-Um&_&M_{Y`>0b&`KO/:Fj\~W/a)I&X'c]m=]_KXp׌9~X{RV_Չ^"e?˓^dԕEJ+ʅOSgJPh	ERruۃSPybo-ϓ'0I,> gA< 2etcEԗ3"AxEA){oN{%kcpӣoַ+]ð=^X񱭸HHdeEJʽ&G4)_`v5$v%OMM	,iWzax_!`^֜CB+VJ~_g_i@Q5wg4!=$Dȋ:b`w\2B[sfs9Bdڎl cҔ:dLX$צ&Xj0AtD/	t_^n$98<?fIoZNzq]7O6<A4 C(v8̊d,ɯuA'gI5ڍ0X^B^cCRp 9pT8*6:]z8qQÌM V $1W9ejP܏[a^^s
\o$k<ޞ  Yd0
̢V+uzǽdv7Cet@Gj5Y,[<(!$&HԎ 7642׿uFӂZ-Q)9р}nCTaWVxK@ʇxw,bkN䳒@pLYxEQŜ2cȪ}ȭ#>46yiGv3,cc:x$ɕtcF	V&j>&dW/S|+x\7{h"{G?+*F5` OxIi$r%iƦ۝H
ƶH*?#$
0A)|Cට/)+~ThdX6VWPUv#aA2),h`WK̷ҩXe
K{+~ԭ<*x| 0$R@债TD)VUqZk
W* nB. aT:CSR/܋"y @mGrM4 նRX=uūeI96[ir?"2f|xtC{r;s}Ct˝<% A8&CtHyG׀Y{X;b5Lsx±a+u[lW+̳s:}Q/)5><x^I˗GE~cCcbM~xvrw{;<MUݟ&5#tWdesBPǽ7{'}NG/|#9@3|M7ĩmT)-;C)Kб0EFpaDPɕ( 06t)3کh6;cw|rprj*3xsxeK5$X~C_Xd.P{0&E`6\idmgHX"$F[,Fu8yw|v{4hF-,d?aX,Ҩ+;H6XZoW5E\߶#hAS)EMPNy|xX^`U6Swϋ5xoTdzoX$;2Cͩ`Uu9ךI)˸p޺P/dm!tHcBObJ}WnN/BO#K9֠	O(rz[_PW_ʸӫtV7<
1h*9âtI%ɋĐI1رE=Ӯ'<ZBNJ˸n?&GR#3NzB|tpnb$Oa܈aPIR%
Xs]'~)mƨ8yJMnetpD6hY MAu-=G޺OEdzJV|Z|Ȫ.dLdİ֣`_b&H}scc!C]^%5x8·C&0dF?NYj QP#YAjI­fA'6rG%[<*9^Jq_i@Ɇ?)f52ãhE>L/A阏.d~i>Ӄd_A)  9Y$hpNf,%oyӀ隁'#hnQnI֝!h*H<b00dPB~FW`o__ܸ7PNDv%geg)NkM(gBb]GU.AJL`uYfc rI\&(T\q ^<CzJ#pyӖK{@$hDzA~`[,1Q
V)g-Rΰ9:؟3WPPѥxKOuL+|{FnH	|3+Xl3I/+-O2L=]GЕLVKJ- q24]9+[cc@<Cq=FCkjNRs"$g̹pQ]I;+p,e
=b#Ը1܊?}tltk"xGIw
CB~g{x
~27>dL#K齀C.btw@`фidJ6ӫxE{d.gk(ZErؓXd-|<ǥFwjߵ;fiT*.O~XKxzHgAOT*l) C^\ƟQ̦^]iWW!Ilk\՚. oX`AWRGEr>6=ׄG.EQٷղzb$iI$6[^ZcbѼI쮂7nLZPșhG?f} p6zmyyqcֈa+_U\z1Z^;ݣ#DO4zy]j=`>mGWQ՜/uPKjO:qAX59x>S #ici?M%c9*Ȋ9Yohmt<N. L*5
v]@[S$ $zՋJ,ow:=55ʲnEm7і\KkYNӨwO{r;pWg'߽;:>%Z9)X	ɄR,sOa7޳on΄ҩLs(PPg$cֱOTyaDz&l~	\g̏W遪+t/c{fMy'/F֩+F&Z0?wPi[
e=DB\7PW)k쿙pO/0墬5qUSHXl[=@R&$`YF$Q/ؾZvQ,y8q[<x%OPRד{Ga\h(3/>|Ɂ`A%GmoR@KJ5bjiޢ$pAKpnCwFgp" :	<pַcb@
RԟQfrƫ݅`WΟ0.1UAMoI3a ︀?ӎ?rn,}F' Br?	mq֘⳻--Tխ-@VgpzD.xFD	:S`VZ[g fmo+{I߳-#&\s]uǉ|hעҸړ[ǡ2 6..q[%@
;P(kj)53>ί.ݿ362CP|~yI@opΔY34u=yRk_A~En(&u(lve#gbȿdu|R똿0ЖM\7
QT/SMۮ!sHYhqVT"7`-g??gE8(\4%xPf0 2n9>MkVFw-:7	=x˩$ِ3Ȇju5ABZ ӪYR7i7fܬ8eu)@G
")X!=FlKF</lS?D~u|hN6[%Αo< MLn`#X+"(ojBŔ;j~g<kwK0,2z[0>uPqrE>]]5< V wx sJՀP߈ՂԬjt=YhIF]0?t1^t":pywԔLW%!TJq8b3yQG~1GG[pr4[`u:ӧ-'Y׷P! jgJV<cSc!!8pvȧ'FC%ojϰ)ƽ!?ݮSC!bpblBb$dk#R/#}(z8
*O;mE'MA!lުֺQA& F4$mX_VC%^pi0; h<fhK40q3Q63~o|U}TE{*_9Ux
;@OuީIFz[B$k"~
Q3w.>B+DGhln_	 \L^03bI^|<MB!'Brh6gMh2$>Q[XUDquyh^*3QT7PvJDWs Am}Lt.6kZO+Y	PJ "ñkb5K#3#+/ME \o-e0 |>{QRqpRH`Ǖ<(])9 rN4`tfϧ.$6#) 1(tE{sY:ݷuMмPius[35Hn,OAa.co#hia8IN<m4wC{*lyL߾q!w Θ	#	yxhTn{Bff&31EɆY>jEJր@ۈa^XvH2[[|
5GF9X"|5`iZ~Wz]$UIPN{F25MgF퓠]~tR^M'+(;h30?eߚQN1'x(-G@&dqT08WsE1B{[\FVt[FvY|To/ى_ ݒm6bA-opO6ZO'⺞KP%pgY2?W}zdKo'O/%[IJ, soX{J ;%HY@YG|v%;p5D VQ'?G"6h̄,ID dQ+]N.qj/Sgw"gU@l&GdoaFa:D.4V-d Yrh0>@`3b`0raJ=Z0+'G ^Oqڒ)Yf/Aɼ˝{m*:C-kd9h,?fqוUٛ:q0ʈ|Hr-4OP#&yOZnA$(|تA3'h XwEViF)Zh;@OL+~C=]zC!w 4nq8E.c@9[
J຿;B!\h/WYNjWcr&zl1);5J:pLU!Ԁ"tE4qgQ
ףp $~#D.	C3"p@̛8iYQJDE٭2|+UK?~#
%hQD!:o\B`Fbh /VLл0  EY8"jP\ڿ!lĠH4%?t-ʉD/,!r%Ɗt=ҬPj^&JQ:Oߐ
ע?ukuf/<:X]KRCE\B̬юkt\^W3gMTWg"/ތh?<C%W:6e<~g!_>5c>Se^^b{Fec
.1
[S	l*VcZ)A=/AxyО妽{6`YԤiÈ0%fCb.ń"∛<pI̹ 4]'n0WMl8u2ST|k)G5N,\1YRicfCRC%#09xG2f^-c
c@Uy*U^X9>xVm\!;pr;(z1CζpbN:֎BPE@A 듍y{H)<Ju,ةDV<d~K[tַub"(z3E]S.7|wƾ/EǬH2E,>O܅!
uT;7[/Z̛ĉDΤmg_eԆ)U0;4m f9[Ɨk?Uլ+y\b羂ZArKCa4lԆ0 S^lwV!wlXD*3V2zvIeCK?x{(TEh;Bɋ#BԂMsSwHg*OB15@#ׄeybX:i-,5$C{EAB^$f"r>ڙk$#;ԧp6SC`HxZ_]EGlҾCآ6]A%t<Z@~Gln@;w?YR/dK@ΞHk@PʵS2Oln`H\Xx.jKINۿ	W$03'o{yPdU`x_Ψ~~P9E"D^1[^;Spa0%Zxux6DNS޼s_>a+}X\~u;9lc"+EݴD`|c|84w1SuaC5sȝ:r+ 'z!.Mڇ#HO6̭Ge|&8))0bpl+Oχ$pU-m!X ,>D,/5j$q'.c`
mgCc,*B 5Nuypqߊ˼CgvtR%@1Q>	jȪ6
̂Qߎf1j2ԒfwYg6y_63@<t5Gw
@@&Z31;X,	?5UkWd0[OYUF2Y51EF7+>f"qO&i-dᘝPdl ,!ͶKmw{)r>xBj`(6:yL #Zo8nlGܰ`?,|@&t ly@AR=:E?Rzi=&w6-BhH5|Ҝr!90B0*#%Ld	)TbN22٘ԀKJ5b~s;!y{:%8֡ߊ@-i4r!.zAiOe07	o^[6vzqXRRukXM3Ohss~ж$g_KU+ɔ΋'k,ד2n~|J{+O0k]/"R_PW㈲ϑ9wkJ Kz;H^E/YhFHcn[B?F-OACWױ3T ,/nt>J+@x1e|/0TY(:t q6h;gQ;|YkRoZkXG**{`Qw{1n}^,vI,ٲ|&ssytQ9YA\A{
zNbndPjadt*$;|`6Nz˫fCgTNEPbN03nAG:PD2QX#WiVL@LٴΣE2 ߫	L?AJXkLtk1=u^?CJ8ŁstMv)r@6`5d$V@ͥxoExJgT-.AFDFM^Am->Նi}Kǩ;lR׬p3JJnVذ~<<[*::i{QzʩυXrgKnfpK>2w&幐"WXGe.h{68?#+ʹ<Zϻ2soϓurIbH{'ӕ}]i̤"(pv=g@2OhCNS<>'@՗#~@ $"	by\G_/ЁԌ3l?kn~|~#8IEWN!OgFaڇAb#aPCP`p\xH6Mnd0N.c F'.s^_Y۳y1?%d(G`5ʾMԘKY ?c$HhφFi}@%ƀo&S!BJ1{"ё
ke;R$D<q:ouRAwǔT$&^m/z .i$)fa~.0//Ɂz{u"$sf<R!'Nf5t:0[ξ?sXエ/]0-|%wA1/`$Ta/~t=%0ffz/?o)EvSzt<*NˣrqEX>$fLSU&9 Og7o mx,,|yߣxH;9:<C_45kD9B ;%05Sdb2bbsnͮsȣnd̮ۤ-ta÷AqmF?lfmE0eyVj}[[[km#=jO-8 8`m&j!ХU]1-zC4zG|}t$]\:0|䩸}pxz|`jBho?x{pxt̏ٻ~1.puSp᡼=b,oOŝǢ!&%W($*u.cChmê2=W	DK2Ac#Q8 [rY!,QkЯmn$&i>UI2dJr"p?-iHNbZf`gcW0&gg c:#SB35IN!cCNjt{"'Ai\72H֭GIUL|G/>o1KتȦ2($J'5>F)hW=/AӑŻ3~`+x &J.C$Fh+x<[({OĶ%ctK7xNIRmI<$_	i:V3̨aLnA.]ca 0ҚMWa*omObFGM@b	O8JE,fUd:6	kksq<,d/`iնgFgaIm8u:QDbBY"@ChelBQ:u|ɡB{<ڡٿAדG{Cot6jl!ot\( ?	rP@4+ȓrLt.4k/Eʆzޡ;Ż.7XbvGϵwFnگZ;0"ÕeiGmSCn+(wS:-2;7H|Vﱸ|v>YўIajEJyN&bc1`q	=DАg*vHmu*GnyVW](Oq"ϭULw\[Z0)WxAҞn-Z*m*.F2ܓnys`nTbh,@U
`?PrRl-@uM1(ì4gQwU)+4Lo1U)lG0D@a8e19RO53Zc.iXǌ]=GPj")q(B0_a*~Lx|6!_v6mOb`G~d7otu6`{;(lgEL}XpPyL˭Ql{Z4K;1my7k8{IBuz]]ꁬ	M'xd|M?irתjlF0U;{o޼6'(ԅܛ_)Z! ^:$E-Ѕ_|LQ͇"'SZ0k]75Fޟz&ڄ: N-R `嘺<KuO
l8lB\>s򎺼cCB.@vM1^vi* 4A;, adki#c֌DE#WihCc+ƣXU%qOEĲEX("bR K7%T=NVQ	"ݱĻ"LݮDF9̮edl?ue fkWL's 
|
+2c0Q4n7BOodX<鶓vyY|SrW!.-^BK~/<Ŧ))Z4}0+gڨس
v_TrkK*Ѫ-D=L1[^vH;R԰獊NlrE@	'ɜ}ۦmxl )2X^B3ݢͺ;{^z6p)ʂB]&thDrARR6jA7Ȩm??ؼ(EUD
y.fhAl?HtJq(vov6٬8d/yud%*^.'9E=1u%>k۹bxtVHYa@1uz2PLWQIr4RAp)J BrQN&ˈWf0cwbo?]卄	&̛꧖S53A)ٜ;1ϥO1	EY1F9	*ҋ S DV}[{i#Y"i0@${AI)Jԃ(	kpٙyE±^@x]wM54yvH2($z50	vN.v=֐`x. ѾavҽqFbnք^vO N>^/+àI +5I#;%R>f.ƒ
{~>]xztfU`&@]bǔ8Cl2KMX7|5}+=l^.2S'be5̩Xqruמ9C%6E!kqN}z%r	.UG_7?4I	WgVd< GɣgT>{$x#+n8K ~H%&0Fe*IlXͩ3_&\gGP-K۬p;.{%xzRNelhO TW"Q;vA`߻lh7F"AtP6xf2ߑă7UY}_.k?cַl_';lXvQb}*GLTQ/,\~bN:k"H8$,<ɠa}i7{B74y1Jgކ"<VqUX`ː`Z VeL[$buݝvW`WfH|m${E#o$/I6^ౌ͖~1fDJx/>mVdofp0/6nOϾ%|ŕ9k77Pc67EnxɱX@}筶i҆v\E6勼n+P ZgM^tB/˾XX_Xv+ra'^²ye_-,Z=ʍ3oZ
gX&=,11'n/c<"Uǖs7mi$Heg6PA*o>c0$iCZ0LLgE%A^9rS.|2(͆cp%Rl^d]KkTX>{f:jX7_+آ%UD{HvHmGz=qIlBuƐB.@漍l}GcY6B6C}+B" ǫaW҂P6  R$ڧ>F3.a˳W[4D^.iOK'VpaNE	1lU}B'!{GtI` Z(QPVym٢>tHbs1,ܢcu_<+	8<mi;h1|;l:iP;5k:(n=سrḣ)-Kx1tdBU6˯(8h]cQ6R1HhH>}J6<Ɏ)
m6cV)(&ӧrL\3MI?B'wlOl=m`_)4켌 gC4$GM|$.NPt}E(s#t;MХ2Bf$nגKmIʅ~Fl a'|<ژv|M@/ӿ<ˆ~?onn w'ܮ9jKwZKq(\>H$>5KwB, UqwH~!$F|^ 
0CUq8gf!qcw4p*.4O=д,hgf#6T2A|~14_EXTIH=f(Y}#QNZldW3i&ʐfdZf#?VVܨ9`c m_歙XͺL*1qж6ޝ=>3@` S7N˫j:ŭ 00ߗL;ˈ~^ -p:u(}qd#=<Ə[9﹦#<@LpR/'r+Hj|tUDq9?J+/7QY")M3(V5Qw(ڳ|vk*MԆ,#qbgOϥR!{}%|523b1,c.p$B6Kbs9=nǣ_*oh(eVU>bĪKT2P@:i J@J<u)IZgv:wS..νM<)[pdFq`A9ZԽX[ղEˮHMhS*UM,=C+E=?T<ǻvvyi61lϾpW\]SRӮөo"u*ՉFN>P*J(kPo(ޠ8"9۠"(VxU"sJSskExF
MyP%:2|BYOK&ޜaWDQ@ځm
HWZgսuV][{iUnS`xgbwBXK΍	2b8|B~vjdJ%.Ԑ$< '̾jzwF#v1I)܇YXiĹwjv]vPANZ'nVVPmK;4Ux	,ڠ1}pSl#T7""8!/y
f/&f)tC	h9v]on:[
*ήQ
*.pkmU4֦+J, O! 
G!GJ	Լ:ob&fS h5RrHOuVn|
jfbIV-"DkNXf0<omw<ۭlӛnEߚoήl`MGn6w?iA.pۑA)<ؑXE*lXeTo6uK0-i6ٕ""z gݢn;MsP6́j޴y2W89xID\JVGj7G]/iOy{Z	Ļ..\ZJbK׬h0 mج*S]\X	hh*{vx&* _B@A  2WQp5/йF|/*`i+C2=!/uij_1@*a3)-*)oNo#|knNO1_WC޵:Q|w軎 rxOz6̸c'="9QZ׬3hQ"k:xZ{I;y_wu~>^1.Ii
Cv	kOtjEG(d?k,:0e5)4g!M^4(سd$mV`8M@phCۮa=eb<hhüqo$/ܒ5ؗR,|Onٜ6R3}/B\Iuxn܄+'SMon6e.md؀4fsߖ&T?EJiG{C ?.XQO*<^VwAKnc w_:~#:82Qpz3-q?H|bI`p4ʸ5ǍIcM\oz?o7m-,Fd{?QcR|9ՐR.gtbvlnb}kaX)톸(3?)Tj~ݼVݼ^ l{7{It|uڇf38zJߩv#~oɒ'?yu}͵c͵+錍Rq#§`P^|F|bNmJ2Ha3ZMQ9q1uG&O߶>73""#I<,XD!E1fnA*rև$d{*P)>?^V6B210(5[l4Q:0~^/XSMv1khdvCV݀i~Jg^+xqА+8F;]zߝD íPmZtk)64^?nj\c5d3y͡@~.H˜PLBsT=EIZHu4]PՍ'hPB;ߑAu1 P@|vL/ࠞ]mf(gNS,)1PvW7h`zԶTUC	En{+fLqErf#,Cd=׎N'=ζ<O2sxk><n]TE]}UԷ30v ^E>4KN~!8F"Bn]'b8detB}qhl;ӽ*|Pd4mn;~M{L`"[kLM$<@/F/7~T 1#)KEC/
~@@wvHn!I1uۀk%,	\,>룯Y>rOѦ̬)6ݛTaNQْUA⫒m8!G;}`z~Q	evLRgX铼1/lv}}.c:GU!t|oy.b-45]1@z7;$۴t<K~~ܿh7l ћw9Ӡ}\3'Gǧ#LυT9H8Wm3OpPl_۽78	#o?$^4R}u]%P+-DW-oBf;ʼZf;5weK4F<v.+\3hQ% 
"FooWtLmyD@7W[;RCJ)B2F-r<ʼcS,:w)޿L^tiVHD`'ouH5e7٥j/_,~y&{7*q zMADKٖj`
}J͋Б~	jV4ޛ~9hX*~pwѽ[Jwt6}ӡGx}B
!#El4SUY[{/۹Cݰ'zZ=_J`*VL̗uxVvĂ 5*qd˚AA^|*ؖwim {a6ЌC巨|gi6"R$.06T0S&caxQ 
 H&nAi1]ү|V/S_|k(甊yɥw3Ffߠ^L0C%0Y" Mƃӑ9[mRS7-J;!/[xW#|[gqQ
0ȎJ8,vO3a9oL7աH$ǧǽ˳gzj}^C{]IN{):bWɏKܿH>lL~MU=;!&dvhyAgLN9FrIx>2˂ MAěltivC6"84N  CNNŒih:.Of:<9=;8<=;y)Itֈr3 sL t<cZdMgibA@3]/	ôMi{Ա=	7q@ʗЩ`swb^Zm??Cܚ%ML1~i
cIү>Ծx=~_	uo%נMX!fCc6
:edq9>f *m%M҂{S/^̇op
mkBL#p)2n,+h$rIoq'6x*qGTp>r]|a]R#(MudB&VT#pfBrۯgMS[yZ9,titP-{cQnF 3 Z)ђn82* KD*7i_R%k"͇>'~vm<
,+ y/Sv-rG+K@b_$"+3>$^@ {ʥ褺o_ar uwH.s]Ϲ4lIYq6<nnMoq3Ȳ,FdIDw@1$
&	iMt\$(#?n܄HR;DO
E][@KWS)߬!Ĳ*gd2LG~h춽[k3xy>;uSH
4ٞ l	nGUodGsqk}b_(~:!ZHϧDE@KzZcE7jdVHMde {<PFSj"rC2WVq9&Wp2{E6F}b$zRF[ {,Z4Kjܰ z\1tͲ(dlVY@]|>'SK|.iKzNdŶZ5QmBI">b:1<P'x-=fMI|q5g~($"1űV+ht^YJ6C_$vLfe=/Ђ%S K`?zG묤k,;V |B/)-5xff޼;>}O?Z=v83c'
}]76VF'`3W'7uzGj-	!F>m5K~F;󭔂T <a=,[5o4Qv<m:;-T1KI Z*/xgЇA"68ZuqN\׵"LS_pW%Z=nt. y) +33:C?+02̷:+_f%m:טA&itzyc9u4/xvi{w\OXm[xYB{I+P=Β~ZJ]H/[?oecXH6J'IT2	_^/8Ahr6WŶ(mN%tJ㈽ۥL}}gjx1pe) O3&c:̕!; I7W~K|E}3k(;59eCtMYxq}fc%rΧ H%kaWb;~A:2%f(RjIc"=6G.ևđ", i+GӭN[+ƭ۝Qibl0|=ߐ>ͦ!j|SAZD
wMTX8Zrn&:B<s	n`m[|pG{"*[vڭlӃC oIlT˛lX0N \$-$˜Th45Go7GvsMLmPK,]a+{x+8%|{PZm+U2RMd1:l}WT0,Mywx\v,s(	]$9rHkwTWz윮2(2x@_-&B(me	iAL-*5#y-SU>-f,[`rCMP $$Ú*,]dP1&u4LGY_}Q坮Wn56DFw7]<9ҁ)?i6A]e@euIkcDө͵¢`[wQaYVX)ze&@d㣟<C`p2gJ{yt2^pɕP&]Ó/t~Nn4vnOND!<:*D;Y"^N{Z9']u
4hxjOZe&d]3Ǡ"0+MG&13M|6P`=sȾq#^ >LRC &pCrj*l̈́$9p^`r#L".y&<&j#]3eB-"E=CϨA-A?f^n"
B@Q@kR%-6Mw*EM^,ZRʖhiZbm,Ѳvav֒vXVCz,o
Z8C;DɅ
'o3|op<5R2)	.fn8`! bLtkR^C2N8'3V%DMY%{%Z4Z-A]6BIjx@xO8۪>Hm85vvD!Աb?ڮpZy¥n-MN )7ff0{, @=t@p#j,-i^WFKK3@	 UZ-TqMpʵP#h?Iy؛NIWc%c6`p3sU(AO<[ɛxڸ9h.PqjzgfY3 Rt&0Tt8> qCt"h\Lȭ\nX~6ЧƋƌ8zc]xOTU"~K 2Sե!]n.pXM0SGݑܽwo{"I_"IGd.ÄmK4WMSbkb7^h!n.ʓFa0"ηFCS 0'i^Pj]kjtg[*1`3g| ]RYd1hE	7CHRl4Vb[NύD8Lh(jC*
w;ع~Pڴ5U	ԣjFli?ͰZ j{Z㌖懌cJ5ۥHwRQPYS]Ui|ya]bm=/fW zkDyu̔Ig,M;NI!*r-5,>>}Zm$M[vO{? '( Zjyz{|24?C
yd*;)J\i*ƕ` _O;ٚqqMgP+Sv(Xx?YHׁZܑn&)/p>wBoI[s:+rNY^!TYK{K4yW&	fל0FoL&:{VI=փ)Y$t\ZQ[*e#~[.r(Fr%$䶭!mkr
nx!Ky}F2;t4hճzuewv#C*v{bMHE?/ ^,VoL2pV0$R#uᕩ8?}\D^_YO1i:s\2Q&9	L6EF_T83ܘWQklR+E%F1 ђj6k,W{]i:*RĬW_zwʕɭ$ͤ?w?1,)~3cÒ3%_K@"7D0&wt1ll~U$KCWT|s12|<;cݗ`|ۥW-A]Ղ"`mA<BW6ѭ]k&U,L 	#A,
_DҜDxf,k65ֽY0dR8@/ox'Sh	/fNSSd"8lk8~ZEe5*#ڂ5nșC3ם/^ِ͒W>?@9.t!=)RE߿W?_W`{'\`de-׬/F{Q yįvah*qEdXB5PP˘I(u-DrqF
?}b;=8<89=?!OߨcJ\zl{,8ptK>``>6rVvòX>TF;}|5sŨH.6bξtps&5!xPr {g ~q}2)M)#ibSc	fEc&36t4 h-
F3
5uΗ"=!A[Q^+GPi*bĸB.Yb"6;>WN- eJv`޶PNv^c~-iӉ\@8]MЛ} H(?K$+aڂ/S#4+u.8˷:O(Gc˶P8@W{O<2s~Sf59
GAf0`$5sË
 +0}fSC31xr]Or
0hs=!12v*ԟ ˙")cvNb20zP-Kp@P$c't~Q6	h?P%@|3k
/hQ6KչZ=>P:02tXK8)I]EȀ6H@4n
Q쯑8Y虝MBs5*-޹L*[E9Ԥm)oS%=m_(/$0ƜyxnaHӔϦ O&1:P -qȓ{? v1F:`s9ޗP?R9&)kJ`8^৹-&6'|wPl@X@wW(ۦA9bь}z:#r4ސ0	eWYlwI$  ɣiKtj1<qK)	@~P-s9.%vIŠĊʈ 9QEZ<ĝ C]7%M:'+I,)EX&¯>NC?R*F`>,&RQҷ=`LG$Prqx-BPϜD:M8<5)9E`%Cz[vQ)6ITpm@f|ws8"jc=>#/'c Q&A്D`H>ب7ƢDՙɥz7iJ
'.QЖaf"ZVGk2̇aU/HP]@=l)aQfƿ+"lK/_AG+o3`}e"B&w?(v}vFe6so<ѹk)X.<^x``YV94e-/2q+Q'@/}s4:8ץdz得aA(2BF"~A0TRrl:pvI֯,B,<y$$mȤv:,_gIN\Q?O-wpکAzi>H%ONQbdqZy-v?'o?#
vtj2LM:.!	QikMr<\j`}ɇDsr1LA͋i/&$Y/>B@6lR<̑A9<j|Iڭ??nwNwO``I삀dYD#(SXY,dO)Ihd<B 0yGy d&P+4
x5qIC^SP:dd:fyAݎ0(Ed Zݵ5GK{{?UtD?(-p[f|bhf
i3SyE&$#7Ky"3׿ʹys=',B OKVք?-\>f5KsI5px	ʲDߴ]Kaƛ7{`nzRj?h 5H@ގ`^>rW$&/Z{K y35RB \
|ckq(Uf?^ZR#%Ǉf_;4'%5wYRZ	SƲ 6R˰pL$kesxbؾ-uB0%AbGNgJg%$d,gje^00T7x>
-gǎ(VKT=Bc_~{1yA,{,HN~QÿP$(dg;=C݀h2f[Q}Q[~W+CH`!w+&Mo^@mN۽ϠٻٛĽZR.PL!)ֱԭZsJG@Gj0o:.@W8Z%s85z'fhɴڕYʼn U7JfWـ8Dr^VXC} #*쭾f ]&p7mnOߧTo{A5Fhcmlm66Fhcmlm663mT7_4(>Dof#4	pPѣz,hFo̡w7}ncejf&#Ts6Lߓ	/g7є?7[LDLPwhPktN]b6.+&%cӲ0u;67<pF`hVC17q:vA$zer*;Fdzb):`-vb s<Ր0a"ڦ_d:ǙM&qkԘ;8)"vr)ĕ? }ai\PV2~ N2};&3$s%E|To:1=AqڂLaB8_C
LbˬɗQat80EP	ycCLB}Zg=L1d>u)@h$+ORX#R;r5x4N$Ggs,esnY9bkYZLT3ւᦂa.E,#3Md+B G{j7R^=5:X>m=x}^ b)>L
3ȝӂl0tVlaltlFR@$9`fcJԓnWu}#9le2w|08z!Պ1	wb3Mcp<NŧAH+O	r΅=;vuZ2ʾ:\Ԗꔇۺ֓E0]`5w@_ x˳0f`Rhv-LZ:Fv_c.PAT84Z)&Ne"d:AӠ(ORKb!Vc쎆-l4	1!=R
Y2OYQ^
08d <)^#
;%=GIlWxJDʑT/V9ɲGS9zc/I+$бKN8!,32UY6As884dЁx/2Au/Z{4q.-0Cf%go3_~`揪"ǙUXdj8p!`K_IxR`W[͗y);VE[O_Nϧ)7Lzv{Qo[MAuMyN^Lߜ-s,n
*--z.'6L\b4bsˀ@B#gt~QtP2OXQ{n7&KgFaۈ吤Sw
E%3i$YuFR;Vo x~R+:9"[#yoDsd97\umvl@QBKS2I[_A	vi}az E7<B@z%DaVXi2YTC%7S_B	-^gkA}5<Csڄ]qYЀݺ(5 CXe}<Cx7ݽnb}{y{d=MQo`DL`) f;>^h#_IRw83&4t,# D;&ޣşG/W{UCLwۼrg~wrRw`H^#1ltD%5`U!AtF&C) Ki;jx
 ̲h0wT_pI*lѸph.DlWp$u+,hGu.	gˌ#MQ)aY1VOFY4ۆaff5D,ۚXd?axb6$"v.t=nk|.c$dEQIFL6)`&9`Y"|DGё$<y.7;܉lSv20c u$a:1iyʋZCq(3"G.mfbG̀g# bG(;Hq5,{DBgy4{ha=i&ͼ=>P7G&| yyЦ"BF/^c3]Tv+Tam}{GQ^#WEoY9mW@pCn=xHfysӏ%fӳٔKmj?LjxM7{$l6yuˠئh=>^>˹9'"i}]tTD=3tz>q '<LZKEB\h>WaJܩv5 U]4ONvTw?;=lSΉ2j
6.p1!A)d0+E㕮iEB:@zrɻjzL hriDJ#ts~q,1PMM	.xt`?NYv4v:ǺlN9rn)0Ůg&ŵ\jI%kVÞlJe7#L٘C<W~mowZ+M#=>÷SR	5ȄMd}W㳣{ǯf[1:jԛ]m{Cb_7޺9JҧM1Ay
Y	U\@7X@"-,)xLdGD`Ssx[	C5`;y{fYILgexNIa[w
OڑᒙJ^ M=\6ͱ/q#d3gD~XgJE隞81	IXʄ2_
05Fu	}zŽ{L7^a
ޜ1;6݀+w;~.%J~WWuoppC)6h`zc/\"ag`|~f.!+t0@9lbQd(4KYm1l*v@Ǎd#}II5OzozA7Hv&0fOĔ0ED*bXMkyɺn$[9^.{bTjjOKܺ?"״Y5x*"/1HUDȾ)Mf3edޭ+,yL1|3˰I:ʊLiDbo3847d+(t8Ԃ<!:=	hat,j&iq
H[ۄdB@&!~P .ڙ+/`rq:Q4!Y$*Jr 7MX9cbO1SVd*idcADЬs6*t"98_?DdHޫ7{O!GgX\	]GZC#j#0*׮p8:7S"*U8GH=$)<v1Tue勿P!^hйvte}m|wm3圏fW]rI>X9XZ珀]V	->o/[m	;۷Bc7 #32w*x9+P[SJi)V%|ljAF(grRq]]& $
mawF'MPWVNi
_)D	Y'bV|'憰t7Rȿ:RH<臙Ƞ{+6W`$7P NOͦEQ76B{xfe8~ hCrćHd70T_Oۑu~;e0J kmk[I0_Q֬F1`ݜpioI*Aukd.3>d2#p{iCUV-22z.ďO=ke:F$ta@	Xb회Nڔ )~YHRQJz"+I _q)/<
 ~]'j߸esm8|B᱘"/)/rV,YIኢǲ@70C8GޗHUwvq^ܻj!X؟/kkCO餟˽5*oh9-3IYP9ښh¶A6ȣ :mu6I)Hd]f347〼uVffKᐊ(c 7.]3IFA#)LGP>3ft$Q<go;?vf>Dm>߀Y{qBp·7dBpu ̱H0BrNՍn(X$TMP^e	
4:d %GqY965;gT&+v䈪b_FZ[D~mn/E-wwҒKXAM$#*P4ZF0(oZ5S2Emu 2	+kW&,9FM!;E$	ױOFH~EwRooAyw9LwqznZ$gސ[}ZxdprԄ?#b@!#r!J؜LaL.KDȂ@WQ0uD|w[W#n"V7	0SMܱ3V$p0?w1\t'ӢK8tr+9_X0#Cu/Nv#˵j*VpǉIu5QNTAt%{b<'`(Yj@OxrWhQ$l;
fCS˝s˫YHehDu X&)׳;MH]bG]MCOM.#P7Vq<<8ǣ"-77S,-!8G ՞2L鳭-l=#K!j)$&Ut[1Vidpx	z#A*	R-JBSXldv}p8+Ka`'ޅH~'64ppoޒCV;>FZ=դO9?9BMGn[ƾ]IHa{A1"BtS+9Kc6r0*qPD1@g xqilj3ۗ^Dٯ,C斖ۙW%iD(Ȁ3$քA(ELqgTkBܵE/s%Q?8O 5{KDB?E9VAoX٦?`]F*K>rMyoc>8,WiP+u8(JvX3K<œCShQG[O-
JgaUVtJewoaj--اCWgi^3^$۳KH9|}dS~{/KehG	1ٸ>!B9乎	z!3!'*aw&y۪5*]M3pֲI)-AIon8y04dBzFHv.\y&_O`Q:'|~P%0U^s
`NHOtA g1Iy"859ɨe]E"sn5!8p]CZ{XifSR`"8kɶ -`k~4S/a_nRA~jhD\:w`M6(I̵Th1+$&[1 aMTz9Jvx:j] [~J;X\
+ZiI1MPF{<ga Sٙ2Ś!fť"i\#=C͗ӳ'= RQަVpN/FR(,Fp@4Ĉ Ѥ".ll:vJ_[<r"#BƚA`Mwd1 a@o;O`ڰ@TeKZig
7҄jJh<9A-ד JeVqtn-NU-xwo+bf-dxYfa~vY=P	95xːYq%v6[^ev)NdP$6t9qO9X:SWſX@B"il8˵$^|m5DxEc\!n	7E7,<z>fC*yI:$ DՁ/FfÔ*d#;w'@o1$dی eӞÎJ-g@/J=$v(y G!Ymd<-/pX %#kGi(}>Lb2	pcSlxK`̭Ew@HP.%Mb.Idӳ3JW$ev
9y0ĸ.2C1,LW#(BT2Vih'h5Ee:*LIr̢aTqkiU4YJd1`ڕHBi#P].CW$jmP\:1`G\6յ0wo /k:C:fq: tPw3#`8>u0%U K!%[QۀHf+@UBd0/>Qq¥MEy]XG}ˇ!E1 gsr>NM7I&/5f^@jViMќ"{\`Q+O+(/^dṽ,IH$^-D mgt
uMRWJv>Pdhu2X!$FtJ1P/_\
) Y[3NN.,q^CxdLin=Ij̲NI$=C&k/,!MXO2d9Ot YV}o#.[".i
ӑh	1a]P1}Y7N7,1n7p ڬ0@%1l'"23B>uxϭ
ʌc肭3_$TH.e84*7L|Px2Q@3+t#pIkD3-``ƷQYcBFqv%ؤpP`0v&Z|t$cYjh@8jB4`/@Qݤx>hFiRay)\@LfXfrݽߐ5K1AB<{;sn 3URNscYԍ?VxtY.y_u{=`tv1mQ	S=)_-X<fAz<j
l=HZY0QB>*ِhD(+r0kIѲ=J99#&bQn+b-Mhf֓=!(_OQ<PRh#p*Eg9"0W)5Mr)mƓ6ZDyɬFx,5sG׀5Zx5?%56!!$ml(xj4Lf߇q5ަ9/d>N*N [#'.AuZ	E5@;F%Xms"EdM܇Duq3+?<;9kXEԙ3Xտ*ⷪ^JF^
4{{ui00HN؁q>	yTmU]p*ϖ-9hq&-OYy4c\d/8GzT.8K%P w#Ycvr6z|8
gݠoi`#ٔƍ1j;?xgCSKJlkiZIrrtpf{!o8=oT;d+w~Ja5U/-wC
C_߄RNkh*e)A  mWh#bZȡ6YlFN6FpɊw^I n2֬%1OG,@p@҇i\l9Oq'YQ}(7>7ûFvӰ2pDtT3PJ$V=5l什i\Pg}WۡT43XPb`k m;3,0
	}>dγkFjg:ava$A
}W|GfK-6Q_[pM^iY d幆A6.Wus,C`BRV")QϷj E:񞍎tC¼֒7?g]#AF#Q4YA7/ |\d<4@Y_R(	Gi{t&=52aZᴖ=;}!CK'v?̌8!?`V/zmTűѕOג#A!%>Y>ox%h>jj`LuM+ˏP5-۠u<CUOl]J>Ҁ2cF$B^oN@얈'gL$oZOlVODjқc`?HQa\8A`[a,9'T \IE.$[Cs{2dE«5"HƤ	02XݒSuF+@Wƿr30Uf^Xudh})J/ezS
/xe=.ً#],i!CPË޴:@{ ܃Zo}/Pme"j2#ab
YPߛOXlJ{	!'>`tis ςRA	0zm`2!W$G;&#&;֥JtOcM*P\5@6-ϤɰwXT
ŷГn٭St.)l#)&X~*NCvdb$LǽjXXbR^~HEfe-ACfn	or.% 	dM9-I"u͌.(pA x}OD=)*JDH4n9&ͨ`f,-{D,sbv2:rw\p̔E/` XfTtUOFE&! wD ЊE١=IqB8ъO00yyVNo%/DCfah>Ts19i/@ O~>8;hrAgm1Z">
%8xqPswS
qQc/-m^n>΄M*uxh	Ek*;;d>MPVL*W!6Xv߻`a~waoW;䨵9)w~tp7ةz1')Iasj1_Q3\,Cojtj(w]^%v2dk=	΢f@9fv.]"h]%@$UL=HFeEK{!zQ8G*\oM)C
?b0'o 9
FpW-* BaҥY9^j-91|6):;&be[LPˉe`kݭx.LܮP;wϣkpj1)V*)rZ0}@fW[K;Փ3 "I^2;oA])r-09o29-c7'+{"t=u6_7
Cp܆&E6JRǫ1RjFQ~n?Ukq5aMNjqc
/)%:TmCIm4	]P 	y*)sheRG|gdd9]ž̀ /%	f]o?g
MaF9?*J2<=P$X7\7'@qqU3UP/>D6܇j/UJqTtn	>b|XiFI	Zu3#C=muCe~'aeM  vG4!و(fdH쎞h"	&pŬ[]1t6̎QNgx-RQ2&g) 9Ta7([7)"+fd4NeN)1Be/!ƃ6WӽhßÂ;Q~ƭgBZDQ}eQ_Q&Z!MN>ۥ8<2Wf@1Zh5@gu㞃u0ct`	u G'+aXՉql.oR2'JXX$W$'J[F\ac\xs~JaCLN/~^5VSx?+Pb( Ԝ<{L3	X_uHj;_6UzfM=<nR6Ǟ몂lNL(߼|ݸ~IkN5T+S5
}]Xh\.O^?T?c&/
!hI֫#@CaiФ<acI@zvX2vXmߩ|X6@nXAI;1yfmT5W$D$gV#"m""奖ufHiw.SLZW}Xw23EY']G Т 9 뎖$rbmdM->Nqc"#+5a-̄"9ݗYk͛\L N!ƐMEEX^`[f.٬IUJ]3Sĸ"dF4;颳,INjϽbkmm6xL<&m%Gg{ۣ?aL{'"yV2@\6,OWI;Ab`n2D 묽Eзچ?򱙬*mO?rǒE36Z*WýhR檻RKuR>6p1nĀ3)fZȞmErie^(Yœo&:,[_t_sv^ #KõcLZp/``V黓xB7 ѷ='4Sc"XSl8ǥ#TFflr7T@Q$l ß5G	<`!",TIK Bϼ*a^Q !rEPý5ufn}7lIAU$V63Ս4{ ]TtzqU2&`7'wz<EA76F@S{'`1"%=񯰚X<a&Y@A}:g2zS-KU:؞W88OE#IE|7X-Wvcuz++G0Hk/ H
3pxKjfxE*'(k<԰qBG^Ao2n(shurͿ]eY\Ѱ_rJY6<fCՑ`݄׬O2(ﳁt	E\); ;`!T[*!,cr+SeW68FyԀJ`ߵ2kdiyto }M#"+Bڱ!9"	Ecu$lmn#4ݷK\ZA)~8L]
ľ04AP{W+M+\wZO>dJji*E<'=7}g66Md'lCk틄"d^)J&b=fvR!AZBs䈜N`0IfkQޙSS?H F>&RΩWCQL W]t!X6Xdox񨒡.lIe~|q!hE@2+짾܏yHe<BEe"%Z$Hvd-`{J譶OTjk|'J΃fҦFkn9[ݹJc4zYeM)hr2`wv sޱOo%e9Dt9 S/3q

1$vCM؏9ӼoYGvg֞1qۡ@:λ }ҞbwD:laڍJ-F[TAkL+5('+jt8򒾡l2*-j!;`Biq<C
6i:bI<nԄ| ,%1ɛ].e3&rVy⯎ƅe0-.q)%9xJ1k!`[b fbiY?"4x$3I+Cf򬅿-=)	c'jk5sIzzɇB%2 rd0*îp:_*FFuX))8><vB.)mK1#[	y'
mOON0fMSC{d]D$})fd07l#F:[eBfbO{Zn	Ap!	C Zobvۋ޻TVKFh//e?7Q"yp|'g-qeXܬĭUC-8)&,xt[5^M,+*$)f
%w90ڄ[rM|j? !'D{^G|7$)d3!7U+\R:` _#Tk$-VeG7[)Jbҧ$Ch $Oml4{%@&-. ́֗?ja"Jd'Mrmt_c4[Ea蒃׭NqJK`pe( 8pQ
g.hC:W9.8Fns+lXnb*[H.U)ƚڧ[/(qHd/n'6|}F&\S.U}e<<fŘb71Qw׵5ulXoqvݶ]TK hj\g+  [ҩm-@Xւkri78]}\Ԉ= <}fc4y!ǡSjiM%
rY3T}*qx)VNCw㑒~z9(vSƏpu#yYrr~WDLT$:a3j=VzE/P).,ta͒e3 gI>[e3 e7eNmţu%ԫ/"
IChBgcIv`תC&O`evYQ.fѭ]1K쳝7 !0|.ck95L9BFuOӾӸ;+MyAC"NsW3sh/~72plMᣥ9
OJm"Jj -]bu=9fP'$xŲ2-vRLRԁE8kj%A5z7PgV5wGy?'I2KP,י@)w")حBp Œ91EzPFN0zcN#sT!}1}U'B*wۤCcU*P d]ã4/xFg[
ܖUj QDdQatk;~hQ	THř>FriU
.ڨn.y^
%nyQ
Z\GEe9(e;D+Lܑ̦!Su	z9~lh7	@+ܲ3zi l Q"3K"0
#SoCM\S`a[qp#'`-9/f.6vhp\])>i	rW%K!1Kzg誡
P8(b3]&@r?ΒK]WAMd31tix sܦ7N+l'6)3o+wE-(l_f5{8	a"VDhG:%C`G):3{4թY0.cn"m|=i֛ɺHzMVugyI%&9[&9|L|O@4	$D%aPze8^ߪ5}UDOBA9~y]i&ٖܳR,0l/G`]̫<y)x$(}ХP~\Hͤe{y2khX%98"?nrwVSӊ R'-3%Y/OrG?ȏCB6+Iӵ,CGȑ_JVӡs+P4o2வ=/ծ* "l+
P	1x}tg}zxc"\MWjeά{NX:
}Cڧӓ*rrw˥FYXh6jdq~
$gbM1 n-.KHa_x6鉗]`217q{qgEI*)ڡbq:q֘{lnMm2]o\k1Fk~ɼMwM>.P1&(gc$:q6%ﰻ]Lrr1m֒ht.kVw W;8۾"X c*Ԓ
(ūxoɭtyzј"gH xO:,T~}do>OovM#L77ɛ无C5N#ǹo?*RlA
!ShN=OtɸLR"VK[Ҷ}]8@%={wCT%3
ObUw\nqK )չYuVV9'yVo/f܍fX/*)+VH Ch:aL͎"U~[:v;InV^Burުv/_챡K斖(%O4svpZVƏJIˀ{j+jUKfm߃|rv$Iiq8p2NO~:;=]PVI*.˞RaIOCHDIk0+߽XmaZS7L^U;tV^4^+=SR[x1
UK"ϔĉ[U¬Tv&WVX)KXwf{934h)[gROw0! |/-/%tNS##Yw^Dȹdd"XDnH3}l?o'4uZ_
[)|+-/OW'Jׂͮ,4俖#3h[O~?=;MkN)sVrҞ*fQpܯViA~Hcx]/t//sn6:,̞olWPr.jxX݋̀>ðP;,Wrn$0J) cMJ
U}^4cY+-ң@. Wx	H$VAu8$v d5/֋mŊ//HXb\&'́alB79WA d{尕0 lx2c6EI(޹ֆY͎f8xsA(V]Z|L"?@@dL AdvMx1'9se|LÉ W)L ꡶2o4QU5 bKɡ]PbG6յ*݆S[
ؑSq%_qW;jWP'<rpQCy8怯uY: F#JI]fQ"\P+9	2'"C2jBv LRD9se@C3'YU6A21DKXqh	KãTǿPfaCB"9*H_gd^]+
F\#NtH	ݥknu"cVJVJmif:"w'9]˂.P;'DKɠ\* wxk1)C!˟#y'<cQy gkr6}s0aM23CaBpQ洒槓ЅؐI&OV_Pی帒o{gI5V)4p֏-x5@3QAr1Oxj;gT]*".A4
A-|=nmS54_{Go\	IBp2x ڥ}VP./G{[؏lD 0.
 p;q2Mclq0?UByn[[{n@u44CY91W" gKcJ""ņuuZc1/Za6 XN]wHc M>*&gVգ XYyw{+J'2+{Ne٢#l,AF؆՟y\X%kv]q믘Y7#w[l%͸-hBc8cy-#g[4yK"PR^:m.]zS$FƼ٨~<|ϓIW3<5*:\s(`[!+-C\!g<!Ua	l Qh{ֿvaoHCE+x^VS΃Bs*&TP`}4N eR[bKjߊacϵ(5O%Ъ'wMqў,=52*Eds':cP`2b|.Pgg	!Z:b1%#Jrӣo%T?(I#FH
yk6PR<[IV.<w~=:Whkjo<MZ}K}/ K"㲡|[H(!Mq,P7"l6ykdcV/1A:3Y.^H
[~z!,d"(NA"'((hܮ@Jy&n0ܢM]hA}^-Vj3Scmᕶ_:2#5,}k".4`Y5^8mK>&H9C#E&y8U<H7Y\oxJ(=g}b/N/TCOb?Ϙ3чTTyIm3;ST
?7ny$VH}%+Tځ/Y?#{8ij1a=(PiǈaMpR5%*O:UJU
 4)D|]t,&yi83:kwwR8ТUCQQ4T7ZS.yX?˻7ѯTEJ(?DEY`EhZk|շԅ[Nu)Je8k|iǘ?H>}6Ry"{pg	֊)NdikSa0Ődi\~`xBg.ZY`ߥ7G +kXg:e
* BxA6\>۠,Ih#BǗ.jzq-$h;gX@LjЊ@؜0R	8O</JT	
܊
VR@(X.49{I1p.3޳J0g+m%߆ HX=2'DFPU=M*G4'Ray:/IRE@W$h˻6DvDV^dӫQ7P"diߐn_{8`6;w
x&cmidGlQ:*
=~.u\5y=}4"Q=IiYj}}m8.dPC
x2@;Y1=yB&'$\^5^BZqWoLj{7❐x𮧮z홏1kE2h_w5Pѯ	\SO)[HL®Ưb|ؼb]8T1	:9VC)_#6iSRw¡v/*/RNG2䡦ixzUeeL1cQ`\NtlXjֶ%&جJӸmdi^+>ك߳RJDʤVDc]ʖE`&؃7xx&>/.kǣ~-~+Ub7kK`?
Fz2l0$vQfcS6~Ñm[,7St:~Z-:䲁[c}S#аU)%0djLLpL+;aI	B65#$$)Y钯30(p|0OQ1H󊡏r:g進\rƉQA;s.Bڒ+fI`l)san UKt(PR>6:&JߡÐ-d՜{[js/3+@I7ciH-@jH-e  R2ZR@0-7 8δ0-7^zô0m7Liܴ}K/cysṁ@xa 0^@,0ya 0^^/LK%iҴ~iھ4m_/Mۗ˿L6q|\J/?LZ;lO޳XSKL_Ox@X~ޓӧh Fnu~Cj$	Aqd4 쑓 }\BRxf# .v<\yAQii)P޳n	5ۡ49l8زG4oM벋a+p#<M;L^oC»X,h}Xhv{)ߴJߴKosFj7^P</}i7/; 5C@,?a`Fa`4ҩ{8uN\?7^<
Pu<JD=m&AGBim?~7d|8{~<r1X˜/9erk/ͥN:^`~iCliֆ2`)U BNkb nU	G	nLA12HTI (33&	XZ6Vl-mSz<zQ'Lk AeJp$0wUq&.pf¼u&c Kn
2a@	˹c&%;tt1PV[4*8KCz#:3狌(:t [o
KC"
Ug_ޜ:'85hN4X-DDֽ*zВAP|F,MlSk`a!n_ԭR575pc0>C?.F/aV?{"2eMm-pYx`^D5<1kXeveY$♘A(_[[T?)ŧh"х-JIY֎,zs_y#+_ӏeYԬ?p|j8_Q\DŇn7OPk&=d(ts#|::'@>(>bboHjI֫@?cBّ>1ĪC3^؜5bV[#m]a>c_]|70 2sfJr&riɇ/,z v1N=Kr\Aw#r?GC'r*x~	4(E[~* _b|ncS4/X`"#оX#RBf!QI
7}?QԽH
l,	R^3}i#RAS暭(Mʘ/1 dG$)?pK-(	Î"5nDBqs1/MI3NSRzzؿ6@l5n7\T̟i4)1guuxZRnJ#,
s4\:~^dXP{ĲwDP9$>BbR&]~Wu;5PuJFtWc0PȩCO[v hkk.#s8/Y5g7qğ|;1"l<ųWL}WIނJp.D ɕwˮTP^+1jsȐ]n(Zp Xxx%N/rƊ%E0:h1[4ohE<E+נxHt't{ݡ´蹫1x^kKQtMK%%VL:r720pLMwVZӫCzhya3K1ZutoqgP	Z~p[%EO璏:ٴW,Fò22P7*]|(BCqzQ/1~ȟ*
I·}g%.;RAEͩBIo-`!ʐwH`dc0b5Tqs@IaaoX=[8rp۶@4az⦨U8ep5pRuN0"_JZn3⣣w~Qx<E72ŦbmsdCB''1*.A*cEiw>o'\Re1yx7F
G2b9U_I`$Y$0n
2#(*ee؍aZ="foW_\CӧW+uӭ 446
06PχN3a`<e4urud-vPRsFUfb-;njfUO홸l,X&8L=*dujCy!oml1p~X`e@c)(1sşz)XHf8@F^);OvEP~N!S=jgklY*W	ۉ7G	jB(G#Bm$e P7lϮA6@`Ҍzj~N[-˩Lٯ+[RE69`K(ra_~]~3nІvkf,	J61=	xߚII\kXH у\PQHUImahGk,4uUvufTqrv$A+Y!L$-b:٬=3Ho}w!2̝<~k_v!KJK;m{'Ied0;FXP8=[LoAT~C0oƱ2lZ,`=گ$.
- E=w#QWP$3}*fE~uG'4[Ti<ZHΰ(w.VG=}]-|íFaiEт%[/SvaGzK Z3е&&kܰX 4nfJ9!a/'jBy*Afx^iŐKd!j˨UH%YTVE
_D7,S\Εo-NuKA 7t9y@p`Y,xJ0x4ͯ(=ԐSyfuvM^+^=2xX%Lbڪ_{x~1ݨ}	p .ek,K@˿=ȉmRQ WH|3YJ@EX:krޭߦ|3QmFE?&^"J,Ck֖?N1{)0M0:e/C1a|x
p눀50VF?v{	?_o-/{&ߖIszkkµ~>~",E6a/"?W4 >D]\Kc}	WKm!ӽ>ʩ|k(r#>TMDT=9z/
sR{'{|0/㥸L,]IPǅdȏofH~Lj kCP>jӪx+yv'1NbզՕQS?:IY;C~8\_ylVk˴>ڏԾa}v*XxEWˌY:3z5ɟZwo֨fLZ?~E}1_.ӜspR  
yMS]yV% 9iRC-ojE?}8%:9	N@<ng0szчl5* ε0)ز#'s-b6B;~bƛu#&Zw\k~KFDnfnmGqI׬L@BTmRMz"IadlY9TCD%WQx
'TENp;3N0z4R!#n ]\h@`AwwUS-;'s4:4#ZwwF%6)>La3	T"''φon1keҰI^B8UlXȣ	{88S58YHiLΤP*b%;91g̚ausߩuFFN 0'\pCMheʐRL}'$?0TŖ
p9\
+pJ
D-M[Ek'4Z:ac($OEp/sy?р^ђ0&}ͦXi8mD%6e(0%<`Fx~)O,7s*T+}°G_4]RI`J
*_1%V8W_&R~23R8^rOs+uscMRխD4z8JYH7nf]sddǊ(S~:5fJ%I`lt (lnYiZvRt>tRxI&lQ`	DoADuOaqyZoC_m켓NgwU,/բI̀Y?"̴THMѿ]Sq+oMV7v能]^<۫|m!L
]9k_K0+]̀A.@pcJaZ{=gY09yΨjRomcrd`E2~eW|GZmh~W/z|ZQ+V^ ViZ_V_G%KX$^x5d]D% ;ΧV gF_8;깨P(l+@Cf(^މ*ްvė'p7(OG'f9)R@K5oK]0d$s[oy,'gJL!Oi27j3)*\S;Z`	ܦ_:w#)GyqEkOgnd
p%}W!U"Preã\388ʎRX4mM]KԟTf,uHhL	2taQc_Jtj$%>xxGsm-WL~Ty[ɿEyMD[\J	W*.A%qqes[LUJvGw~o0YYVM<idkd}AӠsV}0YF@prfX17cĹrD-ĀOLEC('ֲ_B 騽kxah[k)?!l!dF8,"ȶr9Wy%NdJtߑZJmGcfemރ{#3d+\{JN13*lF|Gha%n|]KgG9.owd!SrWmw9=M>4ϫd.3~x9ְ#GZW~~/ɏxŤYESl<+
$L<MH8ʆFoΉM!W͜M3P}^ ߿N9 撦=Zn+y3['?1]+eCoDB}FYdÅE=9?]6˕5_&l/#ئc#i?N[IloMt7xagDxy~޺|Վ㐿~oӷTrDⳓw+6'n[h:>i(v7<Iji	C˳xԞ~J
;Dz 2?1]^<>Ji[51K[Vzk!@׸5uO룥9j4qL;W(ZohMR:p5H9r0v\dT(oV?!92.fa<5>XKOLTa-ܣy:d}RE@?++K=z#Fc.G3G`iÐgvI#+kZeg,%KfƒUP|PZت1m]<-8	{?2">6<J%)uCxEs"dwax{_Z#tuTWj5|{
nk:sT|b b'q6m:\s;9E.%(+Ԥ,;S
WH^~B86S ]3:8k\+ŎX0HBǯ=/^1;N9~=_xq1#_ ~(2+%L[A\ӧ-癒Ī5{8q#js&HXꮪD(	fh/#VWRM*eN!>."Ҫ[-2n`ÈI,dE!/9B047{ ;Ԇo:ע^xáИh>tB)<&v8W*i>O\*y͡hJ|5"њe$]&1ZSv/"ĠOb%]!N~0$tGPD
y<D߉QRQJ6r|BJW̻R<?z>mh\E6߱KwWy>fJ?F?=-8B1P mӓ[7+*ٝ׎p9o0#-şok7\5u-mbp}uIєp.=E}=@?~TNg+`O!PE]RY:011^
.I xR1jPm}=yw~ʦpR蠐~*d'G܊=QHM"&Z-f7X|<ǍcM$}5w=ј.i,bq^a-x0HXtsug#xt|n/{V~!DH@tސ0_u_VK@bR]`[~f-97SNiGSkJ)3TP030{7fE0@0a^X)'ƮTSqgЂv6Π$6ƣv.>oyyB/9g9Ėu1XPOxm}ڂ1iSӊ&9rdQ$NxfqWvZw<ocUs*s?{,ĥ9G*RdpH+)<ZYIsH,va[nsQ= IxZ`iIQ6]5dSΝ;;2(06I>BHcpإ]/옙]oC Fu*sM@eQ.^gHRf4d=Ҁ$5s!lfP7Kjm@ǆ7 j?֒q?dP/4/Pz#xX#GGކCct!ƺ հ(O,W`#}ѷgx]&T}A$F7֏wr2H1,G0TjUkVM}=
/tNڼW:W`~`NV<{Q:&~A$i{wKОz$r佒mLŘeOvNwj'.
^u/7o`]l@뱪oAǅyb?KZ*3̈́K}h8t߃yGI'͠@S߻+kNѡpw%9cPĝ 1N9G'p9<h>7VƨM(M /#
c3cdd)'*;qAOU8V{ഌ6d8B%JS+iOyLPݳkfŘ*Tۤ\S,XF!W0Wugn6(ㆰIaymKhu0qQrlz}欚܇~9`!$ӽ36TpSaY	1)=K
@vnwZo?pwZfȍxUO<BͣQɀ|}q]OSY=sC]ۄy>U'd8/*8&t m5+q^%{yW9ܛ
0ᣵ
p$qsĵ@ѡWIo}Et3	fl`jHKèdֺ*;f/wΈV="msz|zkb4t5t	6UJQ9N=.F\te}`cvO:.ۥAtGiG8_{NI1;X%%4GaIsP6tQ>_Ȟq=W.@"k)ҨDja<^Vʺ3,0G=LJXBY		uS6XjZ~j PuUxiDI̥,@ۚ8%cM٥3GOS=t^?#/Yonn
˹SjV̂I9[@˵W	2<ȵl wo0yM׶D{I<f:!_J	<ZDO2ݽߒ&VLAx~lJ ?՚<Υ,IB:ˎbLW[==<>݃fh`AA"+dJ?,,|9OKN5胱Ma|8x!+ǟ!r̳UK8Rj+6}@g)zZ%e8BX,/|Y_:~e<|F؏|yfַ}(+i0SΞ]O:
"
;0|sJ˩_fMa>;8bf>Ԡp+K]++Gech@l?J
u`'ESxQ1fYG|iNo",r`z?#8/ LV7iP͟JS] ~` N4}Kr1 U`N{Dҋ` ׆t،wF>"ՐxC<u##iM \oe>{+ rw2ET/%/)`Ph TD1HSFQLE'VEBs4=ZU GBQ%#[tA>UeU6Y+RKb*'զy^tKZTxh(,'hH6|= (*q&? p{ʘ;lJ?T(6g§g8FmX$tW7;W3ܒi`o<}![''[ۖ׹enoɐ:7~ڍm(z/)=W+!j	ȝ͉jS"wPTQ"lx<L뵴?mG$ JHǮ~"YPxyDjǶFCH2Gn<*5,p=1.@ST_tZN8̢qVo"
K
)%Z$E
|oԻy&e	)\K:"!&fyr1&Xiv:*O]_aCmC$7*d!aU*_Ul?m!MܫÓ\2uԃ?d$ΣHi@lKqmq3xܭ=x%@a )<3EuIqwE2HVh'esXgl^2$aۖ<߻_I+|bKN|V}Ѐj^s&%qx#$۵1b	h ߴacl-yt}3VatW|z2
C8 nX5Z6?i0!婄ҭ"񼤫Yr	)wW%m`ƴfy&Iw1Ģ3\]#uէ<{Tj4w:tM]ecBoӽ09?ޅXؽAl(%8"VzNI(gTT#ﳵ (SJ+.->i?."ǣls+ShOBh<Nٵ ;I=JA+rSsjMBTS*NhZtT_1H2be8bT6G"tj,\ߧ<1x8,ɷʫb|x,x/WrB>e'ҴLafiZM(8WMqs[Q,bܡcM;.ЭJ)=IxeHj?6.h:v
<F<Z_FJ{ *Z
g){f%4Rz	|!_ـ4"?.o<T{ڢ%?&JqML6?8UX-y:*}
|:T6AļOWPnjK\mmR`]T:%W#l`/%t6$-67}lUAQrm'kKԓ]>>~Z'+9_e.J8;ʫ I&ViJM}jdێ{E"+vr`eR `=kϏy|@Yolj"oa<c8}\zUD"CߚI:?6Iܬ`Bч"b⛫.rE<fLj/8q$wĻz* TZ0I`&5O^)'-EXa*RI&h4ĳRcErۙ.`Iiʁ|MʛhӒ7GC$)`dBwY0ґ/:4
!JPh?s&[poLgc*Bb
m%3mk8Ly8*=Ql ;(q;Uf1u%>vY>E=cf߅'+gbJkG!(Ufe~Ɩ[q[C`NG,`*32^{.W4VRhcMbCi5hya5oy!ވ]e'䛲{~Kv;qzmÛPN:Վ߈ELГ v:ǀ.>7!(~p~drOMGЪ9{Y&{O]0Έwwzsvrp\DZHn2\O՚pT4Sc^ǟ4UsZ
ߣϼGIk&Iՙ:hQҥk'D,4=г9Ic؄\
Dů,4f3sBc8wU:
c,51=: /e+:gqup\5?`mB`+$O;mcZ1>ĜGyk1W9|pU֟1R!j0{=5a~SP,;f[n)dCFxls2v4f9ִ.
eݑ-lKDf 4xPRЭU<jy%"|;QO]-PmOk6+߄Ttk/u?yE>Vי2+i k40K2Ȧ)w,Pd	vf+d;Qf1Q}`N6o?n`ǝ@HyF[0++޺sUI|+v=./Ea*9nA)E-!9g[9i~\Y0Wc3y|,!0-8>ocex]G*xLb(F{k,ʷQSiOt*^ON@8Rx}pwy~ymsl++x@!8:f$ԭ_rQ@?Y\4jT(SruUx9Ձy}ܙFۡRh=hPxwYqqk^vι q.
_@*51s3k\-?}	1>{4W)vNVb2פ!N{Qv>o _+M`kMJ:6/ӄ'1dr| (FE͡?H*!9o8r.tIh߷ʘ=<6bGv4N-Յ-XR/2}:mH<|K9"|E]N!tN/E(1	(Z Y\sle!01;)0usv,cSMTI>iTA.ZFM2FZ~K碎䶩RllG)@8-"sf-jkj!D2 Rc5ˡƦ pE^x''!mW_YÃy[os%a&l!㖇RJszipG$+[dk}m&uw.s1V}͉u c!|jo7n̝N.qחñBDlP[VsQv3''O[Mwe#z4
/</<(?&\5/OysO9d}3{ዷe|2ViC̾j^sW?2p_-_WiÑNELZe
%[*#hۂ>}c_Vuvb$6%5\.
ԑyVʂ 2`_=~t)HA̋*/||d/iYE!S{b6\"³(8M2%ų4i\5sCer\k9@z<bnRΫ-pꏥ;N?KfJ
f9`*E;1}SD{9J%t߯MTc9(A>z:*$&`|<xG1'Ոg6~2_bs\4DⅷsO/W&)/0ĂEe`^rփCAϩ)5p!V	%ۀBڪROOԊ_
!>#֓=>bT%Ń9mfor	a[Ha%ͫ<b j/T[7}Dw]A, ԱRcLO4~G%*UA7SzDO)8ܲA;p0W4ZrIQ볋Z|}veo:Vnu(QXU"I1J>L8(ݼer.'ӧ|3Ⱦ|[~+TWxT=H+@XC7?g_~2YU5}*	3gpIZ?ߎ!k7y]+k^{>҂HxKF}|j_C	gء-$<kGA<Јߥ/&0idLoգV7ٍQ8T_w|e<:?X2ds|tnyWS)׫J<愝6|ltձ#;ތs7 l/A_X
GBT*،1A2 c]БJc#S1HMcW(h"Fr7	ަG
V,ׇ_cI~\.	΁2
gXB3w:!fV%lc9kyԇ8ҍ!~މF\jHb"|x\&mYyXX|J&'"l~ul-ZprN1VkZ;hpdR7Or{ֲH޸`Xf~>u7fuMǲ/9؃ӛcxApsP?-={ퟞ8^#̥0+RYM|2hzgߊXPͦjqrv8s9s>.#3wF|#
XOD?׍`=k{b#$RKOqo=#9J6=EQ[y^Вz+*6cvǶ#!.e ]Ոbn?vqWS0V븦)PQ$HZ]9DWe6$qDWeaz/t  l? YGN-zx/4Y߈Z$2R# BEҫ>
\:EWyy~M6_u	ƃH|Ue
=GBo{WǗJ7{[W85c%)Y~%!s)=X@ F,\v1::T,e\n)ϣ~{g*1uL'PN|&Ifl&Cn1Z씛rN*֒uv)+GCyĻs}@]4EvuCaէ r#V:Tږ͍i[Y~:>XD!7	p224K'+*bSAtdGоfR\w*b'll:W屟Ap=L1FXxA;syȝ+>%0D-	8D[B	z0/iCpy8:R[7 LlGYh >qO5i X80?x|ka)@0!yt?2mbMC5[믩*q|x-ڼw.85i< 2PMM{[RK% Vy驺 op!|:2oEg%r#0z=ZrvsKGVnv%VEGB'D])NN[:ƃ<f< g5ǘ+Lc6?q6muv3p~^jmk Oў&M/Nwߟ?{t~($뀐upnROMaacoy]ͩ+pyaz(ΝpKUJm+FPuSArO~fFi`R;S)G9%uNzb4	<$37\)r#W	Ǟc*PBHj5 srP	ar)r!Je0.=0;GTߨX.lqŷe2-MMu8S  9sϽ-A&.Cݟ^k\f,EG6\ݻ_jmUDŴn_7zO'?0c[W
3{5:<]/stwzZx2:;n{ %NiSA7ߦ_K'%>1{d::Jwj2?oGgFy;v:hz?u%*2E[=7>fC8c\tR`TY&iBKmnyUӃiGBvpF/G&-rbPh_$&a63J0?	$Qb	GBf'~ п8WAWtL@hp$PrK_:3~I2\{
H;Ӛ~jXĸ!?&!I Czsxv o3N4ƾCD'um"KjfgQo3@ֈ-CiʒBRv-8?2՞8Iml{.]jhLR>kԊ6}!_&|RrqsAMLɝ%vۊ|`рY6tYl;탊蜷pIOwϣo3rKÊOhB;CϤH~S̗R"`2\
{NB]&O21#pІT[N\%yft=-R*_!c+њރ|$|ak@;Bt%hB82ep":P;G'-ߗ|=49}D,O+j> []-*?ۣ]oK$ׁXxY(Esc#G5:bk=%XSr]
nyo[1VJUX$j|Tг{rRRbkw_w}8:U{ FNz;#h"nOf:.I NPLoz?ܻNR/ Y+^5QK@-#:1^5i~7	7Rbe]rOnm-Gtqkh<#Kyybˊ">r:,j^L2u}6G?
Ub߼jOi@>0DCz^n]Hqh``hKKx~{wc4KRU6k!n#\ǡFOtza[0_}?C jΞHA$}fJ'_	J9TLEF+3{"qM[c%`IC	{6YaA^ux+55MA:k0ͦ9Fh[t7=sT1FBX.x~qnZv[W:9U-B=4-y5 6{c`x'TCC'j 4}HՁ#kҵeGPϾ @(>^y*`Y\n٤`4- !#	葨R=E dF3.6eqXxd餋ljPGE2rѬu۫ͰRz-̓5]Wr;0l7_{ϟKU;W̮PӠZ5sL:W-7j6*gΞMh܏EL'/ͤc</aYȻƓP2XܭBר􂜣Ẋ|Npw/gsVrI	!G![F|]l*NAےK^s:\PTJjޜ^ޥM_mߒB?jNaLXf{6wC\]:1k	H]#vf|`/MɦwMwj-V_cDJk}7iӉgñ@̲a>ZH&@\ߘx/3~L֗OsPL$d"аh`l1F,@"(f3{}e@z*Y}gߣ6 ) Ļm&Gqa4dl`2q|1C`b0Vbbv)֪Rb]Q.{v0ugl%_aǋK&.\hl.Εig*k<jF]C.7Ǿfh@/:s96lkEJH2AޅFZ\VSs:;I$-3qI4nP/8&D)\}˓ِ`XU~X|d**U;,8ceIǆ dv;ЦUҠG51W۰lHґFZ@j
)SQ;g'{$q° fq;3VKE̡Ƕ?t"7 =5O:u_	TYdiҼ_,yGޜ>NnIvG~AA,ȅiЗiXfDb$]VV)0SrIx"W29G@pM02nChp&$1,"陔jLdRY2~`~~xpKEVj3i*yo3~'O'jP", \Fg<!uhxqfTӂ;݊Ɛ,SoD49;FFǅnR(;z|5sSjaPް."lA92ѹKpzN,|HR!Fd`([9PxBSb
[u-ޖ@FpL:snqJ`8o[!,3ƝO+}nilc5+\ηg۰1:OsG!u]3%jlBCnڦof=߰ J\wj+!&82<'vhKw(_g>Yע$mxjhrhIVfh4S>Mc3lBcj55>|͛&^-g>GǾW3u,\&3,LŴf
 ?@IPJ\W9{%ݎ%5h]/F*nKC5~#َT91SeV6oM8ܹ8<:y}1V!_R.ºS2MyRq*}c\B	@{73-ĥeHudnK)hC 
TOII;?> oƿg@ GxkLz}ׄ)4YS<m[8M3!~/ҤIwяI٫MVwԀg)wPRi74ԁf^XGȩAxʓ5"ߠ[w
g	갲O7^4@u8?0Fv1=kp<=K-F{jAG|h砣Qh;%%OxwۘeGԯ\Ֆ^XB3u,Ya1Յj([KvF.˾J٤E\HAǠ=5o-#>c:_Þ<=;8@l
FHo3*OsՆ_8U]xܬ_`2ݒ,"|1)FJaN3#%sp~iPF2بF9j
Y4b4`I$YCp¥>!%e}Y¨ٻۮw?ػ@'IEyfQwZxӟ}^Q} x왥0^ZMfYh{KD5FEA7HVg7.b6hRpݛ{@h6'yEp l5X4Q^8`7w _?|q~g!?8~z	i0ǲPP@dv"C{oi-aFwM:?_(}y%:5rɮLjNl 8a?_(~_Vf^*W0H \
{YsIYjXZ5EF47K8N^y$\tӫ&ld@3tw1C~?5;:fbdkF?1 F-%yQFU
7d:2_#|I-iՈCc,:5Tl~gHuUrߜ[Bz0
ֳ}+Y1U)y3k(;<y ї%W~,5T'2z]bn l.bwuݲBi1?2AirJаvH4=CbLl"g;&zL8]~&q45|g#v}mmpdOQZX,z+<UtQ?}G=48𛿱|C} {Vc*zpRi~!~-Jk~X]GAzBw@ ץm?(QW&?ܩoNNϼ\A8H7NeuGn=(uH_L%+xa%Z2>
KqL"sanliw:p愧Da/"N/EiaA2T|E3єohvIRefCq"z~9ڹiv:	xx>m^bsS
?Bk/ ~·nS	⌤bG9K.꼠L3ʖ-9W2nElerWJgНM@f;Jӑ{5Ȫ:QA$A2MlJ%NehDS-dy兰mΕvA*uD_l,u?ϬR֖*#U:}Gi/)O{'}surlk!\SuLsbװqK7&|nlPX0iٌ6~6q{&Rl3lW%,3םܷ:< -0|CK+pn-tX< m`,.iޤ:"XחR{ovzONp \%iX}:Q[Ӓ H ĲM"^up:$RNxG'(oͻFmGb |r_38FxCw;rBh	=lQ(aE6K)(ݸV
7.?k`qHs$^s@.6Ͱ0g'[߸%l+̣꘸C?b#qxH<܄JdK$Yf;T)v;
g{='v)pO .:#Ŏ|Ѓf#'KCiB;?UU]t{- J\`*&(NDP͟O6IP֠4BZ톢nO*t&YsEjRr0p\*?:
cĻ[IrO
AПvp׾_#wy``6Om$sHAq԰].iWb_b3SF~yQcdV 
O[M^eKlmI7݄Vήe[<L{p9 C6b><htrx$I(K+5~0;Q$y8f~"0~.CJn?Qi֧ICgG[ʿj硠?h_4HIfͦUҽJZޞqVJ[~d5
J-ɅLQf" 3h!u  ԻsƵ!gsqrN*J`P`US^NU2+kn+0|=څxVRD%&}_!khC4H_f}F2|˲vErR?)*)andO1OE8Y"i[L#|i[i䤜ԂXbxS6@DJd*r]{e0/ƟIA*,9ǸXI7Hlƒi9<p_>N:Xi*[ױd%t< J.Qq>.ɩq.	>SWԬڙ"BBBToT5hNgc݅jV=gkgn"Y"љ+KO?Fm|!c!94|FƷo&n^LH|ihKk794B3S;dZ!QXTpHGMI2Rwr:J=*'n-/ذ?Z!b:$Gc0y޽wOqFa;Qb S!mO7 9Zg&t19EhDƄ̙-rqN3|i[2lӒg`|4;yЁ-̫Q2;{dm&.N9ר=';Z wkM%ApعkYY"G*ߥN;,#ta<tk(rQ[
>|EdeVY5R|JskU(;4eZ=E
ܰZUM(=zjpA[f%h%D{XIf
UvƬIaDó#NN4_NcC1w?qVUJv88Mƿx7M-`hK#-oi^yǛHj'%_m!nxW,MCSxs,BpzJ@U-fILZ&|jDhWro?\^/G@XL*2C*	O4O9.-MAkg6E2 AΦ=ϙr@i\K`\ke JI,f4z5$\ιKwǆ?}h̊G2Eľ^pӽY0Y0M)6 GedtF<lRMk[
Q츕%с-d#OvQ]ED΅!}uAw-@f43h.b[Wy)KaIDaS4 A`5Ī~THB[ ߎ",~Eɖ2~qm0 U^<4jaFa1AfBoͳG[n2cܷ.|N_`ZC:dˉkutw9(i">v!Wį+qC=x1XfQki+"ѿu|sӲ1l쟢B]tRx!bIk|s|RotWn42%5Qyãs1Q1鵹ϔiT9>ôW1𰷏qCpr0,jCQ)򕊩hi[|b5){/EAWZ/gY*HT"g)͕ߟcO=3㐿m{së
'|T/m@xl{@o
ojI5L= L$)xly'sNnNY̦G&))vJh̺"̭ߗJ㡆r!|ʚ\
7w9T[R=2ovX-3$wE@+]IWwgOr%&;A?
Y=!Yk~8U=^>;ҩs-D-O-ީAٶ_?IZ"ݎ	ab& X$~fAĿ!U䁣ª䗄rG9)'7
I)g%)},ۥ$hn4_voΧx:$I@	ƇimrtWE贡D2Gb&W6%`7L#&Bf:$9)Ȟzc!>[G섟<7IMFE8C{ r)l
TL&Nh.I>d<ߖ?USKSNg3Ac;`/*ⶤC>t`^=xǦ(Tg׾U@z^(R]#G4VIXTg^4 $ݼ	zx^|ıìYanLJ{w0`Ibc9֞ѥɆ "U<wUlPȈ}q
^ef\$o	4 }Β.RP ZswhZEZOv4S*p]71 :[As)k+h[A%{9:Y62Pr%g#
pvH-O!/2dϠ9"uDy!G=	Z}e;Z,mxRmmj y:@LHxxXQEXAsa!VqN:L8e"9&Q?}_DU+Ne<|ET+MC򶳡CH~F<O_f^^OW	3fݗ++HD\{.ݴuR2 TI\="9ΔNoᚿ[Y|yc.j@@'}g/R30?
tf
ë'zN6u?
sJ1Ҍ5LU&*UPj\P׎ b˟6%7<@yh9Y(vN<γI2&dX.ϛJ ez7
xtbFt4r	~`DEPcB˶6xBAۄjYn%792mڕ,pZ.B)TI1J5\R?cM 0:L#@bMaw/>.ofFlyBG[W/L$$48 pQ@T4ӗ.}^%sGPgc3A)u_iygB wl92S@((D>ABNL6(m0T`0.AzɵĜ0
rJ;?V HY`*9݀/yAAtS
9<[}"ݘX$َY4x]!=knUdg1V
	HU@L"dۻFUU%)Lkk^yjAgKl't E}sSp5X _e@rPkMw 3/%\3|B).2r^]Nd6*y+ey*RvGTE,}ʓNp4(Yk1аKTIϚ&FmͲI\5Hy8+&c֨Q~FQ/Xfp<.cKU靓=<*dݠiٳ"Cj?,1貿BA/r%@=\._ptʰG/V#Y6YP'(m*КJ'p [5#o
J['iq!Iϖx40r?`TgݻDZ{7y1g{fPkgԞ2EbB,!NLmgct0a(n˚(;fxu\SEқT>u]qj˝@
h%Rp֚NSmy'^uskU;㩛l.rEd`9ReϽiee5bӖ
1Z!Z'rt)OT-;bW>;z>
	~c!iP d/^.;|$wbeNQ3%8
JE%$rI.o&uxѫm$P4*81י D@Kevi`y"Gu}ˁQw/#j_h*demxdS#+)9?Pf֝mݵh&;
qHOܻAc\uAA-w56cf0%HHc^2=,)/ӇyICUz5g`K rgq fD߻EA<VSNoH%p+N0LFқ*\[֒r7xi񾣁Y-vtŶj3< 8 vo`-09)g6ӣp*m)P̓Qe7꺨-?
~z7KY.9y䒫WıaDoZ ;Z˽٦nI=(_ā*V
MQ
*R/UR5j:˲g4lÅOz)C4ޘ	}T=EUKw!c~ܣFUp-ZB-9::uܾTHCIf0~\QsЅ˖
j@:L()\S#a:#FCҁUJuM ޏɎd0NXQI"YgIǡr8}_:^,-J𛽟+|5~[OD,I!_*+W2oܕ=CX&aҨƤSyqa!:-C醼tW9e]JzCv\hQ
1&䕥
I%r6<(P@زjx#~_=VC{}k?YRk屌^pt	,8¥<q?#&f#_ 	z5[#4x|HfEMJ~	2P)L\@$znbzl$f_!}w.c	EV"KݰsOj2L= 
Xᄓx='g-,'TEq9Q%ʒ*5Iҡǎïf!qL&OAy|$Z*@{[gT]IU9:99w8dG"ݱi%VxsaK K.fr^U*k]v=mzJP!+FYiza9AmWIsXM9qj3^gBZ29К%aUŋVh2̮բz[7+ա8*/MRzziI'*.sɴBwNT}/k'@5	ǯ
d{}kqjF;k?WU熮UZx{y=+WMgt֕yR\ 	'-QݶoEt!9dtNiC3&#PN3
eM}k?L^yDd*۪Y<܇)2X	w10Cvo1\fd/>J-f3} T18QpĚun}OC⃠xǦ97n߻EX@O[[[NMܘQiiJV^(Bn
GۀZ<@{rqP\L	 
X3k:!`ZPK)lr[iQTk<b]
52;<*xԯϙ/eO>1.}9Y,m!1P?4J-+6EQ|x:(z3YC֥1ȵd޵p\Kh+.1oҰ@PL9zݛb6dAX7
6	DժʲcɾAt$IH`.Eu_k^lg*WFP	!l͉_S\ل3#tڱ{CJUf֫z%MDo25Vٴײ;x1QBxm43=n+옗_l)]eˈHER{ڂ+Gh3\3tN9!U$kI+$%'!}l,}VTU05Zt</) mEdX[zDMi-H5bĥG~v=&lb^,̧Qh@
2VK=Q }uMjf}`Y
`n~T̡ Ͷ~ -@b/uAh-\+yc4C,ݜ#g}JB)])#ӓ M[-eȎ<\hV~#)/w/;7{nmmTdzQz5le,)|C}p0礓Ӂ%L+q
P&qЪdlQReծTօ9t6+LE,5>.pP{i^~."8D=D,^wʬU{	_'I>߾Qw0*"I\SB\EQ}J$WZqf^ƣTW\d@FN	)9ǟf(
PQ		&NomXk-yTA?';"pfɛsYA% 陸mlZU	ft]3։B#	g1?֯٥I>,[2
#pLWR(&JنZ]Wx9w	MnH~ CP"e)urtBwI>(2@FM^s;̦[StOOv@#uG5F|6 9OޙxN9AϽbm,zi'7r|-9g2UHjcAڶn=8 |r`<$≬!vHUvcP]iߝJ9jS4lVҾ٤Fթu&Υʪsz*MggID1f0?*8Re*9r938	qLRsc3/uWl
5;t!y:̜3|e$0A6@lH!&9Q*omPhJ$<^pkiOASQLF\_@A7MiAվp؞ͶxW6\h0JʺMςnj{IC\W7mJQyD3hh΋O˺4n W|ZWGc:"Ģ0t;.$0̨5T6nPtq7JAb<]i5I龑-DzR-c0Yao@Ný;#`DX`#]GLzWaǈ3״p0l:Y78h'noK=[<RGo#!tuRcܔZ5OytXyGkdO6fLX	k)9,ZBW6̦idw?r$1jcluc'i$NuD`ğ?Y AzaSB6!HL7.ML2s>CsZc-A,FjKQ
DwJ:8̴-?(%~O/[?}Iړ2VdQu-4[_aÜ|!D/?Dy#y"[}0K"I[B(̒I٫v
6[/AuWEIО@ݼ3/dw#BK|Am#ӟ8ɋ@/[[ڤJV:&@%YH_ǂ0ʔ"/;" /ReX k	%F u4e:jhkݦ ǖ(եn9˧K"3ig2&	 `x amnץ!(3[",?Q1m})Rz4l(^@դ}#C*\`[6)$%E dt#xlN4qD|5ȴ1KFSk7.}y'.p6\ȱ$^" QWJTW}D7`?ަUnjņK%X3n}^[!}_/o`dd!)w,,2iҞAt	$#֊ŖOP ¦!N r)AM'*-l".rc<hI#U]yȍ89㌴$֘PxWݶ$T3x힫ndQ!zh0G[_|VtxQ
yr7CNN;TΎv(ebMds$lCdKұ$?|Dܷeo4d=R,z\'oɥ	u?Baݎȓݥrl-rKňTcp ER,ndy1wtspt'^wZ(c݉j,Fq>VjCn6f>z"0"N$#npJ#6[z-b^7Vۆ3l痫w; D^Dė0ڭ>+P¬OF}}uʅ
4?$/lSo[n5ʋ<c80H.jQBcIgtTW1(\<K^9L\yvSfay`5Raĭ[qּZ!jzH(xV`BFS:eWL$1WILhшUm{z/~7.N:6%3w.IjKiTu6sFRu`&ewѼ ^SÝsWMԑ$m#NX1GTzE|hTrPxK^OxYGpd)yf|V6m1sf *r궾G{''?]n'g-"_*3qy_<_PޗM!a*BeWo9!#F2~6{ 'єN-zO:#-gGkۮI@1@1ŢZKTڭo6llf#F!BH=Om|oxxb̠Mmm04<OL8oHW߀	[AK#%[r"BˏԘ/o/,XowH ?SਯEϥ3T\-a'/U5)K
NL =(#'tp9	I s1ǍJA'o\q.wƌ!P<fD8È|ek!X5BhSb`v۴0>Sɺٛcbed[H5S>f*b!ҋ;l:LA@^޲Lx$'_#{Vdj;+W\~2%c:O^TG,]<0VspZ] .(zj/hK.$&qI&Oi^
0[hvI.K_Ur'+JSJb&pՆBuWu^{&{s7ICy./E@lpg3aKrу@i[?Kh U@@\rm!PfiQ)]\KQ/Ҋ%,(
tխH]7^l!FF`IXG޻cg-Lֺ}8B#,a4wG]y=yt+'̋%zz'7 4r7vP VQ?W6#QyΪ%pĩ]j	dt׽]mI"ÐM>g~G鷘r[E5 =גAJw8cGg!Io=|5T_a163(Y}tWDl4DFBYꕝuG0m9! #ćx
Pb;Jd<5TB\P13C;\	]XUUӫhvye}3D@QQuJ`男HrJ!2$2><:{{t~	LL+G4|(/	jyKR(}Q5h'RE;/:l>%) =_WsWZzї1:N7g/q*PQ'χ"ZBX~I(>K&}#~YAw{ʂ?ЖO袧&g
4?.՚Ka5fb z0[T2'J*DU`־d+xg*[ߪM]};9I;lb+
ha{*zv؎,6ݳSFI5A2*R2d;,!߂ڈ?&%u<~}ѡG~}(p
s|SH>]26Ml9m8B	K,d!N̚ ܕk&"'t' C&)<駷+c.1h8B],
_,>
YǟxU[haH4C"㬷[[,p!a^ `vd@tPƿya#YMZpPiV#
UJɓC`xA_7$iTiB{Iv	~gq:|M/l*FAM-"WŦzwV*0Jbx%e_K&M
Y5!'^E֏Nr\}{^ͱ#8*57}CϼAW>mA9XNM%4@%`,/H?!}gTXNS0s=,-J8h!n'm8JHOF"Bn2
M8`3pQ8R@a>G,B%nUb[ҋHyEYgӝӮINDdQۆ,/BSχ"ߘ)q\Rh[2\(xCM|-K*g'|h}LMptNy7;ϣY(Ŗ
'|;:Yt2㞫t/%2W Nܢӻf} WПM3v_D3H66}bq8bx?SC{لy.`#-t
Ҿqv!e)ބ|9<celm0땴GFbO$F3c r(ȧm.4Gj5Shkrk=<[VM^k1;फ#&-l> 4ڇSaU3JVj<w7QB$$>ܾGdߕAb{Ь4zi	;܃ߘm.E}6g?k|jgsI!@!JP'#f4"\x.;fO$nlS]\{o܍eg=$Q;,A5]'pژՙ1P3)Q/*5it>#p0QeTJaed:8TҹR'#$*o(\u` C[){ZFa%mO`V:RЪc^P)$'^1e-v#|?LQtR#AgD5xS-'Лy)ǾTQNwm%Y'_^VKh+QTj\gy|<Z`$vTf|I&(g9PL0	q4͡ Ơ,l_G#ìkX\R=Y&;"^0	P|Ǽ +H#X**ᶑpMT7Ak	ckp[
9`qp.i^`Vo㤌d"1EɐifpWQM$'%ީgBc-3?8iw]!\&*YUI"  ,uSYFjy<ԟE3$)^X'!/@62;'v,aݜYr!47WH;d|.^H)%F0rjoh*K-'޺>-yΨ:y:9K~0(gQ7rnAvl7@y_g72)U'uira<Iq2IN5|x>K |΅~z8H WMyw͛rr*h?'l> L|~:rCN؜7X0T]PzFқC5ES`"B)YlRyň驹rON"|,4#1Vgy]+QܬpiѾOp ><)hkǽ/`<g}~k	"`G'^UJ#¤96t@mt풜'?]`Q,YRi{x8qbM/Pot%ꎽZM7T^Gb{SpP*V>Y~ޞQ~۲"!_LF?d}%	+.)ODtl ZhC 8io{) J)>>T0+KgQKgTfT-60r)ɓ+u^ʎYܝҿy?n1|_y8'u4`(՚(r,Q	}ռe~6)<e[6grb0#2%#gLjѷj/uʙ! $0`
?7E5t`?(( lW8WJȠ`:6o
K(S(7]O u1?o0{J߳>$UڅY!+3,`Ep	A6vG62{NWΊt}v~ʦ_KSݶN)&٥bk.dtk8Lo`t;<](0Mܺ6.Y#MK]@M#v-'=~K)=t\̆dul <%qmlUh5!%,R[p ejqk yJ@Y|"jXJYR |-At(4rOie;yȲ4;3
g}6V|*&zM|#x`p#<1ꢭ	/=B* Jx6B0h6]V zIaoO۶DA{5~|8~dĖF.e.lw/ +_Ĩm]`+bF.J*wG

7T[uWs!d-gGkk' K0kfYf^@ʾXb<vo_>fh)\!^W%H:Cƣ~ZڛCeI73^nRP2z2Ǔ""N"̸:`>)Vٚ"[2J"اO앲Ur0{iaH3&{cTRJNK|fqZ.
*@N@;raiu/$ac&[X+Ό~89?T"3tXFÐgF@GI5Z]*zҝѰ_Bfe4M
FSS{lowemr x
aJ*zPV*n?%3aYjP' ob50S9:kGm|pV nI&I2%N[2P6[ \&%[J]<Z8N˫uU*F	DVb:T%L7(ydr @XF.3Bh헣F缿|s.b pDp̋	0/%r{ĴPψmuO744[58xI+fX«f}֌P8NIT="PeF#,G׫M ɥ·,t\EEkth f)e^jraڿ&d6J/Nټl:a4\v0Tp
*]ި-_x֮~M[Rj,uf3<_a?f2Aí]Adr0(ahѰ~Ħ9$clM흞5!}DPnu| 6t\L?)$[>u`~S#㧤`Tၦx<f1cݪcm`#lmдsCYrI|4G)ڜI+&XU +եdBT_)4(B6v,:U=܀ržۺd<bP	o1zwwxwz;z]f`(#+W'(wuU
J{!Z
vdnZP,M?MWѾչ]}c*C릏qbzMT'N:pBL×m!>+ۂ({1ZkAc^\fZ&'3u.6:P.dMvKʖ\VoYe`"":M{rM;n+)Al+&W;DTRe@7ni|n1DTy4 RF% (rzX2af8X[k!gqb+a8nS~>]ǟe'7?AC7rn80o2w'Raz}C}gvhsnŃ*9F3A+#Ë!:2qռ
EH[|p?a㕽Evk8\edܹ5vū5ЏgϚ553P+vhrE"R?D1K2kމ6+ @ Yxbtϓeav[gi4XFJ("TEq5X[}&԰n[eFxi`^X2"WQ;["5bp}ieYvixR(ƹѹF.)-9quԋ`Q5yww`Fz[Ri57GG{ۇ`Z8G FmiyssU\PTh1h fفZ&aX#c1_/q8X?ٜR%%a554	0Xi=<uYthQ}Xbhe F J|"Ԗ^$=h8sb$ koH09hiJZ-(/|xF V
Hz1A ϟl=/lx#rKr8&P$7,ySPW#VBb#.~a+*:K_I'<g!R@C7^٩R bTwFcD
 OZѰ][s8Eh4:tP}Bd@cꇷJP γ>nXceۉ[
ȽH) }IC7
}vM7<
8t-Iޝ%o'gaf6)3V|(,ި7{ @a/ElwɁ_
ei`dŬ?-W&SO.ݖָ`8-?KzR/ah&xpoʑ03Í~tȖႵ[S\pթU-[Nhѽ 7ݿR;ut
ҲKt,J JAd>p;: T!*P9ҊV!'{-e] ) `n]]fI8NGI>Q,J&n@VH|G	aR} 
J(T9p.uI@M~>w>65¨1iK]GW;ׄ_D_/z>smv|9}<7rj~q$+cp+cTg&ab=fy80֟Mq9RyThc AS{bP:;"w8\WL>#*osNK[8pssvtx
9+=QEaծE2/m3IErߋ7a	1G܁i KѢT/Ghs4F5SI*U0v8pH/2c5(u`<`k23VGEQ,2ips;m<&
|CKU#Wc7-EfϜYt7[?&CH Nb0|т^D!hA8+8Gٍ`##(6E*o`P]b\vje߽75D[Vڲ؋K=1;?  
s?z&iߠT>W|8bģShG	n RQ$䞚Y JO)/$-hJ5p!Q9cB ;fsuy^;&]o	mFku?bd{b	U!ʇl~X3[{>geXC\cۙ3"́}/@SQn}C2.,Cij0]M`_%kgu4#^zۆ{1_yaɢbZSjpaI25D@?Zl5`J>npDm>s"-!|A{uueVqLˇudkcB ;fQօ|dCnɒȇj746'ϐ: AnPoM!EnN?7T870؀OVtk;""c/@m䖖BΣl]8l+pa<wtoRNb))]1Ô6162}jY}1>Ϗ-gLZ]i+D)OG@܎+b ~/\֞;v^$`l#|8u4>v*6NHnw͹.d֡bu2,ѷn+〗55Ѽ0rBpsomjS]	xyH82:%B3b'>b0"PpDmrrDА:NCW5/<B|ҙHT4=X.9:zzQ]NnZ6,Kh`[r8[$l0YCt#P%Etw#|3%I+8'b\.[}Ȟnw߿|=XoJ\,b"TZ74^}Ԍz-̞zX)6h-ZESZ2{to{
9A,YVіi-PXb<@Qc)uKzds!MIQ[j)l7QA-]!c6Hsm"ج/}z%z K}eS\8^ok';SvD5:bEzA0e2u(H	-ܐl% .QLC}gsUXɾ,#giگNǩ-f]>HoNhu8W	Hki P3y<K6^46or{l/RZRkY>"GS;[A{v,|S-mΪ{Hk/,'G_^VLp?zTjϑ=T 칰&x-KG%xC#~x51	qY4;ϋ[Ŗ;°vS9$ķP=^ԏIk}'|${dho>Tm.<DVq^m{Z~9k_P)TBkz&qb
?e8bbpHwy_~T8snV,'y
%+2,YY*H~d^4欟7#b@ya-W!ꣲ` !߯OCDfk07lX*o1B/<#9b]\/wQ*I"1%h%Q80[ngs)a$eUoY
[N@OPNdZ6I=Q./c8Og5`CpG| 2Ε9/B5rJ(ۙab(=H!t7en<J<f^փëav\5u~#Oְ9XyS=6QAwAe9Yц4J]qòE!n9sX	QbjwF["矛tcV^]M|*sU|VfDڢx--ѷ[k~2-_v.1\#͝W3x.?nPȍ>UVXU!~9ϭf9;2'g`(7m3DG;@y]ߧ&uh老fUȗ!?6[K/_lckL6nlfIFqd≎uxK%*9JOdG#Z$K~-yjYi=6p8*Ew&s]3`Rc+`Up2>tkf^Cc;[rC\_1u3J;raJvBCޛv枰4*eRq-tQC78n
NqvD$XHW`6xa'7/[؅ 3<7D;)Oe|?e̿Q^4<0PI/v$Hكr wcJ63P
HK;돆.X)Z]X#Gy/1H&6 ̨ѣb'Eћ1ҥԠԯ5սW6>%pTJj9usPen ^m<R%{^a=/Z/1}xa.shu%jT&;uiu/GY	|RnW |N~r_̗p-"\IƨV+A%AjX<gKUWב5Sh; x#?C&k\p^!yE=CJmź~@4ͣFSnDZ	9b'T8sV ͥ|I^beP[,IU_ɱuܹCdi1P]t7F\hZv1Ӂ=tLN޻c"iEA#Np
 VBwjFQ=^9+.^fA;r*v_Gdq
.;iPNWUmVH췂EwI$2Y-sӏcJr1؁?GSrM	dѬR̖Uw1©}tH/cxPB!3+
8V'뢏r<1("YN9l<zT}VԺNUj'B]fN?UA處tqT/<BaԐ O豯%@Xnn35ע*W7O}wSCM'ħA}̓R/y~}SƖ>lJߒYۿ.j1'Ш 1~QF[c;f=%KbщŘ( X|$i[ n)r▔,v_{ZU&c22B&2cz+Bّ<䝣㳒cz[[Ujc"&.1b^V*0|$`\%>_SM\N88BN\C3zyg[άNvCu*ws2λIId /{`촘^9҂j#`E(vfDSvMVPE(};&#݊sVdpG5CᄡY/Eze}(1B}ûu+sTY\P(GDK~uUP=U9Z׼]%=YpTEk?I7:ܡ0]*R71{OƊ^N,=Ӟ.U-%cas9}vRQLJزK';2xA)XVJh;V̀mڜ @:UjŒ|ϸ`N'~Fd+a+>OgҨ:;TULFb6L	r4(#)t6?H%؞qU	6#2.:S:QK'Q	8ՂAx ãaqRplvW':	;d$1({0$0q(7]_P\qؖO}F4^KzSP>	C>bht[愍WuC*
a"\g;Mٷ|pAmQ4NiՓavmw4
WEӽd%y{r.ԴeqAHlSIf~fh;YSoR`C(ٹ}p#$$_U[FC0dF
ߧ^@B_iu5.S%/ 19:;I,WaU`lh
[mY=~ y;ƳxՖILYNN^gj'E˭A3'?A]FRZr)p}xwxf9o%rP^GL籓U}!|FyT(+W"ko⪨T_1Nyl(~%h{ޡ(K_o<uPey*Cڰ8eIPʨhV*]KB2^D[yطD#HpQ9U۾ZbХS?R8眶ތk{Q3?HYՋ
"ˊ.+c$?<h4$䨪~_~'DWOB 0;z
(cԫ)֩;K[4R*V8rˋ<rqo'.\|-STUM\]UNq!Z.F&d/O زYIRLbT0n5I1il4F.  RU֡iكygՔ8jqT;\N:O/{>*=[x R]-dk_ڊK7L袟YRU]z_aw1Z'EtC$}y*$|$_TeP?WQ+jU=/Q/Z_mO/=SkW]ɴY	__IzP0skN8`4F/Y4`ssrA:
N{})ԥɒ)V-@2go$1HS8zPD}9ݴuC6$P[AWF"X]&aF8MvW+QO^ј+uHI	Ry8,HiAo3({L<.)Q*5Uռr z@f%
̞&oހcJx]Lz	tK>$]7LD`0~+u࿽.)+|˺A=]\t2KuMt4/7W1({;~ּ5KVUvpS]H@M22WC?P-8πM3BA?hAl*QoRDJꬆBRJ	p+ܷϊ*op,g 
9:8wxqXx}[Ow~{gZl,-S^1?:5V޻{Կ4,\%O~/G&P\,TQ[,տ7ʌtQ)Jz2ʣ$G ͤ7[Fmi*Dǖ6%qW1f7$	c^>#iYIH{n՗	9e: uWߪ^wfr>gC\5
(OD.FCqM;|	I/{EzM+ߧ,%B1|t6ޗ>"<#na#&nvh'3Я>eO)#ÜfXvp7N7$GSV!Pk,9V2~Q90ZU M!WHs6FnNPrb%4~rFZc$lL^|%h*4?9*N3AEoAۍk=@G9y)_p雃xwJ&Cgb$5-W'	SSvQ}^o))M֮2	+*!T-`y<Uvݓsx4/{<b첺9O3^iFy
aph9e7$<C`r?n JvP|OMm!7s%G|,<N.7ym%%Vbg'e=CDo\.	a^b81fxڡ&.9}7ֆ`+XxCsTpCbՉr^_̽*]UguMAbn8ʳi*'`s
,/;	yye&h:{Ӣ>ݰY=wțZzv:~jSoց?Ad\X:ކfۂ6>m|@;r~;u~~aN^s1Cn0Fq++0kxMi`ԥe6%r31ܜ)	7809pE}{mM"(4iQxYCq&MZU!"RV}cH0G@e] f	iKQ=QS
mߕIV_gfppJ6S ZPZ~i~?vv4Vf0<ϙ-9G<7dw͡ḿeO~jXJZ-eD	scQ8dF$9-̨Ԡ7cF{f+oU՞F^jm|4fk9睬}##?wOD55`7A[j}y]Sż-m~b>zUQm >'~\GDptAKw5 \'iP,g$V9@
ܤ0
XkT/
[ۘRoS{-YDvNX6||-+r ܂ 6  :}r 穐 h{&N!
 ͝K @? ՛ .1 @b  pjҺ	 Z ̛^R} k6 @a  Ej  |gPu8 >o Op!fVu{m[>{lst.3k-).FT)y{ωv.}U	FN4_[._umQ}ﯺcay94d6|G	)s-ļ7OeB3RCtǧ'GNwxs?̞WgYXP/iZoob{<9JK )׺]s8߷ka{[+ׇ~߬tUǓ~ZWDCVO/L3R:Wv
<:!\m:w1:RO48fM`ݽ!0#}<A	J")A֏ պ1 [R8-!!n.08B\G{)@;h[*p7Vi[H4Qs$$9Ab&0;u8 k$~ډDUҵ-i#(F'us:F~22$rzW&ڎav`U!?Wv˽{9+c,Zxu|*~]m!a^u] i>ah}c?OB2Wi,@̕ذ@#xz+p|"wt΀`mwCP&KYXf'`Dwt_'8E	ێ;eI)U$M"1,Gi(ùewu8Ξyꎓs0- 5REAsjo'%&̙p)+j`$,^<݃iC:1S[P!V[EpP ){9`u!Xr3*$rx퐲\HdϿhn,d40%|g}xxҌ:P3k:xe{D/?'4RyAFgr[x#Kб؞B}G*$k =/ڍ}6iͧ5.w#C$=wA}Ei̯9$/cĀP,HR=~W.ӛ䕇o]3-G(+14hx6(O&7_!C7
u+dkEmU/wu{g./ ƍqBj>#Uӻ<)/WR'`P~q"9Խ|m5S#+^|ln'*7-L6ai	t}s
@fA9|×HZ#.NP[ˉ+5ϋaedEE?AlE1KDyV^X$h(| 9WըW"l!Ll&fh-a2jUgTRd.VEE
}K6.";B(@$BhRq^ح#Tx2g $B:ͧ>1g'hC6)j%#ťT~, {(CV%2=%Y4˦]RTWU ?1޻bPãًãW;'OԝqD9l*/KÒÍkA=o!+0ܮ˂AmkÂ~ (#F]:Ho0]aBk̼7A_!@!`l% MVraOa}w.訹Fdx9!z$bu`;0*BA'fE&}İhGn>Ɏ
4Wd' $z$EB/2khq0<]ʩgm`{ 5]e/@곛<Go	 0f?-K P #
=448[9%T=rۈǇ[噁Sqƛb$!p}mԛ0U;61msf\*`l`\7ň ^ÄO[]Go [퇹 Rxf3章XBᥠ6鿿}uQ}O#ǋF=6yŻeQI@sI@wWa	Izrd#	\㽣oW Q(!~9Ōc'nV;CVfP<u"&ʏD,N%" ,U<
S$n:ssT_>Z|\}^I>an.
l r?Qtd{Şׁty3}sTool*Wet@lGy,ێ=ҽY
Zl[ԁ?F|M{͇,ĲH_42Rܐ%B'v0ϟ!iC ʶ%Ie/ce,[v]|,f_¯2*r+3ɖ=i]!<%cI!N7p{ؗY>nrÚ%DcPxH+<+?Iˍ,8eҕ>K8\#6ћ4FˁZ\[}ybϚaߔs4!eD,,κX@ke)pT4aܐY;'Xq>'I˴,/Ulc ޝP5O(N
s
4 `U^ U\k]6O 5'nQ9=NpV%LոOcsG
}@i^4Hg s7^
F!c띓RՍf:+_>[)^BΛ+iHi*ב%0r0n5Lb^3Fڗlc͙݁bjB8)T` cZq_LǕKgI29p2&*~J_9i/9kXUNп$786F<f%(i3{-+-s4a͑aF֐֐zr;guˤ/G2d"|!?0O/qgTfQ5q> e7X\J3 4zfE|߹7heZI<lʛ܏
M%) <Aft
:'8uYM=+-)Mk׉dXU|.FH7_]hPt
Qz^<^Tѹ9}5D4Y=)x5UsUa9_6,|{C5z(]2Vf-(J\pPy$hFxa^N]"PeQdH}iJK{U!jZ924˗=46<l&^ߜY6j
cec
H+43)qEFFՎ-&*Š?e :(fH(C^vDoOBJ۷?Y:l,WA9ZQaGb:(+X7C,MV
XVWu˙ oɛ4i:hGp6If:+q3gU»/)8t{@@/)Hb 6 '#3d9S\ˎ(PQ9e6gӖvȯЌўk67[
Z_nERBEKnbJLFU) %W^Ho$Il%P	п2>lX7WZTr9}pb_V5{6o7l?6?6ׇo}G3N[D!.:&QKn&|}_dq=e7?лuf#ٍkyh_+8oDDR^fvyx&^\>}Wm,RŖ|!=z}i[{(>=})msJ|mSsK ⬭j)3w0Bb]A%9ۖSx[Mg"rp:C*)KBHjz\!aSЦEESepBoyHwº,TVyjE0NҺ࠻+)Ah88Ë!2 C
(NΦgeP҉S	uKZԅ>U˱RN	utț<	:;JB$ o.ߜONo9|T0l3UE28͚3S f\vkDNVL{km(校QUD"f4$YMȂ$,DqtF?+ѕ݉$zHMe]#7]tqMTZP|7(P|:)emCd5,MV]fi:e.Xn`E*a7Uhm64QN~P}*915joo?xjƅO~I[;5n"؟|jȞ!BoPe8$q޺SԁƧ#qmhtu1Qm_tt*kcR̷p1^*؄S8P	q`xcaPXvz$9{ecf#heta)BF(w3H9$(<4+u_|;}ˉlf>&femhRs0考eQZZ({%y* +Mja	moEKP;'NV׶Ber}öN~xGG]v'(jE0+ɠ$/ˣo.}r5ǁIK$&jN@M3bjWCS4ؗ9.;[oұA  Ҡ
Gj	ѷly'BķoR]ue
B]P+泘#dsR)$U`@5L(CЬic/ς;UCd7/h̀Hj.;?~wɾ7io~Zԝc`1N (<,ut aMM8N?ٷf/?/--hl)"p",B@0* ǩd|YqtT@OZДQ[\5&5ExK"Џ&ACVrah/soy9q;V.@M[N)'z܅CZ?~+-cxMPt.([Aj2P
7Gk@UvV!eZFxWL}+EsDY&.7\li4@U#fiP-Rwe\bS*<71C{@=10EC8eM"m
Vj#3Cf@YR^d0)Xkc⚃O%V9=uIAɸ<py8 -+cj']L
<G.:jPI<u즅]u`xfs`9c)[T42xӄ04ˣl2}ü"eVg2;zRLoWgKpڂ\Jco(5V+rq]΂ih]s~5	">>H(CPQ䌩6*EmCᠿ(45IN%UVsS)z#i[AIdxp'v&ݎ(RSj=WJ|Z:-(?xajAuJ[Uv*:5\%[-j-PlɓA^yi%'q5G8R λ_qǽeT# Ƽ2q'Δ나+.@Dn S8g 1RNvh( P[c(kd$wwZ4	tF'&q;)F<!;)6:*:e;"Xި,l8A'XF0ȴdc/9;{hC2,Z*JM0!# $W W?7$.W.YQZo#IpܴQ] 0/}M/2QEџ:N['ܟ8Oa(-TH=/򝫃3< g4Fx"2"sPs/Q! &*EKb/R'!t,A}=O	'>Z٘F%(ѰtlPNEIobxD߇,ok1kö8KnEA^r'Cɕִ%DaƏah2*Ԇ	h8LF.N	C@=}_w;V3jkY>0c Aŭ"7Ө	6qyy-gX<AKŃLOC-4Ѷn7]E$S#ڲBX&"<5l9?Zs̿]mnd; 4L6l{ڗƝmPG/!0l=uKfͭ0d߸PmmzQŨYאh+@ᓎ\)e11LrD9i/b8篌thWe]1|0Y`p^fgXhbҦ^XV[D\vM#WZh|RN<P$()hH*X)9<;/C;PK/*'
d2ژ4t{tqVC>8Sm3ƙit	h[O)O,J@mau?<K"\ԑ@R٨ㆣ`!}ԕQ| ].25UMr%W$'zHvFC2\);ʩU"Q.Hǎ,He^4u(GB+;oUecR;pcYc*WqL(͗).&	[hq\1e<ݵ=cJ&.f3D;K;y԰xqy
N@ؒh`Ln:GQV@7WAd,4-q !gr,,*dG	EoK)yYfoj27nz#l!K? LncE]]j-%8"C<]GrT1H|rx~v [#hjjPLPln+ibp3]RHk	hwYJbP>F)YBP{(sP\5LnڟJ4wͲsRc/զ&}YEySWxtyOM*HsAz_V9W=tɌ(Foyʨ.D'nʖY$l;tfZ=)Rj A *Q|a: O \EE4'֢Os2sfLp͢iw\倎ϼk퀏I>XQ8Q^J:0GXՂ	L:j{G 8P<cLY=%^1\_5_PWAj|D=k^޴^lB\XZI<reB'~[1F IX#MW|CV]Y栣>h9	Zx	ĭ0~CdLdWbPFGQN^qZߤWao.5-T:a!Wu4VF-LbNC9VAߩAϱ)i*S{o`yưcAS4<N6*l(~d`9w^s 9AN&@`RV9=L|Gnnt_ڛn ]z)~(XA`2@N
]Zθ!dBŔƳ6 Yb}]afPVݨiZ\kR7@1DVMi$e~7OЛ<	f}~;ϷBMn#jCjjrayIo[jg6G+FN@<xہrPwnאpR@X:vOulsX7:{g$yN[O%[vck;ۓڹoOG]̹"m5"XrV~m|s%Z0y?d6f3ju 敋̚:kKl0 5kYZFQùy }fCJbsLHVcζ{GGG|bsEYgxY(g/,'Ep%H.Mϧdbl9Op Hߠ`KZIu)	&Ĭc֗p(p,<!mtOG`&(ӯA&{nz-{Es	HÒU̟a-ɃͶPq򒸼Hd;C7W] w'cyL8x{y{A^2{N)\͎lB5[9nf+иpq9Eϥ@o"ʷ[oD|BWB!7^c2	xl%@bNoCo!4"poWMDpXoO`˄1A+l~Qj}AGЖf	 `La<yW(ԅL	 pHT93l':xW:`M1u~e3ԙZXbՠ-Pk FC$IHY+?Kr
awGA]X0-ڻRg/<d{A`ejnQy?6=&ph&G0e9vr'[n??VpjIqI̤e@Na/Kۂk
J©$m	AIz~>+Ϡ~.T\5dLT=ڢRe(N#;qӵ=uey""EP4gItf5-PAN	Goգ'%bEŏĆH1%P{ޥ`+0az3)km6쏚6]ɠ>\oIXlɶI	rײ(lH 7O怱-⌗(n;'%RjɤeW_"J'SA>sj->ivπg0=*gۼ9?<v%XN4g&\i
=ץV=۳./4؎[o0h8"myNԷ*v\m룝_daU	n/ktjE2D%)\QԄoAL@D}S'[K'Az)v^q݊t3Ou,gM#qd	Pۘ/D)CqkЭFB1Ԯd-K=1Ɋ 7^kbOĹ~&'/b&(]l-'>j{[^'zYbp߹Zz#1oKGJwYTHIO fkB9	&݂f-:"E]mOvoZLt3(]#N3(~63Ʉ=͟ :.AAPc$n:Ui䂮2j歽+y7{E[3YijZ;اʒ}ȼp<i.">tR'g`w49ygmf1|˕t!%ʯ|A-"x v%ټB!kBdSY9ϔ0禹 <PsDxe0
vR`A!agTxea\{4T	
+]
ۘMDXV9.єS4VYGkHd_@NU{mhiS;e;Qܕ϶,4L"G}WͩC#vϻNR"Q7Yrshxo2jMm\`4wo7T.{+><lZ$Qig--=^`=
O}TLUբ\6PgF98E]_t]|<!HQԑyzմ0-Us*[y41[|*
-Is/p^3 /2b:{kp$!=ق"M; |=81xsZǷjp;2GɧE$B\P<ߓFAH$Dw'\3ҡ{7xBƂ#ϿƢc<nk?f$']6y1^|h)Kk-_jz܎d캰-9'Sx<(*m,Bƻsbw\ߝ1c|΁Xwi[v=LlsdxqTeߦe`9JMNܡX]֮ԂtzQ[M2n<	uH42{d~^AY/`rPSLoHG	f69HPV(UHU\ՒeR5Aky.wyOc;!Q:2GF~Sb8~b6Mg);#cH`&H86E>0 %g, ]E~>r|;jx=lJ˰mh)ɶ5 92opj%PE `TϨFt>)!\;[<j)3k3f0NpqmL|yq:ܱR1#"=_fcS16)ƣ	gC=#al]OD2jI}e)Ml@3B3$FMo3*]WshI5#]b~ٳWMIjT@^K1pXБ)6:q`p	'k'OCLE	gf(T?k!>+6̎4/밵>DRӰ޽(z"۝kC.	-k!$7?Ǳ޹U?xW;DSdqZ}Iig۹uyMPl0pVY2Ĉ5Ea іj`bF![|\ו]lx5%ciDn4Qjg)uUx2DBR%' 7 є-3ocfM'1"2GPddN!.A!_U"]80&!$&%/PNV\S wCA0	_G۸EAt7I=Ct@~]$u#Ap3줎_|һ/?eJ{	^*R8{9apU	"}c`k1PuPCĲÖ-{9f`0<	ed/(c^j?:G#DS x@KJ/(8 {-3'R
.̃2!P>~hЯ
gR*!Y,;;>9<xkoY{%YdZurۏVsN	leHWƜO>u*J*k6(3<#:{4r6ޛJBǔ4NDYᣵ(Y$	`j*u;n31Si3Vi/r͚P' RJT6mmjC^k"oCֲѰp^aj 	9[0d	X@bILҏa)`́ɤH	i #-5Gn-&c/hh"PzWaouoSWֻF8UiA6%@nz80Qq|62)OGcKrLc|6~x!zS|s++*/,uR=qWu][.A6Y;y`3C4qAQ?yޒ1-yW?POZ[*S=O	YEsXHM0DFRτ~\je⨓ӰAo*\҂P((BT")ڢ$qk[Ԓb-8}g6OuRCqg i>CƼN"G
I)R{lnxD(p汽]}i\n.>Noɻq4r.3)U؇};Suz<w; zNfwScHS88I7ჴrs{ͥ)D!zr$Ne
C2~@\kQjoښ7d3Ft.Ԏ6^ta03}X_8l->{]ϩ,TF{@ׯTYƩ }DҶfAB"ϻm/҆ͦEa\HBJ&~;&( i
ylQUX#JnxCN<-.BqiotGyW;ě/z+M5A̬31&n1	[7?Ae׸c2Ϯߚ",U`z^yoMPKyPo {dYG Q.!eIQVKtEz/RSz/.[	4hhعVt!Y;B['FWEvMJ%!,8`􎳱7۶5jd7OVطiM5,vRC)?G<s({3tVދ# 'ó3tWD ޚ\cn~0Y?t:rD-tHGV[8!2\/>&Wfܼy I88KXbԚzhyILg>餶[ً9
ݙK9= ;h>iRxK_(~GR+L	?ٌZ*l$*Plݏ%ynYTQTPwrJ|.qkS.`BhxH3OL=񠲓nt3TԎ:ٲfi7[-sN}~ N3 h9yuHg'ߍGAt؀U}`q10dd*xF碕;-~WOv|6h+Rp.k	7KԈ#g%{qtǆK~?>96ºt3
Ee-J	
zqw7cL9qpF±VCMOi%T%^ca8-HZaN:4V*OHj1a{܈1TH믅S֬&YH͆ͫ2BZiך$j_(ׄ/&f_UbrdrSx
]^ 7 uod5hZ_V/eJoy%z?KLlKѝ[Zgs/+?`}7jȂ6j'OpHbf>
Ir +?&W93u.PJݲ[V\">o) 5tjL(.<{+J!9뚷lRty乤Z6b :ف) }lCҥ _-\S_w͌<Crtr^usEFnH ?	]t	tEhLC#7T߅WeEP/5աjS!Q?PJcﻷeѹ{3!JUQ02ORm"VǉlχLZ9bf2kֻm4E&/c9 %gJu+`0Z9&_RiEMԆAD!IEOO#"8"CtsP"O/Ԣe!r*ZbDyA~<x
8y\)bH}~
R=Y/3?("|yFx.h1#GHe^iOO!L[ض[;"aP	#~qel ~An-P\l̢̱MUZw0l7+ODą?]PzY;jQ'_4Uu0V$gb{$%$VRHDP&\63GW$HػX&{GYJ_fUOlI
o8 !UK+Pp\9;
͆b%5S UH[c2=;ֈ'	 ho="4LCH;O[*}	ЊP揊4$|Pćv_6Kmŭ5ֻ9;6B2R\f?%-1RTfH"wŋ>\umVBCk\xL2bQ'b}9UUp	vM[z`7z1}3b9,i2ZеRu?XnK-m1]qpoh߁ԩ|I72_VU[Gr;HΡ>VOG4`W|VMf]Nmuic\pL	ʂLA	Gk0zٸjt G8C_rZ3T"q7J^㸘JI'#].rH a*^țrM!$mBΗ)%k_eygؖO0jлH<N+;~kX`"Af~RN#v],>zS@_R-2kRED)[;y`\PMC˒O}( yFh59DXD2BCXQ{bh(,/~J1Yd-m&j[MY)ttŪt4uNGr"jP`u4^ˎ%<-<]Ϲ:KZ~6%g3e{4t<[q)9kxLޔr_BaVk>i&06~PH) ʒ
LN7N(xN 8a)NMԐؠ$u<ƹӍR5)ޛ0bZ^^SCDNjQ!0Nmр1qpƷ'qmM'aQSWB&##	RK|I=6K$`pZmo˒3jj:>,fյ,gASIy0fCP%r8Z&x[u%rjR:	C	aK:\gĿwٛ/N֯~?jql Ș-h@CМ.1qB{Mܦ~ߩ߱6G6-pu}m@ L8lecqYb~솼s tds{M	dQ]Ξpv>+(8\ĹQگNIOll	奡fj
➙|[P2
2\! W2 l򫦷S~ԙhQ}!䬵Ɯ9YA9m^-mf kf=4tx)cê)0%"hS*8шOX%eZ>KiQZW¥(SRTllPFiJ{Aijb";'5|obNv+JD;BNzZFxS2<j/MPIĳG`Q
 4F#?׹_%F	0+B8۔@1CIއ8"Gꈡ`ifC߇AY{s+6eO-f~o44uoއj,s
GVPDgau.ȹA3VY,s¯K4ޱIh\#E4q%C-U
 1_$6c,0a:-S3da='	 l1ߤ?7P+ uAT`On<q( )>^e9sп[e\:XafHA}p2\Rܻ\t6YHzHyh30"-"棷Urޑ6mN a0nX6}.`TQzg# KkÛm6-y a&Z|D&}sn!FD-}l?Zπh
Ju(/p6M%2m>4#-ߣXM=5=|mACO[i{l.Bpn܏ZoPًB[?{OOEM*UU"RV*013<B1@%JS{pŌ<;p|c`]*;i@GB!Zv%OJji<'qlig W#],zNx[Bxm\L-Z\dLJjT@Kp$,j6$/gX92>;fXXP?>ej`]#RGP][[`Z\O D+``*!!Ě\T(';];#8؅p*[L4	լ>mU9]^(.sIrs){zHMkE _H\s"Tx,Z_	[@@ڊDDvt4WK*I3!&$2e9;>XW`àM$a ~jnqnN?VT^=jnVυ_ɴT<´ެ(4[)XW\+lHH+N9;c'2`FM#[&'!"+d|XIyEcIΚ퐌,$(>rڼITeYg}&Ɍj,+ FOq=tvUQrKs3
N&Ꮷ`KUiO&$dpf\!C܁0F4Dژ2ksT\AvArK3[z_ٕD^ GpYKA|m" cߵV.u-@+8f>
W$tՏՑ)ܯ&'OWrmM9ռTMN?HZwax[WW24Ѭ| ㍋.ז[^2LL ag:䁧&*#noЇr=U ;q"THV# JM?j~0*LټDrxt)y\cDz rqŐC܊ /g̪in#zAt	~&(-g.=IHTJH^D`Mp
$S#X'6ܮ6lN@[;hL'ՋE=}rtpm`k[a:_e.:8ElsKy_+*$E(JߠRFNIN`Dhsd.0h}sg ;Di(_Ld,\	OG$kJ:0;Ý.SZ"g9p}(+
ŝw1豾Zoh\U{\}@rj\x4GZ	vQX%Hyqab<3LLT܀xRw;nl`"Ā0LWs."ǦRF1&cxG IY`=Y -\n/N@k袬O>h:!4J48~u߿lwKYFS􄹔^a@ESٚCf3yL'H x]ѾUG޿adƿW7,c0j>8Ţv˔r\qn>) ΰS XӐKMCH&v5|9ރ/e';
{/Wmf{˘{0js}61wBuF33%Ʋf
])@մSk>8>hsv)sv:2-7g(Q[Sg0p|!hex*U}APfGgShZd"M'2,DPMfڿXzl,atX\ƙWw1(*2"i^)<b gVDJ*49\/"	z@M{[Xg|J8QooQ)M(YV (|)"0 {%TS'&zJx8!/T쑄A/eB
(+	64 Y&:I8^UO>AO۠^L̩ݰx=W#{'G;{'[|wZwj?&Yo[[+->ȱoM^58BE~(1ã.	oɖwZ6m*ךWZm>1a-PO(Xȋ V7UW%
B8^Ɂ3oF?X(R)}wٽ'ٽ{m4"-*l5" *z,LsZ!+J3:7CQ[FTVdm;v
Ex T#kR)k@]=u4eS~~VY`Dqˇ'
A&pP5|'$}l僊>s8cVqQmg|T	(:Ta$	XFCK)@Cz HC/z'Kh:IXLgۓyYf^!![T\[m/TKQM4V\]^4pޡ0cnzՅ$/9FϏ-uxO{NN^I+6oPzSDb//Q5aQ?Z$ѓd#Vr3oǂ2i69:j!Ak)>EmY>i-FNT%y5/)TnlKi&aƼWRT<{KɬQmVH[R""#c-isT*I0)95PL۝S,ָxSHc~ξGy_>LD0fK)Qsx$3
3H20;PL픮g".;˪BHXLK
c%(!3M=gn\5yRH!]b;J@?z1dp} 3O~wMuR|~NgK/Cv]JeKܨ=P簵5b:lHSB&K"jTa+&vE!YΊ]P챝)I3XVBv
>Ou2\hwh?f2b1FEvy
u0)_g~E/n	ͷcFtb>'?&	'v};)_c7ukf샚2@L*.(Kxz/O{Sx:(!+`՚VNf氀wkQ)^R&$FwBԞ"n}je$rl1u, SޮyJrG|YE+ZPu{{}	7ԂzILNI3Lw)E,owQNKq-P82\#8ԉʑR>vASFN Ƀ+	>_k1ʔ:nU-ͬoli8R%9e	hGj*EIa}l}a}CT;='i.nQ<
sf%$)ՁV	Wp-O'E~y\g-z
9X$gP"%}a2Ds8+&6AQ.m?Krik	n:|E*Ǒz*R]qˊK! ͼMeBSqS1ٖ[9fO=o6)eB}a=뾗,vy?˷{	6zD2)THU.GÒl@Z	or<SOK)2RZSMOcG[;NŁ_#,!!}aD g9eWpy~439oVNNhc{xb9-40ci5|/YI?j/)(`634:KAjΩW Y@TEش" sB]ZNF[J@s{%*礀5(|P5^n4舃Xb.ôu48;wC--;`xPPطG)vSue!qf3aio
J8~WYjPV^R6`ۗ#P4:fiRHSxhO?Xb~䬮JrIF[,"#UyD/q[ ysK'T`:v>OZfs5rak:8P/wcj>0q'.[/jf|U?Wl!յ
QB8MU*C4(J4DH?/}cQ?l7IVsЦB} ?];wZ]vW8<>9:9?iDo{:[X;1'ߘH7eKDo6-b+4ڱ9hzk(ڣ]r,;R/jtYzjPvMv)2t-}2g	SYuFfxU!aJ3lԹnbLɎ4,PC0\)?>Ń@R^CqAL it%}^i'X* ҝ'%e\~}+i_DX"<FcT!62:p.;t3=:CBIVgN{0D+!vT:}TE<">\%p,_m_7#׃h0Rx辮G8yxEyꔟ)p?G!pP8ΰ=N~UY>6,zRZn)3DPZi9P!LeqyYd<FFB?[nF(8^ah8	1v:;7m`/EMjtԆo-~ӂg,ΞJEItKK'dFmlPZ[ d^akY",F˹@}v)uK[|:+]"+Zi*Syh.+#q1"*S1'1uX[vݙfh͙2̬am.l0wrCEqĈbҫy}X܇gw0C]EϦK8QpX3:#Qva>)l)7#Td-ԣ4Pu4ۼdHcޅT" 4m<Bc/e*0;#$l7ЕE< YK`
@RJ煍vcҎJC+k$e/+2g;7->=!$Oe;U5C!<
du]X;a~Ag%ţLpjMd14T.߭wLV1s qrPz
&2+ӺpdrNWd{YA%ewrp82dZ!is`j'E"Յ`@D,+[0U\KoSBr`/T;貫fڞ=5L9br+zVB0cT	T(\ƤPk*U̿AI-1H=kRGK7vD1<.zGGEsx҅r]5E`7/s +ym¤B	'P!	A#j|PҘai=*ɯ,}lڣ(V͆WRY:Ŵֹ2AT#Y;Q::q_DxVi)ٳ&4<Go^>wb'*]otlCFii;4/C`:F#/ll%_o!%^܍a{	%ŕbRxN)6][>uf
j> V=8y8{\PI-3p ?tR>"vX}Oɵ`
9n4pujzazh]̍Ofw[(V(h}*8jCrB8=OבnV
φ-* ߖ3EͲ1JнݑS52[8׭\8.-JLXaFםJRm^>,ȕJf$¶fʶ^KpI+6}m,k"rw\k5+:zA~:,bRW"i]r;h.l6˒`v̜ m)pF(! ]t_}aGkA @}Ƴx4%ɶf_}ï"I6}1,1KMTda27SVՔ J+t@0Nx^j61D
nc	P\ڍKߛkҴ̳$.J% _X; ")hu#XwošMRIZ1-T(Jm;FJP~cRU>A5AF#.Q?{F7!8
i)Em@>*G3ר^s69
>%nR{i8EPZ|HճSË
rN&z+=7YEBlX%|Q;<I2c+yd`Y(
-dO	$ar  9$\
a 9'\}>%]:gY%ܜP|UF5Tα9C1enIKKy6@F8zee^[/mtQγp.)'hVI *$Fymfko~Ry+"1hc>i%IT>?$rv1DbD=1,rBZ`z鮴pe[(ƶyMM9찰g ?5#&K/fWI@%`; m۠:oi'Tsxk⣐9#h+mX}[S1$NRGvM䮢mvކ@wb&+tݝxɎj+yZry-?D.oXagӫ.IN4G7|>dH(E?Y˯8֊G2bWa.N0AtiZsoSmHJx;lҳ:2 'cs8,.B¡Vy+&Y^Ft5ռ-U>'C"$b^uΔF=WwCR6E~S|$m4-ft*ULؑ\n[ܯcJ1KCqB鼌`{)n1J)! |YݫÙ"gºLoHg\ZI{yC6\gE3F[}q-	fན{0 $'cē"AS^qg'd%6[CJ
gQn5X~~x磕O*|ϥPnLy;Eyx1}[Kw5ìcp`tncDd?%" 箊KlhWkCMo396ӥ&VF}2j):+I43W"=9+{^`KqnTmF+YD澽Iw;֌#(tř;mRgWVmTD{u#_U. AtbYd^ w%f>xR{Zո-i\!:]f(=fZ)')C	ASﲄ2TJ/FЈ@c$	JK)xswyHCQ{끁>Zҭ8xwV{P-&( Z/N[QN#ćŚSWݮ>bQ"dEu6>BkiJ"]9-Ɛs"Q1{	CvȾl~Zv޻(8ú ǬFBi/ÕHFf_HPGptTh"NG^%r,/MY@oY!;\eLk=7b&s[2;z4,ϟqzm,Do*sVrPAͺTR"=U{wm0sCof
(92]S
y#)*V-{\ʝJdLa#yjv.WF`) z߄z.lv1puYX' ͕"GEl=UhEdȒSFq#N:'y^QK;xwO!zdeӁW*Kg 3\M,0aYdHGDK;d-ik) ,($<0gNN9].] t͂I6[jr\)ADgtp&&W	
 Zzjs7qv@]jm)#tT}OtGQsK_# "80a	XG&8n#g-9ӊY?1[K}*27mLe*9;77K7ɉ-4N].R/>33QGC.)wLQ_}'aUÅ«ElXUw43ܘz̎VEhF`w6NJ8bkQ|v]زJUIƝVUI㊉}Е1j;mb≎*=#p0:؛¡:Sمp0*:p/vSBҰB<Φ	ndJw2LbdtbOԠEr"&JaKEg^ƬܱE:QQP7r`N2P
)x˘aÂ~X>{ LC!lzy$WI8Z ڎa}"-8^$-b;-Pp/F<o+HқH݌*`bZ7UyY½ v,~-5:FP㩸fA8kuhxAkR>+*v|NU6_mz[ϼ01IrihUJ %Bf=n&<5Hȕrd½P_eqN-Exv|tvٔd	%fxtդ1YM%ihr)3i#eY1]܎tҧ)~tQ;Lƻ2M"MjɬSԷQL޽8<Pͦʃp(:.Zқ)t45!!y_f~jz
Gi+邑ՒnLjY/tGkR}{bY1_'8#.<{\C2qא0_Ql.ܑL4d~b_\zT/xH믆-loh0Y8@9 DvO/oqvֹUB٢y ~]QT֮Q!&'m
Nc' Ξ.{W.DupL͂8ʊ[rOb;pf%Zb*dﻕTdWooUShc˦ aphńAc5\*8*C:C
7{/<VC*Z=gx蟖M+eRg"^b`YK +体{"e8mh0+c!e4(0aä˾Īߎ]*^I5-ƆXUeT[sm]DV(	tx,NIHG0
2p*URҁ3Axc;Ca`56M$(n	cxfB[zڢ@F9s&u.}SރDW∰<NRUSu<RY=I|Cm}[k0ַz֟[f5j'5sSm K~r<k0zmKQtAx}Juַ	}MVȃz{Gy#4GN0n7lN`F8T\cײcpא-ĩ5|
%Tﴀѫ8]]AX*eEjMw/ܿfʶw|s#:z)ou8\"95!AX)bIJ
fE(B*}o)F 	4
}!CL{XE;ʁhk;	GFUiBRޅRr/D˟umuY679EToN);ҳqd#$];uWv;
.~DwrXYD8d痫qX?孰O4˘%EKV5yί-'a;Aᗎz	-(n7Ie-6Vlɓ?uyu{0p.lá涐br~=Ƅ""ו/i}-&࿠oV\ugU:=*ph	tJT)_R~٥ZgV)w2ݺ$b{jlK,6؅5ߨK5fxDE "3dj|M]6_[K6A%5{
Sʘb?laDpIn{^@DGXYNNCxrhxlF͈QGQיT-AYJHGA	~lo31|@<C4=Wm2&xt
1<A@Ɛ,]=ܨ NXjo2ϋbtgV q>iUOx`_+#"Ve7"0HaTaY:6)`~E(N[2hѥXC1*N̂Pq XM19 gi@A;xx5Q;?#TF>xΪYI϶(.hSĖU-\Љ[ZijJxw`f~clsceBܕ<6QAÑД6^d~!j?Ç7EYn/)Qŵϻgm?EFfp~Bʁ$dQetr@(gV"z*{,=?)l|7prtز|2-a1O@ _\ag0k?!~Lⶾ /X󤿢My\$ہ?%5s>5|;<Ei^	`7u6P[.Vd#Af״e^EMU?̮y[g:qȈK6^@NBɖ5˲܆N5||CTj!5_q//Y.cw"-u9o*oSS
I0}3M9Ϫkk @4e~X!rcosUC5)Ȯ+	WHlXԑ /N(&l7y<P)˷s;3<Nt<Hiq^H\ټ$Hl Ç"67 JܔhȘ.vPЭl"nPdvD$hei^Q7 `wwΦM?|zQی\3$A{	($fe{3`*XC'\?ygߚ1'Ci<.GJ&#f7]xPKNPkc>g\McDQ̙Ao7m`o=yZc[Be/E⚄黽'/4,	Q\Aͬ/c9SmUPZHtL"ɡLuĂmITqN4#ϫHX_\{iLa:e15h*SH1Άrr,=ڃc:yr/nu^'wt^	,Պ4/_eށO⯭'_fGYדM?j3$ŴlQ]6e`]kr_rKx a>Q*ĕGA?&(UD8wqpxYq1?G{_ݺBSpcX-B0/buZAi"G#Zd,;9hHd	Cԅ8*FPk_ӭ
6*'x>mRӬ/C(yr(+4/b]*DX\yУoZBF?ŞxJ'>[!n*H4̅3mH/rüNeyv[66c.S?x[ܬ`c%&X)+OTPxk8:^ɽbTdidS)7qq'G?2b6<v%~sw?#c_/6B7/Ѳ36|H{7Z6ư:L!?c9i国w|gdfkkkm?W!AXU)8>&>"Qy4dlwC-VGݨo$EϿ$_ny'AwFG UDyTc . xCKYM|tNWE,gҥAT	3 JiC3]mm-Ő QUN;\ t?hmʨhbL.MWσS.fSoJ̈́}MY1k GҢ6⩦6THz hɬX6jrtyr,mJ]7; yyskّK*B[.'7,p+RbRތk
a`.[˻St@'%"F*#asuY?	19;~	?\w{ˮxY
a3N),l;OZp26Ui5TrI,זuT~b߆$yo-Zgz*CQ~Iy1 oɠ4whn-lD1"Jx@NyÝlAbr9pP ,(&bx@?3XS.,ߒ+oo%ҩ ^Ȍ{To+<V:
`iol;LԸ$iK^%ᮡ>#D{
{ƶcByhEֿ
^ʊZB!wqh4:E=f*/6*U(^*̺ci+xSy().p7K-#y?o؍<Jhg#QxړRO/-YK}	h\#nf/8NHWTY]=wSַ3zyc2+Ү 31NگWDz>e*"^HC|^KseBkvkI!T̞]5[3<'$ZGb0bB+VZr{;r~;h}./Mɲwؑ8LjtӦYWu	$/3u[{T<E*Uw˜2/<3kV1b[\_TfŐk޳x,ݹqR6kPET	FQv@Avbpt
۪(bR[a@;gS:jfC]6&ycQꀑK	7> \IM ¨| -fI@IrU>q0JNgWF!jotTJuޒޙ-ᨈ	:,Ln
UP$M3-Y&Dm $S4Ż'*\?!kuy*DĘ36?J^ؽh"_Faq1yS.vB|vyyžbj='xs*Xk[iCd'.]yxǼeBRimDT@Pg_&0MPm<ÞSkKޛ?X2g"#^bdQI25ݴָ@އbƱ{TY'4Q 1yAN||HH6s,eUQ(uxkSRRNدn!vp{ܒYfh<WH/C=9Rci
)D:ђ65=闭{q)Ig$N58P>5vLc~&WvׂTt2(-DٺAr_]<v9maDOdl:'+لwwP;ZP[<79$܏E%YH"@KV훾*%I}*I2GgP.b-pjV[&ZzQ0?qɇ V26n<LVE9V;+wUfH<,*i!{%7$;d;>9?8%mjXw(8|yCIgq]B.s 	>Z9˻Y ?Fi@5p^:u",]_NDpAXUbbt)Ґğ)!3G3W#?~F
;֥^j7!~-y⓭
޳Q0&5ʔ"32%m,.w8KϢvgPT%_\XKX`(04]ƣ
p͌OXlZd"G<j HڈJJǧiXr ɦkwE'2-TSbt-[;)XTXG=Y\TΟݛQrc-K9y7>1dZ-1́%!ذؼxJڤR=>ENqZH<Q=ꎔ#dB)-_BUu:lm_஽-dLlV,6JlAs6=ÌQ EO7]lldfi?o',!q$P<٥T~YT@INh$o]0lJzAT3\rY&|!辨W<O=ͣV׈OhSň_TRPbN$j0%Fp.P"E	\z>~~8IH<UnrsT]ecC4ݢ4/;	3Jz,(TpDtgV%y3ﵯK/[TkTjYb[1QϾ`?LSBpXDe1luв*"NdpM<;XLg	Xb7ևJ9]
eZIl!t|ZF˂HP·^m}dΐYRfdw+->8fFH$c^fχF㡴zrBrQeiQY"qG=OtP)>vvϴh|8beO>B>EKޏ@̔dc'70$= ڈ4
f	;9hָK#qLJG7㮃ܮq6E'"D>q
$Dp%0l}Lue):_E4jM`1Lpą@i@<ETRHJZ@2$AYc,I>Gh1&C@2v'p	VLZe@'ϐ2jvq-MyW%K$'6!PWGIwϰs1=y}otKr+-4Z9gs~U89_<")%qz$.>$Q!J볳Sg'O׃-yڈQlK0KЋCzZ/X%
5RG%[/M<PVrlb>uR;t=(]u
D߫٥HՃxV7f8v	m˃s]6(0Lb$z1g]p ViFO0(+#ߓ-/:GogejMdȦ\KzKyhOz"h~{[4˝'e_FҶ*S8څK[?J$fby9=SS1WΙ0*w/;,s-a˘2,36N<#stXdqE(AEq&˚o'\l<j&>3!q}BpUFq8W55@aVjaWB3(WE1G.YZWHۜƪ{[GB~uAvYV%̊]Ǚ˞Ƞ&%*u	Z}4H?W߇-؅|~zm(.h3Vᯝx~4TsHEJ?UcgI}TG_~*+] K3x<^3<ga5"8ʭ#mY\3WrUC:㌩Z07R@X!(h4+bya)N:ayfXA21yBZ\BġRe0l&"?I_kl 
ZFtc\heja8U	8f Ӊƪm>j0m%^[ a)FM8uI<hZP|g&o-$C2Y5]joH֤, iĆ6;i(MS\=tC`Z&t4^ʆu|{n9;B'b_
RM} o,=]Gkiа~n5PG@Fd#K2%KW(oa_hT.\@UnA!˳h(q_/k$,J\!)oT]X]M+QZKDDyNNi:-ÈEN"OM7	Wr'%GP*r43=u6W46.sB<M'S֖m~a#,:LZH!65	\4h7MvIz	1Iūf[_Lָ^fN=Lq-ktd$tT8hn:2fj,6ge1惧ݲ;Vs˝7HhoI:gPV3m{<hEG桫0͌rC0!֯Rf}Jʼ)#r尜x@}*$MnAr,*IgEϊN(B9z]3NCPlϵSpJ(0JbL"tRr <4{`V5&80:FA!0o;nBgY0Ѡ
^|ɜZP)kNYzS=5*\\_D\CY:?
~_~;h
9BQfDzP 82>H1LFD+)\;M74rר_EOP\˒ʞ%yǾ:{0z^V|bmv~`[Hpv}M\ΘXFi^wF"9aO, i~>6,B۪>8sF_|jg><+n`6?jkǟ:ǸrW>G; U@p])TE! ..Y[OiSҤXnQ6yf{]w̏r1ȣ<N`{9^WɻJ{}+b8]`0m>~7T#U70S1yR&>'Q*ؖH0a0kƵ[ϢJ͇3F@ɅcN4LgVZG຋Bt<ޕcvg#AzEmɠдַe]n{@PR?!Ykj!9휦^ڒSS87;JԒ>µ4)% iRWe,K:*:~g()M#$2jzY*	bu:keJKd{ }Jv,B0ڭ>D7h!AsIvޫ
r:VC0ޤ'LB4WwY{@L_ŕh]F/b["<p]x7h/ej0h\޴CFx^c2=^{OlϺeld\0("Fw_}QOT荧նQ\FuWW]]y]?}Kֽ-ur`Z],6ΓL3.9&nkNf.vU?X\IVU3q?HtLKU!@:oPHH"ܱ`^x5蛪oE aFS㓝7ǧ^=?}1h .q<2bcBI"P]ULNڀ?-|ab:=׋ãN6ܞ,р,M.DQɭo'ѯ{'*gaO9|\PNC(hJ3+5aHB ѕv-4 *Aaã5fBxaa~"gU4f*kjh,^4G>(/sCݔhIيf#ǯIs]׭nH'c%pvYJ	(g+M??ӏ$c2402Ba3kVU-
5øtdG|1R v{Q@4Df&3b7sr9vh]v§zeL  ѣzL҉Ep<>Z`4gM0wM@n8:%37yq/v]ڿ"h(K#CGi3tŢ: {7<8v2MT֞ͥrqz1bs<UaeYM ^h!n5de12q5Q9RB妣Ӽ#=6T$ O/j	"JmŪ1R+rd,i<+d,
Vъw$ɻM'UHݱ	n86G&.b5pT&F ՘AruOJdYKqA,̱kWM?pŭ<8\*tbFѯ5TgUtٕ#*{#71I_ p)GQ'X!	ZU0#{uQvvׯ,gwC5%t$5 4P3[:3	$9ئQw6޺Y^ws!PC
~S6y$Dm}z8C;-K>,1"h0)b2#~N0ȽpowY{hhgj|E_7=<Л9؊yC!ԞMG){u`x{RA_:[w{4y}Ȇ-Ȳ髲ĥ 6 38ZÄ_)]qb3yW0 ŵy6_&]H]|Cull7Ko#3^YxTw=50]P%:Ye؂fMݠZ4Aχ	6RTFcR_=PRMmniէ7CP-(}k`8C31wb*ujGâ}RY;M%M5;5b`R Zr.~@tW5q.]ЭЧRo#g4XڙS,])Ƈ+\k-߭&:aF#`$_e{&*}[a"V+gGPV89U`hg2tcYbqC:ӢΕ'ILs+Y^X䈹;arӦn>I3ZCEڷ(4|q1TySωmywغ|ct|	E66{^
;JKGe֤ 2ڧ=#fihI p/I&#W;F>rz</[ٶq}Cd=QȤ?jREp.zMȩ<MެiǊhćkfo|zӖď>H\;567mA!q4߫P<{({DI0S2`rTOXq)T:IHYT%˩HՖGURx~0"p1E͙؂2刾c
lވQenv륺ҺK%z[Q9v~)ƦK6 ދw2K;DU"%{(wڨxQ?J_	`3\}%_5}w= ~ \IܒT^ @@2E<aS`+cs+C=Vfu~,\	Mc:-?MKnj=uGi% 5.vS+av9N=7Z= ,L?6J[d"ل_QFEaN't#kP	gz!!,<:B:cT@aX{	C#5^zPꔥ2a~^^C6
56TCU~(G).zfNV+C(/LI
j	o^ޭa<ݖvK+̝ , IN@\#Hᇏz*	.)Mv0[;NȓJ)djj'Lob6τJupzN[N-wUEP8](ySl='7܁'$!퐸pp7ǋr+lVr{,DQ;25t~Z9	u[q"2Gǎxv<@|X^@58a&(eƎs!2#D""i:i6ߧI6$/j§tALΏR'fyEoc'E謣/BrׇD*XT ss43"2:ԄYly*Um"䲣ntPZQV,X6b<sb.9%^'Upbp'Pe*5/$,+)56J-ͻ{#]d+04q^u(A8Ɛ G`d6Wl6ʨr Pǫvg@ҍћ,:A{x#"Apn-1/Y_[jmmVKcsK	3$ZX,:LŠ?oCZDOm?8{p86^ rsHP~h$A9 H.0Q"à&<Dqqݷ&Kf(vi7l.q?']L\eR4	Oz6<gPId`oǱME2IIЍճg0>[^;{/3fgǩБ\)RX/ ( TawEc+A)+X~)]/HW+b["hI,O3v2(kqfGJ97,DCPLҷ	8	9D 
ǫ.8LmJ./Ip81Ml_sx97lfuqʳ0Vi=T_1Sn42`us|YTyI<mVmH!2_}nԭ$Jak%	>UKk2I/B <Iؓ1ad9ep	G~I;J䰜0%rCx^\CFt5rZRX/@"~_?tR
ou(,XFIv78-oD=כSt݇4*?|ohtv;X

'>,5#C2LLւ@/#S;<B=-&0QPpj"fRh0&1HC%m Yuٷt,O,жZDsV4r]JZ(xзK^ϋ!$=IvzeQyt-mq'|`}gTQ6]|w>	qcOE^~>-w񞓆aiQw'KbunuI5WAnR4.GFRbdWJ'Q&/`TtGV= ut:U+/FT`ՃI>a0L	oo ye/V+UG
#~Y2FfwTRIxB95WWF2{m!:lW3Sra~cᅤU>7%0HMX{`ʻ f)(~_a3ύV·\(]RŁQ^dr!NOcEi9 6nJ4O`q1Tno-Qǖo]?k7]~n .bex#xm+*eJe*Yak+Hc&|T&ʑehRmDr֒N1D 
E0ESɾTxP>c𾨞p,v
3\ͭ=	Ʉue._Zӛqхm.Ay=shgv9?J귦\5u7/LfV#   ep_wGzaJ-R#$~Ѵͯ||zʃI-g3d_6, B:Nt[::== P>I]MڼogEM5V,HZb'e?v>ڮGj^ǅEFF
7pYa޽:WUq́qвTwWzaDs<09|¬hyىA-r/pΏ3OEGζqx=nIh%qzAU_!SUy>cNM@DC/r{@y0d,ʜ2,!K<\UlKa/S3Lܴ,hlGI#Ѓ#U|7(fRqBgL/tDNO\xo`fAZbT<Ty<^4xJJ` ;`RK 7;0;6DceGV50;{~0U3lĶ?Wo-0D׫G;m	o3R* .)T+b\aPwac83{Sb5uu[xda2Qq۾dy͢':ᮣ.zhcxm=9ǋ"1SB	𞘹!L	/F3.^$wrw@C Gk!G0Nܺ;F(,yFS!xW[SF%$llQ" ҇o sxfy>ۙw׺D|aMTy[syAΨķa4fhg񉚽Yr/Q aUs4(/.x|']'5s zQG-CHɃm<P@C<NcWwdhPGmIߠ+|W[*[.ZA&5(ri4zl~qS	jHpKdOy&Ibt$\$L[PZs_
w# tq-%Au&v@]؝<-$7awN);1vHVj2qZѺ Ӽۚ8-vh#TX[;[.FXi(i;=O{ػ	AUbfiunO{U,	='net i]6woaUPq;%TFgşT8BOv߽Kr^5xE+yI&da|%Twk$^f*gn؋$kǶD(O;;;>OkR<ihDI2</dG7K.Xws<ӕ2|oD/<(7-'eogrW~w|x _z|rx{O2$r#C&xҌX-ϺMCPOG9LM㽨g\^arֽ<{iqG{8Р<<X~=ʯZ/[YAYq^3(mw6\34K~5-[hs^狓/Aσ{|߆M	7K2jm#:(@_G٫&{f8EM/UoR Tq4
" Ftbkbss'i3+й7YeUm>/"?1Ť*gؓ|Uؿ cБyL!`asm^O8\cHy`/Z$P&0RCob^j
FdYGrPkO\Cȧ?,#m)rwubo4`LPeC~ƝvvrśCxy7~*'`AdT#Q} 5 "/Sm/s|;Ȏ/ك#}G}!Y{닉yr4𴐁OeXةh^D9o7-l
2Gz+cW`:
فKD^݀96s/\	ObH޲c緷f3ޤqrev5NLrs}WpaO{3sC1Kȷn_N
/à܂si?!"V	F̶l=LvUΎV\L%X4#KQrl>7dJ⪁-0<~A6ؾ'%	a̆H"ԳHM)3d86ks$X@vy>!pe PT98jږ'X1"p= PmtCYX;G|uh30+lR6d467-n?T<MP8&V&]%8ɾd[IAEH~A!6LoV|gCui	i.2Ae#sb=Ȁ$5|:<1O'ti+|mGzR'kh]d8#kNs6=[}EAІIDqB$h-a{cBʊ99Z!'ԡAYbmE6H<T?v}Vt"4@VRGHч6DfPA'e$Na߰za*:;og@S[U["yU}lMWg*&bWXibowRut	r0c1?i/:E(	&BE]q2
.xXl*6;[Zވ|puONh:q%8U󢚇Ȗ3  U٠ņ#t􆽪.ٷY^R$^7
sfdxD^io	8ٲ	BfJ9gg|72r ?|]D!=<]	+M?IYmխ`Ṋk	i~lMǠJ7;^;Rg\,H%ț=o}1G9.zX{syv9Zekkkً#XM+ܟvNv}=;ʞJn࡚.2YoL}EgZhfG7u;]JWKS
TK/QFүb5\d28tDf*j`SpEkN`H7s%JH>d;r	ږQxYXֽ('}@EsOnHoΜ&)X(1gK:#]o#P^^}7kޤ,3h#cE~xNBrʠ3JۄϑW9T7V54p1hF^7[AR5,|yFP<ȄvBϝ:KV~mĝu_NfضK?Yrn?RF_K& A$7g!Mΰ{Hҩ*(KՔ27;2n3L:\ﶬ0pb=(?7 _z$#B ߢ8mxL3axvf-ApX&g-9s5aS 1ݠdwZp<r
?2%iyb|eV}RTɠ:< B 2-l٩"o6ejma,%f(=hx!|4,ё{s-m!1Wq1Gឞ$ɦ8[ɳՆ#K4uwE>q$LBCj6]%pa8RSQ6!f%WInQ!:mP_6#5lS+147J@t_WP(29^ig{/vO¼W>knj7HaX,cCA_DN2U{pt/nR94pI`_Y  &b3-?C %% E*U17Җ
gUx|Y'TM镓n`F)n]jo|C1n+xHQW-¡ivf{l	-ѓ@mG0_=^>@S,*BNt=j(nP?duAc~tFOx?}aұ	xXM
'jH(T,T CaPo[kauOR33m*\WHDl7y"!|ttĢQ2APS!AyYrz%Mʮ'pe H!3j =2j⑎DJH+>;$)T)ǘOmFg>[e&*es\?&ϥ|^4#؃@w!f,WENHueTfI
FD;"^CAi"d@rrZ%ZxPD T%Cncڬd(ssA Y11k\tn }*-+-R`t/PKu^v]Dip;MXyi[bUrp[a~SP)Q+Hb} l#U hF d	DgVЯP-Thyd_mYu6MzzA+Y'O[VG,ݥ=r%:e\`}gOwb	~ҜI=_aiF@R7lа1#aҎ+Ef-qT44(Zi4f4x!K	zH%#u\}XxLAšxvtc֮.ޟ'B%7w$$kuqQS}PP7ml7`Iz_RXP#
RrS3̫9Uנ򘒡EB,ă}NG<u+wYRQ"S [\lBI<1kOpU+);$ԅ-ذүnm,I|EgA;J9ܳ,N4Y7ole*)蝑"w&L$Ol61ꭴWXI^sK*(uW:B0͈Kp6X5c^CDQH&6<gn3%3:VAVq=t8{?:y2;-p0baqƻC:Z՞Cw%F:[ʭj+ųDΏR3(~(A&av#!Ƭ/ŔO
Հ5p "al>d|bĘM[zUv2~q25h%Fu;kXL.QS5G3఑Xf6p;?4BHlV$)2 A	o[^$#+S~LvJ"{}~De<T2}~:4JOOoO1
N燻o^|4[58S`݂[,!K#p<@FϡNK<\ \ZSn/vD9'fWڣXa$G,[6dP%u[=g#h;\r:O_?&_s/Cx|Ѳe0ߑC!@Wp.=+Bû+09x	A4^}?ݲÉO ^Y
sh9}P7m)oǧW#F?ZxI$=la52sySQ6b$g3D)U#fUKGI.`cj7OE/GmXa&{6?o/=d{ ??6򀬘Mg5MdKhxszkTdI fEɴ	>ÎK-Bqpg4鋓h;9ݯ!o7e*AݜؕTǣh
oq6n	Uv)/rsA3N>RnΏD18)
ڑxlrrO`aZ(Z9_~}yĞnO^r-l?1겛׬·|k4e"	50)*Jx#	=zR9F,TyK`9Js;	2/7]GOi*NbTg)OLnP%>LSski~1Ҙ#]"N&#)T
6]#fןݘM-XB;A".ʏÏ::ř}ZN/`\;^'Κ;F|2']9 
\DN"H9:PfRrWtr_$b4#/`˝ $gnfhÇ ucBp5BttXl	7&B.:w2x5]]YJP!,κ T2Έ;I[7P?Vp0-.	y׉$(+YKv/n]4 f*2::קn)<#i#R*(u`7*f9P9'C}T.YEޢ]l/JXl2U:'#	<g
I9 ("ٲ? xɈ<kg&i*Ω+8o&×rt84EIq=0V8b4ۍ B{!I5PwfVE n!J+!婥wYɭ h#ẍ́E	`tmde`{ #'S7F=/AC2q[Wn@IeRgrt2Hh=XVS sp|JU"Nys{pwdy-_ơ4PXÊyUqH[݅{k[p/%+$,IZIWdY=J@b wyh>_6v|i>mԏ:P&;.G}L~k|FR!bM=z+RΞg)y͓aЦI[%' gJͯMHp{v6
I<Ik9L	%n!/yFRd5}K+Ah@63Z>o׸1Ro/w, Y$0N̜+꜖UzR3[b0 	os5;?/A+7 >
}%#Jou+fuZIh(ÚH"x *ҴZfw7u]2w#;fEeej|6C؈waöC0ѓ+J^.a1/<ā"m'PrxE^O_o*XbD4^ʬ;"VRg'!)>}wk-F]}wUu78KZeY|l/Cv^ηPQSpdF%𼊪v>PBu?ǒ<SJ+_$YA/pyK<$} FwxdހFSGNREY@Ls"e 9@[gƇH &<6|j>TB%!:FY'k]Z\n[Qa!kTGAߊEXIL?W4pgZJGp^EQz{;suqQDۭhH3͟@Grsj*6o1rFm2cl֛| 9x>vfńQ_0!wV38g[;ǐg̙]~%*# |.<vd&Hz܄P9 ?56۬i&~1QM7`|za =YbCZzbaǣTbJnރዤg(G{p9
OOȜA'vr΅\/j.iH]7U| ,IP
e5d,>4ɛkzBg<+Ϯ_d"sZ%Ʀc?	q7ˇ/C	iw48þW/pA:X_ #ab!BSOO6|hߒg޷TK37v^~ovtV\cwhcf_)v?*GW3n٩c|`\	Q뺝63<v׿m"qwMA_a/ySlv;=;>Iryy˫Stzbv<NmYf;~ֆgnZAL=8wOZ\uYo7 Uۍ*G/y?h]wn|Z7F .?/DS	y QAj3a9kz#9n-/w7anAcgf>_'o}7͗7wXhg>*Lc0?1;s&&Cn8]A/~a7m@vk+V YYĕK2ZD`^^1(r^@(?"EL<Yͯz,'*./g:a6)\*ܗgk 'R$	;2gѨMKIe*ޚHFqj9>e/{sRJΈ#'!}2צNy`oat.w/7\F6siwt%G8 qzj/[??2iqL=<:zD
(LfcH[e/SN0YTW<dYP;.&fMFG~w'CD"GZy,S|X!qe$ *ASߩEQ-z-~ٙhwU<fN"[2-un۲ѫs}ǖ2wY\.ǭ6-YX@6Ѡo#g]͉5,ah>F'6
Ұy{5C7a(s'2t0p9JFvHi&XVx
*VDZzsx띣Wn ^4/W# &T\ZSj J/p΀1gׅbiPv>(y9xjª0u8'Ϋjb,bg$cwoDOs2z(oab#ϩ(黧o:MIu~Dsom%]^j5A;!\d:V4)*vv~HGPvpBC7w<~iH_ÝttY6F+ezh lj:Z~P{C!Apl6{'p1wdL(t}:Z7tz2+c==	avN0u6sd9X@Bof1@jsS-InH(*ܴg̿`TuM=Cee`drY(cT)GP҃+BiͽR1C"pA`EGn;?N)W	QCxvSr½kdQakaz@>VΡ>EZ9LD/p4(;Ӧ99pwtbsrM짝o[hU^'wbbWg+nHyeUth>ΊM)/y^n{ A(/Rz&~F%]dD[B4{7C:~ԏk
I+\1QZS`%fʙ#!AX0-3A.Sή^RۭײOfm>56F?uZ ?L7jcdbX{_~!(60)	ne/2fּ
Xkbfa?9;:Xb?Qfgѻ6B0M$36>h;]9&m?pHK Y&r&ҤfRVe*SK.٠x_(HE0|yuqxPt;b_r]dE=oSw&UX>؁!yDR\mA\Xk/\CI{#·l?|8AWeꗕh%ˠ5du2|=xڭ7GGw&Qjc{zpxY^d#=XH4h/'R~8 {ͫc}8a=m|倽lf>Og쫅a{@:k".f\`fGq^\<^LzR=/zjdNu#uYʲDmu̸r,"5g͹Bl͹BѹBDjÓ}^Hb&Rj+:k 04AjN$k<a&ew6;܀?C^9sqłפ偢"m;r(눖>V:CqW"xSo!KYYOUҒ^'K>caNcp&_l	Z)1{YOa̫p0y.♡5s=^Y1lE By,}ڃ^6EM#h/5lYzD^\kkk7
⫱3>ϤBEMOou;ãs%@sfjgCt3%@	[u3эR[pcwg6?olS}|~v\JO P %e<)9j@-WF;:GSVȯgӇ-I4#`+7mG&t#߳Oͬq/Nw_O;iT0@pT}&');e	eիAd#&Ȇi^^ukqQHYhZ$s,mRf0"I!!i,iJ
xn$2g?h;OtݽY49,t̎6L&7t2QPbi?U;(OXc[cqi&ʂ$ܱTM)4d;O{
܍^D[ޫ5ǪpH3}-9V}h~蝮y\rtߜ<q	_:L./>BpuYBdfҬ&$-	p<F:;G1ݰ?(!og+y2Te-,Z^گqNQ|[`!4SQ, dY]2O
WU-b b^AqR^cn{j͠
XYZ BBTg;%Dq>7QR\LXU.> ioTߒ6;_D#Ku䑮1)#p]{nOecFhLG[6j5qXmM*GR%b
gs1]w6R8u>E\& <Os,V̪uww37n\00wrBIeϋ-rHGoНF2I!G-AvfE^엀71!MD`]:ɯU<84/7'#W)Hr!nV7 !_HJKVOz:ĶlVƎbI
 3|F%+
mG/df.q88w;T8bR%7{i)2x6=[}L6E[e"fP.Dn<9^wUP;Rξ(@8䚇!oPOFј_ZfٍvJ=~uDzch=[ϥơTIz7*5$PBSjm?͢tI/ڈ&0jw*5m*>g>0xym/:ƒ!<0pYJ(>vOf@2!;V(t쨛nWH	{ q$aYjL¬oE&hPʓj8}#݌L4͇O}AFر8gjDu6?1Ϭ*D<46[d0_.P:H>TH;-@NA딣py" ɲu/(nuJsEWqΑݒrmYhD
bRܫTԼy;Cr*5ۼg(>D\=uG+fU5Oy^,K=<rW^/Xe7Ki./]zD0F)NYq^?qu3{NbRk6/}~toEi%+Y{г^jn{5Xbc9dHgAfἳ>ae Bb/艀ЍbU. `s) &ɺrtA*B3`94ԧ;wfKfþ/Wb9$EFyࡌ'wix_{NOeZpJ\<'ł#]ΘHWJ@i8o|Z{.(.*PSͩ?CʜYc_T)7_@w9А(|~㥙96E\Wy{BӔt(1NNfsC=DЄf\"7v={4 &Żkl},M;V>Uwjߣ٫j?m{;f7Mq?+qqj4tNLҐk^]Vw`+v?p p/Ɇ#ٟI|mmݚg-׳]6COoG[xW%}>,ߍai[<;Q!U"J2agTzģ*68rBhH/jS)7<w~zBhI ʄ^O\R$hP ^sjX-: 6T)P7V֫p![ ; /0'S/[IeN`b.ٺ+{W:&hlسkOߌ$[Vkc_ػOo퓤)Ã̖,zΰv~SL%nmR"A
a75jU^83Bb4B:}Լ-)[ִM&;x`SYc|: Ѻ:Z+m,~!GcN? >N8>[y5,l?cc ]9F+9(@!	LKǺ˽2v2*Ggf<ٸ<7\?wGoI^KlaE5[jtv<T;Y1MA=|>w n&	5S>rL'3'yԆ!Zpi ɺ]M+
sAO/@Sͫ20hZb\%:^˛⻑nra'!YF;ޟ.dsIN4OALZuQ<ӞJyPhm(ݲ]ۆ0Gsk'+[7܋UDDbHbI Pldo#Dw1zi?C?%H OCcq9+2Z;>.0&};}o$?iRdw4퀩	D	3«~1fނ@:hz/lod֤m㿀2M1.&'+8mowf"f?35=6QMPw#zjYn7/f6<JֽV5!=;}TKߛ-P|pygS:K[M	,Ș'z6l9XqrE4JQ;J8+ϒA~ܛ²Xh{=HZRڡ=Vɠ[UAe<O]p.uC#1x+$g$WZGÂ(|20K!scMN$B"fg*'8u3Rl.qpU-(nd2RՉ*Gk7kεCB=Hr<ې6@aeVB<>`ɖvb~eq6M||uRϙOZo~bA+@w)f/})|EL	D[Mp>8qׂ`6M5:PJ@VŬ$nyzn%؏Kx[|SG^S8Cz^VǸ[@ ̪7)ߋRI %'EOѝ-pLuP-*![<[Sv3-^PQZK؜F`Xas6ou6iN{%/ZYW[tݱZticW~V;i>IX[*1L
fl[|C~oZ0%C^}j":%<(:ͧ1LY\$w'w٩zeIh1`)*vãz@w7J4TO;zQAS/Goy_iohM09BMGڇdwNlc3Wveo<
gC7LWR:Be㗆`}	<O8pL5*6W׿\f
l6a&'%X%'˽Wγwd~,=0?b0{ C~fwRo9%ǣhO'</XM?˯WjZ,geN3pl*pTSɖWUvxc>ĤpD1ZbWpPlo5h00GcH`6-`/'ogp<#\r\|!R.^naUvnGF^+*}DeU 0=!.Nn<.V+12dzpwttxtMTIwVEmS H`U_ڙ&`%ȖЦDe\3E"g` P؉.;G{/ˁFA/%$,~ilN:	7'Cm
p"Gq:MzG__e`څILa|S`	)kJy<nSΈYXJ;BAV\vG* Oc\"?3Tcv-[2EoɊޒ%#zK>l[2Aoɂޒ%jOҷ#!'z!))rh񜉅íwڎfe=L(OedJuCuY	R?H'Ř9"Cp5Euj@-{%`:+oz/eK;eVvAE
gKj4e̠C]y[yLh"✬GS;D%\~2 ғl9<6sasuQ&NL<Wa]aoP⛸U?wf D]6zPR{EI_远S 8ގlqeE33ەO)Z 8=syƆ ¨Y+3lXî~GLC[ Źᣆ'N -4Iٛ8b+r1;ܒ;Z:g#.?_N9z_.QMrY%H&% $]ī|ހj`wexQdT1e)dX#c!BHiGӎ5@9:HbBk>7V7^fz8^=I-<Dv|.2Y!Uq*SJ!*7nƠ1o2\_SGYdsz|ojMd#<s`_J6OEkZv%?(TF-2_-9o܋ã=6qO!p-ɔ8j7b!':I=,%ayU^pǿzvUt(	.7ɨf\æ`!ʔA8Hs6eeћk1t2J[R`!"I	Bz &A|^K;W'E+j`Fz0Nkŕ5fgwP>}4< h'oFvd)JN^-c")4t魬D_b%ͯϜ>A	t[O\n-#~DƆ|nG7#%о_í!e;|ꃝT<}68rUjEm'6EުէMd =jnz&&9sń+|²aʲǩ6?`a&deWAy2sz	^,rm7aɲa0m66+`	(i05gzHA8нE7!F"|vp='S*J|VvA"+@aTfܝsWhшiQv%Qˤ@) Y|N$мԯ)  <;MlʩDz6CAjJ;юd#{PyUq/1bY%j%N%rTgQjBx[rÃZD&[3h9e&ل1&XPx6Kmr}] ؅%qXuO-ciTv~K!Z6Ѱ#`~MbXO&FN&7:rRa{BKvZOr{ڟi,?٨(OÊɴ9qlblF4۟9!^p36.SFS+3j:(5Gk\#&[B*m[x n
~{?!Fj	nͱ8E	_y)vtR8'ʍj~KVz>zUݴS^9|e
D9BgKISMa%g15s捲_|P,<AAxԆ]	)s;yC% @¦+qKuP/DIEЖ57j<4Km
wJ6/?M(
!Q(]@	-CiֶxS4'FȽ)4a_4)o26;x6JVC5	0?b\~Օ}2n,5Ub~"<';Nwd/~MH_6(g+࿏7 :W ||_7w҆@{o|z{&6~z!ČCXKzK${onnr{]ev[ml2wW|h!}%Cl#y7̲-h-;CHٗM<c[}0զ[u>-p"fn|Kwjƺ=;lmoJYaHn|72qWLdoQ;=uq3o`}jN-j-=n;J2h<S-9ޏ2q;pu<EFԏ?Qd-ԔD"}ǷH%Bl'xC m*HpEB~'OvYpeYk/⛇sgO1N)JO/qGU?zؖ(13χ_z+߯G1 I o6+ĝp[=wpaH"p:jC<W_g8!L*~Gf?	bGw&wqSs3M2to>1d<{f[Io`<F2~6Fɨ[1ew]'XHиbĬ,I\E`%B
"˾ gdfUeV{)0A3E_:ٯ
gȣ-8Ka	+	]KQQ9F	Jq<P9Bv-&Ԫ58CΡdt5t<9TC:Cz}ʡ0xT:K(dfTN"{_G0ϫh3m	a'D<]Ht,$Ec{չUtK8gٝNԩs?ʟ<?IW7W6Ş$,JzLJ4F*ίK/xE;XT:'f[+HaJWC<VG$ZiRfE_WN2^翎&lDhFgoNY_=Y)wkҀ³~@8+Nu4 \uαi9*\`@YUV*>rr6	k*u˩!.rWg|cɺH|!x<[wQNHBX;=5LHk@q[y[sJVc 5W@`!	:SavW;$zpr Z-K? {7YHEJEB1&P;`1[GScFd8a!==6Ұ;E\\'xBj&>xN0A-ss-1Л>yO.taﲒ,hЏ-q]L(W!Ac:{?Ma}.`sG_1dKq9* m(	1b0-FdXڰ&܌l=:v2"p㛟Yq;Ɇur_:1Xنr0Mjzbˌ8&M4dV$
ތ .D]X]EWiaspA#$'TZeNw)	hu@!f.H{W$7a}ʶwPF54 oIpY
V_|.Ќe\%lhxʑm?xհ_wQ04iZ!a)JbV& vt@ڢL59C؍ZDݱ\>)?7잼.M8`6]@`O%݀Q(}3Laf^	
tw'ߘY*D2>getѱzvԳ'T={ Z=bz->ňfw{=>dt(/UX?`ȰzծzJ3 `ZMu&CQoH.5u/HCOc=h'6ct2w4Yzc7Fc'*PE!ZY|4M/}2pbn;gϺl!mZw|Kp6#cu
{Դ}ux&ljql$|
|htt>2-F|m#/Lx:Un'Zl_Cx>yD96|7&>Wl]Ԁr#;q>n8dԫd[ca66#J='esqգejlr*E	;U57 9zRFjTkiC@B*ݔ@d9)O  N]`קs,r&^$dt"Q]M7^cGia

S)'Ύw=cBgiCFu|=#68@U@j)e	|xpk/}"ThM0gA=ꏨ}÷qQW,Yw[*S
yb1Tax ޟf=8},r/VDxVvIx?;K4ͺ`y'&JT\>jX
X1Vq(̄/zN62r,:Y+l I c?`^(? 'EijA21a^-lmYp)8aR@I!@ܛf}Zk~*nj ͵֙ܒ騂UDFt6|9ܫ)Uיҡ#~6	TzgeM/a}cgж'{rEX)z]N<lݗ?!c;v!0 T!=h~6u @h;Vj h0C$bRNhvdRr%>O {ޔҡ& N,/4^6hk6\1%GY Sʙ|m;Hա`ZEg<PYSeCPIR.%d.hM/g/-Z8E3-DJn5fgxI!.ڀ2HȘwJW`cHځ3/}vh.
H[)isVٲf'`lbwۣOiS^liٿ
^sؗzW=9q`|Δ}X%6
$C F
\E+nOaf(m#RW@	\u~s֚ބ9Vٶyh/xt>͊gv<<[M%9x4nְ9ā1bD947p4[%@n+LEx:[0ǨSE.go3/
!mJ,g0wܪw>R|PC)at6[5:Q7.*~qᦦľUŌU~[;;?C%͓ǐNЎaWba&,eFfWpHg`iI}='rسR!I^/
$iPO4$2]hgӔZEN55YY,Ce}l'|Ht<"IEqFT2;6?UX㿰6H75=1K/DGp($0jauJ}]l(3^
;'JN}5H9(RJ,Ks}	;>HH1 4?*V˅&>innTW8SI"0+֫)x_y.s4cN<Plfne.gLEvI̵:a9*رV,9^0?>3	DscdHƤPhXDNľ'^eAF oƵΞ1=qKECDe)1l{?&sJލP4^/}1-wS>AB(&xƣᢲ '}L^ǻkBQ@=ZGuafߨM:亡LSCoi||wS0;/9gg1Kf@WUOh2;CYb"wMusN?o((I9@yJ:Ђqz3dv>ːC9Lff-y	VEAn[fTe2y1q,5ⵕ/www%_D-k8 ؒzG})]J!ȭޱ. v pKAk^Qѝr8/" do2ހqv<q3['x,̸]u1˦Qոvj4n0զLWy>e<~%Plg*`jJ	gi0@(D=RJivoa3'WOhuG: w!*\6C	=J2WYuy4
+?Zt Գ.Kz.:p_ /igp++LVZ.I2{U-Ùԏ(M_{E;C%-tl/ȟgK~AAFnn1Shɛ)g.mf$Zgcwl}}dRήE:\-o^ԖJn2]}x!ié^==Fna
uGAhnZլ?5:\Z~Q=2{W"/FPLb}|JNS84tJ4hea-_pkjxZśh#*S2LYmdW{އX
JDrztM/xiSyĵNJ%$((ZV{H|]1RkP1tZuTq@vW7&Ў|y_(#D="D^oFZ|H~SlT\aeTZABUTUح,R[IҖ$P۵
:lT-mq&WcJ?<7KMaVk\ht sV(.4>X\wZ9:R4W,Tl[(}).bꠉ))o&xeF=bnXomNvV	+<GZ-́2JEU:Fmq4$$*$84 ha+6Y+"HK
y^DTl"͸
1@DsB
|{QSHʗJq[qݽO5Mmm_]wp']Ly/Rv,sKnL|"ֈæ
q!u fHK@lfŻ"=8ʷVE|HYL-BWӷhR_'tG/QA^&ĘsV3F3iEY	E-Ru-ׁCFO	v7lQmۨB?7tm%GFJmԲVƝ:S]`ԇVOY2$7n4h.IغDxn۠a*Hn2;ݸ~v-'rf6Y:x7nډ!7mEQ'F:x*=&/wZ\զ(7n Ǉ	<,.s/xW<\OznG:vqbizg^%zF^\LۖS%"m. Ѷ"
	^Oȳk:_8;Mw n' ]ZHF7eyI$}j o,	UՋ
(M!7f=U%:"3gIH"[^_}$0T*ۧWG:H5'uE42}[ &cv=FF·,iZѱ/,5DТp|ŵicstǛsĽ!242uyK5 c*k5z8ZoZEFazlk-zDܚ4tVń}*;rxb7w5^;I]fNaŗkH_΃"Ez1giM4
(ZE4UٝR]Oǡ)F}Z?٤	,&{=S1G(v0
 vlnS@9FVEBcR<fZG0ZGJ|!BمҜ~q_AWg|FqԆ'<h'fCvG^PkԿy8HU Fly|b	N	K]H*-jz-*̭LbIkVJ[R?*;kpTJ`^0T[jě+ƪgI8C9l⥱a;R@M*Vl1 5b}}R}ơVʒhF`ϋWvG
NS|=	tf`jhjȱYh1o>w+e輿O[+Wљw6h~O0'liri֭rhu~,RQ1Zj3GmfOMR'^nYߗYjx6Iuけ!^9zM!Ep5?t}Q3.Rx~WNvy[n@%&u!>6pAZk͓}Vj:OwtB}zսO
V~E	8/Sّ)86{|T)BNVxeI-%W?h9`QܓGK&0)	q=CjQ%zxhfuԢ{韖U7OZLS[$z:Pwxo7|s|94u^3 G?ǐO#·a=?'8?Y A;#+0'٭w޹S`GWf.@-}&&n٠{lA7CF'6G
7KلF
&h͝ QA6h`aIVװs<xVFiQ]No;NK~D0< Fek1oJFAg7Aiu5P6̏M;Woz+[;&pᇃ*9~a0w*?EI=s?M%`JY^IԄ *O eqS1$F;]¹|libؽ/VmU.H^rZxMzIUu8G\|SCu(UK[#,>p;R\ݰ[9ߣDpBʭ{:>gY!aH1/k_VW[v}l4R'˧z̐?yeoZq5ݴXvE:j=G	Y.zwQ;_9@u}Ô|ǓU٪ tՔqG\9jf*o'H<Z=/Bgb	:fB'حuvUNo:pmb|2#Zt@!l/$Tm^-,0I.Ac)J?vF4Ulr~wKmL*DL+j;1n<:]ΝJe8@<uyǫu :udcgA|hl6Un
rXFJ0T&Hhza*n1)-g{])T
 0,W%?Pٝ+Bcai[y[b%I>{f+n@IV*UM3yVƽJQw/F'pd#䉄K
Rqp;;&QGK% q(~hVQ{*'pg!'PU^}SQU^մc>~Xְ+(-oX 	O&LHuB'[Џ@XRBƮKg<|ޟ?maT4.k	ěBu?Ut*+Ɠ춹	~ɡƨuYERʿB<{~U ^H0s!>a4Ĉ((AjB
?P*|"XpjXf=FEf&##XPQAdJf^oh]Q>X]vAƧU2Y"Op~*knepv?zMw?TgYfT_g]|YfPd5[c+<$-+ɤ5d,G,5.-f="Z#mkV=1KEܜkKN~|tmNT_vC\c
۝q+lz,.'iQ_3Sݰ!	զV2x4b~;+)|uy?geS8UIr*0#Z-Q!U2,&37;o:A*>v%<@X|\
@u$ťaKl=ga*-e)z+FyRh=ޝ]a-ᚉI}>qk Zp#lop&uxe"!2.sp1>ŃY$QmLQ͔C䑈JkIPDu\jf8'T0c V-WY$Er%~)=GէTìko3ce<p*B|-GU[TDq>ޅ[Ȕ5cǾL&gܮ8EZj×:tq>Lalk@]#I%e癔һ |z!JǪ^[Z@	2<-1TkUR仗Jfl){_.I>a'VsK,O}nod#^}2nRJHQ(=EF ,R\#ZjF63d,޹H;!7&YoﱷY
I9̹PSǾRk^˔dkE3:)?2d>NC;Hc8AIt9X Q])AvO}j8=a"Yu Ĳ/"_)ݬA,Wx}O}Ǧͬ4L+?<|0ռ-lg[-cZVݖsK&JUmzD QEɫ4f_X9UZo4!b4GL#N%I  zF(57W p6LƦ'ϳ.CﶬP6wХi=77:OW>鬸$y|v#[AbsƟ0'*Pv4ȉbV98 5z(!՜++> Qيaůኹ(#+ŇrڀLա[n~rlZizt*> ,s=DZ掂 ݅`zIJZp־Z%&?߾gW,1|pic39-)%N^dڡ(73-8L:]57̯mmq3v[i`cLE![ǎ@)L(0|"qSbdT N b Y5I3ͨ76Q++2fNyLas*R +C`z9Jb\32shC|~1qG{;@'=}`8kwe+bd9Z2ӳ=˃	)о!1aQ3jehf*ko)7jKw 	4?}:ۆ0o[+;(3P6kJ|,8=LmB \"oEgjq2)S,N?HVX:/-AKfXL0_GbXt4mbFǘŏſкVW.
 Y(E8`n>Daw߉y(+ᴙ@8̑sӻ
%%tSN1c3r 6;̺`Wg+VAQi?ax#pD	0}#tm#M@G\3.+bJ],Gzy;yb)T8(ivZMhvWtk>w4/}0,ge> #lb\QlPB堣H~+E[ i[Quq	%F3gn;:8p㨧u@t5ar9Xl*CS.Xߝ?@rksh6rJUi-[>wo//Z#zf1woo)(H_9sA5H*_({[LFlW|5M|>M(3<] "ft)UNQ|sZǮf!Z%7W33b4`OCc"6hwkl -L)|0As5O1*(9Gʜ(ick_6L HZ4T*sa(qҝl
ݐVqQ{
Gce0]ϣW0~Ũѝp~[ -HL?kᆈpm
j{WlNpZ~FsPdaP̓0R*g"hݿxS#KqV6leh{űLѫWt8NdMp[Ps:Ώ$ݒ1_2X.4^0X[DgkvӘ5pJ(![`Dq`Mߪ.ȗe@Zsl/*^afCVVɱ+q5VIϼ7[W,+rgC-hm_bBpxGb CS<obC؍UdhS~h@H}Ll2ds11w-x8 =vwyː.<J!0_@|0<ܤׇ .Stf6@Jo`A?5³")i;w_zQWM|{Vi}M_Y>u.̶7|0{.-|7ȥ|MI3kć6 6[V_-Gw{]>0{'SG?O՛];]ĖTȲJ&c;96VxkøH(̌A+AFMV
<@׀TQ\nkM#Ёy:9Z&Ժ-@3K>$l ӣK93C瑷ι	8.JY8Z"CN!-T"PxpNwOOD0Y6sd(⡤Y;p&HD}W|kx} NM;a􋉑+k!$>w?Ew'x4-]*x`ʍ_tAʈ@TjA໒)ze-oas(-sB@c'vg|P酒 ڂK(o }8Sx`qV2/gV?bK$W̰SOb^XQ0;j둁exXܐf?6gٷcj`RۧV[+	J; @H5>V5l"2S=.~D6{B)%gDRf@4TP)e)Bv`8_GheelkyI0Tʥ1(11>:@Qa:s,
"Ebh_)*0y!_KCRv,VpjԪ>*P'7p_/Hޔޡ!&k
wra=W@ߖAZi<2sݯ"Q伧 x>l?]4k9͘D	z&z MZM47'Kp3Tyc)fءP5*Oe.0
8`7B)ya覮lɃ:6~Y@ WG;dyYvqm̪/b)0<n,Y)2M_q˥N^"3Hf0/}*Ni_Q[Bm!dC"%Ni2PևM۝.u]4̄ߖwyna{	ڣnCi5p]iܳGYwwZ4AC`-Jq:{gEY_c4l-a=+oG	̈'M<5嫈]{BM*T]2FcӅ4糋0?B/BS4?7/_|1J͵`mĬ!u%DQ>@4*53t,/¾n??ϲZu|5ֿcaÁQKvtbRO-ĺOÂOQnJ7K@smuE_nInԊT 7,hyN0E!AXYD;U-~,Nc`w^@c q܈L{71a:B	Tں5MfZܚb1.s)83#q#?j38L&
^VtKr0l1{S=§XR$kbss-,OJwn
͔?I,\^VSЌqF~<38U#
/gUPxnχ07-3s
XxXJ|%E"CؠdS>ejy'H "̎@P6'D;8Y=W;jLGX32foGZ,Oק~pb|`XaN>j
H[?~frԲRx +j5Á{Fvmxl1+6L߽ᶦf0vTI@+`믿n7přwF޴)G\1j}mCO#K,1lx[+JCM F0/:d=!
1kqv9&h-rˇS^QurCv/IW_ׅßVƁO_WmVЂcⷔgkm8%.2\LL9;۠Y"ZfhBf=[:9%ɷXMO*·7ٱ5.횃Re_ϻGtiO:_ &c6Y!=z\5YyMojlµ&Q6v9Y 3J޺@·h<e'^>˽?< B.Pu͡$M_s`e4 6ay X[^T 3op9پ/&oi$cٛ1[wyzg\T`v$Jyh3D`iTV! ?Ę~(s+1pENFȱCʹ &$VJyc]J&kad6[kOƃ0 dk1rh#<gIZ!*yYYaQz9t$WY4*zonR{qK˛ҚL/4YG6TĞ*p#?q}ୣ
C|;ج#o:+>H-AB$nVaϭzVߑ:?~ɀǑD<Nǐ^sm-ݓUXݖSe4&DL 6nkyGVb/M>mt$?48UGi3K͚,	ָwpPi:=\nA@=$WN=	cPN x?w62u_`JVrJÁ߭eOE=1JaRd6m[5y9KYY|@8upб/@/l[8_b@y1}j"J?Te+!6cpaه"7eLӐ`t (h>g&FVWj,H#GA `ƌg'ʩlsPFG:4G3upXbm22XzM\3^n/`]5lej ~
;aZN࠷47Fz~$ 6Vu@^˰bk|
TKdCoZ?mreb^Hݍ6: k"Du
IjeG ܍S>'!San!CEu9&l']ȁI'׿$	-9ϔ=!љe;X֧3MJ0Y:حji+w*.턓^:*.(N[aŠVnpii/,g@'@ނk!iTpTHYg
T+@Ջoek*w{bcBIW⤬UKZ	 wJ`IGV2LTEDޙ֤oDZd/ȿvm'-1jf?Ԍ}1޻&ږ'%CGFkhWV_b9LYs]8KbD+0[j{ZrOG+;"TIdpEZ>}*5k&<|d
Z3b2dYCv
_T|f3=Nz
v:7?+%_1`X֕3ݻnj ᠿXyφwBP\8y9</z^Єׇ09p>X')h	.!ݖ/-g:wGcµ7k Se-=>9eSKK{>llRĆ6f[F!}*PCB]iz+q6^HjdAU1QeEaJ?6baů=IVQtD2WP:
D2<0MRڀyԄ:9e6Niwph.zDf9@fYWi昂UxE*5<坄M]v.Dj7C1?\WVlv$C<U>U)AhK~8 )|[A=?}4(קxHX0,ǑbN	H"U4	75i#axU%%3^ַ"QXO6k9x;hl>mf/^lIj6`S5ȾK4xlU̸͐}ʄShnoe6W4򘚊zsKF!\.D*ᖗ[14
H*B*tR%<LyNG8[hǫjH6㇤Qs]@֜i;M
Aw.rX[|	8IH\4@\|o23tXv'OpVǘn;%	sGڑ&@z_MG4niA&i}q	?f>P(%ol;rn)WƢ
$
M}` kQVP3s\B<_W^*-+,]ZYݮN*A>zLC~6(A:y`0C"Y_˹Mwaÿ-1,R
kx&s <Bo9yI^7|%&pwYb¦+spQ3q/ddO#|?1b2b{8-em%|D&#gtm D@DXLJ\`dQY$䓬D(>P.)JȌjeP@Y|û	-C(ik;ъW2GS8l-o9^"Иx4,ehG9|>_G^IC_*INbPa*=wkuBTi)ɽዌHD-K`j^әI1Rby<n'bװfp'+F.r&3h4J	oɦK<̻m%cxUk'}t5Fc,5f!jkSIF饰9eGM~Rx۳>p\m#=j40MrG{65K;]IH~6ƜF4gئ3x\ւ)00`ZTCƱ!=*$AV)F4t5UJ+gItv15kjSwUMԂh*%u}Un#Wõ1x\U?1,ڇ2n27w5!.Z+]esl_sIeWJ$mK'Ňr4Lٌ*e1B6Ӹ-Pfr$(\]NW|R9!{˨$E'>
n(boɒS3tzlsˠ쐖~>GcHhx&6Av<\Qs~I쯘6+'J
\a|<Wk*U79ug$EZ' $4QHx#;29K&Ǳ/Vd2 *NM
7mS;!"BzPF3XiDЁPD
B! C-(a
uNϮWkBTyZf+dPDTCyխ,)NO Ls?0Nfa>a!8ݵ@t:k#C`^N0I:r0|	8oqW5XC$7e:6C{@f9c."gIqcyHb|%bݓnӖ4 .PPd0rI:Aݱ.Mm[ClqKzk͠mj$Y:f_}0&!2v4o;9Vk_4YZ9x!N,r\ko_Uz°qJBXOa}-ǵ	?3?3[O1C!&D8|D7{'kF$bOUe}>b֏8AcM,ܸ$DD^o:08G@FhXxp8O>K>zMgLtX44LLQ^+IVfMi!Aff\O94᮴ܞH۵YgHV<S->$;eݕY[pУĖ12PQgq>~`U{?_P%G?heףn
]ǣ	zޣoh24spaex,dlAGtt6P	!bbxg5#7S|s9]0Υ37_Wpms9խǃ<BbѮvVƻ{Șpn=IB]UDfXk2ti5]l+VDv='79>*`54UBװ m2{a|\C4eZq҃BWċh} *%l	[Hw='*	`7xpA
u}&_[9nlE/Eu%_JH+4 t4M|һj'k#'oogw?;9}O7H}sjd	[9?^|nݓFgc3|t!C5WP3l|ky6ʩ9NOT>zny=װYeU6SNc89Եc)xt 3Ն*{@Kcj+VT71I˵N&,GË}9Y0b(~[ghi=ڊӖxU42w]aX~}qIF.Uۅ)go3//;Nɷ磰x/7$7wEÇÇ@LKWV1,i3pc揷O-3Rͼܳ4v,cᅗa读&|m3⮍^<tjڼj|[z#q$@nSc7u eR6I0hzXU+WaB-LUq|0;:F\	MvЏ_&TuGvg!k7ÀavCѥQRlZUѷAu13rfGJSKan%prsאvh=gbIڈ޴!O?ԏft߲wӗc^-Gt٠dsǼ{
Z``T֑S:iQ8䈥iZ3VM|g1uTF׃ѷ,kIhZf/40;>:7 H_f$`}v36Scݩm	<Dy}rfX^,J'>ʮgOZ(k%	!]uߜu(hnwves{.&<Nz'oqY73;7q=Q}[MIouǏ:LthVpNs{(J
`(0>_|l-Xv6ñ0B'Hdt>
/Cd˃"Mg )_@T nGHiQmeBW;Y76%u
IG|qyhޤ}0!$Xp)
((.$&-yTLCeqv"E? +jU@7.y /~t{i˷&７恼^5^TDW[x`OYc/Ѐp(ZQ!5|ᙣsYnL[v} ep{_Bt%2~aoe+sX6:=r'dop+[%x%obh;2(VI8~sH q4#LTL?>>:"B.WP#qB̐}_͞%F^ӱjxt?ݗ/~	Vq?n\l:K[qd4_xu>y{5Ʃt^`f9Kpkcu^`.DpȳQ20,	&͞Vom2-u~
,4Lfi
2`WZ=-|ĸ}o1+30ɀydXS1F9 @_mBc^VB/qvp-ՙ+=e K1m\a{o^\'t8`!:KI@7*|}HSRAnZ 50\UYoB\Jf8oհO֜n;VIh\z`C
<Zjiu6g|7i\AY8dzj+2aXLy*1?kX>zf hVD],&tC;ͫ$NsbOC޷oyPŌp]Ȱv5RQw"؂51qDҩN9lSi$rn -ClSape~7IU4	%)|0+*f"600)kǤY5}ԅIXBT)/(ixӃ)S}i%gC/pZxo= nA'
lHȁ, Ɔn/9l^ǵRᧆ!E,olVa[?44UXk0R2#U8٠NO=ScnyT:rP,J*9ꁇgGǯl%Y6oPf!wǇ/.K"5kjKu;oQtxt(۾d&ND˗}_`\z:\^1,$'uO<w!:_P.2lC}u;n#Hd,/"Jci&a!KoIDm.Ȑۼ8#݆*hW'%:Q,M4s<ltҋfn{JϪ密;B\吢1U/'?AFE5؊lIXj3^2ËSi&lH/(M RF{ 3]?]I\?D6+' 健a!ۃ!z'V9-EY>GXF.qPvQ|ǆe֌>IqS1mW&rQp6a?SO-^MپOܷFݱ&t$:sQbkAޟt5QT-(k1M ʇ"/HBn&Atda<zm8ᴠ|,,4oxM{d͊JT,{=F\وQ!Scdr 8
}O FlwB#Ty	:aJT@k8
{>VE
-d>ղA<Pl@E\bQ$tQy\*6r9^d&ڲܚ'="דKn
Ã3\p6NLd6j|v':Abb/IZ4*.HJ,_w_4?`϶V)AHCA5qLϲSaGVN1N/%H_	<w7-3~WsK~< iFZƬO`T20)N>ZRJU@D:8`F|^ipϥ۪+Ðc-8P+x9$X=e1=/]}Wĭ@HnRՠ3hen*%ݠL}WZ;P,'޹3ve٫][O	TdI,kmi 0 `.fW	)2
fQ*@2>7Xm+<X#eOE0jPD * 3>j . 0wv0Hy _e
խW`+vUjZ{	:OhIzSRIڔ>ɚ+X;D]_u*ےzdLRHE̲0\Ĳa
X~}A|4z_J|)x;%vz.qVglzF\>;ѶWam|]eǽ`ĕ:pkO8'!wJӃYҩD',ǀR?Z6=I(Kb9<hR%\ggT7#yOg?3s	OJ	@z:|Xonx2}Uv7LkxOgOxd8nOT{k``}`7_tiPQ^;Glzt͸_`%񌺁FUƪSyN?7uv֤7-DAL=K>YrqN	C.|Պz<dt]1񖆯½ڿ!9]I	$b`n}ifC(WU\HE|#\(f[,X%,E9غl2e Ho`t=w
NtB2;?+
yYwdد
QN-[ڐN?Cws{h>cO`QWۘx[֬q[c
$qm =퉏#QΊSvu]gTeS	Q5.h%o}^1(II$ÑtUB;1Rj!JYтX[qZߊ1{FNѶ`zM03TEoOn4|}7<FIkőж,vGdwMiןJݦȿ~fb)$>6sb8F1ӽ@OY0̐KqX4넆b\cyi7e9?4Nצ;hVd5"d~Jl){Sg4$(+
D\5ʜ4R.ήI?VNBۂ	E
9Ыb2-g1ط!ccH@|qg.UNSn4k5uq>QD
e1T@%ӏ^x=r
 ,	^K~=% 7~:6A EoE+q#ܠ݈sOSb>A
81s,4  	o#$+Tp#2#oBk}2 )rb
ѷgxs&{|F"Ѥpx|ˇ-d:H^
*sex>]<lZE V_}l:9 6'_qnBG#NR &GzFXg\OS`vZ=00Ԕ2.}!zGk̒WW(yV*DsN%]	]|>-dQ\WL٫æN
[UL*|OA ZݤKLVĥB)jBQ*[$ظLF:NsҳVymS\pLbK/CwGpʧdAz8GL2)n3;jpjcUb>wp5qU>G rsu)c%H^f˸o(	Jemu-J?R=Cho)ݚ`(A2"G8!nVP;kq\LzWU'̅t5
q:0J;(nY<vaaɠ.K#@<*6zXۺu~vWK%L2ۮ0#Q 
CÒ*D<>YW>j=|_EF[9ᴿ5u)_ODxO+΀ ?[_No 'ljz3(PR4X@w*\cWѝ&hdM	םD\sPt"	pP:
!	 w:iK.,^rYw_|>i]++ϿiˮM	;>]~|P]'iz+ZsqU72$o[urU},w:~	1?lIi8=7@]<k;KXꏡ*VdW0UW\W)۽ϻo"HYn#\>Jn=p\[OJ>(<`fAh5v(䘃	ߦXmGWådevı
5C*hQe}9I3{&SQ 3e"E?ƁL' Txldѫ4tv=#qRwQ?NYyr6b[+UOe	~LIMXǻ1aZ	(EM|% "d3雷DO<Vި$FG?kXfZkգ&{nIBw×Я	Il2g']rO+b;;UKUThPJz/!Եddڼ9>WjB𼻞^R9Gզ[-fKv	l`*~TM#O8CQmpnM)8/t>PIg<uyWhv=6[g]!Ҭ
)U?BT%Iq^FP容mNNk7rLlP'm(2Lq<b-h䩚'Fא݄>Ee02LtѠ5y=qs<F4aAx&>k_Z w{vHz㷧~9j_d5eKPx8xo>G|Nd"
"0)LW߭MCC
F3i'2f}Ӱ_I"Ά:|}5ɧl^|0Jic`
-þ"h$HlF`323CX8msRoOq/ýh"s$/:͠&<9=>8)9>,ljXK~!!se.jƞBscs}G]IJ˺L؅c|Gsj. XȲ!]ky. J'+?OpXh*nm^/gLgs#L5 ;ݘ[K&YɽV0L 0@0	Eu?r!Q_6<3ވ8){#C-uSzQF.㮇,
u&#ˌf=1gUsPL6AY~j4kO\cuS87"(قz~n7q)1?͘jN]	*&|W(~L@H +0'E&VS}]!CIӠT@3؋ -/ݚ_w\ɧh# Ҏ^\n>v.3ls
R:\|<nYy9!yapa5GC0$=Ӏդnc,UE0T!?Zab<"DBd4K(S&.Z~0zcZ=gsJoh6􌰜KT"=	eԞ#пe=a X>[~	/(%Z߁5ɱ&R1E7]܊N_+Mc,yr="^RzKF85geJ+!:kqi*^ 3hw]*j,,qnoW6<YF]ˇ.%/nV]Tظ@n{uVRF8J#U5C#
`RuVͨVah_fסuPi6=h7r0$T!]{tsr#,ƒ?$r5lYrLu(+qDU@kP+*GwgnK=1b_YxP;&k+{vCx<:܊۵v^&=
ڽ~d+ݵqz! G8D_6LCj]TU.i%ؼ;c˓@Lf-6vK|fM䯇[o.SJ
*$uu>}(]>fzkyNH]*2߮1)<3`gG{;NARHs5 =z3&cGcBPfGf
* U/ғ
HG we.4(".r[-L"7!>Cs ur5كgY%4PмBK͗G$9/q,%GW|2rizeHke0)#eJ\8{9Wi3s6/gxYGi0XIF9h'z0e2rHJD ?7ky~Dyfͬ<a^GL+%Ǆ=t5=_Ax43pw3gģĒԵMkW挃^DTQvOE[0h>a=[B.Jx~QZ gÏ<SЈFX[뛐3fd؈@txW	9<!Ɯ3EDK nYV{dq04:xLg<N-z=WѫϧlN568kbXCzn%;`}XX7B=ᖒz~ڴc^aljL= feS^3>|<D(fnWF>HQ-(O=%<h<~9ɯNm/ff@˃&G?xf(t~	"A	skaʥ澘8㨦T(:o ,t\Ǽr,l{,~tJMZJv1HwrWq
s=ƊX &KtŦU|5n1*RIq 9{{Ay~Z:+j3v;uv5Ҡ֒~Hz'2SnwiS|e
BHv w(P|;F8쯿jaSuP_%~ub04_}5a5yF3:nDKTU?`bOCEԘGZ_8J.${e5(*3ں6CPz
F׃s)A1YXL!#Mni%Kq+rLazfAPKٿkӦKi_8KȘ'7Dr3i%I\2I/t9If
w돭H32<	V_AޕWxRaE6A#X"fZxoqڭ *Ip׉sIˤsK}fXHweWa-\STMF0"|/4{=`1U-;kcTR>j#s?S%օWm.&Ι",u5mr|9|f68Wq9"x3$)eA'q%+١)]GF {qnyn;?-ےt#=[ν?L//{d/{'19w\5^0Z )u&[wQ-;aWv۠۰@M?Fy+׉QVg}#J)tW0q󊾄,"¬kxKkx-{3e'tz(d*U<yE] G黭ֺPxȏ-FQqm<-@הwBFKa4TԸA\D*j2g9zu\#ҊfF]ykOƚQRDFJf~*o=m;ڝYxpb`qZ]q,j/k.#`U3AzPr޷<Lhe[+$_tu|E?K:N&Co+4اnU3y+ g>"@^O4	@xarA`ʡu:ёGH4C-#R͓AuHi-N![\}~ P3cs84}ab(+ozGma~Z/ŏ޶Sٰ]/Z-3
PQ^Ps<á}8;A6,
>[FnjtnEv9'pVHBa4Br:{
ʨQk|U@&TqJ2(5-TCT(F+Go֘MM jgJN9ގ_hJIRm# Or5],ƚ*m:\`p@^Yej;^;vwx1Z)ƔyH[΋hx.IOڱȜkfF'Y^YS6oMҷ=Ư&99
6JRh,+B2XqfXW	+hKα5'#qLFPi>)cva<f&)[pgԻ>gbl-Gȡv\aB|?
$'TfՋA~hg^&HкzM}@"R| <_xS+Ͽ5`D,	O=22{ZNz^Ǫi6ZSÃy33IMs*.4P׎?vuʸV+,&'ԕ
L4zuDeFS1,0U
vs	>7+V[~BV}s)^+y4+ .sd#bt	/+ы'{.(G}<l?^&T}^ msi;~at+4m/gY)^F+4|϶Vjdo zUq>%\anZC"80	""]GJqwqսk^=t4#f}ٌMAOm D_HߧƺRut a򇕷v`99UgI	236xL"Ɉ`jxoȵX7{1ZV`σd㏫D\)pk\8	TXFIy}'_zř-Wk4%r$@5(ږ	|/:A:gXO>	aaÿwU'KPiR&[ȗ۾>'"vvč\`C&Xϕ?]A|61ϵS%F$R@]㑧fi4,eٙS`uG &V.F]mi˶'aҸHH6ȹ#L 7ڂa|)8Ae&k
΀4jQ#Oٿxh%RB֥BьPj_rFr#]K7u}9'F@%DeDb*MZb~RTg9;9ZK?+ʺF@e5,@E7j/<,nE]HEBww	a`(ނV,ˑK/0nQoɿbMX԰t	"`I)"Qh5ucSRۼxg
/9#6)/!%Rl:R-&5-14m>|$:pAa@ D}y
L[fրQh~a8djzpf:?W#51eLs=Y} n6y39gÄ́$(YϙR\Ljx@#y{f\VjrǱF)+K渾9Cr gMt׼ı0)&PrVKtL[(ser˯tIdı:tEr*}2TbzѨfb
*^|ZO* gCYu,KTǱر6Yl=,h}:F)+,E`4_9,:+};QKɶgSXp"t4NcqRZ.ΆwxNZesmw>:ށ0jwHCH
(~C:QZ'h,&Rq˗<wEd*T)"V\l>DJ>4jыVF|;İ	
}-lXqEae@*\L-D>J8훍ĚiEVy]^ YMyv1^~oJ=/yƴ0.6W{69"ue2[PO©lX[Ȋ A9WJ;U>dt^roԎ:gXE4T);ӟ86@;ޖV:Dt+6Fg"r3T:`b5f6r45~uNqni?tk?s>l^C2܀6̓pӂ<-y]9_/ 	QgPFI7輘yU
k,'SaC-QEB	_=6	Jb}Dmۊ靉;6\Q<Or==;nr֩>Q\SĮIIxV4dL О5&\**f51x@qgb<qA`4S]w+M\FVY%IiC2|'';Iv#}].f'u|@P%A,^y'vM<L&@|9\	'M6`A.nPl1|:AC\RNxMA9'iIVI Rh9mOÅaʘ)tLaX(Ia"E%|+ʿC=)$F ϲhdf;h.T=^v=%KFSb(2Xs&A
kwk]T$\EReʢ4Vvv7嵵0xF,͋ɧ+\@/[b1|'Vл,~@ý񿝽>qYa7}/N3o
Z9ջt7d^wI9)/4!ÈIg~xQSIiӟֆrQ0eJjVb]cB[AZfEb+Zqt˫ini*bVrOhB{h%8ϯD櫩޽Xa7G.ld6b䉗.-S73% l+a:T+ =_^VF w7a8Iun/3=[/aoи1K	\/n/@rIǗpubhĮj@U.nzo|^5œʵ[Zfq|f0xڸg_b'X?{|DD0Y(3oG$<L.=%3Tt0jH~420EH$:50ф+$J\ -i/8耧pT&;_I<\qmD@]'|H'j J>aa`(ښPp#2q*3lxi[j?_G{1\kd#@@
dq^AmXRSD,i6;cfX)qdz,񵚋b<\PhbV>\.[@RvJH[FJRaL$	-?$y9DebMs9q%%WQi mA>u^J1rН[Y*EJl^^6Kfky?}_vLwS=_wr7@'^B-e_yz~M OgaqeYy	jIbi-w\g)yFEf0B;g/zOڈWloKؤ6"&uNHMҶ<"B$,-+W5/l5R6'/f@C9C_jȐ(bD+h-bBoWfUFK0}(5AgktVb(q\,]I7)U`bJ$Vt=M)`}'eC)#5th	cvhePc[Wc_UJ-Um:z>`ǬnVO|-CXjMF-UnߨlU+2rS8/K5/EZ>,(UBH_< 92$+iBK*7.ֶɗ$KoҡE64Җ8hו;^妅RBJ+
~ϣ}T+ma=k3L}V.ߍ7oy#h&P0%\F8)/}vA.wOO[-bƻ-S~)YSPp89JM[Vm2 @({RNQ w/Ź>5 M]cޛ9fvՙi9FX+".'+X29_a~iU	U #^r_(mg4䟲yv!!fZ`&E\Vq[LNE?sM	6w9N=5.qJ	Rn.tb>^}<v3/2:;%⿠ov#UDE]t*Z}V44}!:PW]֖2Ls܂a%
&\yPeo00b-x"f[`+@#}{2X֜RZG۩5}YO]y˴nV(nE1v(M2*c#OnjW!#Rdڦ
&7H~RL`)DE }(=64Uo"bTc:9*ʊ++ĒO#yް'BySNKo@$$U.֪:
O\5R[:37r,4T
xBiC +i*]I>Mb/{.Vȥ5`;%PVnxMZf),btaBƽ,>G1ZNk`8aR(ppl(W1F,oG)nt^SSSh9\`̈'FRWԆ4E}9ՃxOkhyuy@-~ݏd	'|v@3@})et75:T
+'cW7'JVE#y%.u dA.i	  ,NTtNi}vw	%]e&8~yx]EĭMdhi챺Qihgf475dl!a=
bIS+ts:a@[@n6ØӁԤtO&0raY8w\] A]')g^ܒ%$&ڴ4xAH_iE]Xx'H2'?Ijc`~s⯀Fk7z`nH^?:d ٳ:9\ͭJ1sBD?v? 6,6gb_wE#=f$`$Lp$/сhT퓘\|ٹUv,ЮyIJmLNb#uq M%)/Jc(%cX1XXQKjPMyHOB9͞%Jy2]&mf.eZ>)QGU0	>z4o+sSV=0=C1H@^>NbwhnB$&YJ3PI*cqY>e%7c.(dGl|Ȅ,Rxt&lmV1¦aF:N$[-qS~a7!=BxHC=6QMf%.%.(XIֱJ""r!+hcP-{5@!v-ޚabvXtg" x Џы)f50 8ghIW8Ukl`lU%]cKUr..duZpA=	)+se&Yt&2MaŪZȶVz,q'TLYX2Fc%}'F퍕X]IM|>s	:]oDho)M<f1I%j.HɲxC(oGO;B=p̨?1b{EiF#*0N2:}ru`t|f4O¯(8f8~JH.-ON!o$[ֈ.c1" $JͿĽF݁,sc!4 @[~txSɧV`{ū$'xkOR-͈S(Z04j[>w0Zm.GRuӟƁ+5leךλfn^'2)w	~Ҏhf1F:蟵vk
WIa1| Er~3) *ԡ.絘=ͱY#y1t4M+tslo^ErZu*\.ѧT}U9we7꽖lr
SleQ0.e9Ec^!"0@,-2ت0*k*;/D`@q:*}ҽ?\iS!Ck@_"EqA's5m%GڊfZs)By^D6GvBka֚;<<B2pR[oGyH=8l?ƤAڼ2 ,Q.GxyKG]+䋵qҒJw.fJ/݋6*G0N13ލ'3}5̋vN^<>2Vm#!ڃ604#}7:չOmN_x-
6c'٨:x(~X@!:LG3hhPp/)͏*Ѐ
ʓI	4Seo4SzM1c2]k2Cd[0fxl8i:/*LG?<[C&r}%X ".J,+KaUIaT}3 @/pqY}g%H\"s35ZSrЍnHp7'{gww_m6JȬ>Ъj "2@aO62aBZ8Q^r?eN}]_+֫B&AM6{QY=kXtN	Ǆ$I x$5^=/[^ {bzg g>j(iR_aQ𝿝nXW܎+;sYzF'pNwlGnC(>s#<f$~i ϐ,
BCȰf4EsCjg%z\_ReU,;BxZ(Bucp\W&OZmS2wӒNscEZT%Қ4OIF<U_%e8N*$=gpNӫt:&0	lFW kaUPi2ybv'ow.u
3*`Z(E^APY|+Eqp{|EWՀ蕀#;M'Ԫ_'#A jK}hN|4C4ס'eՊYey|x˴V(":A+Thi8l^iaĚY/ *_<%RqԏJHN{gC-[][)$<,=ĉ)oP]-b>E]6n/0*}Yp预mu6Q.&M3nQvFA#gP^YJweal^Gq˭PP	yoyV!Afbpo D[k*G$Z/q]ߨs<5^LDX`JDWa&цuP];FT亘GL:6ai'2aSf\zGg}mv{v1BW-w;v=8eK@CW);7=Ŝw{nnm,R<sVo {xoJ1]L8E<7a NTs-pWBr{R^;['ю64]@^3<8$:M;3.g<
Ј&9[^NBu1If}ArQ\mMoU8lZw}34 ю~Ta#(m곌5=yZXC}띦!W`Eݐa;Tt\NGϼ W#yyF!!;1tT|!redzAqkZPS2eD GU(m[R̋Z6Z>1$*87mɚg1tרҌA`CPAw" "6)?0;_,/qag%țGE~gDO;>眮^{Kp2(7q"=bG%S[O4(n)FnIɱܘ)LR>c腬zn @ػ}D	aƠ]Kq`i*oRЀ̘/q*[\ ᘼٕ4,z.L4893ioKMREq2*=R@95`Sᦿ7dLrʞ6mwEsQ0gMz6eBR/>)f{i0i}J`[VapԤRCw߼yVd&ʩSMl?xY(v~O`Ճ܃!UsiN<-=qO\fYw-l J33GHsVo^zR?_9$mS,F`Z+#5g5͊U2&J/̊M^]=ߔ+V)C,Y=4}X>j8><3ȑ'">*v&|mYѠ1䟚LH<0-BH6KjOpڴ*y	TpѮS,hŏ~Hh6RN;e- x@eͯŔؼ5U96iQH;`FY	E,ہ'LXZiU	k *HW+_K^l /E[RXbt zJ"rv7}#nD6ޤn*DpZSy1oý$W
5L5xeL8[ko9avf(Ф,m_2Z9]Kf1+敖UXM oeHs3#Yo0r@FBb(ԫ]uЅ.sVłq&ԉxGiEǴ]Tc
UGZ"W>y|+DX2o떞:9{/#ȿa|	gv&6V!r6ZRf>ʦH $OOuNUԣ6&)Qb,mRр#|} 
N-ϻVvL]npဍ|S(@³t>i?CfK Y)M:?'Jy#yD0m0z7aE	. X	Go(DҍEq_ed_?x41.e$nYp@() E^Mޣ 71JV͊CMD6\,4Y,#Ogu193FIT$cNs))/41e/$U1,)yx@ʃa`kEI#	3&|GPl:[, E;%Vʋg%tҋ_j`g. cÑ<Ր2(׭_ӱf~/tk qtq=
SH(KXGTh0`M>D1UP!Cl7X4oLUǘ	wCRS]}t%*ɩazaD}Rf M<I(a'
2_ziҭ yūE!}XūN6X*	ƧY\}γ\V--[1y	X7ib+n"fT9KO<q?IěFx,|;X.VsitgBmdST#-Ne[LeڑfaY^J82eZҸL;J8C\G7HaS<!_ax4ѧ5WPT.PT^Uf5[y9)/Z:Rb[UxkͪU[wÙOybڦMi1'HR}W@,Rl-O'^xk^>E0M_xMP{}NZAs2?wOaZ881mF# CUcGH;vȥ~l32!t(EMȂ0rsyy}Tzyy832=pƗ Svu#lNkJ]Zk/> z*c4,ƪ
{F37ȇXff$ϡD=#vm9w+8UB,[|%E1|E&!ZrKi)«rԹj&!v G-}7n:w5^ {FY-~mqf`ҊQ^"@.)6O.K8G/-}^W(^&lW/K;
!LF{c5dٲj5jڠ^4*Y昘X6Z(L-s#l+/f2266zlAwqڨ =MpO@2SE'pcLf8TEd҂gکҩL8./<ϖsT>i4\iނ`.U񒙚-L7Rnc3xIDGgcO!$S1m*lhw64kc{tb<R#¦nR3+tvAL
u/.쇭 JV)0LkUQjlyrE<M0B;flޢnuaBCwzO;Ag\ n,`ZCUۻ+oc_e3yViza!Ws<Hj Bf+_y0%Nkզ]~pzj
wUaSf^e{f_`b̝d %Jo D˽t^b>4WS`blg&=D_3'ʏPRH^tXM[ᯝ_2j5\rsjzpR݂l_@,2kI!+Vxu2[T){#h4aughU7A%ZEJQM'h&Ǧ-,b>;#kK}vMsESf^7ݪ4P`%"RYkȋK/RE&_Wo-|7AkYדbG=VD|Hk,^`*}|l
muqnM|nw:6?ެٵ lEUUz`/E:?tT,xC{8#qWaq7{P~u_gh>9]i)e6NhɃZi$'r貚|wIK廃/]bےtW+~u%D[9^7٬mĥHw;gj<_64Ǔ9GľKWO:vg)!?!Y>濦	tCx}W7'7|!jro?ޟ4NN9ɲm$%pG@hYo] )ppƅ2m[9/<;Z-ч梭ȼCҌ[q}.L{!0)tS4uϽ'5쁫>v_1KG* gKzV%k!"DXsܢ0g.[ElI*Ho	Ef[y7?R(yu4\0|s#W(~
RxO"[L}|BFil6S<hG5B#-ẓ0K]^a-B[x*PÃeT] Mͦ[,%(X]}+=YEW_][M %Xѫ:۔ )8	)J\U~9# -kxxtjÆ% ,j	{EpC`-`:Cm@ե1PSߒ.W]TrޭLcX|Lqw"TZ(%FOHKsV%*ߪӂ˰zc'F	Ϣ魸7/E*CZbԤ:Wg޿fkc8gxPJx_qq*O{!nX.ѻ%n/cMT8/pl~ڥq:?j!v~RlL/&бu9~=:G^O<>wfPtrך /Ɩ'by{E<sw6Oj LYՆ9M{6ŷar؟u\z<(gnhFO{8Oqgj4.}y63!7080hcdӭ}ty?x;bL'R*0Y*>*qLЙO8N9++|gyfɯbyg3
QaD	y4Oe&5S4:%b;[t`5 W<"t $ڮʧgJ;w:Hg%	1@N<rlۻ(bu1g98PyY1D9:g9 è:5涳8C`W6!#"YqߕܴUK>(־IT|coQG;H*9zΆڝY܀(W[r^p{8Wg|LWߓ-\m.j=ɗ^` !kl6ƭ[^<+(Rt+UWJD'ihl0jelNˎo'+3&"1-'a(Ӣg_ڄ薹l2z6O)T"8#l\<y+&'
i)VN]ﴬ}x`4tbG=,^D80Db	zXMFԢw:y6lS^A./**C_ܽ!8Mq:Ns!ǝca33^1V^
ɐ JuI|p6ŤhZWhL.TQLw-|r}eo>|'螳=V*.B"oXNsXUdpM!yC<er,L)Z.H>ȑ1$K\q9|j4O6b:3fu7I(wa) S=,R2MJtȒ;f؅i%!VH%Ęckߒ29+MMd*Uϱa94AyKD_dWkIH콠Є)>M:0#i$va@`P)2Ayof5YBXlglwkv9[mZ*SCVVy[;QaK>  86T#-ɂ*Jz*WbV]Trk
Ծ-;tuF)7@|DsVF'ǼB|&$d9;{{jJ}_WHCrca܇,tN^AY'WMF%1Ʌ9Qfi܃f*sE3ΖҙrIf0[Ց\%spڔC 9r`ϘbpfkJw("k0Ζгq.,j{0ʮK' <%bڛO&u4-|Β Ӑh
}k@O+6]N'1i\Tɢ>30$xtS]_1BO0 Ӭ\lȱ aISt|/,E~=P&:yѲG(,Rax@h]U9lYF`5S0ze^xο_a
c+|9AmfmY~3W9t1\,q<jSVΰЯ)t):4Cnvy<F#<*&5ےmx4A-%^k	x^̯͕@i"1Ygd(&h>@@fT" ri4~4S%<tܩ5&((rËpY
t҄[m#yU/֓"JR]0"uI$Ja˃+7`̦=$x^f@)mVgLE
|@ 2"'O{fiOz0DJ=>ʣ$aOx'ԝ=^א񿸸({Qdr>:-%Mӱ8
!bVU\$Z-Ti~HK}S0-LtWTʧ*8ƅ#nw_DPJ
"SPBMhHbAV*c+5  吳lJ!dX hd@[|Smj۾-vAa;kv;wr܃Tp},5$s%XZ>'K`֔ynڭoa+7lϱ_QΗW)w3eRB" xU/άi=_+.S>L4Cɮ;>~`ҖlxA0ܕBHHX)_MS-qؒ`-OrrS-ʿ=.\an&5vdǝ՝Y*ڲRepyM\~}sJɊ	R:wKڻOq=j]̉+8W_+x@*4iv=̙\}azW]oʊV1]C<=(ygN6X@n]Z"xb3e˽6X&\jXg3NLJ%xgYKlv@%rrE5v'攏m:w7Wx/w'>?.fliK~VupV6~r :	 jX!7SbLu#4񮘪|,tbs"AYN=@iZSBt=xO|EM@VTQiSRI?(V"F}#&yux9q-̕vT	s)A:Q=3,@mF2뗌63fN_Ojd̿[3ř!p,
7g2\u	Juyd*tS͍lw~	N5PgWpLioS,\4Amy`*+٠h-{i
:O٧<돲ѨZaA;hsQ\!ci1zIiz_p|2d!{Ѐ
*aCd*P4gUtHOA%rPBU*ϰrh_s0h/[1ZzRk&3[oSYqi<%L YV(ϜNWd>HЪ/TW@JY@˙{p`z5u2*G: }em I/nS8Yqc8jR;g{WdtcS93«h8
EmIZX]})kp>XTOh "Ks6Bpo;^iٕ>S^_}0qK ɷpO,EFڭ>T&p]rwgHJ(TV	u>#	T
39X)#kkϙ}	\޼3mY3ǍLd4iKsA[|X1-S<iL~sßRt!u=jAn"H4
t<!gփGAI1L'B3G368fi8;$qB4PyS졜钪Sr3#PING3XS?(-s1me`::sݑBd]*I!ۋ܊m{22kQA9ҬG3M!|H1 n?s*CˊܐEW	3<FΧ-UsG<AUݖ! *Q;0[iޒ}!Pc#y,Ž'O侞yͬ58I[< f\T`U
wHtos iҼUMnn Nat3:G*DG
BpB7 1s+JnJfgc)I-bP)-Q0gHAD|`T'r~lO׆'c.RK˟,\!a\sa\V.#F)m|gXǨjPxeOup=#CĶlєhd9\h̐M{m_t[CC'b>f* M$$$1N-&E8JAXҒ=C$1W+h1`\~avp?y]Q
k?̟Y>̐7oy5׫x"ZFr(w,<!Cumn5$16_ajlՠ.f"pZmI2rØzI)ؘ4ȧ$r8+G6'U2B~DЭi4=[{ly!:^>s5UO+Fq٦T[QL?:ҏ3t(~0=ߘqvW)mmDbG XzTH۲+i<B3̷ؓAw$2LPﻶkI)=<d4`!b˗,0vp+b("(AߖRf"NW	 ?GM3*̿kBskYq/?ň0Or?
8;JkY5M{%)m"HoPy/!oz?dHIrBJB`&- '0c4qdT]{L.fMMb i1A@oW\dޠ_.-t.+ ^X9u>y_E 5B/
24U5hVnj\6[ Mh(威(W&XWNV#jؔksee{RQ}|WCiV"V$|`أKIRҴCOX^`pq6zz5j{isf;(֔RahV|44_;,fC+5yK:t.saWž+G=aùy#~9;>n@ȃtlMKˇ ov>4G:Y/yuj+r>1HWz޻JTK-(J )ּٟp:GۧnMvg;pf@/,B=d	LZ>^lt=KJjd+k+'OITw8+3HiEho`;q|sO>Sʺ`1Lh3֚ K  qեH|.0'vZjQ<L@71\0!܈V谚ţn VSb"/4HW#NqZgC XxQyoHzy\򡧿O4YgSG+"<\A>,j<-A-	#-:)G
l<G,uFԟl~+bC!L^j#*~[Da~]ηb]ڄF
7:qB'Y8Imgq9xBo7֬YHk6pox6[$Mj,=(]"cy1USfkrH$dFzi`qSKl6.Mo(]:&\7klDEcyg_O۳Q%K4PJ<V8@:nX 3[0>~^I's>mϖBl슽-ѢQC9_VSg)m8cw獵uUAfi-!uZ0aOF'N7<^)ӂ)5=?EhFĲmSWmJnS1%7L0Vۚj0R\U`Qi?6`bZ׭cLJt?mtAA06ֵqPGUEfQQ\>_u~n[Y{PS9D;8$fI5̧F^^C磆Reѐx߂eꆾkX}3EWLClA++|.]-=@nzԯlmdp :0uT~LDD"#f&*Ø=0yoA\iJ{KЙU k(hCrlBw	/w~r'eĹԻVg~<>&ytJOe&E pnZ4:uE٫ba%H[THR Q.vĺ3
E7ƈޢ-ۼ0'uxô[ً\!>L*HQ)NBRca4JN4v\ښ)RY]a{>ހM~	Og}by_
cˌ[p8O!V1M.k $`CRuvbYS1hlI%"HIQ©vAy-7KTd҂M~E]=LJŕ,2Am8c֩AD'w7FFE^ͭ$Sdҙ<zH!na/~z_H,1/ncsNկ'ŝ(S"R&5sLߠ/t/J%>ִ&j:a'T-ٹNFtڍZ3eAc+Siy|<0\5F"[D^/}6XT4,SFSXg3E>P!˨{X	ljkۼE㱤G]A)e.I^#l\ċB=v-e\>IZMɲg\c){^qqĜdjOI{Hʗؙ~+Η|f`PP
k,oG$zÏk@zFVP߉OQw)Q?(Rg7W^_Yݒe]}<`!tu*=z]w#H<8CBײ	ҡm^'JY	ؐpC@ˊYogJnX#'(O?M!fGVee.8)XUw'<2[,nQ -8]<!≭qq&AF	=YvMazqv]Et{mpcX'm|O[YAX9l>;_~bP	/B4q~	*hҟZ/â}6f;mWtlVz>A9Je[4jP	8@_q	Ua1/hZ)t\sY l?	]r3(ٰhNS .8y#Uw]r83g+):F
>9y(KNm41,5$#+%9'`Pmh_u)@oGNuzՆ\W_:$GKs_ǭˡ9V825^"r	UO~>:ٛÃӌPO'vgO3sna8SNo2g:7-<M#:8<{yJTpGJin
r#1]d7@^c$ہ{OgVZhD[j&$ഒLqb۟T~~{r6.>>x{o_eQ}ˣ+B Z~2Lw#0[w}MXCi&t㣟{aTt+Ŵ7)	<c<)+ZD"1iXH	'JTRcY^km."Snliùpp	vwa$kqA2!\Im\*rTFN3m|>)ҍ		0ۄ]+rOr%Hwd,,J'ACRbE?.yq	h
k.W@s+Bb52Wҫ&4PzP%ABX4mkb7)qhR@uګc(A9RMtĨMjk"L
f4胗)oϤuP'䟦Qg׈nKK;沣<!3+Igg\Hd۽	{\)?s	a
v0Bp`SP o{V7.'H9]P, 2$o㽣/NNGǯvO5ڽ
x Fѐs?։l?Fp7Rk1AJ[Z	Mb@ˇC?Q7`hǬ؞qS-&d|;0rzDq,.N8WܸQgK{)bNxF|?ŖMoóL={w^[ ֠?y	vIkbiwEPUaް Bǲ1J?(13	ӈeüNރ`pPުmzl=	Sn4wgƱO\;\XRzU}fFEΪT-ZPӯ׃B,G+i}כOf\s5b^c(V<d3=
zɆ#T݇# h")p4 9`?4e{6_"K2s<#MӔ^!cjNPqv0AH3-2!Kiiد70Hѓ4ӑYpC<ց9aGT
W&B4MA2wn=5[(4MV3%+foF3|$c
NbNVw@>Ҹ9q3dpCI\pgWyzG{5M>rՃ[ȎOKMqӬ%Ss5*T/P{|a]X8coLϦe/v# )Szp?re,s^8:Jg^+Q>oxmP6LP8'61R	i7Z.p|Z6ʈDք|?|i+ J(a!QP0&Q2Y@l AMW~1o;&v	mdս'l!]O,}PVtns݊I֘%&Orr4VPcc՝b~:/=vrz}PsQ^F_^WAz2:QDE4= @d'%gw0˗xyt"U ̞*lK, mfn  #rGg8SمlnԅX5FIU2ƥcُ(f0P$oyM |1F*g4S
˛d3Ǔ1f韟~ۧy60Ξ'e-j+_Gs/+U\"8ҧ51>'(X&8Dx qD M!ͭ`ʸH%l&ehK'ܽJ+-DAR'hTid>57O~V'[NZ>+AC.}:!{8юC2ǂmgrr>-ũSLdN|B۴O&0OKQ@z4
jGwsL67ЋH~I܃._m_~xTv Gt&[a$aJW}ۗh'p˫n[{qPð#ݰ}[sG_Tf|xтjVr6?xD<F<-A`^Ci%ZE>=OgD<˭ϣ72fk<[Uχڭ`:Ġb}%dM27I;B"KeN*Gb5+Pt^<;F}EteRAp#^^ɰϡ@=ts/Ù-B1ɢ*LaEuyu6٭l==ЯN*pM#]tDl@ዏ?sÊޔ?'x}>!G೎MFfUAqX Mgуzpx|mݗoO?~h&+@ go~ eC{g~x`o/ժ//2J5:1z6o;2#3?25{1ߒ@ׅ<?z^f7uS,ָWs%7BF8!V~o+NE3%׈V^tF3 DL\3,?zIHKR)yt[U#t*%w %cbݪR1$ n
CZBp 1rЦ9~_0RIām"V Az'Ὑ/dv!IRբ'NrTdv'"W
.$ 83NfnE;"~kR>أ˧@$i+Nf-CںӫO	>Y@W/Jrݲ,%"a9]T%LLTIK#RG>Tks?&9מn":d[4h$#iy0Ʃ$a҂dr<:>Zz U?=,dO'@T]b𼚝GZaXhla@l,/AR>k/YR<jaDH@$Bpkf,%!5^]&T\ =;a#ANm<Im<D<*RF^Ҳ7$<.7`heXnŘ"?Ӻ&Ntҍ?ǆXnf	iw9h)$]j!.	ZCDV+.r<C*WRs	c$N #`x*E-`,F 7^B(@*ΑL;	48<x㱘Io[ _Dbas+}(fX/rrakWfbl@>U2şX6zɕY|S?UBQ\|Gщ]k/#I`y+WsݕDt=u1a'UuiEUE>2W[:)ME卮^c40L6B!%ViӲ-/CPtSSAo".*ώ,S˫|N@$E6"Q@n0׌\:8 9CHz:
0(O;( U>7x2Nꮽ9|};du`ӆf5)	"9["f^Ч(џ5TZT1 ːhpJ=?rb1 !kJk](L"
},[zb~k=Zs5}] ns]:O&vz'`z0UGj6e#q?jANoN5>WP'mE! _^Di%kABw'8K1Vu]̮F}L5Qj7r3S}HoP"{vbn3&	zjW5&nÿ́.Q`Q GV`at!ZwP݈:5B*2	"pH	E%^:s|mJ7(ۦ{IJx4qrQ 	eu-5UN4We%-|b@>gEʝ8S.-JZ=.Je`J)4FvOzuv/w_)/+0Pd}.1bB,?7of>5BΛiuV&#$~1<Sۂf!G$A	dEsh
GdNpdS3o4͕2?MĺkP̵\3;TCFB*,* ]2HSJ·E.U'2<UɃ ֛JU%M+ wv㈣GY9.9.\v5Dc%tyJg.$dd@Yq	$V~nԲ82E:iL)TΕmXҭUA%$뇸d
	k"w4UbyS`HBΏV*_MTw܍[7Z2+2:/,d5c[-
@>8֩	Bi\֕y箠Úж'a.4zC:0{9mC`PP#?fFLjh$)Ϙvb]CMLGrre#/)-J wOʏ\~Tz>ad!fmL9ɔӖ 6GԧYHGK(#=1]S	Wjڃ{Nlum'Ō, ǯeS#S΄t\iiziz/Uvhj1KԷɟX'fLx .l/e{`x-Ê[$[<%2jLʨ3!r5Ц8zΤ+Vr:10*n(xϔCN~ ئ=Gd"2O#=qW$DO+U/
52ֽX(	_?{]Q,%5$B]ZJ+}%]@u)TDԗM'!r<J(-Fy%Qw+, sއ1\-F?pe:Xt<h{>lUk0&>6>x%R =v	N󃡗aZ6Cvy8\{vT0q@Tv9;T;rb^NT[TlYpW*qbEɵ&gK|ޘsdnWK1*܀^+vٞ#Xx$Φ16@y<2*+xL#ުR^ԻmXۙH |	~BG8OȈ/r/ .G\XG3pQǮ+ǫ+^LiiH3$ {=ϯ!ȵ-ՔsNȹjʠ0̂$3{mvu$Δ%y0MG"^!g.	ɸ?	iYUNwu8H 6@o<P",I`~%Z'hmv1*܃lUmkDJcR!*
WjSD9L
t勄}=4Z!;zxhZpdX_G5:D-%"­D =*NJ/ɲ isIg=v4ZT7MG92Ztb!%4ib ɓ6&,E;+0sLR3IU-^Ik?
X:ZeܧmpݠRfc!w<:>eb
%F4PA.<d
V}T= ]!TPۼ-!\	I#MFΤ n bW%uLD@&Q;:cn3mF3`ٍJZ%]3+,T6S?	,H77{!j?oم4; o_
ke*{hHTܬT2XJ!QOTY||tʪÍ-pv9ӆ=(ʮWt]b^OAjacҟ9.gI[9nTVBQ=BQ4<]E*F0<>/JOHN1R9yK5@(@.-dZ*#PUGQmWN*߯՟!(h<fV=R).ŇRtl^+iӰ!57[VF3ՕZ=X0]T]9_G8,.?~SՀc]-?~.mҳ\AaH^uWڀn*53قxXLJM܏GRLaGE.yfF4]k`-9p~q-]n9A]8=}rn  1dvm+ٵX	*BPok9CZcه'w7㭋[zG߿wͿ''9<»ͻi
4xXUQ*D1w.>fk!38|٣ES[ZYaV\cVn㠒4fև`:dȋڕUYӣpe6`4)WcwM頽WApCu1D^V0xONwO{ +ea7|0G*2fLZ1@n?c)!Դ
a)N</(&wDP@3:kEhhWÏ:$=1<I~ͥQv\u1%`+D/t
$Yz֨6; nS;!E1G$QTȿEºƏ:|#Z0g.[%n=IMr0Ht?ĸF8n@P4_f5nZƵ.ɗF9FНQӆTۍUʽ{1Ugp4SP@nc} Ժ*tC?R]}^ZZrwVQmHB\-7ZXkJWZӽOVݤ!)lPryC=VYt8dŽn5F-aB*'>JcyM Bv
zdGcNǽeA70U٨/q?A`|(~)9;T\_1fѠJǽVEhu<lT~ӱZ,Ͼm>siK>&PD
9FnX-7\exGlahDuW4aF+_:L"c<1;EKݚ3֢񡟚֘@lslقTk{e?Z:4)oǎrt7u3},0)x	*Y*AuU7z)CKqbE/x{ʹ*ȁ2zǘHԀ~(&빍1L	TO1.4v#YtfX/g7euڎzZ(6qTH ccO)`F.	vLwЂKC&k%5O+l2]N'^	Ysh]*I+$<|YD[.95ݣJ"yp
Fq,u2NMzC[&9{ȄvO tO68y*!whA Q'K"%#qبQ7]1D;ZT(a5-YO~r縵z}1TVQkT$$@|sY\1Gw[8)1al!@;	B)?+kI+YrG"~
6GLgl5٨̀9LB.^l[xZn	'yh&Lqg6rKCs^=qN3N<6"K/ <r=-Bw<[q
8O1Ϳ {D$To⻫qO|R齃ׅc)u¾Vk|gd3k#s>>(p]!oäx%}|xv$mI=BSJ&lλ]})u:*dV7 vVTk%`FBUwa)Ma:RrA󓡲*^RqwjQ5 Nթř%$b]?4w3V=fGmp˞u֘pV`UG8Bg>׋wm5QL_"B1ޑik)F~/_(,!*r]KJI\4w	DTs_Yg
j%AQh7r'Qaja0v5۱̌y``ѧ̨rT1"\1̂^}r4I )DJo=:UrFE<'$VO$¤BT](|;Dih	eg`ov)-8_cuP^OFV[
e8$&cJ$ح9w("9Kü8_q A/J_)/G{K3E>cVQq*3CQ[OmIcCT}vpHW_j7.RmM|٩̱vc_7L!jQkg5A!~©C}n+VWP*-u+󩪟:&m+?q9h\Ρ
r@5~73)a{l8}nȹŌ:=cC1Q?}gZ}Q@*{Rqx7X_吒ٰĩ]txE=Y]?.VP"4U@W6HwZ]cH)80_an'ۚ:g |i*obT@;1ݔ߳fMsJ-r\:S]۔70,w:$\x%]4*?QvWK3S灓huև&D@c6𱻋Bk_n+HfW+v	ll_R%<Qψ>MuSWiř,#=\46J"v<vHK"<AE'ER&!1感_Vti9NmO_)N.d6F5eΟf%8f	׍@ 2$ijЂoRq11Uai$~q$5,rZ*X
:VW/fuJ5(Fu}X­$~ʍ2`5QJ.V
 Zhv!/SR#eΓ@~2enm0.Ta=7.19ehO}>8>lvq
 Cri5tUwbh?nϱ{ڣ)zԽ-NڱS{nwʵi׵JXy0 gmG/~9$CPk2>qxގKם<ɲQKq>hּTي ㈧9+IGFY0E+#y@1Q#^?}ݟ47d\^jvVʟ2iyÐ#ڙAd=M[dJac밴\Xh:-v-!Xmr-P^y~
:TAwb9t[aKdr)+SB
	۠+u9KK{BQPƱL^LwNeHσfN@v.~@~ֶV!ւm:+z=K?;A`8kv/ԭzH=)%_P	E6ѢCL2~!Nj4-%ݞbkmKJ-P1<pkMI#ؒATsH?Cvd"-+Uspܜ/{JVlqh3ҏ[8\HC[(ȠOaZ<z-IMuQejɽm}>X}' ]-E#?԰.?DR;}	4\r]= /gq2UnDBM\ǎ܅/bU$?ά}]mORȬdmB'Ba:Qbjɀw2̍_XTY#oz@]$^rFe^!bZ;R5yF;*74b#QtsI#XBթ	݊N^ex5,
54owj,v
LeS$D,H.SW-;фb2)Qj^8T*ofgE8W3Hd46֔:(%1okRpxR:ǚrܲ'}V̪bf;ɽ^'Dإqn3AZ6(둊\P/Irkd|IDlr2d*W̺4ꌹ*=ttǆؤ1v @=)9g:q#?Lvꘐ}syYP6NVQC3@z+Biqఀ0ف551ZpA H-"9!6OSAp{]x ^wv
p}w*HIM |f}ꢣQG<3,fbN#kNU۞Q_9蹜;f2Ot@bC
~ȹ?8WҾ+wI]ӗ+E]ݠ%3<DBiTm<8'G"\6Mk8utUrWBJb-'e .n?GNUΣJ6?ksW)rAFEnvGn֒6{m[jyK}fH5jǵ?#F~)ZH9.pI^\+dc~^t&R!jAjIǳj%H<7W堨7;}n%zǳGyt[Z4\L= z!^<ۊG,{Z-N1]6-x^oY72p}ұQ^ZR߇0	2녳JhpcɞH1KZ7)ا
̇r 2W@OȀ'm[I/SӶ10=pX*ƞȇ*Inӆ̬|EW`[Mf9.Fߒ!zH3te?E߽?e?b=n"XK%=lv^v7ۼatBTYzdu-;;䲨s@az3Ԕ}n!gX1bSFJl.6$$M1sEDvCR"@Ce`QPIm	eМkp>g32Geu]HÀrn<W1,'xs쬒+ }&V  *ܹ|IƝC*}ݢ5	|,<~EcjVf]}jQHHRC!J}h%LҘP^GU9mNxK4ΰ0z$ӓx74`#<O:xek0S${`ۋoE-7bioفO-P[t
wMUlcLvE.R!=/OAG.lJtc9\~VѽlQ؄Kc"i'	0]m[t/Yq=Y8˃ei캕YB D!k9vض;^Āg6~$%]+v٦n\y
~m4LN&s.ݪM!,v.MY r0(0א*<sM
c9	sb	tK*J?lR15q6
D҄j¬ _wØvBn~x\ާ?PDpI{$ucEM?L%|iz+uбQ}^Ln eEa5]?eSm,$omJĠc=}~6mjL'6j,M|<)8:'{{M78jtA96m6/9ޓ HQ^쳅i_mAwȅkm|-,5 "g-y=	hʂgV娆хRbT~Op"/UB31/~V!i퉎Bl'>Gc:^1?'ֶۡ¯-<Hvxb躆W]ٌcQw2S?s4>ޡ4
cf[of}cT w,ƌIDҐr*63Htq6EJQ0~xzxȳǇ?d+`:=
3u"&d2j hB{9o%Xƾu	$vıxV:Aewit+%_SUm8oan{Y\D}tIIqw0	S4Řk:h1z4ݴ&i9& 9հ ,z:3\ޮ7GśďI~Y\S	Ziz̥5C_PWőnٰRn
ݐsn:Q87uP|~<+3_͠w;]e7w;6?/zˇ`t$Lz%wZP=ws9XvbGĒ4X9)ѯJR!oO0aB-}+U39vԺH:l,F0x@> n~|1TK$y)sM[5+۱IyB݁iBRUQ	ytg*TU8H}N<&Ίi;\tN
Jbm$&1_cӳÀ n..}`]YF 8heX<a8xN/l2#Y"§pKQ jYZ#) *Iī6yɚx2O_sDM[4-$e8x02W&=0Y-j<0D.c u<`hZMkXl3i<)+v),bpHg^\54>K0禄 wYm֞W
zGx*R]PN wD2I_23uJ
ćہ\})X/RcD8$nwf";nb{ҋ# q|W}[/e@Ni㉰Rc(`ulc>C^ל#ݲΊ'GQ1tt׋:<9Z
O
gS3w=f,Boa5eJ)k{IoYw84Y&(bX|+qg]l&4$Ѧi-o&@b䵖w{e4[O ]˜(D2i9KFO1SKABn
]o0]o7
;Y̤5盛,\,f1| rjS}jo[+R*jhdj/)3KT[~:v^P6;aCx]0?Pw8,w+vMedMQvߗOg77C鋚jVz\t_q26MbpF4|#Q~k蜶/oxaT+MT"Tz>8 5A5% 47c&m+؜-zF&XOot!0{[)6^N<mqLjmx`-3;J9匞GȐG4 n9%<,Qzqj㾗#КuNȅdc=ɵRZ%0mVK)wJm+CRjyT﷭Q}%w8_.qQq#?M-S<Lu4+fMv~jb{SqޗTEZheVt:-WV7D,MX4Ylۤ
rq;\pkE&7}?_<;$Eb6hԒ8?rqa N0!C\0'Ȃ`Iun?rJ{B{zh3V)<!Y}aސ4Tɉ/_U8w b=)Ӌ/:җnt%f+i!Sv<QR7l%=mY 1Xw|Jyzh(V|>MYw^&6Oނs_NhQbĊvIvbt߱fAI~sdAɑWoE`\-cF}l	H̞!7fDa]֗LXqzZIMr7rv;yP()~o1V
c5U[KgH'湼ӟQӳCn.wà[dR;`Dz^: 6EwgWyEwJfhR(ϖ4G	~^ѩ.~)>*2{;☌I0`њ~G}\M.JMèEh|VO'âDt{o#Gע(T/wtCE;_++kYbHEło?0`bRm"Fx5MmxeO>?Y_N;G6Z(7 #9`|E8+;{ 0a.*_JC @gb!*C!pmKvFI#N䩤Вe!u8NY -E@2N8boq{OLR"1
BҾb(cǭfX5\]:D:1S]crČEK6Wt[-	1YB^ar%<p=|C .5:<jl[]Pw|ՠ5P0lj@]s`[ՆD+%_UVC
si:^:w9E[HBVf <҃r^U9Aٸ?I#h#Hm$Q4] ^=SV)u"4	ɛtD؎USSbQ\%!B&zȞl coP)ٴY!Bm2/ǚt1A,evn"CZaMB2謝gyy缗gӛdyr' '*nT	_$:|2!xt\آ_*lWۃ-JdEa[!R |1B|P<PXw%S;;łvh_CnINۅiCZdIWvBu4z!(8JP3*G#-*Ϋ+g|'c_^dHr]E0xZgVOflQ"09W6'渿~#
MZV;Y#ui;87dm*(2LI	@ڿ,b6]AV[1 )xs;rK?R q&!٥䛃~i%k>4zG6n8-*F
%f}Qh!.B;wZV !#O3$h7<=P19r!WQU4PX޹_r@zq`kjsWIcP`2iO`2uBO`[2!OQ{NN0[Z`K}_N.o8Bb%	b<	yYL:0S<7dCŃ8`_Q%}xJ& L),EĨfm*$~B΄YhO- +d_HZCm/b5g1i!!-CCTj4kU=;{8IAW_>mzUUG⡛"zJNipU=K`!ĠSΝ'R6%xsPHI-RQvY7qjP	VE-v bhhBZͦ"O=c8,\f928l%7oR3y
FC:qD .1X<ձnSN_́؞?Ўaj
>mEszE'aISD*ãE^aPDg{PsҜӯGjp+h"X/i/()?˟5A;;Aغkܰ$Գq]04ab;v 
HS#OH> xsXA#cpT4p{0yk<v*;UQDuSkZm+:p&xz@%~d.=Fڨ 644j;G~1=6K%\hBI+~L.g˻GÝ}oBxY]"R9%Cavy]$.ZDR׹@6G& R;hE8憎K^">$aA!SC΀p0-D)|s{55aJ}%-ax͋HSXϮ<M?jpAaߣgݕ榽Ķg㕥A"BG_1ɶi
Kl*_}[\͒demY?䧄y13s`u͈OX
PFRNIྴ1Yԃ
#^مܞ-ov&<7N|7Wr;GYɫ5샭4wdJ	ZݭCEv>b_:D)	oE#6 ҙr.nF+|\\_EE A*`]`"͔rnGB_m1o0BIE8s"6rR4êf{k7ck_zv-ٳӓٽ~asa^˟OU]3Jl)7w8Jz~<ZU˞8)_zDn$;p}!J3SC.,Ŭա28}GwZfX;OD;H/Y,k@\9Q,4Sn89uaj"߃и~W oEd%Bm(bg][VlVa^Km8m|J]4DS`&BqN-C>oš%z4:"\6at+6ڨzRԈsXJ&,fcGL"0e/j\5bmWYQK8um>{upv~t`OOO~cՖˡ#>fֱj4TQo;ޞbYRǾ,?9$ۣhl8K%21iQ3VbCB>e^k8ry*wA~)R=cŦe'\sˏ̀ڛ3%3D:ۗcaԍ\ٓXa	lnβAqv7vF6ACR˵c(	1ߓvOe2xȘlWAa
[]i1&Dr?mזSuF7 uoz4m=tmu$7;t66#jVǨ9;RCAt[4OX@قDH47^_gGwE{&o(YJ'`qcjtkC:.:oE&ֺw?7Ľs}sWrRDI%lA0NBN<vv)lf6!vKty=Q0zΊ-~\TTrҗ!}U/kWypAh?q^_)vZHZF\-AvN4΂=N ZHfN:1q fa"MSZ(@]HU3W$עP>=|FpuI]0V[9F]-oCLg^+`Z;1@RmդCSNՐ:K\B	-hSR
4bnZZӏ#K9i94}e=N+VpҋѶ<:vh$ʒ{x˨q _n0-7 Qo'l	R˞#pb-@E	'nINUe:cUfSԔg&vZWɥ;iѡo5eGKݕt:d]j]#hoy wt}S_-^9I4*^S̝V	nFٰ`+pEmXj/VLfߗ	)hFfisןhچ!#\M"GfbYP	^9m	A|BƱ 4XB~t)ѣ5KgL3^;U"dn]H&02&J~6,ߒkFW^oNv)_0&=Y؃j&J۞TS^~΂3)*x+U0VG(Amh9CZ
vr|ǩQo< KRcCn7q?UW{熘7!SIVs5Ay-de!l&p#kn鼮R̬Cpꬓw	ltJUrv.q8E_Jy6Dl]k$r4)z*WۺqAHH(r lļp𤕩w0b8Tn/ČC]bR(j}{TӖ,s=<gӽWOyO5ynӶnqRY˶laJޏ`I丑j Uq{yb	Ms牋01]÷lKUnۑTvs#)W!'';.5Vq7wNI JWF-mW	kKދ}p_>97m%t oCUM2hw[w6ň
6,9WYWvq_%9]Bt-A[lNtf%P01T>1&krNyFS}ʴI_vY@J@ە_j}9ZҁRkx#o@ l13"PnaS@C~x6ld|2@c$?DG@OML "Z)H<H%%xW_,Zn<J%MzmPEj.w<s,(yط96F?L(%"H'B,ڜv$rplmYMGŚ6Qg ǡRK1)>4K荤l)W v(^2IrB#w@e ;cJnuvc
U3Kָ4I?8vϒEǓ5,M`j9-L#+бeNk˩\eOc3Nx -}Ci=xWo))kjgΐf0kG7*of7[~w=ǋc\lm/>ށn4mMC=)Qmu	*-e~L)ЯINdt?/8X?(lSF9p?7p  oe C 03fLm1!.ttu5 Rdl~oc1nd'`XE̹SA%MᯆWk2E#7ÞڹCEQ2"z3zȨVpWCBߚKx;hmZTo.Y2\W5*EU|CJk`9o,w}m~^?~xv~qt|n4ӟk[>[&dX8YVW^W fl0Yͤ0f:?3WqO/l}<X]Slc:2~OBm/xA 4jh<)MXQ!):&JEA944I=e!r r!dfsBRilS<t$Gd#gDKf6}&mLc8hB䏊/54A_ْyc;bK&Hr{Wuw{:7j_(M;dieѝ/)tuʷ8)4|WFOm58,5n0i!I{<\kz(bIPYg
َo\X6qX)F?;3HPW4ʱ- 1ճgf9ܚn̦ٴ dA8ڜvm/I]&d. a9Jcnu;%g^Z޹bpZ,S\]l~nʹ]dϦ9k}G̬$Hf7{x4kboСH{jB5O,F|;%(:-Щ;p4mp	2y9hjhq~h.!xRЙv(H.!wmBx`eVN]F,Dz"<![˨C[WYʬAe~QO$.iX^VhFjpauJcZÕSe>c%*wP(	|f9B#E'35	w=<+~.+G<0ʯDqAXk]۵LC?4. jF̏,6hgl(ꁙK@\h/;AmC)Iy5%x֢hpg/A254]j2ܓp.T(^21|qq'OOg/D	L.JIq;PM':β#ec*iE_ +9|/VۤPoϲ4m/):Eۗ;ߎ!:QNRܺϕiP=efde
060& ~zfj8zV$=W\pm}hY9˽&hFzOL3Oy)ZȝN<__:)k~!#7we^: ,~;eJ.ɔ-KPSѲ¤T,hy3$OV,gAcm{y-F))/5<Beٞ([n,e~M,+^J;7׏ۊ&zU;DӋnm7ONړFuKԨ8{[o,$YFo؀mlwI| oitWrU[5zuQk=|e>DNkD^	pbp3"9O+6gdwon+UWtyua=X{c/t{!=?8Hau.8e$l`Bèe+食'Ǉݐx:Xj0ء$PUF;VqY7ή.&KgǼhVcA4&y)@0ET#+E/MMxCbo@ =U@;C_j\8QAԁ=pxHO#o`r;L憤#hH8nrYƟBHα&ly>N+Xkȁa<a7z%hYvwOG=CcW_鉑>=:Jx.:Ws!1]븁73SuB^k%'`.MHʕDNrܾqA=J h7L$}`~pbզ۲t:_	xO<yFߨ 6I!jůZ`:i=yO4cr}>gf6bka̜e]0Ț1Q`o&8bހq820#\y}@
D׾f%1+ rc㜌ɺ{sUf5x(mxUQJBS'S$potWrm@:zt{ڜJWH'M2!7w|Z5IR1k<~p#$Քֽ"WM'M~Pr',44Ȗ}-RGzźC+CA#pB[Urƣb;ubf([tSE,veCfk={8mtje*F}N:-xKwW^>(e+vķGͱs|bȪ8Ma>4god"w1rkF}k	{hO,HH4x[$kIDhOZOڣ{}yAJZQIG,;p$6~@^ɢl'ywKWk+AO6(i蚶J`~DD.IbL;I63,7Ar}e8MՈ#NdĲ+:o2/G\WWʍsQJiSiG?L')=xsWk'Ux98Ȏi:R,c1P6UƠDn>qB'F:*c`$2*W$)\72+X06%	 H2/lԏUɏl(&:6޴J0![6m/`bjkn.ə%7ǇD67-7&Gr]!`a&ۢyŮ_	^VhuQJWlfmp ?fbE=yD#
ѡbTXs3?EJCOC9j5D("A4|qpՋ㳶mmhk Y"PዜAV=^Z,*	qvJKO˱zKFXxD0 <IݡBiK4'#:`Jx߷J鈗l{J?Yѧpvf+tVE5Wk(y)V ׭"dRZHX":_-!b-r|Qn%@ 9rBjވ.{I?=k~/HQG1\v8m;w1)-&^bQ/={UxfWE7~? 6S>߄ 4"`0}cޑn{=htG\#ׁEQ-w\v1W f#@]R
JbO}Ɣx</>C`
PYFׄV7-zЍUg|0Ss,D`دm.^1Y+).>0eglcfcb?~cp .#q,Wʸ@0N"W\u̔Wg+lv=QڍDj>;[x#?>ȨaqϠ%7$ҖL{};c@ЭDBt/!ʄ{o7%t;WU3S$Ra:;6㚤慬gKjt7kmͲl[0.CW3FCt0Prwc<v~Uwt:Q3{hm-{;18#47~j1:XiwA*{JjhD/sM/ "sN=</'}s[㓓W/_k_Ք`kw7{}mL t-k6i!GD:d3&:oF9C_:$Ofn T8AU	2ai>n=t!|9ѯ
cF^&u[3GH0jn2?ue"r^dB$+޷{S+o_bs"ҧQW!1h{ɩM+V(gn'Vhl!zƷ>F,Ǟi%K#8^9/Y!-uI\|ڶaaL_A+FuÙs|loQ8.hQ3]/v,2"Ja96bc&7\ڂN!	*a韓HP	);ZfC3p"^_ .!gZqeVZDZ>]HvTYaYї Q]''9x2P(CנAh8YRؒ5XiQ_́1b`AϘtDTudvKcqƿ"a9
^laa-.I OԻT]dp=kU7Es.7\Ty#_*9cV:RGNţYrJ
S
;H!Kh{	Zn+NlM2ӧb3hDs7Z9d.=ɱ`jn!`vx2׶!-̇ łH	bVqPod]'՛+~%e61|0ۏ	~>Nd2	Jo6_+lմe[=nJ~EE!yy(rӜX7̀4K0_ոkD${T`PD6	3.E`uF^oR@{L\W	P[Mn$;JˊkYuaF񥇽>x)0P#o>pVp9(ȥϫOjJ1 ! 6k[fdu*N#'eWFC6x',Z:id{8j_u;<XdsݣJ0u*!5c$),nonnndg02?
2_#	lFwY6{`	r}=?{dOwT{7ymC9?c DMh7'Ӵ4[W[.3ښUt6f*$ hYxͻuVV;fº[n֑wߙwsM]z`yټ}?eW¬
hqU,tvuw F|k>Cyk:wnu'kC=:2E8H{7SOo\:ܞM{%̼g_s !X?x_4MI.jpJ&I*MU.Fg7с׈<7X5\sNO~ɼUtV	u7Z6y"8}ImqSp`qky/=
GKmXTkk[C	<FRH2i8-~sHJr$B==Y}Y.(	*HOMsཝȟtl$L)UHx ïUeP	¿h	.#D!& wy$!!X:-`cKlK8{#%6'>s232G ,AY+	MR/Zgs|z͆Yjoo5߀@C;<ɝx7odGFOѼė\hbh:_$=?z HVywumq:Sw	O1tdwAkp+鴹G.AWk"hZgBul0G#- #
s4Pb\Dl['xu>㌓L4,jj1 $q4BB\Yx	V?\ςypb#0)AIMإǹ8&ӵ䁖T%r䓷lt+f_N-Z0iuRT)Y~?FkyI[FC7#̣cf5gGyh|Z qWf6#.xNyRFn
EG{,cпS l@7ga9E64
L
 pK@8,imC;z3|	(`*b{sKMܦstFY3BߡqO<Z>3#h6u+-^7ꛜ0/	>ғPϪc#]a]Z{ӓMv#sUCڧ*_ʇTS;pw˫wf374~Rkݰ*3cUq&7\CT},!S9!AT#_艟U}^Z{{b٠`JQ7\ݭn4DɄ+-"9?[З9A:u;x,Ji3}#ۗDVzV]zⓑrIIY0jr*O)a>]6ˑiPy!HF-RRz֓elndGȉ!O*ּ,;]Ky<#0s)q9X.DqenKQx3G3Nrmow0.Q0<؃}GeFˌS	Ոk>AxLs/t7&Ew{)eMBxԅWG.bߨ[5+ajXS=vGN53X}5A]mR04bq(Dr5c\<Gw|~p,F0TInsr}M%#cAIXPKTxOO|=d(rf)UrITKG3d4]<o޸D,KZ1PW7kJ!h_XmۼKZҦ?;ˉi$sXpS/@LɁd !va馛.B(8uuخwF8twMegkixFS,S#]yLl! Yx<q5̋.68|;lꂗϺ,J-\3xU]_dod/ӫ!cb:+j}RGuѴkXu^R%:.io6[[{A[˘7*IBja
pu[Va@/$74cR3qF;Msq;=3ޜ~U.UrwדNoD[u_:
ýިC &YPN ȭxUdlƉ;I]zA4ΈtodW[ߛ/F.`,d%WO+ejB9
XP'i9
^HjfHb>,򵦅Ԕs^VNN/}S<~wqXֹ3#<wx׆f,jj%-T!m/'^MF2sd/ߒ౩^Y:ic-T`"seލ%!rܓ.mh-3pLmv )BIWb:!^ωiI6)F_YٳQ#a'-
Y9L G,xXqS}^{JlXp7Ջ|kWlD[	!,e%QG%HX-1UU!~Fb욵U<o^{($91(/ǚ*ON"2n=^t9Mgb栯%)s ]+%ǯm7>y5d+إxf$	&7#t3uG;NV&afT3a<45T%qNƦd7EM8I'z)+;F=Aul.ˮWE|Sw@fD|;2EawutmZB[pT1[~zMJH]Wz`J!/+^;)McpmBp xѧdl):"(X%1fZ^BoM*ڹgD)M&x|JYH8z^ͱ022mIzgd-9I(F*>q+
C_@`(T@ˑlZCGv;I{ɺupq;ok+VB$dk2
כXފe}[p+!CwB&I4Gih&&kҘ'Xt9:h^\0|,jݹE\Lc|
xx٬KKcdrnHH:IxdϹf%8_Oqwb_Giu]cY}>1jufMr_Eu;E߰:OmJJa_=Y-(DgDppj>>t. Vl>k[%aVh5ng7&XPR(K,Pe|{0:w]c-8)3{KUQ.d|6Do'6 (ʷ~MT%FNsS-.eU8"]8u
~ C
SzCiQN&yOrFzs	W&*ѩ}?;1p䇸NwͩȚc:eW\i}.ׂu(8~ns/'hz9`h3'vlzA3]_2ׅaoAӦ-|ĸ2kݦRiV68HIh. aHQxⱷzO;dĳm}P_rV5F(2>[ʲգ$o6.`uj<Coβ:<3]h??T럏RNo#}||iVXƸ_>>ڱMbg8F§'$ܒ5H(3)?IJ0%^_j3;	;Pk
ƿo+$R6X0P'-u`TR6+|k4<c\2!2hy	=qД@o5 ̦n^x/Y=m5y>)o,t$q4<9%*Arc5(:@p#JE¨lE@MH`Sa3(3&rjI L|:ɫbfKF?,(_6;;Wdvo+iC;	$ =ϵTGp:+t  ݽA!	+=7B?r]y0y.R~:_Gtڛ|X?@ؖTaX<Ha5 ruw:p.́D|嘏)W	1V͡C.֣ vAu]ȟ
o]}Q	PSm}19#nOA"b62<טб%OL7s1Yn'^t~
.R2heCdBhJ#u̲uK)twW@)Nkq>0Ma2wρou_Y> n쯃B(UܡO="8⨄Ff8]\-EMܩփYc:*GQ&fh:n)`MV7y F-G9IM5rMbw	ȔfNRQǦw596˰oֺФXGlZIѷI	Ǉ^$ZH?@c%F
!`^G0Q⦱|J6QVQWǈfvR*N:ʣTdfT*N @)_<aE,m(	ԎX<p4M%B
tD'[L2i3	оm5e-;:=A?g1e݌p»JOՌBX*#UE>>w:mld)FTp華*lC-"vE)Ln:-٢wHfo1¸V*O޳Dhw`ΙK5)ng],h?ʶ꫓'{8^*3IN_W<݊Ō$DHw)8փu70R]ZBā*u5#/FsR$mZf3zp,&dwI0W,m_-e/~ip#+eUnDenP-z	8۾wPd5q3#mA]BaBSrLҲeM8>ΗOQx7z<	Y8SӿЀCsBzm>)$Bb͸9'N6+%f;ꀒ=|6E{L&\MXYp܊%Rd  yɫ|W"}ux9)5wW|
>nQVBUC[M@2%񟚪_QFTcZ${n{˩˓Ggp";-(5W	ՃD6OO(9&w~%[TK!wau{mnJiډ#=6**2"u/{{	+	xuWsQwX\+,e7 >qє{ח$vk"y/IbY5ufyY+ZXn~?.د\>^º
sx*:ੵ@Ǵib[H|GPB/C+IoH3z<N=f=]7U2/yg)MuCT'tja&*!httoٜ1tDwG" 7O]^!( G>0/M>(0A|NΰhS;`ۀK4֠2q8]3G.X65o˛MVky@N{M@MS^Дɼcd;'F#%24<g8Cs)IQgj|/ZqDp?LI=bf*(Ly(nQ▨#[!$؉4~撽4In#dZÐMDXr9!zɰYlEeQ_T*]ZFx:LCY&Y;;ti nTBPL<KF|Aŕ
囹Tw˽SH̖G(tëHe7PPa_\qЅjgs^Xj4! u(^3bbNlo	 nW bFƂnO&V:(Nǎv=7f?*xVO+7@g͌,Sא\V{	OVљ^7_@0&yJӢeѓj+
`ݣpD
@Wf"F"ƓXh?J}SICk,Uvo%ێih9&7M5M.MC|cpO0ؾa6ei%bR*kJk0TDQ؞gnLZLɳ$TAj8'Bw8Αe9:9Ӹ H-L[T|Dp5+p|38o9gh .c0 %- &v]9z<^,~2R	sS8hyi1;*F	{VԞ[AA{85b3%w{LaYkotX^1H2:gwd(tV(ˁHVL	+G 	f8%'UÍ7*<Xl}Zj5/ϙ;u<OZwW	ٕO.a@~j@yqޔƖ˒V-;o4^=> X$Z]$q]N=cܥ\Oy< q"gYJ N$dC欺]y{sȈiV."00D%,YDPHBp@;!!x}1Ŷ&E[^=ί
Zl' ^A~)^
qP2'f&fdv#ӝbu^5+i?U,Ď`$Q\ȥRݹ(Lω>/v)oOB}ː)jQy^tP)EM؆X"V$?lt6n?eAzʔLwep`:_crT0,5dֺK&/C:lڈ!L`϶n@arx!uishB[]ׅr_?hFȾP>-.#%Áx?;$Lc=f@NW8&nOH*wi0]ZiXK&4]~,RO:D2`lZc".A?~,6`8op7XЦ{4#pΩw+T}~G'UWΖ/
4y;8)o.զ~Yi b>
78$җvrL(=G)0[`B M@LSONÌn?Kύϑw9`FiA(x˷=頾I \'(Hr2z Ϻ@hTpIpv(3@,B~%Vt4|;08~dt4E;N^v[ؾHĲt-\wόn@Dn_bB Ucc]P~h8z"lvDln'}Z#35pkVXyK:5gr.QVQ%k
m${yo{:$s9jtZ1Jr_UsBLZi;FD,VEÜ`3MQX}ؑtHZne;/(.#,%%p#<_ү@"aF˦o&zw('KߍunzK][	|f3llP# F7l;Eƨw:Zo	
R5U/kXƈn3.2K6wXNcw e==
Zafag歄gmWmX^eBi]\_h-6}Ud0*@וT*pK]xMiԧ5h?x*^@Ts8Zsjbh39^MWA!$|R{^_?emr	a}%Xbݶ!wD%(9s1*]wFƂ>L׷ΛvN'B/"'_ۥe&~\%y+]|/s^*1^:q :
OH9(M<4m.ѯ\̴KgJόu$Ś<U$9Gs_t
ZOTrIV]XE?p9D#g%"t]r"6^qS7Z(xG"2uLg^hO_<oR<i3AeP''/Z#BM.Y*@Iy(2Nx^(HͲ4"qԧ&esC=4vc:d6(`ţnH;y윥54cUgO^_rrWGI˴/ZKގL3+5Uc-K,*3h VΨ2D=hE'ew]Sjjtscб(~	kؼM*bjU<Wn\ A6rIjӻuѼ~A!8\o9LNy{ur:iSc2zC=pN^E!*=MWǯ^?A[2,{6l[e ˮ\yIDJĒ?8jeWN;8 ifH4񝁔'4ȅJc׶[{n=E9puǉ6{4hfi'4-a]B3(NO.&ʘڇÉw..^_,fg\RHc[Wn[L$*>s`	!Zx{h`~AAX-9\(kn~G|HxD}|^bORĩ5V11$A+Y^;YNJ mB^pRpӹ(f2eQTGe6ZSf\BT6j<pCf`>KJٙkUաkj6pz(.Z;{׵NRBՇA?*ͭ	c<Rc]5h,9Q^5MB%>RmKư6N-4hu^ojEl>)G&/(hB47"'( Lܓ[?B$Z1{tp9gԖ+͙t,D_/SkC+i6`7:
\;K`tѱr@Cاo `%Sp9v׋
B6p~C3aP7B6"Zc4:iR nU]K^t3ohdA!SͲktC!{ɉſ_nŏR&(810fMr4#y03;\;MlzPP/I$G[쉰.ZMP~U[h&,We-ʭ=]o ߫tv'#Y:3l{8
idAױ-?@+ouk"/vkOP^/MC-2Ǎ^f4 (&
JșE]xhF@h.ǀ
ǡ-!zxԭ﯏1;xa0 1灸č&
`ƐV0c͓Orm<r{q_w=SM=otxA!
pH)>].ARc~Fr&EJ*FyT_?P_<ƾg^
gL
Yӵ8܏q6;sPְ-O,DBڢIZ`B.P`-!"huqPGF蒂ؽ#6]z0:BR]a4~8< Ca7	Nd	GTxF%xK(}pSVTj2XD1nmA%d3òz_uOm	ɜW(WDk"<`=E4wxLowfϱo%aMz7Hh`ѐkP/ZwCszB^|#qhHBq ѱ1T9 q)&:>UzHrF)MF
")}ksDnC3U ?cĀ8[mQ `bmxOh%s'+!U>!Z=Oc7	dU0VC"$G.!zT}0MbGnK%L$ZaPiy=N HR<$UrLM
ap6tB<[P6:ٜSʋVcC׷|t|&܅{5ΐ]|W"ƤNqK^s9aQlPޔwo(f a;t}]OڑI=X#Qf7%6l-/&5}A2C<XuK? ,وA?XHg|fQx#"rt]Tw*of ݞJKɃ@Vmg"A98C2Q~BBTT1P}mUGse9U¯Use,% =5\  _O%ƌ81}@Cnü>.={EU;NGheݨ¦sg逑C+α 2_msZDOn);۔eb_:GzR1)a6$WfR#fJu'fαiyjڣ#_fܮ&\|Ahq	_ԀzFu? ^Άگq{Rzp`ةXZYl=n5R>O南F8[ΰj ј`8-l}οj-|_C.$Jm/np1kkbl0P̕(l%̈<NpY@уuY#@^^]@YpBJ	=m$λww[hJKό0èkA^>-+\Afio>=<;XUm- `Zf;n (}`˧F#sF_G,PvhFFC[/ӢNʫ)}ՠg7jژ2FE^im{OA} mHA5s^kx=AʴcFs|PhH]8F9U4.9^g c/O?0f˙}yUr22w?t~<M67z2kɩ3=;
ilH^s`5c#./^m:2ZM\y=e4mf5gP9.~=`[,3
Γ3#&_wS%bojE^vj)d~>38pmt|ѯ<lNt	
&;ehǜTqŌ$+QN-k.mnJt)TRQu-nn9ΝykQZQr-Ky
]#p3(t0l_~BJKLTOlY@0ΣJ)8y,D@:lщl^"?kf$3 ;٦K6m&X4˜\q x{$ߥ`4KwC_6D̻ZQ2`U(
\*V	:2VIO$HSu3f	U%(뮭"O޸5Q%B{Օ#,!>.ovX;ٞJx+`<ʖ)I1a.>g3Pwç.W}B~|FVԊW}nt{*,6[&c}<Adq-^o9*Pa@$^D&}ł
؇gGz)}QFUu:7z5IZ+Fkܠӝ<W^Q>9Id.~Ѫ؅d%įkfZq̋Ecj7ecXLr &A+,My7*:Ex7m8{2UVGү-3c:k>an8m't-{q<&C=?>d{(G|Řd1	>ܔ.+"ϡOF4h6|0ը.U>, D)pra(P 5ױǱWB2?:g#=DfrPJڂ56`|?QxϸjV`p m0^NIEE	fdbA DLh<"2s9tfWV8|MWN 9*WɳF";w
h|G=ZN,0x&G`.NO~9za
47[n>>Ao"TCsa`HE0 =|DUF.Qd.V&O`4Գ+H_w=RpI  =c^|eÞN$ݫlyhYX8ʠ2L`z6Ny¦7Od Omp2qQBqf#MڎD>;pq,MI`P]hnRw&|~ۑ7./[jdS3,^z]8PTKbq(s ү\5Oӣrٓ'OV	ZK[\?jWk@!)9t:u7SXqBAtcIi: _M[D>&b
*d93+9|
ЏzA]FRMHA5Di9ee_4poIEn:ShL) i?h*lNƣ}9t0fetk;^`Ms+iOMghsy=> ~L?Nچ$}3oiFq;;^MaQ |eH/3#YPMAD1e=xH	mFKS3λ8"ro˷UwWr:2\mɲJ}-z6ZOov#HAW)qBW	JL6W挨!4JD`ctj:UuT9k?$>w(#\ˣuXM:bh=	P"&/p}(?.y6CPC	`@AP=gQ QQ5E
~Fθ%*_!Whbo֡v[DO
E}0&F*Ch(@/d<FrNE:
| ]dxfYvU{=q;E2jP;ޮ{-/DN]cE~^\bb/2@;ņ(!03Bƣ|<=[ ^8rW6g%UZ2w4@MKR욾$C^H+wO#+[#9 {ƬSИXSu!74k.;OZjN8qqڵV	xxa}<d`_^`aIn_gʼQMp ]ĵEfyQ+V-eBfPbb\\6xVE*T0q>$&*P<Ҥ#xa*r7H,C~a̹͉wDC[]uu#N,X,j/r~n\Ի%ڋFn{C֛'v@[ˠg`W`5r+dG:Gb$uN
(p#=4tޢ]U'l{*ԆAE.?7pC:DrgN\]Z)mNuF>siF,!ƈs)@o I+Hur55cbچűGiVe+0U9dx]q"~i tIq9{+m Rak@x#W?9c,%67bnus	jNi Hh~HG|Io絭(D$hQBLbGS|Fü[
NB(dK?ηϩv|Ϧ]q5F~vI2.\g6_ekd;W9c+_깅y%n 0oM4;C2F2$T#9alq'T>ѫ
-@[^9S}>ɿ~R$DL@]yphZaOw<o\iaKq}!EBdX>F0q4
Ax@L:J zT2Aj@m`-L5y7Dᣕ,=[)Y^eR͘gSxuzleֵ7O0
$ٰ\ĝfOkwYߟw76&fa?CA7ۜwwIewؖ^W-B7KBuVZsZ,OLJ]]&Ax~â VUUlAOQ|hLegLdtL<X#O79kH_jLxN`ISP̚66!֢̐jW Rw!:xZ:f+eX榚,L8/y 3<b'R߈
|/t$cb 0
45u(_.Mh:2l}Є-	;_FɝddctbujTLy0YW;u]]ƍIhE摜V^ ѬiJa9|	%TAZY7] 3WRx#e!( [ /
pnW.4Onp`Eǡ^L!1a['	Ў=N)O:7ҡ#~~fAQRewFhߪ:#;p](xmi>c I$괙fKf:z_
dO%}|f2=TWMS֨=0&:r0+=fHZpxҘ9O9ꚑ+_3 sGoZU>df}<)j3/AMGCfg~NhiK="lA'.@~X?ԾO/{aRlG'Vy:8uz(;:+vK(^G>ҶvKZ(PɼdĔi#~VYK@Fw$p	Вss翹aӔ_ɶ,c\#\C?fNG-pü.z+U*8ъh1)=3&6>}d@ZڷH Vp8|/ 0}ȃD# COpw2S`{4RƤ4GxV*E6=TO$d}
}PTp7g< Q(%"+Keo Pa;#g(J@R?(Fay
`213m v}tntXS\o8dnK	xPoOfpCֱ"æ}A[Gɖ*b@!?F!-=ːWZFKJY[Q{*AU߯	&0¢/3=͛=t~s_8lnT٧}`	=7K&Weco	nRJi9M(HF=q1ELˠMGD3֓}]2+m3>D.>ۧXFKS"q~/l1:+'#\ȺfLyecV+=9L[w &E,s11&@3@}~.oǃRRԄ|`bⲚ1)!^ņ@R%a%u 0xX9)U*KxWJ2̽<9>8yqG J]ٳKL<;CRp}|tQKd4+jڧqhyҋ"OH[Gi\P&cͰghG"\g&6tf-[V&]ALjmy"W:Ee
dAv
^tg	R6uU@ǟ!9Z[{};&JP&C+vǞm~L^l/؋szYԋ߬n^jrs'Hܨ|XJVZ+[6|dƄV@d;OYO/5Ҍ<&X)Ii'|!FI^(@gIy,أ?X6=1zʢAVxwyW/:7,}2@yZ7VM:/yvD϶3(^6}LfIѴܖ`;s*ȡbUIQφӚwU
 #f'P$	>9#?,5Q24"K0ez_יtZ*7M=׵,M(d'm*5 VrMfjFZd6kAO؏{G507 MM !\％[pd$)J+9FHtLf.OF?8Ù؇:R9w(I3(yb&TᖛPeo9}SMYWN	UpsI}ܐcl˧Ez
wmt!Y O}Vj/OӻH`݌Bey;qlg^ޛ_8[ܿuΖsNYTvhcMbkkqǨ[PYbzb-Boؓ"uivu>˶ .v^Я~9vD4dNEGeVQ7vWGdP(LV!qp4&PLeI2C#Wa)Ip% .Vg1<@ڨ2ףд8@Hy:];guiےpur4bWϤO/鲙EE[cwEx|T]ÝO|MdAַ׷DÝ'׋4,=gkOim̠ʮψ8f-p4&H5/Kh!ƍr_T1hE8IDUWa]u	>VXA@mqCfB*oސbjj{~\A8%(Wp8P:>=kl{ڷ $%8T,^"|p)qk`=q}NbFu%'V-fŃэ)Xe	BEC8UB{<	;ulL:0򢳖o;}2ۺǘR=?ޝkB-H|rjGc9%x~~>;iꁮ!#vg{~p{L#g3hW{ɀ5ӓwݸo_|xzHUi_2mA4ۯiTZTGZ]4&W>(
a{gwprwQt(mprDueT5IYs^ڭ>nmX
RUR* UK@ݩAhp`n<tRh$C' C&D|,S"r
$Fpm+G~$i~tV2_]ݮ1Fӆ%K չd@d&׮f_h$4@)EC <VytcWxlo[Eޞ4@@-SꅶbjP4Mom(9!ŭ܈	T+ݗꊘ.|'x'C E5sB[a^=egt'OwFFkӗ-lQVzA<QSdr$Cd]cmƿ4)൥zBEmX/ds1L	$<q
B}	0^}$h=%ý <&`wzIޔ$PGk)܄R2 +7ҟ^oele\7c|èdŉ[pt]|hU >?4Qlz_:فmvXaz&3qiyN˷4 %`^;s@5~vƋ/(xfcΫmK/$(go&Q-"KCR_p9z+eK?;;<=8ό()me|҅BrdxP헐{oK:5k7xnXƍЗ4TpN<%_L m9mtMsJvaw-䕍aҕ.x3߮&zseM߅;}tD!|,t(	gAdkv3ĮdͲ}דSU'BE+LBhp>S'GW*VZqen"
3Df7%|b`TĆPzIO;[,/ꋅ5uZ+ƷO]2ft%ө%p .\:QZpz!iRh~t	xTdч!t4닡h#Mrߵ?'cDmj!0%Ze@6) 7R+s<? U)/yPe-Q.[ u)E\qW@w=lͿ9+
ϔ;xͿx_C7PbwDCzyU=fPˉ,OGWX+(ZjD0Q8!	QK-eMO#:LËr3tb70y&K>$MMt%w2uǿzO|0%ɬ gyp9|ng:4%k3gf=!Hh)ͺ{p؅]IŹF V|7ϕuӚȸyu!ޯiنhzSBB8lX"l)[ɴG@ 7#eP^q!xwz;Bnh̊6*Հ'5VQI<p+ȨndƐGƢOgB^pGmQm*VŒA1c:8gCk,KAq"TVx6*mCӨa`tIfɿLT ͗\,tνڤ[]-&QfAaw1lT}:r-jqݼl+.7AI, ko]/̅HKÔ5B{|æD	]Qa9
FԍP!#d%\uLC6 ԢXKpHs_MF)[`!}44ziS*6ny
AջD+R[=Z@4x?`Ic=*knRKfDU.3n֡ lw7si_tx񤛭g[hRcY><!+rG|87yTaSIblvFְab%<}O W8Rd
b6Ǝ[S_JH'zWm.~k=N]M3,pIi}h$&>y%[Mjhj_V=-1\K4]mix2Uqy~լ'({Lv,2&"ĄiJ;S#k:ݓCf:`:{-Mag}h:bVzQLXBRpዦeʸ%MYPle-&X1,N߉p d~)7|˪܇p=Ϗa~\U69**Ηg0[, DHT]Ar]#^b'DtRnvWߢ$Z{5B>^*oc
6ɟ B~l}|$T\93i :AqTq)g0]` ,Ah=[-h-h{6H߾95|PKpʟsxZF|sw5=ԫɫ!lw0VNkM;67 v@ohMbҐ(
L'	ҢK|%tѨJ
=r8ENM_X+JC+6I/;S!bBfѮy2ȯRPhW24|8DA#!CN;0"aSG!IĹQhRg9 DKm|2">i5ya!RkKWOG.[aһPmBe#%WRCΏkWE9juhMYv	,}؏5Σ  FJY8ARqH<G/p"I r!Waʫ10c7
L(B"vHJӣkXM#>sfMzdXh}4FS0VÙv,sU-Q؝{* q='ciN^bJ<MWr<1*N*#gF[R7Xpz'>^'˥f b^i`Vfu9I$UArs#qq$=pny(W*\fNKA!ϗ+h*R70vf](._ܦX]?
@.B\L51HeZYEc+6Bc0/{#cC&YHQsnd ?`S#Y<q,>Rfq%@:CCt^޽b-mXH2YH9de|j8Tnp*BLk&]Њ|:p_? B @HBvoç/O_t>Dwk~̓wzAByÕhleK!>"z"*ox?V8PJ 2?OOh>=:	ǀo胚xdk8ktd|3G\'U4d!o@ΉFZeeFZ0}tdD8IԔvdib4[/A9r9/ >7JUvI(`Ėee=?"`AN(,gB.#4<OҢHȆ$ӺoVqܼ{I[}ljtw&gB^)s>h8Ϻ8zv|jsn=ytuʤQ6Eʡ8=POܖ+4cc갊YmqO$9(!D{+<q>Ytt ii`]`b%#i쑞BHvGY;jAEESJ:f/P;
] \C8.MQLK8[m}ӫnp;ncXPc&f$2
l̂cfP&5Pҟƛhǜ#ӴDnho ҩ~)6^nި17Bak7w,^O!*.qhIP83b ٺ<FhQ	E烚BĤ3gӱeNݹd)50{@CcBdWcouY	cMV^MS8;iR1:GǨw"HCP'6:QXt!t{1ϩ=k"&	-_9Bmf] !y|;'34(3O@q|CuZ/u}!U	f!3zr*[@"1҈4ںtmK^kL7bDNoa#Fָ0f@Hk%QѿN^ i!phf;xřﮡ`<Z2RTCAJy(ySa+{Mz7EII{,M5ǡMvpxVw3te,C[!I<d,:65P8=T3h)j~<vy=ӟҌ|W}"oNTv[DN4UH yID-0$jeٹ\ym|}jp"wm`!,}#AH
T%:HuHoa+lma5uS+sEUzOAo@;	(r.Hp\ud99ŵb)Wݣ	vΟ*q|Ha+mG"}{q[RN.Tk隍mJi򎤸+^ƾ?prI].]# iXWx
%=RP啓ǆC茻wQ5˚*L.Ol1?֣U柔]>3{gPWü,C=M
^5mt^ٰxf ًSi4>oG#JmNŇr1Lߖ
@4/&u1ƚA֯OFDF7ixᆷ@AhҷsַJpP)^,\B(hUӍw!PXg:2MfUi|&`e}Lt\2VS2:9gr¯qgנ@ܾ(SfK@$u]L({pML{;'1rv
pE#/)..n0-.VVF-;aO>%jk3C<_ɲg	x_G\L^&1;9P3?8?:9>=$_VLFC9A)#`TCEU_yG~I
rZlAn1t	m5a˟}x@id&?F77:3tƛ_Nh~~	ZI۬]ΟBg
[G!|zXh<Y2B[Qjrf̽cы{@+Yc)<;SqAhQ/]4T>ٺnFTOg81iTgJX;,U~ftV2~GQ!]9+s#f#x|ugx>'.א#9M`tY`Ú_bC{L\uUXbyި%O
VO(oY0GU1G] :g'6EⶸЊ:Csׅ3ff8b%q1(ult3:=/aGaf};Yd3mRgl}h8b9{ 'D{Ģg4Ò>)R8,_36TK#5uSOaip9~.;.q5ܯ2Vpy566'P
pztU	Q3-+h(햩e-YU6]@9PNXtRV6&LRm[I66Ov۲kᔚ{|6F-XYdSp#D>B\LC1$ziIv&TN>Nɇ6J2T"(maj_/kZ;r%k(hMh-Zw'(wư@m dʰv[@v]g
R7;kO23}bG}_Mށ8K#M	ډ	,72/I^nHLD}ƽ9XJp@h#tuo|<i>b$A)Fԑd_}9WFa#0^a; Fo;^[OGWM騃c90r45yʮ	&WIY&gMkg|7Wf WGT,zpeK#9 BC cRD8؄\!%_mfwX"Ϗpb^/]d_,fx$'$EW]{h=j	532qÈyL~HMM3u<%(E=U芝
[&L3-"
-A!)	Ja5-Ȯ\C3R8\67Mj%N(IgwC0gHC&#^M1ggRpt)q:ݮ##/tx: Ä:O.D6V0~B /^Y$g7LԘHDR_Qth(|;&{^&ְ{-bz.S3ExGǅ~4_{gFۦ`ѺWjPRwFqve^F-nǓl)S_mS%&jP4̔7Q
'Sn*9S2	>q4`ڗn{f֭+4X(fЗTR2X0 	g`bn]A|Ù6Dp2yI%ըRCxhr믿Ia^	H{lOVYQJj0Jm2,]:R7e))i=ꨡ4t&%ew&lK<{2fh/{3G,i,O"6'` ya3꿲S|afv:p^RYnxJ)Jtx03bNDZ\4UF2f =<~yWtt7a iSʆRt8dR-+g4TC&UZX, obVI9ל2UY%s.
$S#an\١?*o)5&0U	J4cz`V {ͱ([m>ՠC!x*A;B}! [ӑU0c7@4C	d}bxr0փgДgw?_OX6=ԏY_2졭:8]UU''~[燮q?[q=SD7`*yT}nM8QHTr<kypvzqx,=VT𯯎N!a9n,?أbGg?DŞ^ۭNBŶ<9{~tFC0k˙M̒a 6߹}m0?u>7,ʚ]:PQȫn/;96o5A8]]ߓ:֦qP}=Q~{%ΨC{Hc$ꭶH_NcO[1FVЎ8cUF42g!UӇ?Sλ8lf#xqD'|:ϐ}n$ȯ=}[h!*OEOc	91;7*iA}\sYnݾ	|݇aۿinl|qYy}'Jѣ晝	KeϠpk?z-je.{k=`.]_W9S3P;DؓO$K8sKNhSlHAd6_m]z^#1~`k)IxJ=zZxz)c@9@0W5*I@rXĄͿ_٫^oD\SXNߙN#ϐUӋbl4EAn,Y#tXYɷx^a~Ae) {*n5_L9e&AUmXfZ`c'ϟ.YIezH5t]RB}Yc?hl$p{5NFe	3rNDd[vhG|mW?7`MVo1ɝ8dt`_r[\:NAI~J/766+U(qy:. ʻ|nD%#uVʑ=iC4y>194
ssms%=?0;U2kPyHPBoʵg_V]%8_0GkχI =lB]]RL!p@
`0kgbAZ&c#K:NnqҾyv|Rim$8FoEIW	#-/9䎌5{U\_O
vh9毧aY0p!!*bX'JGDfT.#Tj"_Ր~ѯ-ىΊKˋ}gzZ>_tvP:vE=/Q7ĸa"4V$IG} W|R ӱSj}lIۡVquSUzn~i^gU+R$Kz&xH-sشB+U1ye[a?'.-i9I.yONG5Ze{Ԥ5J<z1i!Cj|)4 7;iϩ{@%ޤSVX뗈p_A[bD\YaB1Uv*_8:ѝ!V?;yuzpho6~NN7<<8.=TUxi<gHCYi<4cT:fO58HOwC|˓xVP2GOŎ\:>C`؏Gh}ղW8Y~ ?jv v멠Sab9p!Xl<l!ʎIT9E8f
͞5d2~><=;:98~^!omCJ]CP!mK%tmSm>Ǧ!ACU]̧@V eoŹ?E#"???<=+RNO-	Ϗr\:<
gVaYUwsLƩw"*ϼ'P4I=䷻rMK	?	vֻffǂfg׮#!܆		ؖ_)*߂Aps+#Wak-z	'}PUڅe}p]2a Z
âXsQ^<S.^	$ lיݏ~s-҇2wvXrn-gӉmГk*M *=2kdӢvW}c7pʥ_?z~
}#{&>o"asJ1\`,
	7HʎԎz՛Ty$Dq˒.KO<]9JW?(S{ۉRsl؟J8@#.%4nF0
*|t@|qA<*)P5bUa))o+
$r-Y]#U,(w!Tb4AiW!*_YݳUqR^BmHoc+,4+,vD ` T h
Ee!;[٭-|++1Uj)T?u LW2:CǗsX]v5%-0	ۉj̓ cfd!IXeEV4ϥR
_Ĳ.}]k~>}}yn2}y+tu!+J;GtPDnӇµYQTBiyN) GФu1OhTMοE+I_I+%Tx.7>` [38@^^`c)?O#i\Bͪ'OOON1^CВ3&͸:PiCv?۲*"@/8|Vo |(uh)!oSweG\uIqku&U
(WQ2[h9
J-|c,K%xhPNo S]#&]Dh"(Vd6a[LhʍL0zWE]i  v1PހW(Fq֩)`7|{<'+NiO	A͜q-oxd%%-YxqorOw˽P06{{k'_x[3!-?ac\'镶=^_BP[X~ 7\x,Ro1jQ<yޒ(?R<w+T6S53jc?fg~R;}%[P-/	>}Zf͉W[wQG]v1e78!gڮd2oSqq-6s \HK]}-fJPycijOKy[p	M=%w,V9";;m9 JēOw'w!PK|	bXx:.:.W:s'8" ;Ί?hAI^HSӪ' 9}6p-r{\X+>UVsn텹m`pK. .o{"vtۆ|Eh2mGR%3Y.0ەQ^MC}`9.>*WІ6+pBU[z1z>;gE&v/v!$(r ["f-D.(q*6+\DGpwiΣi:MZٲ52wM `#
%&6Dbf<i]-zD& jS|qvT%l#ܣ}᳜7{Ys1	h( ̂g]xa^I@7ةauBBHZw>h8ف;td7_*]"E'$cLG"QanD]1)9yu >ONe[$׹& ņ✡ L_s7toIaz@9xMFHj#1@,xwrW: plb3of/ee3?B+?XA# /$|0*p2Lc1	YVȦS_Y	hT@yn㣭PJC7y|9Jds[5dE p3~NSy(QM+"nQ^њfR)|`DAGjNC׮{Q/S#H!wa0%`
u{YQhWB>JHhah9׳Nr= F&Mk
d k)gV&DeΘAͱ[1Rzmd?TOȎVL(ݙG/Ԟ[oa-3ǖk%CO KF9w\$U=8c=4
;rܿT :S
A6O,8AaLmNDk>K, [aGDߧ'ǖ,QIh8Y}hrwxvIg~Ň'*3`44 KEo$'oǕ *mI0W!n8~L
i|%
{FiM=eVv`@|'gJ>=,hׯl?%\pgLsp|'*+}y:RmH# =( m)I|R2k;"]F])~$I2)γ|s"9>"@97=NrLDYum:kG3^@P{:-n0``7<Gp})u!!zĄ~P®``x y"ИPjpУMǳ0\_/8ʶiH()_/ۋG5?b ma$ܥ%5̬:)/ltFD8}]rɾN,HPx=	ʘ^Z|y?z	|htp\29,Vřs;r\'$0kNVEH؞MbDS0(jE}@ yqpS`G\
Ȯ bRm[pT7s6ûLϽ	
&mt͚A7XFyYU.k)~sz30"rp-,4(ע$cna߷H潋@PHPdޝfdy>i}Xtu:j>/ E*6svX&U\-
ݝMk>ΜPMk)c1#?<z(LiLXx^ƾ"yӏy~0~_kו&(l2)6"KP뮞Wgz]]-C85ٗ&4UFv+,gP1)+A:3*A!z9rg&!@5+'vq/qڠZ$}SՊ[PP(%yԌ{4ɹP/b×`ۇ3J ۷Z
u$ùdXCqڪkstwxxAp4ݝ{E%A]WKIZ^QCZV8U!KO٧UE"
0t|OחQdqv9U%*.T~3N؉_!̷'#YSD?8J@]adQ@2JiAuT){2QMQ8 i
VN95Qy,>Rj @p݃iH@cuM,A]tT?>G_a{tt7a{=Snh)T>?b_wuVhWWw3[bfveOǅ=#\gkW4dSw_Wzi63Ԋo")aF^x>s0T2EO Pa*LC+M͙'T~Oٟ+۠P^NF`2[s

A4lN\)C"eƤf..e	,BζsĜ88̺~z36]pw&IT{ˉޡW\eR^[*yk34{ QxkC3o!3}|W#ބ9?
.U>ހevg:wh+֌PmNT͸ᵟ{Ye7o'8{MW}Ӈܯj/8' Y5)FokQC!$aMqe/R3gj컍5X}21ȄwTfdx<
QG=nNJ[
w$H}>YyM>;˫pvg?4KZF0$(}x;Fou0u1Dw[U"QB1x9WЏUQv`7H1)2	(L8VI,XBߖ~kh޶+,*վ3)8=:Ql~C/Фkԗ[EZ`yFe]yxuȘA#$H{e	\e/VnEn}p>$C~.'C0OSGe%{LpZj.S&pyzJlLD᥉GڷuPBb~h?<+f8Cx53ݜK^R_J2ji1!Q9@~֐])jB|ο=d^ɷȈU'3]j@܀a򣘀4:NBanxNй,P4^FENFvGŝy=	F
sy)) 7OX@oBWULe[z6YC	>mhgx;~')]9/Ysox}^n
#2;9hkß	e{$1J7ðN"va	>ܨ5|;{-dݜѝy:|.s6uBK
<OeQ{ rNd4`uFgcJyj 4: (ϜHߠvGkb[ȧM#'άA(lV{UG7tݐ^ym{m2'zgZ|EliD:GR_SMq(u*ux)e+{c;j	:_ҒI/"nf+)^{;dsJd>lxAsvWh k}|s!=9NuGg(OEpw\:bLpû+θTPûށn*K*
ϻIR`{q쁐,.O˛[	zxlR/BcN7+<MxL2C_S.sNqqS =EPZZ]UEMa|FZfv?P&6SBPuo"|O2qBwk|s$F(Fgp҈Esdmll[@Qrܠo3]g}]z~S3(7Y964VJ'#Eeo`9&c{;2}hf-ro4GG޵IW=Z%喲2~5n+[NKm2i+۷톧1??QTqַ{[--j.N%MM\o}-%-悔B^}<RBGnTE9u+oXv[K%6.'u&@ `b+{W*T#ER1j8h~cE$Fv!fd
@lX}O\Ɍ"(2[jB#EC
NacU9UPʤ##xRjgŁe%',Kx/{9X|8w&~2MoC:-؜,4YuY{>r):q=gxG	nza
0\@i"[5b' z4dRqXpKt7 |F#gDz|І0菃tFc49ByHin_B+0&ӇOOFD4lD`}&;4GR!>aM+a!om٠_;E焇F6=oKĵ'ĝǞUkCT؂YJitNOz6qO}ĉjfJL>n`gL~f6'L«ϯgYJNy^"%)rb3L\:./G?FYG*[pq#%agk꥕L=s^rǇYezv*$qi-O/5SM,ۍ1N;P~6TNQ-l($Um8W]{6$R jqb:9	7F}Ȇ6bLB~\;GF ADGq.b,zһnfP Yk;*)JS& Q<whM G$50(ʞBzO
ɳ`VFrP +P6'w|-AͰ>s2;W8)SFrW"z| Kq_.g"߾Qt,u!Pɑ;/lgHVF
}z9Ttp7zQҺ+bNZH0s`3la<^qp=@:~*a
{Bb42hNd[)`+TEoh
w`yQLۡQaqؚEHwqR5@.5z&׊)*ꍂ]NB/
FE&#p++J+DٱcR{]v$]|LLKnY5-GV5-`	3Ɂ$x"	Ќep0GC8B+d'^{6DjeptߖgH	[2R	BTZppx
 KfFVGf@$`Ӿ@s0XU20	!@1鸹!GACJJ9vnuJ.wt|~1f??ux_ホA$E*{BG8&4d!FW>HQ<`&3hV+G^#d_8U!ʗ(8Ь=93B<Lvbl<~$T;4GUH+`@/`?+5-[8-Chgx~d"63[SI=[(ˏ 6
.ڰIsޚq	qq|rbyZ{}%٪b6.TWbYq:{*5_7ǇK)&`>sz5O˛sVNxs)&oxїXu#yjrNI9~z^-ӹ#i=`I(^,ɫvy<)u#$՗XJrv5vF(S0l(PV3>k2øKox"JH:kQusy58QDO8o h12TqƦl5qoz;<7NmlsD~m">UoD ,496_hRf+Ig /3}9O!/:nZi,xD٫ж
K1.t]}ʜ}nR)X$̹R2~udNR&"gX9!X}~`C9[Wfg1[o1X#PBtpb@_aCP80%a3IBR;,fBXXOkȫ0jW	Yg'=*tS=64Xt!Hdk	AS#e'SKQϫG_>yu#6Z!$").SrK8?;ji7MIwq7hqLq4L=uϲY*¥W`Z?aZoC(8*AHپg5O7ܴP5؟+Y2|c#2j9#MSy/~Fu𨁊!@!1S?i 3ozPGʼ	:v+|,6Qj$0j@0~>F7tIjw'03DFZ%MkdupnvD\3+?8-ҔW/Rj7e3XH,ͼ_˫9K<X#D4q3@Z8>ae !쉌P]#fs3Қ9S<
b:z6}0nWaX.QQW,7C<.2ԜrHjJ΢eONN[s=Gb u^yB/`Po8e3DU!NeqpY(MfULʳx(K!슆NxΫ+դ7fSf;\8`+wu1FЄL Y˒УݤG ;OCmiċhkp`@N9#m4רqݰrFL$TmVYAJw!zO^y.6 N3`՞\)|GkXiA/>uu ~Q؁pؚq%,!@byj{;!|1j㈎wqRǪ8!v |:>*Mڱ.^z} :|N?V	'6H|5/_H;-//?kaZAžn_dms	>UW6-yi
4`r6y	H5o2_6O0%o5O uαĜIotd>9Xf\ƽtɺ]5a<ƃDuӭHhd%k<.uR.n]llU7_-z8KqhPD@IsT:~uv;jHZZ%!f,`'/^ˊ-#IgO*@N{<+@}#Si6ǌȥڳNԟ);9=y_6(%A;|=[Kj=X] |eNHRa*{fO5D#42AQRoNwKDvn
NNR Jx]66R=>q0 p'`]eGh0:zj{阠5iYҬvO?idYx	eu~<+ȍ84̍:Ѯ)%9:7!HGcfH5li*ͺF;PCza=PƟٞm
T7ˢ	%vjV՘LXA^~J>G'/=8f82n4\mYzTrJQxbiٸ5dk<ZN#ѠsTgv̒Lk/9<9{~tFqv)f^G/yD
Ox6$H.k桍1	p]qĞk3ݻ>2W;Nhg0 iI\"pag(0xpv<aG hxP]+9jۥ1=ɠЄ[B$B;b7;}*7R98~?rq1,l3{RGץdϓNbiBouӨal.LczNAY㰪g.;Qg?EdIw\0v12&t0CY|ܘ]eYo?%GM:	LB@=S;!͔UӘr1:O!]+5Q6-Ȧ%e*ђm\#HHy9$94bW^"xUL|!?{6kDz]HQ"hl9ʮ/eQUNK<!,G̈Z'^ @pqM7aoa<SF@|.Ў43-<8	m\A
F3l~gmҌx$H_GH/X]#x'|녅RTělx,ȩk2#z
?Fֶ)p[w8gUEXJHg?®=jx!dvMgpsnǰN?B"xXخZWt뇘Uv 1oHt]Nzq܉)2U;y𼵚]E^XL&fQ',wu|D-6}ZŝEc+n?d0bYќfB7̋vBqa(r3̜<tt]_'˙%ӷby<l3B ǌ(?blSb9ܘei۴5n=,&=Y&mr|u~onl[y1Y\@"K&rm
G䖴"%60Wbtv*EJ"dŦ%axu19R2/T8ϫAշR1!f?D\UUN֐Ʉ;7<n\čCdM ܜ^OvuIR߲6ل[xg]Aw]ͤp/ca:&s!&U?ZhuVu
#S)>Baw%j-'	]CE6߰W:y"P&^u, 4́`Pݕ0~E:M3*^tDzbB!Sv(M̷w7&DֻO.:nNt'~J/AJlRAh-\*S%2O!q%e8eLURB>M5φ&:kWW]%f"|1/=o
c9*睋B 3ź2APX&qXx1ew(Y4yk}ɨi1[u83Y\DEQx;鰥.Zʞv7JGj{zq%5kǔ$X3(ߑ?}ڎ{Gߙ#yS? ]"ӂm눕Q7"^_{FKu+ JXo㤫KJe"#3*:v"VOݙ}MZB/QnCOQvzX^ms(ҭ^Z/zA3ַxns'OEQ
vP).Kɼ&F)A˴BBtRGFf@t"EۅVӄ Z#YqX奈%ɻx2ysOX:&'ʛozT-ܮHo'ijވcroEdy[ Y`'=.me[&lM{ C˳ou/!M*%8_e(hsK-)1W_ k_<>ՙcެ%TJ]po MF	o1;r5DtZ ?K鯐hfcGq%EO2"iQArPӌ)&~E~+f3k	R^\L0#7R$=HxQ#6=j˳ߛrw#zM=uCuEOGGVly n5%\LGtnli^V@?$~Id\T6	V/K%Xܦv JIlEEDe~6΂%~ӥ\at̞S[=	O)m3 f]Q{;>rY(x]\:[Fwlܝ=B0?O->՞@8Q]~5+G*(`S~KlU%g|*	9y@ VWFd!">3eiPБP/v7|!*:nLvLBsy|_>W޼V)ӿ-ϋlZ[K`҅##{GKLԬ#hh1}%7^nV&ߌך<@ZFg/=gQ[}1N/cZA8(16\6Kl-p)ztj.~*? &-h)]?Q,eNb)HycYo[h9ŶVx▎-ڍP'D҇ݴT(!$rMe;sȮ$gm]،xT ۥjlZ&VG]P!BZOP07P^0FW%|#_%`#ߩ0X
f|D,=~h	ݥh84L&00eJY̸L+춝OV
G`6:A\QhU6vR㵸j4M̨S{`$AH0(a^@,EQii@.!*+Fb6)JRh i)"N 2ŰQ	`t$ܖ֎WzW QDR-P=>"sS@ܻ{t*Y ;`_NE=V8_c"l)MBAYy$Xg(1sh{:PtC4.Jd(yc{0<Yb#msMsm>7/M	E)Wh,)PbNQ}Ŭ-iܭ+HH;ScyBmBQMc%;c$?G<zsTC2FENwSH=,Mzi8I*=Y&u}ۯƠ%3|{{r:ZlV2& ҜbA3+.dq\ޙx-;^*]V,`3TVL[!ÛGK YC i-OX(I\_|^%$E]*hgu@-daF`_ 4fِDdlFLVL"MZ`(v}ou\-PDmo)OZo҂cHnysC*e==>$N!G[S3Bg<AIY\b\QL`^c~`p+uт:bcRZ9Z@YpRb|W&'GwMfVLVAsAhO8t#2uI{`$07zH]iԌsB5õܾz&õnf794{m<eady'~AL+ib,+9`	]AҥHïǔ}ȝ.`AFni>`AT>p6&W'nO1%?Ja'#7<t^|ATк54CdjھPOGO36P?0[6y#ƿM0la%neGyo݌-	E,h;[2vV@\>|yrt|]K/^_tҸ?Ű@/`CªᷟI|=E vnH||/n['{~-HȈ3f]u+67,:8Hg
&i00'c|K8J:!/܁8qK@0uE3A8Bx.s=2y~,Z=>hX4w`w|BH&cߞ/cGvc"F;«vyHz$p;6CW_=8|^=ί|*Y2t2,	 @}NjٱA1-7ͩi@.z\̗/]KY]x?Ɵ:]J5G-[ڒZ?Sֺoנyln2mI7B>I7eOɆgCMf#+CaSsڙcT~Iɿ#DiE:b4oZՈ,SRV nkyhmec	&ce*ΐBS1'32222acdwe3>Azx7q(
ЏӎE
ZOӰfm	]B}ic=)q*,c
j\ rGSO2V?}1̬$Bi?Tm3l 9L;vxF6mQ)!9yDа$eW"QP#5<n	O"4D
sSGsXG[8DTLݵkgY[3^Ċ8--d(cauasԠ{6v![%u͹Ԯ
?[Olv~KmyQV?[஻0_P]6[qpݖ	 fu䏴BBԪnz		V']Z~a}e-ncbv6&rS#@s*GLI[9R~\ByxB1`g>pU/M 5">}R5A'PR^P`/Ȣ'">]tRkknv$@F*{+Da,wNiwڛ|0\zW~7q@ C/jH
Z߾@.H;kauv|0U^on&m޵ĕCZz4\Fa:G%a>ÂG5_>}FSZ%ymonooi}ٖ9o?}׏tvzv^x|*|=jrVPؓ#tܛGµ5fe]> 4m C(f N^fa=B'qj`zo8 rac+l,rp
	ffĉGjY^/uxR`٢p8spcs2+JIǧ
?k=y@f_9ͨ-+I¢ cMx}%4vϢ|^(ľE]<DT$+,,I}3G`Ϧ+I!~I||5DN|[VA*'+W`\Q=H3ƥգ;04:o^Gd'tRm?SʱBKnw,^$ͪxtxtr5zaY}F*~-ـH$d=($KjN,JL[!zG+ nS0X϶Yr5m"qS虎gSPɻf_|JނzRC`)2\8c-XKU7=9rv~W+?\(+`mүz91쪉~߶N_z%^ѵ4O9P^8(
\'Pldp][!vjܸJWq	pI3,:5!J
\ioQp+c9Oz7]Y]+ˠkŖA, *4{Wkx7WbZ""չћB j@*Ɉ©RR(a%.h<`>&|lRF#C8pec	k#胒	]YK.UJ0.3nFȘ2}a <	ժC%5?s4*rB0V))Šcig0dڕ%jui&[gnܳvMC_ow !]iX/6aDdSVqk7ßyyza6^c{hoon=^䟲[*:qbá?Mʷopã*6"͎*ٰhgf=毙,m,APW!v LK`^Lbx5%%*;k`9~eUZ͈/VX`&-+֐|
:^ƻUZ"}<2:"6a9s[ehxrL Ã%	Tdq|5Tvs!\@;4y` r>q~qv|vpNenU!fB;[y=?9˫w۩VexP3p,{(sz-(QsW$cK;4!˾onȖD+C{)Q&;&rRkcsF 	ʹa	*`(ʉ˧d !,2bUUK`` ]AaIMpqҕ@^IEi%-_#1,L.\$gďT/C30N'ẚĔz~7Yhi<_HAPd@#NnS	ʴ]
B?2Xsw}\k\EcI0rn55im|:q,[=3>8Ͼg'/?q|㻿f{l)>=<͞[]1`ыq5G[b$킯e??uxƀ*mVoδrz/hZep&ۏ]T,ommNtkr֟m.g0;=`!rCIm,;#5<縉/B \+Dl܍tu3:<ܻPr(n"t3N\{<>p9-8̽.x5l%j`61Z>^zDIc~a|..g`SDO*Ug|Gܗ\VBVe4xH4o;5|{;鷘J_VeשmzE 䧗NC]ݖ.<_PYLP;"aρ)#:q튽4j=<=;:ZHiQ'??\|tޥ\|x؁c`K\/Ji.öx]#YyC	At2p]G_\5C
Ri&BzI}jE.F6㍍G?J֋[S+و 졊ǴUCJNn-,,drkf'yMFQ&"6Q}Q:ؕh];lQm-A?#eń*cOOO^fp=5̊4Hrp`IwzK2+S" Ա伹dڍ{n_8ȲYx0f#FTT:ǀƇE"DQJӫ'ţ~19a4Ob:o7G}b$K˼(μvv('?Yt)oI|KE)I{,&Z}a,MP	nTeX w-Yp--udc}~9%MוE`vF,ȠG4OG9db127=^me͒Fo\c%>mT[w8Iq<A&vWNgm HBc4rtg3ӓ_r2w?f:׫妊殺K(rIxCΔ4׳Z"nO7fhrA`pt{! -#x*1E8V·x`L[k#G_d'6cw'!{r@&Yn7mٙ7%m9v'rwKT*UJ{
vCl'Գph$
(ɡK^K[Qj[`[a3y<ٕVTrSw4]t&/zs(_YLMD۔<fȦOpA|Pqy[=-N9,_</GSk4x4<٬aY@oݾ]Ij3,RٲE)wBj?m_c\OǗ;:uRKp'c;_99kU/-c)gY֬ԏց>xpX&jުc0])ick;$h/Fov)(O{^/_-HRQ6*%ue[v\srsz<YT1	H+2<+GtMџb<|4XrEyhW:GPsFcd"]HaXáAcj{<	g5?9~jx~zZQrFV1!VİF8rz+yRR:kDw]N!*}+.ƥGg\Uα˫<N/+H׊..TeGe=<ʥT7#,?;ņ9Z/Q`C_YmdI+	I^8\IF<i|E%`^nHxgOg?:'|LPLaxŽ1	`I1C>?bY	J9ZUs)2bC	2qvE#TYLU?<hͣ=;@?B
6`\LZ{`0=E7ȩ1&td.{T	iFq+ɽj{RϲwSN˖9mD]bm{,L fбȰd'5 sznugP6Ś8B?uUqV3݊=nzbfQh_ )N]@T:
єsU4ƚO%\V雊?w5ޣxtVfbC6Ҵ}gۮ\O\o/ތiE_b,aQAzaЮªAP`#T=ş8\^axF</%hI/r9q2YY%AQIտ8qF_Q(ㅾ{Ji<Hj3N.;*?ݛW I*#^Ugx`\V jaF"_gY\''o^}[h&:,X xrP7Rgj޲7<`23NC:Л)Ob}5NC:z|>
B⒏+9sm,)+w{1LTݼǏU
$fү(|Ө̅1-:1CȇGztlk )R: (20)V,qq. VZqG_\z^3c<a{X25ΤmV?nc{j:y,DƋDZIag'kj܆9Y L^B}㽣{Ņ]}	>v/.v(@"'T7@9m)2<ݗ"-`-QlTyC58Ȳ;c7˧Ql0vdMsT(Έl~E+lQd]=R2jB(%Ur:U;zДǆqHǋ{|;:[dG9lcvTTP"?)ַ\.S?Bxk%&c2Qdvһ;EGYTc5tYQVZ)qwBewe58Дog+I8t2aP\b2p<S&-0RLU5ZkLe59sX$E{~(@PY[kw|oO;hö&ms<sKw_:sшŅ${<%(7b?dҗ|k3Sjr:*Nw{瀜㻜.<O~;nILύ(Q߹E-fjS	9[Nt%}YۢytUtJ$<[~{Ts؃Xi[UvYpo,]YTs:5e <1.
L8zGr:E)ڞ4&k*/vO4$]syv{z޴~kV 9n9jc2TFoG/srScY2#aug*zr,z!(kMZ­̇UoZ&;̕-ǫpq-7#1<P7t<ǋ%.svusu[VϫhvpЧ
Y*MNXtQ)L{U2kO20hY䜫og3!Xv킪f'`=- (Y@4f2۴,Kp%:8kOz`\R8FcxAm<k46AAG^T 9O!~ءÌVd|R]SuhOL4eul"SIa[Y$+xqvڗj1atnXo򄟗i${!Fj`2 $5̍;7\8 .cmJ9=ɢ)*Ҭcf\9ͦ^CmhaZf-kX{[l>*VvveH	?e<s\X%UVΐ	u nξ峊K]{r%g#f0*&S6=͕̌GFzt̬_CzsT~!VU)Pb]eVQϖ뚫o_Z2ErЅǸ*73Xv@*ڀZX?'W=(#g"mu,tMs rȵYhw6`a']eP,}K<q/'[g:$Kz#}0rZnF}D<, }QFhvg_WqZb/=A:3 /#S#Fg)SF799/ٳIOt4C?|&8Ok'M?HHw9RJIJhr/c%{g;/q)弈_T@uD}0fC޼::V`=.Sv}k-T:b#':4(")oͪ1%-+?ո{Q$>M`EeRM+_xx1 :hz]mBı\$Oyթ{qbO]J8=)<ܱR=CT<LtIG(tŵi3jM^Q)pB΀'<OLfdr#1meKf*2,7^MЫۯN@0ޫݥX;	Va)z+[-}xI]JKS =%2 R:*G#+hNXFA&VkhVĝiX}nw4yװLƀ1痕»kNv3#UZ0)1; ~1E-L嚶.`ރ0G	'=l>(Vp<Ŋ
[2ã_KjoHqjjX1_(*GͣqMz18$Gv^pZ|!"#'v
?Í%\P}X%8_#:_ne~@9EYm5݈=4;m3sQaI%˗h,%KYSG<dvb-}R5}(ڜv/ւ22KaLOTx4Ozx)|x$]<>azN̾zh#GmHM]g2LY6{paZjOQߌy\T0W֩ۜ]Ra~~㆓l>9D'f2jTes╈he`s<\U+5wZME6bߝs}04-r'nx!qokû:\UKUޜ[D2'jEmxbK/E8
h
tm:싱0|h|DS7(6{kkw_=:v<Y$sӜcfr!TLni`bI.4WPW^HlMwc:ԇ" d)>nf#ŕ.FTi.1\HyKX-m'ePz{DKlžŬϷ>m{S7&6
2~![λ;)+[e-?3eMƑ|gRv,KsYs ݃?-ѕ`%ܸw;d1'#w{:XFMs_wH5{WY).=-u%=r( t0s!Ӌiƿr= `Ҏ`ث]1lɻS%al1E-H&BYZ<<֩qj{)p뽤y*@q9Vfs!Spmo=wyt7u[]ii   -SWyb4DgR1l:+)h9rW3|pfۊvF!uMb=駬Yd5v7՜|{c9W=(RE"c42T`xtc}DJFMx1tE*F%XF{@)X|ݺi2b(A tUUC3ԇd$Una*Z	D&
h<t#njh>Y.ҽ%B?ȓ_5^iDgFqL$%UY/91P<*`'YPZ9O
TBWdUE,/mN:dsژwLAz1:8W<ڵ9EZ|ǯ
7ŸMCm/?aȞ^DА3RrV8+C٥bSr#4ZKÈ[ؒ6uq^F-|W6-Z=ka3xLF6b~L`ԏophMRvd"$Sc
:cU:'Fֳj2a3ƣM'% U|Ea&E*)YJ5F@C+ F\e3"."x0ZCt| ☝8A tD9F\U5_XG{ƨ/Ϫl2Cs(W⸑/'f݃`_a )&M1Yw-$X/aE_`4jw&eOs	L]U՗\0H)B`"6YL>6i.6ypSb?jy'RC6ӻ{U%A\MPp`{$ٕIד8@ bv_Y@tk=6r8V[+溓7/ZKLx{8gv%'.VT1w}v 8حOǋyQ|*tU/{:Tc؞/OٵWL׶n(`z_rvy)uBj߮E>rhW*Vt3-KVA(
᠏ɑ3[tLOԚ>Hj-٩#[{WS=PsSH&1d5Dqt9<cwXi~^	7X	 hvnl<F745}Q@u)bj:H^#-וeDSݹ0)wi3~ǶLvf߮2N5)
sEs8IJ/HT1?ͬ}m>9^N+3v3]kjLo:}O65C$aXf|dje_7zU}^GI5H#/&Nn:4)ɷ*L#`J[-4w "H*Lh@3M>|#F)q'餥ϙD_m#chz!u~wn(H/U%u9n)F\NTQ< ӭ9SLN"1`9qeMi=;ֱrSg⻦Gg.ћ?Ƌ
>0	n$	67g/d[Bu6
."4@R,/ݤ-xf1ehڏ4F>h $9ڼ*A3YT'js1Ϋ#7IA![omѿmS]zѿ}пC7/DHuTGHuTGHuTGHuRGHuTGHuTGHuTGHuRюO#&5qYGtܽ){+%:(?Kr溳6@xyk=WXZ}4 9n; 7gv׸b#zf
S=#^@ ֗׭q3ǃ|O	==Mו?0^	
^3$Zf< u|m8!!Rz#n]jnT`\<ޮ|DA;[+8 nrmaP>ymȚbs̆~^F	c2]ƵzFQ<_ p0r%po*W
ɽ6_͏4B_3~\KK||#;b'c f:jUd;"#|XVޏwَϣFSKQ$Gƕ6ۈl;SqD'VѸq.w}Me=W?zp)ڲ^BpYcSP8e,:.K#ǡVnJj#@:)x/xRe7!%hY٭k=ϻ||;ݒ7=>+E? ]n67LT"7;?q79땏EI+_T3lF]twl`pO% 7GeZe2P3ATf<k|Yf`HG=9RYB݃DY1ѱ4Ff&
2vs=e)n=D7epow@~ï2Vf<΋6+[S`fjvhJUA=(eYwsY5(E#1>cux(⩨ܐYLaBpbcea,'˸}|tt9/@W@G[М`{NIۇBaWq<ʓƩy...)pfUv2N
T;;60,˙mmyuJ@1-}ѥ%e@vjx)_lo?#/oQ1B( 5ӨjqblEf OAg?DhlPW<Ր{2)aɴh8΃#r`O/dsZ.9~aChn\iή_]eb\ e4^turP$jjQ*@ש2T+Bvܳli涣0<ucrLK2-V9tik^(~DG
`# |\2=ÿ~>b y``	SP|_"9.E+V,"U)TiNYI2poRW44G(0:L$zMg}LYDe<zd:<%?&>B06
j/}ѤS)ԘvFjڒ::΂Rh@MDs7{_otz̹j%<Ckbj;pe[s^ f]󼠧|L/%:=u#\o߰ᝲl-x q'1 \PdŔxbHق2).rݜ:pRQj	<<o
A%{RXs'݁ʧsP*pMm+	_Cp2&'%272wo4Y̑ci򞤍Mx E./DJVl36!pXEOFf
)zfdI}	#N?rgYt,1h":ۑ$iK͈nΈdqee$mut[lybh2*H׺@=_YDsl	ވ1Q'Jx7J`EI|[]Rҡi9$c rA^2e0( 2IOz[Pe2g6-2១JhOH3]yrjU.͘*cIu</Mܣ9Sd#_W'& rcu#T\)^ rۖq7I,g:gj ]^Vca
V}M '9D`'`V.6ɾ*wXnoÁ[{/x:̣̑ܣ@Jܐ.&Q|<*䉫ɢZ0  n3l$$h73~4	T!p0RN89`O*GL#{c$/m@g;Z+~ঐWd9o umZ<_bx'XyQ!ϦDa땪g6$D"4`;S+7x_[8]{w͒$Q1Xxcܑ#mW/JQyҿdKo3 8RR8{e
^x~2u22xCdTqvWweYs	#7Bo66e)DCoԜn		mbhUB7љdXۉv-c[Us-n֓oUZOM,C?A6O}ڹO+; a~T-JYeEKd*[r44H@ҭyt:/MH16_cn[`pL..:}RnȥUvQflSf~P[j--:3suQúbDNX'eIwUbt^ I3	T.{
Q^`<{ʣX6yT)WNUo♜2%$?L>D#&6k~'_5ѿax8*X}GvsfzB'٘:HgQL/I_wG ȯ}G&ed	ήjj%V-S"%n0$(aWky UV%,%,ƲEHpWI1Ejma=]~HC'<׳fE.Kc	5Gz4cM?yo{$i(F<`*Mz|xwn^eJ=ábڜj:?Z>U<oyug%rOfgEéZJoP[1$rfi?k2c0~)Y]/h>LL#/"y-3׾K
??k`l4~d=/L6QH޾ޙ6s`G#3VVKwz+'<wiy]Ȝkhb¨uR6kE&U*䱨iZ9Kv pEx<lr!(7^R-h4r£(;J5H8ۏ̌7 C0n,[칉\ZU!X`zfP;|%r06e/J{.#,aB&7N0_̣9<w^,'oWŸbq?[`l>u@	_M2NjUÁ%C#qHb9KUY=^E|X3ID"RdHWY@t9;\vyON؝fZц*iE{i+t$fa3Ќ),+( ~^+óMDPfNuֈ4"w<&.5^M0$\-ohr"[1Zm`ÿxzDxbf6n39o}%m*Z9$ۆqh4CEJHHRB
<
oQݧBtf\1(؟g3
^MrGӈkVV/5A*mx1\ei1]nô5Vb͙÷lA3Kwj?0fN3m\[qamXeҬơ]m"Ύm"W%YhMFM|m`q}v?kxND5Ax|"'qې;J+r%/OݝUsqyVewpU |bƔ SB+q{ӀNi^=/98V<<y~Q/՘;˦hfNq=wZXǇwAT1eclKM|RrPd4H"M	;'pqgٺ̦a#Hٓc~9_%٘WJ$Axȇ퓑jyÎ觧~08YC Crw0TK[WMKBB!f.p,Jf&p~fN+Ezy1T9'c :<4z~%r$,qӇ3Ih9Gbx]brى5*2,qة:?fQ8ͪc;4Pϐo:ߍfR>`<IΗx=Y'|.+*F hօ1nԘfԌSGz%xGHt4xQM)jcᐘJ4KQlٛdc\
! >#aC> G^Y9i杺NsvzM̛]a4VPj]P&֣Mǝf%u0h3W/Bs29vQ|-oSK]7ԥi(ԋC 2v*59=,Ȼ]>2L7OK^ *!H
/lX,=;%7_H|65[{r00p'8
Cj.D{CUmΉԘ[)cC
b!)AA:pQt̝:W <{\RK' }'#
OI<?HWxǚF{@Wny%'h}mR7zj5<T_+!Tmc "55$èYuOՌ0{$@RZ`~w?!ЖڙMVh
zwԥRfLC(5MsSYti@QbDYtS}0
ro&_O".1SfP_u#!X/;<~t1_9,P3g3DU'OJ,ߚhFj`!$/e$b438	N%n~^]ee1^J-V^=˨ȗ@hYV/wvS/y%̝3늄8SQpGxlv9]\xrCXy㱭8.qE<".O3na5G|zHg:QH^	^hcK"JV5,3zlYUӔVԪ+2	^R?F0%H+j߲Mw=j_Knh+$f;7f=r+R7jzK_B1q2dz#x=h'lQ?oĨG}rY?ĺU~7%dpW~j2RmVѦV+S>̒htI%#-\c]G`"f28^/fD/L0[:tqpt|gvv?87^spau<@خyR<A^1fQ2ŀ?Av2̛11MaޓMܴA8UEN]W $9` Y1d,hrREA7ZJap?~<8>;??=8]RsUAU6c+æB2H3trD"B͋1cts2u{UEV/ЪOl⾱2>vzL.%%^^kɬ*&^kSPRҦn[m4M٩SҥB
zRQWe;]mr#H']LZBhzm	v)l©iӷnu{lss4zG5k5N/5TfؠaCQhRB6SA4la7Mjv]l[;kmsϷ]ݠ1jCUj-J	bYHRHKHzONTSkztlF!68=B]ǘz a	3$ȫFIp[QMٚszmVK[o1vfnQ64Rn^:4jHIjt)87B~Sor3Pnˢ
elYRro@E{L&}Q3N3ʏ'EӮ5?ҟ*\ϑi:SU\[+eWN9QSV%;<}P7(Š^@Bhy2e{؆Q;uΩwgig0sdnyQR?Ի;/퐹mSoo~BP,b?}X+,>GѼ?<{֨rP(}|鈧]PzlޡH7tϹ=^v_;i,,Z]ױ[RUjG@ϷB]@Y[浌3MJF恱ETσr
n5|ߩT	󲢂27f:JWP;߆WJZnf2/ȼ(ߒ=	%[WtkHwn{/KYjF;|U>xiw)nIf }ۨCHoC[l@
3{X}W18Plw71]쳛Gj5#GXķ^imY0nY~1>x߆C_1(4,%^[;TT-ҫ~pb
Ibc4,2$I̥ZHtJ@vvTN0FB%0XE&ͿDWAu&=OTl,ޟNGq
$c Aw0! ۺv2s	Q79"%Qk؋n,jzBF#DoB3hPSz쏇lx^Pa$_ٖ/66h 1:	/0fGH9ħva\fW8tme;*I{
ޥ_1" Fd',R"mź6d9R.
	CX,""P2b;1Yl=Lڅj_2^9u͙Y|`<К̮`W6HHz>>æ0슦0QB-آļM0>I^Cl[_HW}`Mln1[ 4MJT~P_}hF[eo(}mc嬣0]uƯ۪x#lЋЮj9w^w8ըt:
b`DUXsZ ϧ廂SL4дfA=h ;Z*[Ъ`[O$M vo֤z7_.^VQ6cׇ~KvyV!vs&ͬ7[:*Ǔ:Y}f#fmVq<#x^cY[fZ*`O{xF3gZʣS92iZH|aÝcdD 5ͦlABck'3|3|[?24BFaǎhެg#GlX6FjZm3Sf=lx=SO{͘uut p:૞I܃Wi4GQ˒Re&Q<b쥇,aÄ p	OZ5z5V]Z=nXqhf]!u&^xfjٯi:\۵^7p gq#V^Fqkxk_3 	a˘
t6NЉ=@ z*mՄ\uz*!05f2-Y@Fl[YBnחi'uΊe_ck&=vy`	/U@yYħîVF;H Ms}Z\RZKKS' !z$uHu8xN:ia-V3uV׸ v6\d,`F]NVJx2n\ATVzvf
[cu+kȢ;mj65 4ml6ɩcEPx\5`]{!WP	)KeEL%6I% a?u@U&:$NZȷרd9.69p5v\ZHul$5juḓf¯i3\t;[IrvpϗB5Vwk!~\tToZun5!%HrVS|}NNtI-V=ZgiUQƇsuPsumhRARRzI\9u`@Rΰ	Mq܏-i[5bҁ~ ݫzWin!X >cL+\}OwgBbdvhw[5Mc񜍝v8jx)[<Y7{<dycEV˱Cp#ߘ3<ʹ2W2^U$
GvW]o4߂AžRdPjhUTRM0n&Z>^34Ea׸S)M?nank:=#Ӧ'Mvw`?ݟ%QrO`JO du<OZ9=gD>W\},{/;N6MҼey'ܥ[Ae5^QYX_y9$Y1[)S Ç(ֲI0Peyi4ooY]XjL,Qm}}}RRWJvdd^:f.<m9_Lvû|htR6k!|6\򻼐]2ϻ/?ʗ2As|rAsJ,eZ.僱p/חLc,a!hXH^,%ȳ#72/__L"Z:Kr^>^lEG>K/S#R~aNԥ"@
bp*StyqQa;׋d𽨉١:d|]{@BV,[bAUE[l!2i9Si6-1,+"1C5LM=zFX' I6''	gjK.'dc?p4Tselr;p:MN	rȢLdKru6łʍ7ڔ)dքHAcG4;>7&R4w;v>p48iq愪B/v66&klmr<4M67DN4ԚLj|
L[M-42"MCmIƝɱjX6Չ&\SzG%[tr-hqbxՑ!L8/WbiTZLmƮصxu	OOwLIvZɱ.W:L]&N: I	eq{L5Ju->*{<|61qzǳ'Ӆ>&l'y=qB:!P9#FG6rB/yvO 5hCF!t$2I䥄\VM;DfGr9a_H,{;Z 2-.\[m.JZ]kˆ &92D7!SQؑ'C|
C+✐P%_	g)hY(qdˇ[ԕyiMF=	I%|(䗄&$\#]uMzֺ7nUQ]!Tm(+PN-7j|Z	aLpMH":Sb6c1]9ez|H&Iyiδ\g"&\lrB ֭+@], s:3IH[jZ)xZ̨c%n0"W]NAͽĝ u~YWMksG@OM~j2<ơcH/;IG$TlXř<9ͤS)P.C[I^ߘ  L]K4Ǆ,	]\KP&/B뽐O3b|1M{<2=PhSђר^tI'C~I}Z* ѐ@ICI_r!W,HtN544B.l6Cqo$`R%$
#ޓof|w!!klhn(@m.;#/	z+K>_5_,BOJڠYDg),``ag!\	XlDI,6h_=h0jBNU4IAP%RPF;67H8-r>g.puB@a!:"NsY.lt:^T \eǷĚ`fuѥK6$!'8WT4şvv%$N8'ii]N\!	9K{F4z<[c4z^T=Bt'Z&X ԽM!gs iqHk뉨W-VRdųɊgf?jcxUMviCN]p:a#M!unSCl[0 1@T4>&G ~t8rBܦ6 Гh	pdl䉊v9Z$]q/{yh{)~]JhH	-^!i( x>Ȼ$34.c*DtBkg\\WE@SB]CXڅ$3w9fMΦ48ir"SMpfpMqJ(i1b1m`H8m&6}aJhya5MFI89NABf@9{6@irYKЕ7h޴YCN)$"6
H=m:'N#&6x{cf)rf6y%}t΀X3	qwl:MmmY|j33l0uXh$ԍag_&N˙Yz
YtX0I6'
d	X;%QU*XLkS?ԉ`DjXp@bB4,t֡#_8!wALPk:L@1TuNcVC+x8!	Q"cY:
3vɉ=!!b{L:(!4!g{L(;Co]F\=!=b<&-N@D0,*,[\O!%uG7$.yeO.	,|weTEr_tl6e_6%Uɫ0$bxT Zi,wY`m=$\+	MPsHZKn/&{B|.p]
M]6itctyep-]6	wJ_6D@`y$	ty貝d*`^z\ a@=z\mE\f.!!@lHel1MQ 1ɴxR˫($]iHԨ!!*ڦu&M$$
#rpBZ	6SF߮0"6rRAIQza	M^==]^﵉zX;e/z!q^&f"؞gj$w1'4
?I'|.xLq!H4$>rRsZ5Мr/05q&LZ9(HĤ0h$	C3$:Tk2 )Hm:	Ф|52aRI'Bj0C
d	Cj2&Cj2&CjI(!&N8.Б-('C2AB&%4|( :!6=s@|']	9sd'	&(($-&N'>r 	BB !Z-.Dx!yxfƈC
K	wL(moA;-pWvw%0iqNlru5AI6']N,x$DoIu!D sܹ$c9ÞRq'unuR @ң/i\$bD8.K7eI%9B#&N8ѐhqǄA"d!㸴c Z O.ˇ!G*$dHMƩ ZiS']N.`E"vI~}\o!AB0E;Ol~-HqrMߐ4Ԯ[^+ۜwuldahlȲ%P٧`6KX$=z"zIm9]Nz187k4	}# *K &NNKjy6IH	A"E:+gu=$ $&'?HPhBNi=e )0iPKjo`GI(}w7LP[Gz}a)A!4Hmm=# g0!pH$7"	7	aAvxH,R8Kj#	d,cҢ~sLtdk;$퐓'Eo$Dpmk'_фG~js?	'=vm6lBNPu+;\Y'Ԑ:<LlBp652`ku?&͹;~P-Vp34kʓMޣhI48yV]AmzT'M^N6z0dCd8|jsAbS-
pSҕ_HcdIbOJV~Cei6M	7{|jG6kR(k|l,t8M:I>YӠ r!>Ib!$|Zh'0:Z52$>J$=cH=cH=cnnEvL [0ip*ŤIWC
	
"=L,>뜅	XA?UvTXe:UֹunkZֹ()HFMA6x\I^Ʃxlu/HǼM{ǽI'hqj2\u귧) p<\5uNttd4j(o'?N7;WbĖٮ4N%_[rͱ[ajՀ6nlF'T#]`챯!;=e-<|Ƒ[HϫƉwPء T,]B`kȷ6;4{˴829J|aW
6ʤ~+
6pױ'Y/B oT֩!ŎbgY&okڬl^"fȹR#rh|a_|fߧ;~Z1~͆g4MnoCBFM1iqB>̴鄘49iq6HÄ]Td^bl¡+QRQ:1]]R!!ՠY	b1G%(`GI582&A"'Lܩ	`	E6$4-Z9hI"'5H2Z.cB*?k ^Hp`O]AlJI
ȴ1
ԉ	}k3yM28ADG7	DIHk3萲$BL
H!v$'XEZ&MJV"F!'
Rz1qŻ՘PYÄ7eD]!uT׹zC<pl5ⶐ _D&pңA1o=ΉwCNԢX`mvn_pxa\60gN&mJh1Ylk-~j6TTvpϻF	_4ڌmvmNS_A&'AzNS6{gڼM|mZf018{WܧN6mMjX]D
'E,Nڍ(mri3	jr0	G#KDPH(nUaЀバZ|< s v5\!0i
5FvnBca#Y!HM̌G4)zJH	#X4QB;A[Ōc>d
(o>uā_V]Gcp,S(.|Aj!*WN*Se>CJAnV>)f͙zncJ*f#%/5r${fɼ}iw\ Σ|iӷ~F)ϢFbb/8& .R~,4(bg	^Jzo-mny2>(Ti.Mvd;$d{XxɨÇCWmY `P!!ESsSΚu~:h٩Sc,d;i(yٴؗH'ڕp55i:!KF'(z]ϴ03j\p(BpB~u>ԐƩI|K7NzgVrϑi[7~9Bv'	[,9M*`KìVpTT޲҅
bOѨ,v_5aLr3VC	ަd4MeXy ؋!|.-쌢MzIr6QFYTPѩ`,ߺ21*۲&^/qL)}5  2-6ِ&kTJɦ}(

ײz{U5.FH>r%/>\7-}лÃ-etêIvV:)%])+F&URs=ui.ie슦=E*c$ͧbT}X!x䓠?,~8EA	y5&+V/k}MZM+aJJ`<	kޮK/Ҳb?ȋ(hT3[[a'kw۞Zms<-60դJG.1EkU	%.O;jЕڐcJVےTKYE`30J4UF)Z)'xciDRh*:.44Ba**2d?óxbOmGIw(,\jR\:&N`"i |\rj/3N;xf'ނz-F+8b 
ԡh6fw%GRt5PF Tx𝹮hhڜ˩Ǥ5*TxSy^,BU	*|ݦ:b	N-AHT	\-se*L#ZőτzYP{<ożuh4 [}u|-@c[l)!{;dvzqpLrHk>4*UKt8fsBM@S_T6zǣީ*ָkkNJa>Vds9=Mupy>HGr;}s7kRZWYD,L X0jsSFtVL%ȶB6k:id3	KԫAeBdbjJ6	8%&%]Zo%GQ{[SUpcȖ]Xޥ5<ʐ/%q!d!Є<F&}]	T߳&{X퇭x5DRgZPe4UURszҶcN1_j+uDC*!NOߒVQ5>NK	;TnJݞّ-+XJKi'!amrŜݶRTxIh$	6*s-B?x`,MdC>_51hJA:JA$2V#ci=/kҪ募~0D."Fi֕v"5OZOa}<(+_KT+k7if(u*7jӁyl'zϘzTb2;B؉B've^gY5KV);OSPּt.(ZNJ,ɮIptݴ9C8%D3TunR:Pm{0cyEZۆmR&n=l
XdmʋzD3rD:1{YPʑvxeecu^Y9*ii?K3ᖶmM/ej~"!^vNlptR86԰%U-┶#.ճiH'
0̃^/J&eQ!j-5)؛jV[@Z_Mc]ݻ"J|MbhZ%ެbi`"9ʐm<-"hi)}.`4hthJY}-Q~ƶ:no +z,bvlK|vR6&!=ZQeYM+qDzw'm<0)OƆ$zH%eLL'@j4\Ԋ,֎LSlMEN9|c޶)SVfxb6=Bt1OYȽzA%nR>Xi
3@ղ+ʵ{Ch`gTOqϣD{界(Ru˜a3e|SVS5f[E}S馢VO½.h#&DUҐ#L#ь?UM΋,-uI5[ D,ɓ9dΑc9DU_v1 ^>.%=U0{S,Z4ehEOQ{%jQ4{͖d'TCk©7x8klHq<G#{hlw5וY2khJ`s3@DcMCe_RzE?p#NRVH^u֮I!R7f_XB^=<b儧tRb`ͱ!U-aM*_e]SFf p<''mV{DplP<ZTfΜveSaSbSGt}eYh8],dŉ~y@iV"xᰥ>LebfeIh~_3M6*S;C?~Onm\1ˍ֮ήp04:<u#feѢWp\M{[)K|첛%쾼hf8ץKXÉIWXt#kt/%hϷgZŸSn][X>+e.<lWQ4/6kYQ2;\\^oKL|73_IoCʟo]=Z׺:wR Y"T`~[͡ϟZV_bOTUB֯2B!T.md!XrkX	'Aϼv=D⸜ބnEM.`zVDamy.&16#4J\(<]K?Z0~9JHSRxd
ZXaR)~{j5Hok$G,sj&)]H^Z_G^
^#9b~=8M&Y|u=h'l 8Q'(O`Tjp"D\$WO6'`8	&a`ƣM'eOh7~%J`2J|(qf_1eDVL'o3,0&cj0:[4nx0Z [ˍ5V3m6hVwQ/fDG&7!QA4Wy̡Dn8ԡACϋ{,A7A0d4$:C%<>YP?r2g6/O7֧,`[)?Zöfp~F7آ{jod`'w`Z;'aėAr]Vhw?D0-k4Ҡjp E\KC}\OQbSf&bXrĐajmPr`;wKY7g:O̃_}#{6W@?1MjVV2+en4vŲF7F|qL^$@J9R=s3gcL
T_=@54G2/dXW`@0:cE$e<1odD]f:v"C#AZj؋M ?l2xS) uQhlL#ef=vRF4x&n,^[.fpn$!4V!>.Sv_Fٺ/IT?[?o?~S⤐ʘI%]_sn!h˹*?Sb_<OhF\Z}g}\^>bs̨0LYx<O{?Y ^, N~8C>9ik&Kgpzx|v^?l`ԌsRS
,_s3P
/5k}WkwI$>*h|5U'B2u&YeޟQZ7lРb7P&x*GDS{p\*䗻IK\5Eת<4.Y3ߞ3x
.R6Nc$y\7oI7CՄ֪%jY!SEU	>N\]X-#P-kJٖ-%a{Ͽxkhiv;,9'IKT1.R[e-tZZ%<BA(dP؇}<Et>-G0IAW@ ݿ~@12$gaO8XT?UîzT=nCC-DT`h\q\	C&(lCl=@q6WXE?ʃsv%::pFtXݗhj:)fPRy8o~}檝#= ̃?Nr^:Z2t5Rl^TYl4=-9~arRnt߰vK$h<qa
_#D1Չ>w4,=;"'Y^*iEwQkUK#и<gY^t2f|%z;~j/m}K¯K~Шwp~t|ptxp_ZTiKf퉜q<K'')Fk;c+ѩX*5.,<ȐJDBx'GT"ℇ86.TjGܨ>RBqǂ] DsMudɁ@0`geo	U$(͹*.6&lTYFD+˨"qͧ	BvW.o}j*[-@KX\x_  vF7e.{<tx4oߍW2MI[6\ ֑u-UNdVv)totvDR{gTmVn]p{>NFv"S8֢|(!ӳm1O&m(ոtAw=ީPʯ]bP%[wZz[.Fc?5_=+g0yNh.cN6e߁}P_VT_-W~wj6cs\" 4F7јa?`acߑMCq-̢>ԑ`sK 4Jd̨f- &#- g;/ɠQG*f°_94C[1H3ڂL1r/1<FKXAdՉAO9vy=	J2)He8'2& ^he"]9(/mAS/zOSW _w~~/reAG!^sji*j"O.//q&WSioe%(8'8.9? gǧwJ3yl*k- L"]NДM	yFѽޅZ. A(X3 X@hM.x֧S' fj^Rg^4ww^Vq_lhwh"v7f@).Ww^o	]p
-(dD1w W/D֧Ed2AݪGPzbryf|pL ȇhS
0cPAk5#;Py$,W#.&OqGGFꤢ"  <IJ07ų*RћԒû(˨M";ᚔɈCܴd|SbΫ@&g,G}?7HBitIq5FJ"?3N(es>V+7GGu">'SM||	N¯M+Z9 1@~j'<ZNn*_ DcĻD}VFEinݽGsڐp|%3w7٬?NF}gYߣu_m駟fp kt)SZ2!C %֭nǨ|H?qA4A/@+2dA쟜FKk1Gd^WXr m^@eָ.m;q<\L̀hP+Tv^d	✮[xp3`reQLp)X`De]UU@+^O}?᲼	Ǔc5{kxL;1,*j^ a[$>I5-2-s}$u>?
0ej	[\k6p3ؿAb{Xgڦ'b'sKFhԆ!J"wа\V,ôbv(sxcT*FP2kJ>:;7$8
 NSd,q2cE$D;:HMdUO&趖'كq<G:+*V5WӞz d"Q&t~f$kDLB,bk<cj
H(~+)C{6O?DZ,J#2QD)l4D^ޖ4&fO{oRH8rZuRr)Kάؘ# }E~WG8sƐ!6hqY
,M|{KZnWY3vK dcI_?&@Y"dMVddi/@yW^j	u$S 	w"X uv_4_zZ4)#SoxchM fu6rifụRڝaXS|a7:jACٟðgtf~E4sb!ezw%QBCґ`v۷5ų_O4hN RtW6L	$VFl>qKe6DH o&5+Q7v_:3}΂r9 GPg($6sjؤ,psN=+zD]-O<)L)TACNhd{*fEJ`k	竉
{_F>C0fu?6-D+"9{E켦ೂ\@@2CsБx`kۃc}V8S%Q𦃌.Ij62e?F*uԣ	ϙ2uzx/Jrc
M!x6ad8$iKpxFL|Eg)󅆔,u/d&2ʹj|s<y;R7'mF?@	(yvYC̮띓WeAe^HMJE+:0~Esk"EdeM͘Eok&q[ ^JMZ;8	PFNv\1z7~z}U:AE>w\WԎ=<mz~Ěd<wP5l~g)pwB1Z~3_J!Ҷ禱5YԂ}C}fc|*Ƈa|`Sm?п93x^l &tt-nNMsߴmYZe38N0me҂0 2 @i4/I*h
vNw #\ˁ,$T_c>d?mA"9E<`0etp=6=]Sece{;>R|@Fɀ3Tb<;Y?ؖK4/3cLi%JNɬ@ӹhŮǂZ]uTzQb8H4PsrУCyUrfv :,^g:dZUk}x]ǻ3%OP6Mݳ`^
s4?~ϟ^~<^TY%H{	S47%J̥QܸY*dN_rv,DԙKPK)_&Z!59E2h1^Gfy.fRqc@ћ<Jud쵈Q[iP-uz1gcu{aROpc"y	4ۤjgG/Gl'Wa(waԕJHf*fAYYf̄]0wsWV2j\	dcw02{͈L&Z ᝶ JɀT_sSF8*+|̚h`z);@tt;!F؍F$4Ed)Fct-dʦG+9,Q_%vhI";ZձlI8*8I2ǊR;kb*Ē- ;i6р3_({:?Kx/߿(G	>%˽E.E6W)jok3;яڜ	uJXǚ~SV4A:8*S_|<伲'h̓*#X%xi!=PƟۼIdUQLKdm)Fs)Ui
]|-P|	D{Ѽh,ύ7FN%qFN\NiHt>%Bʙ$g5ۤp&(N؋(ae$X&hdZTJr:MĊOqfm)RihcO6[h}np|{)3ʣ|0tCr˒^]׊W.}MgX9rTSaha㺖m040a;_b%`@Ka?~[ݯ,l&R`~NM(~y%`>_樁<ߦ3TSܰEZVͧafo}غ+笽yǠMk2f: CSjUr
~q"X
sgV*d(;43Y/N<n#ֺ1Uhg[pMYXD
PF.fhNDcO1gyhpmM'gw~,Xֶx00Jicژ~-*<'?'*.D:QJ*,m('9b{erHwON޼>Vduowƨűg	78~̂4(!!\;{}x2=Ġġ>Rʛ?d+Xp,TZߺhi|Z8[2͇e1S{

^.m	܃2aЙ/AS?~J4c#J^,oꏦGe"Q5r@sPY*=gLZhTV |Bx2i#jZci$9_o;S>gsZ
,BU>ÿ&GՇfdڇu&Y^i-cO6#{$`udQ.o	e
4ߩcާ>agSC_eB TNFfݝZ-*ӑSr²v-ԗ/V/kb[^mf{Zi)J8҈$-n
)֑ߊ[sCX^$)0r]7`
~/bO-2k?,dCcm֙ӭ1/@w-[=)m[R)ytj).u1aʗ.ٓ*;y,6#FN_VGe<hEjJ%oYjKWR5SE ׺nh&+ؑԗ '좗}VyťK!_|{ԡ^ztrw;AЮާjfqtl/1 >>+PPٹ+܋Op<>G?aP( T%Jaey_.h&]m#0TUld`Tbֆ"AG$ClXIFk"눵`C㸿>ǝ]wڗ̯&y=%ɿd7(ҵp(h,P(ol)dhYfwҟ	jIR6GOL{۴|͎jY"?culKql̡OE&eM_<?5IxS08.JdMw;7<i߂SIcHQ6  J7)1ɐg
	W^O#tP	0B*W+;˸@1z6Y>4ΘU<))@xi^	ӛ@G[
Jf?yOg6y&:͟t;i#(HYtB#9=a</}SŖmx1I43Z7ǉV8yiؓݘ\i7ӡE35sqtz?O$d2]=^RwJE>ɇF6jO]X\$?|8SA'	jhZ&Oo#S5F	H+|#Ht+X,<gd~Ui`Ops<(p7me1Q\an!;F#,_3{N6nP%Xfp<Rk&to@CI#JCZ"{CEKӜ.Thj~wяLw7rkq%t0qdzL:={u΋03bǵY<^B[
Og;spZe y<a|^26.9~upvٛC
]J"Go^Aug퟈576:Òҧ%?K!~XE=q#ݦB"sA1`/.PiɷủtM7CBՆ).Q-۫K@j9Nb"RAS5ݟ#
@.`f{0S@V6O{!:㔢JF6Y4		f7֨s59qˈlc*ӧwF&|*Et.o[+ ]c4V̮!Q++'$vnǷ|Kܗч,d<=/B,ݦ2{CAФKF`DE ( \ǉb
@p
5+ք`ӀRgx]mghf|Vh?W/U# Ƶ
2me[=k3pS-Ya6͆~sl/x=%;OIQ}:?<Eku99"uDIP儼Gq<_UfU+>Z7T(t_oNr<3@n/^)0 ;{?Av^7g͐_=W@U!'O@7<g9υƮ2}W2=$z!֬+Tp3:ƸI:ƕq?y4oֱiuWoZqq}=vizp23$mxxbo ۢel+{IVu5B!fiQv	U.]2Ј{>JJKw>F>кR+xvck'S&"i`C4|,G}~b1GTT2@0|PO!bvuJ='Z 3Mc-}ی?۔97T?@Vy[ɢFPs{CFKk6{`g+Kꥷǝc~(,} ,|ss:qk8{0^c<*A2DD(ɢ m1-%2 N|{251XxB>!mAZs6677˕TA}+i::(SQ"{j
-G+pA31l\Ե8d&߹HpK-wU%KX4qn>;ލw7ج7g'oUX2.2`E{ryo'sb΂_h%<0ϕ5p{5[>;񕂈[@Vn+pKD8DHFY<n)T}.Q_h7wEQIwFMgsS1w8fܽAm\YrGsM;:zvJhq<Du=Bd	Lӊp0
%viYҵ5挔/*?6-)ˋԡW"IQDN@f$2%Ku\sxi5W>:
P6VǔgI.Ȅ LRa'fI"KQ_VLaT$U?S"1ˌ UZrkjÒ+VODVmjj*Vz W o-uQsl[*qӭ'T%lffJ9Y#\y3~oS0u۞ey'F;l*x0>]Q'^&>-·>k'lйԎ=Kblp1Zؓ7>ɰ
-uqq:robPJ):	3Tˋ`o{6SW:nBΫGɛ8ܩ=vg7rmҠш)ݚ6	&}[Tli#P-bdﴁe|$N+| w76K8)\G<O}0odb!-Fk3NfVIU+MvZ%vZ%3bj=kiw Cx6YKJSϫ<9O~iT<]lRX^eR&Vmt*K-#kw*F|<8jK#CPp煉ټ>0r	zv,mW^\V6q)򬩗Xj"2|Ϟ4*;#o"~sq2}_|6RSCK!y>VoNvLnC]ڨ߿hOPh4zFujs~7:bvii̔>uZj:/lj_ a\oLa1EMuPVQGW}8u%o'lWՋkRL@:`hnuÃ uQV۔(:yR(vGC0*7r`:\7HM-q!/RF#n;s~2]
,U@Wǧ?!d><It
!v7Ij@{M'9o0b^Ń$\qb?(j!-o^998~|cpvxspWQq|E-<Y@c1u֥ՈRj88.8>{}hHS͍v?9UOaIICMBNb2r*ׁВtJ  ڂZDDx
Q|BǐjQ42I2TfD	ރ6`D&nzFި3вpSx9	HYu}j햐gG>x?l
73X5*.qFZox~38fx	9<=UMehЋGҌd$R	 szrc .'9 $tL63M9:j%D461P|I;{j{\^Ow^oӉݓg \ϛTHxeD͙orZ3AUhp@TƛS<6Lwhgc"̃{V4MkVyj%	:, BIiYݬ6t[	@'gLgԺt+[Ȓ	ɜ1l,E%-OVO00[8띳,{:|vs-4-P]]C
Uݶ79AXˣ"7XYٝ29aWlVzJGovOtqDڵ^.1}ݣ^X dXo<+2Vqi0t-p/KN:jx_ЬRiGsO<+HI^{p.O> ҁ::&6I	/ʙ:c "Y">z-֊Đ&`QiB|dkÇ,\oNfW[n^oFZա4vIgM%p'vĶ^Ag	^'m@Wʓt2׋b8iA&<Crx !._o.cX<jj4k__w{g(}-.PBE\1ZmR<%$_b`d@vV؂0-i3b0&Tn$x9Xupe+ů_o	 8HZä=8>:>ރJ4mnQ0~j`qPʁ_eϵy9kgǯ`Ϩ?l05dÂcD'W/_oNɧǝe^IweV	 L>;g;)=V>[Bn7Pl7d<d ze]^s|
2nԜ!냋ɛW}q}XPf5=iveDwbI4ElBat3{M4Ҭ%!25zśэG.m2I.,ӳݝÒ{)>}G>!1+G;vO\Uag-Z>ns>m͑n@M"aG}<:>)_u }m)KLקg#ku ciaWXQ %."U,erE<7[{tSGeTڮ30lZMI[yn9(Ge]!7Pɕ$iN.i[ŲICb	M	WAP$"ԫʴ;c~|QJ-YOK4<jfcdJ׋{$rqS$͢xbx$gd_YzѕIK2M[P:aWsyTN|O^=f'T3:-E~\Z(l199MO}7g 6r\$Nc"PKչc (e8:
ua
ACȤl JtV-?z}p_R?VZy3̃E؇.PdWp5'xjEX@"b,[EL$NvvJiJ["Ұodu6d8BL@r"tkـiLD<SBMIϠXfO[JrQji+F$haS Nk%+	C}(g-iI<j4!	,P\G);]Kw%#|@."~uIZONvv1,"rJwxD	]f$iA}ؿftea,QGmZ#,Wá$m΢[4D0'pj
!$O2Po;8O=bHj^by@E'"/EKp$V0N\>Ҫ}ɢ!mApUui ;ix4>>	~⡊ϒ%)pZ*EMZu)ᴳ=}pd0zM\ #Կ*/\b_Cb&*لHs_c	uZ~aVcOabQ2wgkPӒ-E1-ֻzJ5`Vn5oJtqS.I=Ԅ{WsV3"fu	RU#u ><|O^-.RK9O{W8}otm c5\K['=2mex*JQ)nB{'rFvrӉ+߰Dgƨe`Z11O8cm*^-٫ڈs68.@\=P~yޥq$˰nUmlQi#YLlgZEoMxr԰%kxʰ?\BbZ1d\ٛsr.x7|)SKO|yv? nϟB=P?|0g`^|{BdxHp;ۖfwǥF@9N'>rG6:ROc9d_vϿ?>;A:ՉvuT団]n/ )}^w G/r?93}^ׄ>ϧgD%$CwqzW%2|li.{?f'xX}s$JUV@xgMdWv.GW]]Mmi7-kYJaNNO7ڋ!5pPf;i9rU?I7GiqtfF.-rK:wan>h4OۡNt|M.dR	T:Lfh^Nv^<8?=&aWN*ַ|
zWcӆs] *7EF*59zSClVWܠUάD;$;?6niUȔ6{igt-~HDiY26vJ㯹tW4j<j31xZ-2M;+AǇI!imۋNβy[͛Y(;i8UR4;ǆG}.gY-Nťʶ1}?ud<eגhE#;0Ψs/yꍂ}	gLHҏnaLVdqu%snef2d^M[2˰nf4Sw!	9n}+IB}KLǄӻMjcr'Ydjy;Ԃ5s zmrYEiD<eML^'mi;֯,^[9p~ښ?`k,G>*C*fTge\sY V}JL\P6;VdY!G+3D7rZ_WZYﯩ6/eil-kLf<8wu>9o@P쎗ka#5%7u(h {?l;Y缾Ǔ4[ǆ:=[DrG`\,g:84K	YDh4SՅKǆ{Tgͽ5S/L{u`}Z>TsHP%OFIc3x9|VhDPW_/䧰ҍm~~q
 R+\+jB aR~)^Re^]@@ڲH}"YO>MsV-^-Ek_҉+^9sQ!K\{c5<|yfp	3yX2%	VMlő6+,]ɵwp{foA<3ə=PyE2DS#
 	Mժ3Bǟtmi<E_;؄k|9}z 	bIDj,,5}V^誟iDDmAn]nSeD?TEK?K( ADuBꀡu -`F<zB;ş(L̓EEĢ5LKw.9R̇Ns2Q< -۷3PԆ^%0^j׶,.:"8Ay|o|1ظZg'˔vwϩ>H%ݿ|
%/%:AOn ,I/hZa&,*O;8dYfV3"N<UnLm>&xF0'Lz)D1o4:g__uQʥ2m|OѥCV]atNTSUlf-IQ˽fE985i]89؁KMU!;1zVd|RN)>$0̯}rz)%S&5N
ʚK'|Nk
h`mޙY"ĂI] Bl(`Egcʏgs*JF[q8hCU~Bf,{ 
9hCdfxRG7_9,6A~eJ"-)ypr.[qHNb K ß'`]x˲{!ǉ#(sc\a$YŹ`z WӽspH-Sԧ1t!NB*{3	T<gG
lGʰR 52dRY]c^hTE`x%W{Col+ʙh e9˩,ѳƞ1ο2nS"%J	ixĦolܒqaG&Rh,zx m$I7KO <Q5djHrmg֙Vu5$BTa)\^ES}΅O8>˺váXMu9MU0.\>[ ŴUܟrk)RzMssvg`1n-$cF5D1'x@q阼3> gx1^>\ }ryWMы3
j9:\0T\52
]5}& Or[x*a	pZ\ԜLuPóx(hqk_ycӕ5sgW]Wj㬈jCE.W|RκvlU#	FͤA,Ń
~mBU4B!Pт4uvg#ŨLTh܌t;~NR(*	x5(o%8rr(F/et_<K)6.>T#b_k^W	WMx8Nq7rA+kK
3D`	OOd?VǠOy5EMA}뷌	ox*@ZW!F<D|1[JDfG: .#0|<^uʦSڑFu
FR)aM#Vhu(#,':ܼ̆C΋b3kW_{dޚ+O |	.go:˨(1$<d6E޼9س~viK_'4MW}IxBЕw-xOn3aI!ި{ƈ#C
I~Rn_gBһlgAivQ8t*ZuXbr°wՓϽz'*QiSqQL4ծ^JĉmMЌQc]	0&Q#]bdK 27+߹xv[^Pc	ǡ=|&s0RxU43eFFby:bxaK(nDIAS5u$*4 ;<Kisä>+s$|WL?)hw5P+?+l:͛f`16U%ͤpB~u4[[X7/(.<`({S.Q!Op$'9WWK?B,5Q*^񉯠v:WGǇ[vv9K=JF5Ы(9={wp|rq:o֐Kr7.nf`Clm'{I晖M&TسR-j	@Wա!0:ge6Jt։rZ:8ݘDq^:Y	͑Ivvso7v3ɫՠn*(VLkyz6յ΄`*Cڗ:ԫu.`#p孍_y/rS8o>!HھkGՈn niȸ"aER*bEbv>i-5v	[ߏiU7}g:}IBo?:!.=R54ExT0fQ!6"%bM<Hk8"e*xVo?5kpN&4 ēBC~V§qF,˙Oxp,[3g8<Y(a_➯FN/iV;1P8{_9<ݨKEgQ$@:BX_Xй<Q~âV5(f-XI
푡32cSie4$ɑoIG&.xou<]o}u:7&g@j|yv/)ra5t\DÚ$(k	9YY?r*'_J"+|Gamfk|Be<ёC /! #!eqkM|0zG肳]o}Q0~	d$`?G&^׃2jRGJ;UYFjc8Xe3
cDdWJsriӧŨ Чʄ!'3ȯUY&G=A,vO	~R~'@ZqOz  ?4\La-ٷ?`	qoooΓN/O$4ܯ@$\~]&鯳yŢ_w(oZŐs<z<z0g<mtK?r[AMo$)8o%gܹފ	0"E4mJ,(u,C;>`,$ \6qҘ;*h"m:E0]ο9~ׯ~!U*ghy;x2o?M81k~|J>'owz
B%4Fȓ5@aeBS7yfD4OWzI^Ti߾ޮs/p+Vnvbk+ܮVpNčHL.]=i/*50j56U{03eV>dCo8}Nٸ8wcd!dZ `뿃u );?=ec};o<ۿ/$??zshH/`2}|}A\W7]⽁:jy
EFwϭ0;mf[uik\ kwf9W)GX'D}3GƃG$|ADjW{Rp`ALu6m:ypF
1EŇ-\Zkn*̈́06/}pP-R>f4ϣ%Oǲ˟9\BE(<RhLipN@M!A^ܧAb86JMP@n%N&ߗ5ZT4RiKkz+=bCS(䏦S}! ee^<Jz2FM?m?x\gǋqAAL.6D3Cw(6
ew 	`i^]cl^>NpиN5i|/'޿G1YQzz^(<\=̠/F4q!U(	%ˠһJp/n/͍=YM_f~#Rh)ɧN")sk]~2R%M
XQ
+2@d·S6'9,0'g<յQTb$nԱK7\J8$QΧ];gGvꓪX
tt29\Ù $7<Ļ3e'F^
+ᛚS7r/`[EFh@6R)_R[rn^?nv1/N=)>:ʌ,PeZnY([p"Ssϣ\E`޲4pדu8R6x)LE55ppVUKzeV%yYݱ*4 /Vm^<~Ap/qW1#(}s3.&[(ٍk^^^ 'Cx~׏Y?w> @;x4&6&rL;sANw k9Tbst0p3΢He=/mm	hVrd,iuDa8B?޹Q?:moQAL1a]YiOl C<&Q|!6RA*jE:XNISݥ:V777
&hlgPٜԟq:@eY}
}vi:1ѣҥ1,Y(Izk̢=hRh] N?Tv'
ʻU4(f -jJy
>sVAfS]3"m2fNOh,W*dPT`^x80G!p2鹋qYsu2sBG62QN	HcI'pzOsdx9!A%ey=EI};Q}Su^nC
?Voq0sھ_L|25o3Y^wƯ3C; a\FsnbWv}1PJ:'=,6YjAAi9Jf+lS_a6S+uW<`dr0\xc0rcd9]2_!-Jo7Zټrmo):PC/	ַ4u_%R|q46a/"m3MC[]W.𴫹ͲThѫ;d>3G
djmLhI^)Bvr	|`yXMy9TkZ\̪}-aݶBYISH_V
F/2|-#1gN)u|u/J؜xא4/ב?eXȝE!	rl66n,֟;sgyi
+%R9wMu>@"m?L.⫝̸\}2PtjM&sJ+YvLhALjϢ+<a]wf\Ylwi-|k~+7O4	6*8x8Ao,5mcI\ELAQ5dX#`.q^\l2rK70+h)M\^aRsXTX"mVlEJ4o},`|,*۶h73K=gE&Үd0+t ҙEjg+(@=~f;'C̆fF+1 xLpsSJf,'x8onrGq<ګϮcrxFY׍?O,<IX`?{X,j	"[fDyOdjY$dLGݑނ G4-V! k-o<;d;WkKDXs'(z-T%'۬~Mڝ	;CX7VR<] b1ª2ci͝aNsXLM4IkWWgwKr\HWUdQaENMUe.,m ㌑oNGW%-p|Hಅ#ݽXmmwChAF.EיIaN%K"=iTV[qvU`gucF"cN)m5Ys[TCjH5ɩ[bbֲДqAcFp4WJ-[y MgQO
!4 Ц2(tؤ36dLzI$=mYUxMGg sZ9d~N`w2
3Fp>g|K`f.wXϵ4=VZO9d7.ɚٰ+,|ܦܹ$Q󜣌,;!z9P|YK@Z|v>>"kŁwo<)ޑwigrw&~֚oRX3(B8Ցl>y)/GSr]Xmh($À/hfWs߸qVmb",e/֖=ljS]DW[WuХnO/g؜?jl䮷d*|,8WZPvVe0gfݜ,fD+kG j*kz+بJ:N9J2ݘE+T{3WR#LK-קLnN^Pi0) c-1A1$.SmsM./.#ͮwart *Vip3rEفfIAhNx$W-fwG&,sƷhZZ( /TQAF-\lzc3i 7 a)}
'֦ 13	Hrك"+ZwEn@FnP,	|\2՜.U6M>?J|` ial:.:cVby}&A*O!(n$	fDF!]O2cG
Acښ,0M>h"j$i/b5*neP*,n0*0d<N駢Z@d
1dqvFR|Rb1OQPu'!UQNTbqWb2()D5
:-RŅCܩx)X_(	e@&㝽(zf;a3$諍<NI_WXb<w^SfPz@	/dJs8mAn[Sin7$Ų1[ɳ-K Qep]㇓Rn~0Kmy6<FF? Q@d P@d&[-y%ޒN@dxЈ͑ߊ4Ony]V00@~,?}:r XyVZ
(Q*~GQTe0T(Y9P+G`<ŭ#g0,hXe4C#6H.#
`%`I(ͳ
N1luǷYH/i
fB#fI:<&	?<-l¾sNx;yg<y`Xʳmy򠰑8S<oK!@4Eئyŕx]<FF O܌ O,ޱrf$WnLYȓSԙVޢ0Z
X)*G'[^.-IqAΓ)n
䀠عyȖ<l\#9<y$h<Y6)ɓÕ#)(.N
KvH,UΓ-ʎE9O,zg/"[0n<=Fz
Jn;5+\~i
g]Z EtYr+kp)k B$,ZًGJ*֢*O^Bʓ!PB y;OB4SP<_75pm> ^ۦ,WwB,/߃*r",OM:'̓`ǉC(1C?-=AϮd
z8y-~<Y{CN+<YA(CL4?`;Ofȓ-BRɔN#Nw^ñfyy2#c~0䗶=+G6L^y3Ow0C,/;
zajJDoϓo<fٷ<;S<NyۑXOV,g&<}lqNS@:4.Jci84Yj*G/cXJ#ajN$ 7Oȓ-F/)Of<93v6Oy͈I8)Nm˪<^˅Ғǣe<*%p(8`8OV 8n_9ɖc.Ky+D)]Vt
<^ iH| ie77E%'F'#O^K<Y4t\HxA<O$ރ'Ǿk9TPRN磸KQl+)jɃޘyEu< :Q'k)2dYE	PrB6xL&o+qKS_aasۍ4+2IvoyJ	/Z=J
ST8%'PF<ݨrɓ5r
[y2y`^0K@V0̈[ȓSH<F̤FҒHJY#*ux\na#
tTT^
=Gj
?P<EGy&y-uɓiTܲFo~Fiń*(x!xdoD)Gr밣QMW&<0<_'?xc3;O~ ћ]N~I/IG*(᳤jy<E&*>u1QrA@vq*ge1- .ly^/Μpv0CG)
)yZTXSʯRG`^jaCL唵 gESZʻDSy<:S*$6g7ޗ$TUS#<EN%)< f)M<Vy ؝XSyyv]AXQ
HO,	N`i'x!x+20'b++dx"u탾9A#HVaq-)[y
M7}/k̀{cq
KҘ[ŵstOF=ʱs:q$Tƶo7SZcʫXSyeb9$,UFD2S卦$N??ǫKq xHV<P$7O>B$V.c͞\*G3O<2$SZ+#XDDtxU \ɢfGf)-3%1|UyJK_y:
V^'y򜎒ÿ<~*LVV?8sJ&ǀ@Ze9O.6酀yJKBjOOvg?;[7x<O錖Kݏ% VH>+DQ(R ב^l|"mj$S&:@׍0^8K,)xeݮ=]^X}+o)">@Fv1zqsD5
ŽR2o[d47w)}.ƴAnC,pkd75?>;{/7^Qm꿏w7/|3_4jfa٨vv#GP-[ Հ0߲Kjk̶@ߺh1FLx:7Mf齃g!L?E,t1s.v xA3_p&6	<zQб$ >1܀;?8>f=(WjџU n\ݗ;ߝq-8,[x;qw~zdw|f΋}=8'';{;/='׏g9;W;Pk>J'g'p'JCAOʻ _lLT SraGU ۿ<?(|:wZj57* @=P'o:E޿	q4	,ȆqALx|-`^Ft.H4dz?AXS6z=x9Y$U`KҚ+HdAH1*:\,@1vpk2n&C)WsFkg7ћ;j(x 18 nG)fAUi}j (srf(eҴA:0dqYhχx4EC^.FU yYKwNNv~~
y0Q: Cfz ?J85gDi$	^99	^9y}|X#Zڡ|A_^h@9	5gk<2Q|J~ag&@@N1%/ ]և6Ƌjk@/4B
 SmbYbR)2$ It(+{?CPVI&ۮA}Fa[H4AYB JBFC&>8n$y,PA	QtFxgLs8l.ƠnL7/fء=
GP?B8kjO@Cs`fG m\2}RF)+OpoWBç)&Xz/xқ¥bvp̾wNv^|wT:Yջ !LG"KƳ&S	 
nV̞q{
+716o4s@`L[>"v
 #wp865A=Pɜ'pMnlb4A!3o:Yt3Pgo4}.W0/9uDVHΨaB'ꀶ.(B3A)L (DգDuKDunҮ"Gʷ%N"sv)B]șulv	C ƌ`HTT}z=ʓ
.NF\*p}<~)Wfc
 taL|hnPJ`ݜA^A<Lp:g#
'nw~{TKzdqym GNBd\΃1`__}O[o7&dkc|iIVƃô[ANZkhWxZP1^ͺ*~#dMOJ֊Z'TmM`w	9=WT;k<kܗ}$5n173?oR)"^
hI,g_ţBvRYwX߹60pHG둀D 
^{l"++%JSQh$[.hdsĨmX0O@8!rL_2 'R 1W#A^X.ly"o?\ǀ:`-ѣ5#0HpCn btS͖
ȣC4{^&[Gzܫ>>>&T|=R7 ;e4@q+Jc	n?c1>(ǣ%3sCЯqHPjF	xzH.9kFl{?::~'go~D=ݿ@٫G7dpw4nlzjwR4o?'?	&ܯ( [xG;$Ae\$X% \K% =S=E1Y\l]g|{p5|	zYA˯	%&NX~۷|=~O6oiͷeZVm/_G/xR*]"QYyhIanmNGH4QɕD {8$(F7KWD o,Za+T%}6б1^/#.?z/w Q|U#
.`'aøxy~"?!$$ X5FiP	>A0R}4T7CU%a@[K./PAl"*Y q>Ϯ=xJhFZVM20*TY:24Os@nK`Ɲ_<u^mc͏Mr;IB4!S;N>lh#)$3M*_M d3H7dgAPD	/p!1>%&]u3dKo᯺UzluPa;tN~F/^[~tH0hk@LejLNȇӤg|55>5*F8A]4Jgj4xUG_U ;U <n6	16B@%̫=ZQ/bjD(({bWt/t{ttGP$n+w|V~P&? =śC(5nG}TGr}i	pa=#*fUy	S[{tFl> 釸2=]^65Kx̍AC`WgrZ	vs@(I(rZo)\(5"`&K5UQ3T`,	X%QQo3-1J HDA@2;Y"$:6wwzKGѥbs6pz7R,) SN@0$!;m+6G2݃6P3J8Y a@cS!	L8=(@%dnޅ")Cxf;!792"QhDK<o2#(,VWM.W1 p¬	wvb Mt*foL/Uq:& i~ի*mSl
R1Dnd {M"cı̅ DS;(,Bh<V}lPa`fPb`e 54`ߡDQC3TD۫iUp&엟**I$xvti GÙzrt7ŘШr$;>H#1!#Eh8o#=]yX
R~ă`뱸wG<>~햙σ_D8e
1Y*&õB=՘1oݒ4\t5_+uU{:'4H-U&OnSqI_,X#fL4$mOA{\)שk#%AdRbfsEvb&E[_"'h_>f_B IT:"EB3}f}|ZhKe|'V^}Oh8>>V 7A'n(j7z|jD >M1咄ymE L:7^4H$U7g#^B}R39}Yh<dj÷oLO[{5|&_7ׅ7<Wm=Y' >	ei%gH(1:k2Cl<fřdB$dDQa6直D{8&."la{$Ϻ{oQLD܀*yGY
DnK 6El#NK_(wӴ%k1D1噤sshAx
cǓLwκVP6KX,d0E&수>J4CTq'z I72"b*s?;/s im^[_3f+ݰWG!o[i#7E7@cea;LePB~&Dd~Џ+ErqcAlS_C8<'M$[_o[L#>6
|LAh!6pBo$z._c{bH*.KEߩfY1yL2zg)jD`%aD<G{HLL0޵-gL
/BHz,}0/H=UbZ:t1:}ϴ]{$^>ȇt_[YpշTf0r64W,[#MV_ 5n?6XoBÓwE?(F=hkp=85*L{̆osVfM^j	]FUqa4W,7o&ni6f7?	3aŏtF5hhC@?SYj2CkɃ|-~roqkQFQhx͏NArº!٥M&Ux)ڪD"|]ㄼ?=@ $[ke+=F
%bfmAƓ;4 <1$[vc&#00-(tF=TKq *Γ_LkVbȘCvT F[JXvC?xL?yL@7!>VCAKҷ~}>uBR$cڸZ6&&PKܒH85=c؄%436.Kvg4<Ho2]&笋zw@kP/0T m,#G#ȃʣzͽ-൮W]r~tOI!
O")\S[u]
I2Q
\Р&o=^,E|#n+v[\?a'u
L6іPJce16:sNV(tHdK!2Zh)sRUNo^!j\۪9S4FPp4$OkY5/I	TPJ%&1D:b[ky,F>.v8x@yGr\Pxflhx6#lX9$?tFi,#lXfM^ 0+ò:e,	VP3U"BŌ^/qP_-J^CyL`u<!c%R)cRwpXg*C ޒ0[Xd8 PQ Ѕx£LNԊ=T&2Ns$|<UsD $opL)gʏU`7qP92*`[:c+U%n$kb-H[P'kkHsaOcS|2  v(CF4zdhymA#@(j[?{ʬj.-Y$!_,Aޞ)
q~cK!\Q3`7]k,0:X j}ȸr#ݻ:Lb2W陼7DuQtZ2aZ4pj~Rk$_0h/H966wi~~jHFŰo|F6$
8MQGɷ=½N#!~Y`ct>itkzѽs$=}'-b5#Yp''_#4#GL-'jr"eEـS +Ʉ
qƛ.`.et6Icǌw%lMVPj5?<:t.
Z']OOp!ŤUBPɊA|Y$@Yp$W	EDlgi98_ג8ˮCu/h#R[" J#} ĕC)xS'_f#^%t|8+> R?GtBBо},Qx/|cMI#c`#t>җ];ZaKR #P$uIL%!B&1ꈬiL h qڠ0ff-4Gf	6N^Dwx`OH}2CF's`2V2c[ͿKE4v YOX7'IHF bUjKn>Hy|NXSli{ݜ\^B41h[\ B]Pc9yd5'-,%?dvonmW1^\6xX&yeMDF|aim֤sX{g/OBDLP,6㘭c!mVnHldԍ҈B|		wPԨ:&UeؔB+V*=4U4"Qz,}Qycl4T-Oy eC\QCE~T])؄_R@^ECWgmHKEef$! D9F/cx i\xb9p>C"n#Nȓ*[/p0vfhp>+MŜr	oPJDn683ɗiGX-#T&!I94ג_*I/o(Ԝy=cwh{*+G:RdAFx5m* /4ɤ07	3r̷,Kc_0@Y
uSB1M2{%Ls+Mn'ʿQZ'D.WAot, e(Wǜvr#Zū -  JuVu5?[!Yjq??V	%k,]ӟ\w3W$Ttm	oEms@ۂlY+'ˍAA
Oآ)	ؗ@q_c1<K}17*d΢(K;(6睊_{MIdn+[sJ=Wq;N8wG9 Oҗl*́5nbhD׀xxwʲ@.Waa"bca-"93|-#)-Z#`\!a-#_{3 OMSO91HY !b~ے._fH ;I?υ  t^
kr:auHI88h#/vƼ1.T
H`#? gƢ>uV/ڗKDףYjK+xVSng;+ɿV9"pokX.n[.r%PrpUꪢS0VRBeAz~u08 'LG;aUN̈Y-ee`Ynrܗ\_v{oѠdl-g`^ǖb񟄲KV#Fm)?۾Q4cJ5a;3lie=OZc5bn XUĠ	y>I[cW00+',;#[$,*e.]V -VբnO`hT(et?))W#F2+xιXr}z^fys"'=
2=XN|mA½c7P>ʓˏ%/'xi9Mm*N#yAGZ|_cs!{I:fF⛝sgʝ
R?OiyjI,,_R bP*97 ѳ0N}JD|v
1	ȋ,ӫG	4lb#U4y1$;ȁgVapt`^ۜGA8os׭=`-,|V~Ǚ۝Wuxʊ#=o1p XEC1@j!
gpLncduB%14B!`˝<T;+'"L!!OiFݳRQ7]Ϋ(8ɣ,=^kړ`D6@"(Yţ/1 ?/I\ΓXF< fvEFA'b<~qM5[E)+&tdoFhhewBkp&IJIHj:@vwI ψm="O2tB~zeAP'^ꅼ*J#=<|QHZl;r@oq)ؽEh[N}C7߽/߮ܲ>H
8<@]t<P9I ^r2)iRc?deeEM==k)=E<Hd*DDK^ TT+hnYmT0:h7Em]?1Ooc@{tms`<do&&@_V*u؆VǕJQ	C
ux[U߫CBM?t
<F#$jSш:j)̘wc٘0ZexgDjoi$FZT|Z.]tW.J4{FE
6b9ԭg5[ov T>wc1^@gJ_EQZ͜֣ ^	/"#I4-OOHV%zΟ=10(D6!%2oFӼ'ժ\d7%Jj^+6\2XVψMnh"GP JE|Ғ\029X)T;͗hۦkN ']$ݍ&pHS61a	{$#U	KMGȵm{<^kT,KQw0oDAβq"VA]Ok@bO};rNۭYؽ1F|E'PY.'Q&QS({_/Eᒾ''㗑|L-drM-t	l;d mu[;;ݒ}n~MIHktOaA0Vɉ.5qJD2mt|	h]G]h(suDZUDgU|qM'*ylx:ߌm`fXE&O'!^G3]dI=sRu^+ͬyډT U>й~ڽ%c 8Y.`9-I}mhz)TE;Rb١, ѴJ 2.OZ+{FC7صá3<;/\k2pa2e	rvDf|:Rƿo6n@<>6GFqOCOjHH׊kh"Y3!#Ogř ŅYX6Zʤhԟr?prی\:9j/óbs:a,tfw<YkTQ/G&GČ.dD/4,'#E1Xeu OVqfT5N&=c6kܚ5ow_oޝ#g\³X:V:Z`z;	m)pt@`I|_q'5fcW
STqH?d< r:$?ऑf 6~:W{ϴr2֋adIA_sU#q(7z{N5_/ɂx6+-&*EUCR"d^qW-	É;R] \AߦB$s' AM>Lcⵙٚz8e#]F>NġI4HMW3+jE&"dIP<&͜V4dXz5`^:xHQ31"P>t#un+\ȁzx su)[nk͹6\7P}N3]%$6Q+,X
PLt3fYPt3N[3LRYb9|$!,Xvu/J%UQA^IVjp=XKLQ9FрݨBsp>BmA*vR`I2j&ynkGK_/- "(oՆ#_"GGx2Q8a!QsA&W1SB.=Y&%0	A_8% =zބ<av!vQL/4aTvDKńOe͟ml-R˅eڊԐ>n鼈(D`l1J 2Fb m;;{{[uroMs~c"qxT6M}A]Prr]R=zJ&[ųI|׌h/_[H@uIEh"?Dj`~VcO8ylHȺOXiw5B+D2)xz4^7\!6HvHu+.if.@i<V##d#z@lmQcr%I}{{<l'.x*Qh'arPu}[MJb{3X̃ eJ>u*Ve:~G|ԍ"-nRJ<!%ZJMSNBgܤqb8V-T`PQZ0bPv,>nkݶ(J:Y%GgݼWU*QV+UKj|Q`SFs1@H+!WbM?67~ܠ?Pa,=>'e !G,hin-˓ؖ_ϿA">'%Pׁ愅%X@'M,"^llͤ 9*ƚWl|]{.B5%om࿝ӛlXA*calQ*E?阈2 >}9	
Rx|`OdRTQx
{zpr%x,spr#%/ hP>[H!-POW֔si7D;ÿ&LȣE!C@6 פ,ʝQ˃DGY<p}2ef  "ְ: 褧cɡo/<38DHIE<8[#U~q>Vۓ-Ckhq>VY4,h>>xӟٝ7$sjkoowO+btza|~đvQ
rb		it-,s8-hN{u#cXrfCHʏ~zȉwǌi-o pKFe	L޲T&@fؤL/>dy#36Üy.smi}'̣32\.LWPБ +f0So:kIX"Ӓ%j,XsxA@Ǡ!ޤd[3'&} pL1I_ܻjQސlu`om̫ŸVLѮ\ תZkcZnJI4UDլf1"/O}r>[Z,m[1`~tbFM\/G-`Oz(O> Yw[/^_zw*PN%ydmwc'?}A8 }K7 }ǟ}şκbgnYܬ;s/pXܙ:| )
pEڪWW	LbZ"_2+J^l̈́V?pgx.brkߖie望ڤ0Q!oMy	 VVl4jJL1h@yp<~VߝB>K6,pp՛}xz[+;Ixg830
Dcz '@WMI]8([oJW[z\W4D:mܼʷǙZDw0N %rLn	9F6+!0V&$9B=a$*2F$i4@':0 6W@32؈PU85F筢r,щ R,\N~F%>!Ig7M$]DO5jW]0F`6˰MD?	062ocPɢI9('Yƥ2ܨK}
tvUX9
gV]sZSxPX[{ ap#qT΋~) 0m7!ӧx;C)bpPSSzm5[:Z(
MGB5t!Eeixhvrt@CI)&#st<~[>'WA|(Χ%ǂ`^0FA3Z`j^G>l/u2JW5hCU0<"89Ik3'rk0sOoʑhݥQ_P9)(@FlN1i*jE;P9?亩R'Tab)RT="R<:!	lZ{l$|d4m;P^AE(xpTr̙!f+3nWy.<}70">%XJ9<L=h8&C,ĭLV# .VTgZ\Ι
5*, +0}
 SᨱHfQ5sAyM=|=	|}~q!wՖ%9I5}3Ϊsi\~6)35Y	;@?^[aO=
/1E|_VVhxmu;EB(<&# ̄1jꇋRh6.'' P&Il#hsPwr #tGIL
N<9&}bg%A-BClU?!lYeVz5+
&`}/(".E݁=`2:ov-a0&F+-§0֚rZvA|M8LsoA{!!r#uI+vgs{3>!CyA'f)qjdєۯ~b|>rj\miF5-Z4(t)\S
}]r @9BFf{ieI/|Po6mm;hX򬄃[΁,:57hiyoo]z{[xHoB}Mu瀺
~'ΓG5^>6`{[̲ }7<}7߾znɃIϷ_{wg{ۢgkC#5ЃGT1?H~LDqx0ذ6Nzjw?+z 9U 32$®# I76<le6W&>j57^|ww'_~67vly[b[&?']$^zaH~%_7kXF4[ћ'h1Y~b[{3=2\x=[XJkmEws`=nT{`^uk[}l=	?b<EG=uqmw;9{tBJ[;<4}S4pSyNЫwzJ014		LʏĊ&Dx$)=Ľnb/Y&7^¨q:CDR+s< 7E!Fؒc	zN4
&GKN4uSڼ]|ó|sd,#ZBMz?L@Oƴ=6)SwLN܅s>~+`?>1GcSxs@M`;OK}BV7D)٫ZdCR5Zw1K64PZIKLP<-OSw;hoX7oړ#70R  :.#mK'v .M`I((N,$.iJȖ(̼{Ќ[ lپи	ó3坕&^4ԣ3+XX=03Ç2	 	4K4Xe#f2s(.T=ր䳸9_䠲Ҕ=*9hhW.l0Q?pnӺWTB"~4-
eT|H22a%t2[RU1a!G"\FFQDYmt!Q;V.&}wTTwd  M,X/
~d!($v.3
6g,"~s2_T>ҒZpzά#T!=좠T~L/͞\(|%SȚBy_
¢>C2F9K_M[iJّhD9
CD9MD5KD'X'rqP	x)ڤ:_1Z^:TV3&T.uo T}|G茎F	zɂgXyq)76mݜ3;OA~Y HLѵ&Gdhmebi<-]!ݙxD?'1ңXfY]T!QRLv(?sPdCq/bf@1+]O3mI$,Din~Hז1N,2`PBҳ)=+tMOni/ &oY^^sr>bjڱZrr%G;:UV\MT[9R#kB8&620f0Xv˕i?dUdr*N04yRSXRd1ڼӭ8faJ<'M,!,9~͓{Μċqģyh 2gW/shL[\<:AE<eҾld,|`,=d7zA~g*YMHly*WMb"/	H'W<_)ʊE78XC|@fUɢFʻ sb91J?ɨLSbdAGy: F'Tz_bn	$IOZ\4cERyh@&dCw9~Pdl:$ҽ#Tdګf=~4OUwԔMI&$WbG=HVYD)|͓~Hv>Ldu9~υ-gqO>'(Ҩ~uS$SfKDd:oX~S--%LHqzFDW1*Z29]STzkd%t}uLL)rٸԔdB<&}u9c$L0Ri${Mj2[}uޜ5I1u`<w\,KTz͓~:̅Ŀxp2.wwZAXfXf<À_Y1mԄĻ]%'9o?'ӾjsAef$L34y_gy?.JetmJNe&%W-	?'ׇ2ZGtK)(b=ǏI?L=mI3Vb}Mھ6auY5vz:k*%s-?}2-)j4$&݁RF˲3FYS)ɄJGh4YlyYŦO/:-{FZvTYlpUEmbSg³N-8ؔBӋd=#s2+&% Hɀ$͓~Ĭs)eVY(Y9~4O\.i7Ѿj^d5(?'Ӡ(=b?'݀II?/e)JK>'mM+4^(w`N_<E![ok甒M$,Λb=@nWz#K#?' 8EnFcd/ֳճ(Τ{Mp%IqMVj2! /shP2ZY)YZ鬩dB$7fX.L۟y_d̺qGSf22yhȒ>iɂgXy2-MŚ\bʫfAyi\6֌,%ZLH6Pz͓r6H>' $iMz͓~}gEe*~f,:c9~4O{W5Pnƭg[}/~;}'ue1fht#F.ǯX^>pf	ly/cN{u۝7h)5^2=!Z}{|9~{e/^gec<#妽Vc8~GWG.)%JI&8in~x0&Gy;$^b)<b)ˊS
bz?
J}'+&&+\O`	N#fA54+u
0T>å%U:!
9I7i?XW[ڇz퇟V+"t/W)>EIb=%yjMsmMH+))Ueץu?g9@VCY0~є&C϶12;yY-ޗD~7bmbvVWQ7<WolZ@j+<3{%0ϖłސbXFGmQyEf`Dʏyރ:&+ބu/ݛZQLZMԤÊZ,,*E"FdxF:Cu)'56FE=2xi%jLZw1}<f|5ܰEу;ƂzF@nǳmhzV7<QViwl
'~B{BIhҮpơ#jRӪnwNhEt87vގ Gc00Q}Va]L\^V>Ѽ3A(ۄ}X6ldO)z1M
&JĨXջQaFNZ:;֪v4GV$rm݌x{#a7 LOp:m~s&Cg^&Ir(ɐCjB*J.h|ʑ,oGBnsql-m`Gy\vH_I6bsgT9YB|MF|aQC= !t131<-/(|rT=6ü-0@q
W兙Qmt̼t`*m2Sۤ3]*AnLXZsc	͵Vk<27cلFT*_19v+"Ϣ8҆V2 r0RoE踞|:,>IR
1M@"C +h{@Lꈉ=Ñ"(my˗vyBoXyID4e5ok20!R̗¾P`	"׮x4.Gte7\VMUL0Voq"	%{,m5Ll.:a'vi#q4c
f3Xr~6	}jn
lNr>]t@f4U! 3>;HbnE4(ƏGQFAE:DƅX{;v0HQY+{vȞWٕ?շJ,;?47v_xD2^cn\nݎ(x[l0=~WSy(xj1WGTqIwڞ 3P+JcN!:ޤi0aLΤgG6JA>p4S#>l>Qېq"]O4r8H93ur,҆]d(["hiZǜzh̕c.ctr@_t/Kg''%eTyв;;c|2	قt@qĝ/3TE>u|2.UICЁo;g@\M*5u\ޕڌߛEdm@|LO݀|a-7{[p2MQkPifb\SS',ZU.tԟYsF[W9`oRK0*2
Z<'NK*zbWSpBx	3!BP,	7(&)K=,vW[$|=YcHkS"m't֝2d!%û*˹yxG%F Gl `mY@D3:VytWl9QA#t%@\5 @M9ݴUk}cje*tS͂2F +w
.3+"E:aҖQaC(ҭ\ҵЅ%|j0aY'r3EKnLԽ(mB]xd[k)J,TIp3j_dD,vj3 eHnIN8pcޏhgf'aOt$ԝUH4PzV(FkNx#\zuL^["N*Nl1߾H(aNh	+ثHw1:%L3i'wݲwYSb9;PxJ1v􌄬e]I+ЃhT=4u`7Y<3EssXy:/_?2A9{bx.~W/ǝ{0ʊ!zw Z?xeV0qZD\$O(> d*=$D]y2F:[Vxq2h}z-WtzrHLcҙ=Ƅq[A' 0/,wV0=3 (}gЉ}y_O]4H9Ny2?!fE]4]OG%q̢܈a4q#qG"hi27BGSSrVk4e')| gz>BML`\jzڂv%u&xvQtomDu[f~]a L}]taNx֥95n#X&+~"=/2-)Y=S!I߄ea}E1oQ(zFAۀ֘_Iu=Yf{g㌅ʓ(w]_OG_0ˬhSX#"zUn,F$$X[Pz<~J蹡sye'#Q}7 ,$EnENz̹-Vd)w7CZ-C֋)1	S:=8ϸh%rdU58#6H$>j%:p* Z1(!iinHA(,c]BpIjwtI-7ӱwc>eq* l^'6  uBl¸Fp`mEGMGGҭSF9={I@\ vǊ>q-9~d3}.%ZZȴXt-i|UXQH
7}DZngx)jL6GJ^&uNUf|jZS1,N@!_c\?*EFZ3CS
کZFh.jW/Ѩ2ؗ/tURX:^rmT*ʫ E/J$H3Y5	\ZY_jƺJ-.[2͎%KGHW+h/ԥ}E㞹wm)n$G@g](@ZˏC'KݑYjNkm	3x4֌le㖝=HU6Y܂K<ٴw-T_k/`E5!%}+%H&+	WgAPC^O&5e70vSueH`e N3ʦnv`8V:Bp_=͜Mq7lȏy8/f	)HU7)BVQdߒ#R>Oz ?.ȑ+k#0<bqVWjSIًp
͒*iu[R9wx?u]l57M<4j	ǣ0霂H%:i/ VdS9?Y1
QΛZ>_z˖˞hkH@P!ә3}(&Z<+qNZ hhVEǁ)^}=<sZ"XO	4Og8(ѕό*GM	SHZx5'q\9]jO$S!fb?	R{k:!st<H&oC+"sX׌!|3Z8lf/J\^c,5iROdD`iL#zLrRu(N<8J@PC5cƁjRcτ?0Q"f,HyG
z,f^Ru"ԏVObGR˒xj؇fMYI߭^ yCMMӺ1ojIg䇄nўPSo%9捻 ^dR!lߓQ_Cb4sj8Zm=|\"fj3 ^dն߬WmTUoP~<F]=#h3Dxo^nrEݤfw?maSNѺ qR$1C`P2q6߷#dqeK
=yP>BdUQx^oQkoVbS EhB~{Qm	.02_덝[3ؙp fc*n3xQoG.V5&t
G(c[UfζJthW)?«V |wTI<OP<"#Ev&UNTh[4_(W-)W?L@ʏ$M:d rqke7{vdAHV:55?`:Lcm(9Tr,șJ{/oO#b,,O/}\fZMy9_eQz_!ydRAؚ`$W]BI1?
[f?T>lK7T,qZJS+ڦf~扲hێqMɑHqw:)r7T}'	!8nklA}KB5Q=Y[x%շ{h!rc#6t2UӈK$^R:40B-UTE`В(wP6}&FHEcS.?^k؛Dz PSn#- t;5(g\DQN@*wG~R}
=R>[mMx}##" ԣKD=7>d(nM$61P@}EQ$A2E2PJ]LՈmiO2Ǔ^epDIo?qZ`o~
W!~@[!dd&u*cTp.j̲$}Q:,z \|*-VJ*_s;փ+tN}iѯ`pǣ,V,/jQ-k^U-%X#S$\OPO!ǹ[cӄ-Hfm=J9aր-\#YYy<Mh%ykk5Gi][գK87"Oĭؓz Htj!
qPzl,@-hEaٹ4:ݜ0h_o~q?l4rޫBAA۽m{]4$ckusQ04r}(5BU55;'cܔge6O)g,xH~C^xXtDvk{j{ۓG(jG)&-3
\YcE1PcP1ޱdrQ+Onɗ\|^}DHUÈU~9{=MȡҫE]JZ1\SWtGLyy^}EIMiCO~IdAx:0eFv|e"L4_OvOȊ;J!N^oNu!࿌`R9uX)K7Kw`?fDU|Gd=j>]6l*>)Ӡ-3O>M^)詌ɧƏ9AF)L# P(b,_gM<7ެ.ie\1e`;ɽe W_fhΔRl˩[kiT<T2bQQ%h5W;"	6z3ڇMz&}C̑)8	m2L_"Z:tKnA6*GmoA&Z-Wi]vf5`QƀVX9e~_{lM؞{]lNh4bJë3j֟DG&;>;$S@ZaF~8X-g,15^75=Tb<̀Rbx	09zZYsjOaPh)XKv=U}YXњM(t;t ahM+AL6l&qFJ2J⢩ :1#F/16SHO)P˕ySrWW)e̕2PaP4<.Ǟ,qv9skvU6DJhz$MEHw\h/V/! w\|z}vq 0bu	ĝ,n3Y@OQH|9#k~G5Xy 
@x?Ax!U@Om,7toFxݰLW%5"xRQem*)h9G] 0!@rLNr.V&E\'	AfbA2tz5aX	;W60]I:tM܉0d0iEKbKETd6 rT~_n~&-3t7j\DATI&
A	}>{5A \KpMu%ne"b}mL *9!/|ss}wml]N6糦Pl`T{V(AISHYSa֤e_v-F	?ď/%?P$EHLk 6/gXm4juB`ڗhK<mXfp4W&nK	GH; &GQWo7yb1aYYg>/ugDz5	qDS(1'= Fct7m-Sb&<!xºz-:XS3}rl׉0?ArV0*ӐBھY:g{<\Ew8`KC #<QV`nm]*r4
*VR_D ˦ZԲ>EKgjỦ,Ba cA
X0Z<{Y%R8"b3h[EvNpvoL'US;ԛQ<w$xh8M5ry~Ѳ$:p$ʠ~}m+?VȆ)W˽7{6,xepovl@زjCoVCZYcTgX]	FuBn4Gnro֘ϰ
mc-74Wl9=0` +q
[vzvoS^c3`3`ȍ70q$֭Tos9b[L̰Yy\'kߺYGJY8UvɾiJKC<0ZH{㕉?i:GSKKF-44>
?^okp^EXC=feD3vI_`UD1&G~tIq]Sq|fΪyCh;#?(_/߼QAI*pǐe+a1:w4өk$,}->dy$:dEFW8BP$W/+b<"?ZYV:α\6>SǽUP.Z5QYEi~k*?!P,rA+ 7"#LȤ7;&撑T.V@{6ZF@yɧ*X	fX&XI+qb7Uè8[
ѸINGǘG	:Ǥ
=`,ãDv4fmǕmHNQ՚\RQ+
&+/bYuIۥ@-?84uHSPq΁Q -9.o ]*IVoR8OrOKCҔFcj#|ë`b_#$@ITjh>aQFTZܲ |4t:Ѩq$8S檔b.o{reB>Pg\	x2 ^"ln%t@9R|Wϝ**!!P)2 2)ۼytHZ> 1aqL|Ǉe
ofXA4|>/f#Ft:	Iv0:)>JEeu5[x5'a@%1$A	\|El~
hj;IR,69Zc7"`;1;̘zhYgqk=1xY"vr:%.\HgECK"gk1ɈVRs`l5ֲ*-S%/v2hO{QئT.V2v+ [UQ}E-F_:Bҧ%\D|k4ٜ3g`%6جMN&*={l3Vl({Uaa_0̏'[[c8ROZi#>m0U43އQsSaJmPtK,M;XnxZ<#; @xxhW5ENߕ%_g,Ix$gQ^ɮ˖("=H1~]5sa);D~2M13\[yhM;^̽@E;.ei;Ceh3^.11eُ_pi>g΋h|h`x6o|H՞>zGǏkOj1 zѳ'߯<o/jU%+!{-U}X.fx(5zGWn(ЭYXR
jc׎͸,u-?[YyO>~.cX Ź)>1婫e !4xz	IxK¤kɾ|)]9
FX)&lEl b@ԣ}MXZ!UDH*FЂEȦ//7Tl|)=K'7V8Taz89>aVr2`<("HSe;Ddݍa}.!.ui#vikNIS\|۴4yֳ Ǭ.)\BZ"+U*ٛޮFQtDO<<>1ރr/G:g'C63f	Yمm!FBx|1`˘3/ȫvk.䢉(^fHHh>vHṓ4i{$[ w ыWp	g\Q?ᓩ4ؔxY8>xkX9	*V+wI`e>[=2'ԓK
l4kϝ^pax8y\6W% uuʹt-N)QTy#UIՖY?Y^H-h<vrn.Z c"Q1%Ia[!i|zI٣z\Pc㧔D'Ӑӣ>2vPN>t}Vq-
;M6ZPT,ǯŰ0;;ddL8ћZh{Ġ6yͣZ6QVQVQmeV{Tskj{=sǘHUk
M4dN86'_]4)?6F-0]&*lrةxL9us L2?OlcD+dKanʉzU$p:sN!owW&LfSń3Xm,N*9&dO!{7TPW]si1%81ç=s8gSZgS#?A;OR=R	)Gy}c{;r~j4%G \%qIST	+MzpG8<'I,{`?|_Y%`kX4@Y?t9q-FчQj'y. JbbDb LV	0+ic硊Q<;#Zwyۭ;"qXQX{/٬.ua;!/pF@,	?SPVSEַg3l_l~5#	+t<w@n~%Ms8>P+'<Q?zdۻ͟su8<Xw w1 Td Ọ7[sv8 b;DnWkyTEGA(71` gPܣ/NAxz3)@?'ݑ.֊?9JlDYQF+щ^}Iq	`GQB9JR":m|0|qyprjZAlY.xDmK (ow9,C"g;A1Bŉ<m64;z2
2[7DzD0E 9GΪh\:Eg~Sh3dn;3<?mؚ>yi*2ZGK[⋊-|No>FeՌN^ll֕kkuT~Ӛt8K(rYKOczy,1+2FG#ч-C֒yɣ7)Bż:1U,F]VME wZOFčsS31Ͳp4W?_X+Υ ȭUG;YP1jr嶛\V+4YpvT)!ߜZ@S+oG`?	 /TWS-nʜ9T1TxqK#o;qG7#FNFNjk<w4{l_,]G7ԅ&Fq?ttIy[e^m)};lD7r
c0D#tFq5
P3sr2Z)蒐qTYV$]_j$N0`<4f/CiwI˅KbY龰b?4 K^JΪ9Ϊ ٲ:6jۀ|k\ ũlSُP8]rdɚ|R'V(\5-luN[6h`'O`I=;N㼳2"P61JH5ciR>ndmq}-6zpATQA'd0%M`]bW56}A{ڜ],Fb;(2d)Zz>X ,V  hM*adG 7OM;,RU"Bg4yiF ͚ 5sQ]"7N.Wލg;nR|QcۭFqѰ{ Ãi7xwQ|&G'U0]Z6&-SX`_[i얇+I~UTTF#Л9ALfyEgWhivřr>Ur:b/j&CTWFKaGp
	L:J9b.g	0o5fJwu FL۞Ii`?Ze/(-9l(9
mX`iV:`:L2+>3^)ش'ou
iƛ7
3;l$9~P|oqpqT^H0+DT~gs
LKk&usT-Њc}:rPԞ0'RxqFn=P|CoGp+)2
IG41 瓱X:
Gނ(a,^lѯ,YKF!V0d_(~jHw}W$a]5BQ/l}0~xH@>R:*CS/O0c߉N#aFƸR_zbݓLZGɢQe(Qtr iw'uBtBwn8[dzdDBbQYQ/OLA@{LxP!؟]T:DͲRWJ%hA7_h8hCmxB5jQ4@CaCU޵.[sch@|QUGD%%&&|re~ЯSҢw?T\ߎE]yVY0H Oq4IM0[BSb>8t1i#`#q2#f!x%C{W]
Q[I	O*+%L3~ f=vdyupRC8|-slr:. ZSV][Ys$9k	$du_\)FIsn骱CAzh&EhHer[f>Cco^Чy\O`bG,??NCv.ڦ0wa[͙WP!+:QLKs-5P5t&ECIP _s"W,փR2'_Yb!ѵ3z%\þap::tgl ݾ@`HRw"SZCDFv~#jr},g)DR j۱<tKN(lH+/W0f$͖d!QC35zh%#oG#_$ϟQ:wA:Ù)՛*&Jp,v\YRU˽W'(ϒt't7NQNSR-ɣGP0QOO8 6çޛ#$Yn4}xJ7t+=V^)HL#v!@njS/xJS#Xh6
(^t@B>m2w;f$3nƃK "f,Bfnߌ"3
c6XGG\@n&:ZޑEjHYtQ}^:Fjϡh~L\	0߇S>ƶ%f,9kFDH-sT[^:a4b1N<|'19
bY`r6Aި,^SwPtsf]ɺ=2X[Bqou4 +9Ԅ:T
 =ЌUTvG.ip:=c_wzUY?fK,GFxӮ!Z
:@U6ֻsAp,-^EѢ`(P8B8##UBp(wwPmS@Mrj5`,96J>L
";W_/r'[kR Mb 2xXpX0S[4 _K$A /Ra_@rQh?GXORq@SF[#^1/e%L Ԩ6HWLEX]4Neonm@SRzUQen=7Sɬˁi9mEYA76}Ƿ߮s[;HB"%瑕dsI*iMٞMq18W|Ⱥ>7r88Ζ
K:	ҮF`FY{O!BT"㵨Fjߔ:Q'!]	lhӟA#	L+ڎ^qȑ́fv^|;NZ5_E*znR\X!z'VS18\F;Z
S}?7q%s&FAw!R1D:_taM.U{c){ap
Œgm])ؙe5ֶʣ-H1b	"m9U轀g>DJ%1aF3sxJJ(ʑ}Q0`Vܙ9
7mgڸ%;IbݨΈ[I8sR×9BUx93.΋~j\B3@M-[golO1^5b<nҷ;8$%MD;mOsiXX[=r}#set\tl5upGGWX
[&QI8]"̒[P{1r_H[jQgߊ2U^r9nj>xo*]S'薵O,$ZW33dO궾$= ˔rC/\&Tw.YpɂIQwsӫ[W`A",v{c5ɖ{L"aIuhnYu5gSI [5*-wD+!s|`Θj!6WݸxHPgCuRs(DqGҳCؤ(8J34jnxбAx\rtdV^F;hWeAӵ^״NE)Yp\:Z~Xz'drnjVo.QJ(ZܙB&n/*+IyxH(ӥUjWIh)$*XX<}#C[Uq׿Vb+2ȫ,2|&ne_nn )Ua}dQ LCf%$Rr=@!_y[yp5n)wMGkB," 2ɂJt70h7TqZD
8LL*^o3C^9</~VO!~WVEXAΫqܖ4*CôQ!I&$?4[/<ͯEt='ig~7u:<)^~W~UU9U>-t/tm-1s¾ܤZVRp$-$mC>c,c_SdQnXxfOlp	_&i[M^VU9kh\[:2!fc0lHbwM4ƫv8W+CCk^6	x`д\۔9V/{"8F` p&glRFg}w`ȺFcngڄ0Ebp~}{}wA8{-ޥ~'tkV$du)IW;4_
cǕGN6dӔ6KJ`-ŢskutZ_;bLXѫyJ+a:ѦjCWťwSuLeWН9
<*^yBԬ5el>+OTv&d^5o3rǡZEH־FՋv~3%n"r+t*Q'c!*oð#-:!kxەP.
Zg9K>W۞\Y*sOh%O.A	As#'}tLM1{Mljdot͑-JXfTty:i@i9:NOp2s+Bcџ`zaC4,܊q|JY+԰ΘEZ0lDT1.|${e`M_.movQUacqeΪͭ=/S 7Z*m~+/>fªN#BTWG0i[&kUȥNbU<"ă:C:|5B>`$-@NaZOרr<TqT={U=PՕJyj?:^
~fPj
Mt("9Q	V)\Y MGtՆ!;oT{u4Io5rzÞ?F>_AKe:XߣN)6HtQѼ-hZ^$脎Jv  QT:NN0@w+2t`hH
PF"8@U5
B%c3!A]hUᡷMTgĵ[/aV;g5dN;=z^ ~2+h'	?Jϻ.*&W~`܏5[ȣ[n^zy77vlYފZ05Lo`e8v;(sBc%^)ڟbX| j4Z͏IHob|VfuPgna ]sLX=Tk*Q+C1z^hrP[~JOP}$`4XRZjA'Pc<8Z~
>B+8ibQkʢ	ףc!FiaTQ4ǓLכo7F߱NS\QO62;=i#ANl8}dؗT	?f)@QFrY6|<G8do F]lz{dq@ [J :A{=¥!	SxyaI*clztxUV'ßG+?zrn	k5>SD`:'/s؁ l=m1iv暡:J(ǁGv3AoS׺t3Xo^zsЄmko{w*D(ʱGm+I^DaX?Cfk#Z( YhR+eҞpqz>s+B,lXpm3Z۰kB}j+yCX2J+TG|z1Grzzj(axGh6!~5I%ǫƣڣgO(OQPF*a*Moht^rpmn֫ܪ-v 5:HDe}-_hĔ$lzW	̑DZ)*(
[
N⒝|ԌPfܔzn!Gĭ/R, ~dVxWt7rq[mxDSX{HL
QqYWZUE6R%tQDYz!ʪ`2&Px=4Jn?AƏUu p-,G\-^TKlII5<M(Sj-(gkκcC,'i0QwJU*,@B$hd`O6Va {:\RY
Z,]R:\2 Y`o^ Yy/(c|gWғZs܀lf20h ˨ghC_rQb9fdeS%˜zp;%1GQ"\'# \Z@$7o/wKrk2a7`ttj݊J?󳱑Qo
?CCwJZwMEknN]Y[A.#Fפ=wߚcFwO;:ho-Pզ	T)F6҈Dc{xիrĬW(2yջeaUt{*ItGcI<$Ei\^&4u]r8nȩasiJzuI;,t)"JC_ǬIu%㌮,)4Ӑ"YD>t;ckPp5אݪZQM0Eʋ$T*"c>$?HH*ӕRr!'15cIQ I	!6jԽL/Č~}WP?cccάf.>8aU`Iv|3v,6<i&~8m:efQ7߶;(;wpSq"&BQ7c(  ~rGbbB;a|Rõ)Н&8ߊ|=zTmXOF	mjV&aچfCqD{ n/r^Q	I,Hw Oʔ̱KY: E֏ƝQgh,dcwO*.%ǣsm$	9v[\sݑ@JOhRoHvG|?nj7U{k>L@//J-ح~1T׊
-RD>j~Cnb1Nݸٴe;@6Y+gԄ,5U&xD_y̝!gUV?լҿW-aM+{9σ&z}PySmi- cAuޅ׆SQdhG(Ӹ81G=NP>YJ{W{:")4۾*9r9dw	ݵc9(dv?pQ)1b[GtZkz<钙[W\;Ҽ6Aep`V)e.)i/%cWT5,zДb=2<{1Łe"&΃8om9G}i)3|g֘ N~w>]pt$?B{?*fRhQy1,e%f$`Oߓ;=,j4Ҝi"byR{(q Ś]'bFe9Ŭ~\b_ϧH)%0Sw[[o*s߸ӨؾY4K=8];%*ھ5kp4.֤;8,S;m^<(KΆy/}zd>)b$PCyɒ:ģi):f >Ks*TJXARb;PqU=`_YrGX?*JFRj`cLw!ⱃ3,QNaq76WI?爦m;HQш$1ȘlX!`kl,
FF3x`{aZ3t競BM&Pڍ~NNNRS̹sKX9ttńkӧ0:-X~QB)L3W9F`#ot3fb:+;vBtb$, V+&QSWfWeY9KOǡ-l{<o$tFD㣀FCY$)bl࿙#`ԡ}p)$(*Ӡ8O8E`Z#usnvK=b,nen%`4N@z]Erx#}|a-QܲfLQwS6uH.HmwfDAcL\]
\M>^gg$H+`ivuiqې-hGC?Dv7!3{J=X!g\kINsE@?ux;E\xVSFsK5V'O ԧ=iA{ǣh2ZRAϸ.NHF} "5&ckgJ̲e^3gGZv)o_w&BIq
2Ǒ~O77(uqRQ $hS/rܡϗqCsT2G稢=4Ѧo_qX.0anۍ&$k|22[;u?"bc]ff<AL-1Wx?Y'Jտ玥;<WN;{SsڿY+#JcQZr>o.yd	Rv+GJޞiy,mq:G46͑Efi j6ͦ^@E?x ۙɠg+`EW%NwHwɚz>QwcwZZ=MÀ%`Ɔ_E{K7h=?qC]Wo%{cCT#Ul\j_3<%cu;œ{W'Z3̕Ysf:gNݗPڙ,t{zpg=YK(2E8eJoJϢND@{d!A%,/Yލ8*8Z.=5煘$is4n#GE^ZF!J܃5k5	|rsm=Zڛ<Mi`S[EXOSP ODJ]AZFh
s@"^]s#2ObT~P5rS$vˤ7dMr&*$?M7W4p)mL|jcY=S%Y( @9z2	S]W~={F*>{Vݳg{lnzCA-|?aSjg̱Xlln4H& $ٳJ2'ʿA29$M2="&OoF2^d>/"O !|jJuqV^>۽-&6lfQΧ_r>|7O磜O礜O@9fRΧrcHymnA>	ǔe>	l.jMj+KG#V&-lrMVB_^x÷AaP^77KD5>`ڞ
PXjt*$QW-w)lsA(KT>c-l,-95#r1A;vVִ^Q
í5bƁ~(/41`-r+qZz|GAE=K<dp%H`Fn"N6f-Ӛ'Պ^Bx"L{lZ\j~jkmubLzؾ!ٞO6*7DU5
'd_ALcT dI+PU*Fq Î:lX)	MaMd):`!lIm~9=/a3QOH̵MXJ%/>[aΖ8%կg9VT=nz{tSDqN3i!a a:B^fCf#45墕dHP 	g7ˎncV!FA9[+c$检?)}Gm;noU/9c[VM8N;Y(T+Hƨ\E:Y(Aj#V"qAms%㌴AFUWڃS,JF(Fc n	αE;fHIE<:K n4קc2&'&Q;^EkMv%,1CɓGnAi!E;ʱ(7-[#<ꭞD<(E]m9 :hAp&3̵^>n6=H&N;DJ~_^.?PjjVzF3t)߫w|fEX5Wʙ@ڨPe:iOhhMV "J7D7TH.3K3C 6bbh&zFSD6pu	NѹD'  |a4
T@	0}\ <;0b⎁e]	ք~_,(u,	 (^GZ~gjsU#bľ5GzbR8삱Vch\w\A	_Ω.c	`Z aeU=Iix(U(ي~[:ǁp:&?Mx1B8\:zbB9dU[bvqWVql" qShXOoFa :{OW`T1
'VjK}ۃqYѪm8jD&# !;ÖJdwK9VJ	%cP4(@3 d䷈ ţ*c7$D*O ݉7%xB^p%;Z0ݨ} ,Y:y3Pe_	49h~؃DT*>XS{yh"_Cb^,7bq		B͉8`<rMq푃I6d>Q7nb(d@_Y }?[ kLI<Nb cpduIgˍā7Hw9ug%&AԸ?t L[;;1<;:Ks[>#T`x-"Rtc`$=ڌOQ܌
?Ze)"~'Uȑ;cdџUÁׁ?#Fu,t
/NS>
`ĢHWkc\!'Jc?(Z}'18ƪp))$vT~f}ev+5Z=$ꝯ
)VtW^m'"|-h'Hg_jy W.uFhc/2)(8Ewh1ι4ylB<)ɱ2̫V{7AάfP҂$zjwsnaO͵SZ.ibYkxK
|J}U/,J¯ݳqѠpe_NR|o yo(\,?~b>oͽN}>x iiDà6E%dV.z)1*Z!ŽvlX2!aq>$"t{^ȟ_;ɤomK [&Sv&,)QZSdN#V fKjTzmlb9|4vpΣ~.rE Q9>[YyO>~.OPetOl0~;`Xs	QmQ5yFE?HNMl<zMͮ E7jGO>YyuJ{@P	avGcZd	^Uڇ+]>7y`T1}sW~r-(sny4$u&07yIuKV'OMdٍ)Y*zݥ>Ϸ9ut_^q;{(Wܓ:0u\7'YT6Xf3j<G{$ɟ<ZH>R8^H9.鲝>+?h̔r.;?BTL8}nˏd1&[׍ؓ0؟˞9{"|!LLk}s`v3vu_*Kpg$<d"89Y11"]	"ZՠQ#gFAGtw%
}@&äF>߂|N2{>W~6nsWVoY=Qdwm?êjYT5\ܓyHJNŗ/{B3X<3B]媓hT)EwudQ|NLݡeӥ\+ר36.C|B+oIZ]e(XK4I3/38ՐXEv;i"lg-l.^D)6dɎ!9u>IlY*ӕ3Ec؏ 	*)֌iH|K!L/Č~}WP?spf5sBUp(6M#Ivuq-F9v,6<i&~8'͢p	o6-#݄peJu/[Q0wYg1뉐fvd'侑-&&S+(5\isQ<wsNw,x5źZ@]#^ތOHbH;"} *njm)c-NxpS|gֵqg}aT, T* $'3|݀|cebs؅^+a !48;ZzCb-D_F1sV2?;SEhfg	c^!ca"
 _[r#쐸2jaEIł?.Ԅ,5U&2D_\ܛ;GNVtw!2qE~>.}\qCx7ӹE<펄~>.}\qE~>.wt>.}\qEEE~>.}\qE~=}\qEB\tbCm&>Aktд3fC[M$'Zg)pdlAp>kk^Y0FaSxza  8;_d*щG7ŐАskNm*lWB\rPx(I$mJT,TotĦ35[(uZtu^<KJ&VDYSs\w;h$Qy5uNTwhsp'ٍ)N40gf#JXsS`6ɐ
s4Tt;oKGYu[HF]j<v=F9PQ(iWyZI=_`!AS5Ժ~?/	1ft6<AN"Uʗpp6mrv0Z:CX%wBRgABY")t(2],ǅõ5]KH2L"ovX+:;֟Xq%k*Ad2e7֨Z4k7X8cÏ.OkM'=k4%G2u0}ֺ\Pρ1z>~cߴ\Pj	xM9[ 
zejBx!Gmt6`a(VFu$9
?,iİQyQFyn̚kͬ!]tKz9|wQ2qxezjY0=!Ħ.c)k7QtBP?R5NG%&z±ck!I{	(mO]o61DUlm[/4.\\g:ѣgNp[DA+--!_cQpQͶּ;\l
!T N$B4.Rw_>T[9IpuX10V	XTŰD5P;u_wB*ҰCm,9E-3UsJs7QcGӸ4\&NCAAYPۃO(`p9ZRt,G-I\XHD*yr:he2w'K)fLN>^.j$]נֿX|*-Rk6s mO[cmjf]=]Ŗ#yA]<BXi2Fg|#-lU%uʚ\8U0ĎC=Me4'P1B֣%4ᣖW[>=qȏeezQB+[ lW1s]kFJVF(fduIմݲv-";M3CqIUKPB'JqmLRReg/V>zԏ9+6zfzp3t2%,I*YkM;e,*H:Wr Ķ"v{QO%	_R2V8#ϯ'B}J0Z9Envr	gs,j^4JcU/(ti:nZ_a[j˥ŕ?jE:2^wQ#vC@۩TFk˩)o݁LYsi3{:w$Z0*гvKA	L?-$dl?)½VD6*ahfa+32t!KwNɪZT]%.Sb=4YmfHp9ro-n#4wHdHugGdCh>r"8	7gEhE0,F9_lFM9\hz,/ʵ^N߈OyJeƿ	eVܽ2nf]Єv{K7?eغA_}Q4Ϊ
b!I#H5$tQZma[<=r&%udv9([<֕V)[>ek.FEƅsN_Òd#Zp%[_-ٺ_|UƄ4"foΠlšl,VGٺ&s9ҙIyqs&ZSyS`T^8ʋYʋlF=rFsʋaT^Ϩ"Qyq%FEbx2*/ʋR,kM_Kyq5.UVnKy1R^KI\fPnG2i=ƕ˨7U>L0hwHtXatաI+SV03	꽶iC/K	Ԕi`Xh<	5ppoдd(u=Shm`ʥrJȧPn4ǁ[a#E<Mpٍ[zT1A[˵ǅCvSc4ЅެUQ&Bo4U~Ԗ 7~JFQIq`SLbo-zL]?0xUZAoMr<HԪaHԜǚWkޝͺ#Yhs96k1BP%`7(@gwRܶ)k%^72ΑjO@$H!	fK
Knu:%|9D
xY8 ˕vsol5Uwҭ شIw;ьÔ9)s E^.K+.KZi_9.3PdjОÂZC"Mw#ЯB[|+Q[@$r1B 䬅#ؗ31)N\}Sҩ8$r3!Yk:<!
הV6Ƹ@:_l`?;?k0f,hOSE;Wk9La,$l^ZewX@5y)*>;7#Wx#fπL3IdJEhK1^I	bS$d241 .L]
0.e.mnXZϼU,egp=xՂwTi? grf6{sOg}etj8X1f/^1Ր|~u}iWe6M:HMk̛~_ɪ9AbŪP:X	jЗsq9Cp^a^~#Pto"r2:NLZGΒf'p(JqbVQ;<I.Xd!0z:NOh0bۈܘڟ>_0c:j?VVTyN<qo	j|"mG."x;"܆Ņǯ,Wv#LDXϽ)+yv\ił>LDrH2"?(YoK s\ȺFc,mj0+2|99nU͕3w. T(Ns iʐӼ,ze-/
fOhS4:9<g,y$찥^x79fnqgќPbSlma,{["6@!+Mb7Ϸ_,\Q{Y{NKZr2ku.6U#9tFlP?ǤS@aK>tNpUTT2UíZq9Ё?к*\L:%G O;٘'Y-ё6@tH|l&q5EVy۳[v7S7pxu66I	/7!w9Cw4ЁI	JN3|odn,!D@EkAJB+L)Nz^QilzAZ"13/jQW{y:Pct;u`뮄S@]YΡHrG6|KC'Q/̵meLj2%ߥ?b%|`J">,%xS_fJrD]8WfX^Rp,rop9<4,}+[tlϘ:"ႍ\#79)>ʋ^RP	ׯT9mp
,=l=d|F-0` X ^0JəBT`]Anj_kq]ҍ%"v"|7xrYuyL+v^7yiIfNo'BV~l2̽;l,`Y?^08HDءv݄[l;/7:P귛 YE]}Ʀgw[ȍQ>a|fI`<OdHZ>su{簬v}^%QL(.[tн:: .GNGj&Z=!/00(3#<<9NW<ZHX@HD#	9+ӧkJP QunČ[KW?OFm{d̀X] SƵmsKMSŇ:$ӧ50@OOqb/֬޵ΏOxhǭFuΪ"EF2>1cgF
zۿ(XBk`@x Gc?$M7G(W0ȑ{Bn!u)$
un&8Y	L#ysEݍpm>0ⅈ#'(Ä]HBGrPÞ?sw?ZUOkVb8P+T߽)Z Ƅ>gUR)9_wQ,,مFڛ>=Ȯrve"P30}6p3>ꌭ5C؞zdʹG1>s|錂(j S8{)" h;5"IçO^21߀.t?"vw&vKT5iQkPjKΏ'V@&V%+:^_D)8)`<~)a+;>$^5 EUV>N ڿޔv]r&>FU=:vzxha]h<Y=zDz-
fӬE/מ=yjAXk^@6vp Uu ((|3LEtz@gRF铑&ċ_SAXjA|PӰG=ñoڐ#sP.ӎGlo !99Q8r&Geҥ;k,'g)`k*U*CX{XY4ɖW-/[#(VzGɩƾLdj:v5O8

,5Rô.{^?POj.Cנchf+Nxv VK YlސZc+1v,}|{Q	9 O;Dtm/1SXW_qw컫3#S"+^=='|l=JN؂b=鷜&JPӋsVŽ=9/w4'(`Dc8A5*8LWLO^G~yDvֳѠX {4F|;S̡q=_QeمsouY=#yj5㖉v7bKaLI7#'H_Qc8S*W)@K4cٛ5k1Ƶ9pAe5Bw#G}%⣧^C[(8XR<j3MI+)*̦(rl
.zApTR8{h$kWsOޫzĽc_oԟ,kGZDU;(ѣuk)(s*}@@9zۢ>O4ݗHSFm&WLE\1Qs,"aM$0\<F=7xčz^:ˏOm_^쿑/$Z悮-A?ͿYѼ"^2)

i,uR ҜE0ubZvOV.d:Z"XfKnfGp*|WL<
ҒasЩ!N(O4^ݳWd2W|=_w|{bx2`mPZƭ W/kDѨG*5Tr`>.fmYyB+SDɷN0fmP$(#)r܌2.vwm%%mOˮzd ZrۅϮ@Syoݤ<x FA/{sv4^&).z<*X9kv9v2sRp	] 7m89'{$jD̊kdZea$mHWv7&W(ill(bg>^HO{lJi¨kˎeu&*%cOuWճwj݂b@Tɖo8׽aǃ<]QͧFk06_r4;IDŌK([xܚY,@==Jf%f$K,iϲ*-V%a*bZᚊi&\dp1ٞ2]BVm63'~kr-(ht lugw)=!cĞM""!E!jFsfKOozkqQ c߆®΂+Z  nW	>𦪀ʣBJHt0k$걬OߒJ"'
XƤiEP8lS+~Ջ`2p+i6=ѹ4PpbbD<Qp}DiY^yaoA;Һywε9`UT'E	:,fPF~n1HnH_2ւvtK߻DKT[8iR݂xiQ={*#u|.z"QKkmkzͣ?0_|Y}|+ xԥI7BNfxVWEJ$<&)'>\zwm%;+ZGkJt2qB(qA~͝SOJ'q'#R*i%4*X5@:t /Nw0<W
Km2@uE$ d5/qH3?D%Q` QY_Uoom2YP.O@0
}>h1AGeSH \4|AT>|dRa YUX0(~Y~8[PN-#\0Q@d׈CilnON/؍X|t}~EgjE/lk6?1zkReX6yk877SBq
vaF+R2A'brC5(d}RD1Z(˓֥sF	ZEZeEX:HޑZcU)Ǩ;{-T*% `=rrw?NU'YmxE/5%B䑣H{EL עrvi^ezbmzȱkW]Xd8Kl(VX?_b%f|JB?wn,7<ݴ[,Ue2O+StG4
ZBlo(6(L1mΨVΖzrzr4*>1_n_]BK]So@0bPzwNR҇CK4JEv6Õ/U"I
(8 ~QJ`cd@hnuc* ufXCEAETӴafU:VvNwW##<y6^9a䶎5t3MϹ(>Ҕ㐜a98"h:(-VyE[/;s_vc4e-¨#}||,!69r&)aQI]G0E!h&B8A^Ol^YeԯN|<K,Cѥ}I[sN]?4/xݙ1DJNܴAvYV;r2.Fa4[(dHajKD[]hH*YWN55g49qS Ldb':	x5͔)l׹Lt}=om7΋'?w>woh|0yޝVB\Tm,V*b5jT7jqn}w[>k	zX3c۟y[	SGڽފ2J;;;)!e{
o8׽{
6<]cͧF
֨*8x2Lne-g<n@==Z>~I"XZZgI\^݊^=X.2[%Tm%e8p]Nw[Xp[]# Vϯ5I yQVėk]ҴJeƧ!R0\B!TXrv9&an[?4F(`,B;~U.CCv\1]ԉv迢5v]L6;?>7˚4}<'[ J;[$&ZFj;^ui ))^L3KъՉˀX$cVM@E./wg6ww,^&Wos4SNмno*\
"e9N7E/\5cUHͤcqzƷC4'w8=Ju=whū1Y'[ c1M?$-s\>q]!	?&y9F͏DX|b{gK&efQc(<nT9QeTj\h+H:IyCZDmH4Gx25c-&stm0n.fD"w}DSWi-p1hqlu&~j IT]b7?Y@3dTA˪tHJ᯷SNM5NvnC 5TjyqF{`T_j|= !1("YHr5&(PQ7Ľ%!qsg1)V]oR˯RCa`o6/}[?(;uf操f5[2jB˔rC/\&Tw.Ypk4u7=J;H%,-9r!6Bp0,8eؤ(2~+%VC<1[緰0?Mmַ3SN9|L&.wzjQM챸5yr>~}%6Y]$Zb,VȘә忞ep˺.__̠1;t=<	`f0F}w+ȇ\V8Pa]#omi)5)o1s7~c!Cw z=):m#] 88YٌAf׍ْ\>+R*U#Odd^4QfxvTXMb\w.팼0~?r:6L:rN#S>S760XFitqH$H =0%0cuuhh6.(DL?Uy(1N:|AmW5WvYNW006Λ]l^v׺'2AĮ"`jϞ#y0$91μ8(	HH(EȀ?jGﭞ&}up`z^r}|?z𡀠{H)[_uz>R(ԣBYIxiEIiq]4A\tʾ?M?.4/c`~lN/vhޓ2G\\tr?+ʶC Y1J6e&LT [)3Q ݶ2[ 6K4D*}{r+_cC <_l2g}=nJVà$?]Wx$jw/1 7ސ9x2ʘ&9ə9\HHǶTcK%_mԪBHn|SĪoGl2V tk]qA<	Ï\fxTqy.{=W
c5ik62 \- /R в`h|XUOi@8@&DZ/G' ^PHA~i=uF]d7Zb+ -+i!Oe`1/AKn*A0 CvBM-sap4<]Z,^Yyo)WI	Qw݆3g4<3xƭJ3ļ}Q0D1>6 J83	!$gPكW$#+x3T{;/PlEEI!}T00{9$3U8k|^^5.
GL0Towr(ȋgF4.IPMv\^oǍ:g43G61R-)D~[Ygbߨ: n4V
uǁ9 %]EŖ\eG/jII2p/suR9qe;O`dD@0kj/^nZ_hb_
Ytly]gt_c=)a܌>?	zxfrW}B:XU\"aW0e.@u Ji#յJiq؅+U
ڭP9MP}dVUs4uǋhȭ6rEDMh1_RL98 Dg:F w]EKED4 MVh'*5T?Zըכ[/i G?|hKT"ǢJF bCXl+r_ KƗ/QG}ZOt0%BىxHEuOLaLx`Z0EYQUCc1?4+Y$晐y!uAE:3Рy*vA%~(JvrbP 1X`zVKJ<^16;M47X袩5M",S` ,G\fr>tpͣT ieۆ>_du+@@gz/9kl3\\t/xB=Y QU5z v ϳu3у>2bZ-Y%\r5uTy'B'8R9 ˄f/jh4xJr}	3F(}mw29v)@ mKFm$'DG<L&WܾWȚG	1zG;QF?&=I?(+ev!d4f#ws	qOb!s\?ZCl儙J(+˗8KHE_mla6օjsg(1
فD*GQ&k"2"aLaYX4Rn W} gwNf[O%Q;S;zS!Vn7ؓK댂i_|C\haUCa"d2C~W"nc^f+p pCIrd	
dlɤ51P20aJrHF=s˽WMh;<4c-Pu3ݞ)YŒ=;5w1Brc(Ci޻Xn3HyD]pZ#Kd#!/Cݽ_v/5[c
pH$ZjCRH.Z-c0ZE㾕*I|ǿY_=#b?WyX/ l6M掅4L_.lQ؁=mFh֣Ϛ#k|S0o V9؈pޕI1;G.?40\] 8%Ho^aCӷ٧~f1?XdFD/|69{J._:#1xbmQIhqhѰ9K)Yp/QoӚX1
N6`xA( ya,xĞ';M
iyتvh	Q0Z%:4ZfYEX)9 s%d(%zgRJIЂvHV4([ĒykkTIlB&D\ns&Iu_
௩6!K0㉸5%uRby<t$(M\^B=>%u;9 DV.F؛Mڗ9g@5S˵?3w'nyzΦڵM&㽹Zon^MG1=IԜ=0?0'F+@;Oi-\W[}jkOh6Ki?g;V6D`ʁy8GQ0zM`QxCmQjpuPO5"V=3O!ѻv{Īg+;zxVq!NվOx3c8P~LroǙfjiM(qeu֤[ynJvzs9&vm='[t8|1+@kMzVG㩴PwkK	|~8'*j!"I0J\"b\bKҕF!~oODj,u8u;&]^ry7"&sBLJUr{9)}S)UfME~Go7`a+@)!Ybq͌th;V[QG=srAHK0Yr|VOP\*5:HNvh6EBIGQ	̩Gm(Wt)ejwu(eb'Xh|0^%L&mn=0kQd'L6Yp."pc帰@Фd"HR	I^5_8|2R;,z+GQ< TxPzh7%/d<\ss`i<:bio	o;vbζ?ys%ZMhJ,r?߯z
^71<1Ek5qXPlD4CV`X*ys,Oȉ|쌂@GJSy}h2TϖyX_?jeKPRC; ÑF}";;fx"T\fz8 n1NOe\bSdږamk$8@A#>0e7MEoBP=7{ͅda+\&E9N; |C(Ё9΃^Es4 ҇+M |	0;;Jj'69pآ\L ȄMD:4_MkknN k(NM2eJ4`L]~֢ÖcYvjcan*Aa{Qg;O.aI00ܒ)$lh$
n//;S|j5)ks^O~MEnz!?4:/1ۆ*9+S)bO~e m)X7*Z d cIؕw=8=\M%2-G}JvԼ3}j
[UQ9`YCF&DR&b
@m_qRXZ,΀Q&0ɾ+l2Y_ĹB-f%2S5f]Va*[!q)ee>é؆ tTܐ_fñ4	F*BB擹K\SٓGtob	Ԟ-Cشt~9zDH+%ʼ*w[UO_o?hRy^/K'G=Yޛ{LxSmo~ZOyT'xTw'ezt5?.}Os5bgw"RLF!3\ 'zN½C`CL⢭1E2Ĝ}mR|O:,;?}L(ieH$hGKOM2>ΑY
MQxG VpWTiBuLO7k%0LuBfQE,ӕ4Fa]:.'nV]	7`6A*V{><kL.kȝ.o8j(M]cڱv&MKC=}Jx&QK.Щ:KbC뿃eWfGxOR]>&(VrG[A{;KG_mmn>Ā2T7y[oOA;Hc{31ۋF,jt멕^FɮO6ָ4D{e=whqJӳ["c.Nz!F{2Z6g%w\q;o'F@wu~{;YC]$fPD˽8t͍-/wM/1O%2Ju]tP<NIx;yWtyQ^f8[!S6Mnjr\Ζ󞯽Ji-c	_I6ZtWw[Ҡݝ3+cz_gwjM5`woEuw_:X8cRneڄN%knŝNQwsӫ`A",vgqCܛ$,R߽WşݵKڤ(:1Oɣb|aЦO\ai]tsSKɣ6F0zSYaxgb)͝%!te0w%dq$K,i&YK%_K1؊vaacXi6D*\/ca8js&^n!?C^qXfcST码{A۝mtvgKv>Oܥ} I=оwqt.y/yOQ8?"iU`A8(\m+9V36S>4q9֣=`c>ԉ:a(m_m-ncC߄ǹrC5rnʿW(5w	kbA0BDA'xB8$]/<fn9d&Q43(7D`$\o{)]<nTM4mtڍ A1OMZw5]ղ
S4@ˏ("K:)}@(f.Sxsq/`
ofw{@D6 72h,)9DM)wp[`
3)ypr>fL98l䊌J$.iR:	ߝ:uR5Wf2/i]Zg%ZAc_aflqƥn"c@2u`
Ai79=ȍh$Pnٞ mGiV{	:ouꙝ5n	bVeC$9Gf4t/Up5UiL4ŇؘNLgU:,Z[kό6ZTFR[O+_
卻u	u3hzU/V>-LMO]<򧽲yz
Z!xDYl4[|
JEBqL"h2r1xoirݿb`H}Op%]Wf8(9|{p셓OJL}~fgW[{/P|b)GKOJe/$rL!9VE~2+N)ܼfG:Z8uU!&EMkeVY1cT/fy>"b<,d@)xY2_!`>
3bWK,MӐJ빚)]nT@OǁDţگ{w7, )Ս:))&-?"IUv n\DR=c ,Z-ӓn#,Vǫ{
>q[t4C~!Uh.8(7VW	A}sY8ש|J e/{xdb	5?˯-,QV$P7r
JBT]qP5Z#sZhi@iP UTZ4="RfJ$* O83pouOnc?%lzO{G":vڈ,r'9HZI;F4S#F>F.`rj\ZD%jhٌ~ܯĽ&euط\1H뫾7m
'Ki̄Ag҇$Ga`s>5r9ڽNkP9'5<eOw<)!D#?c͝?gvDb*S@7QV$Xˇ+SG'>Fњ\ 3a=//2xqnG`R'p;{*H	LN:~#̬
Qc Bn'5$OBKbI_`?2&eTH!B>YɄEr&`iE,nk6P2o4iI~Fs+!~m)%x",,{_G?WJXl`,pp]4֒FHb;oUwOE7=9F3շ| .Pm-$".؀1k}pCjt@D.pXnh&lS[~dŅ4ĊgMb6)Mr>1I07h^5~bforXzY˼ެ{d=(tנx[d f-ٝŮQdp9v,aB)4>G6I1<pKnd{*\AKu=3pIo=Mu}1q4s9&By$*102
%XGQ'&X>$+³[0xK_O[i[X@=V=nW<?sՠqƓG@3~~0AD0zDuU&ڥ9-1 
U[ç}
]u>JFbKSQ/My	X !pc*.`d/Wb'XީQ~1@*e6
"M'K1pI<舋p ؔ?;L032טF{
Q0+=1luBfh@:tS+N~_Vaop+`'YT*֟㡖T9'JǌO'{hetWO'/-L62--ȝ\VhnC]o~o%]'cY^wOHŞoe )ܿKXI6A}qr$cVcK;{H֪I]KA}3 $Aׇn<?!m$1tb\AQ|/wDC폲}tb$ӈX.pMkWY=]\,2Q6%nȥܹſ8DS=$ؘ Vf'Tի0u(g)uXa[jJb.7MËKKdB_$r9&NԹZa{[yՏ{rt
CFa4tno3)$ͦK#O<poܠSnGJԨ141W-PـEpVH&/̔{$K"4^kscyM*h4z~m_5ћ
DoZC"wn'Bp&+FD\iN˪2=oݸ̡{]WWިJ7<YM֜< #lyÎ/]ӱ7e'n3ۘCvl0,5&F/lj6iӾ@W	HRemiaFYGU^,VpҿP;Y@jC0KrAeE_bczHҴ Tabg$u|nbO׿jI7ʊY26"	 #XC+~XbQ~=4,b!fpkF0N|-F"VK_Ju 04S2]\٘=>$@ Qb'SfBaځ%Z0d>j!|Ans	fD1Yqdq&qL]~ת|0eYwo+2gmey+E'ު4:iM]8sD$ZmDia2?̥=|!әγe_8#78ێe#gg3t>/m }7~m08603Xkr~V,l)E~/
|ۆW8R)Cbwz㜘e=R0i~XF%*+k1>zemk+L@r/ЋZV臂N8x6_'ʄnc=TK0?lXZOޫIx@.Fm:0G{@mk%mK.\ploWrS{?e}̬A5\@xV7 (ڹZy\Szc5--i1HA s}5m.}5CsuA:4X'󟶎"Я,KãOg[/OM߰9MȂzL.I^ee-HK.98n,H`)gW:׵XPW)T[ZyPmUܝvPjgIW\}őzP>C},*1řӰCY+ng~5gj 16e:ffc޻fS4Lmʯ>-_SӟpҕyHcsFbP(ö<ɽ̔)4ToD5c1ښGG̴K0jq$s 6D!6~Aag1|,>Kk$ڀ{Ed6.e_[qP?ǟ*oG>K	p@ÆCP/;\U{ͷ!uރ5n(enf`>2ֱ.U0PpNFq޵=ge bbZJ4ЗE+HZkra#اf"~V6)$@m)_ԛ3]v+}T(Q<C%&_i  Vy;_	eap9
_8o3],ODa#DߖI9wScZYgK8E*vrnH'PtL$Qm+A61H-Mhl6=J|v>"cad;s1Wl/\w~I)&Q @߄ r_+=d|1Rf;OTV's`'Yk!uf[ms'fDY.j@fFG`+Rk,*0Sx^D=dq9AP1H&ۢ?:`nBu9͔%ٌnB; ghloF2!fs",j O
q==X:gmg>d^`MX4BaC\xUYr/Sc@]"֑ ^{+<d)~k`=Z-VfKg?lؖޣrtwfQ}ZQAyxaG^<鿏̦ltbֺ/|ko҄\P!8p]@i%0je@26u8`CӱmBbcPH.K
.ґ
AL^8zH/LF3@Cr]FB)cET[`Kr76.;
쉈}utx|ZLoR0a'ĉ0ca*`6D`hhI`--"fY^b3aXx$)ؕ~;?X<_le05aL7Jt[kj_<*m/_I||]aOx|MB<?Q)7%@*iDq~[yضӅ`V&2~"tz0єkr[|A*K#^Cf	B8[ND$ Wz0<M]Ngº0u(>]lOG-$#O&@=k}!@bc2ei}(aʯ=`RJlk\qe%9z & tucሁ4;8uL7 `iC'Z_IN:=H)ŜQ́:ZHwwg>Qb_Є{*Ch~oǌ%h d̑qOՋ]ņZ{aVn,טx	ܕ.㋟H)mӣJnCI))?vwgYT[a?x=Ԭ)W*NFb9vy&-	A;LV[{x	I,hi+l}#rYkFɝ37$Fg<̴YOQŗ?Cw<>vq%ZNˉ&^j#[ V"ط+ak|҄Aм&j70;7yxȄTÞ4<7z	'	]$*Z]XKE]|Н(zۓVx۞0 ;ho.ϱMq|{ۑI^[rd$FheP3;AfD	[RY~.eP`˃0}\w\tgY3|&fq0$Pi!hy.WRyUX?ę#zyNlq^Z!ȧgVkIki'}]䟦#@ӿQw#7L{?~3=}^Z5ZY+6 O;#ͧWy٦ݜ)Ob|wglr26nv%]W߾d|KjCpZQ/>4@LsLQ3Y02g,Wk'':N߶z\sEu<ެ7fZb@&SYlBVJvƟ9Ky⡡_AdV	pfx3p}x򬺖E"ZU] s,_{5G=O&n.|1	᩹ |4eIctmgc35=ّs{+1m<bSJY0zkBqf.;>OAޫ?wIvj_8&pXЏz6?{bߜ=D2zT{z#s5GCDf.3Jekټ!W` ,3]攘+aOy/Z^}b/\l֥\dZܢGFQ
kG3%ѧӶ=F[֌ڳ\bS'/鋅/	mmsQ5gFD$t1[Nca+S$DqO	_w$x}v {=W8"t\BLbtO,ȸP,36p:oƸNg3Sá3fo<bs8ĽSEIʒcM[mW:Lõ(Ge=}TA]|`2uZ=xIfsuFߵyM&Vә	5GDS;r`Μi7䓪|:I4L`V,j/}`+O)sF>$lت)33ߗ㚋:lɂ6QO9g&dْE-r<7Lfۼ-5zp*6z4'|N E.ߦ@>(-B,~WBpVް͑%[SbVV"Mw.^DJ%#+M.,ra_Xa-,XP"Y~I>NCp.r6mNtDƓ=Fe:&MPh8M
Ѕ`͛}P/&W(L`|;+{+`c@"FU'1r]۾#nF`1=MSα:>;xE	c9~*r\Řtr观)<P1j6盾2n|"IZ
;ˑXt0Pi9/Mbƨ'V-ܤ!n(kr5Tξs
-
Qկ[ҭn{^W_[tZ, >BTk %ge5v߷BXU3BK845eflxaW83&v}{^Q%ش1{B=l]S3>4tuɨINgb'Zhʡ-0"U@mٺEm\~:Z^/뉣a|pşgE0}2(C95&=&<:I!ǃsWukuN^/r .;
%	!10>ųE!GWc"އJRƌQ4ΐJϛsۯ|'XHZE)1")o>{vOwƳ{;oԟ\,Of-K2M۬%BF.yˈ۪aWL![ ,E$-Q4N٦CcWD{±ز-%~NRQIâz=)z5oL:.B(eWqsiX'{m;X<RYoY#ߏL'O{"5q_yz#l3K,	|&PϜ̓\8i4X/G]!_ .6[P'0p=UFx:T6-5t;Xj_ؔWA߯nтá(N-He%s6'iֵJv\Sݭl¢|a#}.6D`5$aZ_uMv/SCs|@bY[OהHspn22m3CiS1DyP#D?8R!\="3v=e7̑}1Ɩ.~Va" 9BjduF^Yx%ކD9%%S[s<bGRZuz۝\7a{	^sht(SfY2[nN6鏦xKQgx꽋 y:T;%D:Dn7/pxRge'	LT]p GD K̢2!
h4ՐD׆3kWI:cR;!bq|FmlQ.XTT<2V:e\֟fz6]k[nTrȲIzW~o܀֧HXbFV4ƈ^bIіI5'L-2GW>MLh͏w}bwuzX@-m`/EvfJ>ZOdiRZ*=Vjzo+URIY' kByA{ _*LN,aid	>pR#x##'V=:.EG˩S:UflH\ Z)Uj);K%fW}}XJgt%gS.$V%zKO6OVDd|2L/x-b8u1*s"|3Gŭ<D)W"AInhPj1}/*Q)Yꔛv8RDzz#m\#XC$pT@r8#я倫3qř':xBdO7GWZ]_OH=Bp<g[h5iO'{x=1ߵAfuc>k{x Af+FTr|A'LaTf͎Xa	CME𰐩uuu$O+o>Q_;mm ,OV͘T|-|]M2I8
zAEO]L^ TmOe(chӌ*!'X<))I e\omC}ÄpPf;6<9K*;zg&FP+᣽)5bOwyT~%6̨/WkjgtVOFh􆟢_ ENpPXz׍72U·gWPe*+F"/i:7tȤݠOɊ|!~2N%aҽKX-2o6_3Z@08:ߊBhͯ%]fL%D<liRe3{<_	^/ S/_K*#_u4/0]Z݊C*邡d1)bnJ[>Lb^l;3+_1[Ey9P<g\Sۈ(Gma@dYLx5o2JK.ӓ"r^uAQnlGlhgdx"*
؈zrthWu33 ɦ7c5@߽^{xjkqD?!?+QrZiTE.72=yB^bYگier~腉yfm`ajVy]<I@OGYRY̌ Ky}TWfig.{bލL؇%H|iSnGvӢDIAJO&7Y=siA258Tf=_1_ZY[w-|3k-k:Ėf4DrcVvn0QpԕS-u1.oo	8ka~NЍN돟ҡ}Ckܛ<6CB7O=ۖC,0Nԋz3KgJNDfV-
b2]d%Whacv_kh'U}E?Y_{H=Pk}_VϒR&EG>ˇƇ|Z#
?X>Le̩Ǜ)2dD1=V!7$j1lF=kl瑸*񝌅Nossa1	T.E%f>FpY'd\
;U~:I"c[i- |楔pQ_*u9PtKK3(UƩn@s=l|1*W%]@zGqQ}tA.{Z$`GU5t=|YJKQE!B8ܶcxm$ʡ`g4kDo_xųgM 6pmy&<;<V+-M
628n:oLvEvDWnv}{!7=HFXͯݷՀXX
NkaB:-m-"k@gҒTMc7g?|*>/BGsܟTQ$-GUB#zxUIq#ɼqc_}2fc`Vv}6")):jeS}ܜ]\v_w.mj 1ή2]X6M+;96@ɣd&;&nĆ;i*jOdژm;B	a}]GWfᒛjaYvgKMJk[e}[ez(,W1=p9vRi4v58W5RIFIzʳ6hS'V~cLN2d߆~x;U\$	*͟H.aOz/4s$ˬWB~m$ii,I̆6IC1	Ͼ.}.jԿx-!1ƅq@a'QtdD eC\hb8<17@NPC4$jCĔ!'f/S^I1R/DjM幷cΖؘA?|VY<4wb;FdOީQ|dC@zaIĽj_^g.D}f9qw17MUń?ǗL|"Ast @ 67ꤹbtu9+ZT.g5</fBKIZ#OS\<|~yc:,r7хT/Lgrzb1{Lݸ*&^cvnPjӗ=9-*؊؅eGg"l\WmHp$6έ(J&v/#d,Kď^?}?_lfz&d4 ^ކ8w3gYh22Q"rvƌǊ/2(O%cLHMJOLk`fm,͠!"d/iGQK-ڐN$JhAvT[}p k@wR
B?/C_mr4<<b"?#~o8t"f/tnID0-AFʗiME
vy]ীl2|{]s6Ͼh֑=_~}j9m}NSRd| !V]oV{.^E4UTo[p
GІhYW`&Wl.>4%U3a f ! ~iʗ-x.Ggo_Eiq
-؍KKZW5$eD/v/&__hK<ai^|f&<Big|ȫoEyy`Ļ	9_#a~$a)Ca{ţvGcOLZLԙ	6j@O8^z>/yuP%v
b|0d\x]U$ζZwCJ}.#ؖΡʳLk_?U[k#BZF% چ*Kx"y6|
)eOmFJy^yuo	O˺%~xrJ**ϭ~gTwqo-hBRx5ɶ@;0nG66un+|7xTZ1kp߶&LbRԆ(z׏E@ZWz]k(XzmE⦠M{tmX6X	FW:wox)
cۼ+*b5vĢOE=! .H'Dƽ%pHʋ41j`_Xl3Nd%qW<oA8Vʂ,bm!-69ӂՂ@wXIBhH%)PL|2:)o<g`R悎y嵈vL&RMZg+L'6UXS7Y,;@tL+,tkQq^mKk1f%CDf$CA7ffHnf*4* (ÁjC<:%-r75bLSq) *5n98s&HX	5st\9EWucEbq!%̨@$zTY4fș#v,~,	*z@̣E"cY]T淦șK
V]QeXy/Iey`]raAYɁ~-W|pQ٠/6I &/4P@6+8uY f]=NZ'J*bި[ByҲd+S36?QҾ<SY'_p~< D{N2̏Tݲ" O6W:)JԫeafWv
Tϝ/Ȗ5ZXh')$.J'1Q+R>?mz=:QQ[dvQfPac#E^EF0]M^$JX39P%[X 0ߣ*X4r؄RCȵtI8w|vyFY&}ʻdh.رC:0
):<O\_btsĠbـbM#i;j~ڧ7zeL *ՎO3(W6Xr%={ [ HkSxFauR+
ɴHN2"d4aVmlmv" jrUW8tTJ5rpnPKI\ν`4AOn>*U^W9Ms\jf.A>ZB˪~bA?aOb¼BV5x!,L~Yk/3R23b01L%ԓGsr8
0kB8obt/'O2".?V61?NFduLw%#E^*9!]#v҆6뼅3"{+N;Sgvz`Q[­"1ř~llI\F=UEWԋ	9eS~\VX8Az]#qw%u,|q)Ӌ3nMRֽXB&[¾/뿅}-ܛqVe_%T"ҝt?rQ#=+YM<rrDQaoL`pù2v<ޕ1:/jrBXsE.H*-[i}tz]tC^5.*[đ4{IF8O(Q4Ȅ;&%~w~'[X2Hgߜ62ts|k(#-lyt ~].7҅z}Y|H؉vOuꏰm#*T5sa(.UZ샗{.|Ą70SgjT0f2]XA[gPJnG+2}7@+̮=mJM})yXx-MLmՠO㫌9,b1O8lfzW.g8h8v?Wͮ߹c)^)`1>BqֿID8bE2LMc4	e<|VD>>l_?zS~\mɘynL	ݞA!ch^MU%ߊbsؐD^
PgK*IN5AUFMrکо6
O@IӚo+nF3R*^6وlv:ﶏq.I9Bx>j7c#m7c%vD<:UH- &"/22#2Me+ʹ͹uqB0]g#IY^S8:'"9׊;NxKjVF8;v!%T*6LWuQ=Q3gAs֣lb$mj"=U7hr%(zR3X[ӿőepK<=<odz
ajwٍ@R$482*i9Gnȹ޳tB4N;].[:VU6eH*[M#8X7Z/b"
N=2Pщg'UAM&P*wqFE]}
Φv3IL4G"yD;@Og]Eo1N D	/Vlh2?%5FsIg7'-a.zdiZ}3HlN||l]Kj?_IDCDhC(洺dUx&y(4hh)I'$	150^OT,1hv	^;	K㮤 b)#w&RϾ':S/wCiVpq^(պENdeA"cގ:>Ogt`ƢS䞴s F6!LtyWѰFEjf8OGєD\Ȩʒͤ*U*q *w`4%
Ӂ?=Aa0Fj(CJ`pbԠE!9-6.1@n˽pvCӌg/<ٙaG+6E
%$xcbd'YEuA?[4I6elfH,esE4yC3NIJv]h, qj  35X!%H 6ڋ
NN)' \k]",΢8g$N\nKzIܸL!ם|c>~o#owډ>V3,wo|AkTz}ƠX'p1	zo lIEEKqP&ґqO4bm5kWmLT_%BwsL8	!cu&qeM\H*[Ǖ.ta>\锚@;!_VR$#Iǥd.=J	8}(wYϾ$-|5CÔԉMVY
SӨcP@,x˫kjkU^Rڷ#.=zao_!{WiQQsJE 6\ҍ q~7WlXZIo&>d83
%!k -h8Zyw3^޵K_.(sf"ZE%0,=mBI`f@gLlEuBw!tA60#N]ɢsm:7`ÕNpi(w5_>uX>lz#]<<+ZEwY QMUE<@Xz4V"ӭ̿1X~^O%ugEԂF0߶@*ݡؾ Ǘֱ;39;1/C9%BHr?GBk?D0+XʤCsLȔBDFKF=.M1nmA#
t%'|Z6BDˡ?4oDTARp-"čaz3nlnb\T\ì}5߈eBLV!RDPgw?Rr8"Bskb5`F.׵pŐKs^cw8\^{ˑwr2ʳh/ũ+{m !fԄm0n$*M ˖.'JY
;/`RZF͎n¥1Ѡ8l=I|gM*L64?:+sdo1<o*ф:fҔsbFi|jӓ6gŝ|Ğ>A"?{,U1VM7]vڑjixG=l04!6$!yܓ'"_Q\TϼA髧~C=S>DbNtbݶg\,}{QbYO4B88M'ivs\|Km0z:0e>_PyheDC⇹G̑jU	!6n"}|\t.͸!Of<.iM)mm>Xӯ~觟9;k		02_P.j46)L2"*NC!&_^QnlǤԻswc=o!ln/Owɏ[ǻ;3MӋhZ-h%o5؁I=<|5C¶`w76_8N="[58,0ZMИTr<U8qHVy]S36j,, Ky}l-#}lh ez:l5+	2 3ݘʘ3K9 #2jP6@kI lDOs͸[f7d<.[-[ۗ6n2{WEauX~8uS"PS]2+W=,MyOtZvjRZAav9mv=qlOҼLl4<Am9wn'{Du<uQpl1$Fvs890~J-s;{6qcQ*kYm*ТV60e/[S@NTOQQqe5/	z5*Vqo>O_<&5;;L1FT(kg;=7;)h3?[R70}QYqbJ)
^4g!؊ܵ--ErXQ
nívؤ!!T˘ipN6::&lJ8+7"'6O؆OWw{hL *2S9L%].hoǂc
%pWuRGuPz6@<
N摗,Z2jOrZz%u7=sx5&	+Jh/B{M"h(;lsý'E1q?t0I~gsW;)?ax{iQVtkg-P-bK6D~1z!l]'ZG
"G[/ _wepG](CK!LOu/P/tc49=Dېs$-oiҾ`ԳUi<hs^nF>o٢,^yq_mjoNѿjNuWY[g	
Eþ{yʾxkL[8⿩^[}"An6w$SGo&_@h13x$/M铝5%cC߽	Lax@?X2n'NxӃ`o )9k}׾/"$I06d) ֔Dwl,ic9?+Vb¢9'H*l78j(L[PwZ6;/|'N袂}yeg{m:x#me3 z{ynW4~%z2׎TJ9I ihôGqXJ5S	^n_[sca(!=I1n)RjFGAC*qH PMLZ>fZw쮦f&X»u(s~|E_R9>g5-CLSPI{c}j5@x7,
|AV;9k	&wT"pAia{:"5T$O@4̓9/M E!-8{~9Vx'a&Cv)ņD9ȃA+mD8P
3>{:nU"LāǪlԦA͘_p&LaL_¥/A.N	g{?
 |]浞3<yBJ|#ruW"BU8gZzX!\.Npf05X$2H<rт^לWHeOtP;i<boS&cwpzPpʎvl^3NRoTݘCOI'2xÔEz%ǙPTT5:i#=|v֫ɽx/q噊N8
M!iA^ oΜN6,I^ssb-M9ӑ9o5tح1q6qhjRb,nfs6Nf8DIZ1P/*+f2|FCs1^CRBK |,=.wXfc5i89WZ[ԱT$wk8pЊo%qڈ[Ekng޼nQN7m5Ԯ,eUhfQH[:h/t cF`^YUug-X pTo4 ɹ\ 8T$ӑ_2>Fa_fUU/g9Kb&!A1Z;-h[ToBJH5Jr#KJ&	GH|qEǧ!bQT*n56iV=P>:y_O/CN0AX`pٕl>k.D;ѹzM*|ܵ[`,DIQ5{cY=P=pZ9`ޞy٠ʃ4嫕ɼ\IA>-]DnC!lcrK㫮B\1A$DG5۝X8+깅O|LXm1PsOwGBK=b{i-݀hauS٦!\^f D9JsQ2}Qԏ:It!F'ȫ(H
dn˹ߏ9<"D~__7XQ:l03*(i翛 Hc=?$L$ިʬceit[BKIfbc,u=?g}fH=g1jD'yFOLHεnkC_pPP}JOUqJ]9B10ȥQ/&8UΝ*:3N_cFĒ{9m}:0:[k(93QΔdCeű6j5H0"DFZ*Sk=]_ȊBw=׾`ٸ"\#avamv0k߈9Dl8}Q{n&!|VJK.<>gƽdiv\}tA=e;{Cs ;.istqC TT9}GK9(VG|ڹKv2&23ۢKfgfB0s.||:4LX^o':%QӺ^qD3Lp^	.{'OC o1c`F{֫(8u*h`D4	Gkq+U)rvGKoЇ6k-~R,+ytGmkXDi[Naӡlac19/NZq:RVø6q+{7x~r!E:ª/į!/Qvm4X/i>Eh3B6*ĸ{e|woAI)6,36*,%)gE+l#60YJ9ʹ\D+˕pkX~چU8h7|	Pzz":"w&#W|s4DߝqcƖ-6(>G<$ۈreתUgH["w%mmZfq$@7I4-F+j%cB4=~,FWX!7Pbm2Y>h	)d[.cv˴X-|7xĠ͔}ǣ5PGۛsT~bY"FD6tgJ``ׄFekjM@N-X"h8o-ª똷'R15b1EGwV

%q6Gc@Exh[G[vr+;g1sxAJhfFm҆?y}.ed݂\Pturﱪ `%
V`f Ԍ$Rcs8~7K<ScD4('n%$Ɉe:>0}\QGVͥ[xA}sM+pn$/FQ ;,ASA5J]QO#v'^<fV@m0ڃeFW8@8^!u0dȑ3@$cv}2jRb$WᝰxoIr?á? BFF(1K<X0Ap@x^%斵'"qN]7șG
ue` n6B#`9G<T:ɑ)uC(Js!$D	
V̆PT4 4UR!?FP}eP_^<\WNgvT:s.m2?j8}|^qnCU$6ߐ+
Jsp8CmNGmGfoWB]zr-goWaCLJ>;J
a\@V]qSsOpBc(RNی"ZYڥV̭&;MJŝ7@ɆiRmM?h I6򤭚9mwRː:ɝ]S7.ч
lmdړMu#l3E|i,%NغF$v~Pm>Y>"$HbgԬT_Vt=C!74l^NO",w>T7.BtdQm̉fKݡ˜X6ĭIܻw!w:	R]qZv-)Y2f}	V/ï*ꛕr=Z5D.VC+:iڲ?̚M5w]ku{k̟E՟vC\U97گ=;?ao"&	)wʼӒ|Tn8iSjFZA\^t2.]#𙷐Yj/ m*:ЌTgM%LOԲrC0
E)ӚE/P2^D7}qjm^2n_?\wݓL[uˌF׌5˔O$.$ֈ0sdKC~wM ѽ˖Jj˖7_;ݬĔiuX=+K#*7VDc`Ag{S`Z`A%?ai4> k)}˙)jeŴKZNh^u܌+%-P9J~UDpJ6~00]G :qU <KܗNF_4I>/rN@bQE*Qԑscbd\$C0jL4ܱĥb+oevF#Lcqaܧ(<6g6-&-~쬼hM(y4 w:1~:տZYlڢfZvFC̋w+\pov,I>"zqӶ!|Qg[gqr94+[fWI"T+nZ_0֥RHU
8aQ9<p'找Zl
ʙTpxۑ{BkKc;+-@9(iʣ_sT%~#xu=lkntۺ8D/wq"L[(k7DNO䷪9+Uz}yリBB|x?iQQݒc57^m#ƭR/m2r':A6N@9[Y=:>|~چJ%rYƐBō9jc4(a~MBdAJ ]3 X7_7˿mglE/]ͭ~W #Lߩ3m<)`m8([ۆ]"BvŃ^E-ˊifVwqk7$G(";C̖WJ>2 H]LZ.EG+^$9Tvw7:yoE<U^H)o}q~nyjZV>t ;+X[5sP⚬qdhJQW
]ojLw队ig,6^/bbuSiJOuַzDĎ3;DzhXQ|/SH6lQ:U]hdE!\X=ύ,.jp/Ažˁ[A"Sz!&a0or>1DP[rNFAsv!mr8"s^&'֔Czƈ~.ML ,f8I$:X#;*zVYK7QaZŴU(l`'&k)cte볃"IJScpUr'2 Bf`,&G7aam>i؍1BHc>3z:p%]n(ALE1HR,Iq<kI<aet9uCwXȟC!XxUw;q	Ho|jJq&R؟'Ѽ.Z$V!lۙa	ᔃ~Zt:J_Eﭯ6b42cψL0#s'ܫd:jt0LqH YӸrǣW9B"H+*t	"\ЅǏKJiS_q_Kx.<I:pH3ڬ@ͽTTɬmAvKrly&3iDMxx@à8'wH|^%GqHyk\/|"0@DmkC2]bf,]sѕ`?XC֖^dV>QzJao#Q~a%OU+.Na[;:d]Р]'{qNH7AF@C?l#O1\ēG W8U#w˓CvrvU
-Џs S$Uz$i!i}Ia4$Fvoӗ!?Q&Y<Gh[WAf#Ϊ\D6=ܺ;a󰲤=[u$25~_\	B|\E8t\\Qf5DCW,,jzYO&#/ӧnɑyPX.kJAgBݷ+S(ŏLVEv{7da952B^X#)h [,`t	}y&PPtםZ={Nc=`{D(>|^0\_[ۻtWAWz0CԈ{=+#L.zfcH*ȼiy3;I_Yәw"ӗtΈ;@|鞧E],`Ʝs
SGx^UݖcJ`cXCqmԢ@9k7]lqDd"
k!	;4<^SêYy\U~"R-"jIz淂v1ɣRNg<W:YʸA/WpsPT+H61"ǧ<05SK#XĆUVجF3!hYq`/:R($y&S-"ȗT·tܨ]#@ϯjY"_=#-VV/ԛSV_okY)PQyJWOBU$Á*{EEw6MYp&,>a)0@jV{
VYMR=cp/B/r[&CAx\y·-r-b^LmfPY??e΃Z:t[Kh;Z:Vӑw岞ًMeЫ8A>h(G|$1濒!Gx)r]bgyO:k#NFJSj9)|M˒zJç';lعh$"-yItM:p4YͧLO 7=CnrY\*$0?ahhzuO͢,a2Vh8Iz_v_Ep >y%Ix
8%eRo*6#}<s-j)M5HIJG?u3^9Iu%(a<v
+B%J r?:PB^Eth8|7zTQ鿫Ʈ_h,P[R^ҽtǺ6G*B(WxT
[{Հ;u#сSADl@fwϹwo'ˌ93?_:4ax%݆\p^ZH}vvoz<P3&Љ퐢X n3ԦZ:6и:s3iS Zpmԉ7EgZ׃kċ
xyXHS9ieNIId1CɌeaoIn̤^ۺO*ണK_DQ@6iL𕀖F3h,(ftOb8!+/m\|n?zS2FTI-)c<A<ҙޫWF96#-=~
֎:VG0x֘61t}#>_hӣg.oRCop%RG6H|Šh1DTãa^"`}cAfgOLLz2U2R;L71!<b
:{Ƚ}8:}Jm8=!w)8̤	c5L=r^4,MݘƳ@qqqa2D8 νQ˘9+6w:Hh7/6 :g&ǩ9U{36Nqwz 8f&نC81g:m)P6^hf!n@<'I̊NkhMg|dy7٬ QuLY)F.a<lv.@PYC\3ˈ<ְsVW.1r?z54'콜6./B5Ǧ׵IS͂vc0"4$m1Z"a	׾£KuN;'^dQ#}qà|#6b|ӭ?m/)Ha9)뒤64M.;1i1Cmʂd-c6y&QJf-O{)mgaH01)`@ϐB=vڒȲnӴ˛nWRud9E-fe0	TL>Y&0;
	ْGF!vk^*A=Bf>,gү
:zyNPlFj릙	RV!4Sz~Cv"'mMn~4;j6ڦ!N'	s1cCX2ME㼑#A;vxPpZFK} SN萜<>51
X3fĵ9[$$hQ7g^AT)wZ9]6Ɔ#7l|7 B"2y<8I>)lukr^vXF<i?h-KzǗ}\[P
we;⑍LpA@eHz4&w6)wg보lv cyec?g@p&2mMv|&1b%`S 8vZSSMa(ѮElCGCIMA#GwNglO4u:cl+3=<jjN*4AGhG<e!%oy^m%=iHyk2O>+o}!e b>%V|pJW1xI5/Rd2M3Lȥhz6 C_,4Y'Yz*@O&B
g'
p5\$'w% IFKaRL'$S	#zԧ=!OHp5	-;B?ʎ;!ʸMMQK%fSIYGWl()g̥֕k\!Uyǭv;϶|MeFԲ'OfncWDqۊ	A+܃\_l=D5>Rp<f<ލ,HYiڰI52;sKQS[3o`߭K5\BF!'O"EUy51ܢ	rph.Fʘ]>,9\|B}Ownyξ]X	Z\ξS7v]tpMω8xí4?C sO'MXpn@l`EFo'pIl$8	GsgE $V.dHɒ.,S1X%KơTNil._ksUh &i%7}\!CdU!s+G&P	[MRۍҒYRzw@maQ
	7Do4-嵅]~y13dhi+I )"
Es\-CrX !hT1F65_TsRC(Ky&^y&eu,܂qI	F2	-țTQ:,>BYNP1&_>rJH,l:w= q=?!YPV
<W%b>!߆˙8&B떄1:U
+ұطT쬼ю[@ѢM+n}Sk
vZEκ#MdbDз"yM"U@0:Ь}3GFf11B:#[<> *-VUuC,@պ;Ye^=?E5Fl_$/	E"%`'՜(F,AұnpF!)ҝRFg"}r!ݢ..iO+ù'ZzrCFtLMIOppY\ 1g 6[c;0@9NNBU'e"!E糢ڐwB`l|_[2<'C~g3	2~sEg{^ ,dH'Ѯ}k8_SA"DC\N%c50Sqc|rs<"P/lG^$)=cXB_#jmxl5#Fs_P?I}.jp<Qv"uNټ-ܓpY瘝US^>GB*zhsޫRF^KxBrK6<"yjtG{ەlo}$ݮ;P"o!h$MRUs~^5HDwqL1&2׏LʨKH۬]u:xd2b,Iؐ"i:q/WʔnRbssaaa,#?C&~W@!%{;uwGU)"$V\7cpF}-;\:_q'(kç|ݞ?Dn_T/Gu檱Ѱ.n{fC(r=`"UD@45i;BY"u9m#ka[ӭ	KJJlR%,4(Od/{6嶷  Gt MP:h2)K44ϕA։7}P7m V[Pޟ~{EN1E׌{D88Z	\YԊDv?::Z#>RęQ~ݘN.L\.2fҾ7Qf;$5xgc;OO^6nV1j/&tql^,ٞFC-W"Cf$zĜnVw9Ѳĝ\G5b#ȐXø7TEU97UK#6VY5JuPg]1i7UL)G`veϔsr9&xXyB
%L1 N==I|_;dEjȹ?&(Zn֩/iD*Gm},R}D]~pquIq[Vfɱ=^pt{{	!_Wv=a3`"e~iQKD%1_XVKjIW|Y/9{b˱xnfρ''oN,mn?n8O(|{ogZOl[n}nO$iaGӫpR%  _c`X2reXدtNQY=0wQdJ',2AhD¼#<-榞L`.'n2kY052KhLH O#5bѤɪ0&V^0?Cn))QY[AM]ĝ1ɊzRnݥRgb+^-q%ĨЯE}KNLDsnlw:9l4w%2AQ #dT*iqfSJM.Lf{3]beW(K[*]`MjHgǕO.ާ"HF= GVWl77ԯ3wQ$ACuiDSbB~n/˳{<[GIc6nG[q#[Ej01~JRV}V|.9DB-VTrt$97qbSDC~;~-[,~=D[K?WF[=Ah8Ic5I7Toso#-ta4Z	ɪ};I5-Є8i-3	7#*at"_QM$ |u%R,'ɱSs62	FKuZ_yQ'jcWpHJ7zV"'$!9+C&8&|=DE>γ/>\"Z_ÿRhƹ/^a[Z3o
8|{ujDM>|Lv'5i
Mi&2Qd Cn7U:QV`(W)Π "AVj"vg3D	0N읢Ӎݭ~1Mh1IamV1Q ik'*'T(5RX K'`ĸ
Rc0=iHk%1{No	;betrGvP۾SeLEBM$
D>;++L,;Xm4{lZr6|oy7ёInFQ'cKEtZ/&3ךJ '%:&ϦJYaEkcldxߏYM5!?I͏v*0S&I]G>36U3@$ٵ`י0av}jbssk]of~՟W̪ٝBsjnh.d⟉{ywΘw+Ndf6"6ٌ)9oBmGHf>,}9%}9%<)Xc>'5^aC
JMFŦfIO0dDó>OnŮq*nGֳjބ\pexശ	hm~i/#m4Y{,>^,l>>ɓ}FY_g	c&?D-LI٢@x ^>4zl0x/ddF3_&3g&r?M&@fc^F/5٤[c	rKWwKpK慎>-HW2jp{fT?)N0Y8Ob?M՛4Y$&9=Qx& ~f7K+_6vNwN{bdՉqaLs5P.Dg\Š&D.w7~_M0}LS'7d9{l&sd=9л[Ow/NdSO'wm3QvYߞWuLYd'"9}	S;Yn%fBgL)|I`JԚ(.la)E3E%SltqkGl~1!.IbOP`X"|XQ$g^rSt c/8Sp4~8niΈAڇҪsXD>OχϏix:>?@xFt<?ΠyNp9rb_N\E3;e
:oѨVg:m+M<lahY+I*Z69s
_< pOC-Ĵ8(3rY}!MZL}{xt/TLH"MЛDe.u܉*:u''K?:}yE/~<<\ه&dSf݃2񧜳 "xLjɹtG}yn\ǻ	(n/UpH~w|/6v$(W9;&y.(St㖙`@WlwOCӕM23hfJv<	cJ~o^aO~G?cG'{϶4ÕeE
g"@!@LyO:1evE.gLRFNt
ͮv@GGfl֑#0l5T9c `!)>JjFxGM,XJ~şN&N)aYd8g©zM3hH6	
Rs	$fTN<8ndM?qT4^w{NcXDD!Bi:TBdjD>AG|no% dHxnfRQu2 8Mu?om7k}ŒVRN4MGHw|NCyS/^wOdK=d	k}!t~f@zCX8y.	Ы׮>="5Q;b``8K	ĴGT;"DVa?bGp>>4s9Q~\Q7WJ-GVR9=yOON6?!1xbumt:/`%H	iB8qь)%ig4}".iP2 ^+ڝU.2w@5ڴ0JBZ|
nR&1~t[*JG' u~F!'U} 7D9sȓ Ө'BEp0WH?%2ԈpgB޻E;o:1Z%7M{ BUâgR/yZ+oxaؾ-"tk@yuF2k$F*)@;(s=(ltۄ8 A8k_׀@;:, 	dp% LVEFQDѦy~7Lk?Ղ(ꁦcG54-йE9?]sER:osB&zѳkH]A*&-T?[]5A!?OdİK}WmZf\Tk~&7TvjBA\enɬE$E^y+8p
RQ򜚪ml1Kd[3+51%o~$<G&;6hyvm,{u#XOO_o.kpXgoYNvҝCR.ˊN-(^+⦲Eϲۖ+DR%&dA!p
 O#9j8R	ǶJz7dWԸ_-jZDbz9!hG40uz:m*ZC^_bodG˓/7sYXs͓
x9I"_enuK-@K,8v{_y<)Ɣ74;˅>#HejM*juPԺmޡ8b3U$|_m諾oજ|Ʀ9usDvnzBǲbGFMke\+D!Q蹌1	"r=h<VA;ZBA}MT*->~`!:M'oYx4+2Kt.(iG/bEΠl_o`fU+>ZC^:7׊鼌v׊r$t]eg'dֹx<+ l]QGį$[5AJaW&A(_t(Mч%ɡ	݊I&&.KBbiPX&.:!vX$+{9Wp3OrT?:ȩDW*ԹsfkrMzC<OPFB߬,חGjyr2Y, "dHP6X*|boV?lYohPŰZ=:oB~m b}n2 >ӫV@}_sڙa;y_$\}+zY36	g{fd7YTku,GE`?U@o[&_+Ju+AEE)ܮe(Wr.p[Pːv	9n#?w{_[F%3AHzW&:^ҩ]OɊt_4<LN2>XhEp>pR| tyuj\n4zh?n7󑝭%x蠁 tލzqDF~něE#nZLr#)vzq qf%w
ƜTlHvw_F5]n-nX45Q#f.^qyl'Y2sC 7Z<שٜI4BsG/fMzJƂib3s[(@/<(3كoP_w6Ãg{'[/OjjL1Z*Zɧq#'	QInv2:jBb%
: 3IhPdRU||KqʯR_"Q%tN!yzJT:23Ft-"m1!(FMnit!]9eިim:2TM;Șjd68.U\GHe9OIEN&6=	S">x^ai&?\[ԗڦ7"Oй#'׊'?6~=;Dͣ«多;H*?+"1PXWM~=dHڃ|o:+Ch&Zn¢
*
V*- nDIʗh!kE-h|\,%ZdU])WrseRY/a~az`T,&9ɩ؂9[h k=z]V(bȡ^Ք%*%NM:1QpCظKtx$n!F[Wא_,8X[N\Wiݩ4j!t?ǣP)mH+*_:'SGE}B{` /+DRi$fCuF6 |.wtFGzUZ{~xT+>P|텸uR)sFۦ=ŝC5uyyr`	c!vcζo<|ߠ1=Nn}ȡ\c<y~JJ8E#>.^)NXfC=Yܑ]y.߽0ʡ5w7l\Dq 0B"
f^wՠmw`Ԅ2hR

8PPwPX=:WN\^p}Yq~zW+k+rz]<[{ GSH[Hdn!2x 1ZKLFm.g1jI~]\^F=m+~YV|^Z{ח/zdNxXLkNvN0Zgwb*࿛,7FZg@ؘZVq|ΆiȄڇ2Lwr훋7\FZ|nR_r^fĜu^}UT*W!+@
MOApA 9LnzX\@H7w1+eh?ںUUid /}/!ybR3_&-_}X ;`BNωZb9Ā3B/vB}tŷ9>n< @XG枭캹G7}ղ5
\dCL?7ʧMm6!,ytFC}rً`fcZ5jyΛ\iyP?#uB3}n YT́,J|EKVI>nĝ&(RDSpAkkB\p0K{2f-ϓXc}4/,SXTUj֜{|Q|!kq2_x}:$/<gUuE1tsJ^7mw*O.s4$>`V,2
8`
iӛmkѷ91
B<aH!Ir;on8!Ev
uonqӸEc[e.coZm~̱לJQZMP/w.!L,3:F}bAS-)L{]yR,{zM`4k}ւݵ=lF$]kZ?X8<*C
K|+{O~|kA4 H!{wb&В&8/ ZkqS7"|Lds SML2G&Mzc1e="t]b*[ـ7cсzHlǔOH j#敚ꎖ;mgP}tH8
6vr?i---/M.>,-Gx@b55
<9,cVdI4DiR9s-Omb}ɫ/3䜑򯤑U*qV*T+z3(\݂~'7}dYri=VRؠU56ji~AKgӴ9y>k5i|ZfY;+8ByHt(&xW7nW
EU K/zU_Vc`}ESgIm>/|=,Q`CJy>?_^2sbѰJ%*MkgwZتOdNM8*{KOXZ;oOjmK{A8Ԋ[Owv=qON_PF
18h}Rk=~_3@ؖ̀؏J,)H%hC^}"WsͳyKo^Eլ`d:+rwUD:@.[a PXh*[XCZJnxخ){s̛3seFNmYDrt`ͅES{-*]VJwHy5ZvކWt^`O[{ԓڙ^Ůym^h遻Z,4
 9ޠ5uPnڃV尵>hE9B2@ٮBh*ZZZdlz:Co'>,}[XhV^1gusWT<C{˖yMxhɬnUMpeU-tѫ6-L:=UN!eS"Es9D0e0$,7teuS/NALFiE^)/y~t
#u{Y:Sxmd@] }p IE(mgǳf_E4nk`W3NϦs/DBf@&wc1XCAwF4kq*y+xX33)88k[si/SG/+:OtufFMJ&1wܰcZzQ:+ii[̻ѻ1|ϟJPY̚]hceDsGw69.z-Xeq+V%Dxu(5$ 3 \3d׳ZDi"S|FI|iuTZ͖#4[qcdt^ҀFڐ":D"!r?1]mQkeXg&ÈN,Z0+y@Nup%.Go+R9:Jectÿc*XVE.q2nQ:!}b;S\c+>~8h4Z+cGכׯ{|'֛Nx̓Im	<$k\_-hLɈB}qKLmuceY޼-&6[3n3xg$k{N%qk`Fr1/4#ĥ69]8QYI(Bβ*vw,s2.&ظ%VMsUj#]&_^ړ	߮1Dbt>Reڙaп]~qwk-_Ee¯&)a^QV\.KU+ꎄ=̏گg|kLvsyIeqbk{Y	}];G:'{7ƋIwh\LP(a`}V_ČU8/ @G%f0`ɡR/mx݈Ümpɵ}цZ?T[jFYa{Ai*Ki|U"FVⅭV;=	]\Tڼ j|b2;ڊ*C?hWrY""3`\JR $!1=Ր0}5,u:G4q;{ZG 2z!NwdYZAش2d9&@'񂻑e։7ܱ"pߨV+B+Jd	L/kaܥŻ{b~~+)圠~QU3NRӯؐnu!D<9͵OWNX)dV)R^c=X-$mk"Ɵkg0i׬uEm: fXp9e>tVkRJ$$/nm#^[L/=s᠉i >O܋7~*~;s֩|W=XeQ.L*}b}˗lu(DJ\-	_qRA;oܛBE[(mTQ.=,DwZ{VMܪ|cTF DqB8*<[G-ansӳCɣ>W8f'`Gd_m]\*;
ݢf̣}2؀q"?'!CPA?x,3rהPAԪ"|K3|/`x讹`'bq$,bǇ*F(ķ<k$h,<ubI5LE&d_æ$2K>'wh^vކ`tJďz.{l"{uC V̝EOzz-!`!s^7iaGWcE'qQWFCҫ-X)V1_),poAIG$ Os4āv"^-+g	@Ɉ<K5݅zaEB|q3p?&Yjg8%xll9OjzISTuqQUXoEq^{z
c=l훦D͑)L`lߕ.W/W񷌛1~nY(8֜qKmh 6yPP|Zۧ?|KC'Gp8%J_RA61*k+
Y5){"Wn3kkg3ffp>X8A,~?#~ !wWnQ!'peJJچPW4 ;M,@=c]Tqό5FÌРlK)z9DyR IBA3Jx3cWa 595sVMTݝDgswh:x:x1k[593i4Is1oǆNqDTf]%bڝWC89Z?؏CWC8_?9CWChkqx>D3BڸxH|p0og</_XI'ë3Bz$}?a~h0/3CPF/#/eFx;o撎X ?37Ќl֬qCBȻuլSA̗ۤ8+>=s1Xx`SY^X; AF%6<'Qo
x9:iVj]p벆N];Ԍlo;භgyV28ͫY%XoaQm%z~egK-ٙ5S-q;I)	FـGkpK=pcu>uM;Nz68;ǲN~*Ua֜ESf) H_'!F=Ol{i8+m=_F_X E kq@RLCbJ
ӊ޵~L; _A}5SZ1%­8 :",Ub]STE/gƶg'{?{/Ob~5>`wg4Y{G?g=;%F8ǨGO͊'@^|ZP缝Yb|IYu2dh1قf]?6g)-Zdjz"
:SbNi;lH46
>IX1i'9!I'tΪZNdw/qV\F1vCȍƨ&ϳ`<ԷYMAǖc6ׄ6lyې,n&xȼ-t۽Qς?1YDD.7V`^>.?U m`Im%I*O3ekh.)->w֕bLp9/a!1/38x/|^Ā׳B
a&(<c6D#2>Bs//Kgn c;bwN^!s|&wQVP(r-V%0}=;$8-̀8<YsLaRS(4b̭o;&tA«$8|pr{dvj$is+^\wG}hNqRn:q|$݆L(<J|O3 rZ	!A^ lH`;Bku.39>GrzVOCBn7p)⇾,G/Ҁ>zAܷKZM W;3Rpdm)ŕ' McI'0-_cZ]}>AZ6%>N͸َmVf(>'ǘ#УcB	=e븭GMނh	zo@?b@i;6Wa{1u̒ ^Nln?')`bxuS[ͽ7[н꒗oͬםBLltgЏ؝C_.0 (w?E*Ȫ8-0[HL/6ȗH$z7Vͪn#"Irx+H3!bHZ~ Įf3)Bˋ:tY_کEXJqŚKQ>o!3qd(_NQ}Z\Tz	${GUMq4utIډf(al@O5^KfL%J4Yu-d(魣֎~ŋdx譫OW'F9<FfZ1^Nΐ\mH7N=(}O"2kq7}5!яVuOR=[ɆW&}vC'(@e.lUA].T]I]Ȣ\YKE9sUq.hkHT,'*ak$_Л#-"(=<sq_q'Ns")R_?w:ObYNF品-l"O[F36eme6QU^lEboNLzF^2.	+R%F#iAC.$@K'JIL62UFPէDڑ6GS)IbGa<C'TKu
h[tpJ]'zTY<㘿k:"D[xd5>Ra$)ҏ19r"O	{~A@0d[QqJ%Zq4فӆ#oBГ䊞䫡GڌiK&aQm/jrya]4YRđgiQ jT8FE֦I$UFeI2@BVe4t=/s(0D=-I<vV+Av52Od("lM挤Rj8۰-NF! ݦ(9+Uۨ+dԺZ{>Fa=_F7:Ҩoߢݷ@F$T}T s>*w*:n;/u%˹cdfD~XT әbF}	$y$} :^`
nWǨO1 QѾ8r Ē!G:K5q @ 5JkgȦSK0%ɂIdc<;EXSMNT2"/+Qb62vtC{}'i=	uLL"^sBwv%XѠ3cn<+2l%w'Ti[<>_]}.4(.n>;%&ѓ(gEF]nfW!)UZG MrEQ /N
rm0"7Nbz[-4$EpZ!P۩+My)ێk ٸ>^>)*_5ZTE#6v>-aEׄ(Cpb׈d}jg^P̰zϫĊE}N6n,)s┛(LG<]>7}>F+nF͂]Ob[JŖt{;%z\Xz:Q"|ϿUs%>7+_UZN1V}*ud}R/
ҭt|S׿^_z^Υtt4=lH&h}"p>^L.8")f$oZRGO͍>(!,y4dY4!rWoh3"3ĕc@OY#nw_$KF_Toy-ո?|ftQj@ӏu|&_ߘW1[t%H_$0U9vVe:+><P>qe7|4GcD,5RMt8.9BQD8]DY]/4OZDe#	,Q\UYB򒣊eÖ:HѬ5hvqbo$EBq}F"rqpHo:kP\^~|msD0|%_bvk%Zl+I{6TY7ٓePd-@ے$暒BwDcEъ+ ԊDԛ?D
An/FNWf"+3/+qc9)4eW3A,.awp1Dxzsxo۩3"лLh6^?qG+d'u?{#MCbhΛe.Blc/jPYjM7e=Zy^u=pNJ朤YбnlL妛~ل؟29z_a04Q<갍>׍^gыt?9ZQ*%sqQؐ6wfUIYF!/ڃ0C#Ueq-%}%XKy?Jk̅;'pH,ĠLFc:( 7.h	N  Ʈj@+s{+KL[.YguL	W{'QLЋpP9&N<aN,lP&煎)h<^H_Gpޱ/G~]+%7at\R}?胷EE8 Ce2lѿ=wI46$3K={CJhH? faC?ԇbnLMTFē2|s&LwB[pW:͏Bcz	o:@?/KFIh!qT730<1V'JS_QF2e*FEO`j[$'QeF|yO\E?^h"	ҽtF26Qoe,CD9RkVqG*po,r4ٯd+~W	E&=EήW,L"$n&RM3cp:/-D,k4h8[m5j[㗡Lz8jrt+o>|q3_Y(WTǴk9W_W>T+D&M/994kV+hw*o&ahM0ߒ։]Ӕn݈Kw֤1@_oE`^12Nb`~5S&xÆ~lQ2g]fV~0+,٭fefONI:t1)ʸ3EޫI:/t|IcaKte>V>:&=7rUڶp6ACoHQaҔꛯޫ檲֤>7.ku{wldso8p]lW{q̇Z1Wu
UY7	kc7|ңǏiMG0Ib@'xq;Q[)GKlkL35[?]bGM<G/IfsI?o<HؐĹP.;]6Y&:w3No
KAfymV~2`G:Ay{c7EK#ͪs~$;*ElIo
etxĴz6%זȊv%d[fyÝR4ap"3W0}cH[WmZߪ_K~laƛsY߾IT8Q\ŵޕɳ1@5~Ǡ$٢_1H"T[[\3H)؏GC>2vq.GBTG'DCK:hK_|o^<9|N9m
 ćS٦@+*8 JQ>2[1PF@4m_=r)LE>	hk5.0SnG3+w	e+r%hfb&c x|ܻstzc8qg1$yqGr'*>k?qQcpJpcFSf47aE(&Vd	Z"g%"L2s7F|\I !6	
%)l7WL	8w?[Kl$˹w7h3UQv!a3!_jW⊣Iթ\^$vڲJ+3UJU֢zoiOe2cYuf|mtqH7nF} ǄS|\^Pهw{WƏκ/\kW{~3Dȍνm[o1Ts02uM:7!1d]%HÆ{%FkWlɦRbbWE6̳ib
 \Ӵ`
:TVWW+V
n~|'[$L*wU*6WfhT},GٵnL]tu[мthΉM^;X`yڲURd1;{k2,\jdމ.H0dJ,6&.7x-[EUgd"P?e4
­@8n:Ob+΋Wܮ/>ժs]~^Qb\#d!k\IY<W׸T+jK]K"ĸs2̊DlYBMqt3u՜e0:Q.QW-]M),#C|VN+QFEBv!|+s=9GUoK_-ys=bb883u+9ϢN"OI

W|e:!`ǨSȼJ(|^D_/&L}0a6g{5vcro\3H(1GIj.okQ'WpB]nЮū	B![&otQXJIܢcbQHA-ee܅<< ]QiKbd:pIf;`md%@z4He{gN?!=%x[-mZ' ԾhZ(n"-;S\o5aP5Q݁n2#/v:8zw잜gjKmm:VG/Ovy@edtV豈'T!̮2	@"xde _СF"24=fo+6ޱIH泌Iн&t+dƸC|w2'qS\̪[~o䞗ULK-v_AWІ89a͝(ZZ hX>py]1}G-Djcȫe6$#QN`xTmZcBlZǈ~}cU*`,ɫd`t*rM8}NuӼ9evg_Fz}}]*aMsLCoYNɖآq"Tr;GàaXZŋqf=,-{'8i==:G7KqE%)~f%'W3Jg~H$MfM$ߕFDA4bX`z'AJFA*O'aR
}ā
-JzfnK?,(*nFbww̆$Q2gFr61j	ikUeR	ysu-7s%5Dn+ 5\fi(L̷'ZWRNZN&^'6WIk[w3⺉pu[y嬵j% !V/69xn#u1AZaoIZ>lhG(+xKkV>U&䤶y
h-ZKXP@Jkif7<u=%^9l^AkK"
N@V7*~~zSF{qR66geU;;x^{N	~K洳K!X׻iwG]&R>>K;fC"bXA^0<tYG>/:ɬ-z6;2R*/d+Q~YVA-mXU#^T%&\`
INϩcuH=GC^oxlUn7xScae4`ဍg(V(TkL:V(BaR͘rڇⳫ՚T"?0HrfΚG!9	Y[F2WN':;5)Xm{ՊNٛMf~Ewko?cEnsb0p61o5&d{tvc?bbVU=hCLJUw5}kwZ.-Lk\.Zs.ɚ@;YIuM("U4
+
򘝕߳>˴ꖏr9WBR9Ƣ즕	R'E	V&hEb{+u(1K|
)+XN0-]LZ֨#kN޵^:!Z\ed#դ|l\n!GJ!	z-IH:AShjب<b1Ce㸞#v&$n,S!f̮2q^{5xi+}^QEW[D%4S=]k-WFmYiHqup𢒑SoM`)Ac9C`%&)%W#{jMq0NS'i#=r,i4CkFò5h#	3ꄧ i,0h
Ɖ
~_>kcWFiPYmJ#q|9d*d8^}/	1Q<	#؈^Syħ3<Oƪ:<Qt2Yz?\MV+"xǖ>ŀ餙r>^]WH8&r:V~BN8\yͫ [;	ߡ<"(I jQ&۴p<Cr!'!fSgt'FW	6&(
ӬӨ||=+)&3'8L@o愾]q	M7װǦIPS+-W?K|j{<9QETd0\!e)\%ڻJ<R,RDKPʀOϚġV'PK J{V A&TJO|ֺ]ͬAO,y!s.2ٗ"8*:!nҺ%^r!6v fJA/
E!{;[/vR4&^G;2A]Z6֛v^ML(؄n;deS3QGeI4v2du`DKiJyrJG)-dOZӠag]AX,Z	%
;'y71TI_&QmGV
{X(96֍+$|3s #TF(=o8f٥q
ZE>2yfc6$X*jnR|Q~;&I7\lDLupKet !	^Ur&mų)eԦu"HH)\V Ա5tj|~!GqEd4(E.ž5WSqEOޗGW[AP:N"9Y1oct([̑a$ڏ`%MG:ĐMw̍y?Ӥu{.
mWGC჋dJd1Éx :7btOot5ηP_pLn%[;mI%wwɜbށ? _sN~|'7;u^Fa(|*6(P8T
{cE:DOH60I\[(o7FO=^z>LIH7*D*cf6hw%z>=W%o1R}ܗT*٩b#i/Rkܑtl:u}u[stEfY'6keˊew$yRGSm(xzg$rOlղ*9g,̦}RN$n-#0PoTgosІ)j$@äi?i2="M6HRIg_E`m3zAR\"eDj`Vhmm}kA#㲿q~2Wg|Yvgbs?R^.qդC'7;{U*Sw74YE"s_;:]sQ`؞M|]aCɀȸZ]AA0T=	+5G^@RS0~?Icf\771:u۽Qw:ߌɏttc󫟶k'GB>OzI	NPmt"MFܬ>z'3z`O۲3-k.LbWQj=ltfJjP$gO=摹ys∩,sCᣍ6Zj]PqPN:m؈'$7u56*Y]}ϝ6\,Jyt4YMr7K驛K5 cdԍ9'ja
YVf%v	*sqQ{΋	̥J<mUƠx[e즯u9) Y09J)$n,wvR9)wńNε~`tk/wQSPJ9޽l@KjVancg8`#hsܢ϶}#
rߴm(
+Pہ{H'zf#[Νpp['BML,qΆ4	_Cћwk	M랸IշfUrl8#eNf@Mp ܈^q,ZݩNꎘU$*$,@(&@KZ%*TZ-)FlTV ƌ5sd|di]@i=xH+EtiH-k@B
lp28Q]7ﶧQD&Pfk^9粲Q;=5'xyƪ+(cklcoLZK7˛ɇ_r
q#(uL	Si$d2߁L׾yEH}'G0"t5yuC_%ukkwO8 g{HN(JZ	;/ptށa7xG96 kcoI P=[DʉOD-̿UlQ	)nXq=?ϏղC&n\w7v2{ڛmAMXIr{^lڸr	}bEٹ5F@ g
EMϽ$rDke
L\YA,
"R>j&jD2ߌ8pwſc`#W~f'XMѼRnl\N͵nբIa<9 \5#/͆1:f\!ٝq	~?)\nщA@+d;r/EYqp#ubd]l`H˒&R K(ᆣafXx^YWmTE8oqJ(ޱk$lpC%ȔH|m
ՖAoI',HTWԵZȿ`A <LhD˲{mi/cb#ved"
tAUMѮڦZ/Q9^;
!Qg'Q'-ټң7-VYY*I{:Fi4<ݏ8J$P[%A!p_T4oJ|snaq5}`>_}YK' 6	0ҦJbu"1ۉEңmಇ`Dj2?K*1h۲X}% K?$K/{:]VVP9Ǐwǫ_>k>~cz^]{SozB)Z^obiC-~U=o$-ZϢrcdܒB@
KcjZ^[+=mn]P0h_{,1yvX-u^U#r(8=02wYYOMS[6	 @̈́}'Ƒ$B<w=Ru $Vuc'v9+վޭQITgM?Mїw	MC>_b;bS$f@Vڀ#QG"NsPڐi9c{[QσNJNVDªPBuQDC-#DF▯4c{Ѡ'AV`ql/6g6x$R!Fx@TO': (AqF5\8d'hNU'NK쪽ut|N[';_GLEU"NI::F(Cܸ8ۥ{/w먧TT;%ܤGOQioZ&}{p RDpB'IZ#ppF?9$(/_֧1tދz]:VTI?=DS:P[@	1,OmNvKjx<RCAmlkbAnԣ- [XVsWǆFk2$$(O)%+(D~_l$pofcn:f:ޒئ2%EHvA7'd+ҿiJcBSCoyg7}r$L+`MX\h/*6GAj6zhW@g"s5T8Z;حo{XԞMl˴&U/c>u;ڔ=(+XG̂dE@:{B1Ԋby)@oNaxW}Ayf,7TZ)_o8k<o#I6	* A$#$n{RI.}HϏ;c#ßGzK~I8ߖ~ͱ̗AW;~ݏb_64}:Hb|f~z̮	S0ofoem@u`TMAz s"PRy -WdNr8`:E\e.O24m/E^fAkCLnnCLTaj^6s/@UMRQ˧o6aSI!^g.ugmbS<o{R.'tpM9lŔ\Il.bGΣ!Fmv ;M6xc.8:~+0es-k^ -Sʗ$nZP./N"7fdsIp!rfvgX-V${ihuKݐ+n<K;J]EjWJzgdUBA@z8hږUNz+*P2eBL$\.{N^>{zCܽk))5T횎,+ Rk<'Rn7"$ZbYe/e|B	gP(T_Ƚ={zk*AOZh]:MtZR)Fv(Gam7Hǌ8?d>f+.mpQ.˞71dDԾ0:D5GNf]	d_3w沾*N_V	>pnqZV_R5ÂΦ,G7`*lM3g0&l:{&+EUy`yH?Wcuѹ|?ݓUĆhcCb^8=U'srfGCI͌tлLeOUL<ȏohMB6۫>ZK ΂pp[!~p*胏5n0oG׵z]/՗zl;PⳭ#;BK-fvcHZ^	:䟹f+%:d®8jYʹ%3=H@cG҄+Bd}\qc	6D"2ʸ{>BߴWIpқ\.!scFG3#KDL2q8rhU^?p(t&fk~6{KDgF]z	D$n#!UȘv5B̐"ϩpU-.4Lp74;$/"d8hStn>Hb^ܗ,Rx%Q]`m"z/p6ecÿ3v*ZMP鑰q{NjTn~56QqI=ƥˤ{~L6&|߀)SLJ̡IP+ZQ'eC8%V=I*ynph-Vabeq[ED0yS/,Ä?%}PdhlCuN;N.k^U(+y2!=.wʓG hÇǏݽ^-H$2N/5Q\̺-zkkZ_4QQ'8Nq[UZrQ,'hi`p=ܭ+X  K7mr{HK*۱/K246	E4R4
nPo(g',O,<-)ik@/sFg_KۊQ]l\6v^HNE㖖F\7s񕘑Q0CSaGNoM'])=,ڬEJ֊1ˏ#Lr:9XĩF+8$ɝo`[;V˲gR]VUi/aW/*)Ws	zwfRd1;3\,#qk*k5Fܡmh;:;7l|3J!3MԃuP-D9)ǠlxŁ#.8WQi$YIUVd"tT}k9+2r]_8:9|9#`{ɯ\VJE+U0xkQ/Dz)ֺkaN6\|@Dy?}qw\ҋ.)
9*᫈<qBUί9CE+.$FcOt^L@lHv9>`>_!y0xQuZex0F+>#j3f5NCJX`@M,f-@b+9^,REf
徤<ta9ȼ0&mΑG'{`8c[q*xT~JUS'JOH=a
Ibw,`zrKоǗ&g%q$Ie-ݨLCoNLNhQpSX([˂j@?CB.]]eYe?2~BiF4+(Br.V kiEQ?ߡU n-QyKn)@x`Ɨ
al4I7Fga%j$wgU4Y8$zEiT/EL*a4*oDUbI?
BȾ/ق4Bj^ӏ%Ę- ܰDH~#ߒ2FL|rdA;K*mPX-:*e}(s
Tb% /Ÿ4?7~V^!j>EWyp@* iJ:5I	0ØƑB~5-D=1oTJ q-2?v/c2G^k:9"#5)#F4XVIOɁ^3}±U>bz?s0T"۝h&wڣS1Zba"YLz6m$qK356_w0}m8y}DG8|Ćk,d5;GE#qch$Yol֚鮾piVQ[g[VVlg1?xsv;ɡ0*+fxϺ~IKKrؒޘ
&-h_1LV+#BCR:*vA!ZmPr#nynAY9]ڰ5zȣi	XM!>ޙY3Zlb 
ÑPu7ge*zkyY柲$r7
w U3pߣuI1)-W;Du@9~[U̪X!3U~')M:vPDhI <'H/zU(-kgAa|gČ@vs¶a	*(S#JG3,XiH4y]̴[nU.2pN	UC7CFhBao=Kavv.K>d?dHk
xls*s(ŝVVU*Z-Aa >8r41Jxl6guneuչQ	UCbsЬ{m;O0K0kZxJ37&gFҠ)]~hɕK3V#Mx`{;&d%:?)P+-Yq#r|Q1ZQ&+gS>S\@0VGJ
r.uj Bfdэ5#k'"&$-(5HPPC6猖E	[ĕXaRPM.4,I0r,WƁVb\ɂL<lFJuZ-bw@.cc}cEaU޽Ejci&j-b+?-V4aA(F<eQ:KV},kQg"wAhkznGmwHZR	ch}-
;dtѷWZ8,/IA,^LKzY)*?/R9Tzu[Ar[߃(\doK}?L4e]	~8{ʙeٙ}cI:/~m].Q7a&1K[;aj瘬fjXSy2EDg</x&9bhWZMsIk^uqx!Pd1֍8h#GNi7G7|`,-j8~2uNÜvbVIN(Aq$BFb7[sY'om9܈j}U=)&/l/G؛K?-<AX]iuiEaEOZ@wZ;xD:׫}V=$z]h"ѭb&|X7 wz=fvj/z)O;`1bn#h4WVeF}W.(g}ym'9bO WN~P
MwPʆ5xoF"m_#  Z-ÍC'qL85))phkD-P6Zثp䧬5L{BoB"]ro	ǶhM%;nb8)jy}BvV7TgW撂^.lWLոb=J
h$hŠ
$l~EٸFCrS2hNҔLuëڞYs:.HF޸:vS4!HE؊ɥ!Z6ZՔJw@~wvN͇!-O7\8-yܛSďO $~|͊cd@?>	8j% M1f5Ct~y~턤^@7hFygryX;ŠXW幸
`(tH4#״}2GqZm2)D'6zoM'<n|_ս};-GI(7$=	Ujv
϶֟g믷>?NI[mr@_ۓV{O`kcTғ%}*{mγY$7xZJI $~IT&듀4xxwuk~ڰ؆Sj_ţ
ƍJ'>$䕿7yEp/r/m1{iK9Z7&N2)!(gxϐcDzOaMovO%Cr'H,"E&&PC!M$ץ\?OȯnI0oH
lR%ڃ Z[h$1< EG	OH<u'b9=1Dxڸ0p Dēvg8[EKC@Ȯũİ)X,ak+W
:/7Ȍ/mQ;e%cEɒV><<Q\GqQ umyqoS
ؠlŜ 2^`FV嘶mz SL=/4Pfh9˦Sڼ<M(zS#MOb$h*}-m6poo+-7Fkٹd7.,vk&QJD"E~bx}^",+N; ukJԀkjtif0`S"cE$sr*ELjGQ=Ldb3f~#5Q AUa6,5s:qLX'	
d-)I;v;>TsRyUCׅ3~tyC"i_߬0
Ux]v+)v@9j5EKD>Ӥ&.}y )'J5RF6h+D+f"B4*}zsڤ,D^72N4$@|j}O.%Y4h2E3kE"TOlhتCk:M=2qthgۂ [H)Jآ L{y}R	Y.tDt6Adqr%Z0vVxo:""IĖ9=9CMuL 9"Nܯa9I1t"7!dJr-IQ_Ȇ\@p8&LoNLq'҈$YF"kd(}#Xf&E}Ƃ=ݛ9,<֓`@ݔڲZ7ⴳc!A=/'Ȕ?@~Lݫ,p.مUr$į SDh8jԐO"J\^cp6kA&_#VMuALĪt扶%bxEOfײhɹsEqYPt1ҶB
bbssZ*Ro\8k]>`i8^HDq\E'tmJ'9v,o7k}u)θ(8_taL.ZGPZ.,8dTc[h΁`7eX%LD/>nqӐn~FN]Щtm\fģT5A</qWӪD}D7Q׵o'52ZdU~C\VhQ_ݾ89uX߬{6Nnͩݤ/ C/t乫©XMu9)F}ҒϸX]'xw]9]_ԧJ)]l<G]@XZP&~+Ǣ^Kځ	~)WS\!v/5(WKghKX!ǨQ@#BƃfPcaѓX<Ms#"ć}@WsOD!l0СߐhܸK!cts9N-CvZ"̲Kٙ$! kqB;efk	cZ(3;c~ҧ;*edQWXhAPn-qc<vGGUk*ԪT08|fF?x1ɾX <{NNJYo&YӞS	ſiƌ%2D?ҙ1øԆy.,`ƥ4`$~UwRDMsnlrDNrVi(沦El5<mmO?rUgqXi޻{lwt>2TL,3qvo7а&t']gxN0nX t;cن@OoE@ِ\E0s{d:U i$Rkjs3ޣܩpKDΧ3/ftlygM1Ľ]\25Q2߸M&A0=Q<VLUQ(hSM׌"Қ[%kzӊ15:oI/v35UC,;z=e$aPOHwBzQhKͷ;]#/g̥K]EHJ@KwpB]٧&\{yNW㭨5d1ga~ZZzv0[q$>ʇxqS
k"d@YۗB$C,a1Z8ÄIf>qE"lҺ`7גeT|r]xj=	9m"+qd0:bqm@\)@R~}xP,/,/欰H,dFAOΩfzbj'f	hU*V=rRqV^7TPG
v;PPWy (lo1QL؎]PP0XG4ݎ7K	-{	'#FWAg\5"/\&wqǷm^V'*V!Ixi̹L\.KqW*BS=oÙDx:ش0R/|kzIQHpG$l99*`5W9+<֒w;y'auAC((qhzZ9rѧRgrp?&22DE
Hԡ)WSyP Cc1^{NϻL_+1\UpwO2- nwHc$5Oq:[
$of
d}1x$T >swjoww?$T|wwUO1=R`|fKS# ^1ڙȫvcQ;(g3h/ 9i,h$FdZQP4v<eXFwFxn}Q8r>T!:|!/`3>~H5^xSpAl]蚋TCJprzPU}S~oly

fgN9.Viج z+\!Ku !!gsqC`ے4b ;
duK.5_LR, ECBP$ヲ&~qEh	x+BH%椮e;(ïTTN8~.{jkVd巹{奜z+  2\ -WJcX4\d]ͽh
DR9X#?:/;1q*g]6Z5;R߆DVoƼB BG,NaIZQGeS}Ĳђ\@j#BB
\'1YM"Co1*ڰ/+[3٦bl j}{|ګFmU	T*KiRڅWU4M#=p8K]li1ƫۇr{61u|6ܻFz5Qn܉cUگҮe
9#ZQ
Κ^xq83EQUI9C՜5-Ri}ȴY炔かcDް#_zu"0F^`	ԉ1?FA?RԦvQ$!.>xv̿@7f͞YNnW_T5 I0[<,j,ջHL1 폶κIt37zW瞬-iSaŝ-"6^W_lnp#Ϟ7j՝ -_9b(hjrZbV#m2*qtH빷H ʅ	K!Cc?2s\H,5Y _dx­Uڇ兀7>."ΜΠ(z@Î9.[aig.y1q1;6rYCvqCD@Kf@%v	`LSC)hOѻGU62({ɵ@=O&_F}0dsQ{9RmWߏ$9N*r.^şӴI4t$w]Ux	ȹOyX!l.v(үoE[C._ߦPr#y="ͥaW ,],)n42\8E7A\9{rP>?-aܴy'@bx &pE\>[z`A<=RVj#+m8SVh:ajFFQHn3E>X|!՗\
\V|`ks,GR(O2*kOzvSk
iG:]tq7ʽvD~_y}V_vvkxyn<~:}t#찤vE!Hǟ#%Q9vK-ҍBҷtOb ˮ49ku7gt5\YxRQN+P$vruE*qURiiϭj.OHd]z8|ef-jc6ӵx;ZkP6N>nAIjyu7K^ѽӨʞu6P[1;QuѐA3]Yj^l<v5fgtmvUʆn>[t0iKiʃ)ٹ?Qu_$*@ p6$DGzEǘ]父,&F\Ֆǡ<_z?#	adxRA"4mwQ,?
r,;2vo h8VѾT 'y2\$_H6\0uO%crH.[PeGm%
`/xcfg؉RǪm.&b$apeXxHJyIps(Q5<qo\UkH3W@t{;a[.Ϭ$
bÖpH_z0ꋡuw( ~Gx6ء xY=X8=3J*5+hh^lR|;`
*d,T#ˉNGƉdo3!^ؾ
}3tkkK
ork2`=QQ@MhdyMJrGrrYSHϧǥI(ʔ5\95Aj8jL0c%r"c9&lLt:a]b5	]-+tʭ:_i)/ BW.^̱x]/w/`[Q/{*|ld7kz0m@<wAt~D3{,zד$uVd蕽yp	ރ{=B;H
: 0>w_#Z6RJqi<2]sDN -n?7-2-/Hئs"7I_iܨ=GAx7[掺Np5F}C
xSy-J-&O k?Π*qt%pYYi
#Ba>;ucNF|d 2#{J
ت뚰$7(wGx|!ݗyp~J/?KKW,N 7]/B[dBh|K,BhnD_d_>W%$Pq++b})iGuVMqTp劮~n%x0wk57sck~+B:RIz˩uM,k(d8)2z'ɦު5{C#v1vfYC᭧tKע/5~Se)׋Џ<8-^%V^gOnbórTUqMyU+)`^,xa`{cc*GZPD7cgOPB~)i7JVPcrBy|7QZW_4joj[օ1RƵ69GԱ"hhM?'M8lȋ.)8_CEP|p2<rX>޲j+%z  m?Mվlgm׾t]dOڰJDlFha7R;{\G~fc+6$^יq$)DFEE2ٳh]~0'"9hOQ%ſEyuocV'o?iMrb,A"t)v\zн9WY;__K\_7!A8}0'G׫ݱŲKW3t9<]{Ka v[vtγgO PsE >3 M8٪3i|Ò&H73H]m5u6tn"ˆr5uˮF0U2;bKC' F](wͤW0CT2TXLqq/U:ǐs./LdǋK{˔x})u3~J/GY>}!&kLi2rb؆_qҗ3biR("
P6
)1Z{(ѽ/o)Wi.{լ[:o(Nxy+i[u$	٬Ԡ˜2PV1ǜ&_!AΤ_蚗(d4'b"5I)^4љC6Xӹ,X- &k;&aL%懧cNz𒔆um"_j6aV)*P"W.R}A#S&]KOuWD5,qƾt6FZ.sZN~|k7t1R=B&lk?ijWf׷c+K][Լ=y 5oF;&`lmN0.5=og=
jԏ: C!NC-\M
<?~^ޫyZ"~>'!_&Ӑ$.B{q\Qul.Ɲdj\NA>%mzf-N8yP/KHӨaGc6\g} ?1rZ=hZtp h.sԉ_;c:	0RVc/3TLC?׏qB.EUQY3v\Q@w<7G]q-R_
$fj=^P^uLn]FJ$>chai].? 7?'˯6tK//gta~sam7Ox܀}nŃegoCpw۽fgsc̎}܉N/gVV.{3$YC{N`pًp%ȁҋ퍭Ak@-.Z"Z&GRf}ks@[#yfWdD*s'j	9nCa[^P5lbɦ&y]hoQw@¼2a0дV?!:%9!#:mH"ëGvtPj<[ܪm\WW([9tmqBĹ&S&gmy5:$x<y2h7₺npks!i N?#Z~s/勰Xg@U/;E@A	~a`TwsQDo	jَ{f&OD^&[tхE!.QEPP}zAͽ₢QK3?BGٻjeq5gco:202ΐwϲ4eF!q:\.}LDQ,)97GHm3d>hb>D/Qj,_@Qɨov?b<]	xL;JJ>/D(3x.Vg2L&2Hg
*BR荏tOÞB
 0"IY#C&w7JBxy(\	T)y8WP G]@sn4FL%q2/({?_뵏ßːbH2eӗ׀QouUVkNTd*HMpiw1I*wZ0|:μj³wuY
A-/o2Ǭ݉>
'=ɰYer&`uuI2 tGG(%*c2j:cQNoC<->#(FoH0Hh"5Zm j&lZYB0ZaE"'{w7p{;ZĽWtR(~e\ُ8Ζ?^P'ڳ;֏yJ-,JW}"i3ǯSt{m2YavK$3Z:g.7q90Z:qڑ2<C3 ufGb,DFжntnL+rw+Lnrwz9x]F(0hnvlxAg[_	
6A/4)ǝ᠌Y`/.6=)p,0Nm,ovbqnI5 uڈdzӾ(а&&JWzIn!
:6ڧ:Rka0}`/'\[@S<%
2tFm.TNv}W>8hkvyr5(5v[P`>d5Ff1RJx9C^`t\f׭2Ca$KfXpOǅnz	)]ՙ\ROx_#!	fc
1¾-#](H&%u^}Qh^"۱ζq
/N0
Ľ9n~N![Rx(m4%6IzZF/nē?j6")6|[aZ<f:TmnN.VF'yUfB:n+1WСƳWګ?R6oP״_ڒjm͍T	hh*%|TڭDڂ;S 2DEy7%q/¾4iג^8G9:Z#C\1M9+EgO&n*MAihKMz`KKK0o猣	7GFϧ|I.`0N*Ùto`w<QBd"ur.}	"MOk
tzGv~mJѶ `vFG|hUD䅼eyN|WΠMM
+-;.xE}ڊfXjU?]ucH@:5KIOxOh<qoiie|{hAzjdP _)K[ (E%()4M<E=+׳|z2űܥ/wn5͵268Wq~'"ws,MTF5V?3r;w H-awsFw;w;~uޑc0p7a_.//d D Y2w{{r++7<W84i ]5`a2|I}/R>!txzcnU87x#Usi0%1wz+=f:8@(5nhAh; s\#b.<^duAK痮Ӑ%w*yJI|ۓ׻mI'hTW~4um"c]Q6Q31U!=%5INW~8;7v,.9iY&T^}LLI> 39w)rZ9cdF
5eu}5SV_6E	kmFlq6bX
8 xϐIW>QE`r;(hK"Vܙ*yx~U8')Q' t+z1LH 0[n'=ca*<"Y/GeMqݟyn'Pvq_|Awi	i*i++r*q[XI[Z^{>*@I~w
:lH~Wc,J%ļnZ>;+j!wDrX@E	]LqYG'1)Jٍt @mH2>wnT0B$I/5ل0txTw&bӐ`2oF7ׁv	P<ҋ {Vt+)M@Kvxa /fq7HB6	e1Hlf*e,8Agqspԏ39Mu;E~ٴL}b%>X vƅh43Novkv3hH6m!ga;4A]d	~!Ė"](H!K"S/)Ik#wQ2bZQw3AEE<oLS9uD[谇$I:LB~MTWbhmZH rCYBPՄT;什MaptFѯRAAr>?'ʯɼZ<58'RºSVs@=';Ŭ2k?>HEt۳F=41L{ÿњF7)ЙD	eBznMgie k(+!Itmz*IS3

sOgQ3E!G>F<xΝ	#uEB:RaQJqUg~Ug\?êܪθ*hw#c^yBS3:9^TC(gc+Ciϸj8*Y,JbT/-Y=:R XY#gNrđtYXonKU1yw	sNCio$EYBlFTi5 >,v驥PQL|	k餘rwL 1bՙi^ɤ*=l┍]S<ucIFxSLuЙ0|-p5A=U,efI+2AFx H񲰵[G627ƃ&r}Lഴ8Ub,B@T-~9"\ֻl4`JP[?`sLzV(!$`4EP
(޻b؂a+I[.^#bU`g*-!=I]׶g0l#,;]esp6̸ <ˋe]2Ha2b#R. BvP.-d2<KH%5괰2XXM]7拺˸BfKePd
 W'LM[ᙝ 	<WЇLGa1YwkGrdq]+ ZL؏uI&4ae*FtRѹCK\#4xn;qª`oxwԂ|l")@1w;*.~_P`3$W?mr%XDX=S0lf7vD9^gaCrvWi'zy!!eOYc.6az4te2pl򆉳Q'$s?jyt?C2xyH+gA-32Y Asa*`xS*[iN>[nͮji~<<4 .qI^:7f@EYOUh	ii6X-P= 9ЂII!bZx	h&LvWEU9ﴞt](Ĉh^مπw8. e,gl_#+:ʍWޣ`Vq7D43,Td:}-SËA~m@ӍF١ʸct<sK_":.08|ߴ. (g.NMiXj6dg'tl7&䞩[+~t{xŬq (&'w(kOeE!yui1
A		]9?dBۇ]#mh RIܞ7*)𫶸Р,ǦK.2ǲ4^)|%I.B-b菌E"+qQ|p>g-J7(;wڴ=y׌͸@zS)ݝA-k8CȐHVy~N\UM~i,GG6{|tJ͸3<rbBƔaRb  )vkp(kZO;$wv{Ec?}*gT7+͗ȵK0̪Wf?N⣁Kj17S;@0	1,,^
,⮉|4{' dZͤm/m;3-U@la|?&pB7YJ<^C1U7YZ D9X@EOp Kwczקllm<Gbh,GH	It2vI^mjkY~GKUve\&/rVj_P1G.&jR&+w\{<; {zR-mVMpd=O+ՕեHb1vSsSa"ݼoޠyݱo#oNTv_67v~tCQoM&:9kOCވ΢Nnfa/߂n}H+y)ӵȀCo+0ߔme#=^wzW*mcPզx38V8}"e;%hFڄ7;..z GX93	 %e>PW`Ȍ+GgVc->[`j+p%: &!1A-Fy+(?i'1U)pG@H3$%6pkKQy;h#8{Py<p#8v4p!`b<&+~ȮAL,ь04h0@!#%b\26s71f5.(|ȇzԃ{C\,'!V*@ž
E23!HJ&(@}fRR?ôc'&&:圄x DńMr(70)<sgdsM~|z38X}H+8 [Tr`)rK
5>;Daw6=a`.I%9EO<,00`4_a)Ri$C_:V=GhcTWvq?7	Z%Irfgw^a|49kx &,aI`FS ݸd@@:ȇ5o@--)D}6.;=lw^NQC$Z)<vPO6/QʮSCqVý1f)^,;Ii!B,}0@wSřPcyDN+sf]0aݩ*_Uqڧzwx=K9J4up6aj!ĥoَhu[R۷tt1`K@N[lSȺ!'qjhmz+rHm(z>*$'!FA3RŽqlvwZ1Ǽл&߱]'hPF3yQ_h:!a H$
ANɘNB#({8&aoGǎin9W ^x6|q4li
aiZL; dpT&rw[.u5.C&wbBmP#hs'rLtHg<bQ8(ĮɡgWFYa6DEųi	 Jx(jWZTT$"6ZeLFBpSNl9AS $΄qB{d#y~l垂LaιAa0- oq tH1^Zm?60ceqC4wC#=fIlM`$1C>{ިmWw66W./A$Vݑewe`}foy
Q1]ɖ4C:00@_sU0uס$Ukl,8xx.];֌s.S:zW.߿7<HƟ"G
&$)U#HM
{L:%	ΚRXC7 `/Rk46L͔~*mJj,B`ݠ" 4jLK޷=hn#/J-Zܫon0` Keֈkz*WTNouqB+Oh0i8"򖈈v[K]}h>蕎l'NW+|MO:\@8K屯bGހK};8g,LsKby,[>DF0zИ}|\CC8s{e`sٗ:P_$-:dO\\|I5Jq@k#CtK<
z81b?fBtEQ~!$l1\EF{w8x4>|N
QJhz%,		ln+G	WZpǳA˂p} rz(z-_/sNK˛e.4æƇs|i?l[ZW{fѡ1=.6.@38ZD&,Nuyq>Dq7vc;*sXʠA׌;B-H<3
S*RـT볡00 ?'9b,4?&09d.Vs®b  fd<Ekة^#We'qG26[nm)2%4xyV׷a䇬Zi9x^ۮmV5Pf$|uYPCW9p RZq3٪1󋱎/AMK}zF9P-%wqWd=C<\	jt(+;У(;3ߖ-9̰^θ kb1wP^8]\8id: q'Tg5
 &5Fw$!Z2-LJ("@eG=M?~d^gXoT9/07 I"'X?jaɆmh[9<k9UrԆ_ؽ4`Cu]qA0(lK-g%闷g=z#jv¾$F9^LM\ڎg_F*殎6J|~;d.to_ϊLN3~о-ֻOgbt;^Fp0](N9,~\ގO*s♡H7ٳwp$ql?Զןn{{O"y v^m`eۍ*lԁH*m<}`ta01MOWr9|>5΀g$ 8aOW@]fwNf_Ugf6dی}l~t/et3EldnBQ )o(EVRIbLG/`YIEtՠx{>Z4dvk"rf8]$=ZY)H0ub:>ruwQ"{Kck(uH3'1yy8	|G#k'3$ye}B;XRJ[=9xP2]"LOs7;tڻl"˹ 	_qm[ 'ĳ)sD$5-NElU6&qO	bAy.`<t
B$=D]Ͳa%~(
"AIԁDQ4N]-/7s>7gtۨY}vS0{{V_L=cp(Ճ"+-EVckҙuA21 xh(IeDBh;ӚM`)tS=PzuutjQӸoj0DLasaG~D+Z8p;nvf\@<Ńf8XC7?<vl|9	l6Wyu8*k{ТlxMfsxqs{lZJhIՈ
e`:/ShdM{MgȮ d~x'-SJGZR[pL۾7j)=->ثo9SpMg~23WXn*47)\N_2
9]%5	ɺG|F/\H
ux_	!0HLihQiDY̧s.3[N dPhio޲7D̪9Fzi)Hғ%myt=3cbblElxtguF#u#SD#B_14jnOTZཾ{gbҋY[F>%SG8KʍMSI6)4H^Iw} ixEHHƇ 0֫JH,bCeF={UPw7tEa)$_Zltoi9m{w??aOz4;aŞQ9QEu&D@tae}i*o"R_[@sűSY[rGm-=nq$ƚ
#mxU&`_tI'cuQ}ZBrp<2jt)#B(Iߥy/ʽFY%(fO1ڛV֙i
6ýDbi'/<1>yO_o7:i_X~~`?o΋	C<mٳVI{8.((&GԚh]^ۯպRiMG$i-T
XZP+K+K%[=>aÖ^ RS5%-,H5j@)8G#6g^"-gUߪPM}V@ۃ6:l)W
Z4bb)PE]
)iz}^UШetDR&nܫgA>B#;)It:IQ=^lEggC<q9h@(X}Qx}W+J=v0iNnIY!<;@I9):tloQU:Vy1_/J|h*i<yڨ~Z{4I25]Y;ߋ|QD*JTkkG Jfp8.]3Aՠ=E`v&؎x@$/> vj聋=tsFpi}mY!yure}:G}FmnإJ^,@ c؈o_`)<ȃ0@yUQFTM枑ǃV{?n ](&]xctBVީ| hF%rN.v˕J%UwQ:iz>1AO4ED[rUmomU9lo?AR_p0]FxgW9zګ'9T5K-
*S*!,A+U\<%xӎ90YhC@5wb@PES[^RVkx@ %#5COv~7\dAlG#6՜WK,oA+Jy^ˢƫmQW[ynO x*1`y0i#zDjQ$o!O݉0/LeƼFtVm#%[Xi^QF|].%7qU(g@>n+K/?_}ؿ+[6t˄u[sk{;{w`D(S ybzFIsT\͜@X?Tkx|f\?˱Obܘ!{1AGJX6KT:0ynt.Ƨ$&5EO~@VY2 2;09gsC3;|>_ "7 =6ͣ,%ۀ{wX}n)Kc2YFF[x Y	Yx5xq|@L|EPyj}{#؇=([Ռa3eCe.LGr.v-F%~@ΜSʔ`}YVYzUU(o	zS-)8"Fgv{DxWeiCd.4mɻtb!!z #ǐB=AH!}j@o{ !gRUKBtugFEmkS/_Ɔ^M=	7t- K}Z&nI|>W:!$&D8iaIVmS}H5ǪIH>tFKYS?"QD9ЧbŠOp̹!Hhlb^3A^@'مT^x:f<DR ]epz@pG;zxBa(Ze,vNtaFyOh#/魻{gLKfj!͹r~NxY䉦^xLƴL@KI@HO-&]\,;mX:lA`YO*8=H<Oksx",-3=6):e,LfZ Ň6
x\(BjԟrTv,quBш3nF7$iFҜh+r zKqa7%D Dtkqyq%s%r0W E]Z	V)$Zi19Qэ˕ܚu}ܮmLȑsar.uLbA/s4A-yz8+l6|2˂ZҪX+Wc,,HKY,u%iQHnБhŹt\PQ'id{
 lbeS2äaLW3+	f<~f7~0(zINa	Ps
%%du!(O*0ݟuvrp&0R)ی%]	%ouѭ`vVp[Yjtyf3(mTqyTj4yK"P0Y|+lwdq=ԬI/R<It9gZe}.C}kt$;5Z|AΥ9 ;l 4qw3%ºW[&ȏ&\1F#PѾxr㾾r` a!e舵	9EOȲDjVA@ 4:
O..L/{F:Aia}?$jecY0 {;ۄ|L #/qs6nmVwvvzWmz%`4.{:3Lrqöua8Hm\X}b`nj>K{)D2\a!aB?룍p]Cϙ̑sat@疃jr Z.㛂c<9xLNU/p5HH]t+.if	u ,k<V#7{^] ʭ0dO8,ٹveFS=4zCMѷ'9`.4\ 1%tnU6C>|-1Ҳ#T@yI Tf9sC~ǖ|ȸz%ǹ(*h%RvۚIn[T>H:2LFĈɫ*P"=K-xP\sLpPeF#CĎ-_ijx[ȓ	aYbK?
c!Ayٯ	xdr2}׹oG&_byN̦rB!X|]H5;{% RI#"-'l1TəH]e{ĩs|][Y#!R[Դ7졢wm.ڜm/A$I74"E}cUQQ)la-b	]Mx4e)(q9B sw)Yp#3P/{?Q[}
I  R!:0E<DV	
gNeeMi+'!2NrEo8w*sx9!T-KY ?v]_{^.3'i"(iD 5pXD2 wAQc&txbEEQ5!_K`9tDP,RS-%89} 9`b&iLY#j`RZ02o#V FLΞzslx|v}@"sK"UȐFj:e@ p'M7/Q
ǈ䱥cSE5Jf</s/}1n&
 { 3lhDF-;lvn^% 0s湔] J}.#Q䳙ef6?LԛκgHBѨ*Ч~- e"y e(NB{%+O &mjAA3ev/'}zsosUd~o&^uS\mt+u_l4}L1]ˡG-/RA4])Uz$/L_HP_DcWPԪq!H~&@0s
~2_\;/Yjz%Q{?^n7&@*HV=W޻ে4j[.DBйxٽ;ͺfu]YoܓP~[qL H(YY;b+T^5_'򣇏|9JZ-^b=w{"yl\懵ciQI,n8Ms< .;
J++N.AZ_!Py'qKݹ'|i%OW$>/U*N}󭒛;8{ܣUWp"7·TN/@|?ʖJFP¿$^(LJ_X8-W+sD'ӄbBTrB;O=#&)=]Wp[D,Q!n=e
	BbQ	!GeJ5),U!@MbLb/m"	w.
k"r,ˉ RpudC+Ed."T9Zjԣ"2yԕr5PY5dV>`aG0z0e[W4p%J7!ǚժ/vՊmmVR(Rw#qyck5L~mmfV^)Dԏ#ڀ8`Z^r=uزce0.^"ڄjt4_šA)cdQUKKE!u.C؉$`}KXdla]Nr)m#qwXT3Sy鈬-#ٔk(]դ?,EhL$$F+8jx/t]DrV@i@ߋ,SEAwUWoVn8UhS>,WjwwhtP5l0&k//ў6F䥨tCxRo/υƍTz3u2DO<7N׽}̀+2 Gt*NJoqO'C\PK=@X[ɛF@׭ahZ|ax<j\T"]Ha+Ykb|(mњo*D<	ofWM4}>o>'o~k45vݴ%mNrj͝z%S=#?.)kWǺ"P7]f8Nb5KLtY~
7{w+t$<~/68lc""KQ;P+CG)XCG]SCT
ܥnpi,G~]+tT B0G
)(i+~$e:+NƇkAX
@h(&#'#fؤ_[UQ oR?hyv>`?0:eM`??};{@{[~H1>#  Q5'2,c_8F&#[:ɠe4>8/`66w/flǔOWыJ:?Ltј~Бb2YPnfճ5_덌[4(Rz	]@l@$-i94}C;-xC־W(,͋Mj}{YߨzZh2R7mwL;С~#_4c7>lm>llԞֆvPk[Pߗ'QD`{ՠZrNNkm,	Йf{UH^Wtj ]P7p,WW}c}]pR
a=lU[kzOuШV.%#'1'wk̗Jaz{U~|Ƹ^f
cX{SۢwA4<YC! >S%2E4]Ro0a$i;*=#W9isЀYgx0#E|gj!z-l@;ՁxvmO79v\RrğNpD3qwzK0Aq<&!-B9^x@oR$C9mKs5} {t2 VB".X!^Q+ID 9zŧ&$C		ʱc;lY~9G^@hyiHlD0ޜe-O.g><I`dH{-'@ͶKFF71FG?D 8h6z4`+LND@G2tKQrB^Zv-h+r?7^Yih$d$Д.IkK*a@!Eø愔sG̍ס-9l"JNHH^wT8ݖQ,Oy
R׋jwwciz<ge lJDQl!e Q(A,>_ͨ7Pˈr."BrxA=)Us|&|Lœ#Sū @8?햂!ȧpxݯ0yo^ϋxK(niIO%O'T;^Y<9}%POF/L?)I)5My{yљ!9K
5a; bsٽjuD%h-|0$:~j$D\}
фvzqڰ!#b%D\^;jR"IoX+J딢
͝T4
n3T*uo TҏI?o)Ey<GTgRnڴSfI?o}׍]k>',(mttr8.,6{#VNl͓~_jomtg|B^S2/γ}4OACcbXՑB9T}GK'ʼ{s_totѮ8~_73<^zlI:nHJ:Y:⽹/2Ɖ=y~3BJhTzBy]FSQً(pÆiR{/Vv*;e_ZSEP4]S<PeSE>q/+Nјp˲|~x,c9 ',u6UtH"p0vR3#/4=J76K^WG$-ęe0e6q_y23g,y8w<M5KIw/γ}4O\n<;6Ac{ʤ}yĀ(1c2=d7y^y si&W$0nHsT&{s_R'wy8
_)ʎAW ZC|@f]I8xswA~1>I>"b@QN,	j"r_?Vب[	2?yғff̙\d>' V
i]ޛ<GgiLho|{SG~;qA|)ԻSγ}ԃT5N$2ghC\TeJ.X}qm<m9(<lFF; Y7E2eDdL澘whF+0}BT	wYc~vdq7yNuY:zok-;6%`Ҥޛ<gi3F<?Ќ$wMj:[޼5cRy?HY;P>'; G[=b*Nmts\v#7y6F	 {PS\BcRn佹/γ}4O}iwAe&L3m꽹/γ<I_̏v*#m4٪65-zoipGh~Gk͓~_Gc<.hyI?ea6o䤑3NbMڽ6wauU3nh֑t9Z~d\HH!1f珠g,+1c1}4HJ:!=R4%v>[}eR1d˞u$φI,kUER$|8
O.:bc
/Y`\鬘8-)@J$hfK,¼}qy2mrmML' %NAghL~#&$' g(-hA4ZxWt<G_m	3nHJ:	:⽹/γ|zvx`>GH<}7yvzLGX}_ኋ]dkrR	wu<GԀq3莪>u$%⽹/γ|0'cz^hԌZFB~4OA~Sm;8'w/γ}4O14%ƼzozI?o>ՌO(z_ݕB)g>'3fqcel*~4OA~￫-#IҚ>'Ee*8la,:c>'|x_i}U.[x{}*q#÷$^w4a_|nh}ڕEo7\\X@ҋ'l
K.A:/e,#qޛbN{LI?5N,gԻg,^ft^:yI?VĢ7NƋ,ޛ<G;	N=`灔%)y_Gt?%+&F+\|ը{hǡUsXWPJ=o<ջң8f~*^S
qE6{"i܏*;Nce4:yUmU{9Dҡ!RY$_nĎz2X'@JL,S';_|6]hEzXII	W[n9)2}VsFՐC!eJa'RD<k,K/v^-휮jך^#'m/lW}vcssmV4̳c:YlH^Y<u
MԼ,k,3NI, zν,ojEa[3i56Q	2jYQEpPuδcNDjɗJ:dX[Ԉe/Zt?5㫡g$fS4:Gc6mgfcL9_5͍)U4.:e]Bځ0028tbZԴ۝C6}u݃GqQxȪ]>a?uM,Ua	V>Ѽ60~,ۄB6ld66>̍W<S` iP*ζǩޏ3t^#9,^Wj'@nd5I/'On!\P9H8I"+V-=>-tUI$I?H2П-YɑZzs|gC &[s69\vP_H1"s?Αsxe479<G8"lHV!$Gm(kLO$PI"`(Tǀl6ǖ(sZ^Eǂ碿$_fLPLWIh8BsOTo"S3߇l"R.W1ioX xƑ6䜮`r9a\ހ*/⹩7>&Ǖ.7DN8@1jwP!!T&uXgpdƙ6@AW~K'w<i֜$x7`5@Y#ė:ǧRL0Dm.Ňspx|m?ȝU{UB14lq"	%+m5Dl.:%5c]H4.MCۘ?c5 ?;yln
dNqr6nz(t!h.Bl/A:J"|%Av}̪Sʈ%D_P!2I}1~TxI+gtWsٖH7ߪeYvnWk;؋dw^G8\׆7l{n%}S5%"GެU(~^qԋ#
QU?y0R9x> ZVEk˱!MM 7jmXGD$[Ơ*D$:-,	K&3i-҆]d*["hjoZc^?1^x1:)қn#sSς2<hYL]z2	ټ^ŉ󁢋;f!}|'٭X|20K!:g@/\.I =DVJӅ|ڕڌߙM= >2}?# mwjd	&fbqX7ؿwJمL5g[b#xZQq=XٽTV%`z2?G v5~1KPL<">&΂ K$eGA8h^켪wpLF?, D0/z֞dDYwUKD)O2K2 Xl m9@D3X<:+]@K@ਠ|N#t%@|5 t rqƃ׌OSnoRa(NQ	GS]B5( g̯^M̥
BUҭ\ҷЅS%qwnT\aubSSr3EknLcֽ}(mB}xdڊCa+J͜[&.X&>ː~IN8pcڏhgfS5':u'MT!ԴT((zɸ2B2@'ŒQb`re"yT#.c	;t ~מi(Jޕ:| =ޫB9th*{CTdN~WY{^y(|{z&wW;du2rIRi$ń9WUZKn\Tũ)|t4ZtN2J{ԛ$8z
y385r6;҇_j͖@Gai71BfL;<ne+\/SRyz1!$1F::A!1]tw y7YZjb
$Z*<YBNpmukLI=C9ZC'Sڂ".Ŧúi牻vx]
zuiu~d0U۟+"|)f $Q'<Ʀc\ZP(4PQ]1JgQGXg ui]綠ICHsstC:?0ay튙gp*UuzrBũlVzj韎ə	(!Ë	hvY8ӞB"qZ<6	#Yfw.Pm(e}|[;3svtU0I}[__cXB|UnPqP/VQjb7uwO*-Oj;(Y|c[?5tN[mgþBnU:a1Kw+z3vPK?;Yrr:Bvu[6UJ9/X,8^i!Ұ7֞UˢՉQZ/n֊\Oot/;jj.	|A)X60kVl)g.NA;ntxL#, Ȭe5ǵ5فϜ5c,3[re'ҢHw9ڄ =wjШϔ_ko~2Xc6ݓ/iV5AM !'r%w%0ݑ{]5ʽ0FqBQL(;"V;e\ŷtl&(>Iۉ`&zRÛto]Iƺ8#/
bCz*2mV0&\G8L2nfQ7ꓝ&-+q])w;>ibEH9g144j,tg'#,H9jXP1Ln}PDkBۇ"%9>KXҖUfg^Er+I1zD//Ey*R	{|R)-XS4p ʤ|NoĶeaE-TɪP>N'\->;a95?Vs j֋M;SVZU,i9!
=_s G:瀍[SI@f?
7{ w ViT 2H#?އV"s%Ќ`ft1PhM{|qL8p,K۔:=&?Z[c:n1PN*dȳ(5T㜔QE?c4{t%ᓬ*4lT]""ۥXc>Ƅs'Wmٖ%-45&'Y5l̗@A9SC|VxfzWv,;Kt%߱e
cP]B<D1T#,ziL^i0mPZO6qpe|3Γװ"OE(k0_nC//u&I8A~cew-ą1+DV[6̷8Q, -~1c7{ĄhNC$
085#ͥDќgEA>Yјcf3siwf.td	P7«R -QwT<pgA+b߽s7JƩUݧVtOTh.;`q^^F[`1}n屖@9mxCK|d%ȧ0!lqq?JP?.N%+ήnLt|{/nZit6!Y1GP#5zR]9/G̫%7fcEZsBYQÛ닛;f7j?az7\&dՖNE]t/?}}iUS
cI"FwUm4kvZ~P@"^&#-5}-7y<i*~>NPu|b/) ;0b>R'aS+qfF<v2|zյʏJ3w-hwmj$$oDGC?Bgx%ٍCLsѓ|ߋZ~	~	+ǂz[zV-/3KF+V̶LL퍹 WgcQ:1rssDq$ؾvN9`DPo&"5=f]\Iv=VF,n
:RhPA^R 6l2Ҋ9VQaf{0Z2md	[5aC`)X<-=mf3L,hUs,Q
t_{7J<	=\/وqys^&tVZGBTm0GU@Cbai4h.(ހB(]ZޒS\{@C}i$I
NC( "(|!}QLK(yחsQ"%}itg˓|{a
$kQI
~ES."g=2sʢqĕB}By~q oys+rtI}eѯrǣ XTK?zUq{7kE҄=hr4d~nj2QOJw$%elN5@R`4Bxx;iv₿51Qj Œ4yE@hL;KtÝ^Z8,/>Qb2[$/P}iXFvn'-mkEaa<]ϏŹSL^;zh4OP{e/
CSx;|A1a40%+TrIx{őMBdvjtokdف>DA%Ӥ"F*wܻ9h$%1*_9
z'*BB+wnvϴk-Hx"0sjn){ȫx>G꯷_<B7!Ss>Cv-hJS*_R`eac7>2}LzeLr2gn+dJ}.JII7Շh[??1 .ԧ,`!E'	px#6\j}SFA?4nǷ/N:YQO?^mT2ڧ?i1  EzeYSQ)h*1ev`-s>_ qZXtg)#	bUׄ#-
OS#-bI6aA[^>ѥX`T4քKa/Bh9Jy<w1[(caکZRm:WSõQeݧ ,'l`YaW뜭-1h_OpiHkH̃dNh
#<JUF2Җ)ta(uH&Ԗ
/KjT,rK.;fyVۆ\e55 K9l73`2\>^ctw>OYs}87
 HngƬ w!wh_˗eeXʙ!_4?+H?W goĔ?/!G8f"Kۢ55?X(ɄEG"Č*̣9RȰwM敿Kf̺'N)a)	f5ի'kNSʭi^uK,C	Da}iDaw؃}ڋٚSA0,O@l0|"5ӉjHP <A=  ݟx6&B"|9pjEd=o{%2/T&iԿ#>B 0Lgtu;>Z:qc>WPOA	aOEJ9[>r8t%# <RvNϓQ$z0i	%ACV*)x.1 ra6RQ7o3~XӇ8'#.uyu;IvnḄcP8go&2k/% 5Xɀ1Q}16	Xv;HۏO/{gzޫ֊Yc(yO70A*wV
(AISPLYnJ(3 Bj5vRap`s܃r!=LRm-vj*.,3zv7vح啈#szNp` {w@$&!kQ$bNXҝQVI7G2!i
:>']hN{!7ƔIyF=x\31Ԍ)L̤gefMat"NH\]*dݛ,<c㯽}\F9ų.VAsq4_~T6BMdM/inn/"ˎ ȫ%EKgVw}93Y*ya@L3LhRKA#$j9k@ۨ9*	c 3>ݯj~1'{:GZ庨NR4_gܜ~OhY>P)8tcPoj{͝m$T}H!j;{.,xcp\@:
&w+bBI#YIπ,OCAWQ'=r,<p#_$$vARYVwm>o7k~Lh"؊)갗ڃƂ7|Q<ihtsn<P89hx(t#́h*L]z9t_o59▨pl
A_&f8y'ܺ{҉CrD#%IRNFU}/r䑻1h8{4PA
"zhm1~AC) lEuPYd* N;Ԥϲ*xarNIq(A=L\ɪiY!bh+f?];!rP~t)8,c[roј~v13",/ozͲ Yʩ93fexp\G䱓*Q/eiuU:G>|
ǝ K"]FgK*yIj+І	BXhfD>DG+m@"ΐ@.lT#$1U@\B@y>[C	K[3lQ*rehO#W7è8;
ɠIMǘ&	:
=m"xCn[uu:C֜ =j_<
fnaA9MW(_ĲH^|
= Nk)Zsw88R~Է`.`xV9SL^XN\8[葦4joS^[(/žGjg$@IW&jhrC#ַ뛨|#IHV5wH&GG;ŋ$PP}rjg3u`إ5`\*{F""z"WV)	qM p`{ŇqDL\aEAKKDWj}|ئ ff~?Na|0aD6VL!WX}&fUTXtQ}M2N5x5#a@%1$A;WWP7`dN?Oj"[̄-G0`xai]E+݉}z{F+vv
E^?ԏN;&,AX@{sV((,O0Tlaq͢d,9&BPQyi/|jN6[:[triਊ??* xɋ WNT!lA-q={45G8}:`9HjѣGK[<
](<{bDgP/+ď/[K%8>3Q~҄OO8Qmz3lUxXFM9Ke[:䓱FѴdyFv bт/l@wݛu7E79<ʳ9/vWe.sU3.>رC!#9+w%C|BFݔo-q)?UϢ|kA,ڤǄ.c	]E,25|xx=޽?ݻݟݿ`>Fvr]QV{৕Gy
hQ2B/7c[A S({G_mI,)1M|qY<lw[zrO+Kw<履?\ikː.s1|W|hSWa?)CT3EG&CZ'>r4tA0c1&pj#S%.bi6{T%3GxC
M`!
P SQsˎAT˜is@7%VgP90JcRb4ΚݓF/юfbJ`l6rD.-u;Bk5(:-	7-AC>g=Є?fiL!
RYRIG`w_ysrkޢQ@f<lOxN1$rC1yH8MN1;ZHaښy,0GuM[˸i,cǥɑEQOGz?55T|dHEXSx`4	1HǓ$+޼"+G9h; ~ZOF`4)ݍzM}WvZcE[2;e8#siA=+aNy|ԉ.'FjP]:m0]1%#+Rͫ% c}x );Q@ߵC6B.9vs(u>Fe[Ѣ>cN2Խ35۶ ?$:8/l[s&{:oKA|Z~ϭGFp%lН)Sد~Ð0[[d97{Š6@%|=Vmyj+K+e-fVocwx~)@	JZK8A1lew(Htrtk*VSgaX:-/-D&fOEu"lhdM)Uʙ.Rr؎+|żd6`2.&̟}Yir z*kk~Lnto4NG8KA1ZRc3%ݦUr%pp!E!v>̝w"!͜ʅ#GX(arPkFo N¯o')!N"K%O ;AJyYX.Pâ$ rHO"׏kevSu|{4:jh*,GGI4p aA#8&e;/,jŬ9;<Tv@<[.I"PO5s(#jܧn&}gb5\ & YM&ْGsǏ$b
#gÉ2>6NFϡ(Oq^A=͝ƋuJwڇ\[O O *] Ọn~͎@q^޿~Gӓq,"ـ@. _q~]0zL7(ڣ/NAx	 t2&ؓ} L:ʏ-y

1 aHZь87*uTueJ/:ZQ;Љ"hi5Y_ؼ2"P JH5]:imVdmq+/zAƩң3{E/"E$5چcMX}2ѝFv.vJ@b)Ҫb3
Mm	dۣ:xWfvc]@nHU,
Yu-oxn]NqZ;=r9DϙfX*gffIǤަӭFh;p@0sfn6$,<|E&e7mQssnPeE_բ+Zpv=j̲+ZͲhstN?"9hp!;,%q`[q;\.s|;vT묝;6FS*&Q7aV	6/C$dIz,a6S(TG; 7;s:m%XHZ8A?ZY+(Yn}^ibvOwDWȞi
+OJhBrX^ès:}WߪԄtNEi@֬n;h!v:j>*S	5ĉ \̑.CWH(`d.r`!wyd]&_?5)0g
e]] .yȃ!V0+y"B̏(@>߁``;s`C!Wnߡ6FNM}l1?K^>V{TPƫL
;YGW&(֗?qܶDvG|0CxE3 3ʣ1L4'gΠϺ5d_?}A`R(L3L3߮oGU
m״E[FϪM&xч1R]ЖQ:F)iz8	ڨEBascUYa฾;Pg^D_+z>h'G<+M6rw1/NfUݥ| 䚗ǀZNrd_	IBzjOO/]CJUV/	 ` Ҿ_'>԰_@ɳMRUOg6yo(:pJt ϳٰGXL=^P9k 5ȲT|b;"IKMҹR+_0աJ*[LYPH:1|0yi\|u+<]U7ά	<6FSJ$ګXθ43N$tQدnISت<$DaP	*|R3yh9`pM{fHh_o^D;=p&A8C}lXN0Gp♉FGHk~, 9ݰ!l3dwlpL>"AX 0x}g0x	Bc@byo~ZE|rɿ9o{*Rw~p.ɗ"wKMN2{1(4,#SуF9"4-[āk7dUm_?1Z!յKHy	ikah~MatAM~z]a,#b<,B)k`%ҵnYoZZ1TEwBS?ٝ_{TsjBEt5:(͘DFlÍEKb)&T*qYĤ7-~7fGBp&fK}o@w;n١+ELO<z  >;iɔHv$IMېā>h	o #53bdC܏q:I&\ߌZd>ss4l:]ޖO'A4nkb?~{DyGSA7*<ZWYA=fDB۳sͱeg,gZUhgw*R,` )H9g#vb]ǨFB#(xdt3 g`.pte3~ X+N{}ݒwZ"7ɛ2iZwޠy޼WxoRrq\&G:0{)^o̸Ŝ4C\4W&	T&Exz]`o<C8mw8%']Qdp9mITr]4H.u ܬ^&
ȫ|f~= 7h
\iW3hw7WNu{)<$k2یjH\7O8}?Oy}V6ݸbtA}xyp\7o}&~s~WOYz|Bە~_zX:|%[ۍͽJnXWN@diF"OruV9a:.cدߠ:*yp~V:SK`GUrNSʪ3i?8!pKs|lb67{K[m5nZood#[d/oZVnVj5ln{ZsZS/PӳMtjop}W![oOhPhǌ;
:
2;B(VRO|RIPAfBqp=5jO4Ī!PCl(Y-[aB^S$11 O54D*y_:|#3~3i佳][ZM)V<(2io!UiD۽ʷ1QuP
_Hҍ#+c9/TTD"a@Kxw&enhK0 )gIBue#hH<R,霶C>H%?UE# xV|{cCE4QrOdv(A#<dZ
Dӹ->5UܓcΤZtyDTʦ=p"ŭlPO19d/){SI.%ec_eL].`0{pXZF?-jE_M,5_FP@	;A2!}wӒΏ+(5};BDvAzTmXgȻ1zz\36gwAv<ӸhSYۏ(FYnsTP)j5<?8f/ <ߊSOG(3Qv V:S7}A8`2s4!x0ǹŝA|vW
hnl፰}DkS;6sc7>}a\&vVtXc|&<QnFaRx 5%JH=X60t|TjyTmY6p,K讲#T_n>`sUh|3w>A7ќz(cktkshi'
82T跔|8&b	*,F˭nu	r|
CnhBXvҏC" I;V;<(.5[?hxZEуdbrW-I<&Y''HB,Ș:0Xı׋obE+j8lUGfgϮȼD36|dJR_[c8|ьiJEZW>1=K|1{/e	jET7FT^LrĦmɈI&z2Wđ_UAR^K]$1%&fT*8yd-:"ƞ	]`,@`MD_#\}w7wpw}~
Sn|ޅvPc"}^zQo`F="zY288TݦHW1;:K6>Z7v.U}| sjP
t3ֽBZ0KsMH7[Ctc~+?(E@䐅z[3)0jZˆ= M<H#F̏]'᥄KG(KAzfx!yEv .6+CAU؁l]t82?Bkã媫 }GTws0$lx4'4$3"%X.YB<.x>Ca[D~5V5_Cgo|i|C|O?C zõ(ݾmxtn쩤kYQkd$͝,b QUVb*1sD_A<ʗL`>f<EҢ,rKɿ#y>߰Iy	TiW !PXg8E n %OUZI^X<&_M,ր|)@!M5UhpC/.`#]8 | ܲ3˂0['Kg݂6eQ#G7s Uzѥl&RYUN.)\Ѹns2勴5A2&#~ӜOCB66;C`~3dfwplk3Qr:XjG<υ"nfSFזJ׼ZG] OkQՄ;azΰTF7Ks\G']-1.y͜KVwZr|?M}3b&\G<gnPR -㜛	aShS/-9^VɰI9 w)G8m>Jx/d-[c<UG$k|22M:[ǰ[q]@R.D#H[woeqV'{SsSk?~yc䶀*ՒkWqDEHim*ZyΝQnwfsy=xhȺӸV7,I2 QϷ_ռ7tx̶E5Ћjw'`я2, jM8dPѳ+g@UJgo~aadd26Û	FsjuӺ/)ϫU3*ګX!MKt]'͇HY0Qk~Uƭ¹0-m6	97:!Rwr	ӒjDJǮ,Mlw؝~o3YXed^G;fk_dMQ~в6)RDnx2G!kINCN!t+ayΚGP]W6#a~]L"l6'V#u$LX|yYE\YZGOsyև<M\SE|XOCx(=bSy =J]AZFrx
yaw	%	Wǔ@uߤzMaH/='h%k3
K2Mݔ+[FHb8gq*s5Fl&,pVtayLgTߕߟ="|{h*ѣ?=ztm|CAM|~GY6/R	cѨoT\z(]WEGʿ\erQ&6|(eBe>2(tP?	e>CUݤMx#z뷍j&6ܮ79~mb·_s>|xMa&|1_:]A*ѵ{B O:O>v˶q7HV"emjk5#wk7+ђYEg{%FPOU0C~ ~%@EʁN| bph/JI6L+CNrz<lCmܼ'?LQ jD	Hjɑπ;mmE:_;?5Pm	$=Zsj꠾0jͳY6f$֨%etnFL*il	7)ʓ>=], TxvЛUV[cY]k眗٬ާqgƘbWDsֺx"1#(x	L :lCA
܎`|2JP65xЅکyq3ɐ0@,3CQ{VJ0rrL67Q8u|܇f+]4G<?8Hq\s,Ng$iPJɎm,= RD6`@;3&*G&+GǁfT85j O3;X_XS=W=Wy	1L:\L(U#!:/zpz]:GSa'q0rkLac[!W#Res
YVcz2nJҼEGBJ~do1놫rPsXJ17xLRQ#zHuÞ }fN$(tPhG!wnѬT ]\^kliY-/B3%3\2N|^q)ny3DG{Lwq5|pVuyQe>_nPKa5P"7fϖ̪8d lgbs7jFIgza%S=D/;0,9ikg}&Mu6^ :16UâQǰRЋ+Sp=B-n4QvZmTw^ץ >-,9q2)^rDٻ{go?L;
Eo=5TuTwognLf>^Q$y;_:rՍVq92Ҵαĥ82ꅐ^-[2؈sԥj8_
L3PѬ_7ҷ!/. !w@L䰌|5a)ʓU<CaYKMɀ	;"jN:NsBv}}k309H:1~FA!:t]BL#zh"b\fQU/E#_a 9G^q8iN[WfJ[u=z\`n;F5%Po}QGQFעUoj:{|U+HWؑ?CjC8jrD[(:(Ū!0LD4Vv>	/TT"a@v%!S2׺Rqz셃2^v#X$lPˏ Mt>8;dn(TT<Aj~X)Qr=zs/slȂ<AUzX)>i:LWwΚu*PW"-&PkF<Wʎf{ܟOw*yI`狣fW<H<+-g~}'M,Y!?pt~Y#I.%ec_eL].`0{pXZF?SE_O,e4ȳ!}w{!g߯pkM#_
awjRNbEsލū1;rhg"m̪~|(6Oe ZQux],ܤX uHG(S6/Uݾ1*,xЄtb83	lan:',/R}P2hͨ mEm!ЗJ-/-Lݶ,ZsktWr_S}aT!|'=x	|'=x	|'=xq=x.^O{<O{<O{<o֤vI|P6vUclb1U;]U@҃iJUBvvѾRW%)-Irʨ#[swv&tmC< ZFmpyCtJ:xTUVIS%SZ၊-\FrLP)H\)G*Jsņ5Y5Da䞔y8n6I}chKʳ:v%sIN˔mvvA5KX&\xW?x7ytO@1{0Ax
9]좻p<a'tx_l?wڧ?m8{wu¬zڏ?FUu*B7tڨʁu(,=Jd\AI؍h|6`@v2UхlEE>ȐidDDH${8Ga7L8o_ؠy,#`T\FvvgzvB]ҩ!^/jU'КX5ܜ;\7dQZ,"Ԁ	z?;F
~1Зߑwd~G_GoJe'!lX%(?:#s%w0Wmm<%&0E%c(цJK͜W >IgU:UKeC{민,~:eNU$8xȐmB1u˚UbSԗz}数韹0yTز^f\_PnO,T?J1)zౡA)TY꿽.=_hv@Zꪢ$<K'OohT5ϙYEeW;oVA0UU"`0sp8n&C8=H)7.ZV/ J¿K0$.ҍw`,"ips2hU.,"8mTYDb0c?=m옹S1dfPߪa6S0+d@Fb|7(A19s#&[!"o9kJ[dG\6rbjFp7W2-"-3izuИ[I(-RZ7·bzŴr=_x߈=<o	(ƹ:W: x/r|/6rq4@.V ޯ{ :%Tj25Pv91Id2ӚDdaӀ(BDin>sM8\CtNu;hFƧ)[pwZWQ_ʀE:Z'`t&JLF;fHEm}WprBB;1|ЮR4عtP88i<߫R:G:D&V-yjHh6AFP=(9ລ>-B/zPgMc7Z31@&@ɩ?EL-D1:MPWӕ[+\&Y<%I^jEWe3V*L))ʒW޻ে㜽Lp _4˔zs N%SU"h<ќ#q<=`w8ŋb)~@}8Y\ì"*9ʖJHQw2bu3]Dv6wX0;=[tQ0'n}\ÁĠ0֋reFlHŴ=Qg|a"a?8t-W5	_*8Y R//|姜QiRRz27L].OcRHj=nMY8+wQ	M{2e_&Xnו="#LaPit?3j|GbUWr(6CL+MԾ)7!R'(S(/#Qj4JFDJ-uT|2קSj"Td\8_"9$IBڂȒ&<|ie]+9RRI(RD,[ŒW'9b<j)$n+aWzi$L# *ڽEx5E$(#	lղR}meӢ>9e6#m9M!'uKq VWϭՙ[ҖWxΦEi57DX>;Fl͸ڈ.zo$V* i'D~򛜍Fb1cMo9eT2Ӹk=&$0i^s9H+:lư{W84ĮSv?vs]X+
	WǰFz>)S-VQEטl8ϫ=U[!s&.{aa^f\A/}riB7Q&(IMB@u+c$0JLV͓
=<	I
)H>Xpb/gFT3T-2?|P4܃^>W43&vM)gdFV2~fYdGg
t.BhЁ M;2C<M;OŞJ]9݆6MqG]dS~|]wOݯ5v6j{LljSq7(-{<A-:T}>PƔJ%1Keԙ@4"[10DYs=02izV@POKɛ9Ci,2bDX2z}0ƵiTQckxhAκ">sANo'ů!1 Z8Kot6~j([*rI;:~M|=߿$iS/~9SjZjHWlJ+nMǸ? 2:Lv{UsZr>>ݻG,#U2?xt߻@?J%\#F1p6LAT|m'*K^ݱUcv36{5}x>_>|T'u_R@P	Vw!g`}CT.5(ײЍ srUՏik@5Ȁܢle=ssW1W͸c߉jTu(Gˍ`L8qA>'[s#q)QpIE9?V=|̧EP#K3Kf= ЍHuڃA-9w!|I>"T f30Xf&H5%G*,:g5ԏr²~ջQi=n(}-uRJut?_яfiū(uxH?&nuv}~alH/_9I
 l _R#X:fB"hR7@$GqzUg7[76Fu}b;r'hBK%Z~D"
PA3DwGOWI=i:u)NDͳ`E;NBc}O!`\)vQغĩG_7F=2/@>"Υ[V;IMEQI=Rz`v"㓁*p>we9 Tݦ3iy=&4DޢWx>+|%o7@ًA(G{2#,?@֡Gn>h'vx?|(پU<;hd|xSb3)m3g&8Ao-+ 6$Shz!в!!"Ln7.$*NBGɷ%4)sI^` WG08YFd+!ݩ+q{unz~9gBrcqg7䬲~/۵Fmoo{"m8s/#vOvHM[tBl7"NяxR/`7=D6hIL)ևt`KwH $&̀nnap^e%:ݨ	XA0G8ؓHq'w,u*:B<3vYûn~ [I: 2Λ.1sqyl巙 >HUjy]RxSx%v!iM?B N;ГE}9wu(F:	[EG=?$xYU8ပE;C]|{ed(r=pdgVxq\uǰ,a$FJ><a;邳(HXfz Ƃi[2nwkJos4uԭOq~oev_1<)٦:dX6(ݲ<9e8
>1pǽTwq\S2п(GJK2WRqWdO%^~0+~PlA*C(uOI\£(7҄ bXp`'uq)B[5{K(
r˩^gΐKMBɔh:ҹ()،)Yc1#aemuSH!Fim٥3Y󩗻
jť6c3z*"MOw|r+SXӘ65'a׉2Ww+$~	GNY O`sW Ɵ ' z5~~m]{nbJ9wt:d cpRj؅ŊMz«:L5ݯrJ~@XE|n1t&Hqr+$Z_M&<#0
u;MD/Þ.h8̨y\%rHRRF$ڏ!!	%+$@Gk`]\jV=k.>TB<sN^ad'j{j$9TOrw_cL9[ZSrGq|s Q焯(-HTzj^`8t/F5dPr6O4r3ѾS`ND#img=7V;N#(I:q8%ߢ_-lkg=so/Cߢg-f}u>i%t8}S}t۰js??n:"/ptD-kېd>_:5,ƴe7sEt~q_a8PA< c?v
u0r{GXKW'7Ȩ-6.ldvWz)O,$DYd.P;u&Iemn?5>N"7'/@|"z|yΠKf9EoI7~Yߜ
q5[Δe6U'\GK
ĳw&mX}W֪=X;\`cHao29k-ߔM#ID"::Fz5vxfRHVJ G}HK{4d!	,"&`tLvG^&m?{"}بϣ|.EῊZׯPF027`V5kԉCI<#v 6Si"ة/@"Z-k).^x2-ս \}ZpD+C9R6/rрvvV4zS|Ӛ$ga? 'wڃng8q15FȀ;vt
d;-{jВLtWN:uVFHA-Ǯ`P8^X*C 4e()v\:]/X B^˸3&!*sÑ~(l/_eURvx~#)%ÑY+DvXk2 i?ωȻp=ߡ4+3,0lU#VR2 fUA21>c	ǁCdtlWXn̷Gkh>f; ?&W2U? NFg!D8^(&XR)}ר7T8CkA`>7oʝV(+`3E q?**_Jy+;e`?Ц:٤3u{H&P'T)g`CcNEdT{f'گon03elW}:2C^mhK#9lxS]`v,us`D8Wj<"ǀs38ǕǋQXY:.crxu9,|2/
65u7f~xl71"櫝zu񬺚ڳV_oSQ;lV;QhM 
El6HQx|ߓ&wLFߝIsIq05sxg$"[ef.3[89uk(.,|_qɯ*{ѹ?
:o
|6QO
pw?q%(vRyepL8)NQ"us9pAo:x8@	B2WtWX*Nc"W,,r-.[]HۈKEDJCAk\;e()tw9q}j1bEkgMK$~1N.tChP3,erԚSԛSy gbv<#Ez[Ȑwd BG;NIQB,uџ2:=(MA'rȖHH^Әe D**,#Fq۩1bwnu֛p0rC6@9Y8vňG&2|muxgl-[gǀϚFϦdy8dJYUZlB^A@IƆ
w3HtDsoG^]t` +,wpddy)"Yl@TOv-DQa]0)ޝ?MY>e9|
_8ot DׇIZqX1ñ<30%
=(x٪nܐn/$~ĝԍrGjCۿe	e$$|)FI;ge*5LZqroWĒsҮDxB%J"1fn-A+iF-D/@ƕDؠ7|Sp^
EYo0pY%:HGP?j~m!^3VƓ?{n7ˊͮRѵRf3[#dkIbpIz$?1=vS䰭A*hQgZyGYFKűMbOYBRG~	Hr:TfH(p0^/"Xu8\'BG%ksٸΪH	ez(`X@Z8I	pGN948Yyq9x2ڀfx/żCQ~[~|2!ZـI87$&ufDdJ+o^l׀3jaB9z8;b}G#Tar'%+n:^*Iw?A2-)o8DԆZE2$~c"^(ƅOsMX@Ò͛mhl=vʚ6>j8>֋jn*9?\;ѽ#o$u(EIiQ(G4yw]qrgZ;;5JH$x#nH|jΧKԍ"sGg
hIrCg3Ŕ#lDo䬚z}yL֙6&˘s.]KI,H
{D+SDRO2Ψ<S'Li?L-LYƩ̌'Ƌ)ę٣%Μ^3[9^Q|_"ң#?%Q*5JQI<R@hK(pKs;ǽȊnc[--`C-wi[#oE)
e7I%1T]S1(KCA'W% }.yd7{^Y|x59[?o=IgV H#<Rr!YᏁ;Rki0Ȫ;8Hya$Y)V<Y̑~,5ˬdFz93"e0$YUgw&fGHf(f{;(d{&il4b%i0
7"iEdwts	~vݑNFsPLZP?3JÇY*οJlUkJsw56GKeUVh[iWMý7ۑ0B&%4CA-=Gk,>
=ECX*dPef؜HHAwNc1>@>Sl2R5DrG/I\<!s$ŭ24Y*I|FnvFb*$J؈m"zE9("*~ @JFZa:
~_֒hL%x6P#rI,Vgίt7Ay`zkos~sY1D"zrdYXb57E}'Jf[ʡ1< Ox"7e2b|)ESLx3J2
\C, ws%WMڢ>.E\VI	ӧ=8Ќ]-N Xܑ`-l
tJgu]#kSTA[[2TlO?!u%-RCn@7.z`n7Spm{'n䩄jkvVZI}UZLp4<#K/`2m'ezNr\'&CMIҎQ'ޛdNoYJiy% 47۵iٮi%y#Hd=ʩ
F QUSedr<^qte*G E\I\@}p̩',i2`mbpׯƘ)}QD׈汩UflJz,Qu6{t&ELzk/
-4=sALRSe8}w:΀|'ڨ2^,x@	5U
ɶ_7φGQ 0<&X[0rfJ?^\l^P ʲb~-dE x$=I{.sO4b
`3ST6HG2޴"XrrDu* xbE
Ү,º64[AGEPIpX-u%;s){.ZRi3_N3-w3ft= =441v?YׅX'ޕjyqec
"	Ra]q(|9oIc9<jvGI!El]x^1-]^p;hcF-T5.2:h8z+ݫ{;sAT8/u+e܂RVe濣3iWt*1Neї)7tUB6R:Y/M%'z?|x5mQۆ{՝\{Rg^seB l{kj^0ϫPR1Y]]5f**Wu} s __a稂ZѓV6hݚ?6*])nӳУt +ocxG`aSwNӓ-Su#|$ߩ.pOGUcq^~3#6ٿuZ-gdZ-{XE|X蔍x$zbs=S|J#Yk/mPSeUHX,L N%0:ک|e`ؼN^gzuֽ-c#
Pm3g&Øv^Rg%sL=$}$PY~i3Gnre}P7VJZ˄%-FڽBG5x0vF8Yp*1)";2)λ3B,/!-`iwٌ-j$ahzqOz'H`R\S褡vM30Ïk>7
}[}JUm+]J)㣬>l^25{$77@]fǔNh^w| "lnJT]|س?/a5<Ӈq5NGuQpMIFV*
"?T,IG0)¯Ί:FĦ(
{pաT2`s[P
kQ^ u8reI=R7-3KEX^=[ih0;!oiwtw΍CQ ]Ʉt
 sy.fP̩{;[Ŷ6k?1W xB&Fx []U^Cċ-1:iSK୮^paEOhOT8Tλ^řԏ+[÷m"*znﶶ0s,k0^jz]M
c#kyhR|W|Ahm_b|XS|\)ZWkPjV&OR7Y5OTjуhџUy zTmaG3)dS)NsXsG +	y|kq(ϟΨ?<9Nq?1,i CӲ5,IJ~c\7.ӕ
{le&1k9Ol@
rM@pW]jJ꼫W++yZBsTWr4FGf2T灺5~B˪DIϱ,r2UV{YV늜tme8Xʰ''YAl2#QUSbӗyW?:/ϥL5m$Bk%wNۀ\x*&]|m}ouy7DЉM6_ǉW;>>n3
͎9em	Vu%aonx}v$Ta	jKyU_%||vA
40n{ۛR&X<3ãm;Z2:vnbGrVs34,(D9
\GXO;u"<@nt\YnO,"uvT<f.ݰ{2rpğIj!Jlj1>1(ajtcI$8g<-bS$xT'HC9#kb?Rm]>3u$	 4-zKO6'SD)!xA21=RŪ$̉Đ!)$A,MgAOkzb_빪dr&k wSYc]6hќG"YU!
E_H+H5x)7eɥpR/	uA*t^~wccrm6#혋qU*T<ʊX.2#O_zVRǥdfG&ind ړ5L1'!ʣl,	R<RYld=46j	io8iV)P7>UDYdkPRl~8Oۜy =XMi#~O8a@,\_僃WP9d4
(zƳ%oWW8/k+O9I9c Z]]冇8I୭"o{PEn7kGݷ7Zvp|ŉ+m<UP+E.?z5GK}18rsGX'Y8#4qs%< >C\,XR+)ɘǤ{g0n?/.6:F|Fª#.Vc=ǱY# ލwӼYt r0²@9@hF?˪ܩoLsJuot0vU}5f|\#9=o9W/O)D%<=	H^{{wiZ#&ʰ#SHH/SH|5;kή兯%Z	OF% z5ԉ2m7vǰ񦋆[lBĞa:k|җpP\_Aٺ-ya~lVqoq	H$(H~c*Yb@pSm2lvA(YHZ]2UZ+=aaa͠\Vy55ρ1_HCL+|/W;n$n@ּ2-WvYj%ƌGf	dy~k-*8Ϋо_ۍǹD8qO}Z#ҡD]tّ!_W!p'nbPE<<sg @LiLz}uC-bL5fɛ$¤栋V_lGZ(hOFh>AAW&v❏eTzܪ A[~v?}fl:#Թ3vT>"7!AG 
0YQ"4C(8*+,z)Bܝ*hjQaƝ\kur1FECOۼ(
*{6꙰녯Č!R4<'z^r|i
jZMn{ok]#e{>Сh~uSMj+'tokg'1f`!Δ||d03ZVHux9۪VA4&܂g'/V`/V񚕷X`qn1-Yׅ@W]M=e.[b8`ά#){ ,>(K&>&.xb)UTKTһQ=|ZB?Y	Pe]#"2!,1"LCrfb =V+L= GJݦ7C)TZ`Z"Q?3t,cک錡#O3UFtSAy8XX9ehwvҖ4DV_7*w^c"R[V4b. -je6YIn/vܽ)-@2ÉlhZͩUi AJDhc?GYAk4$7o5U,BFt?ԯii~tϾ~:iwRm`3`IvË֋Knʈvu.'y)VRT,A#9t?zxNHjAA4̣0I:xv]=^uc8b=+̠iz>Ր@#^-_R^΄hYMѭ)GZVt-1:U{/cv1YI__,{3'2$?b4qk1M^z/k?mT~XU.C(
JXu#:db0'EBgrrºo\[XKzަr覈yb6NBIs:1}!K.cbEw#H	^kdߴ/Q@N<QӤ$7a5Y{>q#Pv
罳`A?H6<(}K$)nXNxtcrhNٌIT^
u^tRtF*ɧbZ4.<HkW$:g0]6|hbAkr;k6սmځZ/0=Wn*qG7C;PoL(vG{U~tH|6ҩ/=<q:Pvw^{sutRsGlwpPsI4Zn#RvaA9%IjqdX;(IhN:*髒pZTu0{\-1ˤG:	>Q1X7랂~nM?~t8.K|2w2|oSo<gMTrJq!~7aҼv!|dGxl!.$n?	am:%zGQpeSᒎdCaĂ1E9CЃ+vxT{_GASz&C+5{HRh0!̬X+٘cZM{OO+ol4Kz.J{C97g\eaLZA:)?~sL7pAl.6z}6ɣ8Wy^쇟')Ӄ\H:Q})<#N3rY7&OdC'1YNj'Gz|TY]'cɰCiM1w툳usqbn~j-zJGi!ܞIlfb,:mՒa"^d:K)qR9}ˏj
ܩYu+qB)0蜥V8o{=T<8Pg&O{.<nÑyθ$<zLKOh?'>q2M=pRw+>qJ2f0g[2~Xٌ+XrN.CWOӓz%MVxyOORdxRP4`NG'	}&"7O'fpQV+kQQFi}YBN|Q8֦ayT_<	UA#qUbR}Lzw4|8sg_(#KwWןFH>9H䞤ϩWlr,J+ezfWߗ_dfWz(gkF1V7	fm'MeÉklbN=$ݼNX"#/LTj$)ˋʚgqy'a_ڠmDh9Z0~Ǜ$Z"_xd8W].]Ҿ=4h ISOi?k^<4/D1]h'WK\_5[ITGa\MoANUȘj<i(խe
JJT8Fܷ.XIAOj& %6fm@p$ LTA
-fMEJ,7Blp)ӓ:b?0=fFF)"6)Rs`AƻvHhJN'=0ԜwcLk4;]aT0f-ǣX)L \z9yZ1kK
28;g4B!`hP6gG!?g!	2e贐f d猳Sd()KMb+1c5.%rgƒwOռ7I6-gemMe-i,|N0#o&cZPr$=,>		4K!RROY8ؐhKD|}4ڂUBM+}\ỵAEF(SEI`=Zm5i\\zSm'&^B$6(^K=z5@l:m׼& HG˺[zUgt 2Qظ':*<%襍lqEb̥Z0ѭ-34r8ɟkt
&OgR̔$4\iB$"*t<z0={en;H78MdET2dɔYqIFȴpMBT#JBg$QD
VyȒ1t5EuRC H)!sr6-H(o!Oe׻+2lƀXy1ƷFQ0R/@:_L& e:f@C<`Cd#>=+yAtVc4 _ *JC	T(i6;  o$&qވYU	cRW7{P{Zo͆aum#z#|H(q-cQ[JE0zr~!)|rjww,k3.	CN퓑mj?4xx |7LLoQ;hhүV˽!ٓ{.ȱUc4KN|LrHI!If;`|[+{ۯ96ڱdlYSt֞\ŦaΔtݩ,1Vc:ۏ?ͧ3赍NlDۯ!FXzFP]I<y:n+׽o^xT~/zɓ[@F$+qУֳ5l惪En6fNQH1rݠt&`6A^u:1G@9nGH4	5,{PudfL(Gw5ݟ4f܂2Jgd:iIhqsyR6'<gI<o,+GZnqYeMr`㯫o03=g_WJkזYÕ.T
R"]ֹHH<a| ,G8 eͿ뷽[]<Ǽ!o=n 7<ulqxs#r|\)«WVK l0i,Ӎe29Q7CW-IB9=1G-s"#Q?5h{'W:.qf$Uuz֘~$Q{N4$KE)R{v:A,춲\vvFmZPgZDS&Yҩ[&sgn~VՍ[	O:9 D"V⓯Y1K)i}(k;UF[VWu_]g͠I:xv&uCSb5 a@pQm]	ϓ[(=ʓWg}R%.);Vھݱҽ{ ci.RN6Kqev`BŨ-z(N1n6@4glf+aM yQ]UO~X+Hf/R5>{x2NV[HVIwSg}2MLKY1#EfB=X;@誌␮d7P@|y/vBJeKIehZyG<R}lϋ@yf.nK4b5ckGX~lk<DaYBOή#rbK^-5b[Y8A)l$r9ɟr`
0nYKdt A5?/]l*~n93}ȷ~|'4MqB׳1yb,io(S4ER0wtZ>WN'gҟif_2:6CfYSZTW=?Yb}l߈=wĨ)w>vkXrfI	KN@Sw<p,;)T E\<.*i?bQ .D_w+ve,_JHYw֨o*kSB48ÁtOz^irʒ`2|'0OR`DIM?n"'F{T7,餋|Jt;E,0` =NK{1ۧ^^kn5%:AGi(^FSD~#4AFElblˬs~Nշk)ceݣ&b:%@tuPƂyA5Wac|c*pCz7>nxv0MTJV-jڳMG!RI iDYH=m*x7mvBK=si%@ۍO!xUL@dQgLP@2=N{dxV"mM2	/ǫVMkl$	RrR"-[*Y9A';	2!eC/&S%̿:p\rFL/O wng@ kO6&` 0W;#q6Rd?@ _ĵ:*\!&I+kt߲BR_s*6<FHR.PFl]s=()&l8D1zAxߠ"TǔO82p"@OT*ab&)wqbcbwir˻ۦj}=Igٷ~"3!}9ڃ[C Q?z4܂f]2y(EF<	^[@_.7s
L-vw_">`?{i*7>yMx**C*2m^ٶimj4c횖I[BVГBM4T[4s%%wӤ	rl}LR0>Aߎdga1$c?z>еAf---653ҩ䴬:|S˔*<n\`UOE,@F>EV"f}8z}-!`"fd	W9   a @wQ&?9I?kDZ8q89@ZzQ:*7$㛉dKiVD臒<wizO1˝7eфl2r"HC5Ms1/)Q9q	%X;2%3#DX"9_PW(hlDR$5}h3DCQp~
ff(}yKS۴^mJhکo6Z2-V'}Z^Ns̻ l"~Gg@1?(z_Q\pWB xm'
WȯzApU_5뭟;âo89,Wѕ05d\n"|(YzpvrB),v9*ӑ|ov2%h4usxgQds؃#v_
$`s,}dH
L^(-0<Er p0␉=mm7Ps7t0.qLQ XB|_[YY+</-$;')}Sc
8M/*ZM~::F3M'5j-`8nA(?!g)4L!)=Jī'ȱ4H;^
.S!S	RhmL/ Y	zGZ"T	XfD;{ovC]_ҟa&Gd\"T|r}LT*:@XgRw	ɬInqE!A}Ǯ<,'J@m)w u"x%"iBGe$ɩ$tAI)77k
Q)FHKp@ژ[a2@cb <	-CVM D*4C
MIk#{<4M)		g:!I2#Ti-G9R'9˥`Oو94[?^85-SON/cdϳkf:C"c<M"Rg.JkSqx'~m
n) icZ*a	HHQ-r\R-nc&!#{m(Wҩ%ѧVu6<ׇK+d _Za4hoh0Aq'KK.q"e0v78oWx e~q&nנ-^+OT6̘և%͕^MW,󽚇x0Z;{AUkNi:w?$W'1`0l1/yO-|\λީCi$_kf!݆- YDA{ (QHvawDj=95<?_73]NZ[ov]l.S5-rC8NpV~\ct?
ʅ®WR-KYaLOQP҅e(?/O'mP{~w9Il(YWICV|wS3J&Ԡ߿=od5 Dp<bE0(<,ZMz6	"6Qٰ@%_\DK2F~&h9	#<}Ƿ{S撿6[\A#u\/tYb*p>uoCCy#BD~#&6ܰ%3Nn{FzE
r7z<1iҨ:f,/6O1ZƔ"jl6_r(hzxhPw1sgy0t,hu,;M|0>w'Ahz~tlGu1=i;npAp%t,ȡ}%URhGѽ0rgH_cњ|9*Rv?-v/8٬ՏS
j !Yfg+{\i=p%YlLrIc<<5LdLsm!.:3 n:Ig6fo)$)ELYKq{4S6Z+f6KY_
uK&bayZG{i=NI9?0mzӨ)Gwn)'"*LNR,/
JTɘBSbIq\<ZI]%ޔL_NDAm@3~h(4aarC1ع.eqG$`2D*G׽A7Rԟ9=YKdPY^0`侳"i0d˴CՅ߭.6h>P$@ԽWoޣI]]CeS7W۪:w1o~,Kg!\gvzz3LXVS#ޢ0E72wz\\N|&ɞK9(ð>:<4qn}!ISU%,w=ҩݵzvUMQ-Mr.sXfdsv*thy~QZjLw3Eɉ
Lw= t] }aDƭJWDANyoF:"q:	Kse|pDߋys)Ƈ;"3Z?op*-!Kjpgfc0ޝv]ÅSVt,]ŋCu^^h(y%̉zW,*v%$.7{'9l_!{O2*s/quЪwf׽nC,mzxة=T̤~5ޭfhgg;hqZz%J_ܡGwY/iFgMnn)rO8}ԟ'P~o9+]8Z, n_*ȅћ-V@0xHPG^(xSsH9J({\N@4SXvMԋ&m<BY5%V1eSqx	&	0(?F;?RAߪz:
lP*Iփ#bm|39,K:*6Y!?8=7mQ:nئ<=݃v)0a/to.dgg qri!7R&-0REEZj!!6dBXf՗U;{I_,Bcq=q1'R4
ǋP!F޺Hn7Jh懗Ԙ`50\"K8~=s@/ɰY_CۯOY;8+C1Ɋ=L!sa㽚	˩/[gq88Ģ!X48h,&CRD૰k*jSؽ\)ļ]5Kܪ~x]=MK3YG"-5.z9'+w!"@?aE-/..ǹ~6Z{KJ:$:և
T3jFR;rJmML{\̪SaG-IQvcPq5cY4q'++7+גKd3wd鱣*M	仡CEH4u[5{fxi]Ei|f0>G+]B=e ݵQF(kO
@5`	w9T`@p-Ez2WCf
*(_yF	!(BgmYvI]k]li+(fw1/u2pٮ?^h+&ㅿ{iz(UE+*Z?HMO⡸p409hۨa@"*離|ex1)&3[b1 OxwpPsX?`;rXJ{ث廃J=8ü☣ Mnm퇧GokͽFU}S+4"]=b4 ؕ*~NƘ3]p7 iOk{ZN#`O	P`C6E6	T/Fѩ^D7k)x㩒A{_/%˃jɝ>OqZ}2YZ5Z`j)ks
	CMc$zHN䊃""H9p;## eVMq0(S{d9ᥲ3qs&<wddUY` ue^+@((fe*BX\q#_)=@gڣX҄F~}$&FBrXEUse-cM$e;g̡%R&Cjjmo[pR,7N.@[On̸N)` 5?C#32H`6{Q`̑L1	_E5$VoT`bB#qbRu`W-*l?foYCA_{n]w{Br9i354|uZi^!ZL(0UBo'COX{LJ4?b2v`m:<ME<lbwH>cnj#v~lzQj.v7:mw`ۓMX*1DIG`Dc 4rcZ-#'JcLA.[/X	<.\z?m;UQܿ# lVjc<Z|*$ R;Uv"
ߍD`\40չX#iLjs4~_V
zxnMYM#HÃN5Tf40ѸxD+L'djk5~
q!۞-#m9iQ͝{vÂ/;*ZX35*ԍC>ΈSc%:m7~~uHf%;nA9z<D+hHQ= ޯ	8jh"gKu}ӣaoP~I$$6kM2># =1FL-/Oaj+ˡ씤~Xė"':?
N f9j¡*Dt;fX#)y6KnYb8A ?A`7W.2u|B l餋^jDhwM9p%  E6bscWlW:V`Sa cx"i 1pyq A2d+Cl-~b]LпhQ?YE*CG#E4F`YU]Rm|Ə"N.\"ރ-1n
` @QhRyl;(hx٥Ҷ ˀ0GIcDd0Vĉ\J#̗`I5QxJ5'2T	81cK2`̻<<;8S&.T]AS1gX",o2Wq/,O|Y)qX,-.G>ڭ/,0xzr%:=ݛV(# EY*54ύZ"݂ޯZ
ƍo(gk}ڄr[xM9Zg_U*4mwN:F ZB{YPl跃j+lx觴e=@Rm1ڃ?}L-Mϣus駆aR$udpq|du;y/sra3	;CnZ~?}$̌?;E+ex

CŻIgƍ61:
ɵPdt4OfNb/cVnu%?a|:Q~'`7=[ߙJכ0;Ņe|9^}z}O,6QbڍX
QE-**K0n0,1h
7ԍG3.u6P}wѰɰ]vZBW{q#Qo)v1Xy\)}sdra
9D阆:]@_X<1aؤsqπn2ar#UvḤZI:9nKIӕQ9WdWG~D&Nn#?vWCbhCsW7LH|Gֶ ¼U@`4`uopB'I$qve42K16O6f`|9* <8N?:AT'0`$ltQG}d/((S=cSIvP*_<yZȭsp,,y{9/*q/rމ/orfZq1F-~"~-~WR(/0/(/$AD>	
`s
,=^Ǔכo8?#	T?Ӆsn!.|=:=s_Ӄ0Cba:V$-|t7<3uT	MuhëWؠ!Ʈ8=ɰ?	2v*Y8B:iYzmBఏ+˕Z,,˗RLW|/:VE&mikp9jȟH9~VVWLIyFծc^­]&CdM$yH0LvCcY(i ;(1nZNy</rzfgS):JشPʲ##muhD>o}-Xނh&ԀDc`nS`g$zr^-*{$y8$ԩ %&~j*j{[gfZRR#:P	V
!I{UO}dApvg?G9r .LCUOlrfLc/M=~vG޶J^&t*L˫]V^hOn:ܩA_K#AMy}Y4x &]\輘e-	\.?vvj[dlEP~^YSiI?0ɔovC |էo$-A`_198aI@D<J@Ep+,yP-g.jp:UL ?IEW3%yzG.?_G̭
F*FlJ<IR#ScN<_3=!_AV&6J$DCq|ODK	fX:2ﱷL`u͞Z6w~aUc#QI	w%i,)h;&3)M"8p%Ij`EC-73J^ Ay`ĳA+BEN#.À+]`
jCӃt
6E4p4V[AcZ<ząd&8Dco'6=E Ԗݠc&N	Tÿs;{o6ԭ[G$sx3ϫ%%8&((CHAue	T}^eH	e
 hT9씟UVw{gMIׁa`¡ ](K'GDRp`u_]8񁾬UVV𾯬UV+eFJH[ޡ~ #l
u+#yD)HLuBzU3  X)eיQ2Ff"(ֈw}'+mr4tV~^kάSvg^#R{hiXhQ?<l>S|}Og">P6h@BG 
·o"uzR<a^ZE/5@p1}~0"BֻJ}Zͱh#:i>/\)IdDO7jw@㤶 #gI4tHBQ 3dKEURHX6b/PdHk\9>V}D~/NN,N ȋ *CNZw
f Amwwsoԇ4))iʬ8j tոm[-z4trdPՆ7	c;]TWm Z^r->z1θ{|)PdOIw-`Og&&qsKNnD(\@Gu}0/y$%*m +}1i1Z]@9{g^9[b9ۮ-WȪ}/<ߘw:ks"ϥ״耦Ռ?w9d#jxֳIB.ĥUK2ScWՅU7-H#RWcWEB{y= e$y,e\5
!$y)vy|bldQJkOS]]5*ՍwժdI@vK/6,Т.Qb.|)G&:)?&΅~=zxMи'k异vq\`FKX? p(#~HzOalI  #!ӏǹ^`bv*#sxg&TXpVͺ#3:jLVVpS$L
R]hkGo0OQڢ##ReP^SLYb	H(̠)Yp] wZ T} e S=Gz
m"۶\Gɝ`qNz͓5<*Z 8m2~y(КIxҬ~JTֽ\,9œs#+U*T'ecU''zAoYlꣿ\StպS'rnW/VH??OVr(}UVoLtjV?-XbAG4˨ZhiUǋŌ7b)Ҥ9m?`֏P-?ȭkl9h%*oOH~6igC $s81?C5'vt1<gyFxrqyu EwfQ-lm_y~?F.*PF8Rcheu_) ds@8 qJER	ǅEQx²yRCfU%1#,~Jء~s2 LXxTLy!ZgXzV|6^	īOf	wrv%KSxTxX~bg?@'(*.zt }5|e^x<mn^TV?y?yʋn^n--iZ<!9Ny!+ɪR;"f6,$;?G{%Աsj=t`>Г=^ЖicaՂv9rYy!g[,,![ǀŲ]Un<}FYyJ/EFWn+GvՐ-j걥c}N:b)rƀѺZ-z}o+\(('nqhy'ηV#E{ wytFW`%#l!o7>|Y?0)`ߴ^yxXJY3_}~g-bI9I_~!}`)2`9ݗP*ǰAQo
nе53ҨSek^s%>-!x;m/UK8O^:MMgP}!jinDUfIgPjHjx\F|Zf3mTP%Wl~({Ht1m.EyphφǙ̌U6nyIU1έ|^b9?k 6hy:XAa,*>'q|IDʖwE|؈qcCcO\)F 90E`/s塻,WHA523a_.scb`ݍStMlIӷN%&](̂/(-gE~;0SaU ř/TSl@31W+:STͣ+n}xy7Yr9p/و_Z9+ouaw':_imH<2QbʚW'yŌdX>͸%Xh8A{zo7[۵ębSS;*0bɑp%娆*8Rj|@8tYvE
sEˉHCrIW8U0nWbR?Ż
 K.\, g|8b ;lhd,ULll6zwoz0u+/TTpt+tUȔnG/1(ȔM\*A\rt:Dc:au'|<GbO3mOO|.
ïPY7e4,|j#!Ww(rS%7QmwϑU5;T`{8O[g8怸	(4ˌ١F=k`1XO!$P`yM"
*w\n+\ǴHs}[_% XpEE*dwOl40P-7SZ= :{[\hnhU.ţQ! ) ή8xV  2T5Ъ^%YpZWQ䎡	󪎓EY]	;!`H@>71m28J8\-^DQ"Ql$!4\bȵO֤OOIJYםxצ\{nOl!ҺUB@srĸԉO6)^)yRvc' sxMCbHڪz^cp:=0dlە2E(z~<9n$uC/1YbY͞c%4jb(ǈ>ўCQR`)6BA K	j0,GML>LN)b--TOQu=Ǘxg
	ryR9ѷU#?S(4.
;'Q
)LDJ={V3&BJy*iK,B4pwJ,i~hno|e(&MUwUS_?߷^1&ao|8&#ٙ@!|_PL5HXDXSϯɱ9"A
zLy`zQ+q<Idbu"^]߰q.'.|c.ſo|9=2gbcO$W1qj!XF>B0o&5lm%G/ƶ{(WF j3VÎpSR%=Z$r [ӕ%7zI$B|Iz{R𒬗TN_P}"Rz=8*9T./,q	}]`n8>TM9	R$@CVNdre|{:<ׅeW`ǱWQns(0m-hwgwrAj99lf&ļWt)F0ɫIrމ5S4N.)
,T]JNn#͐00D"hid"fE	[LN{^ѩߦWhd W{8NApUh	٩T,Gy'Aۗ($kÝ5^cp?"XR7&ZyVQd!Ȉ&Y5:^?s3sa6~_09 3q$p&\Dȣ̺k)d@蘄71Ccy$ڡvˢ]Jvr8Zd6gnNԪruY߇~WW~Xpo06YF*Y'Yhlc,I7謣*BbS:Z9P}aLiV)څް4?'7і/1s*¡@_Zl%gO=<Wkj2^-xޚ[>wcT>C*(bcOFG;He:Qd3V-wypsok[B-nf+	`G!Z9Y*SɐI!*NdX'rp TTsbϸ&vm)怮BQlzYQ͎:Gxe{>F3lInsH$J*M:!/g'Z(eD.M$>u)zl hM*p#EEa/egt\iBP^l2^?`PlsLMltsbMbOyã fhҭa\F
T@E`48?VfFXj&( H仅'v5
$v-9mG͵RSVF
(|U|WPWׇ*c|wWوT<EpkD2(gXOaދ{ى)Y0-X+uXqZw2.&N2wP^qƶ0Ƚ6DW̝chƇ<I|.熹3>.}[P+r1_X~]yX9b4BbМ
c[_G}xs'JR;AWֹW{68>^L/Vs0;|#FGHYƐ?IHY.?XdpCw.~4^F<}͈bר89
4ٰO:v"̃Q9N=,yQ^DJ5PTTǢJN!^@ÏOb=2G	YHxMJCv$Y-!آK>< S3OÏ#تn	rJI-wJg2`1۶M]?K, C4&')?$e
;i<d(\z~fgt{-/H"rG "̝R<9"Ž.7`EV>vpS
"r[8/uJDICXdwQ05.믯΀ {aIؒ]	Y*$9ߍ.+ܣÉr֧ZlV""u}}\Zz
?RTDח𼺢#F<WU7.awCXƅM`%yvMzxs,~ned^SHޠ!톎fX4	Rʯ`T>aeX.yKu}~	"RSv0%dd@D~aDsa@@-7kkYSVp,ṒfziЬ1伶IyA,4N2!eA]f#̉-Uzg&HqKhG@)FI$Ƨ36X̳%f`<\~z7 x/ 9sKEmhq24_e^Fx`<a#;(Tt*6vtF(BF$ΌO&۱ŰTJaM"e<T,y`0ăLI%ҩaeoyI^ vx3,jZ0謃{죤c\ȿa^#۷ۺ|/y
G
NJAs*L/'P+YcӅ+u7DhV%co/:vX@ȏ*M.b,1%4;V;r<PA2mDO)Q"O劮WOv& mk"6^^<FuRLQX#a
آ9ݗc^,,nTwd whѣhg$ ws%ܹYGDZU"jyV{ՅvYZH:+۷݄D%OE 7W0>f*Ɨ?bg}[T^nM;6/rrص8mZ+V\,
3z[ܴӝsnR8^]p. m8
;^œYbjVQO=:"bm_FZ32je1g2^2=5;n铴lu [1֕kiZBzv/T1<PU۳` g⨤bSf(ѵ?+'%f*<j*/VȲՂU㰟FAЧxޫBn*LB9$nrWx_A[G/aC*$+,;q'y
dYx	ҷ%OM/tH3YĄ䬯V|~xڻ,y&|OD?YoO:</Z'M0dAW/eu,yWc7	䬠	)Z<0I{US@	Hf*a]w 둝>B_;"d$nvxwgB2kD2܂cت`>.}\ﱋ߿kn6`9X1IT#94f1(b3]@rO&OB^s#"ysQAP$';$'\i9ou941OkR:<[ :*iz_R[יa'S=+A[ȱIsA7ӖtWRvgJʩ71Iz9Ʊ pZ"¼6
;l^i;(HJrvE&)|.6b2T"dfpvLX)-JF+acjDSbcfB9PMt;O0ј6pG10$t*=b#:v9L#)Ck=WEcWR6&oj'9 gnwLFJ99p#J."/brpL'r!mKSa$ R=.-Fs"ڟE6!ՑG⯡1._Gp$TcF%zl:׀!1(sH8nl#(B'O(L'~N`_	I zh^wl''! #POpw-ҤC_;&PvA7"/}?-rQ,sW^QćMJ9n	O Wqٳ<[YY2aPs߯؟>_|oe{b&1G:~jYEYqŞUwiŋ+]klC6?1wԨ6Vwu݀G?c*":-/喖5| >(C|NF
9f/.뇽 pxbaPL{S{'_57ͺ桓5e`A:1\`GY χ1x!|͙/NdG(^?:G>FG@~ǣXdaAQ>>dkv`XB=JK׎8%Rq;ma3f#[(qZvdWF_(}`%)oϞ <
yo4ī"@t^imm7[*֫aLϬjXdz$ZQ%ԩ#PA)D!/<I?Ou]8xaԉ-Yo%Dq=	.s:rz.@_eCGMIS50^mMn{z_~.Z)ߋ.ڕsMR1MkA_cy`y<؆jϹ+#M-qdTfVӐqA	5dhqjm]"JhWz~)d)MYx&Cd'D퇈~1>0CMNG,䇍tLql섶)9<m=[+:݃6n{~cᇲ`o{n]^L,}l
[SkmmvUe	LW3⾪m8pFx|x^ZkbHoqscoXo{F)udХO+s WG;[-ndԉZ,GaiMWZTI
\7[cCl7NaSƃmNO)]}hfof[]ow7'߮r "Q u+{jqDPcy@֙܉oqȄ1ܷuC2L,t`~xUJ ks{E>`|dA:N&U^~XR_o6f}Dyz'9zŭӒmw;:dd&ҟy+r8-cwao#>'Yb-|X,",NE!&:	#9iQoXfQSը%$LJD:0 |JR"Q[F<t&$5`ŞE|[b6c#Qdo54R36
(?4loQ )$ͩ`>[S>J,eNkpIٌu:>4(BRs4	$o2^GSZnB ?d֗jѱeX>Q'diaEees`2Ew7IjP!Y*b87Bh֝)Tb֨FO!1TVFO'P-ꉵ.w[&0!>n	zGco}J*ѵv9T^ⷽ0N<E3=Oj>z }bJ+p0YZZG\f01fIgK=D

i
|(yz5X!L/im^1(cbX.\wvTlpj99ŖuV;dv5f6.
K0=#$a)ցFDtrm_V=%k%uVz΄?(P)'Qhk'֐WSƼoƊ'p
BLj]-=_,p R̊:*';߾|'M$Lwhj[Ꜥ`<X=I|U^ouIjód&]&lj]g^>X%	+^8HܦW9:[Mjmv`v-qԫڀoi jf}
?Z#O
nzBT$y'!1dgs2>XHJɌ lArrGFyQRdg}1E3>mH1scڑ۽#/3@_>]WB೮<g[@gsxw3w;s=w{qxzg$?NPKxñƖ iNj&KDGAqtfp 5&.ׂ`JUm[]9WIl>(&=_JmV(kV-ͣBW\qbil4^ !'B.z;DNga	>1|Pp?xIݎ$ZYWcݛ^.BJ;vRgA?sRƦG AX	xϢFOX2_g::.Z}:NS6RԠG
/YCB[Dފ%x*2(0q]A,gD3 BLm(^R>CS$jQh4]D<EI󂮦E؁ca%e1#|JŜ+ntkXZ;
Rv@T`byP,yp>[aLi[|Z~x:d'Vhʢs*~ּ߳$)"=)~=}cHXV%P})n`^dwޫPMGk%M.> +|kb!@Pv]t>!	ƈ1	 B˽ Ѣ4]I=B8BOF{@$!*r?b.8X'GYH"
1y|}=>%
*6Gw\5}Ws(ILJ 4.ft?"M_fJ8LZSxۉ]Kݠ9AZ7(jQJ{2f1h<:m0k.׺DʒtNhщґhdQi56%=]()ԒTLZ$FSojkVltk9]mλ-嶘T [djUi°wUEl~Q
`|HEzfLG^t9)HvgS/P<|S?<?Tasf!%7"oDLNKK\"pqOcVaNpDX8CE"-Į̸X<Gj&=n/'oD,'ĭ<!ʂNjڻJX]Q5i=IprtG 90Z*Z28Ԓf*;k\}(N(x0,56)!#E~6$NԙyUՌ͂4!5,qoIArr;,Ds^;y}{.DU0]hTp2)n<_w2hȍe8n/6DV^ը79b5eU
D1b7bkGOYJir:{O/wW@ՈExmž;ptZB_?;lUJns#I^FκS<9JTNht"U?۠;7\{54΀]D"Ek	ooT f t!fvVJ沺d::-tqo	֢2A#`X̀{,k=\aK:ƾD/<;#5{8Ny>x,6Mxxa'hiW6˄$~z:FS <jz-6NzϽpp|!h	y)NI]%|X|ShZ^z+:~wE% 𜢴Y"hݜ$b̋%ݜ7eË7yJ­{2រbS;3e/3y t[._Ļ4^Hp-niE~2 m!AgKQj'd-_:p?}JS*3knyCؐaV?S9-d'lͬ:lhɬ\kȵ)1S7DKݒH#FMyXE-ZSM	ayRDїv͢R-?M.[OYdQs72Iic9EVS])N6 KdsyMd 4yRMj4I2j~Km,lSR!['$ 'EBk)eIʖ!)t0CdP[6G(=S6d3/h'x*G| f_~ʈO)&BQɊCCML7`gJdwb}`ԝMB?'P01^L9kmۀ^G]ޡfBaɊ}}N?Z-I-D(8r@mQM> :2l0߰6BȊ!Lh't#NM8=&}T$,
|tA_=EnIh%2tB/Oqt]
^ }6
^1&4gFN4C#5o'GɥtPCS.<oBibnk+&%2,6hôqzWWrgnQg,DKt)!pK]%P(`0OUOW-E`ӑT|O?~^/ZPt؊Eb]
`ٍ(lx<bH⺖"EI^ߨ`6V'X4!1?to_JJu~LE&[q;'XK,&'݂ÞߺTuyMj 7J]:TqTIhEw-VtMAWDYCex	9[gkUl4-]S./-g/z_tXJ%ꡞm%)LXfTT!نD¬pK#tap
'Z|eN.\+{V0=>,/)MU^O+B2ՃrYꑵb`E{DU/:~''E{4tY䊐!Y頫5fytMlqPkL$MCXѐH==Ge%$Ŝ^$ȼ̨G&oצ}Q[,3kZf٣
eA2Ztg×,lsm X{&()űr	)@Ll(`:p>ۥ*ɡe͐L;	N"huaR哱CG`zocv}
Ӏ"qzMQUFpvxx BЭ%,IDL 5vltB|<ۤ%5~3tzyEPakȍsXLWi7FUyY%c!ㅼ\C($\i
&rrݔkN|n^qFC{x"d*+:v=ZqR_?ޛ^qh[zmY*NߌC!t6*e}R[) "#	3O.'F['T&Naa^+k<'+AU{+sd}f~NT܇8`:iɳt1JeB[=:e/4sVY;$^ 
'#w{
 g!K\]hs3vd,_^>ҖB:lgL%oX~t`⤶щ`-`᭝6ElDZ5Fas+X/d8Dr6;:Pxs֟WiAcDQG+${02̺'oÎsk#vBhHj»P0mEAp{rVjdIޅ"E:GHw~ǆd8ؾ~9niNg/\q~&e/wd G*t.E7]apY늶Pse(C$S΢dȈb?"f_\ThքqW%h>̒N4{*RP:|Z}H|ѴrMӫ?4rF9E㏒QcJVW@(Z!0$in9^ݍрʛMxBu3q[2Sئb`w|~8u#[ʐ0xH0)<Qm5+x~6B[:&'MLjL"ﶜh>QrQm1vtfŒ\Ġ"@6:6m;iB=pH-A`n`քCSpDIA?NeR.]h\ OqqYW(35l,$-Ll
ocX,yO`%t2ᥐ:B7ʴelA@y}[G{;_Z{׿=dDc;z[ڟL$)jrSQ("W"~Wm=*B(>&`,ί[6޿Kd07:XfUh1mb(y&VG%aueė5m5<g#`Pg>d48=%p<IǄ]Ƕ&IP07.K\>࿏o	RgL*OԺfrg.nz5&%SڍnTGtow:l^~o<]RԌ+97ߊ).^ҥR:x@TT/j#Cn71.)GlRӟ}<)W8~,438uawjOhz{ p~L[
7Vi<cD
9R[=k?{yHlFg]cUƩۉ=sl' (m1I$XS˥-5
J,̲dB$(ɐ&8hFfrZ2l֎~^%޽ҋjlBeQeULQ;TZ[ab'$VvYp0 ̫TfwlhJ4(m-K^xK4)/\Fg1mw%_HsV,!J4E{Y1?Q5%N/,Ta$;9qZy!ǶkdakQB%gQ0n	QmR8xM"J39vQv:T*ܞ춡	7,#@Ks2Ř"d~8PlfRu}\ς+!5D%ᒂKSy*@yǌ]	$]]KSB^R:N V<Q[/-#q%F6'{;cji_MQ-nz)4
%s\虒/HBNp`o$!X4&ӊH 
˱tRvJfВ.r7|#,+[乤6CkH0Ȧo\*{L~#q9IE in&Xkj]5;zZQVHM}=4]=eIUǌOX(,UsHt':zSx_Q|czP[S|mQ= VA*tw6:	%_X-*D7ۯp;wClש_O0-qV}w>;ZFvH1]c\]zV/GluX"cNl̥uA@p~>`E#_8M4mhCð*z91HUtSX*`̞=7ssY)<xIͣ=5K`Øby(k:9P?ᑄ!_zOjb8Ʃ% V>6	q9[K(5Pᤀs
^MY{y-UA7sx*|Oç,
a(|dAO:04s|Aa]9PG.S]a5ZR-TU<c^lr';)$cKg4(S;_Sqy4ܐ8z_l0KU^c״ 8MJS&л0AAU	H)5:pEC.=xXD&gƕ`3u@$3>df(ZtS?pR0131xohgd	n5?Nl	HlmWpW' $yD#Ɨ1I8<?|tYo9*M0=	0zN6y~r99tSdX0gS>eX9#3ޯ=\K{,Q?5ޮ
y^)^{eq5>d8=nojuR~`` YIr:)6j	u 	-9O#KIZEΡk&e:_|Cg+5)KvD
%X{v O4ژ#`M.IGuʵAy$_=o#\dhy{XߤSh>Ub&
S9{ ʂK{6-z<~Ch\d>xogLۜ6s;4mwHSR4lLK̀b!eKeJfA%MAիlPsJPUKlS9YꑅpwFL)؉dB88|9Ȇ}h,];6u\"5*2 X%	ʔM&fs4\baKLNx-&$`JL[U8ZԧɵN6+Vl0l4KJLͷur;wUbԎo@t	\?%UݳC7[ QwsZZkLj=UR빪5ϭh5\Qt'~a*EYe¾i<^@T_1t F|97{L0:&6QN&TԤSSlo0k"$j)!XvhcVcl'\XSآOV
JڡJNz`Gr@XRv#Zg?@;3dg1\)(N8Zh1
\C5<v+mQ=RP,~uE& 4Ka,}فrJw~Э)3!&tr_L\a1S R9,}.a_ NR/w:z:Sh	(P2`76&܁Z;k̑.[
S$b?DJW?V~=9g7zjNyIs<YE$Q"m*"<y*.yǵCTGA[u:@[9jw'Qx|탦 ;\8`m\a[%T#(m/"*xeHQ~t0/B!iy\˕Jrg['KdӧyƝZ\KgTe>p-9URu?_.;C߭)5IuSҏkpdXeZ9OVOJtWn6J3`0PBB3ϦjG)ZEoE"uh`Z2ZF|D0mъmcQ8m˞r9K=fJT s_A^QPvd<EuÂRP5~xv1!wd"_殡>zncN{AH3S(0[ut3A8ҦqǒFBO`	NW7{`x<}{+MUhe <%i{b0G0>t
,lW0Ibs*r"|=e}>:{wXDN$PHxnv9n\F8-gQr&F}KbcOdr:,İo]a֏)Q7Fo Bt3}mȱEO8b=h;@udAnm[NU/")ghGZz	'駨Z%e>BQgЙbȉ~4Q%Qs;HH64?'&c_PY6xwVBZf,rH|i J8AvkxmKO.tD+Va`>1IfYaQI`ُN J{#Fo?%4gxX2~;Xr&&<_h',gݎhRSMN"Ole3ق4ZGJ_jeĦdr
\I\Q~#A h)TlJ>f*I'3Љ8(ԵF\}X@ʨ,<ÿHTw
`"ifx22
0r!IW΀j͝v 	/ed!+3O)^8^)L&2(&`DO)[hD쁒ٲ`ekbiDNDRg$di\`,A\&Uw0;I]xz#)`,\AsU"IIB?taTGH9Ć:--y~&?4QH+ 2!9!6f>d7ґ2 ! rѐ XvځRx/a&H"[ѺbxHbN>r2dPx.\D+:(y?6WE~jmi'иjbI#BE2Zp.VO'`;#dTC&#%?I8qɜJF~=WYt>_JڥQh _,(%]iuUe?9Mv>%s^!!3zbp$qQyQh:	~߹6l\Bu:h9<"C@<>%'$WV*tY	hmJC5֙X:U3;;Y)(mTfGZmWY/!nּ|@(59Gu&-l8&gjV} 4]jn/6|Ӯ)vÄ<vĆ
fb^g)^dg	rxf5IT\a. 

xjby+V͚F,.yBH8\)%@\ډH3UN*p kOQL9(f=Yt\SlEܢ(('=LFĉ(6md=pzUO2RE(^TlP%,]n!ͶEƩRNe1b#DxT,]:9[^+y#*:qW!eE>%f,W*ywG٠F
ꤼz1?֬OGK(_D\q":A\݆)NO_\Mk6RL8?Fr̪u
\%\<T#K+m ea&:oj'࿸R܅}H-Ps=D!D	NITuZլ!M	ëTWPO̜[шhnIwtD%}A^Alnלɭ>I(>
<~BɘSuX"뚺n鯚殨;:)9:J|tĔaƜKc㼘C">̯I?em	rwB=iƙd>'Bt"xÏ	KLBN&70ߌҵ·^Na%vvRЍ+owpc02;tuب5WM.~FmWMQdJEsSVThL.<N,*jP(CȍNķÐA!Dn`K"v;]B$#H̫jzHWqIf|YᥐW$D4fig},*cGKLPH#Vt<[#^dݱNOA	:1Fs3@K:&nq4)351bBǸ;^H+"J:<M+myV4	?r^n&[)۔=	''A;7k/q] @UѤPgѰ;騌vZ*;<wFE'}l۳9E;e8ccs+%e%ԝ~πȘkr)O`>y/pp?kEH2&%{[Rx:6reƩu.0Z[}S5eۑ(AbT82U:6Q_\*ekbP	5Tg`:$.%Z&.^J<^l.V_1z2݈U't+Ó?D*T;,m7?jIVVo@A~,.!.Pxb,yХbl](E&8UlV
KB^YOU>[2l,vamSX|E.v&/Ώ4UB -c,v11ԑMI)8(wAnb:ErkAsSCSKFJnpJgp>PrFKV!{w:NQg Q5?Q2`nux_yop|h&keibv
UhH1'zB򲲊Yh\IqhD0k8Y'lOb;A8]W"Y9g12dD~B$P)X(-EJ{)KwfC,ZLJ: {mm_O7bYu=O}i[mX۹Hec`E2)ftYM\d=Tԥ!I+-$r9d+jڹn6d7açTPcR>Y|mT.2ƃ(cM>Lz,&eEk~7%}4KsK%ꋾ	4XlD0[MV²~qY
a]5IK	ڣqϡ؅ck@vWe͓<%+mYb\cd"<rΡ~BǖW:p5kdg܊S96L
	"cC4zTٜvƇ,c<oY갾|vljcvfOjtEtN+wSɇ9 %O&]'q
ՈԉYLWmP<}6W}h3wZdnѬ
i{!fPw0B;d4+N ^"pfa{
1
{!F.({5fSo\e7+i`^89zg.C:O%z<CeVu՘f3%+hgs$WV㢭͠lKx8w嶭"P38ӡoX'+ґ-;`-䈋Ć1Ծ01`0tF'ZuDQ"=xV?(~c0`cWyܧO	how0з!TщB3fԹѤotqbh$mzAQƃ!b1֚;F*e⭩I'ag#a i(j7j?w7)؅qQ(Aovft71J=R(.	UpF.N[cFEƍApi*.$:(GbG/4uF¡)YMjj%AҸLel%z[mme^俄nVqOdF\u'%ЀJ&vR>+RBYK^NB
Ѣdd7%[8O.GZtHK[BWAR"OȀU*re֜^LrDJ˜JB9X)ۇa!OHE8>-1lKrtKbpp))4I`cS_Amgץ.\[ֺRE;R9-N~X*RE7MbQV&k-5OO#nL7% p!\Jlp3TrOIY%Hm7잀4
S`\Qb*/F	zwhDay"`Q
ŷH(}PA>rRrc(^D*9z@x'DGƜWFvc<2ONrǫ4ۉ8 eE0袾
!vÓ?
N)ܻzQ~$W?n{Vbza[['GQ .6uD#@y
X2FEo
H@/`8EQPW1K-ba@"GB1
@m@GIyOQ*sKZM<4h#}lT*WWWy\SA6	H:
iB&:p<۹>l&"n0L-	VZ@Z-z_J⑦1VG3TS+I]ꔂiclI.Fƛ6"j^nn[MCBss9vĩ?rlٵi5dA9:9JscLBrhE5Ŋ&j˙qlb.y2Ɣŭ~H1+?( 	e^,Q{fų*A6IWcX6,e?DV5EuH`EcjXL1B}q[E)&{ª'qz%
$?$=ۊ7i	U
h@'nhm裂@y3KφaJ;gN@;
Sj~1t˄%4ޗa'R4OK&
Do5	me5r";M$^gfFgu(f0T}XL!@70`ߛc1صTK#✳@6)<E*=b\ļŤ6)Q<!62Ssh+PWK qFh*,=$FC+fHl=S(sKš͑wzhdUU)	;+;TIu0w)6N-iQǪtE79\*2%cHϩDFMN2Y!Zg%3W/KfXW&u36mgThՓXNjQLiq3*1P(R&u
a2e|#s
nj6rQkNV倫Xx$ӒJϦ:aMjap9fZ?b5&.bLCDo['7!h}H8,
jH^0K-vp@?R[
lћ3ztQKH4ݬ%.DBEi(!@47ZLus	<\G>ߑf,	&0%9}V^c|%<;:gU36 6;syuK<ovw@VM_bjW֍^UCyIy)*h2wrfEW2-"̉.۝R:A[M I/m0m
TA)4a[爈)q߷^1MZX<0=O>ͨ ':5{#R^O R!@ցr❼nsmѠV7C}ʳ fɈ-Νy|0*fKKZ<IKoc_8JC$p
.D MDɮab<^)G7jn)@Tψ8al0+lDɡG m)ŷ_k)x=XimѺXK!5cQق{IxzX`GE֞l@Pb%1YTA`'w2 F?:7/Z79zzI){6k?ϛ{oH7;;2^lEA{)ū`JR7mBͭV}zj[ɖ׍z3掩~lM W;DMJãff)Ilm{$/An5:n=6Ƒ c@7F|4K=9?4 TÛd!4wGo77w4~/7kv-9
+ϣG{;_5 ׎a(-RyQ>^7 GϪ$mBIm
xｫn[/ȚfߕލI.+E7^B
PfnB:$M'AAKh`0R0ϣ,䌩¢M\+y|6\&teNJz(;QT#*L.ցS0[I]0jmm(["7<eZӲI._Q[+z'$>&_ENAl@xVmA"ϋ%6.=IaVQxvk%nSbD]iOj)s~RľѺ	)I|ٿf}kO ؘ%rEθb"d`ФϹI܎A%. ,\@2Q&)[.UճF.M:s|HO\L*ZDl|BU&L
Y4H;i"MRF+MXAr;AW:a4Εb.]slړ'ؑ];|'ĠƳLD>,ōB"_t`8KJ̃jmL${	
uyn(c2Peq[)C]O`RɭRfj47Dʹ,
^˲jQI+ўdHY~GCa^Nvtb%7e4TxPau89yY%G9[p|}HjDXy֒Z/Vk%b<*	kٜt*<3[z1M4MbLTmYH V^_~O :Qw<gK-yxV,;z'ndzb1f<kt4zvIyN͎KZ4;e&BDƱF ;fxȨOSZ]Y)ZڛMbAUA] )[wSImnRLDYKJd|cjǃSu1ť"*B8Z楺$Q.K .cCB%F8VtY/U"h;h"qd)zn#D4v4Xrrd!Đ8Z"(Ѵu~UBeE&P8ْn!'FO8J(se!4c@yޤ?[Y[)e_Bmsr}_yL]@@H-cRj9..v[\`緸(i.5vFv}qxˎ;}.>Vc}]V&HڈDPߑݎl:*N?q5~&P#x-rԇBy0S:a9N7U=jS)hm΋4%1
sSb$떻uZyn:rnc.NٝD0/0׷6k,.V"b{9{U؛X*7^؁W^hr3^Hgh9 $K`fW̬R?XbGI© j\wh@37W3CN!F=b#F9FDUZN, 'Z/~&8|RXM14=IGzF-	=m)1) ׏3֖n{?nW)8E,;!v$e^P=Q{9SYu7GD$2,8"MpX"CW@؍.t߸Dޠ1f/(a)["t8j#AVZ2Vb:W^N:FH!b@;!ڊa^
fEҖʐB&jC <<bMkyK͒DY"EHqYdk_,b;ghLb-rK5q0xϙt6IH,.u5%<IkC5cNOpSa0׹pIICĪ`HbӨi-
96,qtRoZ܂ $#H")_c(ˡԄͥJRJkLܭ;cpLk^; ܅3̰>QĹs#<K"l?TuxOi́Z+ada3T+r1Hsv-vw:k8W^.~w9vm6ߩIQ<Y:!7dѕ"	Flrtt`1 <lWIcɜ 11GyFל!XVrƤĲu%MfD4I]\CN)7NQ`f.Iif"0V.sř"YB#."wrlёyNᑚ&eng)9=	iːmHn%DZA
QH~osC
7wXC"_K@h37h0rjv\rGӁn߸=qt}NFbn֏ۛ;&-ƙ[c3t7řMtmvIz^{jg<5s/-M{RO9i1E1aS]w<tzBs#/@xO6|Ui¿sN8?➵fmݳnJߢVu1Yz ڝH|N8 qMxKY~Fg3A,@"Xo˙=z]٣q5o9eQ1@jw1{/% l~mm4l\ BYOdB˩f
ٴ)1@Ay8nk[_-A%m)qLaQo)_	߆/ԪAu]map#8MMrdT@݁6g4$tc({ƙgO$	ǻ9'v9r<Ku6сlݓp/+%)Q(M'VE8>yiF
ÏŒΖ Gub6> s>2(),O	KWMKJjUen~w?Uk~_^Y%	bt'ԟ)/Oe%򋭮YI ;nVKf+hec):Xn)g[%A,&Ciqa{\g=(;Y*6@LJn{okFQ=gI*	 żZCXBGEV|B=╁e1ΖĸXåC=2tL	9׶ˉ@Y3Dp]9Fy}؅zfNhGGXw̎2
a:#>sX0:)c.fD(|<k	۴Z~?h9Cm~/U :JW"_߄SZD%zRA']\ylisa'_AD_PlhQf=7nyжXx%oy%_X;%6{pbv.@q*0BYR1_ j@le@`Dް`l&DOK8nLY0uzvU#Yg	K?33=nv+^0(o>Fd NS7Nt IÛMe.Ƚt=)Ԓ%e=bz* )"^Ϙlp 2}m  u!c2֠Ii388`ݭ,Cfq܆&SWilF~XY8SC,~6/rX	ުRNVu\sa{G7d<^vkΛ}]Manwv͢5B?fq>k&hʦ6"wZ$t~; 3uxSUsg+87߼ߔe:ǘR	<
oex/z<Q&,)|0s
ϗWެ|Ir&.I4N1nqy~*J+Mfx#xow굦>
c-a"g_N"{EEep7өtIo]|0)#-x@w1KI8ȇN)ټ)V]S4%+Ώ=U<OWR -yi0.iEoR~V8϶߼>aGQ/mg{a{5=$69ӧ)
i_S_?hPhǢT,qv),~aw$o:ߎ%2aqbppK%OW ){̆:ι^mPW7{Ȳ 0vy6{.Kų'RY0Fv~qm,ƪ9=G"5BGY$K_UF_">D\T1ރZqtIv]O|@7_UjֈR1d + d!iڊ5/\JXZ"X]B
U-/u/
~{788eʘQ8?A=ePҽ'$7`
ז7R3rTݱ}?M8#;GʖH9:ӕ@WDb;i$+5XFI]YQ<'JzNکp.≤Sn6k)Sçu?7OHL:37lRu~O=omfȷaW8jGw'BvZ4@HBӓ!RS@W4GSK)L4Li%.U_Ky$FdbLI5dbؕOL;;34tn+SeLKPҎD,q6#)H,2yx[aG3Y%rw^=Dll,%?`Nż#p瘁@@6-yW*yΐ-nXz0:T&-mc1nCkxaUs4]M~tƔ
q@ib-Nu˻2DW
y=RO9*;`F[8V)j7&}dj;N=i:pfZe3VW̤wl*a:n6ϗ6JPx37u⊡62M"#r0ziMJ&+:活mI/5Oe"c61PL^Se%i}\"8ŐaNu;0v2iw6Esu&вiyav
`_5:ĝڕIZaRwKLjʕ-II&gw:N{`.:QҩT^s3نA&h=i$1-'f~TAF4) ;NOd'4R¤$SHLR%b/#_6_K3}Gj(Oo)Ǔ+W2P20G$]T|Sy*6Tns16azDVY,NL[ؾrb۞ܩ_uĎOYzܜycZ<[N e \0r:yiW2fMSc'7Np}йiGo%1`zdD0ܾ4=sy
gƐOa5q#
#
ÑU{Kvzaz45||H6.+ɟ̈́ѧd;X|)ylEuQ''sl!bp!{H7(KmN;5h
yxwTF.^dI))O991`ӏ<Y[Gbl :\+z\$:qVTfhKwD`t՜?h1vd(:O 3ϋA:Itڮ1N)JZF:8Ւ7xsh.O*G|lo2|Fc~w+u7̯r~|M!xi>/ssFsN;qO%!Us$n0(8ZcoIOtAV2N˵mcځ0O&]#1]suC27ڝ5XÍT<Z&H%?_IRwѲHdTXqTI1O2X:~ZNx-@Nbn7ۭIitߋ߬:o@FN^ERҁR*ȅJ?e8GؘbqbUbtb\,vetFFSޞk'O`Ho0::]hd$*Rn<<	d¥oc8ʾ=Cړ$ y?@Vbm^tM c+5=g%Ws%[HgAT.70X#].N> VllNƇ/	]*r;Dz s[.LuR3tkϗqdp VK#;b?L|2"mJG3rOW)F'J^fMR3eK?Pǒn-{aj1zެnm7۵[5<lk̈́LF~hqM4aoBđ7!Xpu9}TƬܘUYu7jz;MtY7Mb3!aFLt5uU[d6+q"j2ypy0k"Q[z|"v<wX Yg;Ab5-yzbA}2wUM3]U~šs~GNEbe	-WEBTDs
:,kFs)<UX/a O<37ʊϠOK!DI<DhD*~$_+SMsOP-S#2zRDKizJa"^M߱SMn19)МF|ʂ%<\5pTloc%IMR<¥<MOjO-+lNp i6Zؕ՝/YO\44U5RT#8I6 ^d)϶ڹ];Ub\d Es"]Ci-N#dh(3Lr#2I!I#<c%_N:ΨLb(xBofFbn1ps'yN{$YDdHU D8z̐p mj	H+*ʆf4ܭB=wi25ƇE'|o_vR젦n̪*f&4gdR!~	 _힖TO4KoE=3Q[5\k,74+Y :ȴ0Vl4%x*OOY`Եr?|&jb/FN],~:}+
@CJ)HմqCrD$(^y2="'~s1Do$rOdꊃ7F#N2,^hYUj9=2,AQm*fܞsμm&)aTXPIPDSyfDg]5ƠIPBY_lf4Cl-sM|~Jf 
mBDg\Iۦ`6>6KbRcٮ/R%McLJR({)Xɂ2sUE~C	'5PC,=RH1kJ{LD;M'$>Y#RsŢ?<MN\(uh޸d
KRY^cѫSi{~dG)>y\,DyYu?5IR:؇;&fUga&uXю/nI\(S(l(\{%o{xمK5Kr^_@܏Y0FdT֠tu-*u*#yGp} :8ƀW\W)Sh|ߨ:La~B'.q>ɍ$iz&ya={ٜ4*zڌXSXGyz-=sZ͑đ9?hwEbmQuBSב	B#㛹g;H4FL:4sq;t~Z(v	R̕5ap]ǖQ0wj	0sF\QT=gxv[YEqDx4ՕbjV63bTG_/E,S離,A)Lh%6S%!88{(]fض#pG_u<MLY?eg"t/cr{׋]l{qyιzGV)45pDxP<ND_Lͺcrgjժ[vĶ௺4k(XO4j/Eg<|Gog$72ַ>-Z;q+]ĩmbF5:!6YH~da3U6	+ٶ)0˷CRc]ohUAGKAƐzx h*ƊL owccu.9lEUt>t;h7{^yƊ@̭$wy1>f,78`j{[{0 yFI@8l9%bs{ԴI/ߞoKo=UbދR5?<QKf^4
~WNpߎPc	/9QA77wR};3=o{(9`tL4bAˤ(sI4ː$Tc8'e\c-7)5QsHU#*yqb!fe6ʉѺXrw@RpGb賦'gA?`^@i5З"&)ޮ%-3ŧDTYI۵bە\Ғ%tJZF|2r:Ƚa**19.<N_mC%.*HpJQ{Lw'蟍S2!ͼs Kˬaގ{jrkx]Nմ#B?0pLCe8j46caURgk$$צ J*CZ')^%9!9OvjAst4q&[e¢EZQ7~ݙ	D_S$<G-Ñ3 Y9,8D3t87U;ӯH}ʬxRKݼrf&gfqZ
Uȡ]ţjطR5TU[L䢒h	+4_v֜we,	GzA'\R1Gc		`ZŸ$'V@tZ녝.\yM"P	I){(nMӲztp!YJ2[gS]dg9Щg|N%jd폰\`$)@KgcE[l~$(4kg_Da?Rkoc	50a3:+lm|EQFwA/	6^h^cp۷د3JolZcfy>)J> 8nM%Ϛ`opnyMg^p6a-vo5[چsrm%I~f.f0sٞ-n59 !ʃ!`r2a`	E )%_7kCL<xs2I_0-V$b<`c?N",pEq|P7's-SЀGKu[hɅ;ǦoTB։Ag6ڭ1#PMv=s8uYCN$
Pvdp^^xJZ}ubHѼ{"w5P#̪vRA?~%J,bLtYU
^g:9Qs&;tj2YJ^z8]'️wFJIIcU~t>?jd&}T`1K^ۗhMuZ{׿3N1}bg̳=B:#omZ\ڣ%|-bѾ*!`C+N2)#/.kDW˹X&D=JWb!ÔkfpF_GZq9"#(Y-%Mvi*aW`2`T3'VQ: ^iCɵ0|~)% F`m]֋pFj@A[Ԓy~{ں[Bx%cԩʻi-{{TΘLƛyb"!Rݠ_	RL"H*KC¿dOt_& 63Bcx^ە+o60(bfLR;~YĬyuci8-͌ϊBIy=:pylq;Dx3k0%: S
5-h}2}
늂cr|lRL3nw|uh )/¢f)֊ aMN܋"O{dʂb̺~٪݂T9gqPoğprarB]HB_LHx*k|,kzFPr&P9f?$/Izgϟc`MTo6mxHD9x"Q7e|JiҦKALC`ЌhKerFvcѻ!0!` -"3HyoMAfrח$6X$1"53m rIe9U^r: ɚvީeL/uƾÛNLo}[=6}a$nRGaW`':lZ9łC,ޔ(MC!')3%R @0¨xЇ°}גzV"k'ć|YPDb"y+kkMA)CY[%\&ĤjROуmN8`鄵İ.haY!9&P-(3t
Hq=lHlfмgod8R9Y(c?އ6{Fk8o	_7<_YJCg]d&/]0MlqOOmjSJ~%꣗9)q^XS`l`h9dPW:?dX 0lQ_;9uY&P1a"Z@$k;<Eq@KbBHud}9D#]Є=d~EPpo:Rja<Sx(H/X5ơ"T0:[V6k@cpZf*qU18q)&N⥾*:TnE=17Hz"g`p(,ρ_ꎁ4w9w:a۫M' y>X&HLE?*O~SN}-$*d-KCWK;25Z`G=4$	6mݰ?Yk,:$R0<k=B&$Xx ¦`xnm[=vDe!{[ْX_h!r"PV/Xם`#h$K
g2E^WNů&>VMO?Xց\OI¤/(PK$Qˇi*v.]<m(Q6QV,&j
_s[m{W@˥&)LlIAOH~1Z]!ČF

QNhod6d/ǔ-Ud-
ėq]YmW^mu^y>-xS1!L"	~|^$Ƭ?0-'*V_Jt"R
4|rhĥE!b$2f'Laڭ@W/3]&SL;fh?G+w~LG(7QX5:Əc|!]F9S@1**ڤ`xpxVlZblelb*6En(ϴU6+JNZ\$2E/?ZX髢&Ŧ`w&tߴZ1|$=TgYN_ ٺp$g&xO>+*w@r-'\(if!tJDK<Yar}ilr8&xY2K40Q
}%`4t_zAxМǇCsXrʚ;b'2>0'eG"um%"j)&Uɾ	F,gã2IrⰙON97DI޸	  ^x)i@۩ 8nP ?C}QeC@"&$&J!aR=6GЙ-<e{;hPtXvdXhiv]"M(<ׂ#gį*8ynV\mXYg˓|2Hi3lf/\LXQe՘cv/B3`J^#Z!ShYͭ]S~K4۝:#Qmoujze[G$>}GIh.hz푷 ع*P>S\	{H+OE<0{"9s`-PCzCAYfkUG' ؂$>Q؋N;āpΓ<XkIHdW58"͐jI
+#!囪?l?$vտhߥ%R<I1
oJO5q9TJӳVMEFCՀ/P4>1Fիrw )AcNVT%,AChs%En
gw[ od@M9݊Q8v?-,`n^]L[񶄏uZ],Kݥ
V9`KAMٗXL)&$bt.y!SƱ
^ւ+șd\ǣ>B;'gUD 4b%Ø5N{eiV%IGԞ]62&DvpA5#CR@Gs^{#i.(ॡ	@եQV1-F[uEj.OO=˒e <[X,(Z6;(jMN&:c(,`(ӥ.GF&0d09PW85l~Nx$	a,,˧NʫwiO'͢(YQ'
BPvIUc{zgvp+>9O9է''5aw{)i4{`-#U\Sٟ?x&S3.q V.<$fr䐉hb)Mu>ǰW 62YMO	Bv6T+S3B%&,nWk%;u'otIooeN6",MYuxFP=vN-H&ËfANºd#
b,lb5[k# q6Լd(?hLmu}vr 5}\(ǯ/*;ټ+iGhtBQf䇛\?`/.5j2`AȈ% Kn[+t|gw9yyidGi:NZuhP(4w>s0_k\4lR\: %{XYOJkhq!:Af݈6rO6O6($BQk|q
+7EU#²"&ųloFS`]שL&3Oe4OCUWd\CnǷYSɔ׻/7wRJ S.<xfam*jqP6>٘ҭ5>ӓjިV*uyyxXnPY9cQ$Ӷ'j<Y)	;!M#yX;zKFQc	3-sem?Enʗʮfib8"J`i΋?,`{7wg+_=~V<[PngOK|}Jj{oqyYY =(Ԣd~6/Fsze3̫<@0
Cx96Kb;򸺻)O&pP
ȟtmA}!|/pxe$eJ Xw)3cD_ivǽ	3+ՎF%%	.nɄ7R,n»Jkhp7}grْTJvE:oߔu},3uP7okeCr4dIyTo${#WGt<lN\k*uPǰhtѫOL_F5*PΐGǼ؀mJ~ea;!t2BefqH>7ARvB<`!<"vU<$P(4How1np+<][j=fex	]F19sb6Prᎇ&K?gO#eɫ3Nze1a0my9nf]1RBeYtM.*@p̶Ǵehj$6CaKkQMHgcL&,u~]+kkٳg>3'BI5FF(3  |,. Vc	H>6[-V]REK}t¨5t0[*L;ͯc_[Yw?|Y TD63^g0*ʁ_.ǜ!%U,(yFtJC(`v6R߭194!,(#ʌDacHԮm6/y6<QS@מ7VXy}JfrҊ՘ha*;Ҝ:DJuhsZݲ!cn7$CUxyuq4Ȼ'I<&|4F&)Q-<h䞈&-~HmeI	_t"&z[@6^bDkӈ5;AQ	nLtR[aL>nmn n:Y/XZI
RT[vL}8YKh@>a;,ڦ2o'#+\fnCܭHnV_6=7}yHK|zG\SXW׍wѢ!qwA5^40(]7o6'Dv6G`BW|(|Կ/֯,dwuE.5		MTktǵ>t]\ GGfP+n
 fYgok! !D4GWw{ujDxy6,ڈPi8ekW+7\7(c߿baE&hva!љnlm~K !Q!Yh8~IဨQ|rsMM	Mn.w]ݨmUj;u`.àEˇp	3#[n7mz4i+F wNJJ7fg"Ds=%|=H-M]٪3=z-?&ebx22f&\M\<qUvRzpkĈw
G&P,w"pu귵jw5G{UW6GWooXΪGđ#":1F&Yp[ @eKous]h1iP$AO]A`hS>Rm@4?"na=j]8"Q$6uHCL.'F !ڰ<awumhWwYQ}Tva.R֟'(~:.މlWs3$7^&,MB e1 j|t)#5H'I*pWэ[^k'x>QE ۏw
b벏׸"D EИ I6.G䇇hҷz5rEf!f.q0G=gF9/ʀLc<BƻG͒
{ǵ,ײJҐIܭnZ3Wa_7%2~!o΄
H?5G@ZfE8!V,J^?=KG}J>O[y᪄erߠ&fN}TXfy|Eլ'>1\vUԇmo!Gxֽc<113xԶoɛU$qit)l(No;m+?'S0N~Ws{Ŕy?&v{B `N$9{x-~ۿD{YWǇt|A5Ѱ|#*r6gN24*[F
E3,KA6hBGoXP$6%+hȊT1GXd<ft[tp菺"a
ŝLK|q/=.5to{/vqC.y^Yje],j` DC.ZQWGqܖub9PH* cT7'$ꡪA.8I6b/l`\=zT1vb=ڞğ{8+6I2eoBE:!-f[$`0S@g֢頠
M<bA3ܘ$!c8/;(bnK Sx!HP]t229K8zĝqVF{8=p<#ADOaE HeUA%QǤڿ=&ܩ~F.[,%/C6rbq[ǔJ,a[U'o59ykY4z$m5FsnxQ#(Ү"j,6<C"j\>rYTSB;Ej'1`m Q$d$GWm:Q{IyGmW\-%&~3>8ȴ%#YwEKmO6ۘѰQ(E6?I}EAtup\?</Hr(mL^_Z|D??/q8gK]~IaOWtI{ͷ@tHÒA=Kymeu򴸶RZY}q}+Lc.DwGb=Z,C46bq(8&$AlZi"74`DPz]s9bG	tXmW[yO;Lw!yQ$b֨Gi1av8BTr3C3ÀV@v|tMPEfN::}\*5)monN=mxSyiNe2 ,2ir$.2l1 HDBy\ӂdYxFeϽR)rŅREl 36Bx؃nma/cImrE<r?[,ˀ"Q!jtl18lbME^O5ʶnwPtG+کUywxToVbmuz	5jWCRVj^5͗j7_U#7խ#ux|txP(ݹ_7rErrʯ0
|.9د@+{e|sݬkґ:zGT޾#rR1`r~G	@W?p^@P z-}%\g;>U숶+^pnVn!O!hEY6tlifɘEh"^ݾ΀$83 *(JX8a `-t#p4g+Qf5D,$
V=~TM`:q"<dxG@Y7fڎ\,IZ2XQ Yu!ڶiWߑ (KszR&2Z9ٹ\͈A*N6l^Ť`>5CQqq8`iDXӾw~{T}].u֨WEeG+xS*zu8PsY 7LOP"W	12ֳ(Kxﲁhyy1 R07i^d^lKx/=kݓ&ؠy*Y㽝~+?xv=v2xSpw̠oYy煌U77yOhh9*tU<ϫ[޸qJ9^qYbtB_У	Èbu05Ⳅ.62o~˙㝢ݏWes0,#Df9ӊFO{ ~^~|{	QFBQ+UΞf('ʭC'ޣYI^ՎȠxVǿ0$/*jलoG[qR)^r*cՈ#]H`KZ[Rїj:OG@&#2\,W @)DARVE:š|bCxq}1`9'H1XL8dԣ0i[Y֢v7F[n2qW&{KJɶPB>:8>9b.O*H
pWEJr0*aAGbdVRȝ\x*[{@YNӁ((Ww$Fo	&]g1T)a[,e*OC422W̯+r\Ï"ͫb/T+/~H*2	ͼzp׭H{~4:Д[fg!#9#ٔ	]sk9/aoRKjaI}s7ے<Y,,屎=l`~4B?I9*d.f|}\YSf啹,`5uܔFre/yvax1Y8*x$ey(3ǉ&\r)uܪYE*1TR:\aPxT1C1d,7--@w0jIcC*3Y`N't 5mN=H;<i	X#	";K&a5^5K%O?PUv4Qah049\N-hӲ~-SKY<Fe!Rlw+ ֑T<o;U8Nv!UuUVl-R&~I2rJ~śnZ-/,>jha0PYQ^]I,My\_>]jޮ{oehh3zE6V *N/-#^>-oׂE}Dre.Hcv%O4jXj	wښ;'+k3co4{57n:1.Kq6B-_LP-,.^ebR+++j!rz4ā@l#zViO}$l1FZ>a MA zG.Om8Ky䋰<b$5[M)@ýqTyG^wi8-~w\8`Vl;иJ(X(q `!EA>_R0%ͬ3.ؓiCn0Ŝ$X']5rv4m-2ipkψ6 ,i<qw[:$.+g(C)"J0&ݸVRnv4z=a/w
R5sНMPUoy?d/@kM2|j6ǀYxN*4SjVkcBL퐳NT!3Ry3;~6»ߖߟ旗[P)˧y,vOMm)9B(]3WFߜ.:ÅO9,A׫XG^Zk2ZCcT|, 'V,k u-r.~yp9AE+qXa-Hm&"؛6H	P^ ퟣJq#?9U}}rL]1:Adm_|y?ȍ*UZZ9YY{o[+24gi Q+2ښ9Hc^ߧ+P<[[PKzR
q"/<SŁV4,vaɴ[VL#L:%	HD.30>J\ X:Y][یn
`؃Z7qF0R jLtW %!EԟJNZћĿ4S}pzT\wh;>+rR3r?P.!˭F[B ,| 32G3fwWXt+]UlngDײw.p$f(Q[5ߩ:=#LolRuURQ"VwA@aqb:׻O>D-~'jtZH;-sô[@W3|?6Bm>%߯ lyi=5%p Lr[uX8Sr˓\o!7	`6圈Rp]k/=kPrPN,'*}윝2,StO'WЃTc-Gc`":gTj`VxRTbw[Gdƣ2ex4BpHPX16j4C+*)M|inX@ל mG 78NfVNB~Iɰ?-ɐp,'EIU?Zx
n7 o5WMHeخdqBΝrح"UKӞ̜x/
o\xs۾e|/KdQKWb|(|S	Km(鶺ʊ`R9q	7C[99&<㜋[BBgt ~-5mN峰|:Zե~Zoku0T[ <8Z63g#tsfox5'$r~N}>u7ڌ Ob
nI
wjF뫨G2όg:=&?X3Ki<O혭/Umv}Ij1݁gѝ,$IRrF}t qFi3,I*/|;C`Ò*beJF
c.qH -龐(@/BaFj![5=PRR5OD,Z.G7ɋaۨ䮢j҆[ydLo	=a+_|ܦT6J~6Cϳ7	ŭΝ}'EJІkTtFp-v-z+'ΡW?8uz:8D5]o*=䴟${x7rkgɂ(ր8	;hp;-fN!ob>(K栕8LYu%EG,H6Gptݚc"8~=?0-/Adt?뽔C{iZ³?9)wƬӎvT-}Bb(|q,ȬE	R%#O/=fIf6BHLga;xD;@e.YC^gVea蒈#vYźqHdsQM7\dPgt p}rg'SH4&/#=BO dD(!sJe\+ҭiO)$P/3Yl^$ȵ1qƆZOD7Ɉ@ˌGhΛl	PCuL1c,&expC-V߿R$*RfK
MևE OWTwx.WYPRڸ-ieJϛXI;
׷bo^/OW=}+#>Vq'򿓃	"j%@r :%zeSA0~M&;",FRkXlblF2C wS%7ˀvDEe8lb9lh|9RXvFj#ruJrTŵҳ\@TX Bm)ǆ3wKQ<$+FI\ؕϸ%­SlUǴ/gK?gѡN$(pR0՚PK2G68Q@IUtRk*8P7J2}IyiEoz[D]<VۢыW.Nd!	PnYt(t`*Yqm
69}dӹV+9ZY761'1La
ؖu~E50>F{RiZJb`ƍ͐T']`,c"˔Hp}	52ihq-# 2\Tr힉oqW@dڳA,!ZCKlV}n˳`>RC"o^#ug'3s\Řsn\xZ`2yB\%N#XjхNnPy@1w<h`Q:ۉ{.	0bl4?6IFidR&	2"Kx|.in 3Zإe<i\o.
\nXsva 'CA޼1>o8$ʺ艝){d*c"1[]hRbaTV[y5+ZRXœD-gP@2	쎊HkbĜ :zp"KQ39ItₖJӓ5TߗNNVܿKʓ_:5c>pē2zr#*˅CH!*sئܤ՜6'RcIzԷ_֛Rn`>WàEw./OhØB"7ŵ{Uoyc".qD@=~8"T#|:)&
ht~z<|}S2:.f3mKkgiM(sH6ʩm_bO00yrPg`}8.S!0l,%?n|@DӣMfIov/[^XÐs@YLᰙ(ZY;,G!A/uBS.e3Wr LNQv[GN8TY-4=Z#bRX
o+.YZ²ĄmESee;1Q?Au5Mu5]u5`*MuuXjT*!Բ;i]=Du5D-)?Tj&-ʴ؞(25gh]=Te`YΠYfb,;GGu,ݘH$YW헶r˱tib+?LuCOB#J
PxSDWA~8>ԇv‿n_4Fhl!p¾}hGriՕ+z޺??䌐%bDi&ŗ\M|ɽ;/KI@AҘR89Qt5'}U99IN8#o+=%2#=G:ZR#p7J
j&,&Vgh)7
+fB	
BIѾp08{9mSSP%Ts5}K܌7CgqY"-c$w'˧244
Se=(d*:xV-Ҥw+Ļ֜"Y|ڼؑ2W4F5(H%iI@ۜuZVИv\ԙT6{N7נ$sЮ6rEqA71RdK1ӆ$rmS 	w^ֵe25W`xB5|u=Vml'66PA#trd}vWv4uPn0×Jz!G|bzZ@;^^mU`);YOgHUY!ҋE
6g7ɉNdW&&|AbeAX5u5g8&@ISNBqHpSfw]6L	
ҿWp{,[ô;m_)n|$dn.k/kE,#X7ʯݔ)oʧt7'܄W8=Op4 ~t&i5rnkBď-mmeuoCbD90
0 *96>`Hג@E9RV4Z R=)'ct#Xέ7!0]AՅ()!R,t>7NE%˔3BnIYN4ggnA(~:|]iLNWԶ,?Ґv=XzkT_kWyW&[ܧ4 Z*ef4hF-O>tҏDc6SÀ6%}ZcۍIo:&4xǝ)|#Z@2&tVmqRŸLD@^fO8oN峿Ns?o<=y8wh;Ha,CrN
_s[B&*}9Sx^})Kw3;sdM]2VНqe& @eI\#2m|_viN^>_fO^~59c\D(	dLu<EP{$V,
t&{
i_㎽j @*ůEl:=j6bHm:ַd${gS3<Ygk0tvz'`Ng?|#sL1tcpt(vs`F,c<(eqҎJ0);u5'HaJ]:R2݆j1! D zEJ0MeNtX48aPK3q>Rt8ƿ;TUI~`puQtG
aJ3Ϩ9!6y}c>aN=S@T	1:,ZBpKsg{}pQ<'_Y[9KƽRW'nKG~JtX0tѨ5h2e(.nϤrG@N5qkr?V/t6a5-v8?sTmx?%X&0>qV}wu0x'%}޶o_r^'ݵWZmnhEKϿ螥3]W,_v"w,3Mag./|&\qGOON~L[5$~:`B}t|MηGzw|[ԃXGw^\5oZ|[ilUlO@
:PeEQCDm}gح7-m̠`Ōvf~>4MgbI?j*R	+bvjrٿ&$]fEZ.jI-FQB!~Zll><	\U9ǭ~:8|yxKKd.
GΩsfbl\.(dq#++xP^uPD#t!ՈycZJY-S|QnFMq/)״n	Hލm;DB-rJ/HF@rY^D7mV;=yk9GGO	tN0DXmJ("q"GdPh5}#JlЖ)S;~"#p{́^INt7f1l@SbR\49|PRKguF- ;z/RM$\WHܖQ	_4j\$mYix[W_1~l\4f`4U?/ /[$$M}S&<>ϑ/% M(Cn縦lP:ܗ\dGETt C4j_P`n,N=YPxzwrU9ݰB3uT۲=,|m-R"aմ0Ԡ6o/'J8籲j2=L ǝyL0l~ɚ"89>ujWQp'=.C8GM]
^?>.ÅgFF ٍFM!QF3-2PGxc%1Mb8Q2T[pžŋz'Bʼ0KrU7$I0ǁI)ۂ gެSOKk%2POןa'S gCT|GDM5Ch##񲍦Q?RF1wF%17'vnHgye~2u]RYhЋhEW=@SÑ~4hJ1(ƉmMrcC_/slUI#ʅ@`ăgTRwBN[Sh0MܧK!w"nn}>:k^>68\nK`1y­ FLJbf
 φ1;[#z=-h)q$:u`Ծ1lϽg$K{՚Q~qĦThZlM5&i-qN{4WM3ދ&Ej.ӋM,myMtd	b12q]m{Կ@񷽗iVx6ng} }%0s{Lqh*{ /_睪M8Ɍ(R!r(	&q$:;/mT	G-&ٖ<8W|pp[n]Oe&Mi[ހIl'i単I%y_)<ldP֔KW}*6eN7~l)ۏ:I^-bX.M[Qn\8NлBҷz(!:V&<n/GM!KQD8--}¨A坅Lxx}.ݘ2vzfyB$)(2<K<Ѽ1W44Yn)xl:	in#zɇTv`zO*=u 1uR6T_/jJg~oE0Qw01аNp&bsQ#1Tgu3iډ!ǽͷInҠ-<IfW sa"ph&|;GhYie)3IX[Ef	鑢,ACy]#q2RTqd>lϥS)mPӕ#8B3I{L\חHwV/7B[O}iq[W~25;Vb.3ŭJRϿxO'd )w.Q&|+%%;LE;hRg!(DQ0h,"ERHHBFn(ڝ[$FƊ!9֝A ,K9q4&	YHF.cM$ϒ{(3ZMD}kN{jɲvlPZb;[{x"g"@$<oC:TqRji)rYʹ7|J)H)q	@tGƩ&dI縇b˞'٬Ni
Pr'&Ȕ3S%VgW1T`P|K]Y P&jކZF%j#Z;+O!g#w/VPB?=LtCpzy5mC6G۽Qm0t0t48kǵP NDXQL*Clȍu;␨HƄ_ֆ{V]nRl1L^؃M)ꗀ'aQbډrѻxx
GeR%bmzk[PD>nE'nAFro;vôT̑K,[ɇ00`&orj7M@rtxΙ%%/Q!wq>eabό0b3Iݶ"Y`u<!]i]W.&tG`kile(2&CvzȘBJw`HtfD+eX?wC@Vx}CĆ&>,SO#FzH=
͋h
RO@r{B! 0-nv>Pq1s"Ȱ&Gel>7)%фh6v>~jǯ^U7~KK0L{QMf֛lu%(w=˹޽
"trb!:Ap𰝏¡y]qn2*h5iMxn?m1}]0l_\pQ'քƀVӋ#84BbwQibSm(Gk|T[-쇣킍=NFUZÓa0i@Fn'U
X>r5񀣠g
OV& =w(&uH,&#D<mdm;ZИ=[jgAʸ^D8TY{ ь=ʭ_7+jpVJH!2S`XFڂ	a"x)CːBfOR#hNҴq>VS#،Ф@b!B^_6MƌS؞4җ)bk/[6(cQzP
zQ}x"B[ݽrdf; ٜ>~iG wp%?0f7KZAZQ=/EJT1XEF^{["j6@ߓ\CBpF"v%}8\i0x6ƢR>W:_?y>RpwQL=_j)2rjHs@%7BtC+laŜ.9T[M[1	\L]هѭvֆfJłpW~4#֛ܱYy&Ea᧷`PAְEE+;`,&ubygCIHT%4p|Y5FnbOT~
^,
Tozbq)H&aMBmQOY"BQé,u5w¡1)3DbA͈ ͞"҆!*CCrM{P(#S} :bȝ,QgCjF&h\`"KO6ÁfQZnf(.2?YE+i>bS,Jإ,Niҳ+٨!OT^ɂt-EARh_"jy-qo}[
!2bFdmd:}/`t>1!GNXCZ]Y}Ϲۣ6:S˅Wq{v#jX=5r?j4`7jRXŋzk+ޓ1n\<X3Qx-ECFj%+e]u?.nk<7:ѝjdpG@P_7lr79^Yʆp=,gWK+YkUu/E!*3oi[h3w]fK9SYdvX|nӶjPe+Wʺ"`鳳HD*$Dϩ8RڧɊe9,mA7q}n^`zs;xT+ݔG6e,̬Ք}ګtnae9k70OAK"p=0lMQ<=ͽOqNX=gS^~	W=l˰,|`RfrcXVh	MYD@]l=\&p 	3xQ@803a*k(7I7JȤvHi`<ԝAJ=J2
sGhXF;0wզ@0߭
 PDɨ\DÅaÏͧˇ[zs<6WV+hۺ[tm;OW6*]
jjߋUl[UO/PR	vux\<=^dκB8w/bU0IQvF:?^@zrG!EH* S(D)0UBU{2R\| Bt 5W $_섽%pWy	F*kw44{ ^nYfEOckG;u"}k ;g
\zbC^C:mOn׆3'wAJuGWnzV3sԷ;=xUəwBzJ/ƹ\6;;h$a{~'&&.q/S:D zħ`Sp[Ԏ=#>t\aҘsH#S]@dؽʯ[~SgNfK&O4hQ/`1Nb`aCP陼wno$IyO7A
?
/[Axϓqp>9pHb7@.UxvALǫoں픅CI]x1E3|40IP/ɍ ]x;Pݰ\ܫ{~f%&ZhIG[UΞZyYYFp/nUwX=za4x9MylHF".`:U{NBo@-xpbEl{J+@s)k b
_۪x }k*wu֜:YXw>Jب!jqшx"fLeҨD,h4X^l/ۭ?>}Bt6KOE@cR4B\nZXVtC̉Ƒ'w@!	:8DjQ!WTUn 1l ڢ$9oASO`ؼ,kLHمODm[J_D\!_xW^\N"UgoBD.[IszxXj)'%`>&|b>H{ʉľ0.oWFDS <z  b.N|zZ:][6bE547ڲqCͰGUyx9nITjSasO܇7X#`Hd.d+'
X.6}vG;8S,!(Fp	5EaAvh=])Zu_;.;B߃;
.ZpJ9Iih&e DAX C&|$3\7Nٔ@H	[n~xxxdaQH`
aP):kV8aKYF[d~COuxv@|ЉC9̹"l@p0Ww|Q0PfcJQ2fJ^Xkz #2vX)iTȎ%Ԣ;#Y#nۇ1x>~	7ݨՋQbh||9v/X|@(2Fbrkە?=J?iGl&a`7#cGaMly 'eL|]Ew8SD	77	}t	1)/NhֹSqJOɚ)H9s-`Y̑/I( {V|sQQ[$Lq0g/F/Øm|B;Ax:3w*hm^Dnu^i̫jP\o''S/q2i)b#VAKZ!FhpԵarifMlQ6~V6]	tekgf#{rev	Js[:sM;#Y:{* Gh{!GQu'`E{
٪}'}KȦSc"=)˦}/zY!G
ێ縁T7ϟ Wp˻]ٌ VuތmQW@Gq-IV<P'O>QZ&ߊ&qĄ޸kvvtFOFtMU|l(:{c)ngQGÅGw~oxBHWg7}-ˈh1`-8+S䒅{0(Dp*ؠV^$ЮK(\Hk6##:;lnP^n$bHt,zo-=֜<K3u UvfYokk҄!EXa['l$rqΚq2[>/8Y<
oByQtoX9ey}g10e)&bI8,8WhТk]}ȱ|fMGGJ"wpXo*ؚve;܆p
DbǍ2M<zc/ObӚԝ07P.ĦDMAwa_P}owS͡ᡆMC3-O_j4l05PO sp*w+.*|wBlnم"Y
b'p^&UNL'|sK	wCT`JNQVKkEnd0́*%CDg>wۛBIHDlF,ˎ@CAV5A0^pؘ%IWgU4=\bڹH"){3Y`Og/O?n{{g^Y֌|^	N{kEؼ\.{w{<Մ$pC78kaʎdŦk$,diܞ֔$GB:/Fl7`ꕣA7xfLjN3)9)0_gig:PlH;z,`-SOF-=yr@vo|cތL{WwS#INV#.:ɫ*-ͳ<zc3[Shl\D$m;l'ȗN @A xX=.J,>Iudx!ֶ#MW9)2 :G82[}.jr!a!._בh\+<Lh8px)	Ё8=)hȧ8ϰXK(l/&"|!֠Ug2L
iH+,_o;Rßr<+3%	>(7RH#voOzutM$	YEɋ2W6Tqh$	:^zn˶dsecpcEqd?6_%D|{&FeOr{י6YtQ'ܕ$`,SmPU؂:FtS]se5KmS2$Jå@ȑѲ)!YHT{~HlGg7S	e%.
ѡ5\$XƆmx!YR4tkPg3.:R/L.NhL0}h^J$%!)Y.~QG³|;.3l-{/ݒR2ǀNʿӅ)6lȣ,j0['9ZQOK~ݼ%W/mN	7yl`Mv0nJ
	j4<8kf_jGa8z6Ń]
˞`LfeZc>*>`c;YAaxxsm؍a +d|(Gj)& Rr vw⛛5496O0w싃#{>Hg]^{KyՋw婞?9gV-fT/g؞:ûf n`s0hq&fuaxr[^7t<v:(v"ߛq3cd;{#0fT!duF`'q_yUJjTm?pzVq+na}S7F|gܚ$nÒ779&hG{61ŋ?i^bfCF5j	qh**VTXT<E<Z0NjnaD5ݸ<QEabהÂ,}L	Bܼ<YNKj팔iTlf΋[	#Vo< O,xGF#3U";tg:iMwtA,o2Ø-xd軔b1+ߟ~Z-<;C6_yNO?Ki)nk˃l!ɰ8Ӗa50Q\w4RJ$[-Ec<B(#9v3:wjucwHэ4὜j\>q{^e`Y"^8ZX]9=--Qc z63lÆfsJ>E$kDvg>,:Aaҳ!ouҢٛӹ$J>9J43#VH3wB_"K3R\D4疄(-ԭ:i4 >h{a=(VPTRi6PAU@W5+ 6DӍmXJsz)#YNeuVJf݇9 *I5nVW}
de蘒YjZ~D/-iLÉ+O 'h̆T/hjY-_dHYu95C*V&tvvDIt{63	')$^~%%)ajb/J>HX0/Yf.יN`6 _027mTIl~V^OvKI962ʖMѕVUϢ݂fje^$~CDh3=KiGM:RBmk`ˤgAUY<9a;!]>Rn?WA&lky?hmnafN7½+I\[^qe 4KJ=K2$=Pqڴ nJPGr)2;.a4'5aQgSpz!L$`_JEHKhC:2 )UesjK[l7pN,R'K3OeKuRҷd4"tZaG-@<JȕCy:FZ٢Q GuU:Wu0guشe^?bljzJ6%nݯX4A;sސ4'9%Ұ+>~$ rDG(T0fFP/.?@%4Jq+8=Q^ZKwpMNK9d{wL: ]&7w6|ښ{`OTXYiC"Q'Bc϶qT׏6$lJubi0I1_W(څ\޽렦6bsZ8<USAc-QaLCqbbq!~V%UCp_I0ꜞ@E^9 n3g[E`Sv`pre1'ͺtsݺY^KFduU=/
.˓`'X<?hmi7OZ	sJfZ޵7֎~ں);/hQdtlĹY4y	B2D)`*I)4\WONVQ^k@43+u)>]M%Y]"bWy,vѮNl-(A<a>~:Hg'=QTnY
8A2㴡#,޵)ĕg#.yrlJ%.o6X"3fղ7⚒z/dRJԦwul&Yn[g]V0|cL$Ϲ	dd 3i}PpER$#Rn}˲T*,C".27(/|"Al龯e&P֗viCGYsol$uhbz`'@?ʶq}%cܵX8'fZ|hVZZZ9+ӻku$&bؿcv)ꩨx~PϸzvPF^|.JfPKA~ltCz3ӥ!_ ?sk-95H]LbQ 8u g@U$rkby	E&=!|xF :l/aP&clH%_f!$u%m5bBD!?IQ<GK3FHGId
{os^IZۼp,6'.B#!f|)$?q$N7f~Ӿi+7ߤht]ӁbSIFO (Am%Xrs!Nprl=jعyF}X}Ig!hIfXBRIvTi' h<A>U_]_k80HS;p}69)eW<l괎zq/әh9&~_}inT%c:  Vr)(7	.񁖂N"Ɋ t:VJZͶ3Oci O2"
`|XOq"~	 Ǽ23[Aj$f ?G3|yG$bV٨l+70QI[{UN<zXdx|=bo7о]tJ=&gQy#RW:,3fS8|*HPH̜#TEͩ5JJa*cpY`_"vߟwBѩ]aI*IMmu{7dI+O+-nq0s8im<G#1VaDsOԱ]> KS̳uaO91fNyܼe2@CM9br	ീ:lM	plZRNK`My#S:DƊ:XU:_pZ]_m3x4&@2`ZuDL
12Ov룝{J7X]	'@Y\T|A?XXW\XձI`D`LMM0zzYXՃ˔]B4!;)mX,mH&E3<?@MPf֣bǐ˰jl6@tw[r9nxPQ**4F N}I1kbu"Vn+$t#kD6i0ɋ=~bd-)Y7}Bffv;qt$8|+m|VRc#JZj(JRpwz)*.1#6)[
'TtT΂1gJYxKhxQ<U=-!Veh7xϟ?}Ys$&ԶM\pG!<\!LhD%}mhB+J
Z;t
_:7q6g>^wID\ֶՆG<isxQ"RF8t#<;TD/a:hL˭roL&;0Ljsx17vQaYIIbcN)v1R9:Ƶjs+{79S{$X0JAN*4T6\DYTuK,zr[Z>QIw]FV
K87@f,ah47GJw9zyQ`4.g@eՈjGlrZ3sR20G3~9ކ/[_Byˣ1Kmݥͳ,L{ZӼkEN!x'_up[+z˵rxW-WM(\<۩kG%׮zwX(zRHXPXCXʯ}{Z9ڇp؛?˙ϟ5?+]Rus	̶)3oLv۠zO@-blŃn?KIF*}@݊@9TۣlVI'1˖]\"R[KklJ[4󼊷E$.iqOثjЀDր
sڣ(dZͪKزTuAhg!"{jLBb>H!aPJNĨN[Hddzbajv;#E^rѸyi:jPǓ
ogտ WjX]` KxJZ}ya7k{־8 I|}*i+O}z{+Ф74+RoŤϸ
$334.c|Iܝ ys``8NfP7=o`F#3SKuug~'r`ӑ1FڝtǏAKBEG gi90'a"-& j"#WX-QBEeji"G-yТ.	oQƍo[x O-uQ$w31ᢎ+*s2+Zs(]O$!Ti\F?9493ݥy6_lNAjLifPlT#dΔf/dNbL8JԮ_AKrLUmԨ>25g1~xִ@6Kc}$WGq=%9CBoB:]GC^h<%ٚsQ3crR
~^rX!pe\kL)7{i-E͸)$pcǃ`t_eo>%f7Fit]it┤Z7Vȭzt'~=((GLVUB}2|kR̡ܳa_I&r=ƪ8{4Mhp1-Y3xd;<M{,B^۬r_  R4qTxوnSNvPy<"XݞѶDƬzCX
ZDV}it+ړP=ĕ)MJQ$#<N})T
.DɑhiV2'tCxw^	<P6d*K{Il7Vl wKTXIA.c7lm0hOphɱ
)3,PP9].۶LLhU&vl}z7ˊ3ab-Zc ҭǽVF*F44u}5РW1 V5y3X:ѻǞ1g##d!ޚ vb`~bdqr8-%1jz شӠEMbkP' \[;¤n;:%(lpcN?=O:wfb|Eh">7]л}n\l\bF`M& #F/s $ L3ltg<M2w5Π0)E'Q?xD>C]kn7,~h&FxSߌg(r5 &f}ǆ`nf0
f(\ U$?ms HIs(9`ʓw:K 0=דPf@}4ti&LjEd~ۭFqF![K074#T$6*FN$W.Uu@-4)NBq{mÞqd~QHi34ANBӆQ`LC0BgXaCGh`V݆	6ԣӭ5HCZk$J Z1?O]GzжΖOE^ DCfU"׊  q׮oRzI;d0oF!O1'bN«RS;yȁ?D	!d{NmBʑOtEbmWv뛍WG_	5^^r_+hmӏ	9%V:&.j]l1TDwkJu߃I%plCҮQ٧ѓK[MzDw,QO̒%Y4)C  lbCB+:Mt-{ד}݂rWOXRy9˚ʔ[T>hSVUڹY煴A 76gZ20LHfk\"96c.d-p,9wGavgu[8}
ׅy+=Rxoޮo&oWv-ςNrv3	OX=obxA(0үБjhRN,_L`ҙ6oN\oܜksio-_t94g+׿V?ئ:ZiA[`ɊaȀ:Hω-5wQ4Q<N`qsĚk@yUc{"p;	DQIc!RS
áV\gU6o`GA5 JBwd?G>٨-وŲ7OP$1J<]kWLcɾ.zl;HoDf~6,\'<!>:iq5Fv,cӅvFJr;R/'>>A3T D:)јvMsOP`J1=>)gbaUS.?3R_ݟVi=RЪ[{d;wUsi>YK)0L_bx#YL/%a2bQ2 lӖsVXNBh	!a+S2tJ+]Hx|dZ)Xty0:kWaN/N>a1Ì2{ci@ȴd56iwEtiBvU6\<F2ca^=Ԫe#K	]&[;BVJ&Td~nf<6VţtLЯphyB(x\ eR 0vFYj8~l4a1]Vaa Y@Yb&XPΑgȪC"bne4dŬv&
o
ʀZp8h~-
tsvzʙG6У_StMb/ȥ4(AgHPxYlKޞU%!vA+ñUv3XOZ9u=KG!4R!ai\,r,7i* y$]DۑM
-4FS&mp}yy%0^buˑ $!\:Rp%ڐ%YxN#Kr,1f,\b$!a
0QVFCR8ܥ6szk92Q}f@~[-9!|oZd6:7Rv<-yOw05V@g^\P&@Ab^$xVZ`J2#ۅYb:R>,@2eEӪPiTj=WoiKKë6KzBCKx<P!(f	Z9(
;珎шRWRn9![F#,$N#\ngUŴ9e$VuXjWvg鴹0qupٶ'XR#vI.	Ku2"$sMFct1##|e0UީUf#9jf¤=!BLZЫ$wFC!"tXT	SmV237u#JӗYÀ{X);%dLpC
&1j`<LOSOcaWPi'Qү'´6c-V'ſB|!/ȭ[2S6Z}nDfQ=[k><>TDLь})iN%Fa1x%2LV=iYs64iI&$?P	Y!kN}.]GNģ	<;t^Wcx>?)|.Gw&mF$ageo3j^FKO_4Xhz
*n4eo:)X-	1EpbYvQŨ`E?vXq4&}kM)VmzPWvXYYWs<ƲlN/S:AZ\%>)?@ Չ1rEy1\ͯӻ(ğgIy42	zbSBV`m`/mbFCR6[1`[@ˑq"WNiֹ-UH
'
@ku.F{>vN岼7BrM5Ys9 \oiO.!]lRرhXjG@cmLf {ʪS(;n_cLH7NEˍ	X65bRaK`;!s	|D3QӻͪZ9Z;#9>WL+oIpoaZ0ffOh0ڹk$oڝ6
z9 ˄u
^4½{:S!#Q^ r2V!BĮ,>bH-FϛsM]]kˏg[YC(z'֐_wV/qSvd&9L)8w\o7@1䘤_Ra+,`vv{.ˋbU%HȈI![rPcW^"n;,w7g23&deCz{X%֌`.̡4Re S@γ4*\txyz
xG_gv!ceޠ_+T3'38Vt$mZu^+*%bGb]-_-i}0I5:xʻJ]= ?qmKSjQ(@3ۼ@鬉lxjݜL
F$>e5W8%uJp-E^?w^o.4M|DYڣp#]dxaH:.<<ΔdH
%
	1fy<pqf\6I3PhbQZRLyOFZ{>qsJF Uή~f&sZx FϣKHW!w4TO21tK2Q5{vnrK^F:chF/gF
ٿ^L4'X{@`4bz
֍8Mҿ"*C+ޙc!x%:ҌuFoԂ~ @`O&pTq,[PŃl)qAwZPLz'&&aLʻb!KE_Dͬcsc^ZPU.yi/gKOWEeð9nJ:N}Չ{ͲJ8(yw6Q.zgTy	f8aT4)J(38 q%RN9b㞛s6S+Y8Is,A:ȔgnbNriǠ/0;8NW0&ͺ	}Kc8 z/Q8;VI?/7^	@[sXw95,Ɲoԫ[t9ํ!iL#>7;C	َ*pآ"d%Fr߶$O&I9ޥ<+ӾޢWFO/{C`7%/h4>3^F5e6tHDm5mԃX(
"nhq]r(,+=냗]٪F1LF1Hy}:	"7#t~MRv Fv?a34+#	Ij?:tBm'kY*mɬu}I(g~M1ɴ(QfinM#`?@aSwl;xmOGFuӐ8r6&h>|uMEPt,7/h8Ȃ3Qy/w;CkW%!o2ƥm9ʜۧδi{-^/Hϊ]_-l\'+d	-eu?cקbMR0}ՁG~-B}98gX-9`ܻ"h*<\WWCrTO䄘!s+2Q#2cVjdv#h/g?  Y!Z_>-RnyyCɶ0D?W߬@t"kĿd& fh߹w{N
:9tI4'?k'PL38oޏ6kZYLo|>"9a>hVӡaN'u(\JBf]PR:DKϮG!,gZ79|-j*iDէ8`.LL3#v<LOۅ*
s:å/c`٤gxKq<<;8LK`Wt5oZl2h  k>%aVw u&@avc:TXY׷vØ{cRyHY#	+IJ){#>uLx̲X^omEq
K?%!ybA' ,Wzykd/p'iKWBb (e&q1tGt)V8ɽ_.vNW,O!G{Yyd{N$%Ѧ>}KmPGe5fAOE8JӦ_0ڦqSt̘Gs}}lϻ(
R66rȋc8]T4Z,R?"ըjӐ$'Qh?اqj6-n1weM#K&psb ͊$^v&מ6 *d]=߱vɱ?9,^7f"Mߪbʤ݂zm+*[X`h4uRSW~rR{o|͇l)8/hg-D	%k޳l*͒8ԏg	&dl]&`H=bUÒ5{EbpKbq;A(=tv 1Ip|.mYÅRm扡بޚȐ]~[Ξko*yujt ˣf7uYdR1EȻ67'yp]To y1׶YsowGBV:#Rkp-Bоc/0?W(9=dlRX?8]<& }}]6ݣTmyG?;DCokL2R8д?ebv3R+pu_tCKXb'qTQefɓsTxf.Ӗv#RA=*Ƅca6hk"ehq\la6!7@GNz1 Mԣs
QŞȗ&gw%bMjxwZ=*XVBxR
X^fmZ@g1r'Ff	ǿknǵu<QeuegRHA&gWZ*<arLD+d^6#ClLUm`6]|5w|"7gvwIpH:YMK2XA`0K}lXI]2[1R7&'%XX2cwjG^!X?v)CKhB;yPV48\Mhr԰KĆK/}yT!q6Tq8v}jy{6[WךC_ܯKJy(Z>Y	S[Z@ojR{+Obc{EXvǣӓ_t8p7CBm:V8=lʔJҬ1;TZ:ثm7?Oete%375sR.KJ\Ѩo~L:09W4ݒ	NI*bc5e/5h-RO@FAܧuBdDa8"CMa<۲C80|9(+&HvB2'*4@ɵQI%V+hVHbͽVڡqE[ɽBs:'+$g$Yl1BO'`EZ_9fE~wۥLΆ9o?O-eMqQ؏!}m=8wq2_?"dw}6~U2aH}pE9Irĕ}񜦖v4dJƿ 4Ѕ]ךaflOu+Ǽc+Rոj9OmiyzdLZP^//q5Ydu<'1LşY`3>c}3T2dŰM:H.u"Fm7,>?A_k~}@>c#v='kiݵT5Hxraaݼ
)< 'm	/+f^Xu#I bD}vhZf2+vp%qB3咈Q;o097ep6Fi9	#ĥ8c6pwԯhpMm$<Bח9
rA>\dQ~0a5"rF )RLCl^[o^5\o&1		S@d%3NVsD#(00\Y?5+?H9.D)&9_Q\C0c9XI[FLJYc$)@b/Qʹr2\ o2P-~)
R1i|z@ܪ_!~[ұ˞(07|3YPD\46[hJ>WZ^TO.h!Ec+t/`u>%*zrR{2Uk?-˽1\	fj 5,ݥ螭gT?ڃ;C/:SYb^,SX$jNy	x|QX-Hg=߹9@dVfKAR0|cu=1ZMY^H4Ϣ~i	6e)gE;nHִa䫄i^Fw-BӭMxn+ڋ9A1H"nHd( O|3m!W4)~&o-{(&gaؓ<
1^{W)aśXY~"P"jQcnBH`AX:(h/R'_vLvVSR )pTWWPߝf]YN0?aMeBCgvS;rzv$fziv)٨	 @-)
mP'jSItic孆\~2
d4f|:yYwz4\xRh<P0]cqB~娺5
]kӥ,}ArböAG5`#<h`@Ag1;ed_l-G2Ca64&WxN@I#nՒ̆:4cT3Zkk[\]Zz;7#v0-[rFχPT0݁Mׇ.7lBBGl%RHD\;	[g4x{pCa\PllL.}(Y1sb+N'p
]$_B~A {+3Ia(Ch8=-՟dH#X=qtb3\eb	CFE^BO4[:cl]nZJyk9]f)MB:Y&҉RJӓ!	cDFQ`$IIt#4#DbeR,LJTi:*&"лGo7vY1XbDXQqpF/аsǠsgaԊXhu7!lbxFۃ$+6xCL3܁3.~KdG֗	[Xt^~vꕋ1zr|ss'RLޟs<x5ѺuW.7%_>0qu>[|
n H8.~$9xKK8Rx;<Q
/
&,JPXW~%_6(mvmxtU8,BGC`Dtfݙ5oeMaֿT2RVs2܉:"F%=X)<U[±i%Δ&X_ꂪ(4&M C#Ķ<i䙚zC4c,EЦq_ߌ*	^]14YDa'D,#<׎рy$#t3_:x&N;>XHcd;o*ܙEyPQ}̝ S=$sY$zyLʫ{;+wʝTQeiʫGT^+S^h_@HytD	eN\%}j+tg_&ܙ,Lvh>l̝%̝03
Dw!'b,Jb7;*bHFWv{cV&r m9.^V׵j&_oVWyf:1z9tƖ(W`m
ݴ:0]1~7*es2*fY'K'˂_NC'm3!%b!1O *N;W1\Η
|Lb8Ox_Cj<O
07!LA>.0E^|&.ҥW_ +zꁒ++(J_Y1W3	!,"##I7f\BS@|Gʇw@<C:|a{O1JH0c'hR쩤)ľ,þWa_#RWt^|ڥqe:<RF\w6L񝄼1r¹TO
C>e>scV1JlUiāL9_wv5h$`'ol	"OOw`z$^u%GQt5WFH>QgmSA8^HJgZj>bZCV>c9S|"е<.9U<ժ^kn9i=LhV~Cuh$ U;3и&$yA>G=Iѯx\9u(ؿb0-J^[!y'^NI/yp*)cF߆A˭4}RڨEg9˭r!7Krt.,vDU ob'}&hCB7¯/;OqxԢtQjԟ}-pwHpsʐI;]mbc:k!zbfw
m<!z=ͥ0%wu&PPv,Vʊ[~T׎g)phL/D6Q`wt3:HQ|B:-WwFӬd\>PS<C˧
﫦>p3Iټgͻ2/Z{ڸB45F-cBӞ&Ezs<kZ>a]Pi0Cɴ<Fb
Zw
wwH%ͧ{O9S|_xQNch9_}a=K@XrN.,Sh	WC'IU&`)#JM!e^dUZ\6y@qhZ
GFUI_;@@~=O}(v+lgLN.đT؜.ŠuX.ҴflBC*3nDh69ÇH|1,HUWeQ{ *ױ 9Ό)IL@ﾢNXJҒ!0I#i)͞@x"
vs\ŀ #SSQ-IQNTRAi4(gq|eG$@%u7.|ED-Jz^kyX[[gp|܂^1,
JORЭ
0?6ͣߜ.'wPQzOuODjpZ^J^$Ugil{Kg8C `Eny[g֨Z<с+6Q~`r.
9IA.x?M^Yx{Eðǽ&ݜd8N-M]XQTy9̟x'=~;`0E['A_9,Ԫ[^7ajr^$]4 YpXu3.	gqt%#Oӽpމ{_)(XԆ||DG7pZt1(pdVW폇XuإEjelN "D/36)J;Gp:rqm8}褪:Y5LQpɖ@F
ZӠV*a7sPc	T'SaXM("XͱozLչ"Մ	HzN"پҨ;<8Vʰ%+@hRSP£qr/#hC$XΣt11e{W,0F\y1:3(ΉOADM1r$^T/WJ$0/uZ`Q@کS'xV;i>m|!L5:=jUFY(i)}yiKμ>>[,bV"4ٮISunq|Nj)9K.cd(d\sb$9-4
=tLm0>-	^u;hkn.b@cfPKu[$Rхri#-oU%cVcї"hS+2pb7h˟jPqoli@jf@oZ0Hkl[7kqP%v
JEw@qmf@g4pyhstP81S!a%պ2vݭ>ݭ5Et&-;f:'u^AK+cWu;_ѐr5i$LQ?cE">&ôDJ+W+?yzQcr8⥴}y?9==}b4 W-!Iup8&xP62>?:QX\Y_YYr\~>Vgwg+_է+֟=ZY}t}ԳNPj{oozk&ӉG/(cSOK*[ov
")"f'SzY˔joFE{@\M.F%{@Soj-szR9=zj
~Fj|z~)vs=)9g9/
u_
DBm3M'm` 5gD41<$;g.ԀQZWqf6E%^RxKFA0h'_n*RI_AZ?]]gOWsϼ:d'UQqCՅLE_/GXKFd_2//>0jۤΤ&}CmE
eTZ@U_w%ʅ(%Eqv4ֿ?l.j?3>s<tzy-s2k{^XgC?Q8 eSjF_|Y{G|2KKjvA
φc=gV;jvv7|p;DEG>h[H<W{@Gϱ@u{} X|XG|[4>ԡ'/C  T(DDZb @5%jKRM)zG
(ĂFH^[4B ͯyZCaxAD~xVDȐO&@!L`u0ĸK MK/,g2\vWi\lU{S==8
;!Q弬"{Gx{u௠^Je*mFQ=ܪp 9	цyYo:bVl}ZIhG0-;y+JìAv1+6c? zt'T;d#]mbrd#g1ڎp.σNo_ۭςg~x^|CUL+?<y&Bhji2@} 3u}1/<wpRB	aXPFO$녗/Ѹy"C?&';d؏h_سLsG %)	+P䁝
ЫO69V;^c j5$(M,'ڨq9UV+̌$dvMWZlAF
^[nIM. ;=csx^y>iio<tZA;e,oqW6`7Qzf)րXJ6π?E/g_A/{2h9xc(0Ȣ8H6c==wD{Oо{=*zJO2=
-8.`	{L&p2~+	4Ht8v-7CtD}lz혺ySP)<=àK&*ĠeT.x_ꔞ){E';0{z햪dMD!Q<֒[OsXEPOʌ8.001]%"60Pg_Wh18P,ta@N˓|	4зn erl5Dy?iNM{?6E?e<0(:ą~:1' [鍀a;ԋX5;!~Pk1k-^+s5Yc|0#\vM;AmGt]\ZٞMhg<zOd<@SG/]ˠPqhەr?EwnGMҜ'O*xDӰ{\h&$ Tʆ5eSC>%4[,qmeR7,9ġ_.:nػ]"]VcrĩIlC*?mڂ>BksyLk?r^Aj;VYY+E[ҲM2ã"Qt)U	mfuߪnMPgL4'܋-eXO`>=QS^{_@LU'Ʌ$g O* 0w[(kBϴ(:|ԥlj/9C,HtPF<5ƣn?P(Ca@?/g'='LW@tgZ8"AÌPҊ7\G1#@|RkAhe`	K|Y4l gzs	Ԣ`I\QqXL;L"l8'4u&fjGwm>D{6юaM8TeC&Jۥ.s9O\>VOVddlwvP-(y؎;%tR6~ҏ~al0bMq%ޤP1s^$2R9l2)^/"H&nZ>m҅X%$9Hphc;p-.^X2-!2RP/(H]n0?j\oo>Y~515Ub?oF  ѼьÚJ}T>ev|}v⩈E4ˊ{Gm+TT_kWؙ)SXFi8MI?z|yF e*N;T+fI37_W~iT_Vko:~>h2aph"\\]{-ؙڦ>y\&ކ;BS֮]mZ]Ydխ}-NOTRO9}g05_@7:ZkcIFJlo/Q@I=nE,60iBiᴹT85$Lm}M;__ۻA?]kϼ^l,V@kjlL+?<=[awZ_7w+*+ hD{vأ8/>F8`:
{QC(f2D;@dUTz	cb,[\"ֈ^fT[6_W `1dT+7 @lEZDuFh T{߯gC>OY]fr]CPn DHVZp 57P=nUP|Z\Y-bG|:GzXȫf!+=4!42HKP#xF/Br~KAmJakSAsA)jq+OO0gP)aTX5S]E`C*QUE]L@cPп!OUl7_Vѫj}RWGjSnի[ǻGV)pyweCD*|TL	vFbB[hNFD8F:'/7JLwa3z)|%EpIBa:;sMw!`"_vImH֔t't!ьoF#.tϙk22'g$6ʽ`	MBm(PDE(ױnpl=YOq7F^RF ;'?:E;w(8jq]mn "kBtɨ0r_
P"	H#&,.8X9t|5E]8$;:Fǯ6ʂ2f~-QjpZ6#TÄ2Ũyq6/%a`xqO-5-/`VTI9DRZؼ/}OA"Nݢp%vj[x?K0}{Dr |\ Exw+m]"'V BALxDhK͈%-D?
b$/T%,FVh=%(tXdqģuhհw~aYMe̋͝
MgҕDükdWK\b˝uLY8Jԣ_
g2`bښPZIҴUp)T/uEVJ߿P cBmB6CC&~-_Q 4I^Ef_C^$Cȋi46y1qMM'/RE~b
uŷ-DZCV%/"<jkh̐0@/HATC  KE%_cԗCiPĠ&1ѕIy,)|i.>*EBor?/|p8QlX"+H|5A{^aG5=*PϠ+C^C$L!JJC#rאl(⹠h	^>HPB"~Cx䱷bd*u8GB{QQh	04!PZO2ݭZM=#Ũbo#Θb=F-1.g"qye㔩FF)[
~nmҚFta56p3Yo0w/;+yvAP۰Ma0e;,LB-wҀ{z%̈ ~XD*,o(^Bc<7wk75m?2S!+p[|2$7(,(8oHxBM."8~9ݬ= T-BNaUVܧNpeNQ4)S@k<4k:=Q䅢oNiL[pbv6C8⸇S	# ꫚p2"B@u,gs`.d:FZw= bxppGEQ(D+Q,8i*pn?)㮚)](g|,P8$*6F򰡍ƃZY &6,mSHMCK[Ͳxeވ8Pp;50Tx81PiB͌NAEID	cpOżL3v!#@2$BZcZ+
xuNpOĩ8,]bR4A,R,jڜh#68#d*:_^/g._0'TCF]Sal,hvUXt& <6ֱ}ZLXH0ThCPʣ!0R>f]QUVB̾5Z8Lj@k/K2axjܚ~(v֋Y:oY1\^I> e24/	"?/}dKcJV
/cM61P6&em-'m()֜`GB~(Jw?s{INzEPvo2-/kO"@*<s%89@_B`쵕@elAJ;t:^_DltdȬMAc_͗T豰>䬽`PĢr	-̐]BNA訟/D,MT=ўkg=C$=[1$\A
ƭl0<<G6wX}Ex`=- )QE&\⠃N0kG0`AWJa.>BWDIŢXYQ)c:1Ԗ}<C!W՚ZWO3\}oЉu	T c@Z8fm2$|?C /lǏ&\D[O	<7B Gr\?}~t^!r23Qp]n[uRQOUhq`e@?2eϕ|/NgxJcIв^e10VߩR-bq(Wp@ݨ[,MP-c
'	3f}a3zl+Kk[]!>9QL{ťKb_}mð3N[8E0n{3xLN&1>&FfB*3Ӌa80<b?ƧN>L ;P.̬&Z\lr@|!?t.$w(n:()M@S3I{Bf)}чj!PC)ZPACB`C(1*G֌9͈ԮD>D[	zfa")Y@0El9(g):q~U"O_yO_FT1'lB `RwGv$G{,b/IdIbmx7,CkknB	0D
}^6"zJKSЃNJHZPA%gd>ޝ",h^E d#VlJC	lr?/b9Y, /gtϧ/xH(=egͥLszdIC=zY^edbPrLB!EO0[aD1a l5YdOޗN]:]~i8	85QK9+in<vlp^C5A]&[K4i8qK{%IQX\8]P=&QA9+L52PU|-X92aV	RG]QKn^rXZrMm'9)eS'*}*V>fe(;;Gtnb%H[@
^ IuNO~7/=Cx[pώr~$>=,_У񳵜iFJyޟ2OOp
g{8-/_d'`Q;^|VDG|\Ī~v6PBJɊa
K'GV 7!;Nkڨ6%G8\A\/l5Ex,VTFv'#0T4B"IZ "G(DpnH@Q (3"뀔Q[j}<iiH \cݓZ+ݣQR63pHzDYtńsHc;0'E7T /gK~" gH71rN4Tsk"DA%
7Y`Tq+Ӱ_4ʒ<	a<-;n"j " &BѡbIt(cu')9UUVV~ڬUʫsZ4$~Ve|ݍڤG2n;_JLӒtS=,iS[
H:^ hgIe@Bb$Dh;/>: G8J8:y&yBxnkA#\C bi۝ 	0^4KkIʸ>tG"Z6L9tNHbE"cV}2ߋ :QNo6py^:-Oq[7,	6EԷIVH9ep&i)FjE'ǼF^ȶD;vHDQ7Hx	N x/K!O92IUwIڒMf GwyYIO+m\ :E]forHzVxw:{SRpW"py=U&:tP\)eE[#cGCWWͪϨa'.7~,E[Pqdנ>M[WkN
ClIb4϶/_e<=Z!)9;JJۘNب>رxH'&q4v9v96{gN%j&t@ou/űT.RhkRnFDLБR1)38*н뀒)"BȬ0!b#0Fkxۀb OGo΀Ȑ'hs_^53B0s!Dh'٨n="ZLDS
e8[C)#oM3\-bU0h%S|Bl@X?aYaUӀσpo1f#c74`5MLS"[LgE[G&x@ ;"ر)=-[="oO8'58UcT-G0)e]Ƒ'Ja6f0%xaI;f.=fshj1 FVyk | %y$ǃO:
-&Aldlٮ/D<H O'9,d몮KXX-#Y҂!Sf6[uGCܠ{IFaNܔE#d}/` :G'Y i͐],36f:(l2;NpV
 :C;`JD"N樽ۣR&>iOzaM,qiFj5}{pT*ZAkzr3Xg,i3@yD@~cvB%=' cȖFs,;c3)gW&փJ&U_REv7P^NVs|]xO("0	{0P=zk =JeI6MPl/psU"3`ٙ5@bY{Xނ
~{tLųe>=I=D]`z0mrS
3
P(%;Խ;髇 gdylC:֠d堥!JJ_i&P|tǅ䍦QsY!R1I fپjl&!(
'af0e'NBڔhs9zPX>DdEo[
퓾)Y_78$$otQ\!"L<RGbM͕pQ8 j}`F0t3׷P64ˏY"c'[$qE$@=4͜8X͘/Swr .毀!ZppXs_3_]Y75(,i%6&e;Hk|>CWd:܅bƏT\&-֮J$vRb"/\|:E&%;Y6oCSV	]nu]9pl%7[N.;cf5@F zv
.|(G-걄i'1g얕[|[ðSwGm^A{6 CG*@\cA7U=v0PC""tጎܔhĆ<nÊ@ [͙fWs?e)4W5deֲ=;UDo0ީ^3Q8b)*,B[mp}裤+bY+ B6zthL^0)KMЭL	9,]".Q,jRjQԑ@$-Rґ={Lyq*rWa"Hn,o BnuÂ6ꤽkB8NKb%sv{-A;qֿ<섾ux^]*dϦli%`* ql0J4`"p}W!:LTFkpp^Ş#RBxEQ&{TK;{Dg͏ɹcACwZ&&TN+JQ	$%Ea1F??oߠalɂ6vQN eLhoڭP30RE&#KU4`qψ;Tt4BڒsV痖6Z>Ҳ>a<riy.zw-)5z㹐XX3q2F:I;6@45~KiwHL&irԲw8t~mDT `}]']<<oQrU٫. ǒCw{сzGõRBrn'GXrB8u%Z+A=ֲH']w/m"5`-YQ4RpC=`3~ω{/Ė˻ΙCDblTޛc'Pu ס#I,ZM0
iю.!	4ރ:	Tɞfu:16X@{S_@_k#y@u,8qp	Jrnɹֱ"G׷טpr>o_$IJ&--[D@5mMƼM݃eo郙V<3@vI=_g8'8nJ4]έb>nmOTB?gh,wl$HQĕ*֋ɣBXBU~Arv]Ў|EYQeqcxSbC$6d6m'3}|a'6nLuI5}.}V/> UHuaY{ iǈ(J8P@8`}-܎]t@1Lh Z(VN_px ҅';;0lNҵZ}!enY$MA]3`w*PWywxT 4^{gtvJ$?Dr-Pi	J^`ĺ%pՏ3pk(}0ırؔpZ.o E4?&_>[npQ3ưlf.O{_L,Jnf%;t.}B)ϯ%'lENVQ--esIy5
V"E+
˞E+NDELxu(L斫mEXz6(3DZ }L[:%(n눞Ema^OLi9'zKFAx[-[G#iOT4^#PȀM{? &$	c4 Zgy]V%>^QF,fg93ΨVp
=Ar!o.w Eu'o%˻^@2 Asz_* "h90Ev 6s>\-Bc	(gZƚ.AWc赡$"xv	,=eX9|	&z c:VRڪy=cjFmBn-Fany#h'Xn$<}4ĩeV(z=2<{5uJvZDʾ~vs,Í:yY#dj@}7G}Zklұ04wq1fÙ#	yȣ?ǅ4p)<0Ff;f2j! Hqy->tNjGӒV	7C3Eh,q	Qs9jA<YHdFd1DhTgz'^H^Jx><Bi6љAW`]bv1UL5T++ d2⹴ېpaHc wmMj4, CK`[hi9vn?{oƕ,~F#-g6`xȍԀBRԒj=[wKv2w%uN:Uuj9K\KP׽l̾cA _nѢyzj,pLTQ~*7EMP6E\UNTxbA-D
*GMjGwx&'4/(Eۀ.ڵ&퍻W'̝}IIo4E߂t_Aie%kFmD<cB=@vk~Ms2='Wy,m}}홌FDh%)]qmAR*A^x05yYν\9h<0DE7Z;sHJIXNM14jTmU29R-h87%槑i=L4F=1ZIK,9lv`W	䲌Q>.BzU+vג&ݿ ali[Yrf^Zwr8C.Hu$8ü	2:Ɓ2yUG'?=LViGNEn/C$w\OqN!iEhɳɌcߔU;g9mE"[9p{zLZN+&tVݲZ0J[dljD{Nd99GH#z!cѮڰxS5FRA$%zo)F8JkaHIM BO"FDyĲ_֗f(aM iAk;[<GGM]ub4l`BǶcQ:D5*82緂!ȝn&k	y!9NSWT #n#<xnN1c34 p_)Jg=9P-VCC5~s/(2lj e1zmaEh!JI\lZlOe>d "V?]{ܱD
k/6:SLHs#b|.dr`s:ZNk%="r|E~oŗ/1kOa2Y)e!@$}GB6ҠPfq^\pv!6>6ӑ4qAZ[.'rRx'𱄱{䵔1u
޲*PoRxX(Tp⌂A4
sv0XveeGKħW-_NaAEHaHxƲF%vI}n1OOLwN$-h%| ;NAth뜱6dH]yNe02H<HyLPgyy{;cˁڃw0x,]]F?P^-!"JH7MXrV",j#칸.Z>f@H5Zv9q$c,9%&4ʦ%Y,^@l֜:prn>neزܣNL[%<PҌ;cv]AQYdI,b:P[b>vnP4Ur.CL.9&s]ɍ%nO</UIIơU_BB얽ulS4kRِڧs&r`Z[Nj z>O6;^:Nʫv3b4I$=Ǔ7kY':nM)
Լ9(GW2tf~Lwt2YlQVUY;Nn.8h
co=oFtubݍ+極VrX)pKh#F6L&x6p^(UB ߢMmMm_jZ~оkoi]mGwq;,Y;Wg&pZ.-{͟.
"06*I=<E)9G6'6KKƀZ!%ΐH%D4D]:'b7);yi;JJx3pmrK>0|Yh fZsMg|q('/2ѲKX+q	Ro94#Q͕V"Om
lфQˉ8f-ԑg"IB{RoM}0 J<5. j[ϱ^=fskk6CO*?dl4t?Kj$'.#k"H8ެx'~/>_E&.z)P2-ڴdЙ|l~l<xPٮ7nOj4hPNS{8z^, \29Ȭ&D|%4˹xu#`7=cCD@$!N͇qxbGƌ<>
(nḺ+$wCVz(WW=7Sa\BZv.6\㲸]pBG	̂(4;>.b,ni[6<+$%3=1;WyOL!)p>k$ŇepBzK!̒I2#9m4>OrCA=,<EtCr?&-r"9r-خ(%m%1En:$DQj3z2J )YrA>l_cC9p0nq--`r믾C4Tg~iQkZhU_v[EUMZ;s}RicxL@TϿR_~aVW½chE?ۨq,p?=:y9|*HiUL7]W7*0PVV20_\B	Zɋ_42tFYd8Ur
[H,rn9M&Ckl5o$+ta"Et^.fh75( hB{79a?ɐS⹾d*K).I,8DNhH1^$Oi()FO7o_7׍X4HRXn§IgB+\ldfQP{C2cp&_o>CL׵	!B1kBFW_wd @pjWh9Z"^E8o?7>M>\3}k߆Qf|qhqLɸ!sG>Uj%L$KDz:Xle@`1C9
4^y%@%7;'ٜ:x3j)
H@<Vȭh-ʁAtҀj\ÈpWC·mE升-Esm+ׄ~Fӽ}m4v؃|ITM]'L);楞%7xxƆtNLz4..8.Df56.q8O$)*rٌ..c/ʑ7NhmFO8	Z%Χ׈Oо&\î,ų̗6Wf`఺ЅD g?QrLns(v~pxp3'ON'G ǧ{/w/_7M pe!1n,`@ 2g3vǃق. t[L[r![/|4D/>DVA"cbpJ*wŔGڅC5N^6Uq	eК3%A󇂝%]o(~<8icX	!Iu8ǬI$ОP) h?bʡCpzR~Lxl0Ҩ ^0	6Zs9ZpM.Zn#m}Ky1 wJIP\4 u1.4&2ܻ!2hH|θ.&ȑ,ŭ&{4娒lS*a%$,j#
X8IJʞ]zWDeȄ/ػRM4/-iMG-<S`2B*֍Ò	бf@I7իN)k8q4Z$#$	&M0yZ[im+<rxVض)Sa9[^2GF#ؘޡ$Gjڸ,^&ݮ<sBƄxw0dDrB;[tf쾊,7cá-)_DI6r:2v`fT&IM󈹗HpOϣ6|gk|ɴ˘'ZtZ#v9 f2V<AYt\Ov ]5YaIQ~ekl4:	`~%EIdꞛd.yYl<:wp͂GrU|I rΊ7C2d؅z0"9q$k+!@vSY"oaS| %m*YLzZ&~puFtXWbq-x_qIG,H0XL(t9Oes(RbCjͰm Q"HC1e
ѡ LSFD۩l^=_"@ظE8
IBb,:RtŜ~.vs*HAIC.Oe&&bx	_@IPU?֡&QecX	㨧R0U+xk'?06fIˑ
Vibx@]]bWrSZR@\b5$ِMx7V=xWH!PN:ݮMG_'
B54o4hqG110lIj(pO\0)<¹DYbM`|ö	)1M0K@963飴whH"HxTB|6C{D
^"٣,z%o'R,dݙoo'AM&MAdH`s^r*!i|aҝsJЁ.[nVlO??4C:F;tΒ2}kS"0jx:t%	L# ΢ih8aH/@fR p{J<[#!>*7s$r҇C`ծG!:52vU{@JIMơg~;-ܦ|'ԘwQY4gC㧯	-s
}҄gO~Lh@4dă J)hkdbt4g)օE0:*MokO'r֥ D8F*"(d_L{?*&m ľ)s۽{|p=?]huL`43դldam
Dg 骕v7;Ƈ	GB/^ů[v#-Rط܌AIs3oNs |AgNhyP6_gbyF&~'5mmi+e$i%"󧏝LX,*"9:`!o+15T_.` o;HV髐cG`RM^qO^x@wU$z;WzۈQ7$zaL|=bDYp<&:O$bxt4^,e<K%!1xBⶠB3](5ǱDK&9CWhf&L~Sڗ+)N)J=fخV"D9z<0_u|TCW5uGя
p9EnKÑј$ۜɜ.dl|%-6}&S2"l`}*:h>l+ x6`Ĵ3I UqF;7H55
ӎ/m;A9 !NNyt1ſ(5Yϝ-~^A"x̾"ǦU/C`#EsxtP>}KyH2w A#DGآ	+7kV>ˎ#\A ~9&mؑ2̊8:Ó5uUYyu8-6DM|C%±_f	j7Ed(GZ#K#͵09TR
(z5Rp<R".iޗ:odZ,23Vͪf<ى|~!TW(1}E5( =yh	uWMu6 c0jɛѾzbrY1/?]]okTeD4k<6|rp^{l0]ob(f&𜢮DǹhP.:?LkMǠm0,[/Ė_M{H'!\iob¡{>UlM"]E;*FT+Uv-<OS'8T~9ʗ ;6E%3+uHd1Qk.Ѹ1H%i7J*P9oSCR%}f|C&E<kVxP 5[]E}:9f?Hsv$#RQ&e5mPqIOǐ	f+WSZhvq<KlM)҉v0LoGDbeǱW31 ɵj6cJ.)ڪ tVB5"kWWS#b,Nf{とl&04Ιɡ/4iV*^{:,|!fts;ur맔;9㬢WYUt)g^	zg_$=F6L\'25LltQ	#]$86d@sa|T,21@93ʹ'aFH Qd<9c<[&=΍.(ܟٍDA
"sg`yD%%wT)鍍9^udbL)U:_ D]g|Ñgsv*[ʺ935	r++yqcFctTeʫ>i(,JNDoePㄆ!K6Jo}6(܅&sNS}wg6=<	'Rf2p̛H́Gvyn>7_揊XOxv?rƛ>n)PnK喓tӅiϡG5<voט -qW*P^K
ʐn(a(
/G#+ek?mVu  tWX+Zgp.p^	VZXF@	x,c\`I|A1Pj
nlOYލ2s{`yW*wmg&u(U_k<'72b%IH\[,y/.KQN7|G\<
H&1
x2ŽG Al̞)tqF?ްVr\3m\Əf`"lCnY(.ʓh3j?.f iW%C$Nz򳿻HY0kU2sT(hU3S7.@K78$dw{!
	R,vف/V2H3ƹm6m%׌v9LŶ%X@O8&\ )L!.E*iZVXND_8z}xAΏ\c	1G)F43Sg\ -Ai'JZON[r2ք,<{6rЂlYYڪ;U2ll*0pwqϛu*gA53xإȡWo>T<xZOX]o~5/#}兑IKr0&@J$[nSwݜȜY4pv`?xЄ|paZ)v$rUiģ&b-sr31z߲F;D7؟LXL9)goBcAc2aך0
FGǧG/N٭WvD(yw8n͡Auq{Y-Fh|]Iq/6WD@=)S9Met{'su/^jJ#ytB.]ݧt0Ǎ{ӝ114f
ж/6DyE7mQCi岴}s<0YINլX*ZUٿ@*etfk{g<"W3Sl}=ka	;Yշ-/^PV/iENe'Y{Ү6Vo^pn4Zkw퍨V5ނ7'_@޸j`jaxϦ ?W햢B	o&JHTqL(?-}15Á.mP)4d`"NSyz&㚳f=xrS1qR-V5gJ*}jzx	(탨~Zv]ET*,ZxgM.p'TۼNaPl¡Nk;k447Ih$j(\i4\'rL xǒ.[W]7m`,OC%IzDl!tKy hنPýaX3cb@`]h~:X7z1pT<F[9Ž{uΝ"\?S}_>u g[_DP20F3vrE;/nTN@~tcgBS'M#|tah~eDh&#NuMLxm egc?דp3F @xhtohE`vhּ^LH(ISmI:-	V-:Nm
"R=.q"C֩gCKY GhHwJzVB'(Q%T/UbX%9;pLmQ嗔-fN	)i7KJ(#z=p*'(NOH.hؼYcRtOCe}Bq7j,ْpwK`nf	=%o[v+'?{a*{{|_[}l]8Zξ|zB)_$)F~<lMmEk3o*/Ocߵ+r5w&"A{Gϟ,ntDh4dkjXo%G«R)M[R#jYBApaS6q^C"`9Ƽ}1s9FcT33}A`JANj~jVʹUm<·QkC^247k$6QxAw*lD_hZ*H7Ã}z5kV2"WmvkTeiZK'ȃ#}l4yOm(w2p)Ғ;i޵~i^D6yR|kq{Lwܜ{rҨgkj`MYʋݽ>;3l' 'X\aڽHMwxS'p	4kg<I:,{Sedq?V Nm	*B~&VӪ5VqrۦԾ>+rFڮπ 5qM_Y;jTZrf*a@yXÁc'C)2Jn`l5ĦYdv@gTx#򇟩 A E3,K,?x7dă;s[\MrVм0?	f%F)Wnd%3 H %\ ßa7bHZ$Eo5>1=S*jIݓB:QΣ쓏r|̭T(Aw
X?LtKsyEW/$Zρфv`d̨!VTI9oTjR+L18.W-s3=ϙZ>=[Ba7rCB fǜ{XTM!̀'GQNoru1L0 QM@=:A)T6*.]3pwLmyO}p R|'M8	=;L*o!rG' ҬߐBwq8D!^L]dkD]CD)*7;IP$>Q-arvrffR$= |R!CݑF_@#Vs޵{Z-7t|7tO;GOJFN)OJ23u,q7(+:x~pJG}Gd2Q07&@DV]*ڄE[^In,301lQ|шBCmyٻ>;tD-Uw.	Tۨ!?	#u[Qef$̭c2TN1<Jg#wCs
/Pݺ0~A`4N;7'/JQxix/f{>ӀS}黩>u^ԛΖe6dѨW!S'<)V?e$rN|R%G(?_.EW#W*w/%K}пww}߼w'пw_ԍ^Uwwpg~{BNfD;7|vq2u>I/&eWx˸Qt~FTc	Gx#/ơwhW*Xtf}.z9U
AT=Tp%]bɎGiJBW$FKi*ǐ1Θ}b06"o0:nF]n0EN>2[n*{ü`kgL,{:offaAI"
ei}Јz0QF/V݊M5c/Cvٿ̅Yޟ(!0zaGj 9;jlƲGRSU?ΩX=_|E͉$2'H6pdbRwbm?-*⨼+ҒX6<0K/rVL`_8>+=D9pI̍^K?Y~{zy~[vmȼs}v<~$<2dÿbn>ՃV
q=
8L{	4|ǋ8aǇUn%O  pL$kpFz95H޼=Sa[NUwzLMnѥ`Ke''ݪ[p5:I?ݴ)eHLӠ:ZE(	_;OF.] ?-/j׿Jۋp=֯`&}&"}Kec5b4غ%QvڔlQoW IjQYM.GmTrea).[.Ȼ[Ʀ
;>qϳd*<bc3oo"|eq<̈Q6E^:$[$m;4Kɸ.5:a<\lDT<\fJN?t&Ʒ_ټ &ҍ7v,iT-&4:hh"3`N"+k3(y\9ɍDxE{/4E=БӦ*$`GfHyriXH.4o1<tfp؟	7qO4{WOS]NvxP}O~Rp1-{3xɽ1Jd@
D-5HaG.,B	(_, nIZaO"MXdi\ipJ~5>#钺P`ƘtIS2XvӀ3aﵱpKx^lӋtيt/\7JOJN*9UrNV39LГrٚ8?ql2|̬0,Q2ee7F+%N:K/)juX81mDCc@"w|uV-GF)l3h=ܩ?98$7Tm.&bZ+=a́|_B<Ip(^8~0Ґ%a ';cq$kT|nLHbkp:b [))dУFku,	IJ1_rSge#!Xث$Fk:mA״h\.ĎdJpF>dH:E- bNzYY6,$*7_>Gj(GWBXxDf(q$\*o c#(NWva#Iף90>8ڮB}͗!7T2Td	AR(-U"q. |O'PY3Xo>aӛޭ3 ;B:d	%yhdΣa}*uRLRu;-KKSqb[<X@R
C[P%Ecd3AOJj{@Sn )@U/> se	Ĉ;ZPUU+z
G: ~B/xԪ;R]S<	㻣xK*Rws ]kIosF"NAvw3={IYxP;{#(mZbgcMam+;8L-P韧?eBT_v$"5)bx)Xc_@\v+(z|5)ʕySL}7unq*<i6lA8"lw?VB@)Zs20)gצ}6~6^\BX-Wf8K.P_s!VMb2\۬}EtTg̪ԝHQT\341u&	֭#`,čh^4y+Cd4[γЮ9,ezNF0?d<%@Y qv-5m<Jp01AA\<s1lvD*B_4`}Q%Su69"/(Q82	dx#DܮddR8Em)}Uva8ox"(Jw ([89,\؃\l-HxޝܵC_\PwW9Lx:wp<ՀWY:NQ߽I΁~~Kt\6G(#I%j`Uv5)Ml>DyRC2QC)7%p\erU/݈+)$F뤎̇N!t㩞X`N(FMeo"IJzBM%qgvh_d*&^a)uxݽ~ߦ:$枴XcJ]IrLUӔzG(OFCR;3R=ILexTƣlltm!e QX}SQlt䗀譗R|vcv%F8ߩF+p0P !o]>2}]4.jϺ-pM]7\poUt^ь$r6JSH? \<\I@Nˡήil"Mma}bo.&2lbJ;67邓!<@$]"[ִY(-:NMM>aUQLTkt;O'Yh[8cJɦ<TLDuDQϥ18)9φ"_:M'/9Qc*Z.K۪V8sev$5 +ᛵ!,rBǉr\q_~{N/'|+@.FsA\Wz8JTFҪg4Ly/ѻodi[hW+mBA;QQWR$Y1w-Ƈo.n5ϣFʕˬʋ㣧ǻ"^:\eP~|=?:SYC2,!>oC.nׄ'}q'kN.EXMld+2`K%XyOTvCD8}T-A!'v&ahaq=yz~L/N 8I:ktsh29Lôr&R)3⸬jUb4"L]02 e$' 8$/D[
G}[QQXJ|J^?4	g zLG>e14I9bvb0ʞؒ)ByT[|(`-^JK^M{BbIt.Z^tVkۺ{Q8UߒHf|yQ|c݅?ҽL4jhL!E65XA,)IhA&SvZsM\JZZ<3V -(,mp#8x!M($YqX,/ӫ=*W++۷^'@[Lx%qbYwI-QAD7!].1G>DR>[Њ	%Dr?кdGG\"FfǦRR!i(B>mޏPkf4H$1k1jtdǉ-}Kjm9WTdiRG+fX4s~rj4CF	0`{rigV&Z.nwKw}.ћdn\ᙍR,?Vk;K%ky[hVx>a[N$wG'1P-,RXjO;{??eza$Zp]ۨtX=#/6g(6RõMLYbyvRY_4!p4ڬ.s2 }'θ?K?ehrmWYʌ<Sll r3G4>*5>:cA&@#u".(8<6eJ*82ڕp+=ฃY:Y$G5#(
b/m-TbLM$o0=9>,p,f ͇ǚ5ר|)0q s<&ak/ĈIFy|òN"
pNx̫6=9̳X	m:gBm$&|<W*plI|^ȐO4p)i!YfZ*E'^rejz^Z"".z,7 )=_2,k{jkL&?BþX΀Gya"4\0`J	6j;sO,F#d$DJ>W5T!=dR.G7|'%!)+V#\˃#@U'K),eax>9>zAp":=2_s}}$^botߍԕC!NsY2] h1} ܣ !҉H=͉FRFjyLbXz2im7QѻWF[$1!韫4J!!y1wPROw]e㮲yg0<NxϏ5;E]vz<SpJGS{C>-y&&cu5=&23}f,_KeC3PCR.0
f]q2BNcdJ*=thOKw"U+uD*1 Pd1aݽX2Ra,L7p<f/h1	ݪ1sǑC.g)EU/:Ϭ$SFpl2n:шHSr2&2Ֆ&m-v^٬zM&@фl0b57TMqsE(nS#)boip%MVa1W-o`]XƃYo+m[[wشb)9sDڗ`]q0bjQ{ӗ|X<_s_F,)oQ Q!Ζ`%F	fK(>-=vSob6*C鲫"}6Ra¢,[aW3#|}.&W47{,"TԂ%uY峲$p2b%jf~w9<׋H~Zp µW况wH$~s_glY2zxj?3eqA@!.j&z2RKṲ{?g\ѫF;|$҈n|lG [.X}Q;h)PfE&`Z%lgVg3f`Zd >8B뚺jx^vFwY-Q"cB2`iROiʐMVIc7VJi6Q4U4MЊMP:o\b@}1FիfdBLLF}!h8!5L{IѲ0GT6BPl98a(&鄛Q5Q<V)4ǣz+[춓xX_M'N+=M@DP,G=AX%y8YpL3#"]ɛ!y8vo}v_|#NŚn&;lyZO]1-XK/hOAp>v\%.ea>䈀g4(nW ߶ܜ][|]궴bI)uςsh/_$L;s8-vO=V$lE}\M֡2u*{u7WQӘ(wב3"UsteYc\-o'-EZ:<kov򟏢AOyHorUP9&2ol;́tќ[b#Xp%u+Sϣr?r_K*9x9邓G;2K;c2*?썮!H`(ve*&EO:/U^}]
z,Z{j-۪j%zivs][zUx{mGǧ'Ãwnk؈Tc4 SWwݴȎÉ:&\UEa071uBjUf,[餋w*[u-\_hbdLgcT6I`pTCQI-	;$[WƙM&QW0E5R#N:eFK8HRlMLilzRЗQɯusMSҞ6 ;	̕.5FȞ!i%!2v4tSms]Ga7x;f<A|dVD]8n;18N*`
ʹ y2_fBI7?܊TC(O=PInObDnͬ.b	3)Ck5{1kv_:$}K?Ë3	/rV#v)@t3@xvح[p:J||#j{*%Q/8WH7A7N8Ұ9/ >AiLpBF(C.=cjty]foH٤Α|Y_g6Y'inc\ӛԣc CcQ1C8Y>YvZ]&)|&GÛCP]x|.[5GEߞ9nL	1fQ i}CAC'h!L2uΡ^:n.o-M]dI8z&ٌ8j~"VnY_ƈz솒t`,D2i ^uϯksbggz~=v_LeEcqj:ÿ!jwň>pp3{rCqd͚+oeH4-hsd;َlF}JBˢLGI_vrAs8Gl9l  (KC?7LVE¥Lv+~:b"=ajjZU
AN:!Ac-ddj!|leGAodh*]O־pW_UJZM$l>`J+"BFq|4rbPYA<eڋX$&KD}8>\ty'NXVJC(3SqRg!ӻC@UޛLWsn%ihh&QUII"MMAȄdMo"쪝Q&25yL5Ӗr2SfIDBF Z+cdPH/8a!-@WB:hH.3>>W"PQ9#ދ@C2$,+,6.O*LxȅIIU4&:{9>z`;J~i^<xP}DDMOQ-s&>1T$r w88}K1d9פ^?U$11T w\oocߍ#r$X2{4oځpa0ȄJpݸy^'<;,i,xz*b.ʻJ:@EA5`˘3MCzKqr*[7֖⩔ؽ|أ"RC7UJ;^DNW)^]NiO$R^>%gy{;8j	=cIFxB3A^ݯLv%r'1j`DG)d45!`Ⱥ%;`+\YTg &+N"|ۚ(z۝Lhh|⎷ul~~I<d~9oO;6uSxV7}Ft-5g3E`Ò m{%n	氚wǦ*!	_MH C}%t:^23&ޑwv+6kܢ.*ș(nґ0 Lp[`*)!dY$:v8:71e<݉s+ID=&$Vt&%6N8żS33X^Y`9XbD*m^N'!5]#lht0u10Yw{wn|W!}9pw༡8n%UTISn{a;*TsK^#Myt3wr-Y8>[
4}ѣ2#.2rP?>WJ?3)W5RDV`6ۨW -r;xP^`Ql&wOO:){P|sgQBewZPK*`.d|Vh&3TJfxh
?9A in48,`Ys0 ,ZIcJDz%맀ַ,+<,B{{R.[ɁrkfJ
=g+tn$iB4#l<AXKo#E嫣-lF):nYyMIhRIL2q4
&N={~ѮNTb+inQOHJ+@vk۱ܖW[gakrU'PmjMl[?_df41=kƊzG=Ey0㾦i28.86Ày+l_k%e#={]7$g589zyOp-ݝkJF;u>/	cHlՌ+$Fd/OK._8!=b]\!mi[{j6Y|dNbNqJKð/֒K'UU*O<ib%Jih2K7cpmA#޸[672(=0
{W2rn	rvD	lm"jtڟΦZuOn* 	<F[/\jfIx^aHDrwեoV}0y3P&c'q&ҹ[ ?-u4X@y,h)SlW*eFʜ(ia: vI14`KbL%><xhc3䀆q8sgK$?vK^~$qy,0qf	Х}<1lp$(r+,"pM<8|2!KhE/Ax8UM'(d!E4מ?Ԏ:g0 s9&jPyK# lͬU'19,),AJb?4DyJ]-S쁎M"zq"
.OJ_yT F6AaD7mx"Fg'Btw)jhGVM6SqT9aU|WdCnQnY>`;pG6,;f27F
>&nԖA	jPEf44GZs9XGi(uP4?xNH!	\KֈMUʑgUsaIySȞxH9)"j6Ua▤6FxٗtPAFLijF1my%7jJj&!C:SY7kjN{Zg"d,U9164ߘIr?cxe[hʙh$أ0hM(oi`YP qQA2yzh"y\)#F8;5fYsSHr2eK=CzIwцkaPe0#[
1t	D{*Qx1+<-m/trRRELBAVf6a(N&Bh]Bجs<|-M闏wO]Z}:*-'eGAv-2c6#EYW_EH#-0,AHߴo <ޖ]'Pp`L4X
	t$vTd
2
 C&?XSnr.6pO_m c,}un6
ZzE<#E%+u#c|5 v"H`in:WDAZA2i.Ђ`"W2e57c	@ZLŧe~)C OM29P~nC\5WV0"uA\6KN[D:q6woK)N2.:~Ԩ^XpGkj3up#2WJzjaknt_nFz@cP@$;x"xuh{.ռqԿ 10GU9 Dv:W2hbeeڢ"ʻ(};u]<'ADꝪ=z-Bŋ)lŉF4(>CKG5|uGV?IUSt+O0)b9kg4@
?r-s?3aA=d1{oFH8PbUuBt{vХc1 0z%m,d+j	1\6ˏOPpn[ӏ-.9ZBq\vx߼5kj%zޮADޠƷZ^ J7ߕFsbeX-w[e,>i0mb1R}ݭDc\~pNQ*c'hWb$AG&Ҋ#	IR~,|/}*>&X(jNzNFQ"ÎwPzϯF{F4V~Y[ t< Zz֙<!e3kSg028{zS(urG쾣2|0N<'u֚2%d&e:%t9mfB!f"HElDxOd_UBf\q:p̬6:ElUL5CEdeWؾ8_8fdxHR%awiɝלL(>+۱R/r88:IgŞzJ(XRno|{)R.Iiv<JH1.a
hPQtJ+.|Pրe߀v^٭>|./,Roo,NJ@VL݊T}c#Yj&'ga*ww*a7d+8MST99`q`"a56zIj'beO{$%|*Le=bj|4KwnKNC\7iPv V
,D8Zw猴 rlx݄dHjjA17Jbl=Dk~DY}%9;yV#h}B`dHֲ H@٢QhC_ȰcL^Qqw?^>ݏ:wwtx{J_4ԉQt:W\=|CB#|IQX+Io>|S~o&+Pq_"B,pҥm%94[HXjkK;"fy^(P^~Ľ
N8=D);cO'Dz#W[(b64dBAx70!o+vp;Y~Q8FdO|o_JI tNUW HzRSCJ7]i$]xmʫKZHӨ2!]T8S.$BngH4"6N)Z,<X'<	.Фճw7՘WqEfW"p1y!Y2RڷQGт ƧWpϩ	v&0> J 5u<cM;j2GN
f, )Ók,btijg)7FUK@*i*9y㢃láR4:ɨDЇE*(~aF3 5T붸,0ܒ]-Ք4h|:`~aE>+>m|X//o@I!~^A۵g,ë	FQwNXYPZH6m]Q"ޱ1Ewp~[Q2q9 RLjS Hل#-\Fh/VT6lmX4TJ\4p$GBUlȩrĥw+j/v,g~ܞSMކv+X*7\o_V(a
=PYڃf~L锃#Jlr,<j%nkk&FY=X95N:XP7^dh>l0ϜP$l_wƫP<u(Fu'Npxs?Il}ZK^ߤ@j>	 kI#JJVzݖ$ L`챸BEwk2:jcXOk~r2+v}d`KOASMmd 
BKPx8ֹz-ގ<Ftt8y~~`L`!
P;93E17Gz?fT/nn-]lؿ:4	h-C$&Cz3,\U3W6JfA,wn_;nkxgU/=;ǱDWC8?ylo
 SofMaoQ5~S+y9q-d0ɉcU-J9 9fv`$@ށtFM {3R;)S
2̿+j	vHBzSG-p#i"ޛ6%5h'70PU?̊Yr\@D.Y(ynb20D)A0|x3C!.ˌĪ-;YPInmݠVmrƑ88X[Α	Bz96%	NbY3FM*\
uȗ(bAnMe,jf
 "dJ1Hi%7iU
DUgoW1t𴧝!ըoo(]ۭ:^ǚ+XNW{NJxGn&Nz`~%xӛ]]sy
X16&B\y"
=jWō^oZ6fk%E]±V0Z2PQ9GjaM%8#k`4AY@AT@;l:CIa
eP_LPA\_8^'v
tg8?ў. ,4M$">Ih|bK:M#j]WrD(ۦh-;"O%lx^VqTݽB.SWH0qƮ& YjXqZ96iK=Ou]L#ya.:ϲ"*T
'֡[<,5Kg/v`jH(LlzB1Ysm-HYHA+C6`?~FU4FhHv)[Ԅ>&Cޓע=j)B,Z&j5Am]F4DRq0Ah6aVQr.9VgmXsee^:RYQ&Ѓ"52b!}z02̍*d͠`>}?*(rb;fj&V`;YjrڮJB-;k,
OV~KUvFxRѧU^QCk	;	^|8P'u<;=\')mٖY.NU*~*In*P4ʊ屴[Щf\A~UzX'feAӝlZ{X}=E#չ2Z*w<F*cJr N`lbvL\JE6FNR1Xp0J'X̋˩[Њ6 !l_D	_m5a`	uFùw|CML4D5_LHsklc^	9YE1HdZ <BU)}:a,kxw "MmӌXqzCk<@Aa@S+8~OcO$	6kUOp[N!+!35%GƵ*̕)\7&\&^$|i(2͇Q(>V2>b@MK6Etk/ea(T0qқuatzVڢՉXyNY%hԼhB^hְwfߚg`aGq3KMժ	7^PVIJ+J0m5ӸCsv}60m~`{rh17	+κL.U٧r;;->EǺgl5p4PhdKa؆BAm9H2<՜^LYFb
t'E..pl,i~#`K_ͺHg`؈$},LкיÑ"#;}]6W'|70y(75q;_i	$D
[IW" RNE.0.:Fݚ(h6D|<;<5+z p=OLh7sEgr@ 
JVޢޑ.P4&՚'[3xEgL9yqΆosk>rq28szoȠռ
2zN)vXɕ*.,c9sUg3Bp,[D_kSwUMvAu6ӻ 4X\ߌ9+M'@E<,dF*~5kmcW8sUp7j2#tAB*ƀ~Vt/6#_M곽ߐ@8n2'U;eѩb`6<АVUKS_ŭY:!ʲ5P}E8-6:Ue^Wfx8-_VkeV3zȤNb$Vx9_mgC[5 7ڹbS&ONn|_k'{ymu/\H85i*4R
6_D?4I4EG:4w'˥;2!6Ey6떊*N,shy=g.7k\\%Wg|׉cj[p&_eM3c|/jhQN2]VR/*Gnz,P3jh&Uxv">"9*t(sBhҿ@w;Q$?4E8wV_yopDوLDx=)t||ۆyhFSԇ4G?thV˜%nz<K&M8wr07 T,|&|Wg@cƖT{k(LnIPgZe*g%9i'gyerl]z]46eƂvs	kr43N&U)
7^yON̷SzORGH%OI)`g#41Is%G9sjaRֺȆ,2"f$r(!Z T^==}N?vע?11){ytǃY8@x. e94xMu:kkkNuʣgϏŷбG${{Q_ TrG<Ah0#mͨ`@a*^.:h0C찇^RԖ@ǃ6qv{??0~)z{1TÔ\9Bd	{ؽC)(,|VRz4p/7:dtxy|xS [Qzɖ/-l;$]T'3Z,HY[nŢ:9=ҍzn֢5.E5xVC{X#TcKl(n7M䚚镅OU6dA<~F]*[?խ5UPR!.xje%79FJh|FzpUik$M/byۀ]N9Z^>*N;{0G~rpF睎Mw0;c2ԨO_DwQ9ZU8mPzUygUE`"FG$G<)jmt<o3+V?`WV37ͳZ/zUz~iG&~0˸Pc\ߕolFX'!&[ Q.Wb̀qC-nШԤ5
q󱴬Ujvƿօ}+j
ZFt9p%E|)jy?	6duBlp
O&#d4=}&T׫I_9z2;Yn1V90z:0$lnńڨ[L;	HRyʎ &j[:[;{`Fc_gT?ҼUs8xNr	%(Řu$]X":'fI6㎗ܯH(JGdJ~\.&oCjQsjAd+Ɗr6+l/kw+cVt
˿	
Nk]'~ފ+2s:=gjx&GApD@CpϽEZ}wA<v\e淭^5pS<]Oz@.ܳ>^uZv¯!~%oqfsIsr/| `,""o'4A[@$(Oop6	
5 K#JJ\?"bښ6z}cYo>?jӢLąV Fة'J7/c huP"[H\*@YgZ=ߏ֙ͩ9PWQj-j;-3z&e&*E{
i4PEH5#کJW_촅)\=kQE:t:ulp<Z''xFzHKP)L}pU(2%A6|%sxS6۬dt@Zx]*@'E6oy3h]`-5z
^kƷW
Uwoz5Fkn:/Zʹ* ZㅩE/nt/ELv+~vJ]?PHa?x~pw/-avJ6<YdXEKG![҇풹@axBn)7Wv$Ljҫ'?v^>[NZhZr[p@}k_^S Q;6RmAl.eUCedUhpΉnt~l|6$S3M{K1%l0"WFbH=ш.zqnYQ(
)jx;K}dhLjrfD55Sׁo67ӭ>7lGo57Zo7Yl9?5z9>Mho<"F~f/ǳ[+&ga}jJKQvXU&=QoCbw/axݠT%д}d 	]k?#R谫^Ũ`Z9DϒVܹ0UMs\c8O>gm.]wa4$c@#{KxɄX?<Tdq@}l }ET;l׫O>qƿ|2m28y̟Ėy1=!Z
sdЌoj9p1VHbYIG,S!{hB3N̈NMn6F?SYUiI|0fn:fƭH(,\'9MlA2ӹPJˍ%	 ;J"<\odDέ4Z;=~	kX,>fiìoF Ԣ&hYoԙXl]j ,*V!s%UaX5Z\&q#16yUU{=X{#UPԵ.k9gϹﲴ0|u<yx9xw՝'{/N筚7w^pҪJQS#B}ڞPZZt	0b4B8xv^?ĩ'%{Ѥ$VUe@o&AHʨJ`D#t=x[}:O	lc0.9ϟ΀3$>rbSdqd^&hFkFWAܙWI[Cm]Ő5̠76$FjmCaMBUi%6.TS^W{<}zN8zlW/@Fn<_k%;.^I?5i^S`gd+I#\5э xE
($*5)׬Ou!rsKV^!0GJ`+nox]lG)WO4=yڍÇK++ 4u'+|ʝVK]nyߗx3Y@ %m~k݈6&3ʖQcȢ9`ٖ*Sf##𳓶hG/ D]08?-Ccz@x@p|;`K@Y7P
Z
i:In7D>ۀ]yp0|7znUմi 5\E{ZdWOjX[gnsn xNF3Ah+hK2`pwcpdy})-%>SJJőV$>:e]|<-2&ԛY5h_3x/u	p)jH5{MZɟC2(̈́)/HsK9pLv/5ߥ6ˊij
L^*^lsNjk7]aZZx)WZB\㩗c8\einv?%/ٓ0rp^Jr>^C4/4׏"ZZ@"cXHj%z+Uu}}~9ٽe$D+D+z3KI1<3B^8f"5~B;~X=$g[|Nm'.6 wP5_# xad.AhDX8$fG-/PoY|n9nⴇօ qz7[=7<t<i:6mj7zũWVgD;Y4]yԉՆtC `&AHN$k< PBם;rҒ9k
.Mv3!M̶	Ԧ`T4PH`x=J*iڬFkwRȁWQu&2BL^n݋=g.^&<zH[>lk&%%M)qp@KZg!A&lEh7[mܭkuy@<8".oYJOPl/ڵ=C!5#:j*`gAgSkU#sioWi^C;TiU -겤jrgG:@9bFHas()eԨ"|A#7QJ:)ID	n;)zhL:RzeMW)w6TǸOM-2c*4>r+>z8vv~r%CsUT`?M-1DӀ/ӗ;C4BS~pE|4f"vޠe$j)y0wɾCԭ( o+gX5Rf}:LLy9`w05q)4 };79o(O"e*v(JHs.~Fi8_ܬ{:y`R33#Q%-g6{^ҳg*E42&pjL8GWe˘ZcG;fj<,QifBΖ-xzǲ8g^<(fu%(+EsdވMo9q	P,7
\S2|dЋtΖ9Nюy՝M2d^e&-)ݳt#;~;gɛקgTFxy 2L@%<
 :Kj#
 
!
φp4*VHn+eEV&jH{4[Iz5"&$9N+@۴O
*V3d*3ƷN$$^U.F)*ӄD+4۪yHE?z",<M^oK}80O<UΉyx'$`uG좳B8If,̗mLfm5.TNIs3.1`sJt9qEa	9+)䭔Ak&S15VhydKl(!^(e-J(<^?hW]}8z͗ƉƬ4/\Bƕǰ k􅨟AV^¯ȀpdvEϐA8z~3E{`˭d)u4@^LpI$i 1bU`dxŋt?<zs𼃗PٸȓoGUΪh,`(AP]+7]ɮv)leJQisI['mJ-2psAlj%^;.y17PiGЛyvic?"%lԈ0hmh|\jIB%o%gOtAj0D7o6%*awRP*Sr1'0%
/_:l3=b=x݈3;KD#w2!7&3.qwReԄ"\%^p#8ChwQ ݓ; 'h4j%xR~Dߏf!}TK:**B䇎,W?)J\l(e={LWѣݔ|`?QxC{reڠhx)qY_~O9M/)|x~qUV;U:%Sã;'/?9-65$KQo}X'lou/}䇝r3n_==0{l^4^"D_$v%^`
!:TAR,{_@$2͆8~YdD@Ėod?%=Mrrh8bhąHncLt8Mj-eA䜗6Uܝ7K3f*F?^p;SxGkf\6pnL:6Vt_C"cŇ~~؉C< ܜ/x*;7Ab	gn9ÑxD1g7S쵳ԮlxâiJ2aL A^w/S"lOk-$
4WArԣ>t܏R*ji s2,/!'	މtj")׺5:'ѹS3 *7i(758PU;Yl$p&h޲F@X/Tqєt8}uQ0KTKaIce(Y66[5*g~#Аw!m[3K1'ҁ<܁TrPRO>8pҋvYvJ(ÆjmCY	}yNPv'`;PSK#=hQnʃӬn;6&4hfƩl܁!0r-IlʑtfL/p$.(,,BFW8h/76DUP;XXp/\]%>!VZ1hn"m7|jW??44ۢe'
YK=a=?&bR"Ⱦc0>ra8$)Ş<<'^0ɬ|HkEnVD Mq](=06Lr^a%ݎcǎ\ʪUW!!A-VDi N{0\WM:ďXv3ǿ  \Yv܀ruA^%c]2
,Z+ ZK@!V Ygrs(|[-C1DLhsl4c}HnU6-dMkf7%9qw'WN\e٩XGlF^n]#9(\f!&'}rQuf([.f@7}JqXj.>E8vErcb
i)#Ok)ڟ^cxFG_],fFA/g|h7roVk#pps%.Iw[&N5?)FdQhXTxxSqeǛf2RqƎ2_!Z)Y[n	-8r\dvmru/SNZuv݄2(H'r#r,ZvF 5#3Kx6u$k}`IŚv;PK5!L/ԡIpH|2a9iq_y("ț"\%DQq̎_غ`\E)yn/åM͞BwT:Hpp	L咃VMy
+p7~mَʅ8/Dj; ]J)'<1{C~k$7y2ɖatf;NjpDälhT4%	3E*!=ԘBhRdm" ǷR8OB21atμZה}[,0KwMhrbݜm;,]pS?o$QIF#[lƆVoBQ~cFhFO{%Pti`>dPFBSzEM=/%
L3iJ0D&+u'0＋';VEn+lqlȖ^"5^v&uԗ g,vҮofXR	9}R >|Cw9BW_{D$'mbIt5e	Q[ΠteiZّ!;trB. HB03/jx&H=*0hBҌys\͡/U>C]4rsM,EUgk6pj&d_dPɕٍu܆`8c$кFm c']>{N@ղ-j.0t)0sՅ.Koi!P]3" ;1{Ywpǎu3[xD&Bhl>;CS	w|9{yy~yxotVB<Q[zгSBCXd!Ҿd3`86+S5- F2pZWjnf^@gq&iX2g]4;۴^92y p>?90
4[C>&Lv*<& ޵m~"Cg!PEgnݶ}݇@2G/(㏒
:&I٤\NzK<c(R)U`PAKsS0l>|t pK(}^t}!/N:?<9:ehn1VIvt?'G/w~>*_*םg?y2!<s^z|s<:Sm<"%j~Ix`KN{Hbc #QU:λj~ۜN];]d3X]`;s"Adgyv6#mW-WQuIfH"	/ޫcWpas[lV
Z:GfRЩ_pw3|0gyi(U9ܓwv/}K=z{xxDr		FOVxBoף[2:5\m	#!s=tǕg#N?#؎>@rMLu1/b_dMmlpL=vpAt7fcyATQ2)Aq[81a!9'8&58\WRl
ÿ"e=,d.be\2A޿ce8Aq(Mhou^N⽻\u![BEx9dFCR+XX@e
.9$tm%T5 C*9(%<xQ*:{ vqHvq|=TXG+C)kx
k#0)濉scz鿉T1,λ~ڧ#grv:6:kk 79iYAC[&)y*yc
붓Q@3тƫc|=͊M>qB
&5Iy]F$7N&d~}g8 7eF0.p t>.ӆr4N΁huvO䪬_Ϫtx
G/(>'?LRf0U#1ƓM;EXHl]}^#byh
EkxnUY	3>2v7bK6%@cɱOhD[M'-	]gu0fnL*Q̦*_氀bYa2[#֭+Y#Mn|^)	86Wx"NxK,a3}@~TC4QGuIG]y9(z̬/ᘦ_}%yվ#(3A*YyjsҦ`$CZY%^X:(Zy6,c 7rb6Fڪm_	rgJazՔ  ێnH9:dATf}Έ ^C;C4rƬS1HM@L"CghhkO馪1X(Uׯsoё&\m]/.%r+~;PV\
Rˌ?Zħ fT hKR(1_&IQ-5)׌ S_o*"\j:ph3$\:lIMAj}Tr=`Ǵ\DG59t? 6U@{WB^2doC<.'u7(C!%.7<Pv,k~Kv{-2Rh	Pi=HMcC>] Q#1QrHJq5Zd5@ND
Ta@Ý!xgw|!];o4
+fF3-arƩuGMWۋtP/So4+J(.iy0Z!~݉6tp)x'`t') 6p9bXfݜVӜZ(ܞ7ڥ B=Y 7ސ4by'3n6Ef+Re)PӠHfKfcaLfhs m3Kނ1fGve BJwzb9wTK˹tl`*Ln.y|Td}1VKM.*`ל̾y[ecQ΀YwTRGcY,^ Gchm= .'>ִVCD{cC+Xڪ*9<lT+
)M-bq.S[CA2U6]kl`q-QzK	1nFVpWֈejy J Pk&_3(S,&cHenPB=i=2SP_X[anL!]Tռg$!^{~ݎGEׅ>c%Cg~5; :ht)NMPڂ*yAj*kyqû"]>͝w_d:!<,QV]*g̟Y>H]#Ú.Q\Ti<é@rV2B8"v;x.CƆ'J4^nI%$X@ߤ([~1^JJЛ.JYf" FĨTg[@#J;ÓYͳ0uR8\(G[r-(JXe9lsOQ#uŭ>Kzd_FZ0!~Ɨ1Lu6LFUykL7]uʫCMmZ{8tXcjU"݆fNAY|Af֝Yd:avP3=#G֦J8W@h:Oj$p/S ߒ)11xOVKF= >vAK۟֠sGLcjl:OgK[TxW#yuL)^ak>gQHUbC#U&u; \Em93MvsEB22h}u(ڌↇAݵ'ݍ֋$DHKk\	AY
l lr4R^)5UץQBui#h	1]h>Ke Jg@uG8 tzk:Ű\"M&
W-ow!W}fgztVR$V
fa5ù(rH2m<=:"Y~P6UTo̡$?7sr0xA%̌L	xZ(5qek|lWliF"VVI_q=@H&/U#hkNJ6->W`~cg3++-"dugwB W!֨x!]8di-nɡe]+V΄A0<wv*U+HuC* 1JrE&6Md|%o^IxF=rȁV'Y%&)K)-;EY9p["$Sv[Csf
(;NuRyy+2rl{fOm_ZOqP=́(W5665H,Fp.^p:zazEC#[*C52~&^|F1P0`	ɿ2UGV>扗 &w CFS)g8_Ǔ^*1|Ȉoݐ~ŷQfA־Dk%uLˢ^hOerYߝ X^l14X|v䅖9Y0$sQf0a<첹b941b%YdFH 	-[UWScv~1:Q*ܢ}JǇ`mWe%)bI&a7"W۪A.}+8BTC[BZt`90-?T=q%ͥR(r55喇w>hXmٝ5!-B Fp``TpJ[|0)e9f΃|̃Xܲ 1Iei,3oGGa^w5>G.]P?v<!R~{{XߠØHP*pn6R絕6/Ou{^/	齜9ibRm:,ɥ*2Ac ȿ*nH9u|oL2u:p:ɰ{ap*c(iVhۺgCYqzwH%*P@vޡcG㎓
8'/ONJ.>L܌rsB~WNf\s=	lN)ǀyϩWe)dƓ]Uثʅ
yu/plR9C-阆cı\عB~2ZfQgiMM᠁C>d*覆`P['b/ArE\vJ!KEyh	E _-䏠ZZ|#2Drt+(x]c5=1<AXзŇtcGv>q9rޖ1;lDZ&;ReCZx	RڈiΩ"pV
Y+K`r^j޵щx<rێ5{SG'qqK&S;6Bz(COqxSsٽe92&|ry+10&	%FUi%}a4Qc6ov|꤄Вsdqfox*m[\Ң5JVA)3	kC<Lu^ɭ尃)0mAq8lBSZB<&0ISBliv$4~%A0)RګGif:z;ycu89s3`k}XW6&nVb]	4\ڐEUݘmd2Q>gm4&iN?={|v;j?|m࿯?~~ox7&߄~oMx	7#x?#x?RΌowo_G8ƗXqo<XX1?lM&s!&7vrNϺzo,BOiZpW{L]ϡtn6^B笙%Tg#KҊʺ="uٚP1ib|6ymvD-4F@)SJ9ԭ9[XPJK}-D{u還&[pH>C0W"e8tl&xǀx*c#:dоFso=ESL&+"s;$,:WByeSv}㯾`*zf[QѿQnFCMIt,<a+h枙?ΛT8!2Dt%wkӧ=o~Yc)SJ!>r\I0
zt'0g/f_ЮzjoKV޷^xT=|U-\ʽQØ[EqpF<skNLv~ly˧,FO1dF\6A娉DJEmKb7 VEӥmQ5 1ًut B|j胙~
@/׉/(􇃓$ho/}rUV G%9ҿK&KOA|i$8w?0AB2M<r	ӄh$Sk~zrD[ rvf6-0<~ގY6iG
xw@k*="s&8gibƺ3$~f^l`  >'#(g>w6ק_?\ݢhtF_#L	4>r@0 2xBF	s5ЍeqXo 
5/:/=5@I{\$6M 6Sфb?3yn9(頀LݓodMMgCID=5Ǔ@*$9g8.0mi0#mԈ3bƁDִAk*LȃӁSNݑp԰^sZi
t-i \LnLptpʒaƕ^	#Ia
lKdw*PyoQGNYD&tP_z5wǯ<b&dP4x,x?v~0:dyl	sJBg~FiOXbu0=D&?5#G@uJ@<QoTj5N~7x*3I.~sMtGgV M-  YH#5[H*U\CU
,fK:4 FqoX}zh?\.?Z8߁˺rqzKIs3wlg~D__'ێ!p\x<)(uݗPGK(Y!Sw/N(dA#1J>^݊m7>AD[RZ_㴓L:ڋ5Gm++VL+̾Ӵ%:󭡑qT͛c~8p%R!٬pG(y!Ŕ{o0'QC*&s+"<4vGDv0puCtFJ}j!^YRڸ8ΟG{J8ᗾi
c7<Mfա2a2q$Iױ0.N"re)'A\<6	l!V@)˸}.WSXQXpcA=A)	l\M'	Lwr5jl@Sۻ؀A<JhgwYG/O_<{9,2`aYɠ@p1bCjCY6W$FOQc$cD|[eE6 Jj9P8jz^ΖDP\-Ij0 9QkFg^[ON>njO}8C vlF }M gMUBf0H4({*j b.l}fyhE̈^%Gɛ1?P2d&+=YPMF*Rk9C~|!}8 atjvsyQQҋ']?*"jee $9VQD]S7SLB9^)&E3F廿Xu=fHo!wWTu5^XCTjb	xCE"7QmP/F
&}Eo$6+2i2nSk4y-EFw?;ʸ0ۇ= E5}zrE/6*7m$E`V?pLFrg,b{?FڟDL7йfpiuU壕l`6DA3bZ%]1z1RCޗ
î>PByB_)(L
_~W"h+ʡ9"QD[|)dS	=E(Yoc:TSeY!r(fE0ig:d̆8F<;"
.JjrTY
i^O ZF2zr#͙)*^g~`&?USшVBߡ=:9+I{PR0f54H9Vvva%c>CA;f B,9e|4lfx~$4h谇jf[WLɼ&`uZY1md;;dO^c˦'0:(1K톯8a澐Qlm5 I1qԛ6&`LX<M~,OeE9d=mt˥j۔6
2E䝈yKMH
։u#E|>J{Aܞ(FooE\UDGO-ϸ+u4nLfn+Wō^oZ Zf׃{M(IJ&O(GDKB/	iޡA^Gtq33_rq+i$ަddv.ӎ{/BdF_zLW(ldE:>/[g<ܲTx:G&(./P>j|M*05wq_ L5:ޗ	i/ss)fm.L9	mc i-1`-Xdye|H)&*aU}[$HQ0<[oxeߐ+{Oܙ;*(,[Q++m/~WS['e<Dy삃ٕ$^b0d Ia-nĄ_0s#~
On)ҊSlv5T<(G[b~UJ5b?	%K		ji8}tk_NNۨqhk4 Hhd4w|6`G;(E (5uNַu<u.ݖUG-
'd%n*z-g/ls2n:YijH.5iTia.40p{:듇%$FơU6Eĥ&>؈փ!0Y:s*X/c7# Ѹn^{h|ϙj}r1z.*{	{a'vtVUfb'eie!%/	UGBx̍ϋF'M&-Ɂh͉ȃY}%άϗi>LEk Ov/X<>haX#ΖV|!\upx%têzVYo[X
K[[h$(bTo;C-hvе9UY,Z%]ly|T~1A8@=܆W"^(u/5P={*!x@
;%s>$7/FUJ<`Lݨ7K8(57PGr/(
xk3c)Y8.F+e~qYFxJѣ?XBlE4qtqQ<yussvm15L^_>?: L);1`hJ-1f& Vku&9{:ҟ
=A.(5<AbZ]Y$x	?
^_N?
a/BjU2mF]X7D;ƅ.[5^e﫯L@L9`@P$6-<i3rz|,dQ8m]/]!j>Rr>-Q-J]-kC/Px&7t0wnCjǃDxbEjg6d9H&Yy@AQ<YF(g|65L'U2E+dT_%$zNn:(ԸxiVV!;*,2T*=c^uNU6	l%
fNBWkWuA:c-덖_3\""`UqoyRTZ !jͨèWVд:򳨰zqQQPX-6jBgw3ʉ4ŧLѰ\2¿ww!wfF*iJogdY JJ}0m_ArF.:#,!	5.:Hd6a^gdAh3:bgկ)<R.:'#"t"裁C1IR}SA"Q=TXr]nKDeʳYPH+U#=%z.`ӂHny+d?bON#g-QB4vh3"܋)g~,[8f`*As~=4߯~Ȏ'~)'sgQώZ8əɚGyV+a9s<xߌi8a.YNv'xˎ_aPqJA*q2,Kݰ'OF&6ź"kdA7(Y;0Ww?6?^W0%d$S
0}^ӗ_G{{'-bc?zB(jz,٦01܍FSR9
2΍u<+Ŷ9}hJzGUNs ,xI禫)at\g(-VqkۊjCܶΝkp.tDחf@qA&xw-ǀ+z<v:痖P8ݯ0:&8?8ǥI
c^M0Sw0?KmEfꍛ4Wb*&at imE/iQ_Ǣ$kYP;K<t;$wH7`C;s|gv]cOw'wc¢rP.8-
ݹpgάԝF?,X?+[FpӢ(u;_UMԦInƢjsoڵU[|\NZ;͍^Y.alA)WW|+/Uq_X*`xi[5 P;lO0R;E|U(L l	QQFڐ?;=7Ѱ~gø˦܍`$u8<u[Ĭj'l\lB">;f?N|1߭cWǼya DK,zNO|7̿9u<w>ѥ.ci|k{]7`G]RǅygW]j{i:7rϺO|tu!^$:^\:&^.v\>vy̌98rv<;=h"jb?B$/VR3n]ڹz3PC'5؁x%8PcL&con<û~jp	p.c뺻!b|?4Hⶐ3*Xz`ii.Vvkei_1񁣳`P#FQͰ4_&Дbr ǯMF$+4:^Ix`^[F e?)clh'?qa<8P_,1Lp#Y823V[KX&]!;$wwp">-%.aIci"G@l@UL-ԝ!qNR|jP>lsLR:6;{\	[T	ہje:յ_]	zEmiA9}]M[[uѮ9hL0۪v|v2]$]Z]1^	)9BwӨ70GĔ/8 VZ=sxϔNH7%Y0-	dۛ:$ҵ6*-Uz״[EUɚJf yOI޵D#c PY*4DrVDnG3v|T @J4ȴaHeT;Ll"橖)xoTq;1q2FC%Nwq\A(BYJ$zBqx8( 8ͥ4'B+TMyь;O^l "91UzkO7#z#3ȥ>"S191OWq?e*UD㶊2aqD{v.쵌{ҡi4,짨(7&R#0}@1HcGG44rnhv5vMlmoEܖiA׵1EZ^CjD Wkݑێ<LDf-bpDѯEkXZFw6,1yxVQA$LEQ"U\ԌCu3)BhA;enW>(Wғ2)IhBԸ0	vaUv`e;	x5Bz	ViGxC&>h>R387{Dn%+71I*nru-r~)}:9EZ2LCQq<;|MSniQQ\mBiFZ5P tM<8Ld:et
ƭDd'IyY@`ܢt5vWT\˪mTq--徴4*(Z'BU{\CkblL̨)C$˞4Z|-VF >AٔDQRN>[Bm7<D~ :r`sx?y2n5: Rvd33zepX
} f<Ky|:duآ#lh%%<8H0	+2?R9FӉ9̋,UpᣜG?F1KNdjh̜ݮ|[p]blJBKV>7Gj1B\oLWy 6=W+\64=?+64ߛa )7!K9`Y/!ђ{'ijh>P.g`đ@'cb(O?&=Qp=Xt*GөCMNrC&)`=vቚ=6c[KbfCd;PWhDAqF78"\J[׋MoB(fhѠ1k_*%u틼	Ӎt	GbIplƳ)n$7ֵ)'	SoDaȌVV)q
Ah\hC
n(
7]`8\Ha֡QXrPH԰>){ũAĶHJv*KPPe)%*b m5bZ12q=CZK8Aθ!;[-E>}]d_j;7NOaݴYߢO`$Wz{Oܟ?G4e\2=I߀FO'.pIWT{823Q6GbV)f9Bٻ(b\K،Rԑ.^-ܝ>toiFmT⏠JƠ*z*lG9\Vʱx!P,YP

š|ә(u%ND͆_g	DGw#ș ځ{3jGL4f6+Q ƀE;4{.ͫILbI9'bPFzŖj^FiP4B[aѠ:C)5WBiBWcH*^z|^S QBQovuu_q[FbQ`rnro6Zs]Sl(gxn$o[]k84F_1(?=挥}l2t#u8*Jdg"St/QؒPяLؒH%F$Zweu˾ZLM2M2CP-0q+,q|&<ݬ<tt۠j~hBCoQ=.L ,V%~c|b~NZK{wHbc
m9|1l|RHwd# 
cI&A͆ ,8PM^ꏦ~,ȏØ×<Ob-qDoS9(k]|ܿ[҂$*xy[D&=z]4X}]mzJ\oZa[Ivf[҂z\*6W%/GM7:%:*b*lIs{Tj~FKtheT#xY1
sTx9OWz\֥/nWvJ+ƗjSX":+X5s&}<(9apSzQ_Lhu/Xps|'l͕ ڨQ/A^Ϻ;dAؠ-gdWD?Z/J1e͗
,zqeO~TayRH5& ~ օȅ=&=Z}Med.`d2@ܭDXMFNM2J,ro ތ$<<DG2>{kz]i]ޱ;";[ʝȧ=QDNVƬEr#u};("[vW\p486ǣc98\[wmUxNd";7.o@?"Ɖxj+B0dY^;[^1gOtL\b@@-ܴND,7M'8oA>VmT3zbM1Wk}	9Kpĭ<)+BCx 5xYV|mB2E]`TSyR5蕮Qp"#Vp|	t,'5U/)K  2ŽHS#w/9kG֪弆0'~>a-]/.amo&@x(eTqw1 dG:JNC8,4UeنfR2zK!!h!C쩚͇Ie;Q}}ܟ1bk^$Tׅc44@`$RBg>
KeV^"9%o	>˃;q?x8,9؉5%W* TyFK6%cvWyggz&Pݖ o-q|7zN*:$OSא]Nx|xBǺ]¦U^mU]&vBohƝͨyx?DSݨ%C.\"2MNqf(vcYi`:{3+|ЄT՘p\i[ݢKToQ[tZtMʏxP̢@Ք`US}6!Ƴ}JUvkok
Xm3^֓Ekug) =hu'<#"y퐤% ^*>]22CI2&Y?Ad;H6Y8Y@i璣}ÂfՋRqǢ`*]SBG
yg{omK8slFnUkhVu,{1iaK
(6(bƞ/Km죧Pd YRF|IyN",XywkbyLեX=CRǞ/2LBn}e04ǪpʺsQBwK5FVV]`$[7]\m첺،>D%'V`Y&+9)
isC,I+lߴ/Ts'Zu~Ѫu!߁]Ruf9Oe,wJ`Tn,A1+ب&{q꬝]mv6⁞mBꃻj;A<W9Yi<%Gŷ̽al3qsB3I׾rd+!"ؘ'oc/#'Ea1 JmFjH TQ`*;SЬL|{L9S2Dr)ӄaOG$=(\F_9w	x&YR@O`$9,7bd<(Q$g*9$zd<=K9BB lB<ӻǻly1ZؤxԧBYm&tK8G{FQ:˪a\ah=VU˓L`W&	;C{Fd]G{g$yu#o4sBcJo66]G蝤56ʍspki!<w!w*ZiWiG";&>φML!~@A'N]
: F	uYc`?!*?:ZNr3No#ꅘu޿@f~$yhgƗGw[vg¯h̷lwP^g%$o$bo>RY]'9Pq29g5hC+/<vR_0!e$k5X:S$d&@틄=Rm*c:ӨPB/+̓o{slR.jF"	0F iF+4#Vqq,2e00V 0Tc=F_:flfXc289] H.KFmŐpag2a
],^ƕ{7nxJղ	/`ϮQ9&7iTYk	-aώ˙mϙF喙|B3/֕~_2#o.{d5	<R<1,@#)sYJ'[|+a%g!vf+eօ[.QW髫Gss@HQl
wm&Xoѣ?56_=d:Êiͅt?uև+x/櫍dXnE.XQ!-,򬡋5ßJ*-p3=a?G#:hqjCfuղqMm:N^*#ef6CǨrmsp 2!'a40b x_GWqlS7I΢&FS9lTjI-ݒe .D)+2kʄʰ%*jH襶F_<~`P7] i{̆TPޒՊ#d7{InnﳨaCՆ'˔4C2ҙ.+"QcԹ.E̪8e	6H=ORK,Rm1tt{ZJF]v'Z"#hA-c*
"ԝ7`C9 tKF(v0ꎆ$񺕝p)VY#
y3ϋŷe$sS̿ۘ?i+BmͽtJ&kW
5THQ.?,CwT4jR2;Ip-YA|]meH")2c?LF4hFb
IC+gaG0;XFDyUPzcbңes7HNXP.YH!D~rһ;ȸVAUv*?Ha]_,I1.{sBDc	Gs\A3(9i?13GDA""yQ'\4臄4]IsGQ@0j܆8U#Ӻp}7GD=x\,v1(e!44pfzďDta~}c]1)GbKxeh	IUع7lNU$Zfxf|,pϸHEH[Qr)GqA{[7Qm"'^6e^>-:^QzGlXN_m(g537($`:C1%|4L`&"0& v*e]nf$]Fg rθ?v4$at꼢4!ZdU	fFWӑ^Fɐpxi"`&-c]S+
^&x,ǩ0нߜqOg.6cdвT&Y
Q4_Fgps& Nl#?@w.P19ŉ%;<PN;xTjJ˺=%ڡIH ݖO߾sUq'ˊJ#cayf{ǌP29TOrs̉ǒ1F
.l(8|naZ`xyExA:ZYþI9bϜ}mQI,j{fcݛ0U])ckjl6Pz,N}?9)^(;J_I ia(b39[~t(-X"ś?Ens wݮ0-e}xB;O9z(9$w1Xs,&{nPq&K8 .M&sP'BO4+C-+'tλ-=:Y;<S  W׿ Ñbʋow)w<9TqkNd7؊FrJWu,f=s?ȎɌ<4+W"UÔ?ł #`<`_|6=?vvZ6|P}G r{矿FCu4z9m̛ؖYVX^˵&rdCP)smѤp=WNsH%.A<8|i-sOۍMa@Mz*#2*eRFf>OqHTci8ivq|
[BL,4G7w`oV9'k*2G91fg=|lX|H!Y:>0F 7f,hV9y~ӄĂ Yw~zz޳0cRCk)ԠyDx
raJVлGʙ)ѳG9%ݞJqU0B/)c LoCiadt%=# .+XqɥZ."Cr*?L1(%'Ĭ;Jvc5*֓CF#`Hw}^^gd(Fޫfp0'0q9a1v'פO+kLd+_Ħ$?Re`V~RCt08HsqYO:sTNKh*jxJr*Ԃ8*Ge3W+$cNgTw]҂ }Ha
@fwuTFu3K~UP&^FO8KZK-J5
G4Cm=Ѡ7SHg짖Khm졿QyMxgW7bVХx@	D"z:7ą۔wky-`NdHa6i]O3cd[J`8u꤈3OcFI65!B غ|qPoq4ӽL'4#-TXj\q;톡$ka/牦'<DdD&)f,G! cb[AxkpN̆^d"ù1϶ {?D'4 7ftFY̟x*D*}6m~OU0vYQ~U<UOD*A..Z>_lw5d#d6{?=.-JG0Js[+Ttoup Rɜ7,(o9y^ZwӘ"	)UZ"$=/'%R_>9aIxϾI[A|2ˎK+(T҂BW(Ҷ4Y%gܳjaeg6$>z9飻R#N/ĢOzdL-y4e۰_{-GW٠J%]^O~^v`4s>*^ΙMߧ)mGE-uM˴̯,ܧU8~}ٙVP০6Nh鴎dCuHMogxꅪ&w9ސf0Wr-фK׍j*fRhIwcOdHbX@a9vzBw[;t)_N"
g|xJ+fw[Ȫ~ $TqWAPFڰG+;%OH,"L|& \19v-Sh H@jE@5XU4,T5RFE0=j%ha6*^rRЇWH&4.&-a~5NI
^F2Ɉt"ڥSŝ)3glE24҇g!N:1q.ڬRMMNdKjcr)U(7Db&07!X6RҔ[*^0itEZZD.lXF6 +R1&J!!dHIB-!U]d;,D
Te^f8;hNR9]?xr?;!_RD,Uњ޴L=`uxjJZQVv%+i0E&Wae"6LVL	5Nn5E9F+0E*,Ir8qY$phy4Iqr;GCxZ6a(zK(e;x5 64lF_ vƢ TzMTG4mm%TISƽ28"BYTvnU۳	Wb8k̄"q8_c#Y+ܝO,5wNB1\5.d@#;7T`f9rx探&Ԃ14tyvO?
`u$AbUroRmE!f)Ԅ0!
cKሺ4s]m@;&S8ɞq3$qR38AlU"ԭE72nw6{z]998,{/\{#`p\ Qjn'Lg:aqTS7?Nu #C't5~rԸwT*vALRt?Dvϟas/tg㵌f62 %'♵cȣ++k>)xziL!s^IBEKbU0bvbO|9`k5+)=E 4 PM!b}%3$t-h&ZLzI|/.eWVHWEd{(l>2ZF\&e#@;
l9;8wLc ajΐv`k	xK䲢g ߿36X80l^92Rt9S!zνN/hQVZk q5QjRb,m	r6&;B]_5C\
[:pc[,DT[,}mlDg&$Sz5jt<YT`9	|5GlCE?ߎwHL7g

}u0w0QвD5$dF*o?,vGUͨ>/SԉW#/Z>*)2N%UDm>"X(dͰh/4,;OA{
|I@?޽#[>Oћx#dq ;pcgl4R=ԊZ2&ZU-x9Aꪮ˪U䌚[lw[&8M:t~aQ4HIpp'@W030B$gju\JsqH'$b &0!AZaAJpܷm.%Wo Ǔ'!Zbi~ScL{E8FoTcnNSi;`nnaGP'_ :\f#C]Ȃz>2pD-zCUA 9qTF̡Mi2D`AthDE<t/m͐Pkn*A*Q[t$O#
f#APfX&֩}PZsY;IMO24t7"'9Jdq8~쮡{%G)__mqZեN! )8c_{PIC(1k$1ڱKi_=MkKq{ޫNn4@޼)I.%yƘf絬8_D)g
JU[R\Ʀˀb-(agT+/MHFVa~bэ>qrv'Ġc6n-$6Нm5<<ؓo%w1{6OY #Aiys0*s90"}>je8Oɟ.aBۅKPM{1hmHň~#+ZbpLe7,OVb<0
8
EY;k<KEݲđ҂KFOvQv,#*6k]љ.[Kތjқ
Ly1d	_E⿃o/8v~1=&FB5[VD[S5"_>c|`S~"QyV!e>Jw{V%$9$,MgBIKVVSLt\yiPeԾ혟Jm=B~Ia6=yw3%Knclz%5B殴mshap$S$'e1藢c;Y	އM*o5L#m-8*}Am&%kK#6egHl2-i>}bgyFVb^n?}[1t)/sKhӜQ3
$m>q)bpi<9$z!zR	9?A>㪚!ŲMgHam4~2>)2af3/#E"!6OA7,7]Syk6Ʋkd%./V(D,m $'\뼗db2!
?)!
|h#PU;iցy-9tSq|:@j&*/yjz
!> yFŃ?v([ɱ K	b:0ZTY=m:cZ ,%%cc305D|KĉϧJ*QύXpcV13U-L#"K5$a<M.	->تi V;h, Wc#IF.s'7g; \ҵ{tOog_wLbe5WgQU7u^$k}BR6Vs@33+n:^£Kt$Ig-װw 6c@EHKlNƩXj^
msmViaBUeEpA2)n HinW39SCei۪mj`Td,E,'O=o
״~A1l',5ïL>xI^/OeB'e`ABznXI4|<}T𠄲"+o8Zޟ\fSAfoכM!#tNl'43J_/ak/^ed()s6u01W'|wFYeYU޽8ᖋ[>n	yr8O$\}UU{OW3"8j:c=8a>5XHzbcJ1aص%&
A.AWE:,ީ!է20}`ޯ*8V	X7y5"C#ƹ
u5F7a_pI&ӫ9hbw)@T6f\O|E Sy7+m%kINŧ¦l$꺌	fޞ)HʵynVު׫9~7ރ;FmT0_OCX]^J%}QR;e["J|aN &ܫv$?4#ѝ9o6s6*`q@X^x)+>w`3".bMFߌ)yRuNndӹEtU;t39~Cc0XI 0WO־I?	 \
f涀@`bXWA,UR3h^剹-2isnznԼ>wvBʄ}cN(Slز%v\M|aK̲j,)p+vE<ge3]|}}&|א\CI5Rn3uH}ίǲ|f w9# >tz~(%2XI>J@M@Ygd3n+Es_X,,X"2<
`^͒&W}2IRz(8Q8ҖDE0/gGP;uMQő xd^mlFvn1?^oY]mmqMG`².	E5UCh~kY7(p0P8kNgz5AY.:}EnFG?,q'gXq5LOLoe,C(-K7,^rFIũg}r[wߺH	W+̋)!0JXA:"ܿog뛽7?&+bEAvN95l3BwrV6m66>]eNIhP$`Y&W8ڥvd2<j9 
ִ3QK
<IZT:zwIQW+>$s]o!y)9%
|-H[[D<d?lL1uGGN`3RXoPD1LLl[$NWU&#}:9j#)tGlkCP^0
@mEAP2*?"x+W!|^=*zV)}a_\bEt]<P8\?P9uCgX6-KWA%Ő;)b]= As;Y%{'W{t|^^O}o8J啬@oTrV[jQ#m\N13b&PU)4Ayx|:17̔esJ/LBՑu4ж;.!,@7,٤7u%>OP3%AEQxf JG%2"RoU*(>W[Pf]F!?z9ޜO,i7be(82ag~\A=|κR%IRJ4,]D*Jy_rL&+E)RJOLTshlTUb5N=2J`6U	7.pcǢs6܊ 
0‌Xr,0Ӈt1mxB ob"d\=Pwv®_V*UTHN,6"S3IN(i;@t)24H;Kh0BhF[?0FCshWS*+ͯ1YBgC!	܎fe$胆eqEͣմQj#T*K(o(rf	"؄n/w61ȏd$O4<HfwoNf4ΘfdB6okĜ#}WG[vڝazRdP	5N-]Og<;.qwwJ TMЭ*T&ӗ[}ccz*fn?c:v
KQx{d?W+a⵰S+}_fg+E"3+A}NJ8jbxت0&ng}C,+aHw-y7IOCmyW)'KiQg
"BFsĻF,;  eDe7gy44 skcuU]X02k%^K-slG-i33ORI,EqwC&w0Ym9`	*Ax\Z?WPE# WՔmf`$&;LIq}dUy1upص)i6}N>*L^df%9:n? I/]ci1&Flf/ʹf	
k%C/K:єh=B
-Vf[jPv2( 4R];l*
J/!T;ھ~syDmfwD"!gJ,3bb40Ի R5O	nXAHuu"JDDB~(KH])DsKibq`)z]{)60VLC[Č:ɊL>.U^_w>~q_TULї#5}5+M3 yFpKpmKvمCY߬uߜHyW
P,T	|BԷT0o_Bx,~b<dm+:7([هHw5DY.
vXeg^$G)AmP"3*UQ鴯i2Mvޘ*3SiYwջ~}L;#^ky3Egؠ*`v|Ax'Y~9zA(h8CV$Э
UНN`ƘEToWKi
Io1.3"ԩ,nZwt,=Vs*EӃ4`58CZ#,ASu'\<hjm]4*%[wn+6,} LmUƢwE<SHd鸆Cuz7xmAbЦꮕʽxpf ER?fzY೵*=]2nɋi@lЯwNe. tA-
S)%*qSU
9^mˀ`=-NmhzQdkPb,ERRE	-`.]p(hFJY䣕U0<{F7P
]MgJFC@,McANaGEoW$o[kǷw~}vP5Gy+ׁtthӾG<fc30Uad4jal͵Ǳ,A~HyDDQYXD!G
#@9amgtϢ6(AQ^SoQWXnHeýwpT(?syKJ 8pܺfOkugR#Ȣ&N
j>UFBP4AQDഎ2RAGϵ"X-"AMt<gV᷑.XE9D()bɚXrm zQ:b,%~o/3#Y{]$~;+*/mW7o}Qy;nO2So#m,2TOSm]I>#-qE7G!Lr1{Fm
#11>@青P%J'^&<eR/ŤK'>m-fOZT˛uQ&jV/-3Wn!a掴TP@h]A=XR}9B	'f0brMr6S2{A0Ve]D!B屰>H{j1h`IhVxaهfc<+39ےd
dUM&d*Fp4fj(d-;5-3Q/Uι9yrb>=XpI.k\k;a=O9=-yM!nrOΞ33D-~\X7G8kGEVШj^tR?	bkB
T`Ǔ. V҅H
Ą3}nwHfqN=ElUB[K2#SyĶvTE:I5_G<W˧ 1/''{`+[sr*B|FE4&&?'ڑ/_,P@4t0	[r3i~xURL`#Y~2|c	_ܮ\cM1+R:L+$6+JZtP ¼3<e8(jt)BbhA!/=zDd"wTŒ(]+Ǒzhm)ըn Jsv~6uMay㺨RPPO:@[ӉG$tS,ٻM\U MGXv7\,)*;R*؃wؙG"~&?O@ņrż!qSV\?iͥH'ߖ)5*[ϑuRU&0~ꟄB}(]pPfA@Q[PH^?r#S\V(lbrF6
spAC9o7['.&j(
`zէwfIVk˵Hd6YIz0U
s70Dl][;0dnV|h!5LpVGQ
|'~=/»ּ%ju F)w<>MBO@=}6"Frp(%OǭB"E8FFD:5ɠNVmyNwZϓ:Wr @S9ydp/>&HCHxb?/+-Qj:ӹQFc=Qr`Bѕm˅߱)S=o]nfCc~ޖU_4d9A%pm"J:ƔYxR:Hp(5qNRG]QX&v+7FM:]GlV&
ŵ|+o#<4<Q?p*2E= OxELvz{vr{srb6YkN1K,.	1s⫝̸H
tʓ<15$]G{g'kfT-ݽH8Lg>)1jXSpC|D|/rsH	 ;rFbS*q#I`fB_t[t_(b>*h\],c|AbiQXl옂[nٍH^i|{ef~At]xݥ刼0	,PT:-zz#N[gn'N!rۭX4;ZdwV.|EjY&/	Cg[]~C3̼H3jCb'7c)h;⇥`dl.6y_ps\?ZJ~E
NN*mKgdBm_	xpl¨#tZs}+8]Ñ$?#hR	Q3ÐyysQE<8=bd̽-AZ{5uۀ5\f$s}̈QWoPtGzpJaͽoNYQt!7Eb5Y<t֯ɯW;6ͅ{j/tjK_\F_0.C]#_+UMj$Bĥ9kgk7 ޹X؈ŶsVNo(86@FLZ X[sUb4!N2Z7דPt 	jg܁Or5K~AZ!OcpD]Kt2øsDifSǒ<VE1"^NaQJŔCbheԉ`5Jpm/ve[1`#rm?H![ADHz@jI֪ LY0Q'Uzջ--㬆Տ>6 Z	ŮO!:KyO';Wz>DL\^KN1tmT0.vWPSr-~;3ǝ!u@旝eg2)		Z@Ԫ@7(U`ݪ_ݢרzPf
P?[DAl3,ÜYoZ dX(/i^(!dcprǪ2Ol~Mxe`ua}xlsw~{:~鮙 /~3dČxkN,ǚٝN'(\Ǒ^+?; Q@Z񊴊1ʙ
DAEu
']t`(jhyaX9],ޜǷ#o2H%m v4 Uyr`z8lz`*<m$uַ̏֘ĳhff98/J
MDe~R@G^5!P;	$Rá_)_?ؔߋU0#{oVAS`rw<{,q8'FEЕ~bg{yfj=-t]_&<bq//z'Nxz^cBZp<3^e%X\zo6o6-~$?cb8&J90#OQeR`?G?\ v*9KJX<!\o7tgOk+:*ZGǇ/s )8AȈqMmzُ8 p4'Y&I+ d`0S[JF衵l&M8m;PwN}%~冷e7~x;#RbܰzҞIW猲AջzUJ[>U5%Q"wvkz8fAc"%SM"4ʧoŇiՏїqtL==n	u)v#w^^MPqr1^
]z~^79/1oN|?ڸFg`^K_HaVqy,^Bzma+-2FTq{<f6gs9H
-R'W0C.Ǌ%[J̌'W[N۪[00uT1{V"+Q/,K[b0#sI&^*/rUKkPy17e$þݔRZ<&)Pur`ul	k-}<OQlIvU9C̵]ykh'Y?mVIw~9r+ռyY6G,M^0xWZP3X9w' -BV!:]aQ
	|M7)jWz2 UfbnHsB_k[O_EGD8ұX쓲XN~+>krI*PPP{bOA" i+cʫ|<ݘ%ARnTg a:$pNńƦrd1W^R,X!hg#53{gzVxӳdO-SWYU/\	̃g$Ywc9RK:m賓gL}vj_Qi\yڲXAztjh U#0 gC%Ԓ$0@lhG6鞇NH>{ɹE dӮRBK4EA`&<T\\ TD[\.qLDhnDE8O.|P&|a 0xpP)2l=sk7xӫ *=jF#lnLcϐx\E!N޸*c\*WC?kc12̡ԝ/ma#]ww鑩̸tݽǝd#L6J+42c8+'=J]ug)Ϝ"0Nm\-@5:zBY\&mH[$ëxZ\癴CH
Ft}eALvF
s6֋dpWYBis==
w7F@hKxц|s0yw!>푼"y	y?=<'rk2!Sfʰ}뾶`p6ۚ5sNx͢bKNGmqyIrI%V1iKթ>ONI0F)AEj$ښ88`H%|~QQ+iJ4*(&wq>uIt՗aMZ&J^\un%fؒ0CgbS1,$,tB)^ukBTnmb@.CɆ]I6?Cr>dH5bxR|dֺj	/t?ĳNdu(B  7̈B\w EHEw0vM`s09Y+ihlrN +/k_[TɽS%5(Z\P1tB]ؒN>lzC-l8jJo6?@7C9崛ΛB% גz /KG̨%(6:;m+7lQ>[;Df;dѼ<3|Jc$j13rFfn9>oҌ$-7	3Z֪`Yw)߳YTW`{¥NY9d6	71;RǍtPR;(!0H? LҬɛ* 5C:FALfF1xY"|?辥]O2ԷQ3][&6^2z*XfvW !iE L=T_гM[4w2WU;ЦY׫z1L__Nc|/֘)Z 3հ_YYx7zQm3Ѳ'&jYKy4vx"kq:u 2kvyw_?APjU]'|5JXu$	J0W=0½bcV"2)k"S[AU5畀q
βEE\?"qYK HЫDv|vlXz71Uc:bu!VE_[ N9,ؓbJHC'$Y35~*olam݉c@v1b̥H~nGMsMjciڃT9*78u{;0m}u]~ܖrqY~re<}Ź:ě'va,.i)2Y<){Op&r,C]lZ6E7S/Zܬ%X
Z*g#g]J2VsHDEp ud'x	3QXCzL>&
 &53CF͚k-4#
#LE
q|妠K~?LԘ_󥊌yGrWG{g97Hb2'~hV)6Y^^+҈Zk{1݉P<_?YӈlŁ5y8GxT;s|.cf}U=[у$JPkuc>3X`Duq-՞il7NiY;$SGpze6kfyIR$ |* LOV3. Ǿ^,ul2AD&;x;%;^׾go޾
Eo|>Y58pY>@p~1@)K?`68|<F`0^199师7~1N{ Jl~1R*;a~*NmB@=X$7򎶺߶(=efP%ٌ*KB!i61_n]#bdܞZJ 8!? b]9`a*I)kX@\T,|^AZ,9P7j3O *0YqƊ ,+/0>S2[i1h*_4[-cкc غ7Hshֽv߼$ƿwV@T4Yz99cy>	LJ}Fx,A,9Q.Ф\3#dͪ-YE@{ƅf8T:hU6?۪v6/ʙ}@R!Y~yS֔[Ny$w YRswzYM|9>=<Xܴ8Bd098B4ʿȩ.'v1PxWqEkdZ!K"\N+VK w܅F1E;#D˧xCzocDB?Vlw憎5de#})̎fm0Wj°w/%")^6LfcH	/U`,}tx.sgʇ\s tecK^cEӡ1o#i |d%J_GO'0tk#81wO>ȧ7^z@̞#R:~.3}% K;Pns\xɍZ9'!66dֻkfU1<	mb164]E}\ZӜ*6<b&ǣE,FnvvopW8sH@,eXIU4@X+p^˫dY jY!٤j1*6oT%a0_6|?[+enb_.5<|v	}$`@Q$Zïل^ G|$ Υܦ 2,2'O6Us	uwF`i~,'15́lYvyAcGok6ā՗I?qk 0ȔHSdB\LzM1}Jg0^$Lf=@"?q hzb&r%dؒ/(P;L  g|iv:̨.Ț^X	 2Mbi	g`1zFTkImYV4"\EE9	<H 
| |B !=YXB8ɫO8k~V%+g4 8fnyϬlq3΍DL4#eC]xs bi3H͓C.+NC6뒚.v-#d4F񣰹0҉~x)BLxX&ȚLw0k{{7N#tɯy(5|e%`-Y|t7JyHv|̫l77amHbQsv|Ġ+n1pSrevd~BGkh$~WIt[p|ld%~l4y\1cB^.b|V*pVM5a}X|x'sLE_u1D
C$f4g5x0	8LԃݨTc5>s( yFƋiST	ߵu;Hnobw'ՖB	#m1ghA^8ձf4
*LrQy`"	.4eq9  @l")&%@:HICpD98YQyڋ/F4SPq[
IcWgN#Lڭ0:~}Rx7H"ź#Gpˍ0X@zot{'En)w}YՐ+V:R`ZsG-fC"@KtbA*cLv(z2*e	vPRX/YOw:093,J?RۏH5uy\wݚI}ۥ$Xs.X߻[/Js@+@g9DޕuPZ )Ze>ȗ>WTƘ煹`7lI$ya4MOwI{A_d$7
āHD[@ k-a^`Aa2`fؑaLZ2qbb1Pm6-Rp҉lN brVo\''ĸUQ{pl-k3N\+S)H;i$M-|Nkiz	3]lqapI.74hԊ	 jRz>YAfÃ/c\'OvvuQT!.UJ_}3~W?+UEpŒds0OJw7ɦ3?Y_)l=xOuCw/gsxŗ湍_ǓO?M'Iy_~,mf.ɓdZ2 m	xnD: %h*?TVqOdvw@X{܂L3k(vP0%4TjX]jwMN<H6<9MO/nihoaiUp!xӚC[eֆ4܋DpZO	>]4su36/HDW7]'RsKb5#-;phGa:1z[úeDy/`H޷MJJ@9N}y#Ɇ)Ɗf4X-^5Kw}-RY<+Yzl~QBб!F,a7'?잨ǻ#9j)m!N=:a}t;C5h:xl a&(!8[i<S#V^	.*7Gm=Y͜+iwBt0΍P^x#KN
Sq($;#8K],b6>Vlp	;ӂya)i,8If$we:2(J)ϧo[.aj+t6^@c:КF=e~W8fov|Y͖A'Fnwx챙ȋI_)Kw}R쫖̱]
Eq1~A$6t4sAht.Q8b4`g<ɋ	t;/:ǫ_My68rl`F\r hn50;0na'^%GC4׍u|$ݺ)KXx[:n6t
]BQ7POK,p	Q53ZëS%8̑JI ˶X<,XY.زgҡ=-sZa(0fj>/edu6%GPL[5u	°93a+JH%w#4f{b1Wwp<MbvO7	KA~}h.W>	WR5qK<[KHZ6m'1B1ba}sa΢E1ץE+h]JKQ'&>؁V>'d$yaR%6W Vګf+}fu&yvMFȳFk9/g 0
EzWδP~?ԞN?8γ&w:${=Ow%+bY*l<-AbHi+ʧ5(3?;2q?)od=6`$'UgV,)xeMYֳ_vM=ޕe#x"×OWڐ#؍}`$Q#nv]R :4fwge iӸ"&vmNsy}{e~`zlRF4+Wz_D!ِ2vey{riJ_\J+Jgޤ?]eiX~8@좣#Bb$AO8`C"K#I𹏠VHs5Ӣ$$\is=mGn\>ڛwPrIO~L-		 j(.O|C狋'm8wkf'a1G0wLrX)HW+Ӿӫ^C߿%_|XmXMJL=&94Dŏ:ǕO_>9{BAC4s$^Mo:{4#9጗@@F_o<!s^T?h]Vf!}Xl>%۰\zdz,4+Fp\ϰ>#x$l1O}ۇ݃fں-J5i!#PS$+K/b1AƲӥ?!L~$ؘL"` E|+=K;[FZvgcbj_o4$ @{IGQ3C 6M/=utOfhI_Fg aq(.1 |Y(/f%hpj7_!򕽱H(Q@J9Wg- }T DXG!LA{S|,yvm%u2$]M*7GnBd6Zzڮ(3&m߿~-	Læ7?,=w.>@3\H<$kb-E6C4Wz`8|(m(j]4]jIҏ: {A{P}O3[,D!6銉Vbf{y </.]gwn-Fѵ3,,PA]؈g4M\n?9O *VmQs)/a-
Z	Pl@>$pG-Q.a-Uk 7 kqJ7HfujPߌS#TUt
,j	Q̀G e FP^TȊn@$Ճ6iO{(	Σ<4	LrI vshH(I\fLqJ7ϗlRc,98K.6Bj-k=l"2m<3cCgH"f#~:XzXQ4dIZӯ:@VpػwVqFmW[|->4?Uw-Ǐe)uzQuAՎ]	D{A\o)kb;ZYUs=ț{%Mf;7g?p>2'w}5m`'#[h*Cr"J, pO~?1!O37oF0o_̭ThnHڱU;L%.!U?Oq]rgB>^uy	kS%ɧ̗s?×jƾ`~P'"i:İIiXlC8%{GiTl	~B	ACpq7fB 4/m5Ec[Жm5@ql.]M'___Z o |!"~3lLG[//ża.<;6`oQ,^өi1Zzb~~v#x7-	ɋ!|zX 9TR}W ;Ήt7<l6L'fgYo`O.f\ٸ/^Z<(gEwM|}+eWo-wOu	ţ/*_}?{M#kY 14qEN ͇ 
5h!, 5xAi20*%{F$D,UP~7ErY1}>h `;#6=!k2_qpK?a{5ۘ)"	h7xAap6/Y)/7U,l=Uj@F	RoA )1= f( wa41tdx>x5]x&".kKf-a=2Wq7GP\F!9,zoE۱̈́sE|9`4t{m	#:ʮ:A{%WY뼗A`Fp
T7vB5a>]t=5%ZHaYr=/΍Y&F_56c^3$	e#v`a:@IF!TVz !"@M-ɧdR@FvD!JEdz$/2(m334`Xm_r[z`~`,_ħlg@̓VipM"KY&*d^fJ4!t*b3	t=vs-|]N.}P 6E$x$5KtixhBp觳?YC;;(Y^N~Y<%y&8'=$r)
O}ܴgtx)RTGrf\ܰI:*ZYLR .S(<0	ea
kJM8v١jXjZ9ZPG&E֗\Q=e{G@*W	X~/KFXm	х͑UedfFqG1!;Vpkb3B#j:yLG摌88qo6
̶k%>%%V{px\tTFgRV#a_'F{YHܐ4Y.45ϢOTO5>br2^٫x^V33/AZ1l1	FuI1Cϵ("^~D,	vX}Ra1{0Iоfc"NBs!1Ew91_ŕj3d-Xiv8H6%DT(932AtPd6>D\Wx%:xjXW࿗lP/FR',sstvvo::ǻ֞PmgIj@>l'ʁb~+,*
ՏY~yvrY縦;y0>8<M9k]@A<dq7~6̑MLۇcEN#}sJ)ݐ`bPx]/sXkB<Y:YrQHE=hO]sߵW]^H0~Id=S;[y}o2"?'?旿ʴ[-bhtOg9jw<z%BC4Z۩[Ej `92yKCGb/JXws(kϨ)ǘL?ľ.#9Dio\rˣdؓ'j6o!""`hR_Qir5..+$1@<jNP~Ywxs$O^h`jsI޻|U0SHX3*;p5g@649vkRk_<FTYc:\WGDYS0	k#b֔K@M~0/痰J<&;EAֲO˓sFHg[Y=E|uFp_~u(g|/i?XyLăY_>(:\;Ɠ'|q0}fp_fI7{fqo|FxQxzF.wN$	RJ鄜@7rZڡ@Mt{yFKeZ$ BJ0ue;ИȊ:-ȼ LWVu1Kd0wxK4UVWF95)(&J@˂@Oj9amo6Nxp>կQo8^Vj- a"_WSëe$s85ݺƤCI!YCurĆlDx=]d`)yg'ɕ-B`twJP@@>me@_I6Bx鎦7^&VK-O]KH5Ij>_&͢&ԈqLAZnüDޛ!Th9=.]q]"JE]r.q!_4[pEqU"J7Sދ1@Gm`78X鏟wfHSvrT@U2MS4h1r_yn7}d(RDQ6 bPOB8K"PN
hl&mE{t/-ۆm<CIo(t"M|6u1:}4i0d,3a Xk0 7YSvͯiuxq5;mu(lgwɩwYUq؅~*C8S=BOazs͢uDFφ'@:x́i9Z[qÛ_&s
{뫵V.x$f\9[Bd'YO1 m*X~1ufd+LFBo;[;'[;˚>Tm
6ݜ0AŁ` +vd1<L6͖b,U76M־b%xڔ9\̦	#L־- A-h`UpAYԨ(d\̱Y'Hd14y6E IAf|*FA:`lf'Dp6	No(Bےxɤ~;~-I+:!Ţxz[@V_ܧS*2j	kfxH@pA-Jju	QzevO<$WS ?
@=	HTQ9p#{ķ6gΊPNv^uh`|ݕ/Pv9{g).+Y8{%,$]n#"@UXxrIa*b
Tb)n0ZlV P5:ދ	[R2'P̨/
Bg +UMBmEj|un!%NlY~ɳ=oO߄BVf8)qKo ƒRB,sьœ]h7DXwa~(Rɩ 
!>x}u~Dvut1)[Z4 |B_pҏv"#_=.uӊV#39yʛ3B%FIˡQ>t7-qNGמc(]>j=31ÿ*9|eG([Qkmphwۼ<ZT^jшZ&<_'Fw
ӸV3l<E|d:t%=?"!&$Wޡ_w%1h(n/|/~c~%-u	QUܬyf޼G_>|/6Pzwu8w(xuRe(|ȒZ Tc
9YlX9?{*`Ϟml;,v*E;t#]eFw},2uH:d+q4&NSB80pAAv/
Gy9ͧH,-ְEPw52ѡ[1%cBcۊ	N{r{xD]U]b-_\@#'+~9uyvE|&Ԭ=SVctC+n[cMw#ce"`B@w3@" ;Td_m)/ZAqN6_lyw,Bۈ+zPYGdHFFZA#MmiFL
,Q?cWxu@#cdzS6Q$,|HQ%  8mx<#
j"]xzF`v-Y"ɧbO$4=daPvSNdKb}0}(jpæɻvHҞfs1<3B%;H:APR,5 7#G	]>Oh[RXw;@dY#G={ ɨQJfc!W 'V<Pn#Q<ϕ/#R;ۻxcWȒ̇NzkjR `ٴ };m#t#*$#V0-sptt=
#z-0 tڀ0ƨv=ReN^![nRe׽zϡzmANOjvfs={C#D%g΀i%LUMXL0tA3em[޽VBƌldB*w> (O<m%"PԾN'c"nXؒWEl00b|d'3 b>:aSyj$i nSRoLܫLڼ"`WecY@}va /a-Bc/?ebI
#uFpTeAA}
YD
YK&n .*Y˨DB4 V̙DtE_C`2fJ%i5y,<omO&UVEW&i`^,IK
\ 6duCFB"Numxt&ʆ2.3li\u*B	|3Wn.
v4QαGâCD5DHż!4xT.7iۺ5aͅk08N4dY)Tj݀I|#aVoPKЮHa#A7عB8YۀX9GLRnvxܵM}۬Hɏ>M3җaL_8+> )sd LBF`ęP&(Eٻi8gpÐ7/dUS0"z616ZxEta~)rOn`́N\zV<hLP=}7uu9HKQhXF@9brj.@[ߢ[.\bv|=2[=Ə( 
bȨV\3Jus\S8kۉ_.`6ĠbTm;.}ܻZ[-%QPܿlɮyA_5uu<,b7K5PB
CNPXd6؉'NH3򰼜WdMȹLOWNF'	|X<jއ{}.*[wc]@5|# fb6usąM@"3ICq)!R1یmSpH:CF2Seғiw<i9AѠvDV@ロ=lImPeG6mA>ec(ΆՋ̢r:&Asa'	 I!̵؊@ڀ*8\ap'_%x*,UEm?&_J?^ AFAD1#/ 7[Plbb=~yKVy[fgc#E:<4	y	B6d£;/V7'inڑ%®!+qf f_m0`<@ g\IC $ȁ@!}ϚAexHORhvqhLTR@QWNƣlNoq/#{ŀU{xlGl0QnFC(%ab	(ta~p/p	N{y޺[L~Euц/O"&?s8it%*i:<qgnkH-
n
%/e)!xDy)ɴWOTZ&MďdJ|tO52 ,yG-7eah.u| UN6H_fǂ=:1=Q<$(cbj+dS9P$5p͉@^p^$yt#*Dv 	F/GՄz[	`li0>Xb(jOLti<.'GS؟M`eB|m2{9`@Н0_\ {bT~Wy	($"c&+QAq_66c/YW]k I~~6+MM߁3%S^3ny[i}6gasa1T'9Վ^uF:W]PYC2+&vD!#i~.**}i Wx;iojSi1deƛwNTMb7l|{mh e82Iƫ<57o>zTO_ߛ4'?l77|g7xGnueC46ܴ;si:{d]7ѝTմo"Is&3wǝZj&?&;<sp6HھNU}'4o?>X*i?~q6^3o6Ώ!A}onhG[VsoÃUh& 
H6S׾u^muw7wWھv[s}qu2oόפNpn=N@uȱ}}V`U)A×TEShnw`MEaĶ!>	ع"@0g7gF3z v$q݃%ΟdTsag
lw:``y}qxHV`{Rm$50g;,*
!N],U}΍a׬eP2CУ.< vN9`kCt;;ǝu~]>x5aX灵oxwq	GxŋN>⒌^v6.ͨ><#.Ѩ>_VNk{p`Okt
fS ;7ʊ}Y	s[m?A>={~  ؞<+ ֶ>ΈO[;:0WmK3ݴpsUe</&d?/u=
 !SN%sl5s	ǎۇa,Fzʉ?$ϹyJ7!Usbc
=U:`8<8	L^͸Ar.9cGk؆%< bXeznlyx{!\: 2V$X6MԂPbJPiYf$e;^~aKMh ۩+<n)FȬ}/l''>a#$ebx	Fl4TR`L^ mvB|D*y^G~Td9<f1c*hŃ=ƳP{2_\]qKCOd>yVOr폷Nv; ]<._)n6㯶G,Eڟ|[K@?\ˮVHci[z #0_"m~tF70!s=닯s#^|x:;'kTub.^ J $u?0"Qt=jm R>72߶mD K{6͆gC9A+
TWm"Q ^0H
^2Mb'AJpKzݠ2"5v҉%z<rU7,(@|"OacHH@ԫ1Am-o!_7!#)һI4hy $wudpplJ(a_4@Hh[=g@mS*TnfDgF9(#EL8E|g+`	FO 4?ۏ_uq@e&	f6΋b^o)&ɸPAQrqK
);\"QMD!z3|K2+29.MIg+/gJ#
 GA/u^}k89).g&KG\F2 
N,}s;jr:[5F	.(o0N^[U0fX1px<ߛ/XM=3l2R%[94Ѧ0ZtSv:o\swe,(Ϸ{U'cZfc%M;XͦfսaSf=kq]f7{A8945{N)1fJ6۬mXzúfQ.5xOoMd<F6	/bEg8{EccNmD'V7%<a->/P^ĥq#o#E>C<SaD 3 I4sT3auNn6)FPd}@mvZ.-gߪl'}!5\8o:
=4e?0u.JF`Kލf
 d9
R.3#Ї`Ndߢ4$N:UA,$޷XD $"C'\e6eYjBzg^ ]ᵙ̀`q\vbB! \չvd어zt^o i"s5b"Ӻ13J
tZa&$mD!ˉ@
 8}JY@Eon\P3(U@Q`{ztxTL3$xj 7k]cOpl.3~KuC-ĲDC$f," .3ZjP~ph%ݴE)P;P֢az}RɓժosrOnDnEs,yViAvt 4h\K~
M69E7؆~ y^@R:[)gAȰ gT]E2$a>"B^drEXq%VJ`;6`/x|{|ܓ~}5\o;`~tiA>LaC\{PY\ڼgj~<,G+ŤE' &,i8dhsVpae2ϼsֶ!@zb"ZpMۑV8E+`Tm?6G+z^?F`lA߀ⶫv Nl>BL[=`)tՂu
\Z@T9"M
aO3wU=[Η8ٴN%voZ*P4[Xek9V*+<TrX
fFbPYބZU#[ыg"PVѩggEV<ѽwm5~Vֺ0ORI5sK[l9umMeL @A"Eh	|td}+^Dq fOwKt_Hy|>`D:Dy3GJ 2t.myϓGbd
'ih,̨V)1њל߅B@$H.e0tD<p ǛC9 !s.E88FДlфdjr*SLZEMŌ9E`UCZ S}!B4IVC
{&
d`-bO?r2;9f(!2|+}8{>e	,@xxh S%OC  C}EJ7dgZ҃wdp&%fe$톽)
EvR" Zm^ȖAr܌SɏY!MQOIrh25EB& Լ4upwF.Ǻ]D>F	,1"8hɹBiK>b
敒og76DM˱:l_E'{YLVzl|7y<2>bMuODuGluZ;y"~ō#ߎ;:Ꝇ8K"Qo CjuOGH HUyBb| =b,lV(	%P'BJtF +VcQƕGCz˿گ,i+Zt=lMu+!@rk8mËr;-B՝/t緃s\iߡR99/7>	^Rҿ=UQ#76ΦYH)-FloM.RQ5Dg	~$8A@N8:~_?o<eiz]̦(:xN&y6iXѰf,Ȧ ϳij燶x}1fh ,~j +'fQc>:5j*ZE8t~E?mIg(8_)Ė}k-B`ϋn3hBY@f霞UdJKfrKc:RMa:~ӉVeFX]+Zh	psj`){8_g h)Sag0MZ=ZDtIïnWwGξ={ e?̹z~1%C<eP
O.FUYT1 &)A*Q)8hԔ׹ 1Y0Uz(9۫(\xJBimra	>,;({Ƣ:pDM#(r\;ivw7V>ZZZ2֑ұ>:3 ׋MD ŦKdξPkTfȹqoaóKg{Q@$&/|@`Kla5H_fSL%b*o~	ʡM(.kSQ/e<zwu4i jfS|^I#e2rVfwlDCG3P2	ԚeΙo]A,Rb,錰r85UpAuTJsd$"JiDg	&]m1^8%vH rp	)8Raugng"OXBJT4`tb0њ+OP1_Y!"o"sSb+Pq5v G(qWVɭqq%ߩuFdcRH%wQޖvB6S	T0qT21FFKч:Beç0XY<\b#sɯIçϟŹ {a@EupmDE\(dH922Ոu`6LcI9Zהhh"Td!b6XsɄ`pg%A5\ּY@1,℡s:_PiڍI®GeQ$W6~ۮ`y(PV%$EBai&Zn>0ws sh)ۭNa<Y$CxrWo(`1MUhRCjKM~yOvlm}O ?Vw5x,rY*sو#pJ^6V"P1{$u>Ch3SOpIq>+#]5z>,4H,yj~4~K#NEq{u0ud	E
n~aT RS,8{c{la)ct f1
^v^pCB"VTINfl,à럳rjsnda9Acɵ?#em.I/1_ٵZ@No.\} P#jg_U
Q	C]qrqOZB5׶h'm;V inZOeodn~9?E < =+#<s|{҅\ZpP<`g-!D&yi&SIP3*rه|<y\EdC1+M9~"f֟V)MG.h*QʦVS=Ce"T$ݚ/./8PΪFoF
siT PPW1	ΉDK^qF<n*al?HąEh?ZY{ESa}f<Ezeh&yˆ
r@om1]mx&O%mo>җgQӁDQȳ?˘b^ٚL'[G'Ag`}HFF?ORקk|(J_Ge EySq(O@GX,0#Q5-	L0'QW bZ ˗JJlX4#l/|<WOXP1$jc@DET$evi
H8:/y|*"ѕy158b5g0 Ʋ)I2*g@KG4G՝Enk:T̵ a$*PR1Ӵ``<[&n {1iaC:X6tը)i|E!'Pb=c4@e1U=GlI8Ŗl&fZ'芩PY?jS搒.)g?xjk1蟷zJ2ǹ5Y'&-w{Y꩟
ꏸ8=`zN(Epn[BKƧ}bkhŃvC0Kxh|t
UiU(sdSX=jKFHhJm"5m`2`J#啋^"**DU<	ox)AAB̜I*˽Tf؎MW~:TD<EWdb\dG--K`XNP
J0hz!,Ճ9өt73Bj_VWl6%WbJ)lKF6+b6){hYbG";O{;U<|ZΆ*; z>@HDn4ȧe6Dȝ,S"lʙ
5ldE-A;6o^$ke oxbZAUm\FZDSQ6jD^T0XJϤAQd5N.FtP
-LEC^#}S$d0#T>5,|0]3z'4IPmۭ@?#Jt1@x7ÕS2)*G6هLXYxs4Qެ	7RuRD*0~mkME"9a]]W"'k
[ܾW*:TmXʄyĲ魲VGώd-gdȜq8`*6f%AaGnec/,tXDpa42CݮhC`QX`YcrNK.e$]`ZhM$x:,u5L+j("'Jf/[K-nZ0'Gdy!/lQY;eUE;9hl1_`oRy K58jerTdFɼ6^ffsS)7Rbxƺ6>xȬ<fYGm}^bԍJe%npEX%tT*ڰ6m,~_#"utSy6B`s,`^p sWPSw#FbAWSKxkKz*ݎ`SrEB/<cЫM
bf#tvQ2 bKu>ހDaOrys6 |QpCJR˓`ek&nö}ure=
ƈˀ0UP^Z!?6/M΋b#)0_ّ'0N=6pb.'_9&aVA"HpuKTyn.ТTjI$7+X"=$֛uzT%4XNбN6o/@$ b]_9|1H (`mB%qЖb 89l02OG2:eȏuՋMrt!BSˠܨmy'i'PVb.@Tcp;FT[lͿ,f.nXApNڷ,@P?c 0C$?d]%3"BA?{Y7B~x(mSCiLc
R/z\2Ŧ@}-21N*j$4\HIAhpQԛ)|/rq1[!*ڨ,n̴d:[ψf1OIrBLñ}`9@zEMU9C MYjE{AUL~QZ~BQA1P߃MNl<p=Yr&OyQ]*WOp|K"/hIDgINm2CU"v2s&kJujư; Qj_;hA4(.:r	ب@>ȍLd_ъSdcBpWcV
aPI)Ul
G4糺7馉Һ'6j}F]t?^GmLRM j{&Wph0
v56G~6x)"B6Q ΖJˌ@@IzQT%x)h(H}kɆ͉&Ysgf'{5la{J=<ABYOLZ%/~;&Dg#%,#"6qbxUzwun(]H8M^MjY<x^.10A1xVaf%`Hf qy40A*8OJȪ"gjc^!>;jٱPL+O5̠m^G*RS׌:PI@2ۉ|3LAxëwT(RxꌉMsC9gtƀUf:M{W*V 3rd֎n?*iMV7D͚rUTxTڢj]ack_6A#^KTb|b5uN[ǵכz".H	ARJr֘PN +;)B?) Gӌ1!:\El7<L	o7Vvo<ٸN-f) @NH73G[%K`'Av6.70N>A砻4EQ'-*lcb6K&г0r^*yx6?}#5[5Ն{CW*Tcب0 oX/7+'S|EԴ~y\P%Pn摹+)K]WN=dUEI470ŊX)nH/Uy@8
i ׿ɉ[3T:=JN1E(wRgQ+V*[HG~}j-"z/XDlyRu=T0L@ؿ?C`/k0	2jX_⏫7o*e|`SkvseL6jvFͮVfWUxͮxͮڰ`05ۄ.Гm\ju;G3Γ͚m
5m`05D>k	|l9|T}𽨬Lσ]]Pq#U򠎥*{ͮj#~fW(25je`!kvΞ(J{PN{@ǫ%%݇0=)2z\ktT_5Wql}kP9ďY`9-Rb3*	,	Q\QG?YE"I5&[HZ4yTuT}x~\A'@>Ivg6fA+(1`^<0U?\@_:&lQ`b"R*NV\
rd*Ľ3{HЌ-V#)RSLWث]H*dmUbbA3q;YQMTAJa;&eeS[eax\#l="7hdjC,WH4XA]fJ,~:B  cX3Q Q@+2jRfcf	o,o:FHq>f.
uKW{˗o4{zTX<A	VX54*$篓!ã
h
oA!E9H
^hGx^oTq67g{D}ǎp10Xxs4?LϲVrvEofuG
2+ԃltiSF=8<SU֕w`s KpF@JMU:{($`p}#{)OpYtһ
\G2*Jaj5bw{H9Ou!1%i?S FHM\C6D@Tcb!DD1[K{HrjMjLf{I\9`Ej?#[M`u+%AQuv]=&R7TGzԘ\c<)[-tEVh ?m4hHKkX\KLc0kYKU `U֣Z!q=
	zcìa (afN}!tL!AFZ^1	KDB=,mD=o(ee?ܮHū@qR F`CùnȬQP&sYV2HߴI<sά[z5e%"k-8Gj$aݤgc	S
U>6}Wmiwg7)sw.xR.%Մ3C 2m,ӃWD4,zo|8>LI.j)0޴Z,ߙne\nRWF^(nf R@lc՜>b8[?8yv5nC.Nv;݆~N^>ˣW˂T Q (e e CRCш+զ6L "h/g)>}LM
9Ђ<S %AF&(^)skɯϗAǙyPn^cbY7@_W-Xȑz6pT1Tu
a3ir(N wH<Ufcdް.m)-^
Tm*΍u#\:zuC;7R^|d?S{f96XH!0ȡQN˃eVFᖃ;	?9ݪӰ#f@0OKZRAqɩ@!|H0뤰{hׯ<OÎl8'*Z&5kGEaQm-4Ā`AU:tts_,{sHZN5fZBR)Gvo$:딇lsh!=ѐIio6#Fuf8L
xVP|.f
C"L{JE~kaS͛0Q)^bklHr#|/0FKUC(P0-I/0Z[ʂOAީHԽ%iLxvĜݓ)g1mJ=()Љn^TG]ހ}٨ ڑL(;pbƝ%1qRtUA[pPx-UNX
|=
+z =#!Da8
|0-SDpӷ6HlV)@Ѩr/!jځFl;,J7Ӗ:EUS.G_r'K Xf
i݈c-PS/ Gզv7SݭfMąRh[],cಷΊAMKp0F05^Y,`@~/8pL0g`	@G (%}8FtL|8dۦn'g "F!𑭢!C"nC3Sbk;ŉ	,![pHAYS+Gϐސ؏pY툎H0q
)GxWÞ10#ƐRS$%<Kl!۰o`".F,rØvut@=ʅvl5T<(Hz/fJ	^Pn<4E'J𓬄2H͇kAj5K"T/	jErwUu\
ȱ(2lrV%ʿItl̴% aFfN/$6G._k2N)e,+'xͯ?VX:3Ut+@/d0\ Rʳ ֤)i%Qx@ `'!>x/)\rXr`SnP'_c5Sxj}2ܮD kDeAKqkmu!|_</_XEIҫf²gFu6[YKԊ*I9Vd#,xك	|_縄|g66l<jR8tU)c^V\UWXTJ?,;)V\N`)[iCoW5>Q1rp%{퉄PRV{<1?#g3U~]k63[k-}-m-fwތz;D'meh"˕Ľ`#EK>h+`r).(Πl6l/1ξ<_^f2ޫS`K~t+林`N?`Q
Wa~1;jk|ψu(?,
tƍ<{7*F:".[HiIrWq`e	q?:_dYxЂqa/s_r`IޓnHms[t=OMomWR[욃*hб @z L\69Ww^r
kɻ+vO>R[pm@ "82Etmmݭhѽ#Yq5e,cN;,e[uLQCPAi8VbulE:`!x<5H#][sd]nxj:l6Q%b3⮋I"TI|tZArl}k&d7TVQs*.L0M`1<@vnLE'kkzؗH&p*`gk#q8UIlI{ȩcկ}N6744daƠԁSRT7W"L]&Abw)gm#j瀌*8$}I~՟|uYa뉌>V_X*ZT nRZ<d·
3	\K/s<'P)G#EΤZRd=J"1I=:,jv Cât^u6!0$%̦T]6;CaFy	"Ei	 +N*Jeu	@'MKՄ\='18[qj6#wGrlҳY]A1`}s*0p9Hu#PmbB3_w%4·T_m2ζZ#Zn x-+;In=D q1"#j~tp[!p*sāE	'SL{FB ULFY6Үr,[q y.,q`-jς٥qjE.+&^-Ω*VȒ.f%9.Q;%饲X+tji&(B1\">ʎ!Iǲ*ѹD-5,@c1[ɏхd(1|F/DAK{aN`V-KRoݑ(R"5qT óRJ.8) 8Ҡ:ZTvһC2C ?>80|7N=p0I[_'Ýkсy1ݷFyY(vJG$ep`KSRP{<OKVrč]Y&Aۖ>*{(zbܐ1$a6dÛm/!A)n$

F`p-esӐ`?G$:e[rN$,'M^c8Mk_dT>fݛ1dSࠗ%aIaɸdxe87/Q(F1&KJkq!~"2 
?KB9[VyٕdttOؕk;&kTXncp&؈s`_fvQD͛&`JHL
/G}9?WF;/I8<ٶ7\)zɯ54e3Aj@-89;~9~Ka5hsrdKsB0bK<l.yǨX9&Q't9:b<%r#Z%djsC6s
Z>m=&iX7Ǆ8nlE}#H :5Z38xVF_Ro8TI!ۀV5(&ս6|gXo-E%lTQQ#|ik~WdVfEF_?f!A	LV4VT8MScW8F&37U|j5tvjA`p+H"t^˓h%W"&X;dd9_YZJJ'INŏEfb=dJ&%Z8xƅW/@¨dGA72i1 ކikhDuDk?s&TmF>qA6@4M7Ov\zw<N#obiԂ$?}"2H*klʒ&EBюcMVqa>zJM'[-؁-n޵gۇw_~u1O7R`dcX
9{?RrК9v5g:F{C_ӈjeNfߒ02ckx4{!^ŸSߎYb#/Razm`X67.zGZq J+s	V	dgLgVuE5gZ<5R5Way8g7JFBڮ> t%>2̐P L'@d$Ih~ .sIգ͇A)@;+3J~:4ˊ%	FV|c#)&z ` +T7c9l\e!0 9(UVG1Hf~PPٹtW́JY3rȾE%,b5&8E5zP
ճZq
^/2IOnL.'@R.%Zɇ\`5Il_9-cT[v I?ٶ64KZ`U"=d_k?|@yp"&,ĴJ=y ,.ˊexbfAR(&+ C SCw2q%&yc20	%0Oed
r`MHtR?$L` p^h	hl;DLkɓ%P&q& iAqn	kVg;)l䅰tvKd/[m@/|:NLfC7*,''AF	7V>2Lv[h:p"
P{G2ʮ2`TE[LJ8Fp5x!st.^'a.-'?A@H6b2 m޲8}D7!;ִEb蚚S֓xb+;KjC6h)!szte9Rz	KIn}hV=fnX`}~#UgESi	~\EiMWm($t}DrK'EZydh"H9*@}	Eζ,{Xzl(Qt*Yn_t݇X{ƥmAY<YiKFX8~*rի~Tdd<JqXTPfJ:fjke+)@؏\hrao.:~H[_3.
J2dŒlG[eWll{pl:?:<9yc-l-.[lWzQe(T-)]׼Pd~vx̀dfT4LיDyhέ@YXDF|Fq[5{,vӒx6딮6<Fbg%`SXٟtE<So@d"LYyGZ'?uH~8]OpFpӅ$	tےQgRj@(:XׄVCVJ+whl	]Ձ?.$}tZL0<]XRe+B!yir*x-1[A-tXKtvۆ`
)o^wzUja$WC3IclVɀs@/(^SЇ0~e#o0Z^Lye8I%5g2mX 9aP-l>#¡rr٠ua=*U@@J O .TCIK8?q,IxwkoFoؼSF"1vLp01lRQ4u2wGw
נ%H4?UqZjy6pZ -O=ʼ{ex
kC3LPa	waή8p^G~u#JDI;ɏ+}Mu2Rl<</N&T`
8\|`!mKG9а^ZA/bk(Stc`MEJWH8BI-mqߝ/o] F gGEKÖ.$

*̓qy<<t#')IjiU;@R`$t~lVYz NokدaB#ׂ`Tϋ#Asԩ,rO-c!h2O1$1]
nDduy]=FzQh10S JWtPr51V*!. F9\?f84,"HW=^_Y\\p+Zm|;R9d&Ŭ՜zz}Q0	kZN^6ʚMp276O  I,@ˮI*Kg|#$i9'^TXY\Ly!Ĭ_*ɏU۳pVtHm[v:Ϸh:!",RF ;1O9%}~Gcb4Pe#q1mlomۉ~;':%V>Ud"bz`]ez݅_m{9EE#b' 0"$Y\S(홯֬/NyT%]ӱ|`T7ѕUdzTZServʟ|43^8bE"o_ll }ŃGF(QI(9I5:©\f"ng22j<6Vumٷ;' ^$)e(mu!!Bf}k	!@oJ2o񢋋`Y("29'[5\_½ZKEׅ{>j%c-O.@̂F-ƿfv	>iᜪ6(9tT6}Jg   =Yx"		!@B4<1K]9[MAc	 $JrCw(DvJj5Ö@.%Ʌ!O׿;y$ E96GCpSnLlEo8b5HHb|I!ǵ"]w$$EWcF.	/_@ւtl"'8^/NqYtK&(%يGW Q/Dbzx<,o]>[&(#0tQe_p],%T躇fI1XpGpu"SRMhX$2$Ua@3N(hԸre
"FT,-v͹a$^(Ml<erl޻NOC#zhx</HocZ3Y1D-b[%]ͫQcoMt/4
sGO9|&/F?γ = Huq

	nG!o'aR6ꛘk_%wr1DkrКG?Z)s!tbnbb	Ĥ0Se?Au,}`~;44C8ޮ$//}WSHHr"l蜬9]W6kι4U9(VD4z[{1Ϲ2XHu+5q ?cD7:J*­ftRX,5+2mzt5O/[A0Fk @n>-mkb
MۥyNZR;%jD鱁͐-qgu#se5zk6[sq-6pgNCjQ.&	Z+9Dw}g6z9$6EF8\uP\Y(˪'|,(
Ϸ%a-$rJpS-gٶS/jS
Bmf.A,ck}Y͵ұNrT,m@scb:@Bݢyޞu)Z>L4n\}(!xdԥqP^cK'd
^W$#	+7\4yc"+B'#ea1YBOVa.e;>Aюpr3Q骐1&
N$3~bKH豭6l+696`&V?uGېJ5ix7bL|=+_6"FC'hg/Łݥަ#vTЇ;1,S kkB E&|| Xpf5W%F!7#/[ 1#W"ᰳ~.Y]މ^\`kbRYϖZ 	`ʠvZ0QtA<V~ڽ(bHLsKte-_th)K, %J<O݃g;¸u=a쉫5PUbu% T"wȌ 2 f?/B+J`m? ]:4]V+cGȊOxDvWՍcIw-7cӪɏUa5xn ,arɁ:ElXUw#Q0ƞ^^J29Bxԑ 
5'3N8]^"mRAZa=v<;鶲SN5͙QP:][[jV%[)-EIGW׷F`,=g W{wmx2كJC8E_>:)o{cJ|,%(9ƯH5i7),?h	(NW,,.0$REv :'-!~w\c`!!ˬ6lHQCBqtUx9MWNJh]v׸$P `8at<h]Jv'pbv0u12,a2j2b\BbV?C֛M)Wn7[aT]@FC(C#%OB-~R%{k)[J*߂`X>3oDvo9adz	YOǦzk[Gg'e+b|	#5۪XCqUymXgcb`%9C;p-hsmNWS1Sj[/OT!᮳:N$@ɣ2,Q8qu>>-]X4/`9IDmR,lN˲	Iǁ 	{%;j^Gd&G!_^wE!gFa8FW61Ģ O5&р!u	wAܹ(ɵcDt6Fr`|T8Iı6>l虆֏ը2C78iRd+_z$gf!$>GsPe32{Pg9KHJ	5 $pj["d];[_6|U%jq>-s/0wd-Nc^(K;&VN 0+yƌHخ"bAN!KIzJM#;xp0mb*p,o%'
arAڂu(hꤻ?{g'G{{*T.Nnb'˾>iQ:02;XkF}\Th"||U6GI&3Z ސOheV,rt-"
%hO"i6bq4򮈻5#_W&YLCAf&79sa0,2Q-K(;ƅiBRϐa)gdSxnhFB2PNGη؇XXE;>F|#8<o:^!q9!q<OcD\RoAN2!\Ô:Koy>024A@~\qAK,Xn/+͘=<3$m9D
:9܎̼Ȭ/Vʖ^1G"3+cn:/Nb\{|d`L3}%oƖ;yF|Ծ%j)ivhI3vCO9Rwy2	^ӣY񪳉v]dw͊.ws:ǝɭN~g8
~{-vxzixم fͲHg|tG`K K 6hG[6i,g{Pˎ3k)ƍ+ԫOɕL5.*jR݅mˇ7I`+z#`P	+o΢Pjh ,I>B0?xK1fl!W߃L/>(GÁSZ%ϗؖ҄3{P&؟ag7P~5װ6!~݈/a!BSikt笿fccN=l%˃h+76F(\4'7iDGMu6X	؟"ύfآ}o	.iK;9ޚwu%`\?7>{93Fc4Fqdr>)J}\&&Qr4LWGC"A|W	jx7Ku+
(._j5zQzZ-;sVk$=Tm1JtIuV(ؼ\?F+l}~,AO*U`±0UWF[|(cFXI`@m/,R7ԠHsUk(DCc@훁\y,pd .׻)ԦR)[O*g\$9ۖy<aƀ
Qza!	VCԌ]M,nkCrG*R؈SpC%&˺g0pNWvZST#_BFþRn8#r\BN07RzoQ#Yg/O~8mTt&u~gf**!8ldȢ)7kA.!9bń~#	ߐVZAϿӃjf7)
	Na}{Xo_`/8`L3L$$>Ł1j=ުB2z1w!uw_ϥF~c	qgId:!~>9O]\_Mnvl\lDshv̘{ϳ+:Cʜ	?y~E{t;GB]$"H\E/. V+|dh]q}ċ,a75ݰF{cŵv~j~>y|ga՝D1g) #Npe{=yp=sE!6-MR?t uN1cmDNtp5?ds1<|}A:0ѵѼanu^w;'s	("*g6Yd0Yw:@R>%CXTiw%Pr:|^8W<U?`ɠ+QcհĒ 鹒,Ѹq,wѡN2`JL<lQ}$vȪ/dF^!`p&+BSPwUL*xCe"L1qkU8wl5Nq\mV+g!iJ-	`]pmP~%C-J	5Ґ{d8~LU[/\tB̦<G-Ӑg7lI |' ?O%N8@옖8aR-1ŭEV	fȮ-,釾pNZUhex,W!EZH/
ȋ[ vC	9y4bR'|Ilu3(׊.8ZoL|UCz/T/ M	:azek
7a<a	@x]Đx?	26;snmd:\5<؅f!Ag64LE&	㮽bN0t51p'`:K	6q0!ˎw[<`OF칕~mnp:WNͺA.@pk(kuVSAahn˜S|?gQ | =SĄ'[~bߊct?Cߎjz¿4M3;le~ ND lKnљ6|q9aǓҬsI7]MYAa`6o垮B~: hTڐSG𷹍«FW$uy ÌrY0pm~ wN:ݳֳ:y')R؆(5,|S-I ȳ͝zB(DNF</&6{~mJ2,rtjGd6]G5n }p- d	B9 vKsH^="
JsF)+F>F]a0Q)4$*iW֤pe筘W[{$;5v0I^oxJ5(ޚC-0y~e;qY{XJ]nboqoUgzƐ68+J%Ta&ZBBCw=/{@b[!$hi:
Ѐ1?䣒byfx>,ZY@<VVbL`3yjcYPkψZH[F$90	&y ၲA~q%.9@Ϝũ'C^&\쎘L1-4fr*G<=<8uz;ڄs0>=|<%1h@Zi>L1*jyh'&I2𺫴oVc!:R2K|`Dɋ|vqKxJ ϜbeaM	U96/D3 ]5`
`b8Ym)tbk=ȵCj<;TM0f.JnE|je|TeG<;ixmC0)dQ~Ӽg8FbbZιC:#3TTAJdU\]E:B$OU`lg>i>nǒyYٔ`H楬ܖп+ԍJ쯂t0{p9%ˣq-L.rI&vrJhb"3owZG}U$ 4	F{ٱ7pZ]rq9AY6-lrkZonS05$YqI;M27+ҥ>?ԢcE'*M 5bRTRfVL`>>  o8*`=;htjK2aEV*fF9Fee=88~y8GOBW8 u#pD
ćQ)νbJ(*
,qIs1AO>_]e{7Su),HYr]M:<[ԳsOw-+*RtѳMXs\thcU2*r!"(bWDÙ*h
}h z^,VTthwC-`7}t>]BvG*v`]By[p@UT_kdң	y]+\5bb
)py, _HHP_2󽶠,ҷ?ˢ:xh\<@9-(ցT>' NN]EzT1#Ih'\ACat ͇"+d̟6>3?|c^|g<]W$͋4p5BQ")YV-YIm+7WgeBi
! #\/),5D>4K'<I4QPu,Ƞq
7:I":ٰ
 t!M+8?C=[GB_,Cbgc@W_.ڃr=<^%zˢ=8OVl1oPӤ(I8ijILzX&#ܘzX&MƍaazT=oCbH)asL%l>z;O*EY=#!˕U)h5Z:<"&@'m)֗*EO-hÍᶐ8'##_~U]=(;*49.~BvRN(Hz
 5i&o^N^vW;9^a(0vMxZ2Ddy\sc)H'Tdo.٧C} ҈)8˖]kP`~>@u7PWzHF0|A	_kg,#JeIyZZ\vfr3|jegUU(dRiSU7{9=.f8NIgIy3ӣ(߁12p|d'擢9⯎;S*IYC}W~TeK8n4x؅ٴ k39p_\K"Upubtn;뭶~«q)L0/; oZ~BL.uZuPPݫLi+Y(`VJ<8gـG
}A]R5XCE/ǗaYBbh:#_q`so\92<Ld6S8`<(=!:?	;<D'DGݾKl1-؍V$Z&ǬS"i"|;LV^AQ[}~rIqF0vr89e.~ܠGK;||xՏ[j5`ʤ?Z֊jNV1lxYAѴ*!hq20+[{-powj١cTSoKPc6|{lXE;Ehok?Q1:-/tG1hAdd7Ĩ~P9&oSV9|ĥb`EA6&!4fA<TĹx$xĸmC/?SbG#s1+gr@ɮT8Ȇ?*r7v\_jĘkpt䌡唩T+{?z/gN5 oBH1,C
3-%QJV?$QbkVV_h3~Ax5!HD]L;lZabT3zH4f9(xR+md~W,6+L>j]=2]Qd\C.Os@|J7C^y0fh4ɮ&	@].HE|Tt^?eDQMv0Ue4 eax<Fl~/r|!3+O
t2X+^9*Svv"\9FŪ5@5|ȍR:qEʷj|(JSTF5*M%=	VvIJ/Й3vs+T?u\ZRdχCsP'	騺Oe͍G4g@e3n)ʓ2T`̅?l炝AȉTqt7	u%*N+n/z#GJBF+$ApNFPYF& N:%KAK"	dFTWG}O=іpW]1+_:j(UY	z{uĒ4Te;fc,j$p`cajdC02c/<u25fI!y/[Ɉk.EbhF^3lCqe	:T\uN3)&|o;<8M'+Խt*TV=(r{8RhiPڊU2pvqZ:98#ƢՏLMk]!-ک+J"jQ20-6%fBuZQ([74eN`~yjѴo #=Wę=Xr9,̙Bnz3sUqͣMVศ!}rZ!pDVȕ"Sj[)\,]Q8-m^	6{UvXvmt-Vdۉ,RdtٵO(GV'5yxJ@˭TAmccJ'^
 -{[U,D0m7tLPƥKz㡘H1@}B[,YڟWx޹x|IdH-0P7uA4x]g$._15uR5 r1blQopz-u#}KfXxk赜sCaVW.׎yčWK9SRoґKr̮;H֕PlA?Ojx2yQ Q@ьQV9m-oC-2[6TPqR|-_%{zA1fACrm]fNI5%]3 gE^$a'Aw+~C8[V
X-WPX0䚯;8%˧ʺN#MJK«텕>V8~ݛrˣUUb#jYnLp@ˮꣁ$c9;ǐ.qJDE霮(a
"[]Jg%+p#v)"6EĨKΧ53 X9HhNWi9t_6xi,0NlѲd;`6I!ӟI"5l2&R)0X+	O;v\Kq֔1k[&LN⪜NVfe%x fZ5(K(ry[tB:x,|M#WBT@3"cF\ш	!4f[7^<jf/)1EenH.mk̆y}.I<G1E"5n	o4'ҧʗȌ
ȌIP !^9Pl
}_ba)eݔg[uNmK vqnuؠ +YZ0)urn}
zX.o_%pOFo(LR]``Iѕ7)g`oMs/O	)1	fJ_+aW:-{[f*=։*ȅjVuC+FQՒit"BH1XMpɝ˹/WI	_h,U&Mk|MYu	3YӍGrs'?,D5,2v3_\kT.2/J3VoTJ:xIY#SZ>gHoR;phsmVvZ[G.]H}S_;cff/p$G(wdY!	J!Læ?)5'%q5b-J P׆eӐp
<x pN-lCQ9ˌrTΆቔ T˼7)uSPL8"J&
eLYlqqrJ7bAGUFW۷w&,]U Ȯ*+0h]ؾlxa1Y4hbkrymeHrAlJw)8a7\OFtlDکdokA0L]JA%3@ˏ|2, 2?ggo
t߲4soUzlK)43Scc- L_FFU2 9ƅV!*8\h6,l~K/@M7&9<mfɱyG/s܁_[H-0utd.,_P[-qw168`UOi-@k)uMfxxc"R l{u"ZGi`h`<.	p	8U7yp`WJRs*w1NZL665^(n2SM?vgWE.#.Q7gWK0.^FV2]!9;nǹzޫH՗f." 0ŋ|dY|n0A$QG=5sޙ7KΙ_I6`<roucEco%u]yN@~J7`9Ȳ1.2`xta6"ﲜĝZ.:Q,<D*;rو@U2'K	C[P.ԇ9Y+YwtY,i6ҽު,63eEL]zwm/rMuiCvCȰ`g~qGҲd%0kr骳y3[M,dCLY1ZpW~C~b̒(@	sC4o:glp_3bp`k{26X&V݁-BAa_lϿALlmIxh=.e6%<CϽ:sb͛F[rr$GC0Or?CkBiʔ?DSǽ˥nkk7j*hN|9 >|А&WGI|c"k)BY<ۖ-.?oO]Hǎ=x߽V_Cԋ*P]iU=79|B}\9Cj-Maau)p̋t)xpB&!D,wl3<ꇔ)رl.AVluybǦٵ⏇
mZ6S^I#qތ.Io=r*IJ\r@֬Ew{:;"`fGE"|mV kuû?-fgy:|6j͍jxfB|6%(N+OnŬ'qOٚY-!0r@६2#@/&8W?	Uh!FEAi4YY|W#lQCxO|dq	n6Rtl0d?6[{_qSzcKL,DIGσIOCbںP,ji1uW1^ t0%t,PM	 P!kij(+ba,:Q3GBr0gǙE:@q9u	@+ir=  7."ZU 5.Ӆ˜NU1[_t<;7GPf :pg}$p L>ł*$-S7TQJ$1>iLQa2L&<ayIqVz&%"S 6LI]?4hTdaV}n޻7,BM$p<:.ՐɁ=)(xzm5u 7p	|6^h:1 ,>GY9#_4= (5wN^C"TBuecCL5{;trӎǡRՇbrtI7&\y ]2q==YmE͟~L?{}JȨo)1|kP_te;<$v%!1G.d52bFk?\xP[R5dGR+[W;DO A`Mlha/׈F -fh@QP&Dr='G	kdu[`Ѩ|r@טR?HơǰNL5==>"(L`-?h3T~RI\#2o`UOu6!#Yo+C% @TBFv!~L`OW0zkQWSR9L\)3Y0j/ 9\ު|ǚr俎z=?-D|1#!sD<Zaq*.T:̉(~IQ#DdB`lGB2ZP;e<"5jNeiVIIb7C6 YlwA(VX39MZb{wC%ܷ\剑Rỏ*UA@ 
5AH,m%_\X$[֦iu*()%?.h%o~r{( _h&'t|Abe	i"5%o?b:@rz9>HT$¬JNBY.t!q#բr@`"oEQn}ee52ʁ[Y*OPA<̙ȨV>x@
,_n+)C&6S7/Ixl8
&[&Z`J)9\lh$@qTZrJxɄRkK ('jB 1 rJǫp	@i>6x^ZUfJh?*AJOFp5E}ЊwpYAr9$W#o_EQ}\PI l;\GyQ{P V$|FVE[($b;+g1(&ǧP@R>Qhʴ5%Қ{}"	qZ;8#й\Zۅٗ{CZiD*G{ƹ]6X{H\%&</..^*FxbG+	t2M>6ґۯU*iEX=:m@lLx`B mb
A=\(`<:EP8+	},ֺ>Yy]âgGj	6F[Ad`cpTCpֻXYewQr5ň[aq8Yi<P\*w#*))at`QW}L95HA"IvDi=<{T{/:;g[{{ۧ^B\.[-	،HO!b	eb.t08YF[	7QOR{E78fHDeG9
\{T\1U
3fm"ds_M^=#3omt4R8XJbV.0 v:B [Mm5%>&/:UWOn(.TH- \~5x0+"c<ZYb];+se]en^lމg5t0y'"ACTtC0a
zOnlbA+]b+ǱU3lVȆO)}1=UL#a40azcKlYT2&=E5zauRȒҼ2˼68x8D$)YZ24˦ec٬_3{w_P<Cp3Ǆ})}$+G/V%e	7u$Gy Um8Ut Cp+)ʯ		:R4HY-ѱ0y`.]OcLWP\Xpᅲc ZiWF+ĊcG@?*8s-]U0n@]9qz0#%9 $K94pe8{W*I	~H4D65<WgfE_m<)fX`#7d8֠{lRJX0t5[U%X:ړ@	.t>$I_Y)79P:x
-fC=PA cJ^D%~Nr*9{)Wp$ǟ#Bc՗'pg^331mp6"{BI@	lfgYr(.o2u;ĬP:{3r/YϺU6;I-vN|}$-ƨ1uc &s89bR%5;?UP%ң$w_[1KO+oYgBsTn$vb'QWGZ^
ɥ\F*0a"-])փH()Cw;֙+νUK弥F8ΰMOұ [P{?v>-,yaYq]ն`;`-*+}xA0$=rؾ<͞| bmPlhLA4˶~AɷQav 9C/[Z8DCQW}f!( dALK]#+Q([w9Y|^g;;/t6`qYda)O=Gb-}Q>í"M!fXs4omF^RbJ}>
̐d*Hd=cr3^g{ʊL%\A/ه)FY8L"R̰x{'[<?>܇˫d4lF;r%:U՚%FtRɮ$CdDQl;0VC>:
|ɺ8ox>I8e}\dW}92gI0bBT.
cx${qS<OԀ(ي#ۚ͉rHPEs5#A8Ծ֮j gVb]̑ad{)adݠf~_&Dx'pU0U`x#;@89GtU`ĥM`3H"2-@5Ɉl$I1"X^e)U^7Fi3[fA𘂅Ԥ!4G
):Ѽ"2 '׹%)ʆo@
?⤷ .)]"ۺ\t4
LM%4?`lS fjB
HGH Dle*@Bc 4)IvW()]EJUy{Jȍaΐqe0D/8\"q B xDād a0{}7E,,C~=n.~Jdch =U	%VA5̤L-61)nsf1~sqWI ̴xv]pcGP2O4Xf z׾-k}9mՄf9Hj)҃$`b}`ȸ-=PW\K2"˧=pvO>&C^[=̣=='!_t1[Pͺ8>o`{"A]@6͵hvs
ID0M$H~"/ҭCIVޟ@MotPdRMÎ]VKy?bdʑe.+b釦+4T4[<V?DI*~3޺ak[0ckWnҞ5r6,f߇GN4X'Ix	9BTƎAva3È:TXW*C9Ŕ
)b:_Ƈ8&&$Xh"(nA]sr/ak;@#f *T܀tm@pg=t?t"]:tBlSGV[_|Pqd%Fe\^O3Jy)ĩgq<yHP`2
y	̹Ⓛ.?67~1_2N9?įT,c?oto{?s/@Df_8:?0淎kUF[z|q4ED~""v}B"vʩlBZS8}E8oU+¿o~V0_,%^5ϞGGfslĎSOndYwopx78Vhn4SzcrRL:.}wx<NtsOi/A1~o>r}rWUDkTn04r*&ELa?8g[NY Aj/vndHO`+?O-ĳ|*Fi'j\NbV,Br.DEOm})ᬼt65+)jsB)c
Uߥ@}"48GsJdJ!sHW+cˤYN9VrcE0́B\SFu\}TUQ4} IZИ2I V}3h6~5D'H"h5,FAsϽ7G0oGv"8:oDT{F! _@K>l1<9xlhZDrDЉL63^-qgMefNi"\`xݻ6TEAMuO('d2`*/m12q|Z16T Y8>L`C^/ử9$ZTguqxXԄ/~@|c1sԅi2
bPx ݞJlMN?.pcýN'"r"~D}Z>>3|IZՏPy'R}u\)u2,k~-.'c'lHx,^N#eA\5Ԧ允4ꗽ7;GX낭ǧڻ/,x)'L]
pAHild; /#s)cǝ1'0IaZ-Lvo:{;[5s	,V]XWWC4@hF:aXr	w&A5JXA1ٔd ݈
:'[zwOE
jFἭH!d,aE'a;lY}Q/-\Ga;Jn[X/k9Ы0bC`jZ'&S+<RWt~rvl\,-sIaDAaqDr3yL(nlooP=UsxTZK&07${wG}rz|p"pi9C~45sxHPs-/骽ooaĘ68Ahì p(Ҝ09^	"eƼ#VBXfMoOu_/Z@PQ"GT͜DL-ޛ$YȊ?az&Pڣ>m֙`)+Fl[t7P=,oCh7݁h74z+/hנJvI[H ]NLR;K%(1IQ[$,ޙ=c%YSPr<
zRn)e,\4_pE֛bE5knÖbv6Iyd?+Z*g%j1,mWv,o("ZTV6s,J5!g3JB0Tc\XZ?~H3XyPx4IIIcLV@[ 	SBv)JBS6=xI 5
S0ő#kt֦<A5ۀd߿aB	\RӔ<+Yz3EkNgEe	w"D`Zl
O1S$@'u(S`(g?fJ<	(&t>a҇%hK,%vkcrҎoΒ]qib~Z'!vhWߖ8`LHЖA,\/oRd$Q9ɻ=[hʐ6;N]0/_bhu0àx$HF &͸q>s, d`z=\ ͖΄dT1OarÒ0ۡsd2;G-{4uX/$?!ScB-ﵜ/m8Elj\3/\2\eq`Q	 Ћ/[ՀG+
Z
CŴ?hJBwwWY	QJbb%1R[kJ$H:IĘ$6&C覶*MB/nYؒM}-CbK-Ǹ) emrŘks0Aү}}t#Fx3e=wӔƧ`$ҰI?ǜzPerܐ
ϲ_JԵUIZ:
F1ö8GΓw0ܓOG9e>^}6e^;.CZo+G2h(g!zcxѐl!:{r}_Y50W/.$Hi)tJq-IrЃ5L/5@\-l=NI7?_6Aҿd$6?R Oe=x;2#}\kH 4reO(;0K)9°\30Bw'iquF֡|V$5~/Y(B,=o+QW)TE0-V2AWٰO+0L11D]
qG6\gn/W暪9ˁg-MYB=.;y+s{6U9޾|TE	zCf=#9خob|c("PoOi|bJ_$A]sMZ.-`?mBUmh%7UmA\4,付K(ҡ8wa^zJdvC(rx>Ӿ&NU	!l5vnJpt8WF#5x6$"c؝VCG#L4803.0UwWiozOlkKyQ{qÆ3wI\;y|u7OAisx{w;;_abZ9Y`;[z戸%qh{1~pKjq6GW]]guNFJʫJ"p/݉o<^uٙ)v̭C d~8/IuiQ­y$_7N/вQo2~&Љ2 X*8[d&`͠O)J%gDDKN0_?aB,Z &hbK&ƾ԰t)ʗffXĂrؐ|Ea\q;Mlo*uU+uenP<y!`1<ER2<a9f PШբrZAc:$rФ32Rr^>ǩ/%܏qq+pS=Y2~ւ|nyH.}A!`^JNJ8*g]~d'>:>;BH2(G"*
?TL1!r,3C'`-ަ3
 <z7
S_SoxYyևZ47T,5R4ij!$ഥq)E gDΓ4M>wza} l6Y h}̛˯7.D۱q~E*߻r)`u<%wO7fE6.*JSlDzr%O;/C@R6[kBqڸn0xT:TWY&]?Pw#& S[ g%G$yٍJ,;4恤E01}<@VFHAta$9֌·P\ WNŎ]xϗ>q9{,HdXZ(:d|<5oĀ?͘;<΢@H3Pn9Sͯ
Ԋ@amM!xly4vaؔ,V@JMQ8.e=;k<'YvG2+Ln=|▍`<_@ʇo4v>DKF1bC*_Ac[Nfعr/7ea;..ćA4"8HP'%Wiu1wX=)%CwtQbݩP:耷YMլ j}7)_e]rwO^>nHH`Zܤ`VHVILtHHRwv|_?"^bEV3hT݉i2dbaUw6vd na -e;zr8>@ޛ;bX C0?h-Dx'[0]EL
fp~odkel#Z!Zo#_C۲^fXaM3T{FRSQ<	+ϏqIhWqwlSJZtOt\wޫ-?4k7E(-z 0qAng8N&.4t'4z]Q4Zʥ!,Xx[{>p8'2@;c/蔈CQwgsȲgݶ$"IdOUGLY I\}igvd8TFL3!5k o`6S

&Q큾L-q0|زJ;B:wuuo(>ډhVapTЯ%vKPHfMLp/nAm1*s~ؔG4xDpOrǭ*McIpc<)ЊCkx٬w.}%H4idF-Qh%2h\Kr/3k7j+1Yq	(ߐu|0Rؔvf_[=E|$ܱWUzL P#x]/nMP0cF¿@ɣ=r_ط\~R{iL#s$+;uf?Vc!Jqکt	~h"3%y(n:a 5F][0/iq=<<::G(dA*iY>b8VOjoXmXz^Xa#Ch)Y1U6~&\aT!`z^}7yٜSo>jgt7w|g,?!{&.ZQVIx2v	,셞{|2k{TQ-,Ix6l&~} Tq_]L7%ct#\O!wlG>L7u7/;tGfmm}ﳧ3KiEa^ɐOdAB97r'Xw|?@+Ѣ\uBﴝ*x\&L"uĮ$gQR^iZ .K;Asu>fzGv2(*t^!!|/ii{Tq:1
/'(ɍ9O(e%* xGSīU[{ى̉tr~9W|cad$'mhdz%a޸30ruVhB-4lj\&Grެɺ:85b1b`ܙɢIZk!2ܶL[
ʝUŸby[ȾF*@)	,A+Kmga ۙڌb;Lk'HwD-"*$5K^ȝXh1/AP
͒HvOe5^/#IH8r`',4:
3W|\bG˥u%7MՍ<]Lr<\rQ\hMz^.r؂GAH㚹^_,?2Ɩ=#Wjwg`K=\-KMV)g7!qk:kp~hçv\[y9L4-8pĖ0eq+`BhXG)ճV_0#^3lS}2cP)q6^غdS5m0lBL+UU31x>J燖n"^H$NLC.Nse{4>5/4)ܽֲW.2G x|)ң؆va@UB;SJ!cBD89*|:.gXq	$&em^MMV"G&oqS9 #Y(I] ɭWĴ{Eig*欼ԟ7 B2Pd'@ 
D/ɚ(\tJ;%i< EtrLMdYw|pfW9ڶ56fB[ךZOgbtWwvso݇[a\n c' Ɛ[/Ax(jg/p5ES1C#DQa 40Z)@rN/ME/,]`<)eSp
!0C5$ƪTAPH_-[^n)B+XXa}'GuY%[=q4R.inm,7Jc9!TΖ~(D~eLίhK8ZmsLE)#>xֆ{[#e̞b0#CV|AAܯ0ۉ%}4Ly>	#ο^\[#B=3iPf-i{5]&9G,P!14ǸHfI$^RrC*'j"WpR|\eJ0{;ww^dX8᏿"`BNvLHb\=!ǤYS3`(ێQ]ávHc, 5 N1}&:~Ud(M!{Wh]­l]rAcQ،BO_[},}@kԹڵR{ͥBjla(^5BgͰѶe &߲ X%B紞5[*;?DhV)#jd4S=Pq~-7n9h5>%CencY]JOoXؙ<93"aozlzix2I_!4/[*49~똺ZR-^	"/HM(sDWE00g^#CJБpź~	?i(	j9o1'L־<Xt޾odjdPe_i|ֻwݞᜭ0c2!,KwK4va9^"ѵX"Zp]vd3^&d1JRl=-URXA d:@|Ě׼ecWNa`=>?wJ;."xް`*!4 C|b:cg5M>(WȽԣH<CI#	B-My QM6ٻM53 rJ[ͺ郲( u A֞{ԩz=$3(05p-ibxgAoS,eCsQq`ċ"tO+[/i>"j@$ķy潳1_"gA{|$͖;͇bO[Pvh6R <giw<AlN&\fg=
9tndD}x
G$抨Oz?ŪM=Tjo{0v>'<2j[LG_z5!t}_I9:;pKKd 	Dk"1qS WEu	x+C:nZB(tLy0bViJY-nb*-1M#	ćXm"Z5j931[u**юSN2݌܋C7j?\䦂SΧ=y~l~$s"޷E$X\:DEqЂVD߁hJ֭9Y :CTb1#F.#Ќ4g<pcDб(K`OTi! ks߀6,zoHnNAZ][l}
o6%K3F{z4 +2Fk	Ds,CiΌs	8eM.V=QllĈ&_/r2((mu~O/Gf3%d(5֤Krٺ@/MT..t1i{[)j<	b6.gZRa5hfN ᨉiNsKLAځSHB'Lu?-Kt SG%_+HWV&AB`2'Ywho\a,~=ѻ/ܓEuQbWRͮPv{+>1"M,]Z@}`7moY8*gԀad?tezo;s7	5J\{^UPX57M+X8V2Ad9sTS1yv- K१V$<wNc̕`85+8	{T0ER<x{d`E0B:Đrwdt4~LJPk/1EbӚ'la:Y^
qN]X69z,,QmRbؐdFNbYC;i̔"NirN59/c
i bI\<j17ַRc|+>q^2X4d)yUD0fAпdԝb~P>jfh	_S563PnD UaA,G]a=.9<˴DUҝ|!c8T9,Y
/OWC^PhYIܹ^r\lv4PJdiqT|VM0ӎ62`I#nG7_&`T<nDo%汞i*Ā׎e˞-ޯB}rT$ oN,3?C	%#7-ZMF4Yu"L"_@m҆z>u)Pq^BL)+||ι+m8Òq!.$,tq=x<DO7ER0k8Mw'V₌0݃oߕݣwOMI'LRgt- 7ˮ 삖t{x(a/b^جHwvDcdy"EC~a/.
9L% |o=ZemȔJ7TZ7%GX𖴺DpoFIK9W[_ o	+uh޷Cq/SYIPcf8'(M@xZ-J.0lԪ\j~:MLkWv;0|
KZÅTxj星b #! 9EA<'Ôq 5apeFIiqE9)ruQQHBڠ~"j-fCH5ãw.!Ey5<w_j^u|Wz1d@84":/n$)/0h:(SEޤt>QO<˷K:0ޟv8*`}\8i(*.tD!!#@擔> Gu@Cpx	P/aͷ	n1B>`l$	E(X?L2ZiRWn2ARzoᦤrRW^Z3#[`%
98ycslUh [nkMGld ߜZ;)jHm8>=b&]Q2{YMoop!gT|"ŐqwCntw'.G  R6hjN-<ƶ8>|˛ X˞NkvK\c 6'.z#qy#ڦdbc{L֌%xrEC]gvvxp*j
eOuɦen/Ew0 D5zO:2ō[+TX(佇]{}勤:5t5x$9R^/4ФPK`j[~HEw??z;mt\뀑u46?՜nVBafuj'G >K#|fB_|*'%$!i*'<8湽@	=\ROt%_7xnqS=<Km=yC:W//{i}h~~ᛖ9'eC/	Ye=ib٭tn"qlWQ^d}8uZyEiP<E4~r;鞺N~Ci>`Od7gc:ɧSl8{Ab VEmHR$V"4OlтyāBNcf 1+@oBWFŃ<{SL=ernPOCU*V>82>@QX%>SoqéWTi>~}'V `hZ
v5?>=93LVto" Nޛm6nNAhKUpҡY5Ja/ᬄ˭<pʼ@|;nq^c\=ײ? dI}`tijTaGT
9QP[sRH0駧qIdwE{D*..	Ў,WWVoiWw?O_n4/ǉ0}p*rb];GF52ݓm[ei&byvf0I<o| _g|UoЉ;tCʻ0I"'P|Ԩ¬ΨRN҄P$&`X$
 $!MBFeaK&y&_bZ˦EĤ O)#3ŰQTT$JQѤppvF5LppOl;	jcTNZnF:bi\	(|_cB$]vrf;ʛ t⯨Z)Hղ7`i}e7G5XnW53uI30PRY
VQpª4˞=`z@>Jp+Jzhogj$^_&.Ї'%I	.&2M`#;4G'aGuD=zXGw\SېRw+ywG.G;jf/,bL,f!=?#je\AkTLGa0hxS٫AY"Eh/w@6Û9 栙{C\TND$^g4ɫѨG*ţfZt8u`M6Smҗ%%j{.Jle4f 1:b=,jj1ƠFo8(`qO	ʕf  ]St-s$%|UpmN2#[Fqa6!1)@ڽӇjgRˀV(aEğ6>0#괘a<} D22`?,`#0V=5Blh )P`0Z7[pAy*
^*ǆ8dOj&ȳ{G+xUFzQ>=4Pl,qd]v2eH4Eú<NFS9kLppR`1V%r"bZ@'g·鍀%:H!GPot7ppZfɟGIPRٮy1YBLI ̰ Nׅ%&o0N۝'-نP-A)
,w\bݪ$%7O&0F)%)lct	*	s*v3YBFX[ըs
{4 "Z_)a\En(
! UsęTp1WnWBYj!K-aAھKqTrvao]Z6hW
b.!ңGG٠;*YHT	SL^*C+'p	SxmBMk!20aƤJ$(%2eks kc*[3Ë 5xY>Ծ/u]XƱ&&,$M[`t@0@z>LGAZU fUwTZ	Z
P0c;1
['Og1[2.L]п>ǽǲD*-[ӠE|״eMu1miF
5gyORHGgSAxBUI2iO[[F':cӵtnrL^wtl+ xf"X"-M#ͧNkmc;^h0P
*2nlwԧ$G5{Tד(Cs'%਽_;/?=eCjx~TחϞtqh=	H.5~vRCe
jJ2&6١oĐi%+'QQxu$T1U&*0=3 `/;7ybpszy/s8٥QY17n@]	e1j.,$La17ɀ(RC#܋})h]!+VEuaj7dT6$ T	o񅱊SQ|9,:>ͪkq	
&Fa;1$ڷ{՘ej题5}9༎f%aSMR2v"qI]-|ʖquLI9̍M*)nv{qf#kl7d-ְ"ߥQ$aEotV!lk1HioMK$[] tamġ YiCgB¸iucVwnR4z8w(ٷd<׾{b_/5'+tVYNYnMXͽdiojlKƯTp{?A;>͛ݽ?4}};9>o}f=3mЄq.*Pۺ|rh?m8CHW'6T}xsQ%/!!LoI\inUofJk~>1	m˧NF7's&#Jvs׋Y.:^
*ؼ^T|3
y`Jڨ?45x2-JL=4A$⶘aPz1}>eG:?+vxt?z>{-݈N!̫&J3ղ	oեToAS;Q"4|*yڹ-m3 &`:fֆq&vd-uctC?kiC~Ȫ(΀	3>sguπi4 I";<gPrȥKiG8F8-TA,$=2AdM$;yӅC ?dv;9s_txaN+E^M2_;-?QuAb#HKfK:0c9+&>[&+k(dͳK5Qsƛ#3̼_bO3.`cܰʝ}U¾щ!n!>{Cz,zRX6;pGYT(18sZ&.v%BzuSLqh	UGis,Z
 (`$ٖFפ&9i^+gM@~ʱ?z?D55}1GSˋ6KlS_jIJ5B\tT|pH,`p3M)M x<*Yj*k;JMǁFQ~=0ᔀdW3w-Iۆ\{FPA!FR$1-]|ˡ)*X]śo_ӶxࣱCZ򠖸d%֧bTPSvψK1Fo<5DiluxRQG
;b7 Lu]H*.s],]mVz+
"H~¦Kj"sws6Y>GMT(16YGsbçA\S/ ʘ/G(Jr؅t'l'>V0N8~53k=C0b7dD@j q`kEԀ.V9Ϸ>_ a Mdj
<AC=cHߧxӑN74[y?\xӣq7Cnq.,3&v SZc5=!I%	P#EoNcQLW؀
}֜n-Eym,SeCfKN4Ep0kY[MMJVx0dj$.q2x
+Va,Y)c'
@jDդ~y	X07M+	WW\^z0s,ČG	#Sⲅ\(ʔS iKt祐.4n OO[db^*|4>NxSA;gQco>}ȯ'`^C"t;Âq駰kd_<1<dS	zM*pa`/7IHs{*-?P7=ڷܥӀtUKi`ph|yƧo
EV*M O/߾}??#L ^NJFF`$5/5=OrrQw82te&"xɮDHPFMJAH [FK&v	KK\a
RFl[dH)
PZ(`YAkɃ0R'|]`뾚Ta743 !E%Џ#%.z&zkS@h!YrR X' v=.AX}43xX?S7n2\5nX:+-E)D*2,H/Dfe^
`caQE)>)+6,52]fͯYHS[ƳP̾W)%zTٺzy7]L&[eV&ga#Xp_L&ېU2Yb/yo!nybZǱJ"FцOvg&xxÀ/朒%7.|/~DtZR'BkCA`8bJhrȭ ~'I\]Gvn]p<sM:Eʰ;wrpS>B#юΞ&|Liё/=HtU95VP3)ԙ𪖅َ.f°zۿ*1(-I}	{spXQ,CYGxb;oX9_&Eyk'{0HҺfSp&F>&B'b(Kk_	x.8ܧZ4Rbn){Ҍ0iB*)?8jJ1oU]@{TA!%W@sb^_> `ԁs]֠,Hs0B4zOgt<|=C]-oACYFc>6WQa~h2	U=0D}@9.lB่^]*"JjM/qV%J[C1Oy¢jP!#@'Qd>iU+ #'2r$!HXܯv,,p>`7QŨY<Iu="iَGt{;q:Ђ@H\8԰0&%{˸Њp$Hc&7弜h~Jt(4Pj`l! UlX
vg=prrhuauRVN'q\A;nvD^s?8p}~wBe5@>Yyً"W7=Z]U7Ř_w"|=|
:fUh>*6$C!X# yKZ&#".8`q+4An&͑	%OPy;clLity0[J-g,;`a|#6u:⩶9d.|݌
;15gh;2>9آ]_M=̑t6/54پe|7:Π@5n)Xz-5^G ;fs@"ְTO,IĬ`%+|Q03ԣ#*|n5'"f[fPÙrؽw֍UsnX{YM삡a5x%<{Fb
,B "<%1ngZ
7Ύ2=D4b89P
/̟`ۼP2"h{{ZK|2nǋn{hQ]Ƴ/9ɼfnsr6XqHq>}*IX~VMix*>Wbr[Q-0!<O-IP2 l&7Ii?TF(@d¹j#)nϗ&vip{F9_+9!Ēv&xkjpЖm^|y}Vjᴓdӊɗe͖YwĊVld[h	߂}$}d:$bt{4	$80cTDA!&W4&}9^7;Z>[4
r]6"d<ƠDG+d(SAMЭ-[1q#NLFbaWn?_b?OD@cOHub{`9Ec/"s=@`4fm,?is/x7&j"
 S\{@7d1-caOڥFm#z&emjݗo>\ýҌo}?C̏Upbeu3bR:1ȽqM<NώNZN
sf_x#pgL4	"Y#N#xoss9"kf ōt6rat6-[h9?ڀ@#˧KDNI!YzE?eE
(c%a1o
FGeOlm"MDݧu<K_w:*VBH1`AH!ȃ	ȸL)ۋF~x9ox<x*BZqx=G7QtTp|ܭv	gDL8!@D%fkR!fdS[Y,v,Hh6߆jR< (0?]'	xr!{|;|QJ&wVژIk`	<,*1قP
Yl*M.6ڒ.5D!,)VgV|j*;|c%vH6yi221@.8MK;pA]I!";2i!t9'KqgPǭ(MnkHģ+%(GcZ4ҏ|UrӐ Thwl#tXl`n;Q%iDx=}6J93Ct;XN2HMJ偼S%>I-͗)Ǭ
]ʹ75	Cʠ<۲)XQrGĊ؈qQu$8RQx֞p,t:prh`XIf[vDG0"Moz-$>?HMIB1X1T&N~Zb&Vxe!Boe"|qY\ZD.Zm46gƕLt"읬{Acn>e5l?,)T*"L) y2`7dϠ)f]ўxĒ	g2e g+dLATߡ{JESpݥÉH
[Mՠ4;(~+%Ą(Qy\0⼗e|M]xqCharzVJ$$4u8v(-|Yf
-d_R9
&$saJv[2zfѫ.n9QoNw̠%rkt4QTh@~U1W~(9صոG׾pȸ,=[72iKDԲ>]/Owíq9KPK'weH~pKbY>vN68/]/y> -w[
	ip=2wk%@^ה D]DʾAm7wG+TaRM!IL\ 9?_EGn* VA{ф/Xu;q8GП`G%S>u0`s7=kA;Fh,|~`L+-I 9(0Cb-ߒ[D3!M!	7zʳC՚-l96U#\]Y'tT|R0PV RUbOPר ٢)*I| 9fl}ˏ.yOV[niU/K2v%n?Ȇw$2̔re"(ZSyH8൧[8
BBD'x0BK`nx,JBU&&RQЈ{6(7IJ=Beaw,	>c (yq.؍ВG^(GwHY ;a:&=$.P+dӋZD5BT\R"͊3KڜA)JXcx_K;Sdnq5s!B彐U$qFEf5e1
Z:nJm(bZ(6x1-D/,ޛ홬Rǳ!Q%!4-45	Ɛ`ឲ`;`  nw <fnéi;پO4">?Y x9=|A}xf<&.t/nE_̎ _"X*^㭘P
CB,d*eѳՕ)ub3uUeQ%vD H<(-mZPZuϑ4hjXPp(<V[+'Z̜$R3Rl*&Dލߏզ2W8} ^Ćxl0O >TQce1Q2
ykUםuu-8bHDSWf? s(
(r	1L|	Vŋ44丿|HI\Ig)~[$@{K`d^M)m)4n	-$'}&шNvTBK$/ag\=4Irs|8ZYep-0^*eo;GTNi%WN֡ep'%Mb*5_9uꬺ'[֘LrP(T6ٯ>%>øB
"7'K@T-n\qymKEm)QDgg.8_Le¬̶s[1%Bl1|{b] sm@2`@tX9Nxl"J2S.H
4ikU>pbV?C=3aϦYH	Q@y!Z✕6߻.K`WLǧuXϭ[rXΆ[țPC9C>H#lxFQ 'LcVs$]Gk 1cj?$P,B}w t=i4bKAwKW3LQgND̵EիjPuwO^eK%pPutP.bk6%morkR>8$ؿ#C&jQ$C$LWokfW|WpV^q^4>'G[GŕCUkl6%AiO$)\[IY(U%	uN(UFK'tgFSGr9xxsz|./Z\762g̍wU}`Ο	KVԝ/	DЎ*FhȏZ/t⭓Y(!;=ƽ./=y>:ӎ(`8''k62QIHڈX"PwILK!,uG+ʩݘfޟv8ZԊˏpEB{^8* A4u_ԙ_f#,>Ʊ. 5˸fSr?Y,wuPZl)'F5HOj
!4<
ſz}҇GI@As*b`Tv78~(_H
xD;;IPχҀE^j<(TN?Ԥ(jqx%E_>stGD3;Ͳ7$?A*}չEby ϥmsD*.(?0Lv-UNL=[L+S<W(}C1#S};wF\4~,;{al}V@6~/Κْh	rIbFv_}~;.̒<kkE߱=~zU}
!Px|gH"fఉ5z}Aʩ~_hɑoCl9}¼0gh\urEJ$U4~)`ee65xXT9X8m5Jܓl3gQd.2xKY"T#+5R$*OJK4ugdUy[l0MT$`7W&<c
:Z08yxOxd*9}UU"Rr/U\#2mܘY7PXޠ(Nɠx9/aS	_Goԧ-P8CA*=X8R!6#H}k%-pzLl5d(t2*?6v_S1+M,4Y⠶t?*)0X.br-|H;7t+%TL@l[LɁ~3a2IBZC$6<QW3WxR!P@˙G];\#aH(SFQ["/
' Mj6Kjl\)J7fpP@Y/&籍
8UaN k$h0ģa㳢F.9vT$)+ܡnnH 	򊃚Z;4xE꯸\sRYJm =ul6)59^dqۼuF8z$bEUG]<Xț.^8&Y2Z%1=sVAbS@ԲKW<iK!ˉBJ3Te9]gKHïmud	ΐ. %q/ b=8 q -	F:Ӭ9BIԕ~0SAEqiY3NZv+Ȗ2( Mq{7ɃW &<.,N;o>gnH_6wiN	ҌAƅoAdPr6 9ރP1Nrb 7=.Ml$[m 
 'WT^v#XΪ)e!d7Ԑ:#8ĆmVOeՙ
J䲻5=H݆wLX,0(X[N\뒲W	E=ֿ|k\iΨ?MAKfE%.˵Fd	RT}<Uub̀d4تϡ\<l#AT7ꙚMJ -6g=PrLK(MNugHH	%,Ϝ.4fgdcw?n^QԏwWWᷧ2k(hc`eOᢏzu?]Rޯe◊^kͷ ޵[)<~ë́S:s
ݶv	q!F~hzS~{6@1Xz3hCJ0~? E{Aw7h[^8~zJ2x3FڿGnbZCh$Z۰{>Yc+X:rB
+!c$IK.1cܹa.(mE#}^RU5c3`rS-)8ӌmZnn(*CYۀάRX43#*׺>sy;)?VAlʡ~@14U3&Շi5b25I") 2io{8e
 ߆
fZɴv{7ҭSS }
Q8 ՜Xbά`JU5xbt QM <qH/+	XAZʉ\͗8{v4ыIMPI%Պ*_ԊUCIҍQM"z297~;cϰB	J)?˥ ͥu R?hYOSrul@>a-=2he!kXZdQn-h+ Q#S^\(AHa8XF5H"0Kaը$u-IDL/^4&Z]>vwLiqЅnM*0Jo
J`!U֎t!LjkS
ȾO' 'F~@C[C4AiQ(m2m
'^֟}Vb7R)HMQƪW#	9Ϡ l	)k]P1!1t*@@Qs`eE#`tv{[(5pS~dP   )(ҼOd'9Zd^5	A>("&*N("Nw!Hh",;jhZZ(Ӓu-;Zo8N#~=ƾBX$p|v^Nǧ{ˠt1KA@n#8FqIb$+J|)SQ/?gfa<Z Mytb(l+p`a~K$Jn>
;{;q6|N֬3P2FNb@rTkVx0@ɑLA)p*vAmʽP@?*akHpj*iΛF5ٝ9;j0kx("qN؜RJ]j|f )m$u`	
B#ӑ/#Ak&Mߡ}kMҝlkIjX}أtE+;{ [QN:>7#҄X(lVjqA<ZQͭh/[#Jc=ΠW?1̋1Zz?;CċHr:e>o&$#s1ȓEӡ1؄xU8(CB>k#]Zɵb
7D|ddr߭O>GD)>M;-c2459̞;n3k|dK6g<CTTY yɇ)}VS,ƖX4p"9^pBtN5̓a '5CHPv,l		lC
4x#Lh"/"M0YZWfPG[BN!7spI/w5]KFMmuspݺ-'l }Om#nձp,	crts23V1%2H(q!sQ%ttr~KG$)2ƕ '>Y܄O,Bԝ.PUdX#vD3]MG_9٤lOQy0Y*6O*>6#0Z&dC0Ahktk'}3,H1%oYpٵ0tP2UQ5(4WۻBSx;F#bpPvB2q{ŖG*ĥV
i{X5n'7>=H"[BQ1⮣5,k(B'eV9X;tFQxc=@$k[o7ʈGAf	}8F {yJ5ޘE PMX<o.,
NHh}KuDQU%|Vڝjױ<p1t#r#/?Mj{b-ћa򚻒6Eb򑡒FZo4	RT[1- NFNg=TQdg!a5]DHJZr1? &sJ|خd,zUu4zXk_2I6zJɻ@2_20-2m!iشY':"1Ɠ:F&1`#gHEM<Q䜮%Xj$>2R;ܤ?;u'[CPh('ȃ o9X	mU 
贀N$謫%</P(#(VI n2>2
VHſJSPGG.n}FIj
0±u&v\O:zTGAAj|(fY`1PKy^ոGd=cД[%sJ]"IǨv&P`4V~B|`5"HAGq-fW%UUBrFZA	e8BњK0Z~8'_صCCX	H3@?i#\c
\{ێ^/"&D]qnprSKLCEJVwphB<@y;5g~63pDc\
!}Jv:zPd udBiHX*Df(!}m;JI|NepI<]̓8EZ-$w`Xp@c4`x2@)yAaU r+x"	#@	myd+Ua1ؒmA/iW6a =?,7lJ
=(}_B8Ŧ%Ҡɠ$1eEP&݃*GT
&6Dx,'/1(D9b-Z~򵝚&ƒCı2_Qx4;-aE=]A1gr>ikiv̤೨꠽5&陰dt^*P֊H+AAWÍBDP"@Nusʛ,fĚf`0)v!cήRfc NYUl2)@lO-2m3gSH|?=qޱ@XN&f9Yr=o|JEs6h%q(UZ_*&oKPqjMK |rSށ"k
"HH{Q]揋X#M:-@!F˿f>S]|2ޖ: 1kǏk PjhIxX"/Zׄ&5#"ϸG8 pk>\_TV<#Z X |aQ
X@o%+`QP: #ŏ@F!ΞBū=yNݯY]pȻw>]h{<|?»_~Uۻ~_X%p?r,]ng3k~}XZ9ϲo@ 5BK W) }Si"{]}m"o}4.`)1_Fc>mXp_~QzQ@f/	C<HsHiQe."O+)W 8:EEW<$N9'P!L !2]0Q(CUF)}}d5> .>&o;;ZAzֱ'L:M`9`#Iuy߷>6#/5nI3ta>BfU
Jdhb:i05J|~{fT3|,[i9u[}a֋8c;͐ja{P+b1Gc:"0*H	 ڍuZv2:ΏB*үۈHXNC:2ST9vgf{9ֆ8`V}5=*K!ki9ۂBֶEZ25F9"PҀ07ӂTX\<$fw`}SQ8)ZwŹ^q_ctIob]Ϊ[D1%Tw_zRip#ysI|ッ-ɝw5BG({:Id$OXgV8&en8D.\5*d+Az-N|W'_{	Vlp]'p!jueV|1*Kd>Խ8=}b:vFoG;i?'nSH+g<;=E+e)yx6
QlR"(r0c>'6b}Ԓ4dQv}pkbdaG`Er̆sqk#KMl;࢈<BӛCo-v&AM6˝"u*V@$P(7O6ѳ
Q>4?gl"Q ~wu6P?Y~o_Π߷	szw;TYQs*+8,7ōQ M3?2&g[vk]pduZ}QE&rl`Hƴ#?&=Qa+5|~[n ѨqvXne斯ΗO.AvU㍤#CXEL.zvOo7l*5lt4mϻ1pE;<|y9qJG=@/핔d8//u(5VfK']"L53V?5:J\}PSY>lA[-UVO2TkbMw±ϛkFqE	`db`d1qa`;KV,~ip-gSZ.H^Z6Hm [8֒+A9Y
$=b0*W#e[uYQ4$'0]-@HQs DcRw@ti"٬*-5/NZŬfD)ZZ5yhCdbUgQ}3}}$%5|(Aֳ&9.n፛24u7@FG&T0& FˮmB\kI!fK6s}rٳX GИ~y9tuk .CxF03A}tV|ŋC 
m[LPU\N`w%Kܤ_^T-,5|/}[J0<yti߼v7߶T*e˦SɎT:
cđ,3MYSr`We̓0!rf1%Bٕi&b4k_,#Bjī3N1uA񳥣rP j NLh-oiv|^Ț:aq.aOϡ1)~61/piŪ6Yn{i: YN}d#Fe	ZUk;|m)8]\qݴ=A.4=7t~Td",<5"ooK22^sAfi&n7߅7)E3V_Ft	Rh7زU$K.1DpDA3Zyմ<PS_df[+nK-.qŕs̰nJsvN"PH.n9twWR+ofhUBWET6WIKvC^=JomL3p7*'aCCfI^)]!1}9PHsj£Ad0@*jV
	!ޚ	!ZУF@|y*e-rn-)g2?M7
vzಂ8qTfp{Jq}ݸNJ=:5oj%`)x	"$/luQjZ~lwqϓbWGGƞ%
Kl0<Kc{䋋-{#p$55éS:|cf9ҾPoyyŢzs,4wV̳V_+"y0xMc
xxϦ'aoEc}3@rXBWE2hCⰟ^-մ{OŹ9o,h kF1ڼQ0^15fzě{,]=H:} YlB-Bs0ɸ=W$}[6)(s `NUhNXe] V/qz+r-Cg9PW"0K+|2:TZEd,o0D4mDìY9PRٺ`Um_R-1%!yﻧ[c3BQYW4eE'+i\d3LiH˲`$OF(g5GIOAnu[jO2*&Z,! d:Dz!LiTyk}ܳC`YwpS_3('p20yiXw]-0ΖtcBC*r'y!A?ЊV&0L9Ex)̽)U?s$B0Bc?u%gAW[M#a)pPbtI{ly[d1dzg!{Y>y,CJg9BFK_׵X[-3xJ1+Aay\5"=oL̣^GjÔ4U8Q
@Kϔ%^MwBX;~2c 5J\SL:M-Z42%>Mϥ8}s摶8~Vޮbd+BDր7V`+<e_B3H&PR!һ-O6i:4:>ckAjGg^D+UkL	Ʊ84⸗2l	TUfdK
$ld[q
-M500-iX7 R8#kфߋuܵFեcأ0vfF:Gjص)5[+^u6JS9)怽[=(3+x|[G"dؼa~Q!Ix;]@iVqPU&ethyCpqK43mȏH,A'LG@T^sbHɐkmP4,7@/E	4!У
q|4rTsj>zPB>YDSyhj72.)<"b
Eaf{zACPVaDj@)Z4I1o(9MFh̲}s$V\.uX'@LJ26	h%WLtFi15E;Tٱir.
uM Isёng1OjZ
2.:Pu0`!ykRB	"`"axXt n]aT#{\;2ylڏ</-ln ݤ(SAb֍7ͷ"RCKOτ\(gI"_n%͛`($/#؜a<NmAlɗ5ʸ=O0,VF`['bzN&Q1fW¡gM*4 ؛< 09ӻx-H
adE}cXfѪUohy?7dR8NdL}4|i
(iiє/ߤ*zow8-T`TMЮa19@b>-׾_:gy;7D,,җS2H" l>I3`}GXAj0}E<rCH2)%*F?2U"|HuĨnחɖq`g\#&ܘH.|-P_nV~+ҙ/fpYWH#G8XT∙EM^!Y?#B3G6
DGfO/{o{wy 8N"uǠBA%<QZJSilzRbpdl2V2W+D`N) RѽzM8wm9R܅tscib.ğ`|2;ÅW0scyʁg@%F/bZ=y$R*WH;QvȗLܔg6۲Yj3EE
!5_KZP´bㄨ+ԃeSиߖQZ	q BNKƈfr'i(? >3DDtf=tC&֊6"YiI<,7\-C'N
"%JeTO|cd'e(cM;ҨҧowU33zQqJr#>A
-qeDcJz*"1:%BZm+;jmQ不;EXp4.ͰCVbs1U(:=
Dd?0tTgW5Y<#DZ>K6=LVA^˛6Ǻp_?j j0	wzz|J?`OVH}ϗ*pKǅd%M5=)nE6`(V헏' -W45E!񱠐X<Q˵mND|~H;]L&b>)N'}BK') By04sdCdw|.WG.8N BF
'k6]h]u(c%jRY??-[K[gl'*ZimV}ӻJr2Bv-wG`sG+<ő5@M `i!:}H$5Fm6X`2LɥLU-:qY9Rql5ҳ{0uYނ+hôޔIGg		 Ā#yTͻɌ<F0󱮛WB3,kx%
B,C@_$æ 
}{bHOj٨]ul'f,(*s
q 35
6p.,pUbl*!Lzq[oj*-r5	 ker9XZ~Z2+\夳l-ՀwS*+G{ )(Qm\"4H}B<jPBM0B	Sn=\ݝ0ʱ\ץTEyfm>m>>r?<rߒ`u[}4/3F̘D_]^Df3ԨDbQ)\wXmVX%e'/ͪa1Z*UEeC0uӃ#sD;	?}56mz p_wt}(}82{t˦T|%`Lj-IĎuKi_1\dJi/Z@XwC{7ṷcLDXLK48cڿ`vrR۳ƭ8ؠ@Kڵ}H*HlbTdB7! W %^iNr]ZIt$=m5FV%G?U6}d_I''|iY,Aga#rAˎA}h@Ib;VҐC	\tiI~~ рQwyuP-YF~?WU`<4@`CnukBzo$҈be`} MrT`ݑ#BÈAȇxmͽ{:d؍p5$9vX8T젋@iz@5yR>f8؜N o-1mڶ܂AX}2gF?nm+2kd0-WyͶĺȤXuַZB(ʰ)r
_V7O%,&?&,1.o::ˎM'£elqEm͒[WIklgwsǨ0i;HM3X}D04^[	^g`[Ǥp}3N5V&ս5q1!5Ll1C3jhnʇ#H=pe"VxH6'5B0]&ɰf1ҋIcRc-}D1*FXci4]>s#d<Խ0Gj@Hf_zO*#b)X(*(hb9⟱$.4au+t086-4)T8W9Q=(4%+PH=oJI-ʱ f.ku/AKqbgn8 sS:yeWŘ#Ӫ,!5i{xáSlr6]Fʔ94`{dҠ~n:⯩`Dbۨu'\o3HRƼzv_+^c#q0&ٚNCOJx$jo_Ьl--Tꨮ-J=xwHܥh(uan@QpYP;W,AnS>2)yl.v4VHj3)0}YRFwt7塁1i23⹯$Νx
XUAQ=)P`~h 3$!	ީ]s؈s Z|WcsSF]EWy
Ewc_IlXRQ= ПPs}E,}X=cK6 '+qipS;Y;!BqgRywT%ƶnyɗF^CpO+s=%~k4~/{j/|~o4
pSGx@ +'LbŚDNqYSHٹ<4LI9X8լ]\IOdoRRYdHC~o9[?YDҦ[R	&Fv 'Wūi5w+:6}Q
)ؒ-JL|uS|hԊT/Xn #C e5d&.& 0Zlqr.xh\\mʚɡ.^`U/7>czV\Gat'\xCjWnu[5ueϊE/3Cd1j&EHē6K|>R#7Z½'{>d؀\
rQ_7%5Xem]G6Rqo23$9|?zH2ٞN.uH=yu+gXaub9QHL!qUv|9<rqpsbI_TñdL=v=ZN:Pt<V뎶EPI_Fi=[s_isؠ+1:
d-S&aժHhr*tfުiօOThF_	/٦I)ǒ
/F^?aUjQ<jVB(4-5å(3*rei@m *5MK_ń[	*!-2q&m9Y&),#cJطeǑ{Nn+5,4彚[wԶ.z|A jGړ@J|?M<ש*y@eXjΗ.NQǥ.wOnf{Gr?&<ٍAy`PO
DGNy|ă8'uE;T#qܺ)a[	|5p[e`*8f<Nzէd#YQWSUaӮ0d
r^+IYL
8p19Ym2DT6
8EE	a	{k4}~7ۃ3	\	5I~SD#B96:wBb%H;׳^;=&ŭ3 89(',+ͭBtYw<r1JBа(;)TLqLn;vV-lʘBzvD5Dind]N~ >5NӿTe"8aNIs=ϪYLǼ΁U+'O?s]-W{B ADT)hɉ! '"t_ȏz1kn8YAo`0c͛|2g۵	2	Ea(PUPR!Cդp_A@meZܯ%r|\ջg>	LEnz_
5&ؤhmy- 0Z6PWfL`s3C)@~	]a8-#"{󱐘%PPΗka1y0p+2Oq@./R@]7% \y8?j
 
@ճaAHOmp 	nj4^a]hz@!/56Դ МdP}.pHuڳULfM˗i(o/ӰlicW鍗TPeJfڑZͱ=>'Iw$ˈ2
$b2@J+*蠫(zTX <>^pqQ!kV+=zŪ^C~1fOIqZAbtNnXxJ(l :B0#HPsSݣ"ڧ3oA=YWd?-֫`n7'{?N3w_<s/t /_~zU}

q$m&_#dwz1QIwcٮߒl}Pd'{AjmQ?ZTt 6N.)-ϽwN[D|?:Ǜ=v4?E~7Ja'Tk}rZO^7e?P
|%of!. $rS@JzC>9|^uc#a	tb#)%%M Me!"=_Ai	kL|Lr&xo8<Qk0cgNRL迓Tt<+˟׾*eWm?ct9`m~4r7[#{huƖXzUc"ʝB4yyKȌXqk(ҫ!֎ 
}
(2E#A<l9g<uwsqSҎ`R{Ba!1-.5nQ_Tm
m3@LzOJZAaqF7A )ty:Yc+eOA@9h.T%mdk(BeDҤ!tG-#0l{&F	`F࢒ >ޡ(>t}U3^nmp4%9D:Ɂ{m>U)p?H9@h!VۯnZ"{x|9egƳϚ3 z'j{uËOǧg/Be!dos{RTG^M^Kf2ۤ崆N#6͢"P0d SQqsެ.ͽ㣣ԧo޼8]\dB߫/Pm98$,T܈4"W΁aMᱻ(<$#~7}'s.B<;uU>P`U >'j2FZ>meX6`<.JRQ*EeϢ2^hyt+s[Dҗ!	PB4(^j$ZGTYىY2SWmB=Lo02$AF_UU!'K7/x+RmYr
os&
9\rUlVMJR)Ʃd$ДD5Yأ6׬WSSeKyV_>9o.M&<f\;JDS7~9n{p47@Ag8jp}r~!vˤ̟uޏۤIO=C<1YRZHWzlZӧ|	*Z& a8_MhҶF{`=2Bz]J(C	:Fiz&b~'dx6yk@g]>@G/Kh]OGd5iZiv1/>m3M	q;DeͶr϶RUz)]C:X<&57+_jgVڬE^ hXS
)6Syy>'t]O7y<Fb цHbƇA=`Kd[EdOXq6]f*1ArB$|m$4IKQbPVc*6cXG>,&qz˦Rt_FuAP r
3yyH>l}5jEejB˶Dk0TF	U2Q%P	lL&Wj>qUU%M[_e˟-K>YнJr11q_pa)=य़AZG+Fc;NRr/s	!{LZ$
pmUb,lAc%p`kvzZWc#EFؒ{-,J<  2&'jMZfΫN.["&TE8RJߢ3tB_^w?zYO_t?I:KfE,%9vH9n%P߇&CIT4l!}*|ćѭ̖c*Σtgb kTQ(a,_-9r6H-6nD}Dp+xyԧ0!V1v\#I|l,{s,G6?JuG{A1>ƣָIoY6Ď|I9Q|L'=xMT$ۈR/cqzTЯ3@HGc1Jji7mzvznL>м6qx8CWFr1洜Zec!~m#{	OGW2@;iM\* I>j&4eTsvAmwW,
Л,i`09hRb;jRӪ)nBǔo
_quBEa	͜|G16יͧlwJ>/In\v
Jn	;Ӹ|y'tݸN+NlW ol84xySU"eּ&Z`CHf~{|1~ỻS(c{iH\405Zp*_s7߶ xd	f+ QK$HM¯/@Q:y&SLuNJA]nugBO++2lPZPT~5b4" i'&EvD0=-/-𡙻́J$3hV	snB(23
!Yb|Tc21V hZĉaBQ
w<ԋFrѬ&M]AܰYI?0ǂ\W)Ung7uC<43@B'`#sZo;j= 2xA,MʭSfn$
rB8O	(Rr	7%;\u"5^ti9] Mnɯw珱.hDQ["<;L-sCa.
Տt`uN!JY'3 R4o:/q4W9T86d6+fh +o3 ܢ_Z0
¡UFf8#5d-@V!X܍ Ձ.8*xԸC`H]D%|;I#-5Eny>6C&z`Hk[wS,qhO=ѲR{w
a/ݥ2I(zDY9AD7O46,E鞓R&¶ʿ܁Ju3Q #8u~f㪥eȉ)Z;fSj]
Ӱ^k* D
2Ô-Dr-ݢ#r?gGQŬF4d<Üp($ "%g`Dcw*&P<_sAJz;rB-kKHqJ:&nH0۸0QݏN\8p20MWT.tIj2(l]i"rE,pbhg~Ҙ=@[\&y=6JEG/R]k:2jj]~2"󶈂!Sw=F	T, &8&eeR+?u!Xh-H^4NjHsP+r1R QmjGgg=
lT]raZ.NaEڄe_pi];d0>RB0F#AM\!xP*IЎdK7>K.Tk0A_Q`-ƫJ4u)}o+rޤtt Vqz;?bug®~
2O<<5?mw/X"o#0Q8Tpg+'?l^3Fd=r|q7PsV!.w@YI紉tVc:0?5\ĘTéao(yF 뷙Jr67cfy/uLk#ZtK5BC)HN<ES);<ޛ z߅ia 1F=  ?Rԍ
U wB a֔E)c*6n(bRwE9&)mS,IĿ	Xk	(s+]ri
D(cO'/LGڋG4(ұ_G8Ec5C~:흼.0|<;F!-)\EQݖ-# q2dDv
07хϱ_9L-mWw˲6|Y>n+JUG\jfmTZ؛T.Iq MU-[Tx$;NgNPG8kJDm?}&pS084~=6J|NKI"*5lTscG\#hGAy"bhtC	sS1{";_<6a%j>n2K7KK"= ^Fwimz}u<,F9Jh	rb]҂)/?Hd$R#'6sѐ%J.tnx!ϲ`ʠCֲ=1^sD.48THόviKNBFp`F瀸Ty.l$.u{z^QlǃOݜy0| @F^U4%]a|m Ήq4g&-P^ioƓ\3ZIy;v{8ʇgٻl(}8p6
Sj汝S(D2uDWebKTSKк^J>`dG	?۾=Ruim9~1ӥMP .\hBBm]l=ُE~	rUCRb2;HjqvsrNy'>@NMYEHWY,ㄝw3(`9AǽbvDeRX11A
=cqüz"GZyny3+l"1cpM՝	 #YWN$ UZQJ^p/MUcLh5zL6ya_?|ikRZv7mP1oI%Vau%|ʖN~X~)H 9DCjdQ sy~~6Wv-foJ:rYV^Z,3^&,^
<ܠ;utHSNDwݱq06YEBX47<h-H&Hٰ8N qO2'B(Fsnb(_6$]єzNp7"T cO	AA
l=ll@j1yC17!pΛf;Y>XքfK/oLOe;_AkI0	"`Ht{vjw)76p.3}V`PlֿKlANеOuKf$&36nBޠM\rJwtZmc7@ )] YZ[#@K!യ.|V~Ew#&X`Z _-XDgy4+G$E%:qٍi+"M?U#
cؚCiZc)sB]9rp8rNWOSˌ|Y#0 2NDq%}u *]BOKSaqF	)C+a@8P;9p͢YV"4bC%TCmkU!XQs(MVs-|q1Лo}E|8[5in t\^_lΡ@r=tg-g@he?+o҅ME_czTofsVg4`Mris;
H}WU,6ays|~eN'-a 	 l#,XΆ[$f
?\DKD5I1n0dR~n$,fgfPU!BSgS~`-oKXýo.gS`2kY4Qכ=mT
]-Ӂq15 	?7"Z5A3H>*9fW .ׅƋ)&isCNSZwΠggg+ӆpOQ5EiZ|館mv'`%x5Pn(rSx yv>u0xTgmg1-Bw+G%aa$>AɨdMTp0{3nE#'>\4!4~FV%I^~-Jd<F:1+$2!RUĐ	H אMމ5Rp@Int(àl8) nZkKYRa LɜF\<Rc
B.B|r]a<>ٰcSwu[~. ҊϹ1#.>I:LJD-ւ%uݯdu]tBgCu#vW(WIPFf59L0g$%])Z+A%vͫDi?#2wWW N9Vx^d#K_`@+Ͽh};*aAC?b0[`<ƠomDszx=0{d"'wʆ7{߶Q@WXW'@ƙܴJ|I.aH?MWA荀i.ޚA fŨr5kt'g⾃/{s~9706gn\W77r1*ƈs!;;~aiv$*#c GM3
x	fGj)骁5jh) Yci
 #9/sC~kҌ{aߍGu.&S	u {xxʷ`f2<~B-۫BRW$c]hn(aL6?' &@SxBsn`@DwTH/Y^&d,{x9*|$@;-u^ҕр7Q/7^k>NZ>ób7x`zƓ|
 'g&;Ce|ׯ6g'nMs'D*:˛c!ɟl+As[Za.P\8bS`iW8҄D@xC(Ȅ1hR_oǄ}^h,8{#%kr}QZzO{`s6zk)ë)Uó	)FvShIұs(%{hÿSWtoFPddg=`O ̪!鳛o ?TkwSY!$/.}Sy1S-RE
7zCcd/,s2V}@o+VR';j@Obc.rK2ƙA]'Jl&Le6&U[Lr7'!ZqgwH0AQ^0hck18A-ȀR<eP"K&A Ko6;EznZ9%:uNx9 a5@S4ZʽA|f<mx=p"JX`[\g|Kd&kcLH{_ټΡ6oXްvxܿv1
9qejsܬaRwW
1jd
7d	q 
09ri@fHh1Z(47D=J<Ox( T1x =^񀃍(=ґ6hh5/Me p/ћ9Pd DFJHHX<Hv}c*Gl%iU@x8S#2>E'xG16Q%
XZNM5!'L8o1UMTvN6HB`kQcjKVw
um]r -: %7hdYK+Fq=Jd+PS:.W5um}=j2aqţo>ps­׎$҂0&kdĜE0w^_zl	k֡,Ͻ5kp..4XBQ/%7}6U}4Hmb>=Tyq-6XOȓO%on!rfW8퍔'*&+P(fSԚ%i3:}bՑ@ى
f$E)*j8y{8LGGe KC@Q#VW$%M5=o-rE_%lˠNE;L[bΓϐZ1@KZnp~m}덍i;[ͨM'cʤc}.-JR"m:{z:;%N)YtpOk$E%~ثb\^oiQ^pi(;O&ebu*pHN(S%1+Rq*V>DMnOE2HpJ)[a3IYAX5&}9Opu2Sq%41tFFQsYц&$`V=YJ6[Ay[It_fIY\(+.Q,=Yg$AX /+& 4b}{er(DXu0<ZK0-{`~,Dk؍R%=S,?~hxJ6ARildۮm5 ,ylpv:9mt]CM.I'3G0HЯЕa ऍ#T&P{D:~E.P-g8@v*}u:En@U.P꤇q	Z0[]4R2AgLA-FO:÷mO?]B^ַK0D	]{h1)gL+Z	_h*jѷD*vȪ\2 nKBHv}]hPČ Fwy7KȨ@`RH9$mGWS
KVn?\ @tE>cquGb62+EoHbJqy-
i݌kp2%By
=J2e 1=bzɣ4[
g?dk+BF' |	ڂtu(	RM0hx]C9:~h}gb<asN\1ar{`yV`%Z#+I9_܆sEc.i{w7(m
&|d4))zs^w;i.BۧÕQIB4lOvgQRwi	qt	V"kN,QDt˰;;2>Ժ$;dW5ج
ez,.e"$[,HO~)_g͇yՊXP`ϖ.-GR<_72&@֍o+6 e|9JlERBـg/4V&XHT{9([!C*âIDWJw,sɸ,&#{kwBY
^Ua(?
1f[{D0g:Cfn?;1,	6PXcO@E4ind̿*{J¡Zx(C`:;ʾ8A{\-5k~.$f4Y؄f``L%ݜ<E-ȃۼQ3Po029ݣJV=4xZ`Xy\EvnFoz(롘mXjl=	E3\Zsz+b"r)>$a=S+))gzT9sl3dTO,m18&;^P[>/L!Qo.5V} r Rp9mf .H?'i׎vILFxv,@ClTY# %CԠ8^R^Л:ؘ708Ľxc۔<~̗	b|2m^P~ڌzqoԆI#$7a>IDb
D֠Q-uőq0hC5ց+L#amyI 羨%wSZ}B%Mhncymomm)#\8)jfrv1{`=ٕLB}.A
p& La*
=X/K&!=a MN6kN)TLօ}k(7Ys-rdH\"I uAdxA]vhFuv!Tjgynb<GK1Փ,1Y nN<mHO&`*'Dd_UkL%|AS"}ǌEicd׋69󥳓-f,$l>gLB(\-bHUn]ȡk] #,8;rZE1TwwȏR{@fHئb9Z=B%y/{{H?$o-nC:β0vD`jJ%kD{ktez-Ko"Qb_ 2>.'յ`5E8=֘.ű<JziUNY1bBt˲`o3	mkNF=	UO<)ףj	xlۿ||mzZ5@4"F?S῝Th(5#=1۬T3X%"5"L,栘~âu<a	{
al22[$%dZ?J1/z*+ E^WiAlQ`~iJh,6$Ɯ%_SHpN x2);AW<v 9YÈ-,4q٤%Z+!}Dۇࣙs:U\w.eոҊ'gN<|?wLZ&֝'jhS'M;~9)%	B/IxV 4HlY(5sXK|	`dQtN`p$pel|Nx' W<K QhPʮ[k>Odgt j2bdᰓfAC:$gӧ)1dpީ˿5}HTR Om$;4"_sM^߆oad.6fSW)^۰U(ɫa$6I3ǎm}L`,uv{;([8OOhvj~{&=XR~mImd)~_mM?@C$|хϺL	$9HN&Zz <OvG'v"2:%c2Eitj{cⶩjH_ЀhZGAR@&ͽu_:^Cf6ʴo5x
5P;ԡmE]LEHjgw Q*\7j$t`n5%%2^(Lr%܆6)#|;*zͭ?Za>m#QRo:J][=gYӡNV{6">y^DQaq?ʂf9dvvT$PͪUE5--܃^?URD9^6 J4<q"գBJ4s-QNa-$iist08!6 EbgTX3tƿtryBN3 t^8sql_o58>889 ZWEߚKMV. c8DIQh6 8Yt3ffup@bYTiޓwaVJBE6
IX`De+^kGz%_*Pm8즦 yMV"gS\m5er1 =Uӈ[~ޜ+x!ʙt)Ĳ`ڄmk90hc8NIբ&&.yx6\sUt@Zu2)fd(7~PJ[/1kݺe.k@1cXB
rאёO龎c|j%̇Mc`x{%HWn16xFQs1+[-'Q1E|[<. "j{V>fӾG~zGޏ5}'i׫G<zܧzN?|gb
?<]i|awuX;$&W>M"=z/*v~JG6 +VՅ&uI);Lۏ(Xm2 ̍R(kAKн4[)7ђ2m"S`鄈 
S,O7.Caypt<b\"C3fވ4\y7cڇ05Lˤa[U(˅1(D\hm:	z(KT`
571rҘ+cS8D= O&/׵.FҴ2pL.!ȹ<uNJD5}O#3(2HCRQR7jj80ohď=&͵8\{};u=0	RvBZ+j<X~V9!~Y&5<#'Fgmva<;y\)@UV:lJћdg\cZgn:XRݧda-iojA:s`*ܝLKY<wބ%emǺꗾT\U<)]yf7KIE<*cflO%nQR/Yeo«8BOݖ4Kŉ*jڽYFlxXZavzmk9`=7T4N](Y#4[HbgNVvquC!- nI4bU `WwW3!h$Dbf8F3,hɻbF=k!bn(ɪagǆZ%@0uPtJtZ?ˇgI~ h!%|=OXbAd:"ѕp0ئ,JR0_9	&娘8} q' ${ё00h^phNBNy$o0~ѕϬ(<-\+xZ[o*#𒀢B7֖{ur8rQ.J~$}/V&K9*˹d	4pm(rgKnT՝hMϝ=	\U;fgfP.')(7aB94аph2%@NƑ^5k8S"'٨ GeC	gh!v\oo>cb3ghE"uq;DiQdy>!<rU	0?r)rb*h+׮cțgF,cY">A'zɲ0~}e/a8[ryD@5rcvuS'Z5/@f`٠f"Gr*h_Gxgדi03&`?MBA9}</:몫$LU ktRל+w8T
\G>X.nթeb%߾ɮ3)2e}5wuUIqfŨu1c򷢬"P=n)sk8SF޾"i7I0enb⎙H.X4. 7b}!֘~<
P+|Ɂ>"AhK;jjVʱtqԌo>9w74ZbF^bXID
p!P _0>p#)x!
瞅mC,:?䨏9ڲH!@-mp!u}NuM6͖J_ǧ//RosB?RG@,\[M]ZP>Tfe[~;ȬKRvCȚRs[H<reg7tA?;=EI	q\ľB{].qr̬]Q7w&`IfώFcR[B*Jt`l"YK>c;*uR-Swt4_Fa&EVM67tp8@RβD;"k͜NPK4!bBA79-Bkwv)V0x#FD.בQ;@;ZA艥:)Un|\HnR	4<l{R$A6.CkUcz(^]Lcy_6
6o	X>*]-}$?)U%	`mD&S[ʴ$I'(;pc"}+fcC߱5*1L9VWLݏX7"~8bYN8e7\[˅%13+0ϚWp&0jb^?y ,7徿Y1A	P`3&ЁEȈ$or`H7nb"*!fa}g&f,ϣ2kc2A\aDbv,*U#s7.]DHȬ]T0kɅO4rýBlnцsZ̭}a25lxT_`*͈t2[pjn05 }I g,M'Wh8>OHǧ)׳ǹ<jRL:QnDQ5X:#ݨc)A]Nk;.5':w:J
/%B
3+8rl B*];N{`ȶ+}:l:+w]	4HRCUE9ok<V (,48xcxgSFߦ+JWGD*!b%`pIH;́P:YĞ+BzC,1;.w5_F"j E>[ed `rW\	A`t |#"RsJ\L*K*ɬ3i[Y~Ӝ0>+Ŏ%5ʠ=摹!1hxtkITeN;TյmpQ,q^+ лZm4g.gTFmQrgeNefisظ]4UZiSLNԔ+	*$f7С4ՀYI_'[ʶÂEBqJˏv>u+Eȡ4[j(R!m8bT̀'RƎ`r-s"Na(mcZXny!ƓПߵl-jTHW]F gS `%|4
#oGc|fIDVmx;TK$41<Y$Nmb440&FkRSi	~HئioXKZ~-D.g'ԸH.kN@vK\)]I \79$kZbb:&tݞ娕dM*{	l SCfGV 9!gK0<P`dv0i@`d55Yb!包ʐCQwP $-Nc'8oQh05G>s-[kH"c؅L*xR9f<$sѷ5L갳j&p.$iAU~V|$nw%i*D25L	e'Rl|8#L9*N(xg+IuHU@#_zSHz22l8( Oޅl CcmpOЎ '{(x\Sz.3JR@]0+*+	"*)n2mChz~܍CQ>->]7X2O^'gާvq˲7 3dejlh|,O! _45o	9	\J{o].ur-7OB˯򫥆M(DOiO>gbBNPDwHHIJR\ozʄ,|GweGU>?_%T͡U"AHQV me!%j	<uo~$h: _vÌΊ;\N&'^&!SsGB+8dS@֢fG av!dddub"!jtITp|@dJ8p_W	11qgN]T}I;Q4
3@0pS DtOB7&˗Kl\)K(!/R&<0	=n79J |Wzͷg[y!֑A*p5,;6yxC+aGnk EϹRpMJGHhI"7{n6U]
C+(
\ɒn.6lnA[4`zfӧ 5烃o$T+m>tbg䭿}kh#5I-mN斩35׃B5A7(_$B0rxI.y,<n'v-Oc' T>	ND8N,zrckQ
´a<F5&V\[rtIW4H`"A:oxS,tFTeOdGY.)T0/Kq曪z&!<D0}Pj8oq5vP͗\tWHbyflIc,	Qhm$~ofՔK#aSU}ຠ{@NbbKtHBS')q<$;`X &`u5CiΆ2\618[X t6l{4sp}X!]ۘ(p4Cz13S]|{wy2z1ƮJ^8  c--FEH@B(uWSExU?`u}r?er
N:؉|Χ'OX=cO#͂^''pֻ^@%5mOÝ$rAb3IyP8/ArI砑o#N}Qh\S(,ǥG5i^;hMBU
CAGMj()/'>,gDB/\$ĳrah a} f@J15+G$SwV-s-%fkMܻF[$٠^gp{_Dh'MXěM;+x˟pǊ^+zqO<8aM$J%l;kv`$i%pČcՠ5- uBh;0z_yDеJ˭o4-UӒ<MäNi0}: %v{λBȹJeYxSZԬsY9I_^`OԔ&ZIa@ȏ0u)BG{,*aDc i65}UgQ1Hh,Hq8?pKҴ<Ic	nv@+ o4_.ng\o}Fiͣ?,đNmLJsIIWcs[]Yh*6SmzAz{=v_2CiKl"&1װ8^)WK)a2	b U"R
+8h|z(\RF*x䍩-Z6bJZK_?ZlqׄHdKUuLk|-qvCGq~ִ[MɈstWMI'cdVC(#6*R@%~ht!3$L~s}yŒ\EIV7n)aM27I|sp?[`ְXfZ<S1Uu e.[!Ny^.0){aN9a"XetMė7U춀c2CWG_2j	kK*QLP`F:-Ҝr1
h9T	& Okl/vW+N$,Nh6r@
c,{.xHQ5*$CM1iOx')QQڋ54*)q_=^-䲗үgvCx)mTaR81ȓ!Uw'VJ:
R\خSH"#hY/r'c,Qp7>/@ 	ލnR=RL9)<FV/@cQxx$6H]S|FcPY.PQl
/˰-xaFGRo`XK$؛*NZtGCoИrOHSG 6≠P<TO )Bpk)hRAm؞/a0NYG M[.qt|o%ps@p&U$h<
ߘ$SiRT)jA "%jJ%wA~L mHՔ-iߦMV-Jwvtx҇A.#V&}ӧ{t˯"ů3\Z Vl@efU"yɃ9VV?XYH#&~%\QPՏl޽3,˒!u
H;h48Q>/
Z"<1\ī_P9IoDꅵm͝D(%6ް8:4YHu;ڞL.Q`}^]ڲ~X\AlOtM7	q'{M|+Ԍ0);(*5}d`M85\,jfv:r(7dF1NU+#\Qjf/cA/q%n40ɠ1|jLTV(7+ǷnS쀐
KCr\ =X{A~!0!
$N3~._:9y!T҂r$̨kA2$(<#1t_`-6-%R
!-fb1wy^\㫟=`
ǚŷDzOx[JLF<ȃW0YlBOh."N}n2|dM$RyzAG$Bfo:\9A0xbdOH2u*[4rvB|'2ȼ8dd	(1iT0`YѲ~eئ+/0d	Bn	Ր`i0n{GmRifMчvܔW	½
-zn[F?RR=_ŻL-aCfDi7za7%Bc6j)C*nbsܢU#1".,7o9WX[lVxRZ|OBGZ%By\,ɣߕcP/Dbg6Nhnd04Me4 `wE,;!\Y!?x=8V/rdǩ~TM狕3I2$̘z."IuRmbrfXN52#5jƾ%kTmD0szqmĒ}6n3z+*s<zރ(zc\OQ_#*խ6ޜ_`U[2O5]?؁~\u&&X&l$c\_
O_s"ȧ_
DQ+q+z!}u34gq3a-ÓzlRܒcٛ:>dRt{rqwJ4	N2+.GtD>-Z~[7fZ㎫Հ,%8AW	ӹ3DbwdCJ9g҉Oi}FYDzF<^o@15o^}%>R~7t9YdVM NFa!ot1&#|owsO\m{˷	ù?|A=BFƶxD%JҀs;R
nOkRpWNݗA/\;:1(>'t+2&&4t 28\([<֠2Jhj {?C*yGц1hh %xV[XAڀ&hE<-,ju8ݐl[5?t(=;H@cOUءΏh|vG&4Nj 28\]i	Vwj eM:i0Sb@e;+jPWFHIW±ik1ɬSNճ	owGS5 i(|AF.X?J";V$)kvt/}ܿ`Ʋm(z|LA_aW1o3.GrFf1
&M5wcYwGH	,f>uhUMw:ȼ(	f'OV-ǫ5Åt([.Dh7-+p*`4dJ')R
>4!Is獡;,>M>;crJg}hS
/%1P8V@Aad?hov	d
CVo쁶Iѽ&7ǬIu/BgX)k>M@lۥY*EռA?ܒˇ{WBd˙,u5e~@L!(m 65yhadA|>B=nppcqDrdpݭWNh!͒C9U;;;k){܃l>H*t*j#EI44	Eh7-2^BƌJs]ƠuXO0%[f-cl/mlFۦ7tAl784׭bkr>oXJ/Jӏ6p𶷇&i_aluc{/#:cLzC7?mXY4QcOݟ<o}JS6q|28<:sw9n;u6b^NilS wMGt{m'޻7(?KHe?>5J˽v}"H{,A<kQ gd^a0AimQ$|^NcuOpɢxαVy<k' b^LϖQg:y?Z?87Ҿohf|}}wCv<jȂAOlڻ)Nx5-S8!`oczX]O1D^cRo7wN(\nm3J0vb*0
P-&,*C,ĴxQ{jA<KT̓n^@NΕvdHAPu/֒@]wyc;Lꮿ=Qk#vA$qye28<|p/i-	v-PkQ#u"JE0GH[s;5Ȫ:Da4
RۑQmS7ȟUp*$r&s\:RN]	#8◔]qM6l
m9eD pxfNGBŝՐ1-f%R]v_`:J^SF&D5\E`.
^׋rZdD%bƞ9~^~8oT뜸qַ>
N#Jp"
F6!FIHnB5Iooplz yu&1L U@PQb(籸[QBG3:A;fZzOB~S$n/''9j#u'IZd?IFNq[wu:oM
"/	D>A#ab娑PnuxT[ֹ~R͘=P1Ɵ7uY'?oiovcmNѢxhZz;M0'.Nsw~~1f^^EWЧ%\NUbmع $c$y;W<w-wK;ءPgtjΦ
mdtdL/7 Lw/]hJ\r\v0)k*15p[(E8jS,lejE]εpq]GϪS*`k!11
okj]QI.bqY5 MzH(4EaEtӂԀPW-мx%0z'zFQVK\Ȭ(rTg!4Bgj
h27VdjXۻRWP11-sbm&7 uҸc/;zc7/~DBϻ~788ׂWP8OvcDΨ(sh&$Nj@Sg+[R>-c`;wi
v$&IZ`etSHgԑM0\Q_lw7XF(u#mQ9/:p%0B۷wy
3gyyPxޑ1;4=RQۋ#N r7^*mrNU	QKh;|c'ij.'[L9mB*cl*	x$Z/i<ӆ
2YD@e108Jp\Ɠ@c}4j\!AFH񑄚Wi]ј>0H;7ysx503l8mN U2N%B]5'7ֳNKX;wWkP\ڙ;Me8|>E{fdeyű, _VP[fߌkFfe5Hwx#kdd\QBWZV}:gaW6 !Fw2nGzg&qG@lvW2U==,)Q7NwTT\I" H60`npwe7GY <nC1ĺ"y$<^ ]U:,dhaflc.ˆ;.*۔K`ӉK%CR]y>-E
,_;zG@V5#Z{Av-2Z<ٿWKpVW6vVxpA6lgF-sb)_vQJJjmR}	e00fRHc>4Yn0G3!.$twg-owj_P(#poO%V IЩQ0ހGr-SٝkP-.QwjgVzR3LuY^.$)DNԼ;ͼdKS5n?$*0)+4+5jrf
di. lP$YmCh'$J2!JIh@:?c9m_b_`LLp2p\\ \[)^-pxn:.v[]+Uh＋H9r+xCj2G1̚Ls]SVϰC%kaCOk
e;69U޼5pdPAɏbC@u%ayp@l#hH&kb<&FH]|s|愪S)zb8t+y/xVUФW݋/eXreeæmXqfDvPRyzMl>^s# 0Qk䞠H"0:
vX<E@i+Q.$/YPre#DJ}v4l>.duXVq4ǔ,٤xL=@4)7˅!Cbay:`aV NU&ÿ!}'04kڀ1O&[N Sb|~$ӓ4jXY!-,ÊkR.͐=zBѷoC񃣟 nѯ'ozZ|eZͯztN-DWfAЌP|഼@hQf['Z0%PX9y3˛rVBj$mn,Mdy-*PEbDZaJn.Gv&|&5U*4zģHvbc`x??siK=֏gI  <_?p͗p|(p*('1]]*_
P^}G 	-PczVqNX5y-|6RT8z؂g3ЉCi'+!/^pzJԪg?~h21$Wι([л>(2
iQR'/nlToH2Sp);2](P^rnC _IBZk?}%0C!3ft!Fj8|7Ÿ+7(T5+_C;:=c;:Tpk^DYPIQJrG wJ~Uy!AU(%T#}Oqw!
œT~uW#M)~ *ڕ}*O'+)yÝ|+%K %(+!;%r_NVZN>ZqÝLiіqs5+;[̓
>\xI~K!`/81!t"#0`fh%86v+ÒQ W	6[@PIYKYkBhm
:v'D&Utj$?]BlKߌog#~A	vq)f-?jұqy[u/mL8L4CT'D#dv-06IY_U1<*a\Kx</ٮ7OޤlRVK`%)pTSM"&`R]6&o Ee1m`aOTWgƍe5@q6bzM|Bg>{ָ{x5rVrtb`p 1{F4)R!6Pђ:.+nzF$Mz)򉜗q,r91?riB"% %_X"LѸ
ac:yMEo͜x/7^}s >f@hߺ#]Oc)0{]ܬ&!Hd$h`Fأ?5d[XGhy#,$Sɩ&.x\J/k̰ެ`p!.4?)#5n}7<E־+[q&{(K2q =Gm'+0IyKC"oSK뮕fy)ccBY$PNc5%d)1݃xwx?ݏe%#0 5ɭ[bz,:1䱁n3Vz77Kk8:S1!B2MHqd@0t.H67΋EzdS{;(CvsZR׿9tfI3mt<W	ħy]_""?t;y_bu3}8r1w|'?)-O?GU,Pn3;@_9W]{f_ΆbhB8~6mWQ+y+ld7ykD[jJ
zz;CیNAPJjQY_ʮmYcd
M}R۟BǇ{eS|濉NS{UN&MlQqaCP9'|
)@-~`{2.,?Y(熶aĩQ%%Mc``Efk\  Ǒvim={OW#h(ĸ&/vx~.m	-:%[MlQ^T 9
9Bb&P!\yuUL}	q)PH1#!ÎߨXK) Ldq&+x UƬo%Jvg_5w '8䬻t]*bwY,X`ԩ@#;ΌCE*^E|C](zQ"c^p
.N107^Sv\o%9:DYY/
5.\nr-4|cGfK8X0Bkż. yap["ovՄ1%$P;\0nnzI
Am{-%[HLd_xp'5`G\mgoZItbH+tKSSJTrY[Sݓ'{-ȕk$su^M)Yj?.O&Iiw~^]W^B:qSK0#&jiO{~	F1>d(	lZ{W6 o!cY0JV#7^iy#93lu;x-qRlY&0-<K8Y^]^18KE|S@`ĕb$kLBzca,`o|y%sd+ޤ -l{߲V=es])`oKOg=8	iQ4&0_A˗" I|@]j-%ďp-̇>u>h*w|7
(zg7;׫7myT%c܈-nr>b*HDY[Ǐ/5U%W zs^־*+ƚXYX3y]_֓RY9w{dfQ݂Qg4;'(E%S]mfEGWxf. /kW+~*OPq\s4d&Lbq29tKgPf$DsE9'@"sB"YW-WXnA.)B7?cpW5rosH)+昮q~1pZgfu}c zc
t3X8W;	`p(BK#ALg\nXVp#Vשtct_[QI>:j=LqgH(MڬqJ/e6IiK]$;FD~Wu|vLBD8eq)<=63uɌ_1;KGWT>vАVrded/X@%Xs$K_5uzI{IHzVLLj" Rs\	LgTNWWZ8`p`K.لP&*`kY۰e.~|J~0)+y)ݤ3)3'>j&E/0-LY-;{ĭ⋈Ծ=1YrQ;)FCL| #"pE{T'
iGH+? Tso{ڌF~Ǵ  \A;ǧwt&a,OK!HK( |
2c?u.WVXt4״Ҽ30Įف App}ZÂK;D⿌}M `3˫"^NIjR~vdƔJ􂲨MhfR
509PGkeep`_=pUTWdwG,G4#2I#VkH@|4U<1nM$ Jf*5G[r_Y79:ƊCnL7t3>`6ꑘMp3tWP+*Ꞙ6Q#C;Q縂hCxlQ-iAuWp3Mu`[s{fnη{h@lԱ^#yv1stfY.#yE{}}jKGTgd"!2VI\D}t=5ʩP>{`[/X{ȤYtAoD ljhjwxnms22'P`̲QോAwQ3Z/pEXHhaZ"	8b(bv=
IaVc_}baf6C"-)l>!╥҇,Q>,,l $I&2c{g}GoT7Z H@}t+iJ͒p/΋@AM@sԦhlVa'2\*\*R`ᰲXU2;!mOͭ`v;*"S2#:e$@PwuKFJ]<RwHZws GLPHXiJ{05a2(;?\6AC;]"2h1$By/>LeAq&<u:{K+@']0Mѽ q=Mp(}(i2:0ޗmMvPaD/bGR,{SKK$st O!eUmfX073*
~km0{iõl
0D@#@r}x=ikIw/a_x	Z5f|w8iodC,yqhyqAa&\:n f=#h;n|r6"Ds).sRKugt.$EѥTe3:(&spO)1Aݳ'uKM"|A5BǻȘ
E|Q,ƗwPi6k)
׵puwTAQVVX)L4e02KR_i_x]1RQ2^tqfJfuգ7:5.,NuIc 9`æ6TzWrzDK+r{ȨG7~L5#Bo(Hϥ@)sL̝Y8.bud
A"C<*rT01EPNh.įN[@k9}f+4(16#7nEtNr~hzq<ÿqjr\ן|mee:)||qGv-/uK{ͷ56 tu*nHk
t
Zn?{ yd%04CK*fw#ny(Ű'#vm#9lh/<|~g¹ǉЅB8'fns*4:I""`F΂li:3t=:.1Ԉϰm5w8|[w豀c*gcČKyU3T %{~CڌuXH6֢-3EʀM_,S cq$+8㈟
r0|>2},6х=-EP	V7H=|cAJ|.		-cס).Qݮ1`Ľ*g ]wIj}&꫁U{t2G܏ci#Lz
HƶLӛ$h#]3ĿN
#Iִ52-P>'-@0Ǆ'25~!f+j&e"_վ ^7΃
ᬔDg/O[)!9>rwc]TUkfS+bS]νPPѐJF>P.-
8CaL'mMhȅ*ceSVVsT/I/ |"BXB:&32x7:a]F_}F)59Bb68tpNwE%xb}\O|vsu~8?>.mYwBwoPp'V̀y+1FRMax+%:ZVPm;H|hvL4ϼ'hojb=ལt ,vTE1#I	8g|T5m<2NZ\8jע_gXcYPA]صz+~Ccfh @=/gXmb<=qRm(<4|i/SzA8M۬70@0윝uuQM.	P[PEp.q<aN7\(I^/q۔F1X`ʭ銣s	LDu:ֹ~*#C*j@ڂ(8IhIE}T<Lnu~Kr 	{p8$peևZSYCnnkNKU-SDn/tPo͊XaqوZQڬ`o{#Wpx(ȎM>t3lG\r
2I	࣍='oUuޜ?Njo+}]S2-|=+7qFJ CoVM:q3H8WrJ,EX *abYIrEPE~rq$Y{}I%`{ƨ}"8hzڧ٪Wu_*m_G@wc)h4^i;n[Arf.6fJ`_ _([C~ASMzG_n\~	=$ql1NYi֯Zs@";@je158ɐ/?͘JמfOs{N1lǝS4Y.+F0+Z!X zLC{.XRa	<tT;iň#4^5qWE4ΦCNӎПb@5x3zԼ4,W<Y.d\WR
.>#Z}e\8vGdEDXqK;8y
J8-DNhOF];p_[tQc^5]gG_FyS3˽>eB|1+ÐdӝK_$d&97ߝ~䐈& Ao<T;ڮuy43~§SiY{upJ'ȝM`5K hdT^oyhw۽ӑmok(7??_|"x*M㏧B	&~avI o|lp@]o*:^j%)]9q24T 3mP0J;OJw%G,Y{y}E&
mtn4I:0¼<;ZgSiIS-p!lq⫮UPzqp,f@i#DWĨT_(c]5wO95d^yWvq$էFI_c`ꊀ	5}HCBI1pQ)8e~)6D
bQz($80tÒQBٜ,g$桁О!ꋖ~	%;A w_~V5GU΃]z3f<sL=,vpzA܅VsѤ$/U	'ͳϻuP }٩C|2?wf33)1扱G{'2J6"U=!0s6h8EGʨ\-0sK:+~JZ[enSim O2	zBLF4<&~.r[`rC3ty߬)AtّV(wY"B<|B	߷:kH);
ޤɗB^DU	#2kA<wǸNBDrE6~h8}LI2[_ގ#VGT{1/bѻQ#
Q,^	DkeexK NF.0Nk'vuѻiɷ`V1
@̛/qX1|HlܯnØX-^.6醇( hlpgpv.p$IǷg/G=?D
PTv"$+P6#6$Y h:LM:_}vÕui!%ObbnZIX;'\-PM1.ط+U,c#hiy>C%Mo`=!iDq]K==oCD6E/<d86)Bb:+`;#Z:#;]@_S㶎ߠEVD<-H2nͺ,~*eQ5Q$3Z1k}RPS%{-Ή"Wcu72Xd1{|hCB{]\a>ǭB [ːH}f51XLch	o~5Jf$TXn&e=S8G{/;]5zz %:kJ[wS+lU>`{lFjЛVyDR2F) &OS_4 0(ꬭj(n n*Ik$Q-MUj:+R#PB0x|4	%PTv$~hEU	јx!VES[ؾG%ro^TR^lJ<0mf!P^Ȝ>9"cA+~ư9擅h19c.GjϞ)$ܧHΕej )	iWbQ+,_Ԯl}aNǽ{awD>kܷ)Izk8zCъd"ݫxNwWH;_DzOۉ|Ss^`-</9"Co}qCX5˥-[+mwfr瘀Zf<M<k-<xF7'Vqɸ)b
څǠ3VB;+""}6mM~fk_4E:$P`)+ZE4&R<(R^o?{{f6ldӳw62$y="U	"^9y=8^tj5KfI˛BP ,([1Q.l{_bo!] ,sP/*"M/{FM,PZt\(6	<w@ab,Dwp]ņRPf<aqHgPIk"׊TQA&{t'R|1nIbb 	. \ڑ![m+0C6,d<s*4DUb0x6Rq¡uh471Z^D9P<_itڅdyE1JRϋP!6iݝ0.Q<06 e"xѯSLaAAh6P|Ƚv#y6)+l>-u#qKAL; C
ZM?rTY/B婳(M֓	,B Acgͨ!ʡ{7A^~M	G_Zz%q	GJA}3Tԋq%Ϲ$>Ő,!J99'Gx̜yLRwܠ<$izWK,!YҴ^O2dKmjzGmI'`EsVHwv$CawM-P+bJaeLgoRވHwēCPS y[)sg`;p&G)Ɔ9\7ELbbWP+&@s)"|`SD~H#p:H06M5<E"
\ךBZ~eeVk!lDzc5$	'V#L#hydòKΗ B\Q!a#i b{^'0_V2T	υ<G5`mW. 8E~h҄yj
od'[Ltla<@I+.FZ$C4XNZC?xSt$[+273kv~m݆+2fP(FHJДErQxGLE5?Bi|pҁpۅH]0/f;NyG22j34bҡ}^
xGǲHCiYL3;e}Gl+#'%8)9UxR<:>Va8c)Cwܱh`~M;pМ]"Vʈ6"7tVY=?:8N"HpjgK%H#j,4 P9>j	XǹIãBLe|j#6%Dl`ȵ2KʦoxIT/!M>4#8m}a^@c5|z-!O_EU&U^Zu%lUh8/6X'ZX]rDY]TF*.7XWl/T/ȷ3ja1$<M\P>;~}mzq3yƘ7=79m7%C	|Xψs&Ö|=ڽo	&[_ILማhIZ5m}*j
qm(EdZ(: NSȠYwj+\nSb]B`
ɋ?)$ ilxt|8$+;{Ň-\g\#Pw	Jjַ9
<?]qsdk8яkȱzP-r@sf0o_<;u%d=MhQfFk^^kY1&5LbBPna3I[CDUkbVZ`nZ19cUDD,K+Ʈ:h	3hs9SV-Cb
#j5q	`rv9BI;a?NV%3y/y"fnyv3
BR2ͭY(h@Il`~zؗu{BUOK{7
r
ae<Y;{{~Z |jtxN
uQ:S1=gI[h5m)ګОj}O?@
!@)N 4BmQWߞ:Ѫ[rOcvg<VDGS?@69h9Z_-KNPAAj1IȆd4.%X"B%&Z/iVB.)fi`Kg37SGHb,GtLD ꗠbzd7Q;=ȅm9=ZxҎJ©L,`0iLmh:uCV;A۝VXeÐTjb(<5-oɆyP뀰vyQ,v@Cn.݀>ahjy~k)#ų `W hKlm@': OkAD:]ѥrWӔ(X#"! -(ӮgA	<ʾIԽ2tNZL"^H#)TqR>ĒӰE"uJv}~?]W;,
HD(6U1v?¾R/Ń
1@rQ
̂Sa9<i? ^Ѓ\9Ѐ{ C
%Z}ij8eW)Z#4|,!d'x|\rv>]ۚ%Z:39劺F%<H5gHDЇ"ޏd=/0G?>a*x)KcY$".+V#c#HCN	(.@Vmc+h9`:vLX_8הe0˧"H,9~iz!8"]AsDcyt@Jgikv$A.<я!ɵ關~WtD־< 0u1-Q,4bU#h(o]>v@}kA!9`|y/T]~ЙfyASA(!F?r*?|W3-Bi{Rٮs@Ƥ3h;05Q[+dQ+^yX~(L4}yj4=2T8Qj>T(_ӆwSJC)j^0_?v}|r't&L3G89cI(q(Y1xBnZ:X[[[bͫ_m99y	JJRRU7TM֟dR=sfdSLv
2WT"1l9=苫	^9ySE
0 -P~xSc;p
/~&1mbX֔tr"X\6?`eRə PXlGmfy8iYyˑ$h{=^"H YW8k	S7{K	t<benY@7gɢl$XH0Fh:FcTSO0 #&	T"iAΖ@lXRq -n4)U^-iBep.Kd	;Z]bRe`00wtXHX3ZڀZu${GDd]/ۈ1L)Tx;-5S4#m
aO9g⭽P!+0a\^~dHx#qTkD7jsKV@U͘I \UrKcgPS0S~+EA(z͒F2$9zcVHo!ˊQ`'<+wjiRr^yl9@`$2&8&8Nb^K3>gQbB2i|D1or'Kz	tX¢	A
ؔi$Q0ֱ r'ջw{|}tyg܉&(;e&<8|G]ȄC-ܵM<Ϣjߚu|B;cㅃϝJBӈzYRdkY[~rfgd9MțR!6\?GT~0`;n.0W`t}^dwzCNGZl:S46axWn䛐yPT"(7y";R\QȬ5q	Fcml 
scVK5Y"kDeUڴ6J*1J]QX{.ևeȔ1s^XrH^]k%2|t/P.^/G06M@"X]/m&eՐI pF`\y`pHP΋P]`w-(h]||^<WN8G$@.$lCDA	pdDtDy,]Yesy,Yyf[~5v2A{%$qsK+rXuƮq{#T䂬hIMiӓzTr(n1X[)&!ihb&s'/V])m#<:8&>	<{÷3)3_̇h`!7]HdGIYSG
u:	F-a&*44pY -tDFm9H;Y-bH_)?twV#da/%dRFh}=77y"TfwaoD=::8ߦ8	8~{ow,`id[C->$
!ؘ}0P-ão_ogNFw`Kg*(g?"Y]޾r0Pbxdٗ-ѽdMޜ|3<+:mJn-fN*Rp
[)8/xݟ~88z~UJkw	xSY:q>xڤ3_7WY=塲t=	BO0U )ʱHTt[k]4B|?4gFQl
[ݚclM!9i)C`Us*ᛓ.xzզ>}K$3F$1bۛ(Vj2AiKF;Hj0ȉHDs;M[fLpAb 0cH=g$'kG✟vFO=˝eŎjH )B=DJNvO:Wl\␝;J,DW8%DoO91REV&#NFydY-uëX;KH^pⲃKG2WAc0MO6b1g
C/E}E+$0o%[qOK9<<8:aoyzt?f@	Q ,qHdDDksDj/5D⠔ʇS]~`<GiAjm@?#&d	`>/81Ł~N͌)99 H4{{A>ɫoS;uKSnes5:,a%zisHeIE<:ڧtVX'5b51@Z3gшcm9k`w+욟2 ({j}p=zl{G2c%øfJ>ƻ"[b${]$3Ծpp1Q-\`:]B3BBT߯>!7cbn@,Eow`]!ERMJlIމ}eڽ|kyt!0y<9ΩAh LhH$g4#ڡ
JoYnfhd"0N§I#6MܦNS/`}nJwopcteAۻItBBM`$My:⺽c	v9~+-]Y\e 5)a)`<\7TA=D :Y2why7WY^3?kHr);[IDC	z(fnK m=[G#J#eҟq @\u
!r^%3&u3[Ǜ`9V
!1T~%| GXdbu3)=@RW1i(Gә1	QRDkvri/ZݦJO)br"Bh3{jJ5 +=kHчv"@uUƴX1وbRyj1MqfŖkĦ/^]ٶlEXBnQM%4lp3SMv(A([-%U SZn7=ݑ("qLiB\n()~5¨Pp߆0ƹl8眀7o8o]143A>.'g MKhiT<PUw*?0#@U  ,ϸk{FcbN.vEp,$ղiOF+]XfFEp-ۋקڵ  u2ٹpY639q?+x{&n=ɶZXP6^mjc+k(9υD|FG%HKd=4f&0RG+W^-eբpB}^νqrOoOƚ a|?(W`˫W"u4G\ƌ>5N>ݼ/3)jņa_>^`(Yn	A7!LWb9bV~ʳ^	PMOfaԎ:Q7Di96ŁTc3~ϗ!ǒG|A̍ 4zߗyϲb31]FH9څW=6Ԧ|ҨҤp5lm	XVOoڳֺ>I'4Dx{zwdU4
`ݣB)+$DWD/>;>9]$ru, -Nn kkT"K
 B['L &X	\7b*,
%6/#Q𚇬1ςPD_-E,*ȼ(	)iɽMD}ˍ {_@oJQ>kWN:`_vW'khU4ٝ'bO׶dᎤ͕Ũ&b12҈Mw
&ŀUZxL~4kMp)l-?לMZvyxPˑ0'i`-i^.Ez&+:k La 90SG~ٴbt>l]@%u-:6byb*T[U2V$YZ,{-Ͼ=:xs=)^ǿdm*
"@9Pw.Y=^eܠx	<xA<:AM9a\
Bۋ.m)4ż& .۞=;ҊLU"s:D]bE@Ah`/#6/k@hr[kC\}mu{ς> q-"Am'=ȗz	T\C/~I8i x)ɇc1,MvVͷ$^Z1J',1Ԩ1 S q,L)
huo<8z{I,{&Q
N݂rD1abR(,8Kr'#<n^@8*dᢜk8G[7Enm!u[ڐ!gӧkL]rXV"̨f6e|!cs-dIDOǑ~hY$xPmY1ZgCd4=-Uie0ꗖ{e8hvb;.\%cb7xʛcUěD3hb?6hiws<K쪄;n,8jQ	8[sYD-,V
#? }q2`=d 29֍硠~a1$hĔix&Vi~֥Kh)mO0M۷ypHo5z7wbJj
<fwܛJsɺ~]r1{mkBL4޺f7S{ƝCβ*ޮsZS3:C/)
K%~{7y4+_>jF,ue d~j5M[}8zQo%%AOB]: 6p0e6|lFJԲkFa_λOx-,ncn`8<D\'om9< t'	y䖐/Ul	@XT'cB'Sshh$ܕaHº}^n|cH=9U\J̔bK$Htֺ+4.P~zJ7H\}y0}''6ҽPC5}Ixk-IMP³3AU6?0-Ip3]*ق	DRB(;p_J촠umiQ-}( ABqk)V:,(.CKȄ)a=UhxEPg1T%* ɭUhv69Kp6H6
Q>՛ʣ*ҙjߖBv{(¶2=B3-Z1Ss;kD؛Ƀ@j>&\'߷wK9i ,"~-.'E 䨈Z oi'RT}!ow)\ShZ3G_|?*9XYPq}q?}ԒArPL]A|K݆ɺuջ=ƵX	%^8(t6,`I؁`E)U`y#&HV<Ԥ--xz9=0 UR <l Ճus@Z(i(>X`E%D)[W$nԥ̊3#3p ~+˽J:T4niQՏ6#F3cK
G'e9y=pn(,kఅk,ت=;<1OC$phɜraq힯r7׏a+" gd>eϘJLƩӦ(	2s*`C剩n:u}=D!ǟ,[k|ꕉiY֋?Mgy;4A_S?'1{MK<<A_&>$;0\3cKrPFjmt!
;@!Sc	)яx!
FT?G/7JZ}HEvɄ5c<y
ll:%u)+7r$5d^JսJg1?>xId}gTo5*,br!5[gVVxs5h9<ݘ67_}ݭu'r pSG庼M*ǹRQ`M:Jڳ@~~wꆞי;ۣ,_r68T`Wy_xW
#{o;F2cyZfq[\N?; I7K!^݉{CI4K"ᄛ<ڀ뉍o5з>lm>_pֿVNTɃNМkxKQ{w3{e/>Pje ?)M'G?z?8yqfybeIc8y3;A2)!uHФcnwǃK$atPt榲ߣ#>r-ElTZ2gbKa{<X4acKS`|<⢶>𱷗ַdģbo"Dї=^j1#
qWwmzi{9hKX	%
m<e&
3q A$TIF&VCgiZq}3Ak/v=kYSc3R0ٝ&Hƴ),^s}pzEd `S]20nnaTH/L)1Ja9zKI.w=AMK>4$4̭>ݒ4'9#Y%#<u['aȺ@8w{Ag_fڋjx%0tyKQHef8A{rAdj!AjNfcSZjq{~8qB9f.xPˋ
Q:p)U9w2vS!KC2qWI7˲csLpD.hMc<{p;J2@"8mwm:88<=bwHHx㗧L{<zdЉYA<ͲLB!ww7מf'~M~%`o@I'|Dq7ݩM꥛'ɜ Rs7
-|(Mc[C@^2U믥g`s474Dj^p"aBd9^ƁS5Ubjwd﹖ae3u[AT	xn;ls>ev	z20Bɋ?	R	EɡE,ŐrD2<CusϹ	LN̽!Te@΀9KI-8鐲lyNBȮKE3@w.QtM;:)q0V-OV"qp>܊أ9kd'=hHfJe#ʊ>ZKYCAyɲˤ3"/@8*N/$@r~pQ {ԛTN,#\(pSi#ke7pO!RCDW?7)aѪqs1+DdN%>R"1ء3*b$ JX*Уp}H-?;>y}Et(%6m|ւk9,l/UNzVO4^ bZ<K䶰(GЈ0D?X+'7k!a<5Z,V>Fez2P"!tP
B>]s2 %@$%40Bk\;@<6<Bl_P1O˛$h}Qe	N%9W3H;f~1`ҐP@5ErVFF:eŭ4Vզ])X0HvԜ(MD-oت@Ȧ,ѽ"_gXbԗud#p$}HⲀRPq2Qq!D75 -_/{~]B
[pW;#ȱGLo06XP.?@!PT$_5W1 ?<d{	|Y0,)68ԅ%۫zv%yaF$8m2OlBB^ΝɆ.Nǘsneժ&äP0(h	#*\6j"*i)Bv,<z)L~3ۦֱ5!rвiU
@ǵ1l<"5uL;*r(|;-xo}hm(ޯ5%,Жn_Wsndk ˯5DU7%Ŵ-dp
~5GR_q?NdkFR֖q2\z\0KVGˈtyGh4%Q&پ+s@8V*ŊA(eI,C,3 񘺥(eoA	F*w L1K,>3Q9'S2sU4`X9;EZyިWUX!{"kHRvMV޴~zk2=TblT=guxu0 {4E&Q+ (ۣ_	L{_-NIR6m~Y6W\5'!ֶã]d<{yp*e+dn43x_P 0=cv3̢0vJouyXT*{'4GMG,JR G釸^	TV,
=7'+H>{-0# Ȕ-L%3%@
b$מC{N[ϊl% ƪ%!6hHeI@wՄ>xɨx"o-N_kC\L?S9H((V2DeKxJ.:r`Lꨴ?@qD-c㶼+)J0r٤VӍ@Ё;Vvj9##!=UY)&cE$	 ߟ>" ^8@JVqV>9yyi,C?-h]rJdT&#z0LmS_2w| }q"
;2D\bV@ЅV1!S4~sWFwr}/ЏF"kQݾ#p$FKQVmE<)ZTG$ه@e*@dX˪1Kf	S&*@ߢ_:/.~q+sC$0 @"	/DJP$e: >tDcRz@zІ۲c' hGr&g2_Z缁c`prZFrPF1a0oݹޜD`.ǌT0հXtт@{<G	liF%V饌}6Ű;[m
's*4>"	)XƦꙅnp뢩o-c`Us(đ65P>p6!oK8*C|N%X&v(B&~?˟^hּ{K=ߘA'>R<3&SKy>EϞ"P^)WA:"5ZԦ"4%iB9';F`բ|='m=$W&jPL\(&$p<vecᣣGXݰ] N>uxiyTe5-љQbYIxu`m+N?;Nkwqf7MAehzw)%xw4'ݐ23Ț\9p=d#Qi1QYMEoQ=JF+GPDJ FQ!ߋ>ǰKѺ6e獆B[O}!9Z[+t|+ vOE唔EU}MwX`a}M!}\ 7E  D&nV/hCLF`v,hT{f*48Gg	oP-t_{sY7<@@ܘr3ceѪ'1C7EDnVk oV\4c!Ǉ;lwKQ|DϰÕ^e%U>o/	ft?_m)dJ:F~g|A5!qRۯ0m4MꥦWQO<}#F[j
>;xd;tbi RL|XT`3yqQV$xd=5E,?VdD!>Qچ`qM&"[9΄gc8xyNSEs˂zdU|kZ9a`+(GY%b >Ĉ4ۖ38c,I0;6z;qPI/2F~v^89ju\V \~'~
Gv=PB웝:%55̱FGMZaq;-h+{<_/x1l򢪤9D@0p4E)WfCNMzYP	H9FX%|M}$6<qV
&4uOZi,B:kZQrḅ(_Ņ*twmV+&1) aCqԄS[X.U]7M.@ߞ87-g.2wT`!JpkSsPZô6(* .kCCK3q*[3ؼdp\Sׂ:!&1 	Of_"GѬk	ጓ"vkdbqHǵ}i7%!IbDm Mrł&$bh4H美"S+m÷ih crnX )!#
S'P!1Œ{^ ۱u"61(zcR_W۾M}/I )q2
~
	}"\	EJܯߵA43o5˵[Oه#+u7M❉\0IKjUKl%0692`Yqe8_zAk3Hܵ6U˸DיA:
6ƀGig㋹A(KNO_I`HؔtBrY44H(R.rMh^"K+ĵ`>N޺ߡl|QW#(ZSK"(֟8jhpSxfΒދ(*pgmP5	cNv^ѱ7w:	_7}|v	J\7'n_#U}aP$M3Oe7
 Bg18V)a	UӌQ۠yr=-0_$X_EA65RY?thYeko}mt)t*/K}Q[|LLb*J{Gpp@J[-='Q统jAi95ߦCZk#
K7 #W)";K!̸F4vLi|]۫6owVz6Ar]QfPwm=.QTℶKAs-L;5qv{[Ǣ3~$'lV2@ "``!{b)fm*vgGf}rdx<+Q4Gt_u"Z_ q3mDpUd3:i2M3οivjXout&>Qb}Uv[V,r
$JX
rAn*>QV^HvosH_Hz.
H=%{p=u^*g!5 -<}kڶG֗|-ə4{KnrWpDj_Lا?)i8Xd8^wa@vHY)uݢ~	O2Ha(PpZ>L|T`/+|#10^ vy6m4Tt%><?+6N	=MTl9^>0)]eڱ^y.)Ջ'>0!r%24yuF"f-6BC8jdϓv͢),&w$yͰ}$TU[	pW=oߡvhM0؅\Յ8fsҍ
 (j9jrvR0O6 ^HRAYm.XAؚ'w0DS4bcCd"Tnb919wbȅcNNJ!^x«PKɪ6ᣑOASj-<:ꆉgU~@Jze/'CmŝW{ßRT:qlf>)F
1Zee.o5IբXB0 KP$c2J.mC=:T5|hyWhmѠ;q=Px-$h-J9wjN8	U2hD
LV1rH&t#@¬pB+)_רedcrW0=q^J=Г|~v;9{Y0<v~@qsS,zdϟQimWGyZ8>/;#l,Ź;cA;tAzz1/Z04t
}XRP-=ܽhG(:_}곡_:i!HЬRhFt:9DEܓ	H&S=aZJ|Pl6סFi06J&z7R19ӳ}a=0-ܭGPo[ ~p|E@Mq%`XhL=v3]}cVR=/O4P!lm}&ݳ-ʝkH/!$yJi37'z6 Nqn??wqKst*8Ev(<+ p]"nb/vww^;nA&>ױ%Qjz@5[/tCħ+ElUt@y`T]@%hN=viۜp,nFftLrbd7*E(ڨh3Z.!I+: Xgsټ8DCwlImH6U6z'ViGhWqSEXf@{ۊ$9R|_8eBl5rgC6-2i4/f+UKx-/^ZC(s
CtY 8UFxj|~\3dg6ŀ8hh⬾,\-bW#w8<b	u%BVeRB,._@6k+.XzDȂvBzl \ؽ"-Ov+@>(M5(K,cp1K"$4Y
t^\S&YLC+b^νcD	R	&vV+)-#LF$׎bT:T@+b^)2Hi.󦚐LqIPܚ֔o生,׀<AMA[UV6 ͧnV|`do۳ÃDh-xv6ϖ-gd𻾐ō*[Y<:ոr3ǿ8{K?3HڄƑJy#yZ[2JPMܨx4q ]'(UPg,JR͊s*Н2w?^BQ&#T?ޗTO<3<y^V`}-fS|$'V^bn[	0 WG8;:q'IUi'	w좀mOVeRa(u$1okF_мEHٶ<ԠùCqMi/9iJ'd'3ȍ9_񧟴YG3ZWWF Sa}@<0LUr-G" ű֟V+鋣8o^_ +Mzdeqx/^C8	~6ct]|]Q zU߶Fɜu"ɕ
0`ӢjdC"[!LdA"`{֜]V%݆c,2|XΊgm~ҚQ .=Lʫ׶0'$ATB1h/</fp@M-`9mV@<1@S??Id]W{X|i}8iwh[>Ċ{^shz.:`DԼ_Ƨ$3>LNr³ob"x~ L8T4/`ǼK!s'aAtŻ5x&jw/~c#nu"b<؎fg6sf|]S3=Aq$ڲ9쨼+Ii~PR|SirqY<&d'\A)J2hP}W }_TpͪXrD;x+U&ll%R=#*すuq	@t')p3+N=/]?mm967xv&2sHޞ2KH/6B`NϏ25)Z"	m;@N e
%!Att#$1G;>:yiQ%8rޖ^y4=Z.^
g
[BqO[4-b]тt`qǻ{n z ם;og^
fׄD>w)݆;U-Ta8G˗bFsr-/iWa$ɂm,ܒwدAEbaYfw;|aX\!qe  ,fhM_cK%jJtqjh4u(&a1^neee ?;MctC:	 byQ 2$]0LؼG\ xp`lh<hŘTAԼ}\2Z>!/:l"CQ()vfH+AQ$mF<䓾LŃ#$
Kp	t,k5@&zfR^VVUA[yUU>F7S^pQn:LEU'=
@`s99gEޜ.%	ftҤYeXæ ΃M-2r)¥e|Їy2Kr5{nA_#@O`0Bu75:/Y*0eY[i~{xv\K&ܡxպ^Wp`9<.!0 ]С C.%I|uP޾I=^z'E8)[5bJ
+YvK%L̀BmqYO<q.&!(5p2ؤZ
LihXqb܋o?Al8JY@M'uRf=
ߗQE)cC1'oV=1alVxm(&,*dԊTpn9(ʦv5Jċv@^E;Kw2`n53wd_=m`χ*O)3TSlm6$L=j}TXߊeZTO!QC:P_2GB `p	0gmFTsv亗)ҽ&Jc4<wV74ZEwxwAsF:UVѻJUݛyx"E~GgC<a a|ԽnwqYdω7jmP̅8c1즪#V2'"m˃W"avC+(;y*]`]KNV]LH)6$t䲾H	)1sMMK`i,~S_X_DԹ0z1q`[̂1/z!xР b[+{C#3X_M@*lT|_aXM5sDen|,=/Б=^Wqea=7pN¯+*2(g2yyGp.NGkt}GMrxZOR(Eu7-!o [,	mX־}d"@x\i|XZuRkIxtiڥ֔V**|&EB25n4?wo⍏˓lNI-&2|nQF}a#t"B<8~:Ɇ7;9D9z^w8hnGD#'@ª,Vnv(˥X6JQPu8Bc\;b1+0Hm֚%9c	ݘ,p܀Fnine nH" &}WT2Q	t΢z ImH&%ULVv9CM1^佶s$OkfnY\#CτyA9¯]n[#GͳãG?A7h0Rr)mo&dnPR<}1ZReOv=_e<ʼ2 :g1hK˷_b\rԕ˴7q@x%ZRB{6]M S?>9}ln5eT   {_NTْښkmJv;vGD쏫,#^OCKB%E-K#:{B,Uh侤8o%"[Mv~3.7AT˳fg7PC@ySlYu)#<|6*'7#l_?P6h`Aw+(tduQ-PyF]F3܌!͵aHSM[#ChȤȕ埍YQ],.L@C`?[!*#WKvnN	WdgKѕY%<(5QƇ4!2H4 8*gyyx'H:̞;%Hvʤ/MW𪢂1vu)R2ZgX}d,+n@7`jr/Ј~N P~4qT CэC8jư썙5R E`׵[I]&)f$3
sj#A+`Ωsx$ON{ӡ	~Qn"?J}gZN#<I}R	"H]bX³D"aIG:yMEX.P6-A׈
	u0#W`Ecޗ+0J4yK<ڦR{ |±&n&w\|MX3¦ه-
r:X%%sy(4._1w5&j{(ao)>D}z|gMLvN]5rQc|g!))ծQ&MR
F4DrP`E0I= m1)04>.)T=yz=rŵ]qg}4tˀ?`A!$%5	eZD9!5[f+*ՠSHA:	Ʀ6My7(cácpr|xݹO4kȧ7TӞȻ{w^ݥYems,誓Q0%&a`'/o՚!\Rr@Ұ|rgvt&
|QZjocR*y7mgZN'TĲ3hRA<H#FIȾ][\.aga2PnXec@hYzF®^hICiLj<lw@]DcM$rQ9uFꎥ~hybD\l
ґEbVOlES/(vHsF:>SW_ YͻdvUg]SorS)na.TLս;o <iZ#TBN.SM'֭3K/<xQdށX:%6oTvƕl[|b
a--Fe-o5KJs#,XHoo#aqDm8)vVD,Hl'őD21吗HQ۰F {͝a[4#2Uӂ(-F/,;bE/b~_=k{#C8(5 -P-Kd+,X6Pv,?Wx񖤨DiPBВ0
: .U顇_KJ'M0=$ΠzHB C+)U~PVq.յ4h	'4fOt<]̍oF(!21i%K14%*ZR#ׄ?7Dt%G(4ril-OԈp{Sd3ͩk4΃])zP;be	`aa&udV3iZԴcNQW3kgڊvjn8q#U>v`*V i?^%ZdUp~RF77+7a>3"~8&ɔmoP
HQ[G7OR#׷O-&#[G7DWֹ Y?OO#qסUu5g@zt!'R$0vвGpH#iBO2!w+{܆MoտI}PBSS~IlKFVP+헷_QdH;(lXZǨH۹{}lpE*/}KyfŸƻ)a:_7u㈰$ިem|dgo뫭謓AEH"Ǟd-"TA,>	s\76HqkY&<ֳ1|lJC[=GYƬp@*Lwn3̓EBa>o[mF(&>A]PMsT5AKLDHȝ=iKTEsSCvZFD(.H#I5	*$(,·d\Dc=}цS&k6p+K[2>fI{uz^cѬg?h ~5R2h2o. AZV>U^U|$tR`lqS1 F}՜Tv"u|~YǎKdb5m+JjަBd4?eW*ͭgsT8F3q\m2ͨS'xH*o+7Պ%yD	
֍˞?(e1 1TWݦ#{Lp2n@-;a&mms%(6&5r 8	<\ج4g`r00YTXV  Cq'|xOx^4&8}]ExPt'g(v8b[±y͇%o;*2!Ւ>-r5SɄoB
'`MJC* C7c>G1#kdk2XwR?SPDe9q;kˊؖ&d=فD꠷'ƘB:v|j&c7mT#qC[IM]chquv^:eXgWn"	uHz"W۔|KTVCY:;
?ÿBd ֡6bȴi!FBmj	`hpvA`1^W<t܍[ld󀋵>ëmn\7I4$浑T׵=*49<s5[bpGs$Qq󄸈!SlĎRED7XX}u;0azǻ'gn5[CB\-M1gW̗p6tEH>hOyw]7-#H_nt\ #<4jc[`A阨D@n`9(>$Ř^Y_n?&귟)g}gsNpR<kհ%78G0ʍJqd٤}5#LtԻ4eF
ij	ᔙ4?/eP#>V[;YWN#Vs	
Ĕ<	9}j9E&r0~'IЁM8FF̛܉JIk_FTygv7Yf_mxl^\ʇIҋUaPVAtjڏn'1BrZ>~IAOLZy,ZkpRȭF G)>ɐ&QF=E=$buFDj:g!\Nj1e">G	oGESV.vz{ֹEOĪFi	L=	LợH;@	oF!Q9?[Ώ\w#qv`!f<w˙f#Ƀ4ݶ˫NVykCW(s,=j`߆,]#k?H=!ݘ]xAo_3U;ˬU^` i>zOqp Z(8/Xl2:76Jt$xa:d(lݏ|G[F+[|`|Jhyd%Y+P9-T3DjÐ#hd-Ues0b
V୅Aocdlo{0MjQOzӵ`V͂If^8=g_?<C'%EX!l1Fq/8GVlD*!}T$TYzT[Cc+Z	XHD8w1hPӠ pwP쁏cw7-/{}wۡ{2E\ۧx&w4W*AxT᫟t{=N{Bi:GE[{48K#crFTUGi?[7[[[ml작[bkR|}@A^6=*
@H{E 	dInSԉ@ ˅u)N}WWṮ̌d*+vMvxGi፧K%YL$Pno<h!7i\~8%PE_h	CO:4&gј=EIX5#uB.~ACK{#c~~RRiIP@<Bq{PƱU`DG,!^mm=N88@?EȰAqy`@[>T7qks䓜DXgЄj,EUM򿷞O9Kd!H=woa8l^3<sD5f`nfo&p_\̗,-6P&d+-Ĺ2Vge>V%_ U#ȹv:"MZjﱩ1U$Ldjs)ǹ&M"Gg	:Q?uTWPvb񧬨+L@C	TQbxDj*,m,`FF+vfr=VY0x#.@,i>AIl^ 'ҡ7]AE F>J
o	{<ϏeXkUV6 |jN%c竴>#ԊnDdkS-l!Hz=KV
gccyǳ|j$
n^7ykY*B7|MB$<(/hQILa+ W8E@Ry
B@h-τ|Fռ)9bFzs"k\'FuQrI/iD~~]V^8Ԩr'~rڀ)ǝzTh̩Z"2|=kcFKedv膨4SX7*]-aiHM
Οcd$ y-9	,>Ly0e},|hfe^Bu7r~mXլճhSGNj>tC͔ c{A G]9>H{V{C
0J9 tEJ&pJNm<gf(0Wpj^t*ePepL{E;0r	QR9@%|q)${RBp
 T!Y1dQ$#@D*]&akFוI JksD	MV'h$rFՎR^80mUJGRlrSM}}z
y	ғee
p0sr)lVq'T?	|;I.uWw^{1ƒ:eKn-KX qŕxE 4|դ䛸jvNn'$|;+m|ìNő_
N.k}WQ8g˔ԊS Ήs-Ee&D\|ck$lIs7ii{[]?ɌGE_\`.cXL;Zп/~D^$xnGen^c^}FItSZ䰠Ò0%Lal+[n{V 14w5SbJ)6`;%Wyu@zL/D׍_]Լ*3Vne	e>Ǻ1Z
wN򸤔>pKULq'/Ax	O5Td*skƛĩJWT(S8.jޗ <?xV32sUE6ɺC0t-Ǽ-zF5Tߝ{B_cOJc0{^㵌DkL4i!iܣ{#k[VHFO&w!MPzH){3V25X]+F+}2 +wdYtW	 dMySMCCl)JMn7~Q}ٰ,,~0 3}c).L{-+ǲ}h-)BBZEö@7U8Rgj`",/TB~"1-\\}F}Z~J>!jc$o@|SLP
ޚJ;[G{><9x~UDkޢC"N\	f)e|hݢ8D^r-GpĞ侣ǕH2u#|ܐhףM`zZpum;B#ibc BH*䞍A֕0{+J{'$$(#vPq,-Rsn.rmV1NJW`EoTQ>OxM~~i s}m3ҽC(
}wS{g'{z9L(G||lE*;E7t.\B34z?AsSF* Mk[^V#gF2J* (jIzzY4:4D|3+Sv>R%UC9/Qffl\$FG3&2JZT{
<wd$g+вn!V@2jΌ#DAˍCC:HT9)*0-׷]*.CD@Ula}WPʽLk%pHZ	"[qB	nxq$UG5c%S$܍ik0L}&_0-".llA_*㻚	H\{R$]V[n?l-FCs}wK}"97V9f]GP`5˂&5.|]|e˫+խ]%;@xL8^F9PYDiq78р`z 캀t?Q. mv++hkW&q[}b"T.STS[%$8Z\+wbTC`W'C9o3XZ,3U7:~\	v^On*gA!w,EH)1tG0_4&E4@kM=w:8:Ay~A{v5UI{Zܜ;-)/Xկ&&K8_KMSVT /Z"Ҥz\˂kԕܐV˪Mʶ ˸JR5
ubf
q ĒcGΊkn	/jcVL_y7P >Xk{|5Է׮/3hm7R͔pqVcy7$(cvHo_?	v:4.umm(VIL{ͷw"|ByD1'=y;	2<`2Df[Y
,<B|+Zǭ3VU#?s6wgn. fK!o`)2*][E%4?rؒm+1brW1>.i}jl/^"/򲒧z	n⇑Ķ%4$QuJpZNyG,$@k9h!Zx*pOZۂ4{	*n187dr	\&8o'lFI{<f^D3/'M	/UΪe	muY>=7RSEr%n9!XB=z	)) 
1сp,EBPVJIG1pKRpz@(\珋_GHG/`)RV-ڕcpQ%"g xQo^Pxw_Bpa<GhD;S8Ms!-fJ=J<2f}4X3/I.?,apϡIŗW^DQE7#N,ƼafHᣞluUlwOjt6¼zPH1h#8a.J+]˄>Hܧ	%XQB<5'~>G.@VCpB_c SArI7M-L|ƨUeHFRֆsB7~%Gas4]uEJ3	n'YwvMHboh˸cz1v;|`R8~~jfe4Pu}wdTo0'Re.U'44%aNM*-6C?Lhkk=_b%fpaTP%R)I!o_,VT"4CΊUرpYM UVPjx{Y2d=j&W8T]1fDeka0p˕R6ʖIdk{h@$tJ.^\ _~DIڠܯcN[`xT0=ni$Џ{VQpCu$ú(gh&[u31h Vk^'-ƆMȁ*\
'6Rڬz^n̅qF8}գJߔ _}B,3C>}1.A!3h%e0Uoڈ7ιL{r긣vSY[j^SK#.c{t}kGU># +_tA$y17ο
tݸNrdT":Ia#>)@T'H[b-޼f",GٍZtM&l\jL/ꊲ_Re}a%cQLCM@/(VJ%ʫ"6ܖW|@Otwz{/hAGw ٧ )Pd}@KBvw.9M\Q.!IRi\buË+5՘*B
3gVt 'n]Q%!{IK^B\_ejXNM9&+ƴQ,`leݣ+2]Xx(bN2A6r[.y#@#lJRgHkS+3/Ud ;'.5`*-F#еjЭ:~ppGԾ&QVӥ[jV,z!jHY/Q0oMG4CfrfA@Bo,KG0C ll!6A8FF7Ȏ܄368qhb552\Swmɋ7ϹUEfV-Q3:X!y{op6`T x4Cy+J.&Ñ'_~TZOh CPS>LEr;UxD]V9)&kp@U%ĀFћ{d"riqH#Cfkq;aZc!]oxᑏTF(~Mzf+f>uu 7O/@0{fwGLWTyyE)6:Nc mK4rAiLd%ixGjqKDp6iwjo?Qj3w%Zj;.5+NXqT̟"`nbdF"ǁW鷞s~wIݑ:NIO_9?9o`'Q6T@}M$DTAӈ'Eu΁\
PtbD°7oDKpS4uJ'WD!g}1uLPPB~P	}[]"/ɫ6Wrxg ˲)8m>v%1+!$F\g\*bwf
AֳGI{a󣂆JlH͵І_0>mA>i#!<G5-yxF&m9T8m?ͪ r~n&a{yvԦѿ/D
(
+̖=E`+=(B10d,0h$VWT]:ZVy,Zl<p98U5v=Ydu]¹pၻ<VO(kUh,>`%[Pte S"5V>kJσu7!#h LPlXQ	ˎŭD#܆`iӐkQzxoQ&(%mP*%<'lF%\G^x_d=9PoHɽ%dGHO٣Qt_}zml9Ulڝ/뫍-mƖޭxXoZb3YTh)H46s

)d@(C-xNQ*cVWWЄdAPt>rudwyp}mru jԍP$m |&+KUU rC_Rh-of(Qֈ9oqR~iQDt1LF>:
tS.W@sNXIMUTVM[iI"V7'w%F&=$f^XD5McK8T(I"ձlchu`v]p]q;⪋b=C
uYv5|!hC'VbdbJ!b]9S/YtY`Mf ԖQn
fn28
Og2-"~{׉VPjHvMTj}F+Ze%S.ѕdoA2C  WY
	\5"_ϙ`w#?Z)!
Ir:Z:m֍įTOH"ud\W.BE9͈kkAlL>w&ޗuǆkwnJOd	Gcdukbm멥''by>rw;X;M$ RG_#)=-)w?_|LV01:J<`g$V*&`8lt=.^+Y^6تBۗɸ8+r4>[		q<wrN)2/OSX,l7xPpחaq
]+,qvpTO4".u +ww=9H&&OHfJ--w0̄HQ.8raBa'
܃
w0,,P&m &JSBoJD)piN'ۯxFaN[`^y6m\/HJ8Y=f#O&TBkj+5,vQtGx(a\JyENڅ(lcrH-<YxspҰ|`J<kGɐȂ8@ql	cHs-nʾfIWFI`u[=B{ @ ?ֱ5	(.|OVnTv+!H\pfj*BjjfsVgvţAn-	|k+sRׁ{%~՛QG>U?f6Fע]X;		)	=4dRTg%5 xehn n/hBE>(?lqWv=5~x{OFAŽS /_ᛴ|.襎, 4%2*l7wG&\>4*둔;iږXأT
_~3,."7lLLޠFO1l6^i63UbbOEU<djt ȩL&Lj/Zj4l5LDcUi3Z7\UhtEG,f1%Q|@^{	'vzъ
q2|C-Yk{V-L,iэ8lgm_uYu"w~X3}ǉfIR	/
q;G6|;y+6Ph]ur;A^z'P_v-Dh2z""AZ(CNR ˊ߂kZeAY
7s߷^*Q<1hi/_7!%	v;%)~zć@_Ii&naqaqG&׫J`r7^hn>t-{	F~peh+ɂɭX#@E'd27KixǑA ޥAf@АVTOqׇ(C_ <(ksz]N̯ Ɣӑ`d_8C 5~댞f2$Mʋ~5|UAegKHnJӁAc&JhZZb RGf hG	CU{cjHAtYfX",5zjQIW5s\d
CILEx4|apS<Hpb԰h1be~KW$eN̈<Gגܒ<pLL)qX%(IdXeİL		q%K'-ִ
}_y8MPGۺ<uYcq6ɛx&WafT9SDڨB: IHn,B!T6sT/ti߮&wJ%
	Pa]<*KIHQ0=i^HC\+YÊ|Ag)HU}_v$s.~q%u^
f|iٌ!W=*3N<&>+Z/rjtw~ױA}/e\дB,1S͍2IԬe3i,
0Hx!0lUu }+=A>T"=W |~zF岢1֗]1 zf(xE3]ʹ|e+}yvSd!xJ'\ wx\˱V5@ {	1Q]옎e-h=9\/Ibrjs_laDKke}Qr)Ͳ"$NkPT˦PAd=2X#/	%Mw>FH]6eU
sr5R1p7D]i:5(I/qP/֒:yӬ1wsn7Z$M|7LoL7Υ>)aYuΟe_w2%[{/(՝o`Á,l)MB@4JI$9x>ڢ[I
?Yk &Zb$*ݣ$6=&9mWt-C[&<SD$r=.¶0+}>?NzxP[ 9/n.s
%^6+P88u[G_1}FOD	{e*@!nk[W!Id3i@Uf~ax%3?x*  1BJA_9-yU"swEwb"Up:eWX/0|TJ&QL( BaP[}{e0y.ww]*rj[!ĉ~\n]S{JuEJgbmq@w|8 `E`YLexM{h^#6'OAc},L_|7r(,KlYA%L!yA.WeĬ:gS]5Є6n!86۴&b9tc@`<f/5wO1pcSerV8o2JP|7\):sg	L/p}K1tfIU],]c^kEa"}P)%7CHi:KK7"Ahba+30"_@5(~ra̤k+0t=y	<3|0ȟXc⍗;vv>[G-|?.tOrO$o}~Lwlc }THZWSw#V`>im:/cH.i)VaU$Kc+H8ւ(tyrh5w.,0ST5_zw1S+ _S'ai==O!O1&g/`!TqLijH+ߚx~N#Ew9j'JRݗڂפ֜91k۳3%逊I6nܩA&!+IdKqb&?9;#:hN|}&)ES92۰ۄ2J`etaKt6MyEfGw3p /9Ɠe	h)L+m{z@7hvy'wiHN4K$}izH e5kh9r3{9QhpPL',px]:yaYè.K&
Ptzeޗ
)TÒ=^"28l!E_,S
Sr
ggl~~O?}r;8303aH>d`Qtlj޼YqCL֣/ݼo//d
}~ϣTvņV'~CqM^BDE]+޾/g3n0|_T`p_4m1:%(﷗4v΅lpAh@zj_a3{Z˝%4hwR3%`scܑ'g})g%`ٸ3G@;txRO u`@dDeՃp|Zf;oO^go~{9/sslЉud9?1L4Ч%&Dy~	KE߿p'pN|$ߓ^6N߃*:B:>)AP##e&0# j՜hG>@f'[<ЕlK.m/fH}HגǈvG5>U2wޞ6fAэ-mpK2/(=mEEn
oΟ<YOv6}~EH뷓t+᥄k)sݸ+ȆDt̓z {@QG}cx	9Cc8ӽQ3R41,5'<x8]eR ӏE?m6y<+C󂌹:n!ߎҫu&GOS`@a,M_PKǝA/Qx8MS(T
05 NHޚI$)>dL%$Y*G0#e_𾓉r\bqCKHx%1>Zsj)	u0Xe,SL$o]f<)X˥Si;ԭʁZXtOXf-D#5H١ְ\lèBORF17GIѩy`n 3L;m<*NmDs|s$R pkYe!͌>4e@2o
كҋ#2='~؉h=xؘbQ1'N <rh#aCs	 Q^gx?< :q4:zuDS[kT(p!Nt	2|rj
f;]S.\5?F7	t=T^|v߶j
qJ=ׇ4u˽MR;qGZAVP!t4î?Iu
e@lE\|͝9x!%y1ǘ1AvŹnѺ\oqbX;k2;z<#!̣$xdfnNL",IWGQk
=ەol%pd'm>6r<GVV_M/dzqu4Rzsvlfmss3{q颥	]M|}2Q'Zpm7}<ذ89"
-4\@P3#
&_5}+vRhzM̲!-QP:QtIyۦ#1Gk|X튏z$
xi9,J1&8İ=AޞN0\8;EgԴx?ss<EuCy`7A0 (l%L26aCJ_ͤ[qf,+4STCfM5.'dy-at/(Jt)&Lxy> ۭ#e~u9k.J:Qs&5oֆ!t(=&7 BIP@2I85E
j~[3is_2DionV4p]`SF ~@cPt&T!3N,wBřMo7#xɑ3g	;fk*њ	gC3]QGQ 9^+l575c.RXˈSEˑԄ-M#ZfkS"gy(C sm^ZȞ3'6&Hfb4/$KIHQ%Y/w.®͂*
Nm̊,̊Cz]q:EplYLN1^@hd[bQAz%6aɩ-;#&,<ZkHD1vo؅[roF^-+kw<G;j٣6~w_"x>{}
:̖tzQiٌ!*wHlߑ_$Ϗ)4Ⓓ-@	Fx,sccL`{:zJ:/ǯHD^.3T+~6KDb~/PyIRG,Ns>9!yg\6O|*$i}	t^AG%^[0kv[<7	胝2J)>&>6}ӭӠi n9ՠsWÇ y(]6[9Ǣ"?蒮rwp{H!tc}#)hՆIJ'>g]CCM2w33-BBBi܆G(ţDRGj0i;$&KMM1o<@["I~	+w 6slr5q夾AxF["F%erils6澜-Ři
:|
O~ɟȌV傈]$Ru~VfƿK$Fw܋m ;6VpBW[ @d`e4LE+@Ae2ڳ?ȃlYBjF˲pi>wtC1<W/iFh'Rc=1,&o++nX!?0EA$t{u |@J`]MÁ	p[H.M1)!Qs'FU㗘[Y_@u/gv;PlD<59s:rlDG8RLq a:hf#3*Doh:k2|x{ruY/gޛKz<$?ȢM&*'SA$cw~}A'mg5k]39 p >
[P% {mӜ('!MB]CrޡBh{LKC~{Fnn6ue7K?9nw?v$6dZN>ZZ Mk-ƨ0#2AOe5oPyPۍ-ڱV>D,hsW!πe1 709 ^gbha{׬:n>$g̅ԃ V2-՗eccv
0 xFm!vMDVBCTN F'P~(hAډ+C3J܉qΡҾiлUن󪬐Dݞ;bi3%ԑks#${uV랾` rNl}?{JWpXS;Yg00A($H:h3!`u!
Ufp	sFIwXa?`Hр[b\X d;]mls&Tf. /`LOr53`QX>o?DmY3pubbE¥<Irְf%N.Q9d9f[ۥlh"ҳ}:0XKU N~E	faٖϿ7Ϟ4mB3sF,ރ,aRTiSh[57)hk}x`ؼ	@LcC4152.]Y{.hKVԍTiS}Ӧ:@e,_^W>
(.9Ab߲ã{?ytt3nga˕#僖Y.QKȆ.C AK(u|wZދ4ܺS#(&lHk؏xԙ~Єn댏,%|_Ùi /	w+SHŴ'
o$d+#2+:LPa)/ĪMsX5,I]-|IGI>ac_'l")חUHl344XDK8}ɺ탵Jy\/!nѲic%io5Z2%?G2`װR04u xZm$v3ң8GčyFt0'JjxO"&Noqqg,&ZnGЃ\gPm;Q̦;E͠Vh,	OxEnlDboщNa'L݆w8ѵɍIGü-m%!0EWɕ5uH5xY@Z!Z=9]
#MeUAwDU3!d{n_?2Ccdc!h12N΋smS6"}/`Jț	ܣ00pӳbb\}8ewZ y
4z[7\J2ZNq$S5d7Wr 	n1F9_K%UN5-ݒʩ mHNk{n̆g,)|T[ESRr6dT7_mN	\,AULkʸ9nRtu,h_,2뀔$BTL230JЌ7p?6R: :1gdÖ݋p>ϋ:DumA@Hf9)K|V	b?ܰϿ~<(%-OJmPes	3\9;,ΠWIc|;^+`4ɑk7z>#%pM9Y'Pd7`q]kFv-jt@d sa&muv o|DƧNb~е=CRcܖQ;FYq\p68b5B#|z(bVK^h;sWavUI]PL0%YlVhhX'MD-0DQQ};J2chdCd?~ꊀP'%ZAm?\(<S@ڀT&,@V#+#{pqL.8|_ߐrCwT%U7g;vOvg7>Q,%w˧
N+!ga\Z\U e»$/Ud9J<rG6:?|]Nn?G6Y{_:.[ד7ԞH+Aj6 O{DJ1~-[ݕÜ`]M$3L]0RUu6si<xy1(%~!9-cѐ8FXXY%)0\*Ewz#<&	V?ec̢MEO`}!=ث;_ًUz23+"lvyqQ	6R3o"A~
#FoQv=-s"_ӁVުHY6C1(wn9F[Y1U׌VL!^eOM_=aNn:_1BsIcTێJ;)Z}.z`/;<px {uV%A>h)TkHƴO_z<U#Ϯ	yϋ5aɬpM72(W<92b zixF_E;4+c*9nD
>7J/_Gc,ARFߒOF&I@]8Rl|;qee?׏\Zp=iI#hi==@xIVVģWpTx[ICgV:Jiy"%TC7(p뷙=ѡZ{FAͿ-ϰ > x3>y~J!zUQ,^:o9\F:JhdvZg(5OH r=uzX6}0I*Bz"ShwǐCVL8E#e3c/pyעo	4F}g{L\@Ƚp9 ?[7[[[zp}qcÏ}yu?`'F![ ӻ Ý5fq$nȨ(D?R"SA)ؼϳ_WgF=c
~UN`8%B	r3ssf<By iEQt,p =ݖy8~}_7͵}^n<f](Ńja]rb_XD_gps06.Z?P?R
w|sy"2z{U E?~<|_[[K>]?~	>?lGї_l?{嗏lW%~fJd'';B h\u	ǈ]U8nB3s£q9ES Ǣg!y7&8N-s'Ih}0|rL\,ExQKn!"d֘hv, R΁wrj4z,V{ihbxSk6c9JPlm%VK{j[y.Cg\`7!hI	6 ,.TqnI.E%pe}`h+) ZIgg@3efNhͦX-Iua??ŵ(VldIIÚ1}Bct  1)4b$G02K~5YDp5WׄdB˅sHVnLvbnX6_?xoZ֋>J_Λ#@Q>aho!8x,2ɇ51Ҏ>~GSc֞M&Oܮ#po eO{u~˝q=)ǇPD8ʐM)/-7PҏϘ>75B
>Rel^M9Lc%yc;CLȽ}
ƹ{`:i=|xE$]cqkц>G0)r,<daǂX9:
'E++_<fQ"ENf-oh?TiW9RKkz|^}{zkjpX)2ʾ×w|?ZYwǫӿWhuX/WS~eku"{cQ!V?L,g?}{y뽓W֥3٣V8Y\xW)Ly!qӦb
j=>;Ƣ^>vޫ]=#g/^=;2}32{>>z|hgQdVo^~|Og?so>[F}-J/tZwK]X>m'Howζߜ?A3a2
*AQgn᳐`Et57aYo aVj+v	kw;c׹R7S|mз'{AПTO#&P[8->g{ǯ4nQ6#,sEg8Xybvæoo}H .D@gG_;k~珞Ez¸a0"mMp~QP9'3a?}ڧǯw΂7: :ՀÓU%ጯ\}%}=cu^>Z΋u~]7Mߓsg5;k: 3p:si9اTb~xp7wƜ0'q`,m9af\3p-R,-ӢOѕ{pJhp5ܮ-'ٙ&~]ܾCdg}; H̼L?ƳVIse yy9dQ%G_腡уdR"ӿ³XF[⬾*ՠa ,~cE4idxJ핞8g?좍)u@Dw2 o6vcx<&=@?\bO9١pΫ&\CxQxJ.7d1Zɚ6x7@P"yE9	c( E'{'h~gIr\	*siQ(qŘNEz@5 E Vɓ"Y_÷۔``;[gOW;?9]7?X0A:|_sc3_u؃? BK`P&)0y8O02ԇۦ|6&ZAk[6Ymf>-X֐}4
j3f=ff(=B;X]s"|J1#Qi0&^Y%#4ahqm-rLX<+}{G,h)lpC1lMe{9ힹ`gQU7G?A@7o3P(4a7耬j,cwl7(!M혾y	?N%ǯ Ą-6"u ⚬@RB$xhdwL9'o=	}j,ٓfYh	Ko	>4ۢ;SNZʯachZ	y~q(Hswa1	<閣#i6NM[O=zd<+n|#Y<}gq1,w_)|7>(ڟaOIih6Аܔ-J?K]ڤ5|oL(M9!iy3 n`]#@SN\6@vS\.ElJBL`JW 2y4
n$,CbQ qgwߟ M`$D#]NY.[??ѓ=z)WOF SOφUa7XXx^\:'1&>Wu(C\~}9,>"4z;Ǐs8v	Qwx[v_pObqC13!Z3Z 5|^D>X͍ >f8Ed^c۝'4W؇æd.#ln~u;I=d#stvI+0SͲbJ!{u'kH6xi鷺_L,rܹk{6zzl۽׻G6u_>/Ub0^n?w%| Ȳ;L3b
<2?!ng2^X4x<АFN^Y~wC=a! npܗZQ'oM)=gdH>x:7:e&ij|^<B"Eۉu
26lGK{_v+ brcm},{.y2-Vh*+H; #8
+[O!^PXK4xݤV(qDmdǫ!S5t;<wm}ָ2XSl6MSi- ApdA9֢[1XA0cɆ~~^4E!󖮵zgcasL32|	!P{S.V>3o}Fo+'2GI*(NI{1>醹>_Y>IE2AE
by&u=mmy巐its7ٌ܅YerRW]є3N~>(Č֣"=o(95DF-Zo8h`_.em7ǻ_鞈<QPx&p)`ۆ`&vtE߄.B9WP(zNڅ.auT+XrvVWg(6;m?xR> #@6CDO9B99+3;pJYoWg**)DZ{cwƟqlQ։sB,z J}bjn407H0'FOA`FCAP my(˰PKq9&3yxE/|,Q-`_|<$6^.!2lq uM=!wy1`V3! v}U`N1s$&`ż
$Ñ׀S` rH wŌ$]qQl~L66K$U#6"fsӣE|I}uJi	PEu5wW1M%}FZ35c}:B>o]DasH/j'c9),xwҒ+;N=
.wy{(ѠgBx#Xdga_hQϪ#4p=}J_OGCrS׏ǩ,ӏi?Glk
UIipb`X'ǖB
t~5r4O~fTH-IOJ3#-:NsMFh͋l۵a7Hɯ#&qoӍfY$rSQ==v}ǣh[֖@gAjh6"5[0y '41wVWNVbN~\xe{%	@'eZ >@cήeeѽ{	nB	 `w /0u7hb|IrVϮb6iY!eS=JrvfE
 4{/n$<y%-}䇄?r;֍~?&8<w7Z6ʶp7PA*qoS<*Hj C.СF G!H [)A"\Iaz_B$j,|?oSUۀ'",ӳwF Mf1ǥiF% fuK9T4[ٿeW5|E˧ӭ'oK'Ӕ=_@SwOnMqoӧcd?__:4n)7xŶ:;t`iVeݺ;R,G80HF\g{A5?r_*(MĚQْ2.	O~9B?w|;	[0L["_ǹy׆$asn`sJwl{=1Ă~-vCu6̒ޭ	zEieVT㍈Хd6Q`!>m`cxs@oFV.7/B>!X/uŔ~>XĘy=)Ux) ,rOQJ< }z;dF4!8gC
T݉:/J̄sx7#}4sG+	(Ӕ+[#]tsk0Aox0|	-_ DOOv^Hpv|}7er-.&ǁۈN\4 HnBf\T"/s4d=@G
TPT5yx(ʘh(9nDJx_{ Ca+Peh 	
7Q -5UrQ~6őJ b~8>lK~f8%gR{e+E3pc!m-o9.=.:=$MZLEs"dR@~J6> v-sՄj,Ԩ:vLr]FU.
/\.͢eK9+
GiCUU^xBqԞZ~aȢ6A(;;(0nZX<3>qIlIG]Ww~Cx1gPX/e*:n3muʍkqnY޲4)UAY$xG"'<ҋ>;"=[`c7:?ml
@*==dŊLcBb'2s@1KU㦏Mb
cQ+Ĩ.+UZ1QaLMmxZEԞ'oH,`0 =oiPjSX-M8<a3Vgk`t\]i c$ρu wK:zoC܄~lUy!"2u8ٜa`,6!SBoɱcupG͊Q"a.JTVŏV!V-sR (^Hr,cGDb7#y6XpVW(|*=b7ވH"?خDhE_Đ?k	^+e2#/GTCM|ZX NX4a^;N\)(M>)ƥ}@#q!1A5~<,nА=tAX;o~9fw|܋fzbi
D>"~z?EW౛@ j)WN_,OBA;.QZ:/A]&LW5F1_c	\0<~r-#t}W>sh#~}mMw-ƊoWaM0j~_/.d~uv0!.6omտ{oeu'*ƿQHQ?1voD1x_ިb3Ȕ'-w/K@L[QHt.4՜z[n2厰PMx?A>Z/nem8Ո MD`KGmqWT 1X<hRĄУ/U#t/ {K9i$i>중¥n74W=H܉뭃hAn'&[AjD>I*.MghvbՇm.VtQNl(bν9)Pg.Gr-~[*	g};XwFٲaF/XͫWVV}6(*RhZ pGSn
Z	yw,)N87O7<Q2S;>ptcV͡5*#DT0^?bQSWD%POXdG?
.`3 G:+:QW)hW9X C>,'AI=wJ 0
0
52qmX=9T?~W^	ڵ-9[gH+ ;qKR{PQjbGD0ԃ*oarSZh`#:(	Qz 9όtJX}=HQ>ʞ>/Rovʡ aABWdŷwM!nZ
"d\ϖWU)H Pp^[ƽ$Plt~_#gۉ$EQ5L|nW&k?Fx [eNL8	Nl"{LMP#nIi5a1hd0&	ȥ1o:OZ`BDw_fZr%k5ߎkCS\)AkG߾sퟯsmwyOߟss%}exP}-nAX3ySv9ut}!(xY6\MJ?IU;6t'N,3<@m|I nJ::Iw>nOH*IRT1R	6](XEZ J8?$^9Ziucrl!|
sQ5ɏ%lH:8Vـap1%Ø"eY%Sx*ɈW0G xHjy5G@ Cc'a~ph'_"/U1U@eql	se˥gva5d@aZA|B*q#>GSw0]QX-`%o,rl3vp@dQoLn!(HC0sP2y3!(THP |g,|9~	/lAy$1͸ޕxD(Tbgӑ"D9tּ58>bgZ*+qɴc0nq(e<km DK~8liX+ЊBsSĆF:R<L)|츼"ÜIxq=e[!7%,.R+=-)5%UdPdUBKK`BR4zĝO>8PTS;DT
1Wyqe#/m9P+e
~ןTWn5=,/"jP4s@$Ĥ^+62/=.h)? er7+H +xR'%Kft$"lcsusY|N~蓑&k;c-
KQ$(>Tmqn~7m{ t8W 8@qkPW
>bv$Lk!4L8)%xlAXLסK?eZSAQDXΑ4ȝR縪΍pqx|x^_@uqu/
;%դ8y Mhc'.TQrH#gʿOdb³thM
+Y*=
z_Um,Ĩ093ZrHӪ:n4ӄ2!8&c&wv7mI&3Ukb~=G"6jѸl)C;<?PZ,ˈ2s0Srv>'zb='I,G
0AP-lFrR-( Ƴ )V؎zUvR*/y9i6cC[`@t0{!0FA3rb(	G?|q}rJz./Z/[pr41ޭc9<>%^0Vnqqv5x!UC =jCݛIIWt?Rp*o^39LVvܧ`
} Oh:;P@gF^j4G}&C3$LPs`!	yP>zmJTt.0;5XAi-/m"ErR'%®TZůs*wb֓:ޠ9ZuM,q֦;&m0%hhO#$$gSJ)3/$M-hmF6ra$K!ld"ӔE
IC+Sb/d1J rn	/O>vG#5qDXk> /}\2pጰo.D!~-t?L`=Wvy(^+F`6xt<>G44XL1U:I1^P..ÒEVL9L$\QˀLjE|x?CV1몸L~JBרDqﵱ3V0N"$e~-YݲJ5 _BwC0avj%?2
Q?f,j7/fdaNc9|<9=H:Qݎ
J$% 'T&Fğ}8ͦl|ꎇb[bfaY0H)I9pԀ,OǾDP[+wd(UL>DƯx
3V
NJĔ|pvC9b()hʞg$8'vR-リݡLظ xНGԾouc1v9>rH]pC;/_b ,ԅ%D#g3'ܠmۆĠflzYu[_a+gi~$UfнNdWtabC_d~gQ'/gmz0Dq㿏3/BY2ybKQg~ym8YF5]4uת..M4"(:6p.90A|trC|$xMBhi#A
u~Wt
r)68i6utn2?hꅓ9LwC_ai6o m mXv̑W,Rr˖`gZtF[L;=,5lƕqk-g	d<gnMM+EX}JUUKubV_Rȵۉ<şJ4h,zy ~=YXOֲQ呀xaHսۤqY`\"pZ	0ݘ.t|WZXBFyJ۴x?ʑS6?~D5	vb"H<0[Ƅ*kZS\MFwPa;i?YF}
?Y鴬
XC%V&X Pܓ/zupjI_F)Tbz1D0@;p(Yv?3}pX1΄D6ƀ<F5l}CҢ՘v6qox}//Av|TUHY2aS{qXN۝zpShOH鿫fSIo+dFU
Cfd|X7`04@圝Pw<di8M*;GNm?):M9쑴!<\s8s;TZWnnG#%p`̊W=SL6&ue~= na
΢ǟ?:2Z)4Qn,0=$`GIRF\YYبx8ʂm.AO&u?
IR Ì?>;8aXV,>̦(7 `闩a%V\eŧ.,0'DD&jLüQalh;㨥!'w.l\M1AMƿ<B38^#eO}>i`J7n[œ9b\^pMčۆ\TPcjpGR	oDVAZkE?t_XZ_[C)^Tkӕ_̋(9T~8n
Jw71KևgvyyH򣏅uq|*oeOP7P:XXCI%Q-aЦ_fꞥ9K7)ODk^a5X=$+,=8SS6=fi$	,WnD0D|=D 1 soت$ ̄6n}0	ŗ`_ʘ8j34U[+6&w뾄98kb(zfqDNi@򭛎{Dek l2[Ⱥ8;G#b5.Lj.G0tP1$h@׀2]f@㸄HJ}AgpF٘r{b,2YVR6!K2uW1;3MԨfzLf=Hz{?NNZp{)]oH#O,ĕHMw2#	?_\Go:|wn㭲?",[Y  O"C	)o7V6v5(әi9v9h^nkQ'pbX*MqG>̵MCט:߶݅S(?X.L5Ͱa-kӏ|
l$nQb:Jn$C"@o|%V_j:8	4GhtR2TiLWu-CuYRtVm!,.HȓۉGO4潱A%4I1ǕL߽!esF3) 8
EM_`3h[L)\K/ߖ)iCIJP҆-@IJ:Pҁ?(vk75NOkO]<R&˰"eRS?4yE6qs8ƾ+faZb$עe9$G{KY}D
{AR`,o1A0]Pua~-lWPw?\u/p4\u5u}ݟ|_gpT#翩F#`SM5[n[n[j}l4|l4<zUJ+ἔ>~SoUoʘ܋-cW	 z0>u*C)׀6-	nPiJ	mI,&nB)׀6῭M)ݢ-(&%8?xjx.[QfJGӮMU#i7Lɖ*Q7MIKPBtLDK웫!zlm҆*dtXiJ7U) 	3-Udd0M?JwY/ߧT?x H<`jРA.ޤ-[ś\E6!bL5*'q}$GQ4
[$Ti͠itq|nG|# aެaYIE	Qt%_OP|t磫1]W|]_8	=.!'v1֘ۚymy`!FEB|mGXm>֘0w(60q;r`|0XE<kr(n-9@Pܜ{([sƷus,.ւM<Ll;scq>k-؄䈻scqۏZx,.YĮRĂcqsn=kX=rk X\	zo?scq3w,.#$[rOlѨM9r4bB>7Ψ-#6Xņ5'Xl=8X\p4ybmؘ{,nX\ppqc>Xܜw,־X
<kص@Xp,.b(0Xc6XlrAb/T=YۏcqsX~@rhbCM9cqKԧ59ޱX[bCnޱ)▨Qkwc6X=kX4.m-؄y1;sc~cq_lr]c1Xl|<kص@Xp,.b/{,ncqs;].HP$o?[sŭܱ@Xp,.ŒFLg2,H.EܱFellJ$bs?h}㉽5 d  IѠ](bv):
{e@rm\$u6ue^NVƚ;z):_ϛ0d-$*$T'gQ~bE6`6dW#*>&blMau8b^&Yx	d-(<<|AyLz[+Zzy6dxL>Z1"yqyԞS `|G)g=4MLQZ`'(J1ҀwGF:ub'rkXI|+;{m~\j{͡2lbNJIA!GƸVޒfO8ɢ%p]=|;[@1ԗJƴLϒT8(0N!4su<*5<`n99ި9HnjO0$}%\	ch1>c4WK=
d& 'yGlT$V+STc2ˆ&5-f(`˹#v3[-6v#YyqxN݅Pq(	hMI]0E_5<>li/AqRg}Tj9r=d-%^C=DԞ<.6JFoɞ44 ]w筐=hr;e-Y\DU`p%? k,+%ia4ysTr{zh=LihoXdDE[s0"K7_ >	,_9ןԛ}-s{L,[MM/:lIx.ɂ `@Wvr;۔= <_7yz	Q/_ kKChL(MV"BQ$#t*^ŬE9&NVz!le	I߾8mJMf֯7WE9|-a%hٝ0 ,3zb\O1oHl~05l2mL{d,p[ڝj5#emDPӈ[ҜU\woOexNGv/ݣP;x 1#=l]VL)1 ģeSs:ngᅇ K^ª"~bIֆ`w,M4;wMbfAX1EUX9RLǄaŗ8KֿMAYXWC#{{>yo};u_Z/w,^0U)@ܑAP椶`DvCM.),-1թJ7Aų[S6l=|NшXuKc?:g)h%C*@ŧUZ_s ~	a`Ї@B4lW
ZzQhX{2^d$20cB,I9ai)TC`1u`p;yvg&{xH.Z?	2o45x>%X҂ga%&uD.J5%Z
A\dߤ֩ΓNj{\I+ɋJGjsQi	z=I#<c!+G*"RjtFYop|bfF	y&C/$,L79	3ĬVs7Q?^(3.`.m8umwL="yXKw\phUE*	Q4
^Ԑq>~RH.4/:.%L_&%vh`ן\0Isr/^Br/v$.ޑw8^I*{FYu"w t[7G>*lNoHثg<[lඔmU]kXI=#eMfӭ;$G`VB(]sq	R|.햵H.ؒ(=K~[x,$\ԟt{x|z:{`:~;
}(X<Yޟ/ͧ/;:odN`@fqOj7WWA,Qoy!=|=wxdO_pA5%a?//M囗6$35bU!v_"P8wH=g('/J4&Pe)?s?Z^(:߅G]	o:[[}i(PX HGv;	W8|(|/ȭi?W?J ,40,mWUHi;ǎOߜ9sZ#~0g2Yr4ңok 
'}OFlҰ=o)97CJ dVmU[+'&$ePraǚ҉46G*<$,;<=S	`+V+crL7!=ÕӽF<:Y?w	3]+(PP-iPW釣l8D蜮X-z%&sOm-[cNÌ[)j*R *y7-	=g _ ތP]8!@S	y= Yۇ~Ip9x+УclGԖ/1;|bM\Ak	Z0R}nxxlDEna٦rG/*x@MVl>NPDuop3dDeo-:#)Jx'Uȗ7XN\	vaýV{ۄc'ɼ&*_W_~Oɗ=)]b~XM7[]S+?l>= gٶ2T6VEWV6#=6􈵵:磱sBӼt{AzBAu:Xzp帜x`]RI>wY#(A;Kua[Jv7*R!QKc
WB4e<T_;zKJ"פd{x#y­FYVJ"\
KȞʿeyj(Kce
A<*Ko=j84>-=/BTG/&v{irh`f.L12L=HD;Y(h/Y^]k_u\d.hkNF55%F;N z{ [|
}Gh=e`d]wr<s>{k2N%n7ZGޕ3
x wdwq^ӶFqXUޘɅ}bl38n*GC<In8{2ԻJƎYARr65)J]D6HL$0)%Cb=(;J;Ȁ{驨t@67!>5y	;Y*ʲ^!k @X 5:Oo"V&Áw{BO/&ÒĨ@񭛑dGy))/%ϔ$|1bn P,l{oDEpwXgm( {2(J]*zXٌ\L􈴫|=T+x5̶m5ʈuR2XZkޔ'5%SlI+qϡcډѺmdxw?Cx2TB#~T; 7|_wfu!` #u3_] oehu*wٵc4aA/>扂/
@X7w;ua:gs<Y m\Sc^ :*JD3-hURR~S^嬲w!}*!;Cg;BvuZe\bv~M`;2 {(4*S@IY\F?ƍ[ptODSqcQ{44ȖϑKW
- iGoÞC+\FL0]\@_W؞=<f5b	kxJċd&k=HګPR\^KT@Uakk%&8DD _fOq?FPTKDs薓.(ol@
L:kpy9L>K/bSkNO?(`fXn_uYSb:StǯmlAA>a{f@;7i2VZ!Ǟ_P)/֝T_*Hz'}ȳ^P3&/0jǱ3 L%3\]8~afm_=0yW.o85x/_`(jFā2?IPkI}٤פ	PK14,SQ\+h^f7,={2HޡܲW0ivϺIwgkbϚ{#I*$M䙼|nY)f˻ko=ԨI8NӮL4k셼kre:Eyi^\iOW"y(-?.8֟0f2g!$?֑hGog#*? ]#<-ɗnܱD<i`9{<Dzq~uDX++a\[18ǎr1=?Tt,d(3҉Q.D jyΌF8%wlof!d&Ao#^\jDuZVdbH6vGʊn9G$5ljvJ }%ZaRe{Ѯ9):Ox	x)qh=&-;	3hܭ_>{qfQՍhYwZ'-71eԭTC\ʁչ># +m`],:WUa/:i8F\uU5U֥;+lhw`6[y獌̉hLEt<JoZIwݞw6a<*2.+t-ikt4դ^s(ɏ<ڮ=H Zs9fza솝
)VgPYѸ3 r7Rw7;te\+<XWuoq,.s5Id!b^_#=1F1B#ͦЗ0Z#9un'PNE$FS<BhxZp³܅T.c&	YE]]ec4@`$+ށP@Ke{MebP_[KEgoao`Sg>
0V{k,53@NteϽD$8=;p9Q5<mEl֧r|=MGjdL?ŵ3p4ߪxd$#5;mi |"g\+]~y^1A_Du[$/=c&DjEeD"kP4Ƌ cFzYH~KcCT"|5MvJMDQJnzCcgcCt'>`+60p+bz/+:rfc؟-gW۶
i,N#g[mYbFs@zJg:IýC^u8D	s' 2ɪJe]]+v^)%ZS1WhepI?j)= i wQs
_r
۾ú'[x0TG6ȩТ6`ۖjF9쭆Uh\^mViWP3&ԃs	s!g!*`wO-eXz{J0(~~ (mJk7^k\X_[CMVe&0nSmP-UC'ς ;Zdvk!@9r_:ǭ,[rK/?ɋ-x-/`7,oH1_0oKGn~oԌAg9nA?>eDHdߌmUoS~" GMG&	yoG5AB~5]X-mjxp8Yԃ;	F^N(-wL\(
!V©\jmɳ޸ߪiCM	s$ɉ!1 ;Ha< Y	D;G0.&m6Z?l>[p8-G*pQN&)D0$6lN_njAks< KH$?MF7jl3?J lh<UiRm6FaUD0ªԷϔ6a$IGYD=JpP2`\4h;2:uX,yX\'QLC	e 99YЦiwxr76j灌Ctȍ!aU t%%eFwskcc+o/XR0`H@M0gdv_%ק9H}uMw|X1`ʮv5 <D\##vHu48Cgs 0"pWmi<1zG9R?mힷݽW-MD&O?%kTI>%Dn7g?v%%CjRv9e}~9kjެ+SAHQN~uJϛ=1c=kOd8>jhWCf^{蛆/LdP+ոA'[$])eۥMEv?KrG{3p PL0k/7
"nP+T妙c{+vrh<*>?~NlЁ%ZzOڗF07CVz(t97jl@J `= 3P`@=8d#Fnn<ʂ5G<Gr$!Fbzt!5wH6	?D8bmfU;u'Ǚ(8	)IMFxZ6#_n6q8f.1YpܼoLnt24f.z`}ucr>=ܨsuDF L$?];~^оܸڤVǑLMA5hٷg4
+;;b`RɣrFYnLt^s5d.<dQ@p^z9)WWYA:Bk&Ykܚke6>)bǰ6gO:̽ƛ\1۷^SK</	d..rlnP6@h4z~6?Lc$7 䂢0`s'oh>S2P5Jm}vnc6MNWFWkZ$mS_PZq6)|^T+l<v^3؎TPg+(LO$ll泹/wv64!b:A-=[Ak'֔wůB O9~=aϬTjsSj82=TAUB&lZhv*ItK1px挩Ϡgm3HbzaIt'R6)щܔ"vEZVb\HeyۅhU,X-
9TKG2E68~[򋼜l.[D;`g	׉ Mj7@S%OuO:iD43)[.?OĘcs!Eox![cU+*mLb-˴lJ}0
ۢlJ|<zϷvzNX֜C3XؘVoD_j7̳	d}jit}zҺ@ȘjJ!JܴS*LOe+ҳvwB \&׀(らS+:v=8LqːK>ގp2gǱp^^c%q8Z.gGe" Sf! 2Ĥc>9.mLvGw86udSSVN^s_ xr3 pjVPېFs)Lהۦ!zټp
vޠ^"8cp]sòodˏSwɔ?A2I/3z'9bdn#GztL3%(rm;1t7cnPXX[\p=> 7\l|}wKwnu
;&MIse)>\כ}f |`oXC2Vދ#LnEmOovwS{!E[q5*KQ㗖aӎd'ƳA̗
{[S
<ް3 '$g4Hptכl2=tAQ?<wxsRq*D+:Ȯ/ݫD^+ֿ:d<Xp.ܐ'gqȯk҉
[d&ĩ#ˈm}IGL.g#:
k.'3EÈ32%qv}Ybq<` G<,¡4Z(OY6!e˥k񞰜sUݳ'~;Bv.NhH8>])=v2?0j;bV5ilHH6S+Xl6	ίZ;V|n5&3%x;9&.1YH9C灗'b6FÎJsOd.*̙ǬҿX@~W4P&h&poExp ,U&\sDfC^).XQ}vV	k4^fQ1>b2hj8f:42Wcbeo]-ebj管%:9)59cu]MW`@)-^LL;ɏ39BT3e /f[1dF<њ\7u~F=%W!NDtij[rESZWo/ *pUXz:I-(\q&=9y>H򈂗~VMo*|VR˫^xΜ
5kpPѳg	ܜb'G#XxPI@μ8^L SvzBeC81 'qНeĉxnhJwb<cd=;Cqӯ<`5,ڎQ3̣(y`Ϲt` Tp&z?YLo~L2w)+7p6'@)0w1|Ξq-H,~}^+yUҠ;Fv7(M2L\\UHZbˀ9%!7$kHJ"g&6KW[6B.7'ۙZXrOJK/HN	hm?mllJ2eRG(c	ݗn[1ڠ(LGgjRemx#v7K6lL)BE)6^"oSnJG]Gz2:/]%:߸I:$JE.pа<h_sfͬIO%Rh>?iM}7|'2+Efڂ&lfσ=X`XwyMlNƳAu>dʓj==M3Aωx1i9lLW fp٩\ǽᵄCnm!w6--Pt'gu"Jy AfK8Cb.s'7}Xݣt"EѸ@:JtNsXyw)}pf$U:9v3v9((nx SgӱQ:O('
xvt<[>9ZubLtS?o}dHO)	
Ev<yA%HEH_5CPŬrNVCJ0(Äyh"dpJ!&G|F
JdƖ|%"%ecXR2@y fgeæad6~_t{@g]X'|i^Q<{e{VVCضM|!ҝCO8-~3f)G%l؋Vhj}lc2ѥh[}峥NKlGx-煭EYr͎t~W=g2TˇWtCyNå(&ːT
e[hϟ?o6뇓qawp5|x{|Wg5Ҟ5)}ByJ.*yCpv`o%U:H$fyCT\p5# DܔU|Ȋ(1{&lR/Y'Y.Ҟ'cݬg{%QЃ'@pm~>HP&#]#	 "`3p6H$!28,]JDЊԗf|j$ժmNIu[e1XS-BDVOT<JY P7?o.%)"^aȧSa6Q0Bmuy>Ûi	Z2ҡ\H7/)a3zУ){ckd]Jvg]0$\
|~ݾf$h_.XP`G?gZԝgB8i42BEh5XltI&9uQVaC-~&J	yzu'rWg^Y5CD]L4u0æHfl}vp=y|ݞP|{8#Y\f>Ȯ'ϟ3&`/}^ߎO'
z;$43
Eqzh>p"HT]_Qd_9ķ㉷1*|3Iw@!od}ݹ&,j1?&F1ZMY(!tΕ~][虐WH*Jt?E s$uzr{Qfu:ݵgphs@.3be:-E1ꎸ^Gf&+Xʽ˕?2Y|1uzzrR:u?L{P6Q+Ry=3%zI(c`h:LX?kG~pTܳViMkdԚ}f؍4W?hƵ>pC_RS o2HS4b7dIݹu2dKvlC
1[QlW>5)L|nk*9F6.?p}&Wcu3"Ö1n/f@9ߤ	"{Cdm]r0t]<t]Ir1ge'[O7o=wF[׊˂#{V8vgL2<tt/xygX5zFez[-u`Ϙ_X$KCrk/BSΆvK4Zba],?R] -iX -o)L*\Ѝ{K340gȏ5
B ߇XzfȚ"s*G'xi[bXc5LՂ}3X"\P=Жyv;h/}薩z
{b7.S%XCd-75`m9(?.L|(k@>c7C!
)bey Wͺ0WD"_X*?߬՞dJ+-AO74^(fءI%O$H7;#O8bOjZW+IżfٗmrRUΤ))1l* =궻d]z
kAPq4Ggm&Fwn=(mНs>;hꀄXڭW9uk22.5(Z=)_!?s)|vV!]7[8d&Ay-սG쮢t[|éxtطzb#4V'ThlcʩM"r[s1~r;dKc;[rDכaU-mm|k+seSX>`jSTQ_gD~h]~MW(L3>7o!BxdUY웂-t"|]%?T~nZVw=Kt$AXdq5O?hg$)3wl<]d6ߑcܼ%(Fc.]z~Fl2Mmnm@wmV%M8TT}QE}|KF`?Bn V⽭#W>FkP.#5xO<3gV90LI6'ݲ}+EMKR]FG1֕zR:^;*86qW,?Ūsq\diN@:·.=3]L2cQ֜PxrX5U4h"]OPqn1G[1IM: or Uwna>@Rspx(u*/={ɬNVH"i,)
{9F%e	c,dxbd*XU/J5,"U)5SɋDХ!`&o[N<yX8j-Bډ(:U'Kf+D	~닣eu3SNL=!l'ڃ:xu=@sIm
Qm>M}z8Xyqr73-//}H3h/9h/OOGf=-hz}mKӞqt۬fhWHN9Hk4y^-;3 
4(j1!@%`Nw_"E&8,ǓCچ_gcҲ;PO!j8X` \×uCt?9hZշaaDʟ?U/ӺxN`vh`I<!o"	Ӭn>VoA<m%fkOmaMCح`iwԣG%L`PZ#!4P5b?ݸO!C wF!bKh6Q:}ce(9\B^hb{p4HDYƁ
-ٳýtAQZAW=Is8
9`R&[n>Y\A֢\?d-v\MR4߸( u!,a=jtmfid''Cve1Odmf W<[+-3rr8E8K^xX0pB#ږ>Fǝ=a=3'~-Z-Q(Ē2 jnɦFRx/%kmGkk8a!ܮ!Y009hCWtMC]}/ހzd={B`!pJLT02ӡ0o)o'2 F|{JJ{n#	B>Lv:Դag\x^74ȃ*4bC]}iyҽZ:s<fY6  iLq`-2emoƲS|#C
1Q:ɩlJe/L$SFZxïtp.wmB]Tp<,;6ffC%viī;GhBQ|yU`LNv>Q]O~& 7mP6*pT{H
'&5l^y4 $NhH𮸯jpX+j{닆_oҼ#z769oЖpy9S//4+?~ac!  (%M@=&[nn~Ue*BWhKyy1/ޘ xv?*LA &PcGe8:CU^%krqAa}9?5;fLh7.*]k?b8.cc&_ױai6'RM#Tq*SV9\2|~#fA9e"!\zbIIkӬRp8T`W]P`Io+ O
ş!!m26:gdG47e׳Ȕ\o']il}._;E0Wu6hoGK/ɳ)!xDٸ bFdT[XG@Fpja(adS28uyb$)^HױoԠJ&DZڕ.t8/@1er y41Zl]	i9?EGz$P׶9=޲|AybP^j}ވԞ@JuU~;5"ڒ~+y;r {!<ԢA8S<öW{+-ݧ܏eśӦ:7',ZLؕirT:mUH'&M/77]Kĳĕ)DyL߬te's^?kRc@qOhDY^'J
\Ig\tz/?_қG竤?zhZ,|gAYzAq^\@-wd)dӣeЍ
?C범|:c?0AZUMnݾڋ<<.u` pΌxs+YӟiKy>߽$fh\15h;M;_-Qy_?_uFqF\cFCX\0>5	,ûlR_8zWk+te.&_͞HWzGbvV߻%epT-ʘ5ߘ~1"GxwɒPc{Zo:(ƟH@#O%9^یU5=`6{Y~H^!	5/ߎkt(1S2BӋ
EC8}_0LGAQ^6j*j҆GacrLg(J;f6ʎtVʋOY	պkl⯲6(tC;HH-.Ny͛Ouw4(EѺ4Qf]Kbv]SA:ͺBձ39!c:&i,V3Ξ1M )qv%3vvL/1ȞCPe%U W~_\4"(?܆X'0Oo!I;YɈ@'Tի2K>͸z%um4S^?Nٶ
.SAжo5$y6
DH*~0K*ClA%N~Ԧz-ĩ_Mv&\kϒ<nJ@\TO˺sK'**lNy.v˩#EdyU&-Z ?\*m߾_ݎ:<`+#i՜݊K!]'~ߊd{m6o=WdM
4,ԊBЭ$O9?LIdd˕ -=nGF4LH&_g~ϼ?7,6Dupt^D645u}X^. gwPNgLlj6ub88Ejy`+Ky&0O
ٖfZipq#nY+"kd$ϜiڀA&G,4)CF"ظ9%ePE(|RB9MI	M3,qT'#=`<Ip:3J*]lpM,'3_rT==yė@{Az,6"8~gp,3yST2/ཞ Wm="&`qn!$:VseKqMѩ-J!$nTSʼ.G9`Puu,/߆)FBY%9.K/oYY{QZҌ>"3U:>ҵƃۗQ=R*y1f0BWsձ+yu;7p9457Q{=^{"P4n+#䊃A}]fkY%>WZU4[kUfQg4'*_O;2amT>^9Z_fVf䨖__<חD֯ЌJ2i]4_ysiL9q5X6|OoE8Ծ?.+.$v^u~Vy_5T	裡 |/|	Oc\9͎Z3\g(Lc1NZ}p{2yr'_lb;Kύp-`	;'W-6gm.fXⳊ?_يN;	3nF=K۳'goC5Y6G3Y%@Z2SGXI"&fu%y|2;,oMosحf+l^u(>
].u*7a䓑Χw	t{߲b;k؉6$$\ÃhCc93I!ٟG۶hCg2H,Ѷ-tfGe2+Fhia3׹~&rou՞,=W"\ҍn}w<`:;F.'dE.qAG&P*`2Ly{۽:f0LdUeB.ҵT!(BF1V&.'PB,&֠B5=1(#|DT-=<CLA2 kC}ٛpX{Yh*z@οETiOuysJUJ*MZQ ү:FBJDpgW3lnl>.-)fj=Cub<iT'L*C\i~~[尊UE$B=L_rz|`m4s!-m1;_e
%,vˏbe6p 2͊<֍$XxQ~(A+.{ucm]=|e_yY*s7O=QcIxWѺ.әɞ@AK{4>4$LᐢW0d0'gaOǈtTRDLz0D: [ƁJKo$HԌ!T!<%r0 2@"^o{+y mvO3_kvYcl@,Mpdd ],nBb/d#fDʡq8Y
Wvވt$|KrVŚh~ wAfFPo,7?XXI]/F|ĚTR-7%o%C?|Pql~ecAy}5aa.g^EuXs9x6n(N&$ܨ2{lXI$I._Q tA|2^eAFa.9%Ti5C-?I1*棒ftmahZq6ocf9yYEr r3'4M6fӋtv9I!#)>|Z6"2@^5#HdsrZiåNF3}LLof1c%gIՇbJ.5;8$UtJ( 5qm"9p<4M
'phHӷb9DxIpȑWZ+ӿk岬Dx=\}j9	[(.SJkFy5\Eqf7 V+I(RGY̎Oߜ93Z#~e.ZEs}"Fm)oA(pz:;,{']Jڽ*>10̄zʚؐ plƜeQ%+Q'GKj`Nz5dwŏgGG'e" L[g"f"Nru&-N<byMjFm8SynGYz5tǫ&@R/_J?`|7yWIãe:pH2.8@.]*fk㤻b|Hpn%wD1q4ؗ"1Xd0vJH(~M,mH'xZzZ.>UG5?/0.)p,)mݳ	ZN~Îa \QqQBy`+,m@v7&䪛HoH&pZIb$BypFOj07]fLn\;zGhk<A>bg{j[Ҁۼ A		D@\N1kϗ	2LG{7)D65 .!ؔ[8~":rLǝě UȚU@ P'Oaa)?#So72zzzf&h¯J;(rmU0/ha<+yMbQ;uƽɄ"S$gV">I$|Ct
 ٹeQ$f:3~֩ig##
ӮJH~=VST(0)5cIɦ!h8;8<uPS^hrzr1PQ
:zbN@(s֛^N=L>DC^JbSwC{LʌI<3h4{itRVp&4*Vxy#98D0"u( oVjQqUaJ#C7L0)2B \i%ժ^FD3\ b-.\sI]
6
g\hmvY
ӥ]a>!ت\(
[y 0; 1ne{ D	>a8q]8MDqK}$rZ6b}p؊w#aXP6y`ie$lH΅f:n	' f研iq:ȋtr!1(8)A uDt6;C+
OXOpqU/V$b,p(A0I568>#"?v*)z;R)a.`A2|νtCۂ𙶢=Urq)1)ƟVe i<3j"i>Pw|ХP g^#ALc{j(@#C"G"o:>'|n ۚ%r-^\϶?Jyk9p_ʪ^$sw9*'FV~s@233[J<=̫<3DR(p6-UHe ilnZBCh	QA^!A븂,-@O^9:8=d	53@J9TFiJw6;
-v.t"bf-RB thC /=+6{{Ω]L3sO#%S8=]vs'8<EɦE4A-yjOoXZ+d|H_I,$QnׁHOJxBW/)&,wBڑԬVMP
n-4V
tD,>?9;|)2ȠH'Sv(PffWVHyy=|K;HR	nzK!>I5K.Rv /<XͮTԙFb&M8Fh=rj:QE
[k$UY}j!O	tV=kv:>aUjz%	8ΐ:Zs\^ 4iUT˲ʯ13vyцPYHKdBՊ雸ueHfD͒GT+\WIꕄ^L+ m6,KᔶbDzx=V78)pڎ-ZVot>{N0]~;l{ϱ䅏n7_5ۅ9螀E5G\/'_C<P|_^(Ge}0S
GF)# 4eH?7Ȕm8/*L(XR~ʐ@},IpS=S"2yK Bf'&V$Jy:7lN0)տ{RI?ysבֿ;w9HgCxڎhBj0tvbg(rΛW/u5Z<ٖs56#Mq\劵't?,O#n!Wzޚ2|hf}onLvf_SWuJfn{!+Kգ]N;k,Pj8SRN&Rcogo%$?>t	Dlr5h2	tf>{/{>㶽2ؐz{zU+^xv~.y_P/\#n_>m/X)gܥ񧼽]3;wO] {ZK/SEF򎒝 ^ǟt) G)PGjv=͑.FϺgݙ.gWW4]AĖ+*x6 آzC@hp=ILl `*)㶙 睒0} Ƀem.~ 1+~ n5t#y8<>k	'?	)ЃaK\D:j,EO4'"
~=1ʵsdX_u-mvI$LmZh_#G$ݸtYP2aeK1],>Iehϓwۼ-irkw9g:&tӔD$s3c*: uxocJ̻,..EL-R	''h!nt3 ~-uPzd(l!V]M~*A+߾t{|S֯/`Q
p.EsףTxlW퇰:bJAw׆Qd	\M&ob:4&/'|(7ef+iI6 ̃u<`,I6&5:NNV:]#<{Ѣ|$IVQѓJF_t
jyJ_̃) ~1;0 s+VI}r/^dW^[CAhOU0hHXn=/FfdT^\io'7!@{jLA<$WsEin#B0?cV}v՜TD*?(ToI+4*{褥/ptgQU|()=|`21ED`_WVFr7lW]#j[(N~[V;:@J*F?20	keNmd]x?Fph*%oVvb[##:+,`oa1*8W|!@8/d ~_$d|Z]e·8~3.%b0|W~d5fty[ (\lc5\%l篵{iuG(̱̾zjXt3"Oׂb[PRˋE6idB#{ЄZe:iz2/ތYzl\ڽcya^)kYuR-;娊tOӡvmp?h}Ѯ~HY݀?_o1|l2=`28bC/ D*+8,1kPħnp9"/}ҝ;$G (XuwՃmS0K<uIm5~=H.nfZ{*4t";p:9~՝QkTԌ~̦N^F(xU=`$N$r1=돷l>լaX4Z|nLuNdl
)M=Wg#i2Vِ.7bpy4y>y: ~xҸQv_^닳7jgvʪPwxÃ&0ɫm,jiow"C$!Ul.A"t?BT㵬vŋLLv	9Y^d%~UeS6]yPALZQ_5$U{1t1dS]+%㾬r1m"`nBf"Um%g?:<\2_zucd6в}[4OF1,??IIOvDH7b+w%]w>oAn:;ba;-KM qr9\񷝭yAΜK;t4(ViL5mNEB;ٶNsӾ0J 2z{Ya49pHRZ[;|ȕ`;j6i6vlOZ:.<!Z':6}ѵ6`l|TC>KlSp5]{M,cYx@AZ"hV	j`_+2zFBg[XMaOUc셐H){#*QjW&GǨ\f8w\N-Q"EYieAj6TvqK(2ʯR-mW\IuAmar7>%*'M$F]hPAQ7%yW9nu!#k	Yov_jQ8Qx*Q"@t- "='kv;8h	5pf,|AW8Ÿh&6CGVyX占^uڨn<~[o^)--(f
N㉽9=LχgsC;u|PsZPը[(a''
kZ~opi:NQ)P37|gn}ZOSy[D^ng;?ŎR3,m{%WR!7uÒp V5]'g1zp;+֯`wv tT	aʊ1Zmw`I4!A2B,qXy+!ƖܬznL#8KvNͅD]YGEX*ppս?9~r'+
J52^2Jɘ҆l'!r[T;@P%@hPeز>aݯ9(7uџ9L%ʝSdkʰDQ $bK(Ol: COL&+;dORfh&Xj4)*yYvoUS£+KJ<kijAMH#FL=!P;(`JMkǄJү9J`ǡ)Aj|"}D>@yD  c]]=D7H{V5k6SW-~A!< vpȴPh9ge<Eh*08}pca2!nog8x ;N,ƚ|RQΦYb?.mi['Q&g6
Ȼt	\|nԖ![q\4to(2HnׂF>ǈPv9W-j9cA_*܉J.?!3V~^<jk%DUtq=f
ul?x\kc
*̨튲z6A^ޣSy>no`
C>Y՝X9Q,8\A\$bڨE&7zgMߪ;:RR]*a$h%?(7^(^kt&"ƅy,ATQxKA[˰gW򱕈~KntEVJ،К[u&4;}_oZ9$IR:yͣs]Ώ.KVp S|NdsE[NJVWlU၉sbe	C{aL@blj-h=ș;&Vǡ䚋!E8jIqbB]&TbAɞF^;PO7z@"Ec=y)2דH˛G=<(yyx_r\-W/klOͺoc5,,=r`sꯜOrFkʀщB34'# -QG(XxT3焢\qQ۪9rydYKOn@nNA<wg.;|AEI&EDl$}NoC#ݱ$G>kg-/LIv*̉^<#quG&	iNf3A')sstwI6w=b)iW7^f 	%(`:Xnmꏺ@u_q3n`PU`,3ND񬏶
IBd,ꇃޭA00mk
M_W0~|XF	w@#q[4Aeq]R֚Z	?Ĉ9VlPHP7A\g\.ǿ~\ͥvS.5o!x@bUyeYV8vB8J~kΓm.9ho9v^<!vҥ	DIl"\ `;9p,9cnD!0d%0 2@72j=8 AX,:4LpF<CFTj]ԸəS穻r6p^Wp
{L":u;0edk}lAx<$khd~{5}ع9ߴRm>?1(>݁1Fv`^ɥNo#kz`Z(ˁsSA aNR]r%&Fݻqll2g_2$oT8L.< s5q\|@羊̴3՝y?<>hI"ΩemPtpbzHY;FKeO5K^ae"Layxڼ446n$&ꀳH@I垁r73PX\821L/X9yrni
;ȐK`O}<,$I
I)J[^lH588fWW6#=?s|r?dۡo5ưOLD<!fvc>4vT#.T_#趶!i%""sЖNu64ѫ43M4b?^ؙ$Pzs'B8񗡻oTgy)j[ֶ%^}g{x߸%NV[<Z[am,IljykJ-K-:l]	[a8	zDĠĽg% '5qWak(A|G1R1Y6UyKň!)pcMO݂~3(\Pӭ-Wv^v㖫|:d]Β1t_QX%'	g-<r·3|luP22cQfqCг$=i<a>_);vo-Γɩ//J"O$EE tXed.#NA1vxP\nL9NG6m^iKUd%P*kDzOHqT1/Ǆe6*zRBl Q(ICȮH	\f>SLznؐEiVګ*jbO.霤vR>)! #GILTkOu%IL$+*)s9KQBJ˚Dk5?x%Kiwdw~%Qn+tQa'u^vM??沭|rz:M~K#ѳlT<p1.RHD$&wRFQYr.A 
,"*CZE<N?K 	椒"ScroReHK$@*6Mfپ:=]vcs:M*vhUy7ToE5uuq}`!|2hV+l	68K:9@J'fO	&dIq[͝vi\y'%[C[Nf6lYyÀ>ex-n	zaC"ᐂ_^XMbY'M?$b%5eIEG'>=0~Ū;+ ȀN<Rƨ?+6 pCzqcEP&{͇B2xTs尋peb_Jp2Px|S6贜]ャABц|?o'+[{]"r}<TgL?UTg6gI<rϭeKaj/Whn@1\]	?>m'G180g=lsX~ZguݗGR#iD;z6cUX&2ubUe:zr~zeT<UA=1yg'y*H\?~v&Ie|rtrׄH42w?2eV~BAٗo}&qR3%>E^!5}'ذ?˞_3j < m!*IsJzeYgǥOݔvRk ?* Ep4H.15MzG?^GKVdkx[Z	GPޖWYi4vq
H>w^j57;zr}f.קoirl>P -j>?yzux¤}EA	Ġ Y쥬]¼dD3K{7g@ttAȃҪ9\*DlRw	-G)[UbH|%DbX*hC)*9f^sltx\dUFZ(]9B+x(op 2`v+3*PR"K/͉{_ĀLldշ8x%$Q_q54D3_ <Ɇ<8{`-<|+Vwxov`1sY
q u,`;궷Q?7lQn)*`T_tפbg}No`tvHsEhYFύ1f<YK@,^/ud4D/$Ww;{L1E/1WdA|`/f33|@*`e:ۃ?fPȁmǷl'7(,Y,7dChWg2<_;Dif+/GA%m%#
gן	_p;!xxexBuAL^%;Mdl1\5׭Ns,AG`5:5!Z٩Fy;M;5 )}[KaJ3j&pћ|`rc@ſ_~~熀Z%(@݂OņǑF43 wDRtdNJ2'Da[y࿯4T>0#6ѷ<OUQRX<LVW >scF%b螞z>bED%S\geNH
j<X=E?n8W?]vZI"t#.0̋9I5Y?'^`?/gѦCy[xˈ~{FZ{ӄ#4iwcIvϒI?J8~zA!&}\tDwj`V~]~4w~*=JV-RHupE rRNWrB񶒺m))Lǩn:TLl[r!Ԛ(KqkIZT<(pLF9PFIAwBqخk\x(GH]^	FI8d+:װTY%\@Eʣ4ݼVkO6i<ќǎ%RZexGs/%PtnU!{LaϘ@u̼?$.ˢ,TȞN^|EFxS~sDobq.M9yN^)zAp6Xghl:W5KaVEqH>$t,=msC<Af2L!G/'}-˹dxAzb
fMjF_9Cy^#U`FǗI(f{7_.`vmHReTT}FD0u]ة1`]'"I#%V8gy<`m\͆}CK>ܻn_惋:K0:ZP56\0A )SGIwQO%-1Vzocl
؜CФCӁ[BNr
cҾ)dkOViXdfם&5Ƽ`eD Ь+;^3:T	%q~`tѵb{N#ISp
.>}E6-k`VǱ<HAhKĈr݌SS"ۗg@M<Eї#)^mꢽ4xg52'lGY_GݾCkČEh4"@8He+c:iQVQ Jyd*ۺsc8D\<m8qᝐN_NCO\/]!IWqI"ǐRaObW;zr'%_.Jq*2/IxMvou]u}|-$Ys(
s\C9C,M䎁MnAMMj#L}QC-Ecab?~#I*1JkEцyXEitwC)QR!nÂXwݐ0ΧZnY!ۗ;^AiϴdL*zsꦒLf-k<]t&bLnSEL5`րS^k:q)
0\]=Ӭ@hFH61yHJ' ti繽{lP辜!l'{I&#Zߒ1k2p6[1&4gH6=ƣ$;ل2C3XqS+IAa;!PZ8{d $ʲ3
cOu kG0돦B̘w"E1>T#pn@cρx3X3ԢTOJaHc3%S5M41;+?.&B& b,kϡh=^ΞeWZ
[ﳷ%Al2-]Q=Q |"͙8pABjr"3C
Ǆ0]*OX qpxb.nlMJԳuA_vCkO6l՟68<@\䰤0TØ40C jWawՔ\'K2	XLXoNYY6"FaJo	z|$=XE/4h)4E+F+xpt2]sH^͟l"RwXeEԬ<ZqhITLzcs'OSiu oUQ}ٽG1%aN
N:>yI(qb<`ߔm68;LIH[\J!$7oyNm2uUiI YPl҉9N\w2!#A#Ȍ HV&Urٹ'tF ciӓ7o^3.~q6[{Wac썴TrrICe).]MPN'/fp\3lcֈW,V_2{6ƾ;t~lu;pvVr(=J|q粓 wP=`(j,1la$="99=|	K7z\*)6GFa`0Dl F%3cT.:Ѵ09#G(ZcYenso=,cV{0֮Ĝum7"7FjXbn|?aow	mŇ9b-CJKՐ8|A^q^?ߪAnJ(0+L7ozo_M:f@bv`+j"&aդLBwgjo,]1G% _Kg: I7ܫjtJ,r-%j-/YUkj*7UqoopXp5݋0&+Ǩ,
	YyAzЂ		-na.z8]dK w!CQ+,ID%dM+!pfX	%Q^&"U-K!^($fS&O%/T!J3Kފ"p48Wޜ'{XEhvqډY
NE($f[2EFa^X364QEz4:RV:_B*b RN&<b3û#looO5a;JI:}2v6:v
Hgoe;J?eEAr69Eܡa/p8بO({#٧n;O6FF{هQ:6-2|da9?> A({xuID͠@'#+#(ڥ%1
z*F1jZ,v @P6 ʕ$! j~|@jZἘzW1_ǘJ.B}f1Zd6mv jb_f-.6 bx ^"M:9A;-CNd/t2-@ܮ)p1vMn'ӬzVutVMG
͜ wgF!8fǄ',6
H|S9RB:兖ddB ZckBp%{]iìWm;=Gl5p80kD=:vO.ZEE-dkkҥj<xz+^R]ZRPLe*~TXԵ V8*uesfgyh7*EkLά+8x#RyͲᅱ$^GE핪3sTnؒ*t]usA*M\--&)Y[Q|SZ>>|*d\pމBðܟ܇T&zs'sFC05VQ1Jܫ_s#r
d˽6t)SЍ9L&SXݔ{:i:TE
$a\mz߀*3Ruw|}*.GFV{,ٛ]9wQ66|V6J|}(uۦLx,MulF=vN$7L id5kef dechaՑ3K-!8C'+M<䖐aͭϊ[/!ɾL_[^h>24G %M;}~{t[J+|6YvYܺ~q{RoFL~R2m@>&v1sHB'klȴ4Oa%s{3GV\eP}5]f,&2,{.`j1I90/~/+N*bMNW_yj3␕yRv½"&FMܢ<rD`G*8|;]W#x"4yYһׄeMQPYRTnoIG*!ڌ̦bfWiGX_TaxYh9;<iA.G/{Kvjz}YJ}yQhr/v2[E-ЌZ<ńt05H?|b3<kIGct*2KS*RkRRߪzӕgP?Ǘ$E{3o^O-ܦ/FPnp(R" BO;MN[gZd&v sҼo2>:Y7A&m@p,}dǻ,K'6A
2Ȇ|| ]9""kz2'<ahܿ/ΎwZ_+]݁-˪wW	|stBja¡*[v4$;p'dDD(ރ7dߤ"g^vc&/¸yĖ_[~la͸dywۗ#O=_c2Ivm-s1/?)RTVcy_#6|ZcXHjs70~~.YK-=%Wqdk5sX+zT(7=0r\bJgfeX|F3vRG<1=iu{Z		ek,M;qwiDxuUsQkv*ZOԅ}jC4$aWt6e HKn*=ZO`uxUcb.GvƨSw}H4b?xToĂ05]+/vWl:%>=Mִ.c}S8^4B
ՕR
paS#zɗjbo$аhy]=M1U	?*	.S#8=hM	UѮ~S丫"5א	b7UrRV1hIG&g4;w_n{Mt,7 ^h3[x _7ԫ`@	bdi8y!_p64v"*z+d6-x)ᣢxgthΫ\6{O1ڼc@LF0+ݩ
x}͍p= |ڐRf3Nvz0!a
0bDu/{5x+L߸N+prW,#![{ͤ&ߕU+/*R%)@Kl>n.b'U,؀Tl;f[cmt2bJ̽@&?x$Z'COWje"Xqߋp{x|qWnz\?)'pyŚfpL6/Lb6laGicQc9Ej1@6yķ-1O({<Ud|.=ɴ~X[5IBj\g"5ʱ6Li^c]D]*asQʁ'e`b|^ouLi~Xr>@GɽS:g_BF bB(pzfgF?tNF)\r"nG#*O6M@ic_B[scO\EX L谘y!_e'sC-d`DЕf"lϣ-uTR>>cN'(3ᚁJAǏdw-9_C|/BRC4t64N!3Pic[`!4P*`mf0R΁~붻w=TH|E/bۭOIMmgPĪ 01se'D.Z	
SL~W^]}Bwg@q[N&Nn0:OTA#tњvM/(
t@0i܀TOgkp<lY.cʉ,4P=e,WMJ:Oc}r7x pUx//h9b\R`01-p2qa~Nбw`xN`s@`?lD},t)>7&;~ovef &u^Y78'_Xa5ydE^uzکx ^K"ᅘ.吋گo`rHÀEhǺc;;b9c	܎ F3G\+|3w ISx=A;ayE<z2RA/K#惱dK5w*|624ɭ@/^56)ռB!ja/9]}7.qfZ}aI/[g vfᅥ!&Gq{刘ocGqO!8&D:ܻ[@/USnTWN8yof[V #\ 2x L\可z0T[y0toѰAdWB-0<99)[UƌMǷ#4ZE	Hk$s:ͱ1TP\ΦCTjR^)Iclo又8F {XchKL
o6.zZYS _%]ߧPڧZ*(dFfAq -ui{l-3$8`1mF)v«m*&Tn
o6t. rQV vF1 V.1lcZ~^_oɳ~/Ӣ:%`<uE',%*9'
<KwO8}:bΒZW?tVz[f<cE	B_g:>hy9ʕZyNX[խqD}=A&GRqK(FxESCIGn$g/O+i%0NPh_fSmQ	NH'DE0HfS	vrо%_Qu<zH 2V&O A_Ϩ[zCSbb`nC{(]1aÞ=^ \!(nd*z>,_>@yϵgv8UΩ\nK$-RؐקG~՞%Re((B
A_E&?u!D<VnERjت,A6^u(M63+T'J;A|<Ӛ3>{%?KN*Q1(#s{,y30A۰ෂ6%yY$|lI?<8h{rxxɛÃUL#cɉwx6y" mEIc@Waqb`yue[kN(q@%~1-52jfg`R#ܡ 8^3L$)l;U(|=M'q9^_@zVE{,ZE	w՚Oq4f "vv)h
%XܨmvƔvT=T"oO[,&,LtX1F`#Bg<dd^Q"˳HJ6N{l)P0fjD
ƉYHNeHӫ\9LY 9;|y{Ě3(Yؠ)@`Z'`'6q{q~xRk UyQbHl|i9YO6k_\9ޟH^Qo]>Wq(j*#l=r݉uq|̑Oyxn%X~Räց;<ٯh*H[efpTmln'=B&)
 r﫪	R-Ѕ1sdYl&]KH4mvƕMjy)P;9%PPnp]X4V[^mAIהć&0h58j*D~6PuBgI#:|m)}J]6	BH:}{%RZZ&2hZnqf#grmH6J#Isbw$jØdSNmajfȑlN%ᏏsS3+wr%EkGWsF[LAP^6%S=nWa
ب}A`~}6'Mk!I~#;"ef0DSY3"qϭ$	zm}'5Xj7G xnŤo>xhc@p˾M_,1sp8}^X;dVN~95|[Ժ|4ʚP7>&Slc9\^)ޥe^X>k,dmfVUnFf,w}@NAa#'Pbbۣ럎q%28A&B$o#y<pfgN
{rI&;>΁si;EWJ#5~+^77CE|v( t&8P@[G}ΰNnneހ+nX;* .iS` {%)SefN?C?<l52aNZ'/\piD%dRH20|p6t;ta}9Ҥm~e*>Ha fΣOt&#a[#lywbj@t/L[םH|pYpFQ^z}ǡǨXKyϸX5@ꓱ{C%ҏyz~	KC -CsMFR$~zЎ߼zURVCU4Îͮqu*?<°
-EE+3	w;۲νd	FE.݉2G ғa&=:1{ѹgt ,>Cb3At~/##D]r[B0{hQ
YGZñ,|m΀K'	7ƩȆDlll_?!Cۣɵ5.1~uON:h%MɂMƚ<NDBV:S,}a{x7tJH{h^I!fs6fJ7L`:AcQpO|xWNl6>@u >̦ΙF݃Db @/;Ca[Fe﷥+8K?TR v\{8-#96J/Gt?Fޫf暒VeIV˪j]Z&UyCʹ6{,\J,^p$CYg(dv#Jbn+5@l~_Qir:A1Ke7!vрa9&j<bWKKsd
zV5l^bX	|NΩJ[I p)fN|F JAa/_7g/!pBuk2`
φ<Iٴ$#0W`[ڽx 61R-2_wl`DXDD3٨$uL(Yը#jPǛcC?4M<6A*gbٓ3%4O{kݰV\8<MRuՌ#<$< ,t.aHlio>IaԟW`k{FsV[YX"{޲		TG7	O@ pM/UVKlxk0KKTx"lV^bȵKel)$v⯡ R 2{7DQu5!~y98M8bd.6wa60@"!t1]͒ǾLP'3U S-;Fb78j{WhhoaW8ڔJF2m0ܮA	Qѫ[Oc=sI#,2:YΜ-պ#:%|@qНȍuū=n9	An@Y+{+QJ9 NS%ِ5-;~jᚥP #U@C:tq+3a6HLFcU`E<%RX"G@?\H)큣%-ROu,+<#:HÀT]{	A:osiIF!4ogVTxR<#(b/}zcv9ԮP/'G69vISQ1fEGXmzwᆥtNHVZQ~;p_ߣR	d7WBc#u{Ӆ{%ox"
; A?wS -Bew;ҟ*|OL!ܨYcg2HzbEwN.6V.טG뽵g|[aF0)Bx~Dsמ՚LfJ|C1$*s-@|ͦ5*(JD.O{!:=JِZkXI/\5Pok|fh.V9gƠ8$Uf[rD"*iSSQ=Z-IqҽIiU/[[B&cRitoc;b1屴{xbp3t.`JHmff0RzjuN;W8`^1n`pSk'\LhL>O<ːOZ5Y셒ޱBA ̇xȂKeM
Xm77sJy\>{"F^5&
HqVTJ4?F ^VEgtwid5"KTh/Z[U*?O W9Cl!n67!jW:	Rp<hn{.?.(s9 !^^>Ђ5#Y")C^h*!C_(.{B,)[5LX05LX1L)lBXtӕ)'uJ興V%6\8XsXy'js
"%5-60Q.1`fÙ3ɚD5~;yzg?9z}:;kPF)
I9cCY9
ҫ畈Z8>g^!ض$|X,EA|%W-$C TCB$;;Rac^3NxBа?
;".тu.Yn.NƍC%I䜵0<e{^1l'FGhhT4VK^6^^bl<HjYH,bIP_ʒҊgUqr:MhU|Z	{^?A;jaKz[PٍT_p%x[;q{eȓ.X' !|/?,mWZrNp<]4	((s*{uRd7tRND!zt)=Za	{^C#"bmDc==@:TG"K_tM4`)&_v5EG:딉I`_+#wNz*rHΧtgT/1?Ν)ϣp)J^Bgd._fS=o;NcXGIFϩ0!z$OnbO]Pl?KL-&GXrK aB DC vrC?+鶪ȬO_oWQM03 m$J?)k0y'9:%i+uL07:{߸p05;H*[֠3Rt*R57Y=9I>r[Xi.3H0$ժgf4Ia#_Q^{4Jjѳp6.]v۰Se;f4ÇIgǐtΟ٠:<u/(w?^}7M?lM\msDqw'?U*FeWU 7,<J ?͞}	IuDǂ:NU9*2QJyWrƑzY yyaO*#܌ىo jƣO[O5oQج=k:p.dՀ}E$̒fg+A7pP-IQckQyZ~kX{M)p7j>_K{|4NPjb y!h8R~2k<cYv|\V!>E0`8	6@gR}܈:tT0:HJʧ|ɽׁYSSu<D0t|.ܭ${dTk8{; hۓ]%Xu$47dm!y!" 1"y"2bQ'"MSƓOvcTm&)Äb5	tw(׷&j=yIN!~yDy;EἌ+`o9WU|\SHױ,v$h21#@)pưqZϟ#Bz;b;WWnj-<lPsna9rN;9sWSzYyV0)n6=`˺bCNj=ܵm t74x8.%5WҀ'H( rhѹEۧW1xؾ_DVwFXYLQ&$v3Vp.08/ 15b!Υ̯߆O;QQ:zoF,+=3Axj%< OHa043 Sim`TC[r[{"
c|ڻ"b}Uh6kX,c	}9.~c|W8q`>ew_yΆMR6Q&g/[A1d;--tcvЁ3R,aH?qgc:<7 i~[]ͽ"u~iz{_-wנD6ØsI塡#3]H4ݙLZ?9Wi<1s/^gICm!I1	0z|۱u_;ջnDeSbN."԰a<er(dU^kq	<i>O(7#Zlf6Ru}hZhsr`]/h0%Hi@`z]}IۧfQ#Ay$`(Zv|$G6exL0Q<52U `~FjCКjW<\ޣ*N[Q6XwT_+4ES|%z7Gls9XA8p|T Ӊ@~nS S?`x =C("Wmpɡb4iQ;#n'u5콉/J5J0vFd+^;d	3y{N}|%?Ul;as2R$P'ˀAµ `M%.pzMπR`DI)h|wM5OƇ^|8=6psY樊`"TXq⥈̛\_[d.IJaixYVP@`q;\/><::ujdlQ r&-s$]Ң-\*˘<sn0$/·uZ>Ir(g7TQr1)\Bwg$/E.Nჾ8e:<oqs[|7]+>mi	a.jHPL3K؎+ÌNzIt8N2j(B{ͿNcGiiՃVNDj(S	!"wx!dޜ}fiku|QPN
7@CV$XJbGVɰg[a l\" ǿ
r.TLfjPpVzed(3G
$<ReKv7nFyB
M$<pe^;7VEFԿزm5l[ugDMB1]4<e^a+Q_ 9VM	IZ-JEroPO漥
Xv[0Y;CcliJQ{enJ0Cuzju@<oo^#Â?1C[
:ЊytrA]jӄGX`E[k@sk%Dʼ (1  rlԜgAgveޣUJZL:'Z%'N\^ut{e:U[\8gF8' G{ikh%W1g7ߪgFDnl3i4=a9[R\IG2«=AR.k'1G U䀝~|v:>$,䨣tDlG0'' I&ŹH1PM&38-o%2Ϗ#T4:UGaVHp>=YmNnn8I~3_AghS:|qU!U9PR+#\jKXr-;4? Az$˃6[hfw<Sg-3 BwznFq@NvERҲ+J=ap0lU3US|L`P֜p7k;hѮM);尋&%nTЕã#!Ⱦ4R3`<"}|m,@cB,MU:\l]cw Za1ξ\;scQJ(2Qy04P&`n'+h(y  HP̮nWpX
^\F"`>x@LC֍Y|L^Z7@ˎ~oH˹Jw
Y3Ļ-[:2xl$챬:vXԚBgZbNOߴ-@m5xOQ9-w$oO<EoxGI;et'"6Fm!ފNSotG<L13eDː"*usw/gб+L8m$N7<S3ʻ1gAlW'e!J$NoIC;h{Լ.L B8'lG:CC*a\|Ͷ%Ds/q&/CO#fNXC2IzVgk-h&1kZ'6-Z_M^<a+GcA옹~"WH\cekNUHƣ)'?D6sFTVU#i8塸bX.#2CqyK]TmԶNZk#Ri]=,ͣ/uuim.TYjMWN}ό\.H	?<T6jMOrt׷v,mzejQɒ5yS/S\kxs,\:nE噤PDҩFR5)Hpkj	G`9;
~GGu&8Bt$Gf? B=rL%VyŅ)mxvy"ssWr,{fKʘϫ,Q)	HS";bؒO{l-ӎ(hNGcJv\	*ȩqNMAS4>ITxĻWC8+.dE+y~mJ-+֘ߺJlPޤ9ðx&!>~
'<rlatZj6]
7S2\]x+F-ɘp/7vJ~T5Hx·ϦbRc
M%~YpKqblLP*fa\w$m(yDv2A$!*X/ᄙ*,W>w<ėGK^1W{rl۱dT)ۭdZBit`Zi?ޒꀣڛO;$p
iTF9:<y3n
f|*o4kTC+w8ym`Vф^.K.~Ӧƴ՚M#󇏮C&_$ZU[= w	R}_E')~˜s2b*|O/g#榎ܫMd67RWњǌYOQWyԭ{Ԝ3vgE_8^6:͢VdMR9!{5sss9:{SgلT%\}nP4<Lv1xIj7 m ML>` )\'_M6;e<2;n5Y?<>hΎѶ#=nRV>)ٰ*WoP*@vAa;4 h.m_Ec>	GX{Xْ4tfwp\'1X=ߢ_u!yKY6=(+~0|
;OLgRrpcޱ;d+@ep66Ŧ#u]U ܺp>𹰨bZ<MA9WEEdlP4|cj#}Q>w EGbg{ᇯRwt%:[j,)W0m6_Kq]ML/֙o}sC)Ol^lzE@iD,0>nL쉂;}B<")1n wi.'p.J>RW ^E}B!n!^PUw6.qI݈1HJhKb,''AO֖Qδ|P{@=;i
Iդ{)S0FwkR5zx74ư8 ,g<ߚ `1z.Z{uUo.,yQ״-kKof]]JUVPEB\a2~E"NUW cܽMGfIr%%%@p:'	_WJ6f]Mn㬨0)d ?P'qR^e4	vT^h<E-%@9ߋ\Vjnauf4l(>l$R!L%l\`A$'C>4j#g0-f+qbi7)W5de( ؞yt7߁gvwnNs|I'ut=Ug$b(52-Zw{\YsF-h65Su,dBv%W_SL̷W6t&hvɕr+N\J`6@Scc!$ڸ[cwEr1.2	̙ 'kg}2*0,S`XA|ِK˚IXd5\_V[;h܂V	A'Պ,WyS|j +6!%ZG%=F0*R-U
!Ӊ3PU,KG̎A{rA(P(e5W4Wڣ]Kfe1+grwi6@>" Qj	W$b,RB1}%M7C;%ۢ^MP%#&ܑ!A֯z=/7
9RFe~t0qRTT҅*/ͫ,N^\βeȍ&*? QU{SzLMz*D_tYKfЃXLF',@1y/K&t ftIkEiɕ1m*#PLqQeN^1:a]Y
փ#ur%oF]<
HND!eA0`䗈'tYd`rf%YuLi (ض.jGas/+d?PNX&IZ$Fַhχ bsª`ڹ7=bAhbˉἰ)sKaT
}73ʗ4
tf+3I6JmC	ȹ/yjKDb߻t	r}ZZ-<v߼>=oUTX_xPi&Y̋X?½am=4lX_BѝR]n *i9޶~)5bYmN'e3rշ.1瘧;ic*➽JU.QO$n#GfOl^5&hfMcN:5m_8wqJF,560s}\5Q5F>:M.(ַ(?n%Wi+6D*tXP 6v=5ZUհ`:y#6x3ض$N[aDiuGr4?FHGs{5ɐC毧1Tiʝ8ިnnXxQ<~LѶU&ER(JIa;?Jq9O$ [۹B4|]ܔ(FR1F[Wqzd|_*Yzؘ5=ꪩ`DpOnP63IFrj9.ߟX%^(t*4ܐ|UZ|GX#3
W. 얝֮
SrJl>ǨEL57pꞠ8F<[ُ8}
;FpMB#"3#ϊb*W9{ ;@i^l뒗8KՓ*_-ejEΥ)Q	9wۤ~dWp~6P07HR%Ƞ`C%3UOc9
bJ_ӌӡ@= 8`Sљw.!Wpc:䴥;=:/Rwi`ssOĎ!ȂS^?%?Fy5gy(Aջ2O?.mDZos&XSüc݃OsںȹƧ~sx:57	s^}yOLx"(6ʈS\ބJ~i&2A
JrKtJAfq2x\?%Q/IC"&j_i76ٔyK!\@A81vzGS43L)/WToCoL9C@Ah"~V;Ewgy{pH.o/_aE#G&68ȚJ$ͤyae1/9w,*'?"c/.^IlJm{j5Dq#[.W,^)g7eoOYD(❵3:фTh˪![ZpeGɮJB	Fｼ˃Y20	Жb
޿l_j	}	<=/oE[p1> b)ÀybRU9`cE;جɅ^ XcCArAŜCA.;WGx6M 3%3e}+ۃ<ǂC#κWC1ÔJ}hT7winŮ9e/|s>9vW0HQ7zv!|=0e.Urj\G`(.v^Dɸ=xnFϛ_OȾHEM4|P,*#Qؚ+4"&ZJ"87lDv!;
_-dsޛt/Ąc';x8o[aٴA9uh0I=$ZS$H~D!m_Jҭ C;5"`L\g0)uIq4yk$2:_M$YyX>c۟Wg_f$Zi:f,/Rd
e (Y:18^IS^EMa3իṋGZ5bd	Oj]S8EU8G%_W]llV{%]|C
U_	$}$jk»ZZW%h׊S檛o"b#MZ̓e6ꋟkn/͐
x!mRrCl::Ԡc|#O]SM*!_ɰ~Lh9[q=GzQ`1YN\

qrźr:;
vaR6oaW|Ӕ]"e^]d|=.~@20W<*8qJמP^m?:ٕ	/"d^ֱ-$~\=M( {nMS#_ÉcՌYaJ vG/%ڈYSqf:}ݑ89P-W(ix5u:j0~ #-Tl ?k&)i2(ޯkE2O_Ӛz󒦨aS wX[E46R+E8hc轒=18Npyw>g_$gWs
2rQ\lS(!7Ԯ0חFQ7AOg5wp9]@ǢmG9sHk1ѷvi⾨X]t{mXvsenqCkkWVLs\W"{7;08Z17`()iYP1X$>Ӛ{W3 v\P_!2odK.kAVvk!Zs	Eh'12Ե[idAEaB\wl9YĺȆtEsl_cHuz<V:uBy٣zXcz9&)!6E6jMy1ƳbU17܎TGb81#W8tԃQødhͦ(_!;2; fjѕPV*Ƥ}0TݗuER`o8nIkI\@
(S^Gj~WF~NvX|:)ݖa#*YFʸ^3)V3o)<RgLvtA.uS`],sƧ!%\H7]̡͚8:P|{\tXL>g=P d;<;ݙh%B/3#DF(wlxתS＝"5ehe#,6jcWt&=hqhu<Sؚҫ$Q/XO7"MJBb+4hc HyD)wmsv>l,xb-2&:gn6ZK%H9uW!V^B[qI?!	Ԏe谓08;,bxlQ\AbT8fY]?\x1T٠Ͱ w`0oEf\7=g{8~i$^m*pъjG(Ҋw͕*FۀgϪAqW{^ŒV޿66$wBd$a2
[ֶXoY*RZ%͸dfdV,y}RUf-2222[]"vfPW)TN3]ke)Bڙ}w:=G-ь 5BK̿$=r:L7<&4:#Sߘb_>@).0?5F6g#)%}!˞`l3վhm0EzWWf="ڂ^[(sneIB7'k2ƢMiMuke^eԫq|f3,8Wǂ(Jq#߃u'}Gw G醳˔yVl	UY$Ka(Oe}?*7b%MGf<"ȵC2J%S`1FҸ-^>!OIQо5T.3$ U*=Eʸ$
Tt7_P!zoN $f:!*QIa_5,Նr]C
vR	_I]땪-QЯuvTiÑj^M,SGzbwsI}tKnʹ@y|
I~핆 WEc0/W\ߊʯ15VTC<cy&7
.ZoFZQ<~e?zi(d{i5"|O	CNHIfmXn*bP=nPq|R	;txMΠ24hxM~^BkkLl_$^xQy]Sw+3 5jԑȒӿ)l"IuπC5H&yXIda;7 cs:/yѰ1+֧@LY]x}icPzzq<Ȋ\,_u 9͒9wհ*i2KKHO`'K1oyzʤY:Fdp\,H;=Gu7P`qJSZX{{uZ8mU^x3Xu7m3>QOQvGh{ ڊ$>"'	'APY]ꬶ:?A	gMųtQד|JwҴ|6Ím /h<>F.Y34@
J_G,ꚩ@Qx^ɦΫ3u ']s%(9nn771IaA!\GnJI4("\c-^ 5zhM6Ά 5<b+Q"'CŐa#"#W|BQK#@񴼉N1_ptL7}B<!:F!)@%6j4oL/.h{-+"k&	ҐTqt2yo.X`m]"$:7݃W}U3kLˁ+&)JRz9[P&beUX&T
Yb6*L(*|GFUw҈XnOKGvlojh##`k(gAq
7v
F!CN [1TBDA->xHs~KT:@2wjnMj:F9@Ss*ek~>»`:u (DP#!d ߊŸnvuOHPPgk&%5!)xِ.R+-=լBtWԪ\]O8p0}qgڱoB3oUiJ112(@Qgw.({ɣdP>IY76`d`|ŧC<,%oAgNt.!ysI2HEwZ"r=  6´juemP`S"}|pV yiz}fq%UPF<Kb527tiQ$QR"D+R5@"mH˅˼%K~G2lw6;)mK܊Hz7>VY/4QB9i\IX>u]nÌޮihכ[Qw<I\Wm8!jP'\m,Twr!֧xiq+!B[}5r߄PֽMkٲG-m֯NĲc)V>hd;-t6L0f20ۀS\*fŘ!+aW(&"!ڦMqk<s_wNfm]%sȳa(bԀ7Ǉݝ3BW:6h^Y<FF<*8c	pfCXݰjERTv`Vv6N|PdUt9Li
NNks',Q[OшL(wA&U$,1`d#I~P`</y@s'4鵂qP<8UKz 5Lfy41|шEt諉Չ>ijNnC"Tuˎ4hPZ	}D3#y	FV&E<Ř黱_]ﬠ/RIǘ"Uc[~$Q#^u#zA+xM/!i
7:E&	p$#dڀU&1!CzF"$xa,բG*	>|mx@_]#+lqMNot[1Y5N4{=v. W4W6m}t:8՜:&_mxH`V:	rD:{7z)م!Bmm1zL%[`(jw0@QudDi`jLUA:\BQĄ m6#6S'LGA\)zUb(pGL\˞D'K,fd.eg˒C5 0ؔΙ98Qda1|fͬMX(GL$_꡷2X;%?:;uV7^16)gZ<HYDk!t<<0=A++F杭w=N 3+y$U]R~%6:N3U& Ρ'}F>:nkW&G1ħ-&ae WD#K#nTAwYhWlM9˙v}Qw:]0m*YM<^|roew"*@1nq"DiAq}Txzf%A<t
mfkI͔FESh0c`\q&	JFi=	RbKO%ޮu#_|DI2U
_{E)8[t1d2m˱| !)#_&
rM/#s$}Uw2{XU?\V,V3HbmQZA;G[^尥
E	.X*;3D19_AoOҜ8\1,2TUK׋r334ʅ3.1]S=jt[ZP8U=]E|1jW4Oi,(ԣk,mIb>DjݏUn[K7`ܣf"O{8BF3{8SJ!D)2h\S K$9OAp:EqekwwB
mt:uz֑ڔB&B
a!0Xg6)Ƣmwv_~ xF50̒	ˁǂS8M'tpÞ,(M--jޒ$04
4LT~lfAQ?r%j,t#so3<$kr쉄!+FǠ'J3"ejED'<("fb+:#
1b	:*QE,ӄVP4Cq%Ւ-7mUQbiSG"76_#ȰE-=Cp޳AIm@ynQm6W`cAMXmߣXxvam*`Ǉ׽ߏ76ut遆Ut~X Tw=w*4CA΂o޽N}{yVgۤFs1(-vϨ"nx'K+f3t(ǧka_`F%f\to,]_!ђ?B%1*AIB8<:3NЧX7;=+ˊ8	PESd#R4W4kS]'{*z6ʬ|Fu1#+쌱{&&n)~xӋj?WOÓW~iO\O?Yi}խY/~/kpGi;}"#ql(Vhf_|jeIr_{G20ᕫmL
6`Fz2Cꂖl=<9V>HEfJ?,TP4!d^gE"np\egal&EEld3E6{ѫߣꔛ6{ĝeeAV $<+ŃvIN#}^!&~ }'5H$Gyv-kf$hoj"I膛F@bQA0AFh=8{ XsE {fzٯQy6.'~MT %5nl9Ҧx2 #kE# oӥ ֲ И6h\Azt\ I4>0b3 kO<:DEb"vw)'U{	*6YRk<@@.a32?f!^ H < ?䵼nΝ(2ptJ11SbWpn**;=T7KO3&[IBJKH/mFOd9Q) <Wm:T7*kmLH_Y~8jN`TMhG@tdu	XzOS֎Ƚq^)xMMg{r'<L÷Ǉ[E'*S#BKWA%ו&$WcWd4>*6ƪA;1|wnHOQ<FYNf/4D(K`Co,jk1|'I-*[͎wߛ-v=Us1a%2b͋0ȭιWFV%#68a*ʴǻd9VP\B_Qg[<|KQ:N[]2MgoNQ]jfVU -udVFř>1'Uڳl]<Ͽ8/:8;|/aJЕX+A{=OL>X8qt}m'\Q'FgW>evd&tX4>D}6AMeh{.Ce`v犡rʟj$_RJz5^rDv2nH7x@l܃a먪[L(sfFӺ8OKx qцwܩYb"Bt}e-J;'zOwPv
_`RH|^)~ZܰﺛA;N kRdcCL۴3{!ou.0(ؒ\X> w|Ӝ¬;~ȋ6+3[u}<ƙ\W(h=ϟ?i@JbioԂ.t(:}aHptG̈oڸ"	yX 5Tle`92bi[rXf|2UϚ3+뀚AY\yLAșp/,ȋ=cGȪ	.6b)n߱"2*lW:he}@Nf$Fie9:.=pu}M r):E#d'76Szlpʮ[/n\K'/JҌ_g]Z&"H琇ӈiCɷ@V"K
";PZڬfSڳ[w!l~^d/p/JE(C	FHG\}
n]hZơ%9zHjpg%~җ;bb,>!n3 ]5"&k:+9<kG	qA6
c9&I 5޾5>g6DOtiP($6.q+c+Yw /7*"[-s"q
<}jcROK-ٌM^jp_}]#Na+	?/ރ9ڏFt\3W{i辢WxU/7$z$΢2gŵAjQAFOqLNaq`Gc
tt0݄DdO(AOUTt#_ 8R
@s uLx|G	x&J<16CQ		H"02nJeRQ(7ueonC#)
<1|$QUMQcīx.@i2B6g*(S
	"*/]
 9I"DݚmOQn	uN 8>\QnxlL[@zq@JnzQL7qx}u7g"7gS14q>[Fe#pedT+1Çdi<UPN;RfJ<^ |5'SOM{#q CBO?@=nAޒM(CvX/5K.^(,-<9ډIt 3H 8#Vj?Lxq[E	B[ëyW5J//nnnF gВwgWN?w'<sqB$8GL}XDA
R
DQx'PTIT2 9pՉGIdq{ǖ, Q#GrF"gLN\ [/"*ߪW{(rLx<NRAPQu㣦Fƺ.G\y^yLrFIf8
ʧdi\#u&NbUty@h);3LR#ؔݡ{؉lZ3W*GYF`iNM{Ϣqʗo>Ww[e!TmH:AɒTTg_Lh6'cxaTa}ۚJ/{tGP^^uDNIrw<H(iiȄ2E^;ƺ@M`JCApŬ@:iȃEJ :/5){nOt)xK#jCBDI9Ԧu=f
ކJ%	bN¾Ȃqª;^ļcCC{с #e5yI*Pf& pJ-/	nR;*liD#3:ǱJl)4~u&nVI7@L7m +F S01e`oIr0 (рŐ+&_pb~7u#GXg?qTX {Adm'-Et{t-1qX䦟ߗ~u|wjt
2@i9LWa	l)&b q
oaU	:M>o}R7
L%7/X"ԞZ&i3lPR
MraYA83iGc<8$
$F*"ꊹR0m=m'QPcJdB³zTkUL*fEG5o͡w^hW,K67Nȏ[O~[0Fx%EN|UEE6e7XrvA)H&-c;Ad7[Ur"wpwǘcNM@_8)XD͸/\t=7toV~ӼqFyFEԝ:FM_S8kRY,4εZպ
E1A(b.v0ƴ&c]uQ8}j̵$Ylzf[gu0W8{;HD؃ YY2$0e~!koS)RP9Yzw:{fj	\9|} ] K1mF|Jۺ:B}5<m&dƘ`ɳk\('*x)tn.4N@Mq~(U?/]`o,i\[L-y;UFòr`3,𮘶DZnseđ"wHMpVĤ,ZnE& h|W͡MdbTo^QbXWqC2c#w;+טy9Yph^@'Dju=GHNuuE$dݷ(޿Gz<g16`S8)|YJDa[u|^IZSE\Y~Z_nP7Ud 겅>t0ް岰fJ[ɱ<RY<u0>мiC5RVQ p};8)EuP\۽4*׺Ӗq|d'K_
OmS(19{{ӱur9f%YL͏x
J ؈!PvCp3:nFqǳ|0Z&H}Ff[X@o%/,ťk.Pf::o$Amzj鍹@FZ=msW>\ERb
xD[]:+r
CôЃ𬯻"NM-k\hl\,; E3?YFC'k>'
ѿXUG8niǡGýdn.#{wrΩ5ӎ@'|c(?*ˠ AsASCH~_(TfQIJگc-]{$)YU&M}w*ƻ=3%-&󬶂2@uѳu`WM$c}خS6EP9\L*H1SI@GTQcBHco݌vL&g $출Li"cM7ﮦGa#S	/ﭯ4<yU<VȶV8"UYߗL3c$1(g	5uA즼zPlXJQ  /5MhH.G؛k07VB^=ধ5DmA\NS'{4yzHiyx{wKxYif|o\iTs-&×\MN?x"o$Kaf1ͲiԠ]NUun0D<@gSSlL?"F0;=+u_0*)G$hd1(#Ʀl𪫸t	)fXm-S"@Kg?`kxN?lМ֏_?\y??gT얺	꺥ͥntHWA@F[,ԆFbh	+\}5)ԩN,IC񸙜fn"A>N88BHp偪^lHBI(SP|đat^06|I	;Suwm	8Fʠ'seE7Kq(fYy{b̧nRS3vQ0-gY	bĮ;PzmmoC
 w WTsn5_brgrɈjZ|AK*Iyݣ(Łu3\Z51/{9!%/	oQg'@}^AiQ()&h3	Y(/b4,HaQ*{Fjh)Dc; N1'K]?J׻Du	d(LB4aj[/[ĘZe=WѮumMf!8deRAFN ЁuL}	֯KGMÇZKnÓ\+)a܉sk]ZoX+XtqN,#d1fe`aXwIUөjIώP-n^dѝ|h맺#]p=(|&UTDf-׫wL'P6xPW|[T/
rm|9\:lO2G)ׄ;Nݏ+ 8QT#g<ޣ`%n:&EL<xݗw 񞱨,@TۄdJ]Mt;ViSo)},0Vrq2raR7:L-7^()2Y2#7&	'4'xN%T\}V[hူgyQA2΋;	QxTS<z$Ly5hfcTDlO2F }XAo1'=+vw>IrdhV?0奲h̹Up_\Z]aRrTQcN48XEcM]eM38呿f$q"gWGSxN@m>'POns%+p'|wsd5zU6X>6"=EIXGoCkP
)M'0(E]o\7xcu aנljyrqi
}h}0ď>稽sU]Q>|!n ᪎l_d`vyaup#f	.#ھ]%^cS3K;JAuƦAmvd 1sT#͇:Qs3\ēil'bSog
DoDT2sJW?ࡥr6C*z󘅽|.XԯjO'lRc055x㣭޻#etg4yPA:XBVO9~ ~e-)v"QpFS9#NW!+փE5!'E	STα?z:E՟iem/o2(&s~kO6zt	sPty,L$u'PKU)34>Ci0&hV}롞GDx:滮,qmTo#"DܔW$E$>̬HL{gX$PLkyߛMtW}r%m!S E_d5^j(f70%\MKyDd=0RxC7ML׎d`׮xYlb8Ӳ3*5!ܚה`,M"2<^.+-:+I#"5sUl
_N+x:>a轁N=)nՆ(*cs]bKH;u:uϧ'0["dea5թCEy-3	\ѽ7C¾ȥ#|5b8ZD%qU"LoTvR&u
+:qFugܠ%9&o Hzok6/6TyKi_ȄL;FZ!aE@Jg5ZkGٔ\Sh[/ bpn+;/04Sn0S_
M%(Ăz#r$'4E0ߜjkAmb?>J[.Oh+ 78IL7-o`)'Tzyj0)Jh`,x_"SsWܩ8_h]2.".grAᒋǝdK^J%sldi/k<6/t9`O".Ve0O_߻P_t$WRfP$Dowv_~]~Cl,|'%8V
Pm*tiT턪S~KUYo{Bu퉣|:{;3k+jz`27	VBnRG'6,-y}H?ۻí7,Sy(	g mY	fhuմ舽ni~cށӏUrKVWei(i  Au#P>?,#لs<I#do
u}БBD)=Y}q>VuTB\3n957$ [ m_?36կBI`mU=&Nv3&{SvдuL?[<'Φ<qW15ʓq)Cߓғ''GG,,͑SkGGDaŜjɧʙϷ.K|&
DXW3jL 8>MYO|
^+ү{tֆQ249!MTa9w{ʍMgOq9?e}gtEM=.Z[,hf*[6X2 t|P*Zb1)/kmoޟ?`/Kx8KO8iʩnznwVQcBG̓]6fV f1@G6]򨷳m1;Q;	p3)v'M{ӓqFjw=׵=z8W'7׵wUx&(&IȉCƜ5Wi`#&~Zӯ;@9m:/|+GE >4El9)!RWJForTZETG
h `wЃE&L:6N|Ti*O|\}/..өbAک~^8C7ӯs [8ѯwz͙7&?]j~RGQ=._.^V+琳Dߙ%e=4AM~'s{u474vBNgn3Nd0xTAumcnxg{{ìJg6,{0~/(ew4aAO@).Q nlm0!By1vyZp<󕔚[YzԤtߜ[G`V$苪4AJJ҆eQ-uĬ0\'u`*!!U9zacNvGi+ڈ9)~	pa^^ ;LGa-
ɄE<	Dh/E>⻰c":/fdl kFjr>ʦ"wmo=d@?PmۍYUVϺemCZkf{kJXGe'xl+6f[V^YM(l8`X$,dUHazvYiS#^`Y<OEKYÜ*z+9 y/u6M62a#,K&#7{FsuKDDCWzL~F"߯>0Vޏ'I{pu>[1.5,o1O;`Kt3  XZ<y9-+b5
g_uyj_ F񅎖[[svbSGɒ(EAc(kHDI@ы7Wfңxr [2gWO(;Hqux|C$@YI6SA}X@!"LY+@-Bcu=&fu䠹J`<%?tAw$:Ügm#8PdlI;?c܈#ݜ&Pm7<WzgGb&2ѽ Æz݇TᤀMށdX#y$^1OTSD8ѱB$#0'Yu4pW!nwЌR?zѫW?>RHp&1 ̶ʯGnUy]xj8'"[<n(s 6"p"Uma|bX	{LJ	~jk4IF}ZN
|:@2;c%d%	:?6VYw;;S87d],PDVT4XӚ#kGBF ϖ̂RDsTOU̾)|n?{AP6tP@
'ąxceMíѭM6hnܔ(97a'
uaٵ@t	,Ģp-""xNc'@hKmѽdr# ^h,Spj̵՗WKeI)a:"`!&nJv*E-<JRN:.4JeHc?]pkq˭-؂5Tn;রpWh	~GU=mYz^F,{Mr<FT/ZZê<>SW\%q!0AϰĆ8aZW~NR.fovC֒؊Q':GPf{Yf*R4+51Q%Z(.#5R"?C{8|F]!,trg $Jboiį)Բvw|c:˨Aoĭu6tg}]uo.JYUqG(iD@GJ*!JT#"JDP
4[4#pa4Fؓav-12.ݺƿP$nѣLgu::Nu V)L6<fºuuC=56zSqj|ZʦS&8 EdTJK!e$b͵MB$8+!	_?@
8}%,Qw:HQa=,18ammvTQg
«BEUu$VM~Ll+~5ۖfIG./T*@?^x:O@*Vai z1v"!T[,$h:fvX!b԰3b^ǫYMX,v Oo@k*; a%`pmtTe'|mnī8Pp M2C+<,.v/d1r#XJt3Y[ãê㭹c#Gd|I*UWkH{!:af"6֊K@cL` ,<^	uhnq˄8LHkw+||<XQ+f<lr׎w6:A dzc5nG)K̰mkqc9Y%Zͩctf)q$;&3qHQE9ӫ5^B1nK<UuC^;VpjA;=$ hFt~dUD9b[|Iˠ8VfA%#jf[M넂"ԋttŚudK8
Hge>9 @
n߽HCfdLE˼ީI4r%*$.;a9- DZ:bxZJӫ	XW6|>zM׋*MX?xF$V/ԕF5]}O:#ju\G{AgCM?Yp"*!K	tKրy0O/\ffA9CKٹȿvɐZ0*bL|;Gp>[)wm2.C
Jۨtl%6 C6.].A8%}0`Η(iFA43r5A38W>˜4P?.((|> "6˽;7b=t
\P~Vͽ8;zsR̻Dn]a{3Ŷ!Knk0>ǎj%wXB#C\5%\]Q/KH$u6!XByaб/a@0'(pCqb!)`~;lsOpӊ:ec @5z{1% Λ4#Mׁ ب\-FYNVuqGFq+mizV7״jco֛㣃7ozd!gLa#!D-̲_	ANۋ	ЍF=7ǃ lY-5?w,l@o
Pl9Rؔo|D"v{2<KBuCK]g$/ҧV}GT<p`P,Edz Eӏa/9:W{q6)ҨraḡsͦpS'IO.]=3Uavל|dԅ{_WfI%I6P)RCVwp[drSQAYԙuoIsuZ3I;o^d`*!Kcρ+M	(?VFzzf.[0吏:GV	iU˦~#SPB g->
@(u0dt(HFݛg{R&\%b<},+v<ʧ]kc LFqCz;ovD ƢM34O+˦xcYq٣ld+s,mѸ-G{H)M9%T<&sGNf4M4O Tf^T՛gf~nYg\KאuJk z,LLF!l:K4&7o<덢[BIlɅ[NɮخÃÖcĪ1:Mɝ5Urȩ.i8vJH9wĴ>`8Y`Ք"ikHI{j6Nm4U~!=`Ga{
S"͎w	h	-+2CIM(*_OE,B@ꪽ)!1M9-_˸N);	N<x(1cp#qo5wmwz22nyAE|s@|̸6b(E7N8F5Y|2fj#H'vsicg *YT˂tXl%!`|Xbhc͑qH5ʈ]UD(Dӗh"oJ QW{\-/ b,QPo	UqXs.Sq7xa69W)?+="o"ؗ6ںb_|x6K0}TuШ7*"zjE;[G,#v<UشۏՆyLSصGj
?TTiUcPoozǿry|)8J	p=fL\]I)(8(W|Tg> 3,e&gpӴujJqPYgܚu>yt<91kE:l{eRd,H	"bM~I¯_(2Vs8	ڔP`%96\|AIqv=g( _Z΀}6Nj蕚
5LU61tC$8>KjU-b:8m%fD<vl;}z7;>n`Vb[5UCC&e\y?E\-0_<H&ZBa|,td"+R-(K\ dX%:"kgYn~2pxN>3!xXFo67{j[;p4uwEGo  o{;ݨj8{_W8ڋ6vwI#X;Eߢݽ	~%vvѫ^U7՗ze;zQcei2\@
O<mS[Ob X^S׌ !"b_R@Ft5 (YUU#Եh=$ aiDΜEƜw/5Ft3@MB	%eW(m<z*1^c@ݥ&yNU]Qzlյ=U4!U;+Mj<g-`{{	"a\Pk19 14)
3E&
@
MZ&QaCVHf5BbU,Jx_w8̷Cn볱uN2%FBրu'1)ԶW$Vu6`&Ac}HK\xMLR5JQ#T:C@4	P)xs~	
'y$Kd(!3H4^\Q'hgFEU>~ۈo)(w>1Ì16sz;0YGí]u:,!}v>!<[."Nx_G[o_*r--~&nN&m(RͪW"~:Q4t/Wk>Oau:gY)tjĉ!(OuU<5[ nV+\?Zߌi:{x?>͡1Pq"ef~u2[2N!`#a]a`|zxc, 1o9KwaEED{ڜɡ, WE!
.H|@{y;,P\dñ2^c|,o!۴ViXaT7%饿}-VbxUq$4Kȍ;FquD̴FY󶁖<x;It:Ŝj8f\"N77{2m]SQVo{ˬVA<(÷'<ȗrRPM("+ʸWZ^J n2R4jw]pgZngE[f)eX?No^Ew`ǣI;F4o`MYN,n$L
[w
xvq@(-n|CqdZE/}[脵J?>>Q\̾wJ1JF^+ $Є@Wڳj8y8L>c2_R2+}>90YuI5j?}l&BaF=Ҩpw6|!ztA~$EoV%>IWEN%cJ^۬\tenuIz*TZBoc	%2%SՊPSp0.V(=,PMH70~w1z LF#qEgpQr)W[ey&٫vuQ=Ǹ6uxa/
@ćLd{G]~Z/R:퀽!ЬZjL\ZkpE-:]%`:\KKL/?pOm8s7V%SiMChywc~.6Q:F95 DQÊos bWIO>|j#t(eҼ2md}/ė9y0n ##}V6z5092EPdZts*kDZ2SȘS9cQ_FїD	B :iI*F$]a
@Jg$RX#gxb=c_`5"VOp^ЩjKdUsd8fceFjf4عs%/c</r(ƺ8'r^\ƮeĲ0X$hSmQgA@|BѕLK

EP2Y'Ý9H~s.A1o+oGDA}A|7MUk BJ#OV[g-/0ڇd}E[odz<S_:?]r#cu~=s㯘du> ЫOY1jDG8*voN'vt94vXؿt6l⍥";9>
:4Nk%7 `_U73u}$!q2Y¤
5޿@HG# 63<=!2! $P5DFaG8n5eEn{Ҟ:RRt^@ahAADU`=/Wk0ȈytǔOZ5	X@xZ,$Њ;R VaRȡEr:%Eם	eK dy4Y8H=\0BqN_Ȥ%q볟(HuW'tc{V1<L!-X"M[Xl1髨]cgZ#@)^qF腆i#+doI~"1hɹȺkR;5[$L!$_lݮÍ7f_D~i!Y-d0͇ӃN?P?yPŚUfYY<%Yy^Qtáp=#	CW(c&O͠6/XyF:ecku.w޻Ux{T{xO^.X¥#)wO]-mU9_=>&vy>c(1l1O+,82 ĀD:: !	*Kd$%$#{QzpbwY)A E6Nl`	j86wJ$B 8zy5j,5;t..M̙.lʵ(,S=P9S=:ƣH1y#fԁr:w.%?SƘxFN3i4d!I2TwNE}Jk)u3"bb46"E^GIɠxօ(N~pC_3h>K;P\Rau ;Ty3wzg+qKx|f`㴷Ã	QMlKl/;jX {7V
`ʌkN`rIrEw$~~z_hZ(5_s
f\PX>=zc\<Wӽuכ_,.>x.(Z+cyoB^+UĈGSd	"0]GцbmNxֻ{:H,Z²y޶_cʼLS0tkFl}
SbYJ(`_ $!=]sx;B-Vnڹ)Alɑ&Ђ8U7*V>n`.0".Fm0YţAt?C,d;jU nHM'M)jF6i/TZ%{u2D[#P گ֕n#2t>Z/Ipʓ
1șj:HhOn|hzJ*0Z	!t+Na%ۑ8/Qls(lRX7޻֓nYȷ}ǧWZ}RmQ/~DA,enC$Ewѿ\#d5ԥ(*^vU:@OE_w<݆aR.#RiT|O<誈dbc+M(o;(΀>,'t44W~rV\]'2aAAP`fyiv3g<㗑 kjM8hAgB;gKq\"IiyP0|dK0}S]˓o}R;163su/6QM%%l\wؕT74\򣕁aaJrq-
PvIO؇:6#hebaT+?}]*r7	]|pe
9'N)X\6ax:BOyi<)<|S[>ŋOu';%:zb7:v H]J`J5>,dO"ᗿMTsu<?cw!5qO)-:(?T6n_:\]db>8q0Q-ՔM2e#2ål^=AỉulG&,{	#3vX̊æK6SX&3\J00@
8b%q\ovϺP-lRy#Xziz.y֮0N||K!*s)8a_ڰNJ#ro;gG)Mޗ!s%b<4Po6Apx|B';xNF1u:١mn*_E61 ~0u4ȣ]2,]Uef.D9f&U2Á6L7SC
P+&䪋{.܅NoT'o!".!#s,5?g_os"^gk'VN1㠓ྑMf$Q΋WJXXyuZl
N;Y<cx3	\v\ho_nж3z(X4/,>TjWYN"3Oi$\[rh҃)Uj(#Lg95B_BЭX0.Eh⻭~_<C5a C,/wAV/_>\*PURXS~(U+xZ)D3$BIIK2.4zO}sr-ԝZgeG̦b[E%!$M
oƳ8yț̦0E99!VҿycRL
i
BwbbyT0?W[F(]X"c8#j&T@VsHg1P}'[Q|(V^[Q$+ j(n,&VyW]wЕB:{an!qL u.[ҮT}ߍo/O.~xﰛUXA	<vHx+	
s|&pzyG3
<䗻f,_tPuuJou:U=¤sNE)=mkɪr*N1HmmH,$ qz'[1|y
RUnU@J'D{W}d۲@:Ɛ'08B?|rRl'<m!#^V8x@59G'P蒌
{N(EφI#6{cN$^ꞎ$P9䐍za
-o͚#ZKOsN5!t[*7쿙sH.jBU6rB`vt##
T5P7T.c5^z8X
,Cܮ"0P"x_:gm8{7r2Th7m95_JS&f_TӘ7{&vӇzkP3P
!۟(*rI9bES.YhƤζdyu¨4{ o~խmhF<D)+05|Y>M|xФi8N+T6O~'[sO!@edѮ@1Zg#]^QG✂@tJW$gP[DQd#lΎd8دf;G\ z)4Wpz*7}W=1jTJ: ~Qowv_~ )9A
Ԏ>iRLe1GN@~ܫozpkq_\t% '`7o{{ݽv3:> E ?8	LZ{|58kH=VΚ"6<@ϐlJC::n٩p8fƧ71bǓ<YV0dbQ!#Z` `}Mi/b{G!b59'1It&4V GL@uv">ydH3p"egpq4 m2{8$HVl~]HDE%Thhd[̍yvkKZ41W`^z :e!ȸYTİS^ecf^d;L3ڼ~E6J0}uCWZh~}5ռtL/gNS4U5pgGh ßc1M:l@sF$bF1Ҥ6Sl} .Pw >Ē`Obyd3Z`R1>8<;3čs,ju`SH[@.t!nvE-f%V+6xӉRMR2(FYD2dLa)`P)8Yq|t%!mJGQ
OiV@3	bp-.p;gf<ooksq&@Tq0ōWhQOf#J
SRl:6@Kl#1H(w6{[YRH!MK6LF0KMO7b
JO}DwHo dĊW,"i>
umBq.Hr PvK]ʰT[Ӵ#$'D/`KA-Lu 䂲]gt_Z<5Y҉obOn~hQ'ɀ0)0Ӕ/hAhGﶷ%7lUn@plvwz;FxGL!"ɊL`ogQ:IbOS?ugW''*˷TJX&t=>)ɒ T@z扞,is3j2Tɣ5E	dgĚrPUeXx(@DLՂp-*ܦ,3%E1Hu5ŋ}X7Ӽ?+pY@E_nO([? yRbGM}R))|ᦡB`'T)E( hs>CEpSk!ǒ\&}F<WN
6Y\ix IrL 3B><8[v[R+oÝcXK,fTk4#X{ru~^XR
q^\ 	A7w5BT	|6T7][rL=8?=J3)"
\
(.cJp$-WW~)Uesj?qzRA<6zpˏF-(d?v{lBN[	˦)$>rfAǒ% )2s ˂⴨%Tb&lt*aH ]B΅m{[87FUY2IQm+F1'|z5iFBᇕ1Dil 6Ldе)%z`}EQ]M F͟*x)(w[#2EdXe}XIf\ ?py=^qrGaR1x<Mqq$nv76TzJ'
8VD)OS<'e
J`Ohƌbͨ"7`ڇa2z^qzL0	M]sJK\*9̧Vya\{`>"i擋,,X{0)*R"oDn:+TQ!CAu<J By.LWJxg!VTB#֡<{aR Vc kSBa*Ql	N%¯AׅӝU	ΨVWF;q3{pvf38 Xt^o^ o4 ՙ[Q͝Wѩ:Tslx"*yUԘQ*іA)R4]]^)&uf-᱈ǞYO2gF]0	|ԽYᤅG7r:QmA}`o#ξI2PKaovLEj@k)Y:_RGȁݺP1O@Վ'Ypjm.?؎ hmX₠,NdE'V7VFdA V!kg&{2d;6Q}(S}:UCJ?[$"i~y6.Ϊʫ]yںX
tH)O,<%q;+O	t»k%bzc|5J8.KlLbQ0nJIiw̬ը:Y_H\@_yBɇOl^]]o;PԂNxw,u₾~ĀuxӗjۈaW53]_5*yc5͠6Q|~T
pU՟p۷<Usހ>
<%*y-F1izo&ۧo ~Ggn)1GדkVS!
1Ӈq(*+ҋ	zj߁ڂ
]4oxkwnhkMa-\'ޠj2Kޑ/Vt2Y-'^TrS6@1n aj6=FH3#TFpV2l:鳈Fu֢Ȇ6$՟j{?\"ēӋ&[` E' etIZ@k Zk<trkxHtb@Ñi#7P+r1܉^mX#ebNіvFtB#uS]
.'"iujAA/Krs4R{Nwx]mP(oj˞?]%O&qݶԌX $>F{x&(~&Wj`vq/DUV^bnO&X3Ed岚
7C0u P"5:<6l_ͭ8Na JUlQ\M%E|Q]UIkh;*q$"\tdRm=mD8OlJa4 Nd
?M6e.Ia5- S+	3A235	IrvnN6+uz&@ijBC,]&?LvvUz;Ξ<$n	o&=hrUN6F&4J3C;m]ç~F,mQ~v&H	ia`!QAY4G8S(]kD5'=rXQZ%B s&._ĸ+bMM[;0p DŪUrN!L7vkf 1<sLc>R|eQ7	<xOmP&GUG3~dL;!vL)BLx_mｂ`HXdd
P]?fu"<Ł-F?V;Ld^=XAz2]"uB^̊.#;^l)T8g91prk$-nJGyd^AS?ÔB&]}t!w:(`qy~$0YIznpXa_I74{%QrN؀)uz`8t޺Z|>pȗqy; B9G`jnF߂]!r-V g).8gX{R'.MNa2A$q70+Ђ=,K^_ǽM;\
ph7I.SŽӏ\|Zy$
&AE}\S."X	` KA"#O`)=)51cýkrYAo(vN*/dL	Y)MUdFKYrɐ)EA.&uϔRq"Ci}CL!}CES\wG *nFCqIMBk+&Mυi.msz)L_.uI_12P
F1c//Wb/Glg։~aNz!Qx MMR99|,a60	!7"˸?|\=\;Rr7V>4\5wp!XՁ(.0yr
zՓvagSIXrjSh%KfdN-^ w?XO1+s,r(R+ꒂm[@-z6RL^E9o>|jG6 K/U%0Z.r47 ؾS`Rs?8p]sg(DqT,'GL~jv*EAe9& u_ R#瀜GbJIcHLJp]O
\,pR&Ud!jmпZxΏV#"<0.'M7PW=lu	o3) 19x(Kb渉颛LA
cTړk<LH}68N
6xQE4*Q^G1XLOQX:VÝU(OL'Eд=Y5D5&3&e!`DFnT^yn dsFN;h|ly/z<_WZb.,͈Pթ?IMZ	LUk6 Ps6H1_B$Ί!Tm\%cxvXdN6j	ǤmG=m]ZJo:鷕{/6dFdI_%+Q5*-94 vP`wۨ=coB^AF^K[j,m1=U6gZA蛰hLN<~VІooO{E8
]FEݍvjnVw4o	c`i?xL`/Dx6()@vQZ'sSU_X{H8"&#j"i
Q@ҷ0*"95 j% 5tq8ypdL3s/-}MA͏<3,F~;¢B
&++w,@kWW
dhZz2-PUx|}sz;CZWøPuPl~Id~i4Tǖ*cӫZ&
hۑi1	:q/_❙*t3ڻ1ȿѽѵ@`˾%BΞ(^)vÊ^zVFDiJ6?it"3a%=Nj=̫5_̫y6ɏy56Ωp^<[U,M#NW%Ɯ(}@bNJ6hɇfg$ ڗ҆AI8BZ6t0f7^cJ3R]:-u/i&
3FOq;Fkgx]҆PuYo'pϣ`{Vh,"i*sHNSx2HO9LZ8͢kFAN3iQ̨3<DձKDלˤ_ t9\!+˪/4B,뎭r㦡*9)<IYpaΉlu4BkXI&='#v:6{\59y\ Q8G2?	f7}~ERD&u e	Z|N9ڻwAww;k(]H-$2)_*QXCa~7Oa*BeCǠ∢7 c#z [^rN1agVLr}j!oidUL٫Ho!ԅoy6;،GhX[ol/~Ώٳ<غX|kQGit^g֔-9)^w{zb7*::;zwޮx6='N$~r57ap%y	)?Z-?zR~tܲ
85_dNœi%`bS*|\M##Ƣh(pDqP࣯k}&QIՋk9XnFddu7Bv-KACit2K\G?`5S(=ɯy<Ic/RQ`IE]i=1y,~L_ 췩9'#b|ՃXY٘y?0ҥ|صc0C4̱=m:$.<AhoaiӋ.(q$-`Q<2.#ߤD]\">t7°q몑nn׬M~~B{;R>?zw on~+eT"[mhy_~</>w*粇3zE?ǢoLu<\jE$51l)3g7G2Xw=Y*y2U9vw~04v	<m;8Wջ;M.ȒڢC?W*|?ϧ3b[,Bv|ɷ{*ɺhT p4׉JX,t5 >Z5**.vha$Uz4y*m"YJRQ:lE	Ɩ_ErD4<ж02BԓY018BttD<~2vjovãCtgyNm9^~D?>-r, :S_RRgSMծ3W"j2W@Nt_0!:)ǈg:a!0Yx GB)<0yaNc0yeqa}BRRױe@:Y2 !VZ.1{"/OɆ}˱u ؁u?~Z}cy.Ya֫4OVTG?feЄt$BDxاlбwn\
1jLTcN&@<A<ƎqޣĤ/41qﱭ'Z椷ea-D C\kr+t&JIQ$ݶ6JSf( kkAE_#eRxhS+йeXzh\d̗Ƙs!+&D!U1!֙:c$Vë ?˰dX	\p.orׅGNf%Lb"Co@T~P$s
5F
U(t%vEb(	=x(ȄCxgAǖ4@#4@b6
?ԅQV=oJ",qf&љ>(RES4TcpiFOFQZD]0_-9MNR٬ưEa^
D1_!Fby,KB$XAӼHf6Li=iN`龖WtEh1ޟ(	MPƿ̝,B|Tc6LUzzF O_IJd[>8Fђ9zsT?khaZ^=M7$~ٹBVo1mnܟ'@+A02	Y=Q|k;y:~젛MUŘ֝?5+`GA7M23/6FptTRFug&dMM42X*7pO7ii20d+Ló*pi8(Г&㥲AmO$|z}AS7(9*Y6u^dQi'wz|k5$i7'YBabAhjuP0BFExe[zu)Wg#:2qLu- _(;I(GkZ z_sT917pª;"U?cEt.4LgD/#U1ҽT_(	{1l W] _CxM32gG_9Tv5X.sG>mF |\i}BA+4$'
تVioY	l^mV`X@d0]_6['^Lj%"lߥ_Ɲ??F]q_̧Zjo~xq/p˅ր0C3|OLgra+rXխiʹ֡_hT%#mdD4{7tYʀfl{t2F\zGlm^O-բtsBRK"-Mz٠Щ%D@D9#=TmT-_W`YQ5ppb!_k
;Å ,I͛r6art4w.|C6CDQ7>:֛~*x3Zڮ@!44K# RS)v?k<Dk/%هts"7:U_UFv>|$gbO%jA5e
D1R#t'x.+ }Z`H.z$yFuu$E*Ex@Hfzpӌ>{/{e51&h|SoFW}ŧM\{ZW|H-		:Zlȟ4Իh jxOBlsW?f]EN_"$nN|Ȉu~>x[U*$gݝ)*sbVc.+<%fU_So0u X[fnsFq Է!NYb[{~tB[q+wx-+>VP]u@rto:1w*py38EgnE
+dVgoGBe~Vmay,prABʜ(Tvǹ}wt*.@eYEMC2״^;~ХU8<=ڋf3)^GN+L!l(9زx0)SnUKV𛸎>?Vղ!XF;O\2(W@u_yaD
QZPg&߉$#[<xL#!GGeᇓUmr7o	PA|myՎ>BP劙j^כ[ar0aT*6(M]Kz9r&򥶶M&MD1fE9;?ZyeoܪgSL;<kL\94tRvҼQ0+pO<RW5{Օ3 Y-ć46Rl2>b8*lLu @=LSU1}
MC/-H_Lm}'wWWo|;t-KJմd7π22l~Be,q+Hׁ`|grH(̣33dQJ%mm[ιXwvಚ;=,M%
QRѯsh.JIj #t0R@>o_LwYX/D<:-<(btcqMH`ηgv= o^X ~ٷ"A=ӺUr~w7~}_NV@baz	ݜ+zaCKw\OD!xk^$hܮMo>dIW#
[yUү783ivyv ?|N'{Xfն#᷶`c1`s|zL#ꯚvq6kֵ1KcezDZ]jK#'	~'j}jMdx:ZWN>g~l5kg"D=Nt
R*0/	רQ4H3c[;݃ߣ~o!.@3rea8&G*r1Q1P>yw`N}4nٛzqV`f7"@RnyׁUq09֌!%ws+bT!f,<&E?)STWu5GJ`o,LYi4<)T>XBz;F;tp
ܝjU=Wc$9&85'cp59FCE>fS轃Mw~V>l>m4^<7fsLBfˇ8@>X}z͕7

UC @,^wZ`PP>*Op"|uwwA=Po`&y>gIsbE6+
ﶚgi5Rl7z6IפcV//U͐WDc"l:=m@b\Q{9y§N^K͜i@BxnP1!m%l_Q.^}[m='VBlNPQg輥C7é00l
'ژTE=	(skЉ0@)E2=HsޅM>Op50޼ `^p}?Z'tc4Azz=Dl3t#UN8ҍijCVfl,6˔7/σuHdE܉OZl@hzc4d1;.p0)cʑM[[!' >@	LUo(X{js(
}4¦ԅ)pskʜ*44Kd<U1%KM/Ez.S9/j`nH{<Oa	{';Ec?n?&}<YNOՆG4Noi98Tdй"at ՐUgBF}q]
|ElQ6g/~v~hN>@>:_]uQ4V7Y7N~9ОzNp]54mITv)./5CxWC{Y6-7rZ-aɅ [o_%Si	S,1/yj%q^ՍdФ-e@1a[o:hHdQj¡LFpΙ QKAQPĤm&J)djLpDt7,B)jC0kSۉQ"~\_
lw΄/Q|(hL+Dp\[&sL	D3ř!G"DSqX&xQt:]@ 9X#wXZ1$fҿn5ǅL	Mi"֣)`f
q//:8;x3x'i*'SycݾgpMyb|繘&:qaξCl(Iߨ~3v8lo̕gBAAED7?ϝ2>r'љC?$O^+"t8V05,K<wMK~]R=&.wojqMd.px4{P(IGMAڏ)il21,pGT5WK&zRAZ&窀c!9N<>L5yܩZ=,p1C* YchM3??VHsY?869ΒK?#]aILxȠ11qQ`z&1uł[DcGlzӤ6]Z#-XUY8X"c)ܸ rې,چzxom>Ns_|V<BR{͹B%KA޻jWY2:4N1\ Vf	既P@qL`N!kRnX͟6L
vGIEBgQ CT{xN/
gkӂDrXz$@E
q Xꃸ !A E/ f.`H8'1Otr(ÝV%Ad2~]FS[c㇥e\L	o=T`bA8%*Ra0/z5ILY9ffӕN)iˑ IAy*jݼwYM$CT|s=5_Q<[\\b@![өi<9 0$KڿMVgmz9/0y?Lϒi2ƞ4t!(7C
]2o5z0qYO2Taǻo圸-Q[jĩ`0$LR}+4%BAF'omId+5lGlSzS]>	2-ľ)aUC24QϴhKkV(nn+T~U=hD&<,z^B)O݃esuӬq~'ꃃPt%FYp}8z}~OV ̕jl1]Yۻ F6LF?f]ЈkQw{]zD2T`;=]'Y	LlEb=m'Ӣ#Qnm>|$<9:<;<uG;皷QuR?~]0G3;Dk;t@g&CxiOďD;ߏwEKͦTv3I$+/PӴX58Q^(9+z}*ws69mt7u.]$a~vbYxrftvv+p߽ccvd^{Lv蠻{Ua_}L1%@Vjeq!hjQu;ϿEjCPGvnI6' }|ŽWpk$ԟ9|v%=l}=h(2ҷ[GwQp'Eq:FC3ʘ$]#dDo,;[yDv؂]7?<ﶷFb-6ZIb(pLI<VdJYԱ4 |av*s ""! |{twE(;oڼ8CUwc#R[v~#L@[B)t(Bԡx|/pKʃ?kigToт˓O샂x׺РHi߯"	Ν~oaVp<w"j-t8@A}/n h!&bGi:)8Vu${L [Dry,F"Hm(b*vWuzAFVQ^%k.6qz>M!dNo$>Ktfl~̓8gU4mA	D5~1f~Ňl_Z(Zk ֢-HKJ;"i.೸"PR('f/p.Rs>,hF_|J
Щ"31~FWڹ_@}1~mWL ζdPS" -GH+3FkZhܨQ	PQk;%9UUEG#y ;Dv&[dɺi8xxBNHW%5^,݇x(5K+]Ȥc@$[uGYĈ`!`C	&[PJ[KZP+%ՁPs
YuoY[\A\{RLKgl¦hC=ʂ4
|$bYƓx :&-mX"FE;9R~qQGPe ۔Y]N95'@	ͨ ٵNh{x
D{2kCmSZ*eqNԴc5	}2OU5=uu=%Vn-q<Πe		F(YĂړjgØ]6i>clׂ0G>FTE)9J̨S"v K*k;4D=Ajk60d0SLl!k@zQ7rAwտel4vLWZp|V[h;$^ݝқK_9"wtspW=k<]),Vc'/'kbSd߿(aœasLQ1J1`̾T͔nf
vxVRw!>l۴kekicM^t:7PQ|^
DaEݦ֕#]]6APGbN8#hzB|hG`@ Sy!Ca>Bжk"'EN<800pE!`@Pȹo6npeBɄ~܌VXm[v]1AhLUúAXnP4=7x08:xTɷ.-gwNE/Iz3Nˮ/=)+ϱn#v7Zù&n	6A`YBNup7#t{&kcYGZ=jjeLM`ݥ_z(agX$`H\[W*s _X=rB.h"m kb6BMU+((doB"(*"-HX<"FQ(;H쾪-TR-ukى3(bC@6`|ҳ,-B˧5g4DIH1|¥oyacoa1ðGycXgBnMw%lL4lӴ7(3{Rvab%OS].@A	۸Oߧ/jWqoؔ1_t[PєSџ*af)cQbIQfR<)0(d8lj#CϫI3e,+RSK\Ǒ
?)1YI2\eży6dT(S>Oy +m5Zuto5Qs >ɜ%Y'^_t~:kps}=I{7Y$A&1$CuDscGVQVz┑u<@R­8j>nKԜLQ"F5
u@_ɀxZuߠISHdvv%*P Cy	|X7q6HzP'7A8 Еoag =L+/i1{?l1*qaPDM}^OR45F9~x+ .'l?Lr(Hdt0mpS7qlzs{=Ǳ"hoY+):{7auΉ	mxlֱa15=zߍ跭{"u\w5=aw$Ad	f(1x:tK Xn*t$刣.M|ws3t?Jbm IrasP\֢"@ b%`EQbOA2=K	WpԗѬY:őeA[p2&5kEB$G:F}KTr
C&& - /LH2?`B%%Ȑe ԇc!1Ȱ=5-DQ1eɘ5.| 7:
qu\!ϿL.pq2P2}TÍ&۬?5mn Y[WF(` .aӋ_"ZdcbST^W$X.&f/[bT8LɌ0ѧ|ZZh|0([E><	G=DĨqQڳ	INIQoXskԓLԬsr搦C09>ՏO?Hh;'^UQcUMNXjt(jxjUz,Yj6:
866~Zm<qk68
SSQC|+4WndyUƏ
5~5T4l)®DaP"A̲j B9dX;F
f3.QȔj/Lg#jrN7g"mPuQkk"ϥ Bjr=|1%y(%.$<6Q=4ْMƝ'KE9xqВ(g^(ʧGW~'^f~_Զu!=1'$mDK'oȬ2p1a[lT=gBVo__qtc|61YhdOu͈F9Ǭ}TxA>Nj#gnmX%i:)f<mՃi>樛 |T4MB1qZ/+uTQt䆉AjЄ|</ ;T#"#J`dwT
;<9!01F_al'ͭXoZb$F)b|l9n4?ޖ~[v!V!Ly
N6u}aAJ0P&;Et`t'hqLv+uUeTDg{e8]I<0)
VtкTݘ(A"^`ÕrkKv䐹2SGGjZa3Zj\4z7lU|V[nxXrb)	$χl\Q}FCA'3DV8ZuaӎnO6|@X!jsź 
?c?dAYfcTw(5?7%wH?k.
Kgh'|]UwQU`5x0W.|jp/tx iN|_g(bvPCfkx7&KԸ6yUu>Ki;Ud==A[j[T؀l\+sAqĪݜ>r}?|O>h6njh؇i6kwz-IRkk>	 &wD3a}uĲSP0>*ԧz@Kǔj^2Hs#H$Udݯ%6Yf:pa,'SaP, oeERd\0%>0cr2rDYeYNIAD# z/Ε2xe
"pmWrʩnu
	ddr*ʉ+wNĻLI訕OR23P̹&؉'_~T[-Kd.fm<Uh/=NB1SN)g %Y
alg1Zٱt3@zysTV8H5%ES;/'E
T򜸶~8  *>c6a@3,ԹgOU
^>D$Yιj:i4e>G܆.uf-%uEo(Y9:	>QS5=PK2ӢmxҔ0=pHLaTYRH-(pKK\cxI3Pi0xF~ĲC xb0g eOC\vJ/Qy:NY@}& k~z[0;jEko*PҹoSm}cg+ϺxT0U~i,=f#5m눪
5ZU(Ó0}5!+EZ3*/)M&kr(ѺwiDs
{E&i]Е6ei{
GA{g"mӣÂctw{dsvz<<uT\
}ϊDC멱QX}X[zec5 _4'նЖN"^9b[Kkz&&;oA C5ˌW,.Z/:8?gu#۴nD)UNcmciY:UؿB?<xh_޲$f<Oޭ;Y g;8%bwtKLnuI]^Xc[/smqB.VpWDT:C9Oc
Z$YiTr-$ϟ(;l=2|h$l&TU8qoHz1`)-13R#nDfkQT37o
U"o_n#_S=DM,y+AQeeӮDt}{꼄A#ſi`0(uߣ?oI)`E+_bi 	0iͨ@g_>gBK6X.̣~W!ӧ	zBs'4Ư0esVMˋqg1[ZWUpj̯\ʖA[dަ>m_8O:+}7^hݽhL/1w玞莙鎘j+ \b0B,GuZC޺8yYm̤+kt|i6sq`Yԕ!<,OYEM{aPC,ZÇMu4}ᥑ܉T<&1)0rmԜӤZ	gRa*LR%6-͢r,^,cf\SJL@}Y
IQ}:KA0FhIq&aA	=H\u@vߪۻ]URByrU:݊ʄ&+ʷjT1u2_,=ћn
g]BժC
X+l!V
EU:K^h#@#n[4!X_FL۔rSLK<$'1hɬb뱱Ӻ۵L!Jq6#c#	%`Ǥ"xhzhCTO%zN ş =tkSBwGj-7 ]TĉjیxI&ӺPDDύʔT<[$*ߵy(437p(ԭTK:UB̽L=8N"o:n+M5u/ع2<0<?'/DB	
Ë%X}d<1_~Wo,08b&Ѩh.Ys^=VmEʈt d]Fb"u)_ 5ن׆aUQ@(\AVɬ	$B5a?! oEeimjj;W{G!0z;jnG><ȭEBc!aث٩Iv䒫BfXfjˉ:&{ojE-zzm(WmupQDcYfB$t
Ll8:hS(˸jJ%Z;ښFbRLJv/uB߳2otC׆<+O>kTl4㤼/
E<R2h`df
.*ANH`n+#N	XMtM&sg`mWΆiqlrHjg"-+"=I;f5'3xJT]n|#]ӜUk2L԰K:mYj5L)Qj=.{"i"AX!͈D"|Ѫ5I`2	<n qwp1qw68YE	ey__4KՎ3
 b!6&T͸UD5@Zi_jsb.]Y/q%dBI ,U(8,1.ʢapc5ER~s7Tkp`w>.'rAv%h|rӵ%qʓR%wT/W#68fw(NRrV+bcNJH:0+$3s>	3P9CUk!z\	fr̵eNtԹZ=ˣ,j/^jyLu2nx˯c"Ȣ3sECdI~;u}l@neCQTEka5@Ix`f>ݠUL@6!nC	YAnAvTd+36u6Iʀ=hsȼFDKaskC,[2
[iαuKAR
F95҈P+4bϼh@i*eOVRX_ZB"Ӂ[W!ωV?D\8p\_$:-Tb:P=q{Lr#w@ށs.	(Y2A_V#GK|s<ǋJ%3`(n+1ka(gٗ,Tg30qPD%uh"oǦفVnK<$:P*a@ZUw>_9awgԈ=5"!ܫ>RWI̥8}TgbX*YSXK	C'S`(4K|oL|o<T~`rOFb'BbDzu#_#RJaA:W5_U~ρ1CFo,%(=өbc:%Updà\8a}fڭ;ӱNskNuc\JMLBHXE sxK:|<?̗jw^*^U{jx5|:DX[BUsJk[@I {;jXchP?1_dt21c
"у0U?Ij-RB
:_,R7<[!EU|S/=9(|լf*czD?WKfBJE 'XGOHB Zf^eF:	'˻JA
NSj@'X3zϦ9{I׎ӂyih27j9ltWA
@|tMX{6걧X˱N)0x慑E	,$ #sGpG7:ٙvtLl WS>2Rx=Cjᙚ1p;WpѸ*`6"9U+)pe%xGl>7Jqu_K[F|sw8Ew)y`"&Cb5j۶Ku}rNT5ĵ
%`P-8J5@|hb K=@}WBZg_CM@Diz1=._,#q!q!ؽ[	ItSΒOYηmVViE2"d|8-JvA]Htu9VG2Ch'hbe)d`S8fqTlcy̯>NjV-|Y&iy4iDYS2q2{Τpc|[Ra[ȪC-ضN9_Ѿ~mk$NYK>C.LfT!iZ.<(IE8I~&ܠ6p0gQ-Ϥ/UB/	ZA8hYaU*)L|vE&)KpEQplWRze$5GC/]F"k2u-
H[cuIhp3 ̗
GHPq״Bh8CHnIfXpr̼B13WAa5!d
BX0BOQF<D}u ňVv~eT	a;2t"-Z&\?L(0߬ kevfhsI~L@
%@br8GiB)LVy>eɼ~aj[f{6rX|l-zьVYp0S.{QJH>{)YkKvrrE"mɅVH\l2Yfʀ?BJm\g`p}Y g\ov6vCCEr_~Vt]U{8Az9
)x:MkK6ł̰`i$6/Q?{4PG x	cKީ
DM"V8n\)_xPqH6X1@,S&߯Nߥ7==SS%SC@oG:ɒIC?Hi*	^#{WNKE/7i,O&T#1s!0|K$mf( 6ˊ6;%084@hԙ
,1!9|]b֞h:o5z)f<s [Ǫ-L7a!(i+p35I)/IV`#/-:NW3TRaP]MPkm7°]/"3A-bO0C3eU-cTIf_j%Qb>м듄\NL7Rzqb]oqUg';P$>Ƕw4jsHI|Oҳ4[8Piso>֪6{i屋pk6dUmMflxm	 .Ɋ_b-HC5x/(ey )y+'ON򺀷+CMw󧦹	sϖQ/p]W&LX!n9Fo8ٵ>\m_Izz}!HX؄އ,6hӒ<(@$Ac[gh1
!
s0"U#n&lΦX:-ydڶJEH2Wq2z3\ҥk+S=#kyH#":U!Dӵ*8mת˕r܀2]t#24:m)nQ*^6oSj̦ΰ3{ܶIcFZ^;fR]pBMFOP5 Q}iZg.sj%bbvzSF 	p`ֿ}IӔy63	bwaR~_zȗvG" Zg=V.s;mw;AUoؽ'`*_v6&v<УU|ǈyjgEj7一J*B!tad%!V?pI3ll*Gu01\q؞Avt/5&ޛnw\Д9mMO<IdjN([S[A^Qg:ZYVd&+,xO=dlf	Ӱ&=@=wD+7xkwpי=w@HЦ'CMМt%;2_z؍͇VOc:2-k]bUUE!}1\>/!O+4k25!Ÿ1t\;R#$6t#/QSQ{ꇭ,J/thJK8&+7-ztz׻7w.Q:'If4m;HM	kQȵճ((ɓiNa2
96Α/,a)+U:$jnz8:)+zH[I"HYB͓fӈxŸ-GB	Sӹ&,phjjԤh@\Se[͚kbQen%`3ьWt8@x<զVZF.!7M]4ڡ7tƵ2i	eQzA!t
8DxDPzmMmpny;2sW#NBQa}Ŕ`^6g/'[{:D|ʷX{9.;} Ө ⱳ~9Pntm:t{PisI,rv	m4sƥ8pH6he%JD:CœПC6{ѫY暶[Jʮ
 3r8`LRp`teTσ?*h܌]Γx(;jٝa⺅b{'´<kjȂ =~oFΜRza^\Ui)slqB4!W,;c8L
~XzrҪ~cڼ
&E+ rI/0a$9QW۪7bj|Ukژ@w0%=KsiJi+eRw)g7䟽"r@tcNOԨ9cN+rk!(:ߪ}7SN!åzwWbֈ>.Eo{ǿuwh@ov<韧	g'P/5exzl811j[mKt) Q7VkgOۗ5gPs6kvB*;MI
yGZrKX)J),N$!E_fÔ& mg1Bu2P
jpGd9&VX )5G-:j3%Sy %q]!q$r8$	-6`OEi8\ѯ%hs `P10Sh<NA	 0:|',virl1>q(jsl܊yNz
˝%U{_Ө{vמD?3o0>"=ϑ>e> %`hEW8:
,0I@1:N?Oi|:r<pz䓩n!{[Ct_{_^l_T6g5f櫗rD+A>Fq}5yv>O#FFqQ6d Z9WLP	u;j8ng3i|LyJz4f^O<R5Ա	~KI/g3 -lﲿx ]/_KԬJ(JFɌ$DV05tp+gv0`XIShb_SuD!)oGSym#4T7&ݍy3gYBq>SbCgxU:La5.7;Z"=D]t9R^cSQ:!e>~/- -wEZE4Šyzx~MWU^h@ G	-'lh^ݹKHr)< qř)&v.*:TVZ;O=fI;Gl%wjq!!MeZ^\CuF=zȦвu>֢mzZl퇟?T΍eoo%J|OhiMX ]%a@ߦ̧Ip[Yi&ChEz.DScֿi>vo/emg BtR;GޫwoT_S2X}!p>j]$!Ï5g/iyX4,oXv.F!Ͱ<-TjB(\y9iN.ѻ?c[|O J7(u'F钳<'I~6Gto#Cf)J.-㠝WuL6^>ýrP~S'xŭ϶F\3DzҟNΦ\"Pdc&_t(|u"ctRaGB9AQE0 ӝBYn%\./Xb	e(S6wv%$.R˖bա=:%~~JGYW
E-z24X6KwF֛hXW~cMVgq~qQZ9 d`⠊/8 ٌ!vH3`H(%j,TLiA"|SQp}(n>uo hgٙiKO`xꣶfqr]jVۡ4P5CNGEiXkCA5LGt6#6Ji_
>
tj4O{w)ࢆfaсyMA xRrM_bQ{4НH7r)wA58駧),xV`.A"%dĈj{ja~k蠻''VD^|=E35ΰ-s6L}VI_4w)*<=ɔv=8"s=E1sFP~I[zG:,kqQoP3(y̲/8]6<1Õ*ӓ?wbk"!pCNB`Ok՟|6u)l0CXa:uD"2\u^1H~_1ц0RdT@^yaRaDD{	h`DVWi_(tovy_D}Jy?ez܄}l"fKP*%Fu$ʟL=E&S^m~ۤ$HE':YbNE?ĺ)R:ǜc^Z8я++~8MI}zxWQ\>KR4w7Z'#[3+\Ӿml\%CO;YT\a3ۨ'rkrDT$P$7BM0r+Hꒄ^H8E5Af ƠՀz=V8\^F㯘hH9f#
'ГfÇ jH^9"J{2q|iB 5rMlnr
ba@MWqfXp)p}Ƌ=C8p -[B<k&aڹ0WȘr0 +c{k|LBaYpudhdN=uU:q+"^#6cyQ|.c!`1@!KZ,C	hs2xDt0SCP&&(HS6֨@	vIΡ3su4!VzmK.7{ֿ{n}$s7o(\o#8OV\YdOHf-ngpWd{'JGï_<c)c%V r!dR~T\N!ikưs7琀HyE`V͏-@TpdQ6DWiV:dxr+7
9	,-V׺Js!`vF jft1?	pDuaG}-၊2yJZ2}  Lq.#{rb[o*_#zKk߱/؆G'6K!mX0~_ިH7ۯbRyb"D5E隰6=PjEH
I~Cx:7Aص)O4}Y7R݆ ,Mzq`xj˞P\ \U[Dܹ%U-jp %l=HQv܃#)^]Tn.
JIh
&쥧
"6 RCj'I+*;$EC9-LYrktb6%%Pnx}n)bWQ 82ܠvꊚ)
͕;mn<7'W޽Qh[e
|3s]	jԘ0-wlȮ%Ӧ~.Ka+'70^eH2Q1:Wz~9߄WG2y%k%gE0Ie]֫	56c?X!2rgܪ"s?2^vƭ0@	ʖ	Q^Cyq3
-h5@N_Ul
\Tҩ$l="˃hB/<Ofwv^s+ʝ_xiBON9'~J-{8;aJL8RJi?]hĢ +k>tC{.*W{{۽P$hmE.;tŒ'B)
|	X	`jIk%LJA3پ)J[)BXPC"T}[Iܞ4܂TRN$	]7&)fM+^^Bw?H_=䇰)JNuDq9	|ja4##@a]4CP=l> yr5eP~ޙk<n^~VօwMzylUVMinwY?Tw5wb͡E8JS8KW_\٤elu(j6i!j&Z|*[ߙrСM[X K >W0.Fi,^(/^tbIDZn5{}iB.Mޑl}.kVbAN=ԕZY{z5} ^/hpeU} Gqo3b'Ǡ\@jsB-0Iz*=J[Ruu aM֫~vY-YbxLjdT6("psd&EYj+8J0VK&!`*fUM6څptAM6Qo|z9$#clw(1T^|vqkr]}E *^z<;/u]dJ
 ?2ǇG;G	n<~ǹp PD=Kt48 8NTwس_2zUig(X!Hлl飁T݇H$ޓS\pj."^8}^[A_i>nվ iHUػj(7oa^,鳺lZw;gL$܊F.W%bilJVɓ@@HO0Z7}G9:'v"Z\`^9dށ~C#ss5Q:1pjPǷF, y>װ;tw9γbkr&ܯHމ!dN|'%A4_	I[yȏu ,~۬b;Z12s6 Ɇ:.4HFW惣:+WNn8'CozdUfXHȑA4l=(贈,q-uLGY	Egn/! FXlu[͏<xy4s-SG#nK&v3zfa?X8:9;_ٜ>N"6B ͑℀|}qx9:pz1ISuvӸ`&F&ctT+'Cg-98OM)GT!l߆/bx043`~Im eZ%u*Y;6.
a(d%zO.AWT:fk6MQ\rBfi* ~= l*aRvGc%38FKCN6C`{Eu4G"V(g.NLH}6e 1! CZX5	/%&	ٰS#i]IN$3@9c|"¤*z00LJ+ô"Cw`:rԁRv2GŃAvzbKGkYĨpj=ƺQlkjY٩fҬXɗ:@mF޿=va+Tm:$i6п šNdtA9"L)n[6S*M閹=Q!c{unPMZ&m^D3i*UY@Ed4B&	('VUL	(N3{":klw9zzc	ydo<Ce[/L%b-=5j*ْn)SʼEHbΗcw%(~oX9Vf.fSL!FwvyD/!V!?y=P?b;TH-	T&pq.sQ}.>vU7T{[W@huYFLh9ڿ6iRStr-Tʤ%%aBRhCI>;;JՙGH-ӫ$tŋ Xsmw)})uʻm(:c/L@X#b|N05"(:K% Fʁ2ZƷ4igzC/E0#p@-=8Na|FfNHPLXF$Z咀:QN3^/c	Y`q:I@[qbbMn"Wq<<-V2A(Gq=mIb0T.0=O&t\kR{	#hZ=>1P$anuéeRza'ieg`_fJnsS^"iz]txWnpz}nURW~X1:yV~˨?? ʸ7PEu(WEܪxbXgj^ mūy&p2lk>Z]h
B몶%WnżMGh]8^ؑ"CƄH/gōidXR݌XJ&nKH$^,Ě6/dWՇΏ,-1PBDQ\[2R0BoI*Q\GЅYWComss$ ;&#e.D<K=*TJk6x`%Ӣsgt;=Ro߸00ؙj "]ŃX)ﭯ΁J@>c/~'?¯:|:Ȱ3r~#.PyFY41+G4}2ʸtKg_K`);A2A䎑p'iIUY^6!18&O@ KXM8ƃ/NuؒHnl>A0EPm9"׊ުϢWw5w ԟY?OS) Nea7t|k,##ᅂ_u~|+Fo|C+R#Q<JS\}P1BYlR̊#!>4d?6Bu}x́kKK?s#,ܐiKY9<G6C$@j=bLqPE.,{0{Y~̠F$OjMK0?ŠKFr,C0clc$:cilOf[.}lȳw
fbD?RfXAUp~jl~zm8H'Ҙ 笓w`ӣs))O)Ld}NXgͭ5y|}8C`՘	aX_ ~Ȓ^_%$G<ƕDflyq?Q}IB\.jjìȵ&PSMeÒP'fu'd=T	$߅-ZBg[Oj9*><UPwUT1VqsO)*2	-EnH3*j`]8Ƒ5}u08Ք[1!+oXt(FT~>,XC
}oSJroi2C86F| _QU﹩o9ɱN<Eфf0&Zm=+X<7b $M8x\TA{tR4`.GB9CI*jf-X ?&kCv
#DmKv'SZ1#0ǬWچ֝Nuz	bPLyN-k!DpIuH (z iYSiNv*c-[pgQ~+1XTJBK2!Wgz1YlfOx%:ӺLR_x'qr;]NR{WGGX% =ǵ5 @4h'D`'ٖbG:bD.Ȫ+؀Y028Ĳq̉yRi?p6[ȰqUqVTU HH;tdjw[ԑȏ#[fGՑ\=u!""|1@$Jބפ:ϱj&Saxx*낢@hߏ@ZYRppnj29`xVAC9ܞg$Gc<xI	iXCljv7BxZn?ʡ=~vjK^ 8<׏;!y4C[h0@7j]3Ջ渎{ZmmVЈۈaҦ^s|Byw]|)o;hIӿڡ=l{I :jiv3ݢЄ=(<g d"-K$.kYYrAV#"9u/(lXqI̦Cr 05fhDx-ٿ$Ðm[2b8#z8gግ鲂̈+u-t_Shy/-:^ID(yf3`Pqx ;#SD9@HG AaEgZC&)A8zx& u+\#Α)	yb&mITN_MY0wi
Ǥ;;9Kj m̡iZ5uwW`OUa/xg93X|;zd*-ENROZO)b"DC-Uo/4EnqܵeB|rw	A71^UEXu-'-&l,a07 J;;b7LZ'±Io x,_cُuf!hxv'sYLa
9B3>;~>@3}We_K% U1 ,YiEe ܢb<,*G;Q_a!N5%d?J)typU]@nxtM3f@l>0(3NeҗEYMh\/yA â"- ]	, ;s>4ч7q.L,yڞ,1TF==5Vޣy3=7\S|!S7fs˴`{f`hkݙDSw\SG);ȃk乌]Osx|Ũ1VWmX<Gİ5X㰬0^d`XA1m1[e_ ~[w|oQtB(;[eՂc\'*q9GSW\<2uq?Suo%$
3 w%Z6GF1'z[SldtNC"j=W{7sJ`I`;93wWy%Jw-;	 6b}WG4ZeF;yFjvJӎ`}x-b2q'q	EA,$B_|@[>AkjNvfv?M[lN0eQأV2c٢#D*	6aj75rUl&n먵6|@CTupwIR<WvJt='NMZ%d!]#T#{Ь!-\TD 89֓{~.cm wB
xhw4Oi޽t,
P ]O9&6=#!!`
$j2	(4tEY^.W4_sؕ?̻
]uH.3ۜr{XgI~),\.PY"-54+H=x"jgW3>~54ߪFs;aǂ.
|Ѩ-J#ݡ 5v]ad5^FSwyMqbO^oDőȒ5bHFrCg߇e<S\LN%6qk!y:`>{$ٗQnv6xQ+w8cc_f1y?09uW6qrĂ<@|x*`1	|1/@(d6||)on3Ic7x1 Gbיxmu"V5`M>hffESLm߆$Hprts0
P Z@
9R]gǏ*ARH*
ɉ'~n$@"pm$>Y\#m!넖	[Y;USSvVP6M
^z^==+(;V
ZQᏞ}c @;PmS2ф?sumgk#aþZlE {O4Qb\FfӰALE"ݝ9m`4MGQѮ
4&cד-28=t)6oehl) 8%Ecv 6< 	=׮wlm~|8.\pL7we%[8Y3JQ
AUݍZ0@?3Y#M(2%DYW9|*Iꃭ7~I)t驸*Bh?)8,_p@63

qΩlJG@u{\]['XME<W1x I\=*{acQۧ.UA2AB+FC~ ؚ3Z]Ę2mTDn6a1a;B]!Sހ",_5@R@mN^0@b5rfT\ˊXMxB&<.Q\]S"\Ublqؐ#5B`
H=3oFdDiG+kįR70zAV]qlS:@M&͏(npѬvlWjo9&6f"
i& y xc!@Se.*@	B"IBBEU܄ioXPΰFt؀hnJ:fU)y[)*ȃrB"qZ[)z3ǱZD	U:Rї4c.D{J(6tp>	H r*2zZ
3Az줊osvDFݔ$0%\A9=l0ͼfF:Q<Lϧs]BmDb}>1y6$4t~$'Qb}?&a@Mȩ8sHBkLDlFc&Wz:7{km{%oW>a`F?򴝨FVSfd&\CZkH5k
2ZS{8af/hGer/zGn<Wlᆱ[tm!Z@>u(jȞsE7".^muj^eb#s  :[3tx
G9xMlMa:qo A/)`S8Z"2K\36`tGR)aVSWj(@" 3s{tԛOTաrz!9gd>&[a-~X +q#6s)b(k]}RjXR^=h}2G9Q9~z GTc1 q	J|Qu
.`<$]3k9fbLz>$l4Ŧ]cz6xyS8(p82i*
V%bmM}s +82H^5FLDԻf@9q]Ka,T`
{P]79 
jf&\y4Zdt_0	VcE:P;N	.bAljCUiu08Ll#=kbA"^d^K.a輚3Av<S7< W<
<P1t7x?fC7oQtzaJ6+>
ٺy
8U9@JCC0Mbddk*0vxB
 }⎉q'5Ֆb
ߋ&g2 kq^aOy+*ƫ}] 8^xƠ߄:*BA/L|
)Zm=P0ɮ	,C2Y4Dd ZzH>ם2֪O@L&
G"+\cKy)fЂb40LƣGxAeD׭AMd	O87RUՆљgpil͜Z|bg0"w>ZKjrBXOb7b+oCPVd3l{[ ě2^ vAXo>^7QܺnJ.nyJ/ ʗHg8FY+tWqsdd,<.t J!at:tYuF@S20g wp٫4YtY^w}#R8r'䀏;>lItOn>쫑_)_0Ck=jUکECu6b)2fl$y89	I~GU^Ud׹Φ:Tn6g\IF0l,&杼	 r٧/KrxZ00Ӹ>V\ccIU'ܶ	<SL0|Y.CLND`<buQk.[9lw['sjwNZaב1mu/Y-3:	 $m:@@T$ D4=.#^&JN)I<%!J?yg[BK:4{?KfD.ɸfMYx&Nc]2jNGf:X(|-h	huRG5[#Exhq98Jd;#|koz;öfW|Aۍ./ npC|yyY:D\m.dǝ~uD@+)n.B8Ax !'vktSAsj!}@iAcvdU
=nZ{wY~cAY}b&=;ͳ*l>rfSLS`!՜gO&曻ImڋN ﷺ{e4Ԅ J%o^:{N+ɐƥ̢NЂX<nll?]);XN\UV
~Xꅃ)ܾY8_CR1kxт
6tŶ2,FÊJ&s2o3}Iե)t1{Ň5ZrA4v us[|ª5
oUTK\ŋn[-WiaLqSL+3-~_"F)Nؿ6Ie$Cefv=.^0ޝb+K4C<jvHRv(/ S7qZmb$ȅ{xGgd@jao,I~]	Sm^j6?ߑ|_^pb~4~vp'<K#S6PkX<_γ1	(C>KKPx]3Bh٪+mt,P!a́ùhE~)x<IRNBV}(@PuLN6xEW!j
8{6`!%ҝCe'dߖde|JHAeUe'dRs47/Dc&'P&]4$=Aˎƞ#fH/ Bq2t7ԗoW^^o{GoZZ9]/
w֨aqb],Y{7o{-. xIN V]/<ᐥ9Q'8!mxNY"эG&DLC6aAؔ!< Nux}׃w[w0pTQzQ8O`AH?\䣕&2qֳiE
6;|!"_1]cj͈gPz5Q_PU3L&$QۏVXaoT!}U9,xev<C%P?!G|ݭ[Som' A Csjj۳ dY<&h  E6*R2KIcY,Dmsr:q́*h%4nڮ-  rK'!E[ƩD'tZ4*,ŭ^=mMJij˨bE's
:[H{q}"Lm.]?D	ҞeqRС&uhu/{4bxL~bH,{Av4x<i<I!JK膅anK%pȟ1&4⌹XU)&ǖn'3APZڳ+ҊȎɘB-Yd~lg|e}ؗ"!]k-TN<_Yڸ9.k\?Tq2@hT1{()qKSA.UG:dZA~#*'b|&09}h8Eى>ge80K轗2bq/Q('QrB%4j0=yAD0f쑆Ɉbá.=,=]r!G6u.đF"SC$bS U@lQ^cֱls(daR"iw(+{GWwlf)^-Bq)cA5;&Cw^xj<*;[ ah0E5HOAS7Hdu:Vlr"T4OT_4k$ɅNđVT_x6X"f+':f9LՊr&N8	Z֐U:	yw~o}V`y$r]㏏)ߠ@xckSkv=ĵ%I_L~l}B[?w%g`HPjX_NMBBʹƒ2N*x٘%74ld-,/殬sj3T\*P0
A*~49j<*vfvRu4jf5Wǽ`5C}ow0z]ZaxTPb)NuM,-?^SP:Y@3HK"야QD+q{1/^F6%~iޗNۃ}:$GřBBV1׌NJ\h>}A jKI,ǔ\ADg|^V=qLwt#oPČib][!sMS5Es`ɛ,R2:3݇O:@!.:0nԻaJ!ը<b;ҚQׁc`m}ML1Ln,kgqMSA4߰pDPltCt(·OvgV߭[o'FkpC(<Uv4K0dfvwIH O
qbw8(iUWck]Ϧ	.	Dm@OvwZQ6MXtHkN;H-u!%9dg$-[(zՌf5WcJ%_@N%!|,(*,WӁ~8{`gڗ/T, lu򡣨eCj^~ڴbIȭkh]J8;vP%ԝN`ߢPXkxL#nRGƣ9wd[2_3@q:[!I3ϚZ M
9DH	:j M1 W'/ES9*Z D-qh[h~+;r~8n`;7[)?b~#%gp3%[zǣ58(r1i~b'kp_TDLSwȥԊe6iqu~iCFN(u(/UF록_D*e{n+-X[+!QXv&3uy`HkQkq%<*RsԄDIw6coN gGJWqxO,ϓ4@Q_[RM_vSaY . po{]S*SNyDlKktNvLOo@Qru6׵ՆKw{{umrc#SCeW%F9,@E?[a<q<m,1C͟7z.wߴ8Gע8
g!I)+)~
l#X]l4cy\$FLg"0Ẹ
Ki<5%s9N~:N&N_ SiepXy%
vLsEJ+fKgc^ )t$	zM`t=@)hQ-xˀr:oFlc48M FFՉm! rrq,yÝtGW4Ń,Opz>Ǿepf	8ۚE`z8xHUU /*l Hk@B`WԴMs(?"*2s\%(,4nȱ[,"˟JIMYj/80fU:P%AgZ'A.*f ?et!y^!RUTg9,+`FKU!9%	+: cc06d[ͮB<
7X^X\yZxڧXZ֎vL.x}-xӍʽC? BލX~NV731Il?RLEi
:V	_;;O8FkP!p.K~MQƴt-]{`7q`uKf~v¡33I@pPq#cbKStU]d@늷#ٝHbDAT
@S3*֚n{j7Eb06a:[{"Ȕ}>@Мiff\AǶf37 @wp_;Op8Lgʴa==  P>6䱡+؝_I0"F3}&v:6FǴ~MO1F8Cw 4.E	ؒ&x̌ꯦ|Fm98H6l0iH'U6pw$)Hb uz90Ko(7\ǵ0kCj[[^O*aoF#"b:ِ)tI)f&Ca
rMGnyu(V[>'3v8q~xR}eHZHϤ9YcgY>oG׷ޖ#kĤ+(~yQᙈA\ˎ2Hƥ91#c9O
msm։бN#Aט
_RHGۘ갰++/
iM0| _Hj2WF00;xuynp9{Q;]26H:+<K*/ź>3m*`(Hr 6shbi l0OE,Fe06h|%bkUiIvfa=?+ݗ'8gs@-W1~q)(ĺ݉Qah8+vE57T3甔[P.CkYq/ 0&ǚDEӉ6m^6X[6b,WR50xH,ᬚa:FzmZ`^'~{,'	`j Wm1s]au_0֫Ń_[!yPZ9HBJbT]C Z㘦fjWO] 5O96M,A6B9kE!C9 8 HdJԙr:Ubn/XnXN>7;YQd;75	I1FУ
QpAq6JLOhi8Z+IOQ
U~\#UdZo<o:܄y@BQ$=qi[ PЭCFiERG ms9ju{Du ^;oqy'1y"$@f:+IRWJګ,m{e	"x f(r4U+E|ڙ2F
Ċak5OGNMʡ]vvF5T+cdزm;=.YqLt` XH jL`.D6GVJ
Coץ@%04{fŤ) ZN6JBTHb".NL6.h\ jæ'䌆,j9%piggORׅĶRjl@gj{bOE	ŵN
tEˊQ*3Si$npQuԊZNcF-<]`#n4n:C
clC
7AWi4:n_x*bzl!U}2JY(0~68JsLx;j@)y\ڔ7c掾jl^9@*Hw/ͷQH[vuh7pUM5,-Nus;`
7G!۰so$O"%w\Ta`'`7(!]3\: >߉a1ݕ,LwwDLd@?\=	92I*'o939lMX1{Á2_yC@1NwnP)x0҈6dZfp#b#@!ac$]0T7xJ!Aс1g3,EfPxm!%8D@Js SK-"F/ CXwː4>A8u%Zܟ˶y)E(A]{U&X1 EoZoY2vE[Fiz.-Nz<((3WiSZNӡluceA %[@ t l/8t*$)%	ACZLwofz}2wx0
!EiT2]'XghNiHv!0xHGSq߶Wrp?F2,w`f. 5I[mP@MYLk ӛyc5?46CK|"j:nUD7Qe쫆ɷ;<ӓ$UҼ>xJT4Np@`[cgU5o@5(C!`J*x1pQ80cob=0"ƱEԯl%4ImzJAu<JpJG*IEz:MgHGG2ɝI̭|fS]ˏfLcqCEp[ _&΅;m<7V{iX--X!R{I4T؊W/wl҂ |l~A/> t
loEC<v߶~OܷGݞZw?o_ܷ۟'7wWV1cfkR8#?3/;]=->Ik9Py{|j3j'm-{Sx^sw9LUqT2=Ggs18<]L\LVHO-[kO'>*hOFbu|
;9y%${fMStLcǩSm״KdlWUA`BeG&К]LMW
ҫy+i_'l s0Tdn4)0}sesDYD)qKDte˵HSዘ)gud'}ݠUP`Tc>`ࢋ q:]9򽐇&k3Q*A"ʰ?랎Ln_af*k@%*6e$UAUY5kkĔN-}m|%tzz36sp_P|k0o@FB@6!\|u2%ƙUx4jQ#j0o5*Y557pm$v=8qn¦\7TguAY NY4Oj
3SY"Bt bD6tTwчaB]a,bU8`||"rJ`~I4Yb;~?]AˎGpg2ӯ2>Q߄3	j5'\C 7Ck[;N'@;RnS*Po#A1'wŝQi9HZ8}cϣG>F$F4yCMGL}ӈEɱtn'ǡCOvp_HF/7ǿdF|E]r)ߠ>f%)\&6ckf11؎R1)p4SY𳀻Fasf7s&}GUFChQv=NǹiFSRo`yXc碡Zz(Nn?laQA*RR
Rކ3N\rPkc@xYPYƄ\bPa93κ
IgqՂ" 
Q\?rsHЗ;E(8K[g;c1YI!R*XIz<˺hQ|32^r+ȳiӚYޕ%gJkU701|\,v8Mn-oֻHs3C+agY`(*uBBaH3"r@p>R5BIQz
XG@ѯ,瀢w.Q\3
SI4bրQx(buHh]Vqj.DaPL/e<A^GSxF(RMYOB< BG?%!~àB^~~}*2QdA!Fȱ~X3Bv5MDÆCf9I.f0*U|VIhL(:u^b͟soa9(q=ceӋ2#ްmQ#Hi"0;IȅEe~eUC.:~}l4,O:< 4s' QE-#/F%ECk[ ;*WAE%([FC]E)O>$62bOI]0-;mvqE@r6WzYY:OgVPmX5WMZʪy8,=yD̇0s;k!1g7bC$2D^P0]yrqp8{En&s04ڢ،Sp]BsVѼc	olh̩QIOVl bbnϲ4tW}miЎl<X67ә88)q"9x)HֲQƚ*?T8<LKE<YY=6Z9A *)&^f/p%UcXy5WABte8J'vDWhWW=.6'CT"o1="D> ڢGm&KGqGBзTFEt#I;04:z6Oh.֠]TKL	CTv G|c1)0C8~bCd,cO'[FUciKkel{cΆE&r;gϲAss 	J?~iI#ZAZe0aZy(<TpgG&i&[L)g'|g]N@	PLa>1VlyR%h>E灁58q@Ba&^$ u4$lJhZ;Y&akdX`.o.WR0bֱ,2s]G+waȘ%¿iV즈)+S0|t^:fC
Q0a!0A1  0:s#e`sxLKXK锈"-VAiYpBUkOOu¹MS VPQY*f5
PU\]6uMT-,IrjƇ>~J[V"KbhtBbl@>H{ iSA">S3{fy^q$#I	_pR|:vH;`|dTAyMO>
3p($-֩Q*hLf2l,j)_3%E܍;"2Y<E*4rOHQX4/م*Hf,!×Rd@ZWOETz>Ł19\ X癈]vÚwa9a&ሇ	gk<9ASU5--0E")i[,'٢#{|rE;u,`y)!W5ĶU6xjsjZA1q-4ՙ0e_NJq(,:(n<Q Er(>|ӡِ{[fވҒ!楼xErTVV2e}_rxN^H
ڨp_N#0r'!:eSSBrCʸPIҙu>[AUʿ<L#m$5I"|a݁IYDe>"Ll LN42S>f8i`fQɻ`Dz3"+u`H#9BܡBa&fD2M' PB<.#([$( gx-!q%B(A7lڲP"L $I
\j:ӷpq9tέgex+ `i-ԆQó=Bt@4ƫ4L;R96Zv{݀
|Lk3+9ŪGqz!yh:35i>U(qd8_,kn}RmX2|t||}qfߨYa5V~sm"9_xaKkQ5q|{c2NŬnEn	r<"3,.rfY)(Jg\tɡ(龦Ѝ&v'om'YrnuzgB|d5CVbuuU{\<A*Ϛk<,"ֈީft¹e00,~q@iޖ)Ebd՛`[p9ΏͭF.;ت!D6?8-yfBQ#X"aW!C4⠨5"Fq.0/fV焚cuht]bjv}#x)XDw3HjxTĐu<d4lhDNw3e
V}wJRNf;ɘ<zaݟ8@Q`RYejEOR7Mq4)eyKa3X)B));lx^R#
hlۖ}C|0Ԁm 4JM;ϲdTe?h1T5{@iNrܳuZP[gy|g[p}CdFqufy.9P:ZA+!c6:M.jTkK)xD Ex$	4m\3Db󄟬Q/f+FA(F\z! jmڻ Qsj߶ǭ=._x37ףZYa4"y
VUyUuer%o3/$TCJn`dg	K1=C1荼ʮEݓj,CJgQnf٢9
ϳme2NJO5=A׭gSq>L K2DL$+ɘƎBߟ/SX}DNmՅB+ k%քbYYwiM^,]',[->Rc/0Pǂkq/D8]"kQ>K$DL,;0FxK@(6Ԟt_FpD97_,lic&+bv[/Wpň5$O\v&~V^F+j1ͺ(M?|eT"!tmKBnΣPxewzlE!TGJ0-/a1`eҐhbpΥqז]sYܙ1ضmfxY8͌afxlr۾H%ժhy`G|*NdkG:HaBIbV}c\{fϭ6<}꿃r5yb;CϜAMSj.BPN6THv`bdVX-&*9!d[  P5¹o;D[UA{2gY!G>cPl1@.((B	At&BDW:tSYⅵ2jf%3TLR͙X\?C7C2 ij5	O)G6x+>yy3ӛk/P!փNX jY4pLQ{dkHN|Cj[GM:h\'Tr ڴMg_.AzִXFhOZWx;hAD*2#']SPz4&Cz~()@(IS !V7+6Fw6
0tĔx	\oC!S8QS`wIoMHyW60e1aV^`JɁJlL?Dd
m& aq^#4Ee8rTX%36X	;,gy/-@ĸ6KkcmJp+31$b-GA2/:4Un31.b>*u|x.&%9V*knN՞,Jru-Y?G"hJxrXO^fYD@ѦÖV||Xe{#+9&!Q]q3@h@!Z䓷kiP~iK:c5jY|FC2 ?OdΥĞ[Z>Y+$a) 3K_i%)\Gx
u2Azjj	cֱY˥JBn.={_uwN	'H!.q$yfCt)GxwL-C"LqTsu%:"}f"" 'zMP&|
Eu4-rLQǩ;a+}h=+PMc%7,v9*s*`0_l@J^h8㘇՝'4MgLZHT_X|{Ώ`;;F~N]Q*}a_E%q8gaљpt#iGH<lZZ'< Ӊ	"\!Lcp%& 	6.K.iE.*!7a]:G֦lCL ?콆99>L`*|/ވ3 ᬭ'-3t~oLwKΡuT<!ټ*$7<<{#6^Pս(k_5U3%jTccJL9tFyĪzՁV}:Qi\mEIFnCA]Wm->9T>VV>V$T88:Wփ55k!u"Ҿ.r]
P!6cU:nWIϧ|Đj	uU`[G=U3`X;|9ه?/GxT.G/$[^EE`=5&f47.Xz[jQڻq`Y6!.2ּ6oḟ;/%2Uk+J{b&𺵪 mW#=٩Bp`4ꬶ)uUFxj=DsrZ[4IaTÛt:cHfB;z4Ac_`(.w Q$7/p,`w(3N 0ҁQoh?B.d΄Fg|3
3-9Qm-՟DQ-UV^8yQ訍!D!;aM:yI$dPvNjU1o%7-f%!5[f
2m䯈&B$FK)	u7PWu+\VLtP9+>W&K[SiR_/ͯaKpED Q%G+V8)@=F 5:=u¹L]bmCn`1FF9v4'ae\tf:,˃5Q+b۶{mol1|M:ov<d _YWr&}!"QNЧA<VܲbF z`[
vl WsSK<W^rm`J&PuqRt~"|WV"^usddx%:Szs6-hf~%٩|Ew%l9RQbV8&I;S`q"B12=PJ(;K?h@ܣ-F	$IŲ߬;Oj$7KAm#~q+-be`{*[	"
x}p߼M9%uW䋊*BZq4{NvV' gpᑘXam+}4Q^^iCs"NߣGWwOk<?uT]W{ǯ'&l])j>e%1"M<r4GenCrcX
72'=$">c L0C\-eGo|/2LK-!kvլJ29Y_KP~X}WS>#1綒jmӅú2{i5ļ+J+¾4'Xdx[L$kmr[#HAnput b7V}Ґo[~%YiHl@T,<"Z@|0:鰞iҀ
$:ie6|o)MÌa+z>2}7$KT	3_]6=SV)
2 cM`}58Ra*>eVeKƔQE3KY,G:LCiE)=NSR͵Cѳ濱_WB" h`M0Sb-	E0ۄd#"VH/vgz[-jyjYMP$_s7͓nf#ٻڶܭu4mW>
Zvyٝ(0jAs<59k*Lu[y uцG-!*kX*^Sr?5\Qb+='ȲБkjYA#t+hgW4TnugjcR.=2Goӎ\n,~&
~i=>Ш7hԨOv PAOedv捣'u,(I㟟ԭAfQKz6;߳(#6ٽc	]zԼ=k8Wa7+4\e$lb萿9p>K`>+U $*SB֫dv|}Li_Np:aF`eWi\)]Fqu4qԐ/F*"p)an1ْ[{,cUf@QcGGͲmQOk?L4.G<۱aa =#)MNrEͅgԴx<0ģadUT޾񔛂9	_;'QZ`@uݝ& R:lkG%뾁I`?EߘKDZM>JT27*TxTwV:2O
f=2|53L4f*lCPt?A/^UPO#8ߑ'Z@FtA|uy{2\;(Mw7%Ax2DZ)5
j*PD,V($9RYS%r^YP2H08И~D"
M6=4Wăc@`iwt eND\ldZهy	kVժ2LL~	tVFzPͳZ%ףf:{/RI.1J,I 	l9`6ĭMfܖ남NGUňul#FWSvH@O6u6%iV-?.qu3ڡz5s!)@v;`'bN3NA
=I29r&![I1tb7ϰ%;AƁt#x/SzS{qIXφp4MSБ]DNn,ZV4l~IIuߊ[IqEWlS-T4	!h4Yy
j6a`8ra3;f7BT1Պ8	A.r*uct".~@),8_C$@W% *Hx=()Ky42h2Vi@S5ABd*!u2MXʫfFcWMB'҇d;֫2˴z̀66akB5=*ǍEZEڢi%w0n]4ٶNّͭOݲ>_Zs9V||kEШr`|	c%Ti%gMX
0=C8*2j!@׃Vz<;;}E*{K7_x鍄lRֽ,قpi2ǰ_sѪ/hg5VhFP+,wz*[V;n ~t eZ7t~VG>!Bҝ<kV)Cx+`A֚:aeG Z34ʹ;_bXFFYoMj!/_d<&g/@Ee
K2A3AZ8Gu'J99@c&x]aMS5TlfM<ؼ2![1?V*\m<!ئ7:$qJ:0w2w4M{f8؊VRasAOEǆac^TFS>Dp[unw~@|?ѸcGCzزFK{.g&/'P
f`Ƣ'V̓L'U0lv<eK.wse_(r` Q_5 rKYYwYnm[]2YQM;ܚH.:RΪTDwxX(Ad@(_1Rq1Nr-wJ1uAm Flaacock%i+jV7߬Z+"@͔QߠXJfTGe<jyQw	!a(rfɞ	5k1J%XJշbA
up_MS[QNH w٨aoF\<RBl5^͛Þ*iF \MYڱF`oMѴ;XnwtzًZ<xޜ.&=eRA5cCٴ@T1X:XifbMS02z6z.yوc0:A蔁F68ڢvvnT<rZgA}STkT
>hug@vPk$Un5F]12"DՃ	"x:.z@EdZGAs//4R+ǳL֟)5l>cEwZxoGtOɗ_`=KQ.b1R)gVo|j_L\0I?MaUZ1	8mMW|*UXyT\fzPǗ/NUcApf[VZOWȽ<o`/uyEi
Vs{߀M8vzFÛ BZ)3-@>HaU	otMaL`Ft3EmQjRS7){ZVpCH)X̳`OPdu*-<J0k8_:ↃWSi~	o !j6"TZ8T| B@_`.Fx;F<S<FKQHQRsjM% v:Ƿonx_b_	4~BXmŞtԎT`}}|x&;*Cv~#*ıY'#ބQ|\H8U`Iy͐JrH\x߲sԊz	QshqEHaclh]v,AAqůe@v:(`>ئ8gg
vxQw
ΔWX RG|uBz%țY{YѬXQ_
imcl>!B%)V٠Il`?k_P'tb1xecz2]\ ' iZnGt0Kmaf
Sw;1ܕe7.s?3hWB1_ln=~OZ-8z^$qDB 6&Y@)Ww,f+Uk^םs#/kCj%ĐKAK̸%2;촻c&VhWD:Jϫr67~,3wX	4{9c3Aֿ=xBZ8aRM\MW[b7c|͏M Z4=Fs&eֶ.S-rab+y.sZV7ׇk5
"_{Ld
&yccCav>ȁnMDnj2|#[%H#x>f$J"le$͓/:ЖiD趂τs~/5E	F=
rTi.Pw_V7).@kXntݼI7*lg.W5UJlus0Q8S4NkBUӍDniIwާL;>>f!n,/Jk`v:j;E]DhWj!Cf%v|H5ȃj6BD_,P,j [#8&V]zm3\nN/_H\m9XCS;hVⰇĵNt  @jh^a9
W63¦D$fc.";YFR"ɏ9vfRa<ɮS/'gYsH5uF`8%j~sߤ89I-(RPEuP859RϣL9~ @)!(=es ]m3/@;kOtZKJp42G{f
vZ1`GWȷZ6פ/?G1?2ԭs42LGy\n5g4bzڍ4嵔O2+)0u;+h¥'0f=3kD8[kYi4.qxJbҴRoUVp)jtYB5.G8</c-PIt"D/r*}V]-|c_ɧK/E67io]+ò:tA gYa: =pziZgF/Lg"
%E-w`U.Ch7eCn#!xrBIC3bz@]Qa#8L?U R58MQ`]8!E@&1(a=آXo7T0q)%Yi2|QkERA.dU<΢e4#r>mhe{U&7f:ۘ诤~z@ѫ|OSk8ۜyv<ca"0h.>!؞Q.j4eDCpUeM$ѣmcw9-Gxxb<&hȣGO&b!x(8f;4szq/סwKWDF \0sM1)W6G9KGQ4|8\hU#BY>Xzha*H
}2cJ+F`"du֔p5IH&R+ʖhiGm~ӣQN{xrB0j}{99cU_D:haFv=E	8%`g<,<$贿tĊ#e2^yQsO i
OޡzS-oE>$V'lB׻&mJNwϢ70::Br \n}az]K6`YnMMgU[J2r	3aga<:<87At 0 
C e1b8Og{b_uڶS*pF'Wѝ;F,b>$
3x`lQ, Q6k0^bc`%["n«E_OwdPл3#܂	[ʅxb<?E<?V}	K26(]ӰG#dxyU4[XDy)6 B}NҫO;kO2
)r:kuiR<@lbEn"_`:&R*G~١xqF	e;ʨw'kE9,|	4U9cӛ!)u\-T?_̧lQ'N^£OT>VUvT]pEK#y)]bɋisv?S hE]><HGSHxV]bOULE]ekY}:g2Q{XmpSq3qtj~*,fS:zPcd@!+c-,ǣ"w`?M,<3xKzvV$7kNÊ,l	;@̗aw cw5|<	y2LaP  $d2&FHv**l_h6Bz,L`0q[nft'o5[o0E?3u"`BdWqxO|dI\ܵ$fA7ͧh3O#RyBS5mq .Ԅn]604)K0UPvLsCpw\ 0'^of9XD<l)3C(<G>8z'=a oEddisK0Eq0nߠzzl 5=Gntl̮gdNb`HsS8cX=W_!o:ŤBPMKo4ή
oE)qZ#j.xuy8Z'Dn
"4aXx"a5*}SUܥ-vᰲ1	Z"j	U:|b2캷=M3IDc'3sBlV(Lrs+Yws>J:kѶ8"/;#a6{X!ݛQ?}J`1oacLTM  pw~'2'kU*	UCiq6[kd z`YQ&*Uy
%x1fmv*Khw<`g'(wߵա:u{C6Ļm%&kfdf/&ݴIXT>hW{bS<)A|jŢpPd:4adUezbǹBSpƌnJ[yˏ.$¹Lu]eaLJ%`ECΛ/鵴R655)i[h}uNj0;Dj`LTGXd$~R1);}{R-Ѓ'BKBX1!<[쒱%BqGD1;:A@BR"TDQne84@8\@o}[nPO>j{X_,adfCCT{f4uҧxzE'c+Bņi22cOrNl{~g S!Xb4c<d1O1^)pe@ocY\Aitk V	<'
tb!y2&qN<2,>wr rQٽ4 fmX\#BY5ozEIv #o^qp:h(=u_Y8U<9@vGAx@oY㮜}n40p<"@M~=Zh6ϣU wr
= wQfp4eB3/1(:7 ͢iӼsZv~Z'}|H P8#tsfh4CsnЎ:o=Nɬ/<jw{vmMH
ztz]@nW-8 ~פx[N?pA"6QAz'o~!mA2/>\yw5jǡjnHHxeXy13t[яs';铠-ZORt㮙v}5[߄,'XK+/޾Q`	cTqi
MކzYw,u> .RAW eOw1>	(lZ~3&~EaҦe3+aFy&kL6;`zQp/]r&~$Hq: Ci&tJ)g7?aNKDRdy-ȏOၖ [qd߾bDCC#DQWl%25߂ YlE.hf_ZT^q=VALG[
=l(4,t&.Hf7ˏ]
y/ 1؄\ڑOiK6a]'hvD	>W(~<
z@gq,$Cax4x,3ɐo<A4a/3a	OWCp*ЄЛp^	)s>!k\1Ck]O8AT:A\5huv[tNdStDT-=uҋG[]-	dE%
.Yvv׹+A*(hߵ/VIEԮޢ*?8QwK+>FIUsxv`ٽR- U
mobz76	H@M&npiC/3(S;mww! ck)3Ep|7&ASJƕ4xF6]:&[cb)ƧD$iR$*<f6u9l*P*<^ɸBK*8+k̺%"SSB]EUr[VF:JfMԯT/3 4L]qۇzXFg{QI	V<
}hR8DR8Fk5	o\3Crk<,qgʎ]-͏!҈RgM{Nxɕ -2/HъUxp I/p&mm&jqJ kSDE'd-gNa1/_9Łw8xK?_fμ&4Xrxvtz9<ū'QLw䬜GJ8, r R0Ea7%G^{vċ).]gTԻ7/)УR+d9F<M/m,K[m,}#f[#yZVBE^]YnZKaw]Brl
QË])"N
cM+'Q8=N$p.͊Ȟg>b<%*30nlp\H5m4~GEʭ)l	_:d]GZ'>ABxH+Ofq&↴1fu-	vp1GF[VϴpEYDbԻZ07c.eX'yepy9ʎs9:+^fӜOPD-!;=f;$ν!:4Pg1MGR㩕f=`fw
,1m~>R6_jN,s+ꃽv憎m~_uW7,/1.0
`{] Zńº>Z[x.DZK)`a?sAgG_7aWQ4	>_#.a =,o/;bIBX\aaTfņy= 3@ʠbqnfdjCKw{nFa!u)Ɛ$}I@4<	gLZoG1٣2^O,ﾃN~#Cm(M8޳I$a
Mf>-܉edWu>`6b`Ai:`):
qK\`t~km"Ryh	GIPcauӍ2J!L`j:~k)mdk~}+~JzY5ܞVļi:9{8!h{
+f_Oh>>wƥUNq<M˭,3;cf؋O)vy,z8nj!JU:r'hY%PD*Cn	 ;@tWkKD+"+E5)M4 	@b-3jNTގb5^%[1>s.&)i('fni|>ǜ&=O^8OGx9Kd]+Eh""1I=x0keȿxw*k.T?Lgh)*8[zxt[0Dso-Ư3R#z\0>L7Zm#90;Dղe[Z,)9ۀk^C|.CG]?("/]ȫiLߑV&I ͓=4mu31{W_곎uKc\A,[嫳VBLISfsU'=7JRiiS
ɬ9U#}9?TGKHq`NdlVύ2Vi?QG#aਃaOP,h<Tbz U1"-"F^f~n4ζ=KoФG;dV1LO:u2kx5A)/Ћ8W\'MTW5Q{`#iբp.q("k?{!F>3fiE6`D͔ZV(<YC䭙(hBhFI\,a[)M$a
͠ዼs<BZU64bgFZO><#z}/pv9׷X"wISu{=i٫㸬`\jH{?Z6,Crp`&,(QWv
®/(T<kV--<WO%~rQ\{_.>kT~}j}9\i"ǥE?cS2QmuL4DMDnTQ yEv:@CRi`<~/o&ƀA;TqjniIg9s#0!s*}뉽:od6rJFNwk@"=$")fZMCeEMyZ;CnMaCټ4KGVF),h\E6B˛Yb;(a*r[w ς32!(MFQ*-\DЂӍ& 8rtKy ̄$6M)[AYЏ9D{ rH9aGt/[{G5UuΣu0OV
qHWm2zMO1P~ΔTtJ Y-Қ$"2$䊅]ɰQwE(6ڦy" 1fM17a~[9JQy#1cM>ĉ$s4q5C8YvAkNGy|LP0i :Eg٥>4;gʼZZoҰs΅WŔ#R-[''1+Ay;S>(Mpk`2gW&צWѼo7J\>z{-0aBKޣFRD߹Rq-pF9.s^2' RQy6KlQk=k-{>An2Ey.F~	uXX0:Q@Aa-VdQG(H	eOtwj	
1UQƜ1Űi a{*{Qy^=xy8 N[&0}kG\Ycgp&'qa鍧ѐW}ӽ|޼S'e \7Lg|c=31%]f"76|gE-5Gg.)d{wA]kuhtLdKP`ȣn֪˨S>=U))n/-XEc	7'kK"ea$uM"{`eK軮'gwvρƥU;P>ԪSP3<~<_
"c"@$; tM\-zH&E{u}{vyzyA(\rlՒji<up\=#
qR(g,eʊX(J<Ƨ%	?2~6hzmܽUREY`+A0:]P&YB2E/.g;cd>C!g}}^eNZ?g3aC8d"8nJFN71ztc1/,@g27UR>z+OŸgwqȊbZFPoc&ʫK|ǩ%eedƒK\jۂzi%e|&0~HJ_<<$e_ R>8[RI;3*
q
YVR&Rͯ*,eV&q~ۮjyF=pM->(y&NqTkgaw(z]{0jɹI2XgI/UpN9igupVe>^0B M%TҎ#2G솮MiP?L0cB|乀MJK012uF|O,ٸ}֪giȀ,q!Т݇EΉenj}׻9b8p
rӆR[itg>уp};>Ki7Q	 h&;<Smmɯ^pu=zV_w?n.jͻ,G>jb5W|Rj?dύy )W;9Xb_ޙ'_kY+ }]m<$6։S Bb^SEuNgB
rfBxhz/14b2lgIi C8AJ,fó Kag$t|FH
aK@6/o86Ks"ųg0&dbwxH*2c3m`'βU+F$S-QOC=Gpfj4+Dk*bH$V
 CAƯbɂ]M(PaHjik!tؖ#ǎ\Eg;qr[v6ms@;ʫzzǿXjL7%Se9,հtj'ƫjYQaj:etMESB4l?A"WagڵhR'U`>:Hj'Hnmml-d{`c	t^e	c]peYqhQaQ\7vF|GϷ^Ǝ){΅wúkz%!'R؂,`3oGSy{yN:f T"Jg7'FXM/MKBM%CLEma{[pN]eLG]0TkՉN.fCW_7GO+5YW߀Voii4b wu{QL5z'G}z ј##j֖rei:  |wך++b)F5ƽLS=_VWqK1Rˈo3rH,^H]QsĉsM[]i4kLkBs7Ѻkŋ>xQx>lq;>h1v㣤#G5lNncUx'w[SS%Vu6]V%P%M 9cl~jc7'W ڦ,畚KPryl -X΅"/7
VK(.wfRFa-٩jl>F?œ9[Y|@ϽmDEЇ쓥"]t+UWmWJX}sݓaS-,Li]JldU֩(PtbW/
g8DYZKZ.s(M4ٯbꊶE32{vsgL:Nv;FugxǇKM m)G0!kփq;vðSUR'jEgуr5_Qhc|TwyEh'J.=^dϕ	QcnE/Fy?m9. {#d'&*=[>(kRcnSNc'5xگz"֌dרgLP,-^^F^~;>﷎
Č,X#n4Q+o}q($7BԻ-u6O&<6%*f!Un,P~yF/cTaj uҶU8)FB~=9K%غ`	l`J1:et}L9w=(p{8\:υT'M
'i&ODU5Sp'hy#RO?3.
zߠK^5D3
dǁmDw&!JBl~sgmX}$<|^to38oc[Nէ|=/ƻQ~aA
q./c~D/̩ hܭCVtBMxX#+(])sFǗt`&;gwl;hr^~qJiB)Hh[i$}<%R_i',6IK\^ ʆ~3t :wIk!ȃ<#QsO82!aB'GƨuͲt<x?ҍJ()[o&vajyn/|'	l<11X쥑
dgr3mr5'6Nz$VmFJ)HU{>lO*,^&؂Quy:=_-$]'fє{ 7֓H;b:d|6x4Ã޲׃22GxRi-Ŗ6@sĆ-k,'CMXٺ PZ0 scE I\ 0g|KP[O	(J4*|I4!]~(* 09G.7r1o.>|7D;?7/kwmca;|J^FdA9Sh癞fB,HXs?6/@^`xX̹/axiCr$75S'jH%v
UafZP 'aWL 0zrQZ!.¿cEB,)~fKLPF"26sn/fBD_,rB.FGTM^xnTrӢ.䤴Sv]?E*p(	^O]>佨O%C-!|b,6@hc!8-Y0U-XmfQ/ItMJ-D8P32'{qNA옏0nEMϞ.6<	_ˀyS]#, t&>",tYigkde裒4qrYQG vW6V[*fTOF8A3hP<叕 VLR5n<31Sүx<q8Ôp4<YF&XJ+[Rw0±Вi:DY(
w \%f%lyYxVAFh
My[:Y_){Z/T+Tn*1qJ@BX(2\b0nGWrבF<.^dq2{2]jDf.f04O}u0
+{pn8aXEL=nmT{3NvŪHJl
l"}BKY}!jd#GqvL_k8:|@-F5q!eײC@=t1Gq8ˀENP,E)*jm 0"S:5t0Ɉ/>&:=:!f]}A".uDTܾ	]hԶ wZI|+GWZ{EEFAہ+;bx9ɂ5HD)#G:B0H~F@
ܝ_еjm1܂yl>X˃2Zm.Zxa5$nVq]ŸN:q2ѕwzy)*ņ%
8>m}*aC1I`\rКK^땧iiQƠ[|0>7؆lypʒ9E *n	M66jdHBy#-6) ~&B'Wiɺ1+J	o/ZPߵ,wZpW9|sH@Azѽ/ATq Xb5ܹk*j"}N§!)+hlG[5aD#W_Q*޵-dMN	G"Z=hw(WuJ<s8W7|Q+1nVܾIܗ1Xh『 R%:
4bV-0)Zu<n<Ed!1vbkILl|&Iַ3%c[Lű ~=zmG>=ͽou[MH730H'IE(@Ge#2Dxc)foLQǐSmto۴K}CzC/ q׵EplN.M\YORg6ne<X2T(´'vz0cg3̤;N`93GrI
~wvl|TC1R;_bӄ'$Eޣ{6zՃeoK'/.QHwPJ0p:$(l'`@8뾳R+ߋi+<?z((
x2l\F|3=oska4Tͮ@RhY	odsԉ=0?"v5VD$K\'4،Mv7RY³PjYVx\`#o('Țu"bPi'0%/F)Q]FXOTӲ3?`.l/&ңq\gɛnYxݧtZG
XoJQ?0"XQ$5,8	t2.T,n"
q&ӆR\Vuos,Ín7Dp)mdGPg.>z\|ظ*?B;:xzm/uLePqx]eVseV(RW!Fr'}7b`RAl?!lⓜkA<e|Jl:Q^"p\h{@ݝ#*f0fhafͻ,3Nb8߄8hJa`Ȓr|.+ǱꃒheY8>9mUq/
y\R;|:CvAt-iT	4u8nvcfg*_UK_`GQH¡ޡAMsNN
!#s)
c*@Ҕ&
,s?p`fndҒ%/эҋmc=*X*"el)q:>kq?@V^gsP W˦*
!Ì$ `YzG
/>-\r˳ǔ"HxK͓w(7LBI,&<W2h^2%z*L|E˛y=]\˿/<+ }ZAl!.&>-ΥJ3 	`w1&j-a󊝖y*4&nd}r2c5[0J/T8<|\V$?RST"ÉToYtyuv{GG/w~"s>rq+8@FǢ||}~*wOe*k́i2׷0Dḍ<sAb}ڄfz&~-RO5c)3B٥T&AAg|!ދn.!oF7DJk??[@Gz"è_@h*7;xU=Ɠ<x|'ت)%՟T1z1UݱEj;|	q$V]I+_EVCϖ;whmh1Uͳ';RoI>>"/
~b{)7O=Aت$7?FNni7#p2_XW;|U2Lu:'@RJe8w1Re4Z6 PR6u_,!%1н;'偉Ӂmo?vTL	yI_#yi仐P_Ky${AA)vH0D/gˁcC_-IϬe|)MJg1
lCu[[wgyA$@|O.û g
f!D\!Wonnj̓!YȈmw|ۉOokh="8W`6GLxRV7To;?c=ڣ/r!@\F1k]vTonF";+3X <=@t:t3VDnMmw{ݒyNJ'$Q(NWHR:ǣOVyF䋓kCg	j)y=ER\m;[.$B;kڛf|[OyGRt~<k]s#厣1]7<N?L˷n4Vڬx>(
)H)3=);alǞXlYCD_}A>Jf7ř(0`iUߪ`^ OjP_4</+a㷄sg%gDx[]Pl\qY6ˡ(s(^R|[,H>L 3%$,~ѥ!.(!?e7CjTVuGbtOt_L'mK	fI9v9]ŒњMǃC
M zҭ5G#FѬVѕⲆ\rI!5ÛLqؗb#`]~J,gkACTѹ:0Kg	n;ho~#+Ï^~#1(1Hv99 QإUVJ`ƔˁN\3.)5.̽9ө;}`xuv:ںbܡhS`LhZAJ\)NF{@8el{.aClS(g,2z|2I=ɎWi++?ѣ)zbÊMXN~քFeѹv+lD^_=[-^Rc2gց M,Nzb*eZ 6^ЯrS(Zm	QӪji!r\[a
8#Pիˀbrv⥖&NG>`K%huv[$-.⍔LRf;f>.XAUioY]]w\@!Kh3(*Adu]0bb'N2fg0=7L>)UdTXH}&͐#qTpiv/Yj,'cGhOKB-5튣-juYlVvL+LBOP a8Wa''uQ5@jL|xrfJsR^ЃW]:<vLG+.YYo0>2ڀy)CA/.sC#>H	vo+V9F1dMѐddZ=d"O
${n޺rB39$9`~O6O9`Ovr4VW$V1_V2SƎ87F[j6|#Jm8"kQ:L?XrtFʌ&:t|g`>Nn%츆YDh3UVZu<@d E@G])k&錮I=waڪE6&{-٭t3AvyBiǊ8˲æۼ[R0\fZNz=Aշ=yFtKRӋa8$L+34Ƥl!,vRF
cEjpDkגt+kpee't	?-rWd"xI]p4!ݻH5Q/A|2pB"{=&Q3>vZySolOyT`Fi!3{'{	s?0br '=Jf84_@
l"t	*'aqlt(4\6q],!׈)LC9 Rp¢6/;nݯx@|PSQxw\.3HT>_(nBqLG"h4AwNYm{]Ǳ1ރf& :/`/cMhtXrbU||usBΧgZ$(3pp	,pل~s'{[	kMK?i '
-pXPyE.mV^%9ފ+h(TpG̹lXE0z(a1bbh<#n4}
+EFUޮkFs.`1SEcy똞7=U㋳h<G1F9N.Kg!.5ai⟻a.$潁ZD	axHwXL9W؎P,7VKeiJjA$;IیR u:wAJx=F]MQmlWcfT'p<Q{0KFEY. ۗwwYHXl]MxcVQ{[rfsMa[݊V'<qև=C 1;c{LIAq1DXҵwBYՃ1EV:,P)(j;vٲ8ro_P&t@4{ǹIhF)6;?e̂CzbWXxM
fU 4ǵw?OAOxdzpi @S!i%D'xazr&&sKl+?=Yzp"֦ypx؁s \aa4rpY\C\X0.|=肎ɉNV!aXLJn oȊt.| X'6ktEZm[MtڲH+)T=l tP?pbfA{`9||
|51'v=8zĄ2`M:mp1:&^(O	[1QŇİlV0!$;NtwO8a2__PnլZv/BX&be{n.c4.忲  1@bmR6jp6:uKY~edP#f^Iib
7 j_TuYA3kìK]yǾb(7նFΒN;!A9		J9D.3$*돌<Y_CuZ}퍈xZ2%mtl3
6k%=l9g7,ZZ$P[
EQ/'+n<wdK4sgrf,"0ܓz>^rrx)!ZIu[ 2+%*ǹayxi
JM7[+s
9 ӈ3iD9DeQI!$ʀiW:˗ɣ<;TgL/XЇ߇ƓjޭҮXs~a	V#a5d;4[[}^3F@MfoZh#)/r)µ= XX*Jʂv+#<Eu$2FQI̃j;^%AnHG'7Gi乌ǸLQl6d9
^fАjٙ$AYf/MKusAwev`KTl>v4֎V{̏x.dTȌF	ʻh1y3p'ǹz;Zge)ff`zJ2Lf/Psk*G)cNgAtDkxYiy/ˈ J?r`ɿ8LXH91u)dh⩠q^a9_Rhc30Rf-V~a)j	n,@yg
.sy9NӸP  DW?Te\X]ݎ)E\}xOK*E~pwYozGuWm̮c~N*You}6jwb2h?WQ0CX::,IqQVYKyYby^~#=lHQU>o֞7sskVkk
Jӄ&F#DZ,2õO-pǻǨ].qml"XE[ϧjX?EOjEiqCDݘ赈7;;NAz8>PׯЌJ"jڈ%eJ	B(.iq}[9WF*,a{[kStZ[]o9ëews]kgO	,5Q=^ױUd?;w2]LjMr ؙ9/#BNd̗1؊![*>CWxڧZ%sի^vUoN-w.Qj]DU}bWsD=8ů44^`Ɂ+I}?i: PnVqCd7*_Rmêe#%/+CF2p\R`PSag*H}-4=ڄz M}<Bzu޼[
7kw)*Z@cyZW>Z5˷乜,
t>/hl6Jɸ_t$TAѩEIiSh i81WNKGeƍ6Xnx2MGrB]!s6ܪ`WF})Sz|-׾3pz-bͭV&w*½Ǐ?i^'$ZkBBp>K[?||7(דz;;90(lJ?ǟ6k"f(tUXC&{G#3Fo7U;@3~2f߾PEWh\M	ޞt:_|5X+̄5:>DW>ø3e{b#_9}m[z^4¿b$KҊo?]"&vmxH`!Sr;DAS2	JiʒS-G_ܜ %7̀7ǉ(j
gu}h[0`7ީ֝rȮbKETm@?ͧ?v+U֥0z%]m^K=6]Q%rw`28["6hQ% g{|2J٣{ڊrtmˍ[#<{']v@{/ȆW,),RiYûA"g{~(>J<.Pl[ɋ+v_x23FoH/IEq_>(< 8K/DE*^+:@ʋ׾Un,0LN,&[i19I .$;ŜXsW(0stBu؎%C<9rMR-O+
"Ƭ, `@$`7Ąs
kTK8c Pi2~2,:64,0(6)[W\ ݋Oځyg𝺻&Ǒ>U1J[ZlWU{u;֯Wr瀽e:U_Xva2%l=P*}|YX'+.d;mbɼAUƖ]5耵~wף:/O}yHnaK*5S19kHczZ_=Z.`*I}Zxtxܙ=-h{xDDE_;\b"Sع>o]ʛ	G $^2X8R58p@>|  e?|PNٸ=RC,jDI3Yqz?i5RF<mw[W[Z a^=k^44\d&ѕ($Nl)loaM҂*ѩRͨX*i9	^Tej9pq̒(λ6pUIx.%\7-aԁC/ 42-iq%#P=׼K?1vd/W 'A+uMEoj[#(Oοy*}emS3bVQ	*: ~o
hG1tOP3[Ajfb/??AƯlJ֝HV'A
0n4(
w.eyî EAQ XmQҀYOC}%kYJM9^J+b1ߴ}n⚖ Z'ʌB^St?۞vtv}0;=RmkOo|" XUMuك%`?ieBCĪHLKk}dÙ<+ּ1sh!o4MQAU}'Wml5q|&`TUx4b~ܻGw^Uk݀etb:-:@<<ai:B|jj9ҭV&f<}3.޻jhL9LCS,{-: ;@q	24G;z<#omf7JM\n!Yxx3<:;ORhԇo;`qONApw_*e<A
l~eMYYh"PN8O஺rvzoZ.Dt:̊0nk:''o{DEPExE@\26txǻ']6v*0s `q(Bnۯh Ԡm|O 	0Dw= b>JZXf9Q4\ڗ{bxCV sJ 6>fVS<'Ŭ9fSfJ<{n2H1;sU+v[TLz6l)%6s6)탷x^%i#%:8CS-!ifqF[dHqpTcK%4
B,u$Ҩ`JQ1"pn+F+Ai>6cI)efg+Z&0mu2[p̦	Ix-06!)gy	%"'񌄨.;0L`}rCJ L6J,0kJ,qj$@N|" Iږy7̾ưe&h%[">sE)Q('W}lte i|>OEjFނCTffP!"W#h""1Iu(a$-\%/GidM?mQFX?JҎ^UWS+7o(iĎG׆3EjiMd
>co#Q=@=:@36)ߞ䮮I˟ DLDg_ME0#S>pjԌj!^Ab)	췠:uQ|	l1$* !`z0_p}6Zra}YO"elہZ?[ e߄]=>J,*8Z#a+at@æ޹_s]- ǳ~	?GA67"`S`CIcbmDc!۔לw)Ha;bbf5ڽ%ق+}r4?0fiu")lyvWX^uo?'?c2QaA2k<T"M+,~zBEN ȇVwסp(*X.Vhk՚hKţ5gif+O.يFPwPe8*@)@ r9F^z,\zD̎.G7wN;6j%kGbZr5
P+mK,CuxvVEʵJzaUTc}reYOlK_s;jwt6aeq \i׶թ|_AY"V_so^n|XYlǠm\7UiZT3eCg7}QMچyI{(kKzYXB+ay@2ˣn퓥(?g3ane\YoY¥1i9qV$x3Zf[WU
cHrSĒυsq49|wo0IP^OBR lxڷ%ɛݣ?Tֹޭ'/P&0ߡv^_4E4/* wj`^-}H斁	콣N!f}/(շAv$o;eZ$n:mO}v l%K|i8)j2&$*&"mū=Öy:"tƦOzowx7ϓq:\z	sr U>E|h4zMf8Fb3Cg2S[G2wy`\s_Yc@y`4cX]s9[76Ue,sp8M'}FefI]$tq5G[ZrV╣ҋvu.8yEYZݷ׭vp"ܬX[F}R^=Js:N˓ER{ n}d7gq~8]`P^Jʂ@ÆPXk6C9=ZZsnẟ*g;@)89lC5LgʧsjzR:k~|D.K;.?A03;~YBl|ǉFüpiM?37܀;7>w^\zm/H_zi?sQ/]mٗє:W[d(tF#Nj7OEjM{if|:aW!{P?_w ³w(nCX"PY9i|_Eg/_kXT*}ݧt
@azP[k=jM\<.UeW42:)8F#@j!*tKw>ƌz.WY ǴM)}ݙDPp)d_jz8\n`;;;tgЀE7NevNc:J,VA\!7K n;go 2>g	ϒD)<-I&"'η)ߗD^RJmرct]ׇU8zԤ¦t6ǒx	h{oON`Ϫ\߉ھ}JkR @8Q?>g;1GR.NTߙס	AENJ.7WE襨PޛrYx+nf2%oκUG౲À(DG)nbt<;3I
((-FDO֔>j֥!*i]޼
bUQ0D~zӛ]]FbyЌnJ
%~hR,34tf?O%v&zqbSlȈcf=U2XC7o>g'>|]YOP҉Ѱ-Y`X?gt4a&XC>C85 ^!x'1O1'tJ#T1]V %c^+ʿy\Oȉl4mvaN3YNZڍheU	3[5*S<|߅󵻳pJy<Ż8mur޻_Y;S/_+ jVNKVC5TTk`Vv ',S_Dh,ϵpHa+pFz!#\9pʲL>>he >AqG&rqLBX+
J'wLp+ы~	XD) b*a{[
ptLe1CJjOkPlU1E+"O 	V(2#
T1^c{ODb!cU(wXWeuu'b97 g8;ZcMg!@n[1c{jqJ48cfgBqF[6	/ڦ3[A m<e؏PQfF6lTߪC$}0:8^d4wFNӹ65ߵ5bEr/\Q`cd `.vq 'FN+jع5X 6sR"Ӎg,9}IL[?$OySU0r3ZyW+6/*~;yB2&u1ȣ.edFثR(O7Pp4hzh音:O+
'Ha6ցbnbqOs+C
%Z@m!2k`KymW4F%) R&IseZ*%oMCջܷxdJ4@C!Aҍ(VkAPnP"ge!,aXI6]:oZ"*H%srBidLZ``fUAE	NLƛhKl=s 2hYQtyCHM쥒sMea-tNsO{.j `rgR<S8G"^:#S0x#9;!9#Nc>w	>5
B]{9մbe1Vsb0ޑ`:)͐FbGT.D.*Cgu}RLdYc'H2
Qos%gA(tp6!,L8\Y:ai$CxCQiXR/[lēv5j*˗@W*	7CssS9, za<*|;>Kf]κR7((`S͋m6(
GN|ch$D֧Mc	P6647Ze˵i}g<
0 ;$8ۃlr(ҔY|嵷nGA)Bc*hDF@}Xa.<cD4DBѸ,5UXصJ"i$ًهM ꪚ=6l*Y8[OݜCsŧ-ToeoO9C 9dL-Rf腸teE`o anZvGep$$,*\٘blX c8B<!J^WBh2Lh6pc@i:H2!D	ԎKVpDi
-bRGmy4d,Ffnjgz{3q),i05\Q d=_rq{͈Tlsߝ|&
W0yŚ%imw'՘щ-q[M):SV8kx%J~vQ{`gv&ԱBjM.3]a?pn4>%fuG(pHq4LnɄPKg䏚=s%Dq7prV7I<ģ*#YD@ӓi*ga4PXW5 vO7"<^ج0C9)e<Pؑ80s<A8a͍$AF7tH]CH	?XGG4e/SQ|Ey1i' yYB(1f86Y`bwϝ!k\N%5eYǕ;B(JᜊlO 9mC5Qʇ8~N8IQI`ެ
]|]OSVUy=&&.@O		H)9Dxwj:^KQΛ
mnu{WR @@HmCLk:i2ѩ4TA}hڅnaiTWxLIc;W	Aa@EBuAWP _J
ϼd~iePjtsޕ8yv6gU+̄\VN0VJT@Tg&z[:ʴke@P‖a KnWQ9TX.DɽT (Q>XPX+H㡵]V+--Î]vRK[*y_sfQB6i&=dⱭ8j%3k8z2T$ôoZ/H|N̡J2Dx'an4uҳ`Na:4)7ͳ\ 2b5騮b5~TV>tt~v&Gg+	&T$8ύw:P%Ym57ʋjk;W
5rt<F[}e9K8F,;,scL@|߀yܥG/\BOHkO%5Gp|yk	^%%'Il*؍\P%6{pڂvpڋ45KjXFp!T|y7*լ#uaSn=S8 rB2CrA7[ּIHK1F#X	鋛|a,3 Zc䮘^Nkxú.%%C2LŠ+}wy	^h! S*h²L_ёTګJCDF][%TJRA6{+w-ߣG&@uw,=:'/v(HMWN`Cqc_9tU;brZ-:x>aazE{ƷB=L(&kp:n\zK4
EeEZ4F*?TOFD	 aɞ ˠ@QSWA71CV\Uz(S8QiKQL%1^;ks
^WcCJ+~jeRg	,TXCi܍R	pnn$ӏ+-4's
3`FOVA8B1yԭ ')Ts@TR(cv:cfi
3e˖uq~YB=a``ÆciĲ*1:1	"t+&e/M/0p^^`BMpH h<1ukk_# m\Iy$u+xnfF/IXM.lwn\JPm~84ER4%j1W@\FRRw6Fޖ15Tno쑅i492F`;_"pxhH3p fk'$*UL,/ƝK˲FħY]%˂]AtOb*ֽT-*ccALR/NXo1/r^>$&Tj'̓>"tp>V
yA-ϐE"\3b͡ge8v dOd@֨ܚQ'],2x7Bbja9K~sC,^8P_\Y5@űG<9PQ|Zpy ˥e`~DC|giL1pVjM<hIN&<JE29^4z0'6%
a%xAo݇$tRԇ%za6:I8ߴt>a_IcEG:\j@nǁci}˝d5t?98`DB0^2fiDKkXΤ|bKrv=`KfV4f(a|JRmWi7?Sy5ص 6蠷8ux<Sva4*d~`jv;SF02z@糖A[=ۣQ7 ēQd`f5A7?$"궎}vg#ؗk?Zg)]it6_v3>MGC{3|x!̂ 5:EY bA8ԼPج<1,~\#!р=5sP͑&)J-]%@̞ &RT5)0ismCi{)Z!Պ'I(+(ϐziT= 	"ii%#brGL	-cfɡrkvEYRq0$f,0v@$>x')K9N'<gfC3c&̨E6vIq.KmK@yII]xڏfhx2j|qv>@?~B<"Fz	b-қ2N,g8;d3؝_jz=\P#|=Lia>$F9Uٛ53:ܡH6Ёi}속1ŭ	b|P0Mx'cZ!БSh.FZnv*QCFʽ9
6wOڰ=,B36XRUqȊrC@>ov,3Џ>Hr񪻏-3,$YPTa-%+<~4~ĝ	糴uMe~1ٝ_cN B1*JG]a~Sj eO+YKzGCsds#)b!/)L- !A={ۓz\\ZN]Z\ľUص~G28&;Z=?\d).,AQ4}+@%M:ig)F D -a<ZK)ozV%C'__L{h'=Q7aWѬ;Qw\N *{'V+AGn]hFuF*- ǣ/Ve<բfvgќszuyi\ߡM+SjPSև`7TLU-?O7?fesljJH*7lƍoT9Lbנ3XLFj¾X)7҃,n$i 4__m,)ݧWS33#Ɩ(}*WET0$]6awʿauF;\C2O߶`?p';-K}=ңnRi|&biT_WxKF.	z/
?~ɞ[{GO+Ȟh0:WN+՟A+Q10mmL2t'i(BW.t)\}tE}(p>,b6fw(~/ӁoϽ]J.mCYH"|fvC4EB^^aKm)kӉ5 kw@ I%O7(yUIw-]n\spxy@\em6Qdwa,=/or9UqW!
45Qn	r]i`.K~L8h]ǖaGvVG=@YT9#`Re:5?G7H@҆_zǇU?ੵ<3$1xߧE.qA!KFK3mUdXZpO8Cco64Kx%!vޞ6k*`*2lc1Wit$p{o
WktiUG1ddlqB hPDh,1H[,cQ.JO#`%tHʀ)wDaUB^ؤp1ڽZs,aXeerN+5V

ś Ä-0fdʨ`rCyň8yz *8MO#NYQsh"8Pt>ꕐEJ"Iं hQS-F[p:5KEv JӠ3;MdefM4"jV@!lHaa! B:ɕ-.2 $H+8 Z׵b_ɰHƤAvZ?S8#{Cm/Qۉ6V)L.@oQ4%tptfM	B5+6/ybԴZl0Aw1BHb9>%?qt$<'7N&#0רlELӅei[`W)
FPd@kTyW02t~~!-~+i%^ZJ.e*N<"tC/J,f38+V
riܘc6K80}uLNiVXVsAa1iilƑuafTX8:PEthj.6P/;c;@<d[3t(JLhzHnCsE}5V<)2Y-5EJzE_BR><(xKvxߩi+. z(6vHN*ˁ%#ak-c0n|	^OUv	3.ɂ(,d3״&L*b8ŏUEZs<Cpi)}'$b; ͒\svVd$ӝ>0M,3{.|ggg(߲~v{{\!	GƯzlyc#}/*qQY.B]8h|o= oi\z^$ߡMN&Mth{_Ƒ>EG(+	 |$!,͆A8vV" 0kiFHb;{<n,iסTܗ'v(7^6͗U%YZY|F*[ZXuⱷd$fݝ1O';&Fkog7ޟ\5fbm{ʭeFGK+]k2֜~hU	or9uE*T4T(B&.gM1
ʾ&6āCRt~2SX	}HEn0ڱy ^3P6pAZ{zWA+8Jki/v"zwcF?kkW!2#2kbw<ύiomih9s7l8hwM[9~3N/=rj*[&œ&k\:EL{CO<m+w;$nÿ;ƯeӋlPSIm&w565ՕہsTt9[`)-pWYDM̍d#ãGGf[Iz)Y5bEgO2n%ҰG{@)37]<\z>*O!0:Mt@E}:K9p5qyߘ}R1b[81~2q_B0?cwtdMlV`D<ēV3`Y㤬XXdiҵ{0uǨe;RV^>1^o:4G{rfKW
TkjK荗TCq8Jo(-W&s`: wC[JRUPԞp!r$ce^EMMN38]f(HZK^-ؙi"%&Q&1kp
k<վ-*NQGj6z{ptKY`[ 7L-KGaY<jpǌMD(VlNYd5ɖ	q!bD$8ht/5S1+^$L<|;ܫ|襐mROIvqQ,U1644ݾՅEK!c-AۑUjEKU'A0785GР?	aa3nodL1`&u%L#!3TȻO:]5  %4PmO Cpl]Zĕ!40)${Иn4n_YFdWEZC(|UCu{2Z_~͹Ů_>+9S50.i6^BY@*<ľFK%A~sh&1tG("G?qfM%h,(E}5YZAvG/fAyD	ifwn9DNA\w ,յWhgV5Wp'],eC#ȼD<_^R9qD/ŷ{i$0?q'Y!HWhVc?ɂ5LATu?l!6-H~_7rZxrwZKL-qbeS7{kCN[wPT.`p)gf.HL|qQa"Zz6	r.-|xP#%2#qt
	ꡭqaܷ
-
MM.EdTϊD"fOۭH$K&A1_CZKz31
@ϫHl:k9he;MĊ\JUP0޹R2`EqYZIW[}͞IӸ5c*YKރYG,ٲ:fK8Y9yq=/2nq(uėͮӝm:ܷ̚BDX>M٘i9h06O جm$u[V<w!v%DgS0Ҏa(.&9ZDXڹ;!QFѕ<^PREe75&MW{Rs*P)#g{nkv|^݈G^m]~[<lGE(3NFHg1b]lhzRDj!Veb1VS+;ʔy"&Cac"GL-)b`\$x͌ڨEޟwV'^>Cr9N9/dc_c#dtd3-3Ak?SN0i#	oW(^3,"$-h՜T#RH~7mdS8J~ͱKII-O .b Ѻ9,p2勨'`E6E:9I7N(/nܾXdW&,3iz獢'W.Xr 7+צy#/
ɷ;[x[P2wEKܟG.6Qٙzhī>k{kB{f`|Ky,C&Q؅CBK2xes·I/_S8̧fh|{&WA+~<6&:VgpI'_CVӪ%!9`6:âZybVTfnot%	㐓UF"P -cKўJ$v,KclY5fF@%~NN~{JnABé'JJ4oRcK۷$#rḷdA:	$i+-#\AWFENBZ.|2E)B{)>P+!	ݾ?mtG|^+WtZ${K*Kzt%ڠg߅}ܖu۱)kqWb{ccPsMJ՟8ނm(}3,zmes(Ff8z 9ixh>%Z18(|<6Нt}kKp!:s,]rT߀$ sjCi-3g) Yo1q7 Ð0opZG]m5"ƥVhbpoGȗNOja-9&ۏeui/2R}3겒d;	ElJCwc%CO}9z
g.y'%(l]c`w1ܳYAbe>kSV'P4ۃ.!&RjUdʎ.Lm툏j@qP`k(¶dx<J\.Js$ι sR|Øps-wWV!| D7,%~w1lϩqMfHm"t%cXc5)9i#^t	[f/O)2c󪑀ՄFRv/Ge:JH4v%xR}M.z.a99gֹޅ~_&L?fzjVPaK@ܽ{ρق߹R<S<!+IC3l#{C{Ѫ>gwin`կ#ag?yWp5HCCh5 J pHi~^Xz\M:Θ7]ؼE62vpJ#CiHෝs
&4E
 L*K~	mzFU)r~E1ȨD]-ufےtVN(*tP_Ǜ4]b+K8t;n_"GdXe$O5@ Zm`
jE|ȵF+cgE$3&}8OgI(]$tAa]~zILC{f6ԹyLz!#(FIfɘpus!@,-|;.%A,hl<:MGɽZ3eՠȨc=?VLEFOPzq9Bڈ7x	}I!Z\p{fW{rhC\]$_:&|*Zcf9B˸4Y}H+i	h9.]P:k堅!)YE=2IE<	#+L (Irg,/HPڵ';9V!oYi, jKrME?i2/]|m+^Lr=W"j t^tT,M>JWQʟNRTü|"]z'[|%arcide^J!B.ꓓwuجoUSv!qCrs@Ov&e1PhoKXNrV&&J_YIr<iZEA>|C(Am@D'OW7oG?|Wƣ<b7@BL7ߪzLƎ8	V4JrƓcQ](#[`t;.&,oyR\A
.&<=y8fjln29S>(@V<L$E=8(;V3߯ W +]8Lw|\"WNCד.xOa;4+K+X9DkP@yu*?׍nKm2pt/ehAk-
'͗@l8{89koW'G]hQUɥv\͓I"ڐOR8HOrVeI\*P>v˘@@R<+]/Ǎ揍QHS/q`oo־8TrX]]jOm2>Psr?S	p+A
dR66Z
y:8X][E&Csq*iOuB0r)At>jU[~ށv$C?F֋bFf@q<|$:k; ^R9*TV)G*_Yߨ!|x< c\:E0C8߼w.pJݕ1#˳8#"wbE<=߅
8q3ۣFݑЕ@.>Gmcg}xW1sNiU8|%lJVKm5÷@!PBZ>q<=~HG7\@fx*`+~,I2%#ciT&p(k4MLArͮyϴP 0%b0g<aaT]$M,$NUTHD<HF4G,Bi1@Χ"$`OÜwDl,""i\gn.AidL3:ҢOCn2n$R-L_8dN_?!31 L	Wh^]Z0FXcFN~?>=D1BR5G|i1T,{VeB^>b	MI]oӼd, 31yLR}BjYKC "_8g b-lܾb}u
m_e<D'*'1^D49.lY5TBe:hIu72Y:v*!a]ԎXce =^t1Ze-FxZ`zWQ#B3ٳx4N/'AN1i\1YۓMkZXKDAz>m:6#1jdהYޠ`4^ퟲb|<.oƛCeat&-ɓ:$&ҧ1l8]S߽9t=+D!Hb	#4]7^=$n7=(芨dhtJXݣcgѳ>oI5> TZ-KzXguTUMaf&Vw3M68|D$@B@^MTSs?3)Zr$$W/'W=xvσƞLçJWM߷$=^}UqaN˖1]j[M.dm̊oB1kUÃ=;=:ڇ^=nm
Sbڹ*k_*vPECۥR%2iY$ݰ{Kcʤ2]3V]rA{0^u{Vy9&$`$;̘Ս#rxE/M͙RČ4ro4Zds'<%/RƠA&]l/2FGqH5r
練{AA9V	E3Ad?>?̞pc)DI	*7vөEOzxhQP$DhJ7򁕽S]~)***(ق?]>|y$y(Z/`/<O4_K
ѳRGȮM8EKeV$i@FgB6d)DW[
[7 4ZEi7+"
U9M_&~ccB	\g'--LPio^r/l䌟ۅ936P:o)yKC(gRqi=v&_	!PvC}"Vdxߧ$!co{#Qxȿ$OCb%5ˣirh$$[e?"yu;{㤵TɩiVj#%tG'dAz|%4>Z<-KŨF<+s&sq 4'PRMV9%_fL5QtlÛ4AQUf?qFQ8>"~|QS>5\RJ
ZTV9](v7xvoh؜^7A}t0lҢcp|9פKlNGInH^yHIH`ؙUA^SZ̮ ͺOqG]Nq|nv">9u[?<;h0Q(@g4NwNB}H	OCQ]\Dexbi«d?v>nOg?ϠJc6v{8TZ5|>R@ye'~BwLȝh=zOԬ$:f* ʨwp{CRTTu+lxlB$7s.*fQC<mvQni	|>;cfEPD{`p9.nʈw]6c.%?JMWX|d[JЫ>	!Ynߺ!-聬/5($<Ґ	S4.IgكOM%[ZҊh],r|np;{ᑏr *lnM|=Ylr0GI[P=T/T
TZv86=zwzmr5vAX]@oN:pzG~*B]hWQ-m#XЄҔRRՆIC뭕/D/""E1*hLb}۔.M-h)ڞt749>_KE6"Գ*bDsɫ4wZZ$Z
B |^pOÉ7F6?#-,+br0ޫBJI#A(0<H]6۠`
1tك8ŵTKϺTbXBsv);FHsw\avi~#\nz)E$.tWLTY,[uB]ǨUW;W
QT,NȢgv>:uȞ}BTsbףd.0Zm["O/YSȅ>]=K vaRjzv,h7@
p}U[nh:xJ2a^יޠ2z"-IᎊixʡK{*QzWmrGjgu[,lɃ;P4ǥ6kkՙqH8nя"/65]C>qVG4"XY^F\^48aכJiȦpBH"gr&.VdaQ+kҕ	㯢VsjF/ߪ*:*,s8,EE٢0;)LjID\z3:03狰x~rgee[$FѧI/ޓfw}N&s]F2wv_ǔ)b(]qe.^tG')̯9P}tUvB&24.A2)dу *qjT+rH.q\`eH^LB9Y%ژ|Lh%cI'EǪ0djA:AR !^5/
AWAs4;(^쿂nyG4ZU_|9f((wTdUjLU=1ͬR2!Q)QE6L,*yk%hT>VHRJd:)ArP,3w!vHJ7t}VMν(:v@#ļ_65~>y⏨ŉ]"ᣥ+ŁXqѪ*-Hl".Y 'klJprf(;%	j=[JmJC6bVݩf]ӊ@u2'mzQgTv$F*[#m
[2`K@jf|ǰ@zoC)gĬ6&YE9$pYR42͡C#>Gl.2u*jaMCݪ?֩/Sz]^jNcʥEUؔ:Z{RCK'K*i|Ϡى	1=	7c*ެmWK7NUL-1)8D	G?-ќZbxJVIU?:9^Ex!kMݎQZ<Ɯ6N_hmG Q1N*.@&DrWkJ7Agl#+fJDNYstXAm1{7YZET@JwHE98eNQ*ll̧
Yo׺1 Ub)%BA9;d cl*&۹WG凁b1-]5Qf-6AӨ9<Ы$?Q©de2ڒ.Y[1{8'E2?DmpxefsEK^Yg[ge^[L#t}B?_ӑļsnYeĵL]RJMyxDmVTqƗG<ڐzQv!ǺNP:\b2"Qh`lK7)2FYqB>b{T]/-@]I)&ciIҫKz4!"1OzBkixE
n,✢bo:p,GEBc!Ūvp5|(co$oYXK뢪ګQ0JftaMf߹qП\c-h?rEg(x3B1׸,0;|ztv=3hO&I'ըN)>xYGfgse	y,2%v3뀱hwGP:n U_lEYJiXtחIMŎiq3dƢ{vSJ({(jq
l*fkWêMI	,@;U4TH؂AL[C1
9GLG[ږr-;Oc}~=otjY8P19U
IOFzT V7(S8Z7<1{w,Krz4SN64V*4z4:׽	ڡ KPBpv|hҗ$_Iv]
|(Fד~]MA1NĤu+knDD36w=x4U5;ùq.М*XI{|NoZ42اQZA{!9?-}}Cnof\̩{RL5T*eXsOa9D,eb1SƂP}Umd"Ԉ ~ ]K]K8	[ 5LWe7kZ~!ݣN}3PiN61֚ȇfmɝ;-kG6`켥Zq[>:FӍ<->dggk
<hʺV״;'\S*p;&]ʭ"IUTUrduI^shh)K8U]21e>9f%w3.eF{|B9wEHlY&wُ0O+l$'}#n%d@=joڐ͡]c:"|
8g=qHq"/Nv[%iFBĀZVLKwp6`k& vA_\ԙ25@Gq ņ3zT
(Pz#*r"oє-CMMgdF	7XvhIh z>Q`	q^6]aF,4/KĦ	Xp.*l0ClropA\2.Zt޿v1jypz>9G@\@jŃQ؈_R-yee242+*ax{1L:CjlyZr/2etdZ\y)n(^$x^J()B,}bY-RjL>$^^dǢ| Xh;%˳>BNL#/&En)PN"N kA7D6r0<}\|@gGoJ&;I|,\7|j%퇙~,.c}xdMiW >\"hD[ܜaU.dП:P
n.	J~9lb`_pS` 1#AK}@+dDl!O?lx
n˝c 1/U?H$jy5F8L3I!U^7@)9=GI}iVRuzw.7AWTerx`v#	7as
Ɍ؆ƮH&f߫ƙu#S'e@<//֕'/濢W)bt23O6ݧ}loEIy"c_)i''"LdЫԞiy{NR".ʝL/Ҫ&#6SgWYw!H@ 5vj'MZ+&3Vrt^._S&6̝C.QLN˪0-CKYgXj(xx82'L+ð|J8HQp;$5DU;w*#EWddf;Xp/.\򛓱=؊ܬ	)08LDi9F
۠b46i?[,ݺ!n<PhB|xS8m=S3GOjDBSK+oUQRp02nPx TWUs`  Y\'yjad[S+[MѬ5v9l*8ad٩i;Y$9]<-m(ςq"vLfPY
&-,U 2
"\G~ⷓ3'/$nņ))&iҝص  gZ
RJ*l%en<22A= Addl@{v 4A<9.,"%@'{x@J%yn	8-$y8ρIj#26IDd^]]v_o.%Ý8tsbl&Xѐ+P@WR}u˄Cƌ:Y@fQ=/+ BrFu2fvfLĎ:hX,QGjE-#!-?	};}||u@QcD.C+niXj@([C':]e}%F%Uq$8LB\j1n&)sâ-uB:K#{Z¯E:p:kr3u1JpfSL̜yh1*FM,\h	s-RZMTk;bc$7]奨l	r|YJm#V˵TxJ*KS|9d	ȿur<!OP_l"=<<99jSN,1l,6K#FeyJ1'= J%؍eAJJ?,%uHBE5*lmU,B0mMZaȣ\',7W%l2\%'ghJ"1\VFٺ $)F
]9
Y֖*f&sV(薖1^y#_by^7t;vwSaFWv_}eVzu'.{dQ*cwVhGgKQbMh޴g?[eꡎԸޖE#UssQ?xЧG_K`FN#uӍFZqh~qtư,z*PBlULam`oĥ48dÎu|ߡ̑׫l<87I@i*!Uai&f#lvNWlІRj8"MAu,|g)LO-	7Jߡ%E 
^20`(^Dutz]SfeIc˙tN
;~Sf\,v}R
T2e[U"tnkQD딼 cXVjBge;;(9^ЈJcⳲ}nXE6%6<f mUgmW	5)4&F
/h ?вZ"hb5+rYM"gz^u r>+i}Mb6q; fc`TEXO)nUJDQTɟ͟ġ;=ʞ,(<Uѓ8IYfX;O̅qT0]0 ;1 
	59m"A#$2֧s4S2dQL{bQKϊdDLҜB{VqFM,W6	UnXh~KZ廬h7DSD862Υ,T.$T&OG}G'꠩0jGr^(/"d-T*{UGe4,ʢQ]bYc+eԷ6UBWDj3HW?I`
~Q4;QU	kDWM?3b{a<cDHvҍ#rJjJÙc^"%owJC' tB:z- E\Gvy񝕑r)lLoKbBTkAs]FQ`[u϶ߢZL6&ɚI{FF:^~1_ &ksÇ5Xt0"V\ax8ywg ;2Y~[!AT`jQ /S	*N' o&?<ASUnߛHw|Ď£`F#(`	<IJmSlU|>Eވ9%w_n<g# pdL^OěԲ.I)GWUV}80O p}ouMyRuUH{3Σ' yYňڣ3р	FU1SKA؝nԨ\Vm_v:XYt4<-_c( 'נ}]q~JPF-Us;MnA);g?OZB5=UvE
tS˭%\-Z˭0F#ϋ (!Ns؝LǾx	vE{*5~	X%AU 
y=U}=:1* jly+h`XR"teJsL{v#y<D=3&Dh|]ɼfuM/
/NvEF |mNȄHcKyl_0XkKrE;!oJt>xGtCRf"p	z?!{c( to7sY~&GVw%jY4]y]長lkV:jP)T|pѤY1+.:hrXדn*mY"f3s+fJ3	遈8m
RE22m5ʷ
u)/!OՅ61jٝ. 6dP"#8&`-Ǡ5.PIpMafif3oq#șەnCK-SZ}6oQ雡.)K,mGZIN57ݨ"V]۽Oھ,Qg#/S23}8)SvF^<}q;Y.US>\>;:w5PދVx\Ak.L]8X<XЌzFl -55Gy]aluq'e"9L_;uGc{5{ph`շ{8y{Z*48+*wknC
܀JѸ:&H]-DuɁ"4m>r]PKĜBh[*e`	l%wz)YKzQEtR8j0J8|U&A.#f5@޽]S۾ŶJel>jJGHVMQ"Xr+Q*Yh1R&u|*diqCM,wp*YK3oM=vj"ov;UDanKsiS~N[`Z
-kZ#}*ePj!J]Bo%l{"_CNCĹX4eMK߽e?C8R %<Y"X˲O=@}@xR]VOҦeѫf-r2r*qUd D2}eP}K!z/HOQ@c}ssdsRJy;XqTw4Na:BS/h(:*!|#ηUq~ƸB(T($GF~hüzW]+zw "di~ccQ|dݍ#{[dk}޴Y?2gsvLb)o:w;{8Tu;ad}N ` jgIVJGUMoΝhފzh5>M!qj)c _w\cMi	|V)cxሡ{CgQHdeAn4%[贡RA5Ĕ)7BO4FiQSxO̡kIw,|U4Z:56v%	!*Y)l	b[>{K}݈tSg[%d_O.(hhv%ˁi!(@]2+9b,EA,wӕux#e̷0Y0QLax"`rrvkO}Ndj<`e;뾀#ߠz-YY}oH:eŀ
ڊ_._?AFڿNYꝍz=/$OgE{ht8՗ZE-.:$n&YP2UP8ɣ*ީ`/I^?1tX3N_͓GO?RG*ߚQY[ " 'Y{qG(З*<EɆpO5?3BcFص>_oH6'dh	1s7.fɺCO.[Dt"xE5xyH^y[-QdȊ.	l7$I|baGiyii_WE1DX%%?@hnotBQI#'%I*.a[zOvVLϕC#fad,+$EB|ށ fEWtUӈq[A+ؐk6$SBIG/:3 Ƽgq4ȟPVV>e}AOP"H_ݑ#ljYg-`ʬˡGNv[OKm~WF"?,z_2D@tS5hzb%A@Ӟ@g8FSu^D|VLύO:JE`2װC:i/1r5@'
g/+B	"_Չ&޷Hwjmj[EONSS-<ZyXBȌ`5-Jm5wԮVqVea{g䇭~`AEP4$Q9!|ud2`ڐE!PeN-k'rqcɫCea|(m(Fѧ>
{
Z))y 9>	L/ِY'$
+˹ͦ#2%CdkO:_4YY%D|$cE>eBB鞪OIs!y&ˑ5QȇQ[U?Xn{ك If$K,tlLX%~
bٓ1a>Zc4Lg9#\[QwКX{}/DJ5R;hLS!a]X	M9yo :m'9]d3kᅐtFB,e)Ok62PC¨"=kի<+jg{bXPN=DCaiuJk"Ӣi<Hh%èEDTJXԄt;DOhL6vWnWo{'xp3(ٓG)ɞ<9ZB5Qo<.ߩ3DQQq*9}~;nҟv1e2Cp"l?Nu$Cwpp<z<E{CfmKV'Ιv0MhłuH՚I0k0QcSN0w	p%dDh(T46GS%Z'aln$Ē}N5䤴fOhⱥ$
6?g|;D>kU`SG;g7k2,a0Qp2.DqTƁd!7i]<WE?L5#H2m\o.E"xd
"X0?Q5_e,rQ)'=H_L1uv >t92ሊb+O^BA~)Mp@+\ HNu4Ҋ4j+ϓG UN-|0(U>"$R)쌸+KiiL_prdHE
9-"yY3,"CHf|Qd<m,/Z#q̖;Fby)z јc	U5g_;"bFkT^FM4|kX>t:I8$e *zҞF`DXYSZjUkha?83
!G-]nJi fzEPlwa>MƅܴΕz5ϓR+M̫A%U>C"Q
B%ُoRif-EE>%yB!,wj<P&,Gw3C"$Ep!$>˱;tҽVA28UؓG\6kK^RX;;Lɺ>6!z4և5z:J8m(UjTD^K@v8vƟ.SLѧ7QjIEB~Nj2xdf	pUOǤ]gҥ@%*?pb-_x :q3Y TI;nӲ5̚VLĵEA\8Si9{áLGp8.񟜈j	kV+r+[1*ipb~Hb%	*a9DVV_ɇrʫ!do/\Bd2v^AX :˽2`Qv5I`1]?	¨"bysз!>5$*
e_;>.ZK*&
&ZJbt@fpr;pM*v	F]#QQ^O#rk2y@@Mjaг+gbX'Q©o%8ݚ:+DwsQJRk/=<)dA	ܝlM&z陏2i%FJXNvMD.u{o&6a7jD?N+k)/|ɑ(1T,a,m"~jTEފVɭݽ'Č֫fO7_,j=OřGL. G1X+48.CFg|JyHv n_3AG,,vL&ޜ~iaV!ޥ\ќ
3!Sil(i]Hi":8^d8q<t&	,z5PD]jm)6/tLIM6VH+nGXJ8ɀ3,V	 Zv
X!y<`9![60A1V;SzeIln;V$h~zSlHd+*GƝ|cmɫ-+bO:dZؕ8V)|!AgeYDHPQڲv<TrZb8ό\A,0?lTZ0#qMcd;:4'bx6rc*e̘)- ʛXiK0ENeM>D%)"]}KK#QN^ٷgMs~L<zcȧ''q|l! l>Bn5Z6s|_ս I'2BHqRߺKf~&VY6=>/gB֩Pf\dSI$=Gr*%5*b=0TSLE3L&YH»rCj"a33ZƄᚏ"(kƸ55 όi_&BmY񦻿{[++H28<:k6/Z2\*;:7p:׿#J$2XIer7	$L!ȳvYs'
HI^} r4z 2cD0ٌ:L&0`?uYG|RHJR%ۃG%uq~%0hH;SuwןH s?*ׄ]V : !#'YBI vƀ6eV_mlH(jj>/W~qYPe}Ҥ ^%qzVM̷/h=n&דaw3^xjw{#Cks/{=son(DYw.ǈ.ys>FS!GZ\dcfH:MP~.rr-8!FWdfL*)Ϟy8~yMSwsߓ;넾#RɔƊ'ʪ{]'PGSɹPDTPXY+C8l~ͦ(pxZ<k`js&m*Ƅ\6 @7tIHSZCwo)zNE6QKDΎ*C5i
j
HAnԵ:c1BXeiKzN7[;ʱt<gLPï<kT(8`gt|$FC释&ܒޢfzԴ׀@|;0)%dt2O?~deƏ8
jA@/1w(E׹paWxɌ}fb/E.s51kW{7z_❏f ͍Gh*|v%bG"Z_}FpӘ}lU",θ&^~.v߽sY2E蒽C FZRSI1FE3OĞڍ՞xEY|Ɛf5!##X)ɘǑY9SxGL%{RӜ+gNxkm3w,}y9ee6l}6BѣZ;wߒY:F.W{~܄?R/蜯rHbX+^/.Ȓn~Dg줷KhƢղT:yÎ835lꞅg2BoWQ
&XN%w4 	3CO)VQ?JPÃZrPZ<lMP<J|ˣgB*S"o>gAটd^}wa
Tf m+]TIW4rJRtz(ƒI1dEv+}+YjE13fgz*>ō`TW<ɽ<1⮏=x 6~dtd vJNBD{Gm%cG^l|mUh]AT.t]G~PuzanAj183Ta)偨7qIG'*/
o"%9xl6D0l".TFb)jS</tutK3fl& 5"CRqr{<Lmxh^pkW<D{W;hnAG<v[EIާ=ڭwuUytz=QEyrjUh0ikXO5iW1VZhnCȆΒ4uV
S3S)Hcw{C=AS`l[eB.0C^0lAִW/MGܪ#a*cm{V(ݷr}[mֻIZtbYc/\;teJB=7綒I)	UYռˡ[{:{t=<z,m#!s$.lM5VǾAA4QHp|l^J^^Db+]DĪlJ&-Rlj6|F59pV/{W^YQH|u1&>ޙt\8|vR*m.IգChoW|/ʄ8ؑK2u& vRԾR^r
+hOGO
`E;QZc|OY#}Xt!JHϊrjRe%OՄ1lUލHƥK)v#qjKbF8]	{sE``f $@2nSx|)tRHs\OgF
O>:tR?rOE9̮bn
yeKYMf⽜&oØƖTBY|_x#YOihc"\Eq|&ؗ_P4"z.N/l̮D
H8O5	-]}IaQ]86u*`q($-v]?܌_YC6<@^/̧`ْS$H}sK (ጀ";nSqO*R sSr;߭mi2&^}|zHᕞ7!5QqH'`Q(K£$$4*5u2jXxgXR;+LicՎg&E$cX)W;VhrSzBV>'M2|ϭ4W(,H?NNRיXV7{]44ϖSY+2M)xmgU,T;׆L^~wqw0NKiu-;q/Jfz=S(y>k#hh%b!taA/=v
JO,00<՛ds+ъHK<KRyc%qV?HAuaxG%倎O6s9!v2tw˲J^I|8o!܀WVQZ<q3ד=_,j| i]J؛-.Ty5P}M >1ӨZrD^)^<<#˻ͨC~N3P3>\lcz12W\|UkcH;܇;VN 1W>^NaT{$0V=ws|7d6Ҧb!hydx@ȇzǱ6͏rW +]R B_z˶25Y~9;Ɲsw
HLtJ,똍w\0|P[?9Awt<̉4C  FО_l:&4A0/r̚/d;:tg`cO<I`d,EhFL\Evbϲ}`cyvc<N:s8 rqs,Z[)(<T"OCsU]|f'B$GJ0{3JtYi 3vT!4졬"@R-Zw3|d~ˀС.#]BeI+Q҄})%)Q֖6!9ZLײ갢_<BՊJ	}m5΃b{r-[S۴F@GrG}=zABelRx*NeD-B9[Sy!inYXh6X"#!ZDV]sͺ݀Q}kRf' #]fBˇ׸bJ]B>i3sg$eǗZq8h\j63lϵ5X_12	oӫ(AsԊF"RW˩$sF&ZDIwruޕ)f8h3#7AQ<QimmT;))Ra!l7huRY:FQɐy:<-6=F0*F1A ՜}9ѿl4vv<AuG^21GSgڧWh8(vvT.cd79oA>"&u<){OUl:	lre~WAL]П*Ap~EVQEoJONL(]HkWQQRcx1=9
]RE|*BE!Od9N[hhks3eݷF+/)C)G` W3PΛܯ捑 _,.}/D4PpҽZ҅QQx_;	:K]dW֕w1'8\|&]SC 4]d1tHەiQ	UVAîd@$0eZ/+MJ\,1V~X+;3t7"aXa`$X@2Rgbw_"6UBM	}1رԝXoBmi@4+'GQ*<:| 4G
*=e"`e8ĘOOh>{s+8PQJα"P6#ȃhLHKlÍLql0ci4L{[VҌ.* M^Fs,hg!Z@w'݃W/dVZE[#4évO!m3_YZ8uj4۫5\L\T:<ypwKWB\%d^H6.ԍꦵHƕnAX
%)"ɉܙl<H-<lw,#TΖ&gNR㳭6|6TDx^_uaeo,Vx4qJ82\<ұsT6M/MK׶G۝[VLsv[uQ,|Ai;8͛Q.1~T;d隤^
zQJ32Vm-Iffd{. )w!g3xw?w):
?㣓S3Š_*	^cy2^%|1AEJ/Y6N_^2+-UIC1f*Bb%=nv	,+lLI_UO`"IhT"yW]bqSj9ζ:叝
$?u"YJ(5M!TDij·V+y|XUm0˭_<5q$_+O0HfÈO笚2<a`vPH'J6D_g%`̗/ix).ϊ@8GA	OVe		BUsHD;t
ՕCcN?y2o0ǧi$(Њmn`	y9Vѻ2Er+T;4IZaEi;c&3UP`
bŕ<jR<im㷔V!jŶ"W4JDAAhbc9 Ub/?CF Oh虞c,T8+H!0CʚuhǉGu&BHCj6iן<2|}SԲᅞnV'f^](XuWRk&	2c
		BT2^%Cay>(%+Q|t8{ռg/ŇnsVO?SH*/t?#<8|N͞N۳Wgڥ%cY-elUTc%$?$o66:.E	Qժ,g~⿟rx,$v_AKf#j?+5^m #.ǁ2XPA`Ua#.}U(,&,(|o}>o-62x~:~ڙuЄ}A׺#TbvSn7"zǹjL8v	r )P/!xIHϸ0&4ڽCzߝ܎0$0605tTWs:+/cAZjލ.TQˮ8~g1BIܲ~8?@M={8QV$b/K"8Z]9< ޳]uW*tUԂ.Rfs783w6F)'yb`:?ȯ(7p]bAfłpnuhZ0&B9i̞AZNdxH^ ˊz_f-Ƶ翁7Ge0DkNxo7gg{yJ,')ӖMw9Oeuo4
G{'mq.7[(knQbEr:nݬ}vS7%p}9Dј$}V"Pgd | XI#Uc/DHAE+`qRb0Z.lRshN0jCA0"wFpc-/vl<zX[E
f)G(WG^߀U/WdxSĆ0p6m6QPJbB|UHOL"y("싨u=JpK֏
ںsL1W+NTNCṋ(N.΃XҰz 2MƾcTp
RWDqƞ+e{X`ĳJ+UbI~k$0a) N%4"C*#VmVīBd[߾B|C? +
K@;XFM,o#[c4RQʚ&0 U\ђl?T[N`8BMӆz>C%:ôv\VwCmǏ@ٴAwE99ZZAsj?OjŸR YC*cT8tur4d d` 8&^fU&ۓGe.T`D&5GdIDO_U׮(޹NHey?j$
5ѕ4DEez:Dy'qVO|ah)IHT]GAr|@TH;B
l%	%Y+gF..JCrmk^`
-~Ag)H_@FBR4S*F:c)KJF6xM.t?s1`<N
lqecI&r!S_ֈ!=
Ku+MOի%zPM%e@[y{!z,746D@:F_Q*U]$r@XÀ(`}x]:.E𚮠:	S/(h:U2}
_Kܯ*kؗh^̫^+)*'oTZ |;h.nAjM1<Gx#@nGᨂ3`wOOU&}N\%֡*F !\To2ǆcha(ԏ|w0z;T|^QMd˚NAh55l+A*$=2b#ߑtm<ֿ/hWL'WD9+:J~F)IS#(T쏒2h_[v9.*׺G<oQ$8:2,Zqz.9^qJDӞyef{^?Z|m+nIT%m3WT_<؍[s#0خ+[!4OFSG(z<Eu9q|s}+`d
z$hn<@K  Wa~gp+H.IWz/*sPn	aUS[|S߁s[EgsLv[%	4eyoiBhG"b1ݽR?;[;/1DgU]zz U>\yX:m;Rs柊%8^tՁ_cQΜGϻKYu"^rqaQcѼ,b7m;dTE1{г2f)WSW5vfc#w)kϴܫ&N"8Ԛ([De`ܪ'OqIfhLVF2D54deNj{T:TQrަ7LZ˸~<9]Sn٬z.V(Gcm=Uϑ BgY^aTŬ\u#>xh$-e,;T{mk,NASHnD<sY:24h,#L%bRP)x's0Ȉ&+a/HG83; L&VxDQN{eysť? 0d
!^j 7ǣBznyDRK'KЋmѶŷ2A];;WѪ4=-Ƹ"mUL]zYj3U
1W	_:T,RNuNIL34qt=wܼ]H2מM{-vhV}`YqXl-zXv|h5&I=p%÷SձU;0Q$.R0bwDl:&4	+/T|]{(o,Q=i1`^o<VK
W"L8`@beuG8b\1Z?yR%ZEOINF_ggNy루wCS{R񭽆=;lQ7XaBRj2쀀xxK~ (3v$0ڻ/	wkWG<˓[gw,$)]*,[ώ%rckfR"]6k/ٮIJ8m6)>m5a¡Vea}qQ8>ZZZ(?6]NbaV9㠭ex![EM#bX`OpO_%vYciTM<޷:$}>#z.#${$Ǩϕ\>G.Z\H3<3.5v[!l_^	厡9BŏQo2ur$WJ0tuÝhJΥcq*+k~ݵs6оZ>N[Fكj{<=w?m7	MZN/,e޿%yjR랇}\Us^V?q <Gc`:= fȒL?.C}+K-+<FEPM2㎃aXb2d:p>l7UAc8RG/t3ыO5IZٴLFHk/ƺEvr%Ec>洷(9k#eVl*E~*Rf|(qG0ŉf:$$Dq'JN>NyQۈ%'/ż8G'Pv޺ɸrwӿd#ɔ^.rɳ?qωK"s&Ly<&`F%zg2C%*d\ec]ې2W6VWe`)J8'!CV2#~.>Ҍ8MCV3VId3ҹk|KJP<d,<w#@%{yMG;1@kjuׁ3(ٲp|je&R,X'Ѳ.&@heMgN&#Tp&.ܹR_̋U͇ܜYyf4e3þxUUcS[yXcG5k8My"'\$a&#?H%2 PT:9ހb̉Ug9:)rur&_!y{oaF mno}v2'͔<c4	FRz7#_/+2)DL@!ӴYaOh60rYnX)2"ky{XmY5	0ufl#D+W2&+gQ}q-ǵOśSxйz7DM}</"YT!]r.#$[*ɣs+I2Dᇦن.̙Ё[,d)|D?-}6̖B
Xz<׎s<Ά-S{> MWHJ⢖#FpuOLiGXǁOn7LTj9L?f+\f+$d\OT_{&ʽ	;;b#sPhÌN3"` `_p<O$X*eWCȿY	p0/'iAT'^"0҂le6O~j~h%AP5s?0m`_YmRfYp4롐%A#x#Ziա$S/@T3
Ra"&Tp[-{*
)_	'z݉Ly[IL`<7_tـ gehAR[
(TH6aL)[z.HrHjk/]z~Six\1 |g/̭^{}:O3-iAPB!ֻ4pr1,(N_7ckƸjV ۅ
*-ē5ݩ0Ī-c
Lk$Ύy=3Aيo97^M_ESӛn?;űl<5qDT}Lgм9.8%B5IaV"|Dg`GOm`匛hI20Ač[C"	 ޡE݀S._vl\~*w o' _ࣲt:|Tki["/qvusF[34_
Cb!_!~(vϋeNÛ!<v<Nl*}ZIϖ?H:V`N0;)`V4D~CT0-s%%	 w>޹2TaokKy2%קBypR8=KU܄'VV$$*W.B.tа:G:k)eB	v;^ų?gე>aQ@LknZ)v錷Ik1zZ,>YkP$E%oӐWy^Fq9ێc	1whXrjp.GZ}Ǩtg9
߽vgvtX#e?{iRػBgǷ~r\5I1MrһYAPy,cbQQ[}
		T4Fjzۅj]-sj?J=^)z.Rkr?˜&2޿-"V]%T!cdoO
4vwpoȂ/{,x?^rwΙ9q<qGqroӻ%i4\{`-P&ō7Kx{.uck?@LsX}OH#evk^ne*JoFL)Nzw#q#fS$<ԙ{/@]0LS޻ {Q{w{R02z=
)  :5(s(tr@B
k4hmHnz\֭6GIX,Ҋf.#<mߓ"\C	įެ6Lᠽ#ӟGl#&OBPKG੕aFϟ(wI[Iqхt9=~xutR8Kw58Ho%~2K%?v:IKϝq젩/R^ퟖ;Y9G,ħ5JSM!; yrM)XuCώr=t!%Ʋmb{oDxo]e̞9]	4J|\2$g6ENrNHQV*dz&%LPhQl!SIc:vjN)Qb&?%xNK\X	vDErC9	Ƥ.AzKGldYyG{+' i5{3op@,^nI!˩%
=톲BI%װ	\PAk(7TDk. 3]®Vl3G.;A@
80V !#zߧ\^R9s2-J2w
Mh?3JiqQCdAI+NiQ
)F~Y&i[07΍J6=80.ADő}|H!eT.JBs!2 
|"RP$PĀ'5v
p.8Kyosa

}AhzYEҌ'6zvA
 L(Ep(Q^\6UQM6#>tE8kEjch\4s=5q"+:SVix`OF(FUޠ'6 Vy1vh;R9W*S$)[Kab2X%d왑%;xeA<*"{fVv	xZ)[%ތ^KQZ]VYy|0i؄z$""8ӣ}){^V30DG	UI'.0K-fxK1<QWzs.Z@%/w?(Tp^- 4^@;@	Np--~Fvi!Kx!}#kC=WpZt;Z>eV1=!~?oq!bd26Y?UѢr@:Qޛ k04nahJ$%Pa(!@[z x K(`NnUv!yS_T,!,5=U(QJJͻaȬ6DlZ3t9%.>;r?SqA;>P|Y3Wؽto@)OH^l	FT[oтva4tělbIm4"#Yh@ΧE[oE&{\l|\nmmMvUE\:KȥH(Z0kHtdũZhG2=Y!BU
BN{W:p6ycBJ8buљ(>wtU)X^):&"0U>``+J4183|+6l=,֮)MϹ0f~N1*å?K>LीtE;ȵerNa*yr`rּ~[(NeTΤ~%Kbxwc:rKy'ƐUIŃ2rW^E>W}[eG}3`n{nQH:(ZRJBRY\:q	?}b	IT { NSblߦi/:c-(sJ"U1nQiwkrpo ';V竎Wt>C1_lȃIkx~?Nͦ w^}y:٫=(Ҥ
Yo14jVXg揭F%'ĺ4N^t_,U}%7Zݗ	2N6<S}8žۭjp~ 6H6tgёLn>Y}s*UD'e'UŬU2^:4$TQ]nV5#JP,#1p&?;/D,t+GL!ǤoKd9㱶A-v7ZxksdV#lxOa0N\%a(D	CTq0uB'C;Nl:2yXQtI
_^>ȫwb=0pxmoe-!I_h2	(Y."ֺC>KH4ٻ@?a,ha'.99*9L5޲̩ՀBHRAp!{@(
>F("h⸃.Ssa'L.u#[b'ĩ!'h6~~9g_lZ)Hn`g-xgWxEVm@ESBpM1I?L%S:{m`~lDG/E׮&czk&(hHd8ɩH";E<=<AcY]YI0'¾A_Vszط1?[ߟ#'L{rrtRjC'F8vܴ]J-0p[NAAY.DǊ}rN(5][jL8""&ovA"#]OV}^[g	ei"Liʬ8hHhc8XdT^ोs;cSYd447$n} ;9J1	qArUq|trzp&$=.2FHXR3C#ǐnHFmE&I>w9Avڋbu\3'8y q&<qC6܆6YD(L=Ơ\BNm/\
]8<jP&IsAOA"uChXTǙ%S͠O`319q}k-^t)iiyfqʋt(DѷO;̉QI09~͇?o-S=5/ZUڄd[Lvv;;rJ;@|qDWVH$EW6/C;je#cl8#QSY0 Vm'*abxlJ	ҌKA5&>=yul9ы'9 ]z#7*iW|j"Wxr\xR2hr3TUsjXcL$kyU<\xBi|f%$Σ_7+}qi>ӌlM^=qIˣan9͸+kUS8lg^8za|i$7<]3)ͲPVm}EN촋D`
b.B_n ]
" ݞKW:Dk ?18$o$Z l1"yq7lP(&Q)`*_7H::37=Y	. 2XkT||9㸖qRKyy6߂< Hn/(qnٙÔ*UAcSl*}WQUdhebU.j^QɊF>+Xwwqa@ZZ]HkFr]7F9o'aj #y>cNRm+j=(̱.0t75gggg$Xh0O_:]USSF=Wx$ 4o؆h+%rayϯW/7_?Gz^jibʇ>p#xuu pW9#A%z^>?YpP@q蒾C؟GEA.W\rV+^"kc}ta.͓h|%﬋>%U& }2OQGI+g̚[mh{jԞAF-\o=IF-B`5[8rxXF:ͬ>yTOB#HRU ؠS&Z+е׈BYpD3ekˌȡ( %j:	ȮԌ"D%R]D(.qPFq @E*}wRj<ɦCV ė#w1,=^Z|C*N.1sGh-ZeF c8ibѺ=[hzŐ[|^qȱf<BkQ]Z~|I[c
n[؎<eȩڋWn\B}I@(o7w
d[Ǎ^)(oFų'C9(vgk,RD=:xI)$"*#LD"m݊CPs
+U*V:0ed8b!d(VHΎQNa0Ҩf=cx!{wqqX*E7}|}S"{jA~@@batI`U.>+?,CraR̟yzd-j,&edxD<6͟r'yg-SӥL)d{1L
_?)Z] (.Q6jϭ\~wl%ԐzwdHV
eᥣAT@I|;Ůຣ~~-4.ɈM\'QRk^pQ!fqKt5m4Οw勫޿?Fǿ$lMNtϿˈR)Nl\?//My}O^H[*dqG	Tʼ2k=`7-}U)W+BnURS:R]ƶMg"p&XeHc=𜁼'si<$5fE+mpx#vxsqЪ*{D@F4TÃFsK%XVEEccĶ!a {;s]R4N֘(敄Hd8dlՖZG@cz?stɋ'CjPdH([&f+V{&- SW`UETRoZD{$,$&b@V>sn!چ[B2Ve,ޥp.t<}b"DT;UˁhH onJC#~EU&xo^$8e m~@;t9
+zZ[Z2AN.B/Uʚ3d)bq/ ZL=텬Jl&~DF17D̈́X)Fv<7ٶ;UNI?'{ǷESt/@)F}~~E]ï[g?MЬp+%)K^gF[fŬdc^)*v>ZIKMH0*tOLa</{ʂ5l}C^$`K;Qşyؽ@oUσA(WG3I5?Ov>ȑb\Y&Rcd=/-K3|Sў #ΏaC\BB6K
%e7	@-e.`j<͉yx=Y"t0:wi[b̔R3b H'nw{xE^h@k/v H=)k"y#qf.-I{>xFmNڂlf%H͞2to`uAb`R{J?gP[2CmOUZb'繞14דDz3]Ok>qyL"]	@/x	phwA#@iυHޅuR C~c}ܜ-"u7h==`Fr'"x"4)@\{^1iŪ\mn[=|}پ+tXQzȡ)M1"aˎE5? hg~;*F;M[=B=tl3!<I
P{iX.\ijEe&l8k	]jnzǲNz=CfND:%g)Ţ k%j1 ý续S$gf#C0s:y5\aU)Z\-Y+b8!4l=d{8IDli4HU.oeD4]l}1u)Ig K hp|
_B Hi-)$ʲD=[i;ּ5I{
Lq|o,O/GT\L35v(lL"ipO&Jj=HץwԀI!&I<C[V_	)/m|V_^0ouf/S [*'.A0ޢ)V|%VDA;%mT*QiGEyy4SRam^S@w4#35'"4 hm vFEAL2UG|gA2b;CpD3,ٷTQ~FDnU7՚BKIE}2jKu0N8L/ڡ6llņ#<N<ZHW:(8}MB`GݓӽR񂰁gq41Zi"6P@>q0佭@~@gfXlP ^W$.(o4R2MB7INNst|wtțV.d7FE!]JUc&F)5hvfnRL#i),E	+
wn4#ᅐ3)n&bpώ["feι o^5^|i*$10f)<A]'ex^sFw+]Yp5#x5!$|Ar䌑](N1#mHWΠev?F-63w|WRP.|sb]\"Gy"j bMM+@. _/Ԑ TPQj6sU0v~܁yvVDb't7nk*~gȠ P՛D6"NF_N7_|SvH UE: D-َذ]S	ƺ܀/Z5+ewhoHn:i"5L+C3Ή8e$2%Me@h{DuJ'-|=]ܔh`}K3T0yAtikRKO:)&1Nx"Ḏe2@0ˆD}gDk(.oDL.'R'jknPlY$O5Ft.؊?nxuy3Z ucq0M*mSuIE/]
D&W&Ul<UCzcA!>tN"Jf*	Hb2R`Sw%39 FҐn
!nA/6MNzceDS5h C@^O<Er]M1M2n3`$Qt&neַDr3Vܪr?%5	4@ qj@MWF`uG'idûFLH[KX}䵦=iJ+aTB2hčlZCg.E۞FΆwb0jcfOgXQ3YFWKx؝zXHd9*HFNc1"TZFo:+OEFGh0wS c*TGG^0Vآ49iކ"͓v]T,V9SCPJ|s1ll
/{RwĐJSȋ#Za,#;[#ns+NϿ%DSF&9%Hڒ鷉&	445j>x@8GC1hZ?AU8c	3վ75pchǿt԰mTxN]hlin4l)öDZY-&
g%*][[Eı^X[+<8'B_(Y
be-Q@1HJPJW:Ny8BClctNoGD gr?NxUTV-,g5"(	וYX|f1bxu
v8S^+>x%LՏeOqt@+{SkT|soF';zθLlZ8KT\T!4^JNCDI'0?`*
Kfs	ub5'{D̯Q\Ycz^,O
tXgV6nu`9	䛖!GPi[dK)<jL^%- +UѺpLC/'|3/>V]DIkhlh'UOZ|SZYT8KT`]tO-Z姌^Z/?~hvOO~(2+[!ڂVhI|i@
<i.b33w@dFx|0G1{EGD9t%pĒH qޯSVٍNC1&
_ɩ2YgvX8$OgHÃC߹D܊U<ksVQ}+)ypJjb&Y_3Pr9@^kաSkGiC!|j]41Z;|Ixc麯XiC
@R'/ &s.cW$-IHp\	pEt۠_5zQNAUYI?&?twA6[>fcA,v
o3%[/@NT$Ud5	*7tg`j-g͐G̬T_c6K ag1|/oUӸ8.9'2uBg4B&q:Sϔ`ڛ@?9
!=))nT9itoԊXn_@n ??X'Sbv;q|~Ύ3u@4g:Θ{JC
'H9yb!.O*콣RƉa1FL 1qZM"w>l!i"='CtUbOgm1heb
JA[K߷eM/jnf3A4i慴uOW-WMƣ_fEkcz`GL$mhM(k
GE(jՔA>p+eNشs"k|aB,"IJ(Ao5-͊2Ј&)ީyt,0UШP_/#$^FT]YO5tOzvy'4.P>t#pPl8;CbR̢Ŝsk; 2|&9텡8Ώ )}fLLk4գi-D	SՍq8t)aK	ԝG~^Bkʫ*F7^r~^L].pqfEbuQ'_bqZtZdSqK܅c+H'CH$l(2-{ͅM	9|sY@J4zbT d|CBYA܄5܉T"r'ś7 VTs/ʛbN	!E9+4h\AC1=!c$#EĤD.B8xݟ[r֏Pw~Cґ^1 _AݱRL9[<j=0pf;TV{x`wK"۲'_o [1c:$*Em%ٌ&kn'W1hXKp=@duC{)CFig`VG)=f8ثAW *.-h*"LrVUYdQ._94԰		JAPD?/Dj+2+to(Jp5'%frk(,*n]2r=9I
F$n52(U}6:IPUCzo2J䕙fA	v(,
^s&xSJ@=23" sBEwÄ'5GXl˗d~N@h}Ȩ?_G
NZ[vvuՌ㊼<s/D"^#%XuK]Q|Va_Xȩk~~HĴΕaȃc]'}3Ɛ6РTDLB|߁P)k֙#x⸡p}p@H/7"!oE)8[BA͔-1v&9 I0aDg	ETDѺ{NU pErgA" URO'#{VQueJ[|9u)[KZxs!c:F㞰;s])ʮ+O+ՓiUK+.Z|]ܩᤊF/ЪS%wX21lU8Q6;{'
h|^sDৃ]ďf992x7zSkNPeqAk>dVD9WBN'Ku(Ԭ٘\yyջQ4fOPSF=#2Y7ot;Cf5V>7}B5zIǑ,EK[KK_λbne(=ܐh,#	ٶD2^иo~!:hpheB[DP츹!?͒fX+.~W!@
fGL|-ؿWX?6dSQU#.`W%eno[Zg	)_|ä3*[M˫zvKu++QLx),g^4U ̩u:Q
MN qqO1Ɉeٲ0^@tfE]ި]C$/?1\:qq	
=
G:cnuQ$'WʇӷD&#E\2̀Ffn :g7zE|S[Gql0u_w_'k#dm>ZS#Oh?}nEQX!7t`]עWc;]p:dh@Ҕ,Յq]_Db#'tfQmN.=z/Rkbn?KF7͡VlQmNvai,4>+٬ﮌO*]gtn>ZcGCɥ0y?J?1LR~ß|Yg5М߂t|.ڈ,%U9~wq~IDObwbbhv'<-O$D]ț/6==[ۀzH^ܿؾyj¸M?94{^S|ڷzD_i-1i1*cx&LQPf&bs(ԽZrV"?};c=|l6D$ѿ>xGaEa/X))}nm1BDxJX#"sAZn۪Zq<,yj0lt?6I?R\mޜK>la`Ǝ]- 9U-[$y0B~etG.)F'IRtV_ɯZ`]P<"INZ߁G(+DpDaw||}l~!մ;5%ji	+eYy3b`YKsnXea[9H_FwyUgŮ_&.yPsoC	+sTSq @<Z}q6ߦG/مz8ǁG<w]_6T;@MHّ!,^w),ڀeYe9{ <]%8| \1D2eW_/߬/KRّCQZ-|o$u:$uJPNc; k^ A1n>D۞!aO՗QhvyQћm&W5<Vzm"66jbb76Lڅv!<_S;ި~qՇʎ/#&T1c\oPd3T e~v}аQJK^zh}oVHT9<Mewaf0	4ad~'.kr|'cotx?#+;Z%L"ha>YRB.BM>GP,Zi}<}p>s)4<,<)I	/9~WmɅVأ=kAje3,5{4=+xҽ~wNhWoAt*L\q{ꂅʞYc9L{K^%s;R7[bzZrAK6k_G:+ӧ*K<8;X-hEcK8'.x{K]YX\n5g;08	$Jpg\c1]uQJeMk7cFygPÔGȯi.4%Єqe,6Ot.'3z-"6}O:y*
\"VV3*zZ *%B`KS	4l%TVz^Q*Rfr/dyx;fCݙ}n;13QB0cYr2S0O
Ebi,3{w!&I2ulҮZo ] ׸3[/{{uIՊEO]\-j]<+qj^4ﶠ!@ӽ\o?m-8).ۣi/T)G}Sc1P݇
΁+XsF%**hNkk^ǯx@Mw)%} J.&~vvκY.`vkWn"u}KYKv6I@CPxdPg$!3ZCE浌ǥT)QVLBIu&ʰ<)H-R5d=hRƪ	Eu^
,w-p>JlO^`m|C6Tvu"!0V0@JQ\@0ȕ^B?]8-xqyiBQ׷2D33	feq(0ڦ|#DvΗ)C1Fv]{.d:Ha^|"B'xkTXb.IX3;31^w6rgF,M㴱8I	d8fHAD4R MWݽ<;>=:|V7r[_(gguMeAS٠HY2 <"||HDO(C=e50yT;".gR7\E\zx:nQSm<xt͔Q>2,Sf QH6#grEmLҗ6(P":8vҌ1}</2
a%Z>+]ܢH:dTFr"!:5MmAo`:]g_,Q9tIm-8tG%Llv^Q59v&aԛtǘ>nzڷt=9<j-``C׋'\53jl3t.#t}@]5DU?w͐2#rtc1X3ii^G'1K@Dlk!w}$cndyǈI-EQ*T\( qǇzW)FJ0@(	Yj'oǍ罏>H\{
sBd*;.-d|'=թ,S#,CT©jܵ2=]zJ#^(mwAt	(B72{ބ]lz!%+4"&3FD.dPEFD
TRBȇQp|:D{w)W
!Ƚ~F[[M<EQ߾?f0twx0{x>v]`;HLhwO
㬺>]{u4AZ<`qD8{1a(Qz덃0JHA+t<`w<DXJ![bV{eIZFepf[8G;&cr-"U"Uf>o25֕̿ a[THb>q,{m+]ҥ&cov"\&]X[XWܦ86уDYaT<.-yܕ%#o6XܒsjˁMTKkg,fO.A!9جm|S{aG6^Pơ%x/v8(b󨏑ִ1F}EW\N	`MA)wTm
(#QΙ鴓~(keT#?;3_ ed[Q.y~S(w*MxFx1E&	H3+[ 8i221TqcH&45D.¡Įox*X`?= @ھPfq{.DiΩHQdDi2MQJm*IU9v~inθ"w@]YRU:5uD3x!<Q3]TX/)u;aZ#")K8KkdN:zxroCŷ)Uam뀨/=Z-Ndl,J Ą1^r]L!jϗ%H7A+Brg,H⨀P [eYv1 u+Sdbd"KgGvښxͻVTl:{i8v0{zHHҗke>EntL>0BT}tļqDEmȠ'qH	[yS:ڑOwà;!7[:W푻hܬ8:m=G2Qd]N9VtXt_`T:ɇHvwsterAڠj@YMzAiɁ(pYTYw6)+|y$w -X<j˿qswoGl@{;:`|
'?1C.Ɖ,z@!BK~޴Df9s9}KERrjLeG-TEcr+S
G;\>w`k?cyX^ѡ`ɧ'k:hL C ߻2Q8^@Uv3V0W埄IlhqAK,F8eAg+W4)G]`i`. !}9Sn<T}y$L6*^/nӠ{쑿wh@zfW@a[BMQҭAk*d*n2CZ!UJkr9i#wrxs!zLtP턘F~TnZxIcII:{\jfY9GSXȽ8UꛔuR)X:I0R3_xLNݵl?]ڞr人Vkwܴ«{3;Z?- rZ',tQeA`@;;;l6t@H9s+}B1Wi:4I<l48<:ll,L@/y^'zўMN0_/P2!\_dS|^aͪ?+qpɋ;Aa[nxqn +*"ƯDӦeBmyeu uJ52@v6o&,/l6s/¦=K A F^%9Ze%L`~JNfdKn#`m'
E
Nֆ#m
vꭕ@ť/H$o6Ojb&Lw
/nIw9utUG-zqDR!Ǎ苋sGByx9`1	i{%Am9w'h9~X5	\yyNH[ĸ{t$K]"|x"<+m+X?OfSJo0L15M+oaqstP->/ţo5ds#@l<|W_!evh'?13r&=}I:U5?B9]dt1S3H{$Cj$zU|# ;dV%Dwi:קOWVDJ.ϡ(},bCRjPсzR?֩*qn#>u}6-F3oxBi1/k	W^dW+׾oߢ5Rhb:c?.@v}'Csmc*25ݧI:Hr<Lf6Yp%7!+3o#+~06VdeF8U3G>/ī7$(aaD!j~ ֍j]04ɧb(VF	e*bGr
ZUdk%h#A~Ō5<#q%d:f7h@(j_bQ58Pʌ@7b.*.[SN,ĥ;5;Ob\޽/fԧ\謌<d"K<?'_|q,ˣxer?HY*%(w|jgwAZzgi}(A+gX{*>=].;FT{5썽фfW.iD]\PkJ{ĸ{DX
Un&= nv
o0{e<9PueY |/|3~Y)gu~|-VhəlyAy+7ߝHk:vwwxEQ`WTMzL#z%v|Ϻngӌ=n-ERDIb%Ƶ1Yxdx|Glvj_3事-:h[׵5\bJniK/$#i-XԼ+K,g'.NjHdmFc@}=u(5Ȯ\yJMc͈V{#"S!UJ#ۄ)-cߕnqiӱhM.m3,r'Ia[ޣxIFmPӲI|+V/^Qv~RjFdMaE.יƎ`SGo
;eLdXt@˙2iЗϦKLAυQ%=!zJkZs#X5)_wTe(.sE1Ϲ򭔐%b`Dc:qo&f˭jy^]'Юz=_srkLZ,?Z|#~AwdtȪ.q.xk-#&N&6[05VefR\Hݭ;})/noRjl1i5cdNMI0X{hf+q%­8n@2,^**DЗ>q؈f}z$qTP>qHWP+Q/ƦmƓ*Gs],:7J506a!+1naRȣD@@Iz$ؕxROƷ≟Rr+O+iW>v1iW H$mhiEЮQ#?
q8<Lx0+.pr;Яk:ɀkvxvy\
il,U%6p׮$PgI>f/!eR0gXU
?Ov؟̗*]oa<A^ y)aP,T-?xCuv&X3bST[R y*Y
Ƶ/+¨es
[aSYʚ-kF'E|!(óGKajhr>ՂRS"ILO#%Z6%MO3 S0Exhjb޾Rg_|12VY<6"ڷ"YгҔD("eup[Q!	ylk!fsYW˖0$K$8"mmcW(SGBy
o~e@CTXɈS071tȄeA5ؚ>\!Qxu!	6!㹨rԴ0vUݙwcxsz$x86;c[Ku`D47ԏ&w'.KU`>#=o7e%&"p![YiνK.[b-}jN4<mY*,T<EB"l\|1[X؃4;*N	vA'l
J/yp(K}N>Tp5H`0A)qghlGi$4D~xLQm:=/EZ DePI[@o:wLc %X3[SYŕ\*[s_^f2!H0kuTv)2 BuDzb)zzGil=nDsS_PYWr$b ݝ0/"$T,U2 a\PTHwR]PG=;c<íH¸G|L:K=Ԣ1zS|ĮW?y{QV/a(̈HJ9dOUZhBU=-	FeB֨	xɋBz{q CP L<=JuQE3w∇ItӖ;!j92V|\4j%/=EbԬ0o	Xmخ% *9싋f˹S*Rx
]WfUY#4/B`Ǚ1$(uˤEtLs]7Mx29㝃FyaUh
Luz:DwBs6C"ERVq]d\Pd*v\!!_i[Ux@XAPu	aZ?G;w96,X
CWR-q.%7"A8Fw2J׃b:opi"gP_"WIݶ[yBĵlhEtƂb2AXhj櫿a>z;1r|q,ok,8Ykm%uY_+X]$ϫp{vKev1lH:̴ }cY?-"q]f\f:˺}YNVб*/8e4}-[gh ׯuZODuh#~;&+j.j7DaoI% <8j'4x>͚{OE(o\M/j `%W2֚(2sLMSN#!
(cGRPsR`g؂Tf-\-E1 F#{Aj$+ ]Spp6և!?q"xΠ9Z pNOqܵ43'uw5J!+;K,*<Rr_<OS=)be<wXbSh.qbFVOb!c%ݽ2󶺘(EPþn?zC7[c4(oclFfBP024ٽ㾥_e(Qqu4"<x`6~55\'V 9/{3ن̈(if;h	<`GBIPlwhwЪ9bTlֵE葃Tw]E]Md"KZه>EF	(BҶY0R[m/ҙř[:5w0ixREѩ]gθHϥIz!ӿԔ0xSsS+_|{
p
cF#$T(S=o>1!,2u|bQ+ͶANb`m	*EF,FDJd^:1}eӣnZj,722q?vM|2zgKTQM$+[H>Kh%#Qꌼ:,r*F9C$.]EFTUZ&$>㞻o"6E?,dK_(?Az_*n[~U>Zʻz2#}=u,qD1MRm,n!2t.dZxϖds:36Y磾3g3
uNi;髓V	H\NoO~!WqTE;\"N0c}AY)Liȱ$x^6#x6!+"ĆStcBu*{>kJŜIO}c	tkK@Ν%GE0dLŕ3@vO|8LC΅Į&eOZ_|DQlA+Aڋ-q7[؞!K#@JCɦQ\e"W돝KKp7G}?c^7$v̓VJ=xpNb%s?'TMz|(JɄBXsi?>b9;9~l5<fU`i<-h]3M~0jXGp+[&d7VrXI5y	U)${-.Z.rMDB_Xb2#slI>+wb~u*+hL;,Kj2J2^N;M5h!:/%ftg`P%&Q=syD}>)%ۘu8ZWDc)Fm=
ȡl?A*zND7?oFn6וWE77z\^SJARpD!JmDπFJF}{N]m>9Q}ndge./lu9e=7֙,c2t\V7%yB</e%|	&8nz`dh?,z0zo#J"IjN<2pLؽBLF, ArUBr	"»}y
	zΛh= wD'N7ׯDN@LC3n?6WXʬ?sh;i9u.Q$Fh=GcO:R4fr5,\
ԞRzh&zBQep~uǠ燎4/||!ovvKш6>n趎^4cMME0""toEo7<X2DWQO0S(],cYmy5{,ά+V=X6-4fd3nѮv.A.`nT,qv]쯅o6{,a!td+!=oٚy)Jᘢiw:*;cg` .Pzho z㺢?~cm(&ˢG0~XV);qroU@>C\uO»gs:r͟]qh9W_&D}5~AN3˝_u.,mႲ+IύYA6wifw>f*b.4:puBl}F~'www:m6wɁ1+T܊ѽWi:Al
ӆ8xw+[/';`A4?Ua=O{79u|@ɸrwh}e'N3X'H,hYFhRTaykcW6-oO%ʌ/Pv6os<dH+)lZ>O15~?u$?eh[åsO`QtBf|fV_tӋ?]c,GxkUpWU!pHaljajw.y9aC9e/n8ߦoNH\2t|1)x,AJ8O1_"4:s`x>]MIE;j[ =2aD:TK$5G09:٠	Wo渃8Yݶ=GwZl9^^%ëYag9q`/;wMl]*]Y˫ˌP<ٲFv.dNg w</WMFZ)?kt;Ϭ/=>3PuRo؏jk<߁Gj0K_xx$`F$BmnX6zABQD(ؽT4rT8@4! C(6kODiܞcpǵSO}nIQ1 zi&	QBT7 J6nϊb|Xc:E3cFb燃Y|qGlr5F]ϧdFsMػ=z09h9.HKD~f_\ކ,"$E|~ͽXEDҚ1{Za+]WWqZE3࿧a8Ã?e({6]DN  ՅH-o (}z +#`[܆ڷB|\7ɫCB\,Z8IǬj.~Miq҆6[ª莳e	ssέf1GX3&Bh|5>_Q)5FxW<icG0~51(V/L0Bf=Br+)-fh߳UuU/l';K]uj?uS[XRiZ3)H#suj҅xS? 5W_sG䩹gF\O:4!-TYyN߿lޡIݩ3=iH:>x-<+;xI(2aYY9&:cDqwn$8 +x謶Ԓ
k28#'@br^OLj\MDlcl)-b)zE]2)^a\ӡ6:$vK@ahĻdlKڹSƖe(@CT?~kFL!COȻڪA!>=Sra(["/~sF{}lN eMr븃6;`o
"e%("~Z_=e	'W#ĉϻyiwЋ09
jX9䓰jaM$k*ʬznNE\'Y'
d&Tr~?(D<(xT{J Rriwb7{՛Û\mc]e%.0ĸ:*ˮ<|2!ub.|D8vgOd%2iRET1vturog>ԡXjHp|!0@ڍK{CtwnI8|F}p('UDMSlhSR4c^V)Μ7GG'\/Hn Ly*D߷GUZH?>|[-sYvV/K| oMAxmk6Yi!q,]LsWR}nVos'uɲmجɀFo4b&a=w
8ɹdCzV3^rm"2)E5><k#J (Σ*Kdi(LHjMs:+)kbb|mewP-r#&bm|e>	/BGA4HYxTHS<ٶ3:Ic!<CO0wtLn[VM$;z=2z%fdIc
a0Yp618jīhxifF{hŘPzȨMer9 k058RvR%q{g<V($Ӎ$P:퓎)eYͣx&]|9<xkS:1O!uJjh(|ꌥ q6'IP8
43%w't,Ucw(L4|sJSl9\HELeR|>
,9<p #906P²֕8kwy3هwSMmu9<@q<,K9B^FfxhE"K0*M#ő"xJvOO tTi5 0>"	dtn%#,61+0 :zݩS%sLgAӆɚ|Y#W7;(35Ppػ_c:\Ni!aJt@jr"d/d=
ק]+HPP Qᨺp)PF43ʒH&q|*u)+H
\sBG*&k*%Iz I=Y)Hlo%B-uYR
pPPsw\CCޒdz-MSHLFt9ĝ:SRk,.S@ObԡXi%RU	@v=%I/i|hx|B.`R1VWt似`F@%rµ;KT3~Usb*Ɉ1 y!GsC|G pZ!䅞Q*xU%sOqwB2{q\PdP:M^
.&JgXʭDfȩXw'7
%=@h Êh"
K6;X뀖*΂3$7~erGi#*lו"cD>޶"9tFSB8_iSQ^`}wvG8w$
V""fk2F;`.Y^p+1C@bR`0f3}z^Rfc
 wsK!7L!;~uw͜qP9m	a>:>ޑlG֫ÝFF 6n42Zhx	H흆IVzS?jlP{po8doMY"41G!Q$E*PKUe#kqkK$vkz;@%HnIKhHEHN}]%hGg*+8Dd6;Ac)` 'Ҳ}uWfש;J?lmaNl+Myf`~J|t^j/bz(t1*}6tS0̜SPiNSP[#0 J?Ô+5J~PUCɓ[ 6C)#i` WeT7WgVUr׿DGpFa:Џ-)<k>4|Ϊ=tl D"ZQe1k5YLh	eD	5$	̆sH*DdCDG{nnbs1J{&H2Nwv[m1i6t'тY8
Bجq5!yL5Lι[Ti4r9J耦qxdmTo1͓7lV.F~M$*SpZ2ejRH-KmqY2"H,>`FtkiEcE-wSl̠liUl*pJXIv=HI7МŸf-U;OR
`'f{\,kϡO҄4TC:88&@<ub_ 1])juN{>)aB pa&D6ӨAWl+od4뇓{1֍hlD^hȂ+(d.=2|)<`.w1CU:Ar/4Qslx|zn6ɇoځwOOϣȘ;ܞqFҒs\<ய}1B_nX0xZd>qto59gXj2#3E>-&kDcF4dLd<xk߽3z\3*B D5c>DO&c(ZrbAU
n %++Ԏp7du"uXaͷh
{^>Vo'j޽SλsdХ~h_[MT6@J10C|[GO,FMU N'!CdT|ף%!0p38zR
[ bt`8Wy<^πPѦArWGHym(v߸:!UЙFH!=(A$pTβ$`%ĥLe#pPyj|)i'1Fd}.7l+XE
f6$mh_BJ*e-fUHihT8 i PA	}lPT+*޸sUk=wv6L'#8f;#u8*U%[9}"p{ 0<pSq*YN<
4bV.ni]Wc50#T/*uV:)C&ItN1qC ըp/Q(=Bq+\z#:1@Cacò7
~*{
3`A}ш" "!8FJ=^{*,($=2ǁ<=*x0p55;}	t=g%5R%b$(2E)-M͝y+yF͞Kw ؐlhOtu^(!vF^;gݼ$ %s#ƜuI>2]/
 |C:r;\|l:f';oyke(xb '7(2Jڑr0t[	MXڜlew`ԟW<&3tĺ7BkDp	nAVo^G9Bn`/Dɺ۲zN]"AE\Iߘ2F@F}6or4=/9c7ǂ QK,$+e^66%Чe',lwFe(U@ņhڂ@Z>L_<ІU;:AwVXW{[+L 8H!7?&3*Ak[7<Rx3xSS4?n[gUZ¯<SЈkkϵŏE
%0ғȏPUe*%Ï
t @V?pG_1,"e2}ƘI;ٝgk፰<?tϿp`"#vib!	>+,V`<ƋeM)'-uӷy5$/Bm\ ]oWˢW߮zY=*4`ĒoY=G\u_i(IwӴbN0w&q3hLA&70b`%C's| vٍ7butl6Xu7Kh^'fhj?4"Pl¿_k;@y_sjkn#U1##SO4+ˣXm;^CrU36{)<A+ywEyl$LJI"`awݶϬ?Mo$C=O;e %FӛWVۈB^!HΔ5a,*pQ@'	E(xO2^ƻJRDJ7eVH"2p?Lf"w=LPl&dd9b;Gþ!r;*Egm@u}vBx2<O21*ER7P0;:H%"fXgVոCOSUoEss6}c*_8Mbտ)lH :BGxύG.'q{f*#Ҿhg	Q9
|2ܞ;%bcVM^w^0"mm)cCl(7Ti)M""q^E!+o:kΑ\>ςDkFWUJkEy#mc}mgRm#nJ˽Qhә%KL[ldS hP[;H"T	s6]l{׀;.Hct՞;.;mvƈV8Jn+2a#bq(yVD#pIv"&c6с$&p<I|u^-Sx{
/ZMn);'E/no's1w"NvQ:-guS6|q>zF̽$iXL).,{4T٢)Iò#r6^>Y<ٱS4ͬkb2U8{c6q`ƺ/'ke-e4ưG-m XOn"S&z}ɉT`ZQ\9y>u8 |9/3=ߥ
UοQuM]m+Sb,E2fJ*tk-BW{ي{z'?;)Ys1b10QBq`Jm?1CvbQ^],PBeJRQ(5?4Uh>:b6Fj_=xu7%VRJW_-,Ʀ(28~%Z&#}B%Yx(ũiXq!EO7$}kM$1?~6t2B˗b!cA6QS!GmfeFR27';iI>6ug7

0;^Ѣ/Kq*q/*sij2,>7xU2ٺ@VHtRS29n?쎥މʧGceF~֙	YEfߢߡYgD}T*t 
@;jsqÉdcǍÍ"U㼱@cAoW^Ks|˵.8sR-D(c1&t{5	BoYٞE	EihoB#>t.i٤rfMBC
NIԀoJfXsIj|p}P,~ޭQ˅⎿~JE~}^mdRCz!.!><yЬu@`kw7ŵ9dnGf.(=dKYkB+b#L  !%M5HS	G9J+y?O9%ISiRÈ!ʵ):s)[.:16}ҹb[ORG\͕ QSeTڎIG18ųb1\yJjZn,cT6&쳰𙣚c?Ln²gaEIBPǧ,R.XOW6 Uoyݎmr!aE.Pi+Q׊&zckD+NOOm,bf¶oH%axkwͲmDo˱6xV!BYjXʵH<8``4ݣؔ(eL+.wI؀*`#հhS4q@;+Aj81 V5$/Ac|-¶)<0rb?=C&'Rw&4uY k$S}'CA\FOb8j59
@4^LP×CxF[vV*TN"V&3!GMd$ 9J$7V&/8Br ^el}euݑ0w2S?qg_`n֏O7zp518s>Cc$34o<ЖG^?9;;;~7ԗ|Ԩwo\iaj;gyU,OY0ugdxpԏ[ 
^btD'3ި_:Av?ј>< !B;(W_vO2* ƼUH"
PVņg|Cv-Xٳ<0gY>[YYjiGǪ߳Mt;-5@~Y'gM>n~~)8Y3]t^<o{=vU&#ΐ _/jr&mGRMP+\MU8J7:%#db[Uw#d			ȽWM
jm9k̀&
DԫTF5  1wP9nD}q٣N᳾XU噞>Fχo{>A7̰H3zWqrס\ʱBhV=Y C0	u$si()0R~f3l}Fr\a;7~q5Ev%"1bD	#mtO1QֿFCc!@Do@\1蔗;zlFEQ\
	kHS@ĀRRl
a'2אTbд1bCVUΑۑI*h%gK)#E4\et^rWpW\P,s]G`'~ɿ|,%/eK'?v[ğ/)2Hq>?[tH#,/~+)Acp	{/(O޳$׺g ĊM&XiG3O=,xdp%UT\DepfL-cnloyh߂iuLvdf	+`bԕ(ĉ/$> g\u3+9z2bW@|+@[.}!A+P0_H
v_hӬB)T.&Nr΃ qW;()~(lB?k!"Y)*R^e oޟHiseiu,J{>ɂߠ<8gv1x/2i(B8;y7-!݈R1l9d@52b\> 9Re.ukI@..޻sv0!}'}PטA2bJXt6tOҠ\`"	OU>7CS5lkvrjc*hr/!_^h	/GKeRfbx%=dZD$G#ᨾuW->9u֗},9٢lue}YY[_]y|0)|N11WvJƿliA|"l~|^ ^|%Ur5l$ߋ(YE֨1ҨzD R(dy@=-SkF엉؍Ff@,r__z:+y+y/wH>[9ygeSIfc3ݷ=ЧqѶzz>-T<T',dZ~LMmnO aP|ؤPf}*sd=R*S_#M稃Sa{/@~A0ig{+	;@0 tjNm+f#
!ArR!ؔ\b\*
[Ȇ!_S&>Ď9(Y#~`PT j,!1< b\t ;cψPRym?nKgt.^2/<<fȈxV-.L,ds|tဝ%ju7Eq&*+1P%FfOE`SDU}duG?
Gyd|<"ⳲZ}]Rpلj<FΰGMҗ^įd4i7EEepKaB1JGzP*G43+ry^[ORݵ* ^V:G6Ul#J=Ӯ${Q|ZcGaJNϸ?lp7j({TT}uЋSE-
(FR/-V4w NwƯUXH$ם0aizȚzLOC-"3tcc0jxfY3`=o_lCAzatt MUl8H5
SmۋOP\t^mxsA|- :S%.gnfMg_Քl>kJx-Ӫ?7)ww^Ybs;ٷucW]F=_Nd.G
Y*I]ezfըsIGl߸_asI@V!qi<˟':gބG)'˟/H+JtE%ot~?Zd=3YPdE6wG'{чAS0O}"27:"6K?{]?+9~P|W}z]KTwO)a/^v^9vYn2pi3Mތ`"mw H2مs.ƴHPMՀFTNv˥-RsPp_:^>WZ|*3])VfObkhF>Ar\2%iD"i۔(QӗS^gfaEm$28՗qʖo$rB񷥐+4@(+cǽ]d4%q՜/-7pDL&p_z{L'xȤ)RVg)teG5,2mVݻ)*4#+xyfعOpxPUn-W|+ǷI,XL4AnĭtVO	t9S/>80qX/w/HQ,K`!F]]=u0l@n%ޚJuT{>mlXk`􁻼*˖_t{-I~ZTO/N"d_zs?$è-[6oQT@8M[eR0fUNE|^B Zc?nfy	d'M5l5~Y˹TȰcTVuVyNc=2)hʯHZSf5ݾjFMx[Ow钍TRϓ/w$KϔZx^-\~i$ZQ<p". 3rgg#wB.
>NIWE-fTI+[= E'{Q%~])@lҟ;	 3Sg*:SJDP1lW+fE%RJJB巠u~gO`-;ʿtUj4_˂srk}{kk
2,X'XF9b?窑R<q	όP"oD8-;ߤdv)1ABV{:F11~fy)Ym l%e1Ėq$U3(y6AxYlݯ1eG@v'RXYAhPrVVkEN
b9	~cwߪG2F]ß`H4@ `^\bgQ%h}TjS֞V^@!v7MN:WWW \stئ&vf&i@5ƣd.^O"aEXO
<6ւǣH
0u
~7*I)|}"1*9)Šd?՞gQ}FKoImwgY͚_X=Ş[a(4\EFJ85ax뢳p$ 
U0u_yf_Nڕb4XC-ΠܦG	v}qrJ<|yz0';􃓁#,s
teO`zW)ubUcVLV#cΒE["SJ1#kܑ)GxP;mn$Ap=\u&c68:[6G`Txc fCLs9}fB *:h'POgTFݤau@ n}=*0﹃_dK@WI@A+`6`{w0:XEN<≦7F5blc$Y:7{Pa{x$Sh9̗]Pʆ0=0yz _/zQz]|J8ǙQS蓹:}`ѹ7 .J^,D˘(Ѩpb>M_(kZM~0ha>wYMiL>Qu{\:-dB9Ι!3˒B/'>m:_nɻ- jm~46S6Cp/08 R1"ؾ
EvFTBvિ,,
wIY+{Ñc%rĽk2 ^6t~9޽G0tdj5=O~{wVU׍ÝQp>Hۻww	o[o9veNCJU|S?jl5xRRG|mU7 =peI7wxx ~
Ѓ&ȌM_<ܶ֓xL({&zV2WdaDª.6tFNa/@.'vhֵnoËj 8}ЊʿTs1cã&(bZ'1hT%6q|МwAK@néDq7nx#@4|E]v4TynUkpN	1@2}`]besnj8>PL21D@Z;em]%o(2Vi]_wVyw9D!,jQ u8jF-_P:M_iwís';GM.l[-@WGh~U[oR);T}	9CLGd*VIV/5E
kn-	 
m{}RΏ:Z)-,uM̸2fZ$x4PV(5"*BKƫjdZKU䴜WrPFCr:9م]£u^N۠);-8[w`܈+MFQ/pvHd-Ogz8(@ k;Lf3&+R$ՠSr[
vF@$:F!c"D"EI׻qvЁ!>zCo㹝4v%;xwɿGM%@ty9ݻ;v/s**~*;CKSNDpʹ`wz.vA Hn89S[[waҧ)Mo?>WLK 3806y =`*=7Z\w\yn.+7w{ W_Sץ׍'^
7 Gj%]rQx5{}0_O{̿
~(aj	;f0MT.͛AuhP-9ի8pJp]*#GEnhJazXe7S&+Εt+d\~j7wKJYLG(gt*ڢ^O #U'abnOVThm/"4!y z.:dhBH>U̸UwQP=߽HC1PXJv+G$j#O1*SRG]%1<!GR[a7C?(\CYn~z> fV#59H@ˌqD1MZ^o.Dg0		bu2Fu>lRZK(h^,ޜ0MY,G,mf4ǐ2/̶͖c3Qs'DߌЭ^p0qQtg 8(x7=GQ`Wz>!{F/(I8YP5
iy~R(bv@6W{y^SXHH+B/Pۼ$%8掓gͷ+D2=s;k}㭾(AbK<@+R%)
c>go9&܅d E;cn{<#$[ dfmv4{'ծ޹*zR"%>n\pYFvx2Ľřd9깎˂Z}!]kQMVx"Q;r(ȸM]SOҦÃc5E"	 0g=$ڜK˛;M!6OOתߊxV{.h#߃3[ש\1CZ7)V$MU&2G;7yŶq!0IHnbUcvD}6/ofu	DDdQs$4bƼ
D_\_R. Q\b	NFOlM:1R˱,܎@NrHw&:`o GCKND<K팽Y7^hfLLV(SiOAD"BI]Iѓ2a-E'Js"sxo+UJXu0|STdM|LLprz 03GF8&ler}R4 j֛R4rκ6|UW~h^Rh׶ZReʘ[%Sc-NQ6DnZјI\j>a{wjd1\ZDv~НiS>to2@#Y0ݮlVh')`-YdEt\$#i9_{4VE9BgFsfHEZ%ƛWXz@) jܴVYg2F[!1Rʞ1a8T"m7SJ^D9Onxmd2
YF6{9v&cPfId10~A!i#T]L~?F(Cody}Q*5B?y? A@ka"Y,Gfn3Ԛ($2C'mQ6z>K(\HNI׵o/:E^XGml#ܹ#xeO(R`s1Wp~YGjQԐɦ5l8ɜfkQL/fK`Tp4mUDm5B]IկznT)2>=3dy-!Cƛf;@JWdi4 yŨ/n7;/P
|,ՀIā3 `ɁSyWI%| WJS y0<DElc8iq52Jduuʹ&	yanܫg6بp\Ӵ*IJ"ɹ:V;ffri'k7l\)gXug*h^PQVq&dE<袷ezh8r{K n|X? XE3[9%S'ʚGi\Tj [?xa-:;x	{na6 *u^fKf_kbs;5oI~Mo1೅oAc 4RFРO2JfI>N;էyEqx		B#@h)?S~0K~Ш毾}j捷xJz0}tO2?e
O1OG2Fu7po] U	B|DB{k):(?҂952GoR<#JJӡz&^3$Țb/(+9ReKS{h$EXz>ϢK=AM\_wHyUIO3n8]XS{̄2"Cmx̶r̓<G>7܊cG;rd\k0㎋p(RUH G`'.صqYT}cI~79V漓 ~I"Y|S{׹57Aou`=yy<ѯ?.aQBҿ1:j<:j@Μ7Po|Cj5@v{No0a,/Wi5+0;GG|]tg_t=ʼnLrJM: );QoGȐzظjnے_(!^8WYt.k? 9>>8-<lEi#xc~P7rՓ|ک*mjT9wzɆtņ;:6>KBD!A%W֝K$tNߥTКX삹BÁ hs8Y@vUʹģ, 9s4mfʐpSl&f>Hp30SD&Dv;z^u2K`+D)qub -L/R5&~,^oG#(|F:7IUW7Htph8)D$i8ͣD$%
oZFnF5\`PI0a媵P鲑$h><PWvBz<o򢢚8Wn/"꠽4h%E6l֡UQ]wykw{BG$ф&3R@&@^TndjH)cS[)4kBbVlHxby5*4' äp#x	r
v_Fpv+QhE43tScd<Fh&@ʽ_y).ni)7ϴ1*@ZH_$6guc,8!3C]PhSr\d-!t/UH,ßW/XT	7@c	EHy'ðҺhx?1:qTvydehX#
 Y0h6NY[ǚ9VtfzC6:3d GȈɍb`N5|pj&q"b'b@n
 ]ro0aJm K>!B֏@9h!"cX's:Sq-b<oF!qd>(S,:yı.ۚu=OfR!j`[p%X0,p9ˠQJLl߀vI8Z^/]%ZPaC{G(uMX<њs2(4q([)!ȋdFeYP _^Y][oQ#|o7/u	`钋(%eG& :-l0oF%ܢsnH2xF,9#h>UYl.0dQ9
Ȓ[XZ*<`P ȠUI5RZSUx@t10M`X["7#euC;-ln~8r7ENĜ`UGpmRRr Q t$o˨mR/Usr_)`֛n{Y?>aLSm_[*w#գ(Ł."Fwv"uZrmQrJ{g/ 'Lo|aDzbRMMD:էe;OY;;8	sg++ZV<y6`11H%m
U|'L:KuY6ϖחj﮶S|AE@E옌%34 g:/ %h	LL;Zs\ӐWwǩ@P{B@j2Esujjmv)l1|vtR.liHZS2Hϥ#]FyTڈq&^_]W1 V1^eA -bQ&4Je=h]fJQ?iwoZǩ2ȫ-]Ʀo;p&zV&gg DUS6,͹=mgnBKxBd_II&Xݭ&?P=zlh+,72Z֜r"1p>MAlɀŦ],8	8^^r!
Tz1K(xH?Z%r[Xn>(@X@%Q`83;e"b
-۬LAo5vR.wE7s좌7	l7^Et ^, ёSc>P%iÇ-5z~=[W:#j|["*ΠS?P8@Z5nϷ5-rwH
%m8װQ:20	I%ʙ	WX/p* t+eia<P,BP-pnHXzNʧUF)b`Nge@XXgi&j-D]A&=wm.<P蠊JÏ\"Tw8	)mCaLvKZRa.B_Ovԫ\}o[n5^4>9:%,M6[%	Z<58RJKCY<FEbfB½eK)*jy-21z^&-S]
[	2j6uٞl0Ph>qM_&f~ܪh]i.KoYxL] F_֭-|lB+m>vwZf`	P5t}U"`N 2ǋzb`^s%xc9.&_ 
m
g=DDOS6I}+FeHXhr)8:B1PXP"̺]V]@k*Z4o`NC>nÿߴQ;p┺/Hc	^9{ۘsRE8}.(Ԉ͝cb[䳅r2F躋Kn#^5*#NXj}<Nt/(9敏4$u9#=Z~ s[[v{==H=L4R.!\&Z,J
8B
$QI}7>e=,Z͢dq~E)gU=N]{B0Cn&!Rҵ9C<,B+O7#φ}KǠ׏w@*0rqUnɚ=ܮttwwF\q 6c|4-wtZw޵[l`
9<B$8}t o3[j N_d$wF89ڍcl	>D0o,LD2o0\bp @4ɩn+Jjo6i?	&[;-h:`ʅ(B$i
Ķ&9kb"7UTw 'PL&FUKӗAH{@$(!hC2Z53\!o[PdB? 2[[U;uC1Wlszbmi-/iY	zt֦Ɣ{uc e0xi{:zz1o)'liC>,=qN͔3~kLXҩ]kGAWZRh}nFŃPFIZHR]2Ct		?S_DYq	n2,!HEE\MYYQJE
+ *k[:UVoọ6? r2̮j|YpXoYʟ9S%A0$A%4";%BlcJ|Bʰ~$
&KՑ0CMWijbJEQߓ`4hzB5QtԡTr|	2b4uT		Z&`qqr3q.ĿAD<2mԳӂ)EnM=)> X <>NSR_g_V:4ltHOFCmćUӚ{;Q
?࠭J>8ɎIϾDRz&V^VdO蚉3~~{=#M^3fξf^3ϺfX5myX]׌ vk&#-J^܌[&ƺai/anlcoiaF5̾ah#>)7@szØ_mLaR̺m,IfƝc)8t1M?@52K}]N{j_<cpYWT8EiKG2+H6o+{wŧ+`Y;3$RfM?IΦL|*O37eFy5;I{q򹷟ճ_O'\O?Ng̓柈-Ɯ~F23O)x4PFzV4"p,&1y|V8U~S?V"ҧ ;zSD]peT8x;o"S\jrsáHUw
Ppws
d荳ius-lO;Pr߻N'8_֝.t Ad,2yŎϲ}j:D&yttpYirZ6cq7HCڮ4n4頧Mw2љv-(jm(8xݹ@'4spaeC^9	vʣcg :Cw~W2WjQ-`f>÷!> ޳
Fǃ营,hvW8[UjA(=@'ۃWh6{[M`}g
$539 6R%eZy!յOĳ,gWBD/8t{%'浕-(+mޠLJЖOL|&QchyjcC*(͒f^XP3@cKh(0)L:"rfE*M\ @;")\,jHIYxD$0 [bl;v<|DSFU ~wR㘅Ss%aY~vZx5ʇF^4"<)XJpg
z[-1V&PtNol>BX1li%u[1O3YeV܀=7GA'@㎞(?9MJRV
YtGSY͢rhΙ\Z?NsQv@,ןrb__u(o9f@cjV-;QbU<*#qyX!N"yk_}O#G0Z40;9jj	}Q@칣O&?:Msvr-KfCqM#\yxr_²r_7(P.KsҺÐWchv;7_:\k7[=w'[D;U"t0ģl71)orpjFN{񕃮˨yquĕȷDw<l1T\.OH\MMX.ԞR*wNaá7ZLW0{G7l	~Ln}x?Fz؛NQW,rt,oG#G.Jcl8(4i|66g	a`Ͻ\]Ǵ'bʨrpe_ECQ|F-z,aw$)]E>jiN؊B~
JEK)(	EK=d"lO癍Г"|2hUr%(wt%m?we{8rXuM+WGDFq5^ygun鯎@4]/R ʍJQ_@iJ&q]hߨE|﬑O͊q;Ɣ
MelI|sNc8(NСc\>EلtQڦiS;׿ 8L֏MÿMԳ;WAa<
H!tPF x> EXL'ݲx"pp :j<Mfϐ@hݗWh
ޖaH,WeęUXٮ߁nik͟pIwOf;&@JRaN[`6:yn+i&s5_r^1Jkܷy)}!z{0ZE3+ce"V%<ɬS0#!뻭l)~&eZJ$0b9"+<K.{#fbI6s٩+&4b+r|`iײGݟVsshPt?}vAgxSuoJ@2@JGxH/@ y"=uhcf3鍅4
8&|2%3:xb{y;H?~P6<Z`(4`JЋ\SY4c^{f3`F۝xIKBgip.hK?7T`XX[kcn?dXP_w30ewֲ{)e
H(%Ŝ%]7#^[˶~[pE`;|b[W(UFLe{@!ywM@ecsK)]%]pJXt&e"Js '|}txΣQHxpF8J&6)ApΨZsL8JEOQwޣRu\D1'dz]=DT8$1iӗƒ1MH,<Q}')( *>A6~Pn2ru{0QOb'䏣$>G<P=bJՉV	%4 YRe4V
3@Y!E܇ӛfrpsx--FW
Ez.$3zѽIƺ(%PcV8C븜"0= |*|pa/a*wjh_0`!}tDUzZh:iQ8^wrJ  }23ao~BIrAs*@	x@JP
АcCB<!<g2L6]zH_9+5@XH1PM![	LsQ.YVHpˉvAW
Uu<nf*ԡ-]NTٞjDR"'^Ob0,dvEuO
nȔr9B8 @2g Ǣ5MjweR Qw;)1ߦwS>A%ׂtbR&Qàz=*kg00oЛ^˞E[QfގX$ LNMLvhz/Qbc:)Yy4^621ىomYx9c~`M⩜3Yag;;R)^5Z%0_.eB92Qs<IBjbm<~s ZhގepW:~{E:l|)a:燩ߞ|Mw:eA޼b1x歚ru'^gW6Y)ONSл6rJ*$JN--?:	+L>u<Q_OB~~MnQOO0;T+ĮNASRq4V(ԍw2
vJϧTƷS*S2ʔ9sesm=Uj$BJ-1O׫řݳLH6a=Qn[6xs(7}k[6xGmyvZ"JE!M(KU joՏ~glJ(78#\&jxѶ G)(ŷd9x*ԯ2ŉjMVt_eoBRZ]]^]y!;T%1gsq1
{^ZTTsҲw+S##/9E( {c-*N,nDqҺܯ$"S(1f ̄V6$)nC?PV?1pȲ$hc4qRcckc~WBFLE>ޗ4ʚ\9Ŏ՞Z֬Ϸ[lEa=s^5
Ԗ#-n[_%ӌ$j ԍ-8`jNHiSBʦw哪΂kjԣQY!al+:189:j'Mb\<XуxbzT
"]\
zP.ʂo
QY!(vL݈%bYR0GV[Fmv;1nP4yuEŴI1HN)9:jQS}CqHY@EK3]X*jERRdџc&k7@(EXq!rѷth}MAN>)mP$ݡ}F-2gM^؀Ƶ>%Ezh'˘N`@yc oL1F#ah	FK5D@'`Q
CA2U/Ёj8Y52Ӝ]$Ѷa
@>^JKI	?WY)w<k6tIFՖ3$XGun$-%?n4=F{Z?v)R 6-{`4,G,@@@9!"Ԫ]˧Eʪ5ws,kR
A2)R&x6/]QT.G*7FBcy5C!"*tKfƲWWCJϥFAgT^A,JQ"J0|--jg$ل'-aSi$f꺉HImVW*jYx2 "&kDRaRb7aV;1½{>FChT
-(ן+(^ ؚF-N,iUt3S"w6P[ŞM[V. Y@Wb}EE,3Qȏm|=\ŹIK `]:S,}vk9c_t9ûENYw&梳Vβg$kxЫ9@fTo'	[tZ{;^F0ܺ=5 KiQu,[]ljSVj?X,@/Ǌ5꥿7 Ę@6ِ<XɂUbGnPI@%rW~.:=8-\RT T#':|se[qN
+y2eWj܅M';*İ'S&4wTW~4\ts!\!fRj6}إ"Έަ@*I/:HHH#"SI^a"yEn%ah @<^H$q_z$,`h)FƝ#b9ͺ{͟L̵O(asiJS!2}s
,
sud/(w|w4_~rrJ,!1(/aBeK\#,{(5[ u4rÓް'pGd"o^6AӚF26d.	ԙ YN%.x2|*%nĨ*)C"o^ww.Aΰx
q ~q'FSkg{L-Gu4#lO@;|6ju3J5T?`?QwG!j#ՊםΚi i6 )6j)? \i	S$Z8GN!l%[ۺQ#	wux4
>uLPJ" v,]!dÚ24:N@ 'J^O|E;6W.q.PCry9
E　I}sX=yG}eNvf}{'S*׌{ġ3VCNutEXCl2<sUh`NM)|
gpGQn	Z	}ghgnc?ʕ*	Fml.Y!rӜ Ү7<qE?IݍB֕`x4y^XEN#aY(7y:fv Uh6 <Zs*eg2"EY V#֢sGa
qBP	s҂9-K?/,N/U|\.,,wNmI˅Gۤ̇9EzμWhyVcZ<sT50M<ΊrGJAb@R>bG
U(dgDQlDT[$==|7r@Atuޤ?p^,;%jLT AA`3jBca鸓%+~Jjt̥X/LHȸYgrPdZ.
1`#SLPT rhBq{gu|GkI5mqEWUgYw:ZYsv8.b&_tO]dUnj6|ƹ7=;++  ,]fuliQ.ťb!*FRqx>9?Y9Wy WhC^v$j5((!"w7 9h@Qy"J5{hQ LpOm*N3ao+=C
ﾝ	{!D	>qv oZqWOPLB*9Kވ!zIYocs!dJPO]gUGBN L|HE{*Nw#ߎQOG\= þBX\䨠ОXJM,1<G5ej jWa#4F#$pD^"ER'pޫ=~xy|!>ʍ:áu(xgw!.m66.x47n!wYzjy^)7DB@\Shh艜A^),!?t;$8[^١MDl]~ hS8f3q6G$"`
b<8Cۥ~xI5pq	o+S?zQeUd>9=JVua3.\0)DHk{ J&~%Qr@}#ŗ<
Fȷ#o0*`)и60൧A)QN7ȦQ]G eBU{^[ym|ϥcA6tEn Q+j.9p_*DW-&s] ^#*=4=zQ[2Oar_K4X?~4D\g/GEmg>G])"tue1ܼ Z<T5bGPlab|RΙ\vlJ:xK<JFG~,Qĭ9r7B6M;=طqahBӥq\G9BފC?AG|drب>E(ƾʆv̎:/^j5,eS֑FŘbKczHiU
!$Mq߫Rp	 $x mtu"KDm.Y<+` 'gYE	[AT~f֏`%k1XOX,,*GVe?f
0S)p?,FKDjf0NM[4V!W!,HphO0r
(Wȶ ed˥WDj=6(BƝ0$TAYeB.!0wG:}'Pڍ:<("]ZtH1o{XyOl^QP+v#$㨳,:ֿ"@I,no%Gb#+l^<O.)3/mKKise|"GntJ%
L,ԇIO*Xw7A$W9;$EQ$1## %pVV_(W[Dc_ː&PLߍDr%3nZ-iVTȻ89!hL@B]rؤ.%aw^N<L7 KzAioAj4o gUs>pW}}\{N]W0lbb]=AG(( ynj]kBmZ ʆ;{b Π5`vadva3y76[ L\6":/N%t_QM	Ká:tJn+CG$<-x-8aBU٨CϐXwX}$=oV!?9=)˨Z%C	>'A勜\|NeJEjBd(X{1q"kn0r.}ly7v3IXAO&m=<*oڐ,|
t
-v0eg} js[%RcNҹ!1W_t+,/|]! &o4fJ +Q@s%xMeQS'~0lEK+#BOU=fzi~d]m{k\7
^LG8AZXOȁX'Ԡ]5:H#ޠ;V-GlҒ,+f-_	w)n(/L$Ḍ[bIOHRө&,=j:@cpi9<x DDJZ/bzE:W$9B"OeР` K(-Ys<'Z'̽<_Xnw$l^αD96(Te \pu!4K@/wދ18gSKQ0I{	KA0LY4U/i]StXdJ9hS ^o0TVj/8{6YAE#,AG$.tw/aQ|S)3a@gP&E e{%⠇n̉#ߔH<ez| ilx^Pqv#@=^75	><hk`7'akb
Lӱ[yqT"CE9bSa'yF?e5w1Z*HYA	gcTfQWCɠD%lAw8Z/]@pAqrS|ldb2G|qTْJ<Nn*%5E.
jDihdMEy3ĔxEXrXI5)O%*j<OzQhLz|8$C%6 s34x^H-aFoJK.ig$
o2E;ǜz8mNU$7NYĊ&"n5[VG4"INot,_/T$}]`'_ZrfɩKB88is,{@,TPfb%,Ք+3\&<Ro z!&#	3/Ƕn.18ٽr~D;YɱRўѾ$HH*ԾݣZ"utN5z\ w70XZ$׃I-]/IJq~iuye|^/J_ePVJt6ɔMLȖѽ{i<1\pO嘂  %yqQ4*:z?cP}Z2-1ZL?2K5gd	]h(K"+Ncu}&>zV%JCwNZ!=vgnc!L	mzʅf13EY([S:&z3{duN띮=yN?y?gQ?UЙMhHT_5#_`1_uܴ+M/YVj6f'C/8!"7wtB6E+gM]/VrvQKM'ZXrR4/C"%Ƽ$+ciLLt{V,(Ow֕(W1#IVIFr:2zϗʊ*(%D肎a8dD)I$.h:C
S3
.	r>H5❉R|9yEw*BP[U7T^XY~24c@"10o%zҪdT	ac6}()ƈ:Qcybwnhɓt00:RD5Jd.#c75<eH}])s7ZFis۪wE@MA0
{Rj+3ɽ:9悁6(ɱzu]J.=P:rG9	wݸ~ޮ}Ie%``@^BK |ǃ@n0,12@Q)/]mx3|}.wGgU~2Q0Iƙ*F\)x9	)PhT#ӈ{I"AT*d15Ouӕ?A-6>i4yysp>S|tb_7E0-!~sTa!q(؍W}g n={z_&x^d!3CR%"!LPnܮ9˃W6IIjtS<+~nB91wwwP%|{
cq%j8*Tr?\m~(Q/BBTD)Jp3D칸 1mm|4zAM\l}hƘtS_]K	+΍d,`uLj& WO!>IEźZuJMPPE,_b@ϵ?1c:.HU]"!c'p8K%uĝ1Ji{&35riuNL-96aB!TnaWaFlL.\BLh	ʙfHCI9ֻQu!\L>iEB
Hq
DJ?7tJtJL `(Q8{X3DkhUy,3zr\ԦQnSEӖk6F]oV#xs%L>)xe*K ѶI>n,:ar;
7W&"bF#p>f
^/d?ɈP*#mKAn6Zظ3if
BȘOl4Y0
p6GdXǌ-X4JjxS&Z7j^M da_cl=(9*T0Co2Tpu0n0ŅpZխbRKL)lGaJ`H<b.3] Lo͚bdhSZh4̠rc@IQ]4KQOgwBmflRPb	IX$>A
"$'vBǻ	oV)&VD'ƢHΓNU_-N}+@1nL0;ܓUJTjL\;|sӆ.D,l`30QZ[<d%`Vf^Ѻ9:,A`ăhl&0tJ2V
y/cU
067QD"
ɴ(}mm 	WƘUe+.߸0E1e0Xвa8X@E'ZbneH@\,l&AØ`yeBiE02~9ZT󻘓sl3'{~CPy[ٿQzaor-&#slrϦBÊc]ggR(Ol}8M5ZeQ5Sa5)ZJ{!eCS_TH\F'^s +$;^"pSc`$h/:?j#Σ"Jҋ$.md)Ѿ)ᾋy$\Pv(6I/:x;MRͨ͘Jޠ9-=~SWTR+>m]υxCxE`U@ě	WTFc}?#њrT2	+g}Nv
u_cX;YB&% YJJe` Q'p< 09UdՇ*iH	+.ř¡~ݒȚ-vӖD#-6jXMNt0&"es4	}]j  >Wɖq9&up334D_RP3=»1Ɉ1{A?t酸Ir.R}cU.%r#'QZȰ]^أ{54mJ\]AޔN4mFbk*)vqPD+AuɭҩdK}C^$2Q/{إoԱ:P<WGņuwf(D!]@`Dȱl,(->)+J%b!p5ŘqPoo0p(ZiL5V!FΌ!eM+lEWBֽFAs}XQ`(N
*	lpOBHfB<oQl5w7Y\DZm$Hqw{[BIbl*~k)!6N&x(u PJP7md6Z5dLRld,%!z2|8`K*ERGAGa1pϗmu~<,GRI!ǎ(b\C̝*vݡ("+G2S^Rx}o?4"yl`ŒyմwI!GhwgpiΧ,/myƑM[${Hlg"< 41r
|ѩ5@eaP*Q],obP.!@:8A_S2dvQ{r@zW\1GZ?r}YlpEʞ
6gzv^~2G<1oS;sΞLoSF1j}puu6`;Rh*8&ڻ	&w00BFu(
J-;]rh
9Vtpa0aS,^RQ|qlxqJm]bsFL2YYRn6 \`#ژ3 ,6HuDÑ,szwӓ+BdrC}xN!)1ԓ\W=1ZAiCwN<b%"a\9IIִEJv2#^Lnv#E[qCeZxf{)r=RO9Pk#Oʯ-l`V>ټ`"Fg\l2?`@]d/ǏQP :޿U0e*?&:اp$SLFtژ7qħ_spo(j3Aჰf]}Hqy/9;_Ĉ,tw0qV8bD6i´̷FNwmjZ0&n"㐩A1RaJj]7\#L˰Ƭ}6O>ÀCݼUbyCsGAw$,yj0!ޤĽG׈7]c<z0dĜ*D&{P[`/ۛ?*2cvY*N~qx^8~1=VCWSX㫔!	2ؐp	o7WYU\Ϙxq #׍R	-sZn+u2~s(Aef|JEx$M6^VqAk]5e m̀G6ڶ: 	o]}A`uhu9W|iZR$diybb}bѶmsv$
U8"*^Տ
r>,K.Ber,ۚB	V3s+;M9zL׷zzq4a1E9*9oDy}aL;@&ozӴm\Gn!LTz!dhpY^CR/^&ꑆcGN*8^/LFWȺ%Q9T(}ad[,O:E,ы8zHD/~yQ-IEJ?>
°c|d0aErKscɔC>	Au'XGͬB	p;4k8Wv1JTW3웸.C`=H`>;JH\>*FffN4JԠ4p_)G&剤!y{1$}*ڧ)'N=mcov9XU܂JQL:U$|dJ %@ԝv/*a]
KX3M$0㕎y`t*KҔbVZLDeUüCSeI r5~	x{8BhD$ĤU`>{ZA2GGqL/Jkbr;N֜h!ξX+!FMQ lIu탣3sf@t'#|}^8E
S\š{_m?tL%$|Y-M?}օsj<x˭WU#8 e;vfwԹ6D3z<D}#?unsC;sXDvc3Bc2YQj)vC*)j~d-)S+N4%VݤwD>|*?,ņ&O/)<2A77GbYفҦ"̤kZ,D(~cok \My|AOKC94{QNW.nd#ro_PD/?fτ{[^DJK
\X@E:R&-LjE"rODy%&`<kX:I^iXZ
ŋ=޷'~wsu+OW㪒2(ʛv
j0I[ԊyԶ`qCbnif /u]PPPIL-rvj7TirJ6)sxTmOR]DUBmb24Q yAURXy&js%-	5 ,^>FVû]ǆwÛ6	s_"#>O$9Μu_X110WZp^&F'vÆg79OaE'vŹcEu%
WlKqQǃM([<(.T'Z=!Z#g})DOQK_F2#µ$F=^D[-A߫`НU4n-n; 7b^
]QfXCrWأD-xО*5
eOd]$B;={JRCV͌{_7dKu&Odnjɲ]X>JHY:9odjJtc=!ևCo>53x\12K6RQrVqdLR")8S>	^,1Wke-B	{svO<&
ayh	e!YA-%z|jǴ=tZjahKi&JAdw OJF|Tno%Z?l?Է6|r@幰M1R%	DWI־]^[^VN_S?>][{-?]{gէUZ7urYt=y@4`iH!;^ءCuW^Tתkk/1kqK,( ײ=rN !awC?
j>Ƭ|F
5Y2"#.ԐP*%I%QJܕ0g(pf8kO	w7@gh7vI<ѿNǈ]%bɕ`IY&e'TESGj	w^ea$jC,sةX?:RKi9H"aG;U `yx5vvwo7[-e:u~t8٭9'G-tm O+u]0.D1KD@*.Jm:GNc rC,)mE>
`Yo±6rGV3,b>)~鑅PB۾O9޲E%A[^+'"^jad5@QJ"V0Vhx`b!hi
a.vWxw/]Ib/tR)[T$'"X"'[9!;@y_e9uFњD/FND]*AQ	pu7ϣ_==,Gm,3*k֏^5i.MwŊ-`D! UؼO]E8,4"δ)5r- 	}_,|[8[(,vuꁱWZwEmQ
K~p0 ;*ԿC<;'cY%S	Wʻi
D<.**o\HX	@AYȣ&cdJK}-fR׈W؈j,j/im9Ec̣$]+*u>^n^jU9D@4<}p XX?_7tZICĜtXy@DO2+sWRHTrI.Il(3\Գ_ $5H9 L$HDJHp"eWH3|9m#JlM]FFr	v4c2GQ1 BtK
9i,_}'ו,̳5}a<Fn&3H]w(R9
5MǁؕiQ.6]4Ú)?tWbtIC^rpKM.kpg-ݡ]gEr'ڊbNGˆVm!ԜR9!+J,8FZw@`tM(4"m$[ +s}osiAt(d:!%WPẟY̒D!Ǆ
GuY}ϛL5X#V|q^#GB=xSF xX-6/z3#dm3KKpwV+dWN`<-	,E0\xDMtoQwSR#;v>kɑ'khoҙߎC޳jbMV/qMcO1yCnG<c>{?';m{#ϟ9YZK:ǽ0VJBy@&ѝnwuFƒ͢gEhO')ubȑɁcP-r~Eܘ/&_to@UV}~FCQIG!vf tuy#ݚi@oK39թ$N+)(yXɆTWWhz#+M@7'n/mJ茦M1t1|B~G%NF~0	p(.n(Kt%4 Vm@l"|\JwgBnGeL$|PCAˑ\1HJSҏ}S1ɂd&(_+VD$s,`$
bILFTƏ1̴Ҭ+/E0pžEfc8NN8d:=ｃ	`*HcC5i-RjY(gˤ{kъWYn	~p60j%ND`W'	鳢5RIBFRa+B[o2)AwBDm.r9Āy$GNvs)rګ*='_%xCDhmP.(׍_W[_ob%/'ǍkB4Myr`nudMzK@-gՕuSV/?S[<\W: TUj?';"P?"4hHs|^'";U
yd> g{ȡ笴ͣ+֞+8kokkGp_|lh5vJv97Ji}0buԉ++"ʲV{~A#7!t=T}yr件AKLhDv1cGKI?H~}hAxMaI&= u{\E;
>#vqr_nۻ 71TM.P9$'4҇+ԉ}qx
cn_v5g"l* K>"`*FM gMIoQsZAEIu`z~?TD@S)j|9Cu"_į$`QFԶˉ>P:0r*PgS)?:h*2ImZ:y&xY눞(!d: Qaz`Hff)#wwQJNrkA0%#<U,j֦TeʆyvTG&z) prpvpU%vE',oN_L#>h֏o4RA }Sl7v1ye"dSD(>Y%,涩/NCx_ʊ=&L~y\r;hS,G,2j2h̜egͲ*e<۳B!wC4iUwӀwaZ1'k"$LC@)\4i.rP_ b;z<93jRTWc?RKE?Ue	T.2BFbDaFĬ?_0:-Wv7HvssYPׄ?F͕T@+\bmʨ8]?{x<jߜQs|vR*md;+YB8%z={	vT's%rKkV78^y%[`݃V9=E&ӐЖ&wdmgIl(|8ca\~g6zc0*X\6GbR(V^W?~C%?4c=	W:߫8}@0Wp=EpU*~קf&Y`տp`+Sdqwmw-^ی\kb:U7uMDGXit:?GS4Ϗ{5GoUG^3֝ʘO_y*G@X{ۉ?}<8<ȇExJ,<T,=׷S^o5[H'5O?wA׻\'9B|:	2d\c5Ig٨?j#"㇡b3[W'Snq||To$1oGMzA^;Ճ=F^sCusqDa-4S1eQ,`( f&MU2fQT^cS:SU<2jUţz~8Vk1mAi_a'}V+/ڍ([
]Q+TN:E$7$<T*<r}ju˛fD.!grKf#^Q#?޳+27vQ^w-]?ܠ^\i80&UR9MB@A1J H;f`ii+ p0W[Nv6)B20)"8oX[uBW$=VѶ@=vʎਹ&_27rEez˱S&\yþfhlC>8O;ڟ,/Uژnrk}_ŏD2g_i2;%xW1FEe^^+Sb{(j\ ev2<+9N^ןuQh0s룽2prSF1	2񑃫+U?TKF\czn3Csj! v;D9L\"͗dsο~rTc@2>6r]eAAa$Kӹ0-p&g0v
~aB{m2#KCr*HmB늃fArz+^mΦpZErUȧ`a7$IF'(,]zl#,8O4mB>NIH|PpzQ/Īa=Fʰ<
7Cn``FPY
?ѝ44>2ƗaxX4/T)MvnH~	i(|/E0~$-͑ls \dGeNӅH6Z9g2Pq&/(tLiWsZO/P\ͮQ(Clpu"e^{.!MxG-FzXD
W̑øQ^T7¸J5q=	M10rw.I!wNkXu()бEnBg/G!>P*j#RFD%wsmcV!Q0*-WYS@B{ 
q~(P ?7ɸF6ƞ!@9;Ѥ3t"asD#r#a(ȨDPLVy7خ[:hEY^2rP#Pt8*ӍD35pbQX{q)vxS2VQT`P\TrÌ0xJec
+5h[T+X~1ɨq8"?Ӽܰja~;dC'U6FzEn/?,N蓜%7;-HV,bsU}A<CP}hK?Trh+
bE@Tuȶϩgu5(/	?χn<b.OtÚqWI9rcA+q~nq`1XI]%3F-1IO9A0*p}0k'[<%%j0&ZJ'Ybd*zѲ̅kψQ'K5͘L; _	)(>s+Cؘ
tMFBhqxBB4rQ^R6vކ*:Pq9`pC`{뒔%Oq.="KԺ}QLFݒ<{J(2@rj9bK%l.UQ<T7V#+U	+It1q2QU+:V$њ;_1ѽYCLcmLC3dd`ma܊aОK  `KB45GFFhpaTf%i>"d-'@PZn'eB
RĬ8X4'|)xC
50G\f	=*VL͌q6q8lƫ~Z
VTDyGڂE=XsB+ThT^M0(]"vW(p(v7sr	-\Bhcn46;~Իkv(HFQ@
L;]oT6tmxM;u_8mH~o]t̍Sod([+GA.0<_Ճ\"a>}eeQP#n`
u.8e{KuG|S8iZ~qL$9Zu.qM$881qwq@Coo,#qV͊zM2hl)lq\T zW'C_r҄Z.М%' 1M<9h9S>{,H.4"|W2DPG5Vz!W3ґQt{yMoUW8+:U.86Eˁ!uMP#p	,#{םC3xYٺ|;ѧg8w 7|Pҫfwn>(91;p24Ȳ3<;(&%l}hlu8.IrqAF$AW)ؐdafYsUĂ|cTs拥I8Z"?j׎]nHf)y%q&9<*;yJOxm@#ܼ0Xު*<<jn+~/qse&Bƽ_S:*lsyZ{=\dZrCEؐpkïX2X+jo,
-/2EbP6-܌A(_Y&G
^BER}@1AZbPņ9*x&b+sH5&Y(Akz~Lh<ZPY6h3"D4+ѡq1ӾG^(UO
KcQaw2ѻA9j	9t
w<f2<Rd^OIAd(!QlRE%lGLBjP6#Jm䵃߯9b"mDS1C౬WWS28&_nXIqpTJ  s3)̗+n*VeDz9Khl3ԝ3v2olekFJ?T3BH|L8o[5%t*
*4GUܰ+Zwka0}19ӥlaCND1D}6!@&.QU*#X\EJBjlVf-%q7iʉt6b߬9"OM{B]C;x9l%fA.8R|)@Mj14VAz!L Q!eLڔrZhii#A{r000>֫T>?	E3&É'f%f9Zr	/ur}#:4c<,@l&I*I*ƓE.5]Ç92w598,ԧ(M'FiLJg(^26EzCXnmb㓣ɻ,ҏ[)F4;ll`h͐Zu(aJp?믣hr i2Xn II!wΏпis[ÓTP/@
 gJEN%F)(?[}@	\C;|S&(8L9R\̣J#!SF	*&NޟS*\41 tulO$b&SI$T(|4 Kt4s&=@q01֖T\t!+@3ޙx*es6PyJxj~sX=yWZmD8rC[;x1kEP4Fh-HclrZ#ܘ"v$K2I6ۭFsr>G<YRNxT5RZ95	MoZ6d%\2::{ #;ZQIXQf芻C'TRЖE-1O,0$=ǭ5x4y.zm);6"'et;`MFC_3)/A/*?R+0r-$&2v'R^'Uty5q %n,t.@k\2\Z.H2!T4rre9 >2'XNJFfB._	PFZA9	LpM0_IE'43uGKA0^PDp5MM>[-\3ZXA}J6+SAyD\Jdm)Ȱ˥\8J4#/6iʳvDrsVC'Ü_Ayc,&|"բȨm$API% |c5x6SsH yCMᑀ	/PpE5czR>$P|P
:m8<6?U%.cґQwTJ
bryܭW"l2r'j"C
)BAN|9'=F{9OI5]#rʓAiq`Y~cQ:VkĀ^҈KQiA5s+%RsJA:5e:,VWY]PpܜbNi*aɤ^s u9׼ /5R.]9emZy0\xMRliSr_u5r椞MQ(<f2>8ݘj4gЌM_XfIzA UKV{pTio.QČJRwaYV(=
1\=Y@iӏ#aU=qȢujŏ'u?gPrRn4߰wG# ak(%ǩ"A5TG4m]{pX5y 9*,M_[6葴"MGMgpuJɟ;LJ2O Ztr
)K%:4d#UoSCw̻8̏]:7_ϱptlfF$4![`d)<% 8"i4Ir7Nɚ9 қެIP2HGA8jx+^(Kd*:D;%RS#DW[/	j(m78P0q0tzhW	+RR<lϊʮ	Zy'T3v2H|	.eQ*!.9Vj=ZP*b8rY[L7JwR׻]LتTTrnNx|Wl#c)~b/@#EYHI
bL&{2$	Ό`T8>n
@r|Y7Nkf:(@QGйή-mYJC͈GJBmŬk1l%)boͳbec#26
a0~8yJJT:HrAi;vt᳠4?z!b(Q]V>Ȃ5]y3F!6C ᱱ%v8OOR#K@/O/?]Y5Q?0˂Sg;SZ$l_}dJ76[g셳@IN\yUWE/58](HnW.2@L-ߕIU,v'=oR!>a}UȞ)aM5!P0JŖRʄU^P6rF*rHD$i^WΏ;oNOΏ#K2A7<Gl G7Pjgw'Vm7[-gȩ;n9<9:<h5k(	,YsD8f#"IÀaaڎ^d[gDSz.-uaKso^=afwB	9ڕ:+rikD{RxHTs`dVJJŸt!X7PʌP,#O(1
"HphF>lG
9twoe^@E܍09BPºhne,

7{MXBg/2RɄYk@{wNk>{랥=DsKp7}'<A.d9$fͳM{<4Mp_V]/H:G	`9Cd$Q_&v2(^q~(IDW30$?{FDY d<LDŉtN.[lճH7  YA,YYUP%2SؔkGO\3/i#JmqRd6gӃC~qIFFOZ<E~$DQ6=!՛(*"]G6ˏ|PQRX+8a,]a&K^rU)wQ5oy{>ө$r)
za>fZs3T Qr,ANݥ/w)Kf31p};HA))MbN&
Nz,;/T40"~;*ՎJ%(vԻMԓZj&QNZ>^M-8-d	EOS0Z/K@ueO~A kMUK/&zԇnݞU-V
8<%U+:-pƀOA̥beYaHFA|BUnC^k#{};r	6ڰ1'YK[k9?jwV9Ow`;otI[,/	}mwXR<Ix:D5v;(鴁
!J4ʅ-BXwyH/(j%t7vQ9?zZ!9CQai:/c8~7fZ9\639竹:E\_H=8ʚ4qiak|S}\`&ɐIPtYw!YCOyi&\8̵TNEiwV !~eg{-</t>l|0suǥQ3BU^x`uTe	ZPxxGB2D(:z07Mhkt =
gI: )|NM}||0WSA}?x?=TEJ%}$xN>D*M79}w:z*v^|7|O(RAU;N5аD37a'=1zKHBVO	ի/FDjZZm_NO@\.0sD7~H/w2Ry"NNOѵ́Yħ7?hݳ1s.-J7/SMh|u'rEuu=]rjx96{CG(>kdov&F풓9Hn2ꏲ꫒v}6؉Yե]m󈒌YUIU?̈́GjL?͍˹';Q'qܟ{wv-()w۬|WjO@[zV.0&*$˾AcAeBw@)Qmr&9%#Cstt]\CKN[RTno61,3pɁqE&̙+dȃg^~MR^&5`$l=~(ԡD-9\/ T{5ўyOP\361?x;;ImE g̡Wtz*ԇGSFewEi  ٺ!FHn%0tƺڹvka3M*'T1^C}uJ˰[v"&-;D'Sʘحss,Vobbe:"E "qK:xf#Νh QʂavV	_5,k<9b8&CS?--OF杶̾2\:dLr5ty1H敠dD<jm6&IF3֗BP=qЛXK)nCF-4DrIx	$6=4"geYqnʣWU'*=[%kZELDx"M/ȥY$S^4	JKbJXtYX9<xV.bH0TW
'}(`dJ[x	W>a'%#q@N35BqL4XV2;ͣ}CMیcً?p;o{$tZh6Z˓'u(,,8 1.?
*lloc:}d)^CTSu1dRNOn4"<cx7ĜRyLE:|Jof1\Ӈa깗pɻ,,-d]|/bRauۗpP$]@T 5zX4{32]R\>BV{P:,u{ӂsCdK(|m
;"ӥtH b9~	*0{:;LfK3/͖N",<LPLR.m_'m4O=*Qxg"ס('>ch&М_*7Bôȳ [Z:e'N{â_vy=(%.^imec%h g.nayl4n=:/1k݃71{~wꥨi`5ľ{>@A	+ĲӀV_)`;6kHs4s5>	>P	KU_~A9*Qs5<Vc{ecUŧU `VtY7qGw;) lqSI`$_Q2\^Dɺl_52t,ז	epBݻNkX|JC|<y02FbAp
f 닷1Pj
KY|SL=鈭*<uuKC(^pFdXȯp籁xLO5,jw64OfY
,e'
SXX:[Yu{yA9Mwoםr>ZU%\kO/ۨgK\MP+SnZkϤF}Zgu7^|թZyƭN3ڋ+5"V+^=VzDoRi	};ulߚ5i6֦Ο5kJim<b68 |%L7ro<.Hιi&u͞l7E٭ף+U
SM &Q4|z9s07;;jO㸗wu}^5
Ǔۻ_2H9u?Jkwqd]pU0
[!]7nӺ{ NVx>b 4σ1PXrZZv٪=_}=6K2jv* *m?,˩AmDf uj,nNWVϡG|8WSev.\@P%7"5uڈ ZG_^xS=ywx`^, pV7o+'P& i%[zL~vpyv7t.kUR]s2{7@#cgk@Yix\vdUgN/%@b2Ff>)vnG:jN=N3c;wzd>x^W7,W~yYMdѴPKjbf'ǉ~5]:ٟ˝\;_98lZQ˓ih/nz7h6{exdܓw3Ğų*`)^OöG)1&M/`S.>M&Z{og(IyXSڦnz*Ydv
pk)VcI$ E2խb{eeI()MڕS.jU>[/dN1M<+"XvHh6AcrtUxC!͝^cP*ȸ:=ƷX(BX*4{c3\"gh]wbenv\´a<' 뵯|צNSe>-#-~lL;tg\O0Ȍ&~ۆ]Vjk7եv4LA6khT-;y#AFfIح9_1!	p<*VV*kOE~=aq.Zo1˦5|j錛F6شGT)>i۝7Ôe@vO
8Dqc=<萀*J@exZPʜ[$atP3 F٩]Rrռ;ƣC)//Ȥ-?97Hj$ 0$Vɣs} :ͣ}-G)ZUXVzlNuNDHj22m?S-1}e#0:;PXؠ_
n>1<>N;T58,lk+x`_-Ep,nlE=Km^NkηQFԳF9'4R/dO@029aϫrQ<p9߃2v? k[K5{E`Sګ˫]nVau}-AuzZtT\;£,8hjJwT}$l]5%Z9j7;"Dq@rz,0'DvFם
&J9,Č5*Ű@Q^Z^R5Gdnk9@?yi*
C2a|[ۙ\Dl~\~iǦ{>hsVFK6e/l0yڕtUO92;t/Z
- 95Jd56d(lƪ z^DiȨ#ua|cZ2l1PW_
VA߽O@wmpE5Yv:#Yyu7@6zr}8hLj&uEwK'6[]VTs?n׀ T+TK`/֦Ո}ot'J)lNcV(%t\+*>f͔<Ċ#_x'tFK,!GW;;ͣzǊ0v׻7YguOdN(!q YVbNŋō7^B3z 8њ2	u"Օ!γm1H\~<
4Ћ8x6cU-ʯ_ iM9%U5D@1u$ ^UiHw٨ymecL<<rVkd
|Vx鰁uC,0z\8**^87	4Z'ǐLn5QTE_<!4SO}n^AHmL[Hu~tv2e..1uucJR \[}oI辸B&43)'CsELdJ(3y/6]?aTWOJ/Yp2KyS^=42*Iɤ F"dCTXdr`qK}]o]{sceg4	@R-q-ȈʿN"lVe 4,j2}ƜÃGcCeS`ӎe/%S:q@8gu{Uf"\b%[hƙ61@±I9}^XU6s1FhNI1;23v웛~Da[65rWɺ-Vukߗ7^jZR BU[ t~W 	#X%*f׻^Y͂cJiSoOSR;]~")Z<NmoWqʾqDQw(_{cd[aN*EjQ@`g6J&@s@}*0jlaQEJJڪ0Q1ROtsB2^-W|xy_쳲\[aY%<$EO%xi	U6Ndd,.6c/d[U?PAû/eDwV(ND`S9Q%j{j	 5"f&tJyي@EqVbVWM1{N0G}f@rVbkbX1	/+)B2L%k$AL3D$,>6JHmUᴈ\Eѧ(}iSL#qXs
v3/MLNMyIKH&*1*' +
R HURxn=8bC(h;8I#KE)}bVVjkp0I7[u:
!FJC@=qQ.),SfL˸RDj0\%[\[~YV3/	^#'3TtP*9Dߥ$$fk5'x$=()Hǣ		o`3-\,R]bWTn@&X1t-E+9,[hH>CƟZO
ȘD,
`f5)4%+qz	ļ<x$yzߞ/6&]e9^eۿ}qcﰹ+="r4g7CqCt{Kt=/i-IisT*bWLW+I,j#t-D1!@dXYh[M_XPT`VtaήMt{v:L a6D/Hh m1ƴ:s@zaCz
i.=JQş{juɼӅ;~ Gh7zZ9{Pi&DOrO TZ"ʨ.F:9(d;Wplǭ8oWlSyg4zoW5n-o-.m?׾$?=!6)w	79-1ŭsbLq8Fϡo 2
t915{6#*-:)ݏ*^௸GbXܨo=sKK1=0%gYc7&b:H6D0ňa(d#~>lo
Ą@eلP-qțbMJIh`#u*؜Vi=CU(܈`V]@Z11e_0S%o4~zyM۽?>[^3c=[WڪY	pЌ:@C:nr:p#?YC)Ff5h@Z{UZ,pL'wL0jsqw`ԟ*$뚧RğIs6 ]o&CJ!¯)Qtlō'P%OHSY+iu&RD8_+KQ%sը<-HKPEs!;Pq:Ǣ7x9ea%1A<~&'f]^q,X!JܠT8vvQPN,܆.9-P$8;)C륟Q|^obmHT	v=KP)ͷOQ<5yV*"6XjF,|fg2<^,6\owiÑ뎽*Bkɴdjn-j+?uO޶dVUuhYTʎjZKv.MQ6ɒ,m~3(Rݳ1`0 fyQž簚Tc239_hзrC+w4
-&[ҨgKBŰN͓x9*nT>Rׅ"8լVw3.8#f)X(2&ւso=sD3?mp4wܼ!!x-nrͧ=4{x&e6\Z>dW<i'r'b@:u|X=;Ik}^˖\aǷFĘr,߱/Z'}Gϲ?߹oaw% x*6ChdF}	CK/K>g^.v":gI/z{xPF^Pv7mszsK
eѲWFy=\_kX/)EN];$f8o(嶎2m%-eAiHff4$@|Ui\(1$ PJV ze[\pQ>m i4W}!g(sP藵8̉Mr	KiȞ߿v.p$45Z$%a÷Ri_Vd.i_iі67OkV"A/@5aAy\`XaaxQ*4È&G,ĦDw\|wx%.=AU@k`'C9k^"pп0.Yߨ__+ɮG$[P!ˈksT}s]SjƶOOR}uvxڗ{85';A"<P$m
8gaU3"Mi3?H?	; tbq7%''n2ٿOm/Xp}\xΜr;x>%I;J.1Ln#z"XDXc'Є4	EȉoZǜQ<!%ٌ7>E
7({q8Q(1רOMȌya㳱F1+%tg!n=9̻c&@DL%fDVXOEA4+\WMC?W\pPmP𬿎ϣtx:ɣŮ5uh?+Y-sYЖ.I*er>qe
lʻhGJUK28?	޷go_^dr]鉱6[?Ҙ`*+څb8Ck'+=i67@/ÝWiJ%lʗʱGe؝Q|ZA}f7J{Y"6n*yh׺1H+F1*6v_Nam\,sFkjʯyVB{ΣI_ь!tv}Ἢf܂ |Kr!cKE"dnw#"#\:o>R'B;(%TbG<>Č[=gď_f\s"slcFv3ʰmQVt萡_)1`1
*L(k+䴴XL[za0
B6y,XѝQD5QT%Y<mEΡ."X:En:g@b*JR931+0aNz9؃b{	<3#Ot84վh$c\qI#sNmg^	s'_Tp>>WZUM~b`lNg#^r)"CR$+~4aoMBS@}M9Mu0C?7P&~rUŃE;AiND
EoF
WS+KyUS/ϔ2/=mLA֖BkppozJr+E,$Mxb#L˻Վ2NcU
(?RoiWc `3YTs]Ss_əd䰿rK]i=H
	6Sx_t7՛6((?19T2X~[nQd:`qxۏ vޒFvEBg	)Vu̧e5xN|Uӟ:!vdiSL:#jeCe'ݍg+XӔِbMWMwz):+< PvQ7;@kE^P`A@Qx, 9w0(85$,t\id|8|ISjh|Ri^q=1`;bڼ? U-Q:I'B_< ߳蟓CW?{mze 쒡HLny9u!<|YgZ"͎ZņYM-BT'c쇨u~TӴbE+Qwܽ*'E~i +j~1Jg[)jsw=',ud֑ߓؔpzႡK9"a1z4LƑZJUFa
9~غW'U4BO%J8('઺\;3G}E6Yr3WE6?/Dn})BaZ8HS"}o*o8Ƙ2	;3|pXr]`Qh|Vc	)
A=&	ގWgl{Ҋ[^(ׁۋ3֦|ܶtL[E|<žx3=P_D2l4ށ/2`%fvK C w6yshօ26aBKo֪!ci/xa
U0*fo@g!ʺub)=0T~s G
]UcRf*
j.n=+ï#3K/-QPIMmWsRˍ;hb_Jw{W-L(eNr0E4)2[0 ]S|4:j(xy	~5ڞT辠ޠKdo|p,6r|={$n^|R77~F=W-7+
WZkz%\Y۲(/BfbzXf-81h92HgɓU$|4Zps2`xr=Zؾh&?֪dH\$ekhE\,GJJL!p N]R{LWSA:* ۳S~q ةzMlf?,aF},##W?Tr4W߻Y4Uh `Eu'V1wt/?/2

yz1+wg'ǒvD-srt/Ve	M|'/̬%U']r鬙_$fT?'M+茏yTo7xwV&(>,*+Stx[	?@]\L:V/.<4LG;s	%L"$O){cTD$KvLj;1vOpKN\}T$<4FQ<Bo=_PYfu7oЩE/:uIOgAQAb?pOqV^_o4d:Պjex6 :%pn=RJws=N~@urnBҽLw)DRЊ̯c}\H
juMG;ĄFd@cZMFW̘b\A;o>blxU$6~a8ɝx}6~Y˒FeU	g_9ݾQs<8h/:!ׅ3n2IJH^:j9[;zebyL^(^;WۈR.>l&K+^+}yz{:*#G5?9qZU(e㜕wdwtEJH3뚛gc:eJ.hpxy<8iS+fbKu9ߦsgMT;|YoCVÄjy=GO
wȫ+.|c[^~7q<28MRa	&7I'-^Kxjbkn	_s`IRC*IZ4o6noMϟ&~e53IMLXhYohj !xcc	c&9w]?J\DGqoEE7sBߛe|5_"ڠUk()ۿK֡q#C:>cvj5Fv""HNL ;#TRlieOu=q=`Uʐ`}KGM.̼)Q2ӻ!ڝGVq*>	̙9	w#ol:.wL\^/?%iJB 4# 4:1]|dcqv	Qs8'-\wq{FdL3[ojI5p:zR,@T1_/l373)=ӸrUBW,v]ζPppRVIymڀ|2$2_o
*1k 0gk<;r 4E6>}ɇ/&O4-Jb v@/{j p07q3zN Пqy6tB]h	m~Y WY(%2RvȒɶnO7	0f0
m3Safk`JK_	z4s;h?RK3D!߈!OY0wzޫ`Oyҧ.&ms y^]%B)KPp)fIwA9\-iRAĲ,iރwQR=oI#Gˋ:D-(P2-gFٺǤN3[s ҿȻ'nrzʋ֢VFJ@#Ec9}ܫwF"Ooflԟ[w~l4/5+V{zMjdz+72&
g,1g6}d@mEHg)hjV3
8&hD8vX׳
q`~^18*]*)k[b%q6:;N2=GLAN]?A<.=ΓNH?P:7cǲ<1,wv(qb2K!Op|ry5H9lOnCs#O8m0di6lɍ~<v}~?&ᘜI:ji#@''|y:MY}>_Y6l[RpvLvR	S\ӻ6<`X?gä|oBOI<m o.ilؖsD;L1P2N
*p,|~H,6""1$k}Dɕ߹?%/4Z(NŔ`ey$:KICAE2ĉblj4knGY8ߖ?Of6l+ +PR	&_oy>bg`=4Eu̐`6DL18Hv/%HwH'u<jv)9,!	o (Ǖkь!3b$W;BtÕe*Vn 0(|RϞfhG\W=y%0{L`sл\p|" FщL)So[:R\i), n(ONJ
Gq}ƴEqh)p֩CI"<4F\el '?^7SL !*J49oV{gAȥ`N /cR	e>DF@xW=m.޷zS"h P~c8EFMwia>xb@I%4Gб,픙T1og^JTg0bbiE۔L89mׄ]bG0^$:95܅l2p/moHڑ("u8Ύ]_%'+kEq[G @˙GL,4}TWWwWWS!#v"POH!9@>-"ftR~H_D4;d,(zDӄB|J/Q"ua$DVPR-tD(C`ٻ@x}-qKX^#p_d-'m)kb5-qgB+dj@eY%	dU\%KNm|OF33S1,	o2ZR% YKؼ˅Ka"Bz,}i%[4aY`.w@^jI&=+T{n2_;)}-$x$՛	`b@ǽ)s$m	7{=yF`gjn(:U:Fi{z|"q3-~tF_m[Tfb%#q/xUf@Z+'_-@VlFbB_aEtFB.aâay;fK1ړ3UJ۵>>jԁC&)86z@=0Cr3Zc:\D; m+wU)L<aMSm\FnM><ia`E^?a=~1ǱV eWT	
%(mW M9/&FP;mWwJNR'19i(aJd {0)xB$Dұ	B3CPຝT^%;_t<2\Ro)aBiǁv_|{.bI #.'a|60Q \Lk$(wUq莃*	0(K͆$p$]zԮ=d`Ȇh<n$mm8u[٤I#^ %z<S4,i<"#J]A/X
u=T,TYlVUƁsZHba!6_]PF`uS|iL;
:b$wX$m.6腾|
:ߎɢ/b|#(0A֡Y=zCc	5Q`ݍ'nL#$JpZu\FvqyU=x*BQReV(3ҧDzTzWZ|oTjL|vz=H!O(>(W3q!=F	  R-3"LdQΨZgC?OǑ64H:!6o0>M5Tж2,S&.?ࡧ7;)w=N+A?8lQǄ̓o9u1≝}1	tN,-:|QXvVTd5RXrӆ@uOUnlmMOYT}uJ;GAx5v:f$-_Ÿ@{քvo'Lhllo!T:*owtzGK*؋X6R6D?I1o,~pc-ab	{uX\m_(_%o*r<뺘V(yVvɖ0dEYT
9<WAr$!%/J$S &XjGfO*L&kskrV`ɶ9fc&wJ{Z*_ie\E`|d:%.'oe7ihel䝝 >k;\!X Gɪa4mLn)e!Ѻn9y;β8=gٖ	hUY,l:m6ҢVT FPOYM<LHB2ePXYc3@VG$	D8nA"[d}ۊQ4BŢZvT;)?FU㾎
MQPr$頱w6?N-y6+*W+|UAiM8hk+A[w̻lIU.ͬ. dښc{l
&qɛtM9l!48r`Tw/vqBC*tְ(OW+{-Ea'8 n$ɬx~Fu):k}6'3ff"_sŐvy;PD[SR⸾E$3@bh-]Ŵh,!x#Q§-l솳I=vKɃz\74êJ~{C-xBsW4-3fk~=ae3e2ay(Yܮo|֊?+N>&=Xm5F7}+Imߋ1߇@:_Z݊RB̿TAsj\&fg_(qC2PT_Q-53~OG|
<So֪'ZgYw+qy^@3ce	%û<evJhfP6lFծM F^`_ieu:l%n>VY/|-ٗ=}J)*	DVlay7j.eQ֞l]ݦ&9AĲHw XǵDe +T]4>Ug`Ϣ&>^ 
re}k8?^&ЭiTS):ru;PfTZР!*96.NQ;ST?[}8xcm;7NI#l:ܨU&$%hG+ӤJ8?B\*EԲ[RO]ɼB~if8WVɠDxcaPd.uB\(PtCu/CTV+)äZ^⼺.{BeE<\DB\(\eݮU4`6u0hUvcCquB2Y{BƇBsF¼՚(ӗx_D'up]#2c'1"I8og~R,8	i nv)űXhWaP/Z7ҋ(^!h	7c2Ȥ!7h7XI!fKjO3X͵y>hQA_"3NKwQf:q`g~|гWG{pկ~SzTk{'&3!-FSó "w|:eW!5߽ǌ ^	xGRQQc+nvZӯ4ƻEi[&OG6!#Ef/W#=n!HMF\Xs8r~<C-#$vx`XXD-dH|O 7AdvRCH@qڔ0wW&F5EEvWP2)(_//cDtزmO\;Ņ{Xd=x[t0"l&--*͖R-1ո6j͓oecf5@z*zjN6A*-CL+$zSXwHI?+fcEɴe`cCͷ*S9I88Ȓ!95A<2Wǣk-TKH2Cfz0C\LgXxT=x4q9J0.R\[f4&^.,A-tuWF|"2ڟ+_Wp:2]|b!oGj=API*Bz]XOad M>㟫1V^D9ݶΫKZ-gu`q^ѩk#wúݵcB:]Sŵz༣/_5޼E!#8:]:uWSo^x6@µpq܄S/6ml.1j, |"01YdօV[(My[tȀݍe͕DcXz(#O	^TjW v3i=[Q_Iy++9T^ګQFdzoF﴿ԊP=-"(ުEIٻOʚ 9ycOEinGlSAi=A&~]۠Z\,|q&ܱ=ClD]H6Kc/qΩғO KDEy(0
cr^][L]'YvCm!I(aԮ-'n	Ydfd5 s5p<HzT(ShaD\TƫxÌ(zQ$2Ilcu/~Δ؁I&A;$)^dm귻U>Z3Z*^jTϊ6"_dx},T MJV*iddB0vW!<]̚mFaV:'.EHFꢬYU|f9DxNvSitNBᮩAYlHx\qV\?hQ##
Fᐍ'͗NlCcPexAJ0:W:A(`06zHVD6Fxǉr2ٴ	2bu:Liap!i"X:~d"[xkܠ^/V-ⱆhVgvI1HV@{V'ܰї+˰GP>]E]ΊQR^;%U5DY؏2v9(4мZ,<2V~"՘Vaa*rV(S-#TTT\s=6߀aFF$`60
[Q	jkmWjCRr%2'S!;}׻|MA+mQb
@У8Pic_jW~txV6 *Y1BgƷBC	]xr'-I1?}~BH2׀h9T<%n_!jB}f诠 QUdX&txNC<_O(k| /'.&MXrRdJaxGмZNݫn`ʪp&9q#iIĵGP*X*$@+t*f
u+.?LwAgzi3c^pź{fDPhZ4<d%]A?Hxlv=[jBד*F@T]B&ByJco+>p,:2[z7*ZV #c"@u7㍚*##& Mu(M|3nrV-= lAаkkЙQ`wpMrn dP2@u #dz5fQd`l;,*D,c@IoT#l@kbG8#8u߀@s1^J*2 ;ejRГPH4Sn</449Ja+%0MYʎSmy&_~BU(r>0Y"`
]Z*j,_:p"_q3=MEk"[8Nvk6yxPᇎ#,_jO1;CRn	3̈#F&ˈᵔTS
E=9Cc\h%QPZ( ΊXJu."6+YPRvyʐ,x9TSK6<V6heJĒ%<gO
r{a.r; Dy
ʗq:GXݠBӪ2ݚU$h!$OB0Jyn%GV؂ap_*O<dմR&OXÕIxdifM4\fn}l~ҕ֘BɂV=A{V@-rLՒv@eq:Z4|!ކݔЛqQ|<JUX*d=+UQHXgia)}V1YƔԇOd6i@QwA'r~
p̥&ObAiޫPH\0޵﫯]߳5jayGl<y'$d钍hHڏGlsKs 7'<B؜$Щ8ryeafi)$w :4<y`-4RDů-ybp[4ۉ`GBɞ̗tO*hZb'%NqTX!Cl[!:&g_4CFtWK|}_`?@fZ<KE!bb3wH?Fݾwd@:p9C?Crlx\Kun84v##Loɖ1X(hL7:fVJi{'"_䡕84D	4`a4|b08`HB1Ǘyq8J10at#}x9`.)5h!x5QaIR5=]$kg2${0Y%c.M4 }sf"*;G/65}rfVTFK2MLpy#-baA3C[5mb[q̥xi;F8԰}aD:naFVR2Ea;QGI.Cg->0IƯ\M^j.PYJM-nLa[T%<_y*ICxr|хpiu!1Eڪ!kR1r"0HA(@a$D7G7  /J[n(m*NaZ)|])+ݻ]Y@wtE 4Fj4s)"V5+LD2?R82㘎hMFڋvoge_.	žR@#J^y\9Dn-jb.xy"9,8ᪧD1l^y݄,8TB))}QEFE j&FL~{LB%YNMnށo4j׮4#+QR;@bjs]ºu2Бfc>}:V]NiR@zkf9LLtov_d5Kح,մ<C[׸m,2]jѸHOm*%[ylXtN}׏q -״Q9Q6Kryoht!A:LLa},bv%0	\ړF[m4vۼvM!Ru(҂ro$9&kP$!_l^S(#CSiY lRmNd,`UD]pt]XvZnMBq#{hR#AW	&]qu*kt(l7ut^HWjĶqe(>NrLhf /4I*nW6h.5[b]?~[v'Q4K)݇Xp60Hf,J%`/Bj6x.
*"nkGsF\Ö wKxXBRd&H8ILC^8aJAẌ́iPbBen(EIKE@T#5o/.8N[f^eMա]Ҏc/D6gWz4Yi#-crO0z^I_"+2HBH8Srdp)k0K&GNy)ffAڄf0H/4JB|A\;Liq&L'얡nBv"vd	xO&w['&%	S|Qb_ކ>Edvi%Ppc4~MJxͼ(hDYC/~>;?"\1M%$YIc[=0C	'/C)0+ZE{jb
TIwQZ\AEY'YA	6,JPjԌy*D0ߘ)%2 iX>)J̺\2F"2Chź6}i>!J(׳۰\[y7\4JL4]p cքTpt,U-=bd`G9yh	"dAzD,ex9%#Z^n^%(2jq EJFam>Bh3XZFpcHX3"I@S3.`caa&أ\Qd5'D DW:,B(k.4j 9LLV`ʠa^R9LiȃIJq8R7bhzdVxq,h?z5ޒZ`'tBi6I@3o1/O(%dRWʅ<QX71ȇ>\1z(u.۰ؼR@w#W͇AyG!H"Յ4+8g&|yHΛW䧾~T).`'LL RNGHuo9ZʛeMߠlBoղBo`2뻸Jǣ1]ƻ|6h}yЃ.BT%W&haz@	)>HxuX)tv(bgD.BpڈҢ"y_.;!ݪ/qq^8>#^wk`y$e@α2AmmYUy1og"Q^V[+,%7ݳПSԜ1/lM,/n{[-سC;?ǡ]AZUtNU\%0, 1AjV׏2 h!dО+4(?CRjj֮f6R[Z6F#ߊ$۱kaVúF,jɂAh}<|>U;C{S=_xÍ J([{g|6o#JuLj;u\s)7ZMQO稄LyMP	-;)좚.(G߼<wv6.=_gRe?_q
Lq6u5nQ|x9|bp4pxOCi%[ᾔ_#wGHW	 Z')I1tB[}wtjjO,S;p'y{Y4[;;;s~DV"ҾC
C
KXK~e;hc|Sd̢[b)̴1J(;N}/%nDzЄ|Bt[Gsȯc˝bv@~l1`}<:?k	BR/V}R~XIIY7^՜D@%ÏɺtA({vӫ͛'//~]Ą+<rz8/'gϟ]/.^q8|'oo߼~u=ȽA -Izx9	J/
Bi`mg/w6gZgT4!":YYfm7G#)4ؤNY!a[!r0Ȑ
gCd/{X($mUT}jDpC"[ab(DZxqB bޅQUZe$ERP ʉeejĒ^""2h*BI#\|#\Ixy'˥7%Z6B@V2 5W''6[[o3VLӨ`+^*#&{c32ˀ>	*՝ݝ$ü(ʏAEAsфaZ7m٣Dna(UPVcC%ܘJ9vT1)YV8
1$|֪^.HX`.i%1N y~=#7qD&Π|hJrVhq{GWr8L)޸H#1«nQ)ŵؚ~y[}o)E!40jCs
[pc&gL,޿zq^<{;s[iw#q	8Oݳxqf7slܒ4	Ak	4npHmC̊(P#~ŏ'SGQl;F3']ظGƻ:sX`ͯ*4XM+/Fp/ef075+fϑ'ӏ~\sXm!^ߞiٹ%ڴ
XIxX0xO+:Z):#eKt5;?|PzsϾ{saґ0b+t0^wG-;5d:EqqBWLO@9-9%Y'g
ij|Ԅ{Ck.h)& :B,Iui,F,SAYD8yA׬|7?RP_H-jтwn`QzfέXN'BW
<$9R,`2(GbSs2V_-W^CjxݚjIN#l8+J`P!j/UQUqVC;#}G2vy;WwW@R#]W]!,O%i)_xГ_FX>;ZGM懞Q`W1}Wj
lq:<FX跻"y\0s`h?/8zH2]$y')7F)`>ܧF1j؎dϻ{2yhZTпs6} 6+h~oߧQ)=Պ_wzu/&̌?'vﯾwz㏊)4rfJb~b5Xl[1
n-H)Ҙɔ@gn0nqB10dz qJ㡯S3hK> =^~Ks#KkW?y¹zǋVwn	t	ҵ#?AkHGXN$%]H/Qg6X^	/+=(i=uP痼}'xV<y:R:xy?{yqs*|Ck/;tk[u޿to-,dY|4cҾ:z~4{a\sq;PZK<A	JτRZ|~C6F6JHD!#o$ʈZ :Oi@n%nBR(!pu_b(j98a-v(_ܒlYkTOuCfln ۘ8&t.{eD&Zo$@&I+[UcQU=X{pQJF%]sւbhFgA_DzB;!uݑS;<LiٔA3)ki_t#ޮ<};ꤸeR4 Y)^]y^;AR,rٮa*2fyN4ςXC=";7%/L<θr_xDLqnܫ bia-RvoLZ0d9GňF|{4	G	䲕R 4+=zt(-Rw;-1?s?HN,EIuZD}ÌѲUTrZ6ckK#I&mqTLVqpux
i4utLo'Oi9sCQ۹c;tOH
~Z෗O:	^3wwwww'?I ` {
  'includes': [ 'common-sqlite.gypi' ],

  'variables': {
    'sqlite_magic%': '',
  },

  'target_defaults': {
    'default_configuration': 'Release',
    'cflags':[
      '-std=c99'
    ],
    'configurations': {
      'Debug': {
        'defines': [ 'DEBUG', '_DEBUG' ],
        'msvs_settings': {
          'VCCLCompilerTool': {
            'RuntimeLibrary': 1, # static debug
          },
        },
      },
      'Release': {
        'defines': [ 'NDEBUG' ],
        'msvs_settings': {
          'VCCLCompilerTool': {
            'RuntimeLibrary': 0, # static release
          },
        },
      }
    },
    'msvs_settings': {
      'VCCLCompilerTool': {
      },
      'VCLibrarianTool': {
      },
      'VCLinkerTool': {
        'GenerateDebugInformation': 'true',
      },
    },
    'conditions': [
      ['OS == "win"', {
        'defines': [
          'WIN32'
        ],
      }]
    ],
  },

  'targets': [
    {
      'target_name': 'action_before_build',
      'type': 'none',
      'hard_dependency': 1,
      'actions': [
        {
          'action_name': 'unpack_sqlite_dep',
          'inputs': [
            './sqlite-autoconf-<@(sqlite_version).tar.gz'
          ],
          'outputs': [
            '<(SHARED_INTERMEDIATE_DIR)/sqlite-autoconf-<@(sqlite_version)/sqlite3.c'
          ],
          'action': ['node','./extract.js','./sqlite-autoconf-<@(sqlite_version).tar.gz','<(SHARED_INTERMEDIATE_DIR)']
        }
      ],
      'direct_dependent_settings': {
        'include_dirs': [
          '<(SHARED_INTERMEDIATE_DIR)/sqlite-autoconf-<@(sqlite_version)/',
        ]
      },
    },
    {
      'target_name': 'sqlite3',
      'type': 'static_library',
      'include_dirs': [ '<(SHARED_INTERMEDIATE_DIR)/sqlite-autoconf-<@(sqlite_version)/' ],
      'dependencies': [
        'action_before_build'
      ],
      'sources': [
        '<(SHARED_INTERMEDIATE_DIR)/sqlite-autoconf-<@(sqlite_version)/sqlite3.c'
      ],
      'direct_dependent_settings': {
        'include_dirs': [ '<(SHARED_INTERMEDIATE_DIR)/sqlite-autoconf-<@(sqlite_version)/' ],
        'defines': [
          'SQLITE_THREADSAFE=1',
          'HAVE_USLEEP=1',
          'SQLITE_ENABLE_FTS3',
          'SQLITE_ENABLE_FTS4',
          'SQLITE_ENABLE_FTS5',
          'SQLITE_ENABLE_RTREE',
          'SQLITE_ENABLE_DBSTAT_VTAB=1',
          'SQLITE_ENABLE_MATH_FUNCTIONS'
        ],
      },
      'cflags_cc': [
          '-Wno-unused-value'
      ],
      'defines': [
        '_REENTRANT=1',
        'SQLITE_THREADSAFE=1',
        'HAVE_USLEEP=1',
        'SQLITE_ENABLE_FTS3',
        'SQLITE_ENABLE_FTS4',
        'SQLITE_ENABLE_FTS5',
        'SQLITE_ENABLE_RTREE',
        'SQLITE_ENABLE_DBSTAT_VTAB=1',
        'SQLITE_ENABLE_MATH_FUNCTIONS'
      ],
      'export_dependent_settings': [
        'action_before_build',
      ],
      'conditions': [
        ["sqlite_magic != ''", {
            'defines': [
              'SQLITE_FILE_HEADER="<(sqlite_magic)"'
            ]
        }]
      ],
    }
  ]
}
2.0.1 / 2021-01-03
==================

  * Fix returning values from `Object.prototype`

2.0.0 / 2020-04-19
==================

  * Drop support for Node.js 0.6
  * Fix messaging casing of `418 I'm a Teapot`
  * Remove code 306
  * Remove `status[code]` exports; use `status.message[code]`
  * Remove `status[msg]` exports; use `status.code[msg]`
  * Rename `425 Unordered Collection` to standard `425 Too Early`
  * Rename `STATUS_CODES` export to `message`
  * Return status message for `statuses(code)` when given code

1.5.0 / 2018-03-27
==================

  * Add `103 Early Hints`

1.4.0 / 2017-10-20
==================

  * Add `STATUS_CODES` export

1.3.1 / 2016-11-11
==================

  * Fix return type in JSDoc

1.3.0 / 2016-05-17
==================

  * Add `421 Misdirected Request`
  * perf: enable strict mode

1.2.1 / 2015-02-01
==================

  * Fix message for status 451
    - `451 Unavailable For Legal Reasons`

1.2.0 / 2014-09-28
==================

  * Add `208 Already Repored`
  * Add `226 IM Used`
  * Add `306 (Unused)`
  * Add `415 Unable For Legal Reasons`
  * Add `508 Loop Detected`

1.1.1 / 2014-09-24
==================

  * Add missing 308 to `codes.json`

1.1.0 / 2014-09-21
==================

  * Add `codes.json` for universal support

1.0.4 / 2014-08-20
==================

  * Package cleanup

1.0.3 / 2014-06-08
==================

  * Add 308 to `.redirect` category

1.0.2 / 2014-03-13
==================

  * Add `.retry` category

1.0.1 / 2014-03-12
==================

  * Initial release

The MIT License (MIT)

Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
Copyright (c) 2016 Douglas Christopher Wilson <doug@somethingdoug.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.
{
  "100": "Continue",
  "101": "Switching Protocols",
  "102": "Processing",
  "103": "Early Hints",
  "200": "OK",
  "201": "Created",
  "202": "Accepted",
  "203": "Non-Authoritative Information",
  "204": "No Content",
  "205": "Reset Content",
  "206": "Partial Content",
  "207": "Multi-Status",
  "208": "Already Reported",
  "226": "IM Used",
  "300": "Multiple Choices",
  "301": "Moved Permanently",
  "302": "Found",
  "303": "See Other",
  "304": "Not Modified",
  "305": "Use Proxy",
  "307": "Temporary Redirect",
  "308": "Permanent Redirect",
  "400": "Bad Request",
  "401": "Unauthorized",
  "402": "Payment Required",
  "403": "Forbidden",
  "404": "Not Found",
  "405": "Method Not Allowed",
  "406": "Not Acceptable",
  "407": "Proxy Authentication Required",
  "408": "Request Timeout",
  "409": "Conflict",
  "410": "Gone",
  "411": "Length Required",
  "412": "Precondition Failed",
  "413": "Payload Too Large",
  "414": "URI Too Long",
  "415": "Unsupported Media Type",
  "416": "Range Not Satisfiable",
  "417": "Expectation Failed",
  "418": "I'm a Teapot",
  "421": "Misdirected Request",
  "422": "Unprocessable Entity",
  "423": "Locked",
  "424": "Failed Dependency",
  "425": "Too Early",
  "426": "Upgrade Required",
  "428": "Precondition Required",
  "429": "Too Many Requests",
  "431": "Request Header Fields Too Large",
  "451": "Unavailable For Legal Reasons",
  "500": "Internal Server Error",
  "501": "Not Implemented",
  "502": "Bad Gateway",
  "503": "Service Unavailable",
  "504": "Gateway Timeout",
  "505": "HTTP Version Not Supported",
  "506": "Variant Also Negotiates",
  "507": "Insufficient Storage",
  "508": "Loop Detected",
  "509": "Bandwidth Limit Exceeded",
  "510": "Not Extended",
  "511": "Network Authentication Required"
}
/*!
 * statuses
 * Copyright(c) 2014 Jonathan Ong
 * Copyright(c) 2016 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module dependencies.
 * @private
 */

var codes = require('./codes.json')

/**
 * Module exports.
 * @public
 */

module.exports = status

// status code to message map
status.message = codes

// status message (lower-case) to code map
status.code = createMessageToStatusCodeMap(codes)

// array of status codes
status.codes = createStatusCodeList(codes)

// status codes for redirects
status.redirect = {
  300: true,
  301: true,
  302: true,
  303: true,
  305: true,
  307: true,
  308: true
}

// status codes for empty bodies
status.empty = {
  204: true,
  205: true,
  304: true
}

// status codes for when you should retry the request
status.retry = {
  502: true,
  503: true,
  504: true
}

/**
 * Create a map of message to status code.
 * @private
 */

function createMessageToStatusCodeMap (codes) {
  var map = {}

  Object.keys(codes).forEach(function forEachCode (code) {
    var message = codes[code]
    var status = Number(code)

    // populate map
    map[message.toLowerCase()] = status
  })

  return map
}

/**
 * Create a list of all status codes.
 * @private
 */

function createStatusCodeList (codes) {
  return Object.keys(codes).map(function mapCode (code) {
    return Number(code)
  })
}

/**
 * Get the status code for given message.
 * @private
 */

function getStatusCode (message) {
  var msg = message.toLowerCase()

  if (!Object.prototype.hasOwnProperty.call(status.code, msg)) {
    throw new Error('invalid status message: "' + message + '"')
  }

  return status.code[msg]
}

/**
 * Get the status message for given code.
 * @private
 */

function getStatusMessage (code) {
  if (!Object.prototype.hasOwnProperty.call(status.message, code)) {
    throw new Error('invalid status code: ' + code)
  }

  return status.message[code]
}

/**
 * Get the status code.
 *
 * Given a number, this will throw if it is not a known status
 * code, otherwise the code will be returned. Given a string,
 * the string will be parsed for a number and return the code
 * if valid, otherwise will lookup the code assuming this is
 * the status message.
 *
 * @param {string|number} code
 * @returns {number}
 * @public
 */

function status (code) {
  if (typeof code === 'number') {
    return getStatusMessage(code)
  }

  if (typeof code !== 'string') {
    throw new TypeError('code must be a number or string')
  }

  // '403'
  var n = parseInt(code, 10)
  if (!isNaN(n)) {
    return getStatusMessage(n)
  }

  return getStatusCode(code)
}
{
  "name": "statuses",
  "description": "HTTP status utility",
  "version": "2.0.1",
  "repository": "jshttp/statuses",
  "license": "MIT",
  "files": [
    "HISTORY.md",
    "index.js",
    "codes.json",
    "LICENSE"
  ],
  "devDependencies": {
    "csv-parse": "4.14.2",
    "eslint": "7.17.0",
    "eslint-config-standard": "14.1.1",
    "eslint-plugin-import": "2.22.1",
    "eslint-plugin-markdown": "1.0.2",
    "eslint-plugin-node": "11.1.0",
    "eslint-plugin-promise": "4.2.1",
    "eslint-plugin-standard": "4.1.0",
    "mocha": "8.2.1",
    "nyc": "15.1.0",
    "raw-body": "2.4.1",
    "stream-to-array": "2.3.0"
  },
  "engines": {
    "node": ">= 0.8"
  }
}The MIT License (MIT)

Copyright (c) 2017 Hunter Loftis <hunter@hunterloftis.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": "stoppable",
  "version": "1.1.0",
  "engines": {
    "node": ">=4",
    "npm": ">=6"
  },
  "files": [
    "lib"
  ],
  "repository": {
    "type": "git",
    "url": "git+https://github.com/hunterloftis/stoppable.git"
  },
  "homepage": "https://github.com/hunterloftis/stoppable",
  "main": "lib/stoppable.js",
  "license": "MIT",
  "devDependencies": {
    "artillery": "^1.6.0-15",
    "awaiting": "^3.0.0",
    "chai": "^4.1.2",
    "mocha": "^5.0.5",
    "nyc": "^11.6.0",
    "requisition": "^1.7.0",
    "standard": "^11.0.1"
  }
}'use strict'

const https = require('https')

module.exports = (server, grace) => {
  grace = typeof grace === 'undefined' ? Infinity : grace
  const reqsPerSocket = new Map()
  let stopped = false
  let gracefully = true

  if (server instanceof https.Server) {
    server.on('secureConnection', onConnection)
  } else {
    server.on('connection', onConnection)
  }

  server.on('request', onRequest)
  server.stop = stop
  server._pendingSockets = reqsPerSocket
  return server

  function onConnection (socket) {
    reqsPerSocket.set(socket, 0)
    socket.once('close', () => reqsPerSocket.delete(socket))
  }

  function onRequest (req, res) {
    reqsPerSocket.set(req.socket, reqsPerSocket.get(req.socket) + 1)
    res.once('finish', () => {
      const pending = reqsPerSocket.get(req.socket) - 1
      reqsPerSocket.set(req.socket, pending)
      if (stopped && pending === 0) {
        req.socket.end()
      }
    })
  }

  function stop (callback) {
    // allow request handlers to update state before we act on that state
    setImmediate(() => {
      stopped = true
      if (grace < Infinity) {
        setTimeout(destroyAll, grace).unref()
      }
      server.close(e => {
        if (callback) {
          callback(e, gracefully)
        }
      })
      reqsPerSocket.forEach(endIfIdle)
    })
  }

  function endIfIdle (requests, socket) {
    if (requests === 0) socket.end()
  }

  function destroyAll () {
    gracefully = false
    reqsPerSocket.forEach((reqs, socket) => socket.end())
    setImmediate(() => {
      reqsPerSocket.forEach((reqs, socket) => socket.destroy())
    })
  }
}
The MIT License (MIT)

Copyright 2014 Anthony McCormick

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";
exports.__esModule = true;
function parseArgsStringToArgv(value, env, file) {
    // ([^\s'"]([^\s'"]*(['"])([^\3]*?)\3)+[^\s'"]*) Matches nested quotes until the first space outside of quotes
    // [^\s'"]+ or Match if not a space ' or "
    // (['"])([^\5]*?)\5 or Match "quoted text" without quotes
    // `\3` and `\5` are a backreference to the quote style (' or ") captured
    var myRegexp = /([^\s'"]([^\s'"]*(['"])([^\3]*?)\3)+[^\s'"]*)|[^\s'"]+|(['"])([^\5]*?)\5/gi;
    var myString = value;
    var myArray = [];
    if (env) {
        myArray.push(env);
    }
    if (file) {
        myArray.push(file);
    }
    var match;
    do {
        // Each call to exec returns the next regex match as an array
        match = myRegexp.exec(myString);
        if (match !== null) {
            // Index 1 in the array is the captured group if it exists
            // Index 0 is the matched text, which we use if no captured group exists
            myArray.push(firstString(match[1], match[6], match[0]));
        }
    } while (match !== null);
    return myArray;
}
exports["default"] = parseArgsStringToArgv;
exports.parseArgsStringToArgv = parseArgsStringToArgv;
// Accepts any number of arguments, and returns the first one that is a string
// (even an empty string)
function firstString() {
    var args = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        args[_i] = arguments[_i];
    }
    for (var i = 0; i < args.length; i++) {
        var arg = args[i];
        if (typeof arg === "string") {
            return arg;
        }
    }
}
{
  "name": "string-argv",
  "description": "string-argv parses a string into an argument array to mimic process.argv. This is useful when testing Command Line Utilities that you want to pass arguments to.",
  "version": "0.3.1",
  "author": {
    "name": "Anthony McCormick",
    "email": "anthony.mccormick@gmail.com"
  },
  "license": "MIT",
  "main": "index",
  "types": "index.d.ts",
  "engines": {
    "node": ">=0.6.19"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/mccormicka/string-argv"
  },
  "homepage": "https://github.com/mccormicka/string-argv",
  "readmeFilename": "README.md",
  "dependencies": {},
  "devDependencies": {
    "jasmine": "^2.4.1",
    "typescript": "^3.4.3"
  }
}'use strict';
const stripAnsi = require('strip-ansi');
const isFullwidthCodePoint = require('is-fullwidth-code-point');
const emojiRegex = require('emoji-regex');

const stringWidth = string => {
	if (typeof string !== 'string' || string.length === 0) {
		return 0;
	}

	string = stripAnsi(string);

	if (string.length === 0) {
		return 0;
	}

	string = string.replace(emojiRegex(), '  ');

	let width = 0;

	for (let i = 0; i < string.length; i++) {
		const code = string.codePointAt(i);

		// Ignore control characters
		if (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) {
			continue;
		}

		// Ignore combining characters
		if (code >= 0x300 && code <= 0x36F) {
			continue;
		}

		// Surrogates
		if (code > 0xFFFF) {
			i++;
		}

		width += isFullwidthCodePoint(code) ? 2 : 1;
	}

	return width;
};

module.exports = stringWidth;
// TODO: remove this in the next major version
module.exports.default = stringWidth;
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": "string-width",
  "version": "4.2.3",
  "description": "Get the visual width of a string - the number of columns required to display it",
  "license": "MIT",
  "repository": "sindresorhus/string-width",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "engines": {
    "node": ">=8"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "dependencies": {
    "emoji-regex": "^8.0.0",
    "is-fullwidth-code-point": "^3.0.0",
    "strip-ansi": "^6.0.1"
  },
  "devDependencies": {
    "ava": "^1.4.1",
    "tsd": "^0.7.1",
    "xo": "^0.24.0"
  }
}root = true

[*]
indent_style = tab
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 150

[CHANGELOG.md]
indent_style = space
indent_size = 2

[*.json]
max_line_length = off

[Makefile]
max_line_length = off
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"exclude": [
		"coverage",
		"test"
	]
}
MIT License

Copyright (c) 2017 Khaled Al-Ansari

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';

require('./shim')();
'use strict';

var callBound = require('call-bind/callBound');
var $replace = callBound('String.prototype.replace');

var mvsIsWS = (/^\s$/).test('\u180E');
/* eslint-disable no-control-regex */
var endWhitespace = mvsIsWS
	? /[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+$/
	: /[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+$/;
/* eslint-enable no-control-regex */

module.exports = function trimEnd() {
	return $replace(this, endWhitespace, '');
};
'use strict';

var callBind = require('call-bind');
var define = require('define-properties');
var RequireObjectCoercible = require('es-abstract/2021/RequireObjectCoercible');

var implementation = require('./implementation');
var getPolyfill = require('./polyfill');
var shim = require('./shim');

var bound = callBind(getPolyfill());
var boundMethod = function trim(receiver) {
	RequireObjectCoercible(receiver);
	return bound(receiver);
};

define(boundMethod, {
	getPolyfill: getPolyfill,
	implementation: implementation,
	shim: shim
});

module.exports = boundMethod;
{
  "name": "string.prototype.trimend",
  "version": "1.0.5",
  "author": "Jordan Harband <ljharb@gmail.com>",
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "description": "ES2019 spec-compliant String.prototype.trimEnd shim.",
  "license": "MIT",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/es-shims/String.prototype.trimEnd.git"
  },
  "devDependencies": {
    "@es-shims/api": "^2.2.3",
    "@ljharb/eslint-config": "^21.0.0",
    "aud": "^2.0.0",
    "auto-changelog": "^2.4.0",
    "eslint": "=8.8.0",
    "functions-have-names": "^1.2.3",
    "has-strict-mode": "^1.0.1",
    "nyc": "^10.3.2",
    "safe-publish-latest": "^2.0.0",
    "tape": "^5.5.3"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false,
    "hideCredit": true
  },
  "dependencies": {
    "call-bind": "^1.0.2",
    "define-properties": "^1.1.4",
    "es-abstract": "^1.19.5"
  }
}'use strict';

var implementation = require('./implementation');

module.exports = function getPolyfill() {
	if (!String.prototype.trimEnd && !String.prototype.trimRight) {
		return implementation;
	}
	var zeroWidthSpace = '\u200b';
	var trimmed = zeroWidthSpace.trimEnd ? zeroWidthSpace.trimEnd() : zeroWidthSpace.trimRight();
	if (trimmed !== zeroWidthSpace) {
		return implementation;
	}
	return String.prototype.trimEnd || String.prototype.trimRight;
};
'use strict';

var define = require('define-properties');
var getPolyfill = require('./polyfill');

module.exports = function shimTrimEnd() {
	var polyfill = getPolyfill();
	define(
		String.prototype,
		{ trimEnd: polyfill },
		{ trimEnd: function () { return String.prototype.trimEnd !== polyfill; } }
	);
	return polyfill;
};
root = true

[*]
indent_style = tab
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 150

[CHANGELOG.md]
indent_style = space
indent_size = 2

[*.json]
max_line_length = off

[Makefile]
max_line_length = off
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"exclude": [
		"coverage",
		"test"
	]
}
MIT License

Copyright (c) 2017 Khaled Al-Ansari

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';

require('./shim')();
'use strict';

var callBound = require('call-bind/callBound');
var $replace = callBound('String.prototype.replace');

var mvsIsWS = (/^\s$/).test('\u180E');
/* eslint-disable no-control-regex */
var startWhitespace = mvsIsWS
	? /^[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+/
	: /^[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+/;
/* eslint-enable no-control-regex */

module.exports = function trimStart() {
	return $replace(this, startWhitespace, '');
};
'use strict';

var callBind = require('call-bind');
var define = require('define-properties');
var RequireObjectCoercible = require('es-abstract/2021/RequireObjectCoercible');

var implementation = require('./implementation');
var getPolyfill = require('./polyfill');
var shim = require('./shim');

var bound = callBind(getPolyfill());
var boundMethod = function trim(receiver) {
	RequireObjectCoercible(receiver);
	return bound(receiver);
};

define(boundMethod, {
	getPolyfill: getPolyfill,
	implementation: implementation,
	shim: shim
});

module.exports = boundMethod;
{
  "name": "string.prototype.trimstart",
  "version": "1.0.5",
  "author": "Jordan Harband <ljharb@gmail.com>",
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "description": "ES2019 spec-compliant String.prototype.trimStart shim.",
  "license": "MIT",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/es-shims/String.prototype.trimStart.git"
  },
  "devDependencies": {
    "@es-shims/api": "^2.2.3",
    "@ljharb/eslint-config": "^21.0.0",
    "aud": "^2.0.0",
    "auto-changelog": "^2.4.0",
    "eslint": "=8.8.0",
    "functions-have-names": "^1.2.3",
    "has-strict-mode": "^1.0.1",
    "nyc": "^10.3.2",
    "safe-publish-latest": "^2.0.0",
    "tape": "^5.5.3"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false,
    "hideCredit": true
  },
  "dependencies": {
    "call-bind": "^1.0.2",
    "define-properties": "^1.1.4",
    "es-abstract": "^1.19.5"
  }
}'use strict';

var implementation = require('./implementation');

module.exports = function getPolyfill() {
	if (!String.prototype.trimStart && !String.prototype.trimLeft) {
		return implementation;
	}
	var zeroWidthSpace = '\u200b';
	var trimmed = zeroWidthSpace.trimStart ? zeroWidthSpace.trimStart() : zeroWidthSpace.trimLeft();
	if (trimmed !== zeroWidthSpace) {
		return implementation;
	}
	return String.prototype.trimStart || String.prototype.trimLeft;
};
'use strict';

var define = require('define-properties');
var getPolyfill = require('./polyfill');

module.exports = function shimTrimStart() {
	var polyfill = getPolyfill();
	define(
		String.prototype,
		{ trimStart: polyfill },
		{ trimStart: function () { return String.prototype.trimStart !== polyfill; } }
	);
	return polyfill;
};
Node.js is licensed for use as follows:

"""
Copyright Node.js contributors. All rights reserved.

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.
"""

This license applies to parts of Node.js originating from the
https://github.com/joyent/node repository:

"""
Copyright Joyent, Inc. and other Node contributors. All rights reserved.
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": "string_decoder",
  "version": "1.3.0",
  "description": "The string_decoder module from Node core",
  "main": "lib/string_decoder.js",
  "files": [
    "lib"
  ],
  "dependencies": {
    "safe-buffer": "~5.2.0"
  },
  "devDependencies": {
    "babel-polyfill": "^6.23.0",
    "core-util-is": "^1.0.2",
    "inherits": "^2.0.3",
    "tap": "~0.4.8"
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/nodejs/string_decoder.git"
  },
  "homepage": "https://github.com/nodejs/string_decoder",
  "license": "MIT"
}// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

'use strict';

/*<replacement>*/

var Buffer = require('safe-buffer').Buffer;
/*</replacement>*/

var isEncoding = Buffer.isEncoding || function (encoding) {
  encoding = '' + encoding;
  switch (encoding && encoding.toLowerCase()) {
    case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw':
      return true;
    default:
      return false;
  }
};

function _normalizeEncoding(enc) {
  if (!enc) return 'utf8';
  var retried;
  while (true) {
    switch (enc) {
      case 'utf8':
      case 'utf-8':
        return 'utf8';
      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return 'utf16le';
      case 'latin1':
      case 'binary':
        return 'latin1';
      case 'base64':
      case 'ascii':
      case 'hex':
        return enc;
      default:
        if (retried) return; // undefined
        enc = ('' + enc).toLowerCase();
        retried = true;
    }
  }
};

// Do not cache `Buffer.isEncoding` when checking encoding names as some
// modules monkey-patch it to support additional encodings
function normalizeEncoding(enc) {
  var nenc = _normalizeEncoding(enc);
  if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);
  return nenc || enc;
}

// StringDecoder provides an interface for efficiently splitting a series of
// buffers into a series of JS strings without breaking apart multi-byte
// characters.
exports.StringDecoder = StringDecoder;
function StringDecoder(encoding) {
  this.encoding = normalizeEncoding(encoding);
  var nb;
  switch (this.encoding) {
    case 'utf16le':
      this.text = utf16Text;
      this.end = utf16End;
      nb = 4;
      break;
    case 'utf8':
      this.fillLast = utf8FillLast;
      nb = 4;
      break;
    case 'base64':
      this.text = base64Text;
      this.end = base64End;
      nb = 3;
      break;
    default:
      this.write = simpleWrite;
      this.end = simpleEnd;
      return;
  }
  this.lastNeed = 0;
  this.lastTotal = 0;
  this.lastChar = Buffer.allocUnsafe(nb);
}

StringDecoder.prototype.write = function (buf) {
  if (buf.length === 0) return '';
  var r;
  var i;
  if (this.lastNeed) {
    r = this.fillLast(buf);
    if (r === undefined) return '';
    i = this.lastNeed;
    this.lastNeed = 0;
  } else {
    i = 0;
  }
  if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);
  return r || '';
};

StringDecoder.prototype.end = utf8End;

// Returns only complete characters in a Buffer
StringDecoder.prototype.text = utf8Text;

// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer
StringDecoder.prototype.fillLast = function (buf) {
  if (this.lastNeed <= buf.length) {
    buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);
    return this.lastChar.toString(this.encoding, 0, this.lastTotal);
  }
  buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);
  this.lastNeed -= buf.length;
};

// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
// continuation byte. If an invalid byte is detected, -2 is returned.
function utf8CheckByte(byte) {
  if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;
  return byte >> 6 === 0x02 ? -1 : -2;
}

// Checks at most 3 bytes at the end of a Buffer in order to detect an
// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)
// needed to complete the UTF-8 character (if applicable) are returned.
function utf8CheckIncomplete(self, buf, i) {
  var j = buf.length - 1;
  if (j < i) return 0;
  var nb = utf8CheckByte(buf[j]);
  if (nb >= 0) {
    if (nb > 0) self.lastNeed = nb - 1;
    return nb;
  }
  if (--j < i || nb === -2) return 0;
  nb = utf8CheckByte(buf[j]);
  if (nb >= 0) {
    if (nb > 0) self.lastNeed = nb - 2;
    return nb;
  }
  if (--j < i || nb === -2) return 0;
  nb = utf8CheckByte(buf[j]);
  if (nb >= 0) {
    if (nb > 0) {
      if (nb === 2) nb = 0;else self.lastNeed = nb - 3;
    }
    return nb;
  }
  return 0;
}

// Validates as many continuation bytes for a multi-byte UTF-8 character as
// needed or are available. If we see a non-continuation byte where we expect
// one, we "replace" the validated continuation bytes we've seen so far with
// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding
// behavior. The continuation byte check is included three times in the case
// where all of the continuation bytes for a character exist in the same buffer.
// It is also done this way as a slight performance increase instead of using a
// loop.
function utf8CheckExtraBytes(self, buf, p) {
  if ((buf[0] & 0xC0) !== 0x80) {
    self.lastNeed = 0;
    return '\ufffd';
  }
  if (self.lastNeed > 1 && buf.length > 1) {
    if ((buf[1] & 0xC0) !== 0x80) {
      self.lastNeed = 1;
      return '\ufffd';
    }
    if (self.lastNeed > 2 && buf.length > 2) {
      if ((buf[2] & 0xC0) !== 0x80) {
        self.lastNeed = 2;
        return '\ufffd';
      }
    }
  }
}

// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.
function utf8FillLast(buf) {
  var p = this.lastTotal - this.lastNeed;
  var r = utf8CheckExtraBytes(this, buf, p);
  if (r !== undefined) return r;
  if (this.lastNeed <= buf.length) {
    buf.copy(this.lastChar, p, 0, this.lastNeed);
    return this.lastChar.toString(this.encoding, 0, this.lastTotal);
  }
  buf.copy(this.lastChar, p, 0, buf.length);
  this.lastNeed -= buf.length;
}

// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a
// partial character, the character's bytes are buffered until the required
// number of bytes are available.
function utf8Text(buf, i) {
  var total = utf8CheckIncomplete(this, buf, i);
  if (!this.lastNeed) return buf.toString('utf8', i);
  this.lastTotal = total;
  var end = buf.length - (total - this.lastNeed);
  buf.copy(this.lastChar, 0, end);
  return buf.toString('utf8', i, end);
}

// For UTF-8, a replacement character is added when ending on a partial
// character.
function utf8End(buf) {
  var r = buf && buf.length ? this.write(buf) : '';
  if (this.lastNeed) return r + '\ufffd';
  return r;
}

// UTF-16LE typically needs two bytes per character, but even if we have an even
// number of bytes available, we need to check if we end on a leading/high
// surrogate. In that case, we need to wait for the next two bytes in order to
// decode the last character properly.
function utf16Text(buf, i) {
  if ((buf.length - i) % 2 === 0) {
    var r = buf.toString('utf16le', i);
    if (r) {
      var c = r.charCodeAt(r.length - 1);
      if (c >= 0xD800 && c <= 0xDBFF) {
        this.lastNeed = 2;
        this.lastTotal = 4;
        this.lastChar[0] = buf[buf.length - 2];
        this.lastChar[1] = buf[buf.length - 1];
        return r.slice(0, -1);
      }
    }
    return r;
  }
  this.lastNeed = 1;
  this.lastTotal = 2;
  this.lastChar[0] = buf[buf.length - 1];
  return buf.toString('utf16le', i, buf.length - 1);
}

// For UTF-16LE we do not explicitly append special replacement characters if we
// end on a partial character, we simply let v8 handle that.
function utf16End(buf) {
  var r = buf && buf.length ? this.write(buf) : '';
  if (this.lastNeed) {
    var end = this.lastTotal - this.lastNeed;
    return r + this.lastChar.toString('utf16le', 0, end);
  }
  return r;
}

function base64Text(buf, i) {
  var n = (buf.length - i) % 3;
  if (n === 0) return buf.toString('base64', i);
  this.lastNeed = 3 - n;
  this.lastTotal = 3;
  if (n === 1) {
    this.lastChar[0] = buf[buf.length - 1];
  } else {
    this.lastChar[0] = buf[buf.length - 2];
    this.lastChar[1] = buf[buf.length - 1];
  }
  return buf.toString('base64', i, buf.length - n);
}

function base64End(buf) {
  var r = buf && buf.length ? this.write(buf) : '';
  if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);
  return r;
}

// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)
function simpleWrite(buf) {
  return buf.toString(this.encoding);
}

function simpleEnd(buf) {
  return buf && buf.length ? this.write(buf) : '';
}'use strict';
const ansiRegex = require('ansi-regex');

module.exports = string => typeof string === 'string' ? string.replace(ansiRegex(), '') : string;
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": "strip-ansi",
  "version": "6.0.1",
  "description": "Strip ANSI escape codes from a string",
  "license": "MIT",
  "repository": "chalk/strip-ansi",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "engines": {
    "node": ">=8"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "dependencies": {
    "ansi-regex": "^5.0.1"
  },
  "devDependencies": {
    "ava": "^2.4.0",
    "tsd": "^0.10.0",
    "xo": "^0.25.3"
  }
}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.
'use strict'

// high-level commands
exports.c = exports.create = require('./lib/create.js')
exports.r = exports.replace = require('./lib/replace.js')
exports.t = exports.list = require('./lib/list.js')
exports.u = exports.update = require('./lib/update.js')
exports.x = exports.extract = require('./lib/extract.js')

// classes
exports.Pack = require('./lib/pack.js')
exports.Unpack = require('./lib/unpack.js')
exports.Parse = require('./lib/parse.js')
exports.ReadEntry = require('./lib/read-entry.js')
exports.WriteEntry = require('./lib/write-entry.js')
exports.Header = require('./lib/header.js')
exports.Pax = require('./lib/pax.js')
exports.types = require('./lib/types.js')
{
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
  "name": "tar",
  "description": "tar for node",
  "version": "6.1.11",
  "repository": {
    "type": "git",
    "url": "https://github.com/npm/node-tar.git"
  },
  "dependencies": {
    "chownr": "^2.0.0",
    "fs-minipass": "^2.0.0",
    "minipass": "^3.0.0",
    "minizlib": "^2.1.1",
    "mkdirp": "^1.0.3",
    "yallist": "^4.0.0"
  },
  "devDependencies": {
    "chmodr": "^1.2.0",
    "end-of-stream": "^1.4.3",
    "eslint": "^7.17.0",
    "eslint-plugin-import": "^2.22.1",
    "eslint-plugin-node": "^11.1.0",
    "eslint-plugin-promise": "^4.2.1",
    "eslint-plugin-standard": "^5.0.0",
    "events-to-array": "^1.1.2",
    "mutate-fs": "^2.1.1",
    "rimraf": "^2.7.1",
    "tap": "^15.0.9",
    "tar-fs": "^1.16.3",
    "tar-stream": "^1.6.2"
  },
  "license": "ISC",
  "engines": {
    "node": ">= 10"
  },
  "files": [
    "index.js",
    "lib/*.js"
  ],
  "tap": {
    "coverage-map": "map.js",
    "check-coverage": true
  }
}'use strict'

// tar -c
const hlo = require('./high-level-opt.js')

const Pack = require('./pack.js')
const fsm = require('fs-minipass')
const t = require('./list.js')
const path = require('path')

module.exports = (opt_, files, cb) => {
  if (typeof files === 'function')
    cb = files

  if (Array.isArray(opt_))
    files = opt_, opt_ = {}

  if (!files || !Array.isArray(files) || !files.length)
    throw new TypeError('no files or directories specified')

  files = Array.from(files)

  const opt = hlo(opt_)

  if (opt.sync && typeof cb === 'function')
    throw new TypeError('callback not supported for sync tar functions')

  if (!opt.file && typeof cb === 'function')
    throw new TypeError('callback only supported with file option')

  return opt.file && opt.sync ? createFileSync(opt, files)
    : opt.file ? createFile(opt, files, cb)
    : opt.sync ? createSync(opt, files)
    : create(opt, files)
}

const createFileSync = (opt, files) => {
  const p = new Pack.Sync(opt)
  const stream = new fsm.WriteStreamSync(opt.file, {
    mode: opt.mode || 0o666,
  })
  p.pipe(stream)
  addFilesSync(p, files)
}

const createFile = (opt, files, cb) => {
  const p = new Pack(opt)
  const stream = new fsm.WriteStream(opt.file, {
    mode: opt.mode || 0o666,
  })
  p.pipe(stream)

  const promise = new Promise((res, rej) => {
    stream.on('error', rej)
    stream.on('close', res)
    p.on('error', rej)
  })

  addFilesAsync(p, files)

  return cb ? promise.then(cb, cb) : promise
}

const addFilesSync = (p, files) => {
  files.forEach(file => {
    if (file.charAt(0) === '@') {
      t({
        file: path.resolve(p.cwd, file.substr(1)),
        sync: true,
        noResume: true,
        onentry: entry => p.add(entry),
      })
    } else
      p.add(file)
  })
  p.end()
}

const addFilesAsync = (p, files) => {
  while (files.length) {
    const file = files.shift()
    if (file.charAt(0) === '@') {
      return t({
        file: path.resolve(p.cwd, file.substr(1)),
        noResume: true,
        onentry: entry => p.add(entry),
      }).then(_ => addFilesAsync(p, files))
    } else
      p.add(file)
  }
  p.end()
}

const createSync = (opt, files) => {
  const p = new Pack.Sync(opt)
  addFilesSync(p, files)
  return p
}

const create = (opt, files) => {
  const p = new Pack(opt)
  addFilesAsync(p, files)
  return p
}
'use strict'

// tar -x
const hlo = require('./high-level-opt.js')
const Unpack = require('./unpack.js')
const fs = require('fs')
const fsm = require('fs-minipass')
const path = require('path')
const stripSlash = require('./strip-trailing-slashes.js')

module.exports = (opt_, files, cb) => {
  if (typeof opt_ === 'function')
    cb = opt_, files = null, opt_ = {}
  else if (Array.isArray(opt_))
    files = opt_, opt_ = {}

  if (typeof files === 'function')
    cb = files, files = null

  if (!files)
    files = []
  else
    files = Array.from(files)

  const opt = hlo(opt_)

  if (opt.sync && typeof cb === 'function')
    throw new TypeError('callback not supported for sync tar functions')

  if (!opt.file && typeof cb === 'function')
    throw new TypeError('callback only supported with file option')

  if (files.length)
    filesFilter(opt, files)

  return opt.file && opt.sync ? extractFileSync(opt)
    : opt.file ? extractFile(opt, cb)
    : opt.sync ? extractSync(opt)
    : extract(opt)
}

// construct a filter that limits the file entries listed
// include child entries if a dir is included
const filesFilter = (opt, files) => {
  const map = new Map(files.map(f => [stripSlash(f), true]))
  const filter = opt.filter

  const mapHas = (file, r) => {
    const root = r || path.parse(file).root || '.'
    const ret = file === root ? false
      : map.has(file) ? map.get(file)
      : mapHas(path.dirname(file), root)

    map.set(file, ret)
    return ret
  }

  opt.filter = filter
    ? (file, entry) => filter(file, entry) && mapHas(stripSlash(file))
    : file => mapHas(stripSlash(file))
}

const extractFileSync = opt => {
  const u = new Unpack.Sync(opt)

  const file = opt.file
  const stat = fs.statSync(file)
  // This trades a zero-byte read() syscall for a stat
  // However, it will usually result in less memory allocation
  const readSize = opt.maxReadSize || 16 * 1024 * 1024
  const stream = new fsm.ReadStreamSync(file, {
    readSize: readSize,
    size: stat.size,
  })
  stream.pipe(u)
}

const extractFile = (opt, cb) => {
  const u = new Unpack(opt)
  const readSize = opt.maxReadSize || 16 * 1024 * 1024

  const file = opt.file
  const p = new Promise((resolve, reject) => {
    u.on('error', reject)
    u.on('close', resolve)

    // This trades a zero-byte read() syscall for a stat
    // However, it will usually result in less memory allocation
    fs.stat(file, (er, stat) => {
      if (er)
        reject(er)
      else {
        const stream = new fsm.ReadStream(file, {
          readSize: readSize,
          size: stat.size,
        })
        stream.on('error', reject)
        stream.pipe(u)
      }
    })
  })
  return cb ? p.then(cb, cb) : p
}

const extractSync = opt => new Unpack.Sync(opt)

const extract = opt => new Unpack(opt)
// Get the appropriate flag to use for creating files
// We use fmap on Windows platforms for files less than
// 512kb.  This is a fairly low limit, but avoids making
// things slower in some cases.  Since most of what this
// library is used for is extracting tarballs of many
// relatively small files in npm packages and the like,
// it can be a big boost on Windows platforms.
// Only supported in Node v12.9.0 and above.
const platform = process.env.__FAKE_PLATFORM__ || process.platform
const isWindows = platform === 'win32'
const fs = global.__FAKE_TESTING_FS__ || require('fs')

/* istanbul ignore next */
const { O_CREAT, O_TRUNC, O_WRONLY, UV_FS_O_FILEMAP = 0 } = fs.constants

const fMapEnabled = isWindows && !!UV_FS_O_FILEMAP
const fMapLimit = 512 * 1024
const fMapFlag = UV_FS_O_FILEMAP | O_TRUNC | O_CREAT | O_WRONLY
module.exports = !fMapEnabled ? () => 'w'
  : size => size < fMapLimit ? fMapFlag : 'w'
'use strict'
// parse a 512-byte header block to a data object, or vice-versa
// encode returns `true` if a pax extended header is needed, because
// the data could not be faithfully encoded in a simple header.
// (Also, check header.needPax to see if it needs a pax header.)

const types = require('./types.js')
const pathModule = require('path').posix
const large = require('./large-numbers.js')

const SLURP = Symbol('slurp')
const TYPE = Symbol('type')

class Header {
  constructor (data, off, ex, gex) {
    this.cksumValid = false
    this.needPax = false
    this.nullBlock = false

    this.block = null
    this.path = null
    this.mode = null
    this.uid = null
    this.gid = null
    this.size = null
    this.mtime = null
    this.cksum = null
    this[TYPE] = '0'
    this.linkpath = null
    this.uname = null
    this.gname = null
    this.devmaj = 0
    this.devmin = 0
    this.atime = null
    this.ctime = null

    if (Buffer.isBuffer(data))
      this.decode(data, off || 0, ex, gex)
    else if (data)
      this.set(data)
  }

  decode (buf, off, ex, gex) {
    if (!off)
      off = 0

    if (!buf || !(buf.length >= off + 512))
      throw new Error('need 512 bytes for header')

    this.path = decString(buf, off, 100)
    this.mode = decNumber(buf, off + 100, 8)
    this.uid = decNumber(buf, off + 108, 8)
    this.gid = decNumber(buf, off + 116, 8)
    this.size = decNumber(buf, off + 124, 12)
    this.mtime = decDate(buf, off + 136, 12)
    this.cksum = decNumber(buf, off + 148, 12)

    // if we have extended or global extended headers, apply them now
    // See https://github.com/npm/node-tar/pull/187
    this[SLURP](ex)
    this[SLURP](gex, true)

    // old tar versions marked dirs as a file with a trailing /
    this[TYPE] = decString(buf, off + 156, 1)
    if (this[TYPE] === '')
      this[TYPE] = '0'
    if (this[TYPE] === '0' && this.path.substr(-1) === '/')
      this[TYPE] = '5'

    // tar implementations sometimes incorrectly put the stat(dir).size
    // as the size in the tarball, even though Directory entries are
    // not able to have any body at all.  In the very rare chance that
    // it actually DOES have a body, we weren't going to do anything with
    // it anyway, and it'll just be a warning about an invalid header.
    if (this[TYPE] === '5')
      this.size = 0

    this.linkpath = decString(buf, off + 157, 100)
    if (buf.slice(off + 257, off + 265).toString() === 'ustar\u000000') {
      this.uname = decString(buf, off + 265, 32)
      this.gname = decString(buf, off + 297, 32)
      this.devmaj = decNumber(buf, off + 329, 8)
      this.devmin = decNumber(buf, off + 337, 8)
      if (buf[off + 475] !== 0) {
        // definitely a prefix, definitely >130 chars.
        const prefix = decString(buf, off + 345, 155)
        this.path = prefix + '/' + this.path
      } else {
        const prefix = decString(buf, off + 345, 130)
        if (prefix)
          this.path = prefix + '/' + this.path
        this.atime = decDate(buf, off + 476, 12)
        this.ctime = decDate(buf, off + 488, 12)
      }
    }

    let sum = 8 * 0x20
    for (let i = off; i < off + 148; i++)
      sum += buf[i]

    for (let i = off + 156; i < off + 512; i++)
      sum += buf[i]

    this.cksumValid = sum === this.cksum
    if (this.cksum === null && sum === 8 * 0x20)
      this.nullBlock = true
  }

  [SLURP] (ex, global) {
    for (const k in ex) {
      // we slurp in everything except for the path attribute in
      // a global extended header, because that's weird.
      if (ex[k] !== null && ex[k] !== undefined &&
          !(global && k === 'path'))
        this[k] = ex[k]
    }
  }

  encode (buf, off) {
    if (!buf) {
      buf = this.block = Buffer.alloc(512)
      off = 0
    }

    if (!off)
      off = 0

    if (!(buf.length >= off + 512))
      throw new Error('need 512 bytes for header')

    const prefixSize = this.ctime || this.atime ? 130 : 155
    const split = splitPrefix(this.path || '', prefixSize)
    const path = split[0]
    const prefix = split[1]
    this.needPax = split[2]

    this.needPax = encString(buf, off, 100, path) || this.needPax
    this.needPax = encNumber(buf, off + 100, 8, this.mode) || this.needPax
    this.needPax = encNumber(buf, off + 108, 8, this.uid) || this.needPax
    this.needPax = encNumber(buf, off + 116, 8, this.gid) || this.needPax
    this.needPax = encNumber(buf, off + 124, 12, this.size) || this.needPax
    this.needPax = encDate(buf, off + 136, 12, this.mtime) || this.needPax
    buf[off + 156] = this[TYPE].charCodeAt(0)
    this.needPax = encString(buf, off + 157, 100, this.linkpath) || this.needPax
    buf.write('ustar\u000000', off + 257, 8)
    this.needPax = encString(buf, off + 265, 32, this.uname) || this.needPax
    this.needPax = encString(buf, off + 297, 32, this.gname) || this.needPax
    this.needPax = encNumber(buf, off + 329, 8, this.devmaj) || this.needPax
    this.needPax = encNumber(buf, off + 337, 8, this.devmin) || this.needPax
    this.needPax = encString(buf, off + 345, prefixSize, prefix) || this.needPax
    if (buf[off + 475] !== 0)
      this.needPax = encString(buf, off + 345, 155, prefix) || this.needPax
    else {
      this.needPax = encString(buf, off + 345, 130, prefix) || this.needPax
      this.needPax = encDate(buf, off + 476, 12, this.atime) || this.needPax
      this.needPax = encDate(buf, off + 488, 12, this.ctime) || this.needPax
    }

    let sum = 8 * 0x20
    for (let i = off; i < off + 148; i++)
      sum += buf[i]

    for (let i = off + 156; i < off + 512; i++)
      sum += buf[i]

    this.cksum = sum
    encNumber(buf, off + 148, 8, this.cksum)
    this.cksumValid = true

    return this.needPax
  }

  set (data) {
    for (const i in data) {
      if (data[i] !== null && data[i] !== undefined)
        this[i] = data[i]
    }
  }

  get type () {
    return types.name.get(this[TYPE]) || this[TYPE]
  }

  get typeKey () {
    return this[TYPE]
  }

  set type (type) {
    if (types.code.has(type))
      this[TYPE] = types.code.get(type)
    else
      this[TYPE] = type
  }
}

const splitPrefix = (p, prefixSize) => {
  const pathSize = 100
  let pp = p
  let prefix = ''
  let ret
  const root = pathModule.parse(p).root || '.'

  if (Buffer.byteLength(pp) < pathSize)
    ret = [pp, prefix, false]
  else {
    // first set prefix to the dir, and path to the base
    prefix = pathModule.dirname(pp)
    pp = pathModule.basename(pp)

    do {
      // both fit!
      if (Buffer.byteLength(pp) <= pathSize &&
          Buffer.byteLength(prefix) <= prefixSize)
        ret = [pp, prefix, false]

      // prefix fits in prefix, but path doesn't fit in path
      else if (Buffer.byteLength(pp) > pathSize &&
          Buffer.byteLength(prefix) <= prefixSize)
        ret = [pp.substr(0, pathSize - 1), prefix, true]

      else {
        // make path take a bit from prefix
        pp = pathModule.join(pathModule.basename(prefix), pp)
        prefix = pathModule.dirname(prefix)
      }
    } while (prefix !== root && !ret)

    // at this point, found no resolution, just truncate
    if (!ret)
      ret = [p.substr(0, pathSize - 1), '', true]
  }
  return ret
}

const decString = (buf, off, size) =>
  buf.slice(off, off + size).toString('utf8').replace(/\0.*/, '')

const decDate = (buf, off, size) =>
  numToDate(decNumber(buf, off, size))

const numToDate = num => num === null ? null : new Date(num * 1000)

const decNumber = (buf, off, size) =>
  buf[off] & 0x80 ? large.parse(buf.slice(off, off + size))
  : decSmallNumber(buf, off, size)

const nanNull = value => isNaN(value) ? null : value

const decSmallNumber = (buf, off, size) =>
  nanNull(parseInt(
    buf.slice(off, off + size)
      .toString('utf8').replace(/\0.*$/, '').trim(), 8))

// the maximum encodable as a null-terminated octal, by field size
const MAXNUM = {
  12: 0o77777777777,
  8: 0o7777777,
}

const encNumber = (buf, off, size, number) =>
  number === null ? false :
  number > MAXNUM[size] || number < 0
    ? (large.encode(number, buf.slice(off, off + size)), true)
    : (encSmallNumber(buf, off, size, number), false)

const encSmallNumber = (buf, off, size, number) =>
  buf.write(octalString(number, size), off, size, 'ascii')

const octalString = (number, size) =>
  padOctal(Math.floor(number).toString(8), size)

const padOctal = (string, size) =>
  (string.length === size - 1 ? string
  : new Array(size - string.length - 1).join('0') + string + ' ') + '\0'

const encDate = (buf, off, size, date) =>
  date === null ? false :
  encNumber(buf, off, size, date.getTime() / 1000)

// enough to fill the longest string we've got
const NULLS = new Array(156).join('\0')
// pad with nulls, return true if it's longer or non-ascii
const encString = (buf, off, size, string) =>
  string === null ? false :
  (buf.write(string + NULLS, off, size, 'utf8'),
  string.length !== Buffer.byteLength(string) || string.length > size)

module.exports = Header
'use strict'

// turn tar(1) style args like `C` into the more verbose things like `cwd`

const argmap = new Map([
  ['C', 'cwd'],
  ['f', 'file'],
  ['z', 'gzip'],
  ['P', 'preservePaths'],
  ['U', 'unlink'],
  ['strip-components', 'strip'],
  ['stripComponents', 'strip'],
  ['keep-newer', 'newer'],
  ['keepNewer', 'newer'],
  ['keep-newer-files', 'newer'],
  ['keepNewerFiles', 'newer'],
  ['k', 'keep'],
  ['keep-existing', 'keep'],
  ['keepExisting', 'keep'],
  ['m', 'noMtime'],
  ['no-mtime', 'noMtime'],
  ['p', 'preserveOwner'],
  ['L', 'follow'],
  ['h', 'follow'],
])

module.exports = opt => opt ? Object.keys(opt).map(k => [
  argmap.has(k) ? argmap.get(k) : k, opt[k],
]).reduce((set, kv) => (set[kv[0]] = kv[1], set), Object.create(null)) : {}
'use strict'
// Tar can encode large and negative numbers using a leading byte of
// 0xff for negative, and 0x80 for positive.

const encode = (num, buf) => {
  if (!Number.isSafeInteger(num))
    // The number is so large that javascript cannot represent it with integer
    // precision.
    throw Error('cannot encode number outside of javascript safe integer range')
  else if (num < 0)
    encodeNegative(num, buf)
  else
    encodePositive(num, buf)
  return buf
}

const encodePositive = (num, buf) => {
  buf[0] = 0x80

  for (var i = buf.length; i > 1; i--) {
    buf[i - 1] = num & 0xff
    num = Math.floor(num / 0x100)
  }
}

const encodeNegative = (num, buf) => {
  buf[0] = 0xff
  var flipped = false
  num = num * -1
  for (var i = buf.length; i > 1; i--) {
    var byte = num & 0xff
    num = Math.floor(num / 0x100)
    if (flipped)
      buf[i - 1] = onesComp(byte)
    else if (byte === 0)
      buf[i - 1] = 0
    else {
      flipped = true
      buf[i - 1] = twosComp(byte)
    }
  }
}

const parse = (buf) => {
  const pre = buf[0]
  const value = pre === 0x80 ? pos(buf.slice(1, buf.length))
    : pre === 0xff ? twos(buf)
    : null
  if (value === null)
    throw Error('invalid base256 encoding')

  if (!Number.isSafeInteger(value))
    // The number is so large that javascript cannot represent it with integer
    // precision.
    throw Error('parsed number outside of javascript safe integer range')

  return value
}

const twos = (buf) => {
  var len = buf.length
  var sum = 0
  var flipped = false
  for (var i = len - 1; i > -1; i--) {
    var byte = buf[i]
    var f
    if (flipped)
      f = onesComp(byte)
    else if (byte === 0)
      f = byte
    else {
      flipped = true
      f = twosComp(byte)
    }
    if (f !== 0)
      sum -= f * Math.pow(256, len - i - 1)
  }
  return sum
}

const pos = (buf) => {
  var len = buf.length
  var sum = 0
  for (var i = len - 1; i > -1; i--) {
    var byte = buf[i]
    if (byte !== 0)
      sum += byte * Math.pow(256, len - i - 1)
  }
  return sum
}

const onesComp = byte => (0xff ^ byte) & 0xff

const twosComp = byte => ((0xff ^ byte) + 1) & 0xff

module.exports = {
  encode,
  parse,
}
'use strict'

// XXX: This shares a lot in common with extract.js
// maybe some DRY opportunity here?

// tar -t
const hlo = require('./high-level-opt.js')
const Parser = require('./parse.js')
const fs = require('fs')
const fsm = require('fs-minipass')
const path = require('path')
const stripSlash = require('./strip-trailing-slashes.js')

module.exports = (opt_, files, cb) => {
  if (typeof opt_ === 'function')
    cb = opt_, files = null, opt_ = {}
  else if (Array.isArray(opt_))
    files = opt_, opt_ = {}

  if (typeof files === 'function')
    cb = files, files = null

  if (!files)
    files = []
  else
    files = Array.from(files)

  const opt = hlo(opt_)

  if (opt.sync && typeof cb === 'function')
    throw new TypeError('callback not supported for sync tar functions')

  if (!opt.file && typeof cb === 'function')
    throw new TypeError('callback only supported with file option')

  if (files.length)
    filesFilter(opt, files)

  if (!opt.noResume)
    onentryFunction(opt)

  return opt.file && opt.sync ? listFileSync(opt)
    : opt.file ? listFile(opt, cb)
    : list(opt)
}

const onentryFunction = opt => {
  const onentry = opt.onentry
  opt.onentry = onentry ? e => {
    onentry(e)
    e.resume()
  } : e => e.resume()
}

// construct a filter that limits the file entries listed
// include child entries if a dir is included
const filesFilter = (opt, files) => {
  const map = new Map(files.map(f => [stripSlash(f), true]))
  const filter = opt.filter

  const mapHas = (file, r) => {
    const root = r || path.parse(file).root || '.'
    const ret = file === root ? false
      : map.has(file) ? map.get(file)
      : mapHas(path.dirname(file), root)

    map.set(file, ret)
    return ret
  }

  opt.filter = filter
    ? (file, entry) => filter(file, entry) && mapHas(stripSlash(file))
    : file => mapHas(stripSlash(file))
}

const listFileSync = opt => {
  const p = list(opt)
  const file = opt.file
  let threw = true
  let fd
  try {
    const stat = fs.statSync(file)
    const readSize = opt.maxReadSize || 16 * 1024 * 1024
    if (stat.size < readSize)
      p.end(fs.readFileSync(file))
    else {
      let pos = 0
      const buf = Buffer.allocUnsafe(readSize)
      fd = fs.openSync(file, 'r')
      while (pos < stat.size) {
        const bytesRead = fs.readSync(fd, buf, 0, readSize, pos)
        pos += bytesRead
        p.write(buf.slice(0, bytesRead))
      }
      p.end()
    }
    threw = false
  } finally {
    if (threw && fd) {
      try {
        fs.closeSync(fd)
      } catch (er) {}
    }
  }
}

const listFile = (opt, cb) => {
  const parse = new Parser(opt)
  const readSize = opt.maxReadSize || 16 * 1024 * 1024

  const file = opt.file
  const p = new Promise((resolve, reject) => {
    parse.on('error', reject)
    parse.on('end', resolve)

    fs.stat(file, (er, stat) => {
      if (er)
        reject(er)
      else {
        const stream = new fsm.ReadStream(file, {
          readSize: readSize,
          size: stat.size,
        })
        stream.on('error', reject)
        stream.pipe(parse)
      }
    })
  })
  return cb ? p.then(cb, cb) : p
}

const list = opt => new Parser(opt)
'use strict'
// wrapper around mkdirp for tar's needs.

// TODO: This should probably be a class, not functionally
// passing around state in a gazillion args.

const mkdirp = require('mkdirp')
const fs = require('fs')
const path = require('path')
const chownr = require('chownr')
const normPath = require('./normalize-windows-path.js')

class SymlinkError extends Error {
  constructor (symlink, path) {
    super('Cannot extract through symbolic link')
    this.path = path
    this.symlink = symlink
  }

  get name () {
    return 'SylinkError'
  }
}

class CwdError extends Error {
  constructor (path, code) {
    super(code + ': Cannot cd into \'' + path + '\'')
    this.path = path
    this.code = code
  }

  get name () {
    return 'CwdError'
  }
}

const cGet = (cache, key) => cache.get(normPath(key))
const cSet = (cache, key, val) => cache.set(normPath(key), val)

const checkCwd = (dir, cb) => {
  fs.stat(dir, (er, st) => {
    if (er || !st.isDirectory())
      er = new CwdError(dir, er && er.code || 'ENOTDIR')
    cb(er)
  })
}

module.exports = (dir, opt, cb) => {
  dir = normPath(dir)

  // if there's any overlap between mask and mode,
  // then we'll need an explicit chmod
  const umask = opt.umask
  const mode = opt.mode | 0o0700
  const needChmod = (mode & umask) !== 0

  const uid = opt.uid
  const gid = opt.gid
  const doChown = typeof uid === 'number' &&
    typeof gid === 'number' &&
    (uid !== opt.processUid || gid !== opt.processGid)

  const preserve = opt.preserve
  const unlink = opt.unlink
  const cache = opt.cache
  const cwd = normPath(opt.cwd)

  const done = (er, created) => {
    if (er)
      cb(er)
    else {
      cSet(cache, dir, true)
      if (created && doChown)
        chownr(created, uid, gid, er => done(er))
      else if (needChmod)
        fs.chmod(dir, mode, cb)
      else
        cb()
    }
  }

  if (cache && cGet(cache, dir) === true)
    return done()

  if (dir === cwd)
    return checkCwd(dir, done)

  if (preserve)
    return mkdirp(dir, {mode}).then(made => done(null, made), done)

  const sub = normPath(path.relative(cwd, dir))
  const parts = sub.split('/')
  mkdir_(cwd, parts, mode, cache, unlink, cwd, null, done)
}

const mkdir_ = (base, parts, mode, cache, unlink, cwd, created, cb) => {
  if (!parts.length)
    return cb(null, created)
  const p = parts.shift()
  const part = normPath(path.resolve(base + '/' + p))
  if (cGet(cache, part))
    return mkdir_(part, parts, mode, cache, unlink, cwd, created, cb)
  fs.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb))
}

const onmkdir = (part, parts, mode, cache, unlink, cwd, created, cb) => er => {
  if (er) {
    fs.lstat(part, (statEr, st) => {
      if (statEr) {
        statEr.path = statEr.path && normPath(statEr.path)
        cb(statEr)
      } else if (st.isDirectory())
        mkdir_(part, parts, mode, cache, unlink, cwd, created, cb)
      else if (unlink) {
        fs.unlink(part, er => {
          if (er)
            return cb(er)
          fs.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb))
        })
      } else if (st.isSymbolicLink())
        return cb(new SymlinkError(part, part + '/' + parts.join('/')))
      else
        cb(er)
    })
  } else {
    created = created || part
    mkdir_(part, parts, mode, cache, unlink, cwd, created, cb)
  }
}

const checkCwdSync = dir => {
  let ok = false
  let code = 'ENOTDIR'
  try {
    ok = fs.statSync(dir).isDirectory()
  } catch (er) {
    code = er.code
  } finally {
    if (!ok)
      throw new CwdError(dir, code)
  }
}

module.exports.sync = (dir, opt) => {
  dir = normPath(dir)
  // if there's any overlap between mask and mode,
  // then we'll need an explicit chmod
  const umask = opt.umask
  const mode = opt.mode | 0o0700
  const needChmod = (mode & umask) !== 0

  const uid = opt.uid
  const gid = opt.gid
  const doChown = typeof uid === 'number' &&
    typeof gid === 'number' &&
    (uid !== opt.processUid || gid !== opt.processGid)

  const preserve = opt.preserve
  const unlink = opt.unlink
  const cache = opt.cache
  const cwd = normPath(opt.cwd)

  const done = (created) => {
    cSet(cache, dir, true)
    if (created && doChown)
      chownr.sync(created, uid, gid)
    if (needChmod)
      fs.chmodSync(dir, mode)
  }

  if (cache && cGet(cache, dir) === true)
    return done()

  if (dir === cwd) {
    checkCwdSync(cwd)
    return done()
  }

  if (preserve)
    return done(mkdirp.sync(dir, mode))

  const sub = normPath(path.relative(cwd, dir))
  const parts = sub.split('/')
  let created = null
  for (let p = parts.shift(), part = cwd;
    p && (part += '/' + p);
    p = parts.shift()) {
    part = normPath(path.resolve(part))
    if (cGet(cache, part))
      continue

    try {
      fs.mkdirSync(part, mode)
      created = created || part
      cSet(cache, part, true)
    } catch (er) {
      const st = fs.lstatSync(part)
      if (st.isDirectory()) {
        cSet(cache, part, true)
        continue
      } else if (unlink) {
        fs.unlinkSync(part)
        fs.mkdirSync(part, mode)
        created = created || part
        cSet(cache, part, true)
        continue
      } else if (st.isSymbolicLink())
        return new SymlinkError(part, part + '/' + parts.join('/'))
    }
  }

  return done(created)
}
'use strict'
module.exports = (mode, isDir, portable) => {
  mode &= 0o7777

  // in portable mode, use the minimum reasonable umask
  // if this system creates files with 0o664 by default
  // (as some linux distros do), then we'll write the
  // archive with 0o644 instead.  Also, don't ever create
  // a file that is not readable/writable by the owner.
  if (portable)
    mode = (mode | 0o600) & ~0o22

  // if dirs are readable, then they should be listable
  if (isDir) {
    if (mode & 0o400)
      mode |= 0o100
    if (mode & 0o40)
      mode |= 0o10
    if (mode & 0o4)
      mode |= 0o1
  }
  return mode
}
// warning: extremely hot code path.
// This has been meticulously optimized for use
// within npm install on large package trees.
// Do not edit without careful benchmarking.
const normalizeCache = Object.create(null)
const {hasOwnProperty} = Object.prototype
module.exports = s => {
  if (!hasOwnProperty.call(normalizeCache, s))
    normalizeCache[s] = s.normalize('NFKD')
  return normalizeCache[s]
}
// on windows, either \ or / are valid directory separators.
// on unix, \ is a valid character in filenames.
// so, on windows, and only on windows, we replace all \ chars with /,
// so that we can use / as our one and only directory separator char.

const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform
module.exports = platform !== 'win32' ? p => p
  : p => p && p.replace(/\\/g, '/')
'use strict'

// A readable tar stream creator
// Technically, this is a transform stream that you write paths into,
// and tar format comes out of.
// The `add()` method is like `write()` but returns this,
// and end() return `this` as well, so you can
// do `new Pack(opt).add('files').add('dir').end().pipe(output)
// You could also do something like:
// streamOfPaths().pipe(new Pack()).pipe(new fs.WriteStream('out.tar'))

class PackJob {
  constructor (path, absolute) {
    this.path = path || './'
    this.absolute = absolute
    this.entry = null
    this.stat = null
    this.readdir = null
    this.pending = false
    this.ignore = false
    this.piped = false
  }
}

const MiniPass = require('minipass')
const zlib = require('minizlib')
const ReadEntry = require('./read-entry.js')
const WriteEntry = require('./write-entry.js')
const WriteEntrySync = WriteEntry.Sync
const WriteEntryTar = WriteEntry.Tar
const Yallist = require('yallist')
const EOF = Buffer.alloc(1024)
const ONSTAT = Symbol('onStat')
const ENDED = Symbol('ended')
const QUEUE = Symbol('queue')
const CURRENT = Symbol('current')
const PROCESS = Symbol('process')
const PROCESSING = Symbol('processing')
const PROCESSJOB = Symbol('processJob')
const JOBS = Symbol('jobs')
const JOBDONE = Symbol('jobDone')
const ADDFSENTRY = Symbol('addFSEntry')
const ADDTARENTRY = Symbol('addTarEntry')
const STAT = Symbol('stat')
const READDIR = Symbol('readdir')
const ONREADDIR = Symbol('onreaddir')
const PIPE = Symbol('pipe')
const ENTRY = Symbol('entry')
const ENTRYOPT = Symbol('entryOpt')
const WRITEENTRYCLASS = Symbol('writeEntryClass')
const WRITE = Symbol('write')
const ONDRAIN = Symbol('ondrain')

const fs = require('fs')
const path = require('path')
const warner = require('./warn-mixin.js')
const normPath = require('./normalize-windows-path.js')

const Pack = warner(class Pack extends MiniPass {
  constructor (opt) {
    super(opt)
    opt = opt || Object.create(null)
    this.opt = opt
    this.file = opt.file || ''
    this.cwd = opt.cwd || process.cwd()
    this.maxReadSize = opt.maxReadSize
    this.preservePaths = !!opt.preservePaths
    this.strict = !!opt.strict
    this.noPax = !!opt.noPax
    this.prefix = normPath(opt.prefix || '')
    this.linkCache = opt.linkCache || new Map()
    this.statCache = opt.statCache || new Map()
    this.readdirCache = opt.readdirCache || new Map()

    this[WRITEENTRYCLASS] = WriteEntry
    if (typeof opt.onwarn === 'function')
      this.on('warn', opt.onwarn)

    this.portable = !!opt.portable
    this.zip = null
    if (opt.gzip) {
      if (typeof opt.gzip !== 'object')
        opt.gzip = {}
      if (this.portable)
        opt.gzip.portable = true
      this.zip = new zlib.Gzip(opt.gzip)
      this.zip.on('data', chunk => super.write(chunk))
      this.zip.on('end', _ => super.end())
      this.zip.on('drain', _ => this[ONDRAIN]())
      this.on('resume', _ => this.zip.resume())
    } else
      this.on('drain', this[ONDRAIN])

    this.noDirRecurse = !!opt.noDirRecurse
    this.follow = !!opt.follow
    this.noMtime = !!opt.noMtime
    this.mtime = opt.mtime || null

    this.filter = typeof opt.filter === 'function' ? opt.filter : _ => true

    this[QUEUE] = new Yallist()
    this[JOBS] = 0
    this.jobs = +opt.jobs || 4
    this[PROCESSING] = false
    this[ENDED] = false
  }

  [WRITE] (chunk) {
    return super.write(chunk)
  }

  add (path) {
    this.write(path)
    return this
  }

  end (path) {
    if (path)
      this.write(path)
    this[ENDED] = true
    this[PROCESS]()
    return this
  }

  write (path) {
    if (this[ENDED])
      throw new Error('write after end')

    if (path instanceof ReadEntry)
      this[ADDTARENTRY](path)
    else
      this[ADDFSENTRY](path)
    return this.flowing
  }

  [ADDTARENTRY] (p) {
    const absolute = normPath(path.resolve(this.cwd, p.path))
    // in this case, we don't have to wait for the stat
    if (!this.filter(p.path, p))
      p.resume()
    else {
      const job = new PackJob(p.path, absolute, false)
      job.entry = new WriteEntryTar(p, this[ENTRYOPT](job))
      job.entry.on('end', _ => this[JOBDONE](job))
      this[JOBS] += 1
      this[QUEUE].push(job)
    }

    this[PROCESS]()
  }

  [ADDFSENTRY] (p) {
    const absolute = normPath(path.resolve(this.cwd, p))
    this[QUEUE].push(new PackJob(p, absolute))
    this[PROCESS]()
  }

  [STAT] (job) {
    job.pending = true
    this[JOBS] += 1
    const stat = this.follow ? 'stat' : 'lstat'
    fs[stat](job.absolute, (er, stat) => {
      job.pending = false
      this[JOBS] -= 1
      if (er)
        this.emit('error', er)
      else
        this[ONSTAT](job, stat)
    })
  }

  [ONSTAT] (job, stat) {
    this.statCache.set(job.absolute, stat)
    job.stat = stat

    // now we have the stat, we can filter it.
    if (!this.filter(job.path, stat))
      job.ignore = true

    this[PROCESS]()
  }

  [READDIR] (job) {
    job.pending = true
    this[JOBS] += 1
    fs.readdir(job.absolute, (er, entries) => {
      job.pending = false
      this[JOBS] -= 1
      if (er)
        return this.emit('error', er)
      this[ONREADDIR](job, entries)
    })
  }

  [ONREADDIR] (job, entries) {
    this.readdirCache.set(job.absolute, entries)
    job.readdir = entries
    this[PROCESS]()
  }

  [PROCESS] () {
    if (this[PROCESSING])
      return

    this[PROCESSING] = true
    for (let w = this[QUEUE].head;
      w !== null && this[JOBS] < this.jobs;
      w = w.next) {
      this[PROCESSJOB](w.value)
      if (w.value.ignore) {
        const p = w.next
        this[QUEUE].removeNode(w)
        w.next = p
      }
    }

    this[PROCESSING] = false

    if (this[ENDED] && !this[QUEUE].length && this[JOBS] === 0) {
      if (this.zip)
        this.zip.end(EOF)
      else {
        super.write(EOF)
        super.end()
      }
    }
  }

  get [CURRENT] () {
    return this[QUEUE] && this[QUEUE].head && this[QUEUE].head.value
  }

  [JOBDONE] (job) {
    this[QUEUE].shift()
    this[JOBS] -= 1
    this[PROCESS]()
  }

  [PROCESSJOB] (job) {
    if (job.pending)
      return

    if (job.entry) {
      if (job === this[CURRENT] && !job.piped)
        this[PIPE](job)
      return
    }

    if (!job.stat) {
      if (this.statCache.has(job.absolute))
        this[ONSTAT](job, this.statCache.get(job.absolute))
      else
        this[STAT](job)
    }
    if (!job.stat)
      return

    // filtered out!
    if (job.ignore)
      return

    if (!this.noDirRecurse && job.stat.isDirectory() && !job.readdir) {
      if (this.readdirCache.has(job.absolute))
        this[ONREADDIR](job, this.readdirCache.get(job.absolute))
      else
        this[READDIR](job)
      if (!job.readdir)
        return
    }

    // we know it doesn't have an entry, because that got checked above
    job.entry = this[ENTRY](job)
    if (!job.entry) {
      job.ignore = true
      return
    }

    if (job === this[CURRENT] && !job.piped)
      this[PIPE](job)
  }

  [ENTRYOPT] (job) {
    return {
      onwarn: (code, msg, data) => this.warn(code, msg, data),
      noPax: this.noPax,
      cwd: this.cwd,
      absolute: job.absolute,
      preservePaths: this.preservePaths,
      maxReadSize: this.maxReadSize,
      strict: this.strict,
      portable: this.portable,
      linkCache: this.linkCache,
      statCache: this.statCache,
      noMtime: this.noMtime,
      mtime: this.mtime,
      prefix: this.prefix,
    }
  }

  [ENTRY] (job) {
    this[JOBS] += 1
    try {
      return new this[WRITEENTRYCLASS](job.path, this[ENTRYOPT](job))
        .on('end', () => this[JOBDONE](job))
        .on('error', er => this.emit('error', er))
    } catch (er) {
      this.emit('error', er)
    }
  }

  [ONDRAIN] () {
    if (this[CURRENT] && this[CURRENT].entry)
      this[CURRENT].entry.resume()
  }

  // like .pipe() but using super, because our write() is special
  [PIPE] (job) {
    job.piped = true

    if (job.readdir) {
      job.readdir.forEach(entry => {
        const p = job.path
        const base = p === './' ? '' : p.replace(/\/*$/, '/')
        this[ADDFSENTRY](base + entry)
      })
    }

    const source = job.entry
    const zip = this.zip

    if (zip) {
      source.on('data', chunk => {
        if (!zip.write(chunk))
          source.pause()
      })
    } else {
      source.on('data', chunk => {
        if (!super.write(chunk))
          source.pause()
      })
    }
  }

  pause () {
    if (this.zip)
      this.zip.pause()
    return super.pause()
  }
})

class PackSync extends Pack {
  constructor (opt) {
    super(opt)
    this[WRITEENTRYCLASS] = WriteEntrySync
  }

  // pause/resume are no-ops in sync streams.
  pause () {}
  resume () {}

  [STAT] (job) {
    const stat = this.follow ? 'statSync' : 'lstatSync'
    this[ONSTAT](job, fs[stat](job.absolute))
  }

  [READDIR] (job, stat) {
    this[ONREADDIR](job, fs.readdirSync(job.absolute))
  }

  // gotta get it all in this tick
  [PIPE] (job) {
    const source = job.entry
    const zip = this.zip

    if (job.readdir) {
      job.readdir.forEach(entry => {
        const p = job.path
        const base = p === './' ? '' : p.replace(/\/*$/, '/')
        this[ADDFSENTRY](base + entry)
      })
    }

    if (zip) {
      source.on('data', chunk => {
        zip.write(chunk)
      })
    } else {
      source.on('data', chunk => {
        super[WRITE](chunk)
      })
    }
  }
}

Pack.Sync = PackSync

module.exports = Pack
'use strict'

// this[BUFFER] is the remainder of a chunk if we're waiting for
// the full 512 bytes of a header to come in.  We will Buffer.concat()
// it to the next write(), which is a mem copy, but a small one.
//
// this[QUEUE] is a Yallist of entries that haven't been emitted
// yet this can only get filled up if the user keeps write()ing after
// a write() returns false, or does a write() with more than one entry
//
// We don't buffer chunks, we always parse them and either create an
// entry, or push it into the active entry.  The ReadEntry class knows
// to throw data away if .ignore=true
//
// Shift entry off the buffer when it emits 'end', and emit 'entry' for
// the next one in the list.
//
// At any time, we're pushing body chunks into the entry at WRITEENTRY,
// and waiting for 'end' on the entry at READENTRY
//
// ignored entries get .resume() called on them straight away

const warner = require('./warn-mixin.js')
const Header = require('./header.js')
const EE = require('events')
const Yallist = require('yallist')
const maxMetaEntrySize = 1024 * 1024
const Entry = require('./read-entry.js')
const Pax = require('./pax.js')
const zlib = require('minizlib')

const gzipHeader = Buffer.from([0x1f, 0x8b])
const STATE = Symbol('state')
const WRITEENTRY = Symbol('writeEntry')
const READENTRY = Symbol('readEntry')
const NEXTENTRY = Symbol('nextEntry')
const PROCESSENTRY = Symbol('processEntry')
const EX = Symbol('extendedHeader')
const GEX = Symbol('globalExtendedHeader')
const META = Symbol('meta')
const EMITMETA = Symbol('emitMeta')
const BUFFER = Symbol('buffer')
const QUEUE = Symbol('queue')
const ENDED = Symbol('ended')
const EMITTEDEND = Symbol('emittedEnd')
const EMIT = Symbol('emit')
const UNZIP = Symbol('unzip')
const CONSUMECHUNK = Symbol('consumeChunk')
const CONSUMECHUNKSUB = Symbol('consumeChunkSub')
const CONSUMEBODY = Symbol('consumeBody')
const CONSUMEMETA = Symbol('consumeMeta')
const CONSUMEHEADER = Symbol('consumeHeader')
const CONSUMING = Symbol('consuming')
const BUFFERCONCAT = Symbol('bufferConcat')
const MAYBEEND = Symbol('maybeEnd')
const WRITING = Symbol('writing')
const ABORTED = Symbol('aborted')
const DONE = Symbol('onDone')
const SAW_VALID_ENTRY = Symbol('sawValidEntry')
const SAW_NULL_BLOCK = Symbol('sawNullBlock')
const SAW_EOF = Symbol('sawEOF')

const noop = _ => true

module.exports = warner(class Parser extends EE {
  constructor (opt) {
    opt = opt || {}
    super(opt)

    this.file = opt.file || ''

    // set to boolean false when an entry starts.  1024 bytes of \0
    // is technically a valid tarball, albeit a boring one.
    this[SAW_VALID_ENTRY] = null

    // these BADARCHIVE errors can't be detected early. listen on DONE.
    this.on(DONE, _ => {
      if (this[STATE] === 'begin' || this[SAW_VALID_ENTRY] === false) {
        // either less than 1 block of data, or all entries were invalid.
        // Either way, probably not even a tarball.
        this.warn('TAR_BAD_ARCHIVE', 'Unrecognized archive format')
      }
    })

    if (opt.ondone)
      this.on(DONE, opt.ondone)
    else {
      this.on(DONE, _ => {
        this.emit('prefinish')
        this.emit('finish')
        this.emit('end')
        this.emit('close')
      })
    }

    this.strict = !!opt.strict
    this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize
    this.filter = typeof opt.filter === 'function' ? opt.filter : noop

    // have to set this so that streams are ok piping into it
    this.writable = true
    this.readable = false

    this[QUEUE] = new Yallist()
    this[BUFFER] = null
    this[READENTRY] = null
    this[WRITEENTRY] = null
    this[STATE] = 'begin'
    this[META] = ''
    this[EX] = null
    this[GEX] = null
    this[ENDED] = false
    this[UNZIP] = null
    this[ABORTED] = false
    this[SAW_NULL_BLOCK] = false
    this[SAW_EOF] = false
    if (typeof opt.onwarn === 'function')
      this.on('warn', opt.onwarn)
    if (typeof opt.onentry === 'function')
      this.on('entry', opt.onentry)
  }

  [CONSUMEHEADER] (chunk, position) {
    if (this[SAW_VALID_ENTRY] === null)
      this[SAW_VALID_ENTRY] = false
    let header
    try {
      header = new Header(chunk, position, this[EX], this[GEX])
    } catch (er) {
      return this.warn('TAR_ENTRY_INVALID', er)
    }

    if (header.nullBlock) {
      if (this[SAW_NULL_BLOCK]) {
        this[SAW_EOF] = true
        // ending an archive with no entries.  pointless, but legal.
        if (this[STATE] === 'begin')
          this[STATE] = 'header'
        this[EMIT]('eof')
      } else {
        this[SAW_NULL_BLOCK] = true
        this[EMIT]('nullBlock')
      }
    } else {
      this[SAW_NULL_BLOCK] = false
      if (!header.cksumValid)
        this.warn('TAR_ENTRY_INVALID', 'checksum failure', {header})
      else if (!header.path)
        this.warn('TAR_ENTRY_INVALID', 'path is required', {header})
      else {
        const type = header.type
        if (/^(Symbolic)?Link$/.test(type) && !header.linkpath)
          this.warn('TAR_ENTRY_INVALID', 'linkpath required', {header})
        else if (!/^(Symbolic)?Link$/.test(type) && header.linkpath)
          this.warn('TAR_ENTRY_INVALID', 'linkpath forbidden', {header})
        else {
          const entry = this[WRITEENTRY] = new Entry(header, this[EX], this[GEX])

          // we do this for meta & ignored entries as well, because they
          // are still valid tar, or else we wouldn't know to ignore them
          if (!this[SAW_VALID_ENTRY]) {
            if (entry.remain) {
              // this might be the one!
              const onend = () => {
                if (!entry.invalid)
                  this[SAW_VALID_ENTRY] = true
              }
              entry.on('end', onend)
            } else
              this[SAW_VALID_ENTRY] = true
          }

          if (entry.meta) {
            if (entry.size > this.maxMetaEntrySize) {
              entry.ignore = true
              this[EMIT]('ignoredEntry', entry)
              this[STATE] = 'ignore'
              entry.resume()
            } else if (entry.size > 0) {
              this[META] = ''
              entry.on('data', c => this[META] += c)
              this[STATE] = 'meta'
            }
          } else {
            this[EX] = null
            entry.ignore = entry.ignore || !this.filter(entry.path, entry)

            if (entry.ignore) {
              // probably valid, just not something we care about
              this[EMIT]('ignoredEntry', entry)
              this[STATE] = entry.remain ? 'ignore' : 'header'
              entry.resume()
            } else {
              if (entry.remain)
                this[STATE] = 'body'
              else {
                this[STATE] = 'header'
                entry.end()
              }

              if (!this[READENTRY]) {
                this[QUEUE].push(entry)
                this[NEXTENTRY]()
              } else
                this[QUEUE].push(entry)
            }
          }
        }
      }
    }
  }

  [PROCESSENTRY] (entry) {
    let go = true

    if (!entry) {
      this[READENTRY] = null
      go = false
    } else if (Array.isArray(entry))
      this.emit.apply(this, entry)
    else {
      this[READENTRY] = entry
      this.emit('entry', entry)
      if (!entry.emittedEnd) {
        entry.on('end', _ => this[NEXTENTRY]())
        go = false
      }
    }

    return go
  }

  [NEXTENTRY] () {
    do {} while (this[PROCESSENTRY](this[QUEUE].shift()))

    if (!this[QUEUE].length) {
      // At this point, there's nothing in the queue, but we may have an
      // entry which is being consumed (readEntry).
      // If we don't, then we definitely can handle more data.
      // If we do, and either it's flowing, or it has never had any data
      // written to it, then it needs more.
      // The only other possibility is that it has returned false from a
      // write() call, so we wait for the next drain to continue.
      const re = this[READENTRY]
      const drainNow = !re || re.flowing || re.size === re.remain
      if (drainNow) {
        if (!this[WRITING])
          this.emit('drain')
      } else
        re.once('drain', _ => this.emit('drain'))
    }
  }

  [CONSUMEBODY] (chunk, position) {
    // write up to but no  more than writeEntry.blockRemain
    const entry = this[WRITEENTRY]
    const br = entry.blockRemain
    const c = (br >= chunk.length && position === 0) ? chunk
      : chunk.slice(position, position + br)

    entry.write(c)

    if (!entry.blockRemain) {
      this[STATE] = 'header'
      this[WRITEENTRY] = null
      entry.end()
    }

    return c.length
  }

  [CONSUMEMETA] (chunk, position) {
    const entry = this[WRITEENTRY]
    const ret = this[CONSUMEBODY](chunk, position)

    // if we finished, then the entry is reset
    if (!this[WRITEENTRY])
      this[EMITMETA](entry)

    return ret
  }

  [EMIT] (ev, data, extra) {
    if (!this[QUEUE].length && !this[READENTRY])
      this.emit(ev, data, extra)
    else
      this[QUEUE].push([ev, data, extra])
  }

  [EMITMETA] (entry) {
    this[EMIT]('meta', this[META])
    switch (entry.type) {
      case 'ExtendedHeader':
      case 'OldExtendedHeader':
        this[EX] = Pax.parse(this[META], this[EX], false)
        break

      case 'GlobalExtendedHeader':
        this[GEX] = Pax.parse(this[META], this[GEX], true)
        break

      case 'NextFileHasLongPath':
      case 'OldGnuLongPath':
        this[EX] = this[EX] || Object.create(null)
        this[EX].path = this[META].replace(/\0.*/, '')
        break

      case 'NextFileHasLongLinkpath':
        this[EX] = this[EX] || Object.create(null)
        this[EX].linkpath = this[META].replace(/\0.*/, '')
        break

      /* istanbul ignore next */
      default: throw new Error('unknown meta: ' + entry.type)
    }
  }

  abort (error) {
    this[ABORTED] = true
    this.emit('abort', error)
    // always throws, even in non-strict mode
    this.warn('TAR_ABORT', error, { recoverable: false })
  }

  write (chunk) {
    if (this[ABORTED])
      return

    // first write, might be gzipped
    if (this[UNZIP] === null && chunk) {
      if (this[BUFFER]) {
        chunk = Buffer.concat([this[BUFFER], chunk])
        this[BUFFER] = null
      }
      if (chunk.length < gzipHeader.length) {
        this[BUFFER] = chunk
        return true
      }
      for (let i = 0; this[UNZIP] === null && i < gzipHeader.length; i++) {
        if (chunk[i] !== gzipHeader[i])
          this[UNZIP] = false
      }
      if (this[UNZIP] === null) {
        const ended = this[ENDED]
        this[ENDED] = false
        this[UNZIP] = new zlib.Unzip()
        this[UNZIP].on('data', chunk => this[CONSUMECHUNK](chunk))
        this[UNZIP].on('error', er => this.abort(er))
        this[UNZIP].on('end', _ => {
          this[ENDED] = true
          this[CONSUMECHUNK]()
        })
        this[WRITING] = true
        const ret = this[UNZIP][ended ? 'end' : 'write'](chunk)
        this[WRITING] = false
        return ret
      }
    }

    this[WRITING] = true
    if (this[UNZIP])
      this[UNZIP].write(chunk)
    else
      this[CONSUMECHUNK](chunk)
    this[WRITING] = false

    // return false if there's a queue, or if the current entry isn't flowing
    const ret =
      this[QUEUE].length ? false :
      this[READENTRY] ? this[READENTRY].flowing :
      true

    // if we have no queue, then that means a clogged READENTRY
    if (!ret && !this[QUEUE].length)
      this[READENTRY].once('drain', _ => this.emit('drain'))

    return ret
  }

  [BUFFERCONCAT] (c) {
    if (c && !this[ABORTED])
      this[BUFFER] = this[BUFFER] ? Buffer.concat([this[BUFFER], c]) : c
  }

  [MAYBEEND] () {
    if (this[ENDED] &&
        !this[EMITTEDEND] &&
        !this[ABORTED] &&
        !this[CONSUMING]) {
      this[EMITTEDEND] = true
      const entry = this[WRITEENTRY]
      if (entry && entry.blockRemain) {
        // truncated, likely a damaged file
        const have = this[BUFFER] ? this[BUFFER].length : 0
        this.warn('TAR_BAD_ARCHIVE', `Truncated input (needed ${
          entry.blockRemain} more bytes, only ${have} available)`, {entry})
        if (this[BUFFER])
          entry.write(this[BUFFER])
        entry.end()
      }
      this[EMIT](DONE)
    }
  }

  [CONSUMECHUNK] (chunk) {
    if (this[CONSUMING])
      this[BUFFERCONCAT](chunk)
    else if (!chunk && !this[BUFFER])
      this[MAYBEEND]()
    else {
      this[CONSUMING] = true
      if (this[BUFFER]) {
        this[BUFFERCONCAT](chunk)
        const c = this[BUFFER]
        this[BUFFER] = null
        this[CONSUMECHUNKSUB](c)
      } else
        this[CONSUMECHUNKSUB](chunk)

      while (this[BUFFER] &&
          this[BUFFER].length >= 512 &&
          !this[ABORTED] &&
          !this[SAW_EOF]) {
        const c = this[BUFFER]
        this[BUFFER] = null
        this[CONSUMECHUNKSUB](c)
      }
      this[CONSUMING] = false
    }

    if (!this[BUFFER] || this[ENDED])
      this[MAYBEEND]()
  }

  [CONSUMECHUNKSUB] (chunk) {
    // we know that we are in CONSUMING mode, so anything written goes into
    // the buffer.  Advance the position and put any remainder in the buffer.
    let position = 0
    const length = chunk.length
    while (position + 512 <= length && !this[ABORTED] && !this[SAW_EOF]) {
      switch (this[STATE]) {
        case 'begin':
        case 'header':
          this[CONSUMEHEADER](chunk, position)
          position += 512
          break

        case 'ignore':
        case 'body':
          position += this[CONSUMEBODY](chunk, position)
          break

        case 'meta':
          position += this[CONSUMEMETA](chunk, position)
          break

        /* istanbul ignore next */
        default:
          throw new Error('invalid state: ' + this[STATE])
      }
    }

    if (position < length) {
      if (this[BUFFER])
        this[BUFFER] = Buffer.concat([chunk.slice(position), this[BUFFER]])
      else
        this[BUFFER] = chunk.slice(position)
    }
  }

  end (chunk) {
    if (!this[ABORTED]) {
      if (this[UNZIP])
        this[UNZIP].end(chunk)
      else {
        this[ENDED] = true
        this.write(chunk)
      }
    }
  }
})
// A path exclusive reservation system
// reserve([list, of, paths], fn)
// When the fn is first in line for all its paths, it
// is called with a cb that clears the reservation.
//
// Used by async unpack to avoid clobbering paths in use,
// while still allowing maximal safe parallelization.

const assert = require('assert')
const normalize = require('./normalize-unicode.js')
const stripSlashes = require('./strip-trailing-slashes.js')
const { join } = require('path')

const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform
const isWindows = platform === 'win32'

module.exports = () => {
  // path => [function or Set]
  // A Set object means a directory reservation
  // A fn is a direct reservation on that path
  const queues = new Map()

  // fn => {paths:[path,...], dirs:[path, ...]}
  const reservations = new Map()

  // return a set of parent dirs for a given path
  // '/a/b/c/d' -> ['/', '/a', '/a/b', '/a/b/c', '/a/b/c/d']
  const getDirs = path => {
    const dirs = path.split('/').slice(0, -1).reduce((set, path) => {
      if (set.length)
        path = join(set[set.length - 1], path)
      set.push(path || '/')
      return set
    }, [])
    return dirs
  }

  // functions currently running
  const running = new Set()

  // return the queues for each path the function cares about
  // fn => {paths, dirs}
  const getQueues = fn => {
    const res = reservations.get(fn)
    /* istanbul ignore if - unpossible */
    if (!res)
      throw new Error('function does not have any path reservations')
    return {
      paths: res.paths.map(path => queues.get(path)),
      dirs: [...res.dirs].map(path => queues.get(path)),
    }
  }

  // check if fn is first in line for all its paths, and is
  // included in the first set for all its dir queues
  const check = fn => {
    const {paths, dirs} = getQueues(fn)
    return paths.every(q => q[0] === fn) &&
      dirs.every(q => q[0] instanceof Set && q[0].has(fn))
  }

  // run the function if it's first in line and not already running
  const run = fn => {
    if (running.has(fn) || !check(fn))
      return false
    running.add(fn)
    fn(() => clear(fn))
    return true
  }

  const clear = fn => {
    if (!running.has(fn))
      return false

    const { paths, dirs } = reservations.get(fn)
    const next = new Set()

    paths.forEach(path => {
      const q = queues.get(path)
      assert.equal(q[0], fn)
      if (q.length === 1)
        queues.delete(path)
      else {
        q.shift()
        if (typeof q[0] === 'function')
          next.add(q[0])
        else
          q[0].forEach(fn => next.add(fn))
      }
    })

    dirs.forEach(dir => {
      const q = queues.get(dir)
      assert(q[0] instanceof Set)
      if (q[0].size === 1 && q.length === 1)
        queues.delete(dir)
      else if (q[0].size === 1) {
        q.shift()

        // must be a function or else the Set would've been reused
        next.add(q[0])
      } else
        q[0].delete(fn)
    })
    running.delete(fn)

    next.forEach(fn => run(fn))
    return true
  }

  const reserve = (paths, fn) => {
    // collide on matches across case and unicode normalization
    // On windows, thanks to the magic of 8.3 shortnames, it is fundamentally
    // impossible to determine whether two paths refer to the same thing on
    // disk, without asking the kernel for a shortname.
    // So, we just pretend that every path matches every other path here,
    // effectively removing all parallelization on windows.
    paths = isWindows ? ['win32 parallelization disabled'] : paths.map(p => {
      // don't need normPath, because we skip this entirely for windows
      return normalize(stripSlashes(join(p))).toLowerCase()
    })

    const dirs = new Set(
      paths.map(path => getDirs(path)).reduce((a, b) => a.concat(b))
    )
    reservations.set(fn, {dirs, paths})
    paths.forEach(path => {
      const q = queues.get(path)
      if (!q)
        queues.set(path, [fn])
      else
        q.push(fn)
    })
    dirs.forEach(dir => {
      const q = queues.get(dir)
      if (!q)
        queues.set(dir, [new Set([fn])])
      else if (q[q.length - 1] instanceof Set)
        q[q.length - 1].add(fn)
      else
        q.push(new Set([fn]))
    })

    return run(fn)
  }

  return { check, reserve }
}
'use strict'
const Header = require('./header.js')
const path = require('path')

class Pax {
  constructor (obj, global) {
    this.atime = obj.atime || null
    this.charset = obj.charset || null
    this.comment = obj.comment || null
    this.ctime = obj.ctime || null
    this.gid = obj.gid || null
    this.gname = obj.gname || null
    this.linkpath = obj.linkpath || null
    this.mtime = obj.mtime || null
    this.path = obj.path || null
    this.size = obj.size || null
    this.uid = obj.uid || null
    this.uname = obj.uname || null
    this.dev = obj.dev || null
    this.ino = obj.ino || null
    this.nlink = obj.nlink || null
    this.global = global || false
  }

  encode () {
    const body = this.encodeBody()
    if (body === '')
      return null

    const bodyLen = Buffer.byteLength(body)
    // round up to 512 bytes
    // add 512 for header
    const bufLen = 512 * Math.ceil(1 + bodyLen / 512)
    const buf = Buffer.allocUnsafe(bufLen)

    // 0-fill the header section, it might not hit every field
    for (let i = 0; i < 512; i++)
      buf[i] = 0

    new Header({
      // XXX split the path
      // then the path should be PaxHeader + basename, but less than 99,
      // prepend with the dirname
      path: ('PaxHeader/' + path.basename(this.path)).slice(0, 99),
      mode: this.mode || 0o644,
      uid: this.uid || null,
      gid: this.gid || null,
      size: bodyLen,
      mtime: this.mtime || null,
      type: this.global ? 'GlobalExtendedHeader' : 'ExtendedHeader',
      linkpath: '',
      uname: this.uname || '',
      gname: this.gname || '',
      devmaj: 0,
      devmin: 0,
      atime: this.atime || null,
      ctime: this.ctime || null,
    }).encode(buf)

    buf.write(body, 512, bodyLen, 'utf8')

    // null pad after the body
    for (let i = bodyLen + 512; i < buf.length; i++)
      buf[i] = 0

    return buf
  }

  encodeBody () {
    return (
      this.encodeField('path') +
      this.encodeField('ctime') +
      this.encodeField('atime') +
      this.encodeField('dev') +
      this.encodeField('ino') +
      this.encodeField('nlink') +
      this.encodeField('charset') +
      this.encodeField('comment') +
      this.encodeField('gid') +
      this.encodeField('gname') +
      this.encodeField('linkpath') +
      this.encodeField('mtime') +
      this.encodeField('size') +
      this.encodeField('uid') +
      this.encodeField('uname')
    )
  }

  encodeField (field) {
    if (this[field] === null || this[field] === undefined)
      return ''
    const v = this[field] instanceof Date ? this[field].getTime() / 1000
      : this[field]
    const s = ' ' +
      (field === 'dev' || field === 'ino' || field === 'nlink'
        ? 'SCHILY.' : '') +
      field + '=' + v + '\n'
    const byteLen = Buffer.byteLength(s)
    // the digits includes the length of the digits in ascii base-10
    // so if it's 9 characters, then adding 1 for the 9 makes it 10
    // which makes it 11 chars.
    let digits = Math.floor(Math.log(byteLen) / Math.log(10)) + 1
    if (byteLen + digits >= Math.pow(10, digits))
      digits += 1
    const len = digits + byteLen
    return len + s
  }
}

Pax.parse = (string, ex, g) => new Pax(merge(parseKV(string), ex), g)

const merge = (a, b) =>
  b ? Object.keys(a).reduce((s, k) => (s[k] = a[k], s), b) : a

const parseKV = string =>
  string
    .replace(/\n$/, '')
    .split('\n')
    .reduce(parseKVLine, Object.create(null))

const parseKVLine = (set, line) => {
  const n = parseInt(line, 10)

  // XXX Values with \n in them will fail this.
  // Refactor to not be a naive line-by-line parse.
  if (n !== Buffer.byteLength(line) + 1)
    return set

  line = line.substr((n + ' ').length)
  const kv = line.split('=')
  const k = kv.shift().replace(/^SCHILY\.(dev|ino|nlink)/, '$1')
  if (!k)
    return set

  const v = kv.join('=')
  set[k] = /^([A-Z]+\.)?([mac]|birth|creation)time$/.test(k)
    ? new Date(v * 1000)
    : /^[0-9]+$/.test(v) ? +v
    : v
  return set
}

module.exports = Pax
'use strict'
const MiniPass = require('minipass')
const normPath = require('./normalize-windows-path.js')

const SLURP = Symbol('slurp')
module.exports = class ReadEntry extends MiniPass {
  constructor (header, ex, gex) {
    super()
    // read entries always start life paused.  this is to avoid the
    // situation where Minipass's auto-ending empty streams results
    // in an entry ending before we're ready for it.
    this.pause()
    this.extended = ex
    this.globalExtended = gex
    this.header = header
    this.startBlockSize = 512 * Math.ceil(header.size / 512)
    this.blockRemain = this.startBlockSize
    this.remain = header.size
    this.type = header.type
    this.meta = false
    this.ignore = false
    switch (this.type) {
      case 'File':
      case 'OldFile':
      case 'Link':
      case 'SymbolicLink':
      case 'CharacterDevice':
      case 'BlockDevice':
      case 'Directory':
      case 'FIFO':
      case 'ContiguousFile':
      case 'GNUDumpDir':
        break

      case 'NextFileHasLongLinkpath':
      case 'NextFileHasLongPath':
      case 'OldGnuLongPath':
      case 'GlobalExtendedHeader':
      case 'ExtendedHeader':
      case 'OldExtendedHeader':
        this.meta = true
        break

      // NOTE: gnutar and bsdtar treat unrecognized types as 'File'
      // it may be worth doing the same, but with a warning.
      default:
        this.ignore = true
    }

    this.path = normPath(header.path)
    this.mode = header.mode
    if (this.mode)
      this.mode = this.mode & 0o7777
    this.uid = header.uid
    this.gid = header.gid
    this.uname = header.uname
    this.gname = header.gname
    this.size = header.size
    this.mtime = header.mtime
    this.atime = header.atime
    this.ctime = header.ctime
    this.linkpath = normPath(header.linkpath)
    this.uname = header.uname
    this.gname = header.gname

    if (ex)
      this[SLURP](ex)
    if (gex)
      this[SLURP](gex, true)
  }

  write (data) {
    const writeLen = data.length
    if (writeLen > this.blockRemain)
      throw new Error('writing more to entry than is appropriate')

    const r = this.remain
    const br = this.blockRemain
    this.remain = Math.max(0, r - writeLen)
    this.blockRemain = Math.max(0, br - writeLen)
    if (this.ignore)
      return true

    if (r >= writeLen)
      return super.write(data)

    // r < writeLen
    return super.write(data.slice(0, r))
  }

  [SLURP] (ex, global) {
    for (const k in ex) {
      // we slurp in everything except for the path attribute in
      // a global extended header, because that's weird.
      if (ex[k] !== null && ex[k] !== undefined &&
          !(global && k === 'path'))
        this[k] = k === 'path' || k === 'linkpath' ? normPath(ex[k]) : ex[k]
    }
  }
}
'use strict'

// tar -r
const hlo = require('./high-level-opt.js')
const Pack = require('./pack.js')
const fs = require('fs')
const fsm = require('fs-minipass')
const t = require('./list.js')
const path = require('path')

// starting at the head of the file, read a Header
// If the checksum is invalid, that's our position to start writing
// If it is, jump forward by the specified size (round up to 512)
// and try again.
// Write the new Pack stream starting there.

const Header = require('./header.js')

module.exports = (opt_, files, cb) => {
  const opt = hlo(opt_)

  if (!opt.file)
    throw new TypeError('file is required')

  if (opt.gzip)
    throw new TypeError('cannot append to compressed archives')

  if (!files || !Array.isArray(files) || !files.length)
    throw new TypeError('no files or directories specified')

  files = Array.from(files)

  return opt.sync ? replaceSync(opt, files)
    : replace(opt, files, cb)
}

const replaceSync = (opt, files) => {
  const p = new Pack.Sync(opt)

  let threw = true
  let fd
  let position

  try {
    try {
      fd = fs.openSync(opt.file, 'r+')
    } catch (er) {
      if (er.code === 'ENOENT')
        fd = fs.openSync(opt.file, 'w+')
      else
        throw er
    }

    const st = fs.fstatSync(fd)
    const headBuf = Buffer.alloc(512)

    POSITION: for (position = 0; position < st.size; position += 512) {
      for (let bufPos = 0, bytes = 0; bufPos < 512; bufPos += bytes) {
        bytes = fs.readSync(
          fd, headBuf, bufPos, headBuf.length - bufPos, position + bufPos
        )

        if (position === 0 && headBuf[0] === 0x1f && headBuf[1] === 0x8b)
          throw new Error('cannot append to compressed archives')

        if (!bytes)
          break POSITION
      }

      const h = new Header(headBuf)
      if (!h.cksumValid)
        break
      const entryBlockSize = 512 * Math.ceil(h.size / 512)
      if (position + entryBlockSize + 512 > st.size)
        break
      // the 512 for the header we just parsed will be added as well
      // also jump ahead all the blocks for the body
      position += entryBlockSize
      if (opt.mtimeCache)
        opt.mtimeCache.set(h.path, h.mtime)
    }
    threw = false

    streamSync(opt, p, position, fd, files)
  } finally {
    if (threw) {
      try {
        fs.closeSync(fd)
      } catch (er) {}
    }
  }
}

const streamSync = (opt, p, position, fd, files) => {
  const stream = new fsm.WriteStreamSync(opt.file, {
    fd: fd,
    start: position,
  })
  p.pipe(stream)
  addFilesSync(p, files)
}

const replace = (opt, files, cb) => {
  files = Array.from(files)
  const p = new Pack(opt)

  const getPos = (fd, size, cb_) => {
    const cb = (er, pos) => {
      if (er)
        fs.close(fd, _ => cb_(er))
      else
        cb_(null, pos)
    }

    let position = 0
    if (size === 0)
      return cb(null, 0)

    let bufPos = 0
    const headBuf = Buffer.alloc(512)
    const onread = (er, bytes) => {
      if (er)
        return cb(er)
      bufPos += bytes
      if (bufPos < 512 && bytes) {
        return fs.read(
          fd, headBuf, bufPos, headBuf.length - bufPos,
          position + bufPos, onread
        )
      }

      if (position === 0 && headBuf[0] === 0x1f && headBuf[1] === 0x8b)
        return cb(new Error('cannot append to compressed archives'))

      // truncated header
      if (bufPos < 512)
        return cb(null, position)

      const h = new Header(headBuf)
      if (!h.cksumValid)
        return cb(null, position)

      const entryBlockSize = 512 * Math.ceil(h.size / 512)
      if (position + entryBlockSize + 512 > size)
        return cb(null, position)

      position += entryBlockSize + 512
      if (position >= size)
        return cb(null, position)

      if (opt.mtimeCache)
        opt.mtimeCache.set(h.path, h.mtime)
      bufPos = 0
      fs.read(fd, headBuf, 0, 512, position, onread)
    }
    fs.read(fd, headBuf, 0, 512, position, onread)
  }

  const promise = new Promise((resolve, reject) => {
    p.on('error', reject)
    let flag = 'r+'
    const onopen = (er, fd) => {
      if (er && er.code === 'ENOENT' && flag === 'r+') {
        flag = 'w+'
        return fs.open(opt.file, flag, onopen)
      }

      if (er)
        return reject(er)

      fs.fstat(fd, (er, st) => {
        if (er)
          return fs.close(fd, () => reject(er))

        getPos(fd, st.size, (er, position) => {
          if (er)
            return reject(er)
          const stream = new fsm.WriteStream(opt.file, {
            fd: fd,
            start: position,
          })
          p.pipe(stream)
          stream.on('error', reject)
          stream.on('close', resolve)
          addFilesAsync(p, files)
        })
      })
    }
    fs.open(opt.file, flag, onopen)
  })

  return cb ? promise.then(cb, cb) : promise
}

const addFilesSync = (p, files) => {
  files.forEach(file => {
    if (file.charAt(0) === '@') {
      t({
        file: path.resolve(p.cwd, file.substr(1)),
        sync: true,
        noResume: true,
        onentry: entry => p.add(entry),
      })
    } else
      p.add(file)
  })
  p.end()
}

const addFilesAsync = (p, files) => {
  while (files.length) {
    const file = files.shift()
    if (file.charAt(0) === '@') {
      return t({
        file: path.resolve(p.cwd, file.substr(1)),
        noResume: true,
        onentry: entry => p.add(entry),
      }).then(_ => addFilesAsync(p, files))
    } else
      p.add(file)
  }
  p.end()
}
// unix absolute paths are also absolute on win32, so we use this for both
const { isAbsolute, parse } = require('path').win32

// returns [root, stripped]
// Note that windows will think that //x/y/z/a has a "root" of //x/y, and in
// those cases, we want to sanitize it to x/y/z/a, not z/a, so we strip /
// explicitly if it's the first character.
// drive-specific relative paths on Windows get their root stripped off even
// though they are not absolute, so `c:../foo` becomes ['c:', '../foo']
module.exports = path => {
  let r = ''

  let parsed = parse(path)
  while (isAbsolute(path) || parsed.root) {
    // windows will think that //x/y/z has a "root" of //x/y/
    // but strip the //?/C:/ off of //?/C:/path
    const root = path.charAt(0) === '/' && path.slice(0, 4) !== '//?/' ? '/'
      : parsed.root
    path = path.substr(root.length)
    r += root
    parsed = parse(path)
  }
  return [r, path]
}
// warning: extremely hot code path.
// This has been meticulously optimized for use
// within npm install on large package trees.
// Do not edit without careful benchmarking.
module.exports = str => {
  let i = str.length - 1
  let slashesStart = -1
  while (i > -1 && str.charAt(i) === '/') {
    slashesStart = i
    i--
  }
  return slashesStart === -1 ? str : str.slice(0, slashesStart)
}
'use strict'
// map types from key to human-friendly name
exports.name = new Map([
  ['0', 'File'],
  // same as File
  ['', 'OldFile'],
  ['1', 'Link'],
  ['2', 'SymbolicLink'],
  // Devices and FIFOs aren't fully supported
  // they are parsed, but skipped when unpacking
  ['3', 'CharacterDevice'],
  ['4', 'BlockDevice'],
  ['5', 'Directory'],
  ['6', 'FIFO'],
  // same as File
  ['7', 'ContiguousFile'],
  // pax headers
  ['g', 'GlobalExtendedHeader'],
  ['x', 'ExtendedHeader'],
  // vendor-specific stuff
  // skip
  ['A', 'SolarisACL'],
  // like 5, but with data, which should be skipped
  ['D', 'GNUDumpDir'],
  // metadata only, skip
  ['I', 'Inode'],
  // data = link path of next file
  ['K', 'NextFileHasLongLinkpath'],
  // data = path of next file
  ['L', 'NextFileHasLongPath'],
  // skip
  ['M', 'ContinuationFile'],
  // like L
  ['N', 'OldGnuLongPath'],
  // skip
  ['S', 'SparseFile'],
  // skip
  ['V', 'TapeVolumeHeader'],
  // like x
  ['X', 'OldExtendedHeader'],
])

// map the other direction
exports.code = new Map(Array.from(exports.name).map(kv => [kv[1], kv[0]]))
'use strict'

// the PEND/UNPEND stuff tracks whether we're ready to emit end/close yet.
// but the path reservations are required to avoid race conditions where
// parallelized unpack ops may mess with one another, due to dependencies
// (like a Link depending on its target) or destructive operations (like
// clobbering an fs object to create one of a different type.)

const assert = require('assert')
const Parser = require('./parse.js')
const fs = require('fs')
const fsm = require('fs-minipass')
const path = require('path')
const mkdir = require('./mkdir.js')
const wc = require('./winchars.js')
const pathReservations = require('./path-reservations.js')
const stripAbsolutePath = require('./strip-absolute-path.js')
const normPath = require('./normalize-windows-path.js')
const stripSlash = require('./strip-trailing-slashes.js')
const normalize = require('./normalize-unicode.js')

const ONENTRY = Symbol('onEntry')
const CHECKFS = Symbol('checkFs')
const CHECKFS2 = Symbol('checkFs2')
const PRUNECACHE = Symbol('pruneCache')
const ISREUSABLE = Symbol('isReusable')
const MAKEFS = Symbol('makeFs')
const FILE = Symbol('file')
const DIRECTORY = Symbol('directory')
const LINK = Symbol('link')
const SYMLINK = Symbol('symlink')
const HARDLINK = Symbol('hardlink')
const UNSUPPORTED = Symbol('unsupported')
const CHECKPATH = Symbol('checkPath')
const MKDIR = Symbol('mkdir')
const ONERROR = Symbol('onError')
const PENDING = Symbol('pending')
const PEND = Symbol('pend')
const UNPEND = Symbol('unpend')
const ENDED = Symbol('ended')
const MAYBECLOSE = Symbol('maybeClose')
const SKIP = Symbol('skip')
const DOCHOWN = Symbol('doChown')
const UID = Symbol('uid')
const GID = Symbol('gid')
const CHECKED_CWD = Symbol('checkedCwd')
const crypto = require('crypto')
const getFlag = require('./get-write-flag.js')
const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform
const isWindows = platform === 'win32'

// Unlinks on Windows are not atomic.
//
// This means that if you have a file entry, followed by another
// file entry with an identical name, and you cannot re-use the file
// (because it's a hardlink, or because unlink:true is set, or it's
// Windows, which does not have useful nlink values), then the unlink
// will be committed to the disk AFTER the new file has been written
// over the old one, deleting the new file.
//
// To work around this, on Windows systems, we rename the file and then
// delete the renamed file.  It's a sloppy kludge, but frankly, I do not
// know of a better way to do this, given windows' non-atomic unlink
// semantics.
//
// See: https://github.com/npm/node-tar/issues/183
/* istanbul ignore next */
const unlinkFile = (path, cb) => {
  if (!isWindows)
    return fs.unlink(path, cb)

  const name = path + '.DELETE.' + crypto.randomBytes(16).toString('hex')
  fs.rename(path, name, er => {
    if (er)
      return cb(er)
    fs.unlink(name, cb)
  })
}

/* istanbul ignore next */
const unlinkFileSync = path => {
  if (!isWindows)
    return fs.unlinkSync(path)

  const name = path + '.DELETE.' + crypto.randomBytes(16).toString('hex')
  fs.renameSync(path, name)
  fs.unlinkSync(name)
}

// this.gid, entry.gid, this.processUid
const uint32 = (a, b, c) =>
  a === a >>> 0 ? a
  : b === b >>> 0 ? b
  : c

// clear the cache if it's a case-insensitive unicode-squashing match.
// we can't know if the current file system is case-sensitive or supports
// unicode fully, so we check for similarity on the maximally compatible
// representation.  Err on the side of pruning, since all it's doing is
// preventing lstats, and it's not the end of the world if we get a false
// positive.
// Note that on windows, we always drop the entire cache whenever a
// symbolic link is encountered, because 8.3 filenames are impossible
// to reason about, and collisions are hazards rather than just failures.
const cacheKeyNormalize = path => normalize(stripSlash(normPath(path)))
  .toLowerCase()

const pruneCache = (cache, abs) => {
  abs = cacheKeyNormalize(abs)
  for (const path of cache.keys()) {
    const pnorm = cacheKeyNormalize(path)
    if (pnorm === abs || pnorm.indexOf(abs + '/') === 0)
      cache.delete(path)
  }
}

const dropCache = cache => {
  for (const key of cache.keys())
    cache.delete(key)
}

class Unpack extends Parser {
  constructor (opt) {
    if (!opt)
      opt = {}

    opt.ondone = _ => {
      this[ENDED] = true
      this[MAYBECLOSE]()
    }

    super(opt)

    this[CHECKED_CWD] = false

    this.reservations = pathReservations()

    this.transform = typeof opt.transform === 'function' ? opt.transform : null

    this.writable = true
    this.readable = false

    this[PENDING] = 0
    this[ENDED] = false

    this.dirCache = opt.dirCache || new Map()

    if (typeof opt.uid === 'number' || typeof opt.gid === 'number') {
      // need both or neither
      if (typeof opt.uid !== 'number' || typeof opt.gid !== 'number')
        throw new TypeError('cannot set owner without number uid and gid')
      if (opt.preserveOwner) {
        throw new TypeError(
          'cannot preserve owner in archive and also set owner explicitly')
      }
      this.uid = opt.uid
      this.gid = opt.gid
      this.setOwner = true
    } else {
      this.uid = null
      this.gid = null
      this.setOwner = false
    }

    // default true for root
    if (opt.preserveOwner === undefined && typeof opt.uid !== 'number')
      this.preserveOwner = process.getuid && process.getuid() === 0
    else
      this.preserveOwner = !!opt.preserveOwner

    this.processUid = (this.preserveOwner || this.setOwner) && process.getuid ?
      process.getuid() : null
    this.processGid = (this.preserveOwner || this.setOwner) && process.getgid ?
      process.getgid() : null

    // mostly just for testing, but useful in some cases.
    // Forcibly trigger a chown on every entry, no matter what
    this.forceChown = opt.forceChown === true

    // turn ><?| in filenames into 0xf000-higher encoded forms
    this.win32 = !!opt.win32 || isWindows

    // do not unpack over files that are newer than what's in the archive
    this.newer = !!opt.newer

    // do not unpack over ANY files
    this.keep = !!opt.keep

    // do not set mtime/atime of extracted entries
    this.noMtime = !!opt.noMtime

    // allow .., absolute path entries, and unpacking through symlinks
    // without this, warn and skip .., relativize absolutes, and error
    // on symlinks in extraction path
    this.preservePaths = !!opt.preservePaths

    // unlink files and links before writing. This breaks existing hard
    // links, and removes symlink directories rather than erroring
    this.unlink = !!opt.unlink

    this.cwd = normPath(path.resolve(opt.cwd || process.cwd()))
    this.strip = +opt.strip || 0
    // if we're not chmodding, then we don't need the process umask
    this.processUmask = opt.noChmod ? 0 : process.umask()
    this.umask = typeof opt.umask === 'number' ? opt.umask : this.processUmask

    // default mode for dirs created as parents
    this.dmode = opt.dmode || (0o0777 & (~this.umask))
    this.fmode = opt.fmode || (0o0666 & (~this.umask))

    this.on('entry', entry => this[ONENTRY](entry))
  }

  // a bad or damaged archive is a warning for Parser, but an error
  // when extracting.  Mark those errors as unrecoverable, because
  // the Unpack contract cannot be met.
  warn (code, msg, data = {}) {
    if (code === 'TAR_BAD_ARCHIVE' || code === 'TAR_ABORT')
      data.recoverable = false
    return super.warn(code, msg, data)
  }

  [MAYBECLOSE] () {
    if (this[ENDED] && this[PENDING] === 0) {
      this.emit('prefinish')
      this.emit('finish')
      this.emit('end')
      this.emit('close')
    }
  }

  [CHECKPATH] (entry) {
    if (this.strip) {
      const parts = normPath(entry.path).split('/')
      if (parts.length < this.strip)
        return false
      entry.path = parts.slice(this.strip).join('/')

      if (entry.type === 'Link') {
        const linkparts = normPath(entry.linkpath).split('/')
        if (linkparts.length >= this.strip)
          entry.linkpath = linkparts.slice(this.strip).join('/')
        else
          return false
      }
    }

    if (!this.preservePaths) {
      const p = normPath(entry.path)
      const parts = p.split('/')
      if (parts.includes('..') || isWindows && /^[a-z]:\.\.$/i.test(parts[0])) {
        this.warn('TAR_ENTRY_ERROR', `path contains '..'`, {
          entry,
          path: p,
        })
        return false
      }

      // strip off the root
      const [root, stripped] = stripAbsolutePath(p)
      if (root) {
        entry.path = stripped
        this.warn('TAR_ENTRY_INFO', `stripping ${root} from absolute path`, {
          entry,
          path: p,
        })
      }
    }

    if (path.isAbsolute(entry.path))
      entry.absolute = normPath(path.resolve(entry.path))
    else
      entry.absolute = normPath(path.resolve(this.cwd, entry.path))

    // if we somehow ended up with a path that escapes the cwd, and we are
    // not in preservePaths mode, then something is fishy!  This should have
    // been prevented above, so ignore this for coverage.
    /* istanbul ignore if - defense in depth */
    if (!this.preservePaths &&
        entry.absolute.indexOf(this.cwd + '/') !== 0 &&
        entry.absolute !== this.cwd) {
      this.warn('TAR_ENTRY_ERROR', 'path escaped extraction target', {
        entry,
        path: normPath(entry.path),
        resolvedPath: entry.absolute,
        cwd: this.cwd,
      })
      return false
    }

    // an archive can set properties on the extraction directory, but it
    // may not replace the cwd with a different kind of thing entirely.
    if (entry.absolute === this.cwd &&
        entry.type !== 'Directory' &&
        entry.type !== 'GNUDumpDir')
      return false

    // only encode : chars that aren't drive letter indicators
    if (this.win32) {
      const { root: aRoot } = path.win32.parse(entry.absolute)
      entry.absolute = aRoot + wc.encode(entry.absolute.substr(aRoot.length))
      const { root: pRoot } = path.win32.parse(entry.path)
      entry.path = pRoot + wc.encode(entry.path.substr(pRoot.length))
    }

    return true
  }

  [ONENTRY] (entry) {
    if (!this[CHECKPATH](entry))
      return entry.resume()

    assert.equal(typeof entry.absolute, 'string')

    switch (entry.type) {
      case 'Directory':
      case 'GNUDumpDir':
        if (entry.mode)
          entry.mode = entry.mode | 0o700

      case 'File':
      case 'OldFile':
      case 'ContiguousFile':
      case 'Link':
      case 'SymbolicLink':
        return this[CHECKFS](entry)

      case 'CharacterDevice':
      case 'BlockDevice':
      case 'FIFO':
      default:
        return this[UNSUPPORTED](entry)
    }
  }

  [ONERROR] (er, entry) {
    // Cwd has to exist, or else nothing works. That's serious.
    // Other errors are warnings, which raise the error in strict
    // mode, but otherwise continue on.
    if (er.name === 'CwdError')
      this.emit('error', er)
    else {
      this.warn('TAR_ENTRY_ERROR', er, {entry})
      this[UNPEND]()
      entry.resume()
    }
  }

  [MKDIR] (dir, mode, cb) {
    mkdir(normPath(dir), {
      uid: this.uid,
      gid: this.gid,
      processUid: this.processUid,
      processGid: this.processGid,
      umask: this.processUmask,
      preserve: this.preservePaths,
      unlink: this.unlink,
      cache: this.dirCache,
      cwd: this.cwd,
      mode: mode,
      noChmod: this.noChmod,
    }, cb)
  }

  [DOCHOWN] (entry) {
    // in preserve owner mode, chown if the entry doesn't match process
    // in set owner mode, chown if setting doesn't match process
    return this.forceChown ||
      this.preserveOwner &&
      (typeof entry.uid === 'number' && entry.uid !== this.processUid ||
        typeof entry.gid === 'number' && entry.gid !== this.processGid)
      ||
      (typeof this.uid === 'number' && this.uid !== this.processUid ||
        typeof this.gid === 'number' && this.gid !== this.processGid)
  }

  [UID] (entry) {
    return uint32(this.uid, entry.uid, this.processUid)
  }

  [GID] (entry) {
    return uint32(this.gid, entry.gid, this.processGid)
  }

  [FILE] (entry, fullyDone) {
    const mode = entry.mode & 0o7777 || this.fmode
    const stream = new fsm.WriteStream(entry.absolute, {
      flags: getFlag(entry.size),
      mode: mode,
      autoClose: false,
    })
    stream.on('error', er => {
      if (stream.fd)
        fs.close(stream.fd, () => {})

      // flush all the data out so that we aren't left hanging
      // if the error wasn't actually fatal.  otherwise the parse
      // is blocked, and we never proceed.
      stream.write = () => true
      this[ONERROR](er, entry)
      fullyDone()
    })

    let actions = 1
    const done = er => {
      if (er) {
        /* istanbul ignore else - we should always have a fd by now */
        if (stream.fd)
          fs.close(stream.fd, () => {})

        this[ONERROR](er, entry)
        fullyDone()
        return
      }

      if (--actions === 0) {
        fs.close(stream.fd, er => {
          if (er)
            this[ONERROR](er, entry)
          else
            this[UNPEND]()
          fullyDone()
        })
      }
    }

    stream.on('finish', _ => {
      // if futimes fails, try utimes
      // if utimes fails, fail with the original error
      // same for fchown/chown
      const abs = entry.absolute
      const fd = stream.fd

      if (entry.mtime && !this.noMtime) {
        actions++
        const atime = entry.atime || new Date()
        const mtime = entry.mtime
        fs.futimes(fd, atime, mtime, er =>
          er ? fs.utimes(abs, atime, mtime, er2 => done(er2 && er))
          : done())
      }

      if (this[DOCHOWN](entry)) {
        actions++
        const uid = this[UID](entry)
        const gid = this[GID](entry)
        fs.fchown(fd, uid, gid, er =>
          er ? fs.chown(abs, uid, gid, er2 => done(er2 && er))
          : done())
      }

      done()
    })

    const tx = this.transform ? this.transform(entry) || entry : entry
    if (tx !== entry) {
      tx.on('error', er => {
        this[ONERROR](er, entry)
        fullyDone()
      })
      entry.pipe(tx)
    }
    tx.pipe(stream)
  }

  [DIRECTORY] (entry, fullyDone) {
    const mode = entry.mode & 0o7777 || this.dmode
    this[MKDIR](entry.absolute, mode, er => {
      if (er) {
        this[ONERROR](er, entry)
        fullyDone()
        return
      }

      let actions = 1
      const done = _ => {
        if (--actions === 0) {
          fullyDone()
          this[UNPEND]()
          entry.resume()
        }
      }

      if (entry.mtime && !this.noMtime) {
        actions++
        fs.utimes(entry.absolute, entry.atime || new Date(), entry.mtime, done)
      }

      if (this[DOCHOWN](entry)) {
        actions++
        fs.chown(entry.absolute, this[UID](entry), this[GID](entry), done)
      }

      done()
    })
  }

  [UNSUPPORTED] (entry) {
    entry.unsupported = true
    this.warn('TAR_ENTRY_UNSUPPORTED',
      `unsupported entry type: ${entry.type}`, {entry})
    entry.resume()
  }

  [SYMLINK] (entry, done) {
    this[LINK](entry, entry.linkpath, 'symlink', done)
  }

  [HARDLINK] (entry, done) {
    const linkpath = normPath(path.resolve(this.cwd, entry.linkpath))
    this[LINK](entry, linkpath, 'link', done)
  }

  [PEND] () {
    this[PENDING]++
  }

  [UNPEND] () {
    this[PENDING]--
    this[MAYBECLOSE]()
  }

  [SKIP] (entry) {
    this[UNPEND]()
    entry.resume()
  }

  // Check if we can reuse an existing filesystem entry safely and
  // overwrite it, rather than unlinking and recreating
  // Windows doesn't report a useful nlink, so we just never reuse entries
  [ISREUSABLE] (entry, st) {
    return entry.type === 'File' &&
      !this.unlink &&
      st.isFile() &&
      st.nlink <= 1 &&
      !isWindows
  }

  // check if a thing is there, and if so, try to clobber it
  [CHECKFS] (entry) {
    this[PEND]()
    const paths = [entry.path]
    if (entry.linkpath)
      paths.push(entry.linkpath)
    this.reservations.reserve(paths, done => this[CHECKFS2](entry, done))
  }

  [PRUNECACHE] (entry) {
    // if we are not creating a directory, and the path is in the dirCache,
    // then that means we are about to delete the directory we created
    // previously, and it is no longer going to be a directory, and neither
    // is any of its children.
    // If a symbolic link is encountered, all bets are off.  There is no
    // reasonable way to sanitize the cache in such a way we will be able to
    // avoid having filesystem collisions.  If this happens with a non-symlink
    // entry, it'll just fail to unpack, but a symlink to a directory, using an
    // 8.3 shortname or certain unicode attacks, can evade detection and lead
    // to arbitrary writes to anywhere on the system.
    if (entry.type === 'SymbolicLink')
      dropCache(this.dirCache)
    else if (entry.type !== 'Directory')
      pruneCache(this.dirCache, entry.absolute)
  }

  [CHECKFS2] (entry, fullyDone) {
    this[PRUNECACHE](entry)

    const done = er => {
      this[PRUNECACHE](entry)
      fullyDone(er)
    }

    const checkCwd = () => {
      this[MKDIR](this.cwd, this.dmode, er => {
        if (er) {
          this[ONERROR](er, entry)
          done()
          return
        }
        this[CHECKED_CWD] = true
        start()
      })
    }

    const start = () => {
      if (entry.absolute !== this.cwd) {
        const parent = normPath(path.dirname(entry.absolute))
        if (parent !== this.cwd) {
          return this[MKDIR](parent, this.dmode, er => {
            if (er) {
              this[ONERROR](er, entry)
              done()
              return
            }
            afterMakeParent()
          })
        }
      }
      afterMakeParent()
    }

    const afterMakeParent = () => {
      fs.lstat(entry.absolute, (lstatEr, st) => {
        if (st && (this.keep || this.newer && st.mtime > entry.mtime)) {
          this[SKIP](entry)
          done()
          return
        }
        if (lstatEr || this[ISREUSABLE](entry, st))
          return this[MAKEFS](null, entry, done)

        if (st.isDirectory()) {
          if (entry.type === 'Directory') {
            const needChmod = !this.noChmod &&
              entry.mode &&
              (st.mode & 0o7777) !== entry.mode
            const afterChmod = er => this[MAKEFS](er, entry, done)
            if (!needChmod)
              return afterChmod()
            return fs.chmod(entry.absolute, entry.mode, afterChmod)
          }
          // Not a dir entry, have to remove it.
          // NB: the only way to end up with an entry that is the cwd
          // itself, in such a way that == does not detect, is a
          // tricky windows absolute path with UNC or 8.3 parts (and
          // preservePaths:true, or else it will have been stripped).
          // In that case, the user has opted out of path protections
          // explicitly, so if they blow away the cwd, c'est la vie.
          if (entry.absolute !== this.cwd) {
            return fs.rmdir(entry.absolute, er =>
              this[MAKEFS](er, entry, done))
          }
        }

        // not a dir, and not reusable
        // don't remove if the cwd, we want that error
        if (entry.absolute === this.cwd)
          return this[MAKEFS](null, entry, done)

        unlinkFile(entry.absolute, er =>
          this[MAKEFS](er, entry, done))
      })
    }

    if (this[CHECKED_CWD])
      start()
    else
      checkCwd()
  }

  [MAKEFS] (er, entry, done) {
    if (er) {
      this[ONERROR](er, entry)
      done()
      return
    }

    switch (entry.type) {
      case 'File':
      case 'OldFile':
      case 'ContiguousFile':
        return this[FILE](entry, done)

      case 'Link':
        return this[HARDLINK](entry, done)

      case 'SymbolicLink':
        return this[SYMLINK](entry, done)

      case 'Directory':
      case 'GNUDumpDir':
        return this[DIRECTORY](entry, done)
    }
  }

  [LINK] (entry, linkpath, link, done) {
    // XXX: get the type ('symlink' or 'junction') for windows
    fs[link](linkpath, entry.absolute, er => {
      if (er)
        this[ONERROR](er, entry)
      else {
        this[UNPEND]()
        entry.resume()
      }
      done()
    })
  }
}

const callSync = fn => {
  try {
    return [null, fn()]
  } catch (er) {
    return [er, null]
  }
}
class UnpackSync extends Unpack {
  [MAKEFS] (er, entry) {
    return super[MAKEFS](er, entry, () => {})
  }

  [CHECKFS] (entry) {
    this[PRUNECACHE](entry)

    if (!this[CHECKED_CWD]) {
      const er = this[MKDIR](this.cwd, this.dmode)
      if (er)
        return this[ONERROR](er, entry)
      this[CHECKED_CWD] = true
    }

    // don't bother to make the parent if the current entry is the cwd,
    // we've already checked it.
    if (entry.absolute !== this.cwd) {
      const parent = normPath(path.dirname(entry.absolute))
      if (parent !== this.cwd) {
        const mkParent = this[MKDIR](parent, this.dmode)
        if (mkParent)
          return this[ONERROR](mkParent, entry)
      }
    }

    const [lstatEr, st] = callSync(() => fs.lstatSync(entry.absolute))
    if (st && (this.keep || this.newer && st.mtime > entry.mtime))
      return this[SKIP](entry)

    if (lstatEr || this[ISREUSABLE](entry, st))
      return this[MAKEFS](null, entry)

    if (st.isDirectory()) {
      if (entry.type === 'Directory') {
        const needChmod = !this.noChmod &&
          entry.mode &&
          (st.mode & 0o7777) !== entry.mode
        const [er] = needChmod ? callSync(() => {
          fs.chmodSync(entry.absolute, entry.mode)
        }) : []
        return this[MAKEFS](er, entry)
      }
      // not a dir entry, have to remove it
      const [er] = callSync(() => fs.rmdirSync(entry.absolute))
      this[MAKEFS](er, entry)
    }

    // not a dir, and not reusable.
    // don't remove if it's the cwd, since we want that error.
    const [er] = entry.absolute === this.cwd ? []
      : callSync(() => unlinkFileSync(entry.absolute))
    this[MAKEFS](er, entry)
  }

  [FILE] (entry, done) {
    const mode = entry.mode & 0o7777 || this.fmode

    const oner = er => {
      let closeError
      try {
        fs.closeSync(fd)
      } catch (e) {
        closeError = e
      }
      if (er || closeError)
        this[ONERROR](er || closeError, entry)
      done()
    }

    let fd
    try {
      fd = fs.openSync(entry.absolute, getFlag(entry.size), mode)
    } catch (er) {
      return oner(er)
    }
    const tx = this.transform ? this.transform(entry) || entry : entry
    if (tx !== entry) {
      tx.on('error', er => this[ONERROR](er, entry))
      entry.pipe(tx)
    }

    tx.on('data', chunk => {
      try {
        fs.writeSync(fd, chunk, 0, chunk.length)
      } catch (er) {
        oner(er)
      }
    })

    tx.on('end', _ => {
      let er = null
      // try both, falling futimes back to utimes
      // if either fails, handle the first error
      if (entry.mtime && !this.noMtime) {
        const atime = entry.atime || new Date()
        const mtime = entry.mtime
        try {
          fs.futimesSync(fd, atime, mtime)
        } catch (futimeser) {
          try {
            fs.utimesSync(entry.absolute, atime, mtime)
          } catch (utimeser) {
            er = futimeser
          }
        }
      }

      if (this[DOCHOWN](entry)) {
        const uid = this[UID](entry)
        const gid = this[GID](entry)

        try {
          fs.fchownSync(fd, uid, gid)
        } catch (fchowner) {
          try {
            fs.chownSync(entry.absolute, uid, gid)
          } catch (chowner) {
            er = er || fchowner
          }
        }
      }

      oner(er)
    })
  }

  [DIRECTORY] (entry, done) {
    const mode = entry.mode & 0o7777 || this.dmode
    const er = this[MKDIR](entry.absolute, mode)
    if (er) {
      this[ONERROR](er, entry)
      done()
      return
    }
    if (entry.mtime && !this.noMtime) {
      try {
        fs.utimesSync(entry.absolute, entry.atime || new Date(), entry.mtime)
      } catch (er) {}
    }
    if (this[DOCHOWN](entry)) {
      try {
        fs.chownSync(entry.absolute, this[UID](entry), this[GID](entry))
      } catch (er) {}
    }
    done()
    entry.resume()
  }

  [MKDIR] (dir, mode) {
    try {
      return mkdir.sync(normPath(dir), {
        uid: this.uid,
        gid: this.gid,
        processUid: this.processUid,
        processGid: this.processGid,
        umask: this.processUmask,
        preserve: this.preservePaths,
        unlink: this.unlink,
        cache: this.dirCache,
        cwd: this.cwd,
        mode: mode,
      })
    } catch (er) {
      return er
    }
  }

  [LINK] (entry, linkpath, link, done) {
    try {
      fs[link + 'Sync'](linkpath, entry.absolute)
      done()
      entry.resume()
    } catch (er) {
      return this[ONERROR](er, entry)
    }
  }
}

Unpack.Sync = UnpackSync
module.exports = Unpack
'use strict'

// tar -u

const hlo = require('./high-level-opt.js')
const r = require('./replace.js')
// just call tar.r with the filter and mtimeCache

module.exports = (opt_, files, cb) => {
  const opt = hlo(opt_)

  if (!opt.file)
    throw new TypeError('file is required')

  if (opt.gzip)
    throw new TypeError('cannot append to compressed archives')

  if (!files || !Array.isArray(files) || !files.length)
    throw new TypeError('no files or directories specified')

  files = Array.from(files)

  mtimeFilter(opt)
  return r(opt, files, cb)
}

const mtimeFilter = opt => {
  const filter = opt.filter

  if (!opt.mtimeCache)
    opt.mtimeCache = new Map()

  opt.filter = filter ? (path, stat) =>
    filter(path, stat) && !(opt.mtimeCache.get(path) > stat.mtime)
    : (path, stat) => !(opt.mtimeCache.get(path) > stat.mtime)
}
'use strict'
module.exports = Base => class extends Base {
  warn (code, message, data = {}) {
    if (this.file)
      data.file = this.file
    if (this.cwd)
      data.cwd = this.cwd
    data.code = message instanceof Error && message.code || code
    data.tarCode = code
    if (!this.strict && data.recoverable !== false) {
      if (message instanceof Error) {
        data = Object.assign(message, data)
        message = message.message
      }
      this.emit('warn', data.tarCode, message, data)
    } else if (message instanceof Error)
      this.emit('error', Object.assign(message, data))
    else
      this.emit('error', Object.assign(new Error(`${code}: ${message}`), data))
  }
}
'use strict'

// When writing files on Windows, translate the characters to their
// 0xf000 higher-encoded versions.

const raw = [
  '|',
  '<',
  '>',
  '?',
  ':',
]

const win = raw.map(char =>
  String.fromCharCode(0xf000 + char.charCodeAt(0)))

const toWin = new Map(raw.map((char, i) => [char, win[i]]))
const toRaw = new Map(win.map((char, i) => [char, raw[i]]))

module.exports = {
  encode: s => raw.reduce((s, c) => s.split(c).join(toWin.get(c)), s),
  decode: s => win.reduce((s, c) => s.split(c).join(toRaw.get(c)), s),
}
'use strict'
const MiniPass = require('minipass')
const Pax = require('./pax.js')
const Header = require('./header.js')
const fs = require('fs')
const path = require('path')
const normPath = require('./normalize-windows-path.js')
const stripSlash = require('./strip-trailing-slashes.js')

const prefixPath = (path, prefix) => {
  if (!prefix)
    return normPath(path)
  path = normPath(path).replace(/^\.(\/|$)/, '')
  return stripSlash(prefix) + '/' + path
}

const maxReadSize = 16 * 1024 * 1024
const PROCESS = Symbol('process')
const FILE = Symbol('file')
const DIRECTORY = Symbol('directory')
const SYMLINK = Symbol('symlink')
const HARDLINK = Symbol('hardlink')
const HEADER = Symbol('header')
const READ = Symbol('read')
const LSTAT = Symbol('lstat')
const ONLSTAT = Symbol('onlstat')
const ONREAD = Symbol('onread')
const ONREADLINK = Symbol('onreadlink')
const OPENFILE = Symbol('openfile')
const ONOPENFILE = Symbol('onopenfile')
const CLOSE = Symbol('close')
const MODE = Symbol('mode')
const AWAITDRAIN = Symbol('awaitDrain')
const ONDRAIN = Symbol('ondrain')
const PREFIX = Symbol('prefix')
const HAD_ERROR = Symbol('hadError')
const warner = require('./warn-mixin.js')
const winchars = require('./winchars.js')
const stripAbsolutePath = require('./strip-absolute-path.js')

const modeFix = require('./mode-fix.js')

const WriteEntry = warner(class WriteEntry extends MiniPass {
  constructor (p, opt) {
    opt = opt || {}
    super(opt)
    if (typeof p !== 'string')
      throw new TypeError('path is required')
    this.path = normPath(p)
    // suppress atime, ctime, uid, gid, uname, gname
    this.portable = !!opt.portable
    // until node has builtin pwnam functions, this'll have to do
    this.myuid = process.getuid && process.getuid() || 0
    this.myuser = process.env.USER || ''
    this.maxReadSize = opt.maxReadSize || maxReadSize
    this.linkCache = opt.linkCache || new Map()
    this.statCache = opt.statCache || new Map()
    this.preservePaths = !!opt.preservePaths
    this.cwd = normPath(opt.cwd || process.cwd())
    this.strict = !!opt.strict
    this.noPax = !!opt.noPax
    this.noMtime = !!opt.noMtime
    this.mtime = opt.mtime || null
    this.prefix = opt.prefix ? normPath(opt.prefix) : null

    this.fd = null
    this.blockLen = null
    this.blockRemain = null
    this.buf = null
    this.offset = null
    this.length = null
    this.pos = null
    this.remain = null

    if (typeof opt.onwarn === 'function')
      this.on('warn', opt.onwarn)

    let pathWarn = false
    if (!this.preservePaths) {
      const [root, stripped] = stripAbsolutePath(this.path)
      if (root) {
        this.path = stripped
        pathWarn = root
      }
    }

    this.win32 = !!opt.win32 || process.platform === 'win32'
    if (this.win32) {
      // force the \ to / normalization, since we might not *actually*
      // be on windows, but want \ to be considered a path separator.
      this.path = winchars.decode(this.path.replace(/\\/g, '/'))
      p = p.replace(/\\/g, '/')
    }

    this.absolute = normPath(opt.absolute || path.resolve(this.cwd, p))

    if (this.path === '')
      this.path = './'

    if (pathWarn) {
      this.warn('TAR_ENTRY_INFO', `stripping ${pathWarn} from absolute path`, {
        entry: this,
        path: pathWarn + this.path,
      })
    }

    if (this.statCache.has(this.absolute))
      this[ONLSTAT](this.statCache.get(this.absolute))
    else
      this[LSTAT]()
  }

  emit (ev, ...data) {
    if (ev === 'error')
      this[HAD_ERROR] = true
    return super.emit(ev, ...data)
  }

  [LSTAT] () {
    fs.lstat(this.absolute, (er, stat) => {
      if (er)
        return this.emit('error', er)
      this[ONLSTAT](stat)
    })
  }

  [ONLSTAT] (stat) {
    this.statCache.set(this.absolute, stat)
    this.stat = stat
    if (!stat.isFile())
      stat.size = 0
    this.type = getType(stat)
    this.emit('stat', stat)
    this[PROCESS]()
  }

  [PROCESS] () {
    switch (this.type) {
      case 'File': return this[FILE]()
      case 'Directory': return this[DIRECTORY]()
      case 'SymbolicLink': return this[SYMLINK]()
      // unsupported types are ignored.
      default: return this.end()
    }
  }

  [MODE] (mode) {
    return modeFix(mode, this.type === 'Directory', this.portable)
  }

  [PREFIX] (path) {
    return prefixPath(path, this.prefix)
  }

  [HEADER] () {
    if (this.type === 'Directory' && this.portable)
      this.noMtime = true

    this.header = new Header({
      path: this[PREFIX](this.path),
      // only apply the prefix to hard links.
      linkpath: this.type === 'Link' ? this[PREFIX](this.linkpath)
      : this.linkpath,
      // only the permissions and setuid/setgid/sticky bitflags
      // not the higher-order bits that specify file type
      mode: this[MODE](this.stat.mode),
      uid: this.portable ? null : this.stat.uid,
      gid: this.portable ? null : this.stat.gid,
      size: this.stat.size,
      mtime: this.noMtime ? null : this.mtime || this.stat.mtime,
      type: this.type,
      uname: this.portable ? null :
      this.stat.uid === this.myuid ? this.myuser : '',
      atime: this.portable ? null : this.stat.atime,
      ctime: this.portable ? null : this.stat.ctime,
    })

    if (this.header.encode() && !this.noPax) {
      super.write(new Pax({
        atime: this.portable ? null : this.header.atime,
        ctime: this.portable ? null : this.header.ctime,
        gid: this.portable ? null : this.header.gid,
        mtime: this.noMtime ? null : this.mtime || this.header.mtime,
        path: this[PREFIX](this.path),
        linkpath: this.type === 'Link' ? this[PREFIX](this.linkpath)
        : this.linkpath,
        size: this.header.size,
        uid: this.portable ? null : this.header.uid,
        uname: this.portable ? null : this.header.uname,
        dev: this.portable ? null : this.stat.dev,
        ino: this.portable ? null : this.stat.ino,
        nlink: this.portable ? null : this.stat.nlink,
      }).encode())
    }
    super.write(this.header.block)
  }

  [DIRECTORY] () {
    if (this.path.substr(-1) !== '/')
      this.path += '/'
    this.stat.size = 0
    this[HEADER]()
    this.end()
  }

  [SYMLINK] () {
    fs.readlink(this.absolute, (er, linkpath) => {
      if (er)
        return this.emit('error', er)
      this[ONREADLINK](linkpath)
    })
  }

  [ONREADLINK] (linkpath) {
    this.linkpath = normPath(linkpath)
    this[HEADER]()
    this.end()
  }

  [HARDLINK] (linkpath) {
    this.type = 'Link'
    this.linkpath = normPath(path.relative(this.cwd, linkpath))
    this.stat.size = 0
    this[HEADER]()
    this.end()
  }

  [FILE] () {
    if (this.stat.nlink > 1) {
      const linkKey = this.stat.dev + ':' + this.stat.ino
      if (this.linkCache.has(linkKey)) {
        const linkpath = this.linkCache.get(linkKey)
        if (linkpath.indexOf(this.cwd) === 0)
          return this[HARDLINK](linkpath)
      }
      this.linkCache.set(linkKey, this.absolute)
    }

    this[HEADER]()
    if (this.stat.size === 0)
      return this.end()

    this[OPENFILE]()
  }

  [OPENFILE] () {
    fs.open(this.absolute, 'r', (er, fd) => {
      if (er)
        return this.emit('error', er)
      this[ONOPENFILE](fd)
    })
  }

  [ONOPENFILE] (fd) {
    this.fd = fd
    if (this[HAD_ERROR])
      return this[CLOSE]()

    this.blockLen = 512 * Math.ceil(this.stat.size / 512)
    this.blockRemain = this.blockLen
    const bufLen = Math.min(this.blockLen, this.maxReadSize)
    this.buf = Buffer.allocUnsafe(bufLen)
    this.offset = 0
    this.pos = 0
    this.remain = this.stat.size
    this.length = this.buf.length
    this[READ]()
  }

  [READ] () {
    const { fd, buf, offset, length, pos } = this
    fs.read(fd, buf, offset, length, pos, (er, bytesRead) => {
      if (er) {
        // ignoring the error from close(2) is a bad practice, but at
        // this point we already have an error, don't need another one
        return this[CLOSE](() => this.emit('error', er))
      }
      this[ONREAD](bytesRead)
    })
  }

  [CLOSE] (cb) {
    fs.close(this.fd, cb)
  }

  [ONREAD] (bytesRead) {
    if (bytesRead <= 0 && this.remain > 0) {
      const er = new Error('encountered unexpected EOF')
      er.path = this.absolute
      er.syscall = 'read'
      er.code = 'EOF'
      return this[CLOSE](() => this.emit('error', er))
    }

    if (bytesRead > this.remain) {
      const er = new Error('did not encounter expected EOF')
      er.path = this.absolute
      er.syscall = 'read'
      er.code = 'EOF'
      return this[CLOSE](() => this.emit('error', er))
    }

    // null out the rest of the buffer, if we could fit the block padding
    // at the end of this loop, we've incremented bytesRead and this.remain
    // to be incremented up to the blockRemain level, as if we had expected
    // to get a null-padded file, and read it until the end.  then we will
    // decrement both remain and blockRemain by bytesRead, and know that we
    // reached the expected EOF, without any null buffer to append.
    if (bytesRead === this.remain) {
      for (let i = bytesRead; i < this.length && bytesRead < this.blockRemain; i++) {
        this.buf[i + this.offset] = 0
        bytesRead++
        this.remain++
      }
    }

    const writeBuf = this.offset === 0 && bytesRead === this.buf.length ?
      this.buf : this.buf.slice(this.offset, this.offset + bytesRead)

    const flushed = this.write(writeBuf)
    if (!flushed)
      this[AWAITDRAIN](() => this[ONDRAIN]())
    else
      this[ONDRAIN]()
  }

  [AWAITDRAIN] (cb) {
    this.once('drain', cb)
  }

  write (writeBuf) {
    if (this.blockRemain < writeBuf.length) {
      const er = new Error('writing more data than expected')
      er.path = this.absolute
      return this.emit('error', er)
    }
    this.remain -= writeBuf.length
    this.blockRemain -= writeBuf.length
    this.pos += writeBuf.length
    this.offset += writeBuf.length
    return super.write(writeBuf)
  }

  [ONDRAIN] () {
    if (!this.remain) {
      if (this.blockRemain)
        super.write(Buffer.alloc(this.blockRemain))
      return this[CLOSE](er => er ? this.emit('error', er) : this.end())
    }

    if (this.offset >= this.length) {
      // if we only have a smaller bit left to read, alloc a smaller buffer
      // otherwise, keep it the same length it was before.
      this.buf = Buffer.allocUnsafe(Math.min(this.blockRemain, this.buf.length))
      this.offset = 0
    }
    this.length = this.buf.length - this.offset
    this[READ]()
  }
})

class WriteEntrySync extends WriteEntry {
  [LSTAT] () {
    this[ONLSTAT](fs.lstatSync(this.absolute))
  }

  [SYMLINK] () {
    this[ONREADLINK](fs.readlinkSync(this.absolute))
  }

  [OPENFILE] () {
    this[ONOPENFILE](fs.openSync(this.absolute, 'r'))
  }

  [READ] () {
    let threw = true
    try {
      const { fd, buf, offset, length, pos } = this
      const bytesRead = fs.readSync(fd, buf, offset, length, pos)
      this[ONREAD](bytesRead)
      threw = false
    } finally {
      // ignoring the error from close(2) is a bad practice, but at
      // this point we already have an error, don't need another one
      if (threw) {
        try {
          this[CLOSE](() => {})
        } catch (er) {}
      }
    }
  }

  [AWAITDRAIN] (cb) {
    cb()
  }

  [CLOSE] (cb) {
    fs.closeSync(this.fd)
    cb()
  }
}

const WriteEntryTar = warner(class WriteEntryTar extends MiniPass {
  constructor (readEntry, opt) {
    opt = opt || {}
    super(opt)
    this.preservePaths = !!opt.preservePaths
    this.portable = !!opt.portable
    this.strict = !!opt.strict
    this.noPax = !!opt.noPax
    this.noMtime = !!opt.noMtime

    this.readEntry = readEntry
    this.type = readEntry.type
    if (this.type === 'Directory' && this.portable)
      this.noMtime = true

    this.prefix = opt.prefix || null

    this.path = normPath(readEntry.path)
    this.mode = this[MODE](readEntry.mode)
    this.uid = this.portable ? null : readEntry.uid
    this.gid = this.portable ? null : readEntry.gid
    this.uname = this.portable ? null : readEntry.uname
    this.gname = this.portable ? null : readEntry.gname
    this.size = readEntry.size
    this.mtime = this.noMtime ? null : opt.mtime || readEntry.mtime
    this.atime = this.portable ? null : readEntry.atime
    this.ctime = this.portable ? null : readEntry.ctime
    this.linkpath = normPath(readEntry.linkpath)

    if (typeof opt.onwarn === 'function')
      this.on('warn', opt.onwarn)

    let pathWarn = false
    if (!this.preservePaths) {
      const [root, stripped] = stripAbsolutePath(this.path)
      if (root) {
        this.path = stripped
        pathWarn = root
      }
    }

    this.remain = readEntry.size
    this.blockRemain = readEntry.startBlockSize

    this.header = new Header({
      path: this[PREFIX](this.path),
      linkpath: this.type === 'Link' ? this[PREFIX](this.linkpath)
      : this.linkpath,
      // only the permissions and setuid/setgid/sticky bitflags
      // not the higher-order bits that specify file type
      mode: this.mode,
      uid: this.portable ? null : this.uid,
      gid: this.portable ? null : this.gid,
      size: this.size,
      mtime: this.noMtime ? null : this.mtime,
      type: this.type,
      uname: this.portable ? null : this.uname,
      atime: this.portable ? null : this.atime,
      ctime: this.portable ? null : this.ctime,
    })

    if (pathWarn) {
      this.warn('TAR_ENTRY_INFO', `stripping ${pathWarn} from absolute path`, {
        entry: this,
        path: pathWarn + this.path,
      })
    }

    if (this.header.encode() && !this.noPax) {
      super.write(new Pax({
        atime: this.portable ? null : this.atime,
        ctime: this.portable ? null : this.ctime,
        gid: this.portable ? null : this.gid,
        mtime: this.noMtime ? null : this.mtime,
        path: this[PREFIX](this.path),
        linkpath: this.type === 'Link' ? this[PREFIX](this.linkpath)
        : this.linkpath,
        size: this.size,
        uid: this.portable ? null : this.uid,
        uname: this.portable ? null : this.uname,
        dev: this.portable ? null : this.readEntry.dev,
        ino: this.portable ? null : this.readEntry.ino,
        nlink: this.portable ? null : this.readEntry.nlink,
      }).encode())
    }

    super.write(this.header.block)
    readEntry.pipe(this)
  }

  [PREFIX] (path) {
    return prefixPath(path, this.prefix)
  }

  [MODE] (mode) {
    return modeFix(mode, this.type === 'Directory', this.portable)
  }

  write (data) {
    const writeLen = data.length
    if (writeLen > this.blockRemain)
      throw new Error('writing more to entry than is appropriate')
    this.blockRemain -= writeLen
    return super.write(data)
  }

  end () {
    if (this.blockRemain)
      super.write(Buffer.alloc(this.blockRemain))
    return super.end()
  }
})

WriteEntry.Sync = WriteEntrySync
WriteEntry.Tar = WriteEntryTar

const getType = stat =>
  stat.isFile() ? 'File'
  : stat.isDirectory() ? 'Directory'
  : stat.isSymbolicLink() ? 'SymbolicLink'
  : 'Unsupported'

module.exports = WriteEntry
The MIT License (MIT)

Copyright (c) 2014 Mathias Buus

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

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

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.var chownr = require('chownr')
var tar = require('tar-stream')
var pump = require('pump')
var mkdirp = require('mkdirp-classic')
var fs = require('fs')
var path = require('path')
var os = require('os')

var win32 = os.platform() === 'win32'

var noop = function () {}

var echo = function (name) {
  return name
}

var normalize = !win32 ? echo : function (name) {
  return name.replace(/\\/g, '/').replace(/[:?<>|]/g, '_')
}

var statAll = function (fs, stat, cwd, ignore, entries, sort) {
  var queue = entries || ['.']

  return function loop (callback) {
    if (!queue.length) return callback()
    var next = queue.shift()
    var nextAbs = path.join(cwd, next)

    stat.call(fs, nextAbs, function (err, stat) {
      if (err) return callback(err)

      if (!stat.isDirectory()) return callback(null, next, stat)

      fs.readdir(nextAbs, function (err, files) {
        if (err) return callback(err)

        if (sort) files.sort()
        for (var i = 0; i < files.length; i++) {
          if (!ignore(path.join(cwd, next, files[i]))) queue.push(path.join(next, files[i]))
        }

        callback(null, next, stat)
      })
    })
  }
}

var strip = function (map, level) {
  return function (header) {
    header.name = header.name.split('/').slice(level).join('/')

    var linkname = header.linkname
    if (linkname && (header.type === 'link' || path.isAbsolute(linkname))) {
      header.linkname = linkname.split('/').slice(level).join('/')
    }

    return map(header)
  }
}

exports.pack = function (cwd, opts) {
  if (!cwd) cwd = '.'
  if (!opts) opts = {}

  var xfs = opts.fs || fs
  var ignore = opts.ignore || opts.filter || noop
  var map = opts.map || noop
  var mapStream = opts.mapStream || echo
  var statNext = statAll(xfs, opts.dereference ? xfs.stat : xfs.lstat, cwd, ignore, opts.entries, opts.sort)
  var strict = opts.strict !== false
  var umask = typeof opts.umask === 'number' ? ~opts.umask : ~processUmask()
  var dmode = typeof opts.dmode === 'number' ? opts.dmode : 0
  var fmode = typeof opts.fmode === 'number' ? opts.fmode : 0
  var pack = opts.pack || tar.pack()
  var finish = opts.finish || noop

  if (opts.strip) map = strip(map, opts.strip)

  if (opts.readable) {
    dmode |= parseInt(555, 8)
    fmode |= parseInt(444, 8)
  }
  if (opts.writable) {
    dmode |= parseInt(333, 8)
    fmode |= parseInt(222, 8)
  }

  var onsymlink = function (filename, header) {
    xfs.readlink(path.join(cwd, filename), function (err, linkname) {
      if (err) return pack.destroy(err)
      header.linkname = normalize(linkname)
      pack.entry(header, onnextentry)
    })
  }

  var onstat = function (err, filename, stat) {
    if (err) return pack.destroy(err)
    if (!filename) {
      if (opts.finalize !== false) pack.finalize()
      return finish(pack)
    }

    if (stat.isSocket()) return onnextentry() // tar does not support sockets...

    var header = {
      name: normalize(filename),
      mode: (stat.mode | (stat.isDirectory() ? dmode : fmode)) & umask,
      mtime: stat.mtime,
      size: stat.size,
      type: 'file',
      uid: stat.uid,
      gid: stat.gid
    }

    if (stat.isDirectory()) {
      header.size = 0
      header.type = 'directory'
      header = map(header) || header
      return pack.entry(header, onnextentry)
    }

    if (stat.isSymbolicLink()) {
      header.size = 0
      header.type = 'symlink'
      header = map(header) || header
      return onsymlink(filename, header)
    }

    // TODO: add fifo etc...

    header = map(header) || header

    if (!stat.isFile()) {
      if (strict) return pack.destroy(new Error('unsupported type for ' + filename))
      return onnextentry()
    }

    var entry = pack.entry(header, onnextentry)
    if (!entry) return

    var rs = mapStream(xfs.createReadStream(path.join(cwd, filename), { start: 0, end: header.size > 0 ? header.size - 1 : header.size }), header)

    rs.on('error', function (err) { // always forward errors on destroy
      entry.destroy(err)
    })

    pump(rs, entry)
  }

  var onnextentry = function (err) {
    if (err) return pack.destroy(err)
    statNext(onstat)
  }

  onnextentry()

  return pack
}

var head = function (list) {
  return list.length ? list[list.length - 1] : null
}

var processGetuid = function () {
  return process.getuid ? process.getuid() : -1
}

var processUmask = function () {
  return process.umask ? process.umask() : 0
}

exports.extract = function (cwd, opts) {
  if (!cwd) cwd = '.'
  if (!opts) opts = {}

  var xfs = opts.fs || fs
  var ignore = opts.ignore || opts.filter || noop
  var map = opts.map || noop
  var mapStream = opts.mapStream || echo
  var own = opts.chown !== false && !win32 && processGetuid() === 0
  var extract = opts.extract || tar.extract()
  var stack = []
  var now = new Date()
  var umask = typeof opts.umask === 'number' ? ~opts.umask : ~processUmask()
  var dmode = typeof opts.dmode === 'number' ? opts.dmode : 0
  var fmode = typeof opts.fmode === 'number' ? opts.fmode : 0
  var strict = opts.strict !== false

  if (opts.strip) map = strip(map, opts.strip)

  if (opts.readable) {
    dmode |= parseInt(555, 8)
    fmode |= parseInt(444, 8)
  }
  if (opts.writable) {
    dmode |= parseInt(333, 8)
    fmode |= parseInt(222, 8)
  }

  var utimesParent = function (name, cb) { // we just set the mtime on the parent dir again everytime we write an entry
    var top
    while ((top = head(stack)) && name.slice(0, top[0].length) !== top[0]) stack.pop()
    if (!top) return cb()
    xfs.utimes(top[0], now, top[1], cb)
  }

  var utimes = function (name, header, cb) {
    if (opts.utimes === false) return cb()

    if (header.type === 'directory') return xfs.utimes(name, now, header.mtime, cb)
    if (header.type === 'symlink') return utimesParent(name, cb) // TODO: how to set mtime on link?

    xfs.utimes(name, now, header.mtime, function (err) {
      if (err) return cb(err)
      utimesParent(name, cb)
    })
  }

  var chperm = function (name, header, cb) {
    var link = header.type === 'symlink'

    /* eslint-disable node/no-deprecated-api */
    var chmod = link ? xfs.lchmod : xfs.chmod
    var chown = link ? xfs.lchown : xfs.chown
    /* eslint-enable node/no-deprecated-api */

    if (!chmod) return cb()

    var mode = (header.mode | (header.type === 'directory' ? dmode : fmode)) & umask

    if (chown && own) chown.call(xfs, name, header.uid, header.gid, onchown)
    else onchown(null)

    function onchown (err) {
      if (err) return cb(err)
      if (!chmod) return cb()
      chmod.call(xfs, name, mode, cb)
    }
  }

  extract.on('entry', function (header, stream, next) {
    header = map(header) || header
    header.name = normalize(header.name)
    var name = path.join(cwd, path.join('/', header.name))

    if (ignore(name, header)) {
      stream.resume()
      return next()
    }

    var stat = function (err) {
      if (err) return next(err)
      utimes(name, header, function (err) {
        if (err) return next(err)
        if (win32) return next()
        chperm(name, header, next)
      })
    }

    var onsymlink = function () {
      if (win32) return next() // skip symlinks on win for now before it can be tested
      xfs.unlink(name, function () {
        xfs.symlink(header.linkname, name, stat)
      })
    }

    var onlink = function () {
      if (win32) return next() // skip links on win for now before it can be tested
      xfs.unlink(name, function () {
        var srcpath = path.join(cwd, path.join('/', header.linkname))

        xfs.link(srcpath, name, function (err) {
          if (err && err.code === 'EPERM' && opts.hardlinkAsFilesFallback) {
            stream = xfs.createReadStream(srcpath)
            return onfile()
          }

          stat(err)
        })
      })
    }

    var onfile = function () {
      var ws = xfs.createWriteStream(name)
      var rs = mapStream(stream, header)

      ws.on('error', function (err) { // always forward errors on destroy
        rs.destroy(err)
      })

      pump(rs, ws, function (err) {
        if (err) return next(err)
        ws.on('close', stat)
      })
    }

    if (header.type === 'directory') {
      stack.push([name, header.mtime])
      return mkdirfix(name, {
        fs: xfs, own: own, uid: header.uid, gid: header.gid
      }, stat)
    }

    var dir = path.dirname(name)

    validate(xfs, dir, path.join(cwd, '.'), function (err, valid) {
      if (err) return next(err)
      if (!valid) return next(new Error(dir + ' is not a valid path'))

      mkdirfix(dir, {
        fs: xfs, own: own, uid: header.uid, gid: header.gid
      }, function (err) {
        if (err) return next(err)

        switch (header.type) {
          case 'file': return onfile()
          case 'link': return onlink()
          case 'symlink': return onsymlink()
        }

        if (strict) return next(new Error('unsupported type for ' + name + ' (' + header.type + ')'))

        stream.resume()
        next()
      })
    })
  })

  if (opts.finish) extract.on('finish', opts.finish)

  return extract
}

function validate (fs, name, root, cb) {
  if (name === root) return cb(null, true)
  fs.lstat(name, function (err, st) {
    if (err && err.code !== 'ENOENT') return cb(err)
    if (err || st.isDirectory()) return validate(fs, path.join(name, '..'), root, cb)
    cb(null, false)
  })
}

function mkdirfix (name, opts, cb) {
  mkdirp(name, { fs: opts.fs }, function (err, made) {
    if (!err && made && opts.own) {
      chownr(made, opts.uid, opts.gid, cb)
    } else {
      cb(err)
    }
  })
}
{
  "name": "tar-fs",
  "version": "2.1.1",
  "description": "filesystem bindings for tar-stream",
  "dependencies": {
    "chownr": "^1.1.1",
    "mkdirp-classic": "^0.5.2",
    "pump": "^3.0.0",
    "tar-stream": "^2.1.4"
  },
  "devDependencies": {
    "rimraf": "^2.6.3",
    "standard": "^13.0.1",
    "tape": "^4.9.2"
  },
  "homepage": "https://github.com/mafintosh/tar-fs",
  "main": "index.js",
  "directories": {
    "test": "test"
  },
  "author": "Mathias Buus",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/mafintosh/tar-fs.git"
  }
}The MIT License (MIT)

Copyright (c) 2014 Mathias Buus

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

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

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

var Writable = require('readable-stream').Writable
var PassThrough = require('readable-stream').PassThrough

var noop = function () {}

var overflow = function (size) {
  size &= 511
  return size && 512 - size
}

var emptyStream = function (self, offset) {
  var s = new Source(self, offset)
  s.end()
  return s
}

var mixinPax = function (header, pax) {
  if (pax.path) header.name = pax.path
  if (pax.linkpath) header.linkname = pax.linkpath
  if (pax.size) header.size = parseInt(pax.size, 10)
  header.pax = pax
  return header
}

var Source = function (self, offset) {
  this._parent = self
  this.offset = offset
  PassThrough.call(this, { autoDestroy: false })
}

util.inherits(Source, PassThrough)

Source.prototype.destroy = function (err) {
  this._parent.destroy(err)
}

var Extract = function (opts) {
  if (!(this instanceof Extract)) return new Extract(opts)
  Writable.call(this, opts)

  opts = opts || {}

  this._offset = 0
  this._buffer = bl()
  this._missing = 0
  this._partial = false
  this._onparse = noop
  this._header = null
  this._stream = null
  this._overflow = null
  this._cb = null
  this._locked = false
  this._destroyed = false
  this._pax = null
  this._paxGlobal = null
  this._gnuLongPath = null
  this._gnuLongLinkPath = null

  var self = this
  var b = self._buffer

  var oncontinue = function () {
    self._continue()
  }

  var onunlock = function (err) {
    self._locked = false
    if (err) return self.destroy(err)
    if (!self._stream) oncontinue()
  }

  var onstreamend = function () {
    self._stream = null
    var drain = overflow(self._header.size)
    if (drain) self._parse(drain, ondrain)
    else self._parse(512, onheader)
    if (!self._locked) oncontinue()
  }

  var ondrain = function () {
    self._buffer.consume(overflow(self._header.size))
    self._parse(512, onheader)
    oncontinue()
  }

  var onpaxglobalheader = function () {
    var size = self._header.size
    self._paxGlobal = headers.decodePax(b.slice(0, size))
    b.consume(size)
    onstreamend()
  }

  var onpaxheader = function () {
    var size = self._header.size
    self._pax = headers.decodePax(b.slice(0, size))
    if (self._paxGlobal) self._pax = Object.assign({}, self._paxGlobal, self._pax)
    b.consume(size)
    onstreamend()
  }

  var ongnulongpath = function () {
    var size = self._header.size
    this._gnuLongPath = headers.decodeLongPath(b.slice(0, size), opts.filenameEncoding)
    b.consume(size)
    onstreamend()
  }

  var ongnulonglinkpath = function () {
    var size = self._header.size
    this._gnuLongLinkPath = headers.decodeLongPath(b.slice(0, size), opts.filenameEncoding)
    b.consume(size)
    onstreamend()
  }

  var onheader = function () {
    var offset = self._offset
    var header
    try {
      header = self._header = headers.decode(b.slice(0, 512), opts.filenameEncoding, opts.allowUnknownFormat)
    } catch (err) {
      self.emit('error', err)
    }
    b.consume(512)

    if (!header) {
      self._parse(512, onheader)
      oncontinue()
      return
    }
    if (header.type === 'gnu-long-path') {
      self._parse(header.size, ongnulongpath)
      oncontinue()
      return
    }
    if (header.type === 'gnu-long-link-path') {
      self._parse(header.size, ongnulonglinkpath)
      oncontinue()
      return
    }
    if (header.type === 'pax-global-header') {
      self._parse(header.size, onpaxglobalheader)
      oncontinue()
      return
    }
    if (header.type === 'pax-header') {
      self._parse(header.size, onpaxheader)
      oncontinue()
      return
    }

    if (self._gnuLongPath) {
      header.name = self._gnuLongPath
      self._gnuLongPath = null
    }

    if (self._gnuLongLinkPath) {
      header.linkname = self._gnuLongLinkPath
      self._gnuLongLinkPath = null
    }

    if (self._pax) {
      self._header = header = mixinPax(header, self._pax)
      self._pax = null
    }

    self._locked = true

    if (!header.size || header.type === 'directory') {
      self._parse(512, onheader)
      self.emit('entry', header, emptyStream(self, offset), onunlock)
      return
    }

    self._stream = new Source(self, offset)

    self.emit('entry', header, self._stream, onunlock)
    self._parse(header.size, onstreamend)
    oncontinue()
  }

  this._onheader = onheader
  this._parse(512, onheader)
}

util.inherits(Extract, Writable)

Extract.prototype.destroy = function (err) {
  if (this._destroyed) return
  this._destroyed = true

  if (err) this.emit('error', err)
  this.emit('close')
  if (this._stream) this._stream.emit('close')
}

Extract.prototype._parse = function (size, onparse) {
  if (this._destroyed) return
  this._offset += size
  this._missing = size
  if (onparse === this._onheader) this._partial = false
  this._onparse = onparse
}

Extract.prototype._continue = function () {
  if (this._destroyed) return
  var cb = this._cb
  this._cb = noop
  if (this._overflow) this._write(this._overflow, undefined, cb)
  else cb()
}

Extract.prototype._write = function (data, enc, cb) {
  if (this._destroyed) return

  var s = this._stream
  var b = this._buffer
  var missing = this._missing
  if (data.length) this._partial = true

  // we do not reach end-of-chunk now. just forward it

  if (data.length < missing) {
    this._missing -= data.length
    this._overflow = null
    if (s) return s.write(data, cb)
    b.append(data)
    return cb()
  }

  // end-of-chunk. the parser should call cb.

  this._cb = cb
  this._missing = 0

  var overflow = null
  if (data.length > missing) {
    overflow = data.slice(missing)
    data = data.slice(0, missing)
  }

  if (s) s.end(data)
  else b.append(data)

  this._overflow = overflow
  this._onparse()
}

Extract.prototype._final = function (cb) {
  if (this._partial) return this.destroy(new Error('Unexpected end of data'))
  cb()
}

module.exports = Extract
var alloc = Buffer.alloc

var ZEROS = '0000000000000000000'
var SEVENS = '7777777777777777777'
var ZERO_OFFSET = '0'.charCodeAt(0)
var USTAR_MAGIC = Buffer.from('ustar\x00', 'binary')
var USTAR_VER = Buffer.from('00', 'binary')
var GNU_MAGIC = Buffer.from('ustar\x20', 'binary')
var GNU_VER = Buffer.from('\x20\x00', 'binary')
var MASK = parseInt('7777', 8)
var MAGIC_OFFSET = 257
var VERSION_OFFSET = 263

var clamp = function (index, len, defaultValue) {
  if (typeof index !== 'number') return defaultValue
  index = ~~index // Coerce to integer.
  if (index >= len) return len
  if (index >= 0) return index
  index += len
  if (index >= 0) return index
  return 0
}

var toType = function (flag) {
  switch (flag) {
    case 0:
      return 'file'
    case 1:
      return 'link'
    case 2:
      return 'symlink'
    case 3:
      return 'character-device'
    case 4:
      return 'block-device'
    case 5:
      return 'directory'
    case 6:
      return 'fifo'
    case 7:
      return 'contiguous-file'
    case 72:
      return 'pax-header'
    case 55:
      return 'pax-global-header'
    case 27:
      return 'gnu-long-link-path'
    case 28:
    case 30:
      return 'gnu-long-path'
  }

  return null
}

var toTypeflag = function (flag) {
  switch (flag) {
    case 'file':
      return 0
    case 'link':
      return 1
    case 'symlink':
      return 2
    case 'character-device':
      return 3
    case 'block-device':
      return 4
    case 'directory':
      return 5
    case 'fifo':
      return 6
    case 'contiguous-file':
      return 7
    case 'pax-header':
      return 72
  }

  return 0
}

var indexOf = function (block, num, offset, end) {
  for (; offset < end; offset++) {
    if (block[offset] === num) return offset
  }
  return end
}

var cksum = function (block) {
  var sum = 8 * 32
  for (var i = 0; i < 148; i++) sum += block[i]
  for (var j = 156; j < 512; j++) sum += block[j]
  return sum
}

var encodeOct = function (val, n) {
  val = val.toString(8)
  if (val.length > n) return SEVENS.slice(0, n) + ' '
  else return ZEROS.slice(0, n - val.length) + val + ' '
}

/* Copied from the node-tar repo and modified to meet
 * tar-stream coding standard.
 *
 * Source: https://github.com/npm/node-tar/blob/51b6627a1f357d2eb433e7378e5f05e83b7aa6cd/lib/header.js#L349
 */
function parse256 (buf) {
  // first byte MUST be either 80 or FF
  // 80 for positive, FF for 2's comp
  var positive
  if (buf[0] === 0x80) positive = true
  else if (buf[0] === 0xFF) positive = false
  else return null

  // build up a base-256 tuple from the least sig to the highest
  var tuple = []
  for (var i = buf.length - 1; i > 0; i--) {
    var byte = buf[i]
    if (positive) tuple.push(byte)
    else tuple.push(0xFF - byte)
  }

  var sum = 0
  var l = tuple.length
  for (i = 0; i < l; i++) {
    sum += tuple[i] * Math.pow(256, i)
  }

  return positive ? sum : -1 * sum
}

var decodeOct = function (val, offset, length) {
  val = val.slice(offset, offset + length)
  offset = 0

  // If prefixed with 0x80 then parse as a base-256 integer
  if (val[offset] & 0x80) {
    return parse256(val)
  } else {
    // Older versions of tar can prefix with spaces
    while (offset < val.length && val[offset] === 32) offset++
    var end = clamp(indexOf(val, 32, offset, val.length), val.length, val.length)
    while (offset < end && val[offset] === 0) offset++
    if (end === offset) return 0
    return parseInt(val.slice(offset, end).toString(), 8)
  }
}

var decodeStr = function (val, offset, length, encoding) {
  return val.slice(offset, indexOf(val, 0, offset, offset + length)).toString(encoding)
}

var addLength = function (str) {
  var len = Buffer.byteLength(str)
  var digits = Math.floor(Math.log(len) / Math.log(10)) + 1
  if (len + digits >= Math.pow(10, digits)) digits++

  return (len + digits) + str
}

exports.decodeLongPath = function (buf, encoding) {
  return decodeStr(buf, 0, buf.length, encoding)
}

exports.encodePax = function (opts) { // TODO: encode more stuff in pax
  var result = ''
  if (opts.name) result += addLength(' path=' + opts.name + '\n')
  if (opts.linkname) result += addLength(' linkpath=' + opts.linkname + '\n')
  var pax = opts.pax
  if (pax) {
    for (var key in pax) {
      result += addLength(' ' + key + '=' + pax[key] + '\n')
    }
  }
  return Buffer.from(result)
}

exports.decodePax = function (buf) {
  var result = {}

  while (buf.length) {
    var i = 0
    while (i < buf.length && buf[i] !== 32) i++
    var len = parseInt(buf.slice(0, i).toString(), 10)
    if (!len) return result

    var b = buf.slice(i + 1, len - 1).toString()
    var keyIndex = b.indexOf('=')
    if (keyIndex === -1) return result
    result[b.slice(0, keyIndex)] = b.slice(keyIndex + 1)

    buf = buf.slice(len)
  }

  return result
}

exports.encode = function (opts) {
  var buf = alloc(512)
  var name = opts.name
  var prefix = ''

  if (opts.typeflag === 5 && name[name.length - 1] !== '/') name += '/'
  if (Buffer.byteLength(name) !== name.length) return null // utf-8

  while (Buffer.byteLength(name) > 100) {
    var i = name.indexOf('/')
    if (i === -1) return null
    prefix += prefix ? '/' + name.slice(0, i) : name.slice(0, i)
    name = name.slice(i + 1)
  }

  if (Buffer.byteLength(name) > 100 || Buffer.byteLength(prefix) > 155) return null
  if (opts.linkname && Buffer.byteLength(opts.linkname) > 100) return null

  buf.write(name)
  buf.write(encodeOct(opts.mode & MASK, 6), 100)
  buf.write(encodeOct(opts.uid, 6), 108)
  buf.write(encodeOct(opts.gid, 6), 116)
  buf.write(encodeOct(opts.size, 11), 124)
  buf.write(encodeOct((opts.mtime.getTime() / 1000) | 0, 11), 136)

  buf[156] = ZERO_OFFSET + toTypeflag(opts.type)

  if (opts.linkname) buf.write(opts.linkname, 157)

  USTAR_MAGIC.copy(buf, MAGIC_OFFSET)
  USTAR_VER.copy(buf, VERSION_OFFSET)
  if (opts.uname) buf.write(opts.uname, 265)
  if (opts.gname) buf.write(opts.gname, 297)
  buf.write(encodeOct(opts.devmajor || 0, 6), 329)
  buf.write(encodeOct(opts.devminor || 0, 6), 337)

  if (prefix) buf.write(prefix, 345)

  buf.write(encodeOct(cksum(buf), 6), 148)

  return buf
}

exports.decode = function (buf, filenameEncoding, allowUnknownFormat) {
  var typeflag = buf[156] === 0 ? 0 : buf[156] - ZERO_OFFSET

  var name = decodeStr(buf, 0, 100, filenameEncoding)
  var mode = decodeOct(buf, 100, 8)
  var uid = decodeOct(buf, 108, 8)
  var gid = decodeOct(buf, 116, 8)
  var size = decodeOct(buf, 124, 12)
  var mtime = decodeOct(buf, 136, 12)
  var type = toType(typeflag)
  var linkname = buf[157] === 0 ? null : decodeStr(buf, 157, 100, filenameEncoding)
  var uname = decodeStr(buf, 265, 32)
  var gname = decodeStr(buf, 297, 32)
  var devmajor = decodeOct(buf, 329, 8)
  var devminor = decodeOct(buf, 337, 8)

  var c = cksum(buf)

  // checksum is still initial value if header was null.
  if (c === 8 * 32) return null

  // valid checksum
  if (c !== decodeOct(buf, 148, 8)) throw new Error('Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?')

  if (USTAR_MAGIC.compare(buf, MAGIC_OFFSET, MAGIC_OFFSET + 6) === 0) {
    // ustar (posix) format.
    // prepend prefix, if present.
    if (buf[345]) name = decodeStr(buf, 345, 155, filenameEncoding) + '/' + name
  } else if (GNU_MAGIC.compare(buf, MAGIC_OFFSET, MAGIC_OFFSET + 6) === 0 &&
             GNU_VER.compare(buf, VERSION_OFFSET, VERSION_OFFSET + 2) === 0) {
    // 'gnu'/'oldgnu' format. Similar to ustar, but has support for incremental and
    // multi-volume tarballs.
  } else {
    if (!allowUnknownFormat) {
      throw new Error('Invalid tar header: unknown format.')
    }
  }

  // to support old tar versions that use trailing / to indicate dirs
  if (typeflag === 0 && name && name[name.length - 1] === '/') typeflag = 5

  return {
    name,
    mode,
    uid,
    gid,
    size,
    mtime: new Date(1000 * mtime),
    type,
    linkname,
    uname,
    gname,
    devmajor,
    devminor
  }
}
exports.extract = require('./extract')
exports.pack = require('./pack')
var constants = require('fs-constants')
var eos = require('end-of-stream')
var inherits = require('inherits')
var alloc = Buffer.alloc

var Readable = require('readable-stream').Readable
var Writable = require('readable-stream').Writable
var StringDecoder = require('string_decoder').StringDecoder

var headers = require('./headers')

var DMODE = parseInt('755', 8)
var FMODE = parseInt('644', 8)

var END_OF_TAR = alloc(1024)

var noop = function () {}

var overflow = function (self, size) {
  size &= 511
  if (size) self.push(END_OF_TAR.slice(0, 512 - size))
}

function modeToType (mode) {
  switch (mode & constants.S_IFMT) {
    case constants.S_IFBLK: return 'block-device'
    case constants.S_IFCHR: return 'character-device'
    case constants.S_IFDIR: return 'directory'
    case constants.S_IFIFO: return 'fifo'
    case constants.S_IFLNK: return 'symlink'
  }

  return 'file'
}

var Sink = function (to) {
  Writable.call(this)
  this.written = 0
  this._to = to
  this._destroyed = false
}

inherits(Sink, Writable)

Sink.prototype._write = function (data, enc, cb) {
  this.written += data.length
  if (this._to.push(data)) return cb()
  this._to._drain = cb
}

Sink.prototype.destroy = function () {
  if (this._destroyed) return
  this._destroyed = true
  this.emit('close')
}

var LinkSink = function () {
  Writable.call(this)
  this.linkname = ''
  this._decoder = new StringDecoder('utf-8')
  this._destroyed = false
}

inherits(LinkSink, Writable)

LinkSink.prototype._write = function (data, enc, cb) {
  this.linkname += this._decoder.write(data)
  cb()
}

LinkSink.prototype.destroy = function () {
  if (this._destroyed) return
  this._destroyed = true
  this.emit('close')
}

var Void = function () {
  Writable.call(this)
  this._destroyed = false
}

inherits(Void, Writable)

Void.prototype._write = function (data, enc, cb) {
  cb(new Error('No body allowed for this entry'))
}

Void.prototype.destroy = function () {
  if (this._destroyed) return
  this._destroyed = true
  this.emit('close')
}

var Pack = function (opts) {
  if (!(this instanceof Pack)) return new Pack(opts)
  Readable.call(this, opts)

  this._drain = noop
  this._finalized = false
  this._finalizing = false
  this._destroyed = false
  this._stream = null
}

inherits(Pack, Readable)

Pack.prototype.entry = function (header, buffer, callback) {
  if (this._stream) throw new Error('already piping an entry')
  if (this._finalized || this._destroyed) return

  if (typeof buffer === 'function') {
    callback = buffer
    buffer = null
  }

  if (!callback) callback = noop

  var self = this

  if (!header.size || header.type === 'symlink') header.size = 0
  if (!header.type) header.type = modeToType(header.mode)
  if (!header.mode) header.mode = header.type === 'directory' ? DMODE : FMODE
  if (!header.uid) header.uid = 0
  if (!header.gid) header.gid = 0
  if (!header.mtime) header.mtime = new Date()

  if (typeof buffer === 'string') buffer = Buffer.from(buffer)
  if (Buffer.isBuffer(buffer)) {
    header.size = buffer.length
    this._encode(header)
    var ok = this.push(buffer)
    overflow(self, header.size)
    if (ok) process.nextTick(callback)
    else this._drain = callback
    return new Void()
  }

  if (header.type === 'symlink' && !header.linkname) {
    var linkSink = new LinkSink()
    eos(linkSink, function (err) {
      if (err) { // stream was closed
        self.destroy()
        return callback(err)
      }

      header.linkname = linkSink.linkname
      self._encode(header)
      callback()
    })

    return linkSink
  }

  this._encode(header)

  if (header.type !== 'file' && header.type !== 'contiguous-file') {
    process.nextTick(callback)
    return new Void()
  }

  var sink = new Sink(this)

  this._stream = sink

  eos(sink, function (err) {
    self._stream = null

    if (err) { // stream was closed
      self.destroy()
      return callback(err)
    }

    if (sink.written !== header.size) { // corrupting tar
      self.destroy()
      return callback(new Error('size mismatch'))
    }

    overflow(self, header.size)
    if (self._finalizing) self.finalize()
    callback()
  })

  return sink
}

Pack.prototype.finalize = function () {
  if (this._stream) {
    this._finalizing = true
    return
  }

  if (this._finalized) return
  this._finalized = true
  this.push(END_OF_TAR)
  this.push(null)
}

Pack.prototype.destroy = function (err) {
  if (this._destroyed) return
  this._destroyed = true

  if (err) this.emit('error', err)
  this.emit('close')
  if (this._stream && this._stream.destroy) this._stream.destroy()
}

Pack.prototype._encode = function (header) {
  if (!header.pax) {
    var buf = headers.encode(header)
    if (buf) {
      this.push(buf)
      return
    }
  }
  this._encodePax(header)
}

Pack.prototype._encodePax = function (header) {
  var paxHeader = headers.encodePax({
    name: header.name,
    linkname: header.linkname,
    pax: header.pax
  })

  var newHeader = {
    name: 'PaxHeader',
    mode: header.mode,
    uid: header.uid,
    gid: header.gid,
    size: paxHeader.length,
    mtime: header.mtime,
    type: 'pax-header',
    linkname: header.linkname && 'PaxHeader',
    uname: header.uname,
    gname: header.gname,
    devmajor: header.devmajor,
    devminor: header.devminor
  }

  this.push(headers.encode(newHeader))
  this.push(paxHeader)
  overflow(this, paxHeader.length)

  newHeader.size = header.size
  newHeader.type = header.type
  this.push(headers.encode(newHeader))
}

Pack.prototype._read = function (n) {
  var drain = this._drain
  this._drain = noop
  drain()
}

module.exports = Pack
{
  "name": "tar-stream",
  "version": "2.2.0",
  "description": "tar-stream is a streaming tar parser and generator and nothing else. It is streams2 and operates purely using streams which means you can easily extract/parse tarballs without ever hitting the file system.",
  "author": "Mathias Buus <mathiasbuus@gmail.com>",
  "dependencies": {
    "bl": "^4.0.3",
    "end-of-stream": "^1.4.1",
    "fs-constants": "^1.0.0",
    "inherits": "^2.0.3",
    "readable-stream": "^3.1.1"
  },
  "devDependencies": {
    "concat-stream": "^2.0.0",
    "standard": "^12.0.1",
    "tape": "^4.9.2"
  },
  "homepage": "https://github.com/mafintosh/tar-stream",
  "main": "index.js",
  "files": [
    "*.js",
    "LICENSE"
  ],
  "directories": {
    "test": "test"
  },
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/mafintosh/tar-stream.git"
  },
  "engines": {
    "node": ">=6"
  }
}const tar = require('tar-stream')
const fs = require('fs')
const path = require('path')
const pipeline = require('pump') // eequire('stream').pipeline

fs.createReadStream('test.tar')
  .pipe(tar.extract())
  .on('entry', function (header, stream, done) {
    console.log(header.name)
    pipeline(stream, fs.createWriteStream(path.join('/tmp', header.name)), done)
  })
The MIT License (MIT)

Copyright (c) 2015 Vincit Oy

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": "tarn",
  "version": "3.0.2",
  "description": "Simple and robust resource pool for node.js",
  "main": "dist/tarn.js",
  "types": "dist/tarn.d.ts",
  "license": "MIT",
  "author": {
    "name": "Sami Koskimäki",
    "email": "sami.koskimaki@vincit.com",
    "url": "https://github.com/koskimas"
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/vincit/tarn.js.git"
  },
  "engines": {
    "node": ">=8.0.0"
  },
  "files": [
    "README.md",
    "LICENSE",
    "dist/*"
  ],
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  },
  "lint-staged": {
    "*.{js,ts}": [
      "prettier --write",
      "git add"
    ]
  },
  "devDependencies": {
    "@types/node": "^10.17.17",
    "@typescript-eslint/eslint-plugin": "^2.21.0",
    "@typescript-eslint/parser": "^2.21.0",
    "bluebird": "^3.7.2",
    "eslint": "^6.8.0",
    "eslint-config-prettier": "^6.10.0",
    "eslint-plugin-prettier": "^3.1.2",
    "expect.js": "^0.3.1",
    "husky": "^1.3.1",
    "lint-staged": "^9.5.0",
    "mocha": "^7.1.0",
    "prettier": "^1.19.1",
    "typescript": "3.8.3"
  },
  "dependencies": {}
}"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const TimeoutError_1 = require("./TimeoutError");
const utils_1 = require("./utils");
class PendingOperation {
    constructor(timeoutMillis) {
        this.timeoutMillis = timeoutMillis;
        this.deferred = utils_1.defer();
        this.possibleTimeoutCause = null;
        this.isRejected = false;
        this.promise = timeout(this.deferred.promise, timeoutMillis).catch(err => {
            if (err instanceof TimeoutError_1.TimeoutError) {
                if (this.possibleTimeoutCause) {
                    err = new TimeoutError_1.TimeoutError(this.possibleTimeoutCause.message);
                }
                else {
                    err = new TimeoutError_1.TimeoutError('operation timed out for an unknown reason');
                }
            }
            this.isRejected = true;
            return Promise.reject(err);
        });
    }
    abort() {
        this.reject(new Error('aborted'));
    }
    reject(err) {
        this.deferred.reject(err);
    }
    resolve(value) {
        this.deferred.resolve(value);
    }
}
exports.PendingOperation = PendingOperation;
function timeout(promise, time) {
    return new Promise((resolve, reject) => {
        const timeoutHandle = setTimeout(() => reject(new TimeoutError_1.TimeoutError()), time);
        promise
            .then(result => {
            clearTimeout(timeoutHandle);
            resolve(result);
        })
            .catch(err => {
            clearTimeout(timeoutHandle);
            reject(err);
        });
    });
}
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const PendingOperation_1 = require("./PendingOperation");
const Resource_1 = require("./Resource");
const utils_1 = require("./utils");
const events_1 = require("events");
const timers_1 = require("timers");
class Pool {
    constructor(opt) {
        this.destroyed = false;
        this.emitter = new events_1.EventEmitter();
        opt = opt || {};
        if (!opt.create) {
            throw new Error('Tarn: opt.create function most be provided');
        }
        if (!opt.destroy) {
            throw new Error('Tarn: opt.destroy function most be provided');
        }
        if (typeof opt.min !== 'number' || opt.min < 0 || opt.min !== Math.round(opt.min)) {
            throw new Error('Tarn: opt.min must be an integer >= 0');
        }
        if (typeof opt.max !== 'number' || opt.max <= 0 || opt.max !== Math.round(opt.max)) {
            throw new Error('Tarn: opt.max must be an integer > 0');
        }
        if (opt.min > opt.max) {
            throw new Error('Tarn: opt.max is smaller than opt.min');
        }
        if (!utils_1.checkOptionalTime(opt.acquireTimeoutMillis)) {
            throw new Error('Tarn: invalid opt.acquireTimeoutMillis ' + JSON.stringify(opt.acquireTimeoutMillis));
        }
        if (!utils_1.checkOptionalTime(opt.createTimeoutMillis)) {
            throw new Error('Tarn: invalid opt.createTimeoutMillis ' + JSON.stringify(opt.createTimeoutMillis));
        }
        if (!utils_1.checkOptionalTime(opt.destroyTimeoutMillis)) {
            throw new Error('Tarn: invalid opt.destroyTimeoutMillis ' + JSON.stringify(opt.destroyTimeoutMillis));
        }
        if (!utils_1.checkOptionalTime(opt.idleTimeoutMillis)) {
            throw new Error('Tarn: invalid opt.idleTimeoutMillis ' + JSON.stringify(opt.idleTimeoutMillis));
        }
        if (!utils_1.checkOptionalTime(opt.reapIntervalMillis)) {
            throw new Error('Tarn: invalid opt.reapIntervalMillis ' + JSON.stringify(opt.reapIntervalMillis));
        }
        if (!utils_1.checkOptionalTime(opt.createRetryIntervalMillis)) {
            throw new Error('Tarn: invalid opt.createRetryIntervalMillis ' +
                JSON.stringify(opt.createRetryIntervalMillis));
        }
        const allowedKeys = {
            create: true,
            validate: true,
            destroy: true,
            log: true,
            min: true,
            max: true,
            acquireTimeoutMillis: true,
            createTimeoutMillis: true,
            destroyTimeoutMillis: true,
            idleTimeoutMillis: true,
            reapIntervalMillis: true,
            createRetryIntervalMillis: true,
            propagateCreateError: true
        };
        for (const key of Object.keys(opt)) {
            if (!allowedKeys[key]) {
                throw new Error(`Tarn: unsupported option opt.${key}`);
            }
        }
        this.creator = opt.create;
        this.destroyer = opt.destroy;
        this.validate = typeof opt.validate === 'function' ? opt.validate : () => true;
        this.log = opt.log || (() => { });
        this.acquireTimeoutMillis = opt.acquireTimeoutMillis || 30000;
        this.createTimeoutMillis = opt.createTimeoutMillis || 30000;
        this.destroyTimeoutMillis = opt.destroyTimeoutMillis || 5000;
        this.idleTimeoutMillis = opt.idleTimeoutMillis || 30000;
        this.reapIntervalMillis = opt.reapIntervalMillis || 1000;
        this.createRetryIntervalMillis = opt.createRetryIntervalMillis || 200;
        this.propagateCreateError = !!opt.propagateCreateError;
        this.min = opt.min;
        this.max = opt.max;
        // All the resources, which are either already acquired or which are
        // considered for being passed to acquire in async validation phase.
        this.used = [];
        // All the resources, which are either just created and free or returned
        // back to pool after using.
        this.free = [];
        this.pendingCreates = [];
        this.pendingAcquires = [];
        this.pendingDestroys = [];
        // When acquire is pending, but also still in validation phase
        this.pendingValidations = [];
        this.destroyed = false;
        this.interval = null;
        this.eventId = 1;
    }
    numUsed() {
        return this.used.length;
    }
    numFree() {
        return this.free.length;
    }
    numPendingAcquires() {
        return this.pendingAcquires.length;
    }
    numPendingValidations() {
        return this.pendingValidations.length;
    }
    numPendingCreates() {
        return this.pendingCreates.length;
    }
    acquire() {
        const eventId = this.eventId++;
        this._executeEventHandlers('acquireRequest', eventId);
        const pendingAcquire = new PendingOperation_1.PendingOperation(this.acquireTimeoutMillis);
        this.pendingAcquires.push(pendingAcquire);
        // If the acquire fails for whatever reason
        // remove it from the pending queue.
        pendingAcquire.promise = pendingAcquire.promise
            .then(resource => {
            this._executeEventHandlers('acquireSuccess', eventId, resource);
            return resource;
        })
            .catch(err => {
            this._executeEventHandlers('acquireFail', eventId, err);
            remove(this.pendingAcquires, pendingAcquire);
            return Promise.reject(err);
        });
        this._tryAcquireOrCreate();
        return pendingAcquire;
    }
    release(resource) {
        this._executeEventHandlers('release', resource);
        for (let i = 0, l = this.used.length; i < l; ++i) {
            const used = this.used[i];
            if (used.resource === resource) {
                this.used.splice(i, 1);
                this.free.push(used.resolve());
                this._tryAcquireOrCreate();
                return true;
            }
        }
        return false;
    }
    isEmpty() {
        return ([
            this.numFree(),
            this.numUsed(),
            this.numPendingAcquires(),
            this.numPendingValidations(),
            this.numPendingCreates()
        ].reduce((total, value) => total + value) === 0);
    }
    /**
     * Reaping cycle.
     */
    check() {
        const timestamp = utils_1.now();
        const newFree = [];
        const minKeep = this.min - this.used.length;
        const maxDestroy = this.free.length - minKeep;
        let numDestroyed = 0;
        this.free.forEach(free => {
            if (utils_1.duration(timestamp, free.timestamp) >= this.idleTimeoutMillis &&
                numDestroyed < maxDestroy) {
                numDestroyed++;
                this._destroy(free.resource);
            }
            else {
                newFree.push(free);
            }
        });
        this.free = newFree;
        // Pool is completely empty, stop reaping.
        // Next .acquire will start reaping interval again.
        if (this.isEmpty()) {
            this._stopReaping();
        }
    }
    destroy() {
        const eventId = this.eventId++;
        this._executeEventHandlers('poolDestroyRequest', eventId);
        this._stopReaping();
        this.destroyed = true;
        // First wait for all the pending creates get ready.
        return utils_1.reflect(Promise.all(this.pendingCreates.map(create => utils_1.reflect(create.promise)))
            .then(() => {
            // eslint-disable-next-line
            return new Promise((resolve, reject) => {
                // poll every 100ms and wait that all validations are ready
                if (this.numPendingValidations() === 0) {
                    resolve();
                    return;
                }
                const interval = setInterval(() => {
                    if (this.numPendingValidations() === 0) {
                        timers_1.clearInterval(interval);
                        resolve();
                    }
                }, 100);
            });
        })
            .then(() => {
            // Wait for all the used resources to be freed.
            return Promise.all(this.used.map(used => utils_1.reflect(used.promise)));
        })
            .then(() => {
            // Abort all pending acquires.
            return Promise.all(this.pendingAcquires.map(acquire => {
                acquire.abort();
                return utils_1.reflect(acquire.promise);
            }));
        })
            .then(() => {
            // Now we can destroy all the freed resources.
            return Promise.all(this.free.map(free => utils_1.reflect(this._destroy(free.resource))));
        })
            .then(() => {
            // Also wait rest of the pending destroys to finish
            return Promise.all(this.pendingDestroys.map(pd => pd.promise));
        })
            .then(() => {
            this.free = [];
            this.pendingAcquires = [];
        })).then(res => {
            this._executeEventHandlers('poolDestroySuccess', eventId);
            this.emitter.removeAllListeners();
            return res;
        });
    }
    on(event, listener) {
        this.emitter.on(event, listener);
    }
    removeListener(event, listener) {
        this.emitter.removeListener(event, listener);
    }
    removeAllListeners(event) {
        this.emitter.removeAllListeners(event);
    }
    /**
     * The most important method that is called always when resources
     * are created / destroyed / acquired / released. In other words
     * every time when resources are moved from used to free or vice
     * versa.
     *
     * Either assigns free resources to pendingAcquires or creates new
     * resources if there is room for it in the pool.
     */
    _tryAcquireOrCreate() {
        if (this.destroyed) {
            return;
        }
        if (this._hasFreeResources()) {
            this._doAcquire();
        }
        else if (this._shouldCreateMoreResources()) {
            this._doCreate();
        }
    }
    _hasFreeResources() {
        return this.free.length > 0;
    }
    _doAcquire() {
        // Acquire as many pending acquires as possible concurrently
        while (this._canAcquire()) {
            // To allow async validation, we actually need to move free resource
            // and pending acquire temporary from their respective arrays and depending
            // on validation result to either leave the free resource to used resources array
            // or destroy the free resource if validation did fail.
            const pendingAcquire = this.pendingAcquires.shift();
            const free = this.free.pop();
            if (free === undefined || pendingAcquire === undefined) {
                const errMessage = 'this.free was empty while trying to acquire resource';
                this.log(`Tarn: ${errMessage}`, 'warn');
                throw new Error(`Internal error, should never happen. ${errMessage}`);
            }
            // Make sure that pendingAcquire that is being validated is not lost and
            // can be freed when pool is destroyed.
            this.pendingValidations.push(pendingAcquire);
            // Must be added here pre-emptively to prevent logic that decides
            // if new resources are created will keep on working correctly.
            this.used.push(free);
            // if acquire fails also pending validation, must be aborted so that pre reserved
            // resource will be returned to free resources immediately
            const abortAbleValidation = new PendingOperation_1.PendingOperation(this.acquireTimeoutMillis);
            // eslint-disable-next-line
            pendingAcquire.promise.catch(err => {
                abortAbleValidation.abort();
            });
            abortAbleValidation.promise
                .catch(err => {
                // There's nothing we can do here but log the error. This would otherwise
                // leak out as an unhandled exception.
                this.log('Tarn: resource validator threw an exception ' + err.stack, 'warn');
                return false;
            })
                .then(validationSuccess => {
                try {
                    if (validationSuccess && !pendingAcquire.isRejected) {
                        // At least one active resource exist, start reaping.
                        this._startReaping();
                        pendingAcquire.resolve(free.resource);
                    }
                    else {
                        remove(this.used, free);
                        // Only destroy the resource if the validation has failed
                        if (!validationSuccess) {
                            this._destroy(free.resource);
                            // Since we destroyed an invalid resource and were not able to fulfill
                            // all the pending acquires, we may need to create new ones or at
                            // least run this acquire loop again to verify it. But not immediately
                            // to prevent starving event loop.
                            setTimeout(() => {
                                this._tryAcquireOrCreate();
                            }, 0);
                        }
                        else {
                            this.free.push(free);
                        }
                        // is acquire was canceled, failed or timed out already
                        // no need to return it to pending queries
                        if (!pendingAcquire.isRejected) {
                            this.pendingAcquires.unshift(pendingAcquire);
                        }
                    }
                }
                finally {
                    remove(this.pendingValidations, pendingAcquire);
                }
            });
            // try to validate
            this._validateResource(free.resource)
                .then(validationSuccess => {
                abortAbleValidation.resolve(validationSuccess);
            })
                .catch(err => {
                abortAbleValidation.reject(err);
            });
        }
    }
    _canAcquire() {
        return this.free.length > 0 && this.pendingAcquires.length > 0;
    }
    _validateResource(resource) {
        try {
            return Promise.resolve(this.validate(resource));
        }
        catch (err) {
            // prevent leaking of sync exception
            return Promise.reject(err);
        }
    }
    _shouldCreateMoreResources() {
        return (this.used.length + this.pendingCreates.length < this.max &&
            this.pendingCreates.length < this.pendingAcquires.length);
    }
    _doCreate() {
        const pendingAcquiresBeforeCreate = this.pendingAcquires.slice();
        const pendingCreate = this._create();
        pendingCreate.promise
            .then(() => {
            // Not returned on purpose.
            this._tryAcquireOrCreate();
            return null;
        })
            .catch(err => {
            if (this.propagateCreateError && this.pendingAcquires.length !== 0) {
                // If propagateCreateError is true, we don't retry the create
                // but reject the first pending acquire immediately. Intentionally
                // use `this.pendingAcquires` instead of `pendingAcquiresBeforeCreate`
                // in case some acquires in pendingAcquiresBeforeCreate have already
                // been resolved.
                this.pendingAcquires[0].reject(err);
            }
            // Save the create error to all pending acquires so that we can use it
            // as the error to reject the acquire if it times out.
            pendingAcquiresBeforeCreate.forEach(pendingAcquire => {
                pendingAcquire.possibleTimeoutCause = err;
            });
            // Not returned on purpose.
            utils_1.delay(this.createRetryIntervalMillis).then(() => this._tryAcquireOrCreate());
        });
    }
    _create() {
        const eventId = this.eventId++;
        this._executeEventHandlers('createRequest', eventId);
        const pendingCreate = new PendingOperation_1.PendingOperation(this.createTimeoutMillis);
        // If an error occurs (likely a create timeout) remove this creation from
        // the list of pending creations so we try to create a new one.
        pendingCreate.promise = pendingCreate.promise.catch(err => {
            if (remove(this.pendingCreates, pendingCreate)) {
                // TODO: figure out more consistent way for different error handlers in next rewrite
                this._executeEventHandlers('createFail', eventId, err);
            }
            throw err;
        });
        this.pendingCreates.push(pendingCreate);
        callbackOrPromise(this.creator)
            .then(resource => {
            if (pendingCreate.isRejected) {
                this.destroyer(resource);
                return null;
            }
            remove(this.pendingCreates, pendingCreate);
            this.free.push(new Resource_1.Resource(resource));
            // Not returned on purpose.
            pendingCreate.resolve(resource);
            this._executeEventHandlers('createSuccess', eventId, resource);
            return null;
        })
            .catch(err => {
            if (pendingCreate.isRejected) {
                return null;
            }
            if (remove(this.pendingCreates, pendingCreate)) {
                this._executeEventHandlers('createFail', eventId, err);
            }
            // Not returned on purpose.
            pendingCreate.reject(err);
            return null;
        });
        return pendingCreate;
    }
    _destroy(resource) {
        const eventId = this.eventId++;
        this._executeEventHandlers('destroyRequest', eventId, resource);
        // this.destroyer can be both synchronous and asynchronous.
        // so we wrap it to promise to get all exceptions through same pipeline
        const pendingDestroy = new PendingOperation_1.PendingOperation(this.destroyTimeoutMillis);
        const retVal = Promise.resolve().then(() => this.destroyer(resource));
        retVal
            .then(() => {
            pendingDestroy.resolve(resource);
        })
            .catch((err) => {
            pendingDestroy.reject(err);
        });
        this.pendingDestroys.push(pendingDestroy);
        // In case of an error there's nothing we can do here but log it.
        return pendingDestroy.promise
            .then(res => {
            this._executeEventHandlers('destroySuccess', eventId, resource);
            return res;
        })
            .catch(err => this._logDestroyerError(eventId, resource, err))
            .then(res => {
            const index = this.pendingDestroys.findIndex(pd => pd === pendingDestroy);
            this.pendingDestroys.splice(index, 1);
            return res;
        });
    }
    _logDestroyerError(eventId, resource, err) {
        this._executeEventHandlers('destroyFail', eventId, resource, err);
        this.log('Tarn: resource destroyer threw an exception ' + err.stack, 'warn');
    }
    _startReaping() {
        if (!this.interval) {
            this._executeEventHandlers('startReaping');
            this.interval = setInterval(() => this.check(), this.reapIntervalMillis);
        }
    }
    _stopReaping() {
        if (this.interval !== null) {
            this._executeEventHandlers('stopReaping');
            timers_1.clearInterval(this.interval);
        }
        this.interval = null;
    }
    _executeEventHandlers(eventName, ...args) {
        const listeners = this.emitter.listeners(eventName);
        // just calling .emit() would stop running rest of the listeners if one them fails
        listeners.forEach(listener => {
            try {
                listener(...args);
            }
            catch (err) {
                // There's nothing we can do here but log the error. This would otherwise
                // leak out as an unhandled exception.
                this.log(`Tarn: event handler "${eventName}" threw an exception ${err.stack}`, 'warn');
            }
        });
    }
}
exports.Pool = Pool;
function remove(arr, item) {
    const idx = arr.indexOf(item);
    if (idx === -1) {
        return false;
    }
    else {
        arr.splice(idx, 1);
        return true;
    }
}
function callbackOrPromise(func) {
    return new Promise((resolve, reject) => {
        const callback = (err, resource) => {
            if (err) {
                reject(err);
            }
            else {
                resolve(resource);
            }
        };
        utils_1.tryPromise(() => func(callback))
            .then(res => {
            // If the result is falsy, we assume that the callback will
            // be called instead of interpreting the falsy value as a
            // result value.
            if (res) {
                resolve(res);
            }
        })
            .catch(err => {
            reject(err);
        });
    });
}
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
class PromiseInspection {
    constructor(args) {
        this._value = args.value;
        this._error = args.error;
    }
    value() {
        return this._value;
    }
    reason() {
        return this._error;
    }
    isRejected() {
        return !!this._error;
    }
    isFulfilled() {
        return !!this._value;
    }
}
exports.PromiseInspection = PromiseInspection;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const utils_1 = require("./utils");
class Resource {
    constructor(resource) {
        this.resource = resource;
        this.resource = resource;
        this.timestamp = utils_1.now();
        this.deferred = utils_1.defer();
    }
    get promise() {
        return this.deferred.promise;
    }
    resolve() {
        this.deferred.resolve(undefined);
        return new Resource(this.resource);
    }
}
exports.Resource = Resource;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
class TimeoutError extends Error {
}
exports.TimeoutError = TimeoutError;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const Pool_1 = require("./Pool");
exports.Pool = Pool_1.Pool;
const TimeoutError_1 = require("./TimeoutError");
exports.TimeoutError = TimeoutError_1.TimeoutError;
module.exports = {
    Pool: Pool_1.Pool,
    TimeoutError: TimeoutError_1.TimeoutError
};
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const PromiseInspection_1 = require("./PromiseInspection");
function defer() {
    let resolve = null;
    let reject = null;
    const promise = new Promise((resolver, rejecter) => {
        resolve = resolver;
        reject = rejecter;
    });
    return {
        promise,
        resolve,
        reject
    };
}
exports.defer = defer;
function now() {
    return Date.now();
}
exports.now = now;
function duration(t1, t2) {
    return Math.abs(t2 - t1);
}
exports.duration = duration;
function checkOptionalTime(time) {
    if (typeof time === 'undefined') {
        return true;
    }
    return checkRequiredTime(time);
}
exports.checkOptionalTime = checkOptionalTime;
function checkRequiredTime(time) {
    return typeof time === 'number' && time === Math.round(time) && time > 0;
}
exports.checkRequiredTime = checkRequiredTime;
function delay(millis) {
    return new Promise(resolve => setTimeout(resolve, millis));
}
exports.delay = delay;
function reflect(promise) {
    return promise
        .then(value => {
        return new PromiseInspection_1.PromiseInspection({ value });
    })
        .catch(error => {
        return new PromiseInspection_1.PromiseInspection({ error });
    });
}
exports.reflect = reflect;
function tryPromise(cb) {
    try {
        const result = cb();
        return Promise.resolve(result);
    }
    catch (err) {
        return Promise.reject(err);
    }
}
exports.tryPromise = tryPromise;
The MIT License

Copyright (c) 2010-2018 Mike D Pilsbury

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.
{
  "author": "Mike D Pilsbury <mike.pilsbury@gmail.com>",
  "name": "tedious",
  "description": "A TDS driver, for connecting to MS SQLServer databases.",
  "homepage": "https://github.com/tediousjs/tedious",
  "license": "MIT",
  "version": "15.0.1",
  "main": "./lib/tedious.js",
  "repository": {
    "type": "git",
    "url": "https://github.com/tediousjs/tedious.git"
  },
  "engines": {
    "node": ">=14"
  },
  "publishConfig": {
    "tag": "next"
  },
  "dependencies": {
    "@azure/identity": "^2.0.4",
    "@azure/keyvault-keys": "^4.4.0",
    "@js-joda/core": "^5.2.0",
    "@types/es-aggregate-error": "^1.0.2",
    "bl": "^5.0.0",
    "es-aggregate-error": "^1.0.8",
    "iconv-lite": "^0.6.3",
    "js-md4": "^0.3.2",
    "jsbi": "^4.3.0",
    "native-duplexpair": "^1.0.0",
    "node-abort-controller": "^3.0.1",
    "punycode": "^2.1.0",
    "sprintf-js": "^1.1.2"
  },
  "devDependencies": {
    "@babel/cli": "^7.17.10",
    "@babel/core": "^7.17.10",
    "@babel/node": "^7.17.10",
    "@babel/plugin-proposal-class-properties": "^7.16.7",
    "@babel/preset-env": "^7.17.10",
    "@babel/preset-typescript": "^7.16.7",
    "@babel/register": "^7.17.7",
    "@commitlint/cli": "^16.2.4",
    "@commitlint/config-conventional": "^16.2.4",
    "@commitlint/travis-cli": "^16.2.4",
    "@types/async": "^3.2.13",
    "@types/bl": "^5.0.2",
    "@types/chai": "^4.3.1",
    "@types/depd": "^1.1.32",
    "@types/lru-cache": "^5.1.0",
    "@types/mocha": "^9.1.1",
    "@types/node": "^12.20.50",
    "@types/sprintf-js": "^1.1.2",
    "@typescript-eslint/eslint-plugin": "^5.22.0",
    "@typescript-eslint/parser": "^5.22.0",
    "async": "^3.2.3",
    "babel-plugin-istanbul": "^6.1.1",
    "chai": "^4.3.6",
    "codecov": "^3.8.3",
    "eslint": "^7.32.0",
    "mitm": "^1.7.2",
    "mocha": "^9.2.2",
    "nyc": "^15.1.0",
    "rimraf": "^3.0.2",
    "semantic-release": "^19.0.3",
    "sinon": "^11.1.2",
    "typedoc": "^0.22.15",
    "typescript": "^4.6.4"
  },
  "commitlint": {
    "extends": [
      "@commitlint/config-conventional"
    ],
    "rules": {
      "body-max-line-length": [
        1,
        "always",
        100
      ],
      "footer-max-line-length": [
        1,
        "always",
        100
      ],
      "header-max-length": [
        1,
        "always",
        100
      ]
    }
  },
  "mocha": {
    "require": "test/setup.js",
    "timeout": 5000,
    "extension": [
      "js",
      "ts"
    ]
  }
}**Before submitting a PR :**
1. Ensure your fork is created from `master` branch of [the repository](https://github.com/tediousjs/tedious).
2. Run `npm install` in the root folder.
3. After bug fix/code change, ensure all the existing tests and new tests (if any) pass (`npm run-script test-all`). During development, to run individual test use `node_modules/nodeunit test/<test_file.js> -t <test_name>`.
4. Build the driver (`npm run build`).
5. Run eslint and flow typechecker (`npm run lint`).
6. Run commitlint (`node_modules/.bin/commitlint --from origin/master --to HEAD`). Refer [commit conventions](https://commitlint.js.org/#/concepts-commit-conventions) and [commit rules](https://commitlint.js.org/#/reference-rules).

**Thank you for Contributing!**
{
  "compilerOptions": {
    "target": "esnext",
    "moduleResolution": "node",
    "allowJs": true,
    "noEmit": true,
    "strict": true,
    "isolatedModules": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "lib": [ "esnext" ],
    "skipLibCheck": true,
    "resolveJsonModule": true,
    "exactOptionalPropertyTypes": true
  },

  "include": [
    "types/*.d.ts",
    "src/**/*.ts",
    "test/**/*.ts",
    "test/**/*.js",
  ],

  "typedocOptions": {
    "name": "Tedious",
    "out": "./docs",
    "entryPoints": ["./src/tedious.ts"]
  }
}
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.writeToTrackingBuffer = writeToTrackingBuffer;
const TYPE = {
  QUERY_NOTIFICATIONS: 1,
  TXN_DESCRIPTOR: 2,
  TRACE_ACTIVITY: 3
};
const TXNDESCRIPTOR_HEADER_DATA_LEN = 4 + 8;
const TXNDESCRIPTOR_HEADER_LEN = 4 + 2 + TXNDESCRIPTOR_HEADER_DATA_LEN;

function writeToTrackingBuffer(buffer, txnDescriptor, outstandingRequestCount) {
  buffer.writeUInt32LE(0);
  buffer.writeUInt32LE(TXNDESCRIPTOR_HEADER_LEN);
  buffer.writeUInt16LE(TYPE.TXN_DESCRIPTOR);
  buffer.writeBuffer(txnDescriptor);
  buffer.writeUInt32LE(outstandingRequestCount);
  const data = buffer.data;
  data.writeUInt32LE(data.length, 0);
  return buffer;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUWVBFIiwiUVVFUllfTk9USUZJQ0FUSU9OUyIsIlRYTl9ERVNDUklQVE9SIiwiVFJBQ0VfQUNUSVZJVFkiLCJUWE5ERVNDUklQVE9SX0hFQURFUl9EQVRBX0xFTiIsIlRYTkRFU0NSSVBUT1JfSEVBREVSX0xFTiIsIndyaXRlVG9UcmFja2luZ0J1ZmZlciIsImJ1ZmZlciIsInR4bkRlc2NyaXB0b3IiLCJvdXRzdGFuZGluZ1JlcXVlc3RDb3VudCIsIndyaXRlVUludDMyTEUiLCJ3cml0ZVVJbnQxNkxFIiwid3JpdGVCdWZmZXIiLCJkYXRhIiwibGVuZ3RoIl0sInNvdXJjZXMiOlsiLi4vc3JjL2FsbC1oZWFkZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBXcml0YWJsZVRyYWNraW5nQnVmZmVyIGZyb20gJy4vdHJhY2tpbmctYnVmZmVyL3dyaXRhYmxlLXRyYWNraW5nLWJ1ZmZlcic7XG5cbmNvbnN0IFRZUEUgPSB7XG4gIFFVRVJZX05PVElGSUNBVElPTlM6IDEsXG4gIFRYTl9ERVNDUklQVE9SOiAyLFxuICBUUkFDRV9BQ1RJVklUWTogM1xufTtcblxuY29uc3QgVFhOREVTQ1JJUFRPUl9IRUFERVJfREFUQV9MRU4gPSA0ICsgODtcblxuY29uc3QgVFhOREVTQ1JJUFRPUl9IRUFERVJfTEVOID0gNCArIDIgKyBUWE5ERVNDUklQVE9SX0hFQURFUl9EQVRBX0xFTjtcblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlVG9UcmFja2luZ0J1ZmZlcihidWZmZXI6IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIsIHR4bkRlc2NyaXB0b3I6IEJ1ZmZlciwgb3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQ6IG51bWJlcikge1xuICBidWZmZXIud3JpdGVVSW50MzJMRSgwKTtcbiAgYnVmZmVyLndyaXRlVUludDMyTEUoVFhOREVTQ1JJUFRPUl9IRUFERVJfTEVOKTtcbiAgYnVmZmVyLndyaXRlVUludDE2TEUoVFlQRS5UWE5fREVTQ1JJUFRPUik7XG4gIGJ1ZmZlci53cml0ZUJ1ZmZlcih0eG5EZXNjcmlwdG9yKTtcbiAgYnVmZmVyLndyaXRlVUludDMyTEUob3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQpO1xuXG4gIGNvbnN0IGRhdGEgPSBidWZmZXIuZGF0YTtcbiAgZGF0YS53cml0ZVVJbnQzMkxFKGRhdGEubGVuZ3RoLCAwKTtcbiAgcmV0dXJuIGJ1ZmZlcjtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUEsTUFBTUEsSUFBSSxHQUFHO0VBQ1hDLG1CQUFtQixFQUFFLENBRFY7RUFFWEMsY0FBYyxFQUFFLENBRkw7RUFHWEMsY0FBYyxFQUFFO0FBSEwsQ0FBYjtBQU1BLE1BQU1DLDZCQUE2QixHQUFHLElBQUksQ0FBMUM7QUFFQSxNQUFNQyx3QkFBd0IsR0FBRyxJQUFJLENBQUosR0FBUUQsNkJBQXpDOztBQUVPLFNBQVNFLHFCQUFULENBQStCQyxNQUEvQixFQUErREMsYUFBL0QsRUFBc0ZDLHVCQUF0RixFQUF1SDtFQUM1SEYsTUFBTSxDQUFDRyxhQUFQLENBQXFCLENBQXJCO0VBQ0FILE1BQU0sQ0FBQ0csYUFBUCxDQUFxQkwsd0JBQXJCO0VBQ0FFLE1BQU0sQ0FBQ0ksYUFBUCxDQUFxQlgsSUFBSSxDQUFDRSxjQUExQjtFQUNBSyxNQUFNLENBQUNLLFdBQVAsQ0FBbUJKLGFBQW5CO0VBQ0FELE1BQU0sQ0FBQ0csYUFBUCxDQUFxQkQsdUJBQXJCO0VBRUEsTUFBTUksSUFBSSxHQUFHTixNQUFNLENBQUNNLElBQXBCO0VBQ0FBLElBQUksQ0FBQ0gsYUFBTCxDQUFtQkcsSUFBSSxDQUFDQyxNQUF4QixFQUFnQyxDQUFoQztFQUNBLE9BQU9QLE1BQVA7QUFDRCJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.BulkLoadPayload = void 0;

let _Symbol$asyncIterator;

_Symbol$asyncIterator = Symbol.asyncIterator;

class BulkLoadPayload {
  constructor(bulkLoad) {
    this.bulkLoad = void 0;
    this.iterator = void 0;
    this.bulkLoad = bulkLoad; // We need to grab the iterator here so that `error` event handlers are set up
    // as early as possible (and are not potentially lost).

    this.iterator = this.bulkLoad.rowToPacketTransform[Symbol.asyncIterator]();
  }

  [_Symbol$asyncIterator]() {
    return this.iterator;
  }

  toString(indent = '') {
    return indent + 'BulkLoad';
  }

}

exports.BulkLoadPayload = BulkLoadPayload;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTeW1ib2wiLCJhc3luY0l0ZXJhdG9yIiwiQnVsa0xvYWRQYXlsb2FkIiwiY29uc3RydWN0b3IiLCJidWxrTG9hZCIsIml0ZXJhdG9yIiwicm93VG9QYWNrZXRUcmFuc2Zvcm0iLCJ0b1N0cmluZyIsImluZGVudCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9idWxrLWxvYWQtcGF5bG9hZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQnVsa0xvYWQgZnJvbSAnLi9idWxrLWxvYWQnO1xuXG5leHBvcnQgY2xhc3MgQnVsa0xvYWRQYXlsb2FkIGltcGxlbWVudHMgQXN5bmNJdGVyYWJsZTxCdWZmZXI+IHtcbiAgYnVsa0xvYWQ6IEJ1bGtMb2FkO1xuICBpdGVyYXRvcjogQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPEJ1ZmZlcj47XG5cbiAgY29uc3RydWN0b3IoYnVsa0xvYWQ6IEJ1bGtMb2FkKSB7XG4gICAgdGhpcy5idWxrTG9hZCA9IGJ1bGtMb2FkO1xuXG4gICAgLy8gV2UgbmVlZCB0byBncmFiIHRoZSBpdGVyYXRvciBoZXJlIHNvIHRoYXQgYGVycm9yYCBldmVudCBoYW5kbGVycyBhcmUgc2V0IHVwXG4gICAgLy8gYXMgZWFybHkgYXMgcG9zc2libGUgKGFuZCBhcmUgbm90IHBvdGVudGlhbGx5IGxvc3QpLlxuICAgIHRoaXMuaXRlcmF0b3IgPSB0aGlzLmJ1bGtMb2FkLnJvd1RvUGFja2V0VHJhbnNmb3JtW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuICB9XG5cbiAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICByZXR1cm4gdGhpcy5pdGVyYXRvcjtcbiAgfVxuXG4gIHRvU3RyaW5nKGluZGVudCA9ICcnKSB7XG4gICAgcmV0dXJuIGluZGVudCArICgnQnVsa0xvYWQnKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7d0JBY0dBLE1BQU0sQ0FBQ0MsYTs7QUFaSCxNQUFNQyxlQUFOLENBQXVEO0VBSTVEQyxXQUFXLENBQUNDLFFBQUQsRUFBcUI7SUFBQSxLQUhoQ0EsUUFHZ0M7SUFBQSxLQUZoQ0MsUUFFZ0M7SUFDOUIsS0FBS0QsUUFBTCxHQUFnQkEsUUFBaEIsQ0FEOEIsQ0FHOUI7SUFDQTs7SUFDQSxLQUFLQyxRQUFMLEdBQWdCLEtBQUtELFFBQUwsQ0FBY0Usb0JBQWQsQ0FBbUNOLE1BQU0sQ0FBQ0MsYUFBMUMsR0FBaEI7RUFDRDs7RUFFRCwwQkFBeUI7SUFDdkIsT0FBTyxLQUFLSSxRQUFaO0VBQ0Q7O0VBRURFLFFBQVEsQ0FBQ0MsTUFBTSxHQUFHLEVBQVYsRUFBYztJQUNwQixPQUFPQSxNQUFNLEdBQUksVUFBakI7RUFDRDs7QUFsQjJEIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _events = require("events");

var _writableTrackingBuffer = _interopRequireDefault(require("./tracking-buffer/writable-tracking-buffer"));

var _stream = require("stream");

var _token = require("./token/token");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/**
 * @private
 */
const FLAGS = {
  nullable: 1 << 0,
  caseSen: 1 << 1,
  updateableReadWrite: 1 << 2,
  updateableUnknown: 1 << 3,
  identity: 1 << 4,
  computed: 1 << 5,
  // introduced in TDS 7.2
  fixedLenCLRType: 1 << 8,
  // introduced in TDS 7.2
  sparseColumnSet: 1 << 10,
  // introduced in TDS 7.3.B
  hidden: 1 << 13,
  // introduced in TDS 7.2
  key: 1 << 14,
  // introduced in TDS 7.2
  nullableUnknown: 1 << 15 // introduced in TDS 7.2

};
/**
 * @private
 */

const DONE_STATUS = {
  FINAL: 0x00,
  MORE: 0x1,
  ERROR: 0x2,
  INXACT: 0x4,
  COUNT: 0x10,
  ATTN: 0x20,
  SRVERROR: 0x100
};
/**
 * @private
 */

const rowTokenBuffer = Buffer.from([_token.TYPE.ROW]);
const textPointerAndTimestampBuffer = Buffer.from([// TextPointer length
0x10, // TextPointer
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Timestamp
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
const textPointerNullBuffer = Buffer.from([0x00]); // A transform that converts rows to packets.

class RowTransform extends _stream.Transform {
  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */
  constructor(bulkLoad) {
    super({
      writableObjectMode: true
    });
    this.columnMetadataWritten = void 0;
    this.bulkLoad = void 0;
    this.mainOptions = void 0;
    this.columns = void 0;
    this.bulkLoad = bulkLoad;
    this.mainOptions = bulkLoad.options;
    this.columns = bulkLoad.columns;
    this.columnMetadataWritten = false;
  }
  /**
   * @private
   */


  _transform(row, _encoding, callback) {
    if (!this.columnMetadataWritten) {
      this.push(this.bulkLoad.getColMetaData());
      this.columnMetadataWritten = true;
    }

    this.push(rowTokenBuffer);

    for (let i = 0; i < this.columns.length; i++) {
      const c = this.columns[i];
      let value = Array.isArray(row) ? row[i] : row[c.objName];

      if (!this.bulkLoad.firstRowWritten) {
        try {
          value = c.type.validate(value, c.collation);
        } catch (error) {
          return callback(error);
        }
      }

      const parameter = {
        length: c.length,
        scale: c.scale,
        precision: c.precision,
        value: value
      };

      if (c.type.name === 'Text' || c.type.name === 'Image' || c.type.name === 'NText') {
        if (value == null) {
          this.push(textPointerNullBuffer);
          continue;
        }

        this.push(textPointerAndTimestampBuffer);
      }

      this.push(c.type.generateParameterLength(parameter, this.mainOptions));

      for (const chunk of c.type.generateParameterData(parameter, this.mainOptions)) {
        this.push(chunk);
      }
    }

    process.nextTick(callback);
  }
  /**
   * @private
   */


  _flush(callback) {
    this.push(this.bulkLoad.createDoneToken());
    process.nextTick(callback);
  }

}
/**
 * A BulkLoad instance is used to perform a bulk insert.
 *
 * Use [[Connection.newBulkLoad]] to create a new instance, and [[Connection.execBulkLoad]] to execute it.
 *
 * Example of BulkLoad Usages:
 *
 * ```js
 * // optional BulkLoad options
 * const options = { keepNulls: true };
 *
 * // instantiate - provide the table where you'll be inserting to, options and a callback
 * const bulkLoad = connection.newBulkLoad('MyTable', options, (error, rowCount) => {
 *   console.log('inserted %d rows', rowCount);
 * });
 *
 * // setup your columns - always indicate whether the column is nullable
 * bulkLoad.addColumn('myInt', TYPES.Int, { nullable: false });
 * bulkLoad.addColumn('myString', TYPES.NVarChar, { length: 50, nullable: true });
 *
 * // execute
 * connection.execBulkLoad(bulkLoad, [
 *   { myInt: 7, myString: 'hello' },
 *   { myInt: 23, myString: 'world' }
 * ]);
 * ```
 */


class BulkLoad extends _events.EventEmitter {
  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */
  constructor(table, collation, connectionOptions, {
    checkConstraints = false,
    fireTriggers = false,
    keepNulls = false,
    lockTable = false,
    order = {}
  }, callback) {
    if (typeof checkConstraints !== 'boolean') {
      throw new TypeError('The "options.checkConstraints" property must be of type boolean.');
    }

    if (typeof fireTriggers !== 'boolean') {
      throw new TypeError('The "options.fireTriggers" property must be of type boolean.');
    }

    if (typeof keepNulls !== 'boolean') {
      throw new TypeError('The "options.keepNulls" property must be of type boolean.');
    }

    if (typeof lockTable !== 'boolean') {
      throw new TypeError('The "options.lockTable" property must be of type boolean.');
    }

    if (typeof order !== 'object' || order === null) {
      throw new TypeError('The "options.order" property must be of type object.');
    }

    for (const [column, direction] of Object.entries(order)) {
      if (direction !== 'ASC' && direction !== 'DESC') {
        throw new TypeError('The value of the "' + column + '" key in the "options.order" object must be either "ASC" or "DESC".');
      }
    }

    super();
    this.error = void 0;
    this.canceled = void 0;
    this.executionStarted = void 0;
    this.streamingMode = void 0;
    this.table = void 0;
    this.timeout = void 0;
    this.options = void 0;
    this.callback = void 0;
    this.columns = void 0;
    this.columnsByName = void 0;
    this.firstRowWritten = void 0;
    this.rowToPacketTransform = void 0;
    this.bulkOptions = void 0;
    this.connection = void 0;
    this.rows = void 0;
    this.rst = void 0;
    this.rowCount = void 0;
    this.collation = void 0;
    this.error = undefined;
    this.canceled = false;
    this.executionStarted = false;
    this.collation = collation;
    this.table = table;
    this.options = connectionOptions;
    this.callback = callback;
    this.columns = [];
    this.columnsByName = {};
    this.firstRowWritten = false;
    this.streamingMode = false;
    this.rowToPacketTransform = new RowTransform(this); // eslint-disable-line no-use-before-define

    this.bulkOptions = {
      checkConstraints,
      fireTriggers,
      keepNulls,
      lockTable,
      order
    };
  }
  /**
   * Adds a column to the bulk load.
   *
   * The column definitions should match the table you are trying to insert into.
   * Attempting to call addColumn after the first row has been added will throw an exception.
   *
   * ```js
   * bulkLoad.addColumn('MyIntColumn', TYPES.Int, { nullable: false });
   * ```
   *
   * @param name The name of the column.
   * @param type One of the supported `data types`.
   * @param __namedParameters Additional column type information. At a minimum, `nullable` must be set to true or false.
   * @param length For VarChar, NVarChar, VarBinary. Use length as `Infinity` for VarChar(max), NVarChar(max) and VarBinary(max).
   * @param nullable Indicates whether the column accepts NULL values.
   * @param objName If the name of the column is different from the name of the property found on `rowObj` arguments passed to [[addRow]] or [[Connection.execBulkLoad]], then you can use this option to specify the property name.
   * @param precision For Numeric, Decimal.
   * @param scale For Numeric, Decimal, Time, DateTime2, DateTimeOffset.
  */


  addColumn(name, type, {
    output = false,
    length,
    precision,
    scale,
    objName = name,
    nullable = true
  }) {
    if (this.firstRowWritten) {
      throw new Error('Columns cannot be added to bulk insert after the first row has been written.');
    }

    if (this.executionStarted) {
      throw new Error('Columns cannot be added to bulk insert after execution has started.');
    }

    const column = {
      type: type,
      name: name,
      value: null,
      output: output,
      length: length,
      precision: precision,
      scale: scale,
      objName: objName,
      nullable: nullable,
      collation: this.collation
    };

    if ((type.id & 0x30) === 0x20) {
      if (column.length == null && type.resolveLength) {
        column.length = type.resolveLength(column);
      }
    }

    if (type.resolvePrecision && column.precision == null) {
      column.precision = type.resolvePrecision(column);
    }

    if (type.resolveScale && column.scale == null) {
      column.scale = type.resolveScale(column);
    }

    this.columns.push(column);
    this.columnsByName[name] = column;
  }
  /**
   * @private
   */


  getOptionsSql() {
    const addOptions = [];

    if (this.bulkOptions.checkConstraints) {
      addOptions.push('CHECK_CONSTRAINTS');
    }

    if (this.bulkOptions.fireTriggers) {
      addOptions.push('FIRE_TRIGGERS');
    }

    if (this.bulkOptions.keepNulls) {
      addOptions.push('KEEP_NULLS');
    }

    if (this.bulkOptions.lockTable) {
      addOptions.push('TABLOCK');
    }

    if (this.bulkOptions.order) {
      const orderColumns = [];

      for (const [column, direction] of Object.entries(this.bulkOptions.order)) {
        orderColumns.push(`${column} ${direction}`);
      }

      if (orderColumns.length) {
        addOptions.push(`ORDER (${orderColumns.join(', ')})`);
      }
    }

    if (addOptions.length > 0) {
      return ` WITH (${addOptions.join(',')})`;
    } else {
      return '';
    }
  }
  /**
   * @private
   */


  getBulkInsertSql() {
    let sql = 'insert bulk ' + this.table + '(';

    for (let i = 0, len = this.columns.length; i < len; i++) {
      const c = this.columns[i];

      if (i !== 0) {
        sql += ', ';
      }

      sql += '[' + c.name + '] ' + c.type.declaration(c);
    }

    sql += ')';
    sql += this.getOptionsSql();
    return sql;
  }
  /**
   * This is simply a helper utility function which returns a `CREATE TABLE SQL` statement based on the columns added to the bulkLoad object.
   * This may be particularly handy when you want to insert into a temporary table (a table which starts with `#`).
   *
   * ```js
   * var sql = bulkLoad.getTableCreationSql();
   * ```
   *
   * A side note on bulk inserting into temporary tables: if you want to access a local temporary table after executing the bulk load,
   * you'll need to use the same connection and execute your requests using [[Connection.execSqlBatch]] instead of [[Connection.execSql]]
   */


  getTableCreationSql() {
    let sql = 'CREATE TABLE ' + this.table + '(\n';

    for (let i = 0, len = this.columns.length; i < len; i++) {
      const c = this.columns[i];

      if (i !== 0) {
        sql += ',\n';
      }

      sql += '[' + c.name + '] ' + c.type.declaration(c);

      if (c.nullable !== undefined) {
        sql += ' ' + (c.nullable ? 'NULL' : 'NOT NULL');
      }
    }

    sql += '\n)';
    return sql;
  }
  /**
   * @private
   */


  getColMetaData() {
    const tBuf = new _writableTrackingBuffer.default(100, null, true); // TokenType

    tBuf.writeUInt8(_token.TYPE.COLMETADATA); // Count

    tBuf.writeUInt16LE(this.columns.length);

    for (let j = 0, len = this.columns.length; j < len; j++) {
      const c = this.columns[j]; // UserType

      if (this.options.tdsVersion < '7_2') {
        tBuf.writeUInt16LE(0);
      } else {
        tBuf.writeUInt32LE(0);
      } // Flags


      let flags = FLAGS.updateableReadWrite;

      if (c.nullable) {
        flags |= FLAGS.nullable;
      } else if (c.nullable === undefined && this.options.tdsVersion >= '7_2') {
        flags |= FLAGS.nullableUnknown;
      }

      tBuf.writeUInt16LE(flags); // TYPE_INFO

      tBuf.writeBuffer(c.type.generateTypeInfo(c, this.options)); // TableName

      if (c.type.hasTableName) {
        tBuf.writeUsVarchar(this.table, 'ucs2');
      } // ColName


      tBuf.writeBVarchar(c.name, 'ucs2');
    }

    return tBuf.data;
  }
  /**
   * Sets a timeout for this bulk load.
   *
   * ```js
   * bulkLoad.setTimeout(timeout);
   * ```
   *
   * @param timeout The number of milliseconds before the bulk load is considered failed, or 0 for no timeout.
   *   When no timeout is set for the bulk load, the [[ConnectionOptions.requestTimeout]] of the Connection is used.
   */


  setTimeout(timeout) {
    this.timeout = timeout;
  }
  /**
   * @private
   */


  createDoneToken() {
    // It might be nice to make DoneToken a class if anything needs to create them, but for now, just do it here
    const tBuf = new _writableTrackingBuffer.default(this.options.tdsVersion < '7_2' ? 9 : 13);
    tBuf.writeUInt8(_token.TYPE.DONE);
    const status = DONE_STATUS.FINAL;
    tBuf.writeUInt16LE(status);
    tBuf.writeUInt16LE(0); // CurCmd (TDS ignores this)

    tBuf.writeUInt32LE(0); // row count - doesn't really matter

    if (this.options.tdsVersion >= '7_2') {
      tBuf.writeUInt32LE(0); // row count is 64 bits in >= TDS 7.2
    }

    return tBuf.data;
  }
  /**
   * @private
   */


  cancel() {
    if (this.canceled) {
      return;
    }

    this.canceled = true;
    this.emit('cancel');
  }

}

var _default = BulkLoad;
exports.default = _default;
module.exports = BulkLoad;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGTEFHUyIsIm51bGxhYmxlIiwiY2FzZVNlbiIsInVwZGF0ZWFibGVSZWFkV3JpdGUiLCJ1cGRhdGVhYmxlVW5rbm93biIsImlkZW50aXR5IiwiY29tcHV0ZWQiLCJmaXhlZExlbkNMUlR5cGUiLCJzcGFyc2VDb2x1bW5TZXQiLCJoaWRkZW4iLCJrZXkiLCJudWxsYWJsZVVua25vd24iLCJET05FX1NUQVRVUyIsIkZJTkFMIiwiTU9SRSIsIkVSUk9SIiwiSU5YQUNUIiwiQ09VTlQiLCJBVFROIiwiU1JWRVJST1IiLCJyb3dUb2tlbkJ1ZmZlciIsIkJ1ZmZlciIsImZyb20iLCJUT0tFTl9UWVBFIiwiUk9XIiwidGV4dFBvaW50ZXJBbmRUaW1lc3RhbXBCdWZmZXIiLCJ0ZXh0UG9pbnRlck51bGxCdWZmZXIiLCJSb3dUcmFuc2Zvcm0iLCJUcmFuc2Zvcm0iLCJjb25zdHJ1Y3RvciIsImJ1bGtMb2FkIiwid3JpdGFibGVPYmplY3RNb2RlIiwiY29sdW1uTWV0YWRhdGFXcml0dGVuIiwibWFpbk9wdGlvbnMiLCJjb2x1bW5zIiwib3B0aW9ucyIsIl90cmFuc2Zvcm0iLCJyb3ciLCJfZW5jb2RpbmciLCJjYWxsYmFjayIsInB1c2giLCJnZXRDb2xNZXRhRGF0YSIsImkiLCJsZW5ndGgiLCJjIiwidmFsdWUiLCJBcnJheSIsImlzQXJyYXkiLCJvYmpOYW1lIiwiZmlyc3RSb3dXcml0dGVuIiwidHlwZSIsInZhbGlkYXRlIiwiY29sbGF0aW9uIiwiZXJyb3IiLCJwYXJhbWV0ZXIiLCJzY2FsZSIsInByZWNpc2lvbiIsIm5hbWUiLCJnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aCIsImNodW5rIiwiZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhIiwicHJvY2VzcyIsIm5leHRUaWNrIiwiX2ZsdXNoIiwiY3JlYXRlRG9uZVRva2VuIiwiQnVsa0xvYWQiLCJFdmVudEVtaXR0ZXIiLCJ0YWJsZSIsImNvbm5lY3Rpb25PcHRpb25zIiwiY2hlY2tDb25zdHJhaW50cyIsImZpcmVUcmlnZ2VycyIsImtlZXBOdWxscyIsImxvY2tUYWJsZSIsIm9yZGVyIiwiVHlwZUVycm9yIiwiY29sdW1uIiwiZGlyZWN0aW9uIiwiT2JqZWN0IiwiZW50cmllcyIsImNhbmNlbGVkIiwiZXhlY3V0aW9uU3RhcnRlZCIsInN0cmVhbWluZ01vZGUiLCJ0aW1lb3V0IiwiY29sdW1uc0J5TmFtZSIsInJvd1RvUGFja2V0VHJhbnNmb3JtIiwiYnVsa09wdGlvbnMiLCJjb25uZWN0aW9uIiwicm93cyIsInJzdCIsInJvd0NvdW50IiwidW5kZWZpbmVkIiwiYWRkQ29sdW1uIiwib3V0cHV0IiwiRXJyb3IiLCJpZCIsInJlc29sdmVMZW5ndGgiLCJyZXNvbHZlUHJlY2lzaW9uIiwicmVzb2x2ZVNjYWxlIiwiZ2V0T3B0aW9uc1NxbCIsImFkZE9wdGlvbnMiLCJvcmRlckNvbHVtbnMiLCJqb2luIiwiZ2V0QnVsa0luc2VydFNxbCIsInNxbCIsImxlbiIsImRlY2xhcmF0aW9uIiwiZ2V0VGFibGVDcmVhdGlvblNxbCIsInRCdWYiLCJXcml0YWJsZVRyYWNraW5nQnVmZmVyIiwid3JpdGVVSW50OCIsIkNPTE1FVEFEQVRBIiwid3JpdGVVSW50MTZMRSIsImoiLCJ0ZHNWZXJzaW9uIiwid3JpdGVVSW50MzJMRSIsImZsYWdzIiwid3JpdGVCdWZmZXIiLCJnZW5lcmF0ZVR5cGVJbmZvIiwiaGFzVGFibGVOYW1lIiwid3JpdGVVc1ZhcmNoYXIiLCJ3cml0ZUJWYXJjaGFyIiwiZGF0YSIsInNldFRpbWVvdXQiLCJET05FIiwic3RhdHVzIiwiY2FuY2VsIiwiZW1pdCIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi9zcmMvYnVsay1sb2FkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgV3JpdGFibGVUcmFja2luZ0J1ZmZlciBmcm9tICcuL3RyYWNraW5nLWJ1ZmZlci93cml0YWJsZS10cmFja2luZy1idWZmZXInO1xuaW1wb3J0IENvbm5lY3Rpb24sIHsgSW50ZXJuYWxDb25uZWN0aW9uT3B0aW9ucyB9IGZyb20gJy4vY29ubmVjdGlvbic7XG5cbmltcG9ydCB7IFRyYW5zZm9ybSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBUWVBFIGFzIFRPS0VOX1RZUEUgfSBmcm9tICcuL3Rva2VuL3Rva2VuJztcblxuaW1wb3J0IHsgRGF0YVR5cGUsIFBhcmFtZXRlciB9IGZyb20gJy4vZGF0YS10eXBlJztcbmltcG9ydCB7IENvbGxhdGlvbiB9IGZyb20gJy4vY29sbGF0aW9uJztcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBGTEFHUyA9IHtcbiAgbnVsbGFibGU6IDEgPDwgMCxcbiAgY2FzZVNlbjogMSA8PCAxLFxuICB1cGRhdGVhYmxlUmVhZFdyaXRlOiAxIDw8IDIsXG4gIHVwZGF0ZWFibGVVbmtub3duOiAxIDw8IDMsXG4gIGlkZW50aXR5OiAxIDw8IDQsXG4gIGNvbXB1dGVkOiAxIDw8IDUsIC8vIGludHJvZHVjZWQgaW4gVERTIDcuMlxuICBmaXhlZExlbkNMUlR5cGU6IDEgPDwgOCwgLy8gaW50cm9kdWNlZCBpbiBURFMgNy4yXG4gIHNwYXJzZUNvbHVtblNldDogMSA8PCAxMCwgLy8gaW50cm9kdWNlZCBpbiBURFMgNy4zLkJcbiAgaGlkZGVuOiAxIDw8IDEzLCAvLyBpbnRyb2R1Y2VkIGluIFREUyA3LjJcbiAga2V5OiAxIDw8IDE0LCAvLyBpbnRyb2R1Y2VkIGluIFREUyA3LjJcbiAgbnVsbGFibGVVbmtub3duOiAxIDw8IDE1IC8vIGludHJvZHVjZWQgaW4gVERTIDcuMlxufTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBET05FX1NUQVRVUyA9IHtcbiAgRklOQUw6IDB4MDAsXG4gIE1PUkU6IDB4MSxcbiAgRVJST1I6IDB4MixcbiAgSU5YQUNUOiAweDQsXG4gIENPVU5UOiAweDEwLFxuICBBVFROOiAweDIwLFxuICBTUlZFUlJPUjogMHgxMDBcbn07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuaW50ZXJmYWNlIEludGVybmFsT3B0aW9ucyB7XG4gIGNoZWNrQ29uc3RyYWludHM6IGJvb2xlYW47XG4gIGZpcmVUcmlnZ2VyczogYm9vbGVhbjtcbiAga2VlcE51bGxzOiBib29sZWFuO1xuICBsb2NrVGFibGU6IGJvb2xlYW47XG4gIG9yZGVyOiB7IFtjb2x1bW5OYW1lOiBzdHJpbmddOiAnQVNDJyB8ICdERVNDJyB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbnMge1xuICAvKipcbiAgICogSG9ub3JzIGNvbnN0cmFpbnRzIGR1cmluZyBidWxrIGxvYWQsIHVzaW5nIFQtU1FMXG4gICAqIFtDSEVDS19DT05TVFJBSU5UU10oaHR0cHM6Ly90ZWNobmV0Lm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE4NjI0Nyh2PXNxbC4xMDUpLmFzcHgpLlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYClcbiAgICovXG4gIGNoZWNrQ29uc3RyYWludHM/OiBJbnRlcm5hbE9wdGlvbnNbJ2NoZWNrQ29uc3RyYWludHMnXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSG9ub3JzIGluc2VydCB0cmlnZ2VycyBkdXJpbmcgYnVsayBsb2FkLCB1c2luZyB0aGUgVC1TUUwgW0ZJUkVfVFJJR0dFUlNdKGh0dHBzOi8vdGVjaG5ldC5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxODc2NDAodj1zcWwuMTA1KS5hc3B4KS4gKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqL1xuICBmaXJlVHJpZ2dlcnM/OiBJbnRlcm5hbE9wdGlvbnNbJ2ZpcmVUcmlnZ2VycyddIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBIb25vcnMgbnVsbCB2YWx1ZSBwYXNzZWQsIGlnbm9yZXMgdGhlIGRlZmF1bHQgdmFsdWVzIHNldCBvbiB0YWJsZSwgdXNpbmcgVC1TUUwgW0tFRVBfTlVMTFNdKGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxODc4ODcodj1zcWwuMTIwKS5hc3B4KS4gKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqL1xuICBrZWVwTnVsbHM/OiBJbnRlcm5hbE9wdGlvbnNbJ2tlZXBOdWxscyddIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBQbGFjZXMgYSBidWxrIHVwZGF0ZShCVSkgbG9jayBvbiB0YWJsZSB3aGlsZSBwZXJmb3JtaW5nIGJ1bGsgbG9hZCwgdXNpbmcgVC1TUUwgW1RBQkxPQ0tdKGh0dHBzOi8vdGVjaG5ldC5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxODA4NzYodj1zcWwuMTA1KS5hc3B4KS4gKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqL1xuICBsb2NrVGFibGU/OiBJbnRlcm5hbE9wdGlvbnNbJ2xvY2tUYWJsZSddIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIG9yZGVyaW5nIG9mIHRoZSBkYXRhIHRvIHBvc3NpYmx5IGluY3JlYXNlIGJ1bGsgaW5zZXJ0IHBlcmZvcm1hbmNlLCB1c2luZyBULVNRTCBbT1JERVJdKGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3ByZXZpb3VzLXZlcnNpb25zL3NxbC9zcWwtc2VydmVyLTIwMDgtcjIvbXMxNzc0Njgodj1zcWwuMTA1KSkuIChkZWZhdWx0OiBge31gKVxuICAgKi9cbiAgb3JkZXI/OiBJbnRlcm5hbE9wdGlvbnNbJ29yZGVyJ10gfCB1bmRlZmluZWQ7XG59XG5cblxuZXhwb3J0IHR5cGUgQ2FsbGJhY2sgPVxuICAvKipcbiAgICogQSBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgW1tCdWxrTG9hZF1dIGZpbmlzaGVzIGV4ZWN1dGluZy5cbiAgICpcbiAgICogQHBhcmFtIHJvd0NvdW50IHRoZSBudW1iZXIgb2Ygcm93cyBpbnNlcnRlZFxuICAgKi9cbiAgKGVycjogRXJyb3IgfCB1bmRlZmluZWQgfCBudWxsLCByb3dDb3VudD86IG51bWJlcikgPT4gdm9pZDtcblxuaW50ZXJmYWNlIENvbHVtbiBleHRlbmRzIFBhcmFtZXRlciB7XG4gIG9iak5hbWU6IHN0cmluZztcbiAgY29sbGF0aW9uOiBDb2xsYXRpb24gfCB1bmRlZmluZWQ7XG59XG5cbmludGVyZmFjZSBDb2x1bW5PcHRpb25zIHtcbiAgb3V0cHV0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRm9yIFZhckNoYXIsIE5WYXJDaGFyLCBWYXJCaW5hcnkuIFVzZSBsZW5ndGggYXMgYEluZmluaXR5YCBmb3IgVmFyQ2hhcihtYXgpLCBOVmFyQ2hhcihtYXgpIGFuZCBWYXJCaW5hcnkobWF4KS5cbiAgICovXG4gIGxlbmd0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogRm9yIE51bWVyaWMsIERlY2ltYWwuXG4gICAqL1xuICBwcmVjaXNpb24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEZvciBOdW1lcmljLCBEZWNpbWFsLCBUaW1lLCBEYXRlVGltZTIsIERhdGVUaW1lT2Zmc2V0LlxuICAgKi9cbiAgc2NhbGU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIElmIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gaXMgZGlmZmVyZW50IGZyb20gdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGZvdW5kIG9uIGByb3dPYmpgIGFyZ3VtZW50cyBwYXNzZWQgdG8gW1thZGRSb3ddXSwgdGhlbiB5b3UgY2FuIHVzZSB0aGlzIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBwcm9wZXJ0eSBuYW1lLlxuICAgKi9cbiAgb2JqTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbHVtbiBhY2NlcHRzIE5VTEwgdmFsdWVzLlxuICAgKi9cbiAgbnVsbGFibGU/OiBib29sZWFuO1xufVxuXG5jb25zdCByb3dUb2tlbkJ1ZmZlciA9IEJ1ZmZlci5mcm9tKFsgVE9LRU5fVFlQRS5ST1cgXSk7XG5jb25zdCB0ZXh0UG9pbnRlckFuZFRpbWVzdGFtcEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKFtcbiAgLy8gVGV4dFBvaW50ZXIgbGVuZ3RoXG4gIDB4MTAsXG5cbiAgLy8gVGV4dFBvaW50ZXJcbiAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCxcblxuICAvLyBUaW1lc3RhbXBcbiAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMFxuXSk7XG5jb25zdCB0ZXh0UG9pbnRlck51bGxCdWZmZXIgPSBCdWZmZXIuZnJvbShbMHgwMF0pO1xuXG4vLyBBIHRyYW5zZm9ybSB0aGF0IGNvbnZlcnRzIHJvd3MgdG8gcGFja2V0cy5cbmNsYXNzIFJvd1RyYW5zZm9ybSBleHRlbmRzIFRyYW5zZm9ybSB7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29sdW1uTWV0YWRhdGFXcml0dGVuOiBib29sZWFuO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGJ1bGtMb2FkOiBCdWxrTG9hZDtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBtYWluT3B0aW9uczogQnVsa0xvYWRbJ29wdGlvbnMnXTtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb2x1bW5zOiBCdWxrTG9hZFsnY29sdW1ucyddO1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29uc3RydWN0b3IoYnVsa0xvYWQ6IEJ1bGtMb2FkKSB7XG4gICAgc3VwZXIoeyB3cml0YWJsZU9iamVjdE1vZGU6IHRydWUgfSk7XG5cbiAgICB0aGlzLmJ1bGtMb2FkID0gYnVsa0xvYWQ7XG4gICAgdGhpcy5tYWluT3B0aW9ucyA9IGJ1bGtMb2FkLm9wdGlvbnM7XG4gICAgdGhpcy5jb2x1bW5zID0gYnVsa0xvYWQuY29sdW1ucztcblxuICAgIHRoaXMuY29sdW1uTWV0YWRhdGFXcml0dGVuID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF90cmFuc2Zvcm0ocm93OiBBcnJheTx1bmtub3duPiB8IHsgW2NvbE5hbWU6IHN0cmluZ106IHVua25vd24gfSwgX2VuY29kaW5nOiBzdHJpbmcsIGNhbGxiYWNrOiAoZXJyb3I/OiBFcnJvcikgPT4gdm9pZCkge1xuICAgIGlmICghdGhpcy5jb2x1bW5NZXRhZGF0YVdyaXR0ZW4pIHtcbiAgICAgIHRoaXMucHVzaCh0aGlzLmJ1bGtMb2FkLmdldENvbE1ldGFEYXRhKCkpO1xuICAgICAgdGhpcy5jb2x1bW5NZXRhZGF0YVdyaXR0ZW4gPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMucHVzaChyb3dUb2tlbkJ1ZmZlcik7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYyA9IHRoaXMuY29sdW1uc1tpXTtcbiAgICAgIGxldCB2YWx1ZSA9IEFycmF5LmlzQXJyYXkocm93KSA/IHJvd1tpXSA6IHJvd1tjLm9iak5hbWVdO1xuXG4gICAgICBpZiAoIXRoaXMuYnVsa0xvYWQuZmlyc3RSb3dXcml0dGVuKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFsdWUgPSBjLnR5cGUudmFsaWRhdGUodmFsdWUsIGMuY29sbGF0aW9uKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyYW1ldGVyID0ge1xuICAgICAgICBsZW5ndGg6IGMubGVuZ3RoLFxuICAgICAgICBzY2FsZTogYy5zY2FsZSxcbiAgICAgICAgcHJlY2lzaW9uOiBjLnByZWNpc2lvbixcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9O1xuXG4gICAgICBpZiAoYy50eXBlLm5hbWUgPT09ICdUZXh0JyB8fCBjLnR5cGUubmFtZSA9PT0gJ0ltYWdlJyB8fCBjLnR5cGUubmFtZSA9PT0gJ05UZXh0Jykge1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMucHVzaCh0ZXh0UG9pbnRlck51bGxCdWZmZXIpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wdXNoKHRleHRQb2ludGVyQW5kVGltZXN0YW1wQnVmZmVyKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wdXNoKGMudHlwZS5nZW5lcmF0ZVBhcmFtZXRlckxlbmd0aChwYXJhbWV0ZXIsIHRoaXMubWFpbk9wdGlvbnMpKTtcbiAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgYy50eXBlLmdlbmVyYXRlUGFyYW1ldGVyRGF0YShwYXJhbWV0ZXIsIHRoaXMubWFpbk9wdGlvbnMpKSB7XG4gICAgICAgIHRoaXMucHVzaChjaHVuayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9mbHVzaChjYWxsYmFjazogKCkgPT4gdm9pZCkge1xuICAgIHRoaXMucHVzaCh0aGlzLmJ1bGtMb2FkLmNyZWF0ZURvbmVUb2tlbigpKTtcblxuICAgIHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2spO1xuICB9XG59XG5cbi8qKlxuICogQSBCdWxrTG9hZCBpbnN0YW5jZSBpcyB1c2VkIHRvIHBlcmZvcm0gYSBidWxrIGluc2VydC5cbiAqXG4gKiBVc2UgW1tDb25uZWN0aW9uLm5ld0J1bGtMb2FkXV0gdG8gY3JlYXRlIGEgbmV3IGluc3RhbmNlLCBhbmQgW1tDb25uZWN0aW9uLmV4ZWNCdWxrTG9hZF1dIHRvIGV4ZWN1dGUgaXQuXG4gKlxuICogRXhhbXBsZSBvZiBCdWxrTG9hZCBVc2FnZXM6XG4gKlxuICogYGBganNcbiAqIC8vIG9wdGlvbmFsIEJ1bGtMb2FkIG9wdGlvbnNcbiAqIGNvbnN0IG9wdGlvbnMgPSB7IGtlZXBOdWxsczogdHJ1ZSB9O1xuICpcbiAqIC8vIGluc3RhbnRpYXRlIC0gcHJvdmlkZSB0aGUgdGFibGUgd2hlcmUgeW91J2xsIGJlIGluc2VydGluZyB0bywgb3B0aW9ucyBhbmQgYSBjYWxsYmFja1xuICogY29uc3QgYnVsa0xvYWQgPSBjb25uZWN0aW9uLm5ld0J1bGtMb2FkKCdNeVRhYmxlJywgb3B0aW9ucywgKGVycm9yLCByb3dDb3VudCkgPT4ge1xuICogICBjb25zb2xlLmxvZygnaW5zZXJ0ZWQgJWQgcm93cycsIHJvd0NvdW50KTtcbiAqIH0pO1xuICpcbiAqIC8vIHNldHVwIHlvdXIgY29sdW1ucyAtIGFsd2F5cyBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBjb2x1bW4gaXMgbnVsbGFibGVcbiAqIGJ1bGtMb2FkLmFkZENvbHVtbignbXlJbnQnLCBUWVBFUy5JbnQsIHsgbnVsbGFibGU6IGZhbHNlIH0pO1xuICogYnVsa0xvYWQuYWRkQ29sdW1uKCdteVN0cmluZycsIFRZUEVTLk5WYXJDaGFyLCB7IGxlbmd0aDogNTAsIG51bGxhYmxlOiB0cnVlIH0pO1xuICpcbiAqIC8vIGV4ZWN1dGVcbiAqIGNvbm5lY3Rpb24uZXhlY0J1bGtMb2FkKGJ1bGtMb2FkLCBbXG4gKiAgIHsgbXlJbnQ6IDcsIG15U3RyaW5nOiAnaGVsbG8nIH0sXG4gKiAgIHsgbXlJbnQ6IDIzLCBteVN0cmluZzogJ3dvcmxkJyB9XG4gKiBdKTtcbiAqIGBgYFxuICovXG5jbGFzcyBCdWxrTG9hZCBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNhbmNlbGVkOiBib29sZWFuO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGV4ZWN1dGlvblN0YXJ0ZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc3RyZWFtaW5nTW9kZTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0YWJsZTogc3RyaW5nO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRpbWVvdXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIG9wdGlvbnM6IEludGVybmFsQ29ubmVjdGlvbk9wdGlvbnM7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2FsbGJhY2s6IENhbGxiYWNrO1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29sdW1uczogQXJyYXk8Q29sdW1uPjtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb2x1bW5zQnlOYW1lOiB7IFtuYW1lOiBzdHJpbmddOiBDb2x1bW4gfTtcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGZpcnN0Um93V3JpdHRlbjogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByb3dUb1BhY2tldFRyYW5zZm9ybTogUm93VHJhbnNmb3JtO1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYnVsa09wdGlvbnM6IEludGVybmFsT3B0aW9ucztcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbm5lY3Rpb246IENvbm5lY3Rpb24gfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcm93czogQXJyYXk8YW55PiB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByc3Q6IEFycmF5PGFueT4gfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcm93Q291bnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICBjb2xsYXRpb246IENvbGxhdGlvbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKHRhYmxlOiBzdHJpbmcsIGNvbGxhdGlvbjogQ29sbGF0aW9uIHwgdW5kZWZpbmVkLCBjb25uZWN0aW9uT3B0aW9uczogSW50ZXJuYWxDb25uZWN0aW9uT3B0aW9ucywge1xuICAgIGNoZWNrQ29uc3RyYWludHMgPSBmYWxzZSxcbiAgICBmaXJlVHJpZ2dlcnMgPSBmYWxzZSxcbiAgICBrZWVwTnVsbHMgPSBmYWxzZSxcbiAgICBsb2NrVGFibGUgPSBmYWxzZSxcbiAgICBvcmRlciA9IHt9LFxuICB9OiBPcHRpb25zLCBjYWxsYmFjazogQ2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIGNoZWNrQ29uc3RyYWludHMgIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwib3B0aW9ucy5jaGVja0NvbnN0cmFpbnRzXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmaXJlVHJpZ2dlcnMgIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwib3B0aW9ucy5maXJlVHJpZ2dlcnNcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGtlZXBOdWxscyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJvcHRpb25zLmtlZXBOdWxsc1wiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbG9ja1RhYmxlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcIm9wdGlvbnMubG9ja1RhYmxlXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcmRlciAhPT0gJ29iamVjdCcgfHwgb3JkZXIgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcIm9wdGlvbnMub3JkZXJcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgb2JqZWN0LicpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2NvbHVtbiwgZGlyZWN0aW9uXSBvZiBPYmplY3QuZW50cmllcyhvcmRlcikpIHtcbiAgICAgIGlmIChkaXJlY3Rpb24gIT09ICdBU0MnICYmIGRpcmVjdGlvbiAhPT0gJ0RFU0MnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSB2YWx1ZSBvZiB0aGUgXCInICsgY29sdW1uICsgJ1wiIGtleSBpbiB0aGUgXCJvcHRpb25zLm9yZGVyXCIgb2JqZWN0IG11c3QgYmUgZWl0aGVyIFwiQVNDXCIgb3IgXCJERVNDXCIuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuZXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jYW5jZWxlZCA9IGZhbHNlO1xuICAgIHRoaXMuZXhlY3V0aW9uU3RhcnRlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5jb2xsYXRpb24gPSBjb2xsYXRpb247XG5cbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy5vcHRpb25zID0gY29ubmVjdGlvbk9wdGlvbnM7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMuY29sdW1ucyA9IFtdO1xuICAgIHRoaXMuY29sdW1uc0J5TmFtZSA9IHt9O1xuICAgIHRoaXMuZmlyc3RSb3dXcml0dGVuID0gZmFsc2U7XG4gICAgdGhpcy5zdHJlYW1pbmdNb2RlID0gZmFsc2U7XG5cbiAgICB0aGlzLnJvd1RvUGFja2V0VHJhbnNmb3JtID0gbmV3IFJvd1RyYW5zZm9ybSh0aGlzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuXG4gICAgdGhpcy5idWxrT3B0aW9ucyA9IHsgY2hlY2tDb25zdHJhaW50cywgZmlyZVRyaWdnZXJzLCBrZWVwTnVsbHMsIGxvY2tUYWJsZSwgb3JkZXIgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29sdW1uIHRvIHRoZSBidWxrIGxvYWQuXG4gICAqXG4gICAqIFRoZSBjb2x1bW4gZGVmaW5pdGlvbnMgc2hvdWxkIG1hdGNoIHRoZSB0YWJsZSB5b3UgYXJlIHRyeWluZyB0byBpbnNlcnQgaW50by5cbiAgICogQXR0ZW1wdGluZyB0byBjYWxsIGFkZENvbHVtbiBhZnRlciB0aGUgZmlyc3Qgcm93IGhhcyBiZWVuIGFkZGVkIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBidWxrTG9hZC5hZGRDb2x1bW4oJ015SW50Q29sdW1uJywgVFlQRVMuSW50LCB7IG51bGxhYmxlOiBmYWxzZSB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4uXG4gICAqIEBwYXJhbSB0eXBlIE9uZSBvZiB0aGUgc3VwcG9ydGVkIGBkYXRhIHR5cGVzYC5cbiAgICogQHBhcmFtIF9fbmFtZWRQYXJhbWV0ZXJzIEFkZGl0aW9uYWwgY29sdW1uIHR5cGUgaW5mb3JtYXRpb24uIEF0IGEgbWluaW11bSwgYG51bGxhYmxlYCBtdXN0IGJlIHNldCB0byB0cnVlIG9yIGZhbHNlLlxuICAgKiBAcGFyYW0gbGVuZ3RoIEZvciBWYXJDaGFyLCBOVmFyQ2hhciwgVmFyQmluYXJ5LiBVc2UgbGVuZ3RoIGFzIGBJbmZpbml0eWAgZm9yIFZhckNoYXIobWF4KSwgTlZhckNoYXIobWF4KSBhbmQgVmFyQmluYXJ5KG1heCkuXG4gICAqIEBwYXJhbSBudWxsYWJsZSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29sdW1uIGFjY2VwdHMgTlVMTCB2YWx1ZXMuXG4gICAqIEBwYXJhbSBvYmpOYW1lIElmIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gaXMgZGlmZmVyZW50IGZyb20gdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGZvdW5kIG9uIGByb3dPYmpgIGFyZ3VtZW50cyBwYXNzZWQgdG8gW1thZGRSb3ddXSBvciBbW0Nvbm5lY3Rpb24uZXhlY0J1bGtMb2FkXV0sIHRoZW4geW91IGNhbiB1c2UgdGhpcyBvcHRpb24gdG8gc3BlY2lmeSB0aGUgcHJvcGVydHkgbmFtZS5cbiAgICogQHBhcmFtIHByZWNpc2lvbiBGb3IgTnVtZXJpYywgRGVjaW1hbC5cbiAgICogQHBhcmFtIHNjYWxlIEZvciBOdW1lcmljLCBEZWNpbWFsLCBUaW1lLCBEYXRlVGltZTIsIERhdGVUaW1lT2Zmc2V0LlxuICAqL1xuICBhZGRDb2x1bW4obmFtZTogc3RyaW5nLCB0eXBlOiBEYXRhVHlwZSwgeyBvdXRwdXQgPSBmYWxzZSwgbGVuZ3RoLCBwcmVjaXNpb24sIHNjYWxlLCBvYmpOYW1lID0gbmFtZSwgbnVsbGFibGUgPSB0cnVlIH06IENvbHVtbk9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy5maXJzdFJvd1dyaXR0ZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29sdW1ucyBjYW5ub3QgYmUgYWRkZWQgdG8gYnVsayBpbnNlcnQgYWZ0ZXIgdGhlIGZpcnN0IHJvdyBoYXMgYmVlbiB3cml0dGVuLicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5leGVjdXRpb25TdGFydGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbHVtbnMgY2Fubm90IGJlIGFkZGVkIHRvIGJ1bGsgaW5zZXJ0IGFmdGVyIGV4ZWN1dGlvbiBoYXMgc3RhcnRlZC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2x1bW46IENvbHVtbiA9IHtcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IG51bGwsXG4gICAgICBvdXRwdXQ6IG91dHB1dCxcbiAgICAgIGxlbmd0aDogbGVuZ3RoLFxuICAgICAgcHJlY2lzaW9uOiBwcmVjaXNpb24sXG4gICAgICBzY2FsZTogc2NhbGUsXG4gICAgICBvYmpOYW1lOiBvYmpOYW1lLFxuICAgICAgbnVsbGFibGU6IG51bGxhYmxlLFxuICAgICAgY29sbGF0aW9uOiB0aGlzLmNvbGxhdGlvblxuICAgIH07XG5cbiAgICBpZiAoKHR5cGUuaWQgJiAweDMwKSA9PT0gMHgyMCkge1xuICAgICAgaWYgKGNvbHVtbi5sZW5ndGggPT0gbnVsbCAmJiB0eXBlLnJlc29sdmVMZW5ndGgpIHtcbiAgICAgICAgY29sdW1uLmxlbmd0aCA9IHR5cGUucmVzb2x2ZUxlbmd0aChjb2x1bW4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlLnJlc29sdmVQcmVjaXNpb24gJiYgY29sdW1uLnByZWNpc2lvbiA9PSBudWxsKSB7XG4gICAgICBjb2x1bW4ucHJlY2lzaW9uID0gdHlwZS5yZXNvbHZlUHJlY2lzaW9uKGNvbHVtbik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUucmVzb2x2ZVNjYWxlICYmIGNvbHVtbi5zY2FsZSA9PSBudWxsKSB7XG4gICAgICBjb2x1bW4uc2NhbGUgPSB0eXBlLnJlc29sdmVTY2FsZShjb2x1bW4pO1xuICAgIH1cblxuICAgIHRoaXMuY29sdW1ucy5wdXNoKGNvbHVtbik7XG5cbiAgICB0aGlzLmNvbHVtbnNCeU5hbWVbbmFtZV0gPSBjb2x1bW47XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGdldE9wdGlvbnNTcWwoKSB7XG4gICAgY29uc3QgYWRkT3B0aW9ucyA9IFtdO1xuXG4gICAgaWYgKHRoaXMuYnVsa09wdGlvbnMuY2hlY2tDb25zdHJhaW50cykge1xuICAgICAgYWRkT3B0aW9ucy5wdXNoKCdDSEVDS19DT05TVFJBSU5UUycpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJ1bGtPcHRpb25zLmZpcmVUcmlnZ2Vycykge1xuICAgICAgYWRkT3B0aW9ucy5wdXNoKCdGSVJFX1RSSUdHRVJTJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYnVsa09wdGlvbnMua2VlcE51bGxzKSB7XG4gICAgICBhZGRPcHRpb25zLnB1c2goJ0tFRVBfTlVMTFMnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5idWxrT3B0aW9ucy5sb2NrVGFibGUpIHtcbiAgICAgIGFkZE9wdGlvbnMucHVzaCgnVEFCTE9DSycpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJ1bGtPcHRpb25zLm9yZGVyKSB7XG4gICAgICBjb25zdCBvcmRlckNvbHVtbnMgPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBbY29sdW1uLCBkaXJlY3Rpb25dIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuYnVsa09wdGlvbnMub3JkZXIpKSB7XG4gICAgICAgIG9yZGVyQ29sdW1ucy5wdXNoKGAke2NvbHVtbn0gJHtkaXJlY3Rpb259YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcmRlckNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgIGFkZE9wdGlvbnMucHVzaChgT1JERVIgKCR7b3JkZXJDb2x1bW5zLmpvaW4oJywgJyl9KWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhZGRPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBgIFdJVEggKCR7YWRkT3B0aW9ucy5qb2luKCcsJyl9KWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGdldEJ1bGtJbnNlcnRTcWwoKSB7XG4gICAgbGV0IHNxbCA9ICdpbnNlcnQgYnVsayAnICsgdGhpcy50YWJsZSArICcoJztcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGhpcy5jb2x1bW5zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBjID0gdGhpcy5jb2x1bW5zW2ldO1xuICAgICAgaWYgKGkgIT09IDApIHtcbiAgICAgICAgc3FsICs9ICcsICc7XG4gICAgICB9XG4gICAgICBzcWwgKz0gJ1snICsgYy5uYW1lICsgJ10gJyArIChjLnR5cGUuZGVjbGFyYXRpb24oYykpO1xuICAgIH1cbiAgICBzcWwgKz0gJyknO1xuXG4gICAgc3FsICs9IHRoaXMuZ2V0T3B0aW9uc1NxbCgpO1xuICAgIHJldHVybiBzcWw7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBzaW1wbHkgYSBoZWxwZXIgdXRpbGl0eSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGEgYENSRUFURSBUQUJMRSBTUUxgIHN0YXRlbWVudCBiYXNlZCBvbiB0aGUgY29sdW1ucyBhZGRlZCB0byB0aGUgYnVsa0xvYWQgb2JqZWN0LlxuICAgKiBUaGlzIG1heSBiZSBwYXJ0aWN1bGFybHkgaGFuZHkgd2hlbiB5b3Ugd2FudCB0byBpbnNlcnQgaW50byBhIHRlbXBvcmFyeSB0YWJsZSAoYSB0YWJsZSB3aGljaCBzdGFydHMgd2l0aCBgI2ApLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiB2YXIgc3FsID0gYnVsa0xvYWQuZ2V0VGFibGVDcmVhdGlvblNxbCgpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQSBzaWRlIG5vdGUgb24gYnVsayBpbnNlcnRpbmcgaW50byB0ZW1wb3JhcnkgdGFibGVzOiBpZiB5b3Ugd2FudCB0byBhY2Nlc3MgYSBsb2NhbCB0ZW1wb3JhcnkgdGFibGUgYWZ0ZXIgZXhlY3V0aW5nIHRoZSBidWxrIGxvYWQsXG4gICAqIHlvdSdsbCBuZWVkIHRvIHVzZSB0aGUgc2FtZSBjb25uZWN0aW9uIGFuZCBleGVjdXRlIHlvdXIgcmVxdWVzdHMgdXNpbmcgW1tDb25uZWN0aW9uLmV4ZWNTcWxCYXRjaF1dIGluc3RlYWQgb2YgW1tDb25uZWN0aW9uLmV4ZWNTcWxdXVxuICAgKi9cbiAgZ2V0VGFibGVDcmVhdGlvblNxbCgpIHtcbiAgICBsZXQgc3FsID0gJ0NSRUFURSBUQUJMRSAnICsgdGhpcy50YWJsZSArICcoXFxuJztcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGhpcy5jb2x1bW5zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBjID0gdGhpcy5jb2x1bW5zW2ldO1xuICAgICAgaWYgKGkgIT09IDApIHtcbiAgICAgICAgc3FsICs9ICcsXFxuJztcbiAgICAgIH1cbiAgICAgIHNxbCArPSAnWycgKyBjLm5hbWUgKyAnXSAnICsgKGMudHlwZS5kZWNsYXJhdGlvbihjKSk7XG4gICAgICBpZiAoYy5udWxsYWJsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNxbCArPSAnICcgKyAoYy5udWxsYWJsZSA/ICdOVUxMJyA6ICdOT1QgTlVMTCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBzcWwgKz0gJ1xcbiknO1xuICAgIHJldHVybiBzcWw7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGdldENvbE1ldGFEYXRhKCkge1xuICAgIGNvbnN0IHRCdWYgPSBuZXcgV3JpdGFibGVUcmFja2luZ0J1ZmZlcigxMDAsIG51bGwsIHRydWUpO1xuICAgIC8vIFRva2VuVHlwZVxuICAgIHRCdWYud3JpdGVVSW50OChUT0tFTl9UWVBFLkNPTE1FVEFEQVRBKTtcbiAgICAvLyBDb3VudFxuICAgIHRCdWYud3JpdGVVSW50MTZMRSh0aGlzLmNvbHVtbnMubGVuZ3RoKTtcblxuICAgIGZvciAobGV0IGogPSAwLCBsZW4gPSB0aGlzLmNvbHVtbnMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgIGNvbnN0IGMgPSB0aGlzLmNvbHVtbnNbal07XG4gICAgICAvLyBVc2VyVHlwZVxuICAgICAgaWYgKHRoaXMub3B0aW9ucy50ZHNWZXJzaW9uIDwgJzdfMicpIHtcbiAgICAgICAgdEJ1Zi53cml0ZVVJbnQxNkxFKDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdEJ1Zi53cml0ZVVJbnQzMkxFKDApO1xuICAgICAgfVxuXG4gICAgICAvLyBGbGFnc1xuICAgICAgbGV0IGZsYWdzID0gRkxBR1MudXBkYXRlYWJsZVJlYWRXcml0ZTtcbiAgICAgIGlmIChjLm51bGxhYmxlKSB7XG4gICAgICAgIGZsYWdzIHw9IEZMQUdTLm51bGxhYmxlO1xuICAgICAgfSBlbHNlIGlmIChjLm51bGxhYmxlID09PSB1bmRlZmluZWQgJiYgdGhpcy5vcHRpb25zLnRkc1ZlcnNpb24gPj0gJzdfMicpIHtcbiAgICAgICAgZmxhZ3MgfD0gRkxBR1MubnVsbGFibGVVbmtub3duO1xuICAgICAgfVxuICAgICAgdEJ1Zi53cml0ZVVJbnQxNkxFKGZsYWdzKTtcblxuICAgICAgLy8gVFlQRV9JTkZPXG4gICAgICB0QnVmLndyaXRlQnVmZmVyKGMudHlwZS5nZW5lcmF0ZVR5cGVJbmZvKGMsIHRoaXMub3B0aW9ucykpO1xuXG4gICAgICAvLyBUYWJsZU5hbWVcbiAgICAgIGlmIChjLnR5cGUuaGFzVGFibGVOYW1lKSB7XG4gICAgICAgIHRCdWYud3JpdGVVc1ZhcmNoYXIodGhpcy50YWJsZSwgJ3VjczInKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29sTmFtZVxuICAgICAgdEJ1Zi53cml0ZUJWYXJjaGFyKGMubmFtZSwgJ3VjczInKTtcbiAgICB9XG4gICAgcmV0dXJuIHRCdWYuZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGEgdGltZW91dCBmb3IgdGhpcyBidWxrIGxvYWQuXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGJ1bGtMb2FkLnNldFRpbWVvdXQodGltZW91dCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gdGltZW91dCBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIGJ1bGsgbG9hZCBpcyBjb25zaWRlcmVkIGZhaWxlZCwgb3IgMCBmb3Igbm8gdGltZW91dC5cbiAgICogICBXaGVuIG5vIHRpbWVvdXQgaXMgc2V0IGZvciB0aGUgYnVsayBsb2FkLCB0aGUgW1tDb25uZWN0aW9uT3B0aW9ucy5yZXF1ZXN0VGltZW91dF1dIG9mIHRoZSBDb25uZWN0aW9uIGlzIHVzZWQuXG4gICAqL1xuICBzZXRUaW1lb3V0KHRpbWVvdXQ/OiBudW1iZXIpIHtcbiAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjcmVhdGVEb25lVG9rZW4oKSB7XG4gICAgLy8gSXQgbWlnaHQgYmUgbmljZSB0byBtYWtlIERvbmVUb2tlbiBhIGNsYXNzIGlmIGFueXRoaW5nIG5lZWRzIHRvIGNyZWF0ZSB0aGVtLCBidXQgZm9yIG5vdywganVzdCBkbyBpdCBoZXJlXG4gICAgY29uc3QgdEJ1ZiA9IG5ldyBXcml0YWJsZVRyYWNraW5nQnVmZmVyKHRoaXMub3B0aW9ucy50ZHNWZXJzaW9uIDwgJzdfMicgPyA5IDogMTMpO1xuICAgIHRCdWYud3JpdGVVSW50OChUT0tFTl9UWVBFLkRPTkUpO1xuICAgIGNvbnN0IHN0YXR1cyA9IERPTkVfU1RBVFVTLkZJTkFMO1xuICAgIHRCdWYud3JpdGVVSW50MTZMRShzdGF0dXMpO1xuICAgIHRCdWYud3JpdGVVSW50MTZMRSgwKTsgLy8gQ3VyQ21kIChURFMgaWdub3JlcyB0aGlzKVxuICAgIHRCdWYud3JpdGVVSW50MzJMRSgwKTsgLy8gcm93IGNvdW50IC0gZG9lc24ndCByZWFsbHkgbWF0dGVyXG4gICAgaWYgKHRoaXMub3B0aW9ucy50ZHNWZXJzaW9uID49ICc3XzInKSB7XG4gICAgICB0QnVmLndyaXRlVUludDMyTEUoMCk7IC8vIHJvdyBjb3VudCBpcyA2NCBiaXRzIGluID49IFREUyA3LjJcbiAgICB9XG4gICAgcmV0dXJuIHRCdWYuZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2FuY2VsKCkge1xuICAgIGlmICh0aGlzLmNhbmNlbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jYW5jZWxlZCA9IHRydWU7XG4gICAgdGhpcy5lbWl0KCdjYW5jZWwnKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBCdWxrTG9hZDtcbm1vZHVsZS5leHBvcnRzID0gQnVsa0xvYWQ7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFHQTs7QUFDQTs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBLE1BQU1BLEtBQUssR0FBRztFQUNaQyxRQUFRLEVBQUUsS0FBSyxDQURIO0VBRVpDLE9BQU8sRUFBRSxLQUFLLENBRkY7RUFHWkMsbUJBQW1CLEVBQUUsS0FBSyxDQUhkO0VBSVpDLGlCQUFpQixFQUFFLEtBQUssQ0FKWjtFQUtaQyxRQUFRLEVBQUUsS0FBSyxDQUxIO0VBTVpDLFFBQVEsRUFBRSxLQUFLLENBTkg7RUFNTTtFQUNsQkMsZUFBZSxFQUFFLEtBQUssQ0FQVjtFQU9hO0VBQ3pCQyxlQUFlLEVBQUUsS0FBSyxFQVJWO0VBUWM7RUFDMUJDLE1BQU0sRUFBRSxLQUFLLEVBVEQ7RUFTSztFQUNqQkMsR0FBRyxFQUFFLEtBQUssRUFWRTtFQVVFO0VBQ2RDLGVBQWUsRUFBRSxLQUFLLEVBWFYsQ0FXYTs7QUFYYixDQUFkO0FBY0E7QUFDQTtBQUNBOztBQUNBLE1BQU1DLFdBQVcsR0FBRztFQUNsQkMsS0FBSyxFQUFFLElBRFc7RUFFbEJDLElBQUksRUFBRSxHQUZZO0VBR2xCQyxLQUFLLEVBQUUsR0FIVztFQUlsQkMsTUFBTSxFQUFFLEdBSlU7RUFLbEJDLEtBQUssRUFBRSxJQUxXO0VBTWxCQyxJQUFJLEVBQUUsSUFOWTtFQU9sQkMsUUFBUSxFQUFFO0FBUFEsQ0FBcEI7QUFVQTtBQUNBO0FBQ0E7O0FBaUZBLE1BQU1DLGNBQWMsR0FBR0MsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBRUMsWUFBV0MsR0FBYixDQUFaLENBQXZCO0FBQ0EsTUFBTUMsNkJBQTZCLEdBQUdKLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQ2hEO0FBQ0EsSUFGZ0QsRUFJaEQ7QUFDQSxJQUxnRCxFQUsxQyxJQUwwQyxFQUtwQyxJQUxvQyxFQUs5QixJQUw4QixFQUt4QixJQUx3QixFQUtsQixJQUxrQixFQUtaLElBTFksRUFLTixJQUxNLEVBS0EsSUFMQSxFQUtNLElBTE4sRUFLWSxJQUxaLEVBS2tCLElBTGxCLEVBS3dCLElBTHhCLEVBSzhCLElBTDlCLEVBS29DLElBTHBDLEVBSzBDLElBTDFDLEVBT2hEO0FBQ0EsSUFSZ0QsRUFRMUMsSUFSMEMsRUFRcEMsSUFSb0MsRUFROUIsSUFSOEIsRUFReEIsSUFSd0IsRUFRbEIsSUFSa0IsRUFRWixJQVJZLEVBUU4sSUFSTSxDQUFaLENBQXRDO0FBVUEsTUFBTUkscUJBQXFCLEdBQUdMLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxDQUFaLENBQTlCLEMsQ0FFQTs7QUFDQSxNQUFNSyxZQUFOLFNBQTJCQyxpQkFBM0IsQ0FBcUM7RUFDbkM7QUFDRjtBQUNBOztFQUVFO0FBQ0Y7QUFDQTs7RUFFRTtBQUNGO0FBQ0E7O0VBRUU7QUFDRjtBQUNBOztFQUdFO0FBQ0Y7QUFDQTtFQUNFQyxXQUFXLENBQUNDLFFBQUQsRUFBcUI7SUFDOUIsTUFBTTtNQUFFQyxrQkFBa0IsRUFBRTtJQUF0QixDQUFOO0lBRDhCLEtBakJoQ0MscUJBaUJnQztJQUFBLEtBYmhDRixRQWFnQztJQUFBLEtBVGhDRyxXQVNnQztJQUFBLEtBTGhDQyxPQUtnQztJQUc5QixLQUFLSixRQUFMLEdBQWdCQSxRQUFoQjtJQUNBLEtBQUtHLFdBQUwsR0FBbUJILFFBQVEsQ0FBQ0ssT0FBNUI7SUFDQSxLQUFLRCxPQUFMLEdBQWVKLFFBQVEsQ0FBQ0ksT0FBeEI7SUFFQSxLQUFLRixxQkFBTCxHQUE2QixLQUE3QjtFQUNEO0VBRUQ7QUFDRjtBQUNBOzs7RUFDRUksVUFBVSxDQUFDQyxHQUFELEVBQXVEQyxTQUF2RCxFQUEwRUMsUUFBMUUsRUFBNkc7SUFDckgsSUFBSSxDQUFDLEtBQUtQLHFCQUFWLEVBQWlDO01BQy9CLEtBQUtRLElBQUwsQ0FBVSxLQUFLVixRQUFMLENBQWNXLGNBQWQsRUFBVjtNQUNBLEtBQUtULHFCQUFMLEdBQTZCLElBQTdCO0lBQ0Q7O0lBRUQsS0FBS1EsSUFBTCxDQUFVcEIsY0FBVjs7SUFFQSxLQUFLLElBQUlzQixDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHLEtBQUtSLE9BQUwsQ0FBYVMsTUFBakMsRUFBeUNELENBQUMsRUFBMUMsRUFBOEM7TUFDNUMsTUFBTUUsQ0FBQyxHQUFHLEtBQUtWLE9BQUwsQ0FBYVEsQ0FBYixDQUFWO01BQ0EsSUFBSUcsS0FBSyxHQUFHQyxLQUFLLENBQUNDLE9BQU4sQ0FBY1YsR0FBZCxJQUFxQkEsR0FBRyxDQUFDSyxDQUFELENBQXhCLEdBQThCTCxHQUFHLENBQUNPLENBQUMsQ0FBQ0ksT0FBSCxDQUE3Qzs7TUFFQSxJQUFJLENBQUMsS0FBS2xCLFFBQUwsQ0FBY21CLGVBQW5CLEVBQW9DO1FBQ2xDLElBQUk7VUFDRkosS0FBSyxHQUFHRCxDQUFDLENBQUNNLElBQUYsQ0FBT0MsUUFBUCxDQUFnQk4sS0FBaEIsRUFBdUJELENBQUMsQ0FBQ1EsU0FBekIsQ0FBUjtRQUNELENBRkQsQ0FFRSxPQUFPQyxLQUFQLEVBQW1CO1VBQ25CLE9BQU9kLFFBQVEsQ0FBQ2MsS0FBRCxDQUFmO1FBQ0Q7TUFDRjs7TUFFRCxNQUFNQyxTQUFTLEdBQUc7UUFDaEJYLE1BQU0sRUFBRUMsQ0FBQyxDQUFDRCxNQURNO1FBRWhCWSxLQUFLLEVBQUVYLENBQUMsQ0FBQ1csS0FGTztRQUdoQkMsU0FBUyxFQUFFWixDQUFDLENBQUNZLFNBSEc7UUFJaEJYLEtBQUssRUFBRUE7TUFKUyxDQUFsQjs7TUFPQSxJQUFJRCxDQUFDLENBQUNNLElBQUYsQ0FBT08sSUFBUCxLQUFnQixNQUFoQixJQUEwQmIsQ0FBQyxDQUFDTSxJQUFGLENBQU9PLElBQVAsS0FBZ0IsT0FBMUMsSUFBcURiLENBQUMsQ0FBQ00sSUFBRixDQUFPTyxJQUFQLEtBQWdCLE9BQXpFLEVBQWtGO1FBQ2hGLElBQUlaLEtBQUssSUFBSSxJQUFiLEVBQW1CO1VBQ2pCLEtBQUtMLElBQUwsQ0FBVWQscUJBQVY7VUFDQTtRQUNEOztRQUVELEtBQUtjLElBQUwsQ0FBVWYsNkJBQVY7TUFDRDs7TUFFRCxLQUFLZSxJQUFMLENBQVVJLENBQUMsQ0FBQ00sSUFBRixDQUFPUSx1QkFBUCxDQUErQkosU0FBL0IsRUFBMEMsS0FBS3JCLFdBQS9DLENBQVY7O01BQ0EsS0FBSyxNQUFNMEIsS0FBWCxJQUFvQmYsQ0FBQyxDQUFDTSxJQUFGLENBQU9VLHFCQUFQLENBQTZCTixTQUE3QixFQUF3QyxLQUFLckIsV0FBN0MsQ0FBcEIsRUFBK0U7UUFDN0UsS0FBS08sSUFBTCxDQUFVbUIsS0FBVjtNQUNEO0lBQ0Y7O0lBRURFLE9BQU8sQ0FBQ0MsUUFBUixDQUFpQnZCLFFBQWpCO0VBQ0Q7RUFFRDtBQUNGO0FBQ0E7OztFQUNFd0IsTUFBTSxDQUFDeEIsUUFBRCxFQUF1QjtJQUMzQixLQUFLQyxJQUFMLENBQVUsS0FBS1YsUUFBTCxDQUFja0MsZUFBZCxFQUFWO0lBRUFILE9BQU8sQ0FBQ0MsUUFBUixDQUFpQnZCLFFBQWpCO0VBQ0Q7O0FBdEZrQztBQXlGckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxNQUFNMEIsUUFBTixTQUF1QkMsb0JBQXZCLENBQW9DO0VBQ2xDO0FBQ0Y7QUFDQTs7RUFFRTtBQUNGO0FBQ0E7O0VBRUU7QUFDRjtBQUNBOztFQUVFO0FBQ0Y7QUFDQTs7RUFFRTtBQUNGO0FBQ0E7O0VBRUU7QUFDRjtBQUNBOztFQUdFO0FBQ0Y7QUFDQTs7RUFFRTtBQUNGO0FBQ0E7O0VBR0U7QUFDRjtBQUNBOztFQUVFO0FBQ0Y7QUFDQTs7RUFHRTtBQUNGO0FBQ0E7O0VBRUU7QUFDRjtBQUNBOztFQUdFO0FBQ0Y7QUFDQTs7RUFHRTtBQUNGO0FBQ0E7O0VBRUU7QUFDRjtBQUNBOztFQUVFO0FBQ0Y7QUFDQTs7RUFFRTtBQUNGO0FBQ0E7O0VBS0U7QUFDRjtBQUNBO0VBQ0VyQyxXQUFXLENBQUNzQyxLQUFELEVBQWdCZixTQUFoQixFQUFrRGdCLGlCQUFsRCxFQUFnRztJQUN6R0MsZ0JBQWdCLEdBQUcsS0FEc0Y7SUFFekdDLFlBQVksR0FBRyxLQUYwRjtJQUd6R0MsU0FBUyxHQUFHLEtBSDZGO0lBSXpHQyxTQUFTLEdBQUcsS0FKNkY7SUFLekdDLEtBQUssR0FBRztFQUxpRyxDQUFoRyxFQU1DbEMsUUFORCxFQU1xQjtJQUM5QixJQUFJLE9BQU84QixnQkFBUCxLQUE0QixTQUFoQyxFQUEyQztNQUN6QyxNQUFNLElBQUlLLFNBQUosQ0FBYyxrRUFBZCxDQUFOO0lBQ0Q7O0lBRUQsSUFBSSxPQUFPSixZQUFQLEtBQXdCLFNBQTVCLEVBQXVDO01BQ3JDLE1BQU0sSUFBSUksU0FBSixDQUFjLDhEQUFkLENBQU47SUFDRDs7SUFFRCxJQUFJLE9BQU9ILFNBQVAsS0FBcUIsU0FBekIsRUFBb0M7TUFDbEMsTUFBTSxJQUFJRyxTQUFKLENBQWMsMkRBQWQsQ0FBTjtJQUNEOztJQUVELElBQUksT0FBT0YsU0FBUCxLQUFxQixTQUF6QixFQUFvQztNQUNsQyxNQUFNLElBQUlFLFNBQUosQ0FBYywyREFBZCxDQUFOO0lBQ0Q7O0lBRUQsSUFBSSxPQUFPRCxLQUFQLEtBQWlCLFFBQWpCLElBQTZCQSxLQUFLLEtBQUssSUFBM0MsRUFBaUQ7TUFDL0MsTUFBTSxJQUFJQyxTQUFKLENBQWMsc0RBQWQsQ0FBTjtJQUNEOztJQUVELEtBQUssTUFBTSxDQUFDQyxNQUFELEVBQVNDLFNBQVQsQ0FBWCxJQUFrQ0MsTUFBTSxDQUFDQyxPQUFQLENBQWVMLEtBQWYsQ0FBbEMsRUFBeUQ7TUFDdkQsSUFBSUcsU0FBUyxLQUFLLEtBQWQsSUFBdUJBLFNBQVMsS0FBSyxNQUF6QyxFQUFpRDtRQUMvQyxNQUFNLElBQUlGLFNBQUosQ0FBYyx1QkFBdUJDLE1BQXZCLEdBQWdDLHFFQUE5QyxDQUFOO01BQ0Q7SUFDRjs7SUFFRDtJQTNCOEIsS0FsRmhDdEIsS0FrRmdDO0lBQUEsS0E5RWhDMEIsUUE4RWdDO0lBQUEsS0ExRWhDQyxnQkEwRWdDO0lBQUEsS0F0RWhDQyxhQXNFZ0M7SUFBQSxLQWxFaENkLEtBa0VnQztJQUFBLEtBOURoQ2UsT0E4RGdDO0lBQUEsS0F6RGhDL0MsT0F5RGdDO0lBQUEsS0FyRGhDSSxRQXFEZ0M7SUFBQSxLQWhEaENMLE9BZ0RnQztJQUFBLEtBNUNoQ2lELGFBNENnQztJQUFBLEtBdkNoQ2xDLGVBdUNnQztJQUFBLEtBbkNoQ21DLG9CQW1DZ0M7SUFBQSxLQTlCaENDLFdBOEJnQztJQUFBLEtBekJoQ0MsVUF5QmdDO0lBQUEsS0FyQmhDQyxJQXFCZ0M7SUFBQSxLQWpCaENDLEdBaUJnQztJQUFBLEtBYmhDQyxRQWFnQztJQUFBLEtBWGhDckMsU0FXZ0M7SUE2QjlCLEtBQUtDLEtBQUwsR0FBYXFDLFNBQWI7SUFDQSxLQUFLWCxRQUFMLEdBQWdCLEtBQWhCO0lBQ0EsS0FBS0MsZ0JBQUwsR0FBd0IsS0FBeEI7SUFFQSxLQUFLNUIsU0FBTCxHQUFpQkEsU0FBakI7SUFFQSxLQUFLZSxLQUFMLEdBQWFBLEtBQWI7SUFDQSxLQUFLaEMsT0FBTCxHQUFlaUMsaUJBQWY7SUFDQSxLQUFLN0IsUUFBTCxHQUFnQkEsUUFBaEI7SUFDQSxLQUFLTCxPQUFMLEdBQWUsRUFBZjtJQUNBLEtBQUtpRCxhQUFMLEdBQXFCLEVBQXJCO0lBQ0EsS0FBS2xDLGVBQUwsR0FBdUIsS0FBdkI7SUFDQSxLQUFLZ0MsYUFBTCxHQUFxQixLQUFyQjtJQUVBLEtBQUtHLG9CQUFMLEdBQTRCLElBQUl6RCxZQUFKLENBQWlCLElBQWpCLENBQTVCLENBM0M4QixDQTJDc0I7O0lBRXBELEtBQUswRCxXQUFMLEdBQW1CO01BQUVoQixnQkFBRjtNQUFvQkMsWUFBcEI7TUFBa0NDLFNBQWxDO01BQTZDQyxTQUE3QztNQUF3REM7SUFBeEQsQ0FBbkI7RUFDRDtFQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7RUFDRWtCLFNBQVMsQ0FBQ2xDLElBQUQsRUFBZVAsSUFBZixFQUErQjtJQUFFMEMsTUFBTSxHQUFHLEtBQVg7SUFBa0JqRCxNQUFsQjtJQUEwQmEsU0FBMUI7SUFBcUNELEtBQXJDO0lBQTRDUCxPQUFPLEdBQUdTLElBQXREO0lBQTREeEQsUUFBUSxHQUFHO0VBQXZFLENBQS9CLEVBQTZIO0lBQ3BJLElBQUksS0FBS2dELGVBQVQsRUFBMEI7TUFDeEIsTUFBTSxJQUFJNEMsS0FBSixDQUFVLDhFQUFWLENBQU47SUFDRDs7SUFDRCxJQUFJLEtBQUtiLGdCQUFULEVBQTJCO01BQ3pCLE1BQU0sSUFBSWEsS0FBSixDQUFVLHFFQUFWLENBQU47SUFDRDs7SUFFRCxNQUFNbEIsTUFBYyxHQUFHO01BQ3JCekIsSUFBSSxFQUFFQSxJQURlO01BRXJCTyxJQUFJLEVBQUVBLElBRmU7TUFHckJaLEtBQUssRUFBRSxJQUhjO01BSXJCK0MsTUFBTSxFQUFFQSxNQUphO01BS3JCakQsTUFBTSxFQUFFQSxNQUxhO01BTXJCYSxTQUFTLEVBQUVBLFNBTlU7TUFPckJELEtBQUssRUFBRUEsS0FQYztNQVFyQlAsT0FBTyxFQUFFQSxPQVJZO01BU3JCL0MsUUFBUSxFQUFFQSxRQVRXO01BVXJCbUQsU0FBUyxFQUFFLEtBQUtBO0lBVkssQ0FBdkI7O0lBYUEsSUFBSSxDQUFDRixJQUFJLENBQUM0QyxFQUFMLEdBQVUsSUFBWCxNQUFxQixJQUF6QixFQUErQjtNQUM3QixJQUFJbkIsTUFBTSxDQUFDaEMsTUFBUCxJQUFpQixJQUFqQixJQUF5Qk8sSUFBSSxDQUFDNkMsYUFBbEMsRUFBaUQ7UUFDL0NwQixNQUFNLENBQUNoQyxNQUFQLEdBQWdCTyxJQUFJLENBQUM2QyxhQUFMLENBQW1CcEIsTUFBbkIsQ0FBaEI7TUFDRDtJQUNGOztJQUVELElBQUl6QixJQUFJLENBQUM4QyxnQkFBTCxJQUF5QnJCLE1BQU0sQ0FBQ25CLFNBQVAsSUFBb0IsSUFBakQsRUFBdUQ7TUFDckRtQixNQUFNLENBQUNuQixTQUFQLEdBQW1CTixJQUFJLENBQUM4QyxnQkFBTCxDQUFzQnJCLE1BQXRCLENBQW5CO0lBQ0Q7O0lBRUQsSUFBSXpCLElBQUksQ0FBQytDLFlBQUwsSUFBcUJ0QixNQUFNLENBQUNwQixLQUFQLElBQWdCLElBQXpDLEVBQStDO01BQzdDb0IsTUFBTSxDQUFDcEIsS0FBUCxHQUFlTCxJQUFJLENBQUMrQyxZQUFMLENBQWtCdEIsTUFBbEIsQ0FBZjtJQUNEOztJQUVELEtBQUt6QyxPQUFMLENBQWFNLElBQWIsQ0FBa0JtQyxNQUFsQjtJQUVBLEtBQUtRLGFBQUwsQ0FBbUIxQixJQUFuQixJQUEyQmtCLE1BQTNCO0VBQ0Q7RUFFRDtBQUNGO0FBQ0E7OztFQUNFdUIsYUFBYSxHQUFHO0lBQ2QsTUFBTUMsVUFBVSxHQUFHLEVBQW5COztJQUVBLElBQUksS0FBS2QsV0FBTCxDQUFpQmhCLGdCQUFyQixFQUF1QztNQUNyQzhCLFVBQVUsQ0FBQzNELElBQVgsQ0FBZ0IsbUJBQWhCO0lBQ0Q7O0lBRUQsSUFBSSxLQUFLNkMsV0FBTCxDQUFpQmYsWUFBckIsRUFBbUM7TUFDakM2QixVQUFVLENBQUMzRCxJQUFYLENBQWdCLGVBQWhCO0lBQ0Q7O0lBRUQsSUFBSSxLQUFLNkMsV0FBTCxDQUFpQmQsU0FBckIsRUFBZ0M7TUFDOUI0QixVQUFVLENBQUMzRCxJQUFYLENBQWdCLFlBQWhCO0lBQ0Q7O0lBRUQsSUFBSSxLQUFLNkMsV0FBTCxDQUFpQmIsU0FBckIsRUFBZ0M7TUFDOUIyQixVQUFVLENBQUMzRCxJQUFYLENBQWdCLFNBQWhCO0lBQ0Q7O0lBRUQsSUFBSSxLQUFLNkMsV0FBTCxDQUFpQlosS0FBckIsRUFBNEI7TUFDMUIsTUFBTTJCLFlBQVksR0FBRyxFQUFyQjs7TUFFQSxLQUFLLE1BQU0sQ0FBQ3pCLE1BQUQsRUFBU0MsU0FBVCxDQUFYLElBQWtDQyxNQUFNLENBQUNDLE9BQVAsQ0FBZSxLQUFLTyxXQUFMLENBQWlCWixLQUFoQyxDQUFsQyxFQUEwRTtRQUN4RTJCLFlBQVksQ0FBQzVELElBQWIsQ0FBbUIsR0FBRW1DLE1BQU8sSUFBR0MsU0FBVSxFQUF6QztNQUNEOztNQUVELElBQUl3QixZQUFZLENBQUN6RCxNQUFqQixFQUF5QjtRQUN2QndELFVBQVUsQ0FBQzNELElBQVgsQ0FBaUIsVUFBUzRELFlBQVksQ0FBQ0MsSUFBYixDQUFrQixJQUFsQixDQUF3QixHQUFsRDtNQUNEO0lBQ0Y7O0lBRUQsSUFBSUYsVUFBVSxDQUFDeEQsTUFBWCxHQUFvQixDQUF4QixFQUEyQjtNQUN6QixPQUFRLFVBQVN3RCxVQUFVLENBQUNFLElBQVgsQ0FBZ0IsR0FBaEIsQ0FBcUIsR0FBdEM7SUFDRCxDQUZELE1BRU87TUFDTCxPQUFPLEVBQVA7SUFDRDtFQUNGO0VBRUQ7QUFDRjtBQUNBOzs7RUFDRUMsZ0JBQWdCLEdBQUc7SUFDakIsSUFBSUMsR0FBRyxHQUFHLGlCQUFpQixLQUFLcEMsS0FBdEIsR0FBOEIsR0FBeEM7O0lBQ0EsS0FBSyxJQUFJekIsQ0FBQyxHQUFHLENBQVIsRUFBVzhELEdBQUcsR0FBRyxLQUFLdEUsT0FBTCxDQUFhUyxNQUFuQyxFQUEyQ0QsQ0FBQyxHQUFHOEQsR0FBL0MsRUFBb0Q5RCxDQUFDLEVBQXJELEVBQXlEO01BQ3ZELE1BQU1FLENBQUMsR0FBRyxLQUFLVixPQUFMLENBQWFRLENBQWIsQ0FBVjs7TUFDQSxJQUFJQSxDQUFDLEtBQUssQ0FBVixFQUFhO1FBQ1g2RCxHQUFHLElBQUksSUFBUDtNQUNEOztNQUNEQSxHQUFHLElBQUksTUFBTTNELENBQUMsQ0FBQ2EsSUFBUixHQUFlLElBQWYsR0FBdUJiLENBQUMsQ0FBQ00sSUFBRixDQUFPdUQsV0FBUCxDQUFtQjdELENBQW5CLENBQTlCO0lBQ0Q7O0lBQ0QyRCxHQUFHLElBQUksR0FBUDtJQUVBQSxHQUFHLElBQUksS0FBS0wsYUFBTCxFQUFQO0lBQ0EsT0FBT0ssR0FBUDtFQUNEO0VBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0VBQ0VHLG1CQUFtQixHQUFHO0lBQ3BCLElBQUlILEdBQUcsR0FBRyxrQkFBa0IsS0FBS3BDLEtBQXZCLEdBQStCLEtBQXpDOztJQUNBLEtBQUssSUFBSXpCLENBQUMsR0FBRyxDQUFSLEVBQVc4RCxHQUFHLEdBQUcsS0FBS3RFLE9BQUwsQ0FBYVMsTUFBbkMsRUFBMkNELENBQUMsR0FBRzhELEdBQS9DLEVBQW9EOUQsQ0FBQyxFQUFyRCxFQUF5RDtNQUN2RCxNQUFNRSxDQUFDLEdBQUcsS0FBS1YsT0FBTCxDQUFhUSxDQUFiLENBQVY7O01BQ0EsSUFBSUEsQ0FBQyxLQUFLLENBQVYsRUFBYTtRQUNYNkQsR0FBRyxJQUFJLEtBQVA7TUFDRDs7TUFDREEsR0FBRyxJQUFJLE1BQU0zRCxDQUFDLENBQUNhLElBQVIsR0FBZSxJQUFmLEdBQXVCYixDQUFDLENBQUNNLElBQUYsQ0FBT3VELFdBQVAsQ0FBbUI3RCxDQUFuQixDQUE5Qjs7TUFDQSxJQUFJQSxDQUFDLENBQUMzQyxRQUFGLEtBQWV5RixTQUFuQixFQUE4QjtRQUM1QmEsR0FBRyxJQUFJLE9BQU8zRCxDQUFDLENBQUMzQyxRQUFGLEdBQWEsTUFBYixHQUFzQixVQUE3QixDQUFQO01BQ0Q7SUFDRjs7SUFDRHNHLEdBQUcsSUFBSSxLQUFQO0lBQ0EsT0FBT0EsR0FBUDtFQUNEO0VBRUQ7QUFDRjtBQUNBOzs7RUFDRTlELGNBQWMsR0FBRztJQUNmLE1BQU1rRSxJQUFJLEdBQUcsSUFBSUMsK0JBQUosQ0FBMkIsR0FBM0IsRUFBZ0MsSUFBaEMsRUFBc0MsSUFBdEMsQ0FBYixDQURlLENBRWY7O0lBQ0FELElBQUksQ0FBQ0UsVUFBTCxDQUFnQnRGLFlBQVd1RixXQUEzQixFQUhlLENBSWY7O0lBQ0FILElBQUksQ0FBQ0ksYUFBTCxDQUFtQixLQUFLN0UsT0FBTCxDQUFhUyxNQUFoQzs7SUFFQSxLQUFLLElBQUlxRSxDQUFDLEdBQUcsQ0FBUixFQUFXUixHQUFHLEdBQUcsS0FBS3RFLE9BQUwsQ0FBYVMsTUFBbkMsRUFBMkNxRSxDQUFDLEdBQUdSLEdBQS9DLEVBQW9EUSxDQUFDLEVBQXJELEVBQXlEO01BQ3ZELE1BQU1wRSxDQUFDLEdBQUcsS0FBS1YsT0FBTCxDQUFhOEUsQ0FBYixDQUFWLENBRHVELENBRXZEOztNQUNBLElBQUksS0FBSzdFLE9BQUwsQ0FBYThFLFVBQWIsR0FBMEIsS0FBOUIsRUFBcUM7UUFDbkNOLElBQUksQ0FBQ0ksYUFBTCxDQUFtQixDQUFuQjtNQUNELENBRkQsTUFFTztRQUNMSixJQUFJLENBQUNPLGFBQUwsQ0FBbUIsQ0FBbkI7TUFDRCxDQVBzRCxDQVN2RDs7O01BQ0EsSUFBSUMsS0FBSyxHQUFHbkgsS0FBSyxDQUFDRyxtQkFBbEI7O01BQ0EsSUFBSXlDLENBQUMsQ0FBQzNDLFFBQU4sRUFBZ0I7UUFDZGtILEtBQUssSUFBSW5ILEtBQUssQ0FBQ0MsUUFBZjtNQUNELENBRkQsTUFFTyxJQUFJMkMsQ0FBQyxDQUFDM0MsUUFBRixLQUFleUYsU0FBZixJQUE0QixLQUFLdkQsT0FBTCxDQUFhOEUsVUFBYixJQUEyQixLQUEzRCxFQUFrRTtRQUN2RUUsS0FBSyxJQUFJbkgsS0FBSyxDQUFDVyxlQUFmO01BQ0Q7O01BQ0RnRyxJQUFJLENBQUNJLGFBQUwsQ0FBbUJJLEtBQW5CLEVBaEJ1RCxDQWtCdkQ7O01BQ0FSLElBQUksQ0FBQ1MsV0FBTCxDQUFpQnhFLENBQUMsQ0FBQ00sSUFBRixDQUFPbUUsZ0JBQVAsQ0FBd0J6RSxDQUF4QixFQUEyQixLQUFLVCxPQUFoQyxDQUFqQixFQW5CdUQsQ0FxQnZEOztNQUNBLElBQUlTLENBQUMsQ0FBQ00sSUFBRixDQUFPb0UsWUFBWCxFQUF5QjtRQUN2QlgsSUFBSSxDQUFDWSxjQUFMLENBQW9CLEtBQUtwRCxLQUF6QixFQUFnQyxNQUFoQztNQUNELENBeEJzRCxDQTBCdkQ7OztNQUNBd0MsSUFBSSxDQUFDYSxhQUFMLENBQW1CNUUsQ0FBQyxDQUFDYSxJQUFyQixFQUEyQixNQUEzQjtJQUNEOztJQUNELE9BQU9rRCxJQUFJLENBQUNjLElBQVo7RUFDRDtFQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7RUFDRUMsVUFBVSxDQUFDeEMsT0FBRCxFQUFtQjtJQUMzQixLQUFLQSxPQUFMLEdBQWVBLE9BQWY7RUFDRDtFQUVEO0FBQ0Y7QUFDQTs7O0VBQ0VsQixlQUFlLEdBQUc7SUFDaEI7SUFDQSxNQUFNMkMsSUFBSSxHQUFHLElBQUlDLCtCQUFKLENBQTJCLEtBQUt6RSxPQUFMLENBQWE4RSxVQUFiLEdBQTBCLEtBQTFCLEdBQWtDLENBQWxDLEdBQXNDLEVBQWpFLENBQWI7SUFDQU4sSUFBSSxDQUFDRSxVQUFMLENBQWdCdEYsWUFBV29HLElBQTNCO0lBQ0EsTUFBTUMsTUFBTSxHQUFHaEgsV0FBVyxDQUFDQyxLQUEzQjtJQUNBOEYsSUFBSSxDQUFDSSxhQUFMLENBQW1CYSxNQUFuQjtJQUNBakIsSUFBSSxDQUFDSSxhQUFMLENBQW1CLENBQW5CLEVBTmdCLENBTU87O0lBQ3ZCSixJQUFJLENBQUNPLGFBQUwsQ0FBbUIsQ0FBbkIsRUFQZ0IsQ0FPTzs7SUFDdkIsSUFBSSxLQUFLL0UsT0FBTCxDQUFhOEUsVUFBYixJQUEyQixLQUEvQixFQUFzQztNQUNwQ04sSUFBSSxDQUFDTyxhQUFMLENBQW1CLENBQW5CLEVBRG9DLENBQ2I7SUFDeEI7O0lBQ0QsT0FBT1AsSUFBSSxDQUFDYyxJQUFaO0VBQ0Q7RUFFRDtBQUNGO0FBQ0E7OztFQUNFSSxNQUFNLEdBQUc7SUFDUCxJQUFJLEtBQUs5QyxRQUFULEVBQW1CO01BQ2pCO0lBQ0Q7O0lBRUQsS0FBS0EsUUFBTCxHQUFnQixJQUFoQjtJQUNBLEtBQUsrQyxJQUFMLENBQVUsUUFBVjtFQUNEOztBQTFXaUM7O2VBNldyQjdELFE7O0FBQ2Y4RCxNQUFNLENBQUNDLE9BQVAsR0FBaUIvRCxRQUFqQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.codepageBySortId = exports.codepageByLanguageId = exports.Flags = exports.Collation = void 0;
// http://technet.microsoft.com/en-us/library/aa176553(v=sql.80).aspx
const codepageByLanguageId = {
  // Arabic_*
  [0x0401]: 'CP1256',
  // Chinese_Taiwan_Stroke_*
  // Chinese_Traditional_Stroke_Count_*
  // Chinese_Taiwan_Bopomofo_*
  // Chinese_Traditional_Bopomofo_*
  [0x0404]: 'CP950',
  // Czech_*
  [0x0405]: 'CP1250',
  // Danish_Greenlandic_*
  // Danish_Norwegian_*
  [0x0406]: 'CP1252',
  // Greek_*
  [0x0408]: 'CP1253',
  // Latin1_General_*
  [0x0409]: 'CP1252',
  // Traditional_Spanish_*
  [0x040A]: 'CP1252',
  // Finnish_Swedish_*
  [0x040B]: 'CP1252',
  // French_*
  [0x040C]: 'CP1252',
  // Hebrew_*
  [0x040D]: 'CP1255',
  // Hungarian_*
  // Hungarian_Technical_*
  [0x040E]: 'CP1250',
  // Icelandic_*
  [0x040F]: 'CP1252',
  // Japanese_*
  // Japanese_XJIS_*
  // Japanese_Unicode_*
  // Japanese_Bushu_Kakusu_*
  [0x0411]: 'CP932',
  // Korean_*
  // Korean_Wansung_*
  [0x0412]: 'CP949',
  // Norwegian_*
  [0x0414]: 'CP1252',
  // Polish_*
  [0x0415]: 'CP1250',
  // Romansh_*
  [0x0417]: 'CP1252',
  // Romanian_*
  [0x0418]: 'CP1250',
  // Cyrillic_*
  [0x0419]: 'CP1251',
  // Croatian_*
  [0x041A]: 'CP1250',
  // Slovak_*
  [0x041B]: 'CP1250',
  // Albanian_*
  [0x041C]: 'CP1250',
  // Thai_*
  [0x041E]: 'CP874',
  // Turkish_*
  [0x041F]: 'CP1254',
  // Urdu_*
  [0x0420]: 'CP1256',
  // Ukrainian_*
  [0x0422]: 'CP1251',
  // Slovenian_*
  [0x0424]: 'CP1250',
  // Estonian_*
  [0x0425]: 'CP1257',
  // Latvian_*
  [0x0426]: 'CP1257',
  // Lithuanian_*
  [0x0427]: 'CP1257',
  // Persian_*
  [0x0429]: 'CP1256',
  // Vietnamese_*
  [0x042A]: 'CP1258',
  // Azeri_Latin_*
  [0x042C]: 'CP1254',
  // Upper_Sorbian_*
  [0x042E]: 'CP1252',
  // Macedonian_FYROM_*
  [0x042F]: 'CP1251',
  // Sami_Norway_*
  [0x043B]: 'CP1252',
  // Kazakh_*
  [0x043F]: 'CP1251',
  // Turkmen_*
  [0x0442]: 'CP1250',
  // Uzbek_Latin_*
  [0x0443]: 'CP1254',
  // Tatar_*
  [0x0444]: 'CP1251',
  // Welsh_*
  [0x0452]: 'CP1252',
  // Frisian_*
  [0x0462]: 'CP1252',
  // Bashkir_*
  [0x046D]: 'CP1251',
  // Mapudungan_*
  [0x047A]: 'CP1252',
  // Mohawk_*
  [0x047C]: 'CP1252',
  // Breton_*
  [0x047E]: 'CP1252',
  // Uighur_*
  [0x0480]: 'CP1256',
  // Corsican_*
  [0x0483]: 'CP1252',
  // Yakut_*
  [0x0485]: 'CP1251',
  // Dari_*
  [0x048C]: 'CP1256',
  // Chinese_PRC_*
  // Chinese_Simplified_Pinyin_*
  // Chinese_PRC_Stroke_*
  // Chinese_Simplified_Stroke_Order_*
  [0x0804]: 'CP936',
  // Serbian_Latin_*
  [0x081A]: 'CP1250',
  // Azeri_Cyrillic_*
  [0x082C]: 'CP1251',
  // Sami_Sweden_Finland_*
  [0x083B]: 'CP1252',
  // Tamazight_*
  [0x085F]: 'CP1252',
  // Chinese_Hong_Kong_Stroke_*
  [0x0C04]: 'CP950',
  // Modern_Spanish_*
  [0x0C0A]: 'CP1252',
  // Serbian_Cyrillic_*
  [0x0C1A]: 'CP1251',
  // Chinese_Traditional_Pinyin_*
  // Chinese_Traditional_Stroke_Order_*
  [0x1404]: 'CP950',
  // Bosnian_Latin_*
  [0x141A]: 'CP1250',
  // Bosnian_Cyrillic_*
  [0x201A]: 'CP1251',
  // German
  // German_PhoneBook_*
  [0x0407]: 'CP1252',
  // Georgian_Modern_Sort_*
  [0x0437]: 'CP1252'
};
exports.codepageByLanguageId = codepageByLanguageId;
const codepageBySortId = {
  [30]: 'CP437',
  // SQL_Latin1_General_CP437_BIN
  [31]: 'CP437',
  // SQL_Latin1_General_CP437_CS_AS
  [32]: 'CP437',
  // SQL_Latin1_General_CP437_CI_AS
  [33]: 'CP437',
  // SQL_Latin1_General_Pref_CP437_CI_AS
  [34]: 'CP437',
  // SQL_Latin1_General_CP437_CI_AI
  [40]: 'CP850',
  // SQL_Latin1_General_CP850_BIN
  [41]: 'CP850',
  // SQL_Latin1_General_CP850_CS_AS
  [42]: 'CP850',
  // SQL_Latin1_General_CP850_CI_AS
  [43]: 'CP850',
  // SQL_Latin1_General_Pref_CP850_CI_AS
  [44]: 'CP850',
  // SQL_Latin1_General_CP850_CI_AI
  [49]: 'CP850',
  // SQL_1xCompat_CP850_CI_AS
  [51]: 'CP1252',
  // SQL_Latin1_General_Cp1_CS_AS_KI_WI
  [52]: 'CP1252',
  // SQL_Latin1_General_Cp1_CI_AS_KI_WI
  [53]: 'CP1252',
  // SQL_Latin1_General_Pref_Cp1_CI_AS_KI_WI
  [54]: 'CP1252',
  // SQL_Latin1_General_Cp1_CI_AI_KI_WI
  [55]: 'CP850',
  // SQL_AltDiction_CP850_CS_AS
  [56]: 'CP850',
  // SQL_AltDiction_Pref_CP850_CI_AS
  [57]: 'CP850',
  // SQL_AltDiction_CP850_CI_AI
  [58]: 'CP850',
  // SQL_Scandinavian_Pref_CP850_CI_AS
  [59]: 'CP850',
  // SQL_Scandinavian_CP850_CS_AS
  [60]: 'CP850',
  // SQL_Scandinavian_CP850_CI_AS
  [61]: 'CP850',
  // SQL_AltDiction_CP850_CI_AS
  [80]: 'CP1250',
  // SQL_Latin1_General_1250_BIN
  [81]: 'CP1250',
  // SQL_Latin1_General_CP1250_CS_AS
  [82]: 'CP1250',
  // SQL_Latin1_General_Cp1250_CI_AS_KI_WI
  [83]: 'CP1250',
  // SQL_Czech_Cp1250_CS_AS_KI_WI
  [84]: 'CP1250',
  // SQL_Czech_Cp1250_CI_AS_KI_WI
  [85]: 'CP1250',
  // SQL_Hungarian_Cp1250_CS_AS_KI_WI
  [86]: 'CP1250',
  // SQL_Hungarian_Cp1250_CI_AS_KI_WI
  [87]: 'CP1250',
  // SQL_Polish_Cp1250_CS_AS_KI_WI
  [88]: 'CP1250',
  // SQL_Polish_Cp1250_CI_AS_KI_WI
  [89]: 'CP1250',
  // SQL_Romanian_Cp1250_CS_AS_KI_WI
  [90]: 'CP1250',
  // SQL_Romanian_Cp1250_CI_AS_KI_WI
  [91]: 'CP1250',
  // SQL_Croatian_Cp1250_CS_AS_KI_WI
  [92]: 'CP1250',
  // SQL_Croatian_Cp1250_CI_AS_KI_WI
  [93]: 'CP1250',
  // SQL_Slovak_Cp1250_CS_AS_KI_WI
  [94]: 'CP1250',
  // SQL_Slovak_Cp1250_CI_AS_KI_WI
  [95]: 'CP1250',
  // SQL_Slovenian_Cp1250_CS_AS_KI_WI
  [96]: 'CP1250',
  // SQL_Slovenian_Cp1250_CI_AS_KI_WI
  [104]: 'CP1251',
  // SQL_Latin1_General_1251_BIN
  [105]: 'CP1251',
  // SQL_Latin1_General_CP1251_CS_AS
  [106]: 'CP1251',
  // SQL_Latin1_General_CP1251_CI_AS
  [107]: 'CP1251',
  // SQL_Ukrainian_Cp1251_CS_AS_KI_WI
  [108]: 'CP1251',
  // SQL_Ukrainian_Cp1251_CI_AS_KI_WI
  [112]: 'CP1253',
  // SQL_Latin1_General_1253_BIN
  [113]: 'CP1253',
  // SQL_Latin1_General_CP1253_CS_AS
  [114]: 'CP1253',
  // SQL_Latin1_General_CP1253_CI_AS
  [120]: 'CP1253',
  // SQL_MixDiction_CP1253_CS_AS
  [121]: 'CP1253',
  // SQL_AltDiction_CP1253_CS_AS
  [122]: 'CP1253',
  // SQL_AltDiction2_CP1253_CS_AS
  [124]: 'CP1253',
  // SQL_Latin1_General_CP1253_CI_AI
  [128]: 'CP1254',
  // SQL_Latin1_General_1254_BIN
  [129]: 'CP1254',
  // SQL_Latin1_General_Cp1254_CS_AS_KI_WI
  [130]: 'CP1254',
  // SQL_Latin1_General_Cp1254_CI_AS_KI_WI
  [136]: 'CP1255',
  // SQL_Latin1_General_1255_BIN
  [137]: 'CP1255',
  // SQL_Latin1_General_CP1255_CS_AS
  [138]: 'CP1255',
  // SQL_Latin1_General_CP1255_CI_AS
  [144]: 'CP1256',
  // SQL_Latin1_General_1256_BIN
  [145]: 'CP1256',
  // SQL_Latin1_General_CP1256_CS_AS
  [146]: 'CP1256',
  // SQL_Latin1_General_CP1256_CI_AS
  [152]: 'CP1257',
  // SQL_Latin1_General_1257_BIN
  [153]: 'CP1257',
  // SQL_Latin1_General_CP1257_CS_AS
  [154]: 'CP1257',
  // SQL_Latin1_General_CP1257_CI_AS
  [155]: 'CP1257',
  // SQL_Estonian_Cp1257_CS_AS_KI_WI
  [156]: 'CP1257',
  // SQL_Estonian_Cp1257_CI_AS_KI_WI
  [157]: 'CP1257',
  // SQL_Latvian_Cp1257_CS_AS_KI_WI
  [158]: 'CP1257',
  // SQL_Latvian_Cp1257_CI_AS_KI_WI
  [159]: 'CP1257',
  // SQL_Lithuanian_Cp1257_CS_AS_KI_WI
  [160]: 'CP1257',
  // SQL_Lithuanian_Cp1257_CI_AS_KI_WI
  [183]: 'CP1252',
  // SQL_Danish_Pref_Cp1_CI_AS_KI_WI
  [184]: 'CP1252',
  // SQL_SwedishPhone_Pref_Cp1_CI_AS_KI_WI
  [185]: 'CP1252',
  // SQL_SwedishStd_Pref_Cp1_CI_AS_KI_WI
  [186]: 'CP1252' // SQL_Icelandic_Pref_Cp1_CI_AS_KI_WI

};
exports.codepageBySortId = codepageBySortId;
const Flags = {
  IGNORE_CASE: 1 << 0,
  IGNORE_ACCENT: 1 << 1,
  IGNORE_KANA: 1 << 2,
  IGNORE_WIDTH: 1 << 3,
  BINARY: 1 << 4,
  BINARY2: 1 << 5,
  UTF8: 1 << 6
};
exports.Flags = Flags;

class Collation {
  static fromBuffer(buffer, offset = 0) {
    let lcid = (buffer[offset + 2] & 0x0F) << 16;
    lcid |= buffer[offset + 1] << 8;
    lcid |= buffer[offset + 0];
    let flags = (buffer[offset + 3] & 0x0F) << 4;
    flags |= (buffer[offset + 2] & 0xF0) >>> 4;
    const version = (buffer[offset + 3] & 0xF0) >>> 4;
    const sortId = buffer[offset + 4];
    return new this(lcid, flags, version, sortId);
  }

  constructor(lcid, flags, version, sortId) {
    this.lcid = void 0;
    this.flags = void 0;
    this.version = void 0;
    this.sortId = void 0;
    this.codepage = void 0;
    this.buffer = void 0;
    this.buffer = undefined;
    this.lcid = lcid;
    this.flags = flags;
    this.version = version;
    this.sortId = sortId;

    if (this.flags & Flags.UTF8) {
      this.codepage = 'utf-8';
    } else if (this.sortId) {
      this.codepage = codepageBySortId[this.sortId];
    } else {
      // The last 16 bits of the LCID are the language id.
      // The first 4 bits define additional sort orders.
      const languageId = this.lcid & 0xFFFF;
      this.codepage = codepageByLanguageId[languageId];
    }
  }

  toBuffer() {
    if (this.buffer) {
      return this.buffer;
    }

    this.buffer = Buffer.alloc(5);
    this.buffer[0] = this.lcid & 0xFF;
    this.buffer[1] = this.lcid >>> 8 & 0xFF;
    this.buffer[2] = this.lcid >>> 16 & 0x0F | (this.flags & 0x0F) << 4;
    this.buffer[3] = (this.flags & 0xF0) >>> 4 | (this.version & 0x0F) << 4;
    this.buffer[4] = this.sortId & 0xFF;
    return this.buffer;
  }

}

exports.Collation = Collation;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb2RlcGFnZUJ5TGFuZ3VhZ2VJZCIsImNvZGVwYWdlQnlTb3J0SWQiLCJGbGFncyIsIklHTk9SRV9DQVNFIiwiSUdOT1JFX0FDQ0VOVCIsIklHTk9SRV9LQU5BIiwiSUdOT1JFX1dJRFRIIiwiQklOQVJZIiwiQklOQVJZMiIsIlVURjgiLCJDb2xsYXRpb24iLCJmcm9tQnVmZmVyIiwiYnVmZmVyIiwib2Zmc2V0IiwibGNpZCIsImZsYWdzIiwidmVyc2lvbiIsInNvcnRJZCIsImNvbnN0cnVjdG9yIiwiY29kZXBhZ2UiLCJ1bmRlZmluZWQiLCJsYW5ndWFnZUlkIiwidG9CdWZmZXIiLCJCdWZmZXIiLCJhbGxvYyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9jb2xsYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsidHlwZSBFbmNvZGluZyA9ICd1dGYtOCcgfCAnQ1A0MzcnIHwgJ0NQODUwJyB8ICdDUDg3NCcgfCAnQ1A5MzInIHwgJ0NQOTM2JyB8ICdDUDk0OScgfCAnQ1A5NTAnIHwgJ0NQMTI1MCcgfCAnQ1AxMjUxJyB8ICdDUDEyNTInIHwgJ0NQMTI1MycgfCAnQ1AxMjU0JyB8ICdDUDEyNTUnIHwgJ0NQMTI1NicgfCAnQ1AxMjU3JyB8ICdDUDEyNTgnO1xuXG4vLyBodHRwOi8vdGVjaG5ldC5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvYWExNzY1NTModj1zcWwuODApLmFzcHhcbmV4cG9ydCBjb25zdCBjb2RlcGFnZUJ5TGFuZ3VhZ2VJZDogeyBba2V5OiBudW1iZXJdOiBFbmNvZGluZyB9ID0ge1xuICAvLyBBcmFiaWNfKlxuICBbMHgwNDAxXTogJ0NQMTI1NicsXG5cbiAgLy8gQ2hpbmVzZV9UYWl3YW5fU3Ryb2tlXypcbiAgLy8gQ2hpbmVzZV9UcmFkaXRpb25hbF9TdHJva2VfQ291bnRfKlxuICAvLyBDaGluZXNlX1RhaXdhbl9Cb3BvbW9mb18qXG4gIC8vIENoaW5lc2VfVHJhZGl0aW9uYWxfQm9wb21vZm9fKlxuICBbMHgwNDA0XTogJ0NQOTUwJyxcblxuICAvLyBDemVjaF8qXG4gIFsweDA0MDVdOiAnQ1AxMjUwJyxcblxuICAvLyBEYW5pc2hfR3JlZW5sYW5kaWNfKlxuICAvLyBEYW5pc2hfTm9yd2VnaWFuXypcbiAgWzB4MDQwNl06ICdDUDEyNTInLFxuXG4gIC8vIEdyZWVrXypcbiAgWzB4MDQwOF06ICdDUDEyNTMnLFxuXG4gIC8vIExhdGluMV9HZW5lcmFsXypcbiAgWzB4MDQwOV06ICdDUDEyNTInLFxuXG4gIC8vIFRyYWRpdGlvbmFsX1NwYW5pc2hfKlxuICBbMHgwNDBBXTogJ0NQMTI1MicsXG5cbiAgLy8gRmlubmlzaF9Td2VkaXNoXypcbiAgWzB4MDQwQl06ICdDUDEyNTInLFxuXG4gIC8vIEZyZW5jaF8qXG4gIFsweDA0MENdOiAnQ1AxMjUyJyxcblxuICAvLyBIZWJyZXdfKlxuICBbMHgwNDBEXTogJ0NQMTI1NScsXG5cbiAgLy8gSHVuZ2FyaWFuXypcbiAgLy8gSHVuZ2FyaWFuX1RlY2huaWNhbF8qXG4gIFsweDA0MEVdOiAnQ1AxMjUwJyxcblxuICAvLyBJY2VsYW5kaWNfKlxuICBbMHgwNDBGXTogJ0NQMTI1MicsXG5cbiAgLy8gSmFwYW5lc2VfKlxuICAvLyBKYXBhbmVzZV9YSklTXypcbiAgLy8gSmFwYW5lc2VfVW5pY29kZV8qXG4gIC8vIEphcGFuZXNlX0J1c2h1X0tha3VzdV8qXG4gIFsweDA0MTFdOiAnQ1A5MzInLFxuXG4gIC8vIEtvcmVhbl8qXG4gIC8vIEtvcmVhbl9XYW5zdW5nXypcbiAgWzB4MDQxMl06ICdDUDk0OScsXG5cbiAgLy8gTm9yd2VnaWFuXypcbiAgWzB4MDQxNF06ICdDUDEyNTInLFxuXG4gIC8vIFBvbGlzaF8qXG4gIFsweDA0MTVdOiAnQ1AxMjUwJyxcblxuICAvLyBSb21hbnNoXypcbiAgWzB4MDQxN106ICdDUDEyNTInLFxuXG4gIC8vIFJvbWFuaWFuXypcbiAgWzB4MDQxOF06ICdDUDEyNTAnLFxuXG4gIC8vIEN5cmlsbGljXypcbiAgWzB4MDQxOV06ICdDUDEyNTEnLFxuXG4gIC8vIENyb2F0aWFuXypcbiAgWzB4MDQxQV06ICdDUDEyNTAnLFxuXG4gIC8vIFNsb3Zha18qXG4gIFsweDA0MUJdOiAnQ1AxMjUwJyxcblxuICAvLyBBbGJhbmlhbl8qXG4gIFsweDA0MUNdOiAnQ1AxMjUwJyxcblxuICAvLyBUaGFpXypcbiAgWzB4MDQxRV06ICdDUDg3NCcsXG5cbiAgLy8gVHVya2lzaF8qXG4gIFsweDA0MUZdOiAnQ1AxMjU0JyxcblxuICAvLyBVcmR1XypcbiAgWzB4MDQyMF06ICdDUDEyNTYnLFxuXG4gIC8vIFVrcmFpbmlhbl8qXG4gIFsweDA0MjJdOiAnQ1AxMjUxJyxcblxuICAvLyBTbG92ZW5pYW5fKlxuICBbMHgwNDI0XTogJ0NQMTI1MCcsXG5cbiAgLy8gRXN0b25pYW5fKlxuICBbMHgwNDI1XTogJ0NQMTI1NycsXG5cbiAgLy8gTGF0dmlhbl8qXG4gIFsweDA0MjZdOiAnQ1AxMjU3JyxcblxuICAvLyBMaXRodWFuaWFuXypcbiAgWzB4MDQyN106ICdDUDEyNTcnLFxuXG4gIC8vIFBlcnNpYW5fKlxuICBbMHgwNDI5XTogJ0NQMTI1NicsXG5cbiAgLy8gVmlldG5hbWVzZV8qXG4gIFsweDA0MkFdOiAnQ1AxMjU4JyxcblxuICAvLyBBemVyaV9MYXRpbl8qXG4gIFsweDA0MkNdOiAnQ1AxMjU0JyxcblxuICAvLyBVcHBlcl9Tb3JiaWFuXypcbiAgWzB4MDQyRV06ICdDUDEyNTInLFxuXG4gIC8vIE1hY2Vkb25pYW5fRllST01fKlxuICBbMHgwNDJGXTogJ0NQMTI1MScsXG5cbiAgLy8gU2FtaV9Ob3J3YXlfKlxuICBbMHgwNDNCXTogJ0NQMTI1MicsXG5cbiAgLy8gS2F6YWtoXypcbiAgWzB4MDQzRl06ICdDUDEyNTEnLFxuXG4gIC8vIFR1cmttZW5fKlxuICBbMHgwNDQyXTogJ0NQMTI1MCcsXG5cbiAgLy8gVXpiZWtfTGF0aW5fKlxuICBbMHgwNDQzXTogJ0NQMTI1NCcsXG5cbiAgLy8gVGF0YXJfKlxuICBbMHgwNDQ0XTogJ0NQMTI1MScsXG5cbiAgLy8gV2Vsc2hfKlxuICBbMHgwNDUyXTogJ0NQMTI1MicsXG5cbiAgLy8gRnJpc2lhbl8qXG4gIFsweDA0NjJdOiAnQ1AxMjUyJyxcblxuICAvLyBCYXNoa2lyXypcbiAgWzB4MDQ2RF06ICdDUDEyNTEnLFxuXG4gIC8vIE1hcHVkdW5nYW5fKlxuICBbMHgwNDdBXTogJ0NQMTI1MicsXG5cbiAgLy8gTW9oYXdrXypcbiAgWzB4MDQ3Q106ICdDUDEyNTInLFxuXG4gIC8vIEJyZXRvbl8qXG4gIFsweDA0N0VdOiAnQ1AxMjUyJyxcblxuICAvLyBVaWdodXJfKlxuICBbMHgwNDgwXTogJ0NQMTI1NicsXG5cbiAgLy8gQ29yc2ljYW5fKlxuICBbMHgwNDgzXTogJ0NQMTI1MicsXG5cbiAgLy8gWWFrdXRfKlxuICBbMHgwNDg1XTogJ0NQMTI1MScsXG5cbiAgLy8gRGFyaV8qXG4gIFsweDA0OENdOiAnQ1AxMjU2JyxcblxuICAvLyBDaGluZXNlX1BSQ18qXG4gIC8vIENoaW5lc2VfU2ltcGxpZmllZF9QaW55aW5fKlxuICAvLyBDaGluZXNlX1BSQ19TdHJva2VfKlxuICAvLyBDaGluZXNlX1NpbXBsaWZpZWRfU3Ryb2tlX09yZGVyXypcbiAgWzB4MDgwNF06ICdDUDkzNicsXG5cbiAgLy8gU2VyYmlhbl9MYXRpbl8qXG4gIFsweDA4MUFdOiAnQ1AxMjUwJyxcblxuICAvLyBBemVyaV9DeXJpbGxpY18qXG4gIFsweDA4MkNdOiAnQ1AxMjUxJyxcblxuICAvLyBTYW1pX1N3ZWRlbl9GaW5sYW5kXypcbiAgWzB4MDgzQl06ICdDUDEyNTInLFxuXG4gIC8vIFRhbWF6aWdodF8qXG4gIFsweDA4NUZdOiAnQ1AxMjUyJyxcblxuICAvLyBDaGluZXNlX0hvbmdfS29uZ19TdHJva2VfKlxuICBbMHgwQzA0XTogJ0NQOTUwJyxcblxuICAvLyBNb2Rlcm5fU3BhbmlzaF8qXG4gIFsweDBDMEFdOiAnQ1AxMjUyJyxcblxuICAvLyBTZXJiaWFuX0N5cmlsbGljXypcbiAgWzB4MEMxQV06ICdDUDEyNTEnLFxuXG4gIC8vIENoaW5lc2VfVHJhZGl0aW9uYWxfUGlueWluXypcbiAgLy8gQ2hpbmVzZV9UcmFkaXRpb25hbF9TdHJva2VfT3JkZXJfKlxuICBbMHgxNDA0XTogJ0NQOTUwJyxcblxuICAvLyBCb3NuaWFuX0xhdGluXypcbiAgWzB4MTQxQV06ICdDUDEyNTAnLFxuXG4gIC8vIEJvc25pYW5fQ3lyaWxsaWNfKlxuICBbMHgyMDFBXTogJ0NQMTI1MScsXG5cbiAgLy8gR2VybWFuXG4gIC8vIEdlcm1hbl9QaG9uZUJvb2tfKlxuICBbMHgwNDA3XTogJ0NQMTI1MicsXG5cbiAgLy8gR2VvcmdpYW5fTW9kZXJuX1NvcnRfKlxuICBbMHgwNDM3XTogJ0NQMTI1Midcbn07XG5cbmV4cG9ydCBjb25zdCBjb2RlcGFnZUJ5U29ydElkOiB7IFtrZXk6IG51bWJlcl06IEVuY29kaW5nIH0gPSB7XG4gIFszMF06ICdDUDQzNycsIC8vIFNRTF9MYXRpbjFfR2VuZXJhbF9DUDQzN19CSU5cbiAgWzMxXTogJ0NQNDM3JywgLy8gU1FMX0xhdGluMV9HZW5lcmFsX0NQNDM3X0NTX0FTXG4gIFszMl06ICdDUDQzNycsIC8vIFNRTF9MYXRpbjFfR2VuZXJhbF9DUDQzN19DSV9BU1xuICBbMzNdOiAnQ1A0MzcnLCAvLyBTUUxfTGF0aW4xX0dlbmVyYWxfUHJlZl9DUDQzN19DSV9BU1xuICBbMzRdOiAnQ1A0MzcnLCAvLyBTUUxfTGF0aW4xX0dlbmVyYWxfQ1A0MzdfQ0lfQUlcbiAgWzQwXTogJ0NQODUwJywgLy8gU1FMX0xhdGluMV9HZW5lcmFsX0NQODUwX0JJTlxuICBbNDFdOiAnQ1A4NTAnLCAvLyBTUUxfTGF0aW4xX0dlbmVyYWxfQ1A4NTBfQ1NfQVNcbiAgWzQyXTogJ0NQODUwJywgLy8gU1FMX0xhdGluMV9HZW5lcmFsX0NQODUwX0NJX0FTXG4gIFs0M106ICdDUDg1MCcsIC8vIFNRTF9MYXRpbjFfR2VuZXJhbF9QcmVmX0NQODUwX0NJX0FTXG4gIFs0NF06ICdDUDg1MCcsIC8vIFNRTF9MYXRpbjFfR2VuZXJhbF9DUDg1MF9DSV9BSVxuICBbNDldOiAnQ1A4NTAnLCAvLyBTUUxfMXhDb21wYXRfQ1A4NTBfQ0lfQVNcbiAgWzUxXTogJ0NQMTI1MicsIC8vIFNRTF9MYXRpbjFfR2VuZXJhbF9DcDFfQ1NfQVNfS0lfV0lcbiAgWzUyXTogJ0NQMTI1MicsIC8vIFNRTF9MYXRpbjFfR2VuZXJhbF9DcDFfQ0lfQVNfS0lfV0lcbiAgWzUzXTogJ0NQMTI1MicsIC8vIFNRTF9MYXRpbjFfR2VuZXJhbF9QcmVmX0NwMV9DSV9BU19LSV9XSVxuICBbNTRdOiAnQ1AxMjUyJywgLy8gU1FMX0xhdGluMV9HZW5lcmFsX0NwMV9DSV9BSV9LSV9XSVxuICBbNTVdOiAnQ1A4NTAnLCAvLyBTUUxfQWx0RGljdGlvbl9DUDg1MF9DU19BU1xuICBbNTZdOiAnQ1A4NTAnLCAvLyBTUUxfQWx0RGljdGlvbl9QcmVmX0NQODUwX0NJX0FTXG4gIFs1N106ICdDUDg1MCcsIC8vIFNRTF9BbHREaWN0aW9uX0NQODUwX0NJX0FJXG4gIFs1OF06ICdDUDg1MCcsIC8vIFNRTF9TY2FuZGluYXZpYW5fUHJlZl9DUDg1MF9DSV9BU1xuICBbNTldOiAnQ1A4NTAnLCAvLyBTUUxfU2NhbmRpbmF2aWFuX0NQODUwX0NTX0FTXG4gIFs2MF06ICdDUDg1MCcsIC8vIFNRTF9TY2FuZGluYXZpYW5fQ1A4NTBfQ0lfQVNcbiAgWzYxXTogJ0NQODUwJywgLy8gU1FMX0FsdERpY3Rpb25fQ1A4NTBfQ0lfQVNcbiAgWzgwXTogJ0NQMTI1MCcsIC8vIFNRTF9MYXRpbjFfR2VuZXJhbF8xMjUwX0JJTlxuICBbODFdOiAnQ1AxMjUwJywgLy8gU1FMX0xhdGluMV9HZW5lcmFsX0NQMTI1MF9DU19BU1xuICBbODJdOiAnQ1AxMjUwJywgLy8gU1FMX0xhdGluMV9HZW5lcmFsX0NwMTI1MF9DSV9BU19LSV9XSVxuICBbODNdOiAnQ1AxMjUwJywgLy8gU1FMX0N6ZWNoX0NwMTI1MF9DU19BU19LSV9XSVxuICBbODRdOiAnQ1AxMjUwJywgLy8gU1FMX0N6ZWNoX0NwMTI1MF9DSV9BU19LSV9XSVxuICBbODVdOiAnQ1AxMjUwJywgLy8gU1FMX0h1bmdhcmlhbl9DcDEyNTBfQ1NfQVNfS0lfV0lcbiAgWzg2XTogJ0NQMTI1MCcsIC8vIFNRTF9IdW5nYXJpYW5fQ3AxMjUwX0NJX0FTX0tJX1dJXG4gIFs4N106ICdDUDEyNTAnLCAvLyBTUUxfUG9saXNoX0NwMTI1MF9DU19BU19LSV9XSVxuICBbODhdOiAnQ1AxMjUwJywgLy8gU1FMX1BvbGlzaF9DcDEyNTBfQ0lfQVNfS0lfV0lcbiAgWzg5XTogJ0NQMTI1MCcsIC8vIFNRTF9Sb21hbmlhbl9DcDEyNTBfQ1NfQVNfS0lfV0lcbiAgWzkwXTogJ0NQMTI1MCcsIC8vIFNRTF9Sb21hbmlhbl9DcDEyNTBfQ0lfQVNfS0lfV0lcbiAgWzkxXTogJ0NQMTI1MCcsIC8vIFNRTF9Dcm9hdGlhbl9DcDEyNTBfQ1NfQVNfS0lfV0lcbiAgWzkyXTogJ0NQMTI1MCcsIC8vIFNRTF9Dcm9hdGlhbl9DcDEyNTBfQ0lfQVNfS0lfV0lcbiAgWzkzXTogJ0NQMTI1MCcsIC8vIFNRTF9TbG92YWtfQ3AxMjUwX0NTX0FTX0tJX1dJXG4gIFs5NF06ICdDUDEyNTAnLCAvLyBTUUxfU2xvdmFrX0NwMTI1MF9DSV9BU19LSV9XSVxuICBbOTVdOiAnQ1AxMjUwJywgLy8gU1FMX1Nsb3Zlbmlhbl9DcDEyNTBfQ1NfQVNfS0lfV0lcbiAgWzk2XTogJ0NQMTI1MCcsIC8vIFNRTF9TbG92ZW5pYW5fQ3AxMjUwX0NJX0FTX0tJX1dJXG4gIFsxMDRdOiAnQ1AxMjUxJywgLy8gU1FMX0xhdGluMV9HZW5lcmFsXzEyNTFfQklOXG4gIFsxMDVdOiAnQ1AxMjUxJywgLy8gU1FMX0xhdGluMV9HZW5lcmFsX0NQMTI1MV9DU19BU1xuICBbMTA2XTogJ0NQMTI1MScsIC8vIFNRTF9MYXRpbjFfR2VuZXJhbF9DUDEyNTFfQ0lfQVNcbiAgWzEwN106ICdDUDEyNTEnLCAvLyBTUUxfVWtyYWluaWFuX0NwMTI1MV9DU19BU19LSV9XSVxuICBbMTA4XTogJ0NQMTI1MScsIC8vIFNRTF9Va3JhaW5pYW5fQ3AxMjUxX0NJX0FTX0tJX1dJXG4gIFsxMTJdOiAnQ1AxMjUzJywgLy8gU1FMX0xhdGluMV9HZW5lcmFsXzEyNTNfQklOXG4gIFsxMTNdOiAnQ1AxMjUzJywgLy8gU1FMX0xhdGluMV9HZW5lcmFsX0NQMTI1M19DU19BU1xuICBbMTE0XTogJ0NQMTI1MycsIC8vIFNRTF9MYXRpbjFfR2VuZXJhbF9DUDEyNTNfQ0lfQVNcbiAgWzEyMF06ICdDUDEyNTMnLCAvLyBTUUxfTWl4RGljdGlvbl9DUDEyNTNfQ1NfQVNcbiAgWzEyMV06ICdDUDEyNTMnLCAvLyBTUUxfQWx0RGljdGlvbl9DUDEyNTNfQ1NfQVNcbiAgWzEyMl06ICdDUDEyNTMnLCAvLyBTUUxfQWx0RGljdGlvbjJfQ1AxMjUzX0NTX0FTXG4gIFsxMjRdOiAnQ1AxMjUzJywgLy8gU1FMX0xhdGluMV9HZW5lcmFsX0NQMTI1M19DSV9BSVxuICBbMTI4XTogJ0NQMTI1NCcsIC8vIFNRTF9MYXRpbjFfR2VuZXJhbF8xMjU0X0JJTlxuICBbMTI5XTogJ0NQMTI1NCcsIC8vIFNRTF9MYXRpbjFfR2VuZXJhbF9DcDEyNTRfQ1NfQVNfS0lfV0lcbiAgWzEzMF06ICdDUDEyNTQnLCAvLyBTUUxfTGF0aW4xX0dlbmVyYWxfQ3AxMjU0X0NJX0FTX0tJX1dJXG4gIFsxMzZdOiAnQ1AxMjU1JywgLy8gU1FMX0xhdGluMV9HZW5lcmFsXzEyNTVfQklOXG4gIFsxMzddOiAnQ1AxMjU1JywgLy8gU1FMX0xhdGluMV9HZW5lcmFsX0NQMTI1NV9DU19BU1xuICBbMTM4XTogJ0NQMTI1NScsIC8vIFNRTF9MYXRpbjFfR2VuZXJhbF9DUDEyNTVfQ0lfQVNcbiAgWzE0NF06ICdDUDEyNTYnLCAvLyBTUUxfTGF0aW4xX0dlbmVyYWxfMTI1Nl9CSU5cbiAgWzE0NV06ICdDUDEyNTYnLCAvLyBTUUxfTGF0aW4xX0dlbmVyYWxfQ1AxMjU2X0NTX0FTXG4gIFsxNDZdOiAnQ1AxMjU2JywgLy8gU1FMX0xhdGluMV9HZW5lcmFsX0NQMTI1Nl9DSV9BU1xuICBbMTUyXTogJ0NQMTI1NycsIC8vIFNRTF9MYXRpbjFfR2VuZXJhbF8xMjU3X0JJTlxuICBbMTUzXTogJ0NQMTI1NycsIC8vIFNRTF9MYXRpbjFfR2VuZXJhbF9DUDEyNTdfQ1NfQVNcbiAgWzE1NF06ICdDUDEyNTcnLCAvLyBTUUxfTGF0aW4xX0dlbmVyYWxfQ1AxMjU3X0NJX0FTXG4gIFsxNTVdOiAnQ1AxMjU3JywgLy8gU1FMX0VzdG9uaWFuX0NwMTI1N19DU19BU19LSV9XSVxuICBbMTU2XTogJ0NQMTI1NycsIC8vIFNRTF9Fc3Rvbmlhbl9DcDEyNTdfQ0lfQVNfS0lfV0lcbiAgWzE1N106ICdDUDEyNTcnLCAvLyBTUUxfTGF0dmlhbl9DcDEyNTdfQ1NfQVNfS0lfV0lcbiAgWzE1OF06ICdDUDEyNTcnLCAvLyBTUUxfTGF0dmlhbl9DcDEyNTdfQ0lfQVNfS0lfV0lcbiAgWzE1OV06ICdDUDEyNTcnLCAvLyBTUUxfTGl0aHVhbmlhbl9DcDEyNTdfQ1NfQVNfS0lfV0lcbiAgWzE2MF06ICdDUDEyNTcnLCAvLyBTUUxfTGl0aHVhbmlhbl9DcDEyNTdfQ0lfQVNfS0lfV0lcbiAgWzE4M106ICdDUDEyNTInLCAvLyBTUUxfRGFuaXNoX1ByZWZfQ3AxX0NJX0FTX0tJX1dJXG4gIFsxODRdOiAnQ1AxMjUyJywgLy8gU1FMX1N3ZWRpc2hQaG9uZV9QcmVmX0NwMV9DSV9BU19LSV9XSVxuICBbMTg1XTogJ0NQMTI1MicsIC8vIFNRTF9Td2VkaXNoU3RkX1ByZWZfQ3AxX0NJX0FTX0tJX1dJXG4gIFsxODZdOiAnQ1AxMjUyJyAvLyBTUUxfSWNlbGFuZGljX1ByZWZfQ3AxX0NJX0FTX0tJX1dJXG59O1xuXG5leHBvcnQgY29uc3QgRmxhZ3MgPSB7XG4gIElHTk9SRV9DQVNFOiAxIDw8IDAsXG4gIElHTk9SRV9BQ0NFTlQ6IDEgPDwgMSxcbiAgSUdOT1JFX0tBTkE6IDEgPDwgMixcbiAgSUdOT1JFX1dJRFRIOiAxIDw8IDMsXG4gIEJJTkFSWTogMSA8PCA0LFxuICBCSU5BUlkyOiAxIDw8IDUsXG4gIFVURjg6IDEgPDwgNixcbn07XG5cbmV4cG9ydCBjbGFzcyBDb2xsYXRpb24ge1xuICByZWFkb25seSBsY2lkOiBudW1iZXI7XG4gIHJlYWRvbmx5IGZsYWdzOiBudW1iZXI7XG4gIHJlYWRvbmx5IHZlcnNpb246IG51bWJlcjtcbiAgcmVhZG9ubHkgc29ydElkOiBudW1iZXI7XG4gIHJlYWRvbmx5IGNvZGVwYWdlOiBFbmNvZGluZyB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIGJ1ZmZlcjogQnVmZmVyIHwgdW5kZWZpbmVkO1xuXG4gIHN0YXRpYyBmcm9tQnVmZmVyKGJ1ZmZlcjogQnVmZmVyLCBvZmZzZXQgPSAwKSB7XG4gICAgbGV0IGxjaWQgPSAoYnVmZmVyW29mZnNldCArIDJdICYgMHgwRikgPDwgMTY7XG4gICAgbGNpZCB8PSBidWZmZXJbb2Zmc2V0ICsgMV0gPDwgODtcbiAgICBsY2lkIHw9IGJ1ZmZlcltvZmZzZXQgKyAwXTtcblxuICAgIGxldCBmbGFncyA9IChidWZmZXJbb2Zmc2V0ICsgM10gJiAweDBGKSA8PCA0O1xuICAgIGZsYWdzIHw9IChidWZmZXJbb2Zmc2V0ICsgMl0gJiAweEYwKSA+Pj4gNDtcblxuICAgIGNvbnN0IHZlcnNpb24gPSAoYnVmZmVyW29mZnNldCArIDNdICYgMHhGMCkgPj4+IDQ7XG5cbiAgICBjb25zdCBzb3J0SWQgPSBidWZmZXJbb2Zmc2V0ICsgNF07XG5cbiAgICByZXR1cm4gbmV3IHRoaXMobGNpZCwgZmxhZ3MsIHZlcnNpb24sIHNvcnRJZCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihsY2lkOiBudW1iZXIsIGZsYWdzOiBudW1iZXIsIHZlcnNpb246IG51bWJlciwgc29ydElkOiBudW1iZXIpIHtcbiAgICB0aGlzLmJ1ZmZlciA9IHVuZGVmaW5lZDtcblxuICAgIHRoaXMubGNpZCA9IGxjaWQ7XG4gICAgdGhpcy5mbGFncyA9IGZsYWdzO1xuICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gICAgdGhpcy5zb3J0SWQgPSBzb3J0SWQ7XG5cbiAgICBpZiAodGhpcy5mbGFncyAmIEZsYWdzLlVURjgpIHtcbiAgICAgIHRoaXMuY29kZXBhZ2UgPSAndXRmLTgnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zb3J0SWQpIHtcbiAgICAgIHRoaXMuY29kZXBhZ2UgPSBjb2RlcGFnZUJ5U29ydElkW3RoaXMuc29ydElkXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIGxhc3QgMTYgYml0cyBvZiB0aGUgTENJRCBhcmUgdGhlIGxhbmd1YWdlIGlkLlxuICAgICAgLy8gVGhlIGZpcnN0IDQgYml0cyBkZWZpbmUgYWRkaXRpb25hbCBzb3J0IG9yZGVycy5cbiAgICAgIGNvbnN0IGxhbmd1YWdlSWQgPSB0aGlzLmxjaWQgJiAweEZGRkY7XG4gICAgICB0aGlzLmNvZGVwYWdlID0gY29kZXBhZ2VCeUxhbmd1YWdlSWRbbGFuZ3VhZ2VJZF07XG4gICAgfVxuICB9XG5cbiAgdG9CdWZmZXIoKTogQnVmZmVyIHtcbiAgICBpZiAodGhpcy5idWZmZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmJ1ZmZlcjtcbiAgICB9XG5cbiAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg1KTtcblxuICAgIHRoaXMuYnVmZmVyWzBdID0gdGhpcy5sY2lkICYgMHhGRjtcbiAgICB0aGlzLmJ1ZmZlclsxXSA9ICh0aGlzLmxjaWQgPj4+IDgpICYgMHhGRjtcbiAgICB0aGlzLmJ1ZmZlclsyXSA9ICgodGhpcy5sY2lkID4+PiAxNikgJiAweDBGKSB8ICgodGhpcy5mbGFncyAmIDB4MEYpIDw8IDQpO1xuICAgIHRoaXMuYnVmZmVyWzNdID0gKCh0aGlzLmZsYWdzICYgMHhGMCkgPj4+IDQpIHwgKCh0aGlzLnZlcnNpb24gJiAweDBGKSA8PCA0KTtcbiAgICB0aGlzLmJ1ZmZlcls0XSA9IHRoaXMuc29ydElkICYgMHhGRjtcblxuICAgIHJldHVybiB0aGlzLmJ1ZmZlcjtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQTtBQUNPLE1BQU1BLG9CQUFpRCxHQUFHO0VBQy9EO0VBQ0EsQ0FBQyxNQUFELEdBQVUsUUFGcUQ7RUFJL0Q7RUFDQTtFQUNBO0VBQ0E7RUFDQSxDQUFDLE1BQUQsR0FBVSxPQVJxRDtFQVUvRDtFQUNBLENBQUMsTUFBRCxHQUFVLFFBWHFEO0VBYS9EO0VBQ0E7RUFDQSxDQUFDLE1BQUQsR0FBVSxRQWZxRDtFQWlCL0Q7RUFDQSxDQUFDLE1BQUQsR0FBVSxRQWxCcUQ7RUFvQi9EO0VBQ0EsQ0FBQyxNQUFELEdBQVUsUUFyQnFEO0VBdUIvRDtFQUNBLENBQUMsTUFBRCxHQUFVLFFBeEJxRDtFQTBCL0Q7RUFDQSxDQUFDLE1BQUQsR0FBVSxRQTNCcUQ7RUE2Qi9EO0VBQ0EsQ0FBQyxNQUFELEdBQVUsUUE5QnFEO0VBZ0MvRDtFQUNBLENBQUMsTUFBRCxHQUFVLFFBakNxRDtFQW1DL0Q7RUFDQTtFQUNBLENBQUMsTUFBRCxHQUFVLFFBckNxRDtFQXVDL0Q7RUFDQSxDQUFDLE1BQUQsR0FBVSxRQXhDcUQ7RUEwQy9EO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsQ0FBQyxNQUFELEdBQVUsT0E5Q3FEO0VBZ0QvRDtFQUNBO0VBQ0EsQ0FBQyxNQUFELEdBQVUsT0FsRHFEO0VBb0QvRDtFQUNBLENBQUMsTUFBRCxHQUFVLFFBckRxRDtFQXVEL0Q7RUFDQSxDQUFDLE1BQUQsR0FBVSxRQXhEcUQ7RUEwRC9EO0VBQ0EsQ0FBQyxNQUFELEdBQVUsUUEzRHFEO0VBNkQvRDtFQUNBLENBQUMsTUFBRCxHQUFVLFFBOURxRDtFQWdFL0Q7RUFDQSxDQUFDLE1BQUQsR0FBVSxRQWpFcUQ7RUFtRS9EO0VBQ0EsQ0FBQyxNQUFELEdBQVUsUUFwRXFEO0VBc0UvRDtFQUNBLENBQUMsTUFBRCxHQUFVLFFBdkVxRDtFQXlFL0Q7RUFDQSxDQUFDLE1BQUQsR0FBVSxRQTFFcUQ7RUE0RS9EO0VBQ0EsQ0FBQyxNQUFELEdBQVUsT0E3RXFEO0VBK0UvRDtFQUNBLENBQUMsTUFBRCxHQUFVLFFBaEZxRDtFQWtGL0Q7RUFDQSxDQUFDLE1BQUQsR0FBVSxRQW5GcUQ7RUFxRi9EO0VBQ0EsQ0FBQyxNQUFELEdBQVUsUUF0RnFEO0VBd0YvRDtFQUNBLENBQUMsTUFBRCxHQUFVLFFBekZxRDtFQTJGL0Q7RUFDQSxDQUFDLE1BQUQsR0FBVSxRQTVGcUQ7RUE4Ri9EO0VBQ0EsQ0FBQyxNQUFELEdBQVUsUUEvRnFEO0VBaUcvRDtFQUNBLENBQUMsTUFBRCxHQUFVLFFBbEdxRDtFQW9HL0Q7RUFDQSxDQUFDLE1BQUQsR0FBVSxRQXJHcUQ7RUF1Ry9EO0VBQ0EsQ0FBQyxNQUFELEdBQVUsUUF4R3FEO0VBMEcvRDtFQUNBLENBQUMsTUFBRCxHQUFVLFFBM0dxRDtFQTZHL0Q7RUFDQSxDQUFDLE1BQUQsR0FBVSxRQTlHcUQ7RUFnSC9EO0VBQ0EsQ0FBQyxNQUFELEdBQVUsUUFqSHFEO0VBbUgvRDtFQUNBLENBQUMsTUFBRCxHQUFVLFFBcEhxRDtFQXNIL0Q7RUFDQSxDQUFDLE1BQUQsR0FBVSxRQXZIcUQ7RUF5SC9EO0VBQ0EsQ0FBQyxNQUFELEdBQVUsUUExSHFEO0VBNEgvRDtFQUNBLENBQUMsTUFBRCxHQUFVLFFBN0hxRDtFQStIL0Q7RUFDQSxDQUFDLE1BQUQsR0FBVSxRQWhJcUQ7RUFrSS9EO0VBQ0EsQ0FBQyxNQUFELEdBQVUsUUFuSXFEO0VBcUkvRDtFQUNBLENBQUMsTUFBRCxHQUFVLFFBdElxRDtFQXdJL0Q7RUFDQSxDQUFDLE1BQUQsR0FBVSxRQXpJcUQ7RUEySS9EO0VBQ0EsQ0FBQyxNQUFELEdBQVUsUUE1SXFEO0VBOEkvRDtFQUNBLENBQUMsTUFBRCxHQUFVLFFBL0lxRDtFQWlKL0Q7RUFDQSxDQUFDLE1BQUQsR0FBVSxRQWxKcUQ7RUFvSi9EO0VBQ0EsQ0FBQyxNQUFELEdBQVUsUUFySnFEO0VBdUovRDtFQUNBLENBQUMsTUFBRCxHQUFVLFFBeEpxRDtFQTBKL0Q7RUFDQSxDQUFDLE1BQUQsR0FBVSxRQTNKcUQ7RUE2Si9EO0VBQ0EsQ0FBQyxNQUFELEdBQVUsUUE5SnFEO0VBZ0svRDtFQUNBO0VBQ0E7RUFDQTtFQUNBLENBQUMsTUFBRCxHQUFVLE9BcEtxRDtFQXNLL0Q7RUFDQSxDQUFDLE1BQUQsR0FBVSxRQXZLcUQ7RUF5Sy9EO0VBQ0EsQ0FBQyxNQUFELEdBQVUsUUExS3FEO0VBNEsvRDtFQUNBLENBQUMsTUFBRCxHQUFVLFFBN0txRDtFQStLL0Q7RUFDQSxDQUFDLE1BQUQsR0FBVSxRQWhMcUQ7RUFrTC9EO0VBQ0EsQ0FBQyxNQUFELEdBQVUsT0FuTHFEO0VBcUwvRDtFQUNBLENBQUMsTUFBRCxHQUFVLFFBdExxRDtFQXdML0Q7RUFDQSxDQUFDLE1BQUQsR0FBVSxRQXpMcUQ7RUEyTC9EO0VBQ0E7RUFDQSxDQUFDLE1BQUQsR0FBVSxPQTdMcUQ7RUErTC9EO0VBQ0EsQ0FBQyxNQUFELEdBQVUsUUFoTXFEO0VBa00vRDtFQUNBLENBQUMsTUFBRCxHQUFVLFFBbk1xRDtFQXFNL0Q7RUFDQTtFQUNBLENBQUMsTUFBRCxHQUFVLFFBdk1xRDtFQXlNL0Q7RUFDQSxDQUFDLE1BQUQsR0FBVTtBQTFNcUQsQ0FBMUQ7O0FBNk1BLE1BQU1DLGdCQUE2QyxHQUFHO0VBQzNELENBQUMsRUFBRCxHQUFNLE9BRHFEO0VBQzVDO0VBQ2YsQ0FBQyxFQUFELEdBQU0sT0FGcUQ7RUFFNUM7RUFDZixDQUFDLEVBQUQsR0FBTSxPQUhxRDtFQUc1QztFQUNmLENBQUMsRUFBRCxHQUFNLE9BSnFEO0VBSTVDO0VBQ2YsQ0FBQyxFQUFELEdBQU0sT0FMcUQ7RUFLNUM7RUFDZixDQUFDLEVBQUQsR0FBTSxPQU5xRDtFQU01QztFQUNmLENBQUMsRUFBRCxHQUFNLE9BUHFEO0VBTzVDO0VBQ2YsQ0FBQyxFQUFELEdBQU0sT0FScUQ7RUFRNUM7RUFDZixDQUFDLEVBQUQsR0FBTSxPQVRxRDtFQVM1QztFQUNmLENBQUMsRUFBRCxHQUFNLE9BVnFEO0VBVTVDO0VBQ2YsQ0FBQyxFQUFELEdBQU0sT0FYcUQ7RUFXNUM7RUFDZixDQUFDLEVBQUQsR0FBTSxRQVpxRDtFQVkzQztFQUNoQixDQUFDLEVBQUQsR0FBTSxRQWJxRDtFQWEzQztFQUNoQixDQUFDLEVBQUQsR0FBTSxRQWRxRDtFQWMzQztFQUNoQixDQUFDLEVBQUQsR0FBTSxRQWZxRDtFQWUzQztFQUNoQixDQUFDLEVBQUQsR0FBTSxPQWhCcUQ7RUFnQjVDO0VBQ2YsQ0FBQyxFQUFELEdBQU0sT0FqQnFEO0VBaUI1QztFQUNmLENBQUMsRUFBRCxHQUFNLE9BbEJxRDtFQWtCNUM7RUFDZixDQUFDLEVBQUQsR0FBTSxPQW5CcUQ7RUFtQjVDO0VBQ2YsQ0FBQyxFQUFELEdBQU0sT0FwQnFEO0VBb0I1QztFQUNmLENBQUMsRUFBRCxHQUFNLE9BckJxRDtFQXFCNUM7RUFDZixDQUFDLEVBQUQsR0FBTSxPQXRCcUQ7RUFzQjVDO0VBQ2YsQ0FBQyxFQUFELEdBQU0sUUF2QnFEO0VBdUIzQztFQUNoQixDQUFDLEVBQUQsR0FBTSxRQXhCcUQ7RUF3QjNDO0VBQ2hCLENBQUMsRUFBRCxHQUFNLFFBekJxRDtFQXlCM0M7RUFDaEIsQ0FBQyxFQUFELEdBQU0sUUExQnFEO0VBMEIzQztFQUNoQixDQUFDLEVBQUQsR0FBTSxRQTNCcUQ7RUEyQjNDO0VBQ2hCLENBQUMsRUFBRCxHQUFNLFFBNUJxRDtFQTRCM0M7RUFDaEIsQ0FBQyxFQUFELEdBQU0sUUE3QnFEO0VBNkIzQztFQUNoQixDQUFDLEVBQUQsR0FBTSxRQTlCcUQ7RUE4QjNDO0VBQ2hCLENBQUMsRUFBRCxHQUFNLFFBL0JxRDtFQStCM0M7RUFDaEIsQ0FBQyxFQUFELEdBQU0sUUFoQ3FEO0VBZ0MzQztFQUNoQixDQUFDLEVBQUQsR0FBTSxRQWpDcUQ7RUFpQzNDO0VBQ2hCLENBQUMsRUFBRCxHQUFNLFFBbENxRDtFQWtDM0M7RUFDaEIsQ0FBQyxFQUFELEdBQU0sUUFuQ3FEO0VBbUMzQztFQUNoQixDQUFDLEVBQUQsR0FBTSxRQXBDcUQ7RUFvQzNDO0VBQ2hCLENBQUMsRUFBRCxHQUFNLFFBckNxRDtFQXFDM0M7RUFDaEIsQ0FBQyxFQUFELEdBQU0sUUF0Q3FEO0VBc0MzQztFQUNoQixDQUFDLEVBQUQsR0FBTSxRQXZDcUQ7RUF1QzNDO0VBQ2hCLENBQUMsR0FBRCxHQUFPLFFBeENvRDtFQXdDMUM7RUFDakIsQ0FBQyxHQUFELEdBQU8sUUF6Q29EO0VBeUMxQztFQUNqQixDQUFDLEdBQUQsR0FBTyxRQTFDb0Q7RUEwQzFDO0VBQ2pCLENBQUMsR0FBRCxHQUFPLFFBM0NvRDtFQTJDMUM7RUFDakIsQ0FBQyxHQUFELEdBQU8sUUE1Q29EO0VBNEMxQztFQUNqQixDQUFDLEdBQUQsR0FBTyxRQTdDb0Q7RUE2QzFDO0VBQ2pCLENBQUMsR0FBRCxHQUFPLFFBOUNvRDtFQThDMUM7RUFDakIsQ0FBQyxHQUFELEdBQU8sUUEvQ29EO0VBK0MxQztFQUNqQixDQUFDLEdBQUQsR0FBTyxRQWhEb0Q7RUFnRDFDO0VBQ2pCLENBQUMsR0FBRCxHQUFPLFFBakRvRDtFQWlEMUM7RUFDakIsQ0FBQyxHQUFELEdBQU8sUUFsRG9EO0VBa0QxQztFQUNqQixDQUFDLEdBQUQsR0FBTyxRQW5Eb0Q7RUFtRDFDO0VBQ2pCLENBQUMsR0FBRCxHQUFPLFFBcERvRDtFQW9EMUM7RUFDakIsQ0FBQyxHQUFELEdBQU8sUUFyRG9EO0VBcUQxQztFQUNqQixDQUFDLEdBQUQsR0FBTyxRQXREb0Q7RUFzRDFDO0VBQ2pCLENBQUMsR0FBRCxHQUFPLFFBdkRvRDtFQXVEMUM7RUFDakIsQ0FBQyxHQUFELEdBQU8sUUF4RG9EO0VBd0QxQztFQUNqQixDQUFDLEdBQUQsR0FBTyxRQXpEb0Q7RUF5RDFDO0VBQ2pCLENBQUMsR0FBRCxHQUFPLFFBMURvRDtFQTBEMUM7RUFDakIsQ0FBQyxHQUFELEdBQU8sUUEzRG9EO0VBMkQxQztFQUNqQixDQUFDLEdBQUQsR0FBTyxRQTVEb0Q7RUE0RDFDO0VBQ2pCLENBQUMsR0FBRCxHQUFPLFFBN0RvRDtFQTZEMUM7RUFDakIsQ0FBQyxHQUFELEdBQU8sUUE5RG9EO0VBOEQxQztFQUNqQixDQUFDLEdBQUQsR0FBTyxRQS9Eb0Q7RUErRDFDO0VBQ2pCLENBQUMsR0FBRCxHQUFPLFFBaEVvRDtFQWdFMUM7RUFDakIsQ0FBQyxHQUFELEdBQU8sUUFqRW9EO0VBaUUxQztFQUNqQixDQUFDLEdBQUQsR0FBTyxRQWxFb0Q7RUFrRTFDO0VBQ2pCLENBQUMsR0FBRCxHQUFPLFFBbkVvRDtFQW1FMUM7RUFDakIsQ0FBQyxHQUFELEdBQU8sUUFwRW9EO0VBb0UxQztFQUNqQixDQUFDLEdBQUQsR0FBTyxRQXJFb0Q7RUFxRTFDO0VBQ2pCLENBQUMsR0FBRCxHQUFPLFFBdEVvRDtFQXNFMUM7RUFDakIsQ0FBQyxHQUFELEdBQU8sUUF2RW9EO0VBdUUxQztFQUNqQixDQUFDLEdBQUQsR0FBTyxRQXhFb0Q7RUF3RTFDO0VBQ2pCLENBQUMsR0FBRCxHQUFPLFFBekVvRCxDQXlFM0M7O0FBekUyQyxDQUF0RDs7QUE0RUEsTUFBTUMsS0FBSyxHQUFHO0VBQ25CQyxXQUFXLEVBQUUsS0FBSyxDQURDO0VBRW5CQyxhQUFhLEVBQUUsS0FBSyxDQUZEO0VBR25CQyxXQUFXLEVBQUUsS0FBSyxDQUhDO0VBSW5CQyxZQUFZLEVBQUUsS0FBSyxDQUpBO0VBS25CQyxNQUFNLEVBQUUsS0FBSyxDQUxNO0VBTW5CQyxPQUFPLEVBQUUsS0FBSyxDQU5LO0VBT25CQyxJQUFJLEVBQUUsS0FBSztBQVBRLENBQWQ7OztBQVVBLE1BQU1DLFNBQU4sQ0FBZ0I7RUFTSixPQUFWQyxVQUFVLENBQUNDLE1BQUQsRUFBaUJDLE1BQU0sR0FBRyxDQUExQixFQUE2QjtJQUM1QyxJQUFJQyxJQUFJLEdBQUcsQ0FBQ0YsTUFBTSxDQUFDQyxNQUFNLEdBQUcsQ0FBVixDQUFOLEdBQXFCLElBQXRCLEtBQStCLEVBQTFDO0lBQ0FDLElBQUksSUFBSUYsTUFBTSxDQUFDQyxNQUFNLEdBQUcsQ0FBVixDQUFOLElBQXNCLENBQTlCO0lBQ0FDLElBQUksSUFBSUYsTUFBTSxDQUFDQyxNQUFNLEdBQUcsQ0FBVixDQUFkO0lBRUEsSUFBSUUsS0FBSyxHQUFHLENBQUNILE1BQU0sQ0FBQ0MsTUFBTSxHQUFHLENBQVYsQ0FBTixHQUFxQixJQUF0QixLQUErQixDQUEzQztJQUNBRSxLQUFLLElBQUksQ0FBQ0gsTUFBTSxDQUFDQyxNQUFNLEdBQUcsQ0FBVixDQUFOLEdBQXFCLElBQXRCLE1BQWdDLENBQXpDO0lBRUEsTUFBTUcsT0FBTyxHQUFHLENBQUNKLE1BQU0sQ0FBQ0MsTUFBTSxHQUFHLENBQVYsQ0FBTixHQUFxQixJQUF0QixNQUFnQyxDQUFoRDtJQUVBLE1BQU1JLE1BQU0sR0FBR0wsTUFBTSxDQUFDQyxNQUFNLEdBQUcsQ0FBVixDQUFyQjtJQUVBLE9BQU8sSUFBSSxJQUFKLENBQVNDLElBQVQsRUFBZUMsS0FBZixFQUFzQkMsT0FBdEIsRUFBK0JDLE1BQS9CLENBQVA7RUFDRDs7RUFFREMsV0FBVyxDQUFDSixJQUFELEVBQWVDLEtBQWYsRUFBOEJDLE9BQTlCLEVBQStDQyxNQUEvQyxFQUErRDtJQUFBLEtBdkJqRUgsSUF1QmlFO0lBQUEsS0F0QmpFQyxLQXNCaUU7SUFBQSxLQXJCakVDLE9BcUJpRTtJQUFBLEtBcEJqRUMsTUFvQmlFO0lBQUEsS0FuQmpFRSxRQW1CaUU7SUFBQSxLQWpCbEVQLE1BaUJrRTtJQUN4RSxLQUFLQSxNQUFMLEdBQWNRLFNBQWQ7SUFFQSxLQUFLTixJQUFMLEdBQVlBLElBQVo7SUFDQSxLQUFLQyxLQUFMLEdBQWFBLEtBQWI7SUFDQSxLQUFLQyxPQUFMLEdBQWVBLE9BQWY7SUFDQSxLQUFLQyxNQUFMLEdBQWNBLE1BQWQ7O0lBRUEsSUFBSSxLQUFLRixLQUFMLEdBQWFiLEtBQUssQ0FBQ08sSUFBdkIsRUFBNkI7TUFDM0IsS0FBS1UsUUFBTCxHQUFnQixPQUFoQjtJQUNELENBRkQsTUFFTyxJQUFJLEtBQUtGLE1BQVQsRUFBaUI7TUFDdEIsS0FBS0UsUUFBTCxHQUFnQmxCLGdCQUFnQixDQUFDLEtBQUtnQixNQUFOLENBQWhDO0lBQ0QsQ0FGTSxNQUVBO01BQ0w7TUFDQTtNQUNBLE1BQU1JLFVBQVUsR0FBRyxLQUFLUCxJQUFMLEdBQVksTUFBL0I7TUFDQSxLQUFLSyxRQUFMLEdBQWdCbkIsb0JBQW9CLENBQUNxQixVQUFELENBQXBDO0lBQ0Q7RUFDRjs7RUFFREMsUUFBUSxHQUFXO0lBQ2pCLElBQUksS0FBS1YsTUFBVCxFQUFpQjtNQUNmLE9BQU8sS0FBS0EsTUFBWjtJQUNEOztJQUVELEtBQUtBLE1BQUwsR0FBY1csTUFBTSxDQUFDQyxLQUFQLENBQWEsQ0FBYixDQUFkO0lBRUEsS0FBS1osTUFBTCxDQUFZLENBQVosSUFBaUIsS0FBS0UsSUFBTCxHQUFZLElBQTdCO0lBQ0EsS0FBS0YsTUFBTCxDQUFZLENBQVosSUFBa0IsS0FBS0UsSUFBTCxLQUFjLENBQWYsR0FBb0IsSUFBckM7SUFDQSxLQUFLRixNQUFMLENBQVksQ0FBWixJQUFtQixLQUFLRSxJQUFMLEtBQWMsRUFBZixHQUFxQixJQUF0QixHQUErQixDQUFDLEtBQUtDLEtBQUwsR0FBYSxJQUFkLEtBQXVCLENBQXZFO0lBQ0EsS0FBS0gsTUFBTCxDQUFZLENBQVosSUFBa0IsQ0FBQyxLQUFLRyxLQUFMLEdBQWEsSUFBZCxNQUF3QixDQUF6QixHQUErQixDQUFDLEtBQUtDLE9BQUwsR0FBZSxJQUFoQixLQUF5QixDQUF6RTtJQUNBLEtBQUtKLE1BQUwsQ0FBWSxDQUFaLElBQWlCLEtBQUtLLE1BQUwsR0FBYyxJQUEvQjtJQUVBLE9BQU8sS0FBS0wsTUFBWjtFQUNEOztBQTFEb0IifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _crypto = _interopRequireDefault(require("crypto"));

var _os = _interopRequireDefault(require("os"));

var _dns = _interopRequireDefault(require("dns"));

var _constants = _interopRequireDefault(require("constants"));

var _stream = require("stream");

var _identity = require("@azure/identity");

var _bulkLoad = _interopRequireDefault(require("./bulk-load"));

var _debug = _interopRequireDefault(require("./debug"));

var _events = require("events");

var _instanceLookup = require("./instance-lookup");

var _transientErrorLookup = require("./transient-error-lookup");

var _packet = require("./packet");

var _preloginPayload = _interopRequireDefault(require("./prelogin-payload"));

var _login7Payload = _interopRequireDefault(require("./login7-payload"));

var _ntlmPayload = _interopRequireDefault(require("./ntlm-payload"));

var _request = _interopRequireDefault(require("./request"));

var _rpcrequestPayload = _interopRequireDefault(require("./rpcrequest-payload"));

var _sqlbatchPayload = _interopRequireDefault(require("./sqlbatch-payload"));

var _messageIo = _interopRequireDefault(require("./message-io"));

var _tokenStreamParser = require("./token/token-stream-parser");

var _transaction = require("./transaction");

var _errors = require("./errors");

var _connector = require("./connector");

var _library = require("./library");

var _tdsVersions = require("./tds-versions");

var _message = _interopRequireDefault(require("./message"));

var _ntlm = require("./ntlm");

var _nodeAbortController = require("node-abort-controller");

var _dataType = require("./data-type");

var _bulkLoadPayload = require("./bulk-load-payload");

var _esAggregateError = _interopRequireDefault(require("es-aggregate-error"));

var _package = require("../package.json");

var _url = require("url");

var _handler = require("./token/handler");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/**
 * @private
 */
const KEEP_ALIVE_INITIAL_DELAY = 30 * 1000;
/**
 * @private
 */

const DEFAULT_CONNECT_TIMEOUT = 15 * 1000;
/**
 * @private
 */

const DEFAULT_CLIENT_REQUEST_TIMEOUT = 15 * 1000;
/**
 * @private
 */

const DEFAULT_CANCEL_TIMEOUT = 5 * 1000;
/**
 * @private
 */

const DEFAULT_CONNECT_RETRY_INTERVAL = 500;
/**
 * @private
 */

const DEFAULT_PACKET_SIZE = 4 * 1024;
/**
 * @private
 */

const DEFAULT_TEXTSIZE = 2147483647;
/**
 * @private
 */

const DEFAULT_DATEFIRST = 7;
/**
 * @private
 */

const DEFAULT_PORT = 1433;
/**
 * @private
 */

const DEFAULT_TDS_VERSION = '7_4';
/**
 * @private
 */

const DEFAULT_LANGUAGE = 'us_english';
/**
 * @private
 */

const DEFAULT_DATEFORMAT = 'mdy';

/**
 * @private
 */
const CLEANUP_TYPE = {
  NORMAL: 0,
  REDIRECT: 1,
  RETRY: 2
};

/**
 * A [[Connection]] instance represents a single connection to a database server.
 *
 * ```js
 * var Connection = require('tedious').Connection;
 * var config = {
 *  "authentication": {
 *    ...,
 *    "options": {...}
 *  },
 *  "options": {...}
 * };
 * var connection = new Connection(config);
 * ```
 *
 * Only one request at a time may be executed on a connection. Once a [[Request]]
 * has been initiated (with [[Connection.callProcedure]], [[Connection.execSql]],
 * or [[Connection.execSqlBatch]]), another should not be initiated until the
 * [[Request]]'s completion callback is called.
 */
class Connection extends _events.EventEmitter {
  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * Note: be aware of the different options field:
   * 1. config.authentication.options
   * 2. config.options
   *
   * ```js
   * const { Connection } = require('tedious');
   *
   * const config = {
   *  "authentication": {
   *    ...,
   *    "options": {...}
   *  },
   *  "options": {...}
   * };
   *
   * const connection = new Connection(config);
   * ```
   *
   * @param config
   */
  constructor(config) {
    super();
    this.fedAuthRequired = void 0;
    this.config = void 0;
    this.secureContextOptions = void 0;
    this.inTransaction = void 0;
    this.transactionDescriptors = void 0;
    this.transactionDepth = void 0;
    this.isSqlBatch = void 0;
    this.curTransientRetryCount = void 0;
    this.transientErrorLookup = void 0;
    this.closed = void 0;
    this.loginError = void 0;
    this.debug = void 0;
    this.ntlmpacket = void 0;
    this.ntlmpacketBuffer = void 0;
    this.routingData = void 0;
    this.messageIo = void 0;
    this.state = void 0;
    this.resetConnectionOnNextRequest = void 0;
    this.request = void 0;
    this.procReturnStatusValue = void 0;
    this.socket = void 0;
    this.messageBuffer = void 0;
    this.connectTimer = void 0;
    this.cancelTimer = void 0;
    this.requestTimer = void 0;
    this.retryTimer = void 0;
    this._cancelAfterRequestSent = void 0;
    this.databaseCollation = void 0;

    if (typeof config !== 'object' || config === null) {
      throw new TypeError('The "config" argument is required and must be of type Object.');
    }

    if (typeof config.server !== 'string') {
      throw new TypeError('The "config.server" property is required and must be of type string.');
    }

    this.fedAuthRequired = false;
    let authentication;

    if (config.authentication !== undefined) {
      if (typeof config.authentication !== 'object' || config.authentication === null) {
        throw new TypeError('The "config.authentication" property must be of type Object.');
      }

      const type = config.authentication.type;
      const options = config.authentication.options === undefined ? {} : config.authentication.options;

      if (typeof type !== 'string') {
        throw new TypeError('The "config.authentication.type" property must be of type string.');
      }

      if (type !== 'default' && type !== 'ntlm' && type !== 'azure-active-directory-password' && type !== 'azure-active-directory-access-token' && type !== 'azure-active-directory-msi-vm' && type !== 'azure-active-directory-msi-app-service' && type !== 'azure-active-directory-service-principal-secret' && type !== 'azure-active-directory-default') {
        throw new TypeError('The "type" property must one of "default", "ntlm", "azure-active-directory-password", "azure-active-directory-access-token", "azure-active-directory-default", "azure-active-directory-msi-vm" or "azure-active-directory-msi-app-service" or "azure-active-directory-service-principal-secret".');
      }

      if (typeof options !== 'object' || options === null) {
        throw new TypeError('The "config.authentication.options" property must be of type object.');
      }

      if (type === 'ntlm') {
        if (typeof options.domain !== 'string') {
          throw new TypeError('The "config.authentication.options.domain" property must be of type string.');
        }

        if (options.userName !== undefined && typeof options.userName !== 'string') {
          throw new TypeError('The "config.authentication.options.userName" property must be of type string.');
        }

        if (options.password !== undefined && typeof options.password !== 'string') {
          throw new TypeError('The "config.authentication.options.password" property must be of type string.');
        }

        authentication = {
          type: 'ntlm',
          options: {
            userName: options.userName,
            password: options.password,
            domain: options.domain && options.domain.toUpperCase()
          }
        };
      } else if (type === 'azure-active-directory-password') {
        if (typeof options.clientId !== 'string') {
          throw new TypeError('The "config.authentication.options.clientId" property must be of type string.');
        }

        if (options.userName !== undefined && typeof options.userName !== 'string') {
          throw new TypeError('The "config.authentication.options.userName" property must be of type string.');
        }

        if (options.password !== undefined && typeof options.password !== 'string') {
          throw new TypeError('The "config.authentication.options.password" property must be of type string.');
        }

        if (options.tenantId !== undefined && typeof options.tenantId !== 'string') {
          throw new TypeError('The "config.authentication.options.tenantId" property must be of type string.');
        }

        authentication = {
          type: 'azure-active-directory-password',
          options: {
            userName: options.userName,
            password: options.password,
            tenantId: options.tenantId,
            clientId: options.clientId
          }
        };
      } else if (type === 'azure-active-directory-access-token') {
        if (typeof options.token !== 'string') {
          throw new TypeError('The "config.authentication.options.token" property must be of type string.');
        }

        authentication = {
          type: 'azure-active-directory-access-token',
          options: {
            token: options.token
          }
        };
      } else if (type === 'azure-active-directory-msi-vm') {
        if (options.clientId !== undefined && typeof options.clientId !== 'string') {
          throw new TypeError('The "config.authentication.options.clientId" property must be of type string.');
        }

        authentication = {
          type: 'azure-active-directory-msi-vm',
          options: {
            clientId: options.clientId
          }
        };
      } else if (type === 'azure-active-directory-default') {
        if (options.clientId !== undefined && typeof options.clientId !== 'string') {
          throw new TypeError('The "config.authentication.options.clientId" property must be of type string.');
        }

        authentication = {
          type: 'azure-active-directory-default',
          options: {
            clientId: options.clientId
          }
        };
      } else if (type === 'azure-active-directory-msi-app-service') {
        if (options.clientId !== undefined && typeof options.clientId !== 'string') {
          throw new TypeError('The "config.authentication.options.clientId" property must be of type string.');
        }

        authentication = {
          type: 'azure-active-directory-msi-app-service',
          options: {
            clientId: options.clientId
          }
        };
      } else if (type === 'azure-active-directory-service-principal-secret') {
        if (typeof options.clientId !== 'string') {
          throw new TypeError('The "config.authentication.options.clientId" property must be of type string.');
        }

        if (typeof options.clientSecret !== 'string') {
          throw new TypeError('The "config.authentication.options.clientSecret" property must be of type string.');
        }

        if (typeof options.tenantId !== 'string') {
          throw new TypeError('The "config.authentication.options.tenantId" property must be of type string.');
        }

        authentication = {
          type: 'azure-active-directory-service-principal-secret',
          options: {
            clientId: options.clientId,
            clientSecret: options.clientSecret,
            tenantId: options.tenantId
          }
        };
      } else {
        if (options.userName !== undefined && typeof options.userName !== 'string') {
          throw new TypeError('The "config.authentication.options.userName" property must be of type string.');
        }

        if (options.password !== undefined && typeof options.password !== 'string') {
          throw new TypeError('The "config.authentication.options.password" property must be of type string.');
        }

        authentication = {
          type: 'default',
          options: {
            userName: options.userName,
            password: options.password
          }
        };
      }
    } else {
      authentication = {
        type: 'default',
        options: {
          userName: undefined,
          password: undefined
        }
      };
    }

    this.config = {
      server: config.server,
      authentication: authentication,
      options: {
        abortTransactionOnError: false,
        appName: undefined,
        camelCaseColumns: false,
        cancelTimeout: DEFAULT_CANCEL_TIMEOUT,
        columnEncryptionKeyCacheTTL: 2 * 60 * 60 * 1000,
        // Units: miliseconds
        columnEncryptionSetting: false,
        columnNameReplacer: undefined,
        connectionRetryInterval: DEFAULT_CONNECT_RETRY_INTERVAL,
        connectTimeout: DEFAULT_CONNECT_TIMEOUT,
        connectionIsolationLevel: _transaction.ISOLATION_LEVEL.READ_COMMITTED,
        cryptoCredentialsDetails: {},
        database: undefined,
        datefirst: DEFAULT_DATEFIRST,
        dateFormat: DEFAULT_DATEFORMAT,
        debug: {
          data: false,
          packet: false,
          payload: false,
          token: false
        },
        enableAnsiNull: true,
        enableAnsiNullDefault: true,
        enableAnsiPadding: true,
        enableAnsiWarnings: true,
        enableArithAbort: true,
        enableConcatNullYieldsNull: true,
        enableCursorCloseOnCommit: null,
        enableImplicitTransactions: false,
        enableNumericRoundabort: false,
        enableQuotedIdentifier: true,
        encrypt: true,
        fallbackToDefaultDb: false,
        encryptionKeyStoreProviders: undefined,
        instanceName: undefined,
        isolationLevel: _transaction.ISOLATION_LEVEL.READ_COMMITTED,
        language: DEFAULT_LANGUAGE,
        localAddress: undefined,
        maxRetriesOnTransientErrors: 3,
        multiSubnetFailover: false,
        packetSize: DEFAULT_PACKET_SIZE,
        port: DEFAULT_PORT,
        readOnlyIntent: false,
        requestTimeout: DEFAULT_CLIENT_REQUEST_TIMEOUT,
        rowCollectionOnDone: false,
        rowCollectionOnRequestCompletion: false,
        serverName: undefined,
        serverSupportsColumnEncryption: false,
        tdsVersion: DEFAULT_TDS_VERSION,
        textsize: DEFAULT_TEXTSIZE,
        trustedServerNameAE: undefined,
        trustServerCertificate: false,
        useColumnNames: false,
        useUTC: true,
        workstationId: undefined,
        lowerCaseGuids: false
      }
    };

    if (config.options) {
      if (config.options.port && config.options.instanceName) {
        throw new Error('Port and instanceName are mutually exclusive, but ' + config.options.port + ' and ' + config.options.instanceName + ' provided');
      }

      if (config.options.abortTransactionOnError !== undefined) {
        if (typeof config.options.abortTransactionOnError !== 'boolean' && config.options.abortTransactionOnError !== null) {
          throw new TypeError('The "config.options.abortTransactionOnError" property must be of type string or null.');
        }

        this.config.options.abortTransactionOnError = config.options.abortTransactionOnError;
      }

      if (config.options.appName !== undefined) {
        if (typeof config.options.appName !== 'string') {
          throw new TypeError('The "config.options.appName" property must be of type string.');
        }

        this.config.options.appName = config.options.appName;
      }

      if (config.options.camelCaseColumns !== undefined) {
        if (typeof config.options.camelCaseColumns !== 'boolean') {
          throw new TypeError('The "config.options.camelCaseColumns" property must be of type boolean.');
        }

        this.config.options.camelCaseColumns = config.options.camelCaseColumns;
      }

      if (config.options.cancelTimeout !== undefined) {
        if (typeof config.options.cancelTimeout !== 'number') {
          throw new TypeError('The "config.options.cancelTimeout" property must be of type number.');
        }

        this.config.options.cancelTimeout = config.options.cancelTimeout;
      }

      if (config.options.columnNameReplacer) {
        if (typeof config.options.columnNameReplacer !== 'function') {
          throw new TypeError('The "config.options.cancelTimeout" property must be of type function.');
        }

        this.config.options.columnNameReplacer = config.options.columnNameReplacer;
      }

      if (config.options.connectTimeout !== undefined) {
        if (typeof config.options.connectTimeout !== 'number') {
          throw new TypeError('The "config.options.connectTimeout" property must be of type number.');
        }

        this.config.options.connectTimeout = config.options.connectTimeout;
      }

      if (config.options.connectionIsolationLevel !== undefined) {
        (0, _transaction.assertValidIsolationLevel)(config.options.connectionIsolationLevel, 'config.options.connectionIsolationLevel');
        this.config.options.connectionIsolationLevel = config.options.connectionIsolationLevel;
      }

      if (config.options.connectTimeout !== undefined) {
        if (typeof config.options.connectTimeout !== 'number') {
          throw new TypeError('The "config.options.connectTimeout" property must be of type number.');
        }

        this.config.options.connectTimeout = config.options.connectTimeout;
      }

      if (config.options.cryptoCredentialsDetails !== undefined) {
        if (typeof config.options.cryptoCredentialsDetails !== 'object' || config.options.cryptoCredentialsDetails === null) {
          throw new TypeError('The "config.options.cryptoCredentialsDetails" property must be of type Object.');
        }

        this.config.options.cryptoCredentialsDetails = config.options.cryptoCredentialsDetails;
      }

      if (config.options.database !== undefined) {
        if (typeof config.options.database !== 'string') {
          throw new TypeError('The "config.options.database" property must be of type string.');
        }

        this.config.options.database = config.options.database;
      }

      if (config.options.datefirst !== undefined) {
        if (typeof config.options.datefirst !== 'number' && config.options.datefirst !== null) {
          throw new TypeError('The "config.options.datefirst" property must be of type number.');
        }

        if (config.options.datefirst !== null && (config.options.datefirst < 1 || config.options.datefirst > 7)) {
          throw new RangeError('The "config.options.datefirst" property must be >= 1 and <= 7');
        }

        this.config.options.datefirst = config.options.datefirst;
      }

      if (config.options.dateFormat !== undefined) {
        if (typeof config.options.dateFormat !== 'string' && config.options.dateFormat !== null) {
          throw new TypeError('The "config.options.dateFormat" property must be of type string or null.');
        }

        this.config.options.dateFormat = config.options.dateFormat;
      }

      if (config.options.debug) {
        if (config.options.debug.data !== undefined) {
          if (typeof config.options.debug.data !== 'boolean') {
            throw new TypeError('The "config.options.debug.data" property must be of type boolean.');
          }

          this.config.options.debug.data = config.options.debug.data;
        }

        if (config.options.debug.packet !== undefined) {
          if (typeof config.options.debug.packet !== 'boolean') {
            throw new TypeError('The "config.options.debug.packet" property must be of type boolean.');
          }

          this.config.options.debug.packet = config.options.debug.packet;
        }

        if (config.options.debug.payload !== undefined) {
          if (typeof config.options.debug.payload !== 'boolean') {
            throw new TypeError('The "config.options.debug.payload" property must be of type boolean.');
          }

          this.config.options.debug.payload = config.options.debug.payload;
        }

        if (config.options.debug.token !== undefined) {
          if (typeof config.options.debug.token !== 'boolean') {
            throw new TypeError('The "config.options.debug.token" property must be of type boolean.');
          }

          this.config.options.debug.token = config.options.debug.token;
        }
      }

      if (config.options.enableAnsiNull !== undefined) {
        if (typeof config.options.enableAnsiNull !== 'boolean' && config.options.enableAnsiNull !== null) {
          throw new TypeError('The "config.options.enableAnsiNull" property must be of type boolean or null.');
        }

        this.config.options.enableAnsiNull = config.options.enableAnsiNull;
      }

      if (config.options.enableAnsiNullDefault !== undefined) {
        if (typeof config.options.enableAnsiNullDefault !== 'boolean' && config.options.enableAnsiNullDefault !== null) {
          throw new TypeError('The "config.options.enableAnsiNullDefault" property must be of type boolean or null.');
        }

        this.config.options.enableAnsiNullDefault = config.options.enableAnsiNullDefault;
      }

      if (config.options.enableAnsiPadding !== undefined) {
        if (typeof config.options.enableAnsiPadding !== 'boolean' && config.options.enableAnsiPadding !== null) {
          throw new TypeError('The "config.options.enableAnsiPadding" property must be of type boolean or null.');
        }

        this.config.options.enableAnsiPadding = config.options.enableAnsiPadding;
      }

      if (config.options.enableAnsiWarnings !== undefined) {
        if (typeof config.options.enableAnsiWarnings !== 'boolean' && config.options.enableAnsiWarnings !== null) {
          throw new TypeError('The "config.options.enableAnsiWarnings" property must be of type boolean or null.');
        }

        this.config.options.enableAnsiWarnings = config.options.enableAnsiWarnings;
      }

      if (config.options.enableArithAbort !== undefined) {
        if (typeof config.options.enableArithAbort !== 'boolean' && config.options.enableArithAbort !== null) {
          throw new TypeError('The "config.options.enableArithAbort" property must be of type boolean or null.');
        }

        this.config.options.enableArithAbort = config.options.enableArithAbort;
      }

      if (config.options.enableConcatNullYieldsNull !== undefined) {
        if (typeof config.options.enableConcatNullYieldsNull !== 'boolean' && config.options.enableConcatNullYieldsNull !== null) {
          throw new TypeError('The "config.options.enableConcatNullYieldsNull" property must be of type boolean or null.');
        }

        this.config.options.enableConcatNullYieldsNull = config.options.enableConcatNullYieldsNull;
      }

      if (config.options.enableCursorCloseOnCommit !== undefined) {
        if (typeof config.options.enableCursorCloseOnCommit !== 'boolean' && config.options.enableCursorCloseOnCommit !== null) {
          throw new TypeError('The "config.options.enableCursorCloseOnCommit" property must be of type boolean or null.');
        }

        this.config.options.enableCursorCloseOnCommit = config.options.enableCursorCloseOnCommit;
      }

      if (config.options.enableImplicitTransactions !== undefined) {
        if (typeof config.options.enableImplicitTransactions !== 'boolean' && config.options.enableImplicitTransactions !== null) {
          throw new TypeError('The "config.options.enableImplicitTransactions" property must be of type boolean or null.');
        }

        this.config.options.enableImplicitTransactions = config.options.enableImplicitTransactions;
      }

      if (config.options.enableNumericRoundabort !== undefined) {
        if (typeof config.options.enableNumericRoundabort !== 'boolean' && config.options.enableNumericRoundabort !== null) {
          throw new TypeError('The "config.options.enableNumericRoundabort" property must be of type boolean or null.');
        }

        this.config.options.enableNumericRoundabort = config.options.enableNumericRoundabort;
      }

      if (config.options.enableQuotedIdentifier !== undefined) {
        if (typeof config.options.enableQuotedIdentifier !== 'boolean' && config.options.enableQuotedIdentifier !== null) {
          throw new TypeError('The "config.options.enableQuotedIdentifier" property must be of type boolean or null.');
        }

        this.config.options.enableQuotedIdentifier = config.options.enableQuotedIdentifier;
      }

      if (config.options.encrypt !== undefined) {
        if (typeof config.options.encrypt !== 'boolean') {
          throw new TypeError('The "config.options.encrypt" property must be of type boolean.');
        }

        this.config.options.encrypt = config.options.encrypt;
      }

      if (config.options.fallbackToDefaultDb !== undefined) {
        if (typeof config.options.fallbackToDefaultDb !== 'boolean') {
          throw new TypeError('The "config.options.fallbackToDefaultDb" property must be of type boolean.');
        }

        this.config.options.fallbackToDefaultDb = config.options.fallbackToDefaultDb;
      }

      if (config.options.instanceName !== undefined) {
        if (typeof config.options.instanceName !== 'string') {
          throw new TypeError('The "config.options.instanceName" property must be of type string.');
        }

        this.config.options.instanceName = config.options.instanceName;
        this.config.options.port = undefined;
      }

      if (config.options.isolationLevel !== undefined) {
        (0, _transaction.assertValidIsolationLevel)(config.options.isolationLevel, 'config.options.isolationLevel');
        this.config.options.isolationLevel = config.options.isolationLevel;
      }

      if (config.options.language !== undefined) {
        if (typeof config.options.language !== 'string' && config.options.language !== null) {
          throw new TypeError('The "config.options.language" property must be of type string or null.');
        }

        this.config.options.language = config.options.language;
      }

      if (config.options.localAddress !== undefined) {
        if (typeof config.options.localAddress !== 'string') {
          throw new TypeError('The "config.options.localAddress" property must be of type string.');
        }

        this.config.options.localAddress = config.options.localAddress;
      }

      if (config.options.multiSubnetFailover !== undefined) {
        if (typeof config.options.multiSubnetFailover !== 'boolean') {
          throw new TypeError('The "config.options.multiSubnetFailover" property must be of type boolean.');
        }

        this.config.options.multiSubnetFailover = config.options.multiSubnetFailover;
      }

      if (config.options.packetSize !== undefined) {
        if (typeof config.options.packetSize !== 'number') {
          throw new TypeError('The "config.options.packetSize" property must be of type number.');
        }

        this.config.options.packetSize = config.options.packetSize;
      }

      if (config.options.port !== undefined) {
        if (typeof config.options.port !== 'number') {
          throw new TypeError('The "config.options.port" property must be of type number.');
        }

        if (config.options.port <= 0 || config.options.port >= 65536) {
          throw new RangeError('The "config.options.port" property must be > 0 and < 65536');
        }

        this.config.options.port = config.options.port;
        this.config.options.instanceName = undefined;
      }

      if (config.options.readOnlyIntent !== undefined) {
        if (typeof config.options.readOnlyIntent !== 'boolean') {
          throw new TypeError('The "config.options.readOnlyIntent" property must be of type boolean.');
        }

        this.config.options.readOnlyIntent = config.options.readOnlyIntent;
      }

      if (config.options.requestTimeout !== undefined) {
        if (typeof config.options.requestTimeout !== 'number') {
          throw new TypeError('The "config.options.requestTimeout" property must be of type number.');
        }

        this.config.options.requestTimeout = config.options.requestTimeout;
      }

      if (config.options.maxRetriesOnTransientErrors !== undefined) {
        if (typeof config.options.maxRetriesOnTransientErrors !== 'number') {
          throw new TypeError('The "config.options.maxRetriesOnTransientErrors" property must be of type number.');
        }

        if (config.options.maxRetriesOnTransientErrors < 0) {
          throw new TypeError('The "config.options.maxRetriesOnTransientErrors" property must be equal or greater than 0.');
        }

        this.config.options.maxRetriesOnTransientErrors = config.options.maxRetriesOnTransientErrors;
      }

      if (config.options.connectionRetryInterval !== undefined) {
        if (typeof config.options.connectionRetryInterval !== 'number') {
          throw new TypeError('The "config.options.connectionRetryInterval" property must be of type number.');
        }

        if (config.options.connectionRetryInterval <= 0) {
          throw new TypeError('The "config.options.connectionRetryInterval" property must be greater than 0.');
        }

        this.config.options.connectionRetryInterval = config.options.connectionRetryInterval;
      }

      if (config.options.rowCollectionOnDone !== undefined) {
        if (typeof config.options.rowCollectionOnDone !== 'boolean') {
          throw new TypeError('The "config.options.rowCollectionOnDone" property must be of type boolean.');
        }

        this.config.options.rowCollectionOnDone = config.options.rowCollectionOnDone;
      }

      if (config.options.rowCollectionOnRequestCompletion !== undefined) {
        if (typeof config.options.rowCollectionOnRequestCompletion !== 'boolean') {
          throw new TypeError('The "config.options.rowCollectionOnRequestCompletion" property must be of type boolean.');
        }

        this.config.options.rowCollectionOnRequestCompletion = config.options.rowCollectionOnRequestCompletion;
      }

      if (config.options.tdsVersion !== undefined) {
        if (typeof config.options.tdsVersion !== 'string') {
          throw new TypeError('The "config.options.tdsVersion" property must be of type string.');
        }

        this.config.options.tdsVersion = config.options.tdsVersion;
      }

      if (config.options.textsize !== undefined) {
        if (typeof config.options.textsize !== 'number' && config.options.textsize !== null) {
          throw new TypeError('The "config.options.textsize" property must be of type number or null.');
        }

        if (config.options.textsize > 2147483647) {
          throw new TypeError('The "config.options.textsize" can\'t be greater than 2147483647.');
        } else if (config.options.textsize < -1) {
          throw new TypeError('The "config.options.textsize" can\'t be smaller than -1.');
        }

        this.config.options.textsize = config.options.textsize | 0;
      }

      if (config.options.trustServerCertificate !== undefined) {
        if (typeof config.options.trustServerCertificate !== 'boolean') {
          throw new TypeError('The "config.options.trustServerCertificate" property must be of type boolean.');
        }

        this.config.options.trustServerCertificate = config.options.trustServerCertificate;
      }

      if (config.options.useColumnNames !== undefined) {
        if (typeof config.options.useColumnNames !== 'boolean') {
          throw new TypeError('The "config.options.useColumnNames" property must be of type boolean.');
        }

        this.config.options.useColumnNames = config.options.useColumnNames;
      }

      if (config.options.useUTC !== undefined) {
        if (typeof config.options.useUTC !== 'boolean') {
          throw new TypeError('The "config.options.useUTC" property must be of type boolean.');
        }

        this.config.options.useUTC = config.options.useUTC;
      }

      if (config.options.workstationId !== undefined) {
        if (typeof config.options.workstationId !== 'string') {
          throw new TypeError('The "config.options.workstationId" property must be of type string.');
        }

        this.config.options.workstationId = config.options.workstationId;
      }

      if (config.options.lowerCaseGuids !== undefined) {
        if (typeof config.options.lowerCaseGuids !== 'boolean') {
          throw new TypeError('The "config.options.lowerCaseGuids" property must be of type boolean.');
        }

        this.config.options.lowerCaseGuids = config.options.lowerCaseGuids;
      }
    }

    this.secureContextOptions = this.config.options.cryptoCredentialsDetails;

    if (this.secureContextOptions.secureOptions === undefined) {
      // If the caller has not specified their own `secureOptions`,
      // we set `SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS` here.
      // Older SQL Server instances running on older Windows versions have
      // trouble with the BEAST workaround in OpenSSL.
      // As BEAST is a browser specific exploit, we can just disable this option here.
      this.secureContextOptions = Object.create(this.secureContextOptions, {
        secureOptions: {
          value: _constants.default.SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS
        }
      });
    }

    this.debug = this.createDebug();
    this.inTransaction = false;
    this.transactionDescriptors = [Buffer.from([0, 0, 0, 0, 0, 0, 0, 0])]; // 'beginTransaction', 'commitTransaction' and 'rollbackTransaction'
    // events are utilized to maintain inTransaction property state which in
    // turn is used in managing transactions. These events are only fired for
    // TDS version 7.2 and beyond. The properties below are used to emulate
    // equivalent behavior for TDS versions before 7.2.

    this.transactionDepth = 0;
    this.isSqlBatch = false;
    this.closed = false;
    this.messageBuffer = Buffer.alloc(0);
    this.curTransientRetryCount = 0;
    this.transientErrorLookup = new _transientErrorLookup.TransientErrorLookup();
    this.state = this.STATE.INITIALIZED;

    this._cancelAfterRequestSent = () => {
      this.messageIo.sendMessage(_packet.TYPE.ATTENTION);
      this.createCancelTimer();
    };
  }

  connect(connectListener) {
    if (this.state !== this.STATE.INITIALIZED) {
      throw new _errors.ConnectionError('`.connect` can not be called on a Connection in `' + this.state.name + '` state.');
    }

    if (connectListener) {
      const onConnect = err => {
        this.removeListener('error', onError);
        connectListener(err);
      };

      const onError = err => {
        this.removeListener('connect', onConnect);
        connectListener(err);
      };

      this.once('connect', onConnect);
      this.once('error', onError);
    }

    this.transitionTo(this.STATE.CONNECTING);
  }
  /**
   * The server has reported that the charset has changed.
   */


  on(event, listener) {
    return super.on(event, listener);
  }
  /**
   * @private
   */


  emit(event, ...args) {
    return super.emit(event, ...args);
  }
  /**
   * Closes the connection to the database.
   *
   * The [[Event_end]] will be emitted once the connection has been closed.
   */


  close() {
    this.transitionTo(this.STATE.FINAL);
  }
  /**
   * @private
   */


  initialiseConnection() {
    const signal = this.createConnectTimer();

    if (this.config.options.port) {
      return this.connectOnPort(this.config.options.port, this.config.options.multiSubnetFailover, signal);
    } else {
      return (0, _instanceLookup.instanceLookup)({
        server: this.config.server,
        instanceName: this.config.options.instanceName,
        timeout: this.config.options.connectTimeout,
        signal: signal
      }).then(port => {
        process.nextTick(() => {
          this.connectOnPort(port, this.config.options.multiSubnetFailover, signal);
        });
      }, err => {
        if (err.name === 'AbortError') {
          // Ignore the AbortError for now, this is still handled by the connectTimer firing
          return;
        }

        process.nextTick(() => {
          this.emit('connect', new _errors.ConnectionError(err.message, 'EINSTLOOKUP'));
        });
      });
    }
  }
  /**
   * @private
   */


  cleanupConnection(cleanupType) {
    if (!this.closed) {
      this.clearConnectTimer();
      this.clearRequestTimer();
      this.clearRetryTimer();
      this.closeConnection();

      if (cleanupType === CLEANUP_TYPE.REDIRECT) {
        this.emit('rerouting');
      } else if (cleanupType !== CLEANUP_TYPE.RETRY) {
        process.nextTick(() => {
          this.emit('end');
        });
      }

      const request = this.request;

      if (request) {
        const err = new _errors.RequestError('Connection closed before request completed.', 'ECLOSE');
        request.callback(err);
        this.request = undefined;
      }

      this.closed = true;
      this.loginError = undefined;
    }
  }
  /**
   * @private
   */


  createDebug() {
    const debug = new _debug.default(this.config.options.debug);
    debug.on('debug', message => {
      this.emit('debug', message);
    });
    return debug;
  }
  /**
   * @private
   */


  createTokenStreamParser(message, handler) {
    return new _tokenStreamParser.Parser(message, this.debug, handler, this.config.options);
  }

  connectOnPort(port, multiSubnetFailover, signal) {
    const connectOpts = {
      host: this.routingData ? this.routingData.server : this.config.server,
      port: this.routingData ? this.routingData.port : port,
      localAddress: this.config.options.localAddress
    };
    const connect = multiSubnetFailover ? _connector.connectInParallel : _connector.connectInSequence;
    connect(connectOpts, _dns.default.lookup, signal).then(socket => {
      process.nextTick(() => {
        socket.on('error', error => {
          this.socketError(error);
        });
        socket.on('close', () => {
          this.socketClose();
        });
        socket.on('end', () => {
          this.socketEnd();
        });
        socket.setKeepAlive(true, KEEP_ALIVE_INITIAL_DELAY);
        this.messageIo = new _messageIo.default(socket, this.config.options.packetSize, this.debug);
        this.messageIo.on('secure', cleartext => {
          this.emit('secure', cleartext);
        });
        this.socket = socket;
        this.closed = false;
        this.debug.log('connected to ' + this.config.server + ':' + this.config.options.port);
        this.sendPreLogin();
        this.transitionTo(this.STATE.SENT_PRELOGIN);
      });
    }, err => {
      if (err.name === 'AbortError') {
        return;
      }

      process.nextTick(() => {
        this.socketError(err);
      });
    });
  }
  /**
   * @private
   */


  closeConnection() {
    if (this.socket) {
      this.socket.destroy();
    }
  }
  /**
   * @private
   */


  createConnectTimer() {
    const controller = new _nodeAbortController.AbortController();
    this.connectTimer = setTimeout(() => {
      controller.abort();
      this.connectTimeout();
    }, this.config.options.connectTimeout);
    return controller.signal;
  }
  /**
   * @private
   */


  createCancelTimer() {
    this.clearCancelTimer();
    const timeout = this.config.options.cancelTimeout;

    if (timeout > 0) {
      this.cancelTimer = setTimeout(() => {
        this.cancelTimeout();
      }, timeout);
    }
  }
  /**
   * @private
   */


  createRequestTimer() {
    this.clearRequestTimer(); // release old timer, just to be safe

    const request = this.request;
    const timeout = request.timeout !== undefined ? request.timeout : this.config.options.requestTimeout;

    if (timeout) {
      this.requestTimer = setTimeout(() => {
        this.requestTimeout();
      }, timeout);
    }
  }
  /**
   * @private
   */


  createRetryTimer() {
    this.clearRetryTimer();
    this.retryTimer = setTimeout(() => {
      this.retryTimeout();
    }, this.config.options.connectionRetryInterval);
  }
  /**
   * @private
   */


  connectTimeout() {
    const message = `Failed to connect to ${this.config.server}${this.config.options.port ? `:${this.config.options.port}` : `\\${this.config.options.instanceName}`} in ${this.config.options.connectTimeout}ms`;
    this.debug.log(message);
    this.emit('connect', new _errors.ConnectionError(message, 'ETIMEOUT'));
    this.connectTimer = undefined;
    this.dispatchEvent('connectTimeout');
  }
  /**
   * @private
   */


  cancelTimeout() {
    const message = `Failed to cancel request in ${this.config.options.cancelTimeout}ms`;
    this.debug.log(message);
    this.dispatchEvent('socketError', new _errors.ConnectionError(message, 'ETIMEOUT'));
  }
  /**
   * @private
   */


  requestTimeout() {
    this.requestTimer = undefined;
    const request = this.request;
    request.cancel();
    const timeout = request.timeout !== undefined ? request.timeout : this.config.options.requestTimeout;
    const message = 'Timeout: Request failed to complete in ' + timeout + 'ms';
    request.error = new _errors.RequestError(message, 'ETIMEOUT');
  }
  /**
   * @private
   */


  retryTimeout() {
    this.retryTimer = undefined;
    this.emit('retry');
    this.transitionTo(this.STATE.CONNECTING);
  }
  /**
   * @private
   */


  clearConnectTimer() {
    if (this.connectTimer) {
      clearTimeout(this.connectTimer);
      this.connectTimer = undefined;
    }
  }
  /**
   * @private
   */


  clearCancelTimer() {
    if (this.cancelTimer) {
      clearTimeout(this.cancelTimer);
      this.cancelTimer = undefined;
    }
  }
  /**
   * @private
   */


  clearRequestTimer() {
    if (this.requestTimer) {
      clearTimeout(this.requestTimer);
      this.requestTimer = undefined;
    }
  }
  /**
   * @private
   */


  clearRetryTimer() {
    if (this.retryTimer) {
      clearTimeout(this.retryTimer);
      this.retryTimer = undefined;
    }
  }
  /**
   * @private
   */


  transitionTo(newState) {
    if (this.state === newState) {
      this.debug.log('State is already ' + newState.name);
      return;
    }

    if (this.state && this.state.exit) {
      this.state.exit.call(this, newState);
    }

    this.debug.log('State change: ' + (this.state ? this.state.name : 'undefined') + ' -> ' + newState.name);
    this.state = newState;

    if (this.state.enter) {
      this.state.enter.apply(this);
    }
  }
  /**
   * @private
   */


  getEventHandler(eventName) {
    const handler = this.state.events[eventName];

    if (!handler) {
      throw new Error(`No event '${eventName}' in state '${this.state.name}'`);
    }

    return handler;
  }
  /**
   * @private
   */


  dispatchEvent(eventName, ...args) {
    const handler = this.state.events[eventName];

    if (handler) {
      handler.apply(this, args);
    } else {
      this.emit('error', new Error(`No event '${eventName}' in state '${this.state.name}'`));
      this.close();
    }
  }
  /**
   * @private
   */


  socketError(error) {
    if (this.state === this.STATE.CONNECTING || this.state === this.STATE.SENT_TLSSSLNEGOTIATION) {
      const message = `Failed to connect to ${this.config.server}:${this.config.options.port} - ${error.message}`;
      this.debug.log(message);
      this.emit('connect', new _errors.ConnectionError(message, 'ESOCKET'));
    } else {
      const message = `Connection lost - ${error.message}`;
      this.debug.log(message);
      this.emit('error', new _errors.ConnectionError(message, 'ESOCKET'));
    }

    this.dispatchEvent('socketError', error);
  }
  /**
   * @private
   */


  socketEnd() {
    this.debug.log('socket ended');

    if (this.state !== this.STATE.FINAL) {
      const error = new Error('socket hang up');
      error.code = 'ECONNRESET';
      this.socketError(error);
    }
  }
  /**
   * @private
   */


  socketClose() {
    this.debug.log('connection to ' + this.config.server + ':' + this.config.options.port + ' closed');

    if (this.state === this.STATE.REROUTING) {
      this.debug.log('Rerouting to ' + this.routingData.server + ':' + this.routingData.port);
      this.dispatchEvent('reconnect');
    } else if (this.state === this.STATE.TRANSIENT_FAILURE_RETRY) {
      const server = this.routingData ? this.routingData.server : this.config.server;
      const port = this.routingData ? this.routingData.port : this.config.options.port;
      this.debug.log('Retry after transient failure connecting to ' + server + ':' + port);
      this.dispatchEvent('retry');
    } else {
      this.transitionTo(this.STATE.FINAL);
    }
  }
  /**
   * @private
   */


  sendPreLogin() {
    const [, major, minor, build] = /^(\d+)\.(\d+)\.(\d+)/.exec(_package.version) ?? ['0.0.0', '0', '0', '0'];
    const payload = new _preloginPayload.default({
      encrypt: this.config.options.encrypt,
      version: {
        major: Number(major),
        minor: Number(minor),
        build: Number(build),
        subbuild: 0
      }
    });
    this.messageIo.sendMessage(_packet.TYPE.PRELOGIN, payload.data);
    this.debug.payload(function () {
      return payload.toString('  ');
    });
  }
  /**
   * @private
   */


  sendLogin7Packet() {
    const payload = new _login7Payload.default({
      tdsVersion: _tdsVersions.versions[this.config.options.tdsVersion],
      packetSize: this.config.options.packetSize,
      clientProgVer: 0,
      clientPid: process.pid,
      connectionId: 0,
      clientTimeZone: new Date().getTimezoneOffset(),
      clientLcid: 0x00000409
    });
    const {
      authentication
    } = this.config;

    switch (authentication.type) {
      case 'azure-active-directory-password':
        payload.fedAuth = {
          type: 'ADAL',
          echo: this.fedAuthRequired,
          workflow: 'default'
        };
        break;

      case 'azure-active-directory-access-token':
        payload.fedAuth = {
          type: 'SECURITYTOKEN',
          echo: this.fedAuthRequired,
          fedAuthToken: authentication.options.token
        };
        break;

      case 'azure-active-directory-msi-vm':
      case 'azure-active-directory-default':
      case 'azure-active-directory-msi-app-service':
      case 'azure-active-directory-service-principal-secret':
        payload.fedAuth = {
          type: 'ADAL',
          echo: this.fedAuthRequired,
          workflow: 'integrated'
        };
        break;

      case 'ntlm':
        payload.sspi = (0, _ntlm.createNTLMRequest)({
          domain: authentication.options.domain
        });
        break;

      default:
        payload.userName = authentication.options.userName;
        payload.password = authentication.options.password;
    }

    payload.hostname = this.config.options.workstationId || _os.default.hostname();
    payload.serverName = this.routingData ? this.routingData.server : this.config.server;
    payload.appName = this.config.options.appName || 'Tedious';
    payload.libraryName = _library.name;
    payload.language = this.config.options.language;
    payload.database = this.config.options.database;
    payload.clientId = Buffer.from([1, 2, 3, 4, 5, 6]);
    payload.readOnlyIntent = this.config.options.readOnlyIntent;
    payload.initDbFatal = !this.config.options.fallbackToDefaultDb;
    this.routingData = undefined;
    this.messageIo.sendMessage(_packet.TYPE.LOGIN7, payload.toBuffer());
    this.debug.payload(function () {
      return payload.toString('  ');
    });
  }
  /**
   * @private
   */


  sendFedAuthTokenMessage(token) {
    const accessTokenLen = Buffer.byteLength(token, 'ucs2');
    const data = Buffer.alloc(8 + accessTokenLen);
    let offset = 0;
    offset = data.writeUInt32LE(accessTokenLen + 4, offset);
    offset = data.writeUInt32LE(accessTokenLen, offset);
    data.write(token, offset, 'ucs2');
    this.messageIo.sendMessage(_packet.TYPE.FEDAUTH_TOKEN, data); // sent the fedAuth token message, the rest is similar to standard login 7

    this.transitionTo(this.STATE.SENT_LOGIN7_WITH_STANDARD_LOGIN);
  }
  /**
   * @private
   */


  sendInitialSql() {
    const payload = new _sqlbatchPayload.default(this.getInitialSql(), this.currentTransactionDescriptor(), this.config.options);
    const message = new _message.default({
      type: _packet.TYPE.SQL_BATCH
    });
    this.messageIo.outgoingMessageStream.write(message);

    _stream.Readable.from(payload).pipe(message);
  }
  /**
   * @private
   */


  getInitialSql() {
    const options = [];

    if (this.config.options.enableAnsiNull === true) {
      options.push('set ansi_nulls on');
    } else if (this.config.options.enableAnsiNull === false) {
      options.push('set ansi_nulls off');
    }

    if (this.config.options.enableAnsiNullDefault === true) {
      options.push('set ansi_null_dflt_on on');
    } else if (this.config.options.enableAnsiNullDefault === false) {
      options.push('set ansi_null_dflt_on off');
    }

    if (this.config.options.enableAnsiPadding === true) {
      options.push('set ansi_padding on');
    } else if (this.config.options.enableAnsiPadding === false) {
      options.push('set ansi_padding off');
    }

    if (this.config.options.enableAnsiWarnings === true) {
      options.push('set ansi_warnings on');
    } else if (this.config.options.enableAnsiWarnings === false) {
      options.push('set ansi_warnings off');
    }

    if (this.config.options.enableArithAbort === true) {
      options.push('set arithabort on');
    } else if (this.config.options.enableArithAbort === false) {
      options.push('set arithabort off');
    }

    if (this.config.options.enableConcatNullYieldsNull === true) {
      options.push('set concat_null_yields_null on');
    } else if (this.config.options.enableConcatNullYieldsNull === false) {
      options.push('set concat_null_yields_null off');
    }

    if (this.config.options.enableCursorCloseOnCommit === true) {
      options.push('set cursor_close_on_commit on');
    } else if (this.config.options.enableCursorCloseOnCommit === false) {
      options.push('set cursor_close_on_commit off');
    }

    if (this.config.options.datefirst !== null) {
      options.push(`set datefirst ${this.config.options.datefirst}`);
    }

    if (this.config.options.dateFormat !== null) {
      options.push(`set dateformat ${this.config.options.dateFormat}`);
    }

    if (this.config.options.enableImplicitTransactions === true) {
      options.push('set implicit_transactions on');
    } else if (this.config.options.enableImplicitTransactions === false) {
      options.push('set implicit_transactions off');
    }

    if (this.config.options.language !== null) {
      options.push(`set language ${this.config.options.language}`);
    }

    if (this.config.options.enableNumericRoundabort === true) {
      options.push('set numeric_roundabort on');
    } else if (this.config.options.enableNumericRoundabort === false) {
      options.push('set numeric_roundabort off');
    }

    if (this.config.options.enableQuotedIdentifier === true) {
      options.push('set quoted_identifier on');
    } else if (this.config.options.enableQuotedIdentifier === false) {
      options.push('set quoted_identifier off');
    }

    if (this.config.options.textsize !== null) {
      options.push(`set textsize ${this.config.options.textsize}`);
    }

    if (this.config.options.connectionIsolationLevel !== null) {
      options.push(`set transaction isolation level ${this.getIsolationLevelText(this.config.options.connectionIsolationLevel)}`);
    }

    if (this.config.options.abortTransactionOnError === true) {
      options.push('set xact_abort on');
    } else if (this.config.options.abortTransactionOnError === false) {
      options.push('set xact_abort off');
    }

    return options.join('\n');
  }
  /**
   * @private
   */


  processedInitialSql() {
    this.clearConnectTimer();
    this.emit('connect');
  }
  /**
   * Execute the SQL batch represented by [[Request]].
   * There is no param support, and unlike [[Request.execSql]],
   * it is not likely that SQL Server will reuse the execution plan it generates for the SQL.
   *
   * In almost all cases, [[Request.execSql]] will be a better choice.
   *
   * @param request A [[Request]] object representing the request.
   */


  execSqlBatch(request) {
    this.makeRequest(request, _packet.TYPE.SQL_BATCH, new _sqlbatchPayload.default(request.sqlTextOrProcedure, this.currentTransactionDescriptor(), this.config.options));
  }
  /**
   *  Execute the SQL represented by [[Request]].
   *
   * As `sp_executesql` is used to execute the SQL, if the same SQL is executed multiples times
   * using this function, the SQL Server query optimizer is likely to reuse the execution plan it generates
   * for the first execution. This may also result in SQL server treating the request like a stored procedure
   * which can result in the [[Event_doneInProc]] or [[Event_doneProc]] events being emitted instead of the
   * [[Event_done]] event you might expect. Using [[execSqlBatch]] will prevent this from occurring but may have a negative performance impact.
   *
   * Beware of the way that scoping rules apply, and how they may [affect local temp tables](http://weblogs.sqlteam.com/mladenp/archive/2006/11/03/17197.aspx)
   * If you're running in to scoping issues, then [[execSqlBatch]] may be a better choice.
   * See also [issue #24](https://github.com/pekim/tedious/issues/24)
   *
   * @param request A [[Request]] object representing the request.
   */


  execSql(request) {
    try {
      request.validateParameters(this.databaseCollation);
    } catch (error) {
      request.error = error;
      process.nextTick(() => {
        this.debug.log(error.message);
        request.callback(error);
      });
      return;
    }

    const parameters = [];
    parameters.push({
      type: _dataType.TYPES.NVarChar,
      name: 'statement',
      value: request.sqlTextOrProcedure,
      output: false,
      length: undefined,
      precision: undefined,
      scale: undefined
    });

    if (request.parameters.length) {
      parameters.push({
        type: _dataType.TYPES.NVarChar,
        name: 'params',
        value: request.makeParamsParameter(request.parameters),
        output: false,
        length: undefined,
        precision: undefined,
        scale: undefined
      });
      parameters.push(...request.parameters);
    }

    this.makeRequest(request, _packet.TYPE.RPC_REQUEST, new _rpcrequestPayload.default('sp_executesql', parameters, this.currentTransactionDescriptor(), this.config.options, this.databaseCollation));
  }
  /**
   * Creates a new BulkLoad instance.
   *
   * @param table The name of the table to bulk-insert into.
   * @param options A set of bulk load options.
   */


  newBulkLoad(table, callbackOrOptions, callback) {
    let options;

    if (callback === undefined) {
      callback = callbackOrOptions;
      options = {};
    } else {
      options = callbackOrOptions;
    }

    if (typeof options !== 'object') {
      throw new TypeError('"options" argument must be an object');
    }

    return new _bulkLoad.default(table, this.databaseCollation, this.config.options, options, callback);
  }
  /**
   * Execute a [[BulkLoad]].
   *
   * ```js
   * // We want to perform a bulk load into a table with the following format:
   * // CREATE TABLE employees (first_name nvarchar(255), last_name nvarchar(255), day_of_birth date);
   *
   * const bulkLoad = connection.newBulkLoad('employees', (err, rowCount) => {
   *   // ...
   * });
   *
   * // First, we need to specify the columns that we want to write to,
   * // and their definitions. These definitions must match the actual table,
   * // otherwise the bulk load will fail.
   * bulkLoad.addColumn('first_name', TYPES.NVarchar, { nullable: false });
   * bulkLoad.addColumn('last_name', TYPES.NVarchar, { nullable: false });
   * bulkLoad.addColumn('date_of_birth', TYPES.Date, { nullable: false });
   *
   * // Execute a bulk load with a predefined list of rows.
   * //
   * // Note that these rows are held in memory until the
   * // bulk load was performed, so if you need to write a large
   * // number of rows (e.g. by reading from a CSV file),
   * // passing an `AsyncIterable` is advisable to keep memory usage low.
   * connection.execBulkLoad(bulkLoad, [
   *   { 'first_name': 'Steve', 'last_name': 'Jobs', 'day_of_birth': new Date('02-24-1955') },
   *   { 'first_name': 'Bill', 'last_name': 'Gates', 'day_of_birth': new Date('10-28-1955') }
   * ]);
   * ```
   *
   * @param bulkLoad A previously created [[BulkLoad]].
   * @param rows A [[Iterable]] or [[AsyncIterable]] that contains the rows that should be bulk loaded.
   */


  execBulkLoad(bulkLoad, rows) {
    bulkLoad.executionStarted = true;

    if (rows) {
      if (bulkLoad.streamingMode) {
        throw new Error("Connection.execBulkLoad can't be called with a BulkLoad that was put in streaming mode.");
      }

      if (bulkLoad.firstRowWritten) {
        throw new Error("Connection.execBulkLoad can't be called with a BulkLoad that already has rows written to it.");
      }

      const rowStream = _stream.Readable.from(rows); // Destroy the packet transform if an error happens in the row stream,
      // e.g. if an error is thrown from within a generator or stream.


      rowStream.on('error', err => {
        bulkLoad.rowToPacketTransform.destroy(err);
      }); // Destroy the row stream if an error happens in the packet transform,
      // e.g. if the bulk load is cancelled.

      bulkLoad.rowToPacketTransform.on('error', err => {
        rowStream.destroy(err);
      });
      rowStream.pipe(bulkLoad.rowToPacketTransform);
    } else if (!bulkLoad.streamingMode) {
      // If the bulkload was not put into streaming mode by the user,
      // we end the rowToPacketTransform here for them.
      //
      // If it was put into streaming mode, it's the user's responsibility
      // to end the stream.
      bulkLoad.rowToPacketTransform.end();
    }

    const onCancel = () => {
      request.cancel();
    };

    const payload = new _bulkLoadPayload.BulkLoadPayload(bulkLoad);
    const request = new _request.default(bulkLoad.getBulkInsertSql(), error => {
      bulkLoad.removeListener('cancel', onCancel);

      if (error) {
        if (error.code === 'UNKNOWN') {
          error.message += ' This is likely because the schema of the BulkLoad does not match the schema of the table you are attempting to insert into.';
        }

        bulkLoad.error = error;
        bulkLoad.callback(error);
        return;
      }

      this.makeRequest(bulkLoad, _packet.TYPE.BULK_LOAD, payload);
    });
    bulkLoad.once('cancel', onCancel);
    this.execSqlBatch(request);
  }
  /**
   * Prepare the SQL represented by the request.
   *
   * The request can then be used in subsequent calls to
   * [[execute]] and [[unprepare]]
   *
   * @param request A [[Request]] object representing the request.
   *   Parameters only require a name and type. Parameter values are ignored.
   */


  prepare(request) {
    const parameters = [];
    parameters.push({
      type: _dataType.TYPES.Int,
      name: 'handle',
      value: undefined,
      output: true,
      length: undefined,
      precision: undefined,
      scale: undefined
    });
    parameters.push({
      type: _dataType.TYPES.NVarChar,
      name: 'params',
      value: request.parameters.length ? request.makeParamsParameter(request.parameters) : null,
      output: false,
      length: undefined,
      precision: undefined,
      scale: undefined
    });
    parameters.push({
      type: _dataType.TYPES.NVarChar,
      name: 'stmt',
      value: request.sqlTextOrProcedure,
      output: false,
      length: undefined,
      precision: undefined,
      scale: undefined
    });
    request.preparing = true; // TODO: We need to clean up this event handler, otherwise this leaks memory

    request.on('returnValue', (name, value) => {
      if (name === 'handle') {
        request.handle = value;
      } else {
        request.error = new _errors.RequestError(`Tedious > Unexpected output parameter ${name} from sp_prepare`);
      }
    });
    this.makeRequest(request, _packet.TYPE.RPC_REQUEST, new _rpcrequestPayload.default('sp_prepare', parameters, this.currentTransactionDescriptor(), this.config.options, this.databaseCollation));
  }
  /**
   * Release the SQL Server resources associated with a previously prepared request.
   *
   * @param request A [[Request]] object representing the request.
   *   Parameters only require a name and type.
   *   Parameter values are ignored.
   */


  unprepare(request) {
    const parameters = [];
    parameters.push({
      type: _dataType.TYPES.Int,
      name: 'handle',
      // TODO: Abort if `request.handle` is not set
      value: request.handle,
      output: false,
      length: undefined,
      precision: undefined,
      scale: undefined
    });
    this.makeRequest(request, _packet.TYPE.RPC_REQUEST, new _rpcrequestPayload.default('sp_unprepare', parameters, this.currentTransactionDescriptor(), this.config.options, this.databaseCollation));
  }
  /**
   * Execute previously prepared SQL, using the supplied parameters.
   *
   * @param request A previously prepared [[Request]].
   * @param parameters  An object whose names correspond to the names of
   *   parameters that were added to the [[Request]] before it was prepared.
   *   The object's values are passed as the parameters' values when the
   *   request is executed.
   */


  execute(request, parameters) {
    const executeParameters = [];
    executeParameters.push({
      type: _dataType.TYPES.Int,
      name: 'handle',
      // TODO: Abort if `request.handle` is not set
      value: request.handle,
      output: false,
      length: undefined,
      precision: undefined,
      scale: undefined
    });

    try {
      for (let i = 0, len = request.parameters.length; i < len; i++) {
        const parameter = request.parameters[i];
        executeParameters.push({ ...parameter,
          value: parameter.type.validate(parameters ? parameters[parameter.name] : null, this.databaseCollation)
        });
      }
    } catch (error) {
      request.error = error;
      process.nextTick(() => {
        this.debug.log(error.message);
        request.callback(error);
      });
      return;
    }

    this.makeRequest(request, _packet.TYPE.RPC_REQUEST, new _rpcrequestPayload.default('sp_execute', executeParameters, this.currentTransactionDescriptor(), this.config.options, this.databaseCollation));
  }
  /**
   * Call a stored procedure represented by [[Request]].
   *
   * @param request A [[Request]] object representing the request.
   */


  callProcedure(request) {
    try {
      request.validateParameters(this.databaseCollation);
    } catch (error) {
      request.error = error;
      process.nextTick(() => {
        this.debug.log(error.message);
        request.callback(error);
      });
      return;
    }

    this.makeRequest(request, _packet.TYPE.RPC_REQUEST, new _rpcrequestPayload.default(request.sqlTextOrProcedure, request.parameters, this.currentTransactionDescriptor(), this.config.options, this.databaseCollation));
  }
  /**
   * Start a transaction.
   *
   * @param callback
   * @param name A string representing a name to associate with the transaction.
   *   Optional, and defaults to an empty string. Required when `isolationLevel`
   *   is present.
   * @param isolationLevel The isolation level that the transaction is to be run with.
   *
   *   The isolation levels are available from `require('tedious').ISOLATION_LEVEL`.
   *   * `READ_UNCOMMITTED`
   *   * `READ_COMMITTED`
   *   * `REPEATABLE_READ`
   *   * `SERIALIZABLE`
   *   * `SNAPSHOT`
   *
   *   Optional, and defaults to the Connection's isolation level.
   */


  beginTransaction(callback, name = '', isolationLevel = this.config.options.isolationLevel) {
    (0, _transaction.assertValidIsolationLevel)(isolationLevel, 'isolationLevel');
    const transaction = new _transaction.Transaction(name, isolationLevel);

    if (this.config.options.tdsVersion < '7_2') {
      return this.execSqlBatch(new _request.default('SET TRANSACTION ISOLATION LEVEL ' + transaction.isolationLevelToTSQL() + ';BEGIN TRAN ' + transaction.name, err => {
        this.transactionDepth++;

        if (this.transactionDepth === 1) {
          this.inTransaction = true;
        }

        callback(err);
      }));
    }

    const request = new _request.default(undefined, err => {
      return callback(err, this.currentTransactionDescriptor());
    });
    return this.makeRequest(request, _packet.TYPE.TRANSACTION_MANAGER, transaction.beginPayload(this.currentTransactionDescriptor()));
  }
  /**
   * Commit a transaction.
   *
   * There should be an active transaction - that is, [[beginTransaction]]
   * should have been previously called.
   *
   * @param callback
   * @param name A string representing a name to associate with the transaction.
   *   Optional, and defaults to an empty string. Required when `isolationLevel`is present.
   */


  commitTransaction(callback, name = '') {
    const transaction = new _transaction.Transaction(name);

    if (this.config.options.tdsVersion < '7_2') {
      return this.execSqlBatch(new _request.default('COMMIT TRAN ' + transaction.name, err => {
        this.transactionDepth--;

        if (this.transactionDepth === 0) {
          this.inTransaction = false;
        }

        callback(err);
      }));
    }

    const request = new _request.default(undefined, callback);
    return this.makeRequest(request, _packet.TYPE.TRANSACTION_MANAGER, transaction.commitPayload(this.currentTransactionDescriptor()));
  }
  /**
   * Rollback a transaction.
   *
   * There should be an active transaction - that is, [[beginTransaction]]
   * should have been previously called.
   *
   * @param callback
   * @param name A string representing a name to associate with the transaction.
   *   Optional, and defaults to an empty string.
   *   Required when `isolationLevel` is present.
   */


  rollbackTransaction(callback, name = '') {
    const transaction = new _transaction.Transaction(name);

    if (this.config.options.tdsVersion < '7_2') {
      return this.execSqlBatch(new _request.default('ROLLBACK TRAN ' + transaction.name, err => {
        this.transactionDepth--;

        if (this.transactionDepth === 0) {
          this.inTransaction = false;
        }

        callback(err);
      }));
    }

    const request = new _request.default(undefined, callback);
    return this.makeRequest(request, _packet.TYPE.TRANSACTION_MANAGER, transaction.rollbackPayload(this.currentTransactionDescriptor()));
  }
  /**
   * Set a savepoint within a transaction.
   *
   * There should be an active transaction - that is, [[beginTransaction]]
   * should have been previously called.
   *
   * @param callback
   * @param name A string representing a name to associate with the transaction.\
   *   Optional, and defaults to an empty string.
   *   Required when `isolationLevel` is present.
   */


  saveTransaction(callback, name) {
    const transaction = new _transaction.Transaction(name);

    if (this.config.options.tdsVersion < '7_2') {
      return this.execSqlBatch(new _request.default('SAVE TRAN ' + transaction.name, err => {
        this.transactionDepth++;
        callback(err);
      }));
    }

    const request = new _request.default(undefined, callback);
    return this.makeRequest(request, _packet.TYPE.TRANSACTION_MANAGER, transaction.savePayload(this.currentTransactionDescriptor()));
  }
  /**
   * Run the given callback after starting a transaction, and commit or
   * rollback the transaction afterwards.
   *
   * This is a helper that employs [[beginTransaction]], [[commitTransaction]],
   * [[rollbackTransaction]], and [[saveTransaction]] to greatly simplify the
   * use of database transactions and automatically handle transaction nesting.
   *
   * @param cb
   * @param isolationLevel
   *   The isolation level that the transaction is to be run with.
   *
   *   The isolation levels are available from `require('tedious').ISOLATION_LEVEL`.
   *   * `READ_UNCOMMITTED`
   *   * `READ_COMMITTED`
   *   * `REPEATABLE_READ`
   *   * `SERIALIZABLE`
   *   * `SNAPSHOT`
   *
   *   Optional, and defaults to the Connection's isolation level.
   */


  transaction(cb, isolationLevel) {
    if (typeof cb !== 'function') {
      throw new TypeError('`cb` must be a function');
    }

    const useSavepoint = this.inTransaction;

    const name = '_tedious_' + _crypto.default.randomBytes(10).toString('hex');

    const txDone = (err, done, ...args) => {
      if (err) {
        if (this.inTransaction && this.state === this.STATE.LOGGED_IN) {
          this.rollbackTransaction(txErr => {
            done(txErr || err, ...args);
          }, name);
        } else {
          done(err, ...args);
        }
      } else if (useSavepoint) {
        if (this.config.options.tdsVersion < '7_2') {
          this.transactionDepth--;
        }

        done(null, ...args);
      } else {
        this.commitTransaction(txErr => {
          done(txErr, ...args);
        }, name);
      }
    };

    if (useSavepoint) {
      return this.saveTransaction(err => {
        if (err) {
          return cb(err);
        }

        if (isolationLevel) {
          return this.execSqlBatch(new _request.default('SET transaction isolation level ' + this.getIsolationLevelText(isolationLevel), err => {
            return cb(err, txDone);
          }));
        } else {
          return cb(null, txDone);
        }
      }, name);
    } else {
      return this.beginTransaction(err => {
        if (err) {
          return cb(err);
        }

        return cb(null, txDone);
      }, name, isolationLevel);
    }
  }
  /**
   * @private
   */


  makeRequest(request, packetType, payload) {
    if (this.state !== this.STATE.LOGGED_IN) {
      const message = 'Requests can only be made in the ' + this.STATE.LOGGED_IN.name + ' state, not the ' + this.state.name + ' state';
      this.debug.log(message);
      request.callback(new _errors.RequestError(message, 'EINVALIDSTATE'));
    } else if (request.canceled) {
      process.nextTick(() => {
        request.callback(new _errors.RequestError('Canceled.', 'ECANCEL'));
      });
    } else {
      if (packetType === _packet.TYPE.SQL_BATCH) {
        this.isSqlBatch = true;
      } else {
        this.isSqlBatch = false;
      }

      this.request = request;
      request.connection = this;
      request.rowCount = 0;
      request.rows = [];
      request.rst = [];

      const onCancel = () => {
        payloadStream.unpipe(message);
        payloadStream.destroy(new _errors.RequestError('Canceled.', 'ECANCEL')); // set the ignore bit and end the message.

        message.ignore = true;
        message.end();

        if (request instanceof _request.default && request.paused) {
          // resume the request if it was paused so we can read the remaining tokens
          request.resume();
        }
      };

      request.once('cancel', onCancel);
      this.createRequestTimer();
      const message = new _message.default({
        type: packetType,
        resetConnection: this.resetConnectionOnNextRequest
      });
      this.messageIo.outgoingMessageStream.write(message);
      this.transitionTo(this.STATE.SENT_CLIENT_REQUEST);
      message.once('finish', () => {
        request.removeListener('cancel', onCancel);
        request.once('cancel', this._cancelAfterRequestSent);
        this.resetConnectionOnNextRequest = false;
        this.debug.payload(function () {
          return payload.toString('  ');
        });
      });

      const payloadStream = _stream.Readable.from(payload);

      payloadStream.once('error', error => {
        payloadStream.unpipe(message); // Only set a request error if no error was set yet.

        request.error ?? (request.error = error);
        message.ignore = true;
        message.end();
      });
      payloadStream.pipe(message);
    }
  }
  /**
   * Cancel currently executed request.
   */


  cancel() {
    if (!this.request) {
      return false;
    }

    if (this.request.canceled) {
      return false;
    }

    this.request.cancel();
    return true;
  }
  /**
   * Reset the connection to its initial state.
   * Can be useful for connection pool implementations.
   *
   * @param callback
   */


  reset(callback) {
    const request = new _request.default(this.getInitialSql(), err => {
      if (this.config.options.tdsVersion < '7_2') {
        this.inTransaction = false;
      }

      callback(err);
    });
    this.resetConnectionOnNextRequest = true;
    this.execSqlBatch(request);
  }
  /**
   * @private
   */


  currentTransactionDescriptor() {
    return this.transactionDescriptors[this.transactionDescriptors.length - 1];
  }
  /**
   * @private
   */


  getIsolationLevelText(isolationLevel) {
    switch (isolationLevel) {
      case _transaction.ISOLATION_LEVEL.READ_UNCOMMITTED:
        return 'read uncommitted';

      case _transaction.ISOLATION_LEVEL.REPEATABLE_READ:
        return 'repeatable read';

      case _transaction.ISOLATION_LEVEL.SERIALIZABLE:
        return 'serializable';

      case _transaction.ISOLATION_LEVEL.SNAPSHOT:
        return 'snapshot';

      default:
        return 'read committed';
    }
  }

}

function isTransientError(error) {
  if (error instanceof _esAggregateError.default) {
    error = error.errors[0];
  }

  return error instanceof _errors.ConnectionError && !!error.isTransient;
}

var _default = Connection;
exports.default = _default;
module.exports = Connection;
Connection.prototype.STATE = {
  INITIALIZED: {
    name: 'Initialized',
    events: {}
  },
  CONNECTING: {
    name: 'Connecting',
    enter: function () {
      this.initialiseConnection();
    },
    events: {
      socketError: function () {
        this.transitionTo(this.STATE.FINAL);
      },
      connectTimeout: function () {
        this.transitionTo(this.STATE.FINAL);
      }
    }
  },
  SENT_PRELOGIN: {
    name: 'SentPrelogin',
    enter: function () {
      (async () => {
        let messageBuffer = Buffer.alloc(0);
        let message;

        try {
          message = await this.messageIo.readMessage();
        } catch (err) {
          return this.socketError(err);
        }

        for await (const data of message) {
          messageBuffer = Buffer.concat([messageBuffer, data]);
        }

        const preloginPayload = new _preloginPayload.default(messageBuffer);
        this.debug.payload(function () {
          return preloginPayload.toString('  ');
        });

        if (preloginPayload.fedAuthRequired === 1) {
          this.fedAuthRequired = true;
        }

        if (preloginPayload.encryptionString === 'ON' || preloginPayload.encryptionString === 'REQ') {
          if (!this.config.options.encrypt) {
            this.emit('connect', new _errors.ConnectionError("Server requires encryption, set 'encrypt' config option to true.", 'EENCRYPT'));
            return this.close();
          }

          try {
            var _this$routingData;

            this.transitionTo(this.STATE.SENT_TLSSSLNEGOTIATION);
            await this.messageIo.startTls(this.secureContextOptions, ((_this$routingData = this.routingData) === null || _this$routingData === void 0 ? void 0 : _this$routingData.server) ?? this.config.server, this.config.options.trustServerCertificate);
          } catch (err) {
            return this.socketError(err);
          }
        }

        this.sendLogin7Packet();
        const {
          authentication
        } = this.config;

        switch (authentication.type) {
          case 'azure-active-directory-password':
          case 'azure-active-directory-msi-vm':
          case 'azure-active-directory-msi-app-service':
          case 'azure-active-directory-service-principal-secret':
          case 'azure-active-directory-default':
            this.transitionTo(this.STATE.SENT_LOGIN7_WITH_FEDAUTH);
            break;

          case 'ntlm':
            this.transitionTo(this.STATE.SENT_LOGIN7_WITH_NTLM);
            break;

          default:
            this.transitionTo(this.STATE.SENT_LOGIN7_WITH_STANDARD_LOGIN);
            break;
        }
      })().catch(err => {
        process.nextTick(() => {
          throw err;
        });
      });
    },
    events: {
      socketError: function () {
        this.transitionTo(this.STATE.FINAL);
      },
      connectTimeout: function () {
        this.transitionTo(this.STATE.FINAL);
      }
    }
  },
  REROUTING: {
    name: 'ReRouting',
    enter: function () {
      this.cleanupConnection(CLEANUP_TYPE.REDIRECT);
    },
    events: {
      message: function () {},
      socketError: function () {
        this.transitionTo(this.STATE.FINAL);
      },
      connectTimeout: function () {
        this.transitionTo(this.STATE.FINAL);
      },
      reconnect: function () {
        this.transitionTo(this.STATE.CONNECTING);
      }
    }
  },
  TRANSIENT_FAILURE_RETRY: {
    name: 'TRANSIENT_FAILURE_RETRY',
    enter: function () {
      this.curTransientRetryCount++;
      this.cleanupConnection(CLEANUP_TYPE.RETRY);
    },
    events: {
      message: function () {},
      socketError: function () {
        this.transitionTo(this.STATE.FINAL);
      },
      connectTimeout: function () {
        this.transitionTo(this.STATE.FINAL);
      },
      retry: function () {
        this.createRetryTimer();
      }
    }
  },
  SENT_TLSSSLNEGOTIATION: {
    name: 'SentTLSSSLNegotiation',
    events: {
      socketError: function () {
        this.transitionTo(this.STATE.FINAL);
      },
      connectTimeout: function () {
        this.transitionTo(this.STATE.FINAL);
      }
    }
  },
  SENT_LOGIN7_WITH_STANDARD_LOGIN: {
    name: 'SentLogin7WithStandardLogin',
    enter: function () {
      (async () => {
        let message;

        try {
          message = await this.messageIo.readMessage();
        } catch (err) {
          return this.socketError(err);
        }

        const handler = new _handler.Login7TokenHandler(this);
        const tokenStreamParser = this.createTokenStreamParser(message, handler);
        await (0, _events.once)(tokenStreamParser, 'end');

        if (handler.loginAckReceived) {
          if (handler.routingData) {
            this.routingData = handler.routingData;
            this.transitionTo(this.STATE.REROUTING);
          } else {
            this.transitionTo(this.STATE.LOGGED_IN_SENDING_INITIAL_SQL);
          }
        } else if (this.loginError) {
          if (isTransientError(this.loginError)) {
            this.debug.log('Initiating retry on transient error');
            this.transitionTo(this.STATE.TRANSIENT_FAILURE_RETRY);
          } else {
            this.emit('connect', this.loginError);
            this.transitionTo(this.STATE.FINAL);
          }
        } else {
          this.emit('connect', new _errors.ConnectionError('Login failed.', 'ELOGIN'));
          this.transitionTo(this.STATE.FINAL);
        }
      })().catch(err => {
        process.nextTick(() => {
          throw err;
        });
      });
    },
    events: {
      socketError: function () {
        this.transitionTo(this.STATE.FINAL);
      },
      connectTimeout: function () {
        this.transitionTo(this.STATE.FINAL);
      }
    }
  },
  SENT_LOGIN7_WITH_NTLM: {
    name: 'SentLogin7WithNTLMLogin',
    enter: function () {
      (async () => {
        while (true) {
          let message;

          try {
            message = await this.messageIo.readMessage();
          } catch (err) {
            return this.socketError(err);
          }

          const handler = new _handler.Login7TokenHandler(this);
          const tokenStreamParser = this.createTokenStreamParser(message, handler);
          await (0, _events.once)(tokenStreamParser, 'end');

          if (handler.loginAckReceived) {
            if (handler.routingData) {
              this.routingData = handler.routingData;
              return this.transitionTo(this.STATE.REROUTING);
            } else {
              return this.transitionTo(this.STATE.LOGGED_IN_SENDING_INITIAL_SQL);
            }
          } else if (this.ntlmpacket) {
            const authentication = this.config.authentication;
            const payload = new _ntlmPayload.default({
              domain: authentication.options.domain,
              userName: authentication.options.userName,
              password: authentication.options.password,
              ntlmpacket: this.ntlmpacket
            });
            this.messageIo.sendMessage(_packet.TYPE.NTLMAUTH_PKT, payload.data);
            this.debug.payload(function () {
              return payload.toString('  ');
            });
            this.ntlmpacket = undefined;
          } else if (this.loginError) {
            if (isTransientError(this.loginError)) {
              this.debug.log('Initiating retry on transient error');
              return this.transitionTo(this.STATE.TRANSIENT_FAILURE_RETRY);
            } else {
              this.emit('connect', this.loginError);
              return this.transitionTo(this.STATE.FINAL);
            }
          } else {
            this.emit('connect', new _errors.ConnectionError('Login failed.', 'ELOGIN'));
            return this.transitionTo(this.STATE.FINAL);
          }
        }
      })().catch(err => {
        process.nextTick(() => {
          throw err;
        });
      });
    },
    events: {
      socketError: function () {
        this.transitionTo(this.STATE.FINAL);
      },
      connectTimeout: function () {
        this.transitionTo(this.STATE.FINAL);
      }
    }
  },
  SENT_LOGIN7_WITH_FEDAUTH: {
    name: 'SentLogin7Withfedauth',
    enter: function () {
      (async () => {
        let message;

        try {
          message = await this.messageIo.readMessage();
        } catch (err) {
          return this.socketError(err);
        }

        const handler = new _handler.Login7TokenHandler(this);
        const tokenStreamParser = this.createTokenStreamParser(message, handler);
        await (0, _events.once)(tokenStreamParser, 'end');

        if (handler.loginAckReceived) {
          if (handler.routingData) {
            this.routingData = handler.routingData;
            this.transitionTo(this.STATE.REROUTING);
          } else {
            this.transitionTo(this.STATE.LOGGED_IN_SENDING_INITIAL_SQL);
          }

          return;
        }

        const fedAuthInfoToken = handler.fedAuthInfoToken;

        if (fedAuthInfoToken && fedAuthInfoToken.stsurl && fedAuthInfoToken.spn) {
          const authentication = this.config.authentication;
          const tokenScope = new _url.URL('/.default', fedAuthInfoToken.spn).toString();
          let credentials;

          switch (authentication.type) {
            case 'azure-active-directory-password':
              credentials = new _identity.UsernamePasswordCredential(authentication.options.tenantId ?? 'common', authentication.options.clientId, authentication.options.userName, authentication.options.password);
              break;

            case 'azure-active-directory-msi-vm':
            case 'azure-active-directory-msi-app-service':
              const msiArgs = authentication.options.clientId ? [authentication.options.clientId, {}] : [{}];
              credentials = new _identity.ManagedIdentityCredential(...msiArgs);
              break;

            case 'azure-active-directory-default':
              const args = authentication.options.clientId ? {
                managedIdentityClientId: authentication.options.clientId
              } : {};
              credentials = new _identity.DefaultAzureCredential(args);
              break;

            case 'azure-active-directory-service-principal-secret':
              credentials = new _identity.ClientSecretCredential(authentication.options.tenantId, authentication.options.clientId, authentication.options.clientSecret);
              break;
          }

          let tokenResponse;

          try {
            tokenResponse = await credentials.getToken(tokenScope);
          } catch (err) {
            this.loginError = new _esAggregateError.default([new _errors.ConnectionError('Security token could not be authenticated or authorized.', 'EFEDAUTH'), err]);
            this.emit('connect', this.loginError);
            this.transitionTo(this.STATE.FINAL);
            return;
          }

          const token = tokenResponse.token;
          this.sendFedAuthTokenMessage(token);
        } else if (this.loginError) {
          if (isTransientError(this.loginError)) {
            this.debug.log('Initiating retry on transient error');
            this.transitionTo(this.STATE.TRANSIENT_FAILURE_RETRY);
          } else {
            this.emit('connect', this.loginError);
            this.transitionTo(this.STATE.FINAL);
          }
        } else {
          this.emit('connect', new _errors.ConnectionError('Login failed.', 'ELOGIN'));
          this.transitionTo(this.STATE.FINAL);
        }
      })().catch(err => {
        process.nextTick(() => {
          throw err;
        });
      });
    },
    events: {
      socketError: function () {
        this.transitionTo(this.STATE.FINAL);
      },
      connectTimeout: function () {
        this.transitionTo(this.STATE.FINAL);
      }
    }
  },
  LOGGED_IN_SENDING_INITIAL_SQL: {
    name: 'LoggedInSendingInitialSql',
    enter: function () {
      (async () => {
        this.sendInitialSql();
        let message;

        try {
          message = await this.messageIo.readMessage();
        } catch (err) {
          return this.socketError(err);
        }

        const tokenStreamParser = this.createTokenStreamParser(message, new _handler.InitialSqlTokenHandler(this));
        await (0, _events.once)(tokenStreamParser, 'end');
        this.transitionTo(this.STATE.LOGGED_IN);
        this.processedInitialSql();
      })().catch(err => {
        process.nextTick(() => {
          throw err;
        });
      });
    },
    events: {
      socketError: function socketError() {
        this.transitionTo(this.STATE.FINAL);
      },
      connectTimeout: function () {
        this.transitionTo(this.STATE.FINAL);
      }
    }
  },
  LOGGED_IN: {
    name: 'LoggedIn',
    events: {
      socketError: function () {
        this.transitionTo(this.STATE.FINAL);
      }
    }
  },
  SENT_CLIENT_REQUEST: {
    name: 'SentClientRequest',
    enter: function () {
      (async () => {
        var _this$request, _this$request3, _this$request10;

        let message;

        try {
          message = await this.messageIo.readMessage();
        } catch (err) {
          return this.socketError(err);
        } // request timer is stopped on first data package


        this.clearRequestTimer();
        const tokenStreamParser = this.createTokenStreamParser(message, new _handler.RequestTokenHandler(this, this.request)); // If the request was canceled and we have a `cancelTimer`
        // defined, we send a attention message after the
        // request message was fully sent off.
        //
        // We already started consuming the current message
        // (but all the token handlers should be no-ops), and
        // need to ensure the next message is handled by the
        // `SENT_ATTENTION` state.

        if ((_this$request = this.request) !== null && _this$request !== void 0 && _this$request.canceled && this.cancelTimer) {
          return this.transitionTo(this.STATE.SENT_ATTENTION);
        }

        const onResume = () => {
          tokenStreamParser.resume();
        };

        const onPause = () => {
          var _this$request2;

          tokenStreamParser.pause();
          (_this$request2 = this.request) === null || _this$request2 === void 0 ? void 0 : _this$request2.once('resume', onResume);
        };

        (_this$request3 = this.request) === null || _this$request3 === void 0 ? void 0 : _this$request3.on('pause', onPause);

        if (this.request instanceof _request.default && this.request.paused) {
          onPause();
        }

        const onCancel = () => {
          var _this$request4, _this$request5;

          tokenStreamParser.removeListener('end', onEndOfMessage);

          if (this.request instanceof _request.default && this.request.paused) {
            // resume the request if it was paused so we can read the remaining tokens
            this.request.resume();
          }

          (_this$request4 = this.request) === null || _this$request4 === void 0 ? void 0 : _this$request4.removeListener('pause', onPause);
          (_this$request5 = this.request) === null || _this$request5 === void 0 ? void 0 : _this$request5.removeListener('resume', onResume); // The `_cancelAfterRequestSent` callback will have sent a
          // attention message, so now we need to also switch to
          // the `SENT_ATTENTION` state to make sure the attention ack
          // message is processed correctly.

          this.transitionTo(this.STATE.SENT_ATTENTION);
        };

        const onEndOfMessage = () => {
          var _this$request6, _this$request7, _this$request8, _this$request9;

          (_this$request6 = this.request) === null || _this$request6 === void 0 ? void 0 : _this$request6.removeListener('cancel', this._cancelAfterRequestSent);
          (_this$request7 = this.request) === null || _this$request7 === void 0 ? void 0 : _this$request7.removeListener('cancel', onCancel);
          (_this$request8 = this.request) === null || _this$request8 === void 0 ? void 0 : _this$request8.removeListener('pause', onPause);
          (_this$request9 = this.request) === null || _this$request9 === void 0 ? void 0 : _this$request9.removeListener('resume', onResume);
          this.transitionTo(this.STATE.LOGGED_IN);
          const sqlRequest = this.request;
          this.request = undefined;

          if (this.config.options.tdsVersion < '7_2' && sqlRequest.error && this.isSqlBatch) {
            this.inTransaction = false;
          }

          sqlRequest.callback(sqlRequest.error, sqlRequest.rowCount, sqlRequest.rows);
        };

        tokenStreamParser.once('end', onEndOfMessage);
        (_this$request10 = this.request) === null || _this$request10 === void 0 ? void 0 : _this$request10.once('cancel', onCancel);
      })();
    },
    exit: function (nextState) {
      this.clearRequestTimer();
    },
    events: {
      socketError: function (err) {
        const sqlRequest = this.request;
        this.request = undefined;
        this.transitionTo(this.STATE.FINAL);
        sqlRequest.callback(err);
      }
    }
  },
  SENT_ATTENTION: {
    name: 'SentAttention',
    enter: function () {
      (async () => {
        let message;

        try {
          message = await this.messageIo.readMessage();
        } catch (err) {
          return this.socketError(err);
        }

        const handler = new _handler.AttentionTokenHandler(this, this.request);
        const tokenStreamParser = this.createTokenStreamParser(message, handler);
        await (0, _events.once)(tokenStreamParser, 'end'); // 3.2.5.7 Sent Attention State
        // Discard any data contained in the response, until we receive the attention response

        if (handler.attentionReceived) {
          this.clearCancelTimer();
          const sqlRequest = this.request;
          this.request = undefined;
          this.transitionTo(this.STATE.LOGGED_IN);

          if (sqlRequest.error && sqlRequest.error instanceof _errors.RequestError && sqlRequest.error.code === 'ETIMEOUT') {
            sqlRequest.callback(sqlRequest.error);
          } else {
            sqlRequest.callback(new _errors.RequestError('Canceled.', 'ECANCEL'));
          }
        }
      })().catch(err => {
        process.nextTick(() => {
          throw err;
        });
      });
    },
    events: {
      socketError: function (err) {
        const sqlRequest = this.request;
        this.request = undefined;
        this.transitionTo(this.STATE.FINAL);
        sqlRequest.callback(err);
      }
    }
  },
  FINAL: {
    name: 'Final',
    enter: function () {
      this.cleanupConnection(CLEANUP_TYPE.NORMAL);
    },
    events: {
      connectTimeout: function () {// Do nothing, as the timer should be cleaned up.
      },
      message: function () {// Do nothing
      },
      socketError: function () {// Do nothing
      }
    }
  }
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJLRUVQX0FMSVZFX0lOSVRJQUxfREVMQVkiLCJERUZBVUxUX0NPTk5FQ1RfVElNRU9VVCIsIkRFRkFVTFRfQ0xJRU5UX1JFUVVFU1RfVElNRU9VVCIsIkRFRkFVTFRfQ0FOQ0VMX1RJTUVPVVQiLCJERUZBVUxUX0NPTk5FQ1RfUkVUUllfSU5URVJWQUwiLCJERUZBVUxUX1BBQ0tFVF9TSVpFIiwiREVGQVVMVF9URVhUU0laRSIsIkRFRkFVTFRfREFURUZJUlNUIiwiREVGQVVMVF9QT1JUIiwiREVGQVVMVF9URFNfVkVSU0lPTiIsIkRFRkFVTFRfTEFOR1VBR0UiLCJERUZBVUxUX0RBVEVGT1JNQVQiLCJDTEVBTlVQX1RZUEUiLCJOT1JNQUwiLCJSRURJUkVDVCIsIlJFVFJZIiwiQ29ubmVjdGlvbiIsIkV2ZW50RW1pdHRlciIsImNvbnN0cnVjdG9yIiwiY29uZmlnIiwiZmVkQXV0aFJlcXVpcmVkIiwic2VjdXJlQ29udGV4dE9wdGlvbnMiLCJpblRyYW5zYWN0aW9uIiwidHJhbnNhY3Rpb25EZXNjcmlwdG9ycyIsInRyYW5zYWN0aW9uRGVwdGgiLCJpc1NxbEJhdGNoIiwiY3VyVHJhbnNpZW50UmV0cnlDb3VudCIsInRyYW5zaWVudEVycm9yTG9va3VwIiwiY2xvc2VkIiwibG9naW5FcnJvciIsImRlYnVnIiwibnRsbXBhY2tldCIsIm50bG1wYWNrZXRCdWZmZXIiLCJyb3V0aW5nRGF0YSIsIm1lc3NhZ2VJbyIsInN0YXRlIiwicmVzZXRDb25uZWN0aW9uT25OZXh0UmVxdWVzdCIsInJlcXVlc3QiLCJwcm9jUmV0dXJuU3RhdHVzVmFsdWUiLCJzb2NrZXQiLCJtZXNzYWdlQnVmZmVyIiwiY29ubmVjdFRpbWVyIiwiY2FuY2VsVGltZXIiLCJyZXF1ZXN0VGltZXIiLCJyZXRyeVRpbWVyIiwiX2NhbmNlbEFmdGVyUmVxdWVzdFNlbnQiLCJkYXRhYmFzZUNvbGxhdGlvbiIsIlR5cGVFcnJvciIsInNlcnZlciIsImF1dGhlbnRpY2F0aW9uIiwidW5kZWZpbmVkIiwidHlwZSIsIm9wdGlvbnMiLCJkb21haW4iLCJ1c2VyTmFtZSIsInBhc3N3b3JkIiwidG9VcHBlckNhc2UiLCJjbGllbnRJZCIsInRlbmFudElkIiwidG9rZW4iLCJjbGllbnRTZWNyZXQiLCJhYm9ydFRyYW5zYWN0aW9uT25FcnJvciIsImFwcE5hbWUiLCJjYW1lbENhc2VDb2x1bW5zIiwiY2FuY2VsVGltZW91dCIsImNvbHVtbkVuY3J5cHRpb25LZXlDYWNoZVRUTCIsImNvbHVtbkVuY3J5cHRpb25TZXR0aW5nIiwiY29sdW1uTmFtZVJlcGxhY2VyIiwiY29ubmVjdGlvblJldHJ5SW50ZXJ2YWwiLCJjb25uZWN0VGltZW91dCIsImNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbCIsIklTT0xBVElPTl9MRVZFTCIsIlJFQURfQ09NTUlUVEVEIiwiY3J5cHRvQ3JlZGVudGlhbHNEZXRhaWxzIiwiZGF0YWJhc2UiLCJkYXRlZmlyc3QiLCJkYXRlRm9ybWF0IiwiZGF0YSIsInBhY2tldCIsInBheWxvYWQiLCJlbmFibGVBbnNpTnVsbCIsImVuYWJsZUFuc2lOdWxsRGVmYXVsdCIsImVuYWJsZUFuc2lQYWRkaW5nIiwiZW5hYmxlQW5zaVdhcm5pbmdzIiwiZW5hYmxlQXJpdGhBYm9ydCIsImVuYWJsZUNvbmNhdE51bGxZaWVsZHNOdWxsIiwiZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdCIsImVuYWJsZUltcGxpY2l0VHJhbnNhY3Rpb25zIiwiZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQiLCJlbmFibGVRdW90ZWRJZGVudGlmaWVyIiwiZW5jcnlwdCIsImZhbGxiYWNrVG9EZWZhdWx0RGIiLCJlbmNyeXB0aW9uS2V5U3RvcmVQcm92aWRlcnMiLCJpbnN0YW5jZU5hbWUiLCJpc29sYXRpb25MZXZlbCIsImxhbmd1YWdlIiwibG9jYWxBZGRyZXNzIiwibWF4UmV0cmllc09uVHJhbnNpZW50RXJyb3JzIiwibXVsdGlTdWJuZXRGYWlsb3ZlciIsInBhY2tldFNpemUiLCJwb3J0IiwicmVhZE9ubHlJbnRlbnQiLCJyZXF1ZXN0VGltZW91dCIsInJvd0NvbGxlY3Rpb25PbkRvbmUiLCJyb3dDb2xsZWN0aW9uT25SZXF1ZXN0Q29tcGxldGlvbiIsInNlcnZlck5hbWUiLCJzZXJ2ZXJTdXBwb3J0c0NvbHVtbkVuY3J5cHRpb24iLCJ0ZHNWZXJzaW9uIiwidGV4dHNpemUiLCJ0cnVzdGVkU2VydmVyTmFtZUFFIiwidHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZSIsInVzZUNvbHVtbk5hbWVzIiwidXNlVVRDIiwid29ya3N0YXRpb25JZCIsImxvd2VyQ2FzZUd1aWRzIiwiRXJyb3IiLCJSYW5nZUVycm9yIiwic2VjdXJlT3B0aW9ucyIsIk9iamVjdCIsImNyZWF0ZSIsInZhbHVlIiwiY29uc3RhbnRzIiwiU1NMX09QX0RPTlRfSU5TRVJUX0VNUFRZX0ZSQUdNRU5UUyIsImNyZWF0ZURlYnVnIiwiQnVmZmVyIiwiZnJvbSIsImFsbG9jIiwiVHJhbnNpZW50RXJyb3JMb29rdXAiLCJTVEFURSIsIklOSVRJQUxJWkVEIiwic2VuZE1lc3NhZ2UiLCJUWVBFIiwiQVRURU5USU9OIiwiY3JlYXRlQ2FuY2VsVGltZXIiLCJjb25uZWN0IiwiY29ubmVjdExpc3RlbmVyIiwiQ29ubmVjdGlvbkVycm9yIiwibmFtZSIsIm9uQ29ubmVjdCIsImVyciIsInJlbW92ZUxpc3RlbmVyIiwib25FcnJvciIsIm9uY2UiLCJ0cmFuc2l0aW9uVG8iLCJDT05ORUNUSU5HIiwib24iLCJldmVudCIsImxpc3RlbmVyIiwiZW1pdCIsImFyZ3MiLCJjbG9zZSIsIkZJTkFMIiwiaW5pdGlhbGlzZUNvbm5lY3Rpb24iLCJzaWduYWwiLCJjcmVhdGVDb25uZWN0VGltZXIiLCJjb25uZWN0T25Qb3J0IiwidGltZW91dCIsInRoZW4iLCJwcm9jZXNzIiwibmV4dFRpY2siLCJtZXNzYWdlIiwiY2xlYW51cENvbm5lY3Rpb24iLCJjbGVhbnVwVHlwZSIsImNsZWFyQ29ubmVjdFRpbWVyIiwiY2xlYXJSZXF1ZXN0VGltZXIiLCJjbGVhclJldHJ5VGltZXIiLCJjbG9zZUNvbm5lY3Rpb24iLCJSZXF1ZXN0RXJyb3IiLCJjYWxsYmFjayIsIkRlYnVnIiwiY3JlYXRlVG9rZW5TdHJlYW1QYXJzZXIiLCJoYW5kbGVyIiwiVG9rZW5TdHJlYW1QYXJzZXIiLCJjb25uZWN0T3B0cyIsImhvc3QiLCJjb25uZWN0SW5QYXJhbGxlbCIsImNvbm5lY3RJblNlcXVlbmNlIiwiZG5zIiwibG9va3VwIiwiZXJyb3IiLCJzb2NrZXRFcnJvciIsInNvY2tldENsb3NlIiwic29ja2V0RW5kIiwic2V0S2VlcEFsaXZlIiwiTWVzc2FnZUlPIiwiY2xlYXJ0ZXh0IiwibG9nIiwic2VuZFByZUxvZ2luIiwiU0VOVF9QUkVMT0dJTiIsImRlc3Ryb3kiLCJjb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwic2V0VGltZW91dCIsImFib3J0IiwiY2xlYXJDYW5jZWxUaW1lciIsImNyZWF0ZVJlcXVlc3RUaW1lciIsImNyZWF0ZVJldHJ5VGltZXIiLCJyZXRyeVRpbWVvdXQiLCJkaXNwYXRjaEV2ZW50IiwiY2FuY2VsIiwiY2xlYXJUaW1lb3V0IiwibmV3U3RhdGUiLCJleGl0IiwiY2FsbCIsImVudGVyIiwiYXBwbHkiLCJnZXRFdmVudEhhbmRsZXIiLCJldmVudE5hbWUiLCJldmVudHMiLCJTRU5UX1RMU1NTTE5FR09USUFUSU9OIiwiY29kZSIsIlJFUk9VVElORyIsIlRSQU5TSUVOVF9GQUlMVVJFX1JFVFJZIiwibWFqb3IiLCJtaW5vciIsImJ1aWxkIiwiZXhlYyIsInZlcnNpb24iLCJQcmVsb2dpblBheWxvYWQiLCJOdW1iZXIiLCJzdWJidWlsZCIsIlBSRUxPR0lOIiwidG9TdHJpbmciLCJzZW5kTG9naW43UGFja2V0IiwiTG9naW43UGF5bG9hZCIsInZlcnNpb25zIiwiY2xpZW50UHJvZ1ZlciIsImNsaWVudFBpZCIsInBpZCIsImNvbm5lY3Rpb25JZCIsImNsaWVudFRpbWVab25lIiwiRGF0ZSIsImdldFRpbWV6b25lT2Zmc2V0IiwiY2xpZW50TGNpZCIsImZlZEF1dGgiLCJlY2hvIiwid29ya2Zsb3ciLCJmZWRBdXRoVG9rZW4iLCJzc3BpIiwiaG9zdG5hbWUiLCJvcyIsImxpYnJhcnlOYW1lIiwiaW5pdERiRmF0YWwiLCJMT0dJTjciLCJ0b0J1ZmZlciIsInNlbmRGZWRBdXRoVG9rZW5NZXNzYWdlIiwiYWNjZXNzVG9rZW5MZW4iLCJieXRlTGVuZ3RoIiwib2Zmc2V0Iiwid3JpdGVVSW50MzJMRSIsIndyaXRlIiwiRkVEQVVUSF9UT0tFTiIsIlNFTlRfTE9HSU43X1dJVEhfU1RBTkRBUkRfTE9HSU4iLCJzZW5kSW5pdGlhbFNxbCIsIlNxbEJhdGNoUGF5bG9hZCIsImdldEluaXRpYWxTcWwiLCJjdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yIiwiTWVzc2FnZSIsIlNRTF9CQVRDSCIsIm91dGdvaW5nTWVzc2FnZVN0cmVhbSIsIlJlYWRhYmxlIiwicGlwZSIsInB1c2giLCJnZXRJc29sYXRpb25MZXZlbFRleHQiLCJqb2luIiwicHJvY2Vzc2VkSW5pdGlhbFNxbCIsImV4ZWNTcWxCYXRjaCIsIm1ha2VSZXF1ZXN0Iiwic3FsVGV4dE9yUHJvY2VkdXJlIiwiZXhlY1NxbCIsInZhbGlkYXRlUGFyYW1ldGVycyIsInBhcmFtZXRlcnMiLCJUWVBFUyIsIk5WYXJDaGFyIiwib3V0cHV0IiwibGVuZ3RoIiwicHJlY2lzaW9uIiwic2NhbGUiLCJtYWtlUGFyYW1zUGFyYW1ldGVyIiwiUlBDX1JFUVVFU1QiLCJScGNSZXF1ZXN0UGF5bG9hZCIsIm5ld0J1bGtMb2FkIiwidGFibGUiLCJjYWxsYmFja09yT3B0aW9ucyIsIkJ1bGtMb2FkIiwiZXhlY0J1bGtMb2FkIiwiYnVsa0xvYWQiLCJyb3dzIiwiZXhlY3V0aW9uU3RhcnRlZCIsInN0cmVhbWluZ01vZGUiLCJmaXJzdFJvd1dyaXR0ZW4iLCJyb3dTdHJlYW0iLCJyb3dUb1BhY2tldFRyYW5zZm9ybSIsImVuZCIsIm9uQ2FuY2VsIiwiQnVsa0xvYWRQYXlsb2FkIiwiUmVxdWVzdCIsImdldEJ1bGtJbnNlcnRTcWwiLCJCVUxLX0xPQUQiLCJwcmVwYXJlIiwiSW50IiwicHJlcGFyaW5nIiwiaGFuZGxlIiwidW5wcmVwYXJlIiwiZXhlY3V0ZSIsImV4ZWN1dGVQYXJhbWV0ZXJzIiwiaSIsImxlbiIsInBhcmFtZXRlciIsInZhbGlkYXRlIiwiY2FsbFByb2NlZHVyZSIsImJlZ2luVHJhbnNhY3Rpb24iLCJ0cmFuc2FjdGlvbiIsIlRyYW5zYWN0aW9uIiwiaXNvbGF0aW9uTGV2ZWxUb1RTUUwiLCJUUkFOU0FDVElPTl9NQU5BR0VSIiwiYmVnaW5QYXlsb2FkIiwiY29tbWl0VHJhbnNhY3Rpb24iLCJjb21taXRQYXlsb2FkIiwicm9sbGJhY2tUcmFuc2FjdGlvbiIsInJvbGxiYWNrUGF5bG9hZCIsInNhdmVUcmFuc2FjdGlvbiIsInNhdmVQYXlsb2FkIiwiY2IiLCJ1c2VTYXZlcG9pbnQiLCJjcnlwdG8iLCJyYW5kb21CeXRlcyIsInR4RG9uZSIsImRvbmUiLCJMT0dHRURfSU4iLCJ0eEVyciIsInBhY2tldFR5cGUiLCJjYW5jZWxlZCIsImNvbm5lY3Rpb24iLCJyb3dDb3VudCIsInJzdCIsInBheWxvYWRTdHJlYW0iLCJ1bnBpcGUiLCJpZ25vcmUiLCJwYXVzZWQiLCJyZXN1bWUiLCJyZXNldENvbm5lY3Rpb24iLCJTRU5UX0NMSUVOVF9SRVFVRVNUIiwicmVzZXQiLCJSRUFEX1VOQ09NTUlUVEVEIiwiUkVQRUFUQUJMRV9SRUFEIiwiU0VSSUFMSVpBQkxFIiwiU05BUFNIT1QiLCJpc1RyYW5zaWVudEVycm9yIiwiQWdncmVnYXRlRXJyb3IiLCJlcnJvcnMiLCJpc1RyYW5zaWVudCIsIm1vZHVsZSIsImV4cG9ydHMiLCJwcm90b3R5cGUiLCJyZWFkTWVzc2FnZSIsImNvbmNhdCIsInByZWxvZ2luUGF5bG9hZCIsImVuY3J5cHRpb25TdHJpbmciLCJzdGFydFRscyIsIlNFTlRfTE9HSU43X1dJVEhfRkVEQVVUSCIsIlNFTlRfTE9HSU43X1dJVEhfTlRMTSIsImNhdGNoIiwicmVjb25uZWN0IiwicmV0cnkiLCJMb2dpbjdUb2tlbkhhbmRsZXIiLCJ0b2tlblN0cmVhbVBhcnNlciIsImxvZ2luQWNrUmVjZWl2ZWQiLCJMT0dHRURfSU5fU0VORElOR19JTklUSUFMX1NRTCIsIk5UTE1SZXNwb25zZVBheWxvYWQiLCJOVExNQVVUSF9QS1QiLCJmZWRBdXRoSW5mb1Rva2VuIiwic3RzdXJsIiwic3BuIiwidG9rZW5TY29wZSIsIlVSTCIsImNyZWRlbnRpYWxzIiwiVXNlcm5hbWVQYXNzd29yZENyZWRlbnRpYWwiLCJtc2lBcmdzIiwiTWFuYWdlZElkZW50aXR5Q3JlZGVudGlhbCIsIm1hbmFnZWRJZGVudGl0eUNsaWVudElkIiwiRGVmYXVsdEF6dXJlQ3JlZGVudGlhbCIsIkNsaWVudFNlY3JldENyZWRlbnRpYWwiLCJ0b2tlblJlc3BvbnNlIiwiZ2V0VG9rZW4iLCJJbml0aWFsU3FsVG9rZW5IYW5kbGVyIiwiUmVxdWVzdFRva2VuSGFuZGxlciIsIlNFTlRfQVRURU5USU9OIiwib25SZXN1bWUiLCJvblBhdXNlIiwicGF1c2UiLCJvbkVuZE9mTWVzc2FnZSIsInNxbFJlcXVlc3QiLCJuZXh0U3RhdGUiLCJBdHRlbnRpb25Ub2tlbkhhbmRsZXIiLCJhdHRlbnRpb25SZWNlaXZlZCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25uZWN0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgeyBTb2NrZXQgfSBmcm9tICduZXQnO1xuaW1wb3J0IGRucyBmcm9tICdkbnMnO1xuXG5pbXBvcnQgY29uc3RhbnRzIGZyb20gJ2NvbnN0YW50cyc7XG5pbXBvcnQgeyBTZWN1cmVDb250ZXh0T3B0aW9ucyB9IGZyb20gJ3Rscyc7XG5cbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcblxuaW1wb3J0IHtcbiAgRGVmYXVsdEF6dXJlQ3JlZGVudGlhbCxcbiAgQ2xpZW50U2VjcmV0Q3JlZGVudGlhbCxcbiAgTWFuYWdlZElkZW50aXR5Q3JlZGVudGlhbCxcbiAgVXNlcm5hbWVQYXNzd29yZENyZWRlbnRpYWwsXG59IGZyb20gJ0BhenVyZS9pZGVudGl0eSc7XG5cbmltcG9ydCBCdWxrTG9hZCwgeyBPcHRpb25zIGFzIEJ1bGtMb2FkT3B0aW9ucywgQ2FsbGJhY2sgYXMgQnVsa0xvYWRDYWxsYmFjayB9IGZyb20gJy4vYnVsay1sb2FkJztcbmltcG9ydCBEZWJ1ZyBmcm9tICcuL2RlYnVnJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciwgb25jZSB9IGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgeyBpbnN0YW5jZUxvb2t1cCB9IGZyb20gJy4vaW5zdGFuY2UtbG9va3VwJztcbmltcG9ydCB7IFRyYW5zaWVudEVycm9yTG9va3VwIH0gZnJvbSAnLi90cmFuc2llbnQtZXJyb3ItbG9va3VwJztcbmltcG9ydCB7IFRZUEUgfSBmcm9tICcuL3BhY2tldCc7XG5pbXBvcnQgUHJlbG9naW5QYXlsb2FkIGZyb20gJy4vcHJlbG9naW4tcGF5bG9hZCc7XG5pbXBvcnQgTG9naW43UGF5bG9hZCBmcm9tICcuL2xvZ2luNy1wYXlsb2FkJztcbmltcG9ydCBOVExNUmVzcG9uc2VQYXlsb2FkIGZyb20gJy4vbnRsbS1wYXlsb2FkJztcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5pbXBvcnQgUnBjUmVxdWVzdFBheWxvYWQgZnJvbSAnLi9ycGNyZXF1ZXN0LXBheWxvYWQnO1xuaW1wb3J0IFNxbEJhdGNoUGF5bG9hZCBmcm9tICcuL3NxbGJhdGNoLXBheWxvYWQnO1xuaW1wb3J0IE1lc3NhZ2VJTyBmcm9tICcuL21lc3NhZ2UtaW8nO1xuaW1wb3J0IHsgUGFyc2VyIGFzIFRva2VuU3RyZWFtUGFyc2VyIH0gZnJvbSAnLi90b2tlbi90b2tlbi1zdHJlYW0tcGFyc2VyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uLCBJU09MQVRJT05fTEVWRUwsIGFzc2VydFZhbGlkSXNvbGF0aW9uTGV2ZWwgfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IENvbm5lY3Rpb25FcnJvciwgUmVxdWVzdEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgY29ubmVjdEluUGFyYWxsZWwsIGNvbm5lY3RJblNlcXVlbmNlIH0gZnJvbSAnLi9jb25uZWN0b3InO1xuaW1wb3J0IHsgbmFtZSBhcyBsaWJyYXJ5TmFtZSB9IGZyb20gJy4vbGlicmFyeSc7XG5pbXBvcnQgeyB2ZXJzaW9ucyB9IGZyb20gJy4vdGRzLXZlcnNpb25zJztcbmltcG9ydCBNZXNzYWdlIGZyb20gJy4vbWVzc2FnZSc7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gJy4vbWV0YWRhdGEtcGFyc2VyJztcbmltcG9ydCB7IGNyZWF0ZU5UTE1SZXF1ZXN0IH0gZnJvbSAnLi9udGxtJztcbmltcG9ydCB7IENvbHVtbkVuY3J5cHRpb25BenVyZUtleVZhdWx0UHJvdmlkZXIgfSBmcm9tICcuL2Fsd2F5cy1lbmNyeXB0ZWQva2V5c3RvcmUtcHJvdmlkZXItYXp1cmUta2V5LXZhdWx0JztcblxuaW1wb3J0IHsgQWJvcnRDb250cm9sbGVyLCBBYm9ydFNpZ25hbCB9IGZyb20gJ25vZGUtYWJvcnQtY29udHJvbGxlcic7XG5pbXBvcnQgeyBQYXJhbWV0ZXIsIFRZUEVTIH0gZnJvbSAnLi9kYXRhLXR5cGUnO1xuaW1wb3J0IHsgQnVsa0xvYWRQYXlsb2FkIH0gZnJvbSAnLi9idWxrLWxvYWQtcGF5bG9hZCc7XG5pbXBvcnQgeyBDb2xsYXRpb24gfSBmcm9tICcuL2NvbGxhdGlvbic7XG5cbmltcG9ydCBBZ2dyZWdhdGVFcnJvciBmcm9tICdlcy1hZ2dyZWdhdGUtZXJyb3InO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4uL3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBVUkwgfSBmcm9tICd1cmwnO1xuaW1wb3J0IHsgQXR0ZW50aW9uVG9rZW5IYW5kbGVyLCBJbml0aWFsU3FsVG9rZW5IYW5kbGVyLCBMb2dpbjdUb2tlbkhhbmRsZXIsIFJlcXVlc3RUb2tlbkhhbmRsZXIsIFRva2VuSGFuZGxlciB9IGZyb20gJy4vdG9rZW4vaGFuZGxlcic7XG5cbnR5cGUgQmVnaW5UcmFuc2FjdGlvbkNhbGxiYWNrID1cbiAgLyoqXG4gICAqIFRoZSBjYWxsYmFjayBpcyBjYWxsZWQgd2hlbiB0aGUgcmVxdWVzdCB0byBzdGFydCB0aGUgdHJhbnNhY3Rpb24gaGFzIGNvbXBsZXRlZCxcbiAgICogZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB3aXRoIGFuIGVycm9yLlxuICAgKiBJZiBhbiBlcnJvciBvY2N1cnJlZCB0aGVuIGBlcnJgIHdpbGwgZGVzY3JpYmUgdGhlIGVycm9yLlxuICAgKlxuICAgKiBBcyBvbmx5IG9uZSByZXF1ZXN0IGF0IGEgdGltZSBtYXkgYmUgZXhlY3V0ZWQgb24gYSBjb25uZWN0aW9uLCBhbm90aGVyIHJlcXVlc3Qgc2hvdWxkIG5vdFxuICAgKiBiZSBpbml0aWF0ZWQgdW50aWwgdGhpcyBjYWxsYmFjayBpcyBjYWxsZWQuXG4gICAqXG4gICAqIEBwYXJhbSBlcnIgSWYgYW4gZXJyb3Igb2NjdXJyZWQsIGFuIFtbRXJyb3JdXSBvYmplY3Qgd2l0aCBkZXRhaWxzIG9mIHRoZSBlcnJvci5cbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uRGVzY3JpcHRvciBBIEJ1ZmZlciB0aGF0IGRlc2NyaWJlIHRoZSB0cmFuc2FjdGlvblxuICAgKi9cbiAgKGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkLCB0cmFuc2FjdGlvbkRlc2NyaXB0b3I/OiBCdWZmZXIpID0+IHZvaWRcblxudHlwZSBTYXZlVHJhbnNhY3Rpb25DYWxsYmFjayA9XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3QgdG8gc2V0IGEgc2F2ZXBvaW50IHdpdGhpbiB0aGVcbiAgICogdHJhbnNhY3Rpb24gaGFzIGNvbXBsZXRlZCwgZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB3aXRoIGFuIGVycm9yLlxuICAgKiBJZiBhbiBlcnJvciBvY2N1cnJlZCB0aGVuIGBlcnJgIHdpbGwgZGVzY3JpYmUgdGhlIGVycm9yLlxuICAgKlxuICAgKiBBcyBvbmx5IG9uZSByZXF1ZXN0IGF0IGEgdGltZSBtYXkgYmUgZXhlY3V0ZWQgb24gYSBjb25uZWN0aW9uLCBhbm90aGVyIHJlcXVlc3Qgc2hvdWxkIG5vdFxuICAgKiBiZSBpbml0aWF0ZWQgdW50aWwgdGhpcyBjYWxsYmFjayBpcyBjYWxsZWQuXG4gICAqXG4gICAqIEBwYXJhbSBlcnIgSWYgYW4gZXJyb3Igb2NjdXJyZWQsIGFuIFtbRXJyb3JdXSBvYmplY3Qgd2l0aCBkZXRhaWxzIG9mIHRoZSBlcnJvci5cbiAgICovXG4gIChlcnI6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcblxudHlwZSBDb21taXRUcmFuc2FjdGlvbkNhbGxiYWNrID1cbiAgLyoqXG4gICAqIFRoZSBjYWxsYmFjayBpcyBjYWxsZWQgd2hlbiB0aGUgcmVxdWVzdCB0byBjb21taXQgdGhlIHRyYW5zYWN0aW9uIGhhcyBjb21wbGV0ZWQsXG4gICAqIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvci5cbiAgICogSWYgYW4gZXJyb3Igb2NjdXJyZWQgdGhlbiBgZXJyYCB3aWxsIGRlc2NyaWJlIHRoZSBlcnJvci5cbiAgICpcbiAgICogQXMgb25seSBvbmUgcmVxdWVzdCBhdCBhIHRpbWUgbWF5IGJlIGV4ZWN1dGVkIG9uIGEgY29ubmVjdGlvbiwgYW5vdGhlciByZXF1ZXN0IHNob3VsZCBub3RcbiAgICogYmUgaW5pdGlhdGVkIHVudGlsIHRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0gZXJyIElmIGFuIGVycm9yIG9jY3VycmVkLCBhbiBbW0Vycm9yXV0gb2JqZWN0IHdpdGggZGV0YWlscyBvZiB0aGUgZXJyb3IuXG4gICAqL1xuICAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQpID0+IHZvaWQ7XG5cbnR5cGUgUm9sbGJhY2tUcmFuc2FjdGlvbkNhbGxiYWNrID1cbiAgLyoqXG4gICAqIFRoZSBjYWxsYmFjayBpcyBjYWxsZWQgd2hlbiB0aGUgcmVxdWVzdCB0byByb2xsYmFjayB0aGUgdHJhbnNhY3Rpb24gaGFzXG4gICAqIGNvbXBsZXRlZCwgZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB3aXRoIGFuIGVycm9yLlxuICAgKiBJZiBhbiBlcnJvciBvY2N1cnJlZCB0aGVuIGVyciB3aWxsIGRlc2NyaWJlIHRoZSBlcnJvci5cbiAgICpcbiAgICogQXMgb25seSBvbmUgcmVxdWVzdCBhdCBhIHRpbWUgbWF5IGJlIGV4ZWN1dGVkIG9uIGEgY29ubmVjdGlvbiwgYW5vdGhlciByZXF1ZXN0IHNob3VsZCBub3RcbiAgICogYmUgaW5pdGlhdGVkIHVudGlsIHRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0gZXJyIElmIGFuIGVycm9yIG9jY3VycmVkLCBhbiBbW0Vycm9yXV0gb2JqZWN0IHdpdGggZGV0YWlscyBvZiB0aGUgZXJyb3IuXG4gICAqL1xuICAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQpID0+IHZvaWQ7XG5cbnR5cGUgUmVzZXRDYWxsYmFjayA9XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIGNvbm5lY3Rpb24gcmVzZXQgaGFzIGNvbXBsZXRlZCxcbiAgICogZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB3aXRoIGFuIGVycm9yLlxuICAgKlxuICAgKiBJZiBhbiBlcnJvciBvY2N1cnJlZCB0aGVuIGBlcnJgIHdpbGwgZGVzY3JpYmUgdGhlIGVycm9yLlxuICAgKlxuICAgKiBBcyBvbmx5IG9uZSByZXF1ZXN0IGF0IGEgdGltZSBtYXkgYmUgZXhlY3V0ZWQgb24gYSBjb25uZWN0aW9uLCBhbm90aGVyXG4gICAqIHJlcXVlc3Qgc2hvdWxkIG5vdCBiZSBpbml0aWF0ZWQgdW50aWwgdGhpcyBjYWxsYmFjayBpcyBjYWxsZWRcbiAgICpcbiAgICogQHBhcmFtIGVyciBJZiBhbiBlcnJvciBvY2N1cnJlZCwgYW4gW1tFcnJvcl1dIG9iamVjdCB3aXRoIGRldGFpbHMgb2YgdGhlIGVycm9yLlxuICAgKi9cbiAgKGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkKSA9PiB2b2lkO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG50eXBlIFRyYW5zYWN0aW9uQ2FsbGJhY2s8VCBleHRlbmRzIChlcnI6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCwgLi4uYXJnczogYW55W10pID0+IHZvaWQ+ID1cbiAgLyoqXG4gICAqIFRoZSBjYWxsYmFjayBpcyBjYWxsZWQgd2hlbiB0aGUgcmVxdWVzdCB0byBzdGFydCBhIHRyYW5zYWN0aW9uIChvciBjcmVhdGUgYSBzYXZlcG9pbnQsIGluXG4gICAqIHRoZSBjYXNlIG9mIGEgbmVzdGVkIHRyYW5zYWN0aW9uKSBoYXMgY29tcGxldGVkLCBlaXRoZXIgc3VjY2Vzc2Z1bGx5IG9yIHdpdGggYW4gZXJyb3IuXG4gICAqIElmIGFuIGVycm9yIG9jY3VycmVkLCB0aGVuIGBlcnJgIHdpbGwgZGVzY3JpYmUgdGhlIGVycm9yLlxuICAgKiBJZiBubyBlcnJvciBvY2N1cnJlZCwgdGhlIGNhbGxiYWNrIHNob3VsZCBwZXJmb3JtIGl0cyB3b3JrIGFuZCBldmVudHVhbGx5IGNhbGxcbiAgICogYGRvbmVgIHdpdGggYW4gZXJyb3Igb3IgbnVsbCAodG8gdHJpZ2dlciBhIHRyYW5zYWN0aW9uIHJvbGxiYWNrIG9yIGFcbiAgICogdHJhbnNhY3Rpb24gY29tbWl0KSBhbmQgYW4gYWRkaXRpb25hbCBjb21wbGV0aW9uIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgcmVxdWVzdFxuICAgKiB0byByb2xsYmFjayBvciBjb21taXQgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gaGFzIGNvbXBsZXRlZCwgZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB3aXRoIGFuIGVycm9yLlxuICAgKiBBZGRpdGlvbmFsIGFyZ3VtZW50cyBnaXZlbiB0byBgZG9uZWAgd2lsbCBiZSBwYXNzZWQgdGhyb3VnaCB0byB0aGlzIGNhbGxiYWNrLlxuICAgKlxuICAgKiBBcyBvbmx5IG9uZSByZXF1ZXN0IGF0IGEgdGltZSBtYXkgYmUgZXhlY3V0ZWQgb24gYSBjb25uZWN0aW9uLCBhbm90aGVyIHJlcXVlc3Qgc2hvdWxkIG5vdFxuICAgKiBiZSBpbml0aWF0ZWQgdW50aWwgdGhlIGNvbXBsZXRpb24gY2FsbGJhY2sgaXMgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0gZXJyIElmIGFuIGVycm9yIG9jY3VycmVkLCBhbiBbW0Vycm9yXV0gb2JqZWN0IHdpdGggZGV0YWlscyBvZiB0aGUgZXJyb3IuXG4gICAqIEBwYXJhbSB0eERvbmUgSWYgbm8gZXJyb3Igb2NjdXJyZWQsIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHRvIGNvbW1pdCBvciByb2xsYmFjayB0aGUgdHJhbnNhY3Rpb24uXG4gICAqL1xuICAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIHR4RG9uZT86IFRyYW5zYWN0aW9uRG9uZTxUPikgPT4gdm9pZDtcblxudHlwZSBUcmFuc2FjdGlvbkRvbmVDYWxsYmFjayA9IChlcnI6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCwgLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG50eXBlIENhbGxiYWNrUGFyYW1ldGVyczxUIGV4dGVuZHMgKGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkLCAuLi5hcmdzOiBhbnlbXSkgPT4gYW55PiA9IFQgZXh0ZW5kcyAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIC4uLmFyZ3M6IGluZmVyIFApID0+IGFueSA/IFAgOiBuZXZlcjtcblxudHlwZSBUcmFuc2FjdGlvbkRvbmU8VCBleHRlbmRzIChlcnI6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCwgLi4uYXJnczogYW55W10pID0+IHZvaWQ+ID1cbiAgLyoqXG4gICAqIElmIG5vIGVycm9yIG9jY3VycmVkLCBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byBjb21taXQgb3Igcm9sbGJhY2sgdGhlIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZXJyIElmIGFuIGVyciBvY2N1cnJlZCwgYSBzdHJpbmcgd2l0aCBkZXRhaWxzIG9mIHRoZSBlcnJvci5cbiAgICovXG4gIChlcnI6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCwgZG9uZTogVCwgLi4uYXJnczogQ2FsbGJhY2tQYXJhbWV0ZXJzPFQ+KSA9PiB2b2lkO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IEtFRVBfQUxJVkVfSU5JVElBTF9ERUxBWSA9IDMwICogMTAwMDtcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgREVGQVVMVF9DT05ORUNUX1RJTUVPVVQgPSAxNSAqIDEwMDA7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfQ0xJRU5UX1JFUVVFU1RfVElNRU9VVCA9IDE1ICogMTAwMDtcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgREVGQVVMVF9DQU5DRUxfVElNRU9VVCA9IDUgKiAxMDAwO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBERUZBVUxUX0NPTk5FQ1RfUkVUUllfSU5URVJWQUwgPSA1MDA7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfUEFDS0VUX1NJWkUgPSA0ICogMTAyNDtcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgREVGQVVMVF9URVhUU0laRSA9IDIxNDc0ODM2NDc7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfREFURUZJUlNUID0gNztcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgREVGQVVMVF9QT1JUID0gMTQzMztcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgREVGQVVMVF9URFNfVkVSU0lPTiA9ICc3XzQnO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBERUZBVUxUX0xBTkdVQUdFID0gJ3VzX2VuZ2xpc2gnO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBERUZBVUxUX0RBVEVGT1JNQVQgPSAnbWR5JztcblxuaW50ZXJmYWNlIEF6dXJlQWN0aXZlRGlyZWN0b3J5TXNpQXBwU2VydmljZUF1dGhlbnRpY2F0aW9uIHtcbiAgdHlwZTogJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLWFwcC1zZXJ2aWNlJztcbiAgb3B0aW9uczoge1xuICAgIC8qKlxuICAgICAqIElmIHlvdSB1c2VyIHdhbnQgdG8gY29ubmVjdCB0byBhbiBBenVyZSBhcHAgc2VydmljZSB1c2luZyBhIHNwZWNpZmljIGNsaWVudCBhY2NvdW50XG4gICAgICogdGhleSBuZWVkIHRvIHByb3ZpZGUgYGNsaWVudElkYCBhc3Njb2lhdGUgdG8gdGhlaXIgY3JlYXRlZCBpZG5ldGl0eS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgb3B0aW9uYWwgZm9yIHJldHJpZXZlIHRva2VuIGZyb20gYXp1cmUgd2ViIGFwcCBzZXJ2aWNlXG4gICAgICovXG4gICAgY2xpZW50SWQ/OiBzdHJpbmc7XG4gIH07XG59XG5cbmludGVyZmFjZSBBenVyZUFjdGl2ZURpcmVjdG9yeU1zaVZtQXV0aGVudGljYXRpb24ge1xuICB0eXBlOiAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktdm0nO1xuICBvcHRpb25zOiB7XG4gICAgLyoqXG4gICAgICogSWYgeW91IHdhbnQgdG8gY29ubmVjdCB1c2luZyBhIHNwZWNpZmljIGNsaWVudCBhY2NvdW50XG4gICAgICogdGhleSBuZWVkIHRvIHByb3ZpZGUgYGNsaWVudElkYCBhc3NvY2lhdGVkIHRvIHRoZWlyIGNyZWF0ZWQgaWRlbnRpdHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG9wdGlvbmFsIGZvciByZXRyaWV2ZSBhIHRva2VuXG4gICAgICovXG4gICAgY2xpZW50SWQ/OiBzdHJpbmc7XG4gIH07XG59XG5cbmludGVyZmFjZSBBenVyZUFjdGl2ZURpcmVjdG9yeURlZmF1bHRBdXRoZW50aWNhdGlvbiB7XG4gIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWRlZmF1bHQnO1xuICBvcHRpb25zOiB7XG4gICAgLyoqXG4gICAgICogSWYgeW91IHdhbnQgdG8gY29ubmVjdCB1c2luZyBhIHNwZWNpZmljIGNsaWVudCBhY2NvdW50XG4gICAgICogdGhleSBuZWVkIHRvIHByb3ZpZGUgYGNsaWVudElkYCBhc3NvY2lhdGVkIHRvIHRoZWlyIGNyZWF0ZWQgaWRlbnRpdHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG9wdGlvbmFsIGZvciByZXRyaWV2aW5nIGEgdG9rZW5cbiAgICAgKi9cbiAgICBjbGllbnRJZD86IHN0cmluZztcbiAgfTtcbn1cblxuXG5pbnRlcmZhY2UgQXp1cmVBY3RpdmVEaXJlY3RvcnlBY2Nlc3NUb2tlbkF1dGhlbnRpY2F0aW9uIHtcbiAgdHlwZTogJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktYWNjZXNzLXRva2VuJztcbiAgb3B0aW9uczoge1xuICAgIC8qKlxuICAgICAqIEEgdXNlciBuZWVkIHRvIHByb3ZpZGUgYHRva2VuYCB3aGljaCB0aGV5IHJldHJpdmVkIGVsc2Ugd2hlcmVcbiAgICAgKiB0byBmb3JtaW5nIHRoZSBjb25uZWN0aW9uLlxuICAgICAqL1xuICAgIHRva2VuOiBzdHJpbmc7XG4gIH07XG59XG5cbmludGVyZmFjZSBBenVyZUFjdGl2ZURpcmVjdG9yeVBhc3N3b3JkQXV0aGVudGljYXRpb24ge1xuICB0eXBlOiAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1wYXNzd29yZCc7XG4gIG9wdGlvbnM6IHtcbiAgICAvKipcbiAgICAgKiBBIHVzZXIgbmVlZCB0byBwcm92aWRlIGB1c2VyTmFtZWAgYXNzY29pYXRlIHRvIHRoZWlyIGFjY291bnQuXG4gICAgICovXG4gICAgdXNlck5hbWU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEEgdXNlciBuZWVkIHRvIHByb3ZpZGUgYHBhc3N3b3JkYCBhc3Njb2lhdGUgdG8gdGhlaXIgYWNjb3VudC5cbiAgICAgKi9cbiAgICBwYXNzd29yZDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQSBjbGllbnQgaWQgdG8gdXNlLlxuICAgICAqL1xuICAgIGNsaWVudElkOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBPcHRpb25hbCBwYXJhbWV0ZXIgZm9yIHNwZWNpZmljIEF6dXJlIHRlbmFudCBJRFxuICAgICAqL1xuICAgIHRlbmFudElkOiBzdHJpbmc7XG4gIH07XG59XG5cbmludGVyZmFjZSBBenVyZUFjdGl2ZURpcmVjdG9yeVNlcnZpY2VQcmluY2lwYWxTZWNyZXQge1xuICB0eXBlOiAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1zZXJ2aWNlLXByaW5jaXBhbC1zZWNyZXQnO1xuICBvcHRpb25zOiB7XG4gICAgLyoqXG4gICAgICogQXBwbGljYXRpb24gKGBjbGllbnRgKSBJRCBmcm9tIHlvdXIgcmVnaXN0ZXJlZCBBenVyZSBhcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGNsaWVudElkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNyZWF0ZWQgYGNsaWVudCBzZWNyZXRgIGZvciB0aGlzIHJlZ2lzdGVyZWQgQXp1cmUgYXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBjbGllbnRTZWNyZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEaXJlY3RvcnkgKGB0ZW5hbnRgKSBJRCBmcm9tIHlvdXIgcmVnaXN0ZXJlZCBBenVyZSBhcHBsaWNhdGlvblxuICAgICAqL1xuICAgIHRlbmFudElkOiBzdHJpbmc7XG4gIH07XG59XG5cbmludGVyZmFjZSBOdGxtQXV0aGVudGljYXRpb24ge1xuICB0eXBlOiAnbnRsbSc7XG4gIG9wdGlvbnM6IHtcbiAgICAvKipcbiAgICAgKiBVc2VyIG5hbWUgZnJvbSB5b3VyIHdpbmRvd3MgYWNjb3VudC5cbiAgICAgKi9cbiAgICB1c2VyTmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBhc3N3b3JkIGZyb20geW91ciB3aW5kb3dzIGFjY291bnQuXG4gICAgICovXG4gICAgcGFzc3dvcmQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBPbmNlIHlvdSBzZXQgZG9tYWluIGZvciBudGxtIGF1dGhlbnRpY2F0aW9uIHR5cGUsIGRyaXZlciB3aWxsIGNvbm5lY3QgdG8gU1FMIFNlcnZlciB1c2luZyBkb21haW4gbG9naW4uXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgZm9ybWluZyBhIGNvbm5lY3Rpb24gdXNpbmcgbnRsbSB0eXBlXG4gICAgICovXG4gICAgZG9tYWluOiBzdHJpbmc7XG4gIH07XG59XG5cbmludGVyZmFjZSBEZWZhdWx0QXV0aGVudGljYXRpb24ge1xuICB0eXBlOiAnZGVmYXVsdCc7XG4gIG9wdGlvbnM6IHtcbiAgICAvKipcbiAgICAgKiBVc2VyIG5hbWUgdG8gdXNlIGZvciBzcWwgc2VydmVyIGxvZ2luLlxuICAgICAqL1xuICAgIHVzZXJOYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIC8qKlxuICAgICAqIFBhc3N3b3JkIHRvIHVzZSBmb3Igc3FsIHNlcnZlciBsb2dpbi5cbiAgICAgKi9cbiAgICBwYXNzd29yZD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIEVycm9yV2l0aENvZGUgZXh0ZW5kcyBFcnJvciB7XG4gIGNvZGU/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBJbnRlcm5hbENvbm5lY3Rpb25Db25maWcge1xuICBzZXJ2ZXI6IHN0cmluZztcbiAgYXV0aGVudGljYXRpb246IERlZmF1bHRBdXRoZW50aWNhdGlvbiB8IE50bG1BdXRoZW50aWNhdGlvbiB8IEF6dXJlQWN0aXZlRGlyZWN0b3J5UGFzc3dvcmRBdXRoZW50aWNhdGlvbiB8IEF6dXJlQWN0aXZlRGlyZWN0b3J5TXNpQXBwU2VydmljZUF1dGhlbnRpY2F0aW9uIHwgQXp1cmVBY3RpdmVEaXJlY3RvcnlNc2lWbUF1dGhlbnRpY2F0aW9uIHwgQXp1cmVBY3RpdmVEaXJlY3RvcnlBY2Nlc3NUb2tlbkF1dGhlbnRpY2F0aW9uIHwgQXp1cmVBY3RpdmVEaXJlY3RvcnlTZXJ2aWNlUHJpbmNpcGFsU2VjcmV0IHwgQXp1cmVBY3RpdmVEaXJlY3RvcnlEZWZhdWx0QXV0aGVudGljYXRpb247XG4gIG9wdGlvbnM6IEludGVybmFsQ29ubmVjdGlvbk9wdGlvbnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJuYWxDb25uZWN0aW9uT3B0aW9ucyB7XG4gIGFib3J0VHJhbnNhY3Rpb25PbkVycm9yOiBib29sZWFuO1xuICBhcHBOYW1lOiB1bmRlZmluZWQgfCBzdHJpbmc7XG4gIGNhbWVsQ2FzZUNvbHVtbnM6IGJvb2xlYW47XG4gIGNhbmNlbFRpbWVvdXQ6IG51bWJlcjtcbiAgY29sdW1uRW5jcnlwdGlvbktleUNhY2hlVFRMOiBudW1iZXI7XG4gIGNvbHVtbkVuY3J5cHRpb25TZXR0aW5nOiBib29sZWFuO1xuICBjb2x1bW5OYW1lUmVwbGFjZXI6IHVuZGVmaW5lZCB8ICgoY29sTmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyLCBtZXRhZGF0YTogTWV0YWRhdGEpID0+IHN0cmluZyk7XG4gIGNvbm5lY3Rpb25SZXRyeUludGVydmFsOiBudW1iZXI7XG4gIGNvbm5lY3RUaW1lb3V0OiBudW1iZXI7XG4gIGNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbDogdHlwZW9mIElTT0xBVElPTl9MRVZFTFtrZXlvZiB0eXBlb2YgSVNPTEFUSU9OX0xFVkVMXTtcbiAgY3J5cHRvQ3JlZGVudGlhbHNEZXRhaWxzOiBTZWN1cmVDb250ZXh0T3B0aW9ucztcbiAgZGF0YWJhc2U6IHVuZGVmaW5lZCB8IHN0cmluZztcbiAgZGF0ZWZpcnN0OiBudW1iZXI7XG4gIGRhdGVGb3JtYXQ6IHN0cmluZztcbiAgZGVidWc6IHtcbiAgICBkYXRhOiBib29sZWFuO1xuICAgIHBhY2tldDogYm9vbGVhbjtcbiAgICBwYXlsb2FkOiBib29sZWFuO1xuICAgIHRva2VuOiBib29sZWFuO1xuICB9O1xuICBlbmFibGVBbnNpTnVsbDogbnVsbCB8IGJvb2xlYW47XG4gIGVuYWJsZUFuc2lOdWxsRGVmYXVsdDogbnVsbCB8IGJvb2xlYW47XG4gIGVuYWJsZUFuc2lQYWRkaW5nOiBudWxsIHwgYm9vbGVhbjtcbiAgZW5hYmxlQW5zaVdhcm5pbmdzOiBudWxsIHwgYm9vbGVhbjtcbiAgZW5hYmxlQXJpdGhBYm9ydDogbnVsbCB8IGJvb2xlYW47XG4gIGVuYWJsZUNvbmNhdE51bGxZaWVsZHNOdWxsOiBudWxsIHwgYm9vbGVhbjtcbiAgZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdDogbnVsbCB8IGJvb2xlYW47XG4gIGVuYWJsZUltcGxpY2l0VHJhbnNhY3Rpb25zOiBudWxsIHwgYm9vbGVhbjtcbiAgZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQ6IG51bGwgfCBib29sZWFuO1xuICBlbmFibGVRdW90ZWRJZGVudGlmaWVyOiBudWxsIHwgYm9vbGVhbjtcbiAgZW5jcnlwdDogYm9vbGVhbjtcbiAgZW5jcnlwdGlvbktleVN0b3JlUHJvdmlkZXJzOiBLZXlTdG9yZVByb3ZpZGVyTWFwIHwgdW5kZWZpbmVkO1xuICBmYWxsYmFja1RvRGVmYXVsdERiOiBib29sZWFuO1xuICBpbnN0YW5jZU5hbWU6IHVuZGVmaW5lZCB8IHN0cmluZztcbiAgaXNvbGF0aW9uTGV2ZWw6IHR5cGVvZiBJU09MQVRJT05fTEVWRUxba2V5b2YgdHlwZW9mIElTT0xBVElPTl9MRVZFTF07XG4gIGxhbmd1YWdlOiBzdHJpbmc7XG4gIGxvY2FsQWRkcmVzczogdW5kZWZpbmVkIHwgc3RyaW5nO1xuICBtYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnM6IG51bWJlcjtcbiAgbXVsdGlTdWJuZXRGYWlsb3ZlcjogYm9vbGVhbjtcbiAgcGFja2V0U2l6ZTogbnVtYmVyO1xuICBwb3J0OiB1bmRlZmluZWQgfCBudW1iZXI7XG4gIHJlYWRPbmx5SW50ZW50OiBib29sZWFuO1xuICByZXF1ZXN0VGltZW91dDogbnVtYmVyO1xuICByb3dDb2xsZWN0aW9uT25Eb25lOiBib29sZWFuO1xuICByb3dDb2xsZWN0aW9uT25SZXF1ZXN0Q29tcGxldGlvbjogYm9vbGVhbjtcbiAgc2VydmVyTmFtZTogdW5kZWZpbmVkIHwgc3RyaW5nO1xuICBzZXJ2ZXJTdXBwb3J0c0NvbHVtbkVuY3J5cHRpb246IGJvb2xlYW47XG4gIHRkc1ZlcnNpb246IHN0cmluZztcbiAgdGV4dHNpemU6IG51bWJlcjtcbiAgdHJ1c3RlZFNlcnZlck5hbWVBRTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0cnVzdFNlcnZlckNlcnRpZmljYXRlOiBib29sZWFuO1xuICB1c2VDb2x1bW5OYW1lczogYm9vbGVhbjtcbiAgdXNlVVRDOiBib29sZWFuO1xuICB3b3Jrc3RhdGlvbklkOiB1bmRlZmluZWQgfCBzdHJpbmc7XG4gIGxvd2VyQ2FzZUd1aWRzOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgS2V5U3RvcmVQcm92aWRlck1hcCB7XG4gIFtrZXk6IHN0cmluZ106IENvbHVtbkVuY3J5cHRpb25BenVyZUtleVZhdWx0UHJvdmlkZXI7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuaW50ZXJmYWNlIFN0YXRlIHtcbiAgbmFtZTogc3RyaW5nO1xuICBlbnRlcj8odGhpczogQ29ubmVjdGlvbik6IHZvaWQ7XG4gIGV4aXQ/KHRoaXM6IENvbm5lY3Rpb24sIG5ld1N0YXRlOiBTdGF0ZSk6IHZvaWQ7XG4gIGV2ZW50czoge1xuICAgIHNvY2tldEVycm9yPyh0aGlzOiBDb25uZWN0aW9uLCBlcnI6IEVycm9yKTogdm9pZDtcbiAgICBjb25uZWN0VGltZW91dD8odGhpczogQ29ubmVjdGlvbik6IHZvaWQ7XG4gICAgbWVzc2FnZT8odGhpczogQ29ubmVjdGlvbiwgbWVzc2FnZTogTWVzc2FnZSk6IHZvaWQ7XG4gICAgcmV0cnk/KHRoaXM6IENvbm5lY3Rpb24pOiB2b2lkO1xuICAgIHJlY29ubmVjdD8odGhpczogQ29ubmVjdGlvbik6IHZvaWQ7XG4gIH07XG59XG5cbnR5cGUgQXV0aGVudGljYXRpb24gPSBEZWZhdWx0QXV0aGVudGljYXRpb24gfFxuICBOdGxtQXV0aGVudGljYXRpb24gfFxuICBBenVyZUFjdGl2ZURpcmVjdG9yeVBhc3N3b3JkQXV0aGVudGljYXRpb24gfFxuICBBenVyZUFjdGl2ZURpcmVjdG9yeU1zaUFwcFNlcnZpY2VBdXRoZW50aWNhdGlvbiB8XG4gIEF6dXJlQWN0aXZlRGlyZWN0b3J5TXNpVm1BdXRoZW50aWNhdGlvbiB8XG4gIEF6dXJlQWN0aXZlRGlyZWN0b3J5QWNjZXNzVG9rZW5BdXRoZW50aWNhdGlvbiB8XG4gIEF6dXJlQWN0aXZlRGlyZWN0b3J5U2VydmljZVByaW5jaXBhbFNlY3JldCB8XG4gIEF6dXJlQWN0aXZlRGlyZWN0b3J5RGVmYXVsdEF1dGhlbnRpY2F0aW9uO1xuXG50eXBlIEF1dGhlbnRpY2F0aW9uVHlwZSA9IEF1dGhlbnRpY2F0aW9uWyd0eXBlJ107XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogSG9zdG5hbWUgdG8gY29ubmVjdCB0by5cbiAgICovXG4gIHNlcnZlcjogc3RyaW5nO1xuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBmb3JtaW5nIHRoZSBjb25uZWN0aW9uLlxuICAgKi9cbiAgb3B0aW9ucz86IENvbm5lY3Rpb25PcHRpb25zO1xuICAvKipcbiAgICogQXV0aGVudGljYXRpb24gcmVhbHRlZCBvcHRpb25zIGZvciBjb25uZWN0aW9uLlxuICAgKi9cbiAgYXV0aGVudGljYXRpb24/OiBBdXRoZW50aWNhdGlvbk9wdGlvbnM7XG59XG5cbmludGVyZmFjZSBEZWJ1Z09wdGlvbnMge1xuICAvKipcbiAgICogQSBib29sZWFuLCBjb250cm9sbGluZyB3aGV0aGVyIFtbZGVidWddXSBldmVudHMgd2lsbCBiZSBlbWl0dGVkIHdpdGggdGV4dCBkZXNjcmliaW5nIHBhY2tldCBkYXRhIGRldGFpbHNcbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqL1xuICBkYXRhOiBib29sZWFuO1xuICAvKipcbiAgICogQSBib29sZWFuLCBjb250cm9sbGluZyB3aGV0aGVyIFtbZGVidWddXSBldmVudHMgd2lsbCBiZSBlbWl0dGVkIHdpdGggdGV4dCBkZXNjcmliaW5nIHBhY2tldCBkZXRhaWxzXG4gICAqXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKVxuICAgKi9cbiAgcGFja2V0OiBib29sZWFuO1xuICAvKipcbiAgICogQSBib29sZWFuLCBjb250cm9sbGluZyB3aGV0aGVyIFtbZGVidWddXSBldmVudHMgd2lsbCBiZSBlbWl0dGVkIHdpdGggdGV4dCBkZXNjcmliaW5nIHBhY2tldCBwYXlsb2FkIGRldGFpbHNcbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqL1xuICBwYXlsb2FkOiBib29sZWFuO1xuICAvKipcbiAgICogQSBib29sZWFuLCBjb250cm9sbGluZyB3aGV0aGVyIFtbZGVidWddXSBldmVudHMgd2lsbCBiZSBlbWl0dGVkIHdpdGggdGV4dCBkZXNjcmliaW5nIHRva2VuIHN0cmVhbSB0b2tlbnNcbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqL1xuICB0b2tlbjogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEF1dGhlbnRpY2F0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUeXBlIG9mIHRoZSBhdXRoZW50aWNhdGlvbiBtZXRob2QsIHZhbGlkIHR5cGVzIGFyZSBgZGVmYXVsdGAsIGBudGxtYCxcbiAgICogYGF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktcGFzc3dvcmRgLCBgYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1hY2Nlc3MtdG9rZW5gLFxuICAgKiBgYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktdm1gLCBgYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktYXBwLXNlcnZpY2VgLFxuICAgKiBgYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1kZWZhdWx0YFxuICAgKiBvciBgYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1zZXJ2aWNlLXByaW5jaXBhbC1zZWNyZXRgXG4gICAqL1xuICB0eXBlPzogQXV0aGVudGljYXRpb25UeXBlO1xuICAvKipcbiAgICogRGlmZmVyZW50IG9wdGlvbnMgZm9yIGF1dGhlbnRpY2F0aW9uIHR5cGVzOlxuICAgKlxuICAgKiAqIGBkZWZhdWx0YDogW1tEZWZhdWx0QXV0aGVudGljYXRpb24ub3B0aW9uc11dXG4gICAqICogYG50bG1gIDpbW050bG1BdXRoZW50aWNhdGlvbl1dXG4gICAqICogYGF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktcGFzc3dvcmRgIDogW1tBenVyZUFjdGl2ZURpcmVjdG9yeVBhc3N3b3JkQXV0aGVudGljYXRpb24ub3B0aW9uc11dXG4gICAqICogYGF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktYWNjZXNzLXRva2VuYCA6IFtbQXp1cmVBY3RpdmVEaXJlY3RvcnlBY2Nlc3NUb2tlbkF1dGhlbnRpY2F0aW9uLm9wdGlvbnNdXVxuICAgKiAqIGBhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS12bWAgOiBbW0F6dXJlQWN0aXZlRGlyZWN0b3J5TXNpVm1BdXRoZW50aWNhdGlvbi5vcHRpb25zXV1cbiAgICogKiBgYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktYXBwLXNlcnZpY2VgIDogW1tBenVyZUFjdGl2ZURpcmVjdG9yeU1zaUFwcFNlcnZpY2VBdXRoZW50aWNhdGlvbi5vcHRpb25zXV1cbiAgICogKiBgYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1zZXJ2aWNlLXByaW5jaXBhbC1zZWNyZXRgIDogW1tBenVyZUFjdGl2ZURpcmVjdG9yeVNlcnZpY2VQcmluY2lwYWxTZWNyZXQub3B0aW9uc11dXG4gICAqICogYGF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktZGVmYXVsdGAgOiBbW0F6dXJlQWN0aXZlRGlyZWN0b3J5RGVmYXVsdEF1dGhlbnRpY2F0aW9uLm9wdGlvbnNdXVxuICAgKi9cbiAgb3B0aW9ucz86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gZGV0ZXJtaW5pbmcgd2hldGhlciB0byByb2xsYmFjayBhIHRyYW5zYWN0aW9uIGF1dG9tYXRpY2FsbHkgaWYgYW55IGVycm9yIGlzIGVuY291bnRlcmVkXG4gICAqIGR1cmluZyB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24ncyBleGVjdXRpb24uIFRoaXMgc2V0cyB0aGUgdmFsdWUgZm9yIGBTRVQgWEFDVF9BQk9SVGAgZHVyaW5nIHRoZVxuICAgKiBpbml0aWFsIFNRTCBwaGFzZSBvZiBhIGNvbm5lY3Rpb24gW2RvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3NxbC90LXNxbC9zdGF0ZW1lbnRzL3NldC14YWN0LWFib3J0LXRyYW5zYWN0LXNxbCkuXG4gICAqL1xuICBhYm9ydFRyYW5zYWN0aW9uT25FcnJvcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFwcGxpY2F0aW9uIG5hbWUgdXNlZCBmb3IgaWRlbnRpZnlpbmcgYSBzcGVjaWZpYyBhcHBsaWNhdGlvbiBpbiBwcm9maWxpbmcsIGxvZ2dpbmcgb3IgdHJhY2luZyB0b29scyBvZiBTUUxTZXJ2ZXIuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgVGVkaW91c2ApXG4gICAqL1xuICBhcHBOYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4sIGNvbnRyb2xsaW5nIHdoZXRoZXIgdGhlIGNvbHVtbiBuYW1lcyByZXR1cm5lZCB3aWxsIGhhdmUgdGhlIGZpcnN0IGxldHRlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZVxuICAgKiAoYHRydWVgKSBvciBub3QuIFRoaXMgdmFsdWUgaXMgaWdub3JlZCBpZiB5b3UgcHJvdmlkZSBhIFtbY29sdW1uTmFtZVJlcGxhY2VyXV0uXG4gICAqXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKS5cbiAgICovXG4gIGNhbWVsQ2FzZUNvbHVtbnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIFtbUmVxdWVzdC5jYW5jZWxdXSAoYWJvcnQpIG9mIGEgcmVxdWVzdCBpcyBjb25zaWRlcmVkIGZhaWxlZFxuICAgKlxuICAgKiAoZGVmYXVsdDogYDUwMDBgKS5cbiAgICovXG4gIGNhbmNlbFRpbWVvdXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gd2l0aCBwYXJhbWV0ZXJzIGAoY29sdW1uTmFtZSwgaW5kZXgsIGNvbHVtbk1ldGFEYXRhKWAgYW5kIHJldHVybmluZyBhIHN0cmluZy4gSWYgcHJvdmlkZWQsXG4gICAqIHRoaXMgd2lsbCBiZSBjYWxsZWQgb25jZSBwZXIgY29sdW1uIHBlciByZXN1bHQtc2V0LiBUaGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIFNRTC1wcm92aWRlZFxuICAgKiBjb2x1bW4gbmFtZSBvbiByb3cgYW5kIG1ldGEgZGF0YSBvYmplY3RzLiBUaGlzIGFsbG93cyB5b3UgdG8gZHluYW1pY2FsbHkgY29udmVydCBiZXR3ZWVuIG5hbWluZyBjb252ZW50aW9ucy5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGBudWxsYClcbiAgICovXG4gIGNvbHVtbk5hbWVSZXBsYWNlcj86IChjb2xOYW1lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIsIG1ldGFkYXRhOiBNZXRhZGF0YSkgPT4gc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJlZm9yZSByZXRyeWluZyB0byBlc3RhYmxpc2ggY29ubmVjdGlvbiwgaW4gY2FzZSBvZiB0cmFuc2llbnQgZmFpbHVyZS5cbiAgICpcbiAgICogKGRlZmF1bHQ6YDUwMGApXG4gICAqL1xuICBjb25uZWN0aW9uUmV0cnlJbnRlcnZhbD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSBhdHRlbXB0IHRvIGNvbm5lY3QgaXMgY29uc2lkZXJlZCBmYWlsZWRcbiAgICpcbiAgICogKGRlZmF1bHQ6IGAxNTAwMGApLlxuICAgKi9cbiAgY29ubmVjdFRpbWVvdXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGlzb2xhdGlvbiBsZXZlbCBmb3IgbmV3IGNvbm5lY3Rpb25zLiBBbGwgb3V0LW9mLXRyYW5zYWN0aW9uIHF1ZXJpZXMgYXJlIGV4ZWN1dGVkIHdpdGggdGhpcyBzZXR0aW5nLlxuICAgKlxuICAgKiBUaGUgaXNvbGF0aW9uIGxldmVscyBhcmUgYXZhaWxhYmxlIGZyb20gYHJlcXVpcmUoJ3RlZGlvdXMnKS5JU09MQVRJT05fTEVWRUxgLlxuICAgKiAqIGBSRUFEX1VOQ09NTUlUVEVEYFxuICAgKiAqIGBSRUFEX0NPTU1JVFRFRGBcbiAgICogKiBgUkVQRUFUQUJMRV9SRUFEYFxuICAgKiAqIGBTRVJJQUxJWkFCTEVgXG4gICAqICogYFNOQVBTSE9UYFxuICAgKlxuICAgKiAoZGVmYXVsdDogYFJFQURfQ09NTUlURURgKS5cbiAgICovXG4gIGNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbD86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hlbiBlbmNyeXB0aW9uIGlzIHVzZWQsIGFuIG9iamVjdCBtYXkgYmUgc3VwcGxpZWQgdGhhdCB3aWxsIGJlIHVzZWRcbiAgICogZm9yIHRoZSBmaXJzdCBhcmd1bWVudCB3aGVuIGNhbGxpbmcgW2B0bHMuY3JlYXRlU2VjdXJlUGFpcmBdKGh0dHA6Ly9ub2RlanMub3JnL2RvY3MvbGF0ZXN0L2FwaS90bHMuaHRtbCN0bHNfdGxzX2NyZWF0ZXNlY3VyZXBhaXJfY3JlZGVudGlhbHNfaXNzZXJ2ZXJfcmVxdWVzdGNlcnRfcmVqZWN0dW5hdXRob3JpemVkKVxuICAgKlxuICAgKiAoZGVmYXVsdDogYHt9YClcbiAgICovXG4gIGNyeXB0b0NyZWRlbnRpYWxzRGV0YWlscz86IFNlY3VyZUNvbnRleHRPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBEYXRhYmFzZSB0byBjb25uZWN0IHRvIChkZWZhdWx0OiBkZXBlbmRlbnQgb24gc2VydmVyIGNvbmZpZ3VyYXRpb24pLlxuICAgKi9cbiAgZGF0YWJhc2U/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayB0byBhIG51bWJlciBmcm9tIDEgdGhyb3VnaCA3LlxuICAgKi9cbiAgZGF0ZWZpcnN0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgcG9zaXRpb24gb2YgbW9udGgsIGRheSBhbmQgeWVhciBpbiB0ZW1wb3JhbCBkYXRhdHlwZXMuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgbWR5YClcbiAgICovXG4gIGRhdGVGb3JtYXQ/OiBzdHJpbmc7XG5cbiAgZGVidWc/OiBEZWJ1Z09wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgY29udHJvbHMgdGhlIHdheSBudWxsIHZhbHVlcyBzaG91bGQgYmUgdXNlZCBkdXJpbmcgY29tcGFyaXNvbiBvcGVyYXRpb24uXG4gICAqXG4gICAqIChkZWZhdWx0OiBgdHJ1ZWApXG4gICAqL1xuICBlbmFibGVBbnNpTnVsbD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIGBTRVQgQU5TSV9OVUxMX0RGTFRfT04gT05gIHdpbGwgYmUgc2V0IGluIHRoZSBpbml0aWFsIHNxbC4gVGhpcyBtZWFucyBuZXcgY29sdW1ucyB3aWxsIGJlXG4gICAqIG51bGxhYmxlIGJ5IGRlZmF1bHQuIFNlZSB0aGUgW1QtU1FMIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxODczNzUuYXNweClcbiAgICpcbiAgICogKGRlZmF1bHQ6IGB0cnVlYCkuXG4gICAqL1xuICBlbmFibGVBbnNpTnVsbERlZmF1bHQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4sIGNvbnRyb2xzIGlmIHBhZGRpbmcgc2hvdWxkIGJlIGFwcGxpZWQgZm9yIHZhbHVlcyBzaG9ydGVyIHRoYW4gdGhlIHNpemUgb2YgZGVmaW5lZCBjb2x1bW4uXG4gICAqXG4gICAqIChkZWZhdWx0OiBgdHJ1ZWApXG4gICAqL1xuICBlbmFibGVBbnNpUGFkZGluZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIFNRTCBTZXJ2ZXIgd2lsbCBmb2xsb3cgSVNPIHN0YW5kYXJkIGJlaGF2aW9yIGR1cmluZyB2YXJpb3VzIGVycm9yIGNvbmRpdGlvbnMuIEZvciBkZXRhaWxzLFxuICAgKiBzZWUgW2RvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3NxbC90LXNxbC9zdGF0ZW1lbnRzL3NldC1hbnNpLXdhcm5pbmdzLXRyYW5zYWN0LXNxbClcbiAgICpcbiAgICogKGRlZmF1bHQ6IGB0cnVlYClcbiAgICovXG4gIGVuYWJsZUFuc2lXYXJuaW5ncz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuZHMgYSBxdWVyeSB3aGVuIGFuIG92ZXJmbG93IG9yIGRpdmlkZS1ieS16ZXJvIGVycm9yIG9jY3VycyBkdXJpbmcgcXVlcnkgZXhlY3V0aW9uLlxuICAgKiBTZWUgW2RvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3NxbC90LXNxbC9zdGF0ZW1lbnRzL3NldC1hcml0aGFib3J0LXRyYW5zYWN0LXNxbD92aWV3PXNxbC1zZXJ2ZXItMjAxNylcbiAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGB0cnVlYClcbiAgICovXG4gIGVuYWJsZUFyaXRoQWJvcnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4sIGRldGVybWluZXMgaWYgY29uY2F0ZW5hdGlvbiB3aXRoIE5VTEwgc2hvdWxkIHJlc3VsdCBpbiBOVUxMIG9yIGVtcHR5IHN0cmluZyB2YWx1ZSwgbW9yZSBkZXRhaWxzIGluXG4gICAqIFtkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9zcWwvdC1zcWwvc3RhdGVtZW50cy9zZXQtY29uY2F0LW51bGwteWllbGRzLW51bGwtdHJhbnNhY3Qtc3FsKVxuICAgKlxuICAgKiAoZGVmYXVsdDogYHRydWVgKVxuICAgKi9cbiAgZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGw/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4sIGNvbnRyb2xzIHdoZXRoZXIgY3Vyc29yIHNob3VsZCBiZSBjbG9zZWQsIGlmIHRoZSB0cmFuc2FjdGlvbiBvcGVuaW5nIGl0IGdldHMgY29tbWl0dGVkIG9yIHJvbGxlZFxuICAgKiBiYWNrLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYG51bGxgKVxuICAgKi9cbiAgZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdD86IGJvb2xlYW4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4sIHNldHMgdGhlIGNvbm5lY3Rpb24gdG8gZWl0aGVyIGltcGxpY2l0IG9yIGF1dG9jb21taXQgdHJhbnNhY3Rpb24gbW9kZS5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqL1xuICBlbmFibGVJbXBsaWNpdFRyYW5zYWN0aW9ucz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIGZhbHNlLCBlcnJvciBpcyBub3QgZ2VuZXJhdGVkIGR1cmluZyBsb3NzIG9mIHByZWNlc3Npb24uXG4gICAqXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKVxuICAgKi9cbiAgZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBjaGFyYWN0ZXJzIGVuY2xvc2VkIGluIHNpbmdsZSBxdW90ZXMgYXJlIHRyZWF0ZWQgYXMgbGl0ZXJhbHMgYW5kIHRob3NlIGVuY2xvc2VkIGRvdWJsZSBxdW90ZXMgYXJlIHRyZWF0ZWQgYXMgaWRlbnRpZmllcnMuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgdHJ1ZWApXG4gICAqL1xuICBlbmFibGVRdW90ZWRJZGVudGlmaWVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBib29sZWFuIGRldGVybWluaW5nIHdoZXRoZXIgb3Igbm90IHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgZW5jcnlwdGVkLiBTZXQgdG8gYHRydWVgIGlmIHlvdSdyZSBvbiBXaW5kb3dzIEF6dXJlLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYClcbiAgICovXG4gIGVuY3J5cHQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0LCBpZiB0aGUgZGF0YWJhc2UgcmVxdWVzdGVkIGJ5IFtbZGF0YWJhc2VdXSBjYW5ub3QgYmUgYWNjZXNzZWQsXG4gICAqIHRoZSBjb25uZWN0aW9uIHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yLiBIb3dldmVyLCBpZiBbW2ZhbGxiYWNrVG9EZWZhdWx0RGJdXSBpc1xuICAgKiBzZXQgdG8gYHRydWVgLCB0aGVuIHRoZSB1c2VyJ3MgZGVmYXVsdCBkYXRhYmFzZSB3aWxsIGJlIHVzZWQgaW5zdGVhZFxuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYClcbiAgICovXG4gIGZhbGxiYWNrVG9EZWZhdWx0RGI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5zdGFuY2UgbmFtZSB0byBjb25uZWN0IHRvLlxuICAgKiBUaGUgU1FMIFNlcnZlciBCcm93c2VyIHNlcnZpY2UgbXVzdCBiZSBydW5uaW5nIG9uIHRoZSBkYXRhYmFzZSBzZXJ2ZXIsXG4gICAqIGFuZCBVRFAgcG9ydCAxNDM0IG9uIHRoZSBkYXRhYmFzZSBzZXJ2ZXIgbXVzdCBiZSByZWFjaGFibGUuXG4gICAqXG4gICAqIChubyBkZWZhdWx0KVxuICAgKlxuICAgKiBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCBbW3BvcnRdXS5cbiAgICovXG4gIGluc3RhbmNlTmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgaXNvbGF0aW9uIGxldmVsIHRoYXQgdHJhbnNhY3Rpb25zIHdpbGwgYmUgcnVuIHdpdGguXG4gICAqXG4gICAqIFRoZSBpc29sYXRpb24gbGV2ZWxzIGFyZSBhdmFpbGFibGUgZnJvbSBgcmVxdWlyZSgndGVkaW91cycpLklTT0xBVElPTl9MRVZFTGAuXG4gICAqICogYFJFQURfVU5DT01NSVRURURgXG4gICAqICogYFJFQURfQ09NTUlUVEVEYFxuICAgKiAqIGBSRVBFQVRBQkxFX1JFQURgXG4gICAqICogYFNFUklBTElaQUJMRWBcbiAgICogKiBgU05BUFNIT1RgXG4gICAqXG4gICAqIChkZWZhdWx0OiBgUkVBRF9DT01NSVRFRGApLlxuICAgKi9cbiAgaXNvbGF0aW9uTGV2ZWw/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgbGFuZ3VhZ2UgZW52aXJvbm1lbnQgZm9yIHRoZSBzZXNzaW9uLiBUaGUgc2Vzc2lvbiBsYW5ndWFnZSBkZXRlcm1pbmVzIHRoZSBkYXRldGltZSBmb3JtYXRzIGFuZCBzeXN0ZW0gbWVzc2FnZXMuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgdXNfZW5nbGlzaGApLlxuICAgKi9cbiAgbGFuZ3VhZ2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3RyaW5nIGluZGljYXRpbmcgd2hpY2ggbmV0d29yayBpbnRlcmZhY2UgKGlwIGFkZHJlc3MpIHRvIHVzZSB3aGVuIGNvbm5lY3RpbmcgdG8gU1FMIFNlcnZlci5cbiAgICovXG4gIGxvY2FsQWRkcmVzcz86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb24gcmV0cmllcyBmb3IgdHJhbnNpZW50IGVycm9ycy7jgIFcbiAgICpcbiAgICogKGRlZmF1bHQ6IGAzYCkuXG4gICAqL1xuICBtYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIE11bHRpU3VibmV0RmFpbG92ZXIgPSBUcnVlIHBhcmFtZXRlciwgd2hpY2ggY2FuIGhlbHAgbWluaW1pemUgdGhlIGNsaWVudCByZWNvdmVyeSBsYXRlbmN5IHdoZW4gZmFpbG92ZXJzIG9jY3VyLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYCkuXG4gICAqL1xuICBtdWx0aVN1Ym5ldEZhaWxvdmVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgVERTIHBhY2tldHMgKHN1YmplY3QgdG8gbmVnb3RpYXRpb24gd2l0aCB0aGUgc2VydmVyKS5cbiAgICogU2hvdWxkIGJlIGEgcG93ZXIgb2YgMi5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGA0MDk2YCkuXG4gICAqL1xuICBwYWNrZXRTaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBQb3J0IHRvIGNvbm5lY3QgdG8gKGRlZmF1bHQ6IGAxNDMzYCkuXG4gICAqXG4gICAqIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIFtbaW5zdGFuY2VOYW1lXV1cbiAgICovXG4gIHBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgZGV0ZXJtaW5pbmcgd2hldGhlciB0aGUgY29ubmVjdGlvbiB3aWxsIHJlcXVlc3QgcmVhZCBvbmx5IGFjY2VzcyBmcm9tIGEgU1FMIFNlcnZlciBBdmFpbGFiaWxpdHlcbiAgICogR3JvdXAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW2hlcmVdKGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9oaDcxMDA1NC5hc3B4IFwiTWljcm9zb2Z0OiBDb25maWd1cmUgUmVhZC1Pbmx5IFJvdXRpbmcgZm9yIGFuIEF2YWlsYWJpbGl0eSBHcm91cCAoU1FMIFNlcnZlcilcIilcbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApLlxuICAgKi9cbiAgcmVhZE9ubHlJbnRlbnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgYSByZXF1ZXN0IGlzIGNvbnNpZGVyZWQgZmFpbGVkLCBvciBgMGAgZm9yIG5vIHRpbWVvdXRcbiAgICpcbiAgICogKGRlZmF1bHQ6IGAxNTAwMGApLlxuICAgKi9cbiAgcmVxdWVzdFRpbWVvdXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgdGhhdCB3aGVuIHRydWUgd2lsbCBleHBvc2UgcmVjZWl2ZWQgcm93cyBpbiBSZXF1ZXN0cyBkb25lIHJlbGF0ZWQgZXZlbnRzOlxuICAgKiAqIFtbUmVxdWVzdC5FdmVudF9kb25lSW5Qcm9jXV1cbiAgICogKiBbW1JlcXVlc3QuRXZlbnRfZG9uZVByb2NdXVxuICAgKiAqIFtbUmVxdWVzdC5FdmVudF9kb25lXV1cbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqXG4gICAqIENhdXRpb246IElmIG1hbnkgcm93IGFyZSByZWNlaXZlZCwgZW5hYmxpbmcgdGhpcyBvcHRpb24gY291bGQgcmVzdWx0IGluXG4gICAqIGV4Y2Vzc2l2ZSBtZW1vcnkgdXNhZ2UuXG4gICAqL1xuICByb3dDb2xsZWN0aW9uT25Eb25lPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBib29sZWFuLCB0aGF0IHdoZW4gdHJ1ZSB3aWxsIGV4cG9zZSByZWNlaXZlZCByb3dzIGluIFJlcXVlc3RzJyBjb21wbGV0aW9uIGNhbGxiYWNrLlNlZSBbW1JlcXVlc3QuY29uc3RydWN0b3JdXS5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqXG4gICAqIENhdXRpb246IElmIG1hbnkgcm93IGFyZSByZWNlaXZlZCwgZW5hYmxpbmcgdGhpcyBvcHRpb24gY291bGQgcmVzdWx0IGluXG4gICAqIGV4Y2Vzc2l2ZSBtZW1vcnkgdXNhZ2UuXG4gICAqL1xuICByb3dDb2xsZWN0aW9uT25SZXF1ZXN0Q29tcGxldGlvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIFREUyB0byB1c2UuIElmIHNlcnZlciBkb2Vzbid0IHN1cHBvcnQgc3BlY2lmaWVkIHZlcnNpb24sIG5lZ290aWF0ZWQgdmVyc2lvbiBpcyB1c2VkIGluc3RlYWQuXG4gICAqXG4gICAqIFRoZSB2ZXJzaW9ucyBhcmUgYXZhaWxhYmxlIGZyb20gYHJlcXVpcmUoJ3RlZGlvdXMnKS5URFNfVkVSU0lPTmAuXG4gICAqICogYDdfMWBcbiAgICogKiBgN18yYFxuICAgKiAqIGA3XzNfQWBcbiAgICogKiBgN18zX0JgXG4gICAqICogYDdfNGBcbiAgICpcbiAgICogKGRlZmF1bHQ6IGA3XzRgKVxuICAgKi9cbiAgdGRzVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBzaXplIG9mIHZhcmNoYXIobWF4KSwgbnZhcmNoYXIobWF4KSwgdmFyYmluYXJ5KG1heCksIHRleHQsIG50ZXh0LCBhbmQgaW1hZ2UgZGF0YSByZXR1cm5lZCBieSBhIFNFTEVDVCBzdGF0ZW1lbnQuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgMjE0NzQ4MzY0N2ApXG4gICAqL1xuICB0ZXh0c2l6ZT86IHN0cmluZztcblxuICAvKipcbiAgICogSWYgXCJ0cnVlXCIsIHRoZSBTUUwgU2VydmVyIFNTTCBjZXJ0aWZpY2F0ZSBpcyBhdXRvbWF0aWNhbGx5IHRydXN0ZWQgd2hlbiB0aGUgY29tbXVuaWNhdGlvbiBsYXllciBpcyBlbmNyeXB0ZWQgdXNpbmcgU1NMLlxuICAgKlxuICAgKiBJZiBcImZhbHNlXCIsIHRoZSBTUUwgU2VydmVyIHZhbGlkYXRlcyB0aGUgc2VydmVyIFNTTCBjZXJ0aWZpY2F0ZS4gSWYgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSB2YWxpZGF0aW9uIGZhaWxzLFxuICAgKiB0aGUgZHJpdmVyIHJhaXNlcyBhbiBlcnJvciBhbmQgdGVybWluYXRlcyB0aGUgY29ubmVjdGlvbi4gTWFrZSBzdXJlIHRoZSB2YWx1ZSBwYXNzZWQgdG8gc2VydmVyTmFtZSBleGFjdGx5XG4gICAqIG1hdGNoZXMgdGhlIENvbW1vbiBOYW1lIChDTikgb3IgRE5TIG5hbWUgaW4gdGhlIFN1YmplY3QgQWx0ZXJuYXRlIE5hbWUgaW4gdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSBmb3IgYW4gU1NMIGNvbm5lY3Rpb24gdG8gc3VjY2VlZC5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGB0cnVlYClcbiAgICovXG4gIHRydXN0U2VydmVyQ2VydGlmaWNhdGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gZGV0ZXJtaW5pbmcgd2hldGhlciB0byByZXR1cm4gcm93cyBhcyBhcnJheXMgb3Iga2V5LXZhbHVlIGNvbGxlY3Rpb25zLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYCkuXG4gICAqL1xuICB1c2VDb2x1bW5OYW1lcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBkZXRlcm1pbmluZyB3aGV0aGVyIHRvIHBhc3MgdGltZSB2YWx1ZXMgaW4gVVRDIG9yIGxvY2FsIHRpbWUuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgdHJ1ZWApLlxuICAgKi9cbiAgdXNlVVRDPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHdvcmtzdGF0aW9uIElEIChXU0lEKSBvZiB0aGUgY2xpZW50LCBkZWZhdWx0IG9zLmhvc3RuYW1lKCkuXG4gICAqIFVzZWQgZm9yIGlkZW50aWZ5aW5nIGEgc3BlY2lmaWMgY2xpZW50IGluIHByb2ZpbGluZywgbG9nZ2luZyBvclxuICAgKiB0cmFjaW5nIGNsaWVudCBhY3Rpdml0eSBpbiBTUUxTZXJ2ZXIuXG4gICAqXG4gICAqIFRoZSB2YWx1ZSBpcyByZXBvcnRlZCBieSB0aGUgVFNRTCBmdW5jdGlvbiBIT1NUX05BTUUoKS5cbiAgICovXG4gIHdvcmtzdGF0aW9uSWQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBkZXRlcm1pbmluZyB3aGV0aGVyIHRvIHBhcnNlIHVuaXF1ZSBpZGVudGlmaWVyIHR5cGUgd2l0aCBsb3dlcmNhc2UgY2FzZSBjaGFyYWN0ZXJzLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYCkuXG4gICAqL1xuICBsb3dlckNhc2VHdWlkcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgQ0xFQU5VUF9UWVBFID0ge1xuICBOT1JNQUw6IDAsXG4gIFJFRElSRUNUOiAxLFxuICBSRVRSWTogMlxufTtcblxuaW50ZXJmYWNlIFJvdXRpbmdEYXRhIHtcbiAgc2VydmVyOiBzdHJpbmc7XG4gIHBvcnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBIFtbQ29ubmVjdGlvbl1dIGluc3RhbmNlIHJlcHJlc2VudHMgYSBzaW5nbGUgY29ubmVjdGlvbiB0byBhIGRhdGFiYXNlIHNlcnZlci5cbiAqXG4gKiBgYGBqc1xuICogdmFyIENvbm5lY3Rpb24gPSByZXF1aXJlKCd0ZWRpb3VzJykuQ29ubmVjdGlvbjtcbiAqIHZhciBjb25maWcgPSB7XG4gKiAgXCJhdXRoZW50aWNhdGlvblwiOiB7XG4gKiAgICAuLi4sXG4gKiAgICBcIm9wdGlvbnNcIjogey4uLn1cbiAqICB9LFxuICogIFwib3B0aW9uc1wiOiB7Li4ufVxuICogfTtcbiAqIHZhciBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oY29uZmlnKTtcbiAqIGBgYFxuICpcbiAqIE9ubHkgb25lIHJlcXVlc3QgYXQgYSB0aW1lIG1heSBiZSBleGVjdXRlZCBvbiBhIGNvbm5lY3Rpb24uIE9uY2UgYSBbW1JlcXVlc3RdXVxuICogaGFzIGJlZW4gaW5pdGlhdGVkICh3aXRoIFtbQ29ubmVjdGlvbi5jYWxsUHJvY2VkdXJlXV0sIFtbQ29ubmVjdGlvbi5leGVjU3FsXV0sXG4gKiBvciBbW0Nvbm5lY3Rpb24uZXhlY1NxbEJhdGNoXV0pLCBhbm90aGVyIHNob3VsZCBub3QgYmUgaW5pdGlhdGVkIHVudGlsIHRoZVxuICogW1tSZXF1ZXN0XV0ncyBjb21wbGV0aW9uIGNhbGxiYWNrIGlzIGNhbGxlZC5cbiAqL1xuY2xhc3MgQ29ubmVjdGlvbiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZmVkQXV0aFJlcXVpcmVkOiBib29sZWFuO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbmZpZzogSW50ZXJuYWxDb25uZWN0aW9uQ29uZmlnO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNlY3VyZUNvbnRleHRPcHRpb25zOiBTZWN1cmVDb250ZXh0T3B0aW9ucztcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpblRyYW5zYWN0aW9uOiBib29sZWFuO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRyYW5zYWN0aW9uRGVzY3JpcHRvcnM6IEJ1ZmZlcltdO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRyYW5zYWN0aW9uRGVwdGg6IG51bWJlcjtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc1NxbEJhdGNoOiBib29sZWFuO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGN1clRyYW5zaWVudFJldHJ5Q291bnQ6IG51bWJlcjtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0cmFuc2llbnRFcnJvckxvb2t1cDogVHJhbnNpZW50RXJyb3JMb29rdXA7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2xvc2VkOiBib29sZWFuO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGxvZ2luRXJyb3I6IHVuZGVmaW5lZCB8IEFnZ3JlZ2F0ZUVycm9yIHwgQ29ubmVjdGlvbkVycm9yO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRlYnVnOiBEZWJ1ZztcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBudGxtcGFja2V0OiB1bmRlZmluZWQgfCBhbnk7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgbnRsbXBhY2tldEJ1ZmZlcjogdW5kZWZpbmVkIHwgQnVmZmVyO1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjbGFyZSBTVEFURToge1xuICAgIElOSVRJQUxJWkVEOiBTdGF0ZTtcbiAgICBDT05ORUNUSU5HOiBTdGF0ZTtcbiAgICBTRU5UX1BSRUxPR0lOOiBTdGF0ZTtcbiAgICBSRVJPVVRJTkc6IFN0YXRlO1xuICAgIFRSQU5TSUVOVF9GQUlMVVJFX1JFVFJZOiBTdGF0ZTtcbiAgICBTRU5UX1RMU1NTTE5FR09USUFUSU9OOiBTdGF0ZTtcbiAgICBTRU5UX0xPR0lON19XSVRIX1NUQU5EQVJEX0xPR0lOOiBTdGF0ZTtcbiAgICBTRU5UX0xPR0lON19XSVRIX05UTE06IFN0YXRlO1xuICAgIFNFTlRfTE9HSU43X1dJVEhfRkVEQVVUSDogU3RhdGU7XG4gICAgTE9HR0VEX0lOX1NFTkRJTkdfSU5JVElBTF9TUUw6IFN0YXRlO1xuICAgIExPR0dFRF9JTjogU3RhdGU7XG4gICAgU0VOVF9DTElFTlRfUkVRVUVTVDogU3RhdGU7XG4gICAgU0VOVF9BVFRFTlRJT046IFN0YXRlO1xuICAgIEZJTkFMOiBTdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcm91dGluZ0RhdGE6IHVuZGVmaW5lZCB8IFJvdXRpbmdEYXRhO1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgbWVzc2FnZUlvITogTWVzc2FnZUlPO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHN0YXRlOiBTdGF0ZTtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZXNldENvbm5lY3Rpb25Pbk5leHRSZXF1ZXN0OiB1bmRlZmluZWQgfCBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmVxdWVzdDogdW5kZWZpbmVkIHwgUmVxdWVzdCB8IEJ1bGtMb2FkO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByb2NSZXR1cm5TdGF0dXNWYWx1ZTogdW5kZWZpbmVkIHwgYW55O1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNvY2tldDogdW5kZWZpbmVkIHwgU29ja2V0O1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIG1lc3NhZ2VCdWZmZXI6IEJ1ZmZlcjtcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbm5lY3RUaW1lcjogdW5kZWZpbmVkIHwgTm9kZUpTLlRpbWVvdXQ7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2FuY2VsVGltZXI6IHVuZGVmaW5lZCB8IE5vZGVKUy5UaW1lb3V0O1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlcXVlc3RUaW1lcjogdW5kZWZpbmVkIHwgTm9kZUpTLlRpbWVvdXQ7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmV0cnlUaW1lcjogdW5kZWZpbmVkIHwgTm9kZUpTLlRpbWVvdXQ7XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY2FuY2VsQWZ0ZXJSZXF1ZXN0U2VudDogKCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRhdGFiYXNlQ29sbGF0aW9uOiBDb2xsYXRpb24gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIE5vdGU6IGJlIGF3YXJlIG9mIHRoZSBkaWZmZXJlbnQgb3B0aW9ucyBmaWVsZDpcbiAgICogMS4gY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnNcbiAgICogMi4gY29uZmlnLm9wdGlvbnNcbiAgICpcbiAgICogYGBganNcbiAgICogY29uc3QgeyBDb25uZWN0aW9uIH0gPSByZXF1aXJlKCd0ZWRpb3VzJyk7XG4gICAqXG4gICAqIGNvbnN0IGNvbmZpZyA9IHtcbiAgICogIFwiYXV0aGVudGljYXRpb25cIjoge1xuICAgKiAgICAuLi4sXG4gICAqICAgIFwib3B0aW9uc1wiOiB7Li4ufVxuICAgKiAgfSxcbiAgICogIFwib3B0aW9uc1wiOiB7Li4ufVxuICAgKiB9O1xuICAgKlxuICAgKiBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oY29uZmlnKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWdcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQ29ubmVjdGlvbkNvbmZpZ3VyYXRpb24pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdvYmplY3QnIHx8IGNvbmZpZyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnXCIgYXJndW1lbnQgaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgb2YgdHlwZSBPYmplY3QuJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb25maWcuc2VydmVyICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLnNlcnZlclwiIHByb3BlcnR5IGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgIH1cblxuICAgIHRoaXMuZmVkQXV0aFJlcXVpcmVkID0gZmFsc2U7XG5cbiAgICBsZXQgYXV0aGVudGljYXRpb246IEludGVybmFsQ29ubmVjdGlvbkNvbmZpZ1snYXV0aGVudGljYXRpb24nXTtcbiAgICBpZiAoY29uZmlnLmF1dGhlbnRpY2F0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgY29uZmlnLmF1dGhlbnRpY2F0aW9uICE9PSAnb2JqZWN0JyB8fCBjb25maWcuYXV0aGVudGljYXRpb24gPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIE9iamVjdC4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHlwZSA9IGNvbmZpZy5hdXRoZW50aWNhdGlvbi50eXBlO1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IGNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zID09PSB1bmRlZmluZWQgPyB7fSA6IGNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zO1xuXG4gICAgICBpZiAodHlwZW9mIHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi50eXBlXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGUgIT09ICdkZWZhdWx0JyAmJiB0eXBlICE9PSAnbnRsbScgJiYgdHlwZSAhPT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktcGFzc3dvcmQnICYmIHR5cGUgIT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWFjY2Vzcy10b2tlbicgJiYgdHlwZSAhPT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLXZtJyAmJiB0eXBlICE9PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktYXBwLXNlcnZpY2UnICYmIHR5cGUgIT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXNlcnZpY2UtcHJpbmNpcGFsLXNlY3JldCcgJiYgdHlwZSAhPT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktZGVmYXVsdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwidHlwZVwiIHByb3BlcnR5IG11c3Qgb25lIG9mIFwiZGVmYXVsdFwiLCBcIm50bG1cIiwgXCJhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXBhc3N3b3JkXCIsIFwiYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1hY2Nlc3MtdG9rZW5cIiwgXCJhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWRlZmF1bHRcIiwgXCJhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS12bVwiIG9yIFwiYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktYXBwLXNlcnZpY2VcIiBvciBcImF6dXJlLWFjdGl2ZS1kaXJlY3Rvcnktc2VydmljZS1wcmluY2lwYWwtc2VjcmV0XCIuJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcgfHwgb3B0aW9ucyA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9uc1wiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBvYmplY3QuJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlID09PSAnbnRsbScpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmRvbWFpbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy5kb21haW5cIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMudXNlck5hbWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucy51c2VyTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy51c2VyTmFtZVwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5wYXNzd29yZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLnBhc3N3b3JkICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLnBhc3N3b3JkXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF1dGhlbnRpY2F0aW9uID0ge1xuICAgICAgICAgIHR5cGU6ICdudGxtJyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICB1c2VyTmFtZTogb3B0aW9ucy51c2VyTmFtZSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBvcHRpb25zLnBhc3N3b3JkLFxuICAgICAgICAgICAgZG9tYWluOiBvcHRpb25zLmRvbWFpbiAmJiBvcHRpb25zLmRvbWFpbi50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1wYXNzd29yZCcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmNsaWVudElkICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudElkXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnVzZXJOYW1lICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMudXNlck5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMudXNlck5hbWVcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucGFzc3dvcmQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucy5wYXNzd29yZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy5wYXNzd29yZFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy50ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLnRlbmFudElkICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLnRlbmFudElkXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF1dGhlbnRpY2F0aW9uID0ge1xuICAgICAgICAgIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXBhc3N3b3JkJyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICB1c2VyTmFtZTogb3B0aW9ucy51c2VyTmFtZSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBvcHRpb25zLnBhc3N3b3JkLFxuICAgICAgICAgICAgdGVuYW50SWQ6IG9wdGlvbnMudGVuYW50SWQsXG4gICAgICAgICAgICBjbGllbnRJZDogb3B0aW9ucy5jbGllbnRJZFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktYWNjZXNzLXRva2VuJykge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMudG9rZW4gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMudG9rZW5cIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXV0aGVudGljYXRpb24gPSB7XG4gICAgICAgICAgdHlwZTogJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktYWNjZXNzLXRva2VuJyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICB0b2tlbjogb3B0aW9ucy50b2tlblxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLXZtJykge1xuICAgICAgICBpZiAob3B0aW9ucy5jbGllbnRJZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLmNsaWVudElkICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudElkXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF1dGhlbnRpY2F0aW9uID0ge1xuICAgICAgICAgIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS12bScsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgY2xpZW50SWQ6IG9wdGlvbnMuY2xpZW50SWRcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWRlZmF1bHQnKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmNsaWVudElkICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMuY2xpZW50SWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMuY2xpZW50SWRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG4gICAgICAgIGF1dGhlbnRpY2F0aW9uID0ge1xuICAgICAgICAgIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWRlZmF1bHQnLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGNsaWVudElkOiBvcHRpb25zLmNsaWVudElkXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktYXBwLXNlcnZpY2UnKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmNsaWVudElkICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMuY2xpZW50SWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMuY2xpZW50SWRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXV0aGVudGljYXRpb24gPSB7XG4gICAgICAgICAgdHlwZTogJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLWFwcC1zZXJ2aWNlJyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBjbGllbnRJZDogb3B0aW9ucy5jbGllbnRJZFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3Rvcnktc2VydmljZS1wcmluY2lwYWwtc2VjcmV0Jykge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuY2xpZW50SWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMuY2xpZW50SWRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmNsaWVudFNlY3JldCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy5jbGllbnRTZWNyZXRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnRlbmFudElkICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLnRlbmFudElkXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF1dGhlbnRpY2F0aW9uID0ge1xuICAgICAgICAgIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXNlcnZpY2UtcHJpbmNpcGFsLXNlY3JldCcsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgY2xpZW50SWQ6IG9wdGlvbnMuY2xpZW50SWQsXG4gICAgICAgICAgICBjbGllbnRTZWNyZXQ6IG9wdGlvbnMuY2xpZW50U2VjcmV0LFxuICAgICAgICAgICAgdGVuYW50SWQ6IG9wdGlvbnMudGVuYW50SWRcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3B0aW9ucy51c2VyTmFtZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLnVzZXJOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLnVzZXJOYW1lXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnBhc3N3b3JkICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMucGFzc3dvcmQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMucGFzc3dvcmRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXV0aGVudGljYXRpb24gPSB7XG4gICAgICAgICAgdHlwZTogJ2RlZmF1bHQnLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHVzZXJOYW1lOiBvcHRpb25zLnVzZXJOYW1lLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IG9wdGlvbnMucGFzc3dvcmRcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGF1dGhlbnRpY2F0aW9uID0ge1xuICAgICAgICB0eXBlOiAnZGVmYXVsdCcsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICB1c2VyTmFtZTogdW5kZWZpbmVkLFxuICAgICAgICAgIHBhc3N3b3JkOiB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIHNlcnZlcjogY29uZmlnLnNlcnZlcixcbiAgICAgIGF1dGhlbnRpY2F0aW9uOiBhdXRoZW50aWNhdGlvbixcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgYWJvcnRUcmFuc2FjdGlvbk9uRXJyb3I6IGZhbHNlLFxuICAgICAgICBhcHBOYW1lOiB1bmRlZmluZWQsXG4gICAgICAgIGNhbWVsQ2FzZUNvbHVtbnM6IGZhbHNlLFxuICAgICAgICBjYW5jZWxUaW1lb3V0OiBERUZBVUxUX0NBTkNFTF9USU1FT1VULFxuICAgICAgICBjb2x1bW5FbmNyeXB0aW9uS2V5Q2FjaGVUVEw6IDIgKiA2MCAqIDYwICogMTAwMCwgIC8vIFVuaXRzOiBtaWxpc2Vjb25kc1xuICAgICAgICBjb2x1bW5FbmNyeXB0aW9uU2V0dGluZzogZmFsc2UsXG4gICAgICAgIGNvbHVtbk5hbWVSZXBsYWNlcjogdW5kZWZpbmVkLFxuICAgICAgICBjb25uZWN0aW9uUmV0cnlJbnRlcnZhbDogREVGQVVMVF9DT05ORUNUX1JFVFJZX0lOVEVSVkFMLFxuICAgICAgICBjb25uZWN0VGltZW91dDogREVGQVVMVF9DT05ORUNUX1RJTUVPVVQsXG4gICAgICAgIGNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbDogSVNPTEFUSU9OX0xFVkVMLlJFQURfQ09NTUlUVEVELFxuICAgICAgICBjcnlwdG9DcmVkZW50aWFsc0RldGFpbHM6IHt9LFxuICAgICAgICBkYXRhYmFzZTogdW5kZWZpbmVkLFxuICAgICAgICBkYXRlZmlyc3Q6IERFRkFVTFRfREFURUZJUlNULFxuICAgICAgICBkYXRlRm9ybWF0OiBERUZBVUxUX0RBVEVGT1JNQVQsXG4gICAgICAgIGRlYnVnOiB7XG4gICAgICAgICAgZGF0YTogZmFsc2UsXG4gICAgICAgICAgcGFja2V0OiBmYWxzZSxcbiAgICAgICAgICBwYXlsb2FkOiBmYWxzZSxcbiAgICAgICAgICB0b2tlbjogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgZW5hYmxlQW5zaU51bGw6IHRydWUsXG4gICAgICAgIGVuYWJsZUFuc2lOdWxsRGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgZW5hYmxlQW5zaVBhZGRpbmc6IHRydWUsXG4gICAgICAgIGVuYWJsZUFuc2lXYXJuaW5nczogdHJ1ZSxcbiAgICAgICAgZW5hYmxlQXJpdGhBYm9ydDogdHJ1ZSxcbiAgICAgICAgZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGw6IHRydWUsXG4gICAgICAgIGVuYWJsZUN1cnNvckNsb3NlT25Db21taXQ6IG51bGwsXG4gICAgICAgIGVuYWJsZUltcGxpY2l0VHJhbnNhY3Rpb25zOiBmYWxzZSxcbiAgICAgICAgZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQ6IGZhbHNlLFxuICAgICAgICBlbmFibGVRdW90ZWRJZGVudGlmaWVyOiB0cnVlLFxuICAgICAgICBlbmNyeXB0OiB0cnVlLFxuICAgICAgICBmYWxsYmFja1RvRGVmYXVsdERiOiBmYWxzZSxcbiAgICAgICAgZW5jcnlwdGlvbktleVN0b3JlUHJvdmlkZXJzOiB1bmRlZmluZWQsXG4gICAgICAgIGluc3RhbmNlTmFtZTogdW5kZWZpbmVkLFxuICAgICAgICBpc29sYXRpb25MZXZlbDogSVNPTEFUSU9OX0xFVkVMLlJFQURfQ09NTUlUVEVELFxuICAgICAgICBsYW5ndWFnZTogREVGQVVMVF9MQU5HVUFHRSxcbiAgICAgICAgbG9jYWxBZGRyZXNzOiB1bmRlZmluZWQsXG4gICAgICAgIG1heFJldHJpZXNPblRyYW5zaWVudEVycm9yczogMyxcbiAgICAgICAgbXVsdGlTdWJuZXRGYWlsb3ZlcjogZmFsc2UsXG4gICAgICAgIHBhY2tldFNpemU6IERFRkFVTFRfUEFDS0VUX1NJWkUsXG4gICAgICAgIHBvcnQ6IERFRkFVTFRfUE9SVCxcbiAgICAgICAgcmVhZE9ubHlJbnRlbnQ6IGZhbHNlLFxuICAgICAgICByZXF1ZXN0VGltZW91dDogREVGQVVMVF9DTElFTlRfUkVRVUVTVF9USU1FT1VULFxuICAgICAgICByb3dDb2xsZWN0aW9uT25Eb25lOiBmYWxzZSxcbiAgICAgICAgcm93Q29sbGVjdGlvbk9uUmVxdWVzdENvbXBsZXRpb246IGZhbHNlLFxuICAgICAgICBzZXJ2ZXJOYW1lOiB1bmRlZmluZWQsXG4gICAgICAgIHNlcnZlclN1cHBvcnRzQ29sdW1uRW5jcnlwdGlvbjogZmFsc2UsXG4gICAgICAgIHRkc1ZlcnNpb246IERFRkFVTFRfVERTX1ZFUlNJT04sXG4gICAgICAgIHRleHRzaXplOiBERUZBVUxUX1RFWFRTSVpFLFxuICAgICAgICB0cnVzdGVkU2VydmVyTmFtZUFFOiB1bmRlZmluZWQsXG4gICAgICAgIHRydXN0U2VydmVyQ2VydGlmaWNhdGU6IGZhbHNlLFxuICAgICAgICB1c2VDb2x1bW5OYW1lczogZmFsc2UsXG4gICAgICAgIHVzZVVUQzogdHJ1ZSxcbiAgICAgICAgd29ya3N0YXRpb25JZDogdW5kZWZpbmVkLFxuICAgICAgICBsb3dlckNhc2VHdWlkczogZmFsc2VcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKGNvbmZpZy5vcHRpb25zKSB7XG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMucG9ydCAmJiBjb25maWcub3B0aW9ucy5pbnN0YW5jZU5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQb3J0IGFuZCBpbnN0YW5jZU5hbWUgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSwgYnV0ICcgKyBjb25maWcub3B0aW9ucy5wb3J0ICsgJyBhbmQgJyArIGNvbmZpZy5vcHRpb25zLmluc3RhbmNlTmFtZSArICcgcHJvdmlkZWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmFib3J0VHJhbnNhY3Rpb25PbkVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5hYm9ydFRyYW5zYWN0aW9uT25FcnJvciAhPT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5vcHRpb25zLmFib3J0VHJhbnNhY3Rpb25PbkVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuYWJvcnRUcmFuc2FjdGlvbk9uRXJyb3JcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmFib3J0VHJhbnNhY3Rpb25PbkVycm9yID0gY29uZmlnLm9wdGlvbnMuYWJvcnRUcmFuc2FjdGlvbk9uRXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5hcHBOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5hcHBOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmFwcE5hbWVcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5hcHBOYW1lID0gY29uZmlnLm9wdGlvbnMuYXBwTmFtZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmNhbWVsQ2FzZUNvbHVtbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmNhbWVsQ2FzZUNvbHVtbnMgIT09ICdib29sZWFuJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmNhbWVsQ2FzZUNvbHVtbnNcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuY2FtZWxDYXNlQ29sdW1ucyA9IGNvbmZpZy5vcHRpb25zLmNhbWVsQ2FzZUNvbHVtbnM7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5jYW5jZWxUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5jYW5jZWxUaW1lb3V0ICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmNhbmNlbFRpbWVvdXRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5jYW5jZWxUaW1lb3V0ID0gY29uZmlnLm9wdGlvbnMuY2FuY2VsVGltZW91dDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmNvbHVtbk5hbWVSZXBsYWNlcikge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmNvbHVtbk5hbWVSZXBsYWNlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmNhbmNlbFRpbWVvdXRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgZnVuY3Rpb24uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmNvbHVtbk5hbWVSZXBsYWNlciA9IGNvbmZpZy5vcHRpb25zLmNvbHVtbk5hbWVSZXBsYWNlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5jb25uZWN0VGltZW91dCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5jb25uZWN0VGltZW91dFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0ID0gY29uZmlnLm9wdGlvbnMuY29ubmVjdFRpbWVvdXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5jb25uZWN0aW9uSXNvbGF0aW9uTGV2ZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhc3NlcnRWYWxpZElzb2xhdGlvbkxldmVsKGNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbCwgJ2NvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbCcpO1xuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvbklzb2xhdGlvbkxldmVsID0gY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvbklzb2xhdGlvbkxldmVsO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuY29ubmVjdFRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0ICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuY29ubmVjdFRpbWVvdXQgPSBjb25maWcub3B0aW9ucy5jb25uZWN0VGltZW91dDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmNyeXB0b0NyZWRlbnRpYWxzRGV0YWlscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuY3J5cHRvQ3JlZGVudGlhbHNEZXRhaWxzICE9PSAnb2JqZWN0JyB8fCBjb25maWcub3B0aW9ucy5jcnlwdG9DcmVkZW50aWFsc0RldGFpbHMgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5jcnlwdG9DcmVkZW50aWFsc0RldGFpbHNcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgT2JqZWN0LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5jcnlwdG9DcmVkZW50aWFsc0RldGFpbHMgPSBjb25maWcub3B0aW9ucy5jcnlwdG9DcmVkZW50aWFsc0RldGFpbHM7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5kYXRhYmFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZGF0YWJhc2UgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZGF0YWJhc2VcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5kYXRhYmFzZSA9IGNvbmZpZy5vcHRpb25zLmRhdGFiYXNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZGF0ZWZpcnN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5kYXRlZmlyc3QgIT09ICdudW1iZXInICYmIGNvbmZpZy5vcHRpb25zLmRhdGVmaXJzdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmRhdGVmaXJzdFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZGF0ZWZpcnN0ICE9PSBudWxsICYmIChjb25maWcub3B0aW9ucy5kYXRlZmlyc3QgPCAxIHx8IGNvbmZpZy5vcHRpb25zLmRhdGVmaXJzdCA+IDcpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmRhdGVmaXJzdFwiIHByb3BlcnR5IG11c3QgYmUgPj0gMSBhbmQgPD0gNycpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5kYXRlZmlyc3QgPSBjb25maWcub3B0aW9ucy5kYXRlZmlyc3Q7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5kYXRlRm9ybWF0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5kYXRlRm9ybWF0ICE9PSAnc3RyaW5nJyAmJiBjb25maWcub3B0aW9ucy5kYXRlRm9ybWF0ICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZGF0ZUZvcm1hdFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcgb3IgbnVsbC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZGF0ZUZvcm1hdCA9IGNvbmZpZy5vcHRpb25zLmRhdGVGb3JtYXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5kZWJ1Zykge1xuICAgICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZGVidWcuZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5kZWJ1Zy5kYXRhICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmRlYnVnLmRhdGFcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmRlYnVnLmRhdGEgPSBjb25maWcub3B0aW9ucy5kZWJ1Zy5kYXRhO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmRlYnVnLnBhY2tldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5kZWJ1Zy5wYWNrZXQgIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZGVidWcucGFja2V0XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5kZWJ1Zy5wYWNrZXQgPSBjb25maWcub3B0aW9ucy5kZWJ1Zy5wYWNrZXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZGVidWcucGF5bG9hZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5kZWJ1Zy5wYXlsb2FkICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmRlYnVnLnBheWxvYWRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmRlYnVnLnBheWxvYWQgPSBjb25maWcub3B0aW9ucy5kZWJ1Zy5wYXlsb2FkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmRlYnVnLnRva2VuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmRlYnVnLnRva2VuICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmRlYnVnLnRva2VuXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5kZWJ1Zy50b2tlbiA9IGNvbmZpZy5vcHRpb25zLmRlYnVnLnRva2VuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGwgIT09ICdib29sZWFuJyAmJiBjb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbCAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lOdWxsXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4gb3IgbnVsbC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGwgPSBjb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lOdWxsRGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGxEZWZhdWx0ICE9PSAnYm9vbGVhbicgJiYgY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGxEZWZhdWx0ICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGxEZWZhdWx0XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4gb3IgbnVsbC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGxEZWZhdWx0ID0gY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGxEZWZhdWx0O1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaVBhZGRpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lQYWRkaW5nICE9PSAnYm9vbGVhbicgJiYgY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaVBhZGRpbmcgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5lbmFibGVBbnNpUGFkZGluZ1wiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lQYWRkaW5nID0gY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaVBhZGRpbmc7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5lbmFibGVBbnNpV2FybmluZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lXYXJuaW5ncyAhPT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lXYXJuaW5ncyAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lXYXJuaW5nc1wiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lXYXJuaW5ncyA9IGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lXYXJuaW5ncztcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmVuYWJsZUFyaXRoQWJvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmVuYWJsZUFyaXRoQWJvcnQgIT09ICdib29sZWFuJyAmJiBjb25maWcub3B0aW9ucy5lbmFibGVBcml0aEFib3J0ICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZW5hYmxlQXJpdGhBYm9ydFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFyaXRoQWJvcnQgPSBjb25maWcub3B0aW9ucy5lbmFibGVBcml0aEFib3J0O1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmVuYWJsZUNvbmNhdE51bGxZaWVsZHNOdWxsICE9PSAnYm9vbGVhbicgJiYgY29uZmlnLm9wdGlvbnMuZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGwgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5lbmFibGVDb25jYXROdWxsWWllbGRzTnVsbFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUNvbmNhdE51bGxZaWVsZHNOdWxsID0gY29uZmlnLm9wdGlvbnMuZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5lbmFibGVDdXJzb3JDbG9zZU9uQ29tbWl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5lbmFibGVDdXJzb3JDbG9zZU9uQ29tbWl0ICE9PSAnYm9vbGVhbicgJiYgY29uZmlnLm9wdGlvbnMuZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmVuYWJsZUN1cnNvckNsb3NlT25Db21taXRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbiBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVDdXJzb3JDbG9zZU9uQ29tbWl0ID0gY29uZmlnLm9wdGlvbnMuZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmVuYWJsZUltcGxpY2l0VHJhbnNhY3Rpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5lbmFibGVJbXBsaWNpdFRyYW5zYWN0aW9ucyAhPT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5vcHRpb25zLmVuYWJsZUltcGxpY2l0VHJhbnNhY3Rpb25zICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZW5hYmxlSW1wbGljaXRUcmFuc2FjdGlvbnNcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbiBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVJbXBsaWNpdFRyYW5zYWN0aW9ucyA9IGNvbmZpZy5vcHRpb25zLmVuYWJsZUltcGxpY2l0VHJhbnNhY3Rpb25zO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmVuYWJsZU51bWVyaWNSb3VuZGFib3J0ICE9PSAnYm9vbGVhbicgJiYgY29uZmlnLm9wdGlvbnMuZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5lbmFibGVOdW1lcmljUm91bmRhYm9ydFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZU51bWVyaWNSb3VuZGFib3J0ID0gY29uZmlnLm9wdGlvbnMuZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5lbmFibGVRdW90ZWRJZGVudGlmaWVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5lbmFibGVRdW90ZWRJZGVudGlmaWVyICE9PSAnYm9vbGVhbicgJiYgY29uZmlnLm9wdGlvbnMuZW5hYmxlUXVvdGVkSWRlbnRpZmllciAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmVuYWJsZVF1b3RlZElkZW50aWZpZXJcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbiBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVRdW90ZWRJZGVudGlmaWVyID0gY29uZmlnLm9wdGlvbnMuZW5hYmxlUXVvdGVkSWRlbnRpZmllcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmVuY3J5cHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmVuY3J5cHQgIT09ICdib29sZWFuJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmVuY3J5cHRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZW5jcnlwdCA9IGNvbmZpZy5vcHRpb25zLmVuY3J5cHQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5mYWxsYmFja1RvRGVmYXVsdERiICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5mYWxsYmFja1RvRGVmYXVsdERiICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5mYWxsYmFja1RvRGVmYXVsdERiXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmZhbGxiYWNrVG9EZWZhdWx0RGIgPSBjb25maWcub3B0aW9ucy5mYWxsYmFja1RvRGVmYXVsdERiO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuaW5zdGFuY2VOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5pbnN0YW5jZU5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuaW5zdGFuY2VOYW1lXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuaW5zdGFuY2VOYW1lID0gY29uZmlnLm9wdGlvbnMuaW5zdGFuY2VOYW1lO1xuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLnBvcnQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5pc29sYXRpb25MZXZlbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFzc2VydFZhbGlkSXNvbGF0aW9uTGV2ZWwoY29uZmlnLm9wdGlvbnMuaXNvbGF0aW9uTGV2ZWwsICdjb25maWcub3B0aW9ucy5pc29sYXRpb25MZXZlbCcpO1xuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuaXNvbGF0aW9uTGV2ZWwgPSBjb25maWcub3B0aW9ucy5pc29sYXRpb25MZXZlbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmxhbmd1YWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5sYW5ndWFnZSAhPT0gJ3N0cmluZycgJiYgY29uZmlnLm9wdGlvbnMubGFuZ3VhZ2UgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5sYW5ndWFnZVwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcgb3IgbnVsbC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMubGFuZ3VhZ2UgPSBjb25maWcub3B0aW9ucy5sYW5ndWFnZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmxvY2FsQWRkcmVzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMubG9jYWxBZGRyZXNzICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmxvY2FsQWRkcmVzc1wiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmxvY2FsQWRkcmVzcyA9IGNvbmZpZy5vcHRpb25zLmxvY2FsQWRkcmVzcztcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLm11bHRpU3VibmV0RmFpbG92ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLm11bHRpU3VibmV0RmFpbG92ZXIgIT09ICdib29sZWFuJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLm11bHRpU3VibmV0RmFpbG92ZXJcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMubXVsdGlTdWJuZXRGYWlsb3ZlciA9IGNvbmZpZy5vcHRpb25zLm11bHRpU3VibmV0RmFpbG92ZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5wYWNrZXRTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5wYWNrZXRTaXplICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnBhY2tldFNpemVcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5wYWNrZXRTaXplID0gY29uZmlnLm9wdGlvbnMucGFja2V0U2l6ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLnBvcnQgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMucG9ydFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLm9wdGlvbnMucG9ydCA8PSAwIHx8IGNvbmZpZy5vcHRpb25zLnBvcnQgPj0gNjU1MzYpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMucG9ydFwiIHByb3BlcnR5IG11c3QgYmUgPiAwIGFuZCA8IDY1NTM2Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLnBvcnQgPSBjb25maWcub3B0aW9ucy5wb3J0O1xuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmluc3RhbmNlTmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnJlYWRPbmx5SW50ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5yZWFkT25seUludGVudCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMucmVhZE9ubHlJbnRlbnRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMucmVhZE9ubHlJbnRlbnQgPSBjb25maWcub3B0aW9ucy5yZWFkT25seUludGVudDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnJlcXVlc3RUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5yZXF1ZXN0VGltZW91dCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5yZXF1ZXN0VGltZW91dFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLnJlcXVlc3RUaW1lb3V0ID0gY29uZmlnLm9wdGlvbnMucmVxdWVzdFRpbWVvdXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5tYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLm1heFJldHJpZXNPblRyYW5zaWVudEVycm9ycyAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5tYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnNcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLm1heFJldHJpZXNPblRyYW5zaWVudEVycm9ycyA8IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5tYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnNcIiBwcm9wZXJ0eSBtdXN0IGJlIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiAwLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5tYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnMgPSBjb25maWcub3B0aW9ucy5tYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnM7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5jb25uZWN0aW9uUmV0cnlJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvblJldHJ5SW50ZXJ2YWwgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvblJldHJ5SW50ZXJ2YWxcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25SZXRyeUludGVydmFsIDw9IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5jb25uZWN0aW9uUmV0cnlJbnRlcnZhbFwiIHByb3BlcnR5IG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25SZXRyeUludGVydmFsID0gY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvblJldHJ5SW50ZXJ2YWw7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25Eb25lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25Eb25lICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25Eb25lXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PbkRvbmUgPSBjb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25Eb25lO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uUmVxdWVzdENvbXBsZXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PblJlcXVlc3RDb21wbGV0aW9uICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25SZXF1ZXN0Q29tcGxldGlvblwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25SZXF1ZXN0Q29tcGxldGlvbiA9IGNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PblJlcXVlc3RDb21wbGV0aW9uO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy50ZHNWZXJzaW9uXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiA9IGNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb247XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy50ZXh0c2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMudGV4dHNpemUgIT09ICdudW1iZXInICYmIGNvbmZpZy5vcHRpb25zLnRleHRzaXplICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMudGV4dHNpemVcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLm9wdGlvbnMudGV4dHNpemUgPiAyMTQ3NDgzNjQ3KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMudGV4dHNpemVcIiBjYW5cXCd0IGJlIGdyZWF0ZXIgdGhhbiAyMTQ3NDgzNjQ3LicpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5vcHRpb25zLnRleHRzaXplIDwgLTEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy50ZXh0c2l6ZVwiIGNhblxcJ3QgYmUgc21hbGxlciB0aGFuIC0xLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy50ZXh0c2l6ZSA9IGNvbmZpZy5vcHRpb25zLnRleHRzaXplIHwgMDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnRydXN0U2VydmVyQ2VydGlmaWNhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLnRydXN0U2VydmVyQ2VydGlmaWNhdGUgIT09ICdib29sZWFuJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnRydXN0U2VydmVyQ2VydGlmaWNhdGVcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMudHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZSA9IGNvbmZpZy5vcHRpb25zLnRydXN0U2VydmVyQ2VydGlmaWNhdGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy51c2VDb2x1bW5OYW1lcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMudXNlQ29sdW1uTmFtZXMgIT09ICdib29sZWFuJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnVzZUNvbHVtbk5hbWVzXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLnVzZUNvbHVtbk5hbWVzID0gY29uZmlnLm9wdGlvbnMudXNlQ29sdW1uTmFtZXM7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy51c2VVVEMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLnVzZVVUQyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMudXNlVVRDXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLnVzZVVUQyA9IGNvbmZpZy5vcHRpb25zLnVzZVVUQztcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLndvcmtzdGF0aW9uSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLndvcmtzdGF0aW9uSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMud29ya3N0YXRpb25JZFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLndvcmtzdGF0aW9uSWQgPSBjb25maWcub3B0aW9ucy53b3Jrc3RhdGlvbklkO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMubG93ZXJDYXNlR3VpZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmxvd2VyQ2FzZUd1aWRzICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5sb3dlckNhc2VHdWlkc1wiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5sb3dlckNhc2VHdWlkcyA9IGNvbmZpZy5vcHRpb25zLmxvd2VyQ2FzZUd1aWRzO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2VjdXJlQ29udGV4dE9wdGlvbnMgPSB0aGlzLmNvbmZpZy5vcHRpb25zLmNyeXB0b0NyZWRlbnRpYWxzRGV0YWlscztcbiAgICBpZiAodGhpcy5zZWN1cmVDb250ZXh0T3B0aW9ucy5zZWN1cmVPcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIElmIHRoZSBjYWxsZXIgaGFzIG5vdCBzcGVjaWZpZWQgdGhlaXIgb3duIGBzZWN1cmVPcHRpb25zYCxcbiAgICAgIC8vIHdlIHNldCBgU1NMX09QX0RPTlRfSU5TRVJUX0VNUFRZX0ZSQUdNRU5UU2AgaGVyZS5cbiAgICAgIC8vIE9sZGVyIFNRTCBTZXJ2ZXIgaW5zdGFuY2VzIHJ1bm5pbmcgb24gb2xkZXIgV2luZG93cyB2ZXJzaW9ucyBoYXZlXG4gICAgICAvLyB0cm91YmxlIHdpdGggdGhlIEJFQVNUIHdvcmthcm91bmQgaW4gT3BlblNTTC5cbiAgICAgIC8vIEFzIEJFQVNUIGlzIGEgYnJvd3NlciBzcGVjaWZpYyBleHBsb2l0LCB3ZSBjYW4ganVzdCBkaXNhYmxlIHRoaXMgb3B0aW9uIGhlcmUuXG4gICAgICB0aGlzLnNlY3VyZUNvbnRleHRPcHRpb25zID0gT2JqZWN0LmNyZWF0ZSh0aGlzLnNlY3VyZUNvbnRleHRPcHRpb25zLCB7XG4gICAgICAgIHNlY3VyZU9wdGlvbnM6IHtcbiAgICAgICAgICB2YWx1ZTogY29uc3RhbnRzLlNTTF9PUF9ET05UX0lOU0VSVF9FTVBUWV9GUkFHTUVOVFNcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5kZWJ1ZyA9IHRoaXMuY3JlYXRlRGVidWcoKTtcbiAgICB0aGlzLmluVHJhbnNhY3Rpb24gPSBmYWxzZTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRGVzY3JpcHRvcnMgPSBbQnVmZmVyLmZyb20oWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdKV07XG5cbiAgICAvLyAnYmVnaW5UcmFuc2FjdGlvbicsICdjb21taXRUcmFuc2FjdGlvbicgYW5kICdyb2xsYmFja1RyYW5zYWN0aW9uJ1xuICAgIC8vIGV2ZW50cyBhcmUgdXRpbGl6ZWQgdG8gbWFpbnRhaW4gaW5UcmFuc2FjdGlvbiBwcm9wZXJ0eSBzdGF0ZSB3aGljaCBpblxuICAgIC8vIHR1cm4gaXMgdXNlZCBpbiBtYW5hZ2luZyB0cmFuc2FjdGlvbnMuIFRoZXNlIGV2ZW50cyBhcmUgb25seSBmaXJlZCBmb3JcbiAgICAvLyBURFMgdmVyc2lvbiA3LjIgYW5kIGJleW9uZC4gVGhlIHByb3BlcnRpZXMgYmVsb3cgYXJlIHVzZWQgdG8gZW11bGF0ZVxuICAgIC8vIGVxdWl2YWxlbnQgYmVoYXZpb3IgZm9yIFREUyB2ZXJzaW9ucyBiZWZvcmUgNy4yLlxuICAgIHRoaXMudHJhbnNhY3Rpb25EZXB0aCA9IDA7XG4gICAgdGhpcy5pc1NxbEJhdGNoID0gZmFsc2U7XG4gICAgdGhpcy5jbG9zZWQgPSBmYWxzZTtcbiAgICB0aGlzLm1lc3NhZ2VCdWZmZXIgPSBCdWZmZXIuYWxsb2MoMCk7XG5cbiAgICB0aGlzLmN1clRyYW5zaWVudFJldHJ5Q291bnQgPSAwO1xuICAgIHRoaXMudHJhbnNpZW50RXJyb3JMb29rdXAgPSBuZXcgVHJhbnNpZW50RXJyb3JMb29rdXAoKTtcblxuICAgIHRoaXMuc3RhdGUgPSB0aGlzLlNUQVRFLklOSVRJQUxJWkVEO1xuXG4gICAgdGhpcy5fY2FuY2VsQWZ0ZXJSZXF1ZXN0U2VudCA9ICgpID0+IHtcbiAgICAgIHRoaXMubWVzc2FnZUlvLnNlbmRNZXNzYWdlKFRZUEUuQVRURU5USU9OKTtcbiAgICAgIHRoaXMuY3JlYXRlQ2FuY2VsVGltZXIoKTtcbiAgICB9O1xuICB9XG5cbiAgY29ubmVjdChjb25uZWN0TGlzdGVuZXI/OiAoZXJyPzogRXJyb3IpID0+IHZvaWQpIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gdGhpcy5TVEFURS5JTklUSUFMSVpFRCkge1xuICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25FcnJvcignYC5jb25uZWN0YCBjYW4gbm90IGJlIGNhbGxlZCBvbiBhIENvbm5lY3Rpb24gaW4gYCcgKyB0aGlzLnN0YXRlLm5hbWUgKyAnYCBzdGF0ZS4nKTtcbiAgICB9XG5cbiAgICBpZiAoY29ubmVjdExpc3RlbmVyKSB7XG4gICAgICBjb25zdCBvbkNvbm5lY3QgPSAoZXJyPzogRXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgY29ubmVjdExpc3RlbmVyKGVycik7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvbkVycm9yID0gKGVycjogRXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcignY29ubmVjdCcsIG9uQ29ubmVjdCk7XG4gICAgICAgIGNvbm5lY3RMaXN0ZW5lcihlcnIpO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5vbmNlKCdjb25uZWN0Jywgb25Db25uZWN0KTtcbiAgICAgIHRoaXMub25jZSgnZXJyb3InLCBvbkVycm9yKTtcbiAgICB9XG5cbiAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkNPTk5FQ1RJTkcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2ZXIgaGFzIHJlcG9ydGVkIHRoYXQgdGhlIGNoYXJzZXQgaGFzIGNoYW5nZWQuXG4gICAqL1xuICBvbihldmVudDogJ2NoYXJzZXRDaGFuZ2UnLCBsaXN0ZW5lcjogKGNoYXJzZXQ6IHN0cmluZykgPT4gdm9pZCk6IHRoaXNcblxuICAvKipcbiAgICogVGhlIGF0dGVtcHQgdG8gY29ubmVjdCBhbmQgdmFsaWRhdGUgaGFzIGNvbXBsZXRlZC5cbiAgICovXG4gIG9uKFxuICAgIGV2ZW50OiAnY29ubmVjdCcsXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGVyciBJZiBzdWNjZXNzZnVsbHkgY29ubmVjdGVkLCB3aWxsIGJlIGZhbHNleS4gSWYgdGhlcmUgd2FzIGFcbiAgICAgKiAgIHByb2JsZW0gKHdpdGggZWl0aGVyIGNvbm5lY3Rpbmcgb3IgdmFsaWRhdGlvbiksIHdpbGwgYmUgYW4gW1tFcnJvcl1dIG9iamVjdC5cbiAgICAgKi9cbiAgICBsaXN0ZW5lcjogKGVycjogRXJyb3IgfCB1bmRlZmluZWQpID0+IHZvaWRcbiAgKTogdGhpc1xuXG4gIC8qKlxuICAgKiBUaGUgc2VydmVyIGhhcyByZXBvcnRlZCB0aGF0IHRoZSBhY3RpdmUgZGF0YWJhc2UgaGFzIGNoYW5nZWQuXG4gICAqIFRoaXMgbWF5IGJlIGFzIGEgcmVzdWx0IG9mIGEgc3VjY2Vzc2Z1bCBsb2dpbiwgb3IgYSBgdXNlYCBzdGF0ZW1lbnQuXG4gICAqL1xuICBvbihldmVudDogJ2RhdGFiYXNlQ2hhbmdlJywgbGlzdGVuZXI6IChkYXRhYmFzZU5hbWU6IHN0cmluZykgPT4gdm9pZCk6IHRoaXNcblxuICAvKipcbiAgICogQSBkZWJ1ZyBtZXNzYWdlIGlzIGF2YWlsYWJsZS4gSXQgbWF5IGJlIGxvZ2dlZCBvciBpZ25vcmVkLlxuICAgKi9cbiAgb24oZXZlbnQ6ICdkZWJ1ZycsIGxpc3RlbmVyOiAobWVzc2FnZVRleHQ6IHN0cmluZykgPT4gdm9pZCk6IHRoaXNcblxuICAvKipcbiAgICogSW50ZXJuYWwgZXJyb3Igb2NjdXJzLlxuICAgKi9cbiAgb24oZXZlbnQ6ICdlcnJvcicsIGxpc3RlbmVyOiAoZXJyOiBFcnJvcikgPT4gdm9pZCk6IHRoaXNcblxuICAvKipcbiAgICogVGhlIHNlcnZlciBoYXMgaXNzdWVkIGFuIGVycm9yIG1lc3NhZ2UuXG4gICAqL1xuICBvbihldmVudDogJ2Vycm9yTWVzc2FnZScsIGxpc3RlbmVyOiAobWVzc2FnZTogaW1wb3J0KCcuL3Rva2VuL3Rva2VuJykuRXJyb3JNZXNzYWdlVG9rZW4pID0+IHZvaWQpOiB0aGlzXG5cbiAgLyoqXG4gICAqIFRoZSBjb25uZWN0aW9uIGhhcyBlbmRlZC5cbiAgICpcbiAgICogVGhpcyBtYXkgYmUgYXMgYSByZXN1bHQgb2YgdGhlIGNsaWVudCBjYWxsaW5nIFtbY2xvc2VdXSwgdGhlIHNlcnZlclxuICAgKiBjbG9zaW5nIHRoZSBjb25uZWN0aW9uLCBvciBhIG5ldHdvcmsgZXJyb3IuXG4gICAqL1xuICBvbihldmVudDogJ2VuZCcsIGxpc3RlbmVyOiAoKSA9PiB2b2lkKTogdGhpc1xuXG4gIC8qKlxuICAgKiBUaGUgc2VydmVyIGhhcyBpc3N1ZWQgYW4gaW5mb3JtYXRpb24gbWVzc2FnZS5cbiAgICovXG4gIG9uKGV2ZW50OiAnaW5mb01lc3NhZ2UnLCBsaXN0ZW5lcjogKG1lc3NhZ2U6IGltcG9ydCgnLi90b2tlbi90b2tlbicpLkluZm9NZXNzYWdlVG9rZW4pID0+IHZvaWQpOiB0aGlzXG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2ZXIgaGFzIHJlcG9ydGVkIHRoYXQgdGhlIGxhbmd1YWdlIGhhcyBjaGFuZ2VkLlxuICAgKi9cbiAgb24oZXZlbnQ6ICdsYW5ndWFnZUNoYW5nZScsIGxpc3RlbmVyOiAobGFuZ3VhZ2VOYW1lOiBzdHJpbmcpID0+IHZvaWQpOiB0aGlzXG5cbiAgLyoqXG4gICAqIFRoZSBjb25uZWN0aW9uIHdhcyByZXNldC5cbiAgICovXG4gIG9uKGV2ZW50OiAncmVzZXRDb25uZWN0aW9uJywgbGlzdGVuZXI6ICgpID0+IHZvaWQpOiB0aGlzXG5cbiAgLyoqXG4gICAqIEEgc2VjdXJlIGNvbm5lY3Rpb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQuXG4gICAqL1xuICBvbihldmVudDogJ3NlY3VyZScsIGxpc3RlbmVyOiAoY2xlYXJ0ZXh0OiBpbXBvcnQoJ3RscycpLlRMU1NvY2tldCkgPT4gdm9pZCk6IHRoaXNcblxuICBvbihldmVudDogc3RyaW5nIHwgc3ltYm9sLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSB7XG4gICAgcmV0dXJuIHN1cGVyLm9uKGV2ZW50LCBsaXN0ZW5lcik7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdjaGFyc2V0Q2hhbmdlJywgY2hhcnNldDogc3RyaW5nKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdjb25uZWN0JywgZXJyb3I/OiBFcnJvcik6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAnZGF0YWJhc2VDaGFuZ2UnLCBkYXRhYmFzZU5hbWU6IHN0cmluZyk6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAnZGVidWcnLCBtZXNzYWdlVGV4dDogc3RyaW5nKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdlcnJvcicsIGVycm9yOiBFcnJvcik6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAnZXJyb3JNZXNzYWdlJywgbWVzc2FnZTogaW1wb3J0KCcuL3Rva2VuL3Rva2VuJykuRXJyb3JNZXNzYWdlVG9rZW4pOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ2VuZCcpOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ2luZm9NZXNzYWdlJywgbWVzc2FnZTogaW1wb3J0KCcuL3Rva2VuL3Rva2VuJykuSW5mb01lc3NhZ2VUb2tlbik6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAnbGFuZ3VhZ2VDaGFuZ2UnLCBsYW5ndWFnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAnc2VjdXJlJywgY2xlYXJ0ZXh0OiBpbXBvcnQoJ3RscycpLlRMU1NvY2tldCk6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAncmVyb3V0aW5nJyk6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAncmVzZXRDb25uZWN0aW9uJyk6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAncmV0cnknKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdyb2xsYmFja1RyYW5zYWN0aW9uJyk6IGJvb2xlYW5cblxuICBlbWl0KGV2ZW50OiBzdHJpbmcgfCBzeW1ib2wsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgcmV0dXJuIHN1cGVyLmVtaXQoZXZlbnQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UuXG4gICAqXG4gICAqIFRoZSBbW0V2ZW50X2VuZF1dIHdpbGwgYmUgZW1pdHRlZCBvbmNlIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZC5cbiAgICovXG4gIGNsb3NlKCkge1xuICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpbml0aWFsaXNlQ29ubmVjdGlvbigpIHtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLmNyZWF0ZUNvbm5lY3RUaW1lcigpO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMucG9ydCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdE9uUG9ydCh0aGlzLmNvbmZpZy5vcHRpb25zLnBvcnQsIHRoaXMuY29uZmlnLm9wdGlvbnMubXVsdGlTdWJuZXRGYWlsb3Zlciwgc2lnbmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGluc3RhbmNlTG9va3VwKHtcbiAgICAgICAgc2VydmVyOiB0aGlzLmNvbmZpZy5zZXJ2ZXIsXG4gICAgICAgIGluc3RhbmNlTmFtZTogdGhpcy5jb25maWcub3B0aW9ucy5pbnN0YW5jZU5hbWUhLFxuICAgICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0LFxuICAgICAgICBzaWduYWw6IHNpZ25hbFxuICAgICAgfSkudGhlbigocG9ydCkgPT4ge1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbm5lY3RPblBvcnQocG9ydCwgdGhpcy5jb25maWcub3B0aW9ucy5tdWx0aVN1Ym5ldEZhaWxvdmVyLCBzaWduYWwpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgaWYgKGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgICAvLyBJZ25vcmUgdGhlIEFib3J0RXJyb3IgZm9yIG5vdywgdGhpcyBpcyBzdGlsbCBoYW5kbGVkIGJ5IHRoZSBjb25uZWN0VGltZXIgZmlyaW5nXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgdGhpcy5lbWl0KCdjb25uZWN0JywgbmV3IENvbm5lY3Rpb25FcnJvcihlcnIubWVzc2FnZSwgJ0VJTlNUTE9PS1VQJykpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2xlYW51cENvbm5lY3Rpb24oY2xlYW51cFR5cGU6IHR5cGVvZiBDTEVBTlVQX1RZUEVba2V5b2YgdHlwZW9mIENMRUFOVVBfVFlQRV0pIHtcbiAgICBpZiAoIXRoaXMuY2xvc2VkKSB7XG4gICAgICB0aGlzLmNsZWFyQ29ubmVjdFRpbWVyKCk7XG4gICAgICB0aGlzLmNsZWFyUmVxdWVzdFRpbWVyKCk7XG4gICAgICB0aGlzLmNsZWFyUmV0cnlUaW1lcigpO1xuICAgICAgdGhpcy5jbG9zZUNvbm5lY3Rpb24oKTtcbiAgICAgIGlmIChjbGVhbnVwVHlwZSA9PT0gQ0xFQU5VUF9UWVBFLlJFRElSRUNUKSB7XG4gICAgICAgIHRoaXMuZW1pdCgncmVyb3V0aW5nJyk7XG4gICAgICB9IGVsc2UgaWYgKGNsZWFudXBUeXBlICE9PSBDTEVBTlVQX1RZUEUuUkVUUlkpIHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgdGhpcy5lbWl0KCdlbmQnKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnJlcXVlc3Q7XG4gICAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICBjb25zdCBlcnIgPSBuZXcgUmVxdWVzdEVycm9yKCdDb25uZWN0aW9uIGNsb3NlZCBiZWZvcmUgcmVxdWVzdCBjb21wbGV0ZWQuJywgJ0VDTE9TRScpO1xuICAgICAgICByZXF1ZXN0LmNhbGxiYWNrKGVycik7XG4gICAgICAgIHRoaXMucmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xuICAgICAgdGhpcy5sb2dpbkVycm9yID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY3JlYXRlRGVidWcoKSB7XG4gICAgY29uc3QgZGVidWcgPSBuZXcgRGVidWcodGhpcy5jb25maWcub3B0aW9ucy5kZWJ1Zyk7XG4gICAgZGVidWcub24oJ2RlYnVnJywgKG1lc3NhZ2UpID0+IHtcbiAgICAgIHRoaXMuZW1pdCgnZGVidWcnLCBtZXNzYWdlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZGVidWc7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNyZWF0ZVRva2VuU3RyZWFtUGFyc2VyKG1lc3NhZ2U6IE1lc3NhZ2UsIGhhbmRsZXI6IFRva2VuSGFuZGxlcikge1xuICAgIHJldHVybiBuZXcgVG9rZW5TdHJlYW1QYXJzZXIobWVzc2FnZSwgdGhpcy5kZWJ1ZywgaGFuZGxlciwgdGhpcy5jb25maWcub3B0aW9ucyk7XG4gIH1cblxuICBjb25uZWN0T25Qb3J0KHBvcnQ6IG51bWJlciwgbXVsdGlTdWJuZXRGYWlsb3ZlcjogYm9vbGVhbiwgc2lnbmFsOiBBYm9ydFNpZ25hbCkge1xuICAgIGNvbnN0IGNvbm5lY3RPcHRzID0ge1xuICAgICAgaG9zdDogdGhpcy5yb3V0aW5nRGF0YSA/IHRoaXMucm91dGluZ0RhdGEuc2VydmVyIDogdGhpcy5jb25maWcuc2VydmVyLFxuICAgICAgcG9ydDogdGhpcy5yb3V0aW5nRGF0YSA/IHRoaXMucm91dGluZ0RhdGEucG9ydCA6IHBvcnQsXG4gICAgICBsb2NhbEFkZHJlc3M6IHRoaXMuY29uZmlnLm9wdGlvbnMubG9jYWxBZGRyZXNzXG4gICAgfTtcblxuICAgIGNvbnN0IGNvbm5lY3QgPSBtdWx0aVN1Ym5ldEZhaWxvdmVyID8gY29ubmVjdEluUGFyYWxsZWwgOiBjb25uZWN0SW5TZXF1ZW5jZTtcblxuICAgIGNvbm5lY3QoY29ubmVjdE9wdHMsIGRucy5sb29rdXAsIHNpZ25hbCkudGhlbigoc29ja2V0KSA9PiB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgc29ja2V0Lm9uKCdlcnJvcicsIChlcnJvcikgPT4geyB0aGlzLnNvY2tldEVycm9yKGVycm9yKTsgfSk7XG4gICAgICAgIHNvY2tldC5vbignY2xvc2UnLCAoKSA9PiB7IHRoaXMuc29ja2V0Q2xvc2UoKTsgfSk7XG4gICAgICAgIHNvY2tldC5vbignZW5kJywgKCkgPT4geyB0aGlzLnNvY2tldEVuZCgpOyB9KTtcbiAgICAgICAgc29ja2V0LnNldEtlZXBBbGl2ZSh0cnVlLCBLRUVQX0FMSVZFX0lOSVRJQUxfREVMQVkpO1xuXG4gICAgICAgIHRoaXMubWVzc2FnZUlvID0gbmV3IE1lc3NhZ2VJTyhzb2NrZXQsIHRoaXMuY29uZmlnLm9wdGlvbnMucGFja2V0U2l6ZSwgdGhpcy5kZWJ1Zyk7XG4gICAgICAgIHRoaXMubWVzc2FnZUlvLm9uKCdzZWN1cmUnLCAoY2xlYXJ0ZXh0KSA9PiB7IHRoaXMuZW1pdCgnc2VjdXJlJywgY2xlYXJ0ZXh0KTsgfSk7XG5cbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG5cbiAgICAgICAgdGhpcy5jbG9zZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kZWJ1Zy5sb2coJ2Nvbm5lY3RlZCB0byAnICsgdGhpcy5jb25maWcuc2VydmVyICsgJzonICsgdGhpcy5jb25maWcub3B0aW9ucy5wb3J0KTtcblxuICAgICAgICB0aGlzLnNlbmRQcmVMb2dpbigpO1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlNFTlRfUFJFTE9HSU4pO1xuICAgICAgfSk7XG4gICAgfSwgKGVycikgPT4ge1xuICAgICAgaWYgKGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHsgdGhpcy5zb2NrZXRFcnJvcihlcnIpOyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2xvc2VDb25uZWN0aW9uKCkge1xuICAgIGlmICh0aGlzLnNvY2tldCkge1xuICAgICAgdGhpcy5zb2NrZXQuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY3JlYXRlQ29ubmVjdFRpbWVyKCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgdGhpcy5jb25uZWN0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIHRoaXMuY29ubmVjdFRpbWVvdXQoKTtcbiAgICB9LCB0aGlzLmNvbmZpZy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0KTtcbiAgICByZXR1cm4gY29udHJvbGxlci5zaWduYWw7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNyZWF0ZUNhbmNlbFRpbWVyKCkge1xuICAgIHRoaXMuY2xlYXJDYW5jZWxUaW1lcigpO1xuICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLmNvbmZpZy5vcHRpb25zLmNhbmNlbFRpbWVvdXQ7XG4gICAgaWYgKHRpbWVvdXQgPiAwKSB7XG4gICAgICB0aGlzLmNhbmNlbFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2FuY2VsVGltZW91dCgpO1xuICAgICAgfSwgdGltZW91dCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjcmVhdGVSZXF1ZXN0VGltZXIoKSB7XG4gICAgdGhpcy5jbGVhclJlcXVlc3RUaW1lcigpOyAvLyByZWxlYXNlIG9sZCB0aW1lciwganVzdCB0byBiZSBzYWZlXG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucmVxdWVzdCBhcyBSZXF1ZXN0O1xuICAgIGNvbnN0IHRpbWVvdXQgPSAocmVxdWVzdC50aW1lb3V0ICE9PSB1bmRlZmluZWQpID8gcmVxdWVzdC50aW1lb3V0IDogdGhpcy5jb25maWcub3B0aW9ucy5yZXF1ZXN0VGltZW91dDtcbiAgICBpZiAodGltZW91dCkge1xuICAgICAgdGhpcy5yZXF1ZXN0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0VGltZW91dCgpO1xuICAgICAgfSwgdGltZW91dCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjcmVhdGVSZXRyeVRpbWVyKCkge1xuICAgIHRoaXMuY2xlYXJSZXRyeVRpbWVyKCk7XG4gICAgdGhpcy5yZXRyeVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJldHJ5VGltZW91dCgpO1xuICAgIH0sIHRoaXMuY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvblJldHJ5SW50ZXJ2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb25uZWN0VGltZW91dCgpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gYEZhaWxlZCB0byBjb25uZWN0IHRvICR7dGhpcy5jb25maWcuc2VydmVyfSR7dGhpcy5jb25maWcub3B0aW9ucy5wb3J0ID8gYDoke3RoaXMuY29uZmlnLm9wdGlvbnMucG9ydH1gIDogYFxcXFwke3RoaXMuY29uZmlnLm9wdGlvbnMuaW5zdGFuY2VOYW1lfWB9IGluICR7dGhpcy5jb25maWcub3B0aW9ucy5jb25uZWN0VGltZW91dH1tc2A7XG4gICAgdGhpcy5kZWJ1Zy5sb2cobWVzc2FnZSk7XG4gICAgdGhpcy5lbWl0KCdjb25uZWN0JywgbmV3IENvbm5lY3Rpb25FcnJvcihtZXNzYWdlLCAnRVRJTUVPVVQnKSk7XG4gICAgdGhpcy5jb25uZWN0VGltZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdjb25uZWN0VGltZW91dCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjYW5jZWxUaW1lb3V0KCkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBgRmFpbGVkIHRvIGNhbmNlbCByZXF1ZXN0IGluICR7dGhpcy5jb25maWcub3B0aW9ucy5jYW5jZWxUaW1lb3V0fW1zYDtcbiAgICB0aGlzLmRlYnVnLmxvZyhtZXNzYWdlKTtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ3NvY2tldEVycm9yJywgbmV3IENvbm5lY3Rpb25FcnJvcihtZXNzYWdlLCAnRVRJTUVPVVQnKSk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlcXVlc3RUaW1lb3V0KCkge1xuICAgIHRoaXMucmVxdWVzdFRpbWVyID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnJlcXVlc3QhO1xuICAgIHJlcXVlc3QuY2FuY2VsKCk7XG4gICAgY29uc3QgdGltZW91dCA9IChyZXF1ZXN0LnRpbWVvdXQgIT09IHVuZGVmaW5lZCkgPyByZXF1ZXN0LnRpbWVvdXQgOiB0aGlzLmNvbmZpZy5vcHRpb25zLnJlcXVlc3RUaW1lb3V0O1xuICAgIGNvbnN0IG1lc3NhZ2UgPSAnVGltZW91dDogUmVxdWVzdCBmYWlsZWQgdG8gY29tcGxldGUgaW4gJyArIHRpbWVvdXQgKyAnbXMnO1xuICAgIHJlcXVlc3QuZXJyb3IgPSBuZXcgUmVxdWVzdEVycm9yKG1lc3NhZ2UsICdFVElNRU9VVCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZXRyeVRpbWVvdXQoKSB7XG4gICAgdGhpcy5yZXRyeVRpbWVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZW1pdCgncmV0cnknKTtcbiAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkNPTk5FQ1RJTkcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjbGVhckNvbm5lY3RUaW1lcigpIHtcbiAgICBpZiAodGhpcy5jb25uZWN0VGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmNvbm5lY3RUaW1lcik7XG4gICAgICB0aGlzLmNvbm5lY3RUaW1lciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNsZWFyQ2FuY2VsVGltZXIoKSB7XG4gICAgaWYgKHRoaXMuY2FuY2VsVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmNhbmNlbFRpbWVyKTtcbiAgICAgIHRoaXMuY2FuY2VsVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjbGVhclJlcXVlc3RUaW1lcigpIHtcbiAgICBpZiAodGhpcy5yZXF1ZXN0VGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlcXVlc3RUaW1lcik7XG4gICAgICB0aGlzLnJlcXVlc3RUaW1lciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNsZWFyUmV0cnlUaW1lcigpIHtcbiAgICBpZiAodGhpcy5yZXRyeVRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZXRyeVRpbWVyKTtcbiAgICAgIHRoaXMucmV0cnlUaW1lciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRyYW5zaXRpb25UbyhuZXdTdGF0ZTogU3RhdGUpIHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gbmV3U3RhdGUpIHtcbiAgICAgIHRoaXMuZGVidWcubG9nKCdTdGF0ZSBpcyBhbHJlYWR5ICcgKyBuZXdTdGF0ZS5uYW1lKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZSAmJiB0aGlzLnN0YXRlLmV4aXQpIHtcbiAgICAgIHRoaXMuc3RhdGUuZXhpdC5jYWxsKHRoaXMsIG5ld1N0YXRlKTtcbiAgICB9XG5cbiAgICB0aGlzLmRlYnVnLmxvZygnU3RhdGUgY2hhbmdlOiAnICsgKHRoaXMuc3RhdGUgPyB0aGlzLnN0YXRlLm5hbWUgOiAndW5kZWZpbmVkJykgKyAnIC0+ICcgKyBuZXdTdGF0ZS5uYW1lKTtcbiAgICB0aGlzLnN0YXRlID0gbmV3U3RhdGU7XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5lbnRlcikge1xuICAgICAgdGhpcy5zdGF0ZS5lbnRlci5hcHBseSh0aGlzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGdldEV2ZW50SGFuZGxlcjxUIGV4dGVuZHMga2V5b2YgU3RhdGVbJ2V2ZW50cyddPihldmVudE5hbWU6IFQpOiBOb25OdWxsYWJsZTxTdGF0ZVsnZXZlbnRzJ11bVF0+IHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5zdGF0ZS5ldmVudHNbZXZlbnROYW1lXTtcblxuICAgIGlmICghaGFuZGxlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBldmVudCAnJHtldmVudE5hbWV9JyBpbiBzdGF0ZSAnJHt0aGlzLnN0YXRlLm5hbWV9J2ApO1xuICAgIH1cblxuICAgIHJldHVybiBoYW5kbGVyITtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGlzcGF0Y2hFdmVudDxUIGV4dGVuZHMga2V5b2YgU3RhdGVbJ2V2ZW50cyddPihldmVudE5hbWU6IFQsIC4uLmFyZ3M6IFBhcmFtZXRlcnM8Tm9uTnVsbGFibGU8U3RhdGVbJ2V2ZW50cyddW1RdPj4pIHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5zdGF0ZS5ldmVudHNbZXZlbnROYW1lXSBhcyAoKHRoaXM6IENvbm5lY3Rpb24sIC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoaGFuZGxlcikge1xuICAgICAgaGFuZGxlci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcihgTm8gZXZlbnQgJyR7ZXZlbnROYW1lfScgaW4gc3RhdGUgJyR7dGhpcy5zdGF0ZS5uYW1lfSdgKSk7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzb2NrZXRFcnJvcihlcnJvcjogRXJyb3IpIHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gdGhpcy5TVEFURS5DT05ORUNUSU5HIHx8IHRoaXMuc3RhdGUgPT09IHRoaXMuU1RBVEUuU0VOVF9UTFNTU0xORUdPVElBVElPTikge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGBGYWlsZWQgdG8gY29ubmVjdCB0byAke3RoaXMuY29uZmlnLnNlcnZlcn06JHt0aGlzLmNvbmZpZy5vcHRpb25zLnBvcnR9IC0gJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgICB0aGlzLmRlYnVnLmxvZyhtZXNzYWdlKTtcbiAgICAgIHRoaXMuZW1pdCgnY29ubmVjdCcsIG5ldyBDb25uZWN0aW9uRXJyb3IobWVzc2FnZSwgJ0VTT0NLRVQnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgQ29ubmVjdGlvbiBsb3N0IC0gJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgICB0aGlzLmRlYnVnLmxvZyhtZXNzYWdlKTtcbiAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgQ29ubmVjdGlvbkVycm9yKG1lc3NhZ2UsICdFU09DS0VUJykpO1xuICAgIH1cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ3NvY2tldEVycm9yJywgZXJyb3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzb2NrZXRFbmQoKSB7XG4gICAgdGhpcy5kZWJ1Zy5sb2coJ3NvY2tldCBlbmRlZCcpO1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSB0aGlzLlNUQVRFLkZJTkFMKSB7XG4gICAgICBjb25zdCBlcnJvcjogRXJyb3JXaXRoQ29kZSA9IG5ldyBFcnJvcignc29ja2V0IGhhbmcgdXAnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAnRUNPTk5SRVNFVCc7XG4gICAgICB0aGlzLnNvY2tldEVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNvY2tldENsb3NlKCkge1xuICAgIHRoaXMuZGVidWcubG9nKCdjb25uZWN0aW9uIHRvICcgKyB0aGlzLmNvbmZpZy5zZXJ2ZXIgKyAnOicgKyB0aGlzLmNvbmZpZy5vcHRpb25zLnBvcnQgKyAnIGNsb3NlZCcpO1xuICAgIGlmICh0aGlzLnN0YXRlID09PSB0aGlzLlNUQVRFLlJFUk9VVElORykge1xuICAgICAgdGhpcy5kZWJ1Zy5sb2coJ1Jlcm91dGluZyB0byAnICsgdGhpcy5yb3V0aW5nRGF0YSEuc2VydmVyICsgJzonICsgdGhpcy5yb3V0aW5nRGF0YSEucG9ydCk7XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgncmVjb25uZWN0Jyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09PSB0aGlzLlNUQVRFLlRSQU5TSUVOVF9GQUlMVVJFX1JFVFJZKSB7XG4gICAgICBjb25zdCBzZXJ2ZXIgPSB0aGlzLnJvdXRpbmdEYXRhID8gdGhpcy5yb3V0aW5nRGF0YS5zZXJ2ZXIgOiB0aGlzLmNvbmZpZy5zZXJ2ZXI7XG4gICAgICBjb25zdCBwb3J0ID0gdGhpcy5yb3V0aW5nRGF0YSA/IHRoaXMucm91dGluZ0RhdGEucG9ydCA6IHRoaXMuY29uZmlnLm9wdGlvbnMucG9ydDtcbiAgICAgIHRoaXMuZGVidWcubG9nKCdSZXRyeSBhZnRlciB0cmFuc2llbnQgZmFpbHVyZSBjb25uZWN0aW5nIHRvICcgKyBzZXJ2ZXIgKyAnOicgKyBwb3J0KTtcblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdyZXRyeScpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNlbmRQcmVMb2dpbigpIHtcbiAgICBjb25zdCBbICwgbWFqb3IsIG1pbm9yLCBidWlsZCBdID0gL14oXFxkKylcXC4oXFxkKylcXC4oXFxkKykvLmV4ZWModmVyc2lvbikgPz8gWyAnMC4wLjAnLCAnMCcsICcwJywgJzAnIF07XG5cbiAgICBjb25zdCBwYXlsb2FkID0gbmV3IFByZWxvZ2luUGF5bG9hZCh7XG4gICAgICBlbmNyeXB0OiB0aGlzLmNvbmZpZy5vcHRpb25zLmVuY3J5cHQsXG4gICAgICB2ZXJzaW9uOiB7IG1ham9yOiBOdW1iZXIobWFqb3IpLCBtaW5vcjogTnVtYmVyKG1pbm9yKSwgYnVpbGQ6IE51bWJlcihidWlsZCksIHN1YmJ1aWxkOiAwIH1cbiAgICB9KTtcblxuICAgIHRoaXMubWVzc2FnZUlvLnNlbmRNZXNzYWdlKFRZUEUuUFJFTE9HSU4sIHBheWxvYWQuZGF0YSk7XG4gICAgdGhpcy5kZWJ1Zy5wYXlsb2FkKGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHBheWxvYWQudG9TdHJpbmcoJyAgJyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNlbmRMb2dpbjdQYWNrZXQoKSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IG5ldyBMb2dpbjdQYXlsb2FkKHtcbiAgICAgIHRkc1ZlcnNpb246IHZlcnNpb25zW3RoaXMuY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbl0sXG4gICAgICBwYWNrZXRTaXplOiB0aGlzLmNvbmZpZy5vcHRpb25zLnBhY2tldFNpemUsXG4gICAgICBjbGllbnRQcm9nVmVyOiAwLFxuICAgICAgY2xpZW50UGlkOiBwcm9jZXNzLnBpZCxcbiAgICAgIGNvbm5lY3Rpb25JZDogMCxcbiAgICAgIGNsaWVudFRpbWVab25lOiBuZXcgRGF0ZSgpLmdldFRpbWV6b25lT2Zmc2V0KCksXG4gICAgICBjbGllbnRMY2lkOiAweDAwMDAwNDA5XG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0aW9uIH0gPSB0aGlzLmNvbmZpZztcbiAgICBzd2l0Y2ggKGF1dGhlbnRpY2F0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktcGFzc3dvcmQnOlxuICAgICAgICBwYXlsb2FkLmZlZEF1dGggPSB7XG4gICAgICAgICAgdHlwZTogJ0FEQUwnLFxuICAgICAgICAgIGVjaG86IHRoaXMuZmVkQXV0aFJlcXVpcmVkLFxuICAgICAgICAgIHdvcmtmbG93OiAnZGVmYXVsdCdcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktYWNjZXNzLXRva2VuJzpcbiAgICAgICAgcGF5bG9hZC5mZWRBdXRoID0ge1xuICAgICAgICAgIHR5cGU6ICdTRUNVUklUWVRPS0VOJyxcbiAgICAgICAgICBlY2hvOiB0aGlzLmZlZEF1dGhSZXF1aXJlZCxcbiAgICAgICAgICBmZWRBdXRoVG9rZW46IGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMudG9rZW5cbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLXZtJzpcbiAgICAgIGNhc2UgJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktZGVmYXVsdCc6XG4gICAgICBjYXNlICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS1hcHAtc2VydmljZSc6XG4gICAgICBjYXNlICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXNlcnZpY2UtcHJpbmNpcGFsLXNlY3JldCc6XG4gICAgICAgIHBheWxvYWQuZmVkQXV0aCA9IHtcbiAgICAgICAgICB0eXBlOiAnQURBTCcsXG4gICAgICAgICAgZWNobzogdGhpcy5mZWRBdXRoUmVxdWlyZWQsXG4gICAgICAgICAgd29ya2Zsb3c6ICdpbnRlZ3JhdGVkJ1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnbnRsbSc6XG4gICAgICAgIHBheWxvYWQuc3NwaSA9IGNyZWF0ZU5UTE1SZXF1ZXN0KHsgZG9tYWluOiBhdXRoZW50aWNhdGlvbi5vcHRpb25zLmRvbWFpbiB9KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHBheWxvYWQudXNlck5hbWUgPSBhdXRoZW50aWNhdGlvbi5vcHRpb25zLnVzZXJOYW1lO1xuICAgICAgICBwYXlsb2FkLnBhc3N3b3JkID0gYXV0aGVudGljYXRpb24ub3B0aW9ucy5wYXNzd29yZDtcbiAgICB9XG5cbiAgICBwYXlsb2FkLmhvc3RuYW1lID0gdGhpcy5jb25maWcub3B0aW9ucy53b3Jrc3RhdGlvbklkIHx8IG9zLmhvc3RuYW1lKCk7XG4gICAgcGF5bG9hZC5zZXJ2ZXJOYW1lID0gdGhpcy5yb3V0aW5nRGF0YSA/IHRoaXMucm91dGluZ0RhdGEuc2VydmVyIDogdGhpcy5jb25maWcuc2VydmVyO1xuICAgIHBheWxvYWQuYXBwTmFtZSA9IHRoaXMuY29uZmlnLm9wdGlvbnMuYXBwTmFtZSB8fCAnVGVkaW91cyc7XG4gICAgcGF5bG9hZC5saWJyYXJ5TmFtZSA9IGxpYnJhcnlOYW1lO1xuICAgIHBheWxvYWQubGFuZ3VhZ2UgPSB0aGlzLmNvbmZpZy5vcHRpb25zLmxhbmd1YWdlO1xuICAgIHBheWxvYWQuZGF0YWJhc2UgPSB0aGlzLmNvbmZpZy5vcHRpb25zLmRhdGFiYXNlO1xuICAgIHBheWxvYWQuY2xpZW50SWQgPSBCdWZmZXIuZnJvbShbMSwgMiwgMywgNCwgNSwgNl0pO1xuXG4gICAgcGF5bG9hZC5yZWFkT25seUludGVudCA9IHRoaXMuY29uZmlnLm9wdGlvbnMucmVhZE9ubHlJbnRlbnQ7XG4gICAgcGF5bG9hZC5pbml0RGJGYXRhbCA9ICF0aGlzLmNvbmZpZy5vcHRpb25zLmZhbGxiYWNrVG9EZWZhdWx0RGI7XG5cbiAgICB0aGlzLnJvdXRpbmdEYXRhID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubWVzc2FnZUlvLnNlbmRNZXNzYWdlKFRZUEUuTE9HSU43LCBwYXlsb2FkLnRvQnVmZmVyKCkpO1xuXG4gICAgdGhpcy5kZWJ1Zy5wYXlsb2FkKGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHBheWxvYWQudG9TdHJpbmcoJyAgJyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNlbmRGZWRBdXRoVG9rZW5NZXNzYWdlKHRva2VuOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhY2Nlc3NUb2tlbkxlbiA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHRva2VuLCAndWNzMicpO1xuICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoOCArIGFjY2Vzc1Rva2VuTGVuKTtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICBvZmZzZXQgPSBkYXRhLndyaXRlVUludDMyTEUoYWNjZXNzVG9rZW5MZW4gKyA0LCBvZmZzZXQpO1xuICAgIG9mZnNldCA9IGRhdGEud3JpdGVVSW50MzJMRShhY2Nlc3NUb2tlbkxlbiwgb2Zmc2V0KTtcbiAgICBkYXRhLndyaXRlKHRva2VuLCBvZmZzZXQsICd1Y3MyJyk7XG4gICAgdGhpcy5tZXNzYWdlSW8uc2VuZE1lc3NhZ2UoVFlQRS5GRURBVVRIX1RPS0VOLCBkYXRhKTtcbiAgICAvLyBzZW50IHRoZSBmZWRBdXRoIHRva2VuIG1lc3NhZ2UsIHRoZSByZXN0IGlzIHNpbWlsYXIgdG8gc3RhbmRhcmQgbG9naW4gN1xuICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuU0VOVF9MT0dJTjdfV0lUSF9TVEFOREFSRF9MT0dJTik7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNlbmRJbml0aWFsU3FsKCkge1xuICAgIGNvbnN0IHBheWxvYWQgPSBuZXcgU3FsQmF0Y2hQYXlsb2FkKHRoaXMuZ2V0SW5pdGlhbFNxbCgpLCB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKSwgdGhpcy5jb25maWcub3B0aW9ucyk7XG5cbiAgICBjb25zdCBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoeyB0eXBlOiBUWVBFLlNRTF9CQVRDSCB9KTtcbiAgICB0aGlzLm1lc3NhZ2VJby5vdXRnb2luZ01lc3NhZ2VTdHJlYW0ud3JpdGUobWVzc2FnZSk7XG4gICAgUmVhZGFibGUuZnJvbShwYXlsb2FkKS5waXBlKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRJbml0aWFsU3FsKCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBbXTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lOdWxsID09PSB0cnVlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBhbnNpX251bGxzIG9uJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lOdWxsID09PSBmYWxzZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgYW5zaV9udWxscyBvZmYnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbERlZmF1bHQgPT09IHRydWUpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGFuc2lfbnVsbF9kZmx0X29uIG9uJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lOdWxsRGVmYXVsdCA9PT0gZmFsc2UpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGFuc2lfbnVsbF9kZmx0X29uIG9mZicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lQYWRkaW5nID09PSB0cnVlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBhbnNpX3BhZGRpbmcgb24nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaVBhZGRpbmcgPT09IGZhbHNlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBhbnNpX3BhZGRpbmcgb2ZmJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaVdhcm5pbmdzID09PSB0cnVlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBhbnNpX3dhcm5pbmdzIG9uJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lXYXJuaW5ncyA9PT0gZmFsc2UpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGFuc2lfd2FybmluZ3Mgb2ZmJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQXJpdGhBYm9ydCA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgYXJpdGhhYm9ydCBvbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBcml0aEFib3J0ID09PSBmYWxzZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgYXJpdGhhYm9ydCBvZmYnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVDb25jYXROdWxsWWllbGRzTnVsbCA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgY29uY2F0X251bGxfeWllbGRzX251bGwgb24nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGwgPT09IGZhbHNlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBjb25jYXRfbnVsbF95aWVsZHNfbnVsbCBvZmYnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVDdXJzb3JDbG9zZU9uQ29tbWl0ID09PSB0cnVlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBjdXJzb3JfY2xvc2Vfb25fY29tbWl0IG9uJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUN1cnNvckNsb3NlT25Db21taXQgPT09IGZhbHNlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBjdXJzb3JfY2xvc2Vfb25fY29tbWl0IG9mZicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmRhdGVmaXJzdCAhPT0gbnVsbCkge1xuICAgICAgb3B0aW9ucy5wdXNoKGBzZXQgZGF0ZWZpcnN0ICR7dGhpcy5jb25maWcub3B0aW9ucy5kYXRlZmlyc3R9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZGF0ZUZvcm1hdCAhPT0gbnVsbCkge1xuICAgICAgb3B0aW9ucy5wdXNoKGBzZXQgZGF0ZWZvcm1hdCAke3RoaXMuY29uZmlnLm9wdGlvbnMuZGF0ZUZvcm1hdH1gKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVJbXBsaWNpdFRyYW5zYWN0aW9ucyA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgaW1wbGljaXRfdHJhbnNhY3Rpb25zIG9uJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUltcGxpY2l0VHJhbnNhY3Rpb25zID09PSBmYWxzZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgaW1wbGljaXRfdHJhbnNhY3Rpb25zIG9mZicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmxhbmd1YWdlICE9PSBudWxsKSB7XG4gICAgICBvcHRpb25zLnB1c2goYHNldCBsYW5ndWFnZSAke3RoaXMuY29uZmlnLm9wdGlvbnMubGFuZ3VhZ2V9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQgPT09IHRydWUpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IG51bWVyaWNfcm91bmRhYm9ydCBvbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVOdW1lcmljUm91bmRhYm9ydCA9PT0gZmFsc2UpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IG51bWVyaWNfcm91bmRhYm9ydCBvZmYnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVRdW90ZWRJZGVudGlmaWVyID09PSB0cnVlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBxdW90ZWRfaWRlbnRpZmllciBvbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVRdW90ZWRJZGVudGlmaWVyID09PSBmYWxzZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgcXVvdGVkX2lkZW50aWZpZXIgb2ZmJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMudGV4dHNpemUgIT09IG51bGwpIHtcbiAgICAgIG9wdGlvbnMucHVzaChgc2V0IHRleHRzaXplICR7dGhpcy5jb25maWcub3B0aW9ucy50ZXh0c2l6ZX1gKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5jb25uZWN0aW9uSXNvbGF0aW9uTGV2ZWwgIT09IG51bGwpIHtcbiAgICAgIG9wdGlvbnMucHVzaChgc2V0IHRyYW5zYWN0aW9uIGlzb2xhdGlvbiBsZXZlbCAke3RoaXMuZ2V0SXNvbGF0aW9uTGV2ZWxUZXh0KHRoaXMuY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvbklzb2xhdGlvbkxldmVsKX1gKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5hYm9ydFRyYW5zYWN0aW9uT25FcnJvciA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgeGFjdF9hYm9ydCBvbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcub3B0aW9ucy5hYm9ydFRyYW5zYWN0aW9uT25FcnJvciA9PT0gZmFsc2UpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IHhhY3RfYWJvcnQgb2ZmJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvbnMuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByb2Nlc3NlZEluaXRpYWxTcWwoKSB7XG4gICAgdGhpcy5jbGVhckNvbm5lY3RUaW1lcigpO1xuICAgIHRoaXMuZW1pdCgnY29ubmVjdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgdGhlIFNRTCBiYXRjaCByZXByZXNlbnRlZCBieSBbW1JlcXVlc3RdXS5cbiAgICogVGhlcmUgaXMgbm8gcGFyYW0gc3VwcG9ydCwgYW5kIHVubGlrZSBbW1JlcXVlc3QuZXhlY1NxbF1dLFxuICAgKiBpdCBpcyBub3QgbGlrZWx5IHRoYXQgU1FMIFNlcnZlciB3aWxsIHJldXNlIHRoZSBleGVjdXRpb24gcGxhbiBpdCBnZW5lcmF0ZXMgZm9yIHRoZSBTUUwuXG4gICAqXG4gICAqIEluIGFsbW9zdCBhbGwgY2FzZXMsIFtbUmVxdWVzdC5leGVjU3FsXV0gd2lsbCBiZSBhIGJldHRlciBjaG9pY2UuXG4gICAqXG4gICAqIEBwYXJhbSByZXF1ZXN0IEEgW1tSZXF1ZXN0XV0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVxdWVzdC5cbiAgICovXG4gIGV4ZWNTcWxCYXRjaChyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gICAgdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0LCBUWVBFLlNRTF9CQVRDSCwgbmV3IFNxbEJhdGNoUGF5bG9hZChyZXF1ZXN0LnNxbFRleHRPclByb2NlZHVyZSEsIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpLCB0aGlzLmNvbmZpZy5vcHRpb25zKSk7XG4gIH1cblxuICAvKipcbiAgICogIEV4ZWN1dGUgdGhlIFNRTCByZXByZXNlbnRlZCBieSBbW1JlcXVlc3RdXS5cbiAgICpcbiAgICogQXMgYHNwX2V4ZWN1dGVzcWxgIGlzIHVzZWQgdG8gZXhlY3V0ZSB0aGUgU1FMLCBpZiB0aGUgc2FtZSBTUUwgaXMgZXhlY3V0ZWQgbXVsdGlwbGVzIHRpbWVzXG4gICAqIHVzaW5nIHRoaXMgZnVuY3Rpb24sIHRoZSBTUUwgU2VydmVyIHF1ZXJ5IG9wdGltaXplciBpcyBsaWtlbHkgdG8gcmV1c2UgdGhlIGV4ZWN1dGlvbiBwbGFuIGl0IGdlbmVyYXRlc1xuICAgKiBmb3IgdGhlIGZpcnN0IGV4ZWN1dGlvbi4gVGhpcyBtYXkgYWxzbyByZXN1bHQgaW4gU1FMIHNlcnZlciB0cmVhdGluZyB0aGUgcmVxdWVzdCBsaWtlIGEgc3RvcmVkIHByb2NlZHVyZVxuICAgKiB3aGljaCBjYW4gcmVzdWx0IGluIHRoZSBbW0V2ZW50X2RvbmVJblByb2NdXSBvciBbW0V2ZW50X2RvbmVQcm9jXV0gZXZlbnRzIGJlaW5nIGVtaXR0ZWQgaW5zdGVhZCBvZiB0aGVcbiAgICogW1tFdmVudF9kb25lXV0gZXZlbnQgeW91IG1pZ2h0IGV4cGVjdC4gVXNpbmcgW1tleGVjU3FsQmF0Y2hdXSB3aWxsIHByZXZlbnQgdGhpcyBmcm9tIG9jY3VycmluZyBidXQgbWF5IGhhdmUgYSBuZWdhdGl2ZSBwZXJmb3JtYW5jZSBpbXBhY3QuXG4gICAqXG4gICAqIEJld2FyZSBvZiB0aGUgd2F5IHRoYXQgc2NvcGluZyBydWxlcyBhcHBseSwgYW5kIGhvdyB0aGV5IG1heSBbYWZmZWN0IGxvY2FsIHRlbXAgdGFibGVzXShodHRwOi8vd2VibG9ncy5zcWx0ZWFtLmNvbS9tbGFkZW5wL2FyY2hpdmUvMjAwNi8xMS8wMy8xNzE5Ny5hc3B4KVxuICAgKiBJZiB5b3UncmUgcnVubmluZyBpbiB0byBzY29waW5nIGlzc3VlcywgdGhlbiBbW2V4ZWNTcWxCYXRjaF1dIG1heSBiZSBhIGJldHRlciBjaG9pY2UuXG4gICAqIFNlZSBhbHNvIFtpc3N1ZSAjMjRdKGh0dHBzOi8vZ2l0aHViLmNvbS9wZWtpbS90ZWRpb3VzL2lzc3Vlcy8yNClcbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3QgQSBbW1JlcXVlc3RdXSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXF1ZXN0LlxuICAgKi9cbiAgZXhlY1NxbChyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlcXVlc3QudmFsaWRhdGVQYXJhbWV0ZXJzKHRoaXMuZGF0YWJhc2VDb2xsYXRpb24pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIHJlcXVlc3QuZXJyb3IgPSBlcnJvcjtcblxuICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgIHRoaXMuZGVidWcubG9nKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICByZXF1ZXN0LmNhbGxiYWNrKGVycm9yKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1ldGVyczogUGFyYW1ldGVyW10gPSBbXTtcblxuICAgIHBhcmFtZXRlcnMucHVzaCh7XG4gICAgICB0eXBlOiBUWVBFUy5OVmFyQ2hhcixcbiAgICAgIG5hbWU6ICdzdGF0ZW1lbnQnLFxuICAgICAgdmFsdWU6IHJlcXVlc3Quc3FsVGV4dE9yUHJvY2VkdXJlLFxuICAgICAgb3V0cHV0OiBmYWxzZSxcbiAgICAgIGxlbmd0aDogdW5kZWZpbmVkLFxuICAgICAgcHJlY2lzaW9uOiB1bmRlZmluZWQsXG4gICAgICBzY2FsZTogdW5kZWZpbmVkXG4gICAgfSk7XG5cbiAgICBpZiAocmVxdWVzdC5wYXJhbWV0ZXJzLmxlbmd0aCkge1xuICAgICAgcGFyYW1ldGVycy5wdXNoKHtcbiAgICAgICAgdHlwZTogVFlQRVMuTlZhckNoYXIsXG4gICAgICAgIG5hbWU6ICdwYXJhbXMnLFxuICAgICAgICB2YWx1ZTogcmVxdWVzdC5tYWtlUGFyYW1zUGFyYW1ldGVyKHJlcXVlc3QucGFyYW1ldGVycyksXG4gICAgICAgIG91dHB1dDogZmFsc2UsXG4gICAgICAgIGxlbmd0aDogdW5kZWZpbmVkLFxuICAgICAgICBwcmVjaXNpb246IHVuZGVmaW5lZCxcbiAgICAgICAgc2NhbGU6IHVuZGVmaW5lZFxuICAgICAgfSk7XG5cbiAgICAgIHBhcmFtZXRlcnMucHVzaCguLi5yZXF1ZXN0LnBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5SUENfUkVRVUVTVCwgbmV3IFJwY1JlcXVlc3RQYXlsb2FkKCdzcF9leGVjdXRlc3FsJywgcGFyYW1ldGVycywgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCksIHRoaXMuY29uZmlnLm9wdGlvbnMsIHRoaXMuZGF0YWJhc2VDb2xsYXRpb24pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEJ1bGtMb2FkIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gdGFibGUgVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIGJ1bGstaW5zZXJ0IGludG8uXG4gICAqIEBwYXJhbSBvcHRpb25zIEEgc2V0IG9mIGJ1bGsgbG9hZCBvcHRpb25zLlxuICAgKi9cbiAgbmV3QnVsa0xvYWQodGFibGU6IHN0cmluZywgY2FsbGJhY2s6IEJ1bGtMb2FkQ2FsbGJhY2spOiBCdWxrTG9hZFxuICBuZXdCdWxrTG9hZCh0YWJsZTogc3RyaW5nLCBvcHRpb25zOiBCdWxrTG9hZE9wdGlvbnMsIGNhbGxiYWNrOiBCdWxrTG9hZENhbGxiYWNrKTogQnVsa0xvYWRcbiAgbmV3QnVsa0xvYWQodGFibGU6IHN0cmluZywgY2FsbGJhY2tPck9wdGlvbnM6IEJ1bGtMb2FkT3B0aW9ucyB8IEJ1bGtMb2FkQ2FsbGJhY2ssIGNhbGxiYWNrPzogQnVsa0xvYWRDYWxsYmFjaykge1xuICAgIGxldCBvcHRpb25zOiBCdWxrTG9hZE9wdGlvbnM7XG5cbiAgICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY2FsbGJhY2sgPSBjYWxsYmFja09yT3B0aW9ucyBhcyBCdWxrTG9hZENhbGxiYWNrO1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zID0gY2FsbGJhY2tPck9wdGlvbnMgYXMgQnVsa0xvYWRPcHRpb25zO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wib3B0aW9uc1wiIGFyZ3VtZW50IG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQnVsa0xvYWQodGFibGUsIHRoaXMuZGF0YWJhc2VDb2xsYXRpb24sIHRoaXMuY29uZmlnLm9wdGlvbnMsIG9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgW1tCdWxrTG9hZF1dLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiAvLyBXZSB3YW50IHRvIHBlcmZvcm0gYSBidWxrIGxvYWQgaW50byBhIHRhYmxlIHdpdGggdGhlIGZvbGxvd2luZyBmb3JtYXQ6XG4gICAqIC8vIENSRUFURSBUQUJMRSBlbXBsb3llZXMgKGZpcnN0X25hbWUgbnZhcmNoYXIoMjU1KSwgbGFzdF9uYW1lIG52YXJjaGFyKDI1NSksIGRheV9vZl9iaXJ0aCBkYXRlKTtcbiAgICpcbiAgICogY29uc3QgYnVsa0xvYWQgPSBjb25uZWN0aW9uLm5ld0J1bGtMb2FkKCdlbXBsb3llZXMnLCAoZXJyLCByb3dDb3VudCkgPT4ge1xuICAgKiAgIC8vIC4uLlxuICAgKiB9KTtcbiAgICpcbiAgICogLy8gRmlyc3QsIHdlIG5lZWQgdG8gc3BlY2lmeSB0aGUgY29sdW1ucyB0aGF0IHdlIHdhbnQgdG8gd3JpdGUgdG8sXG4gICAqIC8vIGFuZCB0aGVpciBkZWZpbml0aW9ucy4gVGhlc2UgZGVmaW5pdGlvbnMgbXVzdCBtYXRjaCB0aGUgYWN0dWFsIHRhYmxlLFxuICAgKiAvLyBvdGhlcndpc2UgdGhlIGJ1bGsgbG9hZCB3aWxsIGZhaWwuXG4gICAqIGJ1bGtMb2FkLmFkZENvbHVtbignZmlyc3RfbmFtZScsIFRZUEVTLk5WYXJjaGFyLCB7IG51bGxhYmxlOiBmYWxzZSB9KTtcbiAgICogYnVsa0xvYWQuYWRkQ29sdW1uKCdsYXN0X25hbWUnLCBUWVBFUy5OVmFyY2hhciwgeyBudWxsYWJsZTogZmFsc2UgfSk7XG4gICAqIGJ1bGtMb2FkLmFkZENvbHVtbignZGF0ZV9vZl9iaXJ0aCcsIFRZUEVTLkRhdGUsIHsgbnVsbGFibGU6IGZhbHNlIH0pO1xuICAgKlxuICAgKiAvLyBFeGVjdXRlIGEgYnVsayBsb2FkIHdpdGggYSBwcmVkZWZpbmVkIGxpc3Qgb2Ygcm93cy5cbiAgICogLy9cbiAgICogLy8gTm90ZSB0aGF0IHRoZXNlIHJvd3MgYXJlIGhlbGQgaW4gbWVtb3J5IHVudGlsIHRoZVxuICAgKiAvLyBidWxrIGxvYWQgd2FzIHBlcmZvcm1lZCwgc28gaWYgeW91IG5lZWQgdG8gd3JpdGUgYSBsYXJnZVxuICAgKiAvLyBudW1iZXIgb2Ygcm93cyAoZS5nLiBieSByZWFkaW5nIGZyb20gYSBDU1YgZmlsZSksXG4gICAqIC8vIHBhc3NpbmcgYW4gYEFzeW5jSXRlcmFibGVgIGlzIGFkdmlzYWJsZSB0byBrZWVwIG1lbW9yeSB1c2FnZSBsb3cuXG4gICAqIGNvbm5lY3Rpb24uZXhlY0J1bGtMb2FkKGJ1bGtMb2FkLCBbXG4gICAqICAgeyAnZmlyc3RfbmFtZSc6ICdTdGV2ZScsICdsYXN0X25hbWUnOiAnSm9icycsICdkYXlfb2ZfYmlydGgnOiBuZXcgRGF0ZSgnMDItMjQtMTk1NScpIH0sXG4gICAqICAgeyAnZmlyc3RfbmFtZSc6ICdCaWxsJywgJ2xhc3RfbmFtZSc6ICdHYXRlcycsICdkYXlfb2ZfYmlydGgnOiBuZXcgRGF0ZSgnMTAtMjgtMTk1NScpIH1cbiAgICogXSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gYnVsa0xvYWQgQSBwcmV2aW91c2x5IGNyZWF0ZWQgW1tCdWxrTG9hZF1dLlxuICAgKiBAcGFyYW0gcm93cyBBIFtbSXRlcmFibGVdXSBvciBbW0FzeW5jSXRlcmFibGVdXSB0aGF0IGNvbnRhaW5zIHRoZSByb3dzIHRoYXQgc2hvdWxkIGJlIGJ1bGsgbG9hZGVkLlxuICAgKi9cbiAgZXhlY0J1bGtMb2FkKGJ1bGtMb2FkOiBCdWxrTG9hZCwgcm93czogQXN5bmNJdGVyYWJsZTx1bmtub3duW10gfCB7IFtjb2x1bW5OYW1lOiBzdHJpbmddOiB1bmtub3duIH0+IHwgSXRlcmFibGU8dW5rbm93bltdIHwgeyBbY29sdW1uTmFtZTogc3RyaW5nXTogdW5rbm93biB9Pik6IHZvaWRcblxuICBleGVjQnVsa0xvYWQoYnVsa0xvYWQ6IEJ1bGtMb2FkLCByb3dzPzogQXN5bmNJdGVyYWJsZTx1bmtub3duW10gfCB7IFtjb2x1bW5OYW1lOiBzdHJpbmddOiB1bmtub3duIH0+IHwgSXRlcmFibGU8dW5rbm93bltdIHwgeyBbY29sdW1uTmFtZTogc3RyaW5nXTogdW5rbm93biB9Pikge1xuICAgIGJ1bGtMb2FkLmV4ZWN1dGlvblN0YXJ0ZWQgPSB0cnVlO1xuXG4gICAgaWYgKHJvd3MpIHtcbiAgICAgIGlmIChidWxrTG9hZC5zdHJlYW1pbmdNb2RlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbm5lY3Rpb24uZXhlY0J1bGtMb2FkIGNhbid0IGJlIGNhbGxlZCB3aXRoIGEgQnVsa0xvYWQgdGhhdCB3YXMgcHV0IGluIHN0cmVhbWluZyBtb2RlLlwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJ1bGtMb2FkLmZpcnN0Um93V3JpdHRlbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb25uZWN0aW9uLmV4ZWNCdWxrTG9hZCBjYW4ndCBiZSBjYWxsZWQgd2l0aCBhIEJ1bGtMb2FkIHRoYXQgYWxyZWFkeSBoYXMgcm93cyB3cml0dGVuIHRvIGl0LlwiKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgcm93U3RyZWFtID0gUmVhZGFibGUuZnJvbShyb3dzKTtcblxuICAgICAgLy8gRGVzdHJveSB0aGUgcGFja2V0IHRyYW5zZm9ybSBpZiBhbiBlcnJvciBoYXBwZW5zIGluIHRoZSByb3cgc3RyZWFtLFxuICAgICAgLy8gZS5nLiBpZiBhbiBlcnJvciBpcyB0aHJvd24gZnJvbSB3aXRoaW4gYSBnZW5lcmF0b3Igb3Igc3RyZWFtLlxuICAgICAgcm93U3RyZWFtLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgICAgYnVsa0xvYWQucm93VG9QYWNrZXRUcmFuc2Zvcm0uZGVzdHJveShlcnIpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIERlc3Ryb3kgdGhlIHJvdyBzdHJlYW0gaWYgYW4gZXJyb3IgaGFwcGVucyBpbiB0aGUgcGFja2V0IHRyYW5zZm9ybSxcbiAgICAgIC8vIGUuZy4gaWYgdGhlIGJ1bGsgbG9hZCBpcyBjYW5jZWxsZWQuXG4gICAgICBidWxrTG9hZC5yb3dUb1BhY2tldFRyYW5zZm9ybS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgIHJvd1N0cmVhbS5kZXN0cm95KGVycik7XG4gICAgICB9KTtcblxuICAgICAgcm93U3RyZWFtLnBpcGUoYnVsa0xvYWQucm93VG9QYWNrZXRUcmFuc2Zvcm0pO1xuICAgIH0gZWxzZSBpZiAoIWJ1bGtMb2FkLnN0cmVhbWluZ01vZGUpIHtcbiAgICAgIC8vIElmIHRoZSBidWxrbG9hZCB3YXMgbm90IHB1dCBpbnRvIHN0cmVhbWluZyBtb2RlIGJ5IHRoZSB1c2VyLFxuICAgICAgLy8gd2UgZW5kIHRoZSByb3dUb1BhY2tldFRyYW5zZm9ybSBoZXJlIGZvciB0aGVtLlxuICAgICAgLy9cbiAgICAgIC8vIElmIGl0IHdhcyBwdXQgaW50byBzdHJlYW1pbmcgbW9kZSwgaXQncyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5XG4gICAgICAvLyB0byBlbmQgdGhlIHN0cmVhbS5cbiAgICAgIGJ1bGtMb2FkLnJvd1RvUGFja2V0VHJhbnNmb3JtLmVuZCgpO1xuICAgIH1cblxuICAgIGNvbnN0IG9uQ2FuY2VsID0gKCkgPT4ge1xuICAgICAgcmVxdWVzdC5jYW5jZWwoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcGF5bG9hZCA9IG5ldyBCdWxrTG9hZFBheWxvYWQoYnVsa0xvYWQpO1xuXG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGJ1bGtMb2FkLmdldEJ1bGtJbnNlcnRTcWwoKSwgKGVycm9yOiAoRXJyb3IgJiB7IGNvZGU/OiBzdHJpbmcgfSkgfCBudWxsIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBidWxrTG9hZC5yZW1vdmVMaXN0ZW5lcignY2FuY2VsJywgb25DYW5jZWwpO1xuXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09ICdVTktOT1dOJykge1xuICAgICAgICAgIGVycm9yLm1lc3NhZ2UgKz0gJyBUaGlzIGlzIGxpa2VseSBiZWNhdXNlIHRoZSBzY2hlbWEgb2YgdGhlIEJ1bGtMb2FkIGRvZXMgbm90IG1hdGNoIHRoZSBzY2hlbWEgb2YgdGhlIHRhYmxlIHlvdSBhcmUgYXR0ZW1wdGluZyB0byBpbnNlcnQgaW50by4nO1xuICAgICAgICB9XG4gICAgICAgIGJ1bGtMb2FkLmVycm9yID0gZXJyb3I7XG4gICAgICAgIGJ1bGtMb2FkLmNhbGxiYWNrKGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm1ha2VSZXF1ZXN0KGJ1bGtMb2FkLCBUWVBFLkJVTEtfTE9BRCwgcGF5bG9hZCk7XG4gICAgfSk7XG5cbiAgICBidWxrTG9hZC5vbmNlKCdjYW5jZWwnLCBvbkNhbmNlbCk7XG5cbiAgICB0aGlzLmV4ZWNTcWxCYXRjaChyZXF1ZXN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlIHRoZSBTUUwgcmVwcmVzZW50ZWQgYnkgdGhlIHJlcXVlc3QuXG4gICAqXG4gICAqIFRoZSByZXF1ZXN0IGNhbiB0aGVuIGJlIHVzZWQgaW4gc3Vic2VxdWVudCBjYWxscyB0b1xuICAgKiBbW2V4ZWN1dGVdXSBhbmQgW1t1bnByZXBhcmVdXVxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdCBBIFtbUmVxdWVzdF1dIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlcXVlc3QuXG4gICAqICAgUGFyYW1ldGVycyBvbmx5IHJlcXVpcmUgYSBuYW1lIGFuZCB0eXBlLiBQYXJhbWV0ZXIgdmFsdWVzIGFyZSBpZ25vcmVkLlxuICAgKi9cbiAgcHJlcGFyZShyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogUGFyYW1ldGVyW10gPSBbXTtcblxuICAgIHBhcmFtZXRlcnMucHVzaCh7XG4gICAgICB0eXBlOiBUWVBFUy5JbnQsXG4gICAgICBuYW1lOiAnaGFuZGxlJyxcbiAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICBvdXRwdXQ6IHRydWUsXG4gICAgICBsZW5ndGg6IHVuZGVmaW5lZCxcbiAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgc2NhbGU6IHVuZGVmaW5lZFxuICAgIH0pO1xuXG4gICAgcGFyYW1ldGVycy5wdXNoKHtcbiAgICAgIHR5cGU6IFRZUEVTLk5WYXJDaGFyLFxuICAgICAgbmFtZTogJ3BhcmFtcycsXG4gICAgICB2YWx1ZTogcmVxdWVzdC5wYXJhbWV0ZXJzLmxlbmd0aCA/IHJlcXVlc3QubWFrZVBhcmFtc1BhcmFtZXRlcihyZXF1ZXN0LnBhcmFtZXRlcnMpIDogbnVsbCxcbiAgICAgIG91dHB1dDogZmFsc2UsXG4gICAgICBsZW5ndGg6IHVuZGVmaW5lZCxcbiAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgc2NhbGU6IHVuZGVmaW5lZFxuICAgIH0pO1xuXG4gICAgcGFyYW1ldGVycy5wdXNoKHtcbiAgICAgIHR5cGU6IFRZUEVTLk5WYXJDaGFyLFxuICAgICAgbmFtZTogJ3N0bXQnLFxuICAgICAgdmFsdWU6IHJlcXVlc3Quc3FsVGV4dE9yUHJvY2VkdXJlLFxuICAgICAgb3V0cHV0OiBmYWxzZSxcbiAgICAgIGxlbmd0aDogdW5kZWZpbmVkLFxuICAgICAgcHJlY2lzaW9uOiB1bmRlZmluZWQsXG4gICAgICBzY2FsZTogdW5kZWZpbmVkXG4gICAgfSk7XG5cbiAgICByZXF1ZXN0LnByZXBhcmluZyA9IHRydWU7XG4gICAgLy8gVE9ETzogV2UgbmVlZCB0byBjbGVhbiB1cCB0aGlzIGV2ZW50IGhhbmRsZXIsIG90aGVyd2lzZSB0aGlzIGxlYWtzIG1lbW9yeVxuICAgIHJlcXVlc3Qub24oJ3JldHVyblZhbHVlJywgKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgaWYgKG5hbWUgPT09ICdoYW5kbGUnKSB7XG4gICAgICAgIHJlcXVlc3QuaGFuZGxlID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXF1ZXN0LmVycm9yID0gbmV3IFJlcXVlc3RFcnJvcihgVGVkaW91cyA+IFVuZXhwZWN0ZWQgb3V0cHV0IHBhcmFtZXRlciAke25hbWV9IGZyb20gc3BfcHJlcGFyZWApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0LCBUWVBFLlJQQ19SRVFVRVNULCBuZXcgUnBjUmVxdWVzdFBheWxvYWQoJ3NwX3ByZXBhcmUnLCBwYXJhbWV0ZXJzLCB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKSwgdGhpcy5jb25maWcub3B0aW9ucywgdGhpcy5kYXRhYmFzZUNvbGxhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2UgdGhlIFNRTCBTZXJ2ZXIgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIHByZXZpb3VzbHkgcHJlcGFyZWQgcmVxdWVzdC5cbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3QgQSBbW1JlcXVlc3RdXSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXF1ZXN0LlxuICAgKiAgIFBhcmFtZXRlcnMgb25seSByZXF1aXJlIGEgbmFtZSBhbmQgdHlwZS5cbiAgICogICBQYXJhbWV0ZXIgdmFsdWVzIGFyZSBpZ25vcmVkLlxuICAgKi9cbiAgdW5wcmVwYXJlKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBQYXJhbWV0ZXJbXSA9IFtdO1xuXG4gICAgcGFyYW1ldGVycy5wdXNoKHtcbiAgICAgIHR5cGU6IFRZUEVTLkludCxcbiAgICAgIG5hbWU6ICdoYW5kbGUnLFxuICAgICAgLy8gVE9ETzogQWJvcnQgaWYgYHJlcXVlc3QuaGFuZGxlYCBpcyBub3Qgc2V0XG4gICAgICB2YWx1ZTogcmVxdWVzdC5oYW5kbGUsXG4gICAgICBvdXRwdXQ6IGZhbHNlLFxuICAgICAgbGVuZ3RoOiB1bmRlZmluZWQsXG4gICAgICBwcmVjaXNpb246IHVuZGVmaW5lZCxcbiAgICAgIHNjYWxlOiB1bmRlZmluZWRcbiAgICB9KTtcblxuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5SUENfUkVRVUVTVCwgbmV3IFJwY1JlcXVlc3RQYXlsb2FkKCdzcF91bnByZXBhcmUnLCBwYXJhbWV0ZXJzLCB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKSwgdGhpcy5jb25maWcub3B0aW9ucywgdGhpcy5kYXRhYmFzZUNvbGxhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgcHJldmlvdXNseSBwcmVwYXJlZCBTUUwsIHVzaW5nIHRoZSBzdXBwbGllZCBwYXJhbWV0ZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdCBBIHByZXZpb3VzbHkgcHJlcGFyZWQgW1tSZXF1ZXN0XV0uXG4gICAqIEBwYXJhbSBwYXJhbWV0ZXJzICBBbiBvYmplY3Qgd2hvc2UgbmFtZXMgY29ycmVzcG9uZCB0byB0aGUgbmFtZXMgb2ZcbiAgICogICBwYXJhbWV0ZXJzIHRoYXQgd2VyZSBhZGRlZCB0byB0aGUgW1tSZXF1ZXN0XV0gYmVmb3JlIGl0IHdhcyBwcmVwYXJlZC5cbiAgICogICBUaGUgb2JqZWN0J3MgdmFsdWVzIGFyZSBwYXNzZWQgYXMgdGhlIHBhcmFtZXRlcnMnIHZhbHVlcyB3aGVuIHRoZVxuICAgKiAgIHJlcXVlc3QgaXMgZXhlY3V0ZWQuXG4gICAqL1xuICBleGVjdXRlKHJlcXVlc3Q6IFJlcXVlc3QsIHBhcmFtZXRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSkge1xuICAgIGNvbnN0IGV4ZWN1dGVQYXJhbWV0ZXJzOiBQYXJhbWV0ZXJbXSA9IFtdO1xuXG4gICAgZXhlY3V0ZVBhcmFtZXRlcnMucHVzaCh7XG4gICAgICB0eXBlOiBUWVBFUy5JbnQsXG4gICAgICBuYW1lOiAnaGFuZGxlJyxcbiAgICAgIC8vIFRPRE86IEFib3J0IGlmIGByZXF1ZXN0LmhhbmRsZWAgaXMgbm90IHNldFxuICAgICAgdmFsdWU6IHJlcXVlc3QuaGFuZGxlLFxuICAgICAgb3V0cHV0OiBmYWxzZSxcbiAgICAgIGxlbmd0aDogdW5kZWZpbmVkLFxuICAgICAgcHJlY2lzaW9uOiB1bmRlZmluZWQsXG4gICAgICBzY2FsZTogdW5kZWZpbmVkXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJlcXVlc3QucGFyYW1ldGVycy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjb25zdCBwYXJhbWV0ZXIgPSByZXF1ZXN0LnBhcmFtZXRlcnNbaV07XG5cbiAgICAgICAgZXhlY3V0ZVBhcmFtZXRlcnMucHVzaCh7XG4gICAgICAgICAgLi4ucGFyYW1ldGVyLFxuICAgICAgICAgIHZhbHVlOiBwYXJhbWV0ZXIudHlwZS52YWxpZGF0ZShwYXJhbWV0ZXJzID8gcGFyYW1ldGVyc1twYXJhbWV0ZXIubmFtZV0gOiBudWxsLCB0aGlzLmRhdGFiYXNlQ29sbGF0aW9uKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICByZXF1ZXN0LmVycm9yID0gZXJyb3I7XG5cbiAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICB0aGlzLmRlYnVnLmxvZyhlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgcmVxdWVzdC5jYWxsYmFjayhlcnJvcik7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5SUENfUkVRVUVTVCwgbmV3IFJwY1JlcXVlc3RQYXlsb2FkKCdzcF9leGVjdXRlJywgZXhlY3V0ZVBhcmFtZXRlcnMsIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpLCB0aGlzLmNvbmZpZy5vcHRpb25zLCB0aGlzLmRhdGFiYXNlQ29sbGF0aW9uKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCBhIHN0b3JlZCBwcm9jZWR1cmUgcmVwcmVzZW50ZWQgYnkgW1tSZXF1ZXN0XV0uXG4gICAqXG4gICAqIEBwYXJhbSByZXF1ZXN0IEEgW1tSZXF1ZXN0XV0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVxdWVzdC5cbiAgICovXG4gIGNhbGxQcm9jZWR1cmUocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIHRyeSB7XG4gICAgICByZXF1ZXN0LnZhbGlkYXRlUGFyYW1ldGVycyh0aGlzLmRhdGFiYXNlQ29sbGF0aW9uKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICByZXF1ZXN0LmVycm9yID0gZXJyb3I7XG5cbiAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICB0aGlzLmRlYnVnLmxvZyhlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgcmVxdWVzdC5jYWxsYmFjayhlcnJvcik7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5SUENfUkVRVUVTVCwgbmV3IFJwY1JlcXVlc3RQYXlsb2FkKHJlcXVlc3Quc3FsVGV4dE9yUHJvY2VkdXJlISwgcmVxdWVzdC5wYXJhbWV0ZXJzLCB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKSwgdGhpcy5jb25maWcub3B0aW9ucywgdGhpcy5kYXRhYmFzZUNvbGxhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFja1xuICAgKiBAcGFyYW0gbmFtZSBBIHN0cmluZyByZXByZXNlbnRpbmcgYSBuYW1lIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogICBPcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIGFuIGVtcHR5IHN0cmluZy4gUmVxdWlyZWQgd2hlbiBgaXNvbGF0aW9uTGV2ZWxgXG4gICAqICAgaXMgcHJlc2VudC5cbiAgICogQHBhcmFtIGlzb2xhdGlvbkxldmVsIFRoZSBpc29sYXRpb24gbGV2ZWwgdGhhdCB0aGUgdHJhbnNhY3Rpb24gaXMgdG8gYmUgcnVuIHdpdGguXG4gICAqXG4gICAqICAgVGhlIGlzb2xhdGlvbiBsZXZlbHMgYXJlIGF2YWlsYWJsZSBmcm9tIGByZXF1aXJlKCd0ZWRpb3VzJykuSVNPTEFUSU9OX0xFVkVMYC5cbiAgICogICAqIGBSRUFEX1VOQ09NTUlUVEVEYFxuICAgKiAgICogYFJFQURfQ09NTUlUVEVEYFxuICAgKiAgICogYFJFUEVBVEFCTEVfUkVBRGBcbiAgICogICAqIGBTRVJJQUxJWkFCTEVgXG4gICAqICAgKiBgU05BUFNIT1RgXG4gICAqXG4gICAqICAgT3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB0aGUgQ29ubmVjdGlvbidzIGlzb2xhdGlvbiBsZXZlbC5cbiAgICovXG4gIGJlZ2luVHJhbnNhY3Rpb24oY2FsbGJhY2s6IEJlZ2luVHJhbnNhY3Rpb25DYWxsYmFjaywgbmFtZSA9ICcnLCBpc29sYXRpb25MZXZlbCA9IHRoaXMuY29uZmlnLm9wdGlvbnMuaXNvbGF0aW9uTGV2ZWwpIHtcbiAgICBhc3NlcnRWYWxpZElzb2xhdGlvbkxldmVsKGlzb2xhdGlvbkxldmVsLCAnaXNvbGF0aW9uTGV2ZWwnKTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKG5hbWUsIGlzb2xhdGlvbkxldmVsKTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb24gPCAnN18yJykge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY1NxbEJhdGNoKG5ldyBSZXF1ZXN0KCdTRVQgVFJBTlNBQ1RJT04gSVNPTEFUSU9OIExFVkVMICcgKyAodHJhbnNhY3Rpb24uaXNvbGF0aW9uTGV2ZWxUb1RTUUwoKSkgKyAnO0JFR0lOIFRSQU4gJyArIHRyYW5zYWN0aW9uLm5hbWUsIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRlcHRoKys7XG4gICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRGVwdGggPT09IDEpIHtcbiAgICAgICAgICB0aGlzLmluVHJhbnNhY3Rpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHVuZGVmaW5lZCwgKGVycikgPT4ge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVyciwgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCkpO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0KHJlcXVlc3QsIFRZUEUuVFJBTlNBQ1RJT05fTUFOQUdFUiwgdHJhbnNhY3Rpb24uYmVnaW5QYXlsb2FkKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpKSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tbWl0IGEgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFRoZXJlIHNob3VsZCBiZSBhbiBhY3RpdmUgdHJhbnNhY3Rpb24gLSB0aGF0IGlzLCBbW2JlZ2luVHJhbnNhY3Rpb25dXVxuICAgKiBzaG91bGQgaGF2ZSBiZWVuIHByZXZpb3VzbHkgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICogQHBhcmFtIG5hbWUgQSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgbmFtZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgdHJhbnNhY3Rpb24uXG4gICAqICAgT3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byBhbiBlbXB0eSBzdHJpbmcuIFJlcXVpcmVkIHdoZW4gYGlzb2xhdGlvbkxldmVsYGlzIHByZXNlbnQuXG4gICAqL1xuICBjb21taXRUcmFuc2FjdGlvbihjYWxsYmFjazogQ29tbWl0VHJhbnNhY3Rpb25DYWxsYmFjaywgbmFtZSA9ICcnKSB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24obmFtZSk7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiA8ICc3XzInKSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjU3FsQmF0Y2gobmV3IFJlcXVlc3QoJ0NPTU1JVCBUUkFOICcgKyB0cmFuc2FjdGlvbi5uYW1lLCAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25EZXB0aC0tO1xuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRlcHRoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5pblRyYW5zYWN0aW9uID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgfSkpO1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodW5kZWZpbmVkLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5UUkFOU0FDVElPTl9NQU5BR0VSLCB0cmFuc2FjdGlvbi5jb21taXRQYXlsb2FkKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpKSk7XG4gIH1cblxuICAvKipcbiAgICogUm9sbGJhY2sgYSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogVGhlcmUgc2hvdWxkIGJlIGFuIGFjdGl2ZSB0cmFuc2FjdGlvbiAtIHRoYXQgaXMsIFtbYmVnaW5UcmFuc2FjdGlvbl1dXG4gICAqIHNob3VsZCBoYXZlIGJlZW4gcHJldmlvdXNseSBjYWxsZWQuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFja1xuICAgKiBAcGFyYW0gbmFtZSBBIHN0cmluZyByZXByZXNlbnRpbmcgYSBuYW1lIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogICBPcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIGFuIGVtcHR5IHN0cmluZy5cbiAgICogICBSZXF1aXJlZCB3aGVuIGBpc29sYXRpb25MZXZlbGAgaXMgcHJlc2VudC5cbiAgICovXG4gIHJvbGxiYWNrVHJhbnNhY3Rpb24oY2FsbGJhY2s6IFJvbGxiYWNrVHJhbnNhY3Rpb25DYWxsYmFjaywgbmFtZSA9ICcnKSB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24obmFtZSk7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiA8ICc3XzInKSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjU3FsQmF0Y2gobmV3IFJlcXVlc3QoJ1JPTExCQUNLIFRSQU4gJyArIHRyYW5zYWN0aW9uLm5hbWUsIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRlcHRoLS07XG4gICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRGVwdGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLmluVHJhbnNhY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgfSkpO1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodW5kZWZpbmVkLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5UUkFOU0FDVElPTl9NQU5BR0VSLCB0cmFuc2FjdGlvbi5yb2xsYmFja1BheWxvYWQodGhpcy5jdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBzYXZlcG9pbnQgd2l0aGluIGEgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFRoZXJlIHNob3VsZCBiZSBhbiBhY3RpdmUgdHJhbnNhY3Rpb24gLSB0aGF0IGlzLCBbW2JlZ2luVHJhbnNhY3Rpb25dXVxuICAgKiBzaG91bGQgaGF2ZSBiZWVuIHByZXZpb3VzbHkgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICogQHBhcmFtIG5hbWUgQSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgbmFtZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgdHJhbnNhY3Rpb24uXFxcbiAgICogICBPcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIGFuIGVtcHR5IHN0cmluZy5cbiAgICogICBSZXF1aXJlZCB3aGVuIGBpc29sYXRpb25MZXZlbGAgaXMgcHJlc2VudC5cbiAgICovXG4gIHNhdmVUcmFuc2FjdGlvbihjYWxsYmFjazogU2F2ZVRyYW5zYWN0aW9uQ2FsbGJhY2ssIG5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKG5hbWUpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb24gPCAnN18yJykge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY1NxbEJhdGNoKG5ldyBSZXF1ZXN0KCdTQVZFIFRSQU4gJyArIHRyYW5zYWN0aW9uLm5hbWUsIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRlcHRoKys7XG4gICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICB9KSk7XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdCh1bmRlZmluZWQsIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0LCBUWVBFLlRSQU5TQUNUSU9OX01BTkFHRVIsIHRyYW5zYWN0aW9uLnNhdmVQYXlsb2FkKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpKSk7XG4gIH1cblxuICAvKipcbiAgICogUnVuIHRoZSBnaXZlbiBjYWxsYmFjayBhZnRlciBzdGFydGluZyBhIHRyYW5zYWN0aW9uLCBhbmQgY29tbWl0IG9yXG4gICAqIHJvbGxiYWNrIHRoZSB0cmFuc2FjdGlvbiBhZnRlcndhcmRzLlxuICAgKlxuICAgKiBUaGlzIGlzIGEgaGVscGVyIHRoYXQgZW1wbG95cyBbW2JlZ2luVHJhbnNhY3Rpb25dXSwgW1tjb21taXRUcmFuc2FjdGlvbl1dLFxuICAgKiBbW3JvbGxiYWNrVHJhbnNhY3Rpb25dXSwgYW5kIFtbc2F2ZVRyYW5zYWN0aW9uXV0gdG8gZ3JlYXRseSBzaW1wbGlmeSB0aGVcbiAgICogdXNlIG9mIGRhdGFiYXNlIHRyYW5zYWN0aW9ucyBhbmQgYXV0b21hdGljYWxseSBoYW5kbGUgdHJhbnNhY3Rpb24gbmVzdGluZy5cbiAgICpcbiAgICogQHBhcmFtIGNiXG4gICAqIEBwYXJhbSBpc29sYXRpb25MZXZlbFxuICAgKiAgIFRoZSBpc29sYXRpb24gbGV2ZWwgdGhhdCB0aGUgdHJhbnNhY3Rpb24gaXMgdG8gYmUgcnVuIHdpdGguXG4gICAqXG4gICAqICAgVGhlIGlzb2xhdGlvbiBsZXZlbHMgYXJlIGF2YWlsYWJsZSBmcm9tIGByZXF1aXJlKCd0ZWRpb3VzJykuSVNPTEFUSU9OX0xFVkVMYC5cbiAgICogICAqIGBSRUFEX1VOQ09NTUlUVEVEYFxuICAgKiAgICogYFJFQURfQ09NTUlUVEVEYFxuICAgKiAgICogYFJFUEVBVEFCTEVfUkVBRGBcbiAgICogICAqIGBTRVJJQUxJWkFCTEVgXG4gICAqICAgKiBgU05BUFNIT1RgXG4gICAqXG4gICAqICAgT3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB0aGUgQ29ubmVjdGlvbidzIGlzb2xhdGlvbiBsZXZlbC5cbiAgICovXG4gIHRyYW5zYWN0aW9uKGNiOiAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIHR4RG9uZT86IDxUIGV4dGVuZHMgVHJhbnNhY3Rpb25Eb25lQ2FsbGJhY2s+KGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkLCBkb25lOiBULCAuLi5hcmdzOiBDYWxsYmFja1BhcmFtZXRlcnM8VD4pID0+IHZvaWQpID0+IHZvaWQsIGlzb2xhdGlvbkxldmVsPzogdHlwZW9mIElTT0xBVElPTl9MRVZFTFtrZXlvZiB0eXBlb2YgSVNPTEFUSU9OX0xFVkVMXSkge1xuICAgIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BjYmAgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlU2F2ZXBvaW50ID0gdGhpcy5pblRyYW5zYWN0aW9uO1xuICAgIGNvbnN0IG5hbWUgPSAnX3RlZGlvdXNfJyArIChjcnlwdG8ucmFuZG9tQnl0ZXMoMTApLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgY29uc3QgdHhEb25lOiA8VCBleHRlbmRzIFRyYW5zYWN0aW9uRG9uZUNhbGxiYWNrPihlcnI6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCwgZG9uZTogVCwgLi4uYXJnczogQ2FsbGJhY2tQYXJhbWV0ZXJzPFQ+KSA9PiB2b2lkID0gKGVyciwgZG9uZSwgLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBpZiAodGhpcy5pblRyYW5zYWN0aW9uICYmIHRoaXMuc3RhdGUgPT09IHRoaXMuU1RBVEUuTE9HR0VEX0lOKSB7XG4gICAgICAgICAgdGhpcy5yb2xsYmFja1RyYW5zYWN0aW9uKCh0eEVycikgPT4ge1xuICAgICAgICAgICAgZG9uZSh0eEVyciB8fCBlcnIsIC4uLmFyZ3MpO1xuICAgICAgICAgIH0sIG5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRvbmUoZXJyLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh1c2VTYXZlcG9pbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiA8ICc3XzInKSB7XG4gICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRlcHRoLS07XG4gICAgICAgIH1cbiAgICAgICAgZG9uZShudWxsLCAuLi5hcmdzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29tbWl0VHJhbnNhY3Rpb24oKHR4RXJyKSA9PiB7XG4gICAgICAgICAgZG9uZSh0eEVyciwgLi4uYXJncyk7XG4gICAgICAgIH0sIG5hbWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAodXNlU2F2ZXBvaW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5zYXZlVHJhbnNhY3Rpb24oKGVycikgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIGNiKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNvbGF0aW9uTGV2ZWwpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5leGVjU3FsQmF0Y2gobmV3IFJlcXVlc3QoJ1NFVCB0cmFuc2FjdGlvbiBpc29sYXRpb24gbGV2ZWwgJyArIHRoaXMuZ2V0SXNvbGF0aW9uTGV2ZWxUZXh0KGlzb2xhdGlvbkxldmVsKSwgKGVycikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNiKGVyciwgdHhEb25lKTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGNiKG51bGwsIHR4RG9uZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5iZWdpblRyYW5zYWN0aW9uKChlcnIpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiBjYihlcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNiKG51bGwsIHR4RG9uZSk7XG4gICAgICB9LCBuYW1lLCBpc29sYXRpb25MZXZlbCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBtYWtlUmVxdWVzdChyZXF1ZXN0OiBSZXF1ZXN0IHwgQnVsa0xvYWQsIHBhY2tldFR5cGU6IG51bWJlciwgcGF5bG9hZDogKEl0ZXJhYmxlPEJ1ZmZlcj4gfCBBc3luY0l0ZXJhYmxlPEJ1ZmZlcj4pICYgeyB0b1N0cmluZzogKGluZGVudD86IHN0cmluZykgPT4gc3RyaW5nIH0pIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gdGhpcy5TVEFURS5MT0dHRURfSU4pIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnUmVxdWVzdHMgY2FuIG9ubHkgYmUgbWFkZSBpbiB0aGUgJyArIHRoaXMuU1RBVEUuTE9HR0VEX0lOLm5hbWUgKyAnIHN0YXRlLCBub3QgdGhlICcgKyB0aGlzLnN0YXRlLm5hbWUgKyAnIHN0YXRlJztcbiAgICAgIHRoaXMuZGVidWcubG9nKG1lc3NhZ2UpO1xuICAgICAgcmVxdWVzdC5jYWxsYmFjayhuZXcgUmVxdWVzdEVycm9yKG1lc3NhZ2UsICdFSU5WQUxJRFNUQVRFJykpO1xuICAgIH0gZWxzZSBpZiAocmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgIHJlcXVlc3QuY2FsbGJhY2sobmV3IFJlcXVlc3RFcnJvcignQ2FuY2VsZWQuJywgJ0VDQU5DRUwnKSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHBhY2tldFR5cGUgPT09IFRZUEUuU1FMX0JBVENIKSB7XG4gICAgICAgIHRoaXMuaXNTcWxCYXRjaCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlzU3FsQmF0Y2ggPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICAgIHJlcXVlc3QuY29ubmVjdGlvbiEgPSB0aGlzO1xuICAgICAgcmVxdWVzdC5yb3dDb3VudCEgPSAwO1xuICAgICAgcmVxdWVzdC5yb3dzISA9IFtdO1xuICAgICAgcmVxdWVzdC5yc3QhID0gW107XG5cbiAgICAgIGNvbnN0IG9uQ2FuY2VsID0gKCkgPT4ge1xuICAgICAgICBwYXlsb2FkU3RyZWFtLnVucGlwZShtZXNzYWdlKTtcbiAgICAgICAgcGF5bG9hZFN0cmVhbS5kZXN0cm95KG5ldyBSZXF1ZXN0RXJyb3IoJ0NhbmNlbGVkLicsICdFQ0FOQ0VMJykpO1xuXG4gICAgICAgIC8vIHNldCB0aGUgaWdub3JlIGJpdCBhbmQgZW5kIHRoZSBtZXNzYWdlLlxuICAgICAgICBtZXNzYWdlLmlnbm9yZSA9IHRydWU7XG4gICAgICAgIG1lc3NhZ2UuZW5kKCk7XG5cbiAgICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBSZXF1ZXN0ICYmIHJlcXVlc3QucGF1c2VkKSB7XG4gICAgICAgICAgLy8gcmVzdW1lIHRoZSByZXF1ZXN0IGlmIGl0IHdhcyBwYXVzZWQgc28gd2UgY2FuIHJlYWQgdGhlIHJlbWFpbmluZyB0b2tlbnNcbiAgICAgICAgICByZXF1ZXN0LnJlc3VtZSgpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXF1ZXN0Lm9uY2UoJ2NhbmNlbCcsIG9uQ2FuY2VsKTtcblxuICAgICAgdGhpcy5jcmVhdGVSZXF1ZXN0VGltZXIoKTtcblxuICAgICAgY29uc3QgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKHsgdHlwZTogcGFja2V0VHlwZSwgcmVzZXRDb25uZWN0aW9uOiB0aGlzLnJlc2V0Q29ubmVjdGlvbk9uTmV4dFJlcXVlc3QgfSk7XG4gICAgICB0aGlzLm1lc3NhZ2VJby5vdXRnb2luZ01lc3NhZ2VTdHJlYW0ud3JpdGUobWVzc2FnZSk7XG4gICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlNFTlRfQ0xJRU5UX1JFUVVFU1QpO1xuXG4gICAgICBtZXNzYWdlLm9uY2UoJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgICAgcmVxdWVzdC5yZW1vdmVMaXN0ZW5lcignY2FuY2VsJywgb25DYW5jZWwpO1xuICAgICAgICByZXF1ZXN0Lm9uY2UoJ2NhbmNlbCcsIHRoaXMuX2NhbmNlbEFmdGVyUmVxdWVzdFNlbnQpO1xuXG4gICAgICAgIHRoaXMucmVzZXRDb25uZWN0aW9uT25OZXh0UmVxdWVzdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRlYnVnLnBheWxvYWQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIHBheWxvYWQhLnRvU3RyaW5nKCcgICcpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwYXlsb2FkU3RyZWFtID0gUmVhZGFibGUuZnJvbShwYXlsb2FkKTtcbiAgICAgIHBheWxvYWRTdHJlYW0ub25jZSgnZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcGF5bG9hZFN0cmVhbS51bnBpcGUobWVzc2FnZSk7XG5cbiAgICAgICAgLy8gT25seSBzZXQgYSByZXF1ZXN0IGVycm9yIGlmIG5vIGVycm9yIHdhcyBzZXQgeWV0LlxuICAgICAgICByZXF1ZXN0LmVycm9yID8/PSBlcnJvcjtcblxuICAgICAgICBtZXNzYWdlLmlnbm9yZSA9IHRydWU7XG4gICAgICAgIG1lc3NhZ2UuZW5kKCk7XG4gICAgICB9KTtcbiAgICAgIHBheWxvYWRTdHJlYW0ucGlwZShtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIGN1cnJlbnRseSBleGVjdXRlZCByZXF1ZXN0LlxuICAgKi9cbiAgY2FuY2VsKCkge1xuICAgIGlmICghdGhpcy5yZXF1ZXN0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMucmVxdWVzdC5jYW5jZWwoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgY29ubmVjdGlvbiB0byBpdHMgaW5pdGlhbCBzdGF0ZS5cbiAgICogQ2FuIGJlIHVzZWZ1bCBmb3IgY29ubmVjdGlvbiBwb29sIGltcGxlbWVudGF0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIGNhbGxiYWNrXG4gICAqL1xuICByZXNldChjYWxsYmFjazogUmVzZXRDYWxsYmFjaykge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdCh0aGlzLmdldEluaXRpYWxTcWwoKSwgKGVycikgPT4ge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiA8ICc3XzInKSB7XG4gICAgICAgIHRoaXMuaW5UcmFuc2FjdGlvbiA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlc2V0Q29ubmVjdGlvbk9uTmV4dFJlcXVlc3QgPSB0cnVlO1xuICAgIHRoaXMuZXhlY1NxbEJhdGNoKHJlcXVlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCkge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uRGVzY3JpcHRvcnNbdGhpcy50cmFuc2FjdGlvbkRlc2NyaXB0b3JzLmxlbmd0aCAtIDFdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRJc29sYXRpb25MZXZlbFRleHQoaXNvbGF0aW9uTGV2ZWw6IHR5cGVvZiBJU09MQVRJT05fTEVWRUxba2V5b2YgdHlwZW9mIElTT0xBVElPTl9MRVZFTF0pIHtcbiAgICBzd2l0Y2ggKGlzb2xhdGlvbkxldmVsKSB7XG4gICAgICBjYXNlIElTT0xBVElPTl9MRVZFTC5SRUFEX1VOQ09NTUlUVEVEOlxuICAgICAgICByZXR1cm4gJ3JlYWQgdW5jb21taXR0ZWQnO1xuICAgICAgY2FzZSBJU09MQVRJT05fTEVWRUwuUkVQRUFUQUJMRV9SRUFEOlxuICAgICAgICByZXR1cm4gJ3JlcGVhdGFibGUgcmVhZCc7XG4gICAgICBjYXNlIElTT0xBVElPTl9MRVZFTC5TRVJJQUxJWkFCTEU6XG4gICAgICAgIHJldHVybiAnc2VyaWFsaXphYmxlJztcbiAgICAgIGNhc2UgSVNPTEFUSU9OX0xFVkVMLlNOQVBTSE9UOlxuICAgICAgICByZXR1cm4gJ3NuYXBzaG90JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAncmVhZCBjb21taXR0ZWQnO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1RyYW5zaWVudEVycm9yKGVycm9yOiBBZ2dyZWdhdGVFcnJvciB8IENvbm5lY3Rpb25FcnJvcik6IGJvb2xlYW4ge1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBZ2dyZWdhdGVFcnJvcikge1xuICAgIGVycm9yID0gZXJyb3IuZXJyb3JzWzBdO1xuICB9XG4gIHJldHVybiAoZXJyb3IgaW5zdGFuY2VvZiBDb25uZWN0aW9uRXJyb3IpICYmICEhZXJyb3IuaXNUcmFuc2llbnQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbm5lY3Rpb247XG5tb2R1bGUuZXhwb3J0cyA9IENvbm5lY3Rpb247XG5cbkNvbm5lY3Rpb24ucHJvdG90eXBlLlNUQVRFID0ge1xuICBJTklUSUFMSVpFRDoge1xuICAgIG5hbWU6ICdJbml0aWFsaXplZCcsXG4gICAgZXZlbnRzOiB7fVxuICB9LFxuICBDT05ORUNUSU5HOiB7XG4gICAgbmFtZTogJ0Nvbm5lY3RpbmcnLFxuICAgIGVudGVyOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGlzZUNvbm5lY3Rpb24oKTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgU0VOVF9QUkVMT0dJTjoge1xuICAgIG5hbWU6ICdTZW50UHJlbG9naW4nLFxuICAgIGVudGVyOiBmdW5jdGlvbigpIHtcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBtZXNzYWdlQnVmZmVyID0gQnVmZmVyLmFsbG9jKDApO1xuXG4gICAgICAgIGxldCBtZXNzYWdlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm1lc3NhZ2VJby5yZWFkTWVzc2FnZSgpO1xuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNvY2tldEVycm9yKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGRhdGEgb2YgbWVzc2FnZSkge1xuICAgICAgICAgIG1lc3NhZ2VCdWZmZXIgPSBCdWZmZXIuY29uY2F0KFttZXNzYWdlQnVmZmVyLCBkYXRhXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmVsb2dpblBheWxvYWQgPSBuZXcgUHJlbG9naW5QYXlsb2FkKG1lc3NhZ2VCdWZmZXIpO1xuICAgICAgICB0aGlzLmRlYnVnLnBheWxvYWQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIHByZWxvZ2luUGF5bG9hZC50b1N0cmluZygnICAnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHByZWxvZ2luUGF5bG9hZC5mZWRBdXRoUmVxdWlyZWQgPT09IDEpIHtcbiAgICAgICAgICB0aGlzLmZlZEF1dGhSZXF1aXJlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJlbG9naW5QYXlsb2FkLmVuY3J5cHRpb25TdHJpbmcgPT09ICdPTicgfHwgcHJlbG9naW5QYXlsb2FkLmVuY3J5cHRpb25TdHJpbmcgPT09ICdSRVEnKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5vcHRpb25zLmVuY3J5cHQpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnY29ubmVjdCcsIG5ldyBDb25uZWN0aW9uRXJyb3IoXCJTZXJ2ZXIgcmVxdWlyZXMgZW5jcnlwdGlvbiwgc2V0ICdlbmNyeXB0JyBjb25maWcgb3B0aW9uIHRvIHRydWUuXCIsICdFRU5DUllQVCcpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuU0VOVF9UTFNTU0xORUdPVElBVElPTik7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1lc3NhZ2VJby5zdGFydFRscyh0aGlzLnNlY3VyZUNvbnRleHRPcHRpb25zLCB0aGlzLnJvdXRpbmdEYXRhPy5zZXJ2ZXIgPz8gdGhpcy5jb25maWcuc2VydmVyLCB0aGlzLmNvbmZpZy5vcHRpb25zLnRydXN0U2VydmVyQ2VydGlmaWNhdGUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zb2NrZXRFcnJvcihlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VuZExvZ2luN1BhY2tldCgpO1xuXG4gICAgICAgIGNvbnN0IHsgYXV0aGVudGljYXRpb24gfSA9IHRoaXMuY29uZmlnO1xuXG4gICAgICAgIHN3aXRjaCAoYXV0aGVudGljYXRpb24udHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktcGFzc3dvcmQnOlxuICAgICAgICAgIGNhc2UgJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLXZtJzpcbiAgICAgICAgICBjYXNlICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS1hcHAtc2VydmljZSc6XG4gICAgICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1zZXJ2aWNlLXByaW5jaXBhbC1zZWNyZXQnOlxuICAgICAgICAgIGNhc2UgJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktZGVmYXVsdCc6XG4gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlNFTlRfTE9HSU43X1dJVEhfRkVEQVVUSCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdudGxtJzpcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuU0VOVF9MT0dJTjdfV0lUSF9OVExNKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlNFTlRfTE9HSU43X1dJVEhfU1RBTkRBUkRfTE9HSU4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0pKCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBldmVudHM6IHtcbiAgICAgIHNvY2tldEVycm9yOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9LFxuICAgICAgY29ubmVjdFRpbWVvdXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIFJFUk9VVElORzoge1xuICAgIG5hbWU6ICdSZVJvdXRpbmcnLFxuICAgIGVudGVyOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuY2xlYW51cENvbm5lY3Rpb24oQ0xFQU5VUF9UWVBFLlJFRElSRUNUKTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgbWVzc2FnZTogZnVuY3Rpb24oKSB7XG4gICAgICB9LFxuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIHJlY29ubmVjdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuQ09OTkVDVElORyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBUUkFOU0lFTlRfRkFJTFVSRV9SRVRSWToge1xuICAgIG5hbWU6ICdUUkFOU0lFTlRfRkFJTFVSRV9SRVRSWScsXG4gICAgZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5jdXJUcmFuc2llbnRSZXRyeUNvdW50Kys7XG4gICAgICB0aGlzLmNsZWFudXBDb25uZWN0aW9uKENMRUFOVVBfVFlQRS5SRVRSWSk7XG4gICAgfSxcbiAgICBldmVudHM6IHtcbiAgICAgIG1lc3NhZ2U6IGZ1bmN0aW9uKCkge1xuICAgICAgfSxcbiAgICAgIHNvY2tldEVycm9yOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9LFxuICAgICAgY29ubmVjdFRpbWVvdXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICByZXRyeTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlUmV0cnlUaW1lcigpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgU0VOVF9UTFNTU0xORUdPVElBVElPTjoge1xuICAgIG5hbWU6ICdTZW50VExTU1NMTmVnb3RpYXRpb24nLFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgU0VOVF9MT0dJTjdfV0lUSF9TVEFOREFSRF9MT0dJTjoge1xuICAgIG5hbWU6ICdTZW50TG9naW43V2l0aFN0YW5kYXJkTG9naW4nLFxuICAgIGVudGVyOiBmdW5jdGlvbigpIHtcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBtZXNzYWdlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm1lc3NhZ2VJby5yZWFkTWVzc2FnZSgpO1xuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNvY2tldEVycm9yKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGVyID0gbmV3IExvZ2luN1Rva2VuSGFuZGxlcih0aGlzKTtcbiAgICAgICAgY29uc3QgdG9rZW5TdHJlYW1QYXJzZXIgPSB0aGlzLmNyZWF0ZVRva2VuU3RyZWFtUGFyc2VyKG1lc3NhZ2UsIGhhbmRsZXIpO1xuXG4gICAgICAgIGF3YWl0IG9uY2UodG9rZW5TdHJlYW1QYXJzZXIsICdlbmQnKTtcblxuICAgICAgICBpZiAoaGFuZGxlci5sb2dpbkFja1JlY2VpdmVkKSB7XG4gICAgICAgICAgaWYgKGhhbmRsZXIucm91dGluZ0RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMucm91dGluZ0RhdGEgPSBoYW5kbGVyLnJvdXRpbmdEYXRhO1xuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5SRVJPVVRJTkcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkxPR0dFRF9JTl9TRU5ESU5HX0lOSVRJQUxfU1FMKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5sb2dpbkVycm9yKSB7XG4gICAgICAgICAgaWYgKGlzVHJhbnNpZW50RXJyb3IodGhpcy5sb2dpbkVycm9yKSkge1xuICAgICAgICAgICAgdGhpcy5kZWJ1Zy5sb2coJ0luaXRpYXRpbmcgcmV0cnkgb24gdHJhbnNpZW50IGVycm9yJyk7XG4gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlRSQU5TSUVOVF9GQUlMVVJFX1JFVFJZKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdjb25uZWN0JywgdGhpcy5sb2dpbkVycm9yKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnLCBuZXcgQ29ubmVjdGlvbkVycm9yKCdMb2dpbiBmYWlsZWQuJywgJ0VMT0dJTicpKTtcbiAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgICAgfVxuICAgICAgfSkoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgU0VOVF9MT0dJTjdfV0lUSF9OVExNOiB7XG4gICAgbmFtZTogJ1NlbnRMb2dpbjdXaXRoTlRMTUxvZ2luJyxcbiAgICBlbnRlcjogZnVuY3Rpb24oKSB7XG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgIGxldCBtZXNzYWdlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBtZXNzYWdlID0gYXdhaXQgdGhpcy5tZXNzYWdlSW8ucmVhZE1lc3NhZ2UoKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc29ja2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBoYW5kbGVyID0gbmV3IExvZ2luN1Rva2VuSGFuZGxlcih0aGlzKTtcbiAgICAgICAgICBjb25zdCB0b2tlblN0cmVhbVBhcnNlciA9IHRoaXMuY3JlYXRlVG9rZW5TdHJlYW1QYXJzZXIobWVzc2FnZSwgaGFuZGxlcik7XG5cbiAgICAgICAgICBhd2FpdCBvbmNlKHRva2VuU3RyZWFtUGFyc2VyLCAnZW5kJyk7XG5cbiAgICAgICAgICBpZiAoaGFuZGxlci5sb2dpbkFja1JlY2VpdmVkKSB7XG4gICAgICAgICAgICBpZiAoaGFuZGxlci5yb3V0aW5nRGF0YSkge1xuICAgICAgICAgICAgICB0aGlzLnJvdXRpbmdEYXRhID0gaGFuZGxlci5yb3V0aW5nRGF0YTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuUkVST1VUSU5HKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkxPR0dFRF9JTl9TRU5ESU5HX0lOSVRJQUxfU1FMKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubnRsbXBhY2tldCkge1xuICAgICAgICAgICAgY29uc3QgYXV0aGVudGljYXRpb24gPSB0aGlzLmNvbmZpZy5hdXRoZW50aWNhdGlvbiBhcyBOdGxtQXV0aGVudGljYXRpb247XG5cbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBuZXcgTlRMTVJlc3BvbnNlUGF5bG9hZCh7XG4gICAgICAgICAgICAgIGRvbWFpbjogYXV0aGVudGljYXRpb24ub3B0aW9ucy5kb21haW4sXG4gICAgICAgICAgICAgIHVzZXJOYW1lOiBhdXRoZW50aWNhdGlvbi5vcHRpb25zLnVzZXJOYW1lLFxuICAgICAgICAgICAgICBwYXNzd29yZDogYXV0aGVudGljYXRpb24ub3B0aW9ucy5wYXNzd29yZCxcbiAgICAgICAgICAgICAgbnRsbXBhY2tldDogdGhpcy5udGxtcGFja2V0XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSW8uc2VuZE1lc3NhZ2UoVFlQRS5OVExNQVVUSF9QS1QsIHBheWxvYWQuZGF0YSk7XG4gICAgICAgICAgICB0aGlzLmRlYnVnLnBheWxvYWQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwYXlsb2FkLnRvU3RyaW5nKCcgICcpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMubnRsbXBhY2tldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubG9naW5FcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzVHJhbnNpZW50RXJyb3IodGhpcy5sb2dpbkVycm9yKSkge1xuICAgICAgICAgICAgICB0aGlzLmRlYnVnLmxvZygnSW5pdGlhdGluZyByZXRyeSBvbiB0cmFuc2llbnQgZXJyb3InKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuVFJBTlNJRU5UX0ZBSUxVUkVfUkVUUlkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5lbWl0KCdjb25uZWN0JywgdGhpcy5sb2dpbkVycm9yKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnLCBuZXcgQ29ubmVjdGlvbkVycm9yKCdMb2dpbiBmYWlsZWQuJywgJ0VMT0dJTicpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgfSkoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgU0VOVF9MT0dJTjdfV0lUSF9GRURBVVRIOiB7XG4gICAgbmFtZTogJ1NlbnRMb2dpbjdXaXRoZmVkYXV0aCcsXG4gICAgZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IG1lc3NhZ2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbWVzc2FnZSA9IGF3YWl0IHRoaXMubWVzc2FnZUlvLnJlYWRNZXNzYWdlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc29ja2V0RXJyb3IoZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgTG9naW43VG9rZW5IYW5kbGVyKHRoaXMpO1xuICAgICAgICBjb25zdCB0b2tlblN0cmVhbVBhcnNlciA9IHRoaXMuY3JlYXRlVG9rZW5TdHJlYW1QYXJzZXIobWVzc2FnZSwgaGFuZGxlcik7XG4gICAgICAgIGF3YWl0IG9uY2UodG9rZW5TdHJlYW1QYXJzZXIsICdlbmQnKTtcbiAgICAgICAgaWYgKGhhbmRsZXIubG9naW5BY2tSZWNlaXZlZCkge1xuICAgICAgICAgIGlmIChoYW5kbGVyLnJvdXRpbmdEYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnJvdXRpbmdEYXRhID0gaGFuZGxlci5yb3V0aW5nRGF0YTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuUkVST1VUSU5HKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5MT0dHRURfSU5fU0VORElOR19JTklUSUFMX1NRTCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmVkQXV0aEluZm9Ub2tlbiA9IGhhbmRsZXIuZmVkQXV0aEluZm9Ub2tlbjtcblxuICAgICAgICBpZiAoZmVkQXV0aEluZm9Ub2tlbiAmJiBmZWRBdXRoSW5mb1Rva2VuLnN0c3VybCAmJiBmZWRBdXRoSW5mb1Rva2VuLnNwbikge1xuICAgICAgICAgIGNvbnN0IGF1dGhlbnRpY2F0aW9uID0gdGhpcy5jb25maWcuYXV0aGVudGljYXRpb24gYXMgQXp1cmVBY3RpdmVEaXJlY3RvcnlQYXNzd29yZEF1dGhlbnRpY2F0aW9uIHwgQXp1cmVBY3RpdmVEaXJlY3RvcnlNc2lWbUF1dGhlbnRpY2F0aW9uIHwgQXp1cmVBY3RpdmVEaXJlY3RvcnlNc2lBcHBTZXJ2aWNlQXV0aGVudGljYXRpb24gfCBBenVyZUFjdGl2ZURpcmVjdG9yeVNlcnZpY2VQcmluY2lwYWxTZWNyZXQgfCBBenVyZUFjdGl2ZURpcmVjdG9yeURlZmF1bHRBdXRoZW50aWNhdGlvbjtcbiAgICAgICAgICBjb25zdCB0b2tlblNjb3BlID0gbmV3IFVSTCgnLy5kZWZhdWx0JywgZmVkQXV0aEluZm9Ub2tlbi5zcG4pLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICBsZXQgY3JlZGVudGlhbHM7XG5cbiAgICAgICAgICBzd2l0Y2ggKGF1dGhlbnRpY2F0aW9uLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktcGFzc3dvcmQnOlxuICAgICAgICAgICAgICBjcmVkZW50aWFscyA9IG5ldyBVc2VybmFtZVBhc3N3b3JkQ3JlZGVudGlhbChcbiAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbi5vcHRpb25zLnRlbmFudElkID8/ICdjb21tb24nLFxuICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMuY2xpZW50SWQsXG4gICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb24ub3B0aW9ucy51c2VyTmFtZSxcbiAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbi5vcHRpb25zLnBhc3N3b3JkXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktdm0nOlxuICAgICAgICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktYXBwLXNlcnZpY2UnOlxuICAgICAgICAgICAgICBjb25zdCBtc2lBcmdzID0gYXV0aGVudGljYXRpb24ub3B0aW9ucy5jbGllbnRJZCA/IFthdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudElkLCB7fV0gOiBbe31dO1xuICAgICAgICAgICAgICBjcmVkZW50aWFscyA9IG5ldyBNYW5hZ2VkSWRlbnRpdHlDcmVkZW50aWFsKC4uLm1zaUFyZ3MpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktZGVmYXVsdCc6XG4gICAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBhdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudElkID8geyBtYW5hZ2VkSWRlbnRpdHlDbGllbnRJZDogYXV0aGVudGljYXRpb24ub3B0aW9ucy5jbGllbnRJZCB9IDoge307XG4gICAgICAgICAgICAgIGNyZWRlbnRpYWxzID0gbmV3IERlZmF1bHRBenVyZUNyZWRlbnRpYWwoYXJncyk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1zZXJ2aWNlLXByaW5jaXBhbC1zZWNyZXQnOlxuICAgICAgICAgICAgICBjcmVkZW50aWFscyA9IG5ldyBDbGllbnRTZWNyZXRDcmVkZW50aWFsKFxuICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMudGVuYW50SWQsXG4gICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb24ub3B0aW9ucy5jbGllbnRJZCxcbiAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudFNlY3JldFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgdG9rZW5SZXNwb25zZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdG9rZW5SZXNwb25zZSA9IGF3YWl0IGNyZWRlbnRpYWxzLmdldFRva2VuKHRva2VuU2NvcGUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhpcy5sb2dpbkVycm9yID0gbmV3IEFnZ3JlZ2F0ZUVycm9yKFxuICAgICAgICAgICAgICBbbmV3IENvbm5lY3Rpb25FcnJvcignU2VjdXJpdHkgdG9rZW4gY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgb3IgYXV0aG9yaXplZC4nLCAnRUZFREFVVEgnKSwgZXJyXSk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnLCB0aGlzLmxvZ2luRXJyb3IpO1xuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG5cbiAgICAgICAgICBjb25zdCB0b2tlbiA9IHRva2VuUmVzcG9uc2UudG9rZW47XG4gICAgICAgICAgdGhpcy5zZW5kRmVkQXV0aFRva2VuTWVzc2FnZSh0b2tlbik7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxvZ2luRXJyb3IpIHtcbiAgICAgICAgICBpZiAoaXNUcmFuc2llbnRFcnJvcih0aGlzLmxvZ2luRXJyb3IpKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnLmxvZygnSW5pdGlhdGluZyByZXRyeSBvbiB0cmFuc2llbnQgZXJyb3InKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuVFJBTlNJRU5UX0ZBSUxVUkVfUkVUUlkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnLCB0aGlzLmxvZ2luRXJyb3IpO1xuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZW1pdCgnY29ubmVjdCcsIG5ldyBDb25uZWN0aW9uRXJyb3IoJ0xvZ2luIGZhaWxlZC4nLCAnRUxPR0lOJykpO1xuICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgICB9XG5cbiAgICAgIH0pKCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBldmVudHM6IHtcbiAgICAgIHNvY2tldEVycm9yOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9LFxuICAgICAgY29ubmVjdFRpbWVvdXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIExPR0dFRF9JTl9TRU5ESU5HX0lOSVRJQUxfU1FMOiB7XG4gICAgbmFtZTogJ0xvZ2dlZEluU2VuZGluZ0luaXRpYWxTcWwnLFxuICAgIGVudGVyOiBmdW5jdGlvbigpIHtcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2VuZEluaXRpYWxTcWwoKTtcbiAgICAgICAgbGV0IG1lc3NhZ2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbWVzc2FnZSA9IGF3YWl0IHRoaXMubWVzc2FnZUlvLnJlYWRNZXNzYWdlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc29ja2V0RXJyb3IoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b2tlblN0cmVhbVBhcnNlciA9IHRoaXMuY3JlYXRlVG9rZW5TdHJlYW1QYXJzZXIobWVzc2FnZSwgbmV3IEluaXRpYWxTcWxUb2tlbkhhbmRsZXIodGhpcykpO1xuICAgICAgICBhd2FpdCBvbmNlKHRva2VuU3RyZWFtUGFyc2VyLCAnZW5kJyk7XG5cbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5MT0dHRURfSU4pO1xuICAgICAgICB0aGlzLnByb2Nlc3NlZEluaXRpYWxTcWwoKTtcblxuICAgICAgfSkoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uIHNvY2tldEVycm9yKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgTE9HR0VEX0lOOiB7XG4gICAgbmFtZTogJ0xvZ2dlZEluJyxcbiAgICBldmVudHM6IHtcbiAgICAgIHNvY2tldEVycm9yOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBTRU5UX0NMSUVOVF9SRVFVRVNUOiB7XG4gICAgbmFtZTogJ1NlbnRDbGllbnRSZXF1ZXN0JyxcbiAgICBlbnRlcjogZnVuY3Rpb24oKSB7XG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBtZXNzYWdlID0gYXdhaXQgdGhpcy5tZXNzYWdlSW8ucmVhZE1lc3NhZ2UoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zb2NrZXRFcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJlcXVlc3QgdGltZXIgaXMgc3RvcHBlZCBvbiBmaXJzdCBkYXRhIHBhY2thZ2VcbiAgICAgICAgdGhpcy5jbGVhclJlcXVlc3RUaW1lcigpO1xuXG4gICAgICAgIGNvbnN0IHRva2VuU3RyZWFtUGFyc2VyID0gdGhpcy5jcmVhdGVUb2tlblN0cmVhbVBhcnNlcihtZXNzYWdlLCBuZXcgUmVxdWVzdFRva2VuSGFuZGxlcih0aGlzLCB0aGlzLnJlcXVlc3QhKSk7XG5cbiAgICAgICAgLy8gSWYgdGhlIHJlcXVlc3Qgd2FzIGNhbmNlbGVkIGFuZCB3ZSBoYXZlIGEgYGNhbmNlbFRpbWVyYFxuICAgICAgICAvLyBkZWZpbmVkLCB3ZSBzZW5kIGEgYXR0ZW50aW9uIG1lc3NhZ2UgYWZ0ZXIgdGhlXG4gICAgICAgIC8vIHJlcXVlc3QgbWVzc2FnZSB3YXMgZnVsbHkgc2VudCBvZmYuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFdlIGFscmVhZHkgc3RhcnRlZCBjb25zdW1pbmcgdGhlIGN1cnJlbnQgbWVzc2FnZVxuICAgICAgICAvLyAoYnV0IGFsbCB0aGUgdG9rZW4gaGFuZGxlcnMgc2hvdWxkIGJlIG5vLW9wcyksIGFuZFxuICAgICAgICAvLyBuZWVkIHRvIGVuc3VyZSB0aGUgbmV4dCBtZXNzYWdlIGlzIGhhbmRsZWQgYnkgdGhlXG4gICAgICAgIC8vIGBTRU5UX0FUVEVOVElPTmAgc3RhdGUuXG4gICAgICAgIGlmICh0aGlzLnJlcXVlc3Q/LmNhbmNlbGVkICYmIHRoaXMuY2FuY2VsVGltZXIpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5TRU5UX0FUVEVOVElPTik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvblJlc3VtZSA9ICgpID0+IHtcbiAgICAgICAgICB0b2tlblN0cmVhbVBhcnNlci5yZXN1bWUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb25QYXVzZSA9ICgpID0+IHtcbiAgICAgICAgICB0b2tlblN0cmVhbVBhcnNlci5wYXVzZSgpO1xuXG4gICAgICAgICAgdGhpcy5yZXF1ZXN0Py5vbmNlKCdyZXN1bWUnLCBvblJlc3VtZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0Py5vbigncGF1c2UnLCBvblBhdXNlKTtcblxuICAgICAgICBpZiAodGhpcy5yZXF1ZXN0IGluc3RhbmNlb2YgUmVxdWVzdCAmJiB0aGlzLnJlcXVlc3QucGF1c2VkKSB7XG4gICAgICAgICAgb25QYXVzZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb25DYW5jZWwgPSAoKSA9PiB7XG4gICAgICAgICAgdG9rZW5TdHJlYW1QYXJzZXIucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uRW5kT2ZNZXNzYWdlKTtcblxuICAgICAgICAgIGlmICh0aGlzLnJlcXVlc3QgaW5zdGFuY2VvZiBSZXF1ZXN0ICYmIHRoaXMucmVxdWVzdC5wYXVzZWQpIHtcbiAgICAgICAgICAgIC8vIHJlc3VtZSB0aGUgcmVxdWVzdCBpZiBpdCB3YXMgcGF1c2VkIHNvIHdlIGNhbiByZWFkIHRoZSByZW1haW5pbmcgdG9rZW5zXG4gICAgICAgICAgICB0aGlzLnJlcXVlc3QucmVzdW1lKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5yZXF1ZXN0Py5yZW1vdmVMaXN0ZW5lcigncGF1c2UnLCBvblBhdXNlKTtcbiAgICAgICAgICB0aGlzLnJlcXVlc3Q/LnJlbW92ZUxpc3RlbmVyKCdyZXN1bWUnLCBvblJlc3VtZSk7XG5cbiAgICAgICAgICAvLyBUaGUgYF9jYW5jZWxBZnRlclJlcXVlc3RTZW50YCBjYWxsYmFjayB3aWxsIGhhdmUgc2VudCBhXG4gICAgICAgICAgLy8gYXR0ZW50aW9uIG1lc3NhZ2UsIHNvIG5vdyB3ZSBuZWVkIHRvIGFsc28gc3dpdGNoIHRvXG4gICAgICAgICAgLy8gdGhlIGBTRU5UX0FUVEVOVElPTmAgc3RhdGUgdG8gbWFrZSBzdXJlIHRoZSBhdHRlbnRpb24gYWNrXG4gICAgICAgICAgLy8gbWVzc2FnZSBpcyBwcm9jZXNzZWQgY29ycmVjdGx5LlxuICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuU0VOVF9BVFRFTlRJT04pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG9uRW5kT2ZNZXNzYWdlID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVxdWVzdD8ucmVtb3ZlTGlzdGVuZXIoJ2NhbmNlbCcsIHRoaXMuX2NhbmNlbEFmdGVyUmVxdWVzdFNlbnQpO1xuICAgICAgICAgIHRoaXMucmVxdWVzdD8ucmVtb3ZlTGlzdGVuZXIoJ2NhbmNlbCcsIG9uQ2FuY2VsKTtcbiAgICAgICAgICB0aGlzLnJlcXVlc3Q/LnJlbW92ZUxpc3RlbmVyKCdwYXVzZScsIG9uUGF1c2UpO1xuICAgICAgICAgIHRoaXMucmVxdWVzdD8ucmVtb3ZlTGlzdGVuZXIoJ3Jlc3VtZScsIG9uUmVzdW1lKTtcblxuICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuTE9HR0VEX0lOKTtcbiAgICAgICAgICBjb25zdCBzcWxSZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0IGFzIFJlcXVlc3Q7XG4gICAgICAgICAgdGhpcy5yZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb24gPCAnN18yJyAmJiBzcWxSZXF1ZXN0LmVycm9yICYmIHRoaXMuaXNTcWxCYXRjaCkge1xuICAgICAgICAgICAgdGhpcy5pblRyYW5zYWN0aW9uID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNxbFJlcXVlc3QuY2FsbGJhY2soc3FsUmVxdWVzdC5lcnJvciwgc3FsUmVxdWVzdC5yb3dDb3VudCwgc3FsUmVxdWVzdC5yb3dzKTtcbiAgICAgICAgfTtcblxuICAgICAgICB0b2tlblN0cmVhbVBhcnNlci5vbmNlKCdlbmQnLCBvbkVuZE9mTWVzc2FnZSk7XG4gICAgICAgIHRoaXMucmVxdWVzdD8ub25jZSgnY2FuY2VsJywgb25DYW5jZWwpO1xuICAgICAgfSkoKTtcblxuICAgIH0sXG4gICAgZXhpdDogZnVuY3Rpb24obmV4dFN0YXRlKSB7XG4gICAgICB0aGlzLmNsZWFyUmVxdWVzdFRpbWVyKCk7XG4gICAgfSxcbiAgICBldmVudHM6IHtcbiAgICAgIHNvY2tldEVycm9yOiBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgY29uc3Qgc3FsUmVxdWVzdCA9IHRoaXMucmVxdWVzdCE7XG4gICAgICAgIHRoaXMucmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG5cbiAgICAgICAgc3FsUmVxdWVzdC5jYWxsYmFjayhlcnIpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgU0VOVF9BVFRFTlRJT046IHtcbiAgICBuYW1lOiAnU2VudEF0dGVudGlvbicsXG4gICAgZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IG1lc3NhZ2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbWVzc2FnZSA9IGF3YWl0IHRoaXMubWVzc2FnZUlvLnJlYWRNZXNzYWdlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc29ja2V0RXJyb3IoZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgQXR0ZW50aW9uVG9rZW5IYW5kbGVyKHRoaXMsIHRoaXMucmVxdWVzdCEpO1xuICAgICAgICBjb25zdCB0b2tlblN0cmVhbVBhcnNlciA9IHRoaXMuY3JlYXRlVG9rZW5TdHJlYW1QYXJzZXIobWVzc2FnZSwgaGFuZGxlcik7XG5cbiAgICAgICAgYXdhaXQgb25jZSh0b2tlblN0cmVhbVBhcnNlciwgJ2VuZCcpO1xuICAgICAgICAvLyAzLjIuNS43IFNlbnQgQXR0ZW50aW9uIFN0YXRlXG4gICAgICAgIC8vIERpc2NhcmQgYW55IGRhdGEgY29udGFpbmVkIGluIHRoZSByZXNwb25zZSwgdW50aWwgd2UgcmVjZWl2ZSB0aGUgYXR0ZW50aW9uIHJlc3BvbnNlXG4gICAgICAgIGlmIChoYW5kbGVyLmF0dGVudGlvblJlY2VpdmVkKSB7XG4gICAgICAgICAgdGhpcy5jbGVhckNhbmNlbFRpbWVyKCk7XG5cbiAgICAgICAgICBjb25zdCBzcWxSZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0ITtcbiAgICAgICAgICB0aGlzLnJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5MT0dHRURfSU4pO1xuXG4gICAgICAgICAgaWYgKHNxbFJlcXVlc3QuZXJyb3IgJiYgc3FsUmVxdWVzdC5lcnJvciBpbnN0YW5jZW9mIFJlcXVlc3RFcnJvciAmJiBzcWxSZXF1ZXN0LmVycm9yLmNvZGUgPT09ICdFVElNRU9VVCcpIHtcbiAgICAgICAgICAgIHNxbFJlcXVlc3QuY2FsbGJhY2soc3FsUmVxdWVzdC5lcnJvcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNxbFJlcXVlc3QuY2FsbGJhY2sobmV3IFJlcXVlc3RFcnJvcignQ2FuY2VsZWQuJywgJ0VDQU5DRUwnKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIH0pKCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBldmVudHM6IHtcbiAgICAgIHNvY2tldEVycm9yOiBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgY29uc3Qgc3FsUmVxdWVzdCA9IHRoaXMucmVxdWVzdCE7XG4gICAgICAgIHRoaXMucmVxdWVzdCA9IHVuZGVmaW5lZDtcblxuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcblxuICAgICAgICBzcWxSZXF1ZXN0LmNhbGxiYWNrKGVycik7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBGSU5BTDoge1xuICAgIG5hbWU6ICdGaW5hbCcsXG4gICAgZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5jbGVhbnVwQ29ubmVjdGlvbihDTEVBTlVQX1RZUEUuTk9STUFMKTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgY29ubmVjdFRpbWVvdXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBEbyBub3RoaW5nLCBhcyB0aGUgdGltZXIgc2hvdWxkIGJlIGNsZWFuZWQgdXAuXG4gICAgICB9LFxuICAgICAgbWVzc2FnZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIERvIG5vdGhpbmdcbiAgICAgIH0sXG4gICAgICBzb2NrZXRFcnJvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIERvIG5vdGhpbmdcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFFQTs7QUFFQTs7QUFHQTs7QUFFQTs7QUFPQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQW9HQTtBQUNBO0FBQ0E7QUFDQSxNQUFNQSx3QkFBd0IsR0FBRyxLQUFLLElBQXRDO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE1BQU1DLHVCQUF1QixHQUFHLEtBQUssSUFBckM7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsTUFBTUMsOEJBQThCLEdBQUcsS0FBSyxJQUE1QztBQUNBO0FBQ0E7QUFDQTs7QUFDQSxNQUFNQyxzQkFBc0IsR0FBRyxJQUFJLElBQW5DO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE1BQU1DLDhCQUE4QixHQUFHLEdBQXZDO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE1BQU1DLG1CQUFtQixHQUFHLElBQUksSUFBaEM7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcsVUFBekI7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsTUFBTUMsaUJBQWlCLEdBQUcsQ0FBMUI7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsTUFBTUMsWUFBWSxHQUFHLElBQXJCO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE1BQU1DLG1CQUFtQixHQUFHLEtBQTVCO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE1BQU1DLGdCQUFnQixHQUFHLFlBQXpCO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE1BQU1DLGtCQUFrQixHQUFHLEtBQTNCOztBQXdvQkE7QUFDQTtBQUNBO0FBQ0EsTUFBTUMsWUFBWSxHQUFHO0VBQ25CQyxNQUFNLEVBQUUsQ0FEVztFQUVuQkMsUUFBUSxFQUFFLENBRlM7RUFHbkJDLEtBQUssRUFBRTtBQUhZLENBQXJCOztBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNQyxVQUFOLFNBQXlCQyxvQkFBekIsQ0FBc0M7RUFDcEM7QUFDRjtBQUNBOztFQUVFO0FBQ0Y7QUFDQTs7RUFFRTtBQUNGO0FBQ0E7O0VBRUU7QUFDRjtBQUNBOztFQUVFO0FBQ0Y7QUFDQTs7RUFFRTtBQUNGO0FBQ0E7O0VBRUU7QUFDRjtBQUNBOztFQUVFO0FBQ0Y7QUFDQTs7RUFFRTtBQUNGO0FBQ0E7O0VBRUU7QUFDRjtBQUNBOztFQUVFO0FBQ0Y7QUFDQTs7RUFFRTtBQUNGO0FBQ0E7O0VBRUU7QUFDRjtBQUNBOztFQUVFO0FBQ0Y7QUFDQTs7RUF1QkU7QUFDRjtBQUNBOztFQUdFO0FBQ0Y7QUFDQTs7RUFFRTtBQUNGO0FBQ0E7O0VBRUU7QUFDRjtBQUNBOztFQUdFO0FBQ0Y7QUFDQTs7RUFFRTtBQUNGO0FBQ0E7O0VBRUU7QUFDRjtBQUNBOztFQUVFO0FBQ0Y7QUFDQTs7RUFHRTtBQUNGO0FBQ0E7O0VBRUU7QUFDRjtBQUNBOztFQUVFO0FBQ0Y7QUFDQTs7RUFFRTtBQUNGO0FBQ0E7O0VBR0U7QUFDRjtBQUNBOztFQUdFO0FBQ0Y7QUFDQTs7RUFHRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRUMsV0FBVyxDQUFDQyxNQUFELEVBQWtDO0lBQzNDO0lBRDJDLEtBN0o3Q0MsZUE2SjZDO0lBQUEsS0F6SjdDRCxNQXlKNkM7SUFBQSxLQXJKN0NFLG9CQXFKNkM7SUFBQSxLQWpKN0NDLGFBaUo2QztJQUFBLEtBN0k3Q0Msc0JBNkk2QztJQUFBLEtBekk3Q0MsZ0JBeUk2QztJQUFBLEtBckk3Q0MsVUFxSTZDO0lBQUEsS0FqSTdDQyxzQkFpSTZDO0lBQUEsS0E3SDdDQyxvQkE2SDZDO0lBQUEsS0F6SDdDQyxNQXlINkM7SUFBQSxLQXJIN0NDLFVBcUg2QztJQUFBLEtBakg3Q0MsS0FpSDZDO0lBQUEsS0E3RzdDQyxVQTZHNkM7SUFBQSxLQXpHN0NDLGdCQXlHNkM7SUFBQSxLQWhGN0NDLFdBZ0Y2QztJQUFBLEtBM0U3Q0MsU0EyRTZDO0lBQUEsS0F2RTdDQyxLQXVFNkM7SUFBQSxLQW5FN0NDLDRCQW1FNkM7SUFBQSxLQTlEN0NDLE9BOEQ2QztJQUFBLEtBMUQ3Q0MscUJBMEQ2QztJQUFBLEtBdEQ3Q0MsTUFzRDZDO0lBQUEsS0FsRDdDQyxhQWtENkM7SUFBQSxLQTdDN0NDLFlBNkM2QztJQUFBLEtBekM3Q0MsV0F5QzZDO0lBQUEsS0FyQzdDQyxZQXFDNkM7SUFBQSxLQWpDN0NDLFVBaUM2QztJQUFBLEtBNUI3Q0MsdUJBNEI2QztJQUFBLEtBdkI3Q0MsaUJBdUI2Qzs7SUFHM0MsSUFBSSxPQUFPM0IsTUFBUCxLQUFrQixRQUFsQixJQUE4QkEsTUFBTSxLQUFLLElBQTdDLEVBQW1EO01BQ2pELE1BQU0sSUFBSTRCLFNBQUosQ0FBYywrREFBZCxDQUFOO0lBQ0Q7O0lBRUQsSUFBSSxPQUFPNUIsTUFBTSxDQUFDNkIsTUFBZCxLQUF5QixRQUE3QixFQUF1QztNQUNyQyxNQUFNLElBQUlELFNBQUosQ0FBYyxzRUFBZCxDQUFOO0lBQ0Q7O0lBRUQsS0FBSzNCLGVBQUwsR0FBdUIsS0FBdkI7SUFFQSxJQUFJNkIsY0FBSjs7SUFDQSxJQUFJOUIsTUFBTSxDQUFDOEIsY0FBUCxLQUEwQkMsU0FBOUIsRUFBeUM7TUFDdkMsSUFBSSxPQUFPL0IsTUFBTSxDQUFDOEIsY0FBZCxLQUFpQyxRQUFqQyxJQUE2QzlCLE1BQU0sQ0FBQzhCLGNBQVAsS0FBMEIsSUFBM0UsRUFBaUY7UUFDL0UsTUFBTSxJQUFJRixTQUFKLENBQWMsOERBQWQsQ0FBTjtNQUNEOztNQUVELE1BQU1JLElBQUksR0FBR2hDLE1BQU0sQ0FBQzhCLGNBQVAsQ0FBc0JFLElBQW5DO01BQ0EsTUFBTUMsT0FBTyxHQUFHakMsTUFBTSxDQUFDOEIsY0FBUCxDQUFzQkcsT0FBdEIsS0FBa0NGLFNBQWxDLEdBQThDLEVBQTlDLEdBQW1EL0IsTUFBTSxDQUFDOEIsY0FBUCxDQUFzQkcsT0FBekY7O01BRUEsSUFBSSxPQUFPRCxJQUFQLEtBQWdCLFFBQXBCLEVBQThCO1FBQzVCLE1BQU0sSUFBSUosU0FBSixDQUFjLG1FQUFkLENBQU47TUFDRDs7TUFFRCxJQUFJSSxJQUFJLEtBQUssU0FBVCxJQUFzQkEsSUFBSSxLQUFLLE1BQS9CLElBQXlDQSxJQUFJLEtBQUssaUNBQWxELElBQXVGQSxJQUFJLEtBQUsscUNBQWhHLElBQXlJQSxJQUFJLEtBQUssK0JBQWxKLElBQXFMQSxJQUFJLEtBQUssd0NBQTlMLElBQTBPQSxJQUFJLEtBQUssaURBQW5QLElBQXdTQSxJQUFJLEtBQUssZ0NBQXJULEVBQXVWO1FBQ3JWLE1BQU0sSUFBSUosU0FBSixDQUFjLGtTQUFkLENBQU47TUFDRDs7TUFFRCxJQUFJLE9BQU9LLE9BQVAsS0FBbUIsUUFBbkIsSUFBK0JBLE9BQU8sS0FBSyxJQUEvQyxFQUFxRDtRQUNuRCxNQUFNLElBQUlMLFNBQUosQ0FBYyxzRUFBZCxDQUFOO01BQ0Q7O01BRUQsSUFBSUksSUFBSSxLQUFLLE1BQWIsRUFBcUI7UUFDbkIsSUFBSSxPQUFPQyxPQUFPLENBQUNDLE1BQWYsS0FBMEIsUUFBOUIsRUFBd0M7VUFDdEMsTUFBTSxJQUFJTixTQUFKLENBQWMsNkVBQWQsQ0FBTjtRQUNEOztRQUVELElBQUlLLE9BQU8sQ0FBQ0UsUUFBUixLQUFxQkosU0FBckIsSUFBa0MsT0FBT0UsT0FBTyxDQUFDRSxRQUFmLEtBQTRCLFFBQWxFLEVBQTRFO1VBQzFFLE1BQU0sSUFBSVAsU0FBSixDQUFjLCtFQUFkLENBQU47UUFDRDs7UUFFRCxJQUFJSyxPQUFPLENBQUNHLFFBQVIsS0FBcUJMLFNBQXJCLElBQWtDLE9BQU9FLE9BQU8sQ0FBQ0csUUFBZixLQUE0QixRQUFsRSxFQUE0RTtVQUMxRSxNQUFNLElBQUlSLFNBQUosQ0FBYywrRUFBZCxDQUFOO1FBQ0Q7O1FBRURFLGNBQWMsR0FBRztVQUNmRSxJQUFJLEVBQUUsTUFEUztVQUVmQyxPQUFPLEVBQUU7WUFDUEUsUUFBUSxFQUFFRixPQUFPLENBQUNFLFFBRFg7WUFFUEMsUUFBUSxFQUFFSCxPQUFPLENBQUNHLFFBRlg7WUFHUEYsTUFBTSxFQUFFRCxPQUFPLENBQUNDLE1BQVIsSUFBa0JELE9BQU8sQ0FBQ0MsTUFBUixDQUFlRyxXQUFmO1VBSG5CO1FBRk0sQ0FBakI7TUFRRCxDQXJCRCxNQXFCTyxJQUFJTCxJQUFJLEtBQUssaUNBQWIsRUFBZ0Q7UUFDckQsSUFBSSxPQUFPQyxPQUFPLENBQUNLLFFBQWYsS0FBNEIsUUFBaEMsRUFBMEM7VUFDeEMsTUFBTSxJQUFJVixTQUFKLENBQWMsK0VBQWQsQ0FBTjtRQUNEOztRQUVELElBQUlLLE9BQU8sQ0FBQ0UsUUFBUixLQUFxQkosU0FBckIsSUFBa0MsT0FBT0UsT0FBTyxDQUFDRSxRQUFmLEtBQTRCLFFBQWxFLEVBQTRFO1VBQzFFLE1BQU0sSUFBSVAsU0FBSixDQUFjLCtFQUFkLENBQU47UUFDRDs7UUFFRCxJQUFJSyxPQUFPLENBQUNHLFFBQVIsS0FBcUJMLFNBQXJCLElBQWtDLE9BQU9FLE9BQU8sQ0FBQ0csUUFBZixLQUE0QixRQUFsRSxFQUE0RTtVQUMxRSxNQUFNLElBQUlSLFNBQUosQ0FBYywrRUFBZCxDQUFOO1FBQ0Q7O1FBRUQsSUFBSUssT0FBTyxDQUFDTSxRQUFSLEtBQXFCUixTQUFyQixJQUFrQyxPQUFPRSxPQUFPLENBQUNNLFFBQWYsS0FBNEIsUUFBbEUsRUFBNEU7VUFDMUUsTUFBTSxJQUFJWCxTQUFKLENBQWMsK0VBQWQsQ0FBTjtRQUNEOztRQUVERSxjQUFjLEdBQUc7VUFDZkUsSUFBSSxFQUFFLGlDQURTO1VBRWZDLE9BQU8sRUFBRTtZQUNQRSxRQUFRLEVBQUVGLE9BQU8sQ0FBQ0UsUUFEWDtZQUVQQyxRQUFRLEVBQUVILE9BQU8sQ0FBQ0csUUFGWDtZQUdQRyxRQUFRLEVBQUVOLE9BQU8sQ0FBQ00sUUFIWDtZQUlQRCxRQUFRLEVBQUVMLE9BQU8sQ0FBQ0s7VUFKWDtRQUZNLENBQWpCO01BU0QsQ0ExQk0sTUEwQkEsSUFBSU4sSUFBSSxLQUFLLHFDQUFiLEVBQW9EO1FBQ3pELElBQUksT0FBT0MsT0FBTyxDQUFDTyxLQUFmLEtBQXlCLFFBQTdCLEVBQXVDO1VBQ3JDLE1BQU0sSUFBSVosU0FBSixDQUFjLDRFQUFkLENBQU47UUFDRDs7UUFFREUsY0FBYyxHQUFHO1VBQ2ZFLElBQUksRUFBRSxxQ0FEUztVQUVmQyxPQUFPLEVBQUU7WUFDUE8sS0FBSyxFQUFFUCxPQUFPLENBQUNPO1VBRFI7UUFGTSxDQUFqQjtNQU1ELENBWE0sTUFXQSxJQUFJUixJQUFJLEtBQUssK0JBQWIsRUFBOEM7UUFDbkQsSUFBSUMsT0FBTyxDQUFDSyxRQUFSLEtBQXFCUCxTQUFyQixJQUFrQyxPQUFPRSxPQUFPLENBQUNLLFFBQWYsS0FBNEIsUUFBbEUsRUFBNEU7VUFDMUUsTUFBTSxJQUFJVixTQUFKLENBQWMsK0VBQWQsQ0FBTjtRQUNEOztRQUVERSxjQUFjLEdBQUc7VUFDZkUsSUFBSSxFQUFFLCtCQURTO1VBRWZDLE9BQU8sRUFBRTtZQUNQSyxRQUFRLEVBQUVMLE9BQU8sQ0FBQ0s7VUFEWDtRQUZNLENBQWpCO01BTUQsQ0FYTSxNQVdBLElBQUlOLElBQUksS0FBSyxnQ0FBYixFQUErQztRQUNwRCxJQUFJQyxPQUFPLENBQUNLLFFBQVIsS0FBcUJQLFNBQXJCLElBQWtDLE9BQU9FLE9BQU8sQ0FBQ0ssUUFBZixLQUE0QixRQUFsRSxFQUE0RTtVQUMxRSxNQUFNLElBQUlWLFNBQUosQ0FBYywrRUFBZCxDQUFOO1FBQ0Q7O1FBQ0RFLGNBQWMsR0FBRztVQUNmRSxJQUFJLEVBQUUsZ0NBRFM7VUFFZkMsT0FBTyxFQUFFO1lBQ1BLLFFBQVEsRUFBRUwsT0FBTyxDQUFDSztVQURYO1FBRk0sQ0FBakI7TUFNRCxDQVZNLE1BVUEsSUFBSU4sSUFBSSxLQUFLLHdDQUFiLEVBQXVEO1FBQzVELElBQUlDLE9BQU8sQ0FBQ0ssUUFBUixLQUFxQlAsU0FBckIsSUFBa0MsT0FBT0UsT0FBTyxDQUFDSyxRQUFmLEtBQTRCLFFBQWxFLEVBQTRFO1VBQzFFLE1BQU0sSUFBSVYsU0FBSixDQUFjLCtFQUFkLENBQU47UUFDRDs7UUFFREUsY0FBYyxHQUFHO1VBQ2ZFLElBQUksRUFBRSx3Q0FEUztVQUVmQyxPQUFPLEVBQUU7WUFDUEssUUFBUSxFQUFFTCxPQUFPLENBQUNLO1VBRFg7UUFGTSxDQUFqQjtNQU1ELENBWE0sTUFXQSxJQUFJTixJQUFJLEtBQUssaURBQWIsRUFBZ0U7UUFDckUsSUFBSSxPQUFPQyxPQUFPLENBQUNLLFFBQWYsS0FBNEIsUUFBaEMsRUFBMEM7VUFDeEMsTUFBTSxJQUFJVixTQUFKLENBQWMsK0VBQWQsQ0FBTjtRQUNEOztRQUVELElBQUksT0FBT0ssT0FBTyxDQUFDUSxZQUFmLEtBQWdDLFFBQXBDLEVBQThDO1VBQzVDLE1BQU0sSUFBSWIsU0FBSixDQUFjLG1GQUFkLENBQU47UUFDRDs7UUFFRCxJQUFJLE9BQU9LLE9BQU8sQ0FBQ00sUUFBZixLQUE0QixRQUFoQyxFQUEwQztVQUN4QyxNQUFNLElBQUlYLFNBQUosQ0FBYywrRUFBZCxDQUFOO1FBQ0Q7O1FBRURFLGNBQWMsR0FBRztVQUNmRSxJQUFJLEVBQUUsaURBRFM7VUFFZkMsT0FBTyxFQUFFO1lBQ1BLLFFBQVEsRUFBRUwsT0FBTyxDQUFDSyxRQURYO1lBRVBHLFlBQVksRUFBRVIsT0FBTyxDQUFDUSxZQUZmO1lBR1BGLFFBQVEsRUFBRU4sT0FBTyxDQUFDTTtVQUhYO1FBRk0sQ0FBakI7TUFRRCxDQXJCTSxNQXFCQTtRQUNMLElBQUlOLE9BQU8sQ0FBQ0UsUUFBUixLQUFxQkosU0FBckIsSUFBa0MsT0FBT0UsT0FBTyxDQUFDRSxRQUFmLEtBQTRCLFFBQWxFLEVBQTRFO1VBQzFFLE1BQU0sSUFBSVAsU0FBSixDQUFjLCtFQUFkLENBQU47UUFDRDs7UUFFRCxJQUFJSyxPQUFPLENBQUNHLFFBQVIsS0FBcUJMLFNBQXJCLElBQWtDLE9BQU9FLE9BQU8sQ0FBQ0csUUFBZixLQUE0QixRQUFsRSxFQUE0RTtVQUMxRSxNQUFNLElBQUlSLFNBQUosQ0FBYywrRUFBZCxDQUFOO1FBQ0Q7O1FBRURFLGNBQWMsR0FBRztVQUNmRSxJQUFJLEVBQUUsU0FEUztVQUVmQyxPQUFPLEVBQUU7WUFDUEUsUUFBUSxFQUFFRixPQUFPLENBQUNFLFFBRFg7WUFFUEMsUUFBUSxFQUFFSCxPQUFPLENBQUNHO1VBRlg7UUFGTSxDQUFqQjtNQU9EO0lBQ0YsQ0FwSkQsTUFvSk87TUFDTE4sY0FBYyxHQUFHO1FBQ2ZFLElBQUksRUFBRSxTQURTO1FBRWZDLE9BQU8sRUFBRTtVQUNQRSxRQUFRLEVBQUVKLFNBREg7VUFFUEssUUFBUSxFQUFFTDtRQUZIO01BRk0sQ0FBakI7SUFPRDs7SUFFRCxLQUFLL0IsTUFBTCxHQUFjO01BQ1o2QixNQUFNLEVBQUU3QixNQUFNLENBQUM2QixNQURIO01BRVpDLGNBQWMsRUFBRUEsY0FGSjtNQUdaRyxPQUFPLEVBQUU7UUFDUFMsdUJBQXVCLEVBQUUsS0FEbEI7UUFFUEMsT0FBTyxFQUFFWixTQUZGO1FBR1BhLGdCQUFnQixFQUFFLEtBSFg7UUFJUEMsYUFBYSxFQUFFN0Qsc0JBSlI7UUFLUDhELDJCQUEyQixFQUFFLElBQUksRUFBSixHQUFTLEVBQVQsR0FBYyxJQUxwQztRQUsyQztRQUNsREMsdUJBQXVCLEVBQUUsS0FObEI7UUFPUEMsa0JBQWtCLEVBQUVqQixTQVBiO1FBUVBrQix1QkFBdUIsRUFBRWhFLDhCQVJsQjtRQVNQaUUsY0FBYyxFQUFFcEUsdUJBVFQ7UUFVUHFFLHdCQUF3QixFQUFFQyw2QkFBZ0JDLGNBVm5DO1FBV1BDLHdCQUF3QixFQUFFLEVBWG5CO1FBWVBDLFFBQVEsRUFBRXhCLFNBWkg7UUFhUHlCLFNBQVMsRUFBRXBFLGlCQWJKO1FBY1BxRSxVQUFVLEVBQUVqRSxrQkFkTDtRQWVQbUIsS0FBSyxFQUFFO1VBQ0wrQyxJQUFJLEVBQUUsS0FERDtVQUVMQyxNQUFNLEVBQUUsS0FGSDtVQUdMQyxPQUFPLEVBQUUsS0FISjtVQUlMcEIsS0FBSyxFQUFFO1FBSkYsQ0FmQTtRQXFCUHFCLGNBQWMsRUFBRSxJQXJCVDtRQXNCUEMscUJBQXFCLEVBQUUsSUF0QmhCO1FBdUJQQyxpQkFBaUIsRUFBRSxJQXZCWjtRQXdCUEMsa0JBQWtCLEVBQUUsSUF4QmI7UUF5QlBDLGdCQUFnQixFQUFFLElBekJYO1FBMEJQQywwQkFBMEIsRUFBRSxJQTFCckI7UUEyQlBDLHlCQUF5QixFQUFFLElBM0JwQjtRQTRCUEMsMEJBQTBCLEVBQUUsS0E1QnJCO1FBNkJQQyx1QkFBdUIsRUFBRSxLQTdCbEI7UUE4QlBDLHNCQUFzQixFQUFFLElBOUJqQjtRQStCUEMsT0FBTyxFQUFFLElBL0JGO1FBZ0NQQyxtQkFBbUIsRUFBRSxLQWhDZDtRQWlDUEMsMkJBQTJCLEVBQUUxQyxTQWpDdEI7UUFrQ1AyQyxZQUFZLEVBQUUzQyxTQWxDUDtRQW1DUDRDLGNBQWMsRUFBRXZCLDZCQUFnQkMsY0FuQ3pCO1FBb0NQdUIsUUFBUSxFQUFFckYsZ0JBcENIO1FBcUNQc0YsWUFBWSxFQUFFOUMsU0FyQ1A7UUFzQ1ArQywyQkFBMkIsRUFBRSxDQXRDdEI7UUF1Q1BDLG1CQUFtQixFQUFFLEtBdkNkO1FBd0NQQyxVQUFVLEVBQUU5RixtQkF4Q0w7UUF5Q1ArRixJQUFJLEVBQUU1RixZQXpDQztRQTBDUDZGLGNBQWMsRUFBRSxLQTFDVDtRQTJDUEMsY0FBYyxFQUFFcEcsOEJBM0NUO1FBNENQcUcsbUJBQW1CLEVBQUUsS0E1Q2Q7UUE2Q1BDLGdDQUFnQyxFQUFFLEtBN0MzQjtRQThDUEMsVUFBVSxFQUFFdkQsU0E5Q0w7UUErQ1B3RCw4QkFBOEIsRUFBRSxLQS9DekI7UUFnRFBDLFVBQVUsRUFBRWxHLG1CQWhETDtRQWlEUG1HLFFBQVEsRUFBRXRHLGdCQWpESDtRQWtEUHVHLG1CQUFtQixFQUFFM0QsU0FsRGQ7UUFtRFA0RCxzQkFBc0IsRUFBRSxLQW5EakI7UUFvRFBDLGNBQWMsRUFBRSxLQXBEVDtRQXFEUEMsTUFBTSxFQUFFLElBckREO1FBc0RQQyxhQUFhLEVBQUUvRCxTQXREUjtRQXVEUGdFLGNBQWMsRUFBRTtNQXZEVDtJQUhHLENBQWQ7O0lBOERBLElBQUkvRixNQUFNLENBQUNpQyxPQUFYLEVBQW9CO01BQ2xCLElBQUlqQyxNQUFNLENBQUNpQyxPQUFQLENBQWVnRCxJQUFmLElBQXVCakYsTUFBTSxDQUFDaUMsT0FBUCxDQUFleUMsWUFBMUMsRUFBd0Q7UUFDdEQsTUFBTSxJQUFJc0IsS0FBSixDQUFVLHVEQUF1RGhHLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZWdELElBQXRFLEdBQTZFLE9BQTdFLEdBQXVGakYsTUFBTSxDQUFDaUMsT0FBUCxDQUFleUMsWUFBdEcsR0FBcUgsV0FBL0gsQ0FBTjtNQUNEOztNQUVELElBQUkxRSxNQUFNLENBQUNpQyxPQUFQLENBQWVTLHVCQUFmLEtBQTJDWCxTQUEvQyxFQUEwRDtRQUN4RCxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFQLENBQWVTLHVCQUF0QixLQUFrRCxTQUFsRCxJQUErRDFDLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZVMsdUJBQWYsS0FBMkMsSUFBOUcsRUFBb0g7VUFDbEgsTUFBTSxJQUFJZCxTQUFKLENBQWMsdUZBQWQsQ0FBTjtRQUNEOztRQUVELEtBQUs1QixNQUFMLENBQVlpQyxPQUFaLENBQW9CUyx1QkFBcEIsR0FBOEMxQyxNQUFNLENBQUNpQyxPQUFQLENBQWVTLHVCQUE3RDtNQUNEOztNQUVELElBQUkxQyxNQUFNLENBQUNpQyxPQUFQLENBQWVVLE9BQWYsS0FBMkJaLFNBQS9CLEVBQTBDO1FBQ3hDLElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZVUsT0FBdEIsS0FBa0MsUUFBdEMsRUFBZ0Q7VUFDOUMsTUFBTSxJQUFJZixTQUFKLENBQWMsK0RBQWQsQ0FBTjtRQUNEOztRQUVELEtBQUs1QixNQUFMLENBQVlpQyxPQUFaLENBQW9CVSxPQUFwQixHQUE4QjNDLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZVUsT0FBN0M7TUFDRDs7TUFFRCxJQUFJM0MsTUFBTSxDQUFDaUMsT0FBUCxDQUFlVyxnQkFBZixLQUFvQ2IsU0FBeEMsRUFBbUQ7UUFDakQsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBUCxDQUFlVyxnQkFBdEIsS0FBMkMsU0FBL0MsRUFBMEQ7VUFDeEQsTUFBTSxJQUFJaEIsU0FBSixDQUFjLHlFQUFkLENBQU47UUFDRDs7UUFFRCxLQUFLNUIsTUFBTCxDQUFZaUMsT0FBWixDQUFvQlcsZ0JBQXBCLEdBQXVDNUMsTUFBTSxDQUFDaUMsT0FBUCxDQUFlVyxnQkFBdEQ7TUFDRDs7TUFFRCxJQUFJNUMsTUFBTSxDQUFDaUMsT0FBUCxDQUFlWSxhQUFmLEtBQWlDZCxTQUFyQyxFQUFnRDtRQUM5QyxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFQLENBQWVZLGFBQXRCLEtBQXdDLFFBQTVDLEVBQXNEO1VBQ3BELE1BQU0sSUFBSWpCLFNBQUosQ0FBYyxxRUFBZCxDQUFOO1FBQ0Q7O1FBRUQsS0FBSzVCLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0JZLGFBQXBCLEdBQW9DN0MsTUFBTSxDQUFDaUMsT0FBUCxDQUFlWSxhQUFuRDtNQUNEOztNQUVELElBQUk3QyxNQUFNLENBQUNpQyxPQUFQLENBQWVlLGtCQUFuQixFQUF1QztRQUNyQyxJQUFJLE9BQU9oRCxNQUFNLENBQUNpQyxPQUFQLENBQWVlLGtCQUF0QixLQUE2QyxVQUFqRCxFQUE2RDtVQUMzRCxNQUFNLElBQUlwQixTQUFKLENBQWMsdUVBQWQsQ0FBTjtRQUNEOztRQUVELEtBQUs1QixNQUFMLENBQVlpQyxPQUFaLENBQW9CZSxrQkFBcEIsR0FBeUNoRCxNQUFNLENBQUNpQyxPQUFQLENBQWVlLGtCQUF4RDtNQUNEOztNQUVELElBQUloRCxNQUFNLENBQUNpQyxPQUFQLENBQWVpQixjQUFmLEtBQWtDbkIsU0FBdEMsRUFBaUQ7UUFDL0MsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBUCxDQUFlaUIsY0FBdEIsS0FBeUMsUUFBN0MsRUFBdUQ7VUFDckQsTUFBTSxJQUFJdEIsU0FBSixDQUFjLHNFQUFkLENBQU47UUFDRDs7UUFFRCxLQUFLNUIsTUFBTCxDQUFZaUMsT0FBWixDQUFvQmlCLGNBQXBCLEdBQXFDbEQsTUFBTSxDQUFDaUMsT0FBUCxDQUFlaUIsY0FBcEQ7TUFDRDs7TUFFRCxJQUFJbEQsTUFBTSxDQUFDaUMsT0FBUCxDQUFla0Isd0JBQWYsS0FBNENwQixTQUFoRCxFQUEyRDtRQUN6RCw0Q0FBMEIvQixNQUFNLENBQUNpQyxPQUFQLENBQWVrQix3QkFBekMsRUFBbUUseUNBQW5FO1FBRUEsS0FBS25ELE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0JrQix3QkFBcEIsR0FBK0NuRCxNQUFNLENBQUNpQyxPQUFQLENBQWVrQix3QkFBOUQ7TUFDRDs7TUFFRCxJQUFJbkQsTUFBTSxDQUFDaUMsT0FBUCxDQUFlaUIsY0FBZixLQUFrQ25CLFNBQXRDLEVBQWlEO1FBQy9DLElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZWlCLGNBQXRCLEtBQXlDLFFBQTdDLEVBQXVEO1VBQ3JELE1BQU0sSUFBSXRCLFNBQUosQ0FBYyxzRUFBZCxDQUFOO1FBQ0Q7O1FBRUQsS0FBSzVCLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0JpQixjQUFwQixHQUFxQ2xELE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZWlCLGNBQXBEO01BQ0Q7O01BRUQsSUFBSWxELE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZXFCLHdCQUFmLEtBQTRDdkIsU0FBaEQsRUFBMkQ7UUFDekQsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBUCxDQUFlcUIsd0JBQXRCLEtBQW1ELFFBQW5ELElBQStEdEQsTUFBTSxDQUFDaUMsT0FBUCxDQUFlcUIsd0JBQWYsS0FBNEMsSUFBL0csRUFBcUg7VUFDbkgsTUFBTSxJQUFJMUIsU0FBSixDQUFjLGdGQUFkLENBQU47UUFDRDs7UUFFRCxLQUFLNUIsTUFBTCxDQUFZaUMsT0FBWixDQUFvQnFCLHdCQUFwQixHQUErQ3RELE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZXFCLHdCQUE5RDtNQUNEOztNQUVELElBQUl0RCxNQUFNLENBQUNpQyxPQUFQLENBQWVzQixRQUFmLEtBQTRCeEIsU0FBaEMsRUFBMkM7UUFDekMsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBUCxDQUFlc0IsUUFBdEIsS0FBbUMsUUFBdkMsRUFBaUQ7VUFDL0MsTUFBTSxJQUFJM0IsU0FBSixDQUFjLGdFQUFkLENBQU47UUFDRDs7UUFFRCxLQUFLNUIsTUFBTCxDQUFZaUMsT0FBWixDQUFvQnNCLFFBQXBCLEdBQStCdkQsTUFBTSxDQUFDaUMsT0FBUCxDQUFlc0IsUUFBOUM7TUFDRDs7TUFFRCxJQUFJdkQsTUFBTSxDQUFDaUMsT0FBUCxDQUFldUIsU0FBZixLQUE2QnpCLFNBQWpDLEVBQTRDO1FBQzFDLElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZXVCLFNBQXRCLEtBQW9DLFFBQXBDLElBQWdEeEQsTUFBTSxDQUFDaUMsT0FBUCxDQUFldUIsU0FBZixLQUE2QixJQUFqRixFQUF1RjtVQUNyRixNQUFNLElBQUk1QixTQUFKLENBQWMsaUVBQWQsQ0FBTjtRQUNEOztRQUVELElBQUk1QixNQUFNLENBQUNpQyxPQUFQLENBQWV1QixTQUFmLEtBQTZCLElBQTdCLEtBQXNDeEQsTUFBTSxDQUFDaUMsT0FBUCxDQUFldUIsU0FBZixHQUEyQixDQUEzQixJQUFnQ3hELE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZXVCLFNBQWYsR0FBMkIsQ0FBakcsQ0FBSixFQUF5RztVQUN2RyxNQUFNLElBQUl5QyxVQUFKLENBQWUsK0RBQWYsQ0FBTjtRQUNEOztRQUVELEtBQUtqRyxNQUFMLENBQVlpQyxPQUFaLENBQW9CdUIsU0FBcEIsR0FBZ0N4RCxNQUFNLENBQUNpQyxPQUFQLENBQWV1QixTQUEvQztNQUNEOztNQUVELElBQUl4RCxNQUFNLENBQUNpQyxPQUFQLENBQWV3QixVQUFmLEtBQThCMUIsU0FBbEMsRUFBNkM7UUFDM0MsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBUCxDQUFld0IsVUFBdEIsS0FBcUMsUUFBckMsSUFBaUR6RCxNQUFNLENBQUNpQyxPQUFQLENBQWV3QixVQUFmLEtBQThCLElBQW5GLEVBQXlGO1VBQ3ZGLE1BQU0sSUFBSTdCLFNBQUosQ0FBYywwRUFBZCxDQUFOO1FBQ0Q7O1FBRUQsS0FBSzVCLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0J3QixVQUFwQixHQUFpQ3pELE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZXdCLFVBQWhEO01BQ0Q7O01BRUQsSUFBSXpELE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZXRCLEtBQW5CLEVBQTBCO1FBQ3hCLElBQUlYLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZXRCLEtBQWYsQ0FBcUIrQyxJQUFyQixLQUE4QjNCLFNBQWxDLEVBQTZDO1VBQzNDLElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZXRCLEtBQWYsQ0FBcUIrQyxJQUE1QixLQUFxQyxTQUF6QyxFQUFvRDtZQUNsRCxNQUFNLElBQUk5QixTQUFKLENBQWMsbUVBQWQsQ0FBTjtVQUNEOztVQUVELEtBQUs1QixNQUFMLENBQVlpQyxPQUFaLENBQW9CdEIsS0FBcEIsQ0FBMEIrQyxJQUExQixHQUFpQzFELE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZXRCLEtBQWYsQ0FBcUIrQyxJQUF0RDtRQUNEOztRQUVELElBQUkxRCxNQUFNLENBQUNpQyxPQUFQLENBQWV0QixLQUFmLENBQXFCZ0QsTUFBckIsS0FBZ0M1QixTQUFwQyxFQUErQztVQUM3QyxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFQLENBQWV0QixLQUFmLENBQXFCZ0QsTUFBNUIsS0FBdUMsU0FBM0MsRUFBc0Q7WUFDcEQsTUFBTSxJQUFJL0IsU0FBSixDQUFjLHFFQUFkLENBQU47VUFDRDs7VUFFRCxLQUFLNUIsTUFBTCxDQUFZaUMsT0FBWixDQUFvQnRCLEtBQXBCLENBQTBCZ0QsTUFBMUIsR0FBbUMzRCxNQUFNLENBQUNpQyxPQUFQLENBQWV0QixLQUFmLENBQXFCZ0QsTUFBeEQ7UUFDRDs7UUFFRCxJQUFJM0QsTUFBTSxDQUFDaUMsT0FBUCxDQUFldEIsS0FBZixDQUFxQmlELE9BQXJCLEtBQWlDN0IsU0FBckMsRUFBZ0Q7VUFDOUMsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBUCxDQUFldEIsS0FBZixDQUFxQmlELE9BQTVCLEtBQXdDLFNBQTVDLEVBQXVEO1lBQ3JELE1BQU0sSUFBSWhDLFNBQUosQ0FBYyxzRUFBZCxDQUFOO1VBQ0Q7O1VBRUQsS0FBSzVCLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0J0QixLQUFwQixDQUEwQmlELE9BQTFCLEdBQW9DNUQsTUFBTSxDQUFDaUMsT0FBUCxDQUFldEIsS0FBZixDQUFxQmlELE9BQXpEO1FBQ0Q7O1FBRUQsSUFBSTVELE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZXRCLEtBQWYsQ0FBcUI2QixLQUFyQixLQUErQlQsU0FBbkMsRUFBOEM7VUFDNUMsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBUCxDQUFldEIsS0FBZixDQUFxQjZCLEtBQTVCLEtBQXNDLFNBQTFDLEVBQXFEO1lBQ25ELE1BQU0sSUFBSVosU0FBSixDQUFjLG9FQUFkLENBQU47VUFDRDs7VUFFRCxLQUFLNUIsTUFBTCxDQUFZaUMsT0FBWixDQUFvQnRCLEtBQXBCLENBQTBCNkIsS0FBMUIsR0FBa0N4QyxNQUFNLENBQUNpQyxPQUFQLENBQWV0QixLQUFmLENBQXFCNkIsS0FBdkQ7UUFDRDtNQUNGOztNQUVELElBQUl4QyxNQUFNLENBQUNpQyxPQUFQLENBQWU0QixjQUFmLEtBQWtDOUIsU0FBdEMsRUFBaUQ7UUFDL0MsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBUCxDQUFlNEIsY0FBdEIsS0FBeUMsU0FBekMsSUFBc0Q3RCxNQUFNLENBQUNpQyxPQUFQLENBQWU0QixjQUFmLEtBQWtDLElBQTVGLEVBQWtHO1VBQ2hHLE1BQU0sSUFBSWpDLFNBQUosQ0FBYywrRUFBZCxDQUFOO1FBQ0Q7O1FBRUQsS0FBSzVCLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0I0QixjQUFwQixHQUFxQzdELE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZTRCLGNBQXBEO01BQ0Q7O01BRUQsSUFBSTdELE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZTZCLHFCQUFmLEtBQXlDL0IsU0FBN0MsRUFBd0Q7UUFDdEQsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBUCxDQUFlNkIscUJBQXRCLEtBQWdELFNBQWhELElBQTZEOUQsTUFBTSxDQUFDaUMsT0FBUCxDQUFlNkIscUJBQWYsS0FBeUMsSUFBMUcsRUFBZ0g7VUFDOUcsTUFBTSxJQUFJbEMsU0FBSixDQUFjLHNGQUFkLENBQU47UUFDRDs7UUFFRCxLQUFLNUIsTUFBTCxDQUFZaUMsT0FBWixDQUFvQjZCLHFCQUFwQixHQUE0QzlELE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZTZCLHFCQUEzRDtNQUNEOztNQUVELElBQUk5RCxNQUFNLENBQUNpQyxPQUFQLENBQWU4QixpQkFBZixLQUFxQ2hDLFNBQXpDLEVBQW9EO1FBQ2xELElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZThCLGlCQUF0QixLQUE0QyxTQUE1QyxJQUF5RC9ELE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZThCLGlCQUFmLEtBQXFDLElBQWxHLEVBQXdHO1VBQ3RHLE1BQU0sSUFBSW5DLFNBQUosQ0FBYyxrRkFBZCxDQUFOO1FBQ0Q7O1FBRUQsS0FBSzVCLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0I4QixpQkFBcEIsR0FBd0MvRCxNQUFNLENBQUNpQyxPQUFQLENBQWU4QixpQkFBdkQ7TUFDRDs7TUFFRCxJQUFJL0QsTUFBTSxDQUFDaUMsT0FBUCxDQUFlK0Isa0JBQWYsS0FBc0NqQyxTQUExQyxFQUFxRDtRQUNuRCxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFQLENBQWUrQixrQkFBdEIsS0FBNkMsU0FBN0MsSUFBMERoRSxNQUFNLENBQUNpQyxPQUFQLENBQWUrQixrQkFBZixLQUFzQyxJQUFwRyxFQUEwRztVQUN4RyxNQUFNLElBQUlwQyxTQUFKLENBQWMsbUZBQWQsQ0FBTjtRQUNEOztRQUVELEtBQUs1QixNQUFMLENBQVlpQyxPQUFaLENBQW9CK0Isa0JBQXBCLEdBQXlDaEUsTUFBTSxDQUFDaUMsT0FBUCxDQUFlK0Isa0JBQXhEO01BQ0Q7O01BRUQsSUFBSWhFLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZWdDLGdCQUFmLEtBQW9DbEMsU0FBeEMsRUFBbUQ7UUFDakQsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBUCxDQUFlZ0MsZ0JBQXRCLEtBQTJDLFNBQTNDLElBQXdEakUsTUFBTSxDQUFDaUMsT0FBUCxDQUFlZ0MsZ0JBQWYsS0FBb0MsSUFBaEcsRUFBc0c7VUFDcEcsTUFBTSxJQUFJckMsU0FBSixDQUFjLGlGQUFkLENBQU47UUFDRDs7UUFFRCxLQUFLNUIsTUFBTCxDQUFZaUMsT0FBWixDQUFvQmdDLGdCQUFwQixHQUF1Q2pFLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZWdDLGdCQUF0RDtNQUNEOztNQUVELElBQUlqRSxNQUFNLENBQUNpQyxPQUFQLENBQWVpQywwQkFBZixLQUE4Q25DLFNBQWxELEVBQTZEO1FBQzNELElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZWlDLDBCQUF0QixLQUFxRCxTQUFyRCxJQUFrRWxFLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZWlDLDBCQUFmLEtBQThDLElBQXBILEVBQTBIO1VBQ3hILE1BQU0sSUFBSXRDLFNBQUosQ0FBYywyRkFBZCxDQUFOO1FBQ0Q7O1FBRUQsS0FBSzVCLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0JpQywwQkFBcEIsR0FBaURsRSxNQUFNLENBQUNpQyxPQUFQLENBQWVpQywwQkFBaEU7TUFDRDs7TUFFRCxJQUFJbEUsTUFBTSxDQUFDaUMsT0FBUCxDQUFla0MseUJBQWYsS0FBNkNwQyxTQUFqRCxFQUE0RDtRQUMxRCxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFQLENBQWVrQyx5QkFBdEIsS0FBb0QsU0FBcEQsSUFBaUVuRSxNQUFNLENBQUNpQyxPQUFQLENBQWVrQyx5QkFBZixLQUE2QyxJQUFsSCxFQUF3SDtVQUN0SCxNQUFNLElBQUl2QyxTQUFKLENBQWMsMEZBQWQsQ0FBTjtRQUNEOztRQUVELEtBQUs1QixNQUFMLENBQVlpQyxPQUFaLENBQW9Ca0MseUJBQXBCLEdBQWdEbkUsTUFBTSxDQUFDaUMsT0FBUCxDQUFla0MseUJBQS9EO01BQ0Q7O01BRUQsSUFBSW5FLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZW1DLDBCQUFmLEtBQThDckMsU0FBbEQsRUFBNkQ7UUFDM0QsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBUCxDQUFlbUMsMEJBQXRCLEtBQXFELFNBQXJELElBQWtFcEUsTUFBTSxDQUFDaUMsT0FBUCxDQUFlbUMsMEJBQWYsS0FBOEMsSUFBcEgsRUFBMEg7VUFDeEgsTUFBTSxJQUFJeEMsU0FBSixDQUFjLDJGQUFkLENBQU47UUFDRDs7UUFFRCxLQUFLNUIsTUFBTCxDQUFZaUMsT0FBWixDQUFvQm1DLDBCQUFwQixHQUFpRHBFLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZW1DLDBCQUFoRTtNQUNEOztNQUVELElBQUlwRSxNQUFNLENBQUNpQyxPQUFQLENBQWVvQyx1QkFBZixLQUEyQ3RDLFNBQS9DLEVBQTBEO1FBQ3hELElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZW9DLHVCQUF0QixLQUFrRCxTQUFsRCxJQUErRHJFLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZW9DLHVCQUFmLEtBQTJDLElBQTlHLEVBQW9IO1VBQ2xILE1BQU0sSUFBSXpDLFNBQUosQ0FBYyx3RkFBZCxDQUFOO1FBQ0Q7O1FBRUQsS0FBSzVCLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0JvQyx1QkFBcEIsR0FBOENyRSxNQUFNLENBQUNpQyxPQUFQLENBQWVvQyx1QkFBN0Q7TUFDRDs7TUFFRCxJQUFJckUsTUFBTSxDQUFDaUMsT0FBUCxDQUFlcUMsc0JBQWYsS0FBMEN2QyxTQUE5QyxFQUF5RDtRQUN2RCxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFQLENBQWVxQyxzQkFBdEIsS0FBaUQsU0FBakQsSUFBOER0RSxNQUFNLENBQUNpQyxPQUFQLENBQWVxQyxzQkFBZixLQUEwQyxJQUE1RyxFQUFrSDtVQUNoSCxNQUFNLElBQUkxQyxTQUFKLENBQWMsdUZBQWQsQ0FBTjtRQUNEOztRQUVELEtBQUs1QixNQUFMLENBQVlpQyxPQUFaLENBQW9CcUMsc0JBQXBCLEdBQTZDdEUsTUFBTSxDQUFDaUMsT0FBUCxDQUFlcUMsc0JBQTVEO01BQ0Q7O01BRUQsSUFBSXRFLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZXNDLE9BQWYsS0FBMkJ4QyxTQUEvQixFQUEwQztRQUN4QyxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFQLENBQWVzQyxPQUF0QixLQUFrQyxTQUF0QyxFQUFpRDtVQUMvQyxNQUFNLElBQUkzQyxTQUFKLENBQWMsZ0VBQWQsQ0FBTjtRQUNEOztRQUVELEtBQUs1QixNQUFMLENBQVlpQyxPQUFaLENBQW9Cc0MsT0FBcEIsR0FBOEJ2RSxNQUFNLENBQUNpQyxPQUFQLENBQWVzQyxPQUE3QztNQUNEOztNQUVELElBQUl2RSxNQUFNLENBQUNpQyxPQUFQLENBQWV1QyxtQkFBZixLQUF1Q3pDLFNBQTNDLEVBQXNEO1FBQ3BELElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZXVDLG1CQUF0QixLQUE4QyxTQUFsRCxFQUE2RDtVQUMzRCxNQUFNLElBQUk1QyxTQUFKLENBQWMsNEVBQWQsQ0FBTjtRQUNEOztRQUVELEtBQUs1QixNQUFMLENBQVlpQyxPQUFaLENBQW9CdUMsbUJBQXBCLEdBQTBDeEUsTUFBTSxDQUFDaUMsT0FBUCxDQUFldUMsbUJBQXpEO01BQ0Q7O01BRUQsSUFBSXhFLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZXlDLFlBQWYsS0FBZ0MzQyxTQUFwQyxFQUErQztRQUM3QyxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFQLENBQWV5QyxZQUF0QixLQUF1QyxRQUEzQyxFQUFxRDtVQUNuRCxNQUFNLElBQUk5QyxTQUFKLENBQWMsb0VBQWQsQ0FBTjtRQUNEOztRQUVELEtBQUs1QixNQUFMLENBQVlpQyxPQUFaLENBQW9CeUMsWUFBcEIsR0FBbUMxRSxNQUFNLENBQUNpQyxPQUFQLENBQWV5QyxZQUFsRDtRQUNBLEtBQUsxRSxNQUFMLENBQVlpQyxPQUFaLENBQW9CZ0QsSUFBcEIsR0FBMkJsRCxTQUEzQjtNQUNEOztNQUVELElBQUkvQixNQUFNLENBQUNpQyxPQUFQLENBQWUwQyxjQUFmLEtBQWtDNUMsU0FBdEMsRUFBaUQ7UUFDL0MsNENBQTBCL0IsTUFBTSxDQUFDaUMsT0FBUCxDQUFlMEMsY0FBekMsRUFBeUQsK0JBQXpEO1FBRUEsS0FBSzNFLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0IwQyxjQUFwQixHQUFxQzNFLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZTBDLGNBQXBEO01BQ0Q7O01BRUQsSUFBSTNFLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZTJDLFFBQWYsS0FBNEI3QyxTQUFoQyxFQUEyQztRQUN6QyxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFQLENBQWUyQyxRQUF0QixLQUFtQyxRQUFuQyxJQUErQzVFLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZTJDLFFBQWYsS0FBNEIsSUFBL0UsRUFBcUY7VUFDbkYsTUFBTSxJQUFJaEQsU0FBSixDQUFjLHdFQUFkLENBQU47UUFDRDs7UUFFRCxLQUFLNUIsTUFBTCxDQUFZaUMsT0FBWixDQUFvQjJDLFFBQXBCLEdBQStCNUUsTUFBTSxDQUFDaUMsT0FBUCxDQUFlMkMsUUFBOUM7TUFDRDs7TUFFRCxJQUFJNUUsTUFBTSxDQUFDaUMsT0FBUCxDQUFlNEMsWUFBZixLQUFnQzlDLFNBQXBDLEVBQStDO1FBQzdDLElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZTRDLFlBQXRCLEtBQXVDLFFBQTNDLEVBQXFEO1VBQ25ELE1BQU0sSUFBSWpELFNBQUosQ0FBYyxvRUFBZCxDQUFOO1FBQ0Q7O1FBRUQsS0FBSzVCLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0I0QyxZQUFwQixHQUFtQzdFLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZTRDLFlBQWxEO01BQ0Q7O01BRUQsSUFBSTdFLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZThDLG1CQUFmLEtBQXVDaEQsU0FBM0MsRUFBc0Q7UUFDcEQsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBUCxDQUFlOEMsbUJBQXRCLEtBQThDLFNBQWxELEVBQTZEO1VBQzNELE1BQU0sSUFBSW5ELFNBQUosQ0FBYyw0RUFBZCxDQUFOO1FBQ0Q7O1FBRUQsS0FBSzVCLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0I4QyxtQkFBcEIsR0FBMEMvRSxNQUFNLENBQUNpQyxPQUFQLENBQWU4QyxtQkFBekQ7TUFDRDs7TUFFRCxJQUFJL0UsTUFBTSxDQUFDaUMsT0FBUCxDQUFlK0MsVUFBZixLQUE4QmpELFNBQWxDLEVBQTZDO1FBQzNDLElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZStDLFVBQXRCLEtBQXFDLFFBQXpDLEVBQW1EO1VBQ2pELE1BQU0sSUFBSXBELFNBQUosQ0FBYyxrRUFBZCxDQUFOO1FBQ0Q7O1FBRUQsS0FBSzVCLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0IrQyxVQUFwQixHQUFpQ2hGLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZStDLFVBQWhEO01BQ0Q7O01BRUQsSUFBSWhGLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZWdELElBQWYsS0FBd0JsRCxTQUE1QixFQUF1QztRQUNyQyxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFQLENBQWVnRCxJQUF0QixLQUErQixRQUFuQyxFQUE2QztVQUMzQyxNQUFNLElBQUlyRCxTQUFKLENBQWMsNERBQWQsQ0FBTjtRQUNEOztRQUVELElBQUk1QixNQUFNLENBQUNpQyxPQUFQLENBQWVnRCxJQUFmLElBQXVCLENBQXZCLElBQTRCakYsTUFBTSxDQUFDaUMsT0FBUCxDQUFlZ0QsSUFBZixJQUF1QixLQUF2RCxFQUE4RDtVQUM1RCxNQUFNLElBQUlnQixVQUFKLENBQWUsNERBQWYsQ0FBTjtRQUNEOztRQUVELEtBQUtqRyxNQUFMLENBQVlpQyxPQUFaLENBQW9CZ0QsSUFBcEIsR0FBMkJqRixNQUFNLENBQUNpQyxPQUFQLENBQWVnRCxJQUExQztRQUNBLEtBQUtqRixNQUFMLENBQVlpQyxPQUFaLENBQW9CeUMsWUFBcEIsR0FBbUMzQyxTQUFuQztNQUNEOztNQUVELElBQUkvQixNQUFNLENBQUNpQyxPQUFQLENBQWVpRCxjQUFmLEtBQWtDbkQsU0FBdEMsRUFBaUQ7UUFDL0MsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBUCxDQUFlaUQsY0FBdEIsS0FBeUMsU0FBN0MsRUFBd0Q7VUFDdEQsTUFBTSxJQUFJdEQsU0FBSixDQUFjLHVFQUFkLENBQU47UUFDRDs7UUFFRCxLQUFLNUIsTUFBTCxDQUFZaUMsT0FBWixDQUFvQmlELGNBQXBCLEdBQXFDbEYsTUFBTSxDQUFDaUMsT0FBUCxDQUFlaUQsY0FBcEQ7TUFDRDs7TUFFRCxJQUFJbEYsTUFBTSxDQUFDaUMsT0FBUCxDQUFla0QsY0FBZixLQUFrQ3BELFNBQXRDLEVBQWlEO1FBQy9DLElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZWtELGNBQXRCLEtBQXlDLFFBQTdDLEVBQXVEO1VBQ3JELE1BQU0sSUFBSXZELFNBQUosQ0FBYyxzRUFBZCxDQUFOO1FBQ0Q7O1FBRUQsS0FBSzVCLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0JrRCxjQUFwQixHQUFxQ25GLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZWtELGNBQXBEO01BQ0Q7O01BRUQsSUFBSW5GLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZTZDLDJCQUFmLEtBQStDL0MsU0FBbkQsRUFBOEQ7UUFDNUQsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBUCxDQUFlNkMsMkJBQXRCLEtBQXNELFFBQTFELEVBQW9FO1VBQ2xFLE1BQU0sSUFBSWxELFNBQUosQ0FBYyxtRkFBZCxDQUFOO1FBQ0Q7O1FBRUQsSUFBSTVCLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZTZDLDJCQUFmLEdBQTZDLENBQWpELEVBQW9EO1VBQ2xELE1BQU0sSUFBSWxELFNBQUosQ0FBYyw0RkFBZCxDQUFOO1FBQ0Q7O1FBRUQsS0FBSzVCLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0I2QywyQkFBcEIsR0FBa0Q5RSxNQUFNLENBQUNpQyxPQUFQLENBQWU2QywyQkFBakU7TUFDRDs7TUFFRCxJQUFJOUUsTUFBTSxDQUFDaUMsT0FBUCxDQUFlZ0IsdUJBQWYsS0FBMkNsQixTQUEvQyxFQUEwRDtRQUN4RCxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFQLENBQWVnQix1QkFBdEIsS0FBa0QsUUFBdEQsRUFBZ0U7VUFDOUQsTUFBTSxJQUFJckIsU0FBSixDQUFjLCtFQUFkLENBQU47UUFDRDs7UUFFRCxJQUFJNUIsTUFBTSxDQUFDaUMsT0FBUCxDQUFlZ0IsdUJBQWYsSUFBMEMsQ0FBOUMsRUFBaUQ7VUFDL0MsTUFBTSxJQUFJckIsU0FBSixDQUFjLCtFQUFkLENBQU47UUFDRDs7UUFFRCxLQUFLNUIsTUFBTCxDQUFZaUMsT0FBWixDQUFvQmdCLHVCQUFwQixHQUE4Q2pELE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZWdCLHVCQUE3RDtNQUNEOztNQUVELElBQUlqRCxNQUFNLENBQUNpQyxPQUFQLENBQWVtRCxtQkFBZixLQUF1Q3JELFNBQTNDLEVBQXNEO1FBQ3BELElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZW1ELG1CQUF0QixLQUE4QyxTQUFsRCxFQUE2RDtVQUMzRCxNQUFNLElBQUl4RCxTQUFKLENBQWMsNEVBQWQsQ0FBTjtRQUNEOztRQUVELEtBQUs1QixNQUFMLENBQVlpQyxPQUFaLENBQW9CbUQsbUJBQXBCLEdBQTBDcEYsTUFBTSxDQUFDaUMsT0FBUCxDQUFlbUQsbUJBQXpEO01BQ0Q7O01BRUQsSUFBSXBGLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZW9ELGdDQUFmLEtBQW9EdEQsU0FBeEQsRUFBbUU7UUFDakUsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBUCxDQUFlb0QsZ0NBQXRCLEtBQTJELFNBQS9ELEVBQTBFO1VBQ3hFLE1BQU0sSUFBSXpELFNBQUosQ0FBYyx5RkFBZCxDQUFOO1FBQ0Q7O1FBRUQsS0FBSzVCLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0JvRCxnQ0FBcEIsR0FBdURyRixNQUFNLENBQUNpQyxPQUFQLENBQWVvRCxnQ0FBdEU7TUFDRDs7TUFFRCxJQUFJckYsTUFBTSxDQUFDaUMsT0FBUCxDQUFldUQsVUFBZixLQUE4QnpELFNBQWxDLEVBQTZDO1FBQzNDLElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZXVELFVBQXRCLEtBQXFDLFFBQXpDLEVBQW1EO1VBQ2pELE1BQU0sSUFBSTVELFNBQUosQ0FBYyxrRUFBZCxDQUFOO1FBQ0Q7O1FBRUQsS0FBSzVCLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0J1RCxVQUFwQixHQUFpQ3hGLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZXVELFVBQWhEO01BQ0Q7O01BRUQsSUFBSXhGLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZXdELFFBQWYsS0FBNEIxRCxTQUFoQyxFQUEyQztRQUN6QyxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFQLENBQWV3RCxRQUF0QixLQUFtQyxRQUFuQyxJQUErQ3pGLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZXdELFFBQWYsS0FBNEIsSUFBL0UsRUFBcUY7VUFDbkYsTUFBTSxJQUFJN0QsU0FBSixDQUFjLHdFQUFkLENBQU47UUFDRDs7UUFFRCxJQUFJNUIsTUFBTSxDQUFDaUMsT0FBUCxDQUFld0QsUUFBZixHQUEwQixVQUE5QixFQUEwQztVQUN4QyxNQUFNLElBQUk3RCxTQUFKLENBQWMsa0VBQWQsQ0FBTjtRQUNELENBRkQsTUFFTyxJQUFJNUIsTUFBTSxDQUFDaUMsT0FBUCxDQUFld0QsUUFBZixHQUEwQixDQUFDLENBQS9CLEVBQWtDO1VBQ3ZDLE1BQU0sSUFBSTdELFNBQUosQ0FBYywwREFBZCxDQUFOO1FBQ0Q7O1FBRUQsS0FBSzVCLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0J3RCxRQUFwQixHQUErQnpGLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZXdELFFBQWYsR0FBMEIsQ0FBekQ7TUFDRDs7TUFFRCxJQUFJekYsTUFBTSxDQUFDaUMsT0FBUCxDQUFlMEQsc0JBQWYsS0FBMEM1RCxTQUE5QyxFQUF5RDtRQUN2RCxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFQLENBQWUwRCxzQkFBdEIsS0FBaUQsU0FBckQsRUFBZ0U7VUFDOUQsTUFBTSxJQUFJL0QsU0FBSixDQUFjLCtFQUFkLENBQU47UUFDRDs7UUFFRCxLQUFLNUIsTUFBTCxDQUFZaUMsT0FBWixDQUFvQjBELHNCQUFwQixHQUE2QzNGLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZTBELHNCQUE1RDtNQUNEOztNQUVELElBQUkzRixNQUFNLENBQUNpQyxPQUFQLENBQWUyRCxjQUFmLEtBQWtDN0QsU0FBdEMsRUFBaUQ7UUFDL0MsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBUCxDQUFlMkQsY0FBdEIsS0FBeUMsU0FBN0MsRUFBd0Q7VUFDdEQsTUFBTSxJQUFJaEUsU0FBSixDQUFjLHVFQUFkLENBQU47UUFDRDs7UUFFRCxLQUFLNUIsTUFBTCxDQUFZaUMsT0FBWixDQUFvQjJELGNBQXBCLEdBQXFDNUYsTUFBTSxDQUFDaUMsT0FBUCxDQUFlMkQsY0FBcEQ7TUFDRDs7TUFFRCxJQUFJNUYsTUFBTSxDQUFDaUMsT0FBUCxDQUFlNEQsTUFBZixLQUEwQjlELFNBQTlCLEVBQXlDO1FBQ3ZDLElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZTRELE1BQXRCLEtBQWlDLFNBQXJDLEVBQWdEO1VBQzlDLE1BQU0sSUFBSWpFLFNBQUosQ0FBYywrREFBZCxDQUFOO1FBQ0Q7O1FBRUQsS0FBSzVCLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0I0RCxNQUFwQixHQUE2QjdGLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZTRELE1BQTVDO01BQ0Q7O01BRUQsSUFBSTdGLE1BQU0sQ0FBQ2lDLE9BQVAsQ0FBZTZELGFBQWYsS0FBaUMvRCxTQUFyQyxFQUFnRDtRQUM5QyxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFQLENBQWU2RCxhQUF0QixLQUF3QyxRQUE1QyxFQUFzRDtVQUNwRCxNQUFNLElBQUlsRSxTQUFKLENBQWMscUVBQWQsQ0FBTjtRQUNEOztRQUVELEtBQUs1QixNQUFMLENBQVlpQyxPQUFaLENBQW9CNkQsYUFBcEIsR0FBb0M5RixNQUFNLENBQUNpQyxPQUFQLENBQWU2RCxhQUFuRDtNQUNEOztNQUVELElBQUk5RixNQUFNLENBQUNpQyxPQUFQLENBQWU4RCxjQUFmLEtBQWtDaEUsU0FBdEMsRUFBaUQ7UUFDL0MsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBUCxDQUFlOEQsY0FBdEIsS0FBeUMsU0FBN0MsRUFBd0Q7VUFDdEQsTUFBTSxJQUFJbkUsU0FBSixDQUFjLHVFQUFkLENBQU47UUFDRDs7UUFFRCxLQUFLNUIsTUFBTCxDQUFZaUMsT0FBWixDQUFvQjhELGNBQXBCLEdBQXFDL0YsTUFBTSxDQUFDaUMsT0FBUCxDQUFlOEQsY0FBcEQ7TUFDRDtJQUNGOztJQUVELEtBQUs3RixvQkFBTCxHQUE0QixLQUFLRixNQUFMLENBQVlpQyxPQUFaLENBQW9CcUIsd0JBQWhEOztJQUNBLElBQUksS0FBS3BELG9CQUFMLENBQTBCZ0csYUFBMUIsS0FBNENuRSxTQUFoRCxFQUEyRDtNQUN6RDtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0EsS0FBSzdCLG9CQUFMLEdBQTRCaUcsTUFBTSxDQUFDQyxNQUFQLENBQWMsS0FBS2xHLG9CQUFuQixFQUF5QztRQUNuRWdHLGFBQWEsRUFBRTtVQUNiRyxLQUFLLEVBQUVDLG1CQUFVQztRQURKO01BRG9ELENBQXpDLENBQTVCO0lBS0Q7O0lBRUQsS0FBSzVGLEtBQUwsR0FBYSxLQUFLNkYsV0FBTCxFQUFiO0lBQ0EsS0FBS3JHLGFBQUwsR0FBcUIsS0FBckI7SUFDQSxLQUFLQyxzQkFBTCxHQUE4QixDQUFDcUcsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQixDQUFuQixFQUFzQixDQUF0QixDQUFaLENBQUQsQ0FBOUIsQ0F0cEIyQyxDQXdwQjNDO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7O0lBQ0EsS0FBS3JHLGdCQUFMLEdBQXdCLENBQXhCO0lBQ0EsS0FBS0MsVUFBTCxHQUFrQixLQUFsQjtJQUNBLEtBQUtHLE1BQUwsR0FBYyxLQUFkO0lBQ0EsS0FBS1ksYUFBTCxHQUFxQm9GLE1BQU0sQ0FBQ0UsS0FBUCxDQUFhLENBQWIsQ0FBckI7SUFFQSxLQUFLcEcsc0JBQUwsR0FBOEIsQ0FBOUI7SUFDQSxLQUFLQyxvQkFBTCxHQUE0QixJQUFJb0csMENBQUosRUFBNUI7SUFFQSxLQUFLNUYsS0FBTCxHQUFhLEtBQUs2RixLQUFMLENBQVdDLFdBQXhCOztJQUVBLEtBQUtwRix1QkFBTCxHQUErQixNQUFNO01BQ25DLEtBQUtYLFNBQUwsQ0FBZWdHLFdBQWYsQ0FBMkJDLGFBQUtDLFNBQWhDO01BQ0EsS0FBS0MsaUJBQUw7SUFDRCxDQUhEO0VBSUQ7O0VBRURDLE9BQU8sQ0FBQ0MsZUFBRCxFQUEwQztJQUMvQyxJQUFJLEtBQUtwRyxLQUFMLEtBQWUsS0FBSzZGLEtBQUwsQ0FBV0MsV0FBOUIsRUFBMkM7TUFDekMsTUFBTSxJQUFJTyx1QkFBSixDQUFvQixzREFBc0QsS0FBS3JHLEtBQUwsQ0FBV3NHLElBQWpFLEdBQXdFLFVBQTVGLENBQU47SUFDRDs7SUFFRCxJQUFJRixlQUFKLEVBQXFCO01BQ25CLE1BQU1HLFNBQVMsR0FBSUMsR0FBRCxJQUFpQjtRQUNqQyxLQUFLQyxjQUFMLENBQW9CLE9BQXBCLEVBQTZCQyxPQUE3QjtRQUNBTixlQUFlLENBQUNJLEdBQUQsQ0FBZjtNQUNELENBSEQ7O01BS0EsTUFBTUUsT0FBTyxHQUFJRixHQUFELElBQWdCO1FBQzlCLEtBQUtDLGNBQUwsQ0FBb0IsU0FBcEIsRUFBK0JGLFNBQS9CO1FBQ0FILGVBQWUsQ0FBQ0ksR0FBRCxDQUFmO01BQ0QsQ0FIRDs7TUFLQSxLQUFLRyxJQUFMLENBQVUsU0FBVixFQUFxQkosU0FBckI7TUFDQSxLQUFLSSxJQUFMLENBQVUsT0FBVixFQUFtQkQsT0FBbkI7SUFDRDs7SUFFRCxLQUFLRSxZQUFMLENBQWtCLEtBQUtmLEtBQUwsQ0FBV2dCLFVBQTdCO0VBQ0Q7RUFFRDtBQUNGO0FBQ0E7OztFQWdFRUMsRUFBRSxDQUFDQyxLQUFELEVBQXlCQyxRQUF6QixFQUE2RDtJQUM3RCxPQUFPLE1BQU1GLEVBQU4sQ0FBU0MsS0FBVCxFQUFnQkMsUUFBaEIsQ0FBUDtFQUNEO0VBRUQ7QUFDRjtBQUNBOzs7RUF1REVDLElBQUksQ0FBQ0YsS0FBRCxFQUF5QixHQUFHRyxJQUE1QixFQUF5QztJQUMzQyxPQUFPLE1BQU1ELElBQU4sQ0FBV0YsS0FBWCxFQUFrQixHQUFHRyxJQUFyQixDQUFQO0VBQ0Q7RUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7RUFDRUMsS0FBSyxHQUFHO0lBQ04sS0FBS1AsWUFBTCxDQUFrQixLQUFLZixLQUFMLENBQVd1QixLQUE3QjtFQUNEO0VBRUQ7QUFDRjtBQUNBOzs7RUFDRUMsb0JBQW9CLEdBQUc7SUFDckIsTUFBTUMsTUFBTSxHQUFHLEtBQUtDLGtCQUFMLEVBQWY7O0lBRUEsSUFBSSxLQUFLdkksTUFBTCxDQUFZaUMsT0FBWixDQUFvQmdELElBQXhCLEVBQThCO01BQzVCLE9BQU8sS0FBS3VELGFBQUwsQ0FBbUIsS0FBS3hJLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0JnRCxJQUF2QyxFQUE2QyxLQUFLakYsTUFBTCxDQUFZaUMsT0FBWixDQUFvQjhDLG1CQUFqRSxFQUFzRnVELE1BQXRGLENBQVA7SUFDRCxDQUZELE1BRU87TUFDTCxPQUFPLG9DQUFlO1FBQ3BCekcsTUFBTSxFQUFFLEtBQUs3QixNQUFMLENBQVk2QixNQURBO1FBRXBCNkMsWUFBWSxFQUFFLEtBQUsxRSxNQUFMLENBQVlpQyxPQUFaLENBQW9CeUMsWUFGZDtRQUdwQitELE9BQU8sRUFBRSxLQUFLekksTUFBTCxDQUFZaUMsT0FBWixDQUFvQmlCLGNBSFQ7UUFJcEJvRixNQUFNLEVBQUVBO01BSlksQ0FBZixFQUtKSSxJQUxJLENBS0V6RCxJQUFELElBQVU7UUFDaEIwRCxPQUFPLENBQUNDLFFBQVIsQ0FBaUIsTUFBTTtVQUNyQixLQUFLSixhQUFMLENBQW1CdkQsSUFBbkIsRUFBeUIsS0FBS2pGLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0I4QyxtQkFBN0MsRUFBa0V1RCxNQUFsRTtRQUNELENBRkQ7TUFHRCxDQVRNLEVBU0hkLEdBQUQsSUFBUztRQUNWLElBQUlBLEdBQUcsQ0FBQ0YsSUFBSixLQUFhLFlBQWpCLEVBQStCO1VBQzdCO1VBQ0E7UUFDRDs7UUFFRHFCLE9BQU8sQ0FBQ0MsUUFBUixDQUFpQixNQUFNO1VBQ3JCLEtBQUtYLElBQUwsQ0FBVSxTQUFWLEVBQXFCLElBQUlaLHVCQUFKLENBQW9CRyxHQUFHLENBQUNxQixPQUF4QixFQUFpQyxhQUFqQyxDQUFyQjtRQUNELENBRkQ7TUFHRCxDQWxCTSxDQUFQO0lBbUJEO0VBQ0Y7RUFFRDtBQUNGO0FBQ0E7OztFQUNFQyxpQkFBaUIsQ0FBQ0MsV0FBRCxFQUE4RDtJQUM3RSxJQUFJLENBQUMsS0FBS3RJLE1BQVYsRUFBa0I7TUFDaEIsS0FBS3VJLGlCQUFMO01BQ0EsS0FBS0MsaUJBQUw7TUFDQSxLQUFLQyxlQUFMO01BQ0EsS0FBS0MsZUFBTDs7TUFDQSxJQUFJSixXQUFXLEtBQUt0SixZQUFZLENBQUNFLFFBQWpDLEVBQTJDO1FBQ3pDLEtBQUtzSSxJQUFMLENBQVUsV0FBVjtNQUNELENBRkQsTUFFTyxJQUFJYyxXQUFXLEtBQUt0SixZQUFZLENBQUNHLEtBQWpDLEVBQXdDO1FBQzdDK0ksT0FBTyxDQUFDQyxRQUFSLENBQWlCLE1BQU07VUFDckIsS0FBS1gsSUFBTCxDQUFVLEtBQVY7UUFDRCxDQUZEO01BR0Q7O01BRUQsTUFBTS9HLE9BQU8sR0FBRyxLQUFLQSxPQUFyQjs7TUFDQSxJQUFJQSxPQUFKLEVBQWE7UUFDWCxNQUFNc0csR0FBRyxHQUFHLElBQUk0QixvQkFBSixDQUFpQiw2Q0FBakIsRUFBZ0UsUUFBaEUsQ0FBWjtRQUNBbEksT0FBTyxDQUFDbUksUUFBUixDQUFpQjdCLEdBQWpCO1FBQ0EsS0FBS3RHLE9BQUwsR0FBZWEsU0FBZjtNQUNEOztNQUVELEtBQUt0QixNQUFMLEdBQWMsSUFBZDtNQUNBLEtBQUtDLFVBQUwsR0FBa0JxQixTQUFsQjtJQUNEO0VBQ0Y7RUFFRDtBQUNGO0FBQ0E7OztFQUNFeUUsV0FBVyxHQUFHO0lBQ1osTUFBTTdGLEtBQUssR0FBRyxJQUFJMkksY0FBSixDQUFVLEtBQUt0SixNQUFMLENBQVlpQyxPQUFaLENBQW9CdEIsS0FBOUIsQ0FBZDtJQUNBQSxLQUFLLENBQUNtSCxFQUFOLENBQVMsT0FBVCxFQUFtQmUsT0FBRCxJQUFhO01BQzdCLEtBQUtaLElBQUwsQ0FBVSxPQUFWLEVBQW1CWSxPQUFuQjtJQUNELENBRkQ7SUFHQSxPQUFPbEksS0FBUDtFQUNEO0VBRUQ7QUFDRjtBQUNBOzs7RUFDRTRJLHVCQUF1QixDQUFDVixPQUFELEVBQW1CVyxPQUFuQixFQUEwQztJQUMvRCxPQUFPLElBQUlDLHlCQUFKLENBQXNCWixPQUF0QixFQUErQixLQUFLbEksS0FBcEMsRUFBMkM2SSxPQUEzQyxFQUFvRCxLQUFLeEosTUFBTCxDQUFZaUMsT0FBaEUsQ0FBUDtFQUNEOztFQUVEdUcsYUFBYSxDQUFDdkQsSUFBRCxFQUFlRixtQkFBZixFQUE2Q3VELE1BQTdDLEVBQWtFO0lBQzdFLE1BQU1vQixXQUFXLEdBQUc7TUFDbEJDLElBQUksRUFBRSxLQUFLN0ksV0FBTCxHQUFtQixLQUFLQSxXQUFMLENBQWlCZSxNQUFwQyxHQUE2QyxLQUFLN0IsTUFBTCxDQUFZNkIsTUFEN0M7TUFFbEJvRCxJQUFJLEVBQUUsS0FBS25FLFdBQUwsR0FBbUIsS0FBS0EsV0FBTCxDQUFpQm1FLElBQXBDLEdBQTJDQSxJQUYvQjtNQUdsQkosWUFBWSxFQUFFLEtBQUs3RSxNQUFMLENBQVlpQyxPQUFaLENBQW9CNEM7SUFIaEIsQ0FBcEI7SUFNQSxNQUFNc0MsT0FBTyxHQUFHcEMsbUJBQW1CLEdBQUc2RSw0QkFBSCxHQUF1QkMsNEJBQTFEO0lBRUExQyxPQUFPLENBQUN1QyxXQUFELEVBQWNJLGFBQUlDLE1BQWxCLEVBQTBCekIsTUFBMUIsQ0FBUCxDQUF5Q0ksSUFBekMsQ0FBK0N0SCxNQUFELElBQVk7TUFDeER1SCxPQUFPLENBQUNDLFFBQVIsQ0FBaUIsTUFBTTtRQUNyQnhILE1BQU0sQ0FBQzBHLEVBQVAsQ0FBVSxPQUFWLEVBQW9Ca0MsS0FBRCxJQUFXO1VBQUUsS0FBS0MsV0FBTCxDQUFpQkQsS0FBakI7UUFBMEIsQ0FBMUQ7UUFDQTVJLE1BQU0sQ0FBQzBHLEVBQVAsQ0FBVSxPQUFWLEVBQW1CLE1BQU07VUFBRSxLQUFLb0MsV0FBTDtRQUFxQixDQUFoRDtRQUNBOUksTUFBTSxDQUFDMEcsRUFBUCxDQUFVLEtBQVYsRUFBaUIsTUFBTTtVQUFFLEtBQUtxQyxTQUFMO1FBQW1CLENBQTVDO1FBQ0EvSSxNQUFNLENBQUNnSixZQUFQLENBQW9CLElBQXBCLEVBQTBCdkwsd0JBQTFCO1FBRUEsS0FBS2tDLFNBQUwsR0FBaUIsSUFBSXNKLGtCQUFKLENBQWNqSixNQUFkLEVBQXNCLEtBQUtwQixNQUFMLENBQVlpQyxPQUFaLENBQW9CK0MsVUFBMUMsRUFBc0QsS0FBS3JFLEtBQTNELENBQWpCO1FBQ0EsS0FBS0ksU0FBTCxDQUFlK0csRUFBZixDQUFrQixRQUFsQixFQUE2QndDLFNBQUQsSUFBZTtVQUFFLEtBQUtyQyxJQUFMLENBQVUsUUFBVixFQUFvQnFDLFNBQXBCO1FBQWlDLENBQTlFO1FBRUEsS0FBS2xKLE1BQUwsR0FBY0EsTUFBZDtRQUVBLEtBQUtYLE1BQUwsR0FBYyxLQUFkO1FBQ0EsS0FBS0UsS0FBTCxDQUFXNEosR0FBWCxDQUFlLGtCQUFrQixLQUFLdkssTUFBTCxDQUFZNkIsTUFBOUIsR0FBdUMsR0FBdkMsR0FBNkMsS0FBSzdCLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0JnRCxJQUFoRjtRQUVBLEtBQUt1RixZQUFMO1FBQ0EsS0FBSzVDLFlBQUwsQ0FBa0IsS0FBS2YsS0FBTCxDQUFXNEQsYUFBN0I7TUFDRCxDQWhCRDtJQWlCRCxDQWxCRCxFQWtCSWpELEdBQUQsSUFBUztNQUNWLElBQUlBLEdBQUcsQ0FBQ0YsSUFBSixLQUFhLFlBQWpCLEVBQStCO1FBQzdCO01BQ0Q7O01BRURxQixPQUFPLENBQUNDLFFBQVIsQ0FBaUIsTUFBTTtRQUFFLEtBQUtxQixXQUFMLENBQWlCekMsR0FBakI7TUFBd0IsQ0FBakQ7SUFDRCxDQXhCRDtFQXlCRDtFQUVEO0FBQ0Y7QUFDQTs7O0VBQ0UyQixlQUFlLEdBQUc7SUFDaEIsSUFBSSxLQUFLL0gsTUFBVCxFQUFpQjtNQUNmLEtBQUtBLE1BQUwsQ0FBWXNKLE9BQVo7SUFDRDtFQUNGO0VBRUQ7QUFDRjtBQUNBOzs7RUFDRW5DLGtCQUFrQixHQUFHO0lBQ25CLE1BQU1vQyxVQUFVLEdBQUcsSUFBSUMsb0NBQUosRUFBbkI7SUFDQSxLQUFLdEosWUFBTCxHQUFvQnVKLFVBQVUsQ0FBQyxNQUFNO01BQ25DRixVQUFVLENBQUNHLEtBQVg7TUFDQSxLQUFLNUgsY0FBTDtJQUNELENBSDZCLEVBRzNCLEtBQUtsRCxNQUFMLENBQVlpQyxPQUFaLENBQW9CaUIsY0FITyxDQUE5QjtJQUlBLE9BQU95SCxVQUFVLENBQUNyQyxNQUFsQjtFQUNEO0VBRUQ7QUFDRjtBQUNBOzs7RUFDRXBCLGlCQUFpQixHQUFHO0lBQ2xCLEtBQUs2RCxnQkFBTDtJQUNBLE1BQU10QyxPQUFPLEdBQUcsS0FBS3pJLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0JZLGFBQXBDOztJQUNBLElBQUk0RixPQUFPLEdBQUcsQ0FBZCxFQUFpQjtNQUNmLEtBQUtsSCxXQUFMLEdBQW1Cc0osVUFBVSxDQUFDLE1BQU07UUFDbEMsS0FBS2hJLGFBQUw7TUFDRCxDQUY0QixFQUUxQjRGLE9BRjBCLENBQTdCO0lBR0Q7RUFDRjtFQUVEO0FBQ0Y7QUFDQTs7O0VBQ0V1QyxrQkFBa0IsR0FBRztJQUNuQixLQUFLL0IsaUJBQUwsR0FEbUIsQ0FDTzs7SUFDMUIsTUFBTS9ILE9BQU8sR0FBRyxLQUFLQSxPQUFyQjtJQUNBLE1BQU11SCxPQUFPLEdBQUl2SCxPQUFPLENBQUN1SCxPQUFSLEtBQW9CMUcsU0FBckIsR0FBa0NiLE9BQU8sQ0FBQ3VILE9BQTFDLEdBQW9ELEtBQUt6SSxNQUFMLENBQVlpQyxPQUFaLENBQW9Ca0QsY0FBeEY7O0lBQ0EsSUFBSXNELE9BQUosRUFBYTtNQUNYLEtBQUtqSCxZQUFMLEdBQW9CcUosVUFBVSxDQUFDLE1BQU07UUFDbkMsS0FBSzFGLGNBQUw7TUFDRCxDQUY2QixFQUUzQnNELE9BRjJCLENBQTlCO0lBR0Q7RUFDRjtFQUVEO0FBQ0Y7QUFDQTs7O0VBQ0V3QyxnQkFBZ0IsR0FBRztJQUNqQixLQUFLL0IsZUFBTDtJQUNBLEtBQUt6SCxVQUFMLEdBQWtCb0osVUFBVSxDQUFDLE1BQU07TUFDakMsS0FBS0ssWUFBTDtJQUNELENBRjJCLEVBRXpCLEtBQUtsTCxNQUFMLENBQVlpQyxPQUFaLENBQW9CZ0IsdUJBRkssQ0FBNUI7RUFHRDtFQUVEO0FBQ0Y7QUFDQTs7O0VBQ0VDLGNBQWMsR0FBRztJQUNmLE1BQU0yRixPQUFPLEdBQUksd0JBQXVCLEtBQUs3SSxNQUFMLENBQVk2QixNQUFPLEdBQUUsS0FBSzdCLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0JnRCxJQUFwQixHQUE0QixJQUFHLEtBQUtqRixNQUFMLENBQVlpQyxPQUFaLENBQW9CZ0QsSUFBSyxFQUF4RCxHQUE2RCxLQUFJLEtBQUtqRixNQUFMLENBQVlpQyxPQUFaLENBQW9CeUMsWUFBYSxFQUFFLE9BQU0sS0FBSzFFLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0JpQixjQUFlLElBQTFNO0lBQ0EsS0FBS3ZDLEtBQUwsQ0FBVzRKLEdBQVgsQ0FBZTFCLE9BQWY7SUFDQSxLQUFLWixJQUFMLENBQVUsU0FBVixFQUFxQixJQUFJWix1QkFBSixDQUFvQndCLE9BQXBCLEVBQTZCLFVBQTdCLENBQXJCO0lBQ0EsS0FBS3ZILFlBQUwsR0FBb0JTLFNBQXBCO0lBQ0EsS0FBS29KLGFBQUwsQ0FBbUIsZ0JBQW5CO0VBQ0Q7RUFFRDtBQUNGO0FBQ0E7OztFQUNFdEksYUFBYSxHQUFHO0lBQ2QsTUFBTWdHLE9BQU8sR0FBSSwrQkFBOEIsS0FBSzdJLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0JZLGFBQWMsSUFBakY7SUFDQSxLQUFLbEMsS0FBTCxDQUFXNEosR0FBWCxDQUFlMUIsT0FBZjtJQUNBLEtBQUtzQyxhQUFMLENBQW1CLGFBQW5CLEVBQWtDLElBQUk5RCx1QkFBSixDQUFvQndCLE9BQXBCLEVBQTZCLFVBQTdCLENBQWxDO0VBQ0Q7RUFFRDtBQUNGO0FBQ0E7OztFQUNFMUQsY0FBYyxHQUFHO0lBQ2YsS0FBSzNELFlBQUwsR0FBb0JPLFNBQXBCO0lBQ0EsTUFBTWIsT0FBTyxHQUFHLEtBQUtBLE9BQXJCO0lBQ0FBLE9BQU8sQ0FBQ2tLLE1BQVI7SUFDQSxNQUFNM0MsT0FBTyxHQUFJdkgsT0FBTyxDQUFDdUgsT0FBUixLQUFvQjFHLFNBQXJCLEdBQWtDYixPQUFPLENBQUN1SCxPQUExQyxHQUFvRCxLQUFLekksTUFBTCxDQUFZaUMsT0FBWixDQUFvQmtELGNBQXhGO0lBQ0EsTUFBTTBELE9BQU8sR0FBRyw0Q0FBNENKLE9BQTVDLEdBQXNELElBQXRFO0lBQ0F2SCxPQUFPLENBQUM4SSxLQUFSLEdBQWdCLElBQUlaLG9CQUFKLENBQWlCUCxPQUFqQixFQUEwQixVQUExQixDQUFoQjtFQUNEO0VBRUQ7QUFDRjtBQUNBOzs7RUFDRXFDLFlBQVksR0FBRztJQUNiLEtBQUt6SixVQUFMLEdBQWtCTSxTQUFsQjtJQUNBLEtBQUtrRyxJQUFMLENBQVUsT0FBVjtJQUNBLEtBQUtMLFlBQUwsQ0FBa0IsS0FBS2YsS0FBTCxDQUFXZ0IsVUFBN0I7RUFDRDtFQUVEO0FBQ0Y7QUFDQTs7O0VBQ0VtQixpQkFBaUIsR0FBRztJQUNsQixJQUFJLEtBQUsxSCxZQUFULEVBQXVCO01BQ3JCK0osWUFBWSxDQUFDLEtBQUsvSixZQUFOLENBQVo7TUFDQSxLQUFLQSxZQUFMLEdBQW9CUyxTQUFwQjtJQUNEO0VBQ0Y7RUFFRDtBQUNGO0FBQ0E7OztFQUNFZ0osZ0JBQWdCLEdBQUc7SUFDakIsSUFBSSxLQUFLeEosV0FBVCxFQUFzQjtNQUNwQjhKLFlBQVksQ0FBQyxLQUFLOUosV0FBTixDQUFaO01BQ0EsS0FBS0EsV0FBTCxHQUFtQlEsU0FBbkI7SUFDRDtFQUNGO0VBRUQ7QUFDRjtBQUNBOzs7RUFDRWtILGlCQUFpQixHQUFHO0lBQ2xCLElBQUksS0FBS3pILFlBQVQsRUFBdUI7TUFDckI2SixZQUFZLENBQUMsS0FBSzdKLFlBQU4sQ0FBWjtNQUNBLEtBQUtBLFlBQUwsR0FBb0JPLFNBQXBCO0lBQ0Q7RUFDRjtFQUVEO0FBQ0Y7QUFDQTs7O0VBQ0VtSCxlQUFlLEdBQUc7SUFDaEIsSUFBSSxLQUFLekgsVUFBVCxFQUFxQjtNQUNuQjRKLFlBQVksQ0FBQyxLQUFLNUosVUFBTixDQUFaO01BQ0EsS0FBS0EsVUFBTCxHQUFrQk0sU0FBbEI7SUFDRDtFQUNGO0VBRUQ7QUFDRjtBQUNBOzs7RUFDRTZGLFlBQVksQ0FBQzBELFFBQUQsRUFBa0I7SUFDNUIsSUFBSSxLQUFLdEssS0FBTCxLQUFlc0ssUUFBbkIsRUFBNkI7TUFDM0IsS0FBSzNLLEtBQUwsQ0FBVzRKLEdBQVgsQ0FBZSxzQkFBc0JlLFFBQVEsQ0FBQ2hFLElBQTlDO01BQ0E7SUFDRDs7SUFFRCxJQUFJLEtBQUt0RyxLQUFMLElBQWMsS0FBS0EsS0FBTCxDQUFXdUssSUFBN0IsRUFBbUM7TUFDakMsS0FBS3ZLLEtBQUwsQ0FBV3VLLElBQVgsQ0FBZ0JDLElBQWhCLENBQXFCLElBQXJCLEVBQTJCRixRQUEzQjtJQUNEOztJQUVELEtBQUszSyxLQUFMLENBQVc0SixHQUFYLENBQWUsb0JBQW9CLEtBQUt2SixLQUFMLEdBQWEsS0FBS0EsS0FBTCxDQUFXc0csSUFBeEIsR0FBK0IsV0FBbkQsSUFBa0UsTUFBbEUsR0FBMkVnRSxRQUFRLENBQUNoRSxJQUFuRztJQUNBLEtBQUt0RyxLQUFMLEdBQWFzSyxRQUFiOztJQUVBLElBQUksS0FBS3RLLEtBQUwsQ0FBV3lLLEtBQWYsRUFBc0I7TUFDcEIsS0FBS3pLLEtBQUwsQ0FBV3lLLEtBQVgsQ0FBaUJDLEtBQWpCLENBQXVCLElBQXZCO0lBQ0Q7RUFDRjtFQUVEO0FBQ0Y7QUFDQTs7O0VBQ0VDLGVBQWUsQ0FBa0NDLFNBQWxDLEVBQWlGO0lBQzlGLE1BQU1wQyxPQUFPLEdBQUcsS0FBS3hJLEtBQUwsQ0FBVzZLLE1BQVgsQ0FBa0JELFNBQWxCLENBQWhCOztJQUVBLElBQUksQ0FBQ3BDLE9BQUwsRUFBYztNQUNaLE1BQU0sSUFBSXhELEtBQUosQ0FBVyxhQUFZNEYsU0FBVSxlQUFjLEtBQUs1SyxLQUFMLENBQVdzRyxJQUFLLEdBQS9ELENBQU47SUFDRDs7SUFFRCxPQUFPa0MsT0FBUDtFQUNEO0VBRUQ7QUFDRjtBQUNBOzs7RUFDRTJCLGFBQWEsQ0FBa0NTLFNBQWxDLEVBQWdELEdBQUcxRCxJQUFuRCxFQUFzRztJQUNqSCxNQUFNc0IsT0FBTyxHQUFHLEtBQUt4SSxLQUFMLENBQVc2SyxNQUFYLENBQWtCRCxTQUFsQixDQUFoQjs7SUFDQSxJQUFJcEMsT0FBSixFQUFhO01BQ1hBLE9BQU8sQ0FBQ2tDLEtBQVIsQ0FBYyxJQUFkLEVBQW9CeEQsSUFBcEI7SUFDRCxDQUZELE1BRU87TUFDTCxLQUFLRCxJQUFMLENBQVUsT0FBVixFQUFtQixJQUFJakMsS0FBSixDQUFXLGFBQVk0RixTQUFVLGVBQWMsS0FBSzVLLEtBQUwsQ0FBV3NHLElBQUssR0FBL0QsQ0FBbkI7TUFDQSxLQUFLYSxLQUFMO0lBQ0Q7RUFDRjtFQUVEO0FBQ0Y7QUFDQTs7O0VBQ0U4QixXQUFXLENBQUNELEtBQUQsRUFBZTtJQUN4QixJQUFJLEtBQUtoSixLQUFMLEtBQWUsS0FBSzZGLEtBQUwsQ0FBV2dCLFVBQTFCLElBQXdDLEtBQUs3RyxLQUFMLEtBQWUsS0FBSzZGLEtBQUwsQ0FBV2lGLHNCQUF0RSxFQUE4RjtNQUM1RixNQUFNakQsT0FBTyxHQUFJLHdCQUF1QixLQUFLN0ksTUFBTCxDQUFZNkIsTUFBTyxJQUFHLEtBQUs3QixNQUFMLENBQVlpQyxPQUFaLENBQW9CZ0QsSUFBSyxNQUFLK0UsS0FBSyxDQUFDbkIsT0FBUSxFQUExRztNQUNBLEtBQUtsSSxLQUFMLENBQVc0SixHQUFYLENBQWUxQixPQUFmO01BQ0EsS0FBS1osSUFBTCxDQUFVLFNBQVYsRUFBcUIsSUFBSVosdUJBQUosQ0FBb0J3QixPQUFwQixFQUE2QixTQUE3QixDQUFyQjtJQUNELENBSkQsTUFJTztNQUNMLE1BQU1BLE9BQU8sR0FBSSxxQkFBb0JtQixLQUFLLENBQUNuQixPQUFRLEVBQW5EO01BQ0EsS0FBS2xJLEtBQUwsQ0FBVzRKLEdBQVgsQ0FBZTFCLE9BQWY7TUFDQSxLQUFLWixJQUFMLENBQVUsT0FBVixFQUFtQixJQUFJWix1QkFBSixDQUFvQndCLE9BQXBCLEVBQTZCLFNBQTdCLENBQW5CO0lBQ0Q7O0lBQ0QsS0FBS3NDLGFBQUwsQ0FBbUIsYUFBbkIsRUFBa0NuQixLQUFsQztFQUNEO0VBRUQ7QUFDRjtBQUNBOzs7RUFDRUcsU0FBUyxHQUFHO0lBQ1YsS0FBS3hKLEtBQUwsQ0FBVzRKLEdBQVgsQ0FBZSxjQUFmOztJQUNBLElBQUksS0FBS3ZKLEtBQUwsS0FBZSxLQUFLNkYsS0FBTCxDQUFXdUIsS0FBOUIsRUFBcUM7TUFDbkMsTUFBTTRCLEtBQW9CLEdBQUcsSUFBSWhFLEtBQUosQ0FBVSxnQkFBVixDQUE3QjtNQUNBZ0UsS0FBSyxDQUFDK0IsSUFBTixHQUFhLFlBQWI7TUFDQSxLQUFLOUIsV0FBTCxDQUFpQkQsS0FBakI7SUFDRDtFQUNGO0VBRUQ7QUFDRjtBQUNBOzs7RUFDRUUsV0FBVyxHQUFHO0lBQ1osS0FBS3ZKLEtBQUwsQ0FBVzRKLEdBQVgsQ0FBZSxtQkFBbUIsS0FBS3ZLLE1BQUwsQ0FBWTZCLE1BQS9CLEdBQXdDLEdBQXhDLEdBQThDLEtBQUs3QixNQUFMLENBQVlpQyxPQUFaLENBQW9CZ0QsSUFBbEUsR0FBeUUsU0FBeEY7O0lBQ0EsSUFBSSxLQUFLakUsS0FBTCxLQUFlLEtBQUs2RixLQUFMLENBQVdtRixTQUE5QixFQUF5QztNQUN2QyxLQUFLckwsS0FBTCxDQUFXNEosR0FBWCxDQUFlLGtCQUFrQixLQUFLekosV0FBTCxDQUFrQmUsTUFBcEMsR0FBNkMsR0FBN0MsR0FBbUQsS0FBS2YsV0FBTCxDQUFrQm1FLElBQXBGO01BRUEsS0FBS2tHLGFBQUwsQ0FBbUIsV0FBbkI7SUFDRCxDQUpELE1BSU8sSUFBSSxLQUFLbkssS0FBTCxLQUFlLEtBQUs2RixLQUFMLENBQVdvRix1QkFBOUIsRUFBdUQ7TUFDNUQsTUFBTXBLLE1BQU0sR0FBRyxLQUFLZixXQUFMLEdBQW1CLEtBQUtBLFdBQUwsQ0FBaUJlLE1BQXBDLEdBQTZDLEtBQUs3QixNQUFMLENBQVk2QixNQUF4RTtNQUNBLE1BQU1vRCxJQUFJLEdBQUcsS0FBS25FLFdBQUwsR0FBbUIsS0FBS0EsV0FBTCxDQUFpQm1FLElBQXBDLEdBQTJDLEtBQUtqRixNQUFMLENBQVlpQyxPQUFaLENBQW9CZ0QsSUFBNUU7TUFDQSxLQUFLdEUsS0FBTCxDQUFXNEosR0FBWCxDQUFlLGlEQUFpRDFJLE1BQWpELEdBQTBELEdBQTFELEdBQWdFb0QsSUFBL0U7TUFFQSxLQUFLa0csYUFBTCxDQUFtQixPQUFuQjtJQUNELENBTk0sTUFNQTtNQUNMLEtBQUt2RCxZQUFMLENBQWtCLEtBQUtmLEtBQUwsQ0FBV3VCLEtBQTdCO0lBQ0Q7RUFDRjtFQUVEO0FBQ0Y7QUFDQTs7O0VBQ0VvQyxZQUFZLEdBQUc7SUFDYixNQUFNLEdBQUkwQixLQUFKLEVBQVdDLEtBQVgsRUFBa0JDLEtBQWxCLElBQTRCLHVCQUF1QkMsSUFBdkIsQ0FBNEJDLGdCQUE1QixLQUF3QyxDQUFFLE9BQUYsRUFBVyxHQUFYLEVBQWdCLEdBQWhCLEVBQXFCLEdBQXJCLENBQTFFO0lBRUEsTUFBTTFJLE9BQU8sR0FBRyxJQUFJMkksd0JBQUosQ0FBb0I7TUFDbENoSSxPQUFPLEVBQUUsS0FBS3ZFLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0JzQyxPQURLO01BRWxDK0gsT0FBTyxFQUFFO1FBQUVKLEtBQUssRUFBRU0sTUFBTSxDQUFDTixLQUFELENBQWY7UUFBd0JDLEtBQUssRUFBRUssTUFBTSxDQUFDTCxLQUFELENBQXJDO1FBQThDQyxLQUFLLEVBQUVJLE1BQU0sQ0FBQ0osS0FBRCxDQUEzRDtRQUFvRUssUUFBUSxFQUFFO01BQTlFO0lBRnlCLENBQXBCLENBQWhCO0lBS0EsS0FBSzFMLFNBQUwsQ0FBZWdHLFdBQWYsQ0FBMkJDLGFBQUswRixRQUFoQyxFQUEwQzlJLE9BQU8sQ0FBQ0YsSUFBbEQ7SUFDQSxLQUFLL0MsS0FBTCxDQUFXaUQsT0FBWCxDQUFtQixZQUFXO01BQzVCLE9BQU9BLE9BQU8sQ0FBQytJLFFBQVIsQ0FBaUIsSUFBakIsQ0FBUDtJQUNELENBRkQ7RUFHRDtFQUVEO0FBQ0Y7QUFDQTs7O0VBQ0VDLGdCQUFnQixHQUFHO0lBQ2pCLE1BQU1oSixPQUFPLEdBQUcsSUFBSWlKLHNCQUFKLENBQWtCO01BQ2hDckgsVUFBVSxFQUFFc0gsc0JBQVMsS0FBSzlNLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0J1RCxVQUE3QixDQURvQjtNQUVoQ1IsVUFBVSxFQUFFLEtBQUtoRixNQUFMLENBQVlpQyxPQUFaLENBQW9CK0MsVUFGQTtNQUdoQytILGFBQWEsRUFBRSxDQUhpQjtNQUloQ0MsU0FBUyxFQUFFckUsT0FBTyxDQUFDc0UsR0FKYTtNQUtoQ0MsWUFBWSxFQUFFLENBTGtCO01BTWhDQyxjQUFjLEVBQUUsSUFBSUMsSUFBSixHQUFXQyxpQkFBWCxFQU5nQjtNQU9oQ0MsVUFBVSxFQUFFO0lBUG9CLENBQWxCLENBQWhCO0lBVUEsTUFBTTtNQUFFeEw7SUFBRixJQUFxQixLQUFLOUIsTUFBaEM7O0lBQ0EsUUFBUThCLGNBQWMsQ0FBQ0UsSUFBdkI7TUFDRSxLQUFLLGlDQUFMO1FBQ0U0QixPQUFPLENBQUMySixPQUFSLEdBQWtCO1VBQ2hCdkwsSUFBSSxFQUFFLE1BRFU7VUFFaEJ3TCxJQUFJLEVBQUUsS0FBS3ZOLGVBRks7VUFHaEJ3TixRQUFRLEVBQUU7UUFITSxDQUFsQjtRQUtBOztNQUVGLEtBQUsscUNBQUw7UUFDRTdKLE9BQU8sQ0FBQzJKLE9BQVIsR0FBa0I7VUFDaEJ2TCxJQUFJLEVBQUUsZUFEVTtVQUVoQndMLElBQUksRUFBRSxLQUFLdk4sZUFGSztVQUdoQnlOLFlBQVksRUFBRTVMLGNBQWMsQ0FBQ0csT0FBZixDQUF1Qk87UUFIckIsQ0FBbEI7UUFLQTs7TUFFRixLQUFLLCtCQUFMO01BQ0EsS0FBSyxnQ0FBTDtNQUNBLEtBQUssd0NBQUw7TUFDQSxLQUFLLGlEQUFMO1FBQ0VvQixPQUFPLENBQUMySixPQUFSLEdBQWtCO1VBQ2hCdkwsSUFBSSxFQUFFLE1BRFU7VUFFaEJ3TCxJQUFJLEVBQUUsS0FBS3ZOLGVBRks7VUFHaEJ3TixRQUFRLEVBQUU7UUFITSxDQUFsQjtRQUtBOztNQUVGLEtBQUssTUFBTDtRQUNFN0osT0FBTyxDQUFDK0osSUFBUixHQUFlLDZCQUFrQjtVQUFFekwsTUFBTSxFQUFFSixjQUFjLENBQUNHLE9BQWYsQ0FBdUJDO1FBQWpDLENBQWxCLENBQWY7UUFDQTs7TUFFRjtRQUNFMEIsT0FBTyxDQUFDekIsUUFBUixHQUFtQkwsY0FBYyxDQUFDRyxPQUFmLENBQXVCRSxRQUExQztRQUNBeUIsT0FBTyxDQUFDeEIsUUFBUixHQUFtQk4sY0FBYyxDQUFDRyxPQUFmLENBQXVCRyxRQUExQztJQWxDSjs7SUFxQ0F3QixPQUFPLENBQUNnSyxRQUFSLEdBQW1CLEtBQUs1TixNQUFMLENBQVlpQyxPQUFaLENBQW9CNkQsYUFBcEIsSUFBcUMrSCxZQUFHRCxRQUFILEVBQXhEO0lBQ0FoSyxPQUFPLENBQUMwQixVQUFSLEdBQXFCLEtBQUt4RSxXQUFMLEdBQW1CLEtBQUtBLFdBQUwsQ0FBaUJlLE1BQXBDLEdBQTZDLEtBQUs3QixNQUFMLENBQVk2QixNQUE5RTtJQUNBK0IsT0FBTyxDQUFDakIsT0FBUixHQUFrQixLQUFLM0MsTUFBTCxDQUFZaUMsT0FBWixDQUFvQlUsT0FBcEIsSUFBK0IsU0FBakQ7SUFDQWlCLE9BQU8sQ0FBQ2tLLFdBQVIsR0FBc0JBLGFBQXRCO0lBQ0FsSyxPQUFPLENBQUNnQixRQUFSLEdBQW1CLEtBQUs1RSxNQUFMLENBQVlpQyxPQUFaLENBQW9CMkMsUUFBdkM7SUFDQWhCLE9BQU8sQ0FBQ0wsUUFBUixHQUFtQixLQUFLdkQsTUFBTCxDQUFZaUMsT0FBWixDQUFvQnNCLFFBQXZDO0lBQ0FLLE9BQU8sQ0FBQ3RCLFFBQVIsR0FBbUJtRSxNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCLENBQWhCLENBQVosQ0FBbkI7SUFFQTlDLE9BQU8sQ0FBQ3NCLGNBQVIsR0FBeUIsS0FBS2xGLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0JpRCxjQUE3QztJQUNBdEIsT0FBTyxDQUFDbUssV0FBUixHQUFzQixDQUFDLEtBQUsvTixNQUFMLENBQVlpQyxPQUFaLENBQW9CdUMsbUJBQTNDO0lBRUEsS0FBSzFELFdBQUwsR0FBbUJpQixTQUFuQjtJQUNBLEtBQUtoQixTQUFMLENBQWVnRyxXQUFmLENBQTJCQyxhQUFLZ0gsTUFBaEMsRUFBd0NwSyxPQUFPLENBQUNxSyxRQUFSLEVBQXhDO0lBRUEsS0FBS3ROLEtBQUwsQ0FBV2lELE9BQVgsQ0FBbUIsWUFBVztNQUM1QixPQUFPQSxPQUFPLENBQUMrSSxRQUFSLENBQWlCLElBQWpCLENBQVA7SUFDRCxDQUZEO0VBR0Q7RUFFRDtBQUNGO0FBQ0E7OztFQUNFdUIsdUJBQXVCLENBQUMxTCxLQUFELEVBQWdCO0lBQ3JDLE1BQU0yTCxjQUFjLEdBQUcxSCxNQUFNLENBQUMySCxVQUFQLENBQWtCNUwsS0FBbEIsRUFBeUIsTUFBekIsQ0FBdkI7SUFDQSxNQUFNa0IsSUFBSSxHQUFHK0MsTUFBTSxDQUFDRSxLQUFQLENBQWEsSUFBSXdILGNBQWpCLENBQWI7SUFDQSxJQUFJRSxNQUFNLEdBQUcsQ0FBYjtJQUNBQSxNQUFNLEdBQUczSyxJQUFJLENBQUM0SyxhQUFMLENBQW1CSCxjQUFjLEdBQUcsQ0FBcEMsRUFBdUNFLE1BQXZDLENBQVQ7SUFDQUEsTUFBTSxHQUFHM0ssSUFBSSxDQUFDNEssYUFBTCxDQUFtQkgsY0FBbkIsRUFBbUNFLE1BQW5DLENBQVQ7SUFDQTNLLElBQUksQ0FBQzZLLEtBQUwsQ0FBVy9MLEtBQVgsRUFBa0I2TCxNQUFsQixFQUEwQixNQUExQjtJQUNBLEtBQUt0TixTQUFMLENBQWVnRyxXQUFmLENBQTJCQyxhQUFLd0gsYUFBaEMsRUFBK0M5SyxJQUEvQyxFQVBxQyxDQVFyQzs7SUFDQSxLQUFLa0UsWUFBTCxDQUFrQixLQUFLZixLQUFMLENBQVc0SCwrQkFBN0I7RUFDRDtFQUVEO0FBQ0Y7QUFDQTs7O0VBQ0VDLGNBQWMsR0FBRztJQUNmLE1BQU05SyxPQUFPLEdBQUcsSUFBSStLLHdCQUFKLENBQW9CLEtBQUtDLGFBQUwsRUFBcEIsRUFBMEMsS0FBS0MsNEJBQUwsRUFBMUMsRUFBK0UsS0FBSzdPLE1BQUwsQ0FBWWlDLE9BQTNGLENBQWhCO0lBRUEsTUFBTTRHLE9BQU8sR0FBRyxJQUFJaUcsZ0JBQUosQ0FBWTtNQUFFOU0sSUFBSSxFQUFFZ0YsYUFBSytIO0lBQWIsQ0FBWixDQUFoQjtJQUNBLEtBQUtoTyxTQUFMLENBQWVpTyxxQkFBZixDQUFxQ1QsS0FBckMsQ0FBMkMxRixPQUEzQzs7SUFDQW9HLGlCQUFTdkksSUFBVCxDQUFjOUMsT0FBZCxFQUF1QnNMLElBQXZCLENBQTRCckcsT0FBNUI7RUFDRDtFQUVEO0FBQ0Y7QUFDQTs7O0VBQ0UrRixhQUFhLEdBQUc7SUFDZCxNQUFNM00sT0FBTyxHQUFHLEVBQWhCOztJQUVBLElBQUksS0FBS2pDLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0I0QixjQUFwQixLQUF1QyxJQUEzQyxFQUFpRDtNQUMvQzVCLE9BQU8sQ0FBQ2tOLElBQVIsQ0FBYSxtQkFBYjtJQUNELENBRkQsTUFFTyxJQUFJLEtBQUtuUCxNQUFMLENBQVlpQyxPQUFaLENBQW9CNEIsY0FBcEIsS0FBdUMsS0FBM0MsRUFBa0Q7TUFDdkQ1QixPQUFPLENBQUNrTixJQUFSLENBQWEsb0JBQWI7SUFDRDs7SUFFRCxJQUFJLEtBQUtuUCxNQUFMLENBQVlpQyxPQUFaLENBQW9CNkIscUJBQXBCLEtBQThDLElBQWxELEVBQXdEO01BQ3REN0IsT0FBTyxDQUFDa04sSUFBUixDQUFhLDBCQUFiO0lBQ0QsQ0FGRCxNQUVPLElBQUksS0FBS25QLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0I2QixxQkFBcEIsS0FBOEMsS0FBbEQsRUFBeUQ7TUFDOUQ3QixPQUFPLENBQUNrTixJQUFSLENBQWEsMkJBQWI7SUFDRDs7SUFFRCxJQUFJLEtBQUtuUCxNQUFMLENBQVlpQyxPQUFaLENBQW9COEIsaUJBQXBCLEtBQTBDLElBQTlDLEVBQW9EO01BQ2xEOUIsT0FBTyxDQUFDa04sSUFBUixDQUFhLHFCQUFiO0lBQ0QsQ0FGRCxNQUVPLElBQUksS0FBS25QLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0I4QixpQkFBcEIsS0FBMEMsS0FBOUMsRUFBcUQ7TUFDMUQ5QixPQUFPLENBQUNrTixJQUFSLENBQWEsc0JBQWI7SUFDRDs7SUFFRCxJQUFJLEtBQUtuUCxNQUFMLENBQVlpQyxPQUFaLENBQW9CK0Isa0JBQXBCLEtBQTJDLElBQS9DLEVBQXFEO01BQ25EL0IsT0FBTyxDQUFDa04sSUFBUixDQUFhLHNCQUFiO0lBQ0QsQ0FGRCxNQUVPLElBQUksS0FBS25QLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0IrQixrQkFBcEIsS0FBMkMsS0FBL0MsRUFBc0Q7TUFDM0QvQixPQUFPLENBQUNrTixJQUFSLENBQWEsdUJBQWI7SUFDRDs7SUFFRCxJQUFJLEtBQUtuUCxNQUFMLENBQVlpQyxPQUFaLENBQW9CZ0MsZ0JBQXBCLEtBQXlDLElBQTdDLEVBQW1EO01BQ2pEaEMsT0FBTyxDQUFDa04sSUFBUixDQUFhLG1CQUFiO0lBQ0QsQ0FGRCxNQUVPLElBQUksS0FBS25QLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0JnQyxnQkFBcEIsS0FBeUMsS0FBN0MsRUFBb0Q7TUFDekRoQyxPQUFPLENBQUNrTixJQUFSLENBQWEsb0JBQWI7SUFDRDs7SUFFRCxJQUFJLEtBQUtuUCxNQUFMLENBQVlpQyxPQUFaLENBQW9CaUMsMEJBQXBCLEtBQW1ELElBQXZELEVBQTZEO01BQzNEakMsT0FBTyxDQUFDa04sSUFBUixDQUFhLGdDQUFiO0lBQ0QsQ0FGRCxNQUVPLElBQUksS0FBS25QLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0JpQywwQkFBcEIsS0FBbUQsS0FBdkQsRUFBOEQ7TUFDbkVqQyxPQUFPLENBQUNrTixJQUFSLENBQWEsaUNBQWI7SUFDRDs7SUFFRCxJQUFJLEtBQUtuUCxNQUFMLENBQVlpQyxPQUFaLENBQW9Ca0MseUJBQXBCLEtBQWtELElBQXRELEVBQTREO01BQzFEbEMsT0FBTyxDQUFDa04sSUFBUixDQUFhLCtCQUFiO0lBQ0QsQ0FGRCxNQUVPLElBQUksS0FBS25QLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0JrQyx5QkFBcEIsS0FBa0QsS0FBdEQsRUFBNkQ7TUFDbEVsQyxPQUFPLENBQUNrTixJQUFSLENBQWEsZ0NBQWI7SUFDRDs7SUFFRCxJQUFJLEtBQUtuUCxNQUFMLENBQVlpQyxPQUFaLENBQW9CdUIsU0FBcEIsS0FBa0MsSUFBdEMsRUFBNEM7TUFDMUN2QixPQUFPLENBQUNrTixJQUFSLENBQWMsaUJBQWdCLEtBQUtuUCxNQUFMLENBQVlpQyxPQUFaLENBQW9CdUIsU0FBVSxFQUE1RDtJQUNEOztJQUVELElBQUksS0FBS3hELE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0J3QixVQUFwQixLQUFtQyxJQUF2QyxFQUE2QztNQUMzQ3hCLE9BQU8sQ0FBQ2tOLElBQVIsQ0FBYyxrQkFBaUIsS0FBS25QLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0J3QixVQUFXLEVBQTlEO0lBQ0Q7O0lBRUQsSUFBSSxLQUFLekQsTUFBTCxDQUFZaUMsT0FBWixDQUFvQm1DLDBCQUFwQixLQUFtRCxJQUF2RCxFQUE2RDtNQUMzRG5DLE9BQU8sQ0FBQ2tOLElBQVIsQ0FBYSw4QkFBYjtJQUNELENBRkQsTUFFTyxJQUFJLEtBQUtuUCxNQUFMLENBQVlpQyxPQUFaLENBQW9CbUMsMEJBQXBCLEtBQW1ELEtBQXZELEVBQThEO01BQ25FbkMsT0FBTyxDQUFDa04sSUFBUixDQUFhLCtCQUFiO0lBQ0Q7O0lBRUQsSUFBSSxLQUFLblAsTUFBTCxDQUFZaUMsT0FBWixDQUFvQjJDLFFBQXBCLEtBQWlDLElBQXJDLEVBQTJDO01BQ3pDM0MsT0FBTyxDQUFDa04sSUFBUixDQUFjLGdCQUFlLEtBQUtuUCxNQUFMLENBQVlpQyxPQUFaLENBQW9CMkMsUUFBUyxFQUExRDtJQUNEOztJQUVELElBQUksS0FBSzVFLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0JvQyx1QkFBcEIsS0FBZ0QsSUFBcEQsRUFBMEQ7TUFDeERwQyxPQUFPLENBQUNrTixJQUFSLENBQWEsMkJBQWI7SUFDRCxDQUZELE1BRU8sSUFBSSxLQUFLblAsTUFBTCxDQUFZaUMsT0FBWixDQUFvQm9DLHVCQUFwQixLQUFnRCxLQUFwRCxFQUEyRDtNQUNoRXBDLE9BQU8sQ0FBQ2tOLElBQVIsQ0FBYSw0QkFBYjtJQUNEOztJQUVELElBQUksS0FBS25QLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0JxQyxzQkFBcEIsS0FBK0MsSUFBbkQsRUFBeUQ7TUFDdkRyQyxPQUFPLENBQUNrTixJQUFSLENBQWEsMEJBQWI7SUFDRCxDQUZELE1BRU8sSUFBSSxLQUFLblAsTUFBTCxDQUFZaUMsT0FBWixDQUFvQnFDLHNCQUFwQixLQUErQyxLQUFuRCxFQUEwRDtNQUMvRHJDLE9BQU8sQ0FBQ2tOLElBQVIsQ0FBYSwyQkFBYjtJQUNEOztJQUVELElBQUksS0FBS25QLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0J3RCxRQUFwQixLQUFpQyxJQUFyQyxFQUEyQztNQUN6Q3hELE9BQU8sQ0FBQ2tOLElBQVIsQ0FBYyxnQkFBZSxLQUFLblAsTUFBTCxDQUFZaUMsT0FBWixDQUFvQndELFFBQVMsRUFBMUQ7SUFDRDs7SUFFRCxJQUFJLEtBQUt6RixNQUFMLENBQVlpQyxPQUFaLENBQW9Ca0Isd0JBQXBCLEtBQWlELElBQXJELEVBQTJEO01BQ3pEbEIsT0FBTyxDQUFDa04sSUFBUixDQUFjLG1DQUFrQyxLQUFLQyxxQkFBTCxDQUEyQixLQUFLcFAsTUFBTCxDQUFZaUMsT0FBWixDQUFvQmtCLHdCQUEvQyxDQUF5RSxFQUF6SDtJQUNEOztJQUVELElBQUksS0FBS25ELE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0JTLHVCQUFwQixLQUFnRCxJQUFwRCxFQUEwRDtNQUN4RFQsT0FBTyxDQUFDa04sSUFBUixDQUFhLG1CQUFiO0lBQ0QsQ0FGRCxNQUVPLElBQUksS0FBS25QLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0JTLHVCQUFwQixLQUFnRCxLQUFwRCxFQUEyRDtNQUNoRVQsT0FBTyxDQUFDa04sSUFBUixDQUFhLG9CQUFiO0lBQ0Q7O0lBRUQsT0FBT2xOLE9BQU8sQ0FBQ29OLElBQVIsQ0FBYSxJQUFiLENBQVA7RUFDRDtFQUVEO0FBQ0Y7QUFDQTs7O0VBQ0VDLG1CQUFtQixHQUFHO0lBQ3BCLEtBQUt0RyxpQkFBTDtJQUNBLEtBQUtmLElBQUwsQ0FBVSxTQUFWO0VBQ0Q7RUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztFQUNFc0gsWUFBWSxDQUFDck8sT0FBRCxFQUFtQjtJQUM3QixLQUFLc08sV0FBTCxDQUFpQnRPLE9BQWpCLEVBQTBCOEYsYUFBSytILFNBQS9CLEVBQTBDLElBQUlKLHdCQUFKLENBQW9Cek4sT0FBTyxDQUFDdU8sa0JBQTVCLEVBQWlELEtBQUtaLDRCQUFMLEVBQWpELEVBQXNGLEtBQUs3TyxNQUFMLENBQVlpQyxPQUFsRyxDQUExQztFQUNEO0VBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7RUFDRXlOLE9BQU8sQ0FBQ3hPLE9BQUQsRUFBbUI7SUFDeEIsSUFBSTtNQUNGQSxPQUFPLENBQUN5TyxrQkFBUixDQUEyQixLQUFLaE8saUJBQWhDO0lBQ0QsQ0FGRCxDQUVFLE9BQU9xSSxLQUFQLEVBQW1CO01BQ25COUksT0FBTyxDQUFDOEksS0FBUixHQUFnQkEsS0FBaEI7TUFFQXJCLE9BQU8sQ0FBQ0MsUUFBUixDQUFpQixNQUFNO1FBQ3JCLEtBQUtqSSxLQUFMLENBQVc0SixHQUFYLENBQWVQLEtBQUssQ0FBQ25CLE9BQXJCO1FBQ0EzSCxPQUFPLENBQUNtSSxRQUFSLENBQWlCVyxLQUFqQjtNQUNELENBSEQ7TUFLQTtJQUNEOztJQUVELE1BQU00RixVQUF1QixHQUFHLEVBQWhDO0lBRUFBLFVBQVUsQ0FBQ1QsSUFBWCxDQUFnQjtNQUNkbk4sSUFBSSxFQUFFNk4sZ0JBQU1DLFFBREU7TUFFZHhJLElBQUksRUFBRSxXQUZRO01BR2RqQixLQUFLLEVBQUVuRixPQUFPLENBQUN1TyxrQkFIRDtNQUlkTSxNQUFNLEVBQUUsS0FKTTtNQUtkQyxNQUFNLEVBQUVqTyxTQUxNO01BTWRrTyxTQUFTLEVBQUVsTyxTQU5HO01BT2RtTyxLQUFLLEVBQUVuTztJQVBPLENBQWhCOztJQVVBLElBQUliLE9BQU8sQ0FBQzBPLFVBQVIsQ0FBbUJJLE1BQXZCLEVBQStCO01BQzdCSixVQUFVLENBQUNULElBQVgsQ0FBZ0I7UUFDZG5OLElBQUksRUFBRTZOLGdCQUFNQyxRQURFO1FBRWR4SSxJQUFJLEVBQUUsUUFGUTtRQUdkakIsS0FBSyxFQUFFbkYsT0FBTyxDQUFDaVAsbUJBQVIsQ0FBNEJqUCxPQUFPLENBQUMwTyxVQUFwQyxDQUhPO1FBSWRHLE1BQU0sRUFBRSxLQUpNO1FBS2RDLE1BQU0sRUFBRWpPLFNBTE07UUFNZGtPLFNBQVMsRUFBRWxPLFNBTkc7UUFPZG1PLEtBQUssRUFBRW5PO01BUE8sQ0FBaEI7TUFVQTZOLFVBQVUsQ0FBQ1QsSUFBWCxDQUFnQixHQUFHak8sT0FBTyxDQUFDME8sVUFBM0I7SUFDRDs7SUFFRCxLQUFLSixXQUFMLENBQWlCdE8sT0FBakIsRUFBMEI4RixhQUFLb0osV0FBL0IsRUFBNEMsSUFBSUMsMEJBQUosQ0FBc0IsZUFBdEIsRUFBdUNULFVBQXZDLEVBQW1ELEtBQUtmLDRCQUFMLEVBQW5ELEVBQXdGLEtBQUs3TyxNQUFMLENBQVlpQyxPQUFwRyxFQUE2RyxLQUFLTixpQkFBbEgsQ0FBNUM7RUFDRDtFQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0VBR0UyTyxXQUFXLENBQUNDLEtBQUQsRUFBZ0JDLGlCQUFoQixFQUF1RW5ILFFBQXZFLEVBQW9HO0lBQzdHLElBQUlwSCxPQUFKOztJQUVBLElBQUlvSCxRQUFRLEtBQUt0SCxTQUFqQixFQUE0QjtNQUMxQnNILFFBQVEsR0FBR21ILGlCQUFYO01BQ0F2TyxPQUFPLEdBQUcsRUFBVjtJQUNELENBSEQsTUFHTztNQUNMQSxPQUFPLEdBQUd1TyxpQkFBVjtJQUNEOztJQUVELElBQUksT0FBT3ZPLE9BQVAsS0FBbUIsUUFBdkIsRUFBaUM7TUFDL0IsTUFBTSxJQUFJTCxTQUFKLENBQWMsc0NBQWQsQ0FBTjtJQUNEOztJQUNELE9BQU8sSUFBSTZPLGlCQUFKLENBQWFGLEtBQWIsRUFBb0IsS0FBSzVPLGlCQUF6QixFQUE0QyxLQUFLM0IsTUFBTCxDQUFZaUMsT0FBeEQsRUFBaUVBLE9BQWpFLEVBQTBFb0gsUUFBMUUsQ0FBUDtFQUNEO0VBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7RUFHRXFILFlBQVksQ0FBQ0MsUUFBRCxFQUFxQkMsSUFBckIsRUFBb0o7SUFDOUpELFFBQVEsQ0FBQ0UsZ0JBQVQsR0FBNEIsSUFBNUI7O0lBRUEsSUFBSUQsSUFBSixFQUFVO01BQ1IsSUFBSUQsUUFBUSxDQUFDRyxhQUFiLEVBQTRCO1FBQzFCLE1BQU0sSUFBSTlLLEtBQUosQ0FBVSx5RkFBVixDQUFOO01BQ0Q7O01BRUQsSUFBSTJLLFFBQVEsQ0FBQ0ksZUFBYixFQUE4QjtRQUM1QixNQUFNLElBQUkvSyxLQUFKLENBQVUsOEZBQVYsQ0FBTjtNQUNEOztNQUVELE1BQU1nTCxTQUFTLEdBQUcvQixpQkFBU3ZJLElBQVQsQ0FBY2tLLElBQWQsQ0FBbEIsQ0FUUSxDQVdSO01BQ0E7OztNQUNBSSxTQUFTLENBQUNsSixFQUFWLENBQWEsT0FBYixFQUF1Qk4sR0FBRCxJQUFTO1FBQzdCbUosUUFBUSxDQUFDTSxvQkFBVCxDQUE4QnZHLE9BQTlCLENBQXNDbEQsR0FBdEM7TUFDRCxDQUZELEVBYlEsQ0FpQlI7TUFDQTs7TUFDQW1KLFFBQVEsQ0FBQ00sb0JBQVQsQ0FBOEJuSixFQUE5QixDQUFpQyxPQUFqQyxFQUEyQ04sR0FBRCxJQUFTO1FBQ2pEd0osU0FBUyxDQUFDdEcsT0FBVixDQUFrQmxELEdBQWxCO01BQ0QsQ0FGRDtNQUlBd0osU0FBUyxDQUFDOUIsSUFBVixDQUFleUIsUUFBUSxDQUFDTSxvQkFBeEI7SUFDRCxDQXhCRCxNQXdCTyxJQUFJLENBQUNOLFFBQVEsQ0FBQ0csYUFBZCxFQUE2QjtNQUNsQztNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0FILFFBQVEsQ0FBQ00sb0JBQVQsQ0FBOEJDLEdBQTlCO0lBQ0Q7O0lBRUQsTUFBTUMsUUFBUSxHQUFHLE1BQU07TUFDckJqUSxPQUFPLENBQUNrSyxNQUFSO0lBQ0QsQ0FGRDs7SUFJQSxNQUFNeEgsT0FBTyxHQUFHLElBQUl3TixnQ0FBSixDQUFvQlQsUUFBcEIsQ0FBaEI7SUFFQSxNQUFNelAsT0FBTyxHQUFHLElBQUltUSxnQkFBSixDQUFZVixRQUFRLENBQUNXLGdCQUFULEVBQVosRUFBMEN0SCxLQUFELElBQTJEO01BQ2xIMkcsUUFBUSxDQUFDbEosY0FBVCxDQUF3QixRQUF4QixFQUFrQzBKLFFBQWxDOztNQUVBLElBQUluSCxLQUFKLEVBQVc7UUFDVCxJQUFJQSxLQUFLLENBQUMrQixJQUFOLEtBQWUsU0FBbkIsRUFBOEI7VUFDNUIvQixLQUFLLENBQUNuQixPQUFOLElBQWlCLDhIQUFqQjtRQUNEOztRQUNEOEgsUUFBUSxDQUFDM0csS0FBVCxHQUFpQkEsS0FBakI7UUFDQTJHLFFBQVEsQ0FBQ3RILFFBQVQsQ0FBa0JXLEtBQWxCO1FBQ0E7TUFDRDs7TUFFRCxLQUFLd0YsV0FBTCxDQUFpQm1CLFFBQWpCLEVBQTJCM0osYUFBS3VLLFNBQWhDLEVBQTJDM04sT0FBM0M7SUFDRCxDQWJlLENBQWhCO0lBZUErTSxRQUFRLENBQUNoSixJQUFULENBQWMsUUFBZCxFQUF3QndKLFFBQXhCO0lBRUEsS0FBSzVCLFlBQUwsQ0FBa0JyTyxPQUFsQjtFQUNEO0VBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7RUFDRXNRLE9BQU8sQ0FBQ3RRLE9BQUQsRUFBbUI7SUFDeEIsTUFBTTBPLFVBQXVCLEdBQUcsRUFBaEM7SUFFQUEsVUFBVSxDQUFDVCxJQUFYLENBQWdCO01BQ2RuTixJQUFJLEVBQUU2TixnQkFBTTRCLEdBREU7TUFFZG5LLElBQUksRUFBRSxRQUZRO01BR2RqQixLQUFLLEVBQUV0RSxTQUhPO01BSWRnTyxNQUFNLEVBQUUsSUFKTTtNQUtkQyxNQUFNLEVBQUVqTyxTQUxNO01BTWRrTyxTQUFTLEVBQUVsTyxTQU5HO01BT2RtTyxLQUFLLEVBQUVuTztJQVBPLENBQWhCO0lBVUE2TixVQUFVLENBQUNULElBQVgsQ0FBZ0I7TUFDZG5OLElBQUksRUFBRTZOLGdCQUFNQyxRQURFO01BRWR4SSxJQUFJLEVBQUUsUUFGUTtNQUdkakIsS0FBSyxFQUFFbkYsT0FBTyxDQUFDME8sVUFBUixDQUFtQkksTUFBbkIsR0FBNEI5TyxPQUFPLENBQUNpUCxtQkFBUixDQUE0QmpQLE9BQU8sQ0FBQzBPLFVBQXBDLENBQTVCLEdBQThFLElBSHZFO01BSWRHLE1BQU0sRUFBRSxLQUpNO01BS2RDLE1BQU0sRUFBRWpPLFNBTE07TUFNZGtPLFNBQVMsRUFBRWxPLFNBTkc7TUFPZG1PLEtBQUssRUFBRW5PO0lBUE8sQ0FBaEI7SUFVQTZOLFVBQVUsQ0FBQ1QsSUFBWCxDQUFnQjtNQUNkbk4sSUFBSSxFQUFFNk4sZ0JBQU1DLFFBREU7TUFFZHhJLElBQUksRUFBRSxNQUZRO01BR2RqQixLQUFLLEVBQUVuRixPQUFPLENBQUN1TyxrQkFIRDtNQUlkTSxNQUFNLEVBQUUsS0FKTTtNQUtkQyxNQUFNLEVBQUVqTyxTQUxNO01BTWRrTyxTQUFTLEVBQUVsTyxTQU5HO01BT2RtTyxLQUFLLEVBQUVuTztJQVBPLENBQWhCO0lBVUFiLE9BQU8sQ0FBQ3dRLFNBQVIsR0FBb0IsSUFBcEIsQ0FqQ3dCLENBa0N4Qjs7SUFDQXhRLE9BQU8sQ0FBQzRHLEVBQVIsQ0FBVyxhQUFYLEVBQTBCLENBQUNSLElBQUQsRUFBZWpCLEtBQWYsS0FBOEI7TUFDdEQsSUFBSWlCLElBQUksS0FBSyxRQUFiLEVBQXVCO1FBQ3JCcEcsT0FBTyxDQUFDeVEsTUFBUixHQUFpQnRMLEtBQWpCO01BQ0QsQ0FGRCxNQUVPO1FBQ0xuRixPQUFPLENBQUM4SSxLQUFSLEdBQWdCLElBQUlaLG9CQUFKLENBQWtCLHlDQUF3QzlCLElBQUssa0JBQS9ELENBQWhCO01BQ0Q7SUFDRixDQU5EO0lBUUEsS0FBS2tJLFdBQUwsQ0FBaUJ0TyxPQUFqQixFQUEwQjhGLGFBQUtvSixXQUEvQixFQUE0QyxJQUFJQywwQkFBSixDQUFzQixZQUF0QixFQUFvQ1QsVUFBcEMsRUFBZ0QsS0FBS2YsNEJBQUwsRUFBaEQsRUFBcUYsS0FBSzdPLE1BQUwsQ0FBWWlDLE9BQWpHLEVBQTBHLEtBQUtOLGlCQUEvRyxDQUE1QztFQUNEO0VBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztFQUNFaVEsU0FBUyxDQUFDMVEsT0FBRCxFQUFtQjtJQUMxQixNQUFNME8sVUFBdUIsR0FBRyxFQUFoQztJQUVBQSxVQUFVLENBQUNULElBQVgsQ0FBZ0I7TUFDZG5OLElBQUksRUFBRTZOLGdCQUFNNEIsR0FERTtNQUVkbkssSUFBSSxFQUFFLFFBRlE7TUFHZDtNQUNBakIsS0FBSyxFQUFFbkYsT0FBTyxDQUFDeVEsTUFKRDtNQUtkNUIsTUFBTSxFQUFFLEtBTE07TUFNZEMsTUFBTSxFQUFFak8sU0FOTTtNQU9ka08sU0FBUyxFQUFFbE8sU0FQRztNQVFkbU8sS0FBSyxFQUFFbk87SUFSTyxDQUFoQjtJQVdBLEtBQUt5TixXQUFMLENBQWlCdE8sT0FBakIsRUFBMEI4RixhQUFLb0osV0FBL0IsRUFBNEMsSUFBSUMsMEJBQUosQ0FBc0IsY0FBdEIsRUFBc0NULFVBQXRDLEVBQWtELEtBQUtmLDRCQUFMLEVBQWxELEVBQXVGLEtBQUs3TyxNQUFMLENBQVlpQyxPQUFuRyxFQUE0RyxLQUFLTixpQkFBakgsQ0FBNUM7RUFDRDtFQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0VBQ0VrUSxPQUFPLENBQUMzUSxPQUFELEVBQW1CME8sVUFBbkIsRUFBNEQ7SUFDakUsTUFBTWtDLGlCQUE4QixHQUFHLEVBQXZDO0lBRUFBLGlCQUFpQixDQUFDM0MsSUFBbEIsQ0FBdUI7TUFDckJuTixJQUFJLEVBQUU2TixnQkFBTTRCLEdBRFM7TUFFckJuSyxJQUFJLEVBQUUsUUFGZTtNQUdyQjtNQUNBakIsS0FBSyxFQUFFbkYsT0FBTyxDQUFDeVEsTUFKTTtNQUtyQjVCLE1BQU0sRUFBRSxLQUxhO01BTXJCQyxNQUFNLEVBQUVqTyxTQU5hO01BT3JCa08sU0FBUyxFQUFFbE8sU0FQVTtNQVFyQm1PLEtBQUssRUFBRW5PO0lBUmMsQ0FBdkI7O0lBV0EsSUFBSTtNQUNGLEtBQUssSUFBSWdRLENBQUMsR0FBRyxDQUFSLEVBQVdDLEdBQUcsR0FBRzlRLE9BQU8sQ0FBQzBPLFVBQVIsQ0FBbUJJLE1BQXpDLEVBQWlEK0IsQ0FBQyxHQUFHQyxHQUFyRCxFQUEwREQsQ0FBQyxFQUEzRCxFQUErRDtRQUM3RCxNQUFNRSxTQUFTLEdBQUcvUSxPQUFPLENBQUMwTyxVQUFSLENBQW1CbUMsQ0FBbkIsQ0FBbEI7UUFFQUQsaUJBQWlCLENBQUMzQyxJQUFsQixDQUF1QixFQUNyQixHQUFHOEMsU0FEa0I7VUFFckI1TCxLQUFLLEVBQUU0TCxTQUFTLENBQUNqUSxJQUFWLENBQWVrUSxRQUFmLENBQXdCdEMsVUFBVSxHQUFHQSxVQUFVLENBQUNxQyxTQUFTLENBQUMzSyxJQUFYLENBQWIsR0FBZ0MsSUFBbEUsRUFBd0UsS0FBSzNGLGlCQUE3RTtRQUZjLENBQXZCO01BSUQ7SUFDRixDQVRELENBU0UsT0FBT3FJLEtBQVAsRUFBbUI7TUFDbkI5SSxPQUFPLENBQUM4SSxLQUFSLEdBQWdCQSxLQUFoQjtNQUVBckIsT0FBTyxDQUFDQyxRQUFSLENBQWlCLE1BQU07UUFDckIsS0FBS2pJLEtBQUwsQ0FBVzRKLEdBQVgsQ0FBZVAsS0FBSyxDQUFDbkIsT0FBckI7UUFDQTNILE9BQU8sQ0FBQ21JLFFBQVIsQ0FBaUJXLEtBQWpCO01BQ0QsQ0FIRDtNQUtBO0lBQ0Q7O0lBRUQsS0FBS3dGLFdBQUwsQ0FBaUJ0TyxPQUFqQixFQUEwQjhGLGFBQUtvSixXQUEvQixFQUE0QyxJQUFJQywwQkFBSixDQUFzQixZQUF0QixFQUFvQ3lCLGlCQUFwQyxFQUF1RCxLQUFLakQsNEJBQUwsRUFBdkQsRUFBNEYsS0FBSzdPLE1BQUwsQ0FBWWlDLE9BQXhHLEVBQWlILEtBQUtOLGlCQUF0SCxDQUE1QztFQUNEO0VBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7O0VBQ0V3USxhQUFhLENBQUNqUixPQUFELEVBQW1CO0lBQzlCLElBQUk7TUFDRkEsT0FBTyxDQUFDeU8sa0JBQVIsQ0FBMkIsS0FBS2hPLGlCQUFoQztJQUNELENBRkQsQ0FFRSxPQUFPcUksS0FBUCxFQUFtQjtNQUNuQjlJLE9BQU8sQ0FBQzhJLEtBQVIsR0FBZ0JBLEtBQWhCO01BRUFyQixPQUFPLENBQUNDLFFBQVIsQ0FBaUIsTUFBTTtRQUNyQixLQUFLakksS0FBTCxDQUFXNEosR0FBWCxDQUFlUCxLQUFLLENBQUNuQixPQUFyQjtRQUNBM0gsT0FBTyxDQUFDbUksUUFBUixDQUFpQlcsS0FBakI7TUFDRCxDQUhEO01BS0E7SUFDRDs7SUFFRCxLQUFLd0YsV0FBTCxDQUFpQnRPLE9BQWpCLEVBQTBCOEYsYUFBS29KLFdBQS9CLEVBQTRDLElBQUlDLDBCQUFKLENBQXNCblAsT0FBTyxDQUFDdU8sa0JBQTlCLEVBQW1Edk8sT0FBTyxDQUFDME8sVUFBM0QsRUFBdUUsS0FBS2YsNEJBQUwsRUFBdkUsRUFBNEcsS0FBSzdPLE1BQUwsQ0FBWWlDLE9BQXhILEVBQWlJLEtBQUtOLGlCQUF0SSxDQUE1QztFQUNEO0VBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7RUFDRXlRLGdCQUFnQixDQUFDL0ksUUFBRCxFQUFxQy9CLElBQUksR0FBRyxFQUE1QyxFQUFnRDNDLGNBQWMsR0FBRyxLQUFLM0UsTUFBTCxDQUFZaUMsT0FBWixDQUFvQjBDLGNBQXJGLEVBQXFHO0lBQ25ILDRDQUEwQkEsY0FBMUIsRUFBMEMsZ0JBQTFDO0lBRUEsTUFBTTBOLFdBQVcsR0FBRyxJQUFJQyx3QkFBSixDQUFnQmhMLElBQWhCLEVBQXNCM0MsY0FBdEIsQ0FBcEI7O0lBRUEsSUFBSSxLQUFLM0UsTUFBTCxDQUFZaUMsT0FBWixDQUFvQnVELFVBQXBCLEdBQWlDLEtBQXJDLEVBQTRDO01BQzFDLE9BQU8sS0FBSytKLFlBQUwsQ0FBa0IsSUFBSThCLGdCQUFKLENBQVkscUNBQXNDZ0IsV0FBVyxDQUFDRSxvQkFBWixFQUF0QyxHQUE0RSxjQUE1RSxHQUE2RkYsV0FBVyxDQUFDL0ssSUFBckgsRUFBNEhFLEdBQUQsSUFBUztRQUMzSixLQUFLbkgsZ0JBQUw7O1FBQ0EsSUFBSSxLQUFLQSxnQkFBTCxLQUEwQixDQUE5QixFQUFpQztVQUMvQixLQUFLRixhQUFMLEdBQXFCLElBQXJCO1FBQ0Q7O1FBQ0RrSixRQUFRLENBQUM3QixHQUFELENBQVI7TUFDRCxDQU53QixDQUFsQixDQUFQO0lBT0Q7O0lBRUQsTUFBTXRHLE9BQU8sR0FBRyxJQUFJbVEsZ0JBQUosQ0FBWXRQLFNBQVosRUFBd0J5RixHQUFELElBQVM7TUFDOUMsT0FBTzZCLFFBQVEsQ0FBQzdCLEdBQUQsRUFBTSxLQUFLcUgsNEJBQUwsRUFBTixDQUFmO0lBQ0QsQ0FGZSxDQUFoQjtJQUdBLE9BQU8sS0FBS1csV0FBTCxDQUFpQnRPLE9BQWpCLEVBQTBCOEYsYUFBS3dMLG1CQUEvQixFQUFvREgsV0FBVyxDQUFDSSxZQUFaLENBQXlCLEtBQUs1RCw0QkFBTCxFQUF6QixDQUFwRCxDQUFQO0VBQ0Q7RUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0VBQ0U2RCxpQkFBaUIsQ0FBQ3JKLFFBQUQsRUFBc0MvQixJQUFJLEdBQUcsRUFBN0MsRUFBaUQ7SUFDaEUsTUFBTStLLFdBQVcsR0FBRyxJQUFJQyx3QkFBSixDQUFnQmhMLElBQWhCLENBQXBCOztJQUNBLElBQUksS0FBS3RILE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0J1RCxVQUFwQixHQUFpQyxLQUFyQyxFQUE0QztNQUMxQyxPQUFPLEtBQUsrSixZQUFMLENBQWtCLElBQUk4QixnQkFBSixDQUFZLGlCQUFpQmdCLFdBQVcsQ0FBQy9LLElBQXpDLEVBQWdERSxHQUFELElBQVM7UUFDL0UsS0FBS25ILGdCQUFMOztRQUNBLElBQUksS0FBS0EsZ0JBQUwsS0FBMEIsQ0FBOUIsRUFBaUM7VUFDL0IsS0FBS0YsYUFBTCxHQUFxQixLQUFyQjtRQUNEOztRQUVEa0osUUFBUSxDQUFDN0IsR0FBRCxDQUFSO01BQ0QsQ0FQd0IsQ0FBbEIsQ0FBUDtJQVFEOztJQUNELE1BQU10RyxPQUFPLEdBQUcsSUFBSW1RLGdCQUFKLENBQVl0UCxTQUFaLEVBQXVCc0gsUUFBdkIsQ0FBaEI7SUFDQSxPQUFPLEtBQUttRyxXQUFMLENBQWlCdE8sT0FBakIsRUFBMEI4RixhQUFLd0wsbUJBQS9CLEVBQW9ESCxXQUFXLENBQUNNLGFBQVosQ0FBMEIsS0FBSzlELDRCQUFMLEVBQTFCLENBQXBELENBQVA7RUFDRDtFQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztFQUNFK0QsbUJBQW1CLENBQUN2SixRQUFELEVBQXdDL0IsSUFBSSxHQUFHLEVBQS9DLEVBQW1EO0lBQ3BFLE1BQU0rSyxXQUFXLEdBQUcsSUFBSUMsd0JBQUosQ0FBZ0JoTCxJQUFoQixDQUFwQjs7SUFDQSxJQUFJLEtBQUt0SCxNQUFMLENBQVlpQyxPQUFaLENBQW9CdUQsVUFBcEIsR0FBaUMsS0FBckMsRUFBNEM7TUFDMUMsT0FBTyxLQUFLK0osWUFBTCxDQUFrQixJQUFJOEIsZ0JBQUosQ0FBWSxtQkFBbUJnQixXQUFXLENBQUMvSyxJQUEzQyxFQUFrREUsR0FBRCxJQUFTO1FBQ2pGLEtBQUtuSCxnQkFBTDs7UUFDQSxJQUFJLEtBQUtBLGdCQUFMLEtBQTBCLENBQTlCLEVBQWlDO1VBQy9CLEtBQUtGLGFBQUwsR0FBcUIsS0FBckI7UUFDRDs7UUFDRGtKLFFBQVEsQ0FBQzdCLEdBQUQsQ0FBUjtNQUNELENBTndCLENBQWxCLENBQVA7SUFPRDs7SUFDRCxNQUFNdEcsT0FBTyxHQUFHLElBQUltUSxnQkFBSixDQUFZdFAsU0FBWixFQUF1QnNILFFBQXZCLENBQWhCO0lBQ0EsT0FBTyxLQUFLbUcsV0FBTCxDQUFpQnRPLE9BQWpCLEVBQTBCOEYsYUFBS3dMLG1CQUEvQixFQUFvREgsV0FBVyxDQUFDUSxlQUFaLENBQTRCLEtBQUtoRSw0QkFBTCxFQUE1QixDQUFwRCxDQUFQO0VBQ0Q7RUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7RUFDRWlFLGVBQWUsQ0FBQ3pKLFFBQUQsRUFBb0MvQixJQUFwQyxFQUFrRDtJQUMvRCxNQUFNK0ssV0FBVyxHQUFHLElBQUlDLHdCQUFKLENBQWdCaEwsSUFBaEIsQ0FBcEI7O0lBQ0EsSUFBSSxLQUFLdEgsTUFBTCxDQUFZaUMsT0FBWixDQUFvQnVELFVBQXBCLEdBQWlDLEtBQXJDLEVBQTRDO01BQzFDLE9BQU8sS0FBSytKLFlBQUwsQ0FBa0IsSUFBSThCLGdCQUFKLENBQVksZUFBZWdCLFdBQVcsQ0FBQy9LLElBQXZDLEVBQThDRSxHQUFELElBQVM7UUFDN0UsS0FBS25ILGdCQUFMO1FBQ0FnSixRQUFRLENBQUM3QixHQUFELENBQVI7TUFDRCxDQUh3QixDQUFsQixDQUFQO0lBSUQ7O0lBQ0QsTUFBTXRHLE9BQU8sR0FBRyxJQUFJbVEsZ0JBQUosQ0FBWXRQLFNBQVosRUFBdUJzSCxRQUF2QixDQUFoQjtJQUNBLE9BQU8sS0FBS21HLFdBQUwsQ0FBaUJ0TyxPQUFqQixFQUEwQjhGLGFBQUt3TCxtQkFBL0IsRUFBb0RILFdBQVcsQ0FBQ1UsV0FBWixDQUF3QixLQUFLbEUsNEJBQUwsRUFBeEIsQ0FBcEQsQ0FBUDtFQUNEO0VBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7RUFDRXdELFdBQVcsQ0FBQ1csRUFBRCxFQUE0S3JPLGNBQTVLLEVBQW1QO0lBQzVQLElBQUksT0FBT3FPLEVBQVAsS0FBYyxVQUFsQixFQUE4QjtNQUM1QixNQUFNLElBQUlwUixTQUFKLENBQWMseUJBQWQsQ0FBTjtJQUNEOztJQUVELE1BQU1xUixZQUFZLEdBQUcsS0FBSzlTLGFBQTFCOztJQUNBLE1BQU1tSCxJQUFJLEdBQUcsY0FBZTRMLGdCQUFPQyxXQUFQLENBQW1CLEVBQW5CLEVBQXVCeEcsUUFBdkIsQ0FBZ0MsS0FBaEMsQ0FBNUI7O0lBQ0EsTUFBTXlHLE1BQTJILEdBQUcsQ0FBQzVMLEdBQUQsRUFBTTZMLElBQU4sRUFBWSxHQUFHbkwsSUFBZixLQUF3QjtNQUMxSixJQUFJVixHQUFKLEVBQVM7UUFDUCxJQUFJLEtBQUtySCxhQUFMLElBQXNCLEtBQUthLEtBQUwsS0FBZSxLQUFLNkYsS0FBTCxDQUFXeU0sU0FBcEQsRUFBK0Q7VUFDN0QsS0FBS1YsbUJBQUwsQ0FBMEJXLEtBQUQsSUFBVztZQUNsQ0YsSUFBSSxDQUFDRSxLQUFLLElBQUkvTCxHQUFWLEVBQWUsR0FBR1UsSUFBbEIsQ0FBSjtVQUNELENBRkQsRUFFR1osSUFGSDtRQUdELENBSkQsTUFJTztVQUNMK0wsSUFBSSxDQUFDN0wsR0FBRCxFQUFNLEdBQUdVLElBQVQsQ0FBSjtRQUNEO01BQ0YsQ0FSRCxNQVFPLElBQUkrSyxZQUFKLEVBQWtCO1FBQ3ZCLElBQUksS0FBS2pULE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0J1RCxVQUFwQixHQUFpQyxLQUFyQyxFQUE0QztVQUMxQyxLQUFLbkYsZ0JBQUw7UUFDRDs7UUFDRGdULElBQUksQ0FBQyxJQUFELEVBQU8sR0FBR25MLElBQVYsQ0FBSjtNQUNELENBTE0sTUFLQTtRQUNMLEtBQUt3SyxpQkFBTCxDQUF3QmEsS0FBRCxJQUFXO1VBQ2hDRixJQUFJLENBQUNFLEtBQUQsRUFBUSxHQUFHckwsSUFBWCxDQUFKO1FBQ0QsQ0FGRCxFQUVHWixJQUZIO01BR0Q7SUFDRixDQW5CRDs7SUFxQkEsSUFBSTJMLFlBQUosRUFBa0I7TUFDaEIsT0FBTyxLQUFLSCxlQUFMLENBQXNCdEwsR0FBRCxJQUFTO1FBQ25DLElBQUlBLEdBQUosRUFBUztVQUNQLE9BQU93TCxFQUFFLENBQUN4TCxHQUFELENBQVQ7UUFDRDs7UUFFRCxJQUFJN0MsY0FBSixFQUFvQjtVQUNsQixPQUFPLEtBQUs0SyxZQUFMLENBQWtCLElBQUk4QixnQkFBSixDQUFZLHFDQUFxQyxLQUFLakMscUJBQUwsQ0FBMkJ6SyxjQUEzQixDQUFqRCxFQUE4RjZDLEdBQUQsSUFBUztZQUM3SCxPQUFPd0wsRUFBRSxDQUFDeEwsR0FBRCxFQUFNNEwsTUFBTixDQUFUO1VBQ0QsQ0FGd0IsQ0FBbEIsQ0FBUDtRQUdELENBSkQsTUFJTztVQUNMLE9BQU9KLEVBQUUsQ0FBQyxJQUFELEVBQU9JLE1BQVAsQ0FBVDtRQUNEO01BQ0YsQ0FaTSxFQVlKOUwsSUFaSSxDQUFQO0lBYUQsQ0FkRCxNQWNPO01BQ0wsT0FBTyxLQUFLOEssZ0JBQUwsQ0FBdUI1SyxHQUFELElBQVM7UUFDcEMsSUFBSUEsR0FBSixFQUFTO1VBQ1AsT0FBT3dMLEVBQUUsQ0FBQ3hMLEdBQUQsQ0FBVDtRQUNEOztRQUVELE9BQU93TCxFQUFFLENBQUMsSUFBRCxFQUFPSSxNQUFQLENBQVQ7TUFDRCxDQU5NLEVBTUo5TCxJQU5JLEVBTUUzQyxjQU5GLENBQVA7SUFPRDtFQUNGO0VBRUQ7QUFDRjtBQUNBOzs7RUFDRTZLLFdBQVcsQ0FBQ3RPLE9BQUQsRUFBOEJzUyxVQUE5QixFQUFrRDVQLE9BQWxELEVBQW1KO0lBQzVKLElBQUksS0FBSzVDLEtBQUwsS0FBZSxLQUFLNkYsS0FBTCxDQUFXeU0sU0FBOUIsRUFBeUM7TUFDdkMsTUFBTXpLLE9BQU8sR0FBRyxzQ0FBc0MsS0FBS2hDLEtBQUwsQ0FBV3lNLFNBQVgsQ0FBcUJoTSxJQUEzRCxHQUFrRSxrQkFBbEUsR0FBdUYsS0FBS3RHLEtBQUwsQ0FBV3NHLElBQWxHLEdBQXlHLFFBQXpIO01BQ0EsS0FBSzNHLEtBQUwsQ0FBVzRKLEdBQVgsQ0FBZTFCLE9BQWY7TUFDQTNILE9BQU8sQ0FBQ21JLFFBQVIsQ0FBaUIsSUFBSUQsb0JBQUosQ0FBaUJQLE9BQWpCLEVBQTBCLGVBQTFCLENBQWpCO0lBQ0QsQ0FKRCxNQUlPLElBQUkzSCxPQUFPLENBQUN1UyxRQUFaLEVBQXNCO01BQzNCOUssT0FBTyxDQUFDQyxRQUFSLENBQWlCLE1BQU07UUFDckIxSCxPQUFPLENBQUNtSSxRQUFSLENBQWlCLElBQUlELG9CQUFKLENBQWlCLFdBQWpCLEVBQThCLFNBQTlCLENBQWpCO01BQ0QsQ0FGRDtJQUdELENBSk0sTUFJQTtNQUNMLElBQUlvSyxVQUFVLEtBQUt4TSxhQUFLK0gsU0FBeEIsRUFBbUM7UUFDakMsS0FBS3pPLFVBQUwsR0FBa0IsSUFBbEI7TUFDRCxDQUZELE1BRU87UUFDTCxLQUFLQSxVQUFMLEdBQWtCLEtBQWxCO01BQ0Q7O01BRUQsS0FBS1ksT0FBTCxHQUFlQSxPQUFmO01BQ0FBLE9BQU8sQ0FBQ3dTLFVBQVIsR0FBc0IsSUFBdEI7TUFDQXhTLE9BQU8sQ0FBQ3lTLFFBQVIsR0FBb0IsQ0FBcEI7TUFDQXpTLE9BQU8sQ0FBQzBQLElBQVIsR0FBZ0IsRUFBaEI7TUFDQTFQLE9BQU8sQ0FBQzBTLEdBQVIsR0FBZSxFQUFmOztNQUVBLE1BQU16QyxRQUFRLEdBQUcsTUFBTTtRQUNyQjBDLGFBQWEsQ0FBQ0MsTUFBZCxDQUFxQmpMLE9BQXJCO1FBQ0FnTCxhQUFhLENBQUNuSixPQUFkLENBQXNCLElBQUl0QixvQkFBSixDQUFpQixXQUFqQixFQUE4QixTQUE5QixDQUF0QixFQUZxQixDQUlyQjs7UUFDQVAsT0FBTyxDQUFDa0wsTUFBUixHQUFpQixJQUFqQjtRQUNBbEwsT0FBTyxDQUFDcUksR0FBUjs7UUFFQSxJQUFJaFEsT0FBTyxZQUFZbVEsZ0JBQW5CLElBQThCblEsT0FBTyxDQUFDOFMsTUFBMUMsRUFBa0Q7VUFDaEQ7VUFDQTlTLE9BQU8sQ0FBQytTLE1BQVI7UUFDRDtNQUNGLENBWkQ7O01BY0EvUyxPQUFPLENBQUN5RyxJQUFSLENBQWEsUUFBYixFQUF1QndKLFFBQXZCO01BRUEsS0FBS25HLGtCQUFMO01BRUEsTUFBTW5DLE9BQU8sR0FBRyxJQUFJaUcsZ0JBQUosQ0FBWTtRQUFFOU0sSUFBSSxFQUFFd1IsVUFBUjtRQUFvQlUsZUFBZSxFQUFFLEtBQUtqVDtNQUExQyxDQUFaLENBQWhCO01BQ0EsS0FBS0YsU0FBTCxDQUFlaU8scUJBQWYsQ0FBcUNULEtBQXJDLENBQTJDMUYsT0FBM0M7TUFDQSxLQUFLakIsWUFBTCxDQUFrQixLQUFLZixLQUFMLENBQVdzTixtQkFBN0I7TUFFQXRMLE9BQU8sQ0FBQ2xCLElBQVIsQ0FBYSxRQUFiLEVBQXVCLE1BQU07UUFDM0J6RyxPQUFPLENBQUN1RyxjQUFSLENBQXVCLFFBQXZCLEVBQWlDMEosUUFBakM7UUFDQWpRLE9BQU8sQ0FBQ3lHLElBQVIsQ0FBYSxRQUFiLEVBQXVCLEtBQUtqRyx1QkFBNUI7UUFFQSxLQUFLVCw0QkFBTCxHQUFvQyxLQUFwQztRQUNBLEtBQUtOLEtBQUwsQ0FBV2lELE9BQVgsQ0FBbUIsWUFBVztVQUM1QixPQUFPQSxPQUFPLENBQUUrSSxRQUFULENBQWtCLElBQWxCLENBQVA7UUFDRCxDQUZEO01BR0QsQ0FSRDs7TUFVQSxNQUFNa0gsYUFBYSxHQUFHNUUsaUJBQVN2SSxJQUFULENBQWM5QyxPQUFkLENBQXRCOztNQUNBaVEsYUFBYSxDQUFDbE0sSUFBZCxDQUFtQixPQUFuQixFQUE2QnFDLEtBQUQsSUFBVztRQUNyQzZKLGFBQWEsQ0FBQ0MsTUFBZCxDQUFxQmpMLE9BQXJCLEVBRHFDLENBR3JDOztRQUNBM0gsT0FBTyxDQUFDOEksS0FBUixLQUFBOUksT0FBTyxDQUFDOEksS0FBUixHQUFrQkEsS0FBbEI7UUFFQW5CLE9BQU8sQ0FBQ2tMLE1BQVIsR0FBaUIsSUFBakI7UUFDQWxMLE9BQU8sQ0FBQ3FJLEdBQVI7TUFDRCxDQVJEO01BU0EyQyxhQUFhLENBQUMzRSxJQUFkLENBQW1CckcsT0FBbkI7SUFDRDtFQUNGO0VBRUQ7QUFDRjtBQUNBOzs7RUFDRXVDLE1BQU0sR0FBRztJQUNQLElBQUksQ0FBQyxLQUFLbEssT0FBVixFQUFtQjtNQUNqQixPQUFPLEtBQVA7SUFDRDs7SUFFRCxJQUFJLEtBQUtBLE9BQUwsQ0FBYXVTLFFBQWpCLEVBQTJCO01BQ3pCLE9BQU8sS0FBUDtJQUNEOztJQUVELEtBQUt2UyxPQUFMLENBQWFrSyxNQUFiO0lBQ0EsT0FBTyxJQUFQO0VBQ0Q7RUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztFQUNFZ0osS0FBSyxDQUFDL0ssUUFBRCxFQUEwQjtJQUM3QixNQUFNbkksT0FBTyxHQUFHLElBQUltUSxnQkFBSixDQUFZLEtBQUt6QyxhQUFMLEVBQVosRUFBbUNwSCxHQUFELElBQVM7TUFDekQsSUFBSSxLQUFLeEgsTUFBTCxDQUFZaUMsT0FBWixDQUFvQnVELFVBQXBCLEdBQWlDLEtBQXJDLEVBQTRDO1FBQzFDLEtBQUtyRixhQUFMLEdBQXFCLEtBQXJCO01BQ0Q7O01BQ0RrSixRQUFRLENBQUM3QixHQUFELENBQVI7SUFDRCxDQUxlLENBQWhCO0lBTUEsS0FBS3ZHLDRCQUFMLEdBQW9DLElBQXBDO0lBQ0EsS0FBS3NPLFlBQUwsQ0FBa0JyTyxPQUFsQjtFQUNEO0VBRUQ7QUFDRjtBQUNBOzs7RUFDRTJOLDRCQUE0QixHQUFHO0lBQzdCLE9BQU8sS0FBS3pPLHNCQUFMLENBQTRCLEtBQUtBLHNCQUFMLENBQTRCNFAsTUFBNUIsR0FBcUMsQ0FBakUsQ0FBUDtFQUNEO0VBRUQ7QUFDRjtBQUNBOzs7RUFDRVoscUJBQXFCLENBQUN6SyxjQUFELEVBQXVFO0lBQzFGLFFBQVFBLGNBQVI7TUFDRSxLQUFLdkIsNkJBQWdCaVIsZ0JBQXJCO1FBQ0UsT0FBTyxrQkFBUDs7TUFDRixLQUFLalIsNkJBQWdCa1IsZUFBckI7UUFDRSxPQUFPLGlCQUFQOztNQUNGLEtBQUtsUiw2QkFBZ0JtUixZQUFyQjtRQUNFLE9BQU8sY0FBUDs7TUFDRixLQUFLblIsNkJBQWdCb1IsUUFBckI7UUFDRSxPQUFPLFVBQVA7O01BQ0Y7UUFDRSxPQUFPLGdCQUFQO0lBVko7RUFZRDs7QUFwckVtQzs7QUF1ckV0QyxTQUFTQyxnQkFBVCxDQUEwQnpLLEtBQTFCLEVBQTRFO0VBQzFFLElBQUlBLEtBQUssWUFBWTBLLHlCQUFyQixFQUFxQztJQUNuQzFLLEtBQUssR0FBR0EsS0FBSyxDQUFDMkssTUFBTixDQUFhLENBQWIsQ0FBUjtFQUNEOztFQUNELE9BQVEzSyxLQUFLLFlBQVkzQyx1QkFBbEIsSUFBc0MsQ0FBQyxDQUFDMkMsS0FBSyxDQUFDNEssV0FBckQ7QUFDRDs7ZUFFYy9VLFU7O0FBQ2ZnVixNQUFNLENBQUNDLE9BQVAsR0FBaUJqVixVQUFqQjtBQUVBQSxVQUFVLENBQUNrVixTQUFYLENBQXFCbE8sS0FBckIsR0FBNkI7RUFDM0JDLFdBQVcsRUFBRTtJQUNYUSxJQUFJLEVBQUUsYUFESztJQUVYdUUsTUFBTSxFQUFFO0VBRkcsQ0FEYztFQUszQmhFLFVBQVUsRUFBRTtJQUNWUCxJQUFJLEVBQUUsWUFESTtJQUVWbUUsS0FBSyxFQUFFLFlBQVc7TUFDaEIsS0FBS3BELG9CQUFMO0lBQ0QsQ0FKUztJQUtWd0QsTUFBTSxFQUFFO01BQ041QixXQUFXLEVBQUUsWUFBVztRQUN0QixLQUFLckMsWUFBTCxDQUFrQixLQUFLZixLQUFMLENBQVd1QixLQUE3QjtNQUNELENBSEs7TUFJTmxGLGNBQWMsRUFBRSxZQUFXO1FBQ3pCLEtBQUswRSxZQUFMLENBQWtCLEtBQUtmLEtBQUwsQ0FBV3VCLEtBQTdCO01BQ0Q7SUFOSztFQUxFLENBTGU7RUFtQjNCcUMsYUFBYSxFQUFFO0lBQ2JuRCxJQUFJLEVBQUUsY0FETztJQUVibUUsS0FBSyxFQUFFLFlBQVc7TUFDaEIsQ0FBQyxZQUFZO1FBQ1gsSUFBSXBLLGFBQWEsR0FBR29GLE1BQU0sQ0FBQ0UsS0FBUCxDQUFhLENBQWIsQ0FBcEI7UUFFQSxJQUFJa0MsT0FBSjs7UUFDQSxJQUFJO1VBQ0ZBLE9BQU8sR0FBRyxNQUFNLEtBQUs5SCxTQUFMLENBQWVpVSxXQUFmLEVBQWhCO1FBQ0QsQ0FGRCxDQUVFLE9BQU94TixHQUFQLEVBQWlCO1VBQ2pCLE9BQU8sS0FBS3lDLFdBQUwsQ0FBaUJ6QyxHQUFqQixDQUFQO1FBQ0Q7O1FBRUQsV0FBVyxNQUFNOUQsSUFBakIsSUFBeUJtRixPQUF6QixFQUFrQztVQUNoQ3hILGFBQWEsR0FBR29GLE1BQU0sQ0FBQ3dPLE1BQVAsQ0FBYyxDQUFDNVQsYUFBRCxFQUFnQnFDLElBQWhCLENBQWQsQ0FBaEI7UUFDRDs7UUFFRCxNQUFNd1IsZUFBZSxHQUFHLElBQUkzSSx3QkFBSixDQUFvQmxMLGFBQXBCLENBQXhCO1FBQ0EsS0FBS1YsS0FBTCxDQUFXaUQsT0FBWCxDQUFtQixZQUFXO1VBQzVCLE9BQU9zUixlQUFlLENBQUN2SSxRQUFoQixDQUF5QixJQUF6QixDQUFQO1FBQ0QsQ0FGRDs7UUFJQSxJQUFJdUksZUFBZSxDQUFDalYsZUFBaEIsS0FBb0MsQ0FBeEMsRUFBMkM7VUFDekMsS0FBS0EsZUFBTCxHQUF1QixJQUF2QjtRQUNEOztRQUVELElBQUlpVixlQUFlLENBQUNDLGdCQUFoQixLQUFxQyxJQUFyQyxJQUE2Q0QsZUFBZSxDQUFDQyxnQkFBaEIsS0FBcUMsS0FBdEYsRUFBNkY7VUFDM0YsSUFBSSxDQUFDLEtBQUtuVixNQUFMLENBQVlpQyxPQUFaLENBQW9Cc0MsT0FBekIsRUFBa0M7WUFDaEMsS0FBSzBELElBQUwsQ0FBVSxTQUFWLEVBQXFCLElBQUlaLHVCQUFKLENBQW9CLGtFQUFwQixFQUF3RixVQUF4RixDQUFyQjtZQUNBLE9BQU8sS0FBS2MsS0FBTCxFQUFQO1VBQ0Q7O1VBRUQsSUFBSTtZQUFBOztZQUNGLEtBQUtQLFlBQUwsQ0FBa0IsS0FBS2YsS0FBTCxDQUFXaUYsc0JBQTdCO1lBQ0EsTUFBTSxLQUFLL0ssU0FBTCxDQUFlcVUsUUFBZixDQUF3QixLQUFLbFYsb0JBQTdCLEVBQW1ELDJCQUFLWSxXQUFMLHdFQUFrQmUsTUFBbEIsS0FBNEIsS0FBSzdCLE1BQUwsQ0FBWTZCLE1BQTNGLEVBQW1HLEtBQUs3QixNQUFMLENBQVlpQyxPQUFaLENBQW9CMEQsc0JBQXZILENBQU47VUFDRCxDQUhELENBR0UsT0FBTzZCLEdBQVAsRUFBaUI7WUFDakIsT0FBTyxLQUFLeUMsV0FBTCxDQUFpQnpDLEdBQWpCLENBQVA7VUFDRDtRQUNGOztRQUVELEtBQUtvRixnQkFBTDtRQUVBLE1BQU07VUFBRTlLO1FBQUYsSUFBcUIsS0FBSzlCLE1BQWhDOztRQUVBLFFBQVE4QixjQUFjLENBQUNFLElBQXZCO1VBQ0UsS0FBSyxpQ0FBTDtVQUNBLEtBQUssK0JBQUw7VUFDQSxLQUFLLHdDQUFMO1VBQ0EsS0FBSyxpREFBTDtVQUNBLEtBQUssZ0NBQUw7WUFDRSxLQUFLNEYsWUFBTCxDQUFrQixLQUFLZixLQUFMLENBQVd3Tyx3QkFBN0I7WUFDQTs7VUFDRixLQUFLLE1BQUw7WUFDRSxLQUFLek4sWUFBTCxDQUFrQixLQUFLZixLQUFMLENBQVd5TyxxQkFBN0I7WUFDQTs7VUFDRjtZQUNFLEtBQUsxTixZQUFMLENBQWtCLEtBQUtmLEtBQUwsQ0FBVzRILCtCQUE3QjtZQUNBO1FBYko7TUFlRCxDQXhERCxJQXdESzhHLEtBeERMLENBd0RZL04sR0FBRCxJQUFTO1FBQ2xCbUIsT0FBTyxDQUFDQyxRQUFSLENBQWlCLE1BQU07VUFDckIsTUFBTXBCLEdBQU47UUFDRCxDQUZEO01BR0QsQ0E1REQ7SUE2REQsQ0FoRVk7SUFpRWJxRSxNQUFNLEVBQUU7TUFDTjVCLFdBQVcsRUFBRSxZQUFXO1FBQ3RCLEtBQUtyQyxZQUFMLENBQWtCLEtBQUtmLEtBQUwsQ0FBV3VCLEtBQTdCO01BQ0QsQ0FISztNQUlObEYsY0FBYyxFQUFFLFlBQVc7UUFDekIsS0FBSzBFLFlBQUwsQ0FBa0IsS0FBS2YsS0FBTCxDQUFXdUIsS0FBN0I7TUFDRDtJQU5LO0VBakVLLENBbkJZO0VBNkYzQjRELFNBQVMsRUFBRTtJQUNUMUUsSUFBSSxFQUFFLFdBREc7SUFFVG1FLEtBQUssRUFBRSxZQUFXO01BQ2hCLEtBQUszQyxpQkFBTCxDQUF1QnJKLFlBQVksQ0FBQ0UsUUFBcEM7SUFDRCxDQUpRO0lBS1RrTSxNQUFNLEVBQUU7TUFDTmhELE9BQU8sRUFBRSxZQUFXLENBQ25CLENBRks7TUFHTm9CLFdBQVcsRUFBRSxZQUFXO1FBQ3RCLEtBQUtyQyxZQUFMLENBQWtCLEtBQUtmLEtBQUwsQ0FBV3VCLEtBQTdCO01BQ0QsQ0FMSztNQU1ObEYsY0FBYyxFQUFFLFlBQVc7UUFDekIsS0FBSzBFLFlBQUwsQ0FBa0IsS0FBS2YsS0FBTCxDQUFXdUIsS0FBN0I7TUFDRCxDQVJLO01BU05vTixTQUFTLEVBQUUsWUFBVztRQUNwQixLQUFLNU4sWUFBTCxDQUFrQixLQUFLZixLQUFMLENBQVdnQixVQUE3QjtNQUNEO0lBWEs7RUFMQyxDQTdGZ0I7RUFnSDNCb0UsdUJBQXVCLEVBQUU7SUFDdkIzRSxJQUFJLEVBQUUseUJBRGlCO0lBRXZCbUUsS0FBSyxFQUFFLFlBQVc7TUFDaEIsS0FBS2xMLHNCQUFMO01BQ0EsS0FBS3VJLGlCQUFMLENBQXVCckosWUFBWSxDQUFDRyxLQUFwQztJQUNELENBTHNCO0lBTXZCaU0sTUFBTSxFQUFFO01BQ05oRCxPQUFPLEVBQUUsWUFBVyxDQUNuQixDQUZLO01BR05vQixXQUFXLEVBQUUsWUFBVztRQUN0QixLQUFLckMsWUFBTCxDQUFrQixLQUFLZixLQUFMLENBQVd1QixLQUE3QjtNQUNELENBTEs7TUFNTmxGLGNBQWMsRUFBRSxZQUFXO1FBQ3pCLEtBQUswRSxZQUFMLENBQWtCLEtBQUtmLEtBQUwsQ0FBV3VCLEtBQTdCO01BQ0QsQ0FSSztNQVNOcU4sS0FBSyxFQUFFLFlBQVc7UUFDaEIsS0FBS3hLLGdCQUFMO01BQ0Q7SUFYSztFQU5lLENBaEhFO0VBb0kzQmEsc0JBQXNCLEVBQUU7SUFDdEJ4RSxJQUFJLEVBQUUsdUJBRGdCO0lBRXRCdUUsTUFBTSxFQUFFO01BQ041QixXQUFXLEVBQUUsWUFBVztRQUN0QixLQUFLckMsWUFBTCxDQUFrQixLQUFLZixLQUFMLENBQVd1QixLQUE3QjtNQUNELENBSEs7TUFJTmxGLGNBQWMsRUFBRSxZQUFXO1FBQ3pCLEtBQUswRSxZQUFMLENBQWtCLEtBQUtmLEtBQUwsQ0FBV3VCLEtBQTdCO01BQ0Q7SUFOSztFQUZjLENBcElHO0VBK0kzQnFHLCtCQUErQixFQUFFO0lBQy9CbkgsSUFBSSxFQUFFLDZCQUR5QjtJQUUvQm1FLEtBQUssRUFBRSxZQUFXO01BQ2hCLENBQUMsWUFBWTtRQUNYLElBQUk1QyxPQUFKOztRQUNBLElBQUk7VUFDRkEsT0FBTyxHQUFHLE1BQU0sS0FBSzlILFNBQUwsQ0FBZWlVLFdBQWYsRUFBaEI7UUFDRCxDQUZELENBRUUsT0FBT3hOLEdBQVAsRUFBaUI7VUFDakIsT0FBTyxLQUFLeUMsV0FBTCxDQUFpQnpDLEdBQWpCLENBQVA7UUFDRDs7UUFFRCxNQUFNZ0MsT0FBTyxHQUFHLElBQUlrTSwyQkFBSixDQUF1QixJQUF2QixDQUFoQjtRQUNBLE1BQU1DLGlCQUFpQixHQUFHLEtBQUtwTSx1QkFBTCxDQUE2QlYsT0FBN0IsRUFBc0NXLE9BQXRDLENBQTFCO1FBRUEsTUFBTSxrQkFBS21NLGlCQUFMLEVBQXdCLEtBQXhCLENBQU47O1FBRUEsSUFBSW5NLE9BQU8sQ0FBQ29NLGdCQUFaLEVBQThCO1VBQzVCLElBQUlwTSxPQUFPLENBQUMxSSxXQUFaLEVBQXlCO1lBQ3ZCLEtBQUtBLFdBQUwsR0FBbUIwSSxPQUFPLENBQUMxSSxXQUEzQjtZQUNBLEtBQUs4RyxZQUFMLENBQWtCLEtBQUtmLEtBQUwsQ0FBV21GLFNBQTdCO1VBQ0QsQ0FIRCxNQUdPO1lBQ0wsS0FBS3BFLFlBQUwsQ0FBa0IsS0FBS2YsS0FBTCxDQUFXZ1AsNkJBQTdCO1VBQ0Q7UUFDRixDQVBELE1BT08sSUFBSSxLQUFLblYsVUFBVCxFQUFxQjtVQUMxQixJQUFJK1QsZ0JBQWdCLENBQUMsS0FBSy9ULFVBQU4sQ0FBcEIsRUFBdUM7WUFDckMsS0FBS0MsS0FBTCxDQUFXNEosR0FBWCxDQUFlLHFDQUFmO1lBQ0EsS0FBSzNDLFlBQUwsQ0FBa0IsS0FBS2YsS0FBTCxDQUFXb0YsdUJBQTdCO1VBQ0QsQ0FIRCxNQUdPO1lBQ0wsS0FBS2hFLElBQUwsQ0FBVSxTQUFWLEVBQXFCLEtBQUt2SCxVQUExQjtZQUNBLEtBQUtrSCxZQUFMLENBQWtCLEtBQUtmLEtBQUwsQ0FBV3VCLEtBQTdCO1VBQ0Q7UUFDRixDQVJNLE1BUUE7VUFDTCxLQUFLSCxJQUFMLENBQVUsU0FBVixFQUFxQixJQUFJWix1QkFBSixDQUFvQixlQUFwQixFQUFxQyxRQUFyQyxDQUFyQjtVQUNBLEtBQUtPLFlBQUwsQ0FBa0IsS0FBS2YsS0FBTCxDQUFXdUIsS0FBN0I7UUFDRDtNQUNGLENBaENELElBZ0NLbU4sS0FoQ0wsQ0FnQ1kvTixHQUFELElBQVM7UUFDbEJtQixPQUFPLENBQUNDLFFBQVIsQ0FBaUIsTUFBTTtVQUNyQixNQUFNcEIsR0FBTjtRQUNELENBRkQ7TUFHRCxDQXBDRDtJQXFDRCxDQXhDOEI7SUF5Qy9CcUUsTUFBTSxFQUFFO01BQ041QixXQUFXLEVBQUUsWUFBVztRQUN0QixLQUFLckMsWUFBTCxDQUFrQixLQUFLZixLQUFMLENBQVd1QixLQUE3QjtNQUNELENBSEs7TUFJTmxGLGNBQWMsRUFBRSxZQUFXO1FBQ3pCLEtBQUswRSxZQUFMLENBQWtCLEtBQUtmLEtBQUwsQ0FBV3VCLEtBQTdCO01BQ0Q7SUFOSztFQXpDdUIsQ0EvSU47RUFpTTNCa04scUJBQXFCLEVBQUU7SUFDckJoTyxJQUFJLEVBQUUseUJBRGU7SUFFckJtRSxLQUFLLEVBQUUsWUFBVztNQUNoQixDQUFDLFlBQVk7UUFDWCxPQUFPLElBQVAsRUFBYTtVQUNYLElBQUk1QyxPQUFKOztVQUNBLElBQUk7WUFDRkEsT0FBTyxHQUFHLE1BQU0sS0FBSzlILFNBQUwsQ0FBZWlVLFdBQWYsRUFBaEI7VUFDRCxDQUZELENBRUUsT0FBT3hOLEdBQVAsRUFBaUI7WUFDakIsT0FBTyxLQUFLeUMsV0FBTCxDQUFpQnpDLEdBQWpCLENBQVA7VUFDRDs7VUFFRCxNQUFNZ0MsT0FBTyxHQUFHLElBQUlrTSwyQkFBSixDQUF1QixJQUF2QixDQUFoQjtVQUNBLE1BQU1DLGlCQUFpQixHQUFHLEtBQUtwTSx1QkFBTCxDQUE2QlYsT0FBN0IsRUFBc0NXLE9BQXRDLENBQTFCO1VBRUEsTUFBTSxrQkFBS21NLGlCQUFMLEVBQXdCLEtBQXhCLENBQU47O1VBRUEsSUFBSW5NLE9BQU8sQ0FBQ29NLGdCQUFaLEVBQThCO1lBQzVCLElBQUlwTSxPQUFPLENBQUMxSSxXQUFaLEVBQXlCO2NBQ3ZCLEtBQUtBLFdBQUwsR0FBbUIwSSxPQUFPLENBQUMxSSxXQUEzQjtjQUNBLE9BQU8sS0FBSzhHLFlBQUwsQ0FBa0IsS0FBS2YsS0FBTCxDQUFXbUYsU0FBN0IsQ0FBUDtZQUNELENBSEQsTUFHTztjQUNMLE9BQU8sS0FBS3BFLFlBQUwsQ0FBa0IsS0FBS2YsS0FBTCxDQUFXZ1AsNkJBQTdCLENBQVA7WUFDRDtVQUNGLENBUEQsTUFPTyxJQUFJLEtBQUtqVixVQUFULEVBQXFCO1lBQzFCLE1BQU1rQixjQUFjLEdBQUcsS0FBSzlCLE1BQUwsQ0FBWThCLGNBQW5DO1lBRUEsTUFBTThCLE9BQU8sR0FBRyxJQUFJa1Msb0JBQUosQ0FBd0I7Y0FDdEM1VCxNQUFNLEVBQUVKLGNBQWMsQ0FBQ0csT0FBZixDQUF1QkMsTUFETztjQUV0Q0MsUUFBUSxFQUFFTCxjQUFjLENBQUNHLE9BQWYsQ0FBdUJFLFFBRks7Y0FHdENDLFFBQVEsRUFBRU4sY0FBYyxDQUFDRyxPQUFmLENBQXVCRyxRQUhLO2NBSXRDeEIsVUFBVSxFQUFFLEtBQUtBO1lBSnFCLENBQXhCLENBQWhCO1lBT0EsS0FBS0csU0FBTCxDQUFlZ0csV0FBZixDQUEyQkMsYUFBSytPLFlBQWhDLEVBQThDblMsT0FBTyxDQUFDRixJQUF0RDtZQUNBLEtBQUsvQyxLQUFMLENBQVdpRCxPQUFYLENBQW1CLFlBQVc7Y0FDNUIsT0FBT0EsT0FBTyxDQUFDK0ksUUFBUixDQUFpQixJQUFqQixDQUFQO1lBQ0QsQ0FGRDtZQUlBLEtBQUsvTCxVQUFMLEdBQWtCbUIsU0FBbEI7VUFDRCxDQWhCTSxNQWdCQSxJQUFJLEtBQUtyQixVQUFULEVBQXFCO1lBQzFCLElBQUkrVCxnQkFBZ0IsQ0FBQyxLQUFLL1QsVUFBTixDQUFwQixFQUF1QztjQUNyQyxLQUFLQyxLQUFMLENBQVc0SixHQUFYLENBQWUscUNBQWY7Y0FDQSxPQUFPLEtBQUszQyxZQUFMLENBQWtCLEtBQUtmLEtBQUwsQ0FBV29GLHVCQUE3QixDQUFQO1lBQ0QsQ0FIRCxNQUdPO2NBQ0wsS0FBS2hFLElBQUwsQ0FBVSxTQUFWLEVBQXFCLEtBQUt2SCxVQUExQjtjQUNBLE9BQU8sS0FBS2tILFlBQUwsQ0FBa0IsS0FBS2YsS0FBTCxDQUFXdUIsS0FBN0IsQ0FBUDtZQUNEO1VBQ0YsQ0FSTSxNQVFBO1lBQ0wsS0FBS0gsSUFBTCxDQUFVLFNBQVYsRUFBcUIsSUFBSVosdUJBQUosQ0FBb0IsZUFBcEIsRUFBcUMsUUFBckMsQ0FBckI7WUFDQSxPQUFPLEtBQUtPLFlBQUwsQ0FBa0IsS0FBS2YsS0FBTCxDQUFXdUIsS0FBN0IsQ0FBUDtVQUNEO1FBQ0Y7TUFFRixDQW5ERCxJQW1ES21OLEtBbkRMLENBbURZL04sR0FBRCxJQUFTO1FBQ2xCbUIsT0FBTyxDQUFDQyxRQUFSLENBQWlCLE1BQU07VUFDckIsTUFBTXBCLEdBQU47UUFDRCxDQUZEO01BR0QsQ0F2REQ7SUF3REQsQ0EzRG9CO0lBNERyQnFFLE1BQU0sRUFBRTtNQUNONUIsV0FBVyxFQUFFLFlBQVc7UUFDdEIsS0FBS3JDLFlBQUwsQ0FBa0IsS0FBS2YsS0FBTCxDQUFXdUIsS0FBN0I7TUFDRCxDQUhLO01BSU5sRixjQUFjLEVBQUUsWUFBVztRQUN6QixLQUFLMEUsWUFBTCxDQUFrQixLQUFLZixLQUFMLENBQVd1QixLQUE3QjtNQUNEO0lBTks7RUE1RGEsQ0FqTUk7RUFzUTNCaU4sd0JBQXdCLEVBQUU7SUFDeEIvTixJQUFJLEVBQUUsdUJBRGtCO0lBRXhCbUUsS0FBSyxFQUFFLFlBQVc7TUFDaEIsQ0FBQyxZQUFZO1FBQ1gsSUFBSTVDLE9BQUo7O1FBQ0EsSUFBSTtVQUNGQSxPQUFPLEdBQUcsTUFBTSxLQUFLOUgsU0FBTCxDQUFlaVUsV0FBZixFQUFoQjtRQUNELENBRkQsQ0FFRSxPQUFPeE4sR0FBUCxFQUFpQjtVQUNqQixPQUFPLEtBQUt5QyxXQUFMLENBQWlCekMsR0FBakIsQ0FBUDtRQUNEOztRQUVELE1BQU1nQyxPQUFPLEdBQUcsSUFBSWtNLDJCQUFKLENBQXVCLElBQXZCLENBQWhCO1FBQ0EsTUFBTUMsaUJBQWlCLEdBQUcsS0FBS3BNLHVCQUFMLENBQTZCVixPQUE3QixFQUFzQ1csT0FBdEMsQ0FBMUI7UUFDQSxNQUFNLGtCQUFLbU0saUJBQUwsRUFBd0IsS0FBeEIsQ0FBTjs7UUFDQSxJQUFJbk0sT0FBTyxDQUFDb00sZ0JBQVosRUFBOEI7VUFDNUIsSUFBSXBNLE9BQU8sQ0FBQzFJLFdBQVosRUFBeUI7WUFDdkIsS0FBS0EsV0FBTCxHQUFtQjBJLE9BQU8sQ0FBQzFJLFdBQTNCO1lBQ0EsS0FBSzhHLFlBQUwsQ0FBa0IsS0FBS2YsS0FBTCxDQUFXbUYsU0FBN0I7VUFDRCxDQUhELE1BR087WUFDTCxLQUFLcEUsWUFBTCxDQUFrQixLQUFLZixLQUFMLENBQVdnUCw2QkFBN0I7VUFDRDs7VUFFRDtRQUNEOztRQUVELE1BQU1HLGdCQUFnQixHQUFHeE0sT0FBTyxDQUFDd00sZ0JBQWpDOztRQUVBLElBQUlBLGdCQUFnQixJQUFJQSxnQkFBZ0IsQ0FBQ0MsTUFBckMsSUFBK0NELGdCQUFnQixDQUFDRSxHQUFwRSxFQUF5RTtVQUN2RSxNQUFNcFUsY0FBYyxHQUFHLEtBQUs5QixNQUFMLENBQVk4QixjQUFuQztVQUNBLE1BQU1xVSxVQUFVLEdBQUcsSUFBSUMsUUFBSixDQUFRLFdBQVIsRUFBcUJKLGdCQUFnQixDQUFDRSxHQUF0QyxFQUEyQ3ZKLFFBQTNDLEVBQW5CO1VBRUEsSUFBSTBKLFdBQUo7O1VBRUEsUUFBUXZVLGNBQWMsQ0FBQ0UsSUFBdkI7WUFDRSxLQUFLLGlDQUFMO2NBQ0VxVSxXQUFXLEdBQUcsSUFBSUMsb0NBQUosQ0FDWnhVLGNBQWMsQ0FBQ0csT0FBZixDQUF1Qk0sUUFBdkIsSUFBbUMsUUFEdkIsRUFFWlQsY0FBYyxDQUFDRyxPQUFmLENBQXVCSyxRQUZYLEVBR1pSLGNBQWMsQ0FBQ0csT0FBZixDQUF1QkUsUUFIWCxFQUlaTCxjQUFjLENBQUNHLE9BQWYsQ0FBdUJHLFFBSlgsQ0FBZDtjQU1BOztZQUNGLEtBQUssK0JBQUw7WUFDQSxLQUFLLHdDQUFMO2NBQ0UsTUFBTW1VLE9BQU8sR0FBR3pVLGNBQWMsQ0FBQ0csT0FBZixDQUF1QkssUUFBdkIsR0FBa0MsQ0FBQ1IsY0FBYyxDQUFDRyxPQUFmLENBQXVCSyxRQUF4QixFQUFrQyxFQUFsQyxDQUFsQyxHQUEwRSxDQUFDLEVBQUQsQ0FBMUY7Y0FDQStULFdBQVcsR0FBRyxJQUFJRyxtQ0FBSixDQUE4QixHQUFHRCxPQUFqQyxDQUFkO2NBQ0E7O1lBQ0YsS0FBSyxnQ0FBTDtjQUNFLE1BQU1yTyxJQUFJLEdBQUdwRyxjQUFjLENBQUNHLE9BQWYsQ0FBdUJLLFFBQXZCLEdBQWtDO2dCQUFFbVUsdUJBQXVCLEVBQUUzVSxjQUFjLENBQUNHLE9BQWYsQ0FBdUJLO2NBQWxELENBQWxDLEdBQWlHLEVBQTlHO2NBQ0ErVCxXQUFXLEdBQUcsSUFBSUssZ0NBQUosQ0FBMkJ4TyxJQUEzQixDQUFkO2NBQ0E7O1lBQ0YsS0FBSyxpREFBTDtjQUNFbU8sV0FBVyxHQUFHLElBQUlNLGdDQUFKLENBQ1o3VSxjQUFjLENBQUNHLE9BQWYsQ0FBdUJNLFFBRFgsRUFFWlQsY0FBYyxDQUFDRyxPQUFmLENBQXVCSyxRQUZYLEVBR1pSLGNBQWMsQ0FBQ0csT0FBZixDQUF1QlEsWUFIWCxDQUFkO2NBS0E7VUF4Qko7O1VBMkJBLElBQUltVSxhQUFKOztVQUNBLElBQUk7WUFDRkEsYUFBYSxHQUFHLE1BQU1QLFdBQVcsQ0FBQ1EsUUFBWixDQUFxQlYsVUFBckIsQ0FBdEI7VUFDRCxDQUZELENBRUUsT0FBTzNPLEdBQVAsRUFBWTtZQUNaLEtBQUs5RyxVQUFMLEdBQWtCLElBQUlnVSx5QkFBSixDQUNoQixDQUFDLElBQUlyTix1QkFBSixDQUFvQiwwREFBcEIsRUFBZ0YsVUFBaEYsQ0FBRCxFQUE4RkcsR0FBOUYsQ0FEZ0IsQ0FBbEI7WUFFQSxLQUFLUyxJQUFMLENBQVUsU0FBVixFQUFxQixLQUFLdkgsVUFBMUI7WUFDQSxLQUFLa0gsWUFBTCxDQUFrQixLQUFLZixLQUFMLENBQVd1QixLQUE3QjtZQUNBO1VBQ0Q7O1VBR0QsTUFBTTVGLEtBQUssR0FBR29VLGFBQWEsQ0FBQ3BVLEtBQTVCO1VBQ0EsS0FBSzBMLHVCQUFMLENBQTZCMUwsS0FBN0I7UUFFRCxDQWhERCxNQWdETyxJQUFJLEtBQUs5QixVQUFULEVBQXFCO1VBQzFCLElBQUkrVCxnQkFBZ0IsQ0FBQyxLQUFLL1QsVUFBTixDQUFwQixFQUF1QztZQUNyQyxLQUFLQyxLQUFMLENBQVc0SixHQUFYLENBQWUscUNBQWY7WUFDQSxLQUFLM0MsWUFBTCxDQUFrQixLQUFLZixLQUFMLENBQVdvRix1QkFBN0I7VUFDRCxDQUhELE1BR087WUFDTCxLQUFLaEUsSUFBTCxDQUFVLFNBQVYsRUFBcUIsS0FBS3ZILFVBQTFCO1lBQ0EsS0FBS2tILFlBQUwsQ0FBa0IsS0FBS2YsS0FBTCxDQUFXdUIsS0FBN0I7VUFDRDtRQUNGLENBUk0sTUFRQTtVQUNMLEtBQUtILElBQUwsQ0FBVSxTQUFWLEVBQXFCLElBQUlaLHVCQUFKLENBQW9CLGVBQXBCLEVBQXFDLFFBQXJDLENBQXJCO1VBQ0EsS0FBS08sWUFBTCxDQUFrQixLQUFLZixLQUFMLENBQVd1QixLQUE3QjtRQUNEO01BRUYsQ0FyRkQsSUFxRkttTixLQXJGTCxDQXFGWS9OLEdBQUQsSUFBUztRQUNsQm1CLE9BQU8sQ0FBQ0MsUUFBUixDQUFpQixNQUFNO1VBQ3JCLE1BQU1wQixHQUFOO1FBQ0QsQ0FGRDtNQUdELENBekZEO0lBMEZELENBN0Z1QjtJQThGeEJxRSxNQUFNLEVBQUU7TUFDTjVCLFdBQVcsRUFBRSxZQUFXO1FBQ3RCLEtBQUtyQyxZQUFMLENBQWtCLEtBQUtmLEtBQUwsQ0FBV3VCLEtBQTdCO01BQ0QsQ0FISztNQUlObEYsY0FBYyxFQUFFLFlBQVc7UUFDekIsS0FBSzBFLFlBQUwsQ0FBa0IsS0FBS2YsS0FBTCxDQUFXdUIsS0FBN0I7TUFDRDtJQU5LO0VBOUZnQixDQXRRQztFQTZXM0J5Tiw2QkFBNkIsRUFBRTtJQUM3QnZPLElBQUksRUFBRSwyQkFEdUI7SUFFN0JtRSxLQUFLLEVBQUUsWUFBVztNQUNoQixDQUFDLFlBQVk7UUFDWCxLQUFLaUQsY0FBTDtRQUNBLElBQUk3RixPQUFKOztRQUNBLElBQUk7VUFDRkEsT0FBTyxHQUFHLE1BQU0sS0FBSzlILFNBQUwsQ0FBZWlVLFdBQWYsRUFBaEI7UUFDRCxDQUZELENBRUUsT0FBT3hOLEdBQVAsRUFBaUI7VUFDakIsT0FBTyxLQUFLeUMsV0FBTCxDQUFpQnpDLEdBQWpCLENBQVA7UUFDRDs7UUFDRCxNQUFNbU8saUJBQWlCLEdBQUcsS0FBS3BNLHVCQUFMLENBQTZCVixPQUE3QixFQUFzQyxJQUFJaU8sK0JBQUosQ0FBMkIsSUFBM0IsQ0FBdEMsQ0FBMUI7UUFDQSxNQUFNLGtCQUFLbkIsaUJBQUwsRUFBd0IsS0FBeEIsQ0FBTjtRQUVBLEtBQUsvTixZQUFMLENBQWtCLEtBQUtmLEtBQUwsQ0FBV3lNLFNBQTdCO1FBQ0EsS0FBS2hFLG1CQUFMO01BRUQsQ0FkRCxJQWNLaUcsS0FkTCxDQWNZL04sR0FBRCxJQUFTO1FBQ2xCbUIsT0FBTyxDQUFDQyxRQUFSLENBQWlCLE1BQU07VUFDckIsTUFBTXBCLEdBQU47UUFDRCxDQUZEO01BR0QsQ0FsQkQ7SUFtQkQsQ0F0QjRCO0lBdUI3QnFFLE1BQU0sRUFBRTtNQUNONUIsV0FBVyxFQUFFLFNBQVNBLFdBQVQsR0FBdUI7UUFDbEMsS0FBS3JDLFlBQUwsQ0FBa0IsS0FBS2YsS0FBTCxDQUFXdUIsS0FBN0I7TUFDRCxDQUhLO01BSU5sRixjQUFjLEVBQUUsWUFBVztRQUN6QixLQUFLMEUsWUFBTCxDQUFrQixLQUFLZixLQUFMLENBQVd1QixLQUE3QjtNQUNEO0lBTks7RUF2QnFCLENBN1dKO0VBNlkzQmtMLFNBQVMsRUFBRTtJQUNUaE0sSUFBSSxFQUFFLFVBREc7SUFFVHVFLE1BQU0sRUFBRTtNQUNONUIsV0FBVyxFQUFFLFlBQVc7UUFDdEIsS0FBS3JDLFlBQUwsQ0FBa0IsS0FBS2YsS0FBTCxDQUFXdUIsS0FBN0I7TUFDRDtJQUhLO0VBRkMsQ0E3WWdCO0VBcVozQitMLG1CQUFtQixFQUFFO0lBQ25CN00sSUFBSSxFQUFFLG1CQURhO0lBRW5CbUUsS0FBSyxFQUFFLFlBQVc7TUFDaEIsQ0FBQyxZQUFZO1FBQUE7O1FBQ1gsSUFBSTVDLE9BQUo7O1FBQ0EsSUFBSTtVQUNGQSxPQUFPLEdBQUcsTUFBTSxLQUFLOUgsU0FBTCxDQUFlaVUsV0FBZixFQUFoQjtRQUNELENBRkQsQ0FFRSxPQUFPeE4sR0FBUCxFQUFpQjtVQUNqQixPQUFPLEtBQUt5QyxXQUFMLENBQWlCekMsR0FBakIsQ0FBUDtRQUNELENBTlUsQ0FPWDs7O1FBQ0EsS0FBS3lCLGlCQUFMO1FBRUEsTUFBTTBNLGlCQUFpQixHQUFHLEtBQUtwTSx1QkFBTCxDQUE2QlYsT0FBN0IsRUFBc0MsSUFBSWtPLDRCQUFKLENBQXdCLElBQXhCLEVBQThCLEtBQUs3VixPQUFuQyxDQUF0QyxDQUExQixDQVZXLENBWVg7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFDQSxJQUFJLHNCQUFLQSxPQUFMLHdEQUFjdVMsUUFBZCxJQUEwQixLQUFLbFMsV0FBbkMsRUFBZ0Q7VUFDOUMsT0FBTyxLQUFLcUcsWUFBTCxDQUFrQixLQUFLZixLQUFMLENBQVdtUSxjQUE3QixDQUFQO1FBQ0Q7O1FBRUQsTUFBTUMsUUFBUSxHQUFHLE1BQU07VUFDckJ0QixpQkFBaUIsQ0FBQzFCLE1BQWxCO1FBQ0QsQ0FGRDs7UUFHQSxNQUFNaUQsT0FBTyxHQUFHLE1BQU07VUFBQTs7VUFDcEJ2QixpQkFBaUIsQ0FBQ3dCLEtBQWxCO1VBRUEsdUJBQUtqVyxPQUFMLGtFQUFjeUcsSUFBZCxDQUFtQixRQUFuQixFQUE2QnNQLFFBQTdCO1FBQ0QsQ0FKRDs7UUFNQSx1QkFBSy9WLE9BQUwsa0VBQWM0RyxFQUFkLENBQWlCLE9BQWpCLEVBQTBCb1AsT0FBMUI7O1FBRUEsSUFBSSxLQUFLaFcsT0FBTCxZQUF3Qm1RLGdCQUF4QixJQUFtQyxLQUFLblEsT0FBTCxDQUFhOFMsTUFBcEQsRUFBNEQ7VUFDMURrRCxPQUFPO1FBQ1I7O1FBRUQsTUFBTS9GLFFBQVEsR0FBRyxNQUFNO1VBQUE7O1VBQ3JCd0UsaUJBQWlCLENBQUNsTyxjQUFsQixDQUFpQyxLQUFqQyxFQUF3QzJQLGNBQXhDOztVQUVBLElBQUksS0FBS2xXLE9BQUwsWUFBd0JtUSxnQkFBeEIsSUFBbUMsS0FBS25RLE9BQUwsQ0FBYThTLE1BQXBELEVBQTREO1lBQzFEO1lBQ0EsS0FBSzlTLE9BQUwsQ0FBYStTLE1BQWI7VUFDRDs7VUFFRCx1QkFBSy9TLE9BQUwsa0VBQWN1RyxjQUFkLENBQTZCLE9BQTdCLEVBQXNDeVAsT0FBdEM7VUFDQSx1QkFBS2hXLE9BQUwsa0VBQWN1RyxjQUFkLENBQTZCLFFBQTdCLEVBQXVDd1AsUUFBdkMsRUFUcUIsQ0FXckI7VUFDQTtVQUNBO1VBQ0E7O1VBQ0EsS0FBS3JQLFlBQUwsQ0FBa0IsS0FBS2YsS0FBTCxDQUFXbVEsY0FBN0I7UUFDRCxDQWhCRDs7UUFrQkEsTUFBTUksY0FBYyxHQUFHLE1BQU07VUFBQTs7VUFDM0IsdUJBQUtsVyxPQUFMLGtFQUFjdUcsY0FBZCxDQUE2QixRQUE3QixFQUF1QyxLQUFLL0YsdUJBQTVDO1VBQ0EsdUJBQUtSLE9BQUwsa0VBQWN1RyxjQUFkLENBQTZCLFFBQTdCLEVBQXVDMEosUUFBdkM7VUFDQSx1QkFBS2pRLE9BQUwsa0VBQWN1RyxjQUFkLENBQTZCLE9BQTdCLEVBQXNDeVAsT0FBdEM7VUFDQSx1QkFBS2hXLE9BQUwsa0VBQWN1RyxjQUFkLENBQTZCLFFBQTdCLEVBQXVDd1AsUUFBdkM7VUFFQSxLQUFLclAsWUFBTCxDQUFrQixLQUFLZixLQUFMLENBQVd5TSxTQUE3QjtVQUNBLE1BQU0rRCxVQUFVLEdBQUcsS0FBS25XLE9BQXhCO1VBQ0EsS0FBS0EsT0FBTCxHQUFlYSxTQUFmOztVQUNBLElBQUksS0FBSy9CLE1BQUwsQ0FBWWlDLE9BQVosQ0FBb0J1RCxVQUFwQixHQUFpQyxLQUFqQyxJQUEwQzZSLFVBQVUsQ0FBQ3JOLEtBQXJELElBQThELEtBQUsxSixVQUF2RSxFQUFtRjtZQUNqRixLQUFLSCxhQUFMLEdBQXFCLEtBQXJCO1VBQ0Q7O1VBQ0RrWCxVQUFVLENBQUNoTyxRQUFYLENBQW9CZ08sVUFBVSxDQUFDck4sS0FBL0IsRUFBc0NxTixVQUFVLENBQUMxRCxRQUFqRCxFQUEyRDBELFVBQVUsQ0FBQ3pHLElBQXRFO1FBQ0QsQ0FiRDs7UUFlQStFLGlCQUFpQixDQUFDaE8sSUFBbEIsQ0FBdUIsS0FBdkIsRUFBOEJ5UCxjQUE5QjtRQUNBLHdCQUFLbFcsT0FBTCxvRUFBY3lHLElBQWQsQ0FBbUIsUUFBbkIsRUFBNkJ3SixRQUE3QjtNQUNELENBMUVEO0lBNEVELENBL0VrQjtJQWdGbkI1RixJQUFJLEVBQUUsVUFBUytMLFNBQVQsRUFBb0I7TUFDeEIsS0FBS3JPLGlCQUFMO0lBQ0QsQ0FsRmtCO0lBbUZuQjRDLE1BQU0sRUFBRTtNQUNONUIsV0FBVyxFQUFFLFVBQVN6QyxHQUFULEVBQWM7UUFDekIsTUFBTTZQLFVBQVUsR0FBRyxLQUFLblcsT0FBeEI7UUFDQSxLQUFLQSxPQUFMLEdBQWVhLFNBQWY7UUFDQSxLQUFLNkYsWUFBTCxDQUFrQixLQUFLZixLQUFMLENBQVd1QixLQUE3QjtRQUVBaVAsVUFBVSxDQUFDaE8sUUFBWCxDQUFvQjdCLEdBQXBCO01BQ0Q7SUFQSztFQW5GVyxDQXJaTTtFQWtmM0J3UCxjQUFjLEVBQUU7SUFDZDFQLElBQUksRUFBRSxlQURRO0lBRWRtRSxLQUFLLEVBQUUsWUFBVztNQUNoQixDQUFDLFlBQVk7UUFDWCxJQUFJNUMsT0FBSjs7UUFDQSxJQUFJO1VBQ0ZBLE9BQU8sR0FBRyxNQUFNLEtBQUs5SCxTQUFMLENBQWVpVSxXQUFmLEVBQWhCO1FBQ0QsQ0FGRCxDQUVFLE9BQU94TixHQUFQLEVBQWlCO1VBQ2pCLE9BQU8sS0FBS3lDLFdBQUwsQ0FBaUJ6QyxHQUFqQixDQUFQO1FBQ0Q7O1FBRUQsTUFBTWdDLE9BQU8sR0FBRyxJQUFJK04sOEJBQUosQ0FBMEIsSUFBMUIsRUFBZ0MsS0FBS3JXLE9BQXJDLENBQWhCO1FBQ0EsTUFBTXlVLGlCQUFpQixHQUFHLEtBQUtwTSx1QkFBTCxDQUE2QlYsT0FBN0IsRUFBc0NXLE9BQXRDLENBQTFCO1FBRUEsTUFBTSxrQkFBS21NLGlCQUFMLEVBQXdCLEtBQXhCLENBQU4sQ0FYVyxDQVlYO1FBQ0E7O1FBQ0EsSUFBSW5NLE9BQU8sQ0FBQ2dPLGlCQUFaLEVBQStCO1VBQzdCLEtBQUt6TSxnQkFBTDtVQUVBLE1BQU1zTSxVQUFVLEdBQUcsS0FBS25XLE9BQXhCO1VBQ0EsS0FBS0EsT0FBTCxHQUFlYSxTQUFmO1VBQ0EsS0FBSzZGLFlBQUwsQ0FBa0IsS0FBS2YsS0FBTCxDQUFXeU0sU0FBN0I7O1VBRUEsSUFBSStELFVBQVUsQ0FBQ3JOLEtBQVgsSUFBb0JxTixVQUFVLENBQUNyTixLQUFYLFlBQTRCWixvQkFBaEQsSUFBZ0VpTyxVQUFVLENBQUNyTixLQUFYLENBQWlCK0IsSUFBakIsS0FBMEIsVUFBOUYsRUFBMEc7WUFDeEdzTCxVQUFVLENBQUNoTyxRQUFYLENBQW9CZ08sVUFBVSxDQUFDck4sS0FBL0I7VUFDRCxDQUZELE1BRU87WUFDTHFOLFVBQVUsQ0FBQ2hPLFFBQVgsQ0FBb0IsSUFBSUQsb0JBQUosQ0FBaUIsV0FBakIsRUFBOEIsU0FBOUIsQ0FBcEI7VUFDRDtRQUNGO01BRUYsQ0E1QkQsSUE0QkttTSxLQTVCTCxDQTRCWS9OLEdBQUQsSUFBUztRQUNsQm1CLE9BQU8sQ0FBQ0MsUUFBUixDQUFpQixNQUFNO1VBQ3JCLE1BQU1wQixHQUFOO1FBQ0QsQ0FGRDtNQUdELENBaENEO0lBaUNELENBcENhO0lBcUNkcUUsTUFBTSxFQUFFO01BQ041QixXQUFXLEVBQUUsVUFBU3pDLEdBQVQsRUFBYztRQUN6QixNQUFNNlAsVUFBVSxHQUFHLEtBQUtuVyxPQUF4QjtRQUNBLEtBQUtBLE9BQUwsR0FBZWEsU0FBZjtRQUVBLEtBQUs2RixZQUFMLENBQWtCLEtBQUtmLEtBQUwsQ0FBV3VCLEtBQTdCO1FBRUFpUCxVQUFVLENBQUNoTyxRQUFYLENBQW9CN0IsR0FBcEI7TUFDRDtJQVJLO0VBckNNLENBbGZXO0VBa2lCM0JZLEtBQUssRUFBRTtJQUNMZCxJQUFJLEVBQUUsT0FERDtJQUVMbUUsS0FBSyxFQUFFLFlBQVc7TUFDaEIsS0FBSzNDLGlCQUFMLENBQXVCckosWUFBWSxDQUFDQyxNQUFwQztJQUNELENBSkk7SUFLTG1NLE1BQU0sRUFBRTtNQUNOM0ksY0FBYyxFQUFFLFlBQVcsQ0FDekI7TUFDRCxDQUhLO01BSU4yRixPQUFPLEVBQUUsWUFBVyxDQUNsQjtNQUNELENBTks7TUFPTm9CLFdBQVcsRUFBRSxZQUFXLENBQ3RCO01BQ0Q7SUFUSztFQUxIO0FBbGlCb0IsQ0FBN0IifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.connectInParallel = connectInParallel;
exports.connectInSequence = connectInSequence;
exports.lookupAllAddresses = lookupAllAddresses;

var _net = _interopRequireDefault(require("net"));

var punycode = _interopRequireWildcard(require("punycode"));

var _abortError = _interopRequireDefault(require("./errors/abort-error"));

var _esAggregateError = _interopRequireDefault(require("es-aggregate-error"));

function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }

function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

async function connectInParallel(options, lookup, signal) {
  if (signal.aborted) {
    throw new _abortError.default();
  }

  const addresses = await lookupAllAddresses(options.host, lookup, signal);
  return await new Promise((resolve, reject) => {
    const sockets = new Array(addresses.length);
    const errors = [];

    function onError(err) {
      errors.push(err);
      this.removeListener('error', onError);
      this.removeListener('connect', onConnect);
      this.destroy();

      if (errors.length === addresses.length) {
        signal.removeEventListener('abort', onAbort);
        reject(new _esAggregateError.default(errors, 'Could not connect (parallel)'));
      }
    }

    function onConnect() {
      signal.removeEventListener('abort', onAbort);

      for (let j = 0; j < sockets.length; j++) {
        const socket = sockets[j];

        if (this === socket) {
          continue;
        }

        socket.removeListener('error', onError);
        socket.removeListener('connect', onConnect);
        socket.destroy();
      }

      resolve(this);
    }

    const onAbort = () => {
      for (let j = 0; j < sockets.length; j++) {
        const socket = sockets[j];
        socket.removeListener('error', onError);
        socket.removeListener('connect', onConnect);
        socket.destroy();
      }

      reject(new _abortError.default());
    };

    for (let i = 0, len = addresses.length; i < len; i++) {
      const socket = sockets[i] = _net.default.connect({ ...options,
        host: addresses[i].address,
        family: addresses[i].family
      });

      socket.on('error', onError);
      socket.on('connect', onConnect);
    }

    signal.addEventListener('abort', onAbort, {
      once: true
    });
  });
}

async function connectInSequence(options, lookup, signal) {
  if (signal.aborted) {
    throw new _abortError.default();
  }

  const errors = [];
  const addresses = await lookupAllAddresses(options.host, lookup, signal);

  for (const address of addresses) {
    try {
      return await new Promise((resolve, reject) => {
        const socket = _net.default.connect({ ...options,
          host: address.address,
          family: address.family
        });

        const onAbort = () => {
          socket.removeListener('error', onError);
          socket.removeListener('connect', onConnect);
          socket.destroy();
          reject(new _abortError.default());
        };

        const onError = err => {
          signal.removeEventListener('abort', onAbort);
          socket.removeListener('error', onError);
          socket.removeListener('connect', onConnect);
          socket.destroy();
          reject(err);
        };

        const onConnect = () => {
          signal.removeEventListener('abort', onAbort);
          socket.removeListener('error', onError);
          socket.removeListener('connect', onConnect);
          resolve(socket);
        };

        signal.addEventListener('abort', onAbort, {
          once: true
        });
        socket.on('error', onError);
        socket.on('connect', onConnect);
      });
    } catch (err) {
      if (err instanceof Error && err.name === 'AbortError') {
        throw err;
      }

      errors.push(err);
      continue;
    }
  }

  throw new _esAggregateError.default(errors, 'Could not connect (sequence)');
}
/**
 * Look up all addresses for the given hostname.
 */


async function lookupAllAddresses(host, lookup, signal) {
  if (signal.aborted) {
    throw new _abortError.default();
  }

  if (_net.default.isIPv6(host)) {
    return [{
      address: host,
      family: 6
    }];
  } else if (_net.default.isIPv4(host)) {
    return [{
      address: host,
      family: 4
    }];
  } else {
    return await new Promise((resolve, reject) => {
      const onAbort = () => {
        reject(new _abortError.default());
      };

      signal.addEventListener('abort', onAbort);
      lookup(punycode.toASCII(host), {
        all: true
      }, (err, addresses) => {
        signal.removeEventListener('abort', onAbort);
        err ? reject(err) : resolve(addresses);
      });
    });
  }
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb25uZWN0SW5QYXJhbGxlbCIsIm9wdGlvbnMiLCJsb29rdXAiLCJzaWduYWwiLCJhYm9ydGVkIiwiQWJvcnRFcnJvciIsImFkZHJlc3NlcyIsImxvb2t1cEFsbEFkZHJlc3NlcyIsImhvc3QiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInNvY2tldHMiLCJBcnJheSIsImxlbmd0aCIsImVycm9ycyIsIm9uRXJyb3IiLCJlcnIiLCJwdXNoIiwicmVtb3ZlTGlzdGVuZXIiLCJvbkNvbm5lY3QiLCJkZXN0cm95IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIm9uQWJvcnQiLCJBZ2dyZWdhdGVFcnJvciIsImoiLCJzb2NrZXQiLCJpIiwibGVuIiwibmV0IiwiY29ubmVjdCIsImFkZHJlc3MiLCJmYW1pbHkiLCJvbiIsImFkZEV2ZW50TGlzdGVuZXIiLCJvbmNlIiwiY29ubmVjdEluU2VxdWVuY2UiLCJFcnJvciIsIm5hbWUiLCJpc0lQdjYiLCJpc0lQdjQiLCJwdW55Y29kZSIsInRvQVNDSUkiLCJhbGwiXSwic291cmNlcyI6WyIuLi9zcmMvY29ubmVjdG9yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBuZXQgZnJvbSAnbmV0JztcbmltcG9ydCBkbnMsIHsgTG9va3VwQWRkcmVzcyB9IGZyb20gJ2Rucyc7XG5cbmltcG9ydCAqIGFzIHB1bnljb2RlIGZyb20gJ3B1bnljb2RlJztcbmltcG9ydCB7IEFib3J0U2lnbmFsIH0gZnJvbSAnbm9kZS1hYm9ydC1jb250cm9sbGVyJztcbmltcG9ydCBBYm9ydEVycm9yIGZyb20gJy4vZXJyb3JzL2Fib3J0LWVycm9yJztcblxuaW1wb3J0IEFnZ3JlZ2F0ZUVycm9yIGZyb20gJ2VzLWFnZ3JlZ2F0ZS1lcnJvcic7XG5cbnR5cGUgTG9va3VwRnVuY3Rpb24gPSAoaG9zdG5hbWU6IHN0cmluZywgb3B0aW9uczogZG5zLkxvb2t1cEFsbE9wdGlvbnMsIGNhbGxiYWNrOiAoZXJyOiBOb2RlSlMuRXJybm9FeGNlcHRpb24gfCBudWxsLCBhZGRyZXNzZXM6IGRucy5Mb29rdXBBZGRyZXNzW10pID0+IHZvaWQpID0+IHZvaWQ7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25uZWN0SW5QYXJhbGxlbChvcHRpb25zOiB7IGhvc3Q6IHN0cmluZywgcG9ydDogbnVtYmVyLCBsb2NhbEFkZHJlc3M/OiBzdHJpbmcgfCB1bmRlZmluZWQgfSwgbG9va3VwOiBMb29rdXBGdW5jdGlvbiwgc2lnbmFsOiBBYm9ydFNpZ25hbCkge1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICB0aHJvdyBuZXcgQWJvcnRFcnJvcigpO1xuICB9XG5cbiAgY29uc3QgYWRkcmVzc2VzID0gYXdhaXQgbG9va3VwQWxsQWRkcmVzc2VzKG9wdGlvbnMuaG9zdCwgbG9va3VwLCBzaWduYWwpO1xuXG4gIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxuZXQuU29ja2V0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc29ja2V0cyA9IG5ldyBBcnJheShhZGRyZXNzZXMubGVuZ3RoKTtcblxuICAgIGNvbnN0IGVycm9yczogRXJyb3JbXSA9IFtdO1xuXG4gICAgZnVuY3Rpb24gb25FcnJvcih0aGlzOiBuZXQuU29ja2V0LCBlcnI6IEVycm9yKSB7XG4gICAgICBlcnJvcnMucHVzaChlcnIpO1xuXG4gICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcignY29ubmVjdCcsIG9uQ29ubmVjdCk7XG5cbiAgICAgIHRoaXMuZGVzdHJveSgpO1xuXG4gICAgICBpZiAoZXJyb3JzLmxlbmd0aCA9PT0gYWRkcmVzc2VzLmxlbmd0aCkge1xuICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0KTtcblxuICAgICAgICByZWplY3QobmV3IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgJ0NvdWxkIG5vdCBjb25uZWN0IChwYXJhbGxlbCknKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25Db25uZWN0KHRoaXM6IG5ldC5Tb2NrZXQpIHtcbiAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQpO1xuXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNvY2tldHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY29uc3Qgc29ja2V0ID0gc29ja2V0c1tqXTtcblxuICAgICAgICBpZiAodGhpcyA9PT0gc29ja2V0KSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignY29ubmVjdCcsIG9uQ29ubmVjdCk7XG4gICAgICAgIHNvY2tldC5kZXN0cm95KCk7XG4gICAgICB9XG5cbiAgICAgIHJlc29sdmUodGhpcyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb25BYm9ydCA9ICgpID0+IHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc29ja2V0cy5sZW5ndGg7IGorKykge1xuICAgICAgICBjb25zdCBzb2NrZXQgPSBzb2NrZXRzW2pdO1xuXG4gICAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdjb25uZWN0Jywgb25Db25uZWN0KTtcblxuICAgICAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgICAgfVxuXG4gICAgICByZWplY3QobmV3IEFib3J0RXJyb3IoKSk7XG4gICAgfTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBhZGRyZXNzZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IHNvY2tldCA9IHNvY2tldHNbaV0gPSBuZXQuY29ubmVjdCh7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGhvc3Q6IGFkZHJlc3Nlc1tpXS5hZGRyZXNzLFxuICAgICAgICBmYW1pbHk6IGFkZHJlc3Nlc1tpXS5mYW1pbHlcbiAgICAgIH0pO1xuXG4gICAgICBzb2NrZXQub24oJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICBzb2NrZXQub24oJ2Nvbm5lY3QnLCBvbkNvbm5lY3QpO1xuICAgIH1cblxuICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25uZWN0SW5TZXF1ZW5jZShvcHRpb25zOiB7IGhvc3Q6IHN0cmluZywgcG9ydDogbnVtYmVyLCBsb2NhbEFkZHJlc3M/OiBzdHJpbmcgfCB1bmRlZmluZWQgfSwgbG9va3VwOiBMb29rdXBGdW5jdGlvbiwgc2lnbmFsOiBBYm9ydFNpZ25hbCkge1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICB0aHJvdyBuZXcgQWJvcnRFcnJvcigpO1xuICB9XG5cbiAgY29uc3QgZXJyb3JzOiBhbnlbXSA9IFtdO1xuICBjb25zdCBhZGRyZXNzZXMgPSBhd2FpdCBsb29rdXBBbGxBZGRyZXNzZXMob3B0aW9ucy5ob3N0LCBsb29rdXAsIHNpZ25hbCk7XG5cbiAgZm9yIChjb25zdCBhZGRyZXNzIG9mIGFkZHJlc3Nlcykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2U8bmV0LlNvY2tldD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBzb2NrZXQgPSBuZXQuY29ubmVjdCh7XG4gICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICBob3N0OiBhZGRyZXNzLmFkZHJlc3MsXG4gICAgICAgICAgZmFtaWx5OiBhZGRyZXNzLmZhbWlseVxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBvbkFib3J0ID0gKCkgPT4ge1xuICAgICAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Nvbm5lY3QnLCBvbkNvbm5lY3QpO1xuXG4gICAgICAgICAgc29ja2V0LmRlc3Ryb3koKTtcblxuICAgICAgICAgIHJlamVjdChuZXcgQWJvcnRFcnJvcigpKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBvbkVycm9yID0gKGVycjogRXJyb3IpID0+IHtcbiAgICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0KTtcblxuICAgICAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Nvbm5lY3QnLCBvbkNvbm5lY3QpO1xuXG4gICAgICAgICAgc29ja2V0LmRlc3Ryb3koKTtcblxuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG9uQ29ubmVjdCA9ICgpID0+IHtcbiAgICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0KTtcblxuICAgICAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Nvbm5lY3QnLCBvbkNvbm5lY3QpO1xuXG4gICAgICAgICAgcmVzb2x2ZShzb2NrZXQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcblxuICAgICAgICBzb2NrZXQub24oJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgIHNvY2tldC5vbignY29ubmVjdCcsIG9uQ29ubmVjdCk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cblxuICAgICAgZXJyb3JzLnB1c2goZXJyKTtcblxuICAgICAgY29udGludWU7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgJ0NvdWxkIG5vdCBjb25uZWN0IChzZXF1ZW5jZSknKTtcbn1cblxuLyoqXG4gKiBMb29rIHVwIGFsbCBhZGRyZXNzZXMgZm9yIHRoZSBnaXZlbiBob3N0bmFtZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvb2t1cEFsbEFkZHJlc3Nlcyhob3N0OiBzdHJpbmcsIGxvb2t1cDogTG9va3VwRnVuY3Rpb24sIHNpZ25hbDogQWJvcnRTaWduYWwpOiBQcm9taXNlPGRucy5Mb29rdXBBZGRyZXNzW10+IHtcbiAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoKTtcbiAgfVxuXG4gIGlmIChuZXQuaXNJUHY2KGhvc3QpKSB7XG4gICAgcmV0dXJuIFt7IGFkZHJlc3M6IGhvc3QsIGZhbWlseTogNiB9XTtcbiAgfSBlbHNlIGlmIChuZXQuaXNJUHY0KGhvc3QpKSB7XG4gICAgcmV0dXJuIFt7IGFkZHJlc3M6IGhvc3QsIGZhbWlseTogNCB9XTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2U8TG9va3VwQWRkcmVzc1tdPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBvbkFib3J0ID0gKCkgPT4ge1xuICAgICAgICByZWplY3QobmV3IEFib3J0RXJyb3IoKSk7XG4gICAgICB9O1xuXG4gICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0KTtcblxuICAgICAgbG9va3VwKHB1bnljb2RlLnRvQVNDSUkoaG9zdCksIHsgYWxsOiB0cnVlIH0sIChlcnIsIGFkZHJlc3NlcykgPT4ge1xuICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0KTtcblxuICAgICAgICBlcnIgPyByZWplY3QoZXJyKSA6IHJlc29sdmUoYWRkcmVzc2VzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBOztBQUdBOztBQUVBOztBQUVBOzs7Ozs7OztBQUlPLGVBQWVBLGlCQUFmLENBQWlDQyxPQUFqQyxFQUE2R0MsTUFBN0csRUFBcUlDLE1BQXJJLEVBQTBKO0VBQy9KLElBQUlBLE1BQU0sQ0FBQ0MsT0FBWCxFQUFvQjtJQUNsQixNQUFNLElBQUlDLG1CQUFKLEVBQU47RUFDRDs7RUFFRCxNQUFNQyxTQUFTLEdBQUcsTUFBTUMsa0JBQWtCLENBQUNOLE9BQU8sQ0FBQ08sSUFBVCxFQUFlTixNQUFmLEVBQXVCQyxNQUF2QixDQUExQztFQUVBLE9BQU8sTUFBTSxJQUFJTSxPQUFKLENBQXdCLENBQUNDLE9BQUQsRUFBVUMsTUFBVixLQUFxQjtJQUN4RCxNQUFNQyxPQUFPLEdBQUcsSUFBSUMsS0FBSixDQUFVUCxTQUFTLENBQUNRLE1BQXBCLENBQWhCO0lBRUEsTUFBTUMsTUFBZSxHQUFHLEVBQXhCOztJQUVBLFNBQVNDLE9BQVQsQ0FBbUNDLEdBQW5DLEVBQStDO01BQzdDRixNQUFNLENBQUNHLElBQVAsQ0FBWUQsR0FBWjtNQUVBLEtBQUtFLGNBQUwsQ0FBb0IsT0FBcEIsRUFBNkJILE9BQTdCO01BQ0EsS0FBS0csY0FBTCxDQUFvQixTQUFwQixFQUErQkMsU0FBL0I7TUFFQSxLQUFLQyxPQUFMOztNQUVBLElBQUlOLE1BQU0sQ0FBQ0QsTUFBUCxLQUFrQlIsU0FBUyxDQUFDUSxNQUFoQyxFQUF3QztRQUN0Q1gsTUFBTSxDQUFDbUIsbUJBQVAsQ0FBMkIsT0FBM0IsRUFBb0NDLE9BQXBDO1FBRUFaLE1BQU0sQ0FBQyxJQUFJYSx5QkFBSixDQUFtQlQsTUFBbkIsRUFBMkIsOEJBQTNCLENBQUQsQ0FBTjtNQUNEO0lBQ0Y7O0lBRUQsU0FBU0ssU0FBVCxHQUFxQztNQUNuQ2pCLE1BQU0sQ0FBQ21CLG1CQUFQLENBQTJCLE9BQTNCLEVBQW9DQyxPQUFwQzs7TUFFQSxLQUFLLElBQUlFLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdiLE9BQU8sQ0FBQ0UsTUFBNUIsRUFBb0NXLENBQUMsRUFBckMsRUFBeUM7UUFDdkMsTUFBTUMsTUFBTSxHQUFHZCxPQUFPLENBQUNhLENBQUQsQ0FBdEI7O1FBRUEsSUFBSSxTQUFTQyxNQUFiLEVBQXFCO1VBQ25CO1FBQ0Q7O1FBRURBLE1BQU0sQ0FBQ1AsY0FBUCxDQUFzQixPQUF0QixFQUErQkgsT0FBL0I7UUFDQVUsTUFBTSxDQUFDUCxjQUFQLENBQXNCLFNBQXRCLEVBQWlDQyxTQUFqQztRQUNBTSxNQUFNLENBQUNMLE9BQVA7TUFDRDs7TUFFRFgsT0FBTyxDQUFDLElBQUQsQ0FBUDtJQUNEOztJQUVELE1BQU1hLE9BQU8sR0FBRyxNQUFNO01BQ3BCLEtBQUssSUFBSUUsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR2IsT0FBTyxDQUFDRSxNQUE1QixFQUFvQ1csQ0FBQyxFQUFyQyxFQUF5QztRQUN2QyxNQUFNQyxNQUFNLEdBQUdkLE9BQU8sQ0FBQ2EsQ0FBRCxDQUF0QjtRQUVBQyxNQUFNLENBQUNQLGNBQVAsQ0FBc0IsT0FBdEIsRUFBK0JILE9BQS9CO1FBQ0FVLE1BQU0sQ0FBQ1AsY0FBUCxDQUFzQixTQUF0QixFQUFpQ0MsU0FBakM7UUFFQU0sTUFBTSxDQUFDTCxPQUFQO01BQ0Q7O01BRURWLE1BQU0sQ0FBQyxJQUFJTixtQkFBSixFQUFELENBQU47SUFDRCxDQVhEOztJQWFBLEtBQUssSUFBSXNCLENBQUMsR0FBRyxDQUFSLEVBQVdDLEdBQUcsR0FBR3RCLFNBQVMsQ0FBQ1EsTUFBaEMsRUFBd0NhLENBQUMsR0FBR0MsR0FBNUMsRUFBaURELENBQUMsRUFBbEQsRUFBc0Q7TUFDcEQsTUFBTUQsTUFBTSxHQUFHZCxPQUFPLENBQUNlLENBQUQsQ0FBUCxHQUFhRSxhQUFJQyxPQUFKLENBQVksRUFDdEMsR0FBRzdCLE9BRG1DO1FBRXRDTyxJQUFJLEVBQUVGLFNBQVMsQ0FBQ3FCLENBQUQsQ0FBVCxDQUFhSSxPQUZtQjtRQUd0Q0MsTUFBTSxFQUFFMUIsU0FBUyxDQUFDcUIsQ0FBRCxDQUFULENBQWFLO01BSGlCLENBQVosQ0FBNUI7O01BTUFOLE1BQU0sQ0FBQ08sRUFBUCxDQUFVLE9BQVYsRUFBbUJqQixPQUFuQjtNQUNBVSxNQUFNLENBQUNPLEVBQVAsQ0FBVSxTQUFWLEVBQXFCYixTQUFyQjtJQUNEOztJQUVEakIsTUFBTSxDQUFDK0IsZ0JBQVAsQ0FBd0IsT0FBeEIsRUFBaUNYLE9BQWpDLEVBQTBDO01BQUVZLElBQUksRUFBRTtJQUFSLENBQTFDO0VBQ0QsQ0EvRFksQ0FBYjtBQWdFRDs7QUFFTSxlQUFlQyxpQkFBZixDQUFpQ25DLE9BQWpDLEVBQTZHQyxNQUE3RyxFQUFxSUMsTUFBckksRUFBMEo7RUFDL0osSUFBSUEsTUFBTSxDQUFDQyxPQUFYLEVBQW9CO0lBQ2xCLE1BQU0sSUFBSUMsbUJBQUosRUFBTjtFQUNEOztFQUVELE1BQU1VLE1BQWEsR0FBRyxFQUF0QjtFQUNBLE1BQU1ULFNBQVMsR0FBRyxNQUFNQyxrQkFBa0IsQ0FBQ04sT0FBTyxDQUFDTyxJQUFULEVBQWVOLE1BQWYsRUFBdUJDLE1BQXZCLENBQTFDOztFQUVBLEtBQUssTUFBTTRCLE9BQVgsSUFBc0J6QixTQUF0QixFQUFpQztJQUMvQixJQUFJO01BQ0YsT0FBTyxNQUFNLElBQUlHLE9BQUosQ0FBd0IsQ0FBQ0MsT0FBRCxFQUFVQyxNQUFWLEtBQXFCO1FBQ3hELE1BQU1lLE1BQU0sR0FBR0csYUFBSUMsT0FBSixDQUFZLEVBQ3pCLEdBQUc3QixPQURzQjtVQUV6Qk8sSUFBSSxFQUFFdUIsT0FBTyxDQUFDQSxPQUZXO1VBR3pCQyxNQUFNLEVBQUVELE9BQU8sQ0FBQ0M7UUFIUyxDQUFaLENBQWY7O1FBTUEsTUFBTVQsT0FBTyxHQUFHLE1BQU07VUFDcEJHLE1BQU0sQ0FBQ1AsY0FBUCxDQUFzQixPQUF0QixFQUErQkgsT0FBL0I7VUFDQVUsTUFBTSxDQUFDUCxjQUFQLENBQXNCLFNBQXRCLEVBQWlDQyxTQUFqQztVQUVBTSxNQUFNLENBQUNMLE9BQVA7VUFFQVYsTUFBTSxDQUFDLElBQUlOLG1CQUFKLEVBQUQsQ0FBTjtRQUNELENBUEQ7O1FBU0EsTUFBTVcsT0FBTyxHQUFJQyxHQUFELElBQWdCO1VBQzlCZCxNQUFNLENBQUNtQixtQkFBUCxDQUEyQixPQUEzQixFQUFvQ0MsT0FBcEM7VUFFQUcsTUFBTSxDQUFDUCxjQUFQLENBQXNCLE9BQXRCLEVBQStCSCxPQUEvQjtVQUNBVSxNQUFNLENBQUNQLGNBQVAsQ0FBc0IsU0FBdEIsRUFBaUNDLFNBQWpDO1VBRUFNLE1BQU0sQ0FBQ0wsT0FBUDtVQUVBVixNQUFNLENBQUNNLEdBQUQsQ0FBTjtRQUNELENBVEQ7O1FBV0EsTUFBTUcsU0FBUyxHQUFHLE1BQU07VUFDdEJqQixNQUFNLENBQUNtQixtQkFBUCxDQUEyQixPQUEzQixFQUFvQ0MsT0FBcEM7VUFFQUcsTUFBTSxDQUFDUCxjQUFQLENBQXNCLE9BQXRCLEVBQStCSCxPQUEvQjtVQUNBVSxNQUFNLENBQUNQLGNBQVAsQ0FBc0IsU0FBdEIsRUFBaUNDLFNBQWpDO1VBRUFWLE9BQU8sQ0FBQ2dCLE1BQUQsQ0FBUDtRQUNELENBUEQ7O1FBU0F2QixNQUFNLENBQUMrQixnQkFBUCxDQUF3QixPQUF4QixFQUFpQ1gsT0FBakMsRUFBMEM7VUFBRVksSUFBSSxFQUFFO1FBQVIsQ0FBMUM7UUFFQVQsTUFBTSxDQUFDTyxFQUFQLENBQVUsT0FBVixFQUFtQmpCLE9BQW5CO1FBQ0FVLE1BQU0sQ0FBQ08sRUFBUCxDQUFVLFNBQVYsRUFBcUJiLFNBQXJCO01BQ0QsQ0F4Q1ksQ0FBYjtJQXlDRCxDQTFDRCxDQTBDRSxPQUFPSCxHQUFQLEVBQVk7TUFDWixJQUFJQSxHQUFHLFlBQVlvQixLQUFmLElBQXdCcEIsR0FBRyxDQUFDcUIsSUFBSixLQUFhLFlBQXpDLEVBQXVEO1FBQ3JELE1BQU1yQixHQUFOO01BQ0Q7O01BRURGLE1BQU0sQ0FBQ0csSUFBUCxDQUFZRCxHQUFaO01BRUE7SUFDRDtFQUNGOztFQUVELE1BQU0sSUFBSU8seUJBQUosQ0FBbUJULE1BQW5CLEVBQTJCLDhCQUEzQixDQUFOO0FBQ0Q7QUFFRDtBQUNBO0FBQ0E7OztBQUNPLGVBQWVSLGtCQUFmLENBQWtDQyxJQUFsQyxFQUFnRE4sTUFBaEQsRUFBd0VDLE1BQXhFLEVBQTJIO0VBQ2hJLElBQUlBLE1BQU0sQ0FBQ0MsT0FBWCxFQUFvQjtJQUNsQixNQUFNLElBQUlDLG1CQUFKLEVBQU47RUFDRDs7RUFFRCxJQUFJd0IsYUFBSVUsTUFBSixDQUFXL0IsSUFBWCxDQUFKLEVBQXNCO0lBQ3BCLE9BQU8sQ0FBQztNQUFFdUIsT0FBTyxFQUFFdkIsSUFBWDtNQUFpQndCLE1BQU0sRUFBRTtJQUF6QixDQUFELENBQVA7RUFDRCxDQUZELE1BRU8sSUFBSUgsYUFBSVcsTUFBSixDQUFXaEMsSUFBWCxDQUFKLEVBQXNCO0lBQzNCLE9BQU8sQ0FBQztNQUFFdUIsT0FBTyxFQUFFdkIsSUFBWDtNQUFpQndCLE1BQU0sRUFBRTtJQUF6QixDQUFELENBQVA7RUFDRCxDQUZNLE1BRUE7SUFDTCxPQUFPLE1BQU0sSUFBSXZCLE9BQUosQ0FBNkIsQ0FBQ0MsT0FBRCxFQUFVQyxNQUFWLEtBQXFCO01BQzdELE1BQU1ZLE9BQU8sR0FBRyxNQUFNO1FBQ3BCWixNQUFNLENBQUMsSUFBSU4sbUJBQUosRUFBRCxDQUFOO01BQ0QsQ0FGRDs7TUFJQUYsTUFBTSxDQUFDK0IsZ0JBQVAsQ0FBd0IsT0FBeEIsRUFBaUNYLE9BQWpDO01BRUFyQixNQUFNLENBQUN1QyxRQUFRLENBQUNDLE9BQVQsQ0FBaUJsQyxJQUFqQixDQUFELEVBQXlCO1FBQUVtQyxHQUFHLEVBQUU7TUFBUCxDQUF6QixFQUF3QyxDQUFDMUIsR0FBRCxFQUFNWCxTQUFOLEtBQW9CO1FBQ2hFSCxNQUFNLENBQUNtQixtQkFBUCxDQUEyQixPQUEzQixFQUFvQ0MsT0FBcEM7UUFFQU4sR0FBRyxHQUFHTixNQUFNLENBQUNNLEdBQUQsQ0FBVCxHQUFpQlAsT0FBTyxDQUFDSixTQUFELENBQTNCO01BQ0QsQ0FKSyxDQUFOO0lBS0QsQ0FaWSxDQUFiO0VBYUQ7QUFDRiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.typeByName = exports.TYPES = exports.TYPE = void 0;

var _null = _interopRequireDefault(require("./data-types/null"));

var _tinyint = _interopRequireDefault(require("./data-types/tinyint"));

var _bit = _interopRequireDefault(require("./data-types/bit"));

var _smallint = _interopRequireDefault(require("./data-types/smallint"));

var _int = _interopRequireDefault(require("./data-types/int"));

var _smalldatetime = _interopRequireDefault(require("./data-types/smalldatetime"));

var _real = _interopRequireDefault(require("./data-types/real"));

var _money = _interopRequireDefault(require("./data-types/money"));

var _datetime = _interopRequireDefault(require("./data-types/datetime"));

var _float = _interopRequireDefault(require("./data-types/float"));

var _decimal = _interopRequireDefault(require("./data-types/decimal"));

var _numeric = _interopRequireDefault(require("./data-types/numeric"));

var _smallmoney = _interopRequireDefault(require("./data-types/smallmoney"));

var _bigint = _interopRequireDefault(require("./data-types/bigint"));

var _image = _interopRequireDefault(require("./data-types/image"));

var _text = _interopRequireDefault(require("./data-types/text"));

var _uniqueidentifier = _interopRequireDefault(require("./data-types/uniqueidentifier"));

var _intn = _interopRequireDefault(require("./data-types/intn"));

var _ntext = _interopRequireDefault(require("./data-types/ntext"));

var _bitn = _interopRequireDefault(require("./data-types/bitn"));

var _decimaln = _interopRequireDefault(require("./data-types/decimaln"));

var _numericn = _interopRequireDefault(require("./data-types/numericn"));

var _floatn = _interopRequireDefault(require("./data-types/floatn"));

var _moneyn = _interopRequireDefault(require("./data-types/moneyn"));

var _datetimen = _interopRequireDefault(require("./data-types/datetimen"));

var _varbinary = _interopRequireDefault(require("./data-types/varbinary"));

var _varchar = _interopRequireDefault(require("./data-types/varchar"));

var _binary = _interopRequireDefault(require("./data-types/binary"));

var _char = _interopRequireDefault(require("./data-types/char"));

var _nvarchar = _interopRequireDefault(require("./data-types/nvarchar"));

var _nchar = _interopRequireDefault(require("./data-types/nchar"));

var _xml = _interopRequireDefault(require("./data-types/xml"));

var _time = _interopRequireDefault(require("./data-types/time"));

var _date = _interopRequireDefault(require("./data-types/date"));

var _datetime2 = _interopRequireDefault(require("./data-types/datetime2"));

var _datetimeoffset = _interopRequireDefault(require("./data-types/datetimeoffset"));

var _udt = _interopRequireDefault(require("./data-types/udt"));

var _tvp = _interopRequireDefault(require("./data-types/tvp"));

var _sqlVariant = _interopRequireDefault(require("./data-types/sql-variant"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const TYPE = {
  [_null.default.id]: _null.default,
  [_tinyint.default.id]: _tinyint.default,
  [_bit.default.id]: _bit.default,
  [_smallint.default.id]: _smallint.default,
  [_int.default.id]: _int.default,
  [_smalldatetime.default.id]: _smalldatetime.default,
  [_real.default.id]: _real.default,
  [_money.default.id]: _money.default,
  [_datetime.default.id]: _datetime.default,
  [_float.default.id]: _float.default,
  [_decimal.default.id]: _decimal.default,
  [_numeric.default.id]: _numeric.default,
  [_smallmoney.default.id]: _smallmoney.default,
  [_bigint.default.id]: _bigint.default,
  [_image.default.id]: _image.default,
  [_text.default.id]: _text.default,
  [_uniqueidentifier.default.id]: _uniqueidentifier.default,
  [_intn.default.id]: _intn.default,
  [_ntext.default.id]: _ntext.default,
  [_bitn.default.id]: _bitn.default,
  [_decimaln.default.id]: _decimaln.default,
  [_numericn.default.id]: _numericn.default,
  [_floatn.default.id]: _floatn.default,
  [_moneyn.default.id]: _moneyn.default,
  [_datetimen.default.id]: _datetimen.default,
  [_varbinary.default.id]: _varbinary.default,
  [_varchar.default.id]: _varchar.default,
  [_binary.default.id]: _binary.default,
  [_char.default.id]: _char.default,
  [_nvarchar.default.id]: _nvarchar.default,
  [_nchar.default.id]: _nchar.default,
  [_xml.default.id]: _xml.default,
  [_time.default.id]: _time.default,
  [_date.default.id]: _date.default,
  [_datetime2.default.id]: _datetime2.default,
  [_datetimeoffset.default.id]: _datetimeoffset.default,
  [_udt.default.id]: _udt.default,
  [_tvp.default.id]: _tvp.default,
  [_sqlVariant.default.id]: _sqlVariant.default
};
/**
 * <table>
 * <thead>
 *   <tr>
 *     <th>Type</th>
 *     <th>Constant</th>
 *     <th>JavaScript</th>
 *     <th>Result set</th>
 *     <th>Parameter</th>
 *   </tr>
 * </thead>
 *
 * <tbody>
 *   <tr class="group-heading">
 *     <th colspan="5">Exact numerics</th>
 *   </tr>
 *   <tr>
 *     <td><code>bit</code></td>
 *     <td><code>[[TYPES.Bit]]</code></td>
 *     <td><code>boolean</code></td>
 *     <td>✓</td>
 *     <td>✓</td>
 *   </tr>
 *   <tr>
 *     <td><code>tinyint</code></td>
 *     <td><code>[[TYPES.TinyInt]]</code></td>
 *     <td><code>number</code></td>
 *     <td>✓</td>
 *     <td>✓</td>
 *   </tr>
 *   <tr>
 *     <td><code>smallint</code></td>
 *     <td><code>[[TYPES.SmallInt]]</code></td>
 *     <td><code>number</code></td>
 *     <td>✓</td>
 *     <td>✓</td>
 *   </tr>
 *   <tr>
 *     <td><code>int</code></td>
 *     <td><code>[[TYPES.Int]]</code></td>
 *     <td><code>number</code></td>
 *     <td>✓</td>
 *     <td>✓</td>
 *   </tr>
 *   <tr>
 *     <td><code>bigint</code><sup>1</sup></td>
 *     <td><code>[[TYPES.BigInt]]</code></td>
 *     <td><code>string</code></td>
 *     <td>✓</td>
 *     <td>✓</td>
 *   </tr>
 *   <tr>
 *     <td><code>numeric</code><sup>2</sup></td>
 *     <td><code>[[TYPES.Numeric]]</code></td>
 *     <td><code>number</code></td>
 *     <td>✓</td>
 *     <td>✓</td>
 *   </tr>
 *   <tr>
 *     <td><code>decimal</code><sup>2</sup></td>
 *     <td><code>[[TYPES.Decimal]]</code></td>
 *     <td><code>number</code></td>
 *     <td>✓</td>
 *     <td>✓</td>
 *   </tr>
 *   <tr>
 *     <td><code>smallmoney</code></td>
 *     <td><code>[[TYPES.SmallMoney]]</code></td>
 *     <td><code>number</code></td>
 *     <td>✓</td>
 *     <td>✓</td>
 *   </tr>
 *   <tr>
 *     <td><code>money</code></td>
 *     <td><code>[[TYPES.Money]]</code></td>
 *     <td><code>number</code></td>
 *     <td>✓</td>
 *     <td>✓</td>
 *   </tr>
 * </tbody>
 *
 * <tbody>
 *   <tr class="group-heading">
 *     <th colspan="5">Approximate numerics</th>
 *   </tr>
 *   <tr>
 *     <td><code>float</code></td>
 *     <td><code>[[TYPES.Float]]</code></td>
 *     <td><code>number</code></td>
 *     <td>✓</td>
 *     <td>✓</td>
 *   </tr>
 *   <tr>
 *     <td><code>real</code></td>
 *     <td><code>[[TYPES.Real]]</code></td>
 *     <td><code>number</code></td>
 *     <td>✓</td>
 *     <td>✓</td>
 *   </tr>
 * </tbody>
 *
 * <tbody>
 *   <tr class="group-heading">
 *     <th colspan="4">Date and Time</th>
 *   </tr>
 *   <tr>
 *     <td><code>smalldatetime</code></td>
 *     <td><code>[[TYPES.SmallDateTime]]</code></td>
 *     <td><code>Date</code></td>
 *     <td>✓</td>
 *     <td>✓</td>
 *   </tr>
 *   <tr>
 *     <td><code>datetime</code></td>
 *     <td><code>[[TYPES.DateTime]]</code></td>
 *     <td><code>Date</code></td>
 *     <td>✓</td>
 *     <td>✓</td>
 *   </tr>
 *   <tr>
 *     <td><code>datetime2</code></td>
 *     <td><code>[[TYPES.DateTime2]]</code></td>
 *     <td><code>Date</code></td>
 *     <td>✓</td>
 *     <td>✓</td>
 *   </tr>
 *   <tr>
 *     <td><code>datetimeoffset</code></td>
 *     <td><code>[[TYPES.DateTimeOffset]]</code></td>
 *     <td><code>Date</code></td>
 *     <td>✓</td>
 *     <td>✓</td>
 *   </tr>
 *   <tr>
 *     <td><code>time</code></td>
 *     <td><code>[[TYPES.Time]]</code></td>
 *     <td><code>Date</code></td>
 *     <td>✓</td>
 *     <td>✓</td>
 *   </tr>
 *   <tr>
 *     <td><code>date</code></td>
 *     <td><code>[[TYPES.Date]]</code></td>
 *     <td><code>Date</code></td>
 *     <td>✓</td>
 *     <td>✓</td>
 *   </tr>
 * </tbody>
 *
 * <tbody>
 *   <tr class="group-heading">
 *     <th colspan="4">Character Strings</th>
 *   </tr>
 *   <tr>
 *     <td><code>char</code></td>
 *     <td><code>[[TYPES.Char]]</code></td>
 *     <td><code>string</code></td>
 *     <td>✓</td>
 *     <td>✓</td>
 *   </tr>
 *   <tr>
 *     <td><code>varchar</code><sup>3</sup></td>
 *     <td><code>[[TYPES.VarChar]]</code></td>
 *     <td><code>string</code></td>
 *     <td>✓</td>
 *     <td>✓</td>
 *   </tr>
 *   <tr>
 *     <td><code>text</code></td>
 *     <td><code>[[TYPES.Text]]</code></td>
 *     <td><code>string</code></td>
 *     <td>✓</td>
 *     <td>✓</td>
 *   </tr>
 * </tbody>
 *
 * <tbody>
 *   <tr class="group-heading">
 *     <th colspan="4">Unicode Strings</th>
 *   </tr>
 *   <tr>
 *     <td><code>nchar</code></td>
 *     <td><code>[[TYPES.NChar]]</code></td>
 *     <td><code>string</code></td>
 *     <td>✓</td>
 *     <td>✓</td>
 *   </tr>
 *   <tr>
 *     <td><code>nvarchar</code><sup>3</sup></td>
 *     <td><code>[[TYPES.NVarChar]]</code></td>
 *     <td><code>string</code></td>
 *     <td>✓</td>
 *     <td>✓</td>
 *   </tr>
 *   <tr>
 *     <td><code>ntext</code></td>
 *     <td><code>[[TYPES.NText]]</code></td>
 *     <td><code>string</code></td>
 *     <td>✓</td>
 *     <td>-</td>
 *   </tr>
 * </tbody>
 *
 * <tbody>
 *   <tr class="group-heading">
 *     <th colspan="5">Binary Strings<sup>4</sup></th>
 *   </tr>
 *   <tr>
 *     <td><code>binary</code></td>
 *     <td><code>[[TYPES.Binary]]</code></td>
 *     <td><code>Buffer</code></td>
 *     <td>✓</td>
 *     <td>✓</td>
 *   </tr>
 *   <tr>
 *     <td><code>varbinary</code></td>
 *     <td><code>[[TYPES.VarBinary]]</code></td>
 *     <td><code>Buffer</code></td>
 *     <td>✓</td>
 *     <td>✓</td>
 *   </tr>
 *   <tr>
 *     <td><code>image</code></td>
 *     <td><code>[[TYPES.Image]]</code></td>
 *     <td><code>Buffer</code></td>
 *     <td>✓</td>
 *     <td>✓</td>
 *   </tr>
 * </tbody>
 *
 * <tbody>
 *   <tr class="group-heading">
 *     <th colspan="5">Other Data Types</th>
 *   </tr>
 *   <tr>
 *     <td><code>TVP</code></td>
 *     <td><code>[[TYPES.TVP]]</code></td>
 *     <td><code>Object</code></td>
 *     <td>-</td>
 *     <td>✓</td>
 *   </tr>
 *   <tr>
 *     <td><code>UDT</code></td>
 *     <td><code>[[TYPES.UDT]]</code></td>
 *     <td><code>Buffer</code></td>
 *     <td>✓</td>
 *     <td>-</td>
 *   </tr>
 *   <tr>
 *     <td><code>uniqueidentifier</code><sup>4</sup></td>
 *     <td><code>[[TYPES.UniqueIdentifier]]</code></td>
 *     <td><code>string</code></td>
 *     <td>✓</td>
 *     <td>✓</td>
 *   </tr>
 *   <tr>
 *     <td><code>variant</code></td>
 *     <td><code>[[TYPES.Variant]]</code></td>
 *     <td><code>any</code></td>
 *     <td>✓</td>
 *     <td>-</td>
 *   </tr>
 *   <tr>
 *     <td><code>xml</code></td>
 *     <td><code>[[TYPES.Xml]]</code></td>
 *     <td><code>string</code></td>
 *     <td>✓</td>
 *     <td>-</td>
 *   </tr>
 * </tbody>
 * </table>
 *
 * <ol>
 *   <li>
 *     <h4>BigInt</h4>
 *     <p>
 *       Values are returned as a string. This is because values can exceed 53 bits of significant data, which is greater than a
 *       Javascript <code>number</code> type can represent as an integer.
 *     </p>
 *   </li>
 *   <li>
 *     <h4>Numerical, Decimal</h4>
 *     <p>
 *       For input parameters, default precision is 18 and default scale is 0. Maximum supported precision is 19.
 *     </p>
 *   </li>
 *   <li>
 *     <h4>VarChar, NVarChar</h4>
 *     <p>
 *       <code>varchar(max)</code> and <code>nvarchar(max)</code> are also supported.
 *     </p>
 *   </li>
 *   <li>
 *     <h4>UniqueIdentifier</h4>
 *     <p>
 *       Values are returned as a 16 byte hexadecimal string.
 *     </p>
 *     <p>
 *       Note that the order of bytes is not the same as the character representation. See
 *       <a href="http://msdn.microsoft.com/en-us/library/ms190215.aspx">Using uniqueidentifier Data</a>
 *       for an example of the different ordering of bytes.
 *     </p>
 *   </li>
 * </ol>
 */

exports.TYPE = TYPE;
const TYPES = {
  TinyInt: _tinyint.default,
  Bit: _bit.default,
  SmallInt: _smallint.default,
  Int: _int.default,
  SmallDateTime: _smalldatetime.default,
  Real: _real.default,
  Money: _money.default,
  DateTime: _datetime.default,
  Float: _float.default,
  Decimal: _decimal.default,
  Numeric: _numeric.default,
  SmallMoney: _smallmoney.default,
  BigInt: _bigint.default,
  Image: _image.default,
  Text: _text.default,
  UniqueIdentifier: _uniqueidentifier.default,
  NText: _ntext.default,
  VarBinary: _varbinary.default,
  VarChar: _varchar.default,
  Binary: _binary.default,
  Char: _char.default,
  NVarChar: _nvarchar.default,
  NChar: _nchar.default,
  Xml: _xml.default,
  Time: _time.default,
  Date: _date.default,
  DateTime2: _datetime2.default,
  DateTimeOffset: _datetimeoffset.default,
  UDT: _udt.default,
  TVP: _tvp.default,
  Variant: _sqlVariant.default
};
exports.TYPES = TYPES;
const typeByName = TYPES;
exports.typeByName = typeByName;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUWVBFIiwiTnVsbCIsImlkIiwiVGlueUludCIsIkJpdCIsIlNtYWxsSW50IiwiSW50IiwiU21hbGxEYXRlVGltZSIsIlJlYWwiLCJNb25leSIsIkRhdGVUaW1lIiwiRmxvYXQiLCJEZWNpbWFsIiwiTnVtZXJpYyIsIlNtYWxsTW9uZXkiLCJCaWdJbnQiLCJJbWFnZSIsIlRleHQiLCJVbmlxdWVJZGVudGlmaWVyIiwiSW50TiIsIk5UZXh0IiwiQml0TiIsIkRlY2ltYWxOIiwiTnVtZXJpY04iLCJGbG9hdE4iLCJNb25leU4iLCJEYXRlVGltZU4iLCJWYXJCaW5hcnkiLCJWYXJDaGFyIiwiQmluYXJ5IiwiQ2hhciIsIk5WYXJDaGFyIiwiTkNoYXIiLCJYbWwiLCJUaW1lIiwiRGF0ZSIsIkRhdGVUaW1lMiIsIkRhdGVUaW1lT2Zmc2V0IiwiVURUIiwiVFZQIiwiVmFyaWFudCIsIlRZUEVTIiwidHlwZUJ5TmFtZSJdLCJzb3VyY2VzIjpbIi4uL3NyYy9kYXRhLXR5cGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IE51bGwgZnJvbSAnLi9kYXRhLXR5cGVzL251bGwnO1xuaW1wb3J0IFRpbnlJbnQgZnJvbSAnLi9kYXRhLXR5cGVzL3RpbnlpbnQnO1xuaW1wb3J0IEJpdCBmcm9tICcuL2RhdGEtdHlwZXMvYml0JztcbmltcG9ydCBTbWFsbEludCBmcm9tICcuL2RhdGEtdHlwZXMvc21hbGxpbnQnO1xuaW1wb3J0IEludCBmcm9tICcuL2RhdGEtdHlwZXMvaW50JztcbmltcG9ydCBTbWFsbERhdGVUaW1lIGZyb20gJy4vZGF0YS10eXBlcy9zbWFsbGRhdGV0aW1lJztcbmltcG9ydCBSZWFsIGZyb20gJy4vZGF0YS10eXBlcy9yZWFsJztcbmltcG9ydCBNb25leSBmcm9tICcuL2RhdGEtdHlwZXMvbW9uZXknO1xuaW1wb3J0IERhdGVUaW1lIGZyb20gJy4vZGF0YS10eXBlcy9kYXRldGltZSc7XG5pbXBvcnQgRmxvYXQgZnJvbSAnLi9kYXRhLXR5cGVzL2Zsb2F0JztcbmltcG9ydCBEZWNpbWFsIGZyb20gJy4vZGF0YS10eXBlcy9kZWNpbWFsJztcbmltcG9ydCBOdW1lcmljIGZyb20gJy4vZGF0YS10eXBlcy9udW1lcmljJztcbmltcG9ydCBTbWFsbE1vbmV5IGZyb20gJy4vZGF0YS10eXBlcy9zbWFsbG1vbmV5JztcbmltcG9ydCBCaWdJbnQgZnJvbSAnLi9kYXRhLXR5cGVzL2JpZ2ludCc7XG5pbXBvcnQgSW1hZ2UgZnJvbSAnLi9kYXRhLXR5cGVzL2ltYWdlJztcbmltcG9ydCBUZXh0IGZyb20gJy4vZGF0YS10eXBlcy90ZXh0JztcbmltcG9ydCBVbmlxdWVJZGVudGlmaWVyIGZyb20gJy4vZGF0YS10eXBlcy91bmlxdWVpZGVudGlmaWVyJztcbmltcG9ydCBJbnROIGZyb20gJy4vZGF0YS10eXBlcy9pbnRuJztcbmltcG9ydCBOVGV4dCBmcm9tICcuL2RhdGEtdHlwZXMvbnRleHQnO1xuaW1wb3J0IEJpdE4gZnJvbSAnLi9kYXRhLXR5cGVzL2JpdG4nO1xuaW1wb3J0IERlY2ltYWxOIGZyb20gJy4vZGF0YS10eXBlcy9kZWNpbWFsbic7XG5pbXBvcnQgTnVtZXJpY04gZnJvbSAnLi9kYXRhLXR5cGVzL251bWVyaWNuJztcbmltcG9ydCBGbG9hdE4gZnJvbSAnLi9kYXRhLXR5cGVzL2Zsb2F0bic7XG5pbXBvcnQgTW9uZXlOIGZyb20gJy4vZGF0YS10eXBlcy9tb25leW4nO1xuaW1wb3J0IERhdGVUaW1lTiBmcm9tICcuL2RhdGEtdHlwZXMvZGF0ZXRpbWVuJztcbmltcG9ydCBWYXJCaW5hcnkgZnJvbSAnLi9kYXRhLXR5cGVzL3ZhcmJpbmFyeSc7XG5pbXBvcnQgVmFyQ2hhciBmcm9tICcuL2RhdGEtdHlwZXMvdmFyY2hhcic7XG5pbXBvcnQgQmluYXJ5IGZyb20gJy4vZGF0YS10eXBlcy9iaW5hcnknO1xuaW1wb3J0IENoYXIgZnJvbSAnLi9kYXRhLXR5cGVzL2NoYXInO1xuaW1wb3J0IE5WYXJDaGFyIGZyb20gJy4vZGF0YS10eXBlcy9udmFyY2hhcic7XG5pbXBvcnQgTkNoYXIgZnJvbSAnLi9kYXRhLXR5cGVzL25jaGFyJztcbmltcG9ydCBYbWwgZnJvbSAnLi9kYXRhLXR5cGVzL3htbCc7XG5pbXBvcnQgVGltZSBmcm9tICcuL2RhdGEtdHlwZXMvdGltZSc7XG5pbXBvcnQgRGF0ZSBmcm9tICcuL2RhdGEtdHlwZXMvZGF0ZSc7XG5pbXBvcnQgRGF0ZVRpbWUyIGZyb20gJy4vZGF0YS10eXBlcy9kYXRldGltZTInO1xuaW1wb3J0IERhdGVUaW1lT2Zmc2V0IGZyb20gJy4vZGF0YS10eXBlcy9kYXRldGltZW9mZnNldCc7XG5pbXBvcnQgVURUIGZyb20gJy4vZGF0YS10eXBlcy91ZHQnO1xuaW1wb3J0IFRWUCBmcm9tICcuL2RhdGEtdHlwZXMvdHZwJztcbmltcG9ydCBWYXJpYW50IGZyb20gJy4vZGF0YS10eXBlcy9zcWwtdmFyaWFudCc7XG5pbXBvcnQgeyBDcnlwdG9NZXRhZGF0YSB9IGZyb20gJy4vYWx3YXlzLWVuY3J5cHRlZC90eXBlcyc7XG5cbmltcG9ydCB7IEludGVybmFsQ29ubmVjdGlvbk9wdGlvbnMgfSBmcm9tICcuL2Nvbm5lY3Rpb24nO1xuaW1wb3J0IHsgQ29sbGF0aW9uIH0gZnJvbSAnLi9jb2xsYXRpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhcmFtZXRlciB7XG4gIHR5cGU6IERhdGFUeXBlO1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgdmFsdWU6IHVua25vd247XG5cbiAgb3V0cHV0OiBib29sZWFuO1xuICBsZW5ndGg/OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByZWNpc2lvbj86IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgc2NhbGU/OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgbnVsbGFibGU/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIGZvcmNlRW5jcnlwdD86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIGNyeXB0b01ldGFkYXRhPzogQ3J5cHRvTWV0YWRhdGEgfCB1bmRlZmluZWQ7XG4gIGVuY3J5cHRlZFZhbD86IEJ1ZmZlciB8IHVuZGVmaW5lZDtcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcmFtZXRlckRhdGE8VCA9IGFueT4ge1xuICBsZW5ndGg/OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHNjYWxlPzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcmVjaXNpb24/OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgY29sbGF0aW9uPzogQ29sbGF0aW9uIHwgdW5kZWZpbmVkO1xuXG4gIHZhbHVlOiBUO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFUeXBlIHtcbiAgaWQ6IG51bWJlcjtcbiAgdHlwZTogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgZGVjbGFyYXRpb24ocGFyYW1ldGVyOiBQYXJhbWV0ZXIpOiBzdHJpbmc7XG4gIGdlbmVyYXRlVHlwZUluZm8ocGFyYW1ldGVyOiBQYXJhbWV0ZXJEYXRhLCBvcHRpb25zOiBJbnRlcm5hbENvbm5lY3Rpb25PcHRpb25zKTogQnVmZmVyO1xuICBnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aChwYXJhbWV0ZXI6IFBhcmFtZXRlckRhdGEsIG9wdGlvbnM6IEludGVybmFsQ29ubmVjdGlvbk9wdGlvbnMpOiBCdWZmZXI7XG4gIGdlbmVyYXRlUGFyYW1ldGVyRGF0YShwYXJhbWV0ZXI6IFBhcmFtZXRlckRhdGEsIG9wdGlvbnM6IEludGVybmFsQ29ubmVjdGlvbk9wdGlvbnMpOiBHZW5lcmF0b3I8QnVmZmVyLCB2b2lkPjtcbiAgdmFsaWRhdGUodmFsdWU6IGFueSwgY29sbGF0aW9uOiBDb2xsYXRpb24gfCB1bmRlZmluZWQpOiBhbnk7IC8vIFRPRE86IFJlZmFjdG9yICdhbnknIGFuZCByZXBsYWNlIHdpdGggbW9yZSBzcGVjaWZpYyB0eXBlLlxuXG4gIGhhc1RhYmxlTmFtZT86IGJvb2xlYW47XG5cbiAgcmVzb2x2ZUxlbmd0aD86IChwYXJhbWV0ZXI6IFBhcmFtZXRlcikgPT4gbnVtYmVyO1xuICByZXNvbHZlUHJlY2lzaW9uPzogKHBhcmFtZXRlcjogUGFyYW1ldGVyKSA9PiBudW1iZXI7XG4gIHJlc29sdmVTY2FsZT86IChwYXJhbWV0ZXI6IFBhcmFtZXRlcikgPT4gbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgVFlQRSA9IHtcbiAgW051bGwuaWRdOiBOdWxsLFxuICBbVGlueUludC5pZF06IFRpbnlJbnQsXG4gIFtCaXQuaWRdOiBCaXQsXG4gIFtTbWFsbEludC5pZF06IFNtYWxsSW50LFxuICBbSW50LmlkXTogSW50LFxuICBbU21hbGxEYXRlVGltZS5pZF06IFNtYWxsRGF0ZVRpbWUsXG4gIFtSZWFsLmlkXTogUmVhbCxcbiAgW01vbmV5LmlkXTogTW9uZXksXG4gIFtEYXRlVGltZS5pZF06IERhdGVUaW1lLFxuICBbRmxvYXQuaWRdOiBGbG9hdCxcbiAgW0RlY2ltYWwuaWRdOiBEZWNpbWFsLFxuICBbTnVtZXJpYy5pZF06IE51bWVyaWMsXG4gIFtTbWFsbE1vbmV5LmlkXTogU21hbGxNb25leSxcbiAgW0JpZ0ludC5pZF06IEJpZ0ludCxcbiAgW0ltYWdlLmlkXTogSW1hZ2UsXG4gIFtUZXh0LmlkXTogVGV4dCxcbiAgW1VuaXF1ZUlkZW50aWZpZXIuaWRdOiBVbmlxdWVJZGVudGlmaWVyLFxuICBbSW50Ti5pZF06IEludE4sXG4gIFtOVGV4dC5pZF06IE5UZXh0LFxuICBbQml0Ti5pZF06IEJpdE4sXG4gIFtEZWNpbWFsTi5pZF06IERlY2ltYWxOLFxuICBbTnVtZXJpY04uaWRdOiBOdW1lcmljTixcbiAgW0Zsb2F0Ti5pZF06IEZsb2F0TixcbiAgW01vbmV5Ti5pZF06IE1vbmV5TixcbiAgW0RhdGVUaW1lTi5pZF06IERhdGVUaW1lTixcbiAgW1ZhckJpbmFyeS5pZF06IFZhckJpbmFyeSxcbiAgW1ZhckNoYXIuaWRdOiBWYXJDaGFyLFxuICBbQmluYXJ5LmlkXTogQmluYXJ5LFxuICBbQ2hhci5pZF06IENoYXIsXG4gIFtOVmFyQ2hhci5pZF06IE5WYXJDaGFyLFxuICBbTkNoYXIuaWRdOiBOQ2hhcixcbiAgW1htbC5pZF06IFhtbCxcbiAgW1RpbWUuaWRdOiBUaW1lLFxuICBbRGF0ZS5pZF06IERhdGUsXG4gIFtEYXRlVGltZTIuaWRdOiBEYXRlVGltZTIsXG4gIFtEYXRlVGltZU9mZnNldC5pZF06IERhdGVUaW1lT2Zmc2V0LFxuICBbVURULmlkXTogVURULFxuICBbVFZQLmlkXTogVFZQLFxuICBbVmFyaWFudC5pZF06IFZhcmlhbnQsXG59O1xuXG4vKipcbiAqIDx0YWJsZT5cbiAqIDx0aGVhZD5cbiAqICAgPHRyPlxuICogICAgIDx0aD5UeXBlPC90aD5cbiAqICAgICA8dGg+Q29uc3RhbnQ8L3RoPlxuICogICAgIDx0aD5KYXZhU2NyaXB0PC90aD5cbiAqICAgICA8dGg+UmVzdWx0IHNldDwvdGg+XG4gKiAgICAgPHRoPlBhcmFtZXRlcjwvdGg+XG4gKiAgIDwvdHI+XG4gKiA8L3RoZWFkPlxuICpcbiAqIDx0Ym9keT5cbiAqICAgPHRyIGNsYXNzPVwiZ3JvdXAtaGVhZGluZ1wiPlxuICogICAgIDx0aCBjb2xzcGFuPVwiNVwiPkV4YWN0IG51bWVyaWNzPC90aD5cbiAqICAgPC90cj5cbiAqICAgPHRyPlxuICogICAgIDx0ZD48Y29kZT5iaXQ8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+W1tUWVBFUy5CaXRdXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5ib29sZWFuPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgIDwvdHI+XG4gKiAgIDx0cj5cbiAqICAgICA8dGQ+PGNvZGU+dGlueWludDwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5bW1RZUEVTLlRpbnlJbnRdXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5udW1iZXI8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgPC90cj5cbiAqICAgPHRyPlxuICogICAgIDx0ZD48Y29kZT5zbWFsbGludDwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5bW1RZUEVTLlNtYWxsSW50XV08L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+bnVtYmVyPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgIDwvdHI+XG4gKiAgIDx0cj5cbiAqICAgICA8dGQ+PGNvZGU+aW50PC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPltbVFlQRVMuSW50XV08L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+bnVtYmVyPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgIDwvdHI+XG4gKiAgIDx0cj5cbiAqICAgICA8dGQ+PGNvZGU+YmlnaW50PC9jb2RlPjxzdXA+MTwvc3VwPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPltbVFlQRVMuQmlnSW50XV08L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+c3RyaW5nPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgIDwvdHI+XG4gKiAgIDx0cj5cbiAqICAgICA8dGQ+PGNvZGU+bnVtZXJpYzwvY29kZT48c3VwPjI8L3N1cD48L3RkPlxuICogICAgIDx0ZD48Y29kZT5bW1RZUEVTLk51bWVyaWNdXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5udW1iZXI8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgPC90cj5cbiAqICAgPHRyPlxuICogICAgIDx0ZD48Y29kZT5kZWNpbWFsPC9jb2RlPjxzdXA+Mjwvc3VwPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPltbVFlQRVMuRGVjaW1hbF1dPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPm51bWJlcjwvY29kZT48L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICA8L3RyPlxuICogICA8dHI+XG4gKiAgICAgPHRkPjxjb2RlPnNtYWxsbW9uZXk8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+W1tUWVBFUy5TbWFsbE1vbmV5XV08L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+bnVtYmVyPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgIDwvdHI+XG4gKiAgIDx0cj5cbiAqICAgICA8dGQ+PGNvZGU+bW9uZXk8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+W1tUWVBFUy5Nb25leV1dPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPm51bWJlcjwvY29kZT48L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICA8L3RyPlxuICogPC90Ym9keT5cbiAqXG4gKiA8dGJvZHk+XG4gKiAgIDx0ciBjbGFzcz1cImdyb3VwLWhlYWRpbmdcIj5cbiAqICAgICA8dGggY29sc3Bhbj1cIjVcIj5BcHByb3hpbWF0ZSBudW1lcmljczwvdGg+XG4gKiAgIDwvdHI+XG4gKiAgIDx0cj5cbiAqICAgICA8dGQ+PGNvZGU+ZmxvYXQ8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+W1tUWVBFUy5GbG9hdF1dPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPm51bWJlcjwvY29kZT48L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICA8L3RyPlxuICogICA8dHI+XG4gKiAgICAgPHRkPjxjb2RlPnJlYWw8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+W1tUWVBFUy5SZWFsXV08L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+bnVtYmVyPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgIDwvdHI+XG4gKiA8L3Rib2R5PlxuICpcbiAqIDx0Ym9keT5cbiAqICAgPHRyIGNsYXNzPVwiZ3JvdXAtaGVhZGluZ1wiPlxuICogICAgIDx0aCBjb2xzcGFuPVwiNFwiPkRhdGUgYW5kIFRpbWU8L3RoPlxuICogICA8L3RyPlxuICogICA8dHI+XG4gKiAgICAgPHRkPjxjb2RlPnNtYWxsZGF0ZXRpbWU8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+W1tUWVBFUy5TbWFsbERhdGVUaW1lXV08L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+RGF0ZTwvY29kZT48L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICA8L3RyPlxuICogICA8dHI+XG4gKiAgICAgPHRkPjxjb2RlPmRhdGV0aW1lPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPltbVFlQRVMuRGF0ZVRpbWVdXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5EYXRlPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgIDwvdHI+XG4gKiAgIDx0cj5cbiAqICAgICA8dGQ+PGNvZGU+ZGF0ZXRpbWUyPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPltbVFlQRVMuRGF0ZVRpbWUyXV08L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+RGF0ZTwvY29kZT48L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICA8L3RyPlxuICogICA8dHI+XG4gKiAgICAgPHRkPjxjb2RlPmRhdGV0aW1lb2Zmc2V0PC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPltbVFlQRVMuRGF0ZVRpbWVPZmZzZXRdXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5EYXRlPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgIDwvdHI+XG4gKiAgIDx0cj5cbiAqICAgICA8dGQ+PGNvZGU+dGltZTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5bW1RZUEVTLlRpbWVdXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5EYXRlPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgIDwvdHI+XG4gKiAgIDx0cj5cbiAqICAgICA8dGQ+PGNvZGU+ZGF0ZTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5bW1RZUEVTLkRhdGVdXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5EYXRlPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgIDwvdHI+XG4gKiA8L3Rib2R5PlxuICpcbiAqIDx0Ym9keT5cbiAqICAgPHRyIGNsYXNzPVwiZ3JvdXAtaGVhZGluZ1wiPlxuICogICAgIDx0aCBjb2xzcGFuPVwiNFwiPkNoYXJhY3RlciBTdHJpbmdzPC90aD5cbiAqICAgPC90cj5cbiAqICAgPHRyPlxuICogICAgIDx0ZD48Y29kZT5jaGFyPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPltbVFlQRVMuQ2hhcl1dPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPnN0cmluZzwvY29kZT48L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICA8L3RyPlxuICogICA8dHI+XG4gKiAgICAgPHRkPjxjb2RlPnZhcmNoYXI8L2NvZGU+PHN1cD4zPC9zdXA+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+W1tUWVBFUy5WYXJDaGFyXV08L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+c3RyaW5nPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgIDwvdHI+XG4gKiAgIDx0cj5cbiAqICAgICA8dGQ+PGNvZGU+dGV4dDwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5bW1RZUEVTLlRleHRdXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5zdHJpbmc8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgPC90cj5cbiAqIDwvdGJvZHk+XG4gKlxuICogPHRib2R5PlxuICogICA8dHIgY2xhc3M9XCJncm91cC1oZWFkaW5nXCI+XG4gKiAgICAgPHRoIGNvbHNwYW49XCI0XCI+VW5pY29kZSBTdHJpbmdzPC90aD5cbiAqICAgPC90cj5cbiAqICAgPHRyPlxuICogICAgIDx0ZD48Y29kZT5uY2hhcjwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5bW1RZUEVTLk5DaGFyXV08L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+c3RyaW5nPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgIDwvdHI+XG4gKiAgIDx0cj5cbiAqICAgICA8dGQ+PGNvZGU+bnZhcmNoYXI8L2NvZGU+PHN1cD4zPC9zdXA+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+W1tUWVBFUy5OVmFyQ2hhcl1dPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPnN0cmluZzwvY29kZT48L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICA8L3RyPlxuICogICA8dHI+XG4gKiAgICAgPHRkPjxjb2RlPm50ZXh0PC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPltbVFlQRVMuTlRleHRdXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5zdHJpbmc8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgICA8dGQ+LTwvdGQ+XG4gKiAgIDwvdHI+XG4gKiA8L3Rib2R5PlxuICpcbiAqIDx0Ym9keT5cbiAqICAgPHRyIGNsYXNzPVwiZ3JvdXAtaGVhZGluZ1wiPlxuICogICAgIDx0aCBjb2xzcGFuPVwiNVwiPkJpbmFyeSBTdHJpbmdzPHN1cD40PC9zdXA+PC90aD5cbiAqICAgPC90cj5cbiAqICAgPHRyPlxuICogICAgIDx0ZD48Y29kZT5iaW5hcnk8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+W1tUWVBFUy5CaW5hcnldXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5CdWZmZXI8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgPC90cj5cbiAqICAgPHRyPlxuICogICAgIDx0ZD48Y29kZT52YXJiaW5hcnk8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+W1tUWVBFUy5WYXJCaW5hcnldXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5CdWZmZXI8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgPC90cj5cbiAqICAgPHRyPlxuICogICAgIDx0ZD48Y29kZT5pbWFnZTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5bW1RZUEVTLkltYWdlXV08L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+QnVmZmVyPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgIDwvdHI+XG4gKiA8L3Rib2R5PlxuICpcbiAqIDx0Ym9keT5cbiAqICAgPHRyIGNsYXNzPVwiZ3JvdXAtaGVhZGluZ1wiPlxuICogICAgIDx0aCBjb2xzcGFuPVwiNVwiPk90aGVyIERhdGEgVHlwZXM8L3RoPlxuICogICA8L3RyPlxuICogICA8dHI+XG4gKiAgICAgPHRkPjxjb2RlPlRWUDwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5bW1RZUEVTLlRWUF1dPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPk9iamVjdDwvY29kZT48L3RkPlxuICogICAgIDx0ZD4tPC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgPC90cj5cbiAqICAgPHRyPlxuICogICAgIDx0ZD48Y29kZT5VRFQ8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+W1tUWVBFUy5VRFRdXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5CdWZmZXI8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgICA8dGQ+LTwvdGQ+XG4gKiAgIDwvdHI+XG4gKiAgIDx0cj5cbiAqICAgICA8dGQ+PGNvZGU+dW5pcXVlaWRlbnRpZmllcjwvY29kZT48c3VwPjQ8L3N1cD48L3RkPlxuICogICAgIDx0ZD48Y29kZT5bW1RZUEVTLlVuaXF1ZUlkZW50aWZpZXJdXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5zdHJpbmc8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgPC90cj5cbiAqICAgPHRyPlxuICogICAgIDx0ZD48Y29kZT52YXJpYW50PC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPltbVFlQRVMuVmFyaWFudF1dPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPmFueTwvY29kZT48L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICAgIDx0ZD4tPC90ZD5cbiAqICAgPC90cj5cbiAqICAgPHRyPlxuICogICAgIDx0ZD48Y29kZT54bWw8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+W1tUWVBFUy5YbWxdXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5zdHJpbmc8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgICA8dGQ+LTwvdGQ+XG4gKiAgIDwvdHI+XG4gKiA8L3Rib2R5PlxuICogPC90YWJsZT5cbiAqXG4gKiA8b2w+XG4gKiAgIDxsaT5cbiAqICAgICA8aDQ+QmlnSW50PC9oND5cbiAqICAgICA8cD5cbiAqICAgICAgIFZhbHVlcyBhcmUgcmV0dXJuZWQgYXMgYSBzdHJpbmcuIFRoaXMgaXMgYmVjYXVzZSB2YWx1ZXMgY2FuIGV4Y2VlZCA1MyBiaXRzIG9mIHNpZ25pZmljYW50IGRhdGEsIHdoaWNoIGlzIGdyZWF0ZXIgdGhhbiBhXG4gKiAgICAgICBKYXZhc2NyaXB0IDxjb2RlPm51bWJlcjwvY29kZT4gdHlwZSBjYW4gcmVwcmVzZW50IGFzIGFuIGludGVnZXIuXG4gKiAgICAgPC9wPlxuICogICA8L2xpPlxuICogICA8bGk+XG4gKiAgICAgPGg0Pk51bWVyaWNhbCwgRGVjaW1hbDwvaDQ+XG4gKiAgICAgPHA+XG4gKiAgICAgICBGb3IgaW5wdXQgcGFyYW1ldGVycywgZGVmYXVsdCBwcmVjaXNpb24gaXMgMTggYW5kIGRlZmF1bHQgc2NhbGUgaXMgMC4gTWF4aW11bSBzdXBwb3J0ZWQgcHJlY2lzaW9uIGlzIDE5LlxuICogICAgIDwvcD5cbiAqICAgPC9saT5cbiAqICAgPGxpPlxuICogICAgIDxoND5WYXJDaGFyLCBOVmFyQ2hhcjwvaDQ+XG4gKiAgICAgPHA+XG4gKiAgICAgICA8Y29kZT52YXJjaGFyKG1heCk8L2NvZGU+IGFuZCA8Y29kZT5udmFyY2hhcihtYXgpPC9jb2RlPiBhcmUgYWxzbyBzdXBwb3J0ZWQuXG4gKiAgICAgPC9wPlxuICogICA8L2xpPlxuICogICA8bGk+XG4gKiAgICAgPGg0PlVuaXF1ZUlkZW50aWZpZXI8L2g0PlxuICogICAgIDxwPlxuICogICAgICAgVmFsdWVzIGFyZSByZXR1cm5lZCBhcyBhIDE2IGJ5dGUgaGV4YWRlY2ltYWwgc3RyaW5nLlxuICogICAgIDwvcD5cbiAqICAgICA8cD5cbiAqICAgICAgIE5vdGUgdGhhdCB0aGUgb3JkZXIgb2YgYnl0ZXMgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBjaGFyYWN0ZXIgcmVwcmVzZW50YXRpb24uIFNlZVxuICogICAgICAgPGEgaHJlZj1cImh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE5MDIxNS5hc3B4XCI+VXNpbmcgdW5pcXVlaWRlbnRpZmllciBEYXRhPC9hPlxuICogICAgICAgZm9yIGFuIGV4YW1wbGUgb2YgdGhlIGRpZmZlcmVudCBvcmRlcmluZyBvZiBieXRlcy5cbiAqICAgICA8L3A+XG4gKiAgIDwvbGk+XG4gKiA8L29sPlxuICovXG5leHBvcnQgY29uc3QgVFlQRVMgPSB7XG4gIFRpbnlJbnQsXG4gIEJpdCxcbiAgU21hbGxJbnQsXG4gIEludCxcbiAgU21hbGxEYXRlVGltZSxcbiAgUmVhbCxcbiAgTW9uZXksXG4gIERhdGVUaW1lLFxuICBGbG9hdCxcbiAgRGVjaW1hbCxcbiAgTnVtZXJpYyxcbiAgU21hbGxNb25leSxcbiAgQmlnSW50LFxuICBJbWFnZSxcbiAgVGV4dCxcbiAgVW5pcXVlSWRlbnRpZmllcixcbiAgTlRleHQsXG4gIFZhckJpbmFyeSxcbiAgVmFyQ2hhcixcbiAgQmluYXJ5LFxuICBDaGFyLFxuICBOVmFyQ2hhcixcbiAgTkNoYXIsXG4gIFhtbCxcbiAgVGltZSxcbiAgRGF0ZSxcbiAgRGF0ZVRpbWUyLFxuICBEYXRlVGltZU9mZnNldCxcbiAgVURULFxuICBUVlAsXG4gIFZhcmlhbnRcbn07XG5cbmV4cG9ydCBjb25zdCB0eXBlQnlOYW1lID0gVFlQRVM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQXFETyxNQUFNQSxJQUFJLEdBQUc7RUFDbEIsQ0FBQ0MsY0FBS0MsRUFBTixHQUFXRCxhQURPO0VBRWxCLENBQUNFLGlCQUFRRCxFQUFULEdBQWNDLGdCQUZJO0VBR2xCLENBQUNDLGFBQUlGLEVBQUwsR0FBVUUsWUFIUTtFQUlsQixDQUFDQyxrQkFBU0gsRUFBVixHQUFlRyxpQkFKRztFQUtsQixDQUFDQyxhQUFJSixFQUFMLEdBQVVJLFlBTFE7RUFNbEIsQ0FBQ0MsdUJBQWNMLEVBQWYsR0FBb0JLLHNCQU5GO0VBT2xCLENBQUNDLGNBQUtOLEVBQU4sR0FBV00sYUFQTztFQVFsQixDQUFDQyxlQUFNUCxFQUFQLEdBQVlPLGNBUk07RUFTbEIsQ0FBQ0Msa0JBQVNSLEVBQVYsR0FBZVEsaUJBVEc7RUFVbEIsQ0FBQ0MsZUFBTVQsRUFBUCxHQUFZUyxjQVZNO0VBV2xCLENBQUNDLGlCQUFRVixFQUFULEdBQWNVLGdCQVhJO0VBWWxCLENBQUNDLGlCQUFRWCxFQUFULEdBQWNXLGdCQVpJO0VBYWxCLENBQUNDLG9CQUFXWixFQUFaLEdBQWlCWSxtQkFiQztFQWNsQixDQUFDQyxnQkFBT2IsRUFBUixHQUFhYSxlQWRLO0VBZWxCLENBQUNDLGVBQU1kLEVBQVAsR0FBWWMsY0FmTTtFQWdCbEIsQ0FBQ0MsY0FBS2YsRUFBTixHQUFXZSxhQWhCTztFQWlCbEIsQ0FBQ0MsMEJBQWlCaEIsRUFBbEIsR0FBdUJnQix5QkFqQkw7RUFrQmxCLENBQUNDLGNBQUtqQixFQUFOLEdBQVdpQixhQWxCTztFQW1CbEIsQ0FBQ0MsZUFBTWxCLEVBQVAsR0FBWWtCLGNBbkJNO0VBb0JsQixDQUFDQyxjQUFLbkIsRUFBTixHQUFXbUIsYUFwQk87RUFxQmxCLENBQUNDLGtCQUFTcEIsRUFBVixHQUFlb0IsaUJBckJHO0VBc0JsQixDQUFDQyxrQkFBU3JCLEVBQVYsR0FBZXFCLGlCQXRCRztFQXVCbEIsQ0FBQ0MsZ0JBQU90QixFQUFSLEdBQWFzQixlQXZCSztFQXdCbEIsQ0FBQ0MsZ0JBQU92QixFQUFSLEdBQWF1QixlQXhCSztFQXlCbEIsQ0FBQ0MsbUJBQVV4QixFQUFYLEdBQWdCd0Isa0JBekJFO0VBMEJsQixDQUFDQyxtQkFBVXpCLEVBQVgsR0FBZ0J5QixrQkExQkU7RUEyQmxCLENBQUNDLGlCQUFRMUIsRUFBVCxHQUFjMEIsZ0JBM0JJO0VBNEJsQixDQUFDQyxnQkFBTzNCLEVBQVIsR0FBYTJCLGVBNUJLO0VBNkJsQixDQUFDQyxjQUFLNUIsRUFBTixHQUFXNEIsYUE3Qk87RUE4QmxCLENBQUNDLGtCQUFTN0IsRUFBVixHQUFlNkIsaUJBOUJHO0VBK0JsQixDQUFDQyxlQUFNOUIsRUFBUCxHQUFZOEIsY0EvQk07RUFnQ2xCLENBQUNDLGFBQUkvQixFQUFMLEdBQVUrQixZQWhDUTtFQWlDbEIsQ0FBQ0MsY0FBS2hDLEVBQU4sR0FBV2dDLGFBakNPO0VBa0NsQixDQUFDQyxjQUFLakMsRUFBTixHQUFXaUMsYUFsQ087RUFtQ2xCLENBQUNDLG1CQUFVbEMsRUFBWCxHQUFnQmtDLGtCQW5DRTtFQW9DbEIsQ0FBQ0Msd0JBQWVuQyxFQUFoQixHQUFxQm1DLHVCQXBDSDtFQXFDbEIsQ0FBQ0MsYUFBSXBDLEVBQUwsR0FBVW9DLFlBckNRO0VBc0NsQixDQUFDQyxhQUFJckMsRUFBTCxHQUFVcUMsWUF0Q1E7RUF1Q2xCLENBQUNDLG9CQUFRdEMsRUFBVCxHQUFjc0M7QUF2Q0ksQ0FBYjtBQTBDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxNQUFNQyxLQUFLLEdBQUc7RUFDbkJ0QyxPQUFPLEVBQVBBLGdCQURtQjtFQUVuQkMsR0FBRyxFQUFIQSxZQUZtQjtFQUduQkMsUUFBUSxFQUFSQSxpQkFIbUI7RUFJbkJDLEdBQUcsRUFBSEEsWUFKbUI7RUFLbkJDLGFBQWEsRUFBYkEsc0JBTG1CO0VBTW5CQyxJQUFJLEVBQUpBLGFBTm1CO0VBT25CQyxLQUFLLEVBQUxBLGNBUG1CO0VBUW5CQyxRQUFRLEVBQVJBLGlCQVJtQjtFQVNuQkMsS0FBSyxFQUFMQSxjQVRtQjtFQVVuQkMsT0FBTyxFQUFQQSxnQkFWbUI7RUFXbkJDLE9BQU8sRUFBUEEsZ0JBWG1CO0VBWW5CQyxVQUFVLEVBQVZBLG1CQVptQjtFQWFuQkMsTUFBTSxFQUFOQSxlQWJtQjtFQWNuQkMsS0FBSyxFQUFMQSxjQWRtQjtFQWVuQkMsSUFBSSxFQUFKQSxhQWZtQjtFQWdCbkJDLGdCQUFnQixFQUFoQkEseUJBaEJtQjtFQWlCbkJFLEtBQUssRUFBTEEsY0FqQm1CO0VBa0JuQk8sU0FBUyxFQUFUQSxrQkFsQm1CO0VBbUJuQkMsT0FBTyxFQUFQQSxnQkFuQm1CO0VBb0JuQkMsTUFBTSxFQUFOQSxlQXBCbUI7RUFxQm5CQyxJQUFJLEVBQUpBLGFBckJtQjtFQXNCbkJDLFFBQVEsRUFBUkEsaUJBdEJtQjtFQXVCbkJDLEtBQUssRUFBTEEsY0F2Qm1CO0VBd0JuQkMsR0FBRyxFQUFIQSxZQXhCbUI7RUF5Qm5CQyxJQUFJLEVBQUpBLGFBekJtQjtFQTBCbkJDLElBQUksRUFBSkEsYUExQm1CO0VBMkJuQkMsU0FBUyxFQUFUQSxrQkEzQm1CO0VBNEJuQkMsY0FBYyxFQUFkQSx1QkE1Qm1CO0VBNkJuQkMsR0FBRyxFQUFIQSxZQTdCbUI7RUE4Qm5CQyxHQUFHLEVBQUhBLFlBOUJtQjtFQStCbkJDLE9BQU8sRUFBUEE7QUEvQm1CLENBQWQ7O0FBa0NBLE1BQU1FLFVBQVUsR0FBR0QsS0FBbkIifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _events = require("events");

var util = _interopRequireWildcard(require("util"));

function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }

function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }

class Debug extends _events.EventEmitter {
  /*
    @options    Which debug details should be sent.
                data    - dump of packet data
                payload - details of decoded payload
  */
  constructor({
    data = false,
    payload = false,
    packet = false,
    token = false
  } = {}) {
    super();
    this.options = void 0;
    this.indent = void 0;
    this.options = {
      data,
      payload,
      packet,
      token
    };
    this.indent = '  ';
  }

  packet(direction, packet) {
    if (this.haveListeners() && this.options.packet) {
      this.log('');
      this.log(direction);
      this.log(packet.headerToString(this.indent));
    }
  }

  data(packet) {
    if (this.haveListeners() && this.options.data) {
      this.log(packet.dataToString(this.indent));
    }
  }

  payload(generatePayloadText) {
    if (this.haveListeners() && this.options.payload) {
      this.log(generatePayloadText());
    }
  }

  token(token) {
    if (this.haveListeners() && this.options.token) {
      this.log(util.inspect(token, {
        showHidden: false,
        depth: 5,
        colors: true
      }));
    }
  }

  haveListeners() {
    return this.listeners('debug').length > 0;
  }

  log(text) {
    this.emit('debug', text);
  }

}

var _default = Debug;
exports.default = _default;
module.exports = Debug;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJEZWJ1ZyIsIkV2ZW50RW1pdHRlciIsImNvbnN0cnVjdG9yIiwiZGF0YSIsInBheWxvYWQiLCJwYWNrZXQiLCJ0b2tlbiIsIm9wdGlvbnMiLCJpbmRlbnQiLCJkaXJlY3Rpb24iLCJoYXZlTGlzdGVuZXJzIiwibG9nIiwiaGVhZGVyVG9TdHJpbmciLCJkYXRhVG9TdHJpbmciLCJnZW5lcmF0ZVBheWxvYWRUZXh0IiwidXRpbCIsImluc3BlY3QiLCJzaG93SGlkZGVuIiwiZGVwdGgiLCJjb2xvcnMiLCJsaXN0ZW5lcnMiLCJsZW5ndGgiLCJ0ZXh0IiwiZW1pdCIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi9zcmMvZGVidWcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAndXRpbCc7XG5pbXBvcnQgeyBQYWNrZXQgfSBmcm9tICcuL3BhY2tldCc7XG5cbmNsYXNzIERlYnVnIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgb3B0aW9uczoge1xuICAgIGRhdGE6IGJvb2xlYW47XG4gICAgcGF5bG9hZDogYm9vbGVhbjtcbiAgICBwYWNrZXQ6IGJvb2xlYW47XG4gICAgdG9rZW46IGJvb2xlYW47XG4gIH07XG5cbiAgaW5kZW50OiBzdHJpbmc7XG5cbiAgLypcbiAgICBAb3B0aW9ucyAgICBXaGljaCBkZWJ1ZyBkZXRhaWxzIHNob3VsZCBiZSBzZW50LlxuICAgICAgICAgICAgICAgIGRhdGEgICAgLSBkdW1wIG9mIHBhY2tldCBkYXRhXG4gICAgICAgICAgICAgICAgcGF5bG9hZCAtIGRldGFpbHMgb2YgZGVjb2RlZCBwYXlsb2FkXG4gICovXG4gIGNvbnN0cnVjdG9yKHsgZGF0YSA9IGZhbHNlLCBwYXlsb2FkID0gZmFsc2UsIHBhY2tldCA9IGZhbHNlLCB0b2tlbiA9IGZhbHNlIH0gPSB7fSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLm9wdGlvbnMgPSB7IGRhdGEsIHBheWxvYWQsIHBhY2tldCwgdG9rZW4gfTtcbiAgICB0aGlzLmluZGVudCA9ICcgICc7XG4gIH1cblxuICBwYWNrZXQoZGlyZWN0aW9uOiAnUmVjZWl2ZWQnIHwgJ1NlbnQnLCBwYWNrZXQ6IFBhY2tldCkge1xuICAgIGlmICh0aGlzLmhhdmVMaXN0ZW5lcnMoKSAmJiB0aGlzLm9wdGlvbnMucGFja2V0KSB7XG4gICAgICB0aGlzLmxvZygnJyk7XG4gICAgICB0aGlzLmxvZyhkaXJlY3Rpb24pO1xuICAgICAgdGhpcy5sb2cocGFja2V0LmhlYWRlclRvU3RyaW5nKHRoaXMuaW5kZW50KSk7XG4gICAgfVxuICB9XG5cbiAgZGF0YShwYWNrZXQ6IFBhY2tldCkge1xuICAgIGlmICh0aGlzLmhhdmVMaXN0ZW5lcnMoKSAmJiB0aGlzLm9wdGlvbnMuZGF0YSkge1xuICAgICAgdGhpcy5sb2cocGFja2V0LmRhdGFUb1N0cmluZyh0aGlzLmluZGVudCkpO1xuICAgIH1cbiAgfVxuXG4gIHBheWxvYWQoZ2VuZXJhdGVQYXlsb2FkVGV4dDogKCkgPT4gc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuaGF2ZUxpc3RlbmVycygpICYmIHRoaXMub3B0aW9ucy5wYXlsb2FkKSB7XG4gICAgICB0aGlzLmxvZyhnZW5lcmF0ZVBheWxvYWRUZXh0KCkpO1xuICAgIH1cbiAgfVxuXG4gIHRva2VuKHRva2VuOiBhbnkpIHtcbiAgICBpZiAodGhpcy5oYXZlTGlzdGVuZXJzKCkgJiYgdGhpcy5vcHRpb25zLnRva2VuKSB7XG4gICAgICB0aGlzLmxvZyh1dGlsLmluc3BlY3QodG9rZW4sIHsgc2hvd0hpZGRlbjogZmFsc2UsIGRlcHRoOiA1LCBjb2xvcnM6IHRydWUgfSkpO1xuICAgIH1cbiAgfVxuXG4gIGhhdmVMaXN0ZW5lcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMubGlzdGVuZXJzKCdkZWJ1ZycpLmxlbmd0aCA+IDA7XG4gIH1cblxuICBsb2codGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy5lbWl0KCdkZWJ1ZycsIHRleHQpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IERlYnVnO1xubW9kdWxlLmV4cG9ydHMgPSBEZWJ1ZztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOzs7Ozs7QUFHQSxNQUFNQSxLQUFOLFNBQW9CQyxvQkFBcEIsQ0FBaUM7RUFVL0I7QUFDRjtBQUNBO0FBQ0E7QUFDQTtFQUNFQyxXQUFXLENBQUM7SUFBRUMsSUFBSSxHQUFHLEtBQVQ7SUFBZ0JDLE9BQU8sR0FBRyxLQUExQjtJQUFpQ0MsTUFBTSxHQUFHLEtBQTFDO0lBQWlEQyxLQUFLLEdBQUc7RUFBekQsSUFBbUUsRUFBcEUsRUFBd0U7SUFDakY7SUFEaUYsS0FkbkZDLE9BY21GO0lBQUEsS0FQbkZDLE1BT21GO0lBR2pGLEtBQUtELE9BQUwsR0FBZTtNQUFFSixJQUFGO01BQVFDLE9BQVI7TUFBaUJDLE1BQWpCO01BQXlCQztJQUF6QixDQUFmO0lBQ0EsS0FBS0UsTUFBTCxHQUFjLElBQWQ7RUFDRDs7RUFFREgsTUFBTSxDQUFDSSxTQUFELEVBQWlDSixNQUFqQyxFQUFpRDtJQUNyRCxJQUFJLEtBQUtLLGFBQUwsTUFBd0IsS0FBS0gsT0FBTCxDQUFhRixNQUF6QyxFQUFpRDtNQUMvQyxLQUFLTSxHQUFMLENBQVMsRUFBVDtNQUNBLEtBQUtBLEdBQUwsQ0FBU0YsU0FBVDtNQUNBLEtBQUtFLEdBQUwsQ0FBU04sTUFBTSxDQUFDTyxjQUFQLENBQXNCLEtBQUtKLE1BQTNCLENBQVQ7SUFDRDtFQUNGOztFQUVETCxJQUFJLENBQUNFLE1BQUQsRUFBaUI7SUFDbkIsSUFBSSxLQUFLSyxhQUFMLE1BQXdCLEtBQUtILE9BQUwsQ0FBYUosSUFBekMsRUFBK0M7TUFDN0MsS0FBS1EsR0FBTCxDQUFTTixNQUFNLENBQUNRLFlBQVAsQ0FBb0IsS0FBS0wsTUFBekIsQ0FBVDtJQUNEO0VBQ0Y7O0VBRURKLE9BQU8sQ0FBQ1UsbUJBQUQsRUFBb0M7SUFDekMsSUFBSSxLQUFLSixhQUFMLE1BQXdCLEtBQUtILE9BQUwsQ0FBYUgsT0FBekMsRUFBa0Q7TUFDaEQsS0FBS08sR0FBTCxDQUFTRyxtQkFBbUIsRUFBNUI7SUFDRDtFQUNGOztFQUVEUixLQUFLLENBQUNBLEtBQUQsRUFBYTtJQUNoQixJQUFJLEtBQUtJLGFBQUwsTUFBd0IsS0FBS0gsT0FBTCxDQUFhRCxLQUF6QyxFQUFnRDtNQUM5QyxLQUFLSyxHQUFMLENBQVNJLElBQUksQ0FBQ0MsT0FBTCxDQUFhVixLQUFiLEVBQW9CO1FBQUVXLFVBQVUsRUFBRSxLQUFkO1FBQXFCQyxLQUFLLEVBQUUsQ0FBNUI7UUFBK0JDLE1BQU0sRUFBRTtNQUF2QyxDQUFwQixDQUFUO0lBQ0Q7RUFDRjs7RUFFRFQsYUFBYSxHQUFHO0lBQ2QsT0FBTyxLQUFLVSxTQUFMLENBQWUsT0FBZixFQUF3QkMsTUFBeEIsR0FBaUMsQ0FBeEM7RUFDRDs7RUFFRFYsR0FBRyxDQUFDVyxJQUFELEVBQWU7SUFDaEIsS0FBS0MsSUFBTCxDQUFVLE9BQVYsRUFBbUJELElBQW5CO0VBQ0Q7O0FBdEQ4Qjs7ZUF5RGxCdEIsSzs7QUFDZndCLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQnpCLEtBQWpCIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.RequestError = exports.ConnectionError = void 0;

class ConnectionError extends Error {
  constructor(message, code) {
    super(message);
    this.code = void 0;
    this.isTransient = void 0;
    this.code = code;
  }

}

exports.ConnectionError = ConnectionError;

class RequestError extends Error {
  constructor(message, code) {
    super(message);
    this.code = void 0;
    this.number = void 0;
    this.state = void 0;
    this.class = void 0;
    this.serverName = void 0;
    this.procName = void 0;
    this.lineNumber = void 0;
    this.code = code;
  }

}

exports.RequestError = RequestError;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb25uZWN0aW9uRXJyb3IiLCJFcnJvciIsImNvbnN0cnVjdG9yIiwibWVzc2FnZSIsImNvZGUiLCJpc1RyYW5zaWVudCIsIlJlcXVlc3RFcnJvciIsIm51bWJlciIsInN0YXRlIiwiY2xhc3MiLCJzZXJ2ZXJOYW1lIiwicHJvY05hbWUiLCJsaW5lTnVtYmVyIl0sInNvdXJjZXMiOlsiLi4vc3JjL2Vycm9ycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgaXNUcmFuc2llbnQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBjb2RlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG5cbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZXF1ZXN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvZGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBudW1iZXI6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgc3RhdGU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgY2xhc3M6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgc2VydmVyTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwcm9jTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsaW5lTnVtYmVyOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBjb2RlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG5cbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBTyxNQUFNQSxlQUFOLFNBQThCQyxLQUE5QixDQUFvQztFQUt6Q0MsV0FBVyxDQUFDQyxPQUFELEVBQWtCQyxJQUFsQixFQUFpQztJQUMxQyxNQUFNRCxPQUFOO0lBRDBDLEtBSjVDQyxJQUk0QztJQUFBLEtBRjVDQyxXQUU0QztJQUcxQyxLQUFLRCxJQUFMLEdBQVlBLElBQVo7RUFDRDs7QUFUd0M7Ozs7QUFZcEMsTUFBTUUsWUFBTixTQUEyQkwsS0FBM0IsQ0FBaUM7RUFVdENDLFdBQVcsQ0FBQ0MsT0FBRCxFQUFrQkMsSUFBbEIsRUFBaUM7SUFDMUMsTUFBTUQsT0FBTjtJQUQwQyxLQVQ1Q0MsSUFTNEM7SUFBQSxLQVA1Q0csTUFPNEM7SUFBQSxLQU41Q0MsS0FNNEM7SUFBQSxLQUw1Q0MsS0FLNEM7SUFBQSxLQUo1Q0MsVUFJNEM7SUFBQSxLQUg1Q0MsUUFHNEM7SUFBQSxLQUY1Q0MsVUFFNEM7SUFHMUMsS0FBS1IsSUFBTCxHQUFZQSxJQUFaO0VBQ0Q7O0FBZHFDIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.bufferToLowerCaseGuid = bufferToLowerCaseGuid;
exports.bufferToUpperCaseGuid = bufferToUpperCaseGuid;
exports.guidToArray = guidToArray;
const UPPER_CASE_MAP = ['00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0A', '0B', '0C', '0D', '0E', '0F', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1A', '1B', '1C', '1D', '1E', '1F', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2A', '2B', '2C', '2D', '2E', '2F', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3A', '3B', '3C', '3D', '3E', '3F', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4A', '4B', '4C', '4D', '4E', '4F', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5A', '5B', '5C', '5D', '5E', '5F', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6A', '6B', '6C', '6D', '6E', '6F', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7A', '7B', '7C', '7D', '7E', '7F', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8A', '8B', '8C', '8D', '8E', '8F', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9A', '9B', '9C', '9D', '9E', '9F', 'A0', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'A9', 'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'B0', 'B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B8', 'B9', 'BA', 'BB', 'BC', 'BD', 'BE', 'BF', 'C0', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'C8', 'C9', 'CA', 'CB', 'CC', 'CD', 'CE', 'CF', 'D0', 'D1', 'D2', 'D3', 'D4', 'D5', 'D6', 'D7', 'D8', 'D9', 'DA', 'DB', 'DC', 'DD', 'DE', 'DF', 'E0', 'E1', 'E2', 'E3', 'E4', 'E5', 'E6', 'E7', 'E8', 'E9', 'EA', 'EB', 'EC', 'ED', 'EE', 'EF', 'F0', 'F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7', 'F8', 'F9', 'FA', 'FB', 'FC', 'FD', 'FE', 'FF'];
const LOWER_CASE_MAP = ['00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff'];

function bufferToUpperCaseGuid(buffer) {
  return UPPER_CASE_MAP[buffer[3]] + UPPER_CASE_MAP[buffer[2]] + UPPER_CASE_MAP[buffer[1]] + UPPER_CASE_MAP[buffer[0]] + '-' + UPPER_CASE_MAP[buffer[5]] + UPPER_CASE_MAP[buffer[4]] + '-' + UPPER_CASE_MAP[buffer[7]] + UPPER_CASE_MAP[buffer[6]] + '-' + UPPER_CASE_MAP[buffer[8]] + UPPER_CASE_MAP[buffer[9]] + '-' + UPPER_CASE_MAP[buffer[10]] + UPPER_CASE_MAP[buffer[11]] + UPPER_CASE_MAP[buffer[12]] + UPPER_CASE_MAP[buffer[13]] + UPPER_CASE_MAP[buffer[14]] + UPPER_CASE_MAP[buffer[15]];
}

function bufferToLowerCaseGuid(buffer) {
  return LOWER_CASE_MAP[buffer[3]] + LOWER_CASE_MAP[buffer[2]] + LOWER_CASE_MAP[buffer[1]] + LOWER_CASE_MAP[buffer[0]] + '-' + LOWER_CASE_MAP[buffer[5]] + LOWER_CASE_MAP[buffer[4]] + '-' + LOWER_CASE_MAP[buffer[7]] + LOWER_CASE_MAP[buffer[6]] + '-' + LOWER_CASE_MAP[buffer[8]] + LOWER_CASE_MAP[buffer[9]] + '-' + LOWER_CASE_MAP[buffer[10]] + LOWER_CASE_MAP[buffer[11]] + LOWER_CASE_MAP[buffer[12]] + LOWER_CASE_MAP[buffer[13]] + LOWER_CASE_MAP[buffer[14]] + LOWER_CASE_MAP[buffer[15]];
}

const CHARCODEMAP = {};
const hexDigits = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F'].map(d => d.charCodeAt(0));

for (let i = 0; i < hexDigits.length; i++) {
  const map = CHARCODEMAP[hexDigits[i]] = {};

  for (let j = 0; j < hexDigits.length; j++) {
    const hex = String.fromCharCode(hexDigits[i], hexDigits[j]);
    const value = parseInt(hex, 16);
    map[hexDigits[j]] = value;
  }
}

function guidToArray(guid) {
  return [CHARCODEMAP[guid.charCodeAt(6)][guid.charCodeAt(7)], CHARCODEMAP[guid.charCodeAt(4)][guid.charCodeAt(5)], CHARCODEMAP[guid.charCodeAt(2)][guid.charCodeAt(3)], CHARCODEMAP[guid.charCodeAt(0)][guid.charCodeAt(1)], CHARCODEMAP[guid.charCodeAt(11)][guid.charCodeAt(12)], CHARCODEMAP[guid.charCodeAt(9)][guid.charCodeAt(10)], CHARCODEMAP[guid.charCodeAt(16)][guid.charCodeAt(17)], CHARCODEMAP[guid.charCodeAt(14)][guid.charCodeAt(15)], CHARCODEMAP[guid.charCodeAt(19)][guid.charCodeAt(20)], CHARCODEMAP[guid.charCodeAt(21)][guid.charCodeAt(22)], CHARCODEMAP[guid.charCodeAt(24)][guid.charCodeAt(25)], CHARCODEMAP[guid.charCodeAt(26)][guid.charCodeAt(27)], CHARCODEMAP[guid.charCodeAt(28)][guid.charCodeAt(29)], CHARCODEMAP[guid.charCodeAt(30)][guid.charCodeAt(31)], CHARCODEMAP[guid.charCodeAt(32)][guid.charCodeAt(33)], CHARCODEMAP[guid.charCodeAt(34)][guid.charCodeAt(35)]];
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJVUFBFUl9DQVNFX01BUCIsIkxPV0VSX0NBU0VfTUFQIiwiYnVmZmVyVG9VcHBlckNhc2VHdWlkIiwiYnVmZmVyIiwiYnVmZmVyVG9Mb3dlckNhc2VHdWlkIiwiQ0hBUkNPREVNQVAiLCJoZXhEaWdpdHMiLCJtYXAiLCJkIiwiY2hhckNvZGVBdCIsImkiLCJsZW5ndGgiLCJqIiwiaGV4IiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwidmFsdWUiLCJwYXJzZUludCIsImd1aWRUb0FycmF5IiwiZ3VpZCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9ndWlkLXBhcnNlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBVUFBFUl9DQVNFX01BUCA9IFtcbiAgJzAwJywgJzAxJywgJzAyJywgJzAzJywgJzA0JywgJzA1JywgJzA2JywgJzA3JywgJzA4JywgJzA5JywgJzBBJywgJzBCJywgJzBDJywgJzBEJywgJzBFJywgJzBGJyxcbiAgJzEwJywgJzExJywgJzEyJywgJzEzJywgJzE0JywgJzE1JywgJzE2JywgJzE3JywgJzE4JywgJzE5JywgJzFBJywgJzFCJywgJzFDJywgJzFEJywgJzFFJywgJzFGJyxcbiAgJzIwJywgJzIxJywgJzIyJywgJzIzJywgJzI0JywgJzI1JywgJzI2JywgJzI3JywgJzI4JywgJzI5JywgJzJBJywgJzJCJywgJzJDJywgJzJEJywgJzJFJywgJzJGJyxcbiAgJzMwJywgJzMxJywgJzMyJywgJzMzJywgJzM0JywgJzM1JywgJzM2JywgJzM3JywgJzM4JywgJzM5JywgJzNBJywgJzNCJywgJzNDJywgJzNEJywgJzNFJywgJzNGJyxcbiAgJzQwJywgJzQxJywgJzQyJywgJzQzJywgJzQ0JywgJzQ1JywgJzQ2JywgJzQ3JywgJzQ4JywgJzQ5JywgJzRBJywgJzRCJywgJzRDJywgJzREJywgJzRFJywgJzRGJyxcbiAgJzUwJywgJzUxJywgJzUyJywgJzUzJywgJzU0JywgJzU1JywgJzU2JywgJzU3JywgJzU4JywgJzU5JywgJzVBJywgJzVCJywgJzVDJywgJzVEJywgJzVFJywgJzVGJyxcbiAgJzYwJywgJzYxJywgJzYyJywgJzYzJywgJzY0JywgJzY1JywgJzY2JywgJzY3JywgJzY4JywgJzY5JywgJzZBJywgJzZCJywgJzZDJywgJzZEJywgJzZFJywgJzZGJyxcbiAgJzcwJywgJzcxJywgJzcyJywgJzczJywgJzc0JywgJzc1JywgJzc2JywgJzc3JywgJzc4JywgJzc5JywgJzdBJywgJzdCJywgJzdDJywgJzdEJywgJzdFJywgJzdGJyxcbiAgJzgwJywgJzgxJywgJzgyJywgJzgzJywgJzg0JywgJzg1JywgJzg2JywgJzg3JywgJzg4JywgJzg5JywgJzhBJywgJzhCJywgJzhDJywgJzhEJywgJzhFJywgJzhGJyxcbiAgJzkwJywgJzkxJywgJzkyJywgJzkzJywgJzk0JywgJzk1JywgJzk2JywgJzk3JywgJzk4JywgJzk5JywgJzlBJywgJzlCJywgJzlDJywgJzlEJywgJzlFJywgJzlGJyxcbiAgJ0EwJywgJ0ExJywgJ0EyJywgJ0EzJywgJ0E0JywgJ0E1JywgJ0E2JywgJ0E3JywgJ0E4JywgJ0E5JywgJ0FBJywgJ0FCJywgJ0FDJywgJ0FEJywgJ0FFJywgJ0FGJyxcbiAgJ0IwJywgJ0IxJywgJ0IyJywgJ0IzJywgJ0I0JywgJ0I1JywgJ0I2JywgJ0I3JywgJ0I4JywgJ0I5JywgJ0JBJywgJ0JCJywgJ0JDJywgJ0JEJywgJ0JFJywgJ0JGJyxcbiAgJ0MwJywgJ0MxJywgJ0MyJywgJ0MzJywgJ0M0JywgJ0M1JywgJ0M2JywgJ0M3JywgJ0M4JywgJ0M5JywgJ0NBJywgJ0NCJywgJ0NDJywgJ0NEJywgJ0NFJywgJ0NGJyxcbiAgJ0QwJywgJ0QxJywgJ0QyJywgJ0QzJywgJ0Q0JywgJ0Q1JywgJ0Q2JywgJ0Q3JywgJ0Q4JywgJ0Q5JywgJ0RBJywgJ0RCJywgJ0RDJywgJ0REJywgJ0RFJywgJ0RGJyxcbiAgJ0UwJywgJ0UxJywgJ0UyJywgJ0UzJywgJ0U0JywgJ0U1JywgJ0U2JywgJ0U3JywgJ0U4JywgJ0U5JywgJ0VBJywgJ0VCJywgJ0VDJywgJ0VEJywgJ0VFJywgJ0VGJyxcbiAgJ0YwJywgJ0YxJywgJ0YyJywgJ0YzJywgJ0Y0JywgJ0Y1JywgJ0Y2JywgJ0Y3JywgJ0Y4JywgJ0Y5JywgJ0ZBJywgJ0ZCJywgJ0ZDJywgJ0ZEJywgJ0ZFJywgJ0ZGJ1xuXTtcblxuY29uc3QgTE9XRVJfQ0FTRV9NQVAgPSBbXG4gICcwMCcsICcwMScsICcwMicsICcwMycsICcwNCcsICcwNScsICcwNicsICcwNycsICcwOCcsICcwOScsICcwYScsICcwYicsICcwYycsICcwZCcsICcwZScsICcwZicsXG4gICcxMCcsICcxMScsICcxMicsICcxMycsICcxNCcsICcxNScsICcxNicsICcxNycsICcxOCcsICcxOScsICcxYScsICcxYicsICcxYycsICcxZCcsICcxZScsICcxZicsXG4gICcyMCcsICcyMScsICcyMicsICcyMycsICcyNCcsICcyNScsICcyNicsICcyNycsICcyOCcsICcyOScsICcyYScsICcyYicsICcyYycsICcyZCcsICcyZScsICcyZicsXG4gICczMCcsICczMScsICczMicsICczMycsICczNCcsICczNScsICczNicsICczNycsICczOCcsICczOScsICczYScsICczYicsICczYycsICczZCcsICczZScsICczZicsXG4gICc0MCcsICc0MScsICc0MicsICc0MycsICc0NCcsICc0NScsICc0NicsICc0NycsICc0OCcsICc0OScsICc0YScsICc0YicsICc0YycsICc0ZCcsICc0ZScsICc0ZicsXG4gICc1MCcsICc1MScsICc1MicsICc1MycsICc1NCcsICc1NScsICc1NicsICc1NycsICc1OCcsICc1OScsICc1YScsICc1YicsICc1YycsICc1ZCcsICc1ZScsICc1ZicsXG4gICc2MCcsICc2MScsICc2MicsICc2MycsICc2NCcsICc2NScsICc2NicsICc2NycsICc2OCcsICc2OScsICc2YScsICc2YicsICc2YycsICc2ZCcsICc2ZScsICc2ZicsXG4gICc3MCcsICc3MScsICc3MicsICc3MycsICc3NCcsICc3NScsICc3NicsICc3NycsICc3OCcsICc3OScsICc3YScsICc3YicsICc3YycsICc3ZCcsICc3ZScsICc3ZicsXG4gICc4MCcsICc4MScsICc4MicsICc4MycsICc4NCcsICc4NScsICc4NicsICc4NycsICc4OCcsICc4OScsICc4YScsICc4YicsICc4YycsICc4ZCcsICc4ZScsICc4ZicsXG4gICc5MCcsICc5MScsICc5MicsICc5MycsICc5NCcsICc5NScsICc5NicsICc5NycsICc5OCcsICc5OScsICc5YScsICc5YicsICc5YycsICc5ZCcsICc5ZScsICc5ZicsXG4gICdhMCcsICdhMScsICdhMicsICdhMycsICdhNCcsICdhNScsICdhNicsICdhNycsICdhOCcsICdhOScsICdhYScsICdhYicsICdhYycsICdhZCcsICdhZScsICdhZicsXG4gICdiMCcsICdiMScsICdiMicsICdiMycsICdiNCcsICdiNScsICdiNicsICdiNycsICdiOCcsICdiOScsICdiYScsICdiYicsICdiYycsICdiZCcsICdiZScsICdiZicsXG4gICdjMCcsICdjMScsICdjMicsICdjMycsICdjNCcsICdjNScsICdjNicsICdjNycsICdjOCcsICdjOScsICdjYScsICdjYicsICdjYycsICdjZCcsICdjZScsICdjZicsXG4gICdkMCcsICdkMScsICdkMicsICdkMycsICdkNCcsICdkNScsICdkNicsICdkNycsICdkOCcsICdkOScsICdkYScsICdkYicsICdkYycsICdkZCcsICdkZScsICdkZicsXG4gICdlMCcsICdlMScsICdlMicsICdlMycsICdlNCcsICdlNScsICdlNicsICdlNycsICdlOCcsICdlOScsICdlYScsICdlYicsICdlYycsICdlZCcsICdlZScsICdlZicsXG4gICdmMCcsICdmMScsICdmMicsICdmMycsICdmNCcsICdmNScsICdmNicsICdmNycsICdmOCcsICdmOScsICdmYScsICdmYicsICdmYycsICdmZCcsICdmZScsICdmZidcbl07XG5cbmV4cG9ydCBmdW5jdGlvbiBidWZmZXJUb1VwcGVyQ2FzZUd1aWQoYnVmZmVyOiBCdWZmZXIpIHtcbiAgcmV0dXJuIChcbiAgICBVUFBFUl9DQVNFX01BUFtidWZmZXJbM11dICtcbiAgICBVUFBFUl9DQVNFX01BUFtidWZmZXJbMl1dICtcbiAgICBVUFBFUl9DQVNFX01BUFtidWZmZXJbMV1dICtcbiAgICBVUFBFUl9DQVNFX01BUFtidWZmZXJbMF1dICtcbiAgICAnLScgK1xuICAgIFVQUEVSX0NBU0VfTUFQW2J1ZmZlcls1XV0gK1xuICAgIFVQUEVSX0NBU0VfTUFQW2J1ZmZlcls0XV0gK1xuICAgICctJyArXG4gICAgVVBQRVJfQ0FTRV9NQVBbYnVmZmVyWzddXSArXG4gICAgVVBQRVJfQ0FTRV9NQVBbYnVmZmVyWzZdXSArXG4gICAgJy0nICtcbiAgICBVUFBFUl9DQVNFX01BUFtidWZmZXJbOF1dICtcbiAgICBVUFBFUl9DQVNFX01BUFtidWZmZXJbOV1dICtcbiAgICAnLScgK1xuICAgIFVQUEVSX0NBU0VfTUFQW2J1ZmZlclsxMF1dICtcbiAgICBVUFBFUl9DQVNFX01BUFtidWZmZXJbMTFdXSArXG4gICAgVVBQRVJfQ0FTRV9NQVBbYnVmZmVyWzEyXV0gK1xuICAgIFVQUEVSX0NBU0VfTUFQW2J1ZmZlclsxM11dICtcbiAgICBVUFBFUl9DQVNFX01BUFtidWZmZXJbMTRdXSArXG4gICAgVVBQRVJfQ0FTRV9NQVBbYnVmZmVyWzE1XV1cbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1ZmZlclRvTG93ZXJDYXNlR3VpZChidWZmZXI6IEJ1ZmZlcikge1xuICByZXR1cm4gKFxuICAgIExPV0VSX0NBU0VfTUFQW2J1ZmZlclszXV0gK1xuICAgIExPV0VSX0NBU0VfTUFQW2J1ZmZlclsyXV0gK1xuICAgIExPV0VSX0NBU0VfTUFQW2J1ZmZlclsxXV0gK1xuICAgIExPV0VSX0NBU0VfTUFQW2J1ZmZlclswXV0gK1xuICAgICctJyArXG4gICAgTE9XRVJfQ0FTRV9NQVBbYnVmZmVyWzVdXSArXG4gICAgTE9XRVJfQ0FTRV9NQVBbYnVmZmVyWzRdXSArXG4gICAgJy0nICtcbiAgICBMT1dFUl9DQVNFX01BUFtidWZmZXJbN11dICtcbiAgICBMT1dFUl9DQVNFX01BUFtidWZmZXJbNl1dICtcbiAgICAnLScgK1xuICAgIExPV0VSX0NBU0VfTUFQW2J1ZmZlcls4XV0gK1xuICAgIExPV0VSX0NBU0VfTUFQW2J1ZmZlcls5XV0gK1xuICAgICctJyArXG4gICAgTE9XRVJfQ0FTRV9NQVBbYnVmZmVyWzEwXV0gK1xuICAgIExPV0VSX0NBU0VfTUFQW2J1ZmZlclsxMV1dICtcbiAgICBMT1dFUl9DQVNFX01BUFtidWZmZXJbMTJdXSArXG4gICAgTE9XRVJfQ0FTRV9NQVBbYnVmZmVyWzEzXV0gK1xuICAgIExPV0VSX0NBU0VfTUFQW2J1ZmZlclsxNF1dICtcbiAgICBMT1dFUl9DQVNFX01BUFtidWZmZXJbMTVdXVxuICApO1xufVxuXG5jb25zdCBDSEFSQ09ERU1BUDogeyBba2V5OiBudW1iZXJdOiB7IFtrZXk6IG51bWJlcl06IG51bWJlciB9IH0gPSB7fTtcblxuY29uc3QgaGV4RGlnaXRzID0gW1xuICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsXG4gICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsXG4gICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRidcbl0ubWFwKChkKSA9PiBkLmNoYXJDb2RlQXQoMCkpO1xuXG5mb3IgKGxldCBpID0gMDsgaSA8IGhleERpZ2l0cy5sZW5ndGg7IGkrKykge1xuICBjb25zdCBtYXA6IHsgW2tleTogbnVtYmVyXTogbnVtYmVyIH0gPSBDSEFSQ09ERU1BUFtoZXhEaWdpdHNbaV1dID0ge307XG4gIGZvciAobGV0IGogPSAwOyBqIDwgaGV4RGlnaXRzLmxlbmd0aDsgaisrKSB7XG4gICAgY29uc3QgaGV4ID0gU3RyaW5nLmZyb21DaGFyQ29kZShoZXhEaWdpdHNbaV0sIGhleERpZ2l0c1tqXSk7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUludChoZXgsIDE2KTtcbiAgICBtYXBbaGV4RGlnaXRzW2pdXSA9IHZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBndWlkVG9BcnJheShndWlkOiBzdHJpbmcpIHtcbiAgcmV0dXJuIFtcbiAgICBDSEFSQ09ERU1BUFtndWlkLmNoYXJDb2RlQXQoNildW2d1aWQuY2hhckNvZGVBdCg3KV0sXG4gICAgQ0hBUkNPREVNQVBbZ3VpZC5jaGFyQ29kZUF0KDQpXVtndWlkLmNoYXJDb2RlQXQoNSldLFxuICAgIENIQVJDT0RFTUFQW2d1aWQuY2hhckNvZGVBdCgyKV1bZ3VpZC5jaGFyQ29kZUF0KDMpXSxcbiAgICBDSEFSQ09ERU1BUFtndWlkLmNoYXJDb2RlQXQoMCldW2d1aWQuY2hhckNvZGVBdCgxKV0sXG4gICAgQ0hBUkNPREVNQVBbZ3VpZC5jaGFyQ29kZUF0KDExKV1bZ3VpZC5jaGFyQ29kZUF0KDEyKV0sXG4gICAgQ0hBUkNPREVNQVBbZ3VpZC5jaGFyQ29kZUF0KDkpXVtndWlkLmNoYXJDb2RlQXQoMTApXSxcbiAgICBDSEFSQ09ERU1BUFtndWlkLmNoYXJDb2RlQXQoMTYpXVtndWlkLmNoYXJDb2RlQXQoMTcpXSxcbiAgICBDSEFSQ09ERU1BUFtndWlkLmNoYXJDb2RlQXQoMTQpXVtndWlkLmNoYXJDb2RlQXQoMTUpXSxcbiAgICBDSEFSQ09ERU1BUFtndWlkLmNoYXJDb2RlQXQoMTkpXVtndWlkLmNoYXJDb2RlQXQoMjApXSxcbiAgICBDSEFSQ09ERU1BUFtndWlkLmNoYXJDb2RlQXQoMjEpXVtndWlkLmNoYXJDb2RlQXQoMjIpXSxcbiAgICBDSEFSQ09ERU1BUFtndWlkLmNoYXJDb2RlQXQoMjQpXVtndWlkLmNoYXJDb2RlQXQoMjUpXSxcbiAgICBDSEFSQ09ERU1BUFtndWlkLmNoYXJDb2RlQXQoMjYpXVtndWlkLmNoYXJDb2RlQXQoMjcpXSxcbiAgICBDSEFSQ09ERU1BUFtndWlkLmNoYXJDb2RlQXQoMjgpXVtndWlkLmNoYXJDb2RlQXQoMjkpXSxcbiAgICBDSEFSQ09ERU1BUFtndWlkLmNoYXJDb2RlQXQoMzApXVtndWlkLmNoYXJDb2RlQXQoMzEpXSxcbiAgICBDSEFSQ09ERU1BUFtndWlkLmNoYXJDb2RlQXQoMzIpXVtndWlkLmNoYXJDb2RlQXQoMzMpXSxcbiAgICBDSEFSQ09ERU1BUFtndWlkLmNoYXJDb2RlQXQoMzQpXVtndWlkLmNoYXJDb2RlQXQoMzUpXVxuICBdO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLE1BQU1BLGNBQWMsR0FBRyxDQUNyQixJQURxQixFQUNmLElBRGUsRUFDVCxJQURTLEVBQ0gsSUFERyxFQUNHLElBREgsRUFDUyxJQURULEVBQ2UsSUFEZixFQUNxQixJQURyQixFQUMyQixJQUQzQixFQUNpQyxJQURqQyxFQUN1QyxJQUR2QyxFQUM2QyxJQUQ3QyxFQUNtRCxJQURuRCxFQUN5RCxJQUR6RCxFQUMrRCxJQUQvRCxFQUNxRSxJQURyRSxFQUVyQixJQUZxQixFQUVmLElBRmUsRUFFVCxJQUZTLEVBRUgsSUFGRyxFQUVHLElBRkgsRUFFUyxJQUZULEVBRWUsSUFGZixFQUVxQixJQUZyQixFQUUyQixJQUYzQixFQUVpQyxJQUZqQyxFQUV1QyxJQUZ2QyxFQUU2QyxJQUY3QyxFQUVtRCxJQUZuRCxFQUV5RCxJQUZ6RCxFQUUrRCxJQUYvRCxFQUVxRSxJQUZyRSxFQUdyQixJQUhxQixFQUdmLElBSGUsRUFHVCxJQUhTLEVBR0gsSUFIRyxFQUdHLElBSEgsRUFHUyxJQUhULEVBR2UsSUFIZixFQUdxQixJQUhyQixFQUcyQixJQUgzQixFQUdpQyxJQUhqQyxFQUd1QyxJQUh2QyxFQUc2QyxJQUg3QyxFQUdtRCxJQUhuRCxFQUd5RCxJQUh6RCxFQUcrRCxJQUgvRCxFQUdxRSxJQUhyRSxFQUlyQixJQUpxQixFQUlmLElBSmUsRUFJVCxJQUpTLEVBSUgsSUFKRyxFQUlHLElBSkgsRUFJUyxJQUpULEVBSWUsSUFKZixFQUlxQixJQUpyQixFQUkyQixJQUozQixFQUlpQyxJQUpqQyxFQUl1QyxJQUp2QyxFQUk2QyxJQUo3QyxFQUltRCxJQUpuRCxFQUl5RCxJQUp6RCxFQUkrRCxJQUovRCxFQUlxRSxJQUpyRSxFQUtyQixJQUxxQixFQUtmLElBTGUsRUFLVCxJQUxTLEVBS0gsSUFMRyxFQUtHLElBTEgsRUFLUyxJQUxULEVBS2UsSUFMZixFQUtxQixJQUxyQixFQUsyQixJQUwzQixFQUtpQyxJQUxqQyxFQUt1QyxJQUx2QyxFQUs2QyxJQUw3QyxFQUttRCxJQUxuRCxFQUt5RCxJQUx6RCxFQUsrRCxJQUwvRCxFQUtxRSxJQUxyRSxFQU1yQixJQU5xQixFQU1mLElBTmUsRUFNVCxJQU5TLEVBTUgsSUFORyxFQU1HLElBTkgsRUFNUyxJQU5ULEVBTWUsSUFOZixFQU1xQixJQU5yQixFQU0yQixJQU4zQixFQU1pQyxJQU5qQyxFQU11QyxJQU52QyxFQU02QyxJQU43QyxFQU1tRCxJQU5uRCxFQU15RCxJQU56RCxFQU0rRCxJQU4vRCxFQU1xRSxJQU5yRSxFQU9yQixJQVBxQixFQU9mLElBUGUsRUFPVCxJQVBTLEVBT0gsSUFQRyxFQU9HLElBUEgsRUFPUyxJQVBULEVBT2UsSUFQZixFQU9xQixJQVByQixFQU8yQixJQVAzQixFQU9pQyxJQVBqQyxFQU91QyxJQVB2QyxFQU82QyxJQVA3QyxFQU9tRCxJQVBuRCxFQU95RCxJQVB6RCxFQU8rRCxJQVAvRCxFQU9xRSxJQVByRSxFQVFyQixJQVJxQixFQVFmLElBUmUsRUFRVCxJQVJTLEVBUUgsSUFSRyxFQVFHLElBUkgsRUFRUyxJQVJULEVBUWUsSUFSZixFQVFxQixJQVJyQixFQVEyQixJQVIzQixFQVFpQyxJQVJqQyxFQVF1QyxJQVJ2QyxFQVE2QyxJQVI3QyxFQVFtRCxJQVJuRCxFQVF5RCxJQVJ6RCxFQVErRCxJQVIvRCxFQVFxRSxJQVJyRSxFQVNyQixJQVRxQixFQVNmLElBVGUsRUFTVCxJQVRTLEVBU0gsSUFURyxFQVNHLElBVEgsRUFTUyxJQVRULEVBU2UsSUFUZixFQVNxQixJQVRyQixFQVMyQixJQVQzQixFQVNpQyxJQVRqQyxFQVN1QyxJQVR2QyxFQVM2QyxJQVQ3QyxFQVNtRCxJQVRuRCxFQVN5RCxJQVR6RCxFQVMrRCxJQVQvRCxFQVNxRSxJQVRyRSxFQVVyQixJQVZxQixFQVVmLElBVmUsRUFVVCxJQVZTLEVBVUgsSUFWRyxFQVVHLElBVkgsRUFVUyxJQVZULEVBVWUsSUFWZixFQVVxQixJQVZyQixFQVUyQixJQVYzQixFQVVpQyxJQVZqQyxFQVV1QyxJQVZ2QyxFQVU2QyxJQVY3QyxFQVVtRCxJQVZuRCxFQVV5RCxJQVZ6RCxFQVUrRCxJQVYvRCxFQVVxRSxJQVZyRSxFQVdyQixJQVhxQixFQVdmLElBWGUsRUFXVCxJQVhTLEVBV0gsSUFYRyxFQVdHLElBWEgsRUFXUyxJQVhULEVBV2UsSUFYZixFQVdxQixJQVhyQixFQVcyQixJQVgzQixFQVdpQyxJQVhqQyxFQVd1QyxJQVh2QyxFQVc2QyxJQVg3QyxFQVdtRCxJQVhuRCxFQVd5RCxJQVh6RCxFQVcrRCxJQVgvRCxFQVdxRSxJQVhyRSxFQVlyQixJQVpxQixFQVlmLElBWmUsRUFZVCxJQVpTLEVBWUgsSUFaRyxFQVlHLElBWkgsRUFZUyxJQVpULEVBWWUsSUFaZixFQVlxQixJQVpyQixFQVkyQixJQVozQixFQVlpQyxJQVpqQyxFQVl1QyxJQVp2QyxFQVk2QyxJQVo3QyxFQVltRCxJQVpuRCxFQVl5RCxJQVp6RCxFQVkrRCxJQVovRCxFQVlxRSxJQVpyRSxFQWFyQixJQWJxQixFQWFmLElBYmUsRUFhVCxJQWJTLEVBYUgsSUFiRyxFQWFHLElBYkgsRUFhUyxJQWJULEVBYWUsSUFiZixFQWFxQixJQWJyQixFQWEyQixJQWIzQixFQWFpQyxJQWJqQyxFQWF1QyxJQWJ2QyxFQWE2QyxJQWI3QyxFQWFtRCxJQWJuRCxFQWF5RCxJQWJ6RCxFQWErRCxJQWIvRCxFQWFxRSxJQWJyRSxFQWNyQixJQWRxQixFQWNmLElBZGUsRUFjVCxJQWRTLEVBY0gsSUFkRyxFQWNHLElBZEgsRUFjUyxJQWRULEVBY2UsSUFkZixFQWNxQixJQWRyQixFQWMyQixJQWQzQixFQWNpQyxJQWRqQyxFQWN1QyxJQWR2QyxFQWM2QyxJQWQ3QyxFQWNtRCxJQWRuRCxFQWN5RCxJQWR6RCxFQWMrRCxJQWQvRCxFQWNxRSxJQWRyRSxFQWVyQixJQWZxQixFQWVmLElBZmUsRUFlVCxJQWZTLEVBZUgsSUFmRyxFQWVHLElBZkgsRUFlUyxJQWZULEVBZWUsSUFmZixFQWVxQixJQWZyQixFQWUyQixJQWYzQixFQWVpQyxJQWZqQyxFQWV1QyxJQWZ2QyxFQWU2QyxJQWY3QyxFQWVtRCxJQWZuRCxFQWV5RCxJQWZ6RCxFQWUrRCxJQWYvRCxFQWVxRSxJQWZyRSxFQWdCckIsSUFoQnFCLEVBZ0JmLElBaEJlLEVBZ0JULElBaEJTLEVBZ0JILElBaEJHLEVBZ0JHLElBaEJILEVBZ0JTLElBaEJULEVBZ0JlLElBaEJmLEVBZ0JxQixJQWhCckIsRUFnQjJCLElBaEIzQixFQWdCaUMsSUFoQmpDLEVBZ0J1QyxJQWhCdkMsRUFnQjZDLElBaEI3QyxFQWdCbUQsSUFoQm5ELEVBZ0J5RCxJQWhCekQsRUFnQitELElBaEIvRCxFQWdCcUUsSUFoQnJFLENBQXZCO0FBbUJBLE1BQU1DLGNBQWMsR0FBRyxDQUNyQixJQURxQixFQUNmLElBRGUsRUFDVCxJQURTLEVBQ0gsSUFERyxFQUNHLElBREgsRUFDUyxJQURULEVBQ2UsSUFEZixFQUNxQixJQURyQixFQUMyQixJQUQzQixFQUNpQyxJQURqQyxFQUN1QyxJQUR2QyxFQUM2QyxJQUQ3QyxFQUNtRCxJQURuRCxFQUN5RCxJQUR6RCxFQUMrRCxJQUQvRCxFQUNxRSxJQURyRSxFQUVyQixJQUZxQixFQUVmLElBRmUsRUFFVCxJQUZTLEVBRUgsSUFGRyxFQUVHLElBRkgsRUFFUyxJQUZULEVBRWUsSUFGZixFQUVxQixJQUZyQixFQUUyQixJQUYzQixFQUVpQyxJQUZqQyxFQUV1QyxJQUZ2QyxFQUU2QyxJQUY3QyxFQUVtRCxJQUZuRCxFQUV5RCxJQUZ6RCxFQUUrRCxJQUYvRCxFQUVxRSxJQUZyRSxFQUdyQixJQUhxQixFQUdmLElBSGUsRUFHVCxJQUhTLEVBR0gsSUFIRyxFQUdHLElBSEgsRUFHUyxJQUhULEVBR2UsSUFIZixFQUdxQixJQUhyQixFQUcyQixJQUgzQixFQUdpQyxJQUhqQyxFQUd1QyxJQUh2QyxFQUc2QyxJQUg3QyxFQUdtRCxJQUhuRCxFQUd5RCxJQUh6RCxFQUcrRCxJQUgvRCxFQUdxRSxJQUhyRSxFQUlyQixJQUpxQixFQUlmLElBSmUsRUFJVCxJQUpTLEVBSUgsSUFKRyxFQUlHLElBSkgsRUFJUyxJQUpULEVBSWUsSUFKZixFQUlxQixJQUpyQixFQUkyQixJQUozQixFQUlpQyxJQUpqQyxFQUl1QyxJQUp2QyxFQUk2QyxJQUo3QyxFQUltRCxJQUpuRCxFQUl5RCxJQUp6RCxFQUkrRCxJQUovRCxFQUlxRSxJQUpyRSxFQUtyQixJQUxxQixFQUtmLElBTGUsRUFLVCxJQUxTLEVBS0gsSUFMRyxFQUtHLElBTEgsRUFLUyxJQUxULEVBS2UsSUFMZixFQUtxQixJQUxyQixFQUsyQixJQUwzQixFQUtpQyxJQUxqQyxFQUt1QyxJQUx2QyxFQUs2QyxJQUw3QyxFQUttRCxJQUxuRCxFQUt5RCxJQUx6RCxFQUsrRCxJQUwvRCxFQUtxRSxJQUxyRSxFQU1yQixJQU5xQixFQU1mLElBTmUsRUFNVCxJQU5TLEVBTUgsSUFORyxFQU1HLElBTkgsRUFNUyxJQU5ULEVBTWUsSUFOZixFQU1xQixJQU5yQixFQU0yQixJQU4zQixFQU1pQyxJQU5qQyxFQU11QyxJQU52QyxFQU02QyxJQU43QyxFQU1tRCxJQU5uRCxFQU15RCxJQU56RCxFQU0rRCxJQU4vRCxFQU1xRSxJQU5yRSxFQU9yQixJQVBxQixFQU9mLElBUGUsRUFPVCxJQVBTLEVBT0gsSUFQRyxFQU9HLElBUEgsRUFPUyxJQVBULEVBT2UsSUFQZixFQU9xQixJQVByQixFQU8yQixJQVAzQixFQU9pQyxJQVBqQyxFQU91QyxJQVB2QyxFQU82QyxJQVA3QyxFQU9tRCxJQVBuRCxFQU95RCxJQVB6RCxFQU8rRCxJQVAvRCxFQU9xRSxJQVByRSxFQVFyQixJQVJxQixFQVFmLElBUmUsRUFRVCxJQVJTLEVBUUgsSUFSRyxFQVFHLElBUkgsRUFRUyxJQVJULEVBUWUsSUFSZixFQVFxQixJQVJyQixFQVEyQixJQVIzQixFQVFpQyxJQVJqQyxFQVF1QyxJQVJ2QyxFQVE2QyxJQVI3QyxFQVFtRCxJQVJuRCxFQVF5RCxJQVJ6RCxFQVErRCxJQVIvRCxFQVFxRSxJQVJyRSxFQVNyQixJQVRxQixFQVNmLElBVGUsRUFTVCxJQVRTLEVBU0gsSUFURyxFQVNHLElBVEgsRUFTUyxJQVRULEVBU2UsSUFUZixFQVNxQixJQVRyQixFQVMyQixJQVQzQixFQVNpQyxJQVRqQyxFQVN1QyxJQVR2QyxFQVM2QyxJQVQ3QyxFQVNtRCxJQVRuRCxFQVN5RCxJQVR6RCxFQVMrRCxJQVQvRCxFQVNxRSxJQVRyRSxFQVVyQixJQVZxQixFQVVmLElBVmUsRUFVVCxJQVZTLEVBVUgsSUFWRyxFQVVHLElBVkgsRUFVUyxJQVZULEVBVWUsSUFWZixFQVVxQixJQVZyQixFQVUyQixJQVYzQixFQVVpQyxJQVZqQyxFQVV1QyxJQVZ2QyxFQVU2QyxJQVY3QyxFQVVtRCxJQVZuRCxFQVV5RCxJQVZ6RCxFQVUrRCxJQVYvRCxFQVVxRSxJQVZyRSxFQVdyQixJQVhxQixFQVdmLElBWGUsRUFXVCxJQVhTLEVBV0gsSUFYRyxFQVdHLElBWEgsRUFXUyxJQVhULEVBV2UsSUFYZixFQVdxQixJQVhyQixFQVcyQixJQVgzQixFQVdpQyxJQVhqQyxFQVd1QyxJQVh2QyxFQVc2QyxJQVg3QyxFQVdtRCxJQVhuRCxFQVd5RCxJQVh6RCxFQVcrRCxJQVgvRCxFQVdxRSxJQVhyRSxFQVlyQixJQVpxQixFQVlmLElBWmUsRUFZVCxJQVpTLEVBWUgsSUFaRyxFQVlHLElBWkgsRUFZUyxJQVpULEVBWWUsSUFaZixFQVlxQixJQVpyQixFQVkyQixJQVozQixFQVlpQyxJQVpqQyxFQVl1QyxJQVp2QyxFQVk2QyxJQVo3QyxFQVltRCxJQVpuRCxFQVl5RCxJQVp6RCxFQVkrRCxJQVovRCxFQVlxRSxJQVpyRSxFQWFyQixJQWJxQixFQWFmLElBYmUsRUFhVCxJQWJTLEVBYUgsSUFiRyxFQWFHLElBYkgsRUFhUyxJQWJULEVBYWUsSUFiZixFQWFxQixJQWJyQixFQWEyQixJQWIzQixFQWFpQyxJQWJqQyxFQWF1QyxJQWJ2QyxFQWE2QyxJQWI3QyxFQWFtRCxJQWJuRCxFQWF5RCxJQWJ6RCxFQWErRCxJQWIvRCxFQWFxRSxJQWJyRSxFQWNyQixJQWRxQixFQWNmLElBZGUsRUFjVCxJQWRTLEVBY0gsSUFkRyxFQWNHLElBZEgsRUFjUyxJQWRULEVBY2UsSUFkZixFQWNxQixJQWRyQixFQWMyQixJQWQzQixFQWNpQyxJQWRqQyxFQWN1QyxJQWR2QyxFQWM2QyxJQWQ3QyxFQWNtRCxJQWRuRCxFQWN5RCxJQWR6RCxFQWMrRCxJQWQvRCxFQWNxRSxJQWRyRSxFQWVyQixJQWZxQixFQWVmLElBZmUsRUFlVCxJQWZTLEVBZUgsSUFmRyxFQWVHLElBZkgsRUFlUyxJQWZULEVBZWUsSUFmZixFQWVxQixJQWZyQixFQWUyQixJQWYzQixFQWVpQyxJQWZqQyxFQWV1QyxJQWZ2QyxFQWU2QyxJQWY3QyxFQWVtRCxJQWZuRCxFQWV5RCxJQWZ6RCxFQWUrRCxJQWYvRCxFQWVxRSxJQWZyRSxFQWdCckIsSUFoQnFCLEVBZ0JmLElBaEJlLEVBZ0JULElBaEJTLEVBZ0JILElBaEJHLEVBZ0JHLElBaEJILEVBZ0JTLElBaEJULEVBZ0JlLElBaEJmLEVBZ0JxQixJQWhCckIsRUFnQjJCLElBaEIzQixFQWdCaUMsSUFoQmpDLEVBZ0J1QyxJQWhCdkMsRUFnQjZDLElBaEI3QyxFQWdCbUQsSUFoQm5ELEVBZ0J5RCxJQWhCekQsRUFnQitELElBaEIvRCxFQWdCcUUsSUFoQnJFLENBQXZCOztBQW1CTyxTQUFTQyxxQkFBVCxDQUErQkMsTUFBL0IsRUFBK0M7RUFDcEQsT0FDRUgsY0FBYyxDQUFDRyxNQUFNLENBQUMsQ0FBRCxDQUFQLENBQWQsR0FDQUgsY0FBYyxDQUFDRyxNQUFNLENBQUMsQ0FBRCxDQUFQLENBRGQsR0FFQUgsY0FBYyxDQUFDRyxNQUFNLENBQUMsQ0FBRCxDQUFQLENBRmQsR0FHQUgsY0FBYyxDQUFDRyxNQUFNLENBQUMsQ0FBRCxDQUFQLENBSGQsR0FJQSxHQUpBLEdBS0FILGNBQWMsQ0FBQ0csTUFBTSxDQUFDLENBQUQsQ0FBUCxDQUxkLEdBTUFILGNBQWMsQ0FBQ0csTUFBTSxDQUFDLENBQUQsQ0FBUCxDQU5kLEdBT0EsR0FQQSxHQVFBSCxjQUFjLENBQUNHLE1BQU0sQ0FBQyxDQUFELENBQVAsQ0FSZCxHQVNBSCxjQUFjLENBQUNHLE1BQU0sQ0FBQyxDQUFELENBQVAsQ0FUZCxHQVVBLEdBVkEsR0FXQUgsY0FBYyxDQUFDRyxNQUFNLENBQUMsQ0FBRCxDQUFQLENBWGQsR0FZQUgsY0FBYyxDQUFDRyxNQUFNLENBQUMsQ0FBRCxDQUFQLENBWmQsR0FhQSxHQWJBLEdBY0FILGNBQWMsQ0FBQ0csTUFBTSxDQUFDLEVBQUQsQ0FBUCxDQWRkLEdBZUFILGNBQWMsQ0FBQ0csTUFBTSxDQUFDLEVBQUQsQ0FBUCxDQWZkLEdBZ0JBSCxjQUFjLENBQUNHLE1BQU0sQ0FBQyxFQUFELENBQVAsQ0FoQmQsR0FpQkFILGNBQWMsQ0FBQ0csTUFBTSxDQUFDLEVBQUQsQ0FBUCxDQWpCZCxHQWtCQUgsY0FBYyxDQUFDRyxNQUFNLENBQUMsRUFBRCxDQUFQLENBbEJkLEdBbUJBSCxjQUFjLENBQUNHLE1BQU0sQ0FBQyxFQUFELENBQVAsQ0FwQmhCO0FBc0JEOztBQUVNLFNBQVNDLHFCQUFULENBQStCRCxNQUEvQixFQUErQztFQUNwRCxPQUNFRixjQUFjLENBQUNFLE1BQU0sQ0FBQyxDQUFELENBQVAsQ0FBZCxHQUNBRixjQUFjLENBQUNFLE1BQU0sQ0FBQyxDQUFELENBQVAsQ0FEZCxHQUVBRixjQUFjLENBQUNFLE1BQU0sQ0FBQyxDQUFELENBQVAsQ0FGZCxHQUdBRixjQUFjLENBQUNFLE1BQU0sQ0FBQyxDQUFELENBQVAsQ0FIZCxHQUlBLEdBSkEsR0FLQUYsY0FBYyxDQUFDRSxNQUFNLENBQUMsQ0FBRCxDQUFQLENBTGQsR0FNQUYsY0FBYyxDQUFDRSxNQUFNLENBQUMsQ0FBRCxDQUFQLENBTmQsR0FPQSxHQVBBLEdBUUFGLGNBQWMsQ0FBQ0UsTUFBTSxDQUFDLENBQUQsQ0FBUCxDQVJkLEdBU0FGLGNBQWMsQ0FBQ0UsTUFBTSxDQUFDLENBQUQsQ0FBUCxDQVRkLEdBVUEsR0FWQSxHQVdBRixjQUFjLENBQUNFLE1BQU0sQ0FBQyxDQUFELENBQVAsQ0FYZCxHQVlBRixjQUFjLENBQUNFLE1BQU0sQ0FBQyxDQUFELENBQVAsQ0FaZCxHQWFBLEdBYkEsR0FjQUYsY0FBYyxDQUFDRSxNQUFNLENBQUMsRUFBRCxDQUFQLENBZGQsR0FlQUYsY0FBYyxDQUFDRSxNQUFNLENBQUMsRUFBRCxDQUFQLENBZmQsR0FnQkFGLGNBQWMsQ0FBQ0UsTUFBTSxDQUFDLEVBQUQsQ0FBUCxDQWhCZCxHQWlCQUYsY0FBYyxDQUFDRSxNQUFNLENBQUMsRUFBRCxDQUFQLENBakJkLEdBa0JBRixjQUFjLENBQUNFLE1BQU0sQ0FBQyxFQUFELENBQVAsQ0FsQmQsR0FtQkFGLGNBQWMsQ0FBQ0UsTUFBTSxDQUFDLEVBQUQsQ0FBUCxDQXBCaEI7QUFzQkQ7O0FBRUQsTUFBTUUsV0FBeUQsR0FBRyxFQUFsRTtBQUVBLE1BQU1DLFNBQVMsR0FBRyxDQUNoQixHQURnQixFQUNYLEdBRFcsRUFDTixHQURNLEVBQ0QsR0FEQyxFQUNJLEdBREosRUFDUyxHQURULEVBQ2MsR0FEZCxFQUNtQixHQURuQixFQUN3QixHQUR4QixFQUM2QixHQUQ3QixFQUVoQixHQUZnQixFQUVYLEdBRlcsRUFFTixHQUZNLEVBRUQsR0FGQyxFQUVJLEdBRkosRUFFUyxHQUZULEVBR2hCLEdBSGdCLEVBR1gsR0FIVyxFQUdOLEdBSE0sRUFHRCxHQUhDLEVBR0ksR0FISixFQUdTLEdBSFQsRUFJaEJDLEdBSmdCLENBSVhDLENBQUQsSUFBT0EsQ0FBQyxDQUFDQyxVQUFGLENBQWEsQ0FBYixDQUpLLENBQWxCOztBQU1BLEtBQUssSUFBSUMsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR0osU0FBUyxDQUFDSyxNQUE5QixFQUFzQ0QsQ0FBQyxFQUF2QyxFQUEyQztFQUN6QyxNQUFNSCxHQUE4QixHQUFHRixXQUFXLENBQUNDLFNBQVMsQ0FBQ0ksQ0FBRCxDQUFWLENBQVgsR0FBNEIsRUFBbkU7O0VBQ0EsS0FBSyxJQUFJRSxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHTixTQUFTLENBQUNLLE1BQTlCLEVBQXNDQyxDQUFDLEVBQXZDLEVBQTJDO0lBQ3pDLE1BQU1DLEdBQUcsR0FBR0MsTUFBTSxDQUFDQyxZQUFQLENBQW9CVCxTQUFTLENBQUNJLENBQUQsQ0FBN0IsRUFBa0NKLFNBQVMsQ0FBQ00sQ0FBRCxDQUEzQyxDQUFaO0lBQ0EsTUFBTUksS0FBSyxHQUFHQyxRQUFRLENBQUNKLEdBQUQsRUFBTSxFQUFOLENBQXRCO0lBQ0FOLEdBQUcsQ0FBQ0QsU0FBUyxDQUFDTSxDQUFELENBQVYsQ0FBSCxHQUFvQkksS0FBcEI7RUFDRDtBQUNGOztBQUVNLFNBQVNFLFdBQVQsQ0FBcUJDLElBQXJCLEVBQW1DO0VBQ3hDLE9BQU8sQ0FDTGQsV0FBVyxDQUFDYyxJQUFJLENBQUNWLFVBQUwsQ0FBZ0IsQ0FBaEIsQ0FBRCxDQUFYLENBQWdDVSxJQUFJLENBQUNWLFVBQUwsQ0FBZ0IsQ0FBaEIsQ0FBaEMsQ0FESyxFQUVMSixXQUFXLENBQUNjLElBQUksQ0FBQ1YsVUFBTCxDQUFnQixDQUFoQixDQUFELENBQVgsQ0FBZ0NVLElBQUksQ0FBQ1YsVUFBTCxDQUFnQixDQUFoQixDQUFoQyxDQUZLLEVBR0xKLFdBQVcsQ0FBQ2MsSUFBSSxDQUFDVixVQUFMLENBQWdCLENBQWhCLENBQUQsQ0FBWCxDQUFnQ1UsSUFBSSxDQUFDVixVQUFMLENBQWdCLENBQWhCLENBQWhDLENBSEssRUFJTEosV0FBVyxDQUFDYyxJQUFJLENBQUNWLFVBQUwsQ0FBZ0IsQ0FBaEIsQ0FBRCxDQUFYLENBQWdDVSxJQUFJLENBQUNWLFVBQUwsQ0FBZ0IsQ0FBaEIsQ0FBaEMsQ0FKSyxFQUtMSixXQUFXLENBQUNjLElBQUksQ0FBQ1YsVUFBTCxDQUFnQixFQUFoQixDQUFELENBQVgsQ0FBaUNVLElBQUksQ0FBQ1YsVUFBTCxDQUFnQixFQUFoQixDQUFqQyxDQUxLLEVBTUxKLFdBQVcsQ0FBQ2MsSUFBSSxDQUFDVixVQUFMLENBQWdCLENBQWhCLENBQUQsQ0FBWCxDQUFnQ1UsSUFBSSxDQUFDVixVQUFMLENBQWdCLEVBQWhCLENBQWhDLENBTkssRUFPTEosV0FBVyxDQUFDYyxJQUFJLENBQUNWLFVBQUwsQ0FBZ0IsRUFBaEIsQ0FBRCxDQUFYLENBQWlDVSxJQUFJLENBQUNWLFVBQUwsQ0FBZ0IsRUFBaEIsQ0FBakMsQ0FQSyxFQVFMSixXQUFXLENBQUNjLElBQUksQ0FBQ1YsVUFBTCxDQUFnQixFQUFoQixDQUFELENBQVgsQ0FBaUNVLElBQUksQ0FBQ1YsVUFBTCxDQUFnQixFQUFoQixDQUFqQyxDQVJLLEVBU0xKLFdBQVcsQ0FBQ2MsSUFBSSxDQUFDVixVQUFMLENBQWdCLEVBQWhCLENBQUQsQ0FBWCxDQUFpQ1UsSUFBSSxDQUFDVixVQUFMLENBQWdCLEVBQWhCLENBQWpDLENBVEssRUFVTEosV0FBVyxDQUFDYyxJQUFJLENBQUNWLFVBQUwsQ0FBZ0IsRUFBaEIsQ0FBRCxDQUFYLENBQWlDVSxJQUFJLENBQUNWLFVBQUwsQ0FBZ0IsRUFBaEIsQ0FBakMsQ0FWSyxFQVdMSixXQUFXLENBQUNjLElBQUksQ0FBQ1YsVUFBTCxDQUFnQixFQUFoQixDQUFELENBQVgsQ0FBaUNVLElBQUksQ0FBQ1YsVUFBTCxDQUFnQixFQUFoQixDQUFqQyxDQVhLLEVBWUxKLFdBQVcsQ0FBQ2MsSUFBSSxDQUFDVixVQUFMLENBQWdCLEVBQWhCLENBQUQsQ0FBWCxDQUFpQ1UsSUFBSSxDQUFDVixVQUFMLENBQWdCLEVBQWhCLENBQWpDLENBWkssRUFhTEosV0FBVyxDQUFDYyxJQUFJLENBQUNWLFVBQUwsQ0FBZ0IsRUFBaEIsQ0FBRCxDQUFYLENBQWlDVSxJQUFJLENBQUNWLFVBQUwsQ0FBZ0IsRUFBaEIsQ0FBakMsQ0FiSyxFQWNMSixXQUFXLENBQUNjLElBQUksQ0FBQ1YsVUFBTCxDQUFnQixFQUFoQixDQUFELENBQVgsQ0FBaUNVLElBQUksQ0FBQ1YsVUFBTCxDQUFnQixFQUFoQixDQUFqQyxDQWRLLEVBZUxKLFdBQVcsQ0FBQ2MsSUFBSSxDQUFDVixVQUFMLENBQWdCLEVBQWhCLENBQUQsQ0FBWCxDQUFpQ1UsSUFBSSxDQUFDVixVQUFMLENBQWdCLEVBQWhCLENBQWpDLENBZkssRUFnQkxKLFdBQVcsQ0FBQ2MsSUFBSSxDQUFDVixVQUFMLENBQWdCLEVBQWhCLENBQUQsQ0FBWCxDQUFpQ1UsSUFBSSxDQUFDVixVQUFMLENBQWdCLEVBQWhCLENBQWpDLENBaEJLLENBQVA7QUFrQkQifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _bl = _interopRequireDefault(require("bl"));

var _stream = require("stream");

var _message = _interopRequireDefault(require("./message"));

var _packet = require("./packet");

var _errors = require("./errors");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/**
  IncomingMessageStream
  Transform received TDS data into individual IncomingMessage streams.
*/
class IncomingMessageStream extends _stream.Transform {
  constructor(debug) {
    super({
      readableObjectMode: true
    });
    this.debug = void 0;
    this.bl = void 0;
    this.currentMessage = void 0;
    this.debug = debug;
    this.currentMessage = undefined;
    this.bl = new _bl.default();
  }

  pause() {
    super.pause();

    if (this.currentMessage) {
      this.currentMessage.pause();
    }

    return this;
  }

  resume() {
    super.resume();

    if (this.currentMessage) {
      this.currentMessage.resume();
    }

    return this;
  }

  processBufferedData(callback) {
    // The packet header is always 8 bytes of length.
    while (this.bl.length >= _packet.HEADER_LENGTH) {
      // Get the full packet length
      const length = this.bl.readUInt16BE(2);

      if (length < _packet.HEADER_LENGTH) {
        return callback(new _errors.ConnectionError('Unable to process incoming packet'));
      }

      if (this.bl.length >= length) {
        const data = this.bl.slice(0, length);
        this.bl.consume(length); // TODO: Get rid of creating `Packet` instances here.

        const packet = new _packet.Packet(data);
        this.debug.packet('Received', packet);
        this.debug.data(packet);
        let message = this.currentMessage;

        if (message === undefined) {
          this.currentMessage = message = new _message.default({
            type: packet.type(),
            resetConnection: false
          });
          this.push(message);
        }

        if (packet.isLast()) {
          // Wait until the current message was fully processed before we
          // continue processing any remaining messages.
          message.once('end', () => {
            this.currentMessage = undefined;
            this.processBufferedData(callback);
          });
          message.end(packet.data());
          return;
        } else if (!message.write(packet.data())) {
          // If too much data is buffering up in the
          // current message, wait for it to drain.
          message.once('drain', () => {
            this.processBufferedData(callback);
          });
          return;
        }
      } else {
        break;
      }
    } // Not enough data to read the next packet. Stop here and wait for
    // the next call to `_transform`.


    callback();
  }

  _transform(chunk, _encoding, callback) {
    this.bl.append(chunk);
    this.processBufferedData(callback);
  }

}

var _default = IncomingMessageStream;
exports.default = _default;
module.exports = IncomingMessageStream;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbmNvbWluZ01lc3NhZ2VTdHJlYW0iLCJUcmFuc2Zvcm0iLCJjb25zdHJ1Y3RvciIsImRlYnVnIiwicmVhZGFibGVPYmplY3RNb2RlIiwiYmwiLCJjdXJyZW50TWVzc2FnZSIsInVuZGVmaW5lZCIsIkJ1ZmZlckxpc3QiLCJwYXVzZSIsInJlc3VtZSIsInByb2Nlc3NCdWZmZXJlZERhdGEiLCJjYWxsYmFjayIsImxlbmd0aCIsIkhFQURFUl9MRU5HVEgiLCJyZWFkVUludDE2QkUiLCJDb25uZWN0aW9uRXJyb3IiLCJkYXRhIiwic2xpY2UiLCJjb25zdW1lIiwicGFja2V0IiwiUGFja2V0IiwibWVzc2FnZSIsIk1lc3NhZ2UiLCJ0eXBlIiwicmVzZXRDb25uZWN0aW9uIiwicHVzaCIsImlzTGFzdCIsIm9uY2UiLCJlbmQiLCJ3cml0ZSIsIl90cmFuc2Zvcm0iLCJjaHVuayIsIl9lbmNvZGluZyIsImFwcGVuZCIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi9zcmMvaW5jb21pbmctbWVzc2FnZS1zdHJlYW0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJ1ZmZlckxpc3QgZnJvbSAnYmwnO1xuaW1wb3J0IHsgVHJhbnNmb3JtIH0gZnJvbSAnc3RyZWFtJztcblxuaW1wb3J0IERlYnVnIGZyb20gJy4vZGVidWcnO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSAnLi9tZXNzYWdlJztcbmltcG9ydCB7IFBhY2tldCwgSEVBREVSX0xFTkdUSCB9IGZyb20gJy4vcGFja2V0JztcbmltcG9ydCB7IENvbm5lY3Rpb25FcnJvciB9IGZyb20gJy4vZXJyb3JzJztcblxuLyoqXG4gIEluY29taW5nTWVzc2FnZVN0cmVhbVxuICBUcmFuc2Zvcm0gcmVjZWl2ZWQgVERTIGRhdGEgaW50byBpbmRpdmlkdWFsIEluY29taW5nTWVzc2FnZSBzdHJlYW1zLlxuKi9cbmNsYXNzIEluY29taW5nTWVzc2FnZVN0cmVhbSBleHRlbmRzIFRyYW5zZm9ybSB7XG4gIGRlYnVnOiBEZWJ1ZztcbiAgYmw6IGFueTtcbiAgY3VycmVudE1lc3NhZ2U6IE1lc3NhZ2UgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoZGVidWc6IERlYnVnKSB7XG4gICAgc3VwZXIoeyByZWFkYWJsZU9iamVjdE1vZGU6IHRydWUgfSk7XG5cbiAgICB0aGlzLmRlYnVnID0gZGVidWc7XG5cbiAgICB0aGlzLmN1cnJlbnRNZXNzYWdlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuYmwgPSBuZXcgQnVmZmVyTGlzdCgpO1xuICB9XG5cbiAgcGF1c2UoKSB7XG4gICAgc3VwZXIucGF1c2UoKTtcblxuICAgIGlmICh0aGlzLmN1cnJlbnRNZXNzYWdlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRNZXNzYWdlLnBhdXNlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICByZXN1bWUoKSB7XG4gICAgc3VwZXIucmVzdW1lKCk7XG5cbiAgICBpZiAodGhpcy5jdXJyZW50TWVzc2FnZSkge1xuICAgICAgdGhpcy5jdXJyZW50TWVzc2FnZS5yZXN1bWUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByb2Nlc3NCdWZmZXJlZERhdGEoY2FsbGJhY2s6IChlcnI/OiBDb25uZWN0aW9uRXJyb3IpID0+IHZvaWQpIHtcbiAgICAvLyBUaGUgcGFja2V0IGhlYWRlciBpcyBhbHdheXMgOCBieXRlcyBvZiBsZW5ndGguXG4gICAgd2hpbGUgKHRoaXMuYmwubGVuZ3RoID49IEhFQURFUl9MRU5HVEgpIHtcbiAgICAgIC8vIEdldCB0aGUgZnVsbCBwYWNrZXQgbGVuZ3RoXG4gICAgICBjb25zdCBsZW5ndGggPSB0aGlzLmJsLnJlYWRVSW50MTZCRSgyKTtcbiAgICAgIGlmIChsZW5ndGggPCBIRUFERVJfTEVOR1RIKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgQ29ubmVjdGlvbkVycm9yKCdVbmFibGUgdG8gcHJvY2VzcyBpbmNvbWluZyBwYWNrZXQnKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmJsLmxlbmd0aCA+PSBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuYmwuc2xpY2UoMCwgbGVuZ3RoKTtcbiAgICAgICAgdGhpcy5ibC5jb25zdW1lKGxlbmd0aCk7XG5cbiAgICAgICAgLy8gVE9ETzogR2V0IHJpZCBvZiBjcmVhdGluZyBgUGFja2V0YCBpbnN0YW5jZXMgaGVyZS5cbiAgICAgICAgY29uc3QgcGFja2V0ID0gbmV3IFBhY2tldChkYXRhKTtcbiAgICAgICAgdGhpcy5kZWJ1Zy5wYWNrZXQoJ1JlY2VpdmVkJywgcGFja2V0KTtcbiAgICAgICAgdGhpcy5kZWJ1Zy5kYXRhKHBhY2tldCk7XG5cbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0aGlzLmN1cnJlbnRNZXNzYWdlO1xuICAgICAgICBpZiAobWVzc2FnZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50TWVzc2FnZSA9IG1lc3NhZ2UgPSBuZXcgTWVzc2FnZSh7IHR5cGU6IHBhY2tldC50eXBlKCksIHJlc2V0Q29ubmVjdGlvbjogZmFsc2UgfSk7XG4gICAgICAgICAgdGhpcy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhY2tldC5pc0xhc3QoKSkge1xuICAgICAgICAgIC8vIFdhaXQgdW50aWwgdGhlIGN1cnJlbnQgbWVzc2FnZSB3YXMgZnVsbHkgcHJvY2Vzc2VkIGJlZm9yZSB3ZVxuICAgICAgICAgIC8vIGNvbnRpbnVlIHByb2Nlc3NpbmcgYW55IHJlbWFpbmluZyBtZXNzYWdlcy5cbiAgICAgICAgICBtZXNzYWdlLm9uY2UoJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE1lc3NhZ2UgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NCdWZmZXJlZERhdGEoY2FsbGJhY2spO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIG1lc3NhZ2UuZW5kKHBhY2tldC5kYXRhKCkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmICghbWVzc2FnZS53cml0ZShwYWNrZXQuZGF0YSgpKSkge1xuICAgICAgICAgIC8vIElmIHRvbyBtdWNoIGRhdGEgaXMgYnVmZmVyaW5nIHVwIGluIHRoZVxuICAgICAgICAgIC8vIGN1cnJlbnQgbWVzc2FnZSwgd2FpdCBmb3IgaXQgdG8gZHJhaW4uXG4gICAgICAgICAgbWVzc2FnZS5vbmNlKCdkcmFpbicsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0J1ZmZlcmVkRGF0YShjYWxsYmFjayk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBOb3QgZW5vdWdoIGRhdGEgdG8gcmVhZCB0aGUgbmV4dCBwYWNrZXQuIFN0b3AgaGVyZSBhbmQgd2FpdCBmb3JcbiAgICAvLyB0aGUgbmV4dCBjYWxsIHRvIGBfdHJhbnNmb3JtYC5cbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgX3RyYW5zZm9ybShjaHVuazogQnVmZmVyLCBfZW5jb2Rpbmc6IHN0cmluZywgY2FsbGJhY2s6ICgpID0+IHZvaWQpIHtcbiAgICB0aGlzLmJsLmFwcGVuZChjaHVuayk7XG4gICAgdGhpcy5wcm9jZXNzQnVmZmVyZWREYXRhKGNhbGxiYWNrKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbmNvbWluZ01lc3NhZ2VTdHJlYW07XG5tb2R1bGUuZXhwb3J0cyA9IEluY29taW5nTWVzc2FnZVN0cmVhbTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOzs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNQSxxQkFBTixTQUFvQ0MsaUJBQXBDLENBQThDO0VBSzVDQyxXQUFXLENBQUNDLEtBQUQsRUFBZTtJQUN4QixNQUFNO01BQUVDLGtCQUFrQixFQUFFO0lBQXRCLENBQU47SUFEd0IsS0FKMUJELEtBSTBCO0lBQUEsS0FIMUJFLEVBRzBCO0lBQUEsS0FGMUJDLGNBRTBCO0lBR3hCLEtBQUtILEtBQUwsR0FBYUEsS0FBYjtJQUVBLEtBQUtHLGNBQUwsR0FBc0JDLFNBQXRCO0lBQ0EsS0FBS0YsRUFBTCxHQUFVLElBQUlHLFdBQUosRUFBVjtFQUNEOztFQUVEQyxLQUFLLEdBQUc7SUFDTixNQUFNQSxLQUFOOztJQUVBLElBQUksS0FBS0gsY0FBVCxFQUF5QjtNQUN2QixLQUFLQSxjQUFMLENBQW9CRyxLQUFwQjtJQUNEOztJQUVELE9BQU8sSUFBUDtFQUNEOztFQUVEQyxNQUFNLEdBQUc7SUFDUCxNQUFNQSxNQUFOOztJQUVBLElBQUksS0FBS0osY0FBVCxFQUF5QjtNQUN2QixLQUFLQSxjQUFMLENBQW9CSSxNQUFwQjtJQUNEOztJQUVELE9BQU8sSUFBUDtFQUNEOztFQUVEQyxtQkFBbUIsQ0FBQ0MsUUFBRCxFQUE0QztJQUM3RDtJQUNBLE9BQU8sS0FBS1AsRUFBTCxDQUFRUSxNQUFSLElBQWtCQyxxQkFBekIsRUFBd0M7TUFDdEM7TUFDQSxNQUFNRCxNQUFNLEdBQUcsS0FBS1IsRUFBTCxDQUFRVSxZQUFSLENBQXFCLENBQXJCLENBQWY7O01BQ0EsSUFBSUYsTUFBTSxHQUFHQyxxQkFBYixFQUE0QjtRQUMxQixPQUFPRixRQUFRLENBQUMsSUFBSUksdUJBQUosQ0FBb0IsbUNBQXBCLENBQUQsQ0FBZjtNQUNEOztNQUVELElBQUksS0FBS1gsRUFBTCxDQUFRUSxNQUFSLElBQWtCQSxNQUF0QixFQUE4QjtRQUM1QixNQUFNSSxJQUFJLEdBQUcsS0FBS1osRUFBTCxDQUFRYSxLQUFSLENBQWMsQ0FBZCxFQUFpQkwsTUFBakIsQ0FBYjtRQUNBLEtBQUtSLEVBQUwsQ0FBUWMsT0FBUixDQUFnQk4sTUFBaEIsRUFGNEIsQ0FJNUI7O1FBQ0EsTUFBTU8sTUFBTSxHQUFHLElBQUlDLGNBQUosQ0FBV0osSUFBWCxDQUFmO1FBQ0EsS0FBS2QsS0FBTCxDQUFXaUIsTUFBWCxDQUFrQixVQUFsQixFQUE4QkEsTUFBOUI7UUFDQSxLQUFLakIsS0FBTCxDQUFXYyxJQUFYLENBQWdCRyxNQUFoQjtRQUVBLElBQUlFLE9BQU8sR0FBRyxLQUFLaEIsY0FBbkI7O1FBQ0EsSUFBSWdCLE9BQU8sS0FBS2YsU0FBaEIsRUFBMkI7VUFDekIsS0FBS0QsY0FBTCxHQUFzQmdCLE9BQU8sR0FBRyxJQUFJQyxnQkFBSixDQUFZO1lBQUVDLElBQUksRUFBRUosTUFBTSxDQUFDSSxJQUFQLEVBQVI7WUFBdUJDLGVBQWUsRUFBRTtVQUF4QyxDQUFaLENBQWhDO1VBQ0EsS0FBS0MsSUFBTCxDQUFVSixPQUFWO1FBQ0Q7O1FBRUQsSUFBSUYsTUFBTSxDQUFDTyxNQUFQLEVBQUosRUFBcUI7VUFDbkI7VUFDQTtVQUNBTCxPQUFPLENBQUNNLElBQVIsQ0FBYSxLQUFiLEVBQW9CLE1BQU07WUFDeEIsS0FBS3RCLGNBQUwsR0FBc0JDLFNBQXRCO1lBQ0EsS0FBS0ksbUJBQUwsQ0FBeUJDLFFBQXpCO1VBQ0QsQ0FIRDtVQUlBVSxPQUFPLENBQUNPLEdBQVIsQ0FBWVQsTUFBTSxDQUFDSCxJQUFQLEVBQVo7VUFDQTtRQUNELENBVEQsTUFTTyxJQUFJLENBQUNLLE9BQU8sQ0FBQ1EsS0FBUixDQUFjVixNQUFNLENBQUNILElBQVAsRUFBZCxDQUFMLEVBQW1DO1VBQ3hDO1VBQ0E7VUFDQUssT0FBTyxDQUFDTSxJQUFSLENBQWEsT0FBYixFQUFzQixNQUFNO1lBQzFCLEtBQUtqQixtQkFBTCxDQUF5QkMsUUFBekI7VUFDRCxDQUZEO1VBR0E7UUFDRDtNQUNGLENBaENELE1BZ0NPO1FBQ0w7TUFDRDtJQUNGLENBNUM0RCxDQThDN0Q7SUFDQTs7O0lBQ0FBLFFBQVE7RUFDVDs7RUFFRG1CLFVBQVUsQ0FBQ0MsS0FBRCxFQUFnQkMsU0FBaEIsRUFBbUNyQixRQUFuQyxFQUF5RDtJQUNqRSxLQUFLUCxFQUFMLENBQVE2QixNQUFSLENBQWVGLEtBQWY7SUFDQSxLQUFLckIsbUJBQUwsQ0FBeUJDLFFBQXpCO0VBQ0Q7O0FBeEYyQzs7ZUEyRi9CWixxQjs7QUFDZm1DLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQnBDLHFCQUFqQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.instanceLookup = instanceLookup;
exports.parseBrowserResponse = parseBrowserResponse;

var _dns = _interopRequireDefault(require("dns"));

var _abortError = _interopRequireDefault(require("./errors/abort-error"));

var _sender = require("./sender");

var _withTimeout = require("./utils/with-timeout");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const SQL_SERVER_BROWSER_PORT = 1434;
const TIMEOUT = 2 * 1000;
const RETRIES = 3; // There are three bytes at the start of the response, whose purpose is unknown.

const MYSTERY_HEADER_LENGTH = 3;

// Most of the functionality has been determined from from jTDS's MSSqlServerInfo class.
async function instanceLookup(options) {
  const server = options.server;

  if (typeof server !== 'string') {
    throw new TypeError('Invalid arguments: "server" must be a string');
  }

  const instanceName = options.instanceName;

  if (typeof instanceName !== 'string') {
    throw new TypeError('Invalid arguments: "instanceName" must be a string');
  }

  const timeout = options.timeout === undefined ? TIMEOUT : options.timeout;

  if (typeof timeout !== 'number') {
    throw new TypeError('Invalid arguments: "timeout" must be a number');
  }

  const retries = options.retries === undefined ? RETRIES : options.retries;

  if (typeof retries !== 'number') {
    throw new TypeError('Invalid arguments: "retries" must be a number');
  }

  if (options.lookup !== undefined && typeof options.lookup !== 'function') {
    throw new TypeError('Invalid arguments: "lookup" must be a function');
  }

  const lookup = options.lookup ?? _dns.default.lookup;

  if (options.port !== undefined && typeof options.port !== 'number') {
    throw new TypeError('Invalid arguments: "port" must be a number');
  }

  const port = options.port ?? SQL_SERVER_BROWSER_PORT;
  const signal = options.signal;

  if (signal.aborted) {
    throw new _abortError.default();
  }

  let response;

  for (let i = 0; i <= retries; i++) {
    try {
      response = await (0, _withTimeout.withTimeout)(timeout, async signal => {
        const request = Buffer.from([0x02]);
        return await (0, _sender.sendMessage)(options.server, port, lookup, signal, request);
      }, signal);
    } catch (err) {
      // If the current attempt timed out, continue with the next
      if (!signal.aborted && err instanceof Error && err.name === 'TimeoutError') {
        continue;
      }

      throw err;
    }
  }

  if (!response) {
    throw new Error('Failed to get response from SQL Server Browser on ' + server);
  }

  const message = response.toString('ascii', MYSTERY_HEADER_LENGTH);
  const foundPort = parseBrowserResponse(message, instanceName);

  if (!foundPort) {
    throw new Error('Port for ' + instanceName + ' not found in ' + options.server);
  }

  return foundPort;
}

function parseBrowserResponse(response, instanceName) {
  let getPort;
  const instances = response.split(';;');

  for (let i = 0, len = instances.length; i < len; i++) {
    const instance = instances[i];
    const parts = instance.split(';');

    for (let p = 0, partsLen = parts.length; p < partsLen; p += 2) {
      const name = parts[p];
      const value = parts[p + 1];

      if (name === 'tcp' && getPort) {
        const port = parseInt(value, 10);
        return port;
      }

      if (name === 'InstanceName') {
        if (value.toUpperCase() === instanceName.toUpperCase()) {
          getPort = true;
        } else {
          getPort = false;
        }
      }
    }
  }
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTUUxfU0VSVkVSX0JST1dTRVJfUE9SVCIsIlRJTUVPVVQiLCJSRVRSSUVTIiwiTVlTVEVSWV9IRUFERVJfTEVOR1RIIiwiaW5zdGFuY2VMb29rdXAiLCJvcHRpb25zIiwic2VydmVyIiwiVHlwZUVycm9yIiwiaW5zdGFuY2VOYW1lIiwidGltZW91dCIsInVuZGVmaW5lZCIsInJldHJpZXMiLCJsb29rdXAiLCJkbnMiLCJwb3J0Iiwic2lnbmFsIiwiYWJvcnRlZCIsIkFib3J0RXJyb3IiLCJyZXNwb25zZSIsImkiLCJyZXF1ZXN0IiwiQnVmZmVyIiwiZnJvbSIsImVyciIsIkVycm9yIiwibmFtZSIsIm1lc3NhZ2UiLCJ0b1N0cmluZyIsImZvdW5kUG9ydCIsInBhcnNlQnJvd3NlclJlc3BvbnNlIiwiZ2V0UG9ydCIsImluc3RhbmNlcyIsInNwbGl0IiwibGVuIiwibGVuZ3RoIiwiaW5zdGFuY2UiLCJwYXJ0cyIsInAiLCJwYXJ0c0xlbiIsInZhbHVlIiwicGFyc2VJbnQiLCJ0b1VwcGVyQ2FzZSJdLCJzb3VyY2VzIjpbIi4uL3NyYy9pbnN0YW5jZS1sb29rdXAudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGRucyBmcm9tICdkbnMnO1xuaW1wb3J0IHsgQWJvcnRTaWduYWwgfSBmcm9tICdub2RlLWFib3J0LWNvbnRyb2xsZXInO1xuXG5pbXBvcnQgQWJvcnRFcnJvciBmcm9tICcuL2Vycm9ycy9hYm9ydC1lcnJvcic7XG5pbXBvcnQgeyBzZW5kTWVzc2FnZSB9IGZyb20gJy4vc2VuZGVyJztcbmltcG9ydCB7IHdpdGhUaW1lb3V0IH0gZnJvbSAnLi91dGlscy93aXRoLXRpbWVvdXQnO1xuXG5jb25zdCBTUUxfU0VSVkVSX0JST1dTRVJfUE9SVCA9IDE0MzQ7XG5jb25zdCBUSU1FT1VUID0gMiAqIDEwMDA7XG5jb25zdCBSRVRSSUVTID0gMztcbi8vIFRoZXJlIGFyZSB0aHJlZSBieXRlcyBhdCB0aGUgc3RhcnQgb2YgdGhlIHJlc3BvbnNlLCB3aG9zZSBwdXJwb3NlIGlzIHVua25vd24uXG5jb25zdCBNWVNURVJZX0hFQURFUl9MRU5HVEggPSAzO1xuXG50eXBlIExvb2t1cEZ1bmN0aW9uID0gKGhvc3RuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IGRucy5Mb29rdXBBbGxPcHRpb25zLCBjYWxsYmFjazogKGVycjogTm9kZUpTLkVycm5vRXhjZXB0aW9uIHwgbnVsbCwgYWRkcmVzc2VzOiBkbnMuTG9va3VwQWRkcmVzc1tdKSA9PiB2b2lkKSA9PiB2b2lkO1xuXG4vLyBNb3N0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IGhhcyBiZWVuIGRldGVybWluZWQgZnJvbSBmcm9tIGpURFMncyBNU1NxbFNlcnZlckluZm8gY2xhc3MuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFuY2VMb29rdXAob3B0aW9uczogeyBzZXJ2ZXI6IHN0cmluZywgaW5zdGFuY2VOYW1lOiBzdHJpbmcsIHRpbWVvdXQ/OiBudW1iZXIsIHJldHJpZXM/OiBudW1iZXIsIHBvcnQ/OiBudW1iZXIsIGxvb2t1cD86IExvb2t1cEZ1bmN0aW9uLCBzaWduYWw6IEFib3J0U2lnbmFsIH0pIHtcbiAgY29uc3Qgc2VydmVyID0gb3B0aW9ucy5zZXJ2ZXI7XG4gIGlmICh0eXBlb2Ygc2VydmVyICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzOiBcInNlcnZlclwiIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgfVxuXG4gIGNvbnN0IGluc3RhbmNlTmFtZSA9IG9wdGlvbnMuaW5zdGFuY2VOYW1lO1xuICBpZiAodHlwZW9mIGluc3RhbmNlTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGFyZ3VtZW50czogXCJpbnN0YW5jZU5hbWVcIiBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gIH1cblxuICBjb25zdCB0aW1lb3V0ID0gb3B0aW9ucy50aW1lb3V0ID09PSB1bmRlZmluZWQgPyBUSU1FT1VUIDogb3B0aW9ucy50aW1lb3V0O1xuICBpZiAodHlwZW9mIHRpbWVvdXQgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhcmd1bWVudHM6IFwidGltZW91dFwiIG11c3QgYmUgYSBudW1iZXInKTtcbiAgfVxuXG4gIGNvbnN0IHJldHJpZXMgPSBvcHRpb25zLnJldHJpZXMgPT09IHVuZGVmaW5lZCA/IFJFVFJJRVMgOiBvcHRpb25zLnJldHJpZXM7XG4gIGlmICh0eXBlb2YgcmV0cmllcyAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGFyZ3VtZW50czogXCJyZXRyaWVzXCIgbXVzdCBiZSBhIG51bWJlcicpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMubG9va3VwICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMubG9va3VwICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhcmd1bWVudHM6IFwibG9va3VwXCIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cbiAgY29uc3QgbG9va3VwID0gb3B0aW9ucy5sb29rdXAgPz8gZG5zLmxvb2t1cDtcblxuICBpZiAob3B0aW9ucy5wb3J0ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMucG9ydCAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGFyZ3VtZW50czogXCJwb3J0XCIgbXVzdCBiZSBhIG51bWJlcicpO1xuICB9XG4gIGNvbnN0IHBvcnQgPSBvcHRpb25zLnBvcnQgPz8gU1FMX1NFUlZFUl9CUk9XU0VSX1BPUlQ7XG5cbiAgY29uc3Qgc2lnbmFsID0gb3B0aW9ucy5zaWduYWw7XG5cbiAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoKTtcbiAgfVxuXG4gIGxldCByZXNwb25zZTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8PSByZXRyaWVzOyBpKyspIHtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB3aXRoVGltZW91dCh0aW1lb3V0LCBhc3luYyAoc2lnbmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBCdWZmZXIuZnJvbShbMHgwMl0pO1xuICAgICAgICByZXR1cm4gYXdhaXQgc2VuZE1lc3NhZ2Uob3B0aW9ucy5zZXJ2ZXIsIHBvcnQsIGxvb2t1cCwgc2lnbmFsLCByZXF1ZXN0KTtcbiAgICAgIH0sIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBJZiB0aGUgY3VycmVudCBhdHRlbXB0IHRpbWVkIG91dCwgY29udGludWUgd2l0aCB0aGUgbmV4dFxuICAgICAgaWYgKCFzaWduYWwuYWJvcnRlZCAmJiBlcnIgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnIubmFtZSA9PT0gJ1RpbWVvdXRFcnJvcicpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZ2V0IHJlc3BvbnNlIGZyb20gU1FMIFNlcnZlciBCcm93c2VyIG9uICcgKyBzZXJ2ZXIpO1xuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IHJlc3BvbnNlLnRvU3RyaW5nKCdhc2NpaScsIE1ZU1RFUllfSEVBREVSX0xFTkdUSCk7XG4gIGNvbnN0IGZvdW5kUG9ydCA9IHBhcnNlQnJvd3NlclJlc3BvbnNlKG1lc3NhZ2UsIGluc3RhbmNlTmFtZSk7XG5cbiAgaWYgKCFmb3VuZFBvcnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BvcnQgZm9yICcgKyBpbnN0YW5jZU5hbWUgKyAnIG5vdCBmb3VuZCBpbiAnICsgb3B0aW9ucy5zZXJ2ZXIpO1xuICB9XG5cbiAgcmV0dXJuIGZvdW5kUG9ydDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQnJvd3NlclJlc3BvbnNlKHJlc3BvbnNlOiBzdHJpbmcsIGluc3RhbmNlTmFtZTogc3RyaW5nKSB7XG4gIGxldCBnZXRQb3J0O1xuXG4gIGNvbnN0IGluc3RhbmNlcyA9IHJlc3BvbnNlLnNwbGl0KCc7OycpO1xuICBmb3IgKGxldCBpID0gMCwgbGVuID0gaW5zdGFuY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBpbnN0YW5jZXNbaV07XG4gICAgY29uc3QgcGFydHMgPSBpbnN0YW5jZS5zcGxpdCgnOycpO1xuXG4gICAgZm9yIChsZXQgcCA9IDAsIHBhcnRzTGVuID0gcGFydHMubGVuZ3RoOyBwIDwgcGFydHNMZW47IHAgKz0gMikge1xuICAgICAgY29uc3QgbmFtZSA9IHBhcnRzW3BdO1xuICAgICAgY29uc3QgdmFsdWUgPSBwYXJ0c1twICsgMV07XG5cbiAgICAgIGlmIChuYW1lID09PSAndGNwJyAmJiBnZXRQb3J0KSB7XG4gICAgICAgIGNvbnN0IHBvcnQgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgICAgICByZXR1cm4gcG9ydDtcbiAgICAgIH1cblxuICAgICAgaWYgKG5hbWUgPT09ICdJbnN0YW5jZU5hbWUnKSB7XG4gICAgICAgIGlmICh2YWx1ZS50b1VwcGVyQ2FzZSgpID09PSBpbnN0YW5jZU5hbWUudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgIGdldFBvcnQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdldFBvcnQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBOztBQUdBOztBQUNBOztBQUNBOzs7O0FBRUEsTUFBTUEsdUJBQXVCLEdBQUcsSUFBaEM7QUFDQSxNQUFNQyxPQUFPLEdBQUcsSUFBSSxJQUFwQjtBQUNBLE1BQU1DLE9BQU8sR0FBRyxDQUFoQixDLENBQ0E7O0FBQ0EsTUFBTUMscUJBQXFCLEdBQUcsQ0FBOUI7O0FBSUE7QUFDTyxlQUFlQyxjQUFmLENBQThCQyxPQUE5QixFQUFrTDtFQUN2TCxNQUFNQyxNQUFNLEdBQUdELE9BQU8sQ0FBQ0MsTUFBdkI7O0VBQ0EsSUFBSSxPQUFPQSxNQUFQLEtBQWtCLFFBQXRCLEVBQWdDO0lBQzlCLE1BQU0sSUFBSUMsU0FBSixDQUFjLDhDQUFkLENBQU47RUFDRDs7RUFFRCxNQUFNQyxZQUFZLEdBQUdILE9BQU8sQ0FBQ0csWUFBN0I7O0VBQ0EsSUFBSSxPQUFPQSxZQUFQLEtBQXdCLFFBQTVCLEVBQXNDO0lBQ3BDLE1BQU0sSUFBSUQsU0FBSixDQUFjLG9EQUFkLENBQU47RUFDRDs7RUFFRCxNQUFNRSxPQUFPLEdBQUdKLE9BQU8sQ0FBQ0ksT0FBUixLQUFvQkMsU0FBcEIsR0FBZ0NULE9BQWhDLEdBQTBDSSxPQUFPLENBQUNJLE9BQWxFOztFQUNBLElBQUksT0FBT0EsT0FBUCxLQUFtQixRQUF2QixFQUFpQztJQUMvQixNQUFNLElBQUlGLFNBQUosQ0FBYywrQ0FBZCxDQUFOO0VBQ0Q7O0VBRUQsTUFBTUksT0FBTyxHQUFHTixPQUFPLENBQUNNLE9BQVIsS0FBb0JELFNBQXBCLEdBQWdDUixPQUFoQyxHQUEwQ0csT0FBTyxDQUFDTSxPQUFsRTs7RUFDQSxJQUFJLE9BQU9BLE9BQVAsS0FBbUIsUUFBdkIsRUFBaUM7SUFDL0IsTUFBTSxJQUFJSixTQUFKLENBQWMsK0NBQWQsQ0FBTjtFQUNEOztFQUVELElBQUlGLE9BQU8sQ0FBQ08sTUFBUixLQUFtQkYsU0FBbkIsSUFBZ0MsT0FBT0wsT0FBTyxDQUFDTyxNQUFmLEtBQTBCLFVBQTlELEVBQTBFO0lBQ3hFLE1BQU0sSUFBSUwsU0FBSixDQUFjLGdEQUFkLENBQU47RUFDRDs7RUFDRCxNQUFNSyxNQUFNLEdBQUdQLE9BQU8sQ0FBQ08sTUFBUixJQUFrQkMsYUFBSUQsTUFBckM7O0VBRUEsSUFBSVAsT0FBTyxDQUFDUyxJQUFSLEtBQWlCSixTQUFqQixJQUE4QixPQUFPTCxPQUFPLENBQUNTLElBQWYsS0FBd0IsUUFBMUQsRUFBb0U7SUFDbEUsTUFBTSxJQUFJUCxTQUFKLENBQWMsNENBQWQsQ0FBTjtFQUNEOztFQUNELE1BQU1PLElBQUksR0FBR1QsT0FBTyxDQUFDUyxJQUFSLElBQWdCZCx1QkFBN0I7RUFFQSxNQUFNZSxNQUFNLEdBQUdWLE9BQU8sQ0FBQ1UsTUFBdkI7O0VBRUEsSUFBSUEsTUFBTSxDQUFDQyxPQUFYLEVBQW9CO0lBQ2xCLE1BQU0sSUFBSUMsbUJBQUosRUFBTjtFQUNEOztFQUVELElBQUlDLFFBQUo7O0VBRUEsS0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxJQUFJUixPQUFyQixFQUE4QlEsQ0FBQyxFQUEvQixFQUFtQztJQUNqQyxJQUFJO01BQ0ZELFFBQVEsR0FBRyxNQUFNLDhCQUFZVCxPQUFaLEVBQXFCLE1BQU9NLE1BQVAsSUFBa0I7UUFDdEQsTUFBTUssT0FBTyxHQUFHQyxNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDLElBQUQsQ0FBWixDQUFoQjtRQUNBLE9BQU8sTUFBTSx5QkFBWWpCLE9BQU8sQ0FBQ0MsTUFBcEIsRUFBNEJRLElBQTVCLEVBQWtDRixNQUFsQyxFQUEwQ0csTUFBMUMsRUFBa0RLLE9BQWxELENBQWI7TUFDRCxDQUhnQixFQUdkTCxNQUhjLENBQWpCO0lBSUQsQ0FMRCxDQUtFLE9BQU9RLEdBQVAsRUFBWTtNQUNaO01BQ0EsSUFBSSxDQUFDUixNQUFNLENBQUNDLE9BQVIsSUFBbUJPLEdBQUcsWUFBWUMsS0FBbEMsSUFBMkNELEdBQUcsQ0FBQ0UsSUFBSixLQUFhLGNBQTVELEVBQTRFO1FBQzFFO01BQ0Q7O01BRUQsTUFBTUYsR0FBTjtJQUNEO0VBQ0Y7O0VBRUQsSUFBSSxDQUFDTCxRQUFMLEVBQWU7SUFDYixNQUFNLElBQUlNLEtBQUosQ0FBVSx1REFBdURsQixNQUFqRSxDQUFOO0VBQ0Q7O0VBRUQsTUFBTW9CLE9BQU8sR0FBR1IsUUFBUSxDQUFDUyxRQUFULENBQWtCLE9BQWxCLEVBQTJCeEIscUJBQTNCLENBQWhCO0VBQ0EsTUFBTXlCLFNBQVMsR0FBR0Msb0JBQW9CLENBQUNILE9BQUQsRUFBVWxCLFlBQVYsQ0FBdEM7O0VBRUEsSUFBSSxDQUFDb0IsU0FBTCxFQUFnQjtJQUNkLE1BQU0sSUFBSUosS0FBSixDQUFVLGNBQWNoQixZQUFkLEdBQTZCLGdCQUE3QixHQUFnREgsT0FBTyxDQUFDQyxNQUFsRSxDQUFOO0VBQ0Q7O0VBRUQsT0FBT3NCLFNBQVA7QUFDRDs7QUFFTSxTQUFTQyxvQkFBVCxDQUE4QlgsUUFBOUIsRUFBZ0RWLFlBQWhELEVBQXNFO0VBQzNFLElBQUlzQixPQUFKO0VBRUEsTUFBTUMsU0FBUyxHQUFHYixRQUFRLENBQUNjLEtBQVQsQ0FBZSxJQUFmLENBQWxCOztFQUNBLEtBQUssSUFBSWIsQ0FBQyxHQUFHLENBQVIsRUFBV2MsR0FBRyxHQUFHRixTQUFTLENBQUNHLE1BQWhDLEVBQXdDZixDQUFDLEdBQUdjLEdBQTVDLEVBQWlEZCxDQUFDLEVBQWxELEVBQXNEO0lBQ3BELE1BQU1nQixRQUFRLEdBQUdKLFNBQVMsQ0FBQ1osQ0FBRCxDQUExQjtJQUNBLE1BQU1pQixLQUFLLEdBQUdELFFBQVEsQ0FBQ0gsS0FBVCxDQUFlLEdBQWYsQ0FBZDs7SUFFQSxLQUFLLElBQUlLLENBQUMsR0FBRyxDQUFSLEVBQVdDLFFBQVEsR0FBR0YsS0FBSyxDQUFDRixNQUFqQyxFQUF5Q0csQ0FBQyxHQUFHQyxRQUE3QyxFQUF1REQsQ0FBQyxJQUFJLENBQTVELEVBQStEO01BQzdELE1BQU1aLElBQUksR0FBR1csS0FBSyxDQUFDQyxDQUFELENBQWxCO01BQ0EsTUFBTUUsS0FBSyxHQUFHSCxLQUFLLENBQUNDLENBQUMsR0FBRyxDQUFMLENBQW5COztNQUVBLElBQUlaLElBQUksS0FBSyxLQUFULElBQWtCSyxPQUF0QixFQUErQjtRQUM3QixNQUFNaEIsSUFBSSxHQUFHMEIsUUFBUSxDQUFDRCxLQUFELEVBQVEsRUFBUixDQUFyQjtRQUNBLE9BQU96QixJQUFQO01BQ0Q7O01BRUQsSUFBSVcsSUFBSSxLQUFLLGNBQWIsRUFBNkI7UUFDM0IsSUFBSWMsS0FBSyxDQUFDRSxXQUFOLE9BQXdCakMsWUFBWSxDQUFDaUMsV0FBYixFQUE1QixFQUF3RDtVQUN0RFgsT0FBTyxHQUFHLElBQVY7UUFDRCxDQUZELE1BRU87VUFDTEEsT0FBTyxHQUFHLEtBQVY7UUFDRDtNQUNGO0lBQ0Y7RUFDRjtBQUNGIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.name = void 0;
const name = 'Tedious';
exports.name = name;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJuYW1lIl0sInNvdXJjZXMiOlsiLi4vc3JjL2xpYnJhcnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IG5hbWUgPSAnVGVkaW91cyc7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFPLE1BQU1BLElBQUksR0FBRyxTQUFiIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _sprintfJs = require("sprintf-js");

var _tdsVersions = require("./tds-versions");

const FLAGS_1 = {
  ENDIAN_LITTLE: 0x00,
  ENDIAN_BIG: 0x01,
  CHARSET_ASCII: 0x00,
  CHARSET_EBCDIC: 0x02,
  FLOAT_IEEE_754: 0x00,
  FLOAT_VAX: 0x04,
  FLOAT_ND5000: 0x08,
  BCP_DUMPLOAD_ON: 0x00,
  BCP_DUMPLOAD_OFF: 0x10,
  USE_DB_ON: 0x00,
  USE_DB_OFF: 0x20,
  INIT_DB_WARN: 0x00,
  INIT_DB_FATAL: 0x40,
  SET_LANG_WARN_OFF: 0x00,
  SET_LANG_WARN_ON: 0x80
};
const FLAGS_2 = {
  INIT_LANG_WARN: 0x00,
  INIT_LANG_FATAL: 0x01,
  ODBC_OFF: 0x00,
  ODBC_ON: 0x02,
  F_TRAN_BOUNDARY: 0x04,
  F_CACHE_CONNECT: 0x08,
  USER_NORMAL: 0x00,
  USER_SERVER: 0x10,
  USER_REMUSER: 0x20,
  USER_SQLREPL: 0x40,
  INTEGRATED_SECURITY_OFF: 0x00,
  INTEGRATED_SECURITY_ON: 0x80
};
const TYPE_FLAGS = {
  SQL_DFLT: 0x00,
  SQL_TSQL: 0x08,
  OLEDB_OFF: 0x00,
  OLEDB_ON: 0x10,
  READ_WRITE_INTENT: 0x00,
  READ_ONLY_INTENT: 0x20
};
const FLAGS_3 = {
  CHANGE_PASSWORD_NO: 0x00,
  CHANGE_PASSWORD_YES: 0x01,
  BINARY_XML: 0x02,
  SPAWN_USER_INSTANCE: 0x04,
  UNKNOWN_COLLATION_HANDLING: 0x08,
  EXTENSION_USED: 0x10
};
const FEDAUTH_OPTIONS = {
  FEATURE_ID: 0x02,
  LIBRARY_SECURITYTOKEN: 0x01,
  LIBRARY_ADAL: 0x02,
  FEDAUTH_YES_ECHO: 0x01,
  FEDAUTH_NO_ECHO: 0x00,
  ADAL_WORKFLOW_USER_PASS: 0x01,
  ADAL_WORKFLOW_INTEGRATED: 0x02
};
const FEATURE_EXT_TERMINATOR = 0xFF;

/*
  s2.2.6.3
 */
class Login7Payload {
  constructor({
    tdsVersion,
    packetSize,
    clientProgVer,
    clientPid,
    connectionId,
    clientTimeZone,
    clientLcid
  }) {
    this.tdsVersion = void 0;
    this.packetSize = void 0;
    this.clientProgVer = void 0;
    this.clientPid = void 0;
    this.connectionId = void 0;
    this.clientTimeZone = void 0;
    this.clientLcid = void 0;
    this.readOnlyIntent = void 0;
    this.initDbFatal = void 0;
    this.userName = void 0;
    this.password = void 0;
    this.serverName = void 0;
    this.appName = void 0;
    this.hostname = void 0;
    this.libraryName = void 0;
    this.language = void 0;
    this.database = void 0;
    this.clientId = void 0;
    this.sspi = void 0;
    this.attachDbFile = void 0;
    this.changePassword = void 0;
    this.fedAuth = void 0;
    this.tdsVersion = tdsVersion;
    this.packetSize = packetSize;
    this.clientProgVer = clientProgVer;
    this.clientPid = clientPid;
    this.connectionId = connectionId;
    this.clientTimeZone = clientTimeZone;
    this.clientLcid = clientLcid;
    this.readOnlyIntent = false;
    this.initDbFatal = false;
    this.fedAuth = undefined;
    this.userName = undefined;
    this.password = undefined;
    this.serverName = undefined;
    this.appName = undefined;
    this.hostname = undefined;
    this.libraryName = undefined;
    this.language = undefined;
    this.database = undefined;
    this.clientId = undefined;
    this.sspi = undefined;
    this.attachDbFile = undefined;
    this.changePassword = undefined;
  }

  toBuffer() {
    const fixedData = Buffer.alloc(94);
    const buffers = [fixedData];
    let offset = 0;
    let dataOffset = fixedData.length; // Length: 4-byte

    offset = fixedData.writeUInt32LE(0, offset); // TDSVersion: 4-byte

    offset = fixedData.writeUInt32LE(this.tdsVersion, offset); // PacketSize: 4-byte

    offset = fixedData.writeUInt32LE(this.packetSize, offset); // ClientProgVer: 4-byte

    offset = fixedData.writeUInt32LE(this.clientProgVer, offset); // ClientPID: 4-byte

    offset = fixedData.writeUInt32LE(this.clientPid, offset); // ConnectionID: 4-byte

    offset = fixedData.writeUInt32LE(this.connectionId, offset); // OptionFlags1: 1-byte

    offset = fixedData.writeUInt8(this.buildOptionFlags1(), offset); // OptionFlags2: 1-byte

    offset = fixedData.writeUInt8(this.buildOptionFlags2(), offset); // TypeFlags: 1-byte

    offset = fixedData.writeUInt8(this.buildTypeFlags(), offset); // OptionFlags3: 1-byte

    offset = fixedData.writeUInt8(this.buildOptionFlags3(), offset); // ClientTimZone: 4-byte

    offset = fixedData.writeInt32LE(this.clientTimeZone, offset); // ClientLCID: 4-byte

    offset = fixedData.writeUInt32LE(this.clientLcid, offset); // ibHostName: 2-byte

    offset = fixedData.writeUInt16LE(dataOffset, offset); // cchHostName: 2-byte

    if (this.hostname) {
      const buffer = Buffer.from(this.hostname, 'ucs2');
      offset = fixedData.writeUInt16LE(buffer.length / 2, offset);
      dataOffset += buffer.length;
      buffers.push(buffer);
    } else {
      offset = fixedData.writeUInt16LE(dataOffset, offset);
    } // ibUserName: 2-byte


    offset = fixedData.writeUInt16LE(dataOffset, offset); // cchUserName: 2-byte

    if (this.userName) {
      const buffer = Buffer.from(this.userName, 'ucs2');
      offset = fixedData.writeUInt16LE(buffer.length / 2, offset);
      dataOffset += buffer.length;
      buffers.push(buffer);
    } else {
      offset = fixedData.writeUInt16LE(0, offset);
    } // ibPassword: 2-byte


    offset = fixedData.writeUInt16LE(dataOffset, offset); // cchPassword: 2-byte

    if (this.password) {
      const buffer = Buffer.from(this.password, 'ucs2');
      offset = fixedData.writeUInt16LE(buffer.length / 2, offset);
      dataOffset += buffer.length;
      buffers.push(this.scramblePassword(buffer));
    } else {
      offset = fixedData.writeUInt16LE(0, offset);
    } // ibAppName: 2-byte


    offset = fixedData.writeUInt16LE(dataOffset, offset); // cchAppName: 2-byte

    if (this.appName) {
      const buffer = Buffer.from(this.appName, 'ucs2');
      offset = fixedData.writeUInt16LE(buffer.length / 2, offset);
      dataOffset += buffer.length;
      buffers.push(buffer);
    } else {
      offset = fixedData.writeUInt16LE(0, offset);
    } // ibServerName: 2-byte


    offset = fixedData.writeUInt16LE(dataOffset, offset); // cchServerName: 2-byte

    if (this.serverName) {
      const buffer = Buffer.from(this.serverName, 'ucs2');
      offset = fixedData.writeUInt16LE(buffer.length / 2, offset);
      dataOffset += buffer.length;
      buffers.push(buffer);
    } else {
      offset = fixedData.writeUInt16LE(0, offset);
    } // (ibUnused / ibExtension): 2-byte


    offset = fixedData.writeUInt16LE(dataOffset, offset); // (cchUnused / cbExtension): 2-byte

    const extensions = this.buildFeatureExt();
    offset = fixedData.writeUInt16LE(4, offset);
    const extensionOffset = Buffer.alloc(4);
    extensionOffset.writeUInt32LE(dataOffset += 4, 0);
    dataOffset += extensions.length;
    buffers.push(extensionOffset, extensions); // ibCltIntName: 2-byte

    offset = fixedData.writeUInt16LE(dataOffset, offset); // cchCltIntName: 2-byte

    if (this.libraryName) {
      const buffer = Buffer.from(this.libraryName, 'ucs2');
      offset = fixedData.writeUInt16LE(buffer.length / 2, offset);
      dataOffset += buffer.length;
      buffers.push(buffer);
    } else {
      offset = fixedData.writeUInt16LE(0, offset);
    } // ibLanguage: 2-byte


    offset = fixedData.writeUInt16LE(dataOffset, offset); // cchLanguage: 2-byte

    if (this.language) {
      const buffer = Buffer.from(this.language, 'ucs2');
      offset = fixedData.writeUInt16LE(buffer.length / 2, offset);
      dataOffset += buffer.length;
      buffers.push(buffer);
    } else {
      offset = fixedData.writeUInt16LE(0, offset);
    } // ibDatabase: 2-byte


    offset = fixedData.writeUInt16LE(dataOffset, offset); // cchDatabase: 2-byte

    if (this.database) {
      const buffer = Buffer.from(this.database, 'ucs2');
      offset = fixedData.writeUInt16LE(buffer.length / 2, offset);
      dataOffset += buffer.length;
      buffers.push(buffer);
    } else {
      offset = fixedData.writeUInt16LE(0, offset);
    } // ClientID: 6-byte


    if (this.clientId) {
      this.clientId.copy(fixedData, offset, 0, 6);
    }

    offset += 6; // ibSSPI: 2-byte

    offset = fixedData.writeUInt16LE(dataOffset, offset); // cbSSPI: 2-byte

    if (this.sspi) {
      if (this.sspi.length > 65535) {
        offset = fixedData.writeUInt16LE(65535, offset);
      } else {
        offset = fixedData.writeUInt16LE(this.sspi.length, offset);
      }

      buffers.push(this.sspi);
    } else {
      offset = fixedData.writeUInt16LE(0, offset);
    } // ibAtchDBFile: 2-byte


    offset = fixedData.writeUInt16LE(dataOffset, offset); // cchAtchDBFile: 2-byte

    if (this.attachDbFile) {
      const buffer = Buffer.from(this.attachDbFile, 'ucs2');
      offset = fixedData.writeUInt16LE(buffer.length / 2, offset);
      dataOffset += buffer.length;
      buffers.push(buffer);
    } else {
      offset = fixedData.writeUInt16LE(0, offset);
    } // ibChangePassword: 2-byte


    offset = fixedData.writeUInt16LE(dataOffset, offset); // cchChangePassword: 2-byte

    if (this.changePassword) {
      const buffer = Buffer.from(this.changePassword, 'ucs2');
      offset = fixedData.writeUInt16LE(buffer.length / 2, offset);
      dataOffset += buffer.length;
      buffers.push(buffer);
    } else {
      offset = fixedData.writeUInt16LE(0, offset);
    } // cbSSPILong: 4-byte


    if (this.sspi && this.sspi.length > 65535) {
      fixedData.writeUInt32LE(this.sspi.length, offset);
    } else {
      fixedData.writeUInt32LE(0, offset);
    }

    const data = Buffer.concat(buffers);
    data.writeUInt32LE(data.length, 0);
    return data;
  }

  buildOptionFlags1() {
    let flags1 = FLAGS_1.ENDIAN_LITTLE | FLAGS_1.CHARSET_ASCII | FLAGS_1.FLOAT_IEEE_754 | FLAGS_1.BCP_DUMPLOAD_OFF | FLAGS_1.USE_DB_OFF | FLAGS_1.SET_LANG_WARN_ON;

    if (this.initDbFatal) {
      flags1 |= FLAGS_1.INIT_DB_FATAL;
    } else {
      flags1 |= FLAGS_1.INIT_DB_WARN;
    }

    return flags1;
  }

  buildFeatureExt() {
    const buffers = [];
    const fedAuth = this.fedAuth;

    if (fedAuth) {
      switch (fedAuth.type) {
        case 'ADAL':
          const buffer = Buffer.alloc(7);
          buffer.writeUInt8(FEDAUTH_OPTIONS.FEATURE_ID, 0);
          buffer.writeUInt32LE(2, 1);
          buffer.writeUInt8(FEDAUTH_OPTIONS.LIBRARY_ADAL << 1 | (fedAuth.echo ? FEDAUTH_OPTIONS.FEDAUTH_YES_ECHO : FEDAUTH_OPTIONS.FEDAUTH_NO_ECHO), 5);
          buffer.writeUInt8(fedAuth.workflow === 'integrated' ? 0x02 : FEDAUTH_OPTIONS.ADAL_WORKFLOW_USER_PASS, 6);
          buffers.push(buffer);
          break;

        case 'SECURITYTOKEN':
          const token = Buffer.from(fedAuth.fedAuthToken, 'ucs2');
          const buf = Buffer.alloc(10);
          let offset = 0;
          offset = buf.writeUInt8(FEDAUTH_OPTIONS.FEATURE_ID, offset);
          offset = buf.writeUInt32LE(token.length + 4 + 1, offset);
          offset = buf.writeUInt8(FEDAUTH_OPTIONS.LIBRARY_SECURITYTOKEN << 1 | (fedAuth.echo ? FEDAUTH_OPTIONS.FEDAUTH_YES_ECHO : FEDAUTH_OPTIONS.FEDAUTH_NO_ECHO), offset);
          buf.writeInt32LE(token.length, offset);
          buffers.push(buf);
          buffers.push(token);
          break;
      }
    }

    if (this.tdsVersion >= _tdsVersions.versions['7_4']) {
      // Signal UTF-8 support: Value 0x0A, bit 0 must be set to 1. Added in TDS 7.4.
      const UTF8_SUPPORT_FEATURE_ID = 0x0a;
      const UTF8_SUPPORT_CLIENT_SUPPORTS_UTF8 = 0x01;
      const buf = Buffer.alloc(6);
      buf.writeUInt8(UTF8_SUPPORT_FEATURE_ID, 0);
      buf.writeUInt32LE(1, 1);
      buf.writeUInt8(UTF8_SUPPORT_CLIENT_SUPPORTS_UTF8, 5);
      buffers.push(buf);
    }

    buffers.push(Buffer.from([FEATURE_EXT_TERMINATOR]));
    return Buffer.concat(buffers);
  }

  buildOptionFlags2() {
    let flags2 = FLAGS_2.INIT_LANG_WARN | FLAGS_2.ODBC_OFF | FLAGS_2.USER_NORMAL;

    if (this.sspi) {
      flags2 |= FLAGS_2.INTEGRATED_SECURITY_ON;
    } else {
      flags2 |= FLAGS_2.INTEGRATED_SECURITY_OFF;
    }

    return flags2;
  }

  buildTypeFlags() {
    let typeFlags = TYPE_FLAGS.SQL_DFLT | TYPE_FLAGS.OLEDB_OFF;

    if (this.readOnlyIntent) {
      typeFlags |= TYPE_FLAGS.READ_ONLY_INTENT;
    } else {
      typeFlags |= TYPE_FLAGS.READ_WRITE_INTENT;
    }

    return typeFlags;
  }

  buildOptionFlags3() {
    return FLAGS_3.CHANGE_PASSWORD_NO | FLAGS_3.UNKNOWN_COLLATION_HANDLING | FLAGS_3.EXTENSION_USED;
  }

  scramblePassword(password) {
    for (let b = 0, len = password.length; b < len; b++) {
      let byte = password[b];
      const lowNibble = byte & 0x0f;
      const highNibble = byte >> 4;
      byte = lowNibble << 4 | highNibble;
      byte = byte ^ 0xa5;
      password[b] = byte;
    }

    return password;
  }

  toString(indent = '') {
    return indent + 'Login7 - ' + (0, _sprintfJs.sprintf)('TDS:0x%08X, PacketSize:0x%08X, ClientProgVer:0x%08X, ClientPID:0x%08X, ConnectionID:0x%08X', this.tdsVersion, this.packetSize, this.clientProgVer, this.clientPid, this.connectionId) + '\n' + indent + '         ' + (0, _sprintfJs.sprintf)('Flags1:0x%02X, Flags2:0x%02X, TypeFlags:0x%02X, Flags3:0x%02X, ClientTimezone:%d, ClientLCID:0x%08X', this.buildOptionFlags1(), this.buildOptionFlags2(), this.buildTypeFlags(), this.buildOptionFlags3(), this.clientTimeZone, this.clientLcid) + '\n' + indent + '         ' + (0, _sprintfJs.sprintf)("Hostname:'%s', Username:'%s', Password:'%s', AppName:'%s', ServerName:'%s', LibraryName:'%s'", this.hostname, this.userName, this.password, this.appName, this.serverName, this.libraryName) + '\n' + indent + '         ' + (0, _sprintfJs.sprintf)("Language:'%s', Database:'%s', SSPI:'%s', AttachDbFile:'%s', ChangePassword:'%s'", this.language, this.database, this.sspi, this.attachDbFile, this.changePassword);
  }

}

var _default = Login7Payload;
exports.default = _default;
module.exports = Login7Payload;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGTEFHU18xIiwiRU5ESUFOX0xJVFRMRSIsIkVORElBTl9CSUciLCJDSEFSU0VUX0FTQ0lJIiwiQ0hBUlNFVF9FQkNESUMiLCJGTE9BVF9JRUVFXzc1NCIsIkZMT0FUX1ZBWCIsIkZMT0FUX05ENTAwMCIsIkJDUF9EVU1QTE9BRF9PTiIsIkJDUF9EVU1QTE9BRF9PRkYiLCJVU0VfREJfT04iLCJVU0VfREJfT0ZGIiwiSU5JVF9EQl9XQVJOIiwiSU5JVF9EQl9GQVRBTCIsIlNFVF9MQU5HX1dBUk5fT0ZGIiwiU0VUX0xBTkdfV0FSTl9PTiIsIkZMQUdTXzIiLCJJTklUX0xBTkdfV0FSTiIsIklOSVRfTEFOR19GQVRBTCIsIk9EQkNfT0ZGIiwiT0RCQ19PTiIsIkZfVFJBTl9CT1VOREFSWSIsIkZfQ0FDSEVfQ09OTkVDVCIsIlVTRVJfTk9STUFMIiwiVVNFUl9TRVJWRVIiLCJVU0VSX1JFTVVTRVIiLCJVU0VSX1NRTFJFUEwiLCJJTlRFR1JBVEVEX1NFQ1VSSVRZX09GRiIsIklOVEVHUkFURURfU0VDVVJJVFlfT04iLCJUWVBFX0ZMQUdTIiwiU1FMX0RGTFQiLCJTUUxfVFNRTCIsIk9MRURCX09GRiIsIk9MRURCX09OIiwiUkVBRF9XUklURV9JTlRFTlQiLCJSRUFEX09OTFlfSU5URU5UIiwiRkxBR1NfMyIsIkNIQU5HRV9QQVNTV09SRF9OTyIsIkNIQU5HRV9QQVNTV09SRF9ZRVMiLCJCSU5BUllfWE1MIiwiU1BBV05fVVNFUl9JTlNUQU5DRSIsIlVOS05PV05fQ09MTEFUSU9OX0hBTkRMSU5HIiwiRVhURU5TSU9OX1VTRUQiLCJGRURBVVRIX09QVElPTlMiLCJGRUFUVVJFX0lEIiwiTElCUkFSWV9TRUNVUklUWVRPS0VOIiwiTElCUkFSWV9BREFMIiwiRkVEQVVUSF9ZRVNfRUNITyIsIkZFREFVVEhfTk9fRUNITyIsIkFEQUxfV09SS0ZMT1dfVVNFUl9QQVNTIiwiQURBTF9XT1JLRkxPV19JTlRFR1JBVEVEIiwiRkVBVFVSRV9FWFRfVEVSTUlOQVRPUiIsIkxvZ2luN1BheWxvYWQiLCJjb25zdHJ1Y3RvciIsInRkc1ZlcnNpb24iLCJwYWNrZXRTaXplIiwiY2xpZW50UHJvZ1ZlciIsImNsaWVudFBpZCIsImNvbm5lY3Rpb25JZCIsImNsaWVudFRpbWVab25lIiwiY2xpZW50TGNpZCIsInJlYWRPbmx5SW50ZW50IiwiaW5pdERiRmF0YWwiLCJ1c2VyTmFtZSIsInBhc3N3b3JkIiwic2VydmVyTmFtZSIsImFwcE5hbWUiLCJob3N0bmFtZSIsImxpYnJhcnlOYW1lIiwibGFuZ3VhZ2UiLCJkYXRhYmFzZSIsImNsaWVudElkIiwic3NwaSIsImF0dGFjaERiRmlsZSIsImNoYW5nZVBhc3N3b3JkIiwiZmVkQXV0aCIsInVuZGVmaW5lZCIsInRvQnVmZmVyIiwiZml4ZWREYXRhIiwiQnVmZmVyIiwiYWxsb2MiLCJidWZmZXJzIiwib2Zmc2V0IiwiZGF0YU9mZnNldCIsImxlbmd0aCIsIndyaXRlVUludDMyTEUiLCJ3cml0ZVVJbnQ4IiwiYnVpbGRPcHRpb25GbGFnczEiLCJidWlsZE9wdGlvbkZsYWdzMiIsImJ1aWxkVHlwZUZsYWdzIiwiYnVpbGRPcHRpb25GbGFnczMiLCJ3cml0ZUludDMyTEUiLCJ3cml0ZVVJbnQxNkxFIiwiYnVmZmVyIiwiZnJvbSIsInB1c2giLCJzY3JhbWJsZVBhc3N3b3JkIiwiZXh0ZW5zaW9ucyIsImJ1aWxkRmVhdHVyZUV4dCIsImV4dGVuc2lvbk9mZnNldCIsImNvcHkiLCJkYXRhIiwiY29uY2F0IiwiZmxhZ3MxIiwidHlwZSIsImVjaG8iLCJ3b3JrZmxvdyIsInRva2VuIiwiZmVkQXV0aFRva2VuIiwiYnVmIiwidmVyc2lvbnMiLCJVVEY4X1NVUFBPUlRfRkVBVFVSRV9JRCIsIlVURjhfU1VQUE9SVF9DTElFTlRfU1VQUE9SVFNfVVRGOCIsImZsYWdzMiIsInR5cGVGbGFncyIsImIiLCJsZW4iLCJieXRlIiwibG93TmliYmxlIiwiaGlnaE5pYmJsZSIsInRvU3RyaW5nIiwiaW5kZW50IiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9sb2dpbjctcGF5bG9hZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcHJpbnRmIH0gZnJvbSAnc3ByaW50Zi1qcyc7XG5pbXBvcnQgeyB2ZXJzaW9ucyB9IGZyb20gJy4vdGRzLXZlcnNpb25zJztcblxuY29uc3QgRkxBR1NfMSA9IHtcbiAgRU5ESUFOX0xJVFRMRTogMHgwMCxcbiAgRU5ESUFOX0JJRzogMHgwMSxcbiAgQ0hBUlNFVF9BU0NJSTogMHgwMCxcbiAgQ0hBUlNFVF9FQkNESUM6IDB4MDIsXG4gIEZMT0FUX0lFRUVfNzU0OiAweDAwLFxuICBGTE9BVF9WQVg6IDB4MDQsXG4gIEZMT0FUX05ENTAwMDogMHgwOCxcbiAgQkNQX0RVTVBMT0FEX09OOiAweDAwLFxuICBCQ1BfRFVNUExPQURfT0ZGOiAweDEwLFxuICBVU0VfREJfT046IDB4MDAsXG4gIFVTRV9EQl9PRkY6IDB4MjAsXG4gIElOSVRfREJfV0FSTjogMHgwMCxcbiAgSU5JVF9EQl9GQVRBTDogMHg0MCxcbiAgU0VUX0xBTkdfV0FSTl9PRkY6IDB4MDAsXG4gIFNFVF9MQU5HX1dBUk5fT046IDB4ODBcbn07XG5cbmNvbnN0IEZMQUdTXzIgPSB7XG4gIElOSVRfTEFOR19XQVJOOiAweDAwLFxuICBJTklUX0xBTkdfRkFUQUw6IDB4MDEsXG4gIE9EQkNfT0ZGOiAweDAwLFxuICBPREJDX09OOiAweDAyLFxuICBGX1RSQU5fQk9VTkRBUlk6IDB4MDQsXG4gIEZfQ0FDSEVfQ09OTkVDVDogMHgwOCxcbiAgVVNFUl9OT1JNQUw6IDB4MDAsXG4gIFVTRVJfU0VSVkVSOiAweDEwLFxuICBVU0VSX1JFTVVTRVI6IDB4MjAsXG4gIFVTRVJfU1FMUkVQTDogMHg0MCxcbiAgSU5URUdSQVRFRF9TRUNVUklUWV9PRkY6IDB4MDAsXG4gIElOVEVHUkFURURfU0VDVVJJVFlfT046IDB4ODBcbn07XG5cbmNvbnN0IFRZUEVfRkxBR1MgPSB7XG4gIFNRTF9ERkxUOiAweDAwLFxuICBTUUxfVFNRTDogMHgwOCxcbiAgT0xFREJfT0ZGOiAweDAwLFxuICBPTEVEQl9PTjogMHgxMCxcbiAgUkVBRF9XUklURV9JTlRFTlQ6IDB4MDAsXG4gIFJFQURfT05MWV9JTlRFTlQ6IDB4MjBcbn07XG5cbmNvbnN0IEZMQUdTXzMgPSB7XG4gIENIQU5HRV9QQVNTV09SRF9OTzogMHgwMCxcbiAgQ0hBTkdFX1BBU1NXT1JEX1lFUzogMHgwMSxcbiAgQklOQVJZX1hNTDogMHgwMixcbiAgU1BBV05fVVNFUl9JTlNUQU5DRTogMHgwNCxcbiAgVU5LTk9XTl9DT0xMQVRJT05fSEFORExJTkc6IDB4MDgsXG4gIEVYVEVOU0lPTl9VU0VEOiAweDEwXG59O1xuXG5jb25zdCBGRURBVVRIX09QVElPTlMgPSB7XG4gIEZFQVRVUkVfSUQ6IDB4MDIsXG4gIExJQlJBUllfU0VDVVJJVFlUT0tFTjogMHgwMSxcbiAgTElCUkFSWV9BREFMOiAweDAyLFxuICBGRURBVVRIX1lFU19FQ0hPOiAweDAxLFxuICBGRURBVVRIX05PX0VDSE86IDB4MDAsXG4gIEFEQUxfV09SS0ZMT1dfVVNFUl9QQVNTOiAweDAxLFxuICBBREFMX1dPUktGTE9XX0lOVEVHUkFURUQ6IDB4MDJcbn07XG5cbmNvbnN0IEZFQVRVUkVfRVhUX1RFUk1JTkFUT1IgPSAweEZGO1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIHRkc1ZlcnNpb246IG51bWJlcjtcbiAgcGFja2V0U2l6ZTogbnVtYmVyO1xuICBjbGllbnRQcm9nVmVyOiBudW1iZXI7XG4gIGNsaWVudFBpZDogbnVtYmVyO1xuICBjb25uZWN0aW9uSWQ6IG51bWJlcjtcbiAgY2xpZW50VGltZVpvbmU6IG51bWJlcjtcbiAgY2xpZW50TGNpZDogbnVtYmVyO1xufVxuXG4vKlxuICBzMi4yLjYuM1xuICovXG5jbGFzcyBMb2dpbjdQYXlsb2FkIHtcbiAgdGRzVmVyc2lvbjogbnVtYmVyO1xuICBwYWNrZXRTaXplOiBudW1iZXI7XG4gIGNsaWVudFByb2dWZXI6IG51bWJlcjtcbiAgY2xpZW50UGlkOiBudW1iZXI7XG4gIGNvbm5lY3Rpb25JZDogbnVtYmVyO1xuICBjbGllbnRUaW1lWm9uZTogbnVtYmVyO1xuICBjbGllbnRMY2lkOiBudW1iZXI7XG5cbiAgcmVhZE9ubHlJbnRlbnQ6IGJvb2xlYW47XG4gIGluaXREYkZhdGFsOiBib29sZWFuO1xuXG4gIHVzZXJOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHBhc3N3b3JkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHNlcnZlck5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgYXBwTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBob3N0bmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsaWJyYXJ5TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsYW5ndWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBkYXRhYmFzZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjbGllbnRJZDogQnVmZmVyIHwgdW5kZWZpbmVkO1xuICBzc3BpOiBCdWZmZXIgfCB1bmRlZmluZWQ7XG4gIGF0dGFjaERiRmlsZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjaGFuZ2VQYXNzd29yZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGZlZEF1dGg6IHsgdHlwZTogJ0FEQUwnLCBlY2hvOiBib29sZWFuLCB3b3JrZmxvdzogJ2RlZmF1bHQnIHwgJ2ludGVncmF0ZWQnIH0gfCB7IHR5cGU6ICdTRUNVUklUWVRPS0VOJywgZWNobzogYm9vbGVhbiwgZmVkQXV0aFRva2VuOiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcih7IHRkc1ZlcnNpb24sIHBhY2tldFNpemUsIGNsaWVudFByb2dWZXIsIGNsaWVudFBpZCwgY29ubmVjdGlvbklkLCBjbGllbnRUaW1lWm9uZSwgY2xpZW50TGNpZCB9OiBPcHRpb25zKSB7XG4gICAgdGhpcy50ZHNWZXJzaW9uID0gdGRzVmVyc2lvbjtcbiAgICB0aGlzLnBhY2tldFNpemUgPSBwYWNrZXRTaXplO1xuICAgIHRoaXMuY2xpZW50UHJvZ1ZlciA9IGNsaWVudFByb2dWZXI7XG4gICAgdGhpcy5jbGllbnRQaWQgPSBjbGllbnRQaWQ7XG4gICAgdGhpcy5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7XG4gICAgdGhpcy5jbGllbnRUaW1lWm9uZSA9IGNsaWVudFRpbWVab25lO1xuICAgIHRoaXMuY2xpZW50TGNpZCA9IGNsaWVudExjaWQ7XG5cbiAgICB0aGlzLnJlYWRPbmx5SW50ZW50ID0gZmFsc2U7XG4gICAgdGhpcy5pbml0RGJGYXRhbCA9IGZhbHNlO1xuXG4gICAgdGhpcy5mZWRBdXRoID0gdW5kZWZpbmVkO1xuXG4gICAgdGhpcy51c2VyTmFtZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnBhc3N3b3JkID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc2VydmVyTmFtZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmFwcE5hbWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5ob3N0bmFtZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxpYnJhcnlOYW1lID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubGFuZ3VhZ2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5kYXRhYmFzZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNsaWVudElkID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc3NwaSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmF0dGFjaERiRmlsZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNoYW5nZVBhc3N3b3JkID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgdG9CdWZmZXIoKSB7XG4gICAgY29uc3QgZml4ZWREYXRhID0gQnVmZmVyLmFsbG9jKDk0KTtcbiAgICBjb25zdCBidWZmZXJzID0gW2ZpeGVkRGF0YV07XG5cbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICBsZXQgZGF0YU9mZnNldCA9IGZpeGVkRGF0YS5sZW5ndGg7XG5cbiAgICAvLyBMZW5ndGg6IDQtYnl0ZVxuICAgIG9mZnNldCA9IGZpeGVkRGF0YS53cml0ZVVJbnQzMkxFKDAsIG9mZnNldCk7XG5cbiAgICAvLyBURFNWZXJzaW9uOiA0LWJ5dGVcbiAgICBvZmZzZXQgPSBmaXhlZERhdGEud3JpdGVVSW50MzJMRSh0aGlzLnRkc1ZlcnNpb24sIG9mZnNldCk7XG5cbiAgICAvLyBQYWNrZXRTaXplOiA0LWJ5dGVcbiAgICBvZmZzZXQgPSBmaXhlZERhdGEud3JpdGVVSW50MzJMRSh0aGlzLnBhY2tldFNpemUsIG9mZnNldCk7XG5cbiAgICAvLyBDbGllbnRQcm9nVmVyOiA0LWJ5dGVcbiAgICBvZmZzZXQgPSBmaXhlZERhdGEud3JpdGVVSW50MzJMRSh0aGlzLmNsaWVudFByb2dWZXIsIG9mZnNldCk7XG5cbiAgICAvLyBDbGllbnRQSUQ6IDQtYnl0ZVxuICAgIG9mZnNldCA9IGZpeGVkRGF0YS53cml0ZVVJbnQzMkxFKHRoaXMuY2xpZW50UGlkLCBvZmZzZXQpO1xuXG4gICAgLy8gQ29ubmVjdGlvbklEOiA0LWJ5dGVcbiAgICBvZmZzZXQgPSBmaXhlZERhdGEud3JpdGVVSW50MzJMRSh0aGlzLmNvbm5lY3Rpb25JZCwgb2Zmc2V0KTtcblxuICAgIC8vIE9wdGlvbkZsYWdzMTogMS1ieXRlXG4gICAgb2Zmc2V0ID0gZml4ZWREYXRhLndyaXRlVUludDgodGhpcy5idWlsZE9wdGlvbkZsYWdzMSgpLCBvZmZzZXQpO1xuXG4gICAgLy8gT3B0aW9uRmxhZ3MyOiAxLWJ5dGVcbiAgICBvZmZzZXQgPSBmaXhlZERhdGEud3JpdGVVSW50OCh0aGlzLmJ1aWxkT3B0aW9uRmxhZ3MyKCksIG9mZnNldCk7XG5cbiAgICAvLyBUeXBlRmxhZ3M6IDEtYnl0ZVxuICAgIG9mZnNldCA9IGZpeGVkRGF0YS53cml0ZVVJbnQ4KHRoaXMuYnVpbGRUeXBlRmxhZ3MoKSwgb2Zmc2V0KTtcblxuICAgIC8vIE9wdGlvbkZsYWdzMzogMS1ieXRlXG4gICAgb2Zmc2V0ID0gZml4ZWREYXRhLndyaXRlVUludDgodGhpcy5idWlsZE9wdGlvbkZsYWdzMygpLCBvZmZzZXQpO1xuXG4gICAgLy8gQ2xpZW50VGltWm9uZTogNC1ieXRlXG4gICAgb2Zmc2V0ID0gZml4ZWREYXRhLndyaXRlSW50MzJMRSh0aGlzLmNsaWVudFRpbWVab25lLCBvZmZzZXQpO1xuXG4gICAgLy8gQ2xpZW50TENJRDogNC1ieXRlXG4gICAgb2Zmc2V0ID0gZml4ZWREYXRhLndyaXRlVUludDMyTEUodGhpcy5jbGllbnRMY2lkLCBvZmZzZXQpO1xuXG4gICAgLy8gaWJIb3N0TmFtZTogMi1ieXRlXG4gICAgb2Zmc2V0ID0gZml4ZWREYXRhLndyaXRlVUludDE2TEUoZGF0YU9mZnNldCwgb2Zmc2V0KTtcblxuICAgIC8vIGNjaEhvc3ROYW1lOiAyLWJ5dGVcbiAgICBpZiAodGhpcy5ob3N0bmFtZSkge1xuICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20odGhpcy5ob3N0bmFtZSwgJ3VjczInKTtcblxuICAgICAgb2Zmc2V0ID0gZml4ZWREYXRhLndyaXRlVUludDE2TEUoYnVmZmVyLmxlbmd0aCAvIDIsIG9mZnNldCk7XG4gICAgICBkYXRhT2Zmc2V0ICs9IGJ1ZmZlci5sZW5ndGg7XG5cbiAgICAgIGJ1ZmZlcnMucHVzaChidWZmZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvZmZzZXQgPSBmaXhlZERhdGEud3JpdGVVSW50MTZMRShkYXRhT2Zmc2V0LCBvZmZzZXQpO1xuICAgIH1cblxuICAgIC8vIGliVXNlck5hbWU6IDItYnl0ZVxuICAgIG9mZnNldCA9IGZpeGVkRGF0YS53cml0ZVVJbnQxNkxFKGRhdGFPZmZzZXQsIG9mZnNldCk7XG5cbiAgICAvLyBjY2hVc2VyTmFtZTogMi1ieXRlXG4gICAgaWYgKHRoaXMudXNlck5hbWUpIHtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHRoaXMudXNlck5hbWUsICd1Y3MyJyk7XG5cbiAgICAgIG9mZnNldCA9IGZpeGVkRGF0YS53cml0ZVVJbnQxNkxFKGJ1ZmZlci5sZW5ndGggLyAyLCBvZmZzZXQpO1xuICAgICAgZGF0YU9mZnNldCArPSBidWZmZXIubGVuZ3RoO1xuXG4gICAgICBidWZmZXJzLnB1c2goYnVmZmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2Zmc2V0ID0gZml4ZWREYXRhLndyaXRlVUludDE2TEUoMCwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICAvLyBpYlBhc3N3b3JkOiAyLWJ5dGVcbiAgICBvZmZzZXQgPSBmaXhlZERhdGEud3JpdGVVSW50MTZMRShkYXRhT2Zmc2V0LCBvZmZzZXQpO1xuXG4gICAgLy8gY2NoUGFzc3dvcmQ6IDItYnl0ZVxuICAgIGlmICh0aGlzLnBhc3N3b3JkKSB7XG4gICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbSh0aGlzLnBhc3N3b3JkLCAndWNzMicpO1xuXG4gICAgICBvZmZzZXQgPSBmaXhlZERhdGEud3JpdGVVSW50MTZMRShidWZmZXIubGVuZ3RoIC8gMiwgb2Zmc2V0KTtcbiAgICAgIGRhdGFPZmZzZXQgKz0gYnVmZmVyLmxlbmd0aDtcblxuICAgICAgYnVmZmVycy5wdXNoKHRoaXMuc2NyYW1ibGVQYXNzd29yZChidWZmZXIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2Zmc2V0ID0gZml4ZWREYXRhLndyaXRlVUludDE2TEUoMCwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICAvLyBpYkFwcE5hbWU6IDItYnl0ZVxuICAgIG9mZnNldCA9IGZpeGVkRGF0YS53cml0ZVVJbnQxNkxFKGRhdGFPZmZzZXQsIG9mZnNldCk7XG5cbiAgICAvLyBjY2hBcHBOYW1lOiAyLWJ5dGVcbiAgICBpZiAodGhpcy5hcHBOYW1lKSB7XG4gICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbSh0aGlzLmFwcE5hbWUsICd1Y3MyJyk7XG5cbiAgICAgIG9mZnNldCA9IGZpeGVkRGF0YS53cml0ZVVJbnQxNkxFKGJ1ZmZlci5sZW5ndGggLyAyLCBvZmZzZXQpO1xuICAgICAgZGF0YU9mZnNldCArPSBidWZmZXIubGVuZ3RoO1xuXG4gICAgICBidWZmZXJzLnB1c2goYnVmZmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2Zmc2V0ID0gZml4ZWREYXRhLndyaXRlVUludDE2TEUoMCwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICAvLyBpYlNlcnZlck5hbWU6IDItYnl0ZVxuICAgIG9mZnNldCA9IGZpeGVkRGF0YS53cml0ZVVJbnQxNkxFKGRhdGFPZmZzZXQsIG9mZnNldCk7XG5cbiAgICAvLyBjY2hTZXJ2ZXJOYW1lOiAyLWJ5dGVcbiAgICBpZiAodGhpcy5zZXJ2ZXJOYW1lKSB7XG4gICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbSh0aGlzLnNlcnZlck5hbWUsICd1Y3MyJyk7XG5cbiAgICAgIG9mZnNldCA9IGZpeGVkRGF0YS53cml0ZVVJbnQxNkxFKGJ1ZmZlci5sZW5ndGggLyAyLCBvZmZzZXQpO1xuICAgICAgZGF0YU9mZnNldCArPSBidWZmZXIubGVuZ3RoO1xuXG4gICAgICBidWZmZXJzLnB1c2goYnVmZmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2Zmc2V0ID0gZml4ZWREYXRhLndyaXRlVUludDE2TEUoMCwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICAvLyAoaWJVbnVzZWQgLyBpYkV4dGVuc2lvbik6IDItYnl0ZVxuICAgIG9mZnNldCA9IGZpeGVkRGF0YS53cml0ZVVJbnQxNkxFKGRhdGFPZmZzZXQsIG9mZnNldCk7XG5cbiAgICAvLyAoY2NoVW51c2VkIC8gY2JFeHRlbnNpb24pOiAyLWJ5dGVcbiAgICBjb25zdCBleHRlbnNpb25zID0gdGhpcy5idWlsZEZlYXR1cmVFeHQoKTtcbiAgICBvZmZzZXQgPSBmaXhlZERhdGEud3JpdGVVSW50MTZMRSg0LCBvZmZzZXQpO1xuICAgIGNvbnN0IGV4dGVuc2lvbk9mZnNldCA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgICBleHRlbnNpb25PZmZzZXQud3JpdGVVSW50MzJMRShkYXRhT2Zmc2V0ICs9IDQsIDApO1xuICAgIGRhdGFPZmZzZXQgKz0gZXh0ZW5zaW9ucy5sZW5ndGg7XG4gICAgYnVmZmVycy5wdXNoKGV4dGVuc2lvbk9mZnNldCwgZXh0ZW5zaW9ucyk7XG5cbiAgICAvLyBpYkNsdEludE5hbWU6IDItYnl0ZVxuICAgIG9mZnNldCA9IGZpeGVkRGF0YS53cml0ZVVJbnQxNkxFKGRhdGFPZmZzZXQsIG9mZnNldCk7XG5cbiAgICAvLyBjY2hDbHRJbnROYW1lOiAyLWJ5dGVcbiAgICBpZiAodGhpcy5saWJyYXJ5TmFtZSkge1xuICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20odGhpcy5saWJyYXJ5TmFtZSwgJ3VjczInKTtcblxuICAgICAgb2Zmc2V0ID0gZml4ZWREYXRhLndyaXRlVUludDE2TEUoYnVmZmVyLmxlbmd0aCAvIDIsIG9mZnNldCk7XG4gICAgICBkYXRhT2Zmc2V0ICs9IGJ1ZmZlci5sZW5ndGg7XG5cbiAgICAgIGJ1ZmZlcnMucHVzaChidWZmZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvZmZzZXQgPSBmaXhlZERhdGEud3JpdGVVSW50MTZMRSgwLCBvZmZzZXQpO1xuICAgIH1cblxuICAgIC8vIGliTGFuZ3VhZ2U6IDItYnl0ZVxuICAgIG9mZnNldCA9IGZpeGVkRGF0YS53cml0ZVVJbnQxNkxFKGRhdGFPZmZzZXQsIG9mZnNldCk7XG5cbiAgICAvLyBjY2hMYW5ndWFnZTogMi1ieXRlXG4gICAgaWYgKHRoaXMubGFuZ3VhZ2UpIHtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHRoaXMubGFuZ3VhZ2UsICd1Y3MyJyk7XG5cbiAgICAgIG9mZnNldCA9IGZpeGVkRGF0YS53cml0ZVVJbnQxNkxFKGJ1ZmZlci5sZW5ndGggLyAyLCBvZmZzZXQpO1xuICAgICAgZGF0YU9mZnNldCArPSBidWZmZXIubGVuZ3RoO1xuXG4gICAgICBidWZmZXJzLnB1c2goYnVmZmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2Zmc2V0ID0gZml4ZWREYXRhLndyaXRlVUludDE2TEUoMCwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICAvLyBpYkRhdGFiYXNlOiAyLWJ5dGVcbiAgICBvZmZzZXQgPSBmaXhlZERhdGEud3JpdGVVSW50MTZMRShkYXRhT2Zmc2V0LCBvZmZzZXQpO1xuXG4gICAgLy8gY2NoRGF0YWJhc2U6IDItYnl0ZVxuICAgIGlmICh0aGlzLmRhdGFiYXNlKSB7XG4gICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbSh0aGlzLmRhdGFiYXNlLCAndWNzMicpO1xuXG4gICAgICBvZmZzZXQgPSBmaXhlZERhdGEud3JpdGVVSW50MTZMRShidWZmZXIubGVuZ3RoIC8gMiwgb2Zmc2V0KTtcbiAgICAgIGRhdGFPZmZzZXQgKz0gYnVmZmVyLmxlbmd0aDtcblxuICAgICAgYnVmZmVycy5wdXNoKGJ1ZmZlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9mZnNldCA9IGZpeGVkRGF0YS53cml0ZVVJbnQxNkxFKDAsIG9mZnNldCk7XG4gICAgfVxuXG4gICAgLy8gQ2xpZW50SUQ6IDYtYnl0ZVxuICAgIGlmICh0aGlzLmNsaWVudElkKSB7XG4gICAgICB0aGlzLmNsaWVudElkLmNvcHkoZml4ZWREYXRhLCBvZmZzZXQsIDAsIDYpO1xuICAgIH1cbiAgICBvZmZzZXQgKz0gNjtcblxuICAgIC8vIGliU1NQSTogMi1ieXRlXG4gICAgb2Zmc2V0ID0gZml4ZWREYXRhLndyaXRlVUludDE2TEUoZGF0YU9mZnNldCwgb2Zmc2V0KTtcblxuICAgIC8vIGNiU1NQSTogMi1ieXRlXG4gICAgaWYgKHRoaXMuc3NwaSkge1xuICAgICAgaWYgKHRoaXMuc3NwaS5sZW5ndGggPiA2NTUzNSkge1xuICAgICAgICBvZmZzZXQgPSBmaXhlZERhdGEud3JpdGVVSW50MTZMRSg2NTUzNSwgb2Zmc2V0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9mZnNldCA9IGZpeGVkRGF0YS53cml0ZVVJbnQxNkxFKHRoaXMuc3NwaS5sZW5ndGgsIG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIGJ1ZmZlcnMucHVzaCh0aGlzLnNzcGkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvZmZzZXQgPSBmaXhlZERhdGEud3JpdGVVSW50MTZMRSgwLCBvZmZzZXQpO1xuICAgIH1cblxuICAgIC8vIGliQXRjaERCRmlsZTogMi1ieXRlXG4gICAgb2Zmc2V0ID0gZml4ZWREYXRhLndyaXRlVUludDE2TEUoZGF0YU9mZnNldCwgb2Zmc2V0KTtcblxuICAgIC8vIGNjaEF0Y2hEQkZpbGU6IDItYnl0ZVxuICAgIGlmICh0aGlzLmF0dGFjaERiRmlsZSkge1xuICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20odGhpcy5hdHRhY2hEYkZpbGUsICd1Y3MyJyk7XG5cbiAgICAgIG9mZnNldCA9IGZpeGVkRGF0YS53cml0ZVVJbnQxNkxFKGJ1ZmZlci5sZW5ndGggLyAyLCBvZmZzZXQpO1xuICAgICAgZGF0YU9mZnNldCArPSBidWZmZXIubGVuZ3RoO1xuXG4gICAgICBidWZmZXJzLnB1c2goYnVmZmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2Zmc2V0ID0gZml4ZWREYXRhLndyaXRlVUludDE2TEUoMCwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICAvLyBpYkNoYW5nZVBhc3N3b3JkOiAyLWJ5dGVcbiAgICBvZmZzZXQgPSBmaXhlZERhdGEud3JpdGVVSW50MTZMRShkYXRhT2Zmc2V0LCBvZmZzZXQpO1xuXG4gICAgLy8gY2NoQ2hhbmdlUGFzc3dvcmQ6IDItYnl0ZVxuICAgIGlmICh0aGlzLmNoYW5nZVBhc3N3b3JkKSB7XG4gICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbSh0aGlzLmNoYW5nZVBhc3N3b3JkLCAndWNzMicpO1xuXG4gICAgICBvZmZzZXQgPSBmaXhlZERhdGEud3JpdGVVSW50MTZMRShidWZmZXIubGVuZ3RoIC8gMiwgb2Zmc2V0KTtcbiAgICAgIGRhdGFPZmZzZXQgKz0gYnVmZmVyLmxlbmd0aDtcblxuICAgICAgYnVmZmVycy5wdXNoKGJ1ZmZlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9mZnNldCA9IGZpeGVkRGF0YS53cml0ZVVJbnQxNkxFKDAsIG9mZnNldCk7XG4gICAgfVxuXG4gICAgLy8gY2JTU1BJTG9uZzogNC1ieXRlXG4gICAgaWYgKHRoaXMuc3NwaSAmJiB0aGlzLnNzcGkubGVuZ3RoID4gNjU1MzUpIHtcbiAgICAgIGZpeGVkRGF0YS53cml0ZVVJbnQzMkxFKHRoaXMuc3NwaS5sZW5ndGgsIG9mZnNldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpeGVkRGF0YS53cml0ZVVJbnQzMkxFKDAsIG9mZnNldCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5jb25jYXQoYnVmZmVycyk7XG4gICAgZGF0YS53cml0ZVVJbnQzMkxFKGRhdGEubGVuZ3RoLCAwKTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGJ1aWxkT3B0aW9uRmxhZ3MxKCkge1xuICAgIGxldCBmbGFnczEgPSBGTEFHU18xLkVORElBTl9MSVRUTEUgfCBGTEFHU18xLkNIQVJTRVRfQVNDSUkgfCBGTEFHU18xLkZMT0FUX0lFRUVfNzU0IHwgRkxBR1NfMS5CQ1BfRFVNUExPQURfT0ZGIHwgRkxBR1NfMS5VU0VfREJfT0ZGIHwgRkxBR1NfMS5TRVRfTEFOR19XQVJOX09OO1xuICAgIGlmICh0aGlzLmluaXREYkZhdGFsKSB7XG4gICAgICBmbGFnczEgfD0gRkxBR1NfMS5JTklUX0RCX0ZBVEFMO1xuICAgIH0gZWxzZSB7XG4gICAgICBmbGFnczEgfD0gRkxBR1NfMS5JTklUX0RCX1dBUk47XG4gICAgfVxuICAgIHJldHVybiBmbGFnczE7XG4gIH1cblxuICBidWlsZEZlYXR1cmVFeHQoKSB7XG4gICAgY29uc3QgYnVmZmVycyA9IFtdO1xuXG4gICAgY29uc3QgZmVkQXV0aCA9IHRoaXMuZmVkQXV0aDtcbiAgICBpZiAoZmVkQXV0aCkge1xuICAgICAgc3dpdGNoIChmZWRBdXRoLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnQURBTCc6XG4gICAgICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jKDcpO1xuICAgICAgICAgIGJ1ZmZlci53cml0ZVVJbnQ4KEZFREFVVEhfT1BUSU9OUy5GRUFUVVJFX0lELCAwKTtcbiAgICAgICAgICBidWZmZXIud3JpdGVVSW50MzJMRSgyLCAxKTtcbiAgICAgICAgICBidWZmZXIud3JpdGVVSW50OCgoRkVEQVVUSF9PUFRJT05TLkxJQlJBUllfQURBTCA8PCAxKSB8IChmZWRBdXRoLmVjaG8gPyBGRURBVVRIX09QVElPTlMuRkVEQVVUSF9ZRVNfRUNITyA6IEZFREFVVEhfT1BUSU9OUy5GRURBVVRIX05PX0VDSE8pLCA1KTtcbiAgICAgICAgICBidWZmZXIud3JpdGVVSW50OChmZWRBdXRoLndvcmtmbG93ID09PSAnaW50ZWdyYXRlZCcgPyAweDAyIDogRkVEQVVUSF9PUFRJT05TLkFEQUxfV09SS0ZMT1dfVVNFUl9QQVNTLCA2KTtcbiAgICAgICAgICBidWZmZXJzLnB1c2goYnVmZmVyKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdTRUNVUklUWVRPS0VOJzpcbiAgICAgICAgICBjb25zdCB0b2tlbiA9IEJ1ZmZlci5mcm9tKGZlZEF1dGguZmVkQXV0aFRva2VuLCAndWNzMicpO1xuICAgICAgICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5hbGxvYygxMCk7XG5cbiAgICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgICAgICBvZmZzZXQgPSBidWYud3JpdGVVSW50OChGRURBVVRIX09QVElPTlMuRkVBVFVSRV9JRCwgb2Zmc2V0KTtcbiAgICAgICAgICBvZmZzZXQgPSBidWYud3JpdGVVSW50MzJMRSh0b2tlbi5sZW5ndGggKyA0ICsgMSwgb2Zmc2V0KTtcbiAgICAgICAgICBvZmZzZXQgPSBidWYud3JpdGVVSW50OCgoRkVEQVVUSF9PUFRJT05TLkxJQlJBUllfU0VDVVJJVFlUT0tFTiA8PCAxKSB8IChmZWRBdXRoLmVjaG8gPyBGRURBVVRIX09QVElPTlMuRkVEQVVUSF9ZRVNfRUNITyA6IEZFREFVVEhfT1BUSU9OUy5GRURBVVRIX05PX0VDSE8pLCBvZmZzZXQpO1xuICAgICAgICAgIGJ1Zi53cml0ZUludDMyTEUodG9rZW4ubGVuZ3RoLCBvZmZzZXQpO1xuXG4gICAgICAgICAgYnVmZmVycy5wdXNoKGJ1Zik7XG4gICAgICAgICAgYnVmZmVycy5wdXNoKHRva2VuKTtcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnRkc1ZlcnNpb24gPj0gdmVyc2lvbnNbJzdfNCddKSB7XG4gICAgICAvLyBTaWduYWwgVVRGLTggc3VwcG9ydDogVmFsdWUgMHgwQSwgYml0IDAgbXVzdCBiZSBzZXQgdG8gMS4gQWRkZWQgaW4gVERTIDcuNC5cbiAgICAgIGNvbnN0IFVURjhfU1VQUE9SVF9GRUFUVVJFX0lEID0gMHgwYTtcbiAgICAgIGNvbnN0IFVURjhfU1VQUE9SVF9DTElFTlRfU1VQUE9SVFNfVVRGOCA9IDB4MDE7XG4gICAgICBjb25zdCBidWYgPSBCdWZmZXIuYWxsb2MoNik7XG4gICAgICBidWYud3JpdGVVSW50OChVVEY4X1NVUFBPUlRfRkVBVFVSRV9JRCwgMCk7XG4gICAgICBidWYud3JpdGVVSW50MzJMRSgxLCAxKTtcbiAgICAgIGJ1Zi53cml0ZVVJbnQ4KFVURjhfU1VQUE9SVF9DTElFTlRfU1VQUE9SVFNfVVRGOCwgNSk7XG4gICAgICBidWZmZXJzLnB1c2goYnVmKTtcbiAgICB9XG5cbiAgICBidWZmZXJzLnB1c2goQnVmZmVyLmZyb20oW0ZFQVRVUkVfRVhUX1RFUk1JTkFUT1JdKSk7XG5cbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChidWZmZXJzKTtcbiAgfVxuXG4gIGJ1aWxkT3B0aW9uRmxhZ3MyKCkge1xuICAgIGxldCBmbGFnczIgPSBGTEFHU18yLklOSVRfTEFOR19XQVJOIHwgRkxBR1NfMi5PREJDX09GRiB8IEZMQUdTXzIuVVNFUl9OT1JNQUw7XG4gICAgaWYgKHRoaXMuc3NwaSkge1xuICAgICAgZmxhZ3MyIHw9IEZMQUdTXzIuSU5URUdSQVRFRF9TRUNVUklUWV9PTjtcbiAgICB9IGVsc2Uge1xuICAgICAgZmxhZ3MyIHw9IEZMQUdTXzIuSU5URUdSQVRFRF9TRUNVUklUWV9PRkY7XG4gICAgfVxuICAgIHJldHVybiBmbGFnczI7XG4gIH1cblxuICBidWlsZFR5cGVGbGFncygpIHtcbiAgICBsZXQgdHlwZUZsYWdzID0gVFlQRV9GTEFHUy5TUUxfREZMVCB8IFRZUEVfRkxBR1MuT0xFREJfT0ZGO1xuICAgIGlmICh0aGlzLnJlYWRPbmx5SW50ZW50KSB7XG4gICAgICB0eXBlRmxhZ3MgfD0gVFlQRV9GTEFHUy5SRUFEX09OTFlfSU5URU5UO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eXBlRmxhZ3MgfD0gVFlQRV9GTEFHUy5SRUFEX1dSSVRFX0lOVEVOVDtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVGbGFncztcbiAgfVxuXG4gIGJ1aWxkT3B0aW9uRmxhZ3MzKCkge1xuICAgIHJldHVybiBGTEFHU18zLkNIQU5HRV9QQVNTV09SRF9OTyB8IEZMQUdTXzMuVU5LTk9XTl9DT0xMQVRJT05fSEFORExJTkcgfCBGTEFHU18zLkVYVEVOU0lPTl9VU0VEO1xuICB9XG5cbiAgc2NyYW1ibGVQYXNzd29yZChwYXNzd29yZDogQnVmZmVyKSB7XG4gICAgZm9yIChsZXQgYiA9IDAsIGxlbiA9IHBhc3N3b3JkLmxlbmd0aDsgYiA8IGxlbjsgYisrKSB7XG4gICAgICBsZXQgYnl0ZSA9IHBhc3N3b3JkW2JdO1xuICAgICAgY29uc3QgbG93TmliYmxlID0gYnl0ZSAmIDB4MGY7XG4gICAgICBjb25zdCBoaWdoTmliYmxlID0gYnl0ZSA+PiA0O1xuICAgICAgYnl0ZSA9IChsb3dOaWJibGUgPDwgNCkgfCBoaWdoTmliYmxlO1xuICAgICAgYnl0ZSA9IGJ5dGUgXiAweGE1O1xuICAgICAgcGFzc3dvcmRbYl0gPSBieXRlO1xuICAgIH1cbiAgICByZXR1cm4gcGFzc3dvcmQ7XG4gIH1cblxuICB0b1N0cmluZyhpbmRlbnQgPSAnJykge1xuICAgIHJldHVybiBpbmRlbnQgKyAnTG9naW43IC0gJyArXG4gICAgICBzcHJpbnRmKCdURFM6MHglMDhYLCBQYWNrZXRTaXplOjB4JTA4WCwgQ2xpZW50UHJvZ1ZlcjoweCUwOFgsIENsaWVudFBJRDoweCUwOFgsIENvbm5lY3Rpb25JRDoweCUwOFgnLFxuICAgICAgICAgICAgICB0aGlzLnRkc1ZlcnNpb24sIHRoaXMucGFja2V0U2l6ZSwgdGhpcy5jbGllbnRQcm9nVmVyLCB0aGlzLmNsaWVudFBpZCwgdGhpcy5jb25uZWN0aW9uSWRcbiAgICAgICkgKyAnXFxuJyArIGluZGVudCArICcgICAgICAgICAnICtcbiAgICAgIHNwcmludGYoJ0ZsYWdzMToweCUwMlgsIEZsYWdzMjoweCUwMlgsIFR5cGVGbGFnczoweCUwMlgsIEZsYWdzMzoweCUwMlgsIENsaWVudFRpbWV6b25lOiVkLCBDbGllbnRMQ0lEOjB4JTA4WCcsXG4gICAgICAgICAgICAgIHRoaXMuYnVpbGRPcHRpb25GbGFnczEoKSwgdGhpcy5idWlsZE9wdGlvbkZsYWdzMigpLCB0aGlzLmJ1aWxkVHlwZUZsYWdzKCksIHRoaXMuYnVpbGRPcHRpb25GbGFnczMoKSwgdGhpcy5jbGllbnRUaW1lWm9uZSwgdGhpcy5jbGllbnRMY2lkXG4gICAgICApICsgJ1xcbicgKyBpbmRlbnQgKyAnICAgICAgICAgJyArXG4gICAgICBzcHJpbnRmKFwiSG9zdG5hbWU6JyVzJywgVXNlcm5hbWU6JyVzJywgUGFzc3dvcmQ6JyVzJywgQXBwTmFtZTonJXMnLCBTZXJ2ZXJOYW1lOiclcycsIExpYnJhcnlOYW1lOiclcydcIixcbiAgICAgICAgICAgICAgdGhpcy5ob3N0bmFtZSwgdGhpcy51c2VyTmFtZSwgdGhpcy5wYXNzd29yZCwgdGhpcy5hcHBOYW1lLCB0aGlzLnNlcnZlck5hbWUsIHRoaXMubGlicmFyeU5hbWVcbiAgICAgICkgKyAnXFxuJyArIGluZGVudCArICcgICAgICAgICAnICtcbiAgICAgIHNwcmludGYoXCJMYW5ndWFnZTonJXMnLCBEYXRhYmFzZTonJXMnLCBTU1BJOiclcycsIEF0dGFjaERiRmlsZTonJXMnLCBDaGFuZ2VQYXNzd29yZDonJXMnXCIsXG4gICAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2UsIHRoaXMuZGF0YWJhc2UsIHRoaXMuc3NwaSwgdGhpcy5hdHRhY2hEYkZpbGUsIHRoaXMuY2hhbmdlUGFzc3dvcmRcbiAgICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTG9naW43UGF5bG9hZDtcbm1vZHVsZS5leHBvcnRzID0gTG9naW43UGF5bG9hZDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOztBQUVBLE1BQU1BLE9BQU8sR0FBRztFQUNkQyxhQUFhLEVBQUUsSUFERDtFQUVkQyxVQUFVLEVBQUUsSUFGRTtFQUdkQyxhQUFhLEVBQUUsSUFIRDtFQUlkQyxjQUFjLEVBQUUsSUFKRjtFQUtkQyxjQUFjLEVBQUUsSUFMRjtFQU1kQyxTQUFTLEVBQUUsSUFORztFQU9kQyxZQUFZLEVBQUUsSUFQQTtFQVFkQyxlQUFlLEVBQUUsSUFSSDtFQVNkQyxnQkFBZ0IsRUFBRSxJQVRKO0VBVWRDLFNBQVMsRUFBRSxJQVZHO0VBV2RDLFVBQVUsRUFBRSxJQVhFO0VBWWRDLFlBQVksRUFBRSxJQVpBO0VBYWRDLGFBQWEsRUFBRSxJQWJEO0VBY2RDLGlCQUFpQixFQUFFLElBZEw7RUFlZEMsZ0JBQWdCLEVBQUU7QUFmSixDQUFoQjtBQWtCQSxNQUFNQyxPQUFPLEdBQUc7RUFDZEMsY0FBYyxFQUFFLElBREY7RUFFZEMsZUFBZSxFQUFFLElBRkg7RUFHZEMsUUFBUSxFQUFFLElBSEk7RUFJZEMsT0FBTyxFQUFFLElBSks7RUFLZEMsZUFBZSxFQUFFLElBTEg7RUFNZEMsZUFBZSxFQUFFLElBTkg7RUFPZEMsV0FBVyxFQUFFLElBUEM7RUFRZEMsV0FBVyxFQUFFLElBUkM7RUFTZEMsWUFBWSxFQUFFLElBVEE7RUFVZEMsWUFBWSxFQUFFLElBVkE7RUFXZEMsdUJBQXVCLEVBQUUsSUFYWDtFQVlkQyxzQkFBc0IsRUFBRTtBQVpWLENBQWhCO0FBZUEsTUFBTUMsVUFBVSxHQUFHO0VBQ2pCQyxRQUFRLEVBQUUsSUFETztFQUVqQkMsUUFBUSxFQUFFLElBRk87RUFHakJDLFNBQVMsRUFBRSxJQUhNO0VBSWpCQyxRQUFRLEVBQUUsSUFKTztFQUtqQkMsaUJBQWlCLEVBQUUsSUFMRjtFQU1qQkMsZ0JBQWdCLEVBQUU7QUFORCxDQUFuQjtBQVNBLE1BQU1DLE9BQU8sR0FBRztFQUNkQyxrQkFBa0IsRUFBRSxJQUROO0VBRWRDLG1CQUFtQixFQUFFLElBRlA7RUFHZEMsVUFBVSxFQUFFLElBSEU7RUFJZEMsbUJBQW1CLEVBQUUsSUFKUDtFQUtkQywwQkFBMEIsRUFBRSxJQUxkO0VBTWRDLGNBQWMsRUFBRTtBQU5GLENBQWhCO0FBU0EsTUFBTUMsZUFBZSxHQUFHO0VBQ3RCQyxVQUFVLEVBQUUsSUFEVTtFQUV0QkMscUJBQXFCLEVBQUUsSUFGRDtFQUd0QkMsWUFBWSxFQUFFLElBSFE7RUFJdEJDLGdCQUFnQixFQUFFLElBSkk7RUFLdEJDLGVBQWUsRUFBRSxJQUxLO0VBTXRCQyx1QkFBdUIsRUFBRSxJQU5IO0VBT3RCQyx3QkFBd0IsRUFBRTtBQVBKLENBQXhCO0FBVUEsTUFBTUMsc0JBQXNCLEdBQUcsSUFBL0I7O0FBWUE7QUFDQTtBQUNBO0FBQ0EsTUFBTUMsYUFBTixDQUFvQjtFQTJCbEJDLFdBQVcsQ0FBQztJQUFFQyxVQUFGO0lBQWNDLFVBQWQ7SUFBMEJDLGFBQTFCO0lBQXlDQyxTQUF6QztJQUFvREMsWUFBcEQ7SUFBa0VDLGNBQWxFO0lBQWtGQztFQUFsRixDQUFELEVBQTBHO0lBQUEsS0ExQnJITixVQTBCcUg7SUFBQSxLQXpCckhDLFVBeUJxSDtJQUFBLEtBeEJySEMsYUF3QnFIO0lBQUEsS0F2QnJIQyxTQXVCcUg7SUFBQSxLQXRCckhDLFlBc0JxSDtJQUFBLEtBckJySEMsY0FxQnFIO0lBQUEsS0FwQnJIQyxVQW9CcUg7SUFBQSxLQWxCckhDLGNBa0JxSDtJQUFBLEtBakJySEMsV0FpQnFIO0lBQUEsS0FmckhDLFFBZXFIO0lBQUEsS0FkckhDLFFBY3FIO0lBQUEsS0FickhDLFVBYXFIO0lBQUEsS0FackhDLE9BWXFIO0lBQUEsS0FYckhDLFFBV3FIO0lBQUEsS0FWckhDLFdBVXFIO0lBQUEsS0FUckhDLFFBU3FIO0lBQUEsS0FSckhDLFFBUXFIO0lBQUEsS0FQckhDLFFBT3FIO0lBQUEsS0FOckhDLElBTXFIO0lBQUEsS0FMckhDLFlBS3FIO0lBQUEsS0FKckhDLGNBSXFIO0lBQUEsS0FGckhDLE9BRXFIO0lBQ25ILEtBQUtyQixVQUFMLEdBQWtCQSxVQUFsQjtJQUNBLEtBQUtDLFVBQUwsR0FBa0JBLFVBQWxCO0lBQ0EsS0FBS0MsYUFBTCxHQUFxQkEsYUFBckI7SUFDQSxLQUFLQyxTQUFMLEdBQWlCQSxTQUFqQjtJQUNBLEtBQUtDLFlBQUwsR0FBb0JBLFlBQXBCO0lBQ0EsS0FBS0MsY0FBTCxHQUFzQkEsY0FBdEI7SUFDQSxLQUFLQyxVQUFMLEdBQWtCQSxVQUFsQjtJQUVBLEtBQUtDLGNBQUwsR0FBc0IsS0FBdEI7SUFDQSxLQUFLQyxXQUFMLEdBQW1CLEtBQW5CO0lBRUEsS0FBS2EsT0FBTCxHQUFlQyxTQUFmO0lBRUEsS0FBS2IsUUFBTCxHQUFnQmEsU0FBaEI7SUFDQSxLQUFLWixRQUFMLEdBQWdCWSxTQUFoQjtJQUNBLEtBQUtYLFVBQUwsR0FBa0JXLFNBQWxCO0lBQ0EsS0FBS1YsT0FBTCxHQUFlVSxTQUFmO0lBQ0EsS0FBS1QsUUFBTCxHQUFnQlMsU0FBaEI7SUFDQSxLQUFLUixXQUFMLEdBQW1CUSxTQUFuQjtJQUNBLEtBQUtQLFFBQUwsR0FBZ0JPLFNBQWhCO0lBQ0EsS0FBS04sUUFBTCxHQUFnQk0sU0FBaEI7SUFDQSxLQUFLTCxRQUFMLEdBQWdCSyxTQUFoQjtJQUNBLEtBQUtKLElBQUwsR0FBWUksU0FBWjtJQUNBLEtBQUtILFlBQUwsR0FBb0JHLFNBQXBCO0lBQ0EsS0FBS0YsY0FBTCxHQUFzQkUsU0FBdEI7RUFDRDs7RUFFREMsUUFBUSxHQUFHO0lBQ1QsTUFBTUMsU0FBUyxHQUFHQyxNQUFNLENBQUNDLEtBQVAsQ0FBYSxFQUFiLENBQWxCO0lBQ0EsTUFBTUMsT0FBTyxHQUFHLENBQUNILFNBQUQsQ0FBaEI7SUFFQSxJQUFJSSxNQUFNLEdBQUcsQ0FBYjtJQUNBLElBQUlDLFVBQVUsR0FBR0wsU0FBUyxDQUFDTSxNQUEzQixDQUxTLENBT1Q7O0lBQ0FGLE1BQU0sR0FBR0osU0FBUyxDQUFDTyxhQUFWLENBQXdCLENBQXhCLEVBQTJCSCxNQUEzQixDQUFULENBUlMsQ0FVVDs7SUFDQUEsTUFBTSxHQUFHSixTQUFTLENBQUNPLGFBQVYsQ0FBd0IsS0FBSy9CLFVBQTdCLEVBQXlDNEIsTUFBekMsQ0FBVCxDQVhTLENBYVQ7O0lBQ0FBLE1BQU0sR0FBR0osU0FBUyxDQUFDTyxhQUFWLENBQXdCLEtBQUs5QixVQUE3QixFQUF5QzJCLE1BQXpDLENBQVQsQ0FkUyxDQWdCVDs7SUFDQUEsTUFBTSxHQUFHSixTQUFTLENBQUNPLGFBQVYsQ0FBd0IsS0FBSzdCLGFBQTdCLEVBQTRDMEIsTUFBNUMsQ0FBVCxDQWpCUyxDQW1CVDs7SUFDQUEsTUFBTSxHQUFHSixTQUFTLENBQUNPLGFBQVYsQ0FBd0IsS0FBSzVCLFNBQTdCLEVBQXdDeUIsTUFBeEMsQ0FBVCxDQXBCUyxDQXNCVDs7SUFDQUEsTUFBTSxHQUFHSixTQUFTLENBQUNPLGFBQVYsQ0FBd0IsS0FBSzNCLFlBQTdCLEVBQTJDd0IsTUFBM0MsQ0FBVCxDQXZCUyxDQXlCVDs7SUFDQUEsTUFBTSxHQUFHSixTQUFTLENBQUNRLFVBQVYsQ0FBcUIsS0FBS0MsaUJBQUwsRUFBckIsRUFBK0NMLE1BQS9DLENBQVQsQ0ExQlMsQ0E0QlQ7O0lBQ0FBLE1BQU0sR0FBR0osU0FBUyxDQUFDUSxVQUFWLENBQXFCLEtBQUtFLGlCQUFMLEVBQXJCLEVBQStDTixNQUEvQyxDQUFULENBN0JTLENBK0JUOztJQUNBQSxNQUFNLEdBQUdKLFNBQVMsQ0FBQ1EsVUFBVixDQUFxQixLQUFLRyxjQUFMLEVBQXJCLEVBQTRDUCxNQUE1QyxDQUFULENBaENTLENBa0NUOztJQUNBQSxNQUFNLEdBQUdKLFNBQVMsQ0FBQ1EsVUFBVixDQUFxQixLQUFLSSxpQkFBTCxFQUFyQixFQUErQ1IsTUFBL0MsQ0FBVCxDQW5DUyxDQXFDVDs7SUFDQUEsTUFBTSxHQUFHSixTQUFTLENBQUNhLFlBQVYsQ0FBdUIsS0FBS2hDLGNBQTVCLEVBQTRDdUIsTUFBNUMsQ0FBVCxDQXRDUyxDQXdDVDs7SUFDQUEsTUFBTSxHQUFHSixTQUFTLENBQUNPLGFBQVYsQ0FBd0IsS0FBS3pCLFVBQTdCLEVBQXlDc0IsTUFBekMsQ0FBVCxDQXpDUyxDQTJDVDs7SUFDQUEsTUFBTSxHQUFHSixTQUFTLENBQUNjLGFBQVYsQ0FBd0JULFVBQXhCLEVBQW9DRCxNQUFwQyxDQUFULENBNUNTLENBOENUOztJQUNBLElBQUksS0FBS2YsUUFBVCxFQUFtQjtNQUNqQixNQUFNMEIsTUFBTSxHQUFHZCxNQUFNLENBQUNlLElBQVAsQ0FBWSxLQUFLM0IsUUFBakIsRUFBMkIsTUFBM0IsQ0FBZjtNQUVBZSxNQUFNLEdBQUdKLFNBQVMsQ0FBQ2MsYUFBVixDQUF3QkMsTUFBTSxDQUFDVCxNQUFQLEdBQWdCLENBQXhDLEVBQTJDRixNQUEzQyxDQUFUO01BQ0FDLFVBQVUsSUFBSVUsTUFBTSxDQUFDVCxNQUFyQjtNQUVBSCxPQUFPLENBQUNjLElBQVIsQ0FBYUYsTUFBYjtJQUNELENBUEQsTUFPTztNQUNMWCxNQUFNLEdBQUdKLFNBQVMsQ0FBQ2MsYUFBVixDQUF3QlQsVUFBeEIsRUFBb0NELE1BQXBDLENBQVQ7SUFDRCxDQXhEUSxDQTBEVDs7O0lBQ0FBLE1BQU0sR0FBR0osU0FBUyxDQUFDYyxhQUFWLENBQXdCVCxVQUF4QixFQUFvQ0QsTUFBcEMsQ0FBVCxDQTNEUyxDQTZEVDs7SUFDQSxJQUFJLEtBQUtuQixRQUFULEVBQW1CO01BQ2pCLE1BQU04QixNQUFNLEdBQUdkLE1BQU0sQ0FBQ2UsSUFBUCxDQUFZLEtBQUsvQixRQUFqQixFQUEyQixNQUEzQixDQUFmO01BRUFtQixNQUFNLEdBQUdKLFNBQVMsQ0FBQ2MsYUFBVixDQUF3QkMsTUFBTSxDQUFDVCxNQUFQLEdBQWdCLENBQXhDLEVBQTJDRixNQUEzQyxDQUFUO01BQ0FDLFVBQVUsSUFBSVUsTUFBTSxDQUFDVCxNQUFyQjtNQUVBSCxPQUFPLENBQUNjLElBQVIsQ0FBYUYsTUFBYjtJQUNELENBUEQsTUFPTztNQUNMWCxNQUFNLEdBQUdKLFNBQVMsQ0FBQ2MsYUFBVixDQUF3QixDQUF4QixFQUEyQlYsTUFBM0IsQ0FBVDtJQUNELENBdkVRLENBeUVUOzs7SUFDQUEsTUFBTSxHQUFHSixTQUFTLENBQUNjLGFBQVYsQ0FBd0JULFVBQXhCLEVBQW9DRCxNQUFwQyxDQUFULENBMUVTLENBNEVUOztJQUNBLElBQUksS0FBS2xCLFFBQVQsRUFBbUI7TUFDakIsTUFBTTZCLE1BQU0sR0FBR2QsTUFBTSxDQUFDZSxJQUFQLENBQVksS0FBSzlCLFFBQWpCLEVBQTJCLE1BQTNCLENBQWY7TUFFQWtCLE1BQU0sR0FBR0osU0FBUyxDQUFDYyxhQUFWLENBQXdCQyxNQUFNLENBQUNULE1BQVAsR0FBZ0IsQ0FBeEMsRUFBMkNGLE1BQTNDLENBQVQ7TUFDQUMsVUFBVSxJQUFJVSxNQUFNLENBQUNULE1BQXJCO01BRUFILE9BQU8sQ0FBQ2MsSUFBUixDQUFhLEtBQUtDLGdCQUFMLENBQXNCSCxNQUF0QixDQUFiO0lBQ0QsQ0FQRCxNQU9PO01BQ0xYLE1BQU0sR0FBR0osU0FBUyxDQUFDYyxhQUFWLENBQXdCLENBQXhCLEVBQTJCVixNQUEzQixDQUFUO0lBQ0QsQ0F0RlEsQ0F3RlQ7OztJQUNBQSxNQUFNLEdBQUdKLFNBQVMsQ0FBQ2MsYUFBVixDQUF3QlQsVUFBeEIsRUFBb0NELE1BQXBDLENBQVQsQ0F6RlMsQ0EyRlQ7O0lBQ0EsSUFBSSxLQUFLaEIsT0FBVCxFQUFrQjtNQUNoQixNQUFNMkIsTUFBTSxHQUFHZCxNQUFNLENBQUNlLElBQVAsQ0FBWSxLQUFLNUIsT0FBakIsRUFBMEIsTUFBMUIsQ0FBZjtNQUVBZ0IsTUFBTSxHQUFHSixTQUFTLENBQUNjLGFBQVYsQ0FBd0JDLE1BQU0sQ0FBQ1QsTUFBUCxHQUFnQixDQUF4QyxFQUEyQ0YsTUFBM0MsQ0FBVDtNQUNBQyxVQUFVLElBQUlVLE1BQU0sQ0FBQ1QsTUFBckI7TUFFQUgsT0FBTyxDQUFDYyxJQUFSLENBQWFGLE1BQWI7SUFDRCxDQVBELE1BT087TUFDTFgsTUFBTSxHQUFHSixTQUFTLENBQUNjLGFBQVYsQ0FBd0IsQ0FBeEIsRUFBMkJWLE1BQTNCLENBQVQ7SUFDRCxDQXJHUSxDQXVHVDs7O0lBQ0FBLE1BQU0sR0FBR0osU0FBUyxDQUFDYyxhQUFWLENBQXdCVCxVQUF4QixFQUFvQ0QsTUFBcEMsQ0FBVCxDQXhHUyxDQTBHVDs7SUFDQSxJQUFJLEtBQUtqQixVQUFULEVBQXFCO01BQ25CLE1BQU00QixNQUFNLEdBQUdkLE1BQU0sQ0FBQ2UsSUFBUCxDQUFZLEtBQUs3QixVQUFqQixFQUE2QixNQUE3QixDQUFmO01BRUFpQixNQUFNLEdBQUdKLFNBQVMsQ0FBQ2MsYUFBVixDQUF3QkMsTUFBTSxDQUFDVCxNQUFQLEdBQWdCLENBQXhDLEVBQTJDRixNQUEzQyxDQUFUO01BQ0FDLFVBQVUsSUFBSVUsTUFBTSxDQUFDVCxNQUFyQjtNQUVBSCxPQUFPLENBQUNjLElBQVIsQ0FBYUYsTUFBYjtJQUNELENBUEQsTUFPTztNQUNMWCxNQUFNLEdBQUdKLFNBQVMsQ0FBQ2MsYUFBVixDQUF3QixDQUF4QixFQUEyQlYsTUFBM0IsQ0FBVDtJQUNELENBcEhRLENBc0hUOzs7SUFDQUEsTUFBTSxHQUFHSixTQUFTLENBQUNjLGFBQVYsQ0FBd0JULFVBQXhCLEVBQW9DRCxNQUFwQyxDQUFULENBdkhTLENBeUhUOztJQUNBLE1BQU1lLFVBQVUsR0FBRyxLQUFLQyxlQUFMLEVBQW5CO0lBQ0FoQixNQUFNLEdBQUdKLFNBQVMsQ0FBQ2MsYUFBVixDQUF3QixDQUF4QixFQUEyQlYsTUFBM0IsQ0FBVDtJQUNBLE1BQU1pQixlQUFlLEdBQUdwQixNQUFNLENBQUNDLEtBQVAsQ0FBYSxDQUFiLENBQXhCO0lBQ0FtQixlQUFlLENBQUNkLGFBQWhCLENBQThCRixVQUFVLElBQUksQ0FBNUMsRUFBK0MsQ0FBL0M7SUFDQUEsVUFBVSxJQUFJYyxVQUFVLENBQUNiLE1BQXpCO0lBQ0FILE9BQU8sQ0FBQ2MsSUFBUixDQUFhSSxlQUFiLEVBQThCRixVQUE5QixFQS9IUyxDQWlJVDs7SUFDQWYsTUFBTSxHQUFHSixTQUFTLENBQUNjLGFBQVYsQ0FBd0JULFVBQXhCLEVBQW9DRCxNQUFwQyxDQUFULENBbElTLENBb0lUOztJQUNBLElBQUksS0FBS2QsV0FBVCxFQUFzQjtNQUNwQixNQUFNeUIsTUFBTSxHQUFHZCxNQUFNLENBQUNlLElBQVAsQ0FBWSxLQUFLMUIsV0FBakIsRUFBOEIsTUFBOUIsQ0FBZjtNQUVBYyxNQUFNLEdBQUdKLFNBQVMsQ0FBQ2MsYUFBVixDQUF3QkMsTUFBTSxDQUFDVCxNQUFQLEdBQWdCLENBQXhDLEVBQTJDRixNQUEzQyxDQUFUO01BQ0FDLFVBQVUsSUFBSVUsTUFBTSxDQUFDVCxNQUFyQjtNQUVBSCxPQUFPLENBQUNjLElBQVIsQ0FBYUYsTUFBYjtJQUNELENBUEQsTUFPTztNQUNMWCxNQUFNLEdBQUdKLFNBQVMsQ0FBQ2MsYUFBVixDQUF3QixDQUF4QixFQUEyQlYsTUFBM0IsQ0FBVDtJQUNELENBOUlRLENBZ0pUOzs7SUFDQUEsTUFBTSxHQUFHSixTQUFTLENBQUNjLGFBQVYsQ0FBd0JULFVBQXhCLEVBQW9DRCxNQUFwQyxDQUFULENBakpTLENBbUpUOztJQUNBLElBQUksS0FBS2IsUUFBVCxFQUFtQjtNQUNqQixNQUFNd0IsTUFBTSxHQUFHZCxNQUFNLENBQUNlLElBQVAsQ0FBWSxLQUFLekIsUUFBakIsRUFBMkIsTUFBM0IsQ0FBZjtNQUVBYSxNQUFNLEdBQUdKLFNBQVMsQ0FBQ2MsYUFBVixDQUF3QkMsTUFBTSxDQUFDVCxNQUFQLEdBQWdCLENBQXhDLEVBQTJDRixNQUEzQyxDQUFUO01BQ0FDLFVBQVUsSUFBSVUsTUFBTSxDQUFDVCxNQUFyQjtNQUVBSCxPQUFPLENBQUNjLElBQVIsQ0FBYUYsTUFBYjtJQUNELENBUEQsTUFPTztNQUNMWCxNQUFNLEdBQUdKLFNBQVMsQ0FBQ2MsYUFBVixDQUF3QixDQUF4QixFQUEyQlYsTUFBM0IsQ0FBVDtJQUNELENBN0pRLENBK0pUOzs7SUFDQUEsTUFBTSxHQUFHSixTQUFTLENBQUNjLGFBQVYsQ0FBd0JULFVBQXhCLEVBQW9DRCxNQUFwQyxDQUFULENBaEtTLENBa0tUOztJQUNBLElBQUksS0FBS1osUUFBVCxFQUFtQjtNQUNqQixNQUFNdUIsTUFBTSxHQUFHZCxNQUFNLENBQUNlLElBQVAsQ0FBWSxLQUFLeEIsUUFBakIsRUFBMkIsTUFBM0IsQ0FBZjtNQUVBWSxNQUFNLEdBQUdKLFNBQVMsQ0FBQ2MsYUFBVixDQUF3QkMsTUFBTSxDQUFDVCxNQUFQLEdBQWdCLENBQXhDLEVBQTJDRixNQUEzQyxDQUFUO01BQ0FDLFVBQVUsSUFBSVUsTUFBTSxDQUFDVCxNQUFyQjtNQUVBSCxPQUFPLENBQUNjLElBQVIsQ0FBYUYsTUFBYjtJQUNELENBUEQsTUFPTztNQUNMWCxNQUFNLEdBQUdKLFNBQVMsQ0FBQ2MsYUFBVixDQUF3QixDQUF4QixFQUEyQlYsTUFBM0IsQ0FBVDtJQUNELENBNUtRLENBOEtUOzs7SUFDQSxJQUFJLEtBQUtYLFFBQVQsRUFBbUI7TUFDakIsS0FBS0EsUUFBTCxDQUFjNkIsSUFBZCxDQUFtQnRCLFNBQW5CLEVBQThCSSxNQUE5QixFQUFzQyxDQUF0QyxFQUF5QyxDQUF6QztJQUNEOztJQUNEQSxNQUFNLElBQUksQ0FBVixDQWxMUyxDQW9MVDs7SUFDQUEsTUFBTSxHQUFHSixTQUFTLENBQUNjLGFBQVYsQ0FBd0JULFVBQXhCLEVBQW9DRCxNQUFwQyxDQUFULENBckxTLENBdUxUOztJQUNBLElBQUksS0FBS1YsSUFBVCxFQUFlO01BQ2IsSUFBSSxLQUFLQSxJQUFMLENBQVVZLE1BQVYsR0FBbUIsS0FBdkIsRUFBOEI7UUFDNUJGLE1BQU0sR0FBR0osU0FBUyxDQUFDYyxhQUFWLENBQXdCLEtBQXhCLEVBQStCVixNQUEvQixDQUFUO01BQ0QsQ0FGRCxNQUVPO1FBQ0xBLE1BQU0sR0FBR0osU0FBUyxDQUFDYyxhQUFWLENBQXdCLEtBQUtwQixJQUFMLENBQVVZLE1BQWxDLEVBQTBDRixNQUExQyxDQUFUO01BQ0Q7O01BRURELE9BQU8sQ0FBQ2MsSUFBUixDQUFhLEtBQUt2QixJQUFsQjtJQUNELENBUkQsTUFRTztNQUNMVSxNQUFNLEdBQUdKLFNBQVMsQ0FBQ2MsYUFBVixDQUF3QixDQUF4QixFQUEyQlYsTUFBM0IsQ0FBVDtJQUNELENBbE1RLENBb01UOzs7SUFDQUEsTUFBTSxHQUFHSixTQUFTLENBQUNjLGFBQVYsQ0FBd0JULFVBQXhCLEVBQW9DRCxNQUFwQyxDQUFULENBck1TLENBdU1UOztJQUNBLElBQUksS0FBS1QsWUFBVCxFQUF1QjtNQUNyQixNQUFNb0IsTUFBTSxHQUFHZCxNQUFNLENBQUNlLElBQVAsQ0FBWSxLQUFLckIsWUFBakIsRUFBK0IsTUFBL0IsQ0FBZjtNQUVBUyxNQUFNLEdBQUdKLFNBQVMsQ0FBQ2MsYUFBVixDQUF3QkMsTUFBTSxDQUFDVCxNQUFQLEdBQWdCLENBQXhDLEVBQTJDRixNQUEzQyxDQUFUO01BQ0FDLFVBQVUsSUFBSVUsTUFBTSxDQUFDVCxNQUFyQjtNQUVBSCxPQUFPLENBQUNjLElBQVIsQ0FBYUYsTUFBYjtJQUNELENBUEQsTUFPTztNQUNMWCxNQUFNLEdBQUdKLFNBQVMsQ0FBQ2MsYUFBVixDQUF3QixDQUF4QixFQUEyQlYsTUFBM0IsQ0FBVDtJQUNELENBak5RLENBbU5UOzs7SUFDQUEsTUFBTSxHQUFHSixTQUFTLENBQUNjLGFBQVYsQ0FBd0JULFVBQXhCLEVBQW9DRCxNQUFwQyxDQUFULENBcE5TLENBc05UOztJQUNBLElBQUksS0FBS1IsY0FBVCxFQUF5QjtNQUN2QixNQUFNbUIsTUFBTSxHQUFHZCxNQUFNLENBQUNlLElBQVAsQ0FBWSxLQUFLcEIsY0FBakIsRUFBaUMsTUFBakMsQ0FBZjtNQUVBUSxNQUFNLEdBQUdKLFNBQVMsQ0FBQ2MsYUFBVixDQUF3QkMsTUFBTSxDQUFDVCxNQUFQLEdBQWdCLENBQXhDLEVBQTJDRixNQUEzQyxDQUFUO01BQ0FDLFVBQVUsSUFBSVUsTUFBTSxDQUFDVCxNQUFyQjtNQUVBSCxPQUFPLENBQUNjLElBQVIsQ0FBYUYsTUFBYjtJQUNELENBUEQsTUFPTztNQUNMWCxNQUFNLEdBQUdKLFNBQVMsQ0FBQ2MsYUFBVixDQUF3QixDQUF4QixFQUEyQlYsTUFBM0IsQ0FBVDtJQUNELENBaE9RLENBa09UOzs7SUFDQSxJQUFJLEtBQUtWLElBQUwsSUFBYSxLQUFLQSxJQUFMLENBQVVZLE1BQVYsR0FBbUIsS0FBcEMsRUFBMkM7TUFDekNOLFNBQVMsQ0FBQ08sYUFBVixDQUF3QixLQUFLYixJQUFMLENBQVVZLE1BQWxDLEVBQTBDRixNQUExQztJQUNELENBRkQsTUFFTztNQUNMSixTQUFTLENBQUNPLGFBQVYsQ0FBd0IsQ0FBeEIsRUFBMkJILE1BQTNCO0lBQ0Q7O0lBRUQsTUFBTW1CLElBQUksR0FBR3RCLE1BQU0sQ0FBQ3VCLE1BQVAsQ0FBY3JCLE9BQWQsQ0FBYjtJQUNBb0IsSUFBSSxDQUFDaEIsYUFBTCxDQUFtQmdCLElBQUksQ0FBQ2pCLE1BQXhCLEVBQWdDLENBQWhDO0lBQ0EsT0FBT2lCLElBQVA7RUFDRDs7RUFFRGQsaUJBQWlCLEdBQUc7SUFDbEIsSUFBSWdCLE1BQU0sR0FBR3ZHLE9BQU8sQ0FBQ0MsYUFBUixHQUF3QkQsT0FBTyxDQUFDRyxhQUFoQyxHQUFnREgsT0FBTyxDQUFDSyxjQUF4RCxHQUF5RUwsT0FBTyxDQUFDUyxnQkFBakYsR0FBb0dULE9BQU8sQ0FBQ1csVUFBNUcsR0FBeUhYLE9BQU8sQ0FBQ2UsZ0JBQTlJOztJQUNBLElBQUksS0FBSytDLFdBQVQsRUFBc0I7TUFDcEJ5QyxNQUFNLElBQUl2RyxPQUFPLENBQUNhLGFBQWxCO0lBQ0QsQ0FGRCxNQUVPO01BQ0wwRixNQUFNLElBQUl2RyxPQUFPLENBQUNZLFlBQWxCO0lBQ0Q7O0lBQ0QsT0FBTzJGLE1BQVA7RUFDRDs7RUFFREwsZUFBZSxHQUFHO0lBQ2hCLE1BQU1qQixPQUFPLEdBQUcsRUFBaEI7SUFFQSxNQUFNTixPQUFPLEdBQUcsS0FBS0EsT0FBckI7O0lBQ0EsSUFBSUEsT0FBSixFQUFhO01BQ1gsUUFBUUEsT0FBTyxDQUFDNkIsSUFBaEI7UUFDRSxLQUFLLE1BQUw7VUFDRSxNQUFNWCxNQUFNLEdBQUdkLE1BQU0sQ0FBQ0MsS0FBUCxDQUFhLENBQWIsQ0FBZjtVQUNBYSxNQUFNLENBQUNQLFVBQVAsQ0FBa0IzQyxlQUFlLENBQUNDLFVBQWxDLEVBQThDLENBQTlDO1VBQ0FpRCxNQUFNLENBQUNSLGFBQVAsQ0FBcUIsQ0FBckIsRUFBd0IsQ0FBeEI7VUFDQVEsTUFBTSxDQUFDUCxVQUFQLENBQW1CM0MsZUFBZSxDQUFDRyxZQUFoQixJQUFnQyxDQUFqQyxJQUF1QzZCLE9BQU8sQ0FBQzhCLElBQVIsR0FBZTlELGVBQWUsQ0FBQ0ksZ0JBQS9CLEdBQWtESixlQUFlLENBQUNLLGVBQXpHLENBQWxCLEVBQTZJLENBQTdJO1VBQ0E2QyxNQUFNLENBQUNQLFVBQVAsQ0FBa0JYLE9BQU8sQ0FBQytCLFFBQVIsS0FBcUIsWUFBckIsR0FBb0MsSUFBcEMsR0FBMkMvRCxlQUFlLENBQUNNLHVCQUE3RSxFQUFzRyxDQUF0RztVQUNBZ0MsT0FBTyxDQUFDYyxJQUFSLENBQWFGLE1BQWI7VUFDQTs7UUFFRixLQUFLLGVBQUw7VUFDRSxNQUFNYyxLQUFLLEdBQUc1QixNQUFNLENBQUNlLElBQVAsQ0FBWW5CLE9BQU8sQ0FBQ2lDLFlBQXBCLEVBQWtDLE1BQWxDLENBQWQ7VUFDQSxNQUFNQyxHQUFHLEdBQUc5QixNQUFNLENBQUNDLEtBQVAsQ0FBYSxFQUFiLENBQVo7VUFFQSxJQUFJRSxNQUFNLEdBQUcsQ0FBYjtVQUNBQSxNQUFNLEdBQUcyQixHQUFHLENBQUN2QixVQUFKLENBQWUzQyxlQUFlLENBQUNDLFVBQS9CLEVBQTJDc0MsTUFBM0MsQ0FBVDtVQUNBQSxNQUFNLEdBQUcyQixHQUFHLENBQUN4QixhQUFKLENBQWtCc0IsS0FBSyxDQUFDdkIsTUFBTixHQUFlLENBQWYsR0FBbUIsQ0FBckMsRUFBd0NGLE1BQXhDLENBQVQ7VUFDQUEsTUFBTSxHQUFHMkIsR0FBRyxDQUFDdkIsVUFBSixDQUFnQjNDLGVBQWUsQ0FBQ0UscUJBQWhCLElBQXlDLENBQTFDLElBQWdEOEIsT0FBTyxDQUFDOEIsSUFBUixHQUFlOUQsZUFBZSxDQUFDSSxnQkFBL0IsR0FBa0RKLGVBQWUsQ0FBQ0ssZUFBbEgsQ0FBZixFQUFtSmtDLE1BQW5KLENBQVQ7VUFDQTJCLEdBQUcsQ0FBQ2xCLFlBQUosQ0FBaUJnQixLQUFLLENBQUN2QixNQUF2QixFQUErQkYsTUFBL0I7VUFFQUQsT0FBTyxDQUFDYyxJQUFSLENBQWFjLEdBQWI7VUFDQTVCLE9BQU8sQ0FBQ2MsSUFBUixDQUFhWSxLQUFiO1VBRUE7TUF2Qko7SUF5QkQ7O0lBRUQsSUFBSSxLQUFLckQsVUFBTCxJQUFtQndELHNCQUFTLEtBQVQsQ0FBdkIsRUFBd0M7TUFDdEM7TUFDQSxNQUFNQyx1QkFBdUIsR0FBRyxJQUFoQztNQUNBLE1BQU1DLGlDQUFpQyxHQUFHLElBQTFDO01BQ0EsTUFBTUgsR0FBRyxHQUFHOUIsTUFBTSxDQUFDQyxLQUFQLENBQWEsQ0FBYixDQUFaO01BQ0E2QixHQUFHLENBQUN2QixVQUFKLENBQWV5Qix1QkFBZixFQUF3QyxDQUF4QztNQUNBRixHQUFHLENBQUN4QixhQUFKLENBQWtCLENBQWxCLEVBQXFCLENBQXJCO01BQ0F3QixHQUFHLENBQUN2QixVQUFKLENBQWUwQixpQ0FBZixFQUFrRCxDQUFsRDtNQUNBL0IsT0FBTyxDQUFDYyxJQUFSLENBQWFjLEdBQWI7SUFDRDs7SUFFRDVCLE9BQU8sQ0FBQ2MsSUFBUixDQUFhaEIsTUFBTSxDQUFDZSxJQUFQLENBQVksQ0FBQzNDLHNCQUFELENBQVosQ0FBYjtJQUVBLE9BQU80QixNQUFNLENBQUN1QixNQUFQLENBQWNyQixPQUFkLENBQVA7RUFDRDs7RUFFRE8saUJBQWlCLEdBQUc7SUFDbEIsSUFBSXlCLE1BQU0sR0FBR2pHLE9BQU8sQ0FBQ0MsY0FBUixHQUF5QkQsT0FBTyxDQUFDRyxRQUFqQyxHQUE0Q0gsT0FBTyxDQUFDTyxXQUFqRTs7SUFDQSxJQUFJLEtBQUtpRCxJQUFULEVBQWU7TUFDYnlDLE1BQU0sSUFBSWpHLE9BQU8sQ0FBQ1ksc0JBQWxCO0lBQ0QsQ0FGRCxNQUVPO01BQ0xxRixNQUFNLElBQUlqRyxPQUFPLENBQUNXLHVCQUFsQjtJQUNEOztJQUNELE9BQU9zRixNQUFQO0VBQ0Q7O0VBRUR4QixjQUFjLEdBQUc7SUFDZixJQUFJeUIsU0FBUyxHQUFHckYsVUFBVSxDQUFDQyxRQUFYLEdBQXNCRCxVQUFVLENBQUNHLFNBQWpEOztJQUNBLElBQUksS0FBSzZCLGNBQVQsRUFBeUI7TUFDdkJxRCxTQUFTLElBQUlyRixVQUFVLENBQUNNLGdCQUF4QjtJQUNELENBRkQsTUFFTztNQUNMK0UsU0FBUyxJQUFJckYsVUFBVSxDQUFDSyxpQkFBeEI7SUFDRDs7SUFDRCxPQUFPZ0YsU0FBUDtFQUNEOztFQUVEeEIsaUJBQWlCLEdBQUc7SUFDbEIsT0FBT3RELE9BQU8sQ0FBQ0Msa0JBQVIsR0FBNkJELE9BQU8sQ0FBQ0ssMEJBQXJDLEdBQWtFTCxPQUFPLENBQUNNLGNBQWpGO0VBQ0Q7O0VBRURzRCxnQkFBZ0IsQ0FBQ2hDLFFBQUQsRUFBbUI7SUFDakMsS0FBSyxJQUFJbUQsQ0FBQyxHQUFHLENBQVIsRUFBV0MsR0FBRyxHQUFHcEQsUUFBUSxDQUFDb0IsTUFBL0IsRUFBdUMrQixDQUFDLEdBQUdDLEdBQTNDLEVBQWdERCxDQUFDLEVBQWpELEVBQXFEO01BQ25ELElBQUlFLElBQUksR0FBR3JELFFBQVEsQ0FBQ21ELENBQUQsQ0FBbkI7TUFDQSxNQUFNRyxTQUFTLEdBQUdELElBQUksR0FBRyxJQUF6QjtNQUNBLE1BQU1FLFVBQVUsR0FBR0YsSUFBSSxJQUFJLENBQTNCO01BQ0FBLElBQUksR0FBSUMsU0FBUyxJQUFJLENBQWQsR0FBbUJDLFVBQTFCO01BQ0FGLElBQUksR0FBR0EsSUFBSSxHQUFHLElBQWQ7TUFDQXJELFFBQVEsQ0FBQ21ELENBQUQsQ0FBUixHQUFjRSxJQUFkO0lBQ0Q7O0lBQ0QsT0FBT3JELFFBQVA7RUFDRDs7RUFFRHdELFFBQVEsQ0FBQ0MsTUFBTSxHQUFHLEVBQVYsRUFBYztJQUNwQixPQUFPQSxNQUFNLEdBQUcsV0FBVCxHQUNMLHdCQUFRLDRGQUFSLEVBQ1EsS0FBS25FLFVBRGIsRUFDeUIsS0FBS0MsVUFEOUIsRUFDMEMsS0FBS0MsYUFEL0MsRUFDOEQsS0FBS0MsU0FEbkUsRUFDOEUsS0FBS0MsWUFEbkYsQ0FESyxHQUdELElBSEMsR0FHTStELE1BSE4sR0FHZSxXQUhmLEdBSUwsd0JBQVEscUdBQVIsRUFDUSxLQUFLbEMsaUJBQUwsRUFEUixFQUNrQyxLQUFLQyxpQkFBTCxFQURsQyxFQUM0RCxLQUFLQyxjQUFMLEVBRDVELEVBQ21GLEtBQUtDLGlCQUFMLEVBRG5GLEVBQzZHLEtBQUsvQixjQURsSCxFQUNrSSxLQUFLQyxVQUR2SSxDQUpLLEdBTUQsSUFOQyxHQU1NNkQsTUFOTixHQU1lLFdBTmYsR0FPTCx3QkFBUSw4RkFBUixFQUNRLEtBQUt0RCxRQURiLEVBQ3VCLEtBQUtKLFFBRDVCLEVBQ3NDLEtBQUtDLFFBRDNDLEVBQ3FELEtBQUtFLE9BRDFELEVBQ21FLEtBQUtELFVBRHhFLEVBQ29GLEtBQUtHLFdBRHpGLENBUEssR0FTRCxJQVRDLEdBU01xRCxNQVROLEdBU2UsV0FUZixHQVVMLHdCQUFRLGlGQUFSLEVBQ1EsS0FBS3BELFFBRGIsRUFDdUIsS0FBS0MsUUFENUIsRUFDc0MsS0FBS0UsSUFEM0MsRUFDaUQsS0FBS0MsWUFEdEQsRUFDb0UsS0FBS0MsY0FEekUsQ0FWRjtFQWFEOztBQWpaaUI7O2VBb1pMdEIsYTs7QUFDZnNFLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQnZFLGFBQWpCIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _nativeDuplexpair = _interopRequireDefault(require("native-duplexpair"));

var tls = _interopRequireWildcard(require("tls"));

var _events = require("events");

var _message = _interopRequireDefault(require("./message"));

var _packet = require("./packet");

var _incomingMessageStream = _interopRequireDefault(require("./incoming-message-stream"));

var _outgoingMessageStream = _interopRequireDefault(require("./outgoing-message-stream"));

function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }

function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

class MessageIO extends _events.EventEmitter {
  constructor(socket, packetSize, debug) {
    super();
    this.socket = void 0;
    this.debug = void 0;
    this.tlsNegotiationComplete = void 0;
    this.incomingMessageStream = void 0;
    this.outgoingMessageStream = void 0;
    this.securePair = void 0;
    this.incomingMessageIterator = void 0;
    this.socket = socket;
    this.debug = debug;
    this.tlsNegotiationComplete = false;
    this.incomingMessageStream = new _incomingMessageStream.default(this.debug);
    this.incomingMessageIterator = this.incomingMessageStream[Symbol.asyncIterator]();
    this.outgoingMessageStream = new _outgoingMessageStream.default(this.debug, {
      packetSize: packetSize
    });
    this.socket.pipe(this.incomingMessageStream);
    this.outgoingMessageStream.pipe(this.socket);
  }

  packetSize(...args) {
    if (args.length > 0) {
      const packetSize = args[0];
      this.debug.log('Packet size changed from ' + this.outgoingMessageStream.packetSize + ' to ' + packetSize);
      this.outgoingMessageStream.packetSize = packetSize;
    }

    if (this.securePair) {
      this.securePair.cleartext.setMaxSendFragment(this.outgoingMessageStream.packetSize);
    }

    return this.outgoingMessageStream.packetSize;
  } // Negotiate TLS encryption.


  startTls(credentialsDetails, hostname, trustServerCertificate) {
    if (!credentialsDetails.maxVersion || !['TLSv1.2', 'TLSv1.1', 'TLSv1'].includes(credentialsDetails.maxVersion)) {
      credentialsDetails.maxVersion = 'TLSv1.2';
    }

    const secureContext = tls.createSecureContext(credentialsDetails);
    return new Promise((resolve, reject) => {
      const duplexpair = new _nativeDuplexpair.default();
      const securePair = this.securePair = {
        cleartext: tls.connect({
          socket: duplexpair.socket1,
          servername: hostname,
          secureContext: secureContext,
          rejectUnauthorized: !trustServerCertificate
        }),
        encrypted: duplexpair.socket2
      };

      const onSecureConnect = () => {
        securePair.encrypted.removeListener('readable', onReadable);
        securePair.cleartext.removeListener('error', onError);
        securePair.cleartext.removeListener('secureConnect', onSecureConnect); // If we encounter any errors from this point on,
        // we just forward them to the actual network socket.

        securePair.cleartext.once('error', err => {
          this.socket.destroy(err);
        });
        const cipher = securePair.cleartext.getCipher();

        if (cipher) {
          this.debug.log('TLS negotiated (' + cipher.name + ', ' + cipher.version + ')');
        }

        this.emit('secure', securePair.cleartext);
        securePair.cleartext.setMaxSendFragment(this.outgoingMessageStream.packetSize);
        this.outgoingMessageStream.unpipe(this.socket);
        this.socket.unpipe(this.incomingMessageStream);
        this.socket.pipe(securePair.encrypted);
        securePair.encrypted.pipe(this.socket);
        securePair.cleartext.pipe(this.incomingMessageStream);
        this.outgoingMessageStream.pipe(securePair.cleartext);
        this.tlsNegotiationComplete = true;
        resolve();
      };

      const onError = err => {
        securePair.encrypted.removeListener('readable', onReadable);
        securePair.cleartext.removeListener('error', onError);
        securePair.cleartext.removeListener('secureConnect', onSecureConnect);
        securePair.cleartext.destroy();
        securePair.encrypted.destroy();
        reject(err);
      };

      const onReadable = () => {
        // When there is handshake data on the encryped stream of the secure pair,
        // we wrap it into a `PRELOGIN` message and send it to the server.
        //
        // For each `PRELOGIN` message we sent we get back exactly one response message
        // that contains the server's handshake response data.
        const message = new _message.default({
          type: _packet.TYPE.PRELOGIN,
          resetConnection: false
        });
        let chunk;

        while (chunk = securePair.encrypted.read()) {
          message.write(chunk);
        }

        this.outgoingMessageStream.write(message);
        message.end();
        this.readMessage().then(async response => {
          // Setup readable handler for the next round of handshaking.
          // If we encounter a `secureConnect` on the cleartext side
          // of the secure pair, the `readable` handler is cleared
          // and no further handshake handling will happen.
          securePair.encrypted.once('readable', onReadable);

          for await (const data of response) {
            // We feed the server's handshake response back into the
            // encrypted end of the secure pair.
            securePair.encrypted.write(data);
          }
        }).catch(onError);
      };

      securePair.cleartext.once('error', onError);
      securePair.cleartext.once('secureConnect', onSecureConnect);
      securePair.encrypted.once('readable', onReadable);
    });
  } // TODO listen for 'drain' event when socket.write returns false.
  // TODO implement incomplete request cancelation (2.2.1.6)


  sendMessage(packetType, data, resetConnection) {
    const message = new _message.default({
      type: packetType,
      resetConnection: resetConnection
    });
    message.end(data);
    this.outgoingMessageStream.write(message);
    return message;
  }
  /**
   * Read the next incoming message from the socket.
   */


  async readMessage() {
    const result = await this.incomingMessageIterator.next();

    if (result.done) {
      throw new Error('unexpected end of message stream');
    }

    return result.value;
  }

}

var _default = MessageIO;
exports.default = _default;
module.exports = MessageIO;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNZXNzYWdlSU8iLCJFdmVudEVtaXR0ZXIiLCJjb25zdHJ1Y3RvciIsInNvY2tldCIsInBhY2tldFNpemUiLCJkZWJ1ZyIsInRsc05lZ290aWF0aW9uQ29tcGxldGUiLCJpbmNvbWluZ01lc3NhZ2VTdHJlYW0iLCJvdXRnb2luZ01lc3NhZ2VTdHJlYW0iLCJzZWN1cmVQYWlyIiwiaW5jb21pbmdNZXNzYWdlSXRlcmF0b3IiLCJJbmNvbWluZ01lc3NhZ2VTdHJlYW0iLCJTeW1ib2wiLCJhc3luY0l0ZXJhdG9yIiwiT3V0Z29pbmdNZXNzYWdlU3RyZWFtIiwicGlwZSIsImFyZ3MiLCJsZW5ndGgiLCJsb2ciLCJjbGVhcnRleHQiLCJzZXRNYXhTZW5kRnJhZ21lbnQiLCJzdGFydFRscyIsImNyZWRlbnRpYWxzRGV0YWlscyIsImhvc3RuYW1lIiwidHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZSIsIm1heFZlcnNpb24iLCJpbmNsdWRlcyIsInNlY3VyZUNvbnRleHQiLCJ0bHMiLCJjcmVhdGVTZWN1cmVDb250ZXh0IiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJkdXBsZXhwYWlyIiwiRHVwbGV4UGFpciIsImNvbm5lY3QiLCJzb2NrZXQxIiwic2VydmVybmFtZSIsInJlamVjdFVuYXV0aG9yaXplZCIsImVuY3J5cHRlZCIsInNvY2tldDIiLCJvblNlY3VyZUNvbm5lY3QiLCJyZW1vdmVMaXN0ZW5lciIsIm9uUmVhZGFibGUiLCJvbkVycm9yIiwib25jZSIsImVyciIsImRlc3Ryb3kiLCJjaXBoZXIiLCJnZXRDaXBoZXIiLCJuYW1lIiwidmVyc2lvbiIsImVtaXQiLCJ1bnBpcGUiLCJtZXNzYWdlIiwiTWVzc2FnZSIsInR5cGUiLCJUWVBFIiwiUFJFTE9HSU4iLCJyZXNldENvbm5lY3Rpb24iLCJjaHVuayIsInJlYWQiLCJ3cml0ZSIsImVuZCIsInJlYWRNZXNzYWdlIiwidGhlbiIsInJlc3BvbnNlIiwiZGF0YSIsImNhdGNoIiwic2VuZE1lc3NhZ2UiLCJwYWNrZXRUeXBlIiwicmVzdWx0IiwibmV4dCIsImRvbmUiLCJFcnJvciIsInZhbHVlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9tZXNzYWdlLWlvLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEdXBsZXhQYWlyIGZyb20gJ25hdGl2ZS1kdXBsZXhwYWlyJztcblxuaW1wb3J0IHsgRHVwbGV4IH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCAqIGFzIHRscyBmcm9tICd0bHMnO1xuaW1wb3J0IHsgU29ja2V0IH0gZnJvbSAnbmV0JztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XG5cbmltcG9ydCBEZWJ1ZyBmcm9tICcuL2RlYnVnJztcblxuaW1wb3J0IE1lc3NhZ2UgZnJvbSAnLi9tZXNzYWdlJztcbmltcG9ydCB7IFRZUEUgfSBmcm9tICcuL3BhY2tldCc7XG5cbmltcG9ydCBJbmNvbWluZ01lc3NhZ2VTdHJlYW0gZnJvbSAnLi9pbmNvbWluZy1tZXNzYWdlLXN0cmVhbSc7XG5pbXBvcnQgT3V0Z29pbmdNZXNzYWdlU3RyZWFtIGZyb20gJy4vb3V0Z29pbmctbWVzc2FnZS1zdHJlYW0nO1xuXG5jbGFzcyBNZXNzYWdlSU8gZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBzb2NrZXQ6IFNvY2tldDtcbiAgZGVidWc6IERlYnVnO1xuXG4gIHRsc05lZ290aWF0aW9uQ29tcGxldGU6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBpbmNvbWluZ01lc3NhZ2VTdHJlYW06IEluY29taW5nTWVzc2FnZVN0cmVhbTtcbiAgb3V0Z29pbmdNZXNzYWdlU3RyZWFtOiBPdXRnb2luZ01lc3NhZ2VTdHJlYW07XG5cbiAgc2VjdXJlUGFpcj86IHtcbiAgICBjbGVhcnRleHQ6IHRscy5UTFNTb2NrZXQ7XG4gICAgZW5jcnlwdGVkOiBEdXBsZXg7XG4gIH1cblxuICBpbmNvbWluZ01lc3NhZ2VJdGVyYXRvcjogQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPE1lc3NhZ2U+O1xuXG4gIGNvbnN0cnVjdG9yKHNvY2tldDogU29ja2V0LCBwYWNrZXRTaXplOiBudW1iZXIsIGRlYnVnOiBEZWJ1Zykge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICB0aGlzLmRlYnVnID0gZGVidWc7XG5cbiAgICB0aGlzLnRsc05lZ290aWF0aW9uQ29tcGxldGUgPSBmYWxzZTtcblxuICAgIHRoaXMuaW5jb21pbmdNZXNzYWdlU3RyZWFtID0gbmV3IEluY29taW5nTWVzc2FnZVN0cmVhbSh0aGlzLmRlYnVnKTtcbiAgICB0aGlzLmluY29taW5nTWVzc2FnZUl0ZXJhdG9yID0gdGhpcy5pbmNvbWluZ01lc3NhZ2VTdHJlYW1bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5cbiAgICB0aGlzLm91dGdvaW5nTWVzc2FnZVN0cmVhbSA9IG5ldyBPdXRnb2luZ01lc3NhZ2VTdHJlYW0odGhpcy5kZWJ1ZywgeyBwYWNrZXRTaXplOiBwYWNrZXRTaXplIH0pO1xuXG4gICAgdGhpcy5zb2NrZXQucGlwZSh0aGlzLmluY29taW5nTWVzc2FnZVN0cmVhbSk7XG4gICAgdGhpcy5vdXRnb2luZ01lc3NhZ2VTdHJlYW0ucGlwZSh0aGlzLnNvY2tldCk7XG4gIH1cblxuICBwYWNrZXRTaXplKC4uLmFyZ3M6IFtudW1iZXJdKSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcGFja2V0U2l6ZSA9IGFyZ3NbMF07XG4gICAgICB0aGlzLmRlYnVnLmxvZygnUGFja2V0IHNpemUgY2hhbmdlZCBmcm9tICcgKyB0aGlzLm91dGdvaW5nTWVzc2FnZVN0cmVhbS5wYWNrZXRTaXplICsgJyB0byAnICsgcGFja2V0U2l6ZSk7XG4gICAgICB0aGlzLm91dGdvaW5nTWVzc2FnZVN0cmVhbS5wYWNrZXRTaXplID0gcGFja2V0U2l6ZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZWN1cmVQYWlyKSB7XG4gICAgICB0aGlzLnNlY3VyZVBhaXIuY2xlYXJ0ZXh0LnNldE1heFNlbmRGcmFnbWVudCh0aGlzLm91dGdvaW5nTWVzc2FnZVN0cmVhbS5wYWNrZXRTaXplKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5vdXRnb2luZ01lc3NhZ2VTdHJlYW0ucGFja2V0U2l6ZTtcbiAgfVxuXG4gIC8vIE5lZ290aWF0ZSBUTFMgZW5jcnlwdGlvbi5cbiAgc3RhcnRUbHMoY3JlZGVudGlhbHNEZXRhaWxzOiB0bHMuU2VjdXJlQ29udGV4dE9wdGlvbnMsIGhvc3RuYW1lOiBzdHJpbmcsIHRydXN0U2VydmVyQ2VydGlmaWNhdGU6IGJvb2xlYW4pIHtcbiAgICBpZiAoIWNyZWRlbnRpYWxzRGV0YWlscy5tYXhWZXJzaW9uIHx8ICFbJ1RMU3YxLjInLCAnVExTdjEuMScsICdUTFN2MSddLmluY2x1ZGVzKGNyZWRlbnRpYWxzRGV0YWlscy5tYXhWZXJzaW9uKSkge1xuICAgICAgY3JlZGVudGlhbHNEZXRhaWxzLm1heFZlcnNpb24gPSAnVExTdjEuMic7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VjdXJlQ29udGV4dCA9IHRscy5jcmVhdGVTZWN1cmVDb250ZXh0KGNyZWRlbnRpYWxzRGV0YWlscyk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgZHVwbGV4cGFpciA9IG5ldyBEdXBsZXhQYWlyKCk7XG4gICAgICBjb25zdCBzZWN1cmVQYWlyID0gdGhpcy5zZWN1cmVQYWlyID0ge1xuICAgICAgICBjbGVhcnRleHQ6IHRscy5jb25uZWN0KHtcbiAgICAgICAgICBzb2NrZXQ6IGR1cGxleHBhaXIuc29ja2V0MSBhcyBTb2NrZXQsXG4gICAgICAgICAgc2VydmVybmFtZTogaG9zdG5hbWUsXG4gICAgICAgICAgc2VjdXJlQ29udGV4dDogc2VjdXJlQ29udGV4dCxcbiAgICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6ICF0cnVzdFNlcnZlckNlcnRpZmljYXRlXG4gICAgICAgIH0pLFxuICAgICAgICBlbmNyeXB0ZWQ6IGR1cGxleHBhaXIuc29ja2V0MlxuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25TZWN1cmVDb25uZWN0ID0gKCkgPT4ge1xuICAgICAgICBzZWN1cmVQYWlyLmVuY3J5cHRlZC5yZW1vdmVMaXN0ZW5lcigncmVhZGFibGUnLCBvblJlYWRhYmxlKTtcbiAgICAgICAgc2VjdXJlUGFpci5jbGVhcnRleHQucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgIHNlY3VyZVBhaXIuY2xlYXJ0ZXh0LnJlbW92ZUxpc3RlbmVyKCdzZWN1cmVDb25uZWN0Jywgb25TZWN1cmVDb25uZWN0KTtcblxuICAgICAgICAvLyBJZiB3ZSBlbmNvdW50ZXIgYW55IGVycm9ycyBmcm9tIHRoaXMgcG9pbnQgb24sXG4gICAgICAgIC8vIHdlIGp1c3QgZm9yd2FyZCB0aGVtIHRvIHRoZSBhY3R1YWwgbmV0d29yayBzb2NrZXQuXG4gICAgICAgIHNlY3VyZVBhaXIuY2xlYXJ0ZXh0Lm9uY2UoJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICAgIHRoaXMuc29ja2V0LmRlc3Ryb3koZXJyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY2lwaGVyID0gc2VjdXJlUGFpci5jbGVhcnRleHQuZ2V0Q2lwaGVyKCk7XG4gICAgICAgIGlmIChjaXBoZXIpIHtcbiAgICAgICAgICB0aGlzLmRlYnVnLmxvZygnVExTIG5lZ290aWF0ZWQgKCcgKyBjaXBoZXIubmFtZSArICcsICcgKyBjaXBoZXIudmVyc2lvbiArICcpJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVtaXQoJ3NlY3VyZScsIHNlY3VyZVBhaXIuY2xlYXJ0ZXh0KTtcblxuICAgICAgICBzZWN1cmVQYWlyLmNsZWFydGV4dC5zZXRNYXhTZW5kRnJhZ21lbnQodGhpcy5vdXRnb2luZ01lc3NhZ2VTdHJlYW0ucGFja2V0U2l6ZSk7XG5cbiAgICAgICAgdGhpcy5vdXRnb2luZ01lc3NhZ2VTdHJlYW0udW5waXBlKHRoaXMuc29ja2V0KTtcbiAgICAgICAgdGhpcy5zb2NrZXQudW5waXBlKHRoaXMuaW5jb21pbmdNZXNzYWdlU3RyZWFtKTtcblxuICAgICAgICB0aGlzLnNvY2tldC5waXBlKHNlY3VyZVBhaXIuZW5jcnlwdGVkKTtcbiAgICAgICAgc2VjdXJlUGFpci5lbmNyeXB0ZWQucGlwZSh0aGlzLnNvY2tldCk7XG5cbiAgICAgICAgc2VjdXJlUGFpci5jbGVhcnRleHQucGlwZSh0aGlzLmluY29taW5nTWVzc2FnZVN0cmVhbSk7XG4gICAgICAgIHRoaXMub3V0Z29pbmdNZXNzYWdlU3RyZWFtLnBpcGUoc2VjdXJlUGFpci5jbGVhcnRleHQpO1xuXG4gICAgICAgIHRoaXMudGxzTmVnb3RpYXRpb25Db21wbGV0ZSA9IHRydWU7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25FcnJvciA9IChlcnI/OiBFcnJvcikgPT4ge1xuICAgICAgICBzZWN1cmVQYWlyLmVuY3J5cHRlZC5yZW1vdmVMaXN0ZW5lcigncmVhZGFibGUnLCBvblJlYWRhYmxlKTtcbiAgICAgICAgc2VjdXJlUGFpci5jbGVhcnRleHQucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgIHNlY3VyZVBhaXIuY2xlYXJ0ZXh0LnJlbW92ZUxpc3RlbmVyKCdzZWN1cmVDb25uZWN0Jywgb25TZWN1cmVDb25uZWN0KTtcblxuICAgICAgICBzZWN1cmVQYWlyLmNsZWFydGV4dC5kZXN0cm95KCk7XG4gICAgICAgIHNlY3VyZVBhaXIuZW5jcnlwdGVkLmRlc3Ryb3koKTtcblxuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uUmVhZGFibGUgPSAoKSA9PiB7XG4gICAgICAgIC8vIFdoZW4gdGhlcmUgaXMgaGFuZHNoYWtlIGRhdGEgb24gdGhlIGVuY3J5cGVkIHN0cmVhbSBvZiB0aGUgc2VjdXJlIHBhaXIsXG4gICAgICAgIC8vIHdlIHdyYXAgaXQgaW50byBhIGBQUkVMT0dJTmAgbWVzc2FnZSBhbmQgc2VuZCBpdCB0byB0aGUgc2VydmVyLlxuICAgICAgICAvL1xuICAgICAgICAvLyBGb3IgZWFjaCBgUFJFTE9HSU5gIG1lc3NhZ2Ugd2Ugc2VudCB3ZSBnZXQgYmFjayBleGFjdGx5IG9uZSByZXNwb25zZSBtZXNzYWdlXG4gICAgICAgIC8vIHRoYXQgY29udGFpbnMgdGhlIHNlcnZlcidzIGhhbmRzaGFrZSByZXNwb25zZSBkYXRhLlxuICAgICAgICBjb25zdCBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoeyB0eXBlOiBUWVBFLlBSRUxPR0lOLCByZXNldENvbm5lY3Rpb246IGZhbHNlIH0pO1xuXG4gICAgICAgIGxldCBjaHVuaztcbiAgICAgICAgd2hpbGUgKGNodW5rID0gc2VjdXJlUGFpci5lbmNyeXB0ZWQucmVhZCgpKSB7XG4gICAgICAgICAgbWVzc2FnZS53cml0ZShjaHVuayk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vdXRnb2luZ01lc3NhZ2VTdHJlYW0ud3JpdGUobWVzc2FnZSk7XG4gICAgICAgIG1lc3NhZ2UuZW5kKCk7XG5cbiAgICAgICAgdGhpcy5yZWFkTWVzc2FnZSgpLnRoZW4oYXN5bmMgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgLy8gU2V0dXAgcmVhZGFibGUgaGFuZGxlciBmb3IgdGhlIG5leHQgcm91bmQgb2YgaGFuZHNoYWtpbmcuXG4gICAgICAgICAgLy8gSWYgd2UgZW5jb3VudGVyIGEgYHNlY3VyZUNvbm5lY3RgIG9uIHRoZSBjbGVhcnRleHQgc2lkZVxuICAgICAgICAgIC8vIG9mIHRoZSBzZWN1cmUgcGFpciwgdGhlIGByZWFkYWJsZWAgaGFuZGxlciBpcyBjbGVhcmVkXG4gICAgICAgICAgLy8gYW5kIG5vIGZ1cnRoZXIgaGFuZHNoYWtlIGhhbmRsaW5nIHdpbGwgaGFwcGVuLlxuICAgICAgICAgIHNlY3VyZVBhaXIuZW5jcnlwdGVkLm9uY2UoJ3JlYWRhYmxlJywgb25SZWFkYWJsZSk7XG5cbiAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGRhdGEgb2YgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgIC8vIFdlIGZlZWQgdGhlIHNlcnZlcidzIGhhbmRzaGFrZSByZXNwb25zZSBiYWNrIGludG8gdGhlXG4gICAgICAgICAgICAvLyBlbmNyeXB0ZWQgZW5kIG9mIHRoZSBzZWN1cmUgcGFpci5cbiAgICAgICAgICAgIHNlY3VyZVBhaXIuZW5jcnlwdGVkLndyaXRlKGRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2gob25FcnJvcik7XG4gICAgICB9O1xuXG4gICAgICBzZWN1cmVQYWlyLmNsZWFydGV4dC5vbmNlKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgc2VjdXJlUGFpci5jbGVhcnRleHQub25jZSgnc2VjdXJlQ29ubmVjdCcsIG9uU2VjdXJlQ29ubmVjdCk7XG4gICAgICBzZWN1cmVQYWlyLmVuY3J5cHRlZC5vbmNlKCdyZWFkYWJsZScsIG9uUmVhZGFibGUpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gVE9ETyBsaXN0ZW4gZm9yICdkcmFpbicgZXZlbnQgd2hlbiBzb2NrZXQud3JpdGUgcmV0dXJucyBmYWxzZS5cbiAgLy8gVE9ETyBpbXBsZW1lbnQgaW5jb21wbGV0ZSByZXF1ZXN0IGNhbmNlbGF0aW9uICgyLjIuMS42KVxuICBzZW5kTWVzc2FnZShwYWNrZXRUeXBlOiBudW1iZXIsIGRhdGE/OiBCdWZmZXIsIHJlc2V0Q29ubmVjdGlvbj86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoeyB0eXBlOiBwYWNrZXRUeXBlLCByZXNldENvbm5lY3Rpb246IHJlc2V0Q29ubmVjdGlvbiB9KTtcbiAgICBtZXNzYWdlLmVuZChkYXRhKTtcbiAgICB0aGlzLm91dGdvaW5nTWVzc2FnZVN0cmVhbS53cml0ZShtZXNzYWdlKTtcbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSBuZXh0IGluY29taW5nIG1lc3NhZ2UgZnJvbSB0aGUgc29ja2V0LlxuICAgKi9cbiAgYXN5bmMgcmVhZE1lc3NhZ2UoKTogUHJvbWlzZTxNZXNzYWdlPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5pbmNvbWluZ01lc3NhZ2VJdGVyYXRvci5uZXh0KCk7XG5cbiAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5leHBlY3RlZCBlbmQgb2YgbWVzc2FnZSBzdHJlYW0nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE1lc3NhZ2VJTztcbm1vZHVsZS5leHBvcnRzID0gTWVzc2FnZUlPO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBR0E7O0FBRUE7O0FBSUE7O0FBQ0E7O0FBRUE7O0FBQ0E7Ozs7Ozs7O0FBRUEsTUFBTUEsU0FBTixTQUF3QkMsb0JBQXhCLENBQXFDO0VBZ0JuQ0MsV0FBVyxDQUFDQyxNQUFELEVBQWlCQyxVQUFqQixFQUFxQ0MsS0FBckMsRUFBbUQ7SUFDNUQ7SUFENEQsS0FmOURGLE1BZThEO0lBQUEsS0FkOURFLEtBYzhEO0lBQUEsS0FaOURDLHNCQVk4RDtJQUFBLEtBVnREQyxxQkFVc0Q7SUFBQSxLQVQ5REMscUJBUzhEO0lBQUEsS0FQOURDLFVBTzhEO0lBQUEsS0FGOURDLHVCQUU4RDtJQUc1RCxLQUFLUCxNQUFMLEdBQWNBLE1BQWQ7SUFDQSxLQUFLRSxLQUFMLEdBQWFBLEtBQWI7SUFFQSxLQUFLQyxzQkFBTCxHQUE4QixLQUE5QjtJQUVBLEtBQUtDLHFCQUFMLEdBQTZCLElBQUlJLDhCQUFKLENBQTBCLEtBQUtOLEtBQS9CLENBQTdCO0lBQ0EsS0FBS0ssdUJBQUwsR0FBK0IsS0FBS0gscUJBQUwsQ0FBMkJLLE1BQU0sQ0FBQ0MsYUFBbEMsR0FBL0I7SUFFQSxLQUFLTCxxQkFBTCxHQUE2QixJQUFJTSw4QkFBSixDQUEwQixLQUFLVCxLQUEvQixFQUFzQztNQUFFRCxVQUFVLEVBQUVBO0lBQWQsQ0FBdEMsQ0FBN0I7SUFFQSxLQUFLRCxNQUFMLENBQVlZLElBQVosQ0FBaUIsS0FBS1IscUJBQXRCO0lBQ0EsS0FBS0MscUJBQUwsQ0FBMkJPLElBQTNCLENBQWdDLEtBQUtaLE1BQXJDO0VBQ0Q7O0VBRURDLFVBQVUsQ0FBQyxHQUFHWSxJQUFKLEVBQW9CO0lBQzVCLElBQUlBLElBQUksQ0FBQ0MsTUFBTCxHQUFjLENBQWxCLEVBQXFCO01BQ25CLE1BQU1iLFVBQVUsR0FBR1ksSUFBSSxDQUFDLENBQUQsQ0FBdkI7TUFDQSxLQUFLWCxLQUFMLENBQVdhLEdBQVgsQ0FBZSw4QkFBOEIsS0FBS1YscUJBQUwsQ0FBMkJKLFVBQXpELEdBQXNFLE1BQXRFLEdBQStFQSxVQUE5RjtNQUNBLEtBQUtJLHFCQUFMLENBQTJCSixVQUEzQixHQUF3Q0EsVUFBeEM7SUFDRDs7SUFFRCxJQUFJLEtBQUtLLFVBQVQsRUFBcUI7TUFDbkIsS0FBS0EsVUFBTCxDQUFnQlUsU0FBaEIsQ0FBMEJDLGtCQUExQixDQUE2QyxLQUFLWixxQkFBTCxDQUEyQkosVUFBeEU7SUFDRDs7SUFFRCxPQUFPLEtBQUtJLHFCQUFMLENBQTJCSixVQUFsQztFQUNELENBN0NrQyxDQStDbkM7OztFQUNBaUIsUUFBUSxDQUFDQyxrQkFBRCxFQUErQ0MsUUFBL0MsRUFBaUVDLHNCQUFqRSxFQUFrRztJQUN4RyxJQUFJLENBQUNGLGtCQUFrQixDQUFDRyxVQUFwQixJQUFrQyxDQUFDLENBQUMsU0FBRCxFQUFZLFNBQVosRUFBdUIsT0FBdkIsRUFBZ0NDLFFBQWhDLENBQXlDSixrQkFBa0IsQ0FBQ0csVUFBNUQsQ0FBdkMsRUFBZ0g7TUFDOUdILGtCQUFrQixDQUFDRyxVQUFuQixHQUFnQyxTQUFoQztJQUNEOztJQUVELE1BQU1FLGFBQWEsR0FBR0MsR0FBRyxDQUFDQyxtQkFBSixDQUF3QlAsa0JBQXhCLENBQXRCO0lBRUEsT0FBTyxJQUFJUSxPQUFKLENBQWtCLENBQUNDLE9BQUQsRUFBVUMsTUFBVixLQUFxQjtNQUM1QyxNQUFNQyxVQUFVLEdBQUcsSUFBSUMseUJBQUosRUFBbkI7TUFDQSxNQUFNekIsVUFBVSxHQUFHLEtBQUtBLFVBQUwsR0FBa0I7UUFDbkNVLFNBQVMsRUFBRVMsR0FBRyxDQUFDTyxPQUFKLENBQVk7VUFDckJoQyxNQUFNLEVBQUU4QixVQUFVLENBQUNHLE9BREU7VUFFckJDLFVBQVUsRUFBRWQsUUFGUztVQUdyQkksYUFBYSxFQUFFQSxhQUhNO1VBSXJCVyxrQkFBa0IsRUFBRSxDQUFDZDtRQUpBLENBQVosQ0FEd0I7UUFPbkNlLFNBQVMsRUFBRU4sVUFBVSxDQUFDTztNQVBhLENBQXJDOztNQVVBLE1BQU1DLGVBQWUsR0FBRyxNQUFNO1FBQzVCaEMsVUFBVSxDQUFDOEIsU0FBWCxDQUFxQkcsY0FBckIsQ0FBb0MsVUFBcEMsRUFBZ0RDLFVBQWhEO1FBQ0FsQyxVQUFVLENBQUNVLFNBQVgsQ0FBcUJ1QixjQUFyQixDQUFvQyxPQUFwQyxFQUE2Q0UsT0FBN0M7UUFDQW5DLFVBQVUsQ0FBQ1UsU0FBWCxDQUFxQnVCLGNBQXJCLENBQW9DLGVBQXBDLEVBQXFERCxlQUFyRCxFQUg0QixDQUs1QjtRQUNBOztRQUNBaEMsVUFBVSxDQUFDVSxTQUFYLENBQXFCMEIsSUFBckIsQ0FBMEIsT0FBMUIsRUFBb0NDLEdBQUQsSUFBUztVQUMxQyxLQUFLM0MsTUFBTCxDQUFZNEMsT0FBWixDQUFvQkQsR0FBcEI7UUFDRCxDQUZEO1FBSUEsTUFBTUUsTUFBTSxHQUFHdkMsVUFBVSxDQUFDVSxTQUFYLENBQXFCOEIsU0FBckIsRUFBZjs7UUFDQSxJQUFJRCxNQUFKLEVBQVk7VUFDVixLQUFLM0MsS0FBTCxDQUFXYSxHQUFYLENBQWUscUJBQXFCOEIsTUFBTSxDQUFDRSxJQUE1QixHQUFtQyxJQUFuQyxHQUEwQ0YsTUFBTSxDQUFDRyxPQUFqRCxHQUEyRCxHQUExRTtRQUNEOztRQUVELEtBQUtDLElBQUwsQ0FBVSxRQUFWLEVBQW9CM0MsVUFBVSxDQUFDVSxTQUEvQjtRQUVBVixVQUFVLENBQUNVLFNBQVgsQ0FBcUJDLGtCQUFyQixDQUF3QyxLQUFLWixxQkFBTCxDQUEyQkosVUFBbkU7UUFFQSxLQUFLSSxxQkFBTCxDQUEyQjZDLE1BQTNCLENBQWtDLEtBQUtsRCxNQUF2QztRQUNBLEtBQUtBLE1BQUwsQ0FBWWtELE1BQVosQ0FBbUIsS0FBSzlDLHFCQUF4QjtRQUVBLEtBQUtKLE1BQUwsQ0FBWVksSUFBWixDQUFpQk4sVUFBVSxDQUFDOEIsU0FBNUI7UUFDQTlCLFVBQVUsQ0FBQzhCLFNBQVgsQ0FBcUJ4QixJQUFyQixDQUEwQixLQUFLWixNQUEvQjtRQUVBTSxVQUFVLENBQUNVLFNBQVgsQ0FBcUJKLElBQXJCLENBQTBCLEtBQUtSLHFCQUEvQjtRQUNBLEtBQUtDLHFCQUFMLENBQTJCTyxJQUEzQixDQUFnQ04sVUFBVSxDQUFDVSxTQUEzQztRQUVBLEtBQUtiLHNCQUFMLEdBQThCLElBQTlCO1FBRUF5QixPQUFPO01BQ1IsQ0FoQ0Q7O01Ba0NBLE1BQU1hLE9BQU8sR0FBSUUsR0FBRCxJQUFpQjtRQUMvQnJDLFVBQVUsQ0FBQzhCLFNBQVgsQ0FBcUJHLGNBQXJCLENBQW9DLFVBQXBDLEVBQWdEQyxVQUFoRDtRQUNBbEMsVUFBVSxDQUFDVSxTQUFYLENBQXFCdUIsY0FBckIsQ0FBb0MsT0FBcEMsRUFBNkNFLE9BQTdDO1FBQ0FuQyxVQUFVLENBQUNVLFNBQVgsQ0FBcUJ1QixjQUFyQixDQUFvQyxlQUFwQyxFQUFxREQsZUFBckQ7UUFFQWhDLFVBQVUsQ0FBQ1UsU0FBWCxDQUFxQjRCLE9BQXJCO1FBQ0F0QyxVQUFVLENBQUM4QixTQUFYLENBQXFCUSxPQUFyQjtRQUVBZixNQUFNLENBQUNjLEdBQUQsQ0FBTjtNQUNELENBVEQ7O01BV0EsTUFBTUgsVUFBVSxHQUFHLE1BQU07UUFDdkI7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLE1BQU1XLE9BQU8sR0FBRyxJQUFJQyxnQkFBSixDQUFZO1VBQUVDLElBQUksRUFBRUMsYUFBS0MsUUFBYjtVQUF1QkMsZUFBZSxFQUFFO1FBQXhDLENBQVosQ0FBaEI7UUFFQSxJQUFJQyxLQUFKOztRQUNBLE9BQU9BLEtBQUssR0FBR25ELFVBQVUsQ0FBQzhCLFNBQVgsQ0FBcUJzQixJQUFyQixFQUFmLEVBQTRDO1VBQzFDUCxPQUFPLENBQUNRLEtBQVIsQ0FBY0YsS0FBZDtRQUNEOztRQUNELEtBQUtwRCxxQkFBTCxDQUEyQnNELEtBQTNCLENBQWlDUixPQUFqQztRQUNBQSxPQUFPLENBQUNTLEdBQVI7UUFFQSxLQUFLQyxXQUFMLEdBQW1CQyxJQUFuQixDQUF3QixNQUFPQyxRQUFQLElBQW9CO1VBQzFDO1VBQ0E7VUFDQTtVQUNBO1VBQ0F6RCxVQUFVLENBQUM4QixTQUFYLENBQXFCTSxJQUFyQixDQUEwQixVQUExQixFQUFzQ0YsVUFBdEM7O1VBRUEsV0FBVyxNQUFNd0IsSUFBakIsSUFBeUJELFFBQXpCLEVBQW1DO1lBQ2pDO1lBQ0E7WUFDQXpELFVBQVUsQ0FBQzhCLFNBQVgsQ0FBcUJ1QixLQUFyQixDQUEyQkssSUFBM0I7VUFDRDtRQUNGLENBWkQsRUFZR0MsS0FaSCxDQVlTeEIsT0FaVDtNQWFELENBNUJEOztNQThCQW5DLFVBQVUsQ0FBQ1UsU0FBWCxDQUFxQjBCLElBQXJCLENBQTBCLE9BQTFCLEVBQW1DRCxPQUFuQztNQUNBbkMsVUFBVSxDQUFDVSxTQUFYLENBQXFCMEIsSUFBckIsQ0FBMEIsZUFBMUIsRUFBMkNKLGVBQTNDO01BQ0FoQyxVQUFVLENBQUM4QixTQUFYLENBQXFCTSxJQUFyQixDQUEwQixVQUExQixFQUFzQ0YsVUFBdEM7SUFDRCxDQTFGTSxDQUFQO0VBMkZELENBbEprQyxDQW9KbkM7RUFDQTs7O0VBQ0EwQixXQUFXLENBQUNDLFVBQUQsRUFBcUJILElBQXJCLEVBQW9DUixlQUFwQyxFQUErRDtJQUN4RSxNQUFNTCxPQUFPLEdBQUcsSUFBSUMsZ0JBQUosQ0FBWTtNQUFFQyxJQUFJLEVBQUVjLFVBQVI7TUFBb0JYLGVBQWUsRUFBRUE7SUFBckMsQ0FBWixDQUFoQjtJQUNBTCxPQUFPLENBQUNTLEdBQVIsQ0FBWUksSUFBWjtJQUNBLEtBQUszRCxxQkFBTCxDQUEyQnNELEtBQTNCLENBQWlDUixPQUFqQztJQUNBLE9BQU9BLE9BQVA7RUFDRDtFQUVEO0FBQ0Y7QUFDQTs7O0VBQ21CLE1BQVhVLFdBQVcsR0FBcUI7SUFDcEMsTUFBTU8sTUFBTSxHQUFHLE1BQU0sS0FBSzdELHVCQUFMLENBQTZCOEQsSUFBN0IsRUFBckI7O0lBRUEsSUFBSUQsTUFBTSxDQUFDRSxJQUFYLEVBQWlCO01BQ2YsTUFBTSxJQUFJQyxLQUFKLENBQVUsa0NBQVYsQ0FBTjtJQUNEOztJQUVELE9BQU9ILE1BQU0sQ0FBQ0ksS0FBZDtFQUNEOztBQXhLa0M7O2VBMkt0QjNFLFM7O0FBQ2Y0RSxNQUFNLENBQUNDLE9BQVAsR0FBaUI3RSxTQUFqQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _stream = require("stream");

class Message extends _stream.PassThrough {
  constructor({
    type,
    resetConnection = false
  }) {
    super();
    this.type = void 0;
    this.resetConnection = void 0;
    this.ignore = void 0;
    this.type = type;
    this.resetConnection = resetConnection;
    this.ignore = false;
  }

}

var _default = Message;
exports.default = _default;
module.exports = Message;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNZXNzYWdlIiwiUGFzc1Rocm91Z2giLCJjb25zdHJ1Y3RvciIsInR5cGUiLCJyZXNldENvbm5lY3Rpb24iLCJpZ25vcmUiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL21lc3NhZ2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGFzc1Rocm91Z2ggfSBmcm9tICdzdHJlYW0nO1xuXG5jbGFzcyBNZXNzYWdlIGV4dGVuZHMgUGFzc1Rocm91Z2gge1xuICB0eXBlOiBudW1iZXI7XG4gIHJlc2V0Q29ubmVjdGlvbjogYm9vbGVhbjtcbiAgaWdub3JlOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHsgdHlwZSwgcmVzZXRDb25uZWN0aW9uID0gZmFsc2UgfTogeyB0eXBlOiBudW1iZXIsIHJlc2V0Q29ubmVjdGlvbj86IGJvb2xlYW4gfCB1bmRlZmluZWQgfSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMucmVzZXRDb25uZWN0aW9uID0gcmVzZXRDb25uZWN0aW9uO1xuICAgIHRoaXMuaWdub3JlID0gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTWVzc2FnZTtcbm1vZHVsZS5leHBvcnRzID0gTWVzc2FnZTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUVBLE1BQU1BLE9BQU4sU0FBc0JDLG1CQUF0QixDQUFrQztFQUtoQ0MsV0FBVyxDQUFDO0lBQUVDLElBQUY7SUFBUUMsZUFBZSxHQUFHO0VBQTFCLENBQUQsRUFBNkY7SUFDdEc7SUFEc0csS0FKeEdELElBSXdHO0lBQUEsS0FIeEdDLGVBR3dHO0lBQUEsS0FGeEdDLE1BRXdHO0lBR3RHLEtBQUtGLElBQUwsR0FBWUEsSUFBWjtJQUNBLEtBQUtDLGVBQUwsR0FBdUJBLGVBQXZCO0lBQ0EsS0FBS0MsTUFBTCxHQUFjLEtBQWQ7RUFDRDs7QUFYK0I7O2VBY25CTCxPOztBQUNmTSxNQUFNLENBQUNDLE9BQVAsR0FBaUJQLE9BQWpCIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
exports.readCollation = readCollation;

var _collation = require("./collation");

var _dataType = require("./data-type");

var _sprintfJs = require("sprintf-js");

function readCollation(parser, callback) {
  // s2.2.5.1.2
  parser.readBuffer(5, collationData => {
    callback(_collation.Collation.fromBuffer(collationData));
  });
}

function readSchema(parser, callback) {
  // s2.2.5.5.3
  parser.readUInt8(schemaPresent => {
    if (schemaPresent === 0x01) {
      parser.readBVarChar(dbname => {
        parser.readBVarChar(owningSchema => {
          parser.readUsVarChar(xmlSchemaCollection => {
            callback({
              dbname: dbname,
              owningSchema: owningSchema,
              xmlSchemaCollection: xmlSchemaCollection
            });
          });
        });
      });
    } else {
      callback(undefined);
    }
  });
}

function readUDTInfo(parser, callback) {
  parser.readUInt16LE(maxByteSize => {
    parser.readBVarChar(dbname => {
      parser.readBVarChar(owningSchema => {
        parser.readBVarChar(typeName => {
          parser.readUsVarChar(assemblyName => {
            callback({
              maxByteSize: maxByteSize,
              dbname: dbname,
              owningSchema: owningSchema,
              typeName: typeName,
              assemblyName: assemblyName
            });
          });
        });
      });
    });
  });
}

function metadataParse(parser, options, callback) {
  (options.tdsVersion < '7_2' ? parser.readUInt16LE : parser.readUInt32LE).call(parser, userType => {
    parser.readUInt16LE(flags => {
      parser.readUInt8(typeNumber => {
        const type = _dataType.TYPE[typeNumber];

        if (!type) {
          throw new Error((0, _sprintfJs.sprintf)('Unrecognised data type 0x%02X', typeNumber));
        }

        switch (type.name) {
          case 'Null':
          case 'TinyInt':
          case 'SmallInt':
          case 'Int':
          case 'BigInt':
          case 'Real':
          case 'Float':
          case 'SmallMoney':
          case 'Money':
          case 'Bit':
          case 'SmallDateTime':
          case 'DateTime':
          case 'Date':
            return callback({
              userType: userType,
              flags: flags,
              type: type,
              collation: undefined,
              precision: undefined,
              scale: undefined,
              dataLength: undefined,
              schema: undefined,
              udtInfo: undefined
            });

          case 'IntN':
          case 'FloatN':
          case 'MoneyN':
          case 'BitN':
          case 'UniqueIdentifier':
          case 'DateTimeN':
            return parser.readUInt8(dataLength => {
              callback({
                userType: userType,
                flags: flags,
                type: type,
                collation: undefined,
                precision: undefined,
                scale: undefined,
                dataLength: dataLength,
                schema: undefined,
                udtInfo: undefined
              });
            });

          case 'Variant':
            return parser.readUInt32LE(dataLength => {
              callback({
                userType: userType,
                flags: flags,
                type: type,
                collation: undefined,
                precision: undefined,
                scale: undefined,
                dataLength: dataLength,
                schema: undefined,
                udtInfo: undefined
              });
            });

          case 'VarChar':
          case 'Char':
          case 'NVarChar':
          case 'NChar':
            return parser.readUInt16LE(dataLength => {
              readCollation(parser, collation => {
                callback({
                  userType: userType,
                  flags: flags,
                  type: type,
                  collation: collation,
                  precision: undefined,
                  scale: undefined,
                  dataLength: dataLength,
                  schema: undefined,
                  udtInfo: undefined
                });
              });
            });

          case 'Text':
          case 'NText':
            return parser.readUInt32LE(dataLength => {
              readCollation(parser, collation => {
                callback({
                  userType: userType,
                  flags: flags,
                  type: type,
                  collation: collation,
                  precision: undefined,
                  scale: undefined,
                  dataLength: dataLength,
                  schema: undefined,
                  udtInfo: undefined
                });
              });
            });

          case 'VarBinary':
          case 'Binary':
            return parser.readUInt16LE(dataLength => {
              callback({
                userType: userType,
                flags: flags,
                type: type,
                collation: undefined,
                precision: undefined,
                scale: undefined,
                dataLength: dataLength,
                schema: undefined,
                udtInfo: undefined
              });
            });

          case 'Image':
            return parser.readUInt32LE(dataLength => {
              callback({
                userType: userType,
                flags: flags,
                type: type,
                collation: undefined,
                precision: undefined,
                scale: undefined,
                dataLength: dataLength,
                schema: undefined,
                udtInfo: undefined
              });
            });

          case 'Xml':
            return readSchema(parser, schema => {
              callback({
                userType: userType,
                flags: flags,
                type: type,
                collation: undefined,
                precision: undefined,
                scale: undefined,
                dataLength: undefined,
                schema: schema,
                udtInfo: undefined
              });
            });

          case 'Time':
          case 'DateTime2':
          case 'DateTimeOffset':
            return parser.readUInt8(scale => {
              callback({
                userType: userType,
                flags: flags,
                type: type,
                collation: undefined,
                precision: undefined,
                scale: scale,
                dataLength: undefined,
                schema: undefined,
                udtInfo: undefined
              });
            });

          case 'NumericN':
          case 'DecimalN':
            return parser.readUInt8(dataLength => {
              parser.readUInt8(precision => {
                parser.readUInt8(scale => {
                  callback({
                    userType: userType,
                    flags: flags,
                    type: type,
                    collation: undefined,
                    precision: precision,
                    scale: scale,
                    dataLength: dataLength,
                    schema: undefined,
                    udtInfo: undefined
                  });
                });
              });
            });

          case 'UDT':
            return readUDTInfo(parser, udtInfo => {
              callback({
                userType: userType,
                flags: flags,
                type: type,
                collation: undefined,
                precision: undefined,
                scale: undefined,
                dataLength: undefined,
                schema: undefined,
                udtInfo: udtInfo
              });
            });

          default:
            throw new Error((0, _sprintfJs.sprintf)('Unrecognised type %s', type.name));
        }
      });
    });
  });
}

var _default = metadataParse;
exports.default = _default;
module.exports = metadataParse;
module.exports.readCollation = readCollation;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZWFkQ29sbGF0aW9uIiwicGFyc2VyIiwiY2FsbGJhY2siLCJyZWFkQnVmZmVyIiwiY29sbGF0aW9uRGF0YSIsIkNvbGxhdGlvbiIsImZyb21CdWZmZXIiLCJyZWFkU2NoZW1hIiwicmVhZFVJbnQ4Iiwic2NoZW1hUHJlc2VudCIsInJlYWRCVmFyQ2hhciIsImRibmFtZSIsIm93bmluZ1NjaGVtYSIsInJlYWRVc1ZhckNoYXIiLCJ4bWxTY2hlbWFDb2xsZWN0aW9uIiwidW5kZWZpbmVkIiwicmVhZFVEVEluZm8iLCJyZWFkVUludDE2TEUiLCJtYXhCeXRlU2l6ZSIsInR5cGVOYW1lIiwiYXNzZW1ibHlOYW1lIiwibWV0YWRhdGFQYXJzZSIsIm9wdGlvbnMiLCJ0ZHNWZXJzaW9uIiwicmVhZFVJbnQzMkxFIiwiY2FsbCIsInVzZXJUeXBlIiwiZmxhZ3MiLCJ0eXBlTnVtYmVyIiwidHlwZSIsIlRZUEUiLCJFcnJvciIsIm5hbWUiLCJjb2xsYXRpb24iLCJwcmVjaXNpb24iLCJzY2FsZSIsImRhdGFMZW5ndGgiLCJzY2hlbWEiLCJ1ZHRJbmZvIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9tZXRhZGF0YS1wYXJzZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29sbGF0aW9uIH0gZnJvbSAnLi9jb2xsYXRpb24nO1xuaW1wb3J0IFBhcnNlciwgeyBQYXJzZXJPcHRpb25zIH0gZnJvbSAnLi90b2tlbi9zdHJlYW0tcGFyc2VyJztcbmltcG9ydCB7IFRZUEUsIERhdGFUeXBlIH0gZnJvbSAnLi9kYXRhLXR5cGUnO1xuaW1wb3J0IHsgQ3J5cHRvTWV0YWRhdGEgfSBmcm9tICcuL2Fsd2F5cy1lbmNyeXB0ZWQvdHlwZXMnO1xuXG5pbXBvcnQgeyBzcHJpbnRmIH0gZnJvbSAnc3ByaW50Zi1qcyc7XG5cbmludGVyZmFjZSBYbWxTY2hlbWEge1xuICBkYm5hbWU6IHN0cmluZztcbiAgb3duaW5nU2NoZW1hOiBzdHJpbmc7XG4gIHhtbFNjaGVtYUNvbGxlY3Rpb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFVkdEluZm8ge1xuICBtYXhCeXRlU2l6ZTogbnVtYmVyO1xuICBkYm5hbWU6IHN0cmluZztcbiAgb3duaW5nU2NoZW1hOiBzdHJpbmc7XG4gIHR5cGVOYW1lOiBzdHJpbmc7XG4gIGFzc2VtYmx5TmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBCYXNlTWV0YWRhdGEgPSB7XG4gIHVzZXJUeXBlOiBudW1iZXI7XG5cbiAgZmxhZ3M6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBjb2x1bW4ncyB0eXBlLCBzdWNoIGFzIFZhckNoYXIsIEludCBvciBCaW5hcnkuXG4gICAqL1xuICB0eXBlOiBEYXRhVHlwZTtcblxuICBjb2xsYXRpb246IENvbGxhdGlvbiB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFRoZSBwcmVjaXNpb24uIE9ubHkgYXBwbGljYWJsZSB0byBudW1lcmljIGFuZCBkZWNpbWFsLlxuICAgKi9cbiAgcHJlY2lzaW9uOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBzY2FsZS4gT25seSBhcHBsaWNhYmxlIHRvIG51bWVyaWMsIGRlY2ltYWwsIHRpbWUsIGRhdGV0aW1lMiBhbmQgZGF0ZXRpbWVvZmZzZXQuXG4gICAqL1xuICBzY2FsZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgbGVuZ3RoLCBmb3IgY2hhciwgdmFyY2hhciwgbnZhcmNoYXIgYW5kIHZhcmJpbmFyeS5cbiAgICovXG4gIGRhdGFMZW5ndGg6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICBzY2hlbWE6IFhtbFNjaGVtYSB8IHVuZGVmaW5lZDtcblxuICB1ZHRJbmZvOiBVZHRJbmZvIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgdHlwZSBNZXRhZGF0YSA9IHtcbiAgY3J5cHRvTWV0YWRhdGE/OiBDcnlwdG9NZXRhZGF0YTtcbn0gJiBCYXNlTWV0YWRhdGE7XG5cblxuZnVuY3Rpb24gcmVhZENvbGxhdGlvbihwYXJzZXI6IFBhcnNlciwgY2FsbGJhY2s6IChjb2xsYXRpb246IENvbGxhdGlvbikgPT4gdm9pZCkge1xuICAvLyBzMi4yLjUuMS4yXG4gIHBhcnNlci5yZWFkQnVmZmVyKDUsIChjb2xsYXRpb25EYXRhKSA9PiB7XG4gICAgY2FsbGJhY2soQ29sbGF0aW9uLmZyb21CdWZmZXIoY29sbGF0aW9uRGF0YSkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVhZFNjaGVtYShwYXJzZXI6IFBhcnNlciwgY2FsbGJhY2s6IChzY2hlbWE6IFhtbFNjaGVtYSB8IHVuZGVmaW5lZCkgPT4gdm9pZCkge1xuICAvLyBzMi4yLjUuNS4zXG4gIHBhcnNlci5yZWFkVUludDgoKHNjaGVtYVByZXNlbnQpID0+IHtcbiAgICBpZiAoc2NoZW1hUHJlc2VudCA9PT0gMHgwMSkge1xuICAgICAgcGFyc2VyLnJlYWRCVmFyQ2hhcigoZGJuYW1lKSA9PiB7XG4gICAgICAgIHBhcnNlci5yZWFkQlZhckNoYXIoKG93bmluZ1NjaGVtYSkgPT4ge1xuICAgICAgICAgIHBhcnNlci5yZWFkVXNWYXJDaGFyKCh4bWxTY2hlbWFDb2xsZWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayh7XG4gICAgICAgICAgICAgIGRibmFtZTogZGJuYW1lLFxuICAgICAgICAgICAgICBvd25pbmdTY2hlbWE6IG93bmluZ1NjaGVtYSxcbiAgICAgICAgICAgICAgeG1sU2NoZW1hQ29sbGVjdGlvbjogeG1sU2NoZW1hQ29sbGVjdGlvblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKHVuZGVmaW5lZCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVhZFVEVEluZm8ocGFyc2VyOiBQYXJzZXIsIGNhbGxiYWNrOiAodWR0SW5mbzogVWR0SW5mbyB8IHVuZGVmaW5lZCkgPT4gdm9pZCkge1xuICBwYXJzZXIucmVhZFVJbnQxNkxFKChtYXhCeXRlU2l6ZSkgPT4ge1xuICAgIHBhcnNlci5yZWFkQlZhckNoYXIoKGRibmFtZSkgPT4ge1xuICAgICAgcGFyc2VyLnJlYWRCVmFyQ2hhcigob3duaW5nU2NoZW1hKSA9PiB7XG4gICAgICAgIHBhcnNlci5yZWFkQlZhckNoYXIoKHR5cGVOYW1lKSA9PiB7XG4gICAgICAgICAgcGFyc2VyLnJlYWRVc1ZhckNoYXIoKGFzc2VtYmx5TmFtZSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2soe1xuICAgICAgICAgICAgICBtYXhCeXRlU2l6ZTogbWF4Qnl0ZVNpemUsXG4gICAgICAgICAgICAgIGRibmFtZTogZGJuYW1lLFxuICAgICAgICAgICAgICBvd25pbmdTY2hlbWE6IG93bmluZ1NjaGVtYSxcbiAgICAgICAgICAgICAgdHlwZU5hbWU6IHR5cGVOYW1lLFxuICAgICAgICAgICAgICBhc3NlbWJseU5hbWU6IGFzc2VtYmx5TmFtZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtZXRhZGF0YVBhcnNlKHBhcnNlcjogUGFyc2VyLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zLCBjYWxsYmFjazogKG1ldGFkYXRhOiBNZXRhZGF0YSkgPT4gdm9pZCkge1xuICAob3B0aW9ucy50ZHNWZXJzaW9uIDwgJzdfMicgPyBwYXJzZXIucmVhZFVJbnQxNkxFIDogcGFyc2VyLnJlYWRVSW50MzJMRSkuY2FsbChwYXJzZXIsICh1c2VyVHlwZSkgPT4ge1xuICAgIHBhcnNlci5yZWFkVUludDE2TEUoKGZsYWdzKSA9PiB7XG4gICAgICBwYXJzZXIucmVhZFVJbnQ4KCh0eXBlTnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHR5cGU6IERhdGFUeXBlID0gVFlQRVt0eXBlTnVtYmVyXTtcblxuICAgICAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc3ByaW50ZignVW5yZWNvZ25pc2VkIGRhdGEgdHlwZSAweCUwMlgnLCB0eXBlTnVtYmVyKSk7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHR5cGUubmFtZSkge1xuICAgICAgICAgIGNhc2UgJ051bGwnOlxuICAgICAgICAgIGNhc2UgJ1RpbnlJbnQnOlxuICAgICAgICAgIGNhc2UgJ1NtYWxsSW50JzpcbiAgICAgICAgICBjYXNlICdJbnQnOlxuICAgICAgICAgIGNhc2UgJ0JpZ0ludCc6XG4gICAgICAgICAgY2FzZSAnUmVhbCc6XG4gICAgICAgICAgY2FzZSAnRmxvYXQnOlxuICAgICAgICAgIGNhc2UgJ1NtYWxsTW9uZXknOlxuICAgICAgICAgIGNhc2UgJ01vbmV5JzpcbiAgICAgICAgICBjYXNlICdCaXQnOlxuICAgICAgICAgIGNhc2UgJ1NtYWxsRGF0ZVRpbWUnOlxuICAgICAgICAgIGNhc2UgJ0RhdGVUaW1lJzpcbiAgICAgICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayh7XG4gICAgICAgICAgICAgIHVzZXJUeXBlOiB1c2VyVHlwZSxcbiAgICAgICAgICAgICAgZmxhZ3M6IGZsYWdzLFxuICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICBjb2xsYXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgcHJlY2lzaW9uOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHNjYWxlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIGRhdGFMZW5ndGg6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgc2NoZW1hOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHVkdEluZm86IHVuZGVmaW5lZFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjYXNlICdJbnROJzpcbiAgICAgICAgICBjYXNlICdGbG9hdE4nOlxuICAgICAgICAgIGNhc2UgJ01vbmV5Tic6XG4gICAgICAgICAgY2FzZSAnQml0Tic6XG4gICAgICAgICAgY2FzZSAnVW5pcXVlSWRlbnRpZmllcic6XG4gICAgICAgICAgY2FzZSAnRGF0ZVRpbWVOJzpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZXIucmVhZFVJbnQ4KChkYXRhTGVuZ3RoKSA9PiB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKHtcbiAgICAgICAgICAgICAgICB1c2VyVHlwZTogdXNlclR5cGUsXG4gICAgICAgICAgICAgICAgZmxhZ3M6IGZsYWdzLFxuICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgY29sbGF0aW9uOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcHJlY2lzaW9uOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc2NhbGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBkYXRhTGVuZ3RoOiBkYXRhTGVuZ3RoLFxuICAgICAgICAgICAgICAgIHNjaGVtYTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHVkdEluZm86IHVuZGVmaW5lZFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY2FzZSAnVmFyaWFudCc6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VyLnJlYWRVSW50MzJMRSgoZGF0YUxlbmd0aCkgPT4ge1xuICAgICAgICAgICAgICBjYWxsYmFjayh7XG4gICAgICAgICAgICAgICAgdXNlclR5cGU6IHVzZXJUeXBlLFxuICAgICAgICAgICAgICAgIGZsYWdzOiBmbGFncyxcbiAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgIGNvbGxhdGlvbjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHNjYWxlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZGF0YUxlbmd0aDogZGF0YUxlbmd0aCxcbiAgICAgICAgICAgICAgICBzY2hlbWE6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB1ZHRJbmZvOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNhc2UgJ1ZhckNoYXInOlxuICAgICAgICAgIGNhc2UgJ0NoYXInOlxuICAgICAgICAgIGNhc2UgJ05WYXJDaGFyJzpcbiAgICAgICAgICBjYXNlICdOQ2hhcic6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VyLnJlYWRVSW50MTZMRSgoZGF0YUxlbmd0aCkgPT4ge1xuICAgICAgICAgICAgICByZWFkQ29sbGF0aW9uKHBhcnNlciwgKGNvbGxhdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHtcbiAgICAgICAgICAgICAgICAgIHVzZXJUeXBlOiB1c2VyVHlwZSxcbiAgICAgICAgICAgICAgICAgIGZsYWdzOiBmbGFncyxcbiAgICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgICBjb2xsYXRpb246IGNvbGxhdGlvbixcbiAgICAgICAgICAgICAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgc2NhbGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIGRhdGFMZW5ndGg6IGRhdGFMZW5ndGgsXG4gICAgICAgICAgICAgICAgICBzY2hlbWE6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIHVkdEluZm86IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY2FzZSAnVGV4dCc6XG4gICAgICAgICAgY2FzZSAnTlRleHQnOlxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlci5yZWFkVUludDMyTEUoKGRhdGFMZW5ndGgpID0+IHtcbiAgICAgICAgICAgICAgcmVhZENvbGxhdGlvbihwYXJzZXIsIChjb2xsYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayh7XG4gICAgICAgICAgICAgICAgICB1c2VyVHlwZTogdXNlclR5cGUsXG4gICAgICAgICAgICAgICAgICBmbGFnczogZmxhZ3MsXG4gICAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgICAgY29sbGF0aW9uOiBjb2xsYXRpb24sXG4gICAgICAgICAgICAgICAgICBwcmVjaXNpb246IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIHNjYWxlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICBkYXRhTGVuZ3RoOiBkYXRhTGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgc2NoZW1hOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICB1ZHRJbmZvOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNhc2UgJ1ZhckJpbmFyeSc6XG4gICAgICAgICAgY2FzZSAnQmluYXJ5JzpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZXIucmVhZFVJbnQxNkxFKChkYXRhTGVuZ3RoKSA9PiB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKHtcbiAgICAgICAgICAgICAgICB1c2VyVHlwZTogdXNlclR5cGUsXG4gICAgICAgICAgICAgICAgZmxhZ3M6IGZsYWdzLFxuICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgY29sbGF0aW9uOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcHJlY2lzaW9uOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc2NhbGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBkYXRhTGVuZ3RoOiBkYXRhTGVuZ3RoLFxuICAgICAgICAgICAgICAgIHNjaGVtYTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHVkdEluZm86IHVuZGVmaW5lZFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY2FzZSAnSW1hZ2UnOlxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlci5yZWFkVUludDMyTEUoKGRhdGFMZW5ndGgpID0+IHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soe1xuICAgICAgICAgICAgICAgIHVzZXJUeXBlOiB1c2VyVHlwZSxcbiAgICAgICAgICAgICAgICBmbGFnczogZmxhZ3MsXG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICBjb2xsYXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBwcmVjaXNpb246IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzY2FsZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGRhdGFMZW5ndGg6IGRhdGFMZW5ndGgsXG4gICAgICAgICAgICAgICAgc2NoZW1hOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgdWR0SW5mbzogdW5kZWZpbmVkXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjYXNlICdYbWwnOlxuICAgICAgICAgICAgcmV0dXJuIHJlYWRTY2hlbWEocGFyc2VyLCAoc2NoZW1hKSA9PiB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKHtcbiAgICAgICAgICAgICAgICB1c2VyVHlwZTogdXNlclR5cGUsXG4gICAgICAgICAgICAgICAgZmxhZ3M6IGZsYWdzLFxuICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgY29sbGF0aW9uOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcHJlY2lzaW9uOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc2NhbGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBkYXRhTGVuZ3RoOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWEsXG4gICAgICAgICAgICAgICAgdWR0SW5mbzogdW5kZWZpbmVkXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjYXNlICdUaW1lJzpcbiAgICAgICAgICBjYXNlICdEYXRlVGltZTInOlxuICAgICAgICAgIGNhc2UgJ0RhdGVUaW1lT2Zmc2V0JzpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZXIucmVhZFVJbnQ4KChzY2FsZSkgPT4ge1xuICAgICAgICAgICAgICBjYWxsYmFjayh7XG4gICAgICAgICAgICAgICAgdXNlclR5cGU6IHVzZXJUeXBlLFxuICAgICAgICAgICAgICAgIGZsYWdzOiBmbGFncyxcbiAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgIGNvbGxhdGlvbjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHNjYWxlOiBzY2FsZSxcbiAgICAgICAgICAgICAgICBkYXRhTGVuZ3RoOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc2NoZW1hOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgdWR0SW5mbzogdW5kZWZpbmVkXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjYXNlICdOdW1lcmljTic6XG4gICAgICAgICAgY2FzZSAnRGVjaW1hbE4nOlxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlci5yZWFkVUludDgoKGRhdGFMZW5ndGgpID0+IHtcbiAgICAgICAgICAgICAgcGFyc2VyLnJlYWRVSW50OCgocHJlY2lzaW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgcGFyc2VyLnJlYWRVSW50OCgoc2NhbGUpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHtcbiAgICAgICAgICAgICAgICAgICAgdXNlclR5cGU6IHVzZXJUeXBlLFxuICAgICAgICAgICAgICAgICAgICBmbGFnczogZmxhZ3MsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgICAgIGNvbGxhdGlvbjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb246IHByZWNpc2lvbixcbiAgICAgICAgICAgICAgICAgICAgc2NhbGU6IHNjYWxlLFxuICAgICAgICAgICAgICAgICAgICBkYXRhTGVuZ3RoOiBkYXRhTGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgdWR0SW5mbzogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNhc2UgJ1VEVCc6XG4gICAgICAgICAgICByZXR1cm4gcmVhZFVEVEluZm8ocGFyc2VyLCAodWR0SW5mbykgPT4ge1xuICAgICAgICAgICAgICBjYWxsYmFjayh7XG4gICAgICAgICAgICAgICAgdXNlclR5cGU6IHVzZXJUeXBlLFxuICAgICAgICAgICAgICAgIGZsYWdzOiBmbGFncyxcbiAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgIGNvbGxhdGlvbjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHNjYWxlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZGF0YUxlbmd0aDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHNjaGVtYTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHVkdEluZm86IHVkdEluZm9cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc3ByaW50ZignVW5yZWNvZ25pc2VkIHR5cGUgJXMnLCB0eXBlLm5hbWUpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtZXRhZGF0YVBhcnNlO1xuZXhwb3J0IHsgcmVhZENvbGxhdGlvbiB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1ldGFkYXRhUGFyc2U7XG5tb2R1bGUuZXhwb3J0cy5yZWFkQ29sbGF0aW9uID0gcmVhZENvbGxhdGlvbjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7QUFFQTs7QUFHQTs7QUFtREEsU0FBU0EsYUFBVCxDQUF1QkMsTUFBdkIsRUFBdUNDLFFBQXZDLEVBQWlGO0VBQy9FO0VBQ0FELE1BQU0sQ0FBQ0UsVUFBUCxDQUFrQixDQUFsQixFQUFzQkMsYUFBRCxJQUFtQjtJQUN0Q0YsUUFBUSxDQUFDRyxxQkFBVUMsVUFBVixDQUFxQkYsYUFBckIsQ0FBRCxDQUFSO0VBQ0QsQ0FGRDtBQUdEOztBQUVELFNBQVNHLFVBQVQsQ0FBb0JOLE1BQXBCLEVBQW9DQyxRQUFwQyxFQUF1RjtFQUNyRjtFQUNBRCxNQUFNLENBQUNPLFNBQVAsQ0FBa0JDLGFBQUQsSUFBbUI7SUFDbEMsSUFBSUEsYUFBYSxLQUFLLElBQXRCLEVBQTRCO01BQzFCUixNQUFNLENBQUNTLFlBQVAsQ0FBcUJDLE1BQUQsSUFBWTtRQUM5QlYsTUFBTSxDQUFDUyxZQUFQLENBQXFCRSxZQUFELElBQWtCO1VBQ3BDWCxNQUFNLENBQUNZLGFBQVAsQ0FBc0JDLG1CQUFELElBQXlCO1lBQzVDWixRQUFRLENBQUM7Y0FDUFMsTUFBTSxFQUFFQSxNQUREO2NBRVBDLFlBQVksRUFBRUEsWUFGUDtjQUdQRSxtQkFBbUIsRUFBRUE7WUFIZCxDQUFELENBQVI7VUFLRCxDQU5EO1FBT0QsQ0FSRDtNQVNELENBVkQ7SUFXRCxDQVpELE1BWU87TUFDTFosUUFBUSxDQUFDYSxTQUFELENBQVI7SUFDRDtFQUNGLENBaEJEO0FBaUJEOztBQUVELFNBQVNDLFdBQVQsQ0FBcUJmLE1BQXJCLEVBQXFDQyxRQUFyQyxFQUF1RjtFQUNyRkQsTUFBTSxDQUFDZ0IsWUFBUCxDQUFxQkMsV0FBRCxJQUFpQjtJQUNuQ2pCLE1BQU0sQ0FBQ1MsWUFBUCxDQUFxQkMsTUFBRCxJQUFZO01BQzlCVixNQUFNLENBQUNTLFlBQVAsQ0FBcUJFLFlBQUQsSUFBa0I7UUFDcENYLE1BQU0sQ0FBQ1MsWUFBUCxDQUFxQlMsUUFBRCxJQUFjO1VBQ2hDbEIsTUFBTSxDQUFDWSxhQUFQLENBQXNCTyxZQUFELElBQWtCO1lBQ3JDbEIsUUFBUSxDQUFDO2NBQ1BnQixXQUFXLEVBQUVBLFdBRE47Y0FFUFAsTUFBTSxFQUFFQSxNQUZEO2NBR1BDLFlBQVksRUFBRUEsWUFIUDtjQUlQTyxRQUFRLEVBQUVBLFFBSkg7Y0FLUEMsWUFBWSxFQUFFQTtZQUxQLENBQUQsQ0FBUjtVQU9ELENBUkQ7UUFTRCxDQVZEO01BV0QsQ0FaRDtJQWFELENBZEQ7RUFlRCxDQWhCRDtBQWlCRDs7QUFFRCxTQUFTQyxhQUFULENBQXVCcEIsTUFBdkIsRUFBdUNxQixPQUF2QyxFQUErRHBCLFFBQS9ELEVBQXVHO0VBQ3JHLENBQUNvQixPQUFPLENBQUNDLFVBQVIsR0FBcUIsS0FBckIsR0FBNkJ0QixNQUFNLENBQUNnQixZQUFwQyxHQUFtRGhCLE1BQU0sQ0FBQ3VCLFlBQTNELEVBQXlFQyxJQUF6RSxDQUE4RXhCLE1BQTlFLEVBQXVGeUIsUUFBRCxJQUFjO0lBQ2xHekIsTUFBTSxDQUFDZ0IsWUFBUCxDQUFxQlUsS0FBRCxJQUFXO01BQzdCMUIsTUFBTSxDQUFDTyxTQUFQLENBQWtCb0IsVUFBRCxJQUFnQjtRQUMvQixNQUFNQyxJQUFjLEdBQUdDLGVBQUtGLFVBQUwsQ0FBdkI7O1FBRUEsSUFBSSxDQUFDQyxJQUFMLEVBQVc7VUFDVCxNQUFNLElBQUlFLEtBQUosQ0FBVSx3QkFBUSwrQkFBUixFQUF5Q0gsVUFBekMsQ0FBVixDQUFOO1FBQ0Q7O1FBRUQsUUFBUUMsSUFBSSxDQUFDRyxJQUFiO1VBQ0UsS0FBSyxNQUFMO1VBQ0EsS0FBSyxTQUFMO1VBQ0EsS0FBSyxVQUFMO1VBQ0EsS0FBSyxLQUFMO1VBQ0EsS0FBSyxRQUFMO1VBQ0EsS0FBSyxNQUFMO1VBQ0EsS0FBSyxPQUFMO1VBQ0EsS0FBSyxZQUFMO1VBQ0EsS0FBSyxPQUFMO1VBQ0EsS0FBSyxLQUFMO1VBQ0EsS0FBSyxlQUFMO1VBQ0EsS0FBSyxVQUFMO1VBQ0EsS0FBSyxNQUFMO1lBQ0UsT0FBTzlCLFFBQVEsQ0FBQztjQUNkd0IsUUFBUSxFQUFFQSxRQURJO2NBRWRDLEtBQUssRUFBRUEsS0FGTztjQUdkRSxJQUFJLEVBQUVBLElBSFE7Y0FJZEksU0FBUyxFQUFFbEIsU0FKRztjQUtkbUIsU0FBUyxFQUFFbkIsU0FMRztjQU1kb0IsS0FBSyxFQUFFcEIsU0FOTztjQU9kcUIsVUFBVSxFQUFFckIsU0FQRTtjQVFkc0IsTUFBTSxFQUFFdEIsU0FSTTtjQVNkdUIsT0FBTyxFQUFFdkI7WUFUSyxDQUFELENBQWY7O1VBWUYsS0FBSyxNQUFMO1VBQ0EsS0FBSyxRQUFMO1VBQ0EsS0FBSyxRQUFMO1VBQ0EsS0FBSyxNQUFMO1VBQ0EsS0FBSyxrQkFBTDtVQUNBLEtBQUssV0FBTDtZQUNFLE9BQU9kLE1BQU0sQ0FBQ08sU0FBUCxDQUFrQjRCLFVBQUQsSUFBZ0I7Y0FDdENsQyxRQUFRLENBQUM7Z0JBQ1B3QixRQUFRLEVBQUVBLFFBREg7Z0JBRVBDLEtBQUssRUFBRUEsS0FGQTtnQkFHUEUsSUFBSSxFQUFFQSxJQUhDO2dCQUlQSSxTQUFTLEVBQUVsQixTQUpKO2dCQUtQbUIsU0FBUyxFQUFFbkIsU0FMSjtnQkFNUG9CLEtBQUssRUFBRXBCLFNBTkE7Z0JBT1BxQixVQUFVLEVBQUVBLFVBUEw7Z0JBUVBDLE1BQU0sRUFBRXRCLFNBUkQ7Z0JBU1B1QixPQUFPLEVBQUV2QjtjQVRGLENBQUQsQ0FBUjtZQVdELENBWk0sQ0FBUDs7VUFjRixLQUFLLFNBQUw7WUFDRSxPQUFPZCxNQUFNLENBQUN1QixZQUFQLENBQXFCWSxVQUFELElBQWdCO2NBQ3pDbEMsUUFBUSxDQUFDO2dCQUNQd0IsUUFBUSxFQUFFQSxRQURIO2dCQUVQQyxLQUFLLEVBQUVBLEtBRkE7Z0JBR1BFLElBQUksRUFBRUEsSUFIQztnQkFJUEksU0FBUyxFQUFFbEIsU0FKSjtnQkFLUG1CLFNBQVMsRUFBRW5CLFNBTEo7Z0JBTVBvQixLQUFLLEVBQUVwQixTQU5BO2dCQU9QcUIsVUFBVSxFQUFFQSxVQVBMO2dCQVFQQyxNQUFNLEVBQUV0QixTQVJEO2dCQVNQdUIsT0FBTyxFQUFFdkI7Y0FURixDQUFELENBQVI7WUFXRCxDQVpNLENBQVA7O1VBY0YsS0FBSyxTQUFMO1VBQ0EsS0FBSyxNQUFMO1VBQ0EsS0FBSyxVQUFMO1VBQ0EsS0FBSyxPQUFMO1lBQ0UsT0FBT2QsTUFBTSxDQUFDZ0IsWUFBUCxDQUFxQm1CLFVBQUQsSUFBZ0I7Y0FDekNwQyxhQUFhLENBQUNDLE1BQUQsRUFBVWdDLFNBQUQsSUFBZTtnQkFDbkMvQixRQUFRLENBQUM7a0JBQ1B3QixRQUFRLEVBQUVBLFFBREg7a0JBRVBDLEtBQUssRUFBRUEsS0FGQTtrQkFHUEUsSUFBSSxFQUFFQSxJQUhDO2tCQUlQSSxTQUFTLEVBQUVBLFNBSko7a0JBS1BDLFNBQVMsRUFBRW5CLFNBTEo7a0JBTVBvQixLQUFLLEVBQUVwQixTQU5BO2tCQU9QcUIsVUFBVSxFQUFFQSxVQVBMO2tCQVFQQyxNQUFNLEVBQUV0QixTQVJEO2tCQVNQdUIsT0FBTyxFQUFFdkI7Z0JBVEYsQ0FBRCxDQUFSO2NBV0QsQ0FaWSxDQUFiO1lBYUQsQ0FkTSxDQUFQOztVQWdCRixLQUFLLE1BQUw7VUFDQSxLQUFLLE9BQUw7WUFDRSxPQUFPZCxNQUFNLENBQUN1QixZQUFQLENBQXFCWSxVQUFELElBQWdCO2NBQ3pDcEMsYUFBYSxDQUFDQyxNQUFELEVBQVVnQyxTQUFELElBQWU7Z0JBQ25DL0IsUUFBUSxDQUFDO2tCQUNQd0IsUUFBUSxFQUFFQSxRQURIO2tCQUVQQyxLQUFLLEVBQUVBLEtBRkE7a0JBR1BFLElBQUksRUFBRUEsSUFIQztrQkFJUEksU0FBUyxFQUFFQSxTQUpKO2tCQUtQQyxTQUFTLEVBQUVuQixTQUxKO2tCQU1Qb0IsS0FBSyxFQUFFcEIsU0FOQTtrQkFPUHFCLFVBQVUsRUFBRUEsVUFQTDtrQkFRUEMsTUFBTSxFQUFFdEIsU0FSRDtrQkFTUHVCLE9BQU8sRUFBRXZCO2dCQVRGLENBQUQsQ0FBUjtjQVdELENBWlksQ0FBYjtZQWFELENBZE0sQ0FBUDs7VUFnQkYsS0FBSyxXQUFMO1VBQ0EsS0FBSyxRQUFMO1lBQ0UsT0FBT2QsTUFBTSxDQUFDZ0IsWUFBUCxDQUFxQm1CLFVBQUQsSUFBZ0I7Y0FDekNsQyxRQUFRLENBQUM7Z0JBQ1B3QixRQUFRLEVBQUVBLFFBREg7Z0JBRVBDLEtBQUssRUFBRUEsS0FGQTtnQkFHUEUsSUFBSSxFQUFFQSxJQUhDO2dCQUlQSSxTQUFTLEVBQUVsQixTQUpKO2dCQUtQbUIsU0FBUyxFQUFFbkIsU0FMSjtnQkFNUG9CLEtBQUssRUFBRXBCLFNBTkE7Z0JBT1BxQixVQUFVLEVBQUVBLFVBUEw7Z0JBUVBDLE1BQU0sRUFBRXRCLFNBUkQ7Z0JBU1B1QixPQUFPLEVBQUV2QjtjQVRGLENBQUQsQ0FBUjtZQVdELENBWk0sQ0FBUDs7VUFjRixLQUFLLE9BQUw7WUFDRSxPQUFPZCxNQUFNLENBQUN1QixZQUFQLENBQXFCWSxVQUFELElBQWdCO2NBQ3pDbEMsUUFBUSxDQUFDO2dCQUNQd0IsUUFBUSxFQUFFQSxRQURIO2dCQUVQQyxLQUFLLEVBQUVBLEtBRkE7Z0JBR1BFLElBQUksRUFBRUEsSUFIQztnQkFJUEksU0FBUyxFQUFFbEIsU0FKSjtnQkFLUG1CLFNBQVMsRUFBRW5CLFNBTEo7Z0JBTVBvQixLQUFLLEVBQUVwQixTQU5BO2dCQU9QcUIsVUFBVSxFQUFFQSxVQVBMO2dCQVFQQyxNQUFNLEVBQUV0QixTQVJEO2dCQVNQdUIsT0FBTyxFQUFFdkI7Y0FURixDQUFELENBQVI7WUFXRCxDQVpNLENBQVA7O1VBY0YsS0FBSyxLQUFMO1lBQ0UsT0FBT1IsVUFBVSxDQUFDTixNQUFELEVBQVVvQyxNQUFELElBQVk7Y0FDcENuQyxRQUFRLENBQUM7Z0JBQ1B3QixRQUFRLEVBQUVBLFFBREg7Z0JBRVBDLEtBQUssRUFBRUEsS0FGQTtnQkFHUEUsSUFBSSxFQUFFQSxJQUhDO2dCQUlQSSxTQUFTLEVBQUVsQixTQUpKO2dCQUtQbUIsU0FBUyxFQUFFbkIsU0FMSjtnQkFNUG9CLEtBQUssRUFBRXBCLFNBTkE7Z0JBT1BxQixVQUFVLEVBQUVyQixTQVBMO2dCQVFQc0IsTUFBTSxFQUFFQSxNQVJEO2dCQVNQQyxPQUFPLEVBQUV2QjtjQVRGLENBQUQsQ0FBUjtZQVdELENBWmdCLENBQWpCOztVQWNGLEtBQUssTUFBTDtVQUNBLEtBQUssV0FBTDtVQUNBLEtBQUssZ0JBQUw7WUFDRSxPQUFPZCxNQUFNLENBQUNPLFNBQVAsQ0FBa0IyQixLQUFELElBQVc7Y0FDakNqQyxRQUFRLENBQUM7Z0JBQ1B3QixRQUFRLEVBQUVBLFFBREg7Z0JBRVBDLEtBQUssRUFBRUEsS0FGQTtnQkFHUEUsSUFBSSxFQUFFQSxJQUhDO2dCQUlQSSxTQUFTLEVBQUVsQixTQUpKO2dCQUtQbUIsU0FBUyxFQUFFbkIsU0FMSjtnQkFNUG9CLEtBQUssRUFBRUEsS0FOQTtnQkFPUEMsVUFBVSxFQUFFckIsU0FQTDtnQkFRUHNCLE1BQU0sRUFBRXRCLFNBUkQ7Z0JBU1B1QixPQUFPLEVBQUV2QjtjQVRGLENBQUQsQ0FBUjtZQVdELENBWk0sQ0FBUDs7VUFjRixLQUFLLFVBQUw7VUFDQSxLQUFLLFVBQUw7WUFDRSxPQUFPZCxNQUFNLENBQUNPLFNBQVAsQ0FBa0I0QixVQUFELElBQWdCO2NBQ3RDbkMsTUFBTSxDQUFDTyxTQUFQLENBQWtCMEIsU0FBRCxJQUFlO2dCQUM5QmpDLE1BQU0sQ0FBQ08sU0FBUCxDQUFrQjJCLEtBQUQsSUFBVztrQkFDMUJqQyxRQUFRLENBQUM7b0JBQ1B3QixRQUFRLEVBQUVBLFFBREg7b0JBRVBDLEtBQUssRUFBRUEsS0FGQTtvQkFHUEUsSUFBSSxFQUFFQSxJQUhDO29CQUlQSSxTQUFTLEVBQUVsQixTQUpKO29CQUtQbUIsU0FBUyxFQUFFQSxTQUxKO29CQU1QQyxLQUFLLEVBQUVBLEtBTkE7b0JBT1BDLFVBQVUsRUFBRUEsVUFQTDtvQkFRUEMsTUFBTSxFQUFFdEIsU0FSRDtvQkFTUHVCLE9BQU8sRUFBRXZCO2tCQVRGLENBQUQsQ0FBUjtnQkFXRCxDQVpEO2NBYUQsQ0FkRDtZQWVELENBaEJNLENBQVA7O1VBa0JGLEtBQUssS0FBTDtZQUNFLE9BQU9DLFdBQVcsQ0FBQ2YsTUFBRCxFQUFVcUMsT0FBRCxJQUFhO2NBQ3RDcEMsUUFBUSxDQUFDO2dCQUNQd0IsUUFBUSxFQUFFQSxRQURIO2dCQUVQQyxLQUFLLEVBQUVBLEtBRkE7Z0JBR1BFLElBQUksRUFBRUEsSUFIQztnQkFJUEksU0FBUyxFQUFFbEIsU0FKSjtnQkFLUG1CLFNBQVMsRUFBRW5CLFNBTEo7Z0JBTVBvQixLQUFLLEVBQUVwQixTQU5BO2dCQU9QcUIsVUFBVSxFQUFFckIsU0FQTDtnQkFRUHNCLE1BQU0sRUFBRXRCLFNBUkQ7Z0JBU1B1QixPQUFPLEVBQUVBO2NBVEYsQ0FBRCxDQUFSO1lBV0QsQ0FaaUIsQ0FBbEI7O1VBY0Y7WUFDRSxNQUFNLElBQUlQLEtBQUosQ0FBVSx3QkFBUSxzQkFBUixFQUFnQ0YsSUFBSSxDQUFDRyxJQUFyQyxDQUFWLENBQU47UUF0TUo7TUF3TUQsQ0EvTUQ7SUFnTkQsQ0FqTkQ7RUFrTkQsQ0FuTkQ7QUFvTkQ7O2VBRWNYLGE7O0FBR2ZrQixNQUFNLENBQUNDLE9BQVAsR0FBaUJuQixhQUFqQjtBQUNBa0IsTUFBTSxDQUFDQyxPQUFQLENBQWV4QyxhQUFmLEdBQStCQSxhQUEvQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _writableTrackingBuffer = _interopRequireDefault(require("./tracking-buffer/writable-tracking-buffer"));

var crypto = _interopRequireWildcard(require("crypto"));

var _jsbi = _interopRequireDefault(require("jsbi"));

var _jsMd = _interopRequireDefault(require("js-md4"));

function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }

function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

class NTLMResponsePayload {
  constructor(loginData) {
    this.data = void 0;
    this.data = this.createResponse(loginData);
  }

  toString(indent = '') {
    return indent + 'NTLM Auth';
  }

  createResponse(challenge) {
    const client_nonce = this.createClientNonce();
    const lmv2len = 24;
    const ntlmv2len = 16;
    const domain = challenge.domain;
    const username = challenge.userName;
    const password = challenge.password;
    const ntlmData = challenge.ntlmpacket;
    const server_data = ntlmData.target;
    const server_nonce = ntlmData.nonce;
    const bufferLength = 64 + domain.length * 2 + username.length * 2 + lmv2len + ntlmv2len + 8 + 8 + 8 + 4 + server_data.length + 4;
    const data = new _writableTrackingBuffer.default(bufferLength);
    data.position = 0;
    data.writeString('NTLMSSP\u0000', 'utf8');
    data.writeUInt32LE(0x03);
    const baseIdx = 64;
    const dnIdx = baseIdx;
    const unIdx = dnIdx + domain.length * 2;
    const l2Idx = unIdx + username.length * 2;
    const ntIdx = l2Idx + lmv2len;
    data.writeUInt16LE(lmv2len);
    data.writeUInt16LE(lmv2len);
    data.writeUInt32LE(l2Idx);
    data.writeUInt16LE(ntlmv2len);
    data.writeUInt16LE(ntlmv2len);
    data.writeUInt32LE(ntIdx);
    data.writeUInt16LE(domain.length * 2);
    data.writeUInt16LE(domain.length * 2);
    data.writeUInt32LE(dnIdx);
    data.writeUInt16LE(username.length * 2);
    data.writeUInt16LE(username.length * 2);
    data.writeUInt32LE(unIdx);
    data.writeUInt16LE(0);
    data.writeUInt16LE(0);
    data.writeUInt32LE(baseIdx);
    data.writeUInt16LE(0);
    data.writeUInt16LE(0);
    data.writeUInt32LE(baseIdx);
    data.writeUInt16LE(0x8201);
    data.writeUInt16LE(0x08);
    data.writeString(domain, 'ucs2');
    data.writeString(username, 'ucs2');
    const lmv2Data = this.lmv2Response(domain, username, password, server_nonce, client_nonce);
    data.copyFrom(lmv2Data);
    const genTime = new Date().getTime();
    const ntlmDataBuffer = this.ntlmv2Response(domain, username, password, server_nonce, server_data, client_nonce, genTime);
    data.copyFrom(ntlmDataBuffer);
    data.writeUInt32LE(0x0101);
    data.writeUInt32LE(0x0000);
    const timestamp = this.createTimestamp(genTime);
    data.copyFrom(timestamp);
    data.copyFrom(client_nonce);
    data.writeUInt32LE(0x0000);
    data.copyFrom(server_data);
    data.writeUInt32LE(0x0000);
    return data.data;
  }

  createClientNonce() {
    const client_nonce = Buffer.alloc(8, 0);
    let nidx = 0;

    while (nidx < 8) {
      client_nonce.writeUInt8(Math.ceil(Math.random() * 255), nidx);
      nidx++;
    }

    return client_nonce;
  }

  ntlmv2Response(domain, user, password, serverNonce, targetInfo, clientNonce, mytime) {
    const timestamp = this.createTimestamp(mytime);
    const hash = this.ntv2Hash(domain, user, password);
    const dataLength = 40 + targetInfo.length;
    const data = Buffer.alloc(dataLength, 0);
    serverNonce.copy(data, 0, 0, 8);
    data.writeUInt32LE(0x101, 8);
    data.writeUInt32LE(0x0, 12);
    timestamp.copy(data, 16, 0, 8);
    clientNonce.copy(data, 24, 0, 8);
    data.writeUInt32LE(0x0, 32);
    targetInfo.copy(data, 36, 0, targetInfo.length);
    data.writeUInt32LE(0x0, 36 + targetInfo.length);
    return this.hmacMD5(data, hash);
  }

  createTimestamp(time) {
    const tenthsOfAMicrosecond = _jsbi.default.multiply(_jsbi.default.add(_jsbi.default.BigInt(time), _jsbi.default.BigInt(11644473600)), _jsbi.default.BigInt(10000000));

    const lo = _jsbi.default.toNumber(_jsbi.default.bitwiseAnd(tenthsOfAMicrosecond, _jsbi.default.BigInt(0xffffffff)));

    const hi = _jsbi.default.toNumber(_jsbi.default.bitwiseAnd(_jsbi.default.signedRightShift(tenthsOfAMicrosecond, _jsbi.default.BigInt(32)), _jsbi.default.BigInt(0xffffffff)));

    const result = Buffer.alloc(8);
    result.writeUInt32LE(lo, 0);
    result.writeUInt32LE(hi, 4);
    return result;
  }

  lmv2Response(domain, user, password, serverNonce, clientNonce) {
    const hash = this.ntv2Hash(domain, user, password);
    const data = Buffer.alloc(serverNonce.length + clientNonce.length, 0);
    serverNonce.copy(data);
    clientNonce.copy(data, serverNonce.length, 0, clientNonce.length);
    const newhash = this.hmacMD5(data, hash);
    const response = Buffer.alloc(newhash.length + clientNonce.length, 0);
    newhash.copy(response);
    clientNonce.copy(response, newhash.length, 0, clientNonce.length);
    return response;
  }

  ntv2Hash(domain, user, password) {
    const hash = this.ntHash(password);
    const identity = Buffer.from(user.toUpperCase() + domain.toUpperCase(), 'ucs2');
    return this.hmacMD5(identity, hash);
  }

  ntHash(text) {
    const unicodeString = Buffer.from(text, 'ucs2');
    return Buffer.from(_jsMd.default.arrayBuffer(unicodeString));
  }

  hmacMD5(data, key) {
    return crypto.createHmac('MD5', key).update(data).digest();
  }

}

var _default = NTLMResponsePayload;
exports.default = _default;
module.exports = NTLMResponsePayload;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOVExNUmVzcG9uc2VQYXlsb2FkIiwiY29uc3RydWN0b3IiLCJsb2dpbkRhdGEiLCJkYXRhIiwiY3JlYXRlUmVzcG9uc2UiLCJ0b1N0cmluZyIsImluZGVudCIsImNoYWxsZW5nZSIsImNsaWVudF9ub25jZSIsImNyZWF0ZUNsaWVudE5vbmNlIiwibG12MmxlbiIsIm50bG12MmxlbiIsImRvbWFpbiIsInVzZXJuYW1lIiwidXNlck5hbWUiLCJwYXNzd29yZCIsIm50bG1EYXRhIiwibnRsbXBhY2tldCIsInNlcnZlcl9kYXRhIiwidGFyZ2V0Iiwic2VydmVyX25vbmNlIiwibm9uY2UiLCJidWZmZXJMZW5ndGgiLCJsZW5ndGgiLCJXcml0YWJsZVRyYWNraW5nQnVmZmVyIiwicG9zaXRpb24iLCJ3cml0ZVN0cmluZyIsIndyaXRlVUludDMyTEUiLCJiYXNlSWR4IiwiZG5JZHgiLCJ1bklkeCIsImwySWR4IiwibnRJZHgiLCJ3cml0ZVVJbnQxNkxFIiwibG12MkRhdGEiLCJsbXYyUmVzcG9uc2UiLCJjb3B5RnJvbSIsImdlblRpbWUiLCJEYXRlIiwiZ2V0VGltZSIsIm50bG1EYXRhQnVmZmVyIiwibnRsbXYyUmVzcG9uc2UiLCJ0aW1lc3RhbXAiLCJjcmVhdGVUaW1lc3RhbXAiLCJCdWZmZXIiLCJhbGxvYyIsIm5pZHgiLCJ3cml0ZVVJbnQ4IiwiTWF0aCIsImNlaWwiLCJyYW5kb20iLCJ1c2VyIiwic2VydmVyTm9uY2UiLCJ0YXJnZXRJbmZvIiwiY2xpZW50Tm9uY2UiLCJteXRpbWUiLCJoYXNoIiwibnR2Mkhhc2giLCJkYXRhTGVuZ3RoIiwiY29weSIsImhtYWNNRDUiLCJ0aW1lIiwidGVudGhzT2ZBTWljcm9zZWNvbmQiLCJKU0JJIiwibXVsdGlwbHkiLCJhZGQiLCJCaWdJbnQiLCJsbyIsInRvTnVtYmVyIiwiYml0d2lzZUFuZCIsImhpIiwic2lnbmVkUmlnaHRTaGlmdCIsInJlc3VsdCIsIm5ld2hhc2giLCJyZXNwb25zZSIsIm50SGFzaCIsImlkZW50aXR5IiwiZnJvbSIsInRvVXBwZXJDYXNlIiwidGV4dCIsInVuaWNvZGVTdHJpbmciLCJtZDQiLCJhcnJheUJ1ZmZlciIsImtleSIsImNyeXB0byIsImNyZWF0ZUhtYWMiLCJ1cGRhdGUiLCJkaWdlc3QiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL250bG0tcGF5bG9hZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgV3JpdGFibGVUcmFja2luZ0J1ZmZlciBmcm9tICcuL3RyYWNraW5nLWJ1ZmZlci93cml0YWJsZS10cmFja2luZy1idWZmZXInO1xuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgSlNCSSBmcm9tICdqc2JpJztcbmltcG9ydCBtZDQgZnJvbSAnanMtbWQ0JztcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBkb21haW46IHN0cmluZztcbiAgdXNlck5hbWU6IHN0cmluZztcbiAgcGFzc3dvcmQ6IHN0cmluZztcbiAgbnRsbXBhY2tldDoge1xuICAgIHRhcmdldDogQnVmZmVyO1xuICAgIG5vbmNlOiBCdWZmZXI7XG4gIH07XG59XG5cbmNsYXNzIE5UTE1SZXNwb25zZVBheWxvYWQge1xuICBkYXRhOiBCdWZmZXI7XG5cbiAgY29uc3RydWN0b3IobG9naW5EYXRhOiBPcHRpb25zKSB7XG4gICAgdGhpcy5kYXRhID0gdGhpcy5jcmVhdGVSZXNwb25zZShsb2dpbkRhdGEpO1xuICB9XG5cbiAgdG9TdHJpbmcoaW5kZW50ID0gJycpIHtcbiAgICByZXR1cm4gaW5kZW50ICsgJ05UTE0gQXV0aCc7XG4gIH1cblxuICBjcmVhdGVSZXNwb25zZShjaGFsbGVuZ2U6IE9wdGlvbnMpIHtcbiAgICBjb25zdCBjbGllbnRfbm9uY2UgPSB0aGlzLmNyZWF0ZUNsaWVudE5vbmNlKCk7XG4gICAgY29uc3QgbG12MmxlbiA9IDI0O1xuICAgIGNvbnN0IG50bG12MmxlbiA9IDE2O1xuICAgIGNvbnN0IGRvbWFpbiA9IGNoYWxsZW5nZS5kb21haW47XG4gICAgY29uc3QgdXNlcm5hbWUgPSBjaGFsbGVuZ2UudXNlck5hbWU7XG4gICAgY29uc3QgcGFzc3dvcmQgPSBjaGFsbGVuZ2UucGFzc3dvcmQ7XG4gICAgY29uc3QgbnRsbURhdGEgPSBjaGFsbGVuZ2UubnRsbXBhY2tldDtcbiAgICBjb25zdCBzZXJ2ZXJfZGF0YSA9IG50bG1EYXRhLnRhcmdldDtcbiAgICBjb25zdCBzZXJ2ZXJfbm9uY2UgPSBudGxtRGF0YS5ub25jZTtcbiAgICBjb25zdCBidWZmZXJMZW5ndGggPSA2NCArIChkb21haW4ubGVuZ3RoICogMikgKyAodXNlcm5hbWUubGVuZ3RoICogMikgKyBsbXYybGVuICsgbnRsbXYybGVuICsgOCArIDggKyA4ICsgNCArIHNlcnZlcl9kYXRhLmxlbmd0aCArIDQ7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBXcml0YWJsZVRyYWNraW5nQnVmZmVyKGJ1ZmZlckxlbmd0aCk7XG4gICAgZGF0YS5wb3NpdGlvbiA9IDA7XG4gICAgZGF0YS53cml0ZVN0cmluZygnTlRMTVNTUFxcdTAwMDAnLCAndXRmOCcpO1xuICAgIGRhdGEud3JpdGVVSW50MzJMRSgweDAzKTtcbiAgICBjb25zdCBiYXNlSWR4ID0gNjQ7XG4gICAgY29uc3QgZG5JZHggPSBiYXNlSWR4O1xuICAgIGNvbnN0IHVuSWR4ID0gZG5JZHggKyBkb21haW4ubGVuZ3RoICogMjtcbiAgICBjb25zdCBsMklkeCA9IHVuSWR4ICsgdXNlcm5hbWUubGVuZ3RoICogMjtcbiAgICBjb25zdCBudElkeCA9IGwySWR4ICsgbG12MmxlbjtcbiAgICBkYXRhLndyaXRlVUludDE2TEUobG12Mmxlbik7XG4gICAgZGF0YS53cml0ZVVJbnQxNkxFKGxtdjJsZW4pO1xuICAgIGRhdGEud3JpdGVVSW50MzJMRShsMklkeCk7XG4gICAgZGF0YS53cml0ZVVJbnQxNkxFKG50bG12Mmxlbik7XG4gICAgZGF0YS53cml0ZVVJbnQxNkxFKG50bG12Mmxlbik7XG4gICAgZGF0YS53cml0ZVVJbnQzMkxFKG50SWR4KTtcbiAgICBkYXRhLndyaXRlVUludDE2TEUoZG9tYWluLmxlbmd0aCAqIDIpO1xuICAgIGRhdGEud3JpdGVVSW50MTZMRShkb21haW4ubGVuZ3RoICogMik7XG4gICAgZGF0YS53cml0ZVVJbnQzMkxFKGRuSWR4KTtcbiAgICBkYXRhLndyaXRlVUludDE2TEUodXNlcm5hbWUubGVuZ3RoICogMik7XG4gICAgZGF0YS53cml0ZVVJbnQxNkxFKHVzZXJuYW1lLmxlbmd0aCAqIDIpO1xuICAgIGRhdGEud3JpdGVVSW50MzJMRSh1bklkeCk7XG4gICAgZGF0YS53cml0ZVVJbnQxNkxFKDApO1xuICAgIGRhdGEud3JpdGVVSW50MTZMRSgwKTtcbiAgICBkYXRhLndyaXRlVUludDMyTEUoYmFzZUlkeCk7XG4gICAgZGF0YS53cml0ZVVJbnQxNkxFKDApO1xuICAgIGRhdGEud3JpdGVVSW50MTZMRSgwKTtcbiAgICBkYXRhLndyaXRlVUludDMyTEUoYmFzZUlkeCk7XG4gICAgZGF0YS53cml0ZVVJbnQxNkxFKDB4ODIwMSk7XG4gICAgZGF0YS53cml0ZVVJbnQxNkxFKDB4MDgpO1xuICAgIGRhdGEud3JpdGVTdHJpbmcoZG9tYWluLCAndWNzMicpO1xuICAgIGRhdGEud3JpdGVTdHJpbmcodXNlcm5hbWUsICd1Y3MyJyk7XG4gICAgY29uc3QgbG12MkRhdGEgPSB0aGlzLmxtdjJSZXNwb25zZShkb21haW4sIHVzZXJuYW1lLCBwYXNzd29yZCwgc2VydmVyX25vbmNlLCBjbGllbnRfbm9uY2UpO1xuICAgIGRhdGEuY29weUZyb20obG12MkRhdGEpO1xuICAgIGNvbnN0IGdlblRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICBjb25zdCBudGxtRGF0YUJ1ZmZlciA9IHRoaXMubnRsbXYyUmVzcG9uc2UoZG9tYWluLCB1c2VybmFtZSwgcGFzc3dvcmQsIHNlcnZlcl9ub25jZSwgc2VydmVyX2RhdGEsIGNsaWVudF9ub25jZSwgZ2VuVGltZSk7XG4gICAgZGF0YS5jb3B5RnJvbShudGxtRGF0YUJ1ZmZlcik7XG4gICAgZGF0YS53cml0ZVVJbnQzMkxFKDB4MDEwMSk7XG4gICAgZGF0YS53cml0ZVVJbnQzMkxFKDB4MDAwMCk7XG4gICAgY29uc3QgdGltZXN0YW1wID0gdGhpcy5jcmVhdGVUaW1lc3RhbXAoZ2VuVGltZSk7XG4gICAgZGF0YS5jb3B5RnJvbSh0aW1lc3RhbXApO1xuICAgIGRhdGEuY29weUZyb20oY2xpZW50X25vbmNlKTtcbiAgICBkYXRhLndyaXRlVUludDMyTEUoMHgwMDAwKTtcbiAgICBkYXRhLmNvcHlGcm9tKHNlcnZlcl9kYXRhKTtcbiAgICBkYXRhLndyaXRlVUludDMyTEUoMHgwMDAwKTtcbiAgICByZXR1cm4gZGF0YS5kYXRhO1xuICB9XG5cbiAgY3JlYXRlQ2xpZW50Tm9uY2UoKSB7XG4gICAgY29uc3QgY2xpZW50X25vbmNlID0gQnVmZmVyLmFsbG9jKDgsIDApO1xuICAgIGxldCBuaWR4ID0gMDtcbiAgICB3aGlsZSAobmlkeCA8IDgpIHtcbiAgICAgIGNsaWVudF9ub25jZS53cml0ZVVJbnQ4KE1hdGguY2VpbChNYXRoLnJhbmRvbSgpICogMjU1KSwgbmlkeCk7XG4gICAgICBuaWR4Kys7XG4gICAgfVxuICAgIHJldHVybiBjbGllbnRfbm9uY2U7XG4gIH1cblxuICBudGxtdjJSZXNwb25zZShkb21haW46IHN0cmluZywgdXNlcjogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nLCBzZXJ2ZXJOb25jZTogQnVmZmVyLCB0YXJnZXRJbmZvOiBCdWZmZXIsIGNsaWVudE5vbmNlOiBCdWZmZXIsIG15dGltZTogbnVtYmVyKSB7XG4gICAgY29uc3QgdGltZXN0YW1wID0gdGhpcy5jcmVhdGVUaW1lc3RhbXAobXl0aW1lKTtcbiAgICBjb25zdCBoYXNoID0gdGhpcy5udHYySGFzaChkb21haW4sIHVzZXIsIHBhc3N3b3JkKTtcbiAgICBjb25zdCBkYXRhTGVuZ3RoID0gNDAgKyB0YXJnZXRJbmZvLmxlbmd0aDtcbiAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKGRhdGFMZW5ndGgsIDApO1xuICAgIHNlcnZlck5vbmNlLmNvcHkoZGF0YSwgMCwgMCwgOCk7XG4gICAgZGF0YS53cml0ZVVJbnQzMkxFKDB4MTAxLCA4KTtcbiAgICBkYXRhLndyaXRlVUludDMyTEUoMHgwLCAxMik7XG4gICAgdGltZXN0YW1wLmNvcHkoZGF0YSwgMTYsIDAsIDgpO1xuICAgIGNsaWVudE5vbmNlLmNvcHkoZGF0YSwgMjQsIDAsIDgpO1xuICAgIGRhdGEud3JpdGVVSW50MzJMRSgweDAsIDMyKTtcbiAgICB0YXJnZXRJbmZvLmNvcHkoZGF0YSwgMzYsIDAsIHRhcmdldEluZm8ubGVuZ3RoKTtcbiAgICBkYXRhLndyaXRlVUludDMyTEUoMHgwLCAzNiArIHRhcmdldEluZm8ubGVuZ3RoKTtcbiAgICByZXR1cm4gdGhpcy5obWFjTUQ1KGRhdGEsIGhhc2gpO1xuICB9XG5cbiAgY3JlYXRlVGltZXN0YW1wKHRpbWU6IG51bWJlcikge1xuICAgIGNvbnN0IHRlbnRoc09mQU1pY3Jvc2Vjb25kID0gSlNCSS5tdWx0aXBseShKU0JJLmFkZChKU0JJLkJpZ0ludCh0aW1lKSwgSlNCSS5CaWdJbnQoMTE2NDQ0NzM2MDApKSwgSlNCSS5CaWdJbnQoMTAwMDAwMDApKTtcblxuICAgIGNvbnN0IGxvID0gSlNCSS50b051bWJlcihKU0JJLmJpdHdpc2VBbmQodGVudGhzT2ZBTWljcm9zZWNvbmQsIEpTQkkuQmlnSW50KDB4ZmZmZmZmZmYpKSk7XG4gICAgY29uc3QgaGkgPSBKU0JJLnRvTnVtYmVyKEpTQkkuYml0d2lzZUFuZChKU0JJLnNpZ25lZFJpZ2h0U2hpZnQodGVudGhzT2ZBTWljcm9zZWNvbmQsIEpTQkkuQmlnSW50KDMyKSksIEpTQkkuQmlnSW50KDB4ZmZmZmZmZmYpKSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBCdWZmZXIuYWxsb2MoOCk7XG4gICAgcmVzdWx0LndyaXRlVUludDMyTEUobG8sIDApO1xuICAgIHJlc3VsdC53cml0ZVVJbnQzMkxFKGhpLCA0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgbG12MlJlc3BvbnNlKGRvbWFpbjogc3RyaW5nLCB1c2VyOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcsIHNlcnZlck5vbmNlOiBCdWZmZXIsIGNsaWVudE5vbmNlOiBCdWZmZXIpIHtcbiAgICBjb25zdCBoYXNoID0gdGhpcy5udHYySGFzaChkb21haW4sIHVzZXIsIHBhc3N3b3JkKTtcbiAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKHNlcnZlck5vbmNlLmxlbmd0aCArIGNsaWVudE5vbmNlLmxlbmd0aCwgMCk7XG5cbiAgICBzZXJ2ZXJOb25jZS5jb3B5KGRhdGEpO1xuICAgIGNsaWVudE5vbmNlLmNvcHkoZGF0YSwgc2VydmVyTm9uY2UubGVuZ3RoLCAwLCBjbGllbnROb25jZS5sZW5ndGgpO1xuXG4gICAgY29uc3QgbmV3aGFzaCA9IHRoaXMuaG1hY01ENShkYXRhLCBoYXNoKTtcbiAgICBjb25zdCByZXNwb25zZSA9IEJ1ZmZlci5hbGxvYyhuZXdoYXNoLmxlbmd0aCArIGNsaWVudE5vbmNlLmxlbmd0aCwgMCk7XG5cbiAgICBuZXdoYXNoLmNvcHkocmVzcG9uc2UpO1xuICAgIGNsaWVudE5vbmNlLmNvcHkocmVzcG9uc2UsIG5ld2hhc2gubGVuZ3RoLCAwLCBjbGllbnROb25jZS5sZW5ndGgpO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgbnR2Mkhhc2goZG9tYWluOiBzdHJpbmcsIHVzZXI6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZykge1xuICAgIGNvbnN0IGhhc2ggPSB0aGlzLm50SGFzaChwYXNzd29yZCk7XG4gICAgY29uc3QgaWRlbnRpdHkgPSBCdWZmZXIuZnJvbSh1c2VyLnRvVXBwZXJDYXNlKCkgKyBkb21haW4udG9VcHBlckNhc2UoKSwgJ3VjczInKTtcbiAgICByZXR1cm4gdGhpcy5obWFjTUQ1KGlkZW50aXR5LCBoYXNoKTtcbiAgfVxuXG4gIG50SGFzaCh0ZXh0OiBzdHJpbmcpIHtcbiAgICBjb25zdCB1bmljb2RlU3RyaW5nID0gQnVmZmVyLmZyb20odGV4dCwgJ3VjczInKTtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20obWQ0LmFycmF5QnVmZmVyKHVuaWNvZGVTdHJpbmcpKTtcbiAgfVxuXG4gIGhtYWNNRDUoZGF0YTogQnVmZmVyLCBrZXk6IEJ1ZmZlcikge1xuICAgIHJldHVybiBjcnlwdG8uY3JlYXRlSG1hYygnTUQ1Jywga2V5KS51cGRhdGUoZGF0YSkuZGlnZXN0KCk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTlRMTVJlc3BvbnNlUGF5bG9hZDtcbm1vZHVsZS5leHBvcnRzID0gTlRMTVJlc3BvbnNlUGF5bG9hZDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7OztBQVlBLE1BQU1BLG1CQUFOLENBQTBCO0VBR3hCQyxXQUFXLENBQUNDLFNBQUQsRUFBcUI7SUFBQSxLQUZoQ0MsSUFFZ0M7SUFDOUIsS0FBS0EsSUFBTCxHQUFZLEtBQUtDLGNBQUwsQ0FBb0JGLFNBQXBCLENBQVo7RUFDRDs7RUFFREcsUUFBUSxDQUFDQyxNQUFNLEdBQUcsRUFBVixFQUFjO0lBQ3BCLE9BQU9BLE1BQU0sR0FBRyxXQUFoQjtFQUNEOztFQUVERixjQUFjLENBQUNHLFNBQUQsRUFBcUI7SUFDakMsTUFBTUMsWUFBWSxHQUFHLEtBQUtDLGlCQUFMLEVBQXJCO0lBQ0EsTUFBTUMsT0FBTyxHQUFHLEVBQWhCO0lBQ0EsTUFBTUMsU0FBUyxHQUFHLEVBQWxCO0lBQ0EsTUFBTUMsTUFBTSxHQUFHTCxTQUFTLENBQUNLLE1BQXpCO0lBQ0EsTUFBTUMsUUFBUSxHQUFHTixTQUFTLENBQUNPLFFBQTNCO0lBQ0EsTUFBTUMsUUFBUSxHQUFHUixTQUFTLENBQUNRLFFBQTNCO0lBQ0EsTUFBTUMsUUFBUSxHQUFHVCxTQUFTLENBQUNVLFVBQTNCO0lBQ0EsTUFBTUMsV0FBVyxHQUFHRixRQUFRLENBQUNHLE1BQTdCO0lBQ0EsTUFBTUMsWUFBWSxHQUFHSixRQUFRLENBQUNLLEtBQTlCO0lBQ0EsTUFBTUMsWUFBWSxHQUFHLEtBQU1WLE1BQU0sQ0FBQ1csTUFBUCxHQUFnQixDQUF0QixHQUE0QlYsUUFBUSxDQUFDVSxNQUFULEdBQWtCLENBQTlDLEdBQW1EYixPQUFuRCxHQUE2REMsU0FBN0QsR0FBeUUsQ0FBekUsR0FBNkUsQ0FBN0UsR0FBaUYsQ0FBakYsR0FBcUYsQ0FBckYsR0FBeUZPLFdBQVcsQ0FBQ0ssTUFBckcsR0FBOEcsQ0FBbkk7SUFDQSxNQUFNcEIsSUFBSSxHQUFHLElBQUlxQiwrQkFBSixDQUEyQkYsWUFBM0IsQ0FBYjtJQUNBbkIsSUFBSSxDQUFDc0IsUUFBTCxHQUFnQixDQUFoQjtJQUNBdEIsSUFBSSxDQUFDdUIsV0FBTCxDQUFpQixlQUFqQixFQUFrQyxNQUFsQztJQUNBdkIsSUFBSSxDQUFDd0IsYUFBTCxDQUFtQixJQUFuQjtJQUNBLE1BQU1DLE9BQU8sR0FBRyxFQUFoQjtJQUNBLE1BQU1DLEtBQUssR0FBR0QsT0FBZDtJQUNBLE1BQU1FLEtBQUssR0FBR0QsS0FBSyxHQUFHakIsTUFBTSxDQUFDVyxNQUFQLEdBQWdCLENBQXRDO0lBQ0EsTUFBTVEsS0FBSyxHQUFHRCxLQUFLLEdBQUdqQixRQUFRLENBQUNVLE1BQVQsR0FBa0IsQ0FBeEM7SUFDQSxNQUFNUyxLQUFLLEdBQUdELEtBQUssR0FBR3JCLE9BQXRCO0lBQ0FQLElBQUksQ0FBQzhCLGFBQUwsQ0FBbUJ2QixPQUFuQjtJQUNBUCxJQUFJLENBQUM4QixhQUFMLENBQW1CdkIsT0FBbkI7SUFDQVAsSUFBSSxDQUFDd0IsYUFBTCxDQUFtQkksS0FBbkI7SUFDQTVCLElBQUksQ0FBQzhCLGFBQUwsQ0FBbUJ0QixTQUFuQjtJQUNBUixJQUFJLENBQUM4QixhQUFMLENBQW1CdEIsU0FBbkI7SUFDQVIsSUFBSSxDQUFDd0IsYUFBTCxDQUFtQkssS0FBbkI7SUFDQTdCLElBQUksQ0FBQzhCLGFBQUwsQ0FBbUJyQixNQUFNLENBQUNXLE1BQVAsR0FBZ0IsQ0FBbkM7SUFDQXBCLElBQUksQ0FBQzhCLGFBQUwsQ0FBbUJyQixNQUFNLENBQUNXLE1BQVAsR0FBZ0IsQ0FBbkM7SUFDQXBCLElBQUksQ0FBQ3dCLGFBQUwsQ0FBbUJFLEtBQW5CO0lBQ0ExQixJQUFJLENBQUM4QixhQUFMLENBQW1CcEIsUUFBUSxDQUFDVSxNQUFULEdBQWtCLENBQXJDO0lBQ0FwQixJQUFJLENBQUM4QixhQUFMLENBQW1CcEIsUUFBUSxDQUFDVSxNQUFULEdBQWtCLENBQXJDO0lBQ0FwQixJQUFJLENBQUN3QixhQUFMLENBQW1CRyxLQUFuQjtJQUNBM0IsSUFBSSxDQUFDOEIsYUFBTCxDQUFtQixDQUFuQjtJQUNBOUIsSUFBSSxDQUFDOEIsYUFBTCxDQUFtQixDQUFuQjtJQUNBOUIsSUFBSSxDQUFDd0IsYUFBTCxDQUFtQkMsT0FBbkI7SUFDQXpCLElBQUksQ0FBQzhCLGFBQUwsQ0FBbUIsQ0FBbkI7SUFDQTlCLElBQUksQ0FBQzhCLGFBQUwsQ0FBbUIsQ0FBbkI7SUFDQTlCLElBQUksQ0FBQ3dCLGFBQUwsQ0FBbUJDLE9BQW5CO0lBQ0F6QixJQUFJLENBQUM4QixhQUFMLENBQW1CLE1BQW5CO0lBQ0E5QixJQUFJLENBQUM4QixhQUFMLENBQW1CLElBQW5CO0lBQ0E5QixJQUFJLENBQUN1QixXQUFMLENBQWlCZCxNQUFqQixFQUF5QixNQUF6QjtJQUNBVCxJQUFJLENBQUN1QixXQUFMLENBQWlCYixRQUFqQixFQUEyQixNQUEzQjtJQUNBLE1BQU1xQixRQUFRLEdBQUcsS0FBS0MsWUFBTCxDQUFrQnZCLE1BQWxCLEVBQTBCQyxRQUExQixFQUFvQ0UsUUFBcEMsRUFBOENLLFlBQTlDLEVBQTREWixZQUE1RCxDQUFqQjtJQUNBTCxJQUFJLENBQUNpQyxRQUFMLENBQWNGLFFBQWQ7SUFDQSxNQUFNRyxPQUFPLEdBQUcsSUFBSUMsSUFBSixHQUFXQyxPQUFYLEVBQWhCO0lBQ0EsTUFBTUMsY0FBYyxHQUFHLEtBQUtDLGNBQUwsQ0FBb0I3QixNQUFwQixFQUE0QkMsUUFBNUIsRUFBc0NFLFFBQXRDLEVBQWdESyxZQUFoRCxFQUE4REYsV0FBOUQsRUFBMkVWLFlBQTNFLEVBQXlGNkIsT0FBekYsQ0FBdkI7SUFDQWxDLElBQUksQ0FBQ2lDLFFBQUwsQ0FBY0ksY0FBZDtJQUNBckMsSUFBSSxDQUFDd0IsYUFBTCxDQUFtQixNQUFuQjtJQUNBeEIsSUFBSSxDQUFDd0IsYUFBTCxDQUFtQixNQUFuQjtJQUNBLE1BQU1lLFNBQVMsR0FBRyxLQUFLQyxlQUFMLENBQXFCTixPQUFyQixDQUFsQjtJQUNBbEMsSUFBSSxDQUFDaUMsUUFBTCxDQUFjTSxTQUFkO0lBQ0F2QyxJQUFJLENBQUNpQyxRQUFMLENBQWM1QixZQUFkO0lBQ0FMLElBQUksQ0FBQ3dCLGFBQUwsQ0FBbUIsTUFBbkI7SUFDQXhCLElBQUksQ0FBQ2lDLFFBQUwsQ0FBY2xCLFdBQWQ7SUFDQWYsSUFBSSxDQUFDd0IsYUFBTCxDQUFtQixNQUFuQjtJQUNBLE9BQU94QixJQUFJLENBQUNBLElBQVo7RUFDRDs7RUFFRE0saUJBQWlCLEdBQUc7SUFDbEIsTUFBTUQsWUFBWSxHQUFHb0MsTUFBTSxDQUFDQyxLQUFQLENBQWEsQ0FBYixFQUFnQixDQUFoQixDQUFyQjtJQUNBLElBQUlDLElBQUksR0FBRyxDQUFYOztJQUNBLE9BQU9BLElBQUksR0FBRyxDQUFkLEVBQWlCO01BQ2Z0QyxZQUFZLENBQUN1QyxVQUFiLENBQXdCQyxJQUFJLENBQUNDLElBQUwsQ0FBVUQsSUFBSSxDQUFDRSxNQUFMLEtBQWdCLEdBQTFCLENBQXhCLEVBQXdESixJQUF4RDtNQUNBQSxJQUFJO0lBQ0w7O0lBQ0QsT0FBT3RDLFlBQVA7RUFDRDs7RUFFRGlDLGNBQWMsQ0FBQzdCLE1BQUQsRUFBaUJ1QyxJQUFqQixFQUErQnBDLFFBQS9CLEVBQWlEcUMsV0FBakQsRUFBc0VDLFVBQXRFLEVBQTBGQyxXQUExRixFQUErR0MsTUFBL0csRUFBK0g7SUFDM0ksTUFBTWIsU0FBUyxHQUFHLEtBQUtDLGVBQUwsQ0FBcUJZLE1BQXJCLENBQWxCO0lBQ0EsTUFBTUMsSUFBSSxHQUFHLEtBQUtDLFFBQUwsQ0FBYzdDLE1BQWQsRUFBc0J1QyxJQUF0QixFQUE0QnBDLFFBQTVCLENBQWI7SUFDQSxNQUFNMkMsVUFBVSxHQUFHLEtBQUtMLFVBQVUsQ0FBQzlCLE1BQW5DO0lBQ0EsTUFBTXBCLElBQUksR0FBR3lDLE1BQU0sQ0FBQ0MsS0FBUCxDQUFhYSxVQUFiLEVBQXlCLENBQXpCLENBQWI7SUFDQU4sV0FBVyxDQUFDTyxJQUFaLENBQWlCeEQsSUFBakIsRUFBdUIsQ0FBdkIsRUFBMEIsQ0FBMUIsRUFBNkIsQ0FBN0I7SUFDQUEsSUFBSSxDQUFDd0IsYUFBTCxDQUFtQixLQUFuQixFQUEwQixDQUExQjtJQUNBeEIsSUFBSSxDQUFDd0IsYUFBTCxDQUFtQixHQUFuQixFQUF3QixFQUF4QjtJQUNBZSxTQUFTLENBQUNpQixJQUFWLENBQWV4RCxJQUFmLEVBQXFCLEVBQXJCLEVBQXlCLENBQXpCLEVBQTRCLENBQTVCO0lBQ0FtRCxXQUFXLENBQUNLLElBQVosQ0FBaUJ4RCxJQUFqQixFQUF1QixFQUF2QixFQUEyQixDQUEzQixFQUE4QixDQUE5QjtJQUNBQSxJQUFJLENBQUN3QixhQUFMLENBQW1CLEdBQW5CLEVBQXdCLEVBQXhCO0lBQ0EwQixVQUFVLENBQUNNLElBQVgsQ0FBZ0J4RCxJQUFoQixFQUFzQixFQUF0QixFQUEwQixDQUExQixFQUE2QmtELFVBQVUsQ0FBQzlCLE1BQXhDO0lBQ0FwQixJQUFJLENBQUN3QixhQUFMLENBQW1CLEdBQW5CLEVBQXdCLEtBQUswQixVQUFVLENBQUM5QixNQUF4QztJQUNBLE9BQU8sS0FBS3FDLE9BQUwsQ0FBYXpELElBQWIsRUFBbUJxRCxJQUFuQixDQUFQO0VBQ0Q7O0VBRURiLGVBQWUsQ0FBQ2tCLElBQUQsRUFBZTtJQUM1QixNQUFNQyxvQkFBb0IsR0FBR0MsY0FBS0MsUUFBTCxDQUFjRCxjQUFLRSxHQUFMLENBQVNGLGNBQUtHLE1BQUwsQ0FBWUwsSUFBWixDQUFULEVBQTRCRSxjQUFLRyxNQUFMLENBQVksV0FBWixDQUE1QixDQUFkLEVBQXFFSCxjQUFLRyxNQUFMLENBQVksUUFBWixDQUFyRSxDQUE3Qjs7SUFFQSxNQUFNQyxFQUFFLEdBQUdKLGNBQUtLLFFBQUwsQ0FBY0wsY0FBS00sVUFBTCxDQUFnQlAsb0JBQWhCLEVBQXNDQyxjQUFLRyxNQUFMLENBQVksVUFBWixDQUF0QyxDQUFkLENBQVg7O0lBQ0EsTUFBTUksRUFBRSxHQUFHUCxjQUFLSyxRQUFMLENBQWNMLGNBQUtNLFVBQUwsQ0FBZ0JOLGNBQUtRLGdCQUFMLENBQXNCVCxvQkFBdEIsRUFBNENDLGNBQUtHLE1BQUwsQ0FBWSxFQUFaLENBQTVDLENBQWhCLEVBQThFSCxjQUFLRyxNQUFMLENBQVksVUFBWixDQUE5RSxDQUFkLENBQVg7O0lBRUEsTUFBTU0sTUFBTSxHQUFHNUIsTUFBTSxDQUFDQyxLQUFQLENBQWEsQ0FBYixDQUFmO0lBQ0EyQixNQUFNLENBQUM3QyxhQUFQLENBQXFCd0MsRUFBckIsRUFBeUIsQ0FBekI7SUFDQUssTUFBTSxDQUFDN0MsYUFBUCxDQUFxQjJDLEVBQXJCLEVBQXlCLENBQXpCO0lBQ0EsT0FBT0UsTUFBUDtFQUNEOztFQUVEckMsWUFBWSxDQUFDdkIsTUFBRCxFQUFpQnVDLElBQWpCLEVBQStCcEMsUUFBL0IsRUFBaURxQyxXQUFqRCxFQUFzRUUsV0FBdEUsRUFBMkY7SUFDckcsTUFBTUUsSUFBSSxHQUFHLEtBQUtDLFFBQUwsQ0FBYzdDLE1BQWQsRUFBc0J1QyxJQUF0QixFQUE0QnBDLFFBQTVCLENBQWI7SUFDQSxNQUFNWixJQUFJLEdBQUd5QyxNQUFNLENBQUNDLEtBQVAsQ0FBYU8sV0FBVyxDQUFDN0IsTUFBWixHQUFxQitCLFdBQVcsQ0FBQy9CLE1BQTlDLEVBQXNELENBQXRELENBQWI7SUFFQTZCLFdBQVcsQ0FBQ08sSUFBWixDQUFpQnhELElBQWpCO0lBQ0FtRCxXQUFXLENBQUNLLElBQVosQ0FBaUJ4RCxJQUFqQixFQUF1QmlELFdBQVcsQ0FBQzdCLE1BQW5DLEVBQTJDLENBQTNDLEVBQThDK0IsV0FBVyxDQUFDL0IsTUFBMUQ7SUFFQSxNQUFNa0QsT0FBTyxHQUFHLEtBQUtiLE9BQUwsQ0FBYXpELElBQWIsRUFBbUJxRCxJQUFuQixDQUFoQjtJQUNBLE1BQU1rQixRQUFRLEdBQUc5QixNQUFNLENBQUNDLEtBQVAsQ0FBYTRCLE9BQU8sQ0FBQ2xELE1BQVIsR0FBaUIrQixXQUFXLENBQUMvQixNQUExQyxFQUFrRCxDQUFsRCxDQUFqQjtJQUVBa0QsT0FBTyxDQUFDZCxJQUFSLENBQWFlLFFBQWI7SUFDQXBCLFdBQVcsQ0FBQ0ssSUFBWixDQUFpQmUsUUFBakIsRUFBMkJELE9BQU8sQ0FBQ2xELE1BQW5DLEVBQTJDLENBQTNDLEVBQThDK0IsV0FBVyxDQUFDL0IsTUFBMUQ7SUFFQSxPQUFPbUQsUUFBUDtFQUNEOztFQUVEakIsUUFBUSxDQUFDN0MsTUFBRCxFQUFpQnVDLElBQWpCLEVBQStCcEMsUUFBL0IsRUFBaUQ7SUFDdkQsTUFBTXlDLElBQUksR0FBRyxLQUFLbUIsTUFBTCxDQUFZNUQsUUFBWixDQUFiO0lBQ0EsTUFBTTZELFFBQVEsR0FBR2hDLE1BQU0sQ0FBQ2lDLElBQVAsQ0FBWTFCLElBQUksQ0FBQzJCLFdBQUwsS0FBcUJsRSxNQUFNLENBQUNrRSxXQUFQLEVBQWpDLEVBQXVELE1BQXZELENBQWpCO0lBQ0EsT0FBTyxLQUFLbEIsT0FBTCxDQUFhZ0IsUUFBYixFQUF1QnBCLElBQXZCLENBQVA7RUFDRDs7RUFFRG1CLE1BQU0sQ0FBQ0ksSUFBRCxFQUFlO0lBQ25CLE1BQU1DLGFBQWEsR0FBR3BDLE1BQU0sQ0FBQ2lDLElBQVAsQ0FBWUUsSUFBWixFQUFrQixNQUFsQixDQUF0QjtJQUNBLE9BQU9uQyxNQUFNLENBQUNpQyxJQUFQLENBQVlJLGNBQUlDLFdBQUosQ0FBZ0JGLGFBQWhCLENBQVosQ0FBUDtFQUNEOztFQUVEcEIsT0FBTyxDQUFDekQsSUFBRCxFQUFlZ0YsR0FBZixFQUE0QjtJQUNqQyxPQUFPQyxNQUFNLENBQUNDLFVBQVAsQ0FBa0IsS0FBbEIsRUFBeUJGLEdBQXpCLEVBQThCRyxNQUE5QixDQUFxQ25GLElBQXJDLEVBQTJDb0YsTUFBM0MsRUFBUDtFQUNEOztBQXhJdUI7O2VBMklYdkYsbUI7O0FBQ2Z3RixNQUFNLENBQUNDLE9BQVAsR0FBaUJ6RixtQkFBakIifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.createNTLMRequest = createNTLMRequest;
const NTLMFlags = {
  NTLM_NegotiateUnicode: 0x00000001,
  NTLM_NegotiateOEM: 0x00000002,
  NTLM_RequestTarget: 0x00000004,
  NTLM_Unknown9: 0x00000008,
  NTLM_NegotiateSign: 0x00000010,
  NTLM_NegotiateSeal: 0x00000020,
  NTLM_NegotiateDatagram: 0x00000040,
  NTLM_NegotiateLanManagerKey: 0x00000080,
  NTLM_Unknown8: 0x00000100,
  NTLM_NegotiateNTLM: 0x00000200,
  NTLM_NegotiateNTOnly: 0x00000400,
  NTLM_Anonymous: 0x00000800,
  NTLM_NegotiateOemDomainSupplied: 0x00001000,
  NTLM_NegotiateOemWorkstationSupplied: 0x00002000,
  NTLM_Unknown6: 0x00004000,
  NTLM_NegotiateAlwaysSign: 0x00008000,
  NTLM_TargetTypeDomain: 0x00010000,
  NTLM_TargetTypeServer: 0x00020000,
  NTLM_TargetTypeShare: 0x00040000,
  NTLM_NegotiateExtendedSecurity: 0x00080000,
  NTLM_NegotiateIdentify: 0x00100000,
  NTLM_Unknown5: 0x00200000,
  NTLM_RequestNonNTSessionKey: 0x00400000,
  NTLM_NegotiateTargetInfo: 0x00800000,
  NTLM_Unknown4: 0x01000000,
  NTLM_NegotiateVersion: 0x02000000,
  NTLM_Unknown3: 0x04000000,
  NTLM_Unknown2: 0x08000000,
  NTLM_Unknown1: 0x10000000,
  NTLM_Negotiate128: 0x20000000,
  NTLM_NegotiateKeyExchange: 0x40000000,
  NTLM_Negotiate56: 0x80000000
};

function createNTLMRequest(options) {
  const domain = escape(options.domain.toUpperCase());
  const workstation = options.workstation ? escape(options.workstation.toUpperCase()) : '';
  let type1flags = NTLMFlags.NTLM_NegotiateUnicode + NTLMFlags.NTLM_NegotiateOEM + NTLMFlags.NTLM_RequestTarget + NTLMFlags.NTLM_NegotiateNTLM + NTLMFlags.NTLM_NegotiateOemDomainSupplied + NTLMFlags.NTLM_NegotiateOemWorkstationSupplied + NTLMFlags.NTLM_NegotiateAlwaysSign + NTLMFlags.NTLM_NegotiateVersion + NTLMFlags.NTLM_NegotiateExtendedSecurity + NTLMFlags.NTLM_Negotiate128 + NTLMFlags.NTLM_Negotiate56;

  if (workstation === '') {
    type1flags -= NTLMFlags.NTLM_NegotiateOemWorkstationSupplied;
  }

  const fixedData = Buffer.alloc(40);
  const buffers = [fixedData];
  let offset = 0;
  offset += fixedData.write('NTLMSSP', offset, 7, 'ascii');
  offset = fixedData.writeUInt8(0, offset);
  offset = fixedData.writeUInt32LE(1, offset);
  offset = fixedData.writeUInt32LE(type1flags, offset);
  offset = fixedData.writeUInt16LE(domain.length, offset);
  offset = fixedData.writeUInt16LE(domain.length, offset);
  offset = fixedData.writeUInt32LE(fixedData.length + workstation.length, offset);
  offset = fixedData.writeUInt16LE(workstation.length, offset);
  offset = fixedData.writeUInt16LE(workstation.length, offset);
  offset = fixedData.writeUInt32LE(fixedData.length, offset);
  offset = fixedData.writeUInt8(5, offset);
  offset = fixedData.writeUInt8(0, offset);
  offset = fixedData.writeUInt16LE(2195, offset);
  offset = fixedData.writeUInt8(0, offset);
  offset = fixedData.writeUInt8(0, offset);
  offset = fixedData.writeUInt8(0, offset);
  fixedData.writeUInt8(15, offset);
  buffers.push(Buffer.from(workstation, 'ascii'));
  buffers.push(Buffer.from(domain, 'ascii'));
  return Buffer.concat(buffers);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOVExNRmxhZ3MiLCJOVExNX05lZ290aWF0ZVVuaWNvZGUiLCJOVExNX05lZ290aWF0ZU9FTSIsIk5UTE1fUmVxdWVzdFRhcmdldCIsIk5UTE1fVW5rbm93bjkiLCJOVExNX05lZ290aWF0ZVNpZ24iLCJOVExNX05lZ290aWF0ZVNlYWwiLCJOVExNX05lZ290aWF0ZURhdGFncmFtIiwiTlRMTV9OZWdvdGlhdGVMYW5NYW5hZ2VyS2V5IiwiTlRMTV9Vbmtub3duOCIsIk5UTE1fTmVnb3RpYXRlTlRMTSIsIk5UTE1fTmVnb3RpYXRlTlRPbmx5IiwiTlRMTV9Bbm9ueW1vdXMiLCJOVExNX05lZ290aWF0ZU9lbURvbWFpblN1cHBsaWVkIiwiTlRMTV9OZWdvdGlhdGVPZW1Xb3Jrc3RhdGlvblN1cHBsaWVkIiwiTlRMTV9Vbmtub3duNiIsIk5UTE1fTmVnb3RpYXRlQWx3YXlzU2lnbiIsIk5UTE1fVGFyZ2V0VHlwZURvbWFpbiIsIk5UTE1fVGFyZ2V0VHlwZVNlcnZlciIsIk5UTE1fVGFyZ2V0VHlwZVNoYXJlIiwiTlRMTV9OZWdvdGlhdGVFeHRlbmRlZFNlY3VyaXR5IiwiTlRMTV9OZWdvdGlhdGVJZGVudGlmeSIsIk5UTE1fVW5rbm93bjUiLCJOVExNX1JlcXVlc3ROb25OVFNlc3Npb25LZXkiLCJOVExNX05lZ290aWF0ZVRhcmdldEluZm8iLCJOVExNX1Vua25vd240IiwiTlRMTV9OZWdvdGlhdGVWZXJzaW9uIiwiTlRMTV9Vbmtub3duMyIsIk5UTE1fVW5rbm93bjIiLCJOVExNX1Vua25vd24xIiwiTlRMTV9OZWdvdGlhdGUxMjgiLCJOVExNX05lZ290aWF0ZUtleUV4Y2hhbmdlIiwiTlRMTV9OZWdvdGlhdGU1NiIsImNyZWF0ZU5UTE1SZXF1ZXN0Iiwib3B0aW9ucyIsImRvbWFpbiIsImVzY2FwZSIsInRvVXBwZXJDYXNlIiwid29ya3N0YXRpb24iLCJ0eXBlMWZsYWdzIiwiZml4ZWREYXRhIiwiQnVmZmVyIiwiYWxsb2MiLCJidWZmZXJzIiwib2Zmc2V0Iiwid3JpdGUiLCJ3cml0ZVVJbnQ4Iiwid3JpdGVVSW50MzJMRSIsIndyaXRlVUludDE2TEUiLCJsZW5ndGgiLCJwdXNoIiwiZnJvbSIsImNvbmNhdCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9udGxtLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IE5UTE1GbGFncyA9IHtcbiAgTlRMTV9OZWdvdGlhdGVVbmljb2RlOiAweDAwMDAwMDAxLFxuICBOVExNX05lZ290aWF0ZU9FTTogMHgwMDAwMDAwMixcbiAgTlRMTV9SZXF1ZXN0VGFyZ2V0OiAweDAwMDAwMDA0LFxuICBOVExNX1Vua25vd245OiAweDAwMDAwMDA4LFxuICBOVExNX05lZ290aWF0ZVNpZ246IDB4MDAwMDAwMTAsXG4gIE5UTE1fTmVnb3RpYXRlU2VhbDogMHgwMDAwMDAyMCxcbiAgTlRMTV9OZWdvdGlhdGVEYXRhZ3JhbTogMHgwMDAwMDA0MCxcbiAgTlRMTV9OZWdvdGlhdGVMYW5NYW5hZ2VyS2V5OiAweDAwMDAwMDgwLFxuICBOVExNX1Vua25vd244OiAweDAwMDAwMTAwLFxuICBOVExNX05lZ290aWF0ZU5UTE06IDB4MDAwMDAyMDAsXG4gIE5UTE1fTmVnb3RpYXRlTlRPbmx5OiAweDAwMDAwNDAwLFxuICBOVExNX0Fub255bW91czogMHgwMDAwMDgwMCxcbiAgTlRMTV9OZWdvdGlhdGVPZW1Eb21haW5TdXBwbGllZDogMHgwMDAwMTAwMCxcbiAgTlRMTV9OZWdvdGlhdGVPZW1Xb3Jrc3RhdGlvblN1cHBsaWVkOiAweDAwMDAyMDAwLFxuICBOVExNX1Vua25vd242OiAweDAwMDA0MDAwLFxuICBOVExNX05lZ290aWF0ZUFsd2F5c1NpZ246IDB4MDAwMDgwMDAsXG4gIE5UTE1fVGFyZ2V0VHlwZURvbWFpbjogMHgwMDAxMDAwMCxcbiAgTlRMTV9UYXJnZXRUeXBlU2VydmVyOiAweDAwMDIwMDAwLFxuICBOVExNX1RhcmdldFR5cGVTaGFyZTogMHgwMDA0MDAwMCxcbiAgTlRMTV9OZWdvdGlhdGVFeHRlbmRlZFNlY3VyaXR5OiAweDAwMDgwMDAwLFxuICBOVExNX05lZ290aWF0ZUlkZW50aWZ5OiAweDAwMTAwMDAwLFxuICBOVExNX1Vua25vd241OiAweDAwMjAwMDAwLFxuICBOVExNX1JlcXVlc3ROb25OVFNlc3Npb25LZXk6IDB4MDA0MDAwMDAsXG4gIE5UTE1fTmVnb3RpYXRlVGFyZ2V0SW5mbzogMHgwMDgwMDAwMCxcbiAgTlRMTV9Vbmtub3duNDogMHgwMTAwMDAwMCxcbiAgTlRMTV9OZWdvdGlhdGVWZXJzaW9uOiAweDAyMDAwMDAwLFxuICBOVExNX1Vua25vd24zOiAweDA0MDAwMDAwLFxuICBOVExNX1Vua25vd24yOiAweDA4MDAwMDAwLFxuICBOVExNX1Vua25vd24xOiAweDEwMDAwMDAwLFxuICBOVExNX05lZ290aWF0ZTEyODogMHgyMDAwMDAwMCxcbiAgTlRMTV9OZWdvdGlhdGVLZXlFeGNoYW5nZTogMHg0MDAwMDAwMCxcbiAgTlRMTV9OZWdvdGlhdGU1NjogMHg4MDAwMDAwMFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU5UTE1SZXF1ZXN0KG9wdGlvbnM6IHsgZG9tYWluOiBzdHJpbmcsIHdvcmtzdGF0aW9uPzogc3RyaW5nIH0pIHtcbiAgY29uc3QgZG9tYWluID0gZXNjYXBlKG9wdGlvbnMuZG9tYWluLnRvVXBwZXJDYXNlKCkpO1xuICBjb25zdCB3b3Jrc3RhdGlvbiA9IG9wdGlvbnMud29ya3N0YXRpb24gPyBlc2NhcGUob3B0aW9ucy53b3Jrc3RhdGlvbi50b1VwcGVyQ2FzZSgpKSA6ICcnO1xuXG4gIGxldCB0eXBlMWZsYWdzID0gTlRMTUZsYWdzLk5UTE1fTmVnb3RpYXRlVW5pY29kZSArIE5UTE1GbGFncy5OVExNX05lZ290aWF0ZU9FTSArIE5UTE1GbGFncy5OVExNX1JlcXVlc3RUYXJnZXQgKyBOVExNRmxhZ3MuTlRMTV9OZWdvdGlhdGVOVExNICsgTlRMTUZsYWdzLk5UTE1fTmVnb3RpYXRlT2VtRG9tYWluU3VwcGxpZWQgKyBOVExNRmxhZ3MuTlRMTV9OZWdvdGlhdGVPZW1Xb3Jrc3RhdGlvblN1cHBsaWVkICsgTlRMTUZsYWdzLk5UTE1fTmVnb3RpYXRlQWx3YXlzU2lnbiArIE5UTE1GbGFncy5OVExNX05lZ290aWF0ZVZlcnNpb24gKyBOVExNRmxhZ3MuTlRMTV9OZWdvdGlhdGVFeHRlbmRlZFNlY3VyaXR5ICsgTlRMTUZsYWdzLk5UTE1fTmVnb3RpYXRlMTI4ICsgTlRMTUZsYWdzLk5UTE1fTmVnb3RpYXRlNTY7XG4gIGlmICh3b3Jrc3RhdGlvbiA9PT0gJycpIHtcbiAgICB0eXBlMWZsYWdzIC09IE5UTE1GbGFncy5OVExNX05lZ290aWF0ZU9lbVdvcmtzdGF0aW9uU3VwcGxpZWQ7XG4gIH1cblxuICBjb25zdCBmaXhlZERhdGEgPSBCdWZmZXIuYWxsb2MoNDApO1xuICBjb25zdCBidWZmZXJzID0gW2ZpeGVkRGF0YV07XG4gIGxldCBvZmZzZXQgPSAwO1xuXG4gIG9mZnNldCArPSBmaXhlZERhdGEud3JpdGUoJ05UTE1TU1AnLCBvZmZzZXQsIDcsICdhc2NpaScpO1xuICBvZmZzZXQgPSBmaXhlZERhdGEud3JpdGVVSW50OCgwLCBvZmZzZXQpO1xuICBvZmZzZXQgPSBmaXhlZERhdGEud3JpdGVVSW50MzJMRSgxLCBvZmZzZXQpO1xuICBvZmZzZXQgPSBmaXhlZERhdGEud3JpdGVVSW50MzJMRSh0eXBlMWZsYWdzLCBvZmZzZXQpO1xuICBvZmZzZXQgPSBmaXhlZERhdGEud3JpdGVVSW50MTZMRShkb21haW4ubGVuZ3RoLCBvZmZzZXQpO1xuICBvZmZzZXQgPSBmaXhlZERhdGEud3JpdGVVSW50MTZMRShkb21haW4ubGVuZ3RoLCBvZmZzZXQpO1xuICBvZmZzZXQgPSBmaXhlZERhdGEud3JpdGVVSW50MzJMRShmaXhlZERhdGEubGVuZ3RoICsgd29ya3N0YXRpb24ubGVuZ3RoLCBvZmZzZXQpO1xuICBvZmZzZXQgPSBmaXhlZERhdGEud3JpdGVVSW50MTZMRSh3b3Jrc3RhdGlvbi5sZW5ndGgsIG9mZnNldCk7XG4gIG9mZnNldCA9IGZpeGVkRGF0YS53cml0ZVVJbnQxNkxFKHdvcmtzdGF0aW9uLmxlbmd0aCwgb2Zmc2V0KTtcbiAgb2Zmc2V0ID0gZml4ZWREYXRhLndyaXRlVUludDMyTEUoZml4ZWREYXRhLmxlbmd0aCwgb2Zmc2V0KTtcbiAgb2Zmc2V0ID0gZml4ZWREYXRhLndyaXRlVUludDgoNSwgb2Zmc2V0KTtcbiAgb2Zmc2V0ID0gZml4ZWREYXRhLndyaXRlVUludDgoMCwgb2Zmc2V0KTtcbiAgb2Zmc2V0ID0gZml4ZWREYXRhLndyaXRlVUludDE2TEUoMjE5NSwgb2Zmc2V0KTtcbiAgb2Zmc2V0ID0gZml4ZWREYXRhLndyaXRlVUludDgoMCwgb2Zmc2V0KTtcbiAgb2Zmc2V0ID0gZml4ZWREYXRhLndyaXRlVUludDgoMCwgb2Zmc2V0KTtcbiAgb2Zmc2V0ID0gZml4ZWREYXRhLndyaXRlVUludDgoMCwgb2Zmc2V0KTtcbiAgZml4ZWREYXRhLndyaXRlVUludDgoMTUsIG9mZnNldCk7XG5cbiAgYnVmZmVycy5wdXNoKEJ1ZmZlci5mcm9tKHdvcmtzdGF0aW9uLCAnYXNjaWknKSk7XG4gIGJ1ZmZlcnMucHVzaChCdWZmZXIuZnJvbShkb21haW4sICdhc2NpaScpKTtcblxuICByZXR1cm4gQnVmZmVyLmNvbmNhdChidWZmZXJzKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsTUFBTUEsU0FBUyxHQUFHO0VBQ2hCQyxxQkFBcUIsRUFBRSxVQURQO0VBRWhCQyxpQkFBaUIsRUFBRSxVQUZIO0VBR2hCQyxrQkFBa0IsRUFBRSxVQUhKO0VBSWhCQyxhQUFhLEVBQUUsVUFKQztFQUtoQkMsa0JBQWtCLEVBQUUsVUFMSjtFQU1oQkMsa0JBQWtCLEVBQUUsVUFOSjtFQU9oQkMsc0JBQXNCLEVBQUUsVUFQUjtFQVFoQkMsMkJBQTJCLEVBQUUsVUFSYjtFQVNoQkMsYUFBYSxFQUFFLFVBVEM7RUFVaEJDLGtCQUFrQixFQUFFLFVBVko7RUFXaEJDLG9CQUFvQixFQUFFLFVBWE47RUFZaEJDLGNBQWMsRUFBRSxVQVpBO0VBYWhCQywrQkFBK0IsRUFBRSxVQWJqQjtFQWNoQkMsb0NBQW9DLEVBQUUsVUFkdEI7RUFlaEJDLGFBQWEsRUFBRSxVQWZDO0VBZ0JoQkMsd0JBQXdCLEVBQUUsVUFoQlY7RUFpQmhCQyxxQkFBcUIsRUFBRSxVQWpCUDtFQWtCaEJDLHFCQUFxQixFQUFFLFVBbEJQO0VBbUJoQkMsb0JBQW9CLEVBQUUsVUFuQk47RUFvQmhCQyw4QkFBOEIsRUFBRSxVQXBCaEI7RUFxQmhCQyxzQkFBc0IsRUFBRSxVQXJCUjtFQXNCaEJDLGFBQWEsRUFBRSxVQXRCQztFQXVCaEJDLDJCQUEyQixFQUFFLFVBdkJiO0VBd0JoQkMsd0JBQXdCLEVBQUUsVUF4QlY7RUF5QmhCQyxhQUFhLEVBQUUsVUF6QkM7RUEwQmhCQyxxQkFBcUIsRUFBRSxVQTFCUDtFQTJCaEJDLGFBQWEsRUFBRSxVQTNCQztFQTRCaEJDLGFBQWEsRUFBRSxVQTVCQztFQTZCaEJDLGFBQWEsRUFBRSxVQTdCQztFQThCaEJDLGlCQUFpQixFQUFFLFVBOUJIO0VBK0JoQkMseUJBQXlCLEVBQUUsVUEvQlg7RUFnQ2hCQyxnQkFBZ0IsRUFBRTtBQWhDRixDQUFsQjs7QUFtQ08sU0FBU0MsaUJBQVQsQ0FBMkJDLE9BQTNCLEVBQThFO0VBQ25GLE1BQU1DLE1BQU0sR0FBR0MsTUFBTSxDQUFDRixPQUFPLENBQUNDLE1BQVIsQ0FBZUUsV0FBZixFQUFELENBQXJCO0VBQ0EsTUFBTUMsV0FBVyxHQUFHSixPQUFPLENBQUNJLFdBQVIsR0FBc0JGLE1BQU0sQ0FBQ0YsT0FBTyxDQUFDSSxXQUFSLENBQW9CRCxXQUFwQixFQUFELENBQTVCLEdBQWtFLEVBQXRGO0VBRUEsSUFBSUUsVUFBVSxHQUFHdkMsU0FBUyxDQUFDQyxxQkFBVixHQUFrQ0QsU0FBUyxDQUFDRSxpQkFBNUMsR0FBZ0VGLFNBQVMsQ0FBQ0csa0JBQTFFLEdBQStGSCxTQUFTLENBQUNVLGtCQUF6RyxHQUE4SFYsU0FBUyxDQUFDYSwrQkFBeEksR0FBMEtiLFNBQVMsQ0FBQ2Msb0NBQXBMLEdBQTJOZCxTQUFTLENBQUNnQix3QkFBck8sR0FBZ1FoQixTQUFTLENBQUMwQixxQkFBMVEsR0FBa1MxQixTQUFTLENBQUNvQiw4QkFBNVMsR0FBNlVwQixTQUFTLENBQUM4QixpQkFBdlYsR0FBMlc5QixTQUFTLENBQUNnQyxnQkFBdFk7O0VBQ0EsSUFBSU0sV0FBVyxLQUFLLEVBQXBCLEVBQXdCO0lBQ3RCQyxVQUFVLElBQUl2QyxTQUFTLENBQUNjLG9DQUF4QjtFQUNEOztFQUVELE1BQU0wQixTQUFTLEdBQUdDLE1BQU0sQ0FBQ0MsS0FBUCxDQUFhLEVBQWIsQ0FBbEI7RUFDQSxNQUFNQyxPQUFPLEdBQUcsQ0FBQ0gsU0FBRCxDQUFoQjtFQUNBLElBQUlJLE1BQU0sR0FBRyxDQUFiO0VBRUFBLE1BQU0sSUFBSUosU0FBUyxDQUFDSyxLQUFWLENBQWdCLFNBQWhCLEVBQTJCRCxNQUEzQixFQUFtQyxDQUFuQyxFQUFzQyxPQUF0QyxDQUFWO0VBQ0FBLE1BQU0sR0FBR0osU0FBUyxDQUFDTSxVQUFWLENBQXFCLENBQXJCLEVBQXdCRixNQUF4QixDQUFUO0VBQ0FBLE1BQU0sR0FBR0osU0FBUyxDQUFDTyxhQUFWLENBQXdCLENBQXhCLEVBQTJCSCxNQUEzQixDQUFUO0VBQ0FBLE1BQU0sR0FBR0osU0FBUyxDQUFDTyxhQUFWLENBQXdCUixVQUF4QixFQUFvQ0ssTUFBcEMsQ0FBVDtFQUNBQSxNQUFNLEdBQUdKLFNBQVMsQ0FBQ1EsYUFBVixDQUF3QmIsTUFBTSxDQUFDYyxNQUEvQixFQUF1Q0wsTUFBdkMsQ0FBVDtFQUNBQSxNQUFNLEdBQUdKLFNBQVMsQ0FBQ1EsYUFBVixDQUF3QmIsTUFBTSxDQUFDYyxNQUEvQixFQUF1Q0wsTUFBdkMsQ0FBVDtFQUNBQSxNQUFNLEdBQUdKLFNBQVMsQ0FBQ08sYUFBVixDQUF3QlAsU0FBUyxDQUFDUyxNQUFWLEdBQW1CWCxXQUFXLENBQUNXLE1BQXZELEVBQStETCxNQUEvRCxDQUFUO0VBQ0FBLE1BQU0sR0FBR0osU0FBUyxDQUFDUSxhQUFWLENBQXdCVixXQUFXLENBQUNXLE1BQXBDLEVBQTRDTCxNQUE1QyxDQUFUO0VBQ0FBLE1BQU0sR0FBR0osU0FBUyxDQUFDUSxhQUFWLENBQXdCVixXQUFXLENBQUNXLE1BQXBDLEVBQTRDTCxNQUE1QyxDQUFUO0VBQ0FBLE1BQU0sR0FBR0osU0FBUyxDQUFDTyxhQUFWLENBQXdCUCxTQUFTLENBQUNTLE1BQWxDLEVBQTBDTCxNQUExQyxDQUFUO0VBQ0FBLE1BQU0sR0FBR0osU0FBUyxDQUFDTSxVQUFWLENBQXFCLENBQXJCLEVBQXdCRixNQUF4QixDQUFUO0VBQ0FBLE1BQU0sR0FBR0osU0FBUyxDQUFDTSxVQUFWLENBQXFCLENBQXJCLEVBQXdCRixNQUF4QixDQUFUO0VBQ0FBLE1BQU0sR0FBR0osU0FBUyxDQUFDUSxhQUFWLENBQXdCLElBQXhCLEVBQThCSixNQUE5QixDQUFUO0VBQ0FBLE1BQU0sR0FBR0osU0FBUyxDQUFDTSxVQUFWLENBQXFCLENBQXJCLEVBQXdCRixNQUF4QixDQUFUO0VBQ0FBLE1BQU0sR0FBR0osU0FBUyxDQUFDTSxVQUFWLENBQXFCLENBQXJCLEVBQXdCRixNQUF4QixDQUFUO0VBQ0FBLE1BQU0sR0FBR0osU0FBUyxDQUFDTSxVQUFWLENBQXFCLENBQXJCLEVBQXdCRixNQUF4QixDQUFUO0VBQ0FKLFNBQVMsQ0FBQ00sVUFBVixDQUFxQixFQUFyQixFQUF5QkYsTUFBekI7RUFFQUQsT0FBTyxDQUFDTyxJQUFSLENBQWFULE1BQU0sQ0FBQ1UsSUFBUCxDQUFZYixXQUFaLEVBQXlCLE9BQXpCLENBQWI7RUFDQUssT0FBTyxDQUFDTyxJQUFSLENBQWFULE1BQU0sQ0FBQ1UsSUFBUCxDQUFZaEIsTUFBWixFQUFvQixPQUFwQixDQUFiO0VBRUEsT0FBT00sTUFBTSxDQUFDVyxNQUFQLENBQWNULE9BQWQsQ0FBUDtBQUNEIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _bl = _interopRequireDefault(require("bl"));

var _stream = require("stream");

var _packet = require("./packet");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

class OutgoingMessageStream extends _stream.Duplex {
  constructor(debug, {
    packetSize
  }) {
    super({
      writableObjectMode: true
    });
    this.packetSize = void 0;
    this.debug = void 0;
    this.bl = void 0;
    this.currentMessage = void 0;
    this.packetSize = packetSize;
    this.debug = debug;
    this.bl = new _bl.default(); // When the writable side is ended, push `null`
    // to also end the readable side.

    this.on('finish', () => {
      this.push(null);
    });
  }

  _write(message, _encoding, callback) {
    const length = this.packetSize - _packet.HEADER_LENGTH;
    let packetNumber = 0;
    this.currentMessage = message;
    this.currentMessage.on('data', data => {
      if (message.ignore) {
        return;
      }

      this.bl.append(data);

      while (this.bl.length > length) {
        const data = this.bl.slice(0, length);
        this.bl.consume(length); // TODO: Get rid of creating `Packet` instances here.

        const packet = new _packet.Packet(message.type);
        packet.packetId(packetNumber += 1);
        packet.resetConnection(message.resetConnection);
        packet.addData(data);
        this.debug.packet('Sent', packet);
        this.debug.data(packet);

        if (this.push(packet.buffer) === false) {
          message.pause();
        }
      }
    });
    this.currentMessage.on('end', () => {
      const data = this.bl.slice();
      this.bl.consume(data.length); // TODO: Get rid of creating `Packet` instances here.

      const packet = new _packet.Packet(message.type);
      packet.packetId(packetNumber += 1);
      packet.resetConnection(message.resetConnection);
      packet.last(true);
      packet.ignore(message.ignore);
      packet.addData(data);
      this.debug.packet('Sent', packet);
      this.debug.data(packet);
      this.push(packet.buffer);
      this.currentMessage = undefined;
      callback();
    });
  }

  _read(_size) {
    // If we do have a message, resume it and get data flowing.
    // Otherwise, there is nothing to do.
    if (this.currentMessage) {
      this.currentMessage.resume();
    }
  }

}

var _default = OutgoingMessageStream;
exports.default = _default;
module.exports = OutgoingMessageStream;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPdXRnb2luZ01lc3NhZ2VTdHJlYW0iLCJEdXBsZXgiLCJjb25zdHJ1Y3RvciIsImRlYnVnIiwicGFja2V0U2l6ZSIsIndyaXRhYmxlT2JqZWN0TW9kZSIsImJsIiwiY3VycmVudE1lc3NhZ2UiLCJCdWZmZXJMaXN0Iiwib24iLCJwdXNoIiwiX3dyaXRlIiwibWVzc2FnZSIsIl9lbmNvZGluZyIsImNhbGxiYWNrIiwibGVuZ3RoIiwiSEVBREVSX0xFTkdUSCIsInBhY2tldE51bWJlciIsImRhdGEiLCJpZ25vcmUiLCJhcHBlbmQiLCJzbGljZSIsImNvbnN1bWUiLCJwYWNrZXQiLCJQYWNrZXQiLCJ0eXBlIiwicGFja2V0SWQiLCJyZXNldENvbm5lY3Rpb24iLCJhZGREYXRhIiwiYnVmZmVyIiwicGF1c2UiLCJsYXN0IiwidW5kZWZpbmVkIiwiX3JlYWQiLCJfc2l6ZSIsInJlc3VtZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi9zcmMvb3V0Z29pbmctbWVzc2FnZS1zdHJlYW0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJ1ZmZlckxpc3QgZnJvbSAnYmwnO1xuaW1wb3J0IHsgRHVwbGV4IH0gZnJvbSAnc3RyZWFtJztcblxuaW1wb3J0IERlYnVnIGZyb20gJy4vZGVidWcnO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSAnLi9tZXNzYWdlJztcbmltcG9ydCB7IFBhY2tldCwgSEVBREVSX0xFTkdUSCB9IGZyb20gJy4vcGFja2V0JztcblxuY2xhc3MgT3V0Z29pbmdNZXNzYWdlU3RyZWFtIGV4dGVuZHMgRHVwbGV4IHtcbiAgcGFja2V0U2l6ZTogbnVtYmVyO1xuICBkZWJ1ZzogRGVidWc7XG4gIGJsOiBhbnk7XG5cbiAgY3VycmVudE1lc3NhZ2U6IE1lc3NhZ2UgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoZGVidWc6IERlYnVnLCB7IHBhY2tldFNpemUgfTogeyBwYWNrZXRTaXplOiBudW1iZXIgfSkge1xuICAgIHN1cGVyKHsgd3JpdGFibGVPYmplY3RNb2RlOiB0cnVlIH0pO1xuXG4gICAgdGhpcy5wYWNrZXRTaXplID0gcGFja2V0U2l6ZTtcbiAgICB0aGlzLmRlYnVnID0gZGVidWc7XG4gICAgdGhpcy5ibCA9IG5ldyBCdWZmZXJMaXN0KCk7XG5cbiAgICAvLyBXaGVuIHRoZSB3cml0YWJsZSBzaWRlIGlzIGVuZGVkLCBwdXNoIGBudWxsYFxuICAgIC8vIHRvIGFsc28gZW5kIHRoZSByZWFkYWJsZSBzaWRlLlxuICAgIHRoaXMub24oJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgIHRoaXMucHVzaChudWxsKTtcbiAgICB9KTtcbiAgfVxuXG4gIF93cml0ZShtZXNzYWdlOiBNZXNzYWdlLCBfZW5jb2Rpbmc6IHN0cmluZywgY2FsbGJhY2s6IChlcnI/OiBFcnJvciB8IG51bGwpID0+IHZvaWQpIHtcbiAgICBjb25zdCBsZW5ndGggPSB0aGlzLnBhY2tldFNpemUgLSBIRUFERVJfTEVOR1RIO1xuICAgIGxldCBwYWNrZXROdW1iZXIgPSAwO1xuXG4gICAgdGhpcy5jdXJyZW50TWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5jdXJyZW50TWVzc2FnZS5vbignZGF0YScsIChkYXRhOiBCdWZmZXIpID0+IHtcbiAgICAgIGlmIChtZXNzYWdlLmlnbm9yZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYmwuYXBwZW5kKGRhdGEpO1xuXG4gICAgICB3aGlsZSAodGhpcy5ibC5sZW5ndGggPiBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuYmwuc2xpY2UoMCwgbGVuZ3RoKTtcbiAgICAgICAgdGhpcy5ibC5jb25zdW1lKGxlbmd0aCk7XG5cbiAgICAgICAgLy8gVE9ETzogR2V0IHJpZCBvZiBjcmVhdGluZyBgUGFja2V0YCBpbnN0YW5jZXMgaGVyZS5cbiAgICAgICAgY29uc3QgcGFja2V0ID0gbmV3IFBhY2tldChtZXNzYWdlLnR5cGUpO1xuICAgICAgICBwYWNrZXQucGFja2V0SWQocGFja2V0TnVtYmVyICs9IDEpO1xuICAgICAgICBwYWNrZXQucmVzZXRDb25uZWN0aW9uKG1lc3NhZ2UucmVzZXRDb25uZWN0aW9uKTtcbiAgICAgICAgcGFja2V0LmFkZERhdGEoZGF0YSk7XG5cbiAgICAgICAgdGhpcy5kZWJ1Zy5wYWNrZXQoJ1NlbnQnLCBwYWNrZXQpO1xuICAgICAgICB0aGlzLmRlYnVnLmRhdGEocGFja2V0KTtcblxuICAgICAgICBpZiAodGhpcy5wdXNoKHBhY2tldC5idWZmZXIpID09PSBmYWxzZSkge1xuICAgICAgICAgIG1lc3NhZ2UucGF1c2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5jdXJyZW50TWVzc2FnZS5vbignZW5kJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuYmwuc2xpY2UoKTtcbiAgICAgIHRoaXMuYmwuY29uc3VtZShkYXRhLmxlbmd0aCk7XG5cbiAgICAgIC8vIFRPRE86IEdldCByaWQgb2YgY3JlYXRpbmcgYFBhY2tldGAgaW5zdGFuY2VzIGhlcmUuXG4gICAgICBjb25zdCBwYWNrZXQgPSBuZXcgUGFja2V0KG1lc3NhZ2UudHlwZSk7XG4gICAgICBwYWNrZXQucGFja2V0SWQocGFja2V0TnVtYmVyICs9IDEpO1xuICAgICAgcGFja2V0LnJlc2V0Q29ubmVjdGlvbihtZXNzYWdlLnJlc2V0Q29ubmVjdGlvbik7XG4gICAgICBwYWNrZXQubGFzdCh0cnVlKTtcbiAgICAgIHBhY2tldC5pZ25vcmUobWVzc2FnZS5pZ25vcmUpO1xuICAgICAgcGFja2V0LmFkZERhdGEoZGF0YSk7XG5cbiAgICAgIHRoaXMuZGVidWcucGFja2V0KCdTZW50JywgcGFja2V0KTtcbiAgICAgIHRoaXMuZGVidWcuZGF0YShwYWNrZXQpO1xuXG4gICAgICB0aGlzLnB1c2gocGFja2V0LmJ1ZmZlcik7XG5cbiAgICAgIHRoaXMuY3VycmVudE1lc3NhZ2UgPSB1bmRlZmluZWQ7XG5cbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBfcmVhZChfc2l6ZTogbnVtYmVyKSB7XG4gICAgLy8gSWYgd2UgZG8gaGF2ZSBhIG1lc3NhZ2UsIHJlc3VtZSBpdCBhbmQgZ2V0IGRhdGEgZmxvd2luZy5cbiAgICAvLyBPdGhlcndpc2UsIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uXG4gICAgaWYgKHRoaXMuY3VycmVudE1lc3NhZ2UpIHtcbiAgICAgIHRoaXMuY3VycmVudE1lc3NhZ2UucmVzdW1lKCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE91dGdvaW5nTWVzc2FnZVN0cmVhbTtcbm1vZHVsZS5leHBvcnRzID0gT3V0Z29pbmdNZXNzYWdlU3RyZWFtO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBSUE7Ozs7QUFFQSxNQUFNQSxxQkFBTixTQUFvQ0MsY0FBcEMsQ0FBMkM7RUFPekNDLFdBQVcsQ0FBQ0MsS0FBRCxFQUFlO0lBQUVDO0VBQUYsQ0FBZixFQUF1RDtJQUNoRSxNQUFNO01BQUVDLGtCQUFrQixFQUFFO0lBQXRCLENBQU47SUFEZ0UsS0FObEVELFVBTWtFO0lBQUEsS0FMbEVELEtBS2tFO0lBQUEsS0FKbEVHLEVBSWtFO0lBQUEsS0FGbEVDLGNBRWtFO0lBR2hFLEtBQUtILFVBQUwsR0FBa0JBLFVBQWxCO0lBQ0EsS0FBS0QsS0FBTCxHQUFhQSxLQUFiO0lBQ0EsS0FBS0csRUFBTCxHQUFVLElBQUlFLFdBQUosRUFBVixDQUxnRSxDQU9oRTtJQUNBOztJQUNBLEtBQUtDLEVBQUwsQ0FBUSxRQUFSLEVBQWtCLE1BQU07TUFDdEIsS0FBS0MsSUFBTCxDQUFVLElBQVY7SUFDRCxDQUZEO0VBR0Q7O0VBRURDLE1BQU0sQ0FBQ0MsT0FBRCxFQUFtQkMsU0FBbkIsRUFBc0NDLFFBQXRDLEVBQThFO0lBQ2xGLE1BQU1DLE1BQU0sR0FBRyxLQUFLWCxVQUFMLEdBQWtCWSxxQkFBakM7SUFDQSxJQUFJQyxZQUFZLEdBQUcsQ0FBbkI7SUFFQSxLQUFLVixjQUFMLEdBQXNCSyxPQUF0QjtJQUNBLEtBQUtMLGNBQUwsQ0FBb0JFLEVBQXBCLENBQXVCLE1BQXZCLEVBQWdDUyxJQUFELElBQWtCO01BQy9DLElBQUlOLE9BQU8sQ0FBQ08sTUFBWixFQUFvQjtRQUNsQjtNQUNEOztNQUVELEtBQUtiLEVBQUwsQ0FBUWMsTUFBUixDQUFlRixJQUFmOztNQUVBLE9BQU8sS0FBS1osRUFBTCxDQUFRUyxNQUFSLEdBQWlCQSxNQUF4QixFQUFnQztRQUM5QixNQUFNRyxJQUFJLEdBQUcsS0FBS1osRUFBTCxDQUFRZSxLQUFSLENBQWMsQ0FBZCxFQUFpQk4sTUFBakIsQ0FBYjtRQUNBLEtBQUtULEVBQUwsQ0FBUWdCLE9BQVIsQ0FBZ0JQLE1BQWhCLEVBRjhCLENBSTlCOztRQUNBLE1BQU1RLE1BQU0sR0FBRyxJQUFJQyxjQUFKLENBQVdaLE9BQU8sQ0FBQ2EsSUFBbkIsQ0FBZjtRQUNBRixNQUFNLENBQUNHLFFBQVAsQ0FBZ0JULFlBQVksSUFBSSxDQUFoQztRQUNBTSxNQUFNLENBQUNJLGVBQVAsQ0FBdUJmLE9BQU8sQ0FBQ2UsZUFBL0I7UUFDQUosTUFBTSxDQUFDSyxPQUFQLENBQWVWLElBQWY7UUFFQSxLQUFLZixLQUFMLENBQVdvQixNQUFYLENBQWtCLE1BQWxCLEVBQTBCQSxNQUExQjtRQUNBLEtBQUtwQixLQUFMLENBQVdlLElBQVgsQ0FBZ0JLLE1BQWhCOztRQUVBLElBQUksS0FBS2IsSUFBTCxDQUFVYSxNQUFNLENBQUNNLE1BQWpCLE1BQTZCLEtBQWpDLEVBQXdDO1VBQ3RDakIsT0FBTyxDQUFDa0IsS0FBUjtRQUNEO01BQ0Y7SUFDRixDQXhCRDtJQTBCQSxLQUFLdkIsY0FBTCxDQUFvQkUsRUFBcEIsQ0FBdUIsS0FBdkIsRUFBOEIsTUFBTTtNQUNsQyxNQUFNUyxJQUFJLEdBQUcsS0FBS1osRUFBTCxDQUFRZSxLQUFSLEVBQWI7TUFDQSxLQUFLZixFQUFMLENBQVFnQixPQUFSLENBQWdCSixJQUFJLENBQUNILE1BQXJCLEVBRmtDLENBSWxDOztNQUNBLE1BQU1RLE1BQU0sR0FBRyxJQUFJQyxjQUFKLENBQVdaLE9BQU8sQ0FBQ2EsSUFBbkIsQ0FBZjtNQUNBRixNQUFNLENBQUNHLFFBQVAsQ0FBZ0JULFlBQVksSUFBSSxDQUFoQztNQUNBTSxNQUFNLENBQUNJLGVBQVAsQ0FBdUJmLE9BQU8sQ0FBQ2UsZUFBL0I7TUFDQUosTUFBTSxDQUFDUSxJQUFQLENBQVksSUFBWjtNQUNBUixNQUFNLENBQUNKLE1BQVAsQ0FBY1AsT0FBTyxDQUFDTyxNQUF0QjtNQUNBSSxNQUFNLENBQUNLLE9BQVAsQ0FBZVYsSUFBZjtNQUVBLEtBQUtmLEtBQUwsQ0FBV29CLE1BQVgsQ0FBa0IsTUFBbEIsRUFBMEJBLE1BQTFCO01BQ0EsS0FBS3BCLEtBQUwsQ0FBV2UsSUFBWCxDQUFnQkssTUFBaEI7TUFFQSxLQUFLYixJQUFMLENBQVVhLE1BQU0sQ0FBQ00sTUFBakI7TUFFQSxLQUFLdEIsY0FBTCxHQUFzQnlCLFNBQXRCO01BRUFsQixRQUFRO0lBQ1QsQ0FwQkQ7RUFxQkQ7O0VBRURtQixLQUFLLENBQUNDLEtBQUQsRUFBZ0I7SUFDbkI7SUFDQTtJQUNBLElBQUksS0FBSzNCLGNBQVQsRUFBeUI7TUFDdkIsS0FBS0EsY0FBTCxDQUFvQjRCLE1BQXBCO0lBQ0Q7RUFDRjs7QUFqRndDOztlQW9GNUJuQyxxQjs7QUFDZm9DLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQnJDLHFCQUFqQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.TYPE = exports.Packet = exports.OFFSET = exports.HEADER_LENGTH = void 0;
exports.isPacketComplete = isPacketComplete;
exports.packetLength = packetLength;

var _sprintfJs = require("sprintf-js");

const HEADER_LENGTH = 8;
exports.HEADER_LENGTH = HEADER_LENGTH;
const TYPE = {
  SQL_BATCH: 0x01,
  RPC_REQUEST: 0x03,
  TABULAR_RESULT: 0x04,
  ATTENTION: 0x06,
  BULK_LOAD: 0x07,
  TRANSACTION_MANAGER: 0x0E,
  LOGIN7: 0x10,
  NTLMAUTH_PKT: 0x11,
  PRELOGIN: 0x12,
  FEDAUTH_TOKEN: 0x08
};
exports.TYPE = TYPE;
const typeByValue = {};

for (const name in TYPE) {
  typeByValue[TYPE[name]] = name;
}

const STATUS = {
  NORMAL: 0x00,
  EOM: 0x01,
  IGNORE: 0x02,
  RESETCONNECTION: 0x08,
  RESETCONNECTIONSKIPTRAN: 0x10
};
const OFFSET = {
  Type: 0,
  Status: 1,
  Length: 2,
  SPID: 4,
  PacketID: 6,
  Window: 7
};
exports.OFFSET = OFFSET;
const DEFAULT_SPID = 0;
const DEFAULT_PACKETID = 1;
const DEFAULT_WINDOW = 0;
const NL = '\n';

class Packet {
  constructor(typeOrBuffer) {
    this.buffer = void 0;

    if (typeOrBuffer instanceof Buffer) {
      this.buffer = typeOrBuffer;
    } else {
      const type = typeOrBuffer;
      this.buffer = Buffer.alloc(HEADER_LENGTH, 0);
      this.buffer.writeUInt8(type, OFFSET.Type);
      this.buffer.writeUInt8(STATUS.NORMAL, OFFSET.Status);
      this.buffer.writeUInt16BE(DEFAULT_SPID, OFFSET.SPID);
      this.buffer.writeUInt8(DEFAULT_PACKETID, OFFSET.PacketID);
      this.buffer.writeUInt8(DEFAULT_WINDOW, OFFSET.Window);
      this.setLength();
    }
  }

  setLength() {
    this.buffer.writeUInt16BE(this.buffer.length, OFFSET.Length);
  }

  length() {
    return this.buffer.readUInt16BE(OFFSET.Length);
  }

  resetConnection(reset) {
    let status = this.buffer.readUInt8(OFFSET.Status);

    if (reset) {
      status |= STATUS.RESETCONNECTION;
    } else {
      status &= 0xFF - STATUS.RESETCONNECTION;
    }

    this.buffer.writeUInt8(status, OFFSET.Status);
  }

  last(last) {
    let status = this.buffer.readUInt8(OFFSET.Status);

    if (arguments.length > 0) {
      if (last) {
        status |= STATUS.EOM;
      } else {
        status &= 0xFF - STATUS.EOM;
      }

      this.buffer.writeUInt8(status, OFFSET.Status);
    }

    return this.isLast();
  }

  ignore(last) {
    let status = this.buffer.readUInt8(OFFSET.Status);

    if (last) {
      status |= STATUS.IGNORE;
    } else {
      status &= 0xFF - STATUS.IGNORE;
    }

    this.buffer.writeUInt8(status, OFFSET.Status);
  }

  isLast() {
    return !!(this.buffer.readUInt8(OFFSET.Status) & STATUS.EOM);
  }

  packetId(packetId) {
    if (packetId) {
      this.buffer.writeUInt8(packetId % 256, OFFSET.PacketID);
    }

    return this.buffer.readUInt8(OFFSET.PacketID);
  }

  addData(data) {
    this.buffer = Buffer.concat([this.buffer, data]);
    this.setLength();
    return this;
  }

  data() {
    return this.buffer.slice(HEADER_LENGTH);
  }

  type() {
    return this.buffer.readUInt8(OFFSET.Type);
  }

  statusAsString() {
    const status = this.buffer.readUInt8(OFFSET.Status);
    const statuses = [];

    for (const name in STATUS) {
      const value = STATUS[name];

      if (status & value) {
        statuses.push(name);
      } else {
        statuses.push(undefined);
      }
    }

    return statuses.join(' ').trim();
  }

  headerToString(indent = '') {
    const text = (0, _sprintfJs.sprintf)('type:0x%02X(%s), status:0x%02X(%s), length:0x%04X, spid:0x%04X, packetId:0x%02X, window:0x%02X', this.buffer.readUInt8(OFFSET.Type), typeByValue[this.buffer.readUInt8(OFFSET.Type)], this.buffer.readUInt8(OFFSET.Status), this.statusAsString(), this.buffer.readUInt16BE(OFFSET.Length), this.buffer.readUInt16BE(OFFSET.SPID), this.buffer.readUInt8(OFFSET.PacketID), this.buffer.readUInt8(OFFSET.Window));
    return indent + text;
  }

  dataToString(indent = '') {
    const BYTES_PER_GROUP = 0x04;
    const CHARS_PER_GROUP = 0x08;
    const BYTES_PER_LINE = 0x20;
    const data = this.data();
    let dataDump = '';
    let chars = '';

    for (let offset = 0; offset < data.length; offset++) {
      if (offset % BYTES_PER_LINE === 0) {
        dataDump += indent;
        dataDump += (0, _sprintfJs.sprintf)('%04X  ', offset);
      }

      if (data[offset] < 0x20 || data[offset] > 0x7E) {
        chars += '.';

        if ((offset + 1) % CHARS_PER_GROUP === 0 && !((offset + 1) % BYTES_PER_LINE === 0)) {
          chars += ' ';
        }
      } else {
        chars += String.fromCharCode(data[offset]);
      }

      if (data[offset] != null) {
        dataDump += (0, _sprintfJs.sprintf)('%02X', data[offset]);
      }

      if ((offset + 1) % BYTES_PER_GROUP === 0 && !((offset + 1) % BYTES_PER_LINE === 0)) {
        dataDump += ' ';
      }

      if ((offset + 1) % BYTES_PER_LINE === 0) {
        dataDump += '  ' + chars;
        chars = '';

        if (offset < data.length - 1) {
          dataDump += NL;
        }
      }
    }

    if (chars.length) {
      dataDump += '  ' + chars;
    }

    return dataDump;
  }

  toString(indent = '') {
    return this.headerToString(indent) + '\n' + this.dataToString(indent + indent);
  }

  payloadString() {
    return '';
  }

}

exports.Packet = Packet;

function isPacketComplete(potentialPacketBuffer) {
  if (potentialPacketBuffer.length < HEADER_LENGTH) {
    return false;
  } else {
    return potentialPacketBuffer.length >= potentialPacketBuffer.readUInt16BE(OFFSET.Length);
  }
}

function packetLength(potentialPacketBuffer) {
  return potentialPacketBuffer.readUInt16BE(OFFSET.Length);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJIRUFERVJfTEVOR1RIIiwiVFlQRSIsIlNRTF9CQVRDSCIsIlJQQ19SRVFVRVNUIiwiVEFCVUxBUl9SRVNVTFQiLCJBVFRFTlRJT04iLCJCVUxLX0xPQUQiLCJUUkFOU0FDVElPTl9NQU5BR0VSIiwiTE9HSU43IiwiTlRMTUFVVEhfUEtUIiwiUFJFTE9HSU4iLCJGRURBVVRIX1RPS0VOIiwidHlwZUJ5VmFsdWUiLCJuYW1lIiwiU1RBVFVTIiwiTk9STUFMIiwiRU9NIiwiSUdOT1JFIiwiUkVTRVRDT05ORUNUSU9OIiwiUkVTRVRDT05ORUNUSU9OU0tJUFRSQU4iLCJPRkZTRVQiLCJUeXBlIiwiU3RhdHVzIiwiTGVuZ3RoIiwiU1BJRCIsIlBhY2tldElEIiwiV2luZG93IiwiREVGQVVMVF9TUElEIiwiREVGQVVMVF9QQUNLRVRJRCIsIkRFRkFVTFRfV0lORE9XIiwiTkwiLCJQYWNrZXQiLCJjb25zdHJ1Y3RvciIsInR5cGVPckJ1ZmZlciIsImJ1ZmZlciIsIkJ1ZmZlciIsInR5cGUiLCJhbGxvYyIsIndyaXRlVUludDgiLCJ3cml0ZVVJbnQxNkJFIiwic2V0TGVuZ3RoIiwibGVuZ3RoIiwicmVhZFVJbnQxNkJFIiwicmVzZXRDb25uZWN0aW9uIiwicmVzZXQiLCJzdGF0dXMiLCJyZWFkVUludDgiLCJsYXN0IiwiYXJndW1lbnRzIiwiaXNMYXN0IiwiaWdub3JlIiwicGFja2V0SWQiLCJhZGREYXRhIiwiZGF0YSIsImNvbmNhdCIsInNsaWNlIiwic3RhdHVzQXNTdHJpbmciLCJzdGF0dXNlcyIsInZhbHVlIiwicHVzaCIsInVuZGVmaW5lZCIsImpvaW4iLCJ0cmltIiwiaGVhZGVyVG9TdHJpbmciLCJpbmRlbnQiLCJ0ZXh0IiwiZGF0YVRvU3RyaW5nIiwiQllURVNfUEVSX0dST1VQIiwiQ0hBUlNfUEVSX0dST1VQIiwiQllURVNfUEVSX0xJTkUiLCJkYXRhRHVtcCIsImNoYXJzIiwib2Zmc2V0IiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwidG9TdHJpbmciLCJwYXlsb2FkU3RyaW5nIiwiaXNQYWNrZXRDb21wbGV0ZSIsInBvdGVudGlhbFBhY2tldEJ1ZmZlciIsInBhY2tldExlbmd0aCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9wYWNrZXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3ByaW50ZiB9IGZyb20gJ3NwcmludGYtanMnO1xuXG5leHBvcnQgY29uc3QgSEVBREVSX0xFTkdUSCA9IDg7XG5cbmV4cG9ydCBjb25zdCBUWVBFOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge1xuICBTUUxfQkFUQ0g6IDB4MDEsXG4gIFJQQ19SRVFVRVNUOiAweDAzLFxuICBUQUJVTEFSX1JFU1VMVDogMHgwNCxcbiAgQVRURU5USU9OOiAweDA2LFxuICBCVUxLX0xPQUQ6IDB4MDcsXG4gIFRSQU5TQUNUSU9OX01BTkFHRVI6IDB4MEUsXG4gIExPR0lONzogMHgxMCxcbiAgTlRMTUFVVEhfUEtUOiAweDExLFxuICBQUkVMT0dJTjogMHgxMixcbiAgRkVEQVVUSF9UT0tFTjogMHgwOFxufTtcblxuY29uc3QgdHlwZUJ5VmFsdWU6IHsgW2tleTogbnVtYmVyXTogc3RyaW5nIH0gPSB7fTtcblxuZm9yIChjb25zdCBuYW1lIGluIFRZUEUpIHtcbiAgdHlwZUJ5VmFsdWVbVFlQRVtuYW1lXV0gPSBuYW1lO1xufVxuXG5jb25zdCBTVEFUVVM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7XG4gIE5PUk1BTDogMHgwMCxcbiAgRU9NOiAweDAxLFxuICBJR05PUkU6IDB4MDIsXG4gIFJFU0VUQ09OTkVDVElPTjogMHgwOCxcbiAgUkVTRVRDT05ORUNUSU9OU0tJUFRSQU46IDB4MTBcbn07XG5cbmV4cG9ydCBjb25zdCBPRkZTRVQgPSB7XG4gIFR5cGU6IDAsXG4gIFN0YXR1czogMSxcbiAgTGVuZ3RoOiAyLFxuICBTUElEOiA0LFxuICBQYWNrZXRJRDogNixcbiAgV2luZG93OiA3XG59O1xuXG5jb25zdCBERUZBVUxUX1NQSUQgPSAwO1xuXG5jb25zdCBERUZBVUxUX1BBQ0tFVElEID0gMTtcblxuY29uc3QgREVGQVVMVF9XSU5ET1cgPSAwO1xuXG5jb25zdCBOTCA9ICdcXG4nO1xuXG5leHBvcnQgY2xhc3MgUGFja2V0IHtcbiAgYnVmZmVyOiBCdWZmZXI7XG5cbiAgY29uc3RydWN0b3IodHlwZU9yQnVmZmVyOiBCdWZmZXIgfCBudW1iZXIpIHtcbiAgICBpZiAodHlwZU9yQnVmZmVyIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICB0aGlzLmJ1ZmZlciA9IHR5cGVPckJ1ZmZlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdHlwZSA9IHR5cGVPckJ1ZmZlcjtcbiAgICAgIHRoaXMuYnVmZmVyID0gQnVmZmVyLmFsbG9jKEhFQURFUl9MRU5HVEgsIDApO1xuICAgICAgdGhpcy5idWZmZXIud3JpdGVVSW50OCh0eXBlLCBPRkZTRVQuVHlwZSk7XG4gICAgICB0aGlzLmJ1ZmZlci53cml0ZVVJbnQ4KFNUQVRVUy5OT1JNQUwsIE9GRlNFVC5TdGF0dXMpO1xuICAgICAgdGhpcy5idWZmZXIud3JpdGVVSW50MTZCRShERUZBVUxUX1NQSUQsIE9GRlNFVC5TUElEKTtcbiAgICAgIHRoaXMuYnVmZmVyLndyaXRlVUludDgoREVGQVVMVF9QQUNLRVRJRCwgT0ZGU0VULlBhY2tldElEKTtcbiAgICAgIHRoaXMuYnVmZmVyLndyaXRlVUludDgoREVGQVVMVF9XSU5ET1csIE9GRlNFVC5XaW5kb3cpO1xuICAgICAgdGhpcy5zZXRMZW5ndGgoKTtcbiAgICB9XG4gIH1cblxuICBzZXRMZW5ndGgoKSB7XG4gICAgdGhpcy5idWZmZXIud3JpdGVVSW50MTZCRSh0aGlzLmJ1ZmZlci5sZW5ndGgsIE9GRlNFVC5MZW5ndGgpO1xuICB9XG5cbiAgbGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlci5yZWFkVUludDE2QkUoT0ZGU0VULkxlbmd0aCk7XG4gIH1cblxuICByZXNldENvbm5lY3Rpb24ocmVzZXQ6IGJvb2xlYW4pIHtcbiAgICBsZXQgc3RhdHVzID0gdGhpcy5idWZmZXIucmVhZFVJbnQ4KE9GRlNFVC5TdGF0dXMpO1xuICAgIGlmIChyZXNldCkge1xuICAgICAgc3RhdHVzIHw9IFNUQVRVUy5SRVNFVENPTk5FQ1RJT047XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXR1cyAmPSAweEZGIC0gU1RBVFVTLlJFU0VUQ09OTkVDVElPTjtcbiAgICB9XG4gICAgdGhpcy5idWZmZXIud3JpdGVVSW50OChzdGF0dXMsIE9GRlNFVC5TdGF0dXMpO1xuICB9XG5cbiAgbGFzdChsYXN0PzogYm9vbGVhbikge1xuICAgIGxldCBzdGF0dXMgPSB0aGlzLmJ1ZmZlci5yZWFkVUludDgoT0ZGU0VULlN0YXR1cyk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAobGFzdCkge1xuICAgICAgICBzdGF0dXMgfD0gU1RBVFVTLkVPTTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXR1cyAmPSAweEZGIC0gU1RBVFVTLkVPTTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYnVmZmVyLndyaXRlVUludDgoc3RhdHVzLCBPRkZTRVQuU3RhdHVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaXNMYXN0KCk7XG4gIH1cblxuICBpZ25vcmUobGFzdDogYm9vbGVhbikge1xuICAgIGxldCBzdGF0dXMgPSB0aGlzLmJ1ZmZlci5yZWFkVUludDgoT0ZGU0VULlN0YXR1cyk7XG4gICAgaWYgKGxhc3QpIHtcbiAgICAgIHN0YXR1cyB8PSBTVEFUVVMuSUdOT1JFO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0dXMgJj0gMHhGRiAtIFNUQVRVUy5JR05PUkU7XG4gICAgfVxuICAgIHRoaXMuYnVmZmVyLndyaXRlVUludDgoc3RhdHVzLCBPRkZTRVQuU3RhdHVzKTtcbiAgfVxuXG4gIGlzTGFzdCgpIHtcbiAgICByZXR1cm4gISEodGhpcy5idWZmZXIucmVhZFVJbnQ4KE9GRlNFVC5TdGF0dXMpICYgU1RBVFVTLkVPTSk7XG4gIH1cblxuICBwYWNrZXRJZChwYWNrZXRJZD86IG51bWJlcikge1xuICAgIGlmIChwYWNrZXRJZCkge1xuICAgICAgdGhpcy5idWZmZXIud3JpdGVVSW50OChwYWNrZXRJZCAlIDI1NiwgT0ZGU0VULlBhY2tldElEKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyLnJlYWRVSW50OChPRkZTRVQuUGFja2V0SUQpO1xuICB9XG5cbiAgYWRkRGF0YShkYXRhOiBCdWZmZXIpIHtcbiAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuYnVmZmVyLCBkYXRhXSk7XG4gICAgdGhpcy5zZXRMZW5ndGgoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyLnNsaWNlKEhFQURFUl9MRU5HVEgpO1xuICB9XG5cbiAgdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIucmVhZFVJbnQ4KE9GRlNFVC5UeXBlKTtcbiAgfVxuXG4gIHN0YXR1c0FzU3RyaW5nKCkge1xuICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMuYnVmZmVyLnJlYWRVSW50OChPRkZTRVQuU3RhdHVzKTtcbiAgICBjb25zdCBzdGF0dXNlcyA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBuYW1lIGluIFNUQVRVUykge1xuICAgICAgY29uc3QgdmFsdWUgPSBTVEFUVVNbbmFtZV07XG5cbiAgICAgIGlmIChzdGF0dXMgJiB2YWx1ZSkge1xuICAgICAgICBzdGF0dXNlcy5wdXNoKG5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdHVzZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdGF0dXNlcy5qb2luKCcgJykudHJpbSgpO1xuICB9XG5cbiAgaGVhZGVyVG9TdHJpbmcoaW5kZW50ID0gJycpIHtcbiAgICBjb25zdCB0ZXh0ID0gc3ByaW50ZigndHlwZToweCUwMlgoJXMpLCBzdGF0dXM6MHglMDJYKCVzKSwgbGVuZ3RoOjB4JTA0WCwgc3BpZDoweCUwNFgsIHBhY2tldElkOjB4JTAyWCwgd2luZG93OjB4JTAyWCcsIHRoaXMuYnVmZmVyLnJlYWRVSW50OChPRkZTRVQuVHlwZSksIHR5cGVCeVZhbHVlW3RoaXMuYnVmZmVyLnJlYWRVSW50OChPRkZTRVQuVHlwZSldLCB0aGlzLmJ1ZmZlci5yZWFkVUludDgoT0ZGU0VULlN0YXR1cyksIHRoaXMuc3RhdHVzQXNTdHJpbmcoKSwgdGhpcy5idWZmZXIucmVhZFVJbnQxNkJFKE9GRlNFVC5MZW5ndGgpLCB0aGlzLmJ1ZmZlci5yZWFkVUludDE2QkUoT0ZGU0VULlNQSUQpLCB0aGlzLmJ1ZmZlci5yZWFkVUludDgoT0ZGU0VULlBhY2tldElEKSwgdGhpcy5idWZmZXIucmVhZFVJbnQ4KE9GRlNFVC5XaW5kb3cpKTtcbiAgICByZXR1cm4gaW5kZW50ICsgdGV4dDtcbiAgfVxuXG4gIGRhdGFUb1N0cmluZyhpbmRlbnQgPSAnJykge1xuICAgIGNvbnN0IEJZVEVTX1BFUl9HUk9VUCA9IDB4MDQ7XG4gICAgY29uc3QgQ0hBUlNfUEVSX0dST1VQID0gMHgwODtcbiAgICBjb25zdCBCWVRFU19QRVJfTElORSA9IDB4MjA7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YSgpO1xuXG4gICAgbGV0IGRhdGFEdW1wID0gJyc7XG4gICAgbGV0IGNoYXJzID0gJyc7XG5cblxuICAgIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IGRhdGEubGVuZ3RoOyBvZmZzZXQrKykge1xuICAgICAgaWYgKG9mZnNldCAlIEJZVEVTX1BFUl9MSU5FID09PSAwKSB7XG4gICAgICAgIGRhdGFEdW1wICs9IGluZGVudDtcbiAgICAgICAgZGF0YUR1bXAgKz0gc3ByaW50ZignJTA0WCAgJywgb2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGFbb2Zmc2V0XSA8IDB4MjAgfHwgZGF0YVtvZmZzZXRdID4gMHg3RSkge1xuICAgICAgICBjaGFycyArPSAnLic7XG4gICAgICAgIGlmICgoKG9mZnNldCArIDEpICUgQ0hBUlNfUEVSX0dST1VQID09PSAwKSAmJiAhKChvZmZzZXQgKyAxKSAlIEJZVEVTX1BFUl9MSU5FID09PSAwKSkge1xuICAgICAgICAgIGNoYXJzICs9ICcgJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hhcnMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShkYXRhW29mZnNldF0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YVtvZmZzZXRdICE9IG51bGwpIHtcbiAgICAgICAgZGF0YUR1bXAgKz0gc3ByaW50ZignJTAyWCcsIGRhdGFbb2Zmc2V0XSk7XG4gICAgICB9XG5cbiAgICAgIGlmICgoKG9mZnNldCArIDEpICUgQllURVNfUEVSX0dST1VQID09PSAwKSAmJiAhKChvZmZzZXQgKyAxKSAlIEJZVEVTX1BFUl9MSU5FID09PSAwKSkge1xuICAgICAgICBkYXRhRHVtcCArPSAnICc7XG4gICAgICB9XG5cbiAgICAgIGlmICgob2Zmc2V0ICsgMSkgJSBCWVRFU19QRVJfTElORSA9PT0gMCkge1xuICAgICAgICBkYXRhRHVtcCArPSAnICAnICsgY2hhcnM7XG4gICAgICAgIGNoYXJzID0gJyc7XG4gICAgICAgIGlmIChvZmZzZXQgPCBkYXRhLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBkYXRhRHVtcCArPSBOTDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGFycy5sZW5ndGgpIHtcbiAgICAgIGRhdGFEdW1wICs9ICcgICcgKyBjaGFycztcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YUR1bXA7XG4gIH1cblxuICB0b1N0cmluZyhpbmRlbnQgPSAnJykge1xuICAgIHJldHVybiB0aGlzLmhlYWRlclRvU3RyaW5nKGluZGVudCkgKyAnXFxuJyArIHRoaXMuZGF0YVRvU3RyaW5nKGluZGVudCArIGluZGVudCk7XG4gIH1cblxuICBwYXlsb2FkU3RyaW5nKCkge1xuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQYWNrZXRDb21wbGV0ZShwb3RlbnRpYWxQYWNrZXRCdWZmZXI6IEJ1ZmZlcikge1xuICBpZiAocG90ZW50aWFsUGFja2V0QnVmZmVyLmxlbmd0aCA8IEhFQURFUl9MRU5HVEgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHBvdGVudGlhbFBhY2tldEJ1ZmZlci5sZW5ndGggPj0gcG90ZW50aWFsUGFja2V0QnVmZmVyLnJlYWRVSW50MTZCRShPRkZTRVQuTGVuZ3RoKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFja2V0TGVuZ3RoKHBvdGVudGlhbFBhY2tldEJ1ZmZlcjogQnVmZmVyKSB7XG4gIHJldHVybiBwb3RlbnRpYWxQYWNrZXRCdWZmZXIucmVhZFVJbnQxNkJFKE9GRlNFVC5MZW5ndGgpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFFTyxNQUFNQSxhQUFhLEdBQUcsQ0FBdEI7O0FBRUEsTUFBTUMsSUFBK0IsR0FBRztFQUM3Q0MsU0FBUyxFQUFFLElBRGtDO0VBRTdDQyxXQUFXLEVBQUUsSUFGZ0M7RUFHN0NDLGNBQWMsRUFBRSxJQUg2QjtFQUk3Q0MsU0FBUyxFQUFFLElBSmtDO0VBSzdDQyxTQUFTLEVBQUUsSUFMa0M7RUFNN0NDLG1CQUFtQixFQUFFLElBTndCO0VBTzdDQyxNQUFNLEVBQUUsSUFQcUM7RUFRN0NDLFlBQVksRUFBRSxJQVIrQjtFQVM3Q0MsUUFBUSxFQUFFLElBVG1DO0VBVTdDQyxhQUFhLEVBQUU7QUFWOEIsQ0FBeEM7O0FBYVAsTUFBTUMsV0FBc0MsR0FBRyxFQUEvQzs7QUFFQSxLQUFLLE1BQU1DLElBQVgsSUFBbUJaLElBQW5CLEVBQXlCO0VBQ3ZCVyxXQUFXLENBQUNYLElBQUksQ0FBQ1ksSUFBRCxDQUFMLENBQVgsR0FBMEJBLElBQTFCO0FBQ0Q7O0FBRUQsTUFBTUMsTUFBaUMsR0FBRztFQUN4Q0MsTUFBTSxFQUFFLElBRGdDO0VBRXhDQyxHQUFHLEVBQUUsSUFGbUM7RUFHeENDLE1BQU0sRUFBRSxJQUhnQztFQUl4Q0MsZUFBZSxFQUFFLElBSnVCO0VBS3hDQyx1QkFBdUIsRUFBRTtBQUxlLENBQTFDO0FBUU8sTUFBTUMsTUFBTSxHQUFHO0VBQ3BCQyxJQUFJLEVBQUUsQ0FEYztFQUVwQkMsTUFBTSxFQUFFLENBRlk7RUFHcEJDLE1BQU0sRUFBRSxDQUhZO0VBSXBCQyxJQUFJLEVBQUUsQ0FKYztFQUtwQkMsUUFBUSxFQUFFLENBTFU7RUFNcEJDLE1BQU0sRUFBRTtBQU5ZLENBQWY7O0FBU1AsTUFBTUMsWUFBWSxHQUFHLENBQXJCO0FBRUEsTUFBTUMsZ0JBQWdCLEdBQUcsQ0FBekI7QUFFQSxNQUFNQyxjQUFjLEdBQUcsQ0FBdkI7QUFFQSxNQUFNQyxFQUFFLEdBQUcsSUFBWDs7QUFFTyxNQUFNQyxNQUFOLENBQWE7RUFHbEJDLFdBQVcsQ0FBQ0MsWUFBRCxFQUFnQztJQUFBLEtBRjNDQyxNQUUyQzs7SUFDekMsSUFBSUQsWUFBWSxZQUFZRSxNQUE1QixFQUFvQztNQUNsQyxLQUFLRCxNQUFMLEdBQWNELFlBQWQ7SUFDRCxDQUZELE1BRU87TUFDTCxNQUFNRyxJQUFJLEdBQUdILFlBQWI7TUFDQSxLQUFLQyxNQUFMLEdBQWNDLE1BQU0sQ0FBQ0UsS0FBUCxDQUFhckMsYUFBYixFQUE0QixDQUE1QixDQUFkO01BQ0EsS0FBS2tDLE1BQUwsQ0FBWUksVUFBWixDQUF1QkYsSUFBdkIsRUFBNkJoQixNQUFNLENBQUNDLElBQXBDO01BQ0EsS0FBS2EsTUFBTCxDQUFZSSxVQUFaLENBQXVCeEIsTUFBTSxDQUFDQyxNQUE5QixFQUFzQ0ssTUFBTSxDQUFDRSxNQUE3QztNQUNBLEtBQUtZLE1BQUwsQ0FBWUssYUFBWixDQUEwQlosWUFBMUIsRUFBd0NQLE1BQU0sQ0FBQ0ksSUFBL0M7TUFDQSxLQUFLVSxNQUFMLENBQVlJLFVBQVosQ0FBdUJWLGdCQUF2QixFQUF5Q1IsTUFBTSxDQUFDSyxRQUFoRDtNQUNBLEtBQUtTLE1BQUwsQ0FBWUksVUFBWixDQUF1QlQsY0FBdkIsRUFBdUNULE1BQU0sQ0FBQ00sTUFBOUM7TUFDQSxLQUFLYyxTQUFMO0lBQ0Q7RUFDRjs7RUFFREEsU0FBUyxHQUFHO0lBQ1YsS0FBS04sTUFBTCxDQUFZSyxhQUFaLENBQTBCLEtBQUtMLE1BQUwsQ0FBWU8sTUFBdEMsRUFBOENyQixNQUFNLENBQUNHLE1BQXJEO0VBQ0Q7O0VBRURrQixNQUFNLEdBQUc7SUFDUCxPQUFPLEtBQUtQLE1BQUwsQ0FBWVEsWUFBWixDQUF5QnRCLE1BQU0sQ0FBQ0csTUFBaEMsQ0FBUDtFQUNEOztFQUVEb0IsZUFBZSxDQUFDQyxLQUFELEVBQWlCO0lBQzlCLElBQUlDLE1BQU0sR0FBRyxLQUFLWCxNQUFMLENBQVlZLFNBQVosQ0FBc0IxQixNQUFNLENBQUNFLE1BQTdCLENBQWI7O0lBQ0EsSUFBSXNCLEtBQUosRUFBVztNQUNUQyxNQUFNLElBQUkvQixNQUFNLENBQUNJLGVBQWpCO0lBQ0QsQ0FGRCxNQUVPO01BQ0wyQixNQUFNLElBQUksT0FBTy9CLE1BQU0sQ0FBQ0ksZUFBeEI7SUFDRDs7SUFDRCxLQUFLZ0IsTUFBTCxDQUFZSSxVQUFaLENBQXVCTyxNQUF2QixFQUErQnpCLE1BQU0sQ0FBQ0UsTUFBdEM7RUFDRDs7RUFFRHlCLElBQUksQ0FBQ0EsSUFBRCxFQUFpQjtJQUNuQixJQUFJRixNQUFNLEdBQUcsS0FBS1gsTUFBTCxDQUFZWSxTQUFaLENBQXNCMUIsTUFBTSxDQUFDRSxNQUE3QixDQUFiOztJQUNBLElBQUkwQixTQUFTLENBQUNQLE1BQVYsR0FBbUIsQ0FBdkIsRUFBMEI7TUFDeEIsSUFBSU0sSUFBSixFQUFVO1FBQ1JGLE1BQU0sSUFBSS9CLE1BQU0sQ0FBQ0UsR0FBakI7TUFDRCxDQUZELE1BRU87UUFDTDZCLE1BQU0sSUFBSSxPQUFPL0IsTUFBTSxDQUFDRSxHQUF4QjtNQUNEOztNQUNELEtBQUtrQixNQUFMLENBQVlJLFVBQVosQ0FBdUJPLE1BQXZCLEVBQStCekIsTUFBTSxDQUFDRSxNQUF0QztJQUNEOztJQUNELE9BQU8sS0FBSzJCLE1BQUwsRUFBUDtFQUNEOztFQUVEQyxNQUFNLENBQUNILElBQUQsRUFBZ0I7SUFDcEIsSUFBSUYsTUFBTSxHQUFHLEtBQUtYLE1BQUwsQ0FBWVksU0FBWixDQUFzQjFCLE1BQU0sQ0FBQ0UsTUFBN0IsQ0FBYjs7SUFDQSxJQUFJeUIsSUFBSixFQUFVO01BQ1JGLE1BQU0sSUFBSS9CLE1BQU0sQ0FBQ0csTUFBakI7SUFDRCxDQUZELE1BRU87TUFDTDRCLE1BQU0sSUFBSSxPQUFPL0IsTUFBTSxDQUFDRyxNQUF4QjtJQUNEOztJQUNELEtBQUtpQixNQUFMLENBQVlJLFVBQVosQ0FBdUJPLE1BQXZCLEVBQStCekIsTUFBTSxDQUFDRSxNQUF0QztFQUNEOztFQUVEMkIsTUFBTSxHQUFHO0lBQ1AsT0FBTyxDQUFDLEVBQUUsS0FBS2YsTUFBTCxDQUFZWSxTQUFaLENBQXNCMUIsTUFBTSxDQUFDRSxNQUE3QixJQUF1Q1IsTUFBTSxDQUFDRSxHQUFoRCxDQUFSO0VBQ0Q7O0VBRURtQyxRQUFRLENBQUNBLFFBQUQsRUFBb0I7SUFDMUIsSUFBSUEsUUFBSixFQUFjO01BQ1osS0FBS2pCLE1BQUwsQ0FBWUksVUFBWixDQUF1QmEsUUFBUSxHQUFHLEdBQWxDLEVBQXVDL0IsTUFBTSxDQUFDSyxRQUE5QztJQUNEOztJQUNELE9BQU8sS0FBS1MsTUFBTCxDQUFZWSxTQUFaLENBQXNCMUIsTUFBTSxDQUFDSyxRQUE3QixDQUFQO0VBQ0Q7O0VBRUQyQixPQUFPLENBQUNDLElBQUQsRUFBZTtJQUNwQixLQUFLbkIsTUFBTCxHQUFjQyxNQUFNLENBQUNtQixNQUFQLENBQWMsQ0FBQyxLQUFLcEIsTUFBTixFQUFjbUIsSUFBZCxDQUFkLENBQWQ7SUFDQSxLQUFLYixTQUFMO0lBQ0EsT0FBTyxJQUFQO0VBQ0Q7O0VBRURhLElBQUksR0FBRztJQUNMLE9BQU8sS0FBS25CLE1BQUwsQ0FBWXFCLEtBQVosQ0FBa0J2RCxhQUFsQixDQUFQO0VBQ0Q7O0VBRURvQyxJQUFJLEdBQUc7SUFDTCxPQUFPLEtBQUtGLE1BQUwsQ0FBWVksU0FBWixDQUFzQjFCLE1BQU0sQ0FBQ0MsSUFBN0IsQ0FBUDtFQUNEOztFQUVEbUMsY0FBYyxHQUFHO0lBQ2YsTUFBTVgsTUFBTSxHQUFHLEtBQUtYLE1BQUwsQ0FBWVksU0FBWixDQUFzQjFCLE1BQU0sQ0FBQ0UsTUFBN0IsQ0FBZjtJQUNBLE1BQU1tQyxRQUFRLEdBQUcsRUFBakI7O0lBRUEsS0FBSyxNQUFNNUMsSUFBWCxJQUFtQkMsTUFBbkIsRUFBMkI7TUFDekIsTUFBTTRDLEtBQUssR0FBRzVDLE1BQU0sQ0FBQ0QsSUFBRCxDQUFwQjs7TUFFQSxJQUFJZ0MsTUFBTSxHQUFHYSxLQUFiLEVBQW9CO1FBQ2xCRCxRQUFRLENBQUNFLElBQVQsQ0FBYzlDLElBQWQ7TUFDRCxDQUZELE1BRU87UUFDTDRDLFFBQVEsQ0FBQ0UsSUFBVCxDQUFjQyxTQUFkO01BQ0Q7SUFDRjs7SUFFRCxPQUFPSCxRQUFRLENBQUNJLElBQVQsQ0FBYyxHQUFkLEVBQW1CQyxJQUFuQixFQUFQO0VBQ0Q7O0VBRURDLGNBQWMsQ0FBQ0MsTUFBTSxHQUFHLEVBQVYsRUFBYztJQUMxQixNQUFNQyxJQUFJLEdBQUcsd0JBQVEsZ0dBQVIsRUFBMEcsS0FBSy9CLE1BQUwsQ0FBWVksU0FBWixDQUFzQjFCLE1BQU0sQ0FBQ0MsSUFBN0IsQ0FBMUcsRUFBOElULFdBQVcsQ0FBQyxLQUFLc0IsTUFBTCxDQUFZWSxTQUFaLENBQXNCMUIsTUFBTSxDQUFDQyxJQUE3QixDQUFELENBQXpKLEVBQStMLEtBQUthLE1BQUwsQ0FBWVksU0FBWixDQUFzQjFCLE1BQU0sQ0FBQ0UsTUFBN0IsQ0FBL0wsRUFBcU8sS0FBS2tDLGNBQUwsRUFBck8sRUFBNFAsS0FBS3RCLE1BQUwsQ0FBWVEsWUFBWixDQUF5QnRCLE1BQU0sQ0FBQ0csTUFBaEMsQ0FBNVAsRUFBcVMsS0FBS1csTUFBTCxDQUFZUSxZQUFaLENBQXlCdEIsTUFBTSxDQUFDSSxJQUFoQyxDQUFyUyxFQUE0VSxLQUFLVSxNQUFMLENBQVlZLFNBQVosQ0FBc0IxQixNQUFNLENBQUNLLFFBQTdCLENBQTVVLEVBQW9YLEtBQUtTLE1BQUwsQ0FBWVksU0FBWixDQUFzQjFCLE1BQU0sQ0FBQ00sTUFBN0IsQ0FBcFgsQ0FBYjtJQUNBLE9BQU9zQyxNQUFNLEdBQUdDLElBQWhCO0VBQ0Q7O0VBRURDLFlBQVksQ0FBQ0YsTUFBTSxHQUFHLEVBQVYsRUFBYztJQUN4QixNQUFNRyxlQUFlLEdBQUcsSUFBeEI7SUFDQSxNQUFNQyxlQUFlLEdBQUcsSUFBeEI7SUFDQSxNQUFNQyxjQUFjLEdBQUcsSUFBdkI7SUFDQSxNQUFNaEIsSUFBSSxHQUFHLEtBQUtBLElBQUwsRUFBYjtJQUVBLElBQUlpQixRQUFRLEdBQUcsRUFBZjtJQUNBLElBQUlDLEtBQUssR0FBRyxFQUFaOztJQUdBLEtBQUssSUFBSUMsTUFBTSxHQUFHLENBQWxCLEVBQXFCQSxNQUFNLEdBQUduQixJQUFJLENBQUNaLE1BQW5DLEVBQTJDK0IsTUFBTSxFQUFqRCxFQUFxRDtNQUNuRCxJQUFJQSxNQUFNLEdBQUdILGNBQVQsS0FBNEIsQ0FBaEMsRUFBbUM7UUFDakNDLFFBQVEsSUFBSU4sTUFBWjtRQUNBTSxRQUFRLElBQUksd0JBQVEsUUFBUixFQUFrQkUsTUFBbEIsQ0FBWjtNQUNEOztNQUVELElBQUluQixJQUFJLENBQUNtQixNQUFELENBQUosR0FBZSxJQUFmLElBQXVCbkIsSUFBSSxDQUFDbUIsTUFBRCxDQUFKLEdBQWUsSUFBMUMsRUFBZ0Q7UUFDOUNELEtBQUssSUFBSSxHQUFUOztRQUNBLElBQUssQ0FBQ0MsTUFBTSxHQUFHLENBQVYsSUFBZUosZUFBZixLQUFtQyxDQUFwQyxJQUEwQyxFQUFFLENBQUNJLE1BQU0sR0FBRyxDQUFWLElBQWVILGNBQWYsS0FBa0MsQ0FBcEMsQ0FBOUMsRUFBc0Y7VUFDcEZFLEtBQUssSUFBSSxHQUFUO1FBQ0Q7TUFDRixDQUxELE1BS087UUFDTEEsS0FBSyxJQUFJRSxNQUFNLENBQUNDLFlBQVAsQ0FBb0JyQixJQUFJLENBQUNtQixNQUFELENBQXhCLENBQVQ7TUFDRDs7TUFFRCxJQUFJbkIsSUFBSSxDQUFDbUIsTUFBRCxDQUFKLElBQWdCLElBQXBCLEVBQTBCO1FBQ3hCRixRQUFRLElBQUksd0JBQVEsTUFBUixFQUFnQmpCLElBQUksQ0FBQ21CLE1BQUQsQ0FBcEIsQ0FBWjtNQUNEOztNQUVELElBQUssQ0FBQ0EsTUFBTSxHQUFHLENBQVYsSUFBZUwsZUFBZixLQUFtQyxDQUFwQyxJQUEwQyxFQUFFLENBQUNLLE1BQU0sR0FBRyxDQUFWLElBQWVILGNBQWYsS0FBa0MsQ0FBcEMsQ0FBOUMsRUFBc0Y7UUFDcEZDLFFBQVEsSUFBSSxHQUFaO01BQ0Q7O01BRUQsSUFBSSxDQUFDRSxNQUFNLEdBQUcsQ0FBVixJQUFlSCxjQUFmLEtBQWtDLENBQXRDLEVBQXlDO1FBQ3ZDQyxRQUFRLElBQUksT0FBT0MsS0FBbkI7UUFDQUEsS0FBSyxHQUFHLEVBQVI7O1FBQ0EsSUFBSUMsTUFBTSxHQUFHbkIsSUFBSSxDQUFDWixNQUFMLEdBQWMsQ0FBM0IsRUFBOEI7VUFDNUI2QixRQUFRLElBQUl4QyxFQUFaO1FBQ0Q7TUFDRjtJQUNGOztJQUVELElBQUl5QyxLQUFLLENBQUM5QixNQUFWLEVBQWtCO01BQ2hCNkIsUUFBUSxJQUFJLE9BQU9DLEtBQW5CO0lBQ0Q7O0lBRUQsT0FBT0QsUUFBUDtFQUNEOztFQUVESyxRQUFRLENBQUNYLE1BQU0sR0FBRyxFQUFWLEVBQWM7SUFDcEIsT0FBTyxLQUFLRCxjQUFMLENBQW9CQyxNQUFwQixJQUE4QixJQUE5QixHQUFxQyxLQUFLRSxZQUFMLENBQWtCRixNQUFNLEdBQUdBLE1BQTNCLENBQTVDO0VBQ0Q7O0VBRURZLGFBQWEsR0FBRztJQUNkLE9BQU8sRUFBUDtFQUNEOztBQWpLaUI7Ozs7QUFvS2IsU0FBU0MsZ0JBQVQsQ0FBMEJDLHFCQUExQixFQUF5RDtFQUM5RCxJQUFJQSxxQkFBcUIsQ0FBQ3JDLE1BQXRCLEdBQStCekMsYUFBbkMsRUFBa0Q7SUFDaEQsT0FBTyxLQUFQO0VBQ0QsQ0FGRCxNQUVPO0lBQ0wsT0FBTzhFLHFCQUFxQixDQUFDckMsTUFBdEIsSUFBZ0NxQyxxQkFBcUIsQ0FBQ3BDLFlBQXRCLENBQW1DdEIsTUFBTSxDQUFDRyxNQUExQyxDQUF2QztFQUNEO0FBQ0Y7O0FBRU0sU0FBU3dELFlBQVQsQ0FBc0JELHFCQUF0QixFQUFxRDtFQUMxRCxPQUFPQSxxQkFBcUIsQ0FBQ3BDLFlBQXRCLENBQW1DdEIsTUFBTSxDQUFDRyxNQUExQyxDQUFQO0FBQ0QifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _sprintfJs = require("sprintf-js");

var _writableTrackingBuffer = _interopRequireDefault(require("./tracking-buffer/writable-tracking-buffer"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const optionBufferSize = 20;
const TOKEN = {
  VERSION: 0x00,
  ENCRYPTION: 0x01,
  INSTOPT: 0x02,
  THREADID: 0x03,
  MARS: 0x04,
  FEDAUTHREQUIRED: 0x06,
  TERMINATOR: 0xFF
};
const ENCRYPT = {
  OFF: 0x00,
  ON: 0x01,
  NOT_SUP: 0x02,
  REQ: 0x03
};
const encryptByValue = {};

for (const name in ENCRYPT) {
  const value = ENCRYPT[name];
  encryptByValue[value] = name;
}

const MARS = {
  OFF: 0x00,
  ON: 0x01
};
const marsByValue = {};

for (const name in MARS) {
  const value = MARS[name];
  marsByValue[value] = name;
}

/*
  s2.2.6.4
 */
class PreloginPayload {
  constructor(bufferOrOptions = {
    encrypt: false,
    version: {
      major: 0,
      minor: 0,
      build: 0,
      subbuild: 0
    }
  }) {
    this.data = void 0;
    this.options = void 0;
    this.version = void 0;
    this.encryption = void 0;
    this.encryptionString = void 0;
    this.instance = void 0;
    this.threadId = void 0;
    this.mars = void 0;
    this.marsString = void 0;
    this.fedAuthRequired = void 0;

    if (bufferOrOptions instanceof Buffer) {
      this.data = bufferOrOptions;
      this.options = {
        encrypt: false,
        version: {
          major: 0,
          minor: 0,
          build: 0,
          subbuild: 0
        }
      };
    } else {
      this.options = bufferOrOptions;
      this.createOptions();
    }

    this.extractOptions();
  }

  createOptions() {
    const options = [this.createVersionOption(), this.createEncryptionOption(), this.createInstanceOption(), this.createThreadIdOption(), this.createMarsOption(), this.createFedAuthOption()];
    let length = 0;

    for (let i = 0, len = options.length; i < len; i++) {
      const option = options[i];
      length += 5 + option.data.length;
    }

    length++; // terminator

    this.data = Buffer.alloc(length, 0);
    let optionOffset = 0;
    let optionDataOffset = 5 * options.length + 1;

    for (let j = 0, len = options.length; j < len; j++) {
      const option = options[j];
      this.data.writeUInt8(option.token, optionOffset + 0);
      this.data.writeUInt16BE(optionDataOffset, optionOffset + 1);
      this.data.writeUInt16BE(option.data.length, optionOffset + 3);
      optionOffset += 5;
      option.data.copy(this.data, optionDataOffset);
      optionDataOffset += option.data.length;
    }

    this.data.writeUInt8(TOKEN.TERMINATOR, optionOffset);
  }

  createVersionOption() {
    const buffer = new _writableTrackingBuffer.default(optionBufferSize);
    buffer.writeUInt8(this.options.version.major);
    buffer.writeUInt8(this.options.version.minor);
    buffer.writeUInt16BE(this.options.version.build);
    buffer.writeUInt16BE(this.options.version.subbuild);
    return {
      token: TOKEN.VERSION,
      data: buffer.data
    };
  }

  createEncryptionOption() {
    const buffer = new _writableTrackingBuffer.default(optionBufferSize);

    if (this.options.encrypt) {
      buffer.writeUInt8(ENCRYPT.ON);
    } else {
      buffer.writeUInt8(ENCRYPT.NOT_SUP);
    }

    return {
      token: TOKEN.ENCRYPTION,
      data: buffer.data
    };
  }

  createInstanceOption() {
    const buffer = new _writableTrackingBuffer.default(optionBufferSize);
    buffer.writeUInt8(0x00);
    return {
      token: TOKEN.INSTOPT,
      data: buffer.data
    };
  }

  createThreadIdOption() {
    const buffer = new _writableTrackingBuffer.default(optionBufferSize);
    buffer.writeUInt32BE(0x00);
    return {
      token: TOKEN.THREADID,
      data: buffer.data
    };
  }

  createMarsOption() {
    const buffer = new _writableTrackingBuffer.default(optionBufferSize);
    buffer.writeUInt8(MARS.OFF);
    return {
      token: TOKEN.MARS,
      data: buffer.data
    };
  }

  createFedAuthOption() {
    const buffer = new _writableTrackingBuffer.default(optionBufferSize);
    buffer.writeUInt8(0x01);
    return {
      token: TOKEN.FEDAUTHREQUIRED,
      data: buffer.data
    };
  }

  extractOptions() {
    let offset = 0;

    while (this.data[offset] !== TOKEN.TERMINATOR) {
      let dataOffset = this.data.readUInt16BE(offset + 1);
      const dataLength = this.data.readUInt16BE(offset + 3);

      switch (this.data[offset]) {
        case TOKEN.VERSION:
          this.extractVersion(dataOffset);
          break;

        case TOKEN.ENCRYPTION:
          this.extractEncryption(dataOffset);
          break;

        case TOKEN.INSTOPT:
          this.extractInstance(dataOffset);
          break;

        case TOKEN.THREADID:
          if (dataLength > 0) {
            this.extractThreadId(dataOffset);
          }

          break;

        case TOKEN.MARS:
          this.extractMars(dataOffset);
          break;

        case TOKEN.FEDAUTHREQUIRED:
          this.extractFedAuth(dataOffset);
          break;
      }

      offset += 5;
      dataOffset += dataLength;
    }
  }

  extractVersion(offset) {
    this.version = {
      major: this.data.readUInt8(offset + 0),
      minor: this.data.readUInt8(offset + 1),
      build: this.data.readUInt16BE(offset + 2),
      subbuild: this.data.readUInt16BE(offset + 4)
    };
  }

  extractEncryption(offset) {
    this.encryption = this.data.readUInt8(offset);
    this.encryptionString = encryptByValue[this.encryption];
  }

  extractInstance(offset) {
    this.instance = this.data.readUInt8(offset);
  }

  extractThreadId(offset) {
    this.threadId = this.data.readUInt32BE(offset);
  }

  extractMars(offset) {
    this.mars = this.data.readUInt8(offset);
    this.marsString = marsByValue[this.mars];
  }

  extractFedAuth(offset) {
    this.fedAuthRequired = this.data.readUInt8(offset);
  }

  toString(indent = '') {
    return indent + 'PreLogin - ' + (0, _sprintfJs.sprintf)('version:%d.%d.%d.%d, encryption:0x%02X(%s), instopt:0x%02X, threadId:0x%08X, mars:0x%02X(%s)', this.version.major, this.version.minor, this.version.build, this.version.subbuild, this.encryption ? this.encryption : 0, this.encryptionString ? this.encryptionString : '', this.instance ? this.instance : 0, this.threadId ? this.threadId : 0, this.mars ? this.mars : 0, this.marsString ? this.marsString : '');
  }

}

var _default = PreloginPayload;
exports.default = _default;
module.exports = PreloginPayload;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJvcHRpb25CdWZmZXJTaXplIiwiVE9LRU4iLCJWRVJTSU9OIiwiRU5DUllQVElPTiIsIklOU1RPUFQiLCJUSFJFQURJRCIsIk1BUlMiLCJGRURBVVRIUkVRVUlSRUQiLCJURVJNSU5BVE9SIiwiRU5DUllQVCIsIk9GRiIsIk9OIiwiTk9UX1NVUCIsIlJFUSIsImVuY3J5cHRCeVZhbHVlIiwibmFtZSIsInZhbHVlIiwibWFyc0J5VmFsdWUiLCJQcmVsb2dpblBheWxvYWQiLCJjb25zdHJ1Y3RvciIsImJ1ZmZlck9yT3B0aW9ucyIsImVuY3J5cHQiLCJ2ZXJzaW9uIiwibWFqb3IiLCJtaW5vciIsImJ1aWxkIiwic3ViYnVpbGQiLCJkYXRhIiwib3B0aW9ucyIsImVuY3J5cHRpb24iLCJlbmNyeXB0aW9uU3RyaW5nIiwiaW5zdGFuY2UiLCJ0aHJlYWRJZCIsIm1hcnMiLCJtYXJzU3RyaW5nIiwiZmVkQXV0aFJlcXVpcmVkIiwiQnVmZmVyIiwiY3JlYXRlT3B0aW9ucyIsImV4dHJhY3RPcHRpb25zIiwiY3JlYXRlVmVyc2lvbk9wdGlvbiIsImNyZWF0ZUVuY3J5cHRpb25PcHRpb24iLCJjcmVhdGVJbnN0YW5jZU9wdGlvbiIsImNyZWF0ZVRocmVhZElkT3B0aW9uIiwiY3JlYXRlTWFyc09wdGlvbiIsImNyZWF0ZUZlZEF1dGhPcHRpb24iLCJsZW5ndGgiLCJpIiwibGVuIiwib3B0aW9uIiwiYWxsb2MiLCJvcHRpb25PZmZzZXQiLCJvcHRpb25EYXRhT2Zmc2V0IiwiaiIsIndyaXRlVUludDgiLCJ0b2tlbiIsIndyaXRlVUludDE2QkUiLCJjb3B5IiwiYnVmZmVyIiwiV3JpdGFibGVUcmFja2luZ0J1ZmZlciIsIndyaXRlVUludDMyQkUiLCJvZmZzZXQiLCJkYXRhT2Zmc2V0IiwicmVhZFVJbnQxNkJFIiwiZGF0YUxlbmd0aCIsImV4dHJhY3RWZXJzaW9uIiwiZXh0cmFjdEVuY3J5cHRpb24iLCJleHRyYWN0SW5zdGFuY2UiLCJleHRyYWN0VGhyZWFkSWQiLCJleHRyYWN0TWFycyIsImV4dHJhY3RGZWRBdXRoIiwicmVhZFVJbnQ4IiwicmVhZFVJbnQzMkJFIiwidG9TdHJpbmciLCJpbmRlbnQiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL3ByZWxvZ2luLXBheWxvYWQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3ByaW50ZiB9IGZyb20gJ3NwcmludGYtanMnO1xuXG5pbXBvcnQgV3JpdGFibGVUcmFja2luZ0J1ZmZlciBmcm9tICcuL3RyYWNraW5nLWJ1ZmZlci93cml0YWJsZS10cmFja2luZy1idWZmZXInO1xuXG5jb25zdCBvcHRpb25CdWZmZXJTaXplID0gMjA7XG5cbmNvbnN0IFRPS0VOID0ge1xuICBWRVJTSU9OOiAweDAwLFxuICBFTkNSWVBUSU9OOiAweDAxLFxuICBJTlNUT1BUOiAweDAyLFxuICBUSFJFQURJRDogMHgwMyxcbiAgTUFSUzogMHgwNCxcbiAgRkVEQVVUSFJFUVVJUkVEOiAweDA2LFxuICBURVJNSU5BVE9SOiAweEZGXG59O1xuXG5jb25zdCBFTkNSWVBUOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge1xuICBPRkY6IDB4MDAsXG4gIE9OOiAweDAxLFxuICBOT1RfU1VQOiAweDAyLFxuICBSRVE6IDB4MDNcbn07XG5cbmNvbnN0IGVuY3J5cHRCeVZhbHVlOiB7IFtrZXk6IG51bWJlcl06IHN0cmluZyB9ID0ge307XG5cbmZvciAoY29uc3QgbmFtZSBpbiBFTkNSWVBUKSB7XG4gIGNvbnN0IHZhbHVlID0gRU5DUllQVFtuYW1lXTtcbiAgZW5jcnlwdEJ5VmFsdWVbdmFsdWVdID0gbmFtZTtcbn1cblxuY29uc3QgTUFSUzogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHtcbiAgT0ZGOiAweDAwLFxuICBPTjogMHgwMVxufTtcblxuY29uc3QgbWFyc0J5VmFsdWU6IHsgW2tleTogbnVtYmVyXTogc3RyaW5nIH0gPSB7fTtcblxuZm9yIChjb25zdCBuYW1lIGluIE1BUlMpIHtcbiAgY29uc3QgdmFsdWUgPSBNQVJTW25hbWVdO1xuICBtYXJzQnlWYWx1ZVt2YWx1ZV0gPSBuYW1lO1xufVxuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gIGVuY3J5cHQ6IGJvb2xlYW47XG4gIHZlcnNpb246IHtcbiAgICBtYWpvcjogbnVtYmVyO1xuICAgIG1pbm9yOiBudW1iZXI7XG4gICAgYnVpbGQ6IG51bWJlcjtcbiAgICBzdWJidWlsZDogbnVtYmVyO1xuICB9O1xufVxuXG4vKlxuICBzMi4yLjYuNFxuICovXG5jbGFzcyBQcmVsb2dpblBheWxvYWQge1xuICBkYXRhITogQnVmZmVyO1xuICBvcHRpb25zOiBPcHRpb25zO1xuXG4gIHZlcnNpb24hOiB7XG4gICAgbWFqb3I6IG51bWJlcjtcbiAgICBtaW5vcjogbnVtYmVyO1xuICAgIGJ1aWxkOiBudW1iZXI7XG4gICAgc3ViYnVpbGQ6IG51bWJlcjtcbiAgfTtcblxuICBlbmNyeXB0aW9uITogbnVtYmVyO1xuICBlbmNyeXB0aW9uU3RyaW5nITogc3RyaW5nO1xuXG4gIGluc3RhbmNlITogbnVtYmVyO1xuXG4gIHRocmVhZElkITogbnVtYmVyO1xuXG4gIG1hcnMhOiBudW1iZXI7XG4gIG1hcnNTdHJpbmchOiBzdHJpbmc7XG4gIGZlZEF1dGhSZXF1aXJlZCE6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihidWZmZXJPck9wdGlvbnM6IEJ1ZmZlciB8IE9wdGlvbnMgPSB7IGVuY3J5cHQ6IGZhbHNlLCB2ZXJzaW9uOiB7IG1ham9yOiAwLCBtaW5vcjogMCwgYnVpbGQ6IDAsIHN1YmJ1aWxkOiAwIH0gfSkge1xuICAgIGlmIChidWZmZXJPck9wdGlvbnMgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICAgIHRoaXMuZGF0YSA9IGJ1ZmZlck9yT3B0aW9ucztcbiAgICAgIHRoaXMub3B0aW9ucyA9IHsgZW5jcnlwdDogZmFsc2UsIHZlcnNpb246IHsgbWFqb3I6IDAsIG1pbm9yOiAwLCBidWlsZDogMCwgc3ViYnVpbGQ6IDAgfSB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wdGlvbnMgPSBidWZmZXJPck9wdGlvbnM7XG4gICAgICB0aGlzLmNyZWF0ZU9wdGlvbnMoKTtcbiAgICB9XG4gICAgdGhpcy5leHRyYWN0T3B0aW9ucygpO1xuICB9XG5cbiAgY3JlYXRlT3B0aW9ucygpIHtcbiAgICBjb25zdCBvcHRpb25zID0gW1xuICAgICAgdGhpcy5jcmVhdGVWZXJzaW9uT3B0aW9uKCksXG4gICAgICB0aGlzLmNyZWF0ZUVuY3J5cHRpb25PcHRpb24oKSxcbiAgICAgIHRoaXMuY3JlYXRlSW5zdGFuY2VPcHRpb24oKSxcbiAgICAgIHRoaXMuY3JlYXRlVGhyZWFkSWRPcHRpb24oKSxcbiAgICAgIHRoaXMuY3JlYXRlTWFyc09wdGlvbigpLFxuICAgICAgdGhpcy5jcmVhdGVGZWRBdXRoT3B0aW9uKClcbiAgICBdO1xuXG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IG9wdGlvbnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IG9wdGlvbnNbaV07XG4gICAgICBsZW5ndGggKz0gNSArIG9wdGlvbi5kYXRhLmxlbmd0aDtcbiAgICB9XG4gICAgbGVuZ3RoKys7IC8vIHRlcm1pbmF0b3JcbiAgICB0aGlzLmRhdGEgPSBCdWZmZXIuYWxsb2MobGVuZ3RoLCAwKTtcbiAgICBsZXQgb3B0aW9uT2Zmc2V0ID0gMDtcbiAgICBsZXQgb3B0aW9uRGF0YU9mZnNldCA9IDUgKiBvcHRpb25zLmxlbmd0aCArIDE7XG5cbiAgICBmb3IgKGxldCBqID0gMCwgbGVuID0gb3B0aW9ucy5sZW5ndGg7IGogPCBsZW47IGorKykge1xuICAgICAgY29uc3Qgb3B0aW9uID0gb3B0aW9uc1tqXTtcbiAgICAgIHRoaXMuZGF0YS53cml0ZVVJbnQ4KG9wdGlvbi50b2tlbiwgb3B0aW9uT2Zmc2V0ICsgMCk7XG4gICAgICB0aGlzLmRhdGEud3JpdGVVSW50MTZCRShvcHRpb25EYXRhT2Zmc2V0LCBvcHRpb25PZmZzZXQgKyAxKTtcbiAgICAgIHRoaXMuZGF0YS53cml0ZVVJbnQxNkJFKG9wdGlvbi5kYXRhLmxlbmd0aCwgb3B0aW9uT2Zmc2V0ICsgMyk7XG4gICAgICBvcHRpb25PZmZzZXQgKz0gNTtcbiAgICAgIG9wdGlvbi5kYXRhLmNvcHkodGhpcy5kYXRhLCBvcHRpb25EYXRhT2Zmc2V0KTtcbiAgICAgIG9wdGlvbkRhdGFPZmZzZXQgKz0gb3B0aW9uLmRhdGEubGVuZ3RoO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YS53cml0ZVVJbnQ4KFRPS0VOLlRFUk1JTkFUT1IsIG9wdGlvbk9mZnNldCk7XG4gIH1cblxuICBjcmVhdGVWZXJzaW9uT3B0aW9uKCkge1xuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBXcml0YWJsZVRyYWNraW5nQnVmZmVyKG9wdGlvbkJ1ZmZlclNpemUpO1xuICAgIGJ1ZmZlci53cml0ZVVJbnQ4KHRoaXMub3B0aW9ucy52ZXJzaW9uLm1ham9yKTtcbiAgICBidWZmZXIud3JpdGVVSW50OCh0aGlzLm9wdGlvbnMudmVyc2lvbi5taW5vcik7XG4gICAgYnVmZmVyLndyaXRlVUludDE2QkUodGhpcy5vcHRpb25zLnZlcnNpb24uYnVpbGQpO1xuICAgIGJ1ZmZlci53cml0ZVVJbnQxNkJFKHRoaXMub3B0aW9ucy52ZXJzaW9uLnN1YmJ1aWxkKTtcbiAgICByZXR1cm4ge1xuICAgICAgdG9rZW46IFRPS0VOLlZFUlNJT04sXG4gICAgICBkYXRhOiBidWZmZXIuZGF0YVxuICAgIH07XG4gIH1cblxuICBjcmVhdGVFbmNyeXB0aW9uT3B0aW9uKCkge1xuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBXcml0YWJsZVRyYWNraW5nQnVmZmVyKG9wdGlvbkJ1ZmZlclNpemUpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZW5jcnlwdCkge1xuICAgICAgYnVmZmVyLndyaXRlVUludDgoRU5DUllQVC5PTik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1ZmZlci53cml0ZVVJbnQ4KEVOQ1JZUFQuTk9UX1NVUCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0b2tlbjogVE9LRU4uRU5DUllQVElPTixcbiAgICAgIGRhdGE6IGJ1ZmZlci5kYXRhXG4gICAgfTtcbiAgfVxuXG4gIGNyZWF0ZUluc3RhbmNlT3B0aW9uKCkge1xuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBXcml0YWJsZVRyYWNraW5nQnVmZmVyKG9wdGlvbkJ1ZmZlclNpemUpO1xuICAgIGJ1ZmZlci53cml0ZVVJbnQ4KDB4MDApO1xuICAgIHJldHVybiB7XG4gICAgICB0b2tlbjogVE9LRU4uSU5TVE9QVCxcbiAgICAgIGRhdGE6IGJ1ZmZlci5kYXRhXG4gICAgfTtcbiAgfVxuXG4gIGNyZWF0ZVRocmVhZElkT3B0aW9uKCkge1xuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBXcml0YWJsZVRyYWNraW5nQnVmZmVyKG9wdGlvbkJ1ZmZlclNpemUpO1xuICAgIGJ1ZmZlci53cml0ZVVJbnQzMkJFKDB4MDApO1xuICAgIHJldHVybiB7XG4gICAgICB0b2tlbjogVE9LRU4uVEhSRUFESUQsXG4gICAgICBkYXRhOiBidWZmZXIuZGF0YVxuICAgIH07XG4gIH1cblxuICBjcmVhdGVNYXJzT3B0aW9uKCkge1xuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBXcml0YWJsZVRyYWNraW5nQnVmZmVyKG9wdGlvbkJ1ZmZlclNpemUpO1xuICAgIGJ1ZmZlci53cml0ZVVJbnQ4KE1BUlMuT0ZGKTtcbiAgICByZXR1cm4ge1xuICAgICAgdG9rZW46IFRPS0VOLk1BUlMsXG4gICAgICBkYXRhOiBidWZmZXIuZGF0YVxuICAgIH07XG4gIH1cblxuICBjcmVhdGVGZWRBdXRoT3B0aW9uKCkge1xuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBXcml0YWJsZVRyYWNraW5nQnVmZmVyKG9wdGlvbkJ1ZmZlclNpemUpO1xuICAgIGJ1ZmZlci53cml0ZVVJbnQ4KDB4MDEpO1xuICAgIHJldHVybiB7XG4gICAgICB0b2tlbjogVE9LRU4uRkVEQVVUSFJFUVVJUkVELFxuICAgICAgZGF0YTogYnVmZmVyLmRhdGFcbiAgICB9O1xuICB9XG5cbiAgZXh0cmFjdE9wdGlvbnMoKSB7XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgd2hpbGUgKHRoaXMuZGF0YVtvZmZzZXRdICE9PSBUT0tFTi5URVJNSU5BVE9SKSB7XG4gICAgICBsZXQgZGF0YU9mZnNldCA9IHRoaXMuZGF0YS5yZWFkVUludDE2QkUob2Zmc2V0ICsgMSk7XG4gICAgICBjb25zdCBkYXRhTGVuZ3RoID0gdGhpcy5kYXRhLnJlYWRVSW50MTZCRShvZmZzZXQgKyAzKTtcbiAgICAgIHN3aXRjaCAodGhpcy5kYXRhW29mZnNldF0pIHtcbiAgICAgICAgY2FzZSBUT0tFTi5WRVJTSU9OOlxuICAgICAgICAgIHRoaXMuZXh0cmFjdFZlcnNpb24oZGF0YU9mZnNldCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVE9LRU4uRU5DUllQVElPTjpcbiAgICAgICAgICB0aGlzLmV4dHJhY3RFbmNyeXB0aW9uKGRhdGFPZmZzZXQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRPS0VOLklOU1RPUFQ6XG4gICAgICAgICAgdGhpcy5leHRyYWN0SW5zdGFuY2UoZGF0YU9mZnNldCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVE9LRU4uVEhSRUFESUQ6XG4gICAgICAgICAgaWYgKGRhdGFMZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmV4dHJhY3RUaHJlYWRJZChkYXRhT2Zmc2V0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVE9LRU4uTUFSUzpcbiAgICAgICAgICB0aGlzLmV4dHJhY3RNYXJzKGRhdGFPZmZzZXQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRPS0VOLkZFREFVVEhSRVFVSVJFRDpcbiAgICAgICAgICB0aGlzLmV4dHJhY3RGZWRBdXRoKGRhdGFPZmZzZXQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgb2Zmc2V0ICs9IDU7XG4gICAgICBkYXRhT2Zmc2V0ICs9IGRhdGFMZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgZXh0cmFjdFZlcnNpb24ob2Zmc2V0OiBudW1iZXIpIHtcbiAgICB0aGlzLnZlcnNpb24gPSB7XG4gICAgICBtYWpvcjogdGhpcy5kYXRhLnJlYWRVSW50OChvZmZzZXQgKyAwKSxcbiAgICAgIG1pbm9yOiB0aGlzLmRhdGEucmVhZFVJbnQ4KG9mZnNldCArIDEpLFxuICAgICAgYnVpbGQ6IHRoaXMuZGF0YS5yZWFkVUludDE2QkUob2Zmc2V0ICsgMiksXG4gICAgICBzdWJidWlsZDogdGhpcy5kYXRhLnJlYWRVSW50MTZCRShvZmZzZXQgKyA0KVxuICAgIH07XG4gIH1cblxuICBleHRyYWN0RW5jcnlwdGlvbihvZmZzZXQ6IG51bWJlcikge1xuICAgIHRoaXMuZW5jcnlwdGlvbiA9IHRoaXMuZGF0YS5yZWFkVUludDgob2Zmc2V0KTtcbiAgICB0aGlzLmVuY3J5cHRpb25TdHJpbmcgPSBlbmNyeXB0QnlWYWx1ZVt0aGlzLmVuY3J5cHRpb25dO1xuICB9XG5cbiAgZXh0cmFjdEluc3RhbmNlKG9mZnNldDogbnVtYmVyKSB7XG4gICAgdGhpcy5pbnN0YW5jZSA9IHRoaXMuZGF0YS5yZWFkVUludDgob2Zmc2V0KTtcbiAgfVxuXG4gIGV4dHJhY3RUaHJlYWRJZChvZmZzZXQ6IG51bWJlcikge1xuICAgIHRoaXMudGhyZWFkSWQgPSB0aGlzLmRhdGEucmVhZFVJbnQzMkJFKG9mZnNldCk7XG4gIH1cblxuICBleHRyYWN0TWFycyhvZmZzZXQ6IG51bWJlcikge1xuICAgIHRoaXMubWFycyA9IHRoaXMuZGF0YS5yZWFkVUludDgob2Zmc2V0KTtcbiAgICB0aGlzLm1hcnNTdHJpbmcgPSBtYXJzQnlWYWx1ZVt0aGlzLm1hcnNdO1xuICB9XG5cbiAgZXh0cmFjdEZlZEF1dGgob2Zmc2V0OiBudW1iZXIpIHtcbiAgICB0aGlzLmZlZEF1dGhSZXF1aXJlZCA9IHRoaXMuZGF0YS5yZWFkVUludDgob2Zmc2V0KTtcbiAgfVxuXG4gIHRvU3RyaW5nKGluZGVudCA9ICcnKSB7XG4gICAgcmV0dXJuIGluZGVudCArICdQcmVMb2dpbiAtICcgKyBzcHJpbnRmKFxuICAgICAgJ3ZlcnNpb246JWQuJWQuJWQuJWQsIGVuY3J5cHRpb246MHglMDJYKCVzKSwgaW5zdG9wdDoweCUwMlgsIHRocmVhZElkOjB4JTA4WCwgbWFyczoweCUwMlgoJXMpJyxcbiAgICAgIHRoaXMudmVyc2lvbi5tYWpvciwgdGhpcy52ZXJzaW9uLm1pbm9yLCB0aGlzLnZlcnNpb24uYnVpbGQsIHRoaXMudmVyc2lvbi5zdWJidWlsZCxcbiAgICAgIHRoaXMuZW5jcnlwdGlvbiA/IHRoaXMuZW5jcnlwdGlvbiA6IDAsXG4gICAgICB0aGlzLmVuY3J5cHRpb25TdHJpbmcgPyB0aGlzLmVuY3J5cHRpb25TdHJpbmcgOiAnJyxcbiAgICAgIHRoaXMuaW5zdGFuY2UgPyB0aGlzLmluc3RhbmNlIDogMCxcbiAgICAgIHRoaXMudGhyZWFkSWQgPyB0aGlzLnRocmVhZElkIDogMCxcbiAgICAgIHRoaXMubWFycyA/IHRoaXMubWFycyA6IDAsXG4gICAgICB0aGlzLm1hcnNTdHJpbmcgPyB0aGlzLm1hcnNTdHJpbmcgOiAnJ1xuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUHJlbG9naW5QYXlsb2FkO1xubW9kdWxlLmV4cG9ydHMgPSBQcmVsb2dpblBheWxvYWQ7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFFQTs7OztBQUVBLE1BQU1BLGdCQUFnQixHQUFHLEVBQXpCO0FBRUEsTUFBTUMsS0FBSyxHQUFHO0VBQ1pDLE9BQU8sRUFBRSxJQURHO0VBRVpDLFVBQVUsRUFBRSxJQUZBO0VBR1pDLE9BQU8sRUFBRSxJQUhHO0VBSVpDLFFBQVEsRUFBRSxJQUpFO0VBS1pDLElBQUksRUFBRSxJQUxNO0VBTVpDLGVBQWUsRUFBRSxJQU5MO0VBT1pDLFVBQVUsRUFBRTtBQVBBLENBQWQ7QUFVQSxNQUFNQyxPQUFrQyxHQUFHO0VBQ3pDQyxHQUFHLEVBQUUsSUFEb0M7RUFFekNDLEVBQUUsRUFBRSxJQUZxQztFQUd6Q0MsT0FBTyxFQUFFLElBSGdDO0VBSXpDQyxHQUFHLEVBQUU7QUFKb0MsQ0FBM0M7QUFPQSxNQUFNQyxjQUF5QyxHQUFHLEVBQWxEOztBQUVBLEtBQUssTUFBTUMsSUFBWCxJQUFtQk4sT0FBbkIsRUFBNEI7RUFDMUIsTUFBTU8sS0FBSyxHQUFHUCxPQUFPLENBQUNNLElBQUQsQ0FBckI7RUFDQUQsY0FBYyxDQUFDRSxLQUFELENBQWQsR0FBd0JELElBQXhCO0FBQ0Q7O0FBRUQsTUFBTVQsSUFBK0IsR0FBRztFQUN0Q0ksR0FBRyxFQUFFLElBRGlDO0VBRXRDQyxFQUFFLEVBQUU7QUFGa0MsQ0FBeEM7QUFLQSxNQUFNTSxXQUFzQyxHQUFHLEVBQS9DOztBQUVBLEtBQUssTUFBTUYsSUFBWCxJQUFtQlQsSUFBbkIsRUFBeUI7RUFDdkIsTUFBTVUsS0FBSyxHQUFHVixJQUFJLENBQUNTLElBQUQsQ0FBbEI7RUFDQUUsV0FBVyxDQUFDRCxLQUFELENBQVgsR0FBcUJELElBQXJCO0FBQ0Q7O0FBWUQ7QUFDQTtBQUNBO0FBQ0EsTUFBTUcsZUFBTixDQUFzQjtFQXNCcEJDLFdBQVcsQ0FBQ0MsZUFBaUMsR0FBRztJQUFFQyxPQUFPLEVBQUUsS0FBWDtJQUFrQkMsT0FBTyxFQUFFO01BQUVDLEtBQUssRUFBRSxDQUFUO01BQVlDLEtBQUssRUFBRSxDQUFuQjtNQUFzQkMsS0FBSyxFQUFFLENBQTdCO01BQWdDQyxRQUFRLEVBQUU7SUFBMUM7RUFBM0IsQ0FBckMsRUFBaUg7SUFBQSxLQXJCNUhDLElBcUI0SDtJQUFBLEtBcEI1SEMsT0FvQjRIO0lBQUEsS0FsQjVITixPQWtCNEg7SUFBQSxLQVg1SE8sVUFXNEg7SUFBQSxLQVY1SEMsZ0JBVTRIO0lBQUEsS0FSNUhDLFFBUTRIO0lBQUEsS0FONUhDLFFBTTRIO0lBQUEsS0FKNUhDLElBSTRIO0lBQUEsS0FINUhDLFVBRzRIO0lBQUEsS0FGNUhDLGVBRTRIOztJQUMxSCxJQUFJZixlQUFlLFlBQVlnQixNQUEvQixFQUF1QztNQUNyQyxLQUFLVCxJQUFMLEdBQVlQLGVBQVo7TUFDQSxLQUFLUSxPQUFMLEdBQWU7UUFBRVAsT0FBTyxFQUFFLEtBQVg7UUFBa0JDLE9BQU8sRUFBRTtVQUFFQyxLQUFLLEVBQUUsQ0FBVDtVQUFZQyxLQUFLLEVBQUUsQ0FBbkI7VUFBc0JDLEtBQUssRUFBRSxDQUE3QjtVQUFnQ0MsUUFBUSxFQUFFO1FBQTFDO01BQTNCLENBQWY7SUFDRCxDQUhELE1BR087TUFDTCxLQUFLRSxPQUFMLEdBQWVSLGVBQWY7TUFDQSxLQUFLaUIsYUFBTDtJQUNEOztJQUNELEtBQUtDLGNBQUw7RUFDRDs7RUFFREQsYUFBYSxHQUFHO0lBQ2QsTUFBTVQsT0FBTyxHQUFHLENBQ2QsS0FBS1csbUJBQUwsRUFEYyxFQUVkLEtBQUtDLHNCQUFMLEVBRmMsRUFHZCxLQUFLQyxvQkFBTCxFQUhjLEVBSWQsS0FBS0Msb0JBQUwsRUFKYyxFQUtkLEtBQUtDLGdCQUFMLEVBTGMsRUFNZCxLQUFLQyxtQkFBTCxFQU5jLENBQWhCO0lBU0EsSUFBSUMsTUFBTSxHQUFHLENBQWI7O0lBQ0EsS0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBUixFQUFXQyxHQUFHLEdBQUduQixPQUFPLENBQUNpQixNQUE5QixFQUFzQ0MsQ0FBQyxHQUFHQyxHQUExQyxFQUErQ0QsQ0FBQyxFQUFoRCxFQUFvRDtNQUNsRCxNQUFNRSxNQUFNLEdBQUdwQixPQUFPLENBQUNrQixDQUFELENBQXRCO01BQ0FELE1BQU0sSUFBSSxJQUFJRyxNQUFNLENBQUNyQixJQUFQLENBQVlrQixNQUExQjtJQUNEOztJQUNEQSxNQUFNLEdBZlEsQ0FlSjs7SUFDVixLQUFLbEIsSUFBTCxHQUFZUyxNQUFNLENBQUNhLEtBQVAsQ0FBYUosTUFBYixFQUFxQixDQUFyQixDQUFaO0lBQ0EsSUFBSUssWUFBWSxHQUFHLENBQW5CO0lBQ0EsSUFBSUMsZ0JBQWdCLEdBQUcsSUFBSXZCLE9BQU8sQ0FBQ2lCLE1BQVosR0FBcUIsQ0FBNUM7O0lBRUEsS0FBSyxJQUFJTyxDQUFDLEdBQUcsQ0FBUixFQUFXTCxHQUFHLEdBQUduQixPQUFPLENBQUNpQixNQUE5QixFQUFzQ08sQ0FBQyxHQUFHTCxHQUExQyxFQUErQ0ssQ0FBQyxFQUFoRCxFQUFvRDtNQUNsRCxNQUFNSixNQUFNLEdBQUdwQixPQUFPLENBQUN3QixDQUFELENBQXRCO01BQ0EsS0FBS3pCLElBQUwsQ0FBVTBCLFVBQVYsQ0FBcUJMLE1BQU0sQ0FBQ00sS0FBNUIsRUFBbUNKLFlBQVksR0FBRyxDQUFsRDtNQUNBLEtBQUt2QixJQUFMLENBQVU0QixhQUFWLENBQXdCSixnQkFBeEIsRUFBMENELFlBQVksR0FBRyxDQUF6RDtNQUNBLEtBQUt2QixJQUFMLENBQVU0QixhQUFWLENBQXdCUCxNQUFNLENBQUNyQixJQUFQLENBQVlrQixNQUFwQyxFQUE0Q0ssWUFBWSxHQUFHLENBQTNEO01BQ0FBLFlBQVksSUFBSSxDQUFoQjtNQUNBRixNQUFNLENBQUNyQixJQUFQLENBQVk2QixJQUFaLENBQWlCLEtBQUs3QixJQUF0QixFQUE0QndCLGdCQUE1QjtNQUNBQSxnQkFBZ0IsSUFBSUgsTUFBTSxDQUFDckIsSUFBUCxDQUFZa0IsTUFBaEM7SUFDRDs7SUFFRCxLQUFLbEIsSUFBTCxDQUFVMEIsVUFBVixDQUFxQnBELEtBQUssQ0FBQ08sVUFBM0IsRUFBdUMwQyxZQUF2QztFQUNEOztFQUVEWCxtQkFBbUIsR0FBRztJQUNwQixNQUFNa0IsTUFBTSxHQUFHLElBQUlDLCtCQUFKLENBQTJCMUQsZ0JBQTNCLENBQWY7SUFDQXlELE1BQU0sQ0FBQ0osVUFBUCxDQUFrQixLQUFLekIsT0FBTCxDQUFhTixPQUFiLENBQXFCQyxLQUF2QztJQUNBa0MsTUFBTSxDQUFDSixVQUFQLENBQWtCLEtBQUt6QixPQUFMLENBQWFOLE9BQWIsQ0FBcUJFLEtBQXZDO0lBQ0FpQyxNQUFNLENBQUNGLGFBQVAsQ0FBcUIsS0FBSzNCLE9BQUwsQ0FBYU4sT0FBYixDQUFxQkcsS0FBMUM7SUFDQWdDLE1BQU0sQ0FBQ0YsYUFBUCxDQUFxQixLQUFLM0IsT0FBTCxDQUFhTixPQUFiLENBQXFCSSxRQUExQztJQUNBLE9BQU87TUFDTDRCLEtBQUssRUFBRXJELEtBQUssQ0FBQ0MsT0FEUjtNQUVMeUIsSUFBSSxFQUFFOEIsTUFBTSxDQUFDOUI7SUFGUixDQUFQO0VBSUQ7O0VBRURhLHNCQUFzQixHQUFHO0lBQ3ZCLE1BQU1pQixNQUFNLEdBQUcsSUFBSUMsK0JBQUosQ0FBMkIxRCxnQkFBM0IsQ0FBZjs7SUFDQSxJQUFJLEtBQUs0QixPQUFMLENBQWFQLE9BQWpCLEVBQTBCO01BQ3hCb0MsTUFBTSxDQUFDSixVQUFQLENBQWtCNUMsT0FBTyxDQUFDRSxFQUExQjtJQUNELENBRkQsTUFFTztNQUNMOEMsTUFBTSxDQUFDSixVQUFQLENBQWtCNUMsT0FBTyxDQUFDRyxPQUExQjtJQUNEOztJQUNELE9BQU87TUFDTDBDLEtBQUssRUFBRXJELEtBQUssQ0FBQ0UsVUFEUjtNQUVMd0IsSUFBSSxFQUFFOEIsTUFBTSxDQUFDOUI7SUFGUixDQUFQO0VBSUQ7O0VBRURjLG9CQUFvQixHQUFHO0lBQ3JCLE1BQU1nQixNQUFNLEdBQUcsSUFBSUMsK0JBQUosQ0FBMkIxRCxnQkFBM0IsQ0FBZjtJQUNBeUQsTUFBTSxDQUFDSixVQUFQLENBQWtCLElBQWxCO0lBQ0EsT0FBTztNQUNMQyxLQUFLLEVBQUVyRCxLQUFLLENBQUNHLE9BRFI7TUFFTHVCLElBQUksRUFBRThCLE1BQU0sQ0FBQzlCO0lBRlIsQ0FBUDtFQUlEOztFQUVEZSxvQkFBb0IsR0FBRztJQUNyQixNQUFNZSxNQUFNLEdBQUcsSUFBSUMsK0JBQUosQ0FBMkIxRCxnQkFBM0IsQ0FBZjtJQUNBeUQsTUFBTSxDQUFDRSxhQUFQLENBQXFCLElBQXJCO0lBQ0EsT0FBTztNQUNMTCxLQUFLLEVBQUVyRCxLQUFLLENBQUNJLFFBRFI7TUFFTHNCLElBQUksRUFBRThCLE1BQU0sQ0FBQzlCO0lBRlIsQ0FBUDtFQUlEOztFQUVEZ0IsZ0JBQWdCLEdBQUc7SUFDakIsTUFBTWMsTUFBTSxHQUFHLElBQUlDLCtCQUFKLENBQTJCMUQsZ0JBQTNCLENBQWY7SUFDQXlELE1BQU0sQ0FBQ0osVUFBUCxDQUFrQi9DLElBQUksQ0FBQ0ksR0FBdkI7SUFDQSxPQUFPO01BQ0w0QyxLQUFLLEVBQUVyRCxLQUFLLENBQUNLLElBRFI7TUFFTHFCLElBQUksRUFBRThCLE1BQU0sQ0FBQzlCO0lBRlIsQ0FBUDtFQUlEOztFQUVEaUIsbUJBQW1CLEdBQUc7SUFDcEIsTUFBTWEsTUFBTSxHQUFHLElBQUlDLCtCQUFKLENBQTJCMUQsZ0JBQTNCLENBQWY7SUFDQXlELE1BQU0sQ0FBQ0osVUFBUCxDQUFrQixJQUFsQjtJQUNBLE9BQU87TUFDTEMsS0FBSyxFQUFFckQsS0FBSyxDQUFDTSxlQURSO01BRUxvQixJQUFJLEVBQUU4QixNQUFNLENBQUM5QjtJQUZSLENBQVA7RUFJRDs7RUFFRFcsY0FBYyxHQUFHO0lBQ2YsSUFBSXNCLE1BQU0sR0FBRyxDQUFiOztJQUNBLE9BQU8sS0FBS2pDLElBQUwsQ0FBVWlDLE1BQVYsTUFBc0IzRCxLQUFLLENBQUNPLFVBQW5DLEVBQStDO01BQzdDLElBQUlxRCxVQUFVLEdBQUcsS0FBS2xDLElBQUwsQ0FBVW1DLFlBQVYsQ0FBdUJGLE1BQU0sR0FBRyxDQUFoQyxDQUFqQjtNQUNBLE1BQU1HLFVBQVUsR0FBRyxLQUFLcEMsSUFBTCxDQUFVbUMsWUFBVixDQUF1QkYsTUFBTSxHQUFHLENBQWhDLENBQW5COztNQUNBLFFBQVEsS0FBS2pDLElBQUwsQ0FBVWlDLE1BQVYsQ0FBUjtRQUNFLEtBQUszRCxLQUFLLENBQUNDLE9BQVg7VUFDRSxLQUFLOEQsY0FBTCxDQUFvQkgsVUFBcEI7VUFDQTs7UUFDRixLQUFLNUQsS0FBSyxDQUFDRSxVQUFYO1VBQ0UsS0FBSzhELGlCQUFMLENBQXVCSixVQUF2QjtVQUNBOztRQUNGLEtBQUs1RCxLQUFLLENBQUNHLE9BQVg7VUFDRSxLQUFLOEQsZUFBTCxDQUFxQkwsVUFBckI7VUFDQTs7UUFDRixLQUFLNUQsS0FBSyxDQUFDSSxRQUFYO1VBQ0UsSUFBSTBELFVBQVUsR0FBRyxDQUFqQixFQUFvQjtZQUNsQixLQUFLSSxlQUFMLENBQXFCTixVQUFyQjtVQUNEOztVQUNEOztRQUNGLEtBQUs1RCxLQUFLLENBQUNLLElBQVg7VUFDRSxLQUFLOEQsV0FBTCxDQUFpQlAsVUFBakI7VUFDQTs7UUFDRixLQUFLNUQsS0FBSyxDQUFDTSxlQUFYO1VBQ0UsS0FBSzhELGNBQUwsQ0FBb0JSLFVBQXBCO1VBQ0E7TUFwQko7O01Bc0JBRCxNQUFNLElBQUksQ0FBVjtNQUNBQyxVQUFVLElBQUlFLFVBQWQ7SUFDRDtFQUNGOztFQUVEQyxjQUFjLENBQUNKLE1BQUQsRUFBaUI7SUFDN0IsS0FBS3RDLE9BQUwsR0FBZTtNQUNiQyxLQUFLLEVBQUUsS0FBS0ksSUFBTCxDQUFVMkMsU0FBVixDQUFvQlYsTUFBTSxHQUFHLENBQTdCLENBRE07TUFFYnBDLEtBQUssRUFBRSxLQUFLRyxJQUFMLENBQVUyQyxTQUFWLENBQW9CVixNQUFNLEdBQUcsQ0FBN0IsQ0FGTTtNQUdibkMsS0FBSyxFQUFFLEtBQUtFLElBQUwsQ0FBVW1DLFlBQVYsQ0FBdUJGLE1BQU0sR0FBRyxDQUFoQyxDQUhNO01BSWJsQyxRQUFRLEVBQUUsS0FBS0MsSUFBTCxDQUFVbUMsWUFBVixDQUF1QkYsTUFBTSxHQUFHLENBQWhDO0lBSkcsQ0FBZjtFQU1EOztFQUVESyxpQkFBaUIsQ0FBQ0wsTUFBRCxFQUFpQjtJQUNoQyxLQUFLL0IsVUFBTCxHQUFrQixLQUFLRixJQUFMLENBQVUyQyxTQUFWLENBQW9CVixNQUFwQixDQUFsQjtJQUNBLEtBQUs5QixnQkFBTCxHQUF3QmhCLGNBQWMsQ0FBQyxLQUFLZSxVQUFOLENBQXRDO0VBQ0Q7O0VBRURxQyxlQUFlLENBQUNOLE1BQUQsRUFBaUI7SUFDOUIsS0FBSzdCLFFBQUwsR0FBZ0IsS0FBS0osSUFBTCxDQUFVMkMsU0FBVixDQUFvQlYsTUFBcEIsQ0FBaEI7RUFDRDs7RUFFRE8sZUFBZSxDQUFDUCxNQUFELEVBQWlCO0lBQzlCLEtBQUs1QixRQUFMLEdBQWdCLEtBQUtMLElBQUwsQ0FBVTRDLFlBQVYsQ0FBdUJYLE1BQXZCLENBQWhCO0VBQ0Q7O0VBRURRLFdBQVcsQ0FBQ1IsTUFBRCxFQUFpQjtJQUMxQixLQUFLM0IsSUFBTCxHQUFZLEtBQUtOLElBQUwsQ0FBVTJDLFNBQVYsQ0FBb0JWLE1BQXBCLENBQVo7SUFDQSxLQUFLMUIsVUFBTCxHQUFrQmpCLFdBQVcsQ0FBQyxLQUFLZ0IsSUFBTixDQUE3QjtFQUNEOztFQUVEb0MsY0FBYyxDQUFDVCxNQUFELEVBQWlCO0lBQzdCLEtBQUt6QixlQUFMLEdBQXVCLEtBQUtSLElBQUwsQ0FBVTJDLFNBQVYsQ0FBb0JWLE1BQXBCLENBQXZCO0VBQ0Q7O0VBRURZLFFBQVEsQ0FBQ0MsTUFBTSxHQUFHLEVBQVYsRUFBYztJQUNwQixPQUFPQSxNQUFNLEdBQUcsYUFBVCxHQUF5Qix3QkFDOUIsOEZBRDhCLEVBRTlCLEtBQUtuRCxPQUFMLENBQWFDLEtBRmlCLEVBRVYsS0FBS0QsT0FBTCxDQUFhRSxLQUZILEVBRVUsS0FBS0YsT0FBTCxDQUFhRyxLQUZ2QixFQUU4QixLQUFLSCxPQUFMLENBQWFJLFFBRjNDLEVBRzlCLEtBQUtHLFVBQUwsR0FBa0IsS0FBS0EsVUFBdkIsR0FBb0MsQ0FITixFQUk5QixLQUFLQyxnQkFBTCxHQUF3QixLQUFLQSxnQkFBN0IsR0FBZ0QsRUFKbEIsRUFLOUIsS0FBS0MsUUFBTCxHQUFnQixLQUFLQSxRQUFyQixHQUFnQyxDQUxGLEVBTTlCLEtBQUtDLFFBQUwsR0FBZ0IsS0FBS0EsUUFBckIsR0FBZ0MsQ0FORixFQU85QixLQUFLQyxJQUFMLEdBQVksS0FBS0EsSUFBakIsR0FBd0IsQ0FQTSxFQVE5QixLQUFLQyxVQUFMLEdBQWtCLEtBQUtBLFVBQXZCLEdBQW9DLEVBUk4sQ0FBaEM7RUFVRDs7QUF6TW1COztlQTRNUGhCLGU7O0FBQ2Z3RCxNQUFNLENBQUNDLE9BQVAsR0FBaUJ6RCxlQUFqQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _events = require("events");

var _errors = require("./errors");

var _types = require("./always-encrypted/types");

/**
 * ```js
 * const { Request } = require('tedious');
 * const request = new Request("select 42, 'hello world'", (err, rowCount) {
 *   // Request completion callback...
 * });
 * connection.execSql(request);
 * ```
 */
class Request extends _events.EventEmitter {
  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * @private
   */

  /**
   * This event, describing result set columns, will be emitted before row
   * events are emitted. This event may be emited multiple times when more
   * than one recordset is produced by the statement.
   *
   * An array like object, where the columns can be accessed either by index
   * or name. Columns with a name that is an integer are not accessible by name,
   * as it would be interpreted as an array index.
   */

  /**
   * The request has been prepared and can be used in subsequent calls to execute and unprepare.
   */

  /**
   * The request encountered an error and has not been prepared.
   */

  /**
   * A row resulting from execution of the SQL statement.
   */

  /**
   * All rows from a result set have been provided (through `row` events).
   *
   * This token is used to indicate the completion of a SQL statement.
   * As multiple SQL statements can be sent to the server in a single SQL batch, multiple `done` can be generated.
   * An `done` event is emited for each SQL statement in the SQL batch except variable declarations.
   * For execution of SQL statements within stored procedures, `doneProc` and `doneInProc` events are used in place of `done`.
   *
   * If you are using [[Connection.execSql]] then SQL server may treat the multiple calls with the same query as a stored procedure.
   * When this occurs, the `doneProc` and `doneInProc` events may be emitted instead. You must handle both events to ensure complete coverage.
   */

  /**
   * `request.on('doneInProc', function (rowCount, more, rows) { });`
   *
   * Indicates the completion status of a SQL statement within a stored procedure. All rows from a statement
   * in a stored procedure have been provided (through `row` events).
   *
   * This event may also occur when executing multiple calls with the same query using [[execSql]].
   */

  /**
   * Indicates the completion status of a stored procedure. This is also generated for stored procedures
   * executed through SQL statements.\
   * This event may also occur when executing multiple calls with the same query using [[execSql]].
   */

  /**
   * A value for an output parameter (that was added to the request with [[addOutputParameter]]).
   * See also `Using Parameters`.
   */

  /**
   * This event gives the columns by which data is ordered, if `ORDER BY` clause is executed in SQL Server.
   */
  on(event, listener) {
    return super.on(event, listener);
  }
  /**
   * @private
   */


  emit(event, ...args) {
    return super.emit(event, ...args);
  }
  /**
   * @param sqlTextOrProcedure
   *   The SQL statement to be executed
   *
   * @param callback
   *   The callback to execute once the request has been fully completed.
   */


  constructor(sqlTextOrProcedure, callback, options) {
    super();
    this.sqlTextOrProcedure = void 0;
    this.parameters = void 0;
    this.parametersByName = void 0;
    this.preparing = void 0;
    this.canceled = void 0;
    this.paused = void 0;
    this.userCallback = void 0;
    this.handle = void 0;
    this.error = void 0;
    this.connection = void 0;
    this.timeout = void 0;
    this.rows = void 0;
    this.rst = void 0;
    this.rowCount = void 0;
    this.callback = void 0;
    this.shouldHonorAE = void 0;
    this.statementColumnEncryptionSetting = void 0;
    this.cryptoMetadataLoaded = void 0;
    this.sqlTextOrProcedure = sqlTextOrProcedure;
    this.parameters = [];
    this.parametersByName = {};
    this.preparing = false;
    this.handle = undefined;
    this.canceled = false;
    this.paused = false;
    this.error = undefined;
    this.connection = undefined;
    this.timeout = undefined;
    this.userCallback = callback;
    this.statementColumnEncryptionSetting = options && options.statementColumnEncryptionSetting || _types.SQLServerStatementColumnEncryptionSetting.UseConnectionSetting;
    this.cryptoMetadataLoaded = false;

    this.callback = function (err, rowCount, rows) {
      if (this.preparing) {
        this.preparing = false;

        if (err) {
          this.emit('error', err);
        } else {
          this.emit('prepared');
        }
      } else {
        this.userCallback(err, rowCount, rows);
        this.emit('requestCompleted');
      }
    };
  }
  /**
   * @param name
   *   The parameter name. This should correspond to a parameter in the SQL,
   *   or a parameter that a called procedure expects. The name should not start with `@`.
   *
   * @param type
   *   One of the supported data types.
   *
   * @param value
   *   The value that the parameter is to be given. The Javascript type of the
   *   argument should match that documented for data types.
   *
   * @param options
   *   Additional type options. Optional.
   */
  // TODO: `type` must be a valid TDS value type


  addParameter(name, type, value, options) {
    const {
      output = false,
      length,
      precision,
      scale
    } = options ?? {};
    const parameter = {
      type: type,
      name: name,
      value: value,
      output: output,
      length: length,
      precision: precision,
      scale: scale
    };
    this.parameters.push(parameter);
    this.parametersByName[name] = parameter;
  }
  /**
   * @param name
   *   The parameter name. This should correspond to a parameter in the SQL,
   *   or a parameter that a called procedure expects.
   *
   * @param type
   *   One of the supported data types.
   *
   * @param value
   *   The value that the parameter is to be given. The Javascript type of the
   *   argument should match that documented for data types
   *
   * @param options
   *   Additional type options. Optional.
   */


  addOutputParameter(name, type, value, options) {
    this.addParameter(name, type, value, { ...options,
      output: true
    });
  }
  /**
   * @private
   */


  makeParamsParameter(parameters) {
    let paramsParameter = '';

    for (let i = 0, len = parameters.length; i < len; i++) {
      const parameter = parameters[i];

      if (paramsParameter.length > 0) {
        paramsParameter += ', ';
      }

      paramsParameter += '@' + parameter.name + ' ';
      paramsParameter += parameter.type.declaration(parameter);

      if (parameter.output) {
        paramsParameter += ' OUTPUT';
      }
    }

    return paramsParameter;
  }
  /**
   * @private
   */


  validateParameters(collation) {
    for (let i = 0, len = this.parameters.length; i < len; i++) {
      const parameter = this.parameters[i];

      try {
        parameter.value = parameter.type.validate(parameter.value, collation);
      } catch (error) {
        throw new _errors.RequestError('Validation failed for parameter \'' + parameter.name + '\'. ' + error.message, 'EPARAM');
      }
    }
  }
  /**
   * Temporarily suspends the flow of data from the database. No more `row` events will be emitted until [[resume] is called.
   * If this request is already in a paused state, calling [[pause]] has no effect.
   */


  pause() {
    if (this.paused) {
      return;
    }

    this.emit('pause');
    this.paused = true;
  }
  /**
   * Resumes the flow of data from the database.
   * If this request is not in a paused state, calling [[resume]] has no effect.
   */


  resume() {
    if (!this.paused) {
      return;
    }

    this.paused = false;
    this.emit('resume');
  }
  /**
   * Cancels a request while waiting for a server response.
   */


  cancel() {
    if (this.canceled) {
      return;
    }

    this.canceled = true;
    this.emit('cancel');
  }
  /**
   * Sets a timeout for this request.
   *
   * @param timeout
   *   The number of milliseconds before the request is considered failed,
   *   or `0` for no timeout. When no timeout is set for the request,
   *   the [[ConnectionOptions.requestTimeout]] of the [[Connection]] is used.
   */


  setTimeout(timeout) {
    this.timeout = timeout;
  }

}

var _default = Request;
exports.default = _default;
module.exports = Request;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZXF1ZXN0IiwiRXZlbnRFbWl0dGVyIiwib24iLCJldmVudCIsImxpc3RlbmVyIiwiZW1pdCIsImFyZ3MiLCJjb25zdHJ1Y3RvciIsInNxbFRleHRPclByb2NlZHVyZSIsImNhbGxiYWNrIiwib3B0aW9ucyIsInBhcmFtZXRlcnMiLCJwYXJhbWV0ZXJzQnlOYW1lIiwicHJlcGFyaW5nIiwiY2FuY2VsZWQiLCJwYXVzZWQiLCJ1c2VyQ2FsbGJhY2siLCJoYW5kbGUiLCJlcnJvciIsImNvbm5lY3Rpb24iLCJ0aW1lb3V0Iiwicm93cyIsInJzdCIsInJvd0NvdW50Iiwic2hvdWxkSG9ub3JBRSIsInN0YXRlbWVudENvbHVtbkVuY3J5cHRpb25TZXR0aW5nIiwiY3J5cHRvTWV0YWRhdGFMb2FkZWQiLCJ1bmRlZmluZWQiLCJTUUxTZXJ2ZXJTdGF0ZW1lbnRDb2x1bW5FbmNyeXB0aW9uU2V0dGluZyIsIlVzZUNvbm5lY3Rpb25TZXR0aW5nIiwiZXJyIiwiYWRkUGFyYW1ldGVyIiwibmFtZSIsInR5cGUiLCJ2YWx1ZSIsIm91dHB1dCIsImxlbmd0aCIsInByZWNpc2lvbiIsInNjYWxlIiwicGFyYW1ldGVyIiwicHVzaCIsImFkZE91dHB1dFBhcmFtZXRlciIsIm1ha2VQYXJhbXNQYXJhbWV0ZXIiLCJwYXJhbXNQYXJhbWV0ZXIiLCJpIiwibGVuIiwiZGVjbGFyYXRpb24iLCJ2YWxpZGF0ZVBhcmFtZXRlcnMiLCJjb2xsYXRpb24iLCJ2YWxpZGF0ZSIsIlJlcXVlc3RFcnJvciIsIm1lc3NhZ2UiLCJwYXVzZSIsInJlc3VtZSIsImNhbmNlbCIsInNldFRpbWVvdXQiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL3JlcXVlc3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCB7IFBhcmFtZXRlciwgRGF0YVR5cGUgfSBmcm9tICcuL2RhdGEtdHlwZSc7XG5pbXBvcnQgeyBSZXF1ZXN0RXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5cbmltcG9ydCBDb25uZWN0aW9uIGZyb20gJy4vY29ubmVjdGlvbic7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gJy4vbWV0YWRhdGEtcGFyc2VyJztcbmltcG9ydCB7IFNRTFNlcnZlclN0YXRlbWVudENvbHVtbkVuY3J5cHRpb25TZXR0aW5nIH0gZnJvbSAnLi9hbHdheXMtZW5jcnlwdGVkL3R5cGVzJztcbmltcG9ydCB7IENvbHVtbk1ldGFkYXRhIH0gZnJvbSAnLi90b2tlbi9jb2xtZXRhZGF0YS10b2tlbi1wYXJzZXInO1xuaW1wb3J0IHsgQ29sbGF0aW9uIH0gZnJvbSAnLi9jb2xsYXRpb24nO1xuXG4vKipcbiAqIFRoZSBjYWxsYmFjayBpcyBjYWxsZWQgd2hlbiB0aGUgcmVxdWVzdCBoYXMgY29tcGxldGVkLCBlaXRoZXIgc3VjY2Vzc2Z1bGx5IG9yIHdpdGggYW4gZXJyb3IuXG4gKiBJZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGV4ZWN1dGlvbiBvZiB0aGUgc3RhdGVtZW50KHMpLCB0aGVuIGBlcnJgIHdpbGwgZGVzY3JpYmUgdGhlIGVycm9yLlxuICpcbiAqIEFzIG9ubHkgb25lIHJlcXVlc3QgYXQgYSB0aW1lIG1heSBiZSBleGVjdXRlZCBvbiBhIGNvbm5lY3Rpb24sIGFub3RoZXIgcmVxdWVzdCBzaG91bGQgbm90XG4gKiBiZSBpbml0aWF0ZWQgdW50aWwgdGhpcyBjYWxsYmFjayBpcyBjYWxsZWQuXG4gKlxuICogVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgYmVmb3JlIGByZXF1ZXN0Q29tcGxldGVkYCBpcyBlbWl0dGVkLlxuICovXG50eXBlIENvbXBsZXRpb25DYWxsYmFjayA9XG4gIC8qKlxuICAgKiBAcGFyYW0gZXJyb3JcbiAgICogICBJZiBhbiBlcnJvciBvY2N1cmVkLCBhbiBlcnJvciBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSByb3dDb3VudFxuICAgKiAgIFRoZSBudW1iZXIgb2Ygcm93cyBlbWl0dGVkIGFzIHJlc3VsdCBvZiBleGVjdXRpbmcgdGhlIFNRTCBzdGF0ZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSByb3dzXG4gICAqICAgUm93cyBhcyBhIHJlc3VsdCBvZiBleGVjdXRpbmcgdGhlIFNRTCBzdGF0ZW1lbnQuXG4gICAqICAgV2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiBbW0Nvbm5lY3Rpb25PcHRpb25zLnJvd0NvbGxlY3Rpb25PblJlcXVlc3RDb21wbGV0aW9uXV0gaXMgYHRydWVgLlxuICAgKi9cbiAgLy8gVE9ETzogRmlndXJlIG91dCBob3cgdG8gdHlwZSB0aGUgYHJvd3NgIHBhcmFtZXRlciBoZXJlLlxuICAoZXJyb3I6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCwgcm93Q291bnQ/OiBudW1iZXIsIHJvd3M/OiBhbnkpID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyYW1ldGVyT3B0aW9ucyB7XG4gIG91dHB1dD86IGJvb2xlYW47XG4gIGxlbmd0aD86IG51bWJlcjtcbiAgcHJlY2lzaW9uPzogbnVtYmVyO1xuICBzY2FsZT86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFJlcXVlc3RPcHRpb25zIHtcbiAgc3RhdGVtZW50Q29sdW1uRW5jcnlwdGlvblNldHRpbmc/OiBTUUxTZXJ2ZXJTdGF0ZW1lbnRDb2x1bW5FbmNyeXB0aW9uU2V0dGluZztcbn1cblxuLyoqXG4gKiBgYGBqc1xuICogY29uc3QgeyBSZXF1ZXN0IH0gPSByZXF1aXJlKCd0ZWRpb3VzJyk7XG4gKiBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoXCJzZWxlY3QgNDIsICdoZWxsbyB3b3JsZCdcIiwgKGVyciwgcm93Q291bnQpIHtcbiAqICAgLy8gUmVxdWVzdCBjb21wbGV0aW9uIGNhbGxiYWNrLi4uXG4gKiB9KTtcbiAqIGNvbm5lY3Rpb24uZXhlY1NxbChyZXF1ZXN0KTtcbiAqIGBgYFxuICovXG5jbGFzcyBSZXF1ZXN0IGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzcWxUZXh0T3JQcm9jZWR1cmU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwYXJhbWV0ZXJzOiBQYXJhbWV0ZXJbXTtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwYXJhbWV0ZXJzQnlOYW1lOiB7IFtrZXk6IHN0cmluZ106IFBhcmFtZXRlciB9O1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByZXBhcmluZzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjYW5jZWxlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwYXVzZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgdXNlckNhbGxiYWNrOiBDb21wbGV0aW9uQ2FsbGJhY2s7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaGFuZGxlOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbm5lY3Rpb246IENvbm5lY3Rpb24gfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgdGltZW91dDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcm93cz86IEFycmF5PGFueT47XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcnN0PzogQXJyYXk8YW55PjtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByb3dDb3VudD86IG51bWJlcjtcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNhbGxiYWNrOiBDb21wbGV0aW9uQ2FsbGJhY2s7XG5cblxuICBzaG91bGRIb25vckFFPzogYm9vbGVhbjtcbiAgc3RhdGVtZW50Q29sdW1uRW5jcnlwdGlvblNldHRpbmc6IFNRTFNlcnZlclN0YXRlbWVudENvbHVtbkVuY3J5cHRpb25TZXR0aW5nO1xuICBjcnlwdG9NZXRhZGF0YUxvYWRlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhpcyBldmVudCwgZGVzY3JpYmluZyByZXN1bHQgc2V0IGNvbHVtbnMsIHdpbGwgYmUgZW1pdHRlZCBiZWZvcmUgcm93XG4gICAqIGV2ZW50cyBhcmUgZW1pdHRlZC4gVGhpcyBldmVudCBtYXkgYmUgZW1pdGVkIG11bHRpcGxlIHRpbWVzIHdoZW4gbW9yZVxuICAgKiB0aGFuIG9uZSByZWNvcmRzZXQgaXMgcHJvZHVjZWQgYnkgdGhlIHN0YXRlbWVudC5cbiAgICpcbiAgICogQW4gYXJyYXkgbGlrZSBvYmplY3QsIHdoZXJlIHRoZSBjb2x1bW5zIGNhbiBiZSBhY2Nlc3NlZCBlaXRoZXIgYnkgaW5kZXhcbiAgICogb3IgbmFtZS4gQ29sdW1ucyB3aXRoIGEgbmFtZSB0aGF0IGlzIGFuIGludGVnZXIgYXJlIG5vdCBhY2Nlc3NpYmxlIGJ5IG5hbWUsXG4gICAqIGFzIGl0IHdvdWxkIGJlIGludGVycHJldGVkIGFzIGFuIGFycmF5IGluZGV4LlxuICAgKi9cbiAgb24oXG4gICAgZXZlbnQ6ICdjb2x1bW5NZXRhZGF0YScsXG4gICAgbGlzdGVuZXI6XG4gICAgKGNvbHVtbnM6IENvbHVtbk1ldGFkYXRhW10gfCB7IFtrZXk6IHN0cmluZ106IENvbHVtbk1ldGFkYXRhIH0pID0+IHZvaWRcbiAgKTogdGhpc1xuXG4gIC8qKlxuICAgKiBUaGUgcmVxdWVzdCBoYXMgYmVlbiBwcmVwYXJlZCBhbmQgY2FuIGJlIHVzZWQgaW4gc3Vic2VxdWVudCBjYWxscyB0byBleGVjdXRlIGFuZCB1bnByZXBhcmUuXG4gICAqL1xuICBvbihldmVudDogJ3ByZXBhcmVkJywgbGlzdGVuZXI6ICgpID0+IHZvaWQpOiB0aGlzXG5cbiAgLyoqXG4gICAqIFRoZSByZXF1ZXN0IGVuY291bnRlcmVkIGFuIGVycm9yIGFuZCBoYXMgbm90IGJlZW4gcHJlcGFyZWQuXG4gICAqL1xuICBvbihldmVudDogJ2Vycm9yJywgbGlzdGVuZXI6IChlcnI6IEVycm9yKSA9PiB2b2lkKTogdGhpc1xuXG4gIC8qKlxuICAgKiBBIHJvdyByZXN1bHRpbmcgZnJvbSBleGVjdXRpb24gb2YgdGhlIFNRTCBzdGF0ZW1lbnQuXG4gICAqL1xuICBvbihcbiAgICBldmVudDogJ3JvdycsXG4gICAgbGlzdGVuZXI6XG4gICAgICAvKipcbiAgICAgICAqIEFuIGFycmF5IG9yIG9iamVjdCAoZGVwZW5kcyBvbiBbW0Nvbm5lY3Rpb25PcHRpb25zLnVzZUNvbHVtbk5hbWVzXV0pLCB3aGVyZSB0aGUgY29sdW1ucyBjYW4gYmUgYWNjZXNzZWQgYnkgaW5kZXgvbmFtZS5cbiAgICAgICAqIEVhY2ggY29sdW1uIGhhcyB0d28gcHJvcGVydGllcywgYG1ldGFkYXRhYCBhbmQgYHZhbHVlYO+8mlxuICAgICAgICpcbiAgICAgICAqICogYG1ldGFkYXRhYFxuICAgICAgICpcbiAgICAgICAqICAgIFRoZSBzYW1lIGRhdGEgdGhhdCBpcyBleHBvc2VkIGluIHRoZSBgY29sdW1uTWV0YWRhdGFgIGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqICogYHZhbHVlYFxuICAgICAgICpcbiAgICAgICAqICAgIFRoZSBjb2x1bW4ncyB2YWx1ZS4gSXQgd2lsbCBiZSBgbnVsbGAgZm9yIGEgYE5VTExgLlxuICAgICAgICogICAgSWYgdGhlcmUgYXJlIG11bHRpcGxlIGNvbHVtbnMgd2l0aCB0aGUgc2FtZSBuYW1lLCB0aGVuIHRoaXMgd2lsbCBiZSBhbiBhcnJheSBvZiB0aGUgdmFsdWVzLlxuICAgICAgICovXG4gICAgICAoY29sdW1uczogYW55KSA9PiB2b2lkXG4gICk6IHRoaXNcblxuICAvKipcbiAgICogQWxsIHJvd3MgZnJvbSBhIHJlc3VsdCBzZXQgaGF2ZSBiZWVuIHByb3ZpZGVkICh0aHJvdWdoIGByb3dgIGV2ZW50cykuXG4gICAqXG4gICAqIFRoaXMgdG9rZW4gaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgY29tcGxldGlvbiBvZiBhIFNRTCBzdGF0ZW1lbnQuXG4gICAqIEFzIG11bHRpcGxlIFNRTCBzdGF0ZW1lbnRzIGNhbiBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIgaW4gYSBzaW5nbGUgU1FMIGJhdGNoLCBtdWx0aXBsZSBgZG9uZWAgY2FuIGJlIGdlbmVyYXRlZC5cbiAgICogQW4gYGRvbmVgIGV2ZW50IGlzIGVtaXRlZCBmb3IgZWFjaCBTUUwgc3RhdGVtZW50IGluIHRoZSBTUUwgYmF0Y2ggZXhjZXB0IHZhcmlhYmxlIGRlY2xhcmF0aW9ucy5cbiAgICogRm9yIGV4ZWN1dGlvbiBvZiBTUUwgc3RhdGVtZW50cyB3aXRoaW4gc3RvcmVkIHByb2NlZHVyZXMsIGBkb25lUHJvY2AgYW5kIGBkb25lSW5Qcm9jYCBldmVudHMgYXJlIHVzZWQgaW4gcGxhY2Ugb2YgYGRvbmVgLlxuICAgKlxuICAgKiBJZiB5b3UgYXJlIHVzaW5nIFtbQ29ubmVjdGlvbi5leGVjU3FsXV0gdGhlbiBTUUwgc2VydmVyIG1heSB0cmVhdCB0aGUgbXVsdGlwbGUgY2FsbHMgd2l0aCB0aGUgc2FtZSBxdWVyeSBhcyBhIHN0b3JlZCBwcm9jZWR1cmUuXG4gICAqIFdoZW4gdGhpcyBvY2N1cnMsIHRoZSBgZG9uZVByb2NgIGFuZCBgZG9uZUluUHJvY2AgZXZlbnRzIG1heSBiZSBlbWl0dGVkIGluc3RlYWQuIFlvdSBtdXN0IGhhbmRsZSBib3RoIGV2ZW50cyB0byBlbnN1cmUgY29tcGxldGUgY292ZXJhZ2UuXG4gICAqL1xuICBvbihcbiAgICBldmVudDogJ2RvbmUnLFxuICAgIGxpc3RlbmVyOlxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gcm93Q291bnRcbiAgICAgICAqICAgVGhlIG51bWJlciBvZiByZXN1bHQgcm93cy4gTWF5IGJlIGB1bmRlZmluZWRgIGlmIG5vdCBhdmFpbGFibGUuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIG1vcmVcbiAgICAgICAqICAgSWYgdGhlcmUgYXJlIG1vcmUgcmVzdWx0cyB0byBjb21lIChwcm9iYWJseSBiZWNhdXNlIG11bHRpcGxlIHN0YXRlbWVudHMgYXJlIGJlaW5nIGV4ZWN1dGVkKSwgdGhlbiBgdHJ1ZWAuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHJzdFxuICAgICAgICogICBSb3dzIGFzIGEgcmVzdWx0IG9mIGV4ZWN1dGluZyB0aGUgU1FMIHN0YXRlbWVudC5cbiAgICAgICAqICAgV2lsbCBvbmx5IGJlIGF2YWlhYmxlIGlmIENvbm5lY3Rpb24ncyBbW0Nvbm5lY3Rpb25PcHRpb25zLnJvd0NvbGxlY3Rpb25PbkRvbmVdXSBpcyBgdHJ1ZWAuXG4gICAgICAgKi9cbiAgICAgIChyb3dDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkLCBtb3JlOiBib29sZWFuLCByc3Q/OiBhbnlbXSkgPT4gdm9pZFxuICApOiB0aGlzXG5cbiAgLyoqXG4gICAqIGByZXF1ZXN0Lm9uKCdkb25lSW5Qcm9jJywgZnVuY3Rpb24gKHJvd0NvdW50LCBtb3JlLCByb3dzKSB7IH0pO2BcbiAgICpcbiAgICogSW5kaWNhdGVzIHRoZSBjb21wbGV0aW9uIHN0YXR1cyBvZiBhIFNRTCBzdGF0ZW1lbnQgd2l0aGluIGEgc3RvcmVkIHByb2NlZHVyZS4gQWxsIHJvd3MgZnJvbSBhIHN0YXRlbWVudFxuICAgKiBpbiBhIHN0b3JlZCBwcm9jZWR1cmUgaGF2ZSBiZWVuIHByb3ZpZGVkICh0aHJvdWdoIGByb3dgIGV2ZW50cykuXG4gICAqXG4gICAqIFRoaXMgZXZlbnQgbWF5IGFsc28gb2NjdXIgd2hlbiBleGVjdXRpbmcgbXVsdGlwbGUgY2FsbHMgd2l0aCB0aGUgc2FtZSBxdWVyeSB1c2luZyBbW2V4ZWNTcWxdXS5cbiAgICovXG4gIG9uKFxuICAgIGV2ZW50OiAnZG9uZUluUHJvYycsXG4gICAgbGlzdGVuZXI6XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSByb3dDb3VudFxuICAgICAgICogICBUaGUgbnVtYmVyIG9mIHJlc3VsdCByb3dzLiBNYXkgYmUgYHVuZGVmaW5lZGAgaWYgbm90IGF2YWlsYWJsZS5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gbW9yZVxuICAgICAgICogICBJZiB0aGVyZSBhcmUgbW9yZSByZXN1bHRzIHRvIGNvbWUgKHByb2JhYmx5IGJlY2F1c2UgbXVsdGlwbGUgc3RhdGVtZW50cyBhcmUgYmVpbmcgZXhlY3V0ZWQpLCB0aGVuIGB0cnVlYC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gcnN0XG4gICAgICAgKiAgIFJvd3MgYXMgYSByZXN1bHQgb2YgZXhlY3V0aW5nIHRoZSBTUUwgc3RhdGVtZW50LlxuICAgICAgICogICBXaWxsIG9ubHkgYmUgYXZhaWFibGUgaWYgQ29ubmVjdGlvbidzIFtbQ29ubmVjdGlvbk9wdGlvbnMucm93Q29sbGVjdGlvbk9uRG9uZV1dIGlzIGB0cnVlYC5cbiAgICAgICAqL1xuICAgICAgKHJvd0NvdW50OiBudW1iZXIgfCB1bmRlZmluZWQsIG1vcmU6IGJvb2xlYW4sIHJzdD86IGFueVtdKSA9PiB2b2lkXG4gICk6IHRoaXNcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHRoZSBjb21wbGV0aW9uIHN0YXR1cyBvZiBhIHN0b3JlZCBwcm9jZWR1cmUuIFRoaXMgaXMgYWxzbyBnZW5lcmF0ZWQgZm9yIHN0b3JlZCBwcm9jZWR1cmVzXG4gICAqIGV4ZWN1dGVkIHRocm91Z2ggU1FMIHN0YXRlbWVudHMuXFxcbiAgICogVGhpcyBldmVudCBtYXkgYWxzbyBvY2N1ciB3aGVuIGV4ZWN1dGluZyBtdWx0aXBsZSBjYWxscyB3aXRoIHRoZSBzYW1lIHF1ZXJ5IHVzaW5nIFtbZXhlY1NxbF1dLlxuICAgKi9cbiAgb24oXG4gICAgZXZlbnQ6ICdkb25lUHJvYycsXG4gICAgbGlzdGVuZXI6XG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSByb3dDb3VudFxuICAgICAgICogICBUaGUgbnVtYmVyIG9mIHJlc3VsdCByb3dzLiBNYXkgYmUgYHVuZGVmaW5lZGAgaWYgbm90IGF2YWlsYWJsZS5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gbW9yZVxuICAgICAgICogICBJZiB0aGVyZSBhcmUgbW9yZSByZXN1bHRzIHRvIGNvbWUgKHByb2JhYmx5IGJlY2F1c2UgbXVsdGlwbGUgc3RhdGVtZW50cyBhcmUgYmVpbmcgZXhlY3V0ZWQpLCB0aGVuIGB0cnVlYC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gcnN0XG4gICAgICAgKiAgIFJvd3MgYXMgYSByZXN1bHQgb2YgZXhlY3V0aW5nIHRoZSBTUUwgc3RhdGVtZW50LlxuICAgICAgICogICBXaWxsIG9ubHkgYmUgYXZhaWFibGUgaWYgQ29ubmVjdGlvbidzIFtbQ29ubmVjdGlvbk9wdGlvbnMucm93Q29sbGVjdGlvbk9uRG9uZV1dIGlzIGB0cnVlYC5cbiAgICAgICAqL1xuICAgICAgKHJvd0NvdW50OiBudW1iZXIgfCB1bmRlZmluZWQsIG1vcmU6IGJvb2xlYW4sIHByb2NSZXR1cm5TdGF0dXNWYWx1ZTogbnVtYmVyLCByc3Q/OiBhbnlbXSkgPT4gdm9pZFxuICApOiB0aGlzXG5cbiAgLyoqXG4gICAqIEEgdmFsdWUgZm9yIGFuIG91dHB1dCBwYXJhbWV0ZXIgKHRoYXQgd2FzIGFkZGVkIHRvIHRoZSByZXF1ZXN0IHdpdGggW1thZGRPdXRwdXRQYXJhbWV0ZXJdXSkuXG4gICAqIFNlZSBhbHNvIGBVc2luZyBQYXJhbWV0ZXJzYC5cbiAgICovXG4gIG9uKFxuICAgIGV2ZW50OiAncmV0dXJuVmFsdWUnLFxuICAgIGxpc3RlbmVyOlxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZVxuICAgICAgICogICBUaGUgcGFyYW1ldGVyIG5hbWUuIChEb2VzIG5vdCBzdGFydCB3aXRoICdAJy4pXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHZhbHVlXG4gICAgICAgKiAgIFRoZSBwYXJhbWV0ZXIncyBvdXRwdXQgdmFsdWUuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIG1ldGFkYXRhXG4gICAgICAgKiAgIFRoZSBzYW1lIGRhdGEgdGhhdCBpcyBleHBvc2VkIGluIHRoZSBgY29sdW1uTWV0YURhdGFgIGV2ZW50LlxuICAgICAgICovXG4gICAgICAocGFyYW1ldGVyTmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgbWV0YWRhdGE6IE1ldGFkYXRhKSA9PiB2b2lkXG4gICk6IHRoaXNcblxuICAvKipcbiAgICogVGhpcyBldmVudCBnaXZlcyB0aGUgY29sdW1ucyBieSB3aGljaCBkYXRhIGlzIG9yZGVyZWQsIGlmIGBPUkRFUiBCWWAgY2xhdXNlIGlzIGV4ZWN1dGVkIGluIFNRTCBTZXJ2ZXIuXG4gICAqL1xuICBvbihcbiAgICBldmVudDogJ29yZGVyJyxcbiAgICBsaXN0ZW5lcjpcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIG9yZGVyQ29sdW1uc1xuICAgICAgICogICBBbiBhcnJheSBvZiBjb2x1bW4gbnVtYmVycyBpbiB0aGUgcmVzdWx0IHNldCBieSB3aGljaCBkYXRhIGlzIG9yZGVyZWQuXG4gICAgICAgKi9cbiAgICAgIChvcmRlckNvbHVtbnM6IG51bWJlcltdKSA9PiB2b2lkXG4gICk6IHRoaXNcblxuICBvbihldmVudDogJ3JlcXVlc3RDb21wbGV0ZWQnLCBsaXN0ZW5lcjogKCkgPT4gdm9pZCk6IHRoaXNcblxuICBvbihldmVudDogJ2NhbmNlbCcsIGxpc3RlbmVyOiAoKSA9PiB2b2lkKTogdGhpc1xuXG4gIG9uKGV2ZW50OiAncGF1c2UnLCBsaXN0ZW5lcjogKCkgPT4gdm9pZCk6IHRoaXNcblxuICBvbihldmVudDogJ3Jlc3VtZScsIGxpc3RlbmVyOiAoKSA9PiB2b2lkKTogdGhpc1xuXG4gIG9uKGV2ZW50OiBzdHJpbmcgfCBzeW1ib2wsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICByZXR1cm4gc3VwZXIub24oZXZlbnQsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ2NvbHVtbk1ldGFkYXRhJywgY29sdW1uczogQ29sdW1uTWV0YWRhdGFbXSB8IHsgW2tleTogc3RyaW5nXTogQ29sdW1uTWV0YWRhdGEgfSk6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAncHJlcGFyZWQnKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdlcnJvcicsIGVycjogRXJyb3IpOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ3JvdycsIGNvbHVtbnM6IGFueSk6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAnZG9uZScsIHJvd0NvdW50OiBudW1iZXIgfCB1bmRlZmluZWQsIG1vcmU6IGJvb2xlYW4sIHJzdD86IGFueVtdKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdkb25lSW5Qcm9jJywgcm93Q291bnQ6IG51bWJlciB8IHVuZGVmaW5lZCwgbW9yZTogYm9vbGVhbiwgcnN0PzogYW55W10pOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ2RvbmVQcm9jJywgcm93Q291bnQ6IG51bWJlciB8IHVuZGVmaW5lZCwgbW9yZTogYm9vbGVhbiwgcHJvY1JldHVyblN0YXR1c1ZhbHVlOiBudW1iZXIsIHJzdD86IGFueVtdKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdyZXR1cm5WYWx1ZScsIHBhcmFtZXRlck5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24sIG1ldGFkYXRhOiBNZXRhZGF0YSk6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAncmVxdWVzdENvbXBsZXRlZCcpOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ2NhbmNlbCcpOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ3BhdXNlJyk6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAncmVzdW1lJyk6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAnb3JkZXInLCBvcmRlckNvbHVtbnM6IG51bWJlcltdKTogYm9vbGVhblxuICBlbWl0KGV2ZW50OiBzdHJpbmcgfCBzeW1ib2wsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgcmV0dXJuIHN1cGVyLmVtaXQoZXZlbnQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBzcWxUZXh0T3JQcm9jZWR1cmVcbiAgICogICBUaGUgU1FMIHN0YXRlbWVudCB0byBiZSBleGVjdXRlZFxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICogICBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZSBvbmNlIHRoZSByZXF1ZXN0IGhhcyBiZWVuIGZ1bGx5IGNvbXBsZXRlZC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHNxbFRleHRPclByb2NlZHVyZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBjYWxsYmFjazogQ29tcGxldGlvbkNhbGxiYWNrLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5zcWxUZXh0T3JQcm9jZWR1cmUgPSBzcWxUZXh0T3JQcm9jZWR1cmU7XG4gICAgdGhpcy5wYXJhbWV0ZXJzID0gW107XG4gICAgdGhpcy5wYXJhbWV0ZXJzQnlOYW1lID0ge307XG4gICAgdGhpcy5wcmVwYXJpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmhhbmRsZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNhbmNlbGVkID0gZmFsc2U7XG4gICAgdGhpcy5wYXVzZWQgPSBmYWxzZTtcbiAgICB0aGlzLmVycm9yID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY29ubmVjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnRpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy51c2VyQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB0aGlzLnN0YXRlbWVudENvbHVtbkVuY3J5cHRpb25TZXR0aW5nID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5zdGF0ZW1lbnRDb2x1bW5FbmNyeXB0aW9uU2V0dGluZykgfHwgU1FMU2VydmVyU3RhdGVtZW50Q29sdW1uRW5jcnlwdGlvblNldHRpbmcuVXNlQ29ubmVjdGlvblNldHRpbmc7XG4gICAgdGhpcy5jcnlwdG9NZXRhZGF0YUxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMuY2FsbGJhY2sgPSBmdW5jdGlvbihlcnI6IEVycm9yIHwgdW5kZWZpbmVkIHwgbnVsbCwgcm93Q291bnQ/OiBudW1iZXIsIHJvd3M/OiBhbnkpIHtcbiAgICAgIGlmICh0aGlzLnByZXBhcmluZykge1xuICAgICAgICB0aGlzLnByZXBhcmluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5lbWl0KCdwcmVwYXJlZCcpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVzZXJDYWxsYmFjayhlcnIsIHJvd0NvdW50LCByb3dzKTtcbiAgICAgICAgdGhpcy5lbWl0KCdyZXF1ZXN0Q29tcGxldGVkJyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gbmFtZVxuICAgKiAgIFRoZSBwYXJhbWV0ZXIgbmFtZS4gVGhpcyBzaG91bGQgY29ycmVzcG9uZCB0byBhIHBhcmFtZXRlciBpbiB0aGUgU1FMLFxuICAgKiAgIG9yIGEgcGFyYW1ldGVyIHRoYXQgYSBjYWxsZWQgcHJvY2VkdXJlIGV4cGVjdHMuIFRoZSBuYW1lIHNob3VsZCBub3Qgc3RhcnQgd2l0aCBgQGAuXG4gICAqXG4gICAqIEBwYXJhbSB0eXBlXG4gICAqICAgT25lIG9mIHRoZSBzdXBwb3J0ZWQgZGF0YSB0eXBlcy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqICAgVGhlIHZhbHVlIHRoYXQgdGhlIHBhcmFtZXRlciBpcyB0byBiZSBnaXZlbi4gVGhlIEphdmFzY3JpcHQgdHlwZSBvZiB0aGVcbiAgICogICBhcmd1bWVudCBzaG91bGQgbWF0Y2ggdGhhdCBkb2N1bWVudGVkIGZvciBkYXRhIHR5cGVzLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiAgIEFkZGl0aW9uYWwgdHlwZSBvcHRpb25zLiBPcHRpb25hbC5cbiAgICovXG4gIC8vIFRPRE86IGB0eXBlYCBtdXN0IGJlIGEgdmFsaWQgVERTIHZhbHVlIHR5cGVcbiAgYWRkUGFyYW1ldGVyKG5hbWU6IHN0cmluZywgdHlwZTogRGF0YVR5cGUsIHZhbHVlPzogdW5rbm93biwgb3B0aW9ucz86IFJlYWRvbmx5PFBhcmFtZXRlck9wdGlvbnM+IHwgbnVsbCkge1xuICAgIGNvbnN0IHsgb3V0cHV0ID0gZmFsc2UsIGxlbmd0aCwgcHJlY2lzaW9uLCBzY2FsZSB9ID0gb3B0aW9ucyA/PyB7fTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcjogUGFyYW1ldGVyID0ge1xuICAgICAgdHlwZTogdHlwZSxcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBvdXRwdXQ6IG91dHB1dCxcbiAgICAgIGxlbmd0aDogbGVuZ3RoLFxuICAgICAgcHJlY2lzaW9uOiBwcmVjaXNpb24sXG4gICAgICBzY2FsZTogc2NhbGVcbiAgICB9O1xuXG4gICAgdGhpcy5wYXJhbWV0ZXJzLnB1c2gocGFyYW1ldGVyKTtcbiAgICB0aGlzLnBhcmFtZXRlcnNCeU5hbWVbbmFtZV0gPSBwYXJhbWV0ZXI7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIG5hbWVcbiAgICogICBUaGUgcGFyYW1ldGVyIG5hbWUuIFRoaXMgc2hvdWxkIGNvcnJlc3BvbmQgdG8gYSBwYXJhbWV0ZXIgaW4gdGhlIFNRTCxcbiAgICogICBvciBhIHBhcmFtZXRlciB0aGF0IGEgY2FsbGVkIHByb2NlZHVyZSBleHBlY3RzLlxuICAgKlxuICAgKiBAcGFyYW0gdHlwZVxuICAgKiAgIE9uZSBvZiB0aGUgc3VwcG9ydGVkIGRhdGEgdHlwZXMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKiAgIFRoZSB2YWx1ZSB0aGF0IHRoZSBwYXJhbWV0ZXIgaXMgdG8gYmUgZ2l2ZW4uIFRoZSBKYXZhc2NyaXB0IHR5cGUgb2YgdGhlXG4gICAqICAgYXJndW1lbnQgc2hvdWxkIG1hdGNoIHRoYXQgZG9jdW1lbnRlZCBmb3IgZGF0YSB0eXBlc1xuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiAgIEFkZGl0aW9uYWwgdHlwZSBvcHRpb25zLiBPcHRpb25hbC5cbiAgICovXG4gIGFkZE91dHB1dFBhcmFtZXRlcihuYW1lOiBzdHJpbmcsIHR5cGU6IERhdGFUeXBlLCB2YWx1ZT86IHVua25vd24sIG9wdGlvbnM/OiBSZWFkb25seTxQYXJhbWV0ZXJPcHRpb25zPiB8IG51bGwpIHtcbiAgICB0aGlzLmFkZFBhcmFtZXRlcihuYW1lLCB0eXBlLCB2YWx1ZSwgeyAuLi5vcHRpb25zLCBvdXRwdXQ6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIG1ha2VQYXJhbXNQYXJhbWV0ZXIocGFyYW1ldGVyczogUGFyYW1ldGVyW10pIHtcbiAgICBsZXQgcGFyYW1zUGFyYW1ldGVyID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHBhcmFtZXRlcnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IHBhcmFtZXRlciA9IHBhcmFtZXRlcnNbaV07XG4gICAgICBpZiAocGFyYW1zUGFyYW1ldGVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcGFyYW1zUGFyYW1ldGVyICs9ICcsICc7XG4gICAgICB9XG4gICAgICBwYXJhbXNQYXJhbWV0ZXIgKz0gJ0AnICsgcGFyYW1ldGVyLm5hbWUgKyAnICc7XG4gICAgICBwYXJhbXNQYXJhbWV0ZXIgKz0gcGFyYW1ldGVyLnR5cGUuZGVjbGFyYXRpb24ocGFyYW1ldGVyKTtcbiAgICAgIGlmIChwYXJhbWV0ZXIub3V0cHV0KSB7XG4gICAgICAgIHBhcmFtc1BhcmFtZXRlciArPSAnIE9VVFBVVCc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXNQYXJhbWV0ZXI7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHZhbGlkYXRlUGFyYW1ldGVycyhjb2xsYXRpb246IENvbGxhdGlvbiB8IHVuZGVmaW5lZCkge1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLnBhcmFtZXRlcnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IHBhcmFtZXRlciA9IHRoaXMucGFyYW1ldGVyc1tpXTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcGFyYW1ldGVyLnZhbHVlID0gcGFyYW1ldGVyLnR5cGUudmFsaWRhdGUocGFyYW1ldGVyLnZhbHVlLCBjb2xsYXRpb24pO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgUmVxdWVzdEVycm9yKCdWYWxpZGF0aW9uIGZhaWxlZCBmb3IgcGFyYW1ldGVyIFxcJycgKyBwYXJhbWV0ZXIubmFtZSArICdcXCcuICcgKyBlcnJvci5tZXNzYWdlLCAnRVBBUkFNJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRlbXBvcmFyaWx5IHN1c3BlbmRzIHRoZSBmbG93IG9mIGRhdGEgZnJvbSB0aGUgZGF0YWJhc2UuIE5vIG1vcmUgYHJvd2AgZXZlbnRzIHdpbGwgYmUgZW1pdHRlZCB1bnRpbCBbW3Jlc3VtZV0gaXMgY2FsbGVkLlxuICAgKiBJZiB0aGlzIHJlcXVlc3QgaXMgYWxyZWFkeSBpbiBhIHBhdXNlZCBzdGF0ZSwgY2FsbGluZyBbW3BhdXNlXV0gaGFzIG5vIGVmZmVjdC5cbiAgICovXG4gIHBhdXNlKCkge1xuICAgIGlmICh0aGlzLnBhdXNlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVtaXQoJ3BhdXNlJyk7XG4gICAgdGhpcy5wYXVzZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZXMgdGhlIGZsb3cgb2YgZGF0YSBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICogSWYgdGhpcyByZXF1ZXN0IGlzIG5vdCBpbiBhIHBhdXNlZCBzdGF0ZSwgY2FsbGluZyBbW3Jlc3VtZV1dIGhhcyBubyBlZmZlY3QuXG4gICAqL1xuICByZXN1bWUoKSB7XG4gICAgaWYgKCF0aGlzLnBhdXNlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnBhdXNlZCA9IGZhbHNlO1xuICAgIHRoaXMuZW1pdCgncmVzdW1lJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VscyBhIHJlcXVlc3Qgd2hpbGUgd2FpdGluZyBmb3IgYSBzZXJ2ZXIgcmVzcG9uc2UuXG4gICAqL1xuICBjYW5jZWwoKSB7XG4gICAgaWYgKHRoaXMuY2FuY2VsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNhbmNlbGVkID0gdHJ1ZTtcbiAgICB0aGlzLmVtaXQoJ2NhbmNlbCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYSB0aW1lb3V0IGZvciB0aGlzIHJlcXVlc3QuXG4gICAqXG4gICAqIEBwYXJhbSB0aW1lb3V0XG4gICAqICAgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSByZXF1ZXN0IGlzIGNvbnNpZGVyZWQgZmFpbGVkLFxuICAgKiAgIG9yIGAwYCBmb3Igbm8gdGltZW91dC4gV2hlbiBubyB0aW1lb3V0IGlzIHNldCBmb3IgdGhlIHJlcXVlc3QsXG4gICAqICAgdGhlIFtbQ29ubmVjdGlvbk9wdGlvbnMucmVxdWVzdFRpbWVvdXRdXSBvZiB0aGUgW1tDb25uZWN0aW9uXV0gaXMgdXNlZC5cbiAgICovXG4gIHNldFRpbWVvdXQodGltZW91dD86IG51bWJlcikge1xuICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUmVxdWVzdDtcbm1vZHVsZS5leHBvcnRzID0gUmVxdWVzdDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUVBOztBQUlBOztBQXVDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNQSxPQUFOLFNBQXNCQyxvQkFBdEIsQ0FBbUM7RUFDakM7QUFDRjtBQUNBOztFQUVFO0FBQ0Y7QUFDQTs7RUFFRTtBQUNGO0FBQ0E7O0VBRUU7QUFDRjtBQUNBOztFQUVFO0FBQ0Y7QUFDQTs7RUFFRTtBQUNGO0FBQ0E7O0VBRUU7QUFDRjtBQUNBOztFQUVFO0FBQ0Y7QUFDQTs7RUFFRTtBQUNGO0FBQ0E7O0VBRUU7QUFDRjtBQUNBOztFQUVFO0FBQ0Y7QUFDQTs7RUFHRTtBQUNGO0FBQ0E7O0VBRUU7QUFDRjtBQUNBOztFQUVFO0FBQ0Y7QUFDQTs7RUFHRTtBQUNGO0FBQ0E7O0VBUUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztFQU9FO0FBQ0Y7QUFDQTs7RUFHRTtBQUNGO0FBQ0E7O0VBR0U7QUFDRjtBQUNBOztFQW9CRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztFQWtCRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztFQWtCRTtBQUNGO0FBQ0E7QUFDQTtBQUNBOztFQWtCRTtBQUNGO0FBQ0E7QUFDQTs7RUFpQkU7QUFDRjtBQUNBO0VBbUJFQyxFQUFFLENBQUNDLEtBQUQsRUFBeUJDLFFBQXpCLEVBQTZEO0lBQzdELE9BQU8sTUFBTUYsRUFBTixDQUFTQyxLQUFULEVBQWdCQyxRQUFoQixDQUFQO0VBQ0Q7RUFFRDtBQUNGO0FBQ0E7OztFQWtERUMsSUFBSSxDQUFDRixLQUFELEVBQXlCLEdBQUdHLElBQTVCLEVBQXlDO0lBQzNDLE9BQU8sTUFBTUQsSUFBTixDQUFXRixLQUFYLEVBQWtCLEdBQUdHLElBQXJCLENBQVA7RUFDRDtFQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7RUFDRUMsV0FBVyxDQUFDQyxrQkFBRCxFQUF5Q0MsUUFBekMsRUFBdUVDLE9BQXZFLEVBQWlHO0lBQzFHO0lBRDBHLEtBdlM1R0Ysa0JBdVM0RztJQUFBLEtBblM1R0csVUFtUzRHO0lBQUEsS0EvUjVHQyxnQkErUjRHO0lBQUEsS0EzUjVHQyxTQTJSNEc7SUFBQSxLQXZSNUdDLFFBdVI0RztJQUFBLEtBblI1R0MsTUFtUjRHO0lBQUEsS0EvUTVHQyxZQStRNEc7SUFBQSxLQTNRNUdDLE1BMlE0RztJQUFBLEtBdlE1R0MsS0F1UTRHO0lBQUEsS0FuUTVHQyxVQW1RNEc7SUFBQSxLQS9QNUdDLE9BK1A0RztJQUFBLEtBMVA1R0MsSUEwUDRHO0lBQUEsS0F0UDVHQyxHQXNQNEc7SUFBQSxLQWxQNUdDLFFBa1A0RztJQUFBLEtBN081R2QsUUE2TzRHO0lBQUEsS0ExTzVHZSxhQTBPNEc7SUFBQSxLQXpPNUdDLGdDQXlPNEc7SUFBQSxLQXhPNUdDLG9CQXdPNEc7SUFHMUcsS0FBS2xCLGtCQUFMLEdBQTBCQSxrQkFBMUI7SUFDQSxLQUFLRyxVQUFMLEdBQWtCLEVBQWxCO0lBQ0EsS0FBS0MsZ0JBQUwsR0FBd0IsRUFBeEI7SUFDQSxLQUFLQyxTQUFMLEdBQWlCLEtBQWpCO0lBQ0EsS0FBS0ksTUFBTCxHQUFjVSxTQUFkO0lBQ0EsS0FBS2IsUUFBTCxHQUFnQixLQUFoQjtJQUNBLEtBQUtDLE1BQUwsR0FBYyxLQUFkO0lBQ0EsS0FBS0csS0FBTCxHQUFhUyxTQUFiO0lBQ0EsS0FBS1IsVUFBTCxHQUFrQlEsU0FBbEI7SUFDQSxLQUFLUCxPQUFMLEdBQWVPLFNBQWY7SUFDQSxLQUFLWCxZQUFMLEdBQW9CUCxRQUFwQjtJQUNBLEtBQUtnQixnQ0FBTCxHQUF5Q2YsT0FBTyxJQUFJQSxPQUFPLENBQUNlLGdDQUFwQixJQUF5REcsaURBQTBDQyxvQkFBM0k7SUFDQSxLQUFLSCxvQkFBTCxHQUE0QixLQUE1Qjs7SUFDQSxLQUFLakIsUUFBTCxHQUFnQixVQUFTcUIsR0FBVCxFQUF3Q1AsUUFBeEMsRUFBMkRGLElBQTNELEVBQXVFO01BQ3JGLElBQUksS0FBS1IsU0FBVCxFQUFvQjtRQUNsQixLQUFLQSxTQUFMLEdBQWlCLEtBQWpCOztRQUNBLElBQUlpQixHQUFKLEVBQVM7VUFDUCxLQUFLekIsSUFBTCxDQUFVLE9BQVYsRUFBbUJ5QixHQUFuQjtRQUNELENBRkQsTUFFTztVQUNMLEtBQUt6QixJQUFMLENBQVUsVUFBVjtRQUNEO01BQ0YsQ0FQRCxNQU9PO1FBQ0wsS0FBS1csWUFBTCxDQUFrQmMsR0FBbEIsRUFBdUJQLFFBQXZCLEVBQWlDRixJQUFqQztRQUNBLEtBQUtoQixJQUFMLENBQVUsa0JBQVY7TUFDRDtJQUNGLENBWkQ7RUFhRDtFQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFOzs7RUFDQTBCLFlBQVksQ0FBQ0MsSUFBRCxFQUFlQyxJQUFmLEVBQStCQyxLQUEvQixFQUFnRHhCLE9BQWhELEVBQTZGO0lBQ3ZHLE1BQU07TUFBRXlCLE1BQU0sR0FBRyxLQUFYO01BQWtCQyxNQUFsQjtNQUEwQkMsU0FBMUI7TUFBcUNDO0lBQXJDLElBQStDNUIsT0FBTyxJQUFJLEVBQWhFO0lBRUEsTUFBTTZCLFNBQW9CLEdBQUc7TUFDM0JOLElBQUksRUFBRUEsSUFEcUI7TUFFM0JELElBQUksRUFBRUEsSUFGcUI7TUFHM0JFLEtBQUssRUFBRUEsS0FIb0I7TUFJM0JDLE1BQU0sRUFBRUEsTUFKbUI7TUFLM0JDLE1BQU0sRUFBRUEsTUFMbUI7TUFNM0JDLFNBQVMsRUFBRUEsU0FOZ0I7TUFPM0JDLEtBQUssRUFBRUE7SUFQb0IsQ0FBN0I7SUFVQSxLQUFLM0IsVUFBTCxDQUFnQjZCLElBQWhCLENBQXFCRCxTQUFyQjtJQUNBLEtBQUszQixnQkFBTCxDQUFzQm9CLElBQXRCLElBQThCTyxTQUE5QjtFQUNEO0VBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7RUFDRUUsa0JBQWtCLENBQUNULElBQUQsRUFBZUMsSUFBZixFQUErQkMsS0FBL0IsRUFBZ0R4QixPQUFoRCxFQUE2RjtJQUM3RyxLQUFLcUIsWUFBTCxDQUFrQkMsSUFBbEIsRUFBd0JDLElBQXhCLEVBQThCQyxLQUE5QixFQUFxQyxFQUFFLEdBQUd4QixPQUFMO01BQWN5QixNQUFNLEVBQUU7SUFBdEIsQ0FBckM7RUFDRDtFQUVEO0FBQ0Y7QUFDQTs7O0VBQ0VPLG1CQUFtQixDQUFDL0IsVUFBRCxFQUEwQjtJQUMzQyxJQUFJZ0MsZUFBZSxHQUFHLEVBQXRCOztJQUNBLEtBQUssSUFBSUMsQ0FBQyxHQUFHLENBQVIsRUFBV0MsR0FBRyxHQUFHbEMsVUFBVSxDQUFDeUIsTUFBakMsRUFBeUNRLENBQUMsR0FBR0MsR0FBN0MsRUFBa0RELENBQUMsRUFBbkQsRUFBdUQ7TUFDckQsTUFBTUwsU0FBUyxHQUFHNUIsVUFBVSxDQUFDaUMsQ0FBRCxDQUE1Qjs7TUFDQSxJQUFJRCxlQUFlLENBQUNQLE1BQWhCLEdBQXlCLENBQTdCLEVBQWdDO1FBQzlCTyxlQUFlLElBQUksSUFBbkI7TUFDRDs7TUFDREEsZUFBZSxJQUFJLE1BQU1KLFNBQVMsQ0FBQ1AsSUFBaEIsR0FBdUIsR0FBMUM7TUFDQVcsZUFBZSxJQUFJSixTQUFTLENBQUNOLElBQVYsQ0FBZWEsV0FBZixDQUEyQlAsU0FBM0IsQ0FBbkI7O01BQ0EsSUFBSUEsU0FBUyxDQUFDSixNQUFkLEVBQXNCO1FBQ3BCUSxlQUFlLElBQUksU0FBbkI7TUFDRDtJQUNGOztJQUNELE9BQU9BLGVBQVA7RUFDRDtFQUVEO0FBQ0Y7QUFDQTs7O0VBQ0VJLGtCQUFrQixDQUFDQyxTQUFELEVBQW1DO0lBQ25ELEtBQUssSUFBSUosQ0FBQyxHQUFHLENBQVIsRUFBV0MsR0FBRyxHQUFHLEtBQUtsQyxVQUFMLENBQWdCeUIsTUFBdEMsRUFBOENRLENBQUMsR0FBR0MsR0FBbEQsRUFBdURELENBQUMsRUFBeEQsRUFBNEQ7TUFDMUQsTUFBTUwsU0FBUyxHQUFHLEtBQUs1QixVQUFMLENBQWdCaUMsQ0FBaEIsQ0FBbEI7O01BRUEsSUFBSTtRQUNGTCxTQUFTLENBQUNMLEtBQVYsR0FBa0JLLFNBQVMsQ0FBQ04sSUFBVixDQUFlZ0IsUUFBZixDQUF3QlYsU0FBUyxDQUFDTCxLQUFsQyxFQUF5Q2MsU0FBekMsQ0FBbEI7TUFDRCxDQUZELENBRUUsT0FBTzlCLEtBQVAsRUFBbUI7UUFDbkIsTUFBTSxJQUFJZ0Msb0JBQUosQ0FBaUIsdUNBQXVDWCxTQUFTLENBQUNQLElBQWpELEdBQXdELE1BQXhELEdBQWlFZCxLQUFLLENBQUNpQyxPQUF4RixFQUFpRyxRQUFqRyxDQUFOO01BQ0Q7SUFDRjtFQUNGO0VBRUQ7QUFDRjtBQUNBO0FBQ0E7OztFQUNFQyxLQUFLLEdBQUc7SUFDTixJQUFJLEtBQUtyQyxNQUFULEVBQWlCO01BQ2Y7SUFDRDs7SUFDRCxLQUFLVixJQUFMLENBQVUsT0FBVjtJQUNBLEtBQUtVLE1BQUwsR0FBYyxJQUFkO0VBQ0Q7RUFFRDtBQUNGO0FBQ0E7QUFDQTs7O0VBQ0VzQyxNQUFNLEdBQUc7SUFDUCxJQUFJLENBQUMsS0FBS3RDLE1BQVYsRUFBa0I7TUFDaEI7SUFDRDs7SUFDRCxLQUFLQSxNQUFMLEdBQWMsS0FBZDtJQUNBLEtBQUtWLElBQUwsQ0FBVSxRQUFWO0VBQ0Q7RUFFRDtBQUNGO0FBQ0E7OztFQUNFaUQsTUFBTSxHQUFHO0lBQ1AsSUFBSSxLQUFLeEMsUUFBVCxFQUFtQjtNQUNqQjtJQUNEOztJQUVELEtBQUtBLFFBQUwsR0FBZ0IsSUFBaEI7SUFDQSxLQUFLVCxJQUFMLENBQVUsUUFBVjtFQUNEO0VBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0VBQ0VrRCxVQUFVLENBQUNuQyxPQUFELEVBQW1CO0lBQzNCLEtBQUtBLE9BQUwsR0FBZUEsT0FBZjtFQUNEOztBQTljZ0M7O2VBaWRwQnBCLE87O0FBQ2Z3RCxNQUFNLENBQUNDLE9BQVAsR0FBaUJ6RCxPQUFqQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _writableTrackingBuffer = _interopRequireDefault(require("./tracking-buffer/writable-tracking-buffer"));

var _allHeaders = require("./all-headers");

let _Symbol$iterator;

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// const OPTION = {
//   WITH_RECOMPILE: 0x01,
//   NO_METADATA: 0x02,
//   REUSE_METADATA: 0x04
// };
const STATUS = {
  BY_REF_VALUE: 0x01,
  DEFAULT_VALUE: 0x02
};
/*
  s2.2.6.5
 */

_Symbol$iterator = Symbol.iterator;

class RpcRequestPayload {
  constructor(procedure, parameters, txnDescriptor, options, collation) {
    this.procedure = void 0;
    this.parameters = void 0;
    this.options = void 0;
    this.txnDescriptor = void 0;
    this.collation = void 0;
    this.procedure = procedure;
    this.parameters = parameters;
    this.options = options;
    this.txnDescriptor = txnDescriptor;
    this.collation = collation;
  }

  [_Symbol$iterator]() {
    return this.generateData();
  }

  *generateData() {
    const buffer = new _writableTrackingBuffer.default(500);

    if (this.options.tdsVersion >= '7_2') {
      const outstandingRequestCount = 1;
      (0, _allHeaders.writeToTrackingBuffer)(buffer, this.txnDescriptor, outstandingRequestCount);
    }

    if (typeof this.procedure === 'string') {
      buffer.writeUsVarchar(this.procedure);
    } else {
      buffer.writeUShort(0xFFFF);
      buffer.writeUShort(this.procedure);
    }

    const optionFlags = 0;
    buffer.writeUInt16LE(optionFlags);
    yield buffer.data;
    const parametersLength = this.parameters.length;

    for (let i = 0; i < parametersLength; i++) {
      yield* this.generateParameterData(this.parameters[i]);
    }
  }

  toString(indent = '') {
    return indent + ('RPC Request - ' + this.procedure);
  }

  *generateParameterData(parameter) {
    const buffer = new _writableTrackingBuffer.default(1 + 2 + Buffer.byteLength(parameter.name, 'ucs-2') + 1);
    buffer.writeBVarchar('@' + parameter.name);
    let statusFlags = 0;

    if (parameter.output) {
      statusFlags |= STATUS.BY_REF_VALUE;
    }

    buffer.writeUInt8(statusFlags);
    yield buffer.data;
    const param = {
      value: parameter.value
    };
    const type = parameter.type;

    if ((type.id & 0x30) === 0x20) {
      if (parameter.length) {
        param.length = parameter.length;
      } else if (type.resolveLength) {
        param.length = type.resolveLength(parameter);
      }
    }

    if (parameter.precision) {
      param.precision = parameter.precision;
    } else if (type.resolvePrecision) {
      param.precision = type.resolvePrecision(parameter);
    }

    if (parameter.scale) {
      param.scale = parameter.scale;
    } else if (type.resolveScale) {
      param.scale = type.resolveScale(parameter);
    }

    if (this.collation) {
      param.collation = this.collation;
    }

    yield type.generateTypeInfo(param, this.options);
    yield type.generateParameterLength(param, this.options);
    yield* type.generateParameterData(param, this.options);
  }

}

var _default = RpcRequestPayload;
exports.default = _default;
module.exports = RpcRequestPayload;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTVEFUVVMiLCJCWV9SRUZfVkFMVUUiLCJERUZBVUxUX1ZBTFVFIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJScGNSZXF1ZXN0UGF5bG9hZCIsImNvbnN0cnVjdG9yIiwicHJvY2VkdXJlIiwicGFyYW1ldGVycyIsInR4bkRlc2NyaXB0b3IiLCJvcHRpb25zIiwiY29sbGF0aW9uIiwiZ2VuZXJhdGVEYXRhIiwiYnVmZmVyIiwiV3JpdGFibGVUcmFja2luZ0J1ZmZlciIsInRkc1ZlcnNpb24iLCJvdXRzdGFuZGluZ1JlcXVlc3RDb3VudCIsIndyaXRlVXNWYXJjaGFyIiwid3JpdGVVU2hvcnQiLCJvcHRpb25GbGFncyIsIndyaXRlVUludDE2TEUiLCJkYXRhIiwicGFyYW1ldGVyc0xlbmd0aCIsImxlbmd0aCIsImkiLCJnZW5lcmF0ZVBhcmFtZXRlckRhdGEiLCJ0b1N0cmluZyIsImluZGVudCIsInBhcmFtZXRlciIsIkJ1ZmZlciIsImJ5dGVMZW5ndGgiLCJuYW1lIiwid3JpdGVCVmFyY2hhciIsInN0YXR1c0ZsYWdzIiwib3V0cHV0Iiwid3JpdGVVSW50OCIsInBhcmFtIiwidmFsdWUiLCJ0eXBlIiwiaWQiLCJyZXNvbHZlTGVuZ3RoIiwicHJlY2lzaW9uIiwicmVzb2x2ZVByZWNpc2lvbiIsInNjYWxlIiwicmVzb2x2ZVNjYWxlIiwiZ2VuZXJhdGVUeXBlSW5mbyIsImdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9ycGNyZXF1ZXN0LXBheWxvYWQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIgZnJvbSAnLi90cmFja2luZy1idWZmZXIvd3JpdGFibGUtdHJhY2tpbmctYnVmZmVyJztcbmltcG9ydCB7IHdyaXRlVG9UcmFja2luZ0J1ZmZlciB9IGZyb20gJy4vYWxsLWhlYWRlcnMnO1xuaW1wb3J0IHsgUGFyYW1ldGVyLCBQYXJhbWV0ZXJEYXRhIH0gZnJvbSAnLi9kYXRhLXR5cGUnO1xuaW1wb3J0IHsgSW50ZXJuYWxDb25uZWN0aW9uT3B0aW9ucyB9IGZyb20gJy4vY29ubmVjdGlvbic7XG5pbXBvcnQgeyBDb2xsYXRpb24gfSBmcm9tICcuL2NvbGxhdGlvbic7XG5cbi8vIGNvbnN0IE9QVElPTiA9IHtcbi8vICAgV0lUSF9SRUNPTVBJTEU6IDB4MDEsXG4vLyAgIE5PX01FVEFEQVRBOiAweDAyLFxuLy8gICBSRVVTRV9NRVRBREFUQTogMHgwNFxuLy8gfTtcblxuY29uc3QgU1RBVFVTID0ge1xuICBCWV9SRUZfVkFMVUU6IDB4MDEsXG4gIERFRkFVTFRfVkFMVUU6IDB4MDJcbn07XG5cbi8qXG4gIHMyLjIuNi41XG4gKi9cbmNsYXNzIFJwY1JlcXVlc3RQYXlsb2FkIGltcGxlbWVudHMgSXRlcmFibGU8QnVmZmVyPiB7XG4gIHByb2NlZHVyZTogc3RyaW5nIHwgbnVtYmVyO1xuICBwYXJhbWV0ZXJzOiBQYXJhbWV0ZXJbXTtcblxuICBvcHRpb25zOiBJbnRlcm5hbENvbm5lY3Rpb25PcHRpb25zO1xuICB0eG5EZXNjcmlwdG9yOiBCdWZmZXI7XG4gIGNvbGxhdGlvbjogQ29sbGF0aW9uIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHByb2NlZHVyZTogc3RyaW5nIHwgbnVtYmVyLCBwYXJhbWV0ZXJzOiBQYXJhbWV0ZXJbXSwgdHhuRGVzY3JpcHRvcjogQnVmZmVyLCBvcHRpb25zOiBJbnRlcm5hbENvbm5lY3Rpb25PcHRpb25zLCBjb2xsYXRpb246IENvbGxhdGlvbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMucHJvY2VkdXJlID0gcHJvY2VkdXJlO1xuICAgIHRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLnR4bkRlc2NyaXB0b3IgPSB0eG5EZXNjcmlwdG9yO1xuICAgIHRoaXMuY29sbGF0aW9uID0gY29sbGF0aW9uO1xuICB9XG5cbiAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVEYXRhKCk7XG4gIH1cblxuICAqIGdlbmVyYXRlRGF0YSgpIHtcbiAgICBjb25zdCBidWZmZXIgPSBuZXcgV3JpdGFibGVUcmFja2luZ0J1ZmZlcig1MDApO1xuICAgIGlmICh0aGlzLm9wdGlvbnMudGRzVmVyc2lvbiA+PSAnN18yJykge1xuICAgICAgY29uc3Qgb3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQgPSAxO1xuICAgICAgd3JpdGVUb1RyYWNraW5nQnVmZmVyKGJ1ZmZlciwgdGhpcy50eG5EZXNjcmlwdG9yLCBvdXRzdGFuZGluZ1JlcXVlc3RDb3VudCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLnByb2NlZHVyZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ1ZmZlci53cml0ZVVzVmFyY2hhcih0aGlzLnByb2NlZHVyZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1ZmZlci53cml0ZVVTaG9ydCgweEZGRkYpO1xuICAgICAgYnVmZmVyLndyaXRlVVNob3J0KHRoaXMucHJvY2VkdXJlKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25GbGFncyA9IDA7XG4gICAgYnVmZmVyLndyaXRlVUludDE2TEUob3B0aW9uRmxhZ3MpO1xuICAgIHlpZWxkIGJ1ZmZlci5kYXRhO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyc0xlbmd0aCA9IHRoaXMucGFyYW1ldGVycy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzTGVuZ3RoOyBpKyspIHtcbiAgICAgIHlpZWxkICogdGhpcy5nZW5lcmF0ZVBhcmFtZXRlckRhdGEodGhpcy5wYXJhbWV0ZXJzW2ldKTtcbiAgICB9XG4gIH1cblxuICB0b1N0cmluZyhpbmRlbnQgPSAnJykge1xuICAgIHJldHVybiBpbmRlbnQgKyAoJ1JQQyBSZXF1ZXN0IC0gJyArIHRoaXMucHJvY2VkdXJlKTtcbiAgfVxuXG4gICogZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhKHBhcmFtZXRlcjogUGFyYW1ldGVyKSB7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIoMSArIDIgKyBCdWZmZXIuYnl0ZUxlbmd0aChwYXJhbWV0ZXIubmFtZSwgJ3Vjcy0yJykgKyAxKTtcbiAgICBidWZmZXIud3JpdGVCVmFyY2hhcignQCcgKyBwYXJhbWV0ZXIubmFtZSk7XG5cbiAgICBsZXQgc3RhdHVzRmxhZ3MgPSAwO1xuICAgIGlmIChwYXJhbWV0ZXIub3V0cHV0KSB7XG4gICAgICBzdGF0dXNGbGFncyB8PSBTVEFUVVMuQllfUkVGX1ZBTFVFO1xuICAgIH1cbiAgICBidWZmZXIud3JpdGVVSW50OChzdGF0dXNGbGFncyk7XG5cbiAgICB5aWVsZCBidWZmZXIuZGF0YTtcblxuICAgIGNvbnN0IHBhcmFtOiBQYXJhbWV0ZXJEYXRhID0geyB2YWx1ZTogcGFyYW1ldGVyLnZhbHVlIH07XG5cbiAgICBjb25zdCB0eXBlID0gcGFyYW1ldGVyLnR5cGU7XG5cbiAgICBpZiAoKHR5cGUuaWQgJiAweDMwKSA9PT0gMHgyMCkge1xuICAgICAgaWYgKHBhcmFtZXRlci5sZW5ndGgpIHtcbiAgICAgICAgcGFyYW0ubGVuZ3RoID0gcGFyYW1ldGVyLmxlbmd0aDtcbiAgICAgIH0gZWxzZSBpZiAodHlwZS5yZXNvbHZlTGVuZ3RoKSB7XG4gICAgICAgIHBhcmFtLmxlbmd0aCA9IHR5cGUucmVzb2x2ZUxlbmd0aChwYXJhbWV0ZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbWV0ZXIucHJlY2lzaW9uKSB7XG4gICAgICBwYXJhbS5wcmVjaXNpb24gPSBwYXJhbWV0ZXIucHJlY2lzaW9uO1xuICAgIH0gZWxzZSBpZiAodHlwZS5yZXNvbHZlUHJlY2lzaW9uKSB7XG4gICAgICBwYXJhbS5wcmVjaXNpb24gPSB0eXBlLnJlc29sdmVQcmVjaXNpb24ocGFyYW1ldGVyKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1ldGVyLnNjYWxlKSB7XG4gICAgICBwYXJhbS5zY2FsZSA9IHBhcmFtZXRlci5zY2FsZTtcbiAgICB9IGVsc2UgaWYgKHR5cGUucmVzb2x2ZVNjYWxlKSB7XG4gICAgICBwYXJhbS5zY2FsZSA9IHR5cGUucmVzb2x2ZVNjYWxlKHBhcmFtZXRlcik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29sbGF0aW9uKSB7XG4gICAgICBwYXJhbS5jb2xsYXRpb24gPSB0aGlzLmNvbGxhdGlvbjtcbiAgICB9XG5cbiAgICB5aWVsZCB0eXBlLmdlbmVyYXRlVHlwZUluZm8ocGFyYW0sIHRoaXMub3B0aW9ucyk7XG4gICAgeWllbGQgdHlwZS5nZW5lcmF0ZVBhcmFtZXRlckxlbmd0aChwYXJhbSwgdGhpcy5vcHRpb25zKTtcbiAgICB5aWVsZCAqIHR5cGUuZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhKHBhcmFtLCB0aGlzLm9wdGlvbnMpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJwY1JlcXVlc3RQYXlsb2FkO1xubW9kdWxlLmV4cG9ydHMgPSBScGNSZXF1ZXN0UGF5bG9hZDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsTUFBTUEsTUFBTSxHQUFHO0VBQ2JDLFlBQVksRUFBRSxJQUREO0VBRWJDLGFBQWEsRUFBRTtBQUZGLENBQWY7QUFLQTtBQUNBO0FBQ0E7O21CQWlCR0MsTUFBTSxDQUFDQyxROztBQWhCVixNQUFNQyxpQkFBTixDQUFvRDtFQVFsREMsV0FBVyxDQUFDQyxTQUFELEVBQTZCQyxVQUE3QixFQUFzREMsYUFBdEQsRUFBNkVDLE9BQTdFLEVBQWlIQyxTQUFqSCxFQUFtSjtJQUFBLEtBUDlKSixTQU84SjtJQUFBLEtBTjlKQyxVQU04SjtJQUFBLEtBSjlKRSxPQUk4SjtJQUFBLEtBSDlKRCxhQUc4SjtJQUFBLEtBRjlKRSxTQUU4SjtJQUM1SixLQUFLSixTQUFMLEdBQWlCQSxTQUFqQjtJQUNBLEtBQUtDLFVBQUwsR0FBa0JBLFVBQWxCO0lBQ0EsS0FBS0UsT0FBTCxHQUFlQSxPQUFmO0lBQ0EsS0FBS0QsYUFBTCxHQUFxQkEsYUFBckI7SUFDQSxLQUFLRSxTQUFMLEdBQWlCQSxTQUFqQjtFQUNEOztFQUVELHFCQUFvQjtJQUNsQixPQUFPLEtBQUtDLFlBQUwsRUFBUDtFQUNEOztFQUVhLENBQVpBLFlBQVksR0FBRztJQUNmLE1BQU1DLE1BQU0sR0FBRyxJQUFJQywrQkFBSixDQUEyQixHQUEzQixDQUFmOztJQUNBLElBQUksS0FBS0osT0FBTCxDQUFhSyxVQUFiLElBQTJCLEtBQS9CLEVBQXNDO01BQ3BDLE1BQU1DLHVCQUF1QixHQUFHLENBQWhDO01BQ0EsdUNBQXNCSCxNQUF0QixFQUE4QixLQUFLSixhQUFuQyxFQUFrRE8sdUJBQWxEO0lBQ0Q7O0lBRUQsSUFBSSxPQUFPLEtBQUtULFNBQVosS0FBMEIsUUFBOUIsRUFBd0M7TUFDdENNLE1BQU0sQ0FBQ0ksY0FBUCxDQUFzQixLQUFLVixTQUEzQjtJQUNELENBRkQsTUFFTztNQUNMTSxNQUFNLENBQUNLLFdBQVAsQ0FBbUIsTUFBbkI7TUFDQUwsTUFBTSxDQUFDSyxXQUFQLENBQW1CLEtBQUtYLFNBQXhCO0lBQ0Q7O0lBRUQsTUFBTVksV0FBVyxHQUFHLENBQXBCO0lBQ0FOLE1BQU0sQ0FBQ08sYUFBUCxDQUFxQkQsV0FBckI7SUFDQSxNQUFNTixNQUFNLENBQUNRLElBQWI7SUFFQSxNQUFNQyxnQkFBZ0IsR0FBRyxLQUFLZCxVQUFMLENBQWdCZSxNQUF6Qzs7SUFDQSxLQUFLLElBQUlDLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdGLGdCQUFwQixFQUFzQ0UsQ0FBQyxFQUF2QyxFQUEyQztNQUN6QyxPQUFRLEtBQUtDLHFCQUFMLENBQTJCLEtBQUtqQixVQUFMLENBQWdCZ0IsQ0FBaEIsQ0FBM0IsQ0FBUjtJQUNEO0VBQ0Y7O0VBRURFLFFBQVEsQ0FBQ0MsTUFBTSxHQUFHLEVBQVYsRUFBYztJQUNwQixPQUFPQSxNQUFNLElBQUksbUJBQW1CLEtBQUtwQixTQUE1QixDQUFiO0VBQ0Q7O0VBRXNCLENBQXJCa0IscUJBQXFCLENBQUNHLFNBQUQsRUFBdUI7SUFDNUMsTUFBTWYsTUFBTSxHQUFHLElBQUlDLCtCQUFKLENBQTJCLElBQUksQ0FBSixHQUFRZSxNQUFNLENBQUNDLFVBQVAsQ0FBa0JGLFNBQVMsQ0FBQ0csSUFBNUIsRUFBa0MsT0FBbEMsQ0FBUixHQUFxRCxDQUFoRixDQUFmO0lBQ0FsQixNQUFNLENBQUNtQixhQUFQLENBQXFCLE1BQU1KLFNBQVMsQ0FBQ0csSUFBckM7SUFFQSxJQUFJRSxXQUFXLEdBQUcsQ0FBbEI7O0lBQ0EsSUFBSUwsU0FBUyxDQUFDTSxNQUFkLEVBQXNCO01BQ3BCRCxXQUFXLElBQUlqQyxNQUFNLENBQUNDLFlBQXRCO0lBQ0Q7O0lBQ0RZLE1BQU0sQ0FBQ3NCLFVBQVAsQ0FBa0JGLFdBQWxCO0lBRUEsTUFBTXBCLE1BQU0sQ0FBQ1EsSUFBYjtJQUVBLE1BQU1lLEtBQW9CLEdBQUc7TUFBRUMsS0FBSyxFQUFFVCxTQUFTLENBQUNTO0lBQW5CLENBQTdCO0lBRUEsTUFBTUMsSUFBSSxHQUFHVixTQUFTLENBQUNVLElBQXZCOztJQUVBLElBQUksQ0FBQ0EsSUFBSSxDQUFDQyxFQUFMLEdBQVUsSUFBWCxNQUFxQixJQUF6QixFQUErQjtNQUM3QixJQUFJWCxTQUFTLENBQUNMLE1BQWQsRUFBc0I7UUFDcEJhLEtBQUssQ0FBQ2IsTUFBTixHQUFlSyxTQUFTLENBQUNMLE1BQXpCO01BQ0QsQ0FGRCxNQUVPLElBQUllLElBQUksQ0FBQ0UsYUFBVCxFQUF3QjtRQUM3QkosS0FBSyxDQUFDYixNQUFOLEdBQWVlLElBQUksQ0FBQ0UsYUFBTCxDQUFtQlosU0FBbkIsQ0FBZjtNQUNEO0lBQ0Y7O0lBRUQsSUFBSUEsU0FBUyxDQUFDYSxTQUFkLEVBQXlCO01BQ3ZCTCxLQUFLLENBQUNLLFNBQU4sR0FBa0JiLFNBQVMsQ0FBQ2EsU0FBNUI7SUFDRCxDQUZELE1BRU8sSUFBSUgsSUFBSSxDQUFDSSxnQkFBVCxFQUEyQjtNQUNoQ04sS0FBSyxDQUFDSyxTQUFOLEdBQWtCSCxJQUFJLENBQUNJLGdCQUFMLENBQXNCZCxTQUF0QixDQUFsQjtJQUNEOztJQUVELElBQUlBLFNBQVMsQ0FBQ2UsS0FBZCxFQUFxQjtNQUNuQlAsS0FBSyxDQUFDTyxLQUFOLEdBQWNmLFNBQVMsQ0FBQ2UsS0FBeEI7SUFDRCxDQUZELE1BRU8sSUFBSUwsSUFBSSxDQUFDTSxZQUFULEVBQXVCO01BQzVCUixLQUFLLENBQUNPLEtBQU4sR0FBY0wsSUFBSSxDQUFDTSxZQUFMLENBQWtCaEIsU0FBbEIsQ0FBZDtJQUNEOztJQUVELElBQUksS0FBS2pCLFNBQVQsRUFBb0I7TUFDbEJ5QixLQUFLLENBQUN6QixTQUFOLEdBQWtCLEtBQUtBLFNBQXZCO0lBQ0Q7O0lBRUQsTUFBTTJCLElBQUksQ0FBQ08sZ0JBQUwsQ0FBc0JULEtBQXRCLEVBQTZCLEtBQUsxQixPQUFsQyxDQUFOO0lBQ0EsTUFBTTRCLElBQUksQ0FBQ1EsdUJBQUwsQ0FBNkJWLEtBQTdCLEVBQW9DLEtBQUsxQixPQUF6QyxDQUFOO0lBQ0EsT0FBUTRCLElBQUksQ0FBQ2IscUJBQUwsQ0FBMkJXLEtBQTNCLEVBQWtDLEtBQUsxQixPQUF2QyxDQUFSO0VBQ0Q7O0FBM0ZpRDs7ZUE4RnJDTCxpQjs7QUFDZjBDLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjNDLGlCQUFqQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.sendInParallel = sendInParallel;
exports.sendMessage = sendMessage;

var _dgram = _interopRequireDefault(require("dgram"));

var _net = _interopRequireDefault(require("net"));

var punycode = _interopRequireWildcard(require("punycode"));

var _abortError = _interopRequireDefault(require("./errors/abort-error"));

function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }

function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

async function sendInParallel(addresses, port, request, signal) {
  if (signal.aborted) {
    throw new _abortError.default();
  }

  return await new Promise((resolve, reject) => {
    const sockets = [];
    let errorCount = 0;

    const onError = err => {
      errorCount++;

      if (errorCount === addresses.length) {
        signal.removeEventListener('abort', onAbort);
        clearSockets();
        reject(err);
      }
    };

    const onMessage = message => {
      signal.removeEventListener('abort', onAbort);
      clearSockets();
      resolve(message);
    };

    const onAbort = () => {
      clearSockets();
      reject(new _abortError.default());
    };

    const clearSockets = () => {
      for (const socket of sockets) {
        socket.removeListener('error', onError);
        socket.removeListener('message', onMessage);
        socket.close();
      }
    };

    signal.addEventListener('abort', onAbort, {
      once: true
    });

    for (let j = 0; j < addresses.length; j++) {
      const udpType = addresses[j].family === 6 ? 'udp6' : 'udp4';

      const socket = _dgram.default.createSocket(udpType);

      sockets.push(socket);
      socket.on('error', onError);
      socket.on('message', onMessage);
      socket.send(request, 0, request.length, port, addresses[j].address);
    }
  });
}

async function sendMessage(host, port, lookup, signal, request) {
  if (signal.aborted) {
    throw new _abortError.default();
  }

  let addresses;

  if (_net.default.isIP(host)) {
    addresses = [{
      address: host,
      family: _net.default.isIPv6(host) ? 6 : 4
    }];
  } else {
    addresses = await new Promise((resolve, reject) => {
      const onAbort = () => {
        reject(new _abortError.default());
      };

      signal.addEventListener('abort', onAbort);
      lookup(punycode.toASCII(host), {
        all: true
      }, (err, addresses) => {
        signal.removeEventListener('abort', onAbort);
        err ? reject(err) : resolve(addresses);
      });
    });
  }

  return await sendInParallel(addresses, port, request, signal);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzZW5kSW5QYXJhbGxlbCIsImFkZHJlc3NlcyIsInBvcnQiLCJyZXF1ZXN0Iiwic2lnbmFsIiwiYWJvcnRlZCIsIkFib3J0RXJyb3IiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInNvY2tldHMiLCJlcnJvckNvdW50Iiwib25FcnJvciIsImVyciIsImxlbmd0aCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJvbkFib3J0IiwiY2xlYXJTb2NrZXRzIiwib25NZXNzYWdlIiwibWVzc2FnZSIsInNvY2tldCIsInJlbW92ZUxpc3RlbmVyIiwiY2xvc2UiLCJhZGRFdmVudExpc3RlbmVyIiwib25jZSIsImoiLCJ1ZHBUeXBlIiwiZmFtaWx5IiwiZGdyYW0iLCJjcmVhdGVTb2NrZXQiLCJwdXNoIiwib24iLCJzZW5kIiwiYWRkcmVzcyIsInNlbmRNZXNzYWdlIiwiaG9zdCIsImxvb2t1cCIsIm5ldCIsImlzSVAiLCJpc0lQdjYiLCJwdW55Y29kZSIsInRvQVNDSUkiLCJhbGwiXSwic291cmNlcyI6WyIuLi9zcmMvc2VuZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBkZ3JhbSBmcm9tICdkZ3JhbSc7XG5pbXBvcnQgZG5zIGZyb20gJ2Rucyc7XG5pbXBvcnQgbmV0IGZyb20gJ25ldCc7XG5pbXBvcnQgKiBhcyBwdW55Y29kZSBmcm9tICdwdW55Y29kZSc7XG5pbXBvcnQgeyBBYm9ydFNpZ25hbCB9IGZyb20gJ25vZGUtYWJvcnQtY29udHJvbGxlcic7XG5cbmltcG9ydCBBYm9ydEVycm9yIGZyb20gJy4vZXJyb3JzL2Fib3J0LWVycm9yJztcblxudHlwZSBMb29rdXBGdW5jdGlvbiA9IChob3N0bmFtZTogc3RyaW5nLCBvcHRpb25zOiBkbnMuTG9va3VwQWxsT3B0aW9ucywgY2FsbGJhY2s6IChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB8IG51bGwsIGFkZHJlc3NlczogZG5zLkxvb2t1cEFkZHJlc3NbXSkgPT4gdm9pZCkgPT4gdm9pZDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmRJblBhcmFsbGVsKGFkZHJlc3NlczogZG5zLkxvb2t1cEFkZHJlc3NbXSwgcG9ydDogbnVtYmVyLCByZXF1ZXN0OiBCdWZmZXIsIHNpZ25hbDogQWJvcnRTaWduYWwpIHtcbiAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoKTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxCdWZmZXI+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzb2NrZXRzOiBkZ3JhbS5Tb2NrZXRbXSA9IFtdO1xuXG4gICAgbGV0IGVycm9yQ291bnQgPSAwO1xuXG4gICAgY29uc3Qgb25FcnJvciA9IChlcnI6IEVycm9yKSA9PiB7XG4gICAgICBlcnJvckNvdW50Kys7XG5cbiAgICAgIGlmIChlcnJvckNvdW50ID09PSBhZGRyZXNzZXMubGVuZ3RoKSB7XG4gICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQpO1xuICAgICAgICBjbGVhclNvY2tldHMoKTtcblxuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25NZXNzYWdlID0gKG1lc3NhZ2U6IEJ1ZmZlcikgPT4ge1xuICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCk7XG4gICAgICBjbGVhclNvY2tldHMoKTtcblxuICAgICAgcmVzb2x2ZShtZXNzYWdlKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb25BYm9ydCA9ICgpID0+IHtcbiAgICAgIGNsZWFyU29ja2V0cygpO1xuXG4gICAgICByZWplY3QobmV3IEFib3J0RXJyb3IoKSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGNsZWFyU29ja2V0cyA9ICgpID0+IHtcbiAgICAgIGZvciAoY29uc3Qgc29ja2V0IG9mIHNvY2tldHMpIHtcbiAgICAgICAgc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ21lc3NhZ2UnLCBvbk1lc3NhZ2UpO1xuICAgICAgICBzb2NrZXQuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCwgeyBvbmNlOiB0cnVlIH0pO1xuXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBhZGRyZXNzZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IHVkcFR5cGUgPSBhZGRyZXNzZXNbal0uZmFtaWx5ID09PSA2ID8gJ3VkcDYnIDogJ3VkcDQnO1xuXG4gICAgICBjb25zdCBzb2NrZXQgPSBkZ3JhbS5jcmVhdGVTb2NrZXQodWRwVHlwZSk7XG4gICAgICBzb2NrZXRzLnB1c2goc29ja2V0KTtcbiAgICAgIHNvY2tldC5vbignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgIHNvY2tldC5vbignbWVzc2FnZScsIG9uTWVzc2FnZSk7XG4gICAgICBzb2NrZXQuc2VuZChyZXF1ZXN0LCAwLCByZXF1ZXN0Lmxlbmd0aCwgcG9ydCwgYWRkcmVzc2VzW2pdLmFkZHJlc3MpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kTWVzc2FnZShob3N0OiBzdHJpbmcsIHBvcnQ6IG51bWJlciwgbG9va3VwOiBMb29rdXBGdW5jdGlvbiwgc2lnbmFsOiBBYm9ydFNpZ25hbCwgcmVxdWVzdDogQnVmZmVyKSB7XG4gIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgIHRocm93IG5ldyBBYm9ydEVycm9yKCk7XG4gIH1cblxuICBsZXQgYWRkcmVzc2VzOiBkbnMuTG9va3VwQWRkcmVzc1tdO1xuXG4gIGlmIChuZXQuaXNJUChob3N0KSkge1xuICAgIGFkZHJlc3NlcyA9IFtcbiAgICAgIHsgYWRkcmVzczogaG9zdCwgZmFtaWx5OiBuZXQuaXNJUHY2KGhvc3QpID8gNiA6IDQgfVxuICAgIF07XG4gIH0gZWxzZSB7XG4gICAgYWRkcmVzc2VzID0gYXdhaXQgbmV3IFByb21pc2U8ZG5zLkxvb2t1cEFkZHJlc3NbXT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgb25BYm9ydCA9ICgpID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBBYm9ydEVycm9yKCkpO1xuICAgICAgfTtcblxuICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCk7XG5cbiAgICAgIGxvb2t1cChwdW55Y29kZS50b0FTQ0lJKGhvc3QpLCB7IGFsbDogdHJ1ZSB9LCAoZXJyLCBhZGRyZXNzZXMpID0+IHtcbiAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCk7XG5cbiAgICAgICAgZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKGFkZHJlc3Nlcyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCBzZW5kSW5QYXJhbGxlbChhZGRyZXNzZXMsIHBvcnQsIHJlcXVlc3QsIHNpZ25hbCk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7O0FBRUE7O0FBQ0E7O0FBR0E7Ozs7Ozs7O0FBSU8sZUFBZUEsY0FBZixDQUE4QkMsU0FBOUIsRUFBOERDLElBQTlELEVBQTRFQyxPQUE1RSxFQUE2RkMsTUFBN0YsRUFBa0g7RUFDdkgsSUFBSUEsTUFBTSxDQUFDQyxPQUFYLEVBQW9CO0lBQ2xCLE1BQU0sSUFBSUMsbUJBQUosRUFBTjtFQUNEOztFQUVELE9BQU8sTUFBTSxJQUFJQyxPQUFKLENBQW9CLENBQUNDLE9BQUQsRUFBVUMsTUFBVixLQUFxQjtJQUNwRCxNQUFNQyxPQUF1QixHQUFHLEVBQWhDO0lBRUEsSUFBSUMsVUFBVSxHQUFHLENBQWpCOztJQUVBLE1BQU1DLE9BQU8sR0FBSUMsR0FBRCxJQUFnQjtNQUM5QkYsVUFBVTs7TUFFVixJQUFJQSxVQUFVLEtBQUtWLFNBQVMsQ0FBQ2EsTUFBN0IsRUFBcUM7UUFDbkNWLE1BQU0sQ0FBQ1csbUJBQVAsQ0FBMkIsT0FBM0IsRUFBb0NDLE9BQXBDO1FBQ0FDLFlBQVk7UUFFWlIsTUFBTSxDQUFDSSxHQUFELENBQU47TUFDRDtJQUNGLENBVEQ7O0lBV0EsTUFBTUssU0FBUyxHQUFJQyxPQUFELElBQXFCO01BQ3JDZixNQUFNLENBQUNXLG1CQUFQLENBQTJCLE9BQTNCLEVBQW9DQyxPQUFwQztNQUNBQyxZQUFZO01BRVpULE9BQU8sQ0FBQ1csT0FBRCxDQUFQO0lBQ0QsQ0FMRDs7SUFPQSxNQUFNSCxPQUFPLEdBQUcsTUFBTTtNQUNwQkMsWUFBWTtNQUVaUixNQUFNLENBQUMsSUFBSUgsbUJBQUosRUFBRCxDQUFOO0lBQ0QsQ0FKRDs7SUFNQSxNQUFNVyxZQUFZLEdBQUcsTUFBTTtNQUN6QixLQUFLLE1BQU1HLE1BQVgsSUFBcUJWLE9BQXJCLEVBQThCO1FBQzVCVSxNQUFNLENBQUNDLGNBQVAsQ0FBc0IsT0FBdEIsRUFBK0JULE9BQS9CO1FBQ0FRLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQixTQUF0QixFQUFpQ0gsU0FBakM7UUFDQUUsTUFBTSxDQUFDRSxLQUFQO01BQ0Q7SUFDRixDQU5EOztJQVFBbEIsTUFBTSxDQUFDbUIsZ0JBQVAsQ0FBd0IsT0FBeEIsRUFBaUNQLE9BQWpDLEVBQTBDO01BQUVRLElBQUksRUFBRTtJQUFSLENBQTFDOztJQUVBLEtBQUssSUFBSUMsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR3hCLFNBQVMsQ0FBQ2EsTUFBOUIsRUFBc0NXLENBQUMsRUFBdkMsRUFBMkM7TUFDekMsTUFBTUMsT0FBTyxHQUFHekIsU0FBUyxDQUFDd0IsQ0FBRCxDQUFULENBQWFFLE1BQWIsS0FBd0IsQ0FBeEIsR0FBNEIsTUFBNUIsR0FBcUMsTUFBckQ7O01BRUEsTUFBTVAsTUFBTSxHQUFHUSxlQUFNQyxZQUFOLENBQW1CSCxPQUFuQixDQUFmOztNQUNBaEIsT0FBTyxDQUFDb0IsSUFBUixDQUFhVixNQUFiO01BQ0FBLE1BQU0sQ0FBQ1csRUFBUCxDQUFVLE9BQVYsRUFBbUJuQixPQUFuQjtNQUNBUSxNQUFNLENBQUNXLEVBQVAsQ0FBVSxTQUFWLEVBQXFCYixTQUFyQjtNQUNBRSxNQUFNLENBQUNZLElBQVAsQ0FBWTdCLE9BQVosRUFBcUIsQ0FBckIsRUFBd0JBLE9BQU8sQ0FBQ1csTUFBaEMsRUFBd0NaLElBQXhDLEVBQThDRCxTQUFTLENBQUN3QixDQUFELENBQVQsQ0FBYVEsT0FBM0Q7SUFDRDtFQUNGLENBaERZLENBQWI7QUFpREQ7O0FBRU0sZUFBZUMsV0FBZixDQUEyQkMsSUFBM0IsRUFBeUNqQyxJQUF6QyxFQUF1RGtDLE1BQXZELEVBQStFaEMsTUFBL0UsRUFBb0dELE9BQXBHLEVBQXFIO0VBQzFILElBQUlDLE1BQU0sQ0FBQ0MsT0FBWCxFQUFvQjtJQUNsQixNQUFNLElBQUlDLG1CQUFKLEVBQU47RUFDRDs7RUFFRCxJQUFJTCxTQUFKOztFQUVBLElBQUlvQyxhQUFJQyxJQUFKLENBQVNILElBQVQsQ0FBSixFQUFvQjtJQUNsQmxDLFNBQVMsR0FBRyxDQUNWO01BQUVnQyxPQUFPLEVBQUVFLElBQVg7TUFBaUJSLE1BQU0sRUFBRVUsYUFBSUUsTUFBSixDQUFXSixJQUFYLElBQW1CLENBQW5CLEdBQXVCO0lBQWhELENBRFUsQ0FBWjtFQUdELENBSkQsTUFJTztJQUNMbEMsU0FBUyxHQUFHLE1BQU0sSUFBSU0sT0FBSixDQUFpQyxDQUFDQyxPQUFELEVBQVVDLE1BQVYsS0FBcUI7TUFDdEUsTUFBTU8sT0FBTyxHQUFHLE1BQU07UUFDcEJQLE1BQU0sQ0FBQyxJQUFJSCxtQkFBSixFQUFELENBQU47TUFDRCxDQUZEOztNQUlBRixNQUFNLENBQUNtQixnQkFBUCxDQUF3QixPQUF4QixFQUFpQ1AsT0FBakM7TUFFQW9CLE1BQU0sQ0FBQ0ksUUFBUSxDQUFDQyxPQUFULENBQWlCTixJQUFqQixDQUFELEVBQXlCO1FBQUVPLEdBQUcsRUFBRTtNQUFQLENBQXpCLEVBQXdDLENBQUM3QixHQUFELEVBQU1aLFNBQU4sS0FBb0I7UUFDaEVHLE1BQU0sQ0FBQ1csbUJBQVAsQ0FBMkIsT0FBM0IsRUFBb0NDLE9BQXBDO1FBRUFILEdBQUcsR0FBR0osTUFBTSxDQUFDSSxHQUFELENBQVQsR0FBaUJMLE9BQU8sQ0FBQ1AsU0FBRCxDQUEzQjtNQUNELENBSkssQ0FBTjtJQUtELENBWmlCLENBQWxCO0VBYUQ7O0VBRUQsT0FBTyxNQUFNRCxjQUFjLENBQUNDLFNBQUQsRUFBWUMsSUFBWixFQUFrQkMsT0FBbEIsRUFBMkJDLE1BQTNCLENBQTNCO0FBQ0QifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
const procedures = {
  Sp_Cursor: 1,
  Sp_CursorOpen: 2,
  Sp_CursorPrepare: 3,
  Sp_CursorExecute: 4,
  Sp_CursorPrepExec: 5,
  Sp_CursorUnprepare: 6,
  Sp_CursorFetch: 7,
  Sp_CursorOption: 8,
  Sp_CursorClose: 9,
  Sp_ExecuteSql: 10,
  Sp_Prepare: 11,
  Sp_Execute: 12,
  Sp_PrepExec: 13,
  Sp_PrepExecRpc: 14,
  Sp_Unprepare: 15
};
var _default = procedures;
exports.default = _default;
module.exports = procedures;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwcm9jZWR1cmVzIiwiU3BfQ3Vyc29yIiwiU3BfQ3Vyc29yT3BlbiIsIlNwX0N1cnNvclByZXBhcmUiLCJTcF9DdXJzb3JFeGVjdXRlIiwiU3BfQ3Vyc29yUHJlcEV4ZWMiLCJTcF9DdXJzb3JVbnByZXBhcmUiLCJTcF9DdXJzb3JGZXRjaCIsIlNwX0N1cnNvck9wdGlvbiIsIlNwX0N1cnNvckNsb3NlIiwiU3BfRXhlY3V0ZVNxbCIsIlNwX1ByZXBhcmUiLCJTcF9FeGVjdXRlIiwiU3BfUHJlcEV4ZWMiLCJTcF9QcmVwRXhlY1JwYyIsIlNwX1VucHJlcGFyZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi9zcmMvc3BlY2lhbC1zdG9yZWQtcHJvY2VkdXJlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IHByb2NlZHVyZXMgPSB7XG4gIFNwX0N1cnNvcjogMSxcbiAgU3BfQ3Vyc29yT3BlbjogMixcbiAgU3BfQ3Vyc29yUHJlcGFyZTogMyxcbiAgU3BfQ3Vyc29yRXhlY3V0ZTogNCxcbiAgU3BfQ3Vyc29yUHJlcEV4ZWM6IDUsXG4gIFNwX0N1cnNvclVucHJlcGFyZTogNixcbiAgU3BfQ3Vyc29yRmV0Y2g6IDcsXG4gIFNwX0N1cnNvck9wdGlvbjogOCxcbiAgU3BfQ3Vyc29yQ2xvc2U6IDksXG4gIFNwX0V4ZWN1dGVTcWw6IDEwLFxuICBTcF9QcmVwYXJlOiAxMSxcbiAgU3BfRXhlY3V0ZTogMTIsXG4gIFNwX1ByZXBFeGVjOiAxMyxcbiAgU3BfUHJlcEV4ZWNScGM6IDE0LFxuICBTcF9VbnByZXBhcmU6IDE1XG59O1xuXG5leHBvcnQgZGVmYXVsdCBwcm9jZWR1cmVzO1xubW9kdWxlLmV4cG9ydHMgPSBwcm9jZWR1cmVzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxNQUFNQSxVQUFVLEdBQUc7RUFDakJDLFNBQVMsRUFBRSxDQURNO0VBRWpCQyxhQUFhLEVBQUUsQ0FGRTtFQUdqQkMsZ0JBQWdCLEVBQUUsQ0FIRDtFQUlqQkMsZ0JBQWdCLEVBQUUsQ0FKRDtFQUtqQkMsaUJBQWlCLEVBQUUsQ0FMRjtFQU1qQkMsa0JBQWtCLEVBQUUsQ0FOSDtFQU9qQkMsY0FBYyxFQUFFLENBUEM7RUFRakJDLGVBQWUsRUFBRSxDQVJBO0VBU2pCQyxjQUFjLEVBQUUsQ0FUQztFQVVqQkMsYUFBYSxFQUFFLEVBVkU7RUFXakJDLFVBQVUsRUFBRSxFQVhLO0VBWWpCQyxVQUFVLEVBQUUsRUFaSztFQWFqQkMsV0FBVyxFQUFFLEVBYkk7RUFjakJDLGNBQWMsRUFBRSxFQWRDO0VBZWpCQyxZQUFZLEVBQUU7QUFmRyxDQUFuQjtlQWtCZWYsVTs7QUFDZmdCLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQmpCLFVBQWpCIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _writableTrackingBuffer = _interopRequireDefault(require("./tracking-buffer/writable-tracking-buffer"));

var _allHeaders = require("./all-headers");

let _Symbol$iterator;

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

_Symbol$iterator = Symbol.iterator;

/*
  s2.2.6.6
 */
class SqlBatchPayload {
  constructor(sqlText, txnDescriptor, options) {
    this.sqlText = void 0;
    this.txnDescriptor = void 0;
    this.options = void 0;
    this.sqlText = sqlText;
    this.txnDescriptor = txnDescriptor;
    this.options = options;
  }

  *[_Symbol$iterator]() {
    if (this.options.tdsVersion >= '7_2') {
      const buffer = new _writableTrackingBuffer.default(18, 'ucs2');
      const outstandingRequestCount = 1;
      (0, _allHeaders.writeToTrackingBuffer)(buffer, this.txnDescriptor, outstandingRequestCount);
      yield buffer.data;
    }

    yield Buffer.from(this.sqlText, 'ucs2');
  }

  toString(indent = '') {
    return indent + ('SQL Batch - ' + this.sqlText);
  }

}

var _default = SqlBatchPayload;
exports.default = _default;
module.exports = SqlBatchPayload;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTeW1ib2wiLCJpdGVyYXRvciIsIlNxbEJhdGNoUGF5bG9hZCIsImNvbnN0cnVjdG9yIiwic3FsVGV4dCIsInR4bkRlc2NyaXB0b3IiLCJvcHRpb25zIiwidGRzVmVyc2lvbiIsImJ1ZmZlciIsIldyaXRhYmxlVHJhY2tpbmdCdWZmZXIiLCJvdXRzdGFuZGluZ1JlcXVlc3RDb3VudCIsImRhdGEiLCJCdWZmZXIiLCJmcm9tIiwidG9TdHJpbmciLCJpbmRlbnQiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL3NxbGJhdGNoLXBheWxvYWQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIgZnJvbSAnLi90cmFja2luZy1idWZmZXIvd3JpdGFibGUtdHJhY2tpbmctYnVmZmVyJztcbmltcG9ydCB7IHdyaXRlVG9UcmFja2luZ0J1ZmZlciB9IGZyb20gJy4vYWxsLWhlYWRlcnMnO1xuXG4vKlxuICBzMi4yLjYuNlxuICovXG5jbGFzcyBTcWxCYXRjaFBheWxvYWQgaW1wbGVtZW50cyBJdGVyYWJsZTxCdWZmZXI+IHtcbiAgc3FsVGV4dDogc3RyaW5nO1xuICB0eG5EZXNjcmlwdG9yOiBCdWZmZXI7XG4gIG9wdGlvbnM6IHsgdGRzVmVyc2lvbjogc3RyaW5nIH07XG5cbiAgY29uc3RydWN0b3Ioc3FsVGV4dDogc3RyaW5nLCB0eG5EZXNjcmlwdG9yOiBCdWZmZXIsIG9wdGlvbnM6IHsgdGRzVmVyc2lvbjogc3RyaW5nIH0pIHtcbiAgICB0aGlzLnNxbFRleHQgPSBzcWxUZXh0O1xuICAgIHRoaXMudHhuRGVzY3JpcHRvciA9IHR4bkRlc2NyaXB0b3I7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxuXG4gICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnRkc1ZlcnNpb24gPj0gJzdfMicpIHtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBXcml0YWJsZVRyYWNraW5nQnVmZmVyKDE4LCAndWNzMicpO1xuICAgICAgY29uc3Qgb3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQgPSAxO1xuXG4gICAgICB3cml0ZVRvVHJhY2tpbmdCdWZmZXIoYnVmZmVyLCB0aGlzLnR4bkRlc2NyaXB0b3IsIG91dHN0YW5kaW5nUmVxdWVzdENvdW50KTtcblxuICAgICAgeWllbGQgYnVmZmVyLmRhdGE7XG4gICAgfVxuXG4gICAgeWllbGQgQnVmZmVyLmZyb20odGhpcy5zcWxUZXh0LCAndWNzMicpO1xuICB9XG5cbiAgdG9TdHJpbmcoaW5kZW50ID0gJycpIHtcbiAgICByZXR1cm4gaW5kZW50ICsgKCdTUUwgQmF0Y2ggLSAnICsgdGhpcy5zcWxUZXh0KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTcWxCYXRjaFBheWxvYWQ7XG5tb2R1bGUuZXhwb3J0cyA9IFNxbEJhdGNoUGF5bG9hZDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOzs7Ozs7bUJBZ0JJQSxNQUFNLENBQUNDLFE7O0FBZFg7QUFDQTtBQUNBO0FBQ0EsTUFBTUMsZUFBTixDQUFrRDtFQUtoREMsV0FBVyxDQUFDQyxPQUFELEVBQWtCQyxhQUFsQixFQUF5Q0MsT0FBekMsRUFBMEU7SUFBQSxLQUpyRkYsT0FJcUY7SUFBQSxLQUhyRkMsYUFHcUY7SUFBQSxLQUZyRkMsT0FFcUY7SUFDbkYsS0FBS0YsT0FBTCxHQUFlQSxPQUFmO0lBQ0EsS0FBS0MsYUFBTCxHQUFxQkEsYUFBckI7SUFDQSxLQUFLQyxPQUFMLEdBQWVBLE9BQWY7RUFDRDs7RUFFRCxzQkFBcUI7SUFDbkIsSUFBSSxLQUFLQSxPQUFMLENBQWFDLFVBQWIsSUFBMkIsS0FBL0IsRUFBc0M7TUFDcEMsTUFBTUMsTUFBTSxHQUFHLElBQUlDLCtCQUFKLENBQTJCLEVBQTNCLEVBQStCLE1BQS9CLENBQWY7TUFDQSxNQUFNQyx1QkFBdUIsR0FBRyxDQUFoQztNQUVBLHVDQUFzQkYsTUFBdEIsRUFBOEIsS0FBS0gsYUFBbkMsRUFBa0RLLHVCQUFsRDtNQUVBLE1BQU1GLE1BQU0sQ0FBQ0csSUFBYjtJQUNEOztJQUVELE1BQU1DLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLEtBQUtULE9BQWpCLEVBQTBCLE1BQTFCLENBQU47RUFDRDs7RUFFRFUsUUFBUSxDQUFDQyxNQUFNLEdBQUcsRUFBVixFQUFjO0lBQ3BCLE9BQU9BLE1BQU0sSUFBSSxpQkFBaUIsS0FBS1gsT0FBMUIsQ0FBYjtFQUNEOztBQTFCK0M7O2VBNkJuQ0YsZTs7QUFDZmMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCZixlQUFqQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.versionsByValue = exports.versions = void 0;
const versions = {
  '7_1': 0x71000001,
  '7_2': 0x72090002,
  '7_3_A': 0x730A0003,
  '7_3_B': 0x730B0003,
  '7_4': 0x74000004
};
exports.versions = versions;
const versionsByValue = {};
exports.versionsByValue = versionsByValue;

for (const name in versions) {
  versionsByValue[versions[name]] = name;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ2ZXJzaW9ucyIsInZlcnNpb25zQnlWYWx1ZSIsIm5hbWUiXSwic291cmNlcyI6WyIuLi9zcmMvdGRzLXZlcnNpb25zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCB2ZXJzaW9uczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHtcbiAgJzdfMSc6IDB4NzEwMDAwMDEsXG4gICc3XzInOiAweDcyMDkwMDAyLFxuICAnN18zX0EnOiAweDczMEEwMDAzLFxuICAnN18zX0InOiAweDczMEIwMDAzLFxuICAnN180JzogMHg3NDAwMDAwNFxufTtcblxuZXhwb3J0IGNvbnN0IHZlcnNpb25zQnlWYWx1ZTogeyBba2V5OiBudW1iZXJdOiBzdHJpbmcgfSA9IHt9O1xuXG5mb3IgKGNvbnN0IG5hbWUgaW4gdmVyc2lvbnMpIHtcbiAgdmVyc2lvbnNCeVZhbHVlW3ZlcnNpb25zW25hbWVdXSA9IG5hbWU7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFPLE1BQU1BLFFBQW1DLEdBQUc7RUFDakQsT0FBTyxVQUQwQztFQUVqRCxPQUFPLFVBRjBDO0VBR2pELFNBQVMsVUFId0M7RUFJakQsU0FBUyxVQUp3QztFQUtqRCxPQUFPO0FBTDBDLENBQTVDOztBQVFBLE1BQU1DLGVBQTBDLEdBQUcsRUFBbkQ7OztBQUVQLEtBQUssTUFBTUMsSUFBWCxJQUFtQkYsUUFBbkIsRUFBNkI7RUFDM0JDLGVBQWUsQ0FBQ0QsUUFBUSxDQUFDRSxJQUFELENBQVQsQ0FBZixHQUFrQ0EsSUFBbEM7QUFDRCJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
Object.defineProperty(exports, "BulkLoad", {
  enumerable: true,
  get: function () {
    return _bulkLoad.default;
  }
});
Object.defineProperty(exports, "Connection", {
  enumerable: true,
  get: function () {
    return _connection.default;
  }
});
Object.defineProperty(exports, "ConnectionError", {
  enumerable: true,
  get: function () {
    return _errors.ConnectionError;
  }
});
Object.defineProperty(exports, "ISOLATION_LEVEL", {
  enumerable: true,
  get: function () {
    return _transaction.ISOLATION_LEVEL;
  }
});
Object.defineProperty(exports, "Request", {
  enumerable: true,
  get: function () {
    return _request.default;
  }
});
Object.defineProperty(exports, "RequestError", {
  enumerable: true,
  get: function () {
    return _errors.RequestError;
  }
});
Object.defineProperty(exports, "TDS_VERSION", {
  enumerable: true,
  get: function () {
    return _tdsVersions.versions;
  }
});
Object.defineProperty(exports, "TYPES", {
  enumerable: true,
  get: function () {
    return _dataType.TYPES;
  }
});
exports.connect = connect;
exports.library = void 0;

var _bulkLoad = _interopRequireDefault(require("./bulk-load"));

var _connection = _interopRequireDefault(require("./connection"));

var _request = _interopRequireDefault(require("./request"));

var _library = require("./library");

var _errors = require("./errors");

var _dataType = require("./data-type");

var _transaction = require("./transaction");

var _tdsVersions = require("./tds-versions");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const library = {
  name: _library.name
};
exports.library = library;

function connect(config, connectListener) {
  const connection = new _connection.default(config);
  connection.connect(connectListener);
  return connection;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsaWJyYXJ5IiwibmFtZSIsImNvbm5lY3QiLCJjb25maWciLCJjb25uZWN0TGlzdGVuZXIiLCJjb25uZWN0aW9uIiwiQ29ubmVjdGlvbiJdLCJzb3VyY2VzIjpbIi4uL3NyYy90ZWRpb3VzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCdWxrTG9hZCBmcm9tICcuL2J1bGstbG9hZCc7XG5pbXBvcnQgQ29ubmVjdGlvbiwgeyBDb25uZWN0aW9uQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vY29ubmVjdGlvbic7XG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuL3JlcXVlc3QnO1xuaW1wb3J0IHsgbmFtZSB9IGZyb20gJy4vbGlicmFyeSc7XG5cbmltcG9ydCB7IENvbm5lY3Rpb25FcnJvciwgUmVxdWVzdEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuXG5pbXBvcnQgeyBUWVBFUyB9IGZyb20gJy4vZGF0YS10eXBlJztcbmltcG9ydCB7IElTT0xBVElPTl9MRVZFTCB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgdmVyc2lvbnMgYXMgVERTX1ZFUlNJT04gfSBmcm9tICcuL3Rkcy12ZXJzaW9ucyc7XG5cbmNvbnN0IGxpYnJhcnkgPSB7IG5hbWU6IG5hbWUgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbm5lY3QoY29uZmlnOiBDb25uZWN0aW9uQ29uZmlndXJhdGlvbiwgY29ubmVjdExpc3RlbmVyPzogKGVycj86IEVycm9yKSA9PiB2b2lkKSB7XG4gIGNvbnN0IGNvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbihjb25maWcpO1xuICBjb25uZWN0aW9uLmNvbm5lY3QoY29ubmVjdExpc3RlbmVyKTtcbiAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG5cbmV4cG9ydCB7XG4gIEJ1bGtMb2FkLFxuICBDb25uZWN0aW9uLFxuICBSZXF1ZXN0LFxuICBsaWJyYXJ5LFxuICBDb25uZWN0aW9uRXJyb3IsXG4gIFJlcXVlc3RFcnJvcixcbiAgVFlQRVMsXG4gIElTT0xBVElPTl9MRVZFTCxcbiAgVERTX1ZFUlNJT05cbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBRUE7O0FBQ0E7O0FBQ0E7Ozs7QUFFQSxNQUFNQSxPQUFPLEdBQUc7RUFBRUMsSUFBSSxFQUFFQTtBQUFSLENBQWhCOzs7QUFFTyxTQUFTQyxPQUFULENBQWlCQyxNQUFqQixFQUFrREMsZUFBbEQsRUFBMkY7RUFDaEcsTUFBTUMsVUFBVSxHQUFHLElBQUlDLG1CQUFKLENBQWVILE1BQWYsQ0FBbkI7RUFDQUUsVUFBVSxDQUFDSCxPQUFYLENBQW1CRSxlQUFuQjtFQUNBLE9BQU9DLFVBQVA7QUFDRCJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.Transaction = exports.OPERATION_TYPE = exports.ISOLATION_LEVEL = void 0;
exports.assertValidIsolationLevel = assertValidIsolationLevel;
exports.isolationLevelByValue = void 0;

var _writableTrackingBuffer = _interopRequireDefault(require("./tracking-buffer/writable-tracking-buffer"));

var _allHeaders = require("./all-headers");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/*
  s2.2.6.8
 */
const OPERATION_TYPE = {
  TM_GET_DTC_ADDRESS: 0x00,
  TM_PROPAGATE_XACT: 0x01,
  TM_BEGIN_XACT: 0x05,
  TM_PROMOTE_XACT: 0x06,
  TM_COMMIT_XACT: 0x07,
  TM_ROLLBACK_XACT: 0x08,
  TM_SAVE_XACT: 0x09
};
exports.OPERATION_TYPE = OPERATION_TYPE;
const ISOLATION_LEVEL = {
  NO_CHANGE: 0x00,
  READ_UNCOMMITTED: 0x01,
  READ_COMMITTED: 0x02,
  REPEATABLE_READ: 0x03,
  SERIALIZABLE: 0x04,
  SNAPSHOT: 0x05
};
exports.ISOLATION_LEVEL = ISOLATION_LEVEL;
const isolationLevelByValue = {};
exports.isolationLevelByValue = isolationLevelByValue;

for (const name in ISOLATION_LEVEL) {
  const value = ISOLATION_LEVEL[name];
  isolationLevelByValue[value] = name;
}

function assertValidIsolationLevel(isolationLevel, name) {
  if (typeof isolationLevel !== 'number') {
    throw new TypeError(`The "${name}" ${name.includes('.') ? 'property' : 'argument'} must be of type number. Received type ${typeof isolationLevel} (${isolationLevel})`);
  }

  if (!Number.isInteger(isolationLevel)) {
    throw new RangeError(`The value of "${name}" is out of range. It must be an integer. Received: ${isolationLevel}`);
  }

  if (!(isolationLevel >= 0 && isolationLevel <= 5)) {
    throw new RangeError(`The value of "${name}" is out of range. It must be >= 0 && <= 5. Received: ${isolationLevel}`);
  }
}

class Transaction {
  constructor(name, isolationLevel = ISOLATION_LEVEL.NO_CHANGE) {
    this.name = void 0;
    this.isolationLevel = void 0;
    this.outstandingRequestCount = void 0;
    this.name = name;
    this.isolationLevel = isolationLevel;
    this.outstandingRequestCount = 1;
  }

  beginPayload(txnDescriptor) {
    const buffer = new _writableTrackingBuffer.default(100, 'ucs2');
    (0, _allHeaders.writeToTrackingBuffer)(buffer, txnDescriptor, this.outstandingRequestCount);
    buffer.writeUShort(OPERATION_TYPE.TM_BEGIN_XACT);
    buffer.writeUInt8(this.isolationLevel);
    buffer.writeUInt8(this.name.length * 2);
    buffer.writeString(this.name, 'ucs2');
    return {
      *[Symbol.iterator]() {
        yield buffer.data;
      },

      toString: () => {
        return 'Begin Transaction: name=' + this.name + ', isolationLevel=' + isolationLevelByValue[this.isolationLevel];
      }
    };
  }

  commitPayload(txnDescriptor) {
    const buffer = new _writableTrackingBuffer.default(100, 'ascii');
    (0, _allHeaders.writeToTrackingBuffer)(buffer, txnDescriptor, this.outstandingRequestCount);
    buffer.writeUShort(OPERATION_TYPE.TM_COMMIT_XACT);
    buffer.writeUInt8(this.name.length * 2);
    buffer.writeString(this.name, 'ucs2'); // No fBeginXact flag, so no new transaction is started.

    buffer.writeUInt8(0);
    return {
      *[Symbol.iterator]() {
        yield buffer.data;
      },

      toString: () => {
        return 'Commit Transaction: name=' + this.name;
      }
    };
  }

  rollbackPayload(txnDescriptor) {
    const buffer = new _writableTrackingBuffer.default(100, 'ascii');
    (0, _allHeaders.writeToTrackingBuffer)(buffer, txnDescriptor, this.outstandingRequestCount);
    buffer.writeUShort(OPERATION_TYPE.TM_ROLLBACK_XACT);
    buffer.writeUInt8(this.name.length * 2);
    buffer.writeString(this.name, 'ucs2'); // No fBeginXact flag, so no new transaction is started.

    buffer.writeUInt8(0);
    return {
      *[Symbol.iterator]() {
        yield buffer.data;
      },

      toString: () => {
        return 'Rollback Transaction: name=' + this.name;
      }
    };
  }

  savePayload(txnDescriptor) {
    const buffer = new _writableTrackingBuffer.default(100, 'ascii');
    (0, _allHeaders.writeToTrackingBuffer)(buffer, txnDescriptor, this.outstandingRequestCount);
    buffer.writeUShort(OPERATION_TYPE.TM_SAVE_XACT);
    buffer.writeUInt8(this.name.length * 2);
    buffer.writeString(this.name, 'ucs2');
    return {
      *[Symbol.iterator]() {
        yield buffer.data;
      },

      toString: () => {
        return 'Save Transaction: name=' + this.name;
      }
    };
  }

  isolationLevelToTSQL() {
    switch (this.isolationLevel) {
      case ISOLATION_LEVEL.READ_UNCOMMITTED:
        return 'READ UNCOMMITTED';

      case ISOLATION_LEVEL.READ_COMMITTED:
        return 'READ COMMITTED';

      case ISOLATION_LEVEL.REPEATABLE_READ:
        return 'REPEATABLE READ';

      case ISOLATION_LEVEL.SERIALIZABLE:
        return 'SERIALIZABLE';

      case ISOLATION_LEVEL.SNAPSHOT:
        return 'SNAPSHOT';
    }

    return '';
  }

}

exports.Transaction = Transaction;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPUEVSQVRJT05fVFlQRSIsIlRNX0dFVF9EVENfQUREUkVTUyIsIlRNX1BST1BBR0FURV9YQUNUIiwiVE1fQkVHSU5fWEFDVCIsIlRNX1BST01PVEVfWEFDVCIsIlRNX0NPTU1JVF9YQUNUIiwiVE1fUk9MTEJBQ0tfWEFDVCIsIlRNX1NBVkVfWEFDVCIsIklTT0xBVElPTl9MRVZFTCIsIk5PX0NIQU5HRSIsIlJFQURfVU5DT01NSVRURUQiLCJSRUFEX0NPTU1JVFRFRCIsIlJFUEVBVEFCTEVfUkVBRCIsIlNFUklBTElaQUJMRSIsIlNOQVBTSE9UIiwiaXNvbGF0aW9uTGV2ZWxCeVZhbHVlIiwibmFtZSIsInZhbHVlIiwiYXNzZXJ0VmFsaWRJc29sYXRpb25MZXZlbCIsImlzb2xhdGlvbkxldmVsIiwiVHlwZUVycm9yIiwiaW5jbHVkZXMiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJSYW5nZUVycm9yIiwiVHJhbnNhY3Rpb24iLCJjb25zdHJ1Y3RvciIsIm91dHN0YW5kaW5nUmVxdWVzdENvdW50IiwiYmVnaW5QYXlsb2FkIiwidHhuRGVzY3JpcHRvciIsImJ1ZmZlciIsIldyaXRhYmxlVHJhY2tpbmdCdWZmZXIiLCJ3cml0ZVVTaG9ydCIsIndyaXRlVUludDgiLCJsZW5ndGgiLCJ3cml0ZVN0cmluZyIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiZGF0YSIsInRvU3RyaW5nIiwiY29tbWl0UGF5bG9hZCIsInJvbGxiYWNrUGF5bG9hZCIsInNhdmVQYXlsb2FkIiwiaXNvbGF0aW9uTGV2ZWxUb1RTUUwiXSwic291cmNlcyI6WyIuLi9zcmMvdHJhbnNhY3Rpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIgZnJvbSAnLi90cmFja2luZy1idWZmZXIvd3JpdGFibGUtdHJhY2tpbmctYnVmZmVyJztcbmltcG9ydCB7IHdyaXRlVG9UcmFja2luZ0J1ZmZlciB9IGZyb20gJy4vYWxsLWhlYWRlcnMnO1xuXG4vKlxuICBzMi4yLjYuOFxuICovXG5cbmV4cG9ydCBjb25zdCBPUEVSQVRJT05fVFlQRSA9IHtcbiAgVE1fR0VUX0RUQ19BRERSRVNTOiAweDAwLFxuICBUTV9QUk9QQUdBVEVfWEFDVDogMHgwMSxcbiAgVE1fQkVHSU5fWEFDVDogMHgwNSxcbiAgVE1fUFJPTU9URV9YQUNUOiAweDA2LFxuICBUTV9DT01NSVRfWEFDVDogMHgwNyxcbiAgVE1fUk9MTEJBQ0tfWEFDVDogMHgwOCxcbiAgVE1fU0FWRV9YQUNUOiAweDA5XG59O1xuXG5leHBvcnQgY29uc3QgSVNPTEFUSU9OX0xFVkVMOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge1xuICBOT19DSEFOR0U6IDB4MDAsXG4gIFJFQURfVU5DT01NSVRURUQ6IDB4MDEsXG4gIFJFQURfQ09NTUlUVEVEOiAweDAyLFxuICBSRVBFQVRBQkxFX1JFQUQ6IDB4MDMsXG4gIFNFUklBTElaQUJMRTogMHgwNCxcbiAgU05BUFNIT1Q6IDB4MDVcbn07XG5cbmV4cG9ydCBjb25zdCBpc29sYXRpb25MZXZlbEJ5VmFsdWU6IHsgW2tleTogbnVtYmVyXTogc3RyaW5nIH0gPSB7fTtcbmZvciAoY29uc3QgbmFtZSBpbiBJU09MQVRJT05fTEVWRUwpIHtcbiAgY29uc3QgdmFsdWUgPSBJU09MQVRJT05fTEVWRUxbbmFtZV07XG4gIGlzb2xhdGlvbkxldmVsQnlWYWx1ZVt2YWx1ZV0gPSBuYW1lO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VmFsaWRJc29sYXRpb25MZXZlbChpc29sYXRpb25MZXZlbDogYW55LCBuYW1lOiBzdHJpbmcpOiBhc3NlcnRzIGlzb2xhdGlvbkxldmVsIGlzIDAgfCAxIHwgMiB8IDMgfCA0IHwgNSB7XG4gIGlmICh0eXBlb2YgaXNvbGF0aW9uTGV2ZWwgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVGhlIFwiJHtuYW1lfVwiICR7bmFtZS5pbmNsdWRlcygnLicpID8gJ3Byb3BlcnR5JyA6ICdhcmd1bWVudCd9IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgJHt0eXBlb2YgaXNvbGF0aW9uTGV2ZWx9ICgke2lzb2xhdGlvbkxldmVsfSlgKTtcbiAgfVxuXG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihpc29sYXRpb25MZXZlbCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVGhlIHZhbHVlIG9mIFwiJHtuYW1lfVwiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhbiBpbnRlZ2VyLiBSZWNlaXZlZDogJHtpc29sYXRpb25MZXZlbH1gKTtcbiAgfVxuXG4gIGlmICghKGlzb2xhdGlvbkxldmVsID49IDAgJiYgaXNvbGF0aW9uTGV2ZWwgPD0gNSkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVGhlIHZhbHVlIG9mIFwiJHtuYW1lfVwiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSA+PSAwICYmIDw9IDUuIFJlY2VpdmVkOiAke2lzb2xhdGlvbkxldmVsfWApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiB7XG4gIG5hbWU6IHN0cmluZztcbiAgaXNvbGF0aW9uTGV2ZWw6IG51bWJlcjtcbiAgb3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQ6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIGlzb2xhdGlvbkxldmVsID0gSVNPTEFUSU9OX0xFVkVMLk5PX0NIQU5HRSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5pc29sYXRpb25MZXZlbCA9IGlzb2xhdGlvbkxldmVsO1xuICAgIHRoaXMub3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQgPSAxO1xuICB9XG5cbiAgYmVnaW5QYXlsb2FkKHR4bkRlc2NyaXB0b3I6IEJ1ZmZlcikge1xuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBXcml0YWJsZVRyYWNraW5nQnVmZmVyKDEwMCwgJ3VjczInKTtcbiAgICB3cml0ZVRvVHJhY2tpbmdCdWZmZXIoYnVmZmVyLCB0eG5EZXNjcmlwdG9yLCB0aGlzLm91dHN0YW5kaW5nUmVxdWVzdENvdW50KTtcbiAgICBidWZmZXIud3JpdGVVU2hvcnQoT1BFUkFUSU9OX1RZUEUuVE1fQkVHSU5fWEFDVCk7XG4gICAgYnVmZmVyLndyaXRlVUludDgodGhpcy5pc29sYXRpb25MZXZlbCk7XG4gICAgYnVmZmVyLndyaXRlVUludDgodGhpcy5uYW1lLmxlbmd0aCAqIDIpO1xuICAgIGJ1ZmZlci53cml0ZVN0cmluZyh0aGlzLm5hbWUsICd1Y3MyJyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICB5aWVsZCBidWZmZXIuZGF0YTtcbiAgICAgIH0sXG4gICAgICB0b1N0cmluZzogKCkgPT4ge1xuICAgICAgICByZXR1cm4gJ0JlZ2luIFRyYW5zYWN0aW9uOiBuYW1lPScgKyB0aGlzLm5hbWUgKyAnLCBpc29sYXRpb25MZXZlbD0nICsgaXNvbGF0aW9uTGV2ZWxCeVZhbHVlW3RoaXMuaXNvbGF0aW9uTGV2ZWxdO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBjb21taXRQYXlsb2FkKHR4bkRlc2NyaXB0b3I6IEJ1ZmZlcikge1xuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBXcml0YWJsZVRyYWNraW5nQnVmZmVyKDEwMCwgJ2FzY2lpJyk7XG4gICAgd3JpdGVUb1RyYWNraW5nQnVmZmVyKGJ1ZmZlciwgdHhuRGVzY3JpcHRvciwgdGhpcy5vdXRzdGFuZGluZ1JlcXVlc3RDb3VudCk7XG4gICAgYnVmZmVyLndyaXRlVVNob3J0KE9QRVJBVElPTl9UWVBFLlRNX0NPTU1JVF9YQUNUKTtcbiAgICBidWZmZXIud3JpdGVVSW50OCh0aGlzLm5hbWUubGVuZ3RoICogMik7XG4gICAgYnVmZmVyLndyaXRlU3RyaW5nKHRoaXMubmFtZSwgJ3VjczInKTtcbiAgICAvLyBObyBmQmVnaW5YYWN0IGZsYWcsIHNvIG5vIG5ldyB0cmFuc2FjdGlvbiBpcyBzdGFydGVkLlxuICAgIGJ1ZmZlci53cml0ZVVJbnQ4KDApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgeWllbGQgYnVmZmVyLmRhdGE7XG4gICAgICB9LFxuICAgICAgdG9TdHJpbmc6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuICdDb21taXQgVHJhbnNhY3Rpb246IG5hbWU9JyArIHRoaXMubmFtZTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcm9sbGJhY2tQYXlsb2FkKHR4bkRlc2NyaXB0b3I6IEJ1ZmZlcikge1xuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBXcml0YWJsZVRyYWNraW5nQnVmZmVyKDEwMCwgJ2FzY2lpJyk7XG4gICAgd3JpdGVUb1RyYWNraW5nQnVmZmVyKGJ1ZmZlciwgdHhuRGVzY3JpcHRvciwgdGhpcy5vdXRzdGFuZGluZ1JlcXVlc3RDb3VudCk7XG4gICAgYnVmZmVyLndyaXRlVVNob3J0KE9QRVJBVElPTl9UWVBFLlRNX1JPTExCQUNLX1hBQ1QpO1xuICAgIGJ1ZmZlci53cml0ZVVJbnQ4KHRoaXMubmFtZS5sZW5ndGggKiAyKTtcbiAgICBidWZmZXIud3JpdGVTdHJpbmcodGhpcy5uYW1lLCAndWNzMicpO1xuICAgIC8vIE5vIGZCZWdpblhhY3QgZmxhZywgc28gbm8gbmV3IHRyYW5zYWN0aW9uIGlzIHN0YXJ0ZWQuXG4gICAgYnVmZmVyLndyaXRlVUludDgoMCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICB5aWVsZCBidWZmZXIuZGF0YTtcbiAgICAgIH0sXG4gICAgICB0b1N0cmluZzogKCkgPT4ge1xuICAgICAgICByZXR1cm4gJ1JvbGxiYWNrIFRyYW5zYWN0aW9uOiBuYW1lPScgKyB0aGlzLm5hbWU7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHNhdmVQYXlsb2FkKHR4bkRlc2NyaXB0b3I6IEJ1ZmZlcikge1xuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBXcml0YWJsZVRyYWNraW5nQnVmZmVyKDEwMCwgJ2FzY2lpJyk7XG4gICAgd3JpdGVUb1RyYWNraW5nQnVmZmVyKGJ1ZmZlciwgdHhuRGVzY3JpcHRvciwgdGhpcy5vdXRzdGFuZGluZ1JlcXVlc3RDb3VudCk7XG4gICAgYnVmZmVyLndyaXRlVVNob3J0KE9QRVJBVElPTl9UWVBFLlRNX1NBVkVfWEFDVCk7XG4gICAgYnVmZmVyLndyaXRlVUludDgodGhpcy5uYW1lLmxlbmd0aCAqIDIpO1xuICAgIGJ1ZmZlci53cml0ZVN0cmluZyh0aGlzLm5hbWUsICd1Y3MyJyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICB5aWVsZCBidWZmZXIuZGF0YTtcbiAgICAgIH0sXG4gICAgICB0b1N0cmluZzogKCkgPT4ge1xuICAgICAgICByZXR1cm4gJ1NhdmUgVHJhbnNhY3Rpb246IG5hbWU9JyArIHRoaXMubmFtZTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgaXNvbGF0aW9uTGV2ZWxUb1RTUUwoKSB7XG4gICAgc3dpdGNoICh0aGlzLmlzb2xhdGlvbkxldmVsKSB7XG4gICAgICBjYXNlIElTT0xBVElPTl9MRVZFTC5SRUFEX1VOQ09NTUlUVEVEOlxuICAgICAgICByZXR1cm4gJ1JFQUQgVU5DT01NSVRURUQnO1xuICAgICAgY2FzZSBJU09MQVRJT05fTEVWRUwuUkVBRF9DT01NSVRURUQ6XG4gICAgICAgIHJldHVybiAnUkVBRCBDT01NSVRURUQnO1xuICAgICAgY2FzZSBJU09MQVRJT05fTEVWRUwuUkVQRUFUQUJMRV9SRUFEOlxuICAgICAgICByZXR1cm4gJ1JFUEVBVEFCTEUgUkVBRCc7XG4gICAgICBjYXNlIElTT0xBVElPTl9MRVZFTC5TRVJJQUxJWkFCTEU6XG4gICAgICAgIHJldHVybiAnU0VSSUFMSVpBQkxFJztcbiAgICAgIGNhc2UgSVNPTEFUSU9OX0xFVkVMLlNOQVBTSE9UOlxuICAgICAgICByZXR1cm4gJ1NOQVBTSE9UJztcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBOztBQUNBOzs7O0FBRUE7QUFDQTtBQUNBO0FBRU8sTUFBTUEsY0FBYyxHQUFHO0VBQzVCQyxrQkFBa0IsRUFBRSxJQURRO0VBRTVCQyxpQkFBaUIsRUFBRSxJQUZTO0VBRzVCQyxhQUFhLEVBQUUsSUFIYTtFQUk1QkMsZUFBZSxFQUFFLElBSlc7RUFLNUJDLGNBQWMsRUFBRSxJQUxZO0VBTTVCQyxnQkFBZ0IsRUFBRSxJQU5VO0VBTzVCQyxZQUFZLEVBQUU7QUFQYyxDQUF2Qjs7QUFVQSxNQUFNQyxlQUEwQyxHQUFHO0VBQ3hEQyxTQUFTLEVBQUUsSUFENkM7RUFFeERDLGdCQUFnQixFQUFFLElBRnNDO0VBR3hEQyxjQUFjLEVBQUUsSUFId0M7RUFJeERDLGVBQWUsRUFBRSxJQUp1QztFQUt4REMsWUFBWSxFQUFFLElBTDBDO0VBTXhEQyxRQUFRLEVBQUU7QUFOOEMsQ0FBbkQ7O0FBU0EsTUFBTUMscUJBQWdELEdBQUcsRUFBekQ7OztBQUNQLEtBQUssTUFBTUMsSUFBWCxJQUFtQlIsZUFBbkIsRUFBb0M7RUFDbEMsTUFBTVMsS0FBSyxHQUFHVCxlQUFlLENBQUNRLElBQUQsQ0FBN0I7RUFDQUQscUJBQXFCLENBQUNFLEtBQUQsQ0FBckIsR0FBK0JELElBQS9CO0FBQ0Q7O0FBRU0sU0FBU0UseUJBQVQsQ0FBbUNDLGNBQW5DLEVBQXdESCxJQUF4RCxFQUF1SDtFQUM1SCxJQUFJLE9BQU9HLGNBQVAsS0FBMEIsUUFBOUIsRUFBd0M7SUFDdEMsTUFBTSxJQUFJQyxTQUFKLENBQWUsUUFBT0osSUFBSyxLQUFJQSxJQUFJLENBQUNLLFFBQUwsQ0FBYyxHQUFkLElBQXFCLFVBQXJCLEdBQWtDLFVBQVcsMENBQXlDLE9BQU9GLGNBQWUsS0FBSUEsY0FBZSxHQUE5SixDQUFOO0VBQ0Q7O0VBRUQsSUFBSSxDQUFDRyxNQUFNLENBQUNDLFNBQVAsQ0FBaUJKLGNBQWpCLENBQUwsRUFBdUM7SUFDckMsTUFBTSxJQUFJSyxVQUFKLENBQWdCLGlCQUFnQlIsSUFBSyx1REFBc0RHLGNBQWUsRUFBMUcsQ0FBTjtFQUNEOztFQUVELElBQUksRUFBRUEsY0FBYyxJQUFJLENBQWxCLElBQXVCQSxjQUFjLElBQUksQ0FBM0MsQ0FBSixFQUFtRDtJQUNqRCxNQUFNLElBQUlLLFVBQUosQ0FBZ0IsaUJBQWdCUixJQUFLLHlEQUF3REcsY0FBZSxFQUE1RyxDQUFOO0VBQ0Q7QUFDRjs7QUFFTSxNQUFNTSxXQUFOLENBQWtCO0VBS3ZCQyxXQUFXLENBQUNWLElBQUQsRUFBZUcsY0FBYyxHQUFHWCxlQUFlLENBQUNDLFNBQWhELEVBQTJEO0lBQUEsS0FKdEVPLElBSXNFO0lBQUEsS0FIdEVHLGNBR3NFO0lBQUEsS0FGdEVRLHVCQUVzRTtJQUNwRSxLQUFLWCxJQUFMLEdBQVlBLElBQVo7SUFDQSxLQUFLRyxjQUFMLEdBQXNCQSxjQUF0QjtJQUNBLEtBQUtRLHVCQUFMLEdBQStCLENBQS9CO0VBQ0Q7O0VBRURDLFlBQVksQ0FBQ0MsYUFBRCxFQUF3QjtJQUNsQyxNQUFNQyxNQUFNLEdBQUcsSUFBSUMsK0JBQUosQ0FBMkIsR0FBM0IsRUFBZ0MsTUFBaEMsQ0FBZjtJQUNBLHVDQUFzQkQsTUFBdEIsRUFBOEJELGFBQTlCLEVBQTZDLEtBQUtGLHVCQUFsRDtJQUNBRyxNQUFNLENBQUNFLFdBQVAsQ0FBbUJoQyxjQUFjLENBQUNHLGFBQWxDO0lBQ0EyQixNQUFNLENBQUNHLFVBQVAsQ0FBa0IsS0FBS2QsY0FBdkI7SUFDQVcsTUFBTSxDQUFDRyxVQUFQLENBQWtCLEtBQUtqQixJQUFMLENBQVVrQixNQUFWLEdBQW1CLENBQXJDO0lBQ0FKLE1BQU0sQ0FBQ0ssV0FBUCxDQUFtQixLQUFLbkIsSUFBeEIsRUFBOEIsTUFBOUI7SUFFQSxPQUFPO01BQ0wsRUFBRW9CLE1BQU0sQ0FBQ0MsUUFBVCxJQUFxQjtRQUNuQixNQUFNUCxNQUFNLENBQUNRLElBQWI7TUFDRCxDQUhJOztNQUlMQyxRQUFRLEVBQUUsTUFBTTtRQUNkLE9BQU8sNkJBQTZCLEtBQUt2QixJQUFsQyxHQUF5QyxtQkFBekMsR0FBK0RELHFCQUFxQixDQUFDLEtBQUtJLGNBQU4sQ0FBM0Y7TUFDRDtJQU5JLENBQVA7RUFRRDs7RUFFRHFCLGFBQWEsQ0FBQ1gsYUFBRCxFQUF3QjtJQUNuQyxNQUFNQyxNQUFNLEdBQUcsSUFBSUMsK0JBQUosQ0FBMkIsR0FBM0IsRUFBZ0MsT0FBaEMsQ0FBZjtJQUNBLHVDQUFzQkQsTUFBdEIsRUFBOEJELGFBQTlCLEVBQTZDLEtBQUtGLHVCQUFsRDtJQUNBRyxNQUFNLENBQUNFLFdBQVAsQ0FBbUJoQyxjQUFjLENBQUNLLGNBQWxDO0lBQ0F5QixNQUFNLENBQUNHLFVBQVAsQ0FBa0IsS0FBS2pCLElBQUwsQ0FBVWtCLE1BQVYsR0FBbUIsQ0FBckM7SUFDQUosTUFBTSxDQUFDSyxXQUFQLENBQW1CLEtBQUtuQixJQUF4QixFQUE4QixNQUE5QixFQUxtQyxDQU1uQzs7SUFDQWMsTUFBTSxDQUFDRyxVQUFQLENBQWtCLENBQWxCO0lBRUEsT0FBTztNQUNMLEVBQUVHLE1BQU0sQ0FBQ0MsUUFBVCxJQUFxQjtRQUNuQixNQUFNUCxNQUFNLENBQUNRLElBQWI7TUFDRCxDQUhJOztNQUlMQyxRQUFRLEVBQUUsTUFBTTtRQUNkLE9BQU8sOEJBQThCLEtBQUt2QixJQUExQztNQUNEO0lBTkksQ0FBUDtFQVFEOztFQUVEeUIsZUFBZSxDQUFDWixhQUFELEVBQXdCO0lBQ3JDLE1BQU1DLE1BQU0sR0FBRyxJQUFJQywrQkFBSixDQUEyQixHQUEzQixFQUFnQyxPQUFoQyxDQUFmO0lBQ0EsdUNBQXNCRCxNQUF0QixFQUE4QkQsYUFBOUIsRUFBNkMsS0FBS0YsdUJBQWxEO0lBQ0FHLE1BQU0sQ0FBQ0UsV0FBUCxDQUFtQmhDLGNBQWMsQ0FBQ00sZ0JBQWxDO0lBQ0F3QixNQUFNLENBQUNHLFVBQVAsQ0FBa0IsS0FBS2pCLElBQUwsQ0FBVWtCLE1BQVYsR0FBbUIsQ0FBckM7SUFDQUosTUFBTSxDQUFDSyxXQUFQLENBQW1CLEtBQUtuQixJQUF4QixFQUE4QixNQUE5QixFQUxxQyxDQU1yQzs7SUFDQWMsTUFBTSxDQUFDRyxVQUFQLENBQWtCLENBQWxCO0lBRUEsT0FBTztNQUNMLEVBQUVHLE1BQU0sQ0FBQ0MsUUFBVCxJQUFxQjtRQUNuQixNQUFNUCxNQUFNLENBQUNRLElBQWI7TUFDRCxDQUhJOztNQUlMQyxRQUFRLEVBQUUsTUFBTTtRQUNkLE9BQU8sZ0NBQWdDLEtBQUt2QixJQUE1QztNQUNEO0lBTkksQ0FBUDtFQVFEOztFQUVEMEIsV0FBVyxDQUFDYixhQUFELEVBQXdCO0lBQ2pDLE1BQU1DLE1BQU0sR0FBRyxJQUFJQywrQkFBSixDQUEyQixHQUEzQixFQUFnQyxPQUFoQyxDQUFmO0lBQ0EsdUNBQXNCRCxNQUF0QixFQUE4QkQsYUFBOUIsRUFBNkMsS0FBS0YsdUJBQWxEO0lBQ0FHLE1BQU0sQ0FBQ0UsV0FBUCxDQUFtQmhDLGNBQWMsQ0FBQ08sWUFBbEM7SUFDQXVCLE1BQU0sQ0FBQ0csVUFBUCxDQUFrQixLQUFLakIsSUFBTCxDQUFVa0IsTUFBVixHQUFtQixDQUFyQztJQUNBSixNQUFNLENBQUNLLFdBQVAsQ0FBbUIsS0FBS25CLElBQXhCLEVBQThCLE1BQTlCO0lBRUEsT0FBTztNQUNMLEVBQUVvQixNQUFNLENBQUNDLFFBQVQsSUFBcUI7UUFDbkIsTUFBTVAsTUFBTSxDQUFDUSxJQUFiO01BQ0QsQ0FISTs7TUFJTEMsUUFBUSxFQUFFLE1BQU07UUFDZCxPQUFPLDRCQUE0QixLQUFLdkIsSUFBeEM7TUFDRDtJQU5JLENBQVA7RUFRRDs7RUFFRDJCLG9CQUFvQixHQUFHO0lBQ3JCLFFBQVEsS0FBS3hCLGNBQWI7TUFDRSxLQUFLWCxlQUFlLENBQUNFLGdCQUFyQjtRQUNFLE9BQU8sa0JBQVA7O01BQ0YsS0FBS0YsZUFBZSxDQUFDRyxjQUFyQjtRQUNFLE9BQU8sZ0JBQVA7O01BQ0YsS0FBS0gsZUFBZSxDQUFDSSxlQUFyQjtRQUNFLE9BQU8saUJBQVA7O01BQ0YsS0FBS0osZUFBZSxDQUFDSyxZQUFyQjtRQUNFLE9BQU8sY0FBUDs7TUFDRixLQUFLTCxlQUFlLENBQUNNLFFBQXJCO1FBQ0UsT0FBTyxVQUFQO0lBVko7O0lBWUEsT0FBTyxFQUFQO0VBQ0Q7O0FBbEdzQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.TransientErrorLookup = void 0;

// This simple piece of code is factored out into a separate class to make it
// easy to stub it out in tests. It's hard, if not impossible, to cause a
// transient error on demand in tests.
class TransientErrorLookup {
  isTransientError(error) {
    // This list of transient errors comes from Microsoft implementation of SqlClient:
    //  - https://github.com/dotnet/corefx/blob/master/src/System.Data.SqlClient/src/System/Data/SqlClient/SqlInternalConnectionTds.cs#L115
    const transientErrors = [4060, 10928, 10929, 40197, 40501, 40613];
    return transientErrors.indexOf(error) !== -1;
  }

}

exports.TransientErrorLookup = TransientErrorLookup;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUcmFuc2llbnRFcnJvckxvb2t1cCIsImlzVHJhbnNpZW50RXJyb3IiLCJlcnJvciIsInRyYW5zaWVudEVycm9ycyIsImluZGV4T2YiXSwic291cmNlcyI6WyIuLi9zcmMvdHJhbnNpZW50LWVycm9yLWxvb2t1cC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIHNpbXBsZSBwaWVjZSBvZiBjb2RlIGlzIGZhY3RvcmVkIG91dCBpbnRvIGEgc2VwYXJhdGUgY2xhc3MgdG8gbWFrZSBpdFxuLy8gZWFzeSB0byBzdHViIGl0IG91dCBpbiB0ZXN0cy4gSXQncyBoYXJkLCBpZiBub3QgaW1wb3NzaWJsZSwgdG8gY2F1c2UgYVxuLy8gdHJhbnNpZW50IGVycm9yIG9uIGRlbWFuZCBpbiB0ZXN0cy5cbmV4cG9ydCBjbGFzcyBUcmFuc2llbnRFcnJvckxvb2t1cCB7XG4gIGlzVHJhbnNpZW50RXJyb3IoZXJyb3I6IG51bWJlcikge1xuICAgIC8vIFRoaXMgbGlzdCBvZiB0cmFuc2llbnQgZXJyb3JzIGNvbWVzIGZyb20gTWljcm9zb2Z0IGltcGxlbWVudGF0aW9uIG9mIFNxbENsaWVudDpcbiAgICAvLyAgLSBodHRwczovL2dpdGh1Yi5jb20vZG90bmV0L2NvcmVmeC9ibG9iL21hc3Rlci9zcmMvU3lzdGVtLkRhdGEuU3FsQ2xpZW50L3NyYy9TeXN0ZW0vRGF0YS9TcWxDbGllbnQvU3FsSW50ZXJuYWxDb25uZWN0aW9uVGRzLmNzI0wxMTVcbiAgICBjb25zdCB0cmFuc2llbnRFcnJvcnMgPSBbNDA2MCwgMTA5MjgsIDEwOTI5LCA0MDE5NywgNDA1MDEsIDQwNjEzXTtcbiAgICByZXR1cm4gdHJhbnNpZW50RXJyb3JzLmluZGV4T2YoZXJyb3IpICE9PSAtMTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ08sTUFBTUEsb0JBQU4sQ0FBMkI7RUFDaENDLGdCQUFnQixDQUFDQyxLQUFELEVBQWdCO0lBQzlCO0lBQ0E7SUFDQSxNQUFNQyxlQUFlLEdBQUcsQ0FBQyxJQUFELEVBQU8sS0FBUCxFQUFjLEtBQWQsRUFBcUIsS0FBckIsRUFBNEIsS0FBNUIsRUFBbUMsS0FBbkMsQ0FBeEI7SUFDQSxPQUFPQSxlQUFlLENBQUNDLE9BQWhCLENBQXdCRixLQUF4QixNQUFtQyxDQUFDLENBQTNDO0VBQ0Q7O0FBTitCIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _metadataParser = require("./metadata-parser");

var _dataType = require("./data-type");

var _iconvLite = _interopRequireDefault(require("iconv-lite"));

var _sprintfJs = require("sprintf-js");

var _guidParser = require("./guid-parser");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const NULL = (1 << 16) - 1;
const MAX = (1 << 16) - 1;
const THREE_AND_A_THIRD = 3 + 1 / 3;
const MONEY_DIVISOR = 10000;
const PLP_NULL = Buffer.from([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]);
const UNKNOWN_PLP_LEN = Buffer.from([0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]);
const DEFAULT_ENCODING = 'utf8';

function readTinyInt(parser, callback) {
  parser.readUInt8(callback);
}

function readSmallInt(parser, callback) {
  parser.readInt16LE(callback);
}

function readInt(parser, callback) {
  parser.readInt32LE(callback);
}

function readBigInt(parser, callback) {
  parser.readBigInt64LE(value => {
    callback(value.toString());
  });
}

function readReal(parser, callback) {
  parser.readFloatLE(callback);
}

function readFloat(parser, callback) {
  parser.readDoubleLE(callback);
}

function readSmallMoney(parser, callback) {
  parser.readInt32LE(value => {
    callback(value / MONEY_DIVISOR);
  });
}

function readMoney(parser, callback) {
  parser.readInt32LE(high => {
    parser.readUInt32LE(low => {
      callback((low + 0x100000000 * high) / MONEY_DIVISOR);
    });
  });
}

function readBit(parser, callback) {
  parser.readUInt8(value => {
    callback(!!value);
  });
}

function valueParse(parser, metadata, options, callback) {
  const type = metadata.type;

  switch (type.name) {
    case 'Null':
      return callback(null);

    case 'TinyInt':
      return readTinyInt(parser, callback);

    case 'SmallInt':
      return readSmallInt(parser, callback);

    case 'Int':
      return readInt(parser, callback);

    case 'BigInt':
      return readBigInt(parser, callback);

    case 'IntN':
      return parser.readUInt8(dataLength => {
        switch (dataLength) {
          case 0:
            return callback(null);

          case 1:
            return readTinyInt(parser, callback);

          case 2:
            return readSmallInt(parser, callback);

          case 4:
            return readInt(parser, callback);

          case 8:
            return readBigInt(parser, callback);

          default:
            throw new Error('Unsupported dataLength ' + dataLength + ' for IntN');
        }
      });

    case 'Real':
      return readReal(parser, callback);

    case 'Float':
      return readFloat(parser, callback);

    case 'FloatN':
      return parser.readUInt8(dataLength => {
        switch (dataLength) {
          case 0:
            return callback(null);

          case 4:
            return readReal(parser, callback);

          case 8:
            return readFloat(parser, callback);

          default:
            throw new Error('Unsupported dataLength ' + dataLength + ' for FloatN');
        }
      });

    case 'SmallMoney':
      return readSmallMoney(parser, callback);

    case 'Money':
      return readMoney(parser, callback);

    case 'MoneyN':
      return parser.readUInt8(dataLength => {
        switch (dataLength) {
          case 0:
            return callback(null);

          case 4:
            return readSmallMoney(parser, callback);

          case 8:
            return readMoney(parser, callback);

          default:
            throw new Error('Unsupported dataLength ' + dataLength + ' for MoneyN');
        }
      });

    case 'Bit':
      return readBit(parser, callback);

    case 'BitN':
      return parser.readUInt8(dataLength => {
        switch (dataLength) {
          case 0:
            return callback(null);

          case 1:
            return readBit(parser, callback);

          default:
            throw new Error('Unsupported dataLength ' + dataLength + ' for BitN');
        }
      });

    case 'VarChar':
    case 'Char':
      const codepage = metadata.collation.codepage;

      if (metadata.dataLength === MAX) {
        return readMaxChars(parser, codepage, callback);
      } else {
        return parser.readUInt16LE(dataLength => {
          if (dataLength === NULL) {
            return callback(null);
          }

          readChars(parser, dataLength, codepage, callback);
        });
      }

    case 'NVarChar':
    case 'NChar':
      if (metadata.dataLength === MAX) {
        return readMaxNChars(parser, callback);
      } else {
        return parser.readUInt16LE(dataLength => {
          if (dataLength === NULL) {
            return callback(null);
          }

          readNChars(parser, dataLength, callback);
        });
      }

    case 'VarBinary':
    case 'Binary':
      if (metadata.dataLength === MAX) {
        return readMaxBinary(parser, callback);
      } else {
        return parser.readUInt16LE(dataLength => {
          if (dataLength === NULL) {
            return callback(null);
          }

          readBinary(parser, dataLength, callback);
        });
      }

    case 'Text':
      return parser.readUInt8(textPointerLength => {
        if (textPointerLength === 0) {
          return callback(null);
        }

        parser.readBuffer(textPointerLength, _textPointer => {
          parser.readBuffer(8, _timestamp => {
            parser.readUInt32LE(dataLength => {
              readChars(parser, dataLength, metadata.collation.codepage, callback);
            });
          });
        });
      });

    case 'NText':
      return parser.readUInt8(textPointerLength => {
        if (textPointerLength === 0) {
          return callback(null);
        }

        parser.readBuffer(textPointerLength, _textPointer => {
          parser.readBuffer(8, _timestamp => {
            parser.readUInt32LE(dataLength => {
              readNChars(parser, dataLength, callback);
            });
          });
        });
      });

    case 'Image':
      return parser.readUInt8(textPointerLength => {
        if (textPointerLength === 0) {
          return callback(null);
        }

        parser.readBuffer(textPointerLength, _textPointer => {
          parser.readBuffer(8, _timestamp => {
            parser.readUInt32LE(dataLength => {
              readBinary(parser, dataLength, callback);
            });
          });
        });
      });

    case 'Xml':
      return readMaxNChars(parser, callback);

    case 'SmallDateTime':
      return readSmallDateTime(parser, options.useUTC, callback);

    case 'DateTime':
      return readDateTime(parser, options.useUTC, callback);

    case 'DateTimeN':
      return parser.readUInt8(dataLength => {
        switch (dataLength) {
          case 0:
            return callback(null);

          case 4:
            return readSmallDateTime(parser, options.useUTC, callback);

          case 8:
            return readDateTime(parser, options.useUTC, callback);

          default:
            throw new Error('Unsupported dataLength ' + dataLength + ' for DateTimeN');
        }
      });

    case 'Time':
      return parser.readUInt8(dataLength => {
        if (dataLength === 0) {
          return callback(null);
        } else {
          return readTime(parser, dataLength, metadata.scale, options.useUTC, callback);
        }
      });

    case 'Date':
      return parser.readUInt8(dataLength => {
        if (dataLength === 0) {
          return callback(null);
        } else {
          return readDate(parser, options.useUTC, callback);
        }
      });

    case 'DateTime2':
      return parser.readUInt8(dataLength => {
        if (dataLength === 0) {
          return callback(null);
        } else {
          return readDateTime2(parser, dataLength, metadata.scale, options.useUTC, callback);
        }
      });

    case 'DateTimeOffset':
      return parser.readUInt8(dataLength => {
        if (dataLength === 0) {
          return callback(null);
        } else {
          return readDateTimeOffset(parser, dataLength, metadata.scale, callback);
        }
      });

    case 'NumericN':
    case 'DecimalN':
      return parser.readUInt8(dataLength => {
        if (dataLength === 0) {
          return callback(null);
        } else {
          return readNumeric(parser, dataLength, metadata.precision, metadata.scale, callback);
        }
      });

    case 'UniqueIdentifier':
      return parser.readUInt8(dataLength => {
        switch (dataLength) {
          case 0:
            return callback(null);

          case 0x10:
            return readUniqueIdentifier(parser, options, callback);

          default:
            throw new Error((0, _sprintfJs.sprintf)('Unsupported guid size %d', dataLength - 1));
        }
      });

    case 'UDT':
      return readMaxBinary(parser, callback);

    case 'Variant':
      return parser.readUInt32LE(dataLength => {
        if (dataLength === 0) {
          return callback(null);
        }

        readVariant(parser, options, dataLength, callback);
      });

    default:
      throw new Error((0, _sprintfJs.sprintf)('Unrecognised type %s', type.name));
  }
}

function readUniqueIdentifier(parser, options, callback) {
  parser.readBuffer(0x10, data => {
    callback(options.lowerCaseGuids ? (0, _guidParser.bufferToLowerCaseGuid)(data) : (0, _guidParser.bufferToUpperCaseGuid)(data));
  });
}

function readNumeric(parser, dataLength, _precision, scale, callback) {
  parser.readUInt8(sign => {
    sign = sign === 1 ? 1 : -1;
    let readValue;

    if (dataLength === 5) {
      readValue = parser.readUInt32LE;
    } else if (dataLength === 9) {
      readValue = parser.readUNumeric64LE;
    } else if (dataLength === 13) {
      readValue = parser.readUNumeric96LE;
    } else if (dataLength === 17) {
      readValue = parser.readUNumeric128LE;
    } else {
      throw new Error((0, _sprintfJs.sprintf)('Unsupported numeric dataLength %d', dataLength));
    }

    readValue.call(parser, value => {
      callback(value * sign / Math.pow(10, scale));
    });
  });
}

function readVariant(parser, options, dataLength, callback) {
  return parser.readUInt8(baseType => {
    const type = _dataType.TYPE[baseType];
    return parser.readUInt8(propBytes => {
      dataLength = dataLength - propBytes - 2;

      switch (type.name) {
        case 'UniqueIdentifier':
          return readUniqueIdentifier(parser, options, callback);

        case 'Bit':
          return readBit(parser, callback);

        case 'TinyInt':
          return readTinyInt(parser, callback);

        case 'SmallInt':
          return readSmallInt(parser, callback);

        case 'Int':
          return readInt(parser, callback);

        case 'BigInt':
          return readBigInt(parser, callback);

        case 'SmallDateTime':
          return readSmallDateTime(parser, options.useUTC, callback);

        case 'DateTime':
          return readDateTime(parser, options.useUTC, callback);

        case 'Real':
          return readReal(parser, callback);

        case 'Float':
          return readFloat(parser, callback);

        case 'SmallMoney':
          return readSmallMoney(parser, callback);

        case 'Money':
          return readMoney(parser, callback);

        case 'Date':
          return readDate(parser, options.useUTC, callback);

        case 'Time':
          return parser.readUInt8(scale => {
            return readTime(parser, dataLength, scale, options.useUTC, callback);
          });

        case 'DateTime2':
          return parser.readUInt8(scale => {
            return readDateTime2(parser, dataLength, scale, options.useUTC, callback);
          });

        case 'DateTimeOffset':
          return parser.readUInt8(scale => {
            return readDateTimeOffset(parser, dataLength, scale, callback);
          });

        case 'VarBinary':
        case 'Binary':
          return parser.readUInt16LE(_maxLength => {
            readBinary(parser, dataLength, callback);
          });

        case 'NumericN':
        case 'DecimalN':
          return parser.readUInt8(precision => {
            parser.readUInt8(scale => {
              readNumeric(parser, dataLength, precision, scale, callback);
            });
          });

        case 'VarChar':
        case 'Char':
          return parser.readUInt16LE(_maxLength => {
            (0, _metadataParser.readCollation)(parser, collation => {
              readChars(parser, dataLength, collation.codepage, callback);
            });
          });

        case 'NVarChar':
        case 'NChar':
          return parser.readUInt16LE(_maxLength => {
            (0, _metadataParser.readCollation)(parser, _collation => {
              readNChars(parser, dataLength, callback);
            });
          });

        default:
          throw new Error('Invalid type!');
      }
    });
  });
}

function readBinary(parser, dataLength, callback) {
  return parser.readBuffer(dataLength, callback);
}

function readChars(parser, dataLength, codepage, callback) {
  if (codepage == null) {
    codepage = DEFAULT_ENCODING;
  }

  return parser.readBuffer(dataLength, data => {
    callback(_iconvLite.default.decode(data, codepage));
  });
}

function readNChars(parser, dataLength, callback) {
  parser.readBuffer(dataLength, data => {
    callback(data.toString('ucs2'));
  });
}

function readMaxBinary(parser, callback) {
  return readMax(parser, callback);
}

function readMaxChars(parser, codepage, callback) {
  if (codepage == null) {
    codepage = DEFAULT_ENCODING;
  }

  readMax(parser, data => {
    if (data) {
      callback(_iconvLite.default.decode(data, codepage));
    } else {
      callback(null);
    }
  });
}

function readMaxNChars(parser, callback) {
  readMax(parser, data => {
    if (data) {
      callback(data.toString('ucs2'));
    } else {
      callback(null);
    }
  });
}

function readMax(parser, callback) {
  parser.readBuffer(8, type => {
    if (type.equals(PLP_NULL)) {
      return callback(null);
    } else if (type.equals(UNKNOWN_PLP_LEN)) {
      return readMaxUnknownLength(parser, callback);
    } else {
      const low = type.readUInt32LE(0);
      const high = type.readUInt32LE(4);

      if (high >= 2 << 53 - 32) {
        console.warn('Read UInt64LE > 53 bits : high=' + high + ', low=' + low);
      }

      const expectedLength = low + 0x100000000 * high;
      return readMaxKnownLength(parser, expectedLength, callback);
    }
  });
}

function readMaxKnownLength(parser, totalLength, callback) {
  const data = Buffer.alloc(totalLength, 0);
  let offset = 0;

  function next(done) {
    parser.readUInt32LE(chunkLength => {
      if (!chunkLength) {
        return done();
      }

      parser.readBuffer(chunkLength, chunk => {
        chunk.copy(data, offset);
        offset += chunkLength;
        next(done);
      });
    });
  }

  next(() => {
    if (offset !== totalLength) {
      throw new Error('Partially Length-prefixed Bytes unmatched lengths : expected ' + totalLength + ', but got ' + offset + ' bytes');
    }

    callback(data);
  });
}

function readMaxUnknownLength(parser, callback) {
  const chunks = [];
  let length = 0;

  function next(done) {
    parser.readUInt32LE(chunkLength => {
      if (!chunkLength) {
        return done();
      }

      parser.readBuffer(chunkLength, chunk => {
        chunks.push(chunk);
        length += chunkLength;
        next(done);
      });
    });
  }

  next(() => {
    callback(Buffer.concat(chunks, length));
  });
}

function readSmallDateTime(parser, useUTC, callback) {
  parser.readUInt16LE(days => {
    parser.readUInt16LE(minutes => {
      let value;

      if (useUTC) {
        value = new Date(Date.UTC(1900, 0, 1 + days, 0, minutes));
      } else {
        value = new Date(1900, 0, 1 + days, 0, minutes);
      }

      callback(value);
    });
  });
}

function readDateTime(parser, useUTC, callback) {
  parser.readInt32LE(days => {
    parser.readUInt32LE(threeHundredthsOfSecond => {
      const milliseconds = Math.round(threeHundredthsOfSecond * THREE_AND_A_THIRD);
      let value;

      if (useUTC) {
        value = new Date(Date.UTC(1900, 0, 1 + days, 0, 0, 0, milliseconds));
      } else {
        value = new Date(1900, 0, 1 + days, 0, 0, 0, milliseconds);
      }

      callback(value);
    });
  });
}

function readTime(parser, dataLength, scale, useUTC, callback) {
  let readValue;

  switch (dataLength) {
    case 3:
      readValue = parser.readUInt24LE;
      break;

    case 4:
      readValue = parser.readUInt32LE;
      break;

    case 5:
      readValue = parser.readUInt40LE;
  }

  readValue.call(parser, value => {
    if (scale < 7) {
      for (let i = scale; i < 7; i++) {
        value *= 10;
      }
    }

    let date;

    if (useUTC) {
      date = new Date(Date.UTC(1970, 0, 1, 0, 0, 0, value / 10000));
    } else {
      date = new Date(1970, 0, 1, 0, 0, 0, value / 10000);
    }

    Object.defineProperty(date, 'nanosecondsDelta', {
      enumerable: false,
      value: value % 10000 / Math.pow(10, 7)
    });
    callback(date);
  });
}

function readDate(parser, useUTC, callback) {
  parser.readUInt24LE(days => {
    if (useUTC) {
      callback(new Date(Date.UTC(2000, 0, days - 730118)));
    } else {
      callback(new Date(2000, 0, days - 730118));
    }
  });
}

function readDateTime2(parser, dataLength, scale, useUTC, callback) {
  readTime(parser, dataLength - 3, scale, useUTC, time => {
    // TODO: 'input' is 'time', but TypeScript cannot find "time.nanosecondsDelta";
    parser.readUInt24LE(days => {
      let date;

      if (useUTC) {
        date = new Date(Date.UTC(2000, 0, days - 730118, 0, 0, 0, +time));
      } else {
        date = new Date(2000, 0, days - 730118, time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds());
      }

      Object.defineProperty(date, 'nanosecondsDelta', {
        enumerable: false,
        value: time.nanosecondsDelta
      });
      callback(date);
    });
  });
}

function readDateTimeOffset(parser, dataLength, scale, callback) {
  readTime(parser, dataLength - 5, scale, true, time => {
    parser.readUInt24LE(days => {
      // offset
      parser.readInt16LE(() => {
        const date = new Date(Date.UTC(2000, 0, days - 730118, 0, 0, 0, +time));
        Object.defineProperty(date, 'nanosecondsDelta', {
          enumerable: false,
          value: time.nanosecondsDelta
        });
        callback(date);
      });
    });
  });
}

var _default = valueParse;
exports.default = _default;
module.exports = valueParse;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOVUxMIiwiTUFYIiwiVEhSRUVfQU5EX0FfVEhJUkQiLCJNT05FWV9ESVZJU09SIiwiUExQX05VTEwiLCJCdWZmZXIiLCJmcm9tIiwiVU5LTk9XTl9QTFBfTEVOIiwiREVGQVVMVF9FTkNPRElORyIsInJlYWRUaW55SW50IiwicGFyc2VyIiwiY2FsbGJhY2siLCJyZWFkVUludDgiLCJyZWFkU21hbGxJbnQiLCJyZWFkSW50MTZMRSIsInJlYWRJbnQiLCJyZWFkSW50MzJMRSIsInJlYWRCaWdJbnQiLCJyZWFkQmlnSW50NjRMRSIsInZhbHVlIiwidG9TdHJpbmciLCJyZWFkUmVhbCIsInJlYWRGbG9hdExFIiwicmVhZEZsb2F0IiwicmVhZERvdWJsZUxFIiwicmVhZFNtYWxsTW9uZXkiLCJyZWFkTW9uZXkiLCJoaWdoIiwicmVhZFVJbnQzMkxFIiwibG93IiwicmVhZEJpdCIsInZhbHVlUGFyc2UiLCJtZXRhZGF0YSIsIm9wdGlvbnMiLCJ0eXBlIiwibmFtZSIsImRhdGFMZW5ndGgiLCJFcnJvciIsImNvZGVwYWdlIiwiY29sbGF0aW9uIiwicmVhZE1heENoYXJzIiwicmVhZFVJbnQxNkxFIiwicmVhZENoYXJzIiwicmVhZE1heE5DaGFycyIsInJlYWROQ2hhcnMiLCJyZWFkTWF4QmluYXJ5IiwicmVhZEJpbmFyeSIsInRleHRQb2ludGVyTGVuZ3RoIiwicmVhZEJ1ZmZlciIsIl90ZXh0UG9pbnRlciIsIl90aW1lc3RhbXAiLCJyZWFkU21hbGxEYXRlVGltZSIsInVzZVVUQyIsInJlYWREYXRlVGltZSIsInJlYWRUaW1lIiwic2NhbGUiLCJyZWFkRGF0ZSIsInJlYWREYXRlVGltZTIiLCJyZWFkRGF0ZVRpbWVPZmZzZXQiLCJyZWFkTnVtZXJpYyIsInByZWNpc2lvbiIsInJlYWRVbmlxdWVJZGVudGlmaWVyIiwicmVhZFZhcmlhbnQiLCJkYXRhIiwibG93ZXJDYXNlR3VpZHMiLCJfcHJlY2lzaW9uIiwic2lnbiIsInJlYWRWYWx1ZSIsInJlYWRVTnVtZXJpYzY0TEUiLCJyZWFkVU51bWVyaWM5NkxFIiwicmVhZFVOdW1lcmljMTI4TEUiLCJjYWxsIiwiTWF0aCIsInBvdyIsImJhc2VUeXBlIiwiVFlQRSIsInByb3BCeXRlcyIsIl9tYXhMZW5ndGgiLCJfY29sbGF0aW9uIiwiaWNvbnYiLCJkZWNvZGUiLCJyZWFkTWF4IiwiZXF1YWxzIiwicmVhZE1heFVua25vd25MZW5ndGgiLCJjb25zb2xlIiwid2FybiIsImV4cGVjdGVkTGVuZ3RoIiwicmVhZE1heEtub3duTGVuZ3RoIiwidG90YWxMZW5ndGgiLCJhbGxvYyIsIm9mZnNldCIsIm5leHQiLCJkb25lIiwiY2h1bmtMZW5ndGgiLCJjaHVuayIsImNvcHkiLCJjaHVua3MiLCJsZW5ndGgiLCJwdXNoIiwiY29uY2F0IiwiZGF5cyIsIm1pbnV0ZXMiLCJEYXRlIiwiVVRDIiwidGhyZWVIdW5kcmVkdGhzT2ZTZWNvbmQiLCJtaWxsaXNlY29uZHMiLCJyb3VuZCIsInJlYWRVSW50MjRMRSIsInJlYWRVSW50NDBMRSIsImkiLCJkYXRlIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwidGltZSIsImdldEhvdXJzIiwiZ2V0TWludXRlcyIsImdldFNlY29uZHMiLCJnZXRNaWxsaXNlY29uZHMiLCJuYW5vc2Vjb25kc0RlbHRhIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uL3NyYy92YWx1ZS1wYXJzZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFBhcnNlciwgeyBQYXJzZXJPcHRpb25zIH0gZnJvbSAnLi90b2tlbi9zdHJlYW0tcGFyc2VyJztcbmltcG9ydCB7IE1ldGFkYXRhLCByZWFkQ29sbGF0aW9uIH0gZnJvbSAnLi9tZXRhZGF0YS1wYXJzZXInO1xuaW1wb3J0IHsgVFlQRSB9IGZyb20gJy4vZGF0YS10eXBlJztcblxuaW1wb3J0IGljb252IGZyb20gJ2ljb252LWxpdGUnO1xuaW1wb3J0IHsgc3ByaW50ZiB9IGZyb20gJ3NwcmludGYtanMnO1xuaW1wb3J0IHsgYnVmZmVyVG9Mb3dlckNhc2VHdWlkLCBidWZmZXJUb1VwcGVyQ2FzZUd1aWQgfSBmcm9tICcuL2d1aWQtcGFyc2VyJztcblxuY29uc3QgTlVMTCA9ICgxIDw8IDE2KSAtIDE7XG5jb25zdCBNQVggPSAoMSA8PCAxNikgLSAxO1xuY29uc3QgVEhSRUVfQU5EX0FfVEhJUkQgPSAzICsgKDEgLyAzKTtcbmNvbnN0IE1PTkVZX0RJVklTT1IgPSAxMDAwMDtcbmNvbnN0IFBMUF9OVUxMID0gQnVmZmVyLmZyb20oWzB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkZdKTtcbmNvbnN0IFVOS05PV05fUExQX0xFTiA9IEJ1ZmZlci5mcm9tKFsweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGXSk7XG5jb25zdCBERUZBVUxUX0VOQ09ESU5HID0gJ3V0ZjgnO1xuXG5mdW5jdGlvbiByZWFkVGlueUludChwYXJzZXI6IFBhcnNlciwgY2FsbGJhY2s6ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZCkge1xuICBwYXJzZXIucmVhZFVJbnQ4KGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gcmVhZFNtYWxsSW50KHBhcnNlcjogUGFyc2VyLCBjYWxsYmFjazogKHZhbHVlOiB1bmtub3duKSA9PiB2b2lkKSB7XG4gIHBhcnNlci5yZWFkSW50MTZMRShjYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIHJlYWRJbnQocGFyc2VyOiBQYXJzZXIsIGNhbGxiYWNrOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQpIHtcbiAgcGFyc2VyLnJlYWRJbnQzMkxFKGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gcmVhZEJpZ0ludChwYXJzZXI6IFBhcnNlciwgY2FsbGJhY2s6ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZCkge1xuICBwYXJzZXIucmVhZEJpZ0ludDY0TEUoKHZhbHVlKSA9PiB7XG4gICAgY2FsbGJhY2sodmFsdWUudG9TdHJpbmcoKSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWFkUmVhbChwYXJzZXI6IFBhcnNlciwgY2FsbGJhY2s6ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZCkge1xuICBwYXJzZXIucmVhZEZsb2F0TEUoY2FsbGJhY2spO1xufVxuXG5mdW5jdGlvbiByZWFkRmxvYXQocGFyc2VyOiBQYXJzZXIsIGNhbGxiYWNrOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQpIHtcbiAgcGFyc2VyLnJlYWREb3VibGVMRShjYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIHJlYWRTbWFsbE1vbmV5KHBhcnNlcjogUGFyc2VyLCBjYWxsYmFjazogKHZhbHVlOiB1bmtub3duKSA9PiB2b2lkKSB7XG4gIHBhcnNlci5yZWFkSW50MzJMRSgodmFsdWUpID0+IHtcbiAgICBjYWxsYmFjayh2YWx1ZSAvIE1PTkVZX0RJVklTT1IpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVhZE1vbmV5KHBhcnNlcjogUGFyc2VyLCBjYWxsYmFjazogKHZhbHVlOiB1bmtub3duKSA9PiB2b2lkKSB7XG4gIHBhcnNlci5yZWFkSW50MzJMRSgoaGlnaCkgPT4ge1xuICAgIHBhcnNlci5yZWFkVUludDMyTEUoKGxvdykgPT4ge1xuICAgICAgY2FsbGJhY2soKGxvdyArICgweDEwMDAwMDAwMCAqIGhpZ2gpKSAvIE1PTkVZX0RJVklTT1IpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVhZEJpdChwYXJzZXI6IFBhcnNlciwgY2FsbGJhY2s6ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZCkge1xuICBwYXJzZXIucmVhZFVJbnQ4KCh2YWx1ZSkgPT4ge1xuICAgIGNhbGxiYWNrKCEhdmFsdWUpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdmFsdWVQYXJzZShwYXJzZXI6IFBhcnNlciwgbWV0YWRhdGE6IE1ldGFkYXRhLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zLCBjYWxsYmFjazogKHZhbHVlOiB1bmtub3duKSA9PiB2b2lkKTogdm9pZCB7XG4gIGNvbnN0IHR5cGUgPSBtZXRhZGF0YS50eXBlO1xuXG4gIHN3aXRjaCAodHlwZS5uYW1lKSB7XG4gICAgY2FzZSAnTnVsbCc6XG4gICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7XG5cbiAgICBjYXNlICdUaW55SW50JzpcbiAgICAgIHJldHVybiByZWFkVGlueUludChwYXJzZXIsIGNhbGxiYWNrKTtcblxuICAgIGNhc2UgJ1NtYWxsSW50JzpcbiAgICAgIHJldHVybiByZWFkU21hbGxJbnQocGFyc2VyLCBjYWxsYmFjayk7XG5cbiAgICBjYXNlICdJbnQnOlxuICAgICAgcmV0dXJuIHJlYWRJbnQocGFyc2VyLCBjYWxsYmFjayk7XG5cbiAgICBjYXNlICdCaWdJbnQnOlxuICAgICAgcmV0dXJuIHJlYWRCaWdJbnQocGFyc2VyLCBjYWxsYmFjayk7XG5cbiAgICBjYXNlICdJbnROJzpcbiAgICAgIHJldHVybiBwYXJzZXIucmVhZFVJbnQ4KChkYXRhTGVuZ3RoKSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZGF0YUxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsKTtcblxuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHJldHVybiByZWFkVGlueUludChwYXJzZXIsIGNhbGxiYWNrKTtcbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICByZXR1cm4gcmVhZFNtYWxsSW50KHBhcnNlciwgY2FsbGJhY2spO1xuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIHJldHVybiByZWFkSW50KHBhcnNlciwgY2FsbGJhY2spO1xuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIHJldHVybiByZWFkQmlnSW50KHBhcnNlciwgY2FsbGJhY2spO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgZGF0YUxlbmd0aCAnICsgZGF0YUxlbmd0aCArICcgZm9yIEludE4nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBjYXNlICdSZWFsJzpcbiAgICAgIHJldHVybiByZWFkUmVhbChwYXJzZXIsIGNhbGxiYWNrKTtcblxuICAgIGNhc2UgJ0Zsb2F0JzpcbiAgICAgIHJldHVybiByZWFkRmxvYXQocGFyc2VyLCBjYWxsYmFjayk7XG5cbiAgICBjYXNlICdGbG9hdE4nOlxuICAgICAgcmV0dXJuIHBhcnNlci5yZWFkVUludDgoKGRhdGFMZW5ndGgpID0+IHtcbiAgICAgICAgc3dpdGNoIChkYXRhTGVuZ3RoKSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpO1xuXG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgcmV0dXJuIHJlYWRSZWFsKHBhcnNlciwgY2FsbGJhY2spO1xuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIHJldHVybiByZWFkRmxvYXQocGFyc2VyLCBjYWxsYmFjayk7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBkYXRhTGVuZ3RoICcgKyBkYXRhTGVuZ3RoICsgJyBmb3IgRmxvYXROJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgY2FzZSAnU21hbGxNb25leSc6XG4gICAgICByZXR1cm4gcmVhZFNtYWxsTW9uZXkocGFyc2VyLCBjYWxsYmFjayk7XG5cbiAgICBjYXNlICdNb25leSc6XG4gICAgICByZXR1cm4gcmVhZE1vbmV5KHBhcnNlciwgY2FsbGJhY2spO1xuXG4gICAgY2FzZSAnTW9uZXlOJzpcbiAgICAgIHJldHVybiBwYXJzZXIucmVhZFVJbnQ4KChkYXRhTGVuZ3RoKSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZGF0YUxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsKTtcblxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIHJldHVybiByZWFkU21hbGxNb25leShwYXJzZXIsIGNhbGxiYWNrKTtcbiAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICByZXR1cm4gcmVhZE1vbmV5KHBhcnNlciwgY2FsbGJhY2spO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgZGF0YUxlbmd0aCAnICsgZGF0YUxlbmd0aCArICcgZm9yIE1vbmV5TicpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIGNhc2UgJ0JpdCc6XG4gICAgICByZXR1cm4gcmVhZEJpdChwYXJzZXIsIGNhbGxiYWNrKTtcblxuICAgIGNhc2UgJ0JpdE4nOlxuICAgICAgcmV0dXJuIHBhcnNlci5yZWFkVUludDgoKGRhdGFMZW5ndGgpID0+IHtcbiAgICAgICAgc3dpdGNoIChkYXRhTGVuZ3RoKSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpO1xuXG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgcmV0dXJuIHJlYWRCaXQocGFyc2VyLCBjYWxsYmFjayk7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBkYXRhTGVuZ3RoICcgKyBkYXRhTGVuZ3RoICsgJyBmb3IgQml0TicpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIGNhc2UgJ1ZhckNoYXInOlxuICAgIGNhc2UgJ0NoYXInOlxuICAgICAgY29uc3QgY29kZXBhZ2UgPSBtZXRhZGF0YS5jb2xsYXRpb24hLmNvZGVwYWdlITtcbiAgICAgIGlmIChtZXRhZGF0YS5kYXRhTGVuZ3RoID09PSBNQVgpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRNYXhDaGFycyhwYXJzZXIsIGNvZGVwYWdlLCBjYWxsYmFjayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcGFyc2VyLnJlYWRVSW50MTZMRSgoZGF0YUxlbmd0aCkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhTGVuZ3RoID09PSBOVUxMKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVhZENoYXJzKHBhcnNlciwgZGF0YUxlbmd0aCEsIGNvZGVwYWdlLCBjYWxsYmFjayk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgY2FzZSAnTlZhckNoYXInOlxuICAgIGNhc2UgJ05DaGFyJzpcbiAgICAgIGlmIChtZXRhZGF0YS5kYXRhTGVuZ3RoID09PSBNQVgpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRNYXhOQ2hhcnMocGFyc2VyLCBjYWxsYmFjayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcGFyc2VyLnJlYWRVSW50MTZMRSgoZGF0YUxlbmd0aCkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhTGVuZ3RoID09PSBOVUxMKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVhZE5DaGFycyhwYXJzZXIsIGRhdGFMZW5ndGghLCBjYWxsYmFjayk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgY2FzZSAnVmFyQmluYXJ5JzpcbiAgICBjYXNlICdCaW5hcnknOlxuICAgICAgaWYgKG1ldGFkYXRhLmRhdGFMZW5ndGggPT09IE1BWCkge1xuICAgICAgICByZXR1cm4gcmVhZE1heEJpbmFyeShwYXJzZXIsIGNhbGxiYWNrKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBwYXJzZXIucmVhZFVJbnQxNkxFKChkYXRhTGVuZ3RoKSA9PiB7XG4gICAgICAgICAgaWYgKGRhdGFMZW5ndGggPT09IE5VTEwpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZWFkQmluYXJ5KHBhcnNlciwgZGF0YUxlbmd0aCEsIGNhbGxiYWNrKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICBjYXNlICdUZXh0JzpcbiAgICAgIHJldHVybiBwYXJzZXIucmVhZFVJbnQ4KCh0ZXh0UG9pbnRlckxlbmd0aCkgPT4ge1xuICAgICAgICBpZiAodGV4dFBvaW50ZXJMZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBwYXJzZXIucmVhZEJ1ZmZlcih0ZXh0UG9pbnRlckxlbmd0aCwgKF90ZXh0UG9pbnRlcikgPT4ge1xuICAgICAgICAgIHBhcnNlci5yZWFkQnVmZmVyKDgsIChfdGltZXN0YW1wKSA9PiB7XG4gICAgICAgICAgICBwYXJzZXIucmVhZFVJbnQzMkxFKChkYXRhTGVuZ3RoKSA9PiB7XG4gICAgICAgICAgICAgIHJlYWRDaGFycyhwYXJzZXIsIGRhdGFMZW5ndGghLCBtZXRhZGF0YS5jb2xsYXRpb24hLmNvZGVwYWdlISwgY2FsbGJhY2spO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICBjYXNlICdOVGV4dCc6XG4gICAgICByZXR1cm4gcGFyc2VyLnJlYWRVSW50OCgodGV4dFBvaW50ZXJMZW5ndGgpID0+IHtcbiAgICAgICAgaWYgKHRleHRQb2ludGVyTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgcGFyc2VyLnJlYWRCdWZmZXIodGV4dFBvaW50ZXJMZW5ndGgsIChfdGV4dFBvaW50ZXIpID0+IHtcbiAgICAgICAgICBwYXJzZXIucmVhZEJ1ZmZlcig4LCAoX3RpbWVzdGFtcCkgPT4ge1xuICAgICAgICAgICAgcGFyc2VyLnJlYWRVSW50MzJMRSgoZGF0YUxlbmd0aCkgPT4ge1xuICAgICAgICAgICAgICByZWFkTkNoYXJzKHBhcnNlciwgZGF0YUxlbmd0aCEsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgY2FzZSAnSW1hZ2UnOlxuICAgICAgcmV0dXJuIHBhcnNlci5yZWFkVUludDgoKHRleHRQb2ludGVyTGVuZ3RoKSA9PiB7XG4gICAgICAgIGlmICh0ZXh0UG9pbnRlckxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhcnNlci5yZWFkQnVmZmVyKHRleHRQb2ludGVyTGVuZ3RoLCAoX3RleHRQb2ludGVyKSA9PiB7XG4gICAgICAgICAgcGFyc2VyLnJlYWRCdWZmZXIoOCwgKF90aW1lc3RhbXApID0+IHtcbiAgICAgICAgICAgIHBhcnNlci5yZWFkVUludDMyTEUoKGRhdGFMZW5ndGgpID0+IHtcbiAgICAgICAgICAgICAgcmVhZEJpbmFyeShwYXJzZXIsIGRhdGFMZW5ndGghLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIGNhc2UgJ1htbCc6XG4gICAgICByZXR1cm4gcmVhZE1heE5DaGFycyhwYXJzZXIsIGNhbGxiYWNrKTtcblxuICAgIGNhc2UgJ1NtYWxsRGF0ZVRpbWUnOlxuICAgICAgcmV0dXJuIHJlYWRTbWFsbERhdGVUaW1lKHBhcnNlciwgb3B0aW9ucy51c2VVVEMsIGNhbGxiYWNrKTtcblxuICAgIGNhc2UgJ0RhdGVUaW1lJzpcbiAgICAgIHJldHVybiByZWFkRGF0ZVRpbWUocGFyc2VyLCBvcHRpb25zLnVzZVVUQywgY2FsbGJhY2spO1xuXG4gICAgY2FzZSAnRGF0ZVRpbWVOJzpcbiAgICAgIHJldHVybiBwYXJzZXIucmVhZFVJbnQ4KChkYXRhTGVuZ3RoKSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZGF0YUxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsKTtcblxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIHJldHVybiByZWFkU21hbGxEYXRlVGltZShwYXJzZXIsIG9wdGlvbnMudXNlVVRDLCBjYWxsYmFjayk7XG4gICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgcmV0dXJuIHJlYWREYXRlVGltZShwYXJzZXIsIG9wdGlvbnMudXNlVVRDLCBjYWxsYmFjayk7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBkYXRhTGVuZ3RoICcgKyBkYXRhTGVuZ3RoICsgJyBmb3IgRGF0ZVRpbWVOJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgY2FzZSAnVGltZSc6XG4gICAgICByZXR1cm4gcGFyc2VyLnJlYWRVSW50OCgoZGF0YUxlbmd0aCkgPT4ge1xuICAgICAgICBpZiAoZGF0YUxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVhZFRpbWUocGFyc2VyLCBkYXRhTGVuZ3RoISwgbWV0YWRhdGEuc2NhbGUhLCBvcHRpb25zLnVzZVVUQywgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgcmV0dXJuIHBhcnNlci5yZWFkVUludDgoKGRhdGFMZW5ndGgpID0+IHtcbiAgICAgICAgaWYgKGRhdGFMZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlYWREYXRlKHBhcnNlciwgb3B0aW9ucy51c2VVVEMsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBjYXNlICdEYXRlVGltZTInOlxuICAgICAgcmV0dXJuIHBhcnNlci5yZWFkVUludDgoKGRhdGFMZW5ndGgpID0+IHtcbiAgICAgICAgaWYgKGRhdGFMZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlYWREYXRlVGltZTIocGFyc2VyLCBkYXRhTGVuZ3RoISwgbWV0YWRhdGEuc2NhbGUhLCBvcHRpb25zLnVzZVVUQywgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIGNhc2UgJ0RhdGVUaW1lT2Zmc2V0JzpcbiAgICAgIHJldHVybiBwYXJzZXIucmVhZFVJbnQ4KChkYXRhTGVuZ3RoKSA9PiB7XG4gICAgICAgIGlmIChkYXRhTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZWFkRGF0ZVRpbWVPZmZzZXQocGFyc2VyLCBkYXRhTGVuZ3RoISwgbWV0YWRhdGEuc2NhbGUhLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgY2FzZSAnTnVtZXJpY04nOlxuICAgIGNhc2UgJ0RlY2ltYWxOJzpcbiAgICAgIHJldHVybiBwYXJzZXIucmVhZFVJbnQ4KChkYXRhTGVuZ3RoKSA9PiB7XG4gICAgICAgIGlmIChkYXRhTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZWFkTnVtZXJpYyhwYXJzZXIsIGRhdGFMZW5ndGghLCBtZXRhZGF0YS5wcmVjaXNpb24hLCBtZXRhZGF0YS5zY2FsZSEsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBjYXNlICdVbmlxdWVJZGVudGlmaWVyJzpcbiAgICAgIHJldHVybiBwYXJzZXIucmVhZFVJbnQ4KChkYXRhTGVuZ3RoKSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZGF0YUxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsKTtcblxuICAgICAgICAgIGNhc2UgMHgxMDpcbiAgICAgICAgICAgIHJldHVybiByZWFkVW5pcXVlSWRlbnRpZmllcihwYXJzZXIsIG9wdGlvbnMsIGNhbGxiYWNrKTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc3ByaW50ZignVW5zdXBwb3J0ZWQgZ3VpZCBzaXplICVkJywgZGF0YUxlbmd0aCEgLSAxKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgY2FzZSAnVURUJzpcbiAgICAgIHJldHVybiByZWFkTWF4QmluYXJ5KHBhcnNlciwgY2FsbGJhY2spO1xuXG4gICAgY2FzZSAnVmFyaWFudCc6XG4gICAgICByZXR1cm4gcGFyc2VyLnJlYWRVSW50MzJMRSgoZGF0YUxlbmd0aCkgPT4ge1xuICAgICAgICBpZiAoZGF0YUxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlYWRWYXJpYW50KHBhcnNlciwgb3B0aW9ucywgZGF0YUxlbmd0aCEsIGNhbGxiYWNrKTtcbiAgICAgIH0pO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihzcHJpbnRmKCdVbnJlY29nbmlzZWQgdHlwZSAlcycsIHR5cGUubmFtZSkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlYWRVbmlxdWVJZGVudGlmaWVyKHBhcnNlcjogUGFyc2VyLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zLCBjYWxsYmFjazogKHZhbHVlOiB1bmtub3duKSA9PiB2b2lkKSB7XG4gIHBhcnNlci5yZWFkQnVmZmVyKDB4MTAsIChkYXRhKSA9PiB7XG4gICAgY2FsbGJhY2sob3B0aW9ucy5sb3dlckNhc2VHdWlkcyA/IGJ1ZmZlclRvTG93ZXJDYXNlR3VpZChkYXRhKSA6IGJ1ZmZlclRvVXBwZXJDYXNlR3VpZChkYXRhKSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWFkTnVtZXJpYyhwYXJzZXI6IFBhcnNlciwgZGF0YUxlbmd0aDogbnVtYmVyLCBfcHJlY2lzaW9uOiBudW1iZXIsIHNjYWxlOiBudW1iZXIsIGNhbGxiYWNrOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQpIHtcbiAgcGFyc2VyLnJlYWRVSW50OCgoc2lnbikgPT4ge1xuICAgIHNpZ24gPSBzaWduID09PSAxID8gMSA6IC0xO1xuXG4gICAgbGV0IHJlYWRWYWx1ZTtcbiAgICBpZiAoZGF0YUxlbmd0aCA9PT0gNSkge1xuICAgICAgcmVhZFZhbHVlID0gcGFyc2VyLnJlYWRVSW50MzJMRTtcbiAgICB9IGVsc2UgaWYgKGRhdGFMZW5ndGggPT09IDkpIHtcbiAgICAgIHJlYWRWYWx1ZSA9IHBhcnNlci5yZWFkVU51bWVyaWM2NExFO1xuICAgIH0gZWxzZSBpZiAoZGF0YUxlbmd0aCA9PT0gMTMpIHtcbiAgICAgIHJlYWRWYWx1ZSA9IHBhcnNlci5yZWFkVU51bWVyaWM5NkxFO1xuICAgIH0gZWxzZSBpZiAoZGF0YUxlbmd0aCA9PT0gMTcpIHtcbiAgICAgIHJlYWRWYWx1ZSA9IHBhcnNlci5yZWFkVU51bWVyaWMxMjhMRTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHNwcmludGYoJ1Vuc3VwcG9ydGVkIG51bWVyaWMgZGF0YUxlbmd0aCAlZCcsIGRhdGFMZW5ndGgpKTtcbiAgICB9XG5cbiAgICByZWFkVmFsdWUuY2FsbChwYXJzZXIsICh2YWx1ZSkgPT4ge1xuICAgICAgY2FsbGJhY2soKHZhbHVlICogc2lnbikgLyBNYXRoLnBvdygxMCwgc2NhbGUpKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRWYXJpYW50KHBhcnNlcjogUGFyc2VyLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zLCBkYXRhTGVuZ3RoOiBudW1iZXIsIGNhbGxiYWNrOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQpIHtcbiAgcmV0dXJuIHBhcnNlci5yZWFkVUludDgoKGJhc2VUeXBlKSA9PiB7XG4gICAgY29uc3QgdHlwZSA9IFRZUEVbYmFzZVR5cGVdO1xuXG4gICAgcmV0dXJuIHBhcnNlci5yZWFkVUludDgoKHByb3BCeXRlcykgPT4ge1xuICAgICAgZGF0YUxlbmd0aCA9IGRhdGFMZW5ndGggLSBwcm9wQnl0ZXMgLSAyO1xuXG4gICAgICBzd2l0Y2ggKHR5cGUubmFtZSkge1xuICAgICAgICBjYXNlICdVbmlxdWVJZGVudGlmaWVyJzpcbiAgICAgICAgICByZXR1cm4gcmVhZFVuaXF1ZUlkZW50aWZpZXIocGFyc2VyLCBvcHRpb25zLCBjYWxsYmFjayk7XG5cbiAgICAgICAgY2FzZSAnQml0JzpcbiAgICAgICAgICByZXR1cm4gcmVhZEJpdChwYXJzZXIsIGNhbGxiYWNrKTtcblxuICAgICAgICBjYXNlICdUaW55SW50JzpcbiAgICAgICAgICByZXR1cm4gcmVhZFRpbnlJbnQocGFyc2VyLCBjYWxsYmFjayk7XG5cbiAgICAgICAgY2FzZSAnU21hbGxJbnQnOlxuICAgICAgICAgIHJldHVybiByZWFkU21hbGxJbnQocGFyc2VyLCBjYWxsYmFjayk7XG5cbiAgICAgICAgY2FzZSAnSW50JzpcbiAgICAgICAgICByZXR1cm4gcmVhZEludChwYXJzZXIsIGNhbGxiYWNrKTtcblxuICAgICAgICBjYXNlICdCaWdJbnQnOlxuICAgICAgICAgIHJldHVybiByZWFkQmlnSW50KHBhcnNlciwgY2FsbGJhY2spO1xuXG4gICAgICAgIGNhc2UgJ1NtYWxsRGF0ZVRpbWUnOlxuICAgICAgICAgIHJldHVybiByZWFkU21hbGxEYXRlVGltZShwYXJzZXIsIG9wdGlvbnMudXNlVVRDLCBjYWxsYmFjayk7XG5cbiAgICAgICAgY2FzZSAnRGF0ZVRpbWUnOlxuICAgICAgICAgIHJldHVybiByZWFkRGF0ZVRpbWUocGFyc2VyLCBvcHRpb25zLnVzZVVUQywgY2FsbGJhY2spO1xuXG4gICAgICAgIGNhc2UgJ1JlYWwnOlxuICAgICAgICAgIHJldHVybiByZWFkUmVhbChwYXJzZXIsIGNhbGxiYWNrKTtcblxuICAgICAgICBjYXNlICdGbG9hdCc6XG4gICAgICAgICAgcmV0dXJuIHJlYWRGbG9hdChwYXJzZXIsIGNhbGxiYWNrKTtcblxuICAgICAgICBjYXNlICdTbWFsbE1vbmV5JzpcbiAgICAgICAgICByZXR1cm4gcmVhZFNtYWxsTW9uZXkocGFyc2VyLCBjYWxsYmFjayk7XG5cbiAgICAgICAgY2FzZSAnTW9uZXknOlxuICAgICAgICAgIHJldHVybiByZWFkTW9uZXkocGFyc2VyLCBjYWxsYmFjayk7XG5cbiAgICAgICAgY2FzZSAnRGF0ZSc6XG4gICAgICAgICAgcmV0dXJuIHJlYWREYXRlKHBhcnNlciwgb3B0aW9ucy51c2VVVEMsIGNhbGxiYWNrKTtcblxuICAgICAgICBjYXNlICdUaW1lJzpcbiAgICAgICAgICByZXR1cm4gcGFyc2VyLnJlYWRVSW50OCgoc2NhbGUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZWFkVGltZShwYXJzZXIsIGRhdGFMZW5ndGgsIHNjYWxlLCBvcHRpb25zLnVzZVVUQywgY2FsbGJhY2spO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgJ0RhdGVUaW1lMic6XG4gICAgICAgICAgcmV0dXJuIHBhcnNlci5yZWFkVUludDgoKHNjYWxlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcmVhZERhdGVUaW1lMihwYXJzZXIsIGRhdGFMZW5ndGgsIHNjYWxlLCBvcHRpb25zLnVzZVVUQywgY2FsbGJhY2spO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgJ0RhdGVUaW1lT2Zmc2V0JzpcbiAgICAgICAgICByZXR1cm4gcGFyc2VyLnJlYWRVSW50OCgoc2NhbGUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZWFkRGF0ZVRpbWVPZmZzZXQocGFyc2VyLCBkYXRhTGVuZ3RoLCBzY2FsZSwgY2FsbGJhY2spO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgJ1ZhckJpbmFyeSc6XG4gICAgICAgIGNhc2UgJ0JpbmFyeSc6XG4gICAgICAgICAgcmV0dXJuIHBhcnNlci5yZWFkVUludDE2TEUoKF9tYXhMZW5ndGgpID0+IHtcbiAgICAgICAgICAgIHJlYWRCaW5hcnkocGFyc2VyLCBkYXRhTGVuZ3RoLCBjYWxsYmFjayk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgY2FzZSAnTnVtZXJpY04nOlxuICAgICAgICBjYXNlICdEZWNpbWFsTic6XG4gICAgICAgICAgcmV0dXJuIHBhcnNlci5yZWFkVUludDgoKHByZWNpc2lvbikgPT4ge1xuICAgICAgICAgICAgcGFyc2VyLnJlYWRVSW50OCgoc2NhbGUpID0+IHtcbiAgICAgICAgICAgICAgcmVhZE51bWVyaWMocGFyc2VyLCBkYXRhTGVuZ3RoLCBwcmVjaXNpb24sIHNjYWxlLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlICdWYXJDaGFyJzpcbiAgICAgICAgY2FzZSAnQ2hhcic6XG4gICAgICAgICAgcmV0dXJuIHBhcnNlci5yZWFkVUludDE2TEUoKF9tYXhMZW5ndGgpID0+IHtcbiAgICAgICAgICAgIHJlYWRDb2xsYXRpb24ocGFyc2VyLCAoY29sbGF0aW9uKSA9PiB7XG4gICAgICAgICAgICAgIHJlYWRDaGFycyhwYXJzZXIsIGRhdGFMZW5ndGgsIGNvbGxhdGlvbi5jb2RlcGFnZSEsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNhc2UgJ05WYXJDaGFyJzpcbiAgICAgICAgY2FzZSAnTkNoYXInOlxuICAgICAgICAgIHJldHVybiBwYXJzZXIucmVhZFVJbnQxNkxFKChfbWF4TGVuZ3RoKSA9PiB7XG4gICAgICAgICAgICByZWFkQ29sbGF0aW9uKHBhcnNlciwgKF9jb2xsYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgcmVhZE5DaGFycyhwYXJzZXIsIGRhdGFMZW5ndGgsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHR5cGUhJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWFkQmluYXJ5KHBhcnNlcjogUGFyc2VyLCBkYXRhTGVuZ3RoOiBudW1iZXIsIGNhbGxiYWNrOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQpIHtcbiAgcmV0dXJuIHBhcnNlci5yZWFkQnVmZmVyKGRhdGFMZW5ndGgsIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gcmVhZENoYXJzKHBhcnNlcjogUGFyc2VyLCBkYXRhTGVuZ3RoOiBudW1iZXIsIGNvZGVwYWdlOiBzdHJpbmcsIGNhbGxiYWNrOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQpIHtcbiAgaWYgKGNvZGVwYWdlID09IG51bGwpIHtcbiAgICBjb2RlcGFnZSA9IERFRkFVTFRfRU5DT0RJTkc7XG4gIH1cblxuICByZXR1cm4gcGFyc2VyLnJlYWRCdWZmZXIoZGF0YUxlbmd0aCwgKGRhdGEpID0+IHtcbiAgICBjYWxsYmFjayhpY29udi5kZWNvZGUoZGF0YSwgY29kZXBhZ2UpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlYWROQ2hhcnMocGFyc2VyOiBQYXJzZXIsIGRhdGFMZW5ndGg6IG51bWJlciwgY2FsbGJhY2s6ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZCkge1xuICBwYXJzZXIucmVhZEJ1ZmZlcihkYXRhTGVuZ3RoLCAoZGF0YSkgPT4ge1xuICAgIGNhbGxiYWNrKGRhdGEudG9TdHJpbmcoJ3VjczInKSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWFkTWF4QmluYXJ5KHBhcnNlcjogUGFyc2VyLCBjYWxsYmFjazogKHZhbHVlOiB1bmtub3duKSA9PiB2b2lkKSB7XG4gIHJldHVybiByZWFkTWF4KHBhcnNlciwgY2FsbGJhY2spO1xufVxuXG5mdW5jdGlvbiByZWFkTWF4Q2hhcnMocGFyc2VyOiBQYXJzZXIsIGNvZGVwYWdlOiBzdHJpbmcsIGNhbGxiYWNrOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQpIHtcbiAgaWYgKGNvZGVwYWdlID09IG51bGwpIHtcbiAgICBjb2RlcGFnZSA9IERFRkFVTFRfRU5DT0RJTkc7XG4gIH1cblxuICByZWFkTWF4KHBhcnNlciwgKGRhdGEpID0+IHtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgY2FsbGJhY2soaWNvbnYuZGVjb2RlKGRhdGEsIGNvZGVwYWdlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRNYXhOQ2hhcnMocGFyc2VyOiBQYXJzZXIsIGNhbGxiYWNrOiAodmFsdWU6IHN0cmluZyB8IG51bGwpID0+IHZvaWQpIHtcbiAgcmVhZE1heChwYXJzZXIsIChkYXRhKSA9PiB7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIGNhbGxiYWNrKGRhdGEudG9TdHJpbmcoJ3VjczInKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRNYXgocGFyc2VyOiBQYXJzZXIsIGNhbGxiYWNrOiAodmFsdWU6IG51bGwgfCBCdWZmZXIpID0+IHZvaWQpIHtcbiAgcGFyc2VyLnJlYWRCdWZmZXIoOCwgKHR5cGUpID0+IHtcbiAgICBpZiAodHlwZS5lcXVhbHMoUExQX05VTEwpKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7XG4gICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscyhVTktOT1dOX1BMUF9MRU4pKSB7XG4gICAgICByZXR1cm4gcmVhZE1heFVua25vd25MZW5ndGgocGFyc2VyLCBjYWxsYmFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGxvdyA9IHR5cGUucmVhZFVJbnQzMkxFKDApO1xuICAgICAgY29uc3QgaGlnaCA9IHR5cGUucmVhZFVJbnQzMkxFKDQpO1xuXG4gICAgICBpZiAoaGlnaCA+PSAoMiA8PCAoNTMgLSAzMikpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignUmVhZCBVSW50NjRMRSA+IDUzIGJpdHMgOiBoaWdoPScgKyBoaWdoICsgJywgbG93PScgKyBsb3cpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleHBlY3RlZExlbmd0aCA9IGxvdyArICgweDEwMDAwMDAwMCAqIGhpZ2gpO1xuICAgICAgcmV0dXJuIHJlYWRNYXhLbm93bkxlbmd0aChwYXJzZXIsIGV4cGVjdGVkTGVuZ3RoLCBjYWxsYmFjayk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVhZE1heEtub3duTGVuZ3RoKHBhcnNlcjogUGFyc2VyLCB0b3RhbExlbmd0aDogbnVtYmVyLCBjYWxsYmFjazogKHZhbHVlOiBudWxsIHwgQnVmZmVyKSA9PiB2b2lkKSB7XG4gIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2ModG90YWxMZW5ndGgsIDApO1xuXG4gIGxldCBvZmZzZXQgPSAwO1xuICBmdW5jdGlvbiBuZXh0KGRvbmU6IGFueSkge1xuICAgIHBhcnNlci5yZWFkVUludDMyTEUoKGNodW5rTGVuZ3RoKSA9PiB7XG4gICAgICBpZiAoIWNodW5rTGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBkb25lKCk7XG4gICAgICB9XG5cbiAgICAgIHBhcnNlci5yZWFkQnVmZmVyKGNodW5rTGVuZ3RoLCAoY2h1bmspID0+IHtcbiAgICAgICAgY2h1bmsuY29weShkYXRhLCBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0gY2h1bmtMZW5ndGg7XG5cbiAgICAgICAgbmV4dChkb25lKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmV4dCgoKSA9PiB7XG4gICAgaWYgKG9mZnNldCAhPT0gdG90YWxMZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGFydGlhbGx5IExlbmd0aC1wcmVmaXhlZCBCeXRlcyB1bm1hdGNoZWQgbGVuZ3RocyA6IGV4cGVjdGVkICcgKyB0b3RhbExlbmd0aCArICcsIGJ1dCBnb3QgJyArIG9mZnNldCArICcgYnl0ZXMnKTtcbiAgICB9XG5cbiAgICBjYWxsYmFjayhkYXRhKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRNYXhVbmtub3duTGVuZ3RoKHBhcnNlcjogUGFyc2VyLCBjYWxsYmFjazogKHZhbHVlOiBudWxsIHwgQnVmZmVyKSA9PiB2b2lkKSB7XG4gIGNvbnN0IGNodW5rczogQnVmZmVyW10gPSBbXTtcblxuICBsZXQgbGVuZ3RoID0gMDtcbiAgZnVuY3Rpb24gbmV4dChkb25lOiBhbnkpIHtcbiAgICBwYXJzZXIucmVhZFVJbnQzMkxFKChjaHVua0xlbmd0aCkgPT4ge1xuICAgICAgaWYgKCFjaHVua0xlbmd0aCkge1xuICAgICAgICByZXR1cm4gZG9uZSgpO1xuICAgICAgfVxuXG4gICAgICBwYXJzZXIucmVhZEJ1ZmZlcihjaHVua0xlbmd0aCwgKGNodW5rKSA9PiB7XG4gICAgICAgIGNodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgICAgbGVuZ3RoICs9IGNodW5rTGVuZ3RoO1xuXG4gICAgICAgIG5leHQoZG9uZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5leHQoKCkgPT4ge1xuICAgIGNhbGxiYWNrKEJ1ZmZlci5jb25jYXQoY2h1bmtzLCBsZW5ndGgpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRTbWFsbERhdGVUaW1lKHBhcnNlcjogUGFyc2VyLCB1c2VVVEM6IGJvb2xlYW4sIGNhbGxiYWNrOiAodmFsdWU6IERhdGUpID0+IHZvaWQpIHtcbiAgcGFyc2VyLnJlYWRVSW50MTZMRSgoZGF5cykgPT4ge1xuICAgIHBhcnNlci5yZWFkVUludDE2TEUoKG1pbnV0ZXMpID0+IHtcbiAgICAgIGxldCB2YWx1ZTtcbiAgICAgIGlmICh1c2VVVEMpIHtcbiAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZShEYXRlLlVUQygxOTAwLCAwLCAxICsgZGF5cywgMCwgbWludXRlcykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSgxOTAwLCAwLCAxICsgZGF5cywgMCwgbWludXRlcyk7XG4gICAgICB9XG4gICAgICBjYWxsYmFjayh2YWx1ZSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWFkRGF0ZVRpbWUocGFyc2VyOiBQYXJzZXIsIHVzZVVUQzogYm9vbGVhbiwgY2FsbGJhY2s6ICh2YWx1ZTogRGF0ZSkgPT4gdm9pZCkge1xuICBwYXJzZXIucmVhZEludDMyTEUoKGRheXMpID0+IHtcbiAgICBwYXJzZXIucmVhZFVJbnQzMkxFKCh0aHJlZUh1bmRyZWR0aHNPZlNlY29uZCkgPT4ge1xuICAgICAgY29uc3QgbWlsbGlzZWNvbmRzID0gTWF0aC5yb3VuZCh0aHJlZUh1bmRyZWR0aHNPZlNlY29uZCAqIFRIUkVFX0FORF9BX1RISVJEKTtcblxuICAgICAgbGV0IHZhbHVlO1xuICAgICAgaWYgKHVzZVVUQykge1xuICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKERhdGUuVVRDKDE5MDAsIDAsIDEgKyBkYXlzLCAwLCAwLCAwLCBtaWxsaXNlY29uZHMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gbmV3IERhdGUoMTkwMCwgMCwgMSArIGRheXMsIDAsIDAsIDAsIG1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG5cbiAgICAgIGNhbGxiYWNrKHZhbHVlKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmludGVyZmFjZSBEYXRlV2l0aE5hbm9zZWNvbmRzRGVsdGEgZXh0ZW5kcyBEYXRlIHtcbiAgbmFub3NlY29uZHNEZWx0YTogbnVtYmVyO1xufVxuXG5mdW5jdGlvbiByZWFkVGltZShwYXJzZXI6IFBhcnNlciwgZGF0YUxlbmd0aDogbnVtYmVyLCBzY2FsZTogbnVtYmVyLCB1c2VVVEM6IGJvb2xlYW4sIGNhbGxiYWNrOiAodmFsdWU6IERhdGVXaXRoTmFub3NlY29uZHNEZWx0YSkgPT4gdm9pZCkge1xuICBsZXQgcmVhZFZhbHVlOiBhbnk7XG4gIHN3aXRjaCAoZGF0YUxlbmd0aCkge1xuICAgIGNhc2UgMzpcbiAgICAgIHJlYWRWYWx1ZSA9IHBhcnNlci5yZWFkVUludDI0TEU7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDQ6XG4gICAgICByZWFkVmFsdWUgPSBwYXJzZXIucmVhZFVJbnQzMkxFO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA1OlxuICAgICAgcmVhZFZhbHVlID0gcGFyc2VyLnJlYWRVSW50NDBMRTtcbiAgfVxuXG4gIHJlYWRWYWx1ZSEuY2FsbChwYXJzZXIsICh2YWx1ZTogbnVtYmVyKSA9PiB7XG4gICAgaWYgKHNjYWxlIDwgNykge1xuICAgICAgZm9yIChsZXQgaSA9IHNjYWxlOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgIHZhbHVlICo9IDEwO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBkYXRlO1xuICAgIGlmICh1c2VVVEMpIHtcbiAgICAgIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQygxOTcwLCAwLCAxLCAwLCAwLCAwLCB2YWx1ZSAvIDEwMDAwKSkgYXMgRGF0ZVdpdGhOYW5vc2Vjb25kc0RlbHRhO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRlID0gbmV3IERhdGUoMTk3MCwgMCwgMSwgMCwgMCwgMCwgdmFsdWUgLyAxMDAwMCkgYXMgRGF0ZVdpdGhOYW5vc2Vjb25kc0RlbHRhO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGF0ZSwgJ25hbm9zZWNvbmRzRGVsdGEnLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiAodmFsdWUgJSAxMDAwMCkgLyBNYXRoLnBvdygxMCwgNylcbiAgICB9KTtcbiAgICBjYWxsYmFjayhkYXRlKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlYWREYXRlKHBhcnNlcjogUGFyc2VyLCB1c2VVVEM6IGJvb2xlYW4sIGNhbGxiYWNrOiAodmFsdWU6IERhdGUpID0+IHZvaWQpIHtcbiAgcGFyc2VyLnJlYWRVSW50MjRMRSgoZGF5cykgPT4ge1xuICAgIGlmICh1c2VVVEMpIHtcbiAgICAgIGNhbGxiYWNrKG5ldyBEYXRlKERhdGUuVVRDKDIwMDAsIDAsIGRheXMgLSA3MzAxMTgpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKG5ldyBEYXRlKDIwMDAsIDAsIGRheXMgLSA3MzAxMTgpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWFkRGF0ZVRpbWUyKHBhcnNlcjogUGFyc2VyLCBkYXRhTGVuZ3RoOiBudW1iZXIsIHNjYWxlOiBudW1iZXIsIHVzZVVUQzogYm9vbGVhbiwgY2FsbGJhY2s6ICh2YWx1ZTogRGF0ZVdpdGhOYW5vc2Vjb25kc0RlbHRhKSA9PiB2b2lkKSB7XG4gIHJlYWRUaW1lKHBhcnNlciwgZGF0YUxlbmd0aCAtIDMsIHNjYWxlLCB1c2VVVEMsICh0aW1lKSA9PiB7IC8vIFRPRE86ICdpbnB1dCcgaXMgJ3RpbWUnLCBidXQgVHlwZVNjcmlwdCBjYW5ub3QgZmluZCBcInRpbWUubmFub3NlY29uZHNEZWx0YVwiO1xuICAgIHBhcnNlci5yZWFkVUludDI0TEUoKGRheXMpID0+IHtcbiAgICAgIGxldCBkYXRlO1xuICAgICAgaWYgKHVzZVVUQykge1xuICAgICAgICBkYXRlID0gbmV3IERhdGUoRGF0ZS5VVEMoMjAwMCwgMCwgZGF5cyAtIDczMDExOCwgMCwgMCwgMCwgK3RpbWUpKSBhcyBEYXRlV2l0aE5hbm9zZWNvbmRzRGVsdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkYXRlID0gbmV3IERhdGUoMjAwMCwgMCwgZGF5cyAtIDczMDExOCwgdGltZS5nZXRIb3VycygpLCB0aW1lLmdldE1pbnV0ZXMoKSwgdGltZS5nZXRTZWNvbmRzKCksIHRpbWUuZ2V0TWlsbGlzZWNvbmRzKCkpIGFzIERhdGVXaXRoTmFub3NlY29uZHNEZWx0YTtcbiAgICAgIH1cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkYXRlLCAnbmFub3NlY29uZHNEZWx0YScsIHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiB0aW1lLm5hbm9zZWNvbmRzRGVsdGFcbiAgICAgIH0pO1xuICAgICAgY2FsbGJhY2soZGF0ZSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWFkRGF0ZVRpbWVPZmZzZXQocGFyc2VyOiBQYXJzZXIsIGRhdGFMZW5ndGg6IG51bWJlciwgc2NhbGU6IG51bWJlciwgY2FsbGJhY2s6ICh2YWx1ZTogRGF0ZVdpdGhOYW5vc2Vjb25kc0RlbHRhKSA9PiB2b2lkKSB7XG4gIHJlYWRUaW1lKHBhcnNlciwgZGF0YUxlbmd0aCAtIDUsIHNjYWxlLCB0cnVlLCAodGltZSkgPT4ge1xuICAgIHBhcnNlci5yZWFkVUludDI0TEUoKGRheXMpID0+IHtcbiAgICAgIC8vIG9mZnNldFxuICAgICAgcGFyc2VyLnJlYWRJbnQxNkxFKCgpID0+IHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDKDIwMDAsIDAsIGRheXMgLSA3MzAxMTgsIDAsIDAsIDAsICt0aW1lKSkgYXMgRGF0ZVdpdGhOYW5vc2Vjb25kc0RlbHRhO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGF0ZSwgJ25hbm9zZWNvbmRzRGVsdGEnLCB7XG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgdmFsdWU6IHRpbWUubmFub3NlY29uZHNEZWx0YVxuICAgICAgICB9KTtcbiAgICAgICAgY2FsbGJhY2soZGF0ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZhbHVlUGFyc2U7XG5tb2R1bGUuZXhwb3J0cyA9IHZhbHVlUGFyc2U7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7OztBQUVBLE1BQU1BLElBQUksR0FBRyxDQUFDLEtBQUssRUFBTixJQUFZLENBQXpCO0FBQ0EsTUFBTUMsR0FBRyxHQUFHLENBQUMsS0FBSyxFQUFOLElBQVksQ0FBeEI7QUFDQSxNQUFNQyxpQkFBaUIsR0FBRyxJQUFLLElBQUksQ0FBbkM7QUFDQSxNQUFNQyxhQUFhLEdBQUcsS0FBdEI7QUFDQSxNQUFNQyxRQUFRLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxFQUFPLElBQVAsRUFBYSxJQUFiLEVBQW1CLElBQW5CLEVBQXlCLElBQXpCLEVBQStCLElBQS9CLEVBQXFDLElBQXJDLEVBQTJDLElBQTNDLENBQVosQ0FBakI7QUFDQSxNQUFNQyxlQUFlLEdBQUdGLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxFQUFPLElBQVAsRUFBYSxJQUFiLEVBQW1CLElBQW5CLEVBQXlCLElBQXpCLEVBQStCLElBQS9CLEVBQXFDLElBQXJDLEVBQTJDLElBQTNDLENBQVosQ0FBeEI7QUFDQSxNQUFNRSxnQkFBZ0IsR0FBRyxNQUF6Qjs7QUFFQSxTQUFTQyxXQUFULENBQXFCQyxNQUFyQixFQUFxQ0MsUUFBckMsRUFBeUU7RUFDdkVELE1BQU0sQ0FBQ0UsU0FBUCxDQUFpQkQsUUFBakI7QUFDRDs7QUFFRCxTQUFTRSxZQUFULENBQXNCSCxNQUF0QixFQUFzQ0MsUUFBdEMsRUFBMEU7RUFDeEVELE1BQU0sQ0FBQ0ksV0FBUCxDQUFtQkgsUUFBbkI7QUFDRDs7QUFFRCxTQUFTSSxPQUFULENBQWlCTCxNQUFqQixFQUFpQ0MsUUFBakMsRUFBcUU7RUFDbkVELE1BQU0sQ0FBQ00sV0FBUCxDQUFtQkwsUUFBbkI7QUFDRDs7QUFFRCxTQUFTTSxVQUFULENBQW9CUCxNQUFwQixFQUFvQ0MsUUFBcEMsRUFBd0U7RUFDdEVELE1BQU0sQ0FBQ1EsY0FBUCxDQUF1QkMsS0FBRCxJQUFXO0lBQy9CUixRQUFRLENBQUNRLEtBQUssQ0FBQ0MsUUFBTixFQUFELENBQVI7RUFDRCxDQUZEO0FBR0Q7O0FBRUQsU0FBU0MsUUFBVCxDQUFrQlgsTUFBbEIsRUFBa0NDLFFBQWxDLEVBQXNFO0VBQ3BFRCxNQUFNLENBQUNZLFdBQVAsQ0FBbUJYLFFBQW5CO0FBQ0Q7O0FBRUQsU0FBU1ksU0FBVCxDQUFtQmIsTUFBbkIsRUFBbUNDLFFBQW5DLEVBQXVFO0VBQ3JFRCxNQUFNLENBQUNjLFlBQVAsQ0FBb0JiLFFBQXBCO0FBQ0Q7O0FBRUQsU0FBU2MsY0FBVCxDQUF3QmYsTUFBeEIsRUFBd0NDLFFBQXhDLEVBQTRFO0VBQzFFRCxNQUFNLENBQUNNLFdBQVAsQ0FBb0JHLEtBQUQsSUFBVztJQUM1QlIsUUFBUSxDQUFDUSxLQUFLLEdBQUdoQixhQUFULENBQVI7RUFDRCxDQUZEO0FBR0Q7O0FBRUQsU0FBU3VCLFNBQVQsQ0FBbUJoQixNQUFuQixFQUFtQ0MsUUFBbkMsRUFBdUU7RUFDckVELE1BQU0sQ0FBQ00sV0FBUCxDQUFvQlcsSUFBRCxJQUFVO0lBQzNCakIsTUFBTSxDQUFDa0IsWUFBUCxDQUFxQkMsR0FBRCxJQUFTO01BQzNCbEIsUUFBUSxDQUFDLENBQUNrQixHQUFHLEdBQUksY0FBY0YsSUFBdEIsSUFBK0J4QixhQUFoQyxDQUFSO0lBQ0QsQ0FGRDtFQUdELENBSkQ7QUFLRDs7QUFFRCxTQUFTMkIsT0FBVCxDQUFpQnBCLE1BQWpCLEVBQWlDQyxRQUFqQyxFQUFxRTtFQUNuRUQsTUFBTSxDQUFDRSxTQUFQLENBQWtCTyxLQUFELElBQVc7SUFDMUJSLFFBQVEsQ0FBQyxDQUFDLENBQUNRLEtBQUgsQ0FBUjtFQUNELENBRkQ7QUFHRDs7QUFFRCxTQUFTWSxVQUFULENBQW9CckIsTUFBcEIsRUFBb0NzQixRQUFwQyxFQUF3REMsT0FBeEQsRUFBZ0Z0QixRQUFoRixFQUEwSDtFQUN4SCxNQUFNdUIsSUFBSSxHQUFHRixRQUFRLENBQUNFLElBQXRCOztFQUVBLFFBQVFBLElBQUksQ0FBQ0MsSUFBYjtJQUNFLEtBQUssTUFBTDtNQUNFLE9BQU94QixRQUFRLENBQUMsSUFBRCxDQUFmOztJQUVGLEtBQUssU0FBTDtNQUNFLE9BQU9GLFdBQVcsQ0FBQ0MsTUFBRCxFQUFTQyxRQUFULENBQWxCOztJQUVGLEtBQUssVUFBTDtNQUNFLE9BQU9FLFlBQVksQ0FBQ0gsTUFBRCxFQUFTQyxRQUFULENBQW5COztJQUVGLEtBQUssS0FBTDtNQUNFLE9BQU9JLE9BQU8sQ0FBQ0wsTUFBRCxFQUFTQyxRQUFULENBQWQ7O0lBRUYsS0FBSyxRQUFMO01BQ0UsT0FBT00sVUFBVSxDQUFDUCxNQUFELEVBQVNDLFFBQVQsQ0FBakI7O0lBRUYsS0FBSyxNQUFMO01BQ0UsT0FBT0QsTUFBTSxDQUFDRSxTQUFQLENBQWtCd0IsVUFBRCxJQUFnQjtRQUN0QyxRQUFRQSxVQUFSO1VBQ0UsS0FBSyxDQUFMO1lBQ0UsT0FBT3pCLFFBQVEsQ0FBQyxJQUFELENBQWY7O1VBRUYsS0FBSyxDQUFMO1lBQ0UsT0FBT0YsV0FBVyxDQUFDQyxNQUFELEVBQVNDLFFBQVQsQ0FBbEI7O1VBQ0YsS0FBSyxDQUFMO1lBQ0UsT0FBT0UsWUFBWSxDQUFDSCxNQUFELEVBQVNDLFFBQVQsQ0FBbkI7O1VBQ0YsS0FBSyxDQUFMO1lBQ0UsT0FBT0ksT0FBTyxDQUFDTCxNQUFELEVBQVNDLFFBQVQsQ0FBZDs7VUFDRixLQUFLLENBQUw7WUFDRSxPQUFPTSxVQUFVLENBQUNQLE1BQUQsRUFBU0MsUUFBVCxDQUFqQjs7VUFFRjtZQUNFLE1BQU0sSUFBSTBCLEtBQUosQ0FBVSw0QkFBNEJELFVBQTVCLEdBQXlDLFdBQW5ELENBQU47UUFkSjtNQWdCRCxDQWpCTSxDQUFQOztJQW1CRixLQUFLLE1BQUw7TUFDRSxPQUFPZixRQUFRLENBQUNYLE1BQUQsRUFBU0MsUUFBVCxDQUFmOztJQUVGLEtBQUssT0FBTDtNQUNFLE9BQU9ZLFNBQVMsQ0FBQ2IsTUFBRCxFQUFTQyxRQUFULENBQWhCOztJQUVGLEtBQUssUUFBTDtNQUNFLE9BQU9ELE1BQU0sQ0FBQ0UsU0FBUCxDQUFrQndCLFVBQUQsSUFBZ0I7UUFDdEMsUUFBUUEsVUFBUjtVQUNFLEtBQUssQ0FBTDtZQUNFLE9BQU96QixRQUFRLENBQUMsSUFBRCxDQUFmOztVQUVGLEtBQUssQ0FBTDtZQUNFLE9BQU9VLFFBQVEsQ0FBQ1gsTUFBRCxFQUFTQyxRQUFULENBQWY7O1VBQ0YsS0FBSyxDQUFMO1lBQ0UsT0FBT1ksU0FBUyxDQUFDYixNQUFELEVBQVNDLFFBQVQsQ0FBaEI7O1VBRUY7WUFDRSxNQUFNLElBQUkwQixLQUFKLENBQVUsNEJBQTRCRCxVQUE1QixHQUF5QyxhQUFuRCxDQUFOO1FBVko7TUFZRCxDQWJNLENBQVA7O0lBZUYsS0FBSyxZQUFMO01BQ0UsT0FBT1gsY0FBYyxDQUFDZixNQUFELEVBQVNDLFFBQVQsQ0FBckI7O0lBRUYsS0FBSyxPQUFMO01BQ0UsT0FBT2UsU0FBUyxDQUFDaEIsTUFBRCxFQUFTQyxRQUFULENBQWhCOztJQUVGLEtBQUssUUFBTDtNQUNFLE9BQU9ELE1BQU0sQ0FBQ0UsU0FBUCxDQUFrQndCLFVBQUQsSUFBZ0I7UUFDdEMsUUFBUUEsVUFBUjtVQUNFLEtBQUssQ0FBTDtZQUNFLE9BQU96QixRQUFRLENBQUMsSUFBRCxDQUFmOztVQUVGLEtBQUssQ0FBTDtZQUNFLE9BQU9jLGNBQWMsQ0FBQ2YsTUFBRCxFQUFTQyxRQUFULENBQXJCOztVQUNGLEtBQUssQ0FBTDtZQUNFLE9BQU9lLFNBQVMsQ0FBQ2hCLE1BQUQsRUFBU0MsUUFBVCxDQUFoQjs7VUFFRjtZQUNFLE1BQU0sSUFBSTBCLEtBQUosQ0FBVSw0QkFBNEJELFVBQTVCLEdBQXlDLGFBQW5ELENBQU47UUFWSjtNQVlELENBYk0sQ0FBUDs7SUFlRixLQUFLLEtBQUw7TUFDRSxPQUFPTixPQUFPLENBQUNwQixNQUFELEVBQVNDLFFBQVQsQ0FBZDs7SUFFRixLQUFLLE1BQUw7TUFDRSxPQUFPRCxNQUFNLENBQUNFLFNBQVAsQ0FBa0J3QixVQUFELElBQWdCO1FBQ3RDLFFBQVFBLFVBQVI7VUFDRSxLQUFLLENBQUw7WUFDRSxPQUFPekIsUUFBUSxDQUFDLElBQUQsQ0FBZjs7VUFFRixLQUFLLENBQUw7WUFDRSxPQUFPbUIsT0FBTyxDQUFDcEIsTUFBRCxFQUFTQyxRQUFULENBQWQ7O1VBRUY7WUFDRSxNQUFNLElBQUkwQixLQUFKLENBQVUsNEJBQTRCRCxVQUE1QixHQUF5QyxXQUFuRCxDQUFOO1FBUko7TUFVRCxDQVhNLENBQVA7O0lBYUYsS0FBSyxTQUFMO0lBQ0EsS0FBSyxNQUFMO01BQ0UsTUFBTUUsUUFBUSxHQUFHTixRQUFRLENBQUNPLFNBQVQsQ0FBb0JELFFBQXJDOztNQUNBLElBQUlOLFFBQVEsQ0FBQ0ksVUFBVCxLQUF3Qm5DLEdBQTVCLEVBQWlDO1FBQy9CLE9BQU91QyxZQUFZLENBQUM5QixNQUFELEVBQVM0QixRQUFULEVBQW1CM0IsUUFBbkIsQ0FBbkI7TUFDRCxDQUZELE1BRU87UUFDTCxPQUFPRCxNQUFNLENBQUMrQixZQUFQLENBQXFCTCxVQUFELElBQWdCO1VBQ3pDLElBQUlBLFVBQVUsS0FBS3BDLElBQW5CLEVBQXlCO1lBQ3ZCLE9BQU9XLFFBQVEsQ0FBQyxJQUFELENBQWY7VUFDRDs7VUFFRCtCLFNBQVMsQ0FBQ2hDLE1BQUQsRUFBUzBCLFVBQVQsRUFBc0JFLFFBQXRCLEVBQWdDM0IsUUFBaEMsQ0FBVDtRQUNELENBTk0sQ0FBUDtNQU9EOztJQUVILEtBQUssVUFBTDtJQUNBLEtBQUssT0FBTDtNQUNFLElBQUlxQixRQUFRLENBQUNJLFVBQVQsS0FBd0JuQyxHQUE1QixFQUFpQztRQUMvQixPQUFPMEMsYUFBYSxDQUFDakMsTUFBRCxFQUFTQyxRQUFULENBQXBCO01BQ0QsQ0FGRCxNQUVPO1FBQ0wsT0FBT0QsTUFBTSxDQUFDK0IsWUFBUCxDQUFxQkwsVUFBRCxJQUFnQjtVQUN6QyxJQUFJQSxVQUFVLEtBQUtwQyxJQUFuQixFQUF5QjtZQUN2QixPQUFPVyxRQUFRLENBQUMsSUFBRCxDQUFmO1VBQ0Q7O1VBRURpQyxVQUFVLENBQUNsQyxNQUFELEVBQVMwQixVQUFULEVBQXNCekIsUUFBdEIsQ0FBVjtRQUNELENBTk0sQ0FBUDtNQU9EOztJQUVILEtBQUssV0FBTDtJQUNBLEtBQUssUUFBTDtNQUNFLElBQUlxQixRQUFRLENBQUNJLFVBQVQsS0FBd0JuQyxHQUE1QixFQUFpQztRQUMvQixPQUFPNEMsYUFBYSxDQUFDbkMsTUFBRCxFQUFTQyxRQUFULENBQXBCO01BQ0QsQ0FGRCxNQUVPO1FBQ0wsT0FBT0QsTUFBTSxDQUFDK0IsWUFBUCxDQUFxQkwsVUFBRCxJQUFnQjtVQUN6QyxJQUFJQSxVQUFVLEtBQUtwQyxJQUFuQixFQUF5QjtZQUN2QixPQUFPVyxRQUFRLENBQUMsSUFBRCxDQUFmO1VBQ0Q7O1VBRURtQyxVQUFVLENBQUNwQyxNQUFELEVBQVMwQixVQUFULEVBQXNCekIsUUFBdEIsQ0FBVjtRQUNELENBTk0sQ0FBUDtNQU9EOztJQUVILEtBQUssTUFBTDtNQUNFLE9BQU9ELE1BQU0sQ0FBQ0UsU0FBUCxDQUFrQm1DLGlCQUFELElBQXVCO1FBQzdDLElBQUlBLGlCQUFpQixLQUFLLENBQTFCLEVBQTZCO1VBQzNCLE9BQU9wQyxRQUFRLENBQUMsSUFBRCxDQUFmO1FBQ0Q7O1FBRURELE1BQU0sQ0FBQ3NDLFVBQVAsQ0FBa0JELGlCQUFsQixFQUFzQ0UsWUFBRCxJQUFrQjtVQUNyRHZDLE1BQU0sQ0FBQ3NDLFVBQVAsQ0FBa0IsQ0FBbEIsRUFBc0JFLFVBQUQsSUFBZ0I7WUFDbkN4QyxNQUFNLENBQUNrQixZQUFQLENBQXFCUSxVQUFELElBQWdCO2NBQ2xDTSxTQUFTLENBQUNoQyxNQUFELEVBQVMwQixVQUFULEVBQXNCSixRQUFRLENBQUNPLFNBQVQsQ0FBb0JELFFBQTFDLEVBQXFEM0IsUUFBckQsQ0FBVDtZQUNELENBRkQ7VUFHRCxDQUpEO1FBS0QsQ0FORDtNQU9ELENBWk0sQ0FBUDs7SUFjRixLQUFLLE9BQUw7TUFDRSxPQUFPRCxNQUFNLENBQUNFLFNBQVAsQ0FBa0JtQyxpQkFBRCxJQUF1QjtRQUM3QyxJQUFJQSxpQkFBaUIsS0FBSyxDQUExQixFQUE2QjtVQUMzQixPQUFPcEMsUUFBUSxDQUFDLElBQUQsQ0FBZjtRQUNEOztRQUVERCxNQUFNLENBQUNzQyxVQUFQLENBQWtCRCxpQkFBbEIsRUFBc0NFLFlBQUQsSUFBa0I7VUFDckR2QyxNQUFNLENBQUNzQyxVQUFQLENBQWtCLENBQWxCLEVBQXNCRSxVQUFELElBQWdCO1lBQ25DeEMsTUFBTSxDQUFDa0IsWUFBUCxDQUFxQlEsVUFBRCxJQUFnQjtjQUNsQ1EsVUFBVSxDQUFDbEMsTUFBRCxFQUFTMEIsVUFBVCxFQUFzQnpCLFFBQXRCLENBQVY7WUFDRCxDQUZEO1VBR0QsQ0FKRDtRQUtELENBTkQ7TUFPRCxDQVpNLENBQVA7O0lBY0YsS0FBSyxPQUFMO01BQ0UsT0FBT0QsTUFBTSxDQUFDRSxTQUFQLENBQWtCbUMsaUJBQUQsSUFBdUI7UUFDN0MsSUFBSUEsaUJBQWlCLEtBQUssQ0FBMUIsRUFBNkI7VUFDM0IsT0FBT3BDLFFBQVEsQ0FBQyxJQUFELENBQWY7UUFDRDs7UUFFREQsTUFBTSxDQUFDc0MsVUFBUCxDQUFrQkQsaUJBQWxCLEVBQXNDRSxZQUFELElBQWtCO1VBQ3JEdkMsTUFBTSxDQUFDc0MsVUFBUCxDQUFrQixDQUFsQixFQUFzQkUsVUFBRCxJQUFnQjtZQUNuQ3hDLE1BQU0sQ0FBQ2tCLFlBQVAsQ0FBcUJRLFVBQUQsSUFBZ0I7Y0FDbENVLFVBQVUsQ0FBQ3BDLE1BQUQsRUFBUzBCLFVBQVQsRUFBc0J6QixRQUF0QixDQUFWO1lBQ0QsQ0FGRDtVQUdELENBSkQ7UUFLRCxDQU5EO01BT0QsQ0FaTSxDQUFQOztJQWNGLEtBQUssS0FBTDtNQUNFLE9BQU9nQyxhQUFhLENBQUNqQyxNQUFELEVBQVNDLFFBQVQsQ0FBcEI7O0lBRUYsS0FBSyxlQUFMO01BQ0UsT0FBT3dDLGlCQUFpQixDQUFDekMsTUFBRCxFQUFTdUIsT0FBTyxDQUFDbUIsTUFBakIsRUFBeUJ6QyxRQUF6QixDQUF4Qjs7SUFFRixLQUFLLFVBQUw7TUFDRSxPQUFPMEMsWUFBWSxDQUFDM0MsTUFBRCxFQUFTdUIsT0FBTyxDQUFDbUIsTUFBakIsRUFBeUJ6QyxRQUF6QixDQUFuQjs7SUFFRixLQUFLLFdBQUw7TUFDRSxPQUFPRCxNQUFNLENBQUNFLFNBQVAsQ0FBa0J3QixVQUFELElBQWdCO1FBQ3RDLFFBQVFBLFVBQVI7VUFDRSxLQUFLLENBQUw7WUFDRSxPQUFPekIsUUFBUSxDQUFDLElBQUQsQ0FBZjs7VUFFRixLQUFLLENBQUw7WUFDRSxPQUFPd0MsaUJBQWlCLENBQUN6QyxNQUFELEVBQVN1QixPQUFPLENBQUNtQixNQUFqQixFQUF5QnpDLFFBQXpCLENBQXhCOztVQUNGLEtBQUssQ0FBTDtZQUNFLE9BQU8wQyxZQUFZLENBQUMzQyxNQUFELEVBQVN1QixPQUFPLENBQUNtQixNQUFqQixFQUF5QnpDLFFBQXpCLENBQW5COztVQUVGO1lBQ0UsTUFBTSxJQUFJMEIsS0FBSixDQUFVLDRCQUE0QkQsVUFBNUIsR0FBeUMsZ0JBQW5ELENBQU47UUFWSjtNQVlELENBYk0sQ0FBUDs7SUFlRixLQUFLLE1BQUw7TUFDRSxPQUFPMUIsTUFBTSxDQUFDRSxTQUFQLENBQWtCd0IsVUFBRCxJQUFnQjtRQUN0QyxJQUFJQSxVQUFVLEtBQUssQ0FBbkIsRUFBc0I7VUFDcEIsT0FBT3pCLFFBQVEsQ0FBQyxJQUFELENBQWY7UUFDRCxDQUZELE1BRU87VUFDTCxPQUFPMkMsUUFBUSxDQUFDNUMsTUFBRCxFQUFTMEIsVUFBVCxFQUFzQkosUUFBUSxDQUFDdUIsS0FBL0IsRUFBdUN0QixPQUFPLENBQUNtQixNQUEvQyxFQUF1RHpDLFFBQXZELENBQWY7UUFDRDtNQUNGLENBTk0sQ0FBUDs7SUFRRixLQUFLLE1BQUw7TUFDRSxPQUFPRCxNQUFNLENBQUNFLFNBQVAsQ0FBa0J3QixVQUFELElBQWdCO1FBQ3RDLElBQUlBLFVBQVUsS0FBSyxDQUFuQixFQUFzQjtVQUNwQixPQUFPekIsUUFBUSxDQUFDLElBQUQsQ0FBZjtRQUNELENBRkQsTUFFTztVQUNMLE9BQU82QyxRQUFRLENBQUM5QyxNQUFELEVBQVN1QixPQUFPLENBQUNtQixNQUFqQixFQUF5QnpDLFFBQXpCLENBQWY7UUFDRDtNQUNGLENBTk0sQ0FBUDs7SUFRRixLQUFLLFdBQUw7TUFDRSxPQUFPRCxNQUFNLENBQUNFLFNBQVAsQ0FBa0J3QixVQUFELElBQWdCO1FBQ3RDLElBQUlBLFVBQVUsS0FBSyxDQUFuQixFQUFzQjtVQUNwQixPQUFPekIsUUFBUSxDQUFDLElBQUQsQ0FBZjtRQUNELENBRkQsTUFFTztVQUNMLE9BQU84QyxhQUFhLENBQUMvQyxNQUFELEVBQVMwQixVQUFULEVBQXNCSixRQUFRLENBQUN1QixLQUEvQixFQUF1Q3RCLE9BQU8sQ0FBQ21CLE1BQS9DLEVBQXVEekMsUUFBdkQsQ0FBcEI7UUFDRDtNQUNGLENBTk0sQ0FBUDs7SUFRRixLQUFLLGdCQUFMO01BQ0UsT0FBT0QsTUFBTSxDQUFDRSxTQUFQLENBQWtCd0IsVUFBRCxJQUFnQjtRQUN0QyxJQUFJQSxVQUFVLEtBQUssQ0FBbkIsRUFBc0I7VUFDcEIsT0FBT3pCLFFBQVEsQ0FBQyxJQUFELENBQWY7UUFDRCxDQUZELE1BRU87VUFDTCxPQUFPK0Msa0JBQWtCLENBQUNoRCxNQUFELEVBQVMwQixVQUFULEVBQXNCSixRQUFRLENBQUN1QixLQUEvQixFQUF1QzVDLFFBQXZDLENBQXpCO1FBQ0Q7TUFDRixDQU5NLENBQVA7O0lBUUYsS0FBSyxVQUFMO0lBQ0EsS0FBSyxVQUFMO01BQ0UsT0FBT0QsTUFBTSxDQUFDRSxTQUFQLENBQWtCd0IsVUFBRCxJQUFnQjtRQUN0QyxJQUFJQSxVQUFVLEtBQUssQ0FBbkIsRUFBc0I7VUFDcEIsT0FBT3pCLFFBQVEsQ0FBQyxJQUFELENBQWY7UUFDRCxDQUZELE1BRU87VUFDTCxPQUFPZ0QsV0FBVyxDQUFDakQsTUFBRCxFQUFTMEIsVUFBVCxFQUFzQkosUUFBUSxDQUFDNEIsU0FBL0IsRUFBMkM1QixRQUFRLENBQUN1QixLQUFwRCxFQUE0RDVDLFFBQTVELENBQWxCO1FBQ0Q7TUFDRixDQU5NLENBQVA7O0lBUUYsS0FBSyxrQkFBTDtNQUNFLE9BQU9ELE1BQU0sQ0FBQ0UsU0FBUCxDQUFrQndCLFVBQUQsSUFBZ0I7UUFDdEMsUUFBUUEsVUFBUjtVQUNFLEtBQUssQ0FBTDtZQUNFLE9BQU96QixRQUFRLENBQUMsSUFBRCxDQUFmOztVQUVGLEtBQUssSUFBTDtZQUNFLE9BQU9rRCxvQkFBb0IsQ0FBQ25ELE1BQUQsRUFBU3VCLE9BQVQsRUFBa0J0QixRQUFsQixDQUEzQjs7VUFFRjtZQUNFLE1BQU0sSUFBSTBCLEtBQUosQ0FBVSx3QkFBUSwwQkFBUixFQUFvQ0QsVUFBVSxHQUFJLENBQWxELENBQVYsQ0FBTjtRQVJKO01BVUQsQ0FYTSxDQUFQOztJQWFGLEtBQUssS0FBTDtNQUNFLE9BQU9TLGFBQWEsQ0FBQ25DLE1BQUQsRUFBU0MsUUFBVCxDQUFwQjs7SUFFRixLQUFLLFNBQUw7TUFDRSxPQUFPRCxNQUFNLENBQUNrQixZQUFQLENBQXFCUSxVQUFELElBQWdCO1FBQ3pDLElBQUlBLFVBQVUsS0FBSyxDQUFuQixFQUFzQjtVQUNwQixPQUFPekIsUUFBUSxDQUFDLElBQUQsQ0FBZjtRQUNEOztRQUVEbUQsV0FBVyxDQUFDcEQsTUFBRCxFQUFTdUIsT0FBVCxFQUFrQkcsVUFBbEIsRUFBK0J6QixRQUEvQixDQUFYO01BQ0QsQ0FOTSxDQUFQOztJQVFGO01BQ0UsTUFBTSxJQUFJMEIsS0FBSixDQUFVLHdCQUFRLHNCQUFSLEVBQWdDSCxJQUFJLENBQUNDLElBQXJDLENBQVYsQ0FBTjtFQTNSSjtBQTZSRDs7QUFFRCxTQUFTMEIsb0JBQVQsQ0FBOEJuRCxNQUE5QixFQUE4Q3VCLE9BQTlDLEVBQXNFdEIsUUFBdEUsRUFBMEc7RUFDeEdELE1BQU0sQ0FBQ3NDLFVBQVAsQ0FBa0IsSUFBbEIsRUFBeUJlLElBQUQsSUFBVTtJQUNoQ3BELFFBQVEsQ0FBQ3NCLE9BQU8sQ0FBQytCLGNBQVIsR0FBeUIsdUNBQXNCRCxJQUF0QixDQUF6QixHQUF1RCx1Q0FBc0JBLElBQXRCLENBQXhELENBQVI7RUFDRCxDQUZEO0FBR0Q7O0FBRUQsU0FBU0osV0FBVCxDQUFxQmpELE1BQXJCLEVBQXFDMEIsVUFBckMsRUFBeUQ2QixVQUF6RCxFQUE2RVYsS0FBN0UsRUFBNEY1QyxRQUE1RixFQUFnSTtFQUM5SEQsTUFBTSxDQUFDRSxTQUFQLENBQWtCc0QsSUFBRCxJQUFVO0lBQ3pCQSxJQUFJLEdBQUdBLElBQUksS0FBSyxDQUFULEdBQWEsQ0FBYixHQUFpQixDQUFDLENBQXpCO0lBRUEsSUFBSUMsU0FBSjs7SUFDQSxJQUFJL0IsVUFBVSxLQUFLLENBQW5CLEVBQXNCO01BQ3BCK0IsU0FBUyxHQUFHekQsTUFBTSxDQUFDa0IsWUFBbkI7SUFDRCxDQUZELE1BRU8sSUFBSVEsVUFBVSxLQUFLLENBQW5CLEVBQXNCO01BQzNCK0IsU0FBUyxHQUFHekQsTUFBTSxDQUFDMEQsZ0JBQW5CO0lBQ0QsQ0FGTSxNQUVBLElBQUloQyxVQUFVLEtBQUssRUFBbkIsRUFBdUI7TUFDNUIrQixTQUFTLEdBQUd6RCxNQUFNLENBQUMyRCxnQkFBbkI7SUFDRCxDQUZNLE1BRUEsSUFBSWpDLFVBQVUsS0FBSyxFQUFuQixFQUF1QjtNQUM1QitCLFNBQVMsR0FBR3pELE1BQU0sQ0FBQzRELGlCQUFuQjtJQUNELENBRk0sTUFFQTtNQUNMLE1BQU0sSUFBSWpDLEtBQUosQ0FBVSx3QkFBUSxtQ0FBUixFQUE2Q0QsVUFBN0MsQ0FBVixDQUFOO0lBQ0Q7O0lBRUQrQixTQUFTLENBQUNJLElBQVYsQ0FBZTdELE1BQWYsRUFBd0JTLEtBQUQsSUFBVztNQUNoQ1IsUUFBUSxDQUFFUSxLQUFLLEdBQUcrQyxJQUFULEdBQWlCTSxJQUFJLENBQUNDLEdBQUwsQ0FBUyxFQUFULEVBQWFsQixLQUFiLENBQWxCLENBQVI7SUFDRCxDQUZEO0VBR0QsQ0FuQkQ7QUFvQkQ7O0FBRUQsU0FBU08sV0FBVCxDQUFxQnBELE1BQXJCLEVBQXFDdUIsT0FBckMsRUFBNkRHLFVBQTdELEVBQWlGekIsUUFBakYsRUFBcUg7RUFDbkgsT0FBT0QsTUFBTSxDQUFDRSxTQUFQLENBQWtCOEQsUUFBRCxJQUFjO0lBQ3BDLE1BQU14QyxJQUFJLEdBQUd5QyxlQUFLRCxRQUFMLENBQWI7SUFFQSxPQUFPaEUsTUFBTSxDQUFDRSxTQUFQLENBQWtCZ0UsU0FBRCxJQUFlO01BQ3JDeEMsVUFBVSxHQUFHQSxVQUFVLEdBQUd3QyxTQUFiLEdBQXlCLENBQXRDOztNQUVBLFFBQVExQyxJQUFJLENBQUNDLElBQWI7UUFDRSxLQUFLLGtCQUFMO1VBQ0UsT0FBTzBCLG9CQUFvQixDQUFDbkQsTUFBRCxFQUFTdUIsT0FBVCxFQUFrQnRCLFFBQWxCLENBQTNCOztRQUVGLEtBQUssS0FBTDtVQUNFLE9BQU9tQixPQUFPLENBQUNwQixNQUFELEVBQVNDLFFBQVQsQ0FBZDs7UUFFRixLQUFLLFNBQUw7VUFDRSxPQUFPRixXQUFXLENBQUNDLE1BQUQsRUFBU0MsUUFBVCxDQUFsQjs7UUFFRixLQUFLLFVBQUw7VUFDRSxPQUFPRSxZQUFZLENBQUNILE1BQUQsRUFBU0MsUUFBVCxDQUFuQjs7UUFFRixLQUFLLEtBQUw7VUFDRSxPQUFPSSxPQUFPLENBQUNMLE1BQUQsRUFBU0MsUUFBVCxDQUFkOztRQUVGLEtBQUssUUFBTDtVQUNFLE9BQU9NLFVBQVUsQ0FBQ1AsTUFBRCxFQUFTQyxRQUFULENBQWpCOztRQUVGLEtBQUssZUFBTDtVQUNFLE9BQU93QyxpQkFBaUIsQ0FBQ3pDLE1BQUQsRUFBU3VCLE9BQU8sQ0FBQ21CLE1BQWpCLEVBQXlCekMsUUFBekIsQ0FBeEI7O1FBRUYsS0FBSyxVQUFMO1VBQ0UsT0FBTzBDLFlBQVksQ0FBQzNDLE1BQUQsRUFBU3VCLE9BQU8sQ0FBQ21CLE1BQWpCLEVBQXlCekMsUUFBekIsQ0FBbkI7O1FBRUYsS0FBSyxNQUFMO1VBQ0UsT0FBT1UsUUFBUSxDQUFDWCxNQUFELEVBQVNDLFFBQVQsQ0FBZjs7UUFFRixLQUFLLE9BQUw7VUFDRSxPQUFPWSxTQUFTLENBQUNiLE1BQUQsRUFBU0MsUUFBVCxDQUFoQjs7UUFFRixLQUFLLFlBQUw7VUFDRSxPQUFPYyxjQUFjLENBQUNmLE1BQUQsRUFBU0MsUUFBVCxDQUFyQjs7UUFFRixLQUFLLE9BQUw7VUFDRSxPQUFPZSxTQUFTLENBQUNoQixNQUFELEVBQVNDLFFBQVQsQ0FBaEI7O1FBRUYsS0FBSyxNQUFMO1VBQ0UsT0FBTzZDLFFBQVEsQ0FBQzlDLE1BQUQsRUFBU3VCLE9BQU8sQ0FBQ21CLE1BQWpCLEVBQXlCekMsUUFBekIsQ0FBZjs7UUFFRixLQUFLLE1BQUw7VUFDRSxPQUFPRCxNQUFNLENBQUNFLFNBQVAsQ0FBa0IyQyxLQUFELElBQVc7WUFDakMsT0FBT0QsUUFBUSxDQUFDNUMsTUFBRCxFQUFTMEIsVUFBVCxFQUFxQm1CLEtBQXJCLEVBQTRCdEIsT0FBTyxDQUFDbUIsTUFBcEMsRUFBNEN6QyxRQUE1QyxDQUFmO1VBQ0QsQ0FGTSxDQUFQOztRQUlGLEtBQUssV0FBTDtVQUNFLE9BQU9ELE1BQU0sQ0FBQ0UsU0FBUCxDQUFrQjJDLEtBQUQsSUFBVztZQUNqQyxPQUFPRSxhQUFhLENBQUMvQyxNQUFELEVBQVMwQixVQUFULEVBQXFCbUIsS0FBckIsRUFBNEJ0QixPQUFPLENBQUNtQixNQUFwQyxFQUE0Q3pDLFFBQTVDLENBQXBCO1VBQ0QsQ0FGTSxDQUFQOztRQUlGLEtBQUssZ0JBQUw7VUFDRSxPQUFPRCxNQUFNLENBQUNFLFNBQVAsQ0FBa0IyQyxLQUFELElBQVc7WUFDakMsT0FBT0csa0JBQWtCLENBQUNoRCxNQUFELEVBQVMwQixVQUFULEVBQXFCbUIsS0FBckIsRUFBNEI1QyxRQUE1QixDQUF6QjtVQUNELENBRk0sQ0FBUDs7UUFJRixLQUFLLFdBQUw7UUFDQSxLQUFLLFFBQUw7VUFDRSxPQUFPRCxNQUFNLENBQUMrQixZQUFQLENBQXFCb0MsVUFBRCxJQUFnQjtZQUN6Qy9CLFVBQVUsQ0FBQ3BDLE1BQUQsRUFBUzBCLFVBQVQsRUFBcUJ6QixRQUFyQixDQUFWO1VBQ0QsQ0FGTSxDQUFQOztRQUlGLEtBQUssVUFBTDtRQUNBLEtBQUssVUFBTDtVQUNFLE9BQU9ELE1BQU0sQ0FBQ0UsU0FBUCxDQUFrQmdELFNBQUQsSUFBZTtZQUNyQ2xELE1BQU0sQ0FBQ0UsU0FBUCxDQUFrQjJDLEtBQUQsSUFBVztjQUMxQkksV0FBVyxDQUFDakQsTUFBRCxFQUFTMEIsVUFBVCxFQUFxQndCLFNBQXJCLEVBQWdDTCxLQUFoQyxFQUF1QzVDLFFBQXZDLENBQVg7WUFDRCxDQUZEO1VBR0QsQ0FKTSxDQUFQOztRQU1GLEtBQUssU0FBTDtRQUNBLEtBQUssTUFBTDtVQUNFLE9BQU9ELE1BQU0sQ0FBQytCLFlBQVAsQ0FBcUJvQyxVQUFELElBQWdCO1lBQ3pDLG1DQUFjbkUsTUFBZCxFQUF1QjZCLFNBQUQsSUFBZTtjQUNuQ0csU0FBUyxDQUFDaEMsTUFBRCxFQUFTMEIsVUFBVCxFQUFxQkcsU0FBUyxDQUFDRCxRQUEvQixFQUEwQzNCLFFBQTFDLENBQVQ7WUFDRCxDQUZEO1VBR0QsQ0FKTSxDQUFQOztRQU1GLEtBQUssVUFBTDtRQUNBLEtBQUssT0FBTDtVQUNFLE9BQU9ELE1BQU0sQ0FBQytCLFlBQVAsQ0FBcUJvQyxVQUFELElBQWdCO1lBQ3pDLG1DQUFjbkUsTUFBZCxFQUF1Qm9FLFVBQUQsSUFBZ0I7Y0FDcENsQyxVQUFVLENBQUNsQyxNQUFELEVBQVMwQixVQUFULEVBQXFCekIsUUFBckIsQ0FBVjtZQUNELENBRkQ7VUFHRCxDQUpNLENBQVA7O1FBTUY7VUFDRSxNQUFNLElBQUkwQixLQUFKLENBQVUsZUFBVixDQUFOO01BdEZKO0lBd0ZELENBM0ZNLENBQVA7RUE0RkQsQ0EvRk0sQ0FBUDtBQWdHRDs7QUFFRCxTQUFTUyxVQUFULENBQW9CcEMsTUFBcEIsRUFBb0MwQixVQUFwQyxFQUF3RHpCLFFBQXhELEVBQTRGO0VBQzFGLE9BQU9ELE1BQU0sQ0FBQ3NDLFVBQVAsQ0FBa0JaLFVBQWxCLEVBQThCekIsUUFBOUIsQ0FBUDtBQUNEOztBQUVELFNBQVMrQixTQUFULENBQW1CaEMsTUFBbkIsRUFBbUMwQixVQUFuQyxFQUF1REUsUUFBdkQsRUFBeUUzQixRQUF6RSxFQUE2RztFQUMzRyxJQUFJMkIsUUFBUSxJQUFJLElBQWhCLEVBQXNCO0lBQ3BCQSxRQUFRLEdBQUc5QixnQkFBWDtFQUNEOztFQUVELE9BQU9FLE1BQU0sQ0FBQ3NDLFVBQVAsQ0FBa0JaLFVBQWxCLEVBQStCMkIsSUFBRCxJQUFVO0lBQzdDcEQsUUFBUSxDQUFDb0UsbUJBQU1DLE1BQU4sQ0FBYWpCLElBQWIsRUFBbUJ6QixRQUFuQixDQUFELENBQVI7RUFDRCxDQUZNLENBQVA7QUFHRDs7QUFFRCxTQUFTTSxVQUFULENBQW9CbEMsTUFBcEIsRUFBb0MwQixVQUFwQyxFQUF3RHpCLFFBQXhELEVBQTRGO0VBQzFGRCxNQUFNLENBQUNzQyxVQUFQLENBQWtCWixVQUFsQixFQUErQjJCLElBQUQsSUFBVTtJQUN0Q3BELFFBQVEsQ0FBQ29ELElBQUksQ0FBQzNDLFFBQUwsQ0FBYyxNQUFkLENBQUQsQ0FBUjtFQUNELENBRkQ7QUFHRDs7QUFFRCxTQUFTeUIsYUFBVCxDQUF1Qm5DLE1BQXZCLEVBQXVDQyxRQUF2QyxFQUEyRTtFQUN6RSxPQUFPc0UsT0FBTyxDQUFDdkUsTUFBRCxFQUFTQyxRQUFULENBQWQ7QUFDRDs7QUFFRCxTQUFTNkIsWUFBVCxDQUFzQjlCLE1BQXRCLEVBQXNDNEIsUUFBdEMsRUFBd0QzQixRQUF4RCxFQUE0RjtFQUMxRixJQUFJMkIsUUFBUSxJQUFJLElBQWhCLEVBQXNCO0lBQ3BCQSxRQUFRLEdBQUc5QixnQkFBWDtFQUNEOztFQUVEeUUsT0FBTyxDQUFDdkUsTUFBRCxFQUFVcUQsSUFBRCxJQUFVO0lBQ3hCLElBQUlBLElBQUosRUFBVTtNQUNScEQsUUFBUSxDQUFDb0UsbUJBQU1DLE1BQU4sQ0FBYWpCLElBQWIsRUFBbUJ6QixRQUFuQixDQUFELENBQVI7SUFDRCxDQUZELE1BRU87TUFDTDNCLFFBQVEsQ0FBQyxJQUFELENBQVI7SUFDRDtFQUNGLENBTk0sQ0FBUDtBQU9EOztBQUVELFNBQVNnQyxhQUFULENBQXVCakMsTUFBdkIsRUFBdUNDLFFBQXZDLEVBQWlGO0VBQy9Fc0UsT0FBTyxDQUFDdkUsTUFBRCxFQUFVcUQsSUFBRCxJQUFVO0lBQ3hCLElBQUlBLElBQUosRUFBVTtNQUNScEQsUUFBUSxDQUFDb0QsSUFBSSxDQUFDM0MsUUFBTCxDQUFjLE1BQWQsQ0FBRCxDQUFSO0lBQ0QsQ0FGRCxNQUVPO01BQ0xULFFBQVEsQ0FBQyxJQUFELENBQVI7SUFDRDtFQUNGLENBTk0sQ0FBUDtBQU9EOztBQUVELFNBQVNzRSxPQUFULENBQWlCdkUsTUFBakIsRUFBaUNDLFFBQWpDLEVBQTJFO0VBQ3pFRCxNQUFNLENBQUNzQyxVQUFQLENBQWtCLENBQWxCLEVBQXNCZCxJQUFELElBQVU7SUFDN0IsSUFBSUEsSUFBSSxDQUFDZ0QsTUFBTCxDQUFZOUUsUUFBWixDQUFKLEVBQTJCO01BQ3pCLE9BQU9PLFFBQVEsQ0FBQyxJQUFELENBQWY7SUFDRCxDQUZELE1BRU8sSUFBSXVCLElBQUksQ0FBQ2dELE1BQUwsQ0FBWTNFLGVBQVosQ0FBSixFQUFrQztNQUN2QyxPQUFPNEUsb0JBQW9CLENBQUN6RSxNQUFELEVBQVNDLFFBQVQsQ0FBM0I7SUFDRCxDQUZNLE1BRUE7TUFDTCxNQUFNa0IsR0FBRyxHQUFHSyxJQUFJLENBQUNOLFlBQUwsQ0FBa0IsQ0FBbEIsQ0FBWjtNQUNBLE1BQU1ELElBQUksR0FBR08sSUFBSSxDQUFDTixZQUFMLENBQWtCLENBQWxCLENBQWI7O01BRUEsSUFBSUQsSUFBSSxJQUFLLEtBQU0sS0FBSyxFQUF4QixFQUE4QjtRQUM1QnlELE9BQU8sQ0FBQ0MsSUFBUixDQUFhLG9DQUFvQzFELElBQXBDLEdBQTJDLFFBQTNDLEdBQXNERSxHQUFuRTtNQUNEOztNQUVELE1BQU15RCxjQUFjLEdBQUd6RCxHQUFHLEdBQUksY0FBY0YsSUFBNUM7TUFDQSxPQUFPNEQsa0JBQWtCLENBQUM3RSxNQUFELEVBQVM0RSxjQUFULEVBQXlCM0UsUUFBekIsQ0FBekI7SUFDRDtFQUNGLENBaEJEO0FBaUJEOztBQUVELFNBQVM0RSxrQkFBVCxDQUE0QjdFLE1BQTVCLEVBQTRDOEUsV0FBNUMsRUFBaUU3RSxRQUFqRSxFQUEyRztFQUN6RyxNQUFNb0QsSUFBSSxHQUFHMUQsTUFBTSxDQUFDb0YsS0FBUCxDQUFhRCxXQUFiLEVBQTBCLENBQTFCLENBQWI7RUFFQSxJQUFJRSxNQUFNLEdBQUcsQ0FBYjs7RUFDQSxTQUFTQyxJQUFULENBQWNDLElBQWQsRUFBeUI7SUFDdkJsRixNQUFNLENBQUNrQixZQUFQLENBQXFCaUUsV0FBRCxJQUFpQjtNQUNuQyxJQUFJLENBQUNBLFdBQUwsRUFBa0I7UUFDaEIsT0FBT0QsSUFBSSxFQUFYO01BQ0Q7O01BRURsRixNQUFNLENBQUNzQyxVQUFQLENBQWtCNkMsV0FBbEIsRUFBZ0NDLEtBQUQsSUFBVztRQUN4Q0EsS0FBSyxDQUFDQyxJQUFOLENBQVdoQyxJQUFYLEVBQWlCMkIsTUFBakI7UUFDQUEsTUFBTSxJQUFJRyxXQUFWO1FBRUFGLElBQUksQ0FBQ0MsSUFBRCxDQUFKO01BQ0QsQ0FMRDtJQU1ELENBWEQ7RUFZRDs7RUFFREQsSUFBSSxDQUFDLE1BQU07SUFDVCxJQUFJRCxNQUFNLEtBQUtGLFdBQWYsRUFBNEI7TUFDMUIsTUFBTSxJQUFJbkQsS0FBSixDQUFVLGtFQUFrRW1ELFdBQWxFLEdBQWdGLFlBQWhGLEdBQStGRSxNQUEvRixHQUF3RyxRQUFsSCxDQUFOO0lBQ0Q7O0lBRUQvRSxRQUFRLENBQUNvRCxJQUFELENBQVI7RUFDRCxDQU5HLENBQUo7QUFPRDs7QUFFRCxTQUFTb0Isb0JBQVQsQ0FBOEJ6RSxNQUE5QixFQUE4Q0MsUUFBOUMsRUFBd0Y7RUFDdEYsTUFBTXFGLE1BQWdCLEdBQUcsRUFBekI7RUFFQSxJQUFJQyxNQUFNLEdBQUcsQ0FBYjs7RUFDQSxTQUFTTixJQUFULENBQWNDLElBQWQsRUFBeUI7SUFDdkJsRixNQUFNLENBQUNrQixZQUFQLENBQXFCaUUsV0FBRCxJQUFpQjtNQUNuQyxJQUFJLENBQUNBLFdBQUwsRUFBa0I7UUFDaEIsT0FBT0QsSUFBSSxFQUFYO01BQ0Q7O01BRURsRixNQUFNLENBQUNzQyxVQUFQLENBQWtCNkMsV0FBbEIsRUFBZ0NDLEtBQUQsSUFBVztRQUN4Q0UsTUFBTSxDQUFDRSxJQUFQLENBQVlKLEtBQVo7UUFDQUcsTUFBTSxJQUFJSixXQUFWO1FBRUFGLElBQUksQ0FBQ0MsSUFBRCxDQUFKO01BQ0QsQ0FMRDtJQU1ELENBWEQ7RUFZRDs7RUFFREQsSUFBSSxDQUFDLE1BQU07SUFDVGhGLFFBQVEsQ0FBQ04sTUFBTSxDQUFDOEYsTUFBUCxDQUFjSCxNQUFkLEVBQXNCQyxNQUF0QixDQUFELENBQVI7RUFDRCxDQUZHLENBQUo7QUFHRDs7QUFFRCxTQUFTOUMsaUJBQVQsQ0FBMkJ6QyxNQUEzQixFQUEyQzBDLE1BQTNDLEVBQTREekMsUUFBNUQsRUFBNkY7RUFDM0ZELE1BQU0sQ0FBQytCLFlBQVAsQ0FBcUIyRCxJQUFELElBQVU7SUFDNUIxRixNQUFNLENBQUMrQixZQUFQLENBQXFCNEQsT0FBRCxJQUFhO01BQy9CLElBQUlsRixLQUFKOztNQUNBLElBQUlpQyxNQUFKLEVBQVk7UUFDVmpDLEtBQUssR0FBRyxJQUFJbUYsSUFBSixDQUFTQSxJQUFJLENBQUNDLEdBQUwsQ0FBUyxJQUFULEVBQWUsQ0FBZixFQUFrQixJQUFJSCxJQUF0QixFQUE0QixDQUE1QixFQUErQkMsT0FBL0IsQ0FBVCxDQUFSO01BQ0QsQ0FGRCxNQUVPO1FBQ0xsRixLQUFLLEdBQUcsSUFBSW1GLElBQUosQ0FBUyxJQUFULEVBQWUsQ0FBZixFQUFrQixJQUFJRixJQUF0QixFQUE0QixDQUE1QixFQUErQkMsT0FBL0IsQ0FBUjtNQUNEOztNQUNEMUYsUUFBUSxDQUFDUSxLQUFELENBQVI7SUFDRCxDQVJEO0VBU0QsQ0FWRDtBQVdEOztBQUVELFNBQVNrQyxZQUFULENBQXNCM0MsTUFBdEIsRUFBc0MwQyxNQUF0QyxFQUF1RHpDLFFBQXZELEVBQXdGO0VBQ3RGRCxNQUFNLENBQUNNLFdBQVAsQ0FBb0JvRixJQUFELElBQVU7SUFDM0IxRixNQUFNLENBQUNrQixZQUFQLENBQXFCNEUsdUJBQUQsSUFBNkI7TUFDL0MsTUFBTUMsWUFBWSxHQUFHakMsSUFBSSxDQUFDa0MsS0FBTCxDQUFXRix1QkFBdUIsR0FBR3RHLGlCQUFyQyxDQUFyQjtNQUVBLElBQUlpQixLQUFKOztNQUNBLElBQUlpQyxNQUFKLEVBQVk7UUFDVmpDLEtBQUssR0FBRyxJQUFJbUYsSUFBSixDQUFTQSxJQUFJLENBQUNDLEdBQUwsQ0FBUyxJQUFULEVBQWUsQ0FBZixFQUFrQixJQUFJSCxJQUF0QixFQUE0QixDQUE1QixFQUErQixDQUEvQixFQUFrQyxDQUFsQyxFQUFxQ0ssWUFBckMsQ0FBVCxDQUFSO01BQ0QsQ0FGRCxNQUVPO1FBQ0x0RixLQUFLLEdBQUcsSUFBSW1GLElBQUosQ0FBUyxJQUFULEVBQWUsQ0FBZixFQUFrQixJQUFJRixJQUF0QixFQUE0QixDQUE1QixFQUErQixDQUEvQixFQUFrQyxDQUFsQyxFQUFxQ0ssWUFBckMsQ0FBUjtNQUNEOztNQUVEOUYsUUFBUSxDQUFDUSxLQUFELENBQVI7SUFDRCxDQVhEO0VBWUQsQ0FiRDtBQWNEOztBQU1ELFNBQVNtQyxRQUFULENBQWtCNUMsTUFBbEIsRUFBa0MwQixVQUFsQyxFQUFzRG1CLEtBQXRELEVBQXFFSCxNQUFyRSxFQUFzRnpDLFFBQXRGLEVBQTJJO0VBQ3pJLElBQUl3RCxTQUFKOztFQUNBLFFBQVEvQixVQUFSO0lBQ0UsS0FBSyxDQUFMO01BQ0UrQixTQUFTLEdBQUd6RCxNQUFNLENBQUNpRyxZQUFuQjtNQUNBOztJQUNGLEtBQUssQ0FBTDtNQUNFeEMsU0FBUyxHQUFHekQsTUFBTSxDQUFDa0IsWUFBbkI7TUFDQTs7SUFDRixLQUFLLENBQUw7TUFDRXVDLFNBQVMsR0FBR3pELE1BQU0sQ0FBQ2tHLFlBQW5CO0VBUko7O0VBV0F6QyxTQUFTLENBQUVJLElBQVgsQ0FBZ0I3RCxNQUFoQixFQUF5QlMsS0FBRCxJQUFtQjtJQUN6QyxJQUFJb0MsS0FBSyxHQUFHLENBQVosRUFBZTtNQUNiLEtBQUssSUFBSXNELENBQUMsR0FBR3RELEtBQWIsRUFBb0JzRCxDQUFDLEdBQUcsQ0FBeEIsRUFBMkJBLENBQUMsRUFBNUIsRUFBZ0M7UUFDOUIxRixLQUFLLElBQUksRUFBVDtNQUNEO0lBQ0Y7O0lBRUQsSUFBSTJGLElBQUo7O0lBQ0EsSUFBSTFELE1BQUosRUFBWTtNQUNWMEQsSUFBSSxHQUFHLElBQUlSLElBQUosQ0FBU0EsSUFBSSxDQUFDQyxHQUFMLENBQVMsSUFBVCxFQUFlLENBQWYsRUFBa0IsQ0FBbEIsRUFBcUIsQ0FBckIsRUFBd0IsQ0FBeEIsRUFBMkIsQ0FBM0IsRUFBOEJwRixLQUFLLEdBQUcsS0FBdEMsQ0FBVCxDQUFQO0lBQ0QsQ0FGRCxNQUVPO01BQ0wyRixJQUFJLEdBQUcsSUFBSVIsSUFBSixDQUFTLElBQVQsRUFBZSxDQUFmLEVBQWtCLENBQWxCLEVBQXFCLENBQXJCLEVBQXdCLENBQXhCLEVBQTJCLENBQTNCLEVBQThCbkYsS0FBSyxHQUFHLEtBQXRDLENBQVA7SUFDRDs7SUFDRDRGLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQkYsSUFBdEIsRUFBNEIsa0JBQTVCLEVBQWdEO01BQzlDRyxVQUFVLEVBQUUsS0FEa0M7TUFFOUM5RixLQUFLLEVBQUdBLEtBQUssR0FBRyxLQUFULEdBQWtCcUQsSUFBSSxDQUFDQyxHQUFMLENBQVMsRUFBVCxFQUFhLENBQWI7SUFGcUIsQ0FBaEQ7SUFJQTlELFFBQVEsQ0FBQ21HLElBQUQsQ0FBUjtFQUNELENBbEJEO0FBbUJEOztBQUVELFNBQVN0RCxRQUFULENBQWtCOUMsTUFBbEIsRUFBa0MwQyxNQUFsQyxFQUFtRHpDLFFBQW5ELEVBQW9GO0VBQ2xGRCxNQUFNLENBQUNpRyxZQUFQLENBQXFCUCxJQUFELElBQVU7SUFDNUIsSUFBSWhELE1BQUosRUFBWTtNQUNWekMsUUFBUSxDQUFDLElBQUkyRixJQUFKLENBQVNBLElBQUksQ0FBQ0MsR0FBTCxDQUFTLElBQVQsRUFBZSxDQUFmLEVBQWtCSCxJQUFJLEdBQUcsTUFBekIsQ0FBVCxDQUFELENBQVI7SUFDRCxDQUZELE1BRU87TUFDTHpGLFFBQVEsQ0FBQyxJQUFJMkYsSUFBSixDQUFTLElBQVQsRUFBZSxDQUFmLEVBQWtCRixJQUFJLEdBQUcsTUFBekIsQ0FBRCxDQUFSO0lBQ0Q7RUFDRixDQU5EO0FBT0Q7O0FBRUQsU0FBUzNDLGFBQVQsQ0FBdUIvQyxNQUF2QixFQUF1QzBCLFVBQXZDLEVBQTJEbUIsS0FBM0QsRUFBMEVILE1BQTFFLEVBQTJGekMsUUFBM0YsRUFBZ0o7RUFDOUkyQyxRQUFRLENBQUM1QyxNQUFELEVBQVMwQixVQUFVLEdBQUcsQ0FBdEIsRUFBeUJtQixLQUF6QixFQUFnQ0gsTUFBaEMsRUFBeUM4RCxJQUFELElBQVU7SUFBRTtJQUMxRHhHLE1BQU0sQ0FBQ2lHLFlBQVAsQ0FBcUJQLElBQUQsSUFBVTtNQUM1QixJQUFJVSxJQUFKOztNQUNBLElBQUkxRCxNQUFKLEVBQVk7UUFDVjBELElBQUksR0FBRyxJQUFJUixJQUFKLENBQVNBLElBQUksQ0FBQ0MsR0FBTCxDQUFTLElBQVQsRUFBZSxDQUFmLEVBQWtCSCxJQUFJLEdBQUcsTUFBekIsRUFBaUMsQ0FBakMsRUFBb0MsQ0FBcEMsRUFBdUMsQ0FBdkMsRUFBMEMsQ0FBQ2MsSUFBM0MsQ0FBVCxDQUFQO01BQ0QsQ0FGRCxNQUVPO1FBQ0xKLElBQUksR0FBRyxJQUFJUixJQUFKLENBQVMsSUFBVCxFQUFlLENBQWYsRUFBa0JGLElBQUksR0FBRyxNQUF6QixFQUFpQ2MsSUFBSSxDQUFDQyxRQUFMLEVBQWpDLEVBQWtERCxJQUFJLENBQUNFLFVBQUwsRUFBbEQsRUFBcUVGLElBQUksQ0FBQ0csVUFBTCxFQUFyRSxFQUF3RkgsSUFBSSxDQUFDSSxlQUFMLEVBQXhGLENBQVA7TUFDRDs7TUFDRFAsTUFBTSxDQUFDQyxjQUFQLENBQXNCRixJQUF0QixFQUE0QixrQkFBNUIsRUFBZ0Q7UUFDOUNHLFVBQVUsRUFBRSxLQURrQztRQUU5QzlGLEtBQUssRUFBRStGLElBQUksQ0FBQ0s7TUFGa0MsQ0FBaEQ7TUFJQTVHLFFBQVEsQ0FBQ21HLElBQUQsQ0FBUjtJQUNELENBWkQ7RUFhRCxDQWRPLENBQVI7QUFlRDs7QUFFRCxTQUFTcEQsa0JBQVQsQ0FBNEJoRCxNQUE1QixFQUE0QzBCLFVBQTVDLEVBQWdFbUIsS0FBaEUsRUFBK0U1QyxRQUEvRSxFQUFvSTtFQUNsSTJDLFFBQVEsQ0FBQzVDLE1BQUQsRUFBUzBCLFVBQVUsR0FBRyxDQUF0QixFQUF5Qm1CLEtBQXpCLEVBQWdDLElBQWhDLEVBQXVDMkQsSUFBRCxJQUFVO0lBQ3REeEcsTUFBTSxDQUFDaUcsWUFBUCxDQUFxQlAsSUFBRCxJQUFVO01BQzVCO01BQ0ExRixNQUFNLENBQUNJLFdBQVAsQ0FBbUIsTUFBTTtRQUN2QixNQUFNZ0csSUFBSSxHQUFHLElBQUlSLElBQUosQ0FBU0EsSUFBSSxDQUFDQyxHQUFMLENBQVMsSUFBVCxFQUFlLENBQWYsRUFBa0JILElBQUksR0FBRyxNQUF6QixFQUFpQyxDQUFqQyxFQUFvQyxDQUFwQyxFQUF1QyxDQUF2QyxFQUEwQyxDQUFDYyxJQUEzQyxDQUFULENBQWI7UUFDQUgsTUFBTSxDQUFDQyxjQUFQLENBQXNCRixJQUF0QixFQUE0QixrQkFBNUIsRUFBZ0Q7VUFDOUNHLFVBQVUsRUFBRSxLQURrQztVQUU5QzlGLEtBQUssRUFBRStGLElBQUksQ0FBQ0s7UUFGa0MsQ0FBaEQ7UUFJQTVHLFFBQVEsQ0FBQ21HLElBQUQsQ0FBUjtNQUNELENBUEQ7SUFRRCxDQVZEO0VBV0QsQ0FaTyxDQUFSO0FBYUQ7O2VBRWMvRSxVOztBQUNmeUYsTUFBTSxDQUFDQyxPQUFQLEdBQWlCMUYsVUFBakIifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.withTimeout = withTimeout;

var _nodeAbortController = require("node-abort-controller");

var _timeoutError = _interopRequireDefault(require("../errors/timeout-error"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/**
 * Run the function `func` with an `AbortSignal` that will automatically abort after the time specified
 * by `timeout` or when the given `signal` is aborted.
 *
 * On timeout, the `timeoutSignal` will be aborted and a `TimeoutError` will be thrown.
 */
async function withTimeout(timeout, func, signal) {
  const timeoutController = new _nodeAbortController.AbortController();

  const abortCurrentAttempt = () => {
    timeoutController.abort();
  };

  const timer = setTimeout(abortCurrentAttempt, timeout);
  signal === null || signal === void 0 ? void 0 : signal.addEventListener('abort', abortCurrentAttempt, {
    once: true
  });

  try {
    return await func(timeoutController.signal);
  } catch (err) {
    if (err instanceof Error && err.name === 'AbortError' && !(signal && signal.aborted)) {
      throw new _timeoutError.default();
    }

    throw err;
  } finally {
    signal === null || signal === void 0 ? void 0 : signal.removeEventListener('abort', abortCurrentAttempt);
    clearTimeout(timer);
  }
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ3aXRoVGltZW91dCIsInRpbWVvdXQiLCJmdW5jIiwic2lnbmFsIiwidGltZW91dENvbnRyb2xsZXIiLCJBYm9ydENvbnRyb2xsZXIiLCJhYm9ydEN1cnJlbnRBdHRlbXB0IiwiYWJvcnQiLCJ0aW1lciIsInNldFRpbWVvdXQiLCJhZGRFdmVudExpc3RlbmVyIiwib25jZSIsImVyciIsIkVycm9yIiwibmFtZSIsImFib3J0ZWQiLCJUaW1lb3V0RXJyb3IiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiY2xlYXJUaW1lb3V0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3dpdGgtdGltZW91dC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBYm9ydENvbnRyb2xsZXIsIEFib3J0U2lnbmFsIH0gZnJvbSAnbm9kZS1hYm9ydC1jb250cm9sbGVyJztcbmltcG9ydCBUaW1lb3V0RXJyb3IgZnJvbSAnLi4vZXJyb3JzL3RpbWVvdXQtZXJyb3InO1xuXG4vKipcbiAqIFJ1biB0aGUgZnVuY3Rpb24gYGZ1bmNgIHdpdGggYW4gYEFib3J0U2lnbmFsYCB0aGF0IHdpbGwgYXV0b21hdGljYWxseSBhYm9ydCBhZnRlciB0aGUgdGltZSBzcGVjaWZpZWRcbiAqIGJ5IGB0aW1lb3V0YCBvciB3aGVuIHRoZSBnaXZlbiBgc2lnbmFsYCBpcyBhYm9ydGVkLlxuICpcbiAqIE9uIHRpbWVvdXQsIHRoZSBgdGltZW91dFNpZ25hbGAgd2lsbCBiZSBhYm9ydGVkIGFuZCBhIGBUaW1lb3V0RXJyb3JgIHdpbGwgYmUgdGhyb3duLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFRpbWVvdXQ8VD4odGltZW91dDogbnVtYmVyLCBmdW5jOiAodGltZW91dFNpZ25hbDogQWJvcnRTaWduYWwpID0+IFByb21pc2U8VD4sIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHRpbWVvdXRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCBhYm9ydEN1cnJlbnRBdHRlbXB0ID0gKCkgPT4geyB0aW1lb3V0Q29udHJvbGxlci5hYm9ydCgpOyB9O1xuXG4gIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dChhYm9ydEN1cnJlbnRBdHRlbXB0LCB0aW1lb3V0KTtcbiAgc2lnbmFsPy5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0Q3VycmVudEF0dGVtcHQsIHsgb25jZTogdHJ1ZSB9KTtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmdW5jKHRpbWVvdXRDb250cm9sbGVyLnNpZ25hbCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InICYmICEoc2lnbmFsICYmIHNpZ25hbC5hYm9ydGVkKSkge1xuICAgICAgdGhyb3cgbmV3IFRpbWVvdXRFcnJvcigpO1xuICAgIH1cblxuICAgIHRocm93IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICBzaWduYWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRDdXJyZW50QXR0ZW1wdCk7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7Ozs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxlQUFlQSxXQUFmLENBQThCQyxPQUE5QixFQUErQ0MsSUFBL0MsRUFBaUdDLE1BQWpHLEVBQW1JO0VBQ3hJLE1BQU1DLGlCQUFpQixHQUFHLElBQUlDLG9DQUFKLEVBQTFCOztFQUNBLE1BQU1DLG1CQUFtQixHQUFHLE1BQU07SUFBRUYsaUJBQWlCLENBQUNHLEtBQWxCO0VBQTRCLENBQWhFOztFQUVBLE1BQU1DLEtBQUssR0FBR0MsVUFBVSxDQUFDSCxtQkFBRCxFQUFzQkwsT0FBdEIsQ0FBeEI7RUFDQUUsTUFBTSxTQUFOLElBQUFBLE1BQU0sV0FBTixZQUFBQSxNQUFNLENBQUVPLGdCQUFSLENBQXlCLE9BQXpCLEVBQWtDSixtQkFBbEMsRUFBdUQ7SUFBRUssSUFBSSxFQUFFO0VBQVIsQ0FBdkQ7O0VBRUEsSUFBSTtJQUNGLE9BQU8sTUFBTVQsSUFBSSxDQUFDRSxpQkFBaUIsQ0FBQ0QsTUFBbkIsQ0FBakI7RUFDRCxDQUZELENBRUUsT0FBT1MsR0FBUCxFQUFZO0lBQ1osSUFBSUEsR0FBRyxZQUFZQyxLQUFmLElBQXdCRCxHQUFHLENBQUNFLElBQUosS0FBYSxZQUFyQyxJQUFxRCxFQUFFWCxNQUFNLElBQUlBLE1BQU0sQ0FBQ1ksT0FBbkIsQ0FBekQsRUFBc0Y7TUFDcEYsTUFBTSxJQUFJQyxxQkFBSixFQUFOO0lBQ0Q7O0lBRUQsTUFBTUosR0FBTjtFQUNELENBUkQsU0FRVTtJQUNSVCxNQUFNLFNBQU4sSUFBQUEsTUFBTSxXQUFOLFlBQUFBLE1BQU0sQ0FBRWMsbUJBQVIsQ0FBNEIsT0FBNUIsRUFBcUNYLG1CQUFyQztJQUNBWSxZQUFZLENBQUNWLEtBQUQsQ0FBWjtFQUNEO0FBQ0YifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _jsbi = _interopRequireDefault(require("jsbi"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const SHIFT_LEFT_32 = (1 << 16) * (1 << 16);
const SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
const UNKNOWN_PLP_LEN = Buffer.from([0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]);
const ZERO_LENGTH_BUFFER = Buffer.alloc(0);

/**
  A Buffer-like class that tracks position.

  As values are written, the position advances by the size of the written data.
  When writing, automatically allocates new buffers if there's not enough space.
 */
class WritableTrackingBuffer {
  constructor(initialSize, encoding, doubleSizeGrowth) {
    this.initialSize = void 0;
    this.encoding = void 0;
    this.doubleSizeGrowth = void 0;
    this.buffer = void 0;
    this.compositeBuffer = void 0;
    this.position = void 0;
    this.initialSize = initialSize;
    this.encoding = encoding || 'ucs2';
    this.doubleSizeGrowth = doubleSizeGrowth || false;
    this.buffer = Buffer.alloc(this.initialSize, 0);
    this.compositeBuffer = ZERO_LENGTH_BUFFER;
    this.position = 0;
  }

  get data() {
    this.newBuffer(0);
    return this.compositeBuffer;
  }

  copyFrom(buffer) {
    const length = buffer.length;
    this.makeRoomFor(length);
    buffer.copy(this.buffer, this.position);
    this.position += length;
  }

  makeRoomFor(requiredLength) {
    if (this.buffer.length - this.position < requiredLength) {
      if (this.doubleSizeGrowth) {
        let size = Math.max(128, this.buffer.length * 2);

        while (size < requiredLength) {
          size *= 2;
        }

        this.newBuffer(size);
      } else {
        this.newBuffer(requiredLength);
      }
    }
  }

  newBuffer(size) {
    const buffer = this.buffer.slice(0, this.position);
    this.compositeBuffer = Buffer.concat([this.compositeBuffer, buffer]);
    this.buffer = size === 0 ? ZERO_LENGTH_BUFFER : Buffer.alloc(size, 0);
    this.position = 0;
  }

  writeUInt8(value) {
    const length = 1;
    this.makeRoomFor(length);
    this.buffer.writeUInt8(value, this.position);
    this.position += length;
  }

  writeUInt16LE(value) {
    const length = 2;
    this.makeRoomFor(length);
    this.buffer.writeUInt16LE(value, this.position);
    this.position += length;
  }

  writeUShort(value) {
    this.writeUInt16LE(value);
  }

  writeUInt16BE(value) {
    const length = 2;
    this.makeRoomFor(length);
    this.buffer.writeUInt16BE(value, this.position);
    this.position += length;
  }

  writeUInt24LE(value) {
    const length = 3;
    this.makeRoomFor(length);
    this.buffer[this.position + 2] = value >>> 16 & 0xff;
    this.buffer[this.position + 1] = value >>> 8 & 0xff;
    this.buffer[this.position] = value & 0xff;
    this.position += length;
  }

  writeUInt32LE(value) {
    const length = 4;
    this.makeRoomFor(length);
    this.buffer.writeUInt32LE(value, this.position);
    this.position += length;
  }

  writeBigInt64LE(value) {
    this.writeBigU_Int64LE(value);
  }

  writeBigU_Int64LE(value) {
    this.makeRoomFor(8);

    let lo = _jsbi.default.toNumber(_jsbi.default.bitwiseAnd(value, _jsbi.default.BigInt(0xffffffff)));

    this.buffer[this.position++] = lo;
    lo = lo >> 8;
    this.buffer[this.position++] = lo;
    lo = lo >> 8;
    this.buffer[this.position++] = lo;
    lo = lo >> 8;
    this.buffer[this.position++] = lo;

    let hi = _jsbi.default.toNumber(_jsbi.default.bitwiseAnd(_jsbi.default.signedRightShift(value, _jsbi.default.BigInt(32)), _jsbi.default.BigInt(0xffffffff)));

    this.buffer[this.position++] = hi;
    hi = hi >> 8;
    this.buffer[this.position++] = hi;
    hi = hi >> 8;
    this.buffer[this.position++] = hi;
    hi = hi >> 8;
    this.buffer[this.position++] = hi;
  }

  writeInt64LE(value) {
    this.writeBigInt64LE(_jsbi.default.BigInt(value));
  }

  writeUInt32BE(value) {
    const length = 4;
    this.makeRoomFor(length);
    this.buffer.writeUInt32BE(value, this.position);
    this.position += length;
  }

  writeUInt40LE(value) {
    // inspired by https://github.com/dpw/node-buffer-more-ints
    this.writeInt32LE(value & -1);
    this.writeUInt8(Math.floor(value * SHIFT_RIGHT_32));
  }

  writeUInt64LE(value) {
    this.writeBigUInt64LE(_jsbi.default.BigInt(value));
  }

  writeBigUInt64LE(value) {
    this.writeBigU_Int64LE(value);
  }

  writeInt8(value) {
    const length = 1;
    this.makeRoomFor(length);
    this.buffer.writeInt8(value, this.position);
    this.position += length;
  }

  writeInt16LE(value) {
    const length = 2;
    this.makeRoomFor(length);
    this.buffer.writeInt16LE(value, this.position);
    this.position += length;
  }

  writeInt16BE(value) {
    const length = 2;
    this.makeRoomFor(length);
    this.buffer.writeInt16BE(value, this.position);
    this.position += length;
  }

  writeInt32LE(value) {
    const length = 4;
    this.makeRoomFor(length);
    this.buffer.writeInt32LE(value, this.position);
    this.position += length;
  }

  writeInt32BE(value) {
    const length = 4;
    this.makeRoomFor(length);
    this.buffer.writeInt32BE(value, this.position);
    this.position += length;
  }

  writeFloatLE(value) {
    const length = 4;
    this.makeRoomFor(length);
    this.buffer.writeFloatLE(value, this.position);
    this.position += length;
  }

  writeDoubleLE(value) {
    const length = 8;
    this.makeRoomFor(length);
    this.buffer.writeDoubleLE(value, this.position);
    this.position += length;
  }

  writeString(value, encoding) {
    if (encoding == null) {
      encoding = this.encoding;
    }

    const length = Buffer.byteLength(value, encoding);
    this.makeRoomFor(length); // $FlowFixMe https://github.com/facebook/flow/pull/5398

    this.buffer.write(value, this.position, encoding);
    this.position += length;
  }

  writeBVarchar(value, encoding) {
    this.writeUInt8(value.length);
    this.writeString(value, encoding);
  }

  writeUsVarchar(value, encoding) {
    this.writeUInt16LE(value.length);
    this.writeString(value, encoding);
  } // TODO: Figure out what types are passed in other than `Buffer`


  writeUsVarbyte(value, encoding) {
    if (encoding == null) {
      encoding = this.encoding;
    }

    let length;

    if (value instanceof Buffer) {
      length = value.length;
    } else {
      value = value.toString();
      length = Buffer.byteLength(value, encoding);
    }

    this.writeUInt16LE(length);

    if (value instanceof Buffer) {
      this.writeBuffer(value);
    } else {
      this.makeRoomFor(length); // $FlowFixMe https://github.com/facebook/flow/pull/5398

      this.buffer.write(value, this.position, encoding);
      this.position += length;
    }
  }

  writePLPBody(value, encoding) {
    if (encoding == null) {
      encoding = this.encoding;
    }

    let length;

    if (value instanceof Buffer) {
      length = value.length;
    } else {
      value = value.toString();
      length = Buffer.byteLength(value, encoding);
    } // Length of all chunks.
    // this.writeUInt64LE(length);
    // unknown seems to work better here - might revisit later.


    this.writeBuffer(UNKNOWN_PLP_LEN); // In the UNKNOWN_PLP_LEN case, the data is represented as a series of zero or more chunks.

    if (length > 0) {
      // One chunk.
      this.writeUInt32LE(length);

      if (value instanceof Buffer) {
        this.writeBuffer(value);
      } else {
        this.makeRoomFor(length);
        this.buffer.write(value, this.position, encoding);
        this.position += length;
      }
    } // PLP_TERMINATOR (no more chunks).


    this.writeUInt32LE(0);
  }

  writeBuffer(value) {
    const length = value.length;
    this.makeRoomFor(length);
    value.copy(this.buffer, this.position);
    this.position += length;
  }

  writeMoney(value) {
    this.writeInt32LE(Math.floor(value * SHIFT_RIGHT_32));
    this.writeInt32LE(value & -1);
  }

}

var _default = WritableTrackingBuffer;
exports.default = _default;
module.exports = WritableTrackingBuffer;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTSElGVF9MRUZUXzMyIiwiU0hJRlRfUklHSFRfMzIiLCJVTktOT1dOX1BMUF9MRU4iLCJCdWZmZXIiLCJmcm9tIiwiWkVST19MRU5HVEhfQlVGRkVSIiwiYWxsb2MiLCJXcml0YWJsZVRyYWNraW5nQnVmZmVyIiwiY29uc3RydWN0b3IiLCJpbml0aWFsU2l6ZSIsImVuY29kaW5nIiwiZG91YmxlU2l6ZUdyb3d0aCIsImJ1ZmZlciIsImNvbXBvc2l0ZUJ1ZmZlciIsInBvc2l0aW9uIiwiZGF0YSIsIm5ld0J1ZmZlciIsImNvcHlGcm9tIiwibGVuZ3RoIiwibWFrZVJvb21Gb3IiLCJjb3B5IiwicmVxdWlyZWRMZW5ndGgiLCJzaXplIiwiTWF0aCIsIm1heCIsInNsaWNlIiwiY29uY2F0Iiwid3JpdGVVSW50OCIsInZhbHVlIiwid3JpdGVVSW50MTZMRSIsIndyaXRlVVNob3J0Iiwid3JpdGVVSW50MTZCRSIsIndyaXRlVUludDI0TEUiLCJ3cml0ZVVJbnQzMkxFIiwid3JpdGVCaWdJbnQ2NExFIiwid3JpdGVCaWdVX0ludDY0TEUiLCJsbyIsIkpTQkkiLCJ0b051bWJlciIsImJpdHdpc2VBbmQiLCJCaWdJbnQiLCJoaSIsInNpZ25lZFJpZ2h0U2hpZnQiLCJ3cml0ZUludDY0TEUiLCJ3cml0ZVVJbnQzMkJFIiwid3JpdGVVSW50NDBMRSIsIndyaXRlSW50MzJMRSIsImZsb29yIiwid3JpdGVVSW50NjRMRSIsIndyaXRlQmlnVUludDY0TEUiLCJ3cml0ZUludDgiLCJ3cml0ZUludDE2TEUiLCJ3cml0ZUludDE2QkUiLCJ3cml0ZUludDMyQkUiLCJ3cml0ZUZsb2F0TEUiLCJ3cml0ZURvdWJsZUxFIiwid3JpdGVTdHJpbmciLCJieXRlTGVuZ3RoIiwid3JpdGUiLCJ3cml0ZUJWYXJjaGFyIiwid3JpdGVVc1ZhcmNoYXIiLCJ3cml0ZVVzVmFyYnl0ZSIsInRvU3RyaW5nIiwid3JpdGVCdWZmZXIiLCJ3cml0ZVBMUEJvZHkiLCJ3cml0ZU1vbmV5IiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90cmFja2luZy1idWZmZXIvd3JpdGFibGUtdHJhY2tpbmctYnVmZmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBKU0JJIGZyb20gJ2pzYmknO1xuXG5jb25zdCBTSElGVF9MRUZUXzMyID0gKDEgPDwgMTYpICogKDEgPDwgMTYpO1xuY29uc3QgU0hJRlRfUklHSFRfMzIgPSAxIC8gU0hJRlRfTEVGVF8zMjtcbmNvbnN0IFVOS05PV05fUExQX0xFTiA9IEJ1ZmZlci5mcm9tKFsweGZlLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmXSk7XG5jb25zdCBaRVJPX0xFTkdUSF9CVUZGRVIgPSBCdWZmZXIuYWxsb2MoMCk7XG5cbmV4cG9ydCB0eXBlIEVuY29kaW5nID0gJ3V0ZjgnIHwgJ3VjczInIHwgJ2FzY2lpJztcblxuLyoqXG4gIEEgQnVmZmVyLWxpa2UgY2xhc3MgdGhhdCB0cmFja3MgcG9zaXRpb24uXG5cbiAgQXMgdmFsdWVzIGFyZSB3cml0dGVuLCB0aGUgcG9zaXRpb24gYWR2YW5jZXMgYnkgdGhlIHNpemUgb2YgdGhlIHdyaXR0ZW4gZGF0YS5cbiAgV2hlbiB3cml0aW5nLCBhdXRvbWF0aWNhbGx5IGFsbG9jYXRlcyBuZXcgYnVmZmVycyBpZiB0aGVyZSdzIG5vdCBlbm91Z2ggc3BhY2UuXG4gKi9cbmNsYXNzIFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIge1xuICBpbml0aWFsU2l6ZTogbnVtYmVyO1xuICBlbmNvZGluZzogRW5jb2Rpbmc7XG4gIGRvdWJsZVNpemVHcm93dGg6IGJvb2xlYW47XG5cbiAgYnVmZmVyOiBCdWZmZXI7XG4gIGNvbXBvc2l0ZUJ1ZmZlcjogQnVmZmVyO1xuXG4gIHBvc2l0aW9uOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoaW5pdGlhbFNpemU6IG51bWJlciwgZW5jb2Rpbmc/OiBFbmNvZGluZyB8IG51bGwsIGRvdWJsZVNpemVHcm93dGg/OiBib29sZWFuKSB7XG4gICAgdGhpcy5pbml0aWFsU2l6ZSA9IGluaXRpYWxTaXplO1xuICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZyB8fCAndWNzMic7XG4gICAgdGhpcy5kb3VibGVTaXplR3Jvd3RoID0gZG91YmxlU2l6ZUdyb3d0aCB8fCBmYWxzZTtcbiAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyh0aGlzLmluaXRpYWxTaXplLCAwKTtcbiAgICB0aGlzLmNvbXBvc2l0ZUJ1ZmZlciA9IFpFUk9fTEVOR1RIX0JVRkZFUjtcbiAgICB0aGlzLnBvc2l0aW9uID0gMDtcbiAgfVxuXG4gIGdldCBkYXRhKCkge1xuICAgIHRoaXMubmV3QnVmZmVyKDApO1xuICAgIHJldHVybiB0aGlzLmNvbXBvc2l0ZUJ1ZmZlcjtcbiAgfVxuXG4gIGNvcHlGcm9tKGJ1ZmZlcjogQnVmZmVyKSB7XG4gICAgY29uc3QgbGVuZ3RoID0gYnVmZmVyLmxlbmd0aDtcbiAgICB0aGlzLm1ha2VSb29tRm9yKGxlbmd0aCk7XG4gICAgYnVmZmVyLmNvcHkodGhpcy5idWZmZXIsIHRoaXMucG9zaXRpb24pO1xuICAgIHRoaXMucG9zaXRpb24gKz0gbGVuZ3RoO1xuICB9XG5cbiAgbWFrZVJvb21Gb3IocmVxdWlyZWRMZW5ndGg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmJ1ZmZlci5sZW5ndGggLSB0aGlzLnBvc2l0aW9uIDwgcmVxdWlyZWRMZW5ndGgpIHtcbiAgICAgIGlmICh0aGlzLmRvdWJsZVNpemVHcm93dGgpIHtcbiAgICAgICAgbGV0IHNpemUgPSBNYXRoLm1heCgxMjgsIHRoaXMuYnVmZmVyLmxlbmd0aCAqIDIpO1xuICAgICAgICB3aGlsZSAoc2l6ZSA8IHJlcXVpcmVkTGVuZ3RoKSB7XG4gICAgICAgICAgc2l6ZSAqPSAyO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmV3QnVmZmVyKHNpemUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5uZXdCdWZmZXIocmVxdWlyZWRMZW5ndGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5ld0J1ZmZlcihzaXplOiBudW1iZXIpIHtcbiAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlci5zbGljZSgwLCB0aGlzLnBvc2l0aW9uKTtcbiAgICB0aGlzLmNvbXBvc2l0ZUJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuY29tcG9zaXRlQnVmZmVyLCBidWZmZXJdKTtcbiAgICB0aGlzLmJ1ZmZlciA9IChzaXplID09PSAwKSA/IFpFUk9fTEVOR1RIX0JVRkZFUiA6IEJ1ZmZlci5hbGxvYyhzaXplLCAwKTtcbiAgICB0aGlzLnBvc2l0aW9uID0gMDtcbiAgfVxuXG4gIHdyaXRlVUludDgodmFsdWU6IG51bWJlcikge1xuICAgIGNvbnN0IGxlbmd0aCA9IDE7XG4gICAgdGhpcy5tYWtlUm9vbUZvcihsZW5ndGgpO1xuICAgIHRoaXMuYnVmZmVyLndyaXRlVUludDgodmFsdWUsIHRoaXMucG9zaXRpb24pO1xuICAgIHRoaXMucG9zaXRpb24gKz0gbGVuZ3RoO1xuICB9XG5cbiAgd3JpdGVVSW50MTZMRSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgY29uc3QgbGVuZ3RoID0gMjtcbiAgICB0aGlzLm1ha2VSb29tRm9yKGxlbmd0aCk7XG4gICAgdGhpcy5idWZmZXIud3JpdGVVSW50MTZMRSh2YWx1ZSwgdGhpcy5wb3NpdGlvbik7XG4gICAgdGhpcy5wb3NpdGlvbiArPSBsZW5ndGg7XG4gIH1cblxuICB3cml0ZVVTaG9ydCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy53cml0ZVVJbnQxNkxFKHZhbHVlKTtcbiAgfVxuXG4gIHdyaXRlVUludDE2QkUodmFsdWU6IG51bWJlcikge1xuICAgIGNvbnN0IGxlbmd0aCA9IDI7XG4gICAgdGhpcy5tYWtlUm9vbUZvcihsZW5ndGgpO1xuICAgIHRoaXMuYnVmZmVyLndyaXRlVUludDE2QkUodmFsdWUsIHRoaXMucG9zaXRpb24pO1xuICAgIHRoaXMucG9zaXRpb24gKz0gbGVuZ3RoO1xuICB9XG5cbiAgd3JpdGVVSW50MjRMRSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgY29uc3QgbGVuZ3RoID0gMztcbiAgICB0aGlzLm1ha2VSb29tRm9yKGxlbmd0aCk7XG4gICAgdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbiArIDJdID0gKHZhbHVlID4+PiAxNikgJiAweGZmO1xuICAgIHRoaXMuYnVmZmVyW3RoaXMucG9zaXRpb24gKyAxXSA9ICh2YWx1ZSA+Pj4gOCkgJiAweGZmO1xuICAgIHRoaXMuYnVmZmVyW3RoaXMucG9zaXRpb25dID0gdmFsdWUgJiAweGZmO1xuICAgIHRoaXMucG9zaXRpb24gKz0gbGVuZ3RoO1xuICB9XG5cbiAgd3JpdGVVSW50MzJMRSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgY29uc3QgbGVuZ3RoID0gNDtcbiAgICB0aGlzLm1ha2VSb29tRm9yKGxlbmd0aCk7XG4gICAgdGhpcy5idWZmZXIud3JpdGVVSW50MzJMRSh2YWx1ZSwgdGhpcy5wb3NpdGlvbik7XG4gICAgdGhpcy5wb3NpdGlvbiArPSBsZW5ndGg7XG4gIH1cblxuICB3cml0ZUJpZ0ludDY0TEUodmFsdWU6IEpTQkkpIHtcbiAgICB0aGlzLndyaXRlQmlnVV9JbnQ2NExFKHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgd3JpdGVCaWdVX0ludDY0TEUodmFsdWU6IEpTQkkpIHtcbiAgICB0aGlzLm1ha2VSb29tRm9yKDgpO1xuXG4gICAgbGV0IGxvID0gSlNCSS50b051bWJlcihKU0JJLmJpdHdpc2VBbmQodmFsdWUsIEpTQkkuQmlnSW50KDB4ZmZmZmZmZmYpKSk7XG5cbiAgICB0aGlzLmJ1ZmZlclt0aGlzLnBvc2l0aW9uKytdID0gbG87XG4gICAgbG8gPSBsbyA+PiA4O1xuICAgIHRoaXMuYnVmZmVyW3RoaXMucG9zaXRpb24rK10gPSBsbztcbiAgICBsbyA9IGxvID4+IDg7XG4gICAgdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbisrXSA9IGxvO1xuICAgIGxvID0gbG8gPj4gODtcbiAgICB0aGlzLmJ1ZmZlclt0aGlzLnBvc2l0aW9uKytdID0gbG87XG5cbiAgICBsZXQgaGkgPSBKU0JJLnRvTnVtYmVyKEpTQkkuYml0d2lzZUFuZChKU0JJLnNpZ25lZFJpZ2h0U2hpZnQodmFsdWUsIEpTQkkuQmlnSW50KDMyKSksIEpTQkkuQmlnSW50KDB4ZmZmZmZmZmYpKSk7XG5cbiAgICB0aGlzLmJ1ZmZlclt0aGlzLnBvc2l0aW9uKytdID0gaGk7XG4gICAgaGkgPSBoaSA+PiA4O1xuICAgIHRoaXMuYnVmZmVyW3RoaXMucG9zaXRpb24rK10gPSBoaTtcbiAgICBoaSA9IGhpID4+IDg7XG4gICAgdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbisrXSA9IGhpO1xuICAgIGhpID0gaGkgPj4gODtcbiAgICB0aGlzLmJ1ZmZlclt0aGlzLnBvc2l0aW9uKytdID0gaGk7XG4gIH1cblxuICB3cml0ZUludDY0TEUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMud3JpdGVCaWdJbnQ2NExFKEpTQkkuQmlnSW50KHZhbHVlKSk7XG4gIH1cblxuICB3cml0ZVVJbnQzMkJFKHZhbHVlOiBudW1iZXIpIHtcbiAgICBjb25zdCBsZW5ndGggPSA0O1xuICAgIHRoaXMubWFrZVJvb21Gb3IobGVuZ3RoKTtcbiAgICB0aGlzLmJ1ZmZlci53cml0ZVVJbnQzMkJFKHZhbHVlLCB0aGlzLnBvc2l0aW9uKTtcbiAgICB0aGlzLnBvc2l0aW9uICs9IGxlbmd0aDtcbiAgfVxuXG4gIHdyaXRlVUludDQwTEUodmFsdWU6IG51bWJlcikge1xuICAgIC8vIGluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9kcHcvbm9kZS1idWZmZXItbW9yZS1pbnRzXG4gICAgdGhpcy53cml0ZUludDMyTEUodmFsdWUgJiAtMSk7XG4gICAgdGhpcy53cml0ZVVJbnQ4KE1hdGguZmxvb3IodmFsdWUgKiBTSElGVF9SSUdIVF8zMikpO1xuICB9XG5cbiAgd3JpdGVVSW50NjRMRSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy53cml0ZUJpZ1VJbnQ2NExFKEpTQkkuQmlnSW50KHZhbHVlKSk7XG4gIH1cblxuICB3cml0ZUJpZ1VJbnQ2NExFKHZhbHVlOiBKU0JJKSB7XG4gICAgdGhpcy53cml0ZUJpZ1VfSW50NjRMRSh2YWx1ZSk7XG4gIH1cblxuICB3cml0ZUludDgodmFsdWU6IG51bWJlcikge1xuICAgIGNvbnN0IGxlbmd0aCA9IDE7XG4gICAgdGhpcy5tYWtlUm9vbUZvcihsZW5ndGgpO1xuICAgIHRoaXMuYnVmZmVyLndyaXRlSW50OCh2YWx1ZSwgdGhpcy5wb3NpdGlvbik7XG4gICAgdGhpcy5wb3NpdGlvbiArPSBsZW5ndGg7XG4gIH1cblxuICB3cml0ZUludDE2TEUodmFsdWU6IG51bWJlcikge1xuICAgIGNvbnN0IGxlbmd0aCA9IDI7XG4gICAgdGhpcy5tYWtlUm9vbUZvcihsZW5ndGgpO1xuICAgIHRoaXMuYnVmZmVyLndyaXRlSW50MTZMRSh2YWx1ZSwgdGhpcy5wb3NpdGlvbik7XG4gICAgdGhpcy5wb3NpdGlvbiArPSBsZW5ndGg7XG4gIH1cblxuICB3cml0ZUludDE2QkUodmFsdWU6IG51bWJlcikge1xuICAgIGNvbnN0IGxlbmd0aCA9IDI7XG4gICAgdGhpcy5tYWtlUm9vbUZvcihsZW5ndGgpO1xuICAgIHRoaXMuYnVmZmVyLndyaXRlSW50MTZCRSh2YWx1ZSwgdGhpcy5wb3NpdGlvbik7XG4gICAgdGhpcy5wb3NpdGlvbiArPSBsZW5ndGg7XG4gIH1cblxuICB3cml0ZUludDMyTEUodmFsdWU6IG51bWJlcikge1xuICAgIGNvbnN0IGxlbmd0aCA9IDQ7XG4gICAgdGhpcy5tYWtlUm9vbUZvcihsZW5ndGgpO1xuICAgIHRoaXMuYnVmZmVyLndyaXRlSW50MzJMRSh2YWx1ZSwgdGhpcy5wb3NpdGlvbik7XG4gICAgdGhpcy5wb3NpdGlvbiArPSBsZW5ndGg7XG4gIH1cblxuICB3cml0ZUludDMyQkUodmFsdWU6IG51bWJlcikge1xuICAgIGNvbnN0IGxlbmd0aCA9IDQ7XG4gICAgdGhpcy5tYWtlUm9vbUZvcihsZW5ndGgpO1xuICAgIHRoaXMuYnVmZmVyLndyaXRlSW50MzJCRSh2YWx1ZSwgdGhpcy5wb3NpdGlvbik7XG4gICAgdGhpcy5wb3NpdGlvbiArPSBsZW5ndGg7XG4gIH1cblxuICB3cml0ZUZsb2F0TEUodmFsdWU6IG51bWJlcikge1xuICAgIGNvbnN0IGxlbmd0aCA9IDQ7XG4gICAgdGhpcy5tYWtlUm9vbUZvcihsZW5ndGgpO1xuICAgIHRoaXMuYnVmZmVyLndyaXRlRmxvYXRMRSh2YWx1ZSwgdGhpcy5wb3NpdGlvbik7XG4gICAgdGhpcy5wb3NpdGlvbiArPSBsZW5ndGg7XG4gIH1cblxuICB3cml0ZURvdWJsZUxFKHZhbHVlOiBudW1iZXIpIHtcbiAgICBjb25zdCBsZW5ndGggPSA4O1xuICAgIHRoaXMubWFrZVJvb21Gb3IobGVuZ3RoKTtcbiAgICB0aGlzLmJ1ZmZlci53cml0ZURvdWJsZUxFKHZhbHVlLCB0aGlzLnBvc2l0aW9uKTtcbiAgICB0aGlzLnBvc2l0aW9uICs9IGxlbmd0aDtcbiAgfVxuXG4gIHdyaXRlU3RyaW5nKHZhbHVlOiBzdHJpbmcsIGVuY29kaW5nPzogRW5jb2RpbmcgfCBudWxsKSB7XG4gICAgaWYgKGVuY29kaW5nID09IG51bGwpIHtcbiAgICAgIGVuY29kaW5nID0gdGhpcy5lbmNvZGluZztcbiAgICB9XG5cbiAgICBjb25zdCBsZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aCh2YWx1ZSwgZW5jb2RpbmcpO1xuICAgIHRoaXMubWFrZVJvb21Gb3IobGVuZ3RoKTtcblxuICAgIC8vICRGbG93Rml4TWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvcHVsbC81Mzk4XG4gICAgdGhpcy5idWZmZXIud3JpdGUodmFsdWUsIHRoaXMucG9zaXRpb24sIGVuY29kaW5nKTtcbiAgICB0aGlzLnBvc2l0aW9uICs9IGxlbmd0aDtcbiAgfVxuXG4gIHdyaXRlQlZhcmNoYXIodmFsdWU6IHN0cmluZywgZW5jb2Rpbmc/OiBFbmNvZGluZyB8IG51bGwpIHtcbiAgICB0aGlzLndyaXRlVUludDgodmFsdWUubGVuZ3RoKTtcbiAgICB0aGlzLndyaXRlU3RyaW5nKHZhbHVlLCBlbmNvZGluZyk7XG4gIH1cblxuICB3cml0ZVVzVmFyY2hhcih2YWx1ZTogc3RyaW5nLCBlbmNvZGluZz86IEVuY29kaW5nIHwgbnVsbCkge1xuICAgIHRoaXMud3JpdGVVSW50MTZMRSh2YWx1ZS5sZW5ndGgpO1xuICAgIHRoaXMud3JpdGVTdHJpbmcodmFsdWUsIGVuY29kaW5nKTtcbiAgfVxuXG4gIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2hhdCB0eXBlcyBhcmUgcGFzc2VkIGluIG90aGVyIHRoYW4gYEJ1ZmZlcmBcbiAgd3JpdGVVc1ZhcmJ5dGUodmFsdWU6IGFueSwgZW5jb2Rpbmc/OiBFbmNvZGluZyB8IG51bGwpIHtcbiAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkge1xuICAgICAgZW5jb2RpbmcgPSB0aGlzLmVuY29kaW5nO1xuICAgIH1cblxuICAgIGxldCBsZW5ndGg7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgIGxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHZhbHVlLCBlbmNvZGluZyk7XG4gICAgfVxuICAgIHRoaXMud3JpdGVVSW50MTZMRShsZW5ndGgpO1xuXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICB0aGlzLndyaXRlQnVmZmVyKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tYWtlUm9vbUZvcihsZW5ndGgpO1xuICAgICAgLy8gJEZsb3dGaXhNZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9wdWxsLzUzOThcbiAgICAgIHRoaXMuYnVmZmVyLndyaXRlKHZhbHVlLCB0aGlzLnBvc2l0aW9uLCBlbmNvZGluZyk7XG4gICAgICB0aGlzLnBvc2l0aW9uICs9IGxlbmd0aDtcbiAgICB9XG4gIH1cblxuICB3cml0ZVBMUEJvZHkodmFsdWU6IGFueSwgZW5jb2Rpbmc/OiBFbmNvZGluZyB8IG51bGwpIHtcbiAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkge1xuICAgICAgZW5jb2RpbmcgPSB0aGlzLmVuY29kaW5nO1xuICAgIH1cblxuICAgIGxldCBsZW5ndGg7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgIGxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHZhbHVlLCBlbmNvZGluZyk7XG4gICAgfVxuXG4gICAgLy8gTGVuZ3RoIG9mIGFsbCBjaHVua3MuXG4gICAgLy8gdGhpcy53cml0ZVVJbnQ2NExFKGxlbmd0aCk7XG4gICAgLy8gdW5rbm93biBzZWVtcyB0byB3b3JrIGJldHRlciBoZXJlIC0gbWlnaHQgcmV2aXNpdCBsYXRlci5cbiAgICB0aGlzLndyaXRlQnVmZmVyKFVOS05PV05fUExQX0xFTik7XG5cbiAgICAvLyBJbiB0aGUgVU5LTk9XTl9QTFBfTEVOIGNhc2UsIHRoZSBkYXRhIGlzIHJlcHJlc2VudGVkIGFzIGEgc2VyaWVzIG9mIHplcm8gb3IgbW9yZSBjaHVua3MuXG4gICAgaWYgKGxlbmd0aCA+IDApIHtcbiAgICAgIC8vIE9uZSBjaHVuay5cbiAgICAgIHRoaXMud3JpdGVVSW50MzJMRShsZW5ndGgpO1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICAgIHRoaXMud3JpdGVCdWZmZXIodmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tYWtlUm9vbUZvcihsZW5ndGgpO1xuICAgICAgICB0aGlzLmJ1ZmZlci53cml0ZSh2YWx1ZSwgdGhpcy5wb3NpdGlvbiwgZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLnBvc2l0aW9uICs9IGxlbmd0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQTFBfVEVSTUlOQVRPUiAobm8gbW9yZSBjaHVua3MpLlxuICAgIHRoaXMud3JpdGVVSW50MzJMRSgwKTtcbiAgfVxuXG4gIHdyaXRlQnVmZmVyKHZhbHVlOiBCdWZmZXIpIHtcbiAgICBjb25zdCBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gICAgdGhpcy5tYWtlUm9vbUZvcihsZW5ndGgpO1xuICAgIHZhbHVlLmNvcHkodGhpcy5idWZmZXIsIHRoaXMucG9zaXRpb24pO1xuICAgIHRoaXMucG9zaXRpb24gKz0gbGVuZ3RoO1xuICB9XG5cbiAgd3JpdGVNb25leSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy53cml0ZUludDMyTEUoTWF0aC5mbG9vcih2YWx1ZSAqIFNISUZUX1JJR0hUXzMyKSk7XG4gICAgdGhpcy53cml0ZUludDMyTEUodmFsdWUgJiAtMSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgV3JpdGFibGVUcmFja2luZ0J1ZmZlcjtcbm1vZHVsZS5leHBvcnRzID0gV3JpdGFibGVUcmFja2luZ0J1ZmZlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOzs7O0FBRUEsTUFBTUEsYUFBYSxHQUFHLENBQUMsS0FBSyxFQUFOLEtBQWEsS0FBSyxFQUFsQixDQUF0QjtBQUNBLE1BQU1DLGNBQWMsR0FBRyxJQUFJRCxhQUEzQjtBQUNBLE1BQU1FLGVBQWUsR0FBR0MsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxJQUFELEVBQU8sSUFBUCxFQUFhLElBQWIsRUFBbUIsSUFBbkIsRUFBeUIsSUFBekIsRUFBK0IsSUFBL0IsRUFBcUMsSUFBckMsRUFBMkMsSUFBM0MsQ0FBWixDQUF4QjtBQUNBLE1BQU1DLGtCQUFrQixHQUFHRixNQUFNLENBQUNHLEtBQVAsQ0FBYSxDQUFiLENBQTNCOztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU1DLHNCQUFOLENBQTZCO0VBVTNCQyxXQUFXLENBQUNDLFdBQUQsRUFBc0JDLFFBQXRCLEVBQWtEQyxnQkFBbEQsRUFBOEU7SUFBQSxLQVR6RkYsV0FTeUY7SUFBQSxLQVJ6RkMsUUFReUY7SUFBQSxLQVB6RkMsZ0JBT3lGO0lBQUEsS0FMekZDLE1BS3lGO0lBQUEsS0FKekZDLGVBSXlGO0lBQUEsS0FGekZDLFFBRXlGO0lBQ3ZGLEtBQUtMLFdBQUwsR0FBbUJBLFdBQW5CO0lBQ0EsS0FBS0MsUUFBTCxHQUFnQkEsUUFBUSxJQUFJLE1BQTVCO0lBQ0EsS0FBS0MsZ0JBQUwsR0FBd0JBLGdCQUFnQixJQUFJLEtBQTVDO0lBQ0EsS0FBS0MsTUFBTCxHQUFjVCxNQUFNLENBQUNHLEtBQVAsQ0FBYSxLQUFLRyxXQUFsQixFQUErQixDQUEvQixDQUFkO0lBQ0EsS0FBS0ksZUFBTCxHQUF1QlIsa0JBQXZCO0lBQ0EsS0FBS1MsUUFBTCxHQUFnQixDQUFoQjtFQUNEOztFQUVPLElBQUpDLElBQUksR0FBRztJQUNULEtBQUtDLFNBQUwsQ0FBZSxDQUFmO0lBQ0EsT0FBTyxLQUFLSCxlQUFaO0VBQ0Q7O0VBRURJLFFBQVEsQ0FBQ0wsTUFBRCxFQUFpQjtJQUN2QixNQUFNTSxNQUFNLEdBQUdOLE1BQU0sQ0FBQ00sTUFBdEI7SUFDQSxLQUFLQyxXQUFMLENBQWlCRCxNQUFqQjtJQUNBTixNQUFNLENBQUNRLElBQVAsQ0FBWSxLQUFLUixNQUFqQixFQUF5QixLQUFLRSxRQUE5QjtJQUNBLEtBQUtBLFFBQUwsSUFBaUJJLE1BQWpCO0VBQ0Q7O0VBRURDLFdBQVcsQ0FBQ0UsY0FBRCxFQUF5QjtJQUNsQyxJQUFJLEtBQUtULE1BQUwsQ0FBWU0sTUFBWixHQUFxQixLQUFLSixRQUExQixHQUFxQ08sY0FBekMsRUFBeUQ7TUFDdkQsSUFBSSxLQUFLVixnQkFBVCxFQUEyQjtRQUN6QixJQUFJVyxJQUFJLEdBQUdDLElBQUksQ0FBQ0MsR0FBTCxDQUFTLEdBQVQsRUFBYyxLQUFLWixNQUFMLENBQVlNLE1BQVosR0FBcUIsQ0FBbkMsQ0FBWDs7UUFDQSxPQUFPSSxJQUFJLEdBQUdELGNBQWQsRUFBOEI7VUFDNUJDLElBQUksSUFBSSxDQUFSO1FBQ0Q7O1FBQ0QsS0FBS04sU0FBTCxDQUFlTSxJQUFmO01BQ0QsQ0FORCxNQU1PO1FBQ0wsS0FBS04sU0FBTCxDQUFlSyxjQUFmO01BQ0Q7SUFDRjtFQUNGOztFQUVETCxTQUFTLENBQUNNLElBQUQsRUFBZTtJQUN0QixNQUFNVixNQUFNLEdBQUcsS0FBS0EsTUFBTCxDQUFZYSxLQUFaLENBQWtCLENBQWxCLEVBQXFCLEtBQUtYLFFBQTFCLENBQWY7SUFDQSxLQUFLRCxlQUFMLEdBQXVCVixNQUFNLENBQUN1QixNQUFQLENBQWMsQ0FBQyxLQUFLYixlQUFOLEVBQXVCRCxNQUF2QixDQUFkLENBQXZCO0lBQ0EsS0FBS0EsTUFBTCxHQUFlVSxJQUFJLEtBQUssQ0FBVixHQUFlakIsa0JBQWYsR0FBb0NGLE1BQU0sQ0FBQ0csS0FBUCxDQUFhZ0IsSUFBYixFQUFtQixDQUFuQixDQUFsRDtJQUNBLEtBQUtSLFFBQUwsR0FBZ0IsQ0FBaEI7RUFDRDs7RUFFRGEsVUFBVSxDQUFDQyxLQUFELEVBQWdCO0lBQ3hCLE1BQU1WLE1BQU0sR0FBRyxDQUFmO0lBQ0EsS0FBS0MsV0FBTCxDQUFpQkQsTUFBakI7SUFDQSxLQUFLTixNQUFMLENBQVllLFVBQVosQ0FBdUJDLEtBQXZCLEVBQThCLEtBQUtkLFFBQW5DO0lBQ0EsS0FBS0EsUUFBTCxJQUFpQkksTUFBakI7RUFDRDs7RUFFRFcsYUFBYSxDQUFDRCxLQUFELEVBQWdCO0lBQzNCLE1BQU1WLE1BQU0sR0FBRyxDQUFmO0lBQ0EsS0FBS0MsV0FBTCxDQUFpQkQsTUFBakI7SUFDQSxLQUFLTixNQUFMLENBQVlpQixhQUFaLENBQTBCRCxLQUExQixFQUFpQyxLQUFLZCxRQUF0QztJQUNBLEtBQUtBLFFBQUwsSUFBaUJJLE1BQWpCO0VBQ0Q7O0VBRURZLFdBQVcsQ0FBQ0YsS0FBRCxFQUFnQjtJQUN6QixLQUFLQyxhQUFMLENBQW1CRCxLQUFuQjtFQUNEOztFQUVERyxhQUFhLENBQUNILEtBQUQsRUFBZ0I7SUFDM0IsTUFBTVYsTUFBTSxHQUFHLENBQWY7SUFDQSxLQUFLQyxXQUFMLENBQWlCRCxNQUFqQjtJQUNBLEtBQUtOLE1BQUwsQ0FBWW1CLGFBQVosQ0FBMEJILEtBQTFCLEVBQWlDLEtBQUtkLFFBQXRDO0lBQ0EsS0FBS0EsUUFBTCxJQUFpQkksTUFBakI7RUFDRDs7RUFFRGMsYUFBYSxDQUFDSixLQUFELEVBQWdCO0lBQzNCLE1BQU1WLE1BQU0sR0FBRyxDQUFmO0lBQ0EsS0FBS0MsV0FBTCxDQUFpQkQsTUFBakI7SUFDQSxLQUFLTixNQUFMLENBQVksS0FBS0UsUUFBTCxHQUFnQixDQUE1QixJQUFrQ2MsS0FBSyxLQUFLLEVBQVgsR0FBaUIsSUFBbEQ7SUFDQSxLQUFLaEIsTUFBTCxDQUFZLEtBQUtFLFFBQUwsR0FBZ0IsQ0FBNUIsSUFBa0NjLEtBQUssS0FBSyxDQUFYLEdBQWdCLElBQWpEO0lBQ0EsS0FBS2hCLE1BQUwsQ0FBWSxLQUFLRSxRQUFqQixJQUE2QmMsS0FBSyxHQUFHLElBQXJDO0lBQ0EsS0FBS2QsUUFBTCxJQUFpQkksTUFBakI7RUFDRDs7RUFFRGUsYUFBYSxDQUFDTCxLQUFELEVBQWdCO0lBQzNCLE1BQU1WLE1BQU0sR0FBRyxDQUFmO0lBQ0EsS0FBS0MsV0FBTCxDQUFpQkQsTUFBakI7SUFDQSxLQUFLTixNQUFMLENBQVlxQixhQUFaLENBQTBCTCxLQUExQixFQUFpQyxLQUFLZCxRQUF0QztJQUNBLEtBQUtBLFFBQUwsSUFBaUJJLE1BQWpCO0VBQ0Q7O0VBRURnQixlQUFlLENBQUNOLEtBQUQsRUFBYztJQUMzQixLQUFLTyxpQkFBTCxDQUF1QlAsS0FBdkI7RUFDRDs7RUFFT08saUJBQWlCLENBQUNQLEtBQUQsRUFBYztJQUNyQyxLQUFLVCxXQUFMLENBQWlCLENBQWpCOztJQUVBLElBQUlpQixFQUFFLEdBQUdDLGNBQUtDLFFBQUwsQ0FBY0QsY0FBS0UsVUFBTCxDQUFnQlgsS0FBaEIsRUFBdUJTLGNBQUtHLE1BQUwsQ0FBWSxVQUFaLENBQXZCLENBQWQsQ0FBVDs7SUFFQSxLQUFLNUIsTUFBTCxDQUFZLEtBQUtFLFFBQUwsRUFBWixJQUErQnNCLEVBQS9CO0lBQ0FBLEVBQUUsR0FBR0EsRUFBRSxJQUFJLENBQVg7SUFDQSxLQUFLeEIsTUFBTCxDQUFZLEtBQUtFLFFBQUwsRUFBWixJQUErQnNCLEVBQS9CO0lBQ0FBLEVBQUUsR0FBR0EsRUFBRSxJQUFJLENBQVg7SUFDQSxLQUFLeEIsTUFBTCxDQUFZLEtBQUtFLFFBQUwsRUFBWixJQUErQnNCLEVBQS9CO0lBQ0FBLEVBQUUsR0FBR0EsRUFBRSxJQUFJLENBQVg7SUFDQSxLQUFLeEIsTUFBTCxDQUFZLEtBQUtFLFFBQUwsRUFBWixJQUErQnNCLEVBQS9COztJQUVBLElBQUlLLEVBQUUsR0FBR0osY0FBS0MsUUFBTCxDQUFjRCxjQUFLRSxVQUFMLENBQWdCRixjQUFLSyxnQkFBTCxDQUFzQmQsS0FBdEIsRUFBNkJTLGNBQUtHLE1BQUwsQ0FBWSxFQUFaLENBQTdCLENBQWhCLEVBQStESCxjQUFLRyxNQUFMLENBQVksVUFBWixDQUEvRCxDQUFkLENBQVQ7O0lBRUEsS0FBSzVCLE1BQUwsQ0FBWSxLQUFLRSxRQUFMLEVBQVosSUFBK0IyQixFQUEvQjtJQUNBQSxFQUFFLEdBQUdBLEVBQUUsSUFBSSxDQUFYO0lBQ0EsS0FBSzdCLE1BQUwsQ0FBWSxLQUFLRSxRQUFMLEVBQVosSUFBK0IyQixFQUEvQjtJQUNBQSxFQUFFLEdBQUdBLEVBQUUsSUFBSSxDQUFYO0lBQ0EsS0FBSzdCLE1BQUwsQ0FBWSxLQUFLRSxRQUFMLEVBQVosSUFBK0IyQixFQUEvQjtJQUNBQSxFQUFFLEdBQUdBLEVBQUUsSUFBSSxDQUFYO0lBQ0EsS0FBSzdCLE1BQUwsQ0FBWSxLQUFLRSxRQUFMLEVBQVosSUFBK0IyQixFQUEvQjtFQUNEOztFQUVERSxZQUFZLENBQUNmLEtBQUQsRUFBZ0I7SUFDMUIsS0FBS00sZUFBTCxDQUFxQkcsY0FBS0csTUFBTCxDQUFZWixLQUFaLENBQXJCO0VBQ0Q7O0VBRURnQixhQUFhLENBQUNoQixLQUFELEVBQWdCO0lBQzNCLE1BQU1WLE1BQU0sR0FBRyxDQUFmO0lBQ0EsS0FBS0MsV0FBTCxDQUFpQkQsTUFBakI7SUFDQSxLQUFLTixNQUFMLENBQVlnQyxhQUFaLENBQTBCaEIsS0FBMUIsRUFBaUMsS0FBS2QsUUFBdEM7SUFDQSxLQUFLQSxRQUFMLElBQWlCSSxNQUFqQjtFQUNEOztFQUVEMkIsYUFBYSxDQUFDakIsS0FBRCxFQUFnQjtJQUMzQjtJQUNBLEtBQUtrQixZQUFMLENBQWtCbEIsS0FBSyxHQUFHLENBQUMsQ0FBM0I7SUFDQSxLQUFLRCxVQUFMLENBQWdCSixJQUFJLENBQUN3QixLQUFMLENBQVduQixLQUFLLEdBQUczQixjQUFuQixDQUFoQjtFQUNEOztFQUVEK0MsYUFBYSxDQUFDcEIsS0FBRCxFQUFnQjtJQUMzQixLQUFLcUIsZ0JBQUwsQ0FBc0JaLGNBQUtHLE1BQUwsQ0FBWVosS0FBWixDQUF0QjtFQUNEOztFQUVEcUIsZ0JBQWdCLENBQUNyQixLQUFELEVBQWM7SUFDNUIsS0FBS08saUJBQUwsQ0FBdUJQLEtBQXZCO0VBQ0Q7O0VBRURzQixTQUFTLENBQUN0QixLQUFELEVBQWdCO0lBQ3ZCLE1BQU1WLE1BQU0sR0FBRyxDQUFmO0lBQ0EsS0FBS0MsV0FBTCxDQUFpQkQsTUFBakI7SUFDQSxLQUFLTixNQUFMLENBQVlzQyxTQUFaLENBQXNCdEIsS0FBdEIsRUFBNkIsS0FBS2QsUUFBbEM7SUFDQSxLQUFLQSxRQUFMLElBQWlCSSxNQUFqQjtFQUNEOztFQUVEaUMsWUFBWSxDQUFDdkIsS0FBRCxFQUFnQjtJQUMxQixNQUFNVixNQUFNLEdBQUcsQ0FBZjtJQUNBLEtBQUtDLFdBQUwsQ0FBaUJELE1BQWpCO0lBQ0EsS0FBS04sTUFBTCxDQUFZdUMsWUFBWixDQUF5QnZCLEtBQXpCLEVBQWdDLEtBQUtkLFFBQXJDO0lBQ0EsS0FBS0EsUUFBTCxJQUFpQkksTUFBakI7RUFDRDs7RUFFRGtDLFlBQVksQ0FBQ3hCLEtBQUQsRUFBZ0I7SUFDMUIsTUFBTVYsTUFBTSxHQUFHLENBQWY7SUFDQSxLQUFLQyxXQUFMLENBQWlCRCxNQUFqQjtJQUNBLEtBQUtOLE1BQUwsQ0FBWXdDLFlBQVosQ0FBeUJ4QixLQUF6QixFQUFnQyxLQUFLZCxRQUFyQztJQUNBLEtBQUtBLFFBQUwsSUFBaUJJLE1BQWpCO0VBQ0Q7O0VBRUQ0QixZQUFZLENBQUNsQixLQUFELEVBQWdCO0lBQzFCLE1BQU1WLE1BQU0sR0FBRyxDQUFmO0lBQ0EsS0FBS0MsV0FBTCxDQUFpQkQsTUFBakI7SUFDQSxLQUFLTixNQUFMLENBQVlrQyxZQUFaLENBQXlCbEIsS0FBekIsRUFBZ0MsS0FBS2QsUUFBckM7SUFDQSxLQUFLQSxRQUFMLElBQWlCSSxNQUFqQjtFQUNEOztFQUVEbUMsWUFBWSxDQUFDekIsS0FBRCxFQUFnQjtJQUMxQixNQUFNVixNQUFNLEdBQUcsQ0FBZjtJQUNBLEtBQUtDLFdBQUwsQ0FBaUJELE1BQWpCO0lBQ0EsS0FBS04sTUFBTCxDQUFZeUMsWUFBWixDQUF5QnpCLEtBQXpCLEVBQWdDLEtBQUtkLFFBQXJDO0lBQ0EsS0FBS0EsUUFBTCxJQUFpQkksTUFBakI7RUFDRDs7RUFFRG9DLFlBQVksQ0FBQzFCLEtBQUQsRUFBZ0I7SUFDMUIsTUFBTVYsTUFBTSxHQUFHLENBQWY7SUFDQSxLQUFLQyxXQUFMLENBQWlCRCxNQUFqQjtJQUNBLEtBQUtOLE1BQUwsQ0FBWTBDLFlBQVosQ0FBeUIxQixLQUF6QixFQUFnQyxLQUFLZCxRQUFyQztJQUNBLEtBQUtBLFFBQUwsSUFBaUJJLE1BQWpCO0VBQ0Q7O0VBRURxQyxhQUFhLENBQUMzQixLQUFELEVBQWdCO0lBQzNCLE1BQU1WLE1BQU0sR0FBRyxDQUFmO0lBQ0EsS0FBS0MsV0FBTCxDQUFpQkQsTUFBakI7SUFDQSxLQUFLTixNQUFMLENBQVkyQyxhQUFaLENBQTBCM0IsS0FBMUIsRUFBaUMsS0FBS2QsUUFBdEM7SUFDQSxLQUFLQSxRQUFMLElBQWlCSSxNQUFqQjtFQUNEOztFQUVEc0MsV0FBVyxDQUFDNUIsS0FBRCxFQUFnQmxCLFFBQWhCLEVBQTRDO0lBQ3JELElBQUlBLFFBQVEsSUFBSSxJQUFoQixFQUFzQjtNQUNwQkEsUUFBUSxHQUFHLEtBQUtBLFFBQWhCO0lBQ0Q7O0lBRUQsTUFBTVEsTUFBTSxHQUFHZixNQUFNLENBQUNzRCxVQUFQLENBQWtCN0IsS0FBbEIsRUFBeUJsQixRQUF6QixDQUFmO0lBQ0EsS0FBS1MsV0FBTCxDQUFpQkQsTUFBakIsRUFOcUQsQ0FRckQ7O0lBQ0EsS0FBS04sTUFBTCxDQUFZOEMsS0FBWixDQUFrQjlCLEtBQWxCLEVBQXlCLEtBQUtkLFFBQTlCLEVBQXdDSixRQUF4QztJQUNBLEtBQUtJLFFBQUwsSUFBaUJJLE1BQWpCO0VBQ0Q7O0VBRUR5QyxhQUFhLENBQUMvQixLQUFELEVBQWdCbEIsUUFBaEIsRUFBNEM7SUFDdkQsS0FBS2lCLFVBQUwsQ0FBZ0JDLEtBQUssQ0FBQ1YsTUFBdEI7SUFDQSxLQUFLc0MsV0FBTCxDQUFpQjVCLEtBQWpCLEVBQXdCbEIsUUFBeEI7RUFDRDs7RUFFRGtELGNBQWMsQ0FBQ2hDLEtBQUQsRUFBZ0JsQixRQUFoQixFQUE0QztJQUN4RCxLQUFLbUIsYUFBTCxDQUFtQkQsS0FBSyxDQUFDVixNQUF6QjtJQUNBLEtBQUtzQyxXQUFMLENBQWlCNUIsS0FBakIsRUFBd0JsQixRQUF4QjtFQUNELENBeE4wQixDQTBOM0I7OztFQUNBbUQsY0FBYyxDQUFDakMsS0FBRCxFQUFhbEIsUUFBYixFQUF5QztJQUNyRCxJQUFJQSxRQUFRLElBQUksSUFBaEIsRUFBc0I7TUFDcEJBLFFBQVEsR0FBRyxLQUFLQSxRQUFoQjtJQUNEOztJQUVELElBQUlRLE1BQUo7O0lBQ0EsSUFBSVUsS0FBSyxZQUFZekIsTUFBckIsRUFBNkI7TUFDM0JlLE1BQU0sR0FBR1UsS0FBSyxDQUFDVixNQUFmO0lBQ0QsQ0FGRCxNQUVPO01BQ0xVLEtBQUssR0FBR0EsS0FBSyxDQUFDa0MsUUFBTixFQUFSO01BQ0E1QyxNQUFNLEdBQUdmLE1BQU0sQ0FBQ3NELFVBQVAsQ0FBa0I3QixLQUFsQixFQUF5QmxCLFFBQXpCLENBQVQ7SUFDRDs7SUFDRCxLQUFLbUIsYUFBTCxDQUFtQlgsTUFBbkI7O0lBRUEsSUFBSVUsS0FBSyxZQUFZekIsTUFBckIsRUFBNkI7TUFDM0IsS0FBSzRELFdBQUwsQ0FBaUJuQyxLQUFqQjtJQUNELENBRkQsTUFFTztNQUNMLEtBQUtULFdBQUwsQ0FBaUJELE1BQWpCLEVBREssQ0FFTDs7TUFDQSxLQUFLTixNQUFMLENBQVk4QyxLQUFaLENBQWtCOUIsS0FBbEIsRUFBeUIsS0FBS2QsUUFBOUIsRUFBd0NKLFFBQXhDO01BQ0EsS0FBS0ksUUFBTCxJQUFpQkksTUFBakI7SUFDRDtFQUNGOztFQUVEOEMsWUFBWSxDQUFDcEMsS0FBRCxFQUFhbEIsUUFBYixFQUF5QztJQUNuRCxJQUFJQSxRQUFRLElBQUksSUFBaEIsRUFBc0I7TUFDcEJBLFFBQVEsR0FBRyxLQUFLQSxRQUFoQjtJQUNEOztJQUVELElBQUlRLE1BQUo7O0lBQ0EsSUFBSVUsS0FBSyxZQUFZekIsTUFBckIsRUFBNkI7TUFDM0JlLE1BQU0sR0FBR1UsS0FBSyxDQUFDVixNQUFmO0lBQ0QsQ0FGRCxNQUVPO01BQ0xVLEtBQUssR0FBR0EsS0FBSyxDQUFDa0MsUUFBTixFQUFSO01BQ0E1QyxNQUFNLEdBQUdmLE1BQU0sQ0FBQ3NELFVBQVAsQ0FBa0I3QixLQUFsQixFQUF5QmxCLFFBQXpCLENBQVQ7SUFDRCxDQVhrRCxDQWFuRDtJQUNBO0lBQ0E7OztJQUNBLEtBQUtxRCxXQUFMLENBQWlCN0QsZUFBakIsRUFoQm1ELENBa0JuRDs7SUFDQSxJQUFJZ0IsTUFBTSxHQUFHLENBQWIsRUFBZ0I7TUFDZDtNQUNBLEtBQUtlLGFBQUwsQ0FBbUJmLE1BQW5COztNQUNBLElBQUlVLEtBQUssWUFBWXpCLE1BQXJCLEVBQTZCO1FBQzNCLEtBQUs0RCxXQUFMLENBQWlCbkMsS0FBakI7TUFDRCxDQUZELE1BRU87UUFDTCxLQUFLVCxXQUFMLENBQWlCRCxNQUFqQjtRQUNBLEtBQUtOLE1BQUwsQ0FBWThDLEtBQVosQ0FBa0I5QixLQUFsQixFQUF5QixLQUFLZCxRQUE5QixFQUF3Q0osUUFBeEM7UUFDQSxLQUFLSSxRQUFMLElBQWlCSSxNQUFqQjtNQUNEO0lBQ0YsQ0E3QmtELENBK0JuRDs7O0lBQ0EsS0FBS2UsYUFBTCxDQUFtQixDQUFuQjtFQUNEOztFQUVEOEIsV0FBVyxDQUFDbkMsS0FBRCxFQUFnQjtJQUN6QixNQUFNVixNQUFNLEdBQUdVLEtBQUssQ0FBQ1YsTUFBckI7SUFDQSxLQUFLQyxXQUFMLENBQWlCRCxNQUFqQjtJQUNBVSxLQUFLLENBQUNSLElBQU4sQ0FBVyxLQUFLUixNQUFoQixFQUF3QixLQUFLRSxRQUE3QjtJQUNBLEtBQUtBLFFBQUwsSUFBaUJJLE1BQWpCO0VBQ0Q7O0VBRUQrQyxVQUFVLENBQUNyQyxLQUFELEVBQWdCO0lBQ3hCLEtBQUtrQixZQUFMLENBQWtCdkIsSUFBSSxDQUFDd0IsS0FBTCxDQUFXbkIsS0FBSyxHQUFHM0IsY0FBbkIsQ0FBbEI7SUFDQSxLQUFLNkMsWUFBTCxDQUFrQmxCLEtBQUssR0FBRyxDQUFDLENBQTNCO0VBQ0Q7O0FBaFMwQjs7ZUFtU2RyQixzQjs7QUFDZjJELE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjVELHNCQUFqQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _metadataParser = _interopRequireDefault(require("../metadata-parser"));

var _token = require("./token");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function readTableName(parser, options, metadata, callback) {
  if (metadata.type.hasTableName) {
    if (options.tdsVersion >= '7_2') {
      parser.readUInt8(numberOfTableNameParts => {
        const tableName = [];
        let i = 0;

        function next(done) {
          if (numberOfTableNameParts === i) {
            return done();
          }

          parser.readUsVarChar(part => {
            tableName.push(part);
            i++;
            next(done);
          });
        }

        next(() => {
          callback(tableName);
        });
      });
    } else {
      parser.readUsVarChar(callback);
    }
  } else {
    callback(undefined);
  }
}

function readColumnName(parser, options, index, metadata, callback) {
  parser.readBVarChar(colName => {
    if (options.columnNameReplacer) {
      callback(options.columnNameReplacer(colName, index, metadata));
    } else if (options.camelCaseColumns) {
      callback(colName.replace(/^[A-Z]/, function (s) {
        return s.toLowerCase();
      }));
    } else {
      callback(colName);
    }
  });
}

function readColumn(parser, options, index, callback) {
  (0, _metadataParser.default)(parser, options, metadata => {
    readTableName(parser, options, metadata, tableName => {
      readColumnName(parser, options, index, metadata, colName => {
        callback({
          userType: metadata.userType,
          flags: metadata.flags,
          type: metadata.type,
          collation: metadata.collation,
          precision: metadata.precision,
          scale: metadata.scale,
          udtInfo: metadata.udtInfo,
          dataLength: metadata.dataLength,
          schema: metadata.schema,
          colName: colName,
          tableName: tableName
        });
      });
    });
  });
}

async function colMetadataParser(parser) {
  while (parser.buffer.length - parser.position < 2) {
    await parser.streamBuffer.waitForChunk();
  }

  const columnCount = parser.buffer.readUInt16LE(parser.position);
  parser.position += 2;
  const columns = [];

  for (let i = 0; i < columnCount; i++) {
    let column;
    readColumn(parser, parser.options, i, c => {
      column = c;
    });

    while (parser.suspended) {
      await parser.streamBuffer.waitForChunk();
      parser.suspended = false;
      const next = parser.next;
      next();
    }

    columns.push(column);
  }

  return new _token.ColMetadataToken(columns);
}

var _default = colMetadataParser;
exports.default = _default;
module.exports = colMetadataParser;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZWFkVGFibGVOYW1lIiwicGFyc2VyIiwib3B0aW9ucyIsIm1ldGFkYXRhIiwiY2FsbGJhY2siLCJ0eXBlIiwiaGFzVGFibGVOYW1lIiwidGRzVmVyc2lvbiIsInJlYWRVSW50OCIsIm51bWJlck9mVGFibGVOYW1lUGFydHMiLCJ0YWJsZU5hbWUiLCJpIiwibmV4dCIsImRvbmUiLCJyZWFkVXNWYXJDaGFyIiwicGFydCIsInB1c2giLCJ1bmRlZmluZWQiLCJyZWFkQ29sdW1uTmFtZSIsImluZGV4IiwicmVhZEJWYXJDaGFyIiwiY29sTmFtZSIsImNvbHVtbk5hbWVSZXBsYWNlciIsImNhbWVsQ2FzZUNvbHVtbnMiLCJyZXBsYWNlIiwicyIsInRvTG93ZXJDYXNlIiwicmVhZENvbHVtbiIsInVzZXJUeXBlIiwiZmxhZ3MiLCJjb2xsYXRpb24iLCJwcmVjaXNpb24iLCJzY2FsZSIsInVkdEluZm8iLCJkYXRhTGVuZ3RoIiwic2NoZW1hIiwiY29sTWV0YWRhdGFQYXJzZXIiLCJidWZmZXIiLCJsZW5ndGgiLCJwb3NpdGlvbiIsInN0cmVhbUJ1ZmZlciIsIndhaXRGb3JDaHVuayIsImNvbHVtbkNvdW50IiwicmVhZFVJbnQxNkxFIiwiY29sdW1ucyIsImNvbHVtbiIsImMiLCJzdXNwZW5kZWQiLCJDb2xNZXRhZGF0YVRva2VuIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b2tlbi9jb2xtZXRhZGF0YS10b2tlbi1wYXJzZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1ldGFkYXRhUGFyc2UsIHsgTWV0YWRhdGEgfSBmcm9tICcuLi9tZXRhZGF0YS1wYXJzZXInO1xuXG5pbXBvcnQgUGFyc2VyLCB7IFBhcnNlck9wdGlvbnMgfSBmcm9tICcuL3N0cmVhbS1wYXJzZXInO1xuaW1wb3J0IHsgQ29sTWV0YWRhdGFUb2tlbiB9IGZyb20gJy4vdG9rZW4nO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtbk1ldGFkYXRhIGV4dGVuZHMgTWV0YWRhdGEge1xuICAvKipcbiAgICogVGhlIGNvbHVtbidzIG5hbWXjgIJcbiAgICovXG4gIGNvbE5hbWU6IHN0cmluZztcblxuICB0YWJsZU5hbWU/OiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVhZFRhYmxlTmFtZShwYXJzZXI6IFBhcnNlciwgb3B0aW9uczogUGFyc2VyT3B0aW9ucywgbWV0YWRhdGE6IE1ldGFkYXRhLCBjYWxsYmFjazogKHRhYmxlTmFtZT86IHN0cmluZyB8IHN0cmluZ1tdKSA9PiB2b2lkKSB7XG4gIGlmIChtZXRhZGF0YS50eXBlLmhhc1RhYmxlTmFtZSkge1xuICAgIGlmIChvcHRpb25zLnRkc1ZlcnNpb24gPj0gJzdfMicpIHtcbiAgICAgIHBhcnNlci5yZWFkVUludDgoKG51bWJlck9mVGFibGVOYW1lUGFydHMpID0+IHtcbiAgICAgICAgY29uc3QgdGFibGVOYW1lOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgZnVuY3Rpb24gbmV4dChkb25lOiAoKSA9PiB2b2lkKSB7XG4gICAgICAgICAgaWYgKG51bWJlck9mVGFibGVOYW1lUGFydHMgPT09IGkpIHtcbiAgICAgICAgICAgIHJldHVybiBkb25lKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGFyc2VyLnJlYWRVc1ZhckNoYXIoKHBhcnQpID0+IHtcbiAgICAgICAgICAgIHRhYmxlTmFtZS5wdXNoKHBhcnQpO1xuXG4gICAgICAgICAgICBpKys7XG5cbiAgICAgICAgICAgIG5leHQoZG9uZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBuZXh0KCgpID0+IHtcbiAgICAgICAgICBjYWxsYmFjayh0YWJsZU5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJzZXIucmVhZFVzVmFyQ2hhcihjYWxsYmFjayk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNhbGxiYWNrKHVuZGVmaW5lZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhZENvbHVtbk5hbWUocGFyc2VyOiBQYXJzZXIsIG9wdGlvbnM6IFBhcnNlck9wdGlvbnMsIGluZGV4OiBudW1iZXIsIG1ldGFkYXRhOiBNZXRhZGF0YSwgY2FsbGJhY2s6IChjb2xOYW1lOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgcGFyc2VyLnJlYWRCVmFyQ2hhcigoY29sTmFtZSkgPT4ge1xuICAgIGlmIChvcHRpb25zLmNvbHVtbk5hbWVSZXBsYWNlcikge1xuICAgICAgY2FsbGJhY2sob3B0aW9ucy5jb2x1bW5OYW1lUmVwbGFjZXIoY29sTmFtZSwgaW5kZXgsIG1ldGFkYXRhKSk7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmNhbWVsQ2FzZUNvbHVtbnMpIHtcbiAgICAgIGNhbGxiYWNrKGNvbE5hbWUucmVwbGFjZSgvXltBLVpdLywgZnVuY3Rpb24ocykge1xuICAgICAgICByZXR1cm4gcy50b0xvd2VyQ2FzZSgpO1xuICAgICAgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjayhjb2xOYW1lKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWFkQ29sdW1uKHBhcnNlcjogUGFyc2VyLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zLCBpbmRleDogbnVtYmVyLCBjYWxsYmFjazogKGNvbHVtbjogQ29sdW1uTWV0YWRhdGEpID0+IHZvaWQpIHtcbiAgbWV0YWRhdGFQYXJzZShwYXJzZXIsIG9wdGlvbnMsIChtZXRhZGF0YSkgPT4ge1xuICAgIHJlYWRUYWJsZU5hbWUocGFyc2VyLCBvcHRpb25zLCBtZXRhZGF0YSwgKHRhYmxlTmFtZSkgPT4ge1xuICAgICAgcmVhZENvbHVtbk5hbWUocGFyc2VyLCBvcHRpb25zLCBpbmRleCwgbWV0YWRhdGEsIChjb2xOYW1lKSA9PiB7XG4gICAgICAgIGNhbGxiYWNrKHtcbiAgICAgICAgICB1c2VyVHlwZTogbWV0YWRhdGEudXNlclR5cGUsXG4gICAgICAgICAgZmxhZ3M6IG1ldGFkYXRhLmZsYWdzLFxuICAgICAgICAgIHR5cGU6IG1ldGFkYXRhLnR5cGUsXG4gICAgICAgICAgY29sbGF0aW9uOiBtZXRhZGF0YS5jb2xsYXRpb24sXG4gICAgICAgICAgcHJlY2lzaW9uOiBtZXRhZGF0YS5wcmVjaXNpb24sXG4gICAgICAgICAgc2NhbGU6IG1ldGFkYXRhLnNjYWxlLFxuICAgICAgICAgIHVkdEluZm86IG1ldGFkYXRhLnVkdEluZm8sXG4gICAgICAgICAgZGF0YUxlbmd0aDogbWV0YWRhdGEuZGF0YUxlbmd0aCxcbiAgICAgICAgICBzY2hlbWE6IG1ldGFkYXRhLnNjaGVtYSxcbiAgICAgICAgICBjb2xOYW1lOiBjb2xOYW1lLFxuICAgICAgICAgIHRhYmxlTmFtZTogdGFibGVOYW1lXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb2xNZXRhZGF0YVBhcnNlcihwYXJzZXI6IFBhcnNlcik6IFByb21pc2U8Q29sTWV0YWRhdGFUb2tlbj4ge1xuICB3aGlsZSAocGFyc2VyLmJ1ZmZlci5sZW5ndGggLSBwYXJzZXIucG9zaXRpb24gPCAyKSB7XG4gICAgYXdhaXQgcGFyc2VyLnN0cmVhbUJ1ZmZlci53YWl0Rm9yQ2h1bmsoKTtcbiAgfVxuXG4gIGNvbnN0IGNvbHVtbkNvdW50ID0gcGFyc2VyLmJ1ZmZlci5yZWFkVUludDE2TEUocGFyc2VyLnBvc2l0aW9uKTtcbiAgcGFyc2VyLnBvc2l0aW9uICs9IDI7XG5cbiAgY29uc3QgY29sdW1uczogQ29sdW1uTWV0YWRhdGFbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHtcbiAgICBsZXQgY29sdW1uOiBDb2x1bW5NZXRhZGF0YTtcblxuICAgIHJlYWRDb2x1bW4ocGFyc2VyLCBwYXJzZXIub3B0aW9ucywgaSwgKGMpID0+IHtcbiAgICAgIGNvbHVtbiA9IGM7XG4gICAgfSk7XG5cbiAgICB3aGlsZSAocGFyc2VyLnN1c3BlbmRlZCkge1xuICAgICAgYXdhaXQgcGFyc2VyLnN0cmVhbUJ1ZmZlci53YWl0Rm9yQ2h1bmsoKTtcblxuICAgICAgcGFyc2VyLnN1c3BlbmRlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgbmV4dCA9IHBhcnNlci5uZXh0ITtcblxuICAgICAgbmV4dCgpO1xuICAgIH1cblxuICAgIGNvbHVtbnMucHVzaChjb2x1bW4hKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgQ29sTWV0YWRhdGFUb2tlbihjb2x1bW5zKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY29sTWV0YWRhdGFQYXJzZXI7XG5tb2R1bGUuZXhwb3J0cyA9IGNvbE1ldGFkYXRhUGFyc2VyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBR0E7Ozs7QUFXQSxTQUFTQSxhQUFULENBQXVCQyxNQUF2QixFQUF1Q0MsT0FBdkMsRUFBK0RDLFFBQS9ELEVBQW1GQyxRQUFuRixFQUFzSTtFQUNwSSxJQUFJRCxRQUFRLENBQUNFLElBQVQsQ0FBY0MsWUFBbEIsRUFBZ0M7SUFDOUIsSUFBSUosT0FBTyxDQUFDSyxVQUFSLElBQXNCLEtBQTFCLEVBQWlDO01BQy9CTixNQUFNLENBQUNPLFNBQVAsQ0FBa0JDLHNCQUFELElBQTRCO1FBQzNDLE1BQU1DLFNBQW1CLEdBQUcsRUFBNUI7UUFFQSxJQUFJQyxDQUFDLEdBQUcsQ0FBUjs7UUFDQSxTQUFTQyxJQUFULENBQWNDLElBQWQsRUFBZ0M7VUFDOUIsSUFBSUosc0JBQXNCLEtBQUtFLENBQS9CLEVBQWtDO1lBQ2hDLE9BQU9FLElBQUksRUFBWDtVQUNEOztVQUVEWixNQUFNLENBQUNhLGFBQVAsQ0FBc0JDLElBQUQsSUFBVTtZQUM3QkwsU0FBUyxDQUFDTSxJQUFWLENBQWVELElBQWY7WUFFQUosQ0FBQztZQUVEQyxJQUFJLENBQUNDLElBQUQsQ0FBSjtVQUNELENBTkQ7UUFPRDs7UUFFREQsSUFBSSxDQUFDLE1BQU07VUFDVFIsUUFBUSxDQUFDTSxTQUFELENBQVI7UUFDRCxDQUZHLENBQUo7TUFHRCxDQXJCRDtJQXNCRCxDQXZCRCxNQXVCTztNQUNMVCxNQUFNLENBQUNhLGFBQVAsQ0FBcUJWLFFBQXJCO0lBQ0Q7RUFDRixDQTNCRCxNQTJCTztJQUNMQSxRQUFRLENBQUNhLFNBQUQsQ0FBUjtFQUNEO0FBQ0Y7O0FBRUQsU0FBU0MsY0FBVCxDQUF3QmpCLE1BQXhCLEVBQXdDQyxPQUF4QyxFQUFnRWlCLEtBQWhFLEVBQStFaEIsUUFBL0UsRUFBbUdDLFFBQW5HLEVBQXdJO0VBQ3RJSCxNQUFNLENBQUNtQixZQUFQLENBQXFCQyxPQUFELElBQWE7SUFDL0IsSUFBSW5CLE9BQU8sQ0FBQ29CLGtCQUFaLEVBQWdDO01BQzlCbEIsUUFBUSxDQUFDRixPQUFPLENBQUNvQixrQkFBUixDQUEyQkQsT0FBM0IsRUFBb0NGLEtBQXBDLEVBQTJDaEIsUUFBM0MsQ0FBRCxDQUFSO0lBQ0QsQ0FGRCxNQUVPLElBQUlELE9BQU8sQ0FBQ3FCLGdCQUFaLEVBQThCO01BQ25DbkIsUUFBUSxDQUFDaUIsT0FBTyxDQUFDRyxPQUFSLENBQWdCLFFBQWhCLEVBQTBCLFVBQVNDLENBQVQsRUFBWTtRQUM3QyxPQUFPQSxDQUFDLENBQUNDLFdBQUYsRUFBUDtNQUNELENBRlEsQ0FBRCxDQUFSO0lBR0QsQ0FKTSxNQUlBO01BQ0x0QixRQUFRLENBQUNpQixPQUFELENBQVI7SUFDRDtFQUNGLENBVkQ7QUFXRDs7QUFFRCxTQUFTTSxVQUFULENBQW9CMUIsTUFBcEIsRUFBb0NDLE9BQXBDLEVBQTREaUIsS0FBNUQsRUFBMkVmLFFBQTNFLEVBQXVIO0VBQ3JILDZCQUFjSCxNQUFkLEVBQXNCQyxPQUF0QixFQUFnQ0MsUUFBRCxJQUFjO0lBQzNDSCxhQUFhLENBQUNDLE1BQUQsRUFBU0MsT0FBVCxFQUFrQkMsUUFBbEIsRUFBNkJPLFNBQUQsSUFBZTtNQUN0RFEsY0FBYyxDQUFDakIsTUFBRCxFQUFTQyxPQUFULEVBQWtCaUIsS0FBbEIsRUFBeUJoQixRQUF6QixFQUFvQ2tCLE9BQUQsSUFBYTtRQUM1RGpCLFFBQVEsQ0FBQztVQUNQd0IsUUFBUSxFQUFFekIsUUFBUSxDQUFDeUIsUUFEWjtVQUVQQyxLQUFLLEVBQUUxQixRQUFRLENBQUMwQixLQUZUO1VBR1B4QixJQUFJLEVBQUVGLFFBQVEsQ0FBQ0UsSUFIUjtVQUlQeUIsU0FBUyxFQUFFM0IsUUFBUSxDQUFDMkIsU0FKYjtVQUtQQyxTQUFTLEVBQUU1QixRQUFRLENBQUM0QixTQUxiO1VBTVBDLEtBQUssRUFBRTdCLFFBQVEsQ0FBQzZCLEtBTlQ7VUFPUEMsT0FBTyxFQUFFOUIsUUFBUSxDQUFDOEIsT0FQWDtVQVFQQyxVQUFVLEVBQUUvQixRQUFRLENBQUMrQixVQVJkO1VBU1BDLE1BQU0sRUFBRWhDLFFBQVEsQ0FBQ2dDLE1BVFY7VUFVUGQsT0FBTyxFQUFFQSxPQVZGO1VBV1BYLFNBQVMsRUFBRUE7UUFYSixDQUFELENBQVI7TUFhRCxDQWRhLENBQWQ7SUFlRCxDQWhCWSxDQUFiO0VBaUJELENBbEJEO0FBbUJEOztBQUVELGVBQWUwQixpQkFBZixDQUFpQ25DLE1BQWpDLEVBQTRFO0VBQzFFLE9BQU9BLE1BQU0sQ0FBQ29DLE1BQVAsQ0FBY0MsTUFBZCxHQUF1QnJDLE1BQU0sQ0FBQ3NDLFFBQTlCLEdBQXlDLENBQWhELEVBQW1EO0lBQ2pELE1BQU10QyxNQUFNLENBQUN1QyxZQUFQLENBQW9CQyxZQUFwQixFQUFOO0VBQ0Q7O0VBRUQsTUFBTUMsV0FBVyxHQUFHekMsTUFBTSxDQUFDb0MsTUFBUCxDQUFjTSxZQUFkLENBQTJCMUMsTUFBTSxDQUFDc0MsUUFBbEMsQ0FBcEI7RUFDQXRDLE1BQU0sQ0FBQ3NDLFFBQVAsSUFBbUIsQ0FBbkI7RUFFQSxNQUFNSyxPQUF5QixHQUFHLEVBQWxDOztFQUNBLEtBQUssSUFBSWpDLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUcrQixXQUFwQixFQUFpQy9CLENBQUMsRUFBbEMsRUFBc0M7SUFDcEMsSUFBSWtDLE1BQUo7SUFFQWxCLFVBQVUsQ0FBQzFCLE1BQUQsRUFBU0EsTUFBTSxDQUFDQyxPQUFoQixFQUF5QlMsQ0FBekIsRUFBNkJtQyxDQUFELElBQU87TUFDM0NELE1BQU0sR0FBR0MsQ0FBVDtJQUNELENBRlMsQ0FBVjs7SUFJQSxPQUFPN0MsTUFBTSxDQUFDOEMsU0FBZCxFQUF5QjtNQUN2QixNQUFNOUMsTUFBTSxDQUFDdUMsWUFBUCxDQUFvQkMsWUFBcEIsRUFBTjtNQUVBeEMsTUFBTSxDQUFDOEMsU0FBUCxHQUFtQixLQUFuQjtNQUNBLE1BQU1uQyxJQUFJLEdBQUdYLE1BQU0sQ0FBQ1csSUFBcEI7TUFFQUEsSUFBSTtJQUNMOztJQUVEZ0MsT0FBTyxDQUFDNUIsSUFBUixDQUFhNkIsTUFBYjtFQUNEOztFQUVELE9BQU8sSUFBSUcsdUJBQUosQ0FBcUJKLE9BQXJCLENBQVA7QUFDRDs7ZUFFY1IsaUI7O0FBQ2ZhLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQmQsaUJBQWpCIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.doneInProcParser = doneInProcParser;
exports.doneParser = doneParser;
exports.doneProcParser = doneProcParser;

var _jsbi = _interopRequireDefault(require("jsbi"));

var _token = require("./token");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// s2.2.7.5/6/7
const STATUS = {
  MORE: 0x0001,
  ERROR: 0x0002,
  // This bit is not yet in use by SQL Server, so is not exposed in the returned token
  INXACT: 0x0004,
  COUNT: 0x0010,
  ATTN: 0x0020,
  SRVERROR: 0x0100
};

function parseToken(parser, options, callback) {
  parser.readUInt16LE(status => {
    const more = !!(status & STATUS.MORE);
    const sqlError = !!(status & STATUS.ERROR);
    const rowCountValid = !!(status & STATUS.COUNT);
    const attention = !!(status & STATUS.ATTN);
    const serverError = !!(status & STATUS.SRVERROR);
    parser.readUInt16LE(curCmd => {
      const next = rowCount => {
        callback({
          more: more,
          sqlError: sqlError,
          attention: attention,
          serverError: serverError,
          rowCount: rowCountValid ? rowCount : undefined,
          curCmd: curCmd
        });
      };

      if (options.tdsVersion < '7_2') {
        parser.readUInt32LE(next);
      } else {
        parser.readBigUInt64LE(rowCount => {
          next(_jsbi.default.toNumber(rowCount));
        });
      }
    });
  });
}

function doneParser(parser, options, callback) {
  parseToken(parser, options, data => {
    callback(new _token.DoneToken(data));
  });
}

function doneInProcParser(parser, options, callback) {
  parseToken(parser, options, data => {
    callback(new _token.DoneInProcToken(data));
  });
}

function doneProcParser(parser, options, callback) {
  parseToken(parser, options, data => {
    callback(new _token.DoneProcToken(data));
  });
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTVEFUVVMiLCJNT1JFIiwiRVJST1IiLCJJTlhBQ1QiLCJDT1VOVCIsIkFUVE4iLCJTUlZFUlJPUiIsInBhcnNlVG9rZW4iLCJwYXJzZXIiLCJvcHRpb25zIiwiY2FsbGJhY2siLCJyZWFkVUludDE2TEUiLCJzdGF0dXMiLCJtb3JlIiwic3FsRXJyb3IiLCJyb3dDb3VudFZhbGlkIiwiYXR0ZW50aW9uIiwic2VydmVyRXJyb3IiLCJjdXJDbWQiLCJuZXh0Iiwicm93Q291bnQiLCJ1bmRlZmluZWQiLCJ0ZHNWZXJzaW9uIiwicmVhZFVJbnQzMkxFIiwicmVhZEJpZ1VJbnQ2NExFIiwiSlNCSSIsInRvTnVtYmVyIiwiZG9uZVBhcnNlciIsImRhdGEiLCJEb25lVG9rZW4iLCJkb25lSW5Qcm9jUGFyc2VyIiwiRG9uZUluUHJvY1Rva2VuIiwiZG9uZVByb2NQYXJzZXIiLCJEb25lUHJvY1Rva2VuIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rva2VuL2RvbmUtdG9rZW4tcGFyc2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBKU0JJIGZyb20gJ2pzYmknO1xuXG5pbXBvcnQgUGFyc2VyLCB7IFBhcnNlck9wdGlvbnMgfSBmcm9tICcuL3N0cmVhbS1wYXJzZXInO1xuaW1wb3J0IHsgRG9uZVRva2VuLCBEb25lSW5Qcm9jVG9rZW4sIERvbmVQcm9jVG9rZW4gfSBmcm9tICcuL3Rva2VuJztcblxuLy8gczIuMi43LjUvNi83XG5cbmNvbnN0IFNUQVRVUyA9IHtcbiAgTU9SRTogMHgwMDAxLFxuICBFUlJPUjogMHgwMDAyLFxuICAvLyBUaGlzIGJpdCBpcyBub3QgeWV0IGluIHVzZSBieSBTUUwgU2VydmVyLCBzbyBpcyBub3QgZXhwb3NlZCBpbiB0aGUgcmV0dXJuZWQgdG9rZW5cbiAgSU5YQUNUOiAweDAwMDQsXG4gIENPVU5UOiAweDAwMTAsXG4gIEFUVE46IDB4MDAyMCxcbiAgU1JWRVJST1I6IDB4MDEwMFxufTtcblxuaW50ZXJmYWNlIFRva2VuRGF0YSB7XG4gIG1vcmU6IGJvb2xlYW47XG4gIHNxbEVycm9yOiBib29sZWFuO1xuICBhdHRlbnRpb246IGJvb2xlYW47XG4gIHNlcnZlckVycm9yOiBib29sZWFuO1xuICByb3dDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBjdXJDbWQ6IG51bWJlcjtcbn1cblxuZnVuY3Rpb24gcGFyc2VUb2tlbihwYXJzZXI6IFBhcnNlciwgb3B0aW9uczogUGFyc2VyT3B0aW9ucywgY2FsbGJhY2s6IChkYXRhOiBUb2tlbkRhdGEpID0+IHZvaWQpIHtcbiAgcGFyc2VyLnJlYWRVSW50MTZMRSgoc3RhdHVzKSA9PiB7XG4gICAgY29uc3QgbW9yZSA9ICEhKHN0YXR1cyAmIFNUQVRVUy5NT1JFKTtcbiAgICBjb25zdCBzcWxFcnJvciA9ICEhKHN0YXR1cyAmIFNUQVRVUy5FUlJPUik7XG4gICAgY29uc3Qgcm93Q291bnRWYWxpZCA9ICEhKHN0YXR1cyAmIFNUQVRVUy5DT1VOVCk7XG4gICAgY29uc3QgYXR0ZW50aW9uID0gISEoc3RhdHVzICYgU1RBVFVTLkFUVE4pO1xuICAgIGNvbnN0IHNlcnZlckVycm9yID0gISEoc3RhdHVzICYgU1RBVFVTLlNSVkVSUk9SKTtcblxuICAgIHBhcnNlci5yZWFkVUludDE2TEUoKGN1ckNtZCkgPT4ge1xuICAgICAgY29uc3QgbmV4dCA9IChyb3dDb3VudDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNhbGxiYWNrKHtcbiAgICAgICAgICBtb3JlOiBtb3JlLFxuICAgICAgICAgIHNxbEVycm9yOiBzcWxFcnJvcixcbiAgICAgICAgICBhdHRlbnRpb246IGF0dGVudGlvbixcbiAgICAgICAgICBzZXJ2ZXJFcnJvcjogc2VydmVyRXJyb3IsXG4gICAgICAgICAgcm93Q291bnQ6IHJvd0NvdW50VmFsaWQgPyByb3dDb3VudCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBjdXJDbWQ6IGN1ckNtZFxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGlmIChvcHRpb25zLnRkc1ZlcnNpb24gPCAnN18yJykge1xuICAgICAgICBwYXJzZXIucmVhZFVJbnQzMkxFKG5leHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyc2VyLnJlYWRCaWdVSW50NjRMRSgocm93Q291bnQpID0+IHtcbiAgICAgICAgICBuZXh0KEpTQkkudG9OdW1iZXIocm93Q291bnQpKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZG9uZVBhcnNlcihwYXJzZXI6IFBhcnNlciwgb3B0aW9uczogUGFyc2VyT3B0aW9ucywgY2FsbGJhY2s6ICh0b2tlbjogRG9uZVRva2VuKSA9PiB2b2lkKSB7XG4gIHBhcnNlVG9rZW4ocGFyc2VyLCBvcHRpb25zLCAoZGF0YSkgPT4ge1xuICAgIGNhbGxiYWNrKG5ldyBEb25lVG9rZW4oZGF0YSkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRvbmVJblByb2NQYXJzZXIocGFyc2VyOiBQYXJzZXIsIG9wdGlvbnM6IFBhcnNlck9wdGlvbnMsIGNhbGxiYWNrOiAodG9rZW46IERvbmVJblByb2NUb2tlbikgPT4gdm9pZCkge1xuICBwYXJzZVRva2VuKHBhcnNlciwgb3B0aW9ucywgKGRhdGEpID0+IHtcbiAgICBjYWxsYmFjayhuZXcgRG9uZUluUHJvY1Rva2VuKGRhdGEpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb25lUHJvY1BhcnNlcihwYXJzZXI6IFBhcnNlciwgb3B0aW9uczogUGFyc2VyT3B0aW9ucywgY2FsbGJhY2s6ICh0b2tlbjogRG9uZVByb2NUb2tlbikgPT4gdm9pZCkge1xuICBwYXJzZVRva2VuKHBhcnNlciwgb3B0aW9ucywgKGRhdGEpID0+IHtcbiAgICBjYWxsYmFjayhuZXcgRG9uZVByb2NUb2tlbihkYXRhKSk7XG4gIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFHQTs7OztBQUVBO0FBRUEsTUFBTUEsTUFBTSxHQUFHO0VBQ2JDLElBQUksRUFBRSxNQURPO0VBRWJDLEtBQUssRUFBRSxNQUZNO0VBR2I7RUFDQUMsTUFBTSxFQUFFLE1BSks7RUFLYkMsS0FBSyxFQUFFLE1BTE07RUFNYkMsSUFBSSxFQUFFLE1BTk87RUFPYkMsUUFBUSxFQUFFO0FBUEcsQ0FBZjs7QUFtQkEsU0FBU0MsVUFBVCxDQUFvQkMsTUFBcEIsRUFBb0NDLE9BQXBDLEVBQTREQyxRQUE1RCxFQUFpRztFQUMvRkYsTUFBTSxDQUFDRyxZQUFQLENBQXFCQyxNQUFELElBQVk7SUFDOUIsTUFBTUMsSUFBSSxHQUFHLENBQUMsRUFBRUQsTUFBTSxHQUFHWixNQUFNLENBQUNDLElBQWxCLENBQWQ7SUFDQSxNQUFNYSxRQUFRLEdBQUcsQ0FBQyxFQUFFRixNQUFNLEdBQUdaLE1BQU0sQ0FBQ0UsS0FBbEIsQ0FBbEI7SUFDQSxNQUFNYSxhQUFhLEdBQUcsQ0FBQyxFQUFFSCxNQUFNLEdBQUdaLE1BQU0sQ0FBQ0ksS0FBbEIsQ0FBdkI7SUFDQSxNQUFNWSxTQUFTLEdBQUcsQ0FBQyxFQUFFSixNQUFNLEdBQUdaLE1BQU0sQ0FBQ0ssSUFBbEIsQ0FBbkI7SUFDQSxNQUFNWSxXQUFXLEdBQUcsQ0FBQyxFQUFFTCxNQUFNLEdBQUdaLE1BQU0sQ0FBQ00sUUFBbEIsQ0FBckI7SUFFQUUsTUFBTSxDQUFDRyxZQUFQLENBQXFCTyxNQUFELElBQVk7TUFDOUIsTUFBTUMsSUFBSSxHQUFJQyxRQUFELElBQXNCO1FBQ2pDVixRQUFRLENBQUM7VUFDUEcsSUFBSSxFQUFFQSxJQURDO1VBRVBDLFFBQVEsRUFBRUEsUUFGSDtVQUdQRSxTQUFTLEVBQUVBLFNBSEo7VUFJUEMsV0FBVyxFQUFFQSxXQUpOO1VBS1BHLFFBQVEsRUFBRUwsYUFBYSxHQUFHSyxRQUFILEdBQWNDLFNBTDlCO1VBTVBILE1BQU0sRUFBRUE7UUFORCxDQUFELENBQVI7TUFRRCxDQVREOztNQVdBLElBQUlULE9BQU8sQ0FBQ2EsVUFBUixHQUFxQixLQUF6QixFQUFnQztRQUM5QmQsTUFBTSxDQUFDZSxZQUFQLENBQW9CSixJQUFwQjtNQUNELENBRkQsTUFFTztRQUNMWCxNQUFNLENBQUNnQixlQUFQLENBQXdCSixRQUFELElBQWM7VUFDbkNELElBQUksQ0FBQ00sY0FBS0MsUUFBTCxDQUFjTixRQUFkLENBQUQsQ0FBSjtRQUNELENBRkQ7TUFHRDtJQUNGLENBbkJEO0VBb0JELENBM0JEO0FBNEJEOztBQUVNLFNBQVNPLFVBQVQsQ0FBb0JuQixNQUFwQixFQUFvQ0MsT0FBcEMsRUFBNERDLFFBQTVELEVBQWtHO0VBQ3ZHSCxVQUFVLENBQUNDLE1BQUQsRUFBU0MsT0FBVCxFQUFtQm1CLElBQUQsSUFBVTtJQUNwQ2xCLFFBQVEsQ0FBQyxJQUFJbUIsZ0JBQUosQ0FBY0QsSUFBZCxDQUFELENBQVI7RUFDRCxDQUZTLENBQVY7QUFHRDs7QUFFTSxTQUFTRSxnQkFBVCxDQUEwQnRCLE1BQTFCLEVBQTBDQyxPQUExQyxFQUFrRUMsUUFBbEUsRUFBOEc7RUFDbkhILFVBQVUsQ0FBQ0MsTUFBRCxFQUFTQyxPQUFULEVBQW1CbUIsSUFBRCxJQUFVO0lBQ3BDbEIsUUFBUSxDQUFDLElBQUlxQixzQkFBSixDQUFvQkgsSUFBcEIsQ0FBRCxDQUFSO0VBQ0QsQ0FGUyxDQUFWO0FBR0Q7O0FBRU0sU0FBU0ksY0FBVCxDQUF3QnhCLE1BQXhCLEVBQXdDQyxPQUF4QyxFQUFnRUMsUUFBaEUsRUFBMEc7RUFDL0dILFVBQVUsQ0FBQ0MsTUFBRCxFQUFTQyxPQUFULEVBQW1CbUIsSUFBRCxJQUFVO0lBQ3BDbEIsUUFBUSxDQUFDLElBQUl1QixvQkFBSixDQUFrQkwsSUFBbEIsQ0FBRCxDQUFSO0VBQ0QsQ0FGUyxDQUFWO0FBR0QifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _collation = require("../collation");

var _token = require("./token");

const types = {
  1: {
    name: 'DATABASE',
    event: 'databaseChange'
  },
  2: {
    name: 'LANGUAGE',
    event: 'languageChange'
  },
  3: {
    name: 'CHARSET',
    event: 'charsetChange'
  },
  4: {
    name: 'PACKET_SIZE',
    event: 'packetSizeChange'
  },
  7: {
    name: 'SQL_COLLATION',
    event: 'sqlCollationChange'
  },
  8: {
    name: 'BEGIN_TXN',
    event: 'beginTransaction'
  },
  9: {
    name: 'COMMIT_TXN',
    event: 'commitTransaction'
  },
  10: {
    name: 'ROLLBACK_TXN',
    event: 'rollbackTransaction'
  },
  13: {
    name: 'DATABASE_MIRRORING_PARTNER',
    event: 'partnerNode'
  },
  17: {
    name: 'TXN_ENDED'
  },
  18: {
    name: 'RESET_CONNECTION',
    event: 'resetConnection'
  },
  20: {
    name: 'ROUTING_CHANGE',
    event: 'routingChange'
  }
};

function readNewAndOldValue(parser, length, type, callback) {
  switch (type.name) {
    case 'DATABASE':
    case 'LANGUAGE':
    case 'CHARSET':
    case 'PACKET_SIZE':
    case 'DATABASE_MIRRORING_PARTNER':
      return parser.readBVarChar(newValue => {
        parser.readBVarChar(oldValue => {
          switch (type.name) {
            case 'PACKET_SIZE':
              return callback(new _token.PacketSizeEnvChangeToken(parseInt(newValue), parseInt(oldValue)));

            case 'DATABASE':
              return callback(new _token.DatabaseEnvChangeToken(newValue, oldValue));

            case 'LANGUAGE':
              return callback(new _token.LanguageEnvChangeToken(newValue, oldValue));

            case 'CHARSET':
              return callback(new _token.CharsetEnvChangeToken(newValue, oldValue));

            case 'DATABASE_MIRRORING_PARTNER':
              return callback(new _token.DatabaseMirroringPartnerEnvChangeToken(newValue, oldValue));
          }
        });
      });

    case 'SQL_COLLATION':
    case 'BEGIN_TXN':
    case 'COMMIT_TXN':
    case 'ROLLBACK_TXN':
    case 'RESET_CONNECTION':
      return parser.readBVarByte(newValue => {
        parser.readBVarByte(oldValue => {
          switch (type.name) {
            case 'SQL_COLLATION':
              {
                const newCollation = newValue.length ? _collation.Collation.fromBuffer(newValue) : undefined;
                const oldCollation = oldValue.length ? _collation.Collation.fromBuffer(oldValue) : undefined;
                return callback(new _token.CollationChangeToken(newCollation, oldCollation));
              }

            case 'BEGIN_TXN':
              return callback(new _token.BeginTransactionEnvChangeToken(newValue, oldValue));

            case 'COMMIT_TXN':
              return callback(new _token.CommitTransactionEnvChangeToken(newValue, oldValue));

            case 'ROLLBACK_TXN':
              return callback(new _token.RollbackTransactionEnvChangeToken(newValue, oldValue));

            case 'RESET_CONNECTION':
              return callback(new _token.ResetConnectionEnvChangeToken(newValue, oldValue));
          }
        });
      });

    case 'ROUTING_CHANGE':
      return parser.readUInt16LE(valueLength => {
        // Routing Change:
        // Byte 1: Protocol (must be 0)
        // Bytes 2-3 (USHORT): Port number
        // Bytes 4-5 (USHORT): Length of server data in unicode (2byte chars)
        // Bytes 6-*: Server name in unicode characters
        parser.readBuffer(valueLength, routePacket => {
          const protocol = routePacket.readUInt8(0);

          if (protocol !== 0) {
            throw new Error('Unknown protocol byte in routing change event');
          }

          const port = routePacket.readUInt16LE(1);
          const serverLen = routePacket.readUInt16LE(3); // 2 bytes per char, starting at offset 5

          const server = routePacket.toString('ucs2', 5, 5 + serverLen * 2);
          const newValue = {
            protocol: protocol,
            port: port,
            server: server
          };
          parser.readUInt16LE(oldValueLength => {
            parser.readBuffer(oldValueLength, oldValue => {
              callback(new _token.RoutingEnvChangeToken(newValue, oldValue));
            });
          });
        });
      });

    default:
      console.error('Tedious > Unsupported ENVCHANGE type ' + type.name); // skip unknown bytes

      parser.readBuffer(length - 1, () => {
        callback(undefined);
      });
  }
}

function envChangeParser(parser, _options, callback) {
  parser.readUInt16LE(length => {
    parser.readUInt8(typeNumber => {
      const type = types[typeNumber];

      if (!type) {
        console.error('Tedious > Unsupported ENVCHANGE type ' + typeNumber); // skip unknown bytes

        return parser.readBuffer(length - 1, () => {
          callback(undefined);
        });
      }

      readNewAndOldValue(parser, length, type, token => {
        callback(token);
      });
    });
  });
}

var _default = envChangeParser;
exports.default = _default;
module.exports = envChangeParser;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0eXBlcyIsIm5hbWUiLCJldmVudCIsInJlYWROZXdBbmRPbGRWYWx1ZSIsInBhcnNlciIsImxlbmd0aCIsInR5cGUiLCJjYWxsYmFjayIsInJlYWRCVmFyQ2hhciIsIm5ld1ZhbHVlIiwib2xkVmFsdWUiLCJQYWNrZXRTaXplRW52Q2hhbmdlVG9rZW4iLCJwYXJzZUludCIsIkRhdGFiYXNlRW52Q2hhbmdlVG9rZW4iLCJMYW5ndWFnZUVudkNoYW5nZVRva2VuIiwiQ2hhcnNldEVudkNoYW5nZVRva2VuIiwiRGF0YWJhc2VNaXJyb3JpbmdQYXJ0bmVyRW52Q2hhbmdlVG9rZW4iLCJyZWFkQlZhckJ5dGUiLCJuZXdDb2xsYXRpb24iLCJDb2xsYXRpb24iLCJmcm9tQnVmZmVyIiwidW5kZWZpbmVkIiwib2xkQ29sbGF0aW9uIiwiQ29sbGF0aW9uQ2hhbmdlVG9rZW4iLCJCZWdpblRyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4iLCJDb21taXRUcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuIiwiUm9sbGJhY2tUcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuIiwiUmVzZXRDb25uZWN0aW9uRW52Q2hhbmdlVG9rZW4iLCJyZWFkVUludDE2TEUiLCJ2YWx1ZUxlbmd0aCIsInJlYWRCdWZmZXIiLCJyb3V0ZVBhY2tldCIsInByb3RvY29sIiwicmVhZFVJbnQ4IiwiRXJyb3IiLCJwb3J0Iiwic2VydmVyTGVuIiwic2VydmVyIiwidG9TdHJpbmciLCJvbGRWYWx1ZUxlbmd0aCIsIlJvdXRpbmdFbnZDaGFuZ2VUb2tlbiIsImNvbnNvbGUiLCJlcnJvciIsImVudkNoYW5nZVBhcnNlciIsIl9vcHRpb25zIiwidHlwZU51bWJlciIsInRva2VuIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b2tlbi9lbnYtY2hhbmdlLXRva2VuLXBhcnNlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUGFyc2VyLCB7IFBhcnNlck9wdGlvbnMgfSBmcm9tICcuL3N0cmVhbS1wYXJzZXInO1xuaW1wb3J0IHsgQ29sbGF0aW9uIH0gZnJvbSAnLi4vY29sbGF0aW9uJztcblxuaW1wb3J0IHtcbiAgRGF0YWJhc2VFbnZDaGFuZ2VUb2tlbixcbiAgTGFuZ3VhZ2VFbnZDaGFuZ2VUb2tlbixcbiAgQ2hhcnNldEVudkNoYW5nZVRva2VuLFxuICBQYWNrZXRTaXplRW52Q2hhbmdlVG9rZW4sXG4gIEJlZ2luVHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbixcbiAgQ29tbWl0VHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbixcbiAgUm9sbGJhY2tUcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuLFxuICBEYXRhYmFzZU1pcnJvcmluZ1BhcnRuZXJFbnZDaGFuZ2VUb2tlbixcbiAgUmVzZXRDb25uZWN0aW9uRW52Q2hhbmdlVG9rZW4sXG4gIFJvdXRpbmdFbnZDaGFuZ2VUb2tlbixcbiAgQ29sbGF0aW9uQ2hhbmdlVG9rZW5cbn0gZnJvbSAnLi90b2tlbic7XG5cbnR5cGUgRW52Q2hhbmdlVG9rZW4gPVxuICBEYXRhYmFzZUVudkNoYW5nZVRva2VuIHxcbiAgTGFuZ3VhZ2VFbnZDaGFuZ2VUb2tlbiB8XG4gIENoYXJzZXRFbnZDaGFuZ2VUb2tlbiB8XG4gIFBhY2tldFNpemVFbnZDaGFuZ2VUb2tlbiB8XG4gIEJlZ2luVHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbiB8XG4gIENvbW1pdFRyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4gfFxuICBSb2xsYmFja1RyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4gfFxuICBEYXRhYmFzZU1pcnJvcmluZ1BhcnRuZXJFbnZDaGFuZ2VUb2tlbiB8XG4gIFJlc2V0Q29ubmVjdGlvbkVudkNoYW5nZVRva2VuIHxcbiAgUm91dGluZ0VudkNoYW5nZVRva2VuIHxcbiAgQ29sbGF0aW9uQ2hhbmdlVG9rZW47XG5cbmNvbnN0IHR5cGVzOiB7IFtrZXk6IG51bWJlcl06IHsgbmFtZTogc3RyaW5nLCBldmVudD86IHN0cmluZyB9fSA9IHtcbiAgMToge1xuICAgIG5hbWU6ICdEQVRBQkFTRScsXG4gICAgZXZlbnQ6ICdkYXRhYmFzZUNoYW5nZSdcbiAgfSxcbiAgMjoge1xuICAgIG5hbWU6ICdMQU5HVUFHRScsXG4gICAgZXZlbnQ6ICdsYW5ndWFnZUNoYW5nZSdcbiAgfSxcbiAgMzoge1xuICAgIG5hbWU6ICdDSEFSU0VUJyxcbiAgICBldmVudDogJ2NoYXJzZXRDaGFuZ2UnXG4gIH0sXG4gIDQ6IHtcbiAgICBuYW1lOiAnUEFDS0VUX1NJWkUnLFxuICAgIGV2ZW50OiAncGFja2V0U2l6ZUNoYW5nZSdcbiAgfSxcbiAgNzoge1xuICAgIG5hbWU6ICdTUUxfQ09MTEFUSU9OJyxcbiAgICBldmVudDogJ3NxbENvbGxhdGlvbkNoYW5nZSdcbiAgfSxcbiAgODoge1xuICAgIG5hbWU6ICdCRUdJTl9UWE4nLFxuICAgIGV2ZW50OiAnYmVnaW5UcmFuc2FjdGlvbidcbiAgfSxcbiAgOToge1xuICAgIG5hbWU6ICdDT01NSVRfVFhOJyxcbiAgICBldmVudDogJ2NvbW1pdFRyYW5zYWN0aW9uJ1xuICB9LFxuICAxMDoge1xuICAgIG5hbWU6ICdST0xMQkFDS19UWE4nLFxuICAgIGV2ZW50OiAncm9sbGJhY2tUcmFuc2FjdGlvbidcbiAgfSxcbiAgMTM6IHtcbiAgICBuYW1lOiAnREFUQUJBU0VfTUlSUk9SSU5HX1BBUlRORVInLFxuICAgIGV2ZW50OiAncGFydG5lck5vZGUnXG4gIH0sXG4gIDE3OiB7XG4gICAgbmFtZTogJ1RYTl9FTkRFRCdcbiAgfSxcbiAgMTg6IHtcbiAgICBuYW1lOiAnUkVTRVRfQ09OTkVDVElPTicsXG4gICAgZXZlbnQ6ICdyZXNldENvbm5lY3Rpb24nXG4gIH0sXG4gIDIwOiB7XG4gICAgbmFtZTogJ1JPVVRJTkdfQ0hBTkdFJyxcbiAgICBldmVudDogJ3JvdXRpbmdDaGFuZ2UnXG4gIH1cbn07XG5cbmZ1bmN0aW9uIHJlYWROZXdBbmRPbGRWYWx1ZShwYXJzZXI6IFBhcnNlciwgbGVuZ3RoOiBudW1iZXIsIHR5cGU6IHsgbmFtZTogc3RyaW5nLCBldmVudD86IHN0cmluZyB9LCBjYWxsYmFjazogKHRva2VuOiBFbnZDaGFuZ2VUb2tlbiB8IHVuZGVmaW5lZCkgPT4gdm9pZCkge1xuICBzd2l0Y2ggKHR5cGUubmFtZSkge1xuICAgIGNhc2UgJ0RBVEFCQVNFJzpcbiAgICBjYXNlICdMQU5HVUFHRSc6XG4gICAgY2FzZSAnQ0hBUlNFVCc6XG4gICAgY2FzZSAnUEFDS0VUX1NJWkUnOlxuICAgIGNhc2UgJ0RBVEFCQVNFX01JUlJPUklOR19QQVJUTkVSJzpcbiAgICAgIHJldHVybiBwYXJzZXIucmVhZEJWYXJDaGFyKChuZXdWYWx1ZSkgPT4ge1xuICAgICAgICBwYXJzZXIucmVhZEJWYXJDaGFyKChvbGRWYWx1ZSkgPT4ge1xuICAgICAgICAgIHN3aXRjaCAodHlwZS5uYW1lKSB7XG4gICAgICAgICAgICBjYXNlICdQQUNLRVRfU0laRSc6XG4gICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgUGFja2V0U2l6ZUVudkNoYW5nZVRva2VuKHBhcnNlSW50KG5ld1ZhbHVlKSwgcGFyc2VJbnQob2xkVmFsdWUpKSk7XG5cbiAgICAgICAgICAgIGNhc2UgJ0RBVEFCQVNFJzpcbiAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBEYXRhYmFzZUVudkNoYW5nZVRva2VuKG5ld1ZhbHVlLCBvbGRWYWx1ZSkpO1xuXG4gICAgICAgICAgICBjYXNlICdMQU5HVUFHRSc6XG4gICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgTGFuZ3VhZ2VFbnZDaGFuZ2VUb2tlbihuZXdWYWx1ZSwgb2xkVmFsdWUpKTtcblxuICAgICAgICAgICAgY2FzZSAnQ0hBUlNFVCc6XG4gICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgQ2hhcnNldEVudkNoYW5nZVRva2VuKG5ld1ZhbHVlLCBvbGRWYWx1ZSkpO1xuXG4gICAgICAgICAgICBjYXNlICdEQVRBQkFTRV9NSVJST1JJTkdfUEFSVE5FUic6XG4gICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRGF0YWJhc2VNaXJyb3JpbmdQYXJ0bmVyRW52Q2hhbmdlVG9rZW4obmV3VmFsdWUsIG9sZFZhbHVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgY2FzZSAnU1FMX0NPTExBVElPTic6XG4gICAgY2FzZSAnQkVHSU5fVFhOJzpcbiAgICBjYXNlICdDT01NSVRfVFhOJzpcbiAgICBjYXNlICdST0xMQkFDS19UWE4nOlxuICAgIGNhc2UgJ1JFU0VUX0NPTk5FQ1RJT04nOlxuICAgICAgcmV0dXJuIHBhcnNlci5yZWFkQlZhckJ5dGUoKG5ld1ZhbHVlKSA9PiB7XG4gICAgICAgIHBhcnNlci5yZWFkQlZhckJ5dGUoKG9sZFZhbHVlKSA9PiB7XG4gICAgICAgICAgc3dpdGNoICh0eXBlLm5hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgJ1NRTF9DT0xMQVRJT04nOiB7XG4gICAgICAgICAgICAgIGNvbnN0IG5ld0NvbGxhdGlvbiA9IG5ld1ZhbHVlLmxlbmd0aCA/IENvbGxhdGlvbi5mcm9tQnVmZmVyKG5ld1ZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgY29uc3Qgb2xkQ29sbGF0aW9uID0gb2xkVmFsdWUubGVuZ3RoID8gQ29sbGF0aW9uLmZyb21CdWZmZXIob2xkVmFsdWUpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgQ29sbGF0aW9uQ2hhbmdlVG9rZW4obmV3Q29sbGF0aW9uLCBvbGRDb2xsYXRpb24pKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSAnQkVHSU5fVFhOJzpcbiAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBCZWdpblRyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4obmV3VmFsdWUsIG9sZFZhbHVlKSk7XG5cbiAgICAgICAgICAgIGNhc2UgJ0NPTU1JVF9UWE4nOlxuICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IENvbW1pdFRyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4obmV3VmFsdWUsIG9sZFZhbHVlKSk7XG5cbiAgICAgICAgICAgIGNhc2UgJ1JPTExCQUNLX1RYTic6XG4gICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgUm9sbGJhY2tUcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuKG5ld1ZhbHVlLCBvbGRWYWx1ZSkpO1xuXG4gICAgICAgICAgICBjYXNlICdSRVNFVF9DT05ORUNUSU9OJzpcbiAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBSZXNldENvbm5lY3Rpb25FbnZDaGFuZ2VUb2tlbihuZXdWYWx1ZSwgb2xkVmFsdWUpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICBjYXNlICdST1VUSU5HX0NIQU5HRSc6XG4gICAgICByZXR1cm4gcGFyc2VyLnJlYWRVSW50MTZMRSgodmFsdWVMZW5ndGgpID0+IHtcbiAgICAgICAgLy8gUm91dGluZyBDaGFuZ2U6XG4gICAgICAgIC8vIEJ5dGUgMTogUHJvdG9jb2wgKG11c3QgYmUgMClcbiAgICAgICAgLy8gQnl0ZXMgMi0zIChVU0hPUlQpOiBQb3J0IG51bWJlclxuICAgICAgICAvLyBCeXRlcyA0LTUgKFVTSE9SVCk6IExlbmd0aCBvZiBzZXJ2ZXIgZGF0YSBpbiB1bmljb2RlICgyYnl0ZSBjaGFycylcbiAgICAgICAgLy8gQnl0ZXMgNi0qOiBTZXJ2ZXIgbmFtZSBpbiB1bmljb2RlIGNoYXJhY3RlcnNcbiAgICAgICAgcGFyc2VyLnJlYWRCdWZmZXIodmFsdWVMZW5ndGgsIChyb3V0ZVBhY2tldCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHByb3RvY29sID0gcm91dGVQYWNrZXQucmVhZFVJbnQ4KDApO1xuXG4gICAgICAgICAgaWYgKHByb3RvY29sICE9PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gcHJvdG9jb2wgYnl0ZSBpbiByb3V0aW5nIGNoYW5nZSBldmVudCcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHBvcnQgPSByb3V0ZVBhY2tldC5yZWFkVUludDE2TEUoMSk7XG4gICAgICAgICAgY29uc3Qgc2VydmVyTGVuID0gcm91dGVQYWNrZXQucmVhZFVJbnQxNkxFKDMpO1xuICAgICAgICAgIC8vIDIgYnl0ZXMgcGVyIGNoYXIsIHN0YXJ0aW5nIGF0IG9mZnNldCA1XG4gICAgICAgICAgY29uc3Qgc2VydmVyID0gcm91dGVQYWNrZXQudG9TdHJpbmcoJ3VjczInLCA1LCA1ICsgKHNlcnZlckxlbiAqIDIpKTtcblxuICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0ge1xuICAgICAgICAgICAgcHJvdG9jb2w6IHByb3RvY29sLFxuICAgICAgICAgICAgcG9ydDogcG9ydCxcbiAgICAgICAgICAgIHNlcnZlcjogc2VydmVyXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHBhcnNlci5yZWFkVUludDE2TEUoKG9sZFZhbHVlTGVuZ3RoKSA9PiB7XG4gICAgICAgICAgICBwYXJzZXIucmVhZEJ1ZmZlcihvbGRWYWx1ZUxlbmd0aCwgKG9sZFZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBSb3V0aW5nRW52Q2hhbmdlVG9rZW4obmV3VmFsdWUsIG9sZFZhbHVlKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICBjb25zb2xlLmVycm9yKCdUZWRpb3VzID4gVW5zdXBwb3J0ZWQgRU5WQ0hBTkdFIHR5cGUgJyArIHR5cGUubmFtZSk7XG4gICAgICAvLyBza2lwIHVua25vd24gYnl0ZXNcbiAgICAgIHBhcnNlci5yZWFkQnVmZmVyKGxlbmd0aCAtIDEsICgpID0+IHtcbiAgICAgICAgY2FsbGJhY2sodW5kZWZpbmVkKTtcbiAgICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVudkNoYW5nZVBhcnNlcihwYXJzZXI6IFBhcnNlciwgX29wdGlvbnM6IFBhcnNlck9wdGlvbnMsIGNhbGxiYWNrOiAodG9rZW46IEVudkNoYW5nZVRva2VuIHwgdW5kZWZpbmVkKSA9PiB2b2lkKSB7XG4gIHBhcnNlci5yZWFkVUludDE2TEUoKGxlbmd0aCkgPT4ge1xuICAgIHBhcnNlci5yZWFkVUludDgoKHR5cGVOdW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IHR5cGUgPSB0eXBlc1t0eXBlTnVtYmVyXTtcblxuICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RlZGlvdXMgPiBVbnN1cHBvcnRlZCBFTlZDSEFOR0UgdHlwZSAnICsgdHlwZU51bWJlcik7XG4gICAgICAgIC8vIHNraXAgdW5rbm93biBieXRlc1xuICAgICAgICByZXR1cm4gcGFyc2VyLnJlYWRCdWZmZXIobGVuZ3RoIC0gMSwgKCkgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrKHVuZGVmaW5lZCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZWFkTmV3QW5kT2xkVmFsdWUocGFyc2VyLCBsZW5ndGgsIHR5cGUsICh0b2tlbikgPT4ge1xuICAgICAgICBjYWxsYmFjayh0b2tlbik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGVudkNoYW5nZVBhcnNlcjtcbm1vZHVsZS5leHBvcnRzID0gZW52Q2hhbmdlUGFyc2VyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQ0E7O0FBRUE7O0FBMkJBLE1BQU1BLEtBQXlELEdBQUc7RUFDaEUsR0FBRztJQUNEQyxJQUFJLEVBQUUsVUFETDtJQUVEQyxLQUFLLEVBQUU7RUFGTixDQUQ2RDtFQUtoRSxHQUFHO0lBQ0RELElBQUksRUFBRSxVQURMO0lBRURDLEtBQUssRUFBRTtFQUZOLENBTDZEO0VBU2hFLEdBQUc7SUFDREQsSUFBSSxFQUFFLFNBREw7SUFFREMsS0FBSyxFQUFFO0VBRk4sQ0FUNkQ7RUFhaEUsR0FBRztJQUNERCxJQUFJLEVBQUUsYUFETDtJQUVEQyxLQUFLLEVBQUU7RUFGTixDQWI2RDtFQWlCaEUsR0FBRztJQUNERCxJQUFJLEVBQUUsZUFETDtJQUVEQyxLQUFLLEVBQUU7RUFGTixDQWpCNkQ7RUFxQmhFLEdBQUc7SUFDREQsSUFBSSxFQUFFLFdBREw7SUFFREMsS0FBSyxFQUFFO0VBRk4sQ0FyQjZEO0VBeUJoRSxHQUFHO0lBQ0RELElBQUksRUFBRSxZQURMO0lBRURDLEtBQUssRUFBRTtFQUZOLENBekI2RDtFQTZCaEUsSUFBSTtJQUNGRCxJQUFJLEVBQUUsY0FESjtJQUVGQyxLQUFLLEVBQUU7RUFGTCxDQTdCNEQ7RUFpQ2hFLElBQUk7SUFDRkQsSUFBSSxFQUFFLDRCQURKO0lBRUZDLEtBQUssRUFBRTtFQUZMLENBakM0RDtFQXFDaEUsSUFBSTtJQUNGRCxJQUFJLEVBQUU7RUFESixDQXJDNEQ7RUF3Q2hFLElBQUk7SUFDRkEsSUFBSSxFQUFFLGtCQURKO0lBRUZDLEtBQUssRUFBRTtFQUZMLENBeEM0RDtFQTRDaEUsSUFBSTtJQUNGRCxJQUFJLEVBQUUsZ0JBREo7SUFFRkMsS0FBSyxFQUFFO0VBRkw7QUE1QzRELENBQWxFOztBQWtEQSxTQUFTQyxrQkFBVCxDQUE0QkMsTUFBNUIsRUFBNENDLE1BQTVDLEVBQTREQyxJQUE1RCxFQUFvR0MsUUFBcEcsRUFBMko7RUFDekosUUFBUUQsSUFBSSxDQUFDTCxJQUFiO0lBQ0UsS0FBSyxVQUFMO0lBQ0EsS0FBSyxVQUFMO0lBQ0EsS0FBSyxTQUFMO0lBQ0EsS0FBSyxhQUFMO0lBQ0EsS0FBSyw0QkFBTDtNQUNFLE9BQU9HLE1BQU0sQ0FBQ0ksWUFBUCxDQUFxQkMsUUFBRCxJQUFjO1FBQ3ZDTCxNQUFNLENBQUNJLFlBQVAsQ0FBcUJFLFFBQUQsSUFBYztVQUNoQyxRQUFRSixJQUFJLENBQUNMLElBQWI7WUFDRSxLQUFLLGFBQUw7Y0FDRSxPQUFPTSxRQUFRLENBQUMsSUFBSUksK0JBQUosQ0FBNkJDLFFBQVEsQ0FBQ0gsUUFBRCxDQUFyQyxFQUFpREcsUUFBUSxDQUFDRixRQUFELENBQXpELENBQUQsQ0FBZjs7WUFFRixLQUFLLFVBQUw7Y0FDRSxPQUFPSCxRQUFRLENBQUMsSUFBSU0sNkJBQUosQ0FBMkJKLFFBQTNCLEVBQXFDQyxRQUFyQyxDQUFELENBQWY7O1lBRUYsS0FBSyxVQUFMO2NBQ0UsT0FBT0gsUUFBUSxDQUFDLElBQUlPLDZCQUFKLENBQTJCTCxRQUEzQixFQUFxQ0MsUUFBckMsQ0FBRCxDQUFmOztZQUVGLEtBQUssU0FBTDtjQUNFLE9BQU9ILFFBQVEsQ0FBQyxJQUFJUSw0QkFBSixDQUEwQk4sUUFBMUIsRUFBb0NDLFFBQXBDLENBQUQsQ0FBZjs7WUFFRixLQUFLLDRCQUFMO2NBQ0UsT0FBT0gsUUFBUSxDQUFDLElBQUlTLDZDQUFKLENBQTJDUCxRQUEzQyxFQUFxREMsUUFBckQsQ0FBRCxDQUFmO1VBZEo7UUFnQkQsQ0FqQkQ7TUFrQkQsQ0FuQk0sQ0FBUDs7SUFxQkYsS0FBSyxlQUFMO0lBQ0EsS0FBSyxXQUFMO0lBQ0EsS0FBSyxZQUFMO0lBQ0EsS0FBSyxjQUFMO0lBQ0EsS0FBSyxrQkFBTDtNQUNFLE9BQU9OLE1BQU0sQ0FBQ2EsWUFBUCxDQUFxQlIsUUFBRCxJQUFjO1FBQ3ZDTCxNQUFNLENBQUNhLFlBQVAsQ0FBcUJQLFFBQUQsSUFBYztVQUNoQyxRQUFRSixJQUFJLENBQUNMLElBQWI7WUFDRSxLQUFLLGVBQUw7Y0FBc0I7Z0JBQ3BCLE1BQU1pQixZQUFZLEdBQUdULFFBQVEsQ0FBQ0osTUFBVCxHQUFrQmMscUJBQVVDLFVBQVYsQ0FBcUJYLFFBQXJCLENBQWxCLEdBQW1EWSxTQUF4RTtnQkFDQSxNQUFNQyxZQUFZLEdBQUdaLFFBQVEsQ0FBQ0wsTUFBVCxHQUFrQmMscUJBQVVDLFVBQVYsQ0FBcUJWLFFBQXJCLENBQWxCLEdBQW1EVyxTQUF4RTtnQkFFQSxPQUFPZCxRQUFRLENBQUMsSUFBSWdCLDJCQUFKLENBQXlCTCxZQUF6QixFQUF1Q0ksWUFBdkMsQ0FBRCxDQUFmO2NBQ0Q7O1lBRUQsS0FBSyxXQUFMO2NBQ0UsT0FBT2YsUUFBUSxDQUFDLElBQUlpQixxQ0FBSixDQUFtQ2YsUUFBbkMsRUFBNkNDLFFBQTdDLENBQUQsQ0FBZjs7WUFFRixLQUFLLFlBQUw7Y0FDRSxPQUFPSCxRQUFRLENBQUMsSUFBSWtCLHNDQUFKLENBQW9DaEIsUUFBcEMsRUFBOENDLFFBQTlDLENBQUQsQ0FBZjs7WUFFRixLQUFLLGNBQUw7Y0FDRSxPQUFPSCxRQUFRLENBQUMsSUFBSW1CLHdDQUFKLENBQXNDakIsUUFBdEMsRUFBZ0RDLFFBQWhELENBQUQsQ0FBZjs7WUFFRixLQUFLLGtCQUFMO2NBQ0UsT0FBT0gsUUFBUSxDQUFDLElBQUlvQixvQ0FBSixDQUFrQ2xCLFFBQWxDLEVBQTRDQyxRQUE1QyxDQUFELENBQWY7VUFsQko7UUFvQkQsQ0FyQkQ7TUFzQkQsQ0F2Qk0sQ0FBUDs7SUF5QkYsS0FBSyxnQkFBTDtNQUNFLE9BQU9OLE1BQU0sQ0FBQ3dCLFlBQVAsQ0FBcUJDLFdBQUQsSUFBaUI7UUFDMUM7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBekIsTUFBTSxDQUFDMEIsVUFBUCxDQUFrQkQsV0FBbEIsRUFBZ0NFLFdBQUQsSUFBaUI7VUFDOUMsTUFBTUMsUUFBUSxHQUFHRCxXQUFXLENBQUNFLFNBQVosQ0FBc0IsQ0FBdEIsQ0FBakI7O1VBRUEsSUFBSUQsUUFBUSxLQUFLLENBQWpCLEVBQW9CO1lBQ2xCLE1BQU0sSUFBSUUsS0FBSixDQUFVLCtDQUFWLENBQU47VUFDRDs7VUFFRCxNQUFNQyxJQUFJLEdBQUdKLFdBQVcsQ0FBQ0gsWUFBWixDQUF5QixDQUF6QixDQUFiO1VBQ0EsTUFBTVEsU0FBUyxHQUFHTCxXQUFXLENBQUNILFlBQVosQ0FBeUIsQ0FBekIsQ0FBbEIsQ0FSOEMsQ0FTOUM7O1VBQ0EsTUFBTVMsTUFBTSxHQUFHTixXQUFXLENBQUNPLFFBQVosQ0FBcUIsTUFBckIsRUFBNkIsQ0FBN0IsRUFBZ0MsSUFBS0YsU0FBUyxHQUFHLENBQWpELENBQWY7VUFFQSxNQUFNM0IsUUFBUSxHQUFHO1lBQ2Z1QixRQUFRLEVBQUVBLFFBREs7WUFFZkcsSUFBSSxFQUFFQSxJQUZTO1lBR2ZFLE1BQU0sRUFBRUE7VUFITyxDQUFqQjtVQU1BakMsTUFBTSxDQUFDd0IsWUFBUCxDQUFxQlcsY0FBRCxJQUFvQjtZQUN0Q25DLE1BQU0sQ0FBQzBCLFVBQVAsQ0FBa0JTLGNBQWxCLEVBQW1DN0IsUUFBRCxJQUFjO2NBQzlDSCxRQUFRLENBQUMsSUFBSWlDLDRCQUFKLENBQTBCL0IsUUFBMUIsRUFBb0NDLFFBQXBDLENBQUQsQ0FBUjtZQUNELENBRkQ7VUFHRCxDQUpEO1FBS0QsQ0F2QkQ7TUF3QkQsQ0E5Qk0sQ0FBUDs7SUFnQ0Y7TUFDRStCLE9BQU8sQ0FBQ0MsS0FBUixDQUFjLDBDQUEwQ3BDLElBQUksQ0FBQ0wsSUFBN0QsRUFERixDQUVFOztNQUNBRyxNQUFNLENBQUMwQixVQUFQLENBQWtCekIsTUFBTSxHQUFHLENBQTNCLEVBQThCLE1BQU07UUFDbENFLFFBQVEsQ0FBQ2MsU0FBRCxDQUFSO01BQ0QsQ0FGRDtFQTdGSjtBQWlHRDs7QUFFRCxTQUFTc0IsZUFBVCxDQUF5QnZDLE1BQXpCLEVBQXlDd0MsUUFBekMsRUFBa0VyQyxRQUFsRSxFQUF5SDtFQUN2SEgsTUFBTSxDQUFDd0IsWUFBUCxDQUFxQnZCLE1BQUQsSUFBWTtJQUM5QkQsTUFBTSxDQUFDNkIsU0FBUCxDQUFrQlksVUFBRCxJQUFnQjtNQUMvQixNQUFNdkMsSUFBSSxHQUFHTixLQUFLLENBQUM2QyxVQUFELENBQWxCOztNQUVBLElBQUksQ0FBQ3ZDLElBQUwsRUFBVztRQUNUbUMsT0FBTyxDQUFDQyxLQUFSLENBQWMsMENBQTBDRyxVQUF4RCxFQURTLENBRVQ7O1FBQ0EsT0FBT3pDLE1BQU0sQ0FBQzBCLFVBQVAsQ0FBa0J6QixNQUFNLEdBQUcsQ0FBM0IsRUFBOEIsTUFBTTtVQUN6Q0UsUUFBUSxDQUFDYyxTQUFELENBQVI7UUFDRCxDQUZNLENBQVA7TUFHRDs7TUFFRGxCLGtCQUFrQixDQUFDQyxNQUFELEVBQVNDLE1BQVQsRUFBaUJDLElBQWpCLEVBQXdCd0MsS0FBRCxJQUFXO1FBQ2xEdkMsUUFBUSxDQUFDdUMsS0FBRCxDQUFSO01BQ0QsQ0FGaUIsQ0FBbEI7SUFHRCxDQWREO0VBZUQsQ0FoQkQ7QUFpQkQ7O2VBRWNILGU7O0FBQ2ZJLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQkwsZUFBakIifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _token = require("./token");

const FEATURE_ID = {
  SESSIONRECOVERY: 0x01,
  FEDAUTH: 0x02,
  COLUMNENCRYPTION: 0x04,
  GLOBALTRANSACTIONS: 0x05,
  AZURESQLSUPPORT: 0x08,
  UTF8_SUPPORT: 0x0A,
  TERMINATOR: 0xFF
};

function featureExtAckParser(parser, _options, callback) {
  let fedAuth;
  let utf8Support;

  function next() {
    parser.readUInt8(featureId => {
      if (featureId === FEATURE_ID.TERMINATOR) {
        return callback(new _token.FeatureExtAckToken(fedAuth, utf8Support));
      }

      parser.readUInt32LE(featureAckDataLen => {
        parser.readBuffer(featureAckDataLen, featureData => {
          switch (featureId) {
            case FEATURE_ID.FEDAUTH:
              fedAuth = featureData;
              break;

            case FEATURE_ID.UTF8_SUPPORT:
              utf8Support = !!featureData[0];
              break;
          }

          next();
        });
      });
    });
  }

  next();
}

var _default = featureExtAckParser;
exports.default = _default;
module.exports = featureExtAckParser;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGRUFUVVJFX0lEIiwiU0VTU0lPTlJFQ09WRVJZIiwiRkVEQVVUSCIsIkNPTFVNTkVOQ1JZUFRJT04iLCJHTE9CQUxUUkFOU0FDVElPTlMiLCJBWlVSRVNRTFNVUFBPUlQiLCJVVEY4X1NVUFBPUlQiLCJURVJNSU5BVE9SIiwiZmVhdHVyZUV4dEFja1BhcnNlciIsInBhcnNlciIsIl9vcHRpb25zIiwiY2FsbGJhY2siLCJmZWRBdXRoIiwidXRmOFN1cHBvcnQiLCJuZXh0IiwicmVhZFVJbnQ4IiwiZmVhdHVyZUlkIiwiRmVhdHVyZUV4dEFja1Rva2VuIiwicmVhZFVJbnQzMkxFIiwiZmVhdHVyZUFja0RhdGFMZW4iLCJyZWFkQnVmZmVyIiwiZmVhdHVyZURhdGEiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rva2VuL2ZlYXR1cmUtZXh0LWFjay1wYXJzZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFBhcnNlciwgeyBQYXJzZXJPcHRpb25zIH0gZnJvbSAnLi9zdHJlYW0tcGFyc2VyJztcblxuaW1wb3J0IHsgRmVhdHVyZUV4dEFja1Rva2VuIH0gZnJvbSAnLi90b2tlbic7XG5cbmNvbnN0IEZFQVRVUkVfSUQgPSB7XG4gIFNFU1NJT05SRUNPVkVSWTogMHgwMSxcbiAgRkVEQVVUSDogMHgwMixcbiAgQ09MVU1ORU5DUllQVElPTjogMHgwNCxcbiAgR0xPQkFMVFJBTlNBQ1RJT05TOiAweDA1LFxuICBBWlVSRVNRTFNVUFBPUlQ6IDB4MDgsXG4gIFVURjhfU1VQUE9SVDogMHgwQSxcbiAgVEVSTUlOQVRPUjogMHhGRlxufTtcblxuZnVuY3Rpb24gZmVhdHVyZUV4dEFja1BhcnNlcihwYXJzZXI6IFBhcnNlciwgX29wdGlvbnM6IFBhcnNlck9wdGlvbnMsIGNhbGxiYWNrOiAodG9rZW46IEZlYXR1cmVFeHRBY2tUb2tlbikgPT4gdm9pZCkge1xuICBsZXQgZmVkQXV0aDogQnVmZmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgdXRmOFN1cHBvcnQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICBwYXJzZXIucmVhZFVJbnQ4KChmZWF0dXJlSWQpID0+IHtcbiAgICAgIGlmIChmZWF0dXJlSWQgPT09IEZFQVRVUkVfSUQuVEVSTUlOQVRPUikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEZlYXR1cmVFeHRBY2tUb2tlbihmZWRBdXRoLCB1dGY4U3VwcG9ydCkpO1xuICAgICAgfVxuXG4gICAgICBwYXJzZXIucmVhZFVJbnQzMkxFKChmZWF0dXJlQWNrRGF0YUxlbikgPT4ge1xuICAgICAgICBwYXJzZXIucmVhZEJ1ZmZlcihmZWF0dXJlQWNrRGF0YUxlbiwgKGZlYXR1cmVEYXRhKSA9PiB7XG4gICAgICAgICAgc3dpdGNoIChmZWF0dXJlSWQpIHtcbiAgICAgICAgICAgIGNhc2UgRkVBVFVSRV9JRC5GRURBVVRIOlxuICAgICAgICAgICAgICBmZWRBdXRoID0gZmVhdHVyZURhdGE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGRUFUVVJFX0lELlVURjhfU1VQUE9SVDpcbiAgICAgICAgICAgICAgdXRmOFN1cHBvcnQgPSAhIWZlYXR1cmVEYXRhWzBdO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgbmV4dCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmV4dCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmZWF0dXJlRXh0QWNrUGFyc2VyO1xubW9kdWxlLmV4cG9ydHMgPSBmZWF0dXJlRXh0QWNrUGFyc2VyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBRUE7O0FBRUEsTUFBTUEsVUFBVSxHQUFHO0VBQ2pCQyxlQUFlLEVBQUUsSUFEQTtFQUVqQkMsT0FBTyxFQUFFLElBRlE7RUFHakJDLGdCQUFnQixFQUFFLElBSEQ7RUFJakJDLGtCQUFrQixFQUFFLElBSkg7RUFLakJDLGVBQWUsRUFBRSxJQUxBO0VBTWpCQyxZQUFZLEVBQUUsSUFORztFQU9qQkMsVUFBVSxFQUFFO0FBUEssQ0FBbkI7O0FBVUEsU0FBU0MsbUJBQVQsQ0FBNkJDLE1BQTdCLEVBQTZDQyxRQUE3QyxFQUFzRUMsUUFBdEUsRUFBcUg7RUFDbkgsSUFBSUMsT0FBSjtFQUNBLElBQUlDLFdBQUo7O0VBRUEsU0FBU0MsSUFBVCxHQUFnQjtJQUNkTCxNQUFNLENBQUNNLFNBQVAsQ0FBa0JDLFNBQUQsSUFBZTtNQUM5QixJQUFJQSxTQUFTLEtBQUtoQixVQUFVLENBQUNPLFVBQTdCLEVBQXlDO1FBQ3ZDLE9BQU9JLFFBQVEsQ0FBQyxJQUFJTSx5QkFBSixDQUF1QkwsT0FBdkIsRUFBZ0NDLFdBQWhDLENBQUQsQ0FBZjtNQUNEOztNQUVESixNQUFNLENBQUNTLFlBQVAsQ0FBcUJDLGlCQUFELElBQXVCO1FBQ3pDVixNQUFNLENBQUNXLFVBQVAsQ0FBa0JELGlCQUFsQixFQUFzQ0UsV0FBRCxJQUFpQjtVQUNwRCxRQUFRTCxTQUFSO1lBQ0UsS0FBS2hCLFVBQVUsQ0FBQ0UsT0FBaEI7Y0FDRVUsT0FBTyxHQUFHUyxXQUFWO2NBQ0E7O1lBQ0YsS0FBS3JCLFVBQVUsQ0FBQ00sWUFBaEI7Y0FDRU8sV0FBVyxHQUFHLENBQUMsQ0FBQ1EsV0FBVyxDQUFDLENBQUQsQ0FBM0I7Y0FDQTtVQU5KOztVQVFBUCxJQUFJO1FBQ0wsQ0FWRDtNQVdELENBWkQ7SUFhRCxDQWxCRDtFQW1CRDs7RUFFREEsSUFBSTtBQUNMOztlQUVjTixtQjs7QUFDZmMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCZixtQkFBakIifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _token = require("./token");

const FEDAUTHINFOID = {
  STSURL: 0x01,
  SPN: 0x02
};

function fedAuthInfoParser(parser, _options, callback) {
  parser.readUInt32LE(tokenLength => {
    parser.readBuffer(tokenLength, data => {
      let spn, stsurl;
      let offset = 0;
      const countOfInfoIDs = data.readUInt32LE(offset);
      offset += 4;

      for (let i = 0; i < countOfInfoIDs; i++) {
        const fedauthInfoID = data.readUInt8(offset);
        offset += 1;
        const fedAuthInfoDataLen = data.readUInt32LE(offset);
        offset += 4;
        const fedAuthInfoDataOffset = data.readUInt32LE(offset);
        offset += 4;

        switch (fedauthInfoID) {
          case FEDAUTHINFOID.SPN:
            spn = data.toString('ucs2', fedAuthInfoDataOffset, fedAuthInfoDataOffset + fedAuthInfoDataLen);
            break;

          case FEDAUTHINFOID.STSURL:
            stsurl = data.toString('ucs2', fedAuthInfoDataOffset, fedAuthInfoDataOffset + fedAuthInfoDataLen);
            break;
          // ignoring unknown fedauthinfo options

          default:
            break;
        }
      }

      callback(new _token.FedAuthInfoToken(spn, stsurl));
    });
  });
}

var _default = fedAuthInfoParser;
exports.default = _default;
module.exports = fedAuthInfoParser;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGRURBVVRISU5GT0lEIiwiU1RTVVJMIiwiU1BOIiwiZmVkQXV0aEluZm9QYXJzZXIiLCJwYXJzZXIiLCJfb3B0aW9ucyIsImNhbGxiYWNrIiwicmVhZFVJbnQzMkxFIiwidG9rZW5MZW5ndGgiLCJyZWFkQnVmZmVyIiwiZGF0YSIsInNwbiIsInN0c3VybCIsIm9mZnNldCIsImNvdW50T2ZJbmZvSURzIiwiaSIsImZlZGF1dGhJbmZvSUQiLCJyZWFkVUludDgiLCJmZWRBdXRoSW5mb0RhdGFMZW4iLCJmZWRBdXRoSW5mb0RhdGFPZmZzZXQiLCJ0b1N0cmluZyIsIkZlZEF1dGhJbmZvVG9rZW4iLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rva2VuL2ZlZGF1dGgtaW5mby1wYXJzZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFBhcnNlciwgeyBQYXJzZXJPcHRpb25zIH0gZnJvbSAnLi9zdHJlYW0tcGFyc2VyJztcbmltcG9ydCB7IEZlZEF1dGhJbmZvVG9rZW4gfSBmcm9tICcuL3Rva2VuJztcblxuY29uc3QgRkVEQVVUSElORk9JRCA9IHtcbiAgU1RTVVJMOiAweDAxLFxuICBTUE46IDB4MDJcbn07XG5cbmZ1bmN0aW9uIGZlZEF1dGhJbmZvUGFyc2VyKHBhcnNlcjogUGFyc2VyLCBfb3B0aW9uczogUGFyc2VyT3B0aW9ucywgY2FsbGJhY2s6ICh0b2tlbjogRmVkQXV0aEluZm9Ub2tlbikgPT4gdm9pZCkge1xuICBwYXJzZXIucmVhZFVJbnQzMkxFKCh0b2tlbkxlbmd0aCkgPT4ge1xuICAgIHBhcnNlci5yZWFkQnVmZmVyKHRva2VuTGVuZ3RoLCAoZGF0YSkgPT4ge1xuICAgICAgbGV0IHNwbjogc3RyaW5nIHwgdW5kZWZpbmVkLCBzdHN1cmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgICAgbGV0IG9mZnNldCA9IDA7XG5cbiAgICAgIGNvbnN0IGNvdW50T2ZJbmZvSURzID0gZGF0YS5yZWFkVUludDMyTEUob2Zmc2V0KTtcbiAgICAgIG9mZnNldCArPSA0O1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50T2ZJbmZvSURzOyBpKyspIHtcbiAgICAgICAgY29uc3QgZmVkYXV0aEluZm9JRCA9IGRhdGEucmVhZFVJbnQ4KG9mZnNldCk7XG4gICAgICAgIG9mZnNldCArPSAxO1xuXG4gICAgICAgIGNvbnN0IGZlZEF1dGhJbmZvRGF0YUxlbiA9IGRhdGEucmVhZFVJbnQzMkxFKG9mZnNldCk7XG4gICAgICAgIG9mZnNldCArPSA0O1xuXG4gICAgICAgIGNvbnN0IGZlZEF1dGhJbmZvRGF0YU9mZnNldCA9IGRhdGEucmVhZFVJbnQzMkxFKG9mZnNldCk7XG4gICAgICAgIG9mZnNldCArPSA0O1xuXG4gICAgICAgIHN3aXRjaCAoZmVkYXV0aEluZm9JRCkge1xuICAgICAgICAgIGNhc2UgRkVEQVVUSElORk9JRC5TUE46XG4gICAgICAgICAgICBzcG4gPSBkYXRhLnRvU3RyaW5nKCd1Y3MyJywgZmVkQXV0aEluZm9EYXRhT2Zmc2V0LCBmZWRBdXRoSW5mb0RhdGFPZmZzZXQgKyBmZWRBdXRoSW5mb0RhdGFMZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIEZFREFVVEhJTkZPSUQuU1RTVVJMOlxuICAgICAgICAgICAgc3RzdXJsID0gZGF0YS50b1N0cmluZygndWNzMicsIGZlZEF1dGhJbmZvRGF0YU9mZnNldCwgZmVkQXV0aEluZm9EYXRhT2Zmc2V0ICsgZmVkQXV0aEluZm9EYXRhTGVuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgLy8gaWdub3JpbmcgdW5rbm93biBmZWRhdXRoaW5mbyBvcHRpb25zXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNhbGxiYWNrKG5ldyBGZWRBdXRoSW5mb1Rva2VuKHNwbiwgc3RzdXJsKSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmZWRBdXRoSW5mb1BhcnNlcjtcbm1vZHVsZS5leHBvcnRzID0gZmVkQXV0aEluZm9QYXJzZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7QUFFQSxNQUFNQSxhQUFhLEdBQUc7RUFDcEJDLE1BQU0sRUFBRSxJQURZO0VBRXBCQyxHQUFHLEVBQUU7QUFGZSxDQUF0Qjs7QUFLQSxTQUFTQyxpQkFBVCxDQUEyQkMsTUFBM0IsRUFBMkNDLFFBQTNDLEVBQW9FQyxRQUFwRSxFQUFpSDtFQUMvR0YsTUFBTSxDQUFDRyxZQUFQLENBQXFCQyxXQUFELElBQWlCO0lBQ25DSixNQUFNLENBQUNLLFVBQVAsQ0FBa0JELFdBQWxCLEVBQWdDRSxJQUFELElBQVU7TUFDdkMsSUFBSUMsR0FBSixFQUE2QkMsTUFBN0I7TUFFQSxJQUFJQyxNQUFNLEdBQUcsQ0FBYjtNQUVBLE1BQU1DLGNBQWMsR0FBR0osSUFBSSxDQUFDSCxZQUFMLENBQWtCTSxNQUFsQixDQUF2QjtNQUNBQSxNQUFNLElBQUksQ0FBVjs7TUFFQSxLQUFLLElBQUlFLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdELGNBQXBCLEVBQW9DQyxDQUFDLEVBQXJDLEVBQXlDO1FBQ3ZDLE1BQU1DLGFBQWEsR0FBR04sSUFBSSxDQUFDTyxTQUFMLENBQWVKLE1BQWYsQ0FBdEI7UUFDQUEsTUFBTSxJQUFJLENBQVY7UUFFQSxNQUFNSyxrQkFBa0IsR0FBR1IsSUFBSSxDQUFDSCxZQUFMLENBQWtCTSxNQUFsQixDQUEzQjtRQUNBQSxNQUFNLElBQUksQ0FBVjtRQUVBLE1BQU1NLHFCQUFxQixHQUFHVCxJQUFJLENBQUNILFlBQUwsQ0FBa0JNLE1BQWxCLENBQTlCO1FBQ0FBLE1BQU0sSUFBSSxDQUFWOztRQUVBLFFBQVFHLGFBQVI7VUFDRSxLQUFLaEIsYUFBYSxDQUFDRSxHQUFuQjtZQUNFUyxHQUFHLEdBQUdELElBQUksQ0FBQ1UsUUFBTCxDQUFjLE1BQWQsRUFBc0JELHFCQUF0QixFQUE2Q0EscUJBQXFCLEdBQUdELGtCQUFyRSxDQUFOO1lBQ0E7O1VBRUYsS0FBS2xCLGFBQWEsQ0FBQ0MsTUFBbkI7WUFDRVcsTUFBTSxHQUFHRixJQUFJLENBQUNVLFFBQUwsQ0FBYyxNQUFkLEVBQXNCRCxxQkFBdEIsRUFBNkNBLHFCQUFxQixHQUFHRCxrQkFBckUsQ0FBVDtZQUNBO1VBRUY7O1VBQ0E7WUFDRTtRQVhKO01BYUQ7O01BRURaLFFBQVEsQ0FBQyxJQUFJZSx1QkFBSixDQUFxQlYsR0FBckIsRUFBMEJDLE1BQTFCLENBQUQsQ0FBUjtJQUNELENBbENEO0VBbUNELENBcENEO0FBcUNEOztlQUVjVCxpQjs7QUFDZm1CLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQnBCLGlCQUFqQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.UnexpectedTokenError = exports.TokenHandler = exports.RequestTokenHandler = exports.Login7TokenHandler = exports.InitialSqlTokenHandler = exports.AttentionTokenHandler = void 0;

var _request = _interopRequireDefault(require("../request"));

var _errors = require("../errors");

var _esAggregateError = _interopRequireDefault(require("es-aggregate-error"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

class UnexpectedTokenError extends Error {
  constructor(handler, token) {
    super('Unexpected token `' + token.name + '` in `' + handler.constructor.name + '`');
  }

}

exports.UnexpectedTokenError = UnexpectedTokenError;

class TokenHandler {
  onInfoMessage(token) {
    throw new UnexpectedTokenError(this, token);
  }

  onErrorMessage(token) {
    throw new UnexpectedTokenError(this, token);
  }

  onSSPI(token) {
    throw new UnexpectedTokenError(this, token);
  }

  onDatabaseChange(token) {
    throw new UnexpectedTokenError(this, token);
  }

  onLanguageChange(token) {
    throw new UnexpectedTokenError(this, token);
  }

  onCharsetChange(token) {
    throw new UnexpectedTokenError(this, token);
  }

  onSqlCollationChange(token) {
    throw new UnexpectedTokenError(this, token);
  }

  onRoutingChange(token) {
    throw new UnexpectedTokenError(this, token);
  }

  onPacketSizeChange(token) {
    throw new UnexpectedTokenError(this, token);
  }

  onResetConnection(token) {
    throw new UnexpectedTokenError(this, token);
  }

  onBeginTransaction(token) {
    throw new UnexpectedTokenError(this, token);
  }

  onCommitTransaction(token) {
    throw new UnexpectedTokenError(this, token);
  }

  onRollbackTransaction(token) {
    throw new UnexpectedTokenError(this, token);
  }

  onFedAuthInfo(token) {
    throw new UnexpectedTokenError(this, token);
  }

  onFeatureExtAck(token) {
    throw new UnexpectedTokenError(this, token);
  }

  onLoginAck(token) {
    throw new UnexpectedTokenError(this, token);
  }

  onColMetadata(token) {
    throw new UnexpectedTokenError(this, token);
  }

  onOrder(token) {
    throw new UnexpectedTokenError(this, token);
  }

  onRow(token) {
    throw new UnexpectedTokenError(this, token);
  }

  onReturnStatus(token) {
    throw new UnexpectedTokenError(this, token);
  }

  onReturnValue(token) {
    throw new UnexpectedTokenError(this, token);
  }

  onDoneProc(token) {
    throw new UnexpectedTokenError(this, token);
  }

  onDoneInProc(token) {
    throw new UnexpectedTokenError(this, token);
  }

  onDone(token) {
    throw new UnexpectedTokenError(this, token);
  }

  onDatabaseMirroringPartner(token) {
    throw new UnexpectedTokenError(this, token);
  }

}
/**
 * A handler for tokens received in the response message to the initial SQL Batch request
 * that sets up different connection settings.
 */


exports.TokenHandler = TokenHandler;

class InitialSqlTokenHandler extends TokenHandler {
  constructor(connection) {
    super();
    this.connection = void 0;
    this.connection = connection;
  }

  onInfoMessage(token) {
    this.connection.emit('infoMessage', token);
  }

  onErrorMessage(token) {
    this.connection.emit('errorMessage', token);
  }

  onDatabaseChange(token) {
    this.connection.emit('databaseChange', token.newValue);
  }

  onLanguageChange(token) {
    this.connection.emit('languageChange', token.newValue);
  }

  onCharsetChange(token) {
    this.connection.emit('charsetChange', token.newValue);
  }

  onSqlCollationChange(token) {
    this.connection.databaseCollation = token.newValue;
  }

  onPacketSizeChange(token) {
    this.connection.messageIo.packetSize(token.newValue);
  }

  onBeginTransaction(token) {
    this.connection.transactionDescriptors.push(token.newValue);
    this.connection.inTransaction = true;
  }

  onCommitTransaction(token) {
    this.connection.transactionDescriptors.length = 1;
    this.connection.inTransaction = false;
  }

  onRollbackTransaction(token) {
    this.connection.transactionDescriptors.length = 1; // An outermost transaction was rolled back. Reset the transaction counter

    this.connection.inTransaction = false;
    this.connection.emit('rollbackTransaction');
  }

  onColMetadata(token) {
    this.connection.emit('error', new Error("Received 'columnMetadata' when no sqlRequest is in progress"));
    this.connection.close();
  }

  onOrder(token) {
    this.connection.emit('error', new Error("Received 'order' when no sqlRequest is in progress"));
    this.connection.close();
  }

  onRow(token) {
    this.connection.emit('error', new Error("Received 'row' when no sqlRequest is in progress"));
    this.connection.close();
  }

  onReturnStatus(token) {// Do nothing
  }

  onReturnValue(token) {// Do nothing
  }

  onDoneProc(token) {// Do nothing
  }

  onDoneInProc(token) {// Do nothing
  }

  onDone(token) {// Do nothing
  }

  onResetConnection(token) {
    this.connection.emit('resetConnection');
  }

}
/**
 * A handler for tokens received in the response message to a Login7 message.
 */


exports.InitialSqlTokenHandler = InitialSqlTokenHandler;

class Login7TokenHandler extends TokenHandler {
  constructor(connection) {
    super();
    this.connection = void 0;
    this.fedAuthInfoToken = void 0;
    this.routingData = void 0;
    this.loginAckReceived = false;
    this.connection = connection;
  }

  onInfoMessage(token) {
    this.connection.emit('infoMessage', token);
  }

  onErrorMessage(token) {
    this.connection.emit('errorMessage', token);
    const error = new _errors.ConnectionError(token.message, 'ELOGIN');
    const isLoginErrorTransient = this.connection.transientErrorLookup.isTransientError(token.number);

    if (isLoginErrorTransient && this.connection.curTransientRetryCount !== this.connection.config.options.maxRetriesOnTransientErrors) {
      error.isTransient = true;
    }

    this.connection.loginError = error;
  }

  onSSPI(token) {
    if (token.ntlmpacket) {
      this.connection.ntlmpacket = token.ntlmpacket;
      this.connection.ntlmpacketBuffer = token.ntlmpacketBuffer;
    }
  }

  onDatabaseChange(token) {
    this.connection.emit('databaseChange', token.newValue);
  }

  onLanguageChange(token) {
    this.connection.emit('languageChange', token.newValue);
  }

  onCharsetChange(token) {
    this.connection.emit('charsetChange', token.newValue);
  }

  onSqlCollationChange(token) {
    this.connection.databaseCollation = token.newValue;
  }

  onFedAuthInfo(token) {
    this.fedAuthInfoToken = token;
  }

  onFeatureExtAck(token) {
    const {
      authentication
    } = this.connection.config;

    if (authentication.type === 'azure-active-directory-password' || authentication.type === 'azure-active-directory-access-token' || authentication.type === 'azure-active-directory-msi-vm' || authentication.type === 'azure-active-directory-msi-app-service' || authentication.type === 'azure-active-directory-service-principal-secret' || authentication.type === 'azure-active-directory-default') {
      if (token.fedAuth === undefined) {
        this.connection.loginError = new _errors.ConnectionError('Did not receive Active Directory authentication acknowledgement');
      } else if (token.fedAuth.length !== 0) {
        this.connection.loginError = new _errors.ConnectionError(`Active Directory authentication acknowledgment for ${authentication.type} authentication method includes extra data`);
      }
    } else if (token.fedAuth === undefined && token.utf8Support === undefined) {
      this.connection.loginError = new _errors.ConnectionError('Received acknowledgement for unknown feature');
    } else if (token.fedAuth) {
      this.connection.loginError = new _errors.ConnectionError('Did not request Active Directory authentication, but received the acknowledgment');
    }
  }

  onLoginAck(token) {
    if (!token.tdsVersion) {
      // unsupported TDS version
      this.connection.loginError = new _errors.ConnectionError('Server responded with unknown TDS version.', 'ETDS');
      return;
    }

    if (!token.interface) {
      // unsupported interface
      this.connection.loginError = new _errors.ConnectionError('Server responded with unsupported interface.', 'EINTERFACENOTSUPP');
      return;
    } // use negotiated version


    this.connection.config.options.tdsVersion = token.tdsVersion;
    this.loginAckReceived = true;
  }

  onRoutingChange(token) {
    // Removes instance name attached to the redirect url. E.g., redirect.db.net\instance1 --> redirect.db.net
    const [server] = token.newValue.server.split('\\');
    this.routingData = {
      server,
      port: token.newValue.port
    };
  }

  onDoneInProc(token) {// Do nothing
  }

  onDone(token) {// Do nothing
  }

  onPacketSizeChange(token) {
    this.connection.messageIo.packetSize(token.newValue);
  }

  onDatabaseMirroringPartner(token) {// Do nothing
  }

}
/**
 * A handler for tokens received in the response message to a RPC Request,
 * a SQL Batch Request, a Bulk Load BCP Request or a Transaction Manager Request.
 */


exports.Login7TokenHandler = Login7TokenHandler;

class RequestTokenHandler extends TokenHandler {
  constructor(connection, request) {
    super();
    this.connection = void 0;
    this.request = void 0;
    this.errors = void 0;
    this.connection = connection;
    this.request = request;
    this.errors = [];
  }

  onInfoMessage(token) {
    this.connection.emit('infoMessage', token);
  }

  onErrorMessage(token) {
    this.connection.emit('errorMessage', token);

    if (!this.request.canceled) {
      const error = new _errors.RequestError(token.message, 'EREQUEST');
      error.number = token.number;
      error.state = token.state;
      error.class = token.class;
      error.serverName = token.serverName;
      error.procName = token.procName;
      error.lineNumber = token.lineNumber;
      this.errors.push(error);
      this.request.error = error;

      if (this.request instanceof _request.default && this.errors.length > 1) {
        this.request.error = new _esAggregateError.default(this.errors);
      }
    }
  }

  onDatabaseChange(token) {
    this.connection.emit('databaseChange', token.newValue);
  }

  onLanguageChange(token) {
    this.connection.emit('languageChange', token.newValue);
  }

  onCharsetChange(token) {
    this.connection.emit('charsetChange', token.newValue);
  }

  onSqlCollationChange(token) {
    this.connection.databaseCollation = token.newValue;
  }

  onPacketSizeChange(token) {
    this.connection.messageIo.packetSize(token.newValue);
  }

  onBeginTransaction(token) {
    this.connection.transactionDescriptors.push(token.newValue);
    this.connection.inTransaction = true;
  }

  onCommitTransaction(token) {
    this.connection.transactionDescriptors.length = 1;
    this.connection.inTransaction = false;
  }

  onRollbackTransaction(token) {
    this.connection.transactionDescriptors.length = 1; // An outermost transaction was rolled back. Reset the transaction counter

    this.connection.inTransaction = false;
    this.connection.emit('rollbackTransaction');
  }

  onColMetadata(token) {
    if (!this.request.canceled) {
      if (this.connection.config.options.useColumnNames) {
        const columns = Object.create(null);

        for (let j = 0, len = token.columns.length; j < len; j++) {
          const col = token.columns[j];

          if (columns[col.colName] == null) {
            columns[col.colName] = col;
          }
        }

        this.request.emit('columnMetadata', columns);
      } else {
        this.request.emit('columnMetadata', token.columns);
      }
    }
  }

  onOrder(token) {
    if (!this.request.canceled) {
      this.request.emit('order', token.orderColumns);
    }
  }

  onRow(token) {
    if (!this.request.canceled) {
      if (this.connection.config.options.rowCollectionOnRequestCompletion) {
        this.request.rows.push(token.columns);
      }

      if (this.connection.config.options.rowCollectionOnDone) {
        this.request.rst.push(token.columns);
      }

      this.request.emit('row', token.columns);
    }
  }

  onReturnStatus(token) {
    if (!this.request.canceled) {
      // Keep value for passing in 'doneProc' event.
      this.connection.procReturnStatusValue = token.value;
    }
  }

  onReturnValue(token) {
    if (!this.request.canceled) {
      this.request.emit('returnValue', token.paramName, token.value, token.metadata);
    }
  }

  onDoneProc(token) {
    if (!this.request.canceled) {
      if (token.sqlError && !this.request.error) {
        // check if the DONE_ERROR flags was set, but an ERROR token was not sent.
        this.request.error = new _errors.RequestError('An unknown error has occurred.', 'UNKNOWN');
      }

      this.request.emit('doneProc', token.rowCount, token.more, this.connection.procReturnStatusValue, this.request.rst);
      this.connection.procReturnStatusValue = undefined;

      if (token.rowCount !== undefined) {
        this.request.rowCount += token.rowCount;
      }

      if (this.connection.config.options.rowCollectionOnDone) {
        this.request.rst = [];
      }
    }
  }

  onDoneInProc(token) {
    if (!this.request.canceled) {
      this.request.emit('doneInProc', token.rowCount, token.more, this.request.rst);

      if (token.rowCount !== undefined) {
        this.request.rowCount += token.rowCount;
      }

      if (this.connection.config.options.rowCollectionOnDone) {
        this.request.rst = [];
      }
    }
  }

  onDone(token) {
    if (!this.request.canceled) {
      if (token.sqlError && !this.request.error) {
        // check if the DONE_ERROR flags was set, but an ERROR token was not sent.
        this.request.error = new _errors.RequestError('An unknown error has occurred.', 'UNKNOWN');
      }

      this.request.emit('done', token.rowCount, token.more, this.request.rst);

      if (token.rowCount !== undefined) {
        this.request.rowCount += token.rowCount;
      }

      if (this.connection.config.options.rowCollectionOnDone) {
        this.request.rst = [];
      }
    }
  }

  onResetConnection(token) {
    this.connection.emit('resetConnection');
  }

}
/**
 * A handler for the attention acknowledgement message.
 *
 * This message only contains a `DONE` token that acknowledges
 * that the attention message was received by the server.
 */


exports.RequestTokenHandler = RequestTokenHandler;

class AttentionTokenHandler extends TokenHandler {
  /**
   * Returns whether an attention acknowledgement was received.
   */
  constructor(connection, request) {
    super();
    this.connection = void 0;
    this.request = void 0;
    this.attentionReceived = void 0;
    this.connection = connection;
    this.request = request;
    this.attentionReceived = false;
  }

  onDone(token) {
    if (token.attention) {
      this.attentionReceived = true;
    }
  }

}

exports.AttentionTokenHandler = AttentionTokenHandler;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJVbmV4cGVjdGVkVG9rZW5FcnJvciIsIkVycm9yIiwiY29uc3RydWN0b3IiLCJoYW5kbGVyIiwidG9rZW4iLCJuYW1lIiwiVG9rZW5IYW5kbGVyIiwib25JbmZvTWVzc2FnZSIsIm9uRXJyb3JNZXNzYWdlIiwib25TU1BJIiwib25EYXRhYmFzZUNoYW5nZSIsIm9uTGFuZ3VhZ2VDaGFuZ2UiLCJvbkNoYXJzZXRDaGFuZ2UiLCJvblNxbENvbGxhdGlvbkNoYW5nZSIsIm9uUm91dGluZ0NoYW5nZSIsIm9uUGFja2V0U2l6ZUNoYW5nZSIsIm9uUmVzZXRDb25uZWN0aW9uIiwib25CZWdpblRyYW5zYWN0aW9uIiwib25Db21taXRUcmFuc2FjdGlvbiIsIm9uUm9sbGJhY2tUcmFuc2FjdGlvbiIsIm9uRmVkQXV0aEluZm8iLCJvbkZlYXR1cmVFeHRBY2siLCJvbkxvZ2luQWNrIiwib25Db2xNZXRhZGF0YSIsIm9uT3JkZXIiLCJvblJvdyIsIm9uUmV0dXJuU3RhdHVzIiwib25SZXR1cm5WYWx1ZSIsIm9uRG9uZVByb2MiLCJvbkRvbmVJblByb2MiLCJvbkRvbmUiLCJvbkRhdGFiYXNlTWlycm9yaW5nUGFydG5lciIsIkluaXRpYWxTcWxUb2tlbkhhbmRsZXIiLCJjb25uZWN0aW9uIiwiZW1pdCIsIm5ld1ZhbHVlIiwiZGF0YWJhc2VDb2xsYXRpb24iLCJtZXNzYWdlSW8iLCJwYWNrZXRTaXplIiwidHJhbnNhY3Rpb25EZXNjcmlwdG9ycyIsInB1c2giLCJpblRyYW5zYWN0aW9uIiwibGVuZ3RoIiwiY2xvc2UiLCJMb2dpbjdUb2tlbkhhbmRsZXIiLCJmZWRBdXRoSW5mb1Rva2VuIiwicm91dGluZ0RhdGEiLCJsb2dpbkFja1JlY2VpdmVkIiwiZXJyb3IiLCJDb25uZWN0aW9uRXJyb3IiLCJtZXNzYWdlIiwiaXNMb2dpbkVycm9yVHJhbnNpZW50IiwidHJhbnNpZW50RXJyb3JMb29rdXAiLCJpc1RyYW5zaWVudEVycm9yIiwibnVtYmVyIiwiY3VyVHJhbnNpZW50UmV0cnlDb3VudCIsImNvbmZpZyIsIm9wdGlvbnMiLCJtYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnMiLCJpc1RyYW5zaWVudCIsImxvZ2luRXJyb3IiLCJudGxtcGFja2V0IiwibnRsbXBhY2tldEJ1ZmZlciIsImF1dGhlbnRpY2F0aW9uIiwidHlwZSIsImZlZEF1dGgiLCJ1bmRlZmluZWQiLCJ1dGY4U3VwcG9ydCIsInRkc1ZlcnNpb24iLCJpbnRlcmZhY2UiLCJzZXJ2ZXIiLCJzcGxpdCIsInBvcnQiLCJSZXF1ZXN0VG9rZW5IYW5kbGVyIiwicmVxdWVzdCIsImVycm9ycyIsImNhbmNlbGVkIiwiUmVxdWVzdEVycm9yIiwic3RhdGUiLCJjbGFzcyIsInNlcnZlck5hbWUiLCJwcm9jTmFtZSIsImxpbmVOdW1iZXIiLCJSZXF1ZXN0IiwiQWdncmVnYXRlRXJyb3IiLCJ1c2VDb2x1bW5OYW1lcyIsImNvbHVtbnMiLCJPYmplY3QiLCJjcmVhdGUiLCJqIiwibGVuIiwiY29sIiwiY29sTmFtZSIsIm9yZGVyQ29sdW1ucyIsInJvd0NvbGxlY3Rpb25PblJlcXVlc3RDb21wbGV0aW9uIiwicm93cyIsInJvd0NvbGxlY3Rpb25PbkRvbmUiLCJyc3QiLCJwcm9jUmV0dXJuU3RhdHVzVmFsdWUiLCJ2YWx1ZSIsInBhcmFtTmFtZSIsIm1ldGFkYXRhIiwic3FsRXJyb3IiLCJyb3dDb3VudCIsIm1vcmUiLCJBdHRlbnRpb25Ub2tlbkhhbmRsZXIiLCJhdHRlbnRpb25SZWNlaXZlZCIsImF0dGVudGlvbiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b2tlbi9oYW5kbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDb25uZWN0aW9uIGZyb20gJy4uL2Nvbm5lY3Rpb24nO1xuaW1wb3J0IFJlcXVlc3QgZnJvbSAnLi4vcmVxdWVzdCc7XG5pbXBvcnQgeyBDb25uZWN0aW9uRXJyb3IsIFJlcXVlc3RFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBDb2x1bW5NZXRhZGF0YSB9IGZyb20gJy4vY29sbWV0YWRhdGEtdG9rZW4tcGFyc2VyJztcbmltcG9ydCB7XG4gIEJlZ2luVHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbixcbiAgQ2hhcnNldEVudkNoYW5nZVRva2VuLFxuICBDb2xsYXRpb25DaGFuZ2VUb2tlbixcbiAgQ29sTWV0YWRhdGFUb2tlbixcbiAgQ29tbWl0VHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbixcbiAgRGF0YWJhc2VFbnZDaGFuZ2VUb2tlbixcbiAgRGF0YWJhc2VNaXJyb3JpbmdQYXJ0bmVyRW52Q2hhbmdlVG9rZW4sXG4gIERvbmVJblByb2NUb2tlbixcbiAgRG9uZVByb2NUb2tlbixcbiAgRG9uZVRva2VuLFxuICBFcnJvck1lc3NhZ2VUb2tlbixcbiAgRmVhdHVyZUV4dEFja1Rva2VuLFxuICBGZWRBdXRoSW5mb1Rva2VuLFxuICBJbmZvTWVzc2FnZVRva2VuLFxuICBMYW5ndWFnZUVudkNoYW5nZVRva2VuLFxuICBMb2dpbkFja1Rva2VuLFxuICBOQkNSb3dUb2tlbixcbiAgT3JkZXJUb2tlbixcbiAgUGFja2V0U2l6ZUVudkNoYW5nZVRva2VuLFxuICBSZXNldENvbm5lY3Rpb25FbnZDaGFuZ2VUb2tlbixcbiAgUmV0dXJuU3RhdHVzVG9rZW4sXG4gIFJldHVyblZhbHVlVG9rZW4sXG4gIFJvbGxiYWNrVHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbixcbiAgUm91dGluZ0VudkNoYW5nZVRva2VuLFxuICBSb3dUb2tlbixcbiAgU1NQSVRva2VuLFxuICBUb2tlblxufSBmcm9tICcuL3Rva2VuJztcbmltcG9ydCBCdWxrTG9hZCBmcm9tICcuLi9idWxrLWxvYWQnO1xuXG5pbXBvcnQgQWdncmVnYXRlRXJyb3IgZnJvbSAnZXMtYWdncmVnYXRlLWVycm9yJztcblxuZXhwb3J0IGNsYXNzIFVuZXhwZWN0ZWRUb2tlbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihoYW5kbGVyOiBUb2tlbkhhbmRsZXIsIHRva2VuOiBUb2tlbikge1xuICAgIHN1cGVyKCdVbmV4cGVjdGVkIHRva2VuIGAnICsgdG9rZW4ubmFtZSArICdgIGluIGAnICsgaGFuZGxlci5jb25zdHJ1Y3Rvci5uYW1lICsgJ2AnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVG9rZW5IYW5kbGVyIHtcbiAgb25JbmZvTWVzc2FnZSh0b2tlbjogSW5mb01lc3NhZ2VUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvbkVycm9yTWVzc2FnZSh0b2tlbjogRXJyb3JNZXNzYWdlVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25TU1BJKHRva2VuOiBTU1BJVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25EYXRhYmFzZUNoYW5nZSh0b2tlbjogRGF0YWJhc2VFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvbkxhbmd1YWdlQ2hhbmdlKHRva2VuOiBMYW5ndWFnZUVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uQ2hhcnNldENoYW5nZSh0b2tlbjogQ2hhcnNldEVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uU3FsQ29sbGF0aW9uQ2hhbmdlKHRva2VuOiBDb2xsYXRpb25DaGFuZ2VUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvblJvdXRpbmdDaGFuZ2UodG9rZW46IFJvdXRpbmdFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvblBhY2tldFNpemVDaGFuZ2UodG9rZW46IFBhY2tldFNpemVFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvblJlc2V0Q29ubmVjdGlvbih0b2tlbjogUmVzZXRDb25uZWN0aW9uRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25CZWdpblRyYW5zYWN0aW9uKHRva2VuOiBCZWdpblRyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25Db21taXRUcmFuc2FjdGlvbih0b2tlbjogQ29tbWl0VHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvblJvbGxiYWNrVHJhbnNhY3Rpb24odG9rZW46IFJvbGxiYWNrVHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvbkZlZEF1dGhJbmZvKHRva2VuOiBGZWRBdXRoSW5mb1Rva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uRmVhdHVyZUV4dEFjayh0b2tlbjogRmVhdHVyZUV4dEFja1Rva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uTG9naW5BY2sodG9rZW46IExvZ2luQWNrVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25Db2xNZXRhZGF0YSh0b2tlbjogQ29sTWV0YWRhdGFUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvbk9yZGVyKHRva2VuOiBPcmRlclRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uUm93KHRva2VuOiBSb3dUb2tlbiB8IE5CQ1Jvd1Rva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uUmV0dXJuU3RhdHVzKHRva2VuOiBSZXR1cm5TdGF0dXNUb2tlbikge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVG9rZW5FcnJvcih0aGlzLCB0b2tlbik7XG4gIH1cblxuICBvblJldHVyblZhbHVlKHRva2VuOiBSZXR1cm5WYWx1ZVRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxuXG4gIG9uRG9uZVByb2ModG9rZW46IERvbmVQcm9jVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25Eb25lSW5Qcm9jKHRva2VuOiBEb25lSW5Qcm9jVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25Eb25lKHRva2VuOiBEb25lVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFRva2VuRXJyb3IodGhpcywgdG9rZW4pO1xuICB9XG5cbiAgb25EYXRhYmFzZU1pcnJvcmluZ1BhcnRuZXIodG9rZW46IERhdGFiYXNlTWlycm9yaW5nUGFydG5lckVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRUb2tlbkVycm9yKHRoaXMsIHRva2VuKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgaGFuZGxlciBmb3IgdG9rZW5zIHJlY2VpdmVkIGluIHRoZSByZXNwb25zZSBtZXNzYWdlIHRvIHRoZSBpbml0aWFsIFNRTCBCYXRjaCByZXF1ZXN0XG4gKiB0aGF0IHNldHMgdXAgZGlmZmVyZW50IGNvbm5lY3Rpb24gc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbml0aWFsU3FsVG9rZW5IYW5kbGVyIGV4dGVuZHMgVG9rZW5IYW5kbGVyIHtcbiAgY29ubmVjdGlvbjogQ29ubmVjdGlvbjtcblxuICBjb25zdHJ1Y3Rvcihjb25uZWN0aW9uOiBDb25uZWN0aW9uKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gIH1cblxuICBvbkluZm9NZXNzYWdlKHRva2VuOiBJbmZvTWVzc2FnZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2luZm9NZXNzYWdlJywgdG9rZW4pO1xuICB9XG5cbiAgb25FcnJvck1lc3NhZ2UodG9rZW46IEVycm9yTWVzc2FnZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2Vycm9yTWVzc2FnZScsIHRva2VuKTtcbiAgfVxuXG4gIG9uRGF0YWJhc2VDaGFuZ2UodG9rZW46IERhdGFiYXNlRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnZGF0YWJhc2VDaGFuZ2UnLCB0b2tlbi5uZXdWYWx1ZSk7XG4gIH1cblxuICBvbkxhbmd1YWdlQ2hhbmdlKHRva2VuOiBMYW5ndWFnZUVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2xhbmd1YWdlQ2hhbmdlJywgdG9rZW4ubmV3VmFsdWUpO1xuICB9XG5cbiAgb25DaGFyc2V0Q2hhbmdlKHRva2VuOiBDaGFyc2V0RW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnY2hhcnNldENoYW5nZScsIHRva2VuLm5ld1ZhbHVlKTtcbiAgfVxuXG4gIG9uU3FsQ29sbGF0aW9uQ2hhbmdlKHRva2VuOiBDb2xsYXRpb25DaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5kYXRhYmFzZUNvbGxhdGlvbiA9IHRva2VuLm5ld1ZhbHVlO1xuICB9XG5cbiAgb25QYWNrZXRTaXplQ2hhbmdlKHRva2VuOiBQYWNrZXRTaXplRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24ubWVzc2FnZUlvLnBhY2tldFNpemUodG9rZW4ubmV3VmFsdWUpO1xuICB9XG5cbiAgb25CZWdpblRyYW5zYWN0aW9uKHRva2VuOiBCZWdpblRyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24udHJhbnNhY3Rpb25EZXNjcmlwdG9ycy5wdXNoKHRva2VuLm5ld1ZhbHVlKTtcbiAgICB0aGlzLmNvbm5lY3Rpb24uaW5UcmFuc2FjdGlvbiA9IHRydWU7XG4gIH1cblxuICBvbkNvbW1pdFRyYW5zYWN0aW9uKHRva2VuOiBDb21taXRUcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLnRyYW5zYWN0aW9uRGVzY3JpcHRvcnMubGVuZ3RoID0gMTtcbiAgICB0aGlzLmNvbm5lY3Rpb24uaW5UcmFuc2FjdGlvbiA9IGZhbHNlO1xuICB9XG5cbiAgb25Sb2xsYmFja1RyYW5zYWN0aW9uKHRva2VuOiBSb2xsYmFja1RyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24udHJhbnNhY3Rpb25EZXNjcmlwdG9ycy5sZW5ndGggPSAxO1xuICAgIC8vIEFuIG91dGVybW9zdCB0cmFuc2FjdGlvbiB3YXMgcm9sbGVkIGJhY2suIFJlc2V0IHRoZSB0cmFuc2FjdGlvbiBjb3VudGVyXG4gICAgdGhpcy5jb25uZWN0aW9uLmluVHJhbnNhY3Rpb24gPSBmYWxzZTtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgncm9sbGJhY2tUcmFuc2FjdGlvbicpO1xuICB9XG5cbiAgb25Db2xNZXRhZGF0YSh0b2tlbjogQ29sTWV0YWRhdGFUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcihcIlJlY2VpdmVkICdjb2x1bW5NZXRhZGF0YScgd2hlbiBubyBzcWxSZXF1ZXN0IGlzIGluIHByb2dyZXNzXCIpKTtcbiAgICB0aGlzLmNvbm5lY3Rpb24uY2xvc2UoKTtcbiAgfVxuXG4gIG9uT3JkZXIodG9rZW46IE9yZGVyVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoXCJSZWNlaXZlZCAnb3JkZXInIHdoZW4gbm8gc3FsUmVxdWVzdCBpcyBpbiBwcm9ncmVzc1wiKSk7XG4gICAgdGhpcy5jb25uZWN0aW9uLmNsb3NlKCk7XG4gIH1cblxuICBvblJvdyh0b2tlbjogUm93VG9rZW4gfCBOQkNSb3dUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcihcIlJlY2VpdmVkICdyb3cnIHdoZW4gbm8gc3FsUmVxdWVzdCBpcyBpbiBwcm9ncmVzc1wiKSk7XG4gICAgdGhpcy5jb25uZWN0aW9uLmNsb3NlKCk7XG4gIH1cblxuICBvblJldHVyblN0YXR1cyh0b2tlbjogUmV0dXJuU3RhdHVzVG9rZW4pIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH1cblxuICBvblJldHVyblZhbHVlKHRva2VuOiBSZXR1cm5WYWx1ZVRva2VuKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9XG5cbiAgb25Eb25lUHJvYyh0b2tlbjogRG9uZVByb2NUb2tlbikge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfVxuXG4gIG9uRG9uZUluUHJvYyh0b2tlbjogRG9uZUluUHJvY1Rva2VuKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9XG5cbiAgb25Eb25lKHRva2VuOiBEb25lVG9rZW4pIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH1cblxuICBvblJlc2V0Q29ubmVjdGlvbih0b2tlbjogUmVzZXRDb25uZWN0aW9uRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgncmVzZXRDb25uZWN0aW9uJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGhhbmRsZXIgZm9yIHRva2VucyByZWNlaXZlZCBpbiB0aGUgcmVzcG9uc2UgbWVzc2FnZSB0byBhIExvZ2luNyBtZXNzYWdlLlxuICovXG5leHBvcnQgY2xhc3MgTG9naW43VG9rZW5IYW5kbGVyIGV4dGVuZHMgVG9rZW5IYW5kbGVyIHtcbiAgY29ubmVjdGlvbjogQ29ubmVjdGlvbjtcblxuICBmZWRBdXRoSW5mb1Rva2VuOiBGZWRBdXRoSW5mb1Rva2VuIHwgdW5kZWZpbmVkO1xuICByb3V0aW5nRGF0YTogeyBzZXJ2ZXI6IHN0cmluZywgcG9ydDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG5cbiAgbG9naW5BY2tSZWNlaXZlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKGNvbm5lY3Rpb246IENvbm5lY3Rpb24pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgfVxuXG4gIG9uSW5mb01lc3NhZ2UodG9rZW46IEluZm9NZXNzYWdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnaW5mb01lc3NhZ2UnLCB0b2tlbik7XG4gIH1cblxuICBvbkVycm9yTWVzc2FnZSh0b2tlbjogRXJyb3JNZXNzYWdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnZXJyb3JNZXNzYWdlJywgdG9rZW4pO1xuXG4gICAgY29uc3QgZXJyb3IgPSBuZXcgQ29ubmVjdGlvbkVycm9yKHRva2VuLm1lc3NhZ2UsICdFTE9HSU4nKTtcblxuICAgIGNvbnN0IGlzTG9naW5FcnJvclRyYW5zaWVudCA9IHRoaXMuY29ubmVjdGlvbi50cmFuc2llbnRFcnJvckxvb2t1cC5pc1RyYW5zaWVudEVycm9yKHRva2VuLm51bWJlcik7XG4gICAgaWYgKGlzTG9naW5FcnJvclRyYW5zaWVudCAmJiB0aGlzLmNvbm5lY3Rpb24uY3VyVHJhbnNpZW50UmV0cnlDb3VudCAhPT0gdGhpcy5jb25uZWN0aW9uLmNvbmZpZy5vcHRpb25zLm1heFJldHJpZXNPblRyYW5zaWVudEVycm9ycykge1xuICAgICAgZXJyb3IuaXNUcmFuc2llbnQgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuY29ubmVjdGlvbi5sb2dpbkVycm9yID0gZXJyb3I7XG4gIH1cblxuICBvblNTUEkodG9rZW46IFNTUElUb2tlbikge1xuICAgIGlmICh0b2tlbi5udGxtcGFja2V0KSB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb24ubnRsbXBhY2tldCA9IHRva2VuLm50bG1wYWNrZXQ7XG4gICAgICB0aGlzLmNvbm5lY3Rpb24ubnRsbXBhY2tldEJ1ZmZlciA9IHRva2VuLm50bG1wYWNrZXRCdWZmZXI7XG4gICAgfVxuICB9XG5cbiAgb25EYXRhYmFzZUNoYW5nZSh0b2tlbjogRGF0YWJhc2VFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdkYXRhYmFzZUNoYW5nZScsIHRva2VuLm5ld1ZhbHVlKTtcbiAgfVxuXG4gIG9uTGFuZ3VhZ2VDaGFuZ2UodG9rZW46IExhbmd1YWdlRW52Q2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZW1pdCgnbGFuZ3VhZ2VDaGFuZ2UnLCB0b2tlbi5uZXdWYWx1ZSk7XG4gIH1cblxuICBvbkNoYXJzZXRDaGFuZ2UodG9rZW46IENoYXJzZXRFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdjaGFyc2V0Q2hhbmdlJywgdG9rZW4ubmV3VmFsdWUpO1xuICB9XG5cbiAgb25TcWxDb2xsYXRpb25DaGFuZ2UodG9rZW46IENvbGxhdGlvbkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmRhdGFiYXNlQ29sbGF0aW9uID0gdG9rZW4ubmV3VmFsdWU7XG4gIH1cblxuICBvbkZlZEF1dGhJbmZvKHRva2VuOiBGZWRBdXRoSW5mb1Rva2VuKSB7XG4gICAgdGhpcy5mZWRBdXRoSW5mb1Rva2VuID0gdG9rZW47XG4gIH1cblxuICBvbkZlYXR1cmVFeHRBY2sodG9rZW46IEZlYXR1cmVFeHRBY2tUb2tlbikge1xuICAgIGNvbnN0IHsgYXV0aGVudGljYXRpb24gfSA9IHRoaXMuY29ubmVjdGlvbi5jb25maWc7XG5cbiAgICBpZiAoYXV0aGVudGljYXRpb24udHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktcGFzc3dvcmQnIHx8IGF1dGhlbnRpY2F0aW9uLnR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWFjY2Vzcy10b2tlbicgfHwgYXV0aGVudGljYXRpb24udHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLXZtJyB8fCBhdXRoZW50aWNhdGlvbi50eXBlID09PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktYXBwLXNlcnZpY2UnIHx8IGF1dGhlbnRpY2F0aW9uLnR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXNlcnZpY2UtcHJpbmNpcGFsLXNlY3JldCcgfHwgYXV0aGVudGljYXRpb24udHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktZGVmYXVsdCcpIHtcbiAgICAgIGlmICh0b2tlbi5mZWRBdXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLmxvZ2luRXJyb3IgPSBuZXcgQ29ubmVjdGlvbkVycm9yKCdEaWQgbm90IHJlY2VpdmUgQWN0aXZlIERpcmVjdG9yeSBhdXRoZW50aWNhdGlvbiBhY2tub3dsZWRnZW1lbnQnKTtcbiAgICAgIH0gZWxzZSBpZiAodG9rZW4uZmVkQXV0aC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLmxvZ2luRXJyb3IgPSBuZXcgQ29ubmVjdGlvbkVycm9yKGBBY3RpdmUgRGlyZWN0b3J5IGF1dGhlbnRpY2F0aW9uIGFja25vd2xlZGdtZW50IGZvciAke2F1dGhlbnRpY2F0aW9uLnR5cGV9IGF1dGhlbnRpY2F0aW9uIG1ldGhvZCBpbmNsdWRlcyBleHRyYSBkYXRhYCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0b2tlbi5mZWRBdXRoID09PSB1bmRlZmluZWQgJiYgdG9rZW4udXRmOFN1cHBvcnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jb25uZWN0aW9uLmxvZ2luRXJyb3IgPSBuZXcgQ29ubmVjdGlvbkVycm9yKCdSZWNlaXZlZCBhY2tub3dsZWRnZW1lbnQgZm9yIHVua25vd24gZmVhdHVyZScpO1xuICAgIH0gZWxzZSBpZiAodG9rZW4uZmVkQXV0aCkge1xuICAgICAgdGhpcy5jb25uZWN0aW9uLmxvZ2luRXJyb3IgPSBuZXcgQ29ubmVjdGlvbkVycm9yKCdEaWQgbm90IHJlcXVlc3QgQWN0aXZlIERpcmVjdG9yeSBhdXRoZW50aWNhdGlvbiwgYnV0IHJlY2VpdmVkIHRoZSBhY2tub3dsZWRnbWVudCcpO1xuICAgIH1cbiAgfVxuXG4gIG9uTG9naW5BY2sodG9rZW46IExvZ2luQWNrVG9rZW4pIHtcbiAgICBpZiAoIXRva2VuLnRkc1ZlcnNpb24pIHtcbiAgICAgIC8vIHVuc3VwcG9ydGVkIFREUyB2ZXJzaW9uXG4gICAgICB0aGlzLmNvbm5lY3Rpb24ubG9naW5FcnJvciA9IG5ldyBDb25uZWN0aW9uRXJyb3IoJ1NlcnZlciByZXNwb25kZWQgd2l0aCB1bmtub3duIFREUyB2ZXJzaW9uLicsICdFVERTJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0b2tlbi5pbnRlcmZhY2UpIHtcbiAgICAgIC8vIHVuc3VwcG9ydGVkIGludGVyZmFjZVxuICAgICAgdGhpcy5jb25uZWN0aW9uLmxvZ2luRXJyb3IgPSBuZXcgQ29ubmVjdGlvbkVycm9yKCdTZXJ2ZXIgcmVzcG9uZGVkIHdpdGggdW5zdXBwb3J0ZWQgaW50ZXJmYWNlLicsICdFSU5URVJGQUNFTk9UU1VQUCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHVzZSBuZWdvdGlhdGVkIHZlcnNpb25cbiAgICB0aGlzLmNvbm5lY3Rpb24uY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiA9IHRva2VuLnRkc1ZlcnNpb247XG5cbiAgICB0aGlzLmxvZ2luQWNrUmVjZWl2ZWQgPSB0cnVlO1xuICB9XG5cbiAgb25Sb3V0aW5nQ2hhbmdlKHRva2VuOiBSb3V0aW5nRW52Q2hhbmdlVG9rZW4pIHtcbiAgICAvLyBSZW1vdmVzIGluc3RhbmNlIG5hbWUgYXR0YWNoZWQgdG8gdGhlIHJlZGlyZWN0IHVybC4gRS5nLiwgcmVkaXJlY3QuZGIubmV0XFxpbnN0YW5jZTEgLS0+IHJlZGlyZWN0LmRiLm5ldFxuICAgIGNvbnN0IFsgc2VydmVyIF0gPSB0b2tlbi5uZXdWYWx1ZS5zZXJ2ZXIuc3BsaXQoJ1xcXFwnKTtcblxuICAgIHRoaXMucm91dGluZ0RhdGEgPSB7XG4gICAgICBzZXJ2ZXIsIHBvcnQ6IHRva2VuLm5ld1ZhbHVlLnBvcnRcbiAgICB9O1xuICB9XG5cbiAgb25Eb25lSW5Qcm9jKHRva2VuOiBEb25lSW5Qcm9jVG9rZW4pIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH1cblxuICBvbkRvbmUodG9rZW46IERvbmVUb2tlbikge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfVxuXG4gIG9uUGFja2V0U2l6ZUNoYW5nZSh0b2tlbjogUGFja2V0U2l6ZUVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLm1lc3NhZ2VJby5wYWNrZXRTaXplKHRva2VuLm5ld1ZhbHVlKTtcbiAgfVxuXG4gIG9uRGF0YWJhc2VNaXJyb3JpbmdQYXJ0bmVyKHRva2VuOiBEYXRhYmFzZU1pcnJvcmluZ1BhcnRuZXJFbnZDaGFuZ2VUb2tlbikge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfVxufVxuXG4vKipcbiAqIEEgaGFuZGxlciBmb3IgdG9rZW5zIHJlY2VpdmVkIGluIHRoZSByZXNwb25zZSBtZXNzYWdlIHRvIGEgUlBDIFJlcXVlc3QsXG4gKiBhIFNRTCBCYXRjaCBSZXF1ZXN0LCBhIEJ1bGsgTG9hZCBCQ1AgUmVxdWVzdCBvciBhIFRyYW5zYWN0aW9uIE1hbmFnZXIgUmVxdWVzdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlcXVlc3RUb2tlbkhhbmRsZXIgZXh0ZW5kcyBUb2tlbkhhbmRsZXIge1xuICBjb25uZWN0aW9uOiBDb25uZWN0aW9uO1xuICByZXF1ZXN0OiBSZXF1ZXN0IHwgQnVsa0xvYWQ7XG4gIGVycm9yczogUmVxdWVzdEVycm9yW107XG5cbiAgY29uc3RydWN0b3IoY29ubmVjdGlvbjogQ29ubmVjdGlvbiwgcmVxdWVzdDogUmVxdWVzdCB8IEJ1bGtMb2FkKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICB0aGlzLmVycm9ycyA9IFtdO1xuICB9XG5cbiAgb25JbmZvTWVzc2FnZSh0b2tlbjogSW5mb01lc3NhZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdpbmZvTWVzc2FnZScsIHRva2VuKTtcbiAgfVxuXG4gIG9uRXJyb3JNZXNzYWdlKHRva2VuOiBFcnJvck1lc3NhZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdlcnJvck1lc3NhZ2UnLCB0b2tlbik7XG5cbiAgICBpZiAoIXRoaXMucmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgUmVxdWVzdEVycm9yKHRva2VuLm1lc3NhZ2UsICdFUkVRVUVTVCcpO1xuXG4gICAgICBlcnJvci5udW1iZXIgPSB0b2tlbi5udW1iZXI7XG4gICAgICBlcnJvci5zdGF0ZSA9IHRva2VuLnN0YXRlO1xuICAgICAgZXJyb3IuY2xhc3MgPSB0b2tlbi5jbGFzcztcbiAgICAgIGVycm9yLnNlcnZlck5hbWUgPSB0b2tlbi5zZXJ2ZXJOYW1lO1xuICAgICAgZXJyb3IucHJvY05hbWUgPSB0b2tlbi5wcm9jTmFtZTtcbiAgICAgIGVycm9yLmxpbmVOdW1iZXIgPSB0b2tlbi5saW5lTnVtYmVyO1xuICAgICAgdGhpcy5lcnJvcnMucHVzaChlcnJvcik7XG4gICAgICB0aGlzLnJlcXVlc3QuZXJyb3IgPSBlcnJvcjtcbiAgICAgIGlmICh0aGlzLnJlcXVlc3QgaW5zdGFuY2VvZiBSZXF1ZXN0ICYmIHRoaXMuZXJyb3JzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0LmVycm9yID0gbmV3IEFnZ3JlZ2F0ZUVycm9yKHRoaXMuZXJyb3JzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkRhdGFiYXNlQ2hhbmdlKHRva2VuOiBEYXRhYmFzZUVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2RhdGFiYXNlQ2hhbmdlJywgdG9rZW4ubmV3VmFsdWUpO1xuICB9XG5cbiAgb25MYW5ndWFnZUNoYW5nZSh0b2tlbjogTGFuZ3VhZ2VFbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdsYW5ndWFnZUNoYW5nZScsIHRva2VuLm5ld1ZhbHVlKTtcbiAgfVxuXG4gIG9uQ2hhcnNldENoYW5nZSh0b2tlbjogQ2hhcnNldEVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ2NoYXJzZXRDaGFuZ2UnLCB0b2tlbi5uZXdWYWx1ZSk7XG4gIH1cblxuICBvblNxbENvbGxhdGlvbkNoYW5nZSh0b2tlbjogQ29sbGF0aW9uQ2hhbmdlVG9rZW4pIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24uZGF0YWJhc2VDb2xsYXRpb24gPSB0b2tlbi5uZXdWYWx1ZTtcbiAgfVxuXG4gIG9uUGFja2V0U2l6ZUNoYW5nZSh0b2tlbjogUGFja2V0U2l6ZUVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLm1lc3NhZ2VJby5wYWNrZXRTaXplKHRva2VuLm5ld1ZhbHVlKTtcbiAgfVxuXG4gIG9uQmVnaW5UcmFuc2FjdGlvbih0b2tlbjogQmVnaW5UcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLnRyYW5zYWN0aW9uRGVzY3JpcHRvcnMucHVzaCh0b2tlbi5uZXdWYWx1ZSk7XG4gICAgdGhpcy5jb25uZWN0aW9uLmluVHJhbnNhY3Rpb24gPSB0cnVlO1xuICB9XG5cbiAgb25Db21taXRUcmFuc2FjdGlvbih0b2tlbjogQ29tbWl0VHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi50cmFuc2FjdGlvbkRlc2NyaXB0b3JzLmxlbmd0aCA9IDE7XG4gICAgdGhpcy5jb25uZWN0aW9uLmluVHJhbnNhY3Rpb24gPSBmYWxzZTtcbiAgfVxuXG4gIG9uUm9sbGJhY2tUcmFuc2FjdGlvbih0b2tlbjogUm9sbGJhY2tUcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uLnRyYW5zYWN0aW9uRGVzY3JpcHRvcnMubGVuZ3RoID0gMTtcbiAgICAvLyBBbiBvdXRlcm1vc3QgdHJhbnNhY3Rpb24gd2FzIHJvbGxlZCBiYWNrLiBSZXNldCB0aGUgdHJhbnNhY3Rpb24gY291bnRlclxuICAgIHRoaXMuY29ubmVjdGlvbi5pblRyYW5zYWN0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5jb25uZWN0aW9uLmVtaXQoJ3JvbGxiYWNrVHJhbnNhY3Rpb24nKTtcbiAgfVxuXG4gIG9uQ29sTWV0YWRhdGEodG9rZW46IENvbE1ldGFkYXRhVG9rZW4pIHtcbiAgICBpZiAoIXRoaXMucmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5jb25maWcub3B0aW9ucy51c2VDb2x1bW5OYW1lcykge1xuICAgICAgICBjb25zdCBjb2x1bW5zOiB7IFtrZXk6IHN0cmluZ106IENvbHVtbk1ldGFkYXRhIH0gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgICAgIGZvciAobGV0IGogPSAwLCBsZW4gPSB0b2tlbi5jb2x1bW5zLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICAgICAgY29uc3QgY29sID0gdG9rZW4uY29sdW1uc1tqXTtcbiAgICAgICAgICBpZiAoY29sdW1uc1tjb2wuY29sTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgY29sdW1uc1tjb2wuY29sTmFtZV0gPSBjb2w7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0LmVtaXQoJ2NvbHVtbk1ldGFkYXRhJywgY29sdW1ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlcXVlc3QuZW1pdCgnY29sdW1uTWV0YWRhdGEnLCB0b2tlbi5jb2x1bW5zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbk9yZGVyKHRva2VuOiBPcmRlclRva2VuKSB7XG4gICAgaWYgKCF0aGlzLnJlcXVlc3QuY2FuY2VsZWQpIHtcbiAgICAgIHRoaXMucmVxdWVzdC5lbWl0KCdvcmRlcicsIHRva2VuLm9yZGVyQ29sdW1ucyk7XG4gICAgfVxuICB9XG5cbiAgb25Sb3codG9rZW46IFJvd1Rva2VuIHwgTkJDUm93VG9rZW4pIHtcbiAgICBpZiAoIXRoaXMucmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5jb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25SZXF1ZXN0Q29tcGxldGlvbikge1xuICAgICAgICB0aGlzLnJlcXVlc3Qucm93cyEucHVzaCh0b2tlbi5jb2x1bW5zKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbi5jb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25Eb25lKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdC5yc3QhLnB1c2godG9rZW4uY29sdW1ucyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVxdWVzdC5lbWl0KCdyb3cnLCB0b2tlbi5jb2x1bW5zKTtcbiAgICB9XG4gIH1cblxuICBvblJldHVyblN0YXR1cyh0b2tlbjogUmV0dXJuU3RhdHVzVG9rZW4pIHtcbiAgICBpZiAoIXRoaXMucmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgLy8gS2VlcCB2YWx1ZSBmb3IgcGFzc2luZyBpbiAnZG9uZVByb2MnIGV2ZW50LlxuICAgICAgdGhpcy5jb25uZWN0aW9uLnByb2NSZXR1cm5TdGF0dXNWYWx1ZSA9IHRva2VuLnZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIG9uUmV0dXJuVmFsdWUodG9rZW46IFJldHVyblZhbHVlVG9rZW4pIHtcbiAgICBpZiAoIXRoaXMucmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgdGhpcy5yZXF1ZXN0LmVtaXQoJ3JldHVyblZhbHVlJywgdG9rZW4ucGFyYW1OYW1lLCB0b2tlbi52YWx1ZSwgdG9rZW4ubWV0YWRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIG9uRG9uZVByb2ModG9rZW46IERvbmVQcm9jVG9rZW4pIHtcbiAgICBpZiAoIXRoaXMucmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgaWYgKHRva2VuLnNxbEVycm9yICYmICF0aGlzLnJlcXVlc3QuZXJyb3IpIHtcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIERPTkVfRVJST1IgZmxhZ3Mgd2FzIHNldCwgYnV0IGFuIEVSUk9SIHRva2VuIHdhcyBub3Qgc2VudC5cbiAgICAgICAgdGhpcy5yZXF1ZXN0LmVycm9yID0gbmV3IFJlcXVlc3RFcnJvcignQW4gdW5rbm93biBlcnJvciBoYXMgb2NjdXJyZWQuJywgJ1VOS05PV04nKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXF1ZXN0LmVtaXQoJ2RvbmVQcm9jJywgdG9rZW4ucm93Q291bnQsIHRva2VuLm1vcmUsIHRoaXMuY29ubmVjdGlvbi5wcm9jUmV0dXJuU3RhdHVzVmFsdWUsIHRoaXMucmVxdWVzdC5yc3QpO1xuXG4gICAgICB0aGlzLmNvbm5lY3Rpb24ucHJvY1JldHVyblN0YXR1c1ZhbHVlID0gdW5kZWZpbmVkO1xuXG4gICAgICBpZiAodG9rZW4ucm93Q291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnJlcXVlc3Qucm93Q291bnQhICs9IHRva2VuLnJvd0NvdW50O1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PbkRvbmUpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0LnJzdCA9IFtdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uRG9uZUluUHJvYyh0b2tlbjogRG9uZUluUHJvY1Rva2VuKSB7XG4gICAgaWYgKCF0aGlzLnJlcXVlc3QuY2FuY2VsZWQpIHtcbiAgICAgIHRoaXMucmVxdWVzdC5lbWl0KCdkb25lSW5Qcm9jJywgdG9rZW4ucm93Q291bnQsIHRva2VuLm1vcmUsIHRoaXMucmVxdWVzdC5yc3QpO1xuXG4gICAgICBpZiAodG9rZW4ucm93Q291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnJlcXVlc3Qucm93Q291bnQhICs9IHRva2VuLnJvd0NvdW50O1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PbkRvbmUpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0LnJzdCA9IFtdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uRG9uZSh0b2tlbjogRG9uZVRva2VuKSB7XG4gICAgaWYgKCF0aGlzLnJlcXVlc3QuY2FuY2VsZWQpIHtcbiAgICAgIGlmICh0b2tlbi5zcWxFcnJvciAmJiAhdGhpcy5yZXF1ZXN0LmVycm9yKSB7XG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBET05FX0VSUk9SIGZsYWdzIHdhcyBzZXQsIGJ1dCBhbiBFUlJPUiB0b2tlbiB3YXMgbm90IHNlbnQuXG4gICAgICAgIHRoaXMucmVxdWVzdC5lcnJvciA9IG5ldyBSZXF1ZXN0RXJyb3IoJ0FuIHVua25vd24gZXJyb3IgaGFzIG9jY3VycmVkLicsICdVTktOT1dOJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVxdWVzdC5lbWl0KCdkb25lJywgdG9rZW4ucm93Q291bnQsIHRva2VuLm1vcmUsIHRoaXMucmVxdWVzdC5yc3QpO1xuXG4gICAgICBpZiAodG9rZW4ucm93Q291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnJlcXVlc3Qucm93Q291bnQhICs9IHRva2VuLnJvd0NvdW50O1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PbkRvbmUpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0LnJzdCA9IFtdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uUmVzZXRDb25uZWN0aW9uKHRva2VuOiBSZXNldENvbm5lY3Rpb25FbnZDaGFuZ2VUb2tlbikge1xuICAgIHRoaXMuY29ubmVjdGlvbi5lbWl0KCdyZXNldENvbm5lY3Rpb24nKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgaGFuZGxlciBmb3IgdGhlIGF0dGVudGlvbiBhY2tub3dsZWRnZW1lbnQgbWVzc2FnZS5cbiAqXG4gKiBUaGlzIG1lc3NhZ2Ugb25seSBjb250YWlucyBhIGBET05FYCB0b2tlbiB0aGF0IGFja25vd2xlZGdlc1xuICogdGhhdCB0aGUgYXR0ZW50aW9uIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkIGJ5IHRoZSBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBBdHRlbnRpb25Ub2tlbkhhbmRsZXIgZXh0ZW5kcyBUb2tlbkhhbmRsZXIge1xuICBjb25uZWN0aW9uOiBDb25uZWN0aW9uO1xuICByZXF1ZXN0OiBSZXF1ZXN0IHwgQnVsa0xvYWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBhbiBhdHRlbnRpb24gYWNrbm93bGVkZ2VtZW50IHdhcyByZWNlaXZlZC5cbiAgICovXG4gIGF0dGVudGlvblJlY2VpdmVkOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKGNvbm5lY3Rpb246IENvbm5lY3Rpb24sIHJlcXVlc3Q6IFJlcXVlc3QgfCBCdWxrTG9hZCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG5cbiAgICB0aGlzLmF0dGVudGlvblJlY2VpdmVkID0gZmFsc2U7XG4gIH1cblxuICBvbkRvbmUodG9rZW46IERvbmVUb2tlbikge1xuICAgIGlmICh0b2tlbi5hdHRlbnRpb24pIHtcbiAgICAgIHRoaXMuYXR0ZW50aW9uUmVjZWl2ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQ0E7O0FBQ0E7O0FBaUNBOzs7O0FBRU8sTUFBTUEsb0JBQU4sU0FBbUNDLEtBQW5DLENBQXlDO0VBQzlDQyxXQUFXLENBQUNDLE9BQUQsRUFBd0JDLEtBQXhCLEVBQXNDO0lBQy9DLE1BQU0sdUJBQXVCQSxLQUFLLENBQUNDLElBQTdCLEdBQW9DLFFBQXBDLEdBQStDRixPQUFPLENBQUNELFdBQVIsQ0FBb0JHLElBQW5FLEdBQTBFLEdBQWhGO0VBQ0Q7O0FBSDZDOzs7O0FBTXpDLE1BQU1DLFlBQU4sQ0FBbUI7RUFDeEJDLGFBQWEsQ0FBQ0gsS0FBRCxFQUEwQjtJQUNyQyxNQUFNLElBQUlKLG9CQUFKLENBQXlCLElBQXpCLEVBQStCSSxLQUEvQixDQUFOO0VBQ0Q7O0VBRURJLGNBQWMsQ0FBQ0osS0FBRCxFQUEyQjtJQUN2QyxNQUFNLElBQUlKLG9CQUFKLENBQXlCLElBQXpCLEVBQStCSSxLQUEvQixDQUFOO0VBQ0Q7O0VBRURLLE1BQU0sQ0FBQ0wsS0FBRCxFQUFtQjtJQUN2QixNQUFNLElBQUlKLG9CQUFKLENBQXlCLElBQXpCLEVBQStCSSxLQUEvQixDQUFOO0VBQ0Q7O0VBRURNLGdCQUFnQixDQUFDTixLQUFELEVBQWdDO0lBQzlDLE1BQU0sSUFBSUosb0JBQUosQ0FBeUIsSUFBekIsRUFBK0JJLEtBQS9CLENBQU47RUFDRDs7RUFFRE8sZ0JBQWdCLENBQUNQLEtBQUQsRUFBZ0M7SUFDOUMsTUFBTSxJQUFJSixvQkFBSixDQUF5QixJQUF6QixFQUErQkksS0FBL0IsQ0FBTjtFQUNEOztFQUVEUSxlQUFlLENBQUNSLEtBQUQsRUFBK0I7SUFDNUMsTUFBTSxJQUFJSixvQkFBSixDQUF5QixJQUF6QixFQUErQkksS0FBL0IsQ0FBTjtFQUNEOztFQUVEUyxvQkFBb0IsQ0FBQ1QsS0FBRCxFQUE4QjtJQUNoRCxNQUFNLElBQUlKLG9CQUFKLENBQXlCLElBQXpCLEVBQStCSSxLQUEvQixDQUFOO0VBQ0Q7O0VBRURVLGVBQWUsQ0FBQ1YsS0FBRCxFQUErQjtJQUM1QyxNQUFNLElBQUlKLG9CQUFKLENBQXlCLElBQXpCLEVBQStCSSxLQUEvQixDQUFOO0VBQ0Q7O0VBRURXLGtCQUFrQixDQUFDWCxLQUFELEVBQWtDO0lBQ2xELE1BQU0sSUFBSUosb0JBQUosQ0FBeUIsSUFBekIsRUFBK0JJLEtBQS9CLENBQU47RUFDRDs7RUFFRFksaUJBQWlCLENBQUNaLEtBQUQsRUFBdUM7SUFDdEQsTUFBTSxJQUFJSixvQkFBSixDQUF5QixJQUF6QixFQUErQkksS0FBL0IsQ0FBTjtFQUNEOztFQUVEYSxrQkFBa0IsQ0FBQ2IsS0FBRCxFQUF3QztJQUN4RCxNQUFNLElBQUlKLG9CQUFKLENBQXlCLElBQXpCLEVBQStCSSxLQUEvQixDQUFOO0VBQ0Q7O0VBRURjLG1CQUFtQixDQUFDZCxLQUFELEVBQXlDO0lBQzFELE1BQU0sSUFBSUosb0JBQUosQ0FBeUIsSUFBekIsRUFBK0JJLEtBQS9CLENBQU47RUFDRDs7RUFFRGUscUJBQXFCLENBQUNmLEtBQUQsRUFBMkM7SUFDOUQsTUFBTSxJQUFJSixvQkFBSixDQUF5QixJQUF6QixFQUErQkksS0FBL0IsQ0FBTjtFQUNEOztFQUVEZ0IsYUFBYSxDQUFDaEIsS0FBRCxFQUEwQjtJQUNyQyxNQUFNLElBQUlKLG9CQUFKLENBQXlCLElBQXpCLEVBQStCSSxLQUEvQixDQUFOO0VBQ0Q7O0VBRURpQixlQUFlLENBQUNqQixLQUFELEVBQTRCO0lBQ3pDLE1BQU0sSUFBSUosb0JBQUosQ0FBeUIsSUFBekIsRUFBK0JJLEtBQS9CLENBQU47RUFDRDs7RUFFRGtCLFVBQVUsQ0FBQ2xCLEtBQUQsRUFBdUI7SUFDL0IsTUFBTSxJQUFJSixvQkFBSixDQUF5QixJQUF6QixFQUErQkksS0FBL0IsQ0FBTjtFQUNEOztFQUVEbUIsYUFBYSxDQUFDbkIsS0FBRCxFQUEwQjtJQUNyQyxNQUFNLElBQUlKLG9CQUFKLENBQXlCLElBQXpCLEVBQStCSSxLQUEvQixDQUFOO0VBQ0Q7O0VBRURvQixPQUFPLENBQUNwQixLQUFELEVBQW9CO0lBQ3pCLE1BQU0sSUFBSUosb0JBQUosQ0FBeUIsSUFBekIsRUFBK0JJLEtBQS9CLENBQU47RUFDRDs7RUFFRHFCLEtBQUssQ0FBQ3JCLEtBQUQsRUFBZ0M7SUFDbkMsTUFBTSxJQUFJSixvQkFBSixDQUF5QixJQUF6QixFQUErQkksS0FBL0IsQ0FBTjtFQUNEOztFQUVEc0IsY0FBYyxDQUFDdEIsS0FBRCxFQUEyQjtJQUN2QyxNQUFNLElBQUlKLG9CQUFKLENBQXlCLElBQXpCLEVBQStCSSxLQUEvQixDQUFOO0VBQ0Q7O0VBRUR1QixhQUFhLENBQUN2QixLQUFELEVBQTBCO0lBQ3JDLE1BQU0sSUFBSUosb0JBQUosQ0FBeUIsSUFBekIsRUFBK0JJLEtBQS9CLENBQU47RUFDRDs7RUFFRHdCLFVBQVUsQ0FBQ3hCLEtBQUQsRUFBdUI7SUFDL0IsTUFBTSxJQUFJSixvQkFBSixDQUF5QixJQUF6QixFQUErQkksS0FBL0IsQ0FBTjtFQUNEOztFQUVEeUIsWUFBWSxDQUFDekIsS0FBRCxFQUF5QjtJQUNuQyxNQUFNLElBQUlKLG9CQUFKLENBQXlCLElBQXpCLEVBQStCSSxLQUEvQixDQUFOO0VBQ0Q7O0VBRUQwQixNQUFNLENBQUMxQixLQUFELEVBQW1CO0lBQ3ZCLE1BQU0sSUFBSUosb0JBQUosQ0FBeUIsSUFBekIsRUFBK0JJLEtBQS9CLENBQU47RUFDRDs7RUFFRDJCLDBCQUEwQixDQUFDM0IsS0FBRCxFQUFnRDtJQUN4RSxNQUFNLElBQUlKLG9CQUFKLENBQXlCLElBQXpCLEVBQStCSSxLQUEvQixDQUFOO0VBQ0Q7O0FBbkd1QjtBQXNHMUI7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBQ08sTUFBTTRCLHNCQUFOLFNBQXFDMUIsWUFBckMsQ0FBa0Q7RUFHdkRKLFdBQVcsQ0FBQytCLFVBQUQsRUFBeUI7SUFDbEM7SUFEa0MsS0FGcENBLFVBRW9DO0lBR2xDLEtBQUtBLFVBQUwsR0FBa0JBLFVBQWxCO0VBQ0Q7O0VBRUQxQixhQUFhLENBQUNILEtBQUQsRUFBMEI7SUFDckMsS0FBSzZCLFVBQUwsQ0FBZ0JDLElBQWhCLENBQXFCLGFBQXJCLEVBQW9DOUIsS0FBcEM7RUFDRDs7RUFFREksY0FBYyxDQUFDSixLQUFELEVBQTJCO0lBQ3ZDLEtBQUs2QixVQUFMLENBQWdCQyxJQUFoQixDQUFxQixjQUFyQixFQUFxQzlCLEtBQXJDO0VBQ0Q7O0VBRURNLGdCQUFnQixDQUFDTixLQUFELEVBQWdDO0lBQzlDLEtBQUs2QixVQUFMLENBQWdCQyxJQUFoQixDQUFxQixnQkFBckIsRUFBdUM5QixLQUFLLENBQUMrQixRQUE3QztFQUNEOztFQUVEeEIsZ0JBQWdCLENBQUNQLEtBQUQsRUFBZ0M7SUFDOUMsS0FBSzZCLFVBQUwsQ0FBZ0JDLElBQWhCLENBQXFCLGdCQUFyQixFQUF1QzlCLEtBQUssQ0FBQytCLFFBQTdDO0VBQ0Q7O0VBRUR2QixlQUFlLENBQUNSLEtBQUQsRUFBK0I7SUFDNUMsS0FBSzZCLFVBQUwsQ0FBZ0JDLElBQWhCLENBQXFCLGVBQXJCLEVBQXNDOUIsS0FBSyxDQUFDK0IsUUFBNUM7RUFDRDs7RUFFRHRCLG9CQUFvQixDQUFDVCxLQUFELEVBQThCO0lBQ2hELEtBQUs2QixVQUFMLENBQWdCRyxpQkFBaEIsR0FBb0NoQyxLQUFLLENBQUMrQixRQUExQztFQUNEOztFQUVEcEIsa0JBQWtCLENBQUNYLEtBQUQsRUFBa0M7SUFDbEQsS0FBSzZCLFVBQUwsQ0FBZ0JJLFNBQWhCLENBQTBCQyxVQUExQixDQUFxQ2xDLEtBQUssQ0FBQytCLFFBQTNDO0VBQ0Q7O0VBRURsQixrQkFBa0IsQ0FBQ2IsS0FBRCxFQUF3QztJQUN4RCxLQUFLNkIsVUFBTCxDQUFnQk0sc0JBQWhCLENBQXVDQyxJQUF2QyxDQUE0Q3BDLEtBQUssQ0FBQytCLFFBQWxEO0lBQ0EsS0FBS0YsVUFBTCxDQUFnQlEsYUFBaEIsR0FBZ0MsSUFBaEM7RUFDRDs7RUFFRHZCLG1CQUFtQixDQUFDZCxLQUFELEVBQXlDO0lBQzFELEtBQUs2QixVQUFMLENBQWdCTSxzQkFBaEIsQ0FBdUNHLE1BQXZDLEdBQWdELENBQWhEO0lBQ0EsS0FBS1QsVUFBTCxDQUFnQlEsYUFBaEIsR0FBZ0MsS0FBaEM7RUFDRDs7RUFFRHRCLHFCQUFxQixDQUFDZixLQUFELEVBQTJDO0lBQzlELEtBQUs2QixVQUFMLENBQWdCTSxzQkFBaEIsQ0FBdUNHLE1BQXZDLEdBQWdELENBQWhELENBRDhELENBRTlEOztJQUNBLEtBQUtULFVBQUwsQ0FBZ0JRLGFBQWhCLEdBQWdDLEtBQWhDO0lBQ0EsS0FBS1IsVUFBTCxDQUFnQkMsSUFBaEIsQ0FBcUIscUJBQXJCO0VBQ0Q7O0VBRURYLGFBQWEsQ0FBQ25CLEtBQUQsRUFBMEI7SUFDckMsS0FBSzZCLFVBQUwsQ0FBZ0JDLElBQWhCLENBQXFCLE9BQXJCLEVBQThCLElBQUlqQyxLQUFKLENBQVUsNkRBQVYsQ0FBOUI7SUFDQSxLQUFLZ0MsVUFBTCxDQUFnQlUsS0FBaEI7RUFDRDs7RUFFRG5CLE9BQU8sQ0FBQ3BCLEtBQUQsRUFBb0I7SUFDekIsS0FBSzZCLFVBQUwsQ0FBZ0JDLElBQWhCLENBQXFCLE9BQXJCLEVBQThCLElBQUlqQyxLQUFKLENBQVUsb0RBQVYsQ0FBOUI7SUFDQSxLQUFLZ0MsVUFBTCxDQUFnQlUsS0FBaEI7RUFDRDs7RUFFRGxCLEtBQUssQ0FBQ3JCLEtBQUQsRUFBZ0M7SUFDbkMsS0FBSzZCLFVBQUwsQ0FBZ0JDLElBQWhCLENBQXFCLE9BQXJCLEVBQThCLElBQUlqQyxLQUFKLENBQVUsa0RBQVYsQ0FBOUI7SUFDQSxLQUFLZ0MsVUFBTCxDQUFnQlUsS0FBaEI7RUFDRDs7RUFFRGpCLGNBQWMsQ0FBQ3RCLEtBQUQsRUFBMkIsQ0FDdkM7RUFDRDs7RUFFRHVCLGFBQWEsQ0FBQ3ZCLEtBQUQsRUFBMEIsQ0FDckM7RUFDRDs7RUFFRHdCLFVBQVUsQ0FBQ3hCLEtBQUQsRUFBdUIsQ0FDL0I7RUFDRDs7RUFFRHlCLFlBQVksQ0FBQ3pCLEtBQUQsRUFBeUIsQ0FDbkM7RUFDRDs7RUFFRDBCLE1BQU0sQ0FBQzFCLEtBQUQsRUFBbUIsQ0FDdkI7RUFDRDs7RUFFRFksaUJBQWlCLENBQUNaLEtBQUQsRUFBdUM7SUFDdEQsS0FBSzZCLFVBQUwsQ0FBZ0JDLElBQWhCLENBQXFCLGlCQUFyQjtFQUNEOztBQTNGc0Q7QUE4RnpEO0FBQ0E7QUFDQTs7Ozs7QUFDTyxNQUFNVSxrQkFBTixTQUFpQ3RDLFlBQWpDLENBQThDO0VBUW5ESixXQUFXLENBQUMrQixVQUFELEVBQXlCO0lBQ2xDO0lBRGtDLEtBUHBDQSxVQU9vQztJQUFBLEtBTHBDWSxnQkFLb0M7SUFBQSxLQUpwQ0MsV0FJb0M7SUFBQSxLQUZwQ0MsZ0JBRW9DLEdBRmpCLEtBRWlCO0lBR2xDLEtBQUtkLFVBQUwsR0FBa0JBLFVBQWxCO0VBQ0Q7O0VBRUQxQixhQUFhLENBQUNILEtBQUQsRUFBMEI7SUFDckMsS0FBSzZCLFVBQUwsQ0FBZ0JDLElBQWhCLENBQXFCLGFBQXJCLEVBQW9DOUIsS0FBcEM7RUFDRDs7RUFFREksY0FBYyxDQUFDSixLQUFELEVBQTJCO0lBQ3ZDLEtBQUs2QixVQUFMLENBQWdCQyxJQUFoQixDQUFxQixjQUFyQixFQUFxQzlCLEtBQXJDO0lBRUEsTUFBTTRDLEtBQUssR0FBRyxJQUFJQyx1QkFBSixDQUFvQjdDLEtBQUssQ0FBQzhDLE9BQTFCLEVBQW1DLFFBQW5DLENBQWQ7SUFFQSxNQUFNQyxxQkFBcUIsR0FBRyxLQUFLbEIsVUFBTCxDQUFnQm1CLG9CQUFoQixDQUFxQ0MsZ0JBQXJDLENBQXNEakQsS0FBSyxDQUFDa0QsTUFBNUQsQ0FBOUI7O0lBQ0EsSUFBSUgscUJBQXFCLElBQUksS0FBS2xCLFVBQUwsQ0FBZ0JzQixzQkFBaEIsS0FBMkMsS0FBS3RCLFVBQUwsQ0FBZ0J1QixNQUFoQixDQUF1QkMsT0FBdkIsQ0FBK0JDLDJCQUF2RyxFQUFvSTtNQUNsSVYsS0FBSyxDQUFDVyxXQUFOLEdBQW9CLElBQXBCO0lBQ0Q7O0lBRUQsS0FBSzFCLFVBQUwsQ0FBZ0IyQixVQUFoQixHQUE2QlosS0FBN0I7RUFDRDs7RUFFRHZDLE1BQU0sQ0FBQ0wsS0FBRCxFQUFtQjtJQUN2QixJQUFJQSxLQUFLLENBQUN5RCxVQUFWLEVBQXNCO01BQ3BCLEtBQUs1QixVQUFMLENBQWdCNEIsVUFBaEIsR0FBNkJ6RCxLQUFLLENBQUN5RCxVQUFuQztNQUNBLEtBQUs1QixVQUFMLENBQWdCNkIsZ0JBQWhCLEdBQW1DMUQsS0FBSyxDQUFDMEQsZ0JBQXpDO0lBQ0Q7RUFDRjs7RUFFRHBELGdCQUFnQixDQUFDTixLQUFELEVBQWdDO0lBQzlDLEtBQUs2QixVQUFMLENBQWdCQyxJQUFoQixDQUFxQixnQkFBckIsRUFBdUM5QixLQUFLLENBQUMrQixRQUE3QztFQUNEOztFQUVEeEIsZ0JBQWdCLENBQUNQLEtBQUQsRUFBZ0M7SUFDOUMsS0FBSzZCLFVBQUwsQ0FBZ0JDLElBQWhCLENBQXFCLGdCQUFyQixFQUF1QzlCLEtBQUssQ0FBQytCLFFBQTdDO0VBQ0Q7O0VBRUR2QixlQUFlLENBQUNSLEtBQUQsRUFBK0I7SUFDNUMsS0FBSzZCLFVBQUwsQ0FBZ0JDLElBQWhCLENBQXFCLGVBQXJCLEVBQXNDOUIsS0FBSyxDQUFDK0IsUUFBNUM7RUFDRDs7RUFFRHRCLG9CQUFvQixDQUFDVCxLQUFELEVBQThCO0lBQ2hELEtBQUs2QixVQUFMLENBQWdCRyxpQkFBaEIsR0FBb0NoQyxLQUFLLENBQUMrQixRQUExQztFQUNEOztFQUVEZixhQUFhLENBQUNoQixLQUFELEVBQTBCO0lBQ3JDLEtBQUt5QyxnQkFBTCxHQUF3QnpDLEtBQXhCO0VBQ0Q7O0VBRURpQixlQUFlLENBQUNqQixLQUFELEVBQTRCO0lBQ3pDLE1BQU07TUFBRTJEO0lBQUYsSUFBcUIsS0FBSzlCLFVBQUwsQ0FBZ0J1QixNQUEzQzs7SUFFQSxJQUFJTyxjQUFjLENBQUNDLElBQWYsS0FBd0IsaUNBQXhCLElBQTZERCxjQUFjLENBQUNDLElBQWYsS0FBd0IscUNBQXJGLElBQThIRCxjQUFjLENBQUNDLElBQWYsS0FBd0IsK0JBQXRKLElBQXlMRCxjQUFjLENBQUNDLElBQWYsS0FBd0Isd0NBQWpOLElBQTZQRCxjQUFjLENBQUNDLElBQWYsS0FBd0IsaURBQXJSLElBQTBVRCxjQUFjLENBQUNDLElBQWYsS0FBd0IsZ0NBQXRXLEVBQXdZO01BQ3RZLElBQUk1RCxLQUFLLENBQUM2RCxPQUFOLEtBQWtCQyxTQUF0QixFQUFpQztRQUMvQixLQUFLakMsVUFBTCxDQUFnQjJCLFVBQWhCLEdBQTZCLElBQUlYLHVCQUFKLENBQW9CLGlFQUFwQixDQUE3QjtNQUNELENBRkQsTUFFTyxJQUFJN0MsS0FBSyxDQUFDNkQsT0FBTixDQUFjdkIsTUFBZCxLQUF5QixDQUE3QixFQUFnQztRQUNyQyxLQUFLVCxVQUFMLENBQWdCMkIsVUFBaEIsR0FBNkIsSUFBSVgsdUJBQUosQ0FBcUIsc0RBQXFEYyxjQUFjLENBQUNDLElBQUssNENBQTlGLENBQTdCO01BQ0Q7SUFDRixDQU5ELE1BTU8sSUFBSTVELEtBQUssQ0FBQzZELE9BQU4sS0FBa0JDLFNBQWxCLElBQStCOUQsS0FBSyxDQUFDK0QsV0FBTixLQUFzQkQsU0FBekQsRUFBb0U7TUFDekUsS0FBS2pDLFVBQUwsQ0FBZ0IyQixVQUFoQixHQUE2QixJQUFJWCx1QkFBSixDQUFvQiw4Q0FBcEIsQ0FBN0I7SUFDRCxDQUZNLE1BRUEsSUFBSTdDLEtBQUssQ0FBQzZELE9BQVYsRUFBbUI7TUFDeEIsS0FBS2hDLFVBQUwsQ0FBZ0IyQixVQUFoQixHQUE2QixJQUFJWCx1QkFBSixDQUFvQixrRkFBcEIsQ0FBN0I7SUFDRDtFQUNGOztFQUVEM0IsVUFBVSxDQUFDbEIsS0FBRCxFQUF1QjtJQUMvQixJQUFJLENBQUNBLEtBQUssQ0FBQ2dFLFVBQVgsRUFBdUI7TUFDckI7TUFDQSxLQUFLbkMsVUFBTCxDQUFnQjJCLFVBQWhCLEdBQTZCLElBQUlYLHVCQUFKLENBQW9CLDRDQUFwQixFQUFrRSxNQUFsRSxDQUE3QjtNQUNBO0lBQ0Q7O0lBRUQsSUFBSSxDQUFDN0MsS0FBSyxDQUFDaUUsU0FBWCxFQUFzQjtNQUNwQjtNQUNBLEtBQUtwQyxVQUFMLENBQWdCMkIsVUFBaEIsR0FBNkIsSUFBSVgsdUJBQUosQ0FBb0IsOENBQXBCLEVBQW9FLG1CQUFwRSxDQUE3QjtNQUNBO0lBQ0QsQ0FYOEIsQ0FhL0I7OztJQUNBLEtBQUtoQixVQUFMLENBQWdCdUIsTUFBaEIsQ0FBdUJDLE9BQXZCLENBQStCVyxVQUEvQixHQUE0Q2hFLEtBQUssQ0FBQ2dFLFVBQWxEO0lBRUEsS0FBS3JCLGdCQUFMLEdBQXdCLElBQXhCO0VBQ0Q7O0VBRURqQyxlQUFlLENBQUNWLEtBQUQsRUFBK0I7SUFDNUM7SUFDQSxNQUFNLENBQUVrRSxNQUFGLElBQWFsRSxLQUFLLENBQUMrQixRQUFOLENBQWVtQyxNQUFmLENBQXNCQyxLQUF0QixDQUE0QixJQUE1QixDQUFuQjtJQUVBLEtBQUt6QixXQUFMLEdBQW1CO01BQ2pCd0IsTUFEaUI7TUFDVEUsSUFBSSxFQUFFcEUsS0FBSyxDQUFDK0IsUUFBTixDQUFlcUM7SUFEWixDQUFuQjtFQUdEOztFQUVEM0MsWUFBWSxDQUFDekIsS0FBRCxFQUF5QixDQUNuQztFQUNEOztFQUVEMEIsTUFBTSxDQUFDMUIsS0FBRCxFQUFtQixDQUN2QjtFQUNEOztFQUVEVyxrQkFBa0IsQ0FBQ1gsS0FBRCxFQUFrQztJQUNsRCxLQUFLNkIsVUFBTCxDQUFnQkksU0FBaEIsQ0FBMEJDLFVBQTFCLENBQXFDbEMsS0FBSyxDQUFDK0IsUUFBM0M7RUFDRDs7RUFFREosMEJBQTBCLENBQUMzQixLQUFELEVBQWdELENBQ3hFO0VBQ0Q7O0FBcEhrRDtBQXVIckQ7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBQ08sTUFBTXFFLG1CQUFOLFNBQWtDbkUsWUFBbEMsQ0FBK0M7RUFLcERKLFdBQVcsQ0FBQytCLFVBQUQsRUFBeUJ5QyxPQUF6QixFQUFzRDtJQUMvRDtJQUQrRCxLQUpqRXpDLFVBSWlFO0lBQUEsS0FIakV5QyxPQUdpRTtJQUFBLEtBRmpFQyxNQUVpRTtJQUcvRCxLQUFLMUMsVUFBTCxHQUFrQkEsVUFBbEI7SUFDQSxLQUFLeUMsT0FBTCxHQUFlQSxPQUFmO0lBQ0EsS0FBS0MsTUFBTCxHQUFjLEVBQWQ7RUFDRDs7RUFFRHBFLGFBQWEsQ0FBQ0gsS0FBRCxFQUEwQjtJQUNyQyxLQUFLNkIsVUFBTCxDQUFnQkMsSUFBaEIsQ0FBcUIsYUFBckIsRUFBb0M5QixLQUFwQztFQUNEOztFQUVESSxjQUFjLENBQUNKLEtBQUQsRUFBMkI7SUFDdkMsS0FBSzZCLFVBQUwsQ0FBZ0JDLElBQWhCLENBQXFCLGNBQXJCLEVBQXFDOUIsS0FBckM7O0lBRUEsSUFBSSxDQUFDLEtBQUtzRSxPQUFMLENBQWFFLFFBQWxCLEVBQTRCO01BQzFCLE1BQU01QixLQUFLLEdBQUcsSUFBSTZCLG9CQUFKLENBQWlCekUsS0FBSyxDQUFDOEMsT0FBdkIsRUFBZ0MsVUFBaEMsQ0FBZDtNQUVBRixLQUFLLENBQUNNLE1BQU4sR0FBZWxELEtBQUssQ0FBQ2tELE1BQXJCO01BQ0FOLEtBQUssQ0FBQzhCLEtBQU4sR0FBYzFFLEtBQUssQ0FBQzBFLEtBQXBCO01BQ0E5QixLQUFLLENBQUMrQixLQUFOLEdBQWMzRSxLQUFLLENBQUMyRSxLQUFwQjtNQUNBL0IsS0FBSyxDQUFDZ0MsVUFBTixHQUFtQjVFLEtBQUssQ0FBQzRFLFVBQXpCO01BQ0FoQyxLQUFLLENBQUNpQyxRQUFOLEdBQWlCN0UsS0FBSyxDQUFDNkUsUUFBdkI7TUFDQWpDLEtBQUssQ0FBQ2tDLFVBQU4sR0FBbUI5RSxLQUFLLENBQUM4RSxVQUF6QjtNQUNBLEtBQUtQLE1BQUwsQ0FBWW5DLElBQVosQ0FBaUJRLEtBQWpCO01BQ0EsS0FBSzBCLE9BQUwsQ0FBYTFCLEtBQWIsR0FBcUJBLEtBQXJCOztNQUNBLElBQUksS0FBSzBCLE9BQUwsWUFBd0JTLGdCQUF4QixJQUFtQyxLQUFLUixNQUFMLENBQVlqQyxNQUFaLEdBQXFCLENBQTVELEVBQStEO1FBQzdELEtBQUtnQyxPQUFMLENBQWExQixLQUFiLEdBQXFCLElBQUlvQyx5QkFBSixDQUFtQixLQUFLVCxNQUF4QixDQUFyQjtNQUNEO0lBQ0Y7RUFDRjs7RUFFRGpFLGdCQUFnQixDQUFDTixLQUFELEVBQWdDO0lBQzlDLEtBQUs2QixVQUFMLENBQWdCQyxJQUFoQixDQUFxQixnQkFBckIsRUFBdUM5QixLQUFLLENBQUMrQixRQUE3QztFQUNEOztFQUVEeEIsZ0JBQWdCLENBQUNQLEtBQUQsRUFBZ0M7SUFDOUMsS0FBSzZCLFVBQUwsQ0FBZ0JDLElBQWhCLENBQXFCLGdCQUFyQixFQUF1QzlCLEtBQUssQ0FBQytCLFFBQTdDO0VBQ0Q7O0VBRUR2QixlQUFlLENBQUNSLEtBQUQsRUFBK0I7SUFDNUMsS0FBSzZCLFVBQUwsQ0FBZ0JDLElBQWhCLENBQXFCLGVBQXJCLEVBQXNDOUIsS0FBSyxDQUFDK0IsUUFBNUM7RUFDRDs7RUFFRHRCLG9CQUFvQixDQUFDVCxLQUFELEVBQThCO0lBQ2hELEtBQUs2QixVQUFMLENBQWdCRyxpQkFBaEIsR0FBb0NoQyxLQUFLLENBQUMrQixRQUExQztFQUNEOztFQUVEcEIsa0JBQWtCLENBQUNYLEtBQUQsRUFBa0M7SUFDbEQsS0FBSzZCLFVBQUwsQ0FBZ0JJLFNBQWhCLENBQTBCQyxVQUExQixDQUFxQ2xDLEtBQUssQ0FBQytCLFFBQTNDO0VBQ0Q7O0VBRURsQixrQkFBa0IsQ0FBQ2IsS0FBRCxFQUF3QztJQUN4RCxLQUFLNkIsVUFBTCxDQUFnQk0sc0JBQWhCLENBQXVDQyxJQUF2QyxDQUE0Q3BDLEtBQUssQ0FBQytCLFFBQWxEO0lBQ0EsS0FBS0YsVUFBTCxDQUFnQlEsYUFBaEIsR0FBZ0MsSUFBaEM7RUFDRDs7RUFFRHZCLG1CQUFtQixDQUFDZCxLQUFELEVBQXlDO0lBQzFELEtBQUs2QixVQUFMLENBQWdCTSxzQkFBaEIsQ0FBdUNHLE1BQXZDLEdBQWdELENBQWhEO0lBQ0EsS0FBS1QsVUFBTCxDQUFnQlEsYUFBaEIsR0FBZ0MsS0FBaEM7RUFDRDs7RUFFRHRCLHFCQUFxQixDQUFDZixLQUFELEVBQTJDO0lBQzlELEtBQUs2QixVQUFMLENBQWdCTSxzQkFBaEIsQ0FBdUNHLE1BQXZDLEdBQWdELENBQWhELENBRDhELENBRTlEOztJQUNBLEtBQUtULFVBQUwsQ0FBZ0JRLGFBQWhCLEdBQWdDLEtBQWhDO0lBQ0EsS0FBS1IsVUFBTCxDQUFnQkMsSUFBaEIsQ0FBcUIscUJBQXJCO0VBQ0Q7O0VBRURYLGFBQWEsQ0FBQ25CLEtBQUQsRUFBMEI7SUFDckMsSUFBSSxDQUFDLEtBQUtzRSxPQUFMLENBQWFFLFFBQWxCLEVBQTRCO01BQzFCLElBQUksS0FBSzNDLFVBQUwsQ0FBZ0J1QixNQUFoQixDQUF1QkMsT0FBdkIsQ0FBK0I0QixjQUFuQyxFQUFtRDtRQUNqRCxNQUFNQyxPQUEwQyxHQUFHQyxNQUFNLENBQUNDLE1BQVAsQ0FBYyxJQUFkLENBQW5EOztRQUVBLEtBQUssSUFBSUMsQ0FBQyxHQUFHLENBQVIsRUFBV0MsR0FBRyxHQUFHdEYsS0FBSyxDQUFDa0YsT0FBTixDQUFjNUMsTUFBcEMsRUFBNEMrQyxDQUFDLEdBQUdDLEdBQWhELEVBQXFERCxDQUFDLEVBQXRELEVBQTBEO1VBQ3hELE1BQU1FLEdBQUcsR0FBR3ZGLEtBQUssQ0FBQ2tGLE9BQU4sQ0FBY0csQ0FBZCxDQUFaOztVQUNBLElBQUlILE9BQU8sQ0FBQ0ssR0FBRyxDQUFDQyxPQUFMLENBQVAsSUFBd0IsSUFBNUIsRUFBa0M7WUFDaENOLE9BQU8sQ0FBQ0ssR0FBRyxDQUFDQyxPQUFMLENBQVAsR0FBdUJELEdBQXZCO1VBQ0Q7UUFDRjs7UUFFRCxLQUFLakIsT0FBTCxDQUFheEMsSUFBYixDQUFrQixnQkFBbEIsRUFBb0NvRCxPQUFwQztNQUNELENBWEQsTUFXTztRQUNMLEtBQUtaLE9BQUwsQ0FBYXhDLElBQWIsQ0FBa0IsZ0JBQWxCLEVBQW9DOUIsS0FBSyxDQUFDa0YsT0FBMUM7TUFDRDtJQUNGO0VBQ0Y7O0VBRUQ5RCxPQUFPLENBQUNwQixLQUFELEVBQW9CO0lBQ3pCLElBQUksQ0FBQyxLQUFLc0UsT0FBTCxDQUFhRSxRQUFsQixFQUE0QjtNQUMxQixLQUFLRixPQUFMLENBQWF4QyxJQUFiLENBQWtCLE9BQWxCLEVBQTJCOUIsS0FBSyxDQUFDeUYsWUFBakM7SUFDRDtFQUNGOztFQUVEcEUsS0FBSyxDQUFDckIsS0FBRCxFQUFnQztJQUNuQyxJQUFJLENBQUMsS0FBS3NFLE9BQUwsQ0FBYUUsUUFBbEIsRUFBNEI7TUFDMUIsSUFBSSxLQUFLM0MsVUFBTCxDQUFnQnVCLE1BQWhCLENBQXVCQyxPQUF2QixDQUErQnFDLGdDQUFuQyxFQUFxRTtRQUNuRSxLQUFLcEIsT0FBTCxDQUFhcUIsSUFBYixDQUFtQnZELElBQW5CLENBQXdCcEMsS0FBSyxDQUFDa0YsT0FBOUI7TUFDRDs7TUFFRCxJQUFJLEtBQUtyRCxVQUFMLENBQWdCdUIsTUFBaEIsQ0FBdUJDLE9BQXZCLENBQStCdUMsbUJBQW5DLEVBQXdEO1FBQ3RELEtBQUt0QixPQUFMLENBQWF1QixHQUFiLENBQWtCekQsSUFBbEIsQ0FBdUJwQyxLQUFLLENBQUNrRixPQUE3QjtNQUNEOztNQUVELEtBQUtaLE9BQUwsQ0FBYXhDLElBQWIsQ0FBa0IsS0FBbEIsRUFBeUI5QixLQUFLLENBQUNrRixPQUEvQjtJQUNEO0VBQ0Y7O0VBRUQ1RCxjQUFjLENBQUN0QixLQUFELEVBQTJCO0lBQ3ZDLElBQUksQ0FBQyxLQUFLc0UsT0FBTCxDQUFhRSxRQUFsQixFQUE0QjtNQUMxQjtNQUNBLEtBQUszQyxVQUFMLENBQWdCaUUscUJBQWhCLEdBQXdDOUYsS0FBSyxDQUFDK0YsS0FBOUM7SUFDRDtFQUNGOztFQUVEeEUsYUFBYSxDQUFDdkIsS0FBRCxFQUEwQjtJQUNyQyxJQUFJLENBQUMsS0FBS3NFLE9BQUwsQ0FBYUUsUUFBbEIsRUFBNEI7TUFDMUIsS0FBS0YsT0FBTCxDQUFheEMsSUFBYixDQUFrQixhQUFsQixFQUFpQzlCLEtBQUssQ0FBQ2dHLFNBQXZDLEVBQWtEaEcsS0FBSyxDQUFDK0YsS0FBeEQsRUFBK0QvRixLQUFLLENBQUNpRyxRQUFyRTtJQUNEO0VBQ0Y7O0VBRUR6RSxVQUFVLENBQUN4QixLQUFELEVBQXVCO0lBQy9CLElBQUksQ0FBQyxLQUFLc0UsT0FBTCxDQUFhRSxRQUFsQixFQUE0QjtNQUMxQixJQUFJeEUsS0FBSyxDQUFDa0csUUFBTixJQUFrQixDQUFDLEtBQUs1QixPQUFMLENBQWExQixLQUFwQyxFQUEyQztRQUN6QztRQUNBLEtBQUswQixPQUFMLENBQWExQixLQUFiLEdBQXFCLElBQUk2QixvQkFBSixDQUFpQixnQ0FBakIsRUFBbUQsU0FBbkQsQ0FBckI7TUFDRDs7TUFFRCxLQUFLSCxPQUFMLENBQWF4QyxJQUFiLENBQWtCLFVBQWxCLEVBQThCOUIsS0FBSyxDQUFDbUcsUUFBcEMsRUFBOENuRyxLQUFLLENBQUNvRyxJQUFwRCxFQUEwRCxLQUFLdkUsVUFBTCxDQUFnQmlFLHFCQUExRSxFQUFpRyxLQUFLeEIsT0FBTCxDQUFhdUIsR0FBOUc7TUFFQSxLQUFLaEUsVUFBTCxDQUFnQmlFLHFCQUFoQixHQUF3Q2hDLFNBQXhDOztNQUVBLElBQUk5RCxLQUFLLENBQUNtRyxRQUFOLEtBQW1CckMsU0FBdkIsRUFBa0M7UUFDaEMsS0FBS1EsT0FBTCxDQUFhNkIsUUFBYixJQUEwQm5HLEtBQUssQ0FBQ21HLFFBQWhDO01BQ0Q7O01BRUQsSUFBSSxLQUFLdEUsVUFBTCxDQUFnQnVCLE1BQWhCLENBQXVCQyxPQUF2QixDQUErQnVDLG1CQUFuQyxFQUF3RDtRQUN0RCxLQUFLdEIsT0FBTCxDQUFhdUIsR0FBYixHQUFtQixFQUFuQjtNQUNEO0lBQ0Y7RUFDRjs7RUFFRHBFLFlBQVksQ0FBQ3pCLEtBQUQsRUFBeUI7SUFDbkMsSUFBSSxDQUFDLEtBQUtzRSxPQUFMLENBQWFFLFFBQWxCLEVBQTRCO01BQzFCLEtBQUtGLE9BQUwsQ0FBYXhDLElBQWIsQ0FBa0IsWUFBbEIsRUFBZ0M5QixLQUFLLENBQUNtRyxRQUF0QyxFQUFnRG5HLEtBQUssQ0FBQ29HLElBQXRELEVBQTRELEtBQUs5QixPQUFMLENBQWF1QixHQUF6RTs7TUFFQSxJQUFJN0YsS0FBSyxDQUFDbUcsUUFBTixLQUFtQnJDLFNBQXZCLEVBQWtDO1FBQ2hDLEtBQUtRLE9BQUwsQ0FBYTZCLFFBQWIsSUFBMEJuRyxLQUFLLENBQUNtRyxRQUFoQztNQUNEOztNQUVELElBQUksS0FBS3RFLFVBQUwsQ0FBZ0J1QixNQUFoQixDQUF1QkMsT0FBdkIsQ0FBK0J1QyxtQkFBbkMsRUFBd0Q7UUFDdEQsS0FBS3RCLE9BQUwsQ0FBYXVCLEdBQWIsR0FBbUIsRUFBbkI7TUFDRDtJQUNGO0VBQ0Y7O0VBRURuRSxNQUFNLENBQUMxQixLQUFELEVBQW1CO0lBQ3ZCLElBQUksQ0FBQyxLQUFLc0UsT0FBTCxDQUFhRSxRQUFsQixFQUE0QjtNQUMxQixJQUFJeEUsS0FBSyxDQUFDa0csUUFBTixJQUFrQixDQUFDLEtBQUs1QixPQUFMLENBQWExQixLQUFwQyxFQUEyQztRQUN6QztRQUNBLEtBQUswQixPQUFMLENBQWExQixLQUFiLEdBQXFCLElBQUk2QixvQkFBSixDQUFpQixnQ0FBakIsRUFBbUQsU0FBbkQsQ0FBckI7TUFDRDs7TUFFRCxLQUFLSCxPQUFMLENBQWF4QyxJQUFiLENBQWtCLE1BQWxCLEVBQTBCOUIsS0FBSyxDQUFDbUcsUUFBaEMsRUFBMENuRyxLQUFLLENBQUNvRyxJQUFoRCxFQUFzRCxLQUFLOUIsT0FBTCxDQUFhdUIsR0FBbkU7O01BRUEsSUFBSTdGLEtBQUssQ0FBQ21HLFFBQU4sS0FBbUJyQyxTQUF2QixFQUFrQztRQUNoQyxLQUFLUSxPQUFMLENBQWE2QixRQUFiLElBQTBCbkcsS0FBSyxDQUFDbUcsUUFBaEM7TUFDRDs7TUFFRCxJQUFJLEtBQUt0RSxVQUFMLENBQWdCdUIsTUFBaEIsQ0FBdUJDLE9BQXZCLENBQStCdUMsbUJBQW5DLEVBQXdEO1FBQ3RELEtBQUt0QixPQUFMLENBQWF1QixHQUFiLEdBQW1CLEVBQW5CO01BQ0Q7SUFDRjtFQUNGOztFQUVEakYsaUJBQWlCLENBQUNaLEtBQUQsRUFBdUM7SUFDdEQsS0FBSzZCLFVBQUwsQ0FBZ0JDLElBQWhCLENBQXFCLGlCQUFyQjtFQUNEOztBQXRMbUQ7QUF5THREO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFDTyxNQUFNdUUscUJBQU4sU0FBb0NuRyxZQUFwQyxDQUFpRDtFQUl0RDtBQUNGO0FBQ0E7RUFHRUosV0FBVyxDQUFDK0IsVUFBRCxFQUF5QnlDLE9BQXpCLEVBQXNEO0lBQy9EO0lBRCtELEtBUmpFekMsVUFRaUU7SUFBQSxLQVBqRXlDLE9BT2lFO0lBQUEsS0FGakVnQyxpQkFFaUU7SUFHL0QsS0FBS3pFLFVBQUwsR0FBa0JBLFVBQWxCO0lBQ0EsS0FBS3lDLE9BQUwsR0FBZUEsT0FBZjtJQUVBLEtBQUtnQyxpQkFBTCxHQUF5QixLQUF6QjtFQUNEOztFQUVENUUsTUFBTSxDQUFDMUIsS0FBRCxFQUFtQjtJQUN2QixJQUFJQSxLQUFLLENBQUN1RyxTQUFWLEVBQXFCO01BQ25CLEtBQUtELGlCQUFMLEdBQXlCLElBQXpCO0lBQ0Q7RUFDRjs7QUF0QnFEIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.errorParser = errorParser;
exports.infoParser = infoParser;

var _token = require("./token");

function parseToken(parser, options, callback) {
  // length
  parser.readUInt16LE(() => {
    parser.readUInt32LE(number => {
      parser.readUInt8(state => {
        parser.readUInt8(clazz => {
          parser.readUsVarChar(message => {
            parser.readBVarChar(serverName => {
              parser.readBVarChar(procName => {
                (options.tdsVersion < '7_2' ? parser.readUInt16LE : parser.readUInt32LE).call(parser, lineNumber => {
                  callback({
                    'number': number,
                    'state': state,
                    'class': clazz,
                    'message': message,
                    'serverName': serverName,
                    'procName': procName,
                    'lineNumber': lineNumber
                  });
                });
              });
            });
          });
        });
      });
    });
  });
}

function infoParser(parser, options, callback) {
  parseToken(parser, options, data => {
    callback(new _token.InfoMessageToken(data));
  });
}

function errorParser(parser, options, callback) {
  parseToken(parser, options, data => {
    callback(new _token.ErrorMessageToken(data));
  });
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwYXJzZVRva2VuIiwicGFyc2VyIiwib3B0aW9ucyIsImNhbGxiYWNrIiwicmVhZFVJbnQxNkxFIiwicmVhZFVJbnQzMkxFIiwibnVtYmVyIiwicmVhZFVJbnQ4Iiwic3RhdGUiLCJjbGF6eiIsInJlYWRVc1ZhckNoYXIiLCJtZXNzYWdlIiwicmVhZEJWYXJDaGFyIiwic2VydmVyTmFtZSIsInByb2NOYW1lIiwidGRzVmVyc2lvbiIsImNhbGwiLCJsaW5lTnVtYmVyIiwiaW5mb1BhcnNlciIsImRhdGEiLCJJbmZvTWVzc2FnZVRva2VuIiwiZXJyb3JQYXJzZXIiLCJFcnJvck1lc3NhZ2VUb2tlbiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b2tlbi9pbmZvZXJyb3ItdG9rZW4tcGFyc2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQYXJzZXIsIHsgUGFyc2VyT3B0aW9ucyB9IGZyb20gJy4vc3RyZWFtLXBhcnNlcic7XG5cbmltcG9ydCB7IEluZm9NZXNzYWdlVG9rZW4sIEVycm9yTWVzc2FnZVRva2VuIH0gZnJvbSAnLi90b2tlbic7XG5cbmludGVyZmFjZSBUb2tlbkRhdGEge1xuICBudW1iZXI6IG51bWJlcjtcbiAgc3RhdGU6IG51bWJlcjtcbiAgY2xhc3M6IG51bWJlcjtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBzZXJ2ZXJOYW1lOiBzdHJpbmc7XG4gIHByb2NOYW1lOiBzdHJpbmc7XG4gIGxpbmVOdW1iZXI6IG51bWJlcjtcbn1cblxuZnVuY3Rpb24gcGFyc2VUb2tlbihwYXJzZXI6IFBhcnNlciwgb3B0aW9uczogUGFyc2VyT3B0aW9ucywgY2FsbGJhY2s6IChkYXRhOiBUb2tlbkRhdGEpID0+IHZvaWQpIHtcbiAgLy8gbGVuZ3RoXG4gIHBhcnNlci5yZWFkVUludDE2TEUoKCkgPT4ge1xuICAgIHBhcnNlci5yZWFkVUludDMyTEUoKG51bWJlcikgPT4ge1xuICAgICAgcGFyc2VyLnJlYWRVSW50OCgoc3RhdGUpID0+IHtcbiAgICAgICAgcGFyc2VyLnJlYWRVSW50OCgoY2xhenopID0+IHtcbiAgICAgICAgICBwYXJzZXIucmVhZFVzVmFyQ2hhcigobWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgcGFyc2VyLnJlYWRCVmFyQ2hhcigoc2VydmVyTmFtZSkgPT4ge1xuICAgICAgICAgICAgICBwYXJzZXIucmVhZEJWYXJDaGFyKChwcm9jTmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgIChvcHRpb25zLnRkc1ZlcnNpb24gPCAnN18yJyA/IHBhcnNlci5yZWFkVUludDE2TEUgOiBwYXJzZXIucmVhZFVJbnQzMkxFKS5jYWxsKHBhcnNlciwgKGxpbmVOdW1iZXI6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgY2FsbGJhY2soe1xuICAgICAgICAgICAgICAgICAgICAnbnVtYmVyJzogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAnc3RhdGUnOiBzdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgJ2NsYXNzJzogY2xhenosXG4gICAgICAgICAgICAgICAgICAgICdtZXNzYWdlJzogbWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgJ3NlcnZlck5hbWUnOiBzZXJ2ZXJOYW1lLFxuICAgICAgICAgICAgICAgICAgICAncHJvY05hbWUnOiBwcm9jTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgJ2xpbmVOdW1iZXInOiBsaW5lTnVtYmVyXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmZvUGFyc2VyKHBhcnNlcjogUGFyc2VyLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zLCBjYWxsYmFjazogKHRva2VuOiBJbmZvTWVzc2FnZVRva2VuKSA9PiB2b2lkKSB7XG4gIHBhcnNlVG9rZW4ocGFyc2VyLCBvcHRpb25zLCAoZGF0YSkgPT4ge1xuICAgIGNhbGxiYWNrKG5ldyBJbmZvTWVzc2FnZVRva2VuKGRhdGEpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlcnJvclBhcnNlcihwYXJzZXI6IFBhcnNlciwgb3B0aW9uczogUGFyc2VyT3B0aW9ucywgY2FsbGJhY2s6ICh0b2tlbjogRXJyb3JNZXNzYWdlVG9rZW4pID0+IHZvaWQpIHtcbiAgcGFyc2VUb2tlbihwYXJzZXIsIG9wdGlvbnMsIChkYXRhKSA9PiB7XG4gICAgY2FsbGJhY2sobmV3IEVycm9yTWVzc2FnZVRva2VuKGRhdGEpKTtcbiAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBRUE7O0FBWUEsU0FBU0EsVUFBVCxDQUFvQkMsTUFBcEIsRUFBb0NDLE9BQXBDLEVBQTREQyxRQUE1RCxFQUFpRztFQUMvRjtFQUNBRixNQUFNLENBQUNHLFlBQVAsQ0FBb0IsTUFBTTtJQUN4QkgsTUFBTSxDQUFDSSxZQUFQLENBQXFCQyxNQUFELElBQVk7TUFDOUJMLE1BQU0sQ0FBQ00sU0FBUCxDQUFrQkMsS0FBRCxJQUFXO1FBQzFCUCxNQUFNLENBQUNNLFNBQVAsQ0FBa0JFLEtBQUQsSUFBVztVQUMxQlIsTUFBTSxDQUFDUyxhQUFQLENBQXNCQyxPQUFELElBQWE7WUFDaENWLE1BQU0sQ0FBQ1csWUFBUCxDQUFxQkMsVUFBRCxJQUFnQjtjQUNsQ1osTUFBTSxDQUFDVyxZQUFQLENBQXFCRSxRQUFELElBQWM7Z0JBQ2hDLENBQUNaLE9BQU8sQ0FBQ2EsVUFBUixHQUFxQixLQUFyQixHQUE2QmQsTUFBTSxDQUFDRyxZQUFwQyxHQUFtREgsTUFBTSxDQUFDSSxZQUEzRCxFQUF5RVcsSUFBekUsQ0FBOEVmLE1BQTlFLEVBQXVGZ0IsVUFBRCxJQUF3QjtrQkFDNUdkLFFBQVEsQ0FBQztvQkFDUCxVQUFVRyxNQURIO29CQUVQLFNBQVNFLEtBRkY7b0JBR1AsU0FBU0MsS0FIRjtvQkFJUCxXQUFXRSxPQUpKO29CQUtQLGNBQWNFLFVBTFA7b0JBTVAsWUFBWUMsUUFOTDtvQkFPUCxjQUFjRztrQkFQUCxDQUFELENBQVI7Z0JBU0QsQ0FWRDtjQVdELENBWkQ7WUFhRCxDQWREO1VBZUQsQ0FoQkQ7UUFpQkQsQ0FsQkQ7TUFtQkQsQ0FwQkQ7SUFxQkQsQ0F0QkQ7RUF1QkQsQ0F4QkQ7QUF5QkQ7O0FBRU0sU0FBU0MsVUFBVCxDQUFvQmpCLE1BQXBCLEVBQW9DQyxPQUFwQyxFQUE0REMsUUFBNUQsRUFBeUc7RUFDOUdILFVBQVUsQ0FBQ0MsTUFBRCxFQUFTQyxPQUFULEVBQW1CaUIsSUFBRCxJQUFVO0lBQ3BDaEIsUUFBUSxDQUFDLElBQUlpQix1QkFBSixDQUFxQkQsSUFBckIsQ0FBRCxDQUFSO0VBQ0QsQ0FGUyxDQUFWO0FBR0Q7O0FBRU0sU0FBU0UsV0FBVCxDQUFxQnBCLE1BQXJCLEVBQXFDQyxPQUFyQyxFQUE2REMsUUFBN0QsRUFBMkc7RUFDaEhILFVBQVUsQ0FBQ0MsTUFBRCxFQUFTQyxPQUFULEVBQW1CaUIsSUFBRCxJQUFVO0lBQ3BDaEIsUUFBUSxDQUFDLElBQUltQix3QkFBSixDQUFzQkgsSUFBdEIsQ0FBRCxDQUFSO0VBQ0QsQ0FGUyxDQUFWO0FBR0QifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _token = require("./token");

var _tdsVersions = require("../tds-versions");

const interfaceTypes = {
  0: 'SQL_DFLT',
  1: 'SQL_TSQL'
};

function loginAckParser(parser, _options, callback) {
  // length
  parser.readUInt16LE(() => {
    parser.readUInt8(interfaceNumber => {
      const interfaceType = interfaceTypes[interfaceNumber];
      parser.readUInt32BE(tdsVersionNumber => {
        const tdsVersion = _tdsVersions.versionsByValue[tdsVersionNumber];
        parser.readBVarChar(progName => {
          parser.readUInt8(major => {
            parser.readUInt8(minor => {
              parser.readUInt8(buildNumHi => {
                parser.readUInt8(buildNumLow => {
                  callback(new _token.LoginAckToken({
                    interface: interfaceType,
                    tdsVersion: tdsVersion,
                    progName: progName,
                    progVersion: {
                      major: major,
                      minor: minor,
                      buildNumHi: buildNumHi,
                      buildNumLow: buildNumLow
                    }
                  }));
                });
              });
            });
          });
        });
      });
    });
  });
}

var _default = loginAckParser;
exports.default = _default;
module.exports = loginAckParser;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpbnRlcmZhY2VUeXBlcyIsImxvZ2luQWNrUGFyc2VyIiwicGFyc2VyIiwiX29wdGlvbnMiLCJjYWxsYmFjayIsInJlYWRVSW50MTZMRSIsInJlYWRVSW50OCIsImludGVyZmFjZU51bWJlciIsImludGVyZmFjZVR5cGUiLCJyZWFkVUludDMyQkUiLCJ0ZHNWZXJzaW9uTnVtYmVyIiwidGRzVmVyc2lvbiIsInZlcnNpb25zIiwicmVhZEJWYXJDaGFyIiwicHJvZ05hbWUiLCJtYWpvciIsIm1pbm9yIiwiYnVpbGROdW1IaSIsImJ1aWxkTnVtTG93IiwiTG9naW5BY2tUb2tlbiIsImludGVyZmFjZSIsInByb2dWZXJzaW9uIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b2tlbi9sb2dpbmFjay10b2tlbi1wYXJzZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFBhcnNlciwgeyBQYXJzZXJPcHRpb25zIH0gZnJvbSAnLi9zdHJlYW0tcGFyc2VyJztcblxuaW1wb3J0IHsgTG9naW5BY2tUb2tlbiB9IGZyb20gJy4vdG9rZW4nO1xuXG5pbXBvcnQgeyB2ZXJzaW9uc0J5VmFsdWUgYXMgdmVyc2lvbnMgfSBmcm9tICcuLi90ZHMtdmVyc2lvbnMnO1xuXG5jb25zdCBpbnRlcmZhY2VUeXBlczogeyBba2V5OiBudW1iZXJdOiBzdHJpbmcgfSA9IHtcbiAgMDogJ1NRTF9ERkxUJyxcbiAgMTogJ1NRTF9UU1FMJ1xufTtcblxuZnVuY3Rpb24gbG9naW5BY2tQYXJzZXIocGFyc2VyOiBQYXJzZXIsIF9vcHRpb25zOiBQYXJzZXJPcHRpb25zLCBjYWxsYmFjazogKHRva2VuOiBMb2dpbkFja1Rva2VuKSA9PiB2b2lkKSB7XG4gIC8vIGxlbmd0aFxuICBwYXJzZXIucmVhZFVJbnQxNkxFKCgpID0+IHtcbiAgICBwYXJzZXIucmVhZFVJbnQ4KChpbnRlcmZhY2VOdW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IGludGVyZmFjZVR5cGUgPSBpbnRlcmZhY2VUeXBlc1tpbnRlcmZhY2VOdW1iZXJdO1xuICAgICAgcGFyc2VyLnJlYWRVSW50MzJCRSgodGRzVmVyc2lvbk51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCB0ZHNWZXJzaW9uID0gdmVyc2lvbnNbdGRzVmVyc2lvbk51bWJlcl07XG4gICAgICAgIHBhcnNlci5yZWFkQlZhckNoYXIoKHByb2dOYW1lKSA9PiB7XG4gICAgICAgICAgcGFyc2VyLnJlYWRVSW50OCgobWFqb3IpID0+IHtcbiAgICAgICAgICAgIHBhcnNlci5yZWFkVUludDgoKG1pbm9yKSA9PiB7XG4gICAgICAgICAgICAgIHBhcnNlci5yZWFkVUludDgoKGJ1aWxkTnVtSGkpID0+IHtcbiAgICAgICAgICAgICAgICBwYXJzZXIucmVhZFVJbnQ4KChidWlsZE51bUxvdykgPT4ge1xuICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobmV3IExvZ2luQWNrVG9rZW4oe1xuICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2U6IGludGVyZmFjZVR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHRkc1ZlcnNpb246IHRkc1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgIHByb2dOYW1lOiBwcm9nTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvZ1ZlcnNpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICBtYWpvcjogbWFqb3IsXG4gICAgICAgICAgICAgICAgICAgICAgbWlub3I6IG1pbm9yLFxuICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkTnVtSGk6IGJ1aWxkTnVtSGksXG4gICAgICAgICAgICAgICAgICAgICAgYnVpbGROdW1Mb3c6IGJ1aWxkTnVtTG93XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGxvZ2luQWNrUGFyc2VyO1xubW9kdWxlLmV4cG9ydHMgPSBsb2dpbkFja1BhcnNlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUVBOztBQUVBOztBQUVBLE1BQU1BLGNBQXlDLEdBQUc7RUFDaEQsR0FBRyxVQUQ2QztFQUVoRCxHQUFHO0FBRjZDLENBQWxEOztBQUtBLFNBQVNDLGNBQVQsQ0FBd0JDLE1BQXhCLEVBQXdDQyxRQUF4QyxFQUFpRUMsUUFBakUsRUFBMkc7RUFDekc7RUFDQUYsTUFBTSxDQUFDRyxZQUFQLENBQW9CLE1BQU07SUFDeEJILE1BQU0sQ0FBQ0ksU0FBUCxDQUFrQkMsZUFBRCxJQUFxQjtNQUNwQyxNQUFNQyxhQUFhLEdBQUdSLGNBQWMsQ0FBQ08sZUFBRCxDQUFwQztNQUNBTCxNQUFNLENBQUNPLFlBQVAsQ0FBcUJDLGdCQUFELElBQXNCO1FBQ3hDLE1BQU1DLFVBQVUsR0FBR0MsNkJBQVNGLGdCQUFULENBQW5CO1FBQ0FSLE1BQU0sQ0FBQ1csWUFBUCxDQUFxQkMsUUFBRCxJQUFjO1VBQ2hDWixNQUFNLENBQUNJLFNBQVAsQ0FBa0JTLEtBQUQsSUFBVztZQUMxQmIsTUFBTSxDQUFDSSxTQUFQLENBQWtCVSxLQUFELElBQVc7Y0FDMUJkLE1BQU0sQ0FBQ0ksU0FBUCxDQUFrQlcsVUFBRCxJQUFnQjtnQkFDL0JmLE1BQU0sQ0FBQ0ksU0FBUCxDQUFrQlksV0FBRCxJQUFpQjtrQkFDaENkLFFBQVEsQ0FBQyxJQUFJZSxvQkFBSixDQUFrQjtvQkFDekJDLFNBQVMsRUFBRVosYUFEYztvQkFFekJHLFVBQVUsRUFBRUEsVUFGYTtvQkFHekJHLFFBQVEsRUFBRUEsUUFIZTtvQkFJekJPLFdBQVcsRUFBRTtzQkFDWE4sS0FBSyxFQUFFQSxLQURJO3NCQUVYQyxLQUFLLEVBQUVBLEtBRkk7c0JBR1hDLFVBQVUsRUFBRUEsVUFIRDtzQkFJWEMsV0FBVyxFQUFFQTtvQkFKRjtrQkFKWSxDQUFsQixDQUFELENBQVI7Z0JBV0QsQ0FaRDtjQWFELENBZEQ7WUFlRCxDQWhCRDtVQWlCRCxDQWxCRDtRQW1CRCxDQXBCRDtNQXFCRCxDQXZCRDtJQXdCRCxDQTFCRDtFQTJCRCxDQTVCRDtBQTZCRDs7ZUFFY2pCLGM7O0FBQ2ZxQixNQUFNLENBQUNDLE9BQVAsR0FBaUJ0QixjQUFqQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _token = require("./token");

var _valueParser = _interopRequireDefault(require("../value-parser"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// s2.2.7.13 (introduced in TDS 7.3.B)
function nullHandler(_parser, _columnMetadata, _options, callback) {
  callback(null);
}

async function nbcRowParser(parser) {
  const colMetadata = parser.colMetadata;
  const bitmapByteLength = Math.ceil(colMetadata.length / 8);
  const columns = [];
  const bitmap = [];

  while (parser.buffer.length - parser.position < bitmapByteLength) {
    await parser.streamBuffer.waitForChunk();
  }

  const bytes = parser.buffer.slice(parser.position, parser.position + bitmapByteLength);
  parser.position += bitmapByteLength;

  for (let i = 0, len = bytes.length; i < len; i++) {
    const byte = bytes[i];
    bitmap.push(byte & 0b1 ? true : false);
    bitmap.push(byte & 0b10 ? true : false);
    bitmap.push(byte & 0b100 ? true : false);
    bitmap.push(byte & 0b1000 ? true : false);
    bitmap.push(byte & 0b10000 ? true : false);
    bitmap.push(byte & 0b100000 ? true : false);
    bitmap.push(byte & 0b1000000 ? true : false);
    bitmap.push(byte & 0b10000000 ? true : false);
  }

  for (let i = 0; i < colMetadata.length; i++) {
    const currColMetadata = colMetadata[i];
    let value;
    (bitmap[i] ? nullHandler : _valueParser.default)(parser, currColMetadata, parser.options, v => {
      value = v;
    });

    while (parser.suspended) {
      await parser.streamBuffer.waitForChunk();
      parser.suspended = false;
      const next = parser.next;
      next();
    }

    columns.push({
      value,
      metadata: currColMetadata
    });
  }

  if (parser.options.useColumnNames) {
    const columnsMap = {};
    columns.forEach(column => {
      const colName = column.metadata.colName;

      if (columnsMap[colName] == null) {
        columnsMap[colName] = column;
      }
    });
    return new _token.NBCRowToken(columnsMap);
  } else {
    return new _token.NBCRowToken(columns);
  }
}

var _default = nbcRowParser;
exports.default = _default;
module.exports = nbcRowParser;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJudWxsSGFuZGxlciIsIl9wYXJzZXIiLCJfY29sdW1uTWV0YWRhdGEiLCJfb3B0aW9ucyIsImNhbGxiYWNrIiwibmJjUm93UGFyc2VyIiwicGFyc2VyIiwiY29sTWV0YWRhdGEiLCJiaXRtYXBCeXRlTGVuZ3RoIiwiTWF0aCIsImNlaWwiLCJsZW5ndGgiLCJjb2x1bW5zIiwiYml0bWFwIiwiYnVmZmVyIiwicG9zaXRpb24iLCJzdHJlYW1CdWZmZXIiLCJ3YWl0Rm9yQ2h1bmsiLCJieXRlcyIsInNsaWNlIiwiaSIsImxlbiIsImJ5dGUiLCJwdXNoIiwiY3VyckNvbE1ldGFkYXRhIiwidmFsdWUiLCJ2YWx1ZVBhcnNlIiwib3B0aW9ucyIsInYiLCJzdXNwZW5kZWQiLCJuZXh0IiwibWV0YWRhdGEiLCJ1c2VDb2x1bW5OYW1lcyIsImNvbHVtbnNNYXAiLCJmb3JFYWNoIiwiY29sdW1uIiwiY29sTmFtZSIsIk5CQ1Jvd1Rva2VuIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b2tlbi9uYmNyb3ctdG9rZW4tcGFyc2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHMyLjIuNy4xMyAoaW50cm9kdWNlZCBpbiBURFMgNy4zLkIpXG5cbmltcG9ydCBQYXJzZXIsIHsgUGFyc2VyT3B0aW9ucyB9IGZyb20gJy4vc3RyZWFtLXBhcnNlcic7XG5pbXBvcnQgeyBDb2x1bW5NZXRhZGF0YSB9IGZyb20gJy4vY29sbWV0YWRhdGEtdG9rZW4tcGFyc2VyJztcblxuaW1wb3J0IHsgTkJDUm93VG9rZW4gfSBmcm9tICcuL3Rva2VuJztcblxuaW1wb3J0IHZhbHVlUGFyc2UgZnJvbSAnLi4vdmFsdWUtcGFyc2VyJztcblxuZnVuY3Rpb24gbnVsbEhhbmRsZXIoX3BhcnNlcjogUGFyc2VyLCBfY29sdW1uTWV0YWRhdGE6IENvbHVtbk1ldGFkYXRhLCBfb3B0aW9uczogUGFyc2VyT3B0aW9ucywgY2FsbGJhY2s6ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZCkge1xuICBjYWxsYmFjayhudWxsKTtcbn1cblxuaW50ZXJmYWNlIENvbHVtbiB7XG4gIHZhbHVlOiB1bmtub3duO1xuICBtZXRhZGF0YTogQ29sdW1uTWV0YWRhdGE7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5iY1Jvd1BhcnNlcihwYXJzZXI6IFBhcnNlcik6IFByb21pc2U8TkJDUm93VG9rZW4+IHtcbiAgY29uc3QgY29sTWV0YWRhdGEgPSBwYXJzZXIuY29sTWV0YWRhdGE7XG4gIGNvbnN0IGJpdG1hcEJ5dGVMZW5ndGggPSBNYXRoLmNlaWwoY29sTWV0YWRhdGEubGVuZ3RoIC8gOCk7XG4gIGNvbnN0IGNvbHVtbnM6IENvbHVtbltdID0gW107XG4gIGNvbnN0IGJpdG1hcDogYm9vbGVhbltdID0gW107XG5cbiAgd2hpbGUgKHBhcnNlci5idWZmZXIubGVuZ3RoIC0gcGFyc2VyLnBvc2l0aW9uIDwgYml0bWFwQnl0ZUxlbmd0aCkge1xuICAgIGF3YWl0IHBhcnNlci5zdHJlYW1CdWZmZXIud2FpdEZvckNodW5rKCk7XG4gIH1cblxuICBjb25zdCBieXRlcyA9IHBhcnNlci5idWZmZXIuc2xpY2UocGFyc2VyLnBvc2l0aW9uLCBwYXJzZXIucG9zaXRpb24gKyBiaXRtYXBCeXRlTGVuZ3RoKTtcbiAgcGFyc2VyLnBvc2l0aW9uICs9IGJpdG1hcEJ5dGVMZW5ndGg7XG5cbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGJ5dGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY29uc3QgYnl0ZSA9IGJ5dGVzW2ldO1xuXG4gICAgYml0bWFwLnB1c2goYnl0ZSAmIDBiMSA/IHRydWUgOiBmYWxzZSk7XG4gICAgYml0bWFwLnB1c2goYnl0ZSAmIDBiMTAgPyB0cnVlIDogZmFsc2UpO1xuICAgIGJpdG1hcC5wdXNoKGJ5dGUgJiAwYjEwMCA/IHRydWUgOiBmYWxzZSk7XG4gICAgYml0bWFwLnB1c2goYnl0ZSAmIDBiMTAwMCA/IHRydWUgOiBmYWxzZSk7XG4gICAgYml0bWFwLnB1c2goYnl0ZSAmIDBiMTAwMDAgPyB0cnVlIDogZmFsc2UpO1xuICAgIGJpdG1hcC5wdXNoKGJ5dGUgJiAwYjEwMDAwMCA/IHRydWUgOiBmYWxzZSk7XG4gICAgYml0bWFwLnB1c2goYnl0ZSAmIDBiMTAwMDAwMCA/IHRydWUgOiBmYWxzZSk7XG4gICAgYml0bWFwLnB1c2goYnl0ZSAmIDBiMTAwMDAwMDAgPyB0cnVlIDogZmFsc2UpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xNZXRhZGF0YS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGN1cnJDb2xNZXRhZGF0YSA9IGNvbE1ldGFkYXRhW2ldO1xuICAgIGxldCB2YWx1ZTtcbiAgICAoYml0bWFwW2ldID8gbnVsbEhhbmRsZXIgOiB2YWx1ZVBhcnNlKShwYXJzZXIsIGN1cnJDb2xNZXRhZGF0YSwgcGFyc2VyLm9wdGlvbnMsICh2KSA9PiB7XG4gICAgICB2YWx1ZSA9IHY7XG4gICAgfSk7XG5cbiAgICB3aGlsZSAocGFyc2VyLnN1c3BlbmRlZCkge1xuICAgICAgYXdhaXQgcGFyc2VyLnN0cmVhbUJ1ZmZlci53YWl0Rm9yQ2h1bmsoKTtcblxuICAgICAgcGFyc2VyLnN1c3BlbmRlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgbmV4dCA9IHBhcnNlci5uZXh0ITtcblxuICAgICAgbmV4dCgpO1xuICAgIH1cbiAgICBjb2x1bW5zLnB1c2goe1xuICAgICAgdmFsdWUsXG4gICAgICBtZXRhZGF0YTogY3VyckNvbE1ldGFkYXRhXG4gICAgfSk7XG4gIH1cblxuICBpZiAocGFyc2VyLm9wdGlvbnMudXNlQ29sdW1uTmFtZXMpIHtcbiAgICBjb25zdCBjb2x1bW5zTWFwOiB7IFtrZXk6IHN0cmluZ106IENvbHVtbiB9ID0ge307XG5cbiAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgY29uc3QgY29sTmFtZSA9IGNvbHVtbi5tZXRhZGF0YS5jb2xOYW1lO1xuICAgICAgaWYgKGNvbHVtbnNNYXBbY29sTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICBjb2x1bW5zTWFwW2NvbE5hbWVdID0gY29sdW1uO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBOQkNSb3dUb2tlbihjb2x1bW5zTWFwKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IE5CQ1Jvd1Rva2VuKGNvbHVtbnMpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5iY1Jvd1BhcnNlcjtcbm1vZHVsZS5leHBvcnRzID0gbmJjUm93UGFyc2VyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBS0E7O0FBRUE7Ozs7QUFQQTtBQVNBLFNBQVNBLFdBQVQsQ0FBcUJDLE9BQXJCLEVBQXNDQyxlQUF0QyxFQUF1RUMsUUFBdkUsRUFBZ0dDLFFBQWhHLEVBQW9JO0VBQ2xJQSxRQUFRLENBQUMsSUFBRCxDQUFSO0FBQ0Q7O0FBT0QsZUFBZUMsWUFBZixDQUE0QkMsTUFBNUIsRUFBa0U7RUFDaEUsTUFBTUMsV0FBVyxHQUFHRCxNQUFNLENBQUNDLFdBQTNCO0VBQ0EsTUFBTUMsZ0JBQWdCLEdBQUdDLElBQUksQ0FBQ0MsSUFBTCxDQUFVSCxXQUFXLENBQUNJLE1BQVosR0FBcUIsQ0FBL0IsQ0FBekI7RUFDQSxNQUFNQyxPQUFpQixHQUFHLEVBQTFCO0VBQ0EsTUFBTUMsTUFBaUIsR0FBRyxFQUExQjs7RUFFQSxPQUFPUCxNQUFNLENBQUNRLE1BQVAsQ0FBY0gsTUFBZCxHQUF1QkwsTUFBTSxDQUFDUyxRQUE5QixHQUF5Q1AsZ0JBQWhELEVBQWtFO0lBQ2hFLE1BQU1GLE1BQU0sQ0FBQ1UsWUFBUCxDQUFvQkMsWUFBcEIsRUFBTjtFQUNEOztFQUVELE1BQU1DLEtBQUssR0FBR1osTUFBTSxDQUFDUSxNQUFQLENBQWNLLEtBQWQsQ0FBb0JiLE1BQU0sQ0FBQ1MsUUFBM0IsRUFBcUNULE1BQU0sQ0FBQ1MsUUFBUCxHQUFrQlAsZ0JBQXZELENBQWQ7RUFDQUYsTUFBTSxDQUFDUyxRQUFQLElBQW1CUCxnQkFBbkI7O0VBRUEsS0FBSyxJQUFJWSxDQUFDLEdBQUcsQ0FBUixFQUFXQyxHQUFHLEdBQUdILEtBQUssQ0FBQ1AsTUFBNUIsRUFBb0NTLENBQUMsR0FBR0MsR0FBeEMsRUFBNkNELENBQUMsRUFBOUMsRUFBa0Q7SUFDaEQsTUFBTUUsSUFBSSxHQUFHSixLQUFLLENBQUNFLENBQUQsQ0FBbEI7SUFFQVAsTUFBTSxDQUFDVSxJQUFQLENBQVlELElBQUksR0FBRyxHQUFQLEdBQWEsSUFBYixHQUFvQixLQUFoQztJQUNBVCxNQUFNLENBQUNVLElBQVAsQ0FBWUQsSUFBSSxHQUFHLElBQVAsR0FBYyxJQUFkLEdBQXFCLEtBQWpDO0lBQ0FULE1BQU0sQ0FBQ1UsSUFBUCxDQUFZRCxJQUFJLEdBQUcsS0FBUCxHQUFlLElBQWYsR0FBc0IsS0FBbEM7SUFDQVQsTUFBTSxDQUFDVSxJQUFQLENBQVlELElBQUksR0FBRyxNQUFQLEdBQWdCLElBQWhCLEdBQXVCLEtBQW5DO0lBQ0FULE1BQU0sQ0FBQ1UsSUFBUCxDQUFZRCxJQUFJLEdBQUcsT0FBUCxHQUFpQixJQUFqQixHQUF3QixLQUFwQztJQUNBVCxNQUFNLENBQUNVLElBQVAsQ0FBWUQsSUFBSSxHQUFHLFFBQVAsR0FBa0IsSUFBbEIsR0FBeUIsS0FBckM7SUFDQVQsTUFBTSxDQUFDVSxJQUFQLENBQVlELElBQUksR0FBRyxTQUFQLEdBQW1CLElBQW5CLEdBQTBCLEtBQXRDO0lBQ0FULE1BQU0sQ0FBQ1UsSUFBUCxDQUFZRCxJQUFJLEdBQUcsVUFBUCxHQUFvQixJQUFwQixHQUEyQixLQUF2QztFQUNEOztFQUVELEtBQUssSUFBSUYsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR2IsV0FBVyxDQUFDSSxNQUFoQyxFQUF3Q1MsQ0FBQyxFQUF6QyxFQUE2QztJQUMzQyxNQUFNSSxlQUFlLEdBQUdqQixXQUFXLENBQUNhLENBQUQsQ0FBbkM7SUFDQSxJQUFJSyxLQUFKO0lBQ0EsQ0FBQ1osTUFBTSxDQUFDTyxDQUFELENBQU4sR0FBWXBCLFdBQVosR0FBMEIwQixvQkFBM0IsRUFBdUNwQixNQUF2QyxFQUErQ2tCLGVBQS9DLEVBQWdFbEIsTUFBTSxDQUFDcUIsT0FBdkUsRUFBaUZDLENBQUQsSUFBTztNQUNyRkgsS0FBSyxHQUFHRyxDQUFSO0lBQ0QsQ0FGRDs7SUFJQSxPQUFPdEIsTUFBTSxDQUFDdUIsU0FBZCxFQUF5QjtNQUN2QixNQUFNdkIsTUFBTSxDQUFDVSxZQUFQLENBQW9CQyxZQUFwQixFQUFOO01BRUFYLE1BQU0sQ0FBQ3VCLFNBQVAsR0FBbUIsS0FBbkI7TUFDQSxNQUFNQyxJQUFJLEdBQUd4QixNQUFNLENBQUN3QixJQUFwQjtNQUVBQSxJQUFJO0lBQ0w7O0lBQ0RsQixPQUFPLENBQUNXLElBQVIsQ0FBYTtNQUNYRSxLQURXO01BRVhNLFFBQVEsRUFBRVA7SUFGQyxDQUFiO0VBSUQ7O0VBRUQsSUFBSWxCLE1BQU0sQ0FBQ3FCLE9BQVAsQ0FBZUssY0FBbkIsRUFBbUM7SUFDakMsTUFBTUMsVUFBcUMsR0FBRyxFQUE5QztJQUVBckIsT0FBTyxDQUFDc0IsT0FBUixDQUFpQkMsTUFBRCxJQUFZO01BQzFCLE1BQU1DLE9BQU8sR0FBR0QsTUFBTSxDQUFDSixRQUFQLENBQWdCSyxPQUFoQzs7TUFDQSxJQUFJSCxVQUFVLENBQUNHLE9BQUQsQ0FBVixJQUF1QixJQUEzQixFQUFpQztRQUMvQkgsVUFBVSxDQUFDRyxPQUFELENBQVYsR0FBc0JELE1BQXRCO01BQ0Q7SUFDRixDQUxEO0lBT0EsT0FBTyxJQUFJRSxrQkFBSixDQUFnQkosVUFBaEIsQ0FBUDtFQUNELENBWEQsTUFXTztJQUNMLE9BQU8sSUFBSUksa0JBQUosQ0FBZ0J6QixPQUFoQixDQUFQO0VBQ0Q7QUFDRjs7ZUFFY1AsWTs7QUFDZmlDLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQmxDLFlBQWpCIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _token = require("./token");

// s2.2.7.14
function orderParser(parser, _options, callback) {
  parser.readUInt16LE(length => {
    const columnCount = length / 2;
    const orderColumns = [];
    let i = 0;

    function next(done) {
      if (i === columnCount) {
        return done();
      }

      parser.readUInt16LE(column => {
        orderColumns.push(column);
        i++;
        next(done);
      });
    }

    next(() => {
      callback(new _token.OrderToken(orderColumns));
    });
  });
}

var _default = orderParser;
exports.default = _default;
module.exports = orderParser;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJvcmRlclBhcnNlciIsInBhcnNlciIsIl9vcHRpb25zIiwiY2FsbGJhY2siLCJyZWFkVUludDE2TEUiLCJsZW5ndGgiLCJjb2x1bW5Db3VudCIsIm9yZGVyQ29sdW1ucyIsImkiLCJuZXh0IiwiZG9uZSIsImNvbHVtbiIsInB1c2giLCJPcmRlclRva2VuIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b2tlbi9vcmRlci10b2tlbi1wYXJzZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gczIuMi43LjE0XG5pbXBvcnQgUGFyc2VyLCB7IFBhcnNlck9wdGlvbnMgfSBmcm9tICcuL3N0cmVhbS1wYXJzZXInO1xuXG5pbXBvcnQgeyBPcmRlclRva2VuIH0gZnJvbSAnLi90b2tlbic7XG5cbmZ1bmN0aW9uIG9yZGVyUGFyc2VyKHBhcnNlcjogUGFyc2VyLCBfb3B0aW9uczogUGFyc2VyT3B0aW9ucywgY2FsbGJhY2s6ICh0b2tlbjogT3JkZXJUb2tlbikgPT4gdm9pZCkge1xuICBwYXJzZXIucmVhZFVJbnQxNkxFKChsZW5ndGgpID0+IHtcbiAgICBjb25zdCBjb2x1bW5Db3VudCA9IGxlbmd0aCAvIDI7XG4gICAgY29uc3Qgb3JkZXJDb2x1bW5zOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgbGV0IGkgPSAwO1xuICAgIGZ1bmN0aW9uIG5leHQoZG9uZTogKCkgPT4gdm9pZCkge1xuICAgICAgaWYgKGkgPT09IGNvbHVtbkNvdW50KSB7XG4gICAgICAgIHJldHVybiBkb25lKCk7XG4gICAgICB9XG5cbiAgICAgIHBhcnNlci5yZWFkVUludDE2TEUoKGNvbHVtbikgPT4ge1xuICAgICAgICBvcmRlckNvbHVtbnMucHVzaChjb2x1bW4pO1xuXG4gICAgICAgIGkrKztcblxuICAgICAgICBuZXh0KGRvbmUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmV4dCgoKSA9PiB7XG4gICAgICBjYWxsYmFjayhuZXcgT3JkZXJUb2tlbihvcmRlckNvbHVtbnMpKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG9yZGVyUGFyc2VyO1xubW9kdWxlLmV4cG9ydHMgPSBvcmRlclBhcnNlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUdBOztBQUhBO0FBS0EsU0FBU0EsV0FBVCxDQUFxQkMsTUFBckIsRUFBcUNDLFFBQXJDLEVBQThEQyxRQUE5RCxFQUFxRztFQUNuR0YsTUFBTSxDQUFDRyxZQUFQLENBQXFCQyxNQUFELElBQVk7SUFDOUIsTUFBTUMsV0FBVyxHQUFHRCxNQUFNLEdBQUcsQ0FBN0I7SUFDQSxNQUFNRSxZQUFzQixHQUFHLEVBQS9CO0lBRUEsSUFBSUMsQ0FBQyxHQUFHLENBQVI7O0lBQ0EsU0FBU0MsSUFBVCxDQUFjQyxJQUFkLEVBQWdDO01BQzlCLElBQUlGLENBQUMsS0FBS0YsV0FBVixFQUF1QjtRQUNyQixPQUFPSSxJQUFJLEVBQVg7TUFDRDs7TUFFRFQsTUFBTSxDQUFDRyxZQUFQLENBQXFCTyxNQUFELElBQVk7UUFDOUJKLFlBQVksQ0FBQ0ssSUFBYixDQUFrQkQsTUFBbEI7UUFFQUgsQ0FBQztRQUVEQyxJQUFJLENBQUNDLElBQUQsQ0FBSjtNQUNELENBTkQ7SUFPRDs7SUFFREQsSUFBSSxDQUFDLE1BQU07TUFDVE4sUUFBUSxDQUFDLElBQUlVLGlCQUFKLENBQWVOLFlBQWYsQ0FBRCxDQUFSO0lBQ0QsQ0FGRyxDQUFKO0VBR0QsQ0F0QkQ7QUF1QkQ7O2VBRWNQLFc7O0FBQ2ZjLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQmYsV0FBakIifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _token = require("./token");

// s2.2.7.16
function returnStatusParser(parser, _options, callback) {
  parser.readInt32LE(value => {
    callback(new _token.ReturnStatusToken(value));
  });
}

var _default = returnStatusParser;
exports.default = _default;
module.exports = returnStatusParser;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXR1cm5TdGF0dXNQYXJzZXIiLCJwYXJzZXIiLCJfb3B0aW9ucyIsImNhbGxiYWNrIiwicmVhZEludDMyTEUiLCJ2YWx1ZSIsIlJldHVyblN0YXR1c1Rva2VuIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b2tlbi9yZXR1cm5zdGF0dXMtdG9rZW4tcGFyc2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHMyLjIuNy4xNlxuaW1wb3J0IFBhcnNlciwgeyBQYXJzZXJPcHRpb25zIH0gZnJvbSAnLi9zdHJlYW0tcGFyc2VyJztcblxuaW1wb3J0IHsgUmV0dXJuU3RhdHVzVG9rZW4gfSBmcm9tICcuL3Rva2VuJztcblxuZnVuY3Rpb24gcmV0dXJuU3RhdHVzUGFyc2VyKHBhcnNlcjogUGFyc2VyLCBfb3B0aW9uczogUGFyc2VyT3B0aW9ucywgY2FsbGJhY2s6ICh0b2tlbjogUmV0dXJuU3RhdHVzVG9rZW4pID0+IHZvaWQpIHtcbiAgcGFyc2VyLnJlYWRJbnQzMkxFKCh2YWx1ZSkgPT4ge1xuICAgIGNhbGxiYWNrKG5ldyBSZXR1cm5TdGF0dXNUb2tlbih2YWx1ZSkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgcmV0dXJuU3RhdHVzUGFyc2VyO1xubW9kdWxlLmV4cG9ydHMgPSByZXR1cm5TdGF0dXNQYXJzZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFHQTs7QUFIQTtBQUtBLFNBQVNBLGtCQUFULENBQTRCQyxNQUE1QixFQUE0Q0MsUUFBNUMsRUFBcUVDLFFBQXJFLEVBQW1IO0VBQ2pIRixNQUFNLENBQUNHLFdBQVAsQ0FBb0JDLEtBQUQsSUFBVztJQUM1QkYsUUFBUSxDQUFDLElBQUlHLHdCQUFKLENBQXNCRCxLQUF0QixDQUFELENBQVI7RUFDRCxDQUZEO0FBR0Q7O2VBRWNMLGtCOztBQUNmTyxNQUFNLENBQUNDLE9BQVAsR0FBaUJSLGtCQUFqQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _token = require("./token");

var _metadataParser = _interopRequireDefault(require("../metadata-parser"));

var _valueParser = _interopRequireDefault(require("../value-parser"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// s2.2.7.16
function returnParser(parser, options, callback) {
  parser.readUInt16LE(paramOrdinal => {
    parser.readBVarChar(paramName => {
      if (paramName.charAt(0) === '@') {
        paramName = paramName.slice(1);
      } // status


      parser.readUInt8(() => {
        (0, _metadataParser.default)(parser, options, metadata => {
          (0, _valueParser.default)(parser, metadata, options, value => {
            callback(new _token.ReturnValueToken({
              paramOrdinal: paramOrdinal,
              paramName: paramName,
              metadata: metadata,
              value: value
            }));
          });
        });
      });
    });
  });
}

var _default = returnParser;
exports.default = _default;
module.exports = returnParser;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXR1cm5QYXJzZXIiLCJwYXJzZXIiLCJvcHRpb25zIiwiY2FsbGJhY2siLCJyZWFkVUludDE2TEUiLCJwYXJhbU9yZGluYWwiLCJyZWFkQlZhckNoYXIiLCJwYXJhbU5hbWUiLCJjaGFyQXQiLCJzbGljZSIsInJlYWRVSW50OCIsIm1ldGFkYXRhIiwidmFsdWUiLCJSZXR1cm5WYWx1ZVRva2VuIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b2tlbi9yZXR1cm52YWx1ZS10b2tlbi1wYXJzZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gczIuMi43LjE2XG5cbmltcG9ydCBQYXJzZXIsIHsgUGFyc2VyT3B0aW9ucyB9IGZyb20gJy4vc3RyZWFtLXBhcnNlcic7XG5cbmltcG9ydCB7IFJldHVyblZhbHVlVG9rZW4gfSBmcm9tICcuL3Rva2VuJztcblxuaW1wb3J0IG1ldGFkYXRhUGFyc2UgZnJvbSAnLi4vbWV0YWRhdGEtcGFyc2VyJztcbmltcG9ydCB2YWx1ZVBhcnNlIGZyb20gJy4uL3ZhbHVlLXBhcnNlcic7XG5cbmZ1bmN0aW9uIHJldHVyblBhcnNlcihwYXJzZXI6IFBhcnNlciwgb3B0aW9uczogUGFyc2VyT3B0aW9ucywgY2FsbGJhY2s6ICh0b2tlbjogUmV0dXJuVmFsdWVUb2tlbikgPT4gdm9pZCkge1xuICBwYXJzZXIucmVhZFVJbnQxNkxFKChwYXJhbU9yZGluYWwpID0+IHtcbiAgICBwYXJzZXIucmVhZEJWYXJDaGFyKChwYXJhbU5hbWUpID0+IHtcbiAgICAgIGlmIChwYXJhbU5hbWUuY2hhckF0KDApID09PSAnQCcpIHtcbiAgICAgICAgcGFyYW1OYW1lID0gcGFyYW1OYW1lLnNsaWNlKDEpO1xuICAgICAgfVxuXG4gICAgICAvLyBzdGF0dXNcbiAgICAgIHBhcnNlci5yZWFkVUludDgoKCkgPT4ge1xuICAgICAgICBtZXRhZGF0YVBhcnNlKHBhcnNlciwgb3B0aW9ucywgKG1ldGFkYXRhKSA9PiB7XG4gICAgICAgICAgdmFsdWVQYXJzZShwYXJzZXIsIG1ldGFkYXRhLCBvcHRpb25zLCAodmFsdWUpID0+IHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBSZXR1cm5WYWx1ZVRva2VuKHtcbiAgICAgICAgICAgICAgcGFyYW1PcmRpbmFsOiBwYXJhbU9yZGluYWwsXG4gICAgICAgICAgICAgIHBhcmFtTmFtZTogcGFyYW1OYW1lLFxuICAgICAgICAgICAgICBtZXRhZGF0YTogbWV0YWRhdGEsXG4gICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgcmV0dXJuUGFyc2VyO1xubW9kdWxlLmV4cG9ydHMgPSByZXR1cm5QYXJzZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFJQTs7QUFFQTs7QUFDQTs7OztBQVBBO0FBU0EsU0FBU0EsWUFBVCxDQUFzQkMsTUFBdEIsRUFBc0NDLE9BQXRDLEVBQThEQyxRQUE5RCxFQUEyRztFQUN6R0YsTUFBTSxDQUFDRyxZQUFQLENBQXFCQyxZQUFELElBQWtCO0lBQ3BDSixNQUFNLENBQUNLLFlBQVAsQ0FBcUJDLFNBQUQsSUFBZTtNQUNqQyxJQUFJQSxTQUFTLENBQUNDLE1BQVYsQ0FBaUIsQ0FBakIsTUFBd0IsR0FBNUIsRUFBaUM7UUFDL0JELFNBQVMsR0FBR0EsU0FBUyxDQUFDRSxLQUFWLENBQWdCLENBQWhCLENBQVo7TUFDRCxDQUhnQyxDQUtqQzs7O01BQ0FSLE1BQU0sQ0FBQ1MsU0FBUCxDQUFpQixNQUFNO1FBQ3JCLDZCQUFjVCxNQUFkLEVBQXNCQyxPQUF0QixFQUFnQ1MsUUFBRCxJQUFjO1VBQzNDLDBCQUFXVixNQUFYLEVBQW1CVSxRQUFuQixFQUE2QlQsT0FBN0IsRUFBdUNVLEtBQUQsSUFBVztZQUMvQ1QsUUFBUSxDQUFDLElBQUlVLHVCQUFKLENBQXFCO2NBQzVCUixZQUFZLEVBQUVBLFlBRGM7Y0FFNUJFLFNBQVMsRUFBRUEsU0FGaUI7Y0FHNUJJLFFBQVEsRUFBRUEsUUFIa0I7Y0FJNUJDLEtBQUssRUFBRUE7WUFKcUIsQ0FBckIsQ0FBRCxDQUFSO1VBTUQsQ0FQRDtRQVFELENBVEQ7TUFVRCxDQVhEO0lBWUQsQ0FsQkQ7RUFtQkQsQ0FwQkQ7QUFxQkQ7O2VBRWNaLFk7O0FBQ2ZjLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQmYsWUFBakIifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _token = require("./token");

var _valueParser = _interopRequireDefault(require("../value-parser"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// s2.2.7.17
async function rowParser(parser) {
  const colMetadata = parser.colMetadata;
  const length = colMetadata.length;
  const columns = [];

  for (let i = 0; i < length; i++) {
    const currColMetadata = colMetadata[i];
    let value;
    (0, _valueParser.default)(parser, currColMetadata, parser.options, v => {
      value = v;
    });

    while (parser.suspended) {
      await parser.streamBuffer.waitForChunk();
      parser.suspended = false;
      const next = parser.next;
      next();
    }

    columns.push({
      value,
      metadata: currColMetadata
    });
  }

  if (parser.options.useColumnNames) {
    const columnsMap = Object.create(null);
    columns.forEach(column => {
      const colName = column.metadata.colName;

      if (columnsMap[colName] == null) {
        columnsMap[colName] = column;
      }
    });
    return new _token.RowToken(columnsMap);
  } else {
    return new _token.RowToken(columns);
  }
}

var _default = rowParser;
exports.default = _default;
module.exports = rowParser;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyb3dQYXJzZXIiLCJwYXJzZXIiLCJjb2xNZXRhZGF0YSIsImxlbmd0aCIsImNvbHVtbnMiLCJpIiwiY3VyckNvbE1ldGFkYXRhIiwidmFsdWUiLCJvcHRpb25zIiwidiIsInN1c3BlbmRlZCIsInN0cmVhbUJ1ZmZlciIsIndhaXRGb3JDaHVuayIsIm5leHQiLCJwdXNoIiwibWV0YWRhdGEiLCJ1c2VDb2x1bW5OYW1lcyIsImNvbHVtbnNNYXAiLCJPYmplY3QiLCJjcmVhdGUiLCJmb3JFYWNoIiwiY29sdW1uIiwiY29sTmFtZSIsIlJvd1Rva2VuIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b2tlbi9yb3ctdG9rZW4tcGFyc2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHMyLjIuNy4xN1xuXG5pbXBvcnQgUGFyc2VyIGZyb20gJy4vc3RyZWFtLXBhcnNlcic7XG5pbXBvcnQgeyBDb2x1bW5NZXRhZGF0YSB9IGZyb20gJy4vY29sbWV0YWRhdGEtdG9rZW4tcGFyc2VyJztcblxuaW1wb3J0IHsgUm93VG9rZW4gfSBmcm9tICcuL3Rva2VuJztcblxuaW1wb3J0IHZhbHVlUGFyc2UgZnJvbSAnLi4vdmFsdWUtcGFyc2VyJztcblxuaW50ZXJmYWNlIENvbHVtbiB7XG4gIHZhbHVlOiB1bmtub3duO1xuICBtZXRhZGF0YTogQ29sdW1uTWV0YWRhdGE7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJvd1BhcnNlcihwYXJzZXI6IFBhcnNlcik6IFByb21pc2U8Um93VG9rZW4+IHtcbiAgY29uc3QgY29sTWV0YWRhdGEgPSBwYXJzZXIuY29sTWV0YWRhdGE7XG4gIGNvbnN0IGxlbmd0aCA9IGNvbE1ldGFkYXRhLmxlbmd0aDtcbiAgY29uc3QgY29sdW1uczogQ29sdW1uW10gPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY3VyckNvbE1ldGFkYXRhID0gY29sTWV0YWRhdGFbaV07XG4gICAgbGV0IHZhbHVlO1xuICAgIHZhbHVlUGFyc2UocGFyc2VyLCBjdXJyQ29sTWV0YWRhdGEsIHBhcnNlci5vcHRpb25zLCAodikgPT4ge1xuICAgICAgdmFsdWUgPSB2O1xuICAgIH0pO1xuXG4gICAgd2hpbGUgKHBhcnNlci5zdXNwZW5kZWQpIHtcbiAgICAgIGF3YWl0IHBhcnNlci5zdHJlYW1CdWZmZXIud2FpdEZvckNodW5rKCk7XG5cbiAgICAgIHBhcnNlci5zdXNwZW5kZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IG5leHQgPSBwYXJzZXIubmV4dCE7XG5cbiAgICAgIG5leHQoKTtcbiAgICB9XG4gICAgY29sdW1ucy5wdXNoKHtcbiAgICAgIHZhbHVlLFxuICAgICAgbWV0YWRhdGE6IGN1cnJDb2xNZXRhZGF0YVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHBhcnNlci5vcHRpb25zLnVzZUNvbHVtbk5hbWVzKSB7XG4gICAgY29uc3QgY29sdW1uc01hcDogeyBba2V5OiBzdHJpbmddOiBDb2x1bW4gfSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgY29uc3QgY29sTmFtZSA9IGNvbHVtbi5tZXRhZGF0YS5jb2xOYW1lO1xuICAgICAgaWYgKGNvbHVtbnNNYXBbY29sTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICBjb2x1bW5zTWFwW2NvbE5hbWVdID0gY29sdW1uO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBSb3dUb2tlbihjb2x1bW5zTWFwKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IFJvd1Rva2VuKGNvbHVtbnMpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHJvd1BhcnNlcjtcbm1vZHVsZS5leHBvcnRzID0gcm93UGFyc2VyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBS0E7O0FBRUE7Ozs7QUFQQTtBQWNBLGVBQWVBLFNBQWYsQ0FBeUJDLE1BQXpCLEVBQTREO0VBQzFELE1BQU1DLFdBQVcsR0FBR0QsTUFBTSxDQUFDQyxXQUEzQjtFQUNBLE1BQU1DLE1BQU0sR0FBR0QsV0FBVyxDQUFDQyxNQUEzQjtFQUNBLE1BQU1DLE9BQWlCLEdBQUcsRUFBMUI7O0VBRUEsS0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHRixNQUFwQixFQUE0QkUsQ0FBQyxFQUE3QixFQUFpQztJQUMvQixNQUFNQyxlQUFlLEdBQUdKLFdBQVcsQ0FBQ0csQ0FBRCxDQUFuQztJQUNBLElBQUlFLEtBQUo7SUFDQSwwQkFBV04sTUFBWCxFQUFtQkssZUFBbkIsRUFBb0NMLE1BQU0sQ0FBQ08sT0FBM0MsRUFBcURDLENBQUQsSUFBTztNQUN6REYsS0FBSyxHQUFHRSxDQUFSO0lBQ0QsQ0FGRDs7SUFJQSxPQUFPUixNQUFNLENBQUNTLFNBQWQsRUFBeUI7TUFDdkIsTUFBTVQsTUFBTSxDQUFDVSxZQUFQLENBQW9CQyxZQUFwQixFQUFOO01BRUFYLE1BQU0sQ0FBQ1MsU0FBUCxHQUFtQixLQUFuQjtNQUNBLE1BQU1HLElBQUksR0FBR1osTUFBTSxDQUFDWSxJQUFwQjtNQUVBQSxJQUFJO0lBQ0w7O0lBQ0RULE9BQU8sQ0FBQ1UsSUFBUixDQUFhO01BQ1hQLEtBRFc7TUFFWFEsUUFBUSxFQUFFVDtJQUZDLENBQWI7RUFJRDs7RUFFRCxJQUFJTCxNQUFNLENBQUNPLE9BQVAsQ0FBZVEsY0FBbkIsRUFBbUM7SUFDakMsTUFBTUMsVUFBcUMsR0FBR0MsTUFBTSxDQUFDQyxNQUFQLENBQWMsSUFBZCxDQUE5QztJQUVBZixPQUFPLENBQUNnQixPQUFSLENBQWlCQyxNQUFELElBQVk7TUFDMUIsTUFBTUMsT0FBTyxHQUFHRCxNQUFNLENBQUNOLFFBQVAsQ0FBZ0JPLE9BQWhDOztNQUNBLElBQUlMLFVBQVUsQ0FBQ0ssT0FBRCxDQUFWLElBQXVCLElBQTNCLEVBQWlDO1FBQy9CTCxVQUFVLENBQUNLLE9BQUQsQ0FBVixHQUFzQkQsTUFBdEI7TUFDRDtJQUNGLENBTEQ7SUFPQSxPQUFPLElBQUlFLGVBQUosQ0FBYU4sVUFBYixDQUFQO0VBQ0QsQ0FYRCxNQVdPO0lBQ0wsT0FBTyxJQUFJTSxlQUFKLENBQWFuQixPQUFiLENBQVA7RUFDRDtBQUNGOztlQUVjSixTOztBQUNmd0IsTUFBTSxDQUFDQyxPQUFQLEdBQWlCekIsU0FBakIifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _token = require("./token");

function parseChallenge(buffer) {
  const challenge = {};
  challenge.magic = buffer.slice(0, 8).toString('utf8');
  challenge.type = buffer.readInt32LE(8);
  challenge.domainLen = buffer.readInt16LE(12);
  challenge.domainMax = buffer.readInt16LE(14);
  challenge.domainOffset = buffer.readInt32LE(16);
  challenge.flags = buffer.readInt32LE(20);
  challenge.nonce = buffer.slice(24, 32);
  challenge.zeroes = buffer.slice(32, 40);
  challenge.targetLen = buffer.readInt16LE(40);
  challenge.targetMax = buffer.readInt16LE(42);
  challenge.targetOffset = buffer.readInt32LE(44);
  challenge.oddData = buffer.slice(48, 56);
  challenge.domain = buffer.slice(56, 56 + challenge.domainLen).toString('ucs2');
  challenge.target = buffer.slice(56 + challenge.domainLen, 56 + challenge.domainLen + challenge.targetLen);
  return challenge;
}

function sspiParser(parser, _options, callback) {
  parser.readUsVarByte(buffer => {
    callback(new _token.SSPIToken(parseChallenge(buffer), buffer));
  });
}

var _default = sspiParser;
exports.default = _default;
module.exports = sspiParser;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwYXJzZUNoYWxsZW5nZSIsImJ1ZmZlciIsImNoYWxsZW5nZSIsIm1hZ2ljIiwic2xpY2UiLCJ0b1N0cmluZyIsInR5cGUiLCJyZWFkSW50MzJMRSIsImRvbWFpbkxlbiIsInJlYWRJbnQxNkxFIiwiZG9tYWluTWF4IiwiZG9tYWluT2Zmc2V0IiwiZmxhZ3MiLCJub25jZSIsInplcm9lcyIsInRhcmdldExlbiIsInRhcmdldE1heCIsInRhcmdldE9mZnNldCIsIm9kZERhdGEiLCJkb21haW4iLCJ0YXJnZXQiLCJzc3BpUGFyc2VyIiwicGFyc2VyIiwiX29wdGlvbnMiLCJjYWxsYmFjayIsInJlYWRVc1ZhckJ5dGUiLCJTU1BJVG9rZW4iLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rva2VuL3NzcGktdG9rZW4tcGFyc2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQYXJzZXIsIHsgUGFyc2VyT3B0aW9ucyB9IGZyb20gJy4vc3RyZWFtLXBhcnNlcic7XG5cbmltcG9ydCB7IFNTUElUb2tlbiB9IGZyb20gJy4vdG9rZW4nO1xuXG5pbnRlcmZhY2UgRGF0YSB7XG4gIG1hZ2ljOiBzdHJpbmc7XG4gIHR5cGU6IG51bWJlcjtcbiAgZG9tYWluTGVuOiBudW1iZXI7XG4gIGRvbWFpbk1heDogbnVtYmVyO1xuICBkb21haW5PZmZzZXQ6IG51bWJlcjtcbiAgZmxhZ3M6IG51bWJlcjtcbiAgbm9uY2U6IEJ1ZmZlcjtcbiAgemVyb2VzOiBCdWZmZXI7XG4gIHRhcmdldExlbjogbnVtYmVyO1xuICB0YXJnZXRNYXg6IG51bWJlcjtcbiAgdGFyZ2V0T2Zmc2V0OiBudW1iZXI7XG4gIG9kZERhdGE6IEJ1ZmZlcjtcbiAgZG9tYWluOiBzdHJpbmc7XG4gIHRhcmdldDogQnVmZmVyO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNoYWxsZW5nZShidWZmZXI6IEJ1ZmZlcikge1xuICBjb25zdCBjaGFsbGVuZ2U6IFBhcnRpYWw8RGF0YT4gPSB7fTtcblxuICBjaGFsbGVuZ2UubWFnaWMgPSBidWZmZXIuc2xpY2UoMCwgOCkudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgY2hhbGxlbmdlLnR5cGUgPSBidWZmZXIucmVhZEludDMyTEUoOCk7XG4gIGNoYWxsZW5nZS5kb21haW5MZW4gPSBidWZmZXIucmVhZEludDE2TEUoMTIpO1xuICBjaGFsbGVuZ2UuZG9tYWluTWF4ID0gYnVmZmVyLnJlYWRJbnQxNkxFKDE0KTtcbiAgY2hhbGxlbmdlLmRvbWFpbk9mZnNldCA9IGJ1ZmZlci5yZWFkSW50MzJMRSgxNik7XG4gIGNoYWxsZW5nZS5mbGFncyA9IGJ1ZmZlci5yZWFkSW50MzJMRSgyMCk7XG4gIGNoYWxsZW5nZS5ub25jZSA9IGJ1ZmZlci5zbGljZSgyNCwgMzIpO1xuICBjaGFsbGVuZ2UuemVyb2VzID0gYnVmZmVyLnNsaWNlKDMyLCA0MCk7XG4gIGNoYWxsZW5nZS50YXJnZXRMZW4gPSBidWZmZXIucmVhZEludDE2TEUoNDApO1xuICBjaGFsbGVuZ2UudGFyZ2V0TWF4ID0gYnVmZmVyLnJlYWRJbnQxNkxFKDQyKTtcbiAgY2hhbGxlbmdlLnRhcmdldE9mZnNldCA9IGJ1ZmZlci5yZWFkSW50MzJMRSg0NCk7XG4gIGNoYWxsZW5nZS5vZGREYXRhID0gYnVmZmVyLnNsaWNlKDQ4LCA1Nik7XG4gIGNoYWxsZW5nZS5kb21haW4gPSBidWZmZXIuc2xpY2UoNTYsIDU2ICsgY2hhbGxlbmdlLmRvbWFpbkxlbikudG9TdHJpbmcoJ3VjczInKTtcbiAgY2hhbGxlbmdlLnRhcmdldCA9IGJ1ZmZlci5zbGljZSg1NiArIGNoYWxsZW5nZS5kb21haW5MZW4sIDU2ICsgY2hhbGxlbmdlLmRvbWFpbkxlbiArIGNoYWxsZW5nZS50YXJnZXRMZW4pO1xuXG4gIHJldHVybiBjaGFsbGVuZ2UgYXMgRGF0YTtcbn1cblxuZnVuY3Rpb24gc3NwaVBhcnNlcihwYXJzZXI6IFBhcnNlciwgX29wdGlvbnM6IFBhcnNlck9wdGlvbnMsIGNhbGxiYWNrOiAodG9rZW46IFNTUElUb2tlbikgPT4gdm9pZCkge1xuICBwYXJzZXIucmVhZFVzVmFyQnl0ZSgoYnVmZmVyKSA9PiB7XG4gICAgY2FsbGJhY2sobmV3IFNTUElUb2tlbihwYXJzZUNoYWxsZW5nZShidWZmZXIpLCBidWZmZXIpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNzcGlQYXJzZXI7XG5tb2R1bGUuZXhwb3J0cyA9IHNzcGlQYXJzZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFFQTs7QUFtQkEsU0FBU0EsY0FBVCxDQUF3QkMsTUFBeEIsRUFBd0M7RUFDdEMsTUFBTUMsU0FBd0IsR0FBRyxFQUFqQztFQUVBQSxTQUFTLENBQUNDLEtBQVYsR0FBa0JGLE1BQU0sQ0FBQ0csS0FBUCxDQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUJDLFFBQW5CLENBQTRCLE1BQTVCLENBQWxCO0VBQ0FILFNBQVMsQ0FBQ0ksSUFBVixHQUFpQkwsTUFBTSxDQUFDTSxXQUFQLENBQW1CLENBQW5CLENBQWpCO0VBQ0FMLFNBQVMsQ0FBQ00sU0FBVixHQUFzQlAsTUFBTSxDQUFDUSxXQUFQLENBQW1CLEVBQW5CLENBQXRCO0VBQ0FQLFNBQVMsQ0FBQ1EsU0FBVixHQUFzQlQsTUFBTSxDQUFDUSxXQUFQLENBQW1CLEVBQW5CLENBQXRCO0VBQ0FQLFNBQVMsQ0FBQ1MsWUFBVixHQUF5QlYsTUFBTSxDQUFDTSxXQUFQLENBQW1CLEVBQW5CLENBQXpCO0VBQ0FMLFNBQVMsQ0FBQ1UsS0FBVixHQUFrQlgsTUFBTSxDQUFDTSxXQUFQLENBQW1CLEVBQW5CLENBQWxCO0VBQ0FMLFNBQVMsQ0FBQ1csS0FBVixHQUFrQlosTUFBTSxDQUFDRyxLQUFQLENBQWEsRUFBYixFQUFpQixFQUFqQixDQUFsQjtFQUNBRixTQUFTLENBQUNZLE1BQVYsR0FBbUJiLE1BQU0sQ0FBQ0csS0FBUCxDQUFhLEVBQWIsRUFBaUIsRUFBakIsQ0FBbkI7RUFDQUYsU0FBUyxDQUFDYSxTQUFWLEdBQXNCZCxNQUFNLENBQUNRLFdBQVAsQ0FBbUIsRUFBbkIsQ0FBdEI7RUFDQVAsU0FBUyxDQUFDYyxTQUFWLEdBQXNCZixNQUFNLENBQUNRLFdBQVAsQ0FBbUIsRUFBbkIsQ0FBdEI7RUFDQVAsU0FBUyxDQUFDZSxZQUFWLEdBQXlCaEIsTUFBTSxDQUFDTSxXQUFQLENBQW1CLEVBQW5CLENBQXpCO0VBQ0FMLFNBQVMsQ0FBQ2dCLE9BQVYsR0FBb0JqQixNQUFNLENBQUNHLEtBQVAsQ0FBYSxFQUFiLEVBQWlCLEVBQWpCLENBQXBCO0VBQ0FGLFNBQVMsQ0FBQ2lCLE1BQVYsR0FBbUJsQixNQUFNLENBQUNHLEtBQVAsQ0FBYSxFQUFiLEVBQWlCLEtBQUtGLFNBQVMsQ0FBQ00sU0FBaEMsRUFBMkNILFFBQTNDLENBQW9ELE1BQXBELENBQW5CO0VBQ0FILFNBQVMsQ0FBQ2tCLE1BQVYsR0FBbUJuQixNQUFNLENBQUNHLEtBQVAsQ0FBYSxLQUFLRixTQUFTLENBQUNNLFNBQTVCLEVBQXVDLEtBQUtOLFNBQVMsQ0FBQ00sU0FBZixHQUEyQk4sU0FBUyxDQUFDYSxTQUE1RSxDQUFuQjtFQUVBLE9BQU9iLFNBQVA7QUFDRDs7QUFFRCxTQUFTbUIsVUFBVCxDQUFvQkMsTUFBcEIsRUFBb0NDLFFBQXBDLEVBQTZEQyxRQUE3RCxFQUFtRztFQUNqR0YsTUFBTSxDQUFDRyxhQUFQLENBQXNCeEIsTUFBRCxJQUFZO0lBQy9CdUIsUUFBUSxDQUFDLElBQUlFLGdCQUFKLENBQWMxQixjQUFjLENBQUNDLE1BQUQsQ0FBNUIsRUFBc0NBLE1BQXRDLENBQUQsQ0FBUjtFQUNELENBRkQ7QUFHRDs7ZUFFY29CLFU7O0FBQ2ZNLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQlAsVUFBakIifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _jsbi = _interopRequireDefault(require("jsbi"));

var _token = require("./token");

var _colmetadataTokenParser = _interopRequireDefault(require("./colmetadata-token-parser"));

var _doneTokenParser = require("./done-token-parser");

var _envChangeTokenParser = _interopRequireDefault(require("./env-change-token-parser"));

var _infoerrorTokenParser = require("./infoerror-token-parser");

var _fedauthInfoParser = _interopRequireDefault(require("./fedauth-info-parser"));

var _featureExtAckParser = _interopRequireDefault(require("./feature-ext-ack-parser"));

var _loginackTokenParser = _interopRequireDefault(require("./loginack-token-parser"));

var _orderTokenParser = _interopRequireDefault(require("./order-token-parser"));

var _returnstatusTokenParser = _interopRequireDefault(require("./returnstatus-token-parser"));

var _returnvalueTokenParser = _interopRequireDefault(require("./returnvalue-token-parser"));

var _rowTokenParser = _interopRequireDefault(require("./row-token-parser"));

var _nbcrowTokenParser = _interopRequireDefault(require("./nbcrow-token-parser"));

var _sspiTokenParser = _interopRequireDefault(require("./sspi-token-parser"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const tokenParsers = {
  [_token.TYPE.DONE]: _doneTokenParser.doneParser,
  [_token.TYPE.DONEINPROC]: _doneTokenParser.doneInProcParser,
  [_token.TYPE.DONEPROC]: _doneTokenParser.doneProcParser,
  [_token.TYPE.ENVCHANGE]: _envChangeTokenParser.default,
  [_token.TYPE.ERROR]: _infoerrorTokenParser.errorParser,
  [_token.TYPE.FEDAUTHINFO]: _fedauthInfoParser.default,
  [_token.TYPE.FEATUREEXTACK]: _featureExtAckParser.default,
  [_token.TYPE.INFO]: _infoerrorTokenParser.infoParser,
  [_token.TYPE.LOGINACK]: _loginackTokenParser.default,
  [_token.TYPE.ORDER]: _orderTokenParser.default,
  [_token.TYPE.RETURNSTATUS]: _returnstatusTokenParser.default,
  [_token.TYPE.RETURNVALUE]: _returnvalueTokenParser.default,
  [_token.TYPE.SSPI]: _sspiTokenParser.default
};

class StreamBuffer {
  constructor(iterable) {
    this.iterator = void 0;
    this.buffer = void 0;
    this.position = void 0;
    this.iterator = (iterable[Symbol.asyncIterator] || iterable[Symbol.iterator]).call(iterable);
    this.buffer = Buffer.alloc(0);
    this.position = 0;
  }

  async waitForChunk() {
    const result = await this.iterator.next();

    if (result.done) {
      throw new Error('unexpected end of data');
    }

    if (this.position === this.buffer.length) {
      this.buffer = result.value;
    } else {
      this.buffer = Buffer.concat([this.buffer.slice(this.position), result.value]);
    }

    this.position = 0;
  }

}

class Parser {
  static async *parseTokens(iterable, debug, options, colMetadata = []) {
    let token;

    const onDoneParsing = t => {
      token = t;
    };

    const streamBuffer = new StreamBuffer(iterable);
    const parser = new Parser(streamBuffer, debug, options);
    parser.colMetadata = colMetadata;

    while (true) {
      try {
        await streamBuffer.waitForChunk();
      } catch (err) {
        if (streamBuffer.position === streamBuffer.buffer.length) {
          return;
        }

        throw err;
      }

      if (parser.suspended) {
        // Unsuspend and continue from where ever we left off.
        parser.suspended = false;
        const next = parser.next;
        next(); // Check if a new token was parsed after unsuspension.

        if (!parser.suspended && token) {
          if (token instanceof _token.ColMetadataToken) {
            parser.colMetadata = token.columns;
          }

          yield token;
        }
      }

      while (!parser.suspended && parser.position + 1 <= parser.buffer.length) {
        const type = parser.buffer.readUInt8(parser.position);
        parser.position += 1;

        if (type === _token.TYPE.COLMETADATA) {
          const token = await (0, _colmetadataTokenParser.default)(parser);
          parser.colMetadata = token.columns;
          yield token;
        } else if (type === _token.TYPE.ROW) {
          yield (0, _rowTokenParser.default)(parser);
        } else if (type === _token.TYPE.NBCROW) {
          yield (0, _nbcrowTokenParser.default)(parser);
        } else if (tokenParsers[type]) {
          tokenParsers[type](parser, parser.options, onDoneParsing); // Check if a new token was parsed after unsuspension.

          if (!parser.suspended && token) {
            if (token instanceof _token.ColMetadataToken) {
              parser.colMetadata = token.columns;
            }

            yield token;
          }
        } else {
          throw new Error('Unknown type: ' + type);
        }
      }
    }
  }

  constructor(streamBuffer, debug, options) {
    this.debug = void 0;
    this.colMetadata = void 0;
    this.options = void 0;
    this.suspended = void 0;
    this.next = void 0;
    this.streamBuffer = void 0;
    this.debug = debug;
    this.colMetadata = [];
    this.options = options;
    this.streamBuffer = streamBuffer;
    this.suspended = false;
    this.next = undefined;
  }

  get buffer() {
    return this.streamBuffer.buffer;
  }

  get position() {
    return this.streamBuffer.position;
  }

  set position(value) {
    this.streamBuffer.position = value;
  }

  suspend(next) {
    this.suspended = true;
    this.next = next;
  }

  awaitData(length, callback) {
    if (this.position + length <= this.buffer.length) {
      callback();
    } else {
      this.suspend(() => {
        this.awaitData(length, callback);
      });
    }
  }

  readInt8(callback) {
    this.awaitData(1, () => {
      const data = this.buffer.readInt8(this.position);
      this.position += 1;
      callback(data);
    });
  }

  readUInt8(callback) {
    this.awaitData(1, () => {
      const data = this.buffer.readUInt8(this.position);
      this.position += 1;
      callback(data);
    });
  }

  readInt16LE(callback) {
    this.awaitData(2, () => {
      const data = this.buffer.readInt16LE(this.position);
      this.position += 2;
      callback(data);
    });
  }

  readInt16BE(callback) {
    this.awaitData(2, () => {
      const data = this.buffer.readInt16BE(this.position);
      this.position += 2;
      callback(data);
    });
  }

  readUInt16LE(callback) {
    this.awaitData(2, () => {
      const data = this.buffer.readUInt16LE(this.position);
      this.position += 2;
      callback(data);
    });
  }

  readUInt16BE(callback) {
    this.awaitData(2, () => {
      const data = this.buffer.readUInt16BE(this.position);
      this.position += 2;
      callback(data);
    });
  }

  readInt32LE(callback) {
    this.awaitData(4, () => {
      const data = this.buffer.readInt32LE(this.position);
      this.position += 4;
      callback(data);
    });
  }

  readInt32BE(callback) {
    this.awaitData(4, () => {
      const data = this.buffer.readInt32BE(this.position);
      this.position += 4;
      callback(data);
    });
  }

  readUInt32LE(callback) {
    this.awaitData(4, () => {
      const data = this.buffer.readUInt32LE(this.position);
      this.position += 4;
      callback(data);
    });
  }

  readUInt32BE(callback) {
    this.awaitData(4, () => {
      const data = this.buffer.readUInt32BE(this.position);
      this.position += 4;
      callback(data);
    });
  }

  readBigInt64LE(callback) {
    this.awaitData(8, () => {
      const result = _jsbi.default.add(_jsbi.default.leftShift(_jsbi.default.BigInt(this.buffer[this.position + 4] + this.buffer[this.position + 5] * 2 ** 8 + this.buffer[this.position + 6] * 2 ** 16 + (this.buffer[this.position + 7] << 24) // Overflow
      ), _jsbi.default.BigInt(32)), _jsbi.default.BigInt(this.buffer[this.position] + this.buffer[this.position + 1] * 2 ** 8 + this.buffer[this.position + 2] * 2 ** 16 + this.buffer[this.position + 3] * 2 ** 24));

      this.position += 8;
      callback(result);
    });
  }

  readInt64LE(callback) {
    this.awaitData(8, () => {
      const data = Math.pow(2, 32) * this.buffer.readInt32LE(this.position + 4) + ((this.buffer[this.position + 4] & 0x80) === 0x80 ? 1 : -1) * this.buffer.readUInt32LE(this.position);
      this.position += 8;
      callback(data);
    });
  }

  readInt64BE(callback) {
    this.awaitData(8, () => {
      const data = Math.pow(2, 32) * this.buffer.readInt32BE(this.position) + ((this.buffer[this.position] & 0x80) === 0x80 ? 1 : -1) * this.buffer.readUInt32BE(this.position + 4);
      this.position += 8;
      callback(data);
    });
  }

  readBigUInt64LE(callback) {
    this.awaitData(8, () => {
      const low = _jsbi.default.BigInt(this.buffer.readUInt32LE(this.position));

      const high = _jsbi.default.BigInt(this.buffer.readUInt32LE(this.position + 4));

      this.position += 8;
      callback(_jsbi.default.add(low, _jsbi.default.leftShift(high, _jsbi.default.BigInt(32))));
    });
  }

  readUInt64LE(callback) {
    this.awaitData(8, () => {
      const data = Math.pow(2, 32) * this.buffer.readUInt32LE(this.position + 4) + this.buffer.readUInt32LE(this.position);
      this.position += 8;
      callback(data);
    });
  }

  readUInt64BE(callback) {
    this.awaitData(8, () => {
      const data = Math.pow(2, 32) * this.buffer.readUInt32BE(this.position) + this.buffer.readUInt32BE(this.position + 4);
      this.position += 8;
      callback(data);
    });
  }

  readFloatLE(callback) {
    this.awaitData(4, () => {
      const data = this.buffer.readFloatLE(this.position);
      this.position += 4;
      callback(data);
    });
  }

  readFloatBE(callback) {
    this.awaitData(4, () => {
      const data = this.buffer.readFloatBE(this.position);
      this.position += 4;
      callback(data);
    });
  }

  readDoubleLE(callback) {
    this.awaitData(8, () => {
      const data = this.buffer.readDoubleLE(this.position);
      this.position += 8;
      callback(data);
    });
  }

  readDoubleBE(callback) {
    this.awaitData(8, () => {
      const data = this.buffer.readDoubleBE(this.position);
      this.position += 8;
      callback(data);
    });
  }

  readUInt24LE(callback) {
    this.awaitData(3, () => {
      const low = this.buffer.readUInt16LE(this.position);
      const high = this.buffer.readUInt8(this.position + 2);
      this.position += 3;
      callback(low | high << 16);
    });
  }

  readUInt40LE(callback) {
    this.awaitData(5, () => {
      const low = this.buffer.readUInt32LE(this.position);
      const high = this.buffer.readUInt8(this.position + 4);
      this.position += 5;
      callback(0x100000000 * high + low);
    });
  }

  readUNumeric64LE(callback) {
    this.awaitData(8, () => {
      const low = this.buffer.readUInt32LE(this.position);
      const high = this.buffer.readUInt32LE(this.position + 4);
      this.position += 8;
      callback(0x100000000 * high + low);
    });
  }

  readUNumeric96LE(callback) {
    this.awaitData(12, () => {
      const dword1 = this.buffer.readUInt32LE(this.position);
      const dword2 = this.buffer.readUInt32LE(this.position + 4);
      const dword3 = this.buffer.readUInt32LE(this.position + 8);
      this.position += 12;
      callback(dword1 + 0x100000000 * dword2 + 0x100000000 * 0x100000000 * dword3);
    });
  }

  readUNumeric128LE(callback) {
    this.awaitData(16, () => {
      const dword1 = this.buffer.readUInt32LE(this.position);
      const dword2 = this.buffer.readUInt32LE(this.position + 4);
      const dword3 = this.buffer.readUInt32LE(this.position + 8);
      const dword4 = this.buffer.readUInt32LE(this.position + 12);
      this.position += 16;
      callback(dword1 + 0x100000000 * dword2 + 0x100000000 * 0x100000000 * dword3 + 0x100000000 * 0x100000000 * 0x100000000 * dword4);
    });
  } // Variable length data


  readBuffer(length, callback) {
    this.awaitData(length, () => {
      const data = this.buffer.slice(this.position, this.position + length);
      this.position += length;
      callback(data);
    });
  } // Read a Unicode String (BVARCHAR)


  readBVarChar(callback) {
    this.readUInt8(length => {
      this.readBuffer(length * 2, data => {
        callback(data.toString('ucs2'));
      });
    });
  } // Read a Unicode String (USVARCHAR)


  readUsVarChar(callback) {
    this.readUInt16LE(length => {
      this.readBuffer(length * 2, data => {
        callback(data.toString('ucs2'));
      });
    });
  } // Read binary data (BVARBYTE)


  readBVarByte(callback) {
    this.readUInt8(length => {
      this.readBuffer(length, callback);
    });
  } // Read binary data (USVARBYTE)


  readUsVarByte(callback) {
    this.readUInt16LE(length => {
      this.readBuffer(length, callback);
    });
  }

}

var _default = Parser;
exports.default = _default;
module.exports = Parser;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0b2tlblBhcnNlcnMiLCJUWVBFIiwiRE9ORSIsImRvbmVQYXJzZXIiLCJET05FSU5QUk9DIiwiZG9uZUluUHJvY1BhcnNlciIsIkRPTkVQUk9DIiwiZG9uZVByb2NQYXJzZXIiLCJFTlZDSEFOR0UiLCJlbnZDaGFuZ2VQYXJzZXIiLCJFUlJPUiIsImVycm9yUGFyc2VyIiwiRkVEQVVUSElORk8iLCJmZWRBdXRoSW5mb1BhcnNlciIsIkZFQVRVUkVFWFRBQ0siLCJmZWF0dXJlRXh0QWNrUGFyc2VyIiwiSU5GTyIsImluZm9QYXJzZXIiLCJMT0dJTkFDSyIsImxvZ2luQWNrUGFyc2VyIiwiT1JERVIiLCJvcmRlclBhcnNlciIsIlJFVFVSTlNUQVRVUyIsInJldHVyblN0YXR1c1BhcnNlciIsIlJFVFVSTlZBTFVFIiwicmV0dXJuVmFsdWVQYXJzZXIiLCJTU1BJIiwic3NwaVBhcnNlciIsIlN0cmVhbUJ1ZmZlciIsImNvbnN0cnVjdG9yIiwiaXRlcmFibGUiLCJpdGVyYXRvciIsImJ1ZmZlciIsInBvc2l0aW9uIiwiU3ltYm9sIiwiYXN5bmNJdGVyYXRvciIsImNhbGwiLCJCdWZmZXIiLCJhbGxvYyIsIndhaXRGb3JDaHVuayIsInJlc3VsdCIsIm5leHQiLCJkb25lIiwiRXJyb3IiLCJsZW5ndGgiLCJ2YWx1ZSIsImNvbmNhdCIsInNsaWNlIiwiUGFyc2VyIiwicGFyc2VUb2tlbnMiLCJkZWJ1ZyIsIm9wdGlvbnMiLCJjb2xNZXRhZGF0YSIsInRva2VuIiwib25Eb25lUGFyc2luZyIsInQiLCJzdHJlYW1CdWZmZXIiLCJwYXJzZXIiLCJlcnIiLCJzdXNwZW5kZWQiLCJDb2xNZXRhZGF0YVRva2VuIiwiY29sdW1ucyIsInR5cGUiLCJyZWFkVUludDgiLCJDT0xNRVRBREFUQSIsIlJPVyIsIk5CQ1JPVyIsInVuZGVmaW5lZCIsInN1c3BlbmQiLCJhd2FpdERhdGEiLCJjYWxsYmFjayIsInJlYWRJbnQ4IiwiZGF0YSIsInJlYWRJbnQxNkxFIiwicmVhZEludDE2QkUiLCJyZWFkVUludDE2TEUiLCJyZWFkVUludDE2QkUiLCJyZWFkSW50MzJMRSIsInJlYWRJbnQzMkJFIiwicmVhZFVJbnQzMkxFIiwicmVhZFVJbnQzMkJFIiwicmVhZEJpZ0ludDY0TEUiLCJKU0JJIiwiYWRkIiwibGVmdFNoaWZ0IiwiQmlnSW50IiwicmVhZEludDY0TEUiLCJNYXRoIiwicG93IiwicmVhZEludDY0QkUiLCJyZWFkQmlnVUludDY0TEUiLCJsb3ciLCJoaWdoIiwicmVhZFVJbnQ2NExFIiwicmVhZFVJbnQ2NEJFIiwicmVhZEZsb2F0TEUiLCJyZWFkRmxvYXRCRSIsInJlYWREb3VibGVMRSIsInJlYWREb3VibGVCRSIsInJlYWRVSW50MjRMRSIsInJlYWRVSW50NDBMRSIsInJlYWRVTnVtZXJpYzY0TEUiLCJyZWFkVU51bWVyaWM5NkxFIiwiZHdvcmQxIiwiZHdvcmQyIiwiZHdvcmQzIiwicmVhZFVOdW1lcmljMTI4TEUiLCJkd29yZDQiLCJyZWFkQnVmZmVyIiwicmVhZEJWYXJDaGFyIiwidG9TdHJpbmciLCJyZWFkVXNWYXJDaGFyIiwicmVhZEJWYXJCeXRlIiwicmVhZFVzVmFyQnl0ZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdG9rZW4vc3RyZWFtLXBhcnNlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRGVidWcgZnJvbSAnLi4vZGVidWcnO1xuaW1wb3J0IHsgSW50ZXJuYWxDb25uZWN0aW9uT3B0aW9ucyB9IGZyb20gJy4uL2Nvbm5lY3Rpb24nO1xuaW1wb3J0IEpTQkkgZnJvbSAnanNiaSc7XG5cbmltcG9ydCB7IFRZUEUsIFRva2VuLCBDb2xNZXRhZGF0YVRva2VuIH0gZnJvbSAnLi90b2tlbic7XG5cbmltcG9ydCBjb2xNZXRhZGF0YVBhcnNlciwgeyBDb2x1bW5NZXRhZGF0YSB9IGZyb20gJy4vY29sbWV0YWRhdGEtdG9rZW4tcGFyc2VyJztcbmltcG9ydCB7IGRvbmVQYXJzZXIsIGRvbmVJblByb2NQYXJzZXIsIGRvbmVQcm9jUGFyc2VyIH0gZnJvbSAnLi9kb25lLXRva2VuLXBhcnNlcic7XG5pbXBvcnQgZW52Q2hhbmdlUGFyc2VyIGZyb20gJy4vZW52LWNoYW5nZS10b2tlbi1wYXJzZXInO1xuaW1wb3J0IHsgZXJyb3JQYXJzZXIsIGluZm9QYXJzZXIgfSBmcm9tICcuL2luZm9lcnJvci10b2tlbi1wYXJzZXInO1xuaW1wb3J0IGZlZEF1dGhJbmZvUGFyc2VyIGZyb20gJy4vZmVkYXV0aC1pbmZvLXBhcnNlcic7XG5pbXBvcnQgZmVhdHVyZUV4dEFja1BhcnNlciBmcm9tICcuL2ZlYXR1cmUtZXh0LWFjay1wYXJzZXInO1xuaW1wb3J0IGxvZ2luQWNrUGFyc2VyIGZyb20gJy4vbG9naW5hY2stdG9rZW4tcGFyc2VyJztcbmltcG9ydCBvcmRlclBhcnNlciBmcm9tICcuL29yZGVyLXRva2VuLXBhcnNlcic7XG5pbXBvcnQgcmV0dXJuU3RhdHVzUGFyc2VyIGZyb20gJy4vcmV0dXJuc3RhdHVzLXRva2VuLXBhcnNlcic7XG5pbXBvcnQgcmV0dXJuVmFsdWVQYXJzZXIgZnJvbSAnLi9yZXR1cm52YWx1ZS10b2tlbi1wYXJzZXInO1xuaW1wb3J0IHJvd1BhcnNlciBmcm9tICcuL3Jvdy10b2tlbi1wYXJzZXInO1xuaW1wb3J0IG5iY1Jvd1BhcnNlciBmcm9tICcuL25iY3Jvdy10b2tlbi1wYXJzZXInO1xuaW1wb3J0IHNzcGlQYXJzZXIgZnJvbSAnLi9zc3BpLXRva2VuLXBhcnNlcic7XG5cbmNvbnN0IHRva2VuUGFyc2VycyA9IHtcbiAgW1RZUEUuRE9ORV06IGRvbmVQYXJzZXIsXG4gIFtUWVBFLkRPTkVJTlBST0NdOiBkb25lSW5Qcm9jUGFyc2VyLFxuICBbVFlQRS5ET05FUFJPQ106IGRvbmVQcm9jUGFyc2VyLFxuICBbVFlQRS5FTlZDSEFOR0VdOiBlbnZDaGFuZ2VQYXJzZXIsXG4gIFtUWVBFLkVSUk9SXTogZXJyb3JQYXJzZXIsXG4gIFtUWVBFLkZFREFVVEhJTkZPXTogZmVkQXV0aEluZm9QYXJzZXIsXG4gIFtUWVBFLkZFQVRVUkVFWFRBQ0tdOiBmZWF0dXJlRXh0QWNrUGFyc2VyLFxuICBbVFlQRS5JTkZPXTogaW5mb1BhcnNlcixcbiAgW1RZUEUuTE9HSU5BQ0tdOiBsb2dpbkFja1BhcnNlcixcbiAgW1RZUEUuT1JERVJdOiBvcmRlclBhcnNlcixcbiAgW1RZUEUuUkVUVVJOU1RBVFVTXTogcmV0dXJuU3RhdHVzUGFyc2VyLFxuICBbVFlQRS5SRVRVUk5WQUxVRV06IHJldHVyblZhbHVlUGFyc2VyLFxuICBbVFlQRS5TU1BJXTogc3NwaVBhcnNlclxufTtcblxuZXhwb3J0IHR5cGUgUGFyc2VyT3B0aW9ucyA9IFBpY2s8SW50ZXJuYWxDb25uZWN0aW9uT3B0aW9ucywgJ3VzZVVUQycgfCAnbG93ZXJDYXNlR3VpZHMnIHwgJ3Rkc1ZlcnNpb24nIHwgJ3VzZUNvbHVtbk5hbWVzJyB8ICdjb2x1bW5OYW1lUmVwbGFjZXInIHwgJ2NhbWVsQ2FzZUNvbHVtbnMnPjtcblxuY2xhc3MgU3RyZWFtQnVmZmVyIHtcbiAgaXRlcmF0b3I6IEFzeW5jSXRlcmF0b3I8QnVmZmVyLCBhbnksIHVuZGVmaW5lZD4gfCBJdGVyYXRvcjxCdWZmZXIsIGFueSwgdW5kZWZpbmVkPjtcbiAgYnVmZmVyOiBCdWZmZXI7XG4gIHBvc2l0aW9uOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoaXRlcmFibGU6IEFzeW5jSXRlcmFibGU8QnVmZmVyPiB8IEl0ZXJhYmxlPEJ1ZmZlcj4pIHtcbiAgICB0aGlzLml0ZXJhdG9yID0gKChpdGVyYWJsZSBhcyBBc3luY0l0ZXJhYmxlPEJ1ZmZlcj4pW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSB8fCAoaXRlcmFibGUgYXMgSXRlcmFibGU8QnVmZmVyPilbU3ltYm9sLml0ZXJhdG9yXSkuY2FsbChpdGVyYWJsZSk7XG5cbiAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygwKTtcbiAgICB0aGlzLnBvc2l0aW9uID0gMDtcbiAgfVxuXG4gIGFzeW5jIHdhaXRGb3JDaHVuaygpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLml0ZXJhdG9yLm5leHQoKTtcbiAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5leHBlY3RlZCBlbmQgb2YgZGF0YScpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBvc2l0aW9uID09PSB0aGlzLmJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgIHRoaXMuYnVmZmVyID0gcmVzdWx0LnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuYnVmZmVyLnNsaWNlKHRoaXMucG9zaXRpb24pLCByZXN1bHQudmFsdWVdKTtcbiAgICB9XG4gICAgdGhpcy5wb3NpdGlvbiA9IDA7XG4gIH1cbn1cblxuY2xhc3MgUGFyc2VyIHtcbiAgZGVidWc6IERlYnVnO1xuICBjb2xNZXRhZGF0YTogQ29sdW1uTWV0YWRhdGFbXTtcbiAgb3B0aW9uczogUGFyc2VyT3B0aW9ucztcblxuICBzdXNwZW5kZWQ6IGJvb2xlYW47XG4gIG5leHQ6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgc3RyZWFtQnVmZmVyOiBTdHJlYW1CdWZmZXI7XG5cbiAgc3RhdGljIGFzeW5jICpwYXJzZVRva2VucyhpdGVyYWJsZTogQXN5bmNJdGVyYWJsZTxCdWZmZXI+IHwgSXRlcmFibGU8QnVmZmVyPiwgZGVidWc6IERlYnVnLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zLCBjb2xNZXRhZGF0YTogQ29sdW1uTWV0YWRhdGFbXSA9IFtdKSB7XG4gICAgbGV0IHRva2VuOiBUb2tlbiB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBvbkRvbmVQYXJzaW5nID0gKHQ6IFRva2VuIHwgdW5kZWZpbmVkKSA9PiB7IHRva2VuID0gdDsgfTtcblxuICAgIGNvbnN0IHN0cmVhbUJ1ZmZlciA9IG5ldyBTdHJlYW1CdWZmZXIoaXRlcmFibGUpO1xuXG4gICAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcihzdHJlYW1CdWZmZXIsIGRlYnVnLCBvcHRpb25zKTtcbiAgICBwYXJzZXIuY29sTWV0YWRhdGEgPSBjb2xNZXRhZGF0YTtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzdHJlYW1CdWZmZXIud2FpdEZvckNodW5rKCk7XG4gICAgICB9IGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICAgICAgaWYgKHN0cmVhbUJ1ZmZlci5wb3NpdGlvbiA9PT0gc3RyZWFtQnVmZmVyLmJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJzZXIuc3VzcGVuZGVkKSB7XG4gICAgICAgIC8vIFVuc3VzcGVuZCBhbmQgY29udGludWUgZnJvbSB3aGVyZSBldmVyIHdlIGxlZnQgb2ZmLlxuICAgICAgICBwYXJzZXIuc3VzcGVuZGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IG5leHQgPSBwYXJzZXIubmV4dCE7XG5cbiAgICAgICAgbmV4dCgpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGEgbmV3IHRva2VuIHdhcyBwYXJzZWQgYWZ0ZXIgdW5zdXNwZW5zaW9uLlxuICAgICAgICBpZiAoIXBhcnNlci5zdXNwZW5kZWQgJiYgdG9rZW4pIHtcbiAgICAgICAgICBpZiAodG9rZW4gaW5zdGFuY2VvZiBDb2xNZXRhZGF0YVRva2VuKSB7XG4gICAgICAgICAgICBwYXJzZXIuY29sTWV0YWRhdGEgPSB0b2tlbi5jb2x1bW5zO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHlpZWxkIHRva2VuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHdoaWxlICghcGFyc2VyLnN1c3BlbmRlZCAmJiBwYXJzZXIucG9zaXRpb24gKyAxIDw9IHBhcnNlci5idWZmZXIubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBwYXJzZXIuYnVmZmVyLnJlYWRVSW50OChwYXJzZXIucG9zaXRpb24pO1xuXG4gICAgICAgIHBhcnNlci5wb3NpdGlvbiArPSAxO1xuXG4gICAgICAgIGlmICh0eXBlID09PSBUWVBFLkNPTE1FVEFEQVRBKSB7XG4gICAgICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCBjb2xNZXRhZGF0YVBhcnNlcihwYXJzZXIpO1xuICAgICAgICAgIHBhcnNlci5jb2xNZXRhZGF0YSA9IHRva2VuLmNvbHVtbnM7XG4gICAgICAgICAgeWllbGQgdG9rZW47XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gVFlQRS5ST1cpIHtcbiAgICAgICAgICB5aWVsZCByb3dQYXJzZXIocGFyc2VyKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBUWVBFLk5CQ1JPVykge1xuICAgICAgICAgIHlpZWxkIG5iY1Jvd1BhcnNlcihwYXJzZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKHRva2VuUGFyc2Vyc1t0eXBlXSkge1xuICAgICAgICAgIHRva2VuUGFyc2Vyc1t0eXBlXShwYXJzZXIsIHBhcnNlci5vcHRpb25zLCBvbkRvbmVQYXJzaW5nKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIGEgbmV3IHRva2VuIHdhcyBwYXJzZWQgYWZ0ZXIgdW5zdXNwZW5zaW9uLlxuICAgICAgICAgIGlmICghcGFyc2VyLnN1c3BlbmRlZCAmJiB0b2tlbikge1xuICAgICAgICAgICAgaWYgKHRva2VuIGluc3RhbmNlb2YgQ29sTWV0YWRhdGFUb2tlbikge1xuICAgICAgICAgICAgICBwYXJzZXIuY29sTWV0YWRhdGEgPSB0b2tlbi5jb2x1bW5zO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeWllbGQgdG9rZW47XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biB0eXBlOiAnICsgdHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihzdHJlYW1CdWZmZXI6IFN0cmVhbUJ1ZmZlciwgZGVidWc6IERlYnVnLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zKSB7XG4gICAgdGhpcy5kZWJ1ZyA9IGRlYnVnO1xuICAgIHRoaXMuY29sTWV0YWRhdGEgPSBbXTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgdGhpcy5zdHJlYW1CdWZmZXIgPSBzdHJlYW1CdWZmZXI7XG4gICAgdGhpcy5zdXNwZW5kZWQgPSBmYWxzZTtcbiAgICB0aGlzLm5leHQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXQgYnVmZmVyKCkge1xuICAgIHJldHVybiB0aGlzLnN0cmVhbUJ1ZmZlci5idWZmZXI7XG4gIH1cblxuICBnZXQgcG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RyZWFtQnVmZmVyLnBvc2l0aW9uO1xuICB9XG5cbiAgc2V0IHBvc2l0aW9uKHZhbHVlKSB7XG4gICAgdGhpcy5zdHJlYW1CdWZmZXIucG9zaXRpb24gPSB2YWx1ZTtcbiAgfVxuXG4gIHN1c3BlbmQobmV4dDogKCkgPT4gdm9pZCkge1xuICAgIHRoaXMuc3VzcGVuZGVkID0gdHJ1ZTtcbiAgICB0aGlzLm5leHQgPSBuZXh0O1xuICB9XG5cbiAgYXdhaXREYXRhKGxlbmd0aDogbnVtYmVyLCBjYWxsYmFjazogKCkgPT4gdm9pZCkge1xuICAgIGlmICh0aGlzLnBvc2l0aW9uICsgbGVuZ3RoIDw9IHRoaXMuYnVmZmVyLmxlbmd0aCkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdXNwZW5kKCgpID0+IHtcbiAgICAgICAgdGhpcy5hd2FpdERhdGEobGVuZ3RoLCBjYWxsYmFjayk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZWFkSW50OChjYWxsYmFjazogKGRhdGE6IG51bWJlcikgPT4gdm9pZCkge1xuICAgIHRoaXMuYXdhaXREYXRhKDEsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmJ1ZmZlci5yZWFkSW50OCh0aGlzLnBvc2l0aW9uKTtcbiAgICAgIHRoaXMucG9zaXRpb24gKz0gMTtcbiAgICAgIGNhbGxiYWNrKGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVhZFVJbnQ4KGNhbGxiYWNrOiAoZGF0YTogbnVtYmVyKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5hd2FpdERhdGEoMSwgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuYnVmZmVyLnJlYWRVSW50OCh0aGlzLnBvc2l0aW9uKTtcbiAgICAgIHRoaXMucG9zaXRpb24gKz0gMTtcbiAgICAgIGNhbGxiYWNrKGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVhZEludDE2TEUoY2FsbGJhY2s6IChkYXRhOiBudW1iZXIpID0+IHZvaWQpIHtcbiAgICB0aGlzLmF3YWl0RGF0YSgyLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5idWZmZXIucmVhZEludDE2TEUodGhpcy5wb3NpdGlvbik7XG4gICAgICB0aGlzLnBvc2l0aW9uICs9IDI7XG4gICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlYWRJbnQxNkJFKGNhbGxiYWNrOiAoZGF0YTogbnVtYmVyKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5hd2FpdERhdGEoMiwgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuYnVmZmVyLnJlYWRJbnQxNkJFKHRoaXMucG9zaXRpb24pO1xuICAgICAgdGhpcy5wb3NpdGlvbiArPSAyO1xuICAgICAgY2FsbGJhY2soZGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICByZWFkVUludDE2TEUoY2FsbGJhY2s6IChkYXRhOiBudW1iZXIpID0+IHZvaWQpIHtcbiAgICB0aGlzLmF3YWl0RGF0YSgyLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5idWZmZXIucmVhZFVJbnQxNkxFKHRoaXMucG9zaXRpb24pO1xuICAgICAgdGhpcy5wb3NpdGlvbiArPSAyO1xuICAgICAgY2FsbGJhY2soZGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICByZWFkVUludDE2QkUoY2FsbGJhY2s6IChkYXRhOiBudW1iZXIpID0+IHZvaWQpIHtcbiAgICB0aGlzLmF3YWl0RGF0YSgyLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5idWZmZXIucmVhZFVJbnQxNkJFKHRoaXMucG9zaXRpb24pO1xuICAgICAgdGhpcy5wb3NpdGlvbiArPSAyO1xuICAgICAgY2FsbGJhY2soZGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICByZWFkSW50MzJMRShjYWxsYmFjazogKGRhdGE6IG51bWJlcikgPT4gdm9pZCkge1xuICAgIHRoaXMuYXdhaXREYXRhKDQsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmJ1ZmZlci5yZWFkSW50MzJMRSh0aGlzLnBvc2l0aW9uKTtcbiAgICAgIHRoaXMucG9zaXRpb24gKz0gNDtcbiAgICAgIGNhbGxiYWNrKGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVhZEludDMyQkUoY2FsbGJhY2s6IChkYXRhOiBudW1iZXIpID0+IHZvaWQpIHtcbiAgICB0aGlzLmF3YWl0RGF0YSg0LCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5idWZmZXIucmVhZEludDMyQkUodGhpcy5wb3NpdGlvbik7XG4gICAgICB0aGlzLnBvc2l0aW9uICs9IDQ7XG4gICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlYWRVSW50MzJMRShjYWxsYmFjazogKGRhdGE6IG51bWJlcikgPT4gdm9pZCkge1xuICAgIHRoaXMuYXdhaXREYXRhKDQsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmJ1ZmZlci5yZWFkVUludDMyTEUodGhpcy5wb3NpdGlvbik7XG4gICAgICB0aGlzLnBvc2l0aW9uICs9IDQ7XG4gICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlYWRVSW50MzJCRShjYWxsYmFjazogKGRhdGE6IG51bWJlcikgPT4gdm9pZCkge1xuICAgIHRoaXMuYXdhaXREYXRhKDQsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmJ1ZmZlci5yZWFkVUludDMyQkUodGhpcy5wb3NpdGlvbik7XG4gICAgICB0aGlzLnBvc2l0aW9uICs9IDQ7XG4gICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlYWRCaWdJbnQ2NExFKGNhbGxiYWNrOiAoZGF0YTogSlNCSSkgPT4gdm9pZCkge1xuICAgIHRoaXMuYXdhaXREYXRhKDgsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IEpTQkkuYWRkKFxuICAgICAgICBKU0JJLmxlZnRTaGlmdChcbiAgICAgICAgICBKU0JJLkJpZ0ludChcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyW3RoaXMucG9zaXRpb24gKyA0XSArXG4gICAgICAgICAgICB0aGlzLmJ1ZmZlclt0aGlzLnBvc2l0aW9uICsgNV0gKiAyICoqIDggK1xuICAgICAgICAgICAgdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbiArIDZdICogMiAqKiAxNiArXG4gICAgICAgICAgICAodGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbiArIDddIDw8IDI0KSAvLyBPdmVyZmxvd1xuICAgICAgICAgICksXG4gICAgICAgICAgSlNCSS5CaWdJbnQoMzIpXG4gICAgICAgICksXG4gICAgICAgIEpTQkkuQmlnSW50KFxuICAgICAgICAgIHRoaXMuYnVmZmVyW3RoaXMucG9zaXRpb25dICtcbiAgICAgICAgICB0aGlzLmJ1ZmZlclt0aGlzLnBvc2l0aW9uICsgMV0gKiAyICoqIDggK1xuICAgICAgICAgIHRoaXMuYnVmZmVyW3RoaXMucG9zaXRpb24gKyAyXSAqIDIgKiogMTYgK1xuICAgICAgICAgIHRoaXMuYnVmZmVyW3RoaXMucG9zaXRpb24gKyAzXSAqIDIgKiogMjRcbiAgICAgICAgKVxuICAgICAgKTtcblxuICAgICAgdGhpcy5wb3NpdGlvbiArPSA4O1xuXG4gICAgICBjYWxsYmFjayhyZXN1bHQpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVhZEludDY0TEUoY2FsbGJhY2s6IChkYXRhOiBudW1iZXIpID0+IHZvaWQpIHtcbiAgICB0aGlzLmF3YWl0RGF0YSg4LCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gTWF0aC5wb3coMiwgMzIpICogdGhpcy5idWZmZXIucmVhZEludDMyTEUodGhpcy5wb3NpdGlvbiArIDQpICsgKCh0aGlzLmJ1ZmZlclt0aGlzLnBvc2l0aW9uICsgNF0gJiAweDgwKSA9PT0gMHg4MCA/IDEgOiAtMSkgKiB0aGlzLmJ1ZmZlci5yZWFkVUludDMyTEUodGhpcy5wb3NpdGlvbik7XG4gICAgICB0aGlzLnBvc2l0aW9uICs9IDg7XG4gICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlYWRJbnQ2NEJFKGNhbGxiYWNrOiAoZGF0YTogbnVtYmVyKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5hd2FpdERhdGEoOCwgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IE1hdGgucG93KDIsIDMyKSAqIHRoaXMuYnVmZmVyLnJlYWRJbnQzMkJFKHRoaXMucG9zaXRpb24pICsgKCh0aGlzLmJ1ZmZlclt0aGlzLnBvc2l0aW9uXSAmIDB4ODApID09PSAweDgwID8gMSA6IC0xKSAqIHRoaXMuYnVmZmVyLnJlYWRVSW50MzJCRSh0aGlzLnBvc2l0aW9uICsgNCk7XG4gICAgICB0aGlzLnBvc2l0aW9uICs9IDg7XG4gICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlYWRCaWdVSW50NjRMRShjYWxsYmFjazogKGRhdGE6IEpTQkkpID0+IHZvaWQpIHtcbiAgICB0aGlzLmF3YWl0RGF0YSg4LCAoKSA9PiB7XG4gICAgICBjb25zdCBsb3cgPSBKU0JJLkJpZ0ludCh0aGlzLmJ1ZmZlci5yZWFkVUludDMyTEUodGhpcy5wb3NpdGlvbikpO1xuICAgICAgY29uc3QgaGlnaCA9IEpTQkkuQmlnSW50KHRoaXMuYnVmZmVyLnJlYWRVSW50MzJMRSh0aGlzLnBvc2l0aW9uICsgNCkpO1xuXG4gICAgICB0aGlzLnBvc2l0aW9uICs9IDg7XG5cbiAgICAgIGNhbGxiYWNrKEpTQkkuYWRkKGxvdywgSlNCSS5sZWZ0U2hpZnQoaGlnaCwgSlNCSS5CaWdJbnQoMzIpKSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVhZFVJbnQ2NExFKGNhbGxiYWNrOiAoZGF0YTogbnVtYmVyKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5hd2FpdERhdGEoOCwgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IE1hdGgucG93KDIsIDMyKSAqIHRoaXMuYnVmZmVyLnJlYWRVSW50MzJMRSh0aGlzLnBvc2l0aW9uICsgNCkgKyB0aGlzLmJ1ZmZlci5yZWFkVUludDMyTEUodGhpcy5wb3NpdGlvbik7XG4gICAgICB0aGlzLnBvc2l0aW9uICs9IDg7XG4gICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlYWRVSW50NjRCRShjYWxsYmFjazogKGRhdGE6IG51bWJlcikgPT4gdm9pZCkge1xuICAgIHRoaXMuYXdhaXREYXRhKDgsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBNYXRoLnBvdygyLCAzMikgKiB0aGlzLmJ1ZmZlci5yZWFkVUludDMyQkUodGhpcy5wb3NpdGlvbikgKyB0aGlzLmJ1ZmZlci5yZWFkVUludDMyQkUodGhpcy5wb3NpdGlvbiArIDQpO1xuICAgICAgdGhpcy5wb3NpdGlvbiArPSA4O1xuICAgICAgY2FsbGJhY2soZGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICByZWFkRmxvYXRMRShjYWxsYmFjazogKGRhdGE6IG51bWJlcikgPT4gdm9pZCkge1xuICAgIHRoaXMuYXdhaXREYXRhKDQsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmJ1ZmZlci5yZWFkRmxvYXRMRSh0aGlzLnBvc2l0aW9uKTtcbiAgICAgIHRoaXMucG9zaXRpb24gKz0gNDtcbiAgICAgIGNhbGxiYWNrKGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVhZEZsb2F0QkUoY2FsbGJhY2s6IChkYXRhOiBudW1iZXIpID0+IHZvaWQpIHtcbiAgICB0aGlzLmF3YWl0RGF0YSg0LCAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5idWZmZXIucmVhZEZsb2F0QkUodGhpcy5wb3NpdGlvbik7XG4gICAgICB0aGlzLnBvc2l0aW9uICs9IDQ7XG4gICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlYWREb3VibGVMRShjYWxsYmFjazogKGRhdGE6IG51bWJlcikgPT4gdm9pZCkge1xuICAgIHRoaXMuYXdhaXREYXRhKDgsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmJ1ZmZlci5yZWFkRG91YmxlTEUodGhpcy5wb3NpdGlvbik7XG4gICAgICB0aGlzLnBvc2l0aW9uICs9IDg7XG4gICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlYWREb3VibGVCRShjYWxsYmFjazogKGRhdGE6IG51bWJlcikgPT4gdm9pZCkge1xuICAgIHRoaXMuYXdhaXREYXRhKDgsICgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmJ1ZmZlci5yZWFkRG91YmxlQkUodGhpcy5wb3NpdGlvbik7XG4gICAgICB0aGlzLnBvc2l0aW9uICs9IDg7XG4gICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlYWRVSW50MjRMRShjYWxsYmFjazogKGRhdGE6IG51bWJlcikgPT4gdm9pZCkge1xuICAgIHRoaXMuYXdhaXREYXRhKDMsICgpID0+IHtcbiAgICAgIGNvbnN0IGxvdyA9IHRoaXMuYnVmZmVyLnJlYWRVSW50MTZMRSh0aGlzLnBvc2l0aW9uKTtcbiAgICAgIGNvbnN0IGhpZ2ggPSB0aGlzLmJ1ZmZlci5yZWFkVUludDgodGhpcy5wb3NpdGlvbiArIDIpO1xuXG4gICAgICB0aGlzLnBvc2l0aW9uICs9IDM7XG5cbiAgICAgIGNhbGxiYWNrKGxvdyB8IChoaWdoIDw8IDE2KSk7XG4gICAgfSk7XG4gIH1cblxuICByZWFkVUludDQwTEUoY2FsbGJhY2s6IChkYXRhOiBudW1iZXIpID0+IHZvaWQpIHtcbiAgICB0aGlzLmF3YWl0RGF0YSg1LCAoKSA9PiB7XG4gICAgICBjb25zdCBsb3cgPSB0aGlzLmJ1ZmZlci5yZWFkVUludDMyTEUodGhpcy5wb3NpdGlvbik7XG4gICAgICBjb25zdCBoaWdoID0gdGhpcy5idWZmZXIucmVhZFVJbnQ4KHRoaXMucG9zaXRpb24gKyA0KTtcblxuICAgICAgdGhpcy5wb3NpdGlvbiArPSA1O1xuXG4gICAgICBjYWxsYmFjaygoMHgxMDAwMDAwMDAgKiBoaWdoKSArIGxvdyk7XG4gICAgfSk7XG4gIH1cblxuICByZWFkVU51bWVyaWM2NExFKGNhbGxiYWNrOiAoZGF0YTogbnVtYmVyKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5hd2FpdERhdGEoOCwgKCkgPT4ge1xuICAgICAgY29uc3QgbG93ID0gdGhpcy5idWZmZXIucmVhZFVJbnQzMkxFKHRoaXMucG9zaXRpb24pO1xuICAgICAgY29uc3QgaGlnaCA9IHRoaXMuYnVmZmVyLnJlYWRVSW50MzJMRSh0aGlzLnBvc2l0aW9uICsgNCk7XG5cbiAgICAgIHRoaXMucG9zaXRpb24gKz0gODtcblxuICAgICAgY2FsbGJhY2soKDB4MTAwMDAwMDAwICogaGlnaCkgKyBsb3cpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVhZFVOdW1lcmljOTZMRShjYWxsYmFjazogKGRhdGE6IG51bWJlcikgPT4gdm9pZCkge1xuICAgIHRoaXMuYXdhaXREYXRhKDEyLCAoKSA9PiB7XG4gICAgICBjb25zdCBkd29yZDEgPSB0aGlzLmJ1ZmZlci5yZWFkVUludDMyTEUodGhpcy5wb3NpdGlvbik7XG4gICAgICBjb25zdCBkd29yZDIgPSB0aGlzLmJ1ZmZlci5yZWFkVUludDMyTEUodGhpcy5wb3NpdGlvbiArIDQpO1xuICAgICAgY29uc3QgZHdvcmQzID0gdGhpcy5idWZmZXIucmVhZFVJbnQzMkxFKHRoaXMucG9zaXRpb24gKyA4KTtcblxuICAgICAgdGhpcy5wb3NpdGlvbiArPSAxMjtcblxuICAgICAgY2FsbGJhY2soZHdvcmQxICsgKDB4MTAwMDAwMDAwICogZHdvcmQyKSArICgweDEwMDAwMDAwMCAqIDB4MTAwMDAwMDAwICogZHdvcmQzKSk7XG4gICAgfSk7XG4gIH1cblxuICByZWFkVU51bWVyaWMxMjhMRShjYWxsYmFjazogKGRhdGE6IG51bWJlcikgPT4gdm9pZCkge1xuICAgIHRoaXMuYXdhaXREYXRhKDE2LCAoKSA9PiB7XG4gICAgICBjb25zdCBkd29yZDEgPSB0aGlzLmJ1ZmZlci5yZWFkVUludDMyTEUodGhpcy5wb3NpdGlvbik7XG4gICAgICBjb25zdCBkd29yZDIgPSB0aGlzLmJ1ZmZlci5yZWFkVUludDMyTEUodGhpcy5wb3NpdGlvbiArIDQpO1xuICAgICAgY29uc3QgZHdvcmQzID0gdGhpcy5idWZmZXIucmVhZFVJbnQzMkxFKHRoaXMucG9zaXRpb24gKyA4KTtcbiAgICAgIGNvbnN0IGR3b3JkNCA9IHRoaXMuYnVmZmVyLnJlYWRVSW50MzJMRSh0aGlzLnBvc2l0aW9uICsgMTIpO1xuXG4gICAgICB0aGlzLnBvc2l0aW9uICs9IDE2O1xuXG4gICAgICBjYWxsYmFjayhkd29yZDEgKyAoMHgxMDAwMDAwMDAgKiBkd29yZDIpICsgKDB4MTAwMDAwMDAwICogMHgxMDAwMDAwMDAgKiBkd29yZDMpICsgKDB4MTAwMDAwMDAwICogMHgxMDAwMDAwMDAgKiAweDEwMDAwMDAwMCAqIGR3b3JkNCkpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gVmFyaWFibGUgbGVuZ3RoIGRhdGFcblxuICByZWFkQnVmZmVyKGxlbmd0aDogbnVtYmVyLCBjYWxsYmFjazogKGRhdGE6IEJ1ZmZlcikgPT4gdm9pZCkge1xuICAgIHRoaXMuYXdhaXREYXRhKGxlbmd0aCwgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuYnVmZmVyLnNsaWNlKHRoaXMucG9zaXRpb24sIHRoaXMucG9zaXRpb24gKyBsZW5ndGgpO1xuICAgICAgdGhpcy5wb3NpdGlvbiArPSBsZW5ndGg7XG4gICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFJlYWQgYSBVbmljb2RlIFN0cmluZyAoQlZBUkNIQVIpXG4gIHJlYWRCVmFyQ2hhcihjYWxsYmFjazogKGRhdGE6IHN0cmluZykgPT4gdm9pZCkge1xuICAgIHRoaXMucmVhZFVJbnQ4KChsZW5ndGgpID0+IHtcbiAgICAgIHRoaXMucmVhZEJ1ZmZlcihsZW5ndGggKiAyLCAoZGF0YSkgPT4ge1xuICAgICAgICBjYWxsYmFjayhkYXRhLnRvU3RyaW5nKCd1Y3MyJykpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBSZWFkIGEgVW5pY29kZSBTdHJpbmcgKFVTVkFSQ0hBUilcbiAgcmVhZFVzVmFyQ2hhcihjYWxsYmFjazogKGRhdGE6IHN0cmluZykgPT4gdm9pZCkge1xuICAgIHRoaXMucmVhZFVJbnQxNkxFKChsZW5ndGgpID0+IHtcbiAgICAgIHRoaXMucmVhZEJ1ZmZlcihsZW5ndGggKiAyLCAoZGF0YSkgPT4ge1xuICAgICAgICBjYWxsYmFjayhkYXRhLnRvU3RyaW5nKCd1Y3MyJykpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBSZWFkIGJpbmFyeSBkYXRhIChCVkFSQllURSlcbiAgcmVhZEJWYXJCeXRlKGNhbGxiYWNrOiAoZGF0YTogQnVmZmVyKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5yZWFkVUludDgoKGxlbmd0aCkgPT4ge1xuICAgICAgdGhpcy5yZWFkQnVmZmVyKGxlbmd0aCwgY2FsbGJhY2spO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gUmVhZCBiaW5hcnkgZGF0YSAoVVNWQVJCWVRFKVxuICByZWFkVXNWYXJCeXRlKGNhbGxiYWNrOiAoZGF0YTogQnVmZmVyKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5yZWFkVUludDE2TEUoKGxlbmd0aCkgPT4ge1xuICAgICAgdGhpcy5yZWFkQnVmZmVyKGxlbmd0aCwgY2FsbGJhY2spO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBhcnNlcjtcbm1vZHVsZS5leHBvcnRzID0gUGFyc2VyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBRUE7O0FBRUE7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFFQSxNQUFNQSxZQUFZLEdBQUc7RUFDbkIsQ0FBQ0MsWUFBS0MsSUFBTixHQUFhQywyQkFETTtFQUVuQixDQUFDRixZQUFLRyxVQUFOLEdBQW1CQyxpQ0FGQTtFQUduQixDQUFDSixZQUFLSyxRQUFOLEdBQWlCQywrQkFIRTtFQUluQixDQUFDTixZQUFLTyxTQUFOLEdBQWtCQyw2QkFKQztFQUtuQixDQUFDUixZQUFLUyxLQUFOLEdBQWNDLGlDQUxLO0VBTW5CLENBQUNWLFlBQUtXLFdBQU4sR0FBb0JDLDBCQU5EO0VBT25CLENBQUNaLFlBQUthLGFBQU4sR0FBc0JDLDRCQVBIO0VBUW5CLENBQUNkLFlBQUtlLElBQU4sR0FBYUMsZ0NBUk07RUFTbkIsQ0FBQ2hCLFlBQUtpQixRQUFOLEdBQWlCQyw0QkFURTtFQVVuQixDQUFDbEIsWUFBS21CLEtBQU4sR0FBY0MseUJBVks7RUFXbkIsQ0FBQ3BCLFlBQUtxQixZQUFOLEdBQXFCQyxnQ0FYRjtFQVluQixDQUFDdEIsWUFBS3VCLFdBQU4sR0FBb0JDLCtCQVpEO0VBYW5CLENBQUN4QixZQUFLeUIsSUFBTixHQUFhQztBQWJNLENBQXJCOztBQWtCQSxNQUFNQyxZQUFOLENBQW1CO0VBS2pCQyxXQUFXLENBQUNDLFFBQUQsRUFBcUQ7SUFBQSxLQUpoRUMsUUFJZ0U7SUFBQSxLQUhoRUMsTUFHZ0U7SUFBQSxLQUZoRUMsUUFFZ0U7SUFDOUQsS0FBS0YsUUFBTCxHQUFnQixDQUFFRCxRQUFELENBQW9DSSxNQUFNLENBQUNDLGFBQTNDLEtBQThETCxRQUFELENBQStCSSxNQUFNLENBQUNILFFBQXRDLENBQTlELEVBQStHSyxJQUEvRyxDQUFvSE4sUUFBcEgsQ0FBaEI7SUFFQSxLQUFLRSxNQUFMLEdBQWNLLE1BQU0sQ0FBQ0MsS0FBUCxDQUFhLENBQWIsQ0FBZDtJQUNBLEtBQUtMLFFBQUwsR0FBZ0IsQ0FBaEI7RUFDRDs7RUFFaUIsTUFBWk0sWUFBWSxHQUFHO0lBQ25CLE1BQU1DLE1BQU0sR0FBRyxNQUFNLEtBQUtULFFBQUwsQ0FBY1UsSUFBZCxFQUFyQjs7SUFDQSxJQUFJRCxNQUFNLENBQUNFLElBQVgsRUFBaUI7TUFDZixNQUFNLElBQUlDLEtBQUosQ0FBVSx3QkFBVixDQUFOO0lBQ0Q7O0lBRUQsSUFBSSxLQUFLVixRQUFMLEtBQWtCLEtBQUtELE1BQUwsQ0FBWVksTUFBbEMsRUFBMEM7TUFDeEMsS0FBS1osTUFBTCxHQUFjUSxNQUFNLENBQUNLLEtBQXJCO0lBQ0QsQ0FGRCxNQUVPO01BQ0wsS0FBS2IsTUFBTCxHQUFjSyxNQUFNLENBQUNTLE1BQVAsQ0FBYyxDQUFDLEtBQUtkLE1BQUwsQ0FBWWUsS0FBWixDQUFrQixLQUFLZCxRQUF2QixDQUFELEVBQW1DTyxNQUFNLENBQUNLLEtBQTFDLENBQWQsQ0FBZDtJQUNEOztJQUNELEtBQUtaLFFBQUwsR0FBZ0IsQ0FBaEI7RUFDRDs7QUF4QmdCOztBQTJCbkIsTUFBTWUsTUFBTixDQUFhO0VBU2MsY0FBWEMsV0FBVyxDQUFDbkIsUUFBRCxFQUFxRG9CLEtBQXJELEVBQW1FQyxPQUFuRSxFQUEyRkMsV0FBNkIsR0FBRyxFQUEzSCxFQUErSDtJQUN0SixJQUFJQyxLQUFKOztJQUNBLE1BQU1DLGFBQWEsR0FBSUMsQ0FBRCxJQUEwQjtNQUFFRixLQUFLLEdBQUdFLENBQVI7SUFBWSxDQUE5RDs7SUFFQSxNQUFNQyxZQUFZLEdBQUcsSUFBSTVCLFlBQUosQ0FBaUJFLFFBQWpCLENBQXJCO0lBRUEsTUFBTTJCLE1BQU0sR0FBRyxJQUFJVCxNQUFKLENBQVdRLFlBQVgsRUFBeUJOLEtBQXpCLEVBQWdDQyxPQUFoQyxDQUFmO0lBQ0FNLE1BQU0sQ0FBQ0wsV0FBUCxHQUFxQkEsV0FBckI7O0lBRUEsT0FBTyxJQUFQLEVBQWE7TUFDWCxJQUFJO1FBQ0YsTUFBTUksWUFBWSxDQUFDakIsWUFBYixFQUFOO01BQ0QsQ0FGRCxDQUVFLE9BQU9tQixHQUFQLEVBQXFCO1FBQ3JCLElBQUlGLFlBQVksQ0FBQ3ZCLFFBQWIsS0FBMEJ1QixZQUFZLENBQUN4QixNQUFiLENBQW9CWSxNQUFsRCxFQUEwRDtVQUN4RDtRQUNEOztRQUVELE1BQU1jLEdBQU47TUFDRDs7TUFFRCxJQUFJRCxNQUFNLENBQUNFLFNBQVgsRUFBc0I7UUFDcEI7UUFDQUYsTUFBTSxDQUFDRSxTQUFQLEdBQW1CLEtBQW5CO1FBQ0EsTUFBTWxCLElBQUksR0FBR2dCLE1BQU0sQ0FBQ2hCLElBQXBCO1FBRUFBLElBQUksR0FMZ0IsQ0FPcEI7O1FBQ0EsSUFBSSxDQUFDZ0IsTUFBTSxDQUFDRSxTQUFSLElBQXFCTixLQUF6QixFQUFnQztVQUM5QixJQUFJQSxLQUFLLFlBQVlPLHVCQUFyQixFQUF1QztZQUNyQ0gsTUFBTSxDQUFDTCxXQUFQLEdBQXFCQyxLQUFLLENBQUNRLE9BQTNCO1VBQ0Q7O1VBRUQsTUFBTVIsS0FBTjtRQUNEO01BQ0Y7O01BRUQsT0FBTyxDQUFDSSxNQUFNLENBQUNFLFNBQVIsSUFBcUJGLE1BQU0sQ0FBQ3hCLFFBQVAsR0FBa0IsQ0FBbEIsSUFBdUJ3QixNQUFNLENBQUN6QixNQUFQLENBQWNZLE1BQWpFLEVBQXlFO1FBQ3ZFLE1BQU1rQixJQUFJLEdBQUdMLE1BQU0sQ0FBQ3pCLE1BQVAsQ0FBYytCLFNBQWQsQ0FBd0JOLE1BQU0sQ0FBQ3hCLFFBQS9CLENBQWI7UUFFQXdCLE1BQU0sQ0FBQ3hCLFFBQVAsSUFBbUIsQ0FBbkI7O1FBRUEsSUFBSTZCLElBQUksS0FBSzdELFlBQUsrRCxXQUFsQixFQUErQjtVQUM3QixNQUFNWCxLQUFLLEdBQUcsTUFBTSxxQ0FBa0JJLE1BQWxCLENBQXBCO1VBQ0FBLE1BQU0sQ0FBQ0wsV0FBUCxHQUFxQkMsS0FBSyxDQUFDUSxPQUEzQjtVQUNBLE1BQU1SLEtBQU47UUFDRCxDQUpELE1BSU8sSUFBSVMsSUFBSSxLQUFLN0QsWUFBS2dFLEdBQWxCLEVBQXVCO1VBQzVCLE1BQU0sNkJBQVVSLE1BQVYsQ0FBTjtRQUNELENBRk0sTUFFQSxJQUFJSyxJQUFJLEtBQUs3RCxZQUFLaUUsTUFBbEIsRUFBMEI7VUFDL0IsTUFBTSxnQ0FBYVQsTUFBYixDQUFOO1FBQ0QsQ0FGTSxNQUVBLElBQUl6RCxZQUFZLENBQUM4RCxJQUFELENBQWhCLEVBQXdCO1VBQzdCOUQsWUFBWSxDQUFDOEQsSUFBRCxDQUFaLENBQW1CTCxNQUFuQixFQUEyQkEsTUFBTSxDQUFDTixPQUFsQyxFQUEyQ0csYUFBM0MsRUFENkIsQ0FHN0I7O1VBQ0EsSUFBSSxDQUFDRyxNQUFNLENBQUNFLFNBQVIsSUFBcUJOLEtBQXpCLEVBQWdDO1lBQzlCLElBQUlBLEtBQUssWUFBWU8sdUJBQXJCLEVBQXVDO2NBQ3JDSCxNQUFNLENBQUNMLFdBQVAsR0FBcUJDLEtBQUssQ0FBQ1EsT0FBM0I7WUFDRDs7WUFDRCxNQUFNUixLQUFOO1VBQ0Q7UUFDRixDQVZNLE1BVUE7VUFDTCxNQUFNLElBQUlWLEtBQUosQ0FBVSxtQkFBbUJtQixJQUE3QixDQUFOO1FBQ0Q7TUFDRjtJQUNGO0VBQ0Y7O0VBRURqQyxXQUFXLENBQUMyQixZQUFELEVBQTZCTixLQUE3QixFQUEyQ0MsT0FBM0MsRUFBbUU7SUFBQSxLQTNFOUVELEtBMkU4RTtJQUFBLEtBMUU5RUUsV0EwRThFO0lBQUEsS0F6RTlFRCxPQXlFOEU7SUFBQSxLQXZFOUVRLFNBdUU4RTtJQUFBLEtBdEU5RWxCLElBc0U4RTtJQUFBLEtBckU5RWUsWUFxRThFO0lBQzVFLEtBQUtOLEtBQUwsR0FBYUEsS0FBYjtJQUNBLEtBQUtFLFdBQUwsR0FBbUIsRUFBbkI7SUFDQSxLQUFLRCxPQUFMLEdBQWVBLE9BQWY7SUFFQSxLQUFLSyxZQUFMLEdBQW9CQSxZQUFwQjtJQUNBLEtBQUtHLFNBQUwsR0FBaUIsS0FBakI7SUFDQSxLQUFLbEIsSUFBTCxHQUFZMEIsU0FBWjtFQUNEOztFQUVTLElBQU5uQyxNQUFNLEdBQUc7SUFDWCxPQUFPLEtBQUt3QixZQUFMLENBQWtCeEIsTUFBekI7RUFDRDs7RUFFVyxJQUFSQyxRQUFRLEdBQUc7SUFDYixPQUFPLEtBQUt1QixZQUFMLENBQWtCdkIsUUFBekI7RUFDRDs7RUFFVyxJQUFSQSxRQUFRLENBQUNZLEtBQUQsRUFBUTtJQUNsQixLQUFLVyxZQUFMLENBQWtCdkIsUUFBbEIsR0FBNkJZLEtBQTdCO0VBQ0Q7O0VBRUR1QixPQUFPLENBQUMzQixJQUFELEVBQW1CO0lBQ3hCLEtBQUtrQixTQUFMLEdBQWlCLElBQWpCO0lBQ0EsS0FBS2xCLElBQUwsR0FBWUEsSUFBWjtFQUNEOztFQUVENEIsU0FBUyxDQUFDekIsTUFBRCxFQUFpQjBCLFFBQWpCLEVBQXVDO0lBQzlDLElBQUksS0FBS3JDLFFBQUwsR0FBZ0JXLE1BQWhCLElBQTBCLEtBQUtaLE1BQUwsQ0FBWVksTUFBMUMsRUFBa0Q7TUFDaEQwQixRQUFRO0lBQ1QsQ0FGRCxNQUVPO01BQ0wsS0FBS0YsT0FBTCxDQUFhLE1BQU07UUFDakIsS0FBS0MsU0FBTCxDQUFlekIsTUFBZixFQUF1QjBCLFFBQXZCO01BQ0QsQ0FGRDtJQUdEO0VBQ0Y7O0VBRURDLFFBQVEsQ0FBQ0QsUUFBRCxFQUFtQztJQUN6QyxLQUFLRCxTQUFMLENBQWUsQ0FBZixFQUFrQixNQUFNO01BQ3RCLE1BQU1HLElBQUksR0FBRyxLQUFLeEMsTUFBTCxDQUFZdUMsUUFBWixDQUFxQixLQUFLdEMsUUFBMUIsQ0FBYjtNQUNBLEtBQUtBLFFBQUwsSUFBaUIsQ0FBakI7TUFDQXFDLFFBQVEsQ0FBQ0UsSUFBRCxDQUFSO0lBQ0QsQ0FKRDtFQUtEOztFQUVEVCxTQUFTLENBQUNPLFFBQUQsRUFBbUM7SUFDMUMsS0FBS0QsU0FBTCxDQUFlLENBQWYsRUFBa0IsTUFBTTtNQUN0QixNQUFNRyxJQUFJLEdBQUcsS0FBS3hDLE1BQUwsQ0FBWStCLFNBQVosQ0FBc0IsS0FBSzlCLFFBQTNCLENBQWI7TUFDQSxLQUFLQSxRQUFMLElBQWlCLENBQWpCO01BQ0FxQyxRQUFRLENBQUNFLElBQUQsQ0FBUjtJQUNELENBSkQ7RUFLRDs7RUFFREMsV0FBVyxDQUFDSCxRQUFELEVBQW1DO0lBQzVDLEtBQUtELFNBQUwsQ0FBZSxDQUFmLEVBQWtCLE1BQU07TUFDdEIsTUFBTUcsSUFBSSxHQUFHLEtBQUt4QyxNQUFMLENBQVl5QyxXQUFaLENBQXdCLEtBQUt4QyxRQUE3QixDQUFiO01BQ0EsS0FBS0EsUUFBTCxJQUFpQixDQUFqQjtNQUNBcUMsUUFBUSxDQUFDRSxJQUFELENBQVI7SUFDRCxDQUpEO0VBS0Q7O0VBRURFLFdBQVcsQ0FBQ0osUUFBRCxFQUFtQztJQUM1QyxLQUFLRCxTQUFMLENBQWUsQ0FBZixFQUFrQixNQUFNO01BQ3RCLE1BQU1HLElBQUksR0FBRyxLQUFLeEMsTUFBTCxDQUFZMEMsV0FBWixDQUF3QixLQUFLekMsUUFBN0IsQ0FBYjtNQUNBLEtBQUtBLFFBQUwsSUFBaUIsQ0FBakI7TUFDQXFDLFFBQVEsQ0FBQ0UsSUFBRCxDQUFSO0lBQ0QsQ0FKRDtFQUtEOztFQUVERyxZQUFZLENBQUNMLFFBQUQsRUFBbUM7SUFDN0MsS0FBS0QsU0FBTCxDQUFlLENBQWYsRUFBa0IsTUFBTTtNQUN0QixNQUFNRyxJQUFJLEdBQUcsS0FBS3hDLE1BQUwsQ0FBWTJDLFlBQVosQ0FBeUIsS0FBSzFDLFFBQTlCLENBQWI7TUFDQSxLQUFLQSxRQUFMLElBQWlCLENBQWpCO01BQ0FxQyxRQUFRLENBQUNFLElBQUQsQ0FBUjtJQUNELENBSkQ7RUFLRDs7RUFFREksWUFBWSxDQUFDTixRQUFELEVBQW1DO0lBQzdDLEtBQUtELFNBQUwsQ0FBZSxDQUFmLEVBQWtCLE1BQU07TUFDdEIsTUFBTUcsSUFBSSxHQUFHLEtBQUt4QyxNQUFMLENBQVk0QyxZQUFaLENBQXlCLEtBQUszQyxRQUE5QixDQUFiO01BQ0EsS0FBS0EsUUFBTCxJQUFpQixDQUFqQjtNQUNBcUMsUUFBUSxDQUFDRSxJQUFELENBQVI7SUFDRCxDQUpEO0VBS0Q7O0VBRURLLFdBQVcsQ0FBQ1AsUUFBRCxFQUFtQztJQUM1QyxLQUFLRCxTQUFMLENBQWUsQ0FBZixFQUFrQixNQUFNO01BQ3RCLE1BQU1HLElBQUksR0FBRyxLQUFLeEMsTUFBTCxDQUFZNkMsV0FBWixDQUF3QixLQUFLNUMsUUFBN0IsQ0FBYjtNQUNBLEtBQUtBLFFBQUwsSUFBaUIsQ0FBakI7TUFDQXFDLFFBQVEsQ0FBQ0UsSUFBRCxDQUFSO0lBQ0QsQ0FKRDtFQUtEOztFQUVETSxXQUFXLENBQUNSLFFBQUQsRUFBbUM7SUFDNUMsS0FBS0QsU0FBTCxDQUFlLENBQWYsRUFBa0IsTUFBTTtNQUN0QixNQUFNRyxJQUFJLEdBQUcsS0FBS3hDLE1BQUwsQ0FBWThDLFdBQVosQ0FBd0IsS0FBSzdDLFFBQTdCLENBQWI7TUFDQSxLQUFLQSxRQUFMLElBQWlCLENBQWpCO01BQ0FxQyxRQUFRLENBQUNFLElBQUQsQ0FBUjtJQUNELENBSkQ7RUFLRDs7RUFFRE8sWUFBWSxDQUFDVCxRQUFELEVBQW1DO0lBQzdDLEtBQUtELFNBQUwsQ0FBZSxDQUFmLEVBQWtCLE1BQU07TUFDdEIsTUFBTUcsSUFBSSxHQUFHLEtBQUt4QyxNQUFMLENBQVkrQyxZQUFaLENBQXlCLEtBQUs5QyxRQUE5QixDQUFiO01BQ0EsS0FBS0EsUUFBTCxJQUFpQixDQUFqQjtNQUNBcUMsUUFBUSxDQUFDRSxJQUFELENBQVI7SUFDRCxDQUpEO0VBS0Q7O0VBRURRLFlBQVksQ0FBQ1YsUUFBRCxFQUFtQztJQUM3QyxLQUFLRCxTQUFMLENBQWUsQ0FBZixFQUFrQixNQUFNO01BQ3RCLE1BQU1HLElBQUksR0FBRyxLQUFLeEMsTUFBTCxDQUFZZ0QsWUFBWixDQUF5QixLQUFLL0MsUUFBOUIsQ0FBYjtNQUNBLEtBQUtBLFFBQUwsSUFBaUIsQ0FBakI7TUFDQXFDLFFBQVEsQ0FBQ0UsSUFBRCxDQUFSO0lBQ0QsQ0FKRDtFQUtEOztFQUVEUyxjQUFjLENBQUNYLFFBQUQsRUFBaUM7SUFDN0MsS0FBS0QsU0FBTCxDQUFlLENBQWYsRUFBa0IsTUFBTTtNQUN0QixNQUFNN0IsTUFBTSxHQUFHMEMsY0FBS0MsR0FBTCxDQUNiRCxjQUFLRSxTQUFMLENBQ0VGLGNBQUtHLE1BQUwsQ0FDRSxLQUFLckQsTUFBTCxDQUFZLEtBQUtDLFFBQUwsR0FBZ0IsQ0FBNUIsSUFDQSxLQUFLRCxNQUFMLENBQVksS0FBS0MsUUFBTCxHQUFnQixDQUE1QixJQUFpQyxLQUFLLENBRHRDLEdBRUEsS0FBS0QsTUFBTCxDQUFZLEtBQUtDLFFBQUwsR0FBZ0IsQ0FBNUIsSUFBaUMsS0FBSyxFQUZ0QyxJQUdDLEtBQUtELE1BQUwsQ0FBWSxLQUFLQyxRQUFMLEdBQWdCLENBQTVCLEtBQWtDLEVBSG5DLENBREYsQ0FJeUM7TUFKekMsQ0FERixFQU9FaUQsY0FBS0csTUFBTCxDQUFZLEVBQVosQ0FQRixDQURhLEVBVWJILGNBQUtHLE1BQUwsQ0FDRSxLQUFLckQsTUFBTCxDQUFZLEtBQUtDLFFBQWpCLElBQ0EsS0FBS0QsTUFBTCxDQUFZLEtBQUtDLFFBQUwsR0FBZ0IsQ0FBNUIsSUFBaUMsS0FBSyxDQUR0QyxHQUVBLEtBQUtELE1BQUwsQ0FBWSxLQUFLQyxRQUFMLEdBQWdCLENBQTVCLElBQWlDLEtBQUssRUFGdEMsR0FHQSxLQUFLRCxNQUFMLENBQVksS0FBS0MsUUFBTCxHQUFnQixDQUE1QixJQUFpQyxLQUFLLEVBSnhDLENBVmEsQ0FBZjs7TUFrQkEsS0FBS0EsUUFBTCxJQUFpQixDQUFqQjtNQUVBcUMsUUFBUSxDQUFDOUIsTUFBRCxDQUFSO0lBQ0QsQ0F0QkQ7RUF1QkQ7O0VBRUQ4QyxXQUFXLENBQUNoQixRQUFELEVBQW1DO0lBQzVDLEtBQUtELFNBQUwsQ0FBZSxDQUFmLEVBQWtCLE1BQU07TUFDdEIsTUFBTUcsSUFBSSxHQUFHZSxJQUFJLENBQUNDLEdBQUwsQ0FBUyxDQUFULEVBQVksRUFBWixJQUFrQixLQUFLeEQsTUFBTCxDQUFZNkMsV0FBWixDQUF3QixLQUFLNUMsUUFBTCxHQUFnQixDQUF4QyxDQUFsQixHQUErRCxDQUFDLENBQUMsS0FBS0QsTUFBTCxDQUFZLEtBQUtDLFFBQUwsR0FBZ0IsQ0FBNUIsSUFBaUMsSUFBbEMsTUFBNEMsSUFBNUMsR0FBbUQsQ0FBbkQsR0FBdUQsQ0FBQyxDQUF6RCxJQUE4RCxLQUFLRCxNQUFMLENBQVkrQyxZQUFaLENBQXlCLEtBQUs5QyxRQUE5QixDQUExSTtNQUNBLEtBQUtBLFFBQUwsSUFBaUIsQ0FBakI7TUFDQXFDLFFBQVEsQ0FBQ0UsSUFBRCxDQUFSO0lBQ0QsQ0FKRDtFQUtEOztFQUVEaUIsV0FBVyxDQUFDbkIsUUFBRCxFQUFtQztJQUM1QyxLQUFLRCxTQUFMLENBQWUsQ0FBZixFQUFrQixNQUFNO01BQ3RCLE1BQU1HLElBQUksR0FBR2UsSUFBSSxDQUFDQyxHQUFMLENBQVMsQ0FBVCxFQUFZLEVBQVosSUFBa0IsS0FBS3hELE1BQUwsQ0FBWThDLFdBQVosQ0FBd0IsS0FBSzdDLFFBQTdCLENBQWxCLEdBQTJELENBQUMsQ0FBQyxLQUFLRCxNQUFMLENBQVksS0FBS0MsUUFBakIsSUFBNkIsSUFBOUIsTUFBd0MsSUFBeEMsR0FBK0MsQ0FBL0MsR0FBbUQsQ0FBQyxDQUFyRCxJQUEwRCxLQUFLRCxNQUFMLENBQVlnRCxZQUFaLENBQXlCLEtBQUsvQyxRQUFMLEdBQWdCLENBQXpDLENBQWxJO01BQ0EsS0FBS0EsUUFBTCxJQUFpQixDQUFqQjtNQUNBcUMsUUFBUSxDQUFDRSxJQUFELENBQVI7SUFDRCxDQUpEO0VBS0Q7O0VBRURrQixlQUFlLENBQUNwQixRQUFELEVBQWlDO0lBQzlDLEtBQUtELFNBQUwsQ0FBZSxDQUFmLEVBQWtCLE1BQU07TUFDdEIsTUFBTXNCLEdBQUcsR0FBR1QsY0FBS0csTUFBTCxDQUFZLEtBQUtyRCxNQUFMLENBQVkrQyxZQUFaLENBQXlCLEtBQUs5QyxRQUE5QixDQUFaLENBQVo7O01BQ0EsTUFBTTJELElBQUksR0FBR1YsY0FBS0csTUFBTCxDQUFZLEtBQUtyRCxNQUFMLENBQVkrQyxZQUFaLENBQXlCLEtBQUs5QyxRQUFMLEdBQWdCLENBQXpDLENBQVosQ0FBYjs7TUFFQSxLQUFLQSxRQUFMLElBQWlCLENBQWpCO01BRUFxQyxRQUFRLENBQUNZLGNBQUtDLEdBQUwsQ0FBU1EsR0FBVCxFQUFjVCxjQUFLRSxTQUFMLENBQWVRLElBQWYsRUFBcUJWLGNBQUtHLE1BQUwsQ0FBWSxFQUFaLENBQXJCLENBQWQsQ0FBRCxDQUFSO0lBQ0QsQ0FQRDtFQVFEOztFQUVEUSxZQUFZLENBQUN2QixRQUFELEVBQW1DO0lBQzdDLEtBQUtELFNBQUwsQ0FBZSxDQUFmLEVBQWtCLE1BQU07TUFDdEIsTUFBTUcsSUFBSSxHQUFHZSxJQUFJLENBQUNDLEdBQUwsQ0FBUyxDQUFULEVBQVksRUFBWixJQUFrQixLQUFLeEQsTUFBTCxDQUFZK0MsWUFBWixDQUF5QixLQUFLOUMsUUFBTCxHQUFnQixDQUF6QyxDQUFsQixHQUFnRSxLQUFLRCxNQUFMLENBQVkrQyxZQUFaLENBQXlCLEtBQUs5QyxRQUE5QixDQUE3RTtNQUNBLEtBQUtBLFFBQUwsSUFBaUIsQ0FBakI7TUFDQXFDLFFBQVEsQ0FBQ0UsSUFBRCxDQUFSO0lBQ0QsQ0FKRDtFQUtEOztFQUVEc0IsWUFBWSxDQUFDeEIsUUFBRCxFQUFtQztJQUM3QyxLQUFLRCxTQUFMLENBQWUsQ0FBZixFQUFrQixNQUFNO01BQ3RCLE1BQU1HLElBQUksR0FBR2UsSUFBSSxDQUFDQyxHQUFMLENBQVMsQ0FBVCxFQUFZLEVBQVosSUFBa0IsS0FBS3hELE1BQUwsQ0FBWWdELFlBQVosQ0FBeUIsS0FBSy9DLFFBQTlCLENBQWxCLEdBQTRELEtBQUtELE1BQUwsQ0FBWWdELFlBQVosQ0FBeUIsS0FBSy9DLFFBQUwsR0FBZ0IsQ0FBekMsQ0FBekU7TUFDQSxLQUFLQSxRQUFMLElBQWlCLENBQWpCO01BQ0FxQyxRQUFRLENBQUNFLElBQUQsQ0FBUjtJQUNELENBSkQ7RUFLRDs7RUFFRHVCLFdBQVcsQ0FBQ3pCLFFBQUQsRUFBbUM7SUFDNUMsS0FBS0QsU0FBTCxDQUFlLENBQWYsRUFBa0IsTUFBTTtNQUN0QixNQUFNRyxJQUFJLEdBQUcsS0FBS3hDLE1BQUwsQ0FBWStELFdBQVosQ0FBd0IsS0FBSzlELFFBQTdCLENBQWI7TUFDQSxLQUFLQSxRQUFMLElBQWlCLENBQWpCO01BQ0FxQyxRQUFRLENBQUNFLElBQUQsQ0FBUjtJQUNELENBSkQ7RUFLRDs7RUFFRHdCLFdBQVcsQ0FBQzFCLFFBQUQsRUFBbUM7SUFDNUMsS0FBS0QsU0FBTCxDQUFlLENBQWYsRUFBa0IsTUFBTTtNQUN0QixNQUFNRyxJQUFJLEdBQUcsS0FBS3hDLE1BQUwsQ0FBWWdFLFdBQVosQ0FBd0IsS0FBSy9ELFFBQTdCLENBQWI7TUFDQSxLQUFLQSxRQUFMLElBQWlCLENBQWpCO01BQ0FxQyxRQUFRLENBQUNFLElBQUQsQ0FBUjtJQUNELENBSkQ7RUFLRDs7RUFFRHlCLFlBQVksQ0FBQzNCLFFBQUQsRUFBbUM7SUFDN0MsS0FBS0QsU0FBTCxDQUFlLENBQWYsRUFBa0IsTUFBTTtNQUN0QixNQUFNRyxJQUFJLEdBQUcsS0FBS3hDLE1BQUwsQ0FBWWlFLFlBQVosQ0FBeUIsS0FBS2hFLFFBQTlCLENBQWI7TUFDQSxLQUFLQSxRQUFMLElBQWlCLENBQWpCO01BQ0FxQyxRQUFRLENBQUNFLElBQUQsQ0FBUjtJQUNELENBSkQ7RUFLRDs7RUFFRDBCLFlBQVksQ0FBQzVCLFFBQUQsRUFBbUM7SUFDN0MsS0FBS0QsU0FBTCxDQUFlLENBQWYsRUFBa0IsTUFBTTtNQUN0QixNQUFNRyxJQUFJLEdBQUcsS0FBS3hDLE1BQUwsQ0FBWWtFLFlBQVosQ0FBeUIsS0FBS2pFLFFBQTlCLENBQWI7TUFDQSxLQUFLQSxRQUFMLElBQWlCLENBQWpCO01BQ0FxQyxRQUFRLENBQUNFLElBQUQsQ0FBUjtJQUNELENBSkQ7RUFLRDs7RUFFRDJCLFlBQVksQ0FBQzdCLFFBQUQsRUFBbUM7SUFDN0MsS0FBS0QsU0FBTCxDQUFlLENBQWYsRUFBa0IsTUFBTTtNQUN0QixNQUFNc0IsR0FBRyxHQUFHLEtBQUszRCxNQUFMLENBQVkyQyxZQUFaLENBQXlCLEtBQUsxQyxRQUE5QixDQUFaO01BQ0EsTUFBTTJELElBQUksR0FBRyxLQUFLNUQsTUFBTCxDQUFZK0IsU0FBWixDQUFzQixLQUFLOUIsUUFBTCxHQUFnQixDQUF0QyxDQUFiO01BRUEsS0FBS0EsUUFBTCxJQUFpQixDQUFqQjtNQUVBcUMsUUFBUSxDQUFDcUIsR0FBRyxHQUFJQyxJQUFJLElBQUksRUFBaEIsQ0FBUjtJQUNELENBUEQ7RUFRRDs7RUFFRFEsWUFBWSxDQUFDOUIsUUFBRCxFQUFtQztJQUM3QyxLQUFLRCxTQUFMLENBQWUsQ0FBZixFQUFrQixNQUFNO01BQ3RCLE1BQU1zQixHQUFHLEdBQUcsS0FBSzNELE1BQUwsQ0FBWStDLFlBQVosQ0FBeUIsS0FBSzlDLFFBQTlCLENBQVo7TUFDQSxNQUFNMkQsSUFBSSxHQUFHLEtBQUs1RCxNQUFMLENBQVkrQixTQUFaLENBQXNCLEtBQUs5QixRQUFMLEdBQWdCLENBQXRDLENBQWI7TUFFQSxLQUFLQSxRQUFMLElBQWlCLENBQWpCO01BRUFxQyxRQUFRLENBQUUsY0FBY3NCLElBQWYsR0FBdUJELEdBQXhCLENBQVI7SUFDRCxDQVBEO0VBUUQ7O0VBRURVLGdCQUFnQixDQUFDL0IsUUFBRCxFQUFtQztJQUNqRCxLQUFLRCxTQUFMLENBQWUsQ0FBZixFQUFrQixNQUFNO01BQ3RCLE1BQU1zQixHQUFHLEdBQUcsS0FBSzNELE1BQUwsQ0FBWStDLFlBQVosQ0FBeUIsS0FBSzlDLFFBQTlCLENBQVo7TUFDQSxNQUFNMkQsSUFBSSxHQUFHLEtBQUs1RCxNQUFMLENBQVkrQyxZQUFaLENBQXlCLEtBQUs5QyxRQUFMLEdBQWdCLENBQXpDLENBQWI7TUFFQSxLQUFLQSxRQUFMLElBQWlCLENBQWpCO01BRUFxQyxRQUFRLENBQUUsY0FBY3NCLElBQWYsR0FBdUJELEdBQXhCLENBQVI7SUFDRCxDQVBEO0VBUUQ7O0VBRURXLGdCQUFnQixDQUFDaEMsUUFBRCxFQUFtQztJQUNqRCxLQUFLRCxTQUFMLENBQWUsRUFBZixFQUFtQixNQUFNO01BQ3ZCLE1BQU1rQyxNQUFNLEdBQUcsS0FBS3ZFLE1BQUwsQ0FBWStDLFlBQVosQ0FBeUIsS0FBSzlDLFFBQTlCLENBQWY7TUFDQSxNQUFNdUUsTUFBTSxHQUFHLEtBQUt4RSxNQUFMLENBQVkrQyxZQUFaLENBQXlCLEtBQUs5QyxRQUFMLEdBQWdCLENBQXpDLENBQWY7TUFDQSxNQUFNd0UsTUFBTSxHQUFHLEtBQUt6RSxNQUFMLENBQVkrQyxZQUFaLENBQXlCLEtBQUs5QyxRQUFMLEdBQWdCLENBQXpDLENBQWY7TUFFQSxLQUFLQSxRQUFMLElBQWlCLEVBQWpCO01BRUFxQyxRQUFRLENBQUNpQyxNQUFNLEdBQUksY0FBY0MsTUFBeEIsR0FBbUMsY0FBYyxXQUFkLEdBQTRCQyxNQUFoRSxDQUFSO0lBQ0QsQ0FSRDtFQVNEOztFQUVEQyxpQkFBaUIsQ0FBQ3BDLFFBQUQsRUFBbUM7SUFDbEQsS0FBS0QsU0FBTCxDQUFlLEVBQWYsRUFBbUIsTUFBTTtNQUN2QixNQUFNa0MsTUFBTSxHQUFHLEtBQUt2RSxNQUFMLENBQVkrQyxZQUFaLENBQXlCLEtBQUs5QyxRQUE5QixDQUFmO01BQ0EsTUFBTXVFLE1BQU0sR0FBRyxLQUFLeEUsTUFBTCxDQUFZK0MsWUFBWixDQUF5QixLQUFLOUMsUUFBTCxHQUFnQixDQUF6QyxDQUFmO01BQ0EsTUFBTXdFLE1BQU0sR0FBRyxLQUFLekUsTUFBTCxDQUFZK0MsWUFBWixDQUF5QixLQUFLOUMsUUFBTCxHQUFnQixDQUF6QyxDQUFmO01BQ0EsTUFBTTBFLE1BQU0sR0FBRyxLQUFLM0UsTUFBTCxDQUFZK0MsWUFBWixDQUF5QixLQUFLOUMsUUFBTCxHQUFnQixFQUF6QyxDQUFmO01BRUEsS0FBS0EsUUFBTCxJQUFpQixFQUFqQjtNQUVBcUMsUUFBUSxDQUFDaUMsTUFBTSxHQUFJLGNBQWNDLE1BQXhCLEdBQW1DLGNBQWMsV0FBZCxHQUE0QkMsTUFBL0QsR0FBMEUsY0FBYyxXQUFkLEdBQTRCLFdBQTVCLEdBQTBDRSxNQUFySCxDQUFSO0lBQ0QsQ0FURDtFQVVELENBOVZVLENBZ1dYOzs7RUFFQUMsVUFBVSxDQUFDaEUsTUFBRCxFQUFpQjBCLFFBQWpCLEVBQW1EO0lBQzNELEtBQUtELFNBQUwsQ0FBZXpCLE1BQWYsRUFBdUIsTUFBTTtNQUMzQixNQUFNNEIsSUFBSSxHQUFHLEtBQUt4QyxNQUFMLENBQVllLEtBQVosQ0FBa0IsS0FBS2QsUUFBdkIsRUFBaUMsS0FBS0EsUUFBTCxHQUFnQlcsTUFBakQsQ0FBYjtNQUNBLEtBQUtYLFFBQUwsSUFBaUJXLE1BQWpCO01BQ0EwQixRQUFRLENBQUNFLElBQUQsQ0FBUjtJQUNELENBSkQ7RUFLRCxDQXhXVSxDQTBXWDs7O0VBQ0FxQyxZQUFZLENBQUN2QyxRQUFELEVBQW1DO0lBQzdDLEtBQUtQLFNBQUwsQ0FBZ0JuQixNQUFELElBQVk7TUFDekIsS0FBS2dFLFVBQUwsQ0FBZ0JoRSxNQUFNLEdBQUcsQ0FBekIsRUFBNkI0QixJQUFELElBQVU7UUFDcENGLFFBQVEsQ0FBQ0UsSUFBSSxDQUFDc0MsUUFBTCxDQUFjLE1BQWQsQ0FBRCxDQUFSO01BQ0QsQ0FGRDtJQUdELENBSkQ7RUFLRCxDQWpYVSxDQW1YWDs7O0VBQ0FDLGFBQWEsQ0FBQ3pDLFFBQUQsRUFBbUM7SUFDOUMsS0FBS0ssWUFBTCxDQUFtQi9CLE1BQUQsSUFBWTtNQUM1QixLQUFLZ0UsVUFBTCxDQUFnQmhFLE1BQU0sR0FBRyxDQUF6QixFQUE2QjRCLElBQUQsSUFBVTtRQUNwQ0YsUUFBUSxDQUFDRSxJQUFJLENBQUNzQyxRQUFMLENBQWMsTUFBZCxDQUFELENBQVI7TUFDRCxDQUZEO0lBR0QsQ0FKRDtFQUtELENBMVhVLENBNFhYOzs7RUFDQUUsWUFBWSxDQUFDMUMsUUFBRCxFQUFtQztJQUM3QyxLQUFLUCxTQUFMLENBQWdCbkIsTUFBRCxJQUFZO01BQ3pCLEtBQUtnRSxVQUFMLENBQWdCaEUsTUFBaEIsRUFBd0IwQixRQUF4QjtJQUNELENBRkQ7RUFHRCxDQWpZVSxDQW1ZWDs7O0VBQ0EyQyxhQUFhLENBQUMzQyxRQUFELEVBQW1DO0lBQzlDLEtBQUtLLFlBQUwsQ0FBbUIvQixNQUFELElBQVk7TUFDNUIsS0FBS2dFLFVBQUwsQ0FBZ0JoRSxNQUFoQixFQUF3QjBCLFFBQXhCO0lBQ0QsQ0FGRDtFQUdEOztBQXhZVTs7ZUEyWUV0QixNOztBQUNma0UsTUFBTSxDQUFDQyxPQUFQLEdBQWlCbkUsTUFBakIifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.Parser = void 0;

var _events = require("events");

var _streamParser = _interopRequireDefault(require("./stream-parser"));

var _stream = require("stream");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

class Parser extends _events.EventEmitter {
  constructor(message, debug, handler, options) {
    super();
    this.debug = void 0;
    this.options = void 0;
    this.parser = void 0;
    this.debug = debug;
    this.options = options;
    this.parser = _stream.Readable.from(_streamParser.default.parseTokens(message, this.debug, this.options));
    this.parser.on('data', token => {
      handler[token.handlerName](token);
    });
    this.parser.on('drain', () => {
      this.emit('drain');
    });
    this.parser.on('end', () => {
      this.emit('end');
    });
  }

  pause() {
    return this.parser.pause();
  }

  resume() {
    return this.parser.resume();
  }

}

exports.Parser = Parser;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQYXJzZXIiLCJFdmVudEVtaXR0ZXIiLCJjb25zdHJ1Y3RvciIsIm1lc3NhZ2UiLCJkZWJ1ZyIsImhhbmRsZXIiLCJvcHRpb25zIiwicGFyc2VyIiwiUmVhZGFibGUiLCJmcm9tIiwiU3RyZWFtUGFyc2VyIiwicGFyc2VUb2tlbnMiLCJvbiIsInRva2VuIiwiaGFuZGxlck5hbWUiLCJlbWl0IiwicGF1c2UiLCJyZXN1bWUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdG9rZW4vdG9rZW4tc3RyZWFtLXBhcnNlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnO1xuaW1wb3J0IFN0cmVhbVBhcnNlciwgeyBQYXJzZXJPcHRpb25zIH0gZnJvbSAnLi9zdHJlYW0tcGFyc2VyJztcbmltcG9ydCBEZWJ1ZyBmcm9tICcuLi9kZWJ1Zyc7XG5pbXBvcnQgeyBUb2tlbiB9IGZyb20gJy4vdG9rZW4nO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSAnLi4vbWVzc2FnZSc7XG5pbXBvcnQgeyBUb2tlbkhhbmRsZXIgfSBmcm9tICcuL2hhbmRsZXInO1xuXG5leHBvcnQgY2xhc3MgUGFyc2VyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgZGVidWc6IERlYnVnO1xuICBvcHRpb25zOiBQYXJzZXJPcHRpb25zO1xuICBwYXJzZXI6IFJlYWRhYmxlO1xuXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IE1lc3NhZ2UsIGRlYnVnOiBEZWJ1ZywgaGFuZGxlcjogVG9rZW5IYW5kbGVyLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuZGVidWcgPSBkZWJ1ZztcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgdGhpcy5wYXJzZXIgPSBSZWFkYWJsZS5mcm9tKFN0cmVhbVBhcnNlci5wYXJzZVRva2VucyhtZXNzYWdlLCB0aGlzLmRlYnVnLCB0aGlzLm9wdGlvbnMpKTtcbiAgICB0aGlzLnBhcnNlci5vbignZGF0YScsICh0b2tlbjogVG9rZW4pID0+IHtcbiAgICAgIGhhbmRsZXJbdG9rZW4uaGFuZGxlck5hbWUgYXMga2V5b2YgVG9rZW5IYW5kbGVyXSh0b2tlbiBhcyBhbnkpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5wYXJzZXIub24oJ2RyYWluJywgKCkgPT4ge1xuICAgICAgdGhpcy5lbWl0KCdkcmFpbicpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5wYXJzZXIub24oJ2VuZCcsICgpID0+IHtcbiAgICAgIHRoaXMuZW1pdCgnZW5kJyk7XG4gICAgfSk7XG4gIH1cblxuICBkZWNsYXJlIG9uOiAoXG4gICAgKChldmVudDogJ2VuZCcsIGxpc3RlbmVyOiAoKSA9PiB2b2lkKSA9PiB0aGlzKSAmXG4gICAgKChldmVudDogc3RyaW5nIHwgc3ltYm9sLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSA9PiB0aGlzKVxuICApO1xuXG4gIHBhdXNlKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5wYXVzZSgpO1xuICB9XG5cbiAgcmVzdW1lKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5yZXN1bWUoKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBR0E7Ozs7QUFJTyxNQUFNQSxNQUFOLFNBQXFCQyxvQkFBckIsQ0FBa0M7RUFLdkNDLFdBQVcsQ0FBQ0MsT0FBRCxFQUFtQkMsS0FBbkIsRUFBaUNDLE9BQWpDLEVBQXdEQyxPQUF4RCxFQUFnRjtJQUN6RjtJQUR5RixLQUozRkYsS0FJMkY7SUFBQSxLQUgzRkUsT0FHMkY7SUFBQSxLQUYzRkMsTUFFMkY7SUFHekYsS0FBS0gsS0FBTCxHQUFhQSxLQUFiO0lBQ0EsS0FBS0UsT0FBTCxHQUFlQSxPQUFmO0lBRUEsS0FBS0MsTUFBTCxHQUFjQyxpQkFBU0MsSUFBVCxDQUFjQyxzQkFBYUMsV0FBYixDQUF5QlIsT0FBekIsRUFBa0MsS0FBS0MsS0FBdkMsRUFBOEMsS0FBS0UsT0FBbkQsQ0FBZCxDQUFkO0lBQ0EsS0FBS0MsTUFBTCxDQUFZSyxFQUFaLENBQWUsTUFBZixFQUF3QkMsS0FBRCxJQUFrQjtNQUN2Q1IsT0FBTyxDQUFDUSxLQUFLLENBQUNDLFdBQVAsQ0FBUCxDQUFpREQsS0FBakQ7SUFDRCxDQUZEO0lBSUEsS0FBS04sTUFBTCxDQUFZSyxFQUFaLENBQWUsT0FBZixFQUF3QixNQUFNO01BQzVCLEtBQUtHLElBQUwsQ0FBVSxPQUFWO0lBQ0QsQ0FGRDtJQUlBLEtBQUtSLE1BQUwsQ0FBWUssRUFBWixDQUFlLEtBQWYsRUFBc0IsTUFBTTtNQUMxQixLQUFLRyxJQUFMLENBQVUsS0FBVjtJQUNELENBRkQ7RUFHRDs7RUFPREMsS0FBSyxHQUFHO0lBQ04sT0FBTyxLQUFLVCxNQUFMLENBQVlTLEtBQVosRUFBUDtFQUNEOztFQUVEQyxNQUFNLEdBQUc7SUFDUCxPQUFPLEtBQUtWLE1BQUwsQ0FBWVUsTUFBWixFQUFQO0VBQ0Q7O0FBcENzQyJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.Token = exports.TYPE = exports.SSPIToken = exports.RowToken = exports.RoutingEnvChangeToken = exports.RollbackTransactionEnvChangeToken = exports.ReturnValueToken = exports.ReturnStatusToken = exports.ResetConnectionEnvChangeToken = exports.PacketSizeEnvChangeToken = exports.OrderToken = exports.NBCRowToken = exports.LoginAckToken = exports.LanguageEnvChangeToken = exports.InfoMessageToken = exports.FedAuthInfoToken = exports.FeatureExtAckToken = exports.ErrorMessageToken = exports.DoneToken = exports.DoneProcToken = exports.DoneInProcToken = exports.DatabaseMirroringPartnerEnvChangeToken = exports.DatabaseEnvChangeToken = exports.CommitTransactionEnvChangeToken = exports.CollationChangeToken = exports.ColMetadataToken = exports.CharsetEnvChangeToken = exports.BeginTransactionEnvChangeToken = void 0;
const TYPE = {
  ALTMETADATA: 0x88,
  ALTROW: 0xD3,
  COLMETADATA: 0x81,
  COLINFO: 0xA5,
  DONE: 0xFD,
  DONEPROC: 0xFE,
  DONEINPROC: 0xFF,
  ENVCHANGE: 0xE3,
  ERROR: 0xAA,
  FEATUREEXTACK: 0xAE,
  FEDAUTHINFO: 0xEE,
  INFO: 0xAB,
  LOGINACK: 0xAD,
  NBCROW: 0xD2,
  OFFSET: 0x78,
  ORDER: 0xA9,
  RETURNSTATUS: 0x79,
  RETURNVALUE: 0xAC,
  ROW: 0xD1,
  SSPI: 0xED,
  TABNAME: 0xA4
};
exports.TYPE = TYPE;

class Token {
  constructor(name, handlerName) {
    this.name = void 0;
    this.handlerName = void 0;
    this.name = name;
    this.handlerName = handlerName;
  }

}

exports.Token = Token;

class ColMetadataToken extends Token {
  constructor(columns) {
    super('COLMETADATA', 'onColMetadata');
    this.columns = void 0;
    this.columns = columns;
  }

}

exports.ColMetadataToken = ColMetadataToken;

class DoneToken extends Token {
  constructor({
    more,
    sqlError,
    attention,
    serverError,
    rowCount,
    curCmd
  }) {
    super('DONE', 'onDone');
    this.more = void 0;
    this.sqlError = void 0;
    this.attention = void 0;
    this.serverError = void 0;
    this.rowCount = void 0;
    this.curCmd = void 0;
    this.more = more;
    this.sqlError = sqlError;
    this.attention = attention;
    this.serverError = serverError;
    this.rowCount = rowCount;
    this.curCmd = curCmd;
  }

}

exports.DoneToken = DoneToken;

class DoneInProcToken extends Token {
  constructor({
    more,
    sqlError,
    attention,
    serverError,
    rowCount,
    curCmd
  }) {
    super('DONEINPROC', 'onDoneInProc');
    this.more = void 0;
    this.sqlError = void 0;
    this.attention = void 0;
    this.serverError = void 0;
    this.rowCount = void 0;
    this.curCmd = void 0;
    this.more = more;
    this.sqlError = sqlError;
    this.attention = attention;
    this.serverError = serverError;
    this.rowCount = rowCount;
    this.curCmd = curCmd;
  }

}

exports.DoneInProcToken = DoneInProcToken;

class DoneProcToken extends Token {
  constructor({
    more,
    sqlError,
    attention,
    serverError,
    rowCount,
    curCmd
  }) {
    super('DONEPROC', 'onDoneProc');
    this.more = void 0;
    this.sqlError = void 0;
    this.attention = void 0;
    this.serverError = void 0;
    this.rowCount = void 0;
    this.curCmd = void 0;
    this.more = more;
    this.sqlError = sqlError;
    this.attention = attention;
    this.serverError = serverError;
    this.rowCount = rowCount;
    this.curCmd = curCmd;
  }

}

exports.DoneProcToken = DoneProcToken;

class DatabaseEnvChangeToken extends Token {
  constructor(newValue, oldValue) {
    super('ENVCHANGE', 'onDatabaseChange');
    this.type = void 0;
    this.newValue = void 0;
    this.oldValue = void 0;
    this.type = 'DATABASE';
    this.newValue = newValue;
    this.oldValue = oldValue;
  }

}

exports.DatabaseEnvChangeToken = DatabaseEnvChangeToken;

class LanguageEnvChangeToken extends Token {
  constructor(newValue, oldValue) {
    super('ENVCHANGE', 'onLanguageChange');
    this.type = void 0;
    this.newValue = void 0;
    this.oldValue = void 0;
    this.type = 'LANGUAGE';
    this.newValue = newValue;
    this.oldValue = oldValue;
  }

}

exports.LanguageEnvChangeToken = LanguageEnvChangeToken;

class CharsetEnvChangeToken extends Token {
  constructor(newValue, oldValue) {
    super('ENVCHANGE', 'onCharsetChange');
    this.type = void 0;
    this.newValue = void 0;
    this.oldValue = void 0;
    this.type = 'CHARSET';
    this.newValue = newValue;
    this.oldValue = oldValue;
  }

}

exports.CharsetEnvChangeToken = CharsetEnvChangeToken;

class PacketSizeEnvChangeToken extends Token {
  constructor(newValue, oldValue) {
    super('ENVCHANGE', 'onPacketSizeChange');
    this.type = void 0;
    this.newValue = void 0;
    this.oldValue = void 0;
    this.type = 'PACKET_SIZE';
    this.newValue = newValue;
    this.oldValue = oldValue;
  }

}

exports.PacketSizeEnvChangeToken = PacketSizeEnvChangeToken;

class BeginTransactionEnvChangeToken extends Token {
  constructor(newValue, oldValue) {
    super('ENVCHANGE', 'onBeginTransaction');
    this.type = void 0;
    this.newValue = void 0;
    this.oldValue = void 0;
    this.type = 'BEGIN_TXN';
    this.newValue = newValue;
    this.oldValue = oldValue;
  }

}

exports.BeginTransactionEnvChangeToken = BeginTransactionEnvChangeToken;

class CommitTransactionEnvChangeToken extends Token {
  constructor(newValue, oldValue) {
    super('ENVCHANGE', 'onCommitTransaction');
    this.type = void 0;
    this.newValue = void 0;
    this.oldValue = void 0;
    this.type = 'COMMIT_TXN';
    this.newValue = newValue;
    this.oldValue = oldValue;
  }

}

exports.CommitTransactionEnvChangeToken = CommitTransactionEnvChangeToken;

class RollbackTransactionEnvChangeToken extends Token {
  constructor(newValue, oldValue) {
    super('ENVCHANGE', 'onRollbackTransaction');
    this.type = void 0;
    this.oldValue = void 0;
    this.newValue = void 0;
    this.type = 'ROLLBACK_TXN';
    this.newValue = newValue;
    this.oldValue = oldValue;
  }

}

exports.RollbackTransactionEnvChangeToken = RollbackTransactionEnvChangeToken;

class DatabaseMirroringPartnerEnvChangeToken extends Token {
  constructor(newValue, oldValue) {
    super('ENVCHANGE', 'onDatabaseMirroringPartner');
    this.type = void 0;
    this.oldValue = void 0;
    this.newValue = void 0;
    this.type = 'DATABASE_MIRRORING_PARTNER';
    this.newValue = newValue;
    this.oldValue = oldValue;
  }

}

exports.DatabaseMirroringPartnerEnvChangeToken = DatabaseMirroringPartnerEnvChangeToken;

class ResetConnectionEnvChangeToken extends Token {
  constructor(newValue, oldValue) {
    super('ENVCHANGE', 'onResetConnection');
    this.type = void 0;
    this.oldValue = void 0;
    this.newValue = void 0;
    this.type = 'RESET_CONNECTION';
    this.newValue = newValue;
    this.oldValue = oldValue;
  }

}

exports.ResetConnectionEnvChangeToken = ResetConnectionEnvChangeToken;

class CollationChangeToken extends Token {
  constructor(newValue, oldValue) {
    super('ENVCHANGE', 'onSqlCollationChange');
    this.type = void 0;
    this.oldValue = void 0;
    this.newValue = void 0;
    this.type = 'SQL_COLLATION';
    this.newValue = newValue;
    this.oldValue = oldValue;
  }

}

exports.CollationChangeToken = CollationChangeToken;

class RoutingEnvChangeToken extends Token {
  constructor(newValue, oldValue) {
    super('ENVCHANGE', 'onRoutingChange');
    this.type = void 0;
    this.newValue = void 0;
    this.oldValue = void 0;
    this.type = 'ROUTING_CHANGE';
    this.newValue = newValue;
    this.oldValue = oldValue;
  }

}

exports.RoutingEnvChangeToken = RoutingEnvChangeToken;

class FeatureExtAckToken extends Token {
  /** Value of UTF8_SUPPORT acknowledgement.
   *
   * undefined when UTF8_SUPPORT not included in token. */
  constructor(fedAuth, utf8Support) {
    super('FEATUREEXTACK', 'onFeatureExtAck');
    this.fedAuth = void 0;
    this.utf8Support = void 0;
    this.fedAuth = fedAuth;
    this.utf8Support = utf8Support;
  }

}

exports.FeatureExtAckToken = FeatureExtAckToken;

class FedAuthInfoToken extends Token {
  constructor(spn, stsurl) {
    super('FEDAUTHINFO', 'onFedAuthInfo');
    this.spn = void 0;
    this.stsurl = void 0;
    this.spn = spn;
    this.stsurl = stsurl;
  }

}

exports.FedAuthInfoToken = FedAuthInfoToken;

class InfoMessageToken extends Token {
  constructor({
    number,
    state,
    class: clazz,
    message,
    serverName,
    procName,
    lineNumber
  }) {
    super('INFO', 'onInfoMessage');
    this.number = void 0;
    this.state = void 0;
    this.class = void 0;
    this.message = void 0;
    this.serverName = void 0;
    this.procName = void 0;
    this.lineNumber = void 0;
    this.number = number;
    this.state = state;
    this.class = clazz;
    this.message = message;
    this.serverName = serverName;
    this.procName = procName;
    this.lineNumber = lineNumber;
  }

}

exports.InfoMessageToken = InfoMessageToken;

class ErrorMessageToken extends Token {
  constructor({
    number,
    state,
    class: clazz,
    message,
    serverName,
    procName,
    lineNumber
  }) {
    super('ERROR', 'onErrorMessage');
    this.number = void 0;
    this.state = void 0;
    this.class = void 0;
    this.message = void 0;
    this.serverName = void 0;
    this.procName = void 0;
    this.lineNumber = void 0;
    this.number = number;
    this.state = state;
    this.class = clazz;
    this.message = message;
    this.serverName = serverName;
    this.procName = procName;
    this.lineNumber = lineNumber;
  }

}

exports.ErrorMessageToken = ErrorMessageToken;

class LoginAckToken extends Token {
  constructor({
    interface: interfaze,
    tdsVersion,
    progName,
    progVersion
  }) {
    super('LOGINACK', 'onLoginAck');
    this.interface = void 0;
    this.tdsVersion = void 0;
    this.progName = void 0;
    this.progVersion = void 0;
    this.interface = interfaze;
    this.tdsVersion = tdsVersion;
    this.progName = progName;
    this.progVersion = progVersion;
  }

}

exports.LoginAckToken = LoginAckToken;

class NBCRowToken extends Token {
  constructor(columns) {
    super('NBCROW', 'onRow');
    this.columns = void 0;
    this.columns = columns;
  }

}

exports.NBCRowToken = NBCRowToken;

class OrderToken extends Token {
  constructor(orderColumns) {
    super('ORDER', 'onOrder');
    this.orderColumns = void 0;
    this.orderColumns = orderColumns;
  }

}

exports.OrderToken = OrderToken;

class ReturnStatusToken extends Token {
  constructor(value) {
    super('RETURNSTATUS', 'onReturnStatus');
    this.value = void 0;
    this.value = value;
  }

}

exports.ReturnStatusToken = ReturnStatusToken;

class ReturnValueToken extends Token {
  constructor({
    paramOrdinal,
    paramName,
    metadata,
    value
  }) {
    super('RETURNVALUE', 'onReturnValue');
    this.paramOrdinal = void 0;
    this.paramName = void 0;
    this.metadata = void 0;
    this.value = void 0;
    this.paramOrdinal = paramOrdinal;
    this.paramName = paramName;
    this.metadata = metadata;
    this.value = value;
  }

}

exports.ReturnValueToken = ReturnValueToken;

class RowToken extends Token {
  constructor(columns) {
    super('ROW', 'onRow');
    this.columns = void 0;
    this.columns = columns;
  }

}

exports.RowToken = RowToken;

class SSPIToken extends Token {
  constructor(ntlmpacket, ntlmpacketBuffer) {
    super('SSPICHALLENGE', 'onSSPI');
    this.ntlmpacket = void 0;
    this.ntlmpacketBuffer = void 0;
    this.ntlmpacket = ntlmpacket;
    this.ntlmpacketBuffer = ntlmpacketBuffer;
  }

}

exports.SSPIToken = SSPIToken;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUWVBFIiwiQUxUTUVUQURBVEEiLCJBTFRST1ciLCJDT0xNRVRBREFUQSIsIkNPTElORk8iLCJET05FIiwiRE9ORVBST0MiLCJET05FSU5QUk9DIiwiRU5WQ0hBTkdFIiwiRVJST1IiLCJGRUFUVVJFRVhUQUNLIiwiRkVEQVVUSElORk8iLCJJTkZPIiwiTE9HSU5BQ0siLCJOQkNST1ciLCJPRkZTRVQiLCJPUkRFUiIsIlJFVFVSTlNUQVRVUyIsIlJFVFVSTlZBTFVFIiwiUk9XIiwiU1NQSSIsIlRBQk5BTUUiLCJUb2tlbiIsImNvbnN0cnVjdG9yIiwibmFtZSIsImhhbmRsZXJOYW1lIiwiQ29sTWV0YWRhdGFUb2tlbiIsImNvbHVtbnMiLCJEb25lVG9rZW4iLCJtb3JlIiwic3FsRXJyb3IiLCJhdHRlbnRpb24iLCJzZXJ2ZXJFcnJvciIsInJvd0NvdW50IiwiY3VyQ21kIiwiRG9uZUluUHJvY1Rva2VuIiwiRG9uZVByb2NUb2tlbiIsIkRhdGFiYXNlRW52Q2hhbmdlVG9rZW4iLCJuZXdWYWx1ZSIsIm9sZFZhbHVlIiwidHlwZSIsIkxhbmd1YWdlRW52Q2hhbmdlVG9rZW4iLCJDaGFyc2V0RW52Q2hhbmdlVG9rZW4iLCJQYWNrZXRTaXplRW52Q2hhbmdlVG9rZW4iLCJCZWdpblRyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4iLCJDb21taXRUcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuIiwiUm9sbGJhY2tUcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuIiwiRGF0YWJhc2VNaXJyb3JpbmdQYXJ0bmVyRW52Q2hhbmdlVG9rZW4iLCJSZXNldENvbm5lY3Rpb25FbnZDaGFuZ2VUb2tlbiIsIkNvbGxhdGlvbkNoYW5nZVRva2VuIiwiUm91dGluZ0VudkNoYW5nZVRva2VuIiwiRmVhdHVyZUV4dEFja1Rva2VuIiwiZmVkQXV0aCIsInV0ZjhTdXBwb3J0IiwiRmVkQXV0aEluZm9Ub2tlbiIsInNwbiIsInN0c3VybCIsIkluZm9NZXNzYWdlVG9rZW4iLCJudW1iZXIiLCJzdGF0ZSIsImNsYXNzIiwiY2xhenoiLCJtZXNzYWdlIiwic2VydmVyTmFtZSIsInByb2NOYW1lIiwibGluZU51bWJlciIsIkVycm9yTWVzc2FnZVRva2VuIiwiTG9naW5BY2tUb2tlbiIsImludGVyZmFjZSIsImludGVyZmF6ZSIsInRkc1ZlcnNpb24iLCJwcm9nTmFtZSIsInByb2dWZXJzaW9uIiwiTkJDUm93VG9rZW4iLCJPcmRlclRva2VuIiwib3JkZXJDb2x1bW5zIiwiUmV0dXJuU3RhdHVzVG9rZW4iLCJ2YWx1ZSIsIlJldHVyblZhbHVlVG9rZW4iLCJwYXJhbU9yZGluYWwiLCJwYXJhbU5hbWUiLCJtZXRhZGF0YSIsIlJvd1Rva2VuIiwiU1NQSVRva2VuIiwibnRsbXBhY2tldCIsIm50bG1wYWNrZXRCdWZmZXIiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdG9rZW4vdG9rZW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29sbGF0aW9uIH0gZnJvbSAnLi4vY29sbGF0aW9uJztcbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSAnLi4vbWV0YWRhdGEtcGFyc2VyJztcbmltcG9ydCB7IENvbHVtbk1ldGFkYXRhIH0gZnJvbSAnLi9jb2xtZXRhZGF0YS10b2tlbi1wYXJzZXInO1xuaW1wb3J0IHsgVG9rZW5IYW5kbGVyIH0gZnJvbSAnLi9oYW5kbGVyJztcblxuZXhwb3J0IGNvbnN0IFRZUEUgPSB7XG4gIEFMVE1FVEFEQVRBOiAweDg4LFxuICBBTFRST1c6IDB4RDMsXG4gIENPTE1FVEFEQVRBOiAweDgxLFxuICBDT0xJTkZPOiAweEE1LFxuICBET05FOiAweEZELFxuICBET05FUFJPQzogMHhGRSxcbiAgRE9ORUlOUFJPQzogMHhGRixcbiAgRU5WQ0hBTkdFOiAweEUzLFxuICBFUlJPUjogMHhBQSxcbiAgRkVBVFVSRUVYVEFDSzogMHhBRSxcbiAgRkVEQVVUSElORk86IDB4RUUsXG4gIElORk86IDB4QUIsXG4gIExPR0lOQUNLOiAweEFELFxuICBOQkNST1c6IDB4RDIsXG4gIE9GRlNFVDogMHg3OCxcbiAgT1JERVI6IDB4QTksXG4gIFJFVFVSTlNUQVRVUzogMHg3OSxcbiAgUkVUVVJOVkFMVUU6IDB4QUMsXG4gIFJPVzogMHhEMSxcbiAgU1NQSTogMHhFRCxcbiAgVEFCTkFNRTogMHhBNFxufTtcblxudHlwZSBIYW5kbGVyTmFtZSA9IGtleW9mIFRva2VuSGFuZGxlcjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRva2VuIHtcbiAgbmFtZTogc3RyaW5nO1xuICBoYW5kbGVyTmFtZToga2V5b2YgVG9rZW5IYW5kbGVyO1xuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgaGFuZGxlck5hbWU6IEhhbmRsZXJOYW1lKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmhhbmRsZXJOYW1lID0gaGFuZGxlck5hbWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbE1ldGFkYXRhVG9rZW4gZXh0ZW5kcyBUb2tlbiB7XG4gIGRlY2xhcmUgbmFtZTogJ0NPTE1FVEFEQVRBJztcbiAgZGVjbGFyZSBoYW5kbGVyTmFtZTogJ29uQ29sTWV0YWRhdGEnO1xuXG4gIGNvbHVtbnM6IENvbHVtbk1ldGFkYXRhW11cblxuICBjb25zdHJ1Y3Rvcihjb2x1bW5zOiBDb2x1bW5NZXRhZGF0YVtdKSB7XG4gICAgc3VwZXIoJ0NPTE1FVEFEQVRBJywgJ29uQ29sTWV0YWRhdGEnKTtcblxuICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERvbmVUb2tlbiBleHRlbmRzIFRva2VuIHtcbiAgZGVjbGFyZSBuYW1lOiAnRE9ORSc7XG4gIGRlY2xhcmUgaGFuZGxlck5hbWU6ICdvbkRvbmUnO1xuXG4gIG1vcmU6IGJvb2xlYW47XG4gIHNxbEVycm9yOiBib29sZWFuO1xuICBhdHRlbnRpb246IGJvb2xlYW47XG4gIHNlcnZlckVycm9yOiBib29sZWFuO1xuICByb3dDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBjdXJDbWQ6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcih7IG1vcmUsIHNxbEVycm9yLCBhdHRlbnRpb24sIHNlcnZlckVycm9yLCByb3dDb3VudCwgY3VyQ21kIH06IHsgbW9yZTogYm9vbGVhbiwgc3FsRXJyb3I6IGJvb2xlYW4sIGF0dGVudGlvbjogYm9vbGVhbiwgc2VydmVyRXJyb3I6IGJvb2xlYW4sIHJvd0NvdW50OiBudW1iZXIgfCB1bmRlZmluZWQsIGN1ckNtZDogbnVtYmVyIH0pIHtcbiAgICBzdXBlcignRE9ORScsICdvbkRvbmUnKTtcblxuICAgIHRoaXMubW9yZSA9IG1vcmU7XG4gICAgdGhpcy5zcWxFcnJvciA9IHNxbEVycm9yO1xuICAgIHRoaXMuYXR0ZW50aW9uID0gYXR0ZW50aW9uO1xuICAgIHRoaXMuc2VydmVyRXJyb3IgPSBzZXJ2ZXJFcnJvcjtcbiAgICB0aGlzLnJvd0NvdW50ID0gcm93Q291bnQ7XG4gICAgdGhpcy5jdXJDbWQgPSBjdXJDbWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERvbmVJblByb2NUb2tlbiBleHRlbmRzIFRva2VuIHtcbiAgZGVjbGFyZSBuYW1lOiAnRE9ORUlOUFJPQyc7XG4gIGRlY2xhcmUgaGFuZGxlck5hbWU6ICdvbkRvbmVJblByb2MnO1xuXG4gIG1vcmU6IGJvb2xlYW47XG4gIHNxbEVycm9yOiBib29sZWFuO1xuICBhdHRlbnRpb246IGJvb2xlYW47XG4gIHNlcnZlckVycm9yOiBib29sZWFuO1xuICByb3dDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBjdXJDbWQ6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcih7IG1vcmUsIHNxbEVycm9yLCBhdHRlbnRpb24sIHNlcnZlckVycm9yLCByb3dDb3VudCwgY3VyQ21kIH06IHsgbW9yZTogYm9vbGVhbiwgc3FsRXJyb3I6IGJvb2xlYW4sIGF0dGVudGlvbjogYm9vbGVhbiwgc2VydmVyRXJyb3I6IGJvb2xlYW4sIHJvd0NvdW50OiBudW1iZXIgfCB1bmRlZmluZWQsIGN1ckNtZDogbnVtYmVyIH0pIHtcbiAgICBzdXBlcignRE9ORUlOUFJPQycsICdvbkRvbmVJblByb2MnKTtcblxuICAgIHRoaXMubW9yZSA9IG1vcmU7XG4gICAgdGhpcy5zcWxFcnJvciA9IHNxbEVycm9yO1xuICAgIHRoaXMuYXR0ZW50aW9uID0gYXR0ZW50aW9uO1xuICAgIHRoaXMuc2VydmVyRXJyb3IgPSBzZXJ2ZXJFcnJvcjtcbiAgICB0aGlzLnJvd0NvdW50ID0gcm93Q291bnQ7XG4gICAgdGhpcy5jdXJDbWQgPSBjdXJDbWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERvbmVQcm9jVG9rZW4gZXh0ZW5kcyBUb2tlbiB7XG4gIGRlY2xhcmUgbmFtZTogJ0RPTkVQUk9DJztcbiAgZGVjbGFyZSBoYW5kbGVyTmFtZTogJ29uRG9uZVByb2MnO1xuXG4gIG1vcmU6IGJvb2xlYW47XG4gIHNxbEVycm9yOiBib29sZWFuO1xuICBhdHRlbnRpb246IGJvb2xlYW47XG4gIHNlcnZlckVycm9yOiBib29sZWFuO1xuICByb3dDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBjdXJDbWQ6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcih7IG1vcmUsIHNxbEVycm9yLCBhdHRlbnRpb24sIHNlcnZlckVycm9yLCByb3dDb3VudCwgY3VyQ21kIH06IHsgbW9yZTogYm9vbGVhbiwgc3FsRXJyb3I6IGJvb2xlYW4sIGF0dGVudGlvbjogYm9vbGVhbiwgc2VydmVyRXJyb3I6IGJvb2xlYW4sIHJvd0NvdW50OiBudW1iZXIgfCB1bmRlZmluZWQsIGN1ckNtZDogbnVtYmVyIH0pIHtcbiAgICBzdXBlcignRE9ORVBST0MnLCAnb25Eb25lUHJvYycpO1xuXG4gICAgdGhpcy5tb3JlID0gbW9yZTtcbiAgICB0aGlzLnNxbEVycm9yID0gc3FsRXJyb3I7XG4gICAgdGhpcy5hdHRlbnRpb24gPSBhdHRlbnRpb247XG4gICAgdGhpcy5zZXJ2ZXJFcnJvciA9IHNlcnZlckVycm9yO1xuICAgIHRoaXMucm93Q291bnQgPSByb3dDb3VudDtcbiAgICB0aGlzLmN1ckNtZCA9IGN1ckNtZDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGF0YWJhc2VFbnZDaGFuZ2VUb2tlbiBleHRlbmRzIFRva2VuIHtcbiAgZGVjbGFyZSBuYW1lOiAnRU5WQ0hBTkdFJztcbiAgZGVjbGFyZSBoYW5kbGVyTmFtZTogJ29uRGF0YWJhc2VDaGFuZ2UnO1xuXG4gIHR5cGU6ICdEQVRBQkFTRSc7XG4gIG5ld1ZhbHVlOiBzdHJpbmc7XG4gIG9sZFZhbHVlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IobmV3VmFsdWU6IHN0cmluZywgb2xkVmFsdWU6IHN0cmluZykge1xuICAgIHN1cGVyKCdFTlZDSEFOR0UnLCAnb25EYXRhYmFzZUNoYW5nZScpO1xuXG4gICAgdGhpcy50eXBlID0gJ0RBVEFCQVNFJztcbiAgICB0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7XG4gICAgdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMYW5ndWFnZUVudkNoYW5nZVRva2VuIGV4dGVuZHMgVG9rZW4ge1xuICBkZWNsYXJlIG5hbWU6ICdFTlZDSEFOR0UnO1xuICBkZWNsYXJlIGhhbmRsZXJOYW1lOiAnb25MYW5ndWFnZUNoYW5nZSc7XG5cbiAgdHlwZTogJ0xBTkdVQUdFJztcbiAgbmV3VmFsdWU6IHN0cmluZztcbiAgb2xkVmFsdWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihuZXdWYWx1ZTogc3RyaW5nLCBvbGRWYWx1ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoJ0VOVkNIQU5HRScsICdvbkxhbmd1YWdlQ2hhbmdlJyk7XG5cbiAgICB0aGlzLnR5cGUgPSAnTEFOR1VBR0UnO1xuICAgIHRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENoYXJzZXRFbnZDaGFuZ2VUb2tlbiBleHRlbmRzIFRva2VuIHtcbiAgZGVjbGFyZSBuYW1lOiAnRU5WQ0hBTkdFJztcbiAgZGVjbGFyZSBoYW5kbGVyTmFtZTogJ29uQ2hhcnNldENoYW5nZSc7XG5cbiAgdHlwZTogJ0NIQVJTRVQnO1xuICBuZXdWYWx1ZTogc3RyaW5nO1xuICBvbGRWYWx1ZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG5ld1ZhbHVlOiBzdHJpbmcsIG9sZFZhbHVlOiBzdHJpbmcpIHtcbiAgICBzdXBlcignRU5WQ0hBTkdFJywgJ29uQ2hhcnNldENoYW5nZScpO1xuXG4gICAgdGhpcy50eXBlID0gJ0NIQVJTRVQnO1xuICAgIHRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBhY2tldFNpemVFbnZDaGFuZ2VUb2tlbiBleHRlbmRzIFRva2VuIHtcbiAgZGVjbGFyZSBuYW1lOiAnRU5WQ0hBTkdFJztcbiAgZGVjbGFyZSBoYW5kbGVyTmFtZTogJ29uUGFja2V0U2l6ZUNoYW5nZSc7XG5cbiAgdHlwZTogJ1BBQ0tFVF9TSVpFJztcbiAgbmV3VmFsdWU6IG51bWJlcjtcbiAgb2xkVmFsdWU6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihuZXdWYWx1ZTogbnVtYmVyLCBvbGRWYWx1ZTogbnVtYmVyKSB7XG4gICAgc3VwZXIoJ0VOVkNIQU5HRScsICdvblBhY2tldFNpemVDaGFuZ2UnKTtcblxuICAgIHRoaXMudHlwZSA9ICdQQUNLRVRfU0laRSc7XG4gICAgdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIHRoaXMub2xkVmFsdWUgPSBvbGRWYWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQmVnaW5UcmFuc2FjdGlvbkVudkNoYW5nZVRva2VuIGV4dGVuZHMgVG9rZW4ge1xuICBkZWNsYXJlIG5hbWU6ICdFTlZDSEFOR0UnO1xuICBkZWNsYXJlIGhhbmRsZXJOYW1lOiAnb25CZWdpblRyYW5zYWN0aW9uJztcblxuICB0eXBlOiAnQkVHSU5fVFhOJztcbiAgbmV3VmFsdWU6IEJ1ZmZlcjtcbiAgb2xkVmFsdWU6IEJ1ZmZlcjtcblxuICBjb25zdHJ1Y3RvcihuZXdWYWx1ZTogQnVmZmVyLCBvbGRWYWx1ZTogQnVmZmVyKSB7XG4gICAgc3VwZXIoJ0VOVkNIQU5HRScsICdvbkJlZ2luVHJhbnNhY3Rpb24nKTtcblxuICAgIHRoaXMudHlwZSA9ICdCRUdJTl9UWE4nO1xuICAgIHRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbW1pdFRyYW5zYWN0aW9uRW52Q2hhbmdlVG9rZW4gZXh0ZW5kcyBUb2tlbiB7XG4gIGRlY2xhcmUgbmFtZTogJ0VOVkNIQU5HRSc7XG4gIGRlY2xhcmUgaGFuZGxlck5hbWU6ICdvbkNvbW1pdFRyYW5zYWN0aW9uJztcblxuICB0eXBlOiAnQ09NTUlUX1RYTic7XG4gIG5ld1ZhbHVlOiBCdWZmZXI7XG4gIG9sZFZhbHVlOiBCdWZmZXI7XG5cbiAgY29uc3RydWN0b3IobmV3VmFsdWU6IEJ1ZmZlciwgb2xkVmFsdWU6IEJ1ZmZlcikge1xuICAgIHN1cGVyKCdFTlZDSEFOR0UnLCAnb25Db21taXRUcmFuc2FjdGlvbicpO1xuXG4gICAgdGhpcy50eXBlID0gJ0NPTU1JVF9UWE4nO1xuICAgIHRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJvbGxiYWNrVHJhbnNhY3Rpb25FbnZDaGFuZ2VUb2tlbiBleHRlbmRzIFRva2VuIHtcbiAgZGVjbGFyZSBuYW1lOiAnRU5WQ0hBTkdFJztcbiAgZGVjbGFyZSBoYW5kbGVyTmFtZTogJ29uUm9sbGJhY2tUcmFuc2FjdGlvbic7XG5cbiAgdHlwZTogJ1JPTExCQUNLX1RYTic7XG4gIG9sZFZhbHVlOiBCdWZmZXI7XG4gIG5ld1ZhbHVlOiBCdWZmZXI7XG5cbiAgY29uc3RydWN0b3IobmV3VmFsdWU6IEJ1ZmZlciwgb2xkVmFsdWU6IEJ1ZmZlcikge1xuICAgIHN1cGVyKCdFTlZDSEFOR0UnLCAnb25Sb2xsYmFja1RyYW5zYWN0aW9uJyk7XG5cbiAgICB0aGlzLnR5cGUgPSAnUk9MTEJBQ0tfVFhOJztcbiAgICB0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7XG4gICAgdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEYXRhYmFzZU1pcnJvcmluZ1BhcnRuZXJFbnZDaGFuZ2VUb2tlbiBleHRlbmRzIFRva2VuIHtcbiAgZGVjbGFyZSBuYW1lOiAnRU5WQ0hBTkdFJztcbiAgZGVjbGFyZSBoYW5kbGVyTmFtZTogJ29uRGF0YWJhc2VNaXJyb3JpbmdQYXJ0bmVyJztcblxuICB0eXBlOiAnREFUQUJBU0VfTUlSUk9SSU5HX1BBUlRORVInO1xuICBvbGRWYWx1ZTogc3RyaW5nO1xuICBuZXdWYWx1ZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG5ld1ZhbHVlOiBzdHJpbmcsIG9sZFZhbHVlOiBzdHJpbmcpIHtcbiAgICBzdXBlcignRU5WQ0hBTkdFJywgJ29uRGF0YWJhc2VNaXJyb3JpbmdQYXJ0bmVyJyk7XG5cbiAgICB0aGlzLnR5cGUgPSAnREFUQUJBU0VfTUlSUk9SSU5HX1BBUlRORVInO1xuICAgIHRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlc2V0Q29ubmVjdGlvbkVudkNoYW5nZVRva2VuIGV4dGVuZHMgVG9rZW4ge1xuICBkZWNsYXJlIG5hbWU6ICdFTlZDSEFOR0UnO1xuICBkZWNsYXJlIGhhbmRsZXJOYW1lOiAnb25SZXNldENvbm5lY3Rpb24nO1xuXG4gIHR5cGU6ICdSRVNFVF9DT05ORUNUSU9OJztcbiAgb2xkVmFsdWU6IEJ1ZmZlcjtcbiAgbmV3VmFsdWU6IEJ1ZmZlcjtcblxuICBjb25zdHJ1Y3RvcihuZXdWYWx1ZTogQnVmZmVyLCBvbGRWYWx1ZTogQnVmZmVyKSB7XG4gICAgc3VwZXIoJ0VOVkNIQU5HRScsICdvblJlc2V0Q29ubmVjdGlvbicpO1xuXG4gICAgdGhpcy50eXBlID0gJ1JFU0VUX0NPTk5FQ1RJT04nO1xuICAgIHRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbGxhdGlvbkNoYW5nZVRva2VuIGV4dGVuZHMgVG9rZW4ge1xuICBkZWNsYXJlIG5hbWU6ICdFTlZDSEFOR0UnO1xuICBkZWNsYXJlIGhhbmRsZXJOYW1lOiAnb25TcWxDb2xsYXRpb25DaGFuZ2UnO1xuXG4gIHR5cGU6ICdTUUxfQ09MTEFUSU9OJztcbiAgb2xkVmFsdWU6IENvbGxhdGlvbiB8IHVuZGVmaW5lZDtcbiAgbmV3VmFsdWU6IENvbGxhdGlvbiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihuZXdWYWx1ZTogQ29sbGF0aW9uIHwgdW5kZWZpbmVkLCBvbGRWYWx1ZTogQ29sbGF0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgc3VwZXIoJ0VOVkNIQU5HRScsICdvblNxbENvbGxhdGlvbkNoYW5nZScpO1xuXG4gICAgdGhpcy50eXBlID0gJ1NRTF9DT0xMQVRJT04nO1xuICAgIHRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJvdXRpbmdFbnZDaGFuZ2VUb2tlbiBleHRlbmRzIFRva2VuIHtcbiAgZGVjbGFyZSBuYW1lOiAnRU5WQ0hBTkdFJztcbiAgZGVjbGFyZSBoYW5kbGVyTmFtZTogJ29uUm91dGluZ0NoYW5nZSc7XG5cbiAgdHlwZTogJ1JPVVRJTkdfQ0hBTkdFJztcbiAgbmV3VmFsdWU6IHsgcHJvdG9jb2w6IG51bWJlciwgcG9ydDogbnVtYmVyLCBzZXJ2ZXI6IHN0cmluZyB9O1xuICBvbGRWYWx1ZTogQnVmZmVyO1xuXG4gIGNvbnN0cnVjdG9yKG5ld1ZhbHVlOiB7IHByb3RvY29sOiBudW1iZXIsIHBvcnQ6IG51bWJlciwgc2VydmVyOiBzdHJpbmcgfSwgb2xkVmFsdWU6IEJ1ZmZlcikge1xuICAgIHN1cGVyKCdFTlZDSEFOR0UnLCAnb25Sb3V0aW5nQ2hhbmdlJyk7XG5cbiAgICB0aGlzLnR5cGUgPSAnUk9VVElOR19DSEFOR0UnO1xuICAgIHRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZlYXR1cmVFeHRBY2tUb2tlbiBleHRlbmRzIFRva2VuIHtcbiAgZGVjbGFyZSBuYW1lOiAnRkVBVFVSRUVYVEFDSyc7XG4gIGRlY2xhcmUgaGFuZGxlck5hbWU6ICdvbkZlYXR1cmVFeHRBY2snO1xuXG4gIGZlZEF1dGg6IEJ1ZmZlciB8IHVuZGVmaW5lZDtcblxuICAvKiogVmFsdWUgb2YgVVRGOF9TVVBQT1JUIGFja25vd2xlZGdlbWVudC5cbiAgICpcbiAgICogdW5kZWZpbmVkIHdoZW4gVVRGOF9TVVBQT1JUIG5vdCBpbmNsdWRlZCBpbiB0b2tlbi4gKi9cbiAgdXRmOFN1cHBvcnQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoZmVkQXV0aDogQnVmZmVyIHwgdW5kZWZpbmVkLCB1dGY4U3VwcG9ydDogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHN1cGVyKCdGRUFUVVJFRVhUQUNLJywgJ29uRmVhdHVyZUV4dEFjaycpO1xuXG4gICAgdGhpcy5mZWRBdXRoID0gZmVkQXV0aDtcbiAgICB0aGlzLnV0ZjhTdXBwb3J0ID0gdXRmOFN1cHBvcnQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZlZEF1dGhJbmZvVG9rZW4gZXh0ZW5kcyBUb2tlbiB7XG4gIGRlY2xhcmUgbmFtZTogJ0ZFREFVVEhJTkZPJztcbiAgZGVjbGFyZSBoYW5kbGVyTmFtZTogJ29uRmVkQXV0aEluZm8nO1xuXG4gIHNwbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBzdHN1cmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihzcG46IHN0cmluZyB8IHVuZGVmaW5lZCwgc3RzdXJsOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBzdXBlcignRkVEQVVUSElORk8nLCAnb25GZWRBdXRoSW5mbycpO1xuXG4gICAgdGhpcy5zcG4gPSBzcG47XG4gICAgdGhpcy5zdHN1cmwgPSBzdHN1cmw7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEluZm9NZXNzYWdlVG9rZW4gZXh0ZW5kcyBUb2tlbiB7XG4gIGRlY2xhcmUgbmFtZTogJ0lORk8nO1xuICBkZWNsYXJlIGhhbmRsZXJOYW1lOiAnb25JbmZvTWVzc2FnZSc7XG5cbiAgbnVtYmVyOiBudW1iZXI7XG4gIHN0YXRlOiBudW1iZXI7XG4gIGNsYXNzOiBudW1iZXI7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgc2VydmVyTmFtZTogc3RyaW5nO1xuICBwcm9jTmFtZTogc3RyaW5nO1xuICBsaW5lTnVtYmVyOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoeyBudW1iZXIsIHN0YXRlLCBjbGFzczogY2xhenosIG1lc3NhZ2UsIHNlcnZlck5hbWUsIHByb2NOYW1lLCBsaW5lTnVtYmVyIH06IHsgbnVtYmVyOiBudW1iZXIsIHN0YXRlOiBudW1iZXIsIGNsYXNzOiBudW1iZXIsIG1lc3NhZ2U6IHN0cmluZywgc2VydmVyTmFtZTogc3RyaW5nLCBwcm9jTmFtZTogc3RyaW5nLCBsaW5lTnVtYmVyOiBudW1iZXIgfSkge1xuICAgIHN1cGVyKCdJTkZPJywgJ29uSW5mb01lc3NhZ2UnKTtcblxuICAgIHRoaXMubnVtYmVyID0gbnVtYmVyO1xuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLmNsYXNzID0gY2xheno7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB0aGlzLnNlcnZlck5hbWUgPSBzZXJ2ZXJOYW1lO1xuICAgIHRoaXMucHJvY05hbWUgPSBwcm9jTmFtZTtcbiAgICB0aGlzLmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFcnJvck1lc3NhZ2VUb2tlbiBleHRlbmRzIFRva2VuIHtcbiAgZGVjbGFyZSBuYW1lOiAnRVJST1InO1xuICBkZWNsYXJlIGhhbmRsZXJOYW1lOiAnb25FcnJvck1lc3NhZ2UnO1xuXG4gIG51bWJlcjogbnVtYmVyO1xuICBzdGF0ZTogbnVtYmVyO1xuICBjbGFzczogbnVtYmVyO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHNlcnZlck5hbWU6IHN0cmluZztcbiAgcHJvY05hbWU6IHN0cmluZztcbiAgbGluZU51bWJlcjogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHsgbnVtYmVyLCBzdGF0ZSwgY2xhc3M6IGNsYXp6LCBtZXNzYWdlLCBzZXJ2ZXJOYW1lLCBwcm9jTmFtZSwgbGluZU51bWJlciB9OiB7IG51bWJlcjogbnVtYmVyLCBzdGF0ZTogbnVtYmVyLCBjbGFzczogbnVtYmVyLCBtZXNzYWdlOiBzdHJpbmcsIHNlcnZlck5hbWU6IHN0cmluZywgcHJvY05hbWU6IHN0cmluZywgbGluZU51bWJlcjogbnVtYmVyIH0pIHtcbiAgICBzdXBlcignRVJST1InLCAnb25FcnJvck1lc3NhZ2UnKTtcblxuICAgIHRoaXMubnVtYmVyID0gbnVtYmVyO1xuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLmNsYXNzID0gY2xheno7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB0aGlzLnNlcnZlck5hbWUgPSBzZXJ2ZXJOYW1lO1xuICAgIHRoaXMucHJvY05hbWUgPSBwcm9jTmFtZTtcbiAgICB0aGlzLmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMb2dpbkFja1Rva2VuIGV4dGVuZHMgVG9rZW4ge1xuICBkZWNsYXJlIG5hbWU6ICdMT0dJTkFDSyc7XG4gIGRlY2xhcmUgaGFuZGxlck5hbWU6ICdvbkxvZ2luQWNrJztcblxuICBpbnRlcmZhY2U6IHN0cmluZztcbiAgdGRzVmVyc2lvbjogc3RyaW5nO1xuICBwcm9nTmFtZTogc3RyaW5nO1xuICBwcm9nVmVyc2lvbjogeyBtYWpvcjogbnVtYmVyLCBtaW5vcjogbnVtYmVyLCBidWlsZE51bUhpOiBudW1iZXIsIGJ1aWxkTnVtTG93OiBudW1iZXIgfTtcblxuICBjb25zdHJ1Y3Rvcih7IGludGVyZmFjZTogaW50ZXJmYXplLCB0ZHNWZXJzaW9uLCBwcm9nTmFtZSwgcHJvZ1ZlcnNpb24gfTogeyBpbnRlcmZhY2U6IExvZ2luQWNrVG9rZW5bJ2ludGVyZmFjZSddLCB0ZHNWZXJzaW9uOiBMb2dpbkFja1Rva2VuWyd0ZHNWZXJzaW9uJ10sIHByb2dOYW1lOiBMb2dpbkFja1Rva2VuWydwcm9nTmFtZSddLCBwcm9nVmVyc2lvbjogTG9naW5BY2tUb2tlblsncHJvZ1ZlcnNpb24nXSB9KSB7XG4gICAgc3VwZXIoJ0xPR0lOQUNLJywgJ29uTG9naW5BY2snKTtcblxuICAgIHRoaXMuaW50ZXJmYWNlID0gaW50ZXJmYXplO1xuICAgIHRoaXMudGRzVmVyc2lvbiA9IHRkc1ZlcnNpb247XG4gICAgdGhpcy5wcm9nTmFtZSA9IHByb2dOYW1lO1xuICAgIHRoaXMucHJvZ1ZlcnNpb24gPSBwcm9nVmVyc2lvbjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTkJDUm93VG9rZW4gZXh0ZW5kcyBUb2tlbiB7XG4gIGRlY2xhcmUgbmFtZTogJ05CQ1JPVyc7XG4gIGRlY2xhcmUgaGFuZGxlck5hbWU6ICdvblJvdyc7XG5cbiAgY29sdW1uczogYW55O1xuXG4gIGNvbnN0cnVjdG9yKGNvbHVtbnM6IGFueSkge1xuICAgIHN1cGVyKCdOQkNST1cnLCAnb25Sb3cnKTtcblxuICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE9yZGVyVG9rZW4gZXh0ZW5kcyBUb2tlbiB7XG4gIGRlY2xhcmUgbmFtZTogJ09SREVSJztcbiAgZGVjbGFyZSBoYW5kbGVyTmFtZTogJ29uT3JkZXInO1xuXG4gIG9yZGVyQ29sdW1uczogbnVtYmVyW107XG5cbiAgY29uc3RydWN0b3Iob3JkZXJDb2x1bW5zOiBudW1iZXJbXSkge1xuICAgIHN1cGVyKCdPUkRFUicsICdvbk9yZGVyJyk7XG5cbiAgICB0aGlzLm9yZGVyQ29sdW1ucyA9IG9yZGVyQ29sdW1ucztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmV0dXJuU3RhdHVzVG9rZW4gZXh0ZW5kcyBUb2tlbiB7XG4gIGRlY2xhcmUgbmFtZTogJ1JFVFVSTlNUQVRVUyc7XG4gIGRlY2xhcmUgaGFuZGxlck5hbWU6ICdvblJldHVyblN0YXR1cyc7XG5cbiAgdmFsdWU6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcih2YWx1ZTogbnVtYmVyKSB7XG4gICAgc3VwZXIoJ1JFVFVSTlNUQVRVUycsICdvblJldHVyblN0YXR1cycpO1xuXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZXR1cm5WYWx1ZVRva2VuIGV4dGVuZHMgVG9rZW4ge1xuICBkZWNsYXJlIG5hbWU6ICdSRVRVUk5WQUxVRSc7XG4gIGRlY2xhcmUgaGFuZGxlck5hbWU6ICdvblJldHVyblZhbHVlJztcblxuICBwYXJhbU9yZGluYWw6IG51bWJlcjtcbiAgcGFyYW1OYW1lOiBzdHJpbmc7XG4gIG1ldGFkYXRhOiBNZXRhZGF0YTtcbiAgdmFsdWU6IHVua25vd247XG5cbiAgY29uc3RydWN0b3IoeyBwYXJhbU9yZGluYWwsIHBhcmFtTmFtZSwgbWV0YWRhdGEsIHZhbHVlIH06IHsgcGFyYW1PcmRpbmFsOiBudW1iZXIsIHBhcmFtTmFtZTogc3RyaW5nLCBtZXRhZGF0YTogTWV0YWRhdGEsIHZhbHVlOiB1bmtub3duIH0pIHtcbiAgICBzdXBlcignUkVUVVJOVkFMVUUnLCAnb25SZXR1cm5WYWx1ZScpO1xuXG4gICAgdGhpcy5wYXJhbU9yZGluYWwgPSBwYXJhbU9yZGluYWw7XG4gICAgdGhpcy5wYXJhbU5hbWUgPSBwYXJhbU5hbWU7XG4gICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUm93VG9rZW4gZXh0ZW5kcyBUb2tlbiB7XG4gIGRlY2xhcmUgbmFtZTogJ1JPVyc7XG4gIGRlY2xhcmUgaGFuZGxlck5hbWU6ICdvblJvdyc7XG5cbiAgY29sdW1uczogYW55O1xuXG4gIGNvbnN0cnVjdG9yKGNvbHVtbnM6IGFueSkge1xuICAgIHN1cGVyKCdST1cnLCAnb25Sb3cnKTtcblxuICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNTUElUb2tlbiBleHRlbmRzIFRva2VuIHtcbiAgZGVjbGFyZSBuYW1lOiAnU1NQSUNIQUxMRU5HRSc7XG4gIGRlY2xhcmUgaGFuZGxlck5hbWU6ICdvblNTUEknO1xuXG4gIG50bG1wYWNrZXQ6IGFueTtcbiAgbnRsbXBhY2tldEJ1ZmZlcjogQnVmZmVyO1xuXG4gIGNvbnN0cnVjdG9yKG50bG1wYWNrZXQ6IGFueSwgbnRsbXBhY2tldEJ1ZmZlcjogQnVmZmVyKSB7XG4gICAgc3VwZXIoJ1NTUElDSEFMTEVOR0UnLCAnb25TU1BJJyk7XG5cbiAgICB0aGlzLm50bG1wYWNrZXQgPSBudGxtcGFja2V0O1xuICAgIHRoaXMubnRsbXBhY2tldEJ1ZmZlciA9IG50bG1wYWNrZXRCdWZmZXI7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBS08sTUFBTUEsSUFBSSxHQUFHO0VBQ2xCQyxXQUFXLEVBQUUsSUFESztFQUVsQkMsTUFBTSxFQUFFLElBRlU7RUFHbEJDLFdBQVcsRUFBRSxJQUhLO0VBSWxCQyxPQUFPLEVBQUUsSUFKUztFQUtsQkMsSUFBSSxFQUFFLElBTFk7RUFNbEJDLFFBQVEsRUFBRSxJQU5RO0VBT2xCQyxVQUFVLEVBQUUsSUFQTTtFQVFsQkMsU0FBUyxFQUFFLElBUk87RUFTbEJDLEtBQUssRUFBRSxJQVRXO0VBVWxCQyxhQUFhLEVBQUUsSUFWRztFQVdsQkMsV0FBVyxFQUFFLElBWEs7RUFZbEJDLElBQUksRUFBRSxJQVpZO0VBYWxCQyxRQUFRLEVBQUUsSUFiUTtFQWNsQkMsTUFBTSxFQUFFLElBZFU7RUFlbEJDLE1BQU0sRUFBRSxJQWZVO0VBZ0JsQkMsS0FBSyxFQUFFLElBaEJXO0VBaUJsQkMsWUFBWSxFQUFFLElBakJJO0VBa0JsQkMsV0FBVyxFQUFFLElBbEJLO0VBbUJsQkMsR0FBRyxFQUFFLElBbkJhO0VBb0JsQkMsSUFBSSxFQUFFLElBcEJZO0VBcUJsQkMsT0FBTyxFQUFFO0FBckJTLENBQWI7OztBQTBCQSxNQUFlQyxLQUFmLENBQXFCO0VBSTFCQyxXQUFXLENBQUNDLElBQUQsRUFBZUMsV0FBZixFQUF5QztJQUFBLEtBSHBERCxJQUdvRDtJQUFBLEtBRnBEQyxXQUVvRDtJQUNsRCxLQUFLRCxJQUFMLEdBQVlBLElBQVo7SUFDQSxLQUFLQyxXQUFMLEdBQW1CQSxXQUFuQjtFQUNEOztBQVB5Qjs7OztBQVVyQixNQUFNQyxnQkFBTixTQUErQkosS0FBL0IsQ0FBcUM7RUFNMUNDLFdBQVcsQ0FBQ0ksT0FBRCxFQUE0QjtJQUNyQyxNQUFNLGFBQU4sRUFBcUIsZUFBckI7SUFEcUMsS0FGdkNBLE9BRXVDO0lBR3JDLEtBQUtBLE9BQUwsR0FBZUEsT0FBZjtFQUNEOztBQVZ5Qzs7OztBQWFyQyxNQUFNQyxTQUFOLFNBQXdCTixLQUF4QixDQUE4QjtFQVduQ0MsV0FBVyxDQUFDO0lBQUVNLElBQUY7SUFBUUMsUUFBUjtJQUFrQkMsU0FBbEI7SUFBNkJDLFdBQTdCO0lBQTBDQyxRQUExQztJQUFvREM7RUFBcEQsQ0FBRCxFQUE2TDtJQUN0TSxNQUFNLE1BQU4sRUFBYyxRQUFkO0lBRHNNLEtBUHhNTCxJQU93TTtJQUFBLEtBTnhNQyxRQU13TTtJQUFBLEtBTHhNQyxTQUt3TTtJQUFBLEtBSnhNQyxXQUl3TTtJQUFBLEtBSHhNQyxRQUd3TTtJQUFBLEtBRnhNQyxNQUV3TTtJQUd0TSxLQUFLTCxJQUFMLEdBQVlBLElBQVo7SUFDQSxLQUFLQyxRQUFMLEdBQWdCQSxRQUFoQjtJQUNBLEtBQUtDLFNBQUwsR0FBaUJBLFNBQWpCO0lBQ0EsS0FBS0MsV0FBTCxHQUFtQkEsV0FBbkI7SUFDQSxLQUFLQyxRQUFMLEdBQWdCQSxRQUFoQjtJQUNBLEtBQUtDLE1BQUwsR0FBY0EsTUFBZDtFQUNEOztBQXBCa0M7Ozs7QUF1QjlCLE1BQU1DLGVBQU4sU0FBOEJiLEtBQTlCLENBQW9DO0VBV3pDQyxXQUFXLENBQUM7SUFBRU0sSUFBRjtJQUFRQyxRQUFSO0lBQWtCQyxTQUFsQjtJQUE2QkMsV0FBN0I7SUFBMENDLFFBQTFDO0lBQW9EQztFQUFwRCxDQUFELEVBQTZMO0lBQ3RNLE1BQU0sWUFBTixFQUFvQixjQUFwQjtJQURzTSxLQVB4TUwsSUFPd007SUFBQSxLQU54TUMsUUFNd007SUFBQSxLQUx4TUMsU0FLd007SUFBQSxLQUp4TUMsV0FJd007SUFBQSxLQUh4TUMsUUFHd007SUFBQSxLQUZ4TUMsTUFFd007SUFHdE0sS0FBS0wsSUFBTCxHQUFZQSxJQUFaO0lBQ0EsS0FBS0MsUUFBTCxHQUFnQkEsUUFBaEI7SUFDQSxLQUFLQyxTQUFMLEdBQWlCQSxTQUFqQjtJQUNBLEtBQUtDLFdBQUwsR0FBbUJBLFdBQW5CO0lBQ0EsS0FBS0MsUUFBTCxHQUFnQkEsUUFBaEI7SUFDQSxLQUFLQyxNQUFMLEdBQWNBLE1BQWQ7RUFDRDs7QUFwQndDOzs7O0FBdUJwQyxNQUFNRSxhQUFOLFNBQTRCZCxLQUE1QixDQUFrQztFQVd2Q0MsV0FBVyxDQUFDO0lBQUVNLElBQUY7SUFBUUMsUUFBUjtJQUFrQkMsU0FBbEI7SUFBNkJDLFdBQTdCO0lBQTBDQyxRQUExQztJQUFvREM7RUFBcEQsQ0FBRCxFQUE2TDtJQUN0TSxNQUFNLFVBQU4sRUFBa0IsWUFBbEI7SUFEc00sS0FQeE1MLElBT3dNO0lBQUEsS0FOeE1DLFFBTXdNO0lBQUEsS0FMeE1DLFNBS3dNO0lBQUEsS0FKeE1DLFdBSXdNO0lBQUEsS0FIeE1DLFFBR3dNO0lBQUEsS0FGeE1DLE1BRXdNO0lBR3RNLEtBQUtMLElBQUwsR0FBWUEsSUFBWjtJQUNBLEtBQUtDLFFBQUwsR0FBZ0JBLFFBQWhCO0lBQ0EsS0FBS0MsU0FBTCxHQUFpQkEsU0FBakI7SUFDQSxLQUFLQyxXQUFMLEdBQW1CQSxXQUFuQjtJQUNBLEtBQUtDLFFBQUwsR0FBZ0JBLFFBQWhCO0lBQ0EsS0FBS0MsTUFBTCxHQUFjQSxNQUFkO0VBQ0Q7O0FBcEJzQzs7OztBQXVCbEMsTUFBTUcsc0JBQU4sU0FBcUNmLEtBQXJDLENBQTJDO0VBUWhEQyxXQUFXLENBQUNlLFFBQUQsRUFBbUJDLFFBQW5CLEVBQXFDO0lBQzlDLE1BQU0sV0FBTixFQUFtQixrQkFBbkI7SUFEOEMsS0FKaERDLElBSWdEO0lBQUEsS0FIaERGLFFBR2dEO0lBQUEsS0FGaERDLFFBRWdEO0lBRzlDLEtBQUtDLElBQUwsR0FBWSxVQUFaO0lBQ0EsS0FBS0YsUUFBTCxHQUFnQkEsUUFBaEI7SUFDQSxLQUFLQyxRQUFMLEdBQWdCQSxRQUFoQjtFQUNEOztBQWQrQzs7OztBQWlCM0MsTUFBTUUsc0JBQU4sU0FBcUNuQixLQUFyQyxDQUEyQztFQVFoREMsV0FBVyxDQUFDZSxRQUFELEVBQW1CQyxRQUFuQixFQUFxQztJQUM5QyxNQUFNLFdBQU4sRUFBbUIsa0JBQW5CO0lBRDhDLEtBSmhEQyxJQUlnRDtJQUFBLEtBSGhERixRQUdnRDtJQUFBLEtBRmhEQyxRQUVnRDtJQUc5QyxLQUFLQyxJQUFMLEdBQVksVUFBWjtJQUNBLEtBQUtGLFFBQUwsR0FBZ0JBLFFBQWhCO0lBQ0EsS0FBS0MsUUFBTCxHQUFnQkEsUUFBaEI7RUFDRDs7QUFkK0M7Ozs7QUFpQjNDLE1BQU1HLHFCQUFOLFNBQW9DcEIsS0FBcEMsQ0FBMEM7RUFRL0NDLFdBQVcsQ0FBQ2UsUUFBRCxFQUFtQkMsUUFBbkIsRUFBcUM7SUFDOUMsTUFBTSxXQUFOLEVBQW1CLGlCQUFuQjtJQUQ4QyxLQUpoREMsSUFJZ0Q7SUFBQSxLQUhoREYsUUFHZ0Q7SUFBQSxLQUZoREMsUUFFZ0Q7SUFHOUMsS0FBS0MsSUFBTCxHQUFZLFNBQVo7SUFDQSxLQUFLRixRQUFMLEdBQWdCQSxRQUFoQjtJQUNBLEtBQUtDLFFBQUwsR0FBZ0JBLFFBQWhCO0VBQ0Q7O0FBZDhDOzs7O0FBaUIxQyxNQUFNSSx3QkFBTixTQUF1Q3JCLEtBQXZDLENBQTZDO0VBUWxEQyxXQUFXLENBQUNlLFFBQUQsRUFBbUJDLFFBQW5CLEVBQXFDO0lBQzlDLE1BQU0sV0FBTixFQUFtQixvQkFBbkI7SUFEOEMsS0FKaERDLElBSWdEO0lBQUEsS0FIaERGLFFBR2dEO0lBQUEsS0FGaERDLFFBRWdEO0lBRzlDLEtBQUtDLElBQUwsR0FBWSxhQUFaO0lBQ0EsS0FBS0YsUUFBTCxHQUFnQkEsUUFBaEI7SUFDQSxLQUFLQyxRQUFMLEdBQWdCQSxRQUFoQjtFQUNEOztBQWRpRDs7OztBQWlCN0MsTUFBTUssOEJBQU4sU0FBNkN0QixLQUE3QyxDQUFtRDtFQVF4REMsV0FBVyxDQUFDZSxRQUFELEVBQW1CQyxRQUFuQixFQUFxQztJQUM5QyxNQUFNLFdBQU4sRUFBbUIsb0JBQW5CO0lBRDhDLEtBSmhEQyxJQUlnRDtJQUFBLEtBSGhERixRQUdnRDtJQUFBLEtBRmhEQyxRQUVnRDtJQUc5QyxLQUFLQyxJQUFMLEdBQVksV0FBWjtJQUNBLEtBQUtGLFFBQUwsR0FBZ0JBLFFBQWhCO0lBQ0EsS0FBS0MsUUFBTCxHQUFnQkEsUUFBaEI7RUFDRDs7QUFkdUQ7Ozs7QUFpQm5ELE1BQU1NLCtCQUFOLFNBQThDdkIsS0FBOUMsQ0FBb0Q7RUFRekRDLFdBQVcsQ0FBQ2UsUUFBRCxFQUFtQkMsUUFBbkIsRUFBcUM7SUFDOUMsTUFBTSxXQUFOLEVBQW1CLHFCQUFuQjtJQUQ4QyxLQUpoREMsSUFJZ0Q7SUFBQSxLQUhoREYsUUFHZ0Q7SUFBQSxLQUZoREMsUUFFZ0Q7SUFHOUMsS0FBS0MsSUFBTCxHQUFZLFlBQVo7SUFDQSxLQUFLRixRQUFMLEdBQWdCQSxRQUFoQjtJQUNBLEtBQUtDLFFBQUwsR0FBZ0JBLFFBQWhCO0VBQ0Q7O0FBZHdEOzs7O0FBaUJwRCxNQUFNTyxpQ0FBTixTQUFnRHhCLEtBQWhELENBQXNEO0VBUTNEQyxXQUFXLENBQUNlLFFBQUQsRUFBbUJDLFFBQW5CLEVBQXFDO0lBQzlDLE1BQU0sV0FBTixFQUFtQix1QkFBbkI7SUFEOEMsS0FKaERDLElBSWdEO0lBQUEsS0FIaERELFFBR2dEO0lBQUEsS0FGaERELFFBRWdEO0lBRzlDLEtBQUtFLElBQUwsR0FBWSxjQUFaO0lBQ0EsS0FBS0YsUUFBTCxHQUFnQkEsUUFBaEI7SUFDQSxLQUFLQyxRQUFMLEdBQWdCQSxRQUFoQjtFQUNEOztBQWQwRDs7OztBQWlCdEQsTUFBTVEsc0NBQU4sU0FBcUR6QixLQUFyRCxDQUEyRDtFQVFoRUMsV0FBVyxDQUFDZSxRQUFELEVBQW1CQyxRQUFuQixFQUFxQztJQUM5QyxNQUFNLFdBQU4sRUFBbUIsNEJBQW5CO0lBRDhDLEtBSmhEQyxJQUlnRDtJQUFBLEtBSGhERCxRQUdnRDtJQUFBLEtBRmhERCxRQUVnRDtJQUc5QyxLQUFLRSxJQUFMLEdBQVksNEJBQVo7SUFDQSxLQUFLRixRQUFMLEdBQWdCQSxRQUFoQjtJQUNBLEtBQUtDLFFBQUwsR0FBZ0JBLFFBQWhCO0VBQ0Q7O0FBZCtEOzs7O0FBaUIzRCxNQUFNUyw2QkFBTixTQUE0QzFCLEtBQTVDLENBQWtEO0VBUXZEQyxXQUFXLENBQUNlLFFBQUQsRUFBbUJDLFFBQW5CLEVBQXFDO0lBQzlDLE1BQU0sV0FBTixFQUFtQixtQkFBbkI7SUFEOEMsS0FKaERDLElBSWdEO0lBQUEsS0FIaERELFFBR2dEO0lBQUEsS0FGaERELFFBRWdEO0lBRzlDLEtBQUtFLElBQUwsR0FBWSxrQkFBWjtJQUNBLEtBQUtGLFFBQUwsR0FBZ0JBLFFBQWhCO0lBQ0EsS0FBS0MsUUFBTCxHQUFnQkEsUUFBaEI7RUFDRDs7QUFkc0Q7Ozs7QUFpQmxELE1BQU1VLG9CQUFOLFNBQW1DM0IsS0FBbkMsQ0FBeUM7RUFROUNDLFdBQVcsQ0FBQ2UsUUFBRCxFQUFrQ0MsUUFBbEMsRUFBbUU7SUFDNUUsTUFBTSxXQUFOLEVBQW1CLHNCQUFuQjtJQUQ0RSxLQUo5RUMsSUFJOEU7SUFBQSxLQUg5RUQsUUFHOEU7SUFBQSxLQUY5RUQsUUFFOEU7SUFHNUUsS0FBS0UsSUFBTCxHQUFZLGVBQVo7SUFDQSxLQUFLRixRQUFMLEdBQWdCQSxRQUFoQjtJQUNBLEtBQUtDLFFBQUwsR0FBZ0JBLFFBQWhCO0VBQ0Q7O0FBZDZDOzs7O0FBaUJ6QyxNQUFNVyxxQkFBTixTQUFvQzVCLEtBQXBDLENBQTBDO0VBUS9DQyxXQUFXLENBQUNlLFFBQUQsRUFBK0RDLFFBQS9ELEVBQWlGO0lBQzFGLE1BQU0sV0FBTixFQUFtQixpQkFBbkI7SUFEMEYsS0FKNUZDLElBSTRGO0lBQUEsS0FINUZGLFFBRzRGO0lBQUEsS0FGNUZDLFFBRTRGO0lBRzFGLEtBQUtDLElBQUwsR0FBWSxnQkFBWjtJQUNBLEtBQUtGLFFBQUwsR0FBZ0JBLFFBQWhCO0lBQ0EsS0FBS0MsUUFBTCxHQUFnQkEsUUFBaEI7RUFDRDs7QUFkOEM7Ozs7QUFpQjFDLE1BQU1ZLGtCQUFOLFNBQWlDN0IsS0FBakMsQ0FBdUM7RUFNNUM7QUFDRjtBQUNBO0VBR0VDLFdBQVcsQ0FBQzZCLE9BQUQsRUFBOEJDLFdBQTlCLEVBQWdFO0lBQ3pFLE1BQU0sZUFBTixFQUF1QixpQkFBdkI7SUFEeUUsS0FQM0VELE9BTzJFO0lBQUEsS0FGM0VDLFdBRTJFO0lBR3pFLEtBQUtELE9BQUwsR0FBZUEsT0FBZjtJQUNBLEtBQUtDLFdBQUwsR0FBbUJBLFdBQW5CO0VBQ0Q7O0FBaEIyQzs7OztBQW1CdkMsTUFBTUMsZ0JBQU4sU0FBK0JoQyxLQUEvQixDQUFxQztFQU8xQ0MsV0FBVyxDQUFDZ0MsR0FBRCxFQUEwQkMsTUFBMUIsRUFBc0Q7SUFDL0QsTUFBTSxhQUFOLEVBQXFCLGVBQXJCO0lBRCtELEtBSGpFRCxHQUdpRTtJQUFBLEtBRmpFQyxNQUVpRTtJQUcvRCxLQUFLRCxHQUFMLEdBQVdBLEdBQVg7SUFDQSxLQUFLQyxNQUFMLEdBQWNBLE1BQWQ7RUFDRDs7QUFaeUM7Ozs7QUFlckMsTUFBTUMsZ0JBQU4sU0FBK0JuQyxLQUEvQixDQUFxQztFQVkxQ0MsV0FBVyxDQUFDO0lBQUVtQyxNQUFGO0lBQVVDLEtBQVY7SUFBaUJDLEtBQUssRUFBRUMsS0FBeEI7SUFBK0JDLE9BQS9CO0lBQXdDQyxVQUF4QztJQUFvREMsUUFBcEQ7SUFBOERDO0VBQTlELENBQUQsRUFBME07SUFDbk4sTUFBTSxNQUFOLEVBQWMsZUFBZDtJQURtTixLQVJyTlAsTUFRcU47SUFBQSxLQVByTkMsS0FPcU47SUFBQSxLQU5yTkMsS0FNcU47SUFBQSxLQUxyTkUsT0FLcU47SUFBQSxLQUpyTkMsVUFJcU47SUFBQSxLQUhyTkMsUUFHcU47SUFBQSxLQUZyTkMsVUFFcU47SUFHbk4sS0FBS1AsTUFBTCxHQUFjQSxNQUFkO0lBQ0EsS0FBS0MsS0FBTCxHQUFhQSxLQUFiO0lBQ0EsS0FBS0MsS0FBTCxHQUFhQyxLQUFiO0lBQ0EsS0FBS0MsT0FBTCxHQUFlQSxPQUFmO0lBQ0EsS0FBS0MsVUFBTCxHQUFrQkEsVUFBbEI7SUFDQSxLQUFLQyxRQUFMLEdBQWdCQSxRQUFoQjtJQUNBLEtBQUtDLFVBQUwsR0FBa0JBLFVBQWxCO0VBQ0Q7O0FBdEJ5Qzs7OztBQXlCckMsTUFBTUMsaUJBQU4sU0FBZ0M1QyxLQUFoQyxDQUFzQztFQVkzQ0MsV0FBVyxDQUFDO0lBQUVtQyxNQUFGO0lBQVVDLEtBQVY7SUFBaUJDLEtBQUssRUFBRUMsS0FBeEI7SUFBK0JDLE9BQS9CO0lBQXdDQyxVQUF4QztJQUFvREMsUUFBcEQ7SUFBOERDO0VBQTlELENBQUQsRUFBME07SUFDbk4sTUFBTSxPQUFOLEVBQWUsZ0JBQWY7SUFEbU4sS0FSck5QLE1BUXFOO0lBQUEsS0FQck5DLEtBT3FOO0lBQUEsS0FOck5DLEtBTXFOO0lBQUEsS0FMck5FLE9BS3FOO0lBQUEsS0FKck5DLFVBSXFOO0lBQUEsS0FIck5DLFFBR3FOO0lBQUEsS0FGck5DLFVBRXFOO0lBR25OLEtBQUtQLE1BQUwsR0FBY0EsTUFBZDtJQUNBLEtBQUtDLEtBQUwsR0FBYUEsS0FBYjtJQUNBLEtBQUtDLEtBQUwsR0FBYUMsS0FBYjtJQUNBLEtBQUtDLE9BQUwsR0FBZUEsT0FBZjtJQUNBLEtBQUtDLFVBQUwsR0FBa0JBLFVBQWxCO0lBQ0EsS0FBS0MsUUFBTCxHQUFnQkEsUUFBaEI7SUFDQSxLQUFLQyxVQUFMLEdBQWtCQSxVQUFsQjtFQUNEOztBQXRCMEM7Ozs7QUF5QnRDLE1BQU1FLGFBQU4sU0FBNEI3QyxLQUE1QixDQUFrQztFQVN2Q0MsV0FBVyxDQUFDO0lBQUU2QyxTQUFTLEVBQUVDLFNBQWI7SUFBd0JDLFVBQXhCO0lBQW9DQyxRQUFwQztJQUE4Q0M7RUFBOUMsQ0FBRCxFQUFrTztJQUMzTyxNQUFNLFVBQU4sRUFBa0IsWUFBbEI7SUFEMk8sS0FMN09KLFNBSzZPO0lBQUEsS0FKN09FLFVBSTZPO0lBQUEsS0FIN09DLFFBRzZPO0lBQUEsS0FGN09DLFdBRTZPO0lBRzNPLEtBQUtKLFNBQUwsR0FBaUJDLFNBQWpCO0lBQ0EsS0FBS0MsVUFBTCxHQUFrQkEsVUFBbEI7SUFDQSxLQUFLQyxRQUFMLEdBQWdCQSxRQUFoQjtJQUNBLEtBQUtDLFdBQUwsR0FBbUJBLFdBQW5CO0VBQ0Q7O0FBaEJzQzs7OztBQW1CbEMsTUFBTUMsV0FBTixTQUEwQm5ELEtBQTFCLENBQWdDO0VBTXJDQyxXQUFXLENBQUNJLE9BQUQsRUFBZTtJQUN4QixNQUFNLFFBQU4sRUFBZ0IsT0FBaEI7SUFEd0IsS0FGMUJBLE9BRTBCO0lBR3hCLEtBQUtBLE9BQUwsR0FBZUEsT0FBZjtFQUNEOztBQVZvQzs7OztBQWFoQyxNQUFNK0MsVUFBTixTQUF5QnBELEtBQXpCLENBQStCO0VBTXBDQyxXQUFXLENBQUNvRCxZQUFELEVBQXlCO0lBQ2xDLE1BQU0sT0FBTixFQUFlLFNBQWY7SUFEa0MsS0FGcENBLFlBRW9DO0lBR2xDLEtBQUtBLFlBQUwsR0FBb0JBLFlBQXBCO0VBQ0Q7O0FBVm1DOzs7O0FBYS9CLE1BQU1DLGlCQUFOLFNBQWdDdEQsS0FBaEMsQ0FBc0M7RUFNM0NDLFdBQVcsQ0FBQ3NELEtBQUQsRUFBZ0I7SUFDekIsTUFBTSxjQUFOLEVBQXNCLGdCQUF0QjtJQUR5QixLQUYzQkEsS0FFMkI7SUFHekIsS0FBS0EsS0FBTCxHQUFhQSxLQUFiO0VBQ0Q7O0FBVjBDOzs7O0FBYXRDLE1BQU1DLGdCQUFOLFNBQStCeEQsS0FBL0IsQ0FBcUM7RUFTMUNDLFdBQVcsQ0FBQztJQUFFd0QsWUFBRjtJQUFnQkMsU0FBaEI7SUFBMkJDLFFBQTNCO0lBQXFDSjtFQUFyQyxDQUFELEVBQWdJO0lBQ3pJLE1BQU0sYUFBTixFQUFxQixlQUFyQjtJQUR5SSxLQUwzSUUsWUFLMkk7SUFBQSxLQUozSUMsU0FJMkk7SUFBQSxLQUgzSUMsUUFHMkk7SUFBQSxLQUYzSUosS0FFMkk7SUFHekksS0FBS0UsWUFBTCxHQUFvQkEsWUFBcEI7SUFDQSxLQUFLQyxTQUFMLEdBQWlCQSxTQUFqQjtJQUNBLEtBQUtDLFFBQUwsR0FBZ0JBLFFBQWhCO0lBQ0EsS0FBS0osS0FBTCxHQUFhQSxLQUFiO0VBQ0Q7O0FBaEJ5Qzs7OztBQW1CckMsTUFBTUssUUFBTixTQUF1QjVELEtBQXZCLENBQTZCO0VBTWxDQyxXQUFXLENBQUNJLE9BQUQsRUFBZTtJQUN4QixNQUFNLEtBQU4sRUFBYSxPQUFiO0lBRHdCLEtBRjFCQSxPQUUwQjtJQUd4QixLQUFLQSxPQUFMLEdBQWVBLE9BQWY7RUFDRDs7QUFWaUM7Ozs7QUFhN0IsTUFBTXdELFNBQU4sU0FBd0I3RCxLQUF4QixDQUE4QjtFQU9uQ0MsV0FBVyxDQUFDNkQsVUFBRCxFQUFrQkMsZ0JBQWxCLEVBQTRDO0lBQ3JELE1BQU0sZUFBTixFQUF1QixRQUF2QjtJQURxRCxLQUh2REQsVUFHdUQ7SUFBQSxLQUZ2REMsZ0JBRXVEO0lBR3JELEtBQUtELFVBQUwsR0FBa0JBLFVBQWxCO0lBQ0EsS0FBS0MsZ0JBQUwsR0FBd0JBLGdCQUF4QjtFQUNEOztBQVprQyJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

class AbortError extends Error {
  constructor() {
    super('The operation was aborted');
    this.code = void 0;
    this.code = 'ABORT_ERR';
    this.name = 'AbortError';
  }

}

exports.default = AbortError;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBYm9ydEVycm9yIiwiRXJyb3IiLCJjb25zdHJ1Y3RvciIsImNvZGUiLCJuYW1lIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Vycm9ycy9hYm9ydC1lcnJvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBjbGFzcyBBYm9ydEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQnKTtcblxuICAgIHRoaXMuY29kZSA9ICdBQk9SVF9FUlInO1xuICAgIHRoaXMubmFtZSA9ICdBYm9ydEVycm9yJztcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQWUsTUFBTUEsVUFBTixTQUF5QkMsS0FBekIsQ0FBK0I7RUFHNUNDLFdBQVcsR0FBRztJQUNaLE1BQU0sMkJBQU47SUFEWSxLQUZkQyxJQUVjO0lBR1osS0FBS0EsSUFBTCxHQUFZLFdBQVo7SUFDQSxLQUFLQyxJQUFMLEdBQVksWUFBWjtFQUNEOztBQVIyQyJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

class TimeoutError extends Error {
  constructor() {
    super('The operation was aborted due to timeout');
    this.code = void 0;
    this.code = 'TIMEOUT_ERR';
    this.name = 'TimeoutError';
  }

}

exports.default = TimeoutError;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUaW1lb3V0RXJyb3IiLCJFcnJvciIsImNvbnN0cnVjdG9yIiwiY29kZSIsIm5hbWUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZXJyb3JzL3RpbWVvdXQtZXJyb3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGltZW91dEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQgZHVlIHRvIHRpbWVvdXQnKTtcblxuICAgIHRoaXMuY29kZSA9ICdUSU1FT1VUX0VSUic7XG4gICAgdGhpcy5uYW1lID0gJ1RpbWVvdXRFcnJvcic7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFlLE1BQU1BLFlBQU4sU0FBMkJDLEtBQTNCLENBQWlDO0VBRzlDQyxXQUFXLEdBQUc7SUFDWixNQUFNLDBDQUFOO0lBRFksS0FGZEMsSUFFYztJQUdaLEtBQUtBLElBQUwsR0FBWSxhQUFaO0lBQ0EsS0FBS0MsSUFBTCxHQUFZLGNBQVo7RUFDRDs7QUFSNkMifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _intn = _interopRequireDefault(require("./intn"));

var _writableTrackingBuffer = _interopRequireDefault(require("../tracking-buffer/writable-tracking-buffer"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const DATA_LENGTH = Buffer.from([0x08]);
const NULL_LENGTH = Buffer.from([0x00]);
const BigInt = {
  id: 0x7F,
  type: 'INT8',
  name: 'BigInt',
  declaration: function () {
    return 'bigint';
  },

  generateTypeInfo() {
    return Buffer.from([_intn.default.id, 0x08]);
  },

  generateParameterLength(parameter, options) {
    if (parameter.value == null) {
      return NULL_LENGTH;
    }

    return DATA_LENGTH;
  },

  *generateParameterData(parameter, options) {
    if (parameter.value == null) {
      return;
    }

    const buffer = new _writableTrackingBuffer.default(8);
    buffer.writeInt64LE(Number(parameter.value));
    yield buffer.data;
  },

  validate: function (value) {
    if (value == null) {
      return null;
    }

    if (typeof value !== 'number') {
      value = Number(value);
    }

    if (isNaN(value)) {
      throw new TypeError('Invalid number.');
    }

    if (value < Number.MIN_SAFE_INTEGER || value > Number.MAX_SAFE_INTEGER) {
      throw new TypeError(`Value must be between ${Number.MIN_SAFE_INTEGER} and ${Number.MAX_SAFE_INTEGER}, inclusive.  For smaller or bigger numbers, use VarChar type.`);
    }

    return value;
  }
};
var _default = BigInt;
exports.default = _default;
module.exports = BigInt;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJEQVRBX0xFTkdUSCIsIkJ1ZmZlciIsImZyb20iLCJOVUxMX0xFTkdUSCIsIkJpZ0ludCIsImlkIiwidHlwZSIsIm5hbWUiLCJkZWNsYXJhdGlvbiIsImdlbmVyYXRlVHlwZUluZm8iLCJJbnROIiwiZ2VuZXJhdGVQYXJhbWV0ZXJMZW5ndGgiLCJwYXJhbWV0ZXIiLCJvcHRpb25zIiwidmFsdWUiLCJnZW5lcmF0ZVBhcmFtZXRlckRhdGEiLCJidWZmZXIiLCJXcml0YWJsZVRyYWNraW5nQnVmZmVyIiwid3JpdGVJbnQ2NExFIiwiTnVtYmVyIiwiZGF0YSIsInZhbGlkYXRlIiwiaXNOYU4iLCJUeXBlRXJyb3IiLCJNSU5fU0FGRV9JTlRFR0VSIiwiTUFYX1NBRkVfSU5URUdFUiIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YS10eXBlcy9iaWdpbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuLi9kYXRhLXR5cGUnO1xuaW1wb3J0IEludE4gZnJvbSAnLi9pbnRuJztcbmltcG9ydCBXcml0YWJsZVRyYWNraW5nQnVmZmVyIGZyb20gJy4uL3RyYWNraW5nLWJ1ZmZlci93cml0YWJsZS10cmFja2luZy1idWZmZXInO1xuXG5jb25zdCBEQVRBX0xFTkdUSCA9IEJ1ZmZlci5mcm9tKFsweDA4XSk7XG5jb25zdCBOVUxMX0xFTkdUSCA9IEJ1ZmZlci5mcm9tKFsweDAwXSk7XG5cbmNvbnN0IEJpZ0ludDogRGF0YVR5cGUgPSB7XG4gIGlkOiAweDdGLFxuICB0eXBlOiAnSU5UOCcsXG4gIG5hbWU6ICdCaWdJbnQnLFxuXG4gIGRlY2xhcmF0aW9uOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gJ2JpZ2ludCc7XG4gIH0sXG5cbiAgZ2VuZXJhdGVUeXBlSW5mbygpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oW0ludE4uaWQsIDB4MDhdKTtcbiAgfSxcblxuICBnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aChwYXJhbWV0ZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAocGFyYW1ldGVyLnZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBOVUxMX0xFTkdUSDtcbiAgICB9XG5cbiAgICByZXR1cm4gREFUQV9MRU5HVEg7XG4gIH0sXG5cbiAgKiBnZW5lcmF0ZVBhcmFtZXRlckRhdGEocGFyYW1ldGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKHBhcmFtZXRlci52YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIoOCk7XG4gICAgYnVmZmVyLndyaXRlSW50NjRMRShOdW1iZXIocGFyYW1ldGVyLnZhbHVlKSk7XG4gICAgeWllbGQgYnVmZmVyLmRhdGE7XG4gIH0sXG5cbiAgdmFsaWRhdGU6IGZ1bmN0aW9uKHZhbHVlKTogbnVsbCB8IG51bWJlciB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKSB7XG4gICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGlzTmFOKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBudW1iZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlIDwgTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIgfHwgdmFsdWUgPiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVmFsdWUgbXVzdCBiZSBiZXR3ZWVuICR7TnVtYmVyLk1JTl9TQUZFX0lOVEVHRVJ9IGFuZCAke051bWJlci5NQVhfU0FGRV9JTlRFR0VSfSwgaW5jbHVzaXZlLiAgRm9yIHNtYWxsZXIgb3IgYmlnZ2VyIG51bWJlcnMsIHVzZSBWYXJDaGFyIHR5cGUuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBCaWdJbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IEJpZ0ludDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUNBOztBQUNBOzs7O0FBRUEsTUFBTUEsV0FBVyxHQUFHQyxNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDLElBQUQsQ0FBWixDQUFwQjtBQUNBLE1BQU1DLFdBQVcsR0FBR0YsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxJQUFELENBQVosQ0FBcEI7QUFFQSxNQUFNRSxNQUFnQixHQUFHO0VBQ3ZCQyxFQUFFLEVBQUUsSUFEbUI7RUFFdkJDLElBQUksRUFBRSxNQUZpQjtFQUd2QkMsSUFBSSxFQUFFLFFBSGlCO0VBS3ZCQyxXQUFXLEVBQUUsWUFBVztJQUN0QixPQUFPLFFBQVA7RUFDRCxDQVBzQjs7RUFTdkJDLGdCQUFnQixHQUFHO0lBQ2pCLE9BQU9SLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUNRLGNBQUtMLEVBQU4sRUFBVSxJQUFWLENBQVosQ0FBUDtFQUNELENBWHNCOztFQWF2Qk0sdUJBQXVCLENBQUNDLFNBQUQsRUFBWUMsT0FBWixFQUFxQjtJQUMxQyxJQUFJRCxTQUFTLENBQUNFLEtBQVYsSUFBbUIsSUFBdkIsRUFBNkI7TUFDM0IsT0FBT1gsV0FBUDtJQUNEOztJQUVELE9BQU9ILFdBQVA7RUFDRCxDQW5Cc0I7O0VBcUJ2QixDQUFFZSxxQkFBRixDQUF3QkgsU0FBeEIsRUFBbUNDLE9BQW5DLEVBQTRDO0lBQzFDLElBQUlELFNBQVMsQ0FBQ0UsS0FBVixJQUFtQixJQUF2QixFQUE2QjtNQUMzQjtJQUNEOztJQUVELE1BQU1FLE1BQU0sR0FBRyxJQUFJQywrQkFBSixDQUEyQixDQUEzQixDQUFmO0lBQ0FELE1BQU0sQ0FBQ0UsWUFBUCxDQUFvQkMsTUFBTSxDQUFDUCxTQUFTLENBQUNFLEtBQVgsQ0FBMUI7SUFDQSxNQUFNRSxNQUFNLENBQUNJLElBQWI7RUFDRCxDQTdCc0I7O0VBK0J2QkMsUUFBUSxFQUFFLFVBQVNQLEtBQVQsRUFBK0I7SUFDdkMsSUFBSUEsS0FBSyxJQUFJLElBQWIsRUFBbUI7TUFDakIsT0FBTyxJQUFQO0lBQ0Q7O0lBRUQsSUFBSSxPQUFPQSxLQUFQLEtBQWlCLFFBQXJCLEVBQStCO01BQzdCQSxLQUFLLEdBQUdLLE1BQU0sQ0FBQ0wsS0FBRCxDQUFkO0lBQ0Q7O0lBRUQsSUFBSVEsS0FBSyxDQUFDUixLQUFELENBQVQsRUFBa0I7TUFDaEIsTUFBTSxJQUFJUyxTQUFKLENBQWMsaUJBQWQsQ0FBTjtJQUNEOztJQUVELElBQUlULEtBQUssR0FBR0ssTUFBTSxDQUFDSyxnQkFBZixJQUFtQ1YsS0FBSyxHQUFHSyxNQUFNLENBQUNNLGdCQUF0RCxFQUF3RTtNQUN0RSxNQUFNLElBQUlGLFNBQUosQ0FBZSx5QkFBd0JKLE1BQU0sQ0FBQ0ssZ0JBQWlCLFFBQU9MLE1BQU0sQ0FBQ00sZ0JBQWlCLGdFQUE5RixDQUFOO0lBQ0Q7O0lBRUQsT0FBT1gsS0FBUDtFQUNEO0FBakRzQixDQUF6QjtlQW9EZVYsTTs7QUFDZnNCLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQnZCLE1BQWpCIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
const NULL_LENGTH = Buffer.from([0xFF, 0xFF]);
const Binary = {
  id: 0xAD,
  type: 'BIGBinary',
  name: 'Binary',
  maximumLength: 8000,
  declaration: function (parameter) {
    const value = parameter.value;
    let length;

    if (parameter.length) {
      length = parameter.length;
    } else if (value != null) {
      length = value.length || 1;
    } else if (value === null && !parameter.output) {
      length = 1;
    } else {
      length = this.maximumLength;
    }

    return 'binary(' + length + ')';
  },
  resolveLength: function (parameter) {
    const value = parameter.value;

    if (value != null) {
      return value.length;
    } else {
      return this.maximumLength;
    }
  },

  generateTypeInfo(parameter) {
    const buffer = Buffer.alloc(3);
    buffer.writeUInt8(this.id, 0);
    buffer.writeUInt16LE(parameter.length, 1);
    return buffer;
  },

  generateParameterLength(parameter, options) {
    if (parameter.value == null) {
      return NULL_LENGTH;
    }

    const buffer = Buffer.alloc(2);
    buffer.writeUInt16LE(parameter.length, 0);
    return buffer;
  },

  *generateParameterData(parameter, options) {
    if (parameter.value == null) {
      return;
    }

    yield parameter.value.slice(0, parameter.length !== undefined ? Math.min(parameter.length, this.maximumLength) : this.maximumLength);
  },

  validate: function (value) {
    if (value == null) {
      return null;
    }

    if (!Buffer.isBuffer(value)) {
      throw new TypeError('Invalid buffer.');
    }

    return value;
  }
};
var _default = Binary;
exports.default = _default;
module.exports = Binary;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOVUxMX0xFTkdUSCIsIkJ1ZmZlciIsImZyb20iLCJCaW5hcnkiLCJpZCIsInR5cGUiLCJuYW1lIiwibWF4aW11bUxlbmd0aCIsImRlY2xhcmF0aW9uIiwicGFyYW1ldGVyIiwidmFsdWUiLCJsZW5ndGgiLCJvdXRwdXQiLCJyZXNvbHZlTGVuZ3RoIiwiZ2VuZXJhdGVUeXBlSW5mbyIsImJ1ZmZlciIsImFsbG9jIiwid3JpdGVVSW50OCIsIndyaXRlVUludDE2TEUiLCJnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aCIsIm9wdGlvbnMiLCJnZW5lcmF0ZVBhcmFtZXRlckRhdGEiLCJzbGljZSIsInVuZGVmaW5lZCIsIk1hdGgiLCJtaW4iLCJ2YWxpZGF0ZSIsImlzQnVmZmVyIiwiVHlwZUVycm9yIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhLXR5cGVzL2JpbmFyeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4uL2RhdGEtdHlwZSc7XG5cbmNvbnN0IE5VTExfTEVOR1RIID0gQnVmZmVyLmZyb20oWzB4RkYsIDB4RkZdKTtcblxuY29uc3QgQmluYXJ5OiB7IG1heGltdW1MZW5ndGg6IG51bWJlciB9ICYgRGF0YVR5cGUgPSB7XG4gIGlkOiAweEFELFxuICB0eXBlOiAnQklHQmluYXJ5JyxcbiAgbmFtZTogJ0JpbmFyeScsXG4gIG1heGltdW1MZW5ndGg6IDgwMDAsXG5cbiAgZGVjbGFyYXRpb246IGZ1bmN0aW9uKHBhcmFtZXRlcikge1xuICAgIGNvbnN0IHZhbHVlID0gcGFyYW1ldGVyLnZhbHVlIGFzIEJ1ZmZlciB8IG51bGw7XG5cbiAgICBsZXQgbGVuZ3RoO1xuICAgIGlmIChwYXJhbWV0ZXIubGVuZ3RoKSB7XG4gICAgICBsZW5ndGggPSBwYXJhbWV0ZXIubGVuZ3RoO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgbGVuZ3RoID0gdmFsdWUubGVuZ3RoIHx8IDE7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gbnVsbCAmJiAhcGFyYW1ldGVyLm91dHB1dCkge1xuICAgICAgbGVuZ3RoID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGVuZ3RoID0gdGhpcy5tYXhpbXVtTGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiAnYmluYXJ5KCcgKyBsZW5ndGggKyAnKSc7XG4gIH0sXG5cbiAgcmVzb2x2ZUxlbmd0aDogZnVuY3Rpb24ocGFyYW1ldGVyKSB7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJhbWV0ZXIudmFsdWUgYXMgQnVmZmVyIHwgbnVsbDtcblxuICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdmFsdWUubGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXhpbXVtTGVuZ3RoO1xuICAgIH1cbiAgfSxcblxuICBnZW5lcmF0ZVR5cGVJbmZvKHBhcmFtZXRlcikge1xuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygzKTtcbiAgICBidWZmZXIud3JpdGVVSW50OCh0aGlzLmlkLCAwKTtcbiAgICBidWZmZXIud3JpdGVVSW50MTZMRShwYXJhbWV0ZXIubGVuZ3RoISwgMSk7XG4gICAgcmV0dXJuIGJ1ZmZlcjtcbiAgfSxcblxuICBnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aChwYXJhbWV0ZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAocGFyYW1ldGVyLnZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBOVUxMX0xFTkdUSDtcbiAgICB9XG5cbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2MoMik7XG4gICAgYnVmZmVyLndyaXRlVUludDE2TEUocGFyYW1ldGVyLmxlbmd0aCEsIDApO1xuICAgIHJldHVybiBidWZmZXI7XG4gIH0sXG5cbiAgKiBnZW5lcmF0ZVBhcmFtZXRlckRhdGEocGFyYW1ldGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKHBhcmFtZXRlci52YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgeWllbGQgcGFyYW1ldGVyLnZhbHVlLnNsaWNlKDAsIHBhcmFtZXRlci5sZW5ndGggIT09IHVuZGVmaW5lZCA/IE1hdGgubWluKHBhcmFtZXRlci5sZW5ndGgsIHRoaXMubWF4aW11bUxlbmd0aCkgOiB0aGlzLm1heGltdW1MZW5ndGgpO1xuICB9LFxuXG4gIHZhbGlkYXRlOiBmdW5jdGlvbih2YWx1ZSk6IEJ1ZmZlciB8IG51bGwge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYnVmZmVyLicpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQmluYXJ5O1xubW9kdWxlLmV4cG9ydHMgPSBCaW5hcnk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUVBLE1BQU1BLFdBQVcsR0FBR0MsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxJQUFELEVBQU8sSUFBUCxDQUFaLENBQXBCO0FBRUEsTUFBTUMsTUFBNEMsR0FBRztFQUNuREMsRUFBRSxFQUFFLElBRCtDO0VBRW5EQyxJQUFJLEVBQUUsV0FGNkM7RUFHbkRDLElBQUksRUFBRSxRQUg2QztFQUluREMsYUFBYSxFQUFFLElBSm9DO0VBTW5EQyxXQUFXLEVBQUUsVUFBU0MsU0FBVCxFQUFvQjtJQUMvQixNQUFNQyxLQUFLLEdBQUdELFNBQVMsQ0FBQ0MsS0FBeEI7SUFFQSxJQUFJQyxNQUFKOztJQUNBLElBQUlGLFNBQVMsQ0FBQ0UsTUFBZCxFQUFzQjtNQUNwQkEsTUFBTSxHQUFHRixTQUFTLENBQUNFLE1BQW5CO0lBQ0QsQ0FGRCxNQUVPLElBQUlELEtBQUssSUFBSSxJQUFiLEVBQW1CO01BQ3hCQyxNQUFNLEdBQUdELEtBQUssQ0FBQ0MsTUFBTixJQUFnQixDQUF6QjtJQUNELENBRk0sTUFFQSxJQUFJRCxLQUFLLEtBQUssSUFBVixJQUFrQixDQUFDRCxTQUFTLENBQUNHLE1BQWpDLEVBQXlDO01BQzlDRCxNQUFNLEdBQUcsQ0FBVDtJQUNELENBRk0sTUFFQTtNQUNMQSxNQUFNLEdBQUcsS0FBS0osYUFBZDtJQUNEOztJQUVELE9BQU8sWUFBWUksTUFBWixHQUFxQixHQUE1QjtFQUNELENBckJrRDtFQXVCbkRFLGFBQWEsRUFBRSxVQUFTSixTQUFULEVBQW9CO0lBQ2pDLE1BQU1DLEtBQUssR0FBR0QsU0FBUyxDQUFDQyxLQUF4Qjs7SUFFQSxJQUFJQSxLQUFLLElBQUksSUFBYixFQUFtQjtNQUNqQixPQUFPQSxLQUFLLENBQUNDLE1BQWI7SUFDRCxDQUZELE1BRU87TUFDTCxPQUFPLEtBQUtKLGFBQVo7SUFDRDtFQUNGLENBL0JrRDs7RUFpQ25ETyxnQkFBZ0IsQ0FBQ0wsU0FBRCxFQUFZO0lBQzFCLE1BQU1NLE1BQU0sR0FBR2QsTUFBTSxDQUFDZSxLQUFQLENBQWEsQ0FBYixDQUFmO0lBQ0FELE1BQU0sQ0FBQ0UsVUFBUCxDQUFrQixLQUFLYixFQUF2QixFQUEyQixDQUEzQjtJQUNBVyxNQUFNLENBQUNHLGFBQVAsQ0FBcUJULFNBQVMsQ0FBQ0UsTUFBL0IsRUFBd0MsQ0FBeEM7SUFDQSxPQUFPSSxNQUFQO0VBQ0QsQ0F0Q2tEOztFQXdDbkRJLHVCQUF1QixDQUFDVixTQUFELEVBQVlXLE9BQVosRUFBcUI7SUFDMUMsSUFBSVgsU0FBUyxDQUFDQyxLQUFWLElBQW1CLElBQXZCLEVBQTZCO01BQzNCLE9BQU9WLFdBQVA7SUFDRDs7SUFFRCxNQUFNZSxNQUFNLEdBQUdkLE1BQU0sQ0FBQ2UsS0FBUCxDQUFhLENBQWIsQ0FBZjtJQUNBRCxNQUFNLENBQUNHLGFBQVAsQ0FBcUJULFNBQVMsQ0FBQ0UsTUFBL0IsRUFBd0MsQ0FBeEM7SUFDQSxPQUFPSSxNQUFQO0VBQ0QsQ0FoRGtEOztFQWtEbkQsQ0FBRU0scUJBQUYsQ0FBd0JaLFNBQXhCLEVBQW1DVyxPQUFuQyxFQUE0QztJQUMxQyxJQUFJWCxTQUFTLENBQUNDLEtBQVYsSUFBbUIsSUFBdkIsRUFBNkI7TUFDM0I7SUFDRDs7SUFFRCxNQUFNRCxTQUFTLENBQUNDLEtBQVYsQ0FBZ0JZLEtBQWhCLENBQXNCLENBQXRCLEVBQXlCYixTQUFTLENBQUNFLE1BQVYsS0FBcUJZLFNBQXJCLEdBQWlDQyxJQUFJLENBQUNDLEdBQUwsQ0FBU2hCLFNBQVMsQ0FBQ0UsTUFBbkIsRUFBMkIsS0FBS0osYUFBaEMsQ0FBakMsR0FBa0YsS0FBS0EsYUFBaEgsQ0FBTjtFQUNELENBeERrRDs7RUEwRG5EbUIsUUFBUSxFQUFFLFVBQVNoQixLQUFULEVBQStCO0lBQ3ZDLElBQUlBLEtBQUssSUFBSSxJQUFiLEVBQW1CO01BQ2pCLE9BQU8sSUFBUDtJQUNEOztJQUVELElBQUksQ0FBQ1QsTUFBTSxDQUFDMEIsUUFBUCxDQUFnQmpCLEtBQWhCLENBQUwsRUFBNkI7TUFDM0IsTUFBTSxJQUFJa0IsU0FBSixDQUFjLGlCQUFkLENBQU47SUFDRDs7SUFFRCxPQUFPbEIsS0FBUDtFQUNEO0FBcEVrRCxDQUFyRDtlQXVFZVAsTTs7QUFDZjBCLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjNCLE1BQWpCIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _bitn = _interopRequireDefault(require("./bitn"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const DATA_LENGTH = Buffer.from([0x01]);
const NULL_LENGTH = Buffer.from([0x00]);
const Bit = {
  id: 0x32,
  type: 'BIT',
  name: 'Bit',
  declaration: function () {
    return 'bit';
  },

  generateTypeInfo() {
    return Buffer.from([_bitn.default.id, 0x01]);
  },

  generateParameterLength(parameter, options) {
    if (parameter.value == null) {
      return NULL_LENGTH;
    }

    return DATA_LENGTH;
  },

  *generateParameterData(parameter, options) {
    if (parameter.value == null) {
      return;
    }

    yield parameter.value ? Buffer.from([0x01]) : Buffer.from([0x00]);
  },

  validate: function (value) {
    if (value == null) {
      return null;
    }

    if (value) {
      return true;
    } else {
      return false;
    }
  }
};
var _default = Bit;
exports.default = _default;
module.exports = Bit;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJEQVRBX0xFTkdUSCIsIkJ1ZmZlciIsImZyb20iLCJOVUxMX0xFTkdUSCIsIkJpdCIsImlkIiwidHlwZSIsIm5hbWUiLCJkZWNsYXJhdGlvbiIsImdlbmVyYXRlVHlwZUluZm8iLCJCaXROIiwiZ2VuZXJhdGVQYXJhbWV0ZXJMZW5ndGgiLCJwYXJhbWV0ZXIiLCJvcHRpb25zIiwidmFsdWUiLCJnZW5lcmF0ZVBhcmFtZXRlckRhdGEiLCJ2YWxpZGF0ZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YS10eXBlcy9iaXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuLi9kYXRhLXR5cGUnO1xuaW1wb3J0IEJpdE4gZnJvbSAnLi9iaXRuJztcblxuY29uc3QgREFUQV9MRU5HVEggPSBCdWZmZXIuZnJvbShbMHgwMV0pO1xuY29uc3QgTlVMTF9MRU5HVEggPSBCdWZmZXIuZnJvbShbMHgwMF0pO1xuXG5jb25zdCBCaXQ6IERhdGFUeXBlID0ge1xuICBpZDogMHgzMixcbiAgdHlwZTogJ0JJVCcsXG4gIG5hbWU6ICdCaXQnLFxuXG4gIGRlY2xhcmF0aW9uOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gJ2JpdCc7XG4gIH0sXG5cbiAgZ2VuZXJhdGVUeXBlSW5mbygpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oW0JpdE4uaWQsIDB4MDFdKTtcbiAgfSxcblxuICBnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aChwYXJhbWV0ZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAocGFyYW1ldGVyLnZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBOVUxMX0xFTkdUSDtcbiAgICB9XG5cbiAgICByZXR1cm4gREFUQV9MRU5HVEg7XG4gIH0sXG5cbiAgKiBnZW5lcmF0ZVBhcmFtZXRlckRhdGEocGFyYW1ldGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKHBhcmFtZXRlci52YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgeWllbGQgcGFyYW1ldGVyLnZhbHVlID8gQnVmZmVyLmZyb20oWzB4MDFdKSA6IEJ1ZmZlci5mcm9tKFsweDAwXSk7XG4gIH0sXG5cbiAgdmFsaWRhdGU6IGZ1bmN0aW9uKHZhbHVlKTogbnVsbCB8IGJvb2xlYW4ge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQml0O1xubW9kdWxlLmV4cG9ydHMgPSBCaXQ7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7OztBQUVBLE1BQU1BLFdBQVcsR0FBR0MsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxJQUFELENBQVosQ0FBcEI7QUFDQSxNQUFNQyxXQUFXLEdBQUdGLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxDQUFaLENBQXBCO0FBRUEsTUFBTUUsR0FBYSxHQUFHO0VBQ3BCQyxFQUFFLEVBQUUsSUFEZ0I7RUFFcEJDLElBQUksRUFBRSxLQUZjO0VBR3BCQyxJQUFJLEVBQUUsS0FIYztFQUtwQkMsV0FBVyxFQUFFLFlBQVc7SUFDdEIsT0FBTyxLQUFQO0VBQ0QsQ0FQbUI7O0VBU3BCQyxnQkFBZ0IsR0FBRztJQUNqQixPQUFPUixNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDUSxjQUFLTCxFQUFOLEVBQVUsSUFBVixDQUFaLENBQVA7RUFDRCxDQVhtQjs7RUFhcEJNLHVCQUF1QixDQUFDQyxTQUFELEVBQVlDLE9BQVosRUFBcUI7SUFDMUMsSUFBSUQsU0FBUyxDQUFDRSxLQUFWLElBQW1CLElBQXZCLEVBQTZCO01BQzNCLE9BQU9YLFdBQVA7SUFDRDs7SUFFRCxPQUFPSCxXQUFQO0VBQ0QsQ0FuQm1COztFQXFCcEIsQ0FBRWUscUJBQUYsQ0FBd0JILFNBQXhCLEVBQW1DQyxPQUFuQyxFQUE0QztJQUMxQyxJQUFJRCxTQUFTLENBQUNFLEtBQVYsSUFBbUIsSUFBdkIsRUFBNkI7TUFDM0I7SUFDRDs7SUFFRCxNQUFNRixTQUFTLENBQUNFLEtBQVYsR0FBa0JiLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxDQUFaLENBQWxCLEdBQXdDRCxNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDLElBQUQsQ0FBWixDQUE5QztFQUNELENBM0JtQjs7RUE2QnBCYyxRQUFRLEVBQUUsVUFBU0YsS0FBVCxFQUFnQztJQUN4QyxJQUFJQSxLQUFLLElBQUksSUFBYixFQUFtQjtNQUNqQixPQUFPLElBQVA7SUFDRDs7SUFDRCxJQUFJQSxLQUFKLEVBQVc7TUFDVCxPQUFPLElBQVA7SUFDRCxDQUZELE1BRU87TUFDTCxPQUFPLEtBQVA7SUFDRDtFQUNGO0FBdENtQixDQUF0QjtlQXlDZVYsRzs7QUFDZmEsTUFBTSxDQUFDQyxPQUFQLEdBQWlCZCxHQUFqQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
const BitN = {
  id: 0x68,
  type: 'BITN',
  name: 'BitN',

  declaration() {
    throw new Error('not implemented');
  },

  generateTypeInfo() {
    throw new Error('not implemented');
  },

  generateParameterLength() {
    throw new Error('not implemented');
  },

  *generateParameterData() {
    throw new Error('not implemented');
  },

  validate() {
    throw new Error('not implemented');
  }

};
var _default = BitN;
exports.default = _default;
module.exports = BitN;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCaXROIiwiaWQiLCJ0eXBlIiwibmFtZSIsImRlY2xhcmF0aW9uIiwiRXJyb3IiLCJnZW5lcmF0ZVR5cGVJbmZvIiwiZ2VuZXJhdGVQYXJhbWV0ZXJMZW5ndGgiLCJnZW5lcmF0ZVBhcmFtZXRlckRhdGEiLCJ2YWxpZGF0ZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YS10eXBlcy9iaXRuLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi4vZGF0YS10eXBlJztcblxuY29uc3QgQml0TjogRGF0YVR5cGUgPSB7XG4gIGlkOiAweDY4LFxuICB0eXBlOiAnQklUTicsXG4gIG5hbWU6ICdCaXROJyxcblxuICBkZWNsYXJhdGlvbigpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICB9LFxuXG4gIGdlbmVyYXRlVHlwZUluZm8oKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgfSxcblxuICBnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICB9LFxuXG4gICogZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gIH0sXG5cbiAgdmFsaWRhdGUoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQml0Tjtcbm1vZHVsZS5leHBvcnRzID0gQml0TjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUEsTUFBTUEsSUFBYyxHQUFHO0VBQ3JCQyxFQUFFLEVBQUUsSUFEaUI7RUFFckJDLElBQUksRUFBRSxNQUZlO0VBR3JCQyxJQUFJLEVBQUUsTUFIZTs7RUFLckJDLFdBQVcsR0FBRztJQUNaLE1BQU0sSUFBSUMsS0FBSixDQUFVLGlCQUFWLENBQU47RUFDRCxDQVBvQjs7RUFTckJDLGdCQUFnQixHQUFHO0lBQ2pCLE1BQU0sSUFBSUQsS0FBSixDQUFVLGlCQUFWLENBQU47RUFDRCxDQVhvQjs7RUFhckJFLHVCQUF1QixHQUFHO0lBQ3hCLE1BQU0sSUFBSUYsS0FBSixDQUFVLGlCQUFWLENBQU47RUFDRCxDQWZvQjs7RUFpQnJCLENBQUVHLHFCQUFGLEdBQTBCO0lBQ3hCLE1BQU0sSUFBSUgsS0FBSixDQUFVLGlCQUFWLENBQU47RUFDRCxDQW5Cb0I7O0VBcUJyQkksUUFBUSxHQUFHO0lBQ1QsTUFBTSxJQUFJSixLQUFKLENBQVUsaUJBQVYsQ0FBTjtFQUNEOztBQXZCb0IsQ0FBdkI7ZUEwQmVMLEk7O0FBQ2ZVLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQlgsSUFBakIifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _iconvLite = _interopRequireDefault(require("iconv-lite"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const NULL_LENGTH = Buffer.from([0xFF, 0xFF]);
const Char = {
  id: 0xAF,
  type: 'BIGCHAR',
  name: 'Char',
  maximumLength: 8000,
  declaration: function (parameter) {
    const value = parameter.value;
    let length;

    if (parameter.length) {
      length = parameter.length;
    } else if (value != null) {
      length = value.length || 1;
    } else if (value === null && !parameter.output) {
      length = 1;
    } else {
      length = this.maximumLength;
    }

    if (length < this.maximumLength) {
      return 'char(' + length + ')';
    } else {
      return 'char(' + this.maximumLength + ')';
    }
  },
  // ParameterData<any> is temporary solution. TODO: need to understand what type ParameterData<...> can be.
  resolveLength: function (parameter) {
    const value = parameter.value;

    if (parameter.length != null) {
      return parameter.length;
    } else if (value != null) {
      return value.length || 1;
    } else {
      return this.maximumLength;
    }
  },

  generateTypeInfo(parameter) {
    const buffer = Buffer.alloc(8);
    buffer.writeUInt8(this.id, 0);
    buffer.writeUInt16LE(parameter.length, 1);

    if (parameter.collation) {
      parameter.collation.toBuffer().copy(buffer, 3, 0, 5);
    }

    return buffer;
  },

  generateParameterLength(parameter, options) {
    const value = parameter.value;

    if (value == null) {
      return NULL_LENGTH;
    }

    const buffer = Buffer.alloc(2);
    buffer.writeUInt16LE(value.length, 0);
    return buffer;
  },

  *generateParameterData(parameter, options) {
    if (parameter.value == null) {
      return;
    }

    yield Buffer.from(parameter.value, 'ascii');
  },

  validate: function (value, collation) {
    if (value == null) {
      return null;
    }

    if (typeof value !== 'string') {
      throw new TypeError('Invalid string.');
    }

    if (!collation) {
      throw new Error('No collation was set by the server for the current connection.');
    }

    if (!collation.codepage) {
      throw new Error('The collation set by the server has no associated encoding.');
    }

    return _iconvLite.default.encode(value, collation.codepage);
  }
};
var _default = Char;
exports.default = _default;
module.exports = Char;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOVUxMX0xFTkdUSCIsIkJ1ZmZlciIsImZyb20iLCJDaGFyIiwiaWQiLCJ0eXBlIiwibmFtZSIsIm1heGltdW1MZW5ndGgiLCJkZWNsYXJhdGlvbiIsInBhcmFtZXRlciIsInZhbHVlIiwibGVuZ3RoIiwib3V0cHV0IiwicmVzb2x2ZUxlbmd0aCIsImdlbmVyYXRlVHlwZUluZm8iLCJidWZmZXIiLCJhbGxvYyIsIndyaXRlVUludDgiLCJ3cml0ZVVJbnQxNkxFIiwiY29sbGF0aW9uIiwidG9CdWZmZXIiLCJjb3B5IiwiZ2VuZXJhdGVQYXJhbWV0ZXJMZW5ndGgiLCJvcHRpb25zIiwiZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhIiwidmFsaWRhdGUiLCJUeXBlRXJyb3IiLCJFcnJvciIsImNvZGVwYWdlIiwiaWNvbnYiLCJlbmNvZGUiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGEtdHlwZXMvY2hhci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgaWNvbnYgZnJvbSAnaWNvbnYtbGl0ZSc7XG5pbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4uL2RhdGEtdHlwZSc7XG5cbmNvbnN0IE5VTExfTEVOR1RIID0gQnVmZmVyLmZyb20oWzB4RkYsIDB4RkZdKTtcblxuY29uc3QgQ2hhcjogeyBtYXhpbXVtTGVuZ3RoOiBudW1iZXIgfSAmIERhdGFUeXBlID0ge1xuICBpZDogMHhBRixcbiAgdHlwZTogJ0JJR0NIQVInLFxuICBuYW1lOiAnQ2hhcicsXG4gIG1heGltdW1MZW5ndGg6IDgwMDAsXG5cbiAgZGVjbGFyYXRpb246IGZ1bmN0aW9uKHBhcmFtZXRlcikge1xuICAgIGNvbnN0IHZhbHVlID0gcGFyYW1ldGVyLnZhbHVlIGFzIEJ1ZmZlciB8IG51bGw7XG5cbiAgICBsZXQgbGVuZ3RoO1xuICAgIGlmIChwYXJhbWV0ZXIubGVuZ3RoKSB7XG4gICAgICBsZW5ndGggPSBwYXJhbWV0ZXIubGVuZ3RoO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgbGVuZ3RoID0gdmFsdWUubGVuZ3RoIHx8IDE7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gbnVsbCAmJiAhcGFyYW1ldGVyLm91dHB1dCkge1xuICAgICAgbGVuZ3RoID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGVuZ3RoID0gdGhpcy5tYXhpbXVtTGVuZ3RoO1xuICAgIH1cblxuICAgIGlmIChsZW5ndGggPCB0aGlzLm1heGltdW1MZW5ndGgpIHtcbiAgICAgIHJldHVybiAnY2hhcignICsgbGVuZ3RoICsgJyknO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ2NoYXIoJyArIHRoaXMubWF4aW11bUxlbmd0aCArICcpJztcbiAgICB9XG4gIH0sXG5cbiAgLy8gUGFyYW1ldGVyRGF0YTxhbnk+IGlzIHRlbXBvcmFyeSBzb2x1dGlvbi4gVE9ETzogbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdHlwZSBQYXJhbWV0ZXJEYXRhPC4uLj4gY2FuIGJlLlxuICByZXNvbHZlTGVuZ3RoOiBmdW5jdGlvbihwYXJhbWV0ZXIpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcmFtZXRlci52YWx1ZSBhcyBCdWZmZXIgfCBudWxsO1xuXG4gICAgaWYgKHBhcmFtZXRlci5sZW5ndGggIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHBhcmFtZXRlci5sZW5ndGg7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdmFsdWUubGVuZ3RoIHx8IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLm1heGltdW1MZW5ndGg7XG4gICAgfVxuICB9LFxuXG4gIGdlbmVyYXRlVHlwZUluZm8ocGFyYW1ldGVyKSB7XG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jKDgpO1xuICAgIGJ1ZmZlci53cml0ZVVJbnQ4KHRoaXMuaWQsIDApO1xuICAgIGJ1ZmZlci53cml0ZVVJbnQxNkxFKHBhcmFtZXRlci5sZW5ndGghLCAxKTtcblxuICAgIGlmIChwYXJhbWV0ZXIuY29sbGF0aW9uKSB7XG4gICAgICBwYXJhbWV0ZXIuY29sbGF0aW9uLnRvQnVmZmVyKCkuY29weShidWZmZXIsIDMsIDAsIDUpO1xuICAgIH1cblxuICAgIHJldHVybiBidWZmZXI7XG4gIH0sXG5cbiAgZ2VuZXJhdGVQYXJhbWV0ZXJMZW5ndGgocGFyYW1ldGVyLCBvcHRpb25zKSB7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJhbWV0ZXIudmFsdWUgYXMgQnVmZmVyIHwgbnVsbDtcblxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gTlVMTF9MRU5HVEg7XG4gICAgfVxuXG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jKDIpO1xuICAgIGJ1ZmZlci53cml0ZVVJbnQxNkxFKHZhbHVlLmxlbmd0aCwgMCk7XG4gICAgcmV0dXJuIGJ1ZmZlcjtcbiAgfSxcblxuICAqIGdlbmVyYXRlUGFyYW1ldGVyRGF0YShwYXJhbWV0ZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAocGFyYW1ldGVyLnZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB5aWVsZCBCdWZmZXIuZnJvbShwYXJhbWV0ZXIudmFsdWUsICdhc2NpaScpO1xuICB9LFxuXG4gIHZhbGlkYXRlOiBmdW5jdGlvbih2YWx1ZSwgY29sbGF0aW9uKTogQnVmZmVyIHwgbnVsbCB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHN0cmluZy4nKTtcbiAgICB9XG5cbiAgICBpZiAoIWNvbGxhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBjb2xsYXRpb24gd2FzIHNldCBieSB0aGUgc2VydmVyIGZvciB0aGUgY3VycmVudCBjb25uZWN0aW9uLicpO1xuICAgIH1cblxuICAgIGlmICghY29sbGF0aW9uLmNvZGVwYWdlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBjb2xsYXRpb24gc2V0IGJ5IHRoZSBzZXJ2ZXIgaGFzIG5vIGFzc29jaWF0ZWQgZW5jb2RpbmcuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGljb252LmVuY29kZSh2YWx1ZSwgY29sbGF0aW9uLmNvZGVwYWdlKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQ2hhcjtcbm1vZHVsZS5leHBvcnRzID0gQ2hhcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOzs7O0FBR0EsTUFBTUEsV0FBVyxHQUFHQyxNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDLElBQUQsRUFBTyxJQUFQLENBQVosQ0FBcEI7QUFFQSxNQUFNQyxJQUEwQyxHQUFHO0VBQ2pEQyxFQUFFLEVBQUUsSUFENkM7RUFFakRDLElBQUksRUFBRSxTQUYyQztFQUdqREMsSUFBSSxFQUFFLE1BSDJDO0VBSWpEQyxhQUFhLEVBQUUsSUFKa0M7RUFNakRDLFdBQVcsRUFBRSxVQUFTQyxTQUFULEVBQW9CO0lBQy9CLE1BQU1DLEtBQUssR0FBR0QsU0FBUyxDQUFDQyxLQUF4QjtJQUVBLElBQUlDLE1BQUo7O0lBQ0EsSUFBSUYsU0FBUyxDQUFDRSxNQUFkLEVBQXNCO01BQ3BCQSxNQUFNLEdBQUdGLFNBQVMsQ0FBQ0UsTUFBbkI7SUFDRCxDQUZELE1BRU8sSUFBSUQsS0FBSyxJQUFJLElBQWIsRUFBbUI7TUFDeEJDLE1BQU0sR0FBR0QsS0FBSyxDQUFDQyxNQUFOLElBQWdCLENBQXpCO0lBQ0QsQ0FGTSxNQUVBLElBQUlELEtBQUssS0FBSyxJQUFWLElBQWtCLENBQUNELFNBQVMsQ0FBQ0csTUFBakMsRUFBeUM7TUFDOUNELE1BQU0sR0FBRyxDQUFUO0lBQ0QsQ0FGTSxNQUVBO01BQ0xBLE1BQU0sR0FBRyxLQUFLSixhQUFkO0lBQ0Q7O0lBRUQsSUFBSUksTUFBTSxHQUFHLEtBQUtKLGFBQWxCLEVBQWlDO01BQy9CLE9BQU8sVUFBVUksTUFBVixHQUFtQixHQUExQjtJQUNELENBRkQsTUFFTztNQUNMLE9BQU8sVUFBVSxLQUFLSixhQUFmLEdBQStCLEdBQXRDO0lBQ0Q7RUFDRixDQXpCZ0Q7RUEyQmpEO0VBQ0FNLGFBQWEsRUFBRSxVQUFTSixTQUFULEVBQW9CO0lBQ2pDLE1BQU1DLEtBQUssR0FBR0QsU0FBUyxDQUFDQyxLQUF4Qjs7SUFFQSxJQUFJRCxTQUFTLENBQUNFLE1BQVYsSUFBb0IsSUFBeEIsRUFBOEI7TUFDNUIsT0FBT0YsU0FBUyxDQUFDRSxNQUFqQjtJQUNELENBRkQsTUFFTyxJQUFJRCxLQUFLLElBQUksSUFBYixFQUFtQjtNQUN4QixPQUFPQSxLQUFLLENBQUNDLE1BQU4sSUFBZ0IsQ0FBdkI7SUFDRCxDQUZNLE1BRUE7TUFDTCxPQUFPLEtBQUtKLGFBQVo7SUFDRDtFQUNGLENBdENnRDs7RUF3Q2pETyxnQkFBZ0IsQ0FBQ0wsU0FBRCxFQUFZO0lBQzFCLE1BQU1NLE1BQU0sR0FBR2QsTUFBTSxDQUFDZSxLQUFQLENBQWEsQ0FBYixDQUFmO0lBQ0FELE1BQU0sQ0FBQ0UsVUFBUCxDQUFrQixLQUFLYixFQUF2QixFQUEyQixDQUEzQjtJQUNBVyxNQUFNLENBQUNHLGFBQVAsQ0FBcUJULFNBQVMsQ0FBQ0UsTUFBL0IsRUFBd0MsQ0FBeEM7O0lBRUEsSUFBSUYsU0FBUyxDQUFDVSxTQUFkLEVBQXlCO01BQ3ZCVixTQUFTLENBQUNVLFNBQVYsQ0FBb0JDLFFBQXBCLEdBQStCQyxJQUEvQixDQUFvQ04sTUFBcEMsRUFBNEMsQ0FBNUMsRUFBK0MsQ0FBL0MsRUFBa0QsQ0FBbEQ7SUFDRDs7SUFFRCxPQUFPQSxNQUFQO0VBQ0QsQ0FsRGdEOztFQW9EakRPLHVCQUF1QixDQUFDYixTQUFELEVBQVljLE9BQVosRUFBcUI7SUFDMUMsTUFBTWIsS0FBSyxHQUFHRCxTQUFTLENBQUNDLEtBQXhCOztJQUVBLElBQUlBLEtBQUssSUFBSSxJQUFiLEVBQW1CO01BQ2pCLE9BQU9WLFdBQVA7SUFDRDs7SUFFRCxNQUFNZSxNQUFNLEdBQUdkLE1BQU0sQ0FBQ2UsS0FBUCxDQUFhLENBQWIsQ0FBZjtJQUNBRCxNQUFNLENBQUNHLGFBQVAsQ0FBcUJSLEtBQUssQ0FBQ0MsTUFBM0IsRUFBbUMsQ0FBbkM7SUFDQSxPQUFPSSxNQUFQO0VBQ0QsQ0E5RGdEOztFQWdFakQsQ0FBRVMscUJBQUYsQ0FBd0JmLFNBQXhCLEVBQW1DYyxPQUFuQyxFQUE0QztJQUMxQyxJQUFJZCxTQUFTLENBQUNDLEtBQVYsSUFBbUIsSUFBdkIsRUFBNkI7TUFDM0I7SUFDRDs7SUFFRCxNQUFNVCxNQUFNLENBQUNDLElBQVAsQ0FBWU8sU0FBUyxDQUFDQyxLQUF0QixFQUE2QixPQUE3QixDQUFOO0VBQ0QsQ0F0RWdEOztFQXdFakRlLFFBQVEsRUFBRSxVQUFTZixLQUFULEVBQWdCUyxTQUFoQixFQUEwQztJQUNsRCxJQUFJVCxLQUFLLElBQUksSUFBYixFQUFtQjtNQUNqQixPQUFPLElBQVA7SUFDRDs7SUFFRCxJQUFJLE9BQU9BLEtBQVAsS0FBaUIsUUFBckIsRUFBK0I7TUFDN0IsTUFBTSxJQUFJZ0IsU0FBSixDQUFjLGlCQUFkLENBQU47SUFDRDs7SUFFRCxJQUFJLENBQUNQLFNBQUwsRUFBZ0I7TUFDZCxNQUFNLElBQUlRLEtBQUosQ0FBVSxnRUFBVixDQUFOO0lBQ0Q7O0lBRUQsSUFBSSxDQUFDUixTQUFTLENBQUNTLFFBQWYsRUFBeUI7TUFDdkIsTUFBTSxJQUFJRCxLQUFKLENBQVUsNkRBQVYsQ0FBTjtJQUNEOztJQUVELE9BQU9FLG1CQUFNQyxNQUFOLENBQWFwQixLQUFiLEVBQW9CUyxTQUFTLENBQUNTLFFBQTlCLENBQVA7RUFDRDtBQTFGZ0QsQ0FBbkQ7ZUE2RmV6QixJOztBQUNmNEIsTUFBTSxDQUFDQyxPQUFQLEdBQWlCN0IsSUFBakIifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _core = require("@js-joda/core");

// globalDate is to be used for JavaScript's global 'Date' object to avoid name clashing with the 'Date' constant below
const globalDate = global.Date;

const EPOCH_DATE = _core.LocalDate.ofYearDay(1, 1);

const NULL_LENGTH = Buffer.from([0x00]);
const DATA_LENGTH = Buffer.from([0x03]);
const Date = {
  id: 0x28,
  type: 'DATEN',
  name: 'Date',
  declaration: function () {
    return 'date';
  },
  generateTypeInfo: function () {
    return Buffer.from([this.id]);
  },

  generateParameterLength(parameter, options) {
    if (parameter.value == null) {
      return NULL_LENGTH;
    }

    return DATA_LENGTH;
  },

  *generateParameterData(parameter, options) {
    if (parameter.value == null) {
      return;
    }

    const value = parameter.value; // Temporary solution. Remove 'any' later.

    let date;

    if (options.useUTC) {
      date = _core.LocalDate.of(value.getUTCFullYear(), value.getUTCMonth() + 1, value.getUTCDate());
    } else {
      date = _core.LocalDate.of(value.getFullYear(), value.getMonth() + 1, value.getDate());
    }

    const days = EPOCH_DATE.until(date, _core.ChronoUnit.DAYS);
    const buffer = Buffer.alloc(3);
    buffer.writeUIntLE(days, 0, 3);
    yield buffer;
  },

  // TODO: value is techincally of type 'unknown'.
  validate: function (value) {
    if (value == null) {
      return null;
    }

    if (!(value instanceof globalDate)) {
      value = new globalDate(globalDate.parse(value));
    }

    if (isNaN(value)) {
      throw new TypeError('Invalid date.');
    }

    return value;
  }
};
var _default = Date;
exports.default = _default;
module.exports = Date;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnbG9iYWxEYXRlIiwiZ2xvYmFsIiwiRGF0ZSIsIkVQT0NIX0RBVEUiLCJMb2NhbERhdGUiLCJvZlllYXJEYXkiLCJOVUxMX0xFTkdUSCIsIkJ1ZmZlciIsImZyb20iLCJEQVRBX0xFTkdUSCIsImlkIiwidHlwZSIsIm5hbWUiLCJkZWNsYXJhdGlvbiIsImdlbmVyYXRlVHlwZUluZm8iLCJnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aCIsInBhcmFtZXRlciIsIm9wdGlvbnMiLCJ2YWx1ZSIsImdlbmVyYXRlUGFyYW1ldGVyRGF0YSIsImRhdGUiLCJ1c2VVVEMiLCJvZiIsImdldFVUQ0Z1bGxZZWFyIiwiZ2V0VVRDTW9udGgiLCJnZXRVVENEYXRlIiwiZ2V0RnVsbFllYXIiLCJnZXRNb250aCIsImdldERhdGUiLCJkYXlzIiwidW50aWwiLCJDaHJvbm9Vbml0IiwiREFZUyIsImJ1ZmZlciIsImFsbG9jIiwid3JpdGVVSW50TEUiLCJ2YWxpZGF0ZSIsInBhcnNlIiwiaXNOYU4iLCJUeXBlRXJyb3IiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGEtdHlwZXMvZGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4uL2RhdGEtdHlwZSc7XG5pbXBvcnQgeyBDaHJvbm9Vbml0LCBMb2NhbERhdGUgfSBmcm9tICdAanMtam9kYS9jb3JlJztcblxuLy8gZ2xvYmFsRGF0ZSBpcyB0byBiZSB1c2VkIGZvciBKYXZhU2NyaXB0J3MgZ2xvYmFsICdEYXRlJyBvYmplY3QgdG8gYXZvaWQgbmFtZSBjbGFzaGluZyB3aXRoIHRoZSAnRGF0ZScgY29uc3RhbnQgYmVsb3dcbmNvbnN0IGdsb2JhbERhdGUgPSBnbG9iYWwuRGF0ZTtcbmNvbnN0IEVQT0NIX0RBVEUgPSBMb2NhbERhdGUub2ZZZWFyRGF5KDEsIDEpO1xuY29uc3QgTlVMTF9MRU5HVEggPSBCdWZmZXIuZnJvbShbMHgwMF0pO1xuY29uc3QgREFUQV9MRU5HVEggPSBCdWZmZXIuZnJvbShbMHgwM10pO1xuXG5jb25zdCBEYXRlOiBEYXRhVHlwZSA9IHtcbiAgaWQ6IDB4MjgsXG4gIHR5cGU6ICdEQVRFTicsXG4gIG5hbWU6ICdEYXRlJyxcblxuICBkZWNsYXJhdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICdkYXRlJztcbiAgfSxcblxuICBnZW5lcmF0ZVR5cGVJbmZvOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oW3RoaXMuaWRdKTtcbiAgfSxcblxuICBnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aChwYXJhbWV0ZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAocGFyYW1ldGVyLnZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBOVUxMX0xFTkdUSDtcbiAgICB9XG5cbiAgICByZXR1cm4gREFUQV9MRU5HVEg7XG4gIH0sXG5cbiAgKiBnZW5lcmF0ZVBhcmFtZXRlckRhdGEocGFyYW1ldGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKHBhcmFtZXRlci52YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBwYXJhbWV0ZXIudmFsdWUgYXMgYW55OyAvLyBUZW1wb3Jhcnkgc29sdXRpb24uIFJlbW92ZSAnYW55JyBsYXRlci5cblxuICAgIGxldCBkYXRlO1xuICAgIGlmIChvcHRpb25zLnVzZVVUQykge1xuICAgICAgZGF0ZSA9IExvY2FsRGF0ZS5vZih2YWx1ZS5nZXRVVENGdWxsWWVhcigpLCB2YWx1ZS5nZXRVVENNb250aCgpICsgMSwgdmFsdWUuZ2V0VVRDRGF0ZSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0ZSA9IExvY2FsRGF0ZS5vZih2YWx1ZS5nZXRGdWxsWWVhcigpLCB2YWx1ZS5nZXRNb250aCgpICsgMSwgdmFsdWUuZ2V0RGF0ZSgpKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXlzID0gRVBPQ0hfREFURS51bnRpbChkYXRlLCBDaHJvbm9Vbml0LkRBWVMpO1xuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygzKTtcbiAgICBidWZmZXIud3JpdGVVSW50TEUoZGF5cywgMCwgMyk7XG4gICAgeWllbGQgYnVmZmVyO1xuICB9LFxuXG4gIC8vIFRPRE86IHZhbHVlIGlzIHRlY2hpbmNhbGx5IG9mIHR5cGUgJ3Vua25vd24nLlxuICB2YWxpZGF0ZTogZnVuY3Rpb24odmFsdWUpOiBudWxsIHwgRGF0ZSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsRGF0ZSkpIHtcbiAgICAgIHZhbHVlID0gbmV3IGdsb2JhbERhdGUoZ2xvYmFsRGF0ZS5wYXJzZSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgZGF0ZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IERhdGU7XG5tb2R1bGUuZXhwb3J0cyA9IERhdGU7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7QUFFQTtBQUNBLE1BQU1BLFVBQVUsR0FBR0MsTUFBTSxDQUFDQyxJQUExQjs7QUFDQSxNQUFNQyxVQUFVLEdBQUdDLGdCQUFVQyxTQUFWLENBQW9CLENBQXBCLEVBQXVCLENBQXZCLENBQW5COztBQUNBLE1BQU1DLFdBQVcsR0FBR0MsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxJQUFELENBQVosQ0FBcEI7QUFDQSxNQUFNQyxXQUFXLEdBQUdGLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxDQUFaLENBQXBCO0FBRUEsTUFBTU4sSUFBYyxHQUFHO0VBQ3JCUSxFQUFFLEVBQUUsSUFEaUI7RUFFckJDLElBQUksRUFBRSxPQUZlO0VBR3JCQyxJQUFJLEVBQUUsTUFIZTtFQUtyQkMsV0FBVyxFQUFFLFlBQVc7SUFDdEIsT0FBTyxNQUFQO0VBQ0QsQ0FQb0I7RUFTckJDLGdCQUFnQixFQUFFLFlBQVc7SUFDM0IsT0FBT1AsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxLQUFLRSxFQUFOLENBQVosQ0FBUDtFQUNELENBWG9COztFQWFyQkssdUJBQXVCLENBQUNDLFNBQUQsRUFBWUMsT0FBWixFQUFxQjtJQUMxQyxJQUFJRCxTQUFTLENBQUNFLEtBQVYsSUFBbUIsSUFBdkIsRUFBNkI7TUFDM0IsT0FBT1osV0FBUDtJQUNEOztJQUVELE9BQU9HLFdBQVA7RUFDRCxDQW5Cb0I7O0VBcUJyQixDQUFFVSxxQkFBRixDQUF3QkgsU0FBeEIsRUFBbUNDLE9BQW5DLEVBQTRDO0lBQzFDLElBQUlELFNBQVMsQ0FBQ0UsS0FBVixJQUFtQixJQUF2QixFQUE2QjtNQUMzQjtJQUNEOztJQUVELE1BQU1BLEtBQUssR0FBR0YsU0FBUyxDQUFDRSxLQUF4QixDQUwwQyxDQUtKOztJQUV0QyxJQUFJRSxJQUFKOztJQUNBLElBQUlILE9BQU8sQ0FBQ0ksTUFBWixFQUFvQjtNQUNsQkQsSUFBSSxHQUFHaEIsZ0JBQVVrQixFQUFWLENBQWFKLEtBQUssQ0FBQ0ssY0FBTixFQUFiLEVBQXFDTCxLQUFLLENBQUNNLFdBQU4sS0FBc0IsQ0FBM0QsRUFBOEROLEtBQUssQ0FBQ08sVUFBTixFQUE5RCxDQUFQO0lBQ0QsQ0FGRCxNQUVPO01BQ0xMLElBQUksR0FBR2hCLGdCQUFVa0IsRUFBVixDQUFhSixLQUFLLENBQUNRLFdBQU4sRUFBYixFQUFrQ1IsS0FBSyxDQUFDUyxRQUFOLEtBQW1CLENBQXJELEVBQXdEVCxLQUFLLENBQUNVLE9BQU4sRUFBeEQsQ0FBUDtJQUNEOztJQUVELE1BQU1DLElBQUksR0FBRzFCLFVBQVUsQ0FBQzJCLEtBQVgsQ0FBaUJWLElBQWpCLEVBQXVCVyxpQkFBV0MsSUFBbEMsQ0FBYjtJQUNBLE1BQU1DLE1BQU0sR0FBRzFCLE1BQU0sQ0FBQzJCLEtBQVAsQ0FBYSxDQUFiLENBQWY7SUFDQUQsTUFBTSxDQUFDRSxXQUFQLENBQW1CTixJQUFuQixFQUF5QixDQUF6QixFQUE0QixDQUE1QjtJQUNBLE1BQU1JLE1BQU47RUFDRCxDQXZDb0I7O0VBeUNyQjtFQUNBRyxRQUFRLEVBQUUsVUFBU2xCLEtBQVQsRUFBNkI7SUFDckMsSUFBSUEsS0FBSyxJQUFJLElBQWIsRUFBbUI7TUFDakIsT0FBTyxJQUFQO0lBQ0Q7O0lBRUQsSUFBSSxFQUFFQSxLQUFLLFlBQVlsQixVQUFuQixDQUFKLEVBQW9DO01BQ2xDa0IsS0FBSyxHQUFHLElBQUlsQixVQUFKLENBQWVBLFVBQVUsQ0FBQ3FDLEtBQVgsQ0FBaUJuQixLQUFqQixDQUFmLENBQVI7SUFDRDs7SUFFRCxJQUFJb0IsS0FBSyxDQUFDcEIsS0FBRCxDQUFULEVBQWtCO01BQ2hCLE1BQU0sSUFBSXFCLFNBQUosQ0FBYyxlQUFkLENBQU47SUFDRDs7SUFFRCxPQUFPckIsS0FBUDtFQUNEO0FBeERvQixDQUF2QjtlQTJEZWhCLEk7O0FBQ2ZzQyxNQUFNLENBQUNDLE9BQVAsR0FBaUJ2QyxJQUFqQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _datetimen = _interopRequireDefault(require("./datetimen"));

var _core = require("@js-joda/core");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const EPOCH_DATE = _core.LocalDate.ofYearDay(1900, 1);

const NULL_LENGTH = Buffer.from([0x00]);
const DATA_LENGTH = Buffer.from([0x08]);
const DateTime = {
  id: 0x3D,
  type: 'DATETIME',
  name: 'DateTime',
  declaration: function () {
    return 'datetime';
  },

  generateTypeInfo() {
    return Buffer.from([_datetimen.default.id, 0x08]);
  },

  generateParameterLength(parameter, options) {
    if (parameter.value == null) {
      return NULL_LENGTH;
    }

    return DATA_LENGTH;
  },

  generateParameterData: function* (parameter, options) {
    if (parameter.value == null) {
      return;
    }

    const value = parameter.value; // Temporary solution. Remove 'any' later.

    let date;

    if (options.useUTC) {
      date = _core.LocalDate.of(value.getUTCFullYear(), value.getUTCMonth() + 1, value.getUTCDate());
    } else {
      date = _core.LocalDate.of(value.getFullYear(), value.getMonth() + 1, value.getDate());
    }

    let days = EPOCH_DATE.until(date, _core.ChronoUnit.DAYS);
    let milliseconds, threeHundredthsOfSecond;

    if (options.useUTC) {
      let seconds = value.getUTCHours() * 60 * 60;
      seconds += value.getUTCMinutes() * 60;
      seconds += value.getUTCSeconds();
      milliseconds = seconds * 1000 + value.getUTCMilliseconds();
    } else {
      let seconds = value.getHours() * 60 * 60;
      seconds += value.getMinutes() * 60;
      seconds += value.getSeconds();
      milliseconds = seconds * 1000 + value.getMilliseconds();
    }

    threeHundredthsOfSecond = milliseconds / (3 + 1 / 3);
    threeHundredthsOfSecond = Math.round(threeHundredthsOfSecond); // 25920000 equals one day

    if (threeHundredthsOfSecond === 25920000) {
      days += 1;
      threeHundredthsOfSecond = 0;
    }

    const buffer = Buffer.alloc(8);
    buffer.writeInt32LE(days, 0);
    buffer.writeUInt32LE(threeHundredthsOfSecond, 4);
    yield buffer;
  },
  // TODO: type 'any' needs to be revisited.
  validate: function (value) {
    if (value == null) {
      return null;
    }

    if (!(value instanceof Date)) {
      value = new Date(Date.parse(value));
    }

    if (isNaN(value)) {
      throw new TypeError('Invalid date.');
    }

    return value;
  }
};
var _default = DateTime;
exports.default = _default;
module.exports = DateTime;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFUE9DSF9EQVRFIiwiTG9jYWxEYXRlIiwib2ZZZWFyRGF5IiwiTlVMTF9MRU5HVEgiLCJCdWZmZXIiLCJmcm9tIiwiREFUQV9MRU5HVEgiLCJEYXRlVGltZSIsImlkIiwidHlwZSIsIm5hbWUiLCJkZWNsYXJhdGlvbiIsImdlbmVyYXRlVHlwZUluZm8iLCJEYXRlVGltZU4iLCJnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aCIsInBhcmFtZXRlciIsIm9wdGlvbnMiLCJ2YWx1ZSIsImdlbmVyYXRlUGFyYW1ldGVyRGF0YSIsImRhdGUiLCJ1c2VVVEMiLCJvZiIsImdldFVUQ0Z1bGxZZWFyIiwiZ2V0VVRDTW9udGgiLCJnZXRVVENEYXRlIiwiZ2V0RnVsbFllYXIiLCJnZXRNb250aCIsImdldERhdGUiLCJkYXlzIiwidW50aWwiLCJDaHJvbm9Vbml0IiwiREFZUyIsIm1pbGxpc2Vjb25kcyIsInRocmVlSHVuZHJlZHRoc09mU2Vjb25kIiwic2Vjb25kcyIsImdldFVUQ0hvdXJzIiwiZ2V0VVRDTWludXRlcyIsImdldFVUQ1NlY29uZHMiLCJnZXRVVENNaWxsaXNlY29uZHMiLCJnZXRIb3VycyIsImdldE1pbnV0ZXMiLCJnZXRTZWNvbmRzIiwiZ2V0TWlsbGlzZWNvbmRzIiwiTWF0aCIsInJvdW5kIiwiYnVmZmVyIiwiYWxsb2MiLCJ3cml0ZUludDMyTEUiLCJ3cml0ZVVJbnQzMkxFIiwidmFsaWRhdGUiLCJEYXRlIiwicGFyc2UiLCJpc05hTiIsIlR5cGVFcnJvciIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YS10eXBlcy9kYXRldGltZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4uL2RhdGEtdHlwZSc7XG5pbXBvcnQgRGF0ZVRpbWVOIGZyb20gJy4vZGF0ZXRpbWVuJztcbmltcG9ydCB7IENocm9ub1VuaXQsIExvY2FsRGF0ZSB9IGZyb20gJ0Bqcy1qb2RhL2NvcmUnO1xuXG5jb25zdCBFUE9DSF9EQVRFID0gTG9jYWxEYXRlLm9mWWVhckRheSgxOTAwLCAxKTtcbmNvbnN0IE5VTExfTEVOR1RIID0gQnVmZmVyLmZyb20oWzB4MDBdKTtcbmNvbnN0IERBVEFfTEVOR1RIID0gQnVmZmVyLmZyb20oWzB4MDhdKTtcblxuY29uc3QgRGF0ZVRpbWU6IERhdGFUeXBlID0ge1xuICBpZDogMHgzRCxcbiAgdHlwZTogJ0RBVEVUSU1FJyxcbiAgbmFtZTogJ0RhdGVUaW1lJyxcblxuICBkZWNsYXJhdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICdkYXRldGltZSc7XG4gIH0sXG5cbiAgZ2VuZXJhdGVUeXBlSW5mbygpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oW0RhdGVUaW1lTi5pZCwgMHgwOF0pO1xuICB9LFxuXG4gIGdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoKHBhcmFtZXRlciwgb3B0aW9ucykge1xuICAgIGlmIChwYXJhbWV0ZXIudmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIE5VTExfTEVOR1RIO1xuICAgIH1cblxuICAgIHJldHVybiBEQVRBX0xFTkdUSDtcbiAgfSxcblxuICBnZW5lcmF0ZVBhcmFtZXRlckRhdGE6IGZ1bmN0aW9uKihwYXJhbWV0ZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAocGFyYW1ldGVyLnZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHBhcmFtZXRlci52YWx1ZSBhcyBhbnk7IC8vIFRlbXBvcmFyeSBzb2x1dGlvbi4gUmVtb3ZlICdhbnknIGxhdGVyLlxuXG4gICAgbGV0IGRhdGU7XG4gICAgaWYgKG9wdGlvbnMudXNlVVRDKSB7XG4gICAgICBkYXRlID0gTG9jYWxEYXRlLm9mKHZhbHVlLmdldFVUQ0Z1bGxZZWFyKCksIHZhbHVlLmdldFVUQ01vbnRoKCkgKyAxLCB2YWx1ZS5nZXRVVENEYXRlKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRlID0gTG9jYWxEYXRlLm9mKHZhbHVlLmdldEZ1bGxZZWFyKCksIHZhbHVlLmdldE1vbnRoKCkgKyAxLCB2YWx1ZS5nZXREYXRlKCkpO1xuICAgIH1cblxuICAgIGxldCBkYXlzID0gRVBPQ0hfREFURS51bnRpbChkYXRlLCBDaHJvbm9Vbml0LkRBWVMpO1xuXG4gICAgbGV0IG1pbGxpc2Vjb25kcywgdGhyZWVIdW5kcmVkdGhzT2ZTZWNvbmQ7XG4gICAgaWYgKG9wdGlvbnMudXNlVVRDKSB7XG4gICAgICBsZXQgc2Vjb25kcyA9IHZhbHVlLmdldFVUQ0hvdXJzKCkgKiA2MCAqIDYwO1xuICAgICAgc2Vjb25kcyArPSB2YWx1ZS5nZXRVVENNaW51dGVzKCkgKiA2MDtcbiAgICAgIHNlY29uZHMgKz0gdmFsdWUuZ2V0VVRDU2Vjb25kcygpO1xuICAgICAgbWlsbGlzZWNvbmRzID0gKHNlY29uZHMgKiAxMDAwKSArIHZhbHVlLmdldFVUQ01pbGxpc2Vjb25kcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgc2Vjb25kcyA9IHZhbHVlLmdldEhvdXJzKCkgKiA2MCAqIDYwO1xuICAgICAgc2Vjb25kcyArPSB2YWx1ZS5nZXRNaW51dGVzKCkgKiA2MDtcbiAgICAgIHNlY29uZHMgKz0gdmFsdWUuZ2V0U2Vjb25kcygpO1xuICAgICAgbWlsbGlzZWNvbmRzID0gKHNlY29uZHMgKiAxMDAwKSArIHZhbHVlLmdldE1pbGxpc2Vjb25kcygpO1xuICAgIH1cblxuICAgIHRocmVlSHVuZHJlZHRoc09mU2Vjb25kID0gbWlsbGlzZWNvbmRzIC8gKDMgKyAoMSAvIDMpKTtcbiAgICB0aHJlZUh1bmRyZWR0aHNPZlNlY29uZCA9IE1hdGgucm91bmQodGhyZWVIdW5kcmVkdGhzT2ZTZWNvbmQpO1xuXG4gICAgLy8gMjU5MjAwMDAgZXF1YWxzIG9uZSBkYXlcbiAgICBpZiAodGhyZWVIdW5kcmVkdGhzT2ZTZWNvbmQgPT09IDI1OTIwMDAwKSB7XG4gICAgICBkYXlzICs9IDE7XG4gICAgICB0aHJlZUh1bmRyZWR0aHNPZlNlY29uZCA9IDA7XG4gICAgfVxuXG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jKDgpO1xuICAgIGJ1ZmZlci53cml0ZUludDMyTEUoZGF5cywgMCk7XG4gICAgYnVmZmVyLndyaXRlVUludDMyTEUodGhyZWVIdW5kcmVkdGhzT2ZTZWNvbmQsIDQpO1xuICAgIHlpZWxkIGJ1ZmZlcjtcbiAgfSxcblxuICAvLyBUT0RPOiB0eXBlICdhbnknIG5lZWRzIHRvIGJlIHJldmlzaXRlZC5cbiAgdmFsaWRhdGU6IGZ1bmN0aW9uKHZhbHVlKTogbnVsbCB8IG51bWJlciB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgIHZhbHVlID0gbmV3IERhdGUoRGF0ZS5wYXJzZSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgZGF0ZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IERhdGVUaW1lO1xubW9kdWxlLmV4cG9ydHMgPSBEYXRlVGltZTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUNBOztBQUNBOzs7O0FBRUEsTUFBTUEsVUFBVSxHQUFHQyxnQkFBVUMsU0FBVixDQUFvQixJQUFwQixFQUEwQixDQUExQixDQUFuQjs7QUFDQSxNQUFNQyxXQUFXLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxDQUFaLENBQXBCO0FBQ0EsTUFBTUMsV0FBVyxHQUFHRixNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDLElBQUQsQ0FBWixDQUFwQjtBQUVBLE1BQU1FLFFBQWtCLEdBQUc7RUFDekJDLEVBQUUsRUFBRSxJQURxQjtFQUV6QkMsSUFBSSxFQUFFLFVBRm1CO0VBR3pCQyxJQUFJLEVBQUUsVUFIbUI7RUFLekJDLFdBQVcsRUFBRSxZQUFXO0lBQ3RCLE9BQU8sVUFBUDtFQUNELENBUHdCOztFQVN6QkMsZ0JBQWdCLEdBQUc7SUFDakIsT0FBT1IsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQ1EsbUJBQVVMLEVBQVgsRUFBZSxJQUFmLENBQVosQ0FBUDtFQUNELENBWHdCOztFQWF6Qk0sdUJBQXVCLENBQUNDLFNBQUQsRUFBWUMsT0FBWixFQUFxQjtJQUMxQyxJQUFJRCxTQUFTLENBQUNFLEtBQVYsSUFBbUIsSUFBdkIsRUFBNkI7TUFDM0IsT0FBT2QsV0FBUDtJQUNEOztJQUVELE9BQU9HLFdBQVA7RUFDRCxDQW5Cd0I7O0VBcUJ6QlkscUJBQXFCLEVBQUUsV0FBVUgsU0FBVixFQUFxQkMsT0FBckIsRUFBOEI7SUFDbkQsSUFBSUQsU0FBUyxDQUFDRSxLQUFWLElBQW1CLElBQXZCLEVBQTZCO01BQzNCO0lBQ0Q7O0lBRUQsTUFBTUEsS0FBSyxHQUFHRixTQUFTLENBQUNFLEtBQXhCLENBTG1ELENBS2I7O0lBRXRDLElBQUlFLElBQUo7O0lBQ0EsSUFBSUgsT0FBTyxDQUFDSSxNQUFaLEVBQW9CO01BQ2xCRCxJQUFJLEdBQUdsQixnQkFBVW9CLEVBQVYsQ0FBYUosS0FBSyxDQUFDSyxjQUFOLEVBQWIsRUFBcUNMLEtBQUssQ0FBQ00sV0FBTixLQUFzQixDQUEzRCxFQUE4RE4sS0FBSyxDQUFDTyxVQUFOLEVBQTlELENBQVA7SUFDRCxDQUZELE1BRU87TUFDTEwsSUFBSSxHQUFHbEIsZ0JBQVVvQixFQUFWLENBQWFKLEtBQUssQ0FBQ1EsV0FBTixFQUFiLEVBQWtDUixLQUFLLENBQUNTLFFBQU4sS0FBbUIsQ0FBckQsRUFBd0RULEtBQUssQ0FBQ1UsT0FBTixFQUF4RCxDQUFQO0lBQ0Q7O0lBRUQsSUFBSUMsSUFBSSxHQUFHNUIsVUFBVSxDQUFDNkIsS0FBWCxDQUFpQlYsSUFBakIsRUFBdUJXLGlCQUFXQyxJQUFsQyxDQUFYO0lBRUEsSUFBSUMsWUFBSixFQUFrQkMsdUJBQWxCOztJQUNBLElBQUlqQixPQUFPLENBQUNJLE1BQVosRUFBb0I7TUFDbEIsSUFBSWMsT0FBTyxHQUFHakIsS0FBSyxDQUFDa0IsV0FBTixLQUFzQixFQUF0QixHQUEyQixFQUF6QztNQUNBRCxPQUFPLElBQUlqQixLQUFLLENBQUNtQixhQUFOLEtBQXdCLEVBQW5DO01BQ0FGLE9BQU8sSUFBSWpCLEtBQUssQ0FBQ29CLGFBQU4sRUFBWDtNQUNBTCxZQUFZLEdBQUlFLE9BQU8sR0FBRyxJQUFYLEdBQW1CakIsS0FBSyxDQUFDcUIsa0JBQU4sRUFBbEM7SUFDRCxDQUxELE1BS087TUFDTCxJQUFJSixPQUFPLEdBQUdqQixLQUFLLENBQUNzQixRQUFOLEtBQW1CLEVBQW5CLEdBQXdCLEVBQXRDO01BQ0FMLE9BQU8sSUFBSWpCLEtBQUssQ0FBQ3VCLFVBQU4sS0FBcUIsRUFBaEM7TUFDQU4sT0FBTyxJQUFJakIsS0FBSyxDQUFDd0IsVUFBTixFQUFYO01BQ0FULFlBQVksR0FBSUUsT0FBTyxHQUFHLElBQVgsR0FBbUJqQixLQUFLLENBQUN5QixlQUFOLEVBQWxDO0lBQ0Q7O0lBRURULHVCQUF1QixHQUFHRCxZQUFZLElBQUksSUFBSyxJQUFJLENBQWIsQ0FBdEM7SUFDQUMsdUJBQXVCLEdBQUdVLElBQUksQ0FBQ0MsS0FBTCxDQUFXWCx1QkFBWCxDQUExQixDQTlCbUQsQ0FnQ25EOztJQUNBLElBQUlBLHVCQUF1QixLQUFLLFFBQWhDLEVBQTBDO01BQ3hDTCxJQUFJLElBQUksQ0FBUjtNQUNBSyx1QkFBdUIsR0FBRyxDQUExQjtJQUNEOztJQUVELE1BQU1ZLE1BQU0sR0FBR3pDLE1BQU0sQ0FBQzBDLEtBQVAsQ0FBYSxDQUFiLENBQWY7SUFDQUQsTUFBTSxDQUFDRSxZQUFQLENBQW9CbkIsSUFBcEIsRUFBMEIsQ0FBMUI7SUFDQWlCLE1BQU0sQ0FBQ0csYUFBUCxDQUFxQmYsdUJBQXJCLEVBQThDLENBQTlDO0lBQ0EsTUFBTVksTUFBTjtFQUNELENBL0R3QjtFQWlFekI7RUFDQUksUUFBUSxFQUFFLFVBQVNoQyxLQUFULEVBQStCO0lBQ3ZDLElBQUlBLEtBQUssSUFBSSxJQUFiLEVBQW1CO01BQ2pCLE9BQU8sSUFBUDtJQUNEOztJQUVELElBQUksRUFBRUEsS0FBSyxZQUFZaUMsSUFBbkIsQ0FBSixFQUE4QjtNQUM1QmpDLEtBQUssR0FBRyxJQUFJaUMsSUFBSixDQUFTQSxJQUFJLENBQUNDLEtBQUwsQ0FBV2xDLEtBQVgsQ0FBVCxDQUFSO0lBQ0Q7O0lBRUQsSUFBSW1DLEtBQUssQ0FBQ25DLEtBQUQsQ0FBVCxFQUFrQjtNQUNoQixNQUFNLElBQUlvQyxTQUFKLENBQWMsZUFBZCxDQUFOO0lBQ0Q7O0lBRUQsT0FBT3BDLEtBQVA7RUFDRDtBQWhGd0IsQ0FBM0I7ZUFtRmVWLFE7O0FBQ2YrQyxNQUFNLENBQUNDLE9BQVAsR0FBaUJoRCxRQUFqQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _core = require("@js-joda/core");

var _writableTrackingBuffer = _interopRequireDefault(require("../tracking-buffer/writable-tracking-buffer"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const EPOCH_DATE = _core.LocalDate.ofYearDay(1, 1);

const NULL_LENGTH = Buffer.from([0x00]);
const DateTime2 = {
  id: 0x2A,
  type: 'DATETIME2N',
  name: 'DateTime2',
  declaration: function (parameter) {
    return 'datetime2(' + this.resolveScale(parameter) + ')';
  },
  resolveScale: function (parameter) {
    if (parameter.scale != null) {
      return parameter.scale;
    } else if (parameter.value === null) {
      return 0;
    } else {
      return 7;
    }
  },

  generateTypeInfo(parameter, _options) {
    return Buffer.from([this.id, parameter.scale]);
  },

  generateParameterLength(parameter, options) {
    if (parameter.value == null) {
      return NULL_LENGTH;
    }

    switch (parameter.scale) {
      case 0:
      case 1:
      case 2:
        return Buffer.from([0x06]);

      case 3:
      case 4:
        return Buffer.from([0x07]);

      case 5:
      case 6:
      case 7:
        return Buffer.from([0x08]);

      default:
        throw new Error('invalid scale');
    }
  },

  *generateParameterData(parameter, options) {
    if (parameter.value == null) {
      return;
    }

    const value = parameter.value;
    let scale = parameter.scale;
    const buffer = new _writableTrackingBuffer.default(16);
    scale = scale;
    let timestamp;

    if (options.useUTC) {
      timestamp = ((value.getUTCHours() * 60 + value.getUTCMinutes()) * 60 + value.getUTCSeconds()) * 1000 + value.getUTCMilliseconds();
    } else {
      timestamp = ((value.getHours() * 60 + value.getMinutes()) * 60 + value.getSeconds()) * 1000 + value.getMilliseconds();
    }

    timestamp = timestamp * Math.pow(10, scale - 3);
    timestamp += (value.nanosecondDelta != null ? value.nanosecondDelta : 0) * Math.pow(10, scale);
    timestamp = Math.round(timestamp);

    switch (scale) {
      case 0:
      case 1:
      case 2:
        buffer.writeUInt24LE(timestamp);
        break;

      case 3:
      case 4:
        buffer.writeUInt32LE(timestamp);
        break;

      case 5:
      case 6:
      case 7:
        buffer.writeUInt40LE(timestamp);
    }

    let date;

    if (options.useUTC) {
      date = _core.LocalDate.of(value.getUTCFullYear(), value.getUTCMonth() + 1, value.getUTCDate());
    } else {
      date = _core.LocalDate.of(value.getFullYear(), value.getMonth() + 1, value.getDate());
    }

    const days = EPOCH_DATE.until(date, _core.ChronoUnit.DAYS);
    buffer.writeUInt24LE(days);
    yield buffer.data;
  },

  validate: function (value) {
    if (value == null) {
      return null;
    }

    if (!(value instanceof Date)) {
      value = new Date(Date.parse(value));
    }

    if (isNaN(value)) {
      throw new TypeError('Invalid date.');
    }

    return value;
  }
};
var _default = DateTime2;
exports.default = _default;
module.exports = DateTime2;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFUE9DSF9EQVRFIiwiTG9jYWxEYXRlIiwib2ZZZWFyRGF5IiwiTlVMTF9MRU5HVEgiLCJCdWZmZXIiLCJmcm9tIiwiRGF0ZVRpbWUyIiwiaWQiLCJ0eXBlIiwibmFtZSIsImRlY2xhcmF0aW9uIiwicGFyYW1ldGVyIiwicmVzb2x2ZVNjYWxlIiwic2NhbGUiLCJ2YWx1ZSIsImdlbmVyYXRlVHlwZUluZm8iLCJfb3B0aW9ucyIsImdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoIiwib3B0aW9ucyIsIkVycm9yIiwiZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhIiwiYnVmZmVyIiwiV3JpdGFibGVUcmFja2luZ0J1ZmZlciIsInRpbWVzdGFtcCIsInVzZVVUQyIsImdldFVUQ0hvdXJzIiwiZ2V0VVRDTWludXRlcyIsImdldFVUQ1NlY29uZHMiLCJnZXRVVENNaWxsaXNlY29uZHMiLCJnZXRIb3VycyIsImdldE1pbnV0ZXMiLCJnZXRTZWNvbmRzIiwiZ2V0TWlsbGlzZWNvbmRzIiwiTWF0aCIsInBvdyIsIm5hbm9zZWNvbmREZWx0YSIsInJvdW5kIiwid3JpdGVVSW50MjRMRSIsIndyaXRlVUludDMyTEUiLCJ3cml0ZVVJbnQ0MExFIiwiZGF0ZSIsIm9mIiwiZ2V0VVRDRnVsbFllYXIiLCJnZXRVVENNb250aCIsImdldFVUQ0RhdGUiLCJnZXRGdWxsWWVhciIsImdldE1vbnRoIiwiZ2V0RGF0ZSIsImRheXMiLCJ1bnRpbCIsIkNocm9ub1VuaXQiLCJEQVlTIiwiZGF0YSIsInZhbGlkYXRlIiwiRGF0ZSIsInBhcnNlIiwiaXNOYU4iLCJUeXBlRXJyb3IiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGEtdHlwZXMvZGF0ZXRpbWUyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi4vZGF0YS10eXBlJztcbmltcG9ydCB7IENocm9ub1VuaXQsIExvY2FsRGF0ZSB9IGZyb20gJ0Bqcy1qb2RhL2NvcmUnO1xuaW1wb3J0IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIgZnJvbSAnLi4vdHJhY2tpbmctYnVmZmVyL3dyaXRhYmxlLXRyYWNraW5nLWJ1ZmZlcic7XG5cbmNvbnN0IEVQT0NIX0RBVEUgPSBMb2NhbERhdGUub2ZZZWFyRGF5KDEsIDEpO1xuY29uc3QgTlVMTF9MRU5HVEggPSBCdWZmZXIuZnJvbShbMHgwMF0pO1xuXG5jb25zdCBEYXRlVGltZTI6IERhdGFUeXBlICYgeyByZXNvbHZlU2NhbGU6IE5vbk51bGxhYmxlPERhdGFUeXBlWydyZXNvbHZlU2NhbGUnXT4gfSA9IHtcbiAgaWQ6IDB4MkEsXG4gIHR5cGU6ICdEQVRFVElNRTJOJyxcbiAgbmFtZTogJ0RhdGVUaW1lMicsXG5cbiAgZGVjbGFyYXRpb246IGZ1bmN0aW9uKHBhcmFtZXRlcikge1xuICAgIHJldHVybiAnZGF0ZXRpbWUyKCcgKyAodGhpcy5yZXNvbHZlU2NhbGUocGFyYW1ldGVyKSkgKyAnKSc7XG4gIH0sXG5cbiAgcmVzb2x2ZVNjYWxlOiBmdW5jdGlvbihwYXJhbWV0ZXIpIHtcbiAgICBpZiAocGFyYW1ldGVyLnNjYWxlICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBwYXJhbWV0ZXIuc2NhbGU7XG4gICAgfSBlbHNlIGlmIChwYXJhbWV0ZXIudmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gNztcbiAgICB9XG4gIH0sXG5cbiAgZ2VuZXJhdGVUeXBlSW5mbyhwYXJhbWV0ZXIsIF9vcHRpb25zKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKFt0aGlzLmlkLCBwYXJhbWV0ZXIuc2NhbGUhXSk7XG4gIH0sXG5cbiAgZ2VuZXJhdGVQYXJhbWV0ZXJMZW5ndGgocGFyYW1ldGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKHBhcmFtZXRlci52YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gTlVMTF9MRU5HVEg7XG4gICAgfVxuXG4gICAgc3dpdGNoIChwYXJhbWV0ZXIuc2NhbGUhKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICBjYXNlIDE6XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShbMHgwNl0pO1xuXG4gICAgICBjYXNlIDM6XG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShbMHgwN10pO1xuXG4gICAgICBjYXNlIDU6XG4gICAgICBjYXNlIDY6XG4gICAgICBjYXNlIDc6XG4gICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShbMHgwOF0pO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2NhbGUnKTtcbiAgICB9XG4gIH0sXG5cbiAgKmdlbmVyYXRlUGFyYW1ldGVyRGF0YShwYXJhbWV0ZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAocGFyYW1ldGVyLnZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHBhcmFtZXRlci52YWx1ZTtcbiAgICBsZXQgc2NhbGUgPSBwYXJhbWV0ZXIuc2NhbGU7XG5cbiAgICBjb25zdCBidWZmZXIgPSBuZXcgV3JpdGFibGVUcmFja2luZ0J1ZmZlcigxNik7XG4gICAgc2NhbGUgPSBzY2FsZSE7XG5cbiAgICBsZXQgdGltZXN0YW1wO1xuICAgIGlmIChvcHRpb25zLnVzZVVUQykge1xuICAgICAgdGltZXN0YW1wID0gKCh2YWx1ZS5nZXRVVENIb3VycygpICogNjAgKyB2YWx1ZS5nZXRVVENNaW51dGVzKCkpICogNjAgKyB2YWx1ZS5nZXRVVENTZWNvbmRzKCkpICogMTAwMCArIHZhbHVlLmdldFVUQ01pbGxpc2Vjb25kcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aW1lc3RhbXAgPSAoKHZhbHVlLmdldEhvdXJzKCkgKiA2MCArIHZhbHVlLmdldE1pbnV0ZXMoKSkgKiA2MCArIHZhbHVlLmdldFNlY29uZHMoKSkgKiAxMDAwICsgdmFsdWUuZ2V0TWlsbGlzZWNvbmRzKCk7XG4gICAgfVxuICAgIHRpbWVzdGFtcCA9IHRpbWVzdGFtcCAqIE1hdGgucG93KDEwLCBzY2FsZSAtIDMpO1xuICAgIHRpbWVzdGFtcCArPSAodmFsdWUubmFub3NlY29uZERlbHRhICE9IG51bGwgPyB2YWx1ZS5uYW5vc2Vjb25kRGVsdGEgOiAwKSAqIE1hdGgucG93KDEwLCBzY2FsZSk7XG4gICAgdGltZXN0YW1wID0gTWF0aC5yb3VuZCh0aW1lc3RhbXApO1xuXG4gICAgc3dpdGNoIChzY2FsZSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgY2FzZSAxOlxuICAgICAgY2FzZSAyOlxuICAgICAgICBidWZmZXIud3JpdGVVSW50MjRMRSh0aW1lc3RhbXApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgIGNhc2UgNDpcbiAgICAgICAgYnVmZmVyLndyaXRlVUludDMyTEUodGltZXN0YW1wKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDU6XG4gICAgICBjYXNlIDY6XG4gICAgICBjYXNlIDc6XG4gICAgICAgIGJ1ZmZlci53cml0ZVVJbnQ0MExFKHRpbWVzdGFtcCk7XG4gICAgfVxuXG4gICAgbGV0IGRhdGU7XG4gICAgaWYgKG9wdGlvbnMudXNlVVRDKSB7XG4gICAgICBkYXRlID0gTG9jYWxEYXRlLm9mKHZhbHVlLmdldFVUQ0Z1bGxZZWFyKCksIHZhbHVlLmdldFVUQ01vbnRoKCkgKyAxLCB2YWx1ZS5nZXRVVENEYXRlKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRlID0gTG9jYWxEYXRlLm9mKHZhbHVlLmdldEZ1bGxZZWFyKCksIHZhbHVlLmdldE1vbnRoKCkgKyAxLCB2YWx1ZS5nZXREYXRlKCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGRheXMgPSBFUE9DSF9EQVRFLnVudGlsKGRhdGUsIENocm9ub1VuaXQuREFZUyk7XG4gICAgYnVmZmVyLndyaXRlVUludDI0TEUoZGF5cyk7XG4gICAgeWllbGQgYnVmZmVyLmRhdGE7XG4gIH0sXG5cbiAgdmFsaWRhdGU6IGZ1bmN0aW9uKHZhbHVlKTogbnVsbCB8IG51bWJlciB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgIHZhbHVlID0gbmV3IERhdGUoRGF0ZS5wYXJzZSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgZGF0ZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IERhdGVUaW1lMjtcbm1vZHVsZS5leHBvcnRzID0gRGF0ZVRpbWUyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQ0E7O0FBQ0E7Ozs7QUFFQSxNQUFNQSxVQUFVLEdBQUdDLGdCQUFVQyxTQUFWLENBQW9CLENBQXBCLEVBQXVCLENBQXZCLENBQW5COztBQUNBLE1BQU1DLFdBQVcsR0FBR0MsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxJQUFELENBQVosQ0FBcEI7QUFFQSxNQUFNQyxTQUE2RSxHQUFHO0VBQ3BGQyxFQUFFLEVBQUUsSUFEZ0Y7RUFFcEZDLElBQUksRUFBRSxZQUY4RTtFQUdwRkMsSUFBSSxFQUFFLFdBSDhFO0VBS3BGQyxXQUFXLEVBQUUsVUFBU0MsU0FBVCxFQUFvQjtJQUMvQixPQUFPLGVBQWdCLEtBQUtDLFlBQUwsQ0FBa0JELFNBQWxCLENBQWhCLEdBQWdELEdBQXZEO0VBQ0QsQ0FQbUY7RUFTcEZDLFlBQVksRUFBRSxVQUFTRCxTQUFULEVBQW9CO0lBQ2hDLElBQUlBLFNBQVMsQ0FBQ0UsS0FBVixJQUFtQixJQUF2QixFQUE2QjtNQUMzQixPQUFPRixTQUFTLENBQUNFLEtBQWpCO0lBQ0QsQ0FGRCxNQUVPLElBQUlGLFNBQVMsQ0FBQ0csS0FBVixLQUFvQixJQUF4QixFQUE4QjtNQUNuQyxPQUFPLENBQVA7SUFDRCxDQUZNLE1BRUE7TUFDTCxPQUFPLENBQVA7SUFDRDtFQUNGLENBakJtRjs7RUFtQnBGQyxnQkFBZ0IsQ0FBQ0osU0FBRCxFQUFZSyxRQUFaLEVBQXNCO0lBQ3BDLE9BQU9aLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsS0FBS0UsRUFBTixFQUFVSSxTQUFTLENBQUNFLEtBQXBCLENBQVosQ0FBUDtFQUNELENBckJtRjs7RUF1QnBGSSx1QkFBdUIsQ0FBQ04sU0FBRCxFQUFZTyxPQUFaLEVBQXFCO0lBQzFDLElBQUlQLFNBQVMsQ0FBQ0csS0FBVixJQUFtQixJQUF2QixFQUE2QjtNQUMzQixPQUFPWCxXQUFQO0lBQ0Q7O0lBRUQsUUFBUVEsU0FBUyxDQUFDRSxLQUFsQjtNQUNFLEtBQUssQ0FBTDtNQUNBLEtBQUssQ0FBTDtNQUNBLEtBQUssQ0FBTDtRQUNFLE9BQU9ULE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxDQUFaLENBQVA7O01BRUYsS0FBSyxDQUFMO01BQ0EsS0FBSyxDQUFMO1FBQ0UsT0FBT0QsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxJQUFELENBQVosQ0FBUDs7TUFFRixLQUFLLENBQUw7TUFDQSxLQUFLLENBQUw7TUFDQSxLQUFLLENBQUw7UUFDRSxPQUFPRCxNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDLElBQUQsQ0FBWixDQUFQOztNQUVGO1FBQ0UsTUFBTSxJQUFJYyxLQUFKLENBQVUsZUFBVixDQUFOO0lBaEJKO0VBa0JELENBOUNtRjs7RUFnRHBGLENBQUNDLHFCQUFELENBQXVCVCxTQUF2QixFQUFrQ08sT0FBbEMsRUFBMkM7SUFDekMsSUFBSVAsU0FBUyxDQUFDRyxLQUFWLElBQW1CLElBQXZCLEVBQTZCO01BQzNCO0lBQ0Q7O0lBRUQsTUFBTUEsS0FBSyxHQUFHSCxTQUFTLENBQUNHLEtBQXhCO0lBQ0EsSUFBSUQsS0FBSyxHQUFHRixTQUFTLENBQUNFLEtBQXRCO0lBRUEsTUFBTVEsTUFBTSxHQUFHLElBQUlDLCtCQUFKLENBQTJCLEVBQTNCLENBQWY7SUFDQVQsS0FBSyxHQUFHQSxLQUFSO0lBRUEsSUFBSVUsU0FBSjs7SUFDQSxJQUFJTCxPQUFPLENBQUNNLE1BQVosRUFBb0I7TUFDbEJELFNBQVMsR0FBRyxDQUFDLENBQUNULEtBQUssQ0FBQ1csV0FBTixLQUFzQixFQUF0QixHQUEyQlgsS0FBSyxDQUFDWSxhQUFOLEVBQTVCLElBQXFELEVBQXJELEdBQTBEWixLQUFLLENBQUNhLGFBQU4sRUFBM0QsSUFBb0YsSUFBcEYsR0FBMkZiLEtBQUssQ0FBQ2Msa0JBQU4sRUFBdkc7SUFDRCxDQUZELE1BRU87TUFDTEwsU0FBUyxHQUFHLENBQUMsQ0FBQ1QsS0FBSyxDQUFDZSxRQUFOLEtBQW1CLEVBQW5CLEdBQXdCZixLQUFLLENBQUNnQixVQUFOLEVBQXpCLElBQStDLEVBQS9DLEdBQW9EaEIsS0FBSyxDQUFDaUIsVUFBTixFQUFyRCxJQUEyRSxJQUEzRSxHQUFrRmpCLEtBQUssQ0FBQ2tCLGVBQU4sRUFBOUY7SUFDRDs7SUFDRFQsU0FBUyxHQUFHQSxTQUFTLEdBQUdVLElBQUksQ0FBQ0MsR0FBTCxDQUFTLEVBQVQsRUFBYXJCLEtBQUssR0FBRyxDQUFyQixDQUF4QjtJQUNBVSxTQUFTLElBQUksQ0FBQ1QsS0FBSyxDQUFDcUIsZUFBTixJQUF5QixJQUF6QixHQUFnQ3JCLEtBQUssQ0FBQ3FCLGVBQXRDLEdBQXdELENBQXpELElBQThERixJQUFJLENBQUNDLEdBQUwsQ0FBUyxFQUFULEVBQWFyQixLQUFiLENBQTNFO0lBQ0FVLFNBQVMsR0FBR1UsSUFBSSxDQUFDRyxLQUFMLENBQVdiLFNBQVgsQ0FBWjs7SUFFQSxRQUFRVixLQUFSO01BQ0UsS0FBSyxDQUFMO01BQ0EsS0FBSyxDQUFMO01BQ0EsS0FBSyxDQUFMO1FBQ0VRLE1BQU0sQ0FBQ2dCLGFBQVAsQ0FBcUJkLFNBQXJCO1FBQ0E7O01BQ0YsS0FBSyxDQUFMO01BQ0EsS0FBSyxDQUFMO1FBQ0VGLE1BQU0sQ0FBQ2lCLGFBQVAsQ0FBcUJmLFNBQXJCO1FBQ0E7O01BQ0YsS0FBSyxDQUFMO01BQ0EsS0FBSyxDQUFMO01BQ0EsS0FBSyxDQUFMO1FBQ0VGLE1BQU0sQ0FBQ2tCLGFBQVAsQ0FBcUJoQixTQUFyQjtJQWJKOztJQWdCQSxJQUFJaUIsSUFBSjs7SUFDQSxJQUFJdEIsT0FBTyxDQUFDTSxNQUFaLEVBQW9CO01BQ2xCZ0IsSUFBSSxHQUFHdkMsZ0JBQVV3QyxFQUFWLENBQWEzQixLQUFLLENBQUM0QixjQUFOLEVBQWIsRUFBcUM1QixLQUFLLENBQUM2QixXQUFOLEtBQXNCLENBQTNELEVBQThEN0IsS0FBSyxDQUFDOEIsVUFBTixFQUE5RCxDQUFQO0lBQ0QsQ0FGRCxNQUVPO01BQ0xKLElBQUksR0FBR3ZDLGdCQUFVd0MsRUFBVixDQUFhM0IsS0FBSyxDQUFDK0IsV0FBTixFQUFiLEVBQWtDL0IsS0FBSyxDQUFDZ0MsUUFBTixLQUFtQixDQUFyRCxFQUF3RGhDLEtBQUssQ0FBQ2lDLE9BQU4sRUFBeEQsQ0FBUDtJQUNEOztJQUVELE1BQU1DLElBQUksR0FBR2hELFVBQVUsQ0FBQ2lELEtBQVgsQ0FBaUJULElBQWpCLEVBQXVCVSxpQkFBV0MsSUFBbEMsQ0FBYjtJQUNBOUIsTUFBTSxDQUFDZ0IsYUFBUCxDQUFxQlcsSUFBckI7SUFDQSxNQUFNM0IsTUFBTSxDQUFDK0IsSUFBYjtFQUNELENBL0ZtRjs7RUFpR3BGQyxRQUFRLEVBQUUsVUFBU3ZDLEtBQVQsRUFBK0I7SUFDdkMsSUFBSUEsS0FBSyxJQUFJLElBQWIsRUFBbUI7TUFDakIsT0FBTyxJQUFQO0lBQ0Q7O0lBRUQsSUFBSSxFQUFFQSxLQUFLLFlBQVl3QyxJQUFuQixDQUFKLEVBQThCO01BQzVCeEMsS0FBSyxHQUFHLElBQUl3QyxJQUFKLENBQVNBLElBQUksQ0FBQ0MsS0FBTCxDQUFXekMsS0FBWCxDQUFULENBQVI7SUFDRDs7SUFFRCxJQUFJMEMsS0FBSyxDQUFDMUMsS0FBRCxDQUFULEVBQWtCO01BQ2hCLE1BQU0sSUFBSTJDLFNBQUosQ0FBYyxlQUFkLENBQU47SUFDRDs7SUFFRCxPQUFPM0MsS0FBUDtFQUNEO0FBL0dtRixDQUF0RjtlQWtIZVIsUzs7QUFDZm9ELE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQnJELFNBQWpCIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
const DateTimeN = {
  id: 0x6F,
  type: 'DATETIMN',
  name: 'DateTimeN',

  declaration() {
    throw new Error('not implemented');
  },

  generateTypeInfo() {
    throw new Error('not implemented');
  },

  generateParameterLength() {
    throw new Error('not implemented');
  },

  generateParameterData() {
    throw new Error('not implemented');
  },

  validate() {
    throw new Error('not implemented');
  }

};
var _default = DateTimeN;
exports.default = _default;
module.exports = DateTimeN;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJEYXRlVGltZU4iLCJpZCIsInR5cGUiLCJuYW1lIiwiZGVjbGFyYXRpb24iLCJFcnJvciIsImdlbmVyYXRlVHlwZUluZm8iLCJnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aCIsImdlbmVyYXRlUGFyYW1ldGVyRGF0YSIsInZhbGlkYXRlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhLXR5cGVzL2RhdGV0aW1lbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4uL2RhdGEtdHlwZSc7XG5cbmNvbnN0IERhdGVUaW1lTjogRGF0YVR5cGUgPSB7XG4gIGlkOiAweDZGLFxuICB0eXBlOiAnREFURVRJTU4nLFxuICBuYW1lOiAnRGF0ZVRpbWVOJyxcblxuICBkZWNsYXJhdGlvbigpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICB9LFxuXG4gIGdlbmVyYXRlVHlwZUluZm8oKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgfSxcblxuICBnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICB9LFxuXG4gIGdlbmVyYXRlUGFyYW1ldGVyRGF0YSgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICB9LFxuXG4gIHZhbGlkYXRlKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IERhdGVUaW1lTjtcbm1vZHVsZS5leHBvcnRzID0gRGF0ZVRpbWVOO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQSxNQUFNQSxTQUFtQixHQUFHO0VBQzFCQyxFQUFFLEVBQUUsSUFEc0I7RUFFMUJDLElBQUksRUFBRSxVQUZvQjtFQUcxQkMsSUFBSSxFQUFFLFdBSG9COztFQUsxQkMsV0FBVyxHQUFHO0lBQ1osTUFBTSxJQUFJQyxLQUFKLENBQVUsaUJBQVYsQ0FBTjtFQUNELENBUHlCOztFQVMxQkMsZ0JBQWdCLEdBQUc7SUFDakIsTUFBTSxJQUFJRCxLQUFKLENBQVUsaUJBQVYsQ0FBTjtFQUNELENBWHlCOztFQWExQkUsdUJBQXVCLEdBQUc7SUFDeEIsTUFBTSxJQUFJRixLQUFKLENBQVUsaUJBQVYsQ0FBTjtFQUNELENBZnlCOztFQWlCMUJHLHFCQUFxQixHQUFHO0lBQ3RCLE1BQU0sSUFBSUgsS0FBSixDQUFVLGlCQUFWLENBQU47RUFDRCxDQW5CeUI7O0VBcUIxQkksUUFBUSxHQUFHO0lBQ1QsTUFBTSxJQUFJSixLQUFKLENBQVUsaUJBQVYsQ0FBTjtFQUNEOztBQXZCeUIsQ0FBNUI7ZUEwQmVMLFM7O0FBQ2ZVLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQlgsU0FBakIifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _core = require("@js-joda/core");

var _writableTrackingBuffer = _interopRequireDefault(require("../tracking-buffer/writable-tracking-buffer"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const EPOCH_DATE = _core.LocalDate.ofYearDay(1, 1);

const NULL_LENGTH = Buffer.from([0x00]);
const DateTimeOffset = {
  id: 0x2B,
  type: 'DATETIMEOFFSETN',
  name: 'DateTimeOffset',
  declaration: function (parameter) {
    return 'datetimeoffset(' + this.resolveScale(parameter) + ')';
  },
  resolveScale: function (parameter) {
    if (parameter.scale != null) {
      return parameter.scale;
    } else if (parameter.value === null) {
      return 0;
    } else {
      return 7;
    }
  },

  generateTypeInfo(parameter) {
    return Buffer.from([this.id, parameter.scale]);
  },

  generateParameterLength(parameter, options) {
    if (parameter.value == null) {
      return NULL_LENGTH;
    }

    switch (parameter.scale) {
      case 0:
      case 1:
      case 2:
        return Buffer.from([0x08]);

      case 3:
      case 4:
        return Buffer.from([0x09]);

      case 5:
      case 6:
      case 7:
        return Buffer.from([0x0A]);

      default:
        throw new Error('invalid scale');
    }
  },

  *generateParameterData(parameter, options) {
    if (parameter.value == null) {
      return;
    }

    const value = parameter.value;
    let scale = parameter.scale;
    const buffer = new _writableTrackingBuffer.default(16);
    scale = scale;
    let timestamp;
    timestamp = ((value.getUTCHours() * 60 + value.getUTCMinutes()) * 60 + value.getUTCSeconds()) * 1000 + value.getMilliseconds();
    timestamp = timestamp * Math.pow(10, scale - 3);
    timestamp += (value.nanosecondDelta != null ? value.nanosecondDelta : 0) * Math.pow(10, scale);
    timestamp = Math.round(timestamp);

    switch (scale) {
      case 0:
      case 1:
      case 2:
        buffer.writeUInt24LE(timestamp);
        break;

      case 3:
      case 4:
        buffer.writeUInt32LE(timestamp);
        break;

      case 5:
      case 6:
      case 7:
        buffer.writeUInt40LE(timestamp);
    }

    const date = _core.LocalDate.of(value.getUTCFullYear(), value.getUTCMonth() + 1, value.getUTCDate());

    const days = EPOCH_DATE.until(date, _core.ChronoUnit.DAYS);
    buffer.writeUInt24LE(days);
    const offset = -value.getTimezoneOffset();
    buffer.writeInt16LE(offset);
    yield buffer.data;
  },

  validate: function (value) {
    if (value == null) {
      return null;
    }

    if (!(value instanceof Date)) {
      value = new Date(Date.parse(value));
    }

    if (isNaN(value)) {
      throw new TypeError('Invalid date.');
    }

    return value;
  }
};
var _default = DateTimeOffset;
exports.default = _default;
module.exports = DateTimeOffset;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFUE9DSF9EQVRFIiwiTG9jYWxEYXRlIiwib2ZZZWFyRGF5IiwiTlVMTF9MRU5HVEgiLCJCdWZmZXIiLCJmcm9tIiwiRGF0ZVRpbWVPZmZzZXQiLCJpZCIsInR5cGUiLCJuYW1lIiwiZGVjbGFyYXRpb24iLCJwYXJhbWV0ZXIiLCJyZXNvbHZlU2NhbGUiLCJzY2FsZSIsInZhbHVlIiwiZ2VuZXJhdGVUeXBlSW5mbyIsImdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoIiwib3B0aW9ucyIsIkVycm9yIiwiZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhIiwiYnVmZmVyIiwiV3JpdGFibGVUcmFja2luZ0J1ZmZlciIsInRpbWVzdGFtcCIsImdldFVUQ0hvdXJzIiwiZ2V0VVRDTWludXRlcyIsImdldFVUQ1NlY29uZHMiLCJnZXRNaWxsaXNlY29uZHMiLCJNYXRoIiwicG93IiwibmFub3NlY29uZERlbHRhIiwicm91bmQiLCJ3cml0ZVVJbnQyNExFIiwid3JpdGVVSW50MzJMRSIsIndyaXRlVUludDQwTEUiLCJkYXRlIiwib2YiLCJnZXRVVENGdWxsWWVhciIsImdldFVUQ01vbnRoIiwiZ2V0VVRDRGF0ZSIsImRheXMiLCJ1bnRpbCIsIkNocm9ub1VuaXQiLCJEQVlTIiwib2Zmc2V0IiwiZ2V0VGltZXpvbmVPZmZzZXQiLCJ3cml0ZUludDE2TEUiLCJkYXRhIiwidmFsaWRhdGUiLCJEYXRlIiwicGFyc2UiLCJpc05hTiIsIlR5cGVFcnJvciIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YS10eXBlcy9kYXRldGltZW9mZnNldC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4uL2RhdGEtdHlwZSc7XG5pbXBvcnQgeyBDaHJvbm9Vbml0LCBMb2NhbERhdGUgfSBmcm9tICdAanMtam9kYS9jb3JlJztcbmltcG9ydCBXcml0YWJsZVRyYWNraW5nQnVmZmVyIGZyb20gJy4uL3RyYWNraW5nLWJ1ZmZlci93cml0YWJsZS10cmFja2luZy1idWZmZXInO1xuXG5jb25zdCBFUE9DSF9EQVRFID0gTG9jYWxEYXRlLm9mWWVhckRheSgxLCAxKTtcbmNvbnN0IE5VTExfTEVOR1RIID0gQnVmZmVyLmZyb20oWzB4MDBdKTtcblxuY29uc3QgRGF0ZVRpbWVPZmZzZXQ6IERhdGFUeXBlICYgeyByZXNvbHZlU2NhbGU6IE5vbk51bGxhYmxlPERhdGFUeXBlWydyZXNvbHZlU2NhbGUnXT4gfSA9IHtcbiAgaWQ6IDB4MkIsXG4gIHR5cGU6ICdEQVRFVElNRU9GRlNFVE4nLFxuICBuYW1lOiAnRGF0ZVRpbWVPZmZzZXQnLFxuICBkZWNsYXJhdGlvbjogZnVuY3Rpb24ocGFyYW1ldGVyKSB7XG4gICAgcmV0dXJuICdkYXRldGltZW9mZnNldCgnICsgKHRoaXMucmVzb2x2ZVNjYWxlKHBhcmFtZXRlcikpICsgJyknO1xuICB9LFxuICByZXNvbHZlU2NhbGU6IGZ1bmN0aW9uKHBhcmFtZXRlcikge1xuICAgIGlmIChwYXJhbWV0ZXIuc2NhbGUgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHBhcmFtZXRlci5zY2FsZTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtZXRlci52YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiA3O1xuICAgIH1cbiAgfSxcblxuICBnZW5lcmF0ZVR5cGVJbmZvKHBhcmFtZXRlcikge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShbdGhpcy5pZCwgcGFyYW1ldGVyLnNjYWxlIV0pO1xuICB9LFxuXG4gIGdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoKHBhcmFtZXRlciwgb3B0aW9ucykge1xuICAgIGlmIChwYXJhbWV0ZXIudmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIE5VTExfTEVOR1RIO1xuICAgIH1cblxuICAgIHN3aXRjaCAocGFyYW1ldGVyLnNjYWxlKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICBjYXNlIDE6XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShbMHgwOF0pO1xuXG4gICAgICBjYXNlIDM6XG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShbMHgwOV0pO1xuXG4gICAgICBjYXNlIDU6XG4gICAgICBjYXNlIDY6XG4gICAgICBjYXNlIDc6XG4gICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShbMHgwQV0pO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2NhbGUnKTtcbiAgICB9XG4gIH0sXG5cbiAgKiBnZW5lcmF0ZVBhcmFtZXRlckRhdGEocGFyYW1ldGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKHBhcmFtZXRlci52YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBwYXJhbWV0ZXIudmFsdWU7XG4gICAgbGV0IHNjYWxlID0gcGFyYW1ldGVyLnNjYWxlO1xuXG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIoMTYpO1xuICAgIHNjYWxlID0gc2NhbGUhO1xuXG4gICAgbGV0IHRpbWVzdGFtcDtcbiAgICB0aW1lc3RhbXAgPSAoKHZhbHVlLmdldFVUQ0hvdXJzKCkgKiA2MCArIHZhbHVlLmdldFVUQ01pbnV0ZXMoKSkgKiA2MCArIHZhbHVlLmdldFVUQ1NlY29uZHMoKSkgKiAxMDAwICsgdmFsdWUuZ2V0TWlsbGlzZWNvbmRzKCk7XG4gICAgdGltZXN0YW1wID0gdGltZXN0YW1wICogTWF0aC5wb3coMTAsIHNjYWxlIC0gMyk7XG4gICAgdGltZXN0YW1wICs9ICh2YWx1ZS5uYW5vc2Vjb25kRGVsdGEgIT0gbnVsbCA/IHZhbHVlLm5hbm9zZWNvbmREZWx0YSA6IDApICogTWF0aC5wb3coMTAsIHNjYWxlKTtcbiAgICB0aW1lc3RhbXAgPSBNYXRoLnJvdW5kKHRpbWVzdGFtcCk7XG5cbiAgICBzd2l0Y2ggKHNjYWxlKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICBjYXNlIDE6XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGJ1ZmZlci53cml0ZVVJbnQyNExFKHRpbWVzdGFtcCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgY2FzZSA0OlxuICAgICAgICBidWZmZXIud3JpdGVVSW50MzJMRSh0aW1lc3RhbXApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTpcbiAgICAgIGNhc2UgNjpcbiAgICAgIGNhc2UgNzpcbiAgICAgICAgYnVmZmVyLndyaXRlVUludDQwTEUodGltZXN0YW1wKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRlID0gTG9jYWxEYXRlLm9mKHZhbHVlLmdldFVUQ0Z1bGxZZWFyKCksIHZhbHVlLmdldFVUQ01vbnRoKCkgKyAxLCB2YWx1ZS5nZXRVVENEYXRlKCkpO1xuICAgIGNvbnN0IGRheXMgPSBFUE9DSF9EQVRFLnVudGlsKGRhdGUsIENocm9ub1VuaXQuREFZUyk7XG4gICAgYnVmZmVyLndyaXRlVUludDI0TEUoZGF5cyk7XG5cbiAgICBjb25zdCBvZmZzZXQgPSAtdmFsdWUuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICBidWZmZXIud3JpdGVJbnQxNkxFKG9mZnNldCk7XG4gICAgeWllbGQgYnVmZmVyLmRhdGE7XG4gIH0sXG4gIHZhbGlkYXRlOiBmdW5jdGlvbih2YWx1ZSk6IG51bGwgfCBudW1iZXIge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICB2YWx1ZSA9IG5ldyBEYXRlKERhdGUucGFyc2UodmFsdWUpKTtcbiAgICB9XG5cbiAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGRhdGUuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBEYXRlVGltZU9mZnNldDtcbm1vZHVsZS5leHBvcnRzID0gRGF0ZVRpbWVPZmZzZXQ7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7QUFDQTs7OztBQUVBLE1BQU1BLFVBQVUsR0FBR0MsZ0JBQVVDLFNBQVYsQ0FBb0IsQ0FBcEIsRUFBdUIsQ0FBdkIsQ0FBbkI7O0FBQ0EsTUFBTUMsV0FBVyxHQUFHQyxNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDLElBQUQsQ0FBWixDQUFwQjtBQUVBLE1BQU1DLGNBQWtGLEdBQUc7RUFDekZDLEVBQUUsRUFBRSxJQURxRjtFQUV6RkMsSUFBSSxFQUFFLGlCQUZtRjtFQUd6RkMsSUFBSSxFQUFFLGdCQUhtRjtFQUl6RkMsV0FBVyxFQUFFLFVBQVNDLFNBQVQsRUFBb0I7SUFDL0IsT0FBTyxvQkFBcUIsS0FBS0MsWUFBTCxDQUFrQkQsU0FBbEIsQ0FBckIsR0FBcUQsR0FBNUQ7RUFDRCxDQU53RjtFQU96RkMsWUFBWSxFQUFFLFVBQVNELFNBQVQsRUFBb0I7SUFDaEMsSUFBSUEsU0FBUyxDQUFDRSxLQUFWLElBQW1CLElBQXZCLEVBQTZCO01BQzNCLE9BQU9GLFNBQVMsQ0FBQ0UsS0FBakI7SUFDRCxDQUZELE1BRU8sSUFBSUYsU0FBUyxDQUFDRyxLQUFWLEtBQW9CLElBQXhCLEVBQThCO01BQ25DLE9BQU8sQ0FBUDtJQUNELENBRk0sTUFFQTtNQUNMLE9BQU8sQ0FBUDtJQUNEO0VBQ0YsQ0Fmd0Y7O0VBaUJ6RkMsZ0JBQWdCLENBQUNKLFNBQUQsRUFBWTtJQUMxQixPQUFPUCxNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDLEtBQUtFLEVBQU4sRUFBVUksU0FBUyxDQUFDRSxLQUFwQixDQUFaLENBQVA7RUFDRCxDQW5Cd0Y7O0VBcUJ6RkcsdUJBQXVCLENBQUNMLFNBQUQsRUFBWU0sT0FBWixFQUFxQjtJQUMxQyxJQUFJTixTQUFTLENBQUNHLEtBQVYsSUFBbUIsSUFBdkIsRUFBNkI7TUFDM0IsT0FBT1gsV0FBUDtJQUNEOztJQUVELFFBQVFRLFNBQVMsQ0FBQ0UsS0FBbEI7TUFDRSxLQUFLLENBQUw7TUFDQSxLQUFLLENBQUw7TUFDQSxLQUFLLENBQUw7UUFDRSxPQUFPVCxNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDLElBQUQsQ0FBWixDQUFQOztNQUVGLEtBQUssQ0FBTDtNQUNBLEtBQUssQ0FBTDtRQUNFLE9BQU9ELE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxDQUFaLENBQVA7O01BRUYsS0FBSyxDQUFMO01BQ0EsS0FBSyxDQUFMO01BQ0EsS0FBSyxDQUFMO1FBQ0UsT0FBT0QsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxJQUFELENBQVosQ0FBUDs7TUFFRjtRQUNFLE1BQU0sSUFBSWEsS0FBSixDQUFVLGVBQVYsQ0FBTjtJQWhCSjtFQWtCRCxDQTVDd0Y7O0VBOEN6RixDQUFFQyxxQkFBRixDQUF3QlIsU0FBeEIsRUFBbUNNLE9BQW5DLEVBQTRDO0lBQzFDLElBQUlOLFNBQVMsQ0FBQ0csS0FBVixJQUFtQixJQUF2QixFQUE2QjtNQUMzQjtJQUNEOztJQUVELE1BQU1BLEtBQUssR0FBR0gsU0FBUyxDQUFDRyxLQUF4QjtJQUNBLElBQUlELEtBQUssR0FBR0YsU0FBUyxDQUFDRSxLQUF0QjtJQUVBLE1BQU1PLE1BQU0sR0FBRyxJQUFJQywrQkFBSixDQUEyQixFQUEzQixDQUFmO0lBQ0FSLEtBQUssR0FBR0EsS0FBUjtJQUVBLElBQUlTLFNBQUo7SUFDQUEsU0FBUyxHQUFHLENBQUMsQ0FBQ1IsS0FBSyxDQUFDUyxXQUFOLEtBQXNCLEVBQXRCLEdBQTJCVCxLQUFLLENBQUNVLGFBQU4sRUFBNUIsSUFBcUQsRUFBckQsR0FBMERWLEtBQUssQ0FBQ1csYUFBTixFQUEzRCxJQUFvRixJQUFwRixHQUEyRlgsS0FBSyxDQUFDWSxlQUFOLEVBQXZHO0lBQ0FKLFNBQVMsR0FBR0EsU0FBUyxHQUFHSyxJQUFJLENBQUNDLEdBQUwsQ0FBUyxFQUFULEVBQWFmLEtBQUssR0FBRyxDQUFyQixDQUF4QjtJQUNBUyxTQUFTLElBQUksQ0FBQ1IsS0FBSyxDQUFDZSxlQUFOLElBQXlCLElBQXpCLEdBQWdDZixLQUFLLENBQUNlLGVBQXRDLEdBQXdELENBQXpELElBQThERixJQUFJLENBQUNDLEdBQUwsQ0FBUyxFQUFULEVBQWFmLEtBQWIsQ0FBM0U7SUFDQVMsU0FBUyxHQUFHSyxJQUFJLENBQUNHLEtBQUwsQ0FBV1IsU0FBWCxDQUFaOztJQUVBLFFBQVFULEtBQVI7TUFDRSxLQUFLLENBQUw7TUFDQSxLQUFLLENBQUw7TUFDQSxLQUFLLENBQUw7UUFDRU8sTUFBTSxDQUFDVyxhQUFQLENBQXFCVCxTQUFyQjtRQUNBOztNQUNGLEtBQUssQ0FBTDtNQUNBLEtBQUssQ0FBTDtRQUNFRixNQUFNLENBQUNZLGFBQVAsQ0FBcUJWLFNBQXJCO1FBQ0E7O01BQ0YsS0FBSyxDQUFMO01BQ0EsS0FBSyxDQUFMO01BQ0EsS0FBSyxDQUFMO1FBQ0VGLE1BQU0sQ0FBQ2EsYUFBUCxDQUFxQlgsU0FBckI7SUFiSjs7SUFnQkEsTUFBTVksSUFBSSxHQUFHakMsZ0JBQVVrQyxFQUFWLENBQWFyQixLQUFLLENBQUNzQixjQUFOLEVBQWIsRUFBcUN0QixLQUFLLENBQUN1QixXQUFOLEtBQXNCLENBQTNELEVBQThEdkIsS0FBSyxDQUFDd0IsVUFBTixFQUE5RCxDQUFiOztJQUNBLE1BQU1DLElBQUksR0FBR3ZDLFVBQVUsQ0FBQ3dDLEtBQVgsQ0FBaUJOLElBQWpCLEVBQXVCTyxpQkFBV0MsSUFBbEMsQ0FBYjtJQUNBdEIsTUFBTSxDQUFDVyxhQUFQLENBQXFCUSxJQUFyQjtJQUVBLE1BQU1JLE1BQU0sR0FBRyxDQUFDN0IsS0FBSyxDQUFDOEIsaUJBQU4sRUFBaEI7SUFDQXhCLE1BQU0sQ0FBQ3lCLFlBQVAsQ0FBb0JGLE1BQXBCO0lBQ0EsTUFBTXZCLE1BQU0sQ0FBQzBCLElBQWI7RUFDRCxDQXRGd0Y7O0VBdUZ6RkMsUUFBUSxFQUFFLFVBQVNqQyxLQUFULEVBQStCO0lBQ3ZDLElBQUlBLEtBQUssSUFBSSxJQUFiLEVBQW1CO01BQ2pCLE9BQU8sSUFBUDtJQUNEOztJQUVELElBQUksRUFBRUEsS0FBSyxZQUFZa0MsSUFBbkIsQ0FBSixFQUE4QjtNQUM1QmxDLEtBQUssR0FBRyxJQUFJa0MsSUFBSixDQUFTQSxJQUFJLENBQUNDLEtBQUwsQ0FBV25DLEtBQVgsQ0FBVCxDQUFSO0lBQ0Q7O0lBRUQsSUFBSW9DLEtBQUssQ0FBQ3BDLEtBQUQsQ0FBVCxFQUFrQjtNQUNoQixNQUFNLElBQUlxQyxTQUFKLENBQWMsZUFBZCxDQUFOO0lBQ0Q7O0lBRUQsT0FBT3JDLEtBQVA7RUFDRDtBQXJHd0YsQ0FBM0Y7ZUF3R2VSLGM7O0FBQ2Y4QyxNQUFNLENBQUNDLE9BQVAsR0FBaUIvQyxjQUFqQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _decimaln = _interopRequireDefault(require("./decimaln"));

var _writableTrackingBuffer = _interopRequireDefault(require("../tracking-buffer/writable-tracking-buffer"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const NULL_LENGTH = Buffer.from([0x00]);
const Decimal = {
  id: 0x37,
  type: 'DECIMAL',
  name: 'Decimal',
  declaration: function (parameter) {
    return 'decimal(' + this.resolvePrecision(parameter) + ', ' + this.resolveScale(parameter) + ')';
  },
  resolvePrecision: function (parameter) {
    if (parameter.precision != null) {
      return parameter.precision;
    } else if (parameter.value === null) {
      return 1;
    } else {
      return 18;
    }
  },
  resolveScale: function (parameter) {
    if (parameter.scale != null) {
      return parameter.scale;
    } else {
      return 0;
    }
  },

  generateTypeInfo(parameter, _options) {
    let precision;

    if (parameter.precision <= 9) {
      precision = 0x05;
    } else if (parameter.precision <= 19) {
      precision = 0x09;
    } else if (parameter.precision <= 28) {
      precision = 0x0D;
    } else {
      precision = 0x11;
    }

    return Buffer.from([_decimaln.default.id, precision, parameter.precision, parameter.scale]);
  },

  generateParameterLength(parameter, options) {
    if (parameter.value == null) {
      return NULL_LENGTH;
    }

    const precision = parameter.precision;

    if (precision <= 9) {
      return Buffer.from([0x05]);
    } else if (precision <= 19) {
      return Buffer.from([0x09]);
    } else if (precision <= 28) {
      return Buffer.from([0x0D]);
    } else {
      return Buffer.from([0x11]);
    }
  },

  *generateParameterData(parameter, options) {
    if (parameter.value == null) {
      return;
    }

    const sign = parameter.value < 0 ? 0 : 1;
    const value = Math.round(Math.abs(parameter.value * Math.pow(10, parameter.scale)));
    const precision = parameter.precision;

    if (precision <= 9) {
      const buffer = Buffer.alloc(5);
      buffer.writeUInt8(sign, 0);
      buffer.writeUInt32LE(value, 1);
      yield buffer;
    } else if (precision <= 19) {
      const buffer = new _writableTrackingBuffer.default(9);
      buffer.writeUInt8(sign);
      buffer.writeUInt64LE(value);
      yield buffer.data;
    } else if (precision <= 28) {
      const buffer = new _writableTrackingBuffer.default(13);
      buffer.writeUInt8(sign);
      buffer.writeUInt64LE(value);
      buffer.writeUInt32LE(0x00000000);
      yield buffer.data;
    } else {
      const buffer = new _writableTrackingBuffer.default(17);
      buffer.writeUInt8(sign);
      buffer.writeUInt64LE(value);
      buffer.writeUInt32LE(0x00000000);
      buffer.writeUInt32LE(0x00000000);
      yield buffer.data;
    }
  },

  validate: function (value) {
    if (value == null) {
      return null;
    }

    value = parseFloat(value);

    if (isNaN(value)) {
      throw new TypeError('Invalid number.');
    }

    return value;
  }
};
var _default = Decimal;
exports.default = _default;
module.exports = Decimal;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOVUxMX0xFTkdUSCIsIkJ1ZmZlciIsImZyb20iLCJEZWNpbWFsIiwiaWQiLCJ0eXBlIiwibmFtZSIsImRlY2xhcmF0aW9uIiwicGFyYW1ldGVyIiwicmVzb2x2ZVByZWNpc2lvbiIsInJlc29sdmVTY2FsZSIsInByZWNpc2lvbiIsInZhbHVlIiwic2NhbGUiLCJnZW5lcmF0ZVR5cGVJbmZvIiwiX29wdGlvbnMiLCJEZWNpbWFsTiIsImdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoIiwib3B0aW9ucyIsImdlbmVyYXRlUGFyYW1ldGVyRGF0YSIsInNpZ24iLCJNYXRoIiwicm91bmQiLCJhYnMiLCJwb3ciLCJidWZmZXIiLCJhbGxvYyIsIndyaXRlVUludDgiLCJ3cml0ZVVJbnQzMkxFIiwiV3JpdGFibGVUcmFja2luZ0J1ZmZlciIsIndyaXRlVUludDY0TEUiLCJkYXRhIiwidmFsaWRhdGUiLCJwYXJzZUZsb2F0IiwiaXNOYU4iLCJUeXBlRXJyb3IiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGEtdHlwZXMvZGVjaW1hbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4uL2RhdGEtdHlwZSc7XG5pbXBvcnQgRGVjaW1hbE4gZnJvbSAnLi9kZWNpbWFsbic7XG5pbXBvcnQgV3JpdGFibGVUcmFja2luZ0J1ZmZlciBmcm9tICcuLi90cmFja2luZy1idWZmZXIvd3JpdGFibGUtdHJhY2tpbmctYnVmZmVyJztcblxuY29uc3QgTlVMTF9MRU5HVEggPSBCdWZmZXIuZnJvbShbMHgwMF0pO1xuXG5jb25zdCBEZWNpbWFsOiBEYXRhVHlwZSAmIHsgcmVzb2x2ZVByZWNpc2lvbjogTm9uTnVsbGFibGU8RGF0YVR5cGVbJ3Jlc29sdmVQcmVjaXNpb24nXT4sIHJlc29sdmVTY2FsZTogTm9uTnVsbGFibGU8RGF0YVR5cGVbJ3Jlc29sdmVTY2FsZSddPiB9ID0ge1xuICBpZDogMHgzNyxcbiAgdHlwZTogJ0RFQ0lNQUwnLFxuICBuYW1lOiAnRGVjaW1hbCcsXG5cbiAgZGVjbGFyYXRpb246IGZ1bmN0aW9uKHBhcmFtZXRlcikge1xuICAgIHJldHVybiAnZGVjaW1hbCgnICsgKHRoaXMucmVzb2x2ZVByZWNpc2lvbihwYXJhbWV0ZXIpKSArICcsICcgKyAodGhpcy5yZXNvbHZlU2NhbGUocGFyYW1ldGVyKSkgKyAnKSc7XG4gIH0sXG5cbiAgcmVzb2x2ZVByZWNpc2lvbjogZnVuY3Rpb24ocGFyYW1ldGVyKSB7XG4gICAgaWYgKHBhcmFtZXRlci5wcmVjaXNpb24gIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHBhcmFtZXRlci5wcmVjaXNpb247XG4gICAgfSBlbHNlIGlmIChwYXJhbWV0ZXIudmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gMTg7XG4gICAgfVxuICB9LFxuXG4gIHJlc29sdmVTY2FsZTogZnVuY3Rpb24ocGFyYW1ldGVyKSB7XG4gICAgaWYgKHBhcmFtZXRlci5zY2FsZSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gcGFyYW1ldGVyLnNjYWxlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH0sXG5cbiAgZ2VuZXJhdGVUeXBlSW5mbyhwYXJhbWV0ZXIsIF9vcHRpb25zKSB7XG4gICAgbGV0IHByZWNpc2lvbjtcbiAgICBpZiAocGFyYW1ldGVyLnByZWNpc2lvbiEgPD0gOSkge1xuICAgICAgcHJlY2lzaW9uID0gMHgwNTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtZXRlci5wcmVjaXNpb24hIDw9IDE5KSB7XG4gICAgICBwcmVjaXNpb24gPSAweDA5O1xuICAgIH0gZWxzZSBpZiAocGFyYW1ldGVyLnByZWNpc2lvbiEgPD0gMjgpIHtcbiAgICAgIHByZWNpc2lvbiA9IDB4MEQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWNpc2lvbiA9IDB4MTE7XG4gICAgfVxuXG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKFtEZWNpbWFsTi5pZCwgcHJlY2lzaW9uLCBwYXJhbWV0ZXIucHJlY2lzaW9uISwgcGFyYW1ldGVyLnNjYWxlIV0pO1xuICB9LFxuXG4gIGdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoKHBhcmFtZXRlciwgb3B0aW9ucykge1xuICAgIGlmIChwYXJhbWV0ZXIudmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIE5VTExfTEVOR1RIO1xuICAgIH1cblxuICAgIGNvbnN0IHByZWNpc2lvbiA9IHBhcmFtZXRlci5wcmVjaXNpb24hO1xuICAgIGlmIChwcmVjaXNpb24gPD0gOSkge1xuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKFsweDA1XSk7XG4gICAgfSBlbHNlIGlmIChwcmVjaXNpb24gPD0gMTkpIHtcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbShbMHgwOV0pO1xuICAgIH0gZWxzZSBpZiAocHJlY2lzaW9uIDw9IDI4KSB7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20oWzB4MERdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKFsweDExXSk7XG4gICAgfVxuICB9LFxuXG4gICogZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhKHBhcmFtZXRlciwgb3B0aW9ucykge1xuICAgIGlmIChwYXJhbWV0ZXIudmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ24gPSBwYXJhbWV0ZXIudmFsdWUgPCAwID8gMCA6IDE7XG4gICAgY29uc3QgdmFsdWUgPSBNYXRoLnJvdW5kKE1hdGguYWJzKHBhcmFtZXRlci52YWx1ZSAqIE1hdGgucG93KDEwLCBwYXJhbWV0ZXIuc2NhbGUhKSkpO1xuICAgIGNvbnN0IHByZWNpc2lvbiA9IHBhcmFtZXRlci5wcmVjaXNpb24hO1xuICAgIGlmIChwcmVjaXNpb24gPD0gOSkge1xuICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jKDUpO1xuICAgICAgYnVmZmVyLndyaXRlVUludDgoc2lnbiwgMCk7XG4gICAgICBidWZmZXIud3JpdGVVSW50MzJMRSh2YWx1ZSwgMSk7XG4gICAgICB5aWVsZCBidWZmZXI7XG4gICAgfSBlbHNlIGlmIChwcmVjaXNpb24gPD0gMTkpIHtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBXcml0YWJsZVRyYWNraW5nQnVmZmVyKDkpO1xuICAgICAgYnVmZmVyLndyaXRlVUludDgoc2lnbik7XG4gICAgICBidWZmZXIud3JpdGVVSW50NjRMRSh2YWx1ZSk7XG4gICAgICB5aWVsZCBidWZmZXIuZGF0YTtcbiAgICB9IGVsc2UgaWYgKHByZWNpc2lvbiA8PSAyOCkge1xuICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIoMTMpO1xuICAgICAgYnVmZmVyLndyaXRlVUludDgoc2lnbik7XG4gICAgICBidWZmZXIud3JpdGVVSW50NjRMRSh2YWx1ZSk7XG4gICAgICBidWZmZXIud3JpdGVVSW50MzJMRSgweDAwMDAwMDAwKTtcbiAgICAgIHlpZWxkIGJ1ZmZlci5kYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBidWZmZXIgPSBuZXcgV3JpdGFibGVUcmFja2luZ0J1ZmZlcigxNyk7XG4gICAgICBidWZmZXIud3JpdGVVSW50OChzaWduKTtcbiAgICAgIGJ1ZmZlci53cml0ZVVJbnQ2NExFKHZhbHVlKTtcbiAgICAgIGJ1ZmZlci53cml0ZVVJbnQzMkxFKDB4MDAwMDAwMDApO1xuICAgICAgYnVmZmVyLndyaXRlVUludDMyTEUoMHgwMDAwMDAwMCk7XG4gICAgICB5aWVsZCBidWZmZXIuZGF0YTtcbiAgICB9XG4gIH0sXG5cbiAgdmFsaWRhdGU6IGZ1bmN0aW9uKHZhbHVlKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpO1xuICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbnVtYmVyLicpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IERlY2ltYWw7XG5tb2R1bGUuZXhwb3J0cyA9IERlY2ltYWw7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7QUFDQTs7OztBQUVBLE1BQU1BLFdBQVcsR0FBR0MsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxJQUFELENBQVosQ0FBcEI7QUFFQSxNQUFNQyxPQUF3SSxHQUFHO0VBQy9JQyxFQUFFLEVBQUUsSUFEMkk7RUFFL0lDLElBQUksRUFBRSxTQUZ5STtFQUcvSUMsSUFBSSxFQUFFLFNBSHlJO0VBSy9JQyxXQUFXLEVBQUUsVUFBU0MsU0FBVCxFQUFvQjtJQUMvQixPQUFPLGFBQWMsS0FBS0MsZ0JBQUwsQ0FBc0JELFNBQXRCLENBQWQsR0FBa0QsSUFBbEQsR0FBMEQsS0FBS0UsWUFBTCxDQUFrQkYsU0FBbEIsQ0FBMUQsR0FBMEYsR0FBakc7RUFDRCxDQVA4STtFQVMvSUMsZ0JBQWdCLEVBQUUsVUFBU0QsU0FBVCxFQUFvQjtJQUNwQyxJQUFJQSxTQUFTLENBQUNHLFNBQVYsSUFBdUIsSUFBM0IsRUFBaUM7TUFDL0IsT0FBT0gsU0FBUyxDQUFDRyxTQUFqQjtJQUNELENBRkQsTUFFTyxJQUFJSCxTQUFTLENBQUNJLEtBQVYsS0FBb0IsSUFBeEIsRUFBOEI7TUFDbkMsT0FBTyxDQUFQO0lBQ0QsQ0FGTSxNQUVBO01BQ0wsT0FBTyxFQUFQO0lBQ0Q7RUFDRixDQWpCOEk7RUFtQi9JRixZQUFZLEVBQUUsVUFBU0YsU0FBVCxFQUFvQjtJQUNoQyxJQUFJQSxTQUFTLENBQUNLLEtBQVYsSUFBbUIsSUFBdkIsRUFBNkI7TUFDM0IsT0FBT0wsU0FBUyxDQUFDSyxLQUFqQjtJQUNELENBRkQsTUFFTztNQUNMLE9BQU8sQ0FBUDtJQUNEO0VBQ0YsQ0F6QjhJOztFQTJCL0lDLGdCQUFnQixDQUFDTixTQUFELEVBQVlPLFFBQVosRUFBc0I7SUFDcEMsSUFBSUosU0FBSjs7SUFDQSxJQUFJSCxTQUFTLENBQUNHLFNBQVYsSUFBd0IsQ0FBNUIsRUFBK0I7TUFDN0JBLFNBQVMsR0FBRyxJQUFaO0lBQ0QsQ0FGRCxNQUVPLElBQUlILFNBQVMsQ0FBQ0csU0FBVixJQUF3QixFQUE1QixFQUFnQztNQUNyQ0EsU0FBUyxHQUFHLElBQVo7SUFDRCxDQUZNLE1BRUEsSUFBSUgsU0FBUyxDQUFDRyxTQUFWLElBQXdCLEVBQTVCLEVBQWdDO01BQ3JDQSxTQUFTLEdBQUcsSUFBWjtJQUNELENBRk0sTUFFQTtNQUNMQSxTQUFTLEdBQUcsSUFBWjtJQUNEOztJQUVELE9BQU9WLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUNjLGtCQUFTWixFQUFWLEVBQWNPLFNBQWQsRUFBeUJILFNBQVMsQ0FBQ0csU0FBbkMsRUFBK0NILFNBQVMsQ0FBQ0ssS0FBekQsQ0FBWixDQUFQO0VBQ0QsQ0F4QzhJOztFQTBDL0lJLHVCQUF1QixDQUFDVCxTQUFELEVBQVlVLE9BQVosRUFBcUI7SUFDMUMsSUFBSVYsU0FBUyxDQUFDSSxLQUFWLElBQW1CLElBQXZCLEVBQTZCO01BQzNCLE9BQU9aLFdBQVA7SUFDRDs7SUFFRCxNQUFNVyxTQUFTLEdBQUdILFNBQVMsQ0FBQ0csU0FBNUI7O0lBQ0EsSUFBSUEsU0FBUyxJQUFJLENBQWpCLEVBQW9CO01BQ2xCLE9BQU9WLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxDQUFaLENBQVA7SUFDRCxDQUZELE1BRU8sSUFBSVMsU0FBUyxJQUFJLEVBQWpCLEVBQXFCO01BQzFCLE9BQU9WLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxDQUFaLENBQVA7SUFDRCxDQUZNLE1BRUEsSUFBSVMsU0FBUyxJQUFJLEVBQWpCLEVBQXFCO01BQzFCLE9BQU9WLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxDQUFaLENBQVA7SUFDRCxDQUZNLE1BRUE7TUFDTCxPQUFPRCxNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDLElBQUQsQ0FBWixDQUFQO0lBQ0Q7RUFDRixDQXpEOEk7O0VBMkQvSSxDQUFFaUIscUJBQUYsQ0FBd0JYLFNBQXhCLEVBQW1DVSxPQUFuQyxFQUE0QztJQUMxQyxJQUFJVixTQUFTLENBQUNJLEtBQVYsSUFBbUIsSUFBdkIsRUFBNkI7TUFDM0I7SUFDRDs7SUFFRCxNQUFNUSxJQUFJLEdBQUdaLFNBQVMsQ0FBQ0ksS0FBVixHQUFrQixDQUFsQixHQUFzQixDQUF0QixHQUEwQixDQUF2QztJQUNBLE1BQU1BLEtBQUssR0FBR1MsSUFBSSxDQUFDQyxLQUFMLENBQVdELElBQUksQ0FBQ0UsR0FBTCxDQUFTZixTQUFTLENBQUNJLEtBQVYsR0FBa0JTLElBQUksQ0FBQ0csR0FBTCxDQUFTLEVBQVQsRUFBYWhCLFNBQVMsQ0FBQ0ssS0FBdkIsQ0FBM0IsQ0FBWCxDQUFkO0lBQ0EsTUFBTUYsU0FBUyxHQUFHSCxTQUFTLENBQUNHLFNBQTVCOztJQUNBLElBQUlBLFNBQVMsSUFBSSxDQUFqQixFQUFvQjtNQUNsQixNQUFNYyxNQUFNLEdBQUd4QixNQUFNLENBQUN5QixLQUFQLENBQWEsQ0FBYixDQUFmO01BQ0FELE1BQU0sQ0FBQ0UsVUFBUCxDQUFrQlAsSUFBbEIsRUFBd0IsQ0FBeEI7TUFDQUssTUFBTSxDQUFDRyxhQUFQLENBQXFCaEIsS0FBckIsRUFBNEIsQ0FBNUI7TUFDQSxNQUFNYSxNQUFOO0lBQ0QsQ0FMRCxNQUtPLElBQUlkLFNBQVMsSUFBSSxFQUFqQixFQUFxQjtNQUMxQixNQUFNYyxNQUFNLEdBQUcsSUFBSUksK0JBQUosQ0FBMkIsQ0FBM0IsQ0FBZjtNQUNBSixNQUFNLENBQUNFLFVBQVAsQ0FBa0JQLElBQWxCO01BQ0FLLE1BQU0sQ0FBQ0ssYUFBUCxDQUFxQmxCLEtBQXJCO01BQ0EsTUFBTWEsTUFBTSxDQUFDTSxJQUFiO0lBQ0QsQ0FMTSxNQUtBLElBQUlwQixTQUFTLElBQUksRUFBakIsRUFBcUI7TUFDMUIsTUFBTWMsTUFBTSxHQUFHLElBQUlJLCtCQUFKLENBQTJCLEVBQTNCLENBQWY7TUFDQUosTUFBTSxDQUFDRSxVQUFQLENBQWtCUCxJQUFsQjtNQUNBSyxNQUFNLENBQUNLLGFBQVAsQ0FBcUJsQixLQUFyQjtNQUNBYSxNQUFNLENBQUNHLGFBQVAsQ0FBcUIsVUFBckI7TUFDQSxNQUFNSCxNQUFNLENBQUNNLElBQWI7SUFDRCxDQU5NLE1BTUE7TUFDTCxNQUFNTixNQUFNLEdBQUcsSUFBSUksK0JBQUosQ0FBMkIsRUFBM0IsQ0FBZjtNQUNBSixNQUFNLENBQUNFLFVBQVAsQ0FBa0JQLElBQWxCO01BQ0FLLE1BQU0sQ0FBQ0ssYUFBUCxDQUFxQmxCLEtBQXJCO01BQ0FhLE1BQU0sQ0FBQ0csYUFBUCxDQUFxQixVQUFyQjtNQUNBSCxNQUFNLENBQUNHLGFBQVAsQ0FBcUIsVUFBckI7TUFDQSxNQUFNSCxNQUFNLENBQUNNLElBQWI7SUFDRDtFQUNGLENBM0Y4STs7RUE2Ri9JQyxRQUFRLEVBQUUsVUFBU3BCLEtBQVQsRUFBK0I7SUFDdkMsSUFBSUEsS0FBSyxJQUFJLElBQWIsRUFBbUI7TUFDakIsT0FBTyxJQUFQO0lBQ0Q7O0lBQ0RBLEtBQUssR0FBR3FCLFVBQVUsQ0FBQ3JCLEtBQUQsQ0FBbEI7O0lBQ0EsSUFBSXNCLEtBQUssQ0FBQ3RCLEtBQUQsQ0FBVCxFQUFrQjtNQUNoQixNQUFNLElBQUl1QixTQUFKLENBQWMsaUJBQWQsQ0FBTjtJQUNEOztJQUNELE9BQU92QixLQUFQO0VBQ0Q7QUF0RzhJLENBQWpKO2VBeUdlVCxPOztBQUNmaUMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCbEMsT0FBakIifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
const DecimalN = {
  id: 0x6A,
  type: 'DECIMALN',
  name: 'DecimalN',

  declaration() {
    throw new Error('not implemented');
  },

  generateTypeInfo() {
    throw new Error('not implemented');
  },

  generateParameterLength() {
    throw new Error('not implemented');
  },

  generateParameterData() {
    throw new Error('not implemented');
  },

  validate() {
    throw new Error('not implemented');
  }

};
var _default = DecimalN;
exports.default = _default;
module.exports = DecimalN;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJEZWNpbWFsTiIsImlkIiwidHlwZSIsIm5hbWUiLCJkZWNsYXJhdGlvbiIsIkVycm9yIiwiZ2VuZXJhdGVUeXBlSW5mbyIsImdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoIiwiZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhIiwidmFsaWRhdGUiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGEtdHlwZXMvZGVjaW1hbG4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuLi9kYXRhLXR5cGUnO1xuXG5jb25zdCBEZWNpbWFsTjogRGF0YVR5cGUgPSB7XG4gIGlkOiAweDZBLFxuICB0eXBlOiAnREVDSU1BTE4nLFxuICBuYW1lOiAnRGVjaW1hbE4nLFxuXG4gIGRlY2xhcmF0aW9uKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gIH0sXG5cbiAgZ2VuZXJhdGVUeXBlSW5mbygpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICB9LFxuXG4gIGdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gIH0sXG5cbiAgZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gIH0sXG5cbiAgdmFsaWRhdGUoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgRGVjaW1hbE47XG5tb2R1bGUuZXhwb3J0cyA9IERlY2ltYWxOO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQSxNQUFNQSxRQUFrQixHQUFHO0VBQ3pCQyxFQUFFLEVBQUUsSUFEcUI7RUFFekJDLElBQUksRUFBRSxVQUZtQjtFQUd6QkMsSUFBSSxFQUFFLFVBSG1COztFQUt6QkMsV0FBVyxHQUFHO0lBQ1osTUFBTSxJQUFJQyxLQUFKLENBQVUsaUJBQVYsQ0FBTjtFQUNELENBUHdCOztFQVN6QkMsZ0JBQWdCLEdBQUc7SUFDakIsTUFBTSxJQUFJRCxLQUFKLENBQVUsaUJBQVYsQ0FBTjtFQUNELENBWHdCOztFQWF6QkUsdUJBQXVCLEdBQUc7SUFDeEIsTUFBTSxJQUFJRixLQUFKLENBQVUsaUJBQVYsQ0FBTjtFQUNELENBZndCOztFQWlCekJHLHFCQUFxQixHQUFHO0lBQ3RCLE1BQU0sSUFBSUgsS0FBSixDQUFVLGlCQUFWLENBQU47RUFDRCxDQW5Cd0I7O0VBcUJ6QkksUUFBUSxHQUFHO0lBQ1QsTUFBTSxJQUFJSixLQUFKLENBQVUsaUJBQVYsQ0FBTjtFQUNEOztBQXZCd0IsQ0FBM0I7ZUEwQmVMLFE7O0FBQ2ZVLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQlgsUUFBakIifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _floatn = _interopRequireDefault(require("./floatn"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const NULL_LENGTH = Buffer.from([0x00]);
const Float = {
  id: 0x3E,
  type: 'FLT8',
  name: 'Float',
  declaration: function () {
    return 'float';
  },

  generateTypeInfo() {
    return Buffer.from([_floatn.default.id, 0x08]);
  },

  generateParameterLength(parameter, options) {
    if (parameter.value == null) {
      return NULL_LENGTH;
    }

    return Buffer.from([0x08]);
  },

  *generateParameterData(parameter, options) {
    if (parameter.value == null) {
      return;
    }

    const buffer = Buffer.alloc(8);
    buffer.writeDoubleLE(parseFloat(parameter.value), 0);
    yield buffer;
  },

  validate: function (value) {
    if (value == null) {
      return null;
    }

    value = parseFloat(value);

    if (isNaN(value)) {
      throw new TypeError('Invalid number.');
    }

    return value;
  }
};
var _default = Float;
exports.default = _default;
module.exports = Float;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOVUxMX0xFTkdUSCIsIkJ1ZmZlciIsImZyb20iLCJGbG9hdCIsImlkIiwidHlwZSIsIm5hbWUiLCJkZWNsYXJhdGlvbiIsImdlbmVyYXRlVHlwZUluZm8iLCJGbG9hdE4iLCJnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aCIsInBhcmFtZXRlciIsIm9wdGlvbnMiLCJ2YWx1ZSIsImdlbmVyYXRlUGFyYW1ldGVyRGF0YSIsImJ1ZmZlciIsImFsbG9jIiwid3JpdGVEb3VibGVMRSIsInBhcnNlRmxvYXQiLCJ2YWxpZGF0ZSIsImlzTmFOIiwiVHlwZUVycm9yIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhLXR5cGVzL2Zsb2F0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi4vZGF0YS10eXBlJztcbmltcG9ydCBGbG9hdE4gZnJvbSAnLi9mbG9hdG4nO1xuXG5jb25zdCBOVUxMX0xFTkdUSCA9IEJ1ZmZlci5mcm9tKFsweDAwXSk7XG5cbmNvbnN0IEZsb2F0OiBEYXRhVHlwZSA9IHtcbiAgaWQ6IDB4M0UsXG4gIHR5cGU6ICdGTFQ4JyxcbiAgbmFtZTogJ0Zsb2F0JyxcblxuICBkZWNsYXJhdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICdmbG9hdCc7XG4gIH0sXG5cbiAgZ2VuZXJhdGVUeXBlSW5mbygpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oW0Zsb2F0Ti5pZCwgMHgwOF0pO1xuICB9LFxuXG4gIGdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoKHBhcmFtZXRlciwgb3B0aW9ucykge1xuICAgIGlmIChwYXJhbWV0ZXIudmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIE5VTExfTEVOR1RIO1xuICAgIH1cblxuICAgIHJldHVybiBCdWZmZXIuZnJvbShbMHgwOF0pO1xuICB9LFxuXG4gICogZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhKHBhcmFtZXRlciwgb3B0aW9ucykge1xuICAgIGlmIChwYXJhbWV0ZXIudmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg4KTtcbiAgICBidWZmZXIud3JpdGVEb3VibGVMRShwYXJzZUZsb2F0KHBhcmFtZXRlci52YWx1ZSksIDApO1xuICAgIHlpZWxkIGJ1ZmZlcjtcbiAgfSxcblxuICB2YWxpZGF0ZTogZnVuY3Rpb24odmFsdWUpOiBudW1iZXIgfCBudWxsIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgaWYgKGlzTmFOKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBudW1iZXIuJyk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgRmxvYXQ7XG5tb2R1bGUuZXhwb3J0cyA9IEZsb2F0O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQ0E7Ozs7QUFFQSxNQUFNQSxXQUFXLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxDQUFaLENBQXBCO0FBRUEsTUFBTUMsS0FBZSxHQUFHO0VBQ3RCQyxFQUFFLEVBQUUsSUFEa0I7RUFFdEJDLElBQUksRUFBRSxNQUZnQjtFQUd0QkMsSUFBSSxFQUFFLE9BSGdCO0VBS3RCQyxXQUFXLEVBQUUsWUFBVztJQUN0QixPQUFPLE9BQVA7RUFDRCxDQVBxQjs7RUFTdEJDLGdCQUFnQixHQUFHO0lBQ2pCLE9BQU9QLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUNPLGdCQUFPTCxFQUFSLEVBQVksSUFBWixDQUFaLENBQVA7RUFDRCxDQVhxQjs7RUFhdEJNLHVCQUF1QixDQUFDQyxTQUFELEVBQVlDLE9BQVosRUFBcUI7SUFDMUMsSUFBSUQsU0FBUyxDQUFDRSxLQUFWLElBQW1CLElBQXZCLEVBQTZCO01BQzNCLE9BQU9iLFdBQVA7SUFDRDs7SUFFRCxPQUFPQyxNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDLElBQUQsQ0FBWixDQUFQO0VBQ0QsQ0FuQnFCOztFQXFCdEIsQ0FBRVkscUJBQUYsQ0FBd0JILFNBQXhCLEVBQW1DQyxPQUFuQyxFQUE0QztJQUMxQyxJQUFJRCxTQUFTLENBQUNFLEtBQVYsSUFBbUIsSUFBdkIsRUFBNkI7TUFDM0I7SUFDRDs7SUFFRCxNQUFNRSxNQUFNLEdBQUdkLE1BQU0sQ0FBQ2UsS0FBUCxDQUFhLENBQWIsQ0FBZjtJQUNBRCxNQUFNLENBQUNFLGFBQVAsQ0FBcUJDLFVBQVUsQ0FBQ1AsU0FBUyxDQUFDRSxLQUFYLENBQS9CLEVBQWtELENBQWxEO0lBQ0EsTUFBTUUsTUFBTjtFQUNELENBN0JxQjs7RUErQnRCSSxRQUFRLEVBQUUsVUFBU04sS0FBVCxFQUErQjtJQUN2QyxJQUFJQSxLQUFLLElBQUksSUFBYixFQUFtQjtNQUNqQixPQUFPLElBQVA7SUFDRDs7SUFDREEsS0FBSyxHQUFHSyxVQUFVLENBQUNMLEtBQUQsQ0FBbEI7O0lBQ0EsSUFBSU8sS0FBSyxDQUFDUCxLQUFELENBQVQsRUFBa0I7TUFDaEIsTUFBTSxJQUFJUSxTQUFKLENBQWMsaUJBQWQsQ0FBTjtJQUNEOztJQUNELE9BQU9SLEtBQVA7RUFDRDtBQXhDcUIsQ0FBeEI7ZUEyQ2VWLEs7O0FBQ2ZtQixNQUFNLENBQUNDLE9BQVAsR0FBaUJwQixLQUFqQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
const FloatN = {
  id: 0x6D,
  type: 'FLTN',
  name: 'FloatN',

  declaration() {
    throw new Error('not implemented');
  },

  generateTypeInfo() {
    throw new Error('not implemented');
  },

  generateParameterLength() {
    throw new Error('not implemented');
  },

  generateParameterData() {
    throw new Error('not implemented');
  },

  validate() {
    throw new Error('not implemented');
  }

};
var _default = FloatN;
exports.default = _default;
module.exports = FloatN;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGbG9hdE4iLCJpZCIsInR5cGUiLCJuYW1lIiwiZGVjbGFyYXRpb24iLCJFcnJvciIsImdlbmVyYXRlVHlwZUluZm8iLCJnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aCIsImdlbmVyYXRlUGFyYW1ldGVyRGF0YSIsInZhbGlkYXRlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhLXR5cGVzL2Zsb2F0bi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4uL2RhdGEtdHlwZSc7XG5cbmNvbnN0IEZsb2F0TjogRGF0YVR5cGUgPSB7XG4gIGlkOiAweDZELFxuICB0eXBlOiAnRkxUTicsXG4gIG5hbWU6ICdGbG9hdE4nLFxuXG4gIGRlY2xhcmF0aW9uKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gIH0sXG5cbiAgZ2VuZXJhdGVUeXBlSW5mbygpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICB9LFxuXG4gIGdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gIH0sXG5cbiAgZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gIH0sXG5cbiAgdmFsaWRhdGUoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgRmxvYXROO1xubW9kdWxlLmV4cG9ydHMgPSBGbG9hdE47XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUVBLE1BQU1BLE1BQWdCLEdBQUc7RUFDdkJDLEVBQUUsRUFBRSxJQURtQjtFQUV2QkMsSUFBSSxFQUFFLE1BRmlCO0VBR3ZCQyxJQUFJLEVBQUUsUUFIaUI7O0VBS3ZCQyxXQUFXLEdBQUc7SUFDWixNQUFNLElBQUlDLEtBQUosQ0FBVSxpQkFBVixDQUFOO0VBQ0QsQ0FQc0I7O0VBU3ZCQyxnQkFBZ0IsR0FBRztJQUNqQixNQUFNLElBQUlELEtBQUosQ0FBVSxpQkFBVixDQUFOO0VBQ0QsQ0FYc0I7O0VBYXZCRSx1QkFBdUIsR0FBRztJQUN4QixNQUFNLElBQUlGLEtBQUosQ0FBVSxpQkFBVixDQUFOO0VBQ0QsQ0Fmc0I7O0VBaUJ2QkcscUJBQXFCLEdBQUc7SUFDdEIsTUFBTSxJQUFJSCxLQUFKLENBQVUsaUJBQVYsQ0FBTjtFQUNELENBbkJzQjs7RUFxQnZCSSxRQUFRLEdBQUc7SUFDVCxNQUFNLElBQUlKLEtBQUosQ0FBVSxpQkFBVixDQUFOO0VBQ0Q7O0FBdkJzQixDQUF6QjtlQTBCZUwsTTs7QUFDZlUsTUFBTSxDQUFDQyxPQUFQLEdBQWlCWCxNQUFqQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
const NULL_LENGTH = Buffer.from([0xFF, 0xFF, 0xFF, 0xFF]);
const Image = {
  id: 0x22,
  type: 'IMAGE',
  name: 'Image',
  hasTableName: true,
  declaration: function () {
    return 'image';
  },
  resolveLength: function (parameter) {
    if (parameter.value != null) {
      const value = parameter.value; // TODO: Temporary solution. Replace 'any' more with specific type;

      return value.length;
    } else {
      return -1;
    }
  },

  generateTypeInfo(parameter) {
    const buffer = Buffer.alloc(5);
    buffer.writeUInt8(this.id, 0);
    buffer.writeInt32LE(parameter.length, 1);
    return buffer;
  },

  generateParameterLength(parameter, options) {
    if (parameter.value == null) {
      return NULL_LENGTH;
    }

    const buffer = Buffer.alloc(4);
    buffer.writeInt32LE(parameter.value.length, 0);
    return buffer;
  },

  *generateParameterData(parameter, options) {
    if (parameter.value == null) {
      return;
    }

    yield parameter.value;
  },

  validate: function (value) {
    if (value == null) {
      return null;
    }

    if (!Buffer.isBuffer(value)) {
      throw new TypeError('Invalid buffer.');
    }

    return value;
  }
};
var _default = Image;
exports.default = _default;
module.exports = Image;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOVUxMX0xFTkdUSCIsIkJ1ZmZlciIsImZyb20iLCJJbWFnZSIsImlkIiwidHlwZSIsIm5hbWUiLCJoYXNUYWJsZU5hbWUiLCJkZWNsYXJhdGlvbiIsInJlc29sdmVMZW5ndGgiLCJwYXJhbWV0ZXIiLCJ2YWx1ZSIsImxlbmd0aCIsImdlbmVyYXRlVHlwZUluZm8iLCJidWZmZXIiLCJhbGxvYyIsIndyaXRlVUludDgiLCJ3cml0ZUludDMyTEUiLCJnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aCIsIm9wdGlvbnMiLCJnZW5lcmF0ZVBhcmFtZXRlckRhdGEiLCJ2YWxpZGF0ZSIsImlzQnVmZmVyIiwiVHlwZUVycm9yIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhLXR5cGVzL2ltYWdlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi4vZGF0YS10eXBlJztcblxuY29uc3QgTlVMTF9MRU5HVEggPSBCdWZmZXIuZnJvbShbMHhGRiwgMHhGRiwgMHhGRiwgMHhGRl0pO1xuXG5jb25zdCBJbWFnZTogRGF0YVR5cGUgPSB7XG4gIGlkOiAweDIyLFxuICB0eXBlOiAnSU1BR0UnLFxuICBuYW1lOiAnSW1hZ2UnLFxuICBoYXNUYWJsZU5hbWU6IHRydWUsXG5cbiAgZGVjbGFyYXRpb246IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAnaW1hZ2UnO1xuICB9LFxuXG4gIHJlc29sdmVMZW5ndGg6IGZ1bmN0aW9uKHBhcmFtZXRlcikge1xuICAgIGlmIChwYXJhbWV0ZXIudmFsdWUgIT0gbnVsbCkge1xuICAgICAgY29uc3QgdmFsdWUgPSBwYXJhbWV0ZXIudmFsdWUgYXMgYW55OyAvLyBUT0RPOiBUZW1wb3Jhcnkgc29sdXRpb24uIFJlcGxhY2UgJ2FueScgbW9yZSB3aXRoIHNwZWNpZmljIHR5cGU7XG4gICAgICByZXR1cm4gdmFsdWUubGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuICB9LFxuXG4gIGdlbmVyYXRlVHlwZUluZm8ocGFyYW1ldGVyKSB7XG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jKDUpO1xuICAgIGJ1ZmZlci53cml0ZVVJbnQ4KHRoaXMuaWQsIDApO1xuICAgIGJ1ZmZlci53cml0ZUludDMyTEUocGFyYW1ldGVyLmxlbmd0aCEsIDEpO1xuICAgIHJldHVybiBidWZmZXI7XG4gIH0sXG5cbiAgZ2VuZXJhdGVQYXJhbWV0ZXJMZW5ndGgocGFyYW1ldGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKHBhcmFtZXRlci52YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gTlVMTF9MRU5HVEg7XG4gICAgfVxuXG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jKDQpO1xuICAgIGJ1ZmZlci53cml0ZUludDMyTEUocGFyYW1ldGVyLnZhbHVlLmxlbmd0aCEsIDApO1xuICAgIHJldHVybiBidWZmZXI7XG4gIH0sXG5cbiAgKiBnZW5lcmF0ZVBhcmFtZXRlckRhdGEocGFyYW1ldGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKHBhcmFtZXRlci52YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgeWllbGQgcGFyYW1ldGVyLnZhbHVlO1xuICB9LFxuXG4gIHZhbGlkYXRlOiBmdW5jdGlvbih2YWx1ZSk6IG51bGwgfCBCdWZmZXIge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGJ1ZmZlci4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBJbWFnZTtcbm1vZHVsZS5leHBvcnRzID0gSW1hZ2U7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUVBLE1BQU1BLFdBQVcsR0FBR0MsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxJQUFELEVBQU8sSUFBUCxFQUFhLElBQWIsRUFBbUIsSUFBbkIsQ0FBWixDQUFwQjtBQUVBLE1BQU1DLEtBQWUsR0FBRztFQUN0QkMsRUFBRSxFQUFFLElBRGtCO0VBRXRCQyxJQUFJLEVBQUUsT0FGZ0I7RUFHdEJDLElBQUksRUFBRSxPQUhnQjtFQUl0QkMsWUFBWSxFQUFFLElBSlE7RUFNdEJDLFdBQVcsRUFBRSxZQUFXO0lBQ3RCLE9BQU8sT0FBUDtFQUNELENBUnFCO0VBVXRCQyxhQUFhLEVBQUUsVUFBU0MsU0FBVCxFQUFvQjtJQUNqQyxJQUFJQSxTQUFTLENBQUNDLEtBQVYsSUFBbUIsSUFBdkIsRUFBNkI7TUFDM0IsTUFBTUEsS0FBSyxHQUFHRCxTQUFTLENBQUNDLEtBQXhCLENBRDJCLENBQ1c7O01BQ3RDLE9BQU9BLEtBQUssQ0FBQ0MsTUFBYjtJQUNELENBSEQsTUFHTztNQUNMLE9BQU8sQ0FBQyxDQUFSO0lBQ0Q7RUFDRixDQWpCcUI7O0VBbUJ0QkMsZ0JBQWdCLENBQUNILFNBQUQsRUFBWTtJQUMxQixNQUFNSSxNQUFNLEdBQUdiLE1BQU0sQ0FBQ2MsS0FBUCxDQUFhLENBQWIsQ0FBZjtJQUNBRCxNQUFNLENBQUNFLFVBQVAsQ0FBa0IsS0FBS1osRUFBdkIsRUFBMkIsQ0FBM0I7SUFDQVUsTUFBTSxDQUFDRyxZQUFQLENBQW9CUCxTQUFTLENBQUNFLE1BQTlCLEVBQXVDLENBQXZDO0lBQ0EsT0FBT0UsTUFBUDtFQUNELENBeEJxQjs7RUEwQnRCSSx1QkFBdUIsQ0FBQ1IsU0FBRCxFQUFZUyxPQUFaLEVBQXFCO0lBQzFDLElBQUlULFNBQVMsQ0FBQ0MsS0FBVixJQUFtQixJQUF2QixFQUE2QjtNQUMzQixPQUFPWCxXQUFQO0lBQ0Q7O0lBRUQsTUFBTWMsTUFBTSxHQUFHYixNQUFNLENBQUNjLEtBQVAsQ0FBYSxDQUFiLENBQWY7SUFDQUQsTUFBTSxDQUFDRyxZQUFQLENBQW9CUCxTQUFTLENBQUNDLEtBQVYsQ0FBZ0JDLE1BQXBDLEVBQTZDLENBQTdDO0lBQ0EsT0FBT0UsTUFBUDtFQUNELENBbENxQjs7RUFvQ3RCLENBQUVNLHFCQUFGLENBQXdCVixTQUF4QixFQUFtQ1MsT0FBbkMsRUFBNEM7SUFDMUMsSUFBSVQsU0FBUyxDQUFDQyxLQUFWLElBQW1CLElBQXZCLEVBQTZCO01BQzNCO0lBQ0Q7O0lBRUQsTUFBTUQsU0FBUyxDQUFDQyxLQUFoQjtFQUNELENBMUNxQjs7RUE0Q3RCVSxRQUFRLEVBQUUsVUFBU1YsS0FBVCxFQUErQjtJQUN2QyxJQUFJQSxLQUFLLElBQUksSUFBYixFQUFtQjtNQUNqQixPQUFPLElBQVA7SUFDRDs7SUFDRCxJQUFJLENBQUNWLE1BQU0sQ0FBQ3FCLFFBQVAsQ0FBZ0JYLEtBQWhCLENBQUwsRUFBNkI7TUFDM0IsTUFBTSxJQUFJWSxTQUFKLENBQWMsaUJBQWQsQ0FBTjtJQUNEOztJQUNELE9BQU9aLEtBQVA7RUFDRDtBQXBEcUIsQ0FBeEI7ZUF1RGVSLEs7O0FBQ2ZxQixNQUFNLENBQUNDLE9BQVAsR0FBaUJ0QixLQUFqQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _intn = _interopRequireDefault(require("./intn"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const NULL_LENGTH = Buffer.from([0x00]);
const DATA_LENGTH = Buffer.from([0x04]);
const Int = {
  id: 0x38,
  type: 'INT4',
  name: 'Int',
  declaration: function () {
    return 'int';
  },

  generateTypeInfo() {
    return Buffer.from([_intn.default.id, 0x04]);
  },

  generateParameterLength(parameter, options) {
    if (parameter.value == null) {
      return NULL_LENGTH;
    }

    return DATA_LENGTH;
  },

  *generateParameterData(parameter, options) {
    if (parameter.value == null) {
      return;
    }

    const buffer = Buffer.alloc(4);
    buffer.writeInt32LE(Number(parameter.value), 0);
    yield buffer;
  },

  validate: function (value) {
    if (value == null) {
      return null;
    }

    if (typeof value !== 'number') {
      value = Number(value);
    }

    if (isNaN(value)) {
      throw new TypeError('Invalid number.');
    }

    if (value < -2147483648 || value > 2147483647) {
      throw new TypeError('Value must be between -2147483648 and 2147483647, inclusive.');
    }

    return value | 0;
  }
};
var _default = Int;
exports.default = _default;
module.exports = Int;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOVUxMX0xFTkdUSCIsIkJ1ZmZlciIsImZyb20iLCJEQVRBX0xFTkdUSCIsIkludCIsImlkIiwidHlwZSIsIm5hbWUiLCJkZWNsYXJhdGlvbiIsImdlbmVyYXRlVHlwZUluZm8iLCJJbnROIiwiZ2VuZXJhdGVQYXJhbWV0ZXJMZW5ndGgiLCJwYXJhbWV0ZXIiLCJvcHRpb25zIiwidmFsdWUiLCJnZW5lcmF0ZVBhcmFtZXRlckRhdGEiLCJidWZmZXIiLCJhbGxvYyIsIndyaXRlSW50MzJMRSIsIk51bWJlciIsInZhbGlkYXRlIiwiaXNOYU4iLCJUeXBlRXJyb3IiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGEtdHlwZXMvaW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi4vZGF0YS10eXBlJztcbmltcG9ydCBJbnROIGZyb20gJy4vaW50bic7XG5cbmNvbnN0IE5VTExfTEVOR1RIID0gQnVmZmVyLmZyb20oWzB4MDBdKTtcbmNvbnN0IERBVEFfTEVOR1RIID0gQnVmZmVyLmZyb20oWzB4MDRdKTtcblxuY29uc3QgSW50OiBEYXRhVHlwZSA9IHtcbiAgaWQ6IDB4MzgsXG4gIHR5cGU6ICdJTlQ0JyxcbiAgbmFtZTogJ0ludCcsXG5cbiAgZGVjbGFyYXRpb246IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAnaW50JztcbiAgfSxcblxuICBnZW5lcmF0ZVR5cGVJbmZvKCkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShbSW50Ti5pZCwgMHgwNF0pO1xuICB9LFxuXG4gIGdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoKHBhcmFtZXRlciwgb3B0aW9ucykge1xuICAgIGlmIChwYXJhbWV0ZXIudmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIE5VTExfTEVOR1RIO1xuICAgIH1cblxuICAgIHJldHVybiBEQVRBX0xFTkdUSDtcbiAgfSxcblxuICAqIGdlbmVyYXRlUGFyYW1ldGVyRGF0YShwYXJhbWV0ZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAocGFyYW1ldGVyLnZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2MoNCk7XG4gICAgYnVmZmVyLndyaXRlSW50MzJMRShOdW1iZXIocGFyYW1ldGVyLnZhbHVlKSwgMCk7XG4gICAgeWllbGQgYnVmZmVyO1xuICB9LFxuXG4gIHZhbGlkYXRlOiBmdW5jdGlvbih2YWx1ZSk6IG51bWJlciB8IG51bGwge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbnVtYmVyLicpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA8IC0yMTQ3NDgzNjQ4IHx8IHZhbHVlID4gMjE0NzQ4MzY0Nykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVmFsdWUgbXVzdCBiZSBiZXR3ZWVuIC0yMTQ3NDgzNjQ4IGFuZCAyMTQ3NDgzNjQ3LCBpbmNsdXNpdmUuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlIHwgMDtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgSW50O1xubW9kdWxlLmV4cG9ydHMgPSBJbnQ7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7OztBQUVBLE1BQU1BLFdBQVcsR0FBR0MsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxJQUFELENBQVosQ0FBcEI7QUFDQSxNQUFNQyxXQUFXLEdBQUdGLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxDQUFaLENBQXBCO0FBRUEsTUFBTUUsR0FBYSxHQUFHO0VBQ3BCQyxFQUFFLEVBQUUsSUFEZ0I7RUFFcEJDLElBQUksRUFBRSxNQUZjO0VBR3BCQyxJQUFJLEVBQUUsS0FIYztFQUtwQkMsV0FBVyxFQUFFLFlBQVc7SUFDdEIsT0FBTyxLQUFQO0VBQ0QsQ0FQbUI7O0VBU3BCQyxnQkFBZ0IsR0FBRztJQUNqQixPQUFPUixNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDUSxjQUFLTCxFQUFOLEVBQVUsSUFBVixDQUFaLENBQVA7RUFDRCxDQVhtQjs7RUFhcEJNLHVCQUF1QixDQUFDQyxTQUFELEVBQVlDLE9BQVosRUFBcUI7SUFDMUMsSUFBSUQsU0FBUyxDQUFDRSxLQUFWLElBQW1CLElBQXZCLEVBQTZCO01BQzNCLE9BQU9kLFdBQVA7SUFDRDs7SUFFRCxPQUFPRyxXQUFQO0VBQ0QsQ0FuQm1COztFQXFCcEIsQ0FBRVkscUJBQUYsQ0FBd0JILFNBQXhCLEVBQW1DQyxPQUFuQyxFQUE0QztJQUMxQyxJQUFJRCxTQUFTLENBQUNFLEtBQVYsSUFBbUIsSUFBdkIsRUFBNkI7TUFDM0I7SUFDRDs7SUFFRCxNQUFNRSxNQUFNLEdBQUdmLE1BQU0sQ0FBQ2dCLEtBQVAsQ0FBYSxDQUFiLENBQWY7SUFDQUQsTUFBTSxDQUFDRSxZQUFQLENBQW9CQyxNQUFNLENBQUNQLFNBQVMsQ0FBQ0UsS0FBWCxDQUExQixFQUE2QyxDQUE3QztJQUNBLE1BQU1FLE1BQU47RUFDRCxDQTdCbUI7O0VBK0JwQkksUUFBUSxFQUFFLFVBQVNOLEtBQVQsRUFBK0I7SUFDdkMsSUFBSUEsS0FBSyxJQUFJLElBQWIsRUFBbUI7TUFDakIsT0FBTyxJQUFQO0lBQ0Q7O0lBRUQsSUFBSSxPQUFPQSxLQUFQLEtBQWlCLFFBQXJCLEVBQStCO01BQzdCQSxLQUFLLEdBQUdLLE1BQU0sQ0FBQ0wsS0FBRCxDQUFkO0lBQ0Q7O0lBRUQsSUFBSU8sS0FBSyxDQUFDUCxLQUFELENBQVQsRUFBa0I7TUFDaEIsTUFBTSxJQUFJUSxTQUFKLENBQWMsaUJBQWQsQ0FBTjtJQUNEOztJQUVELElBQUlSLEtBQUssR0FBRyxDQUFDLFVBQVQsSUFBdUJBLEtBQUssR0FBRyxVQUFuQyxFQUErQztNQUM3QyxNQUFNLElBQUlRLFNBQUosQ0FBYyw4REFBZCxDQUFOO0lBQ0Q7O0lBRUQsT0FBT1IsS0FBSyxHQUFHLENBQWY7RUFDRDtBQWpEbUIsQ0FBdEI7ZUFvRGVWLEc7O0FBQ2ZtQixNQUFNLENBQUNDLE9BQVAsR0FBaUJwQixHQUFqQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
const IntN = {
  id: 0x26,
  type: 'INTN',
  name: 'IntN',

  declaration() {
    throw new Error('not implemented');
  },

  generateTypeInfo() {
    throw new Error('not implemented');
  },

  generateParameterLength() {
    throw new Error('not implemented');
  },

  generateParameterData() {
    throw new Error('not implemented');
  },

  validate() {
    throw new Error('not implemented');
  }

};
var _default = IntN;
exports.default = _default;
module.exports = IntN;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbnROIiwiaWQiLCJ0eXBlIiwibmFtZSIsImRlY2xhcmF0aW9uIiwiRXJyb3IiLCJnZW5lcmF0ZVR5cGVJbmZvIiwiZ2VuZXJhdGVQYXJhbWV0ZXJMZW5ndGgiLCJnZW5lcmF0ZVBhcmFtZXRlckRhdGEiLCJ2YWxpZGF0ZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YS10eXBlcy9pbnRuLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi4vZGF0YS10eXBlJztcblxuY29uc3QgSW50TjogRGF0YVR5cGUgPSB7XG4gIGlkOiAweDI2LFxuICB0eXBlOiAnSU5UTicsXG4gIG5hbWU6ICdJbnROJyxcblxuICBkZWNsYXJhdGlvbigpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICB9LFxuXG4gIGdlbmVyYXRlVHlwZUluZm8oKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgfSxcblxuICBnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICB9LFxuXG4gIGdlbmVyYXRlUGFyYW1ldGVyRGF0YSgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICB9LFxuXG4gIHZhbGlkYXRlKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEludE47XG5tb2R1bGUuZXhwb3J0cyA9IEludE47XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUVBLE1BQU1BLElBQWMsR0FBRztFQUNyQkMsRUFBRSxFQUFFLElBRGlCO0VBRXJCQyxJQUFJLEVBQUUsTUFGZTtFQUdyQkMsSUFBSSxFQUFFLE1BSGU7O0VBS3JCQyxXQUFXLEdBQUc7SUFDWixNQUFNLElBQUlDLEtBQUosQ0FBVSxpQkFBVixDQUFOO0VBQ0QsQ0FQb0I7O0VBU3JCQyxnQkFBZ0IsR0FBRztJQUNqQixNQUFNLElBQUlELEtBQUosQ0FBVSxpQkFBVixDQUFOO0VBQ0QsQ0FYb0I7O0VBYXJCRSx1QkFBdUIsR0FBRztJQUN4QixNQUFNLElBQUlGLEtBQUosQ0FBVSxpQkFBVixDQUFOO0VBQ0QsQ0Fmb0I7O0VBaUJyQkcscUJBQXFCLEdBQUc7SUFDdEIsTUFBTSxJQUFJSCxLQUFKLENBQVUsaUJBQVYsQ0FBTjtFQUNELENBbkJvQjs7RUFxQnJCSSxRQUFRLEdBQUc7SUFDVCxNQUFNLElBQUlKLEtBQUosQ0FBVSxpQkFBVixDQUFOO0VBQ0Q7O0FBdkJvQixDQUF2QjtlQTBCZUwsSTs7QUFDZlUsTUFBTSxDQUFDQyxPQUFQLEdBQWlCWCxJQUFqQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _moneyn = _interopRequireDefault(require("./moneyn"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const SHIFT_LEFT_32 = (1 << 16) * (1 << 16);
const SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
const NULL_LENGTH = Buffer.from([0x00]);
const DATA_LENGTH = Buffer.from([0x08]);
const Money = {
  id: 0x3C,
  type: 'MONEY',
  name: 'Money',
  declaration: function () {
    return 'money';
  },
  generateTypeInfo: function () {
    return Buffer.from([_moneyn.default.id, 0x08]);
  },

  generateParameterLength(parameter, options) {
    if (parameter.value == null) {
      return NULL_LENGTH;
    }

    return DATA_LENGTH;
  },

  *generateParameterData(parameter, options) {
    if (parameter.value == null) {
      return;
    }

    const value = parameter.value * 10000;
    const buffer = Buffer.alloc(8);
    buffer.writeInt32LE(Math.floor(value * SHIFT_RIGHT_32), 0);
    buffer.writeInt32LE(value & -1, 4);
    yield buffer;
  },

  validate: function (value) {
    if (value == null) {
      return null;
    }

    value = parseFloat(value);

    if (isNaN(value)) {
      throw new TypeError('Invalid number.');
    }

    return value;
  }
};
var _default = Money;
exports.default = _default;
module.exports = Money;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTSElGVF9MRUZUXzMyIiwiU0hJRlRfUklHSFRfMzIiLCJOVUxMX0xFTkdUSCIsIkJ1ZmZlciIsImZyb20iLCJEQVRBX0xFTkdUSCIsIk1vbmV5IiwiaWQiLCJ0eXBlIiwibmFtZSIsImRlY2xhcmF0aW9uIiwiZ2VuZXJhdGVUeXBlSW5mbyIsIk1vbmV5TiIsImdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoIiwicGFyYW1ldGVyIiwib3B0aW9ucyIsInZhbHVlIiwiZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhIiwiYnVmZmVyIiwiYWxsb2MiLCJ3cml0ZUludDMyTEUiLCJNYXRoIiwiZmxvb3IiLCJ2YWxpZGF0ZSIsInBhcnNlRmxvYXQiLCJpc05hTiIsIlR5cGVFcnJvciIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YS10eXBlcy9tb25leS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4uL2RhdGEtdHlwZSc7XG5pbXBvcnQgTW9uZXlOIGZyb20gJy4vbW9uZXluJztcblxuY29uc3QgU0hJRlRfTEVGVF8zMiA9ICgxIDw8IDE2KSAqICgxIDw8IDE2KTtcbmNvbnN0IFNISUZUX1JJR0hUXzMyID0gMSAvIFNISUZUX0xFRlRfMzI7XG5cbmNvbnN0IE5VTExfTEVOR1RIID0gQnVmZmVyLmZyb20oWzB4MDBdKTtcbmNvbnN0IERBVEFfTEVOR1RIID0gQnVmZmVyLmZyb20oWzB4MDhdKTtcblxuY29uc3QgTW9uZXk6IERhdGFUeXBlID0ge1xuICBpZDogMHgzQyxcbiAgdHlwZTogJ01PTkVZJyxcbiAgbmFtZTogJ01vbmV5JyxcblxuICBkZWNsYXJhdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICdtb25leSc7XG4gIH0sXG5cbiAgZ2VuZXJhdGVUeXBlSW5mbzogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKFtNb25leU4uaWQsIDB4MDhdKTtcbiAgfSxcblxuICBnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aChwYXJhbWV0ZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAocGFyYW1ldGVyLnZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBOVUxMX0xFTkdUSDtcbiAgICB9XG5cbiAgICByZXR1cm4gREFUQV9MRU5HVEg7XG4gIH0sXG5cbiAgKiBnZW5lcmF0ZVBhcmFtZXRlckRhdGEocGFyYW1ldGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKHBhcmFtZXRlci52YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBwYXJhbWV0ZXIudmFsdWUgKiAxMDAwMDtcblxuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg4KTtcbiAgICBidWZmZXIud3JpdGVJbnQzMkxFKE1hdGguZmxvb3IodmFsdWUgKiBTSElGVF9SSUdIVF8zMiksIDApO1xuICAgIGJ1ZmZlci53cml0ZUludDMyTEUodmFsdWUgJiAtMSwgNCk7XG4gICAgeWllbGQgYnVmZmVyO1xuICB9LFxuXG4gIHZhbGlkYXRlOiBmdW5jdGlvbih2YWx1ZSk6IG51bWJlciB8IG51bGwge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG51bWJlci4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNb25leTtcbm1vZHVsZS5leHBvcnRzID0gTW9uZXk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7OztBQUVBLE1BQU1BLGFBQWEsR0FBRyxDQUFDLEtBQUssRUFBTixLQUFhLEtBQUssRUFBbEIsQ0FBdEI7QUFDQSxNQUFNQyxjQUFjLEdBQUcsSUFBSUQsYUFBM0I7QUFFQSxNQUFNRSxXQUFXLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxDQUFaLENBQXBCO0FBQ0EsTUFBTUMsV0FBVyxHQUFHRixNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDLElBQUQsQ0FBWixDQUFwQjtBQUVBLE1BQU1FLEtBQWUsR0FBRztFQUN0QkMsRUFBRSxFQUFFLElBRGtCO0VBRXRCQyxJQUFJLEVBQUUsT0FGZ0I7RUFHdEJDLElBQUksRUFBRSxPQUhnQjtFQUt0QkMsV0FBVyxFQUFFLFlBQVc7SUFDdEIsT0FBTyxPQUFQO0VBQ0QsQ0FQcUI7RUFTdEJDLGdCQUFnQixFQUFFLFlBQVc7SUFDM0IsT0FBT1IsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQ1EsZ0JBQU9MLEVBQVIsRUFBWSxJQUFaLENBQVosQ0FBUDtFQUNELENBWHFCOztFQWF0Qk0sdUJBQXVCLENBQUNDLFNBQUQsRUFBWUMsT0FBWixFQUFxQjtJQUMxQyxJQUFJRCxTQUFTLENBQUNFLEtBQVYsSUFBbUIsSUFBdkIsRUFBNkI7TUFDM0IsT0FBT2QsV0FBUDtJQUNEOztJQUVELE9BQU9HLFdBQVA7RUFDRCxDQW5CcUI7O0VBcUJ0QixDQUFFWSxxQkFBRixDQUF3QkgsU0FBeEIsRUFBbUNDLE9BQW5DLEVBQTRDO0lBQzFDLElBQUlELFNBQVMsQ0FBQ0UsS0FBVixJQUFtQixJQUF2QixFQUE2QjtNQUMzQjtJQUNEOztJQUVELE1BQU1BLEtBQUssR0FBR0YsU0FBUyxDQUFDRSxLQUFWLEdBQWtCLEtBQWhDO0lBRUEsTUFBTUUsTUFBTSxHQUFHZixNQUFNLENBQUNnQixLQUFQLENBQWEsQ0FBYixDQUFmO0lBQ0FELE1BQU0sQ0FBQ0UsWUFBUCxDQUFvQkMsSUFBSSxDQUFDQyxLQUFMLENBQVdOLEtBQUssR0FBR2YsY0FBbkIsQ0FBcEIsRUFBd0QsQ0FBeEQ7SUFDQWlCLE1BQU0sQ0FBQ0UsWUFBUCxDQUFvQkosS0FBSyxHQUFHLENBQUMsQ0FBN0IsRUFBZ0MsQ0FBaEM7SUFDQSxNQUFNRSxNQUFOO0VBQ0QsQ0FoQ3FCOztFQWtDdEJLLFFBQVEsRUFBRSxVQUFTUCxLQUFULEVBQStCO0lBQ3ZDLElBQUlBLEtBQUssSUFBSSxJQUFiLEVBQW1CO01BQ2pCLE9BQU8sSUFBUDtJQUNEOztJQUNEQSxLQUFLLEdBQUdRLFVBQVUsQ0FBQ1IsS0FBRCxDQUFsQjs7SUFDQSxJQUFJUyxLQUFLLENBQUNULEtBQUQsQ0FBVCxFQUFrQjtNQUNoQixNQUFNLElBQUlVLFNBQUosQ0FBYyxpQkFBZCxDQUFOO0lBQ0Q7O0lBQ0QsT0FBT1YsS0FBUDtFQUNEO0FBM0NxQixDQUF4QjtlQThDZVYsSzs7QUFDZnFCLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQnRCLEtBQWpCIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
const MoneyN = {
  id: 0x6E,
  type: 'MONEYN',
  name: 'MoneyN',

  declaration() {
    throw new Error('not implemented');
  },

  generateTypeInfo() {
    throw new Error('not implemented');
  },

  generateParameterLength() {
    throw new Error('not implemented');
  },

  generateParameterData() {
    throw new Error('not implemented');
  },

  validate() {
    throw new Error('not implemented');
  }

};
var _default = MoneyN;
exports.default = _default;
module.exports = MoneyN;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNb25leU4iLCJpZCIsInR5cGUiLCJuYW1lIiwiZGVjbGFyYXRpb24iLCJFcnJvciIsImdlbmVyYXRlVHlwZUluZm8iLCJnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aCIsImdlbmVyYXRlUGFyYW1ldGVyRGF0YSIsInZhbGlkYXRlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhLXR5cGVzL21vbmV5bi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4uL2RhdGEtdHlwZSc7XG5cbmNvbnN0IE1vbmV5TjogRGF0YVR5cGUgPSB7XG4gIGlkOiAweDZFLFxuICB0eXBlOiAnTU9ORVlOJyxcbiAgbmFtZTogJ01vbmV5TicsXG5cbiAgZGVjbGFyYXRpb24oKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgfSxcblxuICBnZW5lcmF0ZVR5cGVJbmZvKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gIH0sXG5cbiAgZ2VuZXJhdGVQYXJhbWV0ZXJMZW5ndGgoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgfSxcblxuICBnZW5lcmF0ZVBhcmFtZXRlckRhdGEoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgfSxcblxuICB2YWxpZGF0ZSgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNb25leU47XG5tb2R1bGUuZXhwb3J0cyA9IE1vbmV5TjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUEsTUFBTUEsTUFBZ0IsR0FBRztFQUN2QkMsRUFBRSxFQUFFLElBRG1CO0VBRXZCQyxJQUFJLEVBQUUsUUFGaUI7RUFHdkJDLElBQUksRUFBRSxRQUhpQjs7RUFLdkJDLFdBQVcsR0FBRztJQUNaLE1BQU0sSUFBSUMsS0FBSixDQUFVLGlCQUFWLENBQU47RUFDRCxDQVBzQjs7RUFTdkJDLGdCQUFnQixHQUFHO0lBQ2pCLE1BQU0sSUFBSUQsS0FBSixDQUFVLGlCQUFWLENBQU47RUFDRCxDQVhzQjs7RUFhdkJFLHVCQUF1QixHQUFHO0lBQ3hCLE1BQU0sSUFBSUYsS0FBSixDQUFVLGlCQUFWLENBQU47RUFDRCxDQWZzQjs7RUFpQnZCRyxxQkFBcUIsR0FBRztJQUN0QixNQUFNLElBQUlILEtBQUosQ0FBVSxpQkFBVixDQUFOO0VBQ0QsQ0FuQnNCOztFQXFCdkJJLFFBQVEsR0FBRztJQUNULE1BQU0sSUFBSUosS0FBSixDQUFVLGlCQUFWLENBQU47RUFDRDs7QUF2QnNCLENBQXpCO2VBMEJlTCxNOztBQUNmVSxNQUFNLENBQUNDLE9BQVAsR0FBaUJYLE1BQWpCIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
const NULL_LENGTH = Buffer.from([0xFF, 0xFF]);
const NChar = {
  id: 0xEF,
  type: 'NCHAR',
  name: 'NChar',
  maximumLength: 4000,
  declaration: function (parameter) {
    // const value = parameter.value as null | string | { toString(): string };
    const value = parameter.value; // Temporary solution. Remove 'any' later.

    let length;

    if (parameter.length) {
      length = parameter.length;
    } else if (parameter.value != null) {
      length = value.toString().length || 1;
    } else if (parameter.value === null && !parameter.output) {
      length = 1;
    } else {
      length = this.maximumLength;
    }

    if (length < this.maximumLength) {
      return 'nchar(' + length + ')';
    } else {
      return 'nchar(' + this.maximumLength + ')';
    }
  },
  resolveLength: function (parameter) {
    // const value = parameter.value as null | string | { toString(): string };
    const value = parameter.value; // Temporary solution. Remove 'any' later.

    if (parameter.length != null) {
      return parameter.length;
    } else if (parameter.value != null) {
      if (Buffer.isBuffer(parameter.value)) {
        return parameter.value.length / 2 || 1;
      } else {
        return value.toString().length || 1;
      }
    } else {
      return this.maximumLength;
    }
  },
  generateTypeInfo: function (parameter) {
    const buffer = Buffer.alloc(8);
    buffer.writeUInt8(this.id, 0);
    buffer.writeUInt16LE(parameter.length * 2, 1);

    if (parameter.collation) {
      parameter.collation.toBuffer().copy(buffer, 3, 0, 5);
    }

    return buffer;
  },

  generateParameterLength(parameter, options) {
    if (parameter.value == null) {
      return NULL_LENGTH;
    }

    const {
      value
    } = parameter;

    if (value instanceof Buffer) {
      const length = value.length;
      const buffer = Buffer.alloc(2);
      buffer.writeUInt16LE(length, 0);
      return buffer;
    } else {
      const length = Buffer.byteLength(value.toString(), 'ucs2');
      const buffer = Buffer.alloc(2);
      buffer.writeUInt16LE(length, 0);
      return buffer;
    }
  },

  *generateParameterData(parameter, options) {
    if (parameter.value == null) {
      return;
    }

    const value = parameter.value;

    if (value instanceof Buffer) {
      yield value;
    } else {
      yield Buffer.from(value, 'ucs2');
    }
  },

  validate: function (value) {
    if (value == null) {
      return null;
    }

    if (typeof value !== 'string') {
      throw new TypeError('Invalid string.');
    }

    return value;
  }
};
var _default = NChar;
exports.default = _default;
module.exports = NChar;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOVUxMX0xFTkdUSCIsIkJ1ZmZlciIsImZyb20iLCJOQ2hhciIsImlkIiwidHlwZSIsIm5hbWUiLCJtYXhpbXVtTGVuZ3RoIiwiZGVjbGFyYXRpb24iLCJwYXJhbWV0ZXIiLCJ2YWx1ZSIsImxlbmd0aCIsInRvU3RyaW5nIiwib3V0cHV0IiwicmVzb2x2ZUxlbmd0aCIsImlzQnVmZmVyIiwiZ2VuZXJhdGVUeXBlSW5mbyIsImJ1ZmZlciIsImFsbG9jIiwid3JpdGVVSW50OCIsIndyaXRlVUludDE2TEUiLCJjb2xsYXRpb24iLCJ0b0J1ZmZlciIsImNvcHkiLCJnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aCIsIm9wdGlvbnMiLCJieXRlTGVuZ3RoIiwiZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhIiwidmFsaWRhdGUiLCJUeXBlRXJyb3IiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGEtdHlwZXMvbmNoYXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuLi9kYXRhLXR5cGUnO1xuXG5jb25zdCBOVUxMX0xFTkdUSCA9IEJ1ZmZlci5mcm9tKFsweEZGLCAweEZGXSk7XG5cbmNvbnN0IE5DaGFyOiBEYXRhVHlwZSAmIHsgbWF4aW11bUxlbmd0aDogbnVtYmVyIH0gPSB7XG4gIGlkOiAweEVGLFxuICB0eXBlOiAnTkNIQVInLFxuICBuYW1lOiAnTkNoYXInLFxuICBtYXhpbXVtTGVuZ3RoOiA0MDAwLFxuXG4gIGRlY2xhcmF0aW9uOiBmdW5jdGlvbihwYXJhbWV0ZXIpIHtcbiAgICAvLyBjb25zdCB2YWx1ZSA9IHBhcmFtZXRlci52YWx1ZSBhcyBudWxsIHwgc3RyaW5nIHwgeyB0b1N0cmluZygpOiBzdHJpbmcgfTtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcmFtZXRlci52YWx1ZSBhcyBhbnk7IC8vIFRlbXBvcmFyeSBzb2x1dGlvbi4gUmVtb3ZlICdhbnknIGxhdGVyLlxuXG4gICAgbGV0IGxlbmd0aDtcbiAgICBpZiAocGFyYW1ldGVyLmxlbmd0aCkge1xuICAgICAgbGVuZ3RoID0gcGFyYW1ldGVyLmxlbmd0aDtcbiAgICB9IGVsc2UgaWYgKHBhcmFtZXRlci52YWx1ZSAhPSBudWxsKSB7XG4gICAgICBsZW5ndGggPSB2YWx1ZS50b1N0cmluZygpLmxlbmd0aCB8fCAxO1xuICAgIH0gZWxzZSBpZiAocGFyYW1ldGVyLnZhbHVlID09PSBudWxsICYmICFwYXJhbWV0ZXIub3V0cHV0KSB7XG4gICAgICBsZW5ndGggPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZW5ndGggPSB0aGlzLm1heGltdW1MZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKGxlbmd0aCA8IHRoaXMubWF4aW11bUxlbmd0aCkge1xuICAgICAgcmV0dXJuICduY2hhcignICsgbGVuZ3RoICsgJyknO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ25jaGFyKCcgKyB0aGlzLm1heGltdW1MZW5ndGggKyAnKSc7XG4gICAgfVxuICB9LFxuXG4gIHJlc29sdmVMZW5ndGg6IGZ1bmN0aW9uKHBhcmFtZXRlcikge1xuICAgIC8vIGNvbnN0IHZhbHVlID0gcGFyYW1ldGVyLnZhbHVlIGFzIG51bGwgfCBzdHJpbmcgfCB7IHRvU3RyaW5nKCk6IHN0cmluZyB9O1xuICAgIGNvbnN0IHZhbHVlID0gcGFyYW1ldGVyLnZhbHVlIGFzIGFueTsgLy8gVGVtcG9yYXJ5IHNvbHV0aW9uLiBSZW1vdmUgJ2FueScgbGF0ZXIuXG5cbiAgICBpZiAocGFyYW1ldGVyLmxlbmd0aCAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gcGFyYW1ldGVyLmxlbmd0aDtcbiAgICB9IGVsc2UgaWYgKHBhcmFtZXRlci52YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKHBhcmFtZXRlci52YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIChwYXJhbWV0ZXIudmFsdWUubGVuZ3RoIC8gMikgfHwgMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpLmxlbmd0aCB8fCAxO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXhpbXVtTGVuZ3RoO1xuICAgIH1cbiAgfSxcblxuICBnZW5lcmF0ZVR5cGVJbmZvOiBmdW5jdGlvbihwYXJhbWV0ZXIpIHtcbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2MoOCk7XG4gICAgYnVmZmVyLndyaXRlVUludDgodGhpcy5pZCwgMCk7XG4gICAgYnVmZmVyLndyaXRlVUludDE2TEUocGFyYW1ldGVyLmxlbmd0aCEgKiAyLCAxKTtcblxuICAgIGlmIChwYXJhbWV0ZXIuY29sbGF0aW9uKSB7XG4gICAgICBwYXJhbWV0ZXIuY29sbGF0aW9uLnRvQnVmZmVyKCkuY29weShidWZmZXIsIDMsIDAsIDUpO1xuICAgIH1cblxuICAgIHJldHVybiBidWZmZXI7XG4gIH0sXG5cbiAgZ2VuZXJhdGVQYXJhbWV0ZXJMZW5ndGgocGFyYW1ldGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKHBhcmFtZXRlci52YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gTlVMTF9MRU5HVEg7XG4gICAgfVxuXG4gICAgY29uc3QgeyB2YWx1ZSB9ID0gcGFyYW1ldGVyO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgY29uc3QgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jKDIpO1xuXG4gICAgICBidWZmZXIud3JpdGVVSW50MTZMRShsZW5ndGgsIDApO1xuXG4gICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBsZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aCh2YWx1ZS50b1N0cmluZygpLCAndWNzMicpO1xuXG4gICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2MoMik7XG4gICAgICBidWZmZXIud3JpdGVVSW50MTZMRShsZW5ndGgsIDApO1xuICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICB9XG4gIH0sXG5cbiAgKiBnZW5lcmF0ZVBhcmFtZXRlckRhdGEocGFyYW1ldGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKHBhcmFtZXRlci52YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBwYXJhbWV0ZXIudmFsdWU7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICB5aWVsZCB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgeWllbGQgQnVmZmVyLmZyb20odmFsdWUsICd1Y3MyJyk7XG4gICAgfVxuICB9LFxuXG4gIHZhbGlkYXRlOiBmdW5jdGlvbih2YWx1ZSk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBzdHJpbmcuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBOQ2hhcjtcbm1vZHVsZS5leHBvcnRzID0gTkNoYXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUVBLE1BQU1BLFdBQVcsR0FBR0MsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxJQUFELEVBQU8sSUFBUCxDQUFaLENBQXBCO0FBRUEsTUFBTUMsS0FBMkMsR0FBRztFQUNsREMsRUFBRSxFQUFFLElBRDhDO0VBRWxEQyxJQUFJLEVBQUUsT0FGNEM7RUFHbERDLElBQUksRUFBRSxPQUg0QztFQUlsREMsYUFBYSxFQUFFLElBSm1DO0VBTWxEQyxXQUFXLEVBQUUsVUFBU0MsU0FBVCxFQUFvQjtJQUMvQjtJQUNBLE1BQU1DLEtBQUssR0FBR0QsU0FBUyxDQUFDQyxLQUF4QixDQUYrQixDQUVPOztJQUV0QyxJQUFJQyxNQUFKOztJQUNBLElBQUlGLFNBQVMsQ0FBQ0UsTUFBZCxFQUFzQjtNQUNwQkEsTUFBTSxHQUFHRixTQUFTLENBQUNFLE1BQW5CO0lBQ0QsQ0FGRCxNQUVPLElBQUlGLFNBQVMsQ0FBQ0MsS0FBVixJQUFtQixJQUF2QixFQUE2QjtNQUNsQ0MsTUFBTSxHQUFHRCxLQUFLLENBQUNFLFFBQU4sR0FBaUJELE1BQWpCLElBQTJCLENBQXBDO0lBQ0QsQ0FGTSxNQUVBLElBQUlGLFNBQVMsQ0FBQ0MsS0FBVixLQUFvQixJQUFwQixJQUE0QixDQUFDRCxTQUFTLENBQUNJLE1BQTNDLEVBQW1EO01BQ3hERixNQUFNLEdBQUcsQ0FBVDtJQUNELENBRk0sTUFFQTtNQUNMQSxNQUFNLEdBQUcsS0FBS0osYUFBZDtJQUNEOztJQUVELElBQUlJLE1BQU0sR0FBRyxLQUFLSixhQUFsQixFQUFpQztNQUMvQixPQUFPLFdBQVdJLE1BQVgsR0FBb0IsR0FBM0I7SUFDRCxDQUZELE1BRU87TUFDTCxPQUFPLFdBQVcsS0FBS0osYUFBaEIsR0FBZ0MsR0FBdkM7SUFDRDtFQUNGLENBMUJpRDtFQTRCbERPLGFBQWEsRUFBRSxVQUFTTCxTQUFULEVBQW9CO0lBQ2pDO0lBQ0EsTUFBTUMsS0FBSyxHQUFHRCxTQUFTLENBQUNDLEtBQXhCLENBRmlDLENBRUs7O0lBRXRDLElBQUlELFNBQVMsQ0FBQ0UsTUFBVixJQUFvQixJQUF4QixFQUE4QjtNQUM1QixPQUFPRixTQUFTLENBQUNFLE1BQWpCO0lBQ0QsQ0FGRCxNQUVPLElBQUlGLFNBQVMsQ0FBQ0MsS0FBVixJQUFtQixJQUF2QixFQUE2QjtNQUNsQyxJQUFJVCxNQUFNLENBQUNjLFFBQVAsQ0FBZ0JOLFNBQVMsQ0FBQ0MsS0FBMUIsQ0FBSixFQUFzQztRQUNwQyxPQUFRRCxTQUFTLENBQUNDLEtBQVYsQ0FBZ0JDLE1BQWhCLEdBQXlCLENBQTFCLElBQWdDLENBQXZDO01BQ0QsQ0FGRCxNQUVPO1FBQ0wsT0FBT0QsS0FBSyxDQUFDRSxRQUFOLEdBQWlCRCxNQUFqQixJQUEyQixDQUFsQztNQUNEO0lBQ0YsQ0FOTSxNQU1BO01BQ0wsT0FBTyxLQUFLSixhQUFaO0lBQ0Q7RUFDRixDQTNDaUQ7RUE2Q2xEUyxnQkFBZ0IsRUFBRSxVQUFTUCxTQUFULEVBQW9CO0lBQ3BDLE1BQU1RLE1BQU0sR0FBR2hCLE1BQU0sQ0FBQ2lCLEtBQVAsQ0FBYSxDQUFiLENBQWY7SUFDQUQsTUFBTSxDQUFDRSxVQUFQLENBQWtCLEtBQUtmLEVBQXZCLEVBQTJCLENBQTNCO0lBQ0FhLE1BQU0sQ0FBQ0csYUFBUCxDQUFxQlgsU0FBUyxDQUFDRSxNQUFWLEdBQW9CLENBQXpDLEVBQTRDLENBQTVDOztJQUVBLElBQUlGLFNBQVMsQ0FBQ1ksU0FBZCxFQUF5QjtNQUN2QlosU0FBUyxDQUFDWSxTQUFWLENBQW9CQyxRQUFwQixHQUErQkMsSUFBL0IsQ0FBb0NOLE1BQXBDLEVBQTRDLENBQTVDLEVBQStDLENBQS9DLEVBQWtELENBQWxEO0lBQ0Q7O0lBRUQsT0FBT0EsTUFBUDtFQUNELENBdkRpRDs7RUF5RGxETyx1QkFBdUIsQ0FBQ2YsU0FBRCxFQUFZZ0IsT0FBWixFQUFxQjtJQUMxQyxJQUFJaEIsU0FBUyxDQUFDQyxLQUFWLElBQW1CLElBQXZCLEVBQTZCO01BQzNCLE9BQU9WLFdBQVA7SUFDRDs7SUFFRCxNQUFNO01BQUVVO0lBQUYsSUFBWUQsU0FBbEI7O0lBQ0EsSUFBSUMsS0FBSyxZQUFZVCxNQUFyQixFQUE2QjtNQUMzQixNQUFNVSxNQUFNLEdBQUdELEtBQUssQ0FBQ0MsTUFBckI7TUFDQSxNQUFNTSxNQUFNLEdBQUdoQixNQUFNLENBQUNpQixLQUFQLENBQWEsQ0FBYixDQUFmO01BRUFELE1BQU0sQ0FBQ0csYUFBUCxDQUFxQlQsTUFBckIsRUFBNkIsQ0FBN0I7TUFFQSxPQUFPTSxNQUFQO0lBQ0QsQ0FQRCxNQU9PO01BQ0wsTUFBTU4sTUFBTSxHQUFHVixNQUFNLENBQUN5QixVQUFQLENBQWtCaEIsS0FBSyxDQUFDRSxRQUFOLEVBQWxCLEVBQW9DLE1BQXBDLENBQWY7TUFFQSxNQUFNSyxNQUFNLEdBQUdoQixNQUFNLENBQUNpQixLQUFQLENBQWEsQ0FBYixDQUFmO01BQ0FELE1BQU0sQ0FBQ0csYUFBUCxDQUFxQlQsTUFBckIsRUFBNkIsQ0FBN0I7TUFDQSxPQUFPTSxNQUFQO0lBQ0Q7RUFDRixDQTdFaUQ7O0VBK0VsRCxDQUFFVSxxQkFBRixDQUF3QmxCLFNBQXhCLEVBQW1DZ0IsT0FBbkMsRUFBNEM7SUFDMUMsSUFBSWhCLFNBQVMsQ0FBQ0MsS0FBVixJQUFtQixJQUF2QixFQUE2QjtNQUMzQjtJQUNEOztJQUVELE1BQU1BLEtBQUssR0FBR0QsU0FBUyxDQUFDQyxLQUF4Qjs7SUFDQSxJQUFJQSxLQUFLLFlBQVlULE1BQXJCLEVBQTZCO01BQzNCLE1BQU1TLEtBQU47SUFDRCxDQUZELE1BRU87TUFDTCxNQUFNVCxNQUFNLENBQUNDLElBQVAsQ0FBWVEsS0FBWixFQUFtQixNQUFuQixDQUFOO0lBQ0Q7RUFDRixDQTFGaUQ7O0VBNEZsRGtCLFFBQVEsRUFBRSxVQUFTbEIsS0FBVCxFQUErQjtJQUN2QyxJQUFJQSxLQUFLLElBQUksSUFBYixFQUFtQjtNQUNqQixPQUFPLElBQVA7SUFDRDs7SUFFRCxJQUFJLE9BQU9BLEtBQVAsS0FBaUIsUUFBckIsRUFBK0I7TUFDN0IsTUFBTSxJQUFJbUIsU0FBSixDQUFjLGlCQUFkLENBQU47SUFDRDs7SUFFRCxPQUFPbkIsS0FBUDtFQUNEO0FBdEdpRCxDQUFwRDtlQXlHZVAsSzs7QUFDZjJCLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjVCLEtBQWpCIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
const NULL_LENGTH = Buffer.from([0xFF, 0xFF, 0xFF, 0xFF]);
const NText = {
  id: 0x63,
  type: 'NTEXT',
  name: 'NText',
  hasTableName: true,
  declaration: function () {
    return 'ntext';
  },
  resolveLength: function (parameter) {
    const value = parameter.value; // Temporary solution. Remove 'any' later.

    if (value != null) {
      return value.length;
    } else {
      return -1;
    }
  },

  generateTypeInfo(parameter, _options) {
    const buffer = Buffer.alloc(10);
    buffer.writeUInt8(this.id, 0);
    buffer.writeInt32LE(parameter.length, 1);

    if (parameter.collation) {
      parameter.collation.toBuffer().copy(buffer, 5, 0, 5);
    }

    return buffer;
  },

  generateParameterLength(parameter, options) {
    if (parameter.value == null) {
      return NULL_LENGTH;
    }

    const buffer = Buffer.alloc(4);
    buffer.writeInt32LE(Buffer.byteLength(parameter.value, 'ucs2'), 0);
    return buffer;
  },

  generateParameterData: function* (parameter, options) {
    if (parameter.value == null) {
      return;
    }

    yield Buffer.from(parameter.value.toString(), 'ucs2');
  },
  validate: function (value) {
    if (value == null) {
      return null;
    }

    if (typeof value !== 'string') {
      throw new TypeError('Invalid string.');
    }

    return value;
  }
};
var _default = NText;
exports.default = _default;
module.exports = NText;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOVUxMX0xFTkdUSCIsIkJ1ZmZlciIsImZyb20iLCJOVGV4dCIsImlkIiwidHlwZSIsIm5hbWUiLCJoYXNUYWJsZU5hbWUiLCJkZWNsYXJhdGlvbiIsInJlc29sdmVMZW5ndGgiLCJwYXJhbWV0ZXIiLCJ2YWx1ZSIsImxlbmd0aCIsImdlbmVyYXRlVHlwZUluZm8iLCJfb3B0aW9ucyIsImJ1ZmZlciIsImFsbG9jIiwid3JpdGVVSW50OCIsIndyaXRlSW50MzJMRSIsImNvbGxhdGlvbiIsInRvQnVmZmVyIiwiY29weSIsImdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoIiwib3B0aW9ucyIsImJ5dGVMZW5ndGgiLCJnZW5lcmF0ZVBhcmFtZXRlckRhdGEiLCJ0b1N0cmluZyIsInZhbGlkYXRlIiwiVHlwZUVycm9yIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhLXR5cGVzL250ZXh0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi4vZGF0YS10eXBlJztcblxuY29uc3QgTlVMTF9MRU5HVEggPSBCdWZmZXIuZnJvbShbMHhGRiwgMHhGRiwgMHhGRiwgMHhGRl0pO1xuXG5jb25zdCBOVGV4dDogRGF0YVR5cGUgPSB7XG4gIGlkOiAweDYzLFxuICB0eXBlOiAnTlRFWFQnLFxuICBuYW1lOiAnTlRleHQnLFxuXG4gIGhhc1RhYmxlTmFtZTogdHJ1ZSxcblxuICBkZWNsYXJhdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICdudGV4dCc7XG4gIH0sXG5cbiAgcmVzb2x2ZUxlbmd0aDogZnVuY3Rpb24ocGFyYW1ldGVyKSB7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJhbWV0ZXIudmFsdWUgYXMgYW55OyAvLyBUZW1wb3Jhcnkgc29sdXRpb24uIFJlbW92ZSAnYW55JyBsYXRlci5cblxuICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdmFsdWUubGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuICB9LFxuXG4gIGdlbmVyYXRlVHlwZUluZm8ocGFyYW1ldGVyLCBfb3B0aW9ucykge1xuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygxMCk7XG4gICAgYnVmZmVyLndyaXRlVUludDgodGhpcy5pZCwgMCk7XG4gICAgYnVmZmVyLndyaXRlSW50MzJMRShwYXJhbWV0ZXIubGVuZ3RoISwgMSk7XG5cbiAgICBpZiAocGFyYW1ldGVyLmNvbGxhdGlvbikge1xuICAgICAgcGFyYW1ldGVyLmNvbGxhdGlvbi50b0J1ZmZlcigpLmNvcHkoYnVmZmVyLCA1LCAwLCA1KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVmZmVyO1xuICB9LFxuXG4gIGdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoKHBhcmFtZXRlciwgb3B0aW9ucykge1xuICAgIGlmIChwYXJhbWV0ZXIudmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIE5VTExfTEVOR1RIO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgICBidWZmZXIud3JpdGVJbnQzMkxFKEJ1ZmZlci5ieXRlTGVuZ3RoKHBhcmFtZXRlci52YWx1ZSwgJ3VjczInKSwgMCk7XG4gICAgcmV0dXJuIGJ1ZmZlcjtcbiAgfSxcblxuICBnZW5lcmF0ZVBhcmFtZXRlckRhdGE6IGZ1bmN0aW9uKihwYXJhbWV0ZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAocGFyYW1ldGVyLnZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB5aWVsZCBCdWZmZXIuZnJvbShwYXJhbWV0ZXIudmFsdWUudG9TdHJpbmcoKSwgJ3VjczInKTtcbiAgfSxcblxuICB2YWxpZGF0ZTogZnVuY3Rpb24odmFsdWUpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgc3RyaW5nLicpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgTlRleHQ7XG5tb2R1bGUuZXhwb3J0cyA9IE5UZXh0O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQSxNQUFNQSxXQUFXLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxFQUFPLElBQVAsRUFBYSxJQUFiLEVBQW1CLElBQW5CLENBQVosQ0FBcEI7QUFFQSxNQUFNQyxLQUFlLEdBQUc7RUFDdEJDLEVBQUUsRUFBRSxJQURrQjtFQUV0QkMsSUFBSSxFQUFFLE9BRmdCO0VBR3RCQyxJQUFJLEVBQUUsT0FIZ0I7RUFLdEJDLFlBQVksRUFBRSxJQUxRO0VBT3RCQyxXQUFXLEVBQUUsWUFBVztJQUN0QixPQUFPLE9BQVA7RUFDRCxDQVRxQjtFQVd0QkMsYUFBYSxFQUFFLFVBQVNDLFNBQVQsRUFBb0I7SUFDakMsTUFBTUMsS0FBSyxHQUFHRCxTQUFTLENBQUNDLEtBQXhCLENBRGlDLENBQ0s7O0lBRXRDLElBQUlBLEtBQUssSUFBSSxJQUFiLEVBQW1CO01BQ2pCLE9BQU9BLEtBQUssQ0FBQ0MsTUFBYjtJQUNELENBRkQsTUFFTztNQUNMLE9BQU8sQ0FBQyxDQUFSO0lBQ0Q7RUFDRixDQW5CcUI7O0VBcUJ0QkMsZ0JBQWdCLENBQUNILFNBQUQsRUFBWUksUUFBWixFQUFzQjtJQUNwQyxNQUFNQyxNQUFNLEdBQUdkLE1BQU0sQ0FBQ2UsS0FBUCxDQUFhLEVBQWIsQ0FBZjtJQUNBRCxNQUFNLENBQUNFLFVBQVAsQ0FBa0IsS0FBS2IsRUFBdkIsRUFBMkIsQ0FBM0I7SUFDQVcsTUFBTSxDQUFDRyxZQUFQLENBQW9CUixTQUFTLENBQUNFLE1BQTlCLEVBQXVDLENBQXZDOztJQUVBLElBQUlGLFNBQVMsQ0FBQ1MsU0FBZCxFQUF5QjtNQUN2QlQsU0FBUyxDQUFDUyxTQUFWLENBQW9CQyxRQUFwQixHQUErQkMsSUFBL0IsQ0FBb0NOLE1BQXBDLEVBQTRDLENBQTVDLEVBQStDLENBQS9DLEVBQWtELENBQWxEO0lBQ0Q7O0lBRUQsT0FBT0EsTUFBUDtFQUNELENBL0JxQjs7RUFpQ3RCTyx1QkFBdUIsQ0FBQ1osU0FBRCxFQUFZYSxPQUFaLEVBQXFCO0lBQzFDLElBQUliLFNBQVMsQ0FBQ0MsS0FBVixJQUFtQixJQUF2QixFQUE2QjtNQUMzQixPQUFPWCxXQUFQO0lBQ0Q7O0lBRUQsTUFBTWUsTUFBTSxHQUFHZCxNQUFNLENBQUNlLEtBQVAsQ0FBYSxDQUFiLENBQWY7SUFDQUQsTUFBTSxDQUFDRyxZQUFQLENBQW9CakIsTUFBTSxDQUFDdUIsVUFBUCxDQUFrQmQsU0FBUyxDQUFDQyxLQUE1QixFQUFtQyxNQUFuQyxDQUFwQixFQUFnRSxDQUFoRTtJQUNBLE9BQU9JLE1BQVA7RUFDRCxDQXpDcUI7O0VBMkN0QlUscUJBQXFCLEVBQUUsV0FBVWYsU0FBVixFQUFxQmEsT0FBckIsRUFBOEI7SUFDbkQsSUFBSWIsU0FBUyxDQUFDQyxLQUFWLElBQW1CLElBQXZCLEVBQTZCO01BQzNCO0lBQ0Q7O0lBRUQsTUFBTVYsTUFBTSxDQUFDQyxJQUFQLENBQVlRLFNBQVMsQ0FBQ0MsS0FBVixDQUFnQmUsUUFBaEIsRUFBWixFQUF3QyxNQUF4QyxDQUFOO0VBQ0QsQ0FqRHFCO0VBbUR0QkMsUUFBUSxFQUFFLFVBQVNoQixLQUFULEVBQStCO0lBQ3ZDLElBQUlBLEtBQUssSUFBSSxJQUFiLEVBQW1CO01BQ2pCLE9BQU8sSUFBUDtJQUNEOztJQUVELElBQUksT0FBT0EsS0FBUCxLQUFpQixRQUFyQixFQUErQjtNQUM3QixNQUFNLElBQUlpQixTQUFKLENBQWMsaUJBQWQsQ0FBTjtJQUNEOztJQUVELE9BQU9qQixLQUFQO0VBQ0Q7QUE3RHFCLENBQXhCO2VBZ0VlUixLOztBQUNmMEIsTUFBTSxDQUFDQyxPQUFQLEdBQWlCM0IsS0FBakIifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
const Null = {
  id: 0x1F,
  type: 'NULL',
  name: 'Null',

  declaration() {
    throw new Error('not implemented');
  },

  generateTypeInfo() {
    throw new Error('not implemented');
  },

  generateParameterLength() {
    throw new Error('not implemented');
  },

  generateParameterData() {
    throw new Error('not implemented');
  },

  validate() {
    throw new Error('not implemented');
  }

};
var _default = Null;
exports.default = _default;
module.exports = Null;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOdWxsIiwiaWQiLCJ0eXBlIiwibmFtZSIsImRlY2xhcmF0aW9uIiwiRXJyb3IiLCJnZW5lcmF0ZVR5cGVJbmZvIiwiZ2VuZXJhdGVQYXJhbWV0ZXJMZW5ndGgiLCJnZW5lcmF0ZVBhcmFtZXRlckRhdGEiLCJ2YWxpZGF0ZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YS10eXBlcy9udWxsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi4vZGF0YS10eXBlJztcblxuY29uc3QgTnVsbDogRGF0YVR5cGUgPSB7XG4gIGlkOiAweDFGLFxuICB0eXBlOiAnTlVMTCcsXG4gIG5hbWU6ICdOdWxsJyxcblxuICBkZWNsYXJhdGlvbigpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICB9LFxuXG4gIGdlbmVyYXRlVHlwZUluZm8oKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgfSxcblxuICBnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICB9LFxuXG4gIGdlbmVyYXRlUGFyYW1ldGVyRGF0YSgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICB9LFxuXG4gIHZhbGlkYXRlKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IE51bGw7XG5tb2R1bGUuZXhwb3J0cyA9IE51bGw7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUVBLE1BQU1BLElBQWMsR0FBRztFQUNyQkMsRUFBRSxFQUFFLElBRGlCO0VBRXJCQyxJQUFJLEVBQUUsTUFGZTtFQUdyQkMsSUFBSSxFQUFFLE1BSGU7O0VBS3JCQyxXQUFXLEdBQUc7SUFDWixNQUFNLElBQUlDLEtBQUosQ0FBVSxpQkFBVixDQUFOO0VBQ0QsQ0FQb0I7O0VBU3JCQyxnQkFBZ0IsR0FBRztJQUNqQixNQUFNLElBQUlELEtBQUosQ0FBVSxpQkFBVixDQUFOO0VBQ0QsQ0FYb0I7O0VBYXJCRSx1QkFBdUIsR0FBRztJQUN4QixNQUFNLElBQUlGLEtBQUosQ0FBVSxpQkFBVixDQUFOO0VBQ0QsQ0Fmb0I7O0VBaUJyQkcscUJBQXFCLEdBQUc7SUFDdEIsTUFBTSxJQUFJSCxLQUFKLENBQVUsaUJBQVYsQ0FBTjtFQUNELENBbkJvQjs7RUFxQnJCSSxRQUFRLEdBQUc7SUFDVCxNQUFNLElBQUlKLEtBQUosQ0FBVSxpQkFBVixDQUFOO0VBQ0Q7O0FBdkJvQixDQUF2QjtlQTBCZUwsSTs7QUFDZlUsTUFBTSxDQUFDQyxPQUFQLEdBQWlCWCxJQUFqQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _numericn = _interopRequireDefault(require("./numericn"));

var _writableTrackingBuffer = _interopRequireDefault(require("../tracking-buffer/writable-tracking-buffer"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const NULL_LENGTH = Buffer.from([0x00]);
const Numeric = {
  id: 0x3F,
  type: 'NUMERIC',
  name: 'Numeric',
  declaration: function (parameter) {
    return 'numeric(' + this.resolvePrecision(parameter) + ', ' + this.resolveScale(parameter) + ')';
  },
  resolvePrecision: function (parameter) {
    if (parameter.precision != null) {
      return parameter.precision;
    } else if (parameter.value === null) {
      return 1;
    } else {
      return 18;
    }
  },
  resolveScale: function (parameter) {
    if (parameter.scale != null) {
      return parameter.scale;
    } else {
      return 0;
    }
  },

  generateTypeInfo(parameter) {
    let precision;

    if (parameter.precision <= 9) {
      precision = 0x05;
    } else if (parameter.precision <= 19) {
      precision = 0x09;
    } else if (parameter.precision <= 28) {
      precision = 0x0D;
    } else {
      precision = 0x11;
    }

    return Buffer.from([_numericn.default.id, precision, parameter.precision, parameter.scale]);
  },

  generateParameterLength(parameter, options) {
    if (parameter.value == null) {
      return NULL_LENGTH;
    }

    const precision = parameter.precision;

    if (precision <= 9) {
      return Buffer.from([0x05]);
    } else if (precision <= 19) {
      return Buffer.from([0x09]);
    } else if (precision <= 28) {
      return Buffer.from([0x0D]);
    } else {
      return Buffer.from([0x11]);
    }
  },

  *generateParameterData(parameter, options) {
    if (parameter.value == null) {
      return;
    }

    const sign = parameter.value < 0 ? 0 : 1;
    const value = Math.round(Math.abs(parameter.value * Math.pow(10, parameter.scale)));

    if (parameter.precision <= 9) {
      const buffer = Buffer.alloc(5);
      buffer.writeUInt8(sign, 0);
      buffer.writeUInt32LE(value, 1);
      yield buffer;
    } else if (parameter.precision <= 19) {
      const buffer = new _writableTrackingBuffer.default(10);
      buffer.writeUInt8(sign);
      buffer.writeUInt64LE(value);
      yield buffer.data;
    } else if (parameter.precision <= 28) {
      const buffer = new _writableTrackingBuffer.default(14);
      buffer.writeUInt8(sign);
      buffer.writeUInt64LE(value);
      buffer.writeUInt32LE(0x00000000);
      yield buffer.data;
    } else {
      const buffer = new _writableTrackingBuffer.default(18);
      buffer.writeUInt8(sign);
      buffer.writeUInt64LE(value);
      buffer.writeUInt32LE(0x00000000);
      buffer.writeUInt32LE(0x00000000);
      yield buffer.data;
    }
  },

  validate: function (value) {
    if (value == null) {
      return null;
    }

    value = parseFloat(value);

    if (isNaN(value)) {
      throw new TypeError('Invalid number.');
    }

    return value;
  }
};
var _default = Numeric;
exports.default = _default;
module.exports = Numeric;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOVUxMX0xFTkdUSCIsIkJ1ZmZlciIsImZyb20iLCJOdW1lcmljIiwiaWQiLCJ0eXBlIiwibmFtZSIsImRlY2xhcmF0aW9uIiwicGFyYW1ldGVyIiwicmVzb2x2ZVByZWNpc2lvbiIsInJlc29sdmVTY2FsZSIsInByZWNpc2lvbiIsInZhbHVlIiwic2NhbGUiLCJnZW5lcmF0ZVR5cGVJbmZvIiwiTnVtZXJpY04iLCJnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aCIsIm9wdGlvbnMiLCJnZW5lcmF0ZVBhcmFtZXRlckRhdGEiLCJzaWduIiwiTWF0aCIsInJvdW5kIiwiYWJzIiwicG93IiwiYnVmZmVyIiwiYWxsb2MiLCJ3cml0ZVVJbnQ4Iiwid3JpdGVVSW50MzJMRSIsIldyaXRhYmxlVHJhY2tpbmdCdWZmZXIiLCJ3cml0ZVVJbnQ2NExFIiwiZGF0YSIsInZhbGlkYXRlIiwicGFyc2VGbG9hdCIsImlzTmFOIiwiVHlwZUVycm9yIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhLXR5cGVzL251bWVyaWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuLi9kYXRhLXR5cGUnO1xuaW1wb3J0IE51bWVyaWNOIGZyb20gJy4vbnVtZXJpY24nO1xuaW1wb3J0IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIgZnJvbSAnLi4vdHJhY2tpbmctYnVmZmVyL3dyaXRhYmxlLXRyYWNraW5nLWJ1ZmZlcic7XG5cbmNvbnN0IE5VTExfTEVOR1RIID0gQnVmZmVyLmZyb20oWzB4MDBdKTtcblxuY29uc3QgTnVtZXJpYzogRGF0YVR5cGUgJiB7IHJlc29sdmVTY2FsZTogTm9uTnVsbGFibGU8RGF0YVR5cGVbJ3Jlc29sdmVTY2FsZSddPiwgcmVzb2x2ZVByZWNpc2lvbjogTm9uTnVsbGFibGU8RGF0YVR5cGVbJ3Jlc29sdmVQcmVjaXNpb24nXT4gfSA9IHtcbiAgaWQ6IDB4M0YsXG4gIHR5cGU6ICdOVU1FUklDJyxcbiAgbmFtZTogJ051bWVyaWMnLFxuXG4gIGRlY2xhcmF0aW9uOiBmdW5jdGlvbihwYXJhbWV0ZXIpIHtcbiAgICByZXR1cm4gJ251bWVyaWMoJyArICh0aGlzLnJlc29sdmVQcmVjaXNpb24ocGFyYW1ldGVyKSkgKyAnLCAnICsgKHRoaXMucmVzb2x2ZVNjYWxlKHBhcmFtZXRlcikpICsgJyknO1xuICB9LFxuXG4gIHJlc29sdmVQcmVjaXNpb246IGZ1bmN0aW9uKHBhcmFtZXRlcikge1xuICAgIGlmIChwYXJhbWV0ZXIucHJlY2lzaW9uICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBwYXJhbWV0ZXIucHJlY2lzaW9uO1xuICAgIH0gZWxzZSBpZiAocGFyYW1ldGVyLnZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDE4O1xuICAgIH1cbiAgfSxcblxuICByZXNvbHZlU2NhbGU6IGZ1bmN0aW9uKHBhcmFtZXRlcikge1xuICAgIGlmIChwYXJhbWV0ZXIuc2NhbGUgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHBhcmFtZXRlci5zY2FsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9LFxuXG4gIGdlbmVyYXRlVHlwZUluZm8ocGFyYW1ldGVyKSB7XG4gICAgbGV0IHByZWNpc2lvbjtcbiAgICBpZiAocGFyYW1ldGVyLnByZWNpc2lvbiEgPD0gOSkge1xuICAgICAgcHJlY2lzaW9uID0gMHgwNTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtZXRlci5wcmVjaXNpb24hIDw9IDE5KSB7XG4gICAgICBwcmVjaXNpb24gPSAweDA5O1xuICAgIH0gZWxzZSBpZiAocGFyYW1ldGVyLnByZWNpc2lvbiEgPD0gMjgpIHtcbiAgICAgIHByZWNpc2lvbiA9IDB4MEQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWNpc2lvbiA9IDB4MTE7XG4gICAgfVxuXG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKFtOdW1lcmljTi5pZCwgcHJlY2lzaW9uLCBwYXJhbWV0ZXIucHJlY2lzaW9uISwgcGFyYW1ldGVyLnNjYWxlIV0pO1xuICB9LFxuXG4gIGdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoKHBhcmFtZXRlciwgb3B0aW9ucykge1xuICAgIGlmIChwYXJhbWV0ZXIudmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIE5VTExfTEVOR1RIO1xuICAgIH1cblxuICAgIGNvbnN0IHByZWNpc2lvbiA9IHBhcmFtZXRlci5wcmVjaXNpb24hO1xuICAgIGlmIChwcmVjaXNpb24gPD0gOSkge1xuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKFsweDA1XSk7XG4gICAgfSBlbHNlIGlmIChwcmVjaXNpb24gPD0gMTkpIHtcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbShbMHgwOV0pO1xuICAgIH0gZWxzZSBpZiAocHJlY2lzaW9uIDw9IDI4KSB7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20oWzB4MERdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKFsweDExXSk7XG4gICAgfVxuICB9LFxuXG4gICogZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhKHBhcmFtZXRlciwgb3B0aW9ucykge1xuICAgIGlmIChwYXJhbWV0ZXIudmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ24gPSBwYXJhbWV0ZXIudmFsdWUgPCAwID8gMCA6IDE7XG4gICAgY29uc3QgdmFsdWUgPSBNYXRoLnJvdW5kKE1hdGguYWJzKHBhcmFtZXRlci52YWx1ZSAqIE1hdGgucG93KDEwLCBwYXJhbWV0ZXIuc2NhbGUhKSkpO1xuICAgIGlmIChwYXJhbWV0ZXIucHJlY2lzaW9uISA8PSA5KSB7XG4gICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2MoNSk7XG4gICAgICBidWZmZXIud3JpdGVVSW50OChzaWduLCAwKTtcbiAgICAgIGJ1ZmZlci53cml0ZVVJbnQzMkxFKHZhbHVlLCAxKTtcbiAgICAgIHlpZWxkIGJ1ZmZlcjtcbiAgICB9IGVsc2UgaWYgKHBhcmFtZXRlci5wcmVjaXNpb24hIDw9IDE5KSB7XG4gICAgICBjb25zdCBidWZmZXIgPSBuZXcgV3JpdGFibGVUcmFja2luZ0J1ZmZlcigxMCk7XG4gICAgICBidWZmZXIud3JpdGVVSW50OChzaWduKTtcbiAgICAgIGJ1ZmZlci53cml0ZVVJbnQ2NExFKHZhbHVlKTtcbiAgICAgIHlpZWxkIGJ1ZmZlci5kYXRhO1xuICAgIH0gZWxzZSBpZiAocGFyYW1ldGVyLnByZWNpc2lvbiEgPD0gMjgpIHtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBXcml0YWJsZVRyYWNraW5nQnVmZmVyKDE0KTtcbiAgICAgIGJ1ZmZlci53cml0ZVVJbnQ4KHNpZ24pO1xuICAgICAgYnVmZmVyLndyaXRlVUludDY0TEUodmFsdWUpO1xuICAgICAgYnVmZmVyLndyaXRlVUludDMyTEUoMHgwMDAwMDAwMCk7XG4gICAgICB5aWVsZCBidWZmZXIuZGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIoMTgpO1xuICAgICAgYnVmZmVyLndyaXRlVUludDgoc2lnbik7XG4gICAgICBidWZmZXIud3JpdGVVSW50NjRMRSh2YWx1ZSk7XG4gICAgICBidWZmZXIud3JpdGVVSW50MzJMRSgweDAwMDAwMDAwKTtcbiAgICAgIGJ1ZmZlci53cml0ZVVJbnQzMkxFKDB4MDAwMDAwMDApO1xuICAgICAgeWllbGQgYnVmZmVyLmRhdGE7XG4gICAgfVxuICB9LFxuXG4gIHZhbGlkYXRlOiBmdW5jdGlvbih2YWx1ZSk6IG51bGwgfCBudW1iZXIge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG51bWJlci4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBOdW1lcmljO1xubW9kdWxlLmV4cG9ydHMgPSBOdW1lcmljO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQ0E7O0FBQ0E7Ozs7QUFFQSxNQUFNQSxXQUFXLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxDQUFaLENBQXBCO0FBRUEsTUFBTUMsT0FBd0ksR0FBRztFQUMvSUMsRUFBRSxFQUFFLElBRDJJO0VBRS9JQyxJQUFJLEVBQUUsU0FGeUk7RUFHL0lDLElBQUksRUFBRSxTQUh5STtFQUsvSUMsV0FBVyxFQUFFLFVBQVNDLFNBQVQsRUFBb0I7SUFDL0IsT0FBTyxhQUFjLEtBQUtDLGdCQUFMLENBQXNCRCxTQUF0QixDQUFkLEdBQWtELElBQWxELEdBQTBELEtBQUtFLFlBQUwsQ0FBa0JGLFNBQWxCLENBQTFELEdBQTBGLEdBQWpHO0VBQ0QsQ0FQOEk7RUFTL0lDLGdCQUFnQixFQUFFLFVBQVNELFNBQVQsRUFBb0I7SUFDcEMsSUFBSUEsU0FBUyxDQUFDRyxTQUFWLElBQXVCLElBQTNCLEVBQWlDO01BQy9CLE9BQU9ILFNBQVMsQ0FBQ0csU0FBakI7SUFDRCxDQUZELE1BRU8sSUFBSUgsU0FBUyxDQUFDSSxLQUFWLEtBQW9CLElBQXhCLEVBQThCO01BQ25DLE9BQU8sQ0FBUDtJQUNELENBRk0sTUFFQTtNQUNMLE9BQU8sRUFBUDtJQUNEO0VBQ0YsQ0FqQjhJO0VBbUIvSUYsWUFBWSxFQUFFLFVBQVNGLFNBQVQsRUFBb0I7SUFDaEMsSUFBSUEsU0FBUyxDQUFDSyxLQUFWLElBQW1CLElBQXZCLEVBQTZCO01BQzNCLE9BQU9MLFNBQVMsQ0FBQ0ssS0FBakI7SUFDRCxDQUZELE1BRU87TUFDTCxPQUFPLENBQVA7SUFDRDtFQUNGLENBekI4STs7RUEyQi9JQyxnQkFBZ0IsQ0FBQ04sU0FBRCxFQUFZO0lBQzFCLElBQUlHLFNBQUo7O0lBQ0EsSUFBSUgsU0FBUyxDQUFDRyxTQUFWLElBQXdCLENBQTVCLEVBQStCO01BQzdCQSxTQUFTLEdBQUcsSUFBWjtJQUNELENBRkQsTUFFTyxJQUFJSCxTQUFTLENBQUNHLFNBQVYsSUFBd0IsRUFBNUIsRUFBZ0M7TUFDckNBLFNBQVMsR0FBRyxJQUFaO0lBQ0QsQ0FGTSxNQUVBLElBQUlILFNBQVMsQ0FBQ0csU0FBVixJQUF3QixFQUE1QixFQUFnQztNQUNyQ0EsU0FBUyxHQUFHLElBQVo7SUFDRCxDQUZNLE1BRUE7TUFDTEEsU0FBUyxHQUFHLElBQVo7SUFDRDs7SUFFRCxPQUFPVixNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDYSxrQkFBU1gsRUFBVixFQUFjTyxTQUFkLEVBQXlCSCxTQUFTLENBQUNHLFNBQW5DLEVBQStDSCxTQUFTLENBQUNLLEtBQXpELENBQVosQ0FBUDtFQUNELENBeEM4STs7RUEwQy9JRyx1QkFBdUIsQ0FBQ1IsU0FBRCxFQUFZUyxPQUFaLEVBQXFCO0lBQzFDLElBQUlULFNBQVMsQ0FBQ0ksS0FBVixJQUFtQixJQUF2QixFQUE2QjtNQUMzQixPQUFPWixXQUFQO0lBQ0Q7O0lBRUQsTUFBTVcsU0FBUyxHQUFHSCxTQUFTLENBQUNHLFNBQTVCOztJQUNBLElBQUlBLFNBQVMsSUFBSSxDQUFqQixFQUFvQjtNQUNsQixPQUFPVixNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDLElBQUQsQ0FBWixDQUFQO0lBQ0QsQ0FGRCxNQUVPLElBQUlTLFNBQVMsSUFBSSxFQUFqQixFQUFxQjtNQUMxQixPQUFPVixNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDLElBQUQsQ0FBWixDQUFQO0lBQ0QsQ0FGTSxNQUVBLElBQUlTLFNBQVMsSUFBSSxFQUFqQixFQUFxQjtNQUMxQixPQUFPVixNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDLElBQUQsQ0FBWixDQUFQO0lBQ0QsQ0FGTSxNQUVBO01BQ0wsT0FBT0QsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxJQUFELENBQVosQ0FBUDtJQUNEO0VBQ0YsQ0F6RDhJOztFQTJEL0ksQ0FBRWdCLHFCQUFGLENBQXdCVixTQUF4QixFQUFtQ1MsT0FBbkMsRUFBNEM7SUFDMUMsSUFBSVQsU0FBUyxDQUFDSSxLQUFWLElBQW1CLElBQXZCLEVBQTZCO01BQzNCO0lBQ0Q7O0lBRUQsTUFBTU8sSUFBSSxHQUFHWCxTQUFTLENBQUNJLEtBQVYsR0FBa0IsQ0FBbEIsR0FBc0IsQ0FBdEIsR0FBMEIsQ0FBdkM7SUFDQSxNQUFNQSxLQUFLLEdBQUdRLElBQUksQ0FBQ0MsS0FBTCxDQUFXRCxJQUFJLENBQUNFLEdBQUwsQ0FBU2QsU0FBUyxDQUFDSSxLQUFWLEdBQWtCUSxJQUFJLENBQUNHLEdBQUwsQ0FBUyxFQUFULEVBQWFmLFNBQVMsQ0FBQ0ssS0FBdkIsQ0FBM0IsQ0FBWCxDQUFkOztJQUNBLElBQUlMLFNBQVMsQ0FBQ0csU0FBVixJQUF3QixDQUE1QixFQUErQjtNQUM3QixNQUFNYSxNQUFNLEdBQUd2QixNQUFNLENBQUN3QixLQUFQLENBQWEsQ0FBYixDQUFmO01BQ0FELE1BQU0sQ0FBQ0UsVUFBUCxDQUFrQlAsSUFBbEIsRUFBd0IsQ0FBeEI7TUFDQUssTUFBTSxDQUFDRyxhQUFQLENBQXFCZixLQUFyQixFQUE0QixDQUE1QjtNQUNBLE1BQU1ZLE1BQU47SUFDRCxDQUxELE1BS08sSUFBSWhCLFNBQVMsQ0FBQ0csU0FBVixJQUF3QixFQUE1QixFQUFnQztNQUNyQyxNQUFNYSxNQUFNLEdBQUcsSUFBSUksK0JBQUosQ0FBMkIsRUFBM0IsQ0FBZjtNQUNBSixNQUFNLENBQUNFLFVBQVAsQ0FBa0JQLElBQWxCO01BQ0FLLE1BQU0sQ0FBQ0ssYUFBUCxDQUFxQmpCLEtBQXJCO01BQ0EsTUFBTVksTUFBTSxDQUFDTSxJQUFiO0lBQ0QsQ0FMTSxNQUtBLElBQUl0QixTQUFTLENBQUNHLFNBQVYsSUFBd0IsRUFBNUIsRUFBZ0M7TUFDckMsTUFBTWEsTUFBTSxHQUFHLElBQUlJLCtCQUFKLENBQTJCLEVBQTNCLENBQWY7TUFDQUosTUFBTSxDQUFDRSxVQUFQLENBQWtCUCxJQUFsQjtNQUNBSyxNQUFNLENBQUNLLGFBQVAsQ0FBcUJqQixLQUFyQjtNQUNBWSxNQUFNLENBQUNHLGFBQVAsQ0FBcUIsVUFBckI7TUFDQSxNQUFNSCxNQUFNLENBQUNNLElBQWI7SUFDRCxDQU5NLE1BTUE7TUFDTCxNQUFNTixNQUFNLEdBQUcsSUFBSUksK0JBQUosQ0FBMkIsRUFBM0IsQ0FBZjtNQUNBSixNQUFNLENBQUNFLFVBQVAsQ0FBa0JQLElBQWxCO01BQ0FLLE1BQU0sQ0FBQ0ssYUFBUCxDQUFxQmpCLEtBQXJCO01BQ0FZLE1BQU0sQ0FBQ0csYUFBUCxDQUFxQixVQUFyQjtNQUNBSCxNQUFNLENBQUNHLGFBQVAsQ0FBcUIsVUFBckI7TUFDQSxNQUFNSCxNQUFNLENBQUNNLElBQWI7SUFDRDtFQUNGLENBMUY4STs7RUE0Ri9JQyxRQUFRLEVBQUUsVUFBU25CLEtBQVQsRUFBK0I7SUFDdkMsSUFBSUEsS0FBSyxJQUFJLElBQWIsRUFBbUI7TUFDakIsT0FBTyxJQUFQO0lBQ0Q7O0lBQ0RBLEtBQUssR0FBR29CLFVBQVUsQ0FBQ3BCLEtBQUQsQ0FBbEI7O0lBQ0EsSUFBSXFCLEtBQUssQ0FBQ3JCLEtBQUQsQ0FBVCxFQUFrQjtNQUNoQixNQUFNLElBQUlzQixTQUFKLENBQWMsaUJBQWQsQ0FBTjtJQUNEOztJQUNELE9BQU90QixLQUFQO0VBQ0Q7QUFyRzhJLENBQWpKO2VBd0dlVCxPOztBQUNmZ0MsTUFBTSxDQUFDQyxPQUFQLEdBQWlCakMsT0FBakIifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
const NumericN = {
  id: 0x6C,
  type: 'NUMERICN',
  name: 'NumericN',

  declaration() {
    throw new Error('not implemented');
  },

  generateTypeInfo() {
    throw new Error('not implemented');
  },

  generateParameterLength() {
    throw new Error('not implemented');
  },

  generateParameterData() {
    throw new Error('not implemented');
  },

  validate() {
    throw new Error('not implemented');
  }

};
var _default = NumericN;
exports.default = _default;
module.exports = NumericN;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOdW1lcmljTiIsImlkIiwidHlwZSIsIm5hbWUiLCJkZWNsYXJhdGlvbiIsIkVycm9yIiwiZ2VuZXJhdGVUeXBlSW5mbyIsImdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoIiwiZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhIiwidmFsaWRhdGUiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGEtdHlwZXMvbnVtZXJpY24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuLi9kYXRhLXR5cGUnO1xuXG5jb25zdCBOdW1lcmljTjogRGF0YVR5cGUgPSB7XG4gIGlkOiAweDZDLFxuICB0eXBlOiAnTlVNRVJJQ04nLFxuICBuYW1lOiAnTnVtZXJpY04nLFxuXG4gIGRlY2xhcmF0aW9uKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gIH0sXG5cbiAgZ2VuZXJhdGVUeXBlSW5mbygpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICB9LFxuXG4gIGdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gIH0sXG5cbiAgZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gIH0sXG5cbiAgdmFsaWRhdGUoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgTnVtZXJpY047XG5tb2R1bGUuZXhwb3J0cyA9IE51bWVyaWNOO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQSxNQUFNQSxRQUFrQixHQUFHO0VBQ3pCQyxFQUFFLEVBQUUsSUFEcUI7RUFFekJDLElBQUksRUFBRSxVQUZtQjtFQUd6QkMsSUFBSSxFQUFFLFVBSG1COztFQUt6QkMsV0FBVyxHQUFHO0lBQ1osTUFBTSxJQUFJQyxLQUFKLENBQVUsaUJBQVYsQ0FBTjtFQUNELENBUHdCOztFQVN6QkMsZ0JBQWdCLEdBQUc7SUFDakIsTUFBTSxJQUFJRCxLQUFKLENBQVUsaUJBQVYsQ0FBTjtFQUNELENBWHdCOztFQWF6QkUsdUJBQXVCLEdBQUc7SUFDeEIsTUFBTSxJQUFJRixLQUFKLENBQVUsaUJBQVYsQ0FBTjtFQUNELENBZndCOztFQWlCekJHLHFCQUFxQixHQUFHO0lBQ3RCLE1BQU0sSUFBSUgsS0FBSixDQUFVLGlCQUFWLENBQU47RUFDRCxDQW5Cd0I7O0VBcUJ6QkksUUFBUSxHQUFHO0lBQ1QsTUFBTSxJQUFJSixLQUFKLENBQVUsaUJBQVYsQ0FBTjtFQUNEOztBQXZCd0IsQ0FBM0I7ZUEwQmVMLFE7O0FBQ2ZVLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQlgsUUFBakIifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
const MAX = (1 << 16) - 1;
const UNKNOWN_PLP_LEN = Buffer.from([0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]);
const PLP_TERMINATOR = Buffer.from([0x00, 0x00, 0x00, 0x00]);
const NULL_LENGTH = Buffer.from([0xFF, 0xFF]);
const MAX_NULL_LENGTH = Buffer.from([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]);
const NVarChar = {
  id: 0xE7,
  type: 'NVARCHAR',
  name: 'NVarChar',
  maximumLength: 4000,
  declaration: function (parameter) {
    const value = parameter.value; // Temporary solution. Remove 'any' later.

    let length;

    if (parameter.length) {
      length = parameter.length;
    } else if (value != null) {
      length = value.toString().length || 1;
    } else if (value === null && !parameter.output) {
      length = 1;
    } else {
      length = this.maximumLength;
    }

    if (length <= this.maximumLength) {
      return 'nvarchar(' + length + ')';
    } else {
      return 'nvarchar(max)';
    }
  },
  resolveLength: function (parameter) {
    const value = parameter.value; // Temporary solution. Remove 'any' later.

    if (parameter.length != null) {
      return parameter.length;
    } else if (value != null) {
      if (Buffer.isBuffer(value)) {
        return value.length / 2 || 1;
      } else {
        return value.toString().length || 1;
      }
    } else {
      return this.maximumLength;
    }
  },

  generateTypeInfo(parameter) {
    const buffer = Buffer.alloc(8);
    buffer.writeUInt8(this.id, 0);

    if (parameter.length <= this.maximumLength) {
      buffer.writeUInt16LE(parameter.length * 2, 1);
    } else {
      buffer.writeUInt16LE(MAX, 1);
    }

    if (parameter.collation) {
      parameter.collation.toBuffer().copy(buffer, 3, 0, 5);
    }

    return buffer;
  },

  generateParameterLength(parameter, options) {
    if (parameter.value == null) {
      if (parameter.length <= this.maximumLength) {
        return NULL_LENGTH;
      } else {
        return MAX_NULL_LENGTH;
      }
    }

    let value = parameter.value;

    if (parameter.length <= this.maximumLength) {
      let length;

      if (value instanceof Buffer) {
        length = value.length;
      } else {
        value = value.toString();
        length = Buffer.byteLength(value, 'ucs2');
      }

      const buffer = Buffer.alloc(2);
      buffer.writeUInt16LE(length, 0);
      return buffer;
    } else {
      return UNKNOWN_PLP_LEN;
    }
  },

  *generateParameterData(parameter, options) {
    if (parameter.value == null) {
      return;
    }

    let value = parameter.value;

    if (parameter.length <= this.maximumLength) {
      if (value instanceof Buffer) {
        yield value;
      } else {
        value = value.toString();
        yield Buffer.from(value, 'ucs2');
      }
    } else {
      if (value instanceof Buffer) {
        const length = value.length;

        if (length > 0) {
          const buffer = Buffer.alloc(4);
          buffer.writeUInt32LE(length, 0);
          yield buffer;
          yield value;
        }
      } else {
        value = value.toString();
        const length = Buffer.byteLength(value, 'ucs2');

        if (length > 0) {
          const buffer = Buffer.alloc(4);
          buffer.writeUInt32LE(length, 0);
          yield buffer;
          yield Buffer.from(value, 'ucs2');
        }
      }

      yield PLP_TERMINATOR;
    }
  },

  validate: function (value) {
    if (value == null) {
      return null;
    }

    if (typeof value !== 'string') {
      throw new TypeError('Invalid string.');
    }

    return value;
  }
};
var _default = NVarChar;
exports.default = _default;
module.exports = NVarChar;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNQVgiLCJVTktOT1dOX1BMUF9MRU4iLCJCdWZmZXIiLCJmcm9tIiwiUExQX1RFUk1JTkFUT1IiLCJOVUxMX0xFTkdUSCIsIk1BWF9OVUxMX0xFTkdUSCIsIk5WYXJDaGFyIiwiaWQiLCJ0eXBlIiwibmFtZSIsIm1heGltdW1MZW5ndGgiLCJkZWNsYXJhdGlvbiIsInBhcmFtZXRlciIsInZhbHVlIiwibGVuZ3RoIiwidG9TdHJpbmciLCJvdXRwdXQiLCJyZXNvbHZlTGVuZ3RoIiwiaXNCdWZmZXIiLCJnZW5lcmF0ZVR5cGVJbmZvIiwiYnVmZmVyIiwiYWxsb2MiLCJ3cml0ZVVJbnQ4Iiwid3JpdGVVSW50MTZMRSIsImNvbGxhdGlvbiIsInRvQnVmZmVyIiwiY29weSIsImdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoIiwib3B0aW9ucyIsImJ5dGVMZW5ndGgiLCJnZW5lcmF0ZVBhcmFtZXRlckRhdGEiLCJ3cml0ZVVJbnQzMkxFIiwidmFsaWRhdGUiLCJUeXBlRXJyb3IiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGEtdHlwZXMvbnZhcmNoYXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuLi9kYXRhLXR5cGUnO1xuXG5jb25zdCBNQVggPSAoMSA8PCAxNikgLSAxO1xuY29uc3QgVU5LTk9XTl9QTFBfTEVOID0gQnVmZmVyLmZyb20oWzB4ZmUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZdKTtcbmNvbnN0IFBMUF9URVJNSU5BVE9SID0gQnVmZmVyLmZyb20oWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKTtcblxuY29uc3QgTlVMTF9MRU5HVEggPSBCdWZmZXIuZnJvbShbMHhGRiwgMHhGRl0pO1xuY29uc3QgTUFYX05VTExfTEVOR1RIID0gQnVmZmVyLmZyb20oWzB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkZdKTtcblxuY29uc3QgTlZhckNoYXI6IHsgbWF4aW11bUxlbmd0aDogbnVtYmVyIH0gJiBEYXRhVHlwZSA9IHtcbiAgaWQ6IDB4RTcsXG4gIHR5cGU6ICdOVkFSQ0hBUicsXG4gIG5hbWU6ICdOVmFyQ2hhcicsXG4gIG1heGltdW1MZW5ndGg6IDQwMDAsXG5cbiAgZGVjbGFyYXRpb246IGZ1bmN0aW9uKHBhcmFtZXRlcikge1xuICAgIGNvbnN0IHZhbHVlID0gcGFyYW1ldGVyLnZhbHVlIGFzIGFueTsgLy8gVGVtcG9yYXJ5IHNvbHV0aW9uLiBSZW1vdmUgJ2FueScgbGF0ZXIuXG5cbiAgICBsZXQgbGVuZ3RoO1xuICAgIGlmIChwYXJhbWV0ZXIubGVuZ3RoKSB7XG4gICAgICBsZW5ndGggPSBwYXJhbWV0ZXIubGVuZ3RoO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgbGVuZ3RoID0gdmFsdWUudG9TdHJpbmcoKS5sZW5ndGggfHwgMTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSBudWxsICYmICFwYXJhbWV0ZXIub3V0cHV0KSB7XG4gICAgICBsZW5ndGggPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZW5ndGggPSB0aGlzLm1heGltdW1MZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKGxlbmd0aCA8PSB0aGlzLm1heGltdW1MZW5ndGgpIHtcbiAgICAgIHJldHVybiAnbnZhcmNoYXIoJyArIGxlbmd0aCArICcpJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdudmFyY2hhcihtYXgpJztcbiAgICB9XG4gIH0sXG5cbiAgcmVzb2x2ZUxlbmd0aDogZnVuY3Rpb24ocGFyYW1ldGVyKSB7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJhbWV0ZXIudmFsdWUgYXMgYW55OyAvLyBUZW1wb3Jhcnkgc29sdXRpb24uIFJlbW92ZSAnYW55JyBsYXRlci5cbiAgICBpZiAocGFyYW1ldGVyLmxlbmd0aCAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gcGFyYW1ldGVyLmxlbmd0aDtcbiAgICB9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiAodmFsdWUubGVuZ3RoIC8gMikgfHwgMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpLmxlbmd0aCB8fCAxO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXhpbXVtTGVuZ3RoO1xuICAgIH1cbiAgfSxcblxuICBnZW5lcmF0ZVR5cGVJbmZvKHBhcmFtZXRlcikge1xuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg4KTtcbiAgICBidWZmZXIud3JpdGVVSW50OCh0aGlzLmlkLCAwKTtcblxuICAgIGlmIChwYXJhbWV0ZXIubGVuZ3RoISA8PSB0aGlzLm1heGltdW1MZW5ndGgpIHtcbiAgICAgIGJ1ZmZlci53cml0ZVVJbnQxNkxFKHBhcmFtZXRlci5sZW5ndGghICogMiwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1ZmZlci53cml0ZVVJbnQxNkxFKE1BWCwgMSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtZXRlci5jb2xsYXRpb24pIHtcbiAgICAgIHBhcmFtZXRlci5jb2xsYXRpb24udG9CdWZmZXIoKS5jb3B5KGJ1ZmZlciwgMywgMCwgNSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZmZlcjtcbiAgfSxcblxuICBnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aChwYXJhbWV0ZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAocGFyYW1ldGVyLnZhbHVlID09IG51bGwpIHtcbiAgICAgIGlmIChwYXJhbWV0ZXIubGVuZ3RoISA8PSB0aGlzLm1heGltdW1MZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIE5VTExfTEVOR1RIO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIE1BWF9OVUxMX0xFTkdUSDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgdmFsdWUgPSBwYXJhbWV0ZXIudmFsdWU7XG4gICAgaWYgKHBhcmFtZXRlci5sZW5ndGghIDw9IHRoaXMubWF4aW11bUxlbmd0aCkge1xuICAgICAgbGV0IGxlbmd0aDtcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgICBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgIGxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHZhbHVlLCAndWNzMicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2MoMik7XG4gICAgICBidWZmZXIud3JpdGVVSW50MTZMRShsZW5ndGgsIDApO1xuICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFVOS05PV05fUExQX0xFTjtcbiAgICB9XG4gIH0sXG5cbiAgKiBnZW5lcmF0ZVBhcmFtZXRlckRhdGEocGFyYW1ldGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKHBhcmFtZXRlci52YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHZhbHVlID0gcGFyYW1ldGVyLnZhbHVlO1xuXG4gICAgaWYgKHBhcmFtZXRlci5sZW5ndGghIDw9IHRoaXMubWF4aW11bUxlbmd0aCkge1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICB5aWVsZCBCdWZmZXIuZnJvbSh2YWx1ZSwgJ3VjczInKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcblxuICAgICAgICBpZiAobGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgICAgICAgICBidWZmZXIud3JpdGVVSW50MzJMRShsZW5ndGgsIDApO1xuICAgICAgICAgIHlpZWxkIGJ1ZmZlcjtcbiAgICAgICAgICB5aWVsZCB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICBjb25zdCBsZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aCh2YWx1ZSwgJ3VjczInKTtcblxuICAgICAgICBpZiAobGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgICAgICAgICBidWZmZXIud3JpdGVVSW50MzJMRShsZW5ndGgsIDApO1xuICAgICAgICAgIHlpZWxkIGJ1ZmZlcjtcbiAgICAgICAgICB5aWVsZCBCdWZmZXIuZnJvbSh2YWx1ZSwgJ3VjczInKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB5aWVsZCBQTFBfVEVSTUlOQVRPUjtcbiAgICB9XG4gIH0sXG5cbiAgdmFsaWRhdGU6IGZ1bmN0aW9uKHZhbHVlKTogbnVsbCB8IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHN0cmluZy4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IE5WYXJDaGFyO1xubW9kdWxlLmV4cG9ydHMgPSBOVmFyQ2hhcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUEsTUFBTUEsR0FBRyxHQUFHLENBQUMsS0FBSyxFQUFOLElBQVksQ0FBeEI7QUFDQSxNQUFNQyxlQUFlLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxFQUFPLElBQVAsRUFBYSxJQUFiLEVBQW1CLElBQW5CLEVBQXlCLElBQXpCLEVBQStCLElBQS9CLEVBQXFDLElBQXJDLEVBQTJDLElBQTNDLENBQVosQ0FBeEI7QUFDQSxNQUFNQyxjQUFjLEdBQUdGLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxFQUFPLElBQVAsRUFBYSxJQUFiLEVBQW1CLElBQW5CLENBQVosQ0FBdkI7QUFFQSxNQUFNRSxXQUFXLEdBQUdILE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxFQUFPLElBQVAsQ0FBWixDQUFwQjtBQUNBLE1BQU1HLGVBQWUsR0FBR0osTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxJQUFELEVBQU8sSUFBUCxFQUFhLElBQWIsRUFBbUIsSUFBbkIsRUFBeUIsSUFBekIsRUFBK0IsSUFBL0IsRUFBcUMsSUFBckMsRUFBMkMsSUFBM0MsQ0FBWixDQUF4QjtBQUVBLE1BQU1JLFFBQThDLEdBQUc7RUFDckRDLEVBQUUsRUFBRSxJQURpRDtFQUVyREMsSUFBSSxFQUFFLFVBRitDO0VBR3JEQyxJQUFJLEVBQUUsVUFIK0M7RUFJckRDLGFBQWEsRUFBRSxJQUpzQztFQU1yREMsV0FBVyxFQUFFLFVBQVNDLFNBQVQsRUFBb0I7SUFDL0IsTUFBTUMsS0FBSyxHQUFHRCxTQUFTLENBQUNDLEtBQXhCLENBRCtCLENBQ087O0lBRXRDLElBQUlDLE1BQUo7O0lBQ0EsSUFBSUYsU0FBUyxDQUFDRSxNQUFkLEVBQXNCO01BQ3BCQSxNQUFNLEdBQUdGLFNBQVMsQ0FBQ0UsTUFBbkI7SUFDRCxDQUZELE1BRU8sSUFBSUQsS0FBSyxJQUFJLElBQWIsRUFBbUI7TUFDeEJDLE1BQU0sR0FBR0QsS0FBSyxDQUFDRSxRQUFOLEdBQWlCRCxNQUFqQixJQUEyQixDQUFwQztJQUNELENBRk0sTUFFQSxJQUFJRCxLQUFLLEtBQUssSUFBVixJQUFrQixDQUFDRCxTQUFTLENBQUNJLE1BQWpDLEVBQXlDO01BQzlDRixNQUFNLEdBQUcsQ0FBVDtJQUNELENBRk0sTUFFQTtNQUNMQSxNQUFNLEdBQUcsS0FBS0osYUFBZDtJQUNEOztJQUVELElBQUlJLE1BQU0sSUFBSSxLQUFLSixhQUFuQixFQUFrQztNQUNoQyxPQUFPLGNBQWNJLE1BQWQsR0FBdUIsR0FBOUI7SUFDRCxDQUZELE1BRU87TUFDTCxPQUFPLGVBQVA7SUFDRDtFQUNGLENBekJvRDtFQTJCckRHLGFBQWEsRUFBRSxVQUFTTCxTQUFULEVBQW9CO0lBQ2pDLE1BQU1DLEtBQUssR0FBR0QsU0FBUyxDQUFDQyxLQUF4QixDQURpQyxDQUNLOztJQUN0QyxJQUFJRCxTQUFTLENBQUNFLE1BQVYsSUFBb0IsSUFBeEIsRUFBOEI7TUFDNUIsT0FBT0YsU0FBUyxDQUFDRSxNQUFqQjtJQUNELENBRkQsTUFFTyxJQUFJRCxLQUFLLElBQUksSUFBYixFQUFtQjtNQUN4QixJQUFJWixNQUFNLENBQUNpQixRQUFQLENBQWdCTCxLQUFoQixDQUFKLEVBQTRCO1FBQzFCLE9BQVFBLEtBQUssQ0FBQ0MsTUFBTixHQUFlLENBQWhCLElBQXNCLENBQTdCO01BQ0QsQ0FGRCxNQUVPO1FBQ0wsT0FBT0QsS0FBSyxDQUFDRSxRQUFOLEdBQWlCRCxNQUFqQixJQUEyQixDQUFsQztNQUNEO0lBQ0YsQ0FOTSxNQU1BO01BQ0wsT0FBTyxLQUFLSixhQUFaO0lBQ0Q7RUFDRixDQXhDb0Q7O0VBMENyRFMsZ0JBQWdCLENBQUNQLFNBQUQsRUFBWTtJQUMxQixNQUFNUSxNQUFNLEdBQUduQixNQUFNLENBQUNvQixLQUFQLENBQWEsQ0FBYixDQUFmO0lBQ0FELE1BQU0sQ0FBQ0UsVUFBUCxDQUFrQixLQUFLZixFQUF2QixFQUEyQixDQUEzQjs7SUFFQSxJQUFJSyxTQUFTLENBQUNFLE1BQVYsSUFBcUIsS0FBS0osYUFBOUIsRUFBNkM7TUFDM0NVLE1BQU0sQ0FBQ0csYUFBUCxDQUFxQlgsU0FBUyxDQUFDRSxNQUFWLEdBQW9CLENBQXpDLEVBQTRDLENBQTVDO0lBQ0QsQ0FGRCxNQUVPO01BQ0xNLE1BQU0sQ0FBQ0csYUFBUCxDQUFxQnhCLEdBQXJCLEVBQTBCLENBQTFCO0lBQ0Q7O0lBRUQsSUFBSWEsU0FBUyxDQUFDWSxTQUFkLEVBQXlCO01BQ3ZCWixTQUFTLENBQUNZLFNBQVYsQ0FBb0JDLFFBQXBCLEdBQStCQyxJQUEvQixDQUFvQ04sTUFBcEMsRUFBNEMsQ0FBNUMsRUFBK0MsQ0FBL0MsRUFBa0QsQ0FBbEQ7SUFDRDs7SUFFRCxPQUFPQSxNQUFQO0VBQ0QsQ0F6RG9EOztFQTJEckRPLHVCQUF1QixDQUFDZixTQUFELEVBQVlnQixPQUFaLEVBQXFCO0lBQzFDLElBQUloQixTQUFTLENBQUNDLEtBQVYsSUFBbUIsSUFBdkIsRUFBNkI7TUFDM0IsSUFBSUQsU0FBUyxDQUFDRSxNQUFWLElBQXFCLEtBQUtKLGFBQTlCLEVBQTZDO1FBQzNDLE9BQU9OLFdBQVA7TUFDRCxDQUZELE1BRU87UUFDTCxPQUFPQyxlQUFQO01BQ0Q7SUFDRjs7SUFFRCxJQUFJUSxLQUFLLEdBQUdELFNBQVMsQ0FBQ0MsS0FBdEI7O0lBQ0EsSUFBSUQsU0FBUyxDQUFDRSxNQUFWLElBQXFCLEtBQUtKLGFBQTlCLEVBQTZDO01BQzNDLElBQUlJLE1BQUo7O01BQ0EsSUFBSUQsS0FBSyxZQUFZWixNQUFyQixFQUE2QjtRQUMzQmEsTUFBTSxHQUFHRCxLQUFLLENBQUNDLE1BQWY7TUFDRCxDQUZELE1BRU87UUFDTEQsS0FBSyxHQUFHQSxLQUFLLENBQUNFLFFBQU4sRUFBUjtRQUNBRCxNQUFNLEdBQUdiLE1BQU0sQ0FBQzRCLFVBQVAsQ0FBa0JoQixLQUFsQixFQUF5QixNQUF6QixDQUFUO01BQ0Q7O01BRUQsTUFBTU8sTUFBTSxHQUFHbkIsTUFBTSxDQUFDb0IsS0FBUCxDQUFhLENBQWIsQ0FBZjtNQUNBRCxNQUFNLENBQUNHLGFBQVAsQ0FBcUJULE1BQXJCLEVBQTZCLENBQTdCO01BQ0EsT0FBT00sTUFBUDtJQUNELENBWkQsTUFZTztNQUNMLE9BQU9wQixlQUFQO0lBQ0Q7RUFDRixDQXBGb0Q7O0VBc0ZyRCxDQUFFOEIscUJBQUYsQ0FBd0JsQixTQUF4QixFQUFtQ2dCLE9BQW5DLEVBQTRDO0lBQzFDLElBQUloQixTQUFTLENBQUNDLEtBQVYsSUFBbUIsSUFBdkIsRUFBNkI7TUFDM0I7SUFDRDs7SUFFRCxJQUFJQSxLQUFLLEdBQUdELFNBQVMsQ0FBQ0MsS0FBdEI7O0lBRUEsSUFBSUQsU0FBUyxDQUFDRSxNQUFWLElBQXFCLEtBQUtKLGFBQTlCLEVBQTZDO01BQzNDLElBQUlHLEtBQUssWUFBWVosTUFBckIsRUFBNkI7UUFDM0IsTUFBTVksS0FBTjtNQUNELENBRkQsTUFFTztRQUNMQSxLQUFLLEdBQUdBLEtBQUssQ0FBQ0UsUUFBTixFQUFSO1FBQ0EsTUFBTWQsTUFBTSxDQUFDQyxJQUFQLENBQVlXLEtBQVosRUFBbUIsTUFBbkIsQ0FBTjtNQUNEO0lBQ0YsQ0FQRCxNQU9PO01BQ0wsSUFBSUEsS0FBSyxZQUFZWixNQUFyQixFQUE2QjtRQUMzQixNQUFNYSxNQUFNLEdBQUdELEtBQUssQ0FBQ0MsTUFBckI7O1FBRUEsSUFBSUEsTUFBTSxHQUFHLENBQWIsRUFBZ0I7VUFDZCxNQUFNTSxNQUFNLEdBQUduQixNQUFNLENBQUNvQixLQUFQLENBQWEsQ0FBYixDQUFmO1VBQ0FELE1BQU0sQ0FBQ1csYUFBUCxDQUFxQmpCLE1BQXJCLEVBQTZCLENBQTdCO1VBQ0EsTUFBTU0sTUFBTjtVQUNBLE1BQU1QLEtBQU47UUFDRDtNQUNGLENBVEQsTUFTTztRQUNMQSxLQUFLLEdBQUdBLEtBQUssQ0FBQ0UsUUFBTixFQUFSO1FBQ0EsTUFBTUQsTUFBTSxHQUFHYixNQUFNLENBQUM0QixVQUFQLENBQWtCaEIsS0FBbEIsRUFBeUIsTUFBekIsQ0FBZjs7UUFFQSxJQUFJQyxNQUFNLEdBQUcsQ0FBYixFQUFnQjtVQUNkLE1BQU1NLE1BQU0sR0FBR25CLE1BQU0sQ0FBQ29CLEtBQVAsQ0FBYSxDQUFiLENBQWY7VUFDQUQsTUFBTSxDQUFDVyxhQUFQLENBQXFCakIsTUFBckIsRUFBNkIsQ0FBN0I7VUFDQSxNQUFNTSxNQUFOO1VBQ0EsTUFBTW5CLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZVyxLQUFaLEVBQW1CLE1BQW5CLENBQU47UUFDRDtNQUNGOztNQUVELE1BQU1WLGNBQU47SUFDRDtFQUNGLENBNUhvRDs7RUE4SHJENkIsUUFBUSxFQUFFLFVBQVNuQixLQUFULEVBQStCO0lBQ3ZDLElBQUlBLEtBQUssSUFBSSxJQUFiLEVBQW1CO01BQ2pCLE9BQU8sSUFBUDtJQUNEOztJQUVELElBQUksT0FBT0EsS0FBUCxLQUFpQixRQUFyQixFQUErQjtNQUM3QixNQUFNLElBQUlvQixTQUFKLENBQWMsaUJBQWQsQ0FBTjtJQUNEOztJQUVELE9BQU9wQixLQUFQO0VBQ0Q7QUF4SW9ELENBQXZEO2VBMkllUCxROztBQUNmNEIsTUFBTSxDQUFDQyxPQUFQLEdBQWlCN0IsUUFBakIifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _floatn = _interopRequireDefault(require("./floatn"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const NULL_LENGTH = Buffer.from([0x00]);
const DATA_LENGTH = Buffer.from([0x04]);
const Real = {
  id: 0x3B,
  type: 'FLT4',
  name: 'Real',
  declaration: function () {
    return 'real';
  },

  generateTypeInfo() {
    return Buffer.from([_floatn.default.id, 0x04]);
  },

  generateParameterLength(parameter, options) {
    if (parameter.value == null) {
      return NULL_LENGTH;
    }

    return DATA_LENGTH;
  },

  *generateParameterData(parameter, options) {
    if (parameter.value == null) {
      return;
    }

    const buffer = Buffer.alloc(4);
    buffer.writeFloatLE(parseFloat(parameter.value), 0);
    yield buffer;
  },

  validate: function (value) {
    if (value == null) {
      return null;
    }

    value = parseFloat(value);

    if (isNaN(value)) {
      throw new TypeError('Invalid number.');
    }

    return value;
  }
};
var _default = Real;
exports.default = _default;
module.exports = Real;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOVUxMX0xFTkdUSCIsIkJ1ZmZlciIsImZyb20iLCJEQVRBX0xFTkdUSCIsIlJlYWwiLCJpZCIsInR5cGUiLCJuYW1lIiwiZGVjbGFyYXRpb24iLCJnZW5lcmF0ZVR5cGVJbmZvIiwiRmxvYXROIiwiZ2VuZXJhdGVQYXJhbWV0ZXJMZW5ndGgiLCJwYXJhbWV0ZXIiLCJvcHRpb25zIiwidmFsdWUiLCJnZW5lcmF0ZVBhcmFtZXRlckRhdGEiLCJidWZmZXIiLCJhbGxvYyIsIndyaXRlRmxvYXRMRSIsInBhcnNlRmxvYXQiLCJ2YWxpZGF0ZSIsImlzTmFOIiwiVHlwZUVycm9yIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhLXR5cGVzL3JlYWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuLi9kYXRhLXR5cGUnO1xuaW1wb3J0IEZsb2F0TiBmcm9tICcuL2Zsb2F0bic7XG5cbmNvbnN0IE5VTExfTEVOR1RIID0gQnVmZmVyLmZyb20oWzB4MDBdKTtcbmNvbnN0IERBVEFfTEVOR1RIID0gQnVmZmVyLmZyb20oWzB4MDRdKTtcblxuY29uc3QgUmVhbDogRGF0YVR5cGUgPSB7XG4gIGlkOiAweDNCLFxuICB0eXBlOiAnRkxUNCcsXG4gIG5hbWU6ICdSZWFsJyxcblxuICBkZWNsYXJhdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICdyZWFsJztcbiAgfSxcblxuICBnZW5lcmF0ZVR5cGVJbmZvKCkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShbRmxvYXROLmlkLCAweDA0XSk7XG4gIH0sXG5cbiAgZ2VuZXJhdGVQYXJhbWV0ZXJMZW5ndGgocGFyYW1ldGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKHBhcmFtZXRlci52YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gTlVMTF9MRU5HVEg7XG4gICAgfVxuXG4gICAgcmV0dXJuIERBVEFfTEVOR1RIO1xuICB9LFxuXG4gICogZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhKHBhcmFtZXRlciwgb3B0aW9ucykge1xuICAgIGlmIChwYXJhbWV0ZXIudmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgICBidWZmZXIud3JpdGVGbG9hdExFKHBhcnNlRmxvYXQocGFyYW1ldGVyLnZhbHVlKSwgMCk7XG4gICAgeWllbGQgYnVmZmVyO1xuICB9LFxuXG4gIHZhbGlkYXRlOiBmdW5jdGlvbih2YWx1ZSk6IG51bGwgfCBudW1iZXIge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG51bWJlci4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBSZWFsO1xubW9kdWxlLmV4cG9ydHMgPSBSZWFsO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQ0E7Ozs7QUFFQSxNQUFNQSxXQUFXLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxDQUFaLENBQXBCO0FBQ0EsTUFBTUMsV0FBVyxHQUFHRixNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDLElBQUQsQ0FBWixDQUFwQjtBQUVBLE1BQU1FLElBQWMsR0FBRztFQUNyQkMsRUFBRSxFQUFFLElBRGlCO0VBRXJCQyxJQUFJLEVBQUUsTUFGZTtFQUdyQkMsSUFBSSxFQUFFLE1BSGU7RUFLckJDLFdBQVcsRUFBRSxZQUFXO0lBQ3RCLE9BQU8sTUFBUDtFQUNELENBUG9COztFQVNyQkMsZ0JBQWdCLEdBQUc7SUFDakIsT0FBT1IsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQ1EsZ0JBQU9MLEVBQVIsRUFBWSxJQUFaLENBQVosQ0FBUDtFQUNELENBWG9COztFQWFyQk0sdUJBQXVCLENBQUNDLFNBQUQsRUFBWUMsT0FBWixFQUFxQjtJQUMxQyxJQUFJRCxTQUFTLENBQUNFLEtBQVYsSUFBbUIsSUFBdkIsRUFBNkI7TUFDM0IsT0FBT2QsV0FBUDtJQUNEOztJQUVELE9BQU9HLFdBQVA7RUFDRCxDQW5Cb0I7O0VBcUJyQixDQUFFWSxxQkFBRixDQUF3QkgsU0FBeEIsRUFBbUNDLE9BQW5DLEVBQTRDO0lBQzFDLElBQUlELFNBQVMsQ0FBQ0UsS0FBVixJQUFtQixJQUF2QixFQUE2QjtNQUMzQjtJQUNEOztJQUVELE1BQU1FLE1BQU0sR0FBR2YsTUFBTSxDQUFDZ0IsS0FBUCxDQUFhLENBQWIsQ0FBZjtJQUNBRCxNQUFNLENBQUNFLFlBQVAsQ0FBb0JDLFVBQVUsQ0FBQ1AsU0FBUyxDQUFDRSxLQUFYLENBQTlCLEVBQWlELENBQWpEO0lBQ0EsTUFBTUUsTUFBTjtFQUNELENBN0JvQjs7RUErQnJCSSxRQUFRLEVBQUUsVUFBU04sS0FBVCxFQUErQjtJQUN2QyxJQUFJQSxLQUFLLElBQUksSUFBYixFQUFtQjtNQUNqQixPQUFPLElBQVA7SUFDRDs7SUFDREEsS0FBSyxHQUFHSyxVQUFVLENBQUNMLEtBQUQsQ0FBbEI7O0lBQ0EsSUFBSU8sS0FBSyxDQUFDUCxLQUFELENBQVQsRUFBa0I7TUFDaEIsTUFBTSxJQUFJUSxTQUFKLENBQWMsaUJBQWQsQ0FBTjtJQUNEOztJQUNELE9BQU9SLEtBQVA7RUFDRDtBQXhDb0IsQ0FBdkI7ZUEyQ2VWLEk7O0FBQ2ZtQixNQUFNLENBQUNDLE9BQVAsR0FBaUJwQixJQUFqQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _datetimen = _interopRequireDefault(require("./datetimen"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const EPOCH_DATE = new Date(1900, 0, 1);
const UTC_EPOCH_DATE = new Date(Date.UTC(1900, 0, 1));
const DATA_LENGTH = Buffer.from([0x04]);
const NULL_LENGTH = Buffer.from([0x00]);
const SmallDateTime = {
  id: 0x3A,
  type: 'DATETIM4',
  name: 'SmallDateTime',
  declaration: function () {
    return 'smalldatetime';
  },

  generateTypeInfo() {
    return Buffer.from([_datetimen.default.id, 0x04]);
  },

  generateParameterLength(parameter, options) {
    if (parameter.value == null) {
      return NULL_LENGTH;
    }

    return DATA_LENGTH;
  },

  generateParameterData: function* (parameter, options) {
    if (parameter.value == null) {
      return;
    }

    const buffer = Buffer.alloc(4);
    let days, dstDiff, minutes;

    if (options.useUTC) {
      days = Math.floor((parameter.value.getTime() - UTC_EPOCH_DATE.getTime()) / (1000 * 60 * 60 * 24));
      minutes = parameter.value.getUTCHours() * 60 + parameter.value.getUTCMinutes();
    } else {
      dstDiff = -(parameter.value.getTimezoneOffset() - EPOCH_DATE.getTimezoneOffset()) * 60 * 1000;
      days = Math.floor((parameter.value.getTime() - EPOCH_DATE.getTime() + dstDiff) / (1000 * 60 * 60 * 24));
      minutes = parameter.value.getHours() * 60 + parameter.value.getMinutes();
    }

    buffer.writeUInt16LE(days, 0);
    buffer.writeUInt16LE(minutes, 2);
    yield buffer;
  },
  validate: function (value) {
    if (value == null) {
      return null;
    }

    if (!(value instanceof Date)) {
      value = new Date(Date.parse(value));
    }

    if (isNaN(value)) {
      throw new TypeError('Invalid date.');
    }

    return value;
  }
};
var _default = SmallDateTime;
exports.default = _default;
module.exports = SmallDateTime;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFUE9DSF9EQVRFIiwiRGF0ZSIsIlVUQ19FUE9DSF9EQVRFIiwiVVRDIiwiREFUQV9MRU5HVEgiLCJCdWZmZXIiLCJmcm9tIiwiTlVMTF9MRU5HVEgiLCJTbWFsbERhdGVUaW1lIiwiaWQiLCJ0eXBlIiwibmFtZSIsImRlY2xhcmF0aW9uIiwiZ2VuZXJhdGVUeXBlSW5mbyIsIkRhdGVUaW1lTiIsImdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoIiwicGFyYW1ldGVyIiwib3B0aW9ucyIsInZhbHVlIiwiZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhIiwiYnVmZmVyIiwiYWxsb2MiLCJkYXlzIiwiZHN0RGlmZiIsIm1pbnV0ZXMiLCJ1c2VVVEMiLCJNYXRoIiwiZmxvb3IiLCJnZXRUaW1lIiwiZ2V0VVRDSG91cnMiLCJnZXRVVENNaW51dGVzIiwiZ2V0VGltZXpvbmVPZmZzZXQiLCJnZXRIb3VycyIsImdldE1pbnV0ZXMiLCJ3cml0ZVVJbnQxNkxFIiwidmFsaWRhdGUiLCJwYXJzZSIsImlzTmFOIiwiVHlwZUVycm9yIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhLXR5cGVzL3NtYWxsZGF0ZXRpbWUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuLi9kYXRhLXR5cGUnO1xuaW1wb3J0IERhdGVUaW1lTiBmcm9tICcuL2RhdGV0aW1lbic7XG5cbmNvbnN0IEVQT0NIX0RBVEUgPSBuZXcgRGF0ZSgxOTAwLCAwLCAxKTtcbmNvbnN0IFVUQ19FUE9DSF9EQVRFID0gbmV3IERhdGUoRGF0ZS5VVEMoMTkwMCwgMCwgMSkpO1xuXG5jb25zdCBEQVRBX0xFTkdUSCA9IEJ1ZmZlci5mcm9tKFsweDA0XSk7XG5jb25zdCBOVUxMX0xFTkdUSCA9IEJ1ZmZlci5mcm9tKFsweDAwXSk7XG5cbmNvbnN0IFNtYWxsRGF0ZVRpbWU6IERhdGFUeXBlID0ge1xuICBpZDogMHgzQSxcbiAgdHlwZTogJ0RBVEVUSU00JyxcbiAgbmFtZTogJ1NtYWxsRGF0ZVRpbWUnLFxuXG4gIGRlY2xhcmF0aW9uOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gJ3NtYWxsZGF0ZXRpbWUnO1xuICB9LFxuXG4gIGdlbmVyYXRlVHlwZUluZm8oKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKFtEYXRlVGltZU4uaWQsIDB4MDRdKTtcbiAgfSxcblxuICBnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aChwYXJhbWV0ZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAocGFyYW1ldGVyLnZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBOVUxMX0xFTkdUSDtcbiAgICB9XG5cbiAgICByZXR1cm4gREFUQV9MRU5HVEg7XG4gIH0sXG5cbiAgZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhOiBmdW5jdGlvbioocGFyYW1ldGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKHBhcmFtZXRlci52YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jKDQpO1xuXG4gICAgbGV0IGRheXMsIGRzdERpZmYsIG1pbnV0ZXM7XG4gICAgaWYgKG9wdGlvbnMudXNlVVRDKSB7XG4gICAgICBkYXlzID0gTWF0aC5mbG9vcigocGFyYW1ldGVyLnZhbHVlLmdldFRpbWUoKSAtIFVUQ19FUE9DSF9EQVRFLmdldFRpbWUoKSkgLyAoMTAwMCAqIDYwICogNjAgKiAyNCkpO1xuICAgICAgbWludXRlcyA9IChwYXJhbWV0ZXIudmFsdWUuZ2V0VVRDSG91cnMoKSAqIDYwKSArIHBhcmFtZXRlci52YWx1ZS5nZXRVVENNaW51dGVzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRzdERpZmYgPSAtKHBhcmFtZXRlci52YWx1ZS5nZXRUaW1lem9uZU9mZnNldCgpIC0gRVBPQ0hfREFURS5nZXRUaW1lem9uZU9mZnNldCgpKSAqIDYwICogMTAwMDtcbiAgICAgIGRheXMgPSBNYXRoLmZsb29yKChwYXJhbWV0ZXIudmFsdWUuZ2V0VGltZSgpIC0gRVBPQ0hfREFURS5nZXRUaW1lKCkgKyBkc3REaWZmKSAvICgxMDAwICogNjAgKiA2MCAqIDI0KSk7XG4gICAgICBtaW51dGVzID0gKHBhcmFtZXRlci52YWx1ZS5nZXRIb3VycygpICogNjApICsgcGFyYW1ldGVyLnZhbHVlLmdldE1pbnV0ZXMoKTtcbiAgICB9XG5cbiAgICBidWZmZXIud3JpdGVVSW50MTZMRShkYXlzLCAwKTtcbiAgICBidWZmZXIud3JpdGVVSW50MTZMRShtaW51dGVzLCAyKTtcblxuICAgIHlpZWxkIGJ1ZmZlcjtcbiAgfSxcblxuICB2YWxpZGF0ZTogZnVuY3Rpb24odmFsdWUpOiBudWxsIHwgRGF0ZSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgIHZhbHVlID0gbmV3IERhdGUoRGF0ZS5wYXJzZSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgZGF0ZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNtYWxsRGF0ZVRpbWU7XG5tb2R1bGUuZXhwb3J0cyA9IFNtYWxsRGF0ZVRpbWU7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7OztBQUVBLE1BQU1BLFVBQVUsR0FBRyxJQUFJQyxJQUFKLENBQVMsSUFBVCxFQUFlLENBQWYsRUFBa0IsQ0FBbEIsQ0FBbkI7QUFDQSxNQUFNQyxjQUFjLEdBQUcsSUFBSUQsSUFBSixDQUFTQSxJQUFJLENBQUNFLEdBQUwsQ0FBUyxJQUFULEVBQWUsQ0FBZixFQUFrQixDQUFsQixDQUFULENBQXZCO0FBRUEsTUFBTUMsV0FBVyxHQUFHQyxNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDLElBQUQsQ0FBWixDQUFwQjtBQUNBLE1BQU1DLFdBQVcsR0FBR0YsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxJQUFELENBQVosQ0FBcEI7QUFFQSxNQUFNRSxhQUF1QixHQUFHO0VBQzlCQyxFQUFFLEVBQUUsSUFEMEI7RUFFOUJDLElBQUksRUFBRSxVQUZ3QjtFQUc5QkMsSUFBSSxFQUFFLGVBSHdCO0VBSzlCQyxXQUFXLEVBQUUsWUFBVztJQUN0QixPQUFPLGVBQVA7RUFDRCxDQVA2Qjs7RUFTOUJDLGdCQUFnQixHQUFHO0lBQ2pCLE9BQU9SLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUNRLG1CQUFVTCxFQUFYLEVBQWUsSUFBZixDQUFaLENBQVA7RUFDRCxDQVg2Qjs7RUFhOUJNLHVCQUF1QixDQUFDQyxTQUFELEVBQVlDLE9BQVosRUFBcUI7SUFDMUMsSUFBSUQsU0FBUyxDQUFDRSxLQUFWLElBQW1CLElBQXZCLEVBQTZCO01BQzNCLE9BQU9YLFdBQVA7SUFDRDs7SUFFRCxPQUFPSCxXQUFQO0VBQ0QsQ0FuQjZCOztFQXFCOUJlLHFCQUFxQixFQUFFLFdBQVVILFNBQVYsRUFBcUJDLE9BQXJCLEVBQThCO0lBQ25ELElBQUlELFNBQVMsQ0FBQ0UsS0FBVixJQUFtQixJQUF2QixFQUE2QjtNQUMzQjtJQUNEOztJQUVELE1BQU1FLE1BQU0sR0FBR2YsTUFBTSxDQUFDZ0IsS0FBUCxDQUFhLENBQWIsQ0FBZjtJQUVBLElBQUlDLElBQUosRUFBVUMsT0FBVixFQUFtQkMsT0FBbkI7O0lBQ0EsSUFBSVAsT0FBTyxDQUFDUSxNQUFaLEVBQW9CO01BQ2xCSCxJQUFJLEdBQUdJLElBQUksQ0FBQ0MsS0FBTCxDQUFXLENBQUNYLFNBQVMsQ0FBQ0UsS0FBVixDQUFnQlUsT0FBaEIsS0FBNEIxQixjQUFjLENBQUMwQixPQUFmLEVBQTdCLEtBQTBELE9BQU8sRUFBUCxHQUFZLEVBQVosR0FBaUIsRUFBM0UsQ0FBWCxDQUFQO01BQ0FKLE9BQU8sR0FBSVIsU0FBUyxDQUFDRSxLQUFWLENBQWdCVyxXQUFoQixLQUFnQyxFQUFqQyxHQUF1Q2IsU0FBUyxDQUFDRSxLQUFWLENBQWdCWSxhQUFoQixFQUFqRDtJQUNELENBSEQsTUFHTztNQUNMUCxPQUFPLEdBQUcsRUFBRVAsU0FBUyxDQUFDRSxLQUFWLENBQWdCYSxpQkFBaEIsS0FBc0MvQixVQUFVLENBQUMrQixpQkFBWCxFQUF4QyxJQUEwRSxFQUExRSxHQUErRSxJQUF6RjtNQUNBVCxJQUFJLEdBQUdJLElBQUksQ0FBQ0MsS0FBTCxDQUFXLENBQUNYLFNBQVMsQ0FBQ0UsS0FBVixDQUFnQlUsT0FBaEIsS0FBNEI1QixVQUFVLENBQUM0QixPQUFYLEVBQTVCLEdBQW1ETCxPQUFwRCxLQUFnRSxPQUFPLEVBQVAsR0FBWSxFQUFaLEdBQWlCLEVBQWpGLENBQVgsQ0FBUDtNQUNBQyxPQUFPLEdBQUlSLFNBQVMsQ0FBQ0UsS0FBVixDQUFnQmMsUUFBaEIsS0FBNkIsRUFBOUIsR0FBb0NoQixTQUFTLENBQUNFLEtBQVYsQ0FBZ0JlLFVBQWhCLEVBQTlDO0lBQ0Q7O0lBRURiLE1BQU0sQ0FBQ2MsYUFBUCxDQUFxQlosSUFBckIsRUFBMkIsQ0FBM0I7SUFDQUYsTUFBTSxDQUFDYyxhQUFQLENBQXFCVixPQUFyQixFQUE4QixDQUE5QjtJQUVBLE1BQU1KLE1BQU47RUFDRCxDQTFDNkI7RUE0QzlCZSxRQUFRLEVBQUUsVUFBU2pCLEtBQVQsRUFBNkI7SUFDckMsSUFBSUEsS0FBSyxJQUFJLElBQWIsRUFBbUI7TUFDakIsT0FBTyxJQUFQO0lBQ0Q7O0lBRUQsSUFBSSxFQUFFQSxLQUFLLFlBQVlqQixJQUFuQixDQUFKLEVBQThCO01BQzVCaUIsS0FBSyxHQUFHLElBQUlqQixJQUFKLENBQVNBLElBQUksQ0FBQ21DLEtBQUwsQ0FBV2xCLEtBQVgsQ0FBVCxDQUFSO0lBQ0Q7O0lBRUQsSUFBSW1CLEtBQUssQ0FBQ25CLEtBQUQsQ0FBVCxFQUFrQjtNQUNoQixNQUFNLElBQUlvQixTQUFKLENBQWMsZUFBZCxDQUFOO0lBQ0Q7O0lBRUQsT0FBT3BCLEtBQVA7RUFDRDtBQTFENkIsQ0FBaEM7ZUE2RGVWLGE7O0FBQ2YrQixNQUFNLENBQUNDLE9BQVAsR0FBaUJoQyxhQUFqQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _intn = _interopRequireDefault(require("./intn"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const DATA_LENGTH = Buffer.from([0x02]);
const NULL_LENGTH = Buffer.from([0x00]);
const SmallInt = {
  id: 0x34,
  type: 'INT2',
  name: 'SmallInt',
  declaration: function () {
    return 'smallint';
  },

  generateTypeInfo() {
    return Buffer.from([_intn.default.id, 0x02]);
  },

  generateParameterLength(parameter, options) {
    if (parameter.value == null) {
      return NULL_LENGTH;
    }

    return DATA_LENGTH;
  },

  *generateParameterData(parameter, options) {
    if (parameter.value == null) {
      return;
    }

    const buffer = Buffer.alloc(2);
    buffer.writeInt16LE(Number(parameter.value), 0);
    yield buffer;
  },

  validate: function (value) {
    if (value == null) {
      return null;
    }

    if (typeof value !== 'number') {
      value = Number(value);
    }

    if (isNaN(value)) {
      throw new TypeError('Invalid number.');
    }

    if (value < -32768 || value > 32767) {
      throw new TypeError('Value must be between -32768 and 32767, inclusive.');
    }

    return value | 0;
  }
};
var _default = SmallInt;
exports.default = _default;
module.exports = SmallInt;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJEQVRBX0xFTkdUSCIsIkJ1ZmZlciIsImZyb20iLCJOVUxMX0xFTkdUSCIsIlNtYWxsSW50IiwiaWQiLCJ0eXBlIiwibmFtZSIsImRlY2xhcmF0aW9uIiwiZ2VuZXJhdGVUeXBlSW5mbyIsIkludE4iLCJnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aCIsInBhcmFtZXRlciIsIm9wdGlvbnMiLCJ2YWx1ZSIsImdlbmVyYXRlUGFyYW1ldGVyRGF0YSIsImJ1ZmZlciIsImFsbG9jIiwid3JpdGVJbnQxNkxFIiwiTnVtYmVyIiwidmFsaWRhdGUiLCJpc05hTiIsIlR5cGVFcnJvciIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YS10eXBlcy9zbWFsbGludC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4uL2RhdGEtdHlwZSc7XG5pbXBvcnQgSW50TiBmcm9tICcuL2ludG4nO1xuXG5jb25zdCBEQVRBX0xFTkdUSCA9IEJ1ZmZlci5mcm9tKFsweDAyXSk7XG5jb25zdCBOVUxMX0xFTkdUSCA9IEJ1ZmZlci5mcm9tKFsweDAwXSk7XG5cbmNvbnN0IFNtYWxsSW50OiBEYXRhVHlwZSA9IHtcbiAgaWQ6IDB4MzQsXG4gIHR5cGU6ICdJTlQyJyxcbiAgbmFtZTogJ1NtYWxsSW50JyxcblxuICBkZWNsYXJhdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICdzbWFsbGludCc7XG4gIH0sXG5cbiAgZ2VuZXJhdGVUeXBlSW5mbygpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oW0ludE4uaWQsIDB4MDJdKTtcbiAgfSxcblxuICBnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aChwYXJhbWV0ZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAocGFyYW1ldGVyLnZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBOVUxMX0xFTkdUSDtcbiAgICB9XG5cbiAgICByZXR1cm4gREFUQV9MRU5HVEg7XG4gIH0sXG5cbiAgKiBnZW5lcmF0ZVBhcmFtZXRlckRhdGEocGFyYW1ldGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKHBhcmFtZXRlci52YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jKDIpO1xuICAgIGJ1ZmZlci53cml0ZUludDE2TEUoTnVtYmVyKHBhcmFtZXRlci52YWx1ZSksIDApO1xuICAgIHlpZWxkIGJ1ZmZlcjtcbiAgfSxcblxuICB2YWxpZGF0ZTogZnVuY3Rpb24odmFsdWUpOiBudWxsIHwgbnVtYmVyIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgIHZhbHVlID0gTnVtYmVyKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG51bWJlci4nKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPCAtMzI3NjggfHwgdmFsdWUgPiAzMjc2Nykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVmFsdWUgbXVzdCBiZSBiZXR3ZWVuIC0zMjc2OCBhbmQgMzI3NjcsIGluY2x1c2l2ZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWUgfCAwO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBTbWFsbEludDtcbm1vZHVsZS5leHBvcnRzID0gU21hbGxJbnQ7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7OztBQUVBLE1BQU1BLFdBQVcsR0FBR0MsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxJQUFELENBQVosQ0FBcEI7QUFDQSxNQUFNQyxXQUFXLEdBQUdGLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxDQUFaLENBQXBCO0FBRUEsTUFBTUUsUUFBa0IsR0FBRztFQUN6QkMsRUFBRSxFQUFFLElBRHFCO0VBRXpCQyxJQUFJLEVBQUUsTUFGbUI7RUFHekJDLElBQUksRUFBRSxVQUhtQjtFQUt6QkMsV0FBVyxFQUFFLFlBQVc7SUFDdEIsT0FBTyxVQUFQO0VBQ0QsQ0FQd0I7O0VBU3pCQyxnQkFBZ0IsR0FBRztJQUNqQixPQUFPUixNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDUSxjQUFLTCxFQUFOLEVBQVUsSUFBVixDQUFaLENBQVA7RUFDRCxDQVh3Qjs7RUFhekJNLHVCQUF1QixDQUFDQyxTQUFELEVBQVlDLE9BQVosRUFBcUI7SUFDMUMsSUFBSUQsU0FBUyxDQUFDRSxLQUFWLElBQW1CLElBQXZCLEVBQTZCO01BQzNCLE9BQU9YLFdBQVA7SUFDRDs7SUFFRCxPQUFPSCxXQUFQO0VBQ0QsQ0FuQndCOztFQXFCekIsQ0FBRWUscUJBQUYsQ0FBd0JILFNBQXhCLEVBQW1DQyxPQUFuQyxFQUE0QztJQUMxQyxJQUFJRCxTQUFTLENBQUNFLEtBQVYsSUFBbUIsSUFBdkIsRUFBNkI7TUFDM0I7SUFDRDs7SUFFRCxNQUFNRSxNQUFNLEdBQUdmLE1BQU0sQ0FBQ2dCLEtBQVAsQ0FBYSxDQUFiLENBQWY7SUFDQUQsTUFBTSxDQUFDRSxZQUFQLENBQW9CQyxNQUFNLENBQUNQLFNBQVMsQ0FBQ0UsS0FBWCxDQUExQixFQUE2QyxDQUE3QztJQUNBLE1BQU1FLE1BQU47RUFDRCxDQTdCd0I7O0VBK0J6QkksUUFBUSxFQUFFLFVBQVNOLEtBQVQsRUFBK0I7SUFDdkMsSUFBSUEsS0FBSyxJQUFJLElBQWIsRUFBbUI7TUFDakIsT0FBTyxJQUFQO0lBQ0Q7O0lBRUQsSUFBSSxPQUFPQSxLQUFQLEtBQWlCLFFBQXJCLEVBQStCO01BQzdCQSxLQUFLLEdBQUdLLE1BQU0sQ0FBQ0wsS0FBRCxDQUFkO0lBQ0Q7O0lBRUQsSUFBSU8sS0FBSyxDQUFDUCxLQUFELENBQVQsRUFBa0I7TUFDaEIsTUFBTSxJQUFJUSxTQUFKLENBQWMsaUJBQWQsQ0FBTjtJQUNEOztJQUVELElBQUlSLEtBQUssR0FBRyxDQUFDLEtBQVQsSUFBa0JBLEtBQUssR0FBRyxLQUE5QixFQUFxQztNQUNuQyxNQUFNLElBQUlRLFNBQUosQ0FBYyxvREFBZCxDQUFOO0lBQ0Q7O0lBRUQsT0FBT1IsS0FBSyxHQUFHLENBQWY7RUFDRDtBQWpEd0IsQ0FBM0I7ZUFvRGVWLFE7O0FBQ2ZtQixNQUFNLENBQUNDLE9BQVAsR0FBaUJwQixRQUFqQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _moneyn = _interopRequireDefault(require("./moneyn"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const DATA_LENGTH = Buffer.from([0x04]);
const NULL_LENGTH = Buffer.from([0x00]);
const SmallMoney = {
  id: 0x7A,
  type: 'MONEY4',
  name: 'SmallMoney',
  declaration: function () {
    return 'smallmoney';
  },
  generateTypeInfo: function () {
    return Buffer.from([_moneyn.default.id, 0x04]);
  },

  generateParameterLength(parameter, options) {
    if (parameter.value == null) {
      return NULL_LENGTH;
    }

    return DATA_LENGTH;
  },

  *generateParameterData(parameter, options) {
    if (parameter.value == null) {
      return;
    }

    const buffer = Buffer.alloc(4);
    buffer.writeInt32LE(parameter.value * 10000, 0);
    yield buffer;
  },

  validate: function (value) {
    if (value == null) {
      return null;
    }

    value = parseFloat(value);

    if (isNaN(value)) {
      throw new TypeError('Invalid number.');
    }

    if (value < -214748.3648 || value > 214748.3647) {
      throw new TypeError('Value must be between -214748.3648 and 214748.3647.');
    }

    return value;
  }
};
var _default = SmallMoney;
exports.default = _default;
module.exports = SmallMoney;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJEQVRBX0xFTkdUSCIsIkJ1ZmZlciIsImZyb20iLCJOVUxMX0xFTkdUSCIsIlNtYWxsTW9uZXkiLCJpZCIsInR5cGUiLCJuYW1lIiwiZGVjbGFyYXRpb24iLCJnZW5lcmF0ZVR5cGVJbmZvIiwiTW9uZXlOIiwiZ2VuZXJhdGVQYXJhbWV0ZXJMZW5ndGgiLCJwYXJhbWV0ZXIiLCJvcHRpb25zIiwidmFsdWUiLCJnZW5lcmF0ZVBhcmFtZXRlckRhdGEiLCJidWZmZXIiLCJhbGxvYyIsIndyaXRlSW50MzJMRSIsInZhbGlkYXRlIiwicGFyc2VGbG9hdCIsImlzTmFOIiwiVHlwZUVycm9yIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhLXR5cGVzL3NtYWxsbW9uZXkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuLi9kYXRhLXR5cGUnO1xuaW1wb3J0IE1vbmV5TiBmcm9tICcuL21vbmV5bic7XG5cbmNvbnN0IERBVEFfTEVOR1RIID0gQnVmZmVyLmZyb20oWzB4MDRdKTtcbmNvbnN0IE5VTExfTEVOR1RIID0gQnVmZmVyLmZyb20oWzB4MDBdKTtcblxuY29uc3QgU21hbGxNb25leTogRGF0YVR5cGUgPSB7XG4gIGlkOiAweDdBLFxuICB0eXBlOiAnTU9ORVk0JyxcbiAgbmFtZTogJ1NtYWxsTW9uZXknLFxuXG4gIGRlY2xhcmF0aW9uOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gJ3NtYWxsbW9uZXknO1xuICB9LFxuXG4gIGdlbmVyYXRlVHlwZUluZm86IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShbTW9uZXlOLmlkLCAweDA0XSk7XG4gIH0sXG5cbiAgZ2VuZXJhdGVQYXJhbWV0ZXJMZW5ndGgocGFyYW1ldGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKHBhcmFtZXRlci52YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gTlVMTF9MRU5HVEg7XG4gICAgfVxuXG4gICAgcmV0dXJuIERBVEFfTEVOR1RIO1xuICB9LFxuXG4gICogZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhKHBhcmFtZXRlciwgb3B0aW9ucykge1xuICAgIGlmIChwYXJhbWV0ZXIudmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgICBidWZmZXIud3JpdGVJbnQzMkxFKHBhcmFtZXRlci52YWx1ZSAqIDEwMDAwLCAwKTtcbiAgICB5aWVsZCBidWZmZXI7XG4gIH0sXG5cbiAgdmFsaWRhdGU6IGZ1bmN0aW9uKHZhbHVlKTogbnVsbCB8IG51bWJlciB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpO1xuICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbnVtYmVyLicpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPCAtMjE0NzQ4LjM2NDggfHwgdmFsdWUgPiAyMTQ3NDguMzY0Nykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVmFsdWUgbXVzdCBiZSBiZXR3ZWVuIC0yMTQ3NDguMzY0OCBhbmQgMjE0NzQ4LjM2NDcuJyk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgU21hbGxNb25leTtcbm1vZHVsZS5leHBvcnRzID0gU21hbGxNb25leTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUNBOzs7O0FBRUEsTUFBTUEsV0FBVyxHQUFHQyxNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDLElBQUQsQ0FBWixDQUFwQjtBQUNBLE1BQU1DLFdBQVcsR0FBR0YsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxJQUFELENBQVosQ0FBcEI7QUFFQSxNQUFNRSxVQUFvQixHQUFHO0VBQzNCQyxFQUFFLEVBQUUsSUFEdUI7RUFFM0JDLElBQUksRUFBRSxRQUZxQjtFQUczQkMsSUFBSSxFQUFFLFlBSHFCO0VBSzNCQyxXQUFXLEVBQUUsWUFBVztJQUN0QixPQUFPLFlBQVA7RUFDRCxDQVAwQjtFQVMzQkMsZ0JBQWdCLEVBQUUsWUFBVztJQUMzQixPQUFPUixNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDUSxnQkFBT0wsRUFBUixFQUFZLElBQVosQ0FBWixDQUFQO0VBQ0QsQ0FYMEI7O0VBYTNCTSx1QkFBdUIsQ0FBQ0MsU0FBRCxFQUFZQyxPQUFaLEVBQXFCO0lBQzFDLElBQUlELFNBQVMsQ0FBQ0UsS0FBVixJQUFtQixJQUF2QixFQUE2QjtNQUMzQixPQUFPWCxXQUFQO0lBQ0Q7O0lBRUQsT0FBT0gsV0FBUDtFQUNELENBbkIwQjs7RUFxQjNCLENBQUVlLHFCQUFGLENBQXdCSCxTQUF4QixFQUFtQ0MsT0FBbkMsRUFBNEM7SUFDMUMsSUFBSUQsU0FBUyxDQUFDRSxLQUFWLElBQW1CLElBQXZCLEVBQTZCO01BQzNCO0lBQ0Q7O0lBRUQsTUFBTUUsTUFBTSxHQUFHZixNQUFNLENBQUNnQixLQUFQLENBQWEsQ0FBYixDQUFmO0lBQ0FELE1BQU0sQ0FBQ0UsWUFBUCxDQUFvQk4sU0FBUyxDQUFDRSxLQUFWLEdBQWtCLEtBQXRDLEVBQTZDLENBQTdDO0lBQ0EsTUFBTUUsTUFBTjtFQUNELENBN0IwQjs7RUErQjNCRyxRQUFRLEVBQUUsVUFBU0wsS0FBVCxFQUErQjtJQUN2QyxJQUFJQSxLQUFLLElBQUksSUFBYixFQUFtQjtNQUNqQixPQUFPLElBQVA7SUFDRDs7SUFDREEsS0FBSyxHQUFHTSxVQUFVLENBQUNOLEtBQUQsQ0FBbEI7O0lBQ0EsSUFBSU8sS0FBSyxDQUFDUCxLQUFELENBQVQsRUFBa0I7TUFDaEIsTUFBTSxJQUFJUSxTQUFKLENBQWMsaUJBQWQsQ0FBTjtJQUNEOztJQUNELElBQUlSLEtBQUssR0FBRyxDQUFDLFdBQVQsSUFBd0JBLEtBQUssR0FBRyxXQUFwQyxFQUFpRDtNQUMvQyxNQUFNLElBQUlRLFNBQUosQ0FBYyxxREFBZCxDQUFOO0lBQ0Q7O0lBQ0QsT0FBT1IsS0FBUDtFQUNEO0FBM0MwQixDQUE3QjtlQThDZVYsVTs7QUFDZm1CLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQnBCLFVBQWpCIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
const Variant = {
  id: 0x62,
  type: 'SSVARIANTTYPE',
  name: 'Variant',
  declaration: function () {
    return 'sql_variant';
  },

  generateTypeInfo() {
    throw new Error('not implemented');
  },

  generateParameterLength() {
    throw new Error('not implemented');
  },

  generateParameterData() {
    throw new Error('not implemented');
  },

  validate() {
    throw new Error('not implemented');
  }

};
var _default = Variant;
exports.default = _default;
module.exports = Variant;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWYXJpYW50IiwiaWQiLCJ0eXBlIiwibmFtZSIsImRlY2xhcmF0aW9uIiwiZ2VuZXJhdGVUeXBlSW5mbyIsIkVycm9yIiwiZ2VuZXJhdGVQYXJhbWV0ZXJMZW5ndGgiLCJnZW5lcmF0ZVBhcmFtZXRlckRhdGEiLCJ2YWxpZGF0ZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YS10eXBlcy9zcWwtdmFyaWFudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4uL2RhdGEtdHlwZSc7XG5cbmNvbnN0IFZhcmlhbnQ6IERhdGFUeXBlID0ge1xuICBpZDogMHg2MixcbiAgdHlwZTogJ1NTVkFSSUFOVFRZUEUnLFxuICBuYW1lOiAnVmFyaWFudCcsXG5cbiAgZGVjbGFyYXRpb246IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAnc3FsX3ZhcmlhbnQnO1xuICB9LFxuXG4gIGdlbmVyYXRlVHlwZUluZm8oKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgfSxcblxuICBnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICB9LFxuXG4gIGdlbmVyYXRlUGFyYW1ldGVyRGF0YSgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICB9LFxuXG4gIHZhbGlkYXRlKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IFZhcmlhbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IFZhcmlhbnQ7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUVBLE1BQU1BLE9BQWlCLEdBQUc7RUFDeEJDLEVBQUUsRUFBRSxJQURvQjtFQUV4QkMsSUFBSSxFQUFFLGVBRmtCO0VBR3hCQyxJQUFJLEVBQUUsU0FIa0I7RUFLeEJDLFdBQVcsRUFBRSxZQUFXO0lBQ3RCLE9BQU8sYUFBUDtFQUNELENBUHVCOztFQVN4QkMsZ0JBQWdCLEdBQUc7SUFDakIsTUFBTSxJQUFJQyxLQUFKLENBQVUsaUJBQVYsQ0FBTjtFQUNELENBWHVCOztFQWF4QkMsdUJBQXVCLEdBQUc7SUFDeEIsTUFBTSxJQUFJRCxLQUFKLENBQVUsaUJBQVYsQ0FBTjtFQUNELENBZnVCOztFQWlCeEJFLHFCQUFxQixHQUFHO0lBQ3RCLE1BQU0sSUFBSUYsS0FBSixDQUFVLGlCQUFWLENBQU47RUFDRCxDQW5CdUI7O0VBcUJ4QkcsUUFBUSxHQUFHO0lBQ1QsTUFBTSxJQUFJSCxLQUFKLENBQVUsaUJBQVYsQ0FBTjtFQUNEOztBQXZCdUIsQ0FBMUI7ZUEwQmVOLE87O0FBQ2ZVLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQlgsT0FBakIifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _iconvLite = _interopRequireDefault(require("iconv-lite"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const NULL_LENGTH = Buffer.from([0xFF, 0xFF, 0xFF, 0xFF]);
const Text = {
  id: 0x23,
  type: 'TEXT',
  name: 'Text',
  hasTableName: true,
  declaration: function () {
    return 'text';
  },
  resolveLength: function (parameter) {
    const value = parameter.value;

    if (value != null) {
      return value.length;
    } else {
      return -1;
    }
  },

  generateTypeInfo(parameter, _options) {
    const buffer = Buffer.alloc(10);
    buffer.writeUInt8(this.id, 0);
    buffer.writeInt32LE(parameter.length, 1);

    if (parameter.collation) {
      parameter.collation.toBuffer().copy(buffer, 5, 0, 5);
    }

    return buffer;
  },

  generateParameterLength(parameter, options) {
    const value = parameter.value;

    if (value == null) {
      return NULL_LENGTH;
    }

    const buffer = Buffer.alloc(4);
    buffer.writeInt32LE(value.length, 0);
    return buffer;
  },

  generateParameterData: function* (parameter, options) {
    const value = parameter.value;

    if (value == null) {
      return;
    }

    yield value;
  },
  validate: function (value, collation) {
    if (value == null) {
      return null;
    }

    if (typeof value !== 'string') {
      throw new TypeError('Invalid string.');
    }

    if (!collation) {
      throw new Error('No collation was set by the server for the current connection.');
    }

    if (!collation.codepage) {
      throw new Error('The collation set by the server has no associated encoding.');
    }

    return _iconvLite.default.encode(value, collation.codepage);
  }
};
var _default = Text;
exports.default = _default;
module.exports = Text;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOVUxMX0xFTkdUSCIsIkJ1ZmZlciIsImZyb20iLCJUZXh0IiwiaWQiLCJ0eXBlIiwibmFtZSIsImhhc1RhYmxlTmFtZSIsImRlY2xhcmF0aW9uIiwicmVzb2x2ZUxlbmd0aCIsInBhcmFtZXRlciIsInZhbHVlIiwibGVuZ3RoIiwiZ2VuZXJhdGVUeXBlSW5mbyIsIl9vcHRpb25zIiwiYnVmZmVyIiwiYWxsb2MiLCJ3cml0ZVVJbnQ4Iiwid3JpdGVJbnQzMkxFIiwiY29sbGF0aW9uIiwidG9CdWZmZXIiLCJjb3B5IiwiZ2VuZXJhdGVQYXJhbWV0ZXJMZW5ndGgiLCJvcHRpb25zIiwiZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhIiwidmFsaWRhdGUiLCJUeXBlRXJyb3IiLCJFcnJvciIsImNvZGVwYWdlIiwiaWNvbnYiLCJlbmNvZGUiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGEtdHlwZXMvdGV4dC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgaWNvbnYgZnJvbSAnaWNvbnYtbGl0ZSc7XG5cbmltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi4vZGF0YS10eXBlJztcblxuY29uc3QgTlVMTF9MRU5HVEggPSBCdWZmZXIuZnJvbShbMHhGRiwgMHhGRiwgMHhGRiwgMHhGRl0pO1xuXG5jb25zdCBUZXh0OiBEYXRhVHlwZSA9IHtcbiAgaWQ6IDB4MjMsXG4gIHR5cGU6ICdURVhUJyxcbiAgbmFtZTogJ1RleHQnLFxuXG4gIGhhc1RhYmxlTmFtZTogdHJ1ZSxcblxuICBkZWNsYXJhdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICd0ZXh0JztcbiAgfSxcblxuICByZXNvbHZlTGVuZ3RoOiBmdW5jdGlvbihwYXJhbWV0ZXIpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcmFtZXRlci52YWx1ZSBhcyBCdWZmZXIgfCBudWxsO1xuXG4gICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gIH0sXG5cbiAgZ2VuZXJhdGVUeXBlSW5mbyhwYXJhbWV0ZXIsIF9vcHRpb25zKSB7XG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jKDEwKTtcbiAgICBidWZmZXIud3JpdGVVSW50OCh0aGlzLmlkLCAwKTtcbiAgICBidWZmZXIud3JpdGVJbnQzMkxFKHBhcmFtZXRlci5sZW5ndGghLCAxKTtcblxuICAgIGlmIChwYXJhbWV0ZXIuY29sbGF0aW9uKSB7XG4gICAgICBwYXJhbWV0ZXIuY29sbGF0aW9uLnRvQnVmZmVyKCkuY29weShidWZmZXIsIDUsIDAsIDUpO1xuICAgIH1cblxuICAgIHJldHVybiBidWZmZXI7XG4gIH0sXG5cbiAgZ2VuZXJhdGVQYXJhbWV0ZXJMZW5ndGgocGFyYW1ldGVyLCBvcHRpb25zKSB7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJhbWV0ZXIudmFsdWUgYXMgQnVmZmVyIHwgbnVsbDtcblxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gTlVMTF9MRU5HVEg7XG4gICAgfVxuXG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jKDQpO1xuICAgIGJ1ZmZlci53cml0ZUludDMyTEUodmFsdWUubGVuZ3RoLCAwKTtcbiAgICByZXR1cm4gYnVmZmVyO1xuICB9LFxuXG4gIGdlbmVyYXRlUGFyYW1ldGVyRGF0YTogZnVuY3Rpb24qKHBhcmFtZXRlciwgb3B0aW9ucykge1xuICAgIGNvbnN0IHZhbHVlID0gcGFyYW1ldGVyLnZhbHVlIGFzIEJ1ZmZlciB8IG51bGw7XG5cbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHlpZWxkIHZhbHVlO1xuICB9LFxuXG4gIHZhbGlkYXRlOiBmdW5jdGlvbih2YWx1ZSwgY29sbGF0aW9uKTogQnVmZmVyIHwgbnVsbCB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHN0cmluZy4nKTtcbiAgICB9XG5cbiAgICBpZiAoIWNvbGxhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBjb2xsYXRpb24gd2FzIHNldCBieSB0aGUgc2VydmVyIGZvciB0aGUgY3VycmVudCBjb25uZWN0aW9uLicpO1xuICAgIH1cblxuICAgIGlmICghY29sbGF0aW9uLmNvZGVwYWdlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBjb2xsYXRpb24gc2V0IGJ5IHRoZSBzZXJ2ZXIgaGFzIG5vIGFzc29jaWF0ZWQgZW5jb2RpbmcuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGljb252LmVuY29kZSh2YWx1ZSwgY29sbGF0aW9uLmNvZGVwYWdlKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgVGV4dDtcbm1vZHVsZS5leHBvcnRzID0gVGV4dDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOzs7O0FBSUEsTUFBTUEsV0FBVyxHQUFHQyxNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDLElBQUQsRUFBTyxJQUFQLEVBQWEsSUFBYixFQUFtQixJQUFuQixDQUFaLENBQXBCO0FBRUEsTUFBTUMsSUFBYyxHQUFHO0VBQ3JCQyxFQUFFLEVBQUUsSUFEaUI7RUFFckJDLElBQUksRUFBRSxNQUZlO0VBR3JCQyxJQUFJLEVBQUUsTUFIZTtFQUtyQkMsWUFBWSxFQUFFLElBTE87RUFPckJDLFdBQVcsRUFBRSxZQUFXO0lBQ3RCLE9BQU8sTUFBUDtFQUNELENBVG9CO0VBV3JCQyxhQUFhLEVBQUUsVUFBU0MsU0FBVCxFQUFvQjtJQUNqQyxNQUFNQyxLQUFLLEdBQUdELFNBQVMsQ0FBQ0MsS0FBeEI7O0lBRUEsSUFBSUEsS0FBSyxJQUFJLElBQWIsRUFBbUI7TUFDakIsT0FBT0EsS0FBSyxDQUFDQyxNQUFiO0lBQ0QsQ0FGRCxNQUVPO01BQ0wsT0FBTyxDQUFDLENBQVI7SUFDRDtFQUNGLENBbkJvQjs7RUFxQnJCQyxnQkFBZ0IsQ0FBQ0gsU0FBRCxFQUFZSSxRQUFaLEVBQXNCO0lBQ3BDLE1BQU1DLE1BQU0sR0FBR2QsTUFBTSxDQUFDZSxLQUFQLENBQWEsRUFBYixDQUFmO0lBQ0FELE1BQU0sQ0FBQ0UsVUFBUCxDQUFrQixLQUFLYixFQUF2QixFQUEyQixDQUEzQjtJQUNBVyxNQUFNLENBQUNHLFlBQVAsQ0FBb0JSLFNBQVMsQ0FBQ0UsTUFBOUIsRUFBdUMsQ0FBdkM7O0lBRUEsSUFBSUYsU0FBUyxDQUFDUyxTQUFkLEVBQXlCO01BQ3ZCVCxTQUFTLENBQUNTLFNBQVYsQ0FBb0JDLFFBQXBCLEdBQStCQyxJQUEvQixDQUFvQ04sTUFBcEMsRUFBNEMsQ0FBNUMsRUFBK0MsQ0FBL0MsRUFBa0QsQ0FBbEQ7SUFDRDs7SUFFRCxPQUFPQSxNQUFQO0VBQ0QsQ0EvQm9COztFQWlDckJPLHVCQUF1QixDQUFDWixTQUFELEVBQVlhLE9BQVosRUFBcUI7SUFDMUMsTUFBTVosS0FBSyxHQUFHRCxTQUFTLENBQUNDLEtBQXhCOztJQUVBLElBQUlBLEtBQUssSUFBSSxJQUFiLEVBQW1CO01BQ2pCLE9BQU9YLFdBQVA7SUFDRDs7SUFFRCxNQUFNZSxNQUFNLEdBQUdkLE1BQU0sQ0FBQ2UsS0FBUCxDQUFhLENBQWIsQ0FBZjtJQUNBRCxNQUFNLENBQUNHLFlBQVAsQ0FBb0JQLEtBQUssQ0FBQ0MsTUFBMUIsRUFBa0MsQ0FBbEM7SUFDQSxPQUFPRyxNQUFQO0VBQ0QsQ0EzQ29COztFQTZDckJTLHFCQUFxQixFQUFFLFdBQVVkLFNBQVYsRUFBcUJhLE9BQXJCLEVBQThCO0lBQ25ELE1BQU1aLEtBQUssR0FBR0QsU0FBUyxDQUFDQyxLQUF4Qjs7SUFFQSxJQUFJQSxLQUFLLElBQUksSUFBYixFQUFtQjtNQUNqQjtJQUNEOztJQUVELE1BQU1BLEtBQU47RUFDRCxDQXJEb0I7RUF1RHJCYyxRQUFRLEVBQUUsVUFBU2QsS0FBVCxFQUFnQlEsU0FBaEIsRUFBMEM7SUFDbEQsSUFBSVIsS0FBSyxJQUFJLElBQWIsRUFBbUI7TUFDakIsT0FBTyxJQUFQO0lBQ0Q7O0lBRUQsSUFBSSxPQUFPQSxLQUFQLEtBQWlCLFFBQXJCLEVBQStCO01BQzdCLE1BQU0sSUFBSWUsU0FBSixDQUFjLGlCQUFkLENBQU47SUFDRDs7SUFFRCxJQUFJLENBQUNQLFNBQUwsRUFBZ0I7TUFDZCxNQUFNLElBQUlRLEtBQUosQ0FBVSxnRUFBVixDQUFOO0lBQ0Q7O0lBRUQsSUFBSSxDQUFDUixTQUFTLENBQUNTLFFBQWYsRUFBeUI7TUFDdkIsTUFBTSxJQUFJRCxLQUFKLENBQVUsNkRBQVYsQ0FBTjtJQUNEOztJQUVELE9BQU9FLG1CQUFNQyxNQUFOLENBQWFuQixLQUFiLEVBQW9CUSxTQUFTLENBQUNTLFFBQTlCLENBQVA7RUFDRDtBQXpFb0IsQ0FBdkI7ZUE0RWV6QixJOztBQUNmNEIsTUFBTSxDQUFDQyxPQUFQLEdBQWlCN0IsSUFBakIifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _writableTrackingBuffer = _interopRequireDefault(require("../tracking-buffer/writable-tracking-buffer"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const NULL_LENGTH = Buffer.from([0x00]);
const Time = {
  id: 0x29,
  type: 'TIMEN',
  name: 'Time',
  declaration: function (parameter) {
    return 'time(' + this.resolveScale(parameter) + ')';
  },
  resolveScale: function (parameter) {
    if (parameter.scale != null) {
      return parameter.scale;
    } else if (parameter.value === null) {
      return 0;
    } else {
      return 7;
    }
  },

  generateTypeInfo(parameter) {
    return Buffer.from([this.id, parameter.scale]);
  },

  generateParameterLength(parameter, options) {
    if (parameter.value == null) {
      return NULL_LENGTH;
    }

    switch (parameter.scale) {
      case 0:
      case 1:
      case 2:
        return Buffer.from([0x03]);

      case 3:
      case 4:
        return Buffer.from([0x04]);

      case 5:
      case 6:
      case 7:
        return Buffer.from([0x05]);

      default:
        throw new Error('invalid scale');
    }
  },

  *generateParameterData(parameter, options) {
    if (parameter.value == null) {
      return;
    }

    const buffer = new _writableTrackingBuffer.default(16);
    const time = parameter.value;
    let timestamp;

    if (options.useUTC) {
      timestamp = ((time.getUTCHours() * 60 + time.getUTCMinutes()) * 60 + time.getUTCSeconds()) * 1000 + time.getUTCMilliseconds();
    } else {
      timestamp = ((time.getHours() * 60 + time.getMinutes()) * 60 + time.getSeconds()) * 1000 + time.getMilliseconds();
    }

    timestamp = timestamp * Math.pow(10, parameter.scale - 3);
    timestamp += (parameter.value.nanosecondDelta != null ? parameter.value.nanosecondDelta : 0) * Math.pow(10, parameter.scale);
    timestamp = Math.round(timestamp);

    switch (parameter.scale) {
      case 0:
      case 1:
      case 2:
        buffer.writeUInt24LE(timestamp);
        break;

      case 3:
      case 4:
        buffer.writeUInt32LE(timestamp);
        break;

      case 5:
      case 6:
      case 7:
        buffer.writeUInt40LE(timestamp);
    }

    yield buffer.data;
  },

  validate: function (value) {
    if (value == null) {
      return null;
    }

    if (!(value instanceof Date)) {
      value = new Date(Date.parse(value));
    }

    if (isNaN(value)) {
      throw new TypeError('Invalid time.');
    }

    return value;
  }
};
var _default = Time;
exports.default = _default;
module.exports = Time;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOVUxMX0xFTkdUSCIsIkJ1ZmZlciIsImZyb20iLCJUaW1lIiwiaWQiLCJ0eXBlIiwibmFtZSIsImRlY2xhcmF0aW9uIiwicGFyYW1ldGVyIiwicmVzb2x2ZVNjYWxlIiwic2NhbGUiLCJ2YWx1ZSIsImdlbmVyYXRlVHlwZUluZm8iLCJnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aCIsIm9wdGlvbnMiLCJFcnJvciIsImdlbmVyYXRlUGFyYW1ldGVyRGF0YSIsImJ1ZmZlciIsIldyaXRhYmxlVHJhY2tpbmdCdWZmZXIiLCJ0aW1lIiwidGltZXN0YW1wIiwidXNlVVRDIiwiZ2V0VVRDSG91cnMiLCJnZXRVVENNaW51dGVzIiwiZ2V0VVRDU2Vjb25kcyIsImdldFVUQ01pbGxpc2Vjb25kcyIsImdldEhvdXJzIiwiZ2V0TWludXRlcyIsImdldFNlY29uZHMiLCJnZXRNaWxsaXNlY29uZHMiLCJNYXRoIiwicG93IiwibmFub3NlY29uZERlbHRhIiwicm91bmQiLCJ3cml0ZVVJbnQyNExFIiwid3JpdGVVSW50MzJMRSIsIndyaXRlVUludDQwTEUiLCJkYXRhIiwidmFsaWRhdGUiLCJEYXRlIiwicGFyc2UiLCJpc05hTiIsIlR5cGVFcnJvciIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YS10eXBlcy90aW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi4vZGF0YS10eXBlJztcbmltcG9ydCBXcml0YWJsZVRyYWNraW5nQnVmZmVyIGZyb20gJy4uL3RyYWNraW5nLWJ1ZmZlci93cml0YWJsZS10cmFja2luZy1idWZmZXInO1xuXG5jb25zdCBOVUxMX0xFTkdUSCA9IEJ1ZmZlci5mcm9tKFsweDAwXSk7XG5cbmNvbnN0IFRpbWU6IERhdGFUeXBlID0ge1xuICBpZDogMHgyOSxcbiAgdHlwZTogJ1RJTUVOJyxcbiAgbmFtZTogJ1RpbWUnLFxuXG4gIGRlY2xhcmF0aW9uOiBmdW5jdGlvbihwYXJhbWV0ZXIpIHtcbiAgICByZXR1cm4gJ3RpbWUoJyArICh0aGlzLnJlc29sdmVTY2FsZSEocGFyYW1ldGVyKSkgKyAnKSc7XG4gIH0sXG5cbiAgcmVzb2x2ZVNjYWxlOiBmdW5jdGlvbihwYXJhbWV0ZXIpIHtcbiAgICBpZiAocGFyYW1ldGVyLnNjYWxlICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBwYXJhbWV0ZXIuc2NhbGU7XG4gICAgfSBlbHNlIGlmIChwYXJhbWV0ZXIudmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gNztcbiAgICB9XG4gIH0sXG5cbiAgZ2VuZXJhdGVUeXBlSW5mbyhwYXJhbWV0ZXIpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oW3RoaXMuaWQsIHBhcmFtZXRlci5zY2FsZSFdKTtcbiAgfSxcblxuICBnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aChwYXJhbWV0ZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAocGFyYW1ldGVyLnZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBOVUxMX0xFTkdUSDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHBhcmFtZXRlci5zY2FsZSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgY2FzZSAxOlxuICAgICAgY2FzZSAyOlxuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oWzB4MDNdKTtcbiAgICAgIGNhc2UgMzpcbiAgICAgIGNhc2UgNDpcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKFsweDA0XSk7XG4gICAgICBjYXNlIDU6XG4gICAgICBjYXNlIDY6XG4gICAgICBjYXNlIDc6XG4gICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShbMHgwNV0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNjYWxlJyk7XG4gICAgfVxuICB9LFxuXG4gICogZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhKHBhcmFtZXRlciwgb3B0aW9ucykge1xuICAgIGlmIChwYXJhbWV0ZXIudmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBXcml0YWJsZVRyYWNraW5nQnVmZmVyKDE2KTtcbiAgICBjb25zdCB0aW1lID0gcGFyYW1ldGVyLnZhbHVlO1xuXG4gICAgbGV0IHRpbWVzdGFtcDtcbiAgICBpZiAob3B0aW9ucy51c2VVVEMpIHtcbiAgICAgIHRpbWVzdGFtcCA9ICgodGltZS5nZXRVVENIb3VycygpICogNjAgKyB0aW1lLmdldFVUQ01pbnV0ZXMoKSkgKiA2MCArIHRpbWUuZ2V0VVRDU2Vjb25kcygpKSAqIDEwMDAgKyB0aW1lLmdldFVUQ01pbGxpc2Vjb25kcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aW1lc3RhbXAgPSAoKHRpbWUuZ2V0SG91cnMoKSAqIDYwICsgdGltZS5nZXRNaW51dGVzKCkpICogNjAgKyB0aW1lLmdldFNlY29uZHMoKSkgKiAxMDAwICsgdGltZS5nZXRNaWxsaXNlY29uZHMoKTtcbiAgICB9XG5cbiAgICB0aW1lc3RhbXAgPSB0aW1lc3RhbXAgKiBNYXRoLnBvdygxMCwgcGFyYW1ldGVyLnNjYWxlISAtIDMpO1xuICAgIHRpbWVzdGFtcCArPSAocGFyYW1ldGVyLnZhbHVlLm5hbm9zZWNvbmREZWx0YSAhPSBudWxsID8gcGFyYW1ldGVyLnZhbHVlLm5hbm9zZWNvbmREZWx0YSA6IDApICogTWF0aC5wb3coMTAsIHBhcmFtZXRlci5zY2FsZSEpO1xuICAgIHRpbWVzdGFtcCA9IE1hdGgucm91bmQodGltZXN0YW1wKTtcblxuICAgIHN3aXRjaCAocGFyYW1ldGVyLnNjYWxlKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICBjYXNlIDE6XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGJ1ZmZlci53cml0ZVVJbnQyNExFKHRpbWVzdGFtcCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgY2FzZSA0OlxuICAgICAgICBidWZmZXIud3JpdGVVSW50MzJMRSh0aW1lc3RhbXApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTpcbiAgICAgIGNhc2UgNjpcbiAgICAgIGNhc2UgNzpcbiAgICAgICAgYnVmZmVyLndyaXRlVUludDQwTEUodGltZXN0YW1wKTtcbiAgICB9XG5cbiAgICB5aWVsZCBidWZmZXIuZGF0YTtcbiAgfSxcblxuICB2YWxpZGF0ZTogZnVuY3Rpb24odmFsdWUpOiBudWxsIHwgbnVtYmVyIHwgRGF0ZSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgIHZhbHVlID0gbmV3IERhdGUoRGF0ZS5wYXJzZSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgdGltZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn07XG5cblxuZXhwb3J0IGRlZmF1bHQgVGltZTtcbm1vZHVsZS5leHBvcnRzID0gVGltZTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUNBOzs7O0FBRUEsTUFBTUEsV0FBVyxHQUFHQyxNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDLElBQUQsQ0FBWixDQUFwQjtBQUVBLE1BQU1DLElBQWMsR0FBRztFQUNyQkMsRUFBRSxFQUFFLElBRGlCO0VBRXJCQyxJQUFJLEVBQUUsT0FGZTtFQUdyQkMsSUFBSSxFQUFFLE1BSGU7RUFLckJDLFdBQVcsRUFBRSxVQUFTQyxTQUFULEVBQW9CO0lBQy9CLE9BQU8sVUFBVyxLQUFLQyxZQUFMLENBQW1CRCxTQUFuQixDQUFYLEdBQTRDLEdBQW5EO0VBQ0QsQ0FQb0I7RUFTckJDLFlBQVksRUFBRSxVQUFTRCxTQUFULEVBQW9CO0lBQ2hDLElBQUlBLFNBQVMsQ0FBQ0UsS0FBVixJQUFtQixJQUF2QixFQUE2QjtNQUMzQixPQUFPRixTQUFTLENBQUNFLEtBQWpCO0lBQ0QsQ0FGRCxNQUVPLElBQUlGLFNBQVMsQ0FBQ0csS0FBVixLQUFvQixJQUF4QixFQUE4QjtNQUNuQyxPQUFPLENBQVA7SUFDRCxDQUZNLE1BRUE7TUFDTCxPQUFPLENBQVA7SUFDRDtFQUNGLENBakJvQjs7RUFtQnJCQyxnQkFBZ0IsQ0FBQ0osU0FBRCxFQUFZO0lBQzFCLE9BQU9QLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsS0FBS0UsRUFBTixFQUFVSSxTQUFTLENBQUNFLEtBQXBCLENBQVosQ0FBUDtFQUNELENBckJvQjs7RUF1QnJCRyx1QkFBdUIsQ0FBQ0wsU0FBRCxFQUFZTSxPQUFaLEVBQXFCO0lBQzFDLElBQUlOLFNBQVMsQ0FBQ0csS0FBVixJQUFtQixJQUF2QixFQUE2QjtNQUMzQixPQUFPWCxXQUFQO0lBQ0Q7O0lBRUQsUUFBUVEsU0FBUyxDQUFDRSxLQUFsQjtNQUNFLEtBQUssQ0FBTDtNQUNBLEtBQUssQ0FBTDtNQUNBLEtBQUssQ0FBTDtRQUNFLE9BQU9ULE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxDQUFaLENBQVA7O01BQ0YsS0FBSyxDQUFMO01BQ0EsS0FBSyxDQUFMO1FBQ0UsT0FBT0QsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxJQUFELENBQVosQ0FBUDs7TUFDRixLQUFLLENBQUw7TUFDQSxLQUFLLENBQUw7TUFDQSxLQUFLLENBQUw7UUFDRSxPQUFPRCxNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDLElBQUQsQ0FBWixDQUFQOztNQUNGO1FBQ0UsTUFBTSxJQUFJYSxLQUFKLENBQVUsZUFBVixDQUFOO0lBYko7RUFlRCxDQTNDb0I7O0VBNkNyQixDQUFFQyxxQkFBRixDQUF3QlIsU0FBeEIsRUFBbUNNLE9BQW5DLEVBQTRDO0lBQzFDLElBQUlOLFNBQVMsQ0FBQ0csS0FBVixJQUFtQixJQUF2QixFQUE2QjtNQUMzQjtJQUNEOztJQUVELE1BQU1NLE1BQU0sR0FBRyxJQUFJQywrQkFBSixDQUEyQixFQUEzQixDQUFmO0lBQ0EsTUFBTUMsSUFBSSxHQUFHWCxTQUFTLENBQUNHLEtBQXZCO0lBRUEsSUFBSVMsU0FBSjs7SUFDQSxJQUFJTixPQUFPLENBQUNPLE1BQVosRUFBb0I7TUFDbEJELFNBQVMsR0FBRyxDQUFDLENBQUNELElBQUksQ0FBQ0csV0FBTCxLQUFxQixFQUFyQixHQUEwQkgsSUFBSSxDQUFDSSxhQUFMLEVBQTNCLElBQW1ELEVBQW5ELEdBQXdESixJQUFJLENBQUNLLGFBQUwsRUFBekQsSUFBaUYsSUFBakYsR0FBd0ZMLElBQUksQ0FBQ00sa0JBQUwsRUFBcEc7SUFDRCxDQUZELE1BRU87TUFDTEwsU0FBUyxHQUFHLENBQUMsQ0FBQ0QsSUFBSSxDQUFDTyxRQUFMLEtBQWtCLEVBQWxCLEdBQXVCUCxJQUFJLENBQUNRLFVBQUwsRUFBeEIsSUFBNkMsRUFBN0MsR0FBa0RSLElBQUksQ0FBQ1MsVUFBTCxFQUFuRCxJQUF3RSxJQUF4RSxHQUErRVQsSUFBSSxDQUFDVSxlQUFMLEVBQTNGO0lBQ0Q7O0lBRURULFNBQVMsR0FBR0EsU0FBUyxHQUFHVSxJQUFJLENBQUNDLEdBQUwsQ0FBUyxFQUFULEVBQWF2QixTQUFTLENBQUNFLEtBQVYsR0FBbUIsQ0FBaEMsQ0FBeEI7SUFDQVUsU0FBUyxJQUFJLENBQUNaLFNBQVMsQ0FBQ0csS0FBVixDQUFnQnFCLGVBQWhCLElBQW1DLElBQW5DLEdBQTBDeEIsU0FBUyxDQUFDRyxLQUFWLENBQWdCcUIsZUFBMUQsR0FBNEUsQ0FBN0UsSUFBa0ZGLElBQUksQ0FBQ0MsR0FBTCxDQUFTLEVBQVQsRUFBYXZCLFNBQVMsQ0FBQ0UsS0FBdkIsQ0FBL0Y7SUFDQVUsU0FBUyxHQUFHVSxJQUFJLENBQUNHLEtBQUwsQ0FBV2IsU0FBWCxDQUFaOztJQUVBLFFBQVFaLFNBQVMsQ0FBQ0UsS0FBbEI7TUFDRSxLQUFLLENBQUw7TUFDQSxLQUFLLENBQUw7TUFDQSxLQUFLLENBQUw7UUFDRU8sTUFBTSxDQUFDaUIsYUFBUCxDQUFxQmQsU0FBckI7UUFDQTs7TUFDRixLQUFLLENBQUw7TUFDQSxLQUFLLENBQUw7UUFDRUgsTUFBTSxDQUFDa0IsYUFBUCxDQUFxQmYsU0FBckI7UUFDQTs7TUFDRixLQUFLLENBQUw7TUFDQSxLQUFLLENBQUw7TUFDQSxLQUFLLENBQUw7UUFDRUgsTUFBTSxDQUFDbUIsYUFBUCxDQUFxQmhCLFNBQXJCO0lBYko7O0lBZ0JBLE1BQU1ILE1BQU0sQ0FBQ29CLElBQWI7RUFDRCxDQWpGb0I7O0VBbUZyQkMsUUFBUSxFQUFFLFVBQVMzQixLQUFULEVBQXNDO0lBQzlDLElBQUlBLEtBQUssSUFBSSxJQUFiLEVBQW1CO01BQ2pCLE9BQU8sSUFBUDtJQUNEOztJQUVELElBQUksRUFBRUEsS0FBSyxZQUFZNEIsSUFBbkIsQ0FBSixFQUE4QjtNQUM1QjVCLEtBQUssR0FBRyxJQUFJNEIsSUFBSixDQUFTQSxJQUFJLENBQUNDLEtBQUwsQ0FBVzdCLEtBQVgsQ0FBVCxDQUFSO0lBQ0Q7O0lBRUQsSUFBSThCLEtBQUssQ0FBQzlCLEtBQUQsQ0FBVCxFQUFrQjtNQUNoQixNQUFNLElBQUkrQixTQUFKLENBQWMsZUFBZCxDQUFOO0lBQ0Q7O0lBRUQsT0FBTy9CLEtBQVA7RUFDRDtBQWpHb0IsQ0FBdkI7ZUFxR2VSLEk7O0FBQ2Z3QyxNQUFNLENBQUNDLE9BQVAsR0FBaUJ6QyxJQUFqQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _intn = _interopRequireDefault(require("./intn"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const DATA_LENGTH = Buffer.from([0x01]);
const NULL_LENGTH = Buffer.from([0x00]);
const TinyInt = {
  id: 0x30,
  type: 'INT1',
  name: 'TinyInt',
  declaration: function () {
    return 'tinyint';
  },

  generateTypeInfo() {
    return Buffer.from([_intn.default.id, 0x01]);
  },

  generateParameterLength(parameter, options) {
    if (parameter.value == null) {
      return NULL_LENGTH;
    }

    return DATA_LENGTH;
  },

  *generateParameterData(parameter, options) {
    if (parameter.value == null) {
      return;
    }

    const buffer = Buffer.alloc(1);
    buffer.writeUInt8(Number(parameter.value), 0);
    yield buffer;
  },

  validate: function (value) {
    if (value == null) {
      return null;
    }

    if (typeof value !== 'number') {
      value = Number(value);
    }

    if (isNaN(value)) {
      throw new TypeError('Invalid number.');
    }

    if (value < 0 || value > 255) {
      throw new TypeError('Value must be between 0 and 255, inclusive.');
    }

    return value | 0;
  }
};
var _default = TinyInt;
exports.default = _default;
module.exports = TinyInt;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJEQVRBX0xFTkdUSCIsIkJ1ZmZlciIsImZyb20iLCJOVUxMX0xFTkdUSCIsIlRpbnlJbnQiLCJpZCIsInR5cGUiLCJuYW1lIiwiZGVjbGFyYXRpb24iLCJnZW5lcmF0ZVR5cGVJbmZvIiwiSW50TiIsImdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoIiwicGFyYW1ldGVyIiwib3B0aW9ucyIsInZhbHVlIiwiZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhIiwiYnVmZmVyIiwiYWxsb2MiLCJ3cml0ZVVJbnQ4IiwiTnVtYmVyIiwidmFsaWRhdGUiLCJpc05hTiIsIlR5cGVFcnJvciIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YS10eXBlcy90aW55aW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi4vZGF0YS10eXBlJztcbmltcG9ydCBJbnROIGZyb20gJy4vaW50bic7XG5cbmNvbnN0IERBVEFfTEVOR1RIID0gQnVmZmVyLmZyb20oWzB4MDFdKTtcbmNvbnN0IE5VTExfTEVOR1RIID0gQnVmZmVyLmZyb20oWzB4MDBdKTtcblxuY29uc3QgVGlueUludDogRGF0YVR5cGUgPSB7XG4gIGlkOiAweDMwLFxuICB0eXBlOiAnSU5UMScsXG4gIG5hbWU6ICdUaW55SW50JyxcblxuICBkZWNsYXJhdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICd0aW55aW50JztcbiAgfSxcblxuICBnZW5lcmF0ZVR5cGVJbmZvKCkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShbSW50Ti5pZCwgMHgwMV0pO1xuICB9LFxuXG4gIGdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoKHBhcmFtZXRlciwgb3B0aW9ucykge1xuICAgIGlmIChwYXJhbWV0ZXIudmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIE5VTExfTEVOR1RIO1xuICAgIH1cblxuICAgIHJldHVybiBEQVRBX0xFTkdUSDtcbiAgfSxcblxuICAqIGdlbmVyYXRlUGFyYW1ldGVyRGF0YShwYXJhbWV0ZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAocGFyYW1ldGVyLnZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2MoMSk7XG4gICAgYnVmZmVyLndyaXRlVUludDgoTnVtYmVyKHBhcmFtZXRlci52YWx1ZSksIDApO1xuICAgIHlpZWxkIGJ1ZmZlcjtcbiAgfSxcblxuICB2YWxpZGF0ZTogZnVuY3Rpb24odmFsdWUpOiBudW1iZXIgfCBudWxsIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgIHZhbHVlID0gTnVtYmVyKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG51bWJlci4nKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMjU1KSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdWYWx1ZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMjU1LCBpbmNsdXNpdmUuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlIHwgMDtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgVGlueUludDtcbm1vZHVsZS5leHBvcnRzID0gVGlueUludDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUNBOzs7O0FBRUEsTUFBTUEsV0FBVyxHQUFHQyxNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDLElBQUQsQ0FBWixDQUFwQjtBQUNBLE1BQU1DLFdBQVcsR0FBR0YsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxJQUFELENBQVosQ0FBcEI7QUFFQSxNQUFNRSxPQUFpQixHQUFHO0VBQ3hCQyxFQUFFLEVBQUUsSUFEb0I7RUFFeEJDLElBQUksRUFBRSxNQUZrQjtFQUd4QkMsSUFBSSxFQUFFLFNBSGtCO0VBS3hCQyxXQUFXLEVBQUUsWUFBVztJQUN0QixPQUFPLFNBQVA7RUFDRCxDQVB1Qjs7RUFTeEJDLGdCQUFnQixHQUFHO0lBQ2pCLE9BQU9SLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUNRLGNBQUtMLEVBQU4sRUFBVSxJQUFWLENBQVosQ0FBUDtFQUNELENBWHVCOztFQWF4Qk0sdUJBQXVCLENBQUNDLFNBQUQsRUFBWUMsT0FBWixFQUFxQjtJQUMxQyxJQUFJRCxTQUFTLENBQUNFLEtBQVYsSUFBbUIsSUFBdkIsRUFBNkI7TUFDM0IsT0FBT1gsV0FBUDtJQUNEOztJQUVELE9BQU9ILFdBQVA7RUFDRCxDQW5CdUI7O0VBcUJ4QixDQUFFZSxxQkFBRixDQUF3QkgsU0FBeEIsRUFBbUNDLE9BQW5DLEVBQTRDO0lBQzFDLElBQUlELFNBQVMsQ0FBQ0UsS0FBVixJQUFtQixJQUF2QixFQUE2QjtNQUMzQjtJQUNEOztJQUVELE1BQU1FLE1BQU0sR0FBR2YsTUFBTSxDQUFDZ0IsS0FBUCxDQUFhLENBQWIsQ0FBZjtJQUNBRCxNQUFNLENBQUNFLFVBQVAsQ0FBa0JDLE1BQU0sQ0FBQ1AsU0FBUyxDQUFDRSxLQUFYLENBQXhCLEVBQTJDLENBQTNDO0lBQ0EsTUFBTUUsTUFBTjtFQUNELENBN0J1Qjs7RUErQnhCSSxRQUFRLEVBQUUsVUFBU04sS0FBVCxFQUErQjtJQUN2QyxJQUFJQSxLQUFLLElBQUksSUFBYixFQUFtQjtNQUNqQixPQUFPLElBQVA7SUFDRDs7SUFFRCxJQUFJLE9BQU9BLEtBQVAsS0FBaUIsUUFBckIsRUFBK0I7TUFDN0JBLEtBQUssR0FBR0ssTUFBTSxDQUFDTCxLQUFELENBQWQ7SUFDRDs7SUFFRCxJQUFJTyxLQUFLLENBQUNQLEtBQUQsQ0FBVCxFQUFrQjtNQUNoQixNQUFNLElBQUlRLFNBQUosQ0FBYyxpQkFBZCxDQUFOO0lBQ0Q7O0lBRUQsSUFBSVIsS0FBSyxHQUFHLENBQVIsSUFBYUEsS0FBSyxHQUFHLEdBQXpCLEVBQThCO01BQzVCLE1BQU0sSUFBSVEsU0FBSixDQUFjLDZDQUFkLENBQU47SUFDRDs7SUFFRCxPQUFPUixLQUFLLEdBQUcsQ0FBZjtFQUNEO0FBakR1QixDQUExQjtlQW9EZVYsTzs7QUFDZm1CLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQnBCLE9BQWpCIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _writableTrackingBuffer = _interopRequireDefault(require("../tracking-buffer/writable-tracking-buffer"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const TVP_ROW_TOKEN = Buffer.from([0x01]);
const TVP_END_TOKEN = Buffer.from([0x00]);
const NULL_LENGTH = Buffer.from([0xFF, 0xFF]);
const TVP = {
  id: 0xF3,
  type: 'TVPTYPE',
  name: 'TVP',
  declaration: function (parameter) {
    const value = parameter.value; // Temporary solution. Remove 'any' later.

    return value.name + ' readonly';
  },

  generateTypeInfo(parameter) {
    var _parameter$value, _parameter$value2;

    const databaseName = '';
    const schema = ((_parameter$value = parameter.value) === null || _parameter$value === void 0 ? void 0 : _parameter$value.schema) ?? '';
    const typeName = ((_parameter$value2 = parameter.value) === null || _parameter$value2 === void 0 ? void 0 : _parameter$value2.name) ?? '';
    const bufferLength = 1 + 1 + Buffer.byteLength(databaseName, 'ucs2') + 1 + Buffer.byteLength(schema, 'ucs2') + 1 + Buffer.byteLength(typeName, 'ucs2');
    const buffer = new _writableTrackingBuffer.default(bufferLength, 'ucs2');
    buffer.writeUInt8(this.id);
    buffer.writeBVarchar(databaseName);
    buffer.writeBVarchar(schema);
    buffer.writeBVarchar(typeName);
    return buffer.data;
  },

  generateParameterLength(parameter, options) {
    if (parameter.value == null) {
      return NULL_LENGTH;
    }

    const {
      columns
    } = parameter.value;
    const buffer = Buffer.alloc(2);
    buffer.writeUInt16LE(columns.length, 0);
    return buffer;
  },

  *generateParameterData(parameter, options) {
    if (parameter.value == null) {
      yield TVP_END_TOKEN;
      yield TVP_END_TOKEN;
      return;
    }

    const {
      columns,
      rows
    } = parameter.value;

    for (let i = 0, len = columns.length; i < len; i++) {
      const column = columns[i];
      const buff = Buffer.alloc(6); // UserType

      buff.writeUInt32LE(0x00000000, 0); // Flags

      buff.writeUInt16LE(0x0000, 4);
      yield buff; // TYPE_INFO

      yield column.type.generateTypeInfo(column); // ColName

      yield Buffer.from([0x00]);
    }

    yield TVP_END_TOKEN;

    for (let i = 0, length = rows.length; i < length; i++) {
      yield TVP_ROW_TOKEN;
      const row = rows[i];

      for (let k = 0, len2 = row.length; k < len2; k++) {
        const column = columns[k];
        const value = row[k];
        const param = {
          value: column.type.validate(value, parameter.collation),
          length: column.length,
          scale: column.scale,
          precision: column.precision
        }; // TvpColumnData

        yield column.type.generateParameterLength(param, options);
        yield* column.type.generateParameterData(param, options);
      }
    }

    yield TVP_END_TOKEN;
  },

  validate: function (value) {
    if (value == null) {
      return null;
    }

    if (typeof value !== 'object') {
      throw new TypeError('Invalid table.');
    }

    if (!Array.isArray(value.columns)) {
      throw new TypeError('Invalid table.');
    }

    if (!Array.isArray(value.rows)) {
      throw new TypeError('Invalid table.');
    }

    return value;
  }
};
var _default = TVP;
exports.default = _default;
module.exports = TVP;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUVlBfUk9XX1RPS0VOIiwiQnVmZmVyIiwiZnJvbSIsIlRWUF9FTkRfVE9LRU4iLCJOVUxMX0xFTkdUSCIsIlRWUCIsImlkIiwidHlwZSIsIm5hbWUiLCJkZWNsYXJhdGlvbiIsInBhcmFtZXRlciIsInZhbHVlIiwiZ2VuZXJhdGVUeXBlSW5mbyIsImRhdGFiYXNlTmFtZSIsInNjaGVtYSIsInR5cGVOYW1lIiwiYnVmZmVyTGVuZ3RoIiwiYnl0ZUxlbmd0aCIsImJ1ZmZlciIsIldyaXRhYmxlVHJhY2tpbmdCdWZmZXIiLCJ3cml0ZVVJbnQ4Iiwid3JpdGVCVmFyY2hhciIsImRhdGEiLCJnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aCIsIm9wdGlvbnMiLCJjb2x1bW5zIiwiYWxsb2MiLCJ3cml0ZVVJbnQxNkxFIiwibGVuZ3RoIiwiZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhIiwicm93cyIsImkiLCJsZW4iLCJjb2x1bW4iLCJidWZmIiwid3JpdGVVSW50MzJMRSIsInJvdyIsImsiLCJsZW4yIiwicGFyYW0iLCJ2YWxpZGF0ZSIsImNvbGxhdGlvbiIsInNjYWxlIiwicHJlY2lzaW9uIiwiVHlwZUVycm9yIiwiQXJyYXkiLCJpc0FycmF5IiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhLXR5cGVzL3R2cC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4uL2RhdGEtdHlwZSc7XG5pbXBvcnQgV3JpdGFibGVUcmFja2luZ0J1ZmZlciBmcm9tICcuLi90cmFja2luZy1idWZmZXIvd3JpdGFibGUtdHJhY2tpbmctYnVmZmVyJztcblxuY29uc3QgVFZQX1JPV19UT0tFTiA9IEJ1ZmZlci5mcm9tKFsweDAxXSk7XG5jb25zdCBUVlBfRU5EX1RPS0VOID0gQnVmZmVyLmZyb20oWzB4MDBdKTtcblxuY29uc3QgTlVMTF9MRU5HVEggPSBCdWZmZXIuZnJvbShbMHhGRiwgMHhGRl0pO1xuXG5jb25zdCBUVlA6IERhdGFUeXBlID0ge1xuICBpZDogMHhGMyxcbiAgdHlwZTogJ1RWUFRZUEUnLFxuICBuYW1lOiAnVFZQJyxcblxuICBkZWNsYXJhdGlvbjogZnVuY3Rpb24ocGFyYW1ldGVyKSB7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJhbWV0ZXIudmFsdWUgYXMgYW55OyAvLyBUZW1wb3Jhcnkgc29sdXRpb24uIFJlbW92ZSAnYW55JyBsYXRlci5cbiAgICByZXR1cm4gdmFsdWUubmFtZSArICcgcmVhZG9ubHknO1xuICB9LFxuXG4gIGdlbmVyYXRlVHlwZUluZm8ocGFyYW1ldGVyKSB7XG4gICAgY29uc3QgZGF0YWJhc2VOYW1lID0gJyc7XG4gICAgY29uc3Qgc2NoZW1hID0gcGFyYW1ldGVyLnZhbHVlPy5zY2hlbWEgPz8gJyc7XG4gICAgY29uc3QgdHlwZU5hbWUgPSBwYXJhbWV0ZXIudmFsdWU/Lm5hbWUgPz8gJyc7XG5cbiAgICBjb25zdCBidWZmZXJMZW5ndGggPSAxICtcbiAgICAgIDEgKyBCdWZmZXIuYnl0ZUxlbmd0aChkYXRhYmFzZU5hbWUsICd1Y3MyJykgK1xuICAgICAgMSArIEJ1ZmZlci5ieXRlTGVuZ3RoKHNjaGVtYSwgJ3VjczInKSArXG4gICAgICAxICsgQnVmZmVyLmJ5dGVMZW5ndGgodHlwZU5hbWUsICd1Y3MyJyk7XG5cbiAgICBjb25zdCBidWZmZXIgPSBuZXcgV3JpdGFibGVUcmFja2luZ0J1ZmZlcihidWZmZXJMZW5ndGgsICd1Y3MyJyk7XG4gICAgYnVmZmVyLndyaXRlVUludDgodGhpcy5pZCk7XG4gICAgYnVmZmVyLndyaXRlQlZhcmNoYXIoZGF0YWJhc2VOYW1lKTtcbiAgICBidWZmZXIud3JpdGVCVmFyY2hhcihzY2hlbWEpO1xuICAgIGJ1ZmZlci53cml0ZUJWYXJjaGFyKHR5cGVOYW1lKTtcblxuICAgIHJldHVybiBidWZmZXIuZGF0YTtcbiAgfSxcblxuICBnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aChwYXJhbWV0ZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAocGFyYW1ldGVyLnZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBOVUxMX0xFTkdUSDtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvbHVtbnMgfSA9IHBhcmFtZXRlci52YWx1ZTtcbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2MoMik7XG4gICAgYnVmZmVyLndyaXRlVUludDE2TEUoY29sdW1ucy5sZW5ndGgsIDApO1xuICAgIHJldHVybiBidWZmZXI7XG4gIH0sXG5cbiAgKmdlbmVyYXRlUGFyYW1ldGVyRGF0YShwYXJhbWV0ZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAocGFyYW1ldGVyLnZhbHVlID09IG51bGwpIHtcbiAgICAgIHlpZWxkIFRWUF9FTkRfVE9LRU47XG4gICAgICB5aWVsZCBUVlBfRU5EX1RPS0VOO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgY29sdW1ucywgcm93cyB9ID0gcGFyYW1ldGVyLnZhbHVlO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNvbHVtbnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IGNvbHVtbnNbaV07XG5cbiAgICAgIGNvbnN0IGJ1ZmYgPSBCdWZmZXIuYWxsb2MoNik7XG4gICAgICAvLyBVc2VyVHlwZVxuICAgICAgYnVmZi53cml0ZVVJbnQzMkxFKDB4MDAwMDAwMDAsIDApO1xuXG4gICAgICAvLyBGbGFnc1xuICAgICAgYnVmZi53cml0ZVVJbnQxNkxFKDB4MDAwMCwgNCk7XG4gICAgICB5aWVsZCBidWZmO1xuXG4gICAgICAvLyBUWVBFX0lORk9cbiAgICAgIHlpZWxkIGNvbHVtbi50eXBlLmdlbmVyYXRlVHlwZUluZm8oY29sdW1uKTtcblxuICAgICAgLy8gQ29sTmFtZVxuICAgICAgeWllbGQgQnVmZmVyLmZyb20oWzB4MDBdKTtcbiAgICB9XG5cbiAgICB5aWVsZCBUVlBfRU5EX1RPS0VOO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IHJvd3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHlpZWxkIFRWUF9ST1dfVE9LRU47XG5cbiAgICAgIGNvbnN0IHJvdyA9IHJvd3NbaV07XG4gICAgICBmb3IgKGxldCBrID0gMCwgbGVuMiA9IHJvdy5sZW5ndGg7IGsgPCBsZW4yOyBrKyspIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gY29sdW1uc1trXTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByb3dba107XG5cbiAgICAgICAgY29uc3QgcGFyYW0gPSB7XG4gICAgICAgICAgdmFsdWU6IGNvbHVtbi50eXBlLnZhbGlkYXRlKHZhbHVlLCBwYXJhbWV0ZXIuY29sbGF0aW9uKSxcbiAgICAgICAgICBsZW5ndGg6IGNvbHVtbi5sZW5ndGgsXG4gICAgICAgICAgc2NhbGU6IGNvbHVtbi5zY2FsZSxcbiAgICAgICAgICBwcmVjaXNpb246IGNvbHVtbi5wcmVjaXNpb25cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBUdnBDb2x1bW5EYXRhXG4gICAgICAgIHlpZWxkIGNvbHVtbi50eXBlLmdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoKHBhcmFtLCBvcHRpb25zKTtcbiAgICAgICAgeWllbGQgKiBjb2x1bW4udHlwZS5nZW5lcmF0ZVBhcmFtZXRlckRhdGEocGFyYW0sIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHlpZWxkIFRWUF9FTkRfVE9LRU47XG4gIH0sXG5cbiAgdmFsaWRhdGU6IGZ1bmN0aW9uKHZhbHVlKTogQnVmZmVyIHwgbnVsbCB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHRhYmxlLicpO1xuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZS5jb2x1bW5zKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCB0YWJsZS4nKTtcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUucm93cykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgdGFibGUuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBUVlA7XG5tb2R1bGUuZXhwb3J0cyA9IFRWUDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUNBOzs7O0FBRUEsTUFBTUEsYUFBYSxHQUFHQyxNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDLElBQUQsQ0FBWixDQUF0QjtBQUNBLE1BQU1DLGFBQWEsR0FBR0YsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxJQUFELENBQVosQ0FBdEI7QUFFQSxNQUFNRSxXQUFXLEdBQUdILE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxFQUFPLElBQVAsQ0FBWixDQUFwQjtBQUVBLE1BQU1HLEdBQWEsR0FBRztFQUNwQkMsRUFBRSxFQUFFLElBRGdCO0VBRXBCQyxJQUFJLEVBQUUsU0FGYztFQUdwQkMsSUFBSSxFQUFFLEtBSGM7RUFLcEJDLFdBQVcsRUFBRSxVQUFTQyxTQUFULEVBQW9CO0lBQy9CLE1BQU1DLEtBQUssR0FBR0QsU0FBUyxDQUFDQyxLQUF4QixDQUQrQixDQUNPOztJQUN0QyxPQUFPQSxLQUFLLENBQUNILElBQU4sR0FBYSxXQUFwQjtFQUNELENBUm1COztFQVVwQkksZ0JBQWdCLENBQUNGLFNBQUQsRUFBWTtJQUFBOztJQUMxQixNQUFNRyxZQUFZLEdBQUcsRUFBckI7SUFDQSxNQUFNQyxNQUFNLEdBQUcscUJBQUFKLFNBQVMsQ0FBQ0MsS0FBVixzRUFBaUJHLE1BQWpCLEtBQTJCLEVBQTFDO0lBQ0EsTUFBTUMsUUFBUSxHQUFHLHNCQUFBTCxTQUFTLENBQUNDLEtBQVYsd0VBQWlCSCxJQUFqQixLQUF5QixFQUExQztJQUVBLE1BQU1RLFlBQVksR0FBRyxJQUNuQixDQURtQixHQUNmZixNQUFNLENBQUNnQixVQUFQLENBQWtCSixZQUFsQixFQUFnQyxNQUFoQyxDQURlLEdBRW5CLENBRm1CLEdBRWZaLE1BQU0sQ0FBQ2dCLFVBQVAsQ0FBa0JILE1BQWxCLEVBQTBCLE1BQTFCLENBRmUsR0FHbkIsQ0FIbUIsR0FHZmIsTUFBTSxDQUFDZ0IsVUFBUCxDQUFrQkYsUUFBbEIsRUFBNEIsTUFBNUIsQ0FITjtJQUtBLE1BQU1HLE1BQU0sR0FBRyxJQUFJQywrQkFBSixDQUEyQkgsWUFBM0IsRUFBeUMsTUFBekMsQ0FBZjtJQUNBRSxNQUFNLENBQUNFLFVBQVAsQ0FBa0IsS0FBS2QsRUFBdkI7SUFDQVksTUFBTSxDQUFDRyxhQUFQLENBQXFCUixZQUFyQjtJQUNBSyxNQUFNLENBQUNHLGFBQVAsQ0FBcUJQLE1BQXJCO0lBQ0FJLE1BQU0sQ0FBQ0csYUFBUCxDQUFxQk4sUUFBckI7SUFFQSxPQUFPRyxNQUFNLENBQUNJLElBQWQ7RUFDRCxDQTNCbUI7O0VBNkJwQkMsdUJBQXVCLENBQUNiLFNBQUQsRUFBWWMsT0FBWixFQUFxQjtJQUMxQyxJQUFJZCxTQUFTLENBQUNDLEtBQVYsSUFBbUIsSUFBdkIsRUFBNkI7TUFDM0IsT0FBT1AsV0FBUDtJQUNEOztJQUVELE1BQU07TUFBRXFCO0lBQUYsSUFBY2YsU0FBUyxDQUFDQyxLQUE5QjtJQUNBLE1BQU1PLE1BQU0sR0FBR2pCLE1BQU0sQ0FBQ3lCLEtBQVAsQ0FBYSxDQUFiLENBQWY7SUFDQVIsTUFBTSxDQUFDUyxhQUFQLENBQXFCRixPQUFPLENBQUNHLE1BQTdCLEVBQXFDLENBQXJDO0lBQ0EsT0FBT1YsTUFBUDtFQUNELENBdENtQjs7RUF3Q3BCLENBQUNXLHFCQUFELENBQXVCbkIsU0FBdkIsRUFBa0NjLE9BQWxDLEVBQTJDO0lBQ3pDLElBQUlkLFNBQVMsQ0FBQ0MsS0FBVixJQUFtQixJQUF2QixFQUE2QjtNQUMzQixNQUFNUixhQUFOO01BQ0EsTUFBTUEsYUFBTjtNQUNBO0lBQ0Q7O0lBRUQsTUFBTTtNQUFFc0IsT0FBRjtNQUFXSztJQUFYLElBQW9CcEIsU0FBUyxDQUFDQyxLQUFwQzs7SUFFQSxLQUFLLElBQUlvQixDQUFDLEdBQUcsQ0FBUixFQUFXQyxHQUFHLEdBQUdQLE9BQU8sQ0FBQ0csTUFBOUIsRUFBc0NHLENBQUMsR0FBR0MsR0FBMUMsRUFBK0NELENBQUMsRUFBaEQsRUFBb0Q7TUFDbEQsTUFBTUUsTUFBTSxHQUFHUixPQUFPLENBQUNNLENBQUQsQ0FBdEI7TUFFQSxNQUFNRyxJQUFJLEdBQUdqQyxNQUFNLENBQUN5QixLQUFQLENBQWEsQ0FBYixDQUFiLENBSGtELENBSWxEOztNQUNBUSxJQUFJLENBQUNDLGFBQUwsQ0FBbUIsVUFBbkIsRUFBK0IsQ0FBL0IsRUFMa0QsQ0FPbEQ7O01BQ0FELElBQUksQ0FBQ1AsYUFBTCxDQUFtQixNQUFuQixFQUEyQixDQUEzQjtNQUNBLE1BQU1PLElBQU4sQ0FUa0QsQ0FXbEQ7O01BQ0EsTUFBTUQsTUFBTSxDQUFDMUIsSUFBUCxDQUFZSyxnQkFBWixDQUE2QnFCLE1BQTdCLENBQU4sQ0Faa0QsQ0FjbEQ7O01BQ0EsTUFBTWhDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxDQUFaLENBQU47SUFDRDs7SUFFRCxNQUFNQyxhQUFOOztJQUVBLEtBQUssSUFBSTRCLENBQUMsR0FBRyxDQUFSLEVBQVdILE1BQU0sR0FBR0UsSUFBSSxDQUFDRixNQUE5QixFQUFzQ0csQ0FBQyxHQUFHSCxNQUExQyxFQUFrREcsQ0FBQyxFQUFuRCxFQUF1RDtNQUNyRCxNQUFNL0IsYUFBTjtNQUVBLE1BQU1vQyxHQUFHLEdBQUdOLElBQUksQ0FBQ0MsQ0FBRCxDQUFoQjs7TUFDQSxLQUFLLElBQUlNLENBQUMsR0FBRyxDQUFSLEVBQVdDLElBQUksR0FBR0YsR0FBRyxDQUFDUixNQUEzQixFQUFtQ1MsQ0FBQyxHQUFHQyxJQUF2QyxFQUE2Q0QsQ0FBQyxFQUE5QyxFQUFrRDtRQUNoRCxNQUFNSixNQUFNLEdBQUdSLE9BQU8sQ0FBQ1ksQ0FBRCxDQUF0QjtRQUNBLE1BQU0xQixLQUFLLEdBQUd5QixHQUFHLENBQUNDLENBQUQsQ0FBakI7UUFFQSxNQUFNRSxLQUFLLEdBQUc7VUFDWjVCLEtBQUssRUFBRXNCLE1BQU0sQ0FBQzFCLElBQVAsQ0FBWWlDLFFBQVosQ0FBcUI3QixLQUFyQixFQUE0QkQsU0FBUyxDQUFDK0IsU0FBdEMsQ0FESztVQUVaYixNQUFNLEVBQUVLLE1BQU0sQ0FBQ0wsTUFGSDtVQUdaYyxLQUFLLEVBQUVULE1BQU0sQ0FBQ1MsS0FIRjtVQUlaQyxTQUFTLEVBQUVWLE1BQU0sQ0FBQ1U7UUFKTixDQUFkLENBSmdELENBV2hEOztRQUNBLE1BQU1WLE1BQU0sQ0FBQzFCLElBQVAsQ0FBWWdCLHVCQUFaLENBQW9DZ0IsS0FBcEMsRUFBMkNmLE9BQTNDLENBQU47UUFDQSxPQUFRUyxNQUFNLENBQUMxQixJQUFQLENBQVlzQixxQkFBWixDQUFrQ1UsS0FBbEMsRUFBeUNmLE9BQXpDLENBQVI7TUFDRDtJQUNGOztJQUVELE1BQU1yQixhQUFOO0VBQ0QsQ0EzRm1COztFQTZGcEJxQyxRQUFRLEVBQUUsVUFBUzdCLEtBQVQsRUFBK0I7SUFDdkMsSUFBSUEsS0FBSyxJQUFJLElBQWIsRUFBbUI7TUFDakIsT0FBTyxJQUFQO0lBQ0Q7O0lBRUQsSUFBSSxPQUFPQSxLQUFQLEtBQWlCLFFBQXJCLEVBQStCO01BQzdCLE1BQU0sSUFBSWlDLFNBQUosQ0FBYyxnQkFBZCxDQUFOO0lBQ0Q7O0lBRUQsSUFBSSxDQUFDQyxLQUFLLENBQUNDLE9BQU4sQ0FBY25DLEtBQUssQ0FBQ2MsT0FBcEIsQ0FBTCxFQUFtQztNQUNqQyxNQUFNLElBQUltQixTQUFKLENBQWMsZ0JBQWQsQ0FBTjtJQUNEOztJQUVELElBQUksQ0FBQ0MsS0FBSyxDQUFDQyxPQUFOLENBQWNuQyxLQUFLLENBQUNtQixJQUFwQixDQUFMLEVBQWdDO01BQzlCLE1BQU0sSUFBSWMsU0FBSixDQUFjLGdCQUFkLENBQU47SUFDRDs7SUFFRCxPQUFPakMsS0FBUDtFQUNEO0FBL0dtQixDQUF0QjtlQWtIZU4sRzs7QUFDZjBDLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjNDLEdBQWpCIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
const UDT = {
  id: 0xF0,
  type: 'UDTTYPE',
  name: 'UDT',

  declaration() {
    throw new Error('not implemented');
  },

  generateTypeInfo() {
    throw new Error('not implemented');
  },

  generateParameterLength() {
    throw new Error('not implemented');
  },

  generateParameterData() {
    throw new Error('not implemented');
  },

  validate() {
    throw new Error('not implemented');
  }

};
var _default = UDT;
exports.default = _default;
module.exports = UDT;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJVRFQiLCJpZCIsInR5cGUiLCJuYW1lIiwiZGVjbGFyYXRpb24iLCJFcnJvciIsImdlbmVyYXRlVHlwZUluZm8iLCJnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aCIsImdlbmVyYXRlUGFyYW1ldGVyRGF0YSIsInZhbGlkYXRlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhLXR5cGVzL3VkdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4uL2RhdGEtdHlwZSc7XG5cbmNvbnN0IFVEVDogRGF0YVR5cGUgPSB7XG4gIGlkOiAweEYwLFxuICB0eXBlOiAnVURUVFlQRScsXG4gIG5hbWU6ICdVRFQnLFxuXG4gIGRlY2xhcmF0aW9uKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gIH0sXG5cbiAgZ2VuZXJhdGVUeXBlSW5mbygpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICB9LFxuXG4gIGdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gIH0sXG5cbiAgZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gIH0sXG5cbiAgdmFsaWRhdGUoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgVURUO1xubW9kdWxlLmV4cG9ydHMgPSBVRFQ7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUVBLE1BQU1BLEdBQWEsR0FBRztFQUNwQkMsRUFBRSxFQUFFLElBRGdCO0VBRXBCQyxJQUFJLEVBQUUsU0FGYztFQUdwQkMsSUFBSSxFQUFFLEtBSGM7O0VBS3BCQyxXQUFXLEdBQUc7SUFDWixNQUFNLElBQUlDLEtBQUosQ0FBVSxpQkFBVixDQUFOO0VBQ0QsQ0FQbUI7O0VBU3BCQyxnQkFBZ0IsR0FBRztJQUNqQixNQUFNLElBQUlELEtBQUosQ0FBVSxpQkFBVixDQUFOO0VBQ0QsQ0FYbUI7O0VBYXBCRSx1QkFBdUIsR0FBRztJQUN4QixNQUFNLElBQUlGLEtBQUosQ0FBVSxpQkFBVixDQUFOO0VBQ0QsQ0FmbUI7O0VBaUJwQkcscUJBQXFCLEdBQUc7SUFDdEIsTUFBTSxJQUFJSCxLQUFKLENBQVUsaUJBQVYsQ0FBTjtFQUNELENBbkJtQjs7RUFxQnBCSSxRQUFRLEdBQUc7SUFDVCxNQUFNLElBQUlKLEtBQUosQ0FBVSxpQkFBVixDQUFOO0VBQ0Q7O0FBdkJtQixDQUF0QjtlQTBCZUwsRzs7QUFDZlUsTUFBTSxDQUFDQyxPQUFQLEdBQWlCWCxHQUFqQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _guidParser = require("../guid-parser");

const NULL_LENGTH = Buffer.from([0x00]);
const DATA_LENGTH = Buffer.from([0x10]);
const UniqueIdentifier = {
  id: 0x24,
  type: 'GUIDN',
  name: 'UniqueIdentifier',
  declaration: function () {
    return 'uniqueidentifier';
  },
  resolveLength: function () {
    return 16;
  },

  generateTypeInfo() {
    return Buffer.from([this.id, 0x10]);
  },

  generateParameterLength(parameter, options) {
    if (parameter.value == null) {
      return NULL_LENGTH;
    }

    return DATA_LENGTH;
  },

  generateParameterData: function* (parameter, options) {
    if (parameter.value == null) {
      return;
    }

    yield Buffer.from((0, _guidParser.guidToArray)(parameter.value));
  },
  validate: function (value) {
    if (value == null) {
      return null;
    }

    if (typeof value !== 'string') {
      throw new TypeError('Invalid string.');
    }

    if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value)) {
      throw new TypeError('Invalid GUID.');
    }

    return value;
  }
};
var _default = UniqueIdentifier;
exports.default = _default;
module.exports = UniqueIdentifier;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOVUxMX0xFTkdUSCIsIkJ1ZmZlciIsImZyb20iLCJEQVRBX0xFTkdUSCIsIlVuaXF1ZUlkZW50aWZpZXIiLCJpZCIsInR5cGUiLCJuYW1lIiwiZGVjbGFyYXRpb24iLCJyZXNvbHZlTGVuZ3RoIiwiZ2VuZXJhdGVUeXBlSW5mbyIsImdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoIiwicGFyYW1ldGVyIiwib3B0aW9ucyIsInZhbHVlIiwiZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhIiwidmFsaWRhdGUiLCJUeXBlRXJyb3IiLCJ0ZXN0IiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhLXR5cGVzL3VuaXF1ZWlkZW50aWZpZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuLi9kYXRhLXR5cGUnO1xuaW1wb3J0IHsgZ3VpZFRvQXJyYXkgfSBmcm9tICcuLi9ndWlkLXBhcnNlcic7XG5cbmNvbnN0IE5VTExfTEVOR1RIID0gQnVmZmVyLmZyb20oWzB4MDBdKTtcbmNvbnN0IERBVEFfTEVOR1RIID0gQnVmZmVyLmZyb20oWzB4MTBdKTtcblxuY29uc3QgVW5pcXVlSWRlbnRpZmllcjogRGF0YVR5cGUgPSB7XG4gIGlkOiAweDI0LFxuICB0eXBlOiAnR1VJRE4nLFxuICBuYW1lOiAnVW5pcXVlSWRlbnRpZmllcicsXG5cbiAgZGVjbGFyYXRpb246IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAndW5pcXVlaWRlbnRpZmllcic7XG4gIH0sXG5cbiAgcmVzb2x2ZUxlbmd0aDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIDE2O1xuICB9LFxuXG4gIGdlbmVyYXRlVHlwZUluZm8oKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKFt0aGlzLmlkLCAweDEwXSk7XG4gIH0sXG5cbiAgZ2VuZXJhdGVQYXJhbWV0ZXJMZW5ndGgocGFyYW1ldGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKHBhcmFtZXRlci52YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gTlVMTF9MRU5HVEg7XG4gICAgfVxuXG4gICAgcmV0dXJuIERBVEFfTEVOR1RIO1xuICB9LFxuXG4gIGdlbmVyYXRlUGFyYW1ldGVyRGF0YTogZnVuY3Rpb24qKHBhcmFtZXRlciwgb3B0aW9ucykge1xuICAgIGlmIChwYXJhbWV0ZXIudmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHlpZWxkIEJ1ZmZlci5mcm9tKGd1aWRUb0FycmF5KHBhcmFtZXRlci52YWx1ZSkpO1xuICB9LFxuXG4gIHZhbGlkYXRlOiBmdW5jdGlvbih2YWx1ZSk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBzdHJpbmcuJyk7XG4gICAgfVxuXG4gICAgaWYgKCEvXlswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfSQvaS50ZXN0KHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBHVUlELicpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgVW5pcXVlSWRlbnRpZmllcjtcbm1vZHVsZS5leHBvcnRzID0gVW5pcXVlSWRlbnRpZmllcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUNBOztBQUVBLE1BQU1BLFdBQVcsR0FBR0MsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxJQUFELENBQVosQ0FBcEI7QUFDQSxNQUFNQyxXQUFXLEdBQUdGLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxDQUFaLENBQXBCO0FBRUEsTUFBTUUsZ0JBQTBCLEdBQUc7RUFDakNDLEVBQUUsRUFBRSxJQUQ2QjtFQUVqQ0MsSUFBSSxFQUFFLE9BRjJCO0VBR2pDQyxJQUFJLEVBQUUsa0JBSDJCO0VBS2pDQyxXQUFXLEVBQUUsWUFBVztJQUN0QixPQUFPLGtCQUFQO0VBQ0QsQ0FQZ0M7RUFTakNDLGFBQWEsRUFBRSxZQUFXO0lBQ3hCLE9BQU8sRUFBUDtFQUNELENBWGdDOztFQWFqQ0MsZ0JBQWdCLEdBQUc7SUFDakIsT0FBT1QsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxLQUFLRyxFQUFOLEVBQVUsSUFBVixDQUFaLENBQVA7RUFDRCxDQWZnQzs7RUFpQmpDTSx1QkFBdUIsQ0FBQ0MsU0FBRCxFQUFZQyxPQUFaLEVBQXFCO0lBQzFDLElBQUlELFNBQVMsQ0FBQ0UsS0FBVixJQUFtQixJQUF2QixFQUE2QjtNQUMzQixPQUFPZCxXQUFQO0lBQ0Q7O0lBRUQsT0FBT0csV0FBUDtFQUNELENBdkJnQzs7RUF5QmpDWSxxQkFBcUIsRUFBRSxXQUFVSCxTQUFWLEVBQXFCQyxPQUFyQixFQUE4QjtJQUNuRCxJQUFJRCxTQUFTLENBQUNFLEtBQVYsSUFBbUIsSUFBdkIsRUFBNkI7TUFDM0I7SUFDRDs7SUFFRCxNQUFNYixNQUFNLENBQUNDLElBQVAsQ0FBWSw2QkFBWVUsU0FBUyxDQUFDRSxLQUF0QixDQUFaLENBQU47RUFDRCxDQS9CZ0M7RUFpQ2pDRSxRQUFRLEVBQUUsVUFBU0YsS0FBVCxFQUErQjtJQUN2QyxJQUFJQSxLQUFLLElBQUksSUFBYixFQUFtQjtNQUNqQixPQUFPLElBQVA7SUFDRDs7SUFFRCxJQUFJLE9BQU9BLEtBQVAsS0FBaUIsUUFBckIsRUFBK0I7TUFDN0IsTUFBTSxJQUFJRyxTQUFKLENBQWMsaUJBQWQsQ0FBTjtJQUNEOztJQUVELElBQUksQ0FBQyxrRUFBa0VDLElBQWxFLENBQXVFSixLQUF2RSxDQUFMLEVBQW9GO01BQ2xGLE1BQU0sSUFBSUcsU0FBSixDQUFjLGVBQWQsQ0FBTjtJQUNEOztJQUVELE9BQU9ILEtBQVA7RUFDRDtBQS9DZ0MsQ0FBbkM7ZUFrRGVWLGdCOztBQUNmZSxNQUFNLENBQUNDLE9BQVAsR0FBaUJoQixnQkFBakIifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
const MAX = (1 << 16) - 1;
const UNKNOWN_PLP_LEN = Buffer.from([0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]);
const PLP_TERMINATOR = Buffer.from([0x00, 0x00, 0x00, 0x00]);
const NULL_LENGTH = Buffer.from([0xFF, 0xFF]);
const MAX_NULL_LENGTH = Buffer.from([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]);
const VarBinary = {
  id: 0xA5,
  type: 'BIGVARBIN',
  name: 'VarBinary',
  maximumLength: 8000,
  declaration: function (parameter) {
    const value = parameter.value; // Temporary solution. Remove 'any' later.

    let length;

    if (parameter.length) {
      length = parameter.length;
    } else if (value != null) {
      length = value.length || 1;
    } else if (value === null && !parameter.output) {
      length = 1;
    } else {
      length = this.maximumLength;
    }

    if (length <= this.maximumLength) {
      return 'varbinary(' + length + ')';
    } else {
      return 'varbinary(max)';
    }
  },
  resolveLength: function (parameter) {
    const value = parameter.value; // Temporary solution. Remove 'any' later.

    if (parameter.length != null) {
      return parameter.length;
    } else if (value != null) {
      return value.length;
    } else {
      return this.maximumLength;
    }
  },
  generateTypeInfo: function (parameter) {
    const buffer = Buffer.alloc(3);
    buffer.writeUInt8(this.id, 0);

    if (parameter.length <= this.maximumLength) {
      buffer.writeUInt16LE(parameter.length, 1);
    } else {
      buffer.writeUInt16LE(MAX, 1);
    }

    return buffer;
  },

  generateParameterLength(parameter, options) {
    if (parameter.value == null) {
      if (parameter.length <= this.maximumLength) {
        return NULL_LENGTH;
      } else {
        return MAX_NULL_LENGTH;
      }
    }

    let value = parameter.value;

    if (!Buffer.isBuffer(value)) {
      value = value.toString();
    }

    const length = Buffer.byteLength(value, 'ucs2');

    if (parameter.length <= this.maximumLength) {
      const buffer = Buffer.alloc(2);
      buffer.writeUInt16LE(length, 0);
      return buffer;
    } else {
      // writePLPBody
      return UNKNOWN_PLP_LEN;
    }
  },

  *generateParameterData(parameter, options) {
    if (parameter.value == null) {
      return;
    }

    let value = parameter.value;

    if (parameter.length <= this.maximumLength) {
      if (Buffer.isBuffer(value)) {
        yield value;
      } else {
        yield Buffer.from(value.toString(), 'ucs2');
      }
    } else {
      // writePLPBody
      if (!Buffer.isBuffer(value)) {
        value = value.toString();
      }

      const length = Buffer.byteLength(value, 'ucs2');

      if (length > 0) {
        const buffer = Buffer.alloc(4);
        buffer.writeUInt32LE(length, 0);
        yield buffer;

        if (Buffer.isBuffer(value)) {
          yield value;
        } else {
          yield Buffer.from(value, 'ucs2');
        }
      }

      yield PLP_TERMINATOR;
    }
  },

  validate: function (value) {
    if (value == null) {
      return null;
    }

    if (!Buffer.isBuffer(value)) {
      throw new TypeError('Invalid buffer.');
    }

    return value;
  }
};
var _default = VarBinary;
exports.default = _default;
module.exports = VarBinary;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNQVgiLCJVTktOT1dOX1BMUF9MRU4iLCJCdWZmZXIiLCJmcm9tIiwiUExQX1RFUk1JTkFUT1IiLCJOVUxMX0xFTkdUSCIsIk1BWF9OVUxMX0xFTkdUSCIsIlZhckJpbmFyeSIsImlkIiwidHlwZSIsIm5hbWUiLCJtYXhpbXVtTGVuZ3RoIiwiZGVjbGFyYXRpb24iLCJwYXJhbWV0ZXIiLCJ2YWx1ZSIsImxlbmd0aCIsIm91dHB1dCIsInJlc29sdmVMZW5ndGgiLCJnZW5lcmF0ZVR5cGVJbmZvIiwiYnVmZmVyIiwiYWxsb2MiLCJ3cml0ZVVJbnQ4Iiwid3JpdGVVSW50MTZMRSIsImdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoIiwib3B0aW9ucyIsImlzQnVmZmVyIiwidG9TdHJpbmciLCJieXRlTGVuZ3RoIiwiZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhIiwid3JpdGVVSW50MzJMRSIsInZhbGlkYXRlIiwiVHlwZUVycm9yIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhLXR5cGVzL3ZhcmJpbmFyeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4uL2RhdGEtdHlwZSc7XG5cbmNvbnN0IE1BWCA9ICgxIDw8IDE2KSAtIDE7XG5jb25zdCBVTktOT1dOX1BMUF9MRU4gPSBCdWZmZXIuZnJvbShbMHhmZSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZl0pO1xuY29uc3QgUExQX1RFUk1JTkFUT1IgPSBCdWZmZXIuZnJvbShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pO1xuXG5jb25zdCBOVUxMX0xFTkdUSCA9IEJ1ZmZlci5mcm9tKFsweEZGLCAweEZGXSk7XG5jb25zdCBNQVhfTlVMTF9MRU5HVEggPSBCdWZmZXIuZnJvbShbMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRl0pO1xuXG5jb25zdCBWYXJCaW5hcnk6IHsgbWF4aW11bUxlbmd0aDogbnVtYmVyIH0gJiBEYXRhVHlwZSA9IHtcbiAgaWQ6IDB4QTUsXG4gIHR5cGU6ICdCSUdWQVJCSU4nLFxuICBuYW1lOiAnVmFyQmluYXJ5JyxcbiAgbWF4aW11bUxlbmd0aDogODAwMCxcblxuICBkZWNsYXJhdGlvbjogZnVuY3Rpb24ocGFyYW1ldGVyKSB7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJhbWV0ZXIudmFsdWUgYXMgYW55OyAvLyBUZW1wb3Jhcnkgc29sdXRpb24uIFJlbW92ZSAnYW55JyBsYXRlci5cbiAgICBsZXQgbGVuZ3RoO1xuICAgIGlmIChwYXJhbWV0ZXIubGVuZ3RoKSB7XG4gICAgICBsZW5ndGggPSBwYXJhbWV0ZXIubGVuZ3RoO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgbGVuZ3RoID0gdmFsdWUubGVuZ3RoIHx8IDE7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gbnVsbCAmJiAhcGFyYW1ldGVyLm91dHB1dCkge1xuICAgICAgbGVuZ3RoID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGVuZ3RoID0gdGhpcy5tYXhpbXVtTGVuZ3RoO1xuICAgIH1cblxuICAgIGlmIChsZW5ndGggPD0gdGhpcy5tYXhpbXVtTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gJ3ZhcmJpbmFyeSgnICsgbGVuZ3RoICsgJyknO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ3ZhcmJpbmFyeShtYXgpJztcbiAgICB9XG4gIH0sXG5cbiAgcmVzb2x2ZUxlbmd0aDogZnVuY3Rpb24ocGFyYW1ldGVyKSB7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJhbWV0ZXIudmFsdWUgYXMgYW55OyAvLyBUZW1wb3Jhcnkgc29sdXRpb24uIFJlbW92ZSAnYW55JyBsYXRlci5cbiAgICBpZiAocGFyYW1ldGVyLmxlbmd0aCAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gcGFyYW1ldGVyLmxlbmd0aDtcbiAgICB9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLm1heGltdW1MZW5ndGg7XG4gICAgfVxuICB9LFxuXG4gIGdlbmVyYXRlVHlwZUluZm86IGZ1bmN0aW9uKHBhcmFtZXRlcikge1xuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygzKTtcbiAgICBidWZmZXIud3JpdGVVSW50OCh0aGlzLmlkLCAwKTtcblxuICAgIGlmIChwYXJhbWV0ZXIubGVuZ3RoISA8PSB0aGlzLm1heGltdW1MZW5ndGgpIHtcbiAgICAgIGJ1ZmZlci53cml0ZVVJbnQxNkxFKHBhcmFtZXRlci5sZW5ndGghLCAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnVmZmVyLndyaXRlVUludDE2TEUoTUFYLCAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVmZmVyO1xuICB9LFxuXG4gIGdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoKHBhcmFtZXRlciwgb3B0aW9ucykge1xuICAgIGlmIChwYXJhbWV0ZXIudmFsdWUgPT0gbnVsbCkge1xuICAgICAgaWYgKHBhcmFtZXRlci5sZW5ndGghIDw9IHRoaXMubWF4aW11bUxlbmd0aCkge1xuICAgICAgICByZXR1cm4gTlVMTF9MRU5HVEg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gTUFYX05VTExfTEVOR1RIO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCB2YWx1ZSA9IHBhcmFtZXRlci52YWx1ZTtcbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBjb25zdCBsZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aCh2YWx1ZSwgJ3VjczInKTtcblxuICAgIGlmIChwYXJhbWV0ZXIubGVuZ3RoISA8PSB0aGlzLm1heGltdW1MZW5ndGgpIHtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygyKTtcbiAgICAgIGJ1ZmZlci53cml0ZVVJbnQxNkxFKGxlbmd0aCwgMCk7XG4gICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH0gZWxzZSB7IC8vIHdyaXRlUExQQm9keVxuICAgICAgcmV0dXJuIFVOS05PV05fUExQX0xFTjtcbiAgICB9XG4gIH0sXG5cbiAgKiBnZW5lcmF0ZVBhcmFtZXRlckRhdGEocGFyYW1ldGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKHBhcmFtZXRlci52YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHZhbHVlID0gcGFyYW1ldGVyLnZhbHVlO1xuXG4gICAgaWYgKHBhcmFtZXRlci5sZW5ndGghIDw9IHRoaXMubWF4aW11bUxlbmd0aCkge1xuICAgICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICAgICAgeWllbGQgdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB5aWVsZCBCdWZmZXIuZnJvbSh2YWx1ZS50b1N0cmluZygpLCAndWNzMicpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIHdyaXRlUExQQm9keVxuICAgICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGVuZ3RoID0gQnVmZmVyLmJ5dGVMZW5ndGgodmFsdWUsICd1Y3MyJyk7XG5cbiAgICAgIGlmIChsZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgICAgICAgYnVmZmVyLndyaXRlVUludDMyTEUobGVuZ3RoLCAwKTtcbiAgICAgICAgeWllbGQgYnVmZmVyO1xuXG4gICAgICAgIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICAgICAgeWllbGQgdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgeWllbGQgQnVmZmVyLmZyb20odmFsdWUsICd1Y3MyJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgeWllbGQgUExQX1RFUk1JTkFUT1I7XG4gICAgfVxuICB9LFxuXG4gIHZhbGlkYXRlOiBmdW5jdGlvbih2YWx1ZSk6IEJ1ZmZlciB8IG51bGwge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGJ1ZmZlci4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBWYXJCaW5hcnk7XG5tb2R1bGUuZXhwb3J0cyA9IFZhckJpbmFyeTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUEsTUFBTUEsR0FBRyxHQUFHLENBQUMsS0FBSyxFQUFOLElBQVksQ0FBeEI7QUFDQSxNQUFNQyxlQUFlLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxFQUFPLElBQVAsRUFBYSxJQUFiLEVBQW1CLElBQW5CLEVBQXlCLElBQXpCLEVBQStCLElBQS9CLEVBQXFDLElBQXJDLEVBQTJDLElBQTNDLENBQVosQ0FBeEI7QUFDQSxNQUFNQyxjQUFjLEdBQUdGLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxFQUFPLElBQVAsRUFBYSxJQUFiLEVBQW1CLElBQW5CLENBQVosQ0FBdkI7QUFFQSxNQUFNRSxXQUFXLEdBQUdILE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUMsSUFBRCxFQUFPLElBQVAsQ0FBWixDQUFwQjtBQUNBLE1BQU1HLGVBQWUsR0FBR0osTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxJQUFELEVBQU8sSUFBUCxFQUFhLElBQWIsRUFBbUIsSUFBbkIsRUFBeUIsSUFBekIsRUFBK0IsSUFBL0IsRUFBcUMsSUFBckMsRUFBMkMsSUFBM0MsQ0FBWixDQUF4QjtBQUVBLE1BQU1JLFNBQStDLEdBQUc7RUFDdERDLEVBQUUsRUFBRSxJQURrRDtFQUV0REMsSUFBSSxFQUFFLFdBRmdEO0VBR3REQyxJQUFJLEVBQUUsV0FIZ0Q7RUFJdERDLGFBQWEsRUFBRSxJQUp1QztFQU10REMsV0FBVyxFQUFFLFVBQVNDLFNBQVQsRUFBb0I7SUFDL0IsTUFBTUMsS0FBSyxHQUFHRCxTQUFTLENBQUNDLEtBQXhCLENBRCtCLENBQ087O0lBQ3RDLElBQUlDLE1BQUo7O0lBQ0EsSUFBSUYsU0FBUyxDQUFDRSxNQUFkLEVBQXNCO01BQ3BCQSxNQUFNLEdBQUdGLFNBQVMsQ0FBQ0UsTUFBbkI7SUFDRCxDQUZELE1BRU8sSUFBSUQsS0FBSyxJQUFJLElBQWIsRUFBbUI7TUFDeEJDLE1BQU0sR0FBR0QsS0FBSyxDQUFDQyxNQUFOLElBQWdCLENBQXpCO0lBQ0QsQ0FGTSxNQUVBLElBQUlELEtBQUssS0FBSyxJQUFWLElBQWtCLENBQUNELFNBQVMsQ0FBQ0csTUFBakMsRUFBeUM7TUFDOUNELE1BQU0sR0FBRyxDQUFUO0lBQ0QsQ0FGTSxNQUVBO01BQ0xBLE1BQU0sR0FBRyxLQUFLSixhQUFkO0lBQ0Q7O0lBRUQsSUFBSUksTUFBTSxJQUFJLEtBQUtKLGFBQW5CLEVBQWtDO01BQ2hDLE9BQU8sZUFBZUksTUFBZixHQUF3QixHQUEvQjtJQUNELENBRkQsTUFFTztNQUNMLE9BQU8sZ0JBQVA7SUFDRDtFQUNGLENBeEJxRDtFQTBCdERFLGFBQWEsRUFBRSxVQUFTSixTQUFULEVBQW9CO0lBQ2pDLE1BQU1DLEtBQUssR0FBR0QsU0FBUyxDQUFDQyxLQUF4QixDQURpQyxDQUNLOztJQUN0QyxJQUFJRCxTQUFTLENBQUNFLE1BQVYsSUFBb0IsSUFBeEIsRUFBOEI7TUFDNUIsT0FBT0YsU0FBUyxDQUFDRSxNQUFqQjtJQUNELENBRkQsTUFFTyxJQUFJRCxLQUFLLElBQUksSUFBYixFQUFtQjtNQUN4QixPQUFPQSxLQUFLLENBQUNDLE1BQWI7SUFDRCxDQUZNLE1BRUE7TUFDTCxPQUFPLEtBQUtKLGFBQVo7SUFDRDtFQUNGLENBbkNxRDtFQXFDdERPLGdCQUFnQixFQUFFLFVBQVNMLFNBQVQsRUFBb0I7SUFDcEMsTUFBTU0sTUFBTSxHQUFHakIsTUFBTSxDQUFDa0IsS0FBUCxDQUFhLENBQWIsQ0FBZjtJQUNBRCxNQUFNLENBQUNFLFVBQVAsQ0FBa0IsS0FBS2IsRUFBdkIsRUFBMkIsQ0FBM0I7O0lBRUEsSUFBSUssU0FBUyxDQUFDRSxNQUFWLElBQXFCLEtBQUtKLGFBQTlCLEVBQTZDO01BQzNDUSxNQUFNLENBQUNHLGFBQVAsQ0FBcUJULFNBQVMsQ0FBQ0UsTUFBL0IsRUFBd0MsQ0FBeEM7SUFDRCxDQUZELE1BRU87TUFDTEksTUFBTSxDQUFDRyxhQUFQLENBQXFCdEIsR0FBckIsRUFBMEIsQ0FBMUI7SUFDRDs7SUFFRCxPQUFPbUIsTUFBUDtFQUNELENBaERxRDs7RUFrRHRESSx1QkFBdUIsQ0FBQ1YsU0FBRCxFQUFZVyxPQUFaLEVBQXFCO0lBQzFDLElBQUlYLFNBQVMsQ0FBQ0MsS0FBVixJQUFtQixJQUF2QixFQUE2QjtNQUMzQixJQUFJRCxTQUFTLENBQUNFLE1BQVYsSUFBcUIsS0FBS0osYUFBOUIsRUFBNkM7UUFDM0MsT0FBT04sV0FBUDtNQUNELENBRkQsTUFFTztRQUNMLE9BQU9DLGVBQVA7TUFDRDtJQUNGOztJQUVELElBQUlRLEtBQUssR0FBR0QsU0FBUyxDQUFDQyxLQUF0Qjs7SUFDQSxJQUFJLENBQUNaLE1BQU0sQ0FBQ3VCLFFBQVAsQ0FBZ0JYLEtBQWhCLENBQUwsRUFBNkI7TUFDM0JBLEtBQUssR0FBR0EsS0FBSyxDQUFDWSxRQUFOLEVBQVI7SUFDRDs7SUFFRCxNQUFNWCxNQUFNLEdBQUdiLE1BQU0sQ0FBQ3lCLFVBQVAsQ0FBa0JiLEtBQWxCLEVBQXlCLE1BQXpCLENBQWY7O0lBRUEsSUFBSUQsU0FBUyxDQUFDRSxNQUFWLElBQXFCLEtBQUtKLGFBQTlCLEVBQTZDO01BQzNDLE1BQU1RLE1BQU0sR0FBR2pCLE1BQU0sQ0FBQ2tCLEtBQVAsQ0FBYSxDQUFiLENBQWY7TUFDQUQsTUFBTSxDQUFDRyxhQUFQLENBQXFCUCxNQUFyQixFQUE2QixDQUE3QjtNQUNBLE9BQU9JLE1BQVA7SUFDRCxDQUpELE1BSU87TUFBRTtNQUNQLE9BQU9sQixlQUFQO0lBQ0Q7RUFDRixDQXpFcUQ7O0VBMkV0RCxDQUFFMkIscUJBQUYsQ0FBd0JmLFNBQXhCLEVBQW1DVyxPQUFuQyxFQUE0QztJQUMxQyxJQUFJWCxTQUFTLENBQUNDLEtBQVYsSUFBbUIsSUFBdkIsRUFBNkI7TUFDM0I7SUFDRDs7SUFFRCxJQUFJQSxLQUFLLEdBQUdELFNBQVMsQ0FBQ0MsS0FBdEI7O0lBRUEsSUFBSUQsU0FBUyxDQUFDRSxNQUFWLElBQXFCLEtBQUtKLGFBQTlCLEVBQTZDO01BQzNDLElBQUlULE1BQU0sQ0FBQ3VCLFFBQVAsQ0FBZ0JYLEtBQWhCLENBQUosRUFBNEI7UUFDMUIsTUFBTUEsS0FBTjtNQUNELENBRkQsTUFFTztRQUNMLE1BQU1aLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZVyxLQUFLLENBQUNZLFFBQU4sRUFBWixFQUE4QixNQUE5QixDQUFOO01BQ0Q7SUFDRixDQU5ELE1BTU87TUFBRTtNQUNQLElBQUksQ0FBQ3hCLE1BQU0sQ0FBQ3VCLFFBQVAsQ0FBZ0JYLEtBQWhCLENBQUwsRUFBNkI7UUFDM0JBLEtBQUssR0FBR0EsS0FBSyxDQUFDWSxRQUFOLEVBQVI7TUFDRDs7TUFFRCxNQUFNWCxNQUFNLEdBQUdiLE1BQU0sQ0FBQ3lCLFVBQVAsQ0FBa0JiLEtBQWxCLEVBQXlCLE1BQXpCLENBQWY7O01BRUEsSUFBSUMsTUFBTSxHQUFHLENBQWIsRUFBZ0I7UUFDZCxNQUFNSSxNQUFNLEdBQUdqQixNQUFNLENBQUNrQixLQUFQLENBQWEsQ0FBYixDQUFmO1FBQ0FELE1BQU0sQ0FBQ1UsYUFBUCxDQUFxQmQsTUFBckIsRUFBNkIsQ0FBN0I7UUFDQSxNQUFNSSxNQUFOOztRQUVBLElBQUlqQixNQUFNLENBQUN1QixRQUFQLENBQWdCWCxLQUFoQixDQUFKLEVBQTRCO1VBQzFCLE1BQU1BLEtBQU47UUFDRCxDQUZELE1BRU87VUFDTCxNQUFNWixNQUFNLENBQUNDLElBQVAsQ0FBWVcsS0FBWixFQUFtQixNQUFuQixDQUFOO1FBQ0Q7TUFDRjs7TUFFRCxNQUFNVixjQUFOO0lBQ0Q7RUFDRixDQTdHcUQ7O0VBK0d0RDBCLFFBQVEsRUFBRSxVQUFTaEIsS0FBVCxFQUErQjtJQUN2QyxJQUFJQSxLQUFLLElBQUksSUFBYixFQUFtQjtNQUNqQixPQUFPLElBQVA7SUFDRDs7SUFDRCxJQUFJLENBQUNaLE1BQU0sQ0FBQ3VCLFFBQVAsQ0FBZ0JYLEtBQWhCLENBQUwsRUFBNkI7TUFDM0IsTUFBTSxJQUFJaUIsU0FBSixDQUFjLGlCQUFkLENBQU47SUFDRDs7SUFDRCxPQUFPakIsS0FBUDtFQUNEO0FBdkhxRCxDQUF4RDtlQTBIZVAsUzs7QUFDZnlCLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjFCLFNBQWpCIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _iconvLite = _interopRequireDefault(require("iconv-lite"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const MAX = (1 << 16) - 1;
const UNKNOWN_PLP_LEN = Buffer.from([0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]);
const PLP_TERMINATOR = Buffer.from([0x00, 0x00, 0x00, 0x00]);
const NULL_LENGTH = Buffer.from([0xFF, 0xFF]);
const MAX_NULL_LENGTH = Buffer.from([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]);
const VarChar = {
  id: 0xA7,
  type: 'BIGVARCHR',
  name: 'VarChar',
  maximumLength: 8000,
  declaration: function (parameter) {
    const value = parameter.value;
    let length;

    if (parameter.length) {
      length = parameter.length;
    } else if (value != null) {
      length = value.length || 1;
    } else if (value === null && !parameter.output) {
      length = 1;
    } else {
      length = this.maximumLength;
    }

    if (length <= this.maximumLength) {
      return 'varchar(' + length + ')';
    } else {
      return 'varchar(max)';
    }
  },
  resolveLength: function (parameter) {
    const value = parameter.value;

    if (parameter.length != null) {
      return parameter.length;
    } else if (value != null) {
      return value.length || 1;
    } else {
      return this.maximumLength;
    }
  },

  generateTypeInfo(parameter) {
    const buffer = Buffer.alloc(8);
    buffer.writeUInt8(this.id, 0);

    if (parameter.length <= this.maximumLength) {
      buffer.writeUInt16LE(parameter.length, 1);
    } else {
      buffer.writeUInt16LE(MAX, 1);
    }

    if (parameter.collation) {
      parameter.collation.toBuffer().copy(buffer, 3, 0, 5);
    }

    return buffer;
  },

  generateParameterLength(parameter, options) {
    const value = parameter.value;

    if (value == null) {
      if (parameter.length <= this.maximumLength) {
        return NULL_LENGTH;
      } else {
        return MAX_NULL_LENGTH;
      }
    }

    if (parameter.length <= this.maximumLength) {
      const buffer = Buffer.alloc(2);
      buffer.writeUInt16LE(value.length, 0);
      return buffer;
    } else {
      return UNKNOWN_PLP_LEN;
    }
  },

  *generateParameterData(parameter, options) {
    const value = parameter.value;

    if (value == null) {
      return;
    }

    if (parameter.length <= this.maximumLength) {
      yield value;
    } else {
      if (value.length > 0) {
        const buffer = Buffer.alloc(4);
        buffer.writeUInt32LE(value.length, 0);
        yield buffer;
        yield value;
      }

      yield PLP_TERMINATOR;
    }
  },

  validate: function (value, collation) {
    if (value == null) {
      return null;
    }

    if (typeof value !== 'string') {
      throw new TypeError('Invalid string.');
    }

    if (!collation) {
      throw new Error('No collation was set by the server for the current connection.');
    }

    if (!collation.codepage) {
      throw new Error('The collation set by the server has no associated encoding.');
    }

    return _iconvLite.default.encode(value, collation.codepage);
  }
};
var _default = VarChar;
exports.default = _default;
module.exports = VarChar;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNQVgiLCJVTktOT1dOX1BMUF9MRU4iLCJCdWZmZXIiLCJmcm9tIiwiUExQX1RFUk1JTkFUT1IiLCJOVUxMX0xFTkdUSCIsIk1BWF9OVUxMX0xFTkdUSCIsIlZhckNoYXIiLCJpZCIsInR5cGUiLCJuYW1lIiwibWF4aW11bUxlbmd0aCIsImRlY2xhcmF0aW9uIiwicGFyYW1ldGVyIiwidmFsdWUiLCJsZW5ndGgiLCJvdXRwdXQiLCJyZXNvbHZlTGVuZ3RoIiwiZ2VuZXJhdGVUeXBlSW5mbyIsImJ1ZmZlciIsImFsbG9jIiwid3JpdGVVSW50OCIsIndyaXRlVUludDE2TEUiLCJjb2xsYXRpb24iLCJ0b0J1ZmZlciIsImNvcHkiLCJnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aCIsIm9wdGlvbnMiLCJnZW5lcmF0ZVBhcmFtZXRlckRhdGEiLCJ3cml0ZVVJbnQzMkxFIiwidmFsaWRhdGUiLCJUeXBlRXJyb3IiLCJFcnJvciIsImNvZGVwYWdlIiwiaWNvbnYiLCJlbmNvZGUiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGEtdHlwZXMvdmFyY2hhci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgaWNvbnYgZnJvbSAnaWNvbnYtbGl0ZSc7XG5cbmltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi4vZGF0YS10eXBlJztcblxuY29uc3QgTUFYID0gKDEgPDwgMTYpIC0gMTtcbmNvbnN0IFVOS05PV05fUExQX0xFTiA9IEJ1ZmZlci5mcm9tKFsweGZlLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmXSk7XG5jb25zdCBQTFBfVEVSTUlOQVRPUiA9IEJ1ZmZlci5mcm9tKFsweDAwLCAweDAwLCAweDAwLCAweDAwXSk7XG5cbmNvbnN0IE5VTExfTEVOR1RIID0gQnVmZmVyLmZyb20oWzB4RkYsIDB4RkZdKTtcbmNvbnN0IE1BWF9OVUxMX0xFTkdUSCA9IEJ1ZmZlci5mcm9tKFsweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGXSk7XG5cbmNvbnN0IFZhckNoYXI6IHsgbWF4aW11bUxlbmd0aDogbnVtYmVyIH0gJiBEYXRhVHlwZSA9IHtcbiAgaWQ6IDB4QTcsXG4gIHR5cGU6ICdCSUdWQVJDSFInLFxuICBuYW1lOiAnVmFyQ2hhcicsXG4gIG1heGltdW1MZW5ndGg6IDgwMDAsXG5cbiAgZGVjbGFyYXRpb246IGZ1bmN0aW9uKHBhcmFtZXRlcikge1xuICAgIGNvbnN0IHZhbHVlID0gcGFyYW1ldGVyLnZhbHVlIGFzIEJ1ZmZlciB8IG51bGw7XG5cbiAgICBsZXQgbGVuZ3RoO1xuICAgIGlmIChwYXJhbWV0ZXIubGVuZ3RoKSB7XG4gICAgICBsZW5ndGggPSBwYXJhbWV0ZXIubGVuZ3RoO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgbGVuZ3RoID0gdmFsdWUubGVuZ3RoIHx8IDE7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gbnVsbCAmJiAhcGFyYW1ldGVyLm91dHB1dCkge1xuICAgICAgbGVuZ3RoID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGVuZ3RoID0gdGhpcy5tYXhpbXVtTGVuZ3RoO1xuICAgIH1cblxuICAgIGlmIChsZW5ndGggPD0gdGhpcy5tYXhpbXVtTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gJ3ZhcmNoYXIoJyArIGxlbmd0aCArICcpJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICd2YXJjaGFyKG1heCknO1xuICAgIH1cbiAgfSxcblxuICByZXNvbHZlTGVuZ3RoOiBmdW5jdGlvbihwYXJhbWV0ZXIpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcmFtZXRlci52YWx1ZSBhcyBCdWZmZXIgfCBudWxsO1xuXG4gICAgaWYgKHBhcmFtZXRlci5sZW5ndGggIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHBhcmFtZXRlci5sZW5ndGg7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdmFsdWUubGVuZ3RoIHx8IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLm1heGltdW1MZW5ndGg7XG4gICAgfVxuICB9LFxuXG4gIGdlbmVyYXRlVHlwZUluZm8ocGFyYW1ldGVyKSB7XG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jKDgpO1xuICAgIGJ1ZmZlci53cml0ZVVJbnQ4KHRoaXMuaWQsIDApO1xuXG4gICAgaWYgKHBhcmFtZXRlci5sZW5ndGghIDw9IHRoaXMubWF4aW11bUxlbmd0aCkge1xuICAgICAgYnVmZmVyLndyaXRlVUludDE2TEUocGFyYW1ldGVyLmxlbmd0aCEsIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBidWZmZXIud3JpdGVVSW50MTZMRShNQVgsIDEpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbWV0ZXIuY29sbGF0aW9uKSB7XG4gICAgICBwYXJhbWV0ZXIuY29sbGF0aW9uLnRvQnVmZmVyKCkuY29weShidWZmZXIsIDMsIDAsIDUpO1xuICAgIH1cblxuICAgIHJldHVybiBidWZmZXI7XG4gIH0sXG5cbiAgZ2VuZXJhdGVQYXJhbWV0ZXJMZW5ndGgocGFyYW1ldGVyLCBvcHRpb25zKSB7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJhbWV0ZXIudmFsdWUgYXMgQnVmZmVyIHwgbnVsbDtcblxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICBpZiAocGFyYW1ldGVyLmxlbmd0aCEgPD0gdGhpcy5tYXhpbXVtTGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBOVUxMX0xFTkdUSDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBNQVhfTlVMTF9MRU5HVEg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtZXRlci5sZW5ndGghIDw9IHRoaXMubWF4aW11bUxlbmd0aCkge1xuICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jKDIpO1xuICAgICAgYnVmZmVyLndyaXRlVUludDE2TEUodmFsdWUubGVuZ3RoLCAwKTtcbiAgICAgIHJldHVybiBidWZmZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBVTktOT1dOX1BMUF9MRU47XG4gICAgfVxuICB9LFxuXG4gICpnZW5lcmF0ZVBhcmFtZXRlckRhdGEocGFyYW1ldGVyLCBvcHRpb25zKSB7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJhbWV0ZXIudmFsdWUgYXMgQnVmZmVyIHwgbnVsbDtcblxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtZXRlci5sZW5ndGghIDw9IHRoaXMubWF4aW11bUxlbmd0aCkge1xuICAgICAgeWllbGQgdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgICAgICAgYnVmZmVyLndyaXRlVUludDMyTEUodmFsdWUubGVuZ3RoLCAwKTtcbiAgICAgICAgeWllbGQgYnVmZmVyO1xuXG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgfVxuXG4gICAgICB5aWVsZCBQTFBfVEVSTUlOQVRPUjtcbiAgICB9XG4gIH0sXG5cbiAgdmFsaWRhdGU6IGZ1bmN0aW9uKHZhbHVlLCBjb2xsYXRpb24pOiBCdWZmZXIgfCBudWxsIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgc3RyaW5nLicpO1xuICAgIH1cblxuICAgIGlmICghY29sbGF0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGNvbGxhdGlvbiB3YXMgc2V0IGJ5IHRoZSBzZXJ2ZXIgZm9yIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgaWYgKCFjb2xsYXRpb24uY29kZXBhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGNvbGxhdGlvbiBzZXQgYnkgdGhlIHNlcnZlciBoYXMgbm8gYXNzb2NpYXRlZCBlbmNvZGluZy4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaWNvbnYuZW5jb2RlKHZhbHVlLCBjb2xsYXRpb24uY29kZXBhZ2UpO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBWYXJDaGFyO1xubW9kdWxlLmV4cG9ydHMgPSBWYXJDaGFyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7Ozs7QUFJQSxNQUFNQSxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQU4sSUFBWSxDQUF4QjtBQUNBLE1BQU1DLGVBQWUsR0FBR0MsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxJQUFELEVBQU8sSUFBUCxFQUFhLElBQWIsRUFBbUIsSUFBbkIsRUFBeUIsSUFBekIsRUFBK0IsSUFBL0IsRUFBcUMsSUFBckMsRUFBMkMsSUFBM0MsQ0FBWixDQUF4QjtBQUNBLE1BQU1DLGNBQWMsR0FBR0YsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxJQUFELEVBQU8sSUFBUCxFQUFhLElBQWIsRUFBbUIsSUFBbkIsQ0FBWixDQUF2QjtBQUVBLE1BQU1FLFdBQVcsR0FBR0gsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxJQUFELEVBQU8sSUFBUCxDQUFaLENBQXBCO0FBQ0EsTUFBTUcsZUFBZSxHQUFHSixNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDLElBQUQsRUFBTyxJQUFQLEVBQWEsSUFBYixFQUFtQixJQUFuQixFQUF5QixJQUF6QixFQUErQixJQUEvQixFQUFxQyxJQUFyQyxFQUEyQyxJQUEzQyxDQUFaLENBQXhCO0FBRUEsTUFBTUksT0FBNkMsR0FBRztFQUNwREMsRUFBRSxFQUFFLElBRGdEO0VBRXBEQyxJQUFJLEVBQUUsV0FGOEM7RUFHcERDLElBQUksRUFBRSxTQUg4QztFQUlwREMsYUFBYSxFQUFFLElBSnFDO0VBTXBEQyxXQUFXLEVBQUUsVUFBU0MsU0FBVCxFQUFvQjtJQUMvQixNQUFNQyxLQUFLLEdBQUdELFNBQVMsQ0FBQ0MsS0FBeEI7SUFFQSxJQUFJQyxNQUFKOztJQUNBLElBQUlGLFNBQVMsQ0FBQ0UsTUFBZCxFQUFzQjtNQUNwQkEsTUFBTSxHQUFHRixTQUFTLENBQUNFLE1BQW5CO0lBQ0QsQ0FGRCxNQUVPLElBQUlELEtBQUssSUFBSSxJQUFiLEVBQW1CO01BQ3hCQyxNQUFNLEdBQUdELEtBQUssQ0FBQ0MsTUFBTixJQUFnQixDQUF6QjtJQUNELENBRk0sTUFFQSxJQUFJRCxLQUFLLEtBQUssSUFBVixJQUFrQixDQUFDRCxTQUFTLENBQUNHLE1BQWpDLEVBQXlDO01BQzlDRCxNQUFNLEdBQUcsQ0FBVDtJQUNELENBRk0sTUFFQTtNQUNMQSxNQUFNLEdBQUcsS0FBS0osYUFBZDtJQUNEOztJQUVELElBQUlJLE1BQU0sSUFBSSxLQUFLSixhQUFuQixFQUFrQztNQUNoQyxPQUFPLGFBQWFJLE1BQWIsR0FBc0IsR0FBN0I7SUFDRCxDQUZELE1BRU87TUFDTCxPQUFPLGNBQVA7SUFDRDtFQUNGLENBekJtRDtFQTJCcERFLGFBQWEsRUFBRSxVQUFTSixTQUFULEVBQW9CO0lBQ2pDLE1BQU1DLEtBQUssR0FBR0QsU0FBUyxDQUFDQyxLQUF4Qjs7SUFFQSxJQUFJRCxTQUFTLENBQUNFLE1BQVYsSUFBb0IsSUFBeEIsRUFBOEI7TUFDNUIsT0FBT0YsU0FBUyxDQUFDRSxNQUFqQjtJQUNELENBRkQsTUFFTyxJQUFJRCxLQUFLLElBQUksSUFBYixFQUFtQjtNQUN4QixPQUFPQSxLQUFLLENBQUNDLE1BQU4sSUFBZ0IsQ0FBdkI7SUFDRCxDQUZNLE1BRUE7TUFDTCxPQUFPLEtBQUtKLGFBQVo7SUFDRDtFQUNGLENBckNtRDs7RUF1Q3BETyxnQkFBZ0IsQ0FBQ0wsU0FBRCxFQUFZO0lBQzFCLE1BQU1NLE1BQU0sR0FBR2pCLE1BQU0sQ0FBQ2tCLEtBQVAsQ0FBYSxDQUFiLENBQWY7SUFDQUQsTUFBTSxDQUFDRSxVQUFQLENBQWtCLEtBQUtiLEVBQXZCLEVBQTJCLENBQTNCOztJQUVBLElBQUlLLFNBQVMsQ0FBQ0UsTUFBVixJQUFxQixLQUFLSixhQUE5QixFQUE2QztNQUMzQ1EsTUFBTSxDQUFDRyxhQUFQLENBQXFCVCxTQUFTLENBQUNFLE1BQS9CLEVBQXdDLENBQXhDO0lBQ0QsQ0FGRCxNQUVPO01BQ0xJLE1BQU0sQ0FBQ0csYUFBUCxDQUFxQnRCLEdBQXJCLEVBQTBCLENBQTFCO0lBQ0Q7O0lBRUQsSUFBSWEsU0FBUyxDQUFDVSxTQUFkLEVBQXlCO01BQ3ZCVixTQUFTLENBQUNVLFNBQVYsQ0FBb0JDLFFBQXBCLEdBQStCQyxJQUEvQixDQUFvQ04sTUFBcEMsRUFBNEMsQ0FBNUMsRUFBK0MsQ0FBL0MsRUFBa0QsQ0FBbEQ7SUFDRDs7SUFFRCxPQUFPQSxNQUFQO0VBQ0QsQ0F0RG1EOztFQXdEcERPLHVCQUF1QixDQUFDYixTQUFELEVBQVljLE9BQVosRUFBcUI7SUFDMUMsTUFBTWIsS0FBSyxHQUFHRCxTQUFTLENBQUNDLEtBQXhCOztJQUVBLElBQUlBLEtBQUssSUFBSSxJQUFiLEVBQW1CO01BQ2pCLElBQUlELFNBQVMsQ0FBQ0UsTUFBVixJQUFxQixLQUFLSixhQUE5QixFQUE2QztRQUMzQyxPQUFPTixXQUFQO01BQ0QsQ0FGRCxNQUVPO1FBQ0wsT0FBT0MsZUFBUDtNQUNEO0lBQ0Y7O0lBRUQsSUFBSU8sU0FBUyxDQUFDRSxNQUFWLElBQXFCLEtBQUtKLGFBQTlCLEVBQTZDO01BQzNDLE1BQU1RLE1BQU0sR0FBR2pCLE1BQU0sQ0FBQ2tCLEtBQVAsQ0FBYSxDQUFiLENBQWY7TUFDQUQsTUFBTSxDQUFDRyxhQUFQLENBQXFCUixLQUFLLENBQUNDLE1BQTNCLEVBQW1DLENBQW5DO01BQ0EsT0FBT0ksTUFBUDtJQUNELENBSkQsTUFJTztNQUNMLE9BQU9sQixlQUFQO0lBQ0Q7RUFDRixDQTFFbUQ7O0VBNEVwRCxDQUFDMkIscUJBQUQsQ0FBdUJmLFNBQXZCLEVBQWtDYyxPQUFsQyxFQUEyQztJQUN6QyxNQUFNYixLQUFLLEdBQUdELFNBQVMsQ0FBQ0MsS0FBeEI7O0lBRUEsSUFBSUEsS0FBSyxJQUFJLElBQWIsRUFBbUI7TUFDakI7SUFDRDs7SUFFRCxJQUFJRCxTQUFTLENBQUNFLE1BQVYsSUFBcUIsS0FBS0osYUFBOUIsRUFBNkM7TUFDM0MsTUFBTUcsS0FBTjtJQUNELENBRkQsTUFFTztNQUNMLElBQUlBLEtBQUssQ0FBQ0MsTUFBTixHQUFlLENBQW5CLEVBQXNCO1FBQ3BCLE1BQU1JLE1BQU0sR0FBR2pCLE1BQU0sQ0FBQ2tCLEtBQVAsQ0FBYSxDQUFiLENBQWY7UUFDQUQsTUFBTSxDQUFDVSxhQUFQLENBQXFCZixLQUFLLENBQUNDLE1BQTNCLEVBQW1DLENBQW5DO1FBQ0EsTUFBTUksTUFBTjtRQUVBLE1BQU1MLEtBQU47TUFDRDs7TUFFRCxNQUFNVixjQUFOO0lBQ0Q7RUFDRixDQWhHbUQ7O0VBa0dwRDBCLFFBQVEsRUFBRSxVQUFTaEIsS0FBVCxFQUFnQlMsU0FBaEIsRUFBMEM7SUFDbEQsSUFBSVQsS0FBSyxJQUFJLElBQWIsRUFBbUI7TUFDakIsT0FBTyxJQUFQO0lBQ0Q7O0lBRUQsSUFBSSxPQUFPQSxLQUFQLEtBQWlCLFFBQXJCLEVBQStCO01BQzdCLE1BQU0sSUFBSWlCLFNBQUosQ0FBYyxpQkFBZCxDQUFOO0lBQ0Q7O0lBRUQsSUFBSSxDQUFDUixTQUFMLEVBQWdCO01BQ2QsTUFBTSxJQUFJUyxLQUFKLENBQVUsZ0VBQVYsQ0FBTjtJQUNEOztJQUVELElBQUksQ0FBQ1QsU0FBUyxDQUFDVSxRQUFmLEVBQXlCO01BQ3ZCLE1BQU0sSUFBSUQsS0FBSixDQUFVLDZEQUFWLENBQU47SUFDRDs7SUFFRCxPQUFPRSxtQkFBTUMsTUFBTixDQUFhckIsS0FBYixFQUFvQlMsU0FBUyxDQUFDVSxRQUE5QixDQUFQO0VBQ0Q7QUFwSG1ELENBQXREO2VBdUhlMUIsTzs7QUFDZjZCLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjlCLE9BQWpCIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
const XML = {
  id: 0xF1,
  type: 'XML',
  name: 'Xml',

  declaration() {
    throw new Error('not implemented');
  },

  generateTypeInfo() {
    throw new Error('not implemented');
  },

  generateParameterLength() {
    throw new Error('not implemented');
  },

  generateParameterData() {
    throw new Error('not implemented');
  },

  validate() {
    throw new Error('not implemented');
  }

};
var _default = XML;
exports.default = _default;
module.exports = XML;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJYTUwiLCJpZCIsInR5cGUiLCJuYW1lIiwiZGVjbGFyYXRpb24iLCJFcnJvciIsImdlbmVyYXRlVHlwZUluZm8iLCJnZW5lcmF0ZVBhcmFtZXRlckxlbmd0aCIsImdlbmVyYXRlUGFyYW1ldGVyRGF0YSIsInZhbGlkYXRlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhLXR5cGVzL3htbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4uL2RhdGEtdHlwZSc7XG5cbmNvbnN0IFhNTDogRGF0YVR5cGUgPSB7XG4gIGlkOiAweEYxLFxuICB0eXBlOiAnWE1MJyxcbiAgbmFtZTogJ1htbCcsXG5cbiAgZGVjbGFyYXRpb24oKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgfSxcblxuICBnZW5lcmF0ZVR5cGVJbmZvKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gIH0sXG5cbiAgZ2VuZXJhdGVQYXJhbWV0ZXJMZW5ndGgoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgfSxcblxuICBnZW5lcmF0ZVBhcmFtZXRlckRhdGEoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgfSxcblxuICB2YWxpZGF0ZSgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBYTUw7XG5tb2R1bGUuZXhwb3J0cyA9IFhNTDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUEsTUFBTUEsR0FBYSxHQUFHO0VBQ3BCQyxFQUFFLEVBQUUsSUFEZ0I7RUFFcEJDLElBQUksRUFBRSxLQUZjO0VBR3BCQyxJQUFJLEVBQUUsS0FIYzs7RUFLcEJDLFdBQVcsR0FBRztJQUNaLE1BQU0sSUFBSUMsS0FBSixDQUFVLGlCQUFWLENBQU47RUFDRCxDQVBtQjs7RUFTcEJDLGdCQUFnQixHQUFHO0lBQ2pCLE1BQU0sSUFBSUQsS0FBSixDQUFVLGlCQUFWLENBQU47RUFDRCxDQVhtQjs7RUFhcEJFLHVCQUF1QixHQUFHO0lBQ3hCLE1BQU0sSUFBSUYsS0FBSixDQUFVLGlCQUFWLENBQU47RUFDRCxDQWZtQjs7RUFpQnBCRyxxQkFBcUIsR0FBRztJQUN0QixNQUFNLElBQUlILEtBQUosQ0FBVSxpQkFBVixDQUFOO0VBQ0QsQ0FuQm1COztFQXFCcEJJLFFBQVEsR0FBRztJQUNULE1BQU0sSUFBSUosS0FBSixDQUFVLGlCQUFWLENBQU47RUFDRDs7QUF2Qm1CLENBQXRCO2VBMEJlTCxHOztBQUNmVSxNQUFNLENBQUNDLE9BQVAsR0FBaUJYLEdBQWpCIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.algorithmName = exports.AeadAes256CbcHmac256Algorithm = void 0;

var _types = require("./types");

var _crypto = require("crypto");

var _aeadAes256CbcHmacEncryptionKey = require("./aead-aes-256-cbc-hmac-encryption-key");

// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.
// Copyright (c) 2019 Microsoft Corporation
const algorithmName = 'AEAD_AES_256_CBC_HMAC_SHA256';
exports.algorithmName = algorithmName;
const algorithmVersion = 0x1;
const blockSizeInBytes = 16;

class AeadAes256CbcHmac256Algorithm {
  constructor(columnEncryptionKey, encryptionType) {
    this.columnEncryptionkey = void 0;
    this.isDeterministic = void 0;
    this.keySizeInBytes = void 0;
    this.version = void 0;
    this.versionSize = void 0;
    this.minimumCipherTextLengthInBytesNoAuthenticationTag = void 0;
    this.minimumCipherTextLengthInBytesWithAuthenticationTag = void 0;
    this.keySizeInBytes = _aeadAes256CbcHmacEncryptionKey.keySize / 8;
    this.version = Buffer.from([algorithmVersion]);
    this.versionSize = Buffer.from([1]);
    this.minimumCipherTextLengthInBytesNoAuthenticationTag = 1 + blockSizeInBytes + blockSizeInBytes;
    this.minimumCipherTextLengthInBytesWithAuthenticationTag = this.minimumCipherTextLengthInBytesNoAuthenticationTag + this.keySizeInBytes;
    this.columnEncryptionkey = columnEncryptionKey;
    this.isDeterministic = encryptionType === _types.SQLServerEncryptionType.Deterministic;
  }

  encryptData(plaintText) {
    let iv;

    if (this.isDeterministic === true) {
      const hmacIv = (0, _crypto.createHmac)('sha256', this.columnEncryptionkey.getIvKey());
      hmacIv.update(plaintText);
      iv = hmacIv.digest().slice(0, blockSizeInBytes);
    } else {
      iv = (0, _crypto.randomBytes)(blockSizeInBytes);
    }

    const encryptCipher = (0, _crypto.createCipheriv)('aes-256-cbc', this.columnEncryptionkey.getEncryptionKey(), iv);
    const encryptedBuffer = Buffer.concat([encryptCipher.update(plaintText), encryptCipher.final()]);

    const authenticationTag = this._prepareAuthenticationTag(iv, encryptedBuffer, 0, encryptedBuffer.length);

    return Buffer.concat([Buffer.from([algorithmVersion]), authenticationTag, iv, encryptedBuffer]);
  }

  decryptData(cipherText) {
    const iv = Buffer.alloc(blockSizeInBytes);
    const minimumCiperTextLength = this.minimumCipherTextLengthInBytesWithAuthenticationTag;

    if (cipherText.length < minimumCiperTextLength) {
      throw new Error(`Specified ciphertext has an invalid size of ${cipherText.length} bytes, which is below the minimum ${minimumCiperTextLength} bytes required for decryption.`);
    }

    let startIndex = 0;

    if (cipherText[0] !== algorithmVersion) {
      throw new Error(`The specified ciphertext's encryption algorithm version ${Buffer.from([cipherText[0]]).toString('hex')} does not match the expected encryption algorithm version ${algorithmVersion}.`);
    }

    startIndex += 1;
    let authenticationTagOffset = 0;
    authenticationTagOffset = startIndex;
    startIndex += this.keySizeInBytes;
    cipherText.copy(iv, 0, startIndex, startIndex + iv.length);
    startIndex += iv.length;
    const cipherTextOffset = startIndex;
    const cipherTextCount = cipherText.length - startIndex;

    const authenticationTag = this._prepareAuthenticationTag(iv, cipherText, cipherTextOffset, cipherTextCount);

    if (0 !== authenticationTag.compare(cipherText, authenticationTagOffset, Math.min(authenticationTagOffset + cipherTextCount, authenticationTagOffset + authenticationTag.length), 0, Math.min(cipherTextCount, authenticationTag.length))) {
      throw new Error('Specified ciphertext has an invalid authentication tag.');
    }

    let plainText;
    const decipher = (0, _crypto.createDecipheriv)('aes-256-cbc', this.columnEncryptionkey.getEncryptionKey(), iv);

    try {
      plainText = decipher.update(cipherText.slice(cipherTextOffset, cipherTextOffset + cipherTextCount));
      plainText = Buffer.concat([plainText, decipher.final()]);
    } catch (error) {
      throw new Error(`Internal error while decryption: ${error.message}`);
    }

    return plainText;
  }

  _prepareAuthenticationTag(iv, cipherText, offset, length) {
    const hmac = (0, _crypto.createHmac)('sha256', this.columnEncryptionkey.getMacKey());
    hmac.update(this.version);
    hmac.update(iv);
    hmac.update(cipherText.slice(offset, offset + length));
    hmac.update(this.versionSize);
    return hmac.digest();
  }

}

exports.AeadAes256CbcHmac256Algorithm = AeadAes256CbcHmac256Algorithm;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhbGdvcml0aG1OYW1lIiwiYWxnb3JpdGhtVmVyc2lvbiIsImJsb2NrU2l6ZUluQnl0ZXMiLCJBZWFkQWVzMjU2Q2JjSG1hYzI1NkFsZ29yaXRobSIsImNvbnN0cnVjdG9yIiwiY29sdW1uRW5jcnlwdGlvbktleSIsImVuY3J5cHRpb25UeXBlIiwiY29sdW1uRW5jcnlwdGlvbmtleSIsImlzRGV0ZXJtaW5pc3RpYyIsImtleVNpemVJbkJ5dGVzIiwidmVyc2lvbiIsInZlcnNpb25TaXplIiwibWluaW11bUNpcGhlclRleHRMZW5ndGhJbkJ5dGVzTm9BdXRoZW50aWNhdGlvblRhZyIsIm1pbmltdW1DaXBoZXJUZXh0TGVuZ3RoSW5CeXRlc1dpdGhBdXRoZW50aWNhdGlvblRhZyIsImtleVNpemUiLCJCdWZmZXIiLCJmcm9tIiwiU1FMU2VydmVyRW5jcnlwdGlvblR5cGUiLCJEZXRlcm1pbmlzdGljIiwiZW5jcnlwdERhdGEiLCJwbGFpbnRUZXh0IiwiaXYiLCJobWFjSXYiLCJnZXRJdktleSIsInVwZGF0ZSIsImRpZ2VzdCIsInNsaWNlIiwiZW5jcnlwdENpcGhlciIsImdldEVuY3J5cHRpb25LZXkiLCJlbmNyeXB0ZWRCdWZmZXIiLCJjb25jYXQiLCJmaW5hbCIsImF1dGhlbnRpY2F0aW9uVGFnIiwiX3ByZXBhcmVBdXRoZW50aWNhdGlvblRhZyIsImxlbmd0aCIsImRlY3J5cHREYXRhIiwiY2lwaGVyVGV4dCIsImFsbG9jIiwibWluaW11bUNpcGVyVGV4dExlbmd0aCIsIkVycm9yIiwic3RhcnRJbmRleCIsInRvU3RyaW5nIiwiYXV0aGVudGljYXRpb25UYWdPZmZzZXQiLCJjb3B5IiwiY2lwaGVyVGV4dE9mZnNldCIsImNpcGhlclRleHRDb3VudCIsImNvbXBhcmUiLCJNYXRoIiwibWluIiwicGxhaW5UZXh0IiwiZGVjaXBoZXIiLCJlcnJvciIsIm1lc3NhZ2UiLCJvZmZzZXQiLCJobWFjIiwiZ2V0TWFjS2V5Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Fsd2F5cy1lbmNyeXB0ZWQvYWVhZC1hZXMtMjU2LWNiYy1obWFjLWFsZ29yaXRobS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIGBtc3NxbC1qZGJjYCBsaWJyYXJ5IHB1Ymxpc2hlZCB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiBNSVQgbGljZW5zZS5cbi8vIENvcHlyaWdodCAoYykgMjAxOSBNaWNyb3NvZnQgQ29ycG9yYXRpb25cblxuaW1wb3J0IHsgRW5jcnlwdGlvbkFsZ29yaXRobSwgU1FMU2VydmVyRW5jcnlwdGlvblR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUhtYWMsIHJhbmRvbUJ5dGVzLCBjcmVhdGVDaXBoZXJpdiwgY3JlYXRlRGVjaXBoZXJpdiB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBBZWFkQWVzMjU2Q2JjSG1hYzI1NkVuY3J5cHRpb25LZXksIGtleVNpemUgfSBmcm9tICcuL2FlYWQtYWVzLTI1Ni1jYmMtaG1hYy1lbmNyeXB0aW9uLWtleSc7XG5cbmV4cG9ydCBjb25zdCBhbGdvcml0aG1OYW1lID0gJ0FFQURfQUVTXzI1Nl9DQkNfSE1BQ19TSEEyNTYnO1xuY29uc3QgYWxnb3JpdGhtVmVyc2lvbiA9IDB4MTtcbmNvbnN0IGJsb2NrU2l6ZUluQnl0ZXMgPSAxNjtcblxuZXhwb3J0IGNsYXNzIEFlYWRBZXMyNTZDYmNIbWFjMjU2QWxnb3JpdGhtIGltcGxlbWVudHMgRW5jcnlwdGlvbkFsZ29yaXRobSB7XG4gIHByaXZhdGUgY29sdW1uRW5jcnlwdGlvbmtleTogQWVhZEFlczI1NkNiY0htYWMyNTZFbmNyeXB0aW9uS2V5O1xuICBwcml2YXRlIGlzRGV0ZXJtaW5pc3RpYzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBrZXlTaXplSW5CeXRlczogbnVtYmVyO1xuICBwcml2YXRlIHZlcnNpb246IEJ1ZmZlcjtcbiAgcHJpdmF0ZSB2ZXJzaW9uU2l6ZTogQnVmZmVyO1xuICBwcml2YXRlIG1pbmltdW1DaXBoZXJUZXh0TGVuZ3RoSW5CeXRlc05vQXV0aGVudGljYXRpb25UYWc6IG51bWJlcjtcbiAgcHJpdmF0ZSBtaW5pbXVtQ2lwaGVyVGV4dExlbmd0aEluQnl0ZXNXaXRoQXV0aGVudGljYXRpb25UYWc6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihjb2x1bW5FbmNyeXB0aW9uS2V5OiBBZWFkQWVzMjU2Q2JjSG1hYzI1NkVuY3J5cHRpb25LZXksIGVuY3J5cHRpb25UeXBlOiBTUUxTZXJ2ZXJFbmNyeXB0aW9uVHlwZSkge1xuICAgIHRoaXMua2V5U2l6ZUluQnl0ZXMgPSBrZXlTaXplIC8gODtcbiAgICB0aGlzLnZlcnNpb24gPSBCdWZmZXIuZnJvbShbYWxnb3JpdGhtVmVyc2lvbl0pO1xuICAgIHRoaXMudmVyc2lvblNpemUgPSBCdWZmZXIuZnJvbShbMV0pO1xuICAgIHRoaXMubWluaW11bUNpcGhlclRleHRMZW5ndGhJbkJ5dGVzTm9BdXRoZW50aWNhdGlvblRhZyA9IDEgKyBibG9ja1NpemVJbkJ5dGVzICsgYmxvY2tTaXplSW5CeXRlcztcbiAgICB0aGlzLm1pbmltdW1DaXBoZXJUZXh0TGVuZ3RoSW5CeXRlc1dpdGhBdXRoZW50aWNhdGlvblRhZyA9IHRoaXMubWluaW11bUNpcGhlclRleHRMZW5ndGhJbkJ5dGVzTm9BdXRoZW50aWNhdGlvblRhZyArIHRoaXMua2V5U2l6ZUluQnl0ZXM7XG4gICAgdGhpcy5jb2x1bW5FbmNyeXB0aW9ua2V5ID0gY29sdW1uRW5jcnlwdGlvbktleTtcblxuICAgIHRoaXMuaXNEZXRlcm1pbmlzdGljID0gZW5jcnlwdGlvblR5cGUgPT09IFNRTFNlcnZlckVuY3J5cHRpb25UeXBlLkRldGVybWluaXN0aWM7XG4gIH1cblxuICBlbmNyeXB0RGF0YShwbGFpbnRUZXh0OiBCdWZmZXIpOiBCdWZmZXIge1xuICAgIGxldCBpdjogQnVmZmVyO1xuXG4gICAgaWYgKHRoaXMuaXNEZXRlcm1pbmlzdGljID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBobWFjSXYgPSBjcmVhdGVIbWFjKCdzaGEyNTYnLCB0aGlzLmNvbHVtbkVuY3J5cHRpb25rZXkuZ2V0SXZLZXkoKSk7XG4gICAgICBobWFjSXYudXBkYXRlKHBsYWludFRleHQpO1xuICAgICAgaXYgPSBobWFjSXYuZGlnZXN0KCkuc2xpY2UoMCwgYmxvY2tTaXplSW5CeXRlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGl2ID0gcmFuZG9tQnl0ZXMoYmxvY2tTaXplSW5CeXRlcyk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5jcnlwdENpcGhlciA9IGNyZWF0ZUNpcGhlcml2KCdhZXMtMjU2LWNiYycsIHRoaXMuY29sdW1uRW5jcnlwdGlvbmtleS5nZXRFbmNyeXB0aW9uS2V5KCksIGl2KTtcblxuICAgIGNvbnN0IGVuY3J5cHRlZEJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW2VuY3J5cHRDaXBoZXIudXBkYXRlKHBsYWludFRleHQpLCBlbmNyeXB0Q2lwaGVyLmZpbmFsKCldKTtcblxuICAgIGNvbnN0IGF1dGhlbnRpY2F0aW9uVGFnOiBCdWZmZXIgPSB0aGlzLl9wcmVwYXJlQXV0aGVudGljYXRpb25UYWcoaXYsIGVuY3J5cHRlZEJ1ZmZlciwgMCwgZW5jcnlwdGVkQnVmZmVyLmxlbmd0aCk7XG5cbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChbQnVmZmVyLmZyb20oW2FsZ29yaXRobVZlcnNpb25dKSwgYXV0aGVudGljYXRpb25UYWcsIGl2LCBlbmNyeXB0ZWRCdWZmZXJdKTtcbiAgfVxuXG4gIGRlY3J5cHREYXRhKGNpcGhlclRleHQ6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gICAgY29uc3QgaXY6IEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhibG9ja1NpemVJbkJ5dGVzKTtcblxuICAgIGNvbnN0IG1pbmltdW1DaXBlclRleHRMZW5ndGg6IG51bWJlciA9IHRoaXMubWluaW11bUNpcGhlclRleHRMZW5ndGhJbkJ5dGVzV2l0aEF1dGhlbnRpY2F0aW9uVGFnO1xuXG4gICAgaWYgKGNpcGhlclRleHQubGVuZ3RoIDwgbWluaW11bUNpcGVyVGV4dExlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTcGVjaWZpZWQgY2lwaGVydGV4dCBoYXMgYW4gaW52YWxpZCBzaXplIG9mICR7Y2lwaGVyVGV4dC5sZW5ndGh9IGJ5dGVzLCB3aGljaCBpcyBiZWxvdyB0aGUgbWluaW11bSAke21pbmltdW1DaXBlclRleHRMZW5ndGh9IGJ5dGVzIHJlcXVpcmVkIGZvciBkZWNyeXB0aW9uLmApO1xuICAgIH1cblxuICAgIGxldCBzdGFydEluZGV4ID0gMDtcbiAgICBpZiAoY2lwaGVyVGV4dFswXSAhPT0gYWxnb3JpdGhtVmVyc2lvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgc3BlY2lmaWVkIGNpcGhlcnRleHQncyBlbmNyeXB0aW9uIGFsZ29yaXRobSB2ZXJzaW9uICR7QnVmZmVyLmZyb20oW2NpcGhlclRleHRbMF1dKS50b1N0cmluZygnaGV4Jyl9IGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZCBlbmNyeXB0aW9uIGFsZ29yaXRobSB2ZXJzaW9uICR7YWxnb3JpdGhtVmVyc2lvbn0uYCk7XG4gICAgfVxuXG4gICAgc3RhcnRJbmRleCArPSAxO1xuICAgIGxldCBhdXRoZW50aWNhdGlvblRhZ09mZnNldCA9IDA7XG5cbiAgICBhdXRoZW50aWNhdGlvblRhZ09mZnNldCA9IHN0YXJ0SW5kZXg7XG4gICAgc3RhcnRJbmRleCArPSB0aGlzLmtleVNpemVJbkJ5dGVzO1xuXG4gICAgY2lwaGVyVGV4dC5jb3B5KGl2LCAwLCBzdGFydEluZGV4LCBzdGFydEluZGV4ICsgaXYubGVuZ3RoKTtcbiAgICBzdGFydEluZGV4ICs9IGl2Lmxlbmd0aDtcblxuICAgIGNvbnN0IGNpcGhlclRleHRPZmZzZXQgPSBzdGFydEluZGV4O1xuICAgIGNvbnN0IGNpcGhlclRleHRDb3VudCA9IGNpcGhlclRleHQubGVuZ3RoIC0gc3RhcnRJbmRleDtcblxuICAgIGNvbnN0IGF1dGhlbnRpY2F0aW9uVGFnOiBCdWZmZXIgPSB0aGlzLl9wcmVwYXJlQXV0aGVudGljYXRpb25UYWcoaXYsIGNpcGhlclRleHQsIGNpcGhlclRleHRPZmZzZXQsIGNpcGhlclRleHRDb3VudCk7XG5cbiAgICBpZiAoMCAhPT0gYXV0aGVudGljYXRpb25UYWcuY29tcGFyZShjaXBoZXJUZXh0LCBhdXRoZW50aWNhdGlvblRhZ09mZnNldCwgTWF0aC5taW4oYXV0aGVudGljYXRpb25UYWdPZmZzZXQgKyBjaXBoZXJUZXh0Q291bnQsIGF1dGhlbnRpY2F0aW9uVGFnT2Zmc2V0ICsgYXV0aGVudGljYXRpb25UYWcubGVuZ3RoKSwgMCwgTWF0aC5taW4oY2lwaGVyVGV4dENvdW50LCBhdXRoZW50aWNhdGlvblRhZy5sZW5ndGgpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTcGVjaWZpZWQgY2lwaGVydGV4dCBoYXMgYW4gaW52YWxpZCBhdXRoZW50aWNhdGlvbiB0YWcuJyk7XG4gICAgfVxuXG4gICAgbGV0IHBsYWluVGV4dDogQnVmZmVyO1xuXG4gICAgY29uc3QgZGVjaXBoZXIgPSBjcmVhdGVEZWNpcGhlcml2KCdhZXMtMjU2LWNiYycsIHRoaXMuY29sdW1uRW5jcnlwdGlvbmtleS5nZXRFbmNyeXB0aW9uS2V5KCksIGl2KTtcbiAgICB0cnkge1xuICAgICAgcGxhaW5UZXh0ID0gZGVjaXBoZXIudXBkYXRlKGNpcGhlclRleHQuc2xpY2UoY2lwaGVyVGV4dE9mZnNldCwgY2lwaGVyVGV4dE9mZnNldCArIGNpcGhlclRleHRDb3VudCkpO1xuICAgICAgcGxhaW5UZXh0ID0gQnVmZmVyLmNvbmNhdChbcGxhaW5UZXh0LCBkZWNpcGhlci5maW5hbCgpXSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCBlcnJvciB3aGlsZSBkZWNyeXB0aW9uOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBsYWluVGV4dDtcbiAgfVxuXG4gIF9wcmVwYXJlQXV0aGVudGljYXRpb25UYWcoaXY6IEJ1ZmZlciwgY2lwaGVyVGV4dDogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIpOiBCdWZmZXIge1xuICAgIGNvbnN0IGhtYWMgPSBjcmVhdGVIbWFjKCdzaGEyNTYnLCB0aGlzLmNvbHVtbkVuY3J5cHRpb25rZXkuZ2V0TWFjS2V5KCkpO1xuXG4gICAgaG1hYy51cGRhdGUodGhpcy52ZXJzaW9uKTtcbiAgICBobWFjLnVwZGF0ZShpdik7XG4gICAgaG1hYy51cGRhdGUoY2lwaGVyVGV4dC5zbGljZShvZmZzZXQsIG9mZnNldCArIGxlbmd0aCkpO1xuICAgIGhtYWMudXBkYXRlKHRoaXMudmVyc2lvblNpemUpO1xuICAgIHJldHVybiBobWFjLmRpZ2VzdCgpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFHQTs7QUFDQTs7QUFDQTs7QUFMQTtBQUNBO0FBTU8sTUFBTUEsYUFBYSxHQUFHLDhCQUF0Qjs7QUFDUCxNQUFNQyxnQkFBZ0IsR0FBRyxHQUF6QjtBQUNBLE1BQU1DLGdCQUFnQixHQUFHLEVBQXpCOztBQUVPLE1BQU1DLDZCQUFOLENBQW1FO0VBU3hFQyxXQUFXLENBQUNDLG1CQUFELEVBQXlEQyxjQUF6RCxFQUFrRztJQUFBLEtBUnJHQyxtQkFRcUc7SUFBQSxLQVByR0MsZUFPcUc7SUFBQSxLQU5yR0MsY0FNcUc7SUFBQSxLQUxyR0MsT0FLcUc7SUFBQSxLQUpyR0MsV0FJcUc7SUFBQSxLQUhyR0MsaURBR3FHO0lBQUEsS0FGckdDLG1EQUVxRztJQUMzRyxLQUFLSixjQUFMLEdBQXNCSywwQ0FBVSxDQUFoQztJQUNBLEtBQUtKLE9BQUwsR0FBZUssTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQ2YsZ0JBQUQsQ0FBWixDQUFmO0lBQ0EsS0FBS1UsV0FBTCxHQUFtQkksTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxDQUFELENBQVosQ0FBbkI7SUFDQSxLQUFLSixpREFBTCxHQUF5RCxJQUFJVixnQkFBSixHQUF1QkEsZ0JBQWhGO0lBQ0EsS0FBS1csbURBQUwsR0FBMkQsS0FBS0QsaURBQUwsR0FBeUQsS0FBS0gsY0FBekg7SUFDQSxLQUFLRixtQkFBTCxHQUEyQkYsbUJBQTNCO0lBRUEsS0FBS0csZUFBTCxHQUF1QkYsY0FBYyxLQUFLVywrQkFBd0JDLGFBQWxFO0VBQ0Q7O0VBRURDLFdBQVcsQ0FBQ0MsVUFBRCxFQUE2QjtJQUN0QyxJQUFJQyxFQUFKOztJQUVBLElBQUksS0FBS2IsZUFBTCxLQUF5QixJQUE3QixFQUFtQztNQUNqQyxNQUFNYyxNQUFNLEdBQUcsd0JBQVcsUUFBWCxFQUFxQixLQUFLZixtQkFBTCxDQUF5QmdCLFFBQXpCLEVBQXJCLENBQWY7TUFDQUQsTUFBTSxDQUFDRSxNQUFQLENBQWNKLFVBQWQ7TUFDQUMsRUFBRSxHQUFHQyxNQUFNLENBQUNHLE1BQVAsR0FBZ0JDLEtBQWhCLENBQXNCLENBQXRCLEVBQXlCeEIsZ0JBQXpCLENBQUw7SUFDRCxDQUpELE1BSU87TUFDTG1CLEVBQUUsR0FBRyx5QkFBWW5CLGdCQUFaLENBQUw7SUFDRDs7SUFFRCxNQUFNeUIsYUFBYSxHQUFHLDRCQUFlLGFBQWYsRUFBOEIsS0FBS3BCLG1CQUFMLENBQXlCcUIsZ0JBQXpCLEVBQTlCLEVBQTJFUCxFQUEzRSxDQUF0QjtJQUVBLE1BQU1RLGVBQWUsR0FBR2QsTUFBTSxDQUFDZSxNQUFQLENBQWMsQ0FBQ0gsYUFBYSxDQUFDSCxNQUFkLENBQXFCSixVQUFyQixDQUFELEVBQW1DTyxhQUFhLENBQUNJLEtBQWQsRUFBbkMsQ0FBZCxDQUF4Qjs7SUFFQSxNQUFNQyxpQkFBeUIsR0FBRyxLQUFLQyx5QkFBTCxDQUErQlosRUFBL0IsRUFBbUNRLGVBQW5DLEVBQW9ELENBQXBELEVBQXVEQSxlQUFlLENBQUNLLE1BQXZFLENBQWxDOztJQUVBLE9BQU9uQixNQUFNLENBQUNlLE1BQVAsQ0FBYyxDQUFDZixNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDZixnQkFBRCxDQUFaLENBQUQsRUFBa0MrQixpQkFBbEMsRUFBcURYLEVBQXJELEVBQXlEUSxlQUF6RCxDQUFkLENBQVA7RUFDRDs7RUFFRE0sV0FBVyxDQUFDQyxVQUFELEVBQTZCO0lBQ3RDLE1BQU1mLEVBQVUsR0FBR04sTUFBTSxDQUFDc0IsS0FBUCxDQUFhbkMsZ0JBQWIsQ0FBbkI7SUFFQSxNQUFNb0Msc0JBQThCLEdBQUcsS0FBS3pCLG1EQUE1Qzs7SUFFQSxJQUFJdUIsVUFBVSxDQUFDRixNQUFYLEdBQW9CSSxzQkFBeEIsRUFBZ0Q7TUFDOUMsTUFBTSxJQUFJQyxLQUFKLENBQVcsK0NBQThDSCxVQUFVLENBQUNGLE1BQU8sc0NBQXFDSSxzQkFBdUIsaUNBQXZJLENBQU47SUFDRDs7SUFFRCxJQUFJRSxVQUFVLEdBQUcsQ0FBakI7O0lBQ0EsSUFBSUosVUFBVSxDQUFDLENBQUQsQ0FBVixLQUFrQm5DLGdCQUF0QixFQUF3QztNQUN0QyxNQUFNLElBQUlzQyxLQUFKLENBQVcsMkRBQTBEeEIsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQ29CLFVBQVUsQ0FBQyxDQUFELENBQVgsQ0FBWixFQUE2QkssUUFBN0IsQ0FBc0MsS0FBdEMsQ0FBNkMsNkRBQTREeEMsZ0JBQWlCLEdBQS9MLENBQU47SUFDRDs7SUFFRHVDLFVBQVUsSUFBSSxDQUFkO0lBQ0EsSUFBSUUsdUJBQXVCLEdBQUcsQ0FBOUI7SUFFQUEsdUJBQXVCLEdBQUdGLFVBQTFCO0lBQ0FBLFVBQVUsSUFBSSxLQUFLL0IsY0FBbkI7SUFFQTJCLFVBQVUsQ0FBQ08sSUFBWCxDQUFnQnRCLEVBQWhCLEVBQW9CLENBQXBCLEVBQXVCbUIsVUFBdkIsRUFBbUNBLFVBQVUsR0FBR25CLEVBQUUsQ0FBQ2EsTUFBbkQ7SUFDQU0sVUFBVSxJQUFJbkIsRUFBRSxDQUFDYSxNQUFqQjtJQUVBLE1BQU1VLGdCQUFnQixHQUFHSixVQUF6QjtJQUNBLE1BQU1LLGVBQWUsR0FBR1QsVUFBVSxDQUFDRixNQUFYLEdBQW9CTSxVQUE1Qzs7SUFFQSxNQUFNUixpQkFBeUIsR0FBRyxLQUFLQyx5QkFBTCxDQUErQlosRUFBL0IsRUFBbUNlLFVBQW5DLEVBQStDUSxnQkFBL0MsRUFBaUVDLGVBQWpFLENBQWxDOztJQUVBLElBQUksTUFBTWIsaUJBQWlCLENBQUNjLE9BQWxCLENBQTBCVixVQUExQixFQUFzQ00sdUJBQXRDLEVBQStESyxJQUFJLENBQUNDLEdBQUwsQ0FBU04sdUJBQXVCLEdBQUdHLGVBQW5DLEVBQW9ESCx1QkFBdUIsR0FBR1YsaUJBQWlCLENBQUNFLE1BQWhHLENBQS9ELEVBQXdLLENBQXhLLEVBQTJLYSxJQUFJLENBQUNDLEdBQUwsQ0FBU0gsZUFBVCxFQUEwQmIsaUJBQWlCLENBQUNFLE1BQTVDLENBQTNLLENBQVYsRUFBMk87TUFDek8sTUFBTSxJQUFJSyxLQUFKLENBQVUseURBQVYsQ0FBTjtJQUNEOztJQUVELElBQUlVLFNBQUo7SUFFQSxNQUFNQyxRQUFRLEdBQUcsOEJBQWlCLGFBQWpCLEVBQWdDLEtBQUszQyxtQkFBTCxDQUF5QnFCLGdCQUF6QixFQUFoQyxFQUE2RVAsRUFBN0UsQ0FBakI7O0lBQ0EsSUFBSTtNQUNGNEIsU0FBUyxHQUFHQyxRQUFRLENBQUMxQixNQUFULENBQWdCWSxVQUFVLENBQUNWLEtBQVgsQ0FBaUJrQixnQkFBakIsRUFBbUNBLGdCQUFnQixHQUFHQyxlQUF0RCxDQUFoQixDQUFaO01BQ0FJLFNBQVMsR0FBR2xDLE1BQU0sQ0FBQ2UsTUFBUCxDQUFjLENBQUNtQixTQUFELEVBQVlDLFFBQVEsQ0FBQ25CLEtBQVQsRUFBWixDQUFkLENBQVo7SUFDRCxDQUhELENBR0UsT0FBT29CLEtBQVAsRUFBbUI7TUFDbkIsTUFBTSxJQUFJWixLQUFKLENBQVcsb0NBQW1DWSxLQUFLLENBQUNDLE9BQVEsRUFBNUQsQ0FBTjtJQUNEOztJQUVELE9BQU9ILFNBQVA7RUFDRDs7RUFFRGhCLHlCQUF5QixDQUFDWixFQUFELEVBQWFlLFVBQWIsRUFBaUNpQixNQUFqQyxFQUFpRG5CLE1BQWpELEVBQXlFO0lBQ2hHLE1BQU1vQixJQUFJLEdBQUcsd0JBQVcsUUFBWCxFQUFxQixLQUFLL0MsbUJBQUwsQ0FBeUJnRCxTQUF6QixFQUFyQixDQUFiO0lBRUFELElBQUksQ0FBQzlCLE1BQUwsQ0FBWSxLQUFLZCxPQUFqQjtJQUNBNEMsSUFBSSxDQUFDOUIsTUFBTCxDQUFZSCxFQUFaO0lBQ0FpQyxJQUFJLENBQUM5QixNQUFMLENBQVlZLFVBQVUsQ0FBQ1YsS0FBWCxDQUFpQjJCLE1BQWpCLEVBQXlCQSxNQUFNLEdBQUduQixNQUFsQyxDQUFaO0lBQ0FvQixJQUFJLENBQUM5QixNQUFMLENBQVksS0FBS2IsV0FBakI7SUFDQSxPQUFPMkMsSUFBSSxDQUFDN0IsTUFBTCxFQUFQO0VBQ0Q7O0FBN0Z1RSJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.keySize = exports.generateKeySalt = exports.deriveKey = exports.AeadAes256CbcHmac256EncryptionKey = void 0;

var _crypto = require("crypto");

var _symmetricKey = _interopRequireDefault(require("./symmetric-key"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.
// Copyright (c) 2019 Microsoft Corporation
const keySize = 256;
exports.keySize = keySize;
const keySizeInBytes = keySize / 8;

const deriveKey = (rootKey, salt) => {
  const hmac = (0, _crypto.createHmac)('sha256', rootKey);
  hmac.update(Buffer.from(salt, 'utf16le'));
  return hmac.digest();
};

exports.deriveKey = deriveKey;

const generateKeySalt = (keyType, algorithmName, keySize) => `Microsoft SQL Server cell ${keyType} key ` + `with encryption algorithm:${algorithmName} and key length:${keySize}`;

exports.generateKeySalt = generateKeySalt;

class AeadAes256CbcHmac256EncryptionKey extends _symmetricKey.default {
  constructor(rootKey, algorithmName) {
    super(rootKey);
    this.algorithmName = void 0;
    this.encryptionKeySaltFormat = void 0;
    this.macKeySaltFormat = void 0;
    this.ivKeySaltFormat = void 0;
    this.encryptionKey = void 0;
    this.macKey = void 0;
    this.ivKey = void 0;
    this.algorithmName = algorithmName;
    this.encryptionKeySaltFormat = generateKeySalt('encryption', this.algorithmName, keySize);
    this.macKeySaltFormat = generateKeySalt('MAC', this.algorithmName, keySize);
    this.ivKeySaltFormat = generateKeySalt('IV', this.algorithmName, keySize);

    if (rootKey.length !== keySizeInBytes) {
      throw new Error(`The column encryption key has been successfully decrypted but it's length: ${rootKey.length} does not match the length: ${keySizeInBytes} for algorithm "${this.algorithmName}". Verify the encrypted value of the column encryption key in the database.`);
    }

    try {
      const encKeyBuff = deriveKey(rootKey, this.encryptionKeySaltFormat);
      this.encryptionKey = new _symmetricKey.default(encKeyBuff);
      const macKeyBuff = deriveKey(rootKey, this.macKeySaltFormat);
      this.macKey = new _symmetricKey.default(macKeyBuff);
      const ivKeyBuff = deriveKey(rootKey, this.ivKeySaltFormat);
      this.ivKey = new _symmetricKey.default(ivKeyBuff);
    } catch (error) {
      throw new Error(`Key extraction failed : ${error.message}.`);
    }
  }

  getEncryptionKey() {
    return this.encryptionKey.rootKey;
  }

  getMacKey() {
    return this.macKey.rootKey;
  }

  getIvKey() {
    return this.ivKey.rootKey;
  }

}

exports.AeadAes256CbcHmac256EncryptionKey = AeadAes256CbcHmac256EncryptionKey;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJrZXlTaXplIiwia2V5U2l6ZUluQnl0ZXMiLCJkZXJpdmVLZXkiLCJyb290S2V5Iiwic2FsdCIsImhtYWMiLCJ1cGRhdGUiLCJCdWZmZXIiLCJmcm9tIiwiZGlnZXN0IiwiZ2VuZXJhdGVLZXlTYWx0Iiwia2V5VHlwZSIsImFsZ29yaXRobU5hbWUiLCJBZWFkQWVzMjU2Q2JjSG1hYzI1NkVuY3J5cHRpb25LZXkiLCJTeW1tZXRyaWNLZXkiLCJjb25zdHJ1Y3RvciIsImVuY3J5cHRpb25LZXlTYWx0Rm9ybWF0IiwibWFjS2V5U2FsdEZvcm1hdCIsIml2S2V5U2FsdEZvcm1hdCIsImVuY3J5cHRpb25LZXkiLCJtYWNLZXkiLCJpdktleSIsImxlbmd0aCIsIkVycm9yIiwiZW5jS2V5QnVmZiIsIm1hY0tleUJ1ZmYiLCJpdktleUJ1ZmYiLCJlcnJvciIsIm1lc3NhZ2UiLCJnZXRFbmNyeXB0aW9uS2V5IiwiZ2V0TWFjS2V5IiwiZ2V0SXZLZXkiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYWx3YXlzLWVuY3J5cHRlZC9hZWFkLWFlcy0yNTYtY2JjLWhtYWMtZW5jcnlwdGlvbi1rZXkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBgbXNzcWwtamRiY2AgbGlicmFyeSBwdWJsaXNoZWQgdW5kZXIgdGhlIGNvbmRpdGlvbnMgb2YgTUlUIGxpY2Vuc2UuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTkgTWljcm9zb2Z0IENvcnBvcmF0aW9uXG5cbmltcG9ydCB7IGNyZWF0ZUhtYWMgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IFN5bW1ldHJpY0tleSBmcm9tICcuL3N5bW1ldHJpYy1rZXknO1xuXG5leHBvcnQgY29uc3Qga2V5U2l6ZSA9IDI1NjtcbmNvbnN0IGtleVNpemVJbkJ5dGVzID0ga2V5U2l6ZSAvIDg7XG5cbmV4cG9ydCBjb25zdCBkZXJpdmVLZXkgPSAocm9vdEtleTogQnVmZmVyLCBzYWx0OiBzdHJpbmcpOiBCdWZmZXIgPT4ge1xuICBjb25zdCBobWFjID0gY3JlYXRlSG1hYygnc2hhMjU2Jywgcm9vdEtleSk7XG4gIGhtYWMudXBkYXRlKEJ1ZmZlci5mcm9tKHNhbHQsICd1dGYxNmxlJykpO1xuICByZXR1cm4gaG1hYy5kaWdlc3QoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUtleVNhbHQgPSAoXG4gIGtleVR5cGU6ICdlbmNyeXB0aW9uJyB8ICdNQUMnIHwgJ0lWJyxcbiAgYWxnb3JpdGhtTmFtZTogc3RyaW5nLFxuICBrZXlTaXplOiBudW1iZXIsXG4pOiBzdHJpbmcgPT5cbiAgYE1pY3Jvc29mdCBTUUwgU2VydmVyIGNlbGwgJHtrZXlUeXBlfSBrZXkgYCArXG4gIGB3aXRoIGVuY3J5cHRpb24gYWxnb3JpdGhtOiR7YWxnb3JpdGhtTmFtZX0gYW5kIGtleSBsZW5ndGg6JHtrZXlTaXplfWA7XG5cbmV4cG9ydCBjbGFzcyBBZWFkQWVzMjU2Q2JjSG1hYzI1NkVuY3J5cHRpb25LZXkgZXh0ZW5kcyBTeW1tZXRyaWNLZXkge1xuICBwcml2YXRlIHJlYWRvbmx5IGFsZ29yaXRobU5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBlbmNyeXB0aW9uS2V5U2FsdEZvcm1hdDogc3RyaW5nO1xuICBwcml2YXRlIG1hY0tleVNhbHRGb3JtYXQ6IHN0cmluZztcbiAgcHJpdmF0ZSBpdktleVNhbHRGb3JtYXQ6IHN0cmluZztcbiAgcHJpdmF0ZSBlbmNyeXB0aW9uS2V5OiBTeW1tZXRyaWNLZXk7XG4gIHByaXZhdGUgbWFjS2V5OiBTeW1tZXRyaWNLZXk7XG4gIHByaXZhdGUgaXZLZXk6IFN5bW1ldHJpY0tleTtcblxuICBjb25zdHJ1Y3Rvcihyb290S2V5OiBCdWZmZXIsIGFsZ29yaXRobU5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKHJvb3RLZXkpO1xuICAgIHRoaXMuYWxnb3JpdGhtTmFtZSA9IGFsZ29yaXRobU5hbWU7XG4gICAgdGhpcy5lbmNyeXB0aW9uS2V5U2FsdEZvcm1hdCA9IGdlbmVyYXRlS2V5U2FsdCgnZW5jcnlwdGlvbicsIHRoaXMuYWxnb3JpdGhtTmFtZSwga2V5U2l6ZSk7XG4gICAgdGhpcy5tYWNLZXlTYWx0Rm9ybWF0ID0gZ2VuZXJhdGVLZXlTYWx0KCdNQUMnLCB0aGlzLmFsZ29yaXRobU5hbWUsIGtleVNpemUpO1xuICAgIHRoaXMuaXZLZXlTYWx0Rm9ybWF0ID0gZ2VuZXJhdGVLZXlTYWx0KCdJVicsIHRoaXMuYWxnb3JpdGhtTmFtZSwga2V5U2l6ZSk7XG5cbiAgICBpZiAocm9vdEtleS5sZW5ndGggIT09IGtleVNpemVJbkJ5dGVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBjb2x1bW4gZW5jcnlwdGlvbiBrZXkgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGRlY3J5cHRlZCBidXQgaXQncyBsZW5ndGg6ICR7cm9vdEtleS5sZW5ndGh9IGRvZXMgbm90IG1hdGNoIHRoZSBsZW5ndGg6ICR7a2V5U2l6ZUluQnl0ZXN9IGZvciBhbGdvcml0aG0gXCIke3RoaXMuYWxnb3JpdGhtTmFtZX1cIi4gVmVyaWZ5IHRoZSBlbmNyeXB0ZWQgdmFsdWUgb2YgdGhlIGNvbHVtbiBlbmNyeXB0aW9uIGtleSBpbiB0aGUgZGF0YWJhc2UuYCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVuY0tleUJ1ZmYgPSBkZXJpdmVLZXkocm9vdEtleSwgdGhpcy5lbmNyeXB0aW9uS2V5U2FsdEZvcm1hdCk7XG5cbiAgICAgIHRoaXMuZW5jcnlwdGlvbktleSA9IG5ldyBTeW1tZXRyaWNLZXkoZW5jS2V5QnVmZik7XG5cbiAgICAgIGNvbnN0IG1hY0tleUJ1ZmYgPSBkZXJpdmVLZXkocm9vdEtleSwgdGhpcy5tYWNLZXlTYWx0Rm9ybWF0KTtcblxuICAgICAgdGhpcy5tYWNLZXkgPSBuZXcgU3ltbWV0cmljS2V5KG1hY0tleUJ1ZmYpO1xuXG4gICAgICBjb25zdCBpdktleUJ1ZmYgPSBkZXJpdmVLZXkocm9vdEtleSwgdGhpcy5pdktleVNhbHRGb3JtYXQpO1xuXG4gICAgICB0aGlzLml2S2V5ID0gbmV3IFN5bW1ldHJpY0tleShpdktleUJ1ZmYpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgS2V5IGV4dHJhY3Rpb24gZmFpbGVkIDogJHtlcnJvci5tZXNzYWdlfS5gKTtcbiAgICB9XG4gIH1cblxuICBnZXRFbmNyeXB0aW9uS2V5KCk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIHRoaXMuZW5jcnlwdGlvbktleS5yb290S2V5O1xuICB9XG5cbiAgZ2V0TWFjS2V5KCk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIHRoaXMubWFjS2V5LnJvb3RLZXk7XG4gIH1cblxuICBnZXRJdktleSgpOiBCdWZmZXIge1xuICAgIHJldHVybiB0aGlzLml2S2V5LnJvb3RLZXk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUdBOztBQUNBOzs7O0FBSkE7QUFDQTtBQUtPLE1BQU1BLE9BQU8sR0FBRyxHQUFoQjs7QUFDUCxNQUFNQyxjQUFjLEdBQUdELE9BQU8sR0FBRyxDQUFqQzs7QUFFTyxNQUFNRSxTQUFTLEdBQUcsQ0FBQ0MsT0FBRCxFQUFrQkMsSUFBbEIsS0FBMkM7RUFDbEUsTUFBTUMsSUFBSSxHQUFHLHdCQUFXLFFBQVgsRUFBcUJGLE9BQXJCLENBQWI7RUFDQUUsSUFBSSxDQUFDQyxNQUFMLENBQVlDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZSixJQUFaLEVBQWtCLFNBQWxCLENBQVo7RUFDQSxPQUFPQyxJQUFJLENBQUNJLE1BQUwsRUFBUDtBQUNELENBSk07Ozs7QUFNQSxNQUFNQyxlQUFlLEdBQUcsQ0FDN0JDLE9BRDZCLEVBRTdCQyxhQUY2QixFQUc3QlosT0FINkIsS0FLNUIsNkJBQTRCVyxPQUFRLE9BQXJDLEdBQ0MsNkJBQTRCQyxhQUFjLG1CQUFrQlosT0FBUSxFQU5oRTs7OztBQVFBLE1BQU1hLGlDQUFOLFNBQWdEQyxxQkFBaEQsQ0FBNkQ7RUFTbEVDLFdBQVcsQ0FBQ1osT0FBRCxFQUFrQlMsYUFBbEIsRUFBeUM7SUFDbEQsTUFBTVQsT0FBTjtJQURrRCxLQVJuQ1MsYUFRbUM7SUFBQSxLQVA1Q0ksdUJBTzRDO0lBQUEsS0FONUNDLGdCQU00QztJQUFBLEtBTDVDQyxlQUs0QztJQUFBLEtBSjVDQyxhQUk0QztJQUFBLEtBSDVDQyxNQUc0QztJQUFBLEtBRjVDQyxLQUU0QztJQUVsRCxLQUFLVCxhQUFMLEdBQXFCQSxhQUFyQjtJQUNBLEtBQUtJLHVCQUFMLEdBQStCTixlQUFlLENBQUMsWUFBRCxFQUFlLEtBQUtFLGFBQXBCLEVBQW1DWixPQUFuQyxDQUE5QztJQUNBLEtBQUtpQixnQkFBTCxHQUF3QlAsZUFBZSxDQUFDLEtBQUQsRUFBUSxLQUFLRSxhQUFiLEVBQTRCWixPQUE1QixDQUF2QztJQUNBLEtBQUtrQixlQUFMLEdBQXVCUixlQUFlLENBQUMsSUFBRCxFQUFPLEtBQUtFLGFBQVosRUFBMkJaLE9BQTNCLENBQXRDOztJQUVBLElBQUlHLE9BQU8sQ0FBQ21CLE1BQVIsS0FBbUJyQixjQUF2QixFQUF1QztNQUNyQyxNQUFNLElBQUlzQixLQUFKLENBQVcsOEVBQTZFcEIsT0FBTyxDQUFDbUIsTUFBTywrQkFBOEJyQixjQUFlLG1CQUFrQixLQUFLVyxhQUFjLDZFQUF6TCxDQUFOO0lBQ0Q7O0lBRUQsSUFBSTtNQUNGLE1BQU1ZLFVBQVUsR0FBR3RCLFNBQVMsQ0FBQ0MsT0FBRCxFQUFVLEtBQUthLHVCQUFmLENBQTVCO01BRUEsS0FBS0csYUFBTCxHQUFxQixJQUFJTCxxQkFBSixDQUFpQlUsVUFBakIsQ0FBckI7TUFFQSxNQUFNQyxVQUFVLEdBQUd2QixTQUFTLENBQUNDLE9BQUQsRUFBVSxLQUFLYyxnQkFBZixDQUE1QjtNQUVBLEtBQUtHLE1BQUwsR0FBYyxJQUFJTixxQkFBSixDQUFpQlcsVUFBakIsQ0FBZDtNQUVBLE1BQU1DLFNBQVMsR0FBR3hCLFNBQVMsQ0FBQ0MsT0FBRCxFQUFVLEtBQUtlLGVBQWYsQ0FBM0I7TUFFQSxLQUFLRyxLQUFMLEdBQWEsSUFBSVAscUJBQUosQ0FBaUJZLFNBQWpCLENBQWI7SUFDRCxDQVpELENBWUUsT0FBT0MsS0FBUCxFQUFtQjtNQUNuQixNQUFNLElBQUlKLEtBQUosQ0FBVywyQkFBMEJJLEtBQUssQ0FBQ0MsT0FBUSxHQUFuRCxDQUFOO0lBQ0Q7RUFDRjs7RUFFREMsZ0JBQWdCLEdBQVc7SUFDekIsT0FBTyxLQUFLVixhQUFMLENBQW1CaEIsT0FBMUI7RUFDRDs7RUFFRDJCLFNBQVMsR0FBVztJQUNsQixPQUFPLEtBQUtWLE1BQUwsQ0FBWWpCLE9BQW5CO0VBQ0Q7O0VBRUQ0QixRQUFRLEdBQVc7SUFDakIsT0FBTyxLQUFLVixLQUFMLENBQVdsQixPQUFsQjtFQUNEOztBQS9DaUUifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.CEKEntry = void 0;

// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.
// Copyright (c) 2019 Microsoft Corporation
class CEKEntry {
  constructor(ordinalVal) {
    this.columnEncryptionKeyValues = void 0;
    this.ordinal = void 0;
    this.databaseId = void 0;
    this.cekId = void 0;
    this.cekVersion = void 0;
    this.cekMdVersion = void 0;
    this.ordinal = ordinalVal;
    this.databaseId = 0;
    this.cekId = 0;
    this.cekVersion = 0;
    this.cekMdVersion = Buffer.alloc(0);
    this.columnEncryptionKeyValues = [];
  }

  add(encryptedKey, dbId, keyId, keyVersion, mdVersion, keyPath, keyStoreName, algorithmName) {
    const encryptionKey = {
      encryptedKey,
      dbId,
      keyId,
      keyVersion,
      mdVersion,
      keyPath,
      keyStoreName,
      algorithmName
    };
    this.columnEncryptionKeyValues.push(encryptionKey);

    if (this.databaseId === 0) {
      this.databaseId = dbId;
      this.cekId = keyId;
      this.cekVersion = keyVersion;
      this.cekMdVersion = mdVersion;
    } else if (this.databaseId !== dbId || this.cekId !== keyId || this.cekVersion !== keyVersion || !this.cekMdVersion || !mdVersion || this.cekMdVersion.length !== mdVersion.length) {
      throw new Error('Invalid databaseId, cekId, cekVersion or cekMdVersion.');
    }
  }

}

exports.CEKEntry = CEKEntry;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDRUtFbnRyeSIsImNvbnN0cnVjdG9yIiwib3JkaW5hbFZhbCIsImNvbHVtbkVuY3J5cHRpb25LZXlWYWx1ZXMiLCJvcmRpbmFsIiwiZGF0YWJhc2VJZCIsImNla0lkIiwiY2VrVmVyc2lvbiIsImNla01kVmVyc2lvbiIsIkJ1ZmZlciIsImFsbG9jIiwiYWRkIiwiZW5jcnlwdGVkS2V5IiwiZGJJZCIsImtleUlkIiwia2V5VmVyc2lvbiIsIm1kVmVyc2lvbiIsImtleVBhdGgiLCJrZXlTdG9yZU5hbWUiLCJhbGdvcml0aG1OYW1lIiwiZW5jcnlwdGlvbktleSIsInB1c2giLCJsZW5ndGgiLCJFcnJvciJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbHdheXMtZW5jcnlwdGVkL2Nlay1lbnRyeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIGBtc3NxbC1qZGJjYCBsaWJyYXJ5IHB1Ymxpc2hlZCB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiBNSVQgbGljZW5zZS5cbi8vIENvcHlyaWdodCAoYykgMjAxOSBNaWNyb3NvZnQgQ29ycG9yYXRpb25cblxuaW1wb3J0IHsgRW5jcnlwdGlvbktleUluZm8gfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENFS0VudHJ5IHtcbiAgY29sdW1uRW5jcnlwdGlvbktleVZhbHVlczogRW5jcnlwdGlvbktleUluZm9bXTtcbiAgb3JkaW5hbDogbnVtYmVyO1xuICBkYXRhYmFzZUlkOiBudW1iZXI7XG4gIGNla0lkOiBudW1iZXI7XG4gIGNla1ZlcnNpb246IG51bWJlcjtcbiAgY2VrTWRWZXJzaW9uOiBCdWZmZXI7XG5cbiAgY29uc3RydWN0b3Iob3JkaW5hbFZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5vcmRpbmFsID0gb3JkaW5hbFZhbDtcbiAgICB0aGlzLmRhdGFiYXNlSWQgPSAwO1xuICAgIHRoaXMuY2VrSWQgPSAwO1xuICAgIHRoaXMuY2VrVmVyc2lvbiA9IDA7XG4gICAgdGhpcy5jZWtNZFZlcnNpb24gPSBCdWZmZXIuYWxsb2MoMCk7XG4gICAgdGhpcy5jb2x1bW5FbmNyeXB0aW9uS2V5VmFsdWVzID0gW107XG4gIH1cblxuICBhZGQoZW5jcnlwdGVkS2V5OiBCdWZmZXIsIGRiSWQ6IG51bWJlciwga2V5SWQ6IG51bWJlciwga2V5VmVyc2lvbjogbnVtYmVyLCBtZFZlcnNpb246IEJ1ZmZlciwga2V5UGF0aDogc3RyaW5nLCBrZXlTdG9yZU5hbWU6IHN0cmluZywgYWxnb3JpdGhtTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZW5jcnlwdGlvbktleTogRW5jcnlwdGlvbktleUluZm8gPSB7XG4gICAgICBlbmNyeXB0ZWRLZXksXG4gICAgICBkYklkLFxuICAgICAga2V5SWQsXG4gICAgICBrZXlWZXJzaW9uLFxuICAgICAgbWRWZXJzaW9uLFxuICAgICAga2V5UGF0aCxcbiAgICAgIGtleVN0b3JlTmFtZSxcbiAgICAgIGFsZ29yaXRobU5hbWUsXG4gICAgfTtcblxuICAgIHRoaXMuY29sdW1uRW5jcnlwdGlvbktleVZhbHVlcy5wdXNoKGVuY3J5cHRpb25LZXkpO1xuXG4gICAgaWYgKHRoaXMuZGF0YWJhc2VJZCA9PT0gMCkge1xuICAgICAgdGhpcy5kYXRhYmFzZUlkID0gZGJJZDtcbiAgICAgIHRoaXMuY2VrSWQgPSBrZXlJZDtcbiAgICAgIHRoaXMuY2VrVmVyc2lvbiA9IGtleVZlcnNpb247XG4gICAgICB0aGlzLmNla01kVmVyc2lvbiA9IG1kVmVyc2lvbjtcbiAgICB9IGVsc2UgaWYgKCh0aGlzLmRhdGFiYXNlSWQgIT09IGRiSWQpIHx8ICh0aGlzLmNla0lkICE9PSBrZXlJZCkgfHwgKHRoaXMuY2VrVmVyc2lvbiAhPT0ga2V5VmVyc2lvbikgfHwgIXRoaXMuY2VrTWRWZXJzaW9uIHx8ICFtZFZlcnNpb24gfHwgdGhpcy5jZWtNZFZlcnNpb24ubGVuZ3RoICE9PSBtZFZlcnNpb24ubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGF0YWJhc2VJZCwgY2VrSWQsIGNla1ZlcnNpb24gb3IgY2VrTWRWZXJzaW9uLicpO1xuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUlPLE1BQU1BLFFBQU4sQ0FBZTtFQVFwQkMsV0FBVyxDQUFDQyxVQUFELEVBQXFCO0lBQUEsS0FQaENDLHlCQU9nQztJQUFBLEtBTmhDQyxPQU1nQztJQUFBLEtBTGhDQyxVQUtnQztJQUFBLEtBSmhDQyxLQUlnQztJQUFBLEtBSGhDQyxVQUdnQztJQUFBLEtBRmhDQyxZQUVnQztJQUM5QixLQUFLSixPQUFMLEdBQWVGLFVBQWY7SUFDQSxLQUFLRyxVQUFMLEdBQWtCLENBQWxCO0lBQ0EsS0FBS0MsS0FBTCxHQUFhLENBQWI7SUFDQSxLQUFLQyxVQUFMLEdBQWtCLENBQWxCO0lBQ0EsS0FBS0MsWUFBTCxHQUFvQkMsTUFBTSxDQUFDQyxLQUFQLENBQWEsQ0FBYixDQUFwQjtJQUNBLEtBQUtQLHlCQUFMLEdBQWlDLEVBQWpDO0VBQ0Q7O0VBRURRLEdBQUcsQ0FBQ0MsWUFBRCxFQUF1QkMsSUFBdkIsRUFBcUNDLEtBQXJDLEVBQW9EQyxVQUFwRCxFQUF3RUMsU0FBeEUsRUFBMkZDLE9BQTNGLEVBQTRHQyxZQUE1RyxFQUFrSUMsYUFBbEksRUFBK0o7SUFDaEssTUFBTUMsYUFBZ0MsR0FBRztNQUN2Q1IsWUFEdUM7TUFFdkNDLElBRnVDO01BR3ZDQyxLQUh1QztNQUl2Q0MsVUFKdUM7TUFLdkNDLFNBTHVDO01BTXZDQyxPQU51QztNQU92Q0MsWUFQdUM7TUFRdkNDO0lBUnVDLENBQXpDO0lBV0EsS0FBS2hCLHlCQUFMLENBQStCa0IsSUFBL0IsQ0FBb0NELGFBQXBDOztJQUVBLElBQUksS0FBS2YsVUFBTCxLQUFvQixDQUF4QixFQUEyQjtNQUN6QixLQUFLQSxVQUFMLEdBQWtCUSxJQUFsQjtNQUNBLEtBQUtQLEtBQUwsR0FBYVEsS0FBYjtNQUNBLEtBQUtQLFVBQUwsR0FBa0JRLFVBQWxCO01BQ0EsS0FBS1AsWUFBTCxHQUFvQlEsU0FBcEI7SUFDRCxDQUxELE1BS08sSUFBSyxLQUFLWCxVQUFMLEtBQW9CUSxJQUFyQixJQUErQixLQUFLUCxLQUFMLEtBQWVRLEtBQTlDLElBQXlELEtBQUtQLFVBQUwsS0FBb0JRLFVBQTdFLElBQTRGLENBQUMsS0FBS1AsWUFBbEcsSUFBa0gsQ0FBQ1EsU0FBbkgsSUFBZ0ksS0FBS1IsWUFBTCxDQUFrQmMsTUFBbEIsS0FBNkJOLFNBQVMsQ0FBQ00sTUFBM0ssRUFBbUw7TUFDeEwsTUFBTSxJQUFJQyxLQUFKLENBQVUsd0RBQVYsQ0FBTjtJQUNEO0VBQ0Y7O0FBdkNtQiJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getParameterEncryptionMetadata = void 0;

var _types = require("./types");

var _cekEntry = require("./cek-entry");

var _keyCrypto = require("./key-crypto");

var _dataType = require("../data-type");

var _request = _interopRequireDefault(require("../request"));

var _rpcrequestPayload = _interopRequireDefault(require("../rpcrequest-payload"));

var _packet = require("../packet");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.
// Copyright (c) 2019 Microsoft Corporation
const getParameterEncryptionMetadata = (connection, request, callback) => {
  if (request.cryptoMetadataLoaded === true) {
    return callback();
  }

  const metadataRequest = new _request.default('sp_describe_parameter_encryption', error => {
    if (error) {
      return callback(error);
    }

    const decryptSymmetricKeyPromises = [];
    const cekList = [];
    let paramCount = 0;

    for (const columns of resultRows) {
      try {
        const isFirstRecordSet = columns.some(col => (col && col.metadata && col.metadata.colName) === 'database_id');

        if (isFirstRecordSet === true) {
          const currentOrdinal = columns[_types.DescribeParameterEncryptionResultSet1.KeyOrdinal].value;
          let cekEntry;

          if (!cekList[currentOrdinal]) {
            cekEntry = new _cekEntry.CEKEntry(currentOrdinal);
            cekList[cekEntry.ordinal] = cekEntry;
          } else {
            cekEntry = cekList[currentOrdinal];
          }

          cekEntry.add(columns[_types.DescribeParameterEncryptionResultSet1.EncryptedKey].value, columns[_types.DescribeParameterEncryptionResultSet1.DbId].value, columns[_types.DescribeParameterEncryptionResultSet1.KeyId].value, columns[_types.DescribeParameterEncryptionResultSet1.KeyVersion].value, columns[_types.DescribeParameterEncryptionResultSet1.KeyMdVersion].value, columns[_types.DescribeParameterEncryptionResultSet1.KeyPath].value, columns[_types.DescribeParameterEncryptionResultSet1.ProviderName].value, columns[_types.DescribeParameterEncryptionResultSet1.KeyEncryptionAlgorithm].value);
        } else {
          paramCount++;
          const paramName = columns[_types.DescribeParameterEncryptionResultSet2.ParameterName].value;
          const paramIndex = request.parameters.findIndex(param => paramName === `@${param.name}`);
          const cekOrdinal = columns[_types.DescribeParameterEncryptionResultSet2.ColumnEncryptionKeyOrdinal].value;
          const cekEntry = cekList[cekOrdinal];

          if (cekEntry && cekList.length < cekOrdinal) {
            return callback(new Error(`Internal error. The referenced column encryption key ordinal "${cekOrdinal}" is missing in the encryption metadata returned by sp_describe_parameter_encryption. Max ordinal is "${cekList.length}".`));
          }

          const encType = columns[_types.DescribeParameterEncryptionResultSet2.ColumnEncrytionType].value;

          if (_types.SQLServerEncryptionType.PlainText !== encType) {
            request.parameters[paramIndex].cryptoMetadata = {
              cekEntry: cekEntry,
              ordinal: cekOrdinal,
              cipherAlgorithmId: columns[_types.DescribeParameterEncryptionResultSet2.ColumnEncryptionAlgorithm].value,
              encryptionType: encType,
              normalizationRuleVersion: Buffer.from([columns[_types.DescribeParameterEncryptionResultSet2.NormalizationRuleVersion].value])
            };
            decryptSymmetricKeyPromises.push((0, _keyCrypto.decryptSymmetricKey)(request.parameters[paramIndex].cryptoMetadata, connection.config.options));
          } else if (request.parameters[paramIndex].forceEncrypt === true) {
            return callback(new Error(`Cannot execute statement or procedure ${request.sqlTextOrProcedure} because Force Encryption was set as true for parameter ${paramIndex + 1} and the database expects this parameter to be sent as plaintext. This may be due to a configuration error.`));
          }
        }
      } catch {
        return callback(new Error(`Internal error. Unable to parse parameter encryption metadata in statement or procedure "${request.sqlTextOrProcedure}"`));
      }
    }

    if (paramCount !== request.parameters.length) {
      return callback(new Error(`Internal error. Metadata for some parameters in statement or procedure "${request.sqlTextOrProcedure}" is missing in the resultset returned by sp_describe_parameter_encryption.`));
    }

    return Promise.all(decryptSymmetricKeyPromises).then(() => {
      request.cryptoMetadataLoaded = true;
      process.nextTick(callback);
    }, error => {
      process.nextTick(callback, error);
    });
  });
  metadataRequest.addParameter('tsql', _dataType.typeByName.NVarChar, request.sqlTextOrProcedure);

  if (request.parameters.length) {
    metadataRequest.addParameter('params', _dataType.typeByName.NVarChar, metadataRequest.makeParamsParameter(request.parameters));
  }

  const resultRows = [];
  metadataRequest.on('row', columns => {
    resultRows.push(columns);
  });
  connection.makeRequest(metadataRequest, _packet.TYPE.RPC_REQUEST, new _rpcrequestPayload.default(metadataRequest.sqlTextOrProcedure, metadataRequest.parameters, connection.currentTransactionDescriptor(), connection.config.options, connection.databaseCollation));
};

exports.getParameterEncryptionMetadata = getParameterEncryptionMetadata;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRQYXJhbWV0ZXJFbmNyeXB0aW9uTWV0YWRhdGEiLCJjb25uZWN0aW9uIiwicmVxdWVzdCIsImNhbGxiYWNrIiwiY3J5cHRvTWV0YWRhdGFMb2FkZWQiLCJtZXRhZGF0YVJlcXVlc3QiLCJSZXF1ZXN0IiwiZXJyb3IiLCJkZWNyeXB0U3ltbWV0cmljS2V5UHJvbWlzZXMiLCJjZWtMaXN0IiwicGFyYW1Db3VudCIsImNvbHVtbnMiLCJyZXN1bHRSb3dzIiwiaXNGaXJzdFJlY29yZFNldCIsInNvbWUiLCJjb2wiLCJtZXRhZGF0YSIsImNvbE5hbWUiLCJjdXJyZW50T3JkaW5hbCIsIkRlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEiLCJLZXlPcmRpbmFsIiwidmFsdWUiLCJjZWtFbnRyeSIsIkNFS0VudHJ5Iiwib3JkaW5hbCIsImFkZCIsIkVuY3J5cHRlZEtleSIsIkRiSWQiLCJLZXlJZCIsIktleVZlcnNpb24iLCJLZXlNZFZlcnNpb24iLCJLZXlQYXRoIiwiUHJvdmlkZXJOYW1lIiwiS2V5RW5jcnlwdGlvbkFsZ29yaXRobSIsInBhcmFtTmFtZSIsIkRlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDIiLCJQYXJhbWV0ZXJOYW1lIiwicGFyYW1JbmRleCIsInBhcmFtZXRlcnMiLCJmaW5kSW5kZXgiLCJwYXJhbSIsIm5hbWUiLCJjZWtPcmRpbmFsIiwiQ29sdW1uRW5jcnlwdGlvbktleU9yZGluYWwiLCJsZW5ndGgiLCJFcnJvciIsImVuY1R5cGUiLCJDb2x1bW5FbmNyeXRpb25UeXBlIiwiU1FMU2VydmVyRW5jcnlwdGlvblR5cGUiLCJQbGFpblRleHQiLCJjcnlwdG9NZXRhZGF0YSIsImNpcGhlckFsZ29yaXRobUlkIiwiQ29sdW1uRW5jcnlwdGlvbkFsZ29yaXRobSIsImVuY3J5cHRpb25UeXBlIiwibm9ybWFsaXphdGlvblJ1bGVWZXJzaW9uIiwiQnVmZmVyIiwiZnJvbSIsIk5vcm1hbGl6YXRpb25SdWxlVmVyc2lvbiIsInB1c2giLCJjb25maWciLCJvcHRpb25zIiwiZm9yY2VFbmNyeXB0Iiwic3FsVGV4dE9yUHJvY2VkdXJlIiwiUHJvbWlzZSIsImFsbCIsInRoZW4iLCJwcm9jZXNzIiwibmV4dFRpY2siLCJhZGRQYXJhbWV0ZXIiLCJUWVBFUyIsIk5WYXJDaGFyIiwibWFrZVBhcmFtc1BhcmFtZXRlciIsIm9uIiwibWFrZVJlcXVlc3QiLCJUWVBFIiwiUlBDX1JFUVVFU1QiLCJScGNSZXF1ZXN0UGF5bG9hZCIsImN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IiLCJkYXRhYmFzZUNvbGxhdGlvbiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbHdheXMtZW5jcnlwdGVkL2dldC1wYXJhbWV0ZXItZW5jcnlwdGlvbi1tZXRhZGF0YS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIGBtc3NxbC1qZGJjYCBsaWJyYXJ5IHB1Ymxpc2hlZCB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiBNSVQgbGljZW5zZS5cbi8vIENvcHlyaWdodCAoYykgMjAxOSBNaWNyb3NvZnQgQ29ycG9yYXRpb25cblxuaW1wb3J0IHsgU1FMU2VydmVyRW5jcnlwdGlvblR5cGUsIENyeXB0b01ldGFkYXRhLCBEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxLCBEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQyIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBDRUtFbnRyeSB9IGZyb20gJy4vY2VrLWVudHJ5JztcbmltcG9ydCB7IGRlY3J5cHRTeW1tZXRyaWNLZXkgfSBmcm9tICcuL2tleS1jcnlwdG8nO1xuaW1wb3J0IHsgdHlwZUJ5TmFtZSBhcyBUWVBFUywgUGFyYW1ldGVyIH0gZnJvbSAnLi4vZGF0YS10eXBlJztcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4uL3JlcXVlc3QnO1xuaW1wb3J0IENvbm5lY3Rpb24gZnJvbSAnLi4vY29ubmVjdGlvbic7XG5pbXBvcnQgUnBjUmVxdWVzdFBheWxvYWQgZnJvbSAnLi4vcnBjcmVxdWVzdC1wYXlsb2FkJztcbmltcG9ydCB7IFRZUEUgfSBmcm9tICcuLi9wYWNrZXQnO1xuXG5leHBvcnQgY29uc3QgZ2V0UGFyYW1ldGVyRW5jcnlwdGlvbk1ldGFkYXRhID0gKGNvbm5lY3Rpb246IENvbm5lY3Rpb24sIHJlcXVlc3Q6IFJlcXVlc3QsIGNhbGxiYWNrOiAoZXJyb3I/OiBFcnJvcikgPT4gdm9pZCkgPT4ge1xuICBpZiAocmVxdWVzdC5jcnlwdG9NZXRhZGF0YUxvYWRlZCA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBjYWxsYmFjaygpO1xuICB9XG5cbiAgY29uc3QgbWV0YWRhdGFSZXF1ZXN0ID0gbmV3IFJlcXVlc3QoJ3NwX2Rlc2NyaWJlX3BhcmFtZXRlcl9lbmNyeXB0aW9uJywgKGVycm9yKSA9PiB7XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyb3IpO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY3J5cHRTeW1tZXRyaWNLZXlQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgY29uc3QgY2VrTGlzdDogQ0VLRW50cnlbXSA9IFtdO1xuICAgIGxldCBwYXJhbUNvdW50ID0gMDtcblxuICAgIGZvciAoY29uc3QgY29sdW1ucyBvZiByZXN1bHRSb3dzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpc0ZpcnN0UmVjb3JkU2V0ID0gY29sdW1ucy5zb21lKChjb2w6IGFueSkgPT4gKGNvbCAmJiBjb2wubWV0YWRhdGEgJiYgY29sLm1ldGFkYXRhLmNvbE5hbWUpID09PSAnZGF0YWJhc2VfaWQnKTtcbiAgICAgICAgaWYgKGlzRmlyc3RSZWNvcmRTZXQgPT09IHRydWUpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50T3JkaW5hbCA9IGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MS5LZXlPcmRpbmFsXS52YWx1ZTtcbiAgICAgICAgICBsZXQgY2VrRW50cnk6IENFS0VudHJ5O1xuICAgICAgICAgIGlmICghY2VrTGlzdFtjdXJyZW50T3JkaW5hbF0pIHtcbiAgICAgICAgICAgIGNla0VudHJ5ID0gbmV3IENFS0VudHJ5KGN1cnJlbnRPcmRpbmFsKTtcbiAgICAgICAgICAgIGNla0xpc3RbY2VrRW50cnkub3JkaW5hbF0gPSBjZWtFbnRyeTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2VrRW50cnkgPSBjZWtMaXN0W2N1cnJlbnRPcmRpbmFsXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2VrRW50cnkuYWRkKGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MS5FbmNyeXB0ZWRLZXldLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEuRGJJZF0udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MS5LZXlJZF0udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MS5LZXlWZXJzaW9uXS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxLktleU1kVmVyc2lvbl0udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MS5LZXlQYXRoXS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxLlByb3ZpZGVyTmFtZV0udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MS5LZXlFbmNyeXB0aW9uQWxnb3JpdGhtXS52YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFyYW1Db3VudCsrO1xuICAgICAgICAgIGNvbnN0IHBhcmFtTmFtZTogc3RyaW5nID0gY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQyLlBhcmFtZXRlck5hbWVdLnZhbHVlO1xuICAgICAgICAgIGNvbnN0IHBhcmFtSW5kZXg6IG51bWJlciA9IHJlcXVlc3QucGFyYW1ldGVycy5maW5kSW5kZXgoKHBhcmFtOiBQYXJhbWV0ZXIpID0+IHBhcmFtTmFtZSA9PT0gYEAke3BhcmFtLm5hbWV9YCk7XG4gICAgICAgICAgY29uc3QgY2VrT3JkaW5hbDogbnVtYmVyID0gY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQyLkNvbHVtbkVuY3J5cHRpb25LZXlPcmRpbmFsXS52YWx1ZTtcbiAgICAgICAgICBjb25zdCBjZWtFbnRyeTogQ0VLRW50cnkgPSBjZWtMaXN0W2Nla09yZGluYWxdO1xuXG4gICAgICAgICAgaWYgKGNla0VudHJ5ICYmIGNla0xpc3QubGVuZ3RoIDwgY2VrT3JkaW5hbCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihgSW50ZXJuYWwgZXJyb3IuIFRoZSByZWZlcmVuY2VkIGNvbHVtbiBlbmNyeXB0aW9uIGtleSBvcmRpbmFsIFwiJHtjZWtPcmRpbmFsfVwiIGlzIG1pc3NpbmcgaW4gdGhlIGVuY3J5cHRpb24gbWV0YWRhdGEgcmV0dXJuZWQgYnkgc3BfZGVzY3JpYmVfcGFyYW1ldGVyX2VuY3J5cHRpb24uIE1heCBvcmRpbmFsIGlzIFwiJHtjZWtMaXN0Lmxlbmd0aH1cIi5gKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZW5jVHlwZSA9IGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0Mi5Db2x1bW5FbmNyeXRpb25UeXBlXS52YWx1ZTtcbiAgICAgICAgICBpZiAoU1FMU2VydmVyRW5jcnlwdGlvblR5cGUuUGxhaW5UZXh0ICE9PSBlbmNUeXBlKSB7XG4gICAgICAgICAgICByZXF1ZXN0LnBhcmFtZXRlcnNbcGFyYW1JbmRleF0uY3J5cHRvTWV0YWRhdGEgPSB7XG4gICAgICAgICAgICAgIGNla0VudHJ5OiBjZWtFbnRyeSxcbiAgICAgICAgICAgICAgb3JkaW5hbDogY2VrT3JkaW5hbCxcbiAgICAgICAgICAgICAgY2lwaGVyQWxnb3JpdGhtSWQ6IGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0Mi5Db2x1bW5FbmNyeXB0aW9uQWxnb3JpdGhtXS52YWx1ZSxcbiAgICAgICAgICAgICAgZW5jcnlwdGlvblR5cGU6IGVuY1R5cGUsXG4gICAgICAgICAgICAgIG5vcm1hbGl6YXRpb25SdWxlVmVyc2lvbjogQnVmZmVyLmZyb20oW2NvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0Mi5Ob3JtYWxpemF0aW9uUnVsZVZlcnNpb25dLnZhbHVlXSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZGVjcnlwdFN5bW1ldHJpY0tleVByb21pc2VzLnB1c2goZGVjcnlwdFN5bW1ldHJpY0tleShyZXF1ZXN0LnBhcmFtZXRlcnNbcGFyYW1JbmRleF0uY3J5cHRvTWV0YWRhdGEgYXMgQ3J5cHRvTWV0YWRhdGEsIGNvbm5lY3Rpb24uY29uZmlnLm9wdGlvbnMpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3QucGFyYW1ldGVyc1twYXJhbUluZGV4XS5mb3JjZUVuY3J5cHQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoYENhbm5vdCBleGVjdXRlIHN0YXRlbWVudCBvciBwcm9jZWR1cmUgJHtyZXF1ZXN0LnNxbFRleHRPclByb2NlZHVyZX0gYmVjYXVzZSBGb3JjZSBFbmNyeXB0aW9uIHdhcyBzZXQgYXMgdHJ1ZSBmb3IgcGFyYW1ldGVyICR7cGFyYW1JbmRleCArIDF9IGFuZCB0aGUgZGF0YWJhc2UgZXhwZWN0cyB0aGlzIHBhcmFtZXRlciB0byBiZSBzZW50IGFzIHBsYWludGV4dC4gVGhpcyBtYXkgYmUgZHVlIHRvIGEgY29uZmlndXJhdGlvbiBlcnJvci5gKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihgSW50ZXJuYWwgZXJyb3IuIFVuYWJsZSB0byBwYXJzZSBwYXJhbWV0ZXIgZW5jcnlwdGlvbiBtZXRhZGF0YSBpbiBzdGF0ZW1lbnQgb3IgcHJvY2VkdXJlIFwiJHtyZXF1ZXN0LnNxbFRleHRPclByb2NlZHVyZX1cImApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGFyYW1Db3VudCAhPT0gcmVxdWVzdC5wYXJhbWV0ZXJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihgSW50ZXJuYWwgZXJyb3IuIE1ldGFkYXRhIGZvciBzb21lIHBhcmFtZXRlcnMgaW4gc3RhdGVtZW50IG9yIHByb2NlZHVyZSBcIiR7cmVxdWVzdC5zcWxUZXh0T3JQcm9jZWR1cmV9XCIgaXMgbWlzc2luZyBpbiB0aGUgcmVzdWx0c2V0IHJldHVybmVkIGJ5IHNwX2Rlc2NyaWJlX3BhcmFtZXRlcl9lbmNyeXB0aW9uLmApKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoZGVjcnlwdFN5bW1ldHJpY0tleVByb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgIHJlcXVlc3QuY3J5cHRvTWV0YWRhdGFMb2FkZWQgPSB0cnVlO1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjayk7XG4gICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrLCBlcnJvcik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIG1ldGFkYXRhUmVxdWVzdC5hZGRQYXJhbWV0ZXIoJ3RzcWwnLCBUWVBFUy5OVmFyQ2hhciwgcmVxdWVzdC5zcWxUZXh0T3JQcm9jZWR1cmUpO1xuICBpZiAocmVxdWVzdC5wYXJhbWV0ZXJzLmxlbmd0aCkge1xuICAgIG1ldGFkYXRhUmVxdWVzdC5hZGRQYXJhbWV0ZXIoJ3BhcmFtcycsIFRZUEVTLk5WYXJDaGFyLCBtZXRhZGF0YVJlcXVlc3QubWFrZVBhcmFtc1BhcmFtZXRlcihyZXF1ZXN0LnBhcmFtZXRlcnMpKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdFJvd3M6IGFueVtdID0gW107XG5cbiAgbWV0YWRhdGFSZXF1ZXN0Lm9uKCdyb3cnLCAoY29sdW1uczogYW55KSA9PiB7XG4gICAgcmVzdWx0Um93cy5wdXNoKGNvbHVtbnMpO1xuICB9KTtcblxuICBjb25uZWN0aW9uLm1ha2VSZXF1ZXN0KG1ldGFkYXRhUmVxdWVzdCwgVFlQRS5SUENfUkVRVUVTVCwgbmV3IFJwY1JlcXVlc3RQYXlsb2FkKG1ldGFkYXRhUmVxdWVzdC5zcWxUZXh0T3JQcm9jZWR1cmUhLCBtZXRhZGF0YVJlcXVlc3QucGFyYW1ldGVycywgY29ubmVjdGlvbi5jdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCksIGNvbm5lY3Rpb24uY29uZmlnLm9wdGlvbnMsIGNvbm5lY3Rpb24uZGF0YWJhc2VDb2xsYXRpb24pKTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7OztBQVZBO0FBQ0E7QUFXTyxNQUFNQSw4QkFBOEIsR0FBRyxDQUFDQyxVQUFELEVBQXlCQyxPQUF6QixFQUEyQ0MsUUFBM0MsS0FBaUY7RUFDN0gsSUFBSUQsT0FBTyxDQUFDRSxvQkFBUixLQUFpQyxJQUFyQyxFQUEyQztJQUN6QyxPQUFPRCxRQUFRLEVBQWY7RUFDRDs7RUFFRCxNQUFNRSxlQUFlLEdBQUcsSUFBSUMsZ0JBQUosQ0FBWSxrQ0FBWixFQUFpREMsS0FBRCxJQUFXO0lBQ2pGLElBQUlBLEtBQUosRUFBVztNQUNULE9BQU9KLFFBQVEsQ0FBQ0ksS0FBRCxDQUFmO0lBQ0Q7O0lBRUQsTUFBTUMsMkJBQTRDLEdBQUcsRUFBckQ7SUFDQSxNQUFNQyxPQUFtQixHQUFHLEVBQTVCO0lBQ0EsSUFBSUMsVUFBVSxHQUFHLENBQWpCOztJQUVBLEtBQUssTUFBTUMsT0FBWCxJQUFzQkMsVUFBdEIsRUFBa0M7TUFDaEMsSUFBSTtRQUNGLE1BQU1DLGdCQUFnQixHQUFHRixPQUFPLENBQUNHLElBQVIsQ0FBY0MsR0FBRCxJQUFjLENBQUNBLEdBQUcsSUFBSUEsR0FBRyxDQUFDQyxRQUFYLElBQXVCRCxHQUFHLENBQUNDLFFBQUosQ0FBYUMsT0FBckMsTUFBa0QsYUFBN0UsQ0FBekI7O1FBQ0EsSUFBSUosZ0JBQWdCLEtBQUssSUFBekIsRUFBK0I7VUFDN0IsTUFBTUssY0FBYyxHQUFHUCxPQUFPLENBQUNRLDZDQUFzQ0MsVUFBdkMsQ0FBUCxDQUEwREMsS0FBakY7VUFDQSxJQUFJQyxRQUFKOztVQUNBLElBQUksQ0FBQ2IsT0FBTyxDQUFDUyxjQUFELENBQVosRUFBOEI7WUFDNUJJLFFBQVEsR0FBRyxJQUFJQyxrQkFBSixDQUFhTCxjQUFiLENBQVg7WUFDQVQsT0FBTyxDQUFDYSxRQUFRLENBQUNFLE9BQVYsQ0FBUCxHQUE0QkYsUUFBNUI7VUFDRCxDQUhELE1BR087WUFDTEEsUUFBUSxHQUFHYixPQUFPLENBQUNTLGNBQUQsQ0FBbEI7VUFDRDs7VUFDREksUUFBUSxDQUFDRyxHQUFULENBQWFkLE9BQU8sQ0FBQ1EsNkNBQXNDTyxZQUF2QyxDQUFQLENBQTRETCxLQUF6RSxFQUNhVixPQUFPLENBQUNRLDZDQUFzQ1EsSUFBdkMsQ0FBUCxDQUFvRE4sS0FEakUsRUFFYVYsT0FBTyxDQUFDUSw2Q0FBc0NTLEtBQXZDLENBQVAsQ0FBcURQLEtBRmxFLEVBR2FWLE9BQU8sQ0FBQ1EsNkNBQXNDVSxVQUF2QyxDQUFQLENBQTBEUixLQUh2RSxFQUlhVixPQUFPLENBQUNRLDZDQUFzQ1csWUFBdkMsQ0FBUCxDQUE0RFQsS0FKekUsRUFLYVYsT0FBTyxDQUFDUSw2Q0FBc0NZLE9BQXZDLENBQVAsQ0FBdURWLEtBTHBFLEVBTWFWLE9BQU8sQ0FBQ1EsNkNBQXNDYSxZQUF2QyxDQUFQLENBQTREWCxLQU56RSxFQU9hVixPQUFPLENBQUNRLDZDQUFzQ2Msc0JBQXZDLENBQVAsQ0FBc0VaLEtBUG5GO1FBUUQsQ0FqQkQsTUFpQk87VUFDTFgsVUFBVTtVQUNWLE1BQU13QixTQUFpQixHQUFHdkIsT0FBTyxDQUFDd0IsNkNBQXNDQyxhQUF2QyxDQUFQLENBQTZEZixLQUF2RjtVQUNBLE1BQU1nQixVQUFrQixHQUFHbkMsT0FBTyxDQUFDb0MsVUFBUixDQUFtQkMsU0FBbkIsQ0FBOEJDLEtBQUQsSUFBc0JOLFNBQVMsS0FBTSxJQUFHTSxLQUFLLENBQUNDLElBQUssRUFBaEYsQ0FBM0I7VUFDQSxNQUFNQyxVQUFrQixHQUFHL0IsT0FBTyxDQUFDd0IsNkNBQXNDUSwwQkFBdkMsQ0FBUCxDQUEwRXRCLEtBQXJHO1VBQ0EsTUFBTUMsUUFBa0IsR0FBR2IsT0FBTyxDQUFDaUMsVUFBRCxDQUFsQzs7VUFFQSxJQUFJcEIsUUFBUSxJQUFJYixPQUFPLENBQUNtQyxNQUFSLEdBQWlCRixVQUFqQyxFQUE2QztZQUMzQyxPQUFPdkMsUUFBUSxDQUFDLElBQUkwQyxLQUFKLENBQVcsaUVBQWdFSCxVQUFXLHlHQUF3R2pDLE9BQU8sQ0FBQ21DLE1BQU8sSUFBN00sQ0FBRCxDQUFmO1VBQ0Q7O1VBRUQsTUFBTUUsT0FBTyxHQUFHbkMsT0FBTyxDQUFDd0IsNkNBQXNDWSxtQkFBdkMsQ0FBUCxDQUFtRTFCLEtBQW5GOztVQUNBLElBQUkyQiwrQkFBd0JDLFNBQXhCLEtBQXNDSCxPQUExQyxFQUFtRDtZQUNqRDVDLE9BQU8sQ0FBQ29DLFVBQVIsQ0FBbUJELFVBQW5CLEVBQStCYSxjQUEvQixHQUFnRDtjQUM5QzVCLFFBQVEsRUFBRUEsUUFEb0M7Y0FFOUNFLE9BQU8sRUFBRWtCLFVBRnFDO2NBRzlDUyxpQkFBaUIsRUFBRXhDLE9BQU8sQ0FBQ3dCLDZDQUFzQ2lCLHlCQUF2QyxDQUFQLENBQXlFL0IsS0FIOUM7Y0FJOUNnQyxjQUFjLEVBQUVQLE9BSjhCO2NBSzlDUSx3QkFBd0IsRUFBRUMsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQzdDLE9BQU8sQ0FBQ3dCLDZDQUFzQ3NCLHdCQUF2QyxDQUFQLENBQXdFcEMsS0FBekUsQ0FBWjtZQUxvQixDQUFoRDtZQU9BYiwyQkFBMkIsQ0FBQ2tELElBQTVCLENBQWlDLG9DQUFvQnhELE9BQU8sQ0FBQ29DLFVBQVIsQ0FBbUJELFVBQW5CLEVBQStCYSxjQUFuRCxFQUFxRmpELFVBQVUsQ0FBQzBELE1BQVgsQ0FBa0JDLE9BQXZHLENBQWpDO1VBQ0QsQ0FURCxNQVNPLElBQUkxRCxPQUFPLENBQUNvQyxVQUFSLENBQW1CRCxVQUFuQixFQUErQndCLFlBQS9CLEtBQWdELElBQXBELEVBQTBEO1lBQy9ELE9BQU8xRCxRQUFRLENBQUMsSUFBSTBDLEtBQUosQ0FBVyx5Q0FBd0MzQyxPQUFPLENBQUM0RCxrQkFBbUIsMkRBQTBEekIsVUFBVSxHQUFHLENBQUUsNkdBQXZKLENBQUQsQ0FBZjtVQUNEO1FBQ0Y7TUFDRixDQTVDRCxDQTRDRSxNQUFNO1FBQ04sT0FBT2xDLFFBQVEsQ0FBQyxJQUFJMEMsS0FBSixDQUFXLDRGQUEyRjNDLE9BQU8sQ0FBQzRELGtCQUFtQixHQUFqSSxDQUFELENBQWY7TUFDRDtJQUNGOztJQUVELElBQUlwRCxVQUFVLEtBQUtSLE9BQU8sQ0FBQ29DLFVBQVIsQ0FBbUJNLE1BQXRDLEVBQThDO01BQzVDLE9BQU96QyxRQUFRLENBQUMsSUFBSTBDLEtBQUosQ0FBVywyRUFBMEUzQyxPQUFPLENBQUM0RCxrQkFBbUIsNkVBQWhILENBQUQsQ0FBZjtJQUNEOztJQUVELE9BQU9DLE9BQU8sQ0FBQ0MsR0FBUixDQUFZeEQsMkJBQVosRUFBeUN5RCxJQUF6QyxDQUE4QyxNQUFNO01BQ3pEL0QsT0FBTyxDQUFDRSxvQkFBUixHQUErQixJQUEvQjtNQUNBOEQsT0FBTyxDQUFDQyxRQUFSLENBQWlCaEUsUUFBakI7SUFDRCxDQUhNLEVBR0hJLEtBQUQsSUFBVztNQUNaMkQsT0FBTyxDQUFDQyxRQUFSLENBQWlCaEUsUUFBakIsRUFBMkJJLEtBQTNCO0lBQ0QsQ0FMTSxDQUFQO0VBTUQsQ0FyRXVCLENBQXhCO0VBdUVBRixlQUFlLENBQUMrRCxZQUFoQixDQUE2QixNQUE3QixFQUFxQ0MscUJBQU1DLFFBQTNDLEVBQXFEcEUsT0FBTyxDQUFDNEQsa0JBQTdEOztFQUNBLElBQUk1RCxPQUFPLENBQUNvQyxVQUFSLENBQW1CTSxNQUF2QixFQUErQjtJQUM3QnZDLGVBQWUsQ0FBQytELFlBQWhCLENBQTZCLFFBQTdCLEVBQXVDQyxxQkFBTUMsUUFBN0MsRUFBdURqRSxlQUFlLENBQUNrRSxtQkFBaEIsQ0FBb0NyRSxPQUFPLENBQUNvQyxVQUE1QyxDQUF2RDtFQUNEOztFQUVELE1BQU0xQixVQUFpQixHQUFHLEVBQTFCO0VBRUFQLGVBQWUsQ0FBQ21FLEVBQWhCLENBQW1CLEtBQW5CLEVBQTJCN0QsT0FBRCxJQUFrQjtJQUMxQ0MsVUFBVSxDQUFDOEMsSUFBWCxDQUFnQi9DLE9BQWhCO0VBQ0QsQ0FGRDtFQUlBVixVQUFVLENBQUN3RSxXQUFYLENBQXVCcEUsZUFBdkIsRUFBd0NxRSxhQUFLQyxXQUE3QyxFQUEwRCxJQUFJQywwQkFBSixDQUFzQnZFLGVBQWUsQ0FBQ3lELGtCQUF0QyxFQUEyRHpELGVBQWUsQ0FBQ2lDLFVBQTNFLEVBQXVGckMsVUFBVSxDQUFDNEUsNEJBQVgsRUFBdkYsRUFBa0k1RSxVQUFVLENBQUMwRCxNQUFYLENBQWtCQyxPQUFwSixFQUE2SjNELFVBQVUsQ0FBQzZFLGlCQUF4SyxDQUExRDtBQUNELENBeEZNIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.validateAndGetEncryptionAlgorithmName = exports.encryptWithKey = exports.decryptWithKey = exports.decryptSymmetricKey = void 0;

var _symmetricKeyCache = require("./symmetric-key-cache");

var _aeadAes256CbcHmacAlgorithm = require("./aead-aes-256-cbc-hmac-algorithm");

var _aeadAes256CbcHmacEncryptionKey = require("./aead-aes-256-cbc-hmac-encryption-key");

// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.
// Copyright (c) 2019 Microsoft Corporation
const validateAndGetEncryptionAlgorithmName = (cipherAlgorithmId, cipherAlgorithmName) => {
  if (cipherAlgorithmId !== 2) {
    throw new Error('Custom cipher algorithm not supported.');
  }

  return _aeadAes256CbcHmacAlgorithm.algorithmName;
};

exports.validateAndGetEncryptionAlgorithmName = validateAndGetEncryptionAlgorithmName;

const encryptWithKey = async (plaintext, md, options) => {
  if (!options.trustedServerNameAE) {
    throw new Error('Server name should not be null in EncryptWithKey');
  }

  if (!md.cipherAlgorithm) {
    await decryptSymmetricKey(md, options);
  }

  if (!md.cipherAlgorithm) {
    throw new Error('Cipher Algorithm should not be null in EncryptWithKey');
  }

  const cipherText = md.cipherAlgorithm.encryptData(plaintext);

  if (!cipherText) {
    throw new Error('Internal error. Ciphertext value cannot be null.');
  }

  return cipherText;
};

exports.encryptWithKey = encryptWithKey;

const decryptWithKey = (cipherText, md, options) => {
  if (!options.trustedServerNameAE) {
    throw new Error('Server name should not be null in DecryptWithKey');
  } // if (!md.cipherAlgorithm) {
  //   await decryptSymmetricKey(md, options);
  // }


  if (!md.cipherAlgorithm) {
    throw new Error('Cipher Algorithm should not be null in DecryptWithKey');
  }

  const plainText = md.cipherAlgorithm.decryptData(cipherText);

  if (!plainText) {
    throw new Error('Internal error. Plaintext value cannot be null.');
  }

  return plainText;
};

exports.decryptWithKey = decryptWithKey;

const decryptSymmetricKey = async (md, options) => {
  if (!md) {
    throw new Error('md should not be null in DecryptSymmetricKey.');
  }

  if (!md.cekEntry) {
    throw new Error('md.EncryptionInfo should not be null in DecryptSymmetricKey.');
  }

  if (!md.cekEntry.columnEncryptionKeyValues) {
    throw new Error('md.EncryptionInfo.ColumnEncryptionKeyValues should not be null in DecryptSymmetricKey.');
  }

  let symKey;
  let encryptionKeyInfoChosen;
  const CEKValues = md.cekEntry.columnEncryptionKeyValues;
  let lastError;

  for (const CEKValue of CEKValues) {
    try {
      symKey = await (0, _symmetricKeyCache.getKey)(CEKValue, options);

      if (symKey) {
        encryptionKeyInfoChosen = CEKValue;
        break;
      }
    } catch (error) {
      lastError = error;
    }
  }

  if (!symKey) {
    if (lastError) {
      throw lastError;
    } else {
      throw new Error('Exception while decryption of encrypted column encryption key.');
    }
  }

  const algorithmName = validateAndGetEncryptionAlgorithmName(md.cipherAlgorithmId, md.cipherAlgorithmName);
  const cipherAlgorithm = new _aeadAes256CbcHmacAlgorithm.AeadAes256CbcHmac256Algorithm(new _aeadAes256CbcHmacEncryptionKey.AeadAes256CbcHmac256EncryptionKey(symKey.rootKey, algorithmName), md.encryptionType);
  md.cipherAlgorithm = cipherAlgorithm;
  md.encryptionKeyInfo = encryptionKeyInfoChosen;
};

exports.decryptSymmetricKey = decryptSymmetricKey;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ2YWxpZGF0ZUFuZEdldEVuY3J5cHRpb25BbGdvcml0aG1OYW1lIiwiY2lwaGVyQWxnb3JpdGhtSWQiLCJjaXBoZXJBbGdvcml0aG1OYW1lIiwiRXJyb3IiLCJhbGdvcml0aG1OYW1lIiwiZW5jcnlwdFdpdGhLZXkiLCJwbGFpbnRleHQiLCJtZCIsIm9wdGlvbnMiLCJ0cnVzdGVkU2VydmVyTmFtZUFFIiwiY2lwaGVyQWxnb3JpdGhtIiwiZGVjcnlwdFN5bW1ldHJpY0tleSIsImNpcGhlclRleHQiLCJlbmNyeXB0RGF0YSIsImRlY3J5cHRXaXRoS2V5IiwicGxhaW5UZXh0IiwiZGVjcnlwdERhdGEiLCJjZWtFbnRyeSIsImNvbHVtbkVuY3J5cHRpb25LZXlWYWx1ZXMiLCJzeW1LZXkiLCJlbmNyeXB0aW9uS2V5SW5mb0Nob3NlbiIsIkNFS1ZhbHVlcyIsImxhc3RFcnJvciIsIkNFS1ZhbHVlIiwiZXJyb3IiLCJBZWFkQWVzMjU2Q2JjSG1hYzI1NkFsZ29yaXRobSIsIkFlYWRBZXMyNTZDYmNIbWFjMjU2RW5jcnlwdGlvbktleSIsInJvb3RLZXkiLCJlbmNyeXB0aW9uVHlwZSIsImVuY3J5cHRpb25LZXlJbmZvIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Fsd2F5cy1lbmNyeXB0ZWQva2V5LWNyeXB0by50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIGBtc3NxbC1qZGJjYCBsaWJyYXJ5IHB1Ymxpc2hlZCB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiBNSVQgbGljZW5zZS5cbi8vIENvcHlyaWdodCAoYykgMjAxOSBNaWNyb3NvZnQgQ29ycG9yYXRpb25cblxuaW1wb3J0IHsgQ3J5cHRvTWV0YWRhdGEsIEVuY3J5cHRpb25LZXlJbmZvIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbm5lY3Rpb25PcHRpb25zIGFzIENvbm5lY3Rpb25PcHRpb25zIH0gZnJvbSAnLi4vY29ubmVjdGlvbic7XG5pbXBvcnQgU3ltbWV0cmljS2V5IGZyb20gJy4vc3ltbWV0cmljLWtleSc7XG5pbXBvcnQgeyBnZXRLZXkgfSBmcm9tICcuL3N5bW1ldHJpYy1rZXktY2FjaGUnO1xuaW1wb3J0IHsgQWVhZEFlczI1NkNiY0htYWMyNTZBbGdvcml0aG0sIGFsZ29yaXRobU5hbWUgfSBmcm9tICcuL2FlYWQtYWVzLTI1Ni1jYmMtaG1hYy1hbGdvcml0aG0nO1xuaW1wb3J0IHsgQWVhZEFlczI1NkNiY0htYWMyNTZFbmNyeXB0aW9uS2V5IH0gZnJvbSAnLi9hZWFkLWFlcy0yNTYtY2JjLWhtYWMtZW5jcnlwdGlvbi1rZXknO1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVBbmRHZXRFbmNyeXB0aW9uQWxnb3JpdGhtTmFtZSA9IChjaXBoZXJBbGdvcml0aG1JZDogbnVtYmVyLCBjaXBoZXJBbGdvcml0aG1OYW1lPzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgaWYgKGNpcGhlckFsZ29yaXRobUlkICE9PSAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDdXN0b20gY2lwaGVyIGFsZ29yaXRobSBub3Qgc3VwcG9ydGVkLicpO1xuICB9XG5cbiAgcmV0dXJuIGFsZ29yaXRobU5hbWU7XG59O1xuXG5leHBvcnQgY29uc3QgZW5jcnlwdFdpdGhLZXkgPSBhc3luYyAocGxhaW50ZXh0OiBCdWZmZXIsIG1kOiBDcnlwdG9NZXRhZGF0YSwgb3B0aW9uczogQ29ubmVjdGlvbk9wdGlvbnMpOiBQcm9taXNlPEJ1ZmZlcj4gPT4ge1xuICBpZiAoIW9wdGlvbnMudHJ1c3RlZFNlcnZlck5hbWVBRSkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2VydmVyIG5hbWUgc2hvdWxkIG5vdCBiZSBudWxsIGluIEVuY3J5cHRXaXRoS2V5Jyk7XG4gIH1cblxuICBpZiAoIW1kLmNpcGhlckFsZ29yaXRobSkge1xuICAgIGF3YWl0IGRlY3J5cHRTeW1tZXRyaWNLZXkobWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgaWYgKCFtZC5jaXBoZXJBbGdvcml0aG0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NpcGhlciBBbGdvcml0aG0gc2hvdWxkIG5vdCBiZSBudWxsIGluIEVuY3J5cHRXaXRoS2V5Jyk7XG4gIH1cblxuICBjb25zdCBjaXBoZXJUZXh0OiBCdWZmZXIgPSBtZC5jaXBoZXJBbGdvcml0aG0uZW5jcnlwdERhdGEocGxhaW50ZXh0KTtcblxuICBpZiAoIWNpcGhlclRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludGVybmFsIGVycm9yLiBDaXBoZXJ0ZXh0IHZhbHVlIGNhbm5vdCBiZSBudWxsLicpO1xuICB9XG5cbiAgcmV0dXJuIGNpcGhlclRleHQ7XG59O1xuXG5leHBvcnQgY29uc3QgZGVjcnlwdFdpdGhLZXkgPSAoY2lwaGVyVGV4dDogQnVmZmVyLCBtZDogQ3J5cHRvTWV0YWRhdGEsIG9wdGlvbnM6IENvbm5lY3Rpb25PcHRpb25zKTogQnVmZmVyID0+IHtcbiAgaWYgKCFvcHRpb25zLnRydXN0ZWRTZXJ2ZXJOYW1lQUUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlcnZlciBuYW1lIHNob3VsZCBub3QgYmUgbnVsbCBpbiBEZWNyeXB0V2l0aEtleScpO1xuICB9XG5cbiAgLy8gaWYgKCFtZC5jaXBoZXJBbGdvcml0aG0pIHtcbiAgLy8gICBhd2FpdCBkZWNyeXB0U3ltbWV0cmljS2V5KG1kLCBvcHRpb25zKTtcbiAgLy8gfVxuXG4gIGlmICghbWQuY2lwaGVyQWxnb3JpdGhtKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDaXBoZXIgQWxnb3JpdGhtIHNob3VsZCBub3QgYmUgbnVsbCBpbiBEZWNyeXB0V2l0aEtleScpO1xuICB9XG5cbiAgY29uc3QgcGxhaW5UZXh0OiBCdWZmZXIgPSBtZC5jaXBoZXJBbGdvcml0aG0uZGVjcnlwdERhdGEoY2lwaGVyVGV4dCk7XG5cbiAgaWYgKCFwbGFpblRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludGVybmFsIGVycm9yLiBQbGFpbnRleHQgdmFsdWUgY2Fubm90IGJlIG51bGwuJyk7XG4gIH1cblxuICByZXR1cm4gcGxhaW5UZXh0O1xufTtcblxuZXhwb3J0IGNvbnN0IGRlY3J5cHRTeW1tZXRyaWNLZXkgPSBhc3luYyAobWQ6IENyeXB0b01ldGFkYXRhLCBvcHRpb25zOiBDb25uZWN0aW9uT3B0aW9ucyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBpZiAoIW1kKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtZCBzaG91bGQgbm90IGJlIG51bGwgaW4gRGVjcnlwdFN5bW1ldHJpY0tleS4nKTtcbiAgfVxuXG4gIGlmICghbWQuY2VrRW50cnkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21kLkVuY3J5cHRpb25JbmZvIHNob3VsZCBub3QgYmUgbnVsbCBpbiBEZWNyeXB0U3ltbWV0cmljS2V5LicpO1xuICB9XG5cbiAgaWYgKCFtZC5jZWtFbnRyeS5jb2x1bW5FbmNyeXB0aW9uS2V5VmFsdWVzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtZC5FbmNyeXB0aW9uSW5mby5Db2x1bW5FbmNyeXB0aW9uS2V5VmFsdWVzIHNob3VsZCBub3QgYmUgbnVsbCBpbiBEZWNyeXB0U3ltbWV0cmljS2V5LicpO1xuICB9XG5cbiAgbGV0IHN5bUtleTogU3ltbWV0cmljS2V5IHwgdW5kZWZpbmVkO1xuICBsZXQgZW5jcnlwdGlvbktleUluZm9DaG9zZW46IEVuY3J5cHRpb25LZXlJbmZvIHwgdW5kZWZpbmVkO1xuICBjb25zdCBDRUtWYWx1ZXM6IEVuY3J5cHRpb25LZXlJbmZvW10gPSBtZC5jZWtFbnRyeS5jb2x1bW5FbmNyeXB0aW9uS2V5VmFsdWVzO1xuICBsZXQgbGFzdEVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IENFS1ZhbHVlIG9mIENFS1ZhbHVlcykge1xuICAgIHRyeSB7XG4gICAgICBzeW1LZXkgPSBhd2FpdCBnZXRLZXkoQ0VLVmFsdWUsIG9wdGlvbnMpO1xuICAgICAgaWYgKHN5bUtleSkge1xuICAgICAgICBlbmNyeXB0aW9uS2V5SW5mb0Nob3NlbiA9IENFS1ZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBsYXN0RXJyb3IgPSBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBpZiAoIXN5bUtleSkge1xuICAgIGlmIChsYXN0RXJyb3IpIHtcbiAgICAgIHRocm93IGxhc3RFcnJvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeGNlcHRpb24gd2hpbGUgZGVjcnlwdGlvbiBvZiBlbmNyeXB0ZWQgY29sdW1uIGVuY3J5cHRpb24ga2V5LicpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFsZ29yaXRobU5hbWUgPSB2YWxpZGF0ZUFuZEdldEVuY3J5cHRpb25BbGdvcml0aG1OYW1lKG1kLmNpcGhlckFsZ29yaXRobUlkLCBtZC5jaXBoZXJBbGdvcml0aG1OYW1lKTtcbiAgY29uc3QgY2lwaGVyQWxnb3JpdGhtID0gbmV3IEFlYWRBZXMyNTZDYmNIbWFjMjU2QWxnb3JpdGhtKG5ldyBBZWFkQWVzMjU2Q2JjSG1hYzI1NkVuY3J5cHRpb25LZXkoc3ltS2V5LnJvb3RLZXksIGFsZ29yaXRobU5hbWUpLCBtZC5lbmNyeXB0aW9uVHlwZSk7XG5cbiAgbWQuY2lwaGVyQWxnb3JpdGhtID0gY2lwaGVyQWxnb3JpdGhtO1xuICBtZC5lbmNyeXB0aW9uS2V5SW5mbyA9IGVuY3J5cHRpb25LZXlJbmZvQ2hvc2VuIGFzIEVuY3J5cHRpb25LZXlJbmZvO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQU1BOztBQUNBOztBQUNBOztBQVJBO0FBQ0E7QUFTTyxNQUFNQSxxQ0FBcUMsR0FBRyxDQUFDQyxpQkFBRCxFQUE0QkMsbUJBQTVCLEtBQXFFO0VBQ3hILElBQUlELGlCQUFpQixLQUFLLENBQTFCLEVBQTZCO0lBQzNCLE1BQU0sSUFBSUUsS0FBSixDQUFVLHdDQUFWLENBQU47RUFDRDs7RUFFRCxPQUFPQyx5Q0FBUDtBQUNELENBTk07Ozs7QUFRQSxNQUFNQyxjQUFjLEdBQUcsT0FBT0MsU0FBUCxFQUEwQkMsRUFBMUIsRUFBOENDLE9BQTlDLEtBQThGO0VBQzFILElBQUksQ0FBQ0EsT0FBTyxDQUFDQyxtQkFBYixFQUFrQztJQUNoQyxNQUFNLElBQUlOLEtBQUosQ0FBVSxrREFBVixDQUFOO0VBQ0Q7O0VBRUQsSUFBSSxDQUFDSSxFQUFFLENBQUNHLGVBQVIsRUFBeUI7SUFDdkIsTUFBTUMsbUJBQW1CLENBQUNKLEVBQUQsRUFBS0MsT0FBTCxDQUF6QjtFQUNEOztFQUVELElBQUksQ0FBQ0QsRUFBRSxDQUFDRyxlQUFSLEVBQXlCO0lBQ3ZCLE1BQU0sSUFBSVAsS0FBSixDQUFVLHVEQUFWLENBQU47RUFDRDs7RUFFRCxNQUFNUyxVQUFrQixHQUFHTCxFQUFFLENBQUNHLGVBQUgsQ0FBbUJHLFdBQW5CLENBQStCUCxTQUEvQixDQUEzQjs7RUFFQSxJQUFJLENBQUNNLFVBQUwsRUFBaUI7SUFDZixNQUFNLElBQUlULEtBQUosQ0FBVSxrREFBVixDQUFOO0VBQ0Q7O0VBRUQsT0FBT1MsVUFBUDtBQUNELENBcEJNOzs7O0FBc0JBLE1BQU1FLGNBQWMsR0FBRyxDQUFDRixVQUFELEVBQXFCTCxFQUFyQixFQUF5Q0MsT0FBekMsS0FBZ0Y7RUFDNUcsSUFBSSxDQUFDQSxPQUFPLENBQUNDLG1CQUFiLEVBQWtDO0lBQ2hDLE1BQU0sSUFBSU4sS0FBSixDQUFVLGtEQUFWLENBQU47RUFDRCxDQUgyRyxDQUs1RztFQUNBO0VBQ0E7OztFQUVBLElBQUksQ0FBQ0ksRUFBRSxDQUFDRyxlQUFSLEVBQXlCO0lBQ3ZCLE1BQU0sSUFBSVAsS0FBSixDQUFVLHVEQUFWLENBQU47RUFDRDs7RUFFRCxNQUFNWSxTQUFpQixHQUFHUixFQUFFLENBQUNHLGVBQUgsQ0FBbUJNLFdBQW5CLENBQStCSixVQUEvQixDQUExQjs7RUFFQSxJQUFJLENBQUNHLFNBQUwsRUFBZ0I7SUFDZCxNQUFNLElBQUlaLEtBQUosQ0FBVSxpREFBVixDQUFOO0VBQ0Q7O0VBRUQsT0FBT1ksU0FBUDtBQUNELENBcEJNOzs7O0FBc0JBLE1BQU1KLG1CQUFtQixHQUFHLE9BQU9KLEVBQVAsRUFBMkJDLE9BQTNCLEtBQXlFO0VBQzFHLElBQUksQ0FBQ0QsRUFBTCxFQUFTO0lBQ1AsTUFBTSxJQUFJSixLQUFKLENBQVUsK0NBQVYsQ0FBTjtFQUNEOztFQUVELElBQUksQ0FBQ0ksRUFBRSxDQUFDVSxRQUFSLEVBQWtCO0lBQ2hCLE1BQU0sSUFBSWQsS0FBSixDQUFVLDhEQUFWLENBQU47RUFDRDs7RUFFRCxJQUFJLENBQUNJLEVBQUUsQ0FBQ1UsUUFBSCxDQUFZQyx5QkFBakIsRUFBNEM7SUFDMUMsTUFBTSxJQUFJZixLQUFKLENBQVUsd0ZBQVYsQ0FBTjtFQUNEOztFQUVELElBQUlnQixNQUFKO0VBQ0EsSUFBSUMsdUJBQUo7RUFDQSxNQUFNQyxTQUE4QixHQUFHZCxFQUFFLENBQUNVLFFBQUgsQ0FBWUMseUJBQW5EO0VBQ0EsSUFBSUksU0FBSjs7RUFFQSxLQUFLLE1BQU1DLFFBQVgsSUFBdUJGLFNBQXZCLEVBQWtDO0lBQ2hDLElBQUk7TUFDRkYsTUFBTSxHQUFHLE1BQU0sK0JBQU9JLFFBQVAsRUFBaUJmLE9BQWpCLENBQWY7O01BQ0EsSUFBSVcsTUFBSixFQUFZO1FBQ1ZDLHVCQUF1QixHQUFHRyxRQUExQjtRQUNBO01BQ0Q7SUFDRixDQU5ELENBTUUsT0FBT0MsS0FBUCxFQUFtQjtNQUNuQkYsU0FBUyxHQUFHRSxLQUFaO0lBQ0Q7RUFDRjs7RUFFRCxJQUFJLENBQUNMLE1BQUwsRUFBYTtJQUNYLElBQUlHLFNBQUosRUFBZTtNQUNiLE1BQU1BLFNBQU47SUFDRCxDQUZELE1BRU87TUFDTCxNQUFNLElBQUluQixLQUFKLENBQVUsZ0VBQVYsQ0FBTjtJQUNEO0VBQ0Y7O0VBRUQsTUFBTUMsYUFBYSxHQUFHSixxQ0FBcUMsQ0FBQ08sRUFBRSxDQUFDTixpQkFBSixFQUF1Qk0sRUFBRSxDQUFDTCxtQkFBMUIsQ0FBM0Q7RUFDQSxNQUFNUSxlQUFlLEdBQUcsSUFBSWUseURBQUosQ0FBa0MsSUFBSUMsaUVBQUosQ0FBc0NQLE1BQU0sQ0FBQ1EsT0FBN0MsRUFBc0R2QixhQUF0RCxDQUFsQyxFQUF3R0csRUFBRSxDQUFDcUIsY0FBM0csQ0FBeEI7RUFFQXJCLEVBQUUsQ0FBQ0csZUFBSCxHQUFxQkEsZUFBckI7RUFDQUgsRUFBRSxDQUFDc0IsaUJBQUgsR0FBdUJULHVCQUF2QjtBQUNELENBM0NNIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ColumnEncryptionAzureKeyVaultProvider = void 0;

var _identity = require("@azure/identity");

var _keyvaultKeys = require("@azure/keyvault-keys");

var _crypto = require("crypto");

var _url = require("url");

// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.
// Copyright (c) 2019 Microsoft Corporation
class ColumnEncryptionAzureKeyVaultProvider {
  constructor(clientId, clientKey, tenantId) {
    this.name = void 0;
    this.url = void 0;
    this.rsaEncryptionAlgorithmWithOAEPForAKV = void 0;
    this.firstVersion = void 0;
    this.credentials = void 0;
    this.azureKeyVaultDomainName = void 0;
    this.keyClient = void 0;
    this.name = 'AZURE_KEY_VAULT';
    this.azureKeyVaultDomainName = 'vault.azure.net';
    this.rsaEncryptionAlgorithmWithOAEPForAKV = 'RSA-OAEP';
    this.firstVersion = Buffer.from([0x01]);
    this.credentials = new _identity.ClientSecretCredential(tenantId, clientId, clientKey);
  }

  async decryptColumnEncryptionKey(masterKeyPath, encryptionAlgorithm, encryptedColumnEncryptionKey) {
    if (!encryptedColumnEncryptionKey) {
      throw new Error('Internal error. Encrypted column encryption key cannot be null.');
    }

    if (encryptedColumnEncryptionKey.length === 0) {
      throw new Error('Internal error. Empty encrypted column encryption key specified.');
    }

    encryptionAlgorithm = this.validateEncryptionAlgorithm(encryptionAlgorithm);
    const masterKey = await this.getMasterKey(masterKeyPath);
    const keySizeInBytes = this.getAKVKeySize(masterKey);
    const cryptoClient = this.createCryptoClient(masterKey);

    if (encryptedColumnEncryptionKey[0] !== this.firstVersion[0]) {
      throw new Error(`Specified encrypted column encryption key contains an invalid encryption algorithm version ${Buffer.from([encryptedColumnEncryptionKey[0]]).toString('hex')}. Expected version is ${Buffer.from([this.firstVersion[0]]).toString('hex')}.`);
    }

    let currentIndex = this.firstVersion.length;
    const keyPathLength = encryptedColumnEncryptionKey.readInt16LE(currentIndex);
    currentIndex += 2;
    const cipherTextLength = encryptedColumnEncryptionKey.readInt16LE(currentIndex);
    currentIndex += 2;
    currentIndex += keyPathLength;

    if (cipherTextLength !== keySizeInBytes) {
      throw new Error(`The specified encrypted column encryption key's ciphertext length: ${cipherTextLength} does not match the ciphertext length: ${keySizeInBytes} when using column master key (Azure Key Vault key) in ${masterKeyPath}. The encrypted column encryption key may be corrupt, or the specified Azure Key Vault key path may be incorrect.`);
    }

    const signatureLength = encryptedColumnEncryptionKey.length - currentIndex - cipherTextLength;

    if (signatureLength !== keySizeInBytes) {
      throw new Error(`The specified encrypted column encryption key's signature length: ${signatureLength} does not match the signature length: ${keySizeInBytes} when using column master key (Azure Key Vault key) in ${masterKeyPath}. The encrypted column encryption key may be corrupt, or the specified Azure Key Vault key path may be incorrect.`);
    }

    const cipherText = Buffer.alloc(cipherTextLength);
    encryptedColumnEncryptionKey.copy(cipherText, 0, currentIndex, currentIndex + cipherTextLength);
    currentIndex += cipherTextLength;
    const signature = Buffer.alloc(signatureLength);
    encryptedColumnEncryptionKey.copy(signature, 0, currentIndex, currentIndex + signatureLength);
    const hash = Buffer.alloc(encryptedColumnEncryptionKey.length - signature.length);
    encryptedColumnEncryptionKey.copy(hash, 0, 0, encryptedColumnEncryptionKey.length - signature.length);
    const messageDigest = (0, _crypto.createHash)('sha256');
    messageDigest.update(hash);
    const dataToVerify = messageDigest.digest();

    if (!dataToVerify) {
      throw new Error('Hash should not be null while decrypting encrypted column encryption key.');
    }

    const verifyKey = await cryptoClient.verify('RS256', dataToVerify, signature);

    if (!verifyKey.result) {
      throw new Error(`The specified encrypted column encryption key signature does not match the signature computed with the column master key (Asymmetric key in Azure Key Vault) in ${masterKeyPath}. The encrypted column encryption key may be corrupt, or the specified path may be incorrect.`);
    }

    const decryptedCEK = await this.azureKeyVaultUnWrap(cryptoClient, encryptionAlgorithm, cipherText);
    return decryptedCEK;
  }

  async encryptColumnEncryptionKey(masterKeyPath, encryptionAlgorithm, columnEncryptionKey) {
    if (!columnEncryptionKey) {
      throw new Error('Column encryption key cannot be null.');
    }

    if (columnEncryptionKey.length === 0) {
      throw new Error('Empty column encryption key specified.');
    }

    encryptionAlgorithm = this.validateEncryptionAlgorithm(encryptionAlgorithm);
    const masterKey = await this.getMasterKey(masterKeyPath);
    const keySizeInBytes = this.getAKVKeySize(masterKey);
    const cryptoClient = this.createCryptoClient(masterKey);
    const version = Buffer.from([this.firstVersion[0]]);
    const masterKeyPathBytes = Buffer.from(masterKeyPath.toLowerCase(), 'utf8');
    const keyPathLength = Buffer.alloc(2);
    keyPathLength[0] = masterKeyPathBytes.length & 0xff;
    keyPathLength[1] = masterKeyPathBytes.length >> 8 & 0xff;
    const cipherText = await this.azureKeyVaultWrap(cryptoClient, encryptionAlgorithm, columnEncryptionKey);
    const cipherTextLength = Buffer.alloc(2);
    cipherTextLength[0] = cipherText.length & 0xff;
    cipherTextLength[1] = cipherText.length >> 8 & 0xff;

    if (cipherText.length !== keySizeInBytes) {
      throw new Error('CipherText length does not match the RSA key size.');
    }

    const dataToHash = Buffer.alloc(version.length + keyPathLength.length + cipherTextLength.length + masterKeyPathBytes.length + cipherText.length);
    let destinationPosition = version.length;
    version.copy(dataToHash, 0, 0, version.length);
    keyPathLength.copy(dataToHash, destinationPosition, 0, keyPathLength.length);
    destinationPosition += keyPathLength.length;
    cipherTextLength.copy(dataToHash, destinationPosition, 0, cipherTextLength.length);
    destinationPosition += cipherTextLength.length;
    masterKeyPathBytes.copy(dataToHash, destinationPosition, 0, masterKeyPathBytes.length);
    destinationPosition += masterKeyPathBytes.length;
    cipherText.copy(dataToHash, destinationPosition, 0, cipherText.length);
    const messageDigest = (0, _crypto.createHash)('sha256');
    messageDigest.update(dataToHash);
    const dataToSign = messageDigest.digest();
    const signedHash = await this.azureKeyVaultSignedHashedData(cryptoClient, dataToSign);

    if (signedHash.length !== keySizeInBytes) {
      throw new Error('Signed hash length does not match the RSA key size.');
    }

    const verifyKey = await cryptoClient.verify('RS256', dataToSign, signedHash);

    if (!verifyKey.result) {
      throw new Error('Invalid signature of the encrypted column encryption key computed.');
    }

    const encryptedColumnEncryptionKeyLength = version.length + cipherTextLength.length + keyPathLength.length + cipherText.length + masterKeyPathBytes.length + signedHash.length;
    const encryptedColumnEncryptionKey = Buffer.alloc(encryptedColumnEncryptionKeyLength);
    let currentIndex = 0;
    version.copy(encryptedColumnEncryptionKey, currentIndex, 0, version.length);
    currentIndex += version.length;
    keyPathLength.copy(encryptedColumnEncryptionKey, currentIndex, 0, keyPathLength.length);
    currentIndex += keyPathLength.length;
    cipherTextLength.copy(encryptedColumnEncryptionKey, currentIndex, 0, cipherTextLength.length);
    currentIndex += cipherTextLength.length;
    masterKeyPathBytes.copy(encryptedColumnEncryptionKey, currentIndex, 0, masterKeyPathBytes.length);
    currentIndex += masterKeyPathBytes.length;
    cipherText.copy(encryptedColumnEncryptionKey, currentIndex, 0, cipherText.length);
    currentIndex += cipherText.length;
    signedHash.copy(encryptedColumnEncryptionKey, currentIndex, 0, signedHash.length);
    return encryptedColumnEncryptionKey;
  }

  async getMasterKey(masterKeyPath) {
    if (!masterKeyPath) {
      throw new Error('Master key path cannot be null or undefined');
    }

    const keyParts = this.parsePath(masterKeyPath);
    this.createKeyClient(keyParts.vaultUrl);
    return await this.keyClient.getKey(keyParts.name, keyParts.version ? {
      version: keyParts.version
    } : {});
  }

  createKeyClient(keyVaultUrl) {
    if (!keyVaultUrl) {
      throw new Error('Cannot create key client with null or undefined keyVaultUrl');
    }

    if (!this.keyClient) {
      this.url = keyVaultUrl;
      this.keyClient = new _keyvaultKeys.KeyClient(keyVaultUrl, this.credentials);
    }
  }

  createCryptoClient(masterKey) {
    if (!masterKey) {
      throw new Error('Cannot create CryptographyClient with null or undefined masterKey');
    }

    return new _keyvaultKeys.CryptographyClient(masterKey, this.credentials);
  }

  parsePath(masterKeyPath) {
    if (!masterKeyPath || masterKeyPath.trim() === '') {
      throw new Error('Azure Key Vault key path cannot be null.');
    }

    let baseUri;

    try {
      baseUri = (0, _url.parse)(masterKeyPath, true, true);
    } catch {
      throw new Error(`Invalid keys identifier: ${masterKeyPath}. Not a valid URI`);
    }

    if (!baseUri.hostname || !baseUri.hostname.toLowerCase().endsWith(this.azureKeyVaultDomainName)) {
      throw new Error(`Invalid Azure Key Vault key path specified: ${masterKeyPath}.`);
    } // Path is of the form '/collection/name[/version]'


    const segments = (baseUri.pathname || '').split('/');

    if (segments.length !== 3 && segments.length !== 4) {
      throw new Error(`Invalid keys identifier: ${masterKeyPath}. Bad number of segments: ${segments.length}`);
    }

    if ('keys' !== segments[1]) {
      throw new Error(`Invalid keys identifier: ${masterKeyPath}. segment [1] should be "keys", found "${segments[1]}"`);
    }

    const vaultUrl = `${baseUri.protocol}//${baseUri.host}`;
    const name = segments[2];
    const version = segments.length === 4 ? segments[3] : undefined;
    return {
      vaultUrl,
      name,
      version
    };
  }

  async azureKeyVaultSignedHashedData(cryptoClient, dataToSign) {
    if (!cryptoClient) {
      throw new Error('Azure KVS Crypto Client is not defined.');
    }

    const signedData = await cryptoClient.sign('RS256', dataToSign);
    return Buffer.from(signedData.result);
  }

  async azureKeyVaultWrap(cryptoClient, encryptionAlgorithm, columnEncryptionKey) {
    if (!cryptoClient) {
      throw new Error('Azure KVS Crypto Client is not defined.');
    }

    if (!columnEncryptionKey) {
      throw new Error('Column encryption key cannot be null.');
    }

    const wrappedKey = await cryptoClient.wrapKey(encryptionAlgorithm, columnEncryptionKey);
    return Buffer.from(wrappedKey.result);
  }

  async azureKeyVaultUnWrap(cryptoClient, encryptionAlgorithm, encryptedColumnEncryptionKey) {
    if (!cryptoClient) {
      throw new Error('Azure KVS Crypto Client is not defined.');
    }

    if (!encryptionAlgorithm) {
      throw new Error('Encryption Algorithm cannot be null or undefined');
    }

    if (!encryptedColumnEncryptionKey) {
      throw new Error('Encrypted column encryption key cannot be null.');
    }

    if (encryptedColumnEncryptionKey.length === 0) {
      throw new Error('Encrypted Column Encryption Key length should not be zero.');
    }

    const unwrappedKey = await cryptoClient.unwrapKey(encryptionAlgorithm, encryptedColumnEncryptionKey);
    return Buffer.from(unwrappedKey.result);
  }

  getAKVKeySize(retrievedKey) {
    if (!retrievedKey) {
      throw new Error('Retrieved key cannot be null or undefined');
    }

    const key = retrievedKey.key;

    if (!key) {
      throw new Error(`Key does not exist ${retrievedKey.name}`);
    }

    const kty = key && key.kty && key.kty.toString().toUpperCase();

    if (!kty || 'RSA'.localeCompare(kty, 'en') !== 0) {
      throw new Error(`Cannot use a non-RSA key: ${kty}.`);
    }

    const keyLength = key && key.n && key.n.length;
    return keyLength || 0;
  }

  validateEncryptionAlgorithm(encryptionAlgorithm) {
    if (!encryptionAlgorithm) {
      throw new Error('Key encryption algorithm cannot be null.');
    }

    if ('RSA_OAEP'.localeCompare(encryptionAlgorithm.toUpperCase(), 'en') === 0) {
      encryptionAlgorithm = 'RSA-OAEP';
    }

    if (this.rsaEncryptionAlgorithmWithOAEPForAKV.localeCompare(encryptionAlgorithm.trim().toUpperCase(), 'en') !== 0) {
      throw new Error(`Invalid key encryption algorithm specified: ${encryptionAlgorithm}. Expected value: ${this.rsaEncryptionAlgorithmWithOAEPForAKV}.`);
    }

    return encryptionAlgorithm;
  }

}

exports.ColumnEncryptionAzureKeyVaultProvider = ColumnEncryptionAzureKeyVaultProvider;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb2x1bW5FbmNyeXB0aW9uQXp1cmVLZXlWYXVsdFByb3ZpZGVyIiwiY29uc3RydWN0b3IiLCJjbGllbnRJZCIsImNsaWVudEtleSIsInRlbmFudElkIiwibmFtZSIsInVybCIsInJzYUVuY3J5cHRpb25BbGdvcml0aG1XaXRoT0FFUEZvckFLViIsImZpcnN0VmVyc2lvbiIsImNyZWRlbnRpYWxzIiwiYXp1cmVLZXlWYXVsdERvbWFpbk5hbWUiLCJrZXlDbGllbnQiLCJCdWZmZXIiLCJmcm9tIiwiQ2xpZW50U2VjcmV0Q3JlZGVudGlhbCIsImRlY3J5cHRDb2x1bW5FbmNyeXB0aW9uS2V5IiwibWFzdGVyS2V5UGF0aCIsImVuY3J5cHRpb25BbGdvcml0aG0iLCJlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5IiwiRXJyb3IiLCJsZW5ndGgiLCJ2YWxpZGF0ZUVuY3J5cHRpb25BbGdvcml0aG0iLCJtYXN0ZXJLZXkiLCJnZXRNYXN0ZXJLZXkiLCJrZXlTaXplSW5CeXRlcyIsImdldEFLVktleVNpemUiLCJjcnlwdG9DbGllbnQiLCJjcmVhdGVDcnlwdG9DbGllbnQiLCJ0b1N0cmluZyIsImN1cnJlbnRJbmRleCIsImtleVBhdGhMZW5ndGgiLCJyZWFkSW50MTZMRSIsImNpcGhlclRleHRMZW5ndGgiLCJzaWduYXR1cmVMZW5ndGgiLCJjaXBoZXJUZXh0IiwiYWxsb2MiLCJjb3B5Iiwic2lnbmF0dXJlIiwiaGFzaCIsIm1lc3NhZ2VEaWdlc3QiLCJ1cGRhdGUiLCJkYXRhVG9WZXJpZnkiLCJkaWdlc3QiLCJ2ZXJpZnlLZXkiLCJ2ZXJpZnkiLCJyZXN1bHQiLCJkZWNyeXB0ZWRDRUsiLCJhenVyZUtleVZhdWx0VW5XcmFwIiwiZW5jcnlwdENvbHVtbkVuY3J5cHRpb25LZXkiLCJjb2x1bW5FbmNyeXB0aW9uS2V5IiwidmVyc2lvbiIsIm1hc3RlcktleVBhdGhCeXRlcyIsInRvTG93ZXJDYXNlIiwiYXp1cmVLZXlWYXVsdFdyYXAiLCJkYXRhVG9IYXNoIiwiZGVzdGluYXRpb25Qb3NpdGlvbiIsImRhdGFUb1NpZ24iLCJzaWduZWRIYXNoIiwiYXp1cmVLZXlWYXVsdFNpZ25lZEhhc2hlZERhdGEiLCJlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5TGVuZ3RoIiwia2V5UGFydHMiLCJwYXJzZVBhdGgiLCJjcmVhdGVLZXlDbGllbnQiLCJ2YXVsdFVybCIsImdldEtleSIsImtleVZhdWx0VXJsIiwiS2V5Q2xpZW50IiwiQ3J5cHRvZ3JhcGh5Q2xpZW50IiwidHJpbSIsImJhc2VVcmkiLCJob3N0bmFtZSIsImVuZHNXaXRoIiwic2VnbWVudHMiLCJwYXRobmFtZSIsInNwbGl0IiwicHJvdG9jb2wiLCJob3N0IiwidW5kZWZpbmVkIiwic2lnbmVkRGF0YSIsInNpZ24iLCJ3cmFwcGVkS2V5Iiwid3JhcEtleSIsInVud3JhcHBlZEtleSIsInVud3JhcEtleSIsInJldHJpZXZlZEtleSIsImtleSIsImt0eSIsInRvVXBwZXJDYXNlIiwibG9jYWxlQ29tcGFyZSIsImtleUxlbmd0aCIsIm4iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYWx3YXlzLWVuY3J5cHRlZC9rZXlzdG9yZS1wcm92aWRlci1henVyZS1rZXktdmF1bHQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBgbXNzcWwtamRiY2AgbGlicmFyeSBwdWJsaXNoZWQgdW5kZXIgdGhlIGNvbmRpdGlvbnMgb2YgTUlUIGxpY2Vuc2UuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTkgTWljcm9zb2Z0IENvcnBvcmF0aW9uXG5cbmltcG9ydCB7IENsaWVudFNlY3JldENyZWRlbnRpYWwgfSBmcm9tICdAYXp1cmUvaWRlbnRpdHknO1xuaW1wb3J0IHsgQ3J5cHRvZ3JhcGh5Q2xpZW50LCBLZXlXcmFwQWxnb3JpdGhtLCBLZXlDbGllbnQsIEtleVZhdWx0S2V5IH0gZnJvbSAnQGF6dXJlL2tleXZhdWx0LWtleXMnO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gJ3VybCc7XG5cbmludGVyZmFjZSBQYXJzZWRLZXlQYXRoIHtcbiAgdmF1bHRVcmw6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICB2ZXJzaW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgQ29sdW1uRW5jcnlwdGlvbkF6dXJlS2V5VmF1bHRQcm92aWRlciB7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgdXJsOiB1bmRlZmluZWQgfCBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcnNhRW5jcnlwdGlvbkFsZ29yaXRobVdpdGhPQUVQRm9yQUtWOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlyc3RWZXJzaW9uOiBCdWZmZXI7XG4gIHByaXZhdGUgY3JlZGVudGlhbHM6IENsaWVudFNlY3JldENyZWRlbnRpYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXp1cmVLZXlWYXVsdERvbWFpbk5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBrZXlDbGllbnQ6IHVuZGVmaW5lZCB8IEtleUNsaWVudDtcblxuICBjb25zdHJ1Y3RvcihjbGllbnRJZDogc3RyaW5nLCBjbGllbnRLZXk6IHN0cmluZywgdGVuYW50SWQ6IHN0cmluZykge1xuICAgIHRoaXMubmFtZSA9ICdBWlVSRV9LRVlfVkFVTFQnO1xuICAgIHRoaXMuYXp1cmVLZXlWYXVsdERvbWFpbk5hbWUgPSAndmF1bHQuYXp1cmUubmV0JztcbiAgICB0aGlzLnJzYUVuY3J5cHRpb25BbGdvcml0aG1XaXRoT0FFUEZvckFLViA9ICdSU0EtT0FFUCc7XG4gICAgdGhpcy5maXJzdFZlcnNpb24gPSBCdWZmZXIuZnJvbShbMHgwMV0pO1xuICAgIHRoaXMuY3JlZGVudGlhbHMgPSBuZXcgQ2xpZW50U2VjcmV0Q3JlZGVudGlhbCh0ZW5hbnRJZCwgY2xpZW50SWQsIGNsaWVudEtleSk7XG4gIH1cblxuICBhc3luYyBkZWNyeXB0Q29sdW1uRW5jcnlwdGlvbktleShtYXN0ZXJLZXlQYXRoOiBzdHJpbmcsIGVuY3J5cHRpb25BbGdvcml0aG06IHN0cmluZywgZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleTogQnVmZmVyKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBpZiAoIWVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW50ZXJuYWwgZXJyb3IuIEVuY3J5cHRlZCBjb2x1bW4gZW5jcnlwdGlvbiBrZXkgY2Fubm90IGJlIG51bGwuJyk7XG4gICAgfVxuXG4gICAgaWYgKGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludGVybmFsIGVycm9yLiBFbXB0eSBlbmNyeXB0ZWQgY29sdW1uIGVuY3J5cHRpb24ga2V5IHNwZWNpZmllZC4nKTtcbiAgICB9XG5cbiAgICBlbmNyeXB0aW9uQWxnb3JpdGhtID0gdGhpcy52YWxpZGF0ZUVuY3J5cHRpb25BbGdvcml0aG0oZW5jcnlwdGlvbkFsZ29yaXRobSk7XG5cbiAgICBjb25zdCBtYXN0ZXJLZXkgPSBhd2FpdCB0aGlzLmdldE1hc3RlcktleShtYXN0ZXJLZXlQYXRoKTtcblxuICAgIGNvbnN0IGtleVNpemVJbkJ5dGVzID0gdGhpcy5nZXRBS1ZLZXlTaXplKG1hc3RlcktleSk7XG5cbiAgICBjb25zdCBjcnlwdG9DbGllbnQgPSB0aGlzLmNyZWF0ZUNyeXB0b0NsaWVudChtYXN0ZXJLZXkpO1xuXG4gICAgaWYgKGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXlbMF0gIT09IHRoaXMuZmlyc3RWZXJzaW9uWzBdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNwZWNpZmllZCBlbmNyeXB0ZWQgY29sdW1uIGVuY3J5cHRpb24ga2V5IGNvbnRhaW5zIGFuIGludmFsaWQgZW5jcnlwdGlvbiBhbGdvcml0aG0gdmVyc2lvbiAke0J1ZmZlci5mcm9tKFtlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5WzBdXSkudG9TdHJpbmcoJ2hleCcpfS4gRXhwZWN0ZWQgdmVyc2lvbiBpcyAke0J1ZmZlci5mcm9tKFt0aGlzLmZpcnN0VmVyc2lvblswXV0pLnRvU3RyaW5nKCdoZXgnKX0uYCk7XG4gICAgfVxuXG4gICAgbGV0IGN1cnJlbnRJbmRleCA9IHRoaXMuZmlyc3RWZXJzaW9uLmxlbmd0aDtcbiAgICBjb25zdCBrZXlQYXRoTGVuZ3RoOiBudW1iZXIgPSBlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5LnJlYWRJbnQxNkxFKGN1cnJlbnRJbmRleCk7XG5cbiAgICBjdXJyZW50SW5kZXggKz0gMjtcblxuICAgIGNvbnN0IGNpcGhlclRleHRMZW5ndGg6IG51bWJlciA9IGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXkucmVhZEludDE2TEUoY3VycmVudEluZGV4KTtcblxuICAgIGN1cnJlbnRJbmRleCArPSAyO1xuXG4gICAgY3VycmVudEluZGV4ICs9IGtleVBhdGhMZW5ndGg7XG5cbiAgICBpZiAoY2lwaGVyVGV4dExlbmd0aCAhPT0ga2V5U2l6ZUluQnl0ZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHNwZWNpZmllZCBlbmNyeXB0ZWQgY29sdW1uIGVuY3J5cHRpb24ga2V5J3MgY2lwaGVydGV4dCBsZW5ndGg6ICR7Y2lwaGVyVGV4dExlbmd0aH0gZG9lcyBub3QgbWF0Y2ggdGhlIGNpcGhlcnRleHQgbGVuZ3RoOiAke2tleVNpemVJbkJ5dGVzfSB3aGVuIHVzaW5nIGNvbHVtbiBtYXN0ZXIga2V5IChBenVyZSBLZXkgVmF1bHQga2V5KSBpbiAke21hc3RlcktleVBhdGh9LiBUaGUgZW5jcnlwdGVkIGNvbHVtbiBlbmNyeXB0aW9uIGtleSBtYXkgYmUgY29ycnVwdCwgb3IgdGhlIHNwZWNpZmllZCBBenVyZSBLZXkgVmF1bHQga2V5IHBhdGggbWF5IGJlIGluY29ycmVjdC5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWduYXR1cmVMZW5ndGg6IG51bWJlciA9IGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXkubGVuZ3RoIC0gY3VycmVudEluZGV4IC0gY2lwaGVyVGV4dExlbmd0aDtcblxuICAgIGlmIChzaWduYXR1cmVMZW5ndGggIT09IGtleVNpemVJbkJ5dGVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBzcGVjaWZpZWQgZW5jcnlwdGVkIGNvbHVtbiBlbmNyeXB0aW9uIGtleSdzIHNpZ25hdHVyZSBsZW5ndGg6ICR7c2lnbmF0dXJlTGVuZ3RofSBkb2VzIG5vdCBtYXRjaCB0aGUgc2lnbmF0dXJlIGxlbmd0aDogJHtrZXlTaXplSW5CeXRlc30gd2hlbiB1c2luZyBjb2x1bW4gbWFzdGVyIGtleSAoQXp1cmUgS2V5IFZhdWx0IGtleSkgaW4gJHttYXN0ZXJLZXlQYXRofS4gVGhlIGVuY3J5cHRlZCBjb2x1bW4gZW5jcnlwdGlvbiBrZXkgbWF5IGJlIGNvcnJ1cHQsIG9yIHRoZSBzcGVjaWZpZWQgQXp1cmUgS2V5IFZhdWx0IGtleSBwYXRoIG1heSBiZSBpbmNvcnJlY3QuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgY2lwaGVyVGV4dCA9IEJ1ZmZlci5hbGxvYyhjaXBoZXJUZXh0TGVuZ3RoKTtcbiAgICBlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5LmNvcHkoY2lwaGVyVGV4dCwgMCwgY3VycmVudEluZGV4LCBjdXJyZW50SW5kZXggKyBjaXBoZXJUZXh0TGVuZ3RoKTtcbiAgICBjdXJyZW50SW5kZXggKz0gY2lwaGVyVGV4dExlbmd0aDtcblxuICAgIGNvbnN0IHNpZ25hdHVyZSA9IEJ1ZmZlci5hbGxvYyhzaWduYXR1cmVMZW5ndGgpO1xuICAgIGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXkuY29weShzaWduYXR1cmUsIDAsIGN1cnJlbnRJbmRleCwgY3VycmVudEluZGV4ICsgc2lnbmF0dXJlTGVuZ3RoKTtcblxuICAgIGNvbnN0IGhhc2ggPSBCdWZmZXIuYWxsb2MoZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleS5sZW5ndGggLSBzaWduYXR1cmUubGVuZ3RoKTtcbiAgICBlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5LmNvcHkoaGFzaCwgMCwgMCwgZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleS5sZW5ndGggLSBzaWduYXR1cmUubGVuZ3RoKTtcblxuICAgIGNvbnN0IG1lc3NhZ2VEaWdlc3QgPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcbiAgICBtZXNzYWdlRGlnZXN0LnVwZGF0ZShoYXNoKTtcblxuICAgIGNvbnN0IGRhdGFUb1ZlcmlmeTogQnVmZmVyID0gbWVzc2FnZURpZ2VzdC5kaWdlc3QoKTtcblxuICAgIGlmICghZGF0YVRvVmVyaWZ5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0hhc2ggc2hvdWxkIG5vdCBiZSBudWxsIHdoaWxlIGRlY3J5cHRpbmcgZW5jcnlwdGVkIGNvbHVtbiBlbmNyeXB0aW9uIGtleS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCB2ZXJpZnlLZXkgPSBhd2FpdCBjcnlwdG9DbGllbnQudmVyaWZ5KCdSUzI1NicsIGRhdGFUb1ZlcmlmeSwgc2lnbmF0dXJlKTtcbiAgICBpZiAoIXZlcmlmeUtleS5yZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHNwZWNpZmllZCBlbmNyeXB0ZWQgY29sdW1uIGVuY3J5cHRpb24ga2V5IHNpZ25hdHVyZSBkb2VzIG5vdCBtYXRjaCB0aGUgc2lnbmF0dXJlIGNvbXB1dGVkIHdpdGggdGhlIGNvbHVtbiBtYXN0ZXIga2V5IChBc3ltbWV0cmljIGtleSBpbiBBenVyZSBLZXkgVmF1bHQpIGluICR7bWFzdGVyS2V5UGF0aH0uIFRoZSBlbmNyeXB0ZWQgY29sdW1uIGVuY3J5cHRpb24ga2V5IG1heSBiZSBjb3JydXB0LCBvciB0aGUgc3BlY2lmaWVkIHBhdGggbWF5IGJlIGluY29ycmVjdC5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNyeXB0ZWRDRUs6IEJ1ZmZlciA9IGF3YWl0IHRoaXMuYXp1cmVLZXlWYXVsdFVuV3JhcChjcnlwdG9DbGllbnQsIGVuY3J5cHRpb25BbGdvcml0aG0sIGNpcGhlclRleHQpO1xuXG4gICAgcmV0dXJuIGRlY3J5cHRlZENFSztcbiAgfVxuXG4gIGFzeW5jIGVuY3J5cHRDb2x1bW5FbmNyeXB0aW9uS2V5KG1hc3RlcktleVBhdGg6IHN0cmluZywgZW5jcnlwdGlvbkFsZ29yaXRobTogc3RyaW5nLCBjb2x1bW5FbmNyeXB0aW9uS2V5OiBCdWZmZXIpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGlmICghY29sdW1uRW5jcnlwdGlvbktleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2x1bW4gZW5jcnlwdGlvbiBrZXkgY2Fubm90IGJlIG51bGwuJyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbHVtbkVuY3J5cHRpb25LZXkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VtcHR5IGNvbHVtbiBlbmNyeXB0aW9uIGtleSBzcGVjaWZpZWQuJyk7XG4gICAgfVxuXG4gICAgZW5jcnlwdGlvbkFsZ29yaXRobSA9IHRoaXMudmFsaWRhdGVFbmNyeXB0aW9uQWxnb3JpdGhtKGVuY3J5cHRpb25BbGdvcml0aG0pO1xuXG4gICAgY29uc3QgbWFzdGVyS2V5ID0gYXdhaXQgdGhpcy5nZXRNYXN0ZXJLZXkobWFzdGVyS2V5UGF0aCk7XG5cbiAgICBjb25zdCBrZXlTaXplSW5CeXRlcyA9IHRoaXMuZ2V0QUtWS2V5U2l6ZShtYXN0ZXJLZXkpO1xuXG4gICAgY29uc3QgY3J5cHRvQ2xpZW50ID0gdGhpcy5jcmVhdGVDcnlwdG9DbGllbnQobWFzdGVyS2V5KTtcblxuICAgIGNvbnN0IHZlcnNpb24gPSBCdWZmZXIuZnJvbShbdGhpcy5maXJzdFZlcnNpb25bMF1dKTtcblxuICAgIGNvbnN0IG1hc3RlcktleVBhdGhCeXRlczogQnVmZmVyID0gQnVmZmVyLmZyb20obWFzdGVyS2V5UGF0aC50b0xvd2VyQ2FzZSgpLCAndXRmOCcpO1xuXG4gICAgY29uc3Qga2V5UGF0aExlbmd0aDogQnVmZmVyID0gQnVmZmVyLmFsbG9jKDIpO1xuXG4gICAga2V5UGF0aExlbmd0aFswXSA9IG1hc3RlcktleVBhdGhCeXRlcy5sZW5ndGggJiAweGZmO1xuICAgIGtleVBhdGhMZW5ndGhbMV0gPSBtYXN0ZXJLZXlQYXRoQnl0ZXMubGVuZ3RoID4+IDggJiAweGZmO1xuXG4gICAgY29uc3QgY2lwaGVyVGV4dDogQnVmZmVyID0gYXdhaXQgdGhpcy5henVyZUtleVZhdWx0V3JhcChjcnlwdG9DbGllbnQsIGVuY3J5cHRpb25BbGdvcml0aG0sIGNvbHVtbkVuY3J5cHRpb25LZXkpO1xuXG4gICAgY29uc3QgY2lwaGVyVGV4dExlbmd0aDogQnVmZmVyID0gQnVmZmVyLmFsbG9jKDIpO1xuXG4gICAgY2lwaGVyVGV4dExlbmd0aFswXSA9IGNpcGhlclRleHQubGVuZ3RoICYgMHhmZjtcbiAgICBjaXBoZXJUZXh0TGVuZ3RoWzFdID0gY2lwaGVyVGV4dC5sZW5ndGggPj4gOCAmIDB4ZmY7XG5cbiAgICBpZiAoY2lwaGVyVGV4dC5sZW5ndGggIT09IGtleVNpemVJbkJ5dGVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NpcGhlclRleHQgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIHRoZSBSU0Ega2V5IHNpemUuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YVRvSGFzaDogQnVmZmVyID0gQnVmZmVyLmFsbG9jKHZlcnNpb24ubGVuZ3RoICsga2V5UGF0aExlbmd0aC5sZW5ndGggKyBjaXBoZXJUZXh0TGVuZ3RoLmxlbmd0aCArIG1hc3RlcktleVBhdGhCeXRlcy5sZW5ndGggKyBjaXBoZXJUZXh0Lmxlbmd0aCk7XG4gICAgbGV0IGRlc3RpbmF0aW9uUG9zaXRpb246IG51bWJlciA9IHZlcnNpb24ubGVuZ3RoO1xuICAgIHZlcnNpb24uY29weShkYXRhVG9IYXNoLCAwLCAwLCB2ZXJzaW9uLmxlbmd0aCk7XG5cbiAgICBrZXlQYXRoTGVuZ3RoLmNvcHkoZGF0YVRvSGFzaCwgZGVzdGluYXRpb25Qb3NpdGlvbiwgMCwga2V5UGF0aExlbmd0aC5sZW5ndGgpO1xuICAgIGRlc3RpbmF0aW9uUG9zaXRpb24gKz0ga2V5UGF0aExlbmd0aC5sZW5ndGg7XG5cbiAgICBjaXBoZXJUZXh0TGVuZ3RoLmNvcHkoZGF0YVRvSGFzaCwgZGVzdGluYXRpb25Qb3NpdGlvbiwgMCwgY2lwaGVyVGV4dExlbmd0aC5sZW5ndGgpO1xuICAgIGRlc3RpbmF0aW9uUG9zaXRpb24gKz0gY2lwaGVyVGV4dExlbmd0aC5sZW5ndGg7XG5cbiAgICBtYXN0ZXJLZXlQYXRoQnl0ZXMuY29weShkYXRhVG9IYXNoLCBkZXN0aW5hdGlvblBvc2l0aW9uLCAwLCBtYXN0ZXJLZXlQYXRoQnl0ZXMubGVuZ3RoKTtcbiAgICBkZXN0aW5hdGlvblBvc2l0aW9uICs9IG1hc3RlcktleVBhdGhCeXRlcy5sZW5ndGg7XG5cbiAgICBjaXBoZXJUZXh0LmNvcHkoZGF0YVRvSGFzaCwgZGVzdGluYXRpb25Qb3NpdGlvbiwgMCwgY2lwaGVyVGV4dC5sZW5ndGgpO1xuXG4gICAgY29uc3QgbWVzc2FnZURpZ2VzdCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuXG4gICAgbWVzc2FnZURpZ2VzdC51cGRhdGUoZGF0YVRvSGFzaCk7XG5cbiAgICBjb25zdCBkYXRhVG9TaWduOiBCdWZmZXIgPSBtZXNzYWdlRGlnZXN0LmRpZ2VzdCgpO1xuXG4gICAgY29uc3Qgc2lnbmVkSGFzaDogQnVmZmVyID0gYXdhaXQgdGhpcy5henVyZUtleVZhdWx0U2lnbmVkSGFzaGVkRGF0YShjcnlwdG9DbGllbnQsIGRhdGFUb1NpZ24pO1xuICAgIGlmIChzaWduZWRIYXNoLmxlbmd0aCAhPT0ga2V5U2l6ZUluQnl0ZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2lnbmVkIGhhc2ggbGVuZ3RoIGRvZXMgbm90IG1hdGNoIHRoZSBSU0Ega2V5IHNpemUuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdmVyaWZ5S2V5ID0gYXdhaXQgY3J5cHRvQ2xpZW50LnZlcmlmeSgnUlMyNTYnLCBkYXRhVG9TaWduLCBzaWduZWRIYXNoKTtcblxuICAgIGlmICghdmVyaWZ5S2V5LnJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHNpZ25hdHVyZSBvZiB0aGUgZW5jcnlwdGVkIGNvbHVtbiBlbmNyeXB0aW9uIGtleSBjb21wdXRlZC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5TGVuZ3RoOiBudW1iZXIgPSB2ZXJzaW9uLmxlbmd0aCArIGNpcGhlclRleHRMZW5ndGgubGVuZ3RoICsga2V5UGF0aExlbmd0aC5sZW5ndGggKyBjaXBoZXJUZXh0Lmxlbmd0aCArIG1hc3RlcktleVBhdGhCeXRlcy5sZW5ndGggKyBzaWduZWRIYXNoLmxlbmd0aDtcbiAgICBjb25zdCBlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5OiBCdWZmZXIgPSBCdWZmZXIuYWxsb2MoZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleUxlbmd0aCk7XG5cbiAgICBsZXQgY3VycmVudEluZGV4ID0gMDtcbiAgICB2ZXJzaW9uLmNvcHkoZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleSwgY3VycmVudEluZGV4LCAwLCB2ZXJzaW9uLmxlbmd0aCk7XG4gICAgY3VycmVudEluZGV4ICs9IHZlcnNpb24ubGVuZ3RoO1xuXG4gICAga2V5UGF0aExlbmd0aC5jb3B5KGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXksIGN1cnJlbnRJbmRleCwgMCwga2V5UGF0aExlbmd0aC5sZW5ndGgpO1xuICAgIGN1cnJlbnRJbmRleCArPSBrZXlQYXRoTGVuZ3RoLmxlbmd0aDtcblxuICAgIGNpcGhlclRleHRMZW5ndGguY29weShlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5LCBjdXJyZW50SW5kZXgsIDAsIGNpcGhlclRleHRMZW5ndGgubGVuZ3RoKTtcbiAgICBjdXJyZW50SW5kZXggKz0gY2lwaGVyVGV4dExlbmd0aC5sZW5ndGg7XG5cbiAgICBtYXN0ZXJLZXlQYXRoQnl0ZXMuY29weShlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5LCBjdXJyZW50SW5kZXgsIDAsIG1hc3RlcktleVBhdGhCeXRlcy5sZW5ndGgpO1xuICAgIGN1cnJlbnRJbmRleCArPSBtYXN0ZXJLZXlQYXRoQnl0ZXMubGVuZ3RoO1xuXG4gICAgY2lwaGVyVGV4dC5jb3B5KGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXksIGN1cnJlbnRJbmRleCwgMCwgY2lwaGVyVGV4dC5sZW5ndGgpO1xuICAgIGN1cnJlbnRJbmRleCArPSBjaXBoZXJUZXh0Lmxlbmd0aDtcblxuICAgIHNpZ25lZEhhc2guY29weShlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5LCBjdXJyZW50SW5kZXgsIDAsIHNpZ25lZEhhc2gubGVuZ3RoKTtcblxuICAgIHJldHVybiBlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRNYXN0ZXJLZXkobWFzdGVyS2V5UGF0aDogc3RyaW5nKTogUHJvbWlzZTxLZXlWYXVsdEtleT4ge1xuICAgIGlmICghbWFzdGVyS2V5UGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYXN0ZXIga2V5IHBhdGggY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuICAgIGNvbnN0IGtleVBhcnRzID0gdGhpcy5wYXJzZVBhdGgobWFzdGVyS2V5UGF0aCk7XG5cbiAgICB0aGlzLmNyZWF0ZUtleUNsaWVudChrZXlQYXJ0cy52YXVsdFVybCk7XG5cbiAgICByZXR1cm4gYXdhaXQgKHRoaXMua2V5Q2xpZW50IGFzIEtleUNsaWVudCkuZ2V0S2V5KGtleVBhcnRzLm5hbWUsIGtleVBhcnRzLnZlcnNpb24gPyB7IHZlcnNpb246IGtleVBhcnRzLnZlcnNpb24gfSA6IHt9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlS2V5Q2xpZW50KGtleVZhdWx0VXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIWtleVZhdWx0VXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUga2V5IGNsaWVudCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkIGtleVZhdWx0VXJsJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5rZXlDbGllbnQpIHtcbiAgICAgIHRoaXMudXJsID0ga2V5VmF1bHRVcmw7XG4gICAgICB0aGlzLmtleUNsaWVudCA9IG5ldyBLZXlDbGllbnQoa2V5VmF1bHRVcmwsIHRoaXMuY3JlZGVudGlhbHMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ3J5cHRvQ2xpZW50KG1hc3RlcktleTogS2V5VmF1bHRLZXkpOiBDcnlwdG9ncmFwaHlDbGllbnQge1xuICAgIGlmICghbWFzdGVyS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgQ3J5cHRvZ3JhcGh5Q2xpZW50IHdpdGggbnVsbCBvciB1bmRlZmluZWQgbWFzdGVyS2V5Jyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQ3J5cHRvZ3JhcGh5Q2xpZW50KG1hc3RlcktleSwgdGhpcy5jcmVkZW50aWFscyk7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlUGF0aChtYXN0ZXJLZXlQYXRoOiBzdHJpbmcpOiBQYXJzZWRLZXlQYXRoIHtcbiAgICBpZiAoIW1hc3RlcktleVBhdGggfHwgbWFzdGVyS2V5UGF0aC50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F6dXJlIEtleSBWYXVsdCBrZXkgcGF0aCBjYW5ub3QgYmUgbnVsbC4nKTtcbiAgICB9XG5cbiAgICBsZXQgYmFzZVVyaTtcbiAgICB0cnkge1xuICAgICAgYmFzZVVyaSA9IHBhcnNlKG1hc3RlcktleVBhdGgsIHRydWUsIHRydWUpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGtleXMgaWRlbnRpZmllcjogJHttYXN0ZXJLZXlQYXRofS4gTm90IGEgdmFsaWQgVVJJYCk7XG4gICAgfVxuXG4gICAgaWYgKCFiYXNlVXJpLmhvc3RuYW1lIHx8ICFiYXNlVXJpLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgodGhpcy5henVyZUtleVZhdWx0RG9tYWluTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBBenVyZSBLZXkgVmF1bHQga2V5IHBhdGggc3BlY2lmaWVkOiAke21hc3RlcktleVBhdGh9LmApO1xuICAgIH1cblxuICAgIC8vIFBhdGggaXMgb2YgdGhlIGZvcm0gJy9jb2xsZWN0aW9uL25hbWVbL3ZlcnNpb25dJ1xuICAgIGNvbnN0IHNlZ21lbnRzID0gKGJhc2VVcmkucGF0aG5hbWUgfHwgJycpLnNwbGl0KCcvJyk7XG4gICAgaWYgKHNlZ21lbnRzLmxlbmd0aCAhPT0gMyAmJiBzZWdtZW50cy5sZW5ndGggIT09IDQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQga2V5cyBpZGVudGlmaWVyOiAke21hc3RlcktleVBhdGh9LiBCYWQgbnVtYmVyIG9mIHNlZ21lbnRzOiAke3NlZ21lbnRzLmxlbmd0aH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICgna2V5cycgIT09IHNlZ21lbnRzWzFdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGtleXMgaWRlbnRpZmllcjogJHttYXN0ZXJLZXlQYXRofS4gc2VnbWVudCBbMV0gc2hvdWxkIGJlIFwia2V5c1wiLCBmb3VuZCBcIiR7c2VnbWVudHNbMV19XCJgXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHZhdWx0VXJsID0gYCR7YmFzZVVyaS5wcm90b2NvbH0vLyR7YmFzZVVyaS5ob3N0fWA7XG4gICAgY29uc3QgbmFtZSA9IHNlZ21lbnRzWzJdO1xuICAgIGNvbnN0IHZlcnNpb24gPSBzZWdtZW50cy5sZW5ndGggPT09IDQgPyBzZWdtZW50c1szXSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgdmF1bHRVcmwsXG4gICAgICBuYW1lLFxuICAgICAgdmVyc2lvblxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGF6dXJlS2V5VmF1bHRTaWduZWRIYXNoZWREYXRhKGNyeXB0b0NsaWVudDogQ3J5cHRvZ3JhcGh5Q2xpZW50LCBkYXRhVG9TaWduOiBCdWZmZXIpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGlmICghY3J5cHRvQ2xpZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F6dXJlIEtWUyBDcnlwdG8gQ2xpZW50IGlzIG5vdCBkZWZpbmVkLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25lZERhdGEgPSBhd2FpdCBjcnlwdG9DbGllbnQuc2lnbignUlMyNTYnLCBkYXRhVG9TaWduKTtcblxuICAgIHJldHVybiBCdWZmZXIuZnJvbShzaWduZWREYXRhLnJlc3VsdCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGF6dXJlS2V5VmF1bHRXcmFwKGNyeXB0b0NsaWVudDogQ3J5cHRvZ3JhcGh5Q2xpZW50LCBlbmNyeXB0aW9uQWxnb3JpdGhtOiBzdHJpbmcsIGNvbHVtbkVuY3J5cHRpb25LZXk6IEJ1ZmZlcik6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgaWYgKCFjcnlwdG9DbGllbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXp1cmUgS1ZTIENyeXB0byBDbGllbnQgaXMgbm90IGRlZmluZWQuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFjb2x1bW5FbmNyeXB0aW9uS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbHVtbiBlbmNyeXB0aW9uIGtleSBjYW5ub3QgYmUgbnVsbC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCB3cmFwcGVkS2V5ID0gYXdhaXQgY3J5cHRvQ2xpZW50LndyYXBLZXkoZW5jcnlwdGlvbkFsZ29yaXRobSBhcyBLZXlXcmFwQWxnb3JpdGhtLCBjb2x1bW5FbmNyeXB0aW9uS2V5KTtcblxuICAgIHJldHVybiBCdWZmZXIuZnJvbSh3cmFwcGVkS2V5LnJlc3VsdCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGF6dXJlS2V5VmF1bHRVbldyYXAoY3J5cHRvQ2xpZW50OiBDcnlwdG9ncmFwaHlDbGllbnQsIGVuY3J5cHRpb25BbGdvcml0aG06IHN0cmluZywgZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleTogQnVmZmVyKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBpZiAoIWNyeXB0b0NsaWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBenVyZSBLVlMgQ3J5cHRvIENsaWVudCBpcyBub3QgZGVmaW5lZC4nKTtcbiAgICB9XG5cbiAgICBpZiAoIWVuY3J5cHRpb25BbGdvcml0aG0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW5jcnlwdGlvbiBBbGdvcml0aG0gY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKCFlbmNyeXB0ZWRDb2x1bW5FbmNyeXB0aW9uS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuY3J5cHRlZCBjb2x1bW4gZW5jcnlwdGlvbiBrZXkgY2Fubm90IGJlIG51bGwuJyk7XG4gICAgfVxuXG4gICAgaWYgKGVuY3J5cHRlZENvbHVtbkVuY3J5cHRpb25LZXkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuY3J5cHRlZCBDb2x1bW4gRW5jcnlwdGlvbiBLZXkgbGVuZ3RoIHNob3VsZCBub3QgYmUgemVyby4nKTtcbiAgICB9XG5cbiAgICBjb25zdCB1bndyYXBwZWRLZXkgPSBhd2FpdCBjcnlwdG9DbGllbnQudW53cmFwS2V5KGVuY3J5cHRpb25BbGdvcml0aG0gYXMgS2V5V3JhcEFsZ29yaXRobSwgZW5jcnlwdGVkQ29sdW1uRW5jcnlwdGlvbktleSk7XG5cbiAgICByZXR1cm4gQnVmZmVyLmZyb20odW53cmFwcGVkS2V5LnJlc3VsdCk7XG4gIH1cblxuICBwcml2YXRlIGdldEFLVktleVNpemUocmV0cmlldmVkS2V5OiBLZXlWYXVsdEtleSk6IG51bWJlciB7XG4gICAgaWYgKCFyZXRyaWV2ZWRLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmV0cmlldmVkIGtleSBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gcmV0cmlldmVkS2V5LmtleTtcblxuICAgIGlmICgha2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEtleSBkb2VzIG5vdCBleGlzdCAke3JldHJpZXZlZEtleS5uYW1lfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGt0eTogc3RyaW5nIHwgdW5kZWZpbmVkID0ga2V5ICYmIGtleS5rdHkgJiYga2V5Lmt0eS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCk7XG5cbiAgICBpZiAoIWt0eSB8fCAnUlNBJy5sb2NhbGVDb21wYXJlKGt0eSwgJ2VuJykgIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHVzZSBhIG5vbi1SU0Ega2V5OiAke2t0eX0uYCk7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5TGVuZ3RoID0ga2V5ICYmIGtleS5uICYmIGtleS5uLmxlbmd0aDtcblxuICAgIHJldHVybiBrZXlMZW5ndGggfHwgMDtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVFbmNyeXB0aW9uQWxnb3JpdGhtKGVuY3J5cHRpb25BbGdvcml0aG06IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFlbmNyeXB0aW9uQWxnb3JpdGhtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0tleSBlbmNyeXB0aW9uIGFsZ29yaXRobSBjYW5ub3QgYmUgbnVsbC4nKTtcbiAgICB9XG5cbiAgICBpZiAoJ1JTQV9PQUVQJy5sb2NhbGVDb21wYXJlKGVuY3J5cHRpb25BbGdvcml0aG0udG9VcHBlckNhc2UoKSwgJ2VuJykgPT09IDApIHtcbiAgICAgIGVuY3J5cHRpb25BbGdvcml0aG0gPSAnUlNBLU9BRVAnO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJzYUVuY3J5cHRpb25BbGdvcml0aG1XaXRoT0FFUEZvckFLVi5sb2NhbGVDb21wYXJlKGVuY3J5cHRpb25BbGdvcml0aG0udHJpbSgpLnRvVXBwZXJDYXNlKCksICdlbicpICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQga2V5IGVuY3J5cHRpb24gYWxnb3JpdGhtIHNwZWNpZmllZDogJHtlbmNyeXB0aW9uQWxnb3JpdGhtfS4gRXhwZWN0ZWQgdmFsdWU6ICR7dGhpcy5yc2FFbmNyeXB0aW9uQWxnb3JpdGhtV2l0aE9BRVBGb3JBS1Z9LmApO1xuICAgIH1cblxuICAgIHJldHVybiBlbmNyeXB0aW9uQWxnb3JpdGhtO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFOQTtBQUNBO0FBYU8sTUFBTUEscUNBQU4sQ0FBNEM7RUFTakRDLFdBQVcsQ0FBQ0MsUUFBRCxFQUFtQkMsU0FBbkIsRUFBc0NDLFFBQXRDLEVBQXdEO0lBQUEsS0FSbkRDLElBUW1EO0lBQUEsS0FQM0RDLEdBTzJEO0lBQUEsS0FObERDLG9DQU1rRDtJQUFBLEtBTGxEQyxZQUtrRDtJQUFBLEtBSjNEQyxXQUkyRDtJQUFBLEtBSGxEQyx1QkFHa0Q7SUFBQSxLQUYzREMsU0FFMkQ7SUFDakUsS0FBS04sSUFBTCxHQUFZLGlCQUFaO0lBQ0EsS0FBS0ssdUJBQUwsR0FBK0IsaUJBQS9CO0lBQ0EsS0FBS0gsb0NBQUwsR0FBNEMsVUFBNUM7SUFDQSxLQUFLQyxZQUFMLEdBQW9CSSxNQUFNLENBQUNDLElBQVAsQ0FBWSxDQUFDLElBQUQsQ0FBWixDQUFwQjtJQUNBLEtBQUtKLFdBQUwsR0FBbUIsSUFBSUssZ0NBQUosQ0FBMkJWLFFBQTNCLEVBQXFDRixRQUFyQyxFQUErQ0MsU0FBL0MsQ0FBbkI7RUFDRDs7RUFFK0IsTUFBMUJZLDBCQUEwQixDQUFDQyxhQUFELEVBQXdCQyxtQkFBeEIsRUFBcURDLDRCQUFyRCxFQUE0RztJQUMxSSxJQUFJLENBQUNBLDRCQUFMLEVBQW1DO01BQ2pDLE1BQU0sSUFBSUMsS0FBSixDQUFVLGlFQUFWLENBQU47SUFDRDs7SUFFRCxJQUFJRCw0QkFBNEIsQ0FBQ0UsTUFBN0IsS0FBd0MsQ0FBNUMsRUFBK0M7TUFDN0MsTUFBTSxJQUFJRCxLQUFKLENBQVUsa0VBQVYsQ0FBTjtJQUNEOztJQUVERixtQkFBbUIsR0FBRyxLQUFLSSwyQkFBTCxDQUFpQ0osbUJBQWpDLENBQXRCO0lBRUEsTUFBTUssU0FBUyxHQUFHLE1BQU0sS0FBS0MsWUFBTCxDQUFrQlAsYUFBbEIsQ0FBeEI7SUFFQSxNQUFNUSxjQUFjLEdBQUcsS0FBS0MsYUFBTCxDQUFtQkgsU0FBbkIsQ0FBdkI7SUFFQSxNQUFNSSxZQUFZLEdBQUcsS0FBS0Msa0JBQUwsQ0FBd0JMLFNBQXhCLENBQXJCOztJQUVBLElBQUlKLDRCQUE0QixDQUFDLENBQUQsQ0FBNUIsS0FBb0MsS0FBS1YsWUFBTCxDQUFrQixDQUFsQixDQUF4QyxFQUE4RDtNQUM1RCxNQUFNLElBQUlXLEtBQUosQ0FBVyw4RkFBNkZQLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLENBQUNLLDRCQUE0QixDQUFDLENBQUQsQ0FBN0IsQ0FBWixFQUErQ1UsUUFBL0MsQ0FBd0QsS0FBeEQsQ0FBK0QseUJBQXdCaEIsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxLQUFLTCxZQUFMLENBQWtCLENBQWxCLENBQUQsQ0FBWixFQUFvQ29CLFFBQXBDLENBQTZDLEtBQTdDLENBQW9ELEdBQW5QLENBQU47SUFDRDs7SUFFRCxJQUFJQyxZQUFZLEdBQUcsS0FBS3JCLFlBQUwsQ0FBa0JZLE1BQXJDO0lBQ0EsTUFBTVUsYUFBcUIsR0FBR1osNEJBQTRCLENBQUNhLFdBQTdCLENBQXlDRixZQUF6QyxDQUE5QjtJQUVBQSxZQUFZLElBQUksQ0FBaEI7SUFFQSxNQUFNRyxnQkFBd0IsR0FBR2QsNEJBQTRCLENBQUNhLFdBQTdCLENBQXlDRixZQUF6QyxDQUFqQztJQUVBQSxZQUFZLElBQUksQ0FBaEI7SUFFQUEsWUFBWSxJQUFJQyxhQUFoQjs7SUFFQSxJQUFJRSxnQkFBZ0IsS0FBS1IsY0FBekIsRUFBeUM7TUFDdkMsTUFBTSxJQUFJTCxLQUFKLENBQVcsc0VBQXFFYSxnQkFBaUIsMENBQXlDUixjQUFlLDBEQUF5RFIsYUFBYyxtSEFBaE8sQ0FBTjtJQUNEOztJQUVELE1BQU1pQixlQUF1QixHQUFHZiw0QkFBNEIsQ0FBQ0UsTUFBN0IsR0FBc0NTLFlBQXRDLEdBQXFERyxnQkFBckY7O0lBRUEsSUFBSUMsZUFBZSxLQUFLVCxjQUF4QixFQUF3QztNQUN0QyxNQUFNLElBQUlMLEtBQUosQ0FBVyxxRUFBb0VjLGVBQWdCLHlDQUF3Q1QsY0FBZSwwREFBeURSLGFBQWMsbUhBQTdOLENBQU47SUFDRDs7SUFFRCxNQUFNa0IsVUFBVSxHQUFHdEIsTUFBTSxDQUFDdUIsS0FBUCxDQUFhSCxnQkFBYixDQUFuQjtJQUNBZCw0QkFBNEIsQ0FBQ2tCLElBQTdCLENBQWtDRixVQUFsQyxFQUE4QyxDQUE5QyxFQUFpREwsWUFBakQsRUFBK0RBLFlBQVksR0FBR0csZ0JBQTlFO0lBQ0FILFlBQVksSUFBSUcsZ0JBQWhCO0lBRUEsTUFBTUssU0FBUyxHQUFHekIsTUFBTSxDQUFDdUIsS0FBUCxDQUFhRixlQUFiLENBQWxCO0lBQ0FmLDRCQUE0QixDQUFDa0IsSUFBN0IsQ0FBa0NDLFNBQWxDLEVBQTZDLENBQTdDLEVBQWdEUixZQUFoRCxFQUE4REEsWUFBWSxHQUFHSSxlQUE3RTtJQUVBLE1BQU1LLElBQUksR0FBRzFCLE1BQU0sQ0FBQ3VCLEtBQVAsQ0FBYWpCLDRCQUE0QixDQUFDRSxNQUE3QixHQUFzQ2lCLFNBQVMsQ0FBQ2pCLE1BQTdELENBQWI7SUFDQUYsNEJBQTRCLENBQUNrQixJQUE3QixDQUFrQ0UsSUFBbEMsRUFBd0MsQ0FBeEMsRUFBMkMsQ0FBM0MsRUFBOENwQiw0QkFBNEIsQ0FBQ0UsTUFBN0IsR0FBc0NpQixTQUFTLENBQUNqQixNQUE5RjtJQUVBLE1BQU1tQixhQUFhLEdBQUcsd0JBQVcsUUFBWCxDQUF0QjtJQUNBQSxhQUFhLENBQUNDLE1BQWQsQ0FBcUJGLElBQXJCO0lBRUEsTUFBTUcsWUFBb0IsR0FBR0YsYUFBYSxDQUFDRyxNQUFkLEVBQTdCOztJQUVBLElBQUksQ0FBQ0QsWUFBTCxFQUFtQjtNQUNqQixNQUFNLElBQUl0QixLQUFKLENBQVUsMkVBQVYsQ0FBTjtJQUNEOztJQUVELE1BQU13QixTQUFTLEdBQUcsTUFBTWpCLFlBQVksQ0FBQ2tCLE1BQWIsQ0FBb0IsT0FBcEIsRUFBNkJILFlBQTdCLEVBQTJDSixTQUEzQyxDQUF4Qjs7SUFDQSxJQUFJLENBQUNNLFNBQVMsQ0FBQ0UsTUFBZixFQUF1QjtNQUNyQixNQUFNLElBQUkxQixLQUFKLENBQVcsbUtBQWtLSCxhQUFjLCtGQUEzTCxDQUFOO0lBQ0Q7O0lBRUQsTUFBTThCLFlBQW9CLEdBQUcsTUFBTSxLQUFLQyxtQkFBTCxDQUF5QnJCLFlBQXpCLEVBQXVDVCxtQkFBdkMsRUFBNERpQixVQUE1RCxDQUFuQztJQUVBLE9BQU9ZLFlBQVA7RUFDRDs7RUFFK0IsTUFBMUJFLDBCQUEwQixDQUFDaEMsYUFBRCxFQUF3QkMsbUJBQXhCLEVBQXFEZ0MsbUJBQXJELEVBQW1HO0lBQ2pJLElBQUksQ0FBQ0EsbUJBQUwsRUFBMEI7TUFDeEIsTUFBTSxJQUFJOUIsS0FBSixDQUFVLHVDQUFWLENBQU47SUFDRDs7SUFFRCxJQUFJOEIsbUJBQW1CLENBQUM3QixNQUFwQixLQUErQixDQUFuQyxFQUFzQztNQUNwQyxNQUFNLElBQUlELEtBQUosQ0FBVSx3Q0FBVixDQUFOO0lBQ0Q7O0lBRURGLG1CQUFtQixHQUFHLEtBQUtJLDJCQUFMLENBQWlDSixtQkFBakMsQ0FBdEI7SUFFQSxNQUFNSyxTQUFTLEdBQUcsTUFBTSxLQUFLQyxZQUFMLENBQWtCUCxhQUFsQixDQUF4QjtJQUVBLE1BQU1RLGNBQWMsR0FBRyxLQUFLQyxhQUFMLENBQW1CSCxTQUFuQixDQUF2QjtJQUVBLE1BQU1JLFlBQVksR0FBRyxLQUFLQyxrQkFBTCxDQUF3QkwsU0FBeEIsQ0FBckI7SUFFQSxNQUFNNEIsT0FBTyxHQUFHdEMsTUFBTSxDQUFDQyxJQUFQLENBQVksQ0FBQyxLQUFLTCxZQUFMLENBQWtCLENBQWxCLENBQUQsQ0FBWixDQUFoQjtJQUVBLE1BQU0yQyxrQkFBMEIsR0FBR3ZDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZRyxhQUFhLENBQUNvQyxXQUFkLEVBQVosRUFBeUMsTUFBekMsQ0FBbkM7SUFFQSxNQUFNdEIsYUFBcUIsR0FBR2xCLE1BQU0sQ0FBQ3VCLEtBQVAsQ0FBYSxDQUFiLENBQTlCO0lBRUFMLGFBQWEsQ0FBQyxDQUFELENBQWIsR0FBbUJxQixrQkFBa0IsQ0FBQy9CLE1BQW5CLEdBQTRCLElBQS9DO0lBQ0FVLGFBQWEsQ0FBQyxDQUFELENBQWIsR0FBbUJxQixrQkFBa0IsQ0FBQy9CLE1BQW5CLElBQTZCLENBQTdCLEdBQWlDLElBQXBEO0lBRUEsTUFBTWMsVUFBa0IsR0FBRyxNQUFNLEtBQUttQixpQkFBTCxDQUF1QjNCLFlBQXZCLEVBQXFDVCxtQkFBckMsRUFBMERnQyxtQkFBMUQsQ0FBakM7SUFFQSxNQUFNakIsZ0JBQXdCLEdBQUdwQixNQUFNLENBQUN1QixLQUFQLENBQWEsQ0FBYixDQUFqQztJQUVBSCxnQkFBZ0IsQ0FBQyxDQUFELENBQWhCLEdBQXNCRSxVQUFVLENBQUNkLE1BQVgsR0FBb0IsSUFBMUM7SUFDQVksZ0JBQWdCLENBQUMsQ0FBRCxDQUFoQixHQUFzQkUsVUFBVSxDQUFDZCxNQUFYLElBQXFCLENBQXJCLEdBQXlCLElBQS9DOztJQUVBLElBQUljLFVBQVUsQ0FBQ2QsTUFBWCxLQUFzQkksY0FBMUIsRUFBMEM7TUFDeEMsTUFBTSxJQUFJTCxLQUFKLENBQVUsb0RBQVYsQ0FBTjtJQUNEOztJQUVELE1BQU1tQyxVQUFrQixHQUFHMUMsTUFBTSxDQUFDdUIsS0FBUCxDQUFhZSxPQUFPLENBQUM5QixNQUFSLEdBQWlCVSxhQUFhLENBQUNWLE1BQS9CLEdBQXdDWSxnQkFBZ0IsQ0FBQ1osTUFBekQsR0FBa0UrQixrQkFBa0IsQ0FBQy9CLE1BQXJGLEdBQThGYyxVQUFVLENBQUNkLE1BQXRILENBQTNCO0lBQ0EsSUFBSW1DLG1CQUEyQixHQUFHTCxPQUFPLENBQUM5QixNQUExQztJQUNBOEIsT0FBTyxDQUFDZCxJQUFSLENBQWFrQixVQUFiLEVBQXlCLENBQXpCLEVBQTRCLENBQTVCLEVBQStCSixPQUFPLENBQUM5QixNQUF2QztJQUVBVSxhQUFhLENBQUNNLElBQWQsQ0FBbUJrQixVQUFuQixFQUErQkMsbUJBQS9CLEVBQW9ELENBQXBELEVBQXVEekIsYUFBYSxDQUFDVixNQUFyRTtJQUNBbUMsbUJBQW1CLElBQUl6QixhQUFhLENBQUNWLE1BQXJDO0lBRUFZLGdCQUFnQixDQUFDSSxJQUFqQixDQUFzQmtCLFVBQXRCLEVBQWtDQyxtQkFBbEMsRUFBdUQsQ0FBdkQsRUFBMER2QixnQkFBZ0IsQ0FBQ1osTUFBM0U7SUFDQW1DLG1CQUFtQixJQUFJdkIsZ0JBQWdCLENBQUNaLE1BQXhDO0lBRUErQixrQkFBa0IsQ0FBQ2YsSUFBbkIsQ0FBd0JrQixVQUF4QixFQUFvQ0MsbUJBQXBDLEVBQXlELENBQXpELEVBQTRESixrQkFBa0IsQ0FBQy9CLE1BQS9FO0lBQ0FtQyxtQkFBbUIsSUFBSUosa0JBQWtCLENBQUMvQixNQUExQztJQUVBYyxVQUFVLENBQUNFLElBQVgsQ0FBZ0JrQixVQUFoQixFQUE0QkMsbUJBQTVCLEVBQWlELENBQWpELEVBQW9EckIsVUFBVSxDQUFDZCxNQUEvRDtJQUVBLE1BQU1tQixhQUFhLEdBQUcsd0JBQVcsUUFBWCxDQUF0QjtJQUVBQSxhQUFhLENBQUNDLE1BQWQsQ0FBcUJjLFVBQXJCO0lBRUEsTUFBTUUsVUFBa0IsR0FBR2pCLGFBQWEsQ0FBQ0csTUFBZCxFQUEzQjtJQUVBLE1BQU1lLFVBQWtCLEdBQUcsTUFBTSxLQUFLQyw2QkFBTCxDQUFtQ2hDLFlBQW5DLEVBQWlEOEIsVUFBakQsQ0FBakM7O0lBQ0EsSUFBSUMsVUFBVSxDQUFDckMsTUFBWCxLQUFzQkksY0FBMUIsRUFBMEM7TUFDeEMsTUFBTSxJQUFJTCxLQUFKLENBQVUscURBQVYsQ0FBTjtJQUNEOztJQUVELE1BQU13QixTQUFTLEdBQUcsTUFBTWpCLFlBQVksQ0FBQ2tCLE1BQWIsQ0FBb0IsT0FBcEIsRUFBNkJZLFVBQTdCLEVBQXlDQyxVQUF6QyxDQUF4Qjs7SUFFQSxJQUFJLENBQUNkLFNBQVMsQ0FBQ0UsTUFBZixFQUF1QjtNQUNyQixNQUFNLElBQUkxQixLQUFKLENBQVUsb0VBQVYsQ0FBTjtJQUNEOztJQUVELE1BQU13QyxrQ0FBMEMsR0FBR1QsT0FBTyxDQUFDOUIsTUFBUixHQUFpQlksZ0JBQWdCLENBQUNaLE1BQWxDLEdBQTJDVSxhQUFhLENBQUNWLE1BQXpELEdBQWtFYyxVQUFVLENBQUNkLE1BQTdFLEdBQXNGK0Isa0JBQWtCLENBQUMvQixNQUF6RyxHQUFrSHFDLFVBQVUsQ0FBQ3JDLE1BQWhMO0lBQ0EsTUFBTUYsNEJBQW9DLEdBQUdOLE1BQU0sQ0FBQ3VCLEtBQVAsQ0FBYXdCLGtDQUFiLENBQTdDO0lBRUEsSUFBSTlCLFlBQVksR0FBRyxDQUFuQjtJQUNBcUIsT0FBTyxDQUFDZCxJQUFSLENBQWFsQiw0QkFBYixFQUEyQ1csWUFBM0MsRUFBeUQsQ0FBekQsRUFBNERxQixPQUFPLENBQUM5QixNQUFwRTtJQUNBUyxZQUFZLElBQUlxQixPQUFPLENBQUM5QixNQUF4QjtJQUVBVSxhQUFhLENBQUNNLElBQWQsQ0FBbUJsQiw0QkFBbkIsRUFBaURXLFlBQWpELEVBQStELENBQS9ELEVBQWtFQyxhQUFhLENBQUNWLE1BQWhGO0lBQ0FTLFlBQVksSUFBSUMsYUFBYSxDQUFDVixNQUE5QjtJQUVBWSxnQkFBZ0IsQ0FBQ0ksSUFBakIsQ0FBc0JsQiw0QkFBdEIsRUFBb0RXLFlBQXBELEVBQWtFLENBQWxFLEVBQXFFRyxnQkFBZ0IsQ0FBQ1osTUFBdEY7SUFDQVMsWUFBWSxJQUFJRyxnQkFBZ0IsQ0FBQ1osTUFBakM7SUFFQStCLGtCQUFrQixDQUFDZixJQUFuQixDQUF3QmxCLDRCQUF4QixFQUFzRFcsWUFBdEQsRUFBb0UsQ0FBcEUsRUFBdUVzQixrQkFBa0IsQ0FBQy9CLE1BQTFGO0lBQ0FTLFlBQVksSUFBSXNCLGtCQUFrQixDQUFDL0IsTUFBbkM7SUFFQWMsVUFBVSxDQUFDRSxJQUFYLENBQWdCbEIsNEJBQWhCLEVBQThDVyxZQUE5QyxFQUE0RCxDQUE1RCxFQUErREssVUFBVSxDQUFDZCxNQUExRTtJQUNBUyxZQUFZLElBQUlLLFVBQVUsQ0FBQ2QsTUFBM0I7SUFFQXFDLFVBQVUsQ0FBQ3JCLElBQVgsQ0FBZ0JsQiw0QkFBaEIsRUFBOENXLFlBQTlDLEVBQTRELENBQTVELEVBQStENEIsVUFBVSxDQUFDckMsTUFBMUU7SUFFQSxPQUFPRiw0QkFBUDtFQUNEOztFQUV5QixNQUFaSyxZQUFZLENBQUNQLGFBQUQsRUFBOEM7SUFDdEUsSUFBSSxDQUFDQSxhQUFMLEVBQW9CO01BQ2xCLE1BQU0sSUFBSUcsS0FBSixDQUFVLDZDQUFWLENBQU47SUFDRDs7SUFDRCxNQUFNeUMsUUFBUSxHQUFHLEtBQUtDLFNBQUwsQ0FBZTdDLGFBQWYsQ0FBakI7SUFFQSxLQUFLOEMsZUFBTCxDQUFxQkYsUUFBUSxDQUFDRyxRQUE5QjtJQUVBLE9BQU8sTUFBTyxLQUFLcEQsU0FBTixDQUE4QnFELE1BQTlCLENBQXFDSixRQUFRLENBQUN2RCxJQUE5QyxFQUFvRHVELFFBQVEsQ0FBQ1YsT0FBVCxHQUFtQjtNQUFFQSxPQUFPLEVBQUVVLFFBQVEsQ0FBQ1Y7SUFBcEIsQ0FBbkIsR0FBbUQsRUFBdkcsQ0FBYjtFQUNEOztFQUVPWSxlQUFlLENBQUNHLFdBQUQsRUFBNEI7SUFDakQsSUFBSSxDQUFDQSxXQUFMLEVBQWtCO01BQ2hCLE1BQU0sSUFBSTlDLEtBQUosQ0FBVSw2REFBVixDQUFOO0lBQ0Q7O0lBQ0QsSUFBSSxDQUFDLEtBQUtSLFNBQVYsRUFBcUI7TUFDbkIsS0FBS0wsR0FBTCxHQUFXMkQsV0FBWDtNQUNBLEtBQUt0RCxTQUFMLEdBQWlCLElBQUl1RCx1QkFBSixDQUFjRCxXQUFkLEVBQTJCLEtBQUt4RCxXQUFoQyxDQUFqQjtJQUNEO0VBQ0Y7O0VBRU9rQixrQkFBa0IsQ0FBQ0wsU0FBRCxFQUE2QztJQUNyRSxJQUFJLENBQUNBLFNBQUwsRUFBZ0I7TUFDZCxNQUFNLElBQUlILEtBQUosQ0FBVSxtRUFBVixDQUFOO0lBQ0Q7O0lBQ0QsT0FBTyxJQUFJZ0QsZ0NBQUosQ0FBdUI3QyxTQUF2QixFQUFrQyxLQUFLYixXQUF2QyxDQUFQO0VBQ0Q7O0VBRU9vRCxTQUFTLENBQUM3QyxhQUFELEVBQXVDO0lBQ3RELElBQUksQ0FBQ0EsYUFBRCxJQUFrQkEsYUFBYSxDQUFDb0QsSUFBZCxPQUF5QixFQUEvQyxFQUFtRDtNQUNqRCxNQUFNLElBQUlqRCxLQUFKLENBQVUsMENBQVYsQ0FBTjtJQUNEOztJQUVELElBQUlrRCxPQUFKOztJQUNBLElBQUk7TUFDRkEsT0FBTyxHQUFHLGdCQUFNckQsYUFBTixFQUFxQixJQUFyQixFQUEyQixJQUEzQixDQUFWO0lBQ0QsQ0FGRCxDQUVFLE1BQU07TUFDTixNQUFNLElBQUlHLEtBQUosQ0FBVyw0QkFBMkJILGFBQWMsbUJBQXBELENBQU47SUFDRDs7SUFFRCxJQUFJLENBQUNxRCxPQUFPLENBQUNDLFFBQVQsSUFBcUIsQ0FBQ0QsT0FBTyxDQUFDQyxRQUFSLENBQWlCbEIsV0FBakIsR0FBK0JtQixRQUEvQixDQUF3QyxLQUFLN0QsdUJBQTdDLENBQTFCLEVBQWlHO01BQy9GLE1BQU0sSUFBSVMsS0FBSixDQUFXLCtDQUE4Q0gsYUFBYyxHQUF2RSxDQUFOO0lBQ0QsQ0FkcUQsQ0FnQnREOzs7SUFDQSxNQUFNd0QsUUFBUSxHQUFHLENBQUNILE9BQU8sQ0FBQ0ksUUFBUixJQUFvQixFQUFyQixFQUF5QkMsS0FBekIsQ0FBK0IsR0FBL0IsQ0FBakI7O0lBQ0EsSUFBSUYsUUFBUSxDQUFDcEQsTUFBVCxLQUFvQixDQUFwQixJQUF5Qm9ELFFBQVEsQ0FBQ3BELE1BQVQsS0FBb0IsQ0FBakQsRUFBb0Q7TUFDbEQsTUFBTSxJQUFJRCxLQUFKLENBQ0gsNEJBQTJCSCxhQUFjLDZCQUE0QndELFFBQVEsQ0FBQ3BELE1BQU8sRUFEbEYsQ0FBTjtJQUdEOztJQUVELElBQUksV0FBV29ELFFBQVEsQ0FBQyxDQUFELENBQXZCLEVBQTRCO01BQzFCLE1BQU0sSUFBSXJELEtBQUosQ0FDSCw0QkFBMkJILGFBQWMsMENBQXlDd0QsUUFBUSxDQUFDLENBQUQsQ0FBSSxHQUQzRixDQUFOO0lBR0Q7O0lBRUQsTUFBTVQsUUFBUSxHQUFJLEdBQUVNLE9BQU8sQ0FBQ00sUUFBUyxLQUFJTixPQUFPLENBQUNPLElBQUssRUFBdEQ7SUFDQSxNQUFNdkUsSUFBSSxHQUFHbUUsUUFBUSxDQUFDLENBQUQsQ0FBckI7SUFDQSxNQUFNdEIsT0FBTyxHQUFHc0IsUUFBUSxDQUFDcEQsTUFBVCxLQUFvQixDQUFwQixHQUF3Qm9ELFFBQVEsQ0FBQyxDQUFELENBQWhDLEdBQXNDSyxTQUF0RDtJQUNBLE9BQU87TUFDTGQsUUFESztNQUVMMUQsSUFGSztNQUdMNkM7SUFISyxDQUFQO0VBS0Q7O0VBRTBDLE1BQTdCUSw2QkFBNkIsQ0FBQ2hDLFlBQUQsRUFBbUM4QixVQUFuQyxFQUF3RTtJQUNqSCxJQUFJLENBQUM5QixZQUFMLEVBQW1CO01BQ2pCLE1BQU0sSUFBSVAsS0FBSixDQUFVLHlDQUFWLENBQU47SUFDRDs7SUFFRCxNQUFNMkQsVUFBVSxHQUFHLE1BQU1wRCxZQUFZLENBQUNxRCxJQUFiLENBQWtCLE9BQWxCLEVBQTJCdkIsVUFBM0IsQ0FBekI7SUFFQSxPQUFPNUMsTUFBTSxDQUFDQyxJQUFQLENBQVlpRSxVQUFVLENBQUNqQyxNQUF2QixDQUFQO0VBQ0Q7O0VBRThCLE1BQWpCUSxpQkFBaUIsQ0FBQzNCLFlBQUQsRUFBbUNULG1CQUFuQyxFQUFnRWdDLG1CQUFoRSxFQUE4RztJQUMzSSxJQUFJLENBQUN2QixZQUFMLEVBQW1CO01BQ2pCLE1BQU0sSUFBSVAsS0FBSixDQUFVLHlDQUFWLENBQU47SUFDRDs7SUFFRCxJQUFJLENBQUM4QixtQkFBTCxFQUEwQjtNQUN4QixNQUFNLElBQUk5QixLQUFKLENBQVUsdUNBQVYsQ0FBTjtJQUNEOztJQUVELE1BQU02RCxVQUFVLEdBQUcsTUFBTXRELFlBQVksQ0FBQ3VELE9BQWIsQ0FBcUJoRSxtQkFBckIsRUFBOERnQyxtQkFBOUQsQ0FBekI7SUFFQSxPQUFPckMsTUFBTSxDQUFDQyxJQUFQLENBQVltRSxVQUFVLENBQUNuQyxNQUF2QixDQUFQO0VBQ0Q7O0VBRWdDLE1BQW5CRSxtQkFBbUIsQ0FBQ3JCLFlBQUQsRUFBbUNULG1CQUFuQyxFQUFnRUMsNEJBQWhFLEVBQXVIO0lBQ3RKLElBQUksQ0FBQ1EsWUFBTCxFQUFtQjtNQUNqQixNQUFNLElBQUlQLEtBQUosQ0FBVSx5Q0FBVixDQUFOO0lBQ0Q7O0lBRUQsSUFBSSxDQUFDRixtQkFBTCxFQUEwQjtNQUN4QixNQUFNLElBQUlFLEtBQUosQ0FBVSxrREFBVixDQUFOO0lBQ0Q7O0lBRUQsSUFBSSxDQUFDRCw0QkFBTCxFQUFtQztNQUNqQyxNQUFNLElBQUlDLEtBQUosQ0FBVSxpREFBVixDQUFOO0lBQ0Q7O0lBRUQsSUFBSUQsNEJBQTRCLENBQUNFLE1BQTdCLEtBQXdDLENBQTVDLEVBQStDO01BQzdDLE1BQU0sSUFBSUQsS0FBSixDQUFVLDREQUFWLENBQU47SUFDRDs7SUFFRCxNQUFNK0QsWUFBWSxHQUFHLE1BQU14RCxZQUFZLENBQUN5RCxTQUFiLENBQXVCbEUsbUJBQXZCLEVBQWdFQyw0QkFBaEUsQ0FBM0I7SUFFQSxPQUFPTixNQUFNLENBQUNDLElBQVAsQ0FBWXFFLFlBQVksQ0FBQ3JDLE1BQXpCLENBQVA7RUFDRDs7RUFFT3BCLGFBQWEsQ0FBQzJELFlBQUQsRUFBb0M7SUFDdkQsSUFBSSxDQUFDQSxZQUFMLEVBQW1CO01BQ2pCLE1BQU0sSUFBSWpFLEtBQUosQ0FBVSwyQ0FBVixDQUFOO0lBQ0Q7O0lBQ0QsTUFBTWtFLEdBQUcsR0FBR0QsWUFBWSxDQUFDQyxHQUF6Qjs7SUFFQSxJQUFJLENBQUNBLEdBQUwsRUFBVTtNQUNSLE1BQU0sSUFBSWxFLEtBQUosQ0FBVyxzQkFBcUJpRSxZQUFZLENBQUMvRSxJQUFLLEVBQWxELENBQU47SUFDRDs7SUFFRCxNQUFNaUYsR0FBdUIsR0FBR0QsR0FBRyxJQUFJQSxHQUFHLENBQUNDLEdBQVgsSUFBa0JELEdBQUcsQ0FBQ0MsR0FBSixDQUFRMUQsUUFBUixHQUFtQjJELFdBQW5CLEVBQWxEOztJQUVBLElBQUksQ0FBQ0QsR0FBRCxJQUFRLE1BQU1FLGFBQU4sQ0FBb0JGLEdBQXBCLEVBQXlCLElBQXpCLE1BQW1DLENBQS9DLEVBQWtEO01BQ2hELE1BQU0sSUFBSW5FLEtBQUosQ0FBVyw2QkFBNEJtRSxHQUFJLEdBQTNDLENBQU47SUFDRDs7SUFFRCxNQUFNRyxTQUFTLEdBQUdKLEdBQUcsSUFBSUEsR0FBRyxDQUFDSyxDQUFYLElBQWdCTCxHQUFHLENBQUNLLENBQUosQ0FBTXRFLE1BQXhDO0lBRUEsT0FBT3FFLFNBQVMsSUFBSSxDQUFwQjtFQUNEOztFQUVPcEUsMkJBQTJCLENBQUNKLG1CQUFELEVBQXNDO0lBQ3ZFLElBQUksQ0FBQ0EsbUJBQUwsRUFBMEI7TUFDeEIsTUFBTSxJQUFJRSxLQUFKLENBQVUsMENBQVYsQ0FBTjtJQUNEOztJQUVELElBQUksV0FBV3FFLGFBQVgsQ0FBeUJ2RSxtQkFBbUIsQ0FBQ3NFLFdBQXBCLEVBQXpCLEVBQTRELElBQTVELE1BQXNFLENBQTFFLEVBQTZFO01BQzNFdEUsbUJBQW1CLEdBQUcsVUFBdEI7SUFDRDs7SUFFRCxJQUFJLEtBQUtWLG9DQUFMLENBQTBDaUYsYUFBMUMsQ0FBd0R2RSxtQkFBbUIsQ0FBQ21ELElBQXBCLEdBQTJCbUIsV0FBM0IsRUFBeEQsRUFBa0csSUFBbEcsTUFBNEcsQ0FBaEgsRUFBbUg7TUFDakgsTUFBTSxJQUFJcEUsS0FBSixDQUFXLCtDQUE4Q0YsbUJBQW9CLHFCQUFvQixLQUFLVixvQ0FBcUMsR0FBM0ksQ0FBTjtJQUNEOztJQUVELE9BQU9VLG1CQUFQO0VBQ0Q7O0FBMVVnRCJ9"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getKey = void 0;

var _symmetricKey = _interopRequireDefault(require("./symmetric-key"));

var _lruCache = _interopRequireDefault(require("lru-cache"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.
// Copyright (c) 2019 Microsoft Corporation
const cache = new _lruCache.default(0);

const getKey = async (keyInfo, options) => {
  if (!options.trustedServerNameAE) {
    throw new Error('Server name should not be null in getKey');
  }

  const serverName = options.trustedServerNameAE;
  const keyLookupValue = `${serverName}:${Buffer.from(keyInfo.encryptedKey).toString('base64')}:${keyInfo.keyStoreName}`;

  if (cache.has(keyLookupValue)) {
    return cache.get(keyLookupValue);
  } else {
    const provider = options.encryptionKeyStoreProviders && options.encryptionKeyStoreProviders[keyInfo.keyStoreName];

    if (!provider) {
      throw new Error(`Failed to decrypt a column encryption key. Invalid key store provider name: ${keyInfo.keyStoreName}. A key store provider name must denote either a system key store provider or a registered custom key store provider. Valid (currently registered) custom key store provider names are: ${options.encryptionKeyStoreProviders}. Please verify key store provider information in column master key definitions in the database, and verify all custom key store providers used in your application are registered properly.`);
    }

    const plaintextKey = await provider.decryptColumnEncryptionKey(keyInfo.keyPath, keyInfo.algorithmName, keyInfo.encryptedKey);
    const encryptionKey = new _symmetricKey.default(plaintextKey);

    if (options.columnEncryptionKeyCacheTTL > 0) {
      cache.set(keyLookupValue, encryptionKey, options.columnEncryptionKeyCacheTTL);
    }

    return encryptionKey;
  }
};

exports.getKey = getKey;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjYWNoZSIsIkxSVSIsImdldEtleSIsImtleUluZm8iLCJvcHRpb25zIiwidHJ1c3RlZFNlcnZlck5hbWVBRSIsIkVycm9yIiwic2VydmVyTmFtZSIsImtleUxvb2t1cFZhbHVlIiwiQnVmZmVyIiwiZnJvbSIsImVuY3J5cHRlZEtleSIsInRvU3RyaW5nIiwia2V5U3RvcmVOYW1lIiwiaGFzIiwiZ2V0IiwicHJvdmlkZXIiLCJlbmNyeXB0aW9uS2V5U3RvcmVQcm92aWRlcnMiLCJwbGFpbnRleHRLZXkiLCJkZWNyeXB0Q29sdW1uRW5jcnlwdGlvbktleSIsImtleVBhdGgiLCJhbGdvcml0aG1OYW1lIiwiZW5jcnlwdGlvbktleSIsIlN5bW1ldHJpY0tleSIsImNvbHVtbkVuY3J5cHRpb25LZXlDYWNoZVRUTCIsInNldCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbHdheXMtZW5jcnlwdGVkL3N5bW1ldHJpYy1rZXktY2FjaGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBgbXNzcWwtamRiY2AgbGlicmFyeSBwdWJsaXNoZWQgdW5kZXIgdGhlIGNvbmRpdGlvbnMgb2YgTUlUIGxpY2Vuc2UuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTkgTWljcm9zb2Z0IENvcnBvcmF0aW9uXG5cbmltcG9ydCB7IEVuY3J5cHRpb25LZXlJbmZvIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgU3ltbWV0cmljS2V5IGZyb20gJy4vc3ltbWV0cmljLWtleSc7XG5pbXBvcnQgeyBJbnRlcm5hbENvbm5lY3Rpb25PcHRpb25zIGFzIENvbm5lY3Rpb25PcHRpb25zIH0gZnJvbSAnLi4vY29ubmVjdGlvbic7XG5pbXBvcnQgTFJVIGZyb20gJ2xydS1jYWNoZSc7XG5cbmNvbnN0IGNhY2hlID0gbmV3IExSVTxzdHJpbmcsIFN5bW1ldHJpY0tleT4oMCk7XG5cbmV4cG9ydCBjb25zdCBnZXRLZXkgPSBhc3luYyAoa2V5SW5mbzogRW5jcnlwdGlvbktleUluZm8sIG9wdGlvbnM6IENvbm5lY3Rpb25PcHRpb25zKTogUHJvbWlzZTxTeW1tZXRyaWNLZXk+ID0+IHtcbiAgaWYgKCFvcHRpb25zLnRydXN0ZWRTZXJ2ZXJOYW1lQUUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlcnZlciBuYW1lIHNob3VsZCBub3QgYmUgbnVsbCBpbiBnZXRLZXknKTtcbiAgfVxuXG4gIGNvbnN0IHNlcnZlck5hbWU6IHN0cmluZyA9IG9wdGlvbnMudHJ1c3RlZFNlcnZlck5hbWVBRTtcblxuICBjb25zdCBrZXlMb29rdXBWYWx1ZSA9IGAke3NlcnZlck5hbWV9OiR7QnVmZmVyLmZyb20oa2V5SW5mby5lbmNyeXB0ZWRLZXkpLnRvU3RyaW5nKCdiYXNlNjQnKX06JHtrZXlJbmZvLmtleVN0b3JlTmFtZX1gO1xuXG4gIGlmIChjYWNoZS5oYXMoa2V5TG9va3VwVmFsdWUpKSB7XG4gICAgcmV0dXJuIGNhY2hlLmdldChrZXlMb29rdXBWYWx1ZSkgYXMgU3ltbWV0cmljS2V5O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gb3B0aW9ucy5lbmNyeXB0aW9uS2V5U3RvcmVQcm92aWRlcnMgJiYgb3B0aW9ucy5lbmNyeXB0aW9uS2V5U3RvcmVQcm92aWRlcnNba2V5SW5mby5rZXlTdG9yZU5hbWVdO1xuICAgIGlmICghcHJvdmlkZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlY3J5cHQgYSBjb2x1bW4gZW5jcnlwdGlvbiBrZXkuIEludmFsaWQga2V5IHN0b3JlIHByb3ZpZGVyIG5hbWU6ICR7a2V5SW5mby5rZXlTdG9yZU5hbWV9LiBBIGtleSBzdG9yZSBwcm92aWRlciBuYW1lIG11c3QgZGVub3RlIGVpdGhlciBhIHN5c3RlbSBrZXkgc3RvcmUgcHJvdmlkZXIgb3IgYSByZWdpc3RlcmVkIGN1c3RvbSBrZXkgc3RvcmUgcHJvdmlkZXIuIFZhbGlkIChjdXJyZW50bHkgcmVnaXN0ZXJlZCkgY3VzdG9tIGtleSBzdG9yZSBwcm92aWRlciBuYW1lcyBhcmU6ICR7b3B0aW9ucy5lbmNyeXB0aW9uS2V5U3RvcmVQcm92aWRlcnN9LiBQbGVhc2UgdmVyaWZ5IGtleSBzdG9yZSBwcm92aWRlciBpbmZvcm1hdGlvbiBpbiBjb2x1bW4gbWFzdGVyIGtleSBkZWZpbml0aW9ucyBpbiB0aGUgZGF0YWJhc2UsIGFuZCB2ZXJpZnkgYWxsIGN1c3RvbSBrZXkgc3RvcmUgcHJvdmlkZXJzIHVzZWQgaW4geW91ciBhcHBsaWNhdGlvbiBhcmUgcmVnaXN0ZXJlZCBwcm9wZXJseS5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBwbGFpbnRleHRLZXk6IEJ1ZmZlciA9IGF3YWl0IHByb3ZpZGVyLmRlY3J5cHRDb2x1bW5FbmNyeXB0aW9uS2V5KGtleUluZm8ua2V5UGF0aCwga2V5SW5mby5hbGdvcml0aG1OYW1lLCBrZXlJbmZvLmVuY3J5cHRlZEtleSk7XG5cbiAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gbmV3IFN5bW1ldHJpY0tleShwbGFpbnRleHRLZXkpO1xuXG4gICAgaWYgKG9wdGlvbnMuY29sdW1uRW5jcnlwdGlvbktleUNhY2hlVFRMID4gMCkge1xuICAgICAgY2FjaGUuc2V0KGtleUxvb2t1cFZhbHVlLCBlbmNyeXB0aW9uS2V5LCBvcHRpb25zLmNvbHVtbkVuY3J5cHRpb25LZXlDYWNoZVRUTCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuY3J5cHRpb25LZXk7XG4gIH1cbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFJQTs7QUFFQTs7OztBQU5BO0FBQ0E7QUFPQSxNQUFNQSxLQUFLLEdBQUcsSUFBSUMsaUJBQUosQ0FBOEIsQ0FBOUIsQ0FBZDs7QUFFTyxNQUFNQyxNQUFNLEdBQUcsT0FBT0MsT0FBUCxFQUFtQ0MsT0FBbkMsS0FBeUY7RUFDN0csSUFBSSxDQUFDQSxPQUFPLENBQUNDLG1CQUFiLEVBQWtDO0lBQ2hDLE1BQU0sSUFBSUMsS0FBSixDQUFVLDBDQUFWLENBQU47RUFDRDs7RUFFRCxNQUFNQyxVQUFrQixHQUFHSCxPQUFPLENBQUNDLG1CQUFuQztFQUVBLE1BQU1HLGNBQWMsR0FBSSxHQUFFRCxVQUFXLElBQUdFLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZUCxPQUFPLENBQUNRLFlBQXBCLEVBQWtDQyxRQUFsQyxDQUEyQyxRQUEzQyxDQUFxRCxJQUFHVCxPQUFPLENBQUNVLFlBQWEsRUFBckg7O0VBRUEsSUFBSWIsS0FBSyxDQUFDYyxHQUFOLENBQVVOLGNBQVYsQ0FBSixFQUErQjtJQUM3QixPQUFPUixLQUFLLENBQUNlLEdBQU4sQ0FBVVAsY0FBVixDQUFQO0VBQ0QsQ0FGRCxNQUVPO0lBQ0wsTUFBTVEsUUFBUSxHQUFHWixPQUFPLENBQUNhLDJCQUFSLElBQXVDYixPQUFPLENBQUNhLDJCQUFSLENBQW9DZCxPQUFPLENBQUNVLFlBQTVDLENBQXhEOztJQUNBLElBQUksQ0FBQ0csUUFBTCxFQUFlO01BQ2IsTUFBTSxJQUFJVixLQUFKLENBQVcsK0VBQThFSCxPQUFPLENBQUNVLFlBQWEsMkxBQTBMVCxPQUFPLENBQUNhLDJCQUE0Qiw4TEFBNVUsQ0FBTjtJQUNEOztJQUVELE1BQU1DLFlBQW9CLEdBQUcsTUFBTUYsUUFBUSxDQUFDRywwQkFBVCxDQUFvQ2hCLE9BQU8sQ0FBQ2lCLE9BQTVDLEVBQXFEakIsT0FBTyxDQUFDa0IsYUFBN0QsRUFBNEVsQixPQUFPLENBQUNRLFlBQXBGLENBQW5DO0lBRUEsTUFBTVcsYUFBYSxHQUFHLElBQUlDLHFCQUFKLENBQWlCTCxZQUFqQixDQUF0Qjs7SUFFQSxJQUFJZCxPQUFPLENBQUNvQiwyQkFBUixHQUFzQyxDQUExQyxFQUE2QztNQUMzQ3hCLEtBQUssQ0FBQ3lCLEdBQU4sQ0FBVWpCLGNBQVYsRUFBMEJjLGFBQTFCLEVBQXlDbEIsT0FBTyxDQUFDb0IsMkJBQWpEO0lBQ0Q7O0lBRUQsT0FBT0YsYUFBUDtFQUNEO0FBQ0YsQ0EzQk0ifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.SymmetricKey = void 0;

// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.
// Copyright (c) 2019 Microsoft Corporation
class SymmetricKey {
  constructor(rootKey) {
    this.rootKey = void 0;

    if (!rootKey) {
      throw new Error('Column encryption key cannot be null.');
    } else if (0 === rootKey.length) {
      throw new Error('Empty column encryption key specified.');
    }

    this.rootKey = rootKey;
  }

  zeroOutKey() {
    this.rootKey = Buffer.alloc(this.rootKey.length);
  }

}

exports.SymmetricKey = SymmetricKey;
var _default = SymmetricKey;
exports.default = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTeW1tZXRyaWNLZXkiLCJjb25zdHJ1Y3RvciIsInJvb3RLZXkiLCJFcnJvciIsImxlbmd0aCIsInplcm9PdXRLZXkiLCJCdWZmZXIiLCJhbGxvYyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbHdheXMtZW5jcnlwdGVkL3N5bW1ldHJpYy1rZXkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBgbXNzcWwtamRiY2AgbGlicmFyeSBwdWJsaXNoZWQgdW5kZXIgdGhlIGNvbmRpdGlvbnMgb2YgTUlUIGxpY2Vuc2UuXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTkgTWljcm9zb2Z0IENvcnBvcmF0aW9uXG5cbmV4cG9ydCBjbGFzcyBTeW1tZXRyaWNLZXkge1xuICByb290S2V5OiBCdWZmZXI7XG5cbiAgY29uc3RydWN0b3Iocm9vdEtleTogQnVmZmVyKSB7XG4gICAgaWYgKCFyb290S2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbHVtbiBlbmNyeXB0aW9uIGtleSBjYW5ub3QgYmUgbnVsbC4nKTtcbiAgICB9IGVsc2UgaWYgKDAgPT09IHJvb3RLZXkubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VtcHR5IGNvbHVtbiBlbmNyeXB0aW9uIGtleSBzcGVjaWZpZWQuJyk7XG4gICAgfVxuICAgIHRoaXMucm9vdEtleSA9IHJvb3RLZXk7XG4gIH1cblxuICB6ZXJvT3V0S2V5KCkge1xuICAgIHRoaXMucm9vdEtleSA9IEJ1ZmZlci5hbGxvYyh0aGlzLnJvb3RLZXkubGVuZ3RoKTtcbiAgfVxufVxuZXhwb3J0IGRlZmF1bHQgU3ltbWV0cmljS2V5O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUVPLE1BQU1BLFlBQU4sQ0FBbUI7RUFHeEJDLFdBQVcsQ0FBQ0MsT0FBRCxFQUFrQjtJQUFBLEtBRjdCQSxPQUU2Qjs7SUFDM0IsSUFBSSxDQUFDQSxPQUFMLEVBQWM7TUFDWixNQUFNLElBQUlDLEtBQUosQ0FBVSx1Q0FBVixDQUFOO0lBQ0QsQ0FGRCxNQUVPLElBQUksTUFBTUQsT0FBTyxDQUFDRSxNQUFsQixFQUEwQjtNQUMvQixNQUFNLElBQUlELEtBQUosQ0FBVSx3Q0FBVixDQUFOO0lBQ0Q7O0lBQ0QsS0FBS0QsT0FBTCxHQUFlQSxPQUFmO0VBQ0Q7O0VBRURHLFVBQVUsR0FBRztJQUNYLEtBQUtILE9BQUwsR0FBZUksTUFBTSxDQUFDQyxLQUFQLENBQWEsS0FBS0wsT0FBTCxDQUFhRSxNQUExQixDQUFmO0VBQ0Q7O0FBZHVCOzs7ZUFnQlhKLFkifQ=="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.SQLServerStatementColumnEncryptionSetting = exports.SQLServerEncryptionType = exports.DescribeParameterEncryptionResultSet2 = exports.DescribeParameterEncryptionResultSet1 = void 0;
// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.
// Copyright (c) 2019 Microsoft Corporation
let SQLServerEncryptionType;
exports.SQLServerEncryptionType = SQLServerEncryptionType;

(function (SQLServerEncryptionType) {
  SQLServerEncryptionType[SQLServerEncryptionType["Deterministic"] = 1] = "Deterministic";
  SQLServerEncryptionType[SQLServerEncryptionType["Randomized"] = 2] = "Randomized";
  SQLServerEncryptionType[SQLServerEncryptionType["PlainText"] = 0] = "PlainText";
})(SQLServerEncryptionType || (exports.SQLServerEncryptionType = SQLServerEncryptionType = {}));

// Fields in the first resultset of "sp_describe_parameter_encryption"
// We expect the server to return the fields in the resultset in the same order as mentioned below.
// If the server changes the below order, then transparent parameter encryption will break.
let DescribeParameterEncryptionResultSet1; // Fields in the second resultset of "sp_describe_parameter_encryption"
// We expect the server to return the fields in the resultset in the same order as mentioned below.
// If the server changes the below order, then transparent parameter encryption will break.

exports.DescribeParameterEncryptionResultSet1 = DescribeParameterEncryptionResultSet1;

(function (DescribeParameterEncryptionResultSet1) {
  DescribeParameterEncryptionResultSet1[DescribeParameterEncryptionResultSet1["KeyOrdinal"] = 0] = "KeyOrdinal";
  DescribeParameterEncryptionResultSet1[DescribeParameterEncryptionResultSet1["DbId"] = 1] = "DbId";
  DescribeParameterEncryptionResultSet1[DescribeParameterEncryptionResultSet1["KeyId"] = 2] = "KeyId";
  DescribeParameterEncryptionResultSet1[DescribeParameterEncryptionResultSet1["KeyVersion"] = 3] = "KeyVersion";
  DescribeParameterEncryptionResultSet1[DescribeParameterEncryptionResultSet1["KeyMdVersion"] = 4] = "KeyMdVersion";
  DescribeParameterEncryptionResultSet1[DescribeParameterEncryptionResultSet1["EncryptedKey"] = 5] = "EncryptedKey";
  DescribeParameterEncryptionResultSet1[DescribeParameterEncryptionResultSet1["ProviderName"] = 6] = "ProviderName";
  DescribeParameterEncryptionResultSet1[DescribeParameterEncryptionResultSet1["KeyPath"] = 7] = "KeyPath";
  DescribeParameterEncryptionResultSet1[DescribeParameterEncryptionResultSet1["KeyEncryptionAlgorithm"] = 8] = "KeyEncryptionAlgorithm";
})(DescribeParameterEncryptionResultSet1 || (exports.DescribeParameterEncryptionResultSet1 = DescribeParameterEncryptionResultSet1 = {}));

let DescribeParameterEncryptionResultSet2;
exports.DescribeParameterEncryptionResultSet2 = DescribeParameterEncryptionResultSet2;

(function (DescribeParameterEncryptionResultSet2) {
  DescribeParameterEncryptionResultSet2[DescribeParameterEncryptionResultSet2["ParameterOrdinal"] = 0] = "ParameterOrdinal";
  DescribeParameterEncryptionResultSet2[DescribeParameterEncryptionResultSet2["ParameterName"] = 1] = "ParameterName";
  DescribeParameterEncryptionResultSet2[DescribeParameterEncryptionResultSet2["ColumnEncryptionAlgorithm"] = 2] = "ColumnEncryptionAlgorithm";
  DescribeParameterEncryptionResultSet2[DescribeParameterEncryptionResultSet2["ColumnEncrytionType"] = 3] = "ColumnEncrytionType";
  DescribeParameterEncryptionResultSet2[DescribeParameterEncryptionResultSet2["ColumnEncryptionKeyOrdinal"] = 4] = "ColumnEncryptionKeyOrdinal";
  DescribeParameterEncryptionResultSet2[DescribeParameterEncryptionResultSet2["NormalizationRuleVersion"] = 5] = "NormalizationRuleVersion";
})(DescribeParameterEncryptionResultSet2 || (exports.DescribeParameterEncryptionResultSet2 = DescribeParameterEncryptionResultSet2 = {}));

let SQLServerStatementColumnEncryptionSetting;
exports.SQLServerStatementColumnEncryptionSetting = SQLServerStatementColumnEncryptionSetting;

(function (SQLServerStatementColumnEncryptionSetting) {
  SQLServerStatementColumnEncryptionSetting[SQLServerStatementColumnEncryptionSetting["UseConnectionSetting"] = 0] = "UseConnectionSetting";
  SQLServerStatementColumnEncryptionSetting[SQLServerStatementColumnEncryptionSetting["Enabled"] = 1] = "Enabled";
  SQLServerStatementColumnEncryptionSetting[SQLServerStatementColumnEncryptionSetting["ResultSetOnly"] = 2] = "ResultSetOnly";
  SQLServerStatementColumnEncryptionSetting[SQLServerStatementColumnEncryptionSetting["Disabled"] = 3] = "Disabled";
})(SQLServerStatementColumnEncryptionSetting || (exports.SQLServerStatementColumnEncryptionSetting = SQLServerStatementColumnEncryptionSetting = {}));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTUUxTZXJ2ZXJFbmNyeXB0aW9uVHlwZSIsIkRlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEiLCJEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQyIiwiU1FMU2VydmVyU3RhdGVtZW50Q29sdW1uRW5jcnlwdGlvblNldHRpbmciXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYWx3YXlzLWVuY3J5cHRlZC90eXBlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIGBtc3NxbC1qZGJjYCBsaWJyYXJ5IHB1Ymxpc2hlZCB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiBNSVQgbGljZW5zZS5cbi8vIENvcHlyaWdodCAoYykgMjAxOSBNaWNyb3NvZnQgQ29ycG9yYXRpb25cblxuaW1wb3J0IHsgQ0VLRW50cnkgfSBmcm9tICcuL2Nlay1lbnRyeSc7XG5pbXBvcnQgeyBCYXNlTWV0YWRhdGEgfSBmcm9tICcuLi9tZXRhZGF0YS1wYXJzZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVuY3J5cHRpb25LZXlJbmZvIHtcbiAgZW5jcnlwdGVkS2V5OiBCdWZmZXI7XG4gIGRiSWQ6IG51bWJlcjtcbiAga2V5SWQ6IG51bWJlcjtcbiAga2V5VmVyc2lvbjogbnVtYmVyO1xuICBtZFZlcnNpb246IEJ1ZmZlcjtcbiAga2V5UGF0aDogc3RyaW5nO1xuICBrZXlTdG9yZU5hbWU6IHN0cmluZztcbiAgYWxnb3JpdGhtTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgZW51bSBTUUxTZXJ2ZXJFbmNyeXB0aW9uVHlwZSB7XG4gIERldGVybWluaXN0aWMgPSAxLFxuICBSYW5kb21pemVkID0gMixcbiAgUGxhaW5UZXh0ID0gMCxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbmNyeXB0aW9uQWxnb3JpdGhtIHtcbiAgZW5jcnlwdERhdGE6IChwbGFpblRleHQ6IEJ1ZmZlcikgPT4gQnVmZmVyO1xuICBkZWNyeXB0RGF0YTogKGNpcGhlclRleHQ6IEJ1ZmZlcikgPT4gQnVmZmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyeXB0b01ldGFkYXRhIHtcbiAgY2VrRW50cnk/OiBDRUtFbnRyeTtcbiAgY2lwaGVyQWxnb3JpdGhtSWQ6IG51bWJlcjtcbiAgY2lwaGVyQWxnb3JpdGhtTmFtZT86IHN0cmluZztcbiAgbm9ybWFsaXphdGlvblJ1bGVWZXJzaW9uOiBCdWZmZXI7XG4gIGVuY3J5cHRpb25LZXlJbmZvPzogRW5jcnlwdGlvbktleUluZm87XG4gIG9yZGluYWw6IG51bWJlcjtcbiAgZW5jcnlwdGlvblR5cGU6IFNRTFNlcnZlckVuY3J5cHRpb25UeXBlO1xuICBjaXBoZXJBbGdvcml0aG0/OiBFbmNyeXB0aW9uQWxnb3JpdGhtO1xuICBiYXNlVHlwZUluZm8/OiBCYXNlTWV0YWRhdGE7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGFzaE1hcDxUPiB7XG4gIFtoYXNoOiBzdHJpbmddOiBUO1xufVxuXG5cbi8vIEZpZWxkcyBpbiB0aGUgZmlyc3QgcmVzdWx0c2V0IG9mIFwic3BfZGVzY3JpYmVfcGFyYW1ldGVyX2VuY3J5cHRpb25cIlxuLy8gV2UgZXhwZWN0IHRoZSBzZXJ2ZXIgdG8gcmV0dXJuIHRoZSBmaWVsZHMgaW4gdGhlIHJlc3VsdHNldCBpbiB0aGUgc2FtZSBvcmRlciBhcyBtZW50aW9uZWQgYmVsb3cuXG4vLyBJZiB0aGUgc2VydmVyIGNoYW5nZXMgdGhlIGJlbG93IG9yZGVyLCB0aGVuIHRyYW5zcGFyZW50IHBhcmFtZXRlciBlbmNyeXB0aW9uIHdpbGwgYnJlYWsuXG5leHBvcnQgZW51bSBEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxIHtcbiAgS2V5T3JkaW5hbCxcbiAgRGJJZCxcbiAgS2V5SWQsXG4gIEtleVZlcnNpb24sXG4gIEtleU1kVmVyc2lvbixcbiAgRW5jcnlwdGVkS2V5LFxuICBQcm92aWRlck5hbWUsXG4gIEtleVBhdGgsXG4gIEtleUVuY3J5cHRpb25BbGdvcml0aG1cbn1cblxuXG4vLyBGaWVsZHMgaW4gdGhlIHNlY29uZCByZXN1bHRzZXQgb2YgXCJzcF9kZXNjcmliZV9wYXJhbWV0ZXJfZW5jcnlwdGlvblwiXG4vLyBXZSBleHBlY3QgdGhlIHNlcnZlciB0byByZXR1cm4gdGhlIGZpZWxkcyBpbiB0aGUgcmVzdWx0c2V0IGluIHRoZSBzYW1lIG9yZGVyIGFzIG1lbnRpb25lZCBiZWxvdy5cbi8vIElmIHRoZSBzZXJ2ZXIgY2hhbmdlcyB0aGUgYmVsb3cgb3JkZXIsIHRoZW4gdHJhbnNwYXJlbnQgcGFyYW1ldGVyIGVuY3J5cHRpb24gd2lsbCBicmVhay5cbmV4cG9ydCBlbnVtIERlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDIge1xuICBQYXJhbWV0ZXJPcmRpbmFsLFxuICBQYXJhbWV0ZXJOYW1lLFxuICBDb2x1bW5FbmNyeXB0aW9uQWxnb3JpdGhtLFxuICBDb2x1bW5FbmNyeXRpb25UeXBlLFxuICBDb2x1bW5FbmNyeXB0aW9uS2V5T3JkaW5hbCxcbiAgTm9ybWFsaXphdGlvblJ1bGVWZXJzaW9uXG59XG5cbmV4cG9ydCBlbnVtIFNRTFNlcnZlclN0YXRlbWVudENvbHVtbkVuY3J5cHRpb25TZXR0aW5nIHtcbiAgLyoqXG4gICAqIGlmIFwiQ29sdW1uIEVuY3J5cHRpb24gU2V0dGluZz1FbmFibGVkXCIgaW4gdGhlIGNvbm5lY3Rpb24gc3RyaW5nLCB1c2UgRW5hYmxlZC4gT3RoZXJ3aXNlLCBtYXBzIHRvIERpc2FibGVkLlxuICAgKi9cbiAgVXNlQ29ubmVjdGlvblNldHRpbmcsXG4gIC8qKlxuICAgKiBFbmFibGVzIFRDRSBmb3IgdGhlIGNvbW1hbmQuIE92ZXJyaWRlcyB0aGUgY29ubmVjdGlvbiBsZXZlbCBzZXR0aW5nIGZvciB0aGlzIGNvbW1hbmQuXG4gICAqL1xuICBFbmFibGVkLFxuICAvKipcbiAgICogUGFyYW1ldGVycyB3aWxsIG5vdCBiZSBlbmNyeXB0ZWQsIG9ubHkgdGhlIFJlc3VsdFNldCB3aWxsIGJlIGRlY3J5cHRlZC4gVGhpcyBpcyBhbiBvcHRpbWl6YXRpb24gZm9yIHF1ZXJpZXMgdGhhdFxuICAgKiBkbyBub3QgcGFzcyBhbnkgZW5jcnlwdGVkIGlucHV0IHBhcmFtZXRlcnMuIE92ZXJyaWRlcyB0aGUgY29ubmVjdGlvbiBsZXZlbCBzZXR0aW5nIGZvciB0aGlzIGNvbW1hbmQuXG4gICAqL1xuICBSZXN1bHRTZXRPbmx5LFxuICAvKipcbiAgICogRGlzYWJsZXMgVENFIGZvciB0aGUgY29tbWFuZC5PdmVycmlkZXMgdGhlIGNvbm5lY3Rpb24gbGV2ZWwgc2V0dGluZyBmb3IgdGhpcyBjb21tYW5kLlxuICAgKi9cbiAgRGlzYWJsZWQsXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7SUFnQllBLHVCOzs7V0FBQUEsdUI7RUFBQUEsdUIsQ0FBQUEsdUI7RUFBQUEsdUIsQ0FBQUEsdUI7RUFBQUEsdUIsQ0FBQUEsdUI7R0FBQUEsdUIsdUNBQUFBLHVCOztBQTRCWjtBQUNBO0FBQ0E7SUFDWUMscUMsRUFhWjtBQUNBO0FBQ0E7Ozs7V0FmWUEscUM7RUFBQUEscUMsQ0FBQUEscUM7RUFBQUEscUMsQ0FBQUEscUM7RUFBQUEscUMsQ0FBQUEscUM7RUFBQUEscUMsQ0FBQUEscUM7RUFBQUEscUMsQ0FBQUEscUM7RUFBQUEscUMsQ0FBQUEscUM7RUFBQUEscUMsQ0FBQUEscUM7RUFBQUEscUMsQ0FBQUEscUM7RUFBQUEscUMsQ0FBQUEscUM7R0FBQUEscUMscURBQUFBLHFDOztJQWdCQUMscUM7OztXQUFBQSxxQztFQUFBQSxxQyxDQUFBQSxxQztFQUFBQSxxQyxDQUFBQSxxQztFQUFBQSxxQyxDQUFBQSxxQztFQUFBQSxxQyxDQUFBQSxxQztFQUFBQSxxQyxDQUFBQSxxQztFQUFBQSxxQyxDQUFBQSxxQztHQUFBQSxxQyxxREFBQUEscUM7O0lBU0FDLHlDOzs7V0FBQUEseUM7RUFBQUEseUMsQ0FBQUEseUM7RUFBQUEseUMsQ0FBQUEseUM7RUFBQUEseUMsQ0FBQUEseUM7RUFBQUEseUMsQ0FBQUEseUM7R0FBQUEseUMseURBQUFBLHlDIn0="use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.shouldHonorAE = void 0;

var _types = require("./types");

// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.
// Copyright (c) 2019 Microsoft Corporation
const shouldHonorAE = (stmtColumnEncryptionSetting, columnEncryptionSetting) => {
  switch (stmtColumnEncryptionSetting) {
    case _types.SQLServerStatementColumnEncryptionSetting.Disabled:
    case _types.SQLServerStatementColumnEncryptionSetting.ResultSetOnly:
      return false;

    case _types.SQLServerStatementColumnEncryptionSetting.Enabled:
      return true;

    default:
      return columnEncryptionSetting;
  }
};

exports.shouldHonorAE = shouldHonorAE;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzaG91bGRIb25vckFFIiwic3RtdENvbHVtbkVuY3J5cHRpb25TZXR0aW5nIiwiY29sdW1uRW5jcnlwdGlvblNldHRpbmciLCJTUUxTZXJ2ZXJTdGF0ZW1lbnRDb2x1bW5FbmNyeXB0aW9uU2V0dGluZyIsIkRpc2FibGVkIiwiUmVzdWx0U2V0T25seSIsIkVuYWJsZWQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYWx3YXlzLWVuY3J5cHRlZC91dGlscy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIGBtc3NxbC1qZGJjYCBsaWJyYXJ5IHB1Ymxpc2hlZCB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiBNSVQgbGljZW5zZS5cbi8vIENvcHlyaWdodCAoYykgMjAxOSBNaWNyb3NvZnQgQ29ycG9yYXRpb25cblxuaW1wb3J0IHsgU1FMU2VydmVyU3RhdGVtZW50Q29sdW1uRW5jcnlwdGlvblNldHRpbmcgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IHNob3VsZEhvbm9yQUUgPSAoc3RtdENvbHVtbkVuY3J5cHRpb25TZXR0aW5nOiBTUUxTZXJ2ZXJTdGF0ZW1lbnRDb2x1bW5FbmNyeXB0aW9uU2V0dGluZywgY29sdW1uRW5jcnlwdGlvblNldHRpbmc6IGJvb2xlYW4pOiBib29sZWFuID0+IHtcbiAgc3dpdGNoIChzdG10Q29sdW1uRW5jcnlwdGlvblNldHRpbmcpIHtcbiAgICBjYXNlIFNRTFNlcnZlclN0YXRlbWVudENvbHVtbkVuY3J5cHRpb25TZXR0aW5nLkRpc2FibGVkOlxuICAgIGNhc2UgU1FMU2VydmVyU3RhdGVtZW50Q29sdW1uRW5jcnlwdGlvblNldHRpbmcuUmVzdWx0U2V0T25seTpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjYXNlIFNRTFNlcnZlclN0YXRlbWVudENvbHVtbkVuY3J5cHRpb25TZXR0aW5nLkVuYWJsZWQ6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGNvbHVtbkVuY3J5cHRpb25TZXR0aW5nO1xuICB9XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBR0E7O0FBSEE7QUFDQTtBQUlPLE1BQU1BLGFBQWEsR0FBRyxDQUFDQywyQkFBRCxFQUF5RUMsdUJBQXpFLEtBQXVIO0VBQ2xKLFFBQVFELDJCQUFSO0lBQ0UsS0FBS0UsaURBQTBDQyxRQUEvQztJQUNBLEtBQUtELGlEQUEwQ0UsYUFBL0M7TUFDRSxPQUFPLEtBQVA7O0lBQ0YsS0FBS0YsaURBQTBDRyxPQUEvQztNQUNFLE9BQU8sSUFBUDs7SUFDRjtNQUNFLE9BQU9KLHVCQUFQO0VBUEo7QUFTRCxDQVZNIn0=# Tedious Benchmarks

This folder contains a collection of benchmarks for `tedious`.

Running an existing benchmark is easy, simply execute the benchmark file with `node`:

```sh
node benchmarks/query/select-many-rows.js
```

**NOTE:** The benchmarks try to load `tedious` code from `lib`, so make sure
you run `npm run prepublish` first.
'use strict';

const fs = require('fs');
const child_process = require('child_process');

const {
  PerformanceObserver,
  constants: {
    NODE_PERFORMANCE_GC_INCREMENTAL,
    NODE_PERFORMANCE_GC_MAJOR,
    NODE_PERFORMANCE_GC_MINOR
  }
} = require('perf_hooks');

require('@babel/register')({ extensions: ['.ts'] });

const { Connection } = require('../src/tedious');

// The `Benchmark` class is taken from Node.js - see
// https://github.com/nodejs/node/blob/0f96dc266fd0cd8c1baa82ce7eb951c11b29a331/benchmark/common.js
// Copyright Node.js contributors. All rights reserved.
function Benchmark(fn, configs, options) {
  // Use the file name as the name of the benchmark
  this.name = require.main.filename.slice(__dirname.length + 1);
  // Parse job-specific configuration from the command line arguments
  const parsed_args = this._parseArgs(process.argv.slice(2), configs);
  this.options = parsed_args.cli;
  this.extra_options = parsed_args.extra;
  // The configuration list as a queue of jobs
  this.queue = this._queue(this.options);
  // The configuration of the current job, head of the queue
  this.config = this.queue[0];
  // Execution arguments i.e. flags used to run the jobs
  this.flags = [];
  if (options && options.flags) {
    this.flags = this.flags.concat(options.flags);
  }
  if (process.env.NODE_BENCHMARK_FLAGS) {
    const flags = process.env.NODE_BENCHMARK_FLAGS.split(/\s+/);
    this.flags = this.flags.concat(flags);
  }
  // Holds process.hrtime value
  this._time = [0, 0];
  // Used to make sure a benchmark only start a timer once
  this._started = false;

  this._gcStats = {
    [NODE_PERFORMANCE_GC_INCREMENTAL]: {
      count: 0,
      totalDuration: 0
    },
    [NODE_PERFORMANCE_GC_MINOR]: {
      count: 0,
      totalDuration: 0
    },
    [NODE_PERFORMANCE_GC_MAJOR]: {
      count: 0,
      totalDuration: 0
    }
  };

  this._observer = new PerformanceObserver((list) => {
    const entries = list.getEntries();
    const length = entries.length;

    for (let i = 0; i < length; i++) {
      const entry = entries[i];
      const stats = this._gcStats[entry.kind];

      if (stats) {
        stats.count += 1;
        stats.totalDuration += entry.duration;
      }
    }
  });

  // this._run will use fork() to create a new process for each configuration
  // combination.
  if (process.env.hasOwnProperty('NODE_RUN_BENCHMARK_FN')) {
    process.nextTick(() => fn(this.config));
  } else {
    process.nextTick(() => this._run());
  }
}

Benchmark.prototype._parseArgs = function(argv, configs) {
  const cliOptions = {};
  const extraOptions = {};
  const validArgRE = /^(.+?)=([\s\S]*)$/;
  // Parse configuration arguments
  for (const arg of argv) {
    const match = arg.match(validArgRE);
    if (!match) {
      console.error(`bad argument: ${arg}`);
      process.exit(1);
    }
    const config = match[1];

    if (configs[config]) {
      // Infer the type from the config object and parse accordingly
      const isNumber = typeof configs[config][0] === 'number';
      const value = isNumber ? +match[2] : match[2];
      if (!cliOptions[config])
        cliOptions[config] = [];
      cliOptions[config].push(value);
    } else {
      extraOptions[config] = match[2];
    }
  }
  return { cli: Object.assign({}, configs, cliOptions), extra: extraOptions };
};

Benchmark.prototype._queue = function(options) {
  const queue = [];
  const keys = Object.keys(options);

  // Perform a depth-first walk though all options to generate a
  // configuration list that contains all combinations.
  function recursive(keyIndex, prevConfig) {
    const key = keys[keyIndex];
    const values = options[key];
    const type = typeof values[0];

    for (const value of values) {
      if (typeof value !== 'number' && typeof value !== 'string') {
        throw new TypeError(`configuration "${key}" had type ${typeof value}`);
      }
      if (typeof value !== type) {
        // This is a requirement for being able to consistently and predictably
        // parse CLI provided configuration values.
        throw new TypeError(`configuration "${key}" has mixed types`);
      }

      const currConfig = Object.assign({ [key]: value }, prevConfig);

      if (keyIndex + 1 < keys.length) {
        recursive(keyIndex + 1, currConfig);
      } else {
        queue.push(currConfig);
      }
    }
  }

  if (keys.length > 0) {
    recursive(0, {});
  } else {
    queue.push({});
  }

  return queue;
};

Benchmark.prototype._run = function() {
  const self = this;
  // If forked, report to the parent.
  if (process.send) {
    process.send({
      type: 'config',
      name: this.name,
      queueLength: this.queue.length,
    });
  }

  (function recursive(queueIndex) {
    const config = self.queue[queueIndex];

    // Set NODE_RUN_BENCHMARK_FN to indicate that the child shouldn't construct
    // a configuration queue, but just execute the benchmark function.
    const childEnv = Object.assign({}, process.env);
    childEnv.NODE_RUN_BENCHMARK_FN = '';

    // Create configuration arguments
    const childArgs = [];
    for (const key of Object.keys(config)) {
      childArgs.push(`${key}=${config[key]}`);
    }
    for (const key of Object.keys(self.extra_options)) {
      childArgs.push(`${key}=${self.extra_options[key]}`);
    }

    const child = child_process.fork(require.main.filename, childArgs, {
      env: childEnv,
      execArgv: self.flags.concat(process.execArgv),
    });
    child.on('message', sendResult);
    child.on('close', (code) => {
      if (code) {
        process.exit(code);
      }

      if (queueIndex + 1 < self.queue.length) {
        recursive(queueIndex + 1);
      }
    });
  })(0);
};

Benchmark.prototype.start = function() {
  if (this._started) {
    throw new Error('Called start more than once in a single benchmark');
  }
  this._started = true;
  this._observer.observe({ entryTypes: ['gc'], buffered: false });

  this._time = process.hrtime();
};

Benchmark.prototype.end = function(operations) {
  // Get elapsed time now and do error checking later for accuracy.
  const elapsed = process.hrtime(this._time);

  if (!this._started) {
    throw new Error('called end without start');
  }
  if (typeof operations !== 'number') {
    throw new Error('called end() without specifying operation count');
  }
  if (!process.env.NODEJS_BENCHMARK_ZERO_ALLOWED && operations <= 0) {
    throw new Error('called end() with operation count <= 0');
  }
  if (elapsed[0] === 0 && elapsed[1] === 0) {
    if (!process.env.NODEJS_BENCHMARK_ZERO_ALLOWED)
      throw new Error('insufficient clock precision for short benchmark');
    // Avoid dividing by zero
    elapsed[1] = 1;
  }

  this._observer.disconnect();

  const time = elapsed[0] + elapsed[1] / 1e9;
  const rate = operations / time;
  this.report(rate, elapsed);
};

function formatResult(data) {
  // Construct configuration string, " A=a, B=b, ..."
  let conf = '';
  for (const key of Object.keys(data.conf)) {
    conf += ` ${key}=${JSON.stringify(data.conf[key])}`;
  }

  var rate = data.rate.toString().split('.');
  rate[0] = rate[0].replace(/(\d)(?=(?:\d\d\d)+(?!\d))/g, '$1,');
  rate = (rate[1] ? rate.join('.') : rate[0]);

  var gcInfo;
  gcInfo = `(minor: ${data.gcStats[NODE_PERFORMANCE_GC_MINOR].count} - ${data.gcStats[NODE_PERFORMANCE_GC_MINOR].totalDuration}ms,`;
  gcInfo += ` major: ${data.gcStats[NODE_PERFORMANCE_GC_MAJOR].count} - ${data.gcStats[NODE_PERFORMANCE_GC_MAJOR].totalDuration}ms,`;
  gcInfo += ` incremental: ${data.gcStats[NODE_PERFORMANCE_GC_INCREMENTAL].count} - ${data.gcStats[NODE_PERFORMANCE_GC_INCREMENTAL].totalDuration}ms)`;

  return `${data.name}${conf}: ${rate} ${gcInfo}`;
}

function sendResult(data) {
  if (process.send) {
    // If forked, report by process send
    process.send(data);
  } else {
    // Otherwise report by stdout
    console.log(formatResult(data));
  }
}

Benchmark.prototype.report = function(rate, elapsed) {
  sendResult({
    name: this.name,
    conf: this.config,
    rate: rate,
    time: elapsed[0] + elapsed[1] / 1e9,
    type: 'report',
    gcStats: this._gcStats
  });
};

function createBenchmark(fn, configs, options) {
  return new Benchmark(fn, configs, options);
}

function createConnection(cb) {
  var config = JSON.parse(fs.readFileSync(require('os').homedir() + '/.tedious/test-connection.json', 'utf8')).config;

  var connection = new Connection(config);
  connection.connect(function() {
    cb(connection);
  });
}

module.exports.createBenchmark = createBenchmark;
module.exports.createConnection = createConnection;
const { createBenchmark } = require('../common');

const { Parser } = require('../../src/token/token-stream-parser');

const bench = createBenchmark(main, {
  n: [10, 100, 1000],
  tokenCount: [10, 100, 1000, 10000]
});

async function * repeat(data, n) {
  for (let i = 0; i < n; i++) {
    yield data;
  }
}

function main({ n, tokenCount }) {
  const data = Buffer.from('810300000000001000380269006400000000000900e7c8000904d00034046e0061006d006500000000000900e7ffff0904d000340b6400650073006300720069007000740069006f006e00'.repeat(tokenCount), 'hex');
  const parser = new Parser(repeat(data, n), { token: function() { } }, {}, {});

  bench.start();

  parser.on('end', () => {
    bench.end(n);
  });
}
const { createBenchmark } = require('../common');

const { Parser } = require('../../src/token/token-stream-parser');

const bench = createBenchmark(main, {
  n: [10, 100, 1000],
  tokenCount: [10, 100, 1000, 10000]
});

async function * repeat(data, n) {
  for (let i = 0; i < n; i++) {
    yield data;
  }
}

function main({ n, tokenCount }) {
  const data = Buffer.from('FE0000E0000000000000000000'.repeat(tokenCount), 'hex');
  const parser = new Parser(repeat(data, n), { token: function() { } }, {}, {});

  bench.start();

  parser.on('end', () => {
    bench.end(n);
  });
}
const { createBenchmark } = require('../common');

const { Parser } = require('../../src/token/token-stream-parser');

const bench = createBenchmark(main, {
  n: [10, 100, 1000]
});

async function * repeat(data, n) {
  for (let i = 0; i < n; i++) {
    yield data;
  }
}

function main({ n }) {
  const data = Buffer.from([
    '810300000000001000380269006400000000000900E7C8000904D00034046E00',
    '61006D006500000000000900E7FFFF0904D000340B6400650073006300720069',
    '007000740069006F006E00D1010000000A0052006F0077002000300044000000',
    '00000000440000004500780061006D0070006C00650020005400650073007400',
    '20004400650073006300720069007000740069006F006E00200066006F007200',
    '200052006F0077002000300000000000D1020000000A0052006F007700200031',
    '004400000000000000440000004500780061006D0070006C0065002000540065',
    '007300740020004400650073006300720069007000740069006F006E00200066',
    '006F007200200052006F0077002000310000000000D1030000000A0052006F00',
    '7700200032004400000000000000440000004500780061006D0070006C006500',
    '2000540065007300740020004400650073006300720069007000740069006F00',
    '6E00200066006F007200200052006F0077002000320000000000D1040000000A',
    '0052006F007700200033004400000000000000440000004500780061006D0070',
    '006C006500200054006500730074002000440065007300630072006900700074',
    '0069006F006E00200066006F007200200052006F0077002000330000000000D1',
    '050000000A0052006F0077002000340044000000000000004400000045007800',
    '61006D0070006C00650020005400650073007400200044006500730063007200',
    '69007000740069006F006E00200066006F007200200052006F00770020003400',
    '00000000D1060000000A0052006F007700200035004400000000000000440000',
    '004500780061006D0070006C0065002000540065007300740020004400650073',
    '006300720069007000740069006F006E00200066006F007200200052006F0077',
    '002000350000000000D1070000000A0052006F00770020003600440000000000',
    '0000440000004500780061006D0070006C006500200054006500730074002000',
    '4400650073006300720069007000740069006F006E00200066006F0072002000',
    '52006F0077002000360000000000D1080000000A0052006F0077002000370044',
    '00000000000000440000004500780061006D0070006C00650020005400650073',
    '00740020004400650073006300720069007000740069006F006E00200066006F',
    '007200200052006F0077002000370000000000D1090000000A0052006F007700',
    '200038004400000000000000440000004500780061006D0070006C0065002000',
    '540065007300740020004400650073006300720069007000740069006F006E00',
    '200066006F007200200052006F0077002000380000000000D10A0000000A0052',
    '006F007700200039004400000000000000440000004500780061006D0070006C',
    '0065002000540065007300740020004400650073006300720069007000740069',
    '006F006E00200066006F007200200052006F0077002000390000000000D10B00',
    '00000C0052006F00770020003100300046000000000000004600000045007800',
    '61006D0070006C00650020005400650073007400200044006500730063007200',
    '69007000740069006F006E00200066006F007200200052006F00770020003100',
    '300000000000D10C0000000C0052006F00770020003100310046000000000000',
    '00460000004500780061006D0070006C00650020005400650073007400200044',
    '00650073006300720069007000740069006F006E00200066006F007200200052',
    '006F00770020003100310000000000D10D0000000C0052006F00770020003100',
    '32004600000000000000460000004500780061006D0070006C00650020005400',
    '65007300740020004400650073006300720069007000740069006F006E002000',
    '66006F007200200052006F00770020003100320000000000D10E0000000C0052',
    '006F0077002000310033004600000000000000460000004500780061006D0070',
    '006C006500200054006500730074002000440065007300630072006900700074',
    '0069006F006E00200066006F007200200052006F007700200031003300000000',
    '00D10F0000000C0052006F007700200031003400460000000000000046000000',
    '4500780061006D0070006C006500200054006500730074002000440065007300',
    '6300720069007000740069006F006E00200066006F007200200052006F007700',
    '20003100340000000000D1100000000C0052006F007700200031003500460000',
    '0000000000460000004500780061006D0070006C006500200054006500730074',
    '0020004400650073006300720069007000740069006F006E00200066006F0072',
    '00200052006F00770020003100350000000000D1110000000C0052006F007700',
    '2000310036004600000000000000460000004500780061006D0070006C006500',
    '2000540065007300740020004400650073006300720069007000740069006F00',
    '6E00200066006F007200200052006F00770020003100360000000000D1120000',
    '000C0052006F0077002000310037004600000000000000460000004500780061',
    '006D0070006C0065002000540065007300740020004400650073006300720069',
    '007000740069006F006E00200066006F007200200052006F0077002000310037',
    '0000000000D1130000000C0052006F0077002000310038004600000000000000',
    '460000004500780061006D0070006C0065002000540065007300740020004400',
    '650073006300720069007000740069006F006E00200066006F00720020005200',
    '6F00770020003100380000000000D1140000000C0052006F0077002000310039',
    '004600000000000000460000004500780061006D0070006C0065002000540065',
    '007300740020004400650073006300720069007000740069006F006E00200066',
    '006F007200200052006F00770020003100390000000000D1150000000C005200',
    '6F0077002000320030004600000000000000460000004500780061006D007000',
    '6C00650020005400650073007400200044006500730063007200690070007400',
    '69006F006E00200066006F007200200052006F00770020003200300000000000',
    'D1160000000C0052006F00770020003200310046000000000000004600000045',
    '00780061006D0070006C00650020005400650073007400200044006500730063',
    '00720069007000740069006F006E00200066006F007200200052006F00770020',
    '003200310000000000D1170000000C0052006F00770020003200320046000000',
    '00000000460000004500780061006D0070006C00650020005400650073007400',
    '20004400650073006300720069007000740069006F006E00200066006F007200',
    '200052006F00770020003200320000000000D1180000000C0052006F00770020',
    '00320033004600000000000000460000004500780061006D0070006C00650020',
    '00540065007300740020004400650073006300720069007000740069006F006E',
    '00200066006F007200200052006F00770020003200330000000000D119000000',
    '0C0052006F007700200032003400460000000000000046000000450078006100',
    '6D0070006C006500200054006500730074002000440065007300630072006900',
    '7000740069006F006E00200066006F007200200052006F007700200032003400',
    '00000000D11A0000000C0052006F007700200032003500460000000000000046',
    '0000004500780061006D0070006C006500200054006500730074002000440065',
    '0073006300720069007000740069006F006E00200066006F007200200052006F',
    '00770020003200350000000000D11B0000000C0052006F007700200032003600',
    '4600000000000000460000004500780061006D0070006C006500200054006500',
    '7300740020004400650073006300720069007000740069006F006E0020006600',
    '6F007200200052006F00770020003200360000000000D11C0000000C0052006F',
    '0077002000320037004600000000000000460000004500780061006D0070006C',
    '0065002000540065007300740020004400650073006300720069007000740069',
    '006F006E00200066006F007200200052006F00770020003200370000000000D1',
    '1D0000000C0052006F0077002000320038004600000000000000460000004500',
    '780061006D0070006C0065002000540065007300740020004400650073006300',
    '720069007000740069006F006E00200066006F007200200052006F0077002000',
    '3200380000000000D11E0000000C0052006F0077002000320039004600000000',
    '000000460000004500780061006D0070006C0065002000540065007300740020',
    '004400650073006300720069007000740069006F006E00200066006F00720020',
    '0052006F00770020003200390000000000D11F0000000C0052006F0077002000',
    '330030004600000000000000460000004500780061006D0070006C0065002000',
    '540065007300740020004400650073006300720069007000740069006F006E00',
    '200066006F007200200052006F00770020003300300000000000D1200000000C',
    '0052006F0077002000330031004600000000000000460000004500780061006D',
    '0070006C00650020005400650073007400200044006500730063007200690070',
    '00740069006F006E00200066006F007200200052006F00770020003300310000',
    '000000D1210000000C0052006F00770020003300320046000000000000004600',
    '00004500780061006D0070006C00650020005400650073007400200044006500',
    '73006300720069007000740069006F006E00200066006F007200200052006F00',
    '770020003300320000000000D1220000000C0052006F00770020003300330046',
    '00000000000000460000004500780061006D0070006C00650020005400650073',
    '00740020004400650073006300720069007000740069006F006E00200066006F',
    '007200200052006F00770020003300330000000000D1230000000C0052006F00',
    '77002000330034004600000000000000460000004500780061006D0070006C00',
    '6500200054006500730074002000440065007300630072006900700074006900',
    '6F006E00200066006F007200200052006F00770020003300340000000000D124',
    '0000000C0052006F007700200033003500460000000000000046000000450078',
    '0061006D0070006C006500200054006500730074002000440065007300630072',
    '0069007000740069006F006E00200066006F007200200052006F007700200033',
    '00350000000000D1250000000C0052006F007700200033003600460000000000',
    '0000460000004500780061006D0070006C006500200054006500730074002000',
    '4400650073006300720069007000740069006F006E00200066006F0072002000',
    '52006F00770020003300360000000000D1260000000C0052006F007700200033',
    '0037004600000000000000460000004500780061006D0070006C006500200054',
    '0065007300740020004400650073006300720069007000740069006F006E0020',
    '0066006F007200200052006F00770020003300370000000000D1270000000C00',
    '52006F0077002000330038004600000000000000200000004500780061006D00',
    '70006C006500200054006500730074002000440065007300',
    '260000006300720069007000740069006F006E00200066006F00720020005200',
    '6F00770020003300380000000000D1280000000C0052006F0077002000330039',
    '004600000000000000460000004500780061006D0070006C0065002000540065',
    '007300740020004400650073006300720069007000740069006F006E00200066',
    '006F007200200052006F00770020003300390000000000D1290000000C005200',
    '6F0077002000340030004600000000000000460000004500780061006D007000',
    '6C00650020005400650073007400200044006500730063007200690070007400',
    '69006F006E00200066006F007200200052006F00770020003400300000000000',
    'D12A0000000C0052006F00770020003400310046000000000000004600000045',
    '00780061006D0070006C00650020005400650073007400200044006500730063',
    '00720069007000740069006F006E00200066006F007200200052006F00770020',
    '003400310000000000D12B0000000C0052006F00770020003400320046000000',
    '00000000460000004500780061006D0070006C00650020005400650073007400',
    '20004400650073006300720069007000740069006F006E00200066006F007200',
    '200052006F00770020003400320000000000D12C0000000C0052006F00770020',
    '00340033004600000000000000460000004500780061006D0070006C00650020',
    '00540065007300740020004400650073006300720069007000740069006F006E',
    '00200066006F007200200052006F00770020003400330000000000D12D000000',
    '0C0052006F007700200034003400460000000000000046000000450078006100',
    '6D0070006C006500200054006500730074002000440065007300630072006900',
    '7000740069006F006E00200066006F007200200052006F007700200034003400',
    '00000000D12E0000000C0052006F007700200034003500460000000000000046',
    '0000004500780061006D0070006C006500200054006500730074002000440065',
    '0073006300720069007000740069006F006E00200066006F007200200052006F',
    '00770020003400350000000000D12F0000000C0052006F007700200034003600',
    '4600000000000000460000004500780061006D0070006C006500200054006500',
    '7300740020004400650073006300720069007000740069006F006E0020006600',
    '6F007200200052006F00770020003400360000000000D1300000000C0052006F',
    '0077002000340037004600000000000000460000004500780061006D0070006C',
    '0065002000540065007300740020004400650073006300720069007000740069',
    '006F006E00200066006F007200200052006F00770020003400370000000000D1',
    '310000000C0052006F0077002000340038004600000000000000460000004500',
    '780061006D0070006C0065002000540065007300740020004400650073006300',
    '720069007000740069006F006E00200066006F007200200052006F0077002000',
    '3400380000000000D1320000000C0052006F0077002000340039004600000000',
    '000000460000004500780061006D0070006C0065002000540065007300740020',
    '004400650073006300720069007000740069006F006E00200066006F00720020',
    '0052006F00770020003400390000000000D1330000000C0052006F0077002000',
    '350030004600000000000000460000004500780061006D0070006C0065002000',
    '540065007300740020004400650073006300720069007000740069006F006E00',
    '200066006F007200200052006F00770020003500300000000000D1340000000C',
    '0052006F0077002000350031004600000000000000460000004500780061006D',
    '0070006C00650020005400650073007400200044006500730063007200690070',
    '00740069006F006E00200066006F007200200052006F00770020003500310000',
    '000000D1350000000C0052006F00770020003500320046000000000000004600',
    '00004500780061006D0070006C00650020005400650073007400200044006500',
    '73006300720069007000740069006F006E00200066006F007200200052006F00',
    '770020003500320000000000D1360000000C0052006F00770020003500330046',
    '00000000000000460000004500780061006D0070006C00650020005400650073',
    '00740020004400650073006300720069007000740069006F006E00200066006F',
    '007200200052006F00770020003500330000000000D1370000000C0052006F00',
    '77002000350034004600000000000000460000004500780061006D0070006C00',
    '6500200054006500730074002000440065007300630072006900700074006900',
    '6F006E00200066006F007200200052006F00770020003500340000000000D138',
    '0000000C0052006F007700200035003500460000000000000046000000450078',
    '0061006D0070006C006500200054006500730074002000440065007300630072',
    '0069007000740069006F006E00200066006F007200200052006F007700200035',
    '00350000000000D1390000000C0052006F007700200035003600460000000000',
    '0000460000004500780061006D0070006C006500200054006500730074002000',
    '4400650073006300720069007000740069006F006E00200066006F0072002000',
    '52006F00770020003500360000000000D13A0000000C0052006F007700200035',
    '0037004600000000000000460000004500780061006D0070006C006500200054',
    '0065007300740020004400650073006300720069007000740069006F006E0020',
    '0066006F007200200052006F00770020003500370000000000D13B0000000C00',
    '52006F0077002000350038004600000000000000460000004500780061006D00',
    '70006C0065002000540065007300740020004400650073006300720069007000',
    '740069006F006E00200066006F007200200052006F0077002000350038000000',
    '0000D13C0000000C0052006F0077002000350039004600000000000000460000',
    '004500780061006D0070006C0065002000540065007300740020004400650073',
    '006300720069007000740069006F006E00200066006F007200200052006F0077',
    '0020003500390000000000D13D0000000C0052006F0077002000360030004600',
    '000000000000460000004500780061006D0070006C0065002000540065007300',
    '740020004400650073006300720069007000740069006F006E00200066006F00',
    '7200200052006F00770020003600300000000000D13E0000000C0052006F0077',
    '002000360031004600000000000000460000004500780061006D0070006C0065',
    '002000540065007300740020004400650073006300720069007000740069006F',
    '006E00200066006F007200200052006F00770020003600310000000000D13F00',
    '00000C0052006F00770020003600320046000000000000004600000045007800',
    '61006D0070006C00650020005400650073007400200044006500730063007200',
    '69007000740069006F006E00200066006F007200200052006F00770020003600',
    '320000000000D1400000000C0052006F00770020003600330046000000000000',
    '00460000004500780061006D0070006C00650020005400650073007400200044',
    '00650073006300720069007000740069006F006E00200066006F007200200052',
    '006F00770020003600330000000000D1410000000C0052006F00770020003600',
    '34004600000000000000460000004500780061006D0070006C00650020005400',
    '65007300740020004400650073006300720069007000740069006F006E002000',
    '66006F007200200052006F00770020003600340000000000D1420000000C0052',
    '006F0077002000360035004600000000000000460000004500780061006D0070',
    '006C006500200054006500730074002000440065007300630072006900700074',
    '0069006F006E00200066006F007200200052006F007700200036003500000000',
    '00D1430000000C0052006F007700200036003600460000000000000046000000',
    '4500780061006D0070006C006500200054006500730074002000440065007300',
    '6300720069007000740069006F006E00200066006F007200200052006F007700',
    '20003600360000000000D1440000000C0052006F007700200036003700460000',
    '0000000000460000004500780061006D0070006C006500200054006500730074',
    '0020004400650073006300720069007000740069006F006E00200066006F0072',
    '00200052006F00770020003600370000000000D1450000000C0052006F007700',
    '2000360038004600000000000000460000004500780061006D0070006C006500',
    '2000540065007300740020004400650073006300720069007000740069006F00',
    '6E00200066006F007200200052006F00770020003600380000000000D1460000',
    '000C0052006F0077002000360039004600000000000000460000004500780061',
    '006D0070006C0065002000540065007300740020004400650073006300720069',
    '007000740069006F006E00200066006F007200200052006F0077002000360039',
    '0000000000D1470000000C0052006F0077002000370030004600000000000000',
    '460000004500780061006D0070006C0065002000540065007300740020004400',
    '650073006300720069007000740069006F006E00200066006F00720020005200',
    '6F00770020003700300000000000D1480000000C0052006F0077002000370031',
    '004600000000000000460000004500780061006D0070006C0065002000540065',
    '007300740020004400650073006300720069007000740069006F006E00200066',
    '006F007200200052006F00770020003700310000000000D1490000000C005200',
    '6F0077002000370032004600000000000000460000004500780061006D007000',
    '6C00650020005400650073007400200044006500730063007200690070007400',
    '69006F006E00200066006F007200200052006F00770020003700320000000000',
    'D14A0000000C0052006F00770020003700330046000000000000004600000045',
    '00780061006D0070006C00650020005400650073007400200044006500730063',
    '00720069007000740069006F006E00200066006F007200200052006F00770020',
    '003700330000000000D14B0000000C0052006F00770020003700340046000000',
    '00000000460000004500780061006D0070006C00650020005400650073007400',
    '20004400650073006300720069007000740069006F006E00200066006F007200',
    '200052006F00770020003700340000000000D14C0000000C0052006F00770020',
    '00370035004600000000000000460000004500780061006D0070006C00650020',
    '00540065007300740020004400650073006300720069007000740069006F006E',
    '00200066006F007200200052006F00770020003700350000000000D14D000000',
    '0C0052006F007700200037003600460000000000000046000000450078006100',
    '6D0070006C006500200054006500730074002000440065007300630072006900',
    '7000740069006F006E00200066006F007200200052006F007700200037003600',
    '00000000D14E0000000C0052006F007700200037003700460000000000000015',
    '0000004500780061006D0070006C00650020005400650073',
    '3100000000740020004400650073006300720069007000740069006F006E0020',
    '0066006F007200200052006F00770020003700370000000000D14F0000000C00',
    '52006F0077002000370038004600000000000000460000004500780061006D00',
    '70006C0065002000540065007300740020004400650073006300720069007000',
    '740069006F006E00200066006F007200200052006F0077002000370038000000',
    '0000D1500000000C0052006F0077002000370039004600000000000000460000',
    '004500780061006D0070006C0065002000540065007300740020004400650073',
    '006300720069007000740069006F006E00200066006F007200200052006F0077',
    '0020003700390000000000D1510000000C0052006F0077002000380030004600',
    '000000000000460000004500780061006D0070006C0065002000540065007300',
    '740020004400650073006300720069007000740069006F006E00200066006F00',
    '7200200052006F00770020003800300000000000D1520000000C0052006F0077',
    '002000380031004600000000000000460000004500780061006D0070006C0065',
    '002000540065007300740020004400650073006300720069007000740069006F',
    '006E00200066006F007200200052006F00770020003800310000000000D15300',
    '00000C0052006F00770020003800320046000000000000004600000045007800',
    '61006D0070006C00650020005400650073007400200044006500730063007200',
    '69007000740069006F006E00200066006F007200200052006F00770020003800',
    '320000000000D1540000000C0052006F00770020003800330046000000000000',
    '00460000004500780061006D0070006C00650020005400650073007400200044',
    '00650073006300720069007000740069006F006E00200066006F007200200052',
    '006F00770020003800330000000000D1550000000C0052006F00770020003800',
    '34004600000000000000460000004500780061006D0070006C00650020005400',
    '65007300740020004400650073006300720069007000740069006F006E002000',
    '66006F007200200052006F00770020003800340000000000D1560000000C0052',
    '006F0077002000380035004600000000000000460000004500780061006D0070',
    '006C006500200054006500730074002000440065007300630072006900700074',
    '0069006F006E00200066006F007200200052006F007700200038003500000000',
    '00D1570000000C0052006F007700200038003600460000000000000046000000',
    '4500780061006D0070006C006500200054006500730074002000440065007300',
    '6300720069007000740069006F006E00200066006F007200200052006F007700',
    '20003800360000000000D1580000000C0052006F007700200038003700460000',
    '0000000000460000004500780061006D0070006C006500200054006500730074',
    '0020004400650073006300720069007000740069006F006E00200066006F0072',
    '00200052006F00770020003800370000000000D1590000000C0052006F007700',
    '2000380038004600000000000000460000004500780061006D0070006C006500',
    '2000540065007300740020004400650073006300720069007000740069006F00',
    '6E00200066006F007200200052006F00770020003800380000000000D15A0000',
    '000C0052006F0077002000380039004600000000000000460000004500780061',
    '006D0070006C0065002000540065007300740020004400650073006300720069',
    '007000740069006F006E00200066006F007200200052006F0077002000380039',
    '0000000000D15B0000000C0052006F0077002000390030004600000000000000',
    '460000004500780061006D0070006C0065002000540065007300740020004400',
    '650073006300720069007000740069006F006E00200066006F00720020005200',
    '6F00770020003900300000000000D15C0000000C0052006F0077002000390031',
    '004600000000000000460000004500780061006D0070006C0065002000540065',
    '007300740020004400650073006300720069007000740069006F006E00200066',
    '006F007200200052006F00770020003900310000000000D15D0000000C005200',
    '6F0077002000390032004600000000000000460000004500780061006D007000',
    '6C00650020005400650073007400200044006500730063007200690070007400',
    '69006F006E00200066006F007200200052006F00770020003900320000000000',
    'D15E0000000C0052006F00770020003900330046000000000000004600000045',
    '00780061006D0070006C00650020005400650073007400200044006500730063',
    '00720069007000740069006F006E00200066006F007200200052006F00770020',
    '003900330000000000D15F0000000C0052006F00770020003900340046000000',
    '00000000460000004500780061006D0070006C00650020005400650073007400',
    '20004400650073006300720069007000740069006F006E00200066006F007200',
    '200052006F00770020003900340000000000D1600000000C0052006F00770020',
    '00390035004600000000000000460000004500780061006D0070006C00650020',
    '00540065007300740020004400650073006300720069007000740069006F006E',
    '00200066006F007200200052006F00770020003900350000000000D161000000',
    '0C0052006F007700200039003600460000000000000046000000450078006100',
    '6D0070006C006500200054006500730074002000440065007300630072006900',
    '7000740069006F006E00200066006F007200200052006F007700200039003600',
    '00000000D1620000000C0052006F007700200039003700460000000000000046',
    '0000004500780061006D0070006C006500200054006500730074002000440065',
    '0073006300720069007000740069006F006E00200066006F007200200052006F',
    '00770020003900370000000000D1630000000C0052006F007700200039003800',
    '4600000000000000460000004500780061006D0070006C006500200054006500',
    '7300740020004400650073006300720069007000740069006F006E0020006600',
    '6F007200200052006F00770020003900380000000000D1640000000C0052006F',
    '0077002000390039004600000000000000460000004500780061006D0070006C',
    '0065002000540065007300740020004400650073006300720069007000740069',
    '006F006E00200066006F007200200052006F00770020003900390000000000FF',
    '1100C10064000000000000007900000000FE0000E0000000000000000000'
  ].join(''), 'hex');

  const parser = new Parser(repeat(data, n), { token: function() { } }, {}, {});

  bench.start();

  parser.on('end', () => {
    bench.end(n);
  });
}
const { createBenchmark } = require('../common');

const { Request, TYPES } = require('../../src/tedious');
const RpcRequestPayload = require('../../src/rpcrequest-payload');

const { Readable } = require('stream');

const bench = createBenchmark(main, {
  n: [10, 100],
  size: [10, 100, 1000, 10000]
});

function main({ n, size }) {
  var table = {
    columns: [
      { name: 'user_id', type: TYPES.Int },
      { name: 'user_name', type: TYPES.VarChar, length: 500 },
      { name: 'user_enabled', type: TYPES.Bit }
    ],
    rows: []
  };

  for (let j = 0; j < size; j++) {
    table.rows.push([15, 'Eric', true]);
  }

  const request = new Request('...', () => {});
  request.addParameter('value', TYPES.TVP, table);
  request.validateParameters();

  let i = 0;
  bench.start();

  (function cb() {
    if (i++ === n) {
      bench.end(n);
      return;
    }

    const payload = new RpcRequestPayload(request.sqlTextOrProcedure, request.parameters, Buffer.alloc(0), {}, undefined);
    const stream = Readable.from(payload);
    stream.on('data', () => {});
    stream.on('end', cb);
  })();
}
const { createBenchmark } = require('../common');

const { Request, TYPES } = require('../../src/tedious');
const RpcRequestPayload = require('../../src/rpcrequest-payload');

const { Readable } = require('stream');

const bench = createBenchmark(main, {
  n: [10, 100],
  size: [
    1024 * 1024,
    10 * 1024 * 1024,
    50 * 1024 * 1024,
  ]
});

function main({ n, size }) {
  const buf = Buffer.alloc(size, 'x');

  const request = new Request('...', () => {});
  request.addParameter('value', TYPES.VarBinary, buf);

  let i = 0;
  bench.start();

  (function cb() {
    if (i++ === n) {
      bench.end(n);
      return;
    }

    const payload = new RpcRequestPayload(request.sqlTextOrProcedure, request.parameters, Buffer.alloc(0), {}, undefined);
    const stream = Readable.from(payload);
    stream.on('data', () => {});
    stream.on('end', cb);
  })();
}
const { createBenchmark, createConnection } = require('../common');

const { Request, TYPES } = require('../../src/tedious');

const bench = createBenchmark(main, {
  n: [10, 100]
});

function main({ n }) {
  createConnection(function(connection) {
    const request = new Request(`
      USE tempdb;

      DROP TYPE IF EXISTS TediousTestType;

      CREATE TYPE TediousTestType AS TABLE (
        FileId uniqueidentifier,
        FileNumber bigint,
        FileVersion varchar(20),
        FileCommitID varchar(40),
        FileModel nvarchar(max)
      );
    `, (err) => {
      if (err) {
        throw err;
      }

      const request = new Request(`
        CREATE PROCEDURE #__tediousTvpTest @tvp TediousTestType readonly AS BEGIN select COUNT(*) from @tvp END
      `, (err) => {
        if (err) {
          throw err;
        }

        const tvp = {
          columns: [
            {
              name: 'FileId',
              type: TYPES.UniqueIdentifier
            },
            {
              name: 'FileNumber',
              type: TYPES.BigInt
            },
            {
              name: 'FileVersion',
              type: TYPES.VarChar,
              length: 20,
            },
            {
              name: 'FileCommitID',
              type: TYPES.VarChar,
              length: 40,
            },
            {
              name: 'FileModel',
              type: TYPES.NVarChar,
              length: Infinity
            }
          ],
          rows: []
        };

        for (let i = 0; i < 500; i++) {
          tvp.rows.push([
            '6F9619FF-8B86-D011-B42D-00C04FC964FF',
            1,
            '12345',
            '6b8bd41619d843b35b13478bb8aa88ea67039a05',
            new Array(5000).join('x')
          ]);
        }

        let i = 0;
        bench.start();

        (function cb() {
          const request = new Request('#__tediousTvpTest', (err) => {
            if (err) {
              throw err;
            }

            if (i++ === n) {
              bench.end(n);

              connection.close();

              return;
            }

            cb();
          });

          request.addParameter('tvp', TYPES.TVP, tvp);

          connection.callProcedure(request);
        })();
      });

      connection.execSqlBatch(request);
    });

    connection.execSqlBatch(request);
  });
}
const { createBenchmark, createConnection } = require('../common');

const { Request, TYPES } = require('../../src/tedious');

const bench = createBenchmark(main, {
  n: [10, 100],
  size: [
    10,
    1024,
    1024 * 1024,
    10 * 1024 * 1024
  ]
});

function main({ n, size }) {
  createConnection(function(connection) {
    const buf = Buffer.alloc(size);
    buf.fill('x');

    let i = 0;

    bench.start();

    (function cb() {
      const request = new Request('SELECT DATALENGTH(@value)', (err) => {
        if (err) {
          throw err;
        }

        if (i++ === n) {
          bench.end(n);

          connection.close();

          return;
        }

        cb();
      });

      request.addParameter('value', TYPES.VarBinary, buf);

      connection.execSql(request);
    })();
  });
}
const { createBenchmark, createConnection } = require('../common');

const { Request, TYPES } = require('../../src/tedious');

const bench = createBenchmark(main, {
  n: [10, 100, 1000],
  size: [10, 100, 1000, 10000]
});

function main({ n, size }) {
  createConnection(function(connection) {
    const request = new Request('CREATE TABLE #benchmark ([id] int IDENTITY(1,1), [name] nvarchar(100), [description] nvarchar(max))', (err) => {
      if (err) {
        throw err;
      }

      (function insertNext(num, done) {
        var request = new Request('INSERT INTO #benchmark ([name], [description]) VALUES (@name, @description)', (err) => {
          if (err) {
            throw err;
          }

          if (num === size) {
            done();
          } else {
            insertNext(num + 1, done);
          }
        });

        request.addParameter('name', TYPES.NVarChar, 'Row ' + n);
        request.addParameter('description', TYPES.NVarChar, 'Example Test Description for Row ' + n);

        connection.execSql(request);
      })(0, (err) => {
        let i = 0;

        bench.start();

        (function cb() {
          const request = new Request('SELECT * FROM #benchmark', (err) => {
            if (err) {
              throw err;
            }

            if (i++ === n) {
              bench.end(n);

              connection.close();

              return;
            }

            cb();
          });

          connection.execSql(request);
        })();
      });
    });

    connection.execSqlBatch(request);
  });
}
const { createBenchmark, createConnection } = require('../common');

const { Request, TYPES } = require('../../src/tedious');

const bench = createBenchmark(main, {
  n: [10, 100, 1000],
  size: [10, 100, 1000, 10000]
});

function main({ n, size }) {
  createConnection(function(connection) {
    const request = new Request('CREATE TABLE #benchmark ([value] nvarchar(max))', (err) => {
      if (err) {
        throw err;
      }

      var request = new Request('INSERT INTO #benchmark ([value]) VALUES (@value)', (err) => {
        let i = 0;

        bench.start();

        (function cb() {
          const request = new Request('SELECT * FROM #benchmark', (err) => {
            if (err) {
              throw err;
            }

            if (i++ === n) {
              bench.end(n);

              connection.close();

              return;
            }

            cb();
          });

          connection.execSql(request);
        })();
      });

      const value = 'a'.repeat(size);
      request.addParameter('value', TYPES.NVarChar, value);
      connection.execSql(request);
    });

    connection.execSqlBatch(request);
  });
}
const { createBenchmark, createConnection } = require('../common');

const { Request, TYPES } = require('../../src/tedious');

const bench = createBenchmark(main, {
  n: [10, 100],
  size: [10, 100, 1000, 10000, 1024 * 1024, 10 * 1024 * 1024]
});

function main({ n, size }) {
  createConnection(function(connection) {
    const request = new Request('CREATE TABLE #benchmark ([value] varbinary(max))', (err) => {
      if (err) {
        throw err;
      }

      var request = new Request('INSERT INTO #benchmark ([value]) VALUES (@value)', (err) => {
        let i = 0;

        bench.start();

        (function cb() {
          const request = new Request('SELECT * FROM #benchmark', (err) => {
            if (err) {
              throw err;
            }

            if (i++ === n) {
              bench.end(n);

              connection.close();

              return;
            }

            cb();
          });

          connection.execSql(request);
        })();
      });

      const value = Buffer.alloc(size, 'a');
      request.addParameter('value', TYPES.VarBinary, value);
      connection.execSql(request);
    });

    connection.execSqlBatch(request);
  });
}
const { createBenchmark, createConnection } = require('../common');

const bench = createBenchmark(main, {
  n: [10, 100]
});

function main({ n }) {
  let i = 0;
  bench.start();

  (function cb() {
    createConnection(function(connection) {
      connection.close();

      if (i++ === n) {
        bench.end(n);

        connection.close();

        return;
      }

      cb();
    });
  })();
}
// @ts-check

const { createBenchmark, createConnection } = require('../common');

const { Request, TYPES } = require('../../src/tedious');

const bench = createBenchmark(main, {
  n: [10, 100],
  size: [
    10,
    100,
    1000,
    10000
  ]
});

function main({ n, size }) {
  createConnection((connection) => {
    const request = new Request(`
      CREATE TABLE "#tmpTestTable" (
        "id" int NOT NULL
      )
    `, (err) => {
      if (err) {
        throw err;
      }

      let i = 0;

      bench.start();

      (function cb() {
        const bulkLoad = connection.newBulkLoad('#tmpTestTable', (err) => {
          if (err) {
            throw err;
          }

          if (i++ === n) {
            bench.end(n);

            connection.close();

            return;
          }

          cb();
        });

        bulkLoad.addColumn('id', TYPES.Int, { nullable: false });

        const rows = [];
        for (let j = 0; j < size; j++) {
          rows.push([ j ]);
        }
        connection.execBulkLoad(bulkLoad, rows);
      })();
    });

    connection.execSqlBatch(request);
  });
}
const { createBenchmark, createConnection } = require('../common');

const { Request, TYPES } = require('../../src/tedious');
const { Readable } = require('readable-stream');

const bench = createBenchmark(main, {
  n: [10, 100],
  size: [
    10,
    100,
    1000,
    10000
  ]
});

function main({ n, size }) {
  createConnection(function(connection) {
    const request = new Request(`
      CREATE TABLE "#tmpTestTable" (
        "id" int NOT NULL
      )
    `, (err) => {
      if (err) {
        throw err;
      }

      let i = 0;

      bench.start();

      (function cb() {
        const bulkLoad = connection.newBulkLoad('#tmpTestTable', (err) => {
          if (err) {
            throw err;
          }

          if (i++ === n) {
            bench.end(n);

            connection.close();

            return;
          }

          cb();
        });

        bulkLoad.addColumn('id', TYPES.Int, { nullable: false });

        Readable.from((function*() {
          for (let j = 0; j < size; j++) {
            yield [j];
          }
        })()).pipe(bulkLoad.getRowStream());

        connection.execBulkLoad(bulkLoad);
      })();
    });

    connection.execSqlBatch(request);
  });
}
const { createBenchmark, createConnection } = require('../common');

const { Request, TYPES } = require('../../src/tedious');

const bench = createBenchmark(main, {
  n: [10, 100],
  size: [
    10,
    100,
    1000,
    10000
  ]
});

function main({ n, size }) {
  createConnection(function(connection) {
    const request = new Request(`
      CREATE TABLE "#tmpTestTable" (
        "id" int NOT NULL
      )
    `, (err) => {
      if (err) {
        throw err;
      }

      let i = 0;

      bench.start();

      (function cb() {
        const bulkLoad = connection.newBulkLoad('#tmpTestTable', (err) => {
          if (err) {
            throw err;
          }

          if (i++ === n) {
            bench.end(n);

            connection.close();

            return;
          }

          cb();
        });

        bulkLoad.addColumn('id', TYPES.Int, { nullable: false });

        for (let j = 0; j < size; j++) {
          bulkLoad.addRow([ j ]);
        }

        connection.execBulkLoad(bulkLoad);
      })();
    });

    connection.execSqlBatch(request);
  });
}
1.0.1 / 2021-11-14
==================

  * pref: enable strict mode

1.0.0 / 2018-07-09
==================

  * Initial release
MIT License

Copyright (c) 2016 Douglas Christopher Wilson <doug@somethingdoug.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.
/*!
 * toidentifier
 * Copyright(c) 2016 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module exports.
 * @public
 */

module.exports = toIdentifier

/**
 * Trasform the given string into a JavaScript identifier
 *
 * @param {string} str
 * @returns {string}
 * @public
 */

function toIdentifier (str) {
  return str
    .split(' ')
    .map(function (token) {
      return token.slice(0, 1).toUpperCase() + token.slice(1)
    })
    .join('')
    .replace(/[^ _0-9a-z]/gi, '')
}
{
  "name": "toidentifier",
  "description": "Convert a string of words to a JavaScript identifier",
  "version": "1.0.1",
  "author": "Douglas Christopher Wilson <doug@somethingdoug.com>",
  "repository": "component/toidentifier",
  "devDependencies": {
    "eslint": "7.32.0",
    "eslint-config-standard": "14.1.1",
    "eslint-plugin-import": "2.25.3",
    "eslint-plugin-markdown": "2.2.1",
    "eslint-plugin-node": "11.1.0",
    "eslint-plugin-promise": "4.3.1",
    "eslint-plugin-standard": "4.1.0",
    "mocha": "9.1.3",
    "nyc": "15.1.0"
  },
  "engines": {
    "node": ">=0.6"
  },
  "license": "MIT",
  "files": [
    "HISTORY.md",
    "LICENSE",
    "index.js"
  ]
}The MIT License (MIT)

Copyright (c) 2015 Gustavo Henke and Aaron Trent

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.
module.exports = require( './build/toposort.js' );
{
  "name": "toposort-class",
  "version": "1.0.1",
  "description": "Topological sort of directed acyclic graphs (like dependecy lists)",
  "main": "./index.js",
  "devDependencies": {
    "babel-eslint": "^4.0.5",
    "eslint": "^1.0.0",
    "grunt": "^0.4.5",
    "grunt-babel": "^5.0.1",
    "grunt-banner": "^0.4.0",
    "grunt-contrib-clean": "^0.6.0",
    "grunt-contrib-uglify": "^0.9.1",
    "matcha": "^0.6.0",
    "mocha": "^2.2.5"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/gustavohenke/toposort.git"
  },
  "author": [
    "Marcel Klehr <mklehr@gmx.net>",
    "Gustavo Henke <gustavo@injoin.com.br>",
    "Aaron Trent <novacrazy@gmail.com>"
  ],
  "license": "MIT",
  "readmeFilename": "README.md"
}/****
 * The MIT License (MIT)
 *
 * Copyright (c) 2015 Gustavo Henke and Aaron Trent
 *
 * 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.
 *
 ****/
(function( global, factory ) {
    if( typeof define === "function" && define.amd ) {
        define( "Toposort", ["exports", "module"], factory );
    } else if( typeof exports !== "undefined" && typeof module !== "undefined" ) {
        factory( exports, module );
    } else {
        var mod = {
            exports: {}
        };
        factory( mod.exports, mod );
        global.Toposort = mod.exports;
    }
})( this, function( exports, module ) {
    "use strict";

    function _classCallCheck( instance, Constructor ) {
        if( !(instance instanceof Constructor) ) {
            throw new TypeError( "Cannot call a class as a function" );
        }
    }

    var Toposort = (function() {
        function Toposort() {
            _classCallCheck( this, Toposort );

            this.edges = [];
            this.Toposort = Toposort;
        }

        /**
         * Adds dependency edges.
         *
         * @since   0.1.0
         * @param   {String} item               An dependent name. Must be an string and not empty
         * @param   {String[]|String} [deps]    An dependency or array of dependencies
         * @returns {Toposort}                  The Toposort instance
         */

        Toposort.prototype.add = function add( item, deps ) {
            if( typeof item !== "string" || !item ) {
                throw new TypeError( "Dependent name must be given as a not empty string" );
            }

            deps = Array.isArray( deps ) ? deps : [deps];

            if( deps.length > 0 ) {
                for( var _iterator = deps, _isArray = Array.isArray( _iterator ), _i = 0, _iterator = _isArray ?
                                                                                                      _iterator :
                                                                                                      _iterator[Symbol.iterator](); ; ) {
                    var _ref;

                    if( _isArray ) {
                        if( _i >= _iterator.length ) {
                            break;
                        }
                        _ref = _iterator[_i++];
                    } else {
                        _i = _iterator.next();
                        if( _i.done ) {
                            break;
                        }
                        _ref = _i.value;
                    }

                    var dep = _ref;

                    if( typeof dep !== "string" || !dep ) {
                        throw new TypeError( "Dependency name must be given as a not empty string" );
                    }

                    this.edges.push( [item, dep] );
                }
            } else {
                this.edges.push( [item] );
            }

            return this;
        };

        /**
         * Runs the toposorting and return an ordered array of strings
         *
         * @since   0.1.0
         * @returns {String[]}  The list of items topologically sorted.
         */

        Toposort.prototype.sort = function sort() {
            var _this = this;

            var nodes = [];

            //accumulate unique nodes into a large list
            for( var _iterator2 = this.edges, _isArray2 = Array.isArray( _iterator2 ), _i2 = 0, _iterator2 = _isArray2 ?
                                                                                                             _iterator2 :
                                                                                                             _iterator2[Symbol.iterator](); ; ) {
                var _ref2;

                if( _isArray2 ) {
                    if( _i2 >= _iterator2.length ) {
                        break;
                    }
                    _ref2 = _iterator2[_i2++];
                } else {
                    _i2 = _iterator2.next();
                    if( _i2.done ) {
                        break;
                    }
                    _ref2 = _i2.value;
                }

                var edge = _ref2;

                for( var _iterator3 = edge, _isArray3 = Array.isArray( _iterator3 ), _i3 = 0, _iterator3 = _isArray3 ?
                                                                                                           _iterator3 :
                                                                                                           _iterator3[Symbol.iterator](); ; ) {
                    var _ref3;

                    if( _isArray3 ) {
                        if( _i3 >= _iterator3.length ) {
                            break;
                        }
                        _ref3 = _iterator3[_i3++];
                    } else {
                        _i3 = _iterator3.next();
                        if( _i3.done ) {
                            break;
                        }
                        _ref3 = _i3.value;
                    }

                    var node = _ref3;

                    if( nodes.indexOf( node ) === -1 ) {
                        nodes.push( node );
                    }
                }
            }

            //initialize the placement of nodes into the sorted array at the end
            var place = nodes.length;

            //initialize the sorted array with the same length as the unique nodes array
            var sorted = new Array( nodes.length );

            //define a visitor function that recursively traverses dependencies.
            var visit = function visit( node, predecessors ) {
                //check if a node is dependent of itself
                if( predecessors.length !== 0 && predecessors.indexOf( node ) !== -1 ) {
                    throw new Error( "Cyclic dependency found. " + node + " is dependent of itself.\nDependency chain: "
                                     + predecessors.join( " -> " ) + " => " + node );
                }

                var index = nodes.indexOf( node );

                //if the node still exists, traverse its dependencies
                if( index !== -1 ) {
                    var copy = false;

                    //mark the node as false to exclude it from future iterations
                    nodes[index] = false;

                    //loop through all edges and follow dependencies of the current node
                    for( var _iterator4 = _this.edges, _isArray4 = Array.isArray( _iterator4 ), _i4 = 0, _iterator4 = _isArray4 ?
                                                                                                                      _iterator4 :
                                                                                                                      _iterator4[Symbol.iterator](); ; ) {
                        var _ref4;

                        if( _isArray4 ) {
                            if( _i4 >= _iterator4.length ) {
                                break;
                            }
                            _ref4 = _iterator4[_i4++];
                        } else {
                            _i4 = _iterator4.next();
                            if( _i4.done ) {
                                break;
                            }
                            _ref4 = _i4.value;
                        }

                        var edge = _ref4;

                        if( edge[0] === node ) {
                            //lazily create a copy of predecessors with the current node concatenated onto it
                            copy = copy || predecessors.concat( [node] );

                            //recurse to node dependencies
                            visit( edge[1], copy );
                        }
                    }

                    //add the node to the next place in the sorted array
                    sorted[--place] = node;
                }
            };

            for( var i = 0; i < nodes.length; i++ ) {
                var node = nodes[i];

                //ignore nodes that have been excluded
                if( node !== false ) {
                    //mark the node as false to exclude it from future iterations
                    nodes[i] = false;

                    //loop through all edges and follow dependencies of the current node
                    for( var _iterator5 = this.edges, _isArray5 = Array.isArray( _iterator5 ), _i5 = 0, _iterator5 = _isArray5 ?
                                                                                                                     _iterator5 :
                                                                                                                     _iterator5[Symbol.iterator](); ; ) {
                        var _ref5;

                        if( _isArray5 ) {
                            if( _i5 >= _iterator5.length ) {
                                break;
                            }
                            _ref5 = _iterator5[_i5++];
                        } else {
                            _i5 = _iterator5.next();
                            if( _i5.done ) {
                                break;
                            }
                            _ref5 = _i5.value;
                        }

                        var edge = _ref5;

                        if( edge[0] === node ) {
                            //recurse to node dependencies
                            visit( edge[1], [node] );
                        }
                    }

                    //add the node to the next place in the sorted array
                    sorted[--place] = node;
                }
            }

            return sorted;
        };

        /**
         * Clears edges
         *
         * @since   0.4.0
         * @returns {Toposort}                  The Toposort instance
         */

        Toposort.prototype.clear = function clear() {
            this.edges = [];

            return this;
        };

        return Toposort;
    })();

    module.exports = Toposort;
} );
!function(a,b){if("function"==typeof define&&define.amd)define("Toposort",["exports","module"],b);else if("undefined"!=typeof exports&&"undefined"!=typeof module)b(exports,module);else{var c={exports:{}};b(c.exports,c),a.Toposort=c.exports}}(this,function(a,b){"use strict";function c(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}var d=function(){function a(){c(this,a),this.edges=[],this.Toposort=a}return a.prototype.add=function(a,b){if("string"!=typeof a||!a)throw new TypeError("Dependent name must be given as a not empty string");if(b=Array.isArray(b)?b:[b],b.length>0)for(var c=b,d=Array.isArray(c),e=0,c=d?c:c[Symbol.iterator]();;){var f;if(d){if(e>=c.length)break;f=c[e++]}else{if(e=c.next(),e.done)break;f=e.value}var g=f;if("string"!=typeof g||!g)throw new TypeError("Dependency name must be given as a not empty string");this.edges.push([a,g])}else this.edges.push([a]);return this},a.prototype.sort=function(){for(var a=this,b=[],c=this.edges,d=Array.isArray(c),e=0,c=d?c:c[Symbol.iterator]();;){var f;if(d){if(e>=c.length)break;f=c[e++]}else{if(e=c.next(),e.done)break;f=e.value}for(var g=f,h=g,i=Array.isArray(h),j=0,h=i?h:h[Symbol.iterator]();;){var k;if(i){if(j>=h.length)break;k=h[j++]}else{if(j=h.next(),j.done)break;k=j.value}var l=k;-1===b.indexOf(l)&&b.push(l)}}for(var m=b.length,n=new Array(b.length),o=function u(c,d){if(0!==d.length&&-1!==d.indexOf(c))throw new Error("Cyclic dependency found. "+c+" is dependent of itself.\nDependency chain: "+d.join(" -> ")+" => "+c);var e=b.indexOf(c);if(-1!==e){var f=!1;b[e]=!1;for(var g=a.edges,h=Array.isArray(g),i=0,g=h?g:g[Symbol.iterator]();;){var j;if(h){if(i>=g.length)break;j=g[i++]}else{if(i=g.next(),i.done)break;j=i.value}var k=j;k[0]===c&&(f=f||d.concat([c]),u(k[1],f))}n[--m]=c}},p=0;p<b.length;p++){var l=b[p];if(l!==!1){b[p]=!1;for(var q=this.edges,r=Array.isArray(q),s=0,q=r?q:q[Symbol.iterator]();;){var t;if(r){if(s>=q.length)break;t=q[s++]}else{if(s=q.next(),s.done)break;t=s.value}var g=t;g[0]===l&&o(g[1],[l])}n[--m]=l}}return n},a.prototype.clear=function(){return this.edges=[],this},a}();b.exports=d});Benchmarks
==========

Since I'm obsessed with performance, here is a tiny benchmark comparing the performance of the 0.3.1 version and the current version written in ES6

| Description                  | Library         | Op/s       |  %   |
|------------------------------|-----------------|-----------:|-----:|
| simple dependency chains     | 0.3.1 version   | 66,722.22  | 8%   |
|                              | current version | 837,416.60 | 100% |
| slightly more complex chains | 0.3.1 version   | 24,530.85  | 6%   |
|                              | current version | 386,620.50 | 100% |
var Toposort = require( "../index.js" );
var OldToposort = require( "./0.3.1/toposort.js" );

suite( "simple dependency chains", function() {
    set( "delay", 0 );
    set( "mintime", 1750 );

    bench( "0.3.1 version", function() {
        var t = new OldToposort();

        t.add( "3", "2" )
            .add( "2", "1" )
            .add( "6", "5" )
            .add( "5", ["2", "4"] ).sort();
    } );

    bench( "current version", function() {
        var t = new Toposort();

        t.add( "3", "2" )
            .add( "2", "1" )
            .add( "6", "5" )
            .add( "5", ["2", "4"] ).sort();
    } );
} );

suite( "slightly more complex chains", function() {
    set( "delay", 0 );
    set( "mintime", 1750 );

    bench( "0.3.1 version", function() {
        var t = new OldToposort();

        t.add( "3", "1" )
            .add( "2", "3" )
            .add( "4", ["2", "3"] )
            .add( "5", ["3", "4"] )
            .add( "6", ["3", "4", "5"] )
            .add( "7", "1" )
            .add( "8", ["1", "2", "3", "4", "5"] )
            .add( "9", ["8", "6", "7"] ).sort();
    } );

    bench( "current version", function() {
        var t = new Toposort();

        t.add( "3", "1" )
            .add( "2", "3" )
            .add( "4", ["2", "3"] )
            .add( "5", ["3", "4"] )
            .add( "6", ["3", "4", "5"] )
            .add( "7", "1" )
            .add( "8", ["1", "2", "3", "4", "5"] )
            .add( "9", ["8", "6", "7"] ).sort();
    } );
} );
2015-07-31 22:37:51,"simple dependency chains","0.3.1 version",2295.217390,153142
2015-07-31 22:37:51,"simple dependency chains","current version",3299.024625,2762658
2015-07-31 22:37:51,"slightly more complex chains","0.3.1 version",3313.337523,81279
2015-07-31 22:37:51,"slightly more complex chains","current version",1797.512029,694955
!function() {
    "use strict";

    /**
     * Topological sort class.
     * Original by Marcel Klehr, contributed by Gustavo Henke.
     *
     * @class
     * @since   0.1.0
     * @see     https://github.com/marcelklehr/toposort
     * @author  Marcel Klehr <mklehr@gmx.net>
     *
     * @see     https://github.com/gustavohenke/toposort
     * @author  Gustavo Henke <gustavo@injoin.com.br>
     */
    function Toposort() {
        var self = this;
        var edges = [];

        /**
         * Adds dependency edges.
         *
         * @since   0.1.0
         * @param   {String} item               An dependent name. Must be an string and not empty
         * @param   {String[]|String} [deps]    An dependency or array of dependencies
         * @returns {Toposort}                  The Toposort instance
         */
        self.add = function( item, deps ) {
            if( typeof item !== "string" || !item ) {
                throw new TypeError( "Dependent name must be given as a not empty string" );
            }

            deps = Array.isArray( deps ) ? deps.slice() : [deps];
            if( deps.length ) {
                deps.forEach( function( dep ) {
                    if( typeof dep !== "string" || !dep ) {
                        throw new TypeError(
                            "Dependency name must be given as a not empty string"
                        );
                    }

                    edges.push( [item, dep] );
                } );
            } else {
                edges.push( [item] );
            }

            return self;
        };

        /**
         * Runs the toposorting and return an ordered array of strings
         *
         * @since   0.1.0
         * @returns {String[]}  The list of items topologically sorted.
         */
        self.sort = function() {
            var nodes = [];
            var sorted = [];

            edges.forEach( function( edge ) {
                edge.forEach( function( n ) {
                    if( nodes.indexOf( n ) === -1 ) {
                        nodes.push( n );
                    }
                } );
            } );

            function visit( node, predecessors, i ) {
                var index, predsCopy;
                predecessors = predecessors || [];

                if( predecessors.indexOf( node ) > -1 ) {
                    throw new Error(
                        "Cyclic dependency found. '" + node + "' is dependent of itself.\n" +
                        "Dependency Chain: " + predecessors.join( " -> " ) + " => " + node
                    );
                }

                index = nodes.indexOf( node );
                if( index === -1 ) {
                    return i;
                }

                nodes.splice( index, 1 );
                if( predecessors.length === 0 ) {
                    i--;
                }

                predsCopy = predecessors.slice();
                predsCopy.push( node );

                edges.filter( function( e ) {
                    return e[0] === node;
                } ).forEach( function( e ) {
                    i = visit( e[1], predsCopy, i );
                } );

                sorted.unshift( node );
                return i;
            }

            for( var i = 0; i < nodes.length; i++ ) {
                i = visit( nodes[i], null, i );
            }

            return sorted;
        };

    }

    if( typeof module === "object" && module && typeof module.exports === "object" ) {
        // Expose toposort to CommonJS loaders (aka Node)
        module.exports = exports.Toposort = Toposort;
    } else {
        // Expose toposort to AMD loaders (aka Require.js)
        if( typeof define === "function" && define.amd ) {
            define( function() {
                return Toposort;
            } );
        }

        // Expose toposort as a browser global
        if( typeof window === "object" ) {
            window.Toposort = Toposort;
        }
    }
}();
Copyright (c) 2015, Salesforce.com, 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.

3. Neither the name of Salesforce.com nor the names of its contributors may 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 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.
{
  "author": {
    "name": "Jeremy Stashewsky",
    "email": "jstash@gmail.com",
    "website": "https://github.com/stash"
  },
  "license": "BSD-3-Clause",
  "name": "tough-cookie",
  "description": "RFC6265 Cookies and Cookie Jar for node.js",
  "version": "4.0.0",
  "homepage": "https://github.com/salesforce/tough-cookie",
  "repository": {
    "type": "git",
    "url": "git://github.com/salesforce/tough-cookie.git"
  },
  "main": "./lib/cookie",
  "files": [
    "lib"
  ],
  "engines": {
    "node": ">=6"
  },
  "devDependencies": {
    "async": "^2.6.2",
    "eslint": "^5.16.0",
    "eslint-config-prettier": "^4.2.0",
    "eslint-plugin-prettier": "^3.0.1",
    "genversion": "^2.1.0",
    "nyc": "^14.0.0",
    "prettier": "^1.17.0",
    "vows": "^0.8.2"
  },
  "dependencies": {
    "psl": "^1.1.33",
    "punycode": "^2.1.1",
    "universalify": "^0.1.2"
  }
}/*!
 * Copyright (c) 2015, Salesforce.com, 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.
 *
 * 3. Neither the name of Salesforce.com nor the names of its contributors may
 * 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 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";
const punycode = require("punycode");
const urlParse = require("url").parse;
const util = require("util");
const pubsuffix = require("./pubsuffix-psl");
const Store = require("./store").Store;
const MemoryCookieStore = require("./memstore").MemoryCookieStore;
const pathMatch = require("./pathMatch").pathMatch;
const VERSION = require("./version");
const { fromCallback } = require("universalify");

// From RFC6265 S4.1.1
// note that it excludes \x3B ";"
const COOKIE_OCTETS = /^[\x21\x23-\x2B\x2D-\x3A\x3C-\x5B\x5D-\x7E]+$/;

const CONTROL_CHARS = /[\x00-\x1F]/;

// From Chromium // '\r', '\n' and '\0' should be treated as a terminator in
// the "relaxed" mode, see:
// https://github.com/ChromiumWebApps/chromium/blob/b3d3b4da8bb94c1b2e061600df106d590fda3620/net/cookies/parsed_cookie.cc#L60
const TERMINATORS = ["\n", "\r", "\0"];

// RFC6265 S4.1.1 defines path value as 'any CHAR except CTLs or ";"'
// Note ';' is \x3B
const PATH_VALUE = /[\x20-\x3A\x3C-\x7E]+/;

// date-time parsing constants (RFC6265 S5.1.1)

const DATE_DELIM = /[\x09\x20-\x2F\x3B-\x40\x5B-\x60\x7B-\x7E]/;

const MONTH_TO_NUM = {
  jan: 0,
  feb: 1,
  mar: 2,
  apr: 3,
  may: 4,
  jun: 5,
  jul: 6,
  aug: 7,
  sep: 8,
  oct: 9,
  nov: 10,
  dec: 11
};

const MAX_TIME = 2147483647000; // 31-bit max
const MIN_TIME = 0; // 31-bit min
const SAME_SITE_CONTEXT_VAL_ERR =
  'Invalid sameSiteContext option for getCookies(); expected one of "strict", "lax", or "none"';

function checkSameSiteContext(value) {
  const context = String(value).toLowerCase();
  if (context === "none" || context === "lax" || context === "strict") {
    return context;
  } else {
    return null;
  }
}

const PrefixSecurityEnum = Object.freeze({
  SILENT: "silent",
  STRICT: "strict",
  DISABLED: "unsafe-disabled"
});

// Dumped from ip-regex@4.0.0, with the following changes:
// * all capturing groups converted to non-capturing -- "(?:)"
// * support for IPv6 Scoped Literal ("%eth1") removed
// * lowercase hexadecimal only
var IP_REGEX_LOWERCASE =/(?:^(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}$)|(?:^(?:(?:[a-f\d]{1,4}:){7}(?:[a-f\d]{1,4}|:)|(?:[a-f\d]{1,4}:){6}(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|:[a-f\d]{1,4}|:)|(?:[a-f\d]{1,4}:){5}(?::(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,2}|:)|(?:[a-f\d]{1,4}:){4}(?:(?::[a-f\d]{1,4}){0,1}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,3}|:)|(?:[a-f\d]{1,4}:){3}(?:(?::[a-f\d]{1,4}){0,2}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,4}|:)|(?:[a-f\d]{1,4}:){2}(?:(?::[a-f\d]{1,4}){0,3}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,5}|:)|(?:[a-f\d]{1,4}:){1}(?:(?::[a-f\d]{1,4}){0,4}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,6}|:)|(?::(?:(?::[a-f\d]{1,4}){0,5}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,7}|:)))$)/;

/*
 * Parses a Natural number (i.e., non-negative integer) with either the
 *    <min>*<max>DIGIT ( non-digit *OCTET )
 * or
 *    <min>*<max>DIGIT
 * grammar (RFC6265 S5.1.1).
 *
 * The "trailingOK" boolean controls if the grammar accepts a
 * "( non-digit *OCTET )" trailer.
 */
function parseDigits(token, minDigits, maxDigits, trailingOK) {
  let count = 0;
  while (count < token.length) {
    const c = token.charCodeAt(count);
    // "non-digit = %x00-2F / %x3A-FF"
    if (c <= 0x2f || c >= 0x3a) {
      break;
    }
    count++;
  }

  // constrain to a minimum and maximum number of digits.
  if (count < minDigits || count > maxDigits) {
    return null;
  }

  if (!trailingOK && count != token.length) {
    return null;
  }

  return parseInt(token.substr(0, count), 10);
}

function parseTime(token) {
  const parts = token.split(":");
  const result = [0, 0, 0];

  /* RF6256 S5.1.1:
   *      time            = hms-time ( non-digit *OCTET )
   *      hms-time        = time-field ":" time-field ":" time-field
   *      time-field      = 1*2DIGIT
   */

  if (parts.length !== 3) {
    return null;
  }

  for (let i = 0; i < 3; i++) {
    // "time-field" must be strictly "1*2DIGIT", HOWEVER, "hms-time" can be
    // followed by "( non-digit *OCTET )" so therefore the last time-field can
    // have a trailer
    const trailingOK = i == 2;
    const num = parseDigits(parts[i], 1, 2, trailingOK);
    if (num === null) {
      return null;
    }
    result[i] = num;
  }

  return result;
}

function parseMonth(token) {
  token = String(token)
    .substr(0, 3)
    .toLowerCase();
  const num = MONTH_TO_NUM[token];
  return num >= 0 ? num : null;
}

/*
 * RFC6265 S5.1.1 date parser (see RFC for full grammar)
 */
function parseDate(str) {
  if (!str) {
    return;
  }

  /* RFC6265 S5.1.1:
   * 2. Process each date-token sequentially in the order the date-tokens
   * appear in the cookie-date
   */
  const tokens = str.split(DATE_DELIM);
  if (!tokens) {
    return;
  }

  let hour = null;
  let minute = null;
  let second = null;
  let dayOfMonth = null;
  let month = null;
  let year = null;

  for (let i = 0; i < tokens.length; i++) {
    const token = tokens[i].trim();
    if (!token.length) {
      continue;
    }

    let result;

    /* 2.1. If the found-time flag is not set and the token matches the time
     * production, set the found-time flag and set the hour- value,
     * minute-value, and second-value to the numbers denoted by the digits in
     * the date-token, respectively.  Skip the remaining sub-steps and continue
     * to the next date-token.
     */
    if (second === null) {
      result = parseTime(token);
      if (result) {
        hour = result[0];
        minute = result[1];
        second = result[2];
        continue;
      }
    }

    /* 2.2. If the found-day-of-month flag is not set and the date-token matches
     * the day-of-month production, set the found-day-of- month flag and set
     * the day-of-month-value to the number denoted by the date-token.  Skip
     * the remaining sub-steps and continue to the next date-token.
     */
    if (dayOfMonth === null) {
      // "day-of-month = 1*2DIGIT ( non-digit *OCTET )"
      result = parseDigits(token, 1, 2, true);
      if (result !== null) {
        dayOfMonth = result;
        continue;
      }
    }

    /* 2.3. If the found-month flag is not set and the date-token matches the
     * month production, set the found-month flag and set the month-value to
     * the month denoted by the date-token.  Skip the remaining sub-steps and
     * continue to the next date-token.
     */
    if (month === null) {
      result = parseMonth(token);
      if (result !== null) {
        month = result;
        continue;
      }
    }

    /* 2.4. If the found-year flag is not set and the date-token matches the
     * year production, set the found-year flag and set the year-value to the
     * number denoted by the date-token.  Skip the remaining sub-steps and
     * continue to the next date-token.
     */
    if (year === null) {
      // "year = 2*4DIGIT ( non-digit *OCTET )"
      result = parseDigits(token, 2, 4, true);
      if (result !== null) {
        year = result;
        /* From S5.1.1:
         * 3.  If the year-value is greater than or equal to 70 and less
         * than or equal to 99, increment the year-value by 1900.
         * 4.  If the year-value is greater than or equal to 0 and less
         * than or equal to 69, increment the year-value by 2000.
         */
        if (year >= 70 && year <= 99) {
          year += 1900;
        } else if (year >= 0 && year <= 69) {
          year += 2000;
        }
      }
    }
  }

  /* RFC 6265 S5.1.1
   * "5. Abort these steps and fail to parse the cookie-date if:
   *     *  at least one of the found-day-of-month, found-month, found-
   *        year, or found-time flags is not set,
   *     *  the day-of-month-value is less than 1 or greater than 31,
   *     *  the year-value is less than 1601,
   *     *  the hour-value is greater than 23,
   *     *  the minute-value is greater than 59, or
   *     *  the second-value is greater than 59.
   *     (Note that leap seconds cannot be represented in this syntax.)"
   *
   * So, in order as above:
   */
  if (
    dayOfMonth === null ||
    month === null ||
    year === null ||
    second === null ||
    dayOfMonth < 1 ||
    dayOfMonth > 31 ||
    year < 1601 ||
    hour > 23 ||
    minute > 59 ||
    second > 59
  ) {
    return;
  }

  return new Date(Date.UTC(year, month, dayOfMonth, hour, minute, second));
}

function formatDate(date) {
  return date.toUTCString();
}

// S5.1.2 Canonicalized Host Names
function canonicalDomain(str) {
  if (str == null) {
    return null;
  }
  str = str.trim().replace(/^\./, ""); // S4.1.2.3 & S5.2.3: ignore leading .

  // convert to IDN if any non-ASCII characters
  if (punycode && /[^\u0001-\u007f]/.test(str)) {
    str = punycode.toASCII(str);
  }

  return str.toLowerCase();
}

// S5.1.3 Domain Matching
function domainMatch(str, domStr, canonicalize) {
  if (str == null || domStr == null) {
    return null;
  }
  if (canonicalize !== false) {
    str = canonicalDomain(str);
    domStr = canonicalDomain(domStr);
  }

  /*
   * S5.1.3:
   * "A string domain-matches a given domain string if at least one of the
   * following conditions hold:"
   *
   * " o The domain string and the string are identical. (Note that both the
   * domain string and the string will have been canonicalized to lower case at
   * this point)"
   */
  if (str == domStr) {
    return true;
  }

  /* " o All of the following [three] conditions hold:" */

  /* "* The domain string is a suffix of the string" */
  const idx = str.indexOf(domStr);
  if (idx <= 0) {
    return false; // it's a non-match (-1) or prefix (0)
  }

  // next, check it's a proper suffix
  // e.g., "a.b.c".indexOf("b.c") === 2
  // 5 === 3+2
  if (str.length !== domStr.length + idx) {
    return false; // it's not a suffix
  }

  /* "  * The last character of the string that is not included in the
   * domain string is a %x2E (".") character." */
  if (str.substr(idx-1,1) !== '.') {
    return false; // doesn't align on "."
  }

  /* "  * The string is a host name (i.e., not an IP address)." */
  if (IP_REGEX_LOWERCASE.test(str)) {
    return false; // it's an IP address
  }

  return true;
}

// RFC6265 S5.1.4 Paths and Path-Match

/*
 * "The user agent MUST use an algorithm equivalent to the following algorithm
 * to compute the default-path of a cookie:"
 *
 * Assumption: the path (and not query part or absolute uri) is passed in.
 */
function defaultPath(path) {
  // "2. If the uri-path is empty or if the first character of the uri-path is not
  // a %x2F ("/") character, output %x2F ("/") and skip the remaining steps.
  if (!path || path.substr(0, 1) !== "/") {
    return "/";
  }

  // "3. If the uri-path contains no more than one %x2F ("/") character, output
  // %x2F ("/") and skip the remaining step."
  if (path === "/") {
    return path;
  }

  const rightSlash = path.lastIndexOf("/");
  if (rightSlash === 0) {
    return "/";
  }

  // "4. Output the characters of the uri-path from the first character up to,
  // but not including, the right-most %x2F ("/")."
  return path.slice(0, rightSlash);
}

function trimTerminator(str) {
  for (let t = 0; t < TERMINATORS.length; t++) {
    const terminatorIdx = str.indexOf(TERMINATORS[t]);
    if (terminatorIdx !== -1) {
      str = str.substr(0, terminatorIdx);
    }
  }

  return str;
}

function parseCookiePair(cookiePair, looseMode) {
  cookiePair = trimTerminator(cookiePair);

  let firstEq = cookiePair.indexOf("=");
  if (looseMode) {
    if (firstEq === 0) {
      // '=' is immediately at start
      cookiePair = cookiePair.substr(1);
      firstEq = cookiePair.indexOf("="); // might still need to split on '='
    }
  } else {
    // non-loose mode
    if (firstEq <= 0) {
      // no '=' or is at start
      return; // needs to have non-empty "cookie-name"
    }
  }

  let cookieName, cookieValue;
  if (firstEq <= 0) {
    cookieName = "";
    cookieValue = cookiePair.trim();
  } else {
    cookieName = cookiePair.substr(0, firstEq).trim();
    cookieValue = cookiePair.substr(firstEq + 1).trim();
  }

  if (CONTROL_CHARS.test(cookieName) || CONTROL_CHARS.test(cookieValue)) {
    return;
  }

  const c = new Cookie();
  c.key = cookieName;
  c.value = cookieValue;
  return c;
}

function parse(str, options) {
  if (!options || typeof options !== "object") {
    options = {};
  }
  str = str.trim();

  // We use a regex to parse the "name-value-pair" part of S5.2
  const firstSemi = str.indexOf(";"); // S5.2 step 1
  const cookiePair = firstSemi === -1 ? str : str.substr(0, firstSemi);
  const c = parseCookiePair(cookiePair, !!options.loose);
  if (!c) {
    return;
  }

  if (firstSemi === -1) {
    return c;
  }

  // S5.2.3 "unparsed-attributes consist of the remainder of the set-cookie-string
  // (including the %x3B (";") in question)." plus later on in the same section
  // "discard the first ";" and trim".
  const unparsed = str.slice(firstSemi + 1).trim();

  // "If the unparsed-attributes string is empty, skip the rest of these
  // steps."
  if (unparsed.length === 0) {
    return c;
  }

  /*
   * S5.2 says that when looping over the items "[p]rocess the attribute-name
   * and attribute-value according to the requirements in the following
   * subsections" for every item.  Plus, for many of the individual attributes
   * in S5.3 it says to use the "attribute-value of the last attribute in the
   * cookie-attribute-list".  Therefore, in this implementation, we overwrite
   * the previous value.
   */
  const cookie_avs = unparsed.split(";");
  while (cookie_avs.length) {
    const av = cookie_avs.shift().trim();
    if (av.length === 0) {
      // happens if ";;" appears
      continue;
    }
    const av_sep = av.indexOf("=");
    let av_key, av_value;

    if (av_sep === -1) {
      av_key = av;
      av_value = null;
    } else {
      av_key = av.substr(0, av_sep);
      av_value = av.substr(av_sep + 1);
    }

    av_key = av_key.trim().toLowerCase();

    if (av_value) {
      av_value = av_value.trim();
    }

    switch (av_key) {
      case "expires": // S5.2.1
        if (av_value) {
          const exp = parseDate(av_value);
          // "If the attribute-value failed to parse as a cookie date, ignore the
          // cookie-av."
          if (exp) {
            // over and underflow not realistically a concern: V8's getTime() seems to
            // store something larger than a 32-bit time_t (even with 32-bit node)
            c.expires = exp;
          }
        }
        break;

      case "max-age": // S5.2.2
        if (av_value) {
          // "If the first character of the attribute-value is not a DIGIT or a "-"
          // character ...[or]... If the remainder of attribute-value contains a
          // non-DIGIT character, ignore the cookie-av."
          if (/^-?[0-9]+$/.test(av_value)) {
            const delta = parseInt(av_value, 10);
            // "If delta-seconds is less than or equal to zero (0), let expiry-time
            // be the earliest representable date and time."
            c.setMaxAge(delta);
          }
        }
        break;

      case "domain": // S5.2.3
        // "If the attribute-value is empty, the behavior is undefined.  However,
        // the user agent SHOULD ignore the cookie-av entirely."
        if (av_value) {
          // S5.2.3 "Let cookie-domain be the attribute-value without the leading %x2E
          // (".") character."
          const domain = av_value.trim().replace(/^\./, "");
          if (domain) {
            // "Convert the cookie-domain to lower case."
            c.domain = domain.toLowerCase();
          }
        }
        break;

      case "path": // S5.2.4
        /*
         * "If the attribute-value is empty or if the first character of the
         * attribute-value is not %x2F ("/"):
         *   Let cookie-path be the default-path.
         * Otherwise:
         *   Let cookie-path be the attribute-value."
         *
         * We'll represent the default-path as null since it depends on the
         * context of the parsing.
         */
        c.path = av_value && av_value[0] === "/" ? av_value : null;
        break;

      case "secure": // S5.2.5
        /*
         * "If the attribute-name case-insensitively matches the string "Secure",
         * the user agent MUST append an attribute to the cookie-attribute-list
         * with an attribute-name of Secure and an empty attribute-value."
         */
        c.secure = true;
        break;

      case "httponly": // S5.2.6 -- effectively the same as 'secure'
        c.httpOnly = true;
        break;

      case "samesite": // RFC6265bis-02 S5.3.7
        const enforcement = av_value ? av_value.toLowerCase() : "";
        switch (enforcement) {
          case "strict":
            c.sameSite = "strict";
            break;
          case "lax":
            c.sameSite = "lax";
            break;
          default:
            // RFC6265bis-02 S5.3.7 step 1:
            // "If cookie-av's attribute-value is not a case-insensitive match
            //  for "Strict" or "Lax", ignore the "cookie-av"."
            // This effectively sets it to 'none' from the prototype.
            break;
        }
        break;

      default:
        c.extensions = c.extensions || [];
        c.extensions.push(av);
        break;
    }
  }

  return c;
}

/**
 *  If the cookie-name begins with a case-sensitive match for the
 *  string "__Secure-", abort these steps and ignore the cookie
 *  entirely unless the cookie's secure-only-flag is true.
 * @param cookie
 * @returns boolean
 */
function isSecurePrefixConditionMet(cookie) {
  return !cookie.key.startsWith("__Secure-") || cookie.secure;
}

/**
 *  If the cookie-name begins with a case-sensitive match for the
 *  string "__Host-", abort these steps and ignore the cookie
 *  entirely unless the cookie meets all the following criteria:
 *    1.  The cookie's secure-only-flag is true.
 *    2.  The cookie's host-only-flag is true.
 *    3.  The cookie-attribute-list contains an attribute with an
 *        attribute-name of "Path", and the cookie's path is "/".
 * @param cookie
 * @returns boolean
 */
function isHostPrefixConditionMet(cookie) {
  return (
    !cookie.key.startsWith("__Host-") ||
    (cookie.secure &&
      cookie.hostOnly &&
      cookie.path != null &&
      cookie.path === "/")
  );
}

// avoid the V8 deoptimization monster!
function jsonParse(str) {
  let obj;
  try {
    obj = JSON.parse(str);
  } catch (e) {
    return e;
  }
  return obj;
}

function fromJSON(str) {
  if (!str) {
    return null;
  }

  let obj;
  if (typeof str === "string") {
    obj = jsonParse(str);
    if (obj instanceof Error) {
      return null;
    }
  } else {
    // assume it's an Object
    obj = str;
  }

  const c = new Cookie();
  for (let i = 0; i < Cookie.serializableProperties.length; i++) {
    const prop = Cookie.serializableProperties[i];
    if (obj[prop] === undefined || obj[prop] === cookieDefaults[prop]) {
      continue; // leave as prototype default
    }

    if (prop === "expires" || prop === "creation" || prop === "lastAccessed") {
      if (obj[prop] === null) {
        c[prop] = null;
      } else {
        c[prop] = obj[prop] == "Infinity" ? "Infinity" : new Date(obj[prop]);
      }
    } else {
      c[prop] = obj[prop];
    }
  }

  return c;
}

/* Section 5.4 part 2:
 * "*  Cookies with longer paths are listed before cookies with
 *     shorter paths.
 *
 *  *  Among cookies that have equal-length path fields, cookies with
 *     earlier creation-times are listed before cookies with later
 *     creation-times."
 */

function cookieCompare(a, b) {
  let cmp = 0;

  // descending for length: b CMP a
  const aPathLen = a.path ? a.path.length : 0;
  const bPathLen = b.path ? b.path.length : 0;
  cmp = bPathLen - aPathLen;
  if (cmp !== 0) {
    return cmp;
  }

  // ascending for time: a CMP b
  const aTime = a.creation ? a.creation.getTime() : MAX_TIME;
  const bTime = b.creation ? b.creation.getTime() : MAX_TIME;
  cmp = aTime - bTime;
  if (cmp !== 0) {
    return cmp;
  }

  // break ties for the same millisecond (precision of JavaScript's clock)
  cmp = a.creationIndex - b.creationIndex;

  return cmp;
}

// Gives the permutation of all possible pathMatch()es of a given path. The
// array is in longest-to-shortest order.  Handy for indexing.
function permutePath(path) {
  if (path === "/") {
    return ["/"];
  }
  const permutations = [path];
  while (path.length > 1) {
    const lindex = path.lastIndexOf("/");
    if (lindex === 0) {
      break;
    }
    path = path.substr(0, lindex);
    permutations.push(path);
  }
  permutations.push("/");
  return permutations;
}

function getCookieContext(url) {
  if (url instanceof Object) {
    return url;
  }
  // NOTE: decodeURI will throw on malformed URIs (see GH-32).
  // Therefore, we will just skip decoding for such URIs.
  try {
    url = decodeURI(url);
  } catch (err) {
    // Silently swallow error
  }

  return urlParse(url);
}

const cookieDefaults = {
  // the order in which the RFC has them:
  key: "",
  value: "",
  expires: "Infinity",
  maxAge: null,
  domain: null,
  path: null,
  secure: false,
  httpOnly: false,
  extensions: null,
  // set by the CookieJar:
  hostOnly: null,
  pathIsDefault: null,
  creation: null,
  lastAccessed: null,
  sameSite: "none"
};

class Cookie {
  constructor(options = {}) {
    if (util.inspect.custom) {
      this[util.inspect.custom] = this.inspect;
    }

    Object.assign(this, cookieDefaults, options);
    this.creation = this.creation || new Date();

    // used to break creation ties in cookieCompare():
    Object.defineProperty(this, "creationIndex", {
      configurable: false,
      enumerable: false, // important for assert.deepEqual checks
      writable: true,
      value: ++Cookie.cookiesCreated
    });
  }

  inspect() {
    const now = Date.now();
    const hostOnly = this.hostOnly != null ? this.hostOnly : "?";
    const createAge = this.creation
      ? `${now - this.creation.getTime()}ms`
      : "?";
    const accessAge = this.lastAccessed
      ? `${now - this.lastAccessed.getTime()}ms`
      : "?";
    return `Cookie="${this.toString()}; hostOnly=${hostOnly}; aAge=${accessAge}; cAge=${createAge}"`;
  }

  toJSON() {
    const obj = {};

    for (const prop of Cookie.serializableProperties) {
      if (this[prop] === cookieDefaults[prop]) {
        continue; // leave as prototype default
      }

      if (
        prop === "expires" ||
        prop === "creation" ||
        prop === "lastAccessed"
      ) {
        if (this[prop] === null) {
          obj[prop] = null;
        } else {
          obj[prop] =
            this[prop] == "Infinity" // intentionally not ===
              ? "Infinity"
              : this[prop].toISOString();
        }
      } else if (prop === "maxAge") {
        if (this[prop] !== null) {
          // again, intentionally not ===
          obj[prop] =
            this[prop] == Infinity || this[prop] == -Infinity
              ? this[prop].toString()
              : this[prop];
        }
      } else {
        if (this[prop] !== cookieDefaults[prop]) {
          obj[prop] = this[prop];
        }
      }
    }

    return obj;
  }

  clone() {
    return fromJSON(this.toJSON());
  }

  validate() {
    if (!COOKIE_OCTETS.test(this.value)) {
      return false;
    }
    if (
      this.expires != Infinity &&
      !(this.expires instanceof Date) &&
      !parseDate(this.expires)
    ) {
      return false;
    }
    if (this.maxAge != null && this.maxAge <= 0) {
      return false; // "Max-Age=" non-zero-digit *DIGIT
    }
    if (this.path != null && !PATH_VALUE.test(this.path)) {
      return false;
    }

    const cdomain = this.cdomain();
    if (cdomain) {
      if (cdomain.match(/\.$/)) {
        return false; // S4.1.2.3 suggests that this is bad. domainMatch() tests confirm this
      }
      const suffix = pubsuffix.getPublicSuffix(cdomain);
      if (suffix == null) {
        // it's a public suffix
        return false;
      }
    }
    return true;
  }

  setExpires(exp) {
    if (exp instanceof Date) {
      this.expires = exp;
    } else {
      this.expires = parseDate(exp) || "Infinity";
    }
  }

  setMaxAge(age) {
    if (age === Infinity || age === -Infinity) {
      this.maxAge = age.toString(); // so JSON.stringify() works
    } else {
      this.maxAge = age;
    }
  }

  cookieString() {
    let val = this.value;
    if (val == null) {
      val = "";
    }
    if (this.key === "") {
      return val;
    }
    return `${this.key}=${val}`;
  }

  // gives Set-Cookie header format
  toString() {
    let str = this.cookieString();

    if (this.expires != Infinity) {
      if (this.expires instanceof Date) {
        str += `; Expires=${formatDate(this.expires)}`;
      } else {
        str += `; Expires=${this.expires}`;
      }
    }

    if (this.maxAge != null && this.maxAge != Infinity) {
      str += `; Max-Age=${this.maxAge}`;
    }

    if (this.domain && !this.hostOnly) {
      str += `; Domain=${this.domain}`;
    }
    if (this.path) {
      str += `; Path=${this.path}`;
    }

    if (this.secure) {
      str += "; Secure";
    }
    if (this.httpOnly) {
      str += "; HttpOnly";
    }
    if (this.sameSite && this.sameSite !== "none") {
      const ssCanon = Cookie.sameSiteCanonical[this.sameSite.toLowerCase()];
      str += `; SameSite=${ssCanon ? ssCanon : this.sameSite}`;
    }
    if (this.extensions) {
      this.extensions.forEach(ext => {
        str += `; ${ext}`;
      });
    }

    return str;
  }

  // TTL() partially replaces the "expiry-time" parts of S5.3 step 3 (setCookie()
  // elsewhere)
  // S5.3 says to give the "latest representable date" for which we use Infinity
  // For "expired" we use 0
  TTL(now) {
    /* RFC6265 S4.1.2.2 If a cookie has both the Max-Age and the Expires
     * attribute, the Max-Age attribute has precedence and controls the
     * expiration date of the cookie.
     * (Concurs with S5.3 step 3)
     */
    if (this.maxAge != null) {
      return this.maxAge <= 0 ? 0 : this.maxAge * 1000;
    }

    let expires = this.expires;
    if (expires != Infinity) {
      if (!(expires instanceof Date)) {
        expires = parseDate(expires) || Infinity;
      }

      if (expires == Infinity) {
        return Infinity;
      }

      return expires.getTime() - (now || Date.now());
    }

    return Infinity;
  }

  // expiryTime() replaces the "expiry-time" parts of S5.3 step 3 (setCookie()
  // elsewhere)
  expiryTime(now) {
    if (this.maxAge != null) {
      const relativeTo = now || this.creation || new Date();
      const age = this.maxAge <= 0 ? -Infinity : this.maxAge * 1000;
      return relativeTo.getTime() + age;
    }

    if (this.expires == Infinity) {
      return Infinity;
    }
    return this.expires.getTime();
  }

  // expiryDate() replaces the "expiry-time" parts of S5.3 step 3 (setCookie()
  // elsewhere), except it returns a Date
  expiryDate(now) {
    const millisec = this.expiryTime(now);
    if (millisec == Infinity) {
      return new Date(MAX_TIME);
    } else if (millisec == -Infinity) {
      return new Date(MIN_TIME);
    } else {
      return new Date(millisec);
    }
  }

  // This replaces the "persistent-flag" parts of S5.3 step 3
  isPersistent() {
    return this.maxAge != null || this.expires != Infinity;
  }

  // Mostly S5.1.2 and S5.2.3:
  canonicalizedDomain() {
    if (this.domain == null) {
      return null;
    }
    return canonicalDomain(this.domain);
  }

  cdomain() {
    return this.canonicalizedDomain();
  }
}

Cookie.cookiesCreated = 0;
Cookie.parse = parse;
Cookie.fromJSON = fromJSON;
Cookie.serializableProperties = Object.keys(cookieDefaults);
Cookie.sameSiteLevel = {
  strict: 3,
  lax: 2,
  none: 1
};

Cookie.sameSiteCanonical = {
  strict: "Strict",
  lax: "Lax"
};

function getNormalizedPrefixSecurity(prefixSecurity) {
  if (prefixSecurity != null) {
    const normalizedPrefixSecurity = prefixSecurity.toLowerCase();
    /* The three supported options */
    switch (normalizedPrefixSecurity) {
      case PrefixSecurityEnum.STRICT:
      case PrefixSecurityEnum.SILENT:
      case PrefixSecurityEnum.DISABLED:
        return normalizedPrefixSecurity;
    }
  }
  /* Default is SILENT */
  return PrefixSecurityEnum.SILENT;
}

class CookieJar {
  constructor(store, options = { rejectPublicSuffixes: true }) {
    if (typeof options === "boolean") {
      options = { rejectPublicSuffixes: options };
    }
    this.rejectPublicSuffixes = options.rejectPublicSuffixes;
    this.enableLooseMode = !!options.looseMode;
    this.allowSpecialUseDomain = !!options.allowSpecialUseDomain;
    this.store = store || new MemoryCookieStore();
    this.prefixSecurity = getNormalizedPrefixSecurity(options.prefixSecurity);
    this._cloneSync = syncWrap("clone");
    this._importCookiesSync = syncWrap("_importCookies");
    this.getCookiesSync = syncWrap("getCookies");
    this.getCookieStringSync = syncWrap("getCookieString");
    this.getSetCookieStringsSync = syncWrap("getSetCookieStrings");
    this.removeAllCookiesSync = syncWrap("removeAllCookies");
    this.setCookieSync = syncWrap("setCookie");
    this.serializeSync = syncWrap("serialize");
  }

  setCookie(cookie, url, options, cb) {
    let err;
    const context = getCookieContext(url);
    if (typeof options === "function") {
      cb = options;
      options = {};
    }

    const host = canonicalDomain(context.hostname);
    const loose = options.loose || this.enableLooseMode;

    let sameSiteContext = null;
    if (options.sameSiteContext) {
      sameSiteContext = checkSameSiteContext(options.sameSiteContext);
      if (!sameSiteContext) {
        return cb(new Error(SAME_SITE_CONTEXT_VAL_ERR));
      }
    }

    // S5.3 step 1
    if (typeof cookie === "string" || cookie instanceof String) {
      cookie = Cookie.parse(cookie, { loose: loose });
      if (!cookie) {
        err = new Error("Cookie failed to parse");
        return cb(options.ignoreError ? null : err);
      }
    } else if (!(cookie instanceof Cookie)) {
      // If you're seeing this error, and are passing in a Cookie object,
      // it *might* be a Cookie object from another loaded version of tough-cookie.
      err = new Error(
        "First argument to setCookie must be a Cookie object or string"
      );
      return cb(options.ignoreError ? null : err);
    }

    // S5.3 step 2
    const now = options.now || new Date(); // will assign later to save effort in the face of errors

    // S5.3 step 3: NOOP; persistent-flag and expiry-time is handled by getCookie()

    // S5.3 step 4: NOOP; domain is null by default

    // S5.3 step 5: public suffixes
    if (this.rejectPublicSuffixes && cookie.domain) {
      const suffix = pubsuffix.getPublicSuffix(cookie.cdomain());
      if (suffix == null) {
        // e.g. "com"
        err = new Error("Cookie has domain set to a public suffix");
        return cb(options.ignoreError ? null : err);
      }
    }

    // S5.3 step 6:
    if (cookie.domain) {
      if (!domainMatch(host, cookie.cdomain(), false)) {
        err = new Error(
          `Cookie not in this host's domain. Cookie:${cookie.cdomain()} Request:${host}`
        );
        return cb(options.ignoreError ? null : err);
      }

      if (cookie.hostOnly == null) {
        // don't reset if already set
        cookie.hostOnly = false;
      }
    } else {
      cookie.hostOnly = true;
      cookie.domain = host;
    }

    //S5.2.4 If the attribute-value is empty or if the first character of the
    //attribute-value is not %x2F ("/"):
    //Let cookie-path be the default-path.
    if (!cookie.path || cookie.path[0] !== "/") {
      cookie.path = defaultPath(context.pathname);
      cookie.pathIsDefault = true;
    }

    // S5.3 step 8: NOOP; secure attribute
    // S5.3 step 9: NOOP; httpOnly attribute

    // S5.3 step 10
    if (options.http === false && cookie.httpOnly) {
      err = new Error("Cookie is HttpOnly and this isn't an HTTP API");
      return cb(options.ignoreError ? null : err);
    }

    // 6252bis-02 S5.4 Step 13 & 14:
    if (cookie.sameSite !== "none" && sameSiteContext) {
      // "If the cookie's "same-site-flag" is not "None", and the cookie
      //  is being set from a context whose "site for cookies" is not an
      //  exact match for request-uri's host's registered domain, then
      //  abort these steps and ignore the newly created cookie entirely."
      if (sameSiteContext === "none") {
        err = new Error(
          "Cookie is SameSite but this is a cross-origin request"
        );
        return cb(options.ignoreError ? null : err);
      }
    }

    /* 6265bis-02 S5.4 Steps 15 & 16 */
    const ignoreErrorForPrefixSecurity =
      this.prefixSecurity === PrefixSecurityEnum.SILENT;
    const prefixSecurityDisabled =
      this.prefixSecurity === PrefixSecurityEnum.DISABLED;
    /* If prefix checking is not disabled ...*/
    if (!prefixSecurityDisabled) {
      let errorFound = false;
      let errorMsg;
      /* Check secure prefix condition */
      if (!isSecurePrefixConditionMet(cookie)) {
        errorFound = true;
        errorMsg = "Cookie has __Secure prefix but Secure attribute is not set";
      } else if (!isHostPrefixConditionMet(cookie)) {
        /* Check host prefix condition */
        errorFound = true;
        errorMsg =
          "Cookie has __Host prefix but either Secure or HostOnly attribute is not set or Path is not '/'";
      }
      if (errorFound) {
        return cb(
          options.ignoreError || ignoreErrorForPrefixSecurity
            ? null
            : new Error(errorMsg)
        );
      }
    }

    const store = this.store;

    if (!store.updateCookie) {
      store.updateCookie = function(oldCookie, newCookie, cb) {
        this.putCookie(newCookie, cb);
      };
    }

    function withCookie(err, oldCookie) {
      if (err) {
        return cb(err);
      }

      const next = function(err) {
        if (err) {
          return cb(err);
        } else {
          cb(null, cookie);
        }
      };

      if (oldCookie) {
        // S5.3 step 11 - "If the cookie store contains a cookie with the same name,
        // domain, and path as the newly created cookie:"
        if (options.http === false && oldCookie.httpOnly) {
          // step 11.2
          err = new Error("old Cookie is HttpOnly and this isn't an HTTP API");
          return cb(options.ignoreError ? null : err);
        }
        cookie.creation = oldCookie.creation; // step 11.3
        cookie.creationIndex = oldCookie.creationIndex; // preserve tie-breaker
        cookie.lastAccessed = now;
        // Step 11.4 (delete cookie) is implied by just setting the new one:
        store.updateCookie(oldCookie, cookie, next); // step 12
      } else {
        cookie.creation = cookie.lastAccessed = now;
        store.putCookie(cookie, next); // step 12
      }
    }

    store.findCookie(cookie.domain, cookie.path, cookie.key, withCookie);
  }

  // RFC6365 S5.4
  getCookies(url, options, cb) {
    const context = getCookieContext(url);
    if (typeof options === "function") {
      cb = options;
      options = {};
    }

    const host = canonicalDomain(context.hostname);
    const path = context.pathname || "/";

    let secure = options.secure;
    if (
      secure == null &&
      context.protocol &&
      (context.protocol == "https:" || context.protocol == "wss:")
    ) {
      secure = true;
    }

    let sameSiteLevel = 0;
    if (options.sameSiteContext) {
      const sameSiteContext = checkSameSiteContext(options.sameSiteContext);
      sameSiteLevel = Cookie.sameSiteLevel[sameSiteContext];
      if (!sameSiteLevel) {
        return cb(new Error(SAME_SITE_CONTEXT_VAL_ERR));
      }
    }

    let http = options.http;
    if (http == null) {
      http = true;
    }

    const now = options.now || Date.now();
    const expireCheck = options.expire !== false;
    const allPaths = !!options.allPaths;
    const store = this.store;

    function matchingCookie(c) {
      // "Either:
      //   The cookie's host-only-flag is true and the canonicalized
      //   request-host is identical to the cookie's domain.
      // Or:
      //   The cookie's host-only-flag is false and the canonicalized
      //   request-host domain-matches the cookie's domain."
      if (c.hostOnly) {
        if (c.domain != host) {
          return false;
        }
      } else {
        if (!domainMatch(host, c.domain, false)) {
          return false;
        }
      }

      // "The request-uri's path path-matches the cookie's path."
      if (!allPaths && !pathMatch(path, c.path)) {
        return false;
      }

      // "If the cookie's secure-only-flag is true, then the request-uri's
      // scheme must denote a "secure" protocol"
      if (c.secure && !secure) {
        return false;
      }

      // "If the cookie's http-only-flag is true, then exclude the cookie if the
      // cookie-string is being generated for a "non-HTTP" API"
      if (c.httpOnly && !http) {
        return false;
      }

      // RFC6265bis-02 S5.3.7
      if (sameSiteLevel) {
        const cookieLevel = Cookie.sameSiteLevel[c.sameSite || "none"];
        if (cookieLevel > sameSiteLevel) {
          // only allow cookies at or below the request level
          return false;
        }
      }

      // deferred from S5.3
      // non-RFC: allow retention of expired cookies by choice
      if (expireCheck && c.expiryTime() <= now) {
        store.removeCookie(c.domain, c.path, c.key, () => {}); // result ignored
        return false;
      }

      return true;
    }

    store.findCookies(
      host,
      allPaths ? null : path,
      this.allowSpecialUseDomain,
      (err, cookies) => {
        if (err) {
          return cb(err);
        }

        cookies = cookies.filter(matchingCookie);

        // sorting of S5.4 part 2
        if (options.sort !== false) {
          cookies = cookies.sort(cookieCompare);
        }

        // S5.4 part 3
        const now = new Date();
        for (const cookie of cookies) {
          cookie.lastAccessed = now;
        }
        // TODO persist lastAccessed

        cb(null, cookies);
      }
    );
  }

  getCookieString(...args) {
    const cb = args.pop();
    const next = function(err, cookies) {
      if (err) {
        cb(err);
      } else {
        cb(
          null,
          cookies
            .sort(cookieCompare)
            .map(c => c.cookieString())
            .join("; ")
        );
      }
    };
    args.push(next);
    this.getCookies.apply(this, args);
  }

  getSetCookieStrings(...args) {
    const cb = args.pop();
    const next = function(err, cookies) {
      if (err) {
        cb(err);
      } else {
        cb(
          null,
          cookies.map(c => {
            return c.toString();
          })
        );
      }
    };
    args.push(next);
    this.getCookies.apply(this, args);
  }

  serialize(cb) {
    let type = this.store.constructor.name;
    if (type === "Object") {
      type = null;
    }

    // update README.md "Serialization Format" if you change this, please!
    const serialized = {
      // The version of tough-cookie that serialized this jar. Generally a good
      // practice since future versions can make data import decisions based on
      // known past behavior. When/if this matters, use `semver`.
      version: `tough-cookie@${VERSION}`,

      // add the store type, to make humans happy:
      storeType: type,

      // CookieJar configuration:
      rejectPublicSuffixes: !!this.rejectPublicSuffixes,

      // this gets filled from getAllCookies:
      cookies: []
    };

    if (
      !(
        this.store.getAllCookies &&
        typeof this.store.getAllCookies === "function"
      )
    ) {
      return cb(
        new Error(
          "store does not support getAllCookies and cannot be serialized"
        )
      );
    }

    this.store.getAllCookies((err, cookies) => {
      if (err) {
        return cb(err);
      }

      serialized.cookies = cookies.map(cookie => {
        // convert to serialized 'raw' cookies
        cookie = cookie instanceof Cookie ? cookie.toJSON() : cookie;

        // Remove the index so new ones get assigned during deserialization
        delete cookie.creationIndex;

        return cookie;
      });

      return cb(null, serialized);
    });
  }

  toJSON() {
    return this.serializeSync();
  }

  // use the class method CookieJar.deserialize instead of calling this directly
  _importCookies(serialized, cb) {
    let cookies = serialized.cookies;
    if (!cookies || !Array.isArray(cookies)) {
      return cb(new Error("serialized jar has no cookies array"));
    }
    cookies = cookies.slice(); // do not modify the original

    const putNext = err => {
      if (err) {
        return cb(err);
      }

      if (!cookies.length) {
        return cb(err, this);
      }

      let cookie;
      try {
        cookie = fromJSON(cookies.shift());
      } catch (e) {
        return cb(e);
      }

      if (cookie === null) {
        return putNext(null); // skip this cookie
      }

      this.store.putCookie(cookie, putNext);
    };

    putNext();
  }

  clone(newStore, cb) {
    if (arguments.length === 1) {
      cb = newStore;
      newStore = null;
    }

    this.serialize((err, serialized) => {
      if (err) {
        return cb(err);
      }
      CookieJar.deserialize(serialized, newStore, cb);
    });
  }

  cloneSync(newStore) {
    if (arguments.length === 0) {
      return this._cloneSync();
    }
    if (!newStore.synchronous) {
      throw new Error(
        "CookieJar clone destination store is not synchronous; use async API instead."
      );
    }
    return this._cloneSync(newStore);
  }

  removeAllCookies(cb) {
    const store = this.store;

    // Check that the store implements its own removeAllCookies(). The default
    // implementation in Store will immediately call the callback with a "not
    // implemented" Error.
    if (
      typeof store.removeAllCookies === "function" &&
      store.removeAllCookies !== Store.prototype.removeAllCookies
    ) {
      return store.removeAllCookies(cb);
    }

    store.getAllCookies((err, cookies) => {
      if (err) {
        return cb(err);
      }

      if (cookies.length === 0) {
        return cb(null);
      }

      let completedCount = 0;
      const removeErrors = [];

      function removeCookieCb(removeErr) {
        if (removeErr) {
          removeErrors.push(removeErr);
        }

        completedCount++;

        if (completedCount === cookies.length) {
          return cb(removeErrors.length ? removeErrors[0] : null);
        }
      }

      cookies.forEach(cookie => {
        store.removeCookie(
          cookie.domain,
          cookie.path,
          cookie.key,
          removeCookieCb
        );
      });
    });
  }

  static deserialize(strOrObj, store, cb) {
    if (arguments.length !== 3) {
      // store is optional
      cb = store;
      store = null;
    }

    let serialized;
    if (typeof strOrObj === "string") {
      serialized = jsonParse(strOrObj);
      if (serialized instanceof Error) {
        return cb(serialized);
      }
    } else {
      serialized = strOrObj;
    }

    const jar = new CookieJar(store, serialized.rejectPublicSuffixes);
    jar._importCookies(serialized, err => {
      if (err) {
        return cb(err);
      }
      cb(null, jar);
    });
  }

  static deserializeSync(strOrObj, store) {
    const serialized =
      typeof strOrObj === "string" ? JSON.parse(strOrObj) : strOrObj;
    const jar = new CookieJar(store, serialized.rejectPublicSuffixes);

    // catch this mistake early:
    if (!jar.store.synchronous) {
      throw new Error(
        "CookieJar store is not synchronous; use async API instead."
      );
    }

    jar._importCookiesSync(serialized);
    return jar;
  }
}
CookieJar.fromJSON = CookieJar.deserializeSync;

[
  "_importCookies",
  "clone",
  "getCookies",
  "getCookieString",
  "getSetCookieStrings",
  "removeAllCookies",
  "serialize",
  "setCookie"
].forEach(name => {
  CookieJar.prototype[name] = fromCallback(CookieJar.prototype[name]);
});
CookieJar.deserialize = fromCallback(CookieJar.deserialize);

// Use a closure to provide a true imperative API for synchronous stores.
function syncWrap(method) {
  return function(...args) {
    if (!this.store.synchronous) {
      throw new Error(
        "CookieJar store is not synchronous; use async API instead."
      );
    }

    let syncErr, syncResult;
    this[method](...args, (err, result) => {
      syncErr = err;
      syncResult = result;
    });

    if (syncErr) {
      throw syncErr;
    }
    return syncResult;
  };
}

exports.version = VERSION;
exports.CookieJar = CookieJar;
exports.Cookie = Cookie;
exports.Store = Store;
exports.MemoryCookieStore = MemoryCookieStore;
exports.parseDate = parseDate;
exports.formatDate = formatDate;
exports.parse = parse;
exports.fromJSON = fromJSON;
exports.domainMatch = domainMatch;
exports.defaultPath = defaultPath;
exports.pathMatch = pathMatch;
exports.getPublicSuffix = pubsuffix.getPublicSuffix;
exports.cookieCompare = cookieCompare;
exports.permuteDomain = require("./permuteDomain").permuteDomain;
exports.permutePath = permutePath;
exports.canonicalDomain = canonicalDomain;
exports.PrefixSecurityEnum = PrefixSecurityEnum;
/*!
 * Copyright (c) 2015, Salesforce.com, 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.
 *
 * 3. Neither the name of Salesforce.com nor the names of its contributors may
 * 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 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";
const { fromCallback } = require("universalify");
const Store = require("./store").Store;
const permuteDomain = require("./permuteDomain").permuteDomain;
const pathMatch = require("./pathMatch").pathMatch;
const util = require("util");

class MemoryCookieStore extends Store {
  constructor() {
    super();
    this.synchronous = true;
    this.idx = {};
    if (util.inspect.custom) {
      this[util.inspect.custom] = this.inspect;
    }
  }

  inspect() {
    return `{ idx: ${util.inspect(this.idx, false, 2)} }`;
  }

  findCookie(domain, path, key, cb) {
    if (!this.idx[domain]) {
      return cb(null, undefined);
    }
    if (!this.idx[domain][path]) {
      return cb(null, undefined);
    }
    return cb(null, this.idx[domain][path][key] || null);
  }
  findCookies(domain, path, allowSpecialUseDomain, cb) {
    const results = [];
    if (typeof allowSpecialUseDomain === "function") {
      cb = allowSpecialUseDomain;
      allowSpecialUseDomain = false;
    }
    if (!domain) {
      return cb(null, []);
    }

    let pathMatcher;
    if (!path) {
      // null means "all paths"
      pathMatcher = function matchAll(domainIndex) {
        for (const curPath in domainIndex) {
          const pathIndex = domainIndex[curPath];
          for (const key in pathIndex) {
            results.push(pathIndex[key]);
          }
        }
      };
    } else {
      pathMatcher = function matchRFC(domainIndex) {
        //NOTE: we should use path-match algorithm from S5.1.4 here
        //(see : https://github.com/ChromiumWebApps/chromium/blob/b3d3b4da8bb94c1b2e061600df106d590fda3620/net/cookies/canonical_cookie.cc#L299)
        Object.keys(domainIndex).forEach(cookiePath => {
          if (pathMatch(path, cookiePath)) {
            const pathIndex = domainIndex[cookiePath];
            for (const key in pathIndex) {
              results.push(pathIndex[key]);
            }
          }
        });
      };
    }

    const domains = permuteDomain(domain, allowSpecialUseDomain) || [domain];
    const idx = this.idx;
    domains.forEach(curDomain => {
      const domainIndex = idx[curDomain];
      if (!domainIndex) {
        return;
      }
      pathMatcher(domainIndex);
    });

    cb(null, results);
  }

  putCookie(cookie, cb) {
    if (!this.idx[cookie.domain]) {
      this.idx[cookie.domain] = {};
    }
    if (!this.idx[cookie.domain][cookie.path]) {
      this.idx[cookie.domain][cookie.path] = {};
    }
    this.idx[cookie.domain][cookie.path][cookie.key] = cookie;
    cb(null);
  }
  updateCookie(oldCookie, newCookie, cb) {
    // updateCookie() may avoid updating cookies that are identical.  For example,
    // lastAccessed may not be important to some stores and an equality
    // comparison could exclude that field.
    this.putCookie(newCookie, cb);
  }
  removeCookie(domain, path, key, cb) {
    if (
      this.idx[domain] &&
      this.idx[domain][path] &&
      this.idx[domain][path][key]
    ) {
      delete this.idx[domain][path][key];
    }
    cb(null);
  }
  removeCookies(domain, path, cb) {
    if (this.idx[domain]) {
      if (path) {
        delete this.idx[domain][path];
      } else {
        delete this.idx[domain];
      }
    }
    return cb(null);
  }
  removeAllCookies(cb) {
    this.idx = {};
    return cb(null);
  }
  getAllCookies(cb) {
    const cookies = [];
    const idx = this.idx;

    const domains = Object.keys(idx);
    domains.forEach(domain => {
      const paths = Object.keys(idx[domain]);
      paths.forEach(path => {
        const keys = Object.keys(idx[domain][path]);
        keys.forEach(key => {
          if (key !== null) {
            cookies.push(idx[domain][path][key]);
          }
        });
      });
    });

    // Sort by creationIndex so deserializing retains the creation order.
    // When implementing your own store, this SHOULD retain the order too
    cookies.sort((a, b) => {
      return (a.creationIndex || 0) - (b.creationIndex || 0);
    });

    cb(null, cookies);
  }
}

[
  "findCookie",
  "findCookies",
  "putCookie",
  "updateCookie",
  "removeCookie",
  "removeCookies",
  "removeAllCookies",
  "getAllCookies"
].forEach(name => {
  MemoryCookieStore[name] = fromCallback(MemoryCookieStore.prototype[name]);
});

exports.MemoryCookieStore = MemoryCookieStore;
/*!
 * Copyright (c) 2015, Salesforce.com, 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.
 *
 * 3. Neither the name of Salesforce.com nor the names of its contributors may
 * 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 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";
/*
 * "A request-path path-matches a given cookie-path if at least one of the
 * following conditions holds:"
 */
function pathMatch(reqPath, cookiePath) {
  // "o  The cookie-path and the request-path are identical."
  if (cookiePath === reqPath) {
    return true;
  }

  const idx = reqPath.indexOf(cookiePath);
  if (idx === 0) {
    // "o  The cookie-path is a prefix of the request-path, and the last
    // character of the cookie-path is %x2F ("/")."
    if (cookiePath.substr(-1) === "/") {
      return true;
    }

    // " o  The cookie-path is a prefix of the request-path, and the first
    // character of the request-path that is not included in the cookie- path
    // is a %x2F ("/") character."
    if (reqPath.substr(cookiePath.length, 1) === "/") {
      return true;
    }
  }

  return false;
}

exports.pathMatch = pathMatch;
/*!
 * Copyright (c) 2015, Salesforce.com, 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.
 *
 * 3. Neither the name of Salesforce.com nor the names of its contributors may
 * 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 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";
const pubsuffix = require("./pubsuffix-psl");

// Gives the permutation of all possible domainMatch()es of a given domain. The
// array is in shortest-to-longest order.  Handy for indexing.
const SPECIAL_USE_DOMAINS = ["local"]; // RFC 6761
function permuteDomain(domain, allowSpecialUseDomain) {
  let pubSuf = null;
  if (allowSpecialUseDomain) {
    const domainParts = domain.split(".");
    if (SPECIAL_USE_DOMAINS.includes(domainParts[domainParts.length - 1])) {
      pubSuf = `${domainParts[domainParts.length - 2]}.${
        domainParts[domainParts.length - 1]
      }`;
    } else {
      pubSuf = pubsuffix.getPublicSuffix(domain);
    }
  } else {
    pubSuf = pubsuffix.getPublicSuffix(domain);
  }

  if (!pubSuf) {
    return null;
  }
  if (pubSuf == domain) {
    return [domain];
  }

  const prefix = domain.slice(0, -(pubSuf.length + 1)); // ".example.com"
  const parts = prefix.split(".").reverse();
  let cur = pubSuf;
  const permutations = [cur];
  while (parts.length) {
    cur = `${parts.shift()}.${cur}`;
    permutations.push(cur);
  }
  return permutations;
}

exports.permuteDomain = permuteDomain;
/*!
 * Copyright (c) 2018, Salesforce.com, 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.
 *
 * 3. Neither the name of Salesforce.com nor the names of its contributors may
 * 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 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";
const psl = require("psl");

function getPublicSuffix(domain) {
  return psl.get(domain);
}

exports.getPublicSuffix = getPublicSuffix;
/*!
 * Copyright (c) 2015, Salesforce.com, 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.
 *
 * 3. Neither the name of Salesforce.com nor the names of its contributors may
 * 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 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";
/*jshint unused:false */

class Store {
  constructor() {
    this.synchronous = false;
  }

  findCookie(domain, path, key, cb) {
    throw new Error("findCookie is not implemented");
  }

  findCookies(domain, path, allowSpecialUseDomain, cb) {
    throw new Error("findCookies is not implemented");
  }

  putCookie(cookie, cb) {
    throw new Error("putCookie is not implemented");
  }

  updateCookie(oldCookie, newCookie, cb) {
    // recommended default implementation:
    // return this.putCookie(newCookie, cb);
    throw new Error("updateCookie is not implemented");
  }

  removeCookie(domain, path, key, cb) {
    throw new Error("removeCookie is not implemented");
  }

  removeCookies(domain, path, cb) {
    throw new Error("removeCookies is not implemented");
  }

  removeAllCookies(cb) {
    throw new Error("removeAllCookies is not implemented");
  }

  getAllCookies(cb) {
    throw new Error(
      "getAllCookies is not implemented (therefore jar cannot be serialized)"
    );
  }
}

exports.Store = Store;
// generated by genversion
module.exports = '4.0.0'
/******************************************************************************
Copyright (c) Microsoft Corporation.

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.

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.
***************************************************************************** */

Copyright (c) Microsoft Corporation.

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.

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.{
  "name": "tslib",
  "author": "Microsoft Corp.",
  "homepage": "https://www.typescriptlang.org/",
  "version": "2.4.0",
  "license": "0BSD",
  "description": "Runtime library for TypeScript helper functions",
  "repository": {
    "type": "git",
    "url": "https://github.com/Microsoft/tslib.git"
  },
  "main": "tslib.js",
  "module": "tslib.es6.js",
  "jsnext:main": "tslib.es6.js",
  "typings": "tslib.d.ts",
  "sideEffects": false,
  "exports": {
    ".": {
      "module": "./tslib.es6.js",
      "import": "./modules/index.js",
      "default": "./tslib.js"
    },
    "./*": "./*",
    "./": "./"
  }
}<script src="tslib.es6.js"></script>/******************************************************************************
Copyright (c) Microsoft Corporation.

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.

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.
***************************************************************************** */
/* global Reflect, Promise */

var extendStatics = function(d, b) {
    extendStatics = Object.setPrototypeOf ||
        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
    return extendStatics(d, b);
};

export function __extends(d, b) {
    if (typeof b !== "function" && b !== null)
        throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
    extendStatics(d, b);
    function __() { this.constructor = d; }
    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}

export var __assign = function() {
    __assign = Object.assign || function __assign(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
            s = arguments[i];
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
        }
        return t;
    }
    return __assign.apply(this, arguments);
}

export function __rest(s, e) {
    var t = {};
    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
        t[p] = s[p];
    if (s != null && typeof Object.getOwnPropertySymbols === "function")
        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
                t[p[i]] = s[p[i]];
        }
    return t;
}

export function __decorate(decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
}

export function __param(paramIndex, decorator) {
    return function (target, key) { decorator(target, key, paramIndex); }
}

export function __metadata(metadataKey, metadataValue) {
    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
}

export function __awaiter(thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
}

export function __generator(thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
}

export var __createBinding = Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
        desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
});

export function __exportStar(m, o) {
    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);
}

export function __values(o) {
    var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
    if (m) return m.call(o);
    if (o && typeof o.length === "number") return {
        next: function () {
            if (o && i >= o.length) o = void 0;
            return { value: o && o[i++], done: !o };
        }
    };
    throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
}

export function __read(o, n) {
    var m = typeof Symbol === "function" && o[Symbol.iterator];
    if (!m) return o;
    var i = m.call(o), r, ar = [], e;
    try {
        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
    }
    catch (error) { e = { error: error }; }
    finally {
        try {
            if (r && !r.done && (m = i["return"])) m.call(i);
        }
        finally { if (e) throw e.error; }
    }
    return ar;
}

/** @deprecated */
export function __spread() {
    for (var ar = [], i = 0; i < arguments.length; i++)
        ar = ar.concat(__read(arguments[i]));
    return ar;
}

/** @deprecated */
export function __spreadArrays() {
    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
    for (var r = Array(s), k = 0, i = 0; i < il; i++)
        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
            r[k] = a[j];
    return r;
}

export function __spreadArray(to, from, pack) {
    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
        if (ar || !(i in from)) {
            if (!ar) ar = Array.prototype.slice.call(from, 0, i);
            ar[i] = from[i];
        }
    }
    return to.concat(ar || Array.prototype.slice.call(from));
}

export function __await(v) {
    return this instanceof __await ? (this.v = v, this) : new __await(v);
}

export function __asyncGenerator(thisArg, _arguments, generator) {
    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
    var g = generator.apply(thisArg, _arguments || []), i, q = [];
    return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
    function fulfill(value) { resume("next", value); }
    function reject(value) { resume("throw", value); }
    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
}

export function __asyncDelegator(o) {
    var i, p;
    return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
}

export function __asyncValues(o) {
    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
    var m = o[Symbol.asyncIterator], i;
    return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
}

export function __makeTemplateObject(cooked, raw) {
    if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
    return cooked;
};

var __setModuleDefault = Object.create ? (function(o, v) {
    Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
    o["default"] = v;
};

export function __importStar(mod) {
    if (mod && mod.__esModule) return mod;
    var result = {};
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    __setModuleDefault(result, mod);
    return result;
}

export function __importDefault(mod) {
    return (mod && mod.__esModule) ? mod : { default: mod };
}

export function __classPrivateFieldGet(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);
}

export function __classPrivateFieldSet(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;
}

export function __classPrivateFieldIn(state, receiver) {
    if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function")) throw new TypeError("Cannot use 'in' operator on non-object");
    return typeof state === "function" ? receiver === state : state.has(receiver);
}
<script src="tslib.js"></script>/******************************************************************************
Copyright (c) Microsoft Corporation.

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.

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.
***************************************************************************** */
/* global global, define, System, Reflect, Promise */
var __extends;
var __assign;
var __rest;
var __decorate;
var __param;
var __metadata;
var __awaiter;
var __generator;
var __exportStar;
var __values;
var __read;
var __spread;
var __spreadArrays;
var __spreadArray;
var __await;
var __asyncGenerator;
var __asyncDelegator;
var __asyncValues;
var __makeTemplateObject;
var __importStar;
var __importDefault;
var __classPrivateFieldGet;
var __classPrivateFieldSet;
var __classPrivateFieldIn;
var __createBinding;
(function (factory) {
    var root = typeof global === "object" ? global : typeof self === "object" ? self : typeof this === "object" ? this : {};
    if (typeof define === "function" && define.amd) {
        define("tslib", ["exports"], function (exports) { factory(createExporter(root, createExporter(exports))); });
    }
    else if (typeof module === "object" && typeof module.exports === "object") {
        factory(createExporter(root, createExporter(module.exports)));
    }
    else {
        factory(createExporter(root));
    }
    function createExporter(exports, previous) {
        if (exports !== root) {
            if (typeof Object.create === "function") {
                Object.defineProperty(exports, "__esModule", { value: true });
            }
            else {
                exports.__esModule = true;
            }
        }
        return function (id, v) { return exports[id] = previous ? previous(id, v) : v; };
    }
})
(function (exporter) {
    var extendStatics = Object.setPrototypeOf ||
        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };

    __extends = function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };

    __assign = Object.assign || function (t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
            s = arguments[i];
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
        }
        return t;
    };

    __rest = function (s, e) {
        var t = {};
        for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
            t[p] = s[p];
        if (s != null && typeof Object.getOwnPropertySymbols === "function")
            for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
                if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
                    t[p[i]] = s[p[i]];
            }
        return t;
    };

    __decorate = function (decorators, target, key, desc) {
        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
        if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
        else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
        return c > 3 && r && Object.defineProperty(target, key, r), r;
    };

    __param = function (paramIndex, decorator) {
        return function (target, key) { decorator(target, key, paramIndex); }
    };

    __metadata = function (metadataKey, metadataValue) {
        if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
    };

    __awaiter = function (thisArg, _arguments, P, generator) {
        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
        return new (P || (P = Promise))(function (resolve, reject) {
            function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
            function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
            step((generator = generator.apply(thisArg, _arguments || [])).next());
        });
    };

    __generator = function (thisArg, body) {
        var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
        return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
        function verb(n) { return function (v) { return step([n, v]); }; }
        function step(op) {
            if (f) throw new TypeError("Generator is already executing.");
            while (_) try {
                if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
                if (y = 0, t) op = [op[0] & 2, t.value];
                switch (op[0]) {
                    case 0: case 1: t = op; break;
                    case 4: _.label++; return { value: op[1], done: false };
                    case 5: _.label++; y = op[1]; op = [0]; continue;
                    case 7: op = _.ops.pop(); _.trys.pop(); continue;
                    default:
                        if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                        if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                        if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                        if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                        if (t[2]) _.ops.pop();
                        _.trys.pop(); continue;
                }
                op = body.call(thisArg, _);
            } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
            if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
        }
    };

    __exportStar = function(m, o) {
        for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);
    };

    __createBinding = Object.create ? (function(o, m, k, k2) {
        if (k2 === undefined) k2 = k;
        var desc = Object.getOwnPropertyDescriptor(m, k);
        if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
            desc = { enumerable: true, get: function() { return m[k]; } };
        }
        Object.defineProperty(o, k2, desc);
    }) : (function(o, m, k, k2) {
        if (k2 === undefined) k2 = k;
        o[k2] = m[k];
    });

    __values = function (o) {
        var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
        if (m) return m.call(o);
        if (o && typeof o.length === "number") return {
            next: function () {
                if (o && i >= o.length) o = void 0;
                return { value: o && o[i++], done: !o };
            }
        };
        throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
    };

    __read = function (o, n) {
        var m = typeof Symbol === "function" && o[Symbol.iterator];
        if (!m) return o;
        var i = m.call(o), r, ar = [], e;
        try {
            while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
        }
        catch (error) { e = { error: error }; }
        finally {
            try {
                if (r && !r.done && (m = i["return"])) m.call(i);
            }
            finally { if (e) throw e.error; }
        }
        return ar;
    };

    /** @deprecated */
    __spread = function () {
        for (var ar = [], i = 0; i < arguments.length; i++)
            ar = ar.concat(__read(arguments[i]));
        return ar;
    };

    /** @deprecated */
    __spreadArrays = function () {
        for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
        for (var r = Array(s), k = 0, i = 0; i < il; i++)
            for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
                r[k] = a[j];
        return r;
    };

    __spreadArray = function (to, from, pack) {
        if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
            if (ar || !(i in from)) {
                if (!ar) ar = Array.prototype.slice.call(from, 0, i);
                ar[i] = from[i];
            }
        }
        return to.concat(ar || Array.prototype.slice.call(from));
    };

    __await = function (v) {
        return this instanceof __await ? (this.v = v, this) : new __await(v);
    };

    __asyncGenerator = function (thisArg, _arguments, generator) {
        if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
        var g = generator.apply(thisArg, _arguments || []), i, q = [];
        return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
        function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
        function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
        function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r);  }
        function fulfill(value) { resume("next", value); }
        function reject(value) { resume("throw", value); }
        function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
    };

    __asyncDelegator = function (o) {
        var i, p;
        return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
        function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
    };

    __asyncValues = function (o) {
        if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
        var m = o[Symbol.asyncIterator], i;
        return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
        function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
        function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
    };

    __makeTemplateObject = function (cooked, raw) {
        if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
        return cooked;
    };

    var __setModuleDefault = Object.create ? (function(o, v) {
        Object.defineProperty(o, "default", { enumerable: true, value: v });
    }) : function(o, v) {
        o["default"] = v;
    };

    __importStar = function (mod) {
        if (mod && mod.__esModule) return mod;
        var result = {};
        if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
        __setModuleDefault(result, mod);
        return result;
    };

    __importDefault = function (mod) {
        return (mod && mod.__esModule) ? mod : { "default": mod };
    };

    __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);
    };

    __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;
    };

    __classPrivateFieldIn = function (state, receiver) {
        if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function")) throw new TypeError("Cannot use 'in' operator on non-object");
        return typeof state === "function" ? receiver === state : state.has(receiver);
    };

    exporter("__extends", __extends);
    exporter("__assign", __assign);
    exporter("__rest", __rest);
    exporter("__decorate", __decorate);
    exporter("__param", __param);
    exporter("__metadata", __metadata);
    exporter("__awaiter", __awaiter);
    exporter("__generator", __generator);
    exporter("__exportStar", __exportStar);
    exporter("__createBinding", __createBinding);
    exporter("__values", __values);
    exporter("__read", __read);
    exporter("__spread", __spread);
    exporter("__spreadArrays", __spreadArrays);
    exporter("__spreadArray", __spreadArray);
    exporter("__await", __await);
    exporter("__asyncGenerator", __asyncGenerator);
    exporter("__asyncDelegator", __asyncDelegator);
    exporter("__asyncValues", __asyncValues);
    exporter("__makeTemplateObject", __makeTemplateObject);
    exporter("__importStar", __importStar);
    exporter("__importDefault", __importDefault);
    exporter("__classPrivateFieldGet", __classPrivateFieldGet);
    exporter("__classPrivateFieldSet", __classPrivateFieldSet);
    exporter("__classPrivateFieldIn", __classPrivateFieldIn);
});
import tslib from '../tslib.js';
const {
    __extends,
    __assign,
    __rest,
    __decorate,
    __param,
    __metadata,
    __awaiter,
    __generator,
    __exportStar,
    __createBinding,
    __values,
    __read,
    __spread,
    __spreadArrays,
    __spreadArray,
    __await,
    __asyncGenerator,
    __asyncDelegator,
    __asyncValues,
    __makeTemplateObject,
    __importStar,
    __importDefault,
    __classPrivateFieldGet,
    __classPrivateFieldSet,
    __classPrivateFieldIn,
} = tslib;
export {
    __extends,
    __assign,
    __rest,
    __decorate,
    __param,
    __metadata,
    __awaiter,
    __generator,
    __exportStar,
    __createBinding,
    __values,
    __read,
    __spread,
    __spreadArrays,
    __spreadArray,
    __await,
    __asyncGenerator,
    __asyncDelegator,
    __asyncValues,
    __makeTemplateObject,
    __importStar,
    __importDefault,
    __classPrivateFieldGet,
    __classPrivateFieldSet,
    __classPrivateFieldIn,
};
{
    "type": "module"
}The MIT License (MIT)

Copyright (c) 2012 Koichi Kobayashi

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.
module.exports = require('./lib/tunnel');
{
  "name": "tunnel",
  "version": "0.0.6",
  "description": "Node HTTP/HTTPS Agents for tunneling proxies",
  "homepage": "https://github.com/koichik/node-tunnel/",
  "license": "MIT",
  "author": "Koichi Kobayashi <koichik@improvement.jp>",
  "main": "./index.js",
  "directories": {
    "lib": "./lib"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/koichik/node-tunnel.git"
  },
  "devDependencies": {
    "mocha": "^5.2.0",
    "should": "^13.2.3"
  },
  "engines": {
    "node": ">=0.6.11 <=0.7.0 || >=0.7.3"
  }
}'use strict';

var net = require('net');
var tls = require('tls');
var http = require('http');
var https = require('https');
var events = require('events');
var assert = require('assert');
var util = require('util');


exports.httpOverHttp = httpOverHttp;
exports.httpsOverHttp = httpsOverHttp;
exports.httpOverHttps = httpOverHttps;
exports.httpsOverHttps = httpsOverHttps;


function httpOverHttp(options) {
  var agent = new TunnelingAgent(options);
  agent.request = http.request;
  return agent;
}

function httpsOverHttp(options) {
  var agent = new TunnelingAgent(options);
  agent.request = http.request;
  agent.createSocket = createSecureSocket;
  agent.defaultPort = 443;
  return agent;
}

function httpOverHttps(options) {
  var agent = new TunnelingAgent(options);
  agent.request = https.request;
  return agent;
}

function httpsOverHttps(options) {
  var agent = new TunnelingAgent(options);
  agent.request = https.request;
  agent.createSocket = createSecureSocket;
  agent.defaultPort = 443;
  return agent;
}


function TunnelingAgent(options) {
  var self = this;
  self.options = options || {};
  self.proxyOptions = self.options.proxy || {};
  self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets;
  self.requests = [];
  self.sockets = [];

  self.on('free', function onFree(socket, host, port, localAddress) {
    var options = toOptions(host, port, localAddress);
    for (var i = 0, len = self.requests.length; i < len; ++i) {
      var pending = self.requests[i];
      if (pending.host === options.host && pending.port === options.port) {
        // Detect the request to connect same origin server,
        // reuse the connection.
        self.requests.splice(i, 1);
        pending.request.onSocket(socket);
        return;
      }
    }
    socket.destroy();
    self.removeSocket(socket);
  });
}
util.inherits(TunnelingAgent, events.EventEmitter);

TunnelingAgent.prototype.addRequest = function addRequest(req, host, port, localAddress) {
  var self = this;
  var options = mergeOptions({request: req}, self.options, toOptions(host, port, localAddress));

  if (self.sockets.length >= this.maxSockets) {
    // We are over limit so we'll add it to the queue.
    self.requests.push(options);
    return;
  }

  // If we are under maxSockets create a new one.
  self.createSocket(options, function(socket) {
    socket.on('free', onFree);
    socket.on('close', onCloseOrRemove);
    socket.on('agentRemove', onCloseOrRemove);
    req.onSocket(socket);

    function onFree() {
      self.emit('free', socket, options);
    }

    function onCloseOrRemove(err) {
      self.removeSocket(socket);
      socket.removeListener('free', onFree);
      socket.removeListener('close', onCloseOrRemove);
      socket.removeListener('agentRemove', onCloseOrRemove);
    }
  });
};

TunnelingAgent.prototype.createSocket = function createSocket(options, cb) {
  var self = this;
  var placeholder = {};
  self.sockets.push(placeholder);

  var connectOptions = mergeOptions({}, self.proxyOptions, {
    method: 'CONNECT',
    path: options.host + ':' + options.port,
    agent: false,
    headers: {
      host: options.host + ':' + options.port
    }
  });
  if (options.localAddress) {
    connectOptions.localAddress = options.localAddress;
  }
  if (connectOptions.proxyAuth) {
    connectOptions.headers = connectOptions.headers || {};
    connectOptions.headers['Proxy-Authorization'] = 'Basic ' +
        new Buffer(connectOptions.proxyAuth).toString('base64');
  }

  debug('making CONNECT request');
  var connectReq = self.request(connectOptions);
  connectReq.useChunkedEncodingByDefault = false; // for v0.6
  connectReq.once('response', onResponse); // for v0.6
  connectReq.once('upgrade', onUpgrade);   // for v0.6
  connectReq.once('connect', onConnect);   // for v0.7 or later
  connectReq.once('error', onError);
  connectReq.end();

  function onResponse(res) {
    // Very hacky. This is necessary to avoid http-parser leaks.
    res.upgrade = true;
  }

  function onUpgrade(res, socket, head) {
    // Hacky.
    process.nextTick(function() {
      onConnect(res, socket, head);
    });
  }

  function onConnect(res, socket, head) {
    connectReq.removeAllListeners();
    socket.removeAllListeners();

    if (res.statusCode !== 200) {
      debug('tunneling socket could not be established, statusCode=%d',
        res.statusCode);
      socket.destroy();
      var error = new Error('tunneling socket could not be established, ' +
        'statusCode=' + res.statusCode);
      error.code = 'ECONNRESET';
      options.request.emit('error', error);
      self.removeSocket(placeholder);
      return;
    }
    if (head.length > 0) {
      debug('got illegal response body from proxy');
      socket.destroy();
      var error = new Error('got illegal response body from proxy');
      error.code = 'ECONNRESET';
      options.request.emit('error', error);
      self.removeSocket(placeholder);
      return;
    }
    debug('tunneling connection has established');
    self.sockets[self.sockets.indexOf(placeholder)] = socket;
    return cb(socket);
  }

  function onError(cause) {
    connectReq.removeAllListeners();

    debug('tunneling socket could not be established, cause=%s\n',
          cause.message, cause.stack);
    var error = new Error('tunneling socket could not be established, ' +
                          'cause=' + cause.message);
    error.code = 'ECONNRESET';
    options.request.emit('error', error);
    self.removeSocket(placeholder);
  }
};

TunnelingAgent.prototype.removeSocket = function removeSocket(socket) {
  var pos = this.sockets.indexOf(socket)
  if (pos === -1) {
    return;
  }
  this.sockets.splice(pos, 1);

  var pending = this.requests.shift();
  if (pending) {
    // If we have pending requests and a socket gets closed a new one
    // needs to be created to take over in the pool for the one that closed.
    this.createSocket(pending, function(socket) {
      pending.request.onSocket(socket);
    });
  }
};

function createSecureSocket(options, cb) {
  var self = this;
  TunnelingAgent.prototype.createSocket.call(self, options, function(socket) {
    var hostHeader = options.request.getHeader('host');
    var tlsOptions = mergeOptions({}, self.options, {
      socket: socket,
      servername: hostHeader ? hostHeader.replace(/:.*$/, '') : options.host
    });

    // 0 is dummy port for v0.6
    var secureSocket = tls.connect(0, tlsOptions);
    self.sockets[self.sockets.indexOf(socket)] = secureSocket;
    cb(secureSocket);
  });
}


function toOptions(host, port, localAddress) {
  if (typeof host === 'string') { // since v0.10
    return {
      host: host,
      port: port,
      localAddress: localAddress
    };
  }
  return host; // for v0.11 or later
}

function mergeOptions(target) {
  for (var i = 1, len = arguments.length; i < len; ++i) {
    var overrides = arguments[i];
    if (typeof overrides === 'object') {
      var keys = Object.keys(overrides);
      for (var j = 0, keyLen = keys.length; j < keyLen; ++j) {
        var k = keys[j];
        if (overrides[k] !== undefined) {
          target[k] = overrides[k];
        }
      }
    }
  }
  return target;
}


var debug;
if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) {
  debug = function() {
    var args = Array.prototype.slice.call(arguments);
    if (typeof args[0] === 'string') {
      args[0] = 'TUNNEL: ' + args[0];
    } else {
      args.unshift('TUNNEL:');
    }
    console.error.apply(console, args);
  }
} else {
  debug = function() {};
}
exports.debug = debug; // for test
Apache License

Version 2.0, January 2004

http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions.

"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.

"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."

"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

You must give any other recipients of the Work or Derivative Works a copy of this License; and

You must cause any modified files to carry prominent notices stating that You changed the files; and

You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS'use strict'

var net = require('net')
  , tls = require('tls')
  , http = require('http')
  , https = require('https')
  , events = require('events')
  , assert = require('assert')
  , util = require('util')
  , Buffer = require('safe-buffer').Buffer
  ;

exports.httpOverHttp = httpOverHttp
exports.httpsOverHttp = httpsOverHttp
exports.httpOverHttps = httpOverHttps
exports.httpsOverHttps = httpsOverHttps


function httpOverHttp(options) {
  var agent = new TunnelingAgent(options)
  agent.request = http.request
  return agent
}

function httpsOverHttp(options) {
  var agent = new TunnelingAgent(options)
  agent.request = http.request
  agent.createSocket = createSecureSocket
  agent.defaultPort = 443
  return agent
}

function httpOverHttps(options) {
  var agent = new TunnelingAgent(options)
  agent.request = https.request
  return agent
}

function httpsOverHttps(options) {
  var agent = new TunnelingAgent(options)
  agent.request = https.request
  agent.createSocket = createSecureSocket
  agent.defaultPort = 443
  return agent
}


function TunnelingAgent(options) {
  var self = this
  self.options = options || {}
  self.proxyOptions = self.options.proxy || {}
  self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets
  self.requests = []
  self.sockets = []

  self.on('free', function onFree(socket, host, port) {
    for (var i = 0, len = self.requests.length; i < len; ++i) {
      var pending = self.requests[i]
      if (pending.host === host && pending.port === port) {
        // Detect the request to connect same origin server,
        // reuse the connection.
        self.requests.splice(i, 1)
        pending.request.onSocket(socket)
        return
      }
    }
    socket.destroy()
    self.removeSocket(socket)
  })
}
util.inherits(TunnelingAgent, events.EventEmitter)

TunnelingAgent.prototype.addRequest = function addRequest(req, options) {
  var self = this

   // Legacy API: addRequest(req, host, port, path)
  if (typeof options === 'string') {
    options = {
      host: options,
      port: arguments[2],
      path: arguments[3]
    };
  }

  if (self.sockets.length >= this.maxSockets) {
    // We are over limit so we'll add it to the queue.
    self.requests.push({host: options.host, port: options.port, request: req})
    return
  }

  // If we are under maxSockets create a new one.
  self.createConnection({host: options.host, port: options.port, request: req})
}

TunnelingAgent.prototype.createConnection = function createConnection(pending) {
  var self = this

  self.createSocket(pending, function(socket) {
    socket.on('free', onFree)
    socket.on('close', onCloseOrRemove)
    socket.on('agentRemove', onCloseOrRemove)
    pending.request.onSocket(socket)

    function onFree() {
      self.emit('free', socket, pending.host, pending.port)
    }

    function onCloseOrRemove(err) {
      self.removeSocket(socket)
      socket.removeListener('free', onFree)
      socket.removeListener('close', onCloseOrRemove)
      socket.removeListener('agentRemove', onCloseOrRemove)
    }
  })
}

TunnelingAgent.prototype.createSocket = function createSocket(options, cb) {
  var self = this
  var placeholder = {}
  self.sockets.push(placeholder)

  var connectOptions = mergeOptions({}, self.proxyOptions,
    { method: 'CONNECT'
    , path: options.host + ':' + options.port
    , agent: false
    }
  )
  if (connectOptions.proxyAuth) {
    connectOptions.headers = connectOptions.headers || {}
    connectOptions.headers['Proxy-Authorization'] = 'Basic ' +
        Buffer.from(connectOptions.proxyAuth).toString('base64')
  }

  debug('making CONNECT request')
  var connectReq = self.request(connectOptions)
  connectReq.useChunkedEncodingByDefault = false // for v0.6
  connectReq.once('response', onResponse) // for v0.6
  connectReq.once('upgrade', onUpgrade)   // for v0.6
  connectReq.once('connect', onConnect)   // for v0.7 or later
  connectReq.once('error', onError)
  connectReq.end()

  function onResponse(res) {
    // Very hacky. This is necessary to avoid http-parser leaks.
    res.upgrade = true
  }

  function onUpgrade(res, socket, head) {
    // Hacky.
    process.nextTick(function() {
      onConnect(res, socket, head)
    })
  }

  function onConnect(res, socket, head) {
    connectReq.removeAllListeners()
    socket.removeAllListeners()

    if (res.statusCode === 200) {
      assert.equal(head.length, 0)
      debug('tunneling connection has established')
      self.sockets[self.sockets.indexOf(placeholder)] = socket
      cb(socket)
    } else {
      debug('tunneling socket could not be established, statusCode=%d', res.statusCode)
      var error = new Error('tunneling socket could not be established, ' + 'statusCode=' + res.statusCode)
      error.code = 'ECONNRESET'
      options.request.emit('error', error)
      self.removeSocket(placeholder)
    }
  }

  function onError(cause) {
    connectReq.removeAllListeners()

    debug('tunneling socket could not be established, cause=%s\n', cause.message, cause.stack)
    var error = new Error('tunneling socket could not be established, ' + 'cause=' + cause.message)
    error.code = 'ECONNRESET'
    options.request.emit('error', error)
    self.removeSocket(placeholder)
  }
}

TunnelingAgent.prototype.removeSocket = function removeSocket(socket) {
  var pos = this.sockets.indexOf(socket)
  if (pos === -1) return

  this.sockets.splice(pos, 1)

  var pending = this.requests.shift()
  if (pending) {
    // If we have pending requests and a socket gets closed a new one
    // needs to be created to take over in the pool for the one that closed.
    this.createConnection(pending)
  }
}

function createSecureSocket(options, cb) {
  var self = this
  TunnelingAgent.prototype.createSocket.call(self, options, function(socket) {
    // 0 is dummy port for v0.6
    var secureSocket = tls.connect(0, mergeOptions({}, self.options,
      { servername: options.host
      , socket: socket
      }
    ))
    self.sockets[self.sockets.indexOf(socket)] = secureSocket
    cb(secureSocket)
  })
}


function mergeOptions(target) {
  for (var i = 1, len = arguments.length; i < len; ++i) {
    var overrides = arguments[i]
    if (typeof overrides === 'object') {
      var keys = Object.keys(overrides)
      for (var j = 0, keyLen = keys.length; j < keyLen; ++j) {
        var k = keys[j]
        if (overrides[k] !== undefined) {
          target[k] = overrides[k]
        }
      }
    }
  }
  return target
}


var debug
if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) {
  debug = function() {
    var args = Array.prototype.slice.call(arguments)
    if (typeof args[0] === 'string') {
      args[0] = 'TUNNEL: ' + args[0]
    } else {
      args.unshift('TUNNEL:')
    }
    console.error.apply(console, args)
  }
} else {
  debug = function() {}
}
exports.debug = debug // for test
{
  "author": "Mikeal Rogers <mikeal.rogers@gmail.com> (http://www.futurealoof.com)",
  "name": "tunnel-agent",
  "license": "Apache-2.0",
  "description": "HTTP proxy tunneling agent. Formerly part of mikeal/request, now a standalone module.",
  "version": "0.6.0",
  "repository": {
    "url": "https://github.com/mikeal/tunnel-agent"
  },
  "main": "index.js",
  "files": [
    "index.js"
  ],
  "dependencies": {
    "safe-buffer": "^5.0.1"
  },
  "devDependencies": {},
  "optionalDependencies": {},
  "engines": {
    "node": "*"
  }
}
1.6.18 / 2019-04-26
===================

  * Fix regression passing request object to `typeis.is`

1.6.17 / 2019-04-25
===================

  * deps: mime-types@~2.1.24
    - Add Apple file extensions from IANA
    - Add extension `.csl` to `application/vnd.citationstyles.style+xml`
    - Add extension `.es` to `application/ecmascript`
    - Add extension `.nq` to `application/n-quads`
    - Add extension `.nt` to `application/n-triples`
    - Add extension `.owl` to `application/rdf+xml`
    - Add extensions `.siv` and `.sieve` to `application/sieve`
    - Add extensions from IANA for `image/*` types
    - Add extensions from IANA for `model/*` types
    - Add extensions to HEIC image types
    - Add new mime types
    - Add `text/mdx` with extension `.mdx`
  * perf: prevent internal `throw` on invalid type

1.6.16 / 2018-02-16
===================

  * deps: mime-types@~2.1.18
    - Add `application/raml+yaml` with extension `.raml`
    - Add `application/wasm` with extension `.wasm`
    - Add `text/shex` with extension `.shex`
    - Add extensions for JPEG-2000 images
    - Add extensions from IANA for `message/*` types
    - Add extension `.mjs` to `application/javascript`
    - Add extension `.wadl` to `application/vnd.sun.wadl+xml`
    - Add extension `.gz` to `application/gzip`
    - Add glTF types and extensions
    - Add new mime types
    - Update extensions `.md` and `.markdown` to be `text/markdown`
    - Update font MIME types
    - Update `text/hjson` to registered `application/hjson`

1.6.15 / 2017-03-31
===================

  * deps: mime-types@~2.1.15
    - Add new mime types

1.6.14 / 2016-11-18
===================

  * deps: mime-types@~2.1.13
    - Add new mime types

1.6.13 / 2016-05-18
===================

  * deps: mime-types@~2.1.11
    - Add new mime types

1.6.12 / 2016-02-28
===================

  * deps: mime-types@~2.1.10
    - Add new mime types
    - Fix extension of `application/dash+xml`
    - Update primary extension for `audio/mp4`

1.6.11 / 2016-01-29
===================

  * deps: mime-types@~2.1.9
    - Add new mime types

1.6.10 / 2015-12-01
===================

  * deps: mime-types@~2.1.8
    - Add new mime types

1.6.9 / 2015-09-27
==================

  * deps: mime-types@~2.1.7
    - Add new mime types

1.6.8 / 2015-09-04
==================

  * deps: mime-types@~2.1.6
    - Add new mime types

1.6.7 / 2015-08-20
==================

  * Fix type error when given invalid type to match against
  * deps: mime-types@~2.1.5
    - Add new mime types

1.6.6 / 2015-07-31
==================

  * deps: mime-types@~2.1.4
    - Add new mime types

1.6.5 / 2015-07-16
==================

  * deps: mime-types@~2.1.3
    - Add new mime types

1.6.4 / 2015-07-01
==================

  * deps: mime-types@~2.1.2
    - Add new mime types
  * perf: enable strict mode
  * perf: remove argument reassignment

1.6.3 / 2015-06-08
==================

  * deps: mime-types@~2.1.1
    - Add new mime types
  * perf: reduce try block size
  * perf: remove bitwise operations

1.6.2 / 2015-05-10
==================

  * deps: mime-types@~2.0.11
    - Add new mime types

1.6.1 / 2015-03-13
==================

  * deps: mime-types@~2.0.10
    - Add new mime types

1.6.0 / 2015-02-12
==================

  * fix false-positives in `hasBody` `Transfer-Encoding` check
  * support wildcard for both type and subtype (`*/*`)

1.5.7 / 2015-02-09
==================

  * fix argument reassignment
  * deps: mime-types@~2.0.9
    - Add new mime types

1.5.6 / 2015-01-29
==================

  * deps: mime-types@~2.0.8
    - Add new mime types

1.5.5 / 2014-12-30
==================

  * deps: mime-types@~2.0.7
    - Add new mime types
    - Fix missing extensions
    - Fix various invalid MIME type entries
    - Remove example template MIME types
    - deps: mime-db@~1.5.0

1.5.4 / 2014-12-10
==================

  * deps: mime-types@~2.0.4
    - Add new mime types
    - deps: mime-db@~1.3.0

1.5.3 / 2014-11-09
==================

  * deps: mime-types@~2.0.3
    - Add new mime types
    - deps: mime-db@~1.2.0

1.5.2 / 2014-09-28
==================

  * deps: mime-types@~2.0.2
    - Add new mime types
    - deps: mime-db@~1.1.0

1.5.1 / 2014-09-07
==================

  * Support Node.js 0.6
  * deps: media-typer@0.3.0
  * deps: mime-types@~2.0.1
    - Support Node.js 0.6

1.5.0 / 2014-09-05
==================

 * fix `hasbody` to be true for `content-length: 0`

1.4.0 / 2014-09-02
==================

 * update mime-types

1.3.2 / 2014-06-24
==================

 * use `~` range on mime-types

1.3.1 / 2014-06-19
==================

 * fix global variable leak

1.3.0 / 2014-06-19
==================

 * improve type parsing

   - invalid media type never matches
   - media type not case-sensitive
   - extra LWS does not affect results

1.2.2 / 2014-06-19
==================

 * fix behavior on unknown type argument

1.2.1 / 2014-06-03
==================

 * switch dependency from `mime` to `mime-types@1.0.0`

1.2.0 / 2014-05-11
==================

 * support suffix matching:

   - `+json` matches `application/vnd+json`
   - `*/vnd+json` matches `application/vnd+json`
   - `application/*+json` matches `application/vnd+json`

1.1.0 / 2014-04-12
==================

 * add non-array values support
 * expose internal utilities:

   - `.is()`
   - `.hasBody()`
   - `.normalize()`
   - `.match()`

1.0.1 / 2014-03-30
==================

 * add `multipart` as a shorthand
(The MIT License)

Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
Copyright (c) 2014-2015 Douglas Christopher Wilson <doug@somethingdoug.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.
/*!
 * type-is
 * Copyright(c) 2014 Jonathan Ong
 * Copyright(c) 2014-2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module dependencies.
 * @private
 */

var typer = require('media-typer')
var mime = require('mime-types')

/**
 * Module exports.
 * @public
 */

module.exports = typeofrequest
module.exports.is = typeis
module.exports.hasBody = hasbody
module.exports.normalize = normalize
module.exports.match = mimeMatch

/**
 * Compare a `value` content-type with `types`.
 * Each `type` can be an extension like `html`,
 * a special shortcut like `multipart` or `urlencoded`,
 * or a mime type.
 *
 * If no types match, `false` is returned.
 * Otherwise, the first `type` that matches is returned.
 *
 * @param {String} value
 * @param {Array} types
 * @public
 */

function typeis (value, types_) {
  var i
  var types = types_

  // remove parameters and normalize
  var val = tryNormalizeType(value)

  // no type or invalid
  if (!val) {
    return false
  }

  // support flattened arguments
  if (types && !Array.isArray(types)) {
    types = new Array(arguments.length - 1)
    for (i = 0; i < types.length; i++) {
      types[i] = arguments[i + 1]
    }
  }

  // no types, return the content type
  if (!types || !types.length) {
    return val
  }

  var type
  for (i = 0; i < types.length; i++) {
    if (mimeMatch(normalize(type = types[i]), val)) {
      return type[0] === '+' || type.indexOf('*') !== -1
        ? val
        : type
    }
  }

  // no matches
  return false
}

/**
 * Check if a request has a request body.
 * A request with a body __must__ either have `transfer-encoding`
 * or `content-length` headers set.
 * http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3
 *
 * @param {Object} request
 * @return {Boolean}
 * @public
 */

function hasbody (req) {
  return req.headers['transfer-encoding'] !== undefined ||
    !isNaN(req.headers['content-length'])
}

/**
 * Check if the incoming request contains the "Content-Type"
 * header field, and it contains any of the give mime `type`s.
 * If there is no request body, `null` is returned.
 * If there is no content type, `false` is returned.
 * Otherwise, it returns the first `type` that matches.
 *
 * Examples:
 *
 *     // With Content-Type: text/html; charset=utf-8
 *     this.is('html'); // => 'html'
 *     this.is('text/html'); // => 'text/html'
 *     this.is('text/*', 'application/json'); // => 'text/html'
 *
 *     // When Content-Type is application/json
 *     this.is('json', 'urlencoded'); // => 'json'
 *     this.is('application/json'); // => 'application/json'
 *     this.is('html', 'application/*'); // => 'application/json'
 *
 *     this.is('html'); // => false
 *
 * @param {String|Array} types...
 * @return {String|false|null}
 * @public
 */

function typeofrequest (req, types_) {
  var types = types_

  // no body
  if (!hasbody(req)) {
    return null
  }

  // support flattened arguments
  if (arguments.length > 2) {
    types = new Array(arguments.length - 1)
    for (var i = 0; i < types.length; i++) {
      types[i] = arguments[i + 1]
    }
  }

  // request content type
  var value = req.headers['content-type']

  return typeis(value, types)
}

/**
 * Normalize a mime type.
 * If it's a shorthand, expand it to a valid mime type.
 *
 * In general, you probably want:
 *
 *   var type = is(req, ['urlencoded', 'json', 'multipart']);
 *
 * Then use the appropriate body parsers.
 * These three are the most common request body types
 * and are thus ensured to work.
 *
 * @param {String} type
 * @private
 */

function normalize (type) {
  if (typeof type !== 'string') {
    // invalid type
    return false
  }

  switch (type) {
    case 'urlencoded':
      return 'application/x-www-form-urlencoded'
    case 'multipart':
      return 'multipart/*'
  }

  if (type[0] === '+') {
    // "+json" -> "*/*+json" expando
    return '*/*' + type
  }

  return type.indexOf('/') === -1
    ? mime.lookup(type)
    : type
}

/**
 * Check if `expected` mime type
 * matches `actual` mime type with
 * wildcard and +suffix support.
 *
 * @param {String} expected
 * @param {String} actual
 * @return {Boolean}
 * @private
 */

function mimeMatch (expected, actual) {
  // invalid type
  if (expected === false) {
    return false
  }

  // split types
  var actualParts = actual.split('/')
  var expectedParts = expected.split('/')

  // invalid format
  if (actualParts.length !== 2 || expectedParts.length !== 2) {
    return false
  }

  // validate type
  if (expectedParts[0] !== '*' && expectedParts[0] !== actualParts[0]) {
    return false
  }

  // validate suffix wildcard
  if (expectedParts[1].substr(0, 2) === '*+') {
    return expectedParts[1].length <= actualParts[1].length + 1 &&
      expectedParts[1].substr(1) === actualParts[1].substr(1 - expectedParts[1].length)
  }

  // validate subtype
  if (expectedParts[1] !== '*' && expectedParts[1] !== actualParts[1]) {
    return false
  }

  return true
}

/**
 * Normalize a type and remove parameters.
 *
 * @param {string} value
 * @return {string}
 * @private
 */

function normalizeType (value) {
  // parse the type
  var type = typer.parse(value)

  // remove the parameters
  type.parameters = undefined

  // reformat it
  return typer.format(type)
}

/**
 * Try to normalize a type and remove parameters.
 *
 * @param {string} value
 * @return {string}
 * @private
 */

function tryNormalizeType (value) {
  if (!value) {
    return null
  }

  try {
    return normalizeType(value)
  } catch (err) {
    return null
  }
}
{
  "name": "type-is",
  "description": "Infer the content-type of a request.",
  "version": "1.6.18",
  "license": "MIT",
  "repository": "jshttp/type-is",
  "dependencies": {
    "media-typer": "0.3.0",
    "mime-types": "~2.1.24"
  },
  "devDependencies": {
    "eslint": "5.16.0",
    "eslint-config-standard": "12.0.0",
    "eslint-plugin-import": "2.17.2",
    "eslint-plugin-markdown": "1.0.0",
    "eslint-plugin-node": "8.0.1",
    "eslint-plugin-promise": "4.1.1",
    "eslint-plugin-standard": "4.0.0",
    "mocha": "6.1.4",
    "nyc": "14.0.0"
  },
  "engines": {
    "node": ">= 0.6"
  },
  "files": [
    "LICENSE",
    "HISTORY.md",
    "index.js"
  ]
}The MIT License (MIT)

Copyright (c) 2018 Andy Wermke

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": "typed-emitter",
  "version": "2.1.0",
  "license": "MIT",
  "description": "Strictly typed event emitter interface for TypeScript 3.",
  "author": "Andy Wermke (https://github.com/andywer)",
  "repository": "github:andywer/typed-emitter",
  "main": "./types.js",
  "types": "./index.d.ts",
  "optionalDependencies": {
    "rxjs": "*"
  },
  "devDependencies": {
    "rxjs": "^7.5.2"
  }
}// https://github.com/octokit/openapi-types.ts/issues/16#issuecomment-772784156
// https://github.com/octokit/openapi-types.ts/issues/16#issuecomment-772784156
The MIT License (MIT)

Copyright (c) 2014-2017 Sequelize contributors

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

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

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
{
  "name": "umzug",
  "version": "3.2.1",
  "description": "Framework-agnostic migration tool for Node",
  "main": "lib/index.js",
  "files": [
    "lib"
  ],
  "dependencies": {
    "@rushstack/ts-command-line": "^4.12.2",
    "emittery": "^0.12.1",
    "fs-jetpack": "^4.3.1",
    "glob": "^8.0.3",
    "pony-cause": "^2.1.2",
    "type-fest": "^2.18.0"
  },
  "devDependencies": {
    "@types/glob": "7.2.0",
    "@types/jest": "27.0.3",
    "@types/lodash": "4.14.178",
    "@types/uuid": "8.3.3",
    "@types/verror": "^1.10.5",
    "@typescript-eslint/eslint-plugin": "5.8.1",
    "@typescript-eslint/parser": "5.8.1",
    "del-cli": "4.0.1",
    "eslint": "8.5.0",
    "eslint-config-xo": "0.39.0",
    "eslint-config-xo-typescript": "0.47.1",
    "eslint-plugin-codegen": "0.16.1",
    "eslint-plugin-import": "2.25.3",
    "eslint-plugin-jest": "25.3.0",
    "eslint-plugin-mocha": "10.0.3",
    "eslint-plugin-prettier": "4.0.0",
    "eslint-plugin-unicorn": "39.0.0",
    "expect-type": "0.13.0",
    "fs-syncer": "0.4.0",
    "jest": "27.4.5",
    "lodash": "4.17.21",
    "np": "7.6.0",
    "prettier": "2.5.1",
    "sequelize": "6.12.3",
    "sinon": "12.0.1",
    "source-map-support": "0.5.21",
    "sqlite3": "npm:@vscode/sqlite3@5.0.7",
    "strip-ansi": "6.0.1",
    "ts-jest": "27.1.2",
    "ts-node": "10.4.0",
    "typescript": "4.6.2",
    "uuid": "8.3.2",
    "verror": "^1.10.0"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/sequelize/umzug.git"
  },
  "author": "Sascha Depold <sascha@depold.com>",
  "license": "MIT",
  "homepage": "https://github.com/sequelize/umzug",
  "engines": {
    "node": ">=12"
  },
  "jest": {
    "preset": "ts-jest",
    "globals": {
      "ts-jest": {
        "diagnostics": false
      }
    },
    "testEnvironment": "node",
    "testMatch": [
      "**/*test.ts"
    ],
    "collectCoverageFrom": [
      "src/**"
    ]
  }
}"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.UmzugCLI = exports.CreateAction = exports.ListAction = exports.DownAction = exports.UpAction = exports.ApplyMigrationsAction = void 0;
const cli = require("@rushstack/ts-command-line");
class ApplyMigrationsAction extends cli.CommandLineAction {
    constructor(umzug, cliOptions) {
        super(cliOptions);
        this.umzug = umzug;
    }
    static _defineParameters(action) {
        const verb = ApplyMigrationsAction.getVerb(action.actionName);
        return {
            to: action.defineStringParameter({
                parameterLongName: '--to',
                argumentName: 'NAME',
                // prettier-ignore
                description: `All migrations up to and including this one should be ${verb}. ${verb === 'reverted' ? 'Pass "0" to revert all.' : ''}`.trim(),
            }),
            step: action.defineIntegerParameter({
                parameterLongName: '--step',
                argumentName: 'COUNT',
                // prettier-ignore
                description: `Run this many migrations. If not specified, ${verb === 'reverted' ? 'one' : 'all'} will be ${verb}.`,
            }),
            name: action.defineStringListParameter({
                parameterLongName: '--name',
                argumentName: 'MIGRATION',
                description: `Explicity declare migration name(s) to be ${verb}.`,
            }),
            rerun: action.defineChoiceParameter({
                parameterLongName: '--rerun',
                description: `Specify what action should be taken when a migration that has already been ${verb} is passed to --name.`,
                alternatives: ['THROW', 'SKIP', 'ALLOW'],
                defaultValue: 'THROW',
            }),
        };
    }
    onDefineParameters() {
        this._params = ApplyMigrationsAction._defineParameters(this);
    }
    static getVerb(direction) {
        return {
            up: 'applied',
            down: 'reverted',
        }[direction];
    }
    async onExecute() {
        var _a;
        const { to: { value: to }, step: { value: step }, name: { values: nameArray }, rerun: { value: rerun }, } = this._params;
        // string list parameters are always defined. When they're empty it means nothing was passed.
        const maybeNameArray = nameArray.length > 0 ? nameArray : undefined;
        if (to && maybeNameArray) {
            throw new Error(`Can't specify 'to' and 'name' together`);
        }
        if (to && typeof step === 'number') {
            throw new Error(`Can't specify 'to' and 'step' together`);
        }
        if (typeof step === 'number' && maybeNameArray) {
            throw new Error(`Can't specify 'step' and 'name' together`);
        }
        if (rerun !== 'THROW' && !maybeNameArray) {
            throw new Error(`Can't specify 'rerun' without 'name'`);
        }
        const params = {
            to: to === '0' ? 0 : to,
            step,
            migrations: maybeNameArray,
            rerun,
        };
        const actions = {
            up: async () => this.umzug.up(params),
            down: async () => this.umzug.down(params),
        };
        const result = await actions[this.actionName]();
        const verb = ApplyMigrationsAction.getVerb(this.actionName);
        (_a = this.umzug.options.logger) === null || _a === void 0 ? void 0 : _a.info({ event: this.actionName, message: `${verb} ${result.length} migrations.` });
    }
}
exports.ApplyMigrationsAction = ApplyMigrationsAction;
class UpAction extends ApplyMigrationsAction {
    constructor(umzug) {
        super(umzug, {
            actionName: 'up',
            summary: 'Applies pending migrations',
            documentation: 'Performs all migrations. See --help for more options',
        });
    }
}
exports.UpAction = UpAction;
class DownAction extends ApplyMigrationsAction {
    constructor(umzug) {
        super(umzug, {
            actionName: 'down',
            summary: 'Revert migrations',
            documentation: 'Undoes previously-applied migrations. By default, undoes the most recent migration only. Use --help for more options. Useful in development to start from a clean slate. Use with care in production!',
        });
    }
}
exports.DownAction = DownAction;
class ListAction extends cli.CommandLineAction {
    constructor(action, umzug) {
        super({
            actionName: action,
            summary: `Lists ${action} migrations`,
            documentation: `Prints migrations returned by \`umzug.${action}()\`. By default, prints migration names one per line.`,
        });
        this.action = action;
        this.umzug = umzug;
    }
    static _defineParameters(action) {
        return {
            json: action.defineFlagParameter({
                parameterLongName: '--json',
                description: `Print ${action.actionName} migrations in a json format including names and paths. This allows piping output to tools like jq. ` +
                    `Without this flag, the migration names will be printed one per line.`,
            }),
        };
    }
    onDefineParameters() {
        this._params = ListAction._defineParameters(this);
    }
    async onExecute() {
        const migrations = await this.umzug[this.action]();
        const formatted = this._params.json.value
            ? JSON.stringify(migrations, null, 2)
            : migrations.map(m => m.name).join('\n');
        // eslint-disable-next-line no-console
        console.log(formatted);
    }
}
exports.ListAction = ListAction;
class CreateAction extends cli.CommandLineAction {
    constructor(umzug) {
        super({
            actionName: 'create',
            summary: 'Create a migration file',
            documentation: 'Generates a placeholder migration file using a timestamp as a prefix. By default, mimics the last existing migration, or guesses where to generate the file if no migration exists yet.',
        });
        this.umzug = umzug;
    }
    static _defineParameters(action) {
        return {
            name: action.defineStringParameter({
                parameterLongName: '--name',
                argumentName: 'NAME',
                description: `The name of the migration file. e.g. my-migration.js, my-migration.ts or my-migration.sql. Note - a prefix will be added to this name, usually based on a timestamp. See --prefix`,
                required: true,
            }),
            prefix: action.defineChoiceParameter({
                parameterLongName: '--prefix',
                description: 'The prefix format for generated files. TIMESTAMP uses a second-resolution timestamp, DATE uses a day-resolution timestamp, and NONE removes the prefix completely',
                alternatives: ['TIMESTAMP', 'DATE', 'NONE'],
                defaultValue: 'TIMESTAMP',
            }),
            folder: action.defineStringParameter({
                parameterLongName: '--folder',
                argumentName: 'PATH',
                description: `Path on the filesystem where the file should be created. The new migration will be created as a sibling of the last existing one if this is omitted.`,
            }),
            allowExtension: action.defineStringListParameter({
                parameterLongName: '--allow-extension',
                argumentName: 'EXTENSION',
                environmentVariable: 'UMZUG_ALLOW_EXTENSION',
                description: `Allowable extension for created files. By default .js, .ts and .sql files can be created. To create txt file migrations, for example, you could use '--name my-migration.txt --allow-extension .txt'`,
            }),
            skipVerify: action.defineFlagParameter({
                parameterLongName: '--skip-verify',
                description: `By default, the generated file will be checked after creation to make sure it is detected as a pending migration. This catches problems like creation in the wrong folder, or invalid naming conventions. ` +
                    `This flag bypasses that verification step.`,
            }),
            allowConfusingOrdering: action.defineFlagParameter({
                parameterLongName: '--allow-confusing-ordering',
                description: `By default, an error will be thrown if you try to create a migration that will run before a migration that already exists. ` +
                    `This catches errors which can cause problems if you change file naming conventions. ` +
                    `If you use a custom ordering system, you can disable this behavior, but it's strongly recommended that you don't! ` +
                    `If you're unsure, just ignore this option.`,
            }),
        };
    }
    onDefineParameters() {
        this._params = CreateAction._defineParameters(this);
    }
    async onExecute() {
        await this.umzug
            .create({
            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
            name: this._params.name.value,
            prefix: this._params.prefix.value,
            folder: this._params.folder.value,
            allowExtension: this._params.allowExtension.values.length > 0 ? this._params.allowExtension.values[0] : undefined,
            allowConfusingOrdering: this._params.allowConfusingOrdering.value,
            skipVerify: this._params.skipVerify.value,
        })
            .catch((e) => {
            Object.entries(this._params)
                .filter(entry => entry[0] !== 'name')
                .forEach(([name, param]) => {
                var _a;
                // replace `skipVerify` in error messages with `--skip-verify`, etc.
                e.message = (_a = e.message) === null || _a === void 0 ? void 0 : _a.split(name).join(param.longName);
            });
            throw e;
        });
    }
}
exports.CreateAction = CreateAction;
class UmzugCLI extends cli.CommandLineParser {
    constructor(umzug, commandLineParserOptions = {}) {
        var _a, _b;
        super({
            toolFilename: (_a = commandLineParserOptions.toolFileName) !== null && _a !== void 0 ? _a : '<script>',
            toolDescription: (_b = commandLineParserOptions.toolDescription) !== null && _b !== void 0 ? _b : 'Umzug migrator',
        });
        this.umzug = umzug;
        this.addAction(new UpAction(umzug));
        this.addAction(new DownAction(umzug));
        this.addAction(new ListAction('pending', umzug));
        this.addAction(new ListAction('executed', umzug));
        this.addAction(new CreateAction(umzug));
    }
    onDefineParameters() { }
}
exports.UmzugCLI = UmzugCLI;
//# sourceMappingURL=cli.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.FileLocker = void 0;
const fs = require("fs");
const path = require("path");
/**
 * Simple locker using the filesystem. Only one lock can be held per file. An error will be thrown if the
 * lock file already exists.
 *
 * @example
 * const umzug = new Umzug({ ... })
 * FileLocker.attach(umzug, { path: 'path/to/lockfile' })
 *
 * @docs
 * To wait for the lock to be free instead of throwing, you could extend it (the below example uses `setInterval`,
 * but depending on your use-case, you may want to use a library with retry/backoff):
 *
 * @example
 * class WaitingFileLocker extends FileLocker {
 *   async getLock() {
 *     return new Promise(resolve => setInterval(
 *       () => super.getLock().then(resolve).catch(),
 *       500,
 *     )
 *   }
 * }
 *
 * const locker = new WaitingFileLocker({ path: 'path/to/lockfile' })
 * locker.attachTo(umzug)
 */
class FileLocker {
    constructor(params) {
        var _a;
        this.lockFile = params.path;
        this.fs = (_a = params.fs) !== null && _a !== void 0 ? _a : fs;
    }
    /** Attach `beforeAll` and `afterAll` events to an umzug instance which use the specified filepath */
    static attach(umzug, params) {
        const locker = new FileLocker(params);
        locker.attachTo(umzug);
    }
    /** Attach lock handlers to `beforeCommand` and `afterCommand` events on an umzug instance */
    attachTo(umzug) {
        umzug.on('beforeCommand', async () => this.getLock());
        umzug.on('afterCommand', async () => this.releaseLock());
    }
    async readFile(filepath) {
        return this.fs.promises.readFile(filepath).then(buf => buf.toString(), () => undefined);
    }
    async writeFile(filepath, content) {
        await this.fs.promises.mkdir(path.dirname(filepath), { recursive: true });
        await this.fs.promises.writeFile(filepath, content);
    }
    async removeFile(filepath) {
        await this.fs.promises.unlink(filepath);
    }
    async getLock() {
        const existing = await this.readFile(this.lockFile);
        if (existing) {
            throw new Error(`Can't acquire lock. ${this.lockFile} exists`);
        }
        await this.writeFile(this.lockFile, 'lock');
    }
    async releaseLock() {
        const existing = await this.readFile(this.lockFile);
        if (!existing) {
            throw new Error(`Nothing to unlock`);
        }
        await this.removeFile(this.lockFile);
    }
}
exports.FileLocker = FileLocker;
//# sourceMappingURL=file-locker.js.map"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
__exportStar(require("./umzug"), exports);
__exportStar(require("./storage"), exports);
__exportStar(require("./file-locker"), exports);
__exportStar(require("./types"), exports);
__exportStar(require("./cli"), exports);
//# sourceMappingURL=index.js.map"use strict";
// templates for migration file creation
Object.defineProperty(exports, "__esModule", { value: true });
exports.sqlDown = exports.sqlUp = exports.mjs = exports.ts = exports.js = void 0;
exports.js = `
/** @type {import('umzug').MigrationFn<any>} */
exports.up = async params => {};

/** @type {import('umzug').MigrationFn<any>} */
exports.down = async params => {};
`.trimStart();
exports.ts = `
import { MigrationFn } from 'umzug';

export const up: MigrationFn = params => {};
export const down: MigrationFn = params => {};
`.trimStart();
exports.mjs = `
/** @type {import('umzug').MigrationFn<any>} */
export const up = async params => {};

/** @type {import('umzug').MigrationFn<any>} */
export const down = async params => {};
`.trimStart();
exports.sqlUp = `
-- up migration
`.trimStart();
exports.sqlDown = `
-- down migration
`.trimStart();
//# sourceMappingURL=templates.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.RerunBehavior = void 0;
exports.RerunBehavior = {
    /** Hard error if an up migration that has already been run, or a down migration that hasn't, is encountered */
    THROW: 'THROW',
    /** Silently skip up migrations that have already been run, or down migrations that haven't */
    SKIP: 'SKIP',
    /** Re-run up migrations that have already been run, or down migrations that haven't */
    ALLOW: 'ALLOW',
};
//# sourceMappingURL=types.js.map"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Umzug = exports.MigrationError = void 0;
const path = require("path");
const fs = require("fs");
const util_1 = require("util");
const storage_1 = require("./storage");
const templates = require("./templates");
const glob = require("glob");
const cli_1 = require("./cli");
const emittery = require("emittery");
const errorCause = require("pony-cause");
const types_1 = require("./types");
const globAsync = (0, util_1.promisify)(glob);
class MigrationError extends errorCause.ErrorWithCause {
    // TODO [>=4.0.0] Take a `{ cause: ... }` options bag like the default `Error`, it looks like this because of verror backwards-compatibility.
    constructor(migration, original) {
        super(`Migration ${migration.name} (${migration.direction}) failed: ${MigrationError.errorString(original)}`, {
            cause: original,
        });
        this.name = 'MigrationError';
        this.jse_cause = original;
        this.migration = migration;
    }
    // TODO [>=4.0.0] Remove this backwards-compatibility alias
    get info() {
        return this.migration;
    }
    static errorString(cause) {
        return cause instanceof Error
            ? `Original error: ${cause.message}`
            : `Non-error value thrown. See info for full props: ${cause}`;
    }
}
exports.MigrationError = MigrationError;
class Umzug extends emittery {
    /** creates a new Umzug instance */
    constructor(options) {
        var _b;
        super();
        this.options = options;
        this.storage = (0, storage_1.verifyUmzugStorage)((_b = options.storage) !== null && _b !== void 0 ? _b : new storage_1.JSONStorage());
        this.migrations = this.getMigrationsResolver(this.options.migrations);
    }
    logging(message) {
        var _b;
        (_b = this.options.logger) === null || _b === void 0 ? void 0 : _b.info(message);
    }
    /**
     * Get an UmzugCLI instance. This can be overriden in a subclass to add/remove commands - only use if you really know you need this,
     * and are OK to learn about/interact with the API of @rushstack/ts-command-line.
     */
    getCli(options) {
        return new cli_1.UmzugCLI(this, options);
    }
    /**
     * 'Run' an umzug instance as a CLI. This will read `process.argv`, execute commands based on that, and call
     * `process.exit` after running. If that isn't what you want, stick to the programmatic API.
     * You probably want to run only if a file is executed as the process's 'main' module with something like:
     * @example
     * if (require.main === module) {
     *   myUmzugInstance.runAsCLI()
     * }
     */
    async runAsCLI(argv) {
        const cli = this.getCli();
        return cli.execute(argv);
    }
    /** Get the list of migrations which have already been applied */
    async executed() {
        return this.runCommand('executed', async ({ context }) => {
            const list = await this._executed(context);
            // We do the following to not expose the `up` and `down` functions to the user
            return list.map(m => ({ name: m.name, path: m.path }));
        });
    }
    /** Get the list of migrations which have already been applied */
    async _executed(context) {
        const [migrations, executedNames] = await Promise.all([
            this.migrations(context),
            this.storage.executed({ context }),
        ]);
        const executedSet = new Set(executedNames);
        return migrations.filter(m => executedSet.has(m.name));
    }
    /** Get the list of migrations which are yet to be applied */
    async pending() {
        return this.runCommand('pending', async ({ context }) => {
            const list = await this._pending(context);
            // We do the following to not expose the `up` and `down` functions to the user
            return list.map(m => ({ name: m.name, path: m.path }));
        });
    }
    async _pending(context) {
        const [migrations, executedNames] = await Promise.all([
            this.migrations(context),
            this.storage.executed({ context }),
        ]);
        const executedSet = new Set(executedNames);
        return migrations.filter(m => !executedSet.has(m.name));
    }
    async runCommand(command, cb) {
        const context = await this.getContext();
        await this.emit('beforeCommand', { command, context });
        try {
            return await cb({ context });
        }
        finally {
            await this.emit('afterCommand', { command, context });
        }
    }
    /**
     * Apply migrations. By default, runs all pending migrations.
     * @see MigrateUpOptions for other use cases using `to`, `migrations` and `rerun`.
     */
    async up(options = {}) {
        const eligibleMigrations = async (context) => {
            var _b;
            if (options.migrations && options.rerun === types_1.RerunBehavior.ALLOW) {
                // Allow rerun means the specified migrations should be run even if they've run before - so get all migrations, not just pending
                const list = await this.migrations(context);
                return this.findMigrations(list, options.migrations);
            }
            if (options.migrations && options.rerun === types_1.RerunBehavior.SKIP) {
                const executedNames = new Set((await this._executed(context)).map(m => m.name));
                const filteredMigrations = options.migrations.filter(m => !executedNames.has(m));
                return this.findMigrations(await this.migrations(context), filteredMigrations);
            }
            if (options.migrations) {
                return this.findMigrations(await this._pending(context), options.migrations);
            }
            const allPending = await this._pending(context);
            let sliceIndex = (_b = options.step) !== null && _b !== void 0 ? _b : allPending.length;
            if (options.to) {
                sliceIndex = this.findNameIndex(allPending, options.to) + 1;
            }
            return allPending.slice(0, sliceIndex);
        };
        return this.runCommand('up', async ({ context }) => {
            const toBeApplied = await eligibleMigrations(context);
            for (const m of toBeApplied) {
                const start = Date.now();
                const params = { name: m.name, path: m.path, context };
                this.logging({ event: 'migrating', name: m.name });
                await this.emit('migrating', params);
                try {
                    await m.up(params);
                }
                catch (e) {
                    throw new MigrationError({ direction: 'up', ...params }, e);
                }
                await this.storage.logMigration(params);
                const duration = (Date.now() - start) / 1000;
                this.logging({ event: 'migrated', name: m.name, durationSeconds: duration });
                await this.emit('migrated', params);
            }
            return toBeApplied.map(m => ({ name: m.name, path: m.path }));
        });
    }
    /**
     * Revert migrations. By default, the last executed migration is reverted.
     * @see MigrateDownOptions for other use cases using `to`, `migrations` and `rerun`.
     */
    async down(options = {}) {
        const eligibleMigrations = async (context) => {
            var _b;
            if (options.migrations && options.rerun === types_1.RerunBehavior.ALLOW) {
                const list = await this.migrations(context);
                return this.findMigrations(list, options.migrations);
            }
            if (options.migrations && options.rerun === types_1.RerunBehavior.SKIP) {
                const pendingNames = new Set((await this._pending(context)).map(m => m.name));
                const filteredMigrations = options.migrations.filter(m => !pendingNames.has(m));
                return this.findMigrations(await this.migrations(context), filteredMigrations);
            }
            if (options.migrations) {
                return this.findMigrations(await this._executed(context), options.migrations);
            }
            const executedReversed = (await this._executed(context)).slice().reverse();
            let sliceIndex = (_b = options.step) !== null && _b !== void 0 ? _b : 1;
            if (options.to === 0 || options.migrations) {
                sliceIndex = executedReversed.length;
            }
            else if (options.to) {
                sliceIndex = this.findNameIndex(executedReversed, options.to) + 1;
            }
            return executedReversed.slice(0, sliceIndex);
        };
        return this.runCommand('down', async ({ context }) => {
            var _b;
            const toBeReverted = await eligibleMigrations(context);
            for (const m of toBeReverted) {
                const start = Date.now();
                const params = { name: m.name, path: m.path, context };
                this.logging({ event: 'reverting', name: m.name });
                await this.emit('reverting', params);
                try {
                    await ((_b = m.down) === null || _b === void 0 ? void 0 : _b.call(m, params));
                }
                catch (e) {
                    throw new MigrationError({ direction: 'down', ...params }, e);
                }
                await this.storage.unlogMigration(params);
                const duration = Number.parseFloat(((Date.now() - start) / 1000).toFixed(3));
                this.logging({ event: 'reverted', name: m.name, durationSeconds: duration });
                await this.emit('reverted', params);
            }
            return toBeReverted.map(m => ({ name: m.name, path: m.path }));
        });
    }
    async create(options) {
        await this.runCommand('create', async ({ context }) => {
            var _b, _c, _d, _e;
            const isoDate = new Date().toISOString();
            const prefixes = {
                TIMESTAMP: isoDate.replace(/\.\d{3}Z$/, '').replace(/\W/g, '.'),
                DATE: isoDate.split('T')[0].replace(/\W/g, '.'),
                NONE: '',
            };
            const prefixType = (_b = options.prefix) !== null && _b !== void 0 ? _b : 'TIMESTAMP';
            const fileBasename = [prefixes[prefixType], options.name].filter(Boolean).join('.');
            const allowedExtensions = options.allowExtension
                ? [options.allowExtension]
                : ['.js', '.cjs', '.mjs', '.ts', '.sql'];
            const existing = await this.migrations(context);
            const last = existing[existing.length - 1];
            const confusinglyOrdered = existing.find(e => e.path && path.basename(e.path) > fileBasename);
            if (confusinglyOrdered && !options.allowConfusingOrdering) {
                throw new Error(`Can't create ${fileBasename}, since it's unclear if it should run before or after existing migration ${confusinglyOrdered.name}. Use allowConfusingOrdering to bypass this error.`);
            }
            const folder = options.folder || ((_c = this.options.create) === null || _c === void 0 ? void 0 : _c.folder) || ((last === null || last === void 0 ? void 0 : last.path) && path.dirname(last.path));
            if (!folder) {
                throw new Error(`Couldn't infer a directory to generate migration file in. Pass folder explicitly`);
            }
            const filepath = path.join(folder, fileBasename);
            const template = (_e = (_d = this.options.create) === null || _d === void 0 ? void 0 : _d.template) !== null && _e !== void 0 ? _e : Umzug.defaultCreationTemplate;
            const toWrite = template(filepath);
            if (toWrite.length === 0) {
                toWrite.push([filepath, '']);
            }
            toWrite.forEach(pair => {
                if (!Array.isArray(pair) || pair.length !== 2) {
                    throw new Error(`Expected [filepath, content] pair. Check that the file template function returns an array of pairs.`);
                }
                const ext = path.extname(pair[0]);
                if (!allowedExtensions.includes(ext)) {
                    const allowStr = allowedExtensions.join(', ');
                    const message = `Extension ${ext} not allowed. Allowed extensions are ${allowStr}. See help for allowExtension to avoid this error.`;
                    throw new Error(message);
                }
                fs.mkdirSync(path.dirname(pair[0]), { recursive: true });
                fs.writeFileSync(pair[0], pair[1]);
                this.logging({ event: 'created', path: pair[0] });
            });
            if (!options.skipVerify) {
                const [firstFilePath] = toWrite[0];
                const pending = await this._pending(context);
                if (!pending.some(p => p.path && path.resolve(p.path) === path.resolve(firstFilePath))) {
                    const paths = pending.map(p => p.path).join(', ');
                    throw new Error(`Expected ${firstFilePath} to be a pending migration but it wasn't! Pending migration paths: ${paths}. You should investigate this. Use skipVerify to bypass this error.`);
                }
            }
        });
    }
    static defaultCreationTemplate(filepath) {
        const ext = path.extname(filepath);
        if (ext === '.js' || ext === '.cjs') {
            return [[filepath, templates.js]];
        }
        if (ext === '.ts') {
            return [[filepath, templates.ts]];
        }
        if (ext === '.mjs') {
            return [[filepath, templates.mjs]];
        }
        if (ext === '.sql') {
            const downFilepath = path.join(path.dirname(filepath), 'down', path.basename(filepath));
            return [
                [filepath, templates.sqlUp],
                [downFilepath, templates.sqlDown],
            ];
        }
        return [];
    }
    findNameIndex(migrations, name) {
        const index = migrations.findIndex(m => m.name === name);
        if (index === -1) {
            throw new Error(`Couldn't find migration to apply with name ${JSON.stringify(name)}`);
        }
        return index;
    }
    findMigrations(migrations, names) {
        const map = new Map(migrations.map(m => [m.name, m]));
        return names.map(name => {
            const migration = map.get(name);
            if (!migration) {
                throw new Error(`Couldn't find migration to apply with name ${JSON.stringify(name)}`);
            }
            return migration;
        });
    }
    async getContext() {
        const { context = {} } = this.options;
        // eslint-disable-next-line @typescript-eslint/no-unsafe-return
        return typeof context === 'function' ? context() : context;
    }
    /** helper for parsing input migrations into a callback returning a list of ready-to-run migrations */
    getMigrationsResolver(inputMigrations) {
        var _b;
        if (Array.isArray(inputMigrations)) {
            return async () => inputMigrations;
        }
        if (typeof inputMigrations === 'function') {
            // Lazy migrations definition, recurse.
            return async (ctx) => {
                const resolved = await inputMigrations(ctx);
                return this.getMigrationsResolver(resolved)(ctx);
            };
        }
        const fileGlob = inputMigrations.glob;
        const [globString, globOptions] = Array.isArray(fileGlob) ? fileGlob : [fileGlob];
        const resolver = (_b = inputMigrations.resolve) !== null && _b !== void 0 ? _b : Umzug.defaultResolver;
        return async (context) => {
            const paths = await globAsync(globString, { ...globOptions, absolute: true });
            return paths.map(unresolvedPath => {
                const filepath = path.resolve(unresolvedPath);
                const name = path.basename(filepath);
                return {
                    path: filepath,
                    ...resolver({ name, path: filepath, context }),
                };
            });
        };
    }
}
exports.Umzug = Umzug;
_a = Umzug;
Umzug.defaultResolver = ({ name, path: filepath }) => {
    if (!filepath) {
        throw new Error(`Can't use default resolver for non-filesystem migrations`);
    }
    const ext = path.extname(filepath);
    const canRequire = ext === '.js' || ext === '.cjs' || ext === '.ts';
    const languageSpecificHelp = {
        '.ts': "TypeScript files can be required by adding `ts-node` as a dependency and calling `require('ts-node/register')` at the program entrypoint before running migrations.",
        '.sql': 'Try writing a resolver which reads file content and executes it as a sql query.',
    };
    if (!canRequire) {
        const errorParts = [
            `No resolver specified for file ${filepath}.`,
            languageSpecificHelp[ext],
            `See docs for guidance on how to write a custom resolver.`,
        ];
        throw new Error(errorParts.filter(Boolean).join(' '));
    }
    const getModule = () => {
        try {
            // eslint-disable-next-line @typescript-eslint/no-unsafe-return
            return require(filepath);
        }
        catch (e) {
            if (e instanceof SyntaxError && filepath.endsWith('.ts')) {
                e.message += '\n\n' + languageSpecificHelp['.ts'];
            }
            throw e;
        }
    };
    return {
        name,
        path: filepath,
        up: async ({ context }) => getModule().up({ path: filepath, name, context }),
        down: async ({ context }) => getModule().down({ path: filepath, name, context }),
    };
};
//# sourceMappingURL=umzug.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.verifyUmzugStorage = exports.isUmzugStorage = void 0;
function isUmzugStorage(arg) {
    return (arg &&
        typeof arg.logMigration === 'function' &&
        typeof arg.unlogMigration === 'function' &&
        typeof arg.executed === 'function');
}
exports.isUmzugStorage = isUmzugStorage;
const verifyUmzugStorage = (arg) => {
    if (!isUmzugStorage(arg)) {
        throw new Error(`Invalid umzug storage`);
    }
    return arg;
};
exports.verifyUmzugStorage = verifyUmzugStorage;
//# sourceMappingURL=contract.js.map"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
// codegen:start {preset: barrel}
__exportStar(require("./contract"), exports);
__exportStar(require("./json"), exports);
__exportStar(require("./memory"), exports);
__exportStar(require("./mongodb"), exports);
__exportStar(require("./sequelize"), exports);
// codegen:end
//# sourceMappingURL=index.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.JSONStorage = void 0;
const jetpack = require("fs-jetpack");
class JSONStorage {
    constructor(options) {
        var _a;
        this.path = (_a = options === null || options === void 0 ? void 0 : options.path) !== null && _a !== void 0 ? _a : jetpack.path(process.cwd(), 'umzug.json');
    }
    async logMigration({ name: migrationName }) {
        const loggedMigrations = await this.executed();
        loggedMigrations.push(migrationName);
        await jetpack.writeAsync(this.path, JSON.stringify(loggedMigrations, null, 2));
    }
    async unlogMigration({ name: migrationName }) {
        const loggedMigrations = await this.executed();
        const updatedMigrations = loggedMigrations.filter(name => name !== migrationName);
        await jetpack.writeAsync(this.path, JSON.stringify(updatedMigrations, null, 2));
    }
    async executed() {
        const content = await jetpack.readAsync(this.path);
        return content ? JSON.parse(content) : [];
    }
}
exports.JSONStorage = JSONStorage;
//# sourceMappingURL=json.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.memoryStorage = void 0;
const memoryStorage = () => {
    let executed = [];
    return {
        logMigration: async ({ name }) => {
            executed.push(name);
        },
        unlogMigration: async ({ name }) => {
            executed = executed.filter(n => n !== name);
        },
        executed: async () => [...executed],
    };
};
exports.memoryStorage = memoryStorage;
//# sourceMappingURL=memory.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MongoDBStorage = void 0;
function isMongoDBCollectionOptions(arg) {
    return Boolean(arg.collection);
}
class MongoDBStorage {
    constructor(options) {
        var _a, _b;
        if (!options || (!options.collection && !options.connection)) {
            throw new Error('MongoDB Connection or Collection required');
        }
        this.collection = isMongoDBCollectionOptions(options)
            ? options.collection
            : options.connection.collection((_a = options.collectionName) !== null && _a !== void 0 ? _a : 'migrations');
        this.connection = options.connection; // TODO remove this
        this.collectionName = (_b = options.collectionName) !== null && _b !== void 0 ? _b : 'migrations'; // TODO remove this
    }
    async logMigration({ name: migrationName }) {
        await this.collection.insertOne({ migrationName });
    }
    async unlogMigration({ name: migrationName }) {
        await this.collection.deleteOne({ migrationName });
    }
    async executed() {
        const records = await this.collection.find({}).sort({ migrationName: 1 }).toArray();
        return records.map(r => r.migrationName);
    }
}
exports.MongoDBStorage = MongoDBStorage;
//# sourceMappingURL=mongodb.js.map"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SequelizeStorage = void 0;
class SequelizeStorage {
    /**
    Constructs Sequelize based storage. Migrations will be stored in a SequelizeMeta table using the given instance of Sequelize.

    If a model is given, it will be used directly as the model for the SequelizeMeta table. Otherwise, it will be created automatically according to the given options.

    If the table does not exist it will be created automatically upon the logging of the first migration.
    */
    constructor(options) {
        var _a, _b, _c, _d, _e, _f;
        if (!options || (!options.model && !options.sequelize)) {
            throw new Error('One of "sequelize" or "model" storage option is required');
        }
        this.sequelize = (_a = options.sequelize) !== null && _a !== void 0 ? _a : options.model.sequelize;
        this.columnType = (_b = options.columnType) !== null && _b !== void 0 ? _b : this.sequelize.constructor.STRING;
        this.columnName = (_c = options.columnName) !== null && _c !== void 0 ? _c : 'name';
        this.timestamps = (_d = options.timestamps) !== null && _d !== void 0 ? _d : false;
        this.modelName = (_e = options.modelName) !== null && _e !== void 0 ? _e : 'SequelizeMeta';
        this.tableName = options.tableName;
        this.schema = options.schema;
        this.model = (_f = options.model) !== null && _f !== void 0 ? _f : this.getModel();
    }
    getModel() {
        if (this.sequelize.isDefined(this.modelName)) {
            // eslint-disable-next-line @typescript-eslint/no-unsafe-return
            return this.sequelize.model(this.modelName);
        }
        return this.sequelize.define(this.modelName, {
            [this.columnName]: {
                type: this.columnType,
                allowNull: false,
                unique: true,
                primaryKey: true,
                autoIncrement: false,
            },
        }, {
            tableName: this.tableName,
            schema: this.schema,
            timestamps: this.timestamps,
            charset: 'utf8',
            collate: 'utf8_unicode_ci',
        });
    }
    async syncModel() {
        await this.model.sync();
    }
    async logMigration({ name: migrationName }) {
        await this.syncModel();
        await this.model.create({
            [this.columnName]: migrationName,
        });
    }
    async unlogMigration({ name: migrationName }) {
        await this.syncModel();
        await this.model.destroy({
            where: {
                [this.columnName]: migrationName,
            },
        });
    }
    async executed() {
        await this.syncModel();
        const migrations = await this.model.findAll({ order: [[this.columnName, 'ASC']] });
        return migrations.map(migration => {
            const name = migration[this.columnName];
            if (typeof name !== 'string') {
                throw new TypeError(`Unexpected migration name type: expected string, got ${typeof name}`);
            }
            return name;
        });
    }
    // TODO remove this
    _model() {
        return this.model;
    }
}
exports.SequelizeStorage = SequelizeStorage;
//# sourceMappingURL=sequelize.js.maproot = true

[*]
indent_style = tab
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 150

[CHANGELOG.md]
indent_style = space
indent_size = 2

[*.json]
max_line_length = off

[Makefile]
max_line_length = off
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"lines": 86,
	"statements": 85.93,
	"functions": 82.43,
	"branches": 76.06,
	"exclude": [
		"coverage",
		"test"
	]
}
MIT License

Copyright (c) 2019 Jordan Harband

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 whichBoxedPrimitive = require('which-boxed-primitive');
var callBound = require('call-bind/callBound');
var hasSymbols = require('has-symbols')();
var hasBigInts = require('has-bigints')();

var stringToString = callBound('String.prototype.toString');
var numberValueOf = callBound('Number.prototype.valueOf');
var booleanValueOf = callBound('Boolean.prototype.valueOf');
var symbolValueOf = hasSymbols && callBound('Symbol.prototype.valueOf');
var bigIntValueOf = hasBigInts && callBound('BigInt.prototype.valueOf');

module.exports = function unboxPrimitive(value) {
	var which = whichBoxedPrimitive(value);
	if (typeof which !== 'string') {
		throw new TypeError(which === null ? 'value is an unboxed primitive' : 'value is a non-boxed-primitive object');
	}

	if (which === 'String') {
		return stringToString(value);
	}
	if (which === 'Number') {
		return numberValueOf(value);
	}
	if (which === 'Boolean') {
		return booleanValueOf(value);
	}
	if (which === 'Symbol') {
		if (!hasSymbols) {
			throw new EvalError('somehow this environment does not have Symbols, but you have a boxed Symbol value. Please report this!');
		}
		return symbolValueOf(value);
	}
	if (which === 'BigInt') {
		return bigIntValueOf(value);
	}
	throw new RangeError('unknown boxed primitive found: ' + which);
};
{
  "name": "unbox-primitive",
  "version": "1.0.2",
  "description": "Unbox a boxed JS primitive value.",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/ljharb/unbox-primitive.git"
  },
  "author": "Jordan Harband <ljharb@gmail.com>",
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "license": "MIT",
  "homepage": "https://github.com/ljharb/unbox-primitive#readme",
  "devDependencies": {
    "@ljharb/eslint-config": "^21.0.0",
    "aud": "^2.0.0",
    "auto-changelog": "^2.4.0",
    "eslint": "=8.8.0",
    "for-each": "^0.3.3",
    "in-publish": "^2.0.1",
    "nyc": "^10.3.2",
    "object-inspect": "^1.12.0",
    "object-is": "^1.1.5",
    "safe-publish-latest": "^2.0.0",
    "tape": "^5.5.3"
  },
  "dependencies": {
    "call-bind": "^1.0.2",
    "has-bigints": "^1.0.2",
    "has-symbols": "^1.0.3",
    "which-boxed-primitive": "^1.0.2"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false,
    "hideCredit": true
  }
}# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/unbox-primitive
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
Copyright npm, Inc

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.
'use strict'
var path = require('path')

var uniqueSlug = require('unique-slug')

module.exports = function (filepath, prefix, uniq) {
  return path.join(filepath, (prefix ? prefix + '-' : '') + uniqueSlug(uniq))
}
{
  "name": "unique-filename",
  "version": "1.1.1",
  "description": "Generate a unique filename for use in temporary directories or caches.",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "https://github.com/iarna/unique-filename.git"
  },
  "author": "Rebecca Turner <me@re-becca.org> (http://re-becca.org/)",
  "license": "ISC",
  "homepage": "https://github.com/iarna/unique-filename",
  "devDependencies": {
    "standard": "^5.4.1",
    "tap": "^2.3.1"
  },
  "dependencies": {
    "unique-slug": "^2.0.0"
  }
}body, html {
    margin:0; padding: 0;
}
body {
    font-family: Helvetica Neue, Helvetica,Arial;
    font-size: 10pt;
}
div.header, div.footer {
    background: #eee;
    padding: 1em;
}
div.header {
    z-index: 100;
    position: fixed;
    top: 0;
    border-bottom: 1px solid #666;
    width: 100%;
}
div.footer {
    border-top: 1px solid #666;
}
div.body {
    margin-top: 10em;
}
div.meta {
    font-size: 90%;
    text-align: center;
}
h1, h2, h3 {
    font-weight: normal;
}
h1 {
    font-size: 12pt;
}
h2 {
    font-size: 10pt;
}
pre {
    font-family: Consolas, Menlo, Monaco, monospace;
    margin: 0;
    padding: 0;
    line-height: 1.3;
    font-size: 14px;
    -moz-tab-size: 2;
    -o-tab-size:  2;
    tab-size: 2;
}

div.path { font-size: 110%; }
div.path a:link, div.path a:visited { color: #000; }
table.coverage { border-collapse: collapse; margin:0; padding: 0 }

table.coverage td {
    margin: 0;
    padding: 0;
    color: #111;
    vertical-align: top;
}
table.coverage td.line-count {
    width: 50px;
    text-align: right;
    padding-right: 5px;
}
table.coverage td.line-coverage {
    color: #777 !important;
    text-align: right;
    border-left: 1px solid #666;
    border-right: 1px solid #666;
}

table.coverage td.text {
}

table.coverage td span.cline-any {
    display: inline-block;
    padding: 0 5px;
    width: 40px;
}
table.coverage td span.cline-neutral {
    background: #eee;
}
table.coverage td span.cline-yes {
    background: #b5d592;
    color: #999;
}
table.coverage td span.cline-no {
    background: #fc8c84;
}

.cstat-yes { color: #111; }
.cstat-no { background: #fc8c84; color: #111; }
.fstat-no { background: #ffc520; color: #111 !important; }
.cbranch-no { background:  yellow !important; color: #111; }

.cstat-skip { background: #ddd; color: #111; }
.fstat-skip { background: #ddd; color: #111 !important; }
.cbranch-skip { background: #ddd !important; color: #111; }

.missing-if-branch {
    display: inline-block;
    margin-right: 10px;
    position: relative;
    padding: 0 4px;
    background: black;
    color: yellow;
}

.skip-if-branch {
    display: none;
    margin-right: 10px;
    position: relative;
    padding: 0 4px;
    background: #ccc;
    color: white;
}

.missing-if-branch .typ, .skip-if-branch .typ {
    color: inherit !important;
}

.entity, .metric { font-weight: bold; }
.metric { display: inline-block; border: 1px solid #333; padding: 0.3em; background: white; }
.metric small { font-size: 80%; font-weight: normal; color: #666; }

div.coverage-summary table { border-collapse: collapse; margin: 3em; font-size: 110%; }
div.coverage-summary td, div.coverage-summary table  th { margin: 0; padding: 0.25em 1em; border-top: 1px solid #666; border-bottom: 1px solid #666; }
div.coverage-summary th { text-align: left; border: 1px solid #666; background: #eee; font-weight: normal; }
div.coverage-summary th.file { border-right: none !important; }
div.coverage-summary th.pic { border-left: none !important; text-align: right; }
div.coverage-summary th.pct { border-right: none !important; }
div.coverage-summary th.abs { border-left: none !important; text-align: right; }
div.coverage-summary td.pct { text-align: right; border-left: 1px solid #666; }
div.coverage-summary td.abs { text-align: right; font-size: 90%; color: #444; border-right: 1px solid #666; }
div.coverage-summary td.file { border-left: 1px solid #666; white-space: nowrap;  }
div.coverage-summary td.pic { min-width: 120px !important;  }
div.coverage-summary a:link { text-decoration: none; color: #000; }
div.coverage-summary a:visited { text-decoration: none; color: #777; }
div.coverage-summary a:hover { text-decoration: underline; }
div.coverage-summary tfoot td { border-top: 1px solid #666; }

div.coverage-summary .sorter {
    height: 10px;
    width: 7px;
    display: inline-block;
    margin-left: 0.5em;
    background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
}
div.coverage-summary .sorted .sorter {
    background-position: 0 -20px;
}
div.coverage-summary .sorted-desc .sorter {
    background-position: 0 -10px;
}

.high { background: #b5d592 !important; }
.medium { background: #ffe87c !important; }
.low { background: #fc8c84 !important; }

span.cover-fill, span.cover-empty {
    display:inline-block;
    border:1px solid #444;
    background: white;
    height: 12px;
}
span.cover-fill {
    background: #ccc;
    border-right: 1px solid #444;
}
span.cover-empty {
    background: white;
    border-left: none;
}
span.cover-full {
    border-right: none !important;
}
pre.prettyprint {
    border: none !important;
    padding: 0 !important;
    margin: 0 !important;
}
.com { color: #999 !important; }
.ignore-none { color: #999; font-weight: normal; }
<!doctype html>
<html lang="en">
<head>
    <title>Code coverage report for All files</title>
    <meta charset="utf-8">
    <link rel="stylesheet" href="prettify.css">
    <link rel="stylesheet" href="base.css">
    <style type='text/css'>
        div.coverage-summary .sorter {
            background-image: url(sort-arrow-sprite.png);
        }
    </style>
</head>
<body>
<div class="header high">
    <h1>Code coverage report for <span class="entity">All files</span></h1>
    <h2>
        Statements: <span class="metric">100% <small>(4 / 4)</small></span> &nbsp;&nbsp;&nbsp;&nbsp;
        Branches: <span class="metric">100% <small>(2 / 2)</small></span> &nbsp;&nbsp;&nbsp;&nbsp;
        Functions: <span class="metric">100% <small>(1 / 1)</small></span> &nbsp;&nbsp;&nbsp;&nbsp;
        Lines: <span class="metric">100% <small>(4 / 4)</small></span> &nbsp;&nbsp;&nbsp;&nbsp;
        Ignored: <span class="metric"><span class="ignore-none">none</span></span> &nbsp;&nbsp;&nbsp;&nbsp;
    </h2>
    <div class="path"></div>
</div>
<div class="body">
<div class="coverage-summary">
<table>
<thead>
<tr>
   <th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
   <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
   <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
   <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
   <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
   <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
   <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
   <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
   <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
   <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
	<td class="file high" data-value="__root__/"><a href="__root__/index.html">__root__/</a></td>
	<td data-value="100" class="pic high"><span class="cover-fill cover-full" style="width: 100px;"></span><span class="cover-empty" style="width:0px;"></span></td>
	<td data-value="100" class="pct high">100%</td>
	<td data-value="4" class="abs high">(4&nbsp;/&nbsp;4)</td>
	<td data-value="100" class="pct high">100%</td>
	<td data-value="2" class="abs high">(2&nbsp;/&nbsp;2)</td>
	<td data-value="100" class="pct high">100%</td>
	<td data-value="1" class="abs high">(1&nbsp;/&nbsp;1)</td>
	<td data-value="100" class="pct high">100%</td>
	<td data-value="4" class="abs high">(4&nbsp;/&nbsp;4)</td>
	</tr>

</tbody>
</table>
</div>
</div>
<div class="footer">
    <div class="meta">Generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Thu Dec 03 2015 15:00:03 GMT-0800 (PST)</div>
</div>
<script src="prettify.js"></script>
<script>
window.onload = function () {
        if (typeof prettyPrint === 'function') {
            prettyPrint();
        }
};
</script>
<script src="sorter.js"></script>
</body>
</html>
.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}
window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.ignoreCase){ac=true}else{if(/[a-z]/i.test(ae.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi,""))){S=true;ac=false;break}}}var Y={b:8,t:9,n:10,v:11,f:12,r:13};function ab(ah){var ag=ah.charCodeAt(0);if(ag!==92){return ag}var af=ah.charAt(1);ag=Y[af];if(ag){return ag}else{if("0"<=af&&af<="7"){return parseInt(ah.substring(1),8)}else{if(af==="u"||af==="x"){return parseInt(ah.substring(2),16)}else{return ah.charCodeAt(1)}}}}function T(af){if(af<32){return(af<16?"\\x0":"\\x")+af.toString(16)}var ag=String.fromCharCode(af);if(ag==="\\"||ag==="-"||ag==="["||ag==="]"){ag="\\"+ag}return ag}function X(am){var aq=am.substring(1,am.length-1).match(new RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));var ak=[];var af=[];var ao=aq[0]==="^";for(var ar=ao?1:0,aj=aq.length;ar<aj;++ar){var ah=aq[ar];if(/\\[bdsw]/i.test(ah)){ak.push(ah)}else{var ag=ab(ah);var al;if(ar+2<aj&&"-"===aq[ar+1]){al=ab(aq[ar+2]);ar+=2}else{al=ag}af.push([ag,al]);if(!(al<65||ag>122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;ar<af.length;++ar){var at=af[ar];if(at[0]<=ap[1]+1){ap[1]=Math.max(ap[1],at[1])}else{ai.push(ap=at)}}var an=["["];if(ao){an.push("^")}an.push.apply(an,ak);for(var ar=0;ar<ai.length;++ar){var at=ai[ar];an.push(T(at[0]));if(at[1]>at[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){an[af]=-1}}}}for(var ak=1;ak<an.length;++ak){if(-1===an[ak]){an[ak]=++ad}}for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am;if(an[am]===undefined){aj[ak]="(?:"}}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){aj[ak]="\\"+an[am]}}}}for(var ak=0,am=0;ak<ah;++ak){if("^"===aj[ak]&&"^"!==aj[ak+1]){aj[ak]=""}}if(al.ignoreCase&&S){for(var ak=0;ak<ah;++ak){var ag=aj[ak];var ai=ag.charAt(0);if(ag.length>=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.global||ae.multiline){throw new Error(""+ae)}aa.push("(?:"+W(ae)+")")}return new RegExp(aa.join("|"),ac?"gi":"g")}function a(V){var U=/(?:^|\s)nocode(?:\s|$)/;var X=[];var T=0;var Z=[];var W=0;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=document.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Y=S&&"pre"===S.substring(0,3);function aa(ab){switch(ab.nodeType){case 1:if(U.test(ab.className)){return}for(var ae=ab.firstChild;ae;ae=ae.nextSibling){aa(ae)}var ad=ab.nodeName;if("BR"===ad||"LI"===ad){X[W]="\n";Z[W<<1]=T++;Z[(W++<<1)|1]=ab}break;case 3:case 4:var ac=ab.nodeValue;if(ac.length){if(!Y){ac=ac.replace(/[ \t\r\n]+/g," ")}else{ac=ac.replace(/\r\n?/g,"\n")}X[W]=ac;Z[W<<1]=T;T+=ac.length;Z[(W++<<1)|1]=ab}break}}aa(V);return{sourceCode:X.join("").replace(/\n$/,""),spans:Z}}function B(S,U,W,T){if(!U){return}var V={sourceCode:U,basePos:S};W(V);T.push.apply(T,V.decorations)}var v=/\S/;function o(S){var V=undefined;for(var U=S.firstChild;U;U=U.nextSibling){var T=U.nodeType;V=(T===1)?(V?S:U):(T===3)?(v.test(U.nodeValue)?S:V):V}return V===S?undefined:V}function g(U,T){var S={};var V;(function(){var ad=U.concat(T);var ah=[];var ag={};for(var ab=0,Z=ad.length;ab<Z;++ab){var Y=ad[ab];var ac=Y[3];if(ac){for(var ae=ac.length;--ae>=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae<aq;++ae){var ag=an[ae];var ap=aj[ag];var ai=void 0;var am;if(typeof ap==="string"){am=false}else{var aa=S[ag.charAt(0)];if(aa){ai=ag.match(aa[1]);ap=aa[0]}else{for(var ao=0;ao<X;++ao){aa=T[ao];ai=ag.match(aa[1]);if(ai){ap=aa[0];break}}if(!ai){ap=F}}am=ap.length>=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y<W.length;++Y){ae(W[Y])}if(ag===(ag|0)){W[0].setAttribute("value",ag)}var aa=ac.createElement("OL");aa.className="linenums";var X=Math.max(0,((ag-1))|0)||0;for(var Y=0,T=W.length;Y<T;++Y){af=W[Y];af.className="L"+((Y+X)%10);if(!af.firstChild){af.appendChild(ac.createTextNode("\xA0"))}aa.appendChild(af)}V.appendChild(aa)}function D(ac){var aj=/\bMSIE\b/.test(navigator.userAgent);var am=/\n/g;var al=ac.sourceCode;var an=al.length;var V=0;var aa=ac.spans;var T=aa.length;var ah=0;var X=ac.decorations;var Y=X.length;var Z=0;X[Y]=an;var ar,aq;for(aq=ar=0;aq<Y;){if(X[aq]!==X[aq+2]){X[ar++]=X[aq++];X[ar++]=X[aq++]}else{aq+=2}}Y=ar;for(aq=ar=0;aq<Y;){var at=X[aq];var ab=X[aq+1];var W=aq+2;while(W+2<=Y&&X[W+1]===ab){W+=2}X[ar++]=at;X[ar++]=ab;aq=W}Y=X.length=ar;var ae=null;while(ah<T){var af=aa[ah];var S=aa[ah+2]||an;var ag=X[Z];var ap=X[Z+2]||an;var W=Math.min(S,ap);var ak=aa[ah+1];var U;if(ak.nodeType!==1&&(U=al.substring(V,W))){if(aj){U=U.replace(am,"\r")}ak.nodeValue=U;var ai=ak.ownerDocument;var ao=ai.createElement("SPAN");ao.className=X[Z+1];var ad=ak.parentNode;ad.replaceChild(ao,ak);ao.appendChild(ak);if(V<S){aa[ah+1]=ak=ai.createTextNode(al.substring(W,S));ad.insertBefore(ak,ao.nextSibling)}}V=W;if(V>=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*</.test(S)?"default-markup":"default-code"}return t[T]}c(K,["default-code"]);c(g([],[[F,/^[^<?]+/],[E,/^<!\w[^>]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa<ac.length;++aa){for(var Z=0,V=ac[aa].length;Z<V;++Z){T.push(ac[aa][Z])}}ac=null;var W=Date;if(!W.now){W={now:function(){return +(new Date)}}}var X=0;var S;var ab=/\blang(?:uage)?-([\w.]+)(?!\S)/;var ae=/\bprettyprint\b/;function U(){var ag=(window.PR_SHOULD_USE_CONTINUATION?W.now()+250:Infinity);for(;X<T.length&&W.now()<ag;X++){var aj=T[X];var ai=aj.className;if(ai.indexOf("prettyprint")>=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X<T.length){setTimeout(U,250)}else{if(ad){ad()}}}U()}window.prettyPrintOne=y;window.prettyPrint=b;window.PR={createSimpleLexer:g,registerLangHandler:c,sourceDecorator:i,PR_ATTRIB_NAME:P,PR_ATTRIB_VALUE:n,PR_COMMENT:j,PR_DECLARATION:E,PR_KEYWORD:z,PR_LITERAL:G,PR_NOCODE:N,PR_PLAIN:F,PR_PUNCTUATION:L,PR_SOURCE:J,PR_STRING:C,PR_TAG:m,PR_TYPE:O}})();PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_DECLARATION,/^<!\w[^>]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^<script\b[^>]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:<!--|-->)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]);
PNG

   IHDR         F3   tEXtSoftware Adobe ImageReadyqe<   sIDATxڼRA De[
HfFXgf3DdFw-˘
 ngM+OVں=""/ĥ'Y?HhV @p  Y8Bwc,    IENDB`var addSorting = (function () {
    "use strict";
    var cols,
        currentSort = {
            index: 0,
            desc: false
        };

    // returns the summary table element
    function getTable() { return document.querySelector('.coverage-summary table'); }
    // returns the thead element of the summary table
    function getTableHeader() { return getTable().querySelector('thead tr'); }
    // returns the tbody element of the summary table
    function getTableBody() { return getTable().querySelector('tbody'); }
    // returns the th element for nth column
    function getNthColumn(n) { return getTableHeader().querySelectorAll('th')[n]; }

    // loads all columns
    function loadColumns() {
        var colNodes = getTableHeader().querySelectorAll('th'),
            colNode,
            cols = [],
            col,
            i;

        for (i = 0; i < colNodes.length; i += 1) {
            colNode = colNodes[i];
            col = {
                key: colNode.getAttribute('data-col'),
                sortable: !colNode.getAttribute('data-nosort'),
                type: colNode.getAttribute('data-type') || 'string'
            };
            cols.push(col);
            if (col.sortable) {
                col.defaultDescSort = col.type === 'number';
                colNode.innerHTML = colNode.innerHTML + '<span class="sorter"></span>';
            }
        }
        return cols;
    }
    // attaches a data attribute to every tr element with an object
    // of data values keyed by column name
    function loadRowData(tableRow) {
        var tableCols = tableRow.querySelectorAll('td'),
            colNode,
            col,
            data = {},
            i,
            val;
        for (i = 0; i < tableCols.length; i += 1) {
            colNode = tableCols[i];
            col = cols[i];
            val = colNode.getAttribute('data-value');
            if (col.type === 'number') {
                val = Number(val);
            }
            data[col.key] = val;
        }
        return data;
    }
    // loads all row data
    function loadData() {
        var rows = getTableBody().querySelectorAll('tr'),
            i;

        for (i = 0; i < rows.length; i += 1) {
            rows[i].data = loadRowData(rows[i]);
        }
    }
    // sorts the table using the data for the ith column
    function sortByIndex(index, desc) {
        var key = cols[index].key,
            sorter = function (a, b) {
                a = a.data[key];
                b = b.data[key];
                return a < b ? -1 : a > b ? 1 : 0;
            },
            finalSorter = sorter,
            tableBody = document.querySelector('.coverage-summary tbody'),
            rowNodes = tableBody.querySelectorAll('tr'),
            rows = [],
            i;

        if (desc) {
            finalSorter = function (a, b) {
                return -1 * sorter(a, b);
            };
        }

        for (i = 0; i < rowNodes.length; i += 1) {
            rows.push(rowNodes[i]);
            tableBody.removeChild(rowNodes[i]);
        }

        rows.sort(finalSorter);

        for (i = 0; i < rows.length; i += 1) {
            tableBody.appendChild(rows[i]);
        }
    }
    // removes sort indicators for current column being sorted
    function removeSortIndicators() {
        var col = getNthColumn(currentSort.index),
            cls = col.className;

        cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, '');
        col.className = cls;
    }
    // adds sort indicators for current column being sorted
    function addSortIndicators() {
        getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted';
    }
    // adds event listeners for all sorter widgets
    function enableUI() {
        var i,
            el,
            ithSorter = function ithSorter(i) {
                var col = cols[i];

                return function () {
                    var desc = col.defaultDescSort;

                    if (currentSort.index === i) {
                        desc = !currentSort.desc;
                    }
                    sortByIndex(i, desc);
                    removeSortIndicators();
                    currentSort.index = i;
                    currentSort.desc = desc;
                    addSortIndicators();
                };
            };
        for (i =0 ; i < cols.length; i += 1) {
            if (cols[i].sortable) {
                el = getNthColumn(i).querySelector('.sorter');
                if (el.addEventListener) {
                    el.addEventListener('click', ithSorter(i));
                } else {
                    el.attachEvent('onclick', ithSorter(i));
                }
            }
        }
    }
    // adds sorting functionality to the UI
    return function () {
        if (!getTable()) {
            return;
        }
        cols = loadColumns();
        loadData(cols);
        addSortIndicators();
        enableUI();
    };
})();

window.addEventListener('load', addSorting);
<!doctype html>
<html lang="en">
<head>
    <title>Code coverage report for __root__/</title>
    <meta charset="utf-8">
    <link rel="stylesheet" href="../prettify.css">
    <link rel="stylesheet" href="../base.css">
    <style type='text/css'>
        div.coverage-summary .sorter {
            background-image: url(../sort-arrow-sprite.png);
        }
    </style>
</head>
<body>
<div class="header high">
    <h1>Code coverage report for <span class="entity">__root__/</span></h1>
    <h2>
        Statements: <span class="metric">100% <small>(4 / 4)</small></span> &nbsp;&nbsp;&nbsp;&nbsp;
        Branches: <span class="metric">100% <small>(2 / 2)</small></span> &nbsp;&nbsp;&nbsp;&nbsp;
        Functions: <span class="metric">100% <small>(1 / 1)</small></span> &nbsp;&nbsp;&nbsp;&nbsp;
        Lines: <span class="metric">100% <small>(4 / 4)</small></span> &nbsp;&nbsp;&nbsp;&nbsp;
        Ignored: <span class="metric"><span class="ignore-none">none</span></span> &nbsp;&nbsp;&nbsp;&nbsp;
    </h2>
    <div class="path"><a href="../index.html">All files</a> &#187; __root__/</div>
</div>
<div class="body">
<div class="coverage-summary">
<table>
<thead>
<tr>
   <th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
   <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
   <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
   <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
   <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
   <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
   <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
   <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
   <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
   <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
	<td class="file high" data-value="index.js"><a href="index.js.html">index.js</a></td>
	<td data-value="100" class="pic high"><span class="cover-fill cover-full" style="width: 100px;"></span><span class="cover-empty" style="width:0px;"></span></td>
	<td data-value="100" class="pct high">100%</td>
	<td data-value="4" class="abs high">(4&nbsp;/&nbsp;4)</td>
	<td data-value="100" class="pct high">100%</td>
	<td data-value="2" class="abs high">(2&nbsp;/&nbsp;2)</td>
	<td data-value="100" class="pct high">100%</td>
	<td data-value="1" class="abs high">(1&nbsp;/&nbsp;1)</td>
	<td data-value="100" class="pct high">100%</td>
	<td data-value="4" class="abs high">(4&nbsp;/&nbsp;4)</td>
	</tr>

</tbody>
</table>
</div>
</div>
<div class="footer">
    <div class="meta">Generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Thu Dec 03 2015 15:00:03 GMT-0800 (PST)</div>
</div>
<script src="../prettify.js"></script>
<script>
window.onload = function () {
        if (typeof prettyPrint === 'function') {
            prettyPrint();
        }
};
</script>
<script src="../sorter.js"></script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
    <title>Code coverage report for index.js</title>
    <meta charset="utf-8">
    <link rel="stylesheet" href="../prettify.css">
    <link rel="stylesheet" href="../base.css">
    <style type='text/css'>
        div.coverage-summary .sorter {
            background-image: url(../sort-arrow-sprite.png);
        }
    </style>
</head>
<body>
<div class="header high">
    <h1>Code coverage report for <span class="entity">index.js</span></h1>
    <h2>
        Statements: <span class="metric">100% <small>(4 / 4)</small></span> &nbsp;&nbsp;&nbsp;&nbsp;
        Branches: <span class="metric">100% <small>(2 / 2)</small></span> &nbsp;&nbsp;&nbsp;&nbsp;
        Functions: <span class="metric">100% <small>(1 / 1)</small></span> &nbsp;&nbsp;&nbsp;&nbsp;
        Lines: <span class="metric">100% <small>(4 / 4)</small></span> &nbsp;&nbsp;&nbsp;&nbsp;
        Ignored: <span class="metric"><span class="ignore-none">none</span></span> &nbsp;&nbsp;&nbsp;&nbsp;
    </h2>
    <div class="path"><a href="../index.html">All files</a> &#187; <a href="index.html">__root__/</a> &#187; index.js</div>
</div>
<div class="body">
<pre><table class="coverage">
<tr><td class="line-count">1
2
3
4
5
6
7
8
9</td><td class="line-coverage"><span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1</span>
<span class="cline-any cline-yes">6</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">'use strict'
var path = require('path')
&nbsp;
var uniqueSlug = require('unique-slug')
&nbsp;
module.exports = function (filepath, prefix, uniq) {
  return path.join(filepath, (prefix ? prefix + '-' : '') + uniqueSlug(uniq))
}
&nbsp;</pre></td></tr>
</table></pre>

</div>
<div class="footer">
    <div class="meta">Generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Thu Dec 03 2015 15:00:03 GMT-0800 (PST)</div>
</div>
<script src="../prettify.js"></script>
<script>
window.onload = function () {
        if (typeof prettyPrint === 'function') {
            prettyPrint();
        }
};
</script>
<script src="../sorter.js"></script>
</body>
</html>
The ISC License

Copyright npm, Inc

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.
'use strict'
var MurmurHash3 = require('imurmurhash')

module.exports = function (uniq) {
  if (uniq) {
    var hash = new MurmurHash3(uniq)
    return ('00000000' + hash.result().toString(16)).substr(-8)
  } else {
    return (Math.random().toString(16) + '0000000').substr(2, 8)
  }
}
{
  "name": "unique-slug",
  "version": "2.0.2",
  "description": "Generate a unique character string suitible for use in files and URLs.",
  "main": "index.js",
  "author": "Rebecca Turner <me@re-becca.org> (http://re-becca.org)",
  "license": "ISC",
  "devDependencies": {
    "standard": "^12.0.1",
    "tap": "^12.7.0"
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/iarna/unique-slug.git"
  },
  "dependencies": {
    "imurmurhash": "^0.1.4"
  }
}(The MIT License)

Copyright (c) 2017, Ryan Zimmerman <opensrc@ryanzim.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.
'use strict'

exports.fromCallback = function (fn) {
  return Object.defineProperty(function (...args) {
    if (typeof args[args.length - 1] === 'function') fn.apply(this, args)
    else {
      return new Promise((resolve, reject) => {
        fn.call(
          this,
          ...args,
          (err, res) => (err != null) ? reject(err) : resolve(res)
        )
      })
    }
  }, 'name', { value: fn.name })
}

exports.fromPromise = function (fn) {
  return Object.defineProperty(function (...args) {
    const cb = args[args.length - 1]
    if (typeof cb !== 'function') return fn.apply(this, args)
    else fn.apply(this, args.slice(0, -1)).then(r => cb(null, r), cb)
  }, 'name', { value: fn.name })
}
{
  "name": "universalify",
  "version": "2.0.0",
  "description": "Make a callback- or promise-based function support both promises and callbacks.",
  "homepage": "https://github.com/RyanZim/universalify#readme",
  "license": "MIT",
  "author": "Ryan Zimmerman <opensrc@ryanzim.com>",
  "files": [
    "index.js"
  ],
  "repository": {
    "type": "git",
    "url": "git+https://github.com/RyanZim/universalify.git"
  },
  "devDependencies": {
    "colortape": "^0.1.2",
    "coveralls": "^3.0.1",
    "nyc": "^15.0.0",
    "standard": "^14.3.1",
    "tape": "^5.0.1"
  },
  "engines": {
    "node": ">= 10.0.0"
  }
}1.0.0 / 2015-06-14
==================

  * Initial release
(The MIT License)

Copyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.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.
/*!
 * unpipe
 * Copyright(c) 2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module exports.
 * @public
 */

module.exports = unpipe

/**
 * Determine if there are Node.js pipe-like data listeners.
 * @private
 */

function hasPipeDataListeners(stream) {
  var listeners = stream.listeners('data')

  for (var i = 0; i < listeners.length; i++) {
    if (listeners[i].name === 'ondata') {
      return true
    }
  }

  return false
}

/**
 * Unpipe a stream from all destinations.
 *
 * @param {object} stream
 * @public
 */

function unpipe(stream) {
  if (!stream) {
    throw new TypeError('argument stream is required')
  }

  if (typeof stream.unpipe === 'function') {
    // new-style
    stream.unpipe()
    return
  }

  // Node.js 0.8 hack
  if (!hasPipeDataListeners(stream)) {
    return
  }

  var listener
  var listeners = stream.listeners('close')

  for (var i = 0; i < listeners.length; i++) {
    listener = listeners[i]

    if (listener.name !== 'cleanup' && listener.name !== 'onclose') {
      continue
    }

    // invoke the listener
    listener.call(stream)
  }
}
{
  "name": "unpipe",
  "description": "Unpipe a stream from all destinations",
  "version": "1.0.0",
  "author": "Douglas Christopher Wilson <doug@somethingdoug.com>",
  "license": "MIT",
  "repository": "stream-utils/unpipe",
  "devDependencies": {
    "istanbul": "0.3.15",
    "mocha": "2.2.5",
    "readable-stream": "1.1.13"
  },
  "files": [
    "HISTORY.md",
    "LICENSE",
    "README.md",
    "index.js"
  ],
  "engines": {
    "node": ">= 0.8"
  }
}
1.0.2 / 2015-10-07
==================

  * use try/catch when checking `localStorage` (#3, @kumavis)

1.0.1 / 2014-11-25
==================

  * browser: use `console.warn()` for deprecation calls
  * browser: more jsdocs

1.0.0 / 2014-04-30
==================

  * initial commit
(The MIT License)

Copyright (c) 2014 Nathan Rajlich <nathan@tootallnate.net>

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.

/**
 * Module exports.
 */

module.exports = deprecate;

/**
 * Mark that a method should not be used.
 * Returns a modified function which warns once by default.
 *
 * If `localStorage.noDeprecation = true` is set, then it is a no-op.
 *
 * If `localStorage.throwDeprecation = true` is set, then deprecated functions
 * will throw an Error when invoked.
 *
 * If `localStorage.traceDeprecation = true` is set, then deprecated functions
 * will invoke `console.trace()` instead of `console.error()`.
 *
 * @param {Function} fn - the function to deprecate
 * @param {String} msg - the string to print to the console when `fn` is invoked
 * @returns {Function} a new "deprecated" version of `fn`
 * @api public
 */

function deprecate (fn, msg) {
  if (config('noDeprecation')) {
    return fn;
  }

  var warned = false;
  function deprecated() {
    if (!warned) {
      if (config('throwDeprecation')) {
        throw new Error(msg);
      } else if (config('traceDeprecation')) {
        console.trace(msg);
      } else {
        console.warn(msg);
      }
      warned = true;
    }
    return fn.apply(this, arguments);
  }

  return deprecated;
}

/**
 * Checks `localStorage` for boolean values for the given `name`.
 *
 * @param {String} name
 * @returns {Boolean}
 * @api private
 */

function config (name) {
  // accessing global.localStorage can trigger a DOMException in sandboxed iframes
  try {
    if (!global.localStorage) return false;
  } catch (_) {
    return false;
  }
  var val = global.localStorage[name];
  if (null == val) return false;
  return String(val).toLowerCase() === 'true';
}

/**
 * For Node.js, simply re-export the core `util.deprecate` function.
 */

module.exports = require('util').deprecate;
{
  "name": "util-deprecate",
  "version": "1.0.2",
  "description": "The Node.js `util.deprecate()` function with browser support",
  "main": "node.js",
  "browser": "browser.js",
  "repository": {
    "type": "git",
    "url": "git://github.com/TooTallNate/util-deprecate.git"
  },
  "author": "Nathan Rajlich <nathan@tootallnate.net> (http://n8.io/)",
  "license": "MIT",
  "homepage": "https://github.com/TooTallNate/util-deprecate"
}The MIT License (MIT)

Copyright (c) 2013-2017 Jared Hanson

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.
/**
 * Merge object b with object a.
 *
 *     var a = { foo: 'bar' }
 *       , b = { bar: 'baz' };
 *
 *     merge(a, b);
 *     // => { foo: 'bar', bar: 'baz' }
 *
 * @param {Object} a
 * @param {Object} b
 * @return {Object}
 * @api public
 */

exports = module.exports = function(a, b){
  if (a && b) {
    for (var key in b) {
      a[key] = b[key];
    }
  }
  return a;
};
{
  "name": "utils-merge",
  "version": "1.0.1",
  "description": "merge() utility function",
  "author": {
    "name": "Jared Hanson",
    "email": "jaredhanson@gmail.com",
    "url": "http://www.jaredhanson.net/"
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/jaredhanson/utils-merge.git"
  },
  "license": "MIT",
  "licenses": [
    {
      "type": "MIT",
      "url": "http://opensource.org/licenses/MIT"
    }
  ],
  "main": "./index",
  "dependencies": {},
  "devDependencies": {
    "make-node": "0.3.x",
    "mocha": "1.x.x",
    "chai": "1.x.x"
  },
  "engines": {
    "node": ">= 0.4.0"
  }
}# Contributing

Please feel free to file GitHub Issues or propose Pull Requests. We're always happy to discuss improvements to this library!

## Testing

```shell
npm test
```

## Releasing

Releases are supposed to be done from master, version bumping is automated through [`standard-version`](https://github.com/conventional-changelog/standard-version):

```shell
npm run release -- --dry-run  # verify output manually
npm run release               # follow the instructions from the output of this command
```
The MIT License (MIT)

Copyright (c) 2010-2020 Robert Kieffer and other contributors

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

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

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "name": "uuid",
  "version": "9.0.0",
  "description": "RFC4122 (v1, v4, and v5) UUIDs",
  "commitlint": {
    "extends": [
      "@commitlint/config-conventional"
    ]
  },
  "license": "MIT",
  "bin": {
    "uuid": "./dist/bin/uuid"
  },
  "sideEffects": false,
  "main": "./dist/index.js",
  "exports": {
    ".": {
      "node": {
        "module": "./dist/esm-node/index.js",
        "require": "./dist/index.js",
        "import": "./wrapper.mjs"
      },
      "browser": {
        "import": "./dist/esm-browser/index.js",
        "require": "./dist/commonjs-browser/index.js"
      },
      "default": "./dist/esm-browser/index.js"
    },
    "./package.json": "./package.json"
  },
  "module": "./dist/esm-node/index.js",
  "browser": {
    "./dist/md5.js": "./dist/md5-browser.js",
    "./dist/native.js": "./dist/native-browser.js",
    "./dist/rng.js": "./dist/rng-browser.js",
    "./dist/sha1.js": "./dist/sha1-browser.js",
    "./dist/esm-node/index.js": "./dist/esm-browser/index.js"
  },
  "files": [
    "CHANGELOG.md",
    "CONTRIBUTING.md",
    "LICENSE.md",
    "README.md",
    "dist",
    "wrapper.mjs"
  ],
  "devDependencies": {
    "@babel/cli": "7.18.10",
    "@babel/core": "7.18.10",
    "@babel/eslint-parser": "7.18.9",
    "@babel/preset-env": "7.18.10",
    "@commitlint/cli": "17.0.3",
    "@commitlint/config-conventional": "17.0.3",
    "bundlewatch": "0.3.3",
    "eslint": "8.21.0",
    "eslint-config-prettier": "8.5.0",
    "eslint-config-standard": "17.0.0",
    "eslint-plugin-import": "2.26.0",
    "eslint-plugin-node": "11.1.0",
    "eslint-plugin-prettier": "4.2.1",
    "eslint-plugin-promise": "6.0.0",
    "husky": "8.0.1",
    "jest": "28.1.3",
    "lint-staged": "13.0.3",
    "npm-run-all": "4.1.5",
    "optional-dev-dependency": "2.0.1",
    "prettier": "2.7.1",
    "random-seed": "0.3.0",
    "runmd": "1.3.6",
    "standard-version": "9.5.0"
  },
  "optionalDevDependencies": {
    "@wdio/browserstack-service": "7.16.10",
    "@wdio/cli": "7.16.10",
    "@wdio/jasmine-framework": "7.16.6",
    "@wdio/local-runner": "7.16.10",
    "@wdio/spec-reporter": "7.16.9",
    "@wdio/static-server-service": "7.16.6"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/uuidjs/uuid.git"
  },
  "lint-staged": {
    "*.{js,jsx,json,md}": [
      "prettier --write"
    ],
    "*.{js,jsx}": [
      "eslint --fix"
    ]
  },
  "standard-version": {
    "scripts": {
      "postchangelog": "prettier --write CHANGELOG.md"
    }
  }
}import uuid from './dist/index.js';
export const v1 = uuid.v1;
export const v3 = uuid.v3;
export const v4 = uuid.v4;
export const v5 = uuid.v5;
export const NIL = uuid.NIL;
export const version = uuid.version;
export const validate = uuid.validate;
export const stringify = uuid.stringify;
export const parse = uuid.parse;
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
Object.defineProperty(exports, "NIL", {
  enumerable: true,
  get: function () {
    return _nil.default;
  }
});
Object.defineProperty(exports, "parse", {
  enumerable: true,
  get: function () {
    return _parse.default;
  }
});
Object.defineProperty(exports, "stringify", {
  enumerable: true,
  get: function () {
    return _stringify.default;
  }
});
Object.defineProperty(exports, "v1", {
  enumerable: true,
  get: function () {
    return _v.default;
  }
});
Object.defineProperty(exports, "v3", {
  enumerable: true,
  get: function () {
    return _v2.default;
  }
});
Object.defineProperty(exports, "v4", {
  enumerable: true,
  get: function () {
    return _v3.default;
  }
});
Object.defineProperty(exports, "v5", {
  enumerable: true,
  get: function () {
    return _v4.default;
  }
});
Object.defineProperty(exports, "validate", {
  enumerable: true,
  get: function () {
    return _validate.default;
  }
});
Object.defineProperty(exports, "version", {
  enumerable: true,
  get: function () {
    return _version.default;
  }
});

var _v = _interopRequireDefault(require("./v1.js"));

var _v2 = _interopRequireDefault(require("./v3.js"));

var _v3 = _interopRequireDefault(require("./v4.js"));

var _v4 = _interopRequireDefault(require("./v5.js"));

var _nil = _interopRequireDefault(require("./nil.js"));

var _version = _interopRequireDefault(require("./version.js"));

var _validate = _interopRequireDefault(require("./validate.js"));

var _stringify = _interopRequireDefault(require("./stringify.js"));

var _parse = _interopRequireDefault(require("./parse.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/*
 * Browser-compatible JavaScript MD5
 *
 * Modification of JavaScript MD5
 * https://github.com/blueimp/JavaScript-MD5
 *
 * Copyright 2011, Sebastian Tschan
 * https://blueimp.net
 *
 * Licensed under the MIT license:
 * https://opensource.org/licenses/MIT
 *
 * Based on
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 */
function md5(bytes) {
  if (typeof bytes === 'string') {
    const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape

    bytes = new Uint8Array(msg.length);

    for (let i = 0; i < msg.length; ++i) {
      bytes[i] = msg.charCodeAt(i);
    }
  }

  return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));
}
/*
 * Convert an array of little-endian words to an array of bytes
 */


function md5ToHexEncodedArray(input) {
  const output = [];
  const length32 = input.length * 32;
  const hexTab = '0123456789abcdef';

  for (let i = 0; i < length32; i += 8) {
    const x = input[i >> 5] >>> i % 32 & 0xff;
    const hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);
    output.push(hex);
  }

  return output;
}
/**
 * Calculate output length with padding and bit length
 */


function getOutputLength(inputLength8) {
  return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;
}
/*
 * Calculate the MD5 of an array of little-endian words, and a bit length.
 */


function wordsToMd5(x, len) {
  /* append padding */
  x[len >> 5] |= 0x80 << len % 32;
  x[getOutputLength(len) - 1] = len;
  let a = 1732584193;
  let b = -271733879;
  let c = -1732584194;
  let d = 271733878;

  for (let i = 0; i < x.length; i += 16) {
    const olda = a;
    const oldb = b;
    const oldc = c;
    const oldd = d;
    a = md5ff(a, b, c, d, x[i], 7, -680876936);
    d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);
    c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);
    b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
    a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);
    d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
    c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
    b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);
    a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
    d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
    c = md5ff(c, d, a, b, x[i + 10], 17, -42063);
    b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
    a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
    d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);
    c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
    b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
    a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);
    d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
    c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);
    b = md5gg(b, c, d, a, x[i], 20, -373897302);
    a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);
    d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);
    c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);
    b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);
    a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);
    d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
    c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);
    b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
    a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
    d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);
    c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
    b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
    a = md5hh(a, b, c, d, x[i + 5], 4, -378558);
    d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
    c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
    b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);
    a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
    d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
    c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);
    b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
    a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);
    d = md5hh(d, a, b, c, x[i], 11, -358537222);
    c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);
    b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);
    a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);
    d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);
    c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);
    b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);
    a = md5ii(a, b, c, d, x[i], 6, -198630844);
    d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
    c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
    b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);
    a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
    d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
    c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);
    b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
    a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
    d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);
    c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
    b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
    a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);
    d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
    c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);
    b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);
    a = safeAdd(a, olda);
    b = safeAdd(b, oldb);
    c = safeAdd(c, oldc);
    d = safeAdd(d, oldd);
  }

  return [a, b, c, d];
}
/*
 * Convert an array bytes to an array of little-endian words
 * Characters >255 have their high-byte silently ignored.
 */


function bytesToWords(input) {
  if (input.length === 0) {
    return [];
  }

  const length8 = input.length * 8;
  const output = new Uint32Array(getOutputLength(length8));

  for (let i = 0; i < length8; i += 8) {
    output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;
  }

  return output;
}
/*
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
 * to work around bugs in some JS interpreters.
 */


function safeAdd(x, y) {
  const lsw = (x & 0xffff) + (y & 0xffff);
  const msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return msw << 16 | lsw & 0xffff;
}
/*
 * Bitwise rotate a 32-bit number to the left.
 */


function bitRotateLeft(num, cnt) {
  return num << cnt | num >>> 32 - cnt;
}
/*
 * These functions implement the four basic operations the algorithm uses.
 */


function md5cmn(q, a, b, x, s, t) {
  return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);
}

function md5ff(a, b, c, d, x, s, t) {
  return md5cmn(b & c | ~b & d, a, b, x, s, t);
}

function md5gg(a, b, c, d, x, s, t) {
  return md5cmn(b & d | c & ~d, a, b, x, s, t);
}

function md5hh(a, b, c, d, x, s, t) {
  return md5cmn(b ^ c ^ d, a, b, x, s, t);
}

function md5ii(a, b, c, d, x, s, t) {
  return md5cmn(c ^ (b | ~d), a, b, x, s, t);
}

var _default = md5;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _crypto = _interopRequireDefault(require("crypto"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function md5(bytes) {
  if (Array.isArray(bytes)) {
    bytes = Buffer.from(bytes);
  } else if (typeof bytes === 'string') {
    bytes = Buffer.from(bytes, 'utf8');
  }

  return _crypto.default.createHash('md5').update(bytes).digest();
}

var _default = md5;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);
var _default = {
  randomUUID
};
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _crypto = _interopRequireDefault(require("crypto"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var _default = {
  randomUUID: _crypto.default.randomUUID
};
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var _default = '00000000-0000-0000-0000-000000000000';
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _validate = _interopRequireDefault(require("./validate.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function parse(uuid) {
  if (!(0, _validate.default)(uuid)) {
    throw TypeError('Invalid UUID');
  }

  let v;
  const arr = new Uint8Array(16); // Parse ########-....-....-....-............

  arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;
  arr[1] = v >>> 16 & 0xff;
  arr[2] = v >>> 8 & 0xff;
  arr[3] = v & 0xff; // Parse ........-####-....-....-............

  arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;
  arr[5] = v & 0xff; // Parse ........-....-####-....-............

  arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;
  arr[7] = v & 0xff; // Parse ........-....-....-####-............

  arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;
  arr[9] = v & 0xff; // Parse ........-....-....-....-############
  // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes)

  arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;
  arr[11] = v / 0x100000000 & 0xff;
  arr[12] = v >>> 24 & 0xff;
  arr[13] = v >>> 16 & 0xff;
  arr[14] = v >>> 8 & 0xff;
  arr[15] = v & 0xff;
  return arr;
}

var _default = parse;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var _default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = rng;
// Unique ID creation requires a high quality random # generator. In the browser we therefore
// require the crypto API and do not support built-in fallback to lower quality random number
// generators (like Math.random()).
let getRandomValues;
const rnds8 = new Uint8Array(16);

function rng() {
  // lazy load so that environments that need to polyfill have a chance to do so
  if (!getRandomValues) {
    // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation.
    getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);

    if (!getRandomValues) {
      throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');
    }
  }

  return getRandomValues(rnds8);
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = rng;

var _crypto = _interopRequireDefault(require("crypto"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate

let poolPtr = rnds8Pool.length;

function rng() {
  if (poolPtr > rnds8Pool.length - 16) {
    _crypto.default.randomFillSync(rnds8Pool);

    poolPtr = 0;
  }

  return rnds8Pool.slice(poolPtr, poolPtr += 16);
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

// Adapted from Chris Veness' SHA1 code at
// http://www.movable-type.co.uk/scripts/sha1.html
function f(s, x, y, z) {
  switch (s) {
    case 0:
      return x & y ^ ~x & z;

    case 1:
      return x ^ y ^ z;

    case 2:
      return x & y ^ x & z ^ y & z;

    case 3:
      return x ^ y ^ z;
  }
}

function ROTL(x, n) {
  return x << n | x >>> 32 - n;
}

function sha1(bytes) {
  const K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];
  const H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];

  if (typeof bytes === 'string') {
    const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape

    bytes = [];

    for (let i = 0; i < msg.length; ++i) {
      bytes.push(msg.charCodeAt(i));
    }
  } else if (!Array.isArray(bytes)) {
    // Convert Array-like to Array
    bytes = Array.prototype.slice.call(bytes);
  }

  bytes.push(0x80);
  const l = bytes.length / 4 + 2;
  const N = Math.ceil(l / 16);
  const M = new Array(N);

  for (let i = 0; i < N; ++i) {
    const arr = new Uint32Array(16);

    for (let j = 0; j < 16; ++j) {
      arr[j] = bytes[i * 64 + j * 4] << 24 | bytes[i * 64 + j * 4 + 1] << 16 | bytes[i * 64 + j * 4 + 2] << 8 | bytes[i * 64 + j * 4 + 3];
    }

    M[i] = arr;
  }

  M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);
  M[N - 1][14] = Math.floor(M[N - 1][14]);
  M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;

  for (let i = 0; i < N; ++i) {
    const W = new Uint32Array(80);

    for (let t = 0; t < 16; ++t) {
      W[t] = M[i][t];
    }

    for (let t = 16; t < 80; ++t) {
      W[t] = ROTL(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1);
    }

    let a = H[0];
    let b = H[1];
    let c = H[2];
    let d = H[3];
    let e = H[4];

    for (let t = 0; t < 80; ++t) {
      const s = Math.floor(t / 20);
      const T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[t] >>> 0;
      e = d;
      d = c;
      c = ROTL(b, 30) >>> 0;
      b = a;
      a = T;
    }

    H[0] = H[0] + a >>> 0;
    H[1] = H[1] + b >>> 0;
    H[2] = H[2] + c >>> 0;
    H[3] = H[3] + d >>> 0;
    H[4] = H[4] + e >>> 0;
  }

  return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];
}

var _default = sha1;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _crypto = _interopRequireDefault(require("crypto"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function sha1(bytes) {
  if (Array.isArray(bytes)) {
    bytes = Buffer.from(bytes);
  } else if (typeof bytes === 'string') {
    bytes = Buffer.from(bytes, 'utf8');
  }

  return _crypto.default.createHash('sha1').update(bytes).digest();
}

var _default = sha1;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
exports.unsafeStringify = unsafeStringify;

var _validate = _interopRequireDefault(require("./validate.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/**
 * Convert array of 16 byte values to UUID string format of the form:
 * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
 */
const byteToHex = [];

for (let i = 0; i < 256; ++i) {
  byteToHex.push((i + 0x100).toString(16).slice(1));
}

function unsafeStringify(arr, offset = 0) {
  // Note: Be careful editing this code!  It's been tuned for performance
  // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
  return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();
}

function stringify(arr, offset = 0) {
  const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID.  If this throws, it's likely due to one
  // of the following:
  // - One or more input array values don't map to a hex octet (leading to
  // "undefined" in the uuid)
  // - Invalid input values for the RFC `version` or `variant` fields

  if (!(0, _validate.default)(uuid)) {
    throw TypeError('Stringified UUID is invalid');
  }

  return uuid;
}

var _default = stringify;
exports.default = _default;"use strict";

var _assert = _interopRequireDefault(require("assert"));

var _v = _interopRequireDefault(require("./v1.js"));

var _v2 = _interopRequireDefault(require("./v3.js"));

var _v3 = _interopRequireDefault(require("./v4.js"));

var _v4 = _interopRequireDefault(require("./v5.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function usage() {
  console.log('Usage:');
  console.log('  uuid');
  console.log('  uuid v1');
  console.log('  uuid v3 <name> <namespace uuid>');
  console.log('  uuid v4');
  console.log('  uuid v5 <name> <namespace uuid>');
  console.log('  uuid --help');
  console.log('\nNote: <namespace uuid> may be "URL" or "DNS" to use the corresponding UUIDs defined by RFC4122');
}

const args = process.argv.slice(2);

if (args.indexOf('--help') >= 0) {
  usage();
  process.exit(0);
}

const version = args.shift() || 'v4';

switch (version) {
  case 'v1':
    console.log((0, _v.default)());
    break;

  case 'v3':
    {
      const name = args.shift();
      let namespace = args.shift();
      (0, _assert.default)(name != null, 'v3 name not specified');
      (0, _assert.default)(namespace != null, 'v3 namespace not specified');

      if (namespace === 'URL') {
        namespace = _v2.default.URL;
      }

      if (namespace === 'DNS') {
        namespace = _v2.default.DNS;
      }

      console.log((0, _v2.default)(name, namespace));
      break;
    }

  case 'v4':
    console.log((0, _v3.default)());
    break;

  case 'v5':
    {
      const name = args.shift();
      let namespace = args.shift();
      (0, _assert.default)(name != null, 'v5 name not specified');
      (0, _assert.default)(namespace != null, 'v5 namespace not specified');

      if (namespace === 'URL') {
        namespace = _v4.default.URL;
      }

      if (namespace === 'DNS') {
        namespace = _v4.default.DNS;
      }

      console.log((0, _v4.default)(name, namespace));
      break;
    }

  default:
    usage();
    process.exit(1);
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _rng = _interopRequireDefault(require("./rng.js"));

var _stringify = require("./stringify.js");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// **`v1()` - Generate time-based UUID**
//
// Inspired by https://github.com/LiosK/UUID.js
// and http://docs.python.org/library/uuid.html
let _nodeId;

let _clockseq; // Previous uuid creation time


let _lastMSecs = 0;
let _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details

function v1(options, buf, offset) {
  let i = buf && offset || 0;
  const b = buf || new Array(16);
  options = options || {};
  let node = options.node || _nodeId;
  let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not
  // specified.  We do this lazily to minimize issues related to insufficient
  // system entropy.  See #189

  if (node == null || clockseq == null) {
    const seedBytes = options.random || (options.rng || _rng.default)();

    if (node == null) {
      // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
      node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];
    }

    if (clockseq == null) {
      // Per 4.2.2, randomize (14 bit) clockseq
      clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
    }
  } // UUID timestamps are 100 nano-second units since the Gregorian epoch,
  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so
  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.


  let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock
  // cycle to simulate higher resolution clock

  let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)

  const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression

  if (dt < 0 && options.clockseq === undefined) {
    clockseq = clockseq + 1 & 0x3fff;
  } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
  // time interval


  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
    nsecs = 0;
  } // Per 4.2.1.2 Throw error if too many uuids are requested


  if (nsecs >= 10000) {
    throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
  }

  _lastMSecs = msecs;
  _lastNSecs = nsecs;
  _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch

  msecs += 12219292800000; // `time_low`

  const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
  b[i++] = tl >>> 24 & 0xff;
  b[i++] = tl >>> 16 & 0xff;
  b[i++] = tl >>> 8 & 0xff;
  b[i++] = tl & 0xff; // `time_mid`

  const tmh = msecs / 0x100000000 * 10000 & 0xfffffff;
  b[i++] = tmh >>> 8 & 0xff;
  b[i++] = tmh & 0xff; // `time_high_and_version`

  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version

  b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)

  b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`

  b[i++] = clockseq & 0xff; // `node`

  for (let n = 0; n < 6; ++n) {
    b[i + n] = node[n];
  }

  return buf || (0, _stringify.unsafeStringify)(b);
}

var _default = v1;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _v = _interopRequireDefault(require("./v35.js"));

var _md = _interopRequireDefault(require("./md5.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const v3 = (0, _v.default)('v3', 0x30, _md.default);
var _default = v3;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.URL = exports.DNS = void 0;
exports.default = v35;

var _stringify = require("./stringify.js");

var _parse = _interopRequireDefault(require("./parse.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function stringToBytes(str) {
  str = unescape(encodeURIComponent(str)); // UTF8 escape

  const bytes = [];

  for (let i = 0; i < str.length; ++i) {
    bytes.push(str.charCodeAt(i));
  }

  return bytes;
}

const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
exports.DNS = DNS;
const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
exports.URL = URL;

function v35(name, version, hashfunc) {
  function generateUUID(value, namespace, buf, offset) {
    var _namespace;

    if (typeof value === 'string') {
      value = stringToBytes(value);
    }

    if (typeof namespace === 'string') {
      namespace = (0, _parse.default)(namespace);
    }

    if (((_namespace = namespace) === null || _namespace === void 0 ? void 0 : _namespace.length) !== 16) {
      throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');
    } // Compute hash of namespace and value, Per 4.3
    // Future: Use spread syntax when supported on all platforms, e.g. `bytes =
    // hashfunc([...namespace, ... value])`


    let bytes = new Uint8Array(16 + value.length);
    bytes.set(namespace);
    bytes.set(value, namespace.length);
    bytes = hashfunc(bytes);
    bytes[6] = bytes[6] & 0x0f | version;
    bytes[8] = bytes[8] & 0x3f | 0x80;

    if (buf) {
      offset = offset || 0;

      for (let i = 0; i < 16; ++i) {
        buf[offset + i] = bytes[i];
      }

      return buf;
    }

    return (0, _stringify.unsafeStringify)(bytes);
  } // Function#name is not settable on some platforms (#270)


  try {
    generateUUID.name = name; // eslint-disable-next-line no-empty
  } catch (err) {} // For CommonJS default export support


  generateUUID.DNS = DNS;
  generateUUID.URL = URL;
  return generateUUID;
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _native = _interopRequireDefault(require("./native.js"));

var _rng = _interopRequireDefault(require("./rng.js"));

var _stringify = require("./stringify.js");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function v4(options, buf, offset) {
  if (_native.default.randomUUID && !buf && !options) {
    return _native.default.randomUUID();
  }

  options = options || {};

  const rnds = options.random || (options.rng || _rng.default)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`


  rnds[6] = rnds[6] & 0x0f | 0x40;
  rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided

  if (buf) {
    offset = offset || 0;

    for (let i = 0; i < 16; ++i) {
      buf[offset + i] = rnds[i];
    }

    return buf;
  }

  return (0, _stringify.unsafeStringify)(rnds);
}

var _default = v4;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _v = _interopRequireDefault(require("./v35.js"));

var _sha = _interopRequireDefault(require("./sha1.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const v5 = (0, _v.default)('v5', 0x50, _sha.default);
var _default = v5;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _regex = _interopRequireDefault(require("./regex.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function validate(uuid) {
  return typeof uuid === 'string' && _regex.default.test(uuid);
}

var _default = validate;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _validate = _interopRequireDefault(require("./validate.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function version(uuid) {
  if (!(0, _validate.default)(uuid)) {
    throw TypeError('Invalid UUID');
  }

  return parseInt(uuid.slice(14, 15), 16);
}

var _default = version;
exports.default = _default;export { default as v1 } from './v1.js';
export { default as v3 } from './v3.js';
export { default as v4 } from './v4.js';
export { default as v5 } from './v5.js';
export { default as NIL } from './nil.js';
export { default as version } from './version.js';
export { default as validate } from './validate.js';
export { default as stringify } from './stringify.js';
export { default as parse } from './parse.js';import crypto from 'crypto';

function md5(bytes) {
  if (Array.isArray(bytes)) {
    bytes = Buffer.from(bytes);
  } else if (typeof bytes === 'string') {
    bytes = Buffer.from(bytes, 'utf8');
  }

  return crypto.createHash('md5').update(bytes).digest();
}

export default md5;import crypto from 'crypto';
export default {
  randomUUID: crypto.randomUUID
};export default '00000000-0000-0000-0000-000000000000';import validate from './validate.js';

function parse(uuid) {
  if (!validate(uuid)) {
    throw TypeError('Invalid UUID');
  }

  let v;
  const arr = new Uint8Array(16); // Parse ########-....-....-....-............

  arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;
  arr[1] = v >>> 16 & 0xff;
  arr[2] = v >>> 8 & 0xff;
  arr[3] = v & 0xff; // Parse ........-####-....-....-............

  arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;
  arr[5] = v & 0xff; // Parse ........-....-####-....-............

  arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;
  arr[7] = v & 0xff; // Parse ........-....-....-####-............

  arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;
  arr[9] = v & 0xff; // Parse ........-....-....-....-############
  // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes)

  arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;
  arr[11] = v / 0x100000000 & 0xff;
  arr[12] = v >>> 24 & 0xff;
  arr[13] = v >>> 16 & 0xff;
  arr[14] = v >>> 8 & 0xff;
  arr[15] = v & 0xff;
  return arr;
}

export default parse;export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;import crypto from 'crypto';
const rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate

let poolPtr = rnds8Pool.length;
export default function rng() {
  if (poolPtr > rnds8Pool.length - 16) {
    crypto.randomFillSync(rnds8Pool);
    poolPtr = 0;
  }

  return rnds8Pool.slice(poolPtr, poolPtr += 16);
}import crypto from 'crypto';

function sha1(bytes) {
  if (Array.isArray(bytes)) {
    bytes = Buffer.from(bytes);
  } else if (typeof bytes === 'string') {
    bytes = Buffer.from(bytes, 'utf8');
  }

  return crypto.createHash('sha1').update(bytes).digest();
}

export default sha1;import validate from './validate.js';
/**
 * Convert array of 16 byte values to UUID string format of the form:
 * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
 */

const byteToHex = [];

for (let i = 0; i < 256; ++i) {
  byteToHex.push((i + 0x100).toString(16).slice(1));
}

export function unsafeStringify(arr, offset = 0) {
  // Note: Be careful editing this code!  It's been tuned for performance
  // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
  return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();
}

function stringify(arr, offset = 0) {
  const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID.  If this throws, it's likely due to one
  // of the following:
  // - One or more input array values don't map to a hex octet (leading to
  // "undefined" in the uuid)
  // - Invalid input values for the RFC `version` or `variant` fields

  if (!validate(uuid)) {
    throw TypeError('Stringified UUID is invalid');
  }

  return uuid;
}

export default stringify;import rng from './rng.js';
import { unsafeStringify } from './stringify.js'; // **`v1()` - Generate time-based UUID**
//
// Inspired by https://github.com/LiosK/UUID.js
// and http://docs.python.org/library/uuid.html

let _nodeId;

let _clockseq; // Previous uuid creation time


let _lastMSecs = 0;
let _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details

function v1(options, buf, offset) {
  let i = buf && offset || 0;
  const b = buf || new Array(16);
  options = options || {};
  let node = options.node || _nodeId;
  let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not
  // specified.  We do this lazily to minimize issues related to insufficient
  // system entropy.  See #189

  if (node == null || clockseq == null) {
    const seedBytes = options.random || (options.rng || rng)();

    if (node == null) {
      // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
      node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];
    }

    if (clockseq == null) {
      // Per 4.2.2, randomize (14 bit) clockseq
      clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
    }
  } // UUID timestamps are 100 nano-second units since the Gregorian epoch,
  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so
  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.


  let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock
  // cycle to simulate higher resolution clock

  let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)

  const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression

  if (dt < 0 && options.clockseq === undefined) {
    clockseq = clockseq + 1 & 0x3fff;
  } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
  // time interval


  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
    nsecs = 0;
  } // Per 4.2.1.2 Throw error if too many uuids are requested


  if (nsecs >= 10000) {
    throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
  }

  _lastMSecs = msecs;
  _lastNSecs = nsecs;
  _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch

  msecs += 12219292800000; // `time_low`

  const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
  b[i++] = tl >>> 24 & 0xff;
  b[i++] = tl >>> 16 & 0xff;
  b[i++] = tl >>> 8 & 0xff;
  b[i++] = tl & 0xff; // `time_mid`

  const tmh = msecs / 0x100000000 * 10000 & 0xfffffff;
  b[i++] = tmh >>> 8 & 0xff;
  b[i++] = tmh & 0xff; // `time_high_and_version`

  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version

  b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)

  b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`

  b[i++] = clockseq & 0xff; // `node`

  for (let n = 0; n < 6; ++n) {
    b[i + n] = node[n];
  }

  return buf || unsafeStringify(b);
}

export default v1;import v35 from './v35.js';
import md5 from './md5.js';
const v3 = v35('v3', 0x30, md5);
export default v3;import { unsafeStringify } from './stringify.js';
import parse from './parse.js';

function stringToBytes(str) {
  str = unescape(encodeURIComponent(str)); // UTF8 escape

  const bytes = [];

  for (let i = 0; i < str.length; ++i) {
    bytes.push(str.charCodeAt(i));
  }

  return bytes;
}

export const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
export const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
export default function v35(name, version, hashfunc) {
  function generateUUID(value, namespace, buf, offset) {
    var _namespace;

    if (typeof value === 'string') {
      value = stringToBytes(value);
    }

    if (typeof namespace === 'string') {
      namespace = parse(namespace);
    }

    if (((_namespace = namespace) === null || _namespace === void 0 ? void 0 : _namespace.length) !== 16) {
      throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');
    } // Compute hash of namespace and value, Per 4.3
    // Future: Use spread syntax when supported on all platforms, e.g. `bytes =
    // hashfunc([...namespace, ... value])`


    let bytes = new Uint8Array(16 + value.length);
    bytes.set(namespace);
    bytes.set(value, namespace.length);
    bytes = hashfunc(bytes);
    bytes[6] = bytes[6] & 0x0f | version;
    bytes[8] = bytes[8] & 0x3f | 0x80;

    if (buf) {
      offset = offset || 0;

      for (let i = 0; i < 16; ++i) {
        buf[offset + i] = bytes[i];
      }

      return buf;
    }

    return unsafeStringify(bytes);
  } // Function#name is not settable on some platforms (#270)


  try {
    generateUUID.name = name; // eslint-disable-next-line no-empty
  } catch (err) {} // For CommonJS default export support


  generateUUID.DNS = DNS;
  generateUUID.URL = URL;
  return generateUUID;
}import native from './native.js';
import rng from './rng.js';
import { unsafeStringify } from './stringify.js';

function v4(options, buf, offset) {
  if (native.randomUUID && !buf && !options) {
    return native.randomUUID();
  }

  options = options || {};
  const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`

  rnds[6] = rnds[6] & 0x0f | 0x40;
  rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided

  if (buf) {
    offset = offset || 0;

    for (let i = 0; i < 16; ++i) {
      buf[offset + i] = rnds[i];
    }

    return buf;
  }

  return unsafeStringify(rnds);
}

export default v4;import v35 from './v35.js';
import sha1 from './sha1.js';
const v5 = v35('v5', 0x50, sha1);
export default v5;import REGEX from './regex.js';

function validate(uuid) {
  return typeof uuid === 'string' && REGEX.test(uuid);
}

export default validate;import validate from './validate.js';

function version(uuid) {
  if (!validate(uuid)) {
    throw TypeError('Invalid UUID');
  }

  return parseInt(uuid.slice(14, 15), 16);
}

export default version;export { default as v1 } from './v1.js';
export { default as v3 } from './v3.js';
export { default as v4 } from './v4.js';
export { default as v5 } from './v5.js';
export { default as NIL } from './nil.js';
export { default as version } from './version.js';
export { default as validate } from './validate.js';
export { default as stringify } from './stringify.js';
export { default as parse } from './parse.js';/*
 * Browser-compatible JavaScript MD5
 *
 * Modification of JavaScript MD5
 * https://github.com/blueimp/JavaScript-MD5
 *
 * Copyright 2011, Sebastian Tschan
 * https://blueimp.net
 *
 * Licensed under the MIT license:
 * https://opensource.org/licenses/MIT
 *
 * Based on
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 */
function md5(bytes) {
  if (typeof bytes === 'string') {
    const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape

    bytes = new Uint8Array(msg.length);

    for (let i = 0; i < msg.length; ++i) {
      bytes[i] = msg.charCodeAt(i);
    }
  }

  return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));
}
/*
 * Convert an array of little-endian words to an array of bytes
 */


function md5ToHexEncodedArray(input) {
  const output = [];
  const length32 = input.length * 32;
  const hexTab = '0123456789abcdef';

  for (let i = 0; i < length32; i += 8) {
    const x = input[i >> 5] >>> i % 32 & 0xff;
    const hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);
    output.push(hex);
  }

  return output;
}
/**
 * Calculate output length with padding and bit length
 */


function getOutputLength(inputLength8) {
  return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;
}
/*
 * Calculate the MD5 of an array of little-endian words, and a bit length.
 */


function wordsToMd5(x, len) {
  /* append padding */
  x[len >> 5] |= 0x80 << len % 32;
  x[getOutputLength(len) - 1] = len;
  let a = 1732584193;
  let b = -271733879;
  let c = -1732584194;
  let d = 271733878;

  for (let i = 0; i < x.length; i += 16) {
    const olda = a;
    const oldb = b;
    const oldc = c;
    const oldd = d;
    a = md5ff(a, b, c, d, x[i], 7, -680876936);
    d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);
    c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);
    b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
    a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);
    d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
    c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
    b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);
    a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
    d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
    c = md5ff(c, d, a, b, x[i + 10], 17, -42063);
    b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
    a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
    d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);
    c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
    b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
    a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);
    d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
    c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);
    b = md5gg(b, c, d, a, x[i], 20, -373897302);
    a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);
    d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);
    c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);
    b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);
    a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);
    d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
    c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);
    b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
    a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
    d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);
    c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
    b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
    a = md5hh(a, b, c, d, x[i + 5], 4, -378558);
    d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
    c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
    b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);
    a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
    d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
    c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);
    b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
    a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);
    d = md5hh(d, a, b, c, x[i], 11, -358537222);
    c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);
    b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);
    a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);
    d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);
    c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);
    b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);
    a = md5ii(a, b, c, d, x[i], 6, -198630844);
    d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
    c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
    b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);
    a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
    d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
    c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);
    b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
    a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
    d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);
    c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
    b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
    a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);
    d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
    c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);
    b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);
    a = safeAdd(a, olda);
    b = safeAdd(b, oldb);
    c = safeAdd(c, oldc);
    d = safeAdd(d, oldd);
  }

  return [a, b, c, d];
}
/*
 * Convert an array bytes to an array of little-endian words
 * Characters >255 have their high-byte silently ignored.
 */


function bytesToWords(input) {
  if (input.length === 0) {
    return [];
  }

  const length8 = input.length * 8;
  const output = new Uint32Array(getOutputLength(length8));

  for (let i = 0; i < length8; i += 8) {
    output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;
  }

  return output;
}
/*
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
 * to work around bugs in some JS interpreters.
 */


function safeAdd(x, y) {
  const lsw = (x & 0xffff) + (y & 0xffff);
  const msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return msw << 16 | lsw & 0xffff;
}
/*
 * Bitwise rotate a 32-bit number to the left.
 */


function bitRotateLeft(num, cnt) {
  return num << cnt | num >>> 32 - cnt;
}
/*
 * These functions implement the four basic operations the algorithm uses.
 */


function md5cmn(q, a, b, x, s, t) {
  return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);
}

function md5ff(a, b, c, d, x, s, t) {
  return md5cmn(b & c | ~b & d, a, b, x, s, t);
}

function md5gg(a, b, c, d, x, s, t) {
  return md5cmn(b & d | c & ~d, a, b, x, s, t);
}

function md5hh(a, b, c, d, x, s, t) {
  return md5cmn(b ^ c ^ d, a, b, x, s, t);
}

function md5ii(a, b, c, d, x, s, t) {
  return md5cmn(c ^ (b | ~d), a, b, x, s, t);
}

export default md5;const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);
export default {
  randomUUID
};export default '00000000-0000-0000-0000-000000000000';import validate from './validate.js';

function parse(uuid) {
  if (!validate(uuid)) {
    throw TypeError('Invalid UUID');
  }

  let v;
  const arr = new Uint8Array(16); // Parse ########-....-....-....-............

  arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;
  arr[1] = v >>> 16 & 0xff;
  arr[2] = v >>> 8 & 0xff;
  arr[3] = v & 0xff; // Parse ........-####-....-....-............

  arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;
  arr[5] = v & 0xff; // Parse ........-....-####-....-............

  arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;
  arr[7] = v & 0xff; // Parse ........-....-....-####-............

  arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;
  arr[9] = v & 0xff; // Parse ........-....-....-....-############
  // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes)

  arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;
  arr[11] = v / 0x100000000 & 0xff;
  arr[12] = v >>> 24 & 0xff;
  arr[13] = v >>> 16 & 0xff;
  arr[14] = v >>> 8 & 0xff;
  arr[15] = v & 0xff;
  return arr;
}

export default parse;export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;// Unique ID creation requires a high quality random # generator. In the browser we therefore
// require the crypto API and do not support built-in fallback to lower quality random number
// generators (like Math.random()).
let getRandomValues;
const rnds8 = new Uint8Array(16);
export default function rng() {
  // lazy load so that environments that need to polyfill have a chance to do so
  if (!getRandomValues) {
    // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation.
    getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);

    if (!getRandomValues) {
      throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');
    }
  }

  return getRandomValues(rnds8);
}// Adapted from Chris Veness' SHA1 code at
// http://www.movable-type.co.uk/scripts/sha1.html
function f(s, x, y, z) {
  switch (s) {
    case 0:
      return x & y ^ ~x & z;

    case 1:
      return x ^ y ^ z;

    case 2:
      return x & y ^ x & z ^ y & z;

    case 3:
      return x ^ y ^ z;
  }
}

function ROTL(x, n) {
  return x << n | x >>> 32 - n;
}

function sha1(bytes) {
  const K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];
  const H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];

  if (typeof bytes === 'string') {
    const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape

    bytes = [];

    for (let i = 0; i < msg.length; ++i) {
      bytes.push(msg.charCodeAt(i));
    }
  } else if (!Array.isArray(bytes)) {
    // Convert Array-like to Array
    bytes = Array.prototype.slice.call(bytes);
  }

  bytes.push(0x80);
  const l = bytes.length / 4 + 2;
  const N = Math.ceil(l / 16);
  const M = new Array(N);

  for (let i = 0; i < N; ++i) {
    const arr = new Uint32Array(16);

    for (let j = 0; j < 16; ++j) {
      arr[j] = bytes[i * 64 + j * 4] << 24 | bytes[i * 64 + j * 4 + 1] << 16 | bytes[i * 64 + j * 4 + 2] << 8 | bytes[i * 64 + j * 4 + 3];
    }

    M[i] = arr;
  }

  M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);
  M[N - 1][14] = Math.floor(M[N - 1][14]);
  M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;

  for (let i = 0; i < N; ++i) {
    const W = new Uint32Array(80);

    for (let t = 0; t < 16; ++t) {
      W[t] = M[i][t];
    }

    for (let t = 16; t < 80; ++t) {
      W[t] = ROTL(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1);
    }

    let a = H[0];
    let b = H[1];
    let c = H[2];
    let d = H[3];
    let e = H[4];

    for (let t = 0; t < 80; ++t) {
      const s = Math.floor(t / 20);
      const T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[t] >>> 0;
      e = d;
      d = c;
      c = ROTL(b, 30) >>> 0;
      b = a;
      a = T;
    }

    H[0] = H[0] + a >>> 0;
    H[1] = H[1] + b >>> 0;
    H[2] = H[2] + c >>> 0;
    H[3] = H[3] + d >>> 0;
    H[4] = H[4] + e >>> 0;
  }

  return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];
}

export default sha1;import validate from './validate.js';
/**
 * Convert array of 16 byte values to UUID string format of the form:
 * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
 */

const byteToHex = [];

for (let i = 0; i < 256; ++i) {
  byteToHex.push((i + 0x100).toString(16).slice(1));
}

export function unsafeStringify(arr, offset = 0) {
  // Note: Be careful editing this code!  It's been tuned for performance
  // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
  return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();
}

function stringify(arr, offset = 0) {
  const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID.  If this throws, it's likely due to one
  // of the following:
  // - One or more input array values don't map to a hex octet (leading to
  // "undefined" in the uuid)
  // - Invalid input values for the RFC `version` or `variant` fields

  if (!validate(uuid)) {
    throw TypeError('Stringified UUID is invalid');
  }

  return uuid;
}

export default stringify;import rng from './rng.js';
import { unsafeStringify } from './stringify.js'; // **`v1()` - Generate time-based UUID**
//
// Inspired by https://github.com/LiosK/UUID.js
// and http://docs.python.org/library/uuid.html

let _nodeId;

let _clockseq; // Previous uuid creation time


let _lastMSecs = 0;
let _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details

function v1(options, buf, offset) {
  let i = buf && offset || 0;
  const b = buf || new Array(16);
  options = options || {};
  let node = options.node || _nodeId;
  let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not
  // specified.  We do this lazily to minimize issues related to insufficient
  // system entropy.  See #189

  if (node == null || clockseq == null) {
    const seedBytes = options.random || (options.rng || rng)();

    if (node == null) {
      // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
      node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];
    }

    if (clockseq == null) {
      // Per 4.2.2, randomize (14 bit) clockseq
      clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
    }
  } // UUID timestamps are 100 nano-second units since the Gregorian epoch,
  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so
  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.


  let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock
  // cycle to simulate higher resolution clock

  let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)

  const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression

  if (dt < 0 && options.clockseq === undefined) {
    clockseq = clockseq + 1 & 0x3fff;
  } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
  // time interval


  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
    nsecs = 0;
  } // Per 4.2.1.2 Throw error if too many uuids are requested


  if (nsecs >= 10000) {
    throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
  }

  _lastMSecs = msecs;
  _lastNSecs = nsecs;
  _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch

  msecs += 12219292800000; // `time_low`

  const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
  b[i++] = tl >>> 24 & 0xff;
  b[i++] = tl >>> 16 & 0xff;
  b[i++] = tl >>> 8 & 0xff;
  b[i++] = tl & 0xff; // `time_mid`

  const tmh = msecs / 0x100000000 * 10000 & 0xfffffff;
  b[i++] = tmh >>> 8 & 0xff;
  b[i++] = tmh & 0xff; // `time_high_and_version`

  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version

  b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)

  b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`

  b[i++] = clockseq & 0xff; // `node`

  for (let n = 0; n < 6; ++n) {
    b[i + n] = node[n];
  }

  return buf || unsafeStringify(b);
}

export default v1;import v35 from './v35.js';
import md5 from './md5.js';
const v3 = v35('v3', 0x30, md5);
export default v3;import { unsafeStringify } from './stringify.js';
import parse from './parse.js';

function stringToBytes(str) {
  str = unescape(encodeURIComponent(str)); // UTF8 escape

  const bytes = [];

  for (let i = 0; i < str.length; ++i) {
    bytes.push(str.charCodeAt(i));
  }

  return bytes;
}

export const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
export const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
export default function v35(name, version, hashfunc) {
  function generateUUID(value, namespace, buf, offset) {
    var _namespace;

    if (typeof value === 'string') {
      value = stringToBytes(value);
    }

    if (typeof namespace === 'string') {
      namespace = parse(namespace);
    }

    if (((_namespace = namespace) === null || _namespace === void 0 ? void 0 : _namespace.length) !== 16) {
      throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');
    } // Compute hash of namespace and value, Per 4.3
    // Future: Use spread syntax when supported on all platforms, e.g. `bytes =
    // hashfunc([...namespace, ... value])`


    let bytes = new Uint8Array(16 + value.length);
    bytes.set(namespace);
    bytes.set(value, namespace.length);
    bytes = hashfunc(bytes);
    bytes[6] = bytes[6] & 0x0f | version;
    bytes[8] = bytes[8] & 0x3f | 0x80;

    if (buf) {
      offset = offset || 0;

      for (let i = 0; i < 16; ++i) {
        buf[offset + i] = bytes[i];
      }

      return buf;
    }

    return unsafeStringify(bytes);
  } // Function#name is not settable on some platforms (#270)


  try {
    generateUUID.name = name; // eslint-disable-next-line no-empty
  } catch (err) {} // For CommonJS default export support


  generateUUID.DNS = DNS;
  generateUUID.URL = URL;
  return generateUUID;
}import native from './native.js';
import rng from './rng.js';
import { unsafeStringify } from './stringify.js';

function v4(options, buf, offset) {
  if (native.randomUUID && !buf && !options) {
    return native.randomUUID();
  }

  options = options || {};
  const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`

  rnds[6] = rnds[6] & 0x0f | 0x40;
  rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided

  if (buf) {
    offset = offset || 0;

    for (let i = 0; i < 16; ++i) {
      buf[offset + i] = rnds[i];
    }

    return buf;
  }

  return unsafeStringify(rnds);
}

export default v4;import v35 from './v35.js';
import sha1 from './sha1.js';
const v5 = v35('v5', 0x50, sha1);
export default v5;import REGEX from './regex.js';

function validate(uuid) {
  return typeof uuid === 'string' && REGEX.test(uuid);
}

export default validate;import validate from './validate.js';

function version(uuid) {
  if (!validate(uuid)) {
    throw TypeError('Invalid UUID');
  }

  return parseInt(uuid.slice(14, 15), 16);
}

export default version;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
Object.defineProperty(exports, "NIL", {
  enumerable: true,
  get: function get() {
    return _nil.default;
  }
});
Object.defineProperty(exports, "parse", {
  enumerable: true,
  get: function get() {
    return _parse.default;
  }
});
Object.defineProperty(exports, "stringify", {
  enumerable: true,
  get: function get() {
    return _stringify.default;
  }
});
Object.defineProperty(exports, "v1", {
  enumerable: true,
  get: function get() {
    return _v.default;
  }
});
Object.defineProperty(exports, "v3", {
  enumerable: true,
  get: function get() {
    return _v2.default;
  }
});
Object.defineProperty(exports, "v4", {
  enumerable: true,
  get: function get() {
    return _v3.default;
  }
});
Object.defineProperty(exports, "v5", {
  enumerable: true,
  get: function get() {
    return _v4.default;
  }
});
Object.defineProperty(exports, "validate", {
  enumerable: true,
  get: function get() {
    return _validate.default;
  }
});
Object.defineProperty(exports, "version", {
  enumerable: true,
  get: function get() {
    return _version.default;
  }
});

var _v = _interopRequireDefault(require("./v1.js"));

var _v2 = _interopRequireDefault(require("./v3.js"));

var _v3 = _interopRequireDefault(require("./v4.js"));

var _v4 = _interopRequireDefault(require("./v5.js"));

var _nil = _interopRequireDefault(require("./nil.js"));

var _version = _interopRequireDefault(require("./version.js"));

var _validate = _interopRequireDefault(require("./validate.js"));

var _stringify = _interopRequireDefault(require("./stringify.js"));

var _parse = _interopRequireDefault(require("./parse.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/*
 * Browser-compatible JavaScript MD5
 *
 * Modification of JavaScript MD5
 * https://github.com/blueimp/JavaScript-MD5
 *
 * Copyright 2011, Sebastian Tschan
 * https://blueimp.net
 *
 * Licensed under the MIT license:
 * https://opensource.org/licenses/MIT
 *
 * Based on
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 */
function md5(bytes) {
  if (typeof bytes === 'string') {
    const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape

    bytes = new Uint8Array(msg.length);

    for (let i = 0; i < msg.length; ++i) {
      bytes[i] = msg.charCodeAt(i);
    }
  }

  return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));
}
/*
 * Convert an array of little-endian words to an array of bytes
 */


function md5ToHexEncodedArray(input) {
  const output = [];
  const length32 = input.length * 32;
  const hexTab = '0123456789abcdef';

  for (let i = 0; i < length32; i += 8) {
    const x = input[i >> 5] >>> i % 32 & 0xff;
    const hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);
    output.push(hex);
  }

  return output;
}
/**
 * Calculate output length with padding and bit length
 */


function getOutputLength(inputLength8) {
  return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;
}
/*
 * Calculate the MD5 of an array of little-endian words, and a bit length.
 */


function wordsToMd5(x, len) {
  /* append padding */
  x[len >> 5] |= 0x80 << len % 32;
  x[getOutputLength(len) - 1] = len;
  let a = 1732584193;
  let b = -271733879;
  let c = -1732584194;
  let d = 271733878;

  for (let i = 0; i < x.length; i += 16) {
    const olda = a;
    const oldb = b;
    const oldc = c;
    const oldd = d;
    a = md5ff(a, b, c, d, x[i], 7, -680876936);
    d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);
    c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);
    b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
    a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);
    d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
    c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
    b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);
    a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
    d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
    c = md5ff(c, d, a, b, x[i + 10], 17, -42063);
    b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
    a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
    d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);
    c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
    b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
    a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);
    d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
    c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);
    b = md5gg(b, c, d, a, x[i], 20, -373897302);
    a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);
    d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);
    c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);
    b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);
    a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);
    d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
    c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);
    b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
    a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
    d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);
    c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
    b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
    a = md5hh(a, b, c, d, x[i + 5], 4, -378558);
    d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
    c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
    b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);
    a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
    d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
    c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);
    b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
    a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);
    d = md5hh(d, a, b, c, x[i], 11, -358537222);
    c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);
    b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);
    a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);
    d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);
    c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);
    b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);
    a = md5ii(a, b, c, d, x[i], 6, -198630844);
    d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
    c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
    b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);
    a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
    d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
    c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);
    b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
    a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
    d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);
    c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
    b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
    a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);
    d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
    c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);
    b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);
    a = safeAdd(a, olda);
    b = safeAdd(b, oldb);
    c = safeAdd(c, oldc);
    d = safeAdd(d, oldd);
  }

  return [a, b, c, d];
}
/*
 * Convert an array bytes to an array of little-endian words
 * Characters >255 have their high-byte silently ignored.
 */


function bytesToWords(input) {
  if (input.length === 0) {
    return [];
  }

  const length8 = input.length * 8;
  const output = new Uint32Array(getOutputLength(length8));

  for (let i = 0; i < length8; i += 8) {
    output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;
  }

  return output;
}
/*
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
 * to work around bugs in some JS interpreters.
 */


function safeAdd(x, y) {
  const lsw = (x & 0xffff) + (y & 0xffff);
  const msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return msw << 16 | lsw & 0xffff;
}
/*
 * Bitwise rotate a 32-bit number to the left.
 */


function bitRotateLeft(num, cnt) {
  return num << cnt | num >>> 32 - cnt;
}
/*
 * These functions implement the four basic operations the algorithm uses.
 */


function md5cmn(q, a, b, x, s, t) {
  return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);
}

function md5ff(a, b, c, d, x, s, t) {
  return md5cmn(b & c | ~b & d, a, b, x, s, t);
}

function md5gg(a, b, c, d, x, s, t) {
  return md5cmn(b & d | c & ~d, a, b, x, s, t);
}

function md5hh(a, b, c, d, x, s, t) {
  return md5cmn(b ^ c ^ d, a, b, x, s, t);
}

function md5ii(a, b, c, d, x, s, t) {
  return md5cmn(c ^ (b | ~d), a, b, x, s, t);
}

var _default = md5;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);
var _default = {
  randomUUID
};
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var _default = '00000000-0000-0000-0000-000000000000';
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _validate = _interopRequireDefault(require("./validate.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function parse(uuid) {
  if (!(0, _validate.default)(uuid)) {
    throw TypeError('Invalid UUID');
  }

  let v;
  const arr = new Uint8Array(16); // Parse ########-....-....-....-............

  arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;
  arr[1] = v >>> 16 & 0xff;
  arr[2] = v >>> 8 & 0xff;
  arr[3] = v & 0xff; // Parse ........-####-....-....-............

  arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;
  arr[5] = v & 0xff; // Parse ........-....-####-....-............

  arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;
  arr[7] = v & 0xff; // Parse ........-....-....-####-............

  arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;
  arr[9] = v & 0xff; // Parse ........-....-....-....-############
  // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes)

  arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;
  arr[11] = v / 0x100000000 & 0xff;
  arr[12] = v >>> 24 & 0xff;
  arr[13] = v >>> 16 & 0xff;
  arr[14] = v >>> 8 & 0xff;
  arr[15] = v & 0xff;
  return arr;
}

var _default = parse;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var _default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = rng;
// Unique ID creation requires a high quality random # generator. In the browser we therefore
// require the crypto API and do not support built-in fallback to lower quality random number
// generators (like Math.random()).
let getRandomValues;
const rnds8 = new Uint8Array(16);

function rng() {
  // lazy load so that environments that need to polyfill have a chance to do so
  if (!getRandomValues) {
    // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation.
    getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);

    if (!getRandomValues) {
      throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');
    }
  }

  return getRandomValues(rnds8);
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

// Adapted from Chris Veness' SHA1 code at
// http://www.movable-type.co.uk/scripts/sha1.html
function f(s, x, y, z) {
  switch (s) {
    case 0:
      return x & y ^ ~x & z;

    case 1:
      return x ^ y ^ z;

    case 2:
      return x & y ^ x & z ^ y & z;

    case 3:
      return x ^ y ^ z;
  }
}

function ROTL(x, n) {
  return x << n | x >>> 32 - n;
}

function sha1(bytes) {
  const K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];
  const H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];

  if (typeof bytes === 'string') {
    const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape

    bytes = [];

    for (let i = 0; i < msg.length; ++i) {
      bytes.push(msg.charCodeAt(i));
    }
  } else if (!Array.isArray(bytes)) {
    // Convert Array-like to Array
    bytes = Array.prototype.slice.call(bytes);
  }

  bytes.push(0x80);
  const l = bytes.length / 4 + 2;
  const N = Math.ceil(l / 16);
  const M = new Array(N);

  for (let i = 0; i < N; ++i) {
    const arr = new Uint32Array(16);

    for (let j = 0; j < 16; ++j) {
      arr[j] = bytes[i * 64 + j * 4] << 24 | bytes[i * 64 + j * 4 + 1] << 16 | bytes[i * 64 + j * 4 + 2] << 8 | bytes[i * 64 + j * 4 + 3];
    }

    M[i] = arr;
  }

  M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);
  M[N - 1][14] = Math.floor(M[N - 1][14]);
  M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;

  for (let i = 0; i < N; ++i) {
    const W = new Uint32Array(80);

    for (let t = 0; t < 16; ++t) {
      W[t] = M[i][t];
    }

    for (let t = 16; t < 80; ++t) {
      W[t] = ROTL(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1);
    }

    let a = H[0];
    let b = H[1];
    let c = H[2];
    let d = H[3];
    let e = H[4];

    for (let t = 0; t < 80; ++t) {
      const s = Math.floor(t / 20);
      const T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[t] >>> 0;
      e = d;
      d = c;
      c = ROTL(b, 30) >>> 0;
      b = a;
      a = T;
    }

    H[0] = H[0] + a >>> 0;
    H[1] = H[1] + b >>> 0;
    H[2] = H[2] + c >>> 0;
    H[3] = H[3] + d >>> 0;
    H[4] = H[4] + e >>> 0;
  }

  return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];
}

var _default = sha1;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
exports.unsafeStringify = unsafeStringify;

var _validate = _interopRequireDefault(require("./validate.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/**
 * Convert array of 16 byte values to UUID string format of the form:
 * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
 */
const byteToHex = [];

for (let i = 0; i < 256; ++i) {
  byteToHex.push((i + 0x100).toString(16).slice(1));
}

function unsafeStringify(arr, offset = 0) {
  // Note: Be careful editing this code!  It's been tuned for performance
  // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
  return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();
}

function stringify(arr, offset = 0) {
  const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID.  If this throws, it's likely due to one
  // of the following:
  // - One or more input array values don't map to a hex octet (leading to
  // "undefined" in the uuid)
  // - Invalid input values for the RFC `version` or `variant` fields

  if (!(0, _validate.default)(uuid)) {
    throw TypeError('Stringified UUID is invalid');
  }

  return uuid;
}

var _default = stringify;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _rng = _interopRequireDefault(require("./rng.js"));

var _stringify = require("./stringify.js");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// **`v1()` - Generate time-based UUID**
//
// Inspired by https://github.com/LiosK/UUID.js
// and http://docs.python.org/library/uuid.html
let _nodeId;

let _clockseq; // Previous uuid creation time


let _lastMSecs = 0;
let _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details

function v1(options, buf, offset) {
  let i = buf && offset || 0;
  const b = buf || new Array(16);
  options = options || {};
  let node = options.node || _nodeId;
  let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not
  // specified.  We do this lazily to minimize issues related to insufficient
  // system entropy.  See #189

  if (node == null || clockseq == null) {
    const seedBytes = options.random || (options.rng || _rng.default)();

    if (node == null) {
      // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
      node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];
    }

    if (clockseq == null) {
      // Per 4.2.2, randomize (14 bit) clockseq
      clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
    }
  } // UUID timestamps are 100 nano-second units since the Gregorian epoch,
  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so
  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.


  let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock
  // cycle to simulate higher resolution clock

  let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)

  const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression

  if (dt < 0 && options.clockseq === undefined) {
    clockseq = clockseq + 1 & 0x3fff;
  } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
  // time interval


  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
    nsecs = 0;
  } // Per 4.2.1.2 Throw error if too many uuids are requested


  if (nsecs >= 10000) {
    throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
  }

  _lastMSecs = msecs;
  _lastNSecs = nsecs;
  _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch

  msecs += 12219292800000; // `time_low`

  const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
  b[i++] = tl >>> 24 & 0xff;
  b[i++] = tl >>> 16 & 0xff;
  b[i++] = tl >>> 8 & 0xff;
  b[i++] = tl & 0xff; // `time_mid`

  const tmh = msecs / 0x100000000 * 10000 & 0xfffffff;
  b[i++] = tmh >>> 8 & 0xff;
  b[i++] = tmh & 0xff; // `time_high_and_version`

  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version

  b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)

  b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`

  b[i++] = clockseq & 0xff; // `node`

  for (let n = 0; n < 6; ++n) {
    b[i + n] = node[n];
  }

  return buf || (0, _stringify.unsafeStringify)(b);
}

var _default = v1;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _v = _interopRequireDefault(require("./v35.js"));

var _md = _interopRequireDefault(require("./md5.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const v3 = (0, _v.default)('v3', 0x30, _md.default);
var _default = v3;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.URL = exports.DNS = void 0;
exports.default = v35;

var _stringify = require("./stringify.js");

var _parse = _interopRequireDefault(require("./parse.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function stringToBytes(str) {
  str = unescape(encodeURIComponent(str)); // UTF8 escape

  const bytes = [];

  for (let i = 0; i < str.length; ++i) {
    bytes.push(str.charCodeAt(i));
  }

  return bytes;
}

const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
exports.DNS = DNS;
const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
exports.URL = URL;

function v35(name, version, hashfunc) {
  function generateUUID(value, namespace, buf, offset) {
    var _namespace;

    if (typeof value === 'string') {
      value = stringToBytes(value);
    }

    if (typeof namespace === 'string') {
      namespace = (0, _parse.default)(namespace);
    }

    if (((_namespace = namespace) === null || _namespace === void 0 ? void 0 : _namespace.length) !== 16) {
      throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');
    } // Compute hash of namespace and value, Per 4.3
    // Future: Use spread syntax when supported on all platforms, e.g. `bytes =
    // hashfunc([...namespace, ... value])`


    let bytes = new Uint8Array(16 + value.length);
    bytes.set(namespace);
    bytes.set(value, namespace.length);
    bytes = hashfunc(bytes);
    bytes[6] = bytes[6] & 0x0f | version;
    bytes[8] = bytes[8] & 0x3f | 0x80;

    if (buf) {
      offset = offset || 0;

      for (let i = 0; i < 16; ++i) {
        buf[offset + i] = bytes[i];
      }

      return buf;
    }

    return (0, _stringify.unsafeStringify)(bytes);
  } // Function#name is not settable on some platforms (#270)


  try {
    generateUUID.name = name; // eslint-disable-next-line no-empty
  } catch (err) {} // For CommonJS default export support


  generateUUID.DNS = DNS;
  generateUUID.URL = URL;
  return generateUUID;
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _native = _interopRequireDefault(require("./native.js"));

var _rng = _interopRequireDefault(require("./rng.js"));

var _stringify = require("./stringify.js");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function v4(options, buf, offset) {
  if (_native.default.randomUUID && !buf && !options) {
    return _native.default.randomUUID();
  }

  options = options || {};

  const rnds = options.random || (options.rng || _rng.default)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`


  rnds[6] = rnds[6] & 0x0f | 0x40;
  rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided

  if (buf) {
    offset = offset || 0;

    for (let i = 0; i < 16; ++i) {
      buf[offset + i] = rnds[i];
    }

    return buf;
  }

  return (0, _stringify.unsafeStringify)(rnds);
}

var _default = v4;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _v = _interopRequireDefault(require("./v35.js"));

var _sha = _interopRequireDefault(require("./sha1.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const v5 = (0, _v.default)('v5', 0x50, _sha.default);
var _default = v5;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _regex = _interopRequireDefault(require("./regex.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function validate(uuid) {
  return typeof uuid === 'string' && _regex.default.test(uuid);
}

var _default = validate;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _validate = _interopRequireDefault(require("./validate.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function version(uuid) {
  if (!(0, _validate.default)(uuid)) {
    throw TypeError('Invalid UUID');
  }

  return parseInt(uuid.slice(14, 15), 16);
}

var _default = version;
exports.default = _default;#!/usr/bin/env node
require('../uuid-bin');
Copyright (c) 2018 Chris O'Hara <cohara87@gmail.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.
"use strict";

function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _toDate = _interopRequireDefault(require("./lib/toDate"));

var _toFloat = _interopRequireDefault(require("./lib/toFloat"));

var _toInt = _interopRequireDefault(require("./lib/toInt"));

var _toBoolean = _interopRequireDefault(require("./lib/toBoolean"));

var _equals = _interopRequireDefault(require("./lib/equals"));

var _contains = _interopRequireDefault(require("./lib/contains"));

var _matches = _interopRequireDefault(require("./lib/matches"));

var _isEmail = _interopRequireDefault(require("./lib/isEmail"));

var _isURL = _interopRequireDefault(require("./lib/isURL"));

var _isMACAddress = _interopRequireDefault(require("./lib/isMACAddress"));

var _isIP = _interopRequireDefault(require("./lib/isIP"));

var _isIPRange = _interopRequireDefault(require("./lib/isIPRange"));

var _isFQDN = _interopRequireDefault(require("./lib/isFQDN"));

var _isDate = _interopRequireDefault(require("./lib/isDate"));

var _isBoolean = _interopRequireDefault(require("./lib/isBoolean"));

var _isLocale = _interopRequireDefault(require("./lib/isLocale"));

var _isAlpha = _interopRequireWildcard(require("./lib/isAlpha"));

var _isAlphanumeric = _interopRequireWildcard(require("./lib/isAlphanumeric"));

var _isNumeric = _interopRequireDefault(require("./lib/isNumeric"));

var _isPassportNumber = _interopRequireDefault(require("./lib/isPassportNumber"));

var _isPort = _interopRequireDefault(require("./lib/isPort"));

var _isLowercase = _interopRequireDefault(require("./lib/isLowercase"));

var _isUppercase = _interopRequireDefault(require("./lib/isUppercase"));

var _isIMEI = _interopRequireDefault(require("./lib/isIMEI"));

var _isAscii = _interopRequireDefault(require("./lib/isAscii"));

var _isFullWidth = _interopRequireDefault(require("./lib/isFullWidth"));

var _isHalfWidth = _interopRequireDefault(require("./lib/isHalfWidth"));

var _isVariableWidth = _interopRequireDefault(require("./lib/isVariableWidth"));

var _isMultibyte = _interopRequireDefault(require("./lib/isMultibyte"));

var _isSemVer = _interopRequireDefault(require("./lib/isSemVer"));

var _isSurrogatePair = _interopRequireDefault(require("./lib/isSurrogatePair"));

var _isInt = _interopRequireDefault(require("./lib/isInt"));

var _isFloat = _interopRequireWildcard(require("./lib/isFloat"));

var _isDecimal = _interopRequireDefault(require("./lib/isDecimal"));

var _isHexadecimal = _interopRequireDefault(require("./lib/isHexadecimal"));

var _isOctal = _interopRequireDefault(require("./lib/isOctal"));

var _isDivisibleBy = _interopRequireDefault(require("./lib/isDivisibleBy"));

var _isHexColor = _interopRequireDefault(require("./lib/isHexColor"));

var _isRgbColor = _interopRequireDefault(require("./lib/isRgbColor"));

var _isHSL = _interopRequireDefault(require("./lib/isHSL"));

var _isISRC = _interopRequireDefault(require("./lib/isISRC"));

var _isIBAN = _interopRequireWildcard(require("./lib/isIBAN"));

var _isBIC = _interopRequireDefault(require("./lib/isBIC"));

var _isMD = _interopRequireDefault(require("./lib/isMD5"));

var _isHash = _interopRequireDefault(require("./lib/isHash"));

var _isJWT = _interopRequireDefault(require("./lib/isJWT"));

var _isJSON = _interopRequireDefault(require("./lib/isJSON"));

var _isEmpty = _interopRequireDefault(require("./lib/isEmpty"));

var _isLength = _interopRequireDefault(require("./lib/isLength"));

var _isByteLength = _interopRequireDefault(require("./lib/isByteLength"));

var _isUUID = _interopRequireDefault(require("./lib/isUUID"));

var _isMongoId = _interopRequireDefault(require("./lib/isMongoId"));

var _isAfter = _interopRequireDefault(require("./lib/isAfter"));

var _isBefore = _interopRequireDefault(require("./lib/isBefore"));

var _isIn = _interopRequireDefault(require("./lib/isIn"));

var _isCreditCard = _interopRequireDefault(require("./lib/isCreditCard"));

var _isIdentityCard = _interopRequireDefault(require("./lib/isIdentityCard"));

var _isEAN = _interopRequireDefault(require("./lib/isEAN"));

var _isISIN = _interopRequireDefault(require("./lib/isISIN"));

var _isISBN = _interopRequireDefault(require("./lib/isISBN"));

var _isISSN = _interopRequireDefault(require("./lib/isISSN"));

var _isTaxID = _interopRequireDefault(require("./lib/isTaxID"));

var _isMobilePhone = _interopRequireWildcard(require("./lib/isMobilePhone"));

var _isEthereumAddress = _interopRequireDefault(require("./lib/isEthereumAddress"));

var _isCurrency = _interopRequireDefault(require("./lib/isCurrency"));

var _isBtcAddress = _interopRequireDefault(require("./lib/isBtcAddress"));

var _isISO = _interopRequireDefault(require("./lib/isISO8601"));

var _isRFC = _interopRequireDefault(require("./lib/isRFC3339"));

var _isISO31661Alpha = _interopRequireDefault(require("./lib/isISO31661Alpha2"));

var _isISO31661Alpha2 = _interopRequireDefault(require("./lib/isISO31661Alpha3"));

var _isISO2 = _interopRequireDefault(require("./lib/isISO4217"));

var _isBase = _interopRequireDefault(require("./lib/isBase32"));

var _isBase2 = _interopRequireDefault(require("./lib/isBase58"));

var _isBase3 = _interopRequireDefault(require("./lib/isBase64"));

var _isDataURI = _interopRequireDefault(require("./lib/isDataURI"));

var _isMagnetURI = _interopRequireDefault(require("./lib/isMagnetURI"));

var _isMimeType = _interopRequireDefault(require("./lib/isMimeType"));

var _isLatLong = _interopRequireDefault(require("./lib/isLatLong"));

var _isPostalCode = _interopRequireWildcard(require("./lib/isPostalCode"));

var _ltrim = _interopRequireDefault(require("./lib/ltrim"));

var _rtrim = _interopRequireDefault(require("./lib/rtrim"));

var _trim = _interopRequireDefault(require("./lib/trim"));

var _escape = _interopRequireDefault(require("./lib/escape"));

var _unescape = _interopRequireDefault(require("./lib/unescape"));

var _stripLow = _interopRequireDefault(require("./lib/stripLow"));

var _whitelist = _interopRequireDefault(require("./lib/whitelist"));

var _blacklist = _interopRequireDefault(require("./lib/blacklist"));

var _isWhitelisted = _interopRequireDefault(require("./lib/isWhitelisted"));

var _normalizeEmail = _interopRequireDefault(require("./lib/normalizeEmail"));

var _isSlug = _interopRequireDefault(require("./lib/isSlug"));

var _isLicensePlate = _interopRequireDefault(require("./lib/isLicensePlate"));

var _isStrongPassword = _interopRequireDefault(require("./lib/isStrongPassword"));

var _isVAT = _interopRequireDefault(require("./lib/isVAT"));

function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var version = '13.7.0';
var validator = {
  version: version,
  toDate: _toDate.default,
  toFloat: _toFloat.default,
  toInt: _toInt.default,
  toBoolean: _toBoolean.default,
  equals: _equals.default,
  contains: _contains.default,
  matches: _matches.default,
  isEmail: _isEmail.default,
  isURL: _isURL.default,
  isMACAddress: _isMACAddress.default,
  isIP: _isIP.default,
  isIPRange: _isIPRange.default,
  isFQDN: _isFQDN.default,
  isBoolean: _isBoolean.default,
  isIBAN: _isIBAN.default,
  isBIC: _isBIC.default,
  isAlpha: _isAlpha.default,
  isAlphaLocales: _isAlpha.locales,
  isAlphanumeric: _isAlphanumeric.default,
  isAlphanumericLocales: _isAlphanumeric.locales,
  isNumeric: _isNumeric.default,
  isPassportNumber: _isPassportNumber.default,
  isPort: _isPort.default,
  isLowercase: _isLowercase.default,
  isUppercase: _isUppercase.default,
  isAscii: _isAscii.default,
  isFullWidth: _isFullWidth.default,
  isHalfWidth: _isHalfWidth.default,
  isVariableWidth: _isVariableWidth.default,
  isMultibyte: _isMultibyte.default,
  isSemVer: _isSemVer.default,
  isSurrogatePair: _isSurrogatePair.default,
  isInt: _isInt.default,
  isIMEI: _isIMEI.default,
  isFloat: _isFloat.default,
  isFloatLocales: _isFloat.locales,
  isDecimal: _isDecimal.default,
  isHexadecimal: _isHexadecimal.default,
  isOctal: _isOctal.default,
  isDivisibleBy: _isDivisibleBy.default,
  isHexColor: _isHexColor.default,
  isRgbColor: _isRgbColor.default,
  isHSL: _isHSL.default,
  isISRC: _isISRC.default,
  isMD5: _isMD.default,
  isHash: _isHash.default,
  isJWT: _isJWT.default,
  isJSON: _isJSON.default,
  isEmpty: _isEmpty.default,
  isLength: _isLength.default,
  isLocale: _isLocale.default,
  isByteLength: _isByteLength.default,
  isUUID: _isUUID.default,
  isMongoId: _isMongoId.default,
  isAfter: _isAfter.default,
  isBefore: _isBefore.default,
  isIn: _isIn.default,
  isCreditCard: _isCreditCard.default,
  isIdentityCard: _isIdentityCard.default,
  isEAN: _isEAN.default,
  isISIN: _isISIN.default,
  isISBN: _isISBN.default,
  isISSN: _isISSN.default,
  isMobilePhone: _isMobilePhone.default,
  isMobilePhoneLocales: _isMobilePhone.locales,
  isPostalCode: _isPostalCode.default,
  isPostalCodeLocales: _isPostalCode.locales,
  isEthereumAddress: _isEthereumAddress.default,
  isCurrency: _isCurrency.default,
  isBtcAddress: _isBtcAddress.default,
  isISO8601: _isISO.default,
  isRFC3339: _isRFC.default,
  isISO31661Alpha2: _isISO31661Alpha.default,
  isISO31661Alpha3: _isISO31661Alpha2.default,
  isISO4217: _isISO2.default,
  isBase32: _isBase.default,
  isBase58: _isBase2.default,
  isBase64: _isBase3.default,
  isDataURI: _isDataURI.default,
  isMagnetURI: _isMagnetURI.default,
  isMimeType: _isMimeType.default,
  isLatLong: _isLatLong.default,
  ltrim: _ltrim.default,
  rtrim: _rtrim.default,
  trim: _trim.default,
  escape: _escape.default,
  unescape: _unescape.default,
  stripLow: _stripLow.default,
  whitelist: _whitelist.default,
  blacklist: _blacklist.default,
  isWhitelisted: _isWhitelisted.default,
  normalizeEmail: _normalizeEmail.default,
  toString: toString,
  isSlug: _isSlug.default,
  isStrongPassword: _isStrongPassword.default,
  isTaxID: _isTaxID.default,
  isDate: _isDate.default,
  isLicensePlate: _isLicensePlate.default,
  isVAT: _isVAT.default,
  ibanLocales: _isIBAN.locales
};
var _default = validator;
exports.default = _default;
module.exports = exports.default;
module.exports.default = exports.default;{
  "name": "validator",
  "description": "String validation and sanitization",
  "version": "13.7.0",
  "sideEffects": false,
  "homepage": "https://github.com/validatorjs/validator.js",
  "files": [
    "index.js",
    "es",
    "lib",
    "README.md",
    "LICENCE",
    "validator.js",
    "validator.min.js"
  ],
  "author": "Chris O'Hara <cohara87@gmail.com>",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/validatorjs/validator.js.git"
  },
  "devDependencies": {
    "@babel/cli": "^7.0.0",
    "@babel/core": "^7.0.0",
    "@babel/preset-env": "^7.0.0",
    "@babel/register": "^7.0.0",
    "babel-eslint": "^10.0.1",
    "babel-plugin-add-module-exports": "^1.0.0",
    "eslint": "^4.19.1",
    "eslint-config-airbnb-base": "^12.1.0",
    "eslint-plugin-import": "^2.11.0",
    "mocha": "^6.2.3",
    "npm-run-all": "^4.1.5",
    "nyc": "^14.1.0",
    "rimraf": "^3.0.0",
    "rollup": "^0.47.0",
    "rollup-plugin-babel": "^4.0.1",
    "uglify-js": "^3.0.19"
  },
  "engines": {
    "node": ">= 0.10"
  },
  "license": "MIT"
}/*!
 * Copyright (c) 2018 Chris O'Hara <cohara87@gmail.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.
 */
(function (global, factory) {
	typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
	typeof define === 'function' && define.amd ? define(factory) :
	(global.validator = factory());
}(this, (function () { 'use strict';

function _typeof(obj) {
  "@babel/helpers - typeof";

  if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
    _typeof = function (obj) {
      return typeof obj;
    };
  } else {
    _typeof = function (obj) {
      return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
    };
  }

  return _typeof(obj);
}

function _slicedToArray(arr, i) {
  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
}

function _toConsumableArray(arr) {
  return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
}

function _arrayWithoutHoles(arr) {
  if (Array.isArray(arr)) return _arrayLikeToArray(arr);
}

function _arrayWithHoles(arr) {
  if (Array.isArray(arr)) return arr;
}

function _iterableToArray(iter) {
  if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter);
}

function _iterableToArrayLimit(arr, i) {
  if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;
  var _arr = [];
  var _n = true;
  var _d = false;
  var _e = undefined;

  try {
    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
      _arr.push(_s.value);

      if (i && _arr.length === i) break;
    }
  } catch (err) {
    _d = true;
    _e = err;
  } finally {
    try {
      if (!_n && _i["return"] != null) _i["return"]();
    } finally {
      if (_d) throw _e;
    }
  }

  return _arr;
}

function _unsupportedIterableToArray(o, minLen) {
  if (!o) return;
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);
  var n = Object.prototype.toString.call(o).slice(8, -1);
  if (n === "Object" && o.constructor) n = o.constructor.name;
  if (n === "Map" || n === "Set") return Array.from(o);
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}

function _arrayLikeToArray(arr, len) {
  if (len == null || len > arr.length) len = arr.length;

  for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];

  return arr2;
}

function _nonIterableSpread() {
  throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}

function _nonIterableRest() {
  throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}

function _createForOfIteratorHelper(o, allowArrayLike) {
  var it;

  if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) {
    if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
      if (it) o = it;
      var i = 0;

      var F = function () {};

      return {
        s: F,
        n: function () {
          if (i >= o.length) return {
            done: true
          };
          return {
            done: false,
            value: o[i++]
          };
        },
        e: function (e) {
          throw e;
        },
        f: F
      };
    }

    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  }

  var normalCompletion = true,
      didErr = false,
      err;
  return {
    s: function () {
      it = o[Symbol.iterator]();
    },
    n: function () {
      var step = it.next();
      normalCompletion = step.done;
      return step;
    },
    e: function (e) {
      didErr = true;
      err = e;
    },
    f: function () {
      try {
        if (!normalCompletion && it.return != null) it.return();
      } finally {
        if (didErr) throw err;
      }
    }
  };
}

function assertString(input) {
  var isString = typeof input === 'string' || input instanceof String;

  if (!isString) {
    var invalidType = _typeof(input);

    if (input === null) invalidType = 'null';else if (invalidType === 'object') invalidType = input.constructor.name;
    throw new TypeError("Expected a string but received a ".concat(invalidType));
  }
}

function toDate(date) {
  assertString(date);
  date = Date.parse(date);
  return !isNaN(date) ? new Date(date) : null;
}

var alpha = {
  'en-US': /^[A-Z]+$/i,
  'az-AZ': /^[A-VXYZÇƏĞİıÖŞÜ]+$/i,
  'bg-BG': /^[А-Я]+$/i,
  'cs-CZ': /^[A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]+$/i,
  'da-DK': /^[A-ZÆØÅ]+$/i,
  'de-DE': /^[A-ZÄÖÜß]+$/i,
  'el-GR': /^[Α-ώ]+$/i,
  'es-ES': /^[A-ZÁÉÍÑÓÚÜ]+$/i,
  'fa-IR': /^[ابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی]+$/i,
  'fi-FI': /^[A-ZÅÄÖ]+$/i,
  'fr-FR': /^[A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i,
  'it-IT': /^[A-ZÀÉÈÌÎÓÒÙ]+$/i,
  'nb-NO': /^[A-ZÆØÅ]+$/i,
  'nl-NL': /^[A-ZÁÉËÏÓÖÜÚ]+$/i,
  'nn-NO': /^[A-ZÆØÅ]+$/i,
  'hu-HU': /^[A-ZÁÉÍÓÖŐÚÜŰ]+$/i,
  'pl-PL': /^[A-ZĄĆĘŚŁŃÓŻŹ]+$/i,
  'pt-PT': /^[A-ZÃÁÀÂÄÇÉÊËÍÏÕÓÔÖÚÜ]+$/i,
  'ru-RU': /^[А-ЯЁ]+$/i,
  'sl-SI': /^[A-ZČĆĐŠŽ]+$/i,
  'sk-SK': /^[A-ZÁČĎÉÍŇÓŠŤÚÝŽĹŔĽÄÔ]+$/i,
  'sr-RS@latin': /^[A-ZČĆŽŠĐ]+$/i,
  'sr-RS': /^[А-ЯЂЈЉЊЋЏ]+$/i,
  'sv-SE': /^[A-ZÅÄÖ]+$/i,
  'th-TH': /^[ก-๐\s]+$/i,
  'tr-TR': /^[A-ZÇĞİıÖŞÜ]+$/i,
  'uk-UA': /^[А-ЩЬЮЯЄIЇҐі]+$/i,
  'vi-VN': /^[A-ZÀÁẠẢÃÂẦẤẬẨẪĂẰẮẶẲẴĐÈÉẸẺẼÊỀẾỆỂỄÌÍỊỈĨÒÓỌỎÕÔỒỐỘỔỖƠỜỚỢỞỠÙÚỤỦŨƯỪỨỰỬỮỲÝỴỶỸ]+$/i,
  'ku-IQ': /^[ئابپتجچحخدرڕزژسشعغفڤقکگلڵمنوۆھەیێيطؤثآإأكضصةظذ]+$/i,
  ar: /^[ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]+$/,
  he: /^[א-ת]+$/,
  fa: /^['آاءأؤئبپتثجچحخدذرزژسشصضطظعغفقکگلمنوهةی']+$/i,
  'hi-IN': /^[\u0900-\u0961]+[\u0972-\u097F]*$/i
};
var alphanumeric = {
  'en-US': /^[0-9A-Z]+$/i,
  'az-AZ': /^[0-9A-VXYZÇƏĞİıÖŞÜ]+$/i,
  'bg-BG': /^[0-9А-Я]+$/i,
  'cs-CZ': /^[0-9A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]+$/i,
  'da-DK': /^[0-9A-ZÆØÅ]+$/i,
  'de-DE': /^[0-9A-ZÄÖÜß]+$/i,
  'el-GR': /^[0-9Α-ω]+$/i,
  'es-ES': /^[0-9A-ZÁÉÍÑÓÚÜ]+$/i,
  'fi-FI': /^[0-9A-ZÅÄÖ]+$/i,
  'fr-FR': /^[0-9A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i,
  'it-IT': /^[0-9A-ZÀÉÈÌÎÓÒÙ]+$/i,
  'hu-HU': /^[0-9A-ZÁÉÍÓÖŐÚÜŰ]+$/i,
  'nb-NO': /^[0-9A-ZÆØÅ]+$/i,
  'nl-NL': /^[0-9A-ZÁÉËÏÓÖÜÚ]+$/i,
  'nn-NO': /^[0-9A-ZÆØÅ]+$/i,
  'pl-PL': /^[0-9A-ZĄĆĘŚŁŃÓŻŹ]+$/i,
  'pt-PT': /^[0-9A-ZÃÁÀÂÄÇÉÊËÍÏÕÓÔÖÚÜ]+$/i,
  'ru-RU': /^[0-9А-ЯЁ]+$/i,
  'sl-SI': /^[0-9A-ZČĆĐŠŽ]+$/i,
  'sk-SK': /^[0-9A-ZÁČĎÉÍŇÓŠŤÚÝŽĹŔĽÄÔ]+$/i,
  'sr-RS@latin': /^[0-9A-ZČĆŽŠĐ]+$/i,
  'sr-RS': /^[0-9А-ЯЂЈЉЊЋЏ]+$/i,
  'sv-SE': /^[0-9A-ZÅÄÖ]+$/i,
  'th-TH': /^[ก-๙\s]+$/i,
  'tr-TR': /^[0-9A-ZÇĞİıÖŞÜ]+$/i,
  'uk-UA': /^[0-9А-ЩЬЮЯЄIЇҐі]+$/i,
  'ku-IQ': /^[٠١٢٣٤٥٦٧٨٩0-9ئابپتجچحخدرڕزژسشعغفڤقکگلڵمنوۆھەیێيطؤثآإأكضصةظذ]+$/i,
  'vi-VN': /^[0-9A-ZÀÁẠẢÃÂẦẤẬẨẪĂẰẮẶẲẴĐÈÉẸẺẼÊỀẾỆỂỄÌÍỊỈĨÒÓỌỎÕÔỒỐỘỔỖƠỜỚỢỞỠÙÚỤỦŨƯỪỨỰỬỮỲÝỴỶỸ]+$/i,
  ar: /^[٠١٢٣٤٥٦٧٨٩0-9ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]+$/,
  he: /^[0-9א-ת]+$/,
  fa: /^['0-9آاءأؤئبپتثجچحخدذرزژسشصضطظعغفقکگلمنوهةی۱۲۳۴۵۶۷۸۹۰']+$/i,
  'hi-IN': /^[\u0900-\u0963]+[\u0966-\u097F]*$/i
};
var decimal = {
  'en-US': '.',
  ar: '٫'
};
var englishLocales = ['AU', 'GB', 'HK', 'IN', 'NZ', 'ZA', 'ZM'];

for (var locale, i = 0; i < englishLocales.length; i++) {
  locale = "en-".concat(englishLocales[i]);
  alpha[locale] = alpha['en-US'];
  alphanumeric[locale] = alphanumeric['en-US'];
  decimal[locale] = decimal['en-US'];
} // Source: http://www.localeplanet.com/java/


var arabicLocales = ['AE', 'BH', 'DZ', 'EG', 'IQ', 'JO', 'KW', 'LB', 'LY', 'MA', 'QM', 'QA', 'SA', 'SD', 'SY', 'TN', 'YE'];

for (var _locale, _i = 0; _i < arabicLocales.length; _i++) {
  _locale = "ar-".concat(arabicLocales[_i]);
  alpha[_locale] = alpha.ar;
  alphanumeric[_locale] = alphanumeric.ar;
  decimal[_locale] = decimal.ar;
}

var farsiLocales = ['IR', 'AF'];

for (var _locale2, _i2 = 0; _i2 < farsiLocales.length; _i2++) {
  _locale2 = "fa-".concat(farsiLocales[_i2]);
  alphanumeric[_locale2] = alphanumeric.fa;
  decimal[_locale2] = decimal.ar;
} // Source: https://en.wikipedia.org/wiki/Decimal_mark


var dotDecimal = ['ar-EG', 'ar-LB', 'ar-LY'];
var commaDecimal = ['bg-BG', 'cs-CZ', 'da-DK', 'de-DE', 'el-GR', 'en-ZM', 'es-ES', 'fr-CA', 'fr-FR', 'id-ID', 'it-IT', 'ku-IQ', 'hi-IN', 'hu-HU', 'nb-NO', 'nn-NO', 'nl-NL', 'pl-PL', 'pt-PT', 'ru-RU', 'sl-SI', 'sr-RS@latin', 'sr-RS', 'sv-SE', 'tr-TR', 'uk-UA', 'vi-VN'];

for (var _i3 = 0; _i3 < dotDecimal.length; _i3++) {
  decimal[dotDecimal[_i3]] = decimal['en-US'];
}

for (var _i4 = 0; _i4 < commaDecimal.length; _i4++) {
  decimal[commaDecimal[_i4]] = ',';
}

alpha['fr-CA'] = alpha['fr-FR'];
alphanumeric['fr-CA'] = alphanumeric['fr-FR'];
alpha['pt-BR'] = alpha['pt-PT'];
alphanumeric['pt-BR'] = alphanumeric['pt-PT'];
decimal['pt-BR'] = decimal['pt-PT']; // see #862

alpha['pl-Pl'] = alpha['pl-PL'];
alphanumeric['pl-Pl'] = alphanumeric['pl-PL'];
decimal['pl-Pl'] = decimal['pl-PL']; // see #1455

alpha['fa-AF'] = alpha.fa;

function isFloat(str, options) {
  assertString(str);
  options = options || {};

  var _float = new RegExp("^(?:[-+])?(?:[0-9]+)?(?:\\".concat(options.locale ? decimal[options.locale] : '.', "[0-9]*)?(?:[eE][\\+\\-]?(?:[0-9]+))?$"));

  if (str === '' || str === '.' || str === '-' || str === '+') {
    return false;
  }

  var value = parseFloat(str.replace(',', '.'));
  return _float.test(str) && (!options.hasOwnProperty('min') || value >= options.min) && (!options.hasOwnProperty('max') || value <= options.max) && (!options.hasOwnProperty('lt') || value < options.lt) && (!options.hasOwnProperty('gt') || value > options.gt);
}
var locales = Object.keys(decimal);

function toFloat(str) {
  if (!isFloat(str)) return NaN;
  return parseFloat(str);
}

function toInt(str, radix) {
  assertString(str);
  return parseInt(str, radix || 10);
}

function toBoolean(str, strict) {
  assertString(str);

  if (strict) {
    return str === '1' || /^true$/i.test(str);
  }

  return str !== '0' && !/^false$/i.test(str) && str !== '';
}

function equals(str, comparison) {
  assertString(str);
  return str === comparison;
}

function toString$1(input) {
  if (_typeof(input) === 'object' && input !== null) {
    if (typeof input.toString === 'function') {
      input = input.toString();
    } else {
      input = '[object Object]';
    }
  } else if (input === null || typeof input === 'undefined' || isNaN(input) && !input.length) {
    input = '';
  }

  return String(input);
}

function merge() {
  var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  var defaults = arguments.length > 1 ? arguments[1] : undefined;

  for (var key in defaults) {
    if (typeof obj[key] === 'undefined') {
      obj[key] = defaults[key];
    }
  }

  return obj;
}

var defaulContainsOptions = {
  ignoreCase: false,
  minOccurrences: 1
};
function contains(str, elem, options) {
  assertString(str);
  options = merge(options, defaulContainsOptions);

  if (options.ignoreCase) {
    return str.toLowerCase().split(toString$1(elem).toLowerCase()).length > options.minOccurrences;
  }

  return str.split(toString$1(elem)).length > options.minOccurrences;
}

function matches(str, pattern, modifiers) {
  assertString(str);

  if (Object.prototype.toString.call(pattern) !== '[object RegExp]') {
    pattern = new RegExp(pattern, modifiers);
  }

  return pattern.test(str);
}

/* eslint-disable prefer-rest-params */

function isByteLength(str, options) {
  assertString(str);
  var min;
  var max;

  if (_typeof(options) === 'object') {
    min = options.min || 0;
    max = options.max;
  } else {
    // backwards compatibility: isByteLength(str, min [, max])
    min = arguments[1];
    max = arguments[2];
  }

  var len = encodeURI(str).split(/%..|./).length - 1;
  return len >= min && (typeof max === 'undefined' || len <= max);
}

var default_fqdn_options = {
  require_tld: true,
  allow_underscores: false,
  allow_trailing_dot: false,
  allow_numeric_tld: false,
  allow_wildcard: false
};
function isFQDN(str, options) {
  assertString(str);
  options = merge(options, default_fqdn_options);
  /* Remove the optional trailing dot before checking validity */

  if (options.allow_trailing_dot && str[str.length - 1] === '.') {
    str = str.substring(0, str.length - 1);
  }
  /* Remove the optional wildcard before checking validity */


  if (options.allow_wildcard === true && str.indexOf('*.') === 0) {
    str = str.substring(2);
  }

  var parts = str.split('.');
  var tld = parts[parts.length - 1];

  if (options.require_tld) {
    // disallow fqdns without tld
    if (parts.length < 2) {
      return false;
    }

    if (!/^([a-z\u00A1-\u00A8\u00AA-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]{2,}|xn[a-z0-9-]{2,})$/i.test(tld)) {
      return false;
    } // disallow spaces


    if (/\s/.test(tld)) {
      return false;
    }
  } // reject numeric TLDs


  if (!options.allow_numeric_tld && /^\d+$/.test(tld)) {
    return false;
  }

  return parts.every(function (part) {
    if (part.length > 63) {
      return false;
    }

    if (!/^[a-z_\u00a1-\uffff0-9-]+$/i.test(part)) {
      return false;
    } // disallow full-width chars


    if (/[\uff01-\uff5e]/.test(part)) {
      return false;
    } // disallow parts starting or ending with hyphen


    if (/^-|-$/.test(part)) {
      return false;
    }

    if (!options.allow_underscores && /_/.test(part)) {
      return false;
    }

    return true;
  });
}

/**
11.3.  Examples

   The following addresses

             fe80::1234 (on the 1st link of the node)
             ff02::5678 (on the 5th link of the node)
             ff08::9abc (on the 10th organization of the node)

   would be represented as follows:

             fe80::1234%1
             ff02::5678%5
             ff08::9abc%10

   (Here we assume a natural translation from a zone index to the
   <zone_id> part, where the Nth zone of any scope is translated into
   "N".)

   If we use interface names as <zone_id>, those addresses could also be
   represented as follows:

            fe80::1234%ne0
            ff02::5678%pvc1.3
            ff08::9abc%interface10

   where the interface "ne0" belongs to the 1st link, "pvc1.3" belongs
   to the 5th link, and "interface10" belongs to the 10th organization.
 * * */

var IPv4SegmentFormat = '(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';
var IPv4AddressFormat = "(".concat(IPv4SegmentFormat, "[.]){3}").concat(IPv4SegmentFormat);
var IPv4AddressRegExp = new RegExp("^".concat(IPv4AddressFormat, "$"));
var IPv6SegmentFormat = '(?:[0-9a-fA-F]{1,4})';
var IPv6AddressRegExp = new RegExp('^(' + "(?:".concat(IPv6SegmentFormat, ":){7}(?:").concat(IPv6SegmentFormat, "|:)|") + "(?:".concat(IPv6SegmentFormat, ":){6}(?:").concat(IPv4AddressFormat, "|:").concat(IPv6SegmentFormat, "|:)|") + "(?:".concat(IPv6SegmentFormat, ":){5}(?::").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,2}|:)|") + "(?:".concat(IPv6SegmentFormat, ":){4}(?:(:").concat(IPv6SegmentFormat, "){0,1}:").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,3}|:)|") + "(?:".concat(IPv6SegmentFormat, ":){3}(?:(:").concat(IPv6SegmentFormat, "){0,2}:").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,4}|:)|") + "(?:".concat(IPv6SegmentFormat, ":){2}(?:(:").concat(IPv6SegmentFormat, "){0,3}:").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,5}|:)|") + "(?:".concat(IPv6SegmentFormat, ":){1}(?:(:").concat(IPv6SegmentFormat, "){0,4}:").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,6}|:)|") + "(?::((?::".concat(IPv6SegmentFormat, "){0,5}:").concat(IPv4AddressFormat, "|(?::").concat(IPv6SegmentFormat, "){1,7}|:))") + ')(%[0-9a-zA-Z-.:]{1,})?$');
function isIP(str) {
  var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
  assertString(str);
  version = String(version);

  if (!version) {
    return isIP(str, 4) || isIP(str, 6);
  }

  if (version === '4') {
    if (!IPv4AddressRegExp.test(str)) {
      return false;
    }

    var parts = str.split('.').sort(function (a, b) {
      return a - b;
    });
    return parts[3] <= 255;
  }

  if (version === '6') {
    return !!IPv6AddressRegExp.test(str);
  }

  return false;
}

var default_email_options = {
  allow_display_name: false,
  require_display_name: false,
  allow_utf8_local_part: true,
  require_tld: true,
  blacklisted_chars: '',
  ignore_max_length: false,
  host_blacklist: []
};
/* eslint-disable max-len */

/* eslint-disable no-control-regex */

var splitNameAddress = /^([^\x00-\x1F\x7F-\x9F\cX]+)</i;
var emailUserPart = /^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~]+$/i;
var gmailUserPart = /^[a-z\d]+$/;
var quotedEmailUser = /^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f]))*$/i;
var emailUserUtf8Part = /^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+$/i;
var quotedEmailUserUtf8 = /^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))*$/i;
var defaultMaxEmailLength = 254;
/* eslint-enable max-len */

/* eslint-enable no-control-regex */

/**
 * Validate display name according to the RFC2822: https://tools.ietf.org/html/rfc2822#appendix-A.1.2
 * @param {String} display_name
 */

function validateDisplayName(display_name) {
  var display_name_without_quotes = display_name.replace(/^"(.+)"$/, '$1'); // display name with only spaces is not valid

  if (!display_name_without_quotes.trim()) {
    return false;
  } // check whether display name contains illegal character


  var contains_illegal = /[\.";<>]/.test(display_name_without_quotes);

  if (contains_illegal) {
    // if contains illegal characters,
    // must to be enclosed in double-quotes, otherwise it's not a valid display name
    if (display_name_without_quotes === display_name) {
      return false;
    } // the quotes in display name must start with character symbol \


    var all_start_with_back_slash = display_name_without_quotes.split('"').length === display_name_without_quotes.split('\\"').length;

    if (!all_start_with_back_slash) {
      return false;
    }
  }

  return true;
}

function isEmail(str, options) {
  assertString(str);
  options = merge(options, default_email_options);

  if (options.require_display_name || options.allow_display_name) {
    var display_email = str.match(splitNameAddress);

    if (display_email) {
      var display_name = display_email[1]; // Remove display name and angle brackets to get email address
      // Can be done in the regex but will introduce a ReDOS (See  #1597 for more info)

      str = str.replace(display_name, '').replace(/(^<|>$)/g, ''); // sometimes need to trim the last space to get the display name
      // because there may be a space between display name and email address
      // eg. myname <address@gmail.com>
      // the display name is `myname` instead of `myname `, so need to trim the last space

      if (display_name.endsWith(' ')) {
        display_name = display_name.substr(0, display_name.length - 1);
      }

      if (!validateDisplayName(display_name)) {
        return false;
      }
    } else if (options.require_display_name) {
      return false;
    }
  }

  if (!options.ignore_max_length && str.length > defaultMaxEmailLength) {
    return false;
  }

  var parts = str.split('@');
  var domain = parts.pop();
  var lower_domain = domain.toLowerCase();

  if (options.host_blacklist.includes(lower_domain)) {
    return false;
  }

  var user = parts.join('@');

  if (options.domain_specific_validation && (lower_domain === 'gmail.com' || lower_domain === 'googlemail.com')) {
    /*
      Previously we removed dots for gmail addresses before validating.
      This was removed because it allows `multiple..dots@gmail.com`
      to be reported as valid, but it is not.
      Gmail only normalizes single dots, removing them from here is pointless,
      should be done in normalizeEmail
    */
    user = user.toLowerCase(); // Removing sub-address from username before gmail validation

    var username = user.split('+')[0]; // Dots are not included in gmail length restriction

    if (!isByteLength(username.replace(/\./g, ''), {
      min: 6,
      max: 30
    })) {
      return false;
    }

    var _user_parts = username.split('.');

    for (var i = 0; i < _user_parts.length; i++) {
      if (!gmailUserPart.test(_user_parts[i])) {
        return false;
      }
    }
  }

  if (options.ignore_max_length === false && (!isByteLength(user, {
    max: 64
  }) || !isByteLength(domain, {
    max: 254
  }))) {
    return false;
  }

  if (!isFQDN(domain, {
    require_tld: options.require_tld
  })) {
    if (!options.allow_ip_domain) {
      return false;
    }

    if (!isIP(domain)) {
      if (!domain.startsWith('[') || !domain.endsWith(']')) {
        return false;
      }

      var noBracketdomain = domain.substr(1, domain.length - 2);

      if (noBracketdomain.length === 0 || !isIP(noBracketdomain)) {
        return false;
      }
    }
  }

  if (user[0] === '"') {
    user = user.slice(1, user.length - 1);
    return options.allow_utf8_local_part ? quotedEmailUserUtf8.test(user) : quotedEmailUser.test(user);
  }

  var pattern = options.allow_utf8_local_part ? emailUserUtf8Part : emailUserPart;
  var user_parts = user.split('.');

  for (var _i = 0; _i < user_parts.length; _i++) {
    if (!pattern.test(user_parts[_i])) {
      return false;
    }
  }

  if (options.blacklisted_chars) {
    if (user.search(new RegExp("[".concat(options.blacklisted_chars, "]+"), 'g')) !== -1) return false;
  }

  return true;
}

/*
options for isURL method

require_protocol - if set as true isURL will return false if protocol is not present in the URL
require_valid_protocol - isURL will check if the URL's protocol is present in the protocols option
protocols - valid protocols can be modified with this option
require_host - if set as false isURL will not check if host is present in the URL
require_port - if set as true isURL will check if port is present in the URL
allow_protocol_relative_urls - if set as true protocol relative URLs will be allowed
validate_length - if set as false isURL will skip string length validation (IE maximum is 2083)

*/

var default_url_options = {
  protocols: ['http', 'https', 'ftp'],
  require_tld: true,
  require_protocol: false,
  require_host: true,
  require_port: false,
  require_valid_protocol: true,
  allow_underscores: false,
  allow_trailing_dot: false,
  allow_protocol_relative_urls: false,
  allow_fragments: true,
  allow_query_components: true,
  validate_length: true
};
var wrapped_ipv6 = /^\[([^\]]+)\](?::([0-9]+))?$/;

function isRegExp(obj) {
  return Object.prototype.toString.call(obj) === '[object RegExp]';
}

function checkHost(host, matches) {
  for (var i = 0; i < matches.length; i++) {
    var match = matches[i];

    if (host === match || isRegExp(match) && match.test(host)) {
      return true;
    }
  }

  return false;
}

function isURL(url, options) {
  assertString(url);

  if (!url || /[\s<>]/.test(url)) {
    return false;
  }

  if (url.indexOf('mailto:') === 0) {
    return false;
  }

  options = merge(options, default_url_options);

  if (options.validate_length && url.length >= 2083) {
    return false;
  }

  if (!options.allow_fragments && url.includes('#')) {
    return false;
  }

  if (!options.allow_query_components && (url.includes('?') || url.includes('&'))) {
    return false;
  }

  var protocol, auth, host, hostname, port, port_str, split, ipv6;
  split = url.split('#');
  url = split.shift();
  split = url.split('?');
  url = split.shift();
  split = url.split('://');

  if (split.length > 1) {
    protocol = split.shift().toLowerCase();

    if (options.require_valid_protocol && options.protocols.indexOf(protocol) === -1) {
      return false;
    }
  } else if (options.require_protocol) {
    return false;
  } else if (url.substr(0, 2) === '//') {
    if (!options.allow_protocol_relative_urls) {
      return false;
    }

    split[0] = url.substr(2);
  }

  url = split.join('://');

  if (url === '') {
    return false;
  }

  split = url.split('/');
  url = split.shift();

  if (url === '' && !options.require_host) {
    return true;
  }

  split = url.split('@');

  if (split.length > 1) {
    if (options.disallow_auth) {
      return false;
    }

    if (split[0] === '') {
      return false;
    }

    auth = split.shift();

    if (auth.indexOf(':') >= 0 && auth.split(':').length > 2) {
      return false;
    }

    var _auth$split = auth.split(':'),
        _auth$split2 = _slicedToArray(_auth$split, 2),
        user = _auth$split2[0],
        password = _auth$split2[1];

    if (user === '' && password === '') {
      return false;
    }
  }

  hostname = split.join('@');
  port_str = null;
  ipv6 = null;
  var ipv6_match = hostname.match(wrapped_ipv6);

  if (ipv6_match) {
    host = '';
    ipv6 = ipv6_match[1];
    port_str = ipv6_match[2] || null;
  } else {
    split = hostname.split(':');
    host = split.shift();

    if (split.length) {
      port_str = split.join(':');
    }
  }

  if (port_str !== null && port_str.length > 0) {
    port = parseInt(port_str, 10);

    if (!/^[0-9]+$/.test(port_str) || port <= 0 || port > 65535) {
      return false;
    }
  } else if (options.require_port) {
    return false;
  }

  if (options.host_whitelist) {
    return checkHost(host, options.host_whitelist);
  }

  if (!isIP(host) && !isFQDN(host, options) && (!ipv6 || !isIP(ipv6, 6))) {
    return false;
  }

  host = host || ipv6;

  if (options.host_blacklist && checkHost(host, options.host_blacklist)) {
    return false;
  }

  return true;
}

var macAddress = /^(?:[0-9a-fA-F]{2}([-:\s]))([0-9a-fA-F]{2}\1){4}([0-9a-fA-F]{2})$/;
var macAddressNoSeparators = /^([0-9a-fA-F]){12}$/;
var macAddressWithDots = /^([0-9a-fA-F]{4}\.){2}([0-9a-fA-F]{4})$/;
function isMACAddress(str, options) {
  assertString(str);
  /**
   * @deprecated `no_colons` TODO: remove it in the next major
  */

  if (options && (options.no_colons || options.no_separators)) {
    return macAddressNoSeparators.test(str);
  }

  return macAddress.test(str) || macAddressWithDots.test(str);
}

var subnetMaybe = /^\d{1,3}$/;
var v4Subnet = 32;
var v6Subnet = 128;
function isIPRange(str) {
  var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
  assertString(str);
  var parts = str.split('/'); // parts[0] -> ip, parts[1] -> subnet

  if (parts.length !== 2) {
    return false;
  }

  if (!subnetMaybe.test(parts[1])) {
    return false;
  } // Disallow preceding 0 i.e. 01, 02, ...


  if (parts[1].length > 1 && parts[1].startsWith('0')) {
    return false;
  }

  var isValidIP = isIP(parts[0], version);

  if (!isValidIP) {
    return false;
  } // Define valid subnet according to IP's version


  var expectedSubnet = null;

  switch (String(version)) {
    case '4':
      expectedSubnet = v4Subnet;
      break;

    case '6':
      expectedSubnet = v6Subnet;
      break;

    default:
      expectedSubnet = isIP(parts[0], '6') ? v6Subnet : v4Subnet;
  }

  return parts[1] <= expectedSubnet && parts[1] >= 0;
}

var default_date_options = {
  format: 'YYYY/MM/DD',
  delimiters: ['/', '-'],
  strictMode: false
};

function isValidFormat(format) {
  return /(^(y{4}|y{2})[.\/-](m{1,2})[.\/-](d{1,2})$)|(^(m{1,2})[.\/-](d{1,2})[.\/-]((y{4}|y{2})$))|(^(d{1,2})[.\/-](m{1,2})[.\/-]((y{4}|y{2})$))/gi.test(format);
}

function zip(date, format) {
  var zippedArr = [],
      len = Math.min(date.length, format.length);

  for (var i = 0; i < len; i++) {
    zippedArr.push([date[i], format[i]]);
  }

  return zippedArr;
}

function isDate(input, options) {
  if (typeof options === 'string') {
    // Allow backward compatbility for old format isDate(input [, format])
    options = merge({
      format: options
    }, default_date_options);
  } else {
    options = merge(options, default_date_options);
  }

  if (typeof input === 'string' && isValidFormat(options.format)) {
    var formatDelimiter = options.delimiters.find(function (delimiter) {
      return options.format.indexOf(delimiter) !== -1;
    });
    var dateDelimiter = options.strictMode ? formatDelimiter : options.delimiters.find(function (delimiter) {
      return input.indexOf(delimiter) !== -1;
    });
    var dateAndFormat = zip(input.split(dateDelimiter), options.format.toLowerCase().split(formatDelimiter));
    var dateObj = {};

    var _iterator = _createForOfIteratorHelper(dateAndFormat),
        _step;

    try {
      for (_iterator.s(); !(_step = _iterator.n()).done;) {
        var _step$value = _slicedToArray(_step.value, 2),
            dateWord = _step$value[0],
            formatWord = _step$value[1];

        if (dateWord.length !== formatWord.length) {
          return false;
        }

        dateObj[formatWord.charAt(0)] = dateWord;
      }
    } catch (err) {
      _iterator.e(err);
    } finally {
      _iterator.f();
    }

    return new Date("".concat(dateObj.m, "/").concat(dateObj.d, "/").concat(dateObj.y)).getDate() === +dateObj.d;
  }

  if (!options.strictMode) {
    return Object.prototype.toString.call(input) === '[object Date]' && isFinite(input);
  }

  return false;
}

var defaultOptions = {
  loose: false
};
var strictBooleans = ['true', 'false', '1', '0'];
var looseBooleans = [].concat(strictBooleans, ['yes', 'no']);
function isBoolean(str) {
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultOptions;
  assertString(str);

  if (options.loose) {
    return looseBooleans.includes(str.toLowerCase());
  }

  return strictBooleans.includes(str);
}

var localeReg = /^[A-Za-z]{2,4}([_-]([A-Za-z]{4}|[\d]{3}))?([_-]([A-Za-z]{2}|[\d]{3}))?$/;
function isLocale(str) {
  assertString(str);

  if (str === 'en_US_POSIX' || str === 'ca_ES_VALENCIA') {
    return true;
  }

  return localeReg.test(str);
}

function isAlpha(_str) {
  var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en-US';
  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  assertString(_str);
  var str = _str;
  var ignore = options.ignore;

  if (ignore) {
    if (ignore instanceof RegExp) {
      str = str.replace(ignore, '');
    } else if (typeof ignore === 'string') {
      str = str.replace(new RegExp("[".concat(ignore.replace(/[-[\]{}()*+?.,\\^$|#\\s]/g, '\\$&'), "]"), 'g'), ''); // escape regex for ignore
    } else {
      throw new Error('ignore should be instance of a String or RegExp');
    }
  }

  if (locale in alpha) {
    return alpha[locale].test(str);
  }

  throw new Error("Invalid locale '".concat(locale, "'"));
}
var locales$1 = Object.keys(alpha);

function isAlphanumeric(_str) {
  var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en-US';
  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  assertString(_str);
  var str = _str;
  var ignore = options.ignore;

  if (ignore) {
    if (ignore instanceof RegExp) {
      str = str.replace(ignore, '');
    } else if (typeof ignore === 'string') {
      str = str.replace(new RegExp("[".concat(ignore.replace(/[-[\]{}()*+?.,\\^$|#\\s]/g, '\\$&'), "]"), 'g'), ''); // escape regex for ignore
    } else {
      throw new Error('ignore should be instance of a String or RegExp');
    }
  }

  if (locale in alphanumeric) {
    return alphanumeric[locale].test(str);
  }

  throw new Error("Invalid locale '".concat(locale, "'"));
}
var locales$2 = Object.keys(alphanumeric);

var numericNoSymbols = /^[0-9]+$/;
function isNumeric(str, options) {
  assertString(str);

  if (options && options.no_symbols) {
    return numericNoSymbols.test(str);
  }

  return new RegExp("^[+-]?([0-9]*[".concat((options || {}).locale ? decimal[options.locale] : '.', "])?[0-9]+$")).test(str);
}

/**
 * Reference:
 * https://en.wikipedia.org/ -- Wikipedia
 * https://docs.microsoft.com/en-us/microsoft-365/compliance/eu-passport-number -- EU Passport Number
 * https://countrycode.org/ -- Country Codes
 */

var passportRegexByCountryCode = {
  AM: /^[A-Z]{2}\d{7}$/,
  // ARMENIA
  AR: /^[A-Z]{3}\d{6}$/,
  // ARGENTINA
  AT: /^[A-Z]\d{7}$/,
  // AUSTRIA
  AU: /^[A-Z]\d{7}$/,
  // AUSTRALIA
  BE: /^[A-Z]{2}\d{6}$/,
  // BELGIUM
  BG: /^\d{9}$/,
  // BULGARIA
  BR: /^[A-Z]{2}\d{6}$/,
  // BRAZIL
  BY: /^[A-Z]{2}\d{7}$/,
  // BELARUS
  CA: /^[A-Z]{2}\d{6}$/,
  // CANADA
  CH: /^[A-Z]\d{7}$/,
  // SWITZERLAND
  CN: /^G\d{8}$|^E(?![IO])[A-Z0-9]\d{7}$/,
  // CHINA [G=Ordinary, E=Electronic] followed by 8-digits, or E followed by any UPPERCASE letter (except I and O) followed by 7 digits
  CY: /^[A-Z](\d{6}|\d{8})$/,
  // CYPRUS
  CZ: /^\d{8}$/,
  // CZECH REPUBLIC
  DE: /^[CFGHJKLMNPRTVWXYZ0-9]{9}$/,
  // GERMANY
  DK: /^\d{9}$/,
  // DENMARK
  DZ: /^\d{9}$/,
  // ALGERIA
  EE: /^([A-Z]\d{7}|[A-Z]{2}\d{7})$/,
  // ESTONIA (K followed by 7-digits), e-passports have 2 UPPERCASE followed by 7 digits
  ES: /^[A-Z0-9]{2}([A-Z0-9]?)\d{6}$/,
  // SPAIN
  FI: /^[A-Z]{2}\d{7}$/,
  // FINLAND
  FR: /^\d{2}[A-Z]{2}\d{5}$/,
  // FRANCE
  GB: /^\d{9}$/,
  // UNITED KINGDOM
  GR: /^[A-Z]{2}\d{7}$/,
  // GREECE
  HR: /^\d{9}$/,
  // CROATIA
  HU: /^[A-Z]{2}(\d{6}|\d{7})$/,
  // HUNGARY
  IE: /^[A-Z0-9]{2}\d{7}$/,
  // IRELAND
  IN: /^[A-Z]{1}-?\d{7}$/,
  // INDIA
  ID: /^[A-C]\d{7}$/,
  // INDONESIA
  IR: /^[A-Z]\d{8}$/,
  // IRAN
  IS: /^(A)\d{7}$/,
  // ICELAND
  IT: /^[A-Z0-9]{2}\d{7}$/,
  // ITALY
  JP: /^[A-Z]{2}\d{7}$/,
  // JAPAN
  KR: /^[MS]\d{8}$/,
  // SOUTH KOREA, REPUBLIC OF KOREA, [S=PS Passports, M=PM Passports]
  LT: /^[A-Z0-9]{8}$/,
  // LITHUANIA
  LU: /^[A-Z0-9]{8}$/,
  // LUXEMBURG
  LV: /^[A-Z0-9]{2}\d{7}$/,
  // LATVIA
  LY: /^[A-Z0-9]{8}$/,
  // LIBYA
  MT: /^\d{7}$/,
  // MALTA
  MZ: /^([A-Z]{2}\d{7})|(\d{2}[A-Z]{2}\d{5})$/,
  // MOZAMBIQUE
  MY: /^[AHK]\d{8}$/,
  // MALAYSIA
  NL: /^[A-Z]{2}[A-Z0-9]{6}\d$/,
  // NETHERLANDS
  PL: /^[A-Z]{2}\d{7}$/,
  // POLAND
  PT: /^[A-Z]\d{6}$/,
  // PORTUGAL
  RO: /^\d{8,9}$/,
  // ROMANIA
  RU: /^\d{9}$/,
  // RUSSIAN FEDERATION
  SE: /^\d{8}$/,
  // SWEDEN
  SL: /^(P)[A-Z]\d{7}$/,
  // SLOVANIA
  SK: /^[0-9A-Z]\d{7}$/,
  // SLOVAKIA
  TR: /^[A-Z]\d{8}$/,
  // TURKEY
  UA: /^[A-Z]{2}\d{6}$/,
  // UKRAINE
  US: /^\d{9}$/ // UNITED STATES

};
/**
 * Check if str is a valid passport number
 * relative to provided ISO Country Code.
 *
 * @param {string} str
 * @param {string} countryCode
 * @return {boolean}
 */

function isPassportNumber(str, countryCode) {
  assertString(str);
  /** Remove All Whitespaces, Convert to UPPERCASE */

  var normalizedStr = str.replace(/\s/g, '').toUpperCase();
  return countryCode.toUpperCase() in passportRegexByCountryCode && passportRegexByCountryCode[countryCode].test(normalizedStr);
}

var _int = /^(?:[-+]?(?:0|[1-9][0-9]*))$/;
var intLeadingZeroes = /^[-+]?[0-9]+$/;
function isInt(str, options) {
  assertString(str);
  options = options || {}; // Get the regex to use for testing, based on whether
  // leading zeroes are allowed or not.

  var regex = options.hasOwnProperty('allow_leading_zeroes') && !options.allow_leading_zeroes ? _int : intLeadingZeroes; // Check min/max/lt/gt

  var minCheckPassed = !options.hasOwnProperty('min') || str >= options.min;
  var maxCheckPassed = !options.hasOwnProperty('max') || str <= options.max;
  var ltCheckPassed = !options.hasOwnProperty('lt') || str < options.lt;
  var gtCheckPassed = !options.hasOwnProperty('gt') || str > options.gt;
  return regex.test(str) && minCheckPassed && maxCheckPassed && ltCheckPassed && gtCheckPassed;
}

function isPort(str) {
  return isInt(str, {
    min: 0,
    max: 65535
  });
}

function isLowercase(str) {
  assertString(str);
  return str === str.toLowerCase();
}

function isUppercase(str) {
  assertString(str);
  return str === str.toUpperCase();
}

var imeiRegexWithoutHypens = /^[0-9]{15}$/;
var imeiRegexWithHypens = /^\d{2}-\d{6}-\d{6}-\d{1}$/;
function isIMEI(str, options) {
  assertString(str);
  options = options || {}; // default regex for checking imei is the one without hyphens

  var imeiRegex = imeiRegexWithoutHypens;

  if (options.allow_hyphens) {
    imeiRegex = imeiRegexWithHypens;
  }

  if (!imeiRegex.test(str)) {
    return false;
  }

  str = str.replace(/-/g, '');
  var sum = 0,
      mul = 2,
      l = 14;

  for (var i = 0; i < l; i++) {
    var digit = str.substring(l - i - 1, l - i);
    var tp = parseInt(digit, 10) * mul;

    if (tp >= 10) {
      sum += tp % 10 + 1;
    } else {
      sum += tp;
    }

    if (mul === 1) {
      mul += 1;
    } else {
      mul -= 1;
    }
  }

  var chk = (10 - sum % 10) % 10;

  if (chk !== parseInt(str.substring(14, 15), 10)) {
    return false;
  }

  return true;
}

/* eslint-disable no-control-regex */

var ascii = /^[\x00-\x7F]+$/;
/* eslint-enable no-control-regex */

function isAscii(str) {
  assertString(str);
  return ascii.test(str);
}

var fullWidth = /[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/;
function isFullWidth(str) {
  assertString(str);
  return fullWidth.test(str);
}

var halfWidth = /[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/;
function isHalfWidth(str) {
  assertString(str);
  return halfWidth.test(str);
}

function isVariableWidth(str) {
  assertString(str);
  return fullWidth.test(str) && halfWidth.test(str);
}

/* eslint-disable no-control-regex */

var multibyte = /[^\x00-\x7F]/;
/* eslint-enable no-control-regex */

function isMultibyte(str) {
  assertString(str);
  return multibyte.test(str);
}

/**
 * Build RegExp object from an array
 * of multiple/multi-line regexp parts
 *
 * @param {string[]} parts
 * @param {string} flags
 * @return {object} - RegExp object
 */
function multilineRegexp(parts, flags) {
  var regexpAsStringLiteral = parts.join('');
  return new RegExp(regexpAsStringLiteral, flags);
}

/**
 * Regular Expression to match
 * semantic versioning (SemVer)
 * built from multi-line, multi-parts regexp
 * Reference: https://semver.org/
 */

var semanticVersioningRegex = multilineRegexp(['^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)', '(?:-((?:0|[1-9]\\d*|\\d*[a-z-][0-9a-z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-z-][0-9a-z-]*))*))', '?(?:\\+([0-9a-z-]+(?:\\.[0-9a-z-]+)*))?$'], 'i');
function isSemVer(str) {
  assertString(str);
  return semanticVersioningRegex.test(str);
}

var surrogatePair = /[\uD800-\uDBFF][\uDC00-\uDFFF]/;
function isSurrogatePair(str) {
  assertString(str);
  return surrogatePair.test(str);
}

var includes = function includes(arr, val) {
  return arr.some(function (arrVal) {
    return val === arrVal;
  });
};

function decimalRegExp(options) {
  var regExp = new RegExp("^[-+]?([0-9]+)?(\\".concat(decimal[options.locale], "[0-9]{").concat(options.decimal_digits, "})").concat(options.force_decimal ? '' : '?', "$"));
  return regExp;
}

var default_decimal_options = {
  force_decimal: false,
  decimal_digits: '1,',
  locale: 'en-US'
};
var blacklist = ['', '-', '+'];
function isDecimal(str, options) {
  assertString(str);
  options = merge(options, default_decimal_options);

  if (options.locale in decimal) {
    return !includes(blacklist, str.replace(/ /g, '')) && decimalRegExp(options).test(str);
  }

  throw new Error("Invalid locale '".concat(options.locale, "'"));
}

var hexadecimal = /^(0x|0h)?[0-9A-F]+$/i;
function isHexadecimal(str) {
  assertString(str);
  return hexadecimal.test(str);
}

var octal = /^(0o)?[0-7]+$/i;
function isOctal(str) {
  assertString(str);
  return octal.test(str);
}

function isDivisibleBy(str, num) {
  assertString(str);
  return toFloat(str) % parseInt(num, 10) === 0;
}

var hexcolor = /^#?([0-9A-F]{3}|[0-9A-F]{4}|[0-9A-F]{6}|[0-9A-F]{8})$/i;
function isHexColor(str) {
  assertString(str);
  return hexcolor.test(str);
}

var rgbColor = /^rgb\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){2}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\)$/;
var rgbaColor = /^rgba\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)$/;
var rgbColorPercent = /^rgb\((([0-9]%|[1-9][0-9]%|100%),){2}([0-9]%|[1-9][0-9]%|100%)\)/;
var rgbaColorPercent = /^rgba\((([0-9]%|[1-9][0-9]%|100%),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)/;
function isRgbColor(str) {
  var includePercentValues = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
  assertString(str);

  if (!includePercentValues) {
    return rgbColor.test(str) || rgbaColor.test(str);
  }

  return rgbColor.test(str) || rgbaColor.test(str) || rgbColorPercent.test(str) || rgbaColorPercent.test(str);
}

var hslComma = /^hsla?\(((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?))(deg|grad|rad|turn)?(,(\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%){2}(,((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%?))?\)$/i;
var hslSpace = /^hsla?\(((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?))(deg|grad|rad|turn)?(\s(\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%){2}\s?(\/\s((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%?)\s?)?\)$/i;
function isHSL(str) {
  assertString(str); // Strip duplicate spaces before calling the validation regex (See  #1598 for more info)

  var strippedStr = str.replace(/\s+/g, ' ').replace(/\s?(hsla?\(|\)|,)\s?/ig, '$1');

  if (strippedStr.indexOf(',') !== -1) {
    return hslComma.test(strippedStr);
  }

  return hslSpace.test(strippedStr);
}

var isrc = /^[A-Z]{2}[0-9A-Z]{3}\d{2}\d{5}$/;
function isISRC(str) {
  assertString(str);
  return isrc.test(str);
}

/**
 * List of country codes with
 * corresponding IBAN regular expression
 * Reference: https://en.wikipedia.org/wiki/International_Bank_Account_Number
 */

var ibanRegexThroughCountryCode = {
  AD: /^(AD[0-9]{2})\d{8}[A-Z0-9]{12}$/,
  AE: /^(AE[0-9]{2})\d{3}\d{16}$/,
  AL: /^(AL[0-9]{2})\d{8}[A-Z0-9]{16}$/,
  AT: /^(AT[0-9]{2})\d{16}$/,
  AZ: /^(AZ[0-9]{2})[A-Z0-9]{4}\d{20}$/,
  BA: /^(BA[0-9]{2})\d{16}$/,
  BE: /^(BE[0-9]{2})\d{12}$/,
  BG: /^(BG[0-9]{2})[A-Z]{4}\d{6}[A-Z0-9]{8}$/,
  BH: /^(BH[0-9]{2})[A-Z]{4}[A-Z0-9]{14}$/,
  BR: /^(BR[0-9]{2})\d{23}[A-Z]{1}[A-Z0-9]{1}$/,
  BY: /^(BY[0-9]{2})[A-Z0-9]{4}\d{20}$/,
  CH: /^(CH[0-9]{2})\d{5}[A-Z0-9]{12}$/,
  CR: /^(CR[0-9]{2})\d{18}$/,
  CY: /^(CY[0-9]{2})\d{8}[A-Z0-9]{16}$/,
  CZ: /^(CZ[0-9]{2})\d{20}$/,
  DE: /^(DE[0-9]{2})\d{18}$/,
  DK: /^(DK[0-9]{2})\d{14}$/,
  DO: /^(DO[0-9]{2})[A-Z]{4}\d{20}$/,
  EE: /^(EE[0-9]{2})\d{16}$/,
  EG: /^(EG[0-9]{2})\d{25}$/,
  ES: /^(ES[0-9]{2})\d{20}$/,
  FI: /^(FI[0-9]{2})\d{14}$/,
  FO: /^(FO[0-9]{2})\d{14}$/,
  FR: /^(FR[0-9]{2})\d{10}[A-Z0-9]{11}\d{2}$/,
  GB: /^(GB[0-9]{2})[A-Z]{4}\d{14}$/,
  GE: /^(GE[0-9]{2})[A-Z0-9]{2}\d{16}$/,
  GI: /^(GI[0-9]{2})[A-Z]{4}[A-Z0-9]{15}$/,
  GL: /^(GL[0-9]{2})\d{14}$/,
  GR: /^(GR[0-9]{2})\d{7}[A-Z0-9]{16}$/,
  GT: /^(GT[0-9]{2})[A-Z0-9]{4}[A-Z0-9]{20}$/,
  HR: /^(HR[0-9]{2})\d{17}$/,
  HU: /^(HU[0-9]{2})\d{24}$/,
  IE: /^(IE[0-9]{2})[A-Z0-9]{4}\d{14}$/,
  IL: /^(IL[0-9]{2})\d{19}$/,
  IQ: /^(IQ[0-9]{2})[A-Z]{4}\d{15}$/,
  IR: /^(IR[0-9]{2})0\d{2}0\d{18}$/,
  IS: /^(IS[0-9]{2})\d{22}$/,
  IT: /^(IT[0-9]{2})[A-Z]{1}\d{10}[A-Z0-9]{12}$/,
  JO: /^(JO[0-9]{2})[A-Z]{4}\d{22}$/,
  KW: /^(KW[0-9]{2})[A-Z]{4}[A-Z0-9]{22}$/,
  KZ: /^(KZ[0-9]{2})\d{3}[A-Z0-9]{13}$/,
  LB: /^(LB[0-9]{2})\d{4}[A-Z0-9]{20}$/,
  LC: /^(LC[0-9]{2})[A-Z]{4}[A-Z0-9]{24}$/,
  LI: /^(LI[0-9]{2})\d{5}[A-Z0-9]{12}$/,
  LT: /^(LT[0-9]{2})\d{16}$/,
  LU: /^(LU[0-9]{2})\d{3}[A-Z0-9]{13}$/,
  LV: /^(LV[0-9]{2})[A-Z]{4}[A-Z0-9]{13}$/,
  MC: /^(MC[0-9]{2})\d{10}[A-Z0-9]{11}\d{2}$/,
  MD: /^(MD[0-9]{2})[A-Z0-9]{20}$/,
  ME: /^(ME[0-9]{2})\d{18}$/,
  MK: /^(MK[0-9]{2})\d{3}[A-Z0-9]{10}\d{2}$/,
  MR: /^(MR[0-9]{2})\d{23}$/,
  MT: /^(MT[0-9]{2})[A-Z]{4}\d{5}[A-Z0-9]{18}$/,
  MU: /^(MU[0-9]{2})[A-Z]{4}\d{19}[A-Z]{3}$/,
  MZ: /^(MZ[0-9]{2})\d{21}$/,
  NL: /^(NL[0-9]{2})[A-Z]{4}\d{10}$/,
  NO: /^(NO[0-9]{2})\d{11}$/,
  PK: /^(PK[0-9]{2})[A-Z0-9]{4}\d{16}$/,
  PL: /^(PL[0-9]{2})\d{24}$/,
  PS: /^(PS[0-9]{2})[A-Z0-9]{4}\d{21}$/,
  PT: /^(PT[0-9]{2})\d{21}$/,
  QA: /^(QA[0-9]{2})[A-Z]{4}[A-Z0-9]{21}$/,
  RO: /^(RO[0-9]{2})[A-Z]{4}[A-Z0-9]{16}$/,
  RS: /^(RS[0-9]{2})\d{18}$/,
  SA: /^(SA[0-9]{2})\d{2}[A-Z0-9]{18}$/,
  SC: /^(SC[0-9]{2})[A-Z]{4}\d{20}[A-Z]{3}$/,
  SE: /^(SE[0-9]{2})\d{20}$/,
  SI: /^(SI[0-9]{2})\d{15}$/,
  SK: /^(SK[0-9]{2})\d{20}$/,
  SM: /^(SM[0-9]{2})[A-Z]{1}\d{10}[A-Z0-9]{12}$/,
  SV: /^(SV[0-9]{2})[A-Z0-9]{4}\d{20}$/,
  TL: /^(TL[0-9]{2})\d{19}$/,
  TN: /^(TN[0-9]{2})\d{20}$/,
  TR: /^(TR[0-9]{2})\d{5}[A-Z0-9]{17}$/,
  UA: /^(UA[0-9]{2})\d{6}[A-Z0-9]{19}$/,
  VA: /^(VA[0-9]{2})\d{18}$/,
  VG: /^(VG[0-9]{2})[A-Z0-9]{4}\d{16}$/,
  XK: /^(XK[0-9]{2})\d{16}$/
};
/**
 * Check whether string has correct universal IBAN format
 * The IBAN consists of up to 34 alphanumeric characters, as follows:
 * Country Code using ISO 3166-1 alpha-2, two letters
 * check digits, two digits and
 * Basic Bank Account Number (BBAN), up to 30 alphanumeric characters.
 * NOTE: Permitted IBAN characters are: digits [0-9] and the 26 latin alphabetic [A-Z]
 *
 * @param {string} str - string under validation
 * @return {boolean}
 */

function hasValidIbanFormat(str) {
  // Strip white spaces and hyphens
  var strippedStr = str.replace(/[\s\-]+/gi, '').toUpperCase();
  var isoCountryCode = strippedStr.slice(0, 2).toUpperCase();
  return isoCountryCode in ibanRegexThroughCountryCode && ibanRegexThroughCountryCode[isoCountryCode].test(strippedStr);
}
/**
   * Check whether string has valid IBAN Checksum
   * by performing basic mod-97 operation and
   * the remainder should equal 1
   * -- Start by rearranging the IBAN by moving the four initial characters to the end of the string
   * -- Replace each letter in the string with two digits, A -> 10, B = 11, Z = 35
   * -- Interpret the string as a decimal integer and
   * -- compute the remainder on division by 97 (mod 97)
   * Reference: https://en.wikipedia.org/wiki/International_Bank_Account_Number
   *
   * @param {string} str
   * @return {boolean}
   */


function hasValidIbanChecksum(str) {
  var strippedStr = str.replace(/[^A-Z0-9]+/gi, '').toUpperCase(); // Keep only digits and A-Z latin alphabetic

  var rearranged = strippedStr.slice(4) + strippedStr.slice(0, 4);
  var alphaCapsReplacedWithDigits = rearranged.replace(/[A-Z]/g, function (_char) {
    return _char.charCodeAt(0) - 55;
  });
  var remainder = alphaCapsReplacedWithDigits.match(/\d{1,7}/g).reduce(function (acc, value) {
    return Number(acc + value) % 97;
  }, '');
  return remainder === 1;
}

function isIBAN(str) {
  assertString(str);
  return hasValidIbanFormat(str) && hasValidIbanChecksum(str);
}
var locales$3 = Object.keys(ibanRegexThroughCountryCode);

var validISO31661Alpha2CountriesCodes = new Set(['AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AO', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AW', 'AX', 'AZ', 'BA', 'BB', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BL', 'BM', 'BN', 'BO', 'BQ', 'BR', 'BS', 'BT', 'BV', 'BW', 'BY', 'BZ', 'CA', 'CC', 'CD', 'CF', 'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN', 'CO', 'CR', 'CU', 'CV', 'CW', 'CX', 'CY', 'CZ', 'DE', 'DJ', 'DK', 'DM', 'DO', 'DZ', 'EC', 'EE', 'EG', 'EH', 'ER', 'ES', 'ET', 'FI', 'FJ', 'FK', 'FM', 'FO', 'FR', 'GA', 'GB', 'GD', 'GE', 'GF', 'GG', 'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GS', 'GT', 'GU', 'GW', 'GY', 'HK', 'HM', 'HN', 'HR', 'HT', 'HU', 'ID', 'IE', 'IL', 'IM', 'IN', 'IO', 'IQ', 'IR', 'IS', 'IT', 'JE', 'JM', 'JO', 'JP', 'KE', 'KG', 'KH', 'KI', 'KM', 'KN', 'KP', 'KR', 'KW', 'KY', 'KZ', 'LA', 'LB', 'LC', 'LI', 'LK', 'LR', 'LS', 'LT', 'LU', 'LV', 'LY', 'MA', 'MC', 'MD', 'ME', 'MF', 'MG', 'MH', 'MK', 'ML', 'MM', 'MN', 'MO', 'MP', 'MQ', 'MR', 'MS', 'MT', 'MU', 'MV', 'MW', 'MX', 'MY', 'MZ', 'NA', 'NC', 'NE', 'NF', 'NG', 'NI', 'NL', 'NO', 'NP', 'NR', 'NU', 'NZ', 'OM', 'PA', 'PE', 'PF', 'PG', 'PH', 'PK', 'PL', 'PM', 'PN', 'PR', 'PS', 'PT', 'PW', 'PY', 'QA', 'RE', 'RO', 'RS', 'RU', 'RW', 'SA', 'SB', 'SC', 'SD', 'SE', 'SG', 'SH', 'SI', 'SJ', 'SK', 'SL', 'SM', 'SN', 'SO', 'SR', 'SS', 'ST', 'SV', 'SX', 'SY', 'SZ', 'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK', 'TL', 'TM', 'TN', 'TO', 'TR', 'TT', 'TV', 'TW', 'TZ', 'UA', 'UG', 'UM', 'US', 'UY', 'UZ', 'VA', 'VC', 'VE', 'VG', 'VI', 'VN', 'VU', 'WF', 'WS', 'YE', 'YT', 'ZA', 'ZM', 'ZW']);
function isISO31661Alpha2(str) {
  assertString(str);
  return validISO31661Alpha2CountriesCodes.has(str.toUpperCase());
}
var CountryCodes = validISO31661Alpha2CountriesCodes;

var isBICReg = /^[A-Za-z]{6}[A-Za-z0-9]{2}([A-Za-z0-9]{3})?$/;
function isBIC(str) {
  assertString(str); // toUpperCase() should be removed when a new major version goes out that changes
  // the regex to [A-Z] (per the spec).

  if (!CountryCodes.has(str.slice(4, 6).toUpperCase())) {
    return false;
  }

  return isBICReg.test(str);
}

var md5 = /^[a-f0-9]{32}$/;
function isMD5(str) {
  assertString(str);
  return md5.test(str);
}

var lengths = {
  md5: 32,
  md4: 32,
  sha1: 40,
  sha256: 64,
  sha384: 96,
  sha512: 128,
  ripemd128: 32,
  ripemd160: 40,
  tiger128: 32,
  tiger160: 40,
  tiger192: 48,
  crc32: 8,
  crc32b: 8
};
function isHash(str, algorithm) {
  assertString(str);
  var hash = new RegExp("^[a-fA-F0-9]{".concat(lengths[algorithm], "}$"));
  return hash.test(str);
}

var notBase64 = /[^A-Z0-9+\/=]/i;
var urlSafeBase64 = /^[A-Z0-9_\-]*$/i;
var defaultBase64Options = {
  urlSafe: false
};
function isBase64(str, options) {
  assertString(str);
  options = merge(options, defaultBase64Options);
  var len = str.length;

  if (options.urlSafe) {
    return urlSafeBase64.test(str);
  }

  if (len % 4 !== 0 || notBase64.test(str)) {
    return false;
  }

  var firstPaddingChar = str.indexOf('=');
  return firstPaddingChar === -1 || firstPaddingChar === len - 1 || firstPaddingChar === len - 2 && str[len - 1] === '=';
}

function isJWT(str) {
  assertString(str);
  var dotSplit = str.split('.');
  var len = dotSplit.length;

  if (len > 3 || len < 2) {
    return false;
  }

  return dotSplit.reduce(function (acc, currElem) {
    return acc && isBase64(currElem, {
      urlSafe: true
    });
  }, true);
}

var default_json_options = {
  allow_primitives: false
};
function isJSON(str, options) {
  assertString(str);

  try {
    options = merge(options, default_json_options);
    var primitives = [];

    if (options.allow_primitives) {
      primitives = [null, false, true];
    }

    var obj = JSON.parse(str);
    return primitives.includes(obj) || !!obj && _typeof(obj) === 'object';
  } catch (e) {
    /* ignore */
  }

  return false;
}

var default_is_empty_options = {
  ignore_whitespace: false
};
function isEmpty(str, options) {
  assertString(str);
  options = merge(options, default_is_empty_options);
  return (options.ignore_whitespace ? str.trim().length : str.length) === 0;
}

/* eslint-disable prefer-rest-params */

function isLength(str, options) {
  assertString(str);
  var min;
  var max;

  if (_typeof(options) === 'object') {
    min = options.min || 0;
    max = options.max;
  } else {
    // backwards compatibility: isLength(str, min [, max])
    min = arguments[1] || 0;
    max = arguments[2];
  }

  var surrogatePairs = str.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g) || [];
  var len = str.length - surrogatePairs.length;
  return len >= min && (typeof max === 'undefined' || len <= max);
}

var uuid = {
  1: /^[0-9A-F]{8}-[0-9A-F]{4}-1[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,
  2: /^[0-9A-F]{8}-[0-9A-F]{4}-2[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,
  3: /^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,
  4: /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,
  5: /^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,
  all: /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i
};
function isUUID(str, version) {
  assertString(str);
  var pattern = uuid[![undefined, null].includes(version) ? version : 'all'];
  return !!pattern && pattern.test(str);
}

function isMongoId(str) {
  assertString(str);
  return isHexadecimal(str) && str.length === 24;
}

function isAfter(str) {
  var date = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : String(new Date());
  assertString(str);
  var comparison = toDate(date);
  var original = toDate(str);
  return !!(original && comparison && original > comparison);
}

function isBefore(str) {
  var date = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : String(new Date());
  assertString(str);
  var comparison = toDate(date);
  var original = toDate(str);
  return !!(original && comparison && original < comparison);
}

function isIn(str, options) {
  assertString(str);
  var i;

  if (Object.prototype.toString.call(options) === '[object Array]') {
    var array = [];

    for (i in options) {
      // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
      // istanbul ignore else
      if ({}.hasOwnProperty.call(options, i)) {
        array[i] = toString$1(options[i]);
      }
    }

    return array.indexOf(str) >= 0;
  } else if (_typeof(options) === 'object') {
    return options.hasOwnProperty(str);
  } else if (options && typeof options.indexOf === 'function') {
    return options.indexOf(str) >= 0;
  }

  return false;
}

/* eslint-disable max-len */

var creditCard = /^(?:4[0-9]{12}(?:[0-9]{3,6})?|5[1-5][0-9]{14}|(222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12,15}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11}|6[27][0-9]{14}|^(81[0-9]{14,17}))$/;
/* eslint-enable max-len */

function isCreditCard(str) {
  assertString(str);
  var sanitized = str.replace(/[- ]+/g, '');

  if (!creditCard.test(sanitized)) {
    return false;
  }

  var sum = 0;
  var digit;
  var tmpNum;
  var shouldDouble;

  for (var i = sanitized.length - 1; i >= 0; i--) {
    digit = sanitized.substring(i, i + 1);
    tmpNum = parseInt(digit, 10);

    if (shouldDouble) {
      tmpNum *= 2;

      if (tmpNum >= 10) {
        sum += tmpNum % 10 + 1;
      } else {
        sum += tmpNum;
      }
    } else {
      sum += tmpNum;
    }

    shouldDouble = !shouldDouble;
  }

  return !!(sum % 10 === 0 ? sanitized : false);
}

var validators = {
  PL: function PL(str) {
    assertString(str);
    var weightOfDigits = {
      1: 1,
      2: 3,
      3: 7,
      4: 9,
      5: 1,
      6: 3,
      7: 7,
      8: 9,
      9: 1,
      10: 3,
      11: 0
    };

    if (str != null && str.length === 11 && isInt(str, {
      allow_leading_zeroes: true
    })) {
      var digits = str.split('').slice(0, -1);
      var sum = digits.reduce(function (acc, digit, index) {
        return acc + Number(digit) * weightOfDigits[index + 1];
      }, 0);
      var modulo = sum % 10;
      var lastDigit = Number(str.charAt(str.length - 1));

      if (modulo === 0 && lastDigit === 0 || lastDigit === 10 - modulo) {
        return true;
      }
    }

    return false;
  },
  ES: function ES(str) {
    assertString(str);
    var DNI = /^[0-9X-Z][0-9]{7}[TRWAGMYFPDXBNJZSQVHLCKE]$/;
    var charsValue = {
      X: 0,
      Y: 1,
      Z: 2
    };
    var controlDigits = ['T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E']; // sanitize user input

    var sanitized = str.trim().toUpperCase(); // validate the data structure

    if (!DNI.test(sanitized)) {
      return false;
    } // validate the control digit


    var number = sanitized.slice(0, -1).replace(/[X,Y,Z]/g, function (_char) {
      return charsValue[_char];
    });
    return sanitized.endsWith(controlDigits[number % 23]);
  },
  FI: function FI(str) {
    // https://dvv.fi/en/personal-identity-code#:~:text=control%20character%20for%20a-,personal,-identity%20code%20calculated
    assertString(str);

    if (str.length !== 11) {
      return false;
    }

    if (!str.match(/^\d{6}[\-A\+]\d{3}[0-9ABCDEFHJKLMNPRSTUVWXY]{1}$/)) {
      return false;
    }

    var checkDigits = '0123456789ABCDEFHJKLMNPRSTUVWXY';
    var idAsNumber = parseInt(str.slice(0, 6), 10) * 1000 + parseInt(str.slice(7, 10), 10);
    var remainder = idAsNumber % 31;
    var checkDigit = checkDigits[remainder];
    return checkDigit === str.slice(10, 11);
  },
  IN: function IN(str) {
    var DNI = /^[1-9]\d{3}\s?\d{4}\s?\d{4}$/; // multiplication table

    var d = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 0, 6, 7, 8, 9, 5], [2, 3, 4, 0, 1, 7, 8, 9, 5, 6], [3, 4, 0, 1, 2, 8, 9, 5, 6, 7], [4, 0, 1, 2, 3, 9, 5, 6, 7, 8], [5, 9, 8, 7, 6, 0, 4, 3, 2, 1], [6, 5, 9, 8, 7, 1, 0, 4, 3, 2], [7, 6, 5, 9, 8, 2, 1, 0, 4, 3], [8, 7, 6, 5, 9, 3, 2, 1, 0, 4], [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]]; // permutation table

    var p = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 5, 7, 6, 2, 8, 3, 0, 9, 4], [5, 8, 0, 3, 7, 9, 6, 1, 4, 2], [8, 9, 1, 6, 0, 4, 3, 5, 2, 7], [9, 4, 5, 3, 1, 2, 6, 8, 7, 0], [4, 2, 8, 6, 5, 7, 3, 9, 0, 1], [2, 7, 9, 3, 8, 0, 6, 4, 1, 5], [7, 0, 4, 6, 9, 1, 3, 2, 5, 8]]; // sanitize user input

    var sanitized = str.trim(); // validate the data structure

    if (!DNI.test(sanitized)) {
      return false;
    }

    var c = 0;
    var invertedArray = sanitized.replace(/\s/g, '').split('').map(Number).reverse();
    invertedArray.forEach(function (val, i) {
      c = d[c][p[i % 8][val]];
    });
    return c === 0;
  },
  IR: function IR(str) {
    if (!str.match(/^\d{10}$/)) return false;
    str = "0000".concat(str).substr(str.length - 6);
    if (parseInt(str.substr(3, 6), 10) === 0) return false;
    var lastNumber = parseInt(str.substr(9, 1), 10);
    var sum = 0;

    for (var i = 0; i < 9; i++) {
      sum += parseInt(str.substr(i, 1), 10) * (10 - i);
    }

    sum %= 11;
    return sum < 2 && lastNumber === sum || sum >= 2 && lastNumber === 11 - sum;
  },
  IT: function IT(str) {
    if (str.length !== 9) return false;
    if (str === 'CA00000AA') return false; // https://it.wikipedia.org/wiki/Carta_d%27identit%C3%A0_elettronica_italiana

    return str.search(/C[A-Z][0-9]{5}[A-Z]{2}/i) > -1;
  },
  NO: function NO(str) {
    var sanitized = str.trim();
    if (isNaN(Number(sanitized))) return false;
    if (sanitized.length !== 11) return false;
    if (sanitized === '00000000000') return false; // https://no.wikipedia.org/wiki/F%C3%B8dselsnummer

    var f = sanitized.split('').map(Number);
    var k1 = (11 - (3 * f[0] + 7 * f[1] + 6 * f[2] + 1 * f[3] + 8 * f[4] + 9 * f[5] + 4 * f[6] + 5 * f[7] + 2 * f[8]) % 11) % 11;
    var k2 = (11 - (5 * f[0] + 4 * f[1] + 3 * f[2] + 2 * f[3] + 7 * f[4] + 6 * f[5] + 5 * f[6] + 4 * f[7] + 3 * f[8] + 2 * k1) % 11) % 11;
    if (k1 !== f[9] || k2 !== f[10]) return false;
    return true;
  },
  TH: function TH(str) {
    if (!str.match(/^[1-8]\d{12}$/)) return false; // validate check digit

    var sum = 0;

    for (var i = 0; i < 12; i++) {
      sum += parseInt(str[i], 10) * (13 - i);
    }

    return str[12] === ((11 - sum % 11) % 10).toString();
  },
  LK: function LK(str) {
    var old_nic = /^[1-9]\d{8}[vx]$/i;
    var new_nic = /^[1-9]\d{11}$/i;
    if (str.length === 10 && old_nic.test(str)) return true;else if (str.length === 12 && new_nic.test(str)) return true;
    return false;
  },
  'he-IL': function heIL(str) {
    var DNI = /^\d{9}$/; // sanitize user input

    var sanitized = str.trim(); // validate the data structure

    if (!DNI.test(sanitized)) {
      return false;
    }

    var id = sanitized;
    var sum = 0,
        incNum;

    for (var i = 0; i < id.length; i++) {
      incNum = Number(id[i]) * (i % 2 + 1); // Multiply number by 1 or 2

      sum += incNum > 9 ? incNum - 9 : incNum; // Sum the digits up and add to total
    }

    return sum % 10 === 0;
  },
  'ar-LY': function arLY(str) {
    // Libya National Identity Number NIN is 12 digits, the first digit is either 1 or 2
    var NIN = /^(1|2)\d{11}$/; // sanitize user input

    var sanitized = str.trim(); // validate the data structure

    if (!NIN.test(sanitized)) {
      return false;
    }

    return true;
  },
  'ar-TN': function arTN(str) {
    var DNI = /^\d{8}$/; // sanitize user input

    var sanitized = str.trim(); // validate the data structure

    if (!DNI.test(sanitized)) {
      return false;
    }

    return true;
  },
  'zh-CN': function zhCN(str) {
    var provincesAndCities = ['11', // 北京
    '12', // 天津
    '13', // 河北
    '14', // 山西
    '15', // 内蒙古
    '21', // 辽宁
    '22', // 吉林
    '23', // 黑龙江
    '31', // 上海
    '32', // 江苏
    '33', // 浙江
    '34', // 安徽
    '35', // 福建
    '36', // 江西
    '37', // 山东
    '41', // 河南
    '42', // 湖北
    '43', // 湖南
    '44', // 广东
    '45', // 广西
    '46', // 海南
    '50', // 重庆
    '51', // 四川
    '52', // 贵州
    '53', // 云南
    '54', // 西藏
    '61', // 陕西
    '62', // 甘肃
    '63', // 青海
    '64', // 宁夏
    '65', // 新疆
    '71', // 台湾
    '81', // 香港
    '82', // 澳门
    '91' // 国外
    ];
    var powers = ['7', '9', '10', '5', '8', '4', '2', '1', '6', '3', '7', '9', '10', '5', '8', '4', '2'];
    var parityBit = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];

    var checkAddressCode = function checkAddressCode(addressCode) {
      return provincesAndCities.includes(addressCode);
    };

    var checkBirthDayCode = function checkBirthDayCode(birDayCode) {
      var yyyy = parseInt(birDayCode.substring(0, 4), 10);
      var mm = parseInt(birDayCode.substring(4, 6), 10);
      var dd = parseInt(birDayCode.substring(6), 10);
      var xdata = new Date(yyyy, mm - 1, dd);

      if (xdata > new Date()) {
        return false; // eslint-disable-next-line max-len
      } else if (xdata.getFullYear() === yyyy && xdata.getMonth() === mm - 1 && xdata.getDate() === dd) {
        return true;
      }

      return false;
    };

    var getParityBit = function getParityBit(idCardNo) {
      var id17 = idCardNo.substring(0, 17);
      var power = 0;

      for (var i = 0; i < 17; i++) {
        power += parseInt(id17.charAt(i), 10) * parseInt(powers[i], 10);
      }

      var mod = power % 11;
      return parityBit[mod];
    };

    var checkParityBit = function checkParityBit(idCardNo) {
      return getParityBit(idCardNo) === idCardNo.charAt(17).toUpperCase();
    };

    var check15IdCardNo = function check15IdCardNo(idCardNo) {
      var check = /^[1-9]\d{7}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\d{3}$/.test(idCardNo);
      if (!check) return false;
      var addressCode = idCardNo.substring(0, 2);
      check = checkAddressCode(addressCode);
      if (!check) return false;
      var birDayCode = "19".concat(idCardNo.substring(6, 12));
      check = checkBirthDayCode(birDayCode);
      if (!check) return false;
      return true;
    };

    var check18IdCardNo = function check18IdCardNo(idCardNo) {
      var check = /^[1-9]\d{5}[1-9]\d{3}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\d{3}(\d|x|X)$/.test(idCardNo);
      if (!check) return false;
      var addressCode = idCardNo.substring(0, 2);
      check = checkAddressCode(addressCode);
      if (!check) return false;
      var birDayCode = idCardNo.substring(6, 14);
      check = checkBirthDayCode(birDayCode);
      if (!check) return false;
      return checkParityBit(idCardNo);
    };

    var checkIdCardNo = function checkIdCardNo(idCardNo) {
      var check = /^\d{15}|(\d{17}(\d|x|X))$/.test(idCardNo);
      if (!check) return false;

      if (idCardNo.length === 15) {
        return check15IdCardNo(idCardNo);
      }

      return check18IdCardNo(idCardNo);
    };

    return checkIdCardNo(str);
  },
  'zh-TW': function zhTW(str) {
    var ALPHABET_CODES = {
      A: 10,
      B: 11,
      C: 12,
      D: 13,
      E: 14,
      F: 15,
      G: 16,
      H: 17,
      I: 34,
      J: 18,
      K: 19,
      L: 20,
      M: 21,
      N: 22,
      O: 35,
      P: 23,
      Q: 24,
      R: 25,
      S: 26,
      T: 27,
      U: 28,
      V: 29,
      W: 32,
      X: 30,
      Y: 31,
      Z: 33
    };
    var sanitized = str.trim().toUpperCase();
    if (!/^[A-Z][0-9]{9}$/.test(sanitized)) return false;
    return Array.from(sanitized).reduce(function (sum, number, index) {
      if (index === 0) {
        var code = ALPHABET_CODES[number];
        return code % 10 * 9 + Math.floor(code / 10);
      }

      if (index === 9) {
        return (10 - sum % 10 - Number(number)) % 10 === 0;
      }

      return sum + Number(number) * (9 - index);
    }, 0);
  }
};
function isIdentityCard(str, locale) {
  assertString(str);

  if (locale in validators) {
    return validators[locale](str);
  } else if (locale === 'any') {
    for (var key in validators) {
      // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
      // istanbul ignore else
      if (validators.hasOwnProperty(key)) {
        var validator = validators[key];

        if (validator(str)) {
          return true;
        }
      }
    }

    return false;
  }

  throw new Error("Invalid locale '".concat(locale, "'"));
}

/**
 * The most commonly used EAN standard is
 * the thirteen-digit EAN-13, while the
 * less commonly used 8-digit EAN-8 barcode was
 * introduced for use on small packages.
 * Also EAN/UCC-14 is used for Grouping of individual
 * trade items above unit level(Intermediate, Carton or Pallet).
 * For more info about EAN-14 checkout: https://www.gtin.info/itf-14-barcodes/
 * EAN consists of:
 * GS1 prefix, manufacturer code, product code and check digit
 * Reference: https://en.wikipedia.org/wiki/International_Article_Number
 * Reference: https://www.gtin.info/
 */
/**
 * Define EAN Lenghts; 8 for EAN-8; 13 for EAN-13; 14 for EAN-14
 * and Regular Expression for valid EANs (EAN-8, EAN-13, EAN-14),
 * with exact numberic matching of 8 or 13 or 14 digits [0-9]
 */

var LENGTH_EAN_8 = 8;
var LENGTH_EAN_14 = 14;
var validEanRegex = /^(\d{8}|\d{13}|\d{14})$/;
/**
 * Get position weight given:
 * EAN length and digit index/position
 *
 * @param {number} length
 * @param {number} index
 * @return {number}
 */

function getPositionWeightThroughLengthAndIndex(length, index) {
  if (length === LENGTH_EAN_8 || length === LENGTH_EAN_14) {
    return index % 2 === 0 ? 3 : 1;
  }

  return index % 2 === 0 ? 1 : 3;
}
/**
 * Calculate EAN Check Digit
 * Reference: https://en.wikipedia.org/wiki/International_Article_Number#Calculation_of_checksum_digit
 *
 * @param {string} ean
 * @return {number}
 */


function calculateCheckDigit(ean) {
  var checksum = ean.slice(0, -1).split('').map(function (_char, index) {
    return Number(_char) * getPositionWeightThroughLengthAndIndex(ean.length, index);
  }).reduce(function (acc, partialSum) {
    return acc + partialSum;
  }, 0);
  var remainder = 10 - checksum % 10;
  return remainder < 10 ? remainder : 0;
}
/**
 * Check if string is valid EAN:
 * Matches EAN-8/EAN-13/EAN-14 regex
 * Has valid check digit.
 *
 * @param {string} str
 * @return {boolean}
 */


function isEAN(str) {
  assertString(str);
  var actualCheckDigit = Number(str.slice(-1));
  return validEanRegex.test(str) && actualCheckDigit === calculateCheckDigit(str);
}

var isin = /^[A-Z]{2}[0-9A-Z]{9}[0-9]$/; // this link details how the check digit is calculated:
// https://www.isin.org/isin-format/. it is a little bit
// odd in that it works with digits, not numbers. in order
// to make only one pass through the ISIN characters, the
// each alpha character is handled as 2 characters within
// the loop.

function isISIN(str) {
  assertString(str);

  if (!isin.test(str)) {
    return false;
  }

  var _double = true;
  var sum = 0; // convert values

  for (var i = str.length - 2; i >= 0; i--) {
    if (str[i] >= 'A' && str[i] <= 'Z') {
      var value = str[i].charCodeAt(0) - 55;
      var lo = value % 10;
      var hi = Math.trunc(value / 10); // letters have two digits, so handle the low order
      // and high order digits separately.

      for (var _i = 0, _arr = [lo, hi]; _i < _arr.length; _i++) {
        var digit = _arr[_i];

        if (_double) {
          if (digit >= 5) {
            sum += 1 + (digit - 5) * 2;
          } else {
            sum += digit * 2;
          }
        } else {
          sum += digit;
        }

        _double = !_double;
      }
    } else {
      var _digit = str[i].charCodeAt(0) - '0'.charCodeAt(0);

      if (_double) {
        if (_digit >= 5) {
          sum += 1 + (_digit - 5) * 2;
        } else {
          sum += _digit * 2;
        }
      } else {
        sum += _digit;
      }

      _double = !_double;
    }
  }

  var check = Math.trunc((sum + 9) / 10) * 10 - sum;
  return +str[str.length - 1] === check;
}

var isbn10Maybe = /^(?:[0-9]{9}X|[0-9]{10})$/;
var isbn13Maybe = /^(?:[0-9]{13})$/;
var factor = [1, 3];
function isISBN(str) {
  var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
  assertString(str);
  version = String(version);

  if (!version) {
    return isISBN(str, 10) || isISBN(str, 13);
  }

  var sanitized = str.replace(/[\s-]+/g, '');
  var checksum = 0;
  var i;

  if (version === '10') {
    if (!isbn10Maybe.test(sanitized)) {
      return false;
    }

    for (i = 0; i < 9; i++) {
      checksum += (i + 1) * sanitized.charAt(i);
    }

    if (sanitized.charAt(9) === 'X') {
      checksum += 10 * 10;
    } else {
      checksum += 10 * sanitized.charAt(9);
    }

    if (checksum % 11 === 0) {
      return !!sanitized;
    }
  } else if (version === '13') {
    if (!isbn13Maybe.test(sanitized)) {
      return false;
    }

    for (i = 0; i < 12; i++) {
      checksum += factor[i % 2] * sanitized.charAt(i);
    }

    if (sanitized.charAt(12) - (10 - checksum % 10) % 10 === 0) {
      return !!sanitized;
    }
  }

  return false;
}

var issn = '^\\d{4}-?\\d{3}[\\dX]$';
function isISSN(str) {
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  assertString(str);
  var testIssn = issn;
  testIssn = options.require_hyphen ? testIssn.replace('?', '') : testIssn;
  testIssn = options.case_sensitive ? new RegExp(testIssn) : new RegExp(testIssn, 'i');

  if (!testIssn.test(str)) {
    return false;
  }

  var digits = str.replace('-', '').toUpperCase();
  var checksum = 0;

  for (var i = 0; i < digits.length; i++) {
    var digit = digits[i];
    checksum += (digit === 'X' ? 10 : +digit) * (8 - i);
  }

  return checksum % 11 === 0;
}

/**
 * Algorithmic validation functions
 * May be used as is or implemented in the workflow of other validators.
 */

/*
 * ISO 7064 validation function
 * Called with a string of numbers (incl. check digit)
 * to validate according to ISO 7064 (MOD 11, 10).
 */
function iso7064Check(str) {
  var checkvalue = 10;

  for (var i = 0; i < str.length - 1; i++) {
    checkvalue = (parseInt(str[i], 10) + checkvalue) % 10 === 0 ? 10 * 2 % 11 : (parseInt(str[i], 10) + checkvalue) % 10 * 2 % 11;
  }

  checkvalue = checkvalue === 1 ? 0 : 11 - checkvalue;
  return checkvalue === parseInt(str[10], 10);
}
/*
 * Luhn (mod 10) validation function
 * Called with a string of numbers (incl. check digit)
 * to validate according to the Luhn algorithm.
 */

function luhnCheck(str) {
  var checksum = 0;
  var second = false;

  for (var i = str.length - 1; i >= 0; i--) {
    if (second) {
      var product = parseInt(str[i], 10) * 2;

      if (product > 9) {
        // sum digits of product and add to checksum
        checksum += product.toString().split('').map(function (a) {
          return parseInt(a, 10);
        }).reduce(function (a, b) {
          return a + b;
        }, 0);
      } else {
        checksum += product;
      }
    } else {
      checksum += parseInt(str[i], 10);
    }

    second = !second;
  }

  return checksum % 10 === 0;
}
/*
 * Reverse TIN multiplication and summation helper function
 * Called with an array of single-digit integers and a base multiplier
 * to calculate the sum of the digits multiplied in reverse.
 * Normally used in variations of MOD 11 algorithmic checks.
 */

function reverseMultiplyAndSum(digits, base) {
  var total = 0;

  for (var i = 0; i < digits.length; i++) {
    total += digits[i] * (base - i);
  }

  return total;
}
/*
 * Verhoeff validation helper function
 * Called with a string of numbers
 * to validate according to the Verhoeff algorithm.
 */

function verhoeffCheck(str) {
  var d_table = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 0, 6, 7, 8, 9, 5], [2, 3, 4, 0, 1, 7, 8, 9, 5, 6], [3, 4, 0, 1, 2, 8, 9, 5, 6, 7], [4, 0, 1, 2, 3, 9, 5, 6, 7, 8], [5, 9, 8, 7, 6, 0, 4, 3, 2, 1], [6, 5, 9, 8, 7, 1, 0, 4, 3, 2], [7, 6, 5, 9, 8, 2, 1, 0, 4, 3], [8, 7, 6, 5, 9, 3, 2, 1, 0, 4], [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]];
  var p_table = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 5, 7, 6, 2, 8, 3, 0, 9, 4], [5, 8, 0, 3, 7, 9, 6, 1, 4, 2], [8, 9, 1, 6, 0, 4, 3, 5, 2, 7], [9, 4, 5, 3, 1, 2, 6, 8, 7, 0], [4, 2, 8, 6, 5, 7, 3, 9, 0, 1], [2, 7, 9, 3, 8, 0, 6, 4, 1, 5], [7, 0, 4, 6, 9, 1, 3, 2, 5, 8]]; // Copy (to prevent replacement) and reverse

  var str_copy = str.split('').reverse().join('');
  var checksum = 0;

  for (var i = 0; i < str_copy.length; i++) {
    checksum = d_table[checksum][p_table[i % 8][parseInt(str_copy[i], 10)]];
  }

  return checksum === 0;
}

/**
 * TIN Validation
 * Validates Tax Identification Numbers (TINs) from the US, EU member states and the United Kingdom.
 *
 * EU-UK:
 * National TIN validity is calculated using public algorithms as made available by DG TAXUD.
 *
 * See `https://ec.europa.eu/taxation_customs/tin/specs/FS-TIN%20Algorithms-Public.docx` for more information.
 *
 * US:
 * An Employer Identification Number (EIN), also known as a Federal Tax Identification Number,
 *  is used to identify a business entity.
 *
 * NOTES:
 *  - Prefix 47 is being reserved for future use
 *  - Prefixes 26, 27, 45, 46 and 47 were previously assigned by the Philadelphia campus.
 *
 * See `http://www.irs.gov/Businesses/Small-Businesses-&-Self-Employed/How-EINs-are-Assigned-and-Valid-EIN-Prefixes`
 * for more information.
 */
// Locale functions

/*
 * bg-BG validation function
 * (Edinen graždanski nomer (EGN/ЕГН), persons only)
 * Checks if birth date (first six digits) is valid and calculates check (last) digit
 */

function bgBgCheck(tin) {
  // Extract full year, normalize month and check birth date validity
  var century_year = tin.slice(0, 2);
  var month = parseInt(tin.slice(2, 4), 10);

  if (month > 40) {
    month -= 40;
    century_year = "20".concat(century_year);
  } else if (month > 20) {
    month -= 20;
    century_year = "18".concat(century_year);
  } else {
    century_year = "19".concat(century_year);
  }

  if (month < 10) {
    month = "0".concat(month);
  }

  var date = "".concat(century_year, "/").concat(month, "/").concat(tin.slice(4, 6));

  if (!isDate(date, 'YYYY/MM/DD')) {
    return false;
  } // split digits into an array for further processing


  var digits = tin.split('').map(function (a) {
    return parseInt(a, 10);
  }); // Calculate checksum by multiplying digits with fixed values

  var multip_lookup = [2, 4, 8, 5, 10, 9, 7, 3, 6];
  var checksum = 0;

  for (var i = 0; i < multip_lookup.length; i++) {
    checksum += digits[i] * multip_lookup[i];
  }

  checksum = checksum % 11 === 10 ? 0 : checksum % 11;
  return checksum === digits[9];
}
/*
 * cs-CZ validation function
 * (Rodné číslo (RČ), persons only)
 * Checks if birth date (first six digits) is valid and divisibility by 11
 * Material not in DG TAXUD document sourced from:
 * -`https://lorenc.info/3MA381/overeni-spravnosti-rodneho-cisla.htm`
 * -`https://www.mvcr.cz/clanek/rady-a-sluzby-dokumenty-rodne-cislo.aspx`
 */


function csCzCheck(tin) {
  tin = tin.replace(/\W/, ''); // Extract full year from TIN length

  var full_year = parseInt(tin.slice(0, 2), 10);

  if (tin.length === 10) {
    if (full_year < 54) {
      full_year = "20".concat(full_year);
    } else {
      full_year = "19".concat(full_year);
    }
  } else {
    if (tin.slice(6) === '000') {
      return false;
    } // Three-zero serial not assigned before 1954


    if (full_year < 54) {
      full_year = "19".concat(full_year);
    } else {
      return false; // No 18XX years seen in any of the resources
    }
  } // Add missing zero if needed


  if (full_year.length === 3) {
    full_year = [full_year.slice(0, 2), '0', full_year.slice(2)].join('');
  } // Extract month from TIN and normalize


  var month = parseInt(tin.slice(2, 4), 10);

  if (month > 50) {
    month -= 50;
  }

  if (month > 20) {
    // Month-plus-twenty was only introduced in 2004
    if (parseInt(full_year, 10) < 2004) {
      return false;
    }

    month -= 20;
  }

  if (month < 10) {
    month = "0".concat(month);
  } // Check date validity


  var date = "".concat(full_year, "/").concat(month, "/").concat(tin.slice(4, 6));

  if (!isDate(date, 'YYYY/MM/DD')) {
    return false;
  } // Verify divisibility by 11


  if (tin.length === 10) {
    if (parseInt(tin, 10) % 11 !== 0) {
      // Some numbers up to and including 1985 are still valid if
      // check (last) digit equals 0 and modulo of first 9 digits equals 10
      var checkdigit = parseInt(tin.slice(0, 9), 10) % 11;

      if (parseInt(full_year, 10) < 1986 && checkdigit === 10) {
        if (parseInt(tin.slice(9), 10) !== 0) {
          return false;
        }
      } else {
        return false;
      }
    }
  }

  return true;
}
/*
 * de-AT validation function
 * (Abgabenkontonummer, persons/entities)
 * Verify TIN validity by calling luhnCheck()
 */


function deAtCheck(tin) {
  return luhnCheck(tin);
}
/*
 * de-DE validation function
 * (Steueridentifikationsnummer (Steuer-IdNr.), persons only)
 * Tests for single duplicate/triplicate value, then calculates ISO 7064 check (last) digit
 * Partial implementation of spec (same result with both algorithms always)
 */


function deDeCheck(tin) {
  // Split digits into an array for further processing
  var digits = tin.split('').map(function (a) {
    return parseInt(a, 10);
  }); // Fill array with strings of number positions

  var occurences = [];

  for (var i = 0; i < digits.length - 1; i++) {
    occurences.push('');

    for (var j = 0; j < digits.length - 1; j++) {
      if (digits[i] === digits[j]) {
        occurences[i] += j;
      }
    }
  } // Remove digits with one occurence and test for only one duplicate/triplicate


  occurences = occurences.filter(function (a) {
    return a.length > 1;
  });

  if (occurences.length !== 2 && occurences.length !== 3) {
    return false;
  } // In case of triplicate value only two digits are allowed next to each other


  if (occurences[0].length === 3) {
    var trip_locations = occurences[0].split('').map(function (a) {
      return parseInt(a, 10);
    });
    var recurrent = 0; // Amount of neighbour occurences

    for (var _i = 0; _i < trip_locations.length - 1; _i++) {
      if (trip_locations[_i] + 1 === trip_locations[_i + 1]) {
        recurrent += 1;
      }
    }

    if (recurrent === 2) {
      return false;
    }
  }

  return iso7064Check(tin);
}
/*
 * dk-DK validation function
 * (CPR-nummer (personnummer), persons only)
 * Checks if birth date (first six digits) is valid and assigned to century (seventh) digit,
 * and calculates check (last) digit
 */


function dkDkCheck(tin) {
  tin = tin.replace(/\W/, ''); // Extract year, check if valid for given century digit and add century

  var year = parseInt(tin.slice(4, 6), 10);
  var century_digit = tin.slice(6, 7);

  switch (century_digit) {
    case '0':
    case '1':
    case '2':
    case '3':
      year = "19".concat(year);
      break;

    case '4':
    case '9':
      if (year < 37) {
        year = "20".concat(year);
      } else {
        year = "19".concat(year);
      }

      break;

    default:
      if (year < 37) {
        year = "20".concat(year);
      } else if (year > 58) {
        year = "18".concat(year);
      } else {
        return false;
      }

      break;
  } // Add missing zero if needed


  if (year.length === 3) {
    year = [year.slice(0, 2), '0', year.slice(2)].join('');
  } // Check date validity


  var date = "".concat(year, "/").concat(tin.slice(2, 4), "/").concat(tin.slice(0, 2));

  if (!isDate(date, 'YYYY/MM/DD')) {
    return false;
  } // Split digits into an array for further processing


  var digits = tin.split('').map(function (a) {
    return parseInt(a, 10);
  });
  var checksum = 0;
  var weight = 4; // Multiply by weight and add to checksum

  for (var i = 0; i < 9; i++) {
    checksum += digits[i] * weight;
    weight -= 1;

    if (weight === 1) {
      weight = 7;
    }
  }

  checksum %= 11;

  if (checksum === 1) {
    return false;
  }

  return checksum === 0 ? digits[9] === 0 : digits[9] === 11 - checksum;
}
/*
 * el-CY validation function
 * (Arithmos Forologikou Mitroou (AFM/ΑΦΜ), persons only)
 * Verify TIN validity by calculating ASCII value of check (last) character
 */


function elCyCheck(tin) {
  // split digits into an array for further processing
  var digits = tin.slice(0, 8).split('').map(function (a) {
    return parseInt(a, 10);
  });
  var checksum = 0; // add digits in even places

  for (var i = 1; i < digits.length; i += 2) {
    checksum += digits[i];
  } // add digits in odd places


  for (var _i2 = 0; _i2 < digits.length; _i2 += 2) {
    if (digits[_i2] < 2) {
      checksum += 1 - digits[_i2];
    } else {
      checksum += 2 * (digits[_i2] - 2) + 5;

      if (digits[_i2] > 4) {
        checksum += 2;
      }
    }
  }

  return String.fromCharCode(checksum % 26 + 65) === tin.charAt(8);
}
/*
 * el-GR validation function
 * (Arithmos Forologikou Mitroou (AFM/ΑΦΜ), persons/entities)
 * Verify TIN validity by calculating check (last) digit
 * Algorithm not in DG TAXUD document- sourced from:
 * - `http://epixeirisi.gr/%CE%9A%CE%A1%CE%99%CE%A3%CE%99%CE%9C%CE%91-%CE%98%CE%95%CE%9C%CE%91%CE%A4%CE%91-%CE%A6%CE%9F%CE%A1%CE%9F%CE%9B%CE%9F%CE%93%CE%99%CE%91%CE%A3-%CE%9A%CE%91%CE%99-%CE%9B%CE%9F%CE%93%CE%99%CE%A3%CE%A4%CE%99%CE%9A%CE%97%CE%A3/23791/%CE%91%CF%81%CE%B9%CE%B8%CE%BC%CF%8C%CF%82-%CE%A6%CE%BF%CF%81%CE%BF%CE%BB%CE%BF%CE%B3%CE%B9%CE%BA%CE%BF%CF%8D-%CE%9C%CE%B7%CF%84%CF%81%CF%8E%CE%BF%CF%85`
 */


function elGrCheck(tin) {
  // split digits into an array for further processing
  var digits = tin.split('').map(function (a) {
    return parseInt(a, 10);
  });
  var checksum = 0;

  for (var i = 0; i < 8; i++) {
    checksum += digits[i] * Math.pow(2, 8 - i);
  }

  return checksum % 11 % 10 === digits[8];
}
/*
 * en-GB validation function (should go here if needed)
 * (National Insurance Number (NINO) or Unique Taxpayer Reference (UTR),
 * persons/entities respectively)
 */

/*
 * en-IE validation function
 * (Personal Public Service Number (PPS No), persons only)
 * Verify TIN validity by calculating check (second to last) character
 */


function enIeCheck(tin) {
  var checksum = reverseMultiplyAndSum(tin.split('').slice(0, 7).map(function (a) {
    return parseInt(a, 10);
  }), 8);

  if (tin.length === 9 && tin[8] !== 'W') {
    checksum += (tin[8].charCodeAt(0) - 64) * 9;
  }

  checksum %= 23;

  if (checksum === 0) {
    return tin[7].toUpperCase() === 'W';
  }

  return tin[7].toUpperCase() === String.fromCharCode(64 + checksum);
} // Valid US IRS campus prefixes


var enUsCampusPrefix = {
  andover: ['10', '12'],
  atlanta: ['60', '67'],
  austin: ['50', '53'],
  brookhaven: ['01', '02', '03', '04', '05', '06', '11', '13', '14', '16', '21', '22', '23', '25', '34', '51', '52', '54', '55', '56', '57', '58', '59', '65'],
  cincinnati: ['30', '32', '35', '36', '37', '38', '61'],
  fresno: ['15', '24'],
  internet: ['20', '26', '27', '45', '46', '47'],
  kansas: ['40', '44'],
  memphis: ['94', '95'],
  ogden: ['80', '90'],
  philadelphia: ['33', '39', '41', '42', '43', '46', '48', '62', '63', '64', '66', '68', '71', '72', '73', '74', '75', '76', '77', '81', '82', '83', '84', '85', '86', '87', '88', '91', '92', '93', '98', '99'],
  sba: ['31']
}; // Return an array of all US IRS campus prefixes

function enUsGetPrefixes() {
  var prefixes = [];

  for (var location in enUsCampusPrefix) {
    // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
    // istanbul ignore else
    if (enUsCampusPrefix.hasOwnProperty(location)) {
      prefixes.push.apply(prefixes, _toConsumableArray(enUsCampusPrefix[location]));
    }
  }

  return prefixes;
}
/*
 * en-US validation function
 * Verify that the TIN starts with a valid IRS campus prefix
 */


function enUsCheck(tin) {
  return enUsGetPrefixes().indexOf(tin.substr(0, 2)) !== -1;
}
/*
 * es-ES validation function
 * (Documento Nacional de Identidad (DNI)
 * or Número de Identificación de Extranjero (NIE), persons only)
 * Verify TIN validity by calculating check (last) character
 */


function esEsCheck(tin) {
  // Split characters into an array for further processing
  var chars = tin.toUpperCase().split(''); // Replace initial letter if needed

  if (isNaN(parseInt(chars[0], 10)) && chars.length > 1) {
    var lead_replace = 0;

    switch (chars[0]) {
      case 'Y':
        lead_replace = 1;
        break;

      case 'Z':
        lead_replace = 2;
        break;

      default:
    }

    chars.splice(0, 1, lead_replace); // Fill with zeros if smaller than proper
  } else {
    while (chars.length < 9) {
      chars.unshift(0);
    }
  } // Calculate checksum and check according to lookup


  var lookup = ['T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E'];
  chars = chars.join('');
  var checksum = parseInt(chars.slice(0, 8), 10) % 23;
  return chars[8] === lookup[checksum];
}
/*
 * et-EE validation function
 * (Isikukood (IK), persons only)
 * Checks if birth date (century digit and six following) is valid and calculates check (last) digit
 * Material not in DG TAXUD document sourced from:
 * - `https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Estonia-TIN.pdf`
 */


function etEeCheck(tin) {
  // Extract year and add century
  var full_year = tin.slice(1, 3);
  var century_digit = tin.slice(0, 1);

  switch (century_digit) {
    case '1':
    case '2':
      full_year = "18".concat(full_year);
      break;

    case '3':
    case '4':
      full_year = "19".concat(full_year);
      break;

    default:
      full_year = "20".concat(full_year);
      break;
  } // Check date validity


  var date = "".concat(full_year, "/").concat(tin.slice(3, 5), "/").concat(tin.slice(5, 7));

  if (!isDate(date, 'YYYY/MM/DD')) {
    return false;
  } // Split digits into an array for further processing


  var digits = tin.split('').map(function (a) {
    return parseInt(a, 10);
  });
  var checksum = 0;
  var weight = 1; // Multiply by weight and add to checksum

  for (var i = 0; i < 10; i++) {
    checksum += digits[i] * weight;
    weight += 1;

    if (weight === 10) {
      weight = 1;
    }
  } // Do again if modulo 11 of checksum is 10


  if (checksum % 11 === 10) {
    checksum = 0;
    weight = 3;

    for (var _i3 = 0; _i3 < 10; _i3++) {
      checksum += digits[_i3] * weight;
      weight += 1;

      if (weight === 10) {
        weight = 1;
      }
    }

    if (checksum % 11 === 10) {
      return digits[10] === 0;
    }
  }

  return checksum % 11 === digits[10];
}
/*
 * fi-FI validation function
 * (Henkilötunnus (HETU), persons only)
 * Checks if birth date (first six digits plus century symbol) is valid
 * and calculates check (last) digit
 */


function fiFiCheck(tin) {
  // Extract year and add century
  var full_year = tin.slice(4, 6);
  var century_symbol = tin.slice(6, 7);

  switch (century_symbol) {
    case '+':
      full_year = "18".concat(full_year);
      break;

    case '-':
      full_year = "19".concat(full_year);
      break;

    default:
      full_year = "20".concat(full_year);
      break;
  } // Check date validity


  var date = "".concat(full_year, "/").concat(tin.slice(2, 4), "/").concat(tin.slice(0, 2));

  if (!isDate(date, 'YYYY/MM/DD')) {
    return false;
  } // Calculate check character


  var checksum = parseInt(tin.slice(0, 6) + tin.slice(7, 10), 10) % 31;

  if (checksum < 10) {
    return checksum === parseInt(tin.slice(10), 10);
  }

  checksum -= 10;
  var letters_lookup = ['A', 'B', 'C', 'D', 'E', 'F', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y'];
  return letters_lookup[checksum] === tin.slice(10);
}
/*
 * fr/nl-BE validation function
 * (Numéro national (N.N.), persons only)
 * Checks if birth date (first six digits) is valid and calculates check (last two) digits
 */


function frBeCheck(tin) {
  // Zero month/day value is acceptable
  if (tin.slice(2, 4) !== '00' || tin.slice(4, 6) !== '00') {
    // Extract date from first six digits of TIN
    var date = "".concat(tin.slice(0, 2), "/").concat(tin.slice(2, 4), "/").concat(tin.slice(4, 6));

    if (!isDate(date, 'YY/MM/DD')) {
      return false;
    }
  }

  var checksum = 97 - parseInt(tin.slice(0, 9), 10) % 97;
  var checkdigits = parseInt(tin.slice(9, 11), 10);

  if (checksum !== checkdigits) {
    checksum = 97 - parseInt("2".concat(tin.slice(0, 9)), 10) % 97;

    if (checksum !== checkdigits) {
      return false;
    }
  }

  return true;
}
/*
 * fr-FR validation function
 * (Numéro fiscal de référence (numéro SPI), persons only)
 * Verify TIN validity by calculating check (last three) digits
 */


function frFrCheck(tin) {
  tin = tin.replace(/\s/g, '');
  var checksum = parseInt(tin.slice(0, 10), 10) % 511;
  var checkdigits = parseInt(tin.slice(10, 13), 10);
  return checksum === checkdigits;
}
/*
 * fr/lb-LU validation function
 * (numéro d’identification personnelle, persons only)
 * Verify birth date validity and run Luhn and Verhoeff checks
 */


function frLuCheck(tin) {
  // Extract date and check validity
  var date = "".concat(tin.slice(0, 4), "/").concat(tin.slice(4, 6), "/").concat(tin.slice(6, 8));

  if (!isDate(date, 'YYYY/MM/DD')) {
    return false;
  } // Run Luhn check


  if (!luhnCheck(tin.slice(0, 12))) {
    return false;
  } // Remove Luhn check digit and run Verhoeff check


  return verhoeffCheck("".concat(tin.slice(0, 11)).concat(tin[12]));
}
/*
 * hr-HR validation function
 * (Osobni identifikacijski broj (OIB), persons/entities)
 * Verify TIN validity by calling iso7064Check(digits)
 */


function hrHrCheck(tin) {
  return iso7064Check(tin);
}
/*
 * hu-HU validation function
 * (Adóazonosító jel, persons only)
 * Verify TIN validity by calculating check (last) digit
 */


function huHuCheck(tin) {
  // split digits into an array for further processing
  var digits = tin.split('').map(function (a) {
    return parseInt(a, 10);
  });
  var checksum = 8;

  for (var i = 1; i < 9; i++) {
    checksum += digits[i] * (i + 1);
  }

  return checksum % 11 === digits[9];
}
/*
 * lt-LT validation function (should go here if needed)
 * (Asmens kodas, persons/entities respectively)
 * Current validation check is alias of etEeCheck- same format applies
 */

/*
 * it-IT first/last name validity check
 * Accepts it-IT TIN-encoded names as a three-element character array and checks their validity
 * Due to lack of clarity between resources ("Are only Italian consonants used?
 * What happens if a person has X in their name?" etc.) only two test conditions
 * have been implemented:
 * Vowels may only be followed by other vowels or an X character
 * and X characters after vowels may only be followed by other X characters.
 */


function itItNameCheck(name) {
  // true at the first occurence of a vowel
  var vowelflag = false; // true at the first occurence of an X AFTER vowel
  // (to properly handle last names with X as consonant)

  var xflag = false;

  for (var i = 0; i < 3; i++) {
    if (!vowelflag && /[AEIOU]/.test(name[i])) {
      vowelflag = true;
    } else if (!xflag && vowelflag && name[i] === 'X') {
      xflag = true;
    } else if (i > 0) {
      if (vowelflag && !xflag) {
        if (!/[AEIOU]/.test(name[i])) {
          return false;
        }
      }

      if (xflag) {
        if (!/X/.test(name[i])) {
          return false;
        }
      }
    }
  }

  return true;
}
/*
 * it-IT validation function
 * (Codice fiscale (TIN-IT), persons only)
 * Verify name, birth date and codice catastale validity
 * and calculate check character.
 * Material not in DG-TAXUD document sourced from:
 * `https://en.wikipedia.org/wiki/Italian_fiscal_code`
 */


function itItCheck(tin) {
  // Capitalize and split characters into an array for further processing
  var chars = tin.toUpperCase().split(''); // Check first and last name validity calling itItNameCheck()

  if (!itItNameCheck(chars.slice(0, 3))) {
    return false;
  }

  if (!itItNameCheck(chars.slice(3, 6))) {
    return false;
  } // Convert letters in number spaces back to numbers if any


  var number_locations = [6, 7, 9, 10, 12, 13, 14];
  var number_replace = {
    L: '0',
    M: '1',
    N: '2',
    P: '3',
    Q: '4',
    R: '5',
    S: '6',
    T: '7',
    U: '8',
    V: '9'
  };

  for (var _i4 = 0, _number_locations = number_locations; _i4 < _number_locations.length; _i4++) {
    var i = _number_locations[_i4];

    if (chars[i] in number_replace) {
      chars.splice(i, 1, number_replace[chars[i]]);
    }
  } // Extract month and day, and check date validity


  var month_replace = {
    A: '01',
    B: '02',
    C: '03',
    D: '04',
    E: '05',
    H: '06',
    L: '07',
    M: '08',
    P: '09',
    R: '10',
    S: '11',
    T: '12'
  };
  var month = month_replace[chars[8]];
  var day = parseInt(chars[9] + chars[10], 10);

  if (day > 40) {
    day -= 40;
  }

  if (day < 10) {
    day = "0".concat(day);
  }

  var date = "".concat(chars[6]).concat(chars[7], "/").concat(month, "/").concat(day);

  if (!isDate(date, 'YY/MM/DD')) {
    return false;
  } // Calculate check character by adding up even and odd characters as numbers


  var checksum = 0;

  for (var _i5 = 1; _i5 < chars.length - 1; _i5 += 2) {
    var char_to_int = parseInt(chars[_i5], 10);

    if (isNaN(char_to_int)) {
      char_to_int = chars[_i5].charCodeAt(0) - 65;
    }

    checksum += char_to_int;
  }

  var odd_convert = {
    // Maps of characters at odd places
    A: 1,
    B: 0,
    C: 5,
    D: 7,
    E: 9,
    F: 13,
    G: 15,
    H: 17,
    I: 19,
    J: 21,
    K: 2,
    L: 4,
    M: 18,
    N: 20,
    O: 11,
    P: 3,
    Q: 6,
    R: 8,
    S: 12,
    T: 14,
    U: 16,
    V: 10,
    W: 22,
    X: 25,
    Y: 24,
    Z: 23,
    0: 1,
    1: 0
  };

  for (var _i6 = 0; _i6 < chars.length - 1; _i6 += 2) {
    var _char_to_int = 0;

    if (chars[_i6] in odd_convert) {
      _char_to_int = odd_convert[chars[_i6]];
    } else {
      var multiplier = parseInt(chars[_i6], 10);
      _char_to_int = 2 * multiplier + 1;

      if (multiplier > 4) {
        _char_to_int += 2;
      }
    }

    checksum += _char_to_int;
  }

  if (String.fromCharCode(65 + checksum % 26) !== chars[15]) {
    return false;
  }

  return true;
}
/*
 * lv-LV validation function
 * (Personas kods (PK), persons only)
 * Check validity of birth date and calculate check (last) digit
 * Support only for old format numbers (not starting with '32', issued before 2017/07/01)
 * Material not in DG TAXUD document sourced from:
 * `https://boot.ritakafija.lv/forums/index.php?/topic/88314-personas-koda-algoritms-%C4%8Deksumma/`
 */


function lvLvCheck(tin) {
  tin = tin.replace(/\W/, ''); // Extract date from TIN

  var day = tin.slice(0, 2);

  if (day !== '32') {
    // No date/checksum check if new format
    var month = tin.slice(2, 4);

    if (month !== '00') {
      // No date check if unknown month
      var full_year = tin.slice(4, 6);

      switch (tin[6]) {
        case '0':
          full_year = "18".concat(full_year);
          break;

        case '1':
          full_year = "19".concat(full_year);
          break;

        default:
          full_year = "20".concat(full_year);
          break;
      } // Check date validity


      var date = "".concat(full_year, "/").concat(tin.slice(2, 4), "/").concat(day);

      if (!isDate(date, 'YYYY/MM/DD')) {
        return false;
      }
    } // Calculate check digit


    var checksum = 1101;
    var multip_lookup = [1, 6, 3, 7, 9, 10, 5, 8, 4, 2];

    for (var i = 0; i < tin.length - 1; i++) {
      checksum -= parseInt(tin[i], 10) * multip_lookup[i];
    }

    return parseInt(tin[10], 10) === checksum % 11;
  }

  return true;
}
/*
 * mt-MT validation function
 * (Identity Card Number or Unique Taxpayer Reference, persons/entities)
 * Verify Identity Card Number structure (no other tests found)
 */


function mtMtCheck(tin) {
  if (tin.length !== 9) {
    // No tests for UTR
    var chars = tin.toUpperCase().split(''); // Fill with zeros if smaller than proper

    while (chars.length < 8) {
      chars.unshift(0);
    } // Validate format according to last character


    switch (tin[7]) {
      case 'A':
      case 'P':
        if (parseInt(chars[6], 10) === 0) {
          return false;
        }

        break;

      default:
        {
          var first_part = parseInt(chars.join('').slice(0, 5), 10);

          if (first_part > 32000) {
            return false;
          }

          var second_part = parseInt(chars.join('').slice(5, 7), 10);

          if (first_part === second_part) {
            return false;
          }
        }
    }
  }

  return true;
}
/*
 * nl-NL validation function
 * (Burgerservicenummer (BSN) or Rechtspersonen Samenwerkingsverbanden Informatie Nummer (RSIN),
 * persons/entities respectively)
 * Verify TIN validity by calculating check (last) digit (variant of MOD 11)
 */


function nlNlCheck(tin) {
  return reverseMultiplyAndSum(tin.split('').slice(0, 8).map(function (a) {
    return parseInt(a, 10);
  }), 9) % 11 === parseInt(tin[8], 10);
}
/*
 * pl-PL validation function
 * (Powszechny Elektroniczny System Ewidencji Ludności (PESEL)
 * or Numer identyfikacji podatkowej (NIP), persons/entities)
 * Verify TIN validity by validating birth date (PESEL) and calculating check (last) digit
 */


function plPlCheck(tin) {
  // NIP
  if (tin.length === 10) {
    // Calculate last digit by multiplying with lookup
    var lookup = [6, 5, 7, 2, 3, 4, 5, 6, 7];
    var _checksum = 0;

    for (var i = 0; i < lookup.length; i++) {
      _checksum += parseInt(tin[i], 10) * lookup[i];
    }

    _checksum %= 11;

    if (_checksum === 10) {
      return false;
    }

    return _checksum === parseInt(tin[9], 10);
  } // PESEL
  // Extract full year using month


  var full_year = tin.slice(0, 2);
  var month = parseInt(tin.slice(2, 4), 10);

  if (month > 80) {
    full_year = "18".concat(full_year);
    month -= 80;
  } else if (month > 60) {
    full_year = "22".concat(full_year);
    month -= 60;
  } else if (month > 40) {
    full_year = "21".concat(full_year);
    month -= 40;
  } else if (month > 20) {
    full_year = "20".concat(full_year);
    month -= 20;
  } else {
    full_year = "19".concat(full_year);
  } // Add leading zero to month if needed


  if (month < 10) {
    month = "0".concat(month);
  } // Check date validity


  var date = "".concat(full_year, "/").concat(month, "/").concat(tin.slice(4, 6));

  if (!isDate(date, 'YYYY/MM/DD')) {
    return false;
  } // Calculate last digit by mulitplying with odd one-digit numbers except 5


  var checksum = 0;
  var multiplier = 1;

  for (var _i7 = 0; _i7 < tin.length - 1; _i7++) {
    checksum += parseInt(tin[_i7], 10) * multiplier % 10;
    multiplier += 2;

    if (multiplier > 10) {
      multiplier = 1;
    } else if (multiplier === 5) {
      multiplier += 2;
    }
  }

  checksum = 10 - checksum % 10;
  return checksum === parseInt(tin[10], 10);
}
/*
* pt-BR validation function
* (Cadastro de Pessoas Físicas (CPF, persons)
* Cadastro Nacional de Pessoas Jurídicas (CNPJ, entities)
* Both inputs will be validated
*/


function ptBrCheck(tin) {
  if (tin.length === 11) {
    var _sum;

    var remainder;
    _sum = 0;
    if ( // Reject known invalid CPFs
    tin === '11111111111' || tin === '22222222222' || tin === '33333333333' || tin === '44444444444' || tin === '55555555555' || tin === '66666666666' || tin === '77777777777' || tin === '88888888888' || tin === '99999999999' || tin === '00000000000') return false;

    for (var i = 1; i <= 9; i++) {
      _sum += parseInt(tin.substring(i - 1, i), 10) * (11 - i);
    }

    remainder = _sum * 10 % 11;
    if (remainder === 10) remainder = 0;
    if (remainder !== parseInt(tin.substring(9, 10), 10)) return false;
    _sum = 0;

    for (var _i8 = 1; _i8 <= 10; _i8++) {
      _sum += parseInt(tin.substring(_i8 - 1, _i8), 10) * (12 - _i8);
    }

    remainder = _sum * 10 % 11;
    if (remainder === 10) remainder = 0;
    if (remainder !== parseInt(tin.substring(10, 11), 10)) return false;
    return true;
  }

  if ( // Reject know invalid CNPJs
  tin === '00000000000000' || tin === '11111111111111' || tin === '22222222222222' || tin === '33333333333333' || tin === '44444444444444' || tin === '55555555555555' || tin === '66666666666666' || tin === '77777777777777' || tin === '88888888888888' || tin === '99999999999999') {
    return false;
  }

  var length = tin.length - 2;
  var identifiers = tin.substring(0, length);
  var verificators = tin.substring(length);
  var sum = 0;
  var pos = length - 7;

  for (var _i9 = length; _i9 >= 1; _i9--) {
    sum += identifiers.charAt(length - _i9) * pos;
    pos -= 1;

    if (pos < 2) {
      pos = 9;
    }
  }

  var result = sum % 11 < 2 ? 0 : 11 - sum % 11;

  if (result !== parseInt(verificators.charAt(0), 10)) {
    return false;
  }

  length += 1;
  identifiers = tin.substring(0, length);
  sum = 0;
  pos = length - 7;

  for (var _i10 = length; _i10 >= 1; _i10--) {
    sum += identifiers.charAt(length - _i10) * pos;
    pos -= 1;

    if (pos < 2) {
      pos = 9;
    }
  }

  result = sum % 11 < 2 ? 0 : 11 - sum % 11;

  if (result !== parseInt(verificators.charAt(1), 10)) {
    return false;
  }

  return true;
}
/*
 * pt-PT validation function
 * (Número de identificação fiscal (NIF), persons/entities)
 * Verify TIN validity by calculating check (last) digit (variant of MOD 11)
 */


function ptPtCheck(tin) {
  var checksum = 11 - reverseMultiplyAndSum(tin.split('').slice(0, 8).map(function (a) {
    return parseInt(a, 10);
  }), 9) % 11;

  if (checksum > 9) {
    return parseInt(tin[8], 10) === 0;
  }

  return checksum === parseInt(tin[8], 10);
}
/*
 * ro-RO validation function
 * (Cod Numeric Personal (CNP) or Cod de înregistrare fiscală (CIF),
 * persons only)
 * Verify CNP validity by calculating check (last) digit (test not found for CIF)
 * Material not in DG TAXUD document sourced from:
 * `https://en.wikipedia.org/wiki/National_identification_number#Romania`
 */


function roRoCheck(tin) {
  if (tin.slice(0, 4) !== '9000') {
    // No test found for this format
    // Extract full year using century digit if possible
    var full_year = tin.slice(1, 3);

    switch (tin[0]) {
      case '1':
      case '2':
        full_year = "19".concat(full_year);
        break;

      case '3':
      case '4':
        full_year = "18".concat(full_year);
        break;

      case '5':
      case '6':
        full_year = "20".concat(full_year);
        break;

      default:
    } // Check date validity


    var date = "".concat(full_year, "/").concat(tin.slice(3, 5), "/").concat(tin.slice(5, 7));

    if (date.length === 8) {
      if (!isDate(date, 'YY/MM/DD')) {
        return false;
      }
    } else if (!isDate(date, 'YYYY/MM/DD')) {
      return false;
    } // Calculate check digit


    var digits = tin.split('').map(function (a) {
      return parseInt(a, 10);
    });
    var multipliers = [2, 7, 9, 1, 4, 6, 3, 5, 8, 2, 7, 9];
    var checksum = 0;

    for (var i = 0; i < multipliers.length; i++) {
      checksum += digits[i] * multipliers[i];
    }

    if (checksum % 11 === 10) {
      return digits[12] === 1;
    }

    return digits[12] === checksum % 11;
  }

  return true;
}
/*
 * sk-SK validation function
 * (Rodné číslo (RČ) or bezvýznamové identifikačné číslo (BIČ), persons only)
 * Checks validity of pre-1954 birth numbers (rodné číslo) only
 * Due to the introduction of the pseudo-random BIČ it is not possible to test
 * post-1954 birth numbers without knowing whether they are BIČ or RČ beforehand
 */


function skSkCheck(tin) {
  if (tin.length === 9) {
    tin = tin.replace(/\W/, '');

    if (tin.slice(6) === '000') {
      return false;
    } // Three-zero serial not assigned before 1954
    // Extract full year from TIN length


    var full_year = parseInt(tin.slice(0, 2), 10);

    if (full_year > 53) {
      return false;
    }

    if (full_year < 10) {
      full_year = "190".concat(full_year);
    } else {
      full_year = "19".concat(full_year);
    } // Extract month from TIN and normalize


    var month = parseInt(tin.slice(2, 4), 10);

    if (month > 50) {
      month -= 50;
    }

    if (month < 10) {
      month = "0".concat(month);
    } // Check date validity


    var date = "".concat(full_year, "/").concat(month, "/").concat(tin.slice(4, 6));

    if (!isDate(date, 'YYYY/MM/DD')) {
      return false;
    }
  }

  return true;
}
/*
 * sl-SI validation function
 * (Davčna številka, persons/entities)
 * Verify TIN validity by calculating check (last) digit (variant of MOD 11)
 */


function slSiCheck(tin) {
  var checksum = 11 - reverseMultiplyAndSum(tin.split('').slice(0, 7).map(function (a) {
    return parseInt(a, 10);
  }), 8) % 11;

  if (checksum === 10) {
    return parseInt(tin[7], 10) === 0;
  }

  return checksum === parseInt(tin[7], 10);
}
/*
 * sv-SE validation function
 * (Personnummer or samordningsnummer, persons only)
 * Checks validity of birth date and calls luhnCheck() to validate check (last) digit
 */


function svSeCheck(tin) {
  // Make copy of TIN and normalize to two-digit year form
  var tin_copy = tin.slice(0);

  if (tin.length > 11) {
    tin_copy = tin_copy.slice(2);
  } // Extract date of birth


  var full_year = '';
  var month = tin_copy.slice(2, 4);
  var day = parseInt(tin_copy.slice(4, 6), 10);

  if (tin.length > 11) {
    full_year = tin.slice(0, 4);
  } else {
    full_year = tin.slice(0, 2);

    if (tin.length === 11 && day < 60) {
      // Extract full year from centenarian symbol
      // Should work just fine until year 10000 or so
      var current_year = new Date().getFullYear().toString();
      var current_century = parseInt(current_year.slice(0, 2), 10);
      current_year = parseInt(current_year, 10);

      if (tin[6] === '-') {
        if (parseInt("".concat(current_century).concat(full_year), 10) > current_year) {
          full_year = "".concat(current_century - 1).concat(full_year);
        } else {
          full_year = "".concat(current_century).concat(full_year);
        }
      } else {
        full_year = "".concat(current_century - 1).concat(full_year);

        if (current_year - parseInt(full_year, 10) < 100) {
          return false;
        }
      }
    }
  } // Normalize day and check date validity


  if (day > 60) {
    day -= 60;
  }

  if (day < 10) {
    day = "0".concat(day);
  }

  var date = "".concat(full_year, "/").concat(month, "/").concat(day);

  if (date.length === 8) {
    if (!isDate(date, 'YY/MM/DD')) {
      return false;
    }
  } else if (!isDate(date, 'YYYY/MM/DD')) {
    return false;
  }

  return luhnCheck(tin.replace(/\W/, ''));
} // Locale lookup objects

/*
 * Tax id regex formats for various locales
 *
 * Where not explicitly specified in DG-TAXUD document both
 * uppercase and lowercase letters are acceptable.
 */


var taxIdFormat = {
  'bg-BG': /^\d{10}$/,
  'cs-CZ': /^\d{6}\/{0,1}\d{3,4}$/,
  'de-AT': /^\d{9}$/,
  'de-DE': /^[1-9]\d{10}$/,
  'dk-DK': /^\d{6}-{0,1}\d{4}$/,
  'el-CY': /^[09]\d{7}[A-Z]$/,
  'el-GR': /^([0-4]|[7-9])\d{8}$/,
  'en-GB': /^\d{10}$|^(?!GB|NK|TN|ZZ)(?![DFIQUV])[A-Z](?![DFIQUVO])[A-Z]\d{6}[ABCD ]$/i,
  'en-IE': /^\d{7}[A-W][A-IW]{0,1}$/i,
  'en-US': /^\d{2}[- ]{0,1}\d{7}$/,
  'es-ES': /^(\d{0,8}|[XYZKLM]\d{7})[A-HJ-NP-TV-Z]$/i,
  'et-EE': /^[1-6]\d{6}(00[1-9]|0[1-9][0-9]|[1-6][0-9]{2}|70[0-9]|710)\d$/,
  'fi-FI': /^\d{6}[-+A]\d{3}[0-9A-FHJ-NPR-Y]$/i,
  'fr-BE': /^\d{11}$/,
  'fr-FR': /^[0-3]\d{12}$|^[0-3]\d\s\d{2}(\s\d{3}){3}$/,
  // Conforms both to official spec and provided example
  'fr-LU': /^\d{13}$/,
  'hr-HR': /^\d{11}$/,
  'hu-HU': /^8\d{9}$/,
  'it-IT': /^[A-Z]{6}[L-NP-V0-9]{2}[A-EHLMPRST][L-NP-V0-9]{2}[A-ILMZ][L-NP-V0-9]{3}[A-Z]$/i,
  'lv-LV': /^\d{6}-{0,1}\d{5}$/,
  // Conforms both to DG TAXUD spec and original research
  'mt-MT': /^\d{3,7}[APMGLHBZ]$|^([1-8])\1\d{7}$/i,
  'nl-NL': /^\d{9}$/,
  'pl-PL': /^\d{10,11}$/,
  'pt-BR': /(?:^\d{11}$)|(?:^\d{14}$)/,
  'pt-PT': /^\d{9}$/,
  'ro-RO': /^\d{13}$/,
  'sk-SK': /^\d{6}\/{0,1}\d{3,4}$/,
  'sl-SI': /^[1-9]\d{7}$/,
  'sv-SE': /^(\d{6}[-+]{0,1}\d{4}|(18|19|20)\d{6}[-+]{0,1}\d{4})$/
}; // taxIdFormat locale aliases

taxIdFormat['lb-LU'] = taxIdFormat['fr-LU'];
taxIdFormat['lt-LT'] = taxIdFormat['et-EE'];
taxIdFormat['nl-BE'] = taxIdFormat['fr-BE']; // Algorithmic tax id check functions for various locales

var taxIdCheck = {
  'bg-BG': bgBgCheck,
  'cs-CZ': csCzCheck,
  'de-AT': deAtCheck,
  'de-DE': deDeCheck,
  'dk-DK': dkDkCheck,
  'el-CY': elCyCheck,
  'el-GR': elGrCheck,
  'en-IE': enIeCheck,
  'en-US': enUsCheck,
  'es-ES': esEsCheck,
  'et-EE': etEeCheck,
  'fi-FI': fiFiCheck,
  'fr-BE': frBeCheck,
  'fr-FR': frFrCheck,
  'fr-LU': frLuCheck,
  'hr-HR': hrHrCheck,
  'hu-HU': huHuCheck,
  'it-IT': itItCheck,
  'lv-LV': lvLvCheck,
  'mt-MT': mtMtCheck,
  'nl-NL': nlNlCheck,
  'pl-PL': plPlCheck,
  'pt-BR': ptBrCheck,
  'pt-PT': ptPtCheck,
  'ro-RO': roRoCheck,
  'sk-SK': skSkCheck,
  'sl-SI': slSiCheck,
  'sv-SE': svSeCheck
}; // taxIdCheck locale aliases

taxIdCheck['lb-LU'] = taxIdCheck['fr-LU'];
taxIdCheck['lt-LT'] = taxIdCheck['et-EE'];
taxIdCheck['nl-BE'] = taxIdCheck['fr-BE']; // Regexes for locales where characters should be omitted before checking format

var allsymbols = /[-\\\/!@#$%\^&\*\(\)\+\=\[\]]+/g;
var sanitizeRegexes = {
  'de-AT': allsymbols,
  'de-DE': /[\/\\]/g,
  'fr-BE': allsymbols
}; // sanitizeRegexes locale aliases

sanitizeRegexes['nl-BE'] = sanitizeRegexes['fr-BE'];
/*
 * Validator function
 * Return true if the passed string is a valid tax identification number
 * for the specified locale.
 * Throw an error exception if the locale is not supported.
 */

function isTaxID(str) {
  var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en-US';
  assertString(str); // Copy TIN to avoid replacement if sanitized

  var strcopy = str.slice(0);

  if (locale in taxIdFormat) {
    if (locale in sanitizeRegexes) {
      strcopy = strcopy.replace(sanitizeRegexes[locale], '');
    }

    if (!taxIdFormat[locale].test(strcopy)) {
      return false;
    }

    if (locale in taxIdCheck) {
      return taxIdCheck[locale](strcopy);
    } // Fallthrough; not all locales have algorithmic checks


    return true;
  }

  throw new Error("Invalid locale '".concat(locale, "'"));
}

/* eslint-disable max-len */

var phones = {
  'am-AM': /^(\+?374|0)((10|[9|7][0-9])\d{6}$|[2-4]\d{7}$)/,
  'ar-AE': /^((\+?971)|0)?5[024568]\d{7}$/,
  'ar-BH': /^(\+?973)?(3|6)\d{7}$/,
  'ar-DZ': /^(\+?213|0)(5|6|7)\d{8}$/,
  'ar-LB': /^(\+?961)?((3|81)\d{6}|7\d{7})$/,
  'ar-EG': /^((\+?20)|0)?1[0125]\d{8}$/,
  'ar-IQ': /^(\+?964|0)?7[0-9]\d{8}$/,
  'ar-JO': /^(\+?962|0)?7[789]\d{7}$/,
  'ar-KW': /^(\+?965)[569]\d{7}$/,
  'ar-LY': /^((\+?218)|0)?(9[1-6]\d{7}|[1-8]\d{7,9})$/,
  'ar-MA': /^(?:(?:\+|00)212|0)[5-7]\d{8}$/,
  'ar-OM': /^((\+|00)968)?(9[1-9])\d{6}$/,
  'ar-PS': /^(\+?970|0)5[6|9](\d{7})$/,
  'ar-SA': /^(!?(\+?966)|0)?5\d{8}$/,
  'ar-SY': /^(!?(\+?963)|0)?9\d{8}$/,
  'ar-TN': /^(\+?216)?[2459]\d{7}$/,
  'az-AZ': /^(\+994|0)(5[015]|7[07]|99)\d{7}$/,
  'bs-BA': /^((((\+|00)3876)|06))((([0-3]|[5-6])\d{6})|(4\d{7}))$/,
  'be-BY': /^(\+?375)?(24|25|29|33|44)\d{7}$/,
  'bg-BG': /^(\+?359|0)?8[789]\d{7}$/,
  'bn-BD': /^(\+?880|0)1[13456789][0-9]{8}$/,
  'ca-AD': /^(\+376)?[346]\d{5}$/,
  'cs-CZ': /^(\+?420)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$/,
  'da-DK': /^(\+?45)?\s?\d{2}\s?\d{2}\s?\d{2}\s?\d{2}$/,
  'de-DE': /^((\+49|0)[1|3])([0|5][0-45-9]\d|6([23]|0\d?)|7([0-57-9]|6\d))\d{7,9}$/,
  'de-AT': /^(\+43|0)\d{1,4}\d{3,12}$/,
  'de-CH': /^(\+41|0)([1-9])\d{1,9}$/,
  'de-LU': /^(\+352)?((6\d1)\d{6})$/,
  'dv-MV': /^(\+?960)?(7[2-9]|91|9[3-9])\d{7}$/,
  'el-GR': /^(\+?30|0)?(69\d{8})$/,
  'en-AU': /^(\+?61|0)4\d{8}$/,
  'en-BM': /^(\+?1)?441(((3|7)\d{6}$)|(5[0-3][0-9]\d{4}$)|(59\d{5}))/,
  'en-GB': /^(\+?44|0)7\d{9}$/,
  'en-GG': /^(\+?44|0)1481\d{6}$/,
  'en-GH': /^(\+233|0)(20|50|24|54|27|57|26|56|23|28|55|59)\d{7}$/,
  'en-GY': /^(\+592|0)6\d{6}$/,
  'en-HK': /^(\+?852[-\s]?)?[456789]\d{3}[-\s]?\d{4}$/,
  'en-MO': /^(\+?853[-\s]?)?[6]\d{3}[-\s]?\d{4}$/,
  'en-IE': /^(\+?353|0)8[356789]\d{7}$/,
  'en-IN': /^(\+?91|0)?[6789]\d{9}$/,
  'en-KE': /^(\+?254|0)(7|1)\d{8}$/,
  'en-KI': /^((\+686|686)?)?( )?((6|7)(2|3|8)[0-9]{6})$/,
  'en-MT': /^(\+?356|0)?(99|79|77|21|27|22|25)[0-9]{6}$/,
  'en-MU': /^(\+?230|0)?\d{8}$/,
  'en-NA': /^(\+?264|0)(6|8)\d{7}$/,
  'en-NG': /^(\+?234|0)?[789]\d{9}$/,
  'en-NZ': /^(\+?64|0)[28]\d{7,9}$/,
  'en-PK': /^((00|\+)?92|0)3[0-6]\d{8}$/,
  'en-PH': /^(09|\+639)\d{9}$/,
  'en-RW': /^(\+?250|0)?[7]\d{8}$/,
  'en-SG': /^(\+65)?[3689]\d{7}$/,
  'en-SL': /^(\+?232|0)\d{8}$/,
  'en-TZ': /^(\+?255|0)?[67]\d{8}$/,
  'en-UG': /^(\+?256|0)?[7]\d{8}$/,
  'en-US': /^((\+1|1)?( |-)?)?(\([2-9][0-9]{2}\)|[2-9][0-9]{2})( |-)?([2-9][0-9]{2}( |-)?[0-9]{4})$/,
  'en-ZA': /^(\+?27|0)\d{9}$/,
  'en-ZM': /^(\+?26)?09[567]\d{7}$/,
  'en-ZW': /^(\+263)[0-9]{9}$/,
  'en-BW': /^(\+?267)?(7[1-8]{1})\d{6}$/,
  'es-AR': /^\+?549(11|[2368]\d)\d{8}$/,
  'es-BO': /^(\+?591)?(6|7)\d{7}$/,
  'es-CO': /^(\+?57)?3(0(0|1|2|4|5)|1\d|2[0-4]|5(0|1))\d{7}$/,
  'es-CL': /^(\+?56|0)[2-9]\d{1}\d{7}$/,
  'es-CR': /^(\+506)?[2-8]\d{7}$/,
  'es-CU': /^(\+53|0053)?5\d{7}/,
  'es-DO': /^(\+?1)?8[024]9\d{7}$/,
  'es-HN': /^(\+?504)?[9|8]\d{7}$/,
  'es-EC': /^(\+?593|0)([2-7]|9[2-9])\d{7}$/,
  'es-ES': /^(\+?34)?[6|7]\d{8}$/,
  'es-PE': /^(\+?51)?9\d{8}$/,
  'es-MX': /^(\+?52)?(1|01)?\d{10,11}$/,
  'es-PA': /^(\+?507)\d{7,8}$/,
  'es-PY': /^(\+?595|0)9[9876]\d{7}$/,
  'es-SV': /^(\+?503)?[67]\d{7}$/,
  'es-UY': /^(\+598|0)9[1-9][\d]{6}$/,
  'es-VE': /^(\+?58)?(2|4)\d{9}$/,
  'et-EE': /^(\+?372)?\s?(5|8[1-4])\s?([0-9]\s?){6,7}$/,
  'fa-IR': /^(\+?98[\-\s]?|0)9[0-39]\d[\-\s]?\d{3}[\-\s]?\d{4}$/,
  'fi-FI': /^(\+?358|0)\s?(4(0|1|2|4|5|6)?|50)\s?(\d\s?){4,8}\d$/,
  'fj-FJ': /^(\+?679)?\s?\d{3}\s?\d{4}$/,
  'fo-FO': /^(\+?298)?\s?\d{2}\s?\d{2}\s?\d{2}$/,
  'fr-BF': /^(\+226|0)[67]\d{7}$/,
  'fr-CM': /^(\+?237)6[0-9]{8}$/,
  'fr-FR': /^(\+?33|0)[67]\d{8}$/,
  'fr-GF': /^(\+?594|0|00594)[67]\d{8}$/,
  'fr-GP': /^(\+?590|0|00590)[67]\d{8}$/,
  'fr-MQ': /^(\+?596|0|00596)[67]\d{8}$/,
  'fr-PF': /^(\+?689)?8[789]\d{6}$/,
  'fr-RE': /^(\+?262|0|00262)[67]\d{8}$/,
  'he-IL': /^(\+972|0)([23489]|5[012345689]|77)[1-9]\d{6}$/,
  'hu-HU': /^(\+?36|06)(20|30|31|50|70)\d{7}$/,
  'id-ID': /^(\+?62|0)8(1[123456789]|2[1238]|3[1238]|5[12356789]|7[78]|9[56789]|8[123456789])([\s?|\d]{5,11})$/,
  'it-IT': /^(\+?39)?\s?3\d{2} ?\d{6,7}$/,
  'it-SM': /^((\+378)|(0549)|(\+390549)|(\+3780549))?6\d{5,9}$/,
  'ja-JP': /^(\+81[ \-]?(\(0\))?|0)[6789]0[ \-]?\d{4}[ \-]?\d{4}$/,
  'ka-GE': /^(\+?995)?(5|79)\d{7}$/,
  'kk-KZ': /^(\+?7|8)?7\d{9}$/,
  'kl-GL': /^(\+?299)?\s?\d{2}\s?\d{2}\s?\d{2}$/,
  'ko-KR': /^((\+?82)[ \-]?)?0?1([0|1|6|7|8|9]{1})[ \-]?\d{3,4}[ \-]?\d{4}$/,
  'lt-LT': /^(\+370|8)\d{8}$/,
  'lv-LV': /^(\+?371)2\d{7}$/,
  'ms-MY': /^(\+?6?01){1}(([0145]{1}(\-|\s)?\d{7,8})|([236789]{1}(\s|\-)?\d{7}))$/,
  'mz-MZ': /^(\+?258)?8[234567]\d{7}$/,
  'nb-NO': /^(\+?47)?[49]\d{7}$/,
  'ne-NP': /^(\+?977)?9[78]\d{8}$/,
  'nl-BE': /^(\+?32|0)4\d{8}$/,
  'nl-NL': /^(((\+|00)?31\(0\))|((\+|00)?31)|0)6{1}\d{8}$/,
  'nn-NO': /^(\+?47)?[49]\d{7}$/,
  'pl-PL': /^(\+?48)? ?[5-8]\d ?\d{3} ?\d{2} ?\d{2}$/,
  'pt-BR': /^((\+?55\ ?[1-9]{2}\ ?)|(\+?55\ ?\([1-9]{2}\)\ ?)|(0[1-9]{2}\ ?)|(\([1-9]{2}\)\ ?)|([1-9]{2}\ ?))((\d{4}\-?\d{4})|(9[2-9]{1}\d{3}\-?\d{4}))$/,
  'pt-PT': /^(\+?351)?9[1236]\d{7}$/,
  'pt-AO': /^(\+244)\d{9}$/,
  'ro-RO': /^(\+?4?0)\s?7\d{2}(\/|\s|\.|\-)?\d{3}(\s|\.|\-)?\d{3}$/,
  'ru-RU': /^(\+?7|8)?9\d{9}$/,
  'si-LK': /^(?:0|94|\+94)?(7(0|1|2|4|5|6|7|8)( |-)?)\d{7}$/,
  'sl-SI': /^(\+386\s?|0)(\d{1}\s?\d{3}\s?\d{2}\s?\d{2}|\d{2}\s?\d{3}\s?\d{3})$/,
  'sk-SK': /^(\+?421)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$/,
  'sq-AL': /^(\+355|0)6[789]\d{6}$/,
  'sr-RS': /^(\+3816|06)[- \d]{5,9}$/,
  'sv-SE': /^(\+?46|0)[\s\-]?7[\s\-]?[02369]([\s\-]?\d){7}$/,
  'tg-TJ': /^(\+?992)?[5][5]\d{7}$/,
  'th-TH': /^(\+66|66|0)\d{9}$/,
  'tr-TR': /^(\+?90|0)?5\d{9}$/,
  'tk-TM': /^(\+993|993|8)\d{8}$/,
  'uk-UA': /^(\+?38|8)?0\d{9}$/,
  'uz-UZ': /^(\+?998)?(6[125-79]|7[1-69]|88|9\d)\d{7}$/,
  'vi-VN': /^((\+?84)|0)((3([2-9]))|(5([25689]))|(7([0|6-9]))|(8([1-9]))|(9([0-9])))([0-9]{7})$/,
  'zh-CN': /^((\+|00)86)?(1[3-9]|9[28])\d{9}$/,
  'zh-TW': /^(\+?886\-?|0)?9\d{8}$/,
  'dz-BT': /^(\+?975|0)?(17|16|77|02)\d{6}$/
};
/* eslint-enable max-len */
// aliases

phones['en-CA'] = phones['en-US'];
phones['fr-CA'] = phones['en-CA'];
phones['fr-BE'] = phones['nl-BE'];
phones['zh-HK'] = phones['en-HK'];
phones['zh-MO'] = phones['en-MO'];
phones['ga-IE'] = phones['en-IE'];
phones['fr-CH'] = phones['de-CH'];
phones['it-CH'] = phones['fr-CH'];
function isMobilePhone(str, locale, options) {
  assertString(str);

  if (options && options.strictMode && !str.startsWith('+')) {
    return false;
  }

  if (Array.isArray(locale)) {
    return locale.some(function (key) {
      // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
      // istanbul ignore else
      if (phones.hasOwnProperty(key)) {
        var phone = phones[key];

        if (phone.test(str)) {
          return true;
        }
      }

      return false;
    });
  } else if (locale in phones) {
    return phones[locale].test(str); // alias falsey locale as 'any'
  } else if (!locale || locale === 'any') {
    for (var key in phones) {
      // istanbul ignore else
      if (phones.hasOwnProperty(key)) {
        var phone = phones[key];

        if (phone.test(str)) {
          return true;
        }
      }
    }

    return false;
  }

  throw new Error("Invalid locale '".concat(locale, "'"));
}
var locales$4 = Object.keys(phones);

var eth = /^(0x)[0-9a-f]{40}$/i;
function isEthereumAddress(str) {
  assertString(str);
  return eth.test(str);
}

function currencyRegex(options) {
  var decimal_digits = "\\d{".concat(options.digits_after_decimal[0], "}");
  options.digits_after_decimal.forEach(function (digit, index) {
    if (index !== 0) decimal_digits = "".concat(decimal_digits, "|\\d{").concat(digit, "}");
  });
  var symbol = "(".concat(options.symbol.replace(/\W/, function (m) {
    return "\\".concat(m);
  }), ")").concat(options.require_symbol ? '' : '?'),
      negative = '-?',
      whole_dollar_amount_without_sep = '[1-9]\\d*',
      whole_dollar_amount_with_sep = "[1-9]\\d{0,2}(\\".concat(options.thousands_separator, "\\d{3})*"),
      valid_whole_dollar_amounts = ['0', whole_dollar_amount_without_sep, whole_dollar_amount_with_sep],
      whole_dollar_amount = "(".concat(valid_whole_dollar_amounts.join('|'), ")?"),
      decimal_amount = "(\\".concat(options.decimal_separator, "(").concat(decimal_digits, "))").concat(options.require_decimal ? '' : '?');
  var pattern = whole_dollar_amount + (options.allow_decimal || options.require_decimal ? decimal_amount : ''); // default is negative sign before symbol, but there are two other options (besides parens)

  if (options.allow_negatives && !options.parens_for_negatives) {
    if (options.negative_sign_after_digits) {
      pattern += negative;
    } else if (options.negative_sign_before_digits) {
      pattern = negative + pattern;
    }
  } // South African Rand, for example, uses R 123 (space) and R-123 (no space)


  if (options.allow_negative_sign_placeholder) {
    pattern = "( (?!\\-))?".concat(pattern);
  } else if (options.allow_space_after_symbol) {
    pattern = " ?".concat(pattern);
  } else if (options.allow_space_after_digits) {
    pattern += '( (?!$))?';
  }

  if (options.symbol_after_digits) {
    pattern += symbol;
  } else {
    pattern = symbol + pattern;
  }

  if (options.allow_negatives) {
    if (options.parens_for_negatives) {
      pattern = "(\\(".concat(pattern, "\\)|").concat(pattern, ")");
    } else if (!(options.negative_sign_before_digits || options.negative_sign_after_digits)) {
      pattern = negative + pattern;
    }
  } // ensure there's a dollar and/or decimal amount, and that
  // it doesn't start with a space or a negative sign followed by a space


  return new RegExp("^(?!-? )(?=.*\\d)".concat(pattern, "$"));
}

var default_currency_options = {
  symbol: '$',
  require_symbol: false,
  allow_space_after_symbol: false,
  symbol_after_digits: false,
  allow_negatives: true,
  parens_for_negatives: false,
  negative_sign_before_digits: false,
  negative_sign_after_digits: false,
  allow_negative_sign_placeholder: false,
  thousands_separator: ',',
  decimal_separator: '.',
  allow_decimal: true,
  require_decimal: false,
  digits_after_decimal: [2],
  allow_space_after_digits: false
};
function isCurrency(str, options) {
  assertString(str);
  options = merge(options, default_currency_options);
  return currencyRegex(options).test(str);
}

var bech32 = /^(bc1)[a-z0-9]{25,39}$/;
var base58 = /^(1|3)[A-HJ-NP-Za-km-z1-9]{25,39}$/;
function isBtcAddress(str) {
  assertString(str); // check for bech32

  if (str.startsWith('bc1')) {
    return bech32.test(str);
  }

  return base58.test(str);
}

/* eslint-disable max-len */
// from http://goo.gl/0ejHHW

var iso8601 = /^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-3])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/; // same as above, except with a strict 'T' separator between date and time

var iso8601StrictSeparator = /^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-3])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T]((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/;
/* eslint-enable max-len */

var isValidDate = function isValidDate(str) {
  // str must have passed the ISO8601 check
  // this check is meant to catch invalid dates
  // like 2009-02-31
  // first check for ordinal dates
  var ordinalMatch = str.match(/^(\d{4})-?(\d{3})([ T]{1}\.*|$)/);

  if (ordinalMatch) {
    var oYear = Number(ordinalMatch[1]);
    var oDay = Number(ordinalMatch[2]); // if is leap year

    if (oYear % 4 === 0 && oYear % 100 !== 0 || oYear % 400 === 0) return oDay <= 366;
    return oDay <= 365;
  }

  var match = str.match(/(\d{4})-?(\d{0,2})-?(\d*)/).map(Number);
  var year = match[1];
  var month = match[2];
  var day = match[3];
  var monthString = month ? "0".concat(month).slice(-2) : month;
  var dayString = day ? "0".concat(day).slice(-2) : day; // create a date object and compare

  var d = new Date("".concat(year, "-").concat(monthString || '01', "-").concat(dayString || '01'));

  if (month && day) {
    return d.getUTCFullYear() === year && d.getUTCMonth() + 1 === month && d.getUTCDate() === day;
  }

  return true;
};

function isISO8601(str) {
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  assertString(str);
  var check = options.strictSeparator ? iso8601StrictSeparator.test(str) : iso8601.test(str);
  if (check && options.strict) return isValidDate(str);
  return check;
}

/* Based on https://tools.ietf.org/html/rfc3339#section-5.6 */

var dateFullYear = /[0-9]{4}/;
var dateMonth = /(0[1-9]|1[0-2])/;
var dateMDay = /([12]\d|0[1-9]|3[01])/;
var timeHour = /([01][0-9]|2[0-3])/;
var timeMinute = /[0-5][0-9]/;
var timeSecond = /([0-5][0-9]|60)/;
var timeSecFrac = /(\.[0-9]+)?/;
var timeNumOffset = new RegExp("[-+]".concat(timeHour.source, ":").concat(timeMinute.source));
var timeOffset = new RegExp("([zZ]|".concat(timeNumOffset.source, ")"));
var partialTime = new RegExp("".concat(timeHour.source, ":").concat(timeMinute.source, ":").concat(timeSecond.source).concat(timeSecFrac.source));
var fullDate = new RegExp("".concat(dateFullYear.source, "-").concat(dateMonth.source, "-").concat(dateMDay.source));
var fullTime = new RegExp("".concat(partialTime.source).concat(timeOffset.source));
var rfc3339 = new RegExp("^".concat(fullDate.source, "[ tT]").concat(fullTime.source, "$"));
function isRFC3339(str) {
  assertString(str);
  return rfc3339.test(str);
}

var validISO31661Alpha3CountriesCodes = new Set(['AFG', 'ALA', 'ALB', 'DZA', 'ASM', 'AND', 'AGO', 'AIA', 'ATA', 'ATG', 'ARG', 'ARM', 'ABW', 'AUS', 'AUT', 'AZE', 'BHS', 'BHR', 'BGD', 'BRB', 'BLR', 'BEL', 'BLZ', 'BEN', 'BMU', 'BTN', 'BOL', 'BES', 'BIH', 'BWA', 'BVT', 'BRA', 'IOT', 'BRN', 'BGR', 'BFA', 'BDI', 'KHM', 'CMR', 'CAN', 'CPV', 'CYM', 'CAF', 'TCD', 'CHL', 'CHN', 'CXR', 'CCK', 'COL', 'COM', 'COG', 'COD', 'COK', 'CRI', 'CIV', 'HRV', 'CUB', 'CUW', 'CYP', 'CZE', 'DNK', 'DJI', 'DMA', 'DOM', 'ECU', 'EGY', 'SLV', 'GNQ', 'ERI', 'EST', 'ETH', 'FLK', 'FRO', 'FJI', 'FIN', 'FRA', 'GUF', 'PYF', 'ATF', 'GAB', 'GMB', 'GEO', 'DEU', 'GHA', 'GIB', 'GRC', 'GRL', 'GRD', 'GLP', 'GUM', 'GTM', 'GGY', 'GIN', 'GNB', 'GUY', 'HTI', 'HMD', 'VAT', 'HND', 'HKG', 'HUN', 'ISL', 'IND', 'IDN', 'IRN', 'IRQ', 'IRL', 'IMN', 'ISR', 'ITA', 'JAM', 'JPN', 'JEY', 'JOR', 'KAZ', 'KEN', 'KIR', 'PRK', 'KOR', 'KWT', 'KGZ', 'LAO', 'LVA', 'LBN', 'LSO', 'LBR', 'LBY', 'LIE', 'LTU', 'LUX', 'MAC', 'MKD', 'MDG', 'MWI', 'MYS', 'MDV', 'MLI', 'MLT', 'MHL', 'MTQ', 'MRT', 'MUS', 'MYT', 'MEX', 'FSM', 'MDA', 'MCO', 'MNG', 'MNE', 'MSR', 'MAR', 'MOZ', 'MMR', 'NAM', 'NRU', 'NPL', 'NLD', 'NCL', 'NZL', 'NIC', 'NER', 'NGA', 'NIU', 'NFK', 'MNP', 'NOR', 'OMN', 'PAK', 'PLW', 'PSE', 'PAN', 'PNG', 'PRY', 'PER', 'PHL', 'PCN', 'POL', 'PRT', 'PRI', 'QAT', 'REU', 'ROU', 'RUS', 'RWA', 'BLM', 'SHN', 'KNA', 'LCA', 'MAF', 'SPM', 'VCT', 'WSM', 'SMR', 'STP', 'SAU', 'SEN', 'SRB', 'SYC', 'SLE', 'SGP', 'SXM', 'SVK', 'SVN', 'SLB', 'SOM', 'ZAF', 'SGS', 'SSD', 'ESP', 'LKA', 'SDN', 'SUR', 'SJM', 'SWZ', 'SWE', 'CHE', 'SYR', 'TWN', 'TJK', 'TZA', 'THA', 'TLS', 'TGO', 'TKL', 'TON', 'TTO', 'TUN', 'TUR', 'TKM', 'TCA', 'TUV', 'UGA', 'UKR', 'ARE', 'GBR', 'USA', 'UMI', 'URY', 'UZB', 'VUT', 'VEN', 'VNM', 'VGB', 'VIR', 'WLF', 'ESH', 'YEM', 'ZMB', 'ZWE']);
function isISO31661Alpha3(str) {
  assertString(str);
  return validISO31661Alpha3CountriesCodes.has(str.toUpperCase());
}

var validISO4217CurrencyCodes = new Set(['AED', 'AFN', 'ALL', 'AMD', 'ANG', 'AOA', 'ARS', 'AUD', 'AWG', 'AZN', 'BAM', 'BBD', 'BDT', 'BGN', 'BHD', 'BIF', 'BMD', 'BND', 'BOB', 'BOV', 'BRL', 'BSD', 'BTN', 'BWP', 'BYN', 'BZD', 'CAD', 'CDF', 'CHE', 'CHF', 'CHW', 'CLF', 'CLP', 'CNY', 'COP', 'COU', 'CRC', 'CUC', 'CUP', 'CVE', 'CZK', 'DJF', 'DKK', 'DOP', 'DZD', 'EGP', 'ERN', 'ETB', 'EUR', 'FJD', 'FKP', 'GBP', 'GEL', 'GHS', 'GIP', 'GMD', 'GNF', 'GTQ', 'GYD', 'HKD', 'HNL', 'HRK', 'HTG', 'HUF', 'IDR', 'ILS', 'INR', 'IQD', 'IRR', 'ISK', 'JMD', 'JOD', 'JPY', 'KES', 'KGS', 'KHR', 'KMF', 'KPW', 'KRW', 'KWD', 'KYD', 'KZT', 'LAK', 'LBP', 'LKR', 'LRD', 'LSL', 'LYD', 'MAD', 'MDL', 'MGA', 'MKD', 'MMK', 'MNT', 'MOP', 'MRU', 'MUR', 'MVR', 'MWK', 'MXN', 'MXV', 'MYR', 'MZN', 'NAD', 'NGN', 'NIO', 'NOK', 'NPR', 'NZD', 'OMR', 'PAB', 'PEN', 'PGK', 'PHP', 'PKR', 'PLN', 'PYG', 'QAR', 'RON', 'RSD', 'RUB', 'RWF', 'SAR', 'SBD', 'SCR', 'SDG', 'SEK', 'SGD', 'SHP', 'SLL', 'SOS', 'SRD', 'SSP', 'STN', 'SVC', 'SYP', 'SZL', 'THB', 'TJS', 'TMT', 'TND', 'TOP', 'TRY', 'TTD', 'TWD', 'TZS', 'UAH', 'UGX', 'USD', 'USN', 'UYI', 'UYU', 'UYW', 'UZS', 'VES', 'VND', 'VUV', 'WST', 'XAF', 'XAG', 'XAU', 'XBA', 'XBB', 'XBC', 'XBD', 'XCD', 'XDR', 'XOF', 'XPD', 'XPF', 'XPT', 'XSU', 'XTS', 'XUA', 'XXX', 'YER', 'ZAR', 'ZMW', 'ZWL']);
function isISO4217(str) {
  assertString(str);
  return validISO4217CurrencyCodes.has(str.toUpperCase());
}

var base32 = /^[A-Z2-7]+=*$/;
function isBase32(str) {
  assertString(str);
  var len = str.length;

  if (len % 8 === 0 && base32.test(str)) {
    return true;
  }

  return false;
}

var base58Reg = /^[A-HJ-NP-Za-km-z1-9]*$/;
function isBase58(str) {
  assertString(str);

  if (base58Reg.test(str)) {
    return true;
  }

  return false;
}

var validMediaType = /^[a-z]+\/[a-z0-9\-\+]+$/i;
var validAttribute = /^[a-z\-]+=[a-z0-9\-]+$/i;
var validData = /^[a-z0-9!\$&'\(\)\*\+,;=\-\._~:@\/\?%\s]*$/i;
function isDataURI(str) {
  assertString(str);
  var data = str.split(',');

  if (data.length < 2) {
    return false;
  }

  var attributes = data.shift().trim().split(';');
  var schemeAndMediaType = attributes.shift();

  if (schemeAndMediaType.substr(0, 5) !== 'data:') {
    return false;
  }

  var mediaType = schemeAndMediaType.substr(5);

  if (mediaType !== '' && !validMediaType.test(mediaType)) {
    return false;
  }

  for (var i = 0; i < attributes.length; i++) {
    if (!(i === attributes.length - 1 && attributes[i].toLowerCase() === 'base64') && !validAttribute.test(attributes[i])) {
      return false;
    }
  }

  for (var _i = 0; _i < data.length; _i++) {
    if (!validData.test(data[_i])) {
      return false;
    }
  }

  return true;
}

var magnetURI = /^magnet:\?xt(?:\.1)?=urn:(?:aich|bitprint|btih|ed2k|ed2khash|kzhash|md5|sha1|tree:tiger):[a-z0-9]{32}(?:[a-z0-9]{8})?($|&)/i;
function isMagnetURI(url) {
  assertString(url);
  return magnetURI.test(url.trim());
}

/*
  Checks if the provided string matches to a correct Media type format (MIME type)

  This function only checks is the string format follows the
  etablished rules by the according RFC specifications.
  This function supports 'charset' in textual media types
  (https://tools.ietf.org/html/rfc6657).

  This function does not check against all the media types listed
  by the IANA (https://www.iana.org/assignments/media-types/media-types.xhtml)
  because of lightness purposes : it would require to include
  all these MIME types in this librairy, which would weigh it
  significantly. This kind of effort maybe is not worth for the use that
  this function has in this entire librairy.

  More informations in the RFC specifications :
  - https://tools.ietf.org/html/rfc2045
  - https://tools.ietf.org/html/rfc2046
  - https://tools.ietf.org/html/rfc7231#section-3.1.1.1
  - https://tools.ietf.org/html/rfc7231#section-3.1.1.5
*/
// Match simple MIME types
// NB :
//   Subtype length must not exceed 100 characters.
//   This rule does not comply to the RFC specs (what is the max length ?).

var mimeTypeSimple = /^(application|audio|font|image|message|model|multipart|text|video)\/[a-zA-Z0-9\.\-\+]{1,100}$/i; // eslint-disable-line max-len
// Handle "charset" in "text/*"

var mimeTypeText = /^text\/[a-zA-Z0-9\.\-\+]{1,100};\s?charset=("[a-zA-Z0-9\.\-\+\s]{0,70}"|[a-zA-Z0-9\.\-\+]{0,70})(\s?\([a-zA-Z0-9\.\-\+\s]{1,20}\))?$/i; // eslint-disable-line max-len
// Handle "boundary" in "multipart/*"

var mimeTypeMultipart = /^multipart\/[a-zA-Z0-9\.\-\+]{1,100}(;\s?(boundary|charset)=("[a-zA-Z0-9\.\-\+\s]{0,70}"|[a-zA-Z0-9\.\-\+]{0,70})(\s?\([a-zA-Z0-9\.\-\+\s]{1,20}\))?){0,2}$/i; // eslint-disable-line max-len

function isMimeType(str) {
  assertString(str);
  return mimeTypeSimple.test(str) || mimeTypeText.test(str) || mimeTypeMultipart.test(str);
}

var lat = /^\(?[+-]?(90(\.0+)?|[1-8]?\d(\.\d+)?)$/;
var _long = /^\s?[+-]?(180(\.0+)?|1[0-7]\d(\.\d+)?|\d{1,2}(\.\d+)?)\)?$/;
var latDMS = /^(([1-8]?\d)\D+([1-5]?\d|60)\D+([1-5]?\d|60)(\.\d+)?|90\D+0\D+0)\D+[NSns]?$/i;
var longDMS = /^\s*([1-7]?\d{1,2}\D+([1-5]?\d|60)\D+([1-5]?\d|60)(\.\d+)?|180\D+0\D+0)\D+[EWew]?$/i;
var defaultLatLongOptions = {
  checkDMS: false
};
function isLatLong(str, options) {
  assertString(str);
  options = merge(options, defaultLatLongOptions);
  if (!str.includes(',')) return false;
  var pair = str.split(',');
  if (pair[0].startsWith('(') && !pair[1].endsWith(')') || pair[1].endsWith(')') && !pair[0].startsWith('(')) return false;

  if (options.checkDMS) {
    return latDMS.test(pair[0]) && longDMS.test(pair[1]);
  }

  return lat.test(pair[0]) && _long.test(pair[1]);
}

var threeDigit = /^\d{3}$/;
var fourDigit = /^\d{4}$/;
var fiveDigit = /^\d{5}$/;
var sixDigit = /^\d{6}$/;
var patterns = {
  AD: /^AD\d{3}$/,
  AT: fourDigit,
  AU: fourDigit,
  AZ: /^AZ\d{4}$/,
  BE: fourDigit,
  BG: fourDigit,
  BR: /^\d{5}-\d{3}$/,
  BY: /2[1-4]{1}\d{4}$/,
  CA: /^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][\s\-]?\d[ABCEGHJ-NPRSTV-Z]\d$/i,
  CH: fourDigit,
  CN: /^(0[1-7]|1[012356]|2[0-7]|3[0-6]|4[0-7]|5[1-7]|6[1-7]|7[1-5]|8[1345]|9[09])\d{4}$/,
  CZ: /^\d{3}\s?\d{2}$/,
  DE: fiveDigit,
  DK: fourDigit,
  DO: fiveDigit,
  DZ: fiveDigit,
  EE: fiveDigit,
  ES: /^(5[0-2]{1}|[0-4]{1}\d{1})\d{3}$/,
  FI: fiveDigit,
  FR: /^\d{2}\s?\d{3}$/,
  GB: /^(gir\s?0aa|[a-z]{1,2}\d[\da-z]?\s?(\d[a-z]{2})?)$/i,
  GR: /^\d{3}\s?\d{2}$/,
  HR: /^([1-5]\d{4}$)/,
  HT: /^HT\d{4}$/,
  HU: fourDigit,
  ID: fiveDigit,
  IE: /^(?!.*(?:o))[A-Za-z]\d[\dw]\s\w{4}$/i,
  IL: /^(\d{5}|\d{7})$/,
  IN: /^((?!10|29|35|54|55|65|66|86|87|88|89)[1-9][0-9]{5})$/,
  IR: /\b(?!(\d)\1{3})[13-9]{4}[1346-9][013-9]{5}\b/,
  IS: threeDigit,
  IT: fiveDigit,
  JP: /^\d{3}\-\d{4}$/,
  KE: fiveDigit,
  KR: /^(\d{5}|\d{6})$/,
  LI: /^(948[5-9]|949[0-7])$/,
  LT: /^LT\-\d{5}$/,
  LU: fourDigit,
  LV: /^LV\-\d{4}$/,
  LK: fiveDigit,
  MX: fiveDigit,
  MT: /^[A-Za-z]{3}\s{0,1}\d{4}$/,
  MY: fiveDigit,
  NL: /^\d{4}\s?[a-z]{2}$/i,
  NO: fourDigit,
  NP: /^(10|21|22|32|33|34|44|45|56|57)\d{3}$|^(977)$/i,
  NZ: fourDigit,
  PL: /^\d{2}\-\d{3}$/,
  PR: /^00[679]\d{2}([ -]\d{4})?$/,
  PT: /^\d{4}\-\d{3}?$/,
  RO: sixDigit,
  RU: sixDigit,
  SA: fiveDigit,
  SE: /^[1-9]\d{2}\s?\d{2}$/,
  SG: sixDigit,
  SI: fourDigit,
  SK: /^\d{3}\s?\d{2}$/,
  TH: fiveDigit,
  TN: fourDigit,
  TW: /^\d{3}(\d{2})?$/,
  UA: fiveDigit,
  US: /^\d{5}(-\d{4})?$/,
  ZA: fourDigit,
  ZM: fiveDigit
};
var locales$5 = Object.keys(patterns);
function isPostalCode(str, locale) {
  assertString(str);

  if (locale in patterns) {
    return patterns[locale].test(str);
  } else if (locale === 'any') {
    for (var key in patterns) {
      // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
      // istanbul ignore else
      if (patterns.hasOwnProperty(key)) {
        var pattern = patterns[key];

        if (pattern.test(str)) {
          return true;
        }
      }
    }

    return false;
  }

  throw new Error("Invalid locale '".concat(locale, "'"));
}

function ltrim(str, chars) {
  assertString(str); // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping

  var pattern = chars ? new RegExp("^[".concat(chars.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), "]+"), 'g') : /^\s+/g;
  return str.replace(pattern, '');
}

function rtrim(str, chars) {
  assertString(str);

  if (chars) {
    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping
    var pattern = new RegExp("[".concat(chars.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), "]+$"), 'g');
    return str.replace(pattern, '');
  } // Use a faster and more safe than regex trim method https://blog.stevenlevithan.com/archives/faster-trim-javascript


  var strIndex = str.length - 1;

  while (/\s/.test(str.charAt(strIndex))) {
    strIndex -= 1;
  }

  return str.slice(0, strIndex + 1);
}

function trim(str, chars) {
  return rtrim(ltrim(str, chars), chars);
}

function escape(str) {
  assertString(str);
  return str.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/'/g, '&#x27;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\//g, '&#x2F;').replace(/\\/g, '&#x5C;').replace(/`/g, '&#96;');
}

function unescape(str) {
  assertString(str);
  return str.replace(/&quot;/g, '"').replace(/&#x27;/g, "'").replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&#x2F;/g, '/').replace(/&#x5C;/g, '\\').replace(/&#96;/g, '`').replace(/&amp;/g, '&'); // &amp; replacement has to be the last one to prevent
  // bugs with intermediate strings containing escape sequences
  // See: https://github.com/validatorjs/validator.js/issues/1827
}

function blacklist$1(str, chars) {
  assertString(str);
  return str.replace(new RegExp("[".concat(chars, "]+"), 'g'), '');
}

function stripLow(str, keep_new_lines) {
  assertString(str);
  var chars = keep_new_lines ? '\\x00-\\x09\\x0B\\x0C\\x0E-\\x1F\\x7F' : '\\x00-\\x1F\\x7F';
  return blacklist$1(str, chars);
}

function whitelist(str, chars) {
  assertString(str);
  return str.replace(new RegExp("[^".concat(chars, "]+"), 'g'), '');
}

function isWhitelisted(str, chars) {
  assertString(str);

  for (var i = str.length - 1; i >= 0; i--) {
    if (chars.indexOf(str[i]) === -1) {
      return false;
    }
  }

  return true;
}

var default_normalize_email_options = {
  // The following options apply to all email addresses
  // Lowercases the local part of the email address.
  // Please note this may violate RFC 5321 as per http://stackoverflow.com/a/9808332/192024).
  // The domain is always lowercased, as per RFC 1035
  all_lowercase: true,
  // The following conversions are specific to GMail
  // Lowercases the local part of the GMail address (known to be case-insensitive)
  gmail_lowercase: true,
  // Removes dots from the local part of the email address, as that's ignored by GMail
  gmail_remove_dots: true,
  // Removes the subaddress (e.g. "+foo") from the email address
  gmail_remove_subaddress: true,
  // Conversts the googlemail.com domain to gmail.com
  gmail_convert_googlemaildotcom: true,
  // The following conversions are specific to Outlook.com / Windows Live / Hotmail
  // Lowercases the local part of the Outlook.com address (known to be case-insensitive)
  outlookdotcom_lowercase: true,
  // Removes the subaddress (e.g. "+foo") from the email address
  outlookdotcom_remove_subaddress: true,
  // The following conversions are specific to Yahoo
  // Lowercases the local part of the Yahoo address (known to be case-insensitive)
  yahoo_lowercase: true,
  // Removes the subaddress (e.g. "-foo") from the email address
  yahoo_remove_subaddress: true,
  // The following conversions are specific to Yandex
  // Lowercases the local part of the Yandex address (known to be case-insensitive)
  yandex_lowercase: true,
  // The following conversions are specific to iCloud
  // Lowercases the local part of the iCloud address (known to be case-insensitive)
  icloud_lowercase: true,
  // Removes the subaddress (e.g. "+foo") from the email address
  icloud_remove_subaddress: true
}; // List of domains used by iCloud

var icloud_domains = ['icloud.com', 'me.com']; // List of domains used by Outlook.com and its predecessors
// This list is likely incomplete.
// Partial reference:
// https://blogs.office.com/2013/04/17/outlook-com-gets-two-step-verification-sign-in-by-alias-and-new-international-domains/

var outlookdotcom_domains = ['hotmail.at', 'hotmail.be', 'hotmail.ca', 'hotmail.cl', 'hotmail.co.il', 'hotmail.co.nz', 'hotmail.co.th', 'hotmail.co.uk', 'hotmail.com', 'hotmail.com.ar', 'hotmail.com.au', 'hotmail.com.br', 'hotmail.com.gr', 'hotmail.com.mx', 'hotmail.com.pe', 'hotmail.com.tr', 'hotmail.com.vn', 'hotmail.cz', 'hotmail.de', 'hotmail.dk', 'hotmail.es', 'hotmail.fr', 'hotmail.hu', 'hotmail.id', 'hotmail.ie', 'hotmail.in', 'hotmail.it', 'hotmail.jp', 'hotmail.kr', 'hotmail.lv', 'hotmail.my', 'hotmail.ph', 'hotmail.pt', 'hotmail.sa', 'hotmail.sg', 'hotmail.sk', 'live.be', 'live.co.uk', 'live.com', 'live.com.ar', 'live.com.mx', 'live.de', 'live.es', 'live.eu', 'live.fr', 'live.it', 'live.nl', 'msn.com', 'outlook.at', 'outlook.be', 'outlook.cl', 'outlook.co.il', 'outlook.co.nz', 'outlook.co.th', 'outlook.com', 'outlook.com.ar', 'outlook.com.au', 'outlook.com.br', 'outlook.com.gr', 'outlook.com.pe', 'outlook.com.tr', 'outlook.com.vn', 'outlook.cz', 'outlook.de', 'outlook.dk', 'outlook.es', 'outlook.fr', 'outlook.hu', 'outlook.id', 'outlook.ie', 'outlook.in', 'outlook.it', 'outlook.jp', 'outlook.kr', 'outlook.lv', 'outlook.my', 'outlook.ph', 'outlook.pt', 'outlook.sa', 'outlook.sg', 'outlook.sk', 'passport.com']; // List of domains used by Yahoo Mail
// This list is likely incomplete

var yahoo_domains = ['rocketmail.com', 'yahoo.ca', 'yahoo.co.uk', 'yahoo.com', 'yahoo.de', 'yahoo.fr', 'yahoo.in', 'yahoo.it', 'ymail.com']; // List of domains used by yandex.ru

var yandex_domains = ['yandex.ru', 'yandex.ua', 'yandex.kz', 'yandex.com', 'yandex.by', 'ya.ru']; // replace single dots, but not multiple consecutive dots

function dotsReplacer(match) {
  if (match.length > 1) {
    return match;
  }

  return '';
}

function normalizeEmail(email, options) {
  options = merge(options, default_normalize_email_options);
  var raw_parts = email.split('@');
  var domain = raw_parts.pop();
  var user = raw_parts.join('@');
  var parts = [user, domain]; // The domain is always lowercased, as it's case-insensitive per RFC 1035

  parts[1] = parts[1].toLowerCase();

  if (parts[1] === 'gmail.com' || parts[1] === 'googlemail.com') {
    // Address is GMail
    if (options.gmail_remove_subaddress) {
      parts[0] = parts[0].split('+')[0];
    }

    if (options.gmail_remove_dots) {
      // this does not replace consecutive dots like example..email@gmail.com
      parts[0] = parts[0].replace(/\.+/g, dotsReplacer);
    }

    if (!parts[0].length) {
      return false;
    }

    if (options.all_lowercase || options.gmail_lowercase) {
      parts[0] = parts[0].toLowerCase();
    }

    parts[1] = options.gmail_convert_googlemaildotcom ? 'gmail.com' : parts[1];
  } else if (icloud_domains.indexOf(parts[1]) >= 0) {
    // Address is iCloud
    if (options.icloud_remove_subaddress) {
      parts[0] = parts[0].split('+')[0];
    }

    if (!parts[0].length) {
      return false;
    }

    if (options.all_lowercase || options.icloud_lowercase) {
      parts[0] = parts[0].toLowerCase();
    }
  } else if (outlookdotcom_domains.indexOf(parts[1]) >= 0) {
    // Address is Outlook.com
    if (options.outlookdotcom_remove_subaddress) {
      parts[0] = parts[0].split('+')[0];
    }

    if (!parts[0].length) {
      return false;
    }

    if (options.all_lowercase || options.outlookdotcom_lowercase) {
      parts[0] = parts[0].toLowerCase();
    }
  } else if (yahoo_domains.indexOf(parts[1]) >= 0) {
    // Address is Yahoo
    if (options.yahoo_remove_subaddress) {
      var components = parts[0].split('-');
      parts[0] = components.length > 1 ? components.slice(0, -1).join('-') : components[0];
    }

    if (!parts[0].length) {
      return false;
    }

    if (options.all_lowercase || options.yahoo_lowercase) {
      parts[0] = parts[0].toLowerCase();
    }
  } else if (yandex_domains.indexOf(parts[1]) >= 0) {
    if (options.all_lowercase || options.yandex_lowercase) {
      parts[0] = parts[0].toLowerCase();
    }

    parts[1] = 'yandex.ru'; // all yandex domains are equal, 1st preferred
  } else if (options.all_lowercase) {
    // Any other address
    parts[0] = parts[0].toLowerCase();
  }

  return parts.join('@');
}

var charsetRegex = /^[^\s-_](?!.*?[-_]{2,})[a-z0-9-\\][^\s]*[^-_\s]$/;
function isSlug(str) {
  assertString(str);
  return charsetRegex.test(str);
}

var validators$1 = {
  'cs-CZ': function csCZ(str) {
    return /^(([ABCDEFHKIJKLMNPRSTUVXYZ]|[0-9])-?){5,8}$/.test(str);
  },
  'de-DE': function deDE(str) {
    return /^((AW|UL|AK|GA|AÖ|LF|AZ|AM|AS|ZE|AN|AB|A|KG|KH|BA|EW|BZ|HY|KM|BT|HP|B|BC|BI|BO|FN|TT|ÜB|BN|AH|BS|FR|HB|ZZ|BB|BK|BÖ|OC|OK|CW|CE|C|CO|LH|CB|KW|LC|LN|DA|DI|DE|DH|SY|NÖ|DO|DD|DU|DN|D|EI|EA|EE|FI|EM|EL|EN|PF|ED|EF|ER|AU|ZP|E|ES|NT|EU|FL|FO|FT|FF|F|FS|FD|FÜ|GE|G|GI|GF|GS|ZR|GG|GP|GR|NY|ZI|GÖ|GZ|GT|HA|HH|HM|HU|WL|HZ|WR|RN|HK|HD|HN|HS|GK|HE|HF|RZ|HI|HG|HO|HX|IK|IL|IN|J|JL|KL|KA|KS|KF|KE|KI|KT|KO|KN|KR|KC|KU|K|LD|LL|LA|L|OP|LM|LI|LB|LU|LÖ|HL|LG|MD|GN|MZ|MA|ML|MR|MY|AT|DM|MC|NZ|RM|RG|MM|ME|MB|MI|FG|DL|HC|MW|RL|MK|MG|MÜ|WS|MH|M|MS|NU|NB|ND|NM|NK|NW|NR|NI|NF|DZ|EB|OZ|TG|TO|N|OA|GM|OB|CA|EH|FW|OF|OL|OE|OG|BH|LR|OS|AA|GD|OH|KY|NP|WK|PB|PA|PE|PI|PS|P|PM|PR|RA|RV|RE|R|H|SB|WN|RS|RD|RT|BM|NE|GV|RP|SU|GL|RO|GÜ|RH|EG|RW|PN|SK|MQ|RU|SZ|RI|SL|SM|SC|HR|FZ|VS|SW|SN|CR|SE|SI|SO|LP|SG|NH|SP|IZ|ST|BF|TE|HV|OD|SR|S|AC|DW|ZW|TF|TS|TR|TÜ|UM|PZ|TP|UE|UN|UH|MN|KK|VB|V|AE|PL|RC|VG|GW|PW|VR|VK|KB|WA|WT|BE|WM|WE|AP|MO|WW|FB|WZ|WI|WB|JE|WF|WO|W|WÜ|BL|Z|GC)[- ]?[A-Z]{1,2}[- ]?\d{1,4}|(AIC|FDB|ABG|SLN|SAW|KLZ|BUL|ESB|NAB|SUL|WST|ABI|AZE|BTF|KÖT|DKB|FEU|ROT|ALZ|SMÜ|WER|AUR|NOR|DÜW|BRK|HAB|TÖL|WOR|BAD|BAR|BER|BIW|EBS|KEM|MÜB|PEG|BGL|BGD|REI|WIL|BKS|BIR|WAT|BOR|BOH|BOT|BRB|BLK|HHM|NEB|NMB|WSF|LEO|HDL|WMS|WZL|BÜS|CHA|KÖZ|ROD|WÜM|CLP|NEC|COC|ZEL|COE|CUX|DAH|LDS|DEG|DEL|RSL|DLG|DGF|LAN|HEI|MED|DON|KIB|ROK|JÜL|MON|SLE|EBE|EIC|HIG|WBS|BIT|PRÜ|LIB|EMD|WIT|ERH|HÖS|ERZ|ANA|ASZ|MAB|MEK|STL|SZB|FDS|HCH|HOR|WOL|FRG|GRA|WOS|FRI|FFB|GAP|GER|BRL|CLZ|GTH|NOH|HGW|GRZ|LÖB|NOL|WSW|DUD|HMÜ|OHA|KRU|HAL|HAM|HBS|QLB|HVL|NAU|HAS|EBN|GEO|HOH|HDH|ERK|HER|WAN|HEF|ROF|HBN|ALF|HSK|USI|NAI|REH|SAN|KÜN|ÖHR|HOL|WAR|ARN|BRG|GNT|HOG|WOH|KEH|MAI|PAR|RID|ROL|KLE|GEL|KUS|KYF|ART|SDH|LDK|DIL|MAL|VIB|LER|BNA|GHA|GRM|MTL|WUR|LEV|LIF|STE|WEL|LIP|VAI|LUP|HGN|LBZ|LWL|PCH|STB|DAN|MKK|SLÜ|MSP|TBB|MGH|MTK|BIN|MSH|EIL|HET|SGH|BID|MYK|MSE|MST|MÜR|WRN|MEI|GRH|RIE|MZG|MIL|OBB|BED|FLÖ|MOL|FRW|SEE|SRB|AIB|MOS|BCH|ILL|SOB|NMS|NEA|SEF|UFF|NEW|VOH|NDH|TDO|NWM|GDB|GVM|WIS|NOM|EIN|GAN|LAU|HEB|OHV|OSL|SFB|ERB|LOS|BSK|KEL|BSB|MEL|WTL|OAL|FÜS|MOD|OHZ|OPR|BÜR|PAF|PLÖ|CAS|GLA|REG|VIT|ECK|SIM|GOA|EMS|DIZ|GOH|RÜD|SWA|NES|KÖN|MET|LRO|BÜZ|DBR|ROS|TET|HRO|ROW|BRV|HIP|PAN|GRI|SHK|EIS|SRO|SOK|LBS|SCZ|MER|QFT|SLF|SLS|HOM|SLK|ASL|BBG|SBK|SFT|SHG|MGN|MEG|ZIG|SAD|NEN|OVI|SHA|BLB|SIG|SON|SPN|FOR|GUB|SPB|IGB|WND|STD|STA|SDL|OBG|HST|BOG|SHL|PIR|FTL|SEB|SÖM|SÜW|TIR|SAB|TUT|ANG|SDT|LÜN|LSZ|MHL|VEC|VER|VIE|OVL|ANK|OVP|SBG|UEM|UER|WLG|GMN|NVP|RDG|RÜG|DAU|FKB|WAF|WAK|SLZ|WEN|SOG|APD|WUG|GUN|ESW|WIZ|WES|DIN|BRA|BÜD|WHV|HWI|GHC|WTM|WOB|WUN|MAK|SEL|OCH|HOT|WDA)[- ]?(([A-Z][- ]?\d{1,4})|([A-Z]{2}[- ]?\d{1,3})))[- ]?(E|H)?$/.test(str);
  },
  'de-LI': function deLI(str) {
    return /^FL[- ]?\d{1,5}[UZ]?$/.test(str);
  },
  'fi-FI': function fiFI(str) {
    return /^(?=.{4,7})(([A-Z]{1,3}|[0-9]{1,3})[\s-]?([A-Z]{1,3}|[0-9]{1,5}))$/.test(str);
  },
  'pt-PT': function ptPT(str) {
    return /^([A-Z]{2}|[0-9]{2})[ -·]?([A-Z]{2}|[0-9]{2})[ -·]?([A-Z]{2}|[0-9]{2})$/.test(str);
  },
  'sq-AL': function sqAL(str) {
    return /^[A-Z]{2}[- ]?((\d{3}[- ]?(([A-Z]{2})|T))|(R[- ]?\d{3}))$/.test(str);
  },
  'pt-BR': function ptBR(str) {
    return /^[A-Z]{3}[ -]?[0-9][A-Z][0-9]{2}|[A-Z]{3}[ -]?[0-9]{4}$/.test(str);
  }
};
function isLicensePlate(str, locale) {
  assertString(str);

  if (locale in validators$1) {
    return validators$1[locale](str);
  } else if (locale === 'any') {
    for (var key in validators$1) {
      /* eslint guard-for-in: 0 */
      var validator = validators$1[key];

      if (validator(str)) {
        return true;
      }
    }

    return false;
  }

  throw new Error("Invalid locale '".concat(locale, "'"));
}

var upperCaseRegex = /^[A-Z]$/;
var lowerCaseRegex = /^[a-z]$/;
var numberRegex = /^[0-9]$/;
var symbolRegex = /^[-#!$@%^&*()_+|~=`{}\[\]:";'<>?,.\/ ]$/;
var defaultOptions$1 = {
  minLength: 8,
  minLowercase: 1,
  minUppercase: 1,
  minNumbers: 1,
  minSymbols: 1,
  returnScore: false,
  pointsPerUnique: 1,
  pointsPerRepeat: 0.5,
  pointsForContainingLower: 10,
  pointsForContainingUpper: 10,
  pointsForContainingNumber: 10,
  pointsForContainingSymbol: 10
};
/* Counts number of occurrences of each char in a string
 * could be moved to util/ ?
*/

function countChars(str) {
  var result = {};
  Array.from(str).forEach(function (_char) {
    var curVal = result[_char];

    if (curVal) {
      result[_char] += 1;
    } else {
      result[_char] = 1;
    }
  });
  return result;
}
/* Return information about a password */


function analyzePassword(password) {
  var charMap = countChars(password);
  var analysis = {
    length: password.length,
    uniqueChars: Object.keys(charMap).length,
    uppercaseCount: 0,
    lowercaseCount: 0,
    numberCount: 0,
    symbolCount: 0
  };
  Object.keys(charMap).forEach(function (_char2) {
    /* istanbul ignore else */
    if (upperCaseRegex.test(_char2)) {
      analysis.uppercaseCount += charMap[_char2];
    } else if (lowerCaseRegex.test(_char2)) {
      analysis.lowercaseCount += charMap[_char2];
    } else if (numberRegex.test(_char2)) {
      analysis.numberCount += charMap[_char2];
    } else if (symbolRegex.test(_char2)) {
      analysis.symbolCount += charMap[_char2];
    }
  });
  return analysis;
}

function scorePassword(analysis, scoringOptions) {
  var points = 0;
  points += analysis.uniqueChars * scoringOptions.pointsPerUnique;
  points += (analysis.length - analysis.uniqueChars) * scoringOptions.pointsPerRepeat;

  if (analysis.lowercaseCount > 0) {
    points += scoringOptions.pointsForContainingLower;
  }

  if (analysis.uppercaseCount > 0) {
    points += scoringOptions.pointsForContainingUpper;
  }

  if (analysis.numberCount > 0) {
    points += scoringOptions.pointsForContainingNumber;
  }

  if (analysis.symbolCount > 0) {
    points += scoringOptions.pointsForContainingSymbol;
  }

  return points;
}

function isStrongPassword(str) {
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
  assertString(str);
  var analysis = analyzePassword(str);
  options = merge(options || {}, defaultOptions$1);

  if (options.returnScore) {
    return scorePassword(analysis, options);
  }

  return analysis.length >= options.minLength && analysis.lowercaseCount >= options.minLowercase && analysis.uppercaseCount >= options.minUppercase && analysis.numberCount >= options.minNumbers && analysis.symbolCount >= options.minSymbols;
}

var vatMatchers = {
  GB: /^GB((\d{3} \d{4} ([0-8][0-9]|9[0-6]))|(\d{9} \d{3})|(((GD[0-4])|(HA[5-9]))[0-9]{2}))$/,
  IT: /^(IT)?[0-9]{11}$/,
  NL: /^(NL)?[0-9]{9}B[0-9]{2}$/
};
function isVAT(str, countryCode) {
  assertString(str);
  assertString(countryCode);

  if (countryCode in vatMatchers) {
    return vatMatchers[countryCode].test(str);
  }

  throw new Error("Invalid country code: '".concat(countryCode, "'"));
}

var version = '13.7.0';
var validator = {
  version: version,
  toDate: toDate,
  toFloat: toFloat,
  toInt: toInt,
  toBoolean: toBoolean,
  equals: equals,
  contains: contains,
  matches: matches,
  isEmail: isEmail,
  isURL: isURL,
  isMACAddress: isMACAddress,
  isIP: isIP,
  isIPRange: isIPRange,
  isFQDN: isFQDN,
  isBoolean: isBoolean,
  isIBAN: isIBAN,
  isBIC: isBIC,
  isAlpha: isAlpha,
  isAlphaLocales: locales$1,
  isAlphanumeric: isAlphanumeric,
  isAlphanumericLocales: locales$2,
  isNumeric: isNumeric,
  isPassportNumber: isPassportNumber,
  isPort: isPort,
  isLowercase: isLowercase,
  isUppercase: isUppercase,
  isAscii: isAscii,
  isFullWidth: isFullWidth,
  isHalfWidth: isHalfWidth,
  isVariableWidth: isVariableWidth,
  isMultibyte: isMultibyte,
  isSemVer: isSemVer,
  isSurrogatePair: isSurrogatePair,
  isInt: isInt,
  isIMEI: isIMEI,
  isFloat: isFloat,
  isFloatLocales: locales,
  isDecimal: isDecimal,
  isHexadecimal: isHexadecimal,
  isOctal: isOctal,
  isDivisibleBy: isDivisibleBy,
  isHexColor: isHexColor,
  isRgbColor: isRgbColor,
  isHSL: isHSL,
  isISRC: isISRC,
  isMD5: isMD5,
  isHash: isHash,
  isJWT: isJWT,
  isJSON: isJSON,
  isEmpty: isEmpty,
  isLength: isLength,
  isLocale: isLocale,
  isByteLength: isByteLength,
  isUUID: isUUID,
  isMongoId: isMongoId,
  isAfter: isAfter,
  isBefore: isBefore,
  isIn: isIn,
  isCreditCard: isCreditCard,
  isIdentityCard: isIdentityCard,
  isEAN: isEAN,
  isISIN: isISIN,
  isISBN: isISBN,
  isISSN: isISSN,
  isMobilePhone: isMobilePhone,
  isMobilePhoneLocales: locales$4,
  isPostalCode: isPostalCode,
  isPostalCodeLocales: locales$5,
  isEthereumAddress: isEthereumAddress,
  isCurrency: isCurrency,
  isBtcAddress: isBtcAddress,
  isISO8601: isISO8601,
  isRFC3339: isRFC3339,
  isISO31661Alpha2: isISO31661Alpha2,
  isISO31661Alpha3: isISO31661Alpha3,
  isISO4217: isISO4217,
  isBase32: isBase32,
  isBase58: isBase58,
  isBase64: isBase64,
  isDataURI: isDataURI,
  isMagnetURI: isMagnetURI,
  isMimeType: isMimeType,
  isLatLong: isLatLong,
  ltrim: ltrim,
  rtrim: rtrim,
  trim: trim,
  escape: escape,
  unescape: unescape,
  stripLow: stripLow,
  whitelist: whitelist,
  blacklist: blacklist$1,
  isWhitelisted: isWhitelisted,
  normalizeEmail: normalizeEmail,
  toString: toString,
  isSlug: isSlug,
  isStrongPassword: isStrongPassword,
  isTaxID: isTaxID,
  isDate: isDate,
  isLicensePlate: isLicensePlate,
  isVAT: isVAT,
  ibanLocales: locales$3
};

return validator;

})));
/*!
 * Copyright (c) 2018 Chris O'Hara <cohara87@gmail.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.
 */
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.validator=e()}(this,function(){"use strict";function i(t){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function u(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(t)){var r=[],n=!0,i=!1,a=void 0;try{for(var o,s=t[Symbol.iterator]();!(n=(o=s.next()).done)&&(r.push(o.value),!e||r.length!==e);n=!0);}catch(t){i=!0,a=t}finally{try{n||null==s.return||s.return()}finally{if(i)throw a}}return r}}(t,e)||d(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function r(t){return function(t){if(Array.isArray(t))return n(t)}(t)||function(t){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(t))return Array.from(t)}(t)||d(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function d(t,e){if(t){if("string"==typeof t)return n(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);return"Map"===(r="Object"===r&&t.constructor?t.constructor.name:r)||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?n(t,e):void 0}}function n(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r<e;r++)n[r]=t[r];return n}function l(t){if(!("string"==typeof t||t instanceof String)){var e=i(t);throw null===t?e="null":"object"===e&&(e=t.constructor.name),new TypeError("Expected a string but received a ".concat(e))}}function a(t){return l(t),t=Date.parse(t),isNaN(t)?null:new Date(t)}for(var t,o={"en-US":/^[A-Z]+$/i,"az-AZ":/^[A-VXYZÇƏĞİıÖŞÜ]+$/i,"bg-BG":/^[А-Я]+$/i,"cs-CZ":/^[A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]+$/i,"da-DK":/^[A-ZÆØÅ]+$/i,"de-DE":/^[A-ZÄÖÜß]+$/i,"el-GR":/^[Α-ώ]+$/i,"es-ES":/^[A-ZÁÉÍÑÓÚÜ]+$/i,"fa-IR":/^[ابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی]+$/i,"fi-FI":/^[A-ZÅÄÖ]+$/i,"fr-FR":/^[A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i,"it-IT":/^[A-ZÀÉÈÌÎÓÒÙ]+$/i,"nb-NO":/^[A-ZÆØÅ]+$/i,"nl-NL":/^[A-ZÁÉËÏÓÖÜÚ]+$/i,"nn-NO":/^[A-ZÆØÅ]+$/i,"hu-HU":/^[A-ZÁÉÍÓÖŐÚÜŰ]+$/i,"pl-PL":/^[A-ZĄĆĘŚŁŃÓŻŹ]+$/i,"pt-PT":/^[A-ZÃÁÀÂÄÇÉÊËÍÏÕÓÔÖÚÜ]+$/i,"ru-RU":/^[А-ЯЁ]+$/i,"sl-SI":/^[A-ZČĆĐŠŽ]+$/i,"sk-SK":/^[A-ZÁČĎÉÍŇÓŠŤÚÝŽĹŔĽÄÔ]+$/i,"sr-RS@latin":/^[A-ZČĆŽŠĐ]+$/i,"sr-RS":/^[А-ЯЂЈЉЊЋЏ]+$/i,"sv-SE":/^[A-ZÅÄÖ]+$/i,"th-TH":/^[ก-๐\s]+$/i,"tr-TR":/^[A-ZÇĞİıÖŞÜ]+$/i,"uk-UA":/^[А-ЩЬЮЯЄIЇҐі]+$/i,"vi-VN":/^[A-ZÀÁẠẢÃÂẦẤẬẨẪĂẰẮẶẲẴĐÈÉẸẺẼÊỀẾỆỂỄÌÍỊỈĨÒÓỌỎÕÔỒỐỘỔỖƠỜỚỢỞỠÙÚỤỦŨƯỪỨỰỬỮỲÝỴỶỸ]+$/i,"ku-IQ":/^[ئابپتجچحخدرڕزژسشعغفڤقکگلڵمنوۆھەیێيطؤثآإأكضصةظذ]+$/i,ar:/^[ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]+$/,he:/^[א-ת]+$/,fa:/^['آاءأؤئبپتثجچحخدذرزژسشصضطظعغفقکگلمنوهةی']+$/i,"hi-IN":/^[\u0900-\u0961]+[\u0972-\u097F]*$/i},s={"en-US":/^[0-9A-Z]+$/i,"az-AZ":/^[0-9A-VXYZÇƏĞİıÖŞÜ]+$/i,"bg-BG":/^[0-9А-Я]+$/i,"cs-CZ":/^[0-9A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]+$/i,"da-DK":/^[0-9A-ZÆØÅ]+$/i,"de-DE":/^[0-9A-ZÄÖÜß]+$/i,"el-GR":/^[0-9Α-ω]+$/i,"es-ES":/^[0-9A-ZÁÉÍÑÓÚÜ]+$/i,"fi-FI":/^[0-9A-ZÅÄÖ]+$/i,"fr-FR":/^[0-9A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i,"it-IT":/^[0-9A-ZÀÉÈÌÎÓÒÙ]+$/i,"hu-HU":/^[0-9A-ZÁÉÍÓÖŐÚÜŰ]+$/i,"nb-NO":/^[0-9A-ZÆØÅ]+$/i,"nl-NL":/^[0-9A-ZÁÉËÏÓÖÜÚ]+$/i,"nn-NO":/^[0-9A-ZÆØÅ]+$/i,"pl-PL":/^[0-9A-ZĄĆĘŚŁŃÓŻŹ]+$/i,"pt-PT":/^[0-9A-ZÃÁÀÂÄÇÉÊËÍÏÕÓÔÖÚÜ]+$/i,"ru-RU":/^[0-9А-ЯЁ]+$/i,"sl-SI":/^[0-9A-ZČĆĐŠŽ]+$/i,"sk-SK":/^[0-9A-ZÁČĎÉÍŇÓŠŤÚÝŽĹŔĽÄÔ]+$/i,"sr-RS@latin":/^[0-9A-ZČĆŽŠĐ]+$/i,"sr-RS":/^[0-9А-ЯЂЈЉЊЋЏ]+$/i,"sv-SE":/^[0-9A-ZÅÄÖ]+$/i,"th-TH":/^[ก-๙\s]+$/i,"tr-TR":/^[0-9A-ZÇĞİıÖŞÜ]+$/i,"uk-UA":/^[0-9А-ЩЬЮЯЄIЇҐі]+$/i,"ku-IQ":/^[٠١٢٣٤٥٦٧٨٩0-9ئابپتجچحخدرڕزژسشعغفڤقکگلڵمنوۆھەیێيطؤثآإأكضصةظذ]+$/i,"vi-VN":/^[0-9A-ZÀÁẠẢÃÂẦẤẬẨẪĂẰẮẶẲẴĐÈÉẸẺẼÊỀẾỆỂỄÌÍỊỈĨÒÓỌỎÕÔỒỐỘỔỖƠỜỚỢỞỠÙÚỤỦŨƯỪỨỰỬỮỲÝỴỶỸ]+$/i,ar:/^[٠١٢٣٤٥٦٧٨٩0-9ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]+$/,he:/^[0-9א-ת]+$/,fa:/^['0-9آاءأؤئبپتثجچحخدذرزژسشصضطظعغفقکگلمنوهةی۱۲۳۴۵۶۷۸۹۰']+$/i,"hi-IN":/^[\u0900-\u0963]+[\u0966-\u097F]*$/i},c={"en-US":".",ar:"٫"},e=["AU","GB","HK","IN","NZ","ZA","ZM"],f=0;f<e.length;f++)t="en-".concat(e[f]),o[t]=o["en-US"],s[t]=s["en-US"],c[t]=c["en-US"];for(var A,$=["AE","BH","DZ","EG","IQ","JO","KW","LB","LY","MA","QM","QA","SA","SD","SY","TN","YE"],p=0;p<$.length;p++)A="ar-".concat($[p]),o[A]=o.ar,s[A]=s.ar,c[A]=c.ar;for(var S,h=["IR","AF"],g=0;g<h.length;g++)S="fa-".concat(h[g]),s[S]=s.fa,c[S]=c.ar;for(var E=["ar-EG","ar-LB","ar-LY"],I=["bg-BG","cs-CZ","da-DK","de-DE","el-GR","en-ZM","es-ES","fr-CA","fr-FR","id-ID","it-IT","ku-IQ","hi-IN","hu-HU","nb-NO","nn-NO","nl-NL","pl-PL","pt-PT","ru-RU","sl-SI","sr-RS@latin","sr-RS","sv-SE","tr-TR","uk-UA","vi-VN"],R=0;R<E.length;R++)c[E[R]]=c["en-US"];for(var v=0;v<I.length;v++)c[I[v]]=",";function L(t,e){l(t),e=e||{};var r=new RegExp("^(?:[-+])?(?:[0-9]+)?(?:\\".concat(e.locale?c[e.locale]:".","[0-9]*)?(?:[eE][\\+\\-]?(?:[0-9]+))?$"));if(""===t||"."===t||"-"===t||"+"===t)return!1;var n=parseFloat(t.replace(",","."));return r.test(t)&&(!e.hasOwnProperty("min")||n>=e.min)&&(!e.hasOwnProperty("max")||n<=e.max)&&(!e.hasOwnProperty("lt")||n<e.lt)&&(!e.hasOwnProperty("gt")||n>e.gt)}o["fr-CA"]=o["fr-FR"],s["fr-CA"]=s["fr-FR"],o["pt-BR"]=o["pt-PT"],s["pt-BR"]=s["pt-PT"],c["pt-BR"]=c["pt-PT"],o["pl-Pl"]=o["pl-PL"],s["pl-Pl"]=s["pl-PL"],c["pl-Pl"]=c["pl-PL"],o["fa-AF"]=o.fa;var m=Object.keys(c);function Z(t){return L(t)?parseFloat(t):NaN}function M(t){return"object"===i(t)&&null!==t?t="function"==typeof t.toString?t.toString():"[object Object]":(null==t||isNaN(t)&&!t.length)&&(t=""),String(t)}function B(t,e){var r,n=0<arguments.length&&void 0!==t?t:{},i=1<arguments.length?e:void 0;for(r in i)void 0===n[r]&&(n[r]=i[r]);return n}var N={ignoreCase:!1,minOccurrences:1};function F(t,e){var r;l(t);e="object"===i(e)?(r=e.min||0,e.max):(r=e,arguments[2]),t=encodeURI(t).split(/%..|./).length-1;return r<=t&&(void 0===e||t<=e)}var D={require_tld:!0,allow_underscores:!1,allow_trailing_dot:!1,allow_numeric_tld:!1,allow_wildcard:!1};function C(t,e){l(t),(e=B(e,D)).allow_trailing_dot&&"."===t[t.length-1]&&(t=t.substring(0,t.length-1));var r=(t=!0===e.allow_wildcard&&0===t.indexOf("*.")?t.substring(2):t).split("."),t=r[r.length-1];if(e.require_tld){if(r.length<2)return!1;if(!/^([a-z\u00A1-\u00A8\u00AA-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]{2,}|xn[a-z0-9-]{2,})$/i.test(t))return!1;if(/\s/.test(t))return!1}return!(!e.allow_numeric_tld&&/^\d+$/.test(t))&&r.every(function(t){return!(63<t.length)&&(!!/^[a-z_\u00a1-\uffff0-9-]+$/i.test(t)&&(!/[\uff01-\uff5e]/.test(t)&&(!/^-|-$/.test(t)&&!(!e.allow_underscores&&/_/.test(t)))))})}var T="(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])",G="(".concat(T,"[.]){3}").concat(T),O=new RegExp("^".concat(G,"$")),_="(?:[0-9a-fA-F]{1,4})",H=new RegExp("^("+"(?:".concat(_,":){7}(?:").concat(_,"|:)|")+"(?:".concat(_,":){6}(?:").concat(G,"|:").concat(_,"|:)|")+"(?:".concat(_,":){5}(?::").concat(G,"|(:").concat(_,"){1,2}|:)|")+"(?:".concat(_,":){4}(?:(:").concat(_,"){0,1}:").concat(G,"|(:").concat(_,"){1,3}|:)|")+"(?:".concat(_,":){3}(?:(:").concat(_,"){0,2}:").concat(G,"|(:").concat(_,"){1,4}|:)|")+"(?:".concat(_,":){2}(?:(:").concat(_,"){0,3}:").concat(G,"|(:").concat(_,"){1,5}|:)|")+"(?:".concat(_,":){1}(?:(:").concat(_,"){0,4}:").concat(G,"|(:").concat(_,"){1,6}|:)|")+"(?::((?::".concat(_,"){0,5}:").concat(G,"|(?::").concat(_,"){1,7}|:))")+")(%[0-9a-zA-Z-.:]{1,})?$");function P(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:"";return l(t),(e=String(e))?"4"===e?!!O.test(t)&&t.split(".").sort(function(t,e){return t-e})[3]<=255:"6"===e&&!!H.test(t):P(t,4)||P(t,6)}var b={allow_display_name:!1,require_display_name:!1,allow_utf8_local_part:!0,require_tld:!0,blacklisted_chars:"",ignore_max_length:!1,host_blacklist:[]},U=/^([^\x00-\x1F\x7F-\x9F\cX]+)</i,K=/^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~]+$/i,w=/^[a-z\d]+$/,y=/^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f]))*$/i,W=/^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+$/i,Y=/^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))*$/i;var x={protocols:["http","https","ftp"],require_tld:!0,require_protocol:!1,require_host:!0,require_port:!1,require_valid_protocol:!0,allow_underscores:!1,allow_trailing_dot:!1,allow_protocol_relative_urls:!1,allow_fragments:!0,allow_query_components:!0,validate_length:!0},V=/^\[([^\]]+)\](?::([0-9]+))?$/;function k(t,e){for(var r,n=0;n<e.length;n++){var i=e[n];if(t===i||(r=i,"[object RegExp]"===Object.prototype.toString.call(r)&&i.test(t)))return!0}return!1}var z=/^(?:[0-9a-fA-F]{2}([-:\s]))([0-9a-fA-F]{2}\1){4}([0-9a-fA-F]{2})$/,X=/^([0-9a-fA-F]){12}$/,J=/^([0-9a-fA-F]{4}\.){2}([0-9a-fA-F]{4})$/;var j=/^\d{1,3}$/;var Q={format:"YYYY/MM/DD",delimiters:["/","-"],strictMode:!1};function q(e,r){if(r=B("string"==typeof r?{format:r}:r,Q),"string"==typeof e&&/(^(y{4}|y{2})[.\/-](m{1,2})[.\/-](d{1,2})$)|(^(m{1,2})[.\/-](d{1,2})[.\/-]((y{4}|y{2})$))|(^(d{1,2})[.\/-](m{1,2})[.\/-]((y{4}|y{2})$))/gi.test(r.format)){var t,n=r.delimiters.find(function(t){return-1!==r.format.indexOf(t)}),i=r.strictMode?n:r.delimiters.find(function(t){return-1!==e.indexOf(t)}),a={},o=function(t,e){var r;if("undefined"==typeof Symbol||null==t[Symbol.iterator]){if(Array.isArray(t)||(r=d(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0,e=function(){};return{s:e,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:e}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,o=!1;return{s:function(){r=t[Symbol.iterator]()},n:function(){var t=r.next();return a=t.done,t},e:function(t){o=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(o)throw i}}}}(function(t,e){for(var r=[],n=Math.min(t.length,e.length),i=0;i<n;i++)r.push([t[i],e[i]]);return r}(e.split(i),r.format.toLowerCase().split(n)));try{for(o.s();!(t=o.n()).done;){var s=u(t.value,2),c=s[0],l=s[1];if(c.length!==l.length)return!1;a[l.charAt(0)]=c}}catch(t){o.e(t)}finally{o.f()}return new Date("".concat(a.m,"/").concat(a.d,"/").concat(a.y)).getDate()===+a.d}return!r.strictMode&&("[object Date]"===Object.prototype.toString.call(e)&&isFinite(e))}var tt={loose:!1},et=["true","false","1","0"],rt=[].concat(et,["yes","no"]);var nt=/^[A-Za-z]{2,4}([_-]([A-Za-z]{4}|[\d]{3}))?([_-]([A-Za-z]{2}|[\d]{3}))?$/;var it=Object.keys(o);var at=Object.keys(s),ot=/^[0-9]+$/;var st={AM:/^[A-Z]{2}\d{7}$/,AR:/^[A-Z]{3}\d{6}$/,AT:/^[A-Z]\d{7}$/,AU:/^[A-Z]\d{7}$/,BE:/^[A-Z]{2}\d{6}$/,BG:/^\d{9}$/,BR:/^[A-Z]{2}\d{6}$/,BY:/^[A-Z]{2}\d{7}$/,CA:/^[A-Z]{2}\d{6}$/,CH:/^[A-Z]\d{7}$/,CN:/^G\d{8}$|^E(?![IO])[A-Z0-9]\d{7}$/,CY:/^[A-Z](\d{6}|\d{8})$/,CZ:/^\d{8}$/,DE:/^[CFGHJKLMNPRTVWXYZ0-9]{9}$/,DK:/^\d{9}$/,DZ:/^\d{9}$/,EE:/^([A-Z]\d{7}|[A-Z]{2}\d{7})$/,ES:/^[A-Z0-9]{2}([A-Z0-9]?)\d{6}$/,FI:/^[A-Z]{2}\d{7}$/,FR:/^\d{2}[A-Z]{2}\d{5}$/,GB:/^\d{9}$/,GR:/^[A-Z]{2}\d{7}$/,HR:/^\d{9}$/,HU:/^[A-Z]{2}(\d{6}|\d{7})$/,IE:/^[A-Z0-9]{2}\d{7}$/,IN:/^[A-Z]{1}-?\d{7}$/,ID:/^[A-C]\d{7}$/,IR:/^[A-Z]\d{8}$/,IS:/^(A)\d{7}$/,IT:/^[A-Z0-9]{2}\d{7}$/,JP:/^[A-Z]{2}\d{7}$/,KR:/^[MS]\d{8}$/,LT:/^[A-Z0-9]{8}$/,LU:/^[A-Z0-9]{8}$/,LV:/^[A-Z0-9]{2}\d{7}$/,LY:/^[A-Z0-9]{8}$/,MT:/^\d{7}$/,MZ:/^([A-Z]{2}\d{7})|(\d{2}[A-Z]{2}\d{5})$/,MY:/^[AHK]\d{8}$/,NL:/^[A-Z]{2}[A-Z0-9]{6}\d$/,PL:/^[A-Z]{2}\d{7}$/,PT:/^[A-Z]\d{6}$/,RO:/^\d{8,9}$/,RU:/^\d{9}$/,SE:/^\d{8}$/,SL:/^(P)[A-Z]\d{7}$/,SK:/^[0-9A-Z]\d{7}$/,TR:/^[A-Z]\d{8}$/,UA:/^[A-Z]{2}\d{6}$/,US:/^\d{9}$/};var ct=/^(?:[-+]?(?:0|[1-9][0-9]*))$/,lt=/^[-+]?[0-9]+$/;function ut(t,e){l(t);var r=(e=e||{}).hasOwnProperty("allow_leading_zeroes")&&!e.allow_leading_zeroes?ct:lt,n=!e.hasOwnProperty("min")||t>=e.min,i=!e.hasOwnProperty("max")||t<=e.max,a=!e.hasOwnProperty("lt")||t<e.lt,e=!e.hasOwnProperty("gt")||t>e.gt;return r.test(t)&&n&&i&&a&&e}var dt=/^[0-9]{15}$/,ft=/^\d{2}-\d{6}-\d{6}-\d{1}$/;var At=/^[\x00-\x7F]+$/;var $t=/[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/;var pt=/[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/;var St=/[^\x00-\x7F]/;var ht,gt,Et=(gt="i",ht=(ht=["^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)","(?:-((?:0|[1-9]\\d*|\\d*[a-z-][0-9a-z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-z-][0-9a-z-]*))*))","?(?:\\+([0-9a-z-]+(?:\\.[0-9a-z-]+)*))?$"]).join(""),new RegExp(ht,gt));var It=/[\uD800-\uDBFF][\uDC00-\uDFFF]/;var Rt={force_decimal:!1,decimal_digits:"1,",locale:"en-US"},vt=["","-","+"];var Lt=/^(0x|0h)?[0-9A-F]+$/i;function mt(t){return l(t),Lt.test(t)}var Zt=/^(0o)?[0-7]+$/i;var Mt=/^#?([0-9A-F]{3}|[0-9A-F]{4}|[0-9A-F]{6}|[0-9A-F]{8})$/i;var Bt=/^rgb\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){2}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\)$/,Nt=/^rgba\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)$/,Ft=/^rgb\((([0-9]%|[1-9][0-9]%|100%),){2}([0-9]%|[1-9][0-9]%|100%)\)/,Dt=/^rgba\((([0-9]%|[1-9][0-9]%|100%),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)/;var Ct=/^hsla?\(((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?))(deg|grad|rad|turn)?(,(\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%){2}(,((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%?))?\)$/i,Tt=/^hsla?\(((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?))(deg|grad|rad|turn)?(\s(\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%){2}\s?(\/\s((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%?)\s?)?\)$/i;var Gt=/^[A-Z]{2}[0-9A-Z]{3}\d{2}\d{5}$/;var Ot={AD:/^(AD[0-9]{2})\d{8}[A-Z0-9]{12}$/,AE:/^(AE[0-9]{2})\d{3}\d{16}$/,AL:/^(AL[0-9]{2})\d{8}[A-Z0-9]{16}$/,AT:/^(AT[0-9]{2})\d{16}$/,AZ:/^(AZ[0-9]{2})[A-Z0-9]{4}\d{20}$/,BA:/^(BA[0-9]{2})\d{16}$/,BE:/^(BE[0-9]{2})\d{12}$/,BG:/^(BG[0-9]{2})[A-Z]{4}\d{6}[A-Z0-9]{8}$/,BH:/^(BH[0-9]{2})[A-Z]{4}[A-Z0-9]{14}$/,BR:/^(BR[0-9]{2})\d{23}[A-Z]{1}[A-Z0-9]{1}$/,BY:/^(BY[0-9]{2})[A-Z0-9]{4}\d{20}$/,CH:/^(CH[0-9]{2})\d{5}[A-Z0-9]{12}$/,CR:/^(CR[0-9]{2})\d{18}$/,CY:/^(CY[0-9]{2})\d{8}[A-Z0-9]{16}$/,CZ:/^(CZ[0-9]{2})\d{20}$/,DE:/^(DE[0-9]{2})\d{18}$/,DK:/^(DK[0-9]{2})\d{14}$/,DO:/^(DO[0-9]{2})[A-Z]{4}\d{20}$/,EE:/^(EE[0-9]{2})\d{16}$/,EG:/^(EG[0-9]{2})\d{25}$/,ES:/^(ES[0-9]{2})\d{20}$/,FI:/^(FI[0-9]{2})\d{14}$/,FO:/^(FO[0-9]{2})\d{14}$/,FR:/^(FR[0-9]{2})\d{10}[A-Z0-9]{11}\d{2}$/,GB:/^(GB[0-9]{2})[A-Z]{4}\d{14}$/,GE:/^(GE[0-9]{2})[A-Z0-9]{2}\d{16}$/,GI:/^(GI[0-9]{2})[A-Z]{4}[A-Z0-9]{15}$/,GL:/^(GL[0-9]{2})\d{14}$/,GR:/^(GR[0-9]{2})\d{7}[A-Z0-9]{16}$/,GT:/^(GT[0-9]{2})[A-Z0-9]{4}[A-Z0-9]{20}$/,HR:/^(HR[0-9]{2})\d{17}$/,HU:/^(HU[0-9]{2})\d{24}$/,IE:/^(IE[0-9]{2})[A-Z0-9]{4}\d{14}$/,IL:/^(IL[0-9]{2})\d{19}$/,IQ:/^(IQ[0-9]{2})[A-Z]{4}\d{15}$/,IR:/^(IR[0-9]{2})0\d{2}0\d{18}$/,IS:/^(IS[0-9]{2})\d{22}$/,IT:/^(IT[0-9]{2})[A-Z]{1}\d{10}[A-Z0-9]{12}$/,JO:/^(JO[0-9]{2})[A-Z]{4}\d{22}$/,KW:/^(KW[0-9]{2})[A-Z]{4}[A-Z0-9]{22}$/,KZ:/^(KZ[0-9]{2})\d{3}[A-Z0-9]{13}$/,LB:/^(LB[0-9]{2})\d{4}[A-Z0-9]{20}$/,LC:/^(LC[0-9]{2})[A-Z]{4}[A-Z0-9]{24}$/,LI:/^(LI[0-9]{2})\d{5}[A-Z0-9]{12}$/,LT:/^(LT[0-9]{2})\d{16}$/,LU:/^(LU[0-9]{2})\d{3}[A-Z0-9]{13}$/,LV:/^(LV[0-9]{2})[A-Z]{4}[A-Z0-9]{13}$/,MC:/^(MC[0-9]{2})\d{10}[A-Z0-9]{11}\d{2}$/,MD:/^(MD[0-9]{2})[A-Z0-9]{20}$/,ME:/^(ME[0-9]{2})\d{18}$/,MK:/^(MK[0-9]{2})\d{3}[A-Z0-9]{10}\d{2}$/,MR:/^(MR[0-9]{2})\d{23}$/,MT:/^(MT[0-9]{2})[A-Z]{4}\d{5}[A-Z0-9]{18}$/,MU:/^(MU[0-9]{2})[A-Z]{4}\d{19}[A-Z]{3}$/,MZ:/^(MZ[0-9]{2})\d{21}$/,NL:/^(NL[0-9]{2})[A-Z]{4}\d{10}$/,NO:/^(NO[0-9]{2})\d{11}$/,PK:/^(PK[0-9]{2})[A-Z0-9]{4}\d{16}$/,PL:/^(PL[0-9]{2})\d{24}$/,PS:/^(PS[0-9]{2})[A-Z0-9]{4}\d{21}$/,PT:/^(PT[0-9]{2})\d{21}$/,QA:/^(QA[0-9]{2})[A-Z]{4}[A-Z0-9]{21}$/,RO:/^(RO[0-9]{2})[A-Z]{4}[A-Z0-9]{16}$/,RS:/^(RS[0-9]{2})\d{18}$/,SA:/^(SA[0-9]{2})\d{2}[A-Z0-9]{18}$/,SC:/^(SC[0-9]{2})[A-Z]{4}\d{20}[A-Z]{3}$/,SE:/^(SE[0-9]{2})\d{20}$/,SI:/^(SI[0-9]{2})\d{15}$/,SK:/^(SK[0-9]{2})\d{20}$/,SM:/^(SM[0-9]{2})[A-Z]{1}\d{10}[A-Z0-9]{12}$/,SV:/^(SV[0-9]{2})[A-Z0-9]{4}\d{20}$/,TL:/^(TL[0-9]{2})\d{19}$/,TN:/^(TN[0-9]{2})\d{20}$/,TR:/^(TR[0-9]{2})\d{5}[A-Z0-9]{17}$/,UA:/^(UA[0-9]{2})\d{6}[A-Z0-9]{19}$/,VA:/^(VA[0-9]{2})\d{18}$/,VG:/^(VG[0-9]{2})[A-Z0-9]{4}\d{16}$/,XK:/^(XK[0-9]{2})\d{16}$/};var _t=Object.keys(Ot),Ht=new Set(["AD","AE","AF","AG","AI","AL","AM","AO","AQ","AR","AS","AT","AU","AW","AX","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BQ","BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CW","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GF","GG","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HM","HN","HR","HT","HU","ID","IE","IL","IM","IN","IO","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SX","SY","SZ","TC","TD","TF","TG","TH","TJ","TK","TL","TM","TN","TO","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","YE","YT","ZA","ZM","ZW"]);var Pt=Ht,bt=/^[A-Za-z]{6}[A-Za-z0-9]{2}([A-Za-z0-9]{3})?$/;var Ut=/^[a-f0-9]{32}$/;var Kt={md5:32,md4:32,sha1:40,sha256:64,sha384:96,sha512:128,ripemd128:32,ripemd160:40,tiger128:32,tiger160:40,tiger192:48,crc32:8,crc32b:8};var wt=/[^A-Z0-9+\/=]/i,yt=/^[A-Z0-9_\-]*$/i,Wt={urlSafe:!1};function Yt(t,e){l(t),e=B(e,Wt);var r=t.length;if(e.urlSafe)return yt.test(t);if(r%4!=0||wt.test(t))return!1;e=t.indexOf("=");return-1===e||e===r-1||e===r-2&&"="===t[r-1]}var xt={allow_primitives:!1};var Vt={ignore_whitespace:!1};var kt={1:/^[0-9A-F]{8}-[0-9A-F]{4}-1[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,2:/^[0-9A-F]{8}-[0-9A-F]{4}-2[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,3:/^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,4:/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,5:/^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,all:/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i};var zt=/^(?:4[0-9]{12}(?:[0-9]{3,6})?|5[1-5][0-9]{14}|(222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12,15}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11}|6[27][0-9]{14}|^(81[0-9]{14,17}))$/;var Xt={PL:function(t){l(t);var n={1:1,2:3,3:7,4:9,5:1,6:3,7:7,8:9,9:1,10:3,11:0};if(null!=t&&11===t.length&&ut(t,{allow_leading_zeroes:!0})){var e=t.split("").slice(0,-1).reduce(function(t,e,r){return t+Number(e)*n[r+1]},0)%10,t=Number(t.charAt(t.length-1));if(0==e&&0===t||t===10-e)return!0}return!1},ES:function(t){l(t);var e={X:0,Y:1,Z:2},r=t.trim().toUpperCase();if(!/^[0-9X-Z][0-9]{7}[TRWAGMYFPDXBNJZSQVHLCKE]$/.test(r))return!1;t=r.slice(0,-1).replace(/[X,Y,Z]/g,function(t){return e[t]});return r.endsWith(["T","R","W","A","G","M","Y","F","P","D","X","B","N","J","Z","S","Q","V","H","L","C","K","E"][t%23])},FI:function(t){if(l(t),11!==t.length)return!1;if(!t.match(/^\d{6}[\-A\+]\d{3}[0-9ABCDEFHJKLMNPRSTUVWXY]{1}$/))return!1;return"0123456789ABCDEFHJKLMNPRSTUVWXY"[(1e3*parseInt(t.slice(0,6),10)+parseInt(t.slice(7,10),10))%31]===t.slice(10,11)},IN:function(t){var r=[[0,1,2,3,4,5,6,7,8,9],[1,2,3,4,0,6,7,8,9,5],[2,3,4,0,1,7,8,9,5,6],[3,4,0,1,2,8,9,5,6,7],[4,0,1,2,3,9,5,6,7,8],[5,9,8,7,6,0,4,3,2,1],[6,5,9,8,7,1,0,4,3,2],[7,6,5,9,8,2,1,0,4,3],[8,7,6,5,9,3,2,1,0,4],[9,8,7,6,5,4,3,2,1,0]],n=[[0,1,2,3,4,5,6,7,8,9],[1,5,7,6,2,8,3,0,9,4],[5,8,0,3,7,9,6,1,4,2],[8,9,1,6,0,4,3,5,2,7],[9,4,5,3,1,2,6,8,7,0],[4,2,8,6,5,7,3,9,0,1],[2,7,9,3,8,0,6,4,1,5],[7,0,4,6,9,1,3,2,5,8]],t=t.trim();if(!/^[1-9]\d{3}\s?\d{4}\s?\d{4}$/.test(t))return!1;var i=0;return t.replace(/\s/g,"").split("").map(Number).reverse().forEach(function(t,e){i=r[i][n[e%8][t]]}),0===i},IR:function(t){if(!t.match(/^\d{10}$/))return!1;if(t="0000".concat(t).substr(t.length-6),0===parseInt(t.substr(3,6),10))return!1;for(var e=parseInt(t.substr(9,1),10),r=0,n=0;n<9;n++)r+=parseInt(t.substr(n,1),10)*(10-n);return(r%=11)<2&&e===r||2<=r&&e===11-r},IT:function(t){return 9===t.length&&("CA00000AA"!==t&&-1<t.search(/C[A-Z][0-9]{5}[A-Z]{2}/i))},NO:function(t){var e=t.trim();if(isNaN(Number(e)))return!1;if(11!==e.length)return!1;if("00000000000"===e)return!1;var r=e.split("").map(Number),t=(11-(3*r[0]+7*r[1]+6*r[2]+ +r[3]+8*r[4]+9*r[5]+4*r[6]+5*r[7]+2*r[8])%11)%11,e=(11-(5*r[0]+4*r[1]+3*r[2]+2*r[3]+7*r[4]+6*r[5]+5*r[6]+4*r[7]+3*r[8]+2*t)%11)%11;return t===r[9]&&e===r[10]},TH:function(t){if(!t.match(/^[1-8]\d{12}$/))return!1;for(var e=0,r=0;r<12;r++)e+=parseInt(t[r],10)*(13-r);return t[12]===((11-e%11)%10).toString()},LK:function(t){return!(10!==t.length||!/^[1-9]\d{8}[vx]$/i.test(t))||!(12!==t.length||!/^[1-9]\d{11}$/i.test(t))},"he-IL":function(t){t=t.trim();if(!/^\d{9}$/.test(t))return!1;for(var e,r=t,n=0,i=0;i<r.length;i++)n+=9<(e=Number(r[i])*(i%2+1))?e-9:e;return n%10==0},"ar-LY":function(t){t=t.trim();return!!/^(1|2)\d{11}$/.test(t)},"ar-TN":function(t){t=t.trim();return!!/^\d{8}$/.test(t)},"zh-CN":function(t){function n(t){return r.includes(t)}function i(t){var e=parseInt(t.substring(0,4),10),r=parseInt(t.substring(4,6),10),n=parseInt(t.substring(6),10);return!((t=new Date(e,r-1,n))>new Date)&&(t.getFullYear()===e&&t.getMonth()===r-1&&t.getDate()===n)}function a(t){return function(t){for(var e=t.substring(0,17),r=0,n=0;n<17;n++)r+=parseInt(e.charAt(n),10)*parseInt(o[n],10);return s[r%11]}(t)===t.charAt(17).toUpperCase()}var e,r=["11","12","13","14","15","21","22","23","31","32","33","34","35","36","37","41","42","43","44","45","46","50","51","52","53","54","61","62","63","64","65","71","81","82","91"],o=["7","9","10","5","8","4","2","1","6","3","7","9","10","5","8","4","2"],s=["1","0","X","9","8","7","6","5","4","3","2"];return!!/^\d{15}|(\d{17}(\d|x|X))$/.test(e=t)&&(15===e.length?function(t){var e=/^[1-9]\d{7}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\d{3}$/.test(t);if(!e)return!1;var r=t.substring(0,2);if(!(e=n(r)))return!1;t="19".concat(t.substring(6,12));return!!(e=i(t))}:function(t){var e=/^[1-9]\d{5}[1-9]\d{3}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\d{3}(\d|x|X)$/.test(t);if(!e)return!1;var r=t.substring(0,2);if(!(e=n(r)))return!1;r=t.substring(6,14);return!!(e=i(r))&&a(t)})(e)},"zh-TW":function(t){var n={A:10,B:11,C:12,D:13,E:14,F:15,G:16,H:17,I:34,J:18,K:19,L:20,M:21,N:22,O:35,P:23,Q:24,R:25,S:26,T:27,U:28,V:29,W:32,X:30,Y:31,Z:33},t=t.trim().toUpperCase();return!!/^[A-Z][0-9]{9}$/.test(t)&&Array.from(t).reduce(function(t,e,r){if(0!==r)return 9===r?(10-t%10-Number(e))%10==0:t+Number(e)*(9-r);e=n[e];return e%10*9+Math.floor(e/10)},0)}};var Jt=8,jt=14,Qt=/^(\d{8}|\d{13}|\d{14})$/;function qt(r){var t=10-r.slice(0,-1).split("").map(function(t,e){return Number(t)*(t=r.length,e=e,t===Jt||t===jt?e%2==0?3:1:e%2==0?1:3)}).reduce(function(t,e){return t+e},0)%10;return t<10?t:0}var te=/^[A-Z]{2}[0-9A-Z]{9}[0-9]$/;var ee=/^(?:[0-9]{9}X|[0-9]{10})$/,re=/^(?:[0-9]{13})$/,ne=[1,3];function ie(t){for(var e=10,r=0;r<t.length-1;r++)e=(parseInt(t[r],10)+e)%10==0?9:(parseInt(t[r],10)+e)%10*2%11;return(e=1===e?0:11-e)===parseInt(t[10],10)}function ae(t){for(var e,r=0,n=!1,i=t.length-1;0<=i;i--)r+=n?9<(e=2*parseInt(t[i],10))?e.toString().split("").map(function(t){return parseInt(t,10)}).reduce(function(t,e){return t+e},0):e:parseInt(t[i],10),n=!n;return r%10==0}function oe(t,e){for(var r=0,n=0;n<t.length;n++)r+=t[n]*(e-n);return r}var se={andover:["10","12"],atlanta:["60","67"],austin:["50","53"],brookhaven:["01","02","03","04","05","06","11","13","14","16","21","22","23","25","34","51","52","54","55","56","57","58","59","65"],cincinnati:["30","32","35","36","37","38","61"],fresno:["15","24"],internet:["20","26","27","45","46","47"],kansas:["40","44"],memphis:["94","95"],ogden:["80","90"],philadelphia:["33","39","41","42","43","46","48","62","63","64","66","68","71","72","73","74","75","76","77","81","82","83","84","85","86","87","88","91","92","93","98","99"],sba:["31"]};function ce(t){for(var e=!1,r=!1,n=0;n<3;n++)if(!e&&/[AEIOU]/.test(t[n]))e=!0;else if(!r&&e&&"X"===t[n])r=!0;else if(0<n){if(e&&!r&&!/[AEIOU]/.test(t[n]))return;if(r&&!/X/.test(t[n]))return}return 1}var le={"bg-BG":/^\d{10}$/,"cs-CZ":/^\d{6}\/{0,1}\d{3,4}$/,"de-AT":/^\d{9}$/,"de-DE":/^[1-9]\d{10}$/,"dk-DK":/^\d{6}-{0,1}\d{4}$/,"el-CY":/^[09]\d{7}[A-Z]$/,"el-GR":/^([0-4]|[7-9])\d{8}$/,"en-GB":/^\d{10}$|^(?!GB|NK|TN|ZZ)(?![DFIQUV])[A-Z](?![DFIQUVO])[A-Z]\d{6}[ABCD ]$/i,"en-IE":/^\d{7}[A-W][A-IW]{0,1}$/i,"en-US":/^\d{2}[- ]{0,1}\d{7}$/,"es-ES":/^(\d{0,8}|[XYZKLM]\d{7})[A-HJ-NP-TV-Z]$/i,"et-EE":/^[1-6]\d{6}(00[1-9]|0[1-9][0-9]|[1-6][0-9]{2}|70[0-9]|710)\d$/,"fi-FI":/^\d{6}[-+A]\d{3}[0-9A-FHJ-NPR-Y]$/i,"fr-BE":/^\d{11}$/,"fr-FR":/^[0-3]\d{12}$|^[0-3]\d\s\d{2}(\s\d{3}){3}$/,"fr-LU":/^\d{13}$/,"hr-HR":/^\d{11}$/,"hu-HU":/^8\d{9}$/,"it-IT":/^[A-Z]{6}[L-NP-V0-9]{2}[A-EHLMPRST][L-NP-V0-9]{2}[A-ILMZ][L-NP-V0-9]{3}[A-Z]$/i,"lv-LV":/^\d{6}-{0,1}\d{5}$/,"mt-MT":/^\d{3,7}[APMGLHBZ]$|^([1-8])\1\d{7}$/i,"nl-NL":/^\d{9}$/,"pl-PL":/^\d{10,11}$/,"pt-BR":/(?:^\d{11}$)|(?:^\d{14}$)/,"pt-PT":/^\d{9}$/,"ro-RO":/^\d{13}$/,"sk-SK":/^\d{6}\/{0,1}\d{3,4}$/,"sl-SI":/^[1-9]\d{7}$/,"sv-SE":/^(\d{6}[-+]{0,1}\d{4}|(18|19|20)\d{6}[-+]{0,1}\d{4})$/};le["lb-LU"]=le["fr-LU"],le["lt-LT"]=le["et-EE"],le["nl-BE"]=le["fr-BE"];var ue={"bg-BG":function(t){var e=t.slice(0,2),r=parseInt(t.slice(2,4),10),e=40<r?(r-=40,"20".concat(e)):20<r?(r-=20,"18".concat(e)):"19".concat(e);if(r<10&&(r="0".concat(r)),!q("".concat(e,"/").concat(r,"/").concat(t.slice(4,6)),"YYYY/MM/DD"))return!1;for(var n=t.split("").map(function(t){return parseInt(t,10)}),i=[2,4,8,5,10,9,7,3,6],a=0,o=0;o<i.length;o++)a+=n[o]*i[o];return(a=a%11==10?0:a%11)===n[9]},"cs-CZ":function(t){t=t.replace(/\W/,"");var e=parseInt(t.slice(0,2),10);if(10===t.length)e=(e<54?"20":"19").concat(e);else{if("000"===t.slice(6))return!1;if(!(e<54))return!1;e="19".concat(e)}3===e.length&&(e=[e.slice(0,2),"0",e.slice(2)].join(""));var r=parseInt(t.slice(2,4),10);if(50<r&&(r-=50),20<r){if(parseInt(e,10)<2004)return!1;r-=20}if(r<10&&(r="0".concat(r)),!q("".concat(e,"/").concat(r,"/").concat(t.slice(4,6)),"YYYY/MM/DD"))return!1;if(10===t.length&&parseInt(t,10)%11!=0){r=parseInt(t.slice(0,9),10)%11;if(!(parseInt(e,10)<1986&&10==r))return!1;if(0!==parseInt(t.slice(9),10))return!1}return!0},"de-AT":ae,"de-DE":function(t){for(var e=t.split("").map(function(t){return parseInt(t,10)}),r=[],n=0;n<e.length-1;n++){r.push("");for(var i=0;i<e.length-1;i++)e[n]===e[i]&&(r[n]+=i)}if(2!==(r=r.filter(function(t){return 1<t.length})).length&&3!==r.length)return!1;if(3===r[0].length){for(var a=r[0].split("").map(function(t){return parseInt(t,10)}),o=0,s=0;s<a.length-1;s++)a[s]+1===a[s+1]&&(o+=1);if(2===o)return!1}return ie(t)},"dk-DK":function(t){t=t.replace(/\W/,"");var e=parseInt(t.slice(4,6),10);switch(t.slice(6,7)){case"0":case"1":case"2":case"3":e="19".concat(e);break;case"4":case"9":e=(e<37?"20":"19").concat(e);break;default:if(e<37)e="20".concat(e);else{if(!(58<e))return!1;e="18".concat(e)}}if(3===e.length&&(e=[e.slice(0,2),"0",e.slice(2)].join("")),!q("".concat(e,"/").concat(t.slice(2,4),"/").concat(t.slice(0,2)),"YYYY/MM/DD"))return!1;for(var r=t.split("").map(function(t){return parseInt(t,10)}),n=0,i=4,a=0;a<9;a++)n+=r[a]*i,1===--i&&(i=7);return 1!=(n%=11)&&(0===n?0===r[9]:r[9]===11-n)},"el-CY":function(t){for(var e=t.slice(0,8).split("").map(function(t){return parseInt(t,10)}),r=0,n=1;n<e.length;n+=2)r+=e[n];for(var i=0;i<e.length;i+=2)e[i]<2?r+=1-e[i]:(r+=2*(e[i]-2)+5,4<e[i]&&(r+=2));return String.fromCharCode(r%26+65)===t.charAt(8)},"el-GR":function(t){for(var e=t.split("").map(function(t){return parseInt(t,10)}),r=0,n=0;n<8;n++)r+=e[n]*Math.pow(2,8-n);return r%11%10===e[8]},"en-IE":function(t){var e=oe(t.split("").slice(0,7).map(function(t){return parseInt(t,10)}),8);return 9===t.length&&"W"!==t[8]&&(e+=9*(t[8].charCodeAt(0)-64)),0===(e%=23)?"W"===t[7].toUpperCase():t[7].toUpperCase()===String.fromCharCode(64+e)},"en-US":function(t){return-1!==function(){var t,e=[];for(t in se)se.hasOwnProperty(t)&&e.push.apply(e,r(se[t]));return e}().indexOf(t.substr(0,2))},"es-ES":function(t){var e=t.toUpperCase().split("");if(isNaN(parseInt(e[0],10))&&1<e.length){var r=0;switch(e[0]){case"Y":r=1;break;case"Z":r=2}e.splice(0,1,r)}else for(;e.length<9;)e.unshift(0);return e=e.join(""),t=parseInt(e.slice(0,8),10)%23,e[8]===["T","R","W","A","G","M","Y","F","P","D","X","B","N","J","Z","S","Q","V","H","L","C","K","E"][t]},"et-EE":function(t){var e=t.slice(1,3);switch(t.slice(0,1)){case"1":case"2":e="18".concat(e);break;case"3":case"4":e="19".concat(e);break;default:e="20".concat(e)}if(!q("".concat(e,"/").concat(t.slice(3,5),"/").concat(t.slice(5,7)),"YYYY/MM/DD"))return!1;for(var r=t.split("").map(function(t){return parseInt(t,10)}),n=0,i=1,a=0;a<10;a++)n+=r[a]*i,10===(i+=1)&&(i=1);if(n%11==10){for(var n=0,i=3,o=0;o<10;o++)n+=r[o]*i,10===(i+=1)&&(i=1);if(n%11==10)return 0===r[10]}return n%11===r[10]},"fi-FI":function(t){var e=t.slice(4,6);switch(t.slice(6,7)){case"+":e="18".concat(e);break;case"-":e="19".concat(e);break;default:e="20".concat(e)}if(!q("".concat(e,"/").concat(t.slice(2,4),"/").concat(t.slice(0,2)),"YYYY/MM/DD"))return!1;var r=parseInt(t.slice(0,6)+t.slice(7,10),10)%31;return r<10?r===parseInt(t.slice(10),10):["A","B","C","D","E","F","H","J","K","L","M","N","P","R","S","T","U","V","W","X","Y"][r-=10]===t.slice(10)},"fr-BE":function(t){if(("00"!==t.slice(2,4)||"00"!==t.slice(4,6))&&!q("".concat(t.slice(0,2),"/").concat(t.slice(2,4),"/").concat(t.slice(4,6)),"YY/MM/DD"))return!1;var e=97-parseInt(t.slice(0,9),10)%97,r=parseInt(t.slice(9,11),10);return e===r||97-parseInt("2".concat(t.slice(0,9)),10)%97===r},"fr-FR":function(t){return t=t.replace(/\s/g,""),parseInt(t.slice(0,10),10)%511===parseInt(t.slice(10,13),10)},"fr-LU":function(t){return!!q("".concat(t.slice(0,4),"/").concat(t.slice(4,6),"/").concat(t.slice(6,8)),"YYYY/MM/DD")&&(!!ae(t.slice(0,12))&&function(t){for(var e=[[0,1,2,3,4,5,6,7,8,9],[1,2,3,4,0,6,7,8,9,5],[2,3,4,0,1,7,8,9,5,6],[3,4,0,1,2,8,9,5,6,7],[4,0,1,2,3,9,5,6,7,8],[5,9,8,7,6,0,4,3,2,1],[6,5,9,8,7,1,0,4,3,2],[7,6,5,9,8,2,1,0,4,3],[8,7,6,5,9,3,2,1,0,4],[9,8,7,6,5,4,3,2,1,0]],r=[[0,1,2,3,4,5,6,7,8,9],[1,5,7,6,2,8,3,0,9,4],[5,8,0,3,7,9,6,1,4,2],[8,9,1,6,0,4,3,5,2,7],[9,4,5,3,1,2,6,8,7,0],[4,2,8,6,5,7,3,9,0,1],[2,7,9,3,8,0,6,4,1,5],[7,0,4,6,9,1,3,2,5,8]],n=t.split("").reverse().join(""),i=0,a=0;a<n.length;a++)i=e[i][r[a%8][parseInt(n[a],10)]];return 0===i}("".concat(t.slice(0,11)).concat(t[12])))},"hr-HR":ie,"hu-HU":function(t){for(var e=t.split("").map(function(t){return parseInt(t,10)}),r=8,n=1;n<9;n++)r+=e[n]*(n+1);return r%11===e[9]},"it-IT":function(t){var e=t.toUpperCase().split("");if(!ce(e.slice(0,3)))return!1;if(!ce(e.slice(3,6)))return!1;for(var r={L:"0",M:"1",N:"2",P:"3",Q:"4",R:"5",S:"6",T:"7",U:"8",V:"9"},n=0,i=[6,7,9,10,12,13,14];n<i.length;n++){var a=i[n];e[a]in r&&e.splice(a,1,r[e[a]])}var o={A:"01",B:"02",C:"03",D:"04",E:"05",H:"06",L:"07",M:"08",P:"09",R:"10",S:"11",T:"12"}[e[8]];if(40<(t=parseInt(e[9]+e[10],10))&&(t-=40),t<10&&(t="0".concat(t)),!q("".concat(e[6]).concat(e[7],"/").concat(o,"/").concat(t),"YY/MM/DD"))return!1;for(var s=0,c=1;c<e.length-1;c+=2){var l=parseInt(e[c],10);s+=l=isNaN(l)?e[c].charCodeAt(0)-65:l}for(var u={A:1,B:0,C:5,D:7,E:9,F:13,G:15,H:17,I:19,J:21,K:2,L:4,M:18,N:20,O:11,P:3,Q:6,R:8,S:12,T:14,U:16,V:10,W:22,X:25,Y:24,Z:23,0:1,1:0},d=0;d<e.length-1;d+=2){var f,A=0;e[d]in u?A=u[e[d]]:(A=2*(f=parseInt(e[d],10))+1,4<f&&(A+=2)),s+=A}return String.fromCharCode(65+s%26)===e[15]},"lv-LV":function(t){var e=(t=t.replace(/\W/,"")).slice(0,2);if("32"===e)return!0;if("00"!==t.slice(2,4)){var r=t.slice(4,6);switch(t[6]){case"0":r="18".concat(r);break;case"1":r="19".concat(r);break;default:r="20".concat(r)}if(!q("".concat(r,"/").concat(t.slice(2,4),"/").concat(e),"YYYY/MM/DD"))return!1}for(var n=1101,i=[1,6,3,7,9,10,5,8,4,2],a=0;a<t.length-1;a++)n-=parseInt(t[a],10)*i[a];return parseInt(t[10],10)===n%11},"mt-MT":function(t){if(9!==t.length){for(var e=t.toUpperCase().split("");e.length<8;)e.unshift(0);switch(t[7]){case"A":case"P":if(0===parseInt(e[6],10))return!1;break;default:var r=parseInt(e.join("").slice(0,5),10);if(32e3<r)return!1;if(r===parseInt(e.join("").slice(5,7),10))return!1}}return!0},"nl-NL":function(t){return oe(t.split("").slice(0,8).map(function(t){return parseInt(t,10)}),9)%11===parseInt(t[8],10)},"pl-PL":function(t){if(10===t.length){for(var e=[6,5,7,2,3,4,5,6,7],r=0,n=0;n<e.length;n++)r+=parseInt(t[n],10)*e[n];return 10===(r%=11)?!1:r===parseInt(t[9],10)}var i=t.slice(0,2),a=parseInt(t.slice(2,4),10);if(80<a?(i="18".concat(i),a-=80):60<a?(i="22".concat(i),a-=60):40<a?(i="21".concat(i),a-=40):20<a?(i="20".concat(i),a-=20):i="19".concat(i),a<10&&(a="0".concat(a)),!q("".concat(i,"/").concat(a,"/").concat(t.slice(4,6)),"YYYY/MM/DD"))return!1;for(var o=0,s=1,c=0;c<t.length-1;c++)o+=parseInt(t[c],10)*s%10,10<(s+=2)?s=1:5===s&&(s+=2);return(o=10-o%10)===parseInt(t[10],10)},"pt-BR":function(t){if(11===t.length){var e=0;if("11111111111"===t||"22222222222"===t||"33333333333"===t||"44444444444"===t||"55555555555"===t||"66666666666"===t||"77777777777"===t||"88888888888"===t||"99999999999"===t||"00000000000"===t)return!1;for(var r=1;r<=9;r++)e+=parseInt(t.substring(r-1,r),10)*(11-r);if((u=10===(u=10*e%11)?0:u)!==parseInt(t.substring(9,10),10))return!1;e=0;for(var n=1;n<=10;n++)e+=parseInt(t.substring(n-1,n),10)*(12-n);return(u=10===(u=10*e%11)?0:u)!==parseInt(t.substring(10,11),10)?!1:!0}if("00000000000000"===t||"11111111111111"===t||"22222222222222"===t||"33333333333333"===t||"44444444444444"===t||"55555555555555"===t||"66666666666666"===t||"77777777777777"===t||"88888888888888"===t||"99999999999999"===t)return!1;for(var i=t.length-2,a=t.substring(0,i),o=t.substring(i),s=0,c=i-7,l=i;1<=l;l--)s+=a.charAt(i-l)*c,--c<2&&(c=9);var u=s%11<2?0:11-s%11;if(u!==parseInt(o.charAt(0),10))return!1;for(var a=t.substring(0,i+=1),s=0,c=i-7,d=i;1<=d;d--)s+=a.charAt(i-d)*c,--c<2&&(c=9);return(u=s%11<2?0:11-s%11)===parseInt(o.charAt(1),10)},"pt-PT":function(t){var e=11-oe(t.split("").slice(0,8).map(function(t){return parseInt(t,10)}),9)%11;return 9<e?0===parseInt(t[8],10):e===parseInt(t[8],10)},"ro-RO":function(t){if("9000"===t.slice(0,4))return!0;var e=t.slice(1,3);switch(t[0]){case"1":case"2":e="19".concat(e);break;case"3":case"4":e="18".concat(e);break;case"5":case"6":e="20".concat(e)}var r="".concat(e,"/").concat(t.slice(3,5),"/").concat(t.slice(5,7));if(8===r.length){if(!q(r,"YY/MM/DD"))return!1}else if(!q(r,"YYYY/MM/DD"))return!1;for(var n=t.split("").map(function(t){return parseInt(t,10)}),i=[2,7,9,1,4,6,3,5,8,2,7,9],a=0,o=0;o<i.length;o++)a+=n[o]*i[o];return a%11==10?1===n[12]:n[12]===a%11},"sk-SK":function(t){if(9===t.length){if("000"===(t=t.replace(/\W/,"")).slice(6))return!1;if(53<(e=parseInt(t.slice(0,2),10)))return!1;var e=(e<10?"190":"19").concat(e),r=parseInt(t.slice(2,4),10);if(50<r&&(r-=50),r<10&&(r="0".concat(r)),!q("".concat(e,"/").concat(r,"/").concat(t.slice(4,6)),"YYYY/MM/DD"))return!1}return!0},"sl-SI":function(t){var e=11-oe(t.split("").slice(0,7).map(function(t){return parseInt(t,10)}),8)%11;return 10==e?0===parseInt(t[7],10):e===parseInt(t[7],10)},"sv-SE":function(t){var e=t.slice(0),r="",n=(e=11<t.length?e.slice(2):e).slice(2,4),i=parseInt(e.slice(4,6),10);if(11<t.length)r=t.slice(0,4);else if(r=t.slice(0,2),11===t.length&&i<60){var a=(new Date).getFullYear().toString(),e=parseInt(a.slice(0,2),10),a=parseInt(a,10);if("-"===t[6])r=(parseInt("".concat(e).concat(r),10)>a?"".concat(e-1):"".concat(e)).concat(r);else if(r="".concat(e-1).concat(r),a-parseInt(r,10)<100)return!1}if(60<i&&(i-=60),i<10&&(i="0".concat(i)),8===(i="".concat(r,"/").concat(n,"/").concat(i)).length){if(!q(i,"YY/MM/DD"))return!1}else if(!q(i,"YYYY/MM/DD"))return!1;return ae(t.replace(/\W/,""))}};ue["lb-LU"]=ue["fr-LU"],ue["lt-LT"]=ue["et-EE"],ue["nl-BE"]=ue["fr-BE"];var de=/[-\\\/!@#$%\^&\*\(\)\+\=\[\]]+/g,fe={"de-AT":de,"de-DE":/[\/\\]/g,"fr-BE":de};fe["nl-BE"]=fe["fr-BE"];var Ae={"am-AM":/^(\+?374|0)((10|[9|7][0-9])\d{6}$|[2-4]\d{7}$)/,"ar-AE":/^((\+?971)|0)?5[024568]\d{7}$/,"ar-BH":/^(\+?973)?(3|6)\d{7}$/,"ar-DZ":/^(\+?213|0)(5|6|7)\d{8}$/,"ar-LB":/^(\+?961)?((3|81)\d{6}|7\d{7})$/,"ar-EG":/^((\+?20)|0)?1[0125]\d{8}$/,"ar-IQ":/^(\+?964|0)?7[0-9]\d{8}$/,"ar-JO":/^(\+?962|0)?7[789]\d{7}$/,"ar-KW":/^(\+?965)[569]\d{7}$/,"ar-LY":/^((\+?218)|0)?(9[1-6]\d{7}|[1-8]\d{7,9})$/,"ar-MA":/^(?:(?:\+|00)212|0)[5-7]\d{8}$/,"ar-OM":/^((\+|00)968)?(9[1-9])\d{6}$/,"ar-PS":/^(\+?970|0)5[6|9](\d{7})$/,"ar-SA":/^(!?(\+?966)|0)?5\d{8}$/,"ar-SY":/^(!?(\+?963)|0)?9\d{8}$/,"ar-TN":/^(\+?216)?[2459]\d{7}$/,"az-AZ":/^(\+994|0)(5[015]|7[07]|99)\d{7}$/,"bs-BA":/^((((\+|00)3876)|06))((([0-3]|[5-6])\d{6})|(4\d{7}))$/,"be-BY":/^(\+?375)?(24|25|29|33|44)\d{7}$/,"bg-BG":/^(\+?359|0)?8[789]\d{7}$/,"bn-BD":/^(\+?880|0)1[13456789][0-9]{8}$/,"ca-AD":/^(\+376)?[346]\d{5}$/,"cs-CZ":/^(\+?420)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$/,"da-DK":/^(\+?45)?\s?\d{2}\s?\d{2}\s?\d{2}\s?\d{2}$/,"de-DE":/^((\+49|0)[1|3])([0|5][0-45-9]\d|6([23]|0\d?)|7([0-57-9]|6\d))\d{7,9}$/,"de-AT":/^(\+43|0)\d{1,4}\d{3,12}$/,"de-CH":/^(\+41|0)([1-9])\d{1,9}$/,"de-LU":/^(\+352)?((6\d1)\d{6})$/,"dv-MV":/^(\+?960)?(7[2-9]|91|9[3-9])\d{7}$/,"el-GR":/^(\+?30|0)?(69\d{8})$/,"en-AU":/^(\+?61|0)4\d{8}$/,"en-BM":/^(\+?1)?441(((3|7)\d{6}$)|(5[0-3][0-9]\d{4}$)|(59\d{5}))/,"en-GB":/^(\+?44|0)7\d{9}$/,"en-GG":/^(\+?44|0)1481\d{6}$/,"en-GH":/^(\+233|0)(20|50|24|54|27|57|26|56|23|28|55|59)\d{7}$/,"en-GY":/^(\+592|0)6\d{6}$/,"en-HK":/^(\+?852[-\s]?)?[456789]\d{3}[-\s]?\d{4}$/,"en-MO":/^(\+?853[-\s]?)?[6]\d{3}[-\s]?\d{4}$/,"en-IE":/^(\+?353|0)8[356789]\d{7}$/,"en-IN":/^(\+?91|0)?[6789]\d{9}$/,"en-KE":/^(\+?254|0)(7|1)\d{8}$/,"en-KI":/^((\+686|686)?)?( )?((6|7)(2|3|8)[0-9]{6})$/,"en-MT":/^(\+?356|0)?(99|79|77|21|27|22|25)[0-9]{6}$/,"en-MU":/^(\+?230|0)?\d{8}$/,"en-NA":/^(\+?264|0)(6|8)\d{7}$/,"en-NG":/^(\+?234|0)?[789]\d{9}$/,"en-NZ":/^(\+?64|0)[28]\d{7,9}$/,"en-PK":/^((00|\+)?92|0)3[0-6]\d{8}$/,"en-PH":/^(09|\+639)\d{9}$/,"en-RW":/^(\+?250|0)?[7]\d{8}$/,"en-SG":/^(\+65)?[3689]\d{7}$/,"en-SL":/^(\+?232|0)\d{8}$/,"en-TZ":/^(\+?255|0)?[67]\d{8}$/,"en-UG":/^(\+?256|0)?[7]\d{8}$/,"en-US":/^((\+1|1)?( |-)?)?(\([2-9][0-9]{2}\)|[2-9][0-9]{2})( |-)?([2-9][0-9]{2}( |-)?[0-9]{4})$/,"en-ZA":/^(\+?27|0)\d{9}$/,"en-ZM":/^(\+?26)?09[567]\d{7}$/,"en-ZW":/^(\+263)[0-9]{9}$/,"en-BW":/^(\+?267)?(7[1-8]{1})\d{6}$/,"es-AR":/^\+?549(11|[2368]\d)\d{8}$/,"es-BO":/^(\+?591)?(6|7)\d{7}$/,"es-CO":/^(\+?57)?3(0(0|1|2|4|5)|1\d|2[0-4]|5(0|1))\d{7}$/,"es-CL":/^(\+?56|0)[2-9]\d{1}\d{7}$/,"es-CR":/^(\+506)?[2-8]\d{7}$/,"es-CU":/^(\+53|0053)?5\d{7}/,"es-DO":/^(\+?1)?8[024]9\d{7}$/,"es-HN":/^(\+?504)?[9|8]\d{7}$/,"es-EC":/^(\+?593|0)([2-7]|9[2-9])\d{7}$/,"es-ES":/^(\+?34)?[6|7]\d{8}$/,"es-PE":/^(\+?51)?9\d{8}$/,"es-MX":/^(\+?52)?(1|01)?\d{10,11}$/,"es-PA":/^(\+?507)\d{7,8}$/,"es-PY":/^(\+?595|0)9[9876]\d{7}$/,"es-SV":/^(\+?503)?[67]\d{7}$/,"es-UY":/^(\+598|0)9[1-9][\d]{6}$/,"es-VE":/^(\+?58)?(2|4)\d{9}$/,"et-EE":/^(\+?372)?\s?(5|8[1-4])\s?([0-9]\s?){6,7}$/,"fa-IR":/^(\+?98[\-\s]?|0)9[0-39]\d[\-\s]?\d{3}[\-\s]?\d{4}$/,"fi-FI":/^(\+?358|0)\s?(4(0|1|2|4|5|6)?|50)\s?(\d\s?){4,8}\d$/,"fj-FJ":/^(\+?679)?\s?\d{3}\s?\d{4}$/,"fo-FO":/^(\+?298)?\s?\d{2}\s?\d{2}\s?\d{2}$/,"fr-BF":/^(\+226|0)[67]\d{7}$/,"fr-CM":/^(\+?237)6[0-9]{8}$/,"fr-FR":/^(\+?33|0)[67]\d{8}$/,"fr-GF":/^(\+?594|0|00594)[67]\d{8}$/,"fr-GP":/^(\+?590|0|00590)[67]\d{8}$/,"fr-MQ":/^(\+?596|0|00596)[67]\d{8}$/,"fr-PF":/^(\+?689)?8[789]\d{6}$/,"fr-RE":/^(\+?262|0|00262)[67]\d{8}$/,"he-IL":/^(\+972|0)([23489]|5[012345689]|77)[1-9]\d{6}$/,"hu-HU":/^(\+?36|06)(20|30|31|50|70)\d{7}$/,"id-ID":/^(\+?62|0)8(1[123456789]|2[1238]|3[1238]|5[12356789]|7[78]|9[56789]|8[123456789])([\s?|\d]{5,11})$/,"it-IT":/^(\+?39)?\s?3\d{2} ?\d{6,7}$/,"it-SM":/^((\+378)|(0549)|(\+390549)|(\+3780549))?6\d{5,9}$/,"ja-JP":/^(\+81[ \-]?(\(0\))?|0)[6789]0[ \-]?\d{4}[ \-]?\d{4}$/,"ka-GE":/^(\+?995)?(5|79)\d{7}$/,"kk-KZ":/^(\+?7|8)?7\d{9}$/,"kl-GL":/^(\+?299)?\s?\d{2}\s?\d{2}\s?\d{2}$/,"ko-KR":/^((\+?82)[ \-]?)?0?1([0|1|6|7|8|9]{1})[ \-]?\d{3,4}[ \-]?\d{4}$/,"lt-LT":/^(\+370|8)\d{8}$/,"lv-LV":/^(\+?371)2\d{7}$/,"ms-MY":/^(\+?6?01){1}(([0145]{1}(\-|\s)?\d{7,8})|([236789]{1}(\s|\-)?\d{7}))$/,"mz-MZ":/^(\+?258)?8[234567]\d{7}$/,"nb-NO":/^(\+?47)?[49]\d{7}$/,"ne-NP":/^(\+?977)?9[78]\d{8}$/,"nl-BE":/^(\+?32|0)4\d{8}$/,"nl-NL":/^(((\+|00)?31\(0\))|((\+|00)?31)|0)6{1}\d{8}$/,"nn-NO":/^(\+?47)?[49]\d{7}$/,"pl-PL":/^(\+?48)? ?[5-8]\d ?\d{3} ?\d{2} ?\d{2}$/,"pt-BR":/^((\+?55\ ?[1-9]{2}\ ?)|(\+?55\ ?\([1-9]{2}\)\ ?)|(0[1-9]{2}\ ?)|(\([1-9]{2}\)\ ?)|([1-9]{2}\ ?))((\d{4}\-?\d{4})|(9[2-9]{1}\d{3}\-?\d{4}))$/,"pt-PT":/^(\+?351)?9[1236]\d{7}$/,"pt-AO":/^(\+244)\d{9}$/,"ro-RO":/^(\+?4?0)\s?7\d{2}(\/|\s|\.|\-)?\d{3}(\s|\.|\-)?\d{3}$/,"ru-RU":/^(\+?7|8)?9\d{9}$/,"si-LK":/^(?:0|94|\+94)?(7(0|1|2|4|5|6|7|8)( |-)?)\d{7}$/,"sl-SI":/^(\+386\s?|0)(\d{1}\s?\d{3}\s?\d{2}\s?\d{2}|\d{2}\s?\d{3}\s?\d{3})$/,"sk-SK":/^(\+?421)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$/,"sq-AL":/^(\+355|0)6[789]\d{6}$/,"sr-RS":/^(\+3816|06)[- \d]{5,9}$/,"sv-SE":/^(\+?46|0)[\s\-]?7[\s\-]?[02369]([\s\-]?\d){7}$/,"tg-TJ":/^(\+?992)?[5][5]\d{7}$/,"th-TH":/^(\+66|66|0)\d{9}$/,"tr-TR":/^(\+?90|0)?5\d{9}$/,"tk-TM":/^(\+993|993|8)\d{8}$/,"uk-UA":/^(\+?38|8)?0\d{9}$/,"uz-UZ":/^(\+?998)?(6[125-79]|7[1-69]|88|9\d)\d{7}$/,"vi-VN":/^((\+?84)|0)((3([2-9]))|(5([25689]))|(7([0|6-9]))|(8([1-9]))|(9([0-9])))([0-9]{7})$/,"zh-CN":/^((\+|00)86)?(1[3-9]|9[28])\d{9}$/,"zh-TW":/^(\+?886\-?|0)?9\d{8}$/,"dz-BT":/^(\+?975|0)?(17|16|77|02)\d{6}$/};Ae["en-CA"]=Ae["en-US"],Ae["fr-CA"]=Ae["en-CA"],Ae["fr-BE"]=Ae["nl-BE"],Ae["zh-HK"]=Ae["en-HK"],Ae["zh-MO"]=Ae["en-MO"],Ae["ga-IE"]=Ae["en-IE"],Ae["fr-CH"]=Ae["de-CH"],Ae["it-CH"]=Ae["fr-CH"];var T=Object.keys(Ae),$e=/^(0x)[0-9a-f]{40}$/i;var pe={symbol:"$",require_symbol:!1,allow_space_after_symbol:!1,symbol_after_digits:!1,allow_negatives:!0,parens_for_negatives:!1,negative_sign_before_digits:!1,negative_sign_after_digits:!1,allow_negative_sign_placeholder:!1,thousands_separator:",",decimal_separator:".",allow_decimal:!0,require_decimal:!1,digits_after_decimal:[2],allow_space_after_digits:!1};var Se=/^(bc1)[a-z0-9]{25,39}$/,he=/^(1|3)[A-HJ-NP-Za-km-z1-9]{25,39}$/;var ge=/^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-3])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/,Ee=/^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-3])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T]((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/;var G=/([01][0-9]|2[0-3])/,_=/[0-5][0-9]/,de=new RegExp("[-+]".concat(G.source,":").concat(_.source)),de=new RegExp("([zZ]|".concat(de.source,")")),G=new RegExp("".concat(G.source,":").concat(_.source,":").concat(/([0-5][0-9]|60)/.source).concat(/(\.[0-9]+)?/.source)),_=new RegExp("".concat(/[0-9]{4}/.source,"-").concat(/(0[1-9]|1[0-2])/.source,"-").concat(/([12]\d|0[1-9]|3[01])/.source)),G=new RegExp("".concat(G.source).concat(de.source)),Ie=new RegExp("^".concat(_.source,"[ tT]").concat(G.source,"$"));var Re=new Set(["AFG","ALA","ALB","DZA","ASM","AND","AGO","AIA","ATA","ATG","ARG","ARM","ABW","AUS","AUT","AZE","BHS","BHR","BGD","BRB","BLR","BEL","BLZ","BEN","BMU","BTN","BOL","BES","BIH","BWA","BVT","BRA","IOT","BRN","BGR","BFA","BDI","KHM","CMR","CAN","CPV","CYM","CAF","TCD","CHL","CHN","CXR","CCK","COL","COM","COG","COD","COK","CRI","CIV","HRV","CUB","CUW","CYP","CZE","DNK","DJI","DMA","DOM","ECU","EGY","SLV","GNQ","ERI","EST","ETH","FLK","FRO","FJI","FIN","FRA","GUF","PYF","ATF","GAB","GMB","GEO","DEU","GHA","GIB","GRC","GRL","GRD","GLP","GUM","GTM","GGY","GIN","GNB","GUY","HTI","HMD","VAT","HND","HKG","HUN","ISL","IND","IDN","IRN","IRQ","IRL","IMN","ISR","ITA","JAM","JPN","JEY","JOR","KAZ","KEN","KIR","PRK","KOR","KWT","KGZ","LAO","LVA","LBN","LSO","LBR","LBY","LIE","LTU","LUX","MAC","MKD","MDG","MWI","MYS","MDV","MLI","MLT","MHL","MTQ","MRT","MUS","MYT","MEX","FSM","MDA","MCO","MNG","MNE","MSR","MAR","MOZ","MMR","NAM","NRU","NPL","NLD","NCL","NZL","NIC","NER","NGA","NIU","NFK","MNP","NOR","OMN","PAK","PLW","PSE","PAN","PNG","PRY","PER","PHL","PCN","POL","PRT","PRI","QAT","REU","ROU","RUS","RWA","BLM","SHN","KNA","LCA","MAF","SPM","VCT","WSM","SMR","STP","SAU","SEN","SRB","SYC","SLE","SGP","SXM","SVK","SVN","SLB","SOM","ZAF","SGS","SSD","ESP","LKA","SDN","SUR","SJM","SWZ","SWE","CHE","SYR","TWN","TJK","TZA","THA","TLS","TGO","TKL","TON","TTO","TUN","TUR","TKM","TCA","TUV","UGA","UKR","ARE","GBR","USA","UMI","URY","UZB","VUT","VEN","VNM","VGB","VIR","WLF","ESH","YEM","ZMB","ZWE"]);var ve=new Set(["AED","AFN","ALL","AMD","ANG","AOA","ARS","AUD","AWG","AZN","BAM","BBD","BDT","BGN","BHD","BIF","BMD","BND","BOB","BOV","BRL","BSD","BTN","BWP","BYN","BZD","CAD","CDF","CHE","CHF","CHW","CLF","CLP","CNY","COP","COU","CRC","CUC","CUP","CVE","CZK","DJF","DKK","DOP","DZD","EGP","ERN","ETB","EUR","FJD","FKP","GBP","GEL","GHS","GIP","GMD","GNF","GTQ","GYD","HKD","HNL","HRK","HTG","HUF","IDR","ILS","INR","IQD","IRR","ISK","JMD","JOD","JPY","KES","KGS","KHR","KMF","KPW","KRW","KWD","KYD","KZT","LAK","LBP","LKR","LRD","LSL","LYD","MAD","MDL","MGA","MKD","MMK","MNT","MOP","MRU","MUR","MVR","MWK","MXN","MXV","MYR","MZN","NAD","NGN","NIO","NOK","NPR","NZD","OMR","PAB","PEN","PGK","PHP","PKR","PLN","PYG","QAR","RON","RSD","RUB","RWF","SAR","SBD","SCR","SDG","SEK","SGD","SHP","SLL","SOS","SRD","SSP","STN","SVC","SYP","SZL","THB","TJS","TMT","TND","TOP","TRY","TTD","TWD","TZS","UAH","UGX","USD","USN","UYI","UYU","UYW","UZS","VES","VND","VUV","WST","XAF","XAG","XAU","XBA","XBB","XBC","XBD","XCD","XDR","XOF","XPD","XPF","XPT","XSU","XTS","XUA","XXX","YER","ZAR","ZMW","ZWL"]);var Le=/^[A-Z2-7]+=*$/;var me=/^[A-HJ-NP-Za-km-z1-9]*$/;var Ze=/^[a-z]+\/[a-z0-9\-\+]+$/i,Me=/^[a-z\-]+=[a-z0-9\-]+$/i,Be=/^[a-z0-9!\$&'\(\)\*\+,;=\-\._~:@\/\?%\s]*$/i;var Ne=/^magnet:\?xt(?:\.1)?=urn:(?:aich|bitprint|btih|ed2k|ed2khash|kzhash|md5|sha1|tree:tiger):[a-z0-9]{32}(?:[a-z0-9]{8})?($|&)/i;var Fe=/^(application|audio|font|image|message|model|multipart|text|video)\/[a-zA-Z0-9\.\-\+]{1,100}$/i,De=/^text\/[a-zA-Z0-9\.\-\+]{1,100};\s?charset=("[a-zA-Z0-9\.\-\+\s]{0,70}"|[a-zA-Z0-9\.\-\+]{0,70})(\s?\([a-zA-Z0-9\.\-\+\s]{1,20}\))?$/i,Ce=/^multipart\/[a-zA-Z0-9\.\-\+]{1,100}(;\s?(boundary|charset)=("[a-zA-Z0-9\.\-\+\s]{0,70}"|[a-zA-Z0-9\.\-\+]{0,70})(\s?\([a-zA-Z0-9\.\-\+\s]{1,20}\))?){0,2}$/i;var Te=/^\(?[+-]?(90(\.0+)?|[1-8]?\d(\.\d+)?)$/,Ge=/^\s?[+-]?(180(\.0+)?|1[0-7]\d(\.\d+)?|\d{1,2}(\.\d+)?)\)?$/,Oe=/^(([1-8]?\d)\D+([1-5]?\d|60)\D+([1-5]?\d|60)(\.\d+)?|90\D+0\D+0)\D+[NSns]?$/i,_e=/^\s*([1-7]?\d{1,2}\D+([1-5]?\d|60)\D+([1-5]?\d|60)(\.\d+)?|180\D+0\D+0)\D+[EWew]?$/i,He={checkDMS:!1};var de=/^\d{4}$/,_=/^\d{5}$/,G=/^\d{6}$/,Pe={AD:/^AD\d{3}$/,AT:de,AU:de,AZ:/^AZ\d{4}$/,BE:de,BG:de,BR:/^\d{5}-\d{3}$/,BY:/2[1-4]{1}\d{4}$/,CA:/^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][\s\-]?\d[ABCEGHJ-NPRSTV-Z]\d$/i,CH:de,CN:/^(0[1-7]|1[012356]|2[0-7]|3[0-6]|4[0-7]|5[1-7]|6[1-7]|7[1-5]|8[1345]|9[09])\d{4}$/,CZ:/^\d{3}\s?\d{2}$/,DE:_,DK:de,DO:_,DZ:_,EE:_,ES:/^(5[0-2]{1}|[0-4]{1}\d{1})\d{3}$/,FI:_,FR:/^\d{2}\s?\d{3}$/,GB:/^(gir\s?0aa|[a-z]{1,2}\d[\da-z]?\s?(\d[a-z]{2})?)$/i,GR:/^\d{3}\s?\d{2}$/,HR:/^([1-5]\d{4}$)/,HT:/^HT\d{4}$/,HU:de,ID:_,IE:/^(?!.*(?:o))[A-Za-z]\d[\dw]\s\w{4}$/i,IL:/^(\d{5}|\d{7})$/,IN:/^((?!10|29|35|54|55|65|66|86|87|88|89)[1-9][0-9]{5})$/,IR:/\b(?!(\d)\1{3})[13-9]{4}[1346-9][013-9]{5}\b/,IS:/^\d{3}$/,IT:_,JP:/^\d{3}\-\d{4}$/,KE:_,KR:/^(\d{5}|\d{6})$/,LI:/^(948[5-9]|949[0-7])$/,LT:/^LT\-\d{5}$/,LU:de,LV:/^LV\-\d{4}$/,LK:_,MX:_,MT:/^[A-Za-z]{3}\s{0,1}\d{4}$/,MY:_,NL:/^\d{4}\s?[a-z]{2}$/i,NO:de,NP:/^(10|21|22|32|33|34|44|45|56|57)\d{3}$|^(977)$/i,NZ:de,PL:/^\d{2}\-\d{3}$/,PR:/^00[679]\d{2}([ -]\d{4})?$/,PT:/^\d{4}\-\d{3}?$/,RO:G,RU:G,SA:_,SE:/^[1-9]\d{2}\s?\d{2}$/,SG:G,SI:de,SK:/^\d{3}\s?\d{2}$/,TH:_,TN:de,TW:/^\d{3}(\d{2})?$/,UA:_,US:/^\d{5}(-\d{4})?$/,ZA:de,ZM:_},_=Object.keys(Pe);function be(t,e){l(t);e=e?new RegExp("^[".concat(e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"]+"),"g"):/^\s+/g;return t.replace(e,"")}function Ue(t,e){if(l(t),e){e=new RegExp("[".concat(e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"]+$"),"g");return t.replace(e,"")}for(var r=t.length-1;/\s/.test(t.charAt(r));)--r;return t.slice(0,r+1)}function Ke(t,e){return l(t),t.replace(new RegExp("[".concat(e,"]+"),"g"),"")}var we={all_lowercase:!0,gmail_lowercase:!0,gmail_remove_dots:!0,gmail_remove_subaddress:!0,gmail_convert_googlemaildotcom:!0,outlookdotcom_lowercase:!0,outlookdotcom_remove_subaddress:!0,yahoo_lowercase:!0,yahoo_remove_subaddress:!0,yandex_lowercase:!0,icloud_lowercase:!0,icloud_remove_subaddress:!0},ye=["icloud.com","me.com"],We=["hotmail.at","hotmail.be","hotmail.ca","hotmail.cl","hotmail.co.il","hotmail.co.nz","hotmail.co.th","hotmail.co.uk","hotmail.com","hotmail.com.ar","hotmail.com.au","hotmail.com.br","hotmail.com.gr","hotmail.com.mx","hotmail.com.pe","hotmail.com.tr","hotmail.com.vn","hotmail.cz","hotmail.de","hotmail.dk","hotmail.es","hotmail.fr","hotmail.hu","hotmail.id","hotmail.ie","hotmail.in","hotmail.it","hotmail.jp","hotmail.kr","hotmail.lv","hotmail.my","hotmail.ph","hotmail.pt","hotmail.sa","hotmail.sg","hotmail.sk","live.be","live.co.uk","live.com","live.com.ar","live.com.mx","live.de","live.es","live.eu","live.fr","live.it","live.nl","msn.com","outlook.at","outlook.be","outlook.cl","outlook.co.il","outlook.co.nz","outlook.co.th","outlook.com","outlook.com.ar","outlook.com.au","outlook.com.br","outlook.com.gr","outlook.com.pe","outlook.com.tr","outlook.com.vn","outlook.cz","outlook.de","outlook.dk","outlook.es","outlook.fr","outlook.hu","outlook.id","outlook.ie","outlook.in","outlook.it","outlook.jp","outlook.kr","outlook.lv","outlook.my","outlook.ph","outlook.pt","outlook.sa","outlook.sg","outlook.sk","passport.com"],Ye=["rocketmail.com","yahoo.ca","yahoo.co.uk","yahoo.com","yahoo.de","yahoo.fr","yahoo.in","yahoo.it","ymail.com"],xe=["yandex.ru","yandex.ua","yandex.kz","yandex.com","yandex.by","ya.ru"];function Ve(t){return 1<t.length?t:""}var ke=/^[^\s-_](?!.*?[-_]{2,})[a-z0-9-\\][^\s]*[^-_\s]$/;var ze={"cs-CZ":function(t){return/^(([ABCDEFHKIJKLMNPRSTUVXYZ]|[0-9])-?){5,8}$/.test(t)},"de-DE":function(t){return/^((AW|UL|AK|GA|AÖ|LF|AZ|AM|AS|ZE|AN|AB|A|KG|KH|BA|EW|BZ|HY|KM|BT|HP|B|BC|BI|BO|FN|TT|ÜB|BN|AH|BS|FR|HB|ZZ|BB|BK|BÖ|OC|OK|CW|CE|C|CO|LH|CB|KW|LC|LN|DA|DI|DE|DH|SY|NÖ|DO|DD|DU|DN|D|EI|EA|EE|FI|EM|EL|EN|PF|ED|EF|ER|AU|ZP|E|ES|NT|EU|FL|FO|FT|FF|F|FS|FD|FÜ|GE|G|GI|GF|GS|ZR|GG|GP|GR|NY|ZI|GÖ|GZ|GT|HA|HH|HM|HU|WL|HZ|WR|RN|HK|HD|HN|HS|GK|HE|HF|RZ|HI|HG|HO|HX|IK|IL|IN|J|JL|KL|KA|KS|KF|KE|KI|KT|KO|KN|KR|KC|KU|K|LD|LL|LA|L|OP|LM|LI|LB|LU|LÖ|HL|LG|MD|GN|MZ|MA|ML|MR|MY|AT|DM|MC|NZ|RM|RG|MM|ME|MB|MI|FG|DL|HC|MW|RL|MK|MG|MÜ|WS|MH|M|MS|NU|NB|ND|NM|NK|NW|NR|NI|NF|DZ|EB|OZ|TG|TO|N|OA|GM|OB|CA|EH|FW|OF|OL|OE|OG|BH|LR|OS|AA|GD|OH|KY|NP|WK|PB|PA|PE|PI|PS|P|PM|PR|RA|RV|RE|R|H|SB|WN|RS|RD|RT|BM|NE|GV|RP|SU|GL|RO|GÜ|RH|EG|RW|PN|SK|MQ|RU|SZ|RI|SL|SM|SC|HR|FZ|VS|SW|SN|CR|SE|SI|SO|LP|SG|NH|SP|IZ|ST|BF|TE|HV|OD|SR|S|AC|DW|ZW|TF|TS|TR|TÜ|UM|PZ|TP|UE|UN|UH|MN|KK|VB|V|AE|PL|RC|VG|GW|PW|VR|VK|KB|WA|WT|BE|WM|WE|AP|MO|WW|FB|WZ|WI|WB|JE|WF|WO|W|WÜ|BL|Z|GC)[- ]?[A-Z]{1,2}[- ]?\d{1,4}|(AIC|FDB|ABG|SLN|SAW|KLZ|BUL|ESB|NAB|SUL|WST|ABI|AZE|BTF|KÖT|DKB|FEU|ROT|ALZ|SMÜ|WER|AUR|NOR|DÜW|BRK|HAB|TÖL|WOR|BAD|BAR|BER|BIW|EBS|KEM|MÜB|PEG|BGL|BGD|REI|WIL|BKS|BIR|WAT|BOR|BOH|BOT|BRB|BLK|HHM|NEB|NMB|WSF|LEO|HDL|WMS|WZL|BÜS|CHA|KÖZ|ROD|WÜM|CLP|NEC|COC|ZEL|COE|CUX|DAH|LDS|DEG|DEL|RSL|DLG|DGF|LAN|HEI|MED|DON|KIB|ROK|JÜL|MON|SLE|EBE|EIC|HIG|WBS|BIT|PRÜ|LIB|EMD|WIT|ERH|HÖS|ERZ|ANA|ASZ|MAB|MEK|STL|SZB|FDS|HCH|HOR|WOL|FRG|GRA|WOS|FRI|FFB|GAP|GER|BRL|CLZ|GTH|NOH|HGW|GRZ|LÖB|NOL|WSW|DUD|HMÜ|OHA|KRU|HAL|HAM|HBS|QLB|HVL|NAU|HAS|EBN|GEO|HOH|HDH|ERK|HER|WAN|HEF|ROF|HBN|ALF|HSK|USI|NAI|REH|SAN|KÜN|ÖHR|HOL|WAR|ARN|BRG|GNT|HOG|WOH|KEH|MAI|PAR|RID|ROL|KLE|GEL|KUS|KYF|ART|SDH|LDK|DIL|MAL|VIB|LER|BNA|GHA|GRM|MTL|WUR|LEV|LIF|STE|WEL|LIP|VAI|LUP|HGN|LBZ|LWL|PCH|STB|DAN|MKK|SLÜ|MSP|TBB|MGH|MTK|BIN|MSH|EIL|HET|SGH|BID|MYK|MSE|MST|MÜR|WRN|MEI|GRH|RIE|MZG|MIL|OBB|BED|FLÖ|MOL|FRW|SEE|SRB|AIB|MOS|BCH|ILL|SOB|NMS|NEA|SEF|UFF|NEW|VOH|NDH|TDO|NWM|GDB|GVM|WIS|NOM|EIN|GAN|LAU|HEB|OHV|OSL|SFB|ERB|LOS|BSK|KEL|BSB|MEL|WTL|OAL|FÜS|MOD|OHZ|OPR|BÜR|PAF|PLÖ|CAS|GLA|REG|VIT|ECK|SIM|GOA|EMS|DIZ|GOH|RÜD|SWA|NES|KÖN|MET|LRO|BÜZ|DBR|ROS|TET|HRO|ROW|BRV|HIP|PAN|GRI|SHK|EIS|SRO|SOK|LBS|SCZ|MER|QFT|SLF|SLS|HOM|SLK|ASL|BBG|SBK|SFT|SHG|MGN|MEG|ZIG|SAD|NEN|OVI|SHA|BLB|SIG|SON|SPN|FOR|GUB|SPB|IGB|WND|STD|STA|SDL|OBG|HST|BOG|SHL|PIR|FTL|SEB|SÖM|SÜW|TIR|SAB|TUT|ANG|SDT|LÜN|LSZ|MHL|VEC|VER|VIE|OVL|ANK|OVP|SBG|UEM|UER|WLG|GMN|NVP|RDG|RÜG|DAU|FKB|WAF|WAK|SLZ|WEN|SOG|APD|WUG|GUN|ESW|WIZ|WES|DIN|BRA|BÜD|WHV|HWI|GHC|WTM|WOB|WUN|MAK|SEL|OCH|HOT|WDA)[- ]?(([A-Z][- ]?\d{1,4})|([A-Z]{2}[- ]?\d{1,3})))[- ]?(E|H)?$/.test(t)},"de-LI":function(t){return/^FL[- ]?\d{1,5}[UZ]?$/.test(t)},"fi-FI":function(t){return/^(?=.{4,7})(([A-Z]{1,3}|[0-9]{1,3})[\s-]?([A-Z]{1,3}|[0-9]{1,5}))$/.test(t)},"pt-PT":function(t){return/^([A-Z]{2}|[0-9]{2})[ -·]?([A-Z]{2}|[0-9]{2})[ -·]?([A-Z]{2}|[0-9]{2})$/.test(t)},"sq-AL":function(t){return/^[A-Z]{2}[- ]?((\d{3}[- ]?(([A-Z]{2})|T))|(R[- ]?\d{3}))$/.test(t)},"pt-BR":function(t){return/^[A-Z]{3}[ -]?[0-9][A-Z][0-9]{2}|[A-Z]{3}[ -]?[0-9]{4}$/.test(t)}};var Xe=/^[A-Z]$/,Je=/^[a-z]$/,je=/^[0-9]$/,Qe=/^[-#!$@%^&*()_+|~=`{}\[\]:";'<>?,.\/ ]$/,qe={minLength:8,minLowercase:1,minUppercase:1,minNumbers:1,minSymbols:1,returnScore:!1,pointsPerUnique:1,pointsPerRepeat:.5,pointsForContainingLower:10,pointsForContainingUpper:10,pointsForContainingNumber:10,pointsForContainingSymbol:10};function tr(t){var e,r,n=(e=t,r={},Array.from(e).forEach(function(t){r[t]?r[t]+=1:r[t]=1}),r),i={length:t.length,uniqueChars:Object.keys(n).length,uppercaseCount:0,lowercaseCount:0,numberCount:0,symbolCount:0};return Object.keys(n).forEach(function(t){Xe.test(t)?i.uppercaseCount+=n[t]:Je.test(t)?i.lowercaseCount+=n[t]:je.test(t)?i.numberCount+=n[t]:Qe.test(t)&&(i.symbolCount+=n[t])}),i}var er={GB:/^GB((\d{3} \d{4} ([0-8][0-9]|9[0-6]))|(\d{9} \d{3})|(((GD[0-4])|(HA[5-9]))[0-9]{2}))$/,IT:/^(IT)?[0-9]{11}$/,NL:/^(NL)?[0-9]{9}B[0-9]{2}$/};return{version:"13.7.0",toDate:a,toFloat:Z,toInt:function(t,e){return l(t),parseInt(t,e||10)},toBoolean:function(t,e){return l(t),e?"1"===t||/^true$/i.test(t):"0"!==t&&!/^false$/i.test(t)&&""!==t},equals:function(t,e){return l(t),t===e},contains:function(t,e,r){return l(t),(r=B(r,N)).ignoreCase?t.toLowerCase().split(M(e).toLowerCase()).length>r.minOccurrences:t.split(M(e)).length>r.minOccurrences},matches:function(t,e,r){return l(t),(e="[object RegExp]"!==Object.prototype.toString.call(e)?new RegExp(e,r):e).test(t)},isEmail:function(t,e){if(l(t),(e=B(e,b)).require_display_name||e.allow_display_name){var r=t.match(U);if(r){var n=r[1];if(t=t.replace(n,"").replace(/(^<|>$)/g,""),!function(t){var e=t.replace(/^"(.+)"$/,"$1");if(e.trim()){if(/[\.";<>]/.test(e)){if(e===t)return;if(!(e.split('"').length===e.split('\\"').length))return}return 1}}(n=n.endsWith(" ")?n.substr(0,n.length-1):n))return!1}else if(e.require_display_name)return!1}if(!e.ignore_max_length&&254<t.length)return!1;if(r=t.split("@"),n=r.pop(),t=n.toLowerCase(),e.host_blacklist.includes(t))return!1;if(r=r.join("@"),e.domain_specific_validation&&("gmail.com"===t||"googlemail.com"===t)){t=(r=r.toLowerCase()).split("+")[0];if(!F(t.replace(/\./g,""),{min:6,max:30}))return!1;for(var i=t.split("."),a=0;a<i.length;a++)if(!w.test(i[a]))return!1}if(!(!1!==e.ignore_max_length||F(r,{max:64})&&F(n,{max:254})))return!1;if(!C(n,{require_tld:e.require_tld})){if(!e.allow_ip_domain)return!1;if(!P(n)){if(!n.startsWith("[")||!n.endsWith("]"))return!1;n=n.substr(1,n.length-2);if(0===n.length||!P(n))return!1}}if('"'===r[0])return r=r.slice(1,r.length-1),(e.allow_utf8_local_part?Y:y).test(r);for(var o=e.allow_utf8_local_part?W:K,s=r.split("."),c=0;c<s.length;c++)if(!o.test(s[c]))return!1;return!e.blacklisted_chars||-1===r.search(new RegExp("[".concat(e.blacklisted_chars,"]+"),"g"))},isURL:function(t,e){if(l(t),!t||/[\s<>]/.test(t))return!1;if(0===t.indexOf("mailto:"))return!1;if((e=B(e,x)).validate_length&&2083<=t.length)return!1;if(!e.allow_fragments&&t.includes("#"))return!1;if(!e.allow_query_components&&(t.includes("?")||t.includes("&")))return!1;var r,n,i=t.split("#");if(1<(i=(t=(i=(t=i.shift()).split("?")).shift()).split("://")).length){if(r=i.shift().toLowerCase(),e.require_valid_protocol&&-1===e.protocols.indexOf(r))return!1}else{if(e.require_protocol)return!1;if("//"===t.substr(0,2)){if(!e.allow_protocol_relative_urls)return!1;i[0]=t.substr(2)}}if(""===(t=i.join("://")))return!1;if(""===(t=(i=t.split("/")).shift())&&!e.require_host)return!0;if(1<(i=t.split("@")).length){if(e.disallow_auth)return!1;if(""===i[0])return!1;if(0<=(c=i.shift()).indexOf(":")&&2<c.split(":").length)return!1;var a=u(c.split(":"),2),o=a[0],s=a[1];if(""===o&&""===s)return!1}var c=null,a=null;if((s=(o=i.join("@")).match(V))?(n="",a=s[1],c=s[2]||null):(n=(i=o.split(":")).shift(),i.length&&(c=i.join(":"))),null!==c&&0<c.length){if(i=parseInt(c,10),!/^[0-9]+$/.test(c)||i<=0||65535<i)return!1}else if(e.require_port)return!1;return e.host_whitelist?k(n,e.host_whitelist):!!(P(n)||C(n,e)||a&&P(a,6))&&(n=n||a,!e.host_blacklist||!k(n,e.host_blacklist))},isMACAddress:function(t,e){return l(t),e&&(e.no_colons||e.no_separators)?X.test(t):z.test(t)||J.test(t)},isIP:P,isIPRange:function(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:"";l(t);var r=t.split("/");if(2!==r.length)return!1;if(!j.test(r[1]))return!1;if(1<r[1].length&&r[1].startsWith("0"))return!1;if(!P(r[0],e))return!1;var n=null;switch(String(e)){case"4":n=32;break;case"6":n=128;break;default:n=P(r[0],"6")?128:32}return r[1]<=n&&0<=r[1]},isFQDN:C,isBoolean:function(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:tt;return l(t),e.loose?rt.includes(t.toLowerCase()):et.includes(t)},isIBAN:function(t){return l(t),(e=(r=(e=t).replace(/[\s\-]+/gi,"").toUpperCase()).slice(0,2).toUpperCase())in Ot&&Ot[e].test(r)&&1===((t=(t=t).replace(/[^A-Z0-9]+/gi,"").toUpperCase()).slice(4)+t.slice(0,4)).replace(/[A-Z]/g,function(t){return t.charCodeAt(0)-55}).match(/\d{1,7}/g).reduce(function(t,e){return Number(t+e)%97},"");var e,r},isBIC:function(t){return l(t),!!Pt.has(t.slice(4,6).toUpperCase())&&bt.test(t)},isAlpha:function(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:"en-US",r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};if(l(t),r=r.ignore)if(r instanceof RegExp)t=t.replace(r,"");else{if("string"!=typeof r)throw new Error("ignore should be instance of a String or RegExp");t=t.replace(new RegExp("[".concat(r.replace(/[-[\]{}()*+?.,\\^$|#\\s]/g,"\\$&"),"]"),"g"),"")}if(e in o)return o[e].test(t);throw new Error("Invalid locale '".concat(e,"'"))},isAlphaLocales:it,isAlphanumeric:function(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:"en-US",r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};if(l(t),r=r.ignore)if(r instanceof RegExp)t=t.replace(r,"");else{if("string"!=typeof r)throw new Error("ignore should be instance of a String or RegExp");t=t.replace(new RegExp("[".concat(r.replace(/[-[\]{}()*+?.,\\^$|#\\s]/g,"\\$&"),"]"),"g"),"")}if(e in s)return s[e].test(t);throw new Error("Invalid locale '".concat(e,"'"))},isAlphanumericLocales:at,isNumeric:function(t,e){return l(t),(e&&e.no_symbols?ot:new RegExp("^[+-]?([0-9]*[".concat((e||{}).locale?c[e.locale]:".","])?[0-9]+$"))).test(t)},isPassportNumber:function(t,e){return l(t),t=t.replace(/\s/g,"").toUpperCase(),e.toUpperCase()in st&&st[e].test(t)},isPort:function(t){return ut(t,{min:0,max:65535})},isLowercase:function(t){return l(t),t===t.toLowerCase()},isUppercase:function(t){return l(t),t===t.toUpperCase()},isAscii:function(t){return l(t),At.test(t)},isFullWidth:function(t){return l(t),$t.test(t)},isHalfWidth:function(t){return l(t),pt.test(t)},isVariableWidth:function(t){return l(t),$t.test(t)&&pt.test(t)},isMultibyte:function(t){return l(t),St.test(t)},isSemVer:function(t){return l(t),Et.test(t)},isSurrogatePair:function(t){return l(t),It.test(t)},isInt:ut,isIMEI:function(t,e){if(l(t),!((e=e||{}).allow_hyphens?ft:dt).test(t))return!1;t=t.replace(/-/g,"");for(var r=0,n=2,i=0;i<14;i++){var a=t.substring(14-i-1,14-i),a=parseInt(a,10)*n;r+=10<=a?a%10+1:a,1===n?n+=1:--n}return(10-r%10)%10===parseInt(t.substring(14,15),10)},isFloat:L,isFloatLocales:m,isDecimal:function(t,e){if(l(t),(e=B(e,Rt)).locale in c)return r=vt,n=t.replace(/ /g,""),!r.some(function(t){return n===t})&&(r=e,new RegExp("^[-+]?([0-9]+)?(\\".concat(c[r.locale],"[0-9]{").concat(r.decimal_digits,"})").concat(r.force_decimal?"":"?","$")).test(t));var r,n;throw new Error("Invalid locale '".concat(e.locale,"'"))},isHexadecimal:mt,isOctal:function(t){return l(t),Zt.test(t)},isDivisibleBy:function(t,e){return l(t),Z(t)%parseInt(e,10)==0},isHexColor:function(t){return l(t),Mt.test(t)},isRgbColor:function(t){var e=!(1<arguments.length&&void 0!==arguments[1])||arguments[1];return l(t),e?Bt.test(t)||Nt.test(t)||Ft.test(t)||Dt.test(t):Bt.test(t)||Nt.test(t)},isHSL:function(t){return l(t),(-1!==(t=t.replace(/\s+/g," ").replace(/\s?(hsla?\(|\)|,)\s?/gi,"$1")).indexOf(",")?Ct:Tt).test(t)},isISRC:function(t){return l(t),Gt.test(t)},isMD5:function(t){return l(t),Ut.test(t)},isHash:function(t,e){return l(t),new RegExp("^[a-fA-F0-9]{".concat(Kt[e],"}$")).test(t)},isJWT:function(t){l(t);var e=t.split(".");return!(3<(t=e.length)||t<2)&&e.reduce(function(t,e){return t&&Yt(e,{urlSafe:!0})},!0)},isJSON:function(t,e){l(t);try{e=B(e,xt);var r=[];e.allow_primitives&&(r=[null,!1,!0]);var n=JSON.parse(t);return r.includes(n)||!!n&&"object"===i(n)}catch(t){}return!1},isEmpty:function(t,e){return l(t),0===((e=B(e,Vt)).ignore_whitespace?t.trim():t).length},isLength:function(t,e){var r;l(t);var n="object"===i(e)?(r=e.min||0,e.max):(r=e||0,arguments[2]),e=t.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g)||[],e=t.length-e.length;return r<=e&&(void 0===n||e<=n)},isLocale:function(t){return l(t),"en_US_POSIX"===t||"ca_ES_VALENCIA"===t||nt.test(t)},isByteLength:F,isUUID:function(t,e){return l(t),!!(e=kt[[void 0,null].includes(e)?"all":e])&&e.test(t)},isMongoId:function(t){return l(t),mt(t)&&24===t.length},isAfter:function(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:String(new Date);return l(t),e=a(e),!!((t=a(t))&&e&&e<t)},isBefore:function(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:String(new Date);return l(t),e=a(e),!!((t=a(t))&&e&&t<e)},isIn:function(t,e){if(l(t),"[object Array]"!==Object.prototype.toString.call(e))return"object"===i(e)?e.hasOwnProperty(t):!(!e||"function"!=typeof e.indexOf)&&0<=e.indexOf(t);var r,n=[];for(r in e)!{}.hasOwnProperty.call(e,r)||(n[r]=M(e[r]));return 0<=n.indexOf(t)},isCreditCard:function(t){l(t);var e=t.replace(/[- ]+/g,"");if(!zt.test(e))return!1;for(var r,n,i=0,a=e.length-1;0<=a;a--)r=e.substring(a,a+1),r=parseInt(r,10),i+=n&&10<=(r*=2)?r%10+1:r,n=!n;return!(i%10!=0||!e)},isIdentityCard:function(t,e){if(l(t),e in Xt)return Xt[e](t);if("any"!==e)throw new Error("Invalid locale '".concat(e,"'"));for(var r in Xt)if(Xt.hasOwnProperty(r))if((0,Xt[r])(t))return!0;return!1},isEAN:function(t){l(t);var e=Number(t.slice(-1));return Qt.test(t)&&e===qt(t)},isISIN:function(t){if(l(t),!te.test(t))return!1;for(var e=!0,r=0,n=t.length-2;0<=n;n--)if("A"<=t[n]&&t[n]<="Z")for(var i=t[n].charCodeAt(0)-55,a=0,o=[i%10,Math.trunc(i/10)];a<o.length;a++){var s=o[a];r+=e?5<=s?1+2*(s-5):2*s:s,e=!e}else{i=t[n].charCodeAt(0)-"0".charCodeAt(0);r+=e?5<=i?1+2*(i-5):2*i:i,e=!e}var c=10*Math.trunc((r+9)/10)-r;return+t[t.length-1]==c},isISBN:function t(e){var r=1<arguments.length&&void 0!==arguments[1]?arguments[1]:"";if(l(e),!(r=String(r)))return t(e,10)||t(e,13);var n,i=e.replace(/[\s-]+/g,""),a=0;if("10"===r){if(!ee.test(i))return!1;for(n=0;n<9;n++)a+=(n+1)*i.charAt(n);if("X"===i.charAt(9)?a+=100:a+=10*i.charAt(9),a%11==0)return!!i}else if("13"===r){if(!re.test(i))return!1;for(n=0;n<12;n++)a+=ne[n%2]*i.charAt(n);if(i.charAt(12)-(10-a%10)%10==0)return!!i}return!1},isISSN:function(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};l(t);var r="^\\d{4}-?\\d{3}[\\dX]$",r=e.require_hyphen?r.replace("?",""):r;if(!(r=e.case_sensitive?new RegExp(r):new RegExp(r,"i")).test(t))return!1;for(var n=t.replace("-","").toUpperCase(),i=0,a=0;a<n.length;a++){var o=n[a];i+=("X"===o?10:+o)*(8-a)}return i%11==0},isMobilePhone:function(e,t,r){if(l(e),r&&r.strictMode&&!e.startsWith("+"))return!1;if(Array.isArray(t))return t.some(function(t){if(Ae.hasOwnProperty(t)&&Ae[t].test(e))return!0;return!1});if(t in Ae)return Ae[t].test(e);if(t&&"any"!==t)throw new Error("Invalid locale '".concat(t,"'"));for(var n in Ae)if(Ae.hasOwnProperty(n))if(Ae[n].test(e))return!0;return!1},isMobilePhoneLocales:T,isPostalCode:function(t,e){if(l(t),e in Pe)return Pe[e].test(t);if("any"!==e)throw new Error("Invalid locale '".concat(e,"'"));for(var r in Pe)if(Pe.hasOwnProperty(r))if(Pe[r].test(t))return!0;return!1},isPostalCodeLocales:_,isEthereumAddress:function(t){return l(t),$e.test(t)},isCurrency:function(t,e){return l(t),function(t){var r="\\d{".concat(t.digits_after_decimal[0],"}");t.digits_after_decimal.forEach(function(t,e){0!==e&&(r="".concat(r,"|\\d{").concat(t,"}"))});var e="(".concat(t.symbol.replace(/\W/,function(t){return"\\".concat(t)}),")").concat(t.require_symbol?"":"?"),n="[1-9]\\d{0,2}(\\".concat(t.thousands_separator,"\\d{3})*"),i="(".concat(["0","[1-9]\\d*",n].join("|"),")?"),n="(\\".concat(t.decimal_separator,"(").concat(r,"))").concat(t.require_decimal?"":"?"),n=i+(t.allow_decimal||t.require_decimal?n:"");return t.allow_negatives&&!t.parens_for_negatives&&(t.negative_sign_after_digits?n+="-?":t.negative_sign_before_digits&&(n="-?"+n)),t.allow_negative_sign_placeholder?n="( (?!\\-))?".concat(n):t.allow_space_after_symbol?n=" ?".concat(n):t.allow_space_after_digits&&(n+="( (?!$))?"),t.symbol_after_digits?n+=e:n=e+n,t.allow_negatives&&(t.parens_for_negatives?n="(\\(".concat(n,"\\)|").concat(n,")"):t.negative_sign_before_digits||t.negative_sign_after_digits||(n="-?"+n)),new RegExp("^(?!-? )(?=.*\\d)".concat(n,"$"))}(e=B(e,pe)).test(t)},isBtcAddress:function(t){return l(t),(t.startsWith("bc1")?Se:he).test(t)},isISO8601:function(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};l(t);var r=(e.strictSeparator?Ee:ge).test(t);return r&&e.strict?function(t){var e=t.match(/^(\d{4})-?(\d{3})([ T]{1}\.*|$)/);if(e){var r=Number(e[1]),n=Number(e[2]);return r%4==0&&r%100!=0||r%400==0?n<=366:n<=365}var i=t.match(/(\d{4})-?(\d{0,2})-?(\d*)/).map(Number),e=i[1],r=i[2],n=i[3],t=r&&"0".concat(r).slice(-2),i=n&&"0".concat(n).slice(-2),i=new Date("".concat(e,"-").concat(t||"01","-").concat(i||"01"));return!r||!n||i.getUTCFullYear()===e&&i.getUTCMonth()+1===r&&i.getUTCDate()===n}(t):r},isRFC3339:function(t){return l(t),Ie.test(t)},isISO31661Alpha2:function(t){return l(t),Ht.has(t.toUpperCase())},isISO31661Alpha3:function(t){return l(t),Re.has(t.toUpperCase())},isISO4217:function(t){return l(t),ve.has(t.toUpperCase())},isBase32:function(t){return l(t),!(t.length%8!=0||!Le.test(t))},isBase58:function(t){return l(t),!!me.test(t)},isBase64:Yt,isDataURI:function(t){l(t);var e=t.split(",");if(e.length<2)return!1;var r=e.shift().trim().split(";");if("data:"!==(t=r.shift()).substr(0,5))return!1;if(""!==(t=t.substr(5))&&!Ze.test(t))return!1;for(var n=0;n<r.length;n++)if((n!==r.length-1||"base64"!==r[n].toLowerCase())&&!Me.test(r[n]))return!1;for(var i=0;i<e.length;i++)if(!Be.test(e[i]))return!1;return!0},isMagnetURI:function(t){return l(t),Ne.test(t.trim())},isMimeType:function(t){return l(t),Fe.test(t)||De.test(t)||Ce.test(t)},isLatLong:function(t,e){return l(t),e=B(e,He),!!t.includes(",")&&(!((t=t.split(","))[0].startsWith("(")&&!t[1].endsWith(")")||t[1].endsWith(")")&&!t[0].startsWith("("))&&(e.checkDMS?Oe.test(t[0])&&_e.test(t[1]):Te.test(t[0])&&Ge.test(t[1])))},ltrim:be,rtrim:Ue,trim:function(t,e){return Ue(be(t,e),e)},escape:function(t){return l(t),t.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\//g,"&#x2F;").replace(/\\/g,"&#x5C;").replace(/`/g,"&#96;")},unescape:function(t){return l(t),t.replace(/&quot;/g,'"').replace(/&#x27;/g,"'").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&#x2F;/g,"/").replace(/&#x5C;/g,"\\").replace(/&#96;/g,"`").replace(/&amp;/g,"&")},stripLow:function(t,e){return l(t),Ke(t,e?"\\x00-\\x09\\x0B\\x0C\\x0E-\\x1F\\x7F":"\\x00-\\x1F\\x7F")},whitelist:function(t,e){return l(t),t.replace(new RegExp("[^".concat(e,"]+"),"g"),"")},blacklist:Ke,isWhitelisted:function(t,e){l(t);for(var r=t.length-1;0<=r;r--)if(-1===e.indexOf(t[r]))return!1;return!0},normalizeEmail:function(t,e){e=B(e,we);var r=t.split("@"),t=r.pop();if((r=[r.join("@"),t])[1]=r[1].toLowerCase(),"gmail.com"===r[1]||"googlemail.com"===r[1]){if(e.gmail_remove_subaddress&&(r[0]=r[0].split("+")[0]),e.gmail_remove_dots&&(r[0]=r[0].replace(/\.+/g,Ve)),!r[0].length)return!1;(e.all_lowercase||e.gmail_lowercase)&&(r[0]=r[0].toLowerCase()),r[1]=e.gmail_convert_googlemaildotcom?"gmail.com":r[1]}else if(0<=ye.indexOf(r[1])){if(e.icloud_remove_subaddress&&(r[0]=r[0].split("+")[0]),!r[0].length)return!1;(e.all_lowercase||e.icloud_lowercase)&&(r[0]=r[0].toLowerCase())}else if(0<=We.indexOf(r[1])){if(e.outlookdotcom_remove_subaddress&&(r[0]=r[0].split("+")[0]),!r[0].length)return!1;(e.all_lowercase||e.outlookdotcom_lowercase)&&(r[0]=r[0].toLowerCase())}else if(0<=Ye.indexOf(r[1])){if(e.yahoo_remove_subaddress&&(t=r[0].split("-"),r[0]=1<t.length?t.slice(0,-1).join("-"):t[0]),!r[0].length)return!1;(e.all_lowercase||e.yahoo_lowercase)&&(r[0]=r[0].toLowerCase())}else 0<=xe.indexOf(r[1])?((e.all_lowercase||e.yandex_lowercase)&&(r[0]=r[0].toLowerCase()),r[1]="yandex.ru"):e.all_lowercase&&(r[0]=r[0].toLowerCase());return r.join("@")},toString:toString,isSlug:function(t){return l(t),ke.test(t)},isStrongPassword:function(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;l(t);var r,n,i=tr(t);return(e=B(e||{},qe)).returnScore?(r=e,n=0,n+=(t=i).uniqueChars*r.pointsPerUnique,n+=(t.length-t.uniqueChars)*r.pointsPerRepeat,0<t.lowercaseCount&&(n+=r.pointsForContainingLower),0<t.uppercaseCount&&(n+=r.pointsForContainingUpper),0<t.numberCount&&(n+=r.pointsForContainingNumber),0<t.symbolCount&&(n+=r.pointsForContainingSymbol),n):i.length>=e.minLength&&i.lowercaseCount>=e.minLowercase&&i.uppercaseCount>=e.minUppercase&&i.numberCount>=e.minNumbers&&i.symbolCount>=e.minSymbols},isTaxID:function(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:"en-US";if(l(t),t=t.slice(0),e in le)return e in fe&&(t=t.replace(fe[e],"")),!!le[e].test(t)&&(!(e in ue)||ue[e](t));throw new Error("Invalid locale '".concat(e,"'"))},isDate:q,isLicensePlate:function(t,e){if(l(t),e in ze)return ze[e](t);if("any"!==e)throw new Error("Invalid locale '".concat(e,"'"));for(var r in ze)if((0,ze[r])(t))return!0;return!1},isVAT:function(t,e){if(l(t),l(e),e in er)return er[e].test(t);throw new Error("Invalid country code: '".concat(e,"'"))},ibanLocales:_t}});"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.commaDecimal = exports.dotDecimal = exports.farsiLocales = exports.arabicLocales = exports.englishLocales = exports.decimal = exports.alphanumeric = exports.alpha = void 0;
var alpha = {
  'en-US': /^[A-Z]+$/i,
  'az-AZ': /^[A-VXYZÇƏĞİıÖŞÜ]+$/i,
  'bg-BG': /^[А-Я]+$/i,
  'cs-CZ': /^[A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]+$/i,
  'da-DK': /^[A-ZÆØÅ]+$/i,
  'de-DE': /^[A-ZÄÖÜß]+$/i,
  'el-GR': /^[Α-ώ]+$/i,
  'es-ES': /^[A-ZÁÉÍÑÓÚÜ]+$/i,
  'fa-IR': /^[ابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی]+$/i,
  'fi-FI': /^[A-ZÅÄÖ]+$/i,
  'fr-FR': /^[A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i,
  'it-IT': /^[A-ZÀÉÈÌÎÓÒÙ]+$/i,
  'nb-NO': /^[A-ZÆØÅ]+$/i,
  'nl-NL': /^[A-ZÁÉËÏÓÖÜÚ]+$/i,
  'nn-NO': /^[A-ZÆØÅ]+$/i,
  'hu-HU': /^[A-ZÁÉÍÓÖŐÚÜŰ]+$/i,
  'pl-PL': /^[A-ZĄĆĘŚŁŃÓŻŹ]+$/i,
  'pt-PT': /^[A-ZÃÁÀÂÄÇÉÊËÍÏÕÓÔÖÚÜ]+$/i,
  'ru-RU': /^[А-ЯЁ]+$/i,
  'sl-SI': /^[A-ZČĆĐŠŽ]+$/i,
  'sk-SK': /^[A-ZÁČĎÉÍŇÓŠŤÚÝŽĹŔĽÄÔ]+$/i,
  'sr-RS@latin': /^[A-ZČĆŽŠĐ]+$/i,
  'sr-RS': /^[А-ЯЂЈЉЊЋЏ]+$/i,
  'sv-SE': /^[A-ZÅÄÖ]+$/i,
  'th-TH': /^[ก-๐\s]+$/i,
  'tr-TR': /^[A-ZÇĞİıÖŞÜ]+$/i,
  'uk-UA': /^[А-ЩЬЮЯЄIЇҐі]+$/i,
  'vi-VN': /^[A-ZÀÁẠẢÃÂẦẤẬẨẪĂẰẮẶẲẴĐÈÉẸẺẼÊỀẾỆỂỄÌÍỊỈĨÒÓỌỎÕÔỒỐỘỔỖƠỜỚỢỞỠÙÚỤỦŨƯỪỨỰỬỮỲÝỴỶỸ]+$/i,
  'ku-IQ': /^[ئابپتجچحخدرڕزژسشعغفڤقکگلڵمنوۆھەیێيطؤثآإأكضصةظذ]+$/i,
  ar: /^[ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]+$/,
  he: /^[א-ת]+$/,
  fa: /^['آاءأؤئبپتثجچحخدذرزژسشصضطظعغفقکگلمنوهةی']+$/i,
  'hi-IN': /^[\u0900-\u0961]+[\u0972-\u097F]*$/i
};
exports.alpha = alpha;
var alphanumeric = {
  'en-US': /^[0-9A-Z]+$/i,
  'az-AZ': /^[0-9A-VXYZÇƏĞİıÖŞÜ]+$/i,
  'bg-BG': /^[0-9А-Я]+$/i,
  'cs-CZ': /^[0-9A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]+$/i,
  'da-DK': /^[0-9A-ZÆØÅ]+$/i,
  'de-DE': /^[0-9A-ZÄÖÜß]+$/i,
  'el-GR': /^[0-9Α-ω]+$/i,
  'es-ES': /^[0-9A-ZÁÉÍÑÓÚÜ]+$/i,
  'fi-FI': /^[0-9A-ZÅÄÖ]+$/i,
  'fr-FR': /^[0-9A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i,
  'it-IT': /^[0-9A-ZÀÉÈÌÎÓÒÙ]+$/i,
  'hu-HU': /^[0-9A-ZÁÉÍÓÖŐÚÜŰ]+$/i,
  'nb-NO': /^[0-9A-ZÆØÅ]+$/i,
  'nl-NL': /^[0-9A-ZÁÉËÏÓÖÜÚ]+$/i,
  'nn-NO': /^[0-9A-ZÆØÅ]+$/i,
  'pl-PL': /^[0-9A-ZĄĆĘŚŁŃÓŻŹ]+$/i,
  'pt-PT': /^[0-9A-ZÃÁÀÂÄÇÉÊËÍÏÕÓÔÖÚÜ]+$/i,
  'ru-RU': /^[0-9А-ЯЁ]+$/i,
  'sl-SI': /^[0-9A-ZČĆĐŠŽ]+$/i,
  'sk-SK': /^[0-9A-ZÁČĎÉÍŇÓŠŤÚÝŽĹŔĽÄÔ]+$/i,
  'sr-RS@latin': /^[0-9A-ZČĆŽŠĐ]+$/i,
  'sr-RS': /^[0-9А-ЯЂЈЉЊЋЏ]+$/i,
  'sv-SE': /^[0-9A-ZÅÄÖ]+$/i,
  'th-TH': /^[ก-๙\s]+$/i,
  'tr-TR': /^[0-9A-ZÇĞİıÖŞÜ]+$/i,
  'uk-UA': /^[0-9А-ЩЬЮЯЄIЇҐі]+$/i,
  'ku-IQ': /^[٠١٢٣٤٥٦٧٨٩0-9ئابپتجچحخدرڕزژسشعغفڤقکگلڵمنوۆھەیێيطؤثآإأكضصةظذ]+$/i,
  'vi-VN': /^[0-9A-ZÀÁẠẢÃÂẦẤẬẨẪĂẰẮẶẲẴĐÈÉẸẺẼÊỀẾỆỂỄÌÍỊỈĨÒÓỌỎÕÔỒỐỘỔỖƠỜỚỢỞỠÙÚỤỦŨƯỪỨỰỬỮỲÝỴỶỸ]+$/i,
  ar: /^[٠١٢٣٤٥٦٧٨٩0-9ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]+$/,
  he: /^[0-9א-ת]+$/,
  fa: /^['0-9آاءأؤئبپتثجچحخدذرزژسشصضطظعغفقکگلمنوهةی۱۲۳۴۵۶۷۸۹۰']+$/i,
  'hi-IN': /^[\u0900-\u0963]+[\u0966-\u097F]*$/i
};
exports.alphanumeric = alphanumeric;
var decimal = {
  'en-US': '.',
  ar: '٫'
};
exports.decimal = decimal;
var englishLocales = ['AU', 'GB', 'HK', 'IN', 'NZ', 'ZA', 'ZM'];
exports.englishLocales = englishLocales;

for (var locale, i = 0; i < englishLocales.length; i++) {
  locale = "en-".concat(englishLocales[i]);
  alpha[locale] = alpha['en-US'];
  alphanumeric[locale] = alphanumeric['en-US'];
  decimal[locale] = decimal['en-US'];
} // Source: http://www.localeplanet.com/java/


var arabicLocales = ['AE', 'BH', 'DZ', 'EG', 'IQ', 'JO', 'KW', 'LB', 'LY', 'MA', 'QM', 'QA', 'SA', 'SD', 'SY', 'TN', 'YE'];
exports.arabicLocales = arabicLocales;

for (var _locale, _i = 0; _i < arabicLocales.length; _i++) {
  _locale = "ar-".concat(arabicLocales[_i]);
  alpha[_locale] = alpha.ar;
  alphanumeric[_locale] = alphanumeric.ar;
  decimal[_locale] = decimal.ar;
}

var farsiLocales = ['IR', 'AF'];
exports.farsiLocales = farsiLocales;

for (var _locale2, _i2 = 0; _i2 < farsiLocales.length; _i2++) {
  _locale2 = "fa-".concat(farsiLocales[_i2]);
  alphanumeric[_locale2] = alphanumeric.fa;
  decimal[_locale2] = decimal.ar;
} // Source: https://en.wikipedia.org/wiki/Decimal_mark


var dotDecimal = ['ar-EG', 'ar-LB', 'ar-LY'];
exports.dotDecimal = dotDecimal;
var commaDecimal = ['bg-BG', 'cs-CZ', 'da-DK', 'de-DE', 'el-GR', 'en-ZM', 'es-ES', 'fr-CA', 'fr-FR', 'id-ID', 'it-IT', 'ku-IQ', 'hi-IN', 'hu-HU', 'nb-NO', 'nn-NO', 'nl-NL', 'pl-PL', 'pt-PT', 'ru-RU', 'sl-SI', 'sr-RS@latin', 'sr-RS', 'sv-SE', 'tr-TR', 'uk-UA', 'vi-VN'];
exports.commaDecimal = commaDecimal;

for (var _i3 = 0; _i3 < dotDecimal.length; _i3++) {
  decimal[dotDecimal[_i3]] = decimal['en-US'];
}

for (var _i4 = 0; _i4 < commaDecimal.length; _i4++) {
  decimal[commaDecimal[_i4]] = ',';
}

alpha['fr-CA'] = alpha['fr-FR'];
alphanumeric['fr-CA'] = alphanumeric['fr-FR'];
alpha['pt-BR'] = alpha['pt-PT'];
alphanumeric['pt-BR'] = alphanumeric['pt-PT'];
decimal['pt-BR'] = decimal['pt-PT']; // see #862

alpha['pl-Pl'] = alpha['pl-PL'];
alphanumeric['pl-Pl'] = alphanumeric['pl-PL'];
decimal['pl-Pl'] = decimal['pl-PL']; // see #1455

alpha['fa-AF'] = alpha.fa;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = blacklist;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function blacklist(str, chars) {
  (0, _assertString.default)(str);
  return str.replace(new RegExp("[".concat(chars, "]+"), 'g'), '');
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = contains;

var _assertString = _interopRequireDefault(require("./util/assertString"));

var _toString = _interopRequireDefault(require("./util/toString"));

var _merge = _interopRequireDefault(require("./util/merge"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var defaulContainsOptions = {
  ignoreCase: false,
  minOccurrences: 1
};

function contains(str, elem, options) {
  (0, _assertString.default)(str);
  options = (0, _merge.default)(options, defaulContainsOptions);

  if (options.ignoreCase) {
    return str.toLowerCase().split((0, _toString.default)(elem).toLowerCase()).length > options.minOccurrences;
  }

  return str.split((0, _toString.default)(elem)).length > options.minOccurrences;
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = equals;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function equals(str, comparison) {
  (0, _assertString.default)(str);
  return str === comparison;
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = escape;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function escape(str) {
  (0, _assertString.default)(str);
  return str.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/'/g, '&#x27;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\//g, '&#x2F;').replace(/\\/g, '&#x5C;').replace(/`/g, '&#96;');
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isAfter;

var _assertString = _interopRequireDefault(require("./util/assertString"));

var _toDate = _interopRequireDefault(require("./toDate"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function isAfter(str) {
  var date = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : String(new Date());
  (0, _assertString.default)(str);
  var comparison = (0, _toDate.default)(date);
  var original = (0, _toDate.default)(str);
  return !!(original && comparison && original > comparison);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isAlpha;
exports.locales = void 0;

var _assertString = _interopRequireDefault(require("./util/assertString"));

var _alpha = require("./alpha");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function isAlpha(_str) {
  var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en-US';
  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  (0, _assertString.default)(_str);
  var str = _str;
  var ignore = options.ignore;

  if (ignore) {
    if (ignore instanceof RegExp) {
      str = str.replace(ignore, '');
    } else if (typeof ignore === 'string') {
      str = str.replace(new RegExp("[".concat(ignore.replace(/[-[\]{}()*+?.,\\^$|#\\s]/g, '\\$&'), "]"), 'g'), ''); // escape regex for ignore
    } else {
      throw new Error('ignore should be instance of a String or RegExp');
    }
  }

  if (locale in _alpha.alpha) {
    return _alpha.alpha[locale].test(str);
  }

  throw new Error("Invalid locale '".concat(locale, "'"));
}

var locales = Object.keys(_alpha.alpha);
exports.locales = locales;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isAlphanumeric;
exports.locales = void 0;

var _assertString = _interopRequireDefault(require("./util/assertString"));

var _alpha = require("./alpha");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function isAlphanumeric(_str) {
  var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en-US';
  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  (0, _assertString.default)(_str);
  var str = _str;
  var ignore = options.ignore;

  if (ignore) {
    if (ignore instanceof RegExp) {
      str = str.replace(ignore, '');
    } else if (typeof ignore === 'string') {
      str = str.replace(new RegExp("[".concat(ignore.replace(/[-[\]{}()*+?.,\\^$|#\\s]/g, '\\$&'), "]"), 'g'), ''); // escape regex for ignore
    } else {
      throw new Error('ignore should be instance of a String or RegExp');
    }
  }

  if (locale in _alpha.alphanumeric) {
    return _alpha.alphanumeric[locale].test(str);
  }

  throw new Error("Invalid locale '".concat(locale, "'"));
}

var locales = Object.keys(_alpha.alphanumeric);
exports.locales = locales;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isAscii;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/* eslint-disable no-control-regex */
var ascii = /^[\x00-\x7F]+$/;
/* eslint-enable no-control-regex */

function isAscii(str) {
  (0, _assertString.default)(str);
  return ascii.test(str);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isBIC;

var _assertString = _interopRequireDefault(require("./util/assertString"));

var _isISO31661Alpha = require("./isISO31661Alpha2");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// https://en.wikipedia.org/wiki/ISO_9362
var isBICReg = /^[A-Za-z]{6}[A-Za-z0-9]{2}([A-Za-z0-9]{3})?$/;

function isBIC(str) {
  (0, _assertString.default)(str); // toUpperCase() should be removed when a new major version goes out that changes
  // the regex to [A-Z] (per the spec).

  if (!_isISO31661Alpha.CountryCodes.has(str.slice(4, 6).toUpperCase())) {
    return false;
  }

  return isBICReg.test(str);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isBase32;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var base32 = /^[A-Z2-7]+=*$/;

function isBase32(str) {
  (0, _assertString.default)(str);
  var len = str.length;

  if (len % 8 === 0 && base32.test(str)) {
    return true;
  }

  return false;
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isBase58;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// Accepted chars - 123456789ABCDEFGH JKLMN PQRSTUVWXYZabcdefghijk mnopqrstuvwxyz
var base58Reg = /^[A-HJ-NP-Za-km-z1-9]*$/;

function isBase58(str) {
  (0, _assertString.default)(str);

  if (base58Reg.test(str)) {
    return true;
  }

  return false;
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isBase64;

var _assertString = _interopRequireDefault(require("./util/assertString"));

var _merge = _interopRequireDefault(require("./util/merge"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var notBase64 = /[^A-Z0-9+\/=]/i;
var urlSafeBase64 = /^[A-Z0-9_\-]*$/i;
var defaultBase64Options = {
  urlSafe: false
};

function isBase64(str, options) {
  (0, _assertString.default)(str);
  options = (0, _merge.default)(options, defaultBase64Options);
  var len = str.length;

  if (options.urlSafe) {
    return urlSafeBase64.test(str);
  }

  if (len % 4 !== 0 || notBase64.test(str)) {
    return false;
  }

  var firstPaddingChar = str.indexOf('=');
  return firstPaddingChar === -1 || firstPaddingChar === len - 1 || firstPaddingChar === len - 2 && str[len - 1] === '=';
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isBefore;

var _assertString = _interopRequireDefault(require("./util/assertString"));

var _toDate = _interopRequireDefault(require("./toDate"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function isBefore(str) {
  var date = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : String(new Date());
  (0, _assertString.default)(str);
  var comparison = (0, _toDate.default)(date);
  var original = (0, _toDate.default)(str);
  return !!(original && comparison && original < comparison);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isBoolean;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var defaultOptions = {
  loose: false
};
var strictBooleans = ['true', 'false', '1', '0'];
var looseBooleans = [].concat(strictBooleans, ['yes', 'no']);

function isBoolean(str) {
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultOptions;
  (0, _assertString.default)(str);

  if (options.loose) {
    return looseBooleans.includes(str.toLowerCase());
  }

  return strictBooleans.includes(str);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isBtcAddress;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// supports Bech32 addresses
var bech32 = /^(bc1)[a-z0-9]{25,39}$/;
var base58 = /^(1|3)[A-HJ-NP-Za-km-z1-9]{25,39}$/;

function isBtcAddress(str) {
  (0, _assertString.default)(str); // check for bech32

  if (str.startsWith('bc1')) {
    return bech32.test(str);
  }

  return base58.test(str);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isByteLength;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

/* eslint-disable prefer-rest-params */
function isByteLength(str, options) {
  (0, _assertString.default)(str);
  var min;
  var max;

  if (_typeof(options) === 'object') {
    min = options.min || 0;
    max = options.max;
  } else {
    // backwards compatibility: isByteLength(str, min [, max])
    min = arguments[1];
    max = arguments[2];
  }

  var len = encodeURI(str).split(/%..|./).length - 1;
  return len >= min && (typeof max === 'undefined' || len <= max);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isCreditCard;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/* eslint-disable max-len */
var creditCard = /^(?:4[0-9]{12}(?:[0-9]{3,6})?|5[1-5][0-9]{14}|(222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12,15}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11}|6[27][0-9]{14}|^(81[0-9]{14,17}))$/;
/* eslint-enable max-len */

function isCreditCard(str) {
  (0, _assertString.default)(str);
  var sanitized = str.replace(/[- ]+/g, '');

  if (!creditCard.test(sanitized)) {
    return false;
  }

  var sum = 0;
  var digit;
  var tmpNum;
  var shouldDouble;

  for (var i = sanitized.length - 1; i >= 0; i--) {
    digit = sanitized.substring(i, i + 1);
    tmpNum = parseInt(digit, 10);

    if (shouldDouble) {
      tmpNum *= 2;

      if (tmpNum >= 10) {
        sum += tmpNum % 10 + 1;
      } else {
        sum += tmpNum;
      }
    } else {
      sum += tmpNum;
    }

    shouldDouble = !shouldDouble;
  }

  return !!(sum % 10 === 0 ? sanitized : false);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isCurrency;

var _merge = _interopRequireDefault(require("./util/merge"));

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function currencyRegex(options) {
  var decimal_digits = "\\d{".concat(options.digits_after_decimal[0], "}");
  options.digits_after_decimal.forEach(function (digit, index) {
    if (index !== 0) decimal_digits = "".concat(decimal_digits, "|\\d{").concat(digit, "}");
  });
  var symbol = "(".concat(options.symbol.replace(/\W/, function (m) {
    return "\\".concat(m);
  }), ")").concat(options.require_symbol ? '' : '?'),
      negative = '-?',
      whole_dollar_amount_without_sep = '[1-9]\\d*',
      whole_dollar_amount_with_sep = "[1-9]\\d{0,2}(\\".concat(options.thousands_separator, "\\d{3})*"),
      valid_whole_dollar_amounts = ['0', whole_dollar_amount_without_sep, whole_dollar_amount_with_sep],
      whole_dollar_amount = "(".concat(valid_whole_dollar_amounts.join('|'), ")?"),
      decimal_amount = "(\\".concat(options.decimal_separator, "(").concat(decimal_digits, "))").concat(options.require_decimal ? '' : '?');
  var pattern = whole_dollar_amount + (options.allow_decimal || options.require_decimal ? decimal_amount : ''); // default is negative sign before symbol, but there are two other options (besides parens)

  if (options.allow_negatives && !options.parens_for_negatives) {
    if (options.negative_sign_after_digits) {
      pattern += negative;
    } else if (options.negative_sign_before_digits) {
      pattern = negative + pattern;
    }
  } // South African Rand, for example, uses R 123 (space) and R-123 (no space)


  if (options.allow_negative_sign_placeholder) {
    pattern = "( (?!\\-))?".concat(pattern);
  } else if (options.allow_space_after_symbol) {
    pattern = " ?".concat(pattern);
  } else if (options.allow_space_after_digits) {
    pattern += '( (?!$))?';
  }

  if (options.symbol_after_digits) {
    pattern += symbol;
  } else {
    pattern = symbol + pattern;
  }

  if (options.allow_negatives) {
    if (options.parens_for_negatives) {
      pattern = "(\\(".concat(pattern, "\\)|").concat(pattern, ")");
    } else if (!(options.negative_sign_before_digits || options.negative_sign_after_digits)) {
      pattern = negative + pattern;
    }
  } // ensure there's a dollar and/or decimal amount, and that
  // it doesn't start with a space or a negative sign followed by a space


  return new RegExp("^(?!-? )(?=.*\\d)".concat(pattern, "$"));
}

var default_currency_options = {
  symbol: '$',
  require_symbol: false,
  allow_space_after_symbol: false,
  symbol_after_digits: false,
  allow_negatives: true,
  parens_for_negatives: false,
  negative_sign_before_digits: false,
  negative_sign_after_digits: false,
  allow_negative_sign_placeholder: false,
  thousands_separator: ',',
  decimal_separator: '.',
  allow_decimal: true,
  require_decimal: false,
  digits_after_decimal: [2],
  allow_space_after_digits: false
};

function isCurrency(str, options) {
  (0, _assertString.default)(str);
  options = (0, _merge.default)(options, default_currency_options);
  return currencyRegex(options).test(str);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isDataURI;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var validMediaType = /^[a-z]+\/[a-z0-9\-\+]+$/i;
var validAttribute = /^[a-z\-]+=[a-z0-9\-]+$/i;
var validData = /^[a-z0-9!\$&'\(\)\*\+,;=\-\._~:@\/\?%\s]*$/i;

function isDataURI(str) {
  (0, _assertString.default)(str);
  var data = str.split(',');

  if (data.length < 2) {
    return false;
  }

  var attributes = data.shift().trim().split(';');
  var schemeAndMediaType = attributes.shift();

  if (schemeAndMediaType.substr(0, 5) !== 'data:') {
    return false;
  }

  var mediaType = schemeAndMediaType.substr(5);

  if (mediaType !== '' && !validMediaType.test(mediaType)) {
    return false;
  }

  for (var i = 0; i < attributes.length; i++) {
    if (!(i === attributes.length - 1 && attributes[i].toLowerCase() === 'base64') && !validAttribute.test(attributes[i])) {
      return false;
    }
  }

  for (var _i = 0; _i < data.length; _i++) {
    if (!validData.test(data[_i])) {
      return false;
    }
  }

  return true;
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isDate;

var _merge = _interopRequireDefault(require("./util/merge"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }

function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }

function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }

function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }

var default_date_options = {
  format: 'YYYY/MM/DD',
  delimiters: ['/', '-'],
  strictMode: false
};

function isValidFormat(format) {
  return /(^(y{4}|y{2})[.\/-](m{1,2})[.\/-](d{1,2})$)|(^(m{1,2})[.\/-](d{1,2})[.\/-]((y{4}|y{2})$))|(^(d{1,2})[.\/-](m{1,2})[.\/-]((y{4}|y{2})$))/gi.test(format);
}

function zip(date, format) {
  var zippedArr = [],
      len = Math.min(date.length, format.length);

  for (var i = 0; i < len; i++) {
    zippedArr.push([date[i], format[i]]);
  }

  return zippedArr;
}

function isDate(input, options) {
  if (typeof options === 'string') {
    // Allow backward compatbility for old format isDate(input [, format])
    options = (0, _merge.default)({
      format: options
    }, default_date_options);
  } else {
    options = (0, _merge.default)(options, default_date_options);
  }

  if (typeof input === 'string' && isValidFormat(options.format)) {
    var formatDelimiter = options.delimiters.find(function (delimiter) {
      return options.format.indexOf(delimiter) !== -1;
    });
    var dateDelimiter = options.strictMode ? formatDelimiter : options.delimiters.find(function (delimiter) {
      return input.indexOf(delimiter) !== -1;
    });
    var dateAndFormat = zip(input.split(dateDelimiter), options.format.toLowerCase().split(formatDelimiter));
    var dateObj = {};

    var _iterator = _createForOfIteratorHelper(dateAndFormat),
        _step;

    try {
      for (_iterator.s(); !(_step = _iterator.n()).done;) {
        var _step$value = _slicedToArray(_step.value, 2),
            dateWord = _step$value[0],
            formatWord = _step$value[1];

        if (dateWord.length !== formatWord.length) {
          return false;
        }

        dateObj[formatWord.charAt(0)] = dateWord;
      }
    } catch (err) {
      _iterator.e(err);
    } finally {
      _iterator.f();
    }

    return new Date("".concat(dateObj.m, "/").concat(dateObj.d, "/").concat(dateObj.y)).getDate() === +dateObj.d;
  }

  if (!options.strictMode) {
    return Object.prototype.toString.call(input) === '[object Date]' && isFinite(input);
  }

  return false;
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isDecimal;

var _merge = _interopRequireDefault(require("./util/merge"));

var _assertString = _interopRequireDefault(require("./util/assertString"));

var _includes = _interopRequireDefault(require("./util/includes"));

var _alpha = require("./alpha");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function decimalRegExp(options) {
  var regExp = new RegExp("^[-+]?([0-9]+)?(\\".concat(_alpha.decimal[options.locale], "[0-9]{").concat(options.decimal_digits, "})").concat(options.force_decimal ? '' : '?', "$"));
  return regExp;
}

var default_decimal_options = {
  force_decimal: false,
  decimal_digits: '1,',
  locale: 'en-US'
};
var blacklist = ['', '-', '+'];

function isDecimal(str, options) {
  (0, _assertString.default)(str);
  options = (0, _merge.default)(options, default_decimal_options);

  if (options.locale in _alpha.decimal) {
    return !(0, _includes.default)(blacklist, str.replace(/ /g, '')) && decimalRegExp(options).test(str);
  }

  throw new Error("Invalid locale '".concat(options.locale, "'"));
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isDivisibleBy;

var _assertString = _interopRequireDefault(require("./util/assertString"));

var _toFloat = _interopRequireDefault(require("./toFloat"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function isDivisibleBy(str, num) {
  (0, _assertString.default)(str);
  return (0, _toFloat.default)(str) % parseInt(num, 10) === 0;
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isEAN;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/**
 * The most commonly used EAN standard is
 * the thirteen-digit EAN-13, while the
 * less commonly used 8-digit EAN-8 barcode was
 * introduced for use on small packages.
 * Also EAN/UCC-14 is used for Grouping of individual
 * trade items above unit level(Intermediate, Carton or Pallet).
 * For more info about EAN-14 checkout: https://www.gtin.info/itf-14-barcodes/
 * EAN consists of:
 * GS1 prefix, manufacturer code, product code and check digit
 * Reference: https://en.wikipedia.org/wiki/International_Article_Number
 * Reference: https://www.gtin.info/
 */

/**
 * Define EAN Lenghts; 8 for EAN-8; 13 for EAN-13; 14 for EAN-14
 * and Regular Expression for valid EANs (EAN-8, EAN-13, EAN-14),
 * with exact numberic matching of 8 or 13 or 14 digits [0-9]
 */
var LENGTH_EAN_8 = 8;
var LENGTH_EAN_14 = 14;
var validEanRegex = /^(\d{8}|\d{13}|\d{14})$/;
/**
 * Get position weight given:
 * EAN length and digit index/position
 *
 * @param {number} length
 * @param {number} index
 * @return {number}
 */

function getPositionWeightThroughLengthAndIndex(length, index) {
  if (length === LENGTH_EAN_8 || length === LENGTH_EAN_14) {
    return index % 2 === 0 ? 3 : 1;
  }

  return index % 2 === 0 ? 1 : 3;
}
/**
 * Calculate EAN Check Digit
 * Reference: https://en.wikipedia.org/wiki/International_Article_Number#Calculation_of_checksum_digit
 *
 * @param {string} ean
 * @return {number}
 */


function calculateCheckDigit(ean) {
  var checksum = ean.slice(0, -1).split('').map(function (char, index) {
    return Number(char) * getPositionWeightThroughLengthAndIndex(ean.length, index);
  }).reduce(function (acc, partialSum) {
    return acc + partialSum;
  }, 0);
  var remainder = 10 - checksum % 10;
  return remainder < 10 ? remainder : 0;
}
/**
 * Check if string is valid EAN:
 * Matches EAN-8/EAN-13/EAN-14 regex
 * Has valid check digit.
 *
 * @param {string} str
 * @return {boolean}
 */


function isEAN(str) {
  (0, _assertString.default)(str);
  var actualCheckDigit = Number(str.slice(-1));
  return validEanRegex.test(str) && actualCheckDigit === calculateCheckDigit(str);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isEmail;

var _assertString = _interopRequireDefault(require("./util/assertString"));

var _merge = _interopRequireDefault(require("./util/merge"));

var _isByteLength = _interopRequireDefault(require("./isByteLength"));

var _isFQDN = _interopRequireDefault(require("./isFQDN"));

var _isIP = _interopRequireDefault(require("./isIP"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var default_email_options = {
  allow_display_name: false,
  require_display_name: false,
  allow_utf8_local_part: true,
  require_tld: true,
  blacklisted_chars: '',
  ignore_max_length: false,
  host_blacklist: []
};
/* eslint-disable max-len */

/* eslint-disable no-control-regex */

var splitNameAddress = /^([^\x00-\x1F\x7F-\x9F\cX]+)</i;
var emailUserPart = /^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~]+$/i;
var gmailUserPart = /^[a-z\d]+$/;
var quotedEmailUser = /^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f]))*$/i;
var emailUserUtf8Part = /^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+$/i;
var quotedEmailUserUtf8 = /^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))*$/i;
var defaultMaxEmailLength = 254;
/* eslint-enable max-len */

/* eslint-enable no-control-regex */

/**
 * Validate display name according to the RFC2822: https://tools.ietf.org/html/rfc2822#appendix-A.1.2
 * @param {String} display_name
 */

function validateDisplayName(display_name) {
  var display_name_without_quotes = display_name.replace(/^"(.+)"$/, '$1'); // display name with only spaces is not valid

  if (!display_name_without_quotes.trim()) {
    return false;
  } // check whether display name contains illegal character


  var contains_illegal = /[\.";<>]/.test(display_name_without_quotes);

  if (contains_illegal) {
    // if contains illegal characters,
    // must to be enclosed in double-quotes, otherwise it's not a valid display name
    if (display_name_without_quotes === display_name) {
      return false;
    } // the quotes in display name must start with character symbol \


    var all_start_with_back_slash = display_name_without_quotes.split('"').length === display_name_without_quotes.split('\\"').length;

    if (!all_start_with_back_slash) {
      return false;
    }
  }

  return true;
}

function isEmail(str, options) {
  (0, _assertString.default)(str);
  options = (0, _merge.default)(options, default_email_options);

  if (options.require_display_name || options.allow_display_name) {
    var display_email = str.match(splitNameAddress);

    if (display_email) {
      var display_name = display_email[1]; // Remove display name and angle brackets to get email address
      // Can be done in the regex but will introduce a ReDOS (See  #1597 for more info)

      str = str.replace(display_name, '').replace(/(^<|>$)/g, ''); // sometimes need to trim the last space to get the display name
      // because there may be a space between display name and email address
      // eg. myname <address@gmail.com>
      // the display name is `myname` instead of `myname `, so need to trim the last space

      if (display_name.endsWith(' ')) {
        display_name = display_name.substr(0, display_name.length - 1);
      }

      if (!validateDisplayName(display_name)) {
        return false;
      }
    } else if (options.require_display_name) {
      return false;
    }
  }

  if (!options.ignore_max_length && str.length > defaultMaxEmailLength) {
    return false;
  }

  var parts = str.split('@');
  var domain = parts.pop();
  var lower_domain = domain.toLowerCase();

  if (options.host_blacklist.includes(lower_domain)) {
    return false;
  }

  var user = parts.join('@');

  if (options.domain_specific_validation && (lower_domain === 'gmail.com' || lower_domain === 'googlemail.com')) {
    /*
      Previously we removed dots for gmail addresses before validating.
      This was removed because it allows `multiple..dots@gmail.com`
      to be reported as valid, but it is not.
      Gmail only normalizes single dots, removing them from here is pointless,
      should be done in normalizeEmail
    */
    user = user.toLowerCase(); // Removing sub-address from username before gmail validation

    var username = user.split('+')[0]; // Dots are not included in gmail length restriction

    if (!(0, _isByteLength.default)(username.replace(/\./g, ''), {
      min: 6,
      max: 30
    })) {
      return false;
    }

    var _user_parts = username.split('.');

    for (var i = 0; i < _user_parts.length; i++) {
      if (!gmailUserPart.test(_user_parts[i])) {
        return false;
      }
    }
  }

  if (options.ignore_max_length === false && (!(0, _isByteLength.default)(user, {
    max: 64
  }) || !(0, _isByteLength.default)(domain, {
    max: 254
  }))) {
    return false;
  }

  if (!(0, _isFQDN.default)(domain, {
    require_tld: options.require_tld
  })) {
    if (!options.allow_ip_domain) {
      return false;
    }

    if (!(0, _isIP.default)(domain)) {
      if (!domain.startsWith('[') || !domain.endsWith(']')) {
        return false;
      }

      var noBracketdomain = domain.substr(1, domain.length - 2);

      if (noBracketdomain.length === 0 || !(0, _isIP.default)(noBracketdomain)) {
        return false;
      }
    }
  }

  if (user[0] === '"') {
    user = user.slice(1, user.length - 1);
    return options.allow_utf8_local_part ? quotedEmailUserUtf8.test(user) : quotedEmailUser.test(user);
  }

  var pattern = options.allow_utf8_local_part ? emailUserUtf8Part : emailUserPart;
  var user_parts = user.split('.');

  for (var _i = 0; _i < user_parts.length; _i++) {
    if (!pattern.test(user_parts[_i])) {
      return false;
    }
  }

  if (options.blacklisted_chars) {
    if (user.search(new RegExp("[".concat(options.blacklisted_chars, "]+"), 'g')) !== -1) return false;
  }

  return true;
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isEmpty;

var _assertString = _interopRequireDefault(require("./util/assertString"));

var _merge = _interopRequireDefault(require("./util/merge"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var default_is_empty_options = {
  ignore_whitespace: false
};

function isEmpty(str, options) {
  (0, _assertString.default)(str);
  options = (0, _merge.default)(options, default_is_empty_options);
  return (options.ignore_whitespace ? str.trim().length : str.length) === 0;
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isEthereumAddress;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var eth = /^(0x)[0-9a-f]{40}$/i;

function isEthereumAddress(str) {
  (0, _assertString.default)(str);
  return eth.test(str);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isFQDN;

var _assertString = _interopRequireDefault(require("./util/assertString"));

var _merge = _interopRequireDefault(require("./util/merge"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var default_fqdn_options = {
  require_tld: true,
  allow_underscores: false,
  allow_trailing_dot: false,
  allow_numeric_tld: false,
  allow_wildcard: false
};

function isFQDN(str, options) {
  (0, _assertString.default)(str);
  options = (0, _merge.default)(options, default_fqdn_options);
  /* Remove the optional trailing dot before checking validity */

  if (options.allow_trailing_dot && str[str.length - 1] === '.') {
    str = str.substring(0, str.length - 1);
  }
  /* Remove the optional wildcard before checking validity */


  if (options.allow_wildcard === true && str.indexOf('*.') === 0) {
    str = str.substring(2);
  }

  var parts = str.split('.');
  var tld = parts[parts.length - 1];

  if (options.require_tld) {
    // disallow fqdns without tld
    if (parts.length < 2) {
      return false;
    }

    if (!/^([a-z\u00A1-\u00A8\u00AA-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]{2,}|xn[a-z0-9-]{2,})$/i.test(tld)) {
      return false;
    } // disallow spaces


    if (/\s/.test(tld)) {
      return false;
    }
  } // reject numeric TLDs


  if (!options.allow_numeric_tld && /^\d+$/.test(tld)) {
    return false;
  }

  return parts.every(function (part) {
    if (part.length > 63) {
      return false;
    }

    if (!/^[a-z_\u00a1-\uffff0-9-]+$/i.test(part)) {
      return false;
    } // disallow full-width chars


    if (/[\uff01-\uff5e]/.test(part)) {
      return false;
    } // disallow parts starting or ending with hyphen


    if (/^-|-$/.test(part)) {
      return false;
    }

    if (!options.allow_underscores && /_/.test(part)) {
      return false;
    }

    return true;
  });
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isFloat;
exports.locales = void 0;

var _assertString = _interopRequireDefault(require("./util/assertString"));

var _alpha = require("./alpha");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function isFloat(str, options) {
  (0, _assertString.default)(str);
  options = options || {};
  var float = new RegExp("^(?:[-+])?(?:[0-9]+)?(?:\\".concat(options.locale ? _alpha.decimal[options.locale] : '.', "[0-9]*)?(?:[eE][\\+\\-]?(?:[0-9]+))?$"));

  if (str === '' || str === '.' || str === '-' || str === '+') {
    return false;
  }

  var value = parseFloat(str.replace(',', '.'));
  return float.test(str) && (!options.hasOwnProperty('min') || value >= options.min) && (!options.hasOwnProperty('max') || value <= options.max) && (!options.hasOwnProperty('lt') || value < options.lt) && (!options.hasOwnProperty('gt') || value > options.gt);
}

var locales = Object.keys(_alpha.decimal);
exports.locales = locales;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isFullWidth;
exports.fullWidth = void 0;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var fullWidth = /[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/;
exports.fullWidth = fullWidth;

function isFullWidth(str) {
  (0, _assertString.default)(str);
  return fullWidth.test(str);
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isHSL;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var hslComma = /^hsla?\(((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?))(deg|grad|rad|turn)?(,(\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%){2}(,((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%?))?\)$/i;
var hslSpace = /^hsla?\(((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?))(deg|grad|rad|turn)?(\s(\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%){2}\s?(\/\s((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%?)\s?)?\)$/i;

function isHSL(str) {
  (0, _assertString.default)(str); // Strip duplicate spaces before calling the validation regex (See  #1598 for more info)

  var strippedStr = str.replace(/\s+/g, ' ').replace(/\s?(hsla?\(|\)|,)\s?/ig, '$1');

  if (strippedStr.indexOf(',') !== -1) {
    return hslComma.test(strippedStr);
  }

  return hslSpace.test(strippedStr);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isHalfWidth;
exports.halfWidth = void 0;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var halfWidth = /[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/;
exports.halfWidth = halfWidth;

function isHalfWidth(str) {
  (0, _assertString.default)(str);
  return halfWidth.test(str);
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isHash;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var lengths = {
  md5: 32,
  md4: 32,
  sha1: 40,
  sha256: 64,
  sha384: 96,
  sha512: 128,
  ripemd128: 32,
  ripemd160: 40,
  tiger128: 32,
  tiger160: 40,
  tiger192: 48,
  crc32: 8,
  crc32b: 8
};

function isHash(str, algorithm) {
  (0, _assertString.default)(str);
  var hash = new RegExp("^[a-fA-F0-9]{".concat(lengths[algorithm], "}$"));
  return hash.test(str);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isHexColor;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var hexcolor = /^#?([0-9A-F]{3}|[0-9A-F]{4}|[0-9A-F]{6}|[0-9A-F]{8})$/i;

function isHexColor(str) {
  (0, _assertString.default)(str);
  return hexcolor.test(str);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isHexadecimal;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var hexadecimal = /^(0x|0h)?[0-9A-F]+$/i;

function isHexadecimal(str) {
  (0, _assertString.default)(str);
  return hexadecimal.test(str);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isIBAN;
exports.locales = void 0;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/**
 * List of country codes with
 * corresponding IBAN regular expression
 * Reference: https://en.wikipedia.org/wiki/International_Bank_Account_Number
 */
var ibanRegexThroughCountryCode = {
  AD: /^(AD[0-9]{2})\d{8}[A-Z0-9]{12}$/,
  AE: /^(AE[0-9]{2})\d{3}\d{16}$/,
  AL: /^(AL[0-9]{2})\d{8}[A-Z0-9]{16}$/,
  AT: /^(AT[0-9]{2})\d{16}$/,
  AZ: /^(AZ[0-9]{2})[A-Z0-9]{4}\d{20}$/,
  BA: /^(BA[0-9]{2})\d{16}$/,
  BE: /^(BE[0-9]{2})\d{12}$/,
  BG: /^(BG[0-9]{2})[A-Z]{4}\d{6}[A-Z0-9]{8}$/,
  BH: /^(BH[0-9]{2})[A-Z]{4}[A-Z0-9]{14}$/,
  BR: /^(BR[0-9]{2})\d{23}[A-Z]{1}[A-Z0-9]{1}$/,
  BY: /^(BY[0-9]{2})[A-Z0-9]{4}\d{20}$/,
  CH: /^(CH[0-9]{2})\d{5}[A-Z0-9]{12}$/,
  CR: /^(CR[0-9]{2})\d{18}$/,
  CY: /^(CY[0-9]{2})\d{8}[A-Z0-9]{16}$/,
  CZ: /^(CZ[0-9]{2})\d{20}$/,
  DE: /^(DE[0-9]{2})\d{18}$/,
  DK: /^(DK[0-9]{2})\d{14}$/,
  DO: /^(DO[0-9]{2})[A-Z]{4}\d{20}$/,
  EE: /^(EE[0-9]{2})\d{16}$/,
  EG: /^(EG[0-9]{2})\d{25}$/,
  ES: /^(ES[0-9]{2})\d{20}$/,
  FI: /^(FI[0-9]{2})\d{14}$/,
  FO: /^(FO[0-9]{2})\d{14}$/,
  FR: /^(FR[0-9]{2})\d{10}[A-Z0-9]{11}\d{2}$/,
  GB: /^(GB[0-9]{2})[A-Z]{4}\d{14}$/,
  GE: /^(GE[0-9]{2})[A-Z0-9]{2}\d{16}$/,
  GI: /^(GI[0-9]{2})[A-Z]{4}[A-Z0-9]{15}$/,
  GL: /^(GL[0-9]{2})\d{14}$/,
  GR: /^(GR[0-9]{2})\d{7}[A-Z0-9]{16}$/,
  GT: /^(GT[0-9]{2})[A-Z0-9]{4}[A-Z0-9]{20}$/,
  HR: /^(HR[0-9]{2})\d{17}$/,
  HU: /^(HU[0-9]{2})\d{24}$/,
  IE: /^(IE[0-9]{2})[A-Z0-9]{4}\d{14}$/,
  IL: /^(IL[0-9]{2})\d{19}$/,
  IQ: /^(IQ[0-9]{2})[A-Z]{4}\d{15}$/,
  IR: /^(IR[0-9]{2})0\d{2}0\d{18}$/,
  IS: /^(IS[0-9]{2})\d{22}$/,
  IT: /^(IT[0-9]{2})[A-Z]{1}\d{10}[A-Z0-9]{12}$/,
  JO: /^(JO[0-9]{2})[A-Z]{4}\d{22}$/,
  KW: /^(KW[0-9]{2})[A-Z]{4}[A-Z0-9]{22}$/,
  KZ: /^(KZ[0-9]{2})\d{3}[A-Z0-9]{13}$/,
  LB: /^(LB[0-9]{2})\d{4}[A-Z0-9]{20}$/,
  LC: /^(LC[0-9]{2})[A-Z]{4}[A-Z0-9]{24}$/,
  LI: /^(LI[0-9]{2})\d{5}[A-Z0-9]{12}$/,
  LT: /^(LT[0-9]{2})\d{16}$/,
  LU: /^(LU[0-9]{2})\d{3}[A-Z0-9]{13}$/,
  LV: /^(LV[0-9]{2})[A-Z]{4}[A-Z0-9]{13}$/,
  MC: /^(MC[0-9]{2})\d{10}[A-Z0-9]{11}\d{2}$/,
  MD: /^(MD[0-9]{2})[A-Z0-9]{20}$/,
  ME: /^(ME[0-9]{2})\d{18}$/,
  MK: /^(MK[0-9]{2})\d{3}[A-Z0-9]{10}\d{2}$/,
  MR: /^(MR[0-9]{2})\d{23}$/,
  MT: /^(MT[0-9]{2})[A-Z]{4}\d{5}[A-Z0-9]{18}$/,
  MU: /^(MU[0-9]{2})[A-Z]{4}\d{19}[A-Z]{3}$/,
  MZ: /^(MZ[0-9]{2})\d{21}$/,
  NL: /^(NL[0-9]{2})[A-Z]{4}\d{10}$/,
  NO: /^(NO[0-9]{2})\d{11}$/,
  PK: /^(PK[0-9]{2})[A-Z0-9]{4}\d{16}$/,
  PL: /^(PL[0-9]{2})\d{24}$/,
  PS: /^(PS[0-9]{2})[A-Z0-9]{4}\d{21}$/,
  PT: /^(PT[0-9]{2})\d{21}$/,
  QA: /^(QA[0-9]{2})[A-Z]{4}[A-Z0-9]{21}$/,
  RO: /^(RO[0-9]{2})[A-Z]{4}[A-Z0-9]{16}$/,
  RS: /^(RS[0-9]{2})\d{18}$/,
  SA: /^(SA[0-9]{2})\d{2}[A-Z0-9]{18}$/,
  SC: /^(SC[0-9]{2})[A-Z]{4}\d{20}[A-Z]{3}$/,
  SE: /^(SE[0-9]{2})\d{20}$/,
  SI: /^(SI[0-9]{2})\d{15}$/,
  SK: /^(SK[0-9]{2})\d{20}$/,
  SM: /^(SM[0-9]{2})[A-Z]{1}\d{10}[A-Z0-9]{12}$/,
  SV: /^(SV[0-9]{2})[A-Z0-9]{4}\d{20}$/,
  TL: /^(TL[0-9]{2})\d{19}$/,
  TN: /^(TN[0-9]{2})\d{20}$/,
  TR: /^(TR[0-9]{2})\d{5}[A-Z0-9]{17}$/,
  UA: /^(UA[0-9]{2})\d{6}[A-Z0-9]{19}$/,
  VA: /^(VA[0-9]{2})\d{18}$/,
  VG: /^(VG[0-9]{2})[A-Z0-9]{4}\d{16}$/,
  XK: /^(XK[0-9]{2})\d{16}$/
};
/**
 * Check whether string has correct universal IBAN format
 * The IBAN consists of up to 34 alphanumeric characters, as follows:
 * Country Code using ISO 3166-1 alpha-2, two letters
 * check digits, two digits and
 * Basic Bank Account Number (BBAN), up to 30 alphanumeric characters.
 * NOTE: Permitted IBAN characters are: digits [0-9] and the 26 latin alphabetic [A-Z]
 *
 * @param {string} str - string under validation
 * @return {boolean}
 */

function hasValidIbanFormat(str) {
  // Strip white spaces and hyphens
  var strippedStr = str.replace(/[\s\-]+/gi, '').toUpperCase();
  var isoCountryCode = strippedStr.slice(0, 2).toUpperCase();
  return isoCountryCode in ibanRegexThroughCountryCode && ibanRegexThroughCountryCode[isoCountryCode].test(strippedStr);
}
/**
   * Check whether string has valid IBAN Checksum
   * by performing basic mod-97 operation and
   * the remainder should equal 1
   * -- Start by rearranging the IBAN by moving the four initial characters to the end of the string
   * -- Replace each letter in the string with two digits, A -> 10, B = 11, Z = 35
   * -- Interpret the string as a decimal integer and
   * -- compute the remainder on division by 97 (mod 97)
   * Reference: https://en.wikipedia.org/wiki/International_Bank_Account_Number
   *
   * @param {string} str
   * @return {boolean}
   */


function hasValidIbanChecksum(str) {
  var strippedStr = str.replace(/[^A-Z0-9]+/gi, '').toUpperCase(); // Keep only digits and A-Z latin alphabetic

  var rearranged = strippedStr.slice(4) + strippedStr.slice(0, 4);
  var alphaCapsReplacedWithDigits = rearranged.replace(/[A-Z]/g, function (char) {
    return char.charCodeAt(0) - 55;
  });
  var remainder = alphaCapsReplacedWithDigits.match(/\d{1,7}/g).reduce(function (acc, value) {
    return Number(acc + value) % 97;
  }, '');
  return remainder === 1;
}

function isIBAN(str) {
  (0, _assertString.default)(str);
  return hasValidIbanFormat(str) && hasValidIbanChecksum(str);
}

var locales = Object.keys(ibanRegexThroughCountryCode);
exports.locales = locales;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isIMEI;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var imeiRegexWithoutHypens = /^[0-9]{15}$/;
var imeiRegexWithHypens = /^\d{2}-\d{6}-\d{6}-\d{1}$/;

function isIMEI(str, options) {
  (0, _assertString.default)(str);
  options = options || {}; // default regex for checking imei is the one without hyphens

  var imeiRegex = imeiRegexWithoutHypens;

  if (options.allow_hyphens) {
    imeiRegex = imeiRegexWithHypens;
  }

  if (!imeiRegex.test(str)) {
    return false;
  }

  str = str.replace(/-/g, '');
  var sum = 0,
      mul = 2,
      l = 14;

  for (var i = 0; i < l; i++) {
    var digit = str.substring(l - i - 1, l - i);
    var tp = parseInt(digit, 10) * mul;

    if (tp >= 10) {
      sum += tp % 10 + 1;
    } else {
      sum += tp;
    }

    if (mul === 1) {
      mul += 1;
    } else {
      mul -= 1;
    }
  }

  var chk = (10 - sum % 10) % 10;

  if (chk !== parseInt(str.substring(14, 15), 10)) {
    return false;
  }

  return true;
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isIP;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/**
11.3.  Examples

   The following addresses

             fe80::1234 (on the 1st link of the node)
             ff02::5678 (on the 5th link of the node)
             ff08::9abc (on the 10th organization of the node)

   would be represented as follows:

             fe80::1234%1
             ff02::5678%5
             ff08::9abc%10

   (Here we assume a natural translation from a zone index to the
   <zone_id> part, where the Nth zone of any scope is translated into
   "N".)

   If we use interface names as <zone_id>, those addresses could also be
   represented as follows:

            fe80::1234%ne0
            ff02::5678%pvc1.3
            ff08::9abc%interface10

   where the interface "ne0" belongs to the 1st link, "pvc1.3" belongs
   to the 5th link, and "interface10" belongs to the 10th organization.
 * * */
var IPv4SegmentFormat = '(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';
var IPv4AddressFormat = "(".concat(IPv4SegmentFormat, "[.]){3}").concat(IPv4SegmentFormat);
var IPv4AddressRegExp = new RegExp("^".concat(IPv4AddressFormat, "$"));
var IPv6SegmentFormat = '(?:[0-9a-fA-F]{1,4})';
var IPv6AddressRegExp = new RegExp('^(' + "(?:".concat(IPv6SegmentFormat, ":){7}(?:").concat(IPv6SegmentFormat, "|:)|") + "(?:".concat(IPv6SegmentFormat, ":){6}(?:").concat(IPv4AddressFormat, "|:").concat(IPv6SegmentFormat, "|:)|") + "(?:".concat(IPv6SegmentFormat, ":){5}(?::").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,2}|:)|") + "(?:".concat(IPv6SegmentFormat, ":){4}(?:(:").concat(IPv6SegmentFormat, "){0,1}:").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,3}|:)|") + "(?:".concat(IPv6SegmentFormat, ":){3}(?:(:").concat(IPv6SegmentFormat, "){0,2}:").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,4}|:)|") + "(?:".concat(IPv6SegmentFormat, ":){2}(?:(:").concat(IPv6SegmentFormat, "){0,3}:").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,5}|:)|") + "(?:".concat(IPv6SegmentFormat, ":){1}(?:(:").concat(IPv6SegmentFormat, "){0,4}:").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,6}|:)|") + "(?::((?::".concat(IPv6SegmentFormat, "){0,5}:").concat(IPv4AddressFormat, "|(?::").concat(IPv6SegmentFormat, "){1,7}|:))") + ')(%[0-9a-zA-Z-.:]{1,})?$');

function isIP(str) {
  var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
  (0, _assertString.default)(str);
  version = String(version);

  if (!version) {
    return isIP(str, 4) || isIP(str, 6);
  }

  if (version === '4') {
    if (!IPv4AddressRegExp.test(str)) {
      return false;
    }

    var parts = str.split('.').sort(function (a, b) {
      return a - b;
    });
    return parts[3] <= 255;
  }

  if (version === '6') {
    return !!IPv6AddressRegExp.test(str);
  }

  return false;
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isIPRange;

var _assertString = _interopRequireDefault(require("./util/assertString"));

var _isIP = _interopRequireDefault(require("./isIP"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var subnetMaybe = /^\d{1,3}$/;
var v4Subnet = 32;
var v6Subnet = 128;

function isIPRange(str) {
  var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
  (0, _assertString.default)(str);
  var parts = str.split('/'); // parts[0] -> ip, parts[1] -> subnet

  if (parts.length !== 2) {
    return false;
  }

  if (!subnetMaybe.test(parts[1])) {
    return false;
  } // Disallow preceding 0 i.e. 01, 02, ...


  if (parts[1].length > 1 && parts[1].startsWith('0')) {
    return false;
  }

  var isValidIP = (0, _isIP.default)(parts[0], version);

  if (!isValidIP) {
    return false;
  } // Define valid subnet according to IP's version


  var expectedSubnet = null;

  switch (String(version)) {
    case '4':
      expectedSubnet = v4Subnet;
      break;

    case '6':
      expectedSubnet = v6Subnet;
      break;

    default:
      expectedSubnet = (0, _isIP.default)(parts[0], '6') ? v6Subnet : v4Subnet;
  }

  return parts[1] <= expectedSubnet && parts[1] >= 0;
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isISBN;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var isbn10Maybe = /^(?:[0-9]{9}X|[0-9]{10})$/;
var isbn13Maybe = /^(?:[0-9]{13})$/;
var factor = [1, 3];

function isISBN(str) {
  var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
  (0, _assertString.default)(str);
  version = String(version);

  if (!version) {
    return isISBN(str, 10) || isISBN(str, 13);
  }

  var sanitized = str.replace(/[\s-]+/g, '');
  var checksum = 0;
  var i;

  if (version === '10') {
    if (!isbn10Maybe.test(sanitized)) {
      return false;
    }

    for (i = 0; i < 9; i++) {
      checksum += (i + 1) * sanitized.charAt(i);
    }

    if (sanitized.charAt(9) === 'X') {
      checksum += 10 * 10;
    } else {
      checksum += 10 * sanitized.charAt(9);
    }

    if (checksum % 11 === 0) {
      return !!sanitized;
    }
  } else if (version === '13') {
    if (!isbn13Maybe.test(sanitized)) {
      return false;
    }

    for (i = 0; i < 12; i++) {
      checksum += factor[i % 2] * sanitized.charAt(i);
    }

    if (sanitized.charAt(12) - (10 - checksum % 10) % 10 === 0) {
      return !!sanitized;
    }
  }

  return false;
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isISIN;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var isin = /^[A-Z]{2}[0-9A-Z]{9}[0-9]$/; // this link details how the check digit is calculated:
// https://www.isin.org/isin-format/. it is a little bit
// odd in that it works with digits, not numbers. in order
// to make only one pass through the ISIN characters, the
// each alpha character is handled as 2 characters within
// the loop.

function isISIN(str) {
  (0, _assertString.default)(str);

  if (!isin.test(str)) {
    return false;
  }

  var double = true;
  var sum = 0; // convert values

  for (var i = str.length - 2; i >= 0; i--) {
    if (str[i] >= 'A' && str[i] <= 'Z') {
      var value = str[i].charCodeAt(0) - 55;
      var lo = value % 10;
      var hi = Math.trunc(value / 10); // letters have two digits, so handle the low order
      // and high order digits separately.

      for (var _i = 0, _arr = [lo, hi]; _i < _arr.length; _i++) {
        var digit = _arr[_i];

        if (double) {
          if (digit >= 5) {
            sum += 1 + (digit - 5) * 2;
          } else {
            sum += digit * 2;
          }
        } else {
          sum += digit;
        }

        double = !double;
      }
    } else {
      var _digit = str[i].charCodeAt(0) - '0'.charCodeAt(0);

      if (double) {
        if (_digit >= 5) {
          sum += 1 + (_digit - 5) * 2;
        } else {
          sum += _digit * 2;
        }
      } else {
        sum += _digit;
      }

      double = !double;
    }
  }

  var check = Math.trunc((sum + 9) / 10) * 10 - sum;
  return +str[str.length - 1] === check;
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isISO31661Alpha2;
exports.CountryCodes = void 0;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// from https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
var validISO31661Alpha2CountriesCodes = new Set(['AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AO', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AW', 'AX', 'AZ', 'BA', 'BB', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BL', 'BM', 'BN', 'BO', 'BQ', 'BR', 'BS', 'BT', 'BV', 'BW', 'BY', 'BZ', 'CA', 'CC', 'CD', 'CF', 'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN', 'CO', 'CR', 'CU', 'CV', 'CW', 'CX', 'CY', 'CZ', 'DE', 'DJ', 'DK', 'DM', 'DO', 'DZ', 'EC', 'EE', 'EG', 'EH', 'ER', 'ES', 'ET', 'FI', 'FJ', 'FK', 'FM', 'FO', 'FR', 'GA', 'GB', 'GD', 'GE', 'GF', 'GG', 'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GS', 'GT', 'GU', 'GW', 'GY', 'HK', 'HM', 'HN', 'HR', 'HT', 'HU', 'ID', 'IE', 'IL', 'IM', 'IN', 'IO', 'IQ', 'IR', 'IS', 'IT', 'JE', 'JM', 'JO', 'JP', 'KE', 'KG', 'KH', 'KI', 'KM', 'KN', 'KP', 'KR', 'KW', 'KY', 'KZ', 'LA', 'LB', 'LC', 'LI', 'LK', 'LR', 'LS', 'LT', 'LU', 'LV', 'LY', 'MA', 'MC', 'MD', 'ME', 'MF', 'MG', 'MH', 'MK', 'ML', 'MM', 'MN', 'MO', 'MP', 'MQ', 'MR', 'MS', 'MT', 'MU', 'MV', 'MW', 'MX', 'MY', 'MZ', 'NA', 'NC', 'NE', 'NF', 'NG', 'NI', 'NL', 'NO', 'NP', 'NR', 'NU', 'NZ', 'OM', 'PA', 'PE', 'PF', 'PG', 'PH', 'PK', 'PL', 'PM', 'PN', 'PR', 'PS', 'PT', 'PW', 'PY', 'QA', 'RE', 'RO', 'RS', 'RU', 'RW', 'SA', 'SB', 'SC', 'SD', 'SE', 'SG', 'SH', 'SI', 'SJ', 'SK', 'SL', 'SM', 'SN', 'SO', 'SR', 'SS', 'ST', 'SV', 'SX', 'SY', 'SZ', 'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK', 'TL', 'TM', 'TN', 'TO', 'TR', 'TT', 'TV', 'TW', 'TZ', 'UA', 'UG', 'UM', 'US', 'UY', 'UZ', 'VA', 'VC', 'VE', 'VG', 'VI', 'VN', 'VU', 'WF', 'WS', 'YE', 'YT', 'ZA', 'ZM', 'ZW']);

function isISO31661Alpha2(str) {
  (0, _assertString.default)(str);
  return validISO31661Alpha2CountriesCodes.has(str.toUpperCase());
}

var CountryCodes = validISO31661Alpha2CountriesCodes;
exports.CountryCodes = CountryCodes;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isISO31661Alpha3;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// from https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3
var validISO31661Alpha3CountriesCodes = new Set(['AFG', 'ALA', 'ALB', 'DZA', 'ASM', 'AND', 'AGO', 'AIA', 'ATA', 'ATG', 'ARG', 'ARM', 'ABW', 'AUS', 'AUT', 'AZE', 'BHS', 'BHR', 'BGD', 'BRB', 'BLR', 'BEL', 'BLZ', 'BEN', 'BMU', 'BTN', 'BOL', 'BES', 'BIH', 'BWA', 'BVT', 'BRA', 'IOT', 'BRN', 'BGR', 'BFA', 'BDI', 'KHM', 'CMR', 'CAN', 'CPV', 'CYM', 'CAF', 'TCD', 'CHL', 'CHN', 'CXR', 'CCK', 'COL', 'COM', 'COG', 'COD', 'COK', 'CRI', 'CIV', 'HRV', 'CUB', 'CUW', 'CYP', 'CZE', 'DNK', 'DJI', 'DMA', 'DOM', 'ECU', 'EGY', 'SLV', 'GNQ', 'ERI', 'EST', 'ETH', 'FLK', 'FRO', 'FJI', 'FIN', 'FRA', 'GUF', 'PYF', 'ATF', 'GAB', 'GMB', 'GEO', 'DEU', 'GHA', 'GIB', 'GRC', 'GRL', 'GRD', 'GLP', 'GUM', 'GTM', 'GGY', 'GIN', 'GNB', 'GUY', 'HTI', 'HMD', 'VAT', 'HND', 'HKG', 'HUN', 'ISL', 'IND', 'IDN', 'IRN', 'IRQ', 'IRL', 'IMN', 'ISR', 'ITA', 'JAM', 'JPN', 'JEY', 'JOR', 'KAZ', 'KEN', 'KIR', 'PRK', 'KOR', 'KWT', 'KGZ', 'LAO', 'LVA', 'LBN', 'LSO', 'LBR', 'LBY', 'LIE', 'LTU', 'LUX', 'MAC', 'MKD', 'MDG', 'MWI', 'MYS', 'MDV', 'MLI', 'MLT', 'MHL', 'MTQ', 'MRT', 'MUS', 'MYT', 'MEX', 'FSM', 'MDA', 'MCO', 'MNG', 'MNE', 'MSR', 'MAR', 'MOZ', 'MMR', 'NAM', 'NRU', 'NPL', 'NLD', 'NCL', 'NZL', 'NIC', 'NER', 'NGA', 'NIU', 'NFK', 'MNP', 'NOR', 'OMN', 'PAK', 'PLW', 'PSE', 'PAN', 'PNG', 'PRY', 'PER', 'PHL', 'PCN', 'POL', 'PRT', 'PRI', 'QAT', 'REU', 'ROU', 'RUS', 'RWA', 'BLM', 'SHN', 'KNA', 'LCA', 'MAF', 'SPM', 'VCT', 'WSM', 'SMR', 'STP', 'SAU', 'SEN', 'SRB', 'SYC', 'SLE', 'SGP', 'SXM', 'SVK', 'SVN', 'SLB', 'SOM', 'ZAF', 'SGS', 'SSD', 'ESP', 'LKA', 'SDN', 'SUR', 'SJM', 'SWZ', 'SWE', 'CHE', 'SYR', 'TWN', 'TJK', 'TZA', 'THA', 'TLS', 'TGO', 'TKL', 'TON', 'TTO', 'TUN', 'TUR', 'TKM', 'TCA', 'TUV', 'UGA', 'UKR', 'ARE', 'GBR', 'USA', 'UMI', 'URY', 'UZB', 'VUT', 'VEN', 'VNM', 'VGB', 'VIR', 'WLF', 'ESH', 'YEM', 'ZMB', 'ZWE']);

function isISO31661Alpha3(str) {
  (0, _assertString.default)(str);
  return validISO31661Alpha3CountriesCodes.has(str.toUpperCase());
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isISO4217;
exports.CurrencyCodes = void 0;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// from https://en.wikipedia.org/wiki/ISO_4217
var validISO4217CurrencyCodes = new Set(['AED', 'AFN', 'ALL', 'AMD', 'ANG', 'AOA', 'ARS', 'AUD', 'AWG', 'AZN', 'BAM', 'BBD', 'BDT', 'BGN', 'BHD', 'BIF', 'BMD', 'BND', 'BOB', 'BOV', 'BRL', 'BSD', 'BTN', 'BWP', 'BYN', 'BZD', 'CAD', 'CDF', 'CHE', 'CHF', 'CHW', 'CLF', 'CLP', 'CNY', 'COP', 'COU', 'CRC', 'CUC', 'CUP', 'CVE', 'CZK', 'DJF', 'DKK', 'DOP', 'DZD', 'EGP', 'ERN', 'ETB', 'EUR', 'FJD', 'FKP', 'GBP', 'GEL', 'GHS', 'GIP', 'GMD', 'GNF', 'GTQ', 'GYD', 'HKD', 'HNL', 'HRK', 'HTG', 'HUF', 'IDR', 'ILS', 'INR', 'IQD', 'IRR', 'ISK', 'JMD', 'JOD', 'JPY', 'KES', 'KGS', 'KHR', 'KMF', 'KPW', 'KRW', 'KWD', 'KYD', 'KZT', 'LAK', 'LBP', 'LKR', 'LRD', 'LSL', 'LYD', 'MAD', 'MDL', 'MGA', 'MKD', 'MMK', 'MNT', 'MOP', 'MRU', 'MUR', 'MVR', 'MWK', 'MXN', 'MXV', 'MYR', 'MZN', 'NAD', 'NGN', 'NIO', 'NOK', 'NPR', 'NZD', 'OMR', 'PAB', 'PEN', 'PGK', 'PHP', 'PKR', 'PLN', 'PYG', 'QAR', 'RON', 'RSD', 'RUB', 'RWF', 'SAR', 'SBD', 'SCR', 'SDG', 'SEK', 'SGD', 'SHP', 'SLL', 'SOS', 'SRD', 'SSP', 'STN', 'SVC', 'SYP', 'SZL', 'THB', 'TJS', 'TMT', 'TND', 'TOP', 'TRY', 'TTD', 'TWD', 'TZS', 'UAH', 'UGX', 'USD', 'USN', 'UYI', 'UYU', 'UYW', 'UZS', 'VES', 'VND', 'VUV', 'WST', 'XAF', 'XAG', 'XAU', 'XBA', 'XBB', 'XBC', 'XBD', 'XCD', 'XDR', 'XOF', 'XPD', 'XPF', 'XPT', 'XSU', 'XTS', 'XUA', 'XXX', 'YER', 'ZAR', 'ZMW', 'ZWL']);

function isISO4217(str) {
  (0, _assertString.default)(str);
  return validISO4217CurrencyCodes.has(str.toUpperCase());
}

var CurrencyCodes = validISO4217CurrencyCodes;
exports.CurrencyCodes = CurrencyCodes;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isISO8601;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/* eslint-disable max-len */
// from http://goo.gl/0ejHHW
var iso8601 = /^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-3])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/; // same as above, except with a strict 'T' separator between date and time

var iso8601StrictSeparator = /^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-3])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T]((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/;
/* eslint-enable max-len */

var isValidDate = function isValidDate(str) {
  // str must have passed the ISO8601 check
  // this check is meant to catch invalid dates
  // like 2009-02-31
  // first check for ordinal dates
  var ordinalMatch = str.match(/^(\d{4})-?(\d{3})([ T]{1}\.*|$)/);

  if (ordinalMatch) {
    var oYear = Number(ordinalMatch[1]);
    var oDay = Number(ordinalMatch[2]); // if is leap year

    if (oYear % 4 === 0 && oYear % 100 !== 0 || oYear % 400 === 0) return oDay <= 366;
    return oDay <= 365;
  }

  var match = str.match(/(\d{4})-?(\d{0,2})-?(\d*)/).map(Number);
  var year = match[1];
  var month = match[2];
  var day = match[3];
  var monthString = month ? "0".concat(month).slice(-2) : month;
  var dayString = day ? "0".concat(day).slice(-2) : day; // create a date object and compare

  var d = new Date("".concat(year, "-").concat(monthString || '01', "-").concat(dayString || '01'));

  if (month && day) {
    return d.getUTCFullYear() === year && d.getUTCMonth() + 1 === month && d.getUTCDate() === day;
  }

  return true;
};

function isISO8601(str) {
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  (0, _assertString.default)(str);
  var check = options.strictSeparator ? iso8601StrictSeparator.test(str) : iso8601.test(str);
  if (check && options.strict) return isValidDate(str);
  return check;
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isISRC;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// see http://isrc.ifpi.org/en/isrc-standard/code-syntax
var isrc = /^[A-Z]{2}[0-9A-Z]{3}\d{2}\d{5}$/;

function isISRC(str) {
  (0, _assertString.default)(str);
  return isrc.test(str);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isISSN;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var issn = '^\\d{4}-?\\d{3}[\\dX]$';

function isISSN(str) {
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  (0, _assertString.default)(str);
  var testIssn = issn;
  testIssn = options.require_hyphen ? testIssn.replace('?', '') : testIssn;
  testIssn = options.case_sensitive ? new RegExp(testIssn) : new RegExp(testIssn, 'i');

  if (!testIssn.test(str)) {
    return false;
  }

  var digits = str.replace('-', '').toUpperCase();
  var checksum = 0;

  for (var i = 0; i < digits.length; i++) {
    var digit = digits[i];
    checksum += (digit === 'X' ? 10 : +digit) * (8 - i);
  }

  return checksum % 11 === 0;
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isIdentityCard;

var _assertString = _interopRequireDefault(require("./util/assertString"));

var _isInt = _interopRequireDefault(require("./isInt"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var validators = {
  PL: function PL(str) {
    (0, _assertString.default)(str);
    var weightOfDigits = {
      1: 1,
      2: 3,
      3: 7,
      4: 9,
      5: 1,
      6: 3,
      7: 7,
      8: 9,
      9: 1,
      10: 3,
      11: 0
    };

    if (str != null && str.length === 11 && (0, _isInt.default)(str, {
      allow_leading_zeroes: true
    })) {
      var digits = str.split('').slice(0, -1);
      var sum = digits.reduce(function (acc, digit, index) {
        return acc + Number(digit) * weightOfDigits[index + 1];
      }, 0);
      var modulo = sum % 10;
      var lastDigit = Number(str.charAt(str.length - 1));

      if (modulo === 0 && lastDigit === 0 || lastDigit === 10 - modulo) {
        return true;
      }
    }

    return false;
  },
  ES: function ES(str) {
    (0, _assertString.default)(str);
    var DNI = /^[0-9X-Z][0-9]{7}[TRWAGMYFPDXBNJZSQVHLCKE]$/;
    var charsValue = {
      X: 0,
      Y: 1,
      Z: 2
    };
    var controlDigits = ['T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E']; // sanitize user input

    var sanitized = str.trim().toUpperCase(); // validate the data structure

    if (!DNI.test(sanitized)) {
      return false;
    } // validate the control digit


    var number = sanitized.slice(0, -1).replace(/[X,Y,Z]/g, function (char) {
      return charsValue[char];
    });
    return sanitized.endsWith(controlDigits[number % 23]);
  },
  FI: function FI(str) {
    // https://dvv.fi/en/personal-identity-code#:~:text=control%20character%20for%20a-,personal,-identity%20code%20calculated
    (0, _assertString.default)(str);

    if (str.length !== 11) {
      return false;
    }

    if (!str.match(/^\d{6}[\-A\+]\d{3}[0-9ABCDEFHJKLMNPRSTUVWXY]{1}$/)) {
      return false;
    }

    var checkDigits = '0123456789ABCDEFHJKLMNPRSTUVWXY';
    var idAsNumber = parseInt(str.slice(0, 6), 10) * 1000 + parseInt(str.slice(7, 10), 10);
    var remainder = idAsNumber % 31;
    var checkDigit = checkDigits[remainder];
    return checkDigit === str.slice(10, 11);
  },
  IN: function IN(str) {
    var DNI = /^[1-9]\d{3}\s?\d{4}\s?\d{4}$/; // multiplication table

    var d = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 0, 6, 7, 8, 9, 5], [2, 3, 4, 0, 1, 7, 8, 9, 5, 6], [3, 4, 0, 1, 2, 8, 9, 5, 6, 7], [4, 0, 1, 2, 3, 9, 5, 6, 7, 8], [5, 9, 8, 7, 6, 0, 4, 3, 2, 1], [6, 5, 9, 8, 7, 1, 0, 4, 3, 2], [7, 6, 5, 9, 8, 2, 1, 0, 4, 3], [8, 7, 6, 5, 9, 3, 2, 1, 0, 4], [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]]; // permutation table

    var p = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 5, 7, 6, 2, 8, 3, 0, 9, 4], [5, 8, 0, 3, 7, 9, 6, 1, 4, 2], [8, 9, 1, 6, 0, 4, 3, 5, 2, 7], [9, 4, 5, 3, 1, 2, 6, 8, 7, 0], [4, 2, 8, 6, 5, 7, 3, 9, 0, 1], [2, 7, 9, 3, 8, 0, 6, 4, 1, 5], [7, 0, 4, 6, 9, 1, 3, 2, 5, 8]]; // sanitize user input

    var sanitized = str.trim(); // validate the data structure

    if (!DNI.test(sanitized)) {
      return false;
    }

    var c = 0;
    var invertedArray = sanitized.replace(/\s/g, '').split('').map(Number).reverse();
    invertedArray.forEach(function (val, i) {
      c = d[c][p[i % 8][val]];
    });
    return c === 0;
  },
  IR: function IR(str) {
    if (!str.match(/^\d{10}$/)) return false;
    str = "0000".concat(str).substr(str.length - 6);
    if (parseInt(str.substr(3, 6), 10) === 0) return false;
    var lastNumber = parseInt(str.substr(9, 1), 10);
    var sum = 0;

    for (var i = 0; i < 9; i++) {
      sum += parseInt(str.substr(i, 1), 10) * (10 - i);
    }

    sum %= 11;
    return sum < 2 && lastNumber === sum || sum >= 2 && lastNumber === 11 - sum;
  },
  IT: function IT(str) {
    if (str.length !== 9) return false;
    if (str === 'CA00000AA') return false; // https://it.wikipedia.org/wiki/Carta_d%27identit%C3%A0_elettronica_italiana

    return str.search(/C[A-Z][0-9]{5}[A-Z]{2}/i) > -1;
  },
  NO: function NO(str) {
    var sanitized = str.trim();
    if (isNaN(Number(sanitized))) return false;
    if (sanitized.length !== 11) return false;
    if (sanitized === '00000000000') return false; // https://no.wikipedia.org/wiki/F%C3%B8dselsnummer

    var f = sanitized.split('').map(Number);
    var k1 = (11 - (3 * f[0] + 7 * f[1] + 6 * f[2] + 1 * f[3] + 8 * f[4] + 9 * f[5] + 4 * f[6] + 5 * f[7] + 2 * f[8]) % 11) % 11;
    var k2 = (11 - (5 * f[0] + 4 * f[1] + 3 * f[2] + 2 * f[3] + 7 * f[4] + 6 * f[5] + 5 * f[6] + 4 * f[7] + 3 * f[8] + 2 * k1) % 11) % 11;
    if (k1 !== f[9] || k2 !== f[10]) return false;
    return true;
  },
  TH: function TH(str) {
    if (!str.match(/^[1-8]\d{12}$/)) return false; // validate check digit

    var sum = 0;

    for (var i = 0; i < 12; i++) {
      sum += parseInt(str[i], 10) * (13 - i);
    }

    return str[12] === ((11 - sum % 11) % 10).toString();
  },
  LK: function LK(str) {
    var old_nic = /^[1-9]\d{8}[vx]$/i;
    var new_nic = /^[1-9]\d{11}$/i;
    if (str.length === 10 && old_nic.test(str)) return true;else if (str.length === 12 && new_nic.test(str)) return true;
    return false;
  },
  'he-IL': function heIL(str) {
    var DNI = /^\d{9}$/; // sanitize user input

    var sanitized = str.trim(); // validate the data structure

    if (!DNI.test(sanitized)) {
      return false;
    }

    var id = sanitized;
    var sum = 0,
        incNum;

    for (var i = 0; i < id.length; i++) {
      incNum = Number(id[i]) * (i % 2 + 1); // Multiply number by 1 or 2

      sum += incNum > 9 ? incNum - 9 : incNum; // Sum the digits up and add to total
    }

    return sum % 10 === 0;
  },
  'ar-LY': function arLY(str) {
    // Libya National Identity Number NIN is 12 digits, the first digit is either 1 or 2
    var NIN = /^(1|2)\d{11}$/; // sanitize user input

    var sanitized = str.trim(); // validate the data structure

    if (!NIN.test(sanitized)) {
      return false;
    }

    return true;
  },
  'ar-TN': function arTN(str) {
    var DNI = /^\d{8}$/; // sanitize user input

    var sanitized = str.trim(); // validate the data structure

    if (!DNI.test(sanitized)) {
      return false;
    }

    return true;
  },
  'zh-CN': function zhCN(str) {
    var provincesAndCities = ['11', // 北京
    '12', // 天津
    '13', // 河北
    '14', // 山西
    '15', // 内蒙古
    '21', // 辽宁
    '22', // 吉林
    '23', // 黑龙江
    '31', // 上海
    '32', // 江苏
    '33', // 浙江
    '34', // 安徽
    '35', // 福建
    '36', // 江西
    '37', // 山东
    '41', // 河南
    '42', // 湖北
    '43', // 湖南
    '44', // 广东
    '45', // 广西
    '46', // 海南
    '50', // 重庆
    '51', // 四川
    '52', // 贵州
    '53', // 云南
    '54', // 西藏
    '61', // 陕西
    '62', // 甘肃
    '63', // 青海
    '64', // 宁夏
    '65', // 新疆
    '71', // 台湾
    '81', // 香港
    '82', // 澳门
    '91' // 国外
    ];
    var powers = ['7', '9', '10', '5', '8', '4', '2', '1', '6', '3', '7', '9', '10', '5', '8', '4', '2'];
    var parityBit = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];

    var checkAddressCode = function checkAddressCode(addressCode) {
      return provincesAndCities.includes(addressCode);
    };

    var checkBirthDayCode = function checkBirthDayCode(birDayCode) {
      var yyyy = parseInt(birDayCode.substring(0, 4), 10);
      var mm = parseInt(birDayCode.substring(4, 6), 10);
      var dd = parseInt(birDayCode.substring(6), 10);
      var xdata = new Date(yyyy, mm - 1, dd);

      if (xdata > new Date()) {
        return false; // eslint-disable-next-line max-len
      } else if (xdata.getFullYear() === yyyy && xdata.getMonth() === mm - 1 && xdata.getDate() === dd) {
        return true;
      }

      return false;
    };

    var getParityBit = function getParityBit(idCardNo) {
      var id17 = idCardNo.substring(0, 17);
      var power = 0;

      for (var i = 0; i < 17; i++) {
        power += parseInt(id17.charAt(i), 10) * parseInt(powers[i], 10);
      }

      var mod = power % 11;
      return parityBit[mod];
    };

    var checkParityBit = function checkParityBit(idCardNo) {
      return getParityBit(idCardNo) === idCardNo.charAt(17).toUpperCase();
    };

    var check15IdCardNo = function check15IdCardNo(idCardNo) {
      var check = /^[1-9]\d{7}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\d{3}$/.test(idCardNo);
      if (!check) return false;
      var addressCode = idCardNo.substring(0, 2);
      check = checkAddressCode(addressCode);
      if (!check) return false;
      var birDayCode = "19".concat(idCardNo.substring(6, 12));
      check = checkBirthDayCode(birDayCode);
      if (!check) return false;
      return true;
    };

    var check18IdCardNo = function check18IdCardNo(idCardNo) {
      var check = /^[1-9]\d{5}[1-9]\d{3}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\d{3}(\d|x|X)$/.test(idCardNo);
      if (!check) return false;
      var addressCode = idCardNo.substring(0, 2);
      check = checkAddressCode(addressCode);
      if (!check) return false;
      var birDayCode = idCardNo.substring(6, 14);
      check = checkBirthDayCode(birDayCode);
      if (!check) return false;
      return checkParityBit(idCardNo);
    };

    var checkIdCardNo = function checkIdCardNo(idCardNo) {
      var check = /^\d{15}|(\d{17}(\d|x|X))$/.test(idCardNo);
      if (!check) return false;

      if (idCardNo.length === 15) {
        return check15IdCardNo(idCardNo);
      }

      return check18IdCardNo(idCardNo);
    };

    return checkIdCardNo(str);
  },
  'zh-TW': function zhTW(str) {
    var ALPHABET_CODES = {
      A: 10,
      B: 11,
      C: 12,
      D: 13,
      E: 14,
      F: 15,
      G: 16,
      H: 17,
      I: 34,
      J: 18,
      K: 19,
      L: 20,
      M: 21,
      N: 22,
      O: 35,
      P: 23,
      Q: 24,
      R: 25,
      S: 26,
      T: 27,
      U: 28,
      V: 29,
      W: 32,
      X: 30,
      Y: 31,
      Z: 33
    };
    var sanitized = str.trim().toUpperCase();
    if (!/^[A-Z][0-9]{9}$/.test(sanitized)) return false;
    return Array.from(sanitized).reduce(function (sum, number, index) {
      if (index === 0) {
        var code = ALPHABET_CODES[number];
        return code % 10 * 9 + Math.floor(code / 10);
      }

      if (index === 9) {
        return (10 - sum % 10 - Number(number)) % 10 === 0;
      }

      return sum + Number(number) * (9 - index);
    }, 0);
  }
};

function isIdentityCard(str, locale) {
  (0, _assertString.default)(str);

  if (locale in validators) {
    return validators[locale](str);
  } else if (locale === 'any') {
    for (var key in validators) {
      // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
      // istanbul ignore else
      if (validators.hasOwnProperty(key)) {
        var validator = validators[key];

        if (validator(str)) {
          return true;
        }
      }
    }

    return false;
  }

  throw new Error("Invalid locale '".concat(locale, "'"));
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isIn;

var _assertString = _interopRequireDefault(require("./util/assertString"));

var _toString = _interopRequireDefault(require("./util/toString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function isIn(str, options) {
  (0, _assertString.default)(str);
  var i;

  if (Object.prototype.toString.call(options) === '[object Array]') {
    var array = [];

    for (i in options) {
      // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
      // istanbul ignore else
      if ({}.hasOwnProperty.call(options, i)) {
        array[i] = (0, _toString.default)(options[i]);
      }
    }

    return array.indexOf(str) >= 0;
  } else if (_typeof(options) === 'object') {
    return options.hasOwnProperty(str);
  } else if (options && typeof options.indexOf === 'function') {
    return options.indexOf(str) >= 0;
  }

  return false;
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isInt;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var int = /^(?:[-+]?(?:0|[1-9][0-9]*))$/;
var intLeadingZeroes = /^[-+]?[0-9]+$/;

function isInt(str, options) {
  (0, _assertString.default)(str);
  options = options || {}; // Get the regex to use for testing, based on whether
  // leading zeroes are allowed or not.

  var regex = options.hasOwnProperty('allow_leading_zeroes') && !options.allow_leading_zeroes ? int : intLeadingZeroes; // Check min/max/lt/gt

  var minCheckPassed = !options.hasOwnProperty('min') || str >= options.min;
  var maxCheckPassed = !options.hasOwnProperty('max') || str <= options.max;
  var ltCheckPassed = !options.hasOwnProperty('lt') || str < options.lt;
  var gtCheckPassed = !options.hasOwnProperty('gt') || str > options.gt;
  return regex.test(str) && minCheckPassed && maxCheckPassed && ltCheckPassed && gtCheckPassed;
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isJSON;

var _assertString = _interopRequireDefault(require("./util/assertString"));

var _merge = _interopRequireDefault(require("./util/merge"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

var default_json_options = {
  allow_primitives: false
};

function isJSON(str, options) {
  (0, _assertString.default)(str);

  try {
    options = (0, _merge.default)(options, default_json_options);
    var primitives = [];

    if (options.allow_primitives) {
      primitives = [null, false, true];
    }

    var obj = JSON.parse(str);
    return primitives.includes(obj) || !!obj && _typeof(obj) === 'object';
  } catch (e) {
    /* ignore */
  }

  return false;
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isJWT;

var _assertString = _interopRequireDefault(require("./util/assertString"));

var _isBase = _interopRequireDefault(require("./isBase64"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function isJWT(str) {
  (0, _assertString.default)(str);
  var dotSplit = str.split('.');
  var len = dotSplit.length;

  if (len > 3 || len < 2) {
    return false;
  }

  return dotSplit.reduce(function (acc, currElem) {
    return acc && (0, _isBase.default)(currElem, {
      urlSafe: true
    });
  }, true);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isLatLong;

var _assertString = _interopRequireDefault(require("./util/assertString"));

var _merge = _interopRequireDefault(require("./util/merge"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var lat = /^\(?[+-]?(90(\.0+)?|[1-8]?\d(\.\d+)?)$/;
var long = /^\s?[+-]?(180(\.0+)?|1[0-7]\d(\.\d+)?|\d{1,2}(\.\d+)?)\)?$/;
var latDMS = /^(([1-8]?\d)\D+([1-5]?\d|60)\D+([1-5]?\d|60)(\.\d+)?|90\D+0\D+0)\D+[NSns]?$/i;
var longDMS = /^\s*([1-7]?\d{1,2}\D+([1-5]?\d|60)\D+([1-5]?\d|60)(\.\d+)?|180\D+0\D+0)\D+[EWew]?$/i;
var defaultLatLongOptions = {
  checkDMS: false
};

function isLatLong(str, options) {
  (0, _assertString.default)(str);
  options = (0, _merge.default)(options, defaultLatLongOptions);
  if (!str.includes(',')) return false;
  var pair = str.split(',');
  if (pair[0].startsWith('(') && !pair[1].endsWith(')') || pair[1].endsWith(')') && !pair[0].startsWith('(')) return false;

  if (options.checkDMS) {
    return latDMS.test(pair[0]) && longDMS.test(pair[1]);
  }

  return lat.test(pair[0]) && long.test(pair[1]);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isLength;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

/* eslint-disable prefer-rest-params */
function isLength(str, options) {
  (0, _assertString.default)(str);
  var min;
  var max;

  if (_typeof(options) === 'object') {
    min = options.min || 0;
    max = options.max;
  } else {
    // backwards compatibility: isLength(str, min [, max])
    min = arguments[1] || 0;
    max = arguments[2];
  }

  var surrogatePairs = str.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g) || [];
  var len = str.length - surrogatePairs.length;
  return len >= min && (typeof max === 'undefined' || len <= max);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isLicensePlate;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var validators = {
  'cs-CZ': function csCZ(str) {
    return /^(([ABCDEFHKIJKLMNPRSTUVXYZ]|[0-9])-?){5,8}$/.test(str);
  },
  'de-DE': function deDE(str) {
    return /^((AW|UL|AK|GA|AÖ|LF|AZ|AM|AS|ZE|AN|AB|A|KG|KH|BA|EW|BZ|HY|KM|BT|HP|B|BC|BI|BO|FN|TT|ÜB|BN|AH|BS|FR|HB|ZZ|BB|BK|BÖ|OC|OK|CW|CE|C|CO|LH|CB|KW|LC|LN|DA|DI|DE|DH|SY|NÖ|DO|DD|DU|DN|D|EI|EA|EE|FI|EM|EL|EN|PF|ED|EF|ER|AU|ZP|E|ES|NT|EU|FL|FO|FT|FF|F|FS|FD|FÜ|GE|G|GI|GF|GS|ZR|GG|GP|GR|NY|ZI|GÖ|GZ|GT|HA|HH|HM|HU|WL|HZ|WR|RN|HK|HD|HN|HS|GK|HE|HF|RZ|HI|HG|HO|HX|IK|IL|IN|J|JL|KL|KA|KS|KF|KE|KI|KT|KO|KN|KR|KC|KU|K|LD|LL|LA|L|OP|LM|LI|LB|LU|LÖ|HL|LG|MD|GN|MZ|MA|ML|MR|MY|AT|DM|MC|NZ|RM|RG|MM|ME|MB|MI|FG|DL|HC|MW|RL|MK|MG|MÜ|WS|MH|M|MS|NU|NB|ND|NM|NK|NW|NR|NI|NF|DZ|EB|OZ|TG|TO|N|OA|GM|OB|CA|EH|FW|OF|OL|OE|OG|BH|LR|OS|AA|GD|OH|KY|NP|WK|PB|PA|PE|PI|PS|P|PM|PR|RA|RV|RE|R|H|SB|WN|RS|RD|RT|BM|NE|GV|RP|SU|GL|RO|GÜ|RH|EG|RW|PN|SK|MQ|RU|SZ|RI|SL|SM|SC|HR|FZ|VS|SW|SN|CR|SE|SI|SO|LP|SG|NH|SP|IZ|ST|BF|TE|HV|OD|SR|S|AC|DW|ZW|TF|TS|TR|TÜ|UM|PZ|TP|UE|UN|UH|MN|KK|VB|V|AE|PL|RC|VG|GW|PW|VR|VK|KB|WA|WT|BE|WM|WE|AP|MO|WW|FB|WZ|WI|WB|JE|WF|WO|W|WÜ|BL|Z|GC)[- ]?[A-Z]{1,2}[- ]?\d{1,4}|(AIC|FDB|ABG|SLN|SAW|KLZ|BUL|ESB|NAB|SUL|WST|ABI|AZE|BTF|KÖT|DKB|FEU|ROT|ALZ|SMÜ|WER|AUR|NOR|DÜW|BRK|HAB|TÖL|WOR|BAD|BAR|BER|BIW|EBS|KEM|MÜB|PEG|BGL|BGD|REI|WIL|BKS|BIR|WAT|BOR|BOH|BOT|BRB|BLK|HHM|NEB|NMB|WSF|LEO|HDL|WMS|WZL|BÜS|CHA|KÖZ|ROD|WÜM|CLP|NEC|COC|ZEL|COE|CUX|DAH|LDS|DEG|DEL|RSL|DLG|DGF|LAN|HEI|MED|DON|KIB|ROK|JÜL|MON|SLE|EBE|EIC|HIG|WBS|BIT|PRÜ|LIB|EMD|WIT|ERH|HÖS|ERZ|ANA|ASZ|MAB|MEK|STL|SZB|FDS|HCH|HOR|WOL|FRG|GRA|WOS|FRI|FFB|GAP|GER|BRL|CLZ|GTH|NOH|HGW|GRZ|LÖB|NOL|WSW|DUD|HMÜ|OHA|KRU|HAL|HAM|HBS|QLB|HVL|NAU|HAS|EBN|GEO|HOH|HDH|ERK|HER|WAN|HEF|ROF|HBN|ALF|HSK|USI|NAI|REH|SAN|KÜN|ÖHR|HOL|WAR|ARN|BRG|GNT|HOG|WOH|KEH|MAI|PAR|RID|ROL|KLE|GEL|KUS|KYF|ART|SDH|LDK|DIL|MAL|VIB|LER|BNA|GHA|GRM|MTL|WUR|LEV|LIF|STE|WEL|LIP|VAI|LUP|HGN|LBZ|LWL|PCH|STB|DAN|MKK|SLÜ|MSP|TBB|MGH|MTK|BIN|MSH|EIL|HET|SGH|BID|MYK|MSE|MST|MÜR|WRN|MEI|GRH|RIE|MZG|MIL|OBB|BED|FLÖ|MOL|FRW|SEE|SRB|AIB|MOS|BCH|ILL|SOB|NMS|NEA|SEF|UFF|NEW|VOH|NDH|TDO|NWM|GDB|GVM|WIS|NOM|EIN|GAN|LAU|HEB|OHV|OSL|SFB|ERB|LOS|BSK|KEL|BSB|MEL|WTL|OAL|FÜS|MOD|OHZ|OPR|BÜR|PAF|PLÖ|CAS|GLA|REG|VIT|ECK|SIM|GOA|EMS|DIZ|GOH|RÜD|SWA|NES|KÖN|MET|LRO|BÜZ|DBR|ROS|TET|HRO|ROW|BRV|HIP|PAN|GRI|SHK|EIS|SRO|SOK|LBS|SCZ|MER|QFT|SLF|SLS|HOM|SLK|ASL|BBG|SBK|SFT|SHG|MGN|MEG|ZIG|SAD|NEN|OVI|SHA|BLB|SIG|SON|SPN|FOR|GUB|SPB|IGB|WND|STD|STA|SDL|OBG|HST|BOG|SHL|PIR|FTL|SEB|SÖM|SÜW|TIR|SAB|TUT|ANG|SDT|LÜN|LSZ|MHL|VEC|VER|VIE|OVL|ANK|OVP|SBG|UEM|UER|WLG|GMN|NVP|RDG|RÜG|DAU|FKB|WAF|WAK|SLZ|WEN|SOG|APD|WUG|GUN|ESW|WIZ|WES|DIN|BRA|BÜD|WHV|HWI|GHC|WTM|WOB|WUN|MAK|SEL|OCH|HOT|WDA)[- ]?(([A-Z][- ]?\d{1,4})|([A-Z]{2}[- ]?\d{1,3})))[- ]?(E|H)?$/.test(str);
  },
  'de-LI': function deLI(str) {
    return /^FL[- ]?\d{1,5}[UZ]?$/.test(str);
  },
  'fi-FI': function fiFI(str) {
    return /^(?=.{4,7})(([A-Z]{1,3}|[0-9]{1,3})[\s-]?([A-Z]{1,3}|[0-9]{1,5}))$/.test(str);
  },
  'pt-PT': function ptPT(str) {
    return /^([A-Z]{2}|[0-9]{2})[ -·]?([A-Z]{2}|[0-9]{2})[ -·]?([A-Z]{2}|[0-9]{2})$/.test(str);
  },
  'sq-AL': function sqAL(str) {
    return /^[A-Z]{2}[- ]?((\d{3}[- ]?(([A-Z]{2})|T))|(R[- ]?\d{3}))$/.test(str);
  },
  'pt-BR': function ptBR(str) {
    return /^[A-Z]{3}[ -]?[0-9][A-Z][0-9]{2}|[A-Z]{3}[ -]?[0-9]{4}$/.test(str);
  }
};

function isLicensePlate(str, locale) {
  (0, _assertString.default)(str);

  if (locale in validators) {
    return validators[locale](str);
  } else if (locale === 'any') {
    for (var key in validators) {
      /* eslint guard-for-in: 0 */
      var validator = validators[key];

      if (validator(str)) {
        return true;
      }
    }

    return false;
  }

  throw new Error("Invalid locale '".concat(locale, "'"));
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isLocale;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var localeReg = /^[A-Za-z]{2,4}([_-]([A-Za-z]{4}|[\d]{3}))?([_-]([A-Za-z]{2}|[\d]{3}))?$/;

function isLocale(str) {
  (0, _assertString.default)(str);

  if (str === 'en_US_POSIX' || str === 'ca_ES_VALENCIA') {
    return true;
  }

  return localeReg.test(str);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isLowercase;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function isLowercase(str) {
  (0, _assertString.default)(str);
  return str === str.toLowerCase();
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isMACAddress;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var macAddress = /^(?:[0-9a-fA-F]{2}([-:\s]))([0-9a-fA-F]{2}\1){4}([0-9a-fA-F]{2})$/;
var macAddressNoSeparators = /^([0-9a-fA-F]){12}$/;
var macAddressWithDots = /^([0-9a-fA-F]{4}\.){2}([0-9a-fA-F]{4})$/;

function isMACAddress(str, options) {
  (0, _assertString.default)(str);
  /**
   * @deprecated `no_colons` TODO: remove it in the next major
  */

  if (options && (options.no_colons || options.no_separators)) {
    return macAddressNoSeparators.test(str);
  }

  return macAddress.test(str) || macAddressWithDots.test(str);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isMD5;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var md5 = /^[a-f0-9]{32}$/;

function isMD5(str) {
  (0, _assertString.default)(str);
  return md5.test(str);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isMagnetURI;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var magnetURI = /^magnet:\?xt(?:\.1)?=urn:(?:aich|bitprint|btih|ed2k|ed2khash|kzhash|md5|sha1|tree:tiger):[a-z0-9]{32}(?:[a-z0-9]{8})?($|&)/i;

function isMagnetURI(url) {
  (0, _assertString.default)(url);
  return magnetURI.test(url.trim());
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isMimeType;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/*
  Checks if the provided string matches to a correct Media type format (MIME type)

  This function only checks is the string format follows the
  etablished rules by the according RFC specifications.
  This function supports 'charset' in textual media types
  (https://tools.ietf.org/html/rfc6657).

  This function does not check against all the media types listed
  by the IANA (https://www.iana.org/assignments/media-types/media-types.xhtml)
  because of lightness purposes : it would require to include
  all these MIME types in this librairy, which would weigh it
  significantly. This kind of effort maybe is not worth for the use that
  this function has in this entire librairy.

  More informations in the RFC specifications :
  - https://tools.ietf.org/html/rfc2045
  - https://tools.ietf.org/html/rfc2046
  - https://tools.ietf.org/html/rfc7231#section-3.1.1.1
  - https://tools.ietf.org/html/rfc7231#section-3.1.1.5
*/
// Match simple MIME types
// NB :
//   Subtype length must not exceed 100 characters.
//   This rule does not comply to the RFC specs (what is the max length ?).
var mimeTypeSimple = /^(application|audio|font|image|message|model|multipart|text|video)\/[a-zA-Z0-9\.\-\+]{1,100}$/i; // eslint-disable-line max-len
// Handle "charset" in "text/*"

var mimeTypeText = /^text\/[a-zA-Z0-9\.\-\+]{1,100};\s?charset=("[a-zA-Z0-9\.\-\+\s]{0,70}"|[a-zA-Z0-9\.\-\+]{0,70})(\s?\([a-zA-Z0-9\.\-\+\s]{1,20}\))?$/i; // eslint-disable-line max-len
// Handle "boundary" in "multipart/*"

var mimeTypeMultipart = /^multipart\/[a-zA-Z0-9\.\-\+]{1,100}(;\s?(boundary|charset)=("[a-zA-Z0-9\.\-\+\s]{0,70}"|[a-zA-Z0-9\.\-\+]{0,70})(\s?\([a-zA-Z0-9\.\-\+\s]{1,20}\))?){0,2}$/i; // eslint-disable-line max-len

function isMimeType(str) {
  (0, _assertString.default)(str);
  return mimeTypeSimple.test(str) || mimeTypeText.test(str) || mimeTypeMultipart.test(str);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isMobilePhone;
exports.locales = void 0;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/* eslint-disable max-len */
var phones = {
  'am-AM': /^(\+?374|0)((10|[9|7][0-9])\d{6}$|[2-4]\d{7}$)/,
  'ar-AE': /^((\+?971)|0)?5[024568]\d{7}$/,
  'ar-BH': /^(\+?973)?(3|6)\d{7}$/,
  'ar-DZ': /^(\+?213|0)(5|6|7)\d{8}$/,
  'ar-LB': /^(\+?961)?((3|81)\d{6}|7\d{7})$/,
  'ar-EG': /^((\+?20)|0)?1[0125]\d{8}$/,
  'ar-IQ': /^(\+?964|0)?7[0-9]\d{8}$/,
  'ar-JO': /^(\+?962|0)?7[789]\d{7}$/,
  'ar-KW': /^(\+?965)[569]\d{7}$/,
  'ar-LY': /^((\+?218)|0)?(9[1-6]\d{7}|[1-8]\d{7,9})$/,
  'ar-MA': /^(?:(?:\+|00)212|0)[5-7]\d{8}$/,
  'ar-OM': /^((\+|00)968)?(9[1-9])\d{6}$/,
  'ar-PS': /^(\+?970|0)5[6|9](\d{7})$/,
  'ar-SA': /^(!?(\+?966)|0)?5\d{8}$/,
  'ar-SY': /^(!?(\+?963)|0)?9\d{8}$/,
  'ar-TN': /^(\+?216)?[2459]\d{7}$/,
  'az-AZ': /^(\+994|0)(5[015]|7[07]|99)\d{7}$/,
  'bs-BA': /^((((\+|00)3876)|06))((([0-3]|[5-6])\d{6})|(4\d{7}))$/,
  'be-BY': /^(\+?375)?(24|25|29|33|44)\d{7}$/,
  'bg-BG': /^(\+?359|0)?8[789]\d{7}$/,
  'bn-BD': /^(\+?880|0)1[13456789][0-9]{8}$/,
  'ca-AD': /^(\+376)?[346]\d{5}$/,
  'cs-CZ': /^(\+?420)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$/,
  'da-DK': /^(\+?45)?\s?\d{2}\s?\d{2}\s?\d{2}\s?\d{2}$/,
  'de-DE': /^((\+49|0)[1|3])([0|5][0-45-9]\d|6([23]|0\d?)|7([0-57-9]|6\d))\d{7,9}$/,
  'de-AT': /^(\+43|0)\d{1,4}\d{3,12}$/,
  'de-CH': /^(\+41|0)([1-9])\d{1,9}$/,
  'de-LU': /^(\+352)?((6\d1)\d{6})$/,
  'dv-MV': /^(\+?960)?(7[2-9]|91|9[3-9])\d{7}$/,
  'el-GR': /^(\+?30|0)?(69\d{8})$/,
  'en-AU': /^(\+?61|0)4\d{8}$/,
  'en-BM': /^(\+?1)?441(((3|7)\d{6}$)|(5[0-3][0-9]\d{4}$)|(59\d{5}))/,
  'en-GB': /^(\+?44|0)7\d{9}$/,
  'en-GG': /^(\+?44|0)1481\d{6}$/,
  'en-GH': /^(\+233|0)(20|50|24|54|27|57|26|56|23|28|55|59)\d{7}$/,
  'en-GY': /^(\+592|0)6\d{6}$/,
  'en-HK': /^(\+?852[-\s]?)?[456789]\d{3}[-\s]?\d{4}$/,
  'en-MO': /^(\+?853[-\s]?)?[6]\d{3}[-\s]?\d{4}$/,
  'en-IE': /^(\+?353|0)8[356789]\d{7}$/,
  'en-IN': /^(\+?91|0)?[6789]\d{9}$/,
  'en-KE': /^(\+?254|0)(7|1)\d{8}$/,
  'en-KI': /^((\+686|686)?)?( )?((6|7)(2|3|8)[0-9]{6})$/,
  'en-MT': /^(\+?356|0)?(99|79|77|21|27|22|25)[0-9]{6}$/,
  'en-MU': /^(\+?230|0)?\d{8}$/,
  'en-NA': /^(\+?264|0)(6|8)\d{7}$/,
  'en-NG': /^(\+?234|0)?[789]\d{9}$/,
  'en-NZ': /^(\+?64|0)[28]\d{7,9}$/,
  'en-PK': /^((00|\+)?92|0)3[0-6]\d{8}$/,
  'en-PH': /^(09|\+639)\d{9}$/,
  'en-RW': /^(\+?250|0)?[7]\d{8}$/,
  'en-SG': /^(\+65)?[3689]\d{7}$/,
  'en-SL': /^(\+?232|0)\d{8}$/,
  'en-TZ': /^(\+?255|0)?[67]\d{8}$/,
  'en-UG': /^(\+?256|0)?[7]\d{8}$/,
  'en-US': /^((\+1|1)?( |-)?)?(\([2-9][0-9]{2}\)|[2-9][0-9]{2})( |-)?([2-9][0-9]{2}( |-)?[0-9]{4})$/,
  'en-ZA': /^(\+?27|0)\d{9}$/,
  'en-ZM': /^(\+?26)?09[567]\d{7}$/,
  'en-ZW': /^(\+263)[0-9]{9}$/,
  'en-BW': /^(\+?267)?(7[1-8]{1})\d{6}$/,
  'es-AR': /^\+?549(11|[2368]\d)\d{8}$/,
  'es-BO': /^(\+?591)?(6|7)\d{7}$/,
  'es-CO': /^(\+?57)?3(0(0|1|2|4|5)|1\d|2[0-4]|5(0|1))\d{7}$/,
  'es-CL': /^(\+?56|0)[2-9]\d{1}\d{7}$/,
  'es-CR': /^(\+506)?[2-8]\d{7}$/,
  'es-CU': /^(\+53|0053)?5\d{7}/,
  'es-DO': /^(\+?1)?8[024]9\d{7}$/,
  'es-HN': /^(\+?504)?[9|8]\d{7}$/,
  'es-EC': /^(\+?593|0)([2-7]|9[2-9])\d{7}$/,
  'es-ES': /^(\+?34)?[6|7]\d{8}$/,
  'es-PE': /^(\+?51)?9\d{8}$/,
  'es-MX': /^(\+?52)?(1|01)?\d{10,11}$/,
  'es-PA': /^(\+?507)\d{7,8}$/,
  'es-PY': /^(\+?595|0)9[9876]\d{7}$/,
  'es-SV': /^(\+?503)?[67]\d{7}$/,
  'es-UY': /^(\+598|0)9[1-9][\d]{6}$/,
  'es-VE': /^(\+?58)?(2|4)\d{9}$/,
  'et-EE': /^(\+?372)?\s?(5|8[1-4])\s?([0-9]\s?){6,7}$/,
  'fa-IR': /^(\+?98[\-\s]?|0)9[0-39]\d[\-\s]?\d{3}[\-\s]?\d{4}$/,
  'fi-FI': /^(\+?358|0)\s?(4(0|1|2|4|5|6)?|50)\s?(\d\s?){4,8}\d$/,
  'fj-FJ': /^(\+?679)?\s?\d{3}\s?\d{4}$/,
  'fo-FO': /^(\+?298)?\s?\d{2}\s?\d{2}\s?\d{2}$/,
  'fr-BF': /^(\+226|0)[67]\d{7}$/,
  'fr-CM': /^(\+?237)6[0-9]{8}$/,
  'fr-FR': /^(\+?33|0)[67]\d{8}$/,
  'fr-GF': /^(\+?594|0|00594)[67]\d{8}$/,
  'fr-GP': /^(\+?590|0|00590)[67]\d{8}$/,
  'fr-MQ': /^(\+?596|0|00596)[67]\d{8}$/,
  'fr-PF': /^(\+?689)?8[789]\d{6}$/,
  'fr-RE': /^(\+?262|0|00262)[67]\d{8}$/,
  'he-IL': /^(\+972|0)([23489]|5[012345689]|77)[1-9]\d{6}$/,
  'hu-HU': /^(\+?36|06)(20|30|31|50|70)\d{7}$/,
  'id-ID': /^(\+?62|0)8(1[123456789]|2[1238]|3[1238]|5[12356789]|7[78]|9[56789]|8[123456789])([\s?|\d]{5,11})$/,
  'it-IT': /^(\+?39)?\s?3\d{2} ?\d{6,7}$/,
  'it-SM': /^((\+378)|(0549)|(\+390549)|(\+3780549))?6\d{5,9}$/,
  'ja-JP': /^(\+81[ \-]?(\(0\))?|0)[6789]0[ \-]?\d{4}[ \-]?\d{4}$/,
  'ka-GE': /^(\+?995)?(5|79)\d{7}$/,
  'kk-KZ': /^(\+?7|8)?7\d{9}$/,
  'kl-GL': /^(\+?299)?\s?\d{2}\s?\d{2}\s?\d{2}$/,
  'ko-KR': /^((\+?82)[ \-]?)?0?1([0|1|6|7|8|9]{1})[ \-]?\d{3,4}[ \-]?\d{4}$/,
  'lt-LT': /^(\+370|8)\d{8}$/,
  'lv-LV': /^(\+?371)2\d{7}$/,
  'ms-MY': /^(\+?6?01){1}(([0145]{1}(\-|\s)?\d{7,8})|([236789]{1}(\s|\-)?\d{7}))$/,
  'mz-MZ': /^(\+?258)?8[234567]\d{7}$/,
  'nb-NO': /^(\+?47)?[49]\d{7}$/,
  'ne-NP': /^(\+?977)?9[78]\d{8}$/,
  'nl-BE': /^(\+?32|0)4\d{8}$/,
  'nl-NL': /^(((\+|00)?31\(0\))|((\+|00)?31)|0)6{1}\d{8}$/,
  'nn-NO': /^(\+?47)?[49]\d{7}$/,
  'pl-PL': /^(\+?48)? ?[5-8]\d ?\d{3} ?\d{2} ?\d{2}$/,
  'pt-BR': /^((\+?55\ ?[1-9]{2}\ ?)|(\+?55\ ?\([1-9]{2}\)\ ?)|(0[1-9]{2}\ ?)|(\([1-9]{2}\)\ ?)|([1-9]{2}\ ?))((\d{4}\-?\d{4})|(9[2-9]{1}\d{3}\-?\d{4}))$/,
  'pt-PT': /^(\+?351)?9[1236]\d{7}$/,
  'pt-AO': /^(\+244)\d{9}$/,
  'ro-RO': /^(\+?4?0)\s?7\d{2}(\/|\s|\.|\-)?\d{3}(\s|\.|\-)?\d{3}$/,
  'ru-RU': /^(\+?7|8)?9\d{9}$/,
  'si-LK': /^(?:0|94|\+94)?(7(0|1|2|4|5|6|7|8)( |-)?)\d{7}$/,
  'sl-SI': /^(\+386\s?|0)(\d{1}\s?\d{3}\s?\d{2}\s?\d{2}|\d{2}\s?\d{3}\s?\d{3})$/,
  'sk-SK': /^(\+?421)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$/,
  'sq-AL': /^(\+355|0)6[789]\d{6}$/,
  'sr-RS': /^(\+3816|06)[- \d]{5,9}$/,
  'sv-SE': /^(\+?46|0)[\s\-]?7[\s\-]?[02369]([\s\-]?\d){7}$/,
  'tg-TJ': /^(\+?992)?[5][5]\d{7}$/,
  'th-TH': /^(\+66|66|0)\d{9}$/,
  'tr-TR': /^(\+?90|0)?5\d{9}$/,
  'tk-TM': /^(\+993|993|8)\d{8}$/,
  'uk-UA': /^(\+?38|8)?0\d{9}$/,
  'uz-UZ': /^(\+?998)?(6[125-79]|7[1-69]|88|9\d)\d{7}$/,
  'vi-VN': /^((\+?84)|0)((3([2-9]))|(5([25689]))|(7([0|6-9]))|(8([1-9]))|(9([0-9])))([0-9]{7})$/,
  'zh-CN': /^((\+|00)86)?(1[3-9]|9[28])\d{9}$/,
  'zh-TW': /^(\+?886\-?|0)?9\d{8}$/,
  'dz-BT': /^(\+?975|0)?(17|16|77|02)\d{6}$/
};
/* eslint-enable max-len */
// aliases

phones['en-CA'] = phones['en-US'];
phones['fr-CA'] = phones['en-CA'];
phones['fr-BE'] = phones['nl-BE'];
phones['zh-HK'] = phones['en-HK'];
phones['zh-MO'] = phones['en-MO'];
phones['ga-IE'] = phones['en-IE'];
phones['fr-CH'] = phones['de-CH'];
phones['it-CH'] = phones['fr-CH'];

function isMobilePhone(str, locale, options) {
  (0, _assertString.default)(str);

  if (options && options.strictMode && !str.startsWith('+')) {
    return false;
  }

  if (Array.isArray(locale)) {
    return locale.some(function (key) {
      // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
      // istanbul ignore else
      if (phones.hasOwnProperty(key)) {
        var phone = phones[key];

        if (phone.test(str)) {
          return true;
        }
      }

      return false;
    });
  } else if (locale in phones) {
    return phones[locale].test(str); // alias falsey locale as 'any'
  } else if (!locale || locale === 'any') {
    for (var key in phones) {
      // istanbul ignore else
      if (phones.hasOwnProperty(key)) {
        var phone = phones[key];

        if (phone.test(str)) {
          return true;
        }
      }
    }

    return false;
  }

  throw new Error("Invalid locale '".concat(locale, "'"));
}

var locales = Object.keys(phones);
exports.locales = locales;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isMongoId;

var _assertString = _interopRequireDefault(require("./util/assertString"));

var _isHexadecimal = _interopRequireDefault(require("./isHexadecimal"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function isMongoId(str) {
  (0, _assertString.default)(str);
  return (0, _isHexadecimal.default)(str) && str.length === 24;
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isMultibyte;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/* eslint-disable no-control-regex */
var multibyte = /[^\x00-\x7F]/;
/* eslint-enable no-control-regex */

function isMultibyte(str) {
  (0, _assertString.default)(str);
  return multibyte.test(str);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isNumeric;

var _assertString = _interopRequireDefault(require("./util/assertString"));

var _alpha = require("./alpha");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var numericNoSymbols = /^[0-9]+$/;

function isNumeric(str, options) {
  (0, _assertString.default)(str);

  if (options && options.no_symbols) {
    return numericNoSymbols.test(str);
  }

  return new RegExp("^[+-]?([0-9]*[".concat((options || {}).locale ? _alpha.decimal[options.locale] : '.', "])?[0-9]+$")).test(str);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isOctal;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var octal = /^(0o)?[0-7]+$/i;

function isOctal(str) {
  (0, _assertString.default)(str);
  return octal.test(str);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isPassportNumber;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/**
 * Reference:
 * https://en.wikipedia.org/ -- Wikipedia
 * https://docs.microsoft.com/en-us/microsoft-365/compliance/eu-passport-number -- EU Passport Number
 * https://countrycode.org/ -- Country Codes
 */
var passportRegexByCountryCode = {
  AM: /^[A-Z]{2}\d{7}$/,
  // ARMENIA
  AR: /^[A-Z]{3}\d{6}$/,
  // ARGENTINA
  AT: /^[A-Z]\d{7}$/,
  // AUSTRIA
  AU: /^[A-Z]\d{7}$/,
  // AUSTRALIA
  BE: /^[A-Z]{2}\d{6}$/,
  // BELGIUM
  BG: /^\d{9}$/,
  // BULGARIA
  BR: /^[A-Z]{2}\d{6}$/,
  // BRAZIL
  BY: /^[A-Z]{2}\d{7}$/,
  // BELARUS
  CA: /^[A-Z]{2}\d{6}$/,
  // CANADA
  CH: /^[A-Z]\d{7}$/,
  // SWITZERLAND
  CN: /^G\d{8}$|^E(?![IO])[A-Z0-9]\d{7}$/,
  // CHINA [G=Ordinary, E=Electronic] followed by 8-digits, or E followed by any UPPERCASE letter (except I and O) followed by 7 digits
  CY: /^[A-Z](\d{6}|\d{8})$/,
  // CYPRUS
  CZ: /^\d{8}$/,
  // CZECH REPUBLIC
  DE: /^[CFGHJKLMNPRTVWXYZ0-9]{9}$/,
  // GERMANY
  DK: /^\d{9}$/,
  // DENMARK
  DZ: /^\d{9}$/,
  // ALGERIA
  EE: /^([A-Z]\d{7}|[A-Z]{2}\d{7})$/,
  // ESTONIA (K followed by 7-digits), e-passports have 2 UPPERCASE followed by 7 digits
  ES: /^[A-Z0-9]{2}([A-Z0-9]?)\d{6}$/,
  // SPAIN
  FI: /^[A-Z]{2}\d{7}$/,
  // FINLAND
  FR: /^\d{2}[A-Z]{2}\d{5}$/,
  // FRANCE
  GB: /^\d{9}$/,
  // UNITED KINGDOM
  GR: /^[A-Z]{2}\d{7}$/,
  // GREECE
  HR: /^\d{9}$/,
  // CROATIA
  HU: /^[A-Z]{2}(\d{6}|\d{7})$/,
  // HUNGARY
  IE: /^[A-Z0-9]{2}\d{7}$/,
  // IRELAND
  IN: /^[A-Z]{1}-?\d{7}$/,
  // INDIA
  ID: /^[A-C]\d{7}$/,
  // INDONESIA
  IR: /^[A-Z]\d{8}$/,
  // IRAN
  IS: /^(A)\d{7}$/,
  // ICELAND
  IT: /^[A-Z0-9]{2}\d{7}$/,
  // ITALY
  JP: /^[A-Z]{2}\d{7}$/,
  // JAPAN
  KR: /^[MS]\d{8}$/,
  // SOUTH KOREA, REPUBLIC OF KOREA, [S=PS Passports, M=PM Passports]
  LT: /^[A-Z0-9]{8}$/,
  // LITHUANIA
  LU: /^[A-Z0-9]{8}$/,
  // LUXEMBURG
  LV: /^[A-Z0-9]{2}\d{7}$/,
  // LATVIA
  LY: /^[A-Z0-9]{8}$/,
  // LIBYA
  MT: /^\d{7}$/,
  // MALTA
  MZ: /^([A-Z]{2}\d{7})|(\d{2}[A-Z]{2}\d{5})$/,
  // MOZAMBIQUE
  MY: /^[AHK]\d{8}$/,
  // MALAYSIA
  NL: /^[A-Z]{2}[A-Z0-9]{6}\d$/,
  // NETHERLANDS
  PL: /^[A-Z]{2}\d{7}$/,
  // POLAND
  PT: /^[A-Z]\d{6}$/,
  // PORTUGAL
  RO: /^\d{8,9}$/,
  // ROMANIA
  RU: /^\d{9}$/,
  // RUSSIAN FEDERATION
  SE: /^\d{8}$/,
  // SWEDEN
  SL: /^(P)[A-Z]\d{7}$/,
  // SLOVANIA
  SK: /^[0-9A-Z]\d{7}$/,
  // SLOVAKIA
  TR: /^[A-Z]\d{8}$/,
  // TURKEY
  UA: /^[A-Z]{2}\d{6}$/,
  // UKRAINE
  US: /^\d{9}$/ // UNITED STATES

};
/**
 * Check if str is a valid passport number
 * relative to provided ISO Country Code.
 *
 * @param {string} str
 * @param {string} countryCode
 * @return {boolean}
 */

function isPassportNumber(str, countryCode) {
  (0, _assertString.default)(str);
  /** Remove All Whitespaces, Convert to UPPERCASE */

  var normalizedStr = str.replace(/\s/g, '').toUpperCase();
  return countryCode.toUpperCase() in passportRegexByCountryCode && passportRegexByCountryCode[countryCode].test(normalizedStr);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isPort;

var _isInt = _interopRequireDefault(require("./isInt"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function isPort(str) {
  return (0, _isInt.default)(str, {
    min: 0,
    max: 65535
  });
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isPostalCode;
exports.locales = void 0;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// common patterns
var threeDigit = /^\d{3}$/;
var fourDigit = /^\d{4}$/;
var fiveDigit = /^\d{5}$/;
var sixDigit = /^\d{6}$/;
var patterns = {
  AD: /^AD\d{3}$/,
  AT: fourDigit,
  AU: fourDigit,
  AZ: /^AZ\d{4}$/,
  BE: fourDigit,
  BG: fourDigit,
  BR: /^\d{5}-\d{3}$/,
  BY: /2[1-4]{1}\d{4}$/,
  CA: /^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][\s\-]?\d[ABCEGHJ-NPRSTV-Z]\d$/i,
  CH: fourDigit,
  CN: /^(0[1-7]|1[012356]|2[0-7]|3[0-6]|4[0-7]|5[1-7]|6[1-7]|7[1-5]|8[1345]|9[09])\d{4}$/,
  CZ: /^\d{3}\s?\d{2}$/,
  DE: fiveDigit,
  DK: fourDigit,
  DO: fiveDigit,
  DZ: fiveDigit,
  EE: fiveDigit,
  ES: /^(5[0-2]{1}|[0-4]{1}\d{1})\d{3}$/,
  FI: fiveDigit,
  FR: /^\d{2}\s?\d{3}$/,
  GB: /^(gir\s?0aa|[a-z]{1,2}\d[\da-z]?\s?(\d[a-z]{2})?)$/i,
  GR: /^\d{3}\s?\d{2}$/,
  HR: /^([1-5]\d{4}$)/,
  HT: /^HT\d{4}$/,
  HU: fourDigit,
  ID: fiveDigit,
  IE: /^(?!.*(?:o))[A-Za-z]\d[\dw]\s\w{4}$/i,
  IL: /^(\d{5}|\d{7})$/,
  IN: /^((?!10|29|35|54|55|65|66|86|87|88|89)[1-9][0-9]{5})$/,
  IR: /\b(?!(\d)\1{3})[13-9]{4}[1346-9][013-9]{5}\b/,
  IS: threeDigit,
  IT: fiveDigit,
  JP: /^\d{3}\-\d{4}$/,
  KE: fiveDigit,
  KR: /^(\d{5}|\d{6})$/,
  LI: /^(948[5-9]|949[0-7])$/,
  LT: /^LT\-\d{5}$/,
  LU: fourDigit,
  LV: /^LV\-\d{4}$/,
  LK: fiveDigit,
  MX: fiveDigit,
  MT: /^[A-Za-z]{3}\s{0,1}\d{4}$/,
  MY: fiveDigit,
  NL: /^\d{4}\s?[a-z]{2}$/i,
  NO: fourDigit,
  NP: /^(10|21|22|32|33|34|44|45|56|57)\d{3}$|^(977)$/i,
  NZ: fourDigit,
  PL: /^\d{2}\-\d{3}$/,
  PR: /^00[679]\d{2}([ -]\d{4})?$/,
  PT: /^\d{4}\-\d{3}?$/,
  RO: sixDigit,
  RU: sixDigit,
  SA: fiveDigit,
  SE: /^[1-9]\d{2}\s?\d{2}$/,
  SG: sixDigit,
  SI: fourDigit,
  SK: /^\d{3}\s?\d{2}$/,
  TH: fiveDigit,
  TN: fourDigit,
  TW: /^\d{3}(\d{2})?$/,
  UA: fiveDigit,
  US: /^\d{5}(-\d{4})?$/,
  ZA: fourDigit,
  ZM: fiveDigit
};
var locales = Object.keys(patterns);
exports.locales = locales;

function isPostalCode(str, locale) {
  (0, _assertString.default)(str);

  if (locale in patterns) {
    return patterns[locale].test(str);
  } else if (locale === 'any') {
    for (var key in patterns) {
      // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
      // istanbul ignore else
      if (patterns.hasOwnProperty(key)) {
        var pattern = patterns[key];

        if (pattern.test(str)) {
          return true;
        }
      }
    }

    return false;
  }

  throw new Error("Invalid locale '".concat(locale, "'"));
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isRFC3339;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/* Based on https://tools.ietf.org/html/rfc3339#section-5.6 */
var dateFullYear = /[0-9]{4}/;
var dateMonth = /(0[1-9]|1[0-2])/;
var dateMDay = /([12]\d|0[1-9]|3[01])/;
var timeHour = /([01][0-9]|2[0-3])/;
var timeMinute = /[0-5][0-9]/;
var timeSecond = /([0-5][0-9]|60)/;
var timeSecFrac = /(\.[0-9]+)?/;
var timeNumOffset = new RegExp("[-+]".concat(timeHour.source, ":").concat(timeMinute.source));
var timeOffset = new RegExp("([zZ]|".concat(timeNumOffset.source, ")"));
var partialTime = new RegExp("".concat(timeHour.source, ":").concat(timeMinute.source, ":").concat(timeSecond.source).concat(timeSecFrac.source));
var fullDate = new RegExp("".concat(dateFullYear.source, "-").concat(dateMonth.source, "-").concat(dateMDay.source));
var fullTime = new RegExp("".concat(partialTime.source).concat(timeOffset.source));
var rfc3339 = new RegExp("^".concat(fullDate.source, "[ tT]").concat(fullTime.source, "$"));

function isRFC3339(str) {
  (0, _assertString.default)(str);
  return rfc3339.test(str);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isRgbColor;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var rgbColor = /^rgb\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){2}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\)$/;
var rgbaColor = /^rgba\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)$/;
var rgbColorPercent = /^rgb\((([0-9]%|[1-9][0-9]%|100%),){2}([0-9]%|[1-9][0-9]%|100%)\)/;
var rgbaColorPercent = /^rgba\((([0-9]%|[1-9][0-9]%|100%),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)/;

function isRgbColor(str) {
  var includePercentValues = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
  (0, _assertString.default)(str);

  if (!includePercentValues) {
    return rgbColor.test(str) || rgbaColor.test(str);
  }

  return rgbColor.test(str) || rgbaColor.test(str) || rgbColorPercent.test(str) || rgbaColorPercent.test(str);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isSemVer;

var _assertString = _interopRequireDefault(require("./util/assertString"));

var _multilineRegex = _interopRequireDefault(require("./util/multilineRegex"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/**
 * Regular Expression to match
 * semantic versioning (SemVer)
 * built from multi-line, multi-parts regexp
 * Reference: https://semver.org/
 */
var semanticVersioningRegex = (0, _multilineRegex.default)(['^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)', '(?:-((?:0|[1-9]\\d*|\\d*[a-z-][0-9a-z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-z-][0-9a-z-]*))*))', '?(?:\\+([0-9a-z-]+(?:\\.[0-9a-z-]+)*))?$'], 'i');

function isSemVer(str) {
  (0, _assertString.default)(str);
  return semanticVersioningRegex.test(str);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isSlug;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var charsetRegex = /^[^\s-_](?!.*?[-_]{2,})[a-z0-9-\\][^\s]*[^-_\s]$/;

function isSlug(str) {
  (0, _assertString.default)(str);
  return charsetRegex.test(str);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isStrongPassword;

var _merge = _interopRequireDefault(require("./util/merge"));

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var upperCaseRegex = /^[A-Z]$/;
var lowerCaseRegex = /^[a-z]$/;
var numberRegex = /^[0-9]$/;
var symbolRegex = /^[-#!$@%^&*()_+|~=`{}\[\]:";'<>?,.\/ ]$/;
var defaultOptions = {
  minLength: 8,
  minLowercase: 1,
  minUppercase: 1,
  minNumbers: 1,
  minSymbols: 1,
  returnScore: false,
  pointsPerUnique: 1,
  pointsPerRepeat: 0.5,
  pointsForContainingLower: 10,
  pointsForContainingUpper: 10,
  pointsForContainingNumber: 10,
  pointsForContainingSymbol: 10
};
/* Counts number of occurrences of each char in a string
 * could be moved to util/ ?
*/

function countChars(str) {
  var result = {};
  Array.from(str).forEach(function (char) {
    var curVal = result[char];

    if (curVal) {
      result[char] += 1;
    } else {
      result[char] = 1;
    }
  });
  return result;
}
/* Return information about a password */


function analyzePassword(password) {
  var charMap = countChars(password);
  var analysis = {
    length: password.length,
    uniqueChars: Object.keys(charMap).length,
    uppercaseCount: 0,
    lowercaseCount: 0,
    numberCount: 0,
    symbolCount: 0
  };
  Object.keys(charMap).forEach(function (char) {
    /* istanbul ignore else */
    if (upperCaseRegex.test(char)) {
      analysis.uppercaseCount += charMap[char];
    } else if (lowerCaseRegex.test(char)) {
      analysis.lowercaseCount += charMap[char];
    } else if (numberRegex.test(char)) {
      analysis.numberCount += charMap[char];
    } else if (symbolRegex.test(char)) {
      analysis.symbolCount += charMap[char];
    }
  });
  return analysis;
}

function scorePassword(analysis, scoringOptions) {
  var points = 0;
  points += analysis.uniqueChars * scoringOptions.pointsPerUnique;
  points += (analysis.length - analysis.uniqueChars) * scoringOptions.pointsPerRepeat;

  if (analysis.lowercaseCount > 0) {
    points += scoringOptions.pointsForContainingLower;
  }

  if (analysis.uppercaseCount > 0) {
    points += scoringOptions.pointsForContainingUpper;
  }

  if (analysis.numberCount > 0) {
    points += scoringOptions.pointsForContainingNumber;
  }

  if (analysis.symbolCount > 0) {
    points += scoringOptions.pointsForContainingSymbol;
  }

  return points;
}

function isStrongPassword(str) {
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
  (0, _assertString.default)(str);
  var analysis = analyzePassword(str);
  options = (0, _merge.default)(options || {}, defaultOptions);

  if (options.returnScore) {
    return scorePassword(analysis, options);
  }

  return analysis.length >= options.minLength && analysis.lowercaseCount >= options.minLowercase && analysis.uppercaseCount >= options.minUppercase && analysis.numberCount >= options.minNumbers && analysis.symbolCount >= options.minSymbols;
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isSurrogatePair;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var surrogatePair = /[\uD800-\uDBFF][\uDC00-\uDFFF]/;

function isSurrogatePair(str) {
  (0, _assertString.default)(str);
  return surrogatePair.test(str);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isTaxID;

var _assertString = _interopRequireDefault(require("./util/assertString"));

var algorithms = _interopRequireWildcard(require("./util/algorithms"));

var _isDate = _interopRequireDefault(require("./isDate"));

function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }

function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }

function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }

function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }

/**
 * TIN Validation
 * Validates Tax Identification Numbers (TINs) from the US, EU member states and the United Kingdom.
 *
 * EU-UK:
 * National TIN validity is calculated using public algorithms as made available by DG TAXUD.
 *
 * See `https://ec.europa.eu/taxation_customs/tin/specs/FS-TIN%20Algorithms-Public.docx` for more information.
 *
 * US:
 * An Employer Identification Number (EIN), also known as a Federal Tax Identification Number,
 *  is used to identify a business entity.
 *
 * NOTES:
 *  - Prefix 47 is being reserved for future use
 *  - Prefixes 26, 27, 45, 46 and 47 were previously assigned by the Philadelphia campus.
 *
 * See `http://www.irs.gov/Businesses/Small-Businesses-&-Self-Employed/How-EINs-are-Assigned-and-Valid-EIN-Prefixes`
 * for more information.
 */
// Locale functions

/*
 * bg-BG validation function
 * (Edinen graždanski nomer (EGN/ЕГН), persons only)
 * Checks if birth date (first six digits) is valid and calculates check (last) digit
 */
function bgBgCheck(tin) {
  // Extract full year, normalize month and check birth date validity
  var century_year = tin.slice(0, 2);
  var month = parseInt(tin.slice(2, 4), 10);

  if (month > 40) {
    month -= 40;
    century_year = "20".concat(century_year);
  } else if (month > 20) {
    month -= 20;
    century_year = "18".concat(century_year);
  } else {
    century_year = "19".concat(century_year);
  }

  if (month < 10) {
    month = "0".concat(month);
  }

  var date = "".concat(century_year, "/").concat(month, "/").concat(tin.slice(4, 6));

  if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {
    return false;
  } // split digits into an array for further processing


  var digits = tin.split('').map(function (a) {
    return parseInt(a, 10);
  }); // Calculate checksum by multiplying digits with fixed values

  var multip_lookup = [2, 4, 8, 5, 10, 9, 7, 3, 6];
  var checksum = 0;

  for (var i = 0; i < multip_lookup.length; i++) {
    checksum += digits[i] * multip_lookup[i];
  }

  checksum = checksum % 11 === 10 ? 0 : checksum % 11;
  return checksum === digits[9];
}
/*
 * cs-CZ validation function
 * (Rodné číslo (RČ), persons only)
 * Checks if birth date (first six digits) is valid and divisibility by 11
 * Material not in DG TAXUD document sourced from:
 * -`https://lorenc.info/3MA381/overeni-spravnosti-rodneho-cisla.htm`
 * -`https://www.mvcr.cz/clanek/rady-a-sluzby-dokumenty-rodne-cislo.aspx`
 */


function csCzCheck(tin) {
  tin = tin.replace(/\W/, ''); // Extract full year from TIN length

  var full_year = parseInt(tin.slice(0, 2), 10);

  if (tin.length === 10) {
    if (full_year < 54) {
      full_year = "20".concat(full_year);
    } else {
      full_year = "19".concat(full_year);
    }
  } else {
    if (tin.slice(6) === '000') {
      return false;
    } // Three-zero serial not assigned before 1954


    if (full_year < 54) {
      full_year = "19".concat(full_year);
    } else {
      return false; // No 18XX years seen in any of the resources
    }
  } // Add missing zero if needed


  if (full_year.length === 3) {
    full_year = [full_year.slice(0, 2), '0', full_year.slice(2)].join('');
  } // Extract month from TIN and normalize


  var month = parseInt(tin.slice(2, 4), 10);

  if (month > 50) {
    month -= 50;
  }

  if (month > 20) {
    // Month-plus-twenty was only introduced in 2004
    if (parseInt(full_year, 10) < 2004) {
      return false;
    }

    month -= 20;
  }

  if (month < 10) {
    month = "0".concat(month);
  } // Check date validity


  var date = "".concat(full_year, "/").concat(month, "/").concat(tin.slice(4, 6));

  if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {
    return false;
  } // Verify divisibility by 11


  if (tin.length === 10) {
    if (parseInt(tin, 10) % 11 !== 0) {
      // Some numbers up to and including 1985 are still valid if
      // check (last) digit equals 0 and modulo of first 9 digits equals 10
      var checkdigit = parseInt(tin.slice(0, 9), 10) % 11;

      if (parseInt(full_year, 10) < 1986 && checkdigit === 10) {
        if (parseInt(tin.slice(9), 10) !== 0) {
          return false;
        }
      } else {
        return false;
      }
    }
  }

  return true;
}
/*
 * de-AT validation function
 * (Abgabenkontonummer, persons/entities)
 * Verify TIN validity by calling luhnCheck()
 */


function deAtCheck(tin) {
  return algorithms.luhnCheck(tin);
}
/*
 * de-DE validation function
 * (Steueridentifikationsnummer (Steuer-IdNr.), persons only)
 * Tests for single duplicate/triplicate value, then calculates ISO 7064 check (last) digit
 * Partial implementation of spec (same result with both algorithms always)
 */


function deDeCheck(tin) {
  // Split digits into an array for further processing
  var digits = tin.split('').map(function (a) {
    return parseInt(a, 10);
  }); // Fill array with strings of number positions

  var occurences = [];

  for (var i = 0; i < digits.length - 1; i++) {
    occurences.push('');

    for (var j = 0; j < digits.length - 1; j++) {
      if (digits[i] === digits[j]) {
        occurences[i] += j;
      }
    }
  } // Remove digits with one occurence and test for only one duplicate/triplicate


  occurences = occurences.filter(function (a) {
    return a.length > 1;
  });

  if (occurences.length !== 2 && occurences.length !== 3) {
    return false;
  } // In case of triplicate value only two digits are allowed next to each other


  if (occurences[0].length === 3) {
    var trip_locations = occurences[0].split('').map(function (a) {
      return parseInt(a, 10);
    });
    var recurrent = 0; // Amount of neighbour occurences

    for (var _i = 0; _i < trip_locations.length - 1; _i++) {
      if (trip_locations[_i] + 1 === trip_locations[_i + 1]) {
        recurrent += 1;
      }
    }

    if (recurrent === 2) {
      return false;
    }
  }

  return algorithms.iso7064Check(tin);
}
/*
 * dk-DK validation function
 * (CPR-nummer (personnummer), persons only)
 * Checks if birth date (first six digits) is valid and assigned to century (seventh) digit,
 * and calculates check (last) digit
 */


function dkDkCheck(tin) {
  tin = tin.replace(/\W/, ''); // Extract year, check if valid for given century digit and add century

  var year = parseInt(tin.slice(4, 6), 10);
  var century_digit = tin.slice(6, 7);

  switch (century_digit) {
    case '0':
    case '1':
    case '2':
    case '3':
      year = "19".concat(year);
      break;

    case '4':
    case '9':
      if (year < 37) {
        year = "20".concat(year);
      } else {
        year = "19".concat(year);
      }

      break;

    default:
      if (year < 37) {
        year = "20".concat(year);
      } else if (year > 58) {
        year = "18".concat(year);
      } else {
        return false;
      }

      break;
  } // Add missing zero if needed


  if (year.length === 3) {
    year = [year.slice(0, 2), '0', year.slice(2)].join('');
  } // Check date validity


  var date = "".concat(year, "/").concat(tin.slice(2, 4), "/").concat(tin.slice(0, 2));

  if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {
    return false;
  } // Split digits into an array for further processing


  var digits = tin.split('').map(function (a) {
    return parseInt(a, 10);
  });
  var checksum = 0;
  var weight = 4; // Multiply by weight and add to checksum

  for (var i = 0; i < 9; i++) {
    checksum += digits[i] * weight;
    weight -= 1;

    if (weight === 1) {
      weight = 7;
    }
  }

  checksum %= 11;

  if (checksum === 1) {
    return false;
  }

  return checksum === 0 ? digits[9] === 0 : digits[9] === 11 - checksum;
}
/*
 * el-CY validation function
 * (Arithmos Forologikou Mitroou (AFM/ΑΦΜ), persons only)
 * Verify TIN validity by calculating ASCII value of check (last) character
 */


function elCyCheck(tin) {
  // split digits into an array for further processing
  var digits = tin.slice(0, 8).split('').map(function (a) {
    return parseInt(a, 10);
  });
  var checksum = 0; // add digits in even places

  for (var i = 1; i < digits.length; i += 2) {
    checksum += digits[i];
  } // add digits in odd places


  for (var _i2 = 0; _i2 < digits.length; _i2 += 2) {
    if (digits[_i2] < 2) {
      checksum += 1 - digits[_i2];
    } else {
      checksum += 2 * (digits[_i2] - 2) + 5;

      if (digits[_i2] > 4) {
        checksum += 2;
      }
    }
  }

  return String.fromCharCode(checksum % 26 + 65) === tin.charAt(8);
}
/*
 * el-GR validation function
 * (Arithmos Forologikou Mitroou (AFM/ΑΦΜ), persons/entities)
 * Verify TIN validity by calculating check (last) digit
 * Algorithm not in DG TAXUD document- sourced from:
 * - `http://epixeirisi.gr/%CE%9A%CE%A1%CE%99%CE%A3%CE%99%CE%9C%CE%91-%CE%98%CE%95%CE%9C%CE%91%CE%A4%CE%91-%CE%A6%CE%9F%CE%A1%CE%9F%CE%9B%CE%9F%CE%93%CE%99%CE%91%CE%A3-%CE%9A%CE%91%CE%99-%CE%9B%CE%9F%CE%93%CE%99%CE%A3%CE%A4%CE%99%CE%9A%CE%97%CE%A3/23791/%CE%91%CF%81%CE%B9%CE%B8%CE%BC%CF%8C%CF%82-%CE%A6%CE%BF%CF%81%CE%BF%CE%BB%CE%BF%CE%B3%CE%B9%CE%BA%CE%BF%CF%8D-%CE%9C%CE%B7%CF%84%CF%81%CF%8E%CE%BF%CF%85`
 */


function elGrCheck(tin) {
  // split digits into an array for further processing
  var digits = tin.split('').map(function (a) {
    return parseInt(a, 10);
  });
  var checksum = 0;

  for (var i = 0; i < 8; i++) {
    checksum += digits[i] * Math.pow(2, 8 - i);
  }

  return checksum % 11 % 10 === digits[8];
}
/*
 * en-GB validation function (should go here if needed)
 * (National Insurance Number (NINO) or Unique Taxpayer Reference (UTR),
 * persons/entities respectively)
 */

/*
 * en-IE validation function
 * (Personal Public Service Number (PPS No), persons only)
 * Verify TIN validity by calculating check (second to last) character
 */


function enIeCheck(tin) {
  var checksum = algorithms.reverseMultiplyAndSum(tin.split('').slice(0, 7).map(function (a) {
    return parseInt(a, 10);
  }), 8);

  if (tin.length === 9 && tin[8] !== 'W') {
    checksum += (tin[8].charCodeAt(0) - 64) * 9;
  }

  checksum %= 23;

  if (checksum === 0) {
    return tin[7].toUpperCase() === 'W';
  }

  return tin[7].toUpperCase() === String.fromCharCode(64 + checksum);
} // Valid US IRS campus prefixes


var enUsCampusPrefix = {
  andover: ['10', '12'],
  atlanta: ['60', '67'],
  austin: ['50', '53'],
  brookhaven: ['01', '02', '03', '04', '05', '06', '11', '13', '14', '16', '21', '22', '23', '25', '34', '51', '52', '54', '55', '56', '57', '58', '59', '65'],
  cincinnati: ['30', '32', '35', '36', '37', '38', '61'],
  fresno: ['15', '24'],
  internet: ['20', '26', '27', '45', '46', '47'],
  kansas: ['40', '44'],
  memphis: ['94', '95'],
  ogden: ['80', '90'],
  philadelphia: ['33', '39', '41', '42', '43', '46', '48', '62', '63', '64', '66', '68', '71', '72', '73', '74', '75', '76', '77', '81', '82', '83', '84', '85', '86', '87', '88', '91', '92', '93', '98', '99'],
  sba: ['31']
}; // Return an array of all US IRS campus prefixes

function enUsGetPrefixes() {
  var prefixes = [];

  for (var location in enUsCampusPrefix) {
    // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
    // istanbul ignore else
    if (enUsCampusPrefix.hasOwnProperty(location)) {
      prefixes.push.apply(prefixes, _toConsumableArray(enUsCampusPrefix[location]));
    }
  }

  return prefixes;
}
/*
 * en-US validation function
 * Verify that the TIN starts with a valid IRS campus prefix
 */


function enUsCheck(tin) {
  return enUsGetPrefixes().indexOf(tin.substr(0, 2)) !== -1;
}
/*
 * es-ES validation function
 * (Documento Nacional de Identidad (DNI)
 * or Número de Identificación de Extranjero (NIE), persons only)
 * Verify TIN validity by calculating check (last) character
 */


function esEsCheck(tin) {
  // Split characters into an array for further processing
  var chars = tin.toUpperCase().split(''); // Replace initial letter if needed

  if (isNaN(parseInt(chars[0], 10)) && chars.length > 1) {
    var lead_replace = 0;

    switch (chars[0]) {
      case 'Y':
        lead_replace = 1;
        break;

      case 'Z':
        lead_replace = 2;
        break;

      default:
    }

    chars.splice(0, 1, lead_replace); // Fill with zeros if smaller than proper
  } else {
    while (chars.length < 9) {
      chars.unshift(0);
    }
  } // Calculate checksum and check according to lookup


  var lookup = ['T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E'];
  chars = chars.join('');
  var checksum = parseInt(chars.slice(0, 8), 10) % 23;
  return chars[8] === lookup[checksum];
}
/*
 * et-EE validation function
 * (Isikukood (IK), persons only)
 * Checks if birth date (century digit and six following) is valid and calculates check (last) digit
 * Material not in DG TAXUD document sourced from:
 * - `https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Estonia-TIN.pdf`
 */


function etEeCheck(tin) {
  // Extract year and add century
  var full_year = tin.slice(1, 3);
  var century_digit = tin.slice(0, 1);

  switch (century_digit) {
    case '1':
    case '2':
      full_year = "18".concat(full_year);
      break;

    case '3':
    case '4':
      full_year = "19".concat(full_year);
      break;

    default:
      full_year = "20".concat(full_year);
      break;
  } // Check date validity


  var date = "".concat(full_year, "/").concat(tin.slice(3, 5), "/").concat(tin.slice(5, 7));

  if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {
    return false;
  } // Split digits into an array for further processing


  var digits = tin.split('').map(function (a) {
    return parseInt(a, 10);
  });
  var checksum = 0;
  var weight = 1; // Multiply by weight and add to checksum

  for (var i = 0; i < 10; i++) {
    checksum += digits[i] * weight;
    weight += 1;

    if (weight === 10) {
      weight = 1;
    }
  } // Do again if modulo 11 of checksum is 10


  if (checksum % 11 === 10) {
    checksum = 0;
    weight = 3;

    for (var _i3 = 0; _i3 < 10; _i3++) {
      checksum += digits[_i3] * weight;
      weight += 1;

      if (weight === 10) {
        weight = 1;
      }
    }

    if (checksum % 11 === 10) {
      return digits[10] === 0;
    }
  }

  return checksum % 11 === digits[10];
}
/*
 * fi-FI validation function
 * (Henkilötunnus (HETU), persons only)
 * Checks if birth date (first six digits plus century symbol) is valid
 * and calculates check (last) digit
 */


function fiFiCheck(tin) {
  // Extract year and add century
  var full_year = tin.slice(4, 6);
  var century_symbol = tin.slice(6, 7);

  switch (century_symbol) {
    case '+':
      full_year = "18".concat(full_year);
      break;

    case '-':
      full_year = "19".concat(full_year);
      break;

    default:
      full_year = "20".concat(full_year);
      break;
  } // Check date validity


  var date = "".concat(full_year, "/").concat(tin.slice(2, 4), "/").concat(tin.slice(0, 2));

  if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {
    return false;
  } // Calculate check character


  var checksum = parseInt(tin.slice(0, 6) + tin.slice(7, 10), 10) % 31;

  if (checksum < 10) {
    return checksum === parseInt(tin.slice(10), 10);
  }

  checksum -= 10;
  var letters_lookup = ['A', 'B', 'C', 'D', 'E', 'F', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y'];
  return letters_lookup[checksum] === tin.slice(10);
}
/*
 * fr/nl-BE validation function
 * (Numéro national (N.N.), persons only)
 * Checks if birth date (first six digits) is valid and calculates check (last two) digits
 */


function frBeCheck(tin) {
  // Zero month/day value is acceptable
  if (tin.slice(2, 4) !== '00' || tin.slice(4, 6) !== '00') {
    // Extract date from first six digits of TIN
    var date = "".concat(tin.slice(0, 2), "/").concat(tin.slice(2, 4), "/").concat(tin.slice(4, 6));

    if (!(0, _isDate.default)(date, 'YY/MM/DD')) {
      return false;
    }
  }

  var checksum = 97 - parseInt(tin.slice(0, 9), 10) % 97;
  var checkdigits = parseInt(tin.slice(9, 11), 10);

  if (checksum !== checkdigits) {
    checksum = 97 - parseInt("2".concat(tin.slice(0, 9)), 10) % 97;

    if (checksum !== checkdigits) {
      return false;
    }
  }

  return true;
}
/*
 * fr-FR validation function
 * (Numéro fiscal de référence (numéro SPI), persons only)
 * Verify TIN validity by calculating check (last three) digits
 */


function frFrCheck(tin) {
  tin = tin.replace(/\s/g, '');
  var checksum = parseInt(tin.slice(0, 10), 10) % 511;
  var checkdigits = parseInt(tin.slice(10, 13), 10);
  return checksum === checkdigits;
}
/*
 * fr/lb-LU validation function
 * (numéro d’identification personnelle, persons only)
 * Verify birth date validity and run Luhn and Verhoeff checks
 */


function frLuCheck(tin) {
  // Extract date and check validity
  var date = "".concat(tin.slice(0, 4), "/").concat(tin.slice(4, 6), "/").concat(tin.slice(6, 8));

  if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {
    return false;
  } // Run Luhn check


  if (!algorithms.luhnCheck(tin.slice(0, 12))) {
    return false;
  } // Remove Luhn check digit and run Verhoeff check


  return algorithms.verhoeffCheck("".concat(tin.slice(0, 11)).concat(tin[12]));
}
/*
 * hr-HR validation function
 * (Osobni identifikacijski broj (OIB), persons/entities)
 * Verify TIN validity by calling iso7064Check(digits)
 */


function hrHrCheck(tin) {
  return algorithms.iso7064Check(tin);
}
/*
 * hu-HU validation function
 * (Adóazonosító jel, persons only)
 * Verify TIN validity by calculating check (last) digit
 */


function huHuCheck(tin) {
  // split digits into an array for further processing
  var digits = tin.split('').map(function (a) {
    return parseInt(a, 10);
  });
  var checksum = 8;

  for (var i = 1; i < 9; i++) {
    checksum += digits[i] * (i + 1);
  }

  return checksum % 11 === digits[9];
}
/*
 * lt-LT validation function (should go here if needed)
 * (Asmens kodas, persons/entities respectively)
 * Current validation check is alias of etEeCheck- same format applies
 */

/*
 * it-IT first/last name validity check
 * Accepts it-IT TIN-encoded names as a three-element character array and checks their validity
 * Due to lack of clarity between resources ("Are only Italian consonants used?
 * What happens if a person has X in their name?" etc.) only two test conditions
 * have been implemented:
 * Vowels may only be followed by other vowels or an X character
 * and X characters after vowels may only be followed by other X characters.
 */


function itItNameCheck(name) {
  // true at the first occurence of a vowel
  var vowelflag = false; // true at the first occurence of an X AFTER vowel
  // (to properly handle last names with X as consonant)

  var xflag = false;

  for (var i = 0; i < 3; i++) {
    if (!vowelflag && /[AEIOU]/.test(name[i])) {
      vowelflag = true;
    } else if (!xflag && vowelflag && name[i] === 'X') {
      xflag = true;
    } else if (i > 0) {
      if (vowelflag && !xflag) {
        if (!/[AEIOU]/.test(name[i])) {
          return false;
        }
      }

      if (xflag) {
        if (!/X/.test(name[i])) {
          return false;
        }
      }
    }
  }

  return true;
}
/*
 * it-IT validation function
 * (Codice fiscale (TIN-IT), persons only)
 * Verify name, birth date and codice catastale validity
 * and calculate check character.
 * Material not in DG-TAXUD document sourced from:
 * `https://en.wikipedia.org/wiki/Italian_fiscal_code`
 */


function itItCheck(tin) {
  // Capitalize and split characters into an array for further processing
  var chars = tin.toUpperCase().split(''); // Check first and last name validity calling itItNameCheck()

  if (!itItNameCheck(chars.slice(0, 3))) {
    return false;
  }

  if (!itItNameCheck(chars.slice(3, 6))) {
    return false;
  } // Convert letters in number spaces back to numbers if any


  var number_locations = [6, 7, 9, 10, 12, 13, 14];
  var number_replace = {
    L: '0',
    M: '1',
    N: '2',
    P: '3',
    Q: '4',
    R: '5',
    S: '6',
    T: '7',
    U: '8',
    V: '9'
  };

  for (var _i4 = 0, _number_locations = number_locations; _i4 < _number_locations.length; _i4++) {
    var i = _number_locations[_i4];

    if (chars[i] in number_replace) {
      chars.splice(i, 1, number_replace[chars[i]]);
    }
  } // Extract month and day, and check date validity


  var month_replace = {
    A: '01',
    B: '02',
    C: '03',
    D: '04',
    E: '05',
    H: '06',
    L: '07',
    M: '08',
    P: '09',
    R: '10',
    S: '11',
    T: '12'
  };
  var month = month_replace[chars[8]];
  var day = parseInt(chars[9] + chars[10], 10);

  if (day > 40) {
    day -= 40;
  }

  if (day < 10) {
    day = "0".concat(day);
  }

  var date = "".concat(chars[6]).concat(chars[7], "/").concat(month, "/").concat(day);

  if (!(0, _isDate.default)(date, 'YY/MM/DD')) {
    return false;
  } // Calculate check character by adding up even and odd characters as numbers


  var checksum = 0;

  for (var _i5 = 1; _i5 < chars.length - 1; _i5 += 2) {
    var char_to_int = parseInt(chars[_i5], 10);

    if (isNaN(char_to_int)) {
      char_to_int = chars[_i5].charCodeAt(0) - 65;
    }

    checksum += char_to_int;
  }

  var odd_convert = {
    // Maps of characters at odd places
    A: 1,
    B: 0,
    C: 5,
    D: 7,
    E: 9,
    F: 13,
    G: 15,
    H: 17,
    I: 19,
    J: 21,
    K: 2,
    L: 4,
    M: 18,
    N: 20,
    O: 11,
    P: 3,
    Q: 6,
    R: 8,
    S: 12,
    T: 14,
    U: 16,
    V: 10,
    W: 22,
    X: 25,
    Y: 24,
    Z: 23,
    0: 1,
    1: 0
  };

  for (var _i6 = 0; _i6 < chars.length - 1; _i6 += 2) {
    var _char_to_int = 0;

    if (chars[_i6] in odd_convert) {
      _char_to_int = odd_convert[chars[_i6]];
    } else {
      var multiplier = parseInt(chars[_i6], 10);
      _char_to_int = 2 * multiplier + 1;

      if (multiplier > 4) {
        _char_to_int += 2;
      }
    }

    checksum += _char_to_int;
  }

  if (String.fromCharCode(65 + checksum % 26) !== chars[15]) {
    return false;
  }

  return true;
}
/*
 * lv-LV validation function
 * (Personas kods (PK), persons only)
 * Check validity of birth date and calculate check (last) digit
 * Support only for old format numbers (not starting with '32', issued before 2017/07/01)
 * Material not in DG TAXUD document sourced from:
 * `https://boot.ritakafija.lv/forums/index.php?/topic/88314-personas-koda-algoritms-%C4%8Deksumma/`
 */


function lvLvCheck(tin) {
  tin = tin.replace(/\W/, ''); // Extract date from TIN

  var day = tin.slice(0, 2);

  if (day !== '32') {
    // No date/checksum check if new format
    var month = tin.slice(2, 4);

    if (month !== '00') {
      // No date check if unknown month
      var full_year = tin.slice(4, 6);

      switch (tin[6]) {
        case '0':
          full_year = "18".concat(full_year);
          break;

        case '1':
          full_year = "19".concat(full_year);
          break;

        default:
          full_year = "20".concat(full_year);
          break;
      } // Check date validity


      var date = "".concat(full_year, "/").concat(tin.slice(2, 4), "/").concat(day);

      if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {
        return false;
      }
    } // Calculate check digit


    var checksum = 1101;
    var multip_lookup = [1, 6, 3, 7, 9, 10, 5, 8, 4, 2];

    for (var i = 0; i < tin.length - 1; i++) {
      checksum -= parseInt(tin[i], 10) * multip_lookup[i];
    }

    return parseInt(tin[10], 10) === checksum % 11;
  }

  return true;
}
/*
 * mt-MT validation function
 * (Identity Card Number or Unique Taxpayer Reference, persons/entities)
 * Verify Identity Card Number structure (no other tests found)
 */


function mtMtCheck(tin) {
  if (tin.length !== 9) {
    // No tests for UTR
    var chars = tin.toUpperCase().split(''); // Fill with zeros if smaller than proper

    while (chars.length < 8) {
      chars.unshift(0);
    } // Validate format according to last character


    switch (tin[7]) {
      case 'A':
      case 'P':
        if (parseInt(chars[6], 10) === 0) {
          return false;
        }

        break;

      default:
        {
          var first_part = parseInt(chars.join('').slice(0, 5), 10);

          if (first_part > 32000) {
            return false;
          }

          var second_part = parseInt(chars.join('').slice(5, 7), 10);

          if (first_part === second_part) {
            return false;
          }
        }
    }
  }

  return true;
}
/*
 * nl-NL validation function
 * (Burgerservicenummer (BSN) or Rechtspersonen Samenwerkingsverbanden Informatie Nummer (RSIN),
 * persons/entities respectively)
 * Verify TIN validity by calculating check (last) digit (variant of MOD 11)
 */


function nlNlCheck(tin) {
  return algorithms.reverseMultiplyAndSum(tin.split('').slice(0, 8).map(function (a) {
    return parseInt(a, 10);
  }), 9) % 11 === parseInt(tin[8], 10);
}
/*
 * pl-PL validation function
 * (Powszechny Elektroniczny System Ewidencji Ludności (PESEL)
 * or Numer identyfikacji podatkowej (NIP), persons/entities)
 * Verify TIN validity by validating birth date (PESEL) and calculating check (last) digit
 */


function plPlCheck(tin) {
  // NIP
  if (tin.length === 10) {
    // Calculate last digit by multiplying with lookup
    var lookup = [6, 5, 7, 2, 3, 4, 5, 6, 7];
    var _checksum = 0;

    for (var i = 0; i < lookup.length; i++) {
      _checksum += parseInt(tin[i], 10) * lookup[i];
    }

    _checksum %= 11;

    if (_checksum === 10) {
      return false;
    }

    return _checksum === parseInt(tin[9], 10);
  } // PESEL
  // Extract full year using month


  var full_year = tin.slice(0, 2);
  var month = parseInt(tin.slice(2, 4), 10);

  if (month > 80) {
    full_year = "18".concat(full_year);
    month -= 80;
  } else if (month > 60) {
    full_year = "22".concat(full_year);
    month -= 60;
  } else if (month > 40) {
    full_year = "21".concat(full_year);
    month -= 40;
  } else if (month > 20) {
    full_year = "20".concat(full_year);
    month -= 20;
  } else {
    full_year = "19".concat(full_year);
  } // Add leading zero to month if needed


  if (month < 10) {
    month = "0".concat(month);
  } // Check date validity


  var date = "".concat(full_year, "/").concat(month, "/").concat(tin.slice(4, 6));

  if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {
    return false;
  } // Calculate last digit by mulitplying with odd one-digit numbers except 5


  var checksum = 0;
  var multiplier = 1;

  for (var _i7 = 0; _i7 < tin.length - 1; _i7++) {
    checksum += parseInt(tin[_i7], 10) * multiplier % 10;
    multiplier += 2;

    if (multiplier > 10) {
      multiplier = 1;
    } else if (multiplier === 5) {
      multiplier += 2;
    }
  }

  checksum = 10 - checksum % 10;
  return checksum === parseInt(tin[10], 10);
}
/*
* pt-BR validation function
* (Cadastro de Pessoas Físicas (CPF, persons)
* Cadastro Nacional de Pessoas Jurídicas (CNPJ, entities)
* Both inputs will be validated
*/


function ptBrCheck(tin) {
  if (tin.length === 11) {
    var _sum;

    var remainder;
    _sum = 0;
    if ( // Reject known invalid CPFs
    tin === '11111111111' || tin === '22222222222' || tin === '33333333333' || tin === '44444444444' || tin === '55555555555' || tin === '66666666666' || tin === '77777777777' || tin === '88888888888' || tin === '99999999999' || tin === '00000000000') return false;

    for (var i = 1; i <= 9; i++) {
      _sum += parseInt(tin.substring(i - 1, i), 10) * (11 - i);
    }

    remainder = _sum * 10 % 11;
    if (remainder === 10) remainder = 0;
    if (remainder !== parseInt(tin.substring(9, 10), 10)) return false;
    _sum = 0;

    for (var _i8 = 1; _i8 <= 10; _i8++) {
      _sum += parseInt(tin.substring(_i8 - 1, _i8), 10) * (12 - _i8);
    }

    remainder = _sum * 10 % 11;
    if (remainder === 10) remainder = 0;
    if (remainder !== parseInt(tin.substring(10, 11), 10)) return false;
    return true;
  }

  if ( // Reject know invalid CNPJs
  tin === '00000000000000' || tin === '11111111111111' || tin === '22222222222222' || tin === '33333333333333' || tin === '44444444444444' || tin === '55555555555555' || tin === '66666666666666' || tin === '77777777777777' || tin === '88888888888888' || tin === '99999999999999') {
    return false;
  }

  var length = tin.length - 2;
  var identifiers = tin.substring(0, length);
  var verificators = tin.substring(length);
  var sum = 0;
  var pos = length - 7;

  for (var _i9 = length; _i9 >= 1; _i9--) {
    sum += identifiers.charAt(length - _i9) * pos;
    pos -= 1;

    if (pos < 2) {
      pos = 9;
    }
  }

  var result = sum % 11 < 2 ? 0 : 11 - sum % 11;

  if (result !== parseInt(verificators.charAt(0), 10)) {
    return false;
  }

  length += 1;
  identifiers = tin.substring(0, length);
  sum = 0;
  pos = length - 7;

  for (var _i10 = length; _i10 >= 1; _i10--) {
    sum += identifiers.charAt(length - _i10) * pos;
    pos -= 1;

    if (pos < 2) {
      pos = 9;
    }
  }

  result = sum % 11 < 2 ? 0 : 11 - sum % 11;

  if (result !== parseInt(verificators.charAt(1), 10)) {
    return false;
  }

  return true;
}
/*
 * pt-PT validation function
 * (Número de identificação fiscal (NIF), persons/entities)
 * Verify TIN validity by calculating check (last) digit (variant of MOD 11)
 */


function ptPtCheck(tin) {
  var checksum = 11 - algorithms.reverseMultiplyAndSum(tin.split('').slice(0, 8).map(function (a) {
    return parseInt(a, 10);
  }), 9) % 11;

  if (checksum > 9) {
    return parseInt(tin[8], 10) === 0;
  }

  return checksum === parseInt(tin[8], 10);
}
/*
 * ro-RO validation function
 * (Cod Numeric Personal (CNP) or Cod de înregistrare fiscală (CIF),
 * persons only)
 * Verify CNP validity by calculating check (last) digit (test not found for CIF)
 * Material not in DG TAXUD document sourced from:
 * `https://en.wikipedia.org/wiki/National_identification_number#Romania`
 */


function roRoCheck(tin) {
  if (tin.slice(0, 4) !== '9000') {
    // No test found for this format
    // Extract full year using century digit if possible
    var full_year = tin.slice(1, 3);

    switch (tin[0]) {
      case '1':
      case '2':
        full_year = "19".concat(full_year);
        break;

      case '3':
      case '4':
        full_year = "18".concat(full_year);
        break;

      case '5':
      case '6':
        full_year = "20".concat(full_year);
        break;

      default:
    } // Check date validity


    var date = "".concat(full_year, "/").concat(tin.slice(3, 5), "/").concat(tin.slice(5, 7));

    if (date.length === 8) {
      if (!(0, _isDate.default)(date, 'YY/MM/DD')) {
        return false;
      }
    } else if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {
      return false;
    } // Calculate check digit


    var digits = tin.split('').map(function (a) {
      return parseInt(a, 10);
    });
    var multipliers = [2, 7, 9, 1, 4, 6, 3, 5, 8, 2, 7, 9];
    var checksum = 0;

    for (var i = 0; i < multipliers.length; i++) {
      checksum += digits[i] * multipliers[i];
    }

    if (checksum % 11 === 10) {
      return digits[12] === 1;
    }

    return digits[12] === checksum % 11;
  }

  return true;
}
/*
 * sk-SK validation function
 * (Rodné číslo (RČ) or bezvýznamové identifikačné číslo (BIČ), persons only)
 * Checks validity of pre-1954 birth numbers (rodné číslo) only
 * Due to the introduction of the pseudo-random BIČ it is not possible to test
 * post-1954 birth numbers without knowing whether they are BIČ or RČ beforehand
 */


function skSkCheck(tin) {
  if (tin.length === 9) {
    tin = tin.replace(/\W/, '');

    if (tin.slice(6) === '000') {
      return false;
    } // Three-zero serial not assigned before 1954
    // Extract full year from TIN length


    var full_year = parseInt(tin.slice(0, 2), 10);

    if (full_year > 53) {
      return false;
    }

    if (full_year < 10) {
      full_year = "190".concat(full_year);
    } else {
      full_year = "19".concat(full_year);
    } // Extract month from TIN and normalize


    var month = parseInt(tin.slice(2, 4), 10);

    if (month > 50) {
      month -= 50;
    }

    if (month < 10) {
      month = "0".concat(month);
    } // Check date validity


    var date = "".concat(full_year, "/").concat(month, "/").concat(tin.slice(4, 6));

    if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {
      return false;
    }
  }

  return true;
}
/*
 * sl-SI validation function
 * (Davčna številka, persons/entities)
 * Verify TIN validity by calculating check (last) digit (variant of MOD 11)
 */


function slSiCheck(tin) {
  var checksum = 11 - algorithms.reverseMultiplyAndSum(tin.split('').slice(0, 7).map(function (a) {
    return parseInt(a, 10);
  }), 8) % 11;

  if (checksum === 10) {
    return parseInt(tin[7], 10) === 0;
  }

  return checksum === parseInt(tin[7], 10);
}
/*
 * sv-SE validation function
 * (Personnummer or samordningsnummer, persons only)
 * Checks validity of birth date and calls luhnCheck() to validate check (last) digit
 */


function svSeCheck(tin) {
  // Make copy of TIN and normalize to two-digit year form
  var tin_copy = tin.slice(0);

  if (tin.length > 11) {
    tin_copy = tin_copy.slice(2);
  } // Extract date of birth


  var full_year = '';
  var month = tin_copy.slice(2, 4);
  var day = parseInt(tin_copy.slice(4, 6), 10);

  if (tin.length > 11) {
    full_year = tin.slice(0, 4);
  } else {
    full_year = tin.slice(0, 2);

    if (tin.length === 11 && day < 60) {
      // Extract full year from centenarian symbol
      // Should work just fine until year 10000 or so
      var current_year = new Date().getFullYear().toString();
      var current_century = parseInt(current_year.slice(0, 2), 10);
      current_year = parseInt(current_year, 10);

      if (tin[6] === '-') {
        if (parseInt("".concat(current_century).concat(full_year), 10) > current_year) {
          full_year = "".concat(current_century - 1).concat(full_year);
        } else {
          full_year = "".concat(current_century).concat(full_year);
        }
      } else {
        full_year = "".concat(current_century - 1).concat(full_year);

        if (current_year - parseInt(full_year, 10) < 100) {
          return false;
        }
      }
    }
  } // Normalize day and check date validity


  if (day > 60) {
    day -= 60;
  }

  if (day < 10) {
    day = "0".concat(day);
  }

  var date = "".concat(full_year, "/").concat(month, "/").concat(day);

  if (date.length === 8) {
    if (!(0, _isDate.default)(date, 'YY/MM/DD')) {
      return false;
    }
  } else if (!(0, _isDate.default)(date, 'YYYY/MM/DD')) {
    return false;
  }

  return algorithms.luhnCheck(tin.replace(/\W/, ''));
} // Locale lookup objects

/*
 * Tax id regex formats for various locales
 *
 * Where not explicitly specified in DG-TAXUD document both
 * uppercase and lowercase letters are acceptable.
 */


var taxIdFormat = {
  'bg-BG': /^\d{10}$/,
  'cs-CZ': /^\d{6}\/{0,1}\d{3,4}$/,
  'de-AT': /^\d{9}$/,
  'de-DE': /^[1-9]\d{10}$/,
  'dk-DK': /^\d{6}-{0,1}\d{4}$/,
  'el-CY': /^[09]\d{7}[A-Z]$/,
  'el-GR': /^([0-4]|[7-9])\d{8}$/,
  'en-GB': /^\d{10}$|^(?!GB|NK|TN|ZZ)(?![DFIQUV])[A-Z](?![DFIQUVO])[A-Z]\d{6}[ABCD ]$/i,
  'en-IE': /^\d{7}[A-W][A-IW]{0,1}$/i,
  'en-US': /^\d{2}[- ]{0,1}\d{7}$/,
  'es-ES': /^(\d{0,8}|[XYZKLM]\d{7})[A-HJ-NP-TV-Z]$/i,
  'et-EE': /^[1-6]\d{6}(00[1-9]|0[1-9][0-9]|[1-6][0-9]{2}|70[0-9]|710)\d$/,
  'fi-FI': /^\d{6}[-+A]\d{3}[0-9A-FHJ-NPR-Y]$/i,
  'fr-BE': /^\d{11}$/,
  'fr-FR': /^[0-3]\d{12}$|^[0-3]\d\s\d{2}(\s\d{3}){3}$/,
  // Conforms both to official spec and provided example
  'fr-LU': /^\d{13}$/,
  'hr-HR': /^\d{11}$/,
  'hu-HU': /^8\d{9}$/,
  'it-IT': /^[A-Z]{6}[L-NP-V0-9]{2}[A-EHLMPRST][L-NP-V0-9]{2}[A-ILMZ][L-NP-V0-9]{3}[A-Z]$/i,
  'lv-LV': /^\d{6}-{0,1}\d{5}$/,
  // Conforms both to DG TAXUD spec and original research
  'mt-MT': /^\d{3,7}[APMGLHBZ]$|^([1-8])\1\d{7}$/i,
  'nl-NL': /^\d{9}$/,
  'pl-PL': /^\d{10,11}$/,
  'pt-BR': /(?:^\d{11}$)|(?:^\d{14}$)/,
  'pt-PT': /^\d{9}$/,
  'ro-RO': /^\d{13}$/,
  'sk-SK': /^\d{6}\/{0,1}\d{3,4}$/,
  'sl-SI': /^[1-9]\d{7}$/,
  'sv-SE': /^(\d{6}[-+]{0,1}\d{4}|(18|19|20)\d{6}[-+]{0,1}\d{4})$/
}; // taxIdFormat locale aliases

taxIdFormat['lb-LU'] = taxIdFormat['fr-LU'];
taxIdFormat['lt-LT'] = taxIdFormat['et-EE'];
taxIdFormat['nl-BE'] = taxIdFormat['fr-BE']; // Algorithmic tax id check functions for various locales

var taxIdCheck = {
  'bg-BG': bgBgCheck,
  'cs-CZ': csCzCheck,
  'de-AT': deAtCheck,
  'de-DE': deDeCheck,
  'dk-DK': dkDkCheck,
  'el-CY': elCyCheck,
  'el-GR': elGrCheck,
  'en-IE': enIeCheck,
  'en-US': enUsCheck,
  'es-ES': esEsCheck,
  'et-EE': etEeCheck,
  'fi-FI': fiFiCheck,
  'fr-BE': frBeCheck,
  'fr-FR': frFrCheck,
  'fr-LU': frLuCheck,
  'hr-HR': hrHrCheck,
  'hu-HU': huHuCheck,
  'it-IT': itItCheck,
  'lv-LV': lvLvCheck,
  'mt-MT': mtMtCheck,
  'nl-NL': nlNlCheck,
  'pl-PL': plPlCheck,
  'pt-BR': ptBrCheck,
  'pt-PT': ptPtCheck,
  'ro-RO': roRoCheck,
  'sk-SK': skSkCheck,
  'sl-SI': slSiCheck,
  'sv-SE': svSeCheck
}; // taxIdCheck locale aliases

taxIdCheck['lb-LU'] = taxIdCheck['fr-LU'];
taxIdCheck['lt-LT'] = taxIdCheck['et-EE'];
taxIdCheck['nl-BE'] = taxIdCheck['fr-BE']; // Regexes for locales where characters should be omitted before checking format

var allsymbols = /[-\\\/!@#$%\^&\*\(\)\+\=\[\]]+/g;
var sanitizeRegexes = {
  'de-AT': allsymbols,
  'de-DE': /[\/\\]/g,
  'fr-BE': allsymbols
}; // sanitizeRegexes locale aliases

sanitizeRegexes['nl-BE'] = sanitizeRegexes['fr-BE'];
/*
 * Validator function
 * Return true if the passed string is a valid tax identification number
 * for the specified locale.
 * Throw an error exception if the locale is not supported.
 */

function isTaxID(str) {
  var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en-US';
  (0, _assertString.default)(str); // Copy TIN to avoid replacement if sanitized

  var strcopy = str.slice(0);

  if (locale in taxIdFormat) {
    if (locale in sanitizeRegexes) {
      strcopy = strcopy.replace(sanitizeRegexes[locale], '');
    }

    if (!taxIdFormat[locale].test(strcopy)) {
      return false;
    }

    if (locale in taxIdCheck) {
      return taxIdCheck[locale](strcopy);
    } // Fallthrough; not all locales have algorithmic checks


    return true;
  }

  throw new Error("Invalid locale '".concat(locale, "'"));
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isURL;

var _assertString = _interopRequireDefault(require("./util/assertString"));

var _isFQDN = _interopRequireDefault(require("./isFQDN"));

var _isIP = _interopRequireDefault(require("./isIP"));

var _merge = _interopRequireDefault(require("./util/merge"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }

function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }

function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }

function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

/*
options for isURL method

require_protocol - if set as true isURL will return false if protocol is not present in the URL
require_valid_protocol - isURL will check if the URL's protocol is present in the protocols option
protocols - valid protocols can be modified with this option
require_host - if set as false isURL will not check if host is present in the URL
require_port - if set as true isURL will check if port is present in the URL
allow_protocol_relative_urls - if set as true protocol relative URLs will be allowed
validate_length - if set as false isURL will skip string length validation (IE maximum is 2083)

*/
var default_url_options = {
  protocols: ['http', 'https', 'ftp'],
  require_tld: true,
  require_protocol: false,
  require_host: true,
  require_port: false,
  require_valid_protocol: true,
  allow_underscores: false,
  allow_trailing_dot: false,
  allow_protocol_relative_urls: false,
  allow_fragments: true,
  allow_query_components: true,
  validate_length: true
};
var wrapped_ipv6 = /^\[([^\]]+)\](?::([0-9]+))?$/;

function isRegExp(obj) {
  return Object.prototype.toString.call(obj) === '[object RegExp]';
}

function checkHost(host, matches) {
  for (var i = 0; i < matches.length; i++) {
    var match = matches[i];

    if (host === match || isRegExp(match) && match.test(host)) {
      return true;
    }
  }

  return false;
}

function isURL(url, options) {
  (0, _assertString.default)(url);

  if (!url || /[\s<>]/.test(url)) {
    return false;
  }

  if (url.indexOf('mailto:') === 0) {
    return false;
  }

  options = (0, _merge.default)(options, default_url_options);

  if (options.validate_length && url.length >= 2083) {
    return false;
  }

  if (!options.allow_fragments && url.includes('#')) {
    return false;
  }

  if (!options.allow_query_components && (url.includes('?') || url.includes('&'))) {
    return false;
  }

  var protocol, auth, host, hostname, port, port_str, split, ipv6;
  split = url.split('#');
  url = split.shift();
  split = url.split('?');
  url = split.shift();
  split = url.split('://');

  if (split.length > 1) {
    protocol = split.shift().toLowerCase();

    if (options.require_valid_protocol && options.protocols.indexOf(protocol) === -1) {
      return false;
    }
  } else if (options.require_protocol) {
    return false;
  } else if (url.substr(0, 2) === '//') {
    if (!options.allow_protocol_relative_urls) {
      return false;
    }

    split[0] = url.substr(2);
  }

  url = split.join('://');

  if (url === '') {
    return false;
  }

  split = url.split('/');
  url = split.shift();

  if (url === '' && !options.require_host) {
    return true;
  }

  split = url.split('@');

  if (split.length > 1) {
    if (options.disallow_auth) {
      return false;
    }

    if (split[0] === '') {
      return false;
    }

    auth = split.shift();

    if (auth.indexOf(':') >= 0 && auth.split(':').length > 2) {
      return false;
    }

    var _auth$split = auth.split(':'),
        _auth$split2 = _slicedToArray(_auth$split, 2),
        user = _auth$split2[0],
        password = _auth$split2[1];

    if (user === '' && password === '') {
      return false;
    }
  }

  hostname = split.join('@');
  port_str = null;
  ipv6 = null;
  var ipv6_match = hostname.match(wrapped_ipv6);

  if (ipv6_match) {
    host = '';
    ipv6 = ipv6_match[1];
    port_str = ipv6_match[2] || null;
  } else {
    split = hostname.split(':');
    host = split.shift();

    if (split.length) {
      port_str = split.join(':');
    }
  }

  if (port_str !== null && port_str.length > 0) {
    port = parseInt(port_str, 10);

    if (!/^[0-9]+$/.test(port_str) || port <= 0 || port > 65535) {
      return false;
    }
  } else if (options.require_port) {
    return false;
  }

  if (options.host_whitelist) {
    return checkHost(host, options.host_whitelist);
  }

  if (!(0, _isIP.default)(host) && !(0, _isFQDN.default)(host, options) && (!ipv6 || !(0, _isIP.default)(ipv6, 6))) {
    return false;
  }

  host = host || ipv6;

  if (options.host_blacklist && checkHost(host, options.host_blacklist)) {
    return false;
  }

  return true;
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isUUID;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var uuid = {
  1: /^[0-9A-F]{8}-[0-9A-F]{4}-1[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,
  2: /^[0-9A-F]{8}-[0-9A-F]{4}-2[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,
  3: /^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,
  4: /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,
  5: /^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,
  all: /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i
};

function isUUID(str, version) {
  (0, _assertString.default)(str);
  var pattern = uuid[![undefined, null].includes(version) ? version : 'all'];
  return !!pattern && pattern.test(str);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isUppercase;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function isUppercase(str) {
  (0, _assertString.default)(str);
  return str === str.toUpperCase();
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isVAT;
exports.vatMatchers = void 0;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var vatMatchers = {
  GB: /^GB((\d{3} \d{4} ([0-8][0-9]|9[0-6]))|(\d{9} \d{3})|(((GD[0-4])|(HA[5-9]))[0-9]{2}))$/,
  IT: /^(IT)?[0-9]{11}$/,
  NL: /^(NL)?[0-9]{9}B[0-9]{2}$/
};
exports.vatMatchers = vatMatchers;

function isVAT(str, countryCode) {
  (0, _assertString.default)(str);
  (0, _assertString.default)(countryCode);

  if (countryCode in vatMatchers) {
    return vatMatchers[countryCode].test(str);
  }

  throw new Error("Invalid country code: '".concat(countryCode, "'"));
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isVariableWidth;

var _assertString = _interopRequireDefault(require("./util/assertString"));

var _isFullWidth = require("./isFullWidth");

var _isHalfWidth = require("./isHalfWidth");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function isVariableWidth(str) {
  (0, _assertString.default)(str);
  return _isFullWidth.fullWidth.test(str) && _isHalfWidth.halfWidth.test(str);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = isWhitelisted;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function isWhitelisted(str, chars) {
  (0, _assertString.default)(str);

  for (var i = str.length - 1; i >= 0; i--) {
    if (chars.indexOf(str[i]) === -1) {
      return false;
    }
  }

  return true;
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = ltrim;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function ltrim(str, chars) {
  (0, _assertString.default)(str); // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping

  var pattern = chars ? new RegExp("^[".concat(chars.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), "]+"), 'g') : /^\s+/g;
  return str.replace(pattern, '');
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = matches;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function matches(str, pattern, modifiers) {
  (0, _assertString.default)(str);

  if (Object.prototype.toString.call(pattern) !== '[object RegExp]') {
    pattern = new RegExp(pattern, modifiers);
  }

  return pattern.test(str);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = normalizeEmail;

var _merge = _interopRequireDefault(require("./util/merge"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var default_normalize_email_options = {
  // The following options apply to all email addresses
  // Lowercases the local part of the email address.
  // Please note this may violate RFC 5321 as per http://stackoverflow.com/a/9808332/192024).
  // The domain is always lowercased, as per RFC 1035
  all_lowercase: true,
  // The following conversions are specific to GMail
  // Lowercases the local part of the GMail address (known to be case-insensitive)
  gmail_lowercase: true,
  // Removes dots from the local part of the email address, as that's ignored by GMail
  gmail_remove_dots: true,
  // Removes the subaddress (e.g. "+foo") from the email address
  gmail_remove_subaddress: true,
  // Conversts the googlemail.com domain to gmail.com
  gmail_convert_googlemaildotcom: true,
  // The following conversions are specific to Outlook.com / Windows Live / Hotmail
  // Lowercases the local part of the Outlook.com address (known to be case-insensitive)
  outlookdotcom_lowercase: true,
  // Removes the subaddress (e.g. "+foo") from the email address
  outlookdotcom_remove_subaddress: true,
  // The following conversions are specific to Yahoo
  // Lowercases the local part of the Yahoo address (known to be case-insensitive)
  yahoo_lowercase: true,
  // Removes the subaddress (e.g. "-foo") from the email address
  yahoo_remove_subaddress: true,
  // The following conversions are specific to Yandex
  // Lowercases the local part of the Yandex address (known to be case-insensitive)
  yandex_lowercase: true,
  // The following conversions are specific to iCloud
  // Lowercases the local part of the iCloud address (known to be case-insensitive)
  icloud_lowercase: true,
  // Removes the subaddress (e.g. "+foo") from the email address
  icloud_remove_subaddress: true
}; // List of domains used by iCloud

var icloud_domains = ['icloud.com', 'me.com']; // List of domains used by Outlook.com and its predecessors
// This list is likely incomplete.
// Partial reference:
// https://blogs.office.com/2013/04/17/outlook-com-gets-two-step-verification-sign-in-by-alias-and-new-international-domains/

var outlookdotcom_domains = ['hotmail.at', 'hotmail.be', 'hotmail.ca', 'hotmail.cl', 'hotmail.co.il', 'hotmail.co.nz', 'hotmail.co.th', 'hotmail.co.uk', 'hotmail.com', 'hotmail.com.ar', 'hotmail.com.au', 'hotmail.com.br', 'hotmail.com.gr', 'hotmail.com.mx', 'hotmail.com.pe', 'hotmail.com.tr', 'hotmail.com.vn', 'hotmail.cz', 'hotmail.de', 'hotmail.dk', 'hotmail.es', 'hotmail.fr', 'hotmail.hu', 'hotmail.id', 'hotmail.ie', 'hotmail.in', 'hotmail.it', 'hotmail.jp', 'hotmail.kr', 'hotmail.lv', 'hotmail.my', 'hotmail.ph', 'hotmail.pt', 'hotmail.sa', 'hotmail.sg', 'hotmail.sk', 'live.be', 'live.co.uk', 'live.com', 'live.com.ar', 'live.com.mx', 'live.de', 'live.es', 'live.eu', 'live.fr', 'live.it', 'live.nl', 'msn.com', 'outlook.at', 'outlook.be', 'outlook.cl', 'outlook.co.il', 'outlook.co.nz', 'outlook.co.th', 'outlook.com', 'outlook.com.ar', 'outlook.com.au', 'outlook.com.br', 'outlook.com.gr', 'outlook.com.pe', 'outlook.com.tr', 'outlook.com.vn', 'outlook.cz', 'outlook.de', 'outlook.dk', 'outlook.es', 'outlook.fr', 'outlook.hu', 'outlook.id', 'outlook.ie', 'outlook.in', 'outlook.it', 'outlook.jp', 'outlook.kr', 'outlook.lv', 'outlook.my', 'outlook.ph', 'outlook.pt', 'outlook.sa', 'outlook.sg', 'outlook.sk', 'passport.com']; // List of domains used by Yahoo Mail
// This list is likely incomplete

var yahoo_domains = ['rocketmail.com', 'yahoo.ca', 'yahoo.co.uk', 'yahoo.com', 'yahoo.de', 'yahoo.fr', 'yahoo.in', 'yahoo.it', 'ymail.com']; // List of domains used by yandex.ru

var yandex_domains = ['yandex.ru', 'yandex.ua', 'yandex.kz', 'yandex.com', 'yandex.by', 'ya.ru']; // replace single dots, but not multiple consecutive dots

function dotsReplacer(match) {
  if (match.length > 1) {
    return match;
  }

  return '';
}

function normalizeEmail(email, options) {
  options = (0, _merge.default)(options, default_normalize_email_options);
  var raw_parts = email.split('@');
  var domain = raw_parts.pop();
  var user = raw_parts.join('@');
  var parts = [user, domain]; // The domain is always lowercased, as it's case-insensitive per RFC 1035

  parts[1] = parts[1].toLowerCase();

  if (parts[1] === 'gmail.com' || parts[1] === 'googlemail.com') {
    // Address is GMail
    if (options.gmail_remove_subaddress) {
      parts[0] = parts[0].split('+')[0];
    }

    if (options.gmail_remove_dots) {
      // this does not replace consecutive dots like example..email@gmail.com
      parts[0] = parts[0].replace(/\.+/g, dotsReplacer);
    }

    if (!parts[0].length) {
      return false;
    }

    if (options.all_lowercase || options.gmail_lowercase) {
      parts[0] = parts[0].toLowerCase();
    }

    parts[1] = options.gmail_convert_googlemaildotcom ? 'gmail.com' : parts[1];
  } else if (icloud_domains.indexOf(parts[1]) >= 0) {
    // Address is iCloud
    if (options.icloud_remove_subaddress) {
      parts[0] = parts[0].split('+')[0];
    }

    if (!parts[0].length) {
      return false;
    }

    if (options.all_lowercase || options.icloud_lowercase) {
      parts[0] = parts[0].toLowerCase();
    }
  } else if (outlookdotcom_domains.indexOf(parts[1]) >= 0) {
    // Address is Outlook.com
    if (options.outlookdotcom_remove_subaddress) {
      parts[0] = parts[0].split('+')[0];
    }

    if (!parts[0].length) {
      return false;
    }

    if (options.all_lowercase || options.outlookdotcom_lowercase) {
      parts[0] = parts[0].toLowerCase();
    }
  } else if (yahoo_domains.indexOf(parts[1]) >= 0) {
    // Address is Yahoo
    if (options.yahoo_remove_subaddress) {
      var components = parts[0].split('-');
      parts[0] = components.length > 1 ? components.slice(0, -1).join('-') : components[0];
    }

    if (!parts[0].length) {
      return false;
    }

    if (options.all_lowercase || options.yahoo_lowercase) {
      parts[0] = parts[0].toLowerCase();
    }
  } else if (yandex_domains.indexOf(parts[1]) >= 0) {
    if (options.all_lowercase || options.yandex_lowercase) {
      parts[0] = parts[0].toLowerCase();
    }

    parts[1] = 'yandex.ru'; // all yandex domains are equal, 1st preferred
  } else if (options.all_lowercase) {
    // Any other address
    parts[0] = parts[0].toLowerCase();
  }

  return parts.join('@');
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = rtrim;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function rtrim(str, chars) {
  (0, _assertString.default)(str);

  if (chars) {
    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping
    var pattern = new RegExp("[".concat(chars.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), "]+$"), 'g');
    return str.replace(pattern, '');
  } // Use a faster and more safe than regex trim method https://blog.stevenlevithan.com/archives/faster-trim-javascript


  var strIndex = str.length - 1;

  while (/\s/.test(str.charAt(strIndex))) {
    strIndex -= 1;
  }

  return str.slice(0, strIndex + 1);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = stripLow;

var _assertString = _interopRequireDefault(require("./util/assertString"));

var _blacklist = _interopRequireDefault(require("./blacklist"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function stripLow(str, keep_new_lines) {
  (0, _assertString.default)(str);
  var chars = keep_new_lines ? '\\x00-\\x09\\x0B\\x0C\\x0E-\\x1F\\x7F' : '\\x00-\\x1F\\x7F';
  return (0, _blacklist.default)(str, chars);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = toBoolean;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function toBoolean(str, strict) {
  (0, _assertString.default)(str);

  if (strict) {
    return str === '1' || /^true$/i.test(str);
  }

  return str !== '0' && !/^false$/i.test(str) && str !== '';
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = toDate;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function toDate(date) {
  (0, _assertString.default)(date);
  date = Date.parse(date);
  return !isNaN(date) ? new Date(date) : null;
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = toFloat;

var _isFloat = _interopRequireDefault(require("./isFloat"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function toFloat(str) {
  if (!(0, _isFloat.default)(str)) return NaN;
  return parseFloat(str);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = toInt;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function toInt(str, radix) {
  (0, _assertString.default)(str);
  return parseInt(str, radix || 10);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = trim;

var _rtrim = _interopRequireDefault(require("./rtrim"));

var _ltrim = _interopRequireDefault(require("./ltrim"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function trim(str, chars) {
  return (0, _rtrim.default)((0, _ltrim.default)(str, chars), chars);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = unescape;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function unescape(str) {
  (0, _assertString.default)(str);
  return str.replace(/&quot;/g, '"').replace(/&#x27;/g, "'").replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&#x2F;/g, '/').replace(/&#x5C;/g, '\\').replace(/&#96;/g, '`').replace(/&amp;/g, '&'); // &amp; replacement has to be the last one to prevent
  // bugs with intermediate strings containing escape sequences
  // See: https://github.com/validatorjs/validator.js/issues/1827
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = whitelist;

var _assertString = _interopRequireDefault(require("./util/assertString"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function whitelist(str, chars) {
  (0, _assertString.default)(str);
  return str.replace(new RegExp("[^".concat(chars, "]+"), 'g'), '');
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.iso7064Check = iso7064Check;
exports.luhnCheck = luhnCheck;
exports.reverseMultiplyAndSum = reverseMultiplyAndSum;
exports.verhoeffCheck = verhoeffCheck;

/**
 * Algorithmic validation functions
 * May be used as is or implemented in the workflow of other validators.
 */

/*
 * ISO 7064 validation function
 * Called with a string of numbers (incl. check digit)
 * to validate according to ISO 7064 (MOD 11, 10).
 */
function iso7064Check(str) {
  var checkvalue = 10;

  for (var i = 0; i < str.length - 1; i++) {
    checkvalue = (parseInt(str[i], 10) + checkvalue) % 10 === 0 ? 10 * 2 % 11 : (parseInt(str[i], 10) + checkvalue) % 10 * 2 % 11;
  }

  checkvalue = checkvalue === 1 ? 0 : 11 - checkvalue;
  return checkvalue === parseInt(str[10], 10);
}
/*
 * Luhn (mod 10) validation function
 * Called with a string of numbers (incl. check digit)
 * to validate according to the Luhn algorithm.
 */


function luhnCheck(str) {
  var checksum = 0;
  var second = false;

  for (var i = str.length - 1; i >= 0; i--) {
    if (second) {
      var product = parseInt(str[i], 10) * 2;

      if (product > 9) {
        // sum digits of product and add to checksum
        checksum += product.toString().split('').map(function (a) {
          return parseInt(a, 10);
        }).reduce(function (a, b) {
          return a + b;
        }, 0);
      } else {
        checksum += product;
      }
    } else {
      checksum += parseInt(str[i], 10);
    }

    second = !second;
  }

  return checksum % 10 === 0;
}
/*
 * Reverse TIN multiplication and summation helper function
 * Called with an array of single-digit integers and a base multiplier
 * to calculate the sum of the digits multiplied in reverse.
 * Normally used in variations of MOD 11 algorithmic checks.
 */


function reverseMultiplyAndSum(digits, base) {
  var total = 0;

  for (var i = 0; i < digits.length; i++) {
    total += digits[i] * (base - i);
  }

  return total;
}
/*
 * Verhoeff validation helper function
 * Called with a string of numbers
 * to validate according to the Verhoeff algorithm.
 */


function verhoeffCheck(str) {
  var d_table = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 0, 6, 7, 8, 9, 5], [2, 3, 4, 0, 1, 7, 8, 9, 5, 6], [3, 4, 0, 1, 2, 8, 9, 5, 6, 7], [4, 0, 1, 2, 3, 9, 5, 6, 7, 8], [5, 9, 8, 7, 6, 0, 4, 3, 2, 1], [6, 5, 9, 8, 7, 1, 0, 4, 3, 2], [7, 6, 5, 9, 8, 2, 1, 0, 4, 3], [8, 7, 6, 5, 9, 3, 2, 1, 0, 4], [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]];
  var p_table = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 5, 7, 6, 2, 8, 3, 0, 9, 4], [5, 8, 0, 3, 7, 9, 6, 1, 4, 2], [8, 9, 1, 6, 0, 4, 3, 5, 2, 7], [9, 4, 5, 3, 1, 2, 6, 8, 7, 0], [4, 2, 8, 6, 5, 7, 3, 9, 0, 1], [2, 7, 9, 3, 8, 0, 6, 4, 1, 5], [7, 0, 4, 6, 9, 1, 3, 2, 5, 8]]; // Copy (to prevent replacement) and reverse

  var str_copy = str.split('').reverse().join('');
  var checksum = 0;

  for (var i = 0; i < str_copy.length; i++) {
    checksum = d_table[checksum][p_table[i % 8][parseInt(str_copy[i], 10)]];
  }

  return checksum === 0;
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = assertString;

function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function assertString(input) {
  var isString = typeof input === 'string' || input instanceof String;

  if (!isString) {
    var invalidType = _typeof(input);

    if (input === null) invalidType = 'null';else if (invalidType === 'object') invalidType = input.constructor.name;
    throw new TypeError("Expected a string but received a ".concat(invalidType));
  }
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var includes = function includes(arr, val) {
  return arr.some(function (arrVal) {
    return val === arrVal;
  });
};

var _default = includes;
exports.default = _default;
module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = merge;

function merge() {
  var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  var defaults = arguments.length > 1 ? arguments[1] : undefined;

  for (var key in defaults) {
    if (typeof obj[key] === 'undefined') {
      obj[key] = defaults[key];
    }
  }

  return obj;
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = multilineRegexp;

/**
 * Build RegExp object from an array
 * of multiple/multi-line regexp parts
 *
 * @param {string[]} parts
 * @param {string} flags
 * @return {object} - RegExp object
 */
function multilineRegexp(parts, flags) {
  var regexpAsStringLiteral = parts.join('');
  return new RegExp(regexpAsStringLiteral, flags);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = toString;

function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function toString(input) {
  if (_typeof(input) === 'object' && input !== null) {
    if (typeof input.toString === 'function') {
      input = input.toString();
    } else {
      input = '[object Object]';
    }
  } else if (input === null || typeof input === 'undefined' || isNaN(input) && !input.length) {
    input = '';
  }

  return String(input);
}

module.exports = exports.default;
module.exports.default = exports.default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = typeOf;

/**
 * Better way to handle type checking
 * null, {}, array and date are objects, which confuses
 */
function typeOf(input) {
  var rawObject = Object.prototype.toString.call(input).toLowerCase();
  var typeOfRegex = /\[object (.*)]/g;
  var type = typeOfRegex.exec(rawObject)[1];
  return type;
}

module.exports = exports.default;
module.exports.default = exports.default;import toDate from './lib/toDate';
import toFloat from './lib/toFloat';
import toInt from './lib/toInt';
import toBoolean from './lib/toBoolean';
import equals from './lib/equals';
import contains from './lib/contains';
import matches from './lib/matches';
import isEmail from './lib/isEmail';
import isURL from './lib/isURL';
import isMACAddress from './lib/isMACAddress';
import isIP from './lib/isIP';
import isIPRange from './lib/isIPRange';
import isFQDN from './lib/isFQDN';
import isDate from './lib/isDate';
import isBoolean from './lib/isBoolean';
import isLocale from './lib/isLocale';
import isAlpha, { locales as isAlphaLocales } from './lib/isAlpha';
import isAlphanumeric, { locales as isAlphanumericLocales } from './lib/isAlphanumeric';
import isNumeric from './lib/isNumeric';
import isPassportNumber from './lib/isPassportNumber';
import isPort from './lib/isPort';
import isLowercase from './lib/isLowercase';
import isUppercase from './lib/isUppercase';
import isIMEI from './lib/isIMEI';
import isAscii from './lib/isAscii';
import isFullWidth from './lib/isFullWidth';
import isHalfWidth from './lib/isHalfWidth';
import isVariableWidth from './lib/isVariableWidth';
import isMultibyte from './lib/isMultibyte';
import isSemVer from './lib/isSemVer';
import isSurrogatePair from './lib/isSurrogatePair';
import isInt from './lib/isInt';
import isFloat, { locales as isFloatLocales } from './lib/isFloat';
import isDecimal from './lib/isDecimal';
import isHexadecimal from './lib/isHexadecimal';
import isOctal from './lib/isOctal';
import isDivisibleBy from './lib/isDivisibleBy';
import isHexColor from './lib/isHexColor';
import isRgbColor from './lib/isRgbColor';
import isHSL from './lib/isHSL';
import isISRC from './lib/isISRC';
import isIBAN, { locales as ibanLocales } from './lib/isIBAN';
import isBIC from './lib/isBIC';
import isMD5 from './lib/isMD5';
import isHash from './lib/isHash';
import isJWT from './lib/isJWT';
import isJSON from './lib/isJSON';
import isEmpty from './lib/isEmpty';
import isLength from './lib/isLength';
import isByteLength from './lib/isByteLength';
import isUUID from './lib/isUUID';
import isMongoId from './lib/isMongoId';
import isAfter from './lib/isAfter';
import isBefore from './lib/isBefore';
import isIn from './lib/isIn';
import isCreditCard from './lib/isCreditCard';
import isIdentityCard from './lib/isIdentityCard';
import isEAN from './lib/isEAN';
import isISIN from './lib/isISIN';
import isISBN from './lib/isISBN';
import isISSN from './lib/isISSN';
import isTaxID from './lib/isTaxID';
import isMobilePhone, { locales as isMobilePhoneLocales } from './lib/isMobilePhone';
import isEthereumAddress from './lib/isEthereumAddress';
import isCurrency from './lib/isCurrency';
import isBtcAddress from './lib/isBtcAddress';
import isISO8601 from './lib/isISO8601';
import isRFC3339 from './lib/isRFC3339';
import isISO31661Alpha2 from './lib/isISO31661Alpha2';
import isISO31661Alpha3 from './lib/isISO31661Alpha3';
import isISO4217 from './lib/isISO4217';
import isBase32 from './lib/isBase32';
import isBase58 from './lib/isBase58';
import isBase64 from './lib/isBase64';
import isDataURI from './lib/isDataURI';
import isMagnetURI from './lib/isMagnetURI';
import isMimeType from './lib/isMimeType';
import isLatLong from './lib/isLatLong';
import isPostalCode, { locales as isPostalCodeLocales } from './lib/isPostalCode';
import ltrim from './lib/ltrim';
import rtrim from './lib/rtrim';
import trim from './lib/trim';
import escape from './lib/escape';
import unescape from './lib/unescape';
import stripLow from './lib/stripLow';
import whitelist from './lib/whitelist';
import blacklist from './lib/blacklist';
import isWhitelisted from './lib/isWhitelisted';
import normalizeEmail from './lib/normalizeEmail';
import isSlug from './lib/isSlug';
import isLicensePlate from './lib/isLicensePlate';
import isStrongPassword from './lib/isStrongPassword';
import isVAT from './lib/isVAT';
var version = '13.7.0';
var validator = {
  version: version,
  toDate: toDate,
  toFloat: toFloat,
  toInt: toInt,
  toBoolean: toBoolean,
  equals: equals,
  contains: contains,
  matches: matches,
  isEmail: isEmail,
  isURL: isURL,
  isMACAddress: isMACAddress,
  isIP: isIP,
  isIPRange: isIPRange,
  isFQDN: isFQDN,
  isBoolean: isBoolean,
  isIBAN: isIBAN,
  isBIC: isBIC,
  isAlpha: isAlpha,
  isAlphaLocales: isAlphaLocales,
  isAlphanumeric: isAlphanumeric,
  isAlphanumericLocales: isAlphanumericLocales,
  isNumeric: isNumeric,
  isPassportNumber: isPassportNumber,
  isPort: isPort,
  isLowercase: isLowercase,
  isUppercase: isUppercase,
  isAscii: isAscii,
  isFullWidth: isFullWidth,
  isHalfWidth: isHalfWidth,
  isVariableWidth: isVariableWidth,
  isMultibyte: isMultibyte,
  isSemVer: isSemVer,
  isSurrogatePair: isSurrogatePair,
  isInt: isInt,
  isIMEI: isIMEI,
  isFloat: isFloat,
  isFloatLocales: isFloatLocales,
  isDecimal: isDecimal,
  isHexadecimal: isHexadecimal,
  isOctal: isOctal,
  isDivisibleBy: isDivisibleBy,
  isHexColor: isHexColor,
  isRgbColor: isRgbColor,
  isHSL: isHSL,
  isISRC: isISRC,
  isMD5: isMD5,
  isHash: isHash,
  isJWT: isJWT,
  isJSON: isJSON,
  isEmpty: isEmpty,
  isLength: isLength,
  isLocale: isLocale,
  isByteLength: isByteLength,
  isUUID: isUUID,
  isMongoId: isMongoId,
  isAfter: isAfter,
  isBefore: isBefore,
  isIn: isIn,
  isCreditCard: isCreditCard,
  isIdentityCard: isIdentityCard,
  isEAN: isEAN,
  isISIN: isISIN,
  isISBN: isISBN,
  isISSN: isISSN,
  isMobilePhone: isMobilePhone,
  isMobilePhoneLocales: isMobilePhoneLocales,
  isPostalCode: isPostalCode,
  isPostalCodeLocales: isPostalCodeLocales,
  isEthereumAddress: isEthereumAddress,
  isCurrency: isCurrency,
  isBtcAddress: isBtcAddress,
  isISO8601: isISO8601,
  isRFC3339: isRFC3339,
  isISO31661Alpha2: isISO31661Alpha2,
  isISO31661Alpha3: isISO31661Alpha3,
  isISO4217: isISO4217,
  isBase32: isBase32,
  isBase58: isBase58,
  isBase64: isBase64,
  isDataURI: isDataURI,
  isMagnetURI: isMagnetURI,
  isMimeType: isMimeType,
  isLatLong: isLatLong,
  ltrim: ltrim,
  rtrim: rtrim,
  trim: trim,
  escape: escape,
  unescape: unescape,
  stripLow: stripLow,
  whitelist: whitelist,
  blacklist: blacklist,
  isWhitelisted: isWhitelisted,
  normalizeEmail: normalizeEmail,
  toString: toString,
  isSlug: isSlug,
  isStrongPassword: isStrongPassword,
  isTaxID: isTaxID,
  isDate: isDate,
  isLicensePlate: isLicensePlate,
  isVAT: isVAT,
  ibanLocales: ibanLocales
};
export default validator;export var alpha = {
  'en-US': /^[A-Z]+$/i,
  'az-AZ': /^[A-VXYZÇƏĞİıÖŞÜ]+$/i,
  'bg-BG': /^[А-Я]+$/i,
  'cs-CZ': /^[A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]+$/i,
  'da-DK': /^[A-ZÆØÅ]+$/i,
  'de-DE': /^[A-ZÄÖÜß]+$/i,
  'el-GR': /^[Α-ώ]+$/i,
  'es-ES': /^[A-ZÁÉÍÑÓÚÜ]+$/i,
  'fa-IR': /^[ابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی]+$/i,
  'fi-FI': /^[A-ZÅÄÖ]+$/i,
  'fr-FR': /^[A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i,
  'it-IT': /^[A-ZÀÉÈÌÎÓÒÙ]+$/i,
  'nb-NO': /^[A-ZÆØÅ]+$/i,
  'nl-NL': /^[A-ZÁÉËÏÓÖÜÚ]+$/i,
  'nn-NO': /^[A-ZÆØÅ]+$/i,
  'hu-HU': /^[A-ZÁÉÍÓÖŐÚÜŰ]+$/i,
  'pl-PL': /^[A-ZĄĆĘŚŁŃÓŻŹ]+$/i,
  'pt-PT': /^[A-ZÃÁÀÂÄÇÉÊËÍÏÕÓÔÖÚÜ]+$/i,
  'ru-RU': /^[А-ЯЁ]+$/i,
  'sl-SI': /^[A-ZČĆĐŠŽ]+$/i,
  'sk-SK': /^[A-ZÁČĎÉÍŇÓŠŤÚÝŽĹŔĽÄÔ]+$/i,
  'sr-RS@latin': /^[A-ZČĆŽŠĐ]+$/i,
  'sr-RS': /^[А-ЯЂЈЉЊЋЏ]+$/i,
  'sv-SE': /^[A-ZÅÄÖ]+$/i,
  'th-TH': /^[ก-๐\s]+$/i,
  'tr-TR': /^[A-ZÇĞİıÖŞÜ]+$/i,
  'uk-UA': /^[А-ЩЬЮЯЄIЇҐі]+$/i,
  'vi-VN': /^[A-ZÀÁẠẢÃÂẦẤẬẨẪĂẰẮẶẲẴĐÈÉẸẺẼÊỀẾỆỂỄÌÍỊỈĨÒÓỌỎÕÔỒỐỘỔỖƠỜỚỢỞỠÙÚỤỦŨƯỪỨỰỬỮỲÝỴỶỸ]+$/i,
  'ku-IQ': /^[ئابپتجچحخدرڕزژسشعغفڤقکگلڵمنوۆھەیێيطؤثآإأكضصةظذ]+$/i,
  ar: /^[ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]+$/,
  he: /^[א-ת]+$/,
  fa: /^['آاءأؤئبپتثجچحخدذرزژسشصضطظعغفقکگلمنوهةی']+$/i,
  'hi-IN': /^[\u0900-\u0961]+[\u0972-\u097F]*$/i
};
export var alphanumeric = {
  'en-US': /^[0-9A-Z]+$/i,
  'az-AZ': /^[0-9A-VXYZÇƏĞİıÖŞÜ]+$/i,
  'bg-BG': /^[0-9А-Я]+$/i,
  'cs-CZ': /^[0-9A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]+$/i,
  'da-DK': /^[0-9A-ZÆØÅ]+$/i,
  'de-DE': /^[0-9A-ZÄÖÜß]+$/i,
  'el-GR': /^[0-9Α-ω]+$/i,
  'es-ES': /^[0-9A-ZÁÉÍÑÓÚÜ]+$/i,
  'fi-FI': /^[0-9A-ZÅÄÖ]+$/i,
  'fr-FR': /^[0-9A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]+$/i,
  'it-IT': /^[0-9A-ZÀÉÈÌÎÓÒÙ]+$/i,
  'hu-HU': /^[0-9A-ZÁÉÍÓÖŐÚÜŰ]+$/i,
  'nb-NO': /^[0-9A-ZÆØÅ]+$/i,
  'nl-NL': /^[0-9A-ZÁÉËÏÓÖÜÚ]+$/i,
  'nn-NO': /^[0-9A-ZÆØÅ]+$/i,
  'pl-PL': /^[0-9A-ZĄĆĘŚŁŃÓŻŹ]+$/i,
  'pt-PT': /^[0-9A-ZÃÁÀÂÄÇÉÊËÍÏÕÓÔÖÚÜ]+$/i,
  'ru-RU': /^[0-9А-ЯЁ]+$/i,
  'sl-SI': /^[0-9A-ZČĆĐŠŽ]+$/i,
  'sk-SK': /^[0-9A-ZÁČĎÉÍŇÓŠŤÚÝŽĹŔĽÄÔ]+$/i,
  'sr-RS@latin': /^[0-9A-ZČĆŽŠĐ]+$/i,
  'sr-RS': /^[0-9А-ЯЂЈЉЊЋЏ]+$/i,
  'sv-SE': /^[0-9A-ZÅÄÖ]+$/i,
  'th-TH': /^[ก-๙\s]+$/i,
  'tr-TR': /^[0-9A-ZÇĞİıÖŞÜ]+$/i,
  'uk-UA': /^[0-9А-ЩЬЮЯЄIЇҐі]+$/i,
  'ku-IQ': /^[٠١٢٣٤٥٦٧٨٩0-9ئابپتجچحخدرڕزژسشعغفڤقکگلڵمنوۆھەیێيطؤثآإأكضصةظذ]+$/i,
  'vi-VN': /^[0-9A-ZÀÁẠẢÃÂẦẤẬẨẪĂẰẮẶẲẴĐÈÉẸẺẼÊỀẾỆỂỄÌÍỊỈĨÒÓỌỎÕÔỒỐỘỔỖƠỜỚỢỞỠÙÚỤỦŨƯỪỨỰỬỮỲÝỴỶỸ]+$/i,
  ar: /^[٠١٢٣٤٥٦٧٨٩0-9ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]+$/,
  he: /^[0-9א-ת]+$/,
  fa: /^['0-9آاءأؤئبپتثجچحخدذرزژسشصضطظعغفقکگلمنوهةی۱۲۳۴۵۶۷۸۹۰']+$/i,
  'hi-IN': /^[\u0900-\u0963]+[\u0966-\u097F]*$/i
};
export var decimal = {
  'en-US': '.',
  ar: '٫'
};
export var englishLocales = ['AU', 'GB', 'HK', 'IN', 'NZ', 'ZA', 'ZM'];

for (var locale, i = 0; i < englishLocales.length; i++) {
  locale = "en-".concat(englishLocales[i]);
  alpha[locale] = alpha['en-US'];
  alphanumeric[locale] = alphanumeric['en-US'];
  decimal[locale] = decimal['en-US'];
} // Source: http://www.localeplanet.com/java/


export var arabicLocales = ['AE', 'BH', 'DZ', 'EG', 'IQ', 'JO', 'KW', 'LB', 'LY', 'MA', 'QM', 'QA', 'SA', 'SD', 'SY', 'TN', 'YE'];

for (var _locale, _i = 0; _i < arabicLocales.length; _i++) {
  _locale = "ar-".concat(arabicLocales[_i]);
  alpha[_locale] = alpha.ar;
  alphanumeric[_locale] = alphanumeric.ar;
  decimal[_locale] = decimal.ar;
}

export var farsiLocales = ['IR', 'AF'];

for (var _locale2, _i2 = 0; _i2 < farsiLocales.length; _i2++) {
  _locale2 = "fa-".concat(farsiLocales[_i2]);
  alphanumeric[_locale2] = alphanumeric.fa;
  decimal[_locale2] = decimal.ar;
} // Source: https://en.wikipedia.org/wiki/Decimal_mark


export var dotDecimal = ['ar-EG', 'ar-LB', 'ar-LY'];
export var commaDecimal = ['bg-BG', 'cs-CZ', 'da-DK', 'de-DE', 'el-GR', 'en-ZM', 'es-ES', 'fr-CA', 'fr-FR', 'id-ID', 'it-IT', 'ku-IQ', 'hi-IN', 'hu-HU', 'nb-NO', 'nn-NO', 'nl-NL', 'pl-PL', 'pt-PT', 'ru-RU', 'sl-SI', 'sr-RS@latin', 'sr-RS', 'sv-SE', 'tr-TR', 'uk-UA', 'vi-VN'];

for (var _i3 = 0; _i3 < dotDecimal.length; _i3++) {
  decimal[dotDecimal[_i3]] = decimal['en-US'];
}

for (var _i4 = 0; _i4 < commaDecimal.length; _i4++) {
  decimal[commaDecimal[_i4]] = ',';
}

alpha['fr-CA'] = alpha['fr-FR'];
alphanumeric['fr-CA'] = alphanumeric['fr-FR'];
alpha['pt-BR'] = alpha['pt-PT'];
alphanumeric['pt-BR'] = alphanumeric['pt-PT'];
decimal['pt-BR'] = decimal['pt-PT']; // see #862

alpha['pl-Pl'] = alpha['pl-PL'];
alphanumeric['pl-Pl'] = alphanumeric['pl-PL'];
decimal['pl-Pl'] = decimal['pl-PL']; // see #1455

alpha['fa-AF'] = alpha.fa;import assertString from './util/assertString';
export default function blacklist(str, chars) {
  assertString(str);
  return str.replace(new RegExp("[".concat(chars, "]+"), 'g'), '');
}import assertString from './util/assertString';
import toString from './util/toString';
import merge from './util/merge';
var defaulContainsOptions = {
  ignoreCase: false,
  minOccurrences: 1
};
export default function contains(str, elem, options) {
  assertString(str);
  options = merge(options, defaulContainsOptions);

  if (options.ignoreCase) {
    return str.toLowerCase().split(toString(elem).toLowerCase()).length > options.minOccurrences;
  }

  return str.split(toString(elem)).length > options.minOccurrences;
}import assertString from './util/assertString';
export default function equals(str, comparison) {
  assertString(str);
  return str === comparison;
}import assertString from './util/assertString';
export default function escape(str) {
  assertString(str);
  return str.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/'/g, '&#x27;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\//g, '&#x2F;').replace(/\\/g, '&#x5C;').replace(/`/g, '&#96;');
}import assertString from './util/assertString';
import toDate from './toDate';
export default function isAfter(str) {
  var date = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : String(new Date());
  assertString(str);
  var comparison = toDate(date);
  var original = toDate(str);
  return !!(original && comparison && original > comparison);
}import assertString from './util/assertString';
import { alpha } from './alpha';
export default function isAlpha(_str) {
  var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en-US';
  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  assertString(_str);
  var str = _str;
  var ignore = options.ignore;

  if (ignore) {
    if (ignore instanceof RegExp) {
      str = str.replace(ignore, '');
    } else if (typeof ignore === 'string') {
      str = str.replace(new RegExp("[".concat(ignore.replace(/[-[\]{}()*+?.,\\^$|#\\s]/g, '\\$&'), "]"), 'g'), ''); // escape regex for ignore
    } else {
      throw new Error('ignore should be instance of a String or RegExp');
    }
  }

  if (locale in alpha) {
    return alpha[locale].test(str);
  }

  throw new Error("Invalid locale '".concat(locale, "'"));
}
export var locales = Object.keys(alpha);import assertString from './util/assertString';
import { alphanumeric } from './alpha';
export default function isAlphanumeric(_str) {
  var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en-US';
  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  assertString(_str);
  var str = _str;
  var ignore = options.ignore;

  if (ignore) {
    if (ignore instanceof RegExp) {
      str = str.replace(ignore, '');
    } else if (typeof ignore === 'string') {
      str = str.replace(new RegExp("[".concat(ignore.replace(/[-[\]{}()*+?.,\\^$|#\\s]/g, '\\$&'), "]"), 'g'), ''); // escape regex for ignore
    } else {
      throw new Error('ignore should be instance of a String or RegExp');
    }
  }

  if (locale in alphanumeric) {
    return alphanumeric[locale].test(str);
  }

  throw new Error("Invalid locale '".concat(locale, "'"));
}
export var locales = Object.keys(alphanumeric);import assertString from './util/assertString';
/* eslint-disable no-control-regex */

var ascii = /^[\x00-\x7F]+$/;
/* eslint-enable no-control-regex */

export default function isAscii(str) {
  assertString(str);
  return ascii.test(str);
}import assertString from './util/assertString';
import { CountryCodes } from './isISO31661Alpha2'; // https://en.wikipedia.org/wiki/ISO_9362

var isBICReg = /^[A-Za-z]{6}[A-Za-z0-9]{2}([A-Za-z0-9]{3})?$/;
export default function isBIC(str) {
  assertString(str); // toUpperCase() should be removed when a new major version goes out that changes
  // the regex to [A-Z] (per the spec).

  if (!CountryCodes.has(str.slice(4, 6).toUpperCase())) {
    return false;
  }

  return isBICReg.test(str);
}import assertString from './util/assertString';
var base32 = /^[A-Z2-7]+=*$/;
export default function isBase32(str) {
  assertString(str);
  var len = str.length;

  if (len % 8 === 0 && base32.test(str)) {
    return true;
  }

  return false;
}import assertString from './util/assertString'; // Accepted chars - 123456789ABCDEFGH JKLMN PQRSTUVWXYZabcdefghijk mnopqrstuvwxyz

var base58Reg = /^[A-HJ-NP-Za-km-z1-9]*$/;
export default function isBase58(str) {
  assertString(str);

  if (base58Reg.test(str)) {
    return true;
  }

  return false;
}import assertString from './util/assertString';
import merge from './util/merge';
var notBase64 = /[^A-Z0-9+\/=]/i;
var urlSafeBase64 = /^[A-Z0-9_\-]*$/i;
var defaultBase64Options = {
  urlSafe: false
};
export default function isBase64(str, options) {
  assertString(str);
  options = merge(options, defaultBase64Options);
  var len = str.length;

  if (options.urlSafe) {
    return urlSafeBase64.test(str);
  }

  if (len % 4 !== 0 || notBase64.test(str)) {
    return false;
  }

  var firstPaddingChar = str.indexOf('=');
  return firstPaddingChar === -1 || firstPaddingChar === len - 1 || firstPaddingChar === len - 2 && str[len - 1] === '=';
}import assertString from './util/assertString';
import toDate from './toDate';
export default function isBefore(str) {
  var date = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : String(new Date());
  assertString(str);
  var comparison = toDate(date);
  var original = toDate(str);
  return !!(original && comparison && original < comparison);
}import assertString from './util/assertString';
var defaultOptions = {
  loose: false
};
var strictBooleans = ['true', 'false', '1', '0'];
var looseBooleans = [].concat(strictBooleans, ['yes', 'no']);
export default function isBoolean(str) {
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultOptions;
  assertString(str);

  if (options.loose) {
    return looseBooleans.includes(str.toLowerCase());
  }

  return strictBooleans.includes(str);
}import assertString from './util/assertString'; // supports Bech32 addresses

var bech32 = /^(bc1)[a-z0-9]{25,39}$/;
var base58 = /^(1|3)[A-HJ-NP-Za-km-z1-9]{25,39}$/;
export default function isBtcAddress(str) {
  assertString(str); // check for bech32

  if (str.startsWith('bc1')) {
    return bech32.test(str);
  }

  return base58.test(str);
}function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

import assertString from './util/assertString';
/* eslint-disable prefer-rest-params */

export default function isByteLength(str, options) {
  assertString(str);
  var min;
  var max;

  if (_typeof(options) === 'object') {
    min = options.min || 0;
    max = options.max;
  } else {
    // backwards compatibility: isByteLength(str, min [, max])
    min = arguments[1];
    max = arguments[2];
  }

  var len = encodeURI(str).split(/%..|./).length - 1;
  return len >= min && (typeof max === 'undefined' || len <= max);
}import assertString from './util/assertString';
/* eslint-disable max-len */

var creditCard = /^(?:4[0-9]{12}(?:[0-9]{3,6})?|5[1-5][0-9]{14}|(222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12,15}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11}|6[27][0-9]{14}|^(81[0-9]{14,17}))$/;
/* eslint-enable max-len */

export default function isCreditCard(str) {
  assertString(str);
  var sanitized = str.replace(/[- ]+/g, '');

  if (!creditCard.test(sanitized)) {
    return false;
  }

  var sum = 0;
  var digit;
  var tmpNum;
  var shouldDouble;

  for (var i = sanitized.length - 1; i >= 0; i--) {
    digit = sanitized.substring(i, i + 1);
    tmpNum = parseInt(digit, 10);

    if (shouldDouble) {
      tmpNum *= 2;

      if (tmpNum >= 10) {
        sum += tmpNum % 10 + 1;
      } else {
        sum += tmpNum;
      }
    } else {
      sum += tmpNum;
    }

    shouldDouble = !shouldDouble;
  }

  return !!(sum % 10 === 0 ? sanitized : false);
}import merge from './util/merge';
import assertString from './util/assertString';

function currencyRegex(options) {
  var decimal_digits = "\\d{".concat(options.digits_after_decimal[0], "}");
  options.digits_after_decimal.forEach(function (digit, index) {
    if (index !== 0) decimal_digits = "".concat(decimal_digits, "|\\d{").concat(digit, "}");
  });
  var symbol = "(".concat(options.symbol.replace(/\W/, function (m) {
    return "\\".concat(m);
  }), ")").concat(options.require_symbol ? '' : '?'),
      negative = '-?',
      whole_dollar_amount_without_sep = '[1-9]\\d*',
      whole_dollar_amount_with_sep = "[1-9]\\d{0,2}(\\".concat(options.thousands_separator, "\\d{3})*"),
      valid_whole_dollar_amounts = ['0', whole_dollar_amount_without_sep, whole_dollar_amount_with_sep],
      whole_dollar_amount = "(".concat(valid_whole_dollar_amounts.join('|'), ")?"),
      decimal_amount = "(\\".concat(options.decimal_separator, "(").concat(decimal_digits, "))").concat(options.require_decimal ? '' : '?');
  var pattern = whole_dollar_amount + (options.allow_decimal || options.require_decimal ? decimal_amount : ''); // default is negative sign before symbol, but there are two other options (besides parens)

  if (options.allow_negatives && !options.parens_for_negatives) {
    if (options.negative_sign_after_digits) {
      pattern += negative;
    } else if (options.negative_sign_before_digits) {
      pattern = negative + pattern;
    }
  } // South African Rand, for example, uses R 123 (space) and R-123 (no space)


  if (options.allow_negative_sign_placeholder) {
    pattern = "( (?!\\-))?".concat(pattern);
  } else if (options.allow_space_after_symbol) {
    pattern = " ?".concat(pattern);
  } else if (options.allow_space_after_digits) {
    pattern += '( (?!$))?';
  }

  if (options.symbol_after_digits) {
    pattern += symbol;
  } else {
    pattern = symbol + pattern;
  }

  if (options.allow_negatives) {
    if (options.parens_for_negatives) {
      pattern = "(\\(".concat(pattern, "\\)|").concat(pattern, ")");
    } else if (!(options.negative_sign_before_digits || options.negative_sign_after_digits)) {
      pattern = negative + pattern;
    }
  } // ensure there's a dollar and/or decimal amount, and that
  // it doesn't start with a space or a negative sign followed by a space


  return new RegExp("^(?!-? )(?=.*\\d)".concat(pattern, "$"));
}

var default_currency_options = {
  symbol: '$',
  require_symbol: false,
  allow_space_after_symbol: false,
  symbol_after_digits: false,
  allow_negatives: true,
  parens_for_negatives: false,
  negative_sign_before_digits: false,
  negative_sign_after_digits: false,
  allow_negative_sign_placeholder: false,
  thousands_separator: ',',
  decimal_separator: '.',
  allow_decimal: true,
  require_decimal: false,
  digits_after_decimal: [2],
  allow_space_after_digits: false
};
export default function isCurrency(str, options) {
  assertString(str);
  options = merge(options, default_currency_options);
  return currencyRegex(options).test(str);
}import assertString from './util/assertString';
var validMediaType = /^[a-z]+\/[a-z0-9\-\+]+$/i;
var validAttribute = /^[a-z\-]+=[a-z0-9\-]+$/i;
var validData = /^[a-z0-9!\$&'\(\)\*\+,;=\-\._~:@\/\?%\s]*$/i;
export default function isDataURI(str) {
  assertString(str);
  var data = str.split(',');

  if (data.length < 2) {
    return false;
  }

  var attributes = data.shift().trim().split(';');
  var schemeAndMediaType = attributes.shift();

  if (schemeAndMediaType.substr(0, 5) !== 'data:') {
    return false;
  }

  var mediaType = schemeAndMediaType.substr(5);

  if (mediaType !== '' && !validMediaType.test(mediaType)) {
    return false;
  }

  for (var i = 0; i < attributes.length; i++) {
    if (!(i === attributes.length - 1 && attributes[i].toLowerCase() === 'base64') && !validAttribute.test(attributes[i])) {
      return false;
    }
  }

  for (var _i = 0; _i < data.length; _i++) {
    if (!validData.test(data[_i])) {
      return false;
    }
  }

  return true;
}function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }

function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }

function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }

function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }

import merge from './util/merge';
var default_date_options = {
  format: 'YYYY/MM/DD',
  delimiters: ['/', '-'],
  strictMode: false
};

function isValidFormat(format) {
  return /(^(y{4}|y{2})[.\/-](m{1,2})[.\/-](d{1,2})$)|(^(m{1,2})[.\/-](d{1,2})[.\/-]((y{4}|y{2})$))|(^(d{1,2})[.\/-](m{1,2})[.\/-]((y{4}|y{2})$))/gi.test(format);
}

function zip(date, format) {
  var zippedArr = [],
      len = Math.min(date.length, format.length);

  for (var i = 0; i < len; i++) {
    zippedArr.push([date[i], format[i]]);
  }

  return zippedArr;
}

export default function isDate(input, options) {
  if (typeof options === 'string') {
    // Allow backward compatbility for old format isDate(input [, format])
    options = merge({
      format: options
    }, default_date_options);
  } else {
    options = merge(options, default_date_options);
  }

  if (typeof input === 'string' && isValidFormat(options.format)) {
    var formatDelimiter = options.delimiters.find(function (delimiter) {
      return options.format.indexOf(delimiter) !== -1;
    });
    var dateDelimiter = options.strictMode ? formatDelimiter : options.delimiters.find(function (delimiter) {
      return input.indexOf(delimiter) !== -1;
    });
    var dateAndFormat = zip(input.split(dateDelimiter), options.format.toLowerCase().split(formatDelimiter));
    var dateObj = {};

    var _iterator = _createForOfIteratorHelper(dateAndFormat),
        _step;

    try {
      for (_iterator.s(); !(_step = _iterator.n()).done;) {
        var _step$value = _slicedToArray(_step.value, 2),
            dateWord = _step$value[0],
            formatWord = _step$value[1];

        if (dateWord.length !== formatWord.length) {
          return false;
        }

        dateObj[formatWord.charAt(0)] = dateWord;
      }
    } catch (err) {
      _iterator.e(err);
    } finally {
      _iterator.f();
    }

    return new Date("".concat(dateObj.m, "/").concat(dateObj.d, "/").concat(dateObj.y)).getDate() === +dateObj.d;
  }

  if (!options.strictMode) {
    return Object.prototype.toString.call(input) === '[object Date]' && isFinite(input);
  }

  return false;
}import merge from './util/merge';
import assertString from './util/assertString';
import includes from './util/includes';
import { decimal } from './alpha';

function decimalRegExp(options) {
  var regExp = new RegExp("^[-+]?([0-9]+)?(\\".concat(decimal[options.locale], "[0-9]{").concat(options.decimal_digits, "})").concat(options.force_decimal ? '' : '?', "$"));
  return regExp;
}

var default_decimal_options = {
  force_decimal: false,
  decimal_digits: '1,',
  locale: 'en-US'
};
var blacklist = ['', '-', '+'];
export default function isDecimal(str, options) {
  assertString(str);
  options = merge(options, default_decimal_options);

  if (options.locale in decimal) {
    return !includes(blacklist, str.replace(/ /g, '')) && decimalRegExp(options).test(str);
  }

  throw new Error("Invalid locale '".concat(options.locale, "'"));
}import assertString from './util/assertString';
import toFloat from './toFloat';
export default function isDivisibleBy(str, num) {
  assertString(str);
  return toFloat(str) % parseInt(num, 10) === 0;
}/**
 * The most commonly used EAN standard is
 * the thirteen-digit EAN-13, while the
 * less commonly used 8-digit EAN-8 barcode was
 * introduced for use on small packages.
 * Also EAN/UCC-14 is used for Grouping of individual
 * trade items above unit level(Intermediate, Carton or Pallet).
 * For more info about EAN-14 checkout: https://www.gtin.info/itf-14-barcodes/
 * EAN consists of:
 * GS1 prefix, manufacturer code, product code and check digit
 * Reference: https://en.wikipedia.org/wiki/International_Article_Number
 * Reference: https://www.gtin.info/
 */
import assertString from './util/assertString';
/**
 * Define EAN Lenghts; 8 for EAN-8; 13 for EAN-13; 14 for EAN-14
 * and Regular Expression for valid EANs (EAN-8, EAN-13, EAN-14),
 * with exact numberic matching of 8 or 13 or 14 digits [0-9]
 */

var LENGTH_EAN_8 = 8;
var LENGTH_EAN_14 = 14;
var validEanRegex = /^(\d{8}|\d{13}|\d{14})$/;
/**
 * Get position weight given:
 * EAN length and digit index/position
 *
 * @param {number} length
 * @param {number} index
 * @return {number}
 */

function getPositionWeightThroughLengthAndIndex(length, index) {
  if (length === LENGTH_EAN_8 || length === LENGTH_EAN_14) {
    return index % 2 === 0 ? 3 : 1;
  }

  return index % 2 === 0 ? 1 : 3;
}
/**
 * Calculate EAN Check Digit
 * Reference: https://en.wikipedia.org/wiki/International_Article_Number#Calculation_of_checksum_digit
 *
 * @param {string} ean
 * @return {number}
 */


function calculateCheckDigit(ean) {
  var checksum = ean.slice(0, -1).split('').map(function (_char, index) {
    return Number(_char) * getPositionWeightThroughLengthAndIndex(ean.length, index);
  }).reduce(function (acc, partialSum) {
    return acc + partialSum;
  }, 0);
  var remainder = 10 - checksum % 10;
  return remainder < 10 ? remainder : 0;
}
/**
 * Check if string is valid EAN:
 * Matches EAN-8/EAN-13/EAN-14 regex
 * Has valid check digit.
 *
 * @param {string} str
 * @return {boolean}
 */


export default function isEAN(str) {
  assertString(str);
  var actualCheckDigit = Number(str.slice(-1));
  return validEanRegex.test(str) && actualCheckDigit === calculateCheckDigit(str);
}import assertString from './util/assertString';
import merge from './util/merge';
import isByteLength from './isByteLength';
import isFQDN from './isFQDN';
import isIP from './isIP';
var default_email_options = {
  allow_display_name: false,
  require_display_name: false,
  allow_utf8_local_part: true,
  require_tld: true,
  blacklisted_chars: '',
  ignore_max_length: false,
  host_blacklist: []
};
/* eslint-disable max-len */

/* eslint-disable no-control-regex */

var splitNameAddress = /^([^\x00-\x1F\x7F-\x9F\cX]+)</i;
var emailUserPart = /^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~]+$/i;
var gmailUserPart = /^[a-z\d]+$/;
var quotedEmailUser = /^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f]))*$/i;
var emailUserUtf8Part = /^[a-z\d!#\$%&'\*\+\-\/=\?\^_`{\|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+$/i;
var quotedEmailUserUtf8 = /^([\s\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|(\\[\x01-\x09\x0b\x0c\x0d-\x7f\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))*$/i;
var defaultMaxEmailLength = 254;
/* eslint-enable max-len */

/* eslint-enable no-control-regex */

/**
 * Validate display name according to the RFC2822: https://tools.ietf.org/html/rfc2822#appendix-A.1.2
 * @param {String} display_name
 */

function validateDisplayName(display_name) {
  var display_name_without_quotes = display_name.replace(/^"(.+)"$/, '$1'); // display name with only spaces is not valid

  if (!display_name_without_quotes.trim()) {
    return false;
  } // check whether display name contains illegal character


  var contains_illegal = /[\.";<>]/.test(display_name_without_quotes);

  if (contains_illegal) {
    // if contains illegal characters,
    // must to be enclosed in double-quotes, otherwise it's not a valid display name
    if (display_name_without_quotes === display_name) {
      return false;
    } // the quotes in display name must start with character symbol \


    var all_start_with_back_slash = display_name_without_quotes.split('"').length === display_name_without_quotes.split('\\"').length;

    if (!all_start_with_back_slash) {
      return false;
    }
  }

  return true;
}

export default function isEmail(str, options) {
  assertString(str);
  options = merge(options, default_email_options);

  if (options.require_display_name || options.allow_display_name) {
    var display_email = str.match(splitNameAddress);

    if (display_email) {
      var display_name = display_email[1]; // Remove display name and angle brackets to get email address
      // Can be done in the regex but will introduce a ReDOS (See  #1597 for more info)

      str = str.replace(display_name, '').replace(/(^<|>$)/g, ''); // sometimes need to trim the last space to get the display name
      // because there may be a space between display name and email address
      // eg. myname <address@gmail.com>
      // the display name is `myname` instead of `myname `, so need to trim the last space

      if (display_name.endsWith(' ')) {
        display_name = display_name.substr(0, display_name.length - 1);
      }

      if (!validateDisplayName(display_name)) {
        return false;
      }
    } else if (options.require_display_name) {
      return false;
    }
  }

  if (!options.ignore_max_length && str.length > defaultMaxEmailLength) {
    return false;
  }

  var parts = str.split('@');
  var domain = parts.pop();
  var lower_domain = domain.toLowerCase();

  if (options.host_blacklist.includes(lower_domain)) {
    return false;
  }

  var user = parts.join('@');

  if (options.domain_specific_validation && (lower_domain === 'gmail.com' || lower_domain === 'googlemail.com')) {
    /*
      Previously we removed dots for gmail addresses before validating.
      This was removed because it allows `multiple..dots@gmail.com`
      to be reported as valid, but it is not.
      Gmail only normalizes single dots, removing them from here is pointless,
      should be done in normalizeEmail
    */
    user = user.toLowerCase(); // Removing sub-address from username before gmail validation

    var username = user.split('+')[0]; // Dots are not included in gmail length restriction

    if (!isByteLength(username.replace(/\./g, ''), {
      min: 6,
      max: 30
    })) {
      return false;
    }

    var _user_parts = username.split('.');

    for (var i = 0; i < _user_parts.length; i++) {
      if (!gmailUserPart.test(_user_parts[i])) {
        return false;
      }
    }
  }

  if (options.ignore_max_length === false && (!isByteLength(user, {
    max: 64
  }) || !isByteLength(domain, {
    max: 254
  }))) {
    return false;
  }

  if (!isFQDN(domain, {
    require_tld: options.require_tld
  })) {
    if (!options.allow_ip_domain) {
      return false;
    }

    if (!isIP(domain)) {
      if (!domain.startsWith('[') || !domain.endsWith(']')) {
        return false;
      }

      var noBracketdomain = domain.substr(1, domain.length - 2);

      if (noBracketdomain.length === 0 || !isIP(noBracketdomain)) {
        return false;
      }
    }
  }

  if (user[0] === '"') {
    user = user.slice(1, user.length - 1);
    return options.allow_utf8_local_part ? quotedEmailUserUtf8.test(user) : quotedEmailUser.test(user);
  }

  var pattern = options.allow_utf8_local_part ? emailUserUtf8Part : emailUserPart;
  var user_parts = user.split('.');

  for (var _i = 0; _i < user_parts.length; _i++) {
    if (!pattern.test(user_parts[_i])) {
      return false;
    }
  }

  if (options.blacklisted_chars) {
    if (user.search(new RegExp("[".concat(options.blacklisted_chars, "]+"), 'g')) !== -1) return false;
  }

  return true;
}import assertString from './util/assertString';
import merge from './util/merge';
var default_is_empty_options = {
  ignore_whitespace: false
};
export default function isEmpty(str, options) {
  assertString(str);
  options = merge(options, default_is_empty_options);
  return (options.ignore_whitespace ? str.trim().length : str.length) === 0;
}import assertString from './util/assertString';
var eth = /^(0x)[0-9a-f]{40}$/i;
export default function isEthereumAddress(str) {
  assertString(str);
  return eth.test(str);
}import assertString from './util/assertString';
import merge from './util/merge';
var default_fqdn_options = {
  require_tld: true,
  allow_underscores: false,
  allow_trailing_dot: false,
  allow_numeric_tld: false,
  allow_wildcard: false
};
export default function isFQDN(str, options) {
  assertString(str);
  options = merge(options, default_fqdn_options);
  /* Remove the optional trailing dot before checking validity */

  if (options.allow_trailing_dot && str[str.length - 1] === '.') {
    str = str.substring(0, str.length - 1);
  }
  /* Remove the optional wildcard before checking validity */


  if (options.allow_wildcard === true && str.indexOf('*.') === 0) {
    str = str.substring(2);
  }

  var parts = str.split('.');
  var tld = parts[parts.length - 1];

  if (options.require_tld) {
    // disallow fqdns without tld
    if (parts.length < 2) {
      return false;
    }

    if (!/^([a-z\u00A1-\u00A8\u00AA-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]{2,}|xn[a-z0-9-]{2,})$/i.test(tld)) {
      return false;
    } // disallow spaces


    if (/\s/.test(tld)) {
      return false;
    }
  } // reject numeric TLDs


  if (!options.allow_numeric_tld && /^\d+$/.test(tld)) {
    return false;
  }

  return parts.every(function (part) {
    if (part.length > 63) {
      return false;
    }

    if (!/^[a-z_\u00a1-\uffff0-9-]+$/i.test(part)) {
      return false;
    } // disallow full-width chars


    if (/[\uff01-\uff5e]/.test(part)) {
      return false;
    } // disallow parts starting or ending with hyphen


    if (/^-|-$/.test(part)) {
      return false;
    }

    if (!options.allow_underscores && /_/.test(part)) {
      return false;
    }

    return true;
  });
}import assertString from './util/assertString';
import { decimal } from './alpha';
export default function isFloat(str, options) {
  assertString(str);
  options = options || {};

  var _float = new RegExp("^(?:[-+])?(?:[0-9]+)?(?:\\".concat(options.locale ? decimal[options.locale] : '.', "[0-9]*)?(?:[eE][\\+\\-]?(?:[0-9]+))?$"));

  if (str === '' || str === '.' || str === '-' || str === '+') {
    return false;
  }

  var value = parseFloat(str.replace(',', '.'));
  return _float.test(str) && (!options.hasOwnProperty('min') || value >= options.min) && (!options.hasOwnProperty('max') || value <= options.max) && (!options.hasOwnProperty('lt') || value < options.lt) && (!options.hasOwnProperty('gt') || value > options.gt);
}
export var locales = Object.keys(decimal);import assertString from './util/assertString';
export var fullWidth = /[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/;
export default function isFullWidth(str) {
  assertString(str);
  return fullWidth.test(str);
}import assertString from './util/assertString';
var hslComma = /^hsla?\(((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?))(deg|grad|rad|turn)?(,(\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%){2}(,((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%?))?\)$/i;
var hslSpace = /^hsla?\(((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?))(deg|grad|rad|turn)?(\s(\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%){2}\s?(\/\s((\+|\-)?([0-9]+(\.[0-9]+)?(e(\+|\-)?[0-9]+)?|\.[0-9]+(e(\+|\-)?[0-9]+)?)%?)\s?)?\)$/i;
export default function isHSL(str) {
  assertString(str); // Strip duplicate spaces before calling the validation regex (See  #1598 for more info)

  var strippedStr = str.replace(/\s+/g, ' ').replace(/\s?(hsla?\(|\)|,)\s?/ig, '$1');

  if (strippedStr.indexOf(',') !== -1) {
    return hslComma.test(strippedStr);
  }

  return hslSpace.test(strippedStr);
}import assertString from './util/assertString';
export var halfWidth = /[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]/;
export default function isHalfWidth(str) {
  assertString(str);
  return halfWidth.test(str);
}import assertString from './util/assertString';
var lengths = {
  md5: 32,
  md4: 32,
  sha1: 40,
  sha256: 64,
  sha384: 96,
  sha512: 128,
  ripemd128: 32,
  ripemd160: 40,
  tiger128: 32,
  tiger160: 40,
  tiger192: 48,
  crc32: 8,
  crc32b: 8
};
export default function isHash(str, algorithm) {
  assertString(str);
  var hash = new RegExp("^[a-fA-F0-9]{".concat(lengths[algorithm], "}$"));
  return hash.test(str);
}import assertString from './util/assertString';
var hexcolor = /^#?([0-9A-F]{3}|[0-9A-F]{4}|[0-9A-F]{6}|[0-9A-F]{8})$/i;
export default function isHexColor(str) {
  assertString(str);
  return hexcolor.test(str);
}import assertString from './util/assertString';
var hexadecimal = /^(0x|0h)?[0-9A-F]+$/i;
export default function isHexadecimal(str) {
  assertString(str);
  return hexadecimal.test(str);
}import assertString from './util/assertString';
/**
 * List of country codes with
 * corresponding IBAN regular expression
 * Reference: https://en.wikipedia.org/wiki/International_Bank_Account_Number
 */

var ibanRegexThroughCountryCode = {
  AD: /^(AD[0-9]{2})\d{8}[A-Z0-9]{12}$/,
  AE: /^(AE[0-9]{2})\d{3}\d{16}$/,
  AL: /^(AL[0-9]{2})\d{8}[A-Z0-9]{16}$/,
  AT: /^(AT[0-9]{2})\d{16}$/,
  AZ: /^(AZ[0-9]{2})[A-Z0-9]{4}\d{20}$/,
  BA: /^(BA[0-9]{2})\d{16}$/,
  BE: /^(BE[0-9]{2})\d{12}$/,
  BG: /^(BG[0-9]{2})[A-Z]{4}\d{6}[A-Z0-9]{8}$/,
  BH: /^(BH[0-9]{2})[A-Z]{4}[A-Z0-9]{14}$/,
  BR: /^(BR[0-9]{2})\d{23}[A-Z]{1}[A-Z0-9]{1}$/,
  BY: /^(BY[0-9]{2})[A-Z0-9]{4}\d{20}$/,
  CH: /^(CH[0-9]{2})\d{5}[A-Z0-9]{12}$/,
  CR: /^(CR[0-9]{2})\d{18}$/,
  CY: /^(CY[0-9]{2})\d{8}[A-Z0-9]{16}$/,
  CZ: /^(CZ[0-9]{2})\d{20}$/,
  DE: /^(DE[0-9]{2})\d{18}$/,
  DK: /^(DK[0-9]{2})\d{14}$/,
  DO: /^(DO[0-9]{2})[A-Z]{4}\d{20}$/,
  EE: /^(EE[0-9]{2})\d{16}$/,
  EG: /^(EG[0-9]{2})\d{25}$/,
  ES: /^(ES[0-9]{2})\d{20}$/,
  FI: /^(FI[0-9]{2})\d{14}$/,
  FO: /^(FO[0-9]{2})\d{14}$/,
  FR: /^(FR[0-9]{2})\d{10}[A-Z0-9]{11}\d{2}$/,
  GB: /^(GB[0-9]{2})[A-Z]{4}\d{14}$/,
  GE: /^(GE[0-9]{2})[A-Z0-9]{2}\d{16}$/,
  GI: /^(GI[0-9]{2})[A-Z]{4}[A-Z0-9]{15}$/,
  GL: /^(GL[0-9]{2})\d{14}$/,
  GR: /^(GR[0-9]{2})\d{7}[A-Z0-9]{16}$/,
  GT: /^(GT[0-9]{2})[A-Z0-9]{4}[A-Z0-9]{20}$/,
  HR: /^(HR[0-9]{2})\d{17}$/,
  HU: /^(HU[0-9]{2})\d{24}$/,
  IE: /^(IE[0-9]{2})[A-Z0-9]{4}\d{14}$/,
  IL: /^(IL[0-9]{2})\d{19}$/,
  IQ: /^(IQ[0-9]{2})[A-Z]{4}\d{15}$/,
  IR: /^(IR[0-9]{2})0\d{2}0\d{18}$/,
  IS: /^(IS[0-9]{2})\d{22}$/,
  IT: /^(IT[0-9]{2})[A-Z]{1}\d{10}[A-Z0-9]{12}$/,
  JO: /^(JO[0-9]{2})[A-Z]{4}\d{22}$/,
  KW: /^(KW[0-9]{2})[A-Z]{4}[A-Z0-9]{22}$/,
  KZ: /^(KZ[0-9]{2})\d{3}[A-Z0-9]{13}$/,
  LB: /^(LB[0-9]{2})\d{4}[A-Z0-9]{20}$/,
  LC: /^(LC[0-9]{2})[A-Z]{4}[A-Z0-9]{24}$/,
  LI: /^(LI[0-9]{2})\d{5}[A-Z0-9]{12}$/,
  LT: /^(LT[0-9]{2})\d{16}$/,
  LU: /^(LU[0-9]{2})\d{3}[A-Z0-9]{13}$/,
  LV: /^(LV[0-9]{2})[A-Z]{4}[A-Z0-9]{13}$/,
  MC: /^(MC[0-9]{2})\d{10}[A-Z0-9]{11}\d{2}$/,
  MD: /^(MD[0-9]{2})[A-Z0-9]{20}$/,
  ME: /^(ME[0-9]{2})\d{18}$/,
  MK: /^(MK[0-9]{2})\d{3}[A-Z0-9]{10}\d{2}$/,
  MR: /^(MR[0-9]{2})\d{23}$/,
  MT: /^(MT[0-9]{2})[A-Z]{4}\d{5}[A-Z0-9]{18}$/,
  MU: /^(MU[0-9]{2})[A-Z]{4}\d{19}[A-Z]{3}$/,
  MZ: /^(MZ[0-9]{2})\d{21}$/,
  NL: /^(NL[0-9]{2})[A-Z]{4}\d{10}$/,
  NO: /^(NO[0-9]{2})\d{11}$/,
  PK: /^(PK[0-9]{2})[A-Z0-9]{4}\d{16}$/,
  PL: /^(PL[0-9]{2})\d{24}$/,
  PS: /^(PS[0-9]{2})[A-Z0-9]{4}\d{21}$/,
  PT: /^(PT[0-9]{2})\d{21}$/,
  QA: /^(QA[0-9]{2})[A-Z]{4}[A-Z0-9]{21}$/,
  RO: /^(RO[0-9]{2})[A-Z]{4}[A-Z0-9]{16}$/,
  RS: /^(RS[0-9]{2})\d{18}$/,
  SA: /^(SA[0-9]{2})\d{2}[A-Z0-9]{18}$/,
  SC: /^(SC[0-9]{2})[A-Z]{4}\d{20}[A-Z]{3}$/,
  SE: /^(SE[0-9]{2})\d{20}$/,
  SI: /^(SI[0-9]{2})\d{15}$/,
  SK: /^(SK[0-9]{2})\d{20}$/,
  SM: /^(SM[0-9]{2})[A-Z]{1}\d{10}[A-Z0-9]{12}$/,
  SV: /^(SV[0-9]{2})[A-Z0-9]{4}\d{20}$/,
  TL: /^(TL[0-9]{2})\d{19}$/,
  TN: /^(TN[0-9]{2})\d{20}$/,
  TR: /^(TR[0-9]{2})\d{5}[A-Z0-9]{17}$/,
  UA: /^(UA[0-9]{2})\d{6}[A-Z0-9]{19}$/,
  VA: /^(VA[0-9]{2})\d{18}$/,
  VG: /^(VG[0-9]{2})[A-Z0-9]{4}\d{16}$/,
  XK: /^(XK[0-9]{2})\d{16}$/
};
/**
 * Check whether string has correct universal IBAN format
 * The IBAN consists of up to 34 alphanumeric characters, as follows:
 * Country Code using ISO 3166-1 alpha-2, two letters
 * check digits, two digits and
 * Basic Bank Account Number (BBAN), up to 30 alphanumeric characters.
 * NOTE: Permitted IBAN characters are: digits [0-9] and the 26 latin alphabetic [A-Z]
 *
 * @param {string} str - string under validation
 * @return {boolean}
 */

function hasValidIbanFormat(str) {
  // Strip white spaces and hyphens
  var strippedStr = str.replace(/[\s\-]+/gi, '').toUpperCase();
  var isoCountryCode = strippedStr.slice(0, 2).toUpperCase();
  return isoCountryCode in ibanRegexThroughCountryCode && ibanRegexThroughCountryCode[isoCountryCode].test(strippedStr);
}
/**
   * Check whether string has valid IBAN Checksum
   * by performing basic mod-97 operation and
   * the remainder should equal 1
   * -- Start by rearranging the IBAN by moving the four initial characters to the end of the string
   * -- Replace each letter in the string with two digits, A -> 10, B = 11, Z = 35
   * -- Interpret the string as a decimal integer and
   * -- compute the remainder on division by 97 (mod 97)
   * Reference: https://en.wikipedia.org/wiki/International_Bank_Account_Number
   *
   * @param {string} str
   * @return {boolean}
   */


function hasValidIbanChecksum(str) {
  var strippedStr = str.replace(/[^A-Z0-9]+/gi, '').toUpperCase(); // Keep only digits and A-Z latin alphabetic

  var rearranged = strippedStr.slice(4) + strippedStr.slice(0, 4);
  var alphaCapsReplacedWithDigits = rearranged.replace(/[A-Z]/g, function (_char) {
    return _char.charCodeAt(0) - 55;
  });
  var remainder = alphaCapsReplacedWithDigits.match(/\d{1,7}/g).reduce(function (acc, value) {
    return Number(acc + value) % 97;
  }, '');
  return remainder === 1;
}

export default function isIBAN(str) {
  assertString(str);
  return hasValidIbanFormat(str) && hasValidIbanChecksum(str);
}
export var locales = Object.keys(ibanRegexThroughCountryCode);import assertString from './util/assertString';
var imeiRegexWithoutHypens = /^[0-9]{15}$/;
var imeiRegexWithHypens = /^\d{2}-\d{6}-\d{6}-\d{1}$/;
export default function isIMEI(str, options) {
  assertString(str);
  options = options || {}; // default regex for checking imei is the one without hyphens

  var imeiRegex = imeiRegexWithoutHypens;

  if (options.allow_hyphens) {
    imeiRegex = imeiRegexWithHypens;
  }

  if (!imeiRegex.test(str)) {
    return false;
  }

  str = str.replace(/-/g, '');
  var sum = 0,
      mul = 2,
      l = 14;

  for (var i = 0; i < l; i++) {
    var digit = str.substring(l - i - 1, l - i);
    var tp = parseInt(digit, 10) * mul;

    if (tp >= 10) {
      sum += tp % 10 + 1;
    } else {
      sum += tp;
    }

    if (mul === 1) {
      mul += 1;
    } else {
      mul -= 1;
    }
  }

  var chk = (10 - sum % 10) % 10;

  if (chk !== parseInt(str.substring(14, 15), 10)) {
    return false;
  }

  return true;
}import assertString from './util/assertString';
/**
11.3.  Examples

   The following addresses

             fe80::1234 (on the 1st link of the node)
             ff02::5678 (on the 5th link of the node)
             ff08::9abc (on the 10th organization of the node)

   would be represented as follows:

             fe80::1234%1
             ff02::5678%5
             ff08::9abc%10

   (Here we assume a natural translation from a zone index to the
   <zone_id> part, where the Nth zone of any scope is translated into
   "N".)

   If we use interface names as <zone_id>, those addresses could also be
   represented as follows:

            fe80::1234%ne0
            ff02::5678%pvc1.3
            ff08::9abc%interface10

   where the interface "ne0" belongs to the 1st link, "pvc1.3" belongs
   to the 5th link, and "interface10" belongs to the 10th organization.
 * * */

var IPv4SegmentFormat = '(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';
var IPv4AddressFormat = "(".concat(IPv4SegmentFormat, "[.]){3}").concat(IPv4SegmentFormat);
var IPv4AddressRegExp = new RegExp("^".concat(IPv4AddressFormat, "$"));
var IPv6SegmentFormat = '(?:[0-9a-fA-F]{1,4})';
var IPv6AddressRegExp = new RegExp('^(' + "(?:".concat(IPv6SegmentFormat, ":){7}(?:").concat(IPv6SegmentFormat, "|:)|") + "(?:".concat(IPv6SegmentFormat, ":){6}(?:").concat(IPv4AddressFormat, "|:").concat(IPv6SegmentFormat, "|:)|") + "(?:".concat(IPv6SegmentFormat, ":){5}(?::").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,2}|:)|") + "(?:".concat(IPv6SegmentFormat, ":){4}(?:(:").concat(IPv6SegmentFormat, "){0,1}:").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,3}|:)|") + "(?:".concat(IPv6SegmentFormat, ":){3}(?:(:").concat(IPv6SegmentFormat, "){0,2}:").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,4}|:)|") + "(?:".concat(IPv6SegmentFormat, ":){2}(?:(:").concat(IPv6SegmentFormat, "){0,3}:").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,5}|:)|") + "(?:".concat(IPv6SegmentFormat, ":){1}(?:(:").concat(IPv6SegmentFormat, "){0,4}:").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,6}|:)|") + "(?::((?::".concat(IPv6SegmentFormat, "){0,5}:").concat(IPv4AddressFormat, "|(?::").concat(IPv6SegmentFormat, "){1,7}|:))") + ')(%[0-9a-zA-Z-.:]{1,})?$');
export default function isIP(str) {
  var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
  assertString(str);
  version = String(version);

  if (!version) {
    return isIP(str, 4) || isIP(str, 6);
  }

  if (version === '4') {
    if (!IPv4AddressRegExp.test(str)) {
      return false;
    }

    var parts = str.split('.').sort(function (a, b) {
      return a - b;
    });
    return parts[3] <= 255;
  }

  if (version === '6') {
    return !!IPv6AddressRegExp.test(str);
  }

  return false;
}import assertString from './util/assertString';
import isIP from './isIP';
var subnetMaybe = /^\d{1,3}$/;
var v4Subnet = 32;
var v6Subnet = 128;
export default function isIPRange(str) {
  var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
  assertString(str);
  var parts = str.split('/'); // parts[0] -> ip, parts[1] -> subnet

  if (parts.length !== 2) {
    return false;
  }

  if (!subnetMaybe.test(parts[1])) {
    return false;
  } // Disallow preceding 0 i.e. 01, 02, ...


  if (parts[1].length > 1 && parts[1].startsWith('0')) {
    return false;
  }

  var isValidIP = isIP(parts[0], version);

  if (!isValidIP) {
    return false;
  } // Define valid subnet according to IP's version


  var expectedSubnet = null;

  switch (String(version)) {
    case '4':
      expectedSubnet = v4Subnet;
      break;

    case '6':
      expectedSubnet = v6Subnet;
      break;

    default:
      expectedSubnet = isIP(parts[0], '6') ? v6Subnet : v4Subnet;
  }

  return parts[1] <= expectedSubnet && parts[1] >= 0;
}import assertString from './util/assertString';
var isbn10Maybe = /^(?:[0-9]{9}X|[0-9]{10})$/;
var isbn13Maybe = /^(?:[0-9]{13})$/;
var factor = [1, 3];
export default function isISBN(str) {
  var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
  assertString(str);
  version = String(version);

  if (!version) {
    return isISBN(str, 10) || isISBN(str, 13);
  }

  var sanitized = str.replace(/[\s-]+/g, '');
  var checksum = 0;
  var i;

  if (version === '10') {
    if (!isbn10Maybe.test(sanitized)) {
      return false;
    }

    for (i = 0; i < 9; i++) {
      checksum += (i + 1) * sanitized.charAt(i);
    }

    if (sanitized.charAt(9) === 'X') {
      checksum += 10 * 10;
    } else {
      checksum += 10 * sanitized.charAt(9);
    }

    if (checksum % 11 === 0) {
      return !!sanitized;
    }
  } else if (version === '13') {
    if (!isbn13Maybe.test(sanitized)) {
      return false;
    }

    for (i = 0; i < 12; i++) {
      checksum += factor[i % 2] * sanitized.charAt(i);
    }

    if (sanitized.charAt(12) - (10 - checksum % 10) % 10 === 0) {
      return !!sanitized;
    }
  }

  return false;
}import assertString from './util/assertString';
var isin = /^[A-Z]{2}[0-9A-Z]{9}[0-9]$/; // this link details how the check digit is calculated:
// https://www.isin.org/isin-format/. it is a little bit
// odd in that it works with digits, not numbers. in order
// to make only one pass through the ISIN characters, the
// each alpha character is handled as 2 characters within
// the loop.

export default function isISIN(str) {
  assertString(str);

  if (!isin.test(str)) {
    return false;
  }

  var _double = true;
  var sum = 0; // convert values

  for (var i = str.length - 2; i >= 0; i--) {
    if (str[i] >= 'A' && str[i] <= 'Z') {
      var value = str[i].charCodeAt(0) - 55;
      var lo = value % 10;
      var hi = Math.trunc(value / 10); // letters have two digits, so handle the low order
      // and high order digits separately.

      for (var _i = 0, _arr = [lo, hi]; _i < _arr.length; _i++) {
        var digit = _arr[_i];

        if (_double) {
          if (digit >= 5) {
            sum += 1 + (digit - 5) * 2;
          } else {
            sum += digit * 2;
          }
        } else {
          sum += digit;
        }

        _double = !_double;
      }
    } else {
      var _digit = str[i].charCodeAt(0) - '0'.charCodeAt(0);

      if (_double) {
        if (_digit >= 5) {
          sum += 1 + (_digit - 5) * 2;
        } else {
          sum += _digit * 2;
        }
      } else {
        sum += _digit;
      }

      _double = !_double;
    }
  }

  var check = Math.trunc((sum + 9) / 10) * 10 - sum;
  return +str[str.length - 1] === check;
}import assertString from './util/assertString'; // from https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2

var validISO31661Alpha2CountriesCodes = new Set(['AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AO', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AW', 'AX', 'AZ', 'BA', 'BB', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BL', 'BM', 'BN', 'BO', 'BQ', 'BR', 'BS', 'BT', 'BV', 'BW', 'BY', 'BZ', 'CA', 'CC', 'CD', 'CF', 'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN', 'CO', 'CR', 'CU', 'CV', 'CW', 'CX', 'CY', 'CZ', 'DE', 'DJ', 'DK', 'DM', 'DO', 'DZ', 'EC', 'EE', 'EG', 'EH', 'ER', 'ES', 'ET', 'FI', 'FJ', 'FK', 'FM', 'FO', 'FR', 'GA', 'GB', 'GD', 'GE', 'GF', 'GG', 'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GS', 'GT', 'GU', 'GW', 'GY', 'HK', 'HM', 'HN', 'HR', 'HT', 'HU', 'ID', 'IE', 'IL', 'IM', 'IN', 'IO', 'IQ', 'IR', 'IS', 'IT', 'JE', 'JM', 'JO', 'JP', 'KE', 'KG', 'KH', 'KI', 'KM', 'KN', 'KP', 'KR', 'KW', 'KY', 'KZ', 'LA', 'LB', 'LC', 'LI', 'LK', 'LR', 'LS', 'LT', 'LU', 'LV', 'LY', 'MA', 'MC', 'MD', 'ME', 'MF', 'MG', 'MH', 'MK', 'ML', 'MM', 'MN', 'MO', 'MP', 'MQ', 'MR', 'MS', 'MT', 'MU', 'MV', 'MW', 'MX', 'MY', 'MZ', 'NA', 'NC', 'NE', 'NF', 'NG', 'NI', 'NL', 'NO', 'NP', 'NR', 'NU', 'NZ', 'OM', 'PA', 'PE', 'PF', 'PG', 'PH', 'PK', 'PL', 'PM', 'PN', 'PR', 'PS', 'PT', 'PW', 'PY', 'QA', 'RE', 'RO', 'RS', 'RU', 'RW', 'SA', 'SB', 'SC', 'SD', 'SE', 'SG', 'SH', 'SI', 'SJ', 'SK', 'SL', 'SM', 'SN', 'SO', 'SR', 'SS', 'ST', 'SV', 'SX', 'SY', 'SZ', 'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK', 'TL', 'TM', 'TN', 'TO', 'TR', 'TT', 'TV', 'TW', 'TZ', 'UA', 'UG', 'UM', 'US', 'UY', 'UZ', 'VA', 'VC', 'VE', 'VG', 'VI', 'VN', 'VU', 'WF', 'WS', 'YE', 'YT', 'ZA', 'ZM', 'ZW']);
export default function isISO31661Alpha2(str) {
  assertString(str);
  return validISO31661Alpha2CountriesCodes.has(str.toUpperCase());
}
export var CountryCodes = validISO31661Alpha2CountriesCodes;import assertString from './util/assertString'; // from https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3

var validISO31661Alpha3CountriesCodes = new Set(['AFG', 'ALA', 'ALB', 'DZA', 'ASM', 'AND', 'AGO', 'AIA', 'ATA', 'ATG', 'ARG', 'ARM', 'ABW', 'AUS', 'AUT', 'AZE', 'BHS', 'BHR', 'BGD', 'BRB', 'BLR', 'BEL', 'BLZ', 'BEN', 'BMU', 'BTN', 'BOL', 'BES', 'BIH', 'BWA', 'BVT', 'BRA', 'IOT', 'BRN', 'BGR', 'BFA', 'BDI', 'KHM', 'CMR', 'CAN', 'CPV', 'CYM', 'CAF', 'TCD', 'CHL', 'CHN', 'CXR', 'CCK', 'COL', 'COM', 'COG', 'COD', 'COK', 'CRI', 'CIV', 'HRV', 'CUB', 'CUW', 'CYP', 'CZE', 'DNK', 'DJI', 'DMA', 'DOM', 'ECU', 'EGY', 'SLV', 'GNQ', 'ERI', 'EST', 'ETH', 'FLK', 'FRO', 'FJI', 'FIN', 'FRA', 'GUF', 'PYF', 'ATF', 'GAB', 'GMB', 'GEO', 'DEU', 'GHA', 'GIB', 'GRC', 'GRL', 'GRD', 'GLP', 'GUM', 'GTM', 'GGY', 'GIN', 'GNB', 'GUY', 'HTI', 'HMD', 'VAT', 'HND', 'HKG', 'HUN', 'ISL', 'IND', 'IDN', 'IRN', 'IRQ', 'IRL', 'IMN', 'ISR', 'ITA', 'JAM', 'JPN', 'JEY', 'JOR', 'KAZ', 'KEN', 'KIR', 'PRK', 'KOR', 'KWT', 'KGZ', 'LAO', 'LVA', 'LBN', 'LSO', 'LBR', 'LBY', 'LIE', 'LTU', 'LUX', 'MAC', 'MKD', 'MDG', 'MWI', 'MYS', 'MDV', 'MLI', 'MLT', 'MHL', 'MTQ', 'MRT', 'MUS', 'MYT', 'MEX', 'FSM', 'MDA', 'MCO', 'MNG', 'MNE', 'MSR', 'MAR', 'MOZ', 'MMR', 'NAM', 'NRU', 'NPL', 'NLD', 'NCL', 'NZL', 'NIC', 'NER', 'NGA', 'NIU', 'NFK', 'MNP', 'NOR', 'OMN', 'PAK', 'PLW', 'PSE', 'PAN', 'PNG', 'PRY', 'PER', 'PHL', 'PCN', 'POL', 'PRT', 'PRI', 'QAT', 'REU', 'ROU', 'RUS', 'RWA', 'BLM', 'SHN', 'KNA', 'LCA', 'MAF', 'SPM', 'VCT', 'WSM', 'SMR', 'STP', 'SAU', 'SEN', 'SRB', 'SYC', 'SLE', 'SGP', 'SXM', 'SVK', 'SVN', 'SLB', 'SOM', 'ZAF', 'SGS', 'SSD', 'ESP', 'LKA', 'SDN', 'SUR', 'SJM', 'SWZ', 'SWE', 'CHE', 'SYR', 'TWN', 'TJK', 'TZA', 'THA', 'TLS', 'TGO', 'TKL', 'TON', 'TTO', 'TUN', 'TUR', 'TKM', 'TCA', 'TUV', 'UGA', 'UKR', 'ARE', 'GBR', 'USA', 'UMI', 'URY', 'UZB', 'VUT', 'VEN', 'VNM', 'VGB', 'VIR', 'WLF', 'ESH', 'YEM', 'ZMB', 'ZWE']);
export default function isISO31661Alpha3(str) {
  assertString(str);
  return validISO31661Alpha3CountriesCodes.has(str.toUpperCase());
}import assertString from './util/assertString'; // from https://en.wikipedia.org/wiki/ISO_4217

var validISO4217CurrencyCodes = new Set(['AED', 'AFN', 'ALL', 'AMD', 'ANG', 'AOA', 'ARS', 'AUD', 'AWG', 'AZN', 'BAM', 'BBD', 'BDT', 'BGN', 'BHD', 'BIF', 'BMD', 'BND', 'BOB', 'BOV', 'BRL', 'BSD', 'BTN', 'BWP', 'BYN', 'BZD', 'CAD', 'CDF', 'CHE', 'CHF', 'CHW', 'CLF', 'CLP', 'CNY', 'COP', 'COU', 'CRC', 'CUC', 'CUP', 'CVE', 'CZK', 'DJF', 'DKK', 'DOP', 'DZD', 'EGP', 'ERN', 'ETB', 'EUR', 'FJD', 'FKP', 'GBP', 'GEL', 'GHS', 'GIP', 'GMD', 'GNF', 'GTQ', 'GYD', 'HKD', 'HNL', 'HRK', 'HTG', 'HUF', 'IDR', 'ILS', 'INR', 'IQD', 'IRR', 'ISK', 'JMD', 'JOD', 'JPY', 'KES', 'KGS', 'KHR', 'KMF', 'KPW', 'KRW', 'KWD', 'KYD', 'KZT', 'LAK', 'LBP', 'LKR', 'LRD', 'LSL', 'LYD', 'MAD', 'MDL', 'MGA', 'MKD', 'MMK', 'MNT', 'MOP', 'MRU', 'MUR', 'MVR', 'MWK', 'MXN', 'MXV', 'MYR', 'MZN', 'NAD', 'NGN', 'NIO', 'NOK', 'NPR', 'NZD', 'OMR', 'PAB', 'PEN', 'PGK', 'PHP', 'PKR', 'PLN', 'PYG', 'QAR', 'RON', 'RSD', 'RUB', 'RWF', 'SAR', 'SBD', 'SCR', 'SDG', 'SEK', 'SGD', 'SHP', 'SLL', 'SOS', 'SRD', 'SSP', 'STN', 'SVC', 'SYP', 'SZL', 'THB', 'TJS', 'TMT', 'TND', 'TOP', 'TRY', 'TTD', 'TWD', 'TZS', 'UAH', 'UGX', 'USD', 'USN', 'UYI', 'UYU', 'UYW', 'UZS', 'VES', 'VND', 'VUV', 'WST', 'XAF', 'XAG', 'XAU', 'XBA', 'XBB', 'XBC', 'XBD', 'XCD', 'XDR', 'XOF', 'XPD', 'XPF', 'XPT', 'XSU', 'XTS', 'XUA', 'XXX', 'YER', 'ZAR', 'ZMW', 'ZWL']);
export default function isISO4217(str) {
  assertString(str);
  return validISO4217CurrencyCodes.has(str.toUpperCase());
}
export var CurrencyCodes = validISO4217CurrencyCodes;import assertString from './util/assertString';
/* eslint-disable max-len */
// from http://goo.gl/0ejHHW

var iso8601 = /^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-3])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/; // same as above, except with a strict 'T' separator between date and time

var iso8601StrictSeparator = /^([\+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-3])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T]((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/;
/* eslint-enable max-len */

var isValidDate = function isValidDate(str) {
  // str must have passed the ISO8601 check
  // this check is meant to catch invalid dates
  // like 2009-02-31
  // first check for ordinal dates
  var ordinalMatch = str.match(/^(\d{4})-?(\d{3})([ T]{1}\.*|$)/);

  if (ordinalMatch) {
    var oYear = Number(ordinalMatch[1]);
    var oDay = Number(ordinalMatch[2]); // if is leap year

    if (oYear % 4 === 0 && oYear % 100 !== 0 || oYear % 400 === 0) return oDay <= 366;
    return oDay <= 365;
  }

  var match = str.match(/(\d{4})-?(\d{0,2})-?(\d*)/).map(Number);
  var year = match[1];
  var month = match[2];
  var day = match[3];
  var monthString = month ? "0".concat(month).slice(-2) : month;
  var dayString = day ? "0".concat(day).slice(-2) : day; // create a date object and compare

  var d = new Date("".concat(year, "-").concat(monthString || '01', "-").concat(dayString || '01'));

  if (month && day) {
    return d.getUTCFullYear() === year && d.getUTCMonth() + 1 === month && d.getUTCDate() === day;
  }

  return true;
};

export default function isISO8601(str) {
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  assertString(str);
  var check = options.strictSeparator ? iso8601StrictSeparator.test(str) : iso8601.test(str);
  if (check && options.strict) return isValidDate(str);
  return check;
}import assertString from './util/assertString'; // see http://isrc.ifpi.org/en/isrc-standard/code-syntax

var isrc = /^[A-Z]{2}[0-9A-Z]{3}\d{2}\d{5}$/;
export default function isISRC(str) {
  assertString(str);
  return isrc.test(str);
}import assertString from './util/assertString';
var issn = '^\\d{4}-?\\d{3}[\\dX]$';
export default function isISSN(str) {
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  assertString(str);
  var testIssn = issn;
  testIssn = options.require_hyphen ? testIssn.replace('?', '') : testIssn;
  testIssn = options.case_sensitive ? new RegExp(testIssn) : new RegExp(testIssn, 'i');

  if (!testIssn.test(str)) {
    return false;
  }

  var digits = str.replace('-', '').toUpperCase();
  var checksum = 0;

  for (var i = 0; i < digits.length; i++) {
    var digit = digits[i];
    checksum += (digit === 'X' ? 10 : +digit) * (8 - i);
  }

  return checksum % 11 === 0;
}import assertString from './util/assertString';
import isInt from './isInt';
var validators = {
  PL: function PL(str) {
    assertString(str);
    var weightOfDigits = {
      1: 1,
      2: 3,
      3: 7,
      4: 9,
      5: 1,
      6: 3,
      7: 7,
      8: 9,
      9: 1,
      10: 3,
      11: 0
    };

    if (str != null && str.length === 11 && isInt(str, {
      allow_leading_zeroes: true
    })) {
      var digits = str.split('').slice(0, -1);
      var sum = digits.reduce(function (acc, digit, index) {
        return acc + Number(digit) * weightOfDigits[index + 1];
      }, 0);
      var modulo = sum % 10;
      var lastDigit = Number(str.charAt(str.length - 1));

      if (modulo === 0 && lastDigit === 0 || lastDigit === 10 - modulo) {
        return true;
      }
    }

    return false;
  },
  ES: function ES(str) {
    assertString(str);
    var DNI = /^[0-9X-Z][0-9]{7}[TRWAGMYFPDXBNJZSQVHLCKE]$/;
    var charsValue = {
      X: 0,
      Y: 1,
      Z: 2
    };
    var controlDigits = ['T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E']; // sanitize user input

    var sanitized = str.trim().toUpperCase(); // validate the data structure

    if (!DNI.test(sanitized)) {
      return false;
    } // validate the control digit


    var number = sanitized.slice(0, -1).replace(/[X,Y,Z]/g, function (_char) {
      return charsValue[_char];
    });
    return sanitized.endsWith(controlDigits[number % 23]);
  },
  FI: function FI(str) {
    // https://dvv.fi/en/personal-identity-code#:~:text=control%20character%20for%20a-,personal,-identity%20code%20calculated
    assertString(str);

    if (str.length !== 11) {
      return false;
    }

    if (!str.match(/^\d{6}[\-A\+]\d{3}[0-9ABCDEFHJKLMNPRSTUVWXY]{1}$/)) {
      return false;
    }

    var checkDigits = '0123456789ABCDEFHJKLMNPRSTUVWXY';
    var idAsNumber = parseInt(str.slice(0, 6), 10) * 1000 + parseInt(str.slice(7, 10), 10);
    var remainder = idAsNumber % 31;
    var checkDigit = checkDigits[remainder];
    return checkDigit === str.slice(10, 11);
  },
  IN: function IN(str) {
    var DNI = /^[1-9]\d{3}\s?\d{4}\s?\d{4}$/; // multiplication table

    var d = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 0, 6, 7, 8, 9, 5], [2, 3, 4, 0, 1, 7, 8, 9, 5, 6], [3, 4, 0, 1, 2, 8, 9, 5, 6, 7], [4, 0, 1, 2, 3, 9, 5, 6, 7, 8], [5, 9, 8, 7, 6, 0, 4, 3, 2, 1], [6, 5, 9, 8, 7, 1, 0, 4, 3, 2], [7, 6, 5, 9, 8, 2, 1, 0, 4, 3], [8, 7, 6, 5, 9, 3, 2, 1, 0, 4], [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]]; // permutation table

    var p = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 5, 7, 6, 2, 8, 3, 0, 9, 4], [5, 8, 0, 3, 7, 9, 6, 1, 4, 2], [8, 9, 1, 6, 0, 4, 3, 5, 2, 7], [9, 4, 5, 3, 1, 2, 6, 8, 7, 0], [4, 2, 8, 6, 5, 7, 3, 9, 0, 1], [2, 7, 9, 3, 8, 0, 6, 4, 1, 5], [7, 0, 4, 6, 9, 1, 3, 2, 5, 8]]; // sanitize user input

    var sanitized = str.trim(); // validate the data structure

    if (!DNI.test(sanitized)) {
      return false;
    }

    var c = 0;
    var invertedArray = sanitized.replace(/\s/g, '').split('').map(Number).reverse();
    invertedArray.forEach(function (val, i) {
      c = d[c][p[i % 8][val]];
    });
    return c === 0;
  },
  IR: function IR(str) {
    if (!str.match(/^\d{10}$/)) return false;
    str = "0000".concat(str).substr(str.length - 6);
    if (parseInt(str.substr(3, 6), 10) === 0) return false;
    var lastNumber = parseInt(str.substr(9, 1), 10);
    var sum = 0;

    for (var i = 0; i < 9; i++) {
      sum += parseInt(str.substr(i, 1), 10) * (10 - i);
    }

    sum %= 11;
    return sum < 2 && lastNumber === sum || sum >= 2 && lastNumber === 11 - sum;
  },
  IT: function IT(str) {
    if (str.length !== 9) return false;
    if (str === 'CA00000AA') return false; // https://it.wikipedia.org/wiki/Carta_d%27identit%C3%A0_elettronica_italiana

    return str.search(/C[A-Z][0-9]{5}[A-Z]{2}/i) > -1;
  },
  NO: function NO(str) {
    var sanitized = str.trim();
    if (isNaN(Number(sanitized))) return false;
    if (sanitized.length !== 11) return false;
    if (sanitized === '00000000000') return false; // https://no.wikipedia.org/wiki/F%C3%B8dselsnummer

    var f = sanitized.split('').map(Number);
    var k1 = (11 - (3 * f[0] + 7 * f[1] + 6 * f[2] + 1 * f[3] + 8 * f[4] + 9 * f[5] + 4 * f[6] + 5 * f[7] + 2 * f[8]) % 11) % 11;
    var k2 = (11 - (5 * f[0] + 4 * f[1] + 3 * f[2] + 2 * f[3] + 7 * f[4] + 6 * f[5] + 5 * f[6] + 4 * f[7] + 3 * f[8] + 2 * k1) % 11) % 11;
    if (k1 !== f[9] || k2 !== f[10]) return false;
    return true;
  },
  TH: function TH(str) {
    if (!str.match(/^[1-8]\d{12}$/)) return false; // validate check digit

    var sum = 0;

    for (var i = 0; i < 12; i++) {
      sum += parseInt(str[i], 10) * (13 - i);
    }

    return str[12] === ((11 - sum % 11) % 10).toString();
  },
  LK: function LK(str) {
    var old_nic = /^[1-9]\d{8}[vx]$/i;
    var new_nic = /^[1-9]\d{11}$/i;
    if (str.length === 10 && old_nic.test(str)) return true;else if (str.length === 12 && new_nic.test(str)) return true;
    return false;
  },
  'he-IL': function heIL(str) {
    var DNI = /^\d{9}$/; // sanitize user input

    var sanitized = str.trim(); // validate the data structure

    if (!DNI.test(sanitized)) {
      return false;
    }

    var id = sanitized;
    var sum = 0,
        incNum;

    for (var i = 0; i < id.length; i++) {
      incNum = Number(id[i]) * (i % 2 + 1); // Multiply number by 1 or 2

      sum += incNum > 9 ? incNum - 9 : incNum; // Sum the digits up and add to total
    }

    return sum % 10 === 0;
  },
  'ar-LY': function arLY(str) {
    // Libya National Identity Number NIN is 12 digits, the first digit is either 1 or 2
    var NIN = /^(1|2)\d{11}$/; // sanitize user input

    var sanitized = str.trim(); // validate the data structure

    if (!NIN.test(sanitized)) {
      return false;
    }

    return true;
  },
  'ar-TN': function arTN(str) {
    var DNI = /^\d{8}$/; // sanitize user input

    var sanitized = str.trim(); // validate the data structure

    if (!DNI.test(sanitized)) {
      return false;
    }

    return true;
  },
  'zh-CN': function zhCN(str) {
    var provincesAndCities = ['11', // 北京
    '12', // 天津
    '13', // 河北
    '14', // 山西
    '15', // 内蒙古
    '21', // 辽宁
    '22', // 吉林
    '23', // 黑龙江
    '31', // 上海
    '32', // 江苏
    '33', // 浙江
    '34', // 安徽
    '35', // 福建
    '36', // 江西
    '37', // 山东
    '41', // 河南
    '42', // 湖北
    '43', // 湖南
    '44', // 广东
    '45', // 广西
    '46', // 海南
    '50', // 重庆
    '51', // 四川
    '52', // 贵州
    '53', // 云南
    '54', // 西藏
    '61', // 陕西
    '62', // 甘肃
    '63', // 青海
    '64', // 宁夏
    '65', // 新疆
    '71', // 台湾
    '81', // 香港
    '82', // 澳门
    '91' // 国外
    ];
    var powers = ['7', '9', '10', '5', '8', '4', '2', '1', '6', '3', '7', '9', '10', '5', '8', '4', '2'];
    var parityBit = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];

    var checkAddressCode = function checkAddressCode(addressCode) {
      return provincesAndCities.includes(addressCode);
    };

    var checkBirthDayCode = function checkBirthDayCode(birDayCode) {
      var yyyy = parseInt(birDayCode.substring(0, 4), 10);
      var mm = parseInt(birDayCode.substring(4, 6), 10);
      var dd = parseInt(birDayCode.substring(6), 10);
      var xdata = new Date(yyyy, mm - 1, dd);

      if (xdata > new Date()) {
        return false; // eslint-disable-next-line max-len
      } else if (xdata.getFullYear() === yyyy && xdata.getMonth() === mm - 1 && xdata.getDate() === dd) {
        return true;
      }

      return false;
    };

    var getParityBit = function getParityBit(idCardNo) {
      var id17 = idCardNo.substring(0, 17);
      var power = 0;

      for (var i = 0; i < 17; i++) {
        power += parseInt(id17.charAt(i), 10) * parseInt(powers[i], 10);
      }

      var mod = power % 11;
      return parityBit[mod];
    };

    var checkParityBit = function checkParityBit(idCardNo) {
      return getParityBit(idCardNo) === idCardNo.charAt(17).toUpperCase();
    };

    var check15IdCardNo = function check15IdCardNo(idCardNo) {
      var check = /^[1-9]\d{7}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\d{3}$/.test(idCardNo);
      if (!check) return false;
      var addressCode = idCardNo.substring(0, 2);
      check = checkAddressCode(addressCode);
      if (!check) return false;
      var birDayCode = "19".concat(idCardNo.substring(6, 12));
      check = checkBirthDayCode(birDayCode);
      if (!check) return false;
      return true;
    };

    var check18IdCardNo = function check18IdCardNo(idCardNo) {
      var check = /^[1-9]\d{5}[1-9]\d{3}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\d{3}(\d|x|X)$/.test(idCardNo);
      if (!check) return false;
      var addressCode = idCardNo.substring(0, 2);
      check = checkAddressCode(addressCode);
      if (!check) return false;
      var birDayCode = idCardNo.substring(6, 14);
      check = checkBirthDayCode(birDayCode);
      if (!check) return false;
      return checkParityBit(idCardNo);
    };

    var checkIdCardNo = function checkIdCardNo(idCardNo) {
      var check = /^\d{15}|(\d{17}(\d|x|X))$/.test(idCardNo);
      if (!check) return false;

      if (idCardNo.length === 15) {
        return check15IdCardNo(idCardNo);
      }

      return check18IdCardNo(idCardNo);
    };

    return checkIdCardNo(str);
  },
  'zh-TW': function zhTW(str) {
    var ALPHABET_CODES = {
      A: 10,
      B: 11,
      C: 12,
      D: 13,
      E: 14,
      F: 15,
      G: 16,
      H: 17,
      I: 34,
      J: 18,
      K: 19,
      L: 20,
      M: 21,
      N: 22,
      O: 35,
      P: 23,
      Q: 24,
      R: 25,
      S: 26,
      T: 27,
      U: 28,
      V: 29,
      W: 32,
      X: 30,
      Y: 31,
      Z: 33
    };
    var sanitized = str.trim().toUpperCase();
    if (!/^[A-Z][0-9]{9}$/.test(sanitized)) return false;
    return Array.from(sanitized).reduce(function (sum, number, index) {
      if (index === 0) {
        var code = ALPHABET_CODES[number];
        return code % 10 * 9 + Math.floor(code / 10);
      }

      if (index === 9) {
        return (10 - sum % 10 - Number(number)) % 10 === 0;
      }

      return sum + Number(number) * (9 - index);
    }, 0);
  }
};
export default function isIdentityCard(str, locale) {
  assertString(str);

  if (locale in validators) {
    return validators[locale](str);
  } else if (locale === 'any') {
    for (var key in validators) {
      // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
      // istanbul ignore else
      if (validators.hasOwnProperty(key)) {
        var validator = validators[key];

        if (validator(str)) {
          return true;
        }
      }
    }

    return false;
  }

  throw new Error("Invalid locale '".concat(locale, "'"));
}function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

import assertString from './util/assertString';
import toString from './util/toString';
export default function isIn(str, options) {
  assertString(str);
  var i;

  if (Object.prototype.toString.call(options) === '[object Array]') {
    var array = [];

    for (i in options) {
      // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
      // istanbul ignore else
      if ({}.hasOwnProperty.call(options, i)) {
        array[i] = toString(options[i]);
      }
    }

    return array.indexOf(str) >= 0;
  } else if (_typeof(options) === 'object') {
    return options.hasOwnProperty(str);
  } else if (options && typeof options.indexOf === 'function') {
    return options.indexOf(str) >= 0;
  }

  return false;
}import assertString from './util/assertString';
var _int = /^(?:[-+]?(?:0|[1-9][0-9]*))$/;
var intLeadingZeroes = /^[-+]?[0-9]+$/;
export default function isInt(str, options) {
  assertString(str);
  options = options || {}; // Get the regex to use for testing, based on whether
  // leading zeroes are allowed or not.

  var regex = options.hasOwnProperty('allow_leading_zeroes') && !options.allow_leading_zeroes ? _int : intLeadingZeroes; // Check min/max/lt/gt

  var minCheckPassed = !options.hasOwnProperty('min') || str >= options.min;
  var maxCheckPassed = !options.hasOwnProperty('max') || str <= options.max;
  var ltCheckPassed = !options.hasOwnProperty('lt') || str < options.lt;
  var gtCheckPassed = !options.hasOwnProperty('gt') || str > options.gt;
  return regex.test(str) && minCheckPassed && maxCheckPassed && ltCheckPassed && gtCheckPassed;
}function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

import assertString from './util/assertString';
import merge from './util/merge';
var default_json_options = {
  allow_primitives: false
};
export default function isJSON(str, options) {
  assertString(str);

  try {
    options = merge(options, default_json_options);
    var primitives = [];

    if (options.allow_primitives) {
      primitives = [null, false, true];
    }

    var obj = JSON.parse(str);
    return primitives.includes(obj) || !!obj && _typeof(obj) === 'object';
  } catch (e) {
    /* ignore */
  }

  return false;
}import assertString from './util/assertString';
import isBase64 from './isBase64';
export default function isJWT(str) {
  assertString(str);
  var dotSplit = str.split('.');
  var len = dotSplit.length;

  if (len > 3 || len < 2) {
    return false;
  }

  return dotSplit.reduce(function (acc, currElem) {
    return acc && isBase64(currElem, {
      urlSafe: true
    });
  }, true);
}import assertString from './util/assertString';
import merge from './util/merge';
var lat = /^\(?[+-]?(90(\.0+)?|[1-8]?\d(\.\d+)?)$/;
var _long = /^\s?[+-]?(180(\.0+)?|1[0-7]\d(\.\d+)?|\d{1,2}(\.\d+)?)\)?$/;
var latDMS = /^(([1-8]?\d)\D+([1-5]?\d|60)\D+([1-5]?\d|60)(\.\d+)?|90\D+0\D+0)\D+[NSns]?$/i;
var longDMS = /^\s*([1-7]?\d{1,2}\D+([1-5]?\d|60)\D+([1-5]?\d|60)(\.\d+)?|180\D+0\D+0)\D+[EWew]?$/i;
var defaultLatLongOptions = {
  checkDMS: false
};
export default function isLatLong(str, options) {
  assertString(str);
  options = merge(options, defaultLatLongOptions);
  if (!str.includes(',')) return false;
  var pair = str.split(',');
  if (pair[0].startsWith('(') && !pair[1].endsWith(')') || pair[1].endsWith(')') && !pair[0].startsWith('(')) return false;

  if (options.checkDMS) {
    return latDMS.test(pair[0]) && longDMS.test(pair[1]);
  }

  return lat.test(pair[0]) && _long.test(pair[1]);
}function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

import assertString from './util/assertString';
/* eslint-disable prefer-rest-params */

export default function isLength(str, options) {
  assertString(str);
  var min;
  var max;

  if (_typeof(options) === 'object') {
    min = options.min || 0;
    max = options.max;
  } else {
    // backwards compatibility: isLength(str, min [, max])
    min = arguments[1] || 0;
    max = arguments[2];
  }

  var surrogatePairs = str.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g) || [];
  var len = str.length - surrogatePairs.length;
  return len >= min && (typeof max === 'undefined' || len <= max);
}import assertString from './util/assertString';
var validators = {
  'cs-CZ': function csCZ(str) {
    return /^(([ABCDEFHKIJKLMNPRSTUVXYZ]|[0-9])-?){5,8}$/.test(str);
  },
  'de-DE': function deDE(str) {
    return /^((AW|UL|AK|GA|AÖ|LF|AZ|AM|AS|ZE|AN|AB|A|KG|KH|BA|EW|BZ|HY|KM|BT|HP|B|BC|BI|BO|FN|TT|ÜB|BN|AH|BS|FR|HB|ZZ|BB|BK|BÖ|OC|OK|CW|CE|C|CO|LH|CB|KW|LC|LN|DA|DI|DE|DH|SY|NÖ|DO|DD|DU|DN|D|EI|EA|EE|FI|EM|EL|EN|PF|ED|EF|ER|AU|ZP|E|ES|NT|EU|FL|FO|FT|FF|F|FS|FD|FÜ|GE|G|GI|GF|GS|ZR|GG|GP|GR|NY|ZI|GÖ|GZ|GT|HA|HH|HM|HU|WL|HZ|WR|RN|HK|HD|HN|HS|GK|HE|HF|RZ|HI|HG|HO|HX|IK|IL|IN|J|JL|KL|KA|KS|KF|KE|KI|KT|KO|KN|KR|KC|KU|K|LD|LL|LA|L|OP|LM|LI|LB|LU|LÖ|HL|LG|MD|GN|MZ|MA|ML|MR|MY|AT|DM|MC|NZ|RM|RG|MM|ME|MB|MI|FG|DL|HC|MW|RL|MK|MG|MÜ|WS|MH|M|MS|NU|NB|ND|NM|NK|NW|NR|NI|NF|DZ|EB|OZ|TG|TO|N|OA|GM|OB|CA|EH|FW|OF|OL|OE|OG|BH|LR|OS|AA|GD|OH|KY|NP|WK|PB|PA|PE|PI|PS|P|PM|PR|RA|RV|RE|R|H|SB|WN|RS|RD|RT|BM|NE|GV|RP|SU|GL|RO|GÜ|RH|EG|RW|PN|SK|MQ|RU|SZ|RI|SL|SM|SC|HR|FZ|VS|SW|SN|CR|SE|SI|SO|LP|SG|NH|SP|IZ|ST|BF|TE|HV|OD|SR|S|AC|DW|ZW|TF|TS|TR|TÜ|UM|PZ|TP|UE|UN|UH|MN|KK|VB|V|AE|PL|RC|VG|GW|PW|VR|VK|KB|WA|WT|BE|WM|WE|AP|MO|WW|FB|WZ|WI|WB|JE|WF|WO|W|WÜ|BL|Z|GC)[- ]?[A-Z]{1,2}[- ]?\d{1,4}|(AIC|FDB|ABG|SLN|SAW|KLZ|BUL|ESB|NAB|SUL|WST|ABI|AZE|BTF|KÖT|DKB|FEU|ROT|ALZ|SMÜ|WER|AUR|NOR|DÜW|BRK|HAB|TÖL|WOR|BAD|BAR|BER|BIW|EBS|KEM|MÜB|PEG|BGL|BGD|REI|WIL|BKS|BIR|WAT|BOR|BOH|BOT|BRB|BLK|HHM|NEB|NMB|WSF|LEO|HDL|WMS|WZL|BÜS|CHA|KÖZ|ROD|WÜM|CLP|NEC|COC|ZEL|COE|CUX|DAH|LDS|DEG|DEL|RSL|DLG|DGF|LAN|HEI|MED|DON|KIB|ROK|JÜL|MON|SLE|EBE|EIC|HIG|WBS|BIT|PRÜ|LIB|EMD|WIT|ERH|HÖS|ERZ|ANA|ASZ|MAB|MEK|STL|SZB|FDS|HCH|HOR|WOL|FRG|GRA|WOS|FRI|FFB|GAP|GER|BRL|CLZ|GTH|NOH|HGW|GRZ|LÖB|NOL|WSW|DUD|HMÜ|OHA|KRU|HAL|HAM|HBS|QLB|HVL|NAU|HAS|EBN|GEO|HOH|HDH|ERK|HER|WAN|HEF|ROF|HBN|ALF|HSK|USI|NAI|REH|SAN|KÜN|ÖHR|HOL|WAR|ARN|BRG|GNT|HOG|WOH|KEH|MAI|PAR|RID|ROL|KLE|GEL|KUS|KYF|ART|SDH|LDK|DIL|MAL|VIB|LER|BNA|GHA|GRM|MTL|WUR|LEV|LIF|STE|WEL|LIP|VAI|LUP|HGN|LBZ|LWL|PCH|STB|DAN|MKK|SLÜ|MSP|TBB|MGH|MTK|BIN|MSH|EIL|HET|SGH|BID|MYK|MSE|MST|MÜR|WRN|MEI|GRH|RIE|MZG|MIL|OBB|BED|FLÖ|MOL|FRW|SEE|SRB|AIB|MOS|BCH|ILL|SOB|NMS|NEA|SEF|UFF|NEW|VOH|NDH|TDO|NWM|GDB|GVM|WIS|NOM|EIN|GAN|LAU|HEB|OHV|OSL|SFB|ERB|LOS|BSK|KEL|BSB|MEL|WTL|OAL|FÜS|MOD|OHZ|OPR|BÜR|PAF|PLÖ|CAS|GLA|REG|VIT|ECK|SIM|GOA|EMS|DIZ|GOH|RÜD|SWA|NES|KÖN|MET|LRO|BÜZ|DBR|ROS|TET|HRO|ROW|BRV|HIP|PAN|GRI|SHK|EIS|SRO|SOK|LBS|SCZ|MER|QFT|SLF|SLS|HOM|SLK|ASL|BBG|SBK|SFT|SHG|MGN|MEG|ZIG|SAD|NEN|OVI|SHA|BLB|SIG|SON|SPN|FOR|GUB|SPB|IGB|WND|STD|STA|SDL|OBG|HST|BOG|SHL|PIR|FTL|SEB|SÖM|SÜW|TIR|SAB|TUT|ANG|SDT|LÜN|LSZ|MHL|VEC|VER|VIE|OVL|ANK|OVP|SBG|UEM|UER|WLG|GMN|NVP|RDG|RÜG|DAU|FKB|WAF|WAK|SLZ|WEN|SOG|APD|WUG|GUN|ESW|WIZ|WES|DIN|BRA|BÜD|WHV|HWI|GHC|WTM|WOB|WUN|MAK|SEL|OCH|HOT|WDA)[- ]?(([A-Z][- ]?\d{1,4})|([A-Z]{2}[- ]?\d{1,3})))[- ]?(E|H)?$/.test(str);
  },
  'de-LI': function deLI(str) {
    return /^FL[- ]?\d{1,5}[UZ]?$/.test(str);
  },
  'fi-FI': function fiFI(str) {
    return /^(?=.{4,7})(([A-Z]{1,3}|[0-9]{1,3})[\s-]?([A-Z]{1,3}|[0-9]{1,5}))$/.test(str);
  },
  'pt-PT': function ptPT(str) {
    return /^([A-Z]{2}|[0-9]{2})[ -·]?([A-Z]{2}|[0-9]{2})[ -·]?([A-Z]{2}|[0-9]{2})$/.test(str);
  },
  'sq-AL': function sqAL(str) {
    return /^[A-Z]{2}[- ]?((\d{3}[- ]?(([A-Z]{2})|T))|(R[- ]?\d{3}))$/.test(str);
  },
  'pt-BR': function ptBR(str) {
    return /^[A-Z]{3}[ -]?[0-9][A-Z][0-9]{2}|[A-Z]{3}[ -]?[0-9]{4}$/.test(str);
  }
};
export default function isLicensePlate(str, locale) {
  assertString(str);

  if (locale in validators) {
    return validators[locale](str);
  } else if (locale === 'any') {
    for (var key in validators) {
      /* eslint guard-for-in: 0 */
      var validator = validators[key];

      if (validator(str)) {
        return true;
      }
    }

    return false;
  }

  throw new Error("Invalid locale '".concat(locale, "'"));
}import assertString from './util/assertString';
var localeReg = /^[A-Za-z]{2,4}([_-]([A-Za-z]{4}|[\d]{3}))?([_-]([A-Za-z]{2}|[\d]{3}))?$/;
export default function isLocale(str) {
  assertString(str);

  if (str === 'en_US_POSIX' || str === 'ca_ES_VALENCIA') {
    return true;
  }

  return localeReg.test(str);
}import assertString from './util/assertString';
export default function isLowercase(str) {
  assertString(str);
  return str === str.toLowerCase();
}import assertString from './util/assertString';
var macAddress = /^(?:[0-9a-fA-F]{2}([-:\s]))([0-9a-fA-F]{2}\1){4}([0-9a-fA-F]{2})$/;
var macAddressNoSeparators = /^([0-9a-fA-F]){12}$/;
var macAddressWithDots = /^([0-9a-fA-F]{4}\.){2}([0-9a-fA-F]{4})$/;
export default function isMACAddress(str, options) {
  assertString(str);
  /**
   * @deprecated `no_colons` TODO: remove it in the next major
  */

  if (options && (options.no_colons || options.no_separators)) {
    return macAddressNoSeparators.test(str);
  }

  return macAddress.test(str) || macAddressWithDots.test(str);
}import assertString from './util/assertString';
var md5 = /^[a-f0-9]{32}$/;
export default function isMD5(str) {
  assertString(str);
  return md5.test(str);
}import assertString from './util/assertString';
var magnetURI = /^magnet:\?xt(?:\.1)?=urn:(?:aich|bitprint|btih|ed2k|ed2khash|kzhash|md5|sha1|tree:tiger):[a-z0-9]{32}(?:[a-z0-9]{8})?($|&)/i;
export default function isMagnetURI(url) {
  assertString(url);
  return magnetURI.test(url.trim());
}import assertString from './util/assertString';
/*
  Checks if the provided string matches to a correct Media type format (MIME type)

  This function only checks is the string format follows the
  etablished rules by the according RFC specifications.
  This function supports 'charset' in textual media types
  (https://tools.ietf.org/html/rfc6657).

  This function does not check against all the media types listed
  by the IANA (https://www.iana.org/assignments/media-types/media-types.xhtml)
  because of lightness purposes : it would require to include
  all these MIME types in this librairy, which would weigh it
  significantly. This kind of effort maybe is not worth for the use that
  this function has in this entire librairy.

  More informations in the RFC specifications :
  - https://tools.ietf.org/html/rfc2045
  - https://tools.ietf.org/html/rfc2046
  - https://tools.ietf.org/html/rfc7231#section-3.1.1.1
  - https://tools.ietf.org/html/rfc7231#section-3.1.1.5
*/
// Match simple MIME types
// NB :
//   Subtype length must not exceed 100 characters.
//   This rule does not comply to the RFC specs (what is the max length ?).

var mimeTypeSimple = /^(application|audio|font|image|message|model|multipart|text|video)\/[a-zA-Z0-9\.\-\+]{1,100}$/i; // eslint-disable-line max-len
// Handle "charset" in "text/*"

var mimeTypeText = /^text\/[a-zA-Z0-9\.\-\+]{1,100};\s?charset=("[a-zA-Z0-9\.\-\+\s]{0,70}"|[a-zA-Z0-9\.\-\+]{0,70})(\s?\([a-zA-Z0-9\.\-\+\s]{1,20}\))?$/i; // eslint-disable-line max-len
// Handle "boundary" in "multipart/*"

var mimeTypeMultipart = /^multipart\/[a-zA-Z0-9\.\-\+]{1,100}(;\s?(boundary|charset)=("[a-zA-Z0-9\.\-\+\s]{0,70}"|[a-zA-Z0-9\.\-\+]{0,70})(\s?\([a-zA-Z0-9\.\-\+\s]{1,20}\))?){0,2}$/i; // eslint-disable-line max-len

export default function isMimeType(str) {
  assertString(str);
  return mimeTypeSimple.test(str) || mimeTypeText.test(str) || mimeTypeMultipart.test(str);
}import assertString from './util/assertString';
/* eslint-disable max-len */

var phones = {
  'am-AM': /^(\+?374|0)((10|[9|7][0-9])\d{6}$|[2-4]\d{7}$)/,
  'ar-AE': /^((\+?971)|0)?5[024568]\d{7}$/,
  'ar-BH': /^(\+?973)?(3|6)\d{7}$/,
  'ar-DZ': /^(\+?213|0)(5|6|7)\d{8}$/,
  'ar-LB': /^(\+?961)?((3|81)\d{6}|7\d{7})$/,
  'ar-EG': /^((\+?20)|0)?1[0125]\d{8}$/,
  'ar-IQ': /^(\+?964|0)?7[0-9]\d{8}$/,
  'ar-JO': /^(\+?962|0)?7[789]\d{7}$/,
  'ar-KW': /^(\+?965)[569]\d{7}$/,
  'ar-LY': /^((\+?218)|0)?(9[1-6]\d{7}|[1-8]\d{7,9})$/,
  'ar-MA': /^(?:(?:\+|00)212|0)[5-7]\d{8}$/,
  'ar-OM': /^((\+|00)968)?(9[1-9])\d{6}$/,
  'ar-PS': /^(\+?970|0)5[6|9](\d{7})$/,
  'ar-SA': /^(!?(\+?966)|0)?5\d{8}$/,
  'ar-SY': /^(!?(\+?963)|0)?9\d{8}$/,
  'ar-TN': /^(\+?216)?[2459]\d{7}$/,
  'az-AZ': /^(\+994|0)(5[015]|7[07]|99)\d{7}$/,
  'bs-BA': /^((((\+|00)3876)|06))((([0-3]|[5-6])\d{6})|(4\d{7}))$/,
  'be-BY': /^(\+?375)?(24|25|29|33|44)\d{7}$/,
  'bg-BG': /^(\+?359|0)?8[789]\d{7}$/,
  'bn-BD': /^(\+?880|0)1[13456789][0-9]{8}$/,
  'ca-AD': /^(\+376)?[346]\d{5}$/,
  'cs-CZ': /^(\+?420)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$/,
  'da-DK': /^(\+?45)?\s?\d{2}\s?\d{2}\s?\d{2}\s?\d{2}$/,
  'de-DE': /^((\+49|0)[1|3])([0|5][0-45-9]\d|6([23]|0\d?)|7([0-57-9]|6\d))\d{7,9}$/,
  'de-AT': /^(\+43|0)\d{1,4}\d{3,12}$/,
  'de-CH': /^(\+41|0)([1-9])\d{1,9}$/,
  'de-LU': /^(\+352)?((6\d1)\d{6})$/,
  'dv-MV': /^(\+?960)?(7[2-9]|91|9[3-9])\d{7}$/,
  'el-GR': /^(\+?30|0)?(69\d{8})$/,
  'en-AU': /^(\+?61|0)4\d{8}$/,
  'en-BM': /^(\+?1)?441(((3|7)\d{6}$)|(5[0-3][0-9]\d{4}$)|(59\d{5}))/,
  'en-GB': /^(\+?44|0)7\d{9}$/,
  'en-GG': /^(\+?44|0)1481\d{6}$/,
  'en-GH': /^(\+233|0)(20|50|24|54|27|57|26|56|23|28|55|59)\d{7}$/,
  'en-GY': /^(\+592|0)6\d{6}$/,
  'en-HK': /^(\+?852[-\s]?)?[456789]\d{3}[-\s]?\d{4}$/,
  'en-MO': /^(\+?853[-\s]?)?[6]\d{3}[-\s]?\d{4}$/,
  'en-IE': /^(\+?353|0)8[356789]\d{7}$/,
  'en-IN': /^(\+?91|0)?[6789]\d{9}$/,
  'en-KE': /^(\+?254|0)(7|1)\d{8}$/,
  'en-KI': /^((\+686|686)?)?( )?((6|7)(2|3|8)[0-9]{6})$/,
  'en-MT': /^(\+?356|0)?(99|79|77|21|27|22|25)[0-9]{6}$/,
  'en-MU': /^(\+?230|0)?\d{8}$/,
  'en-NA': /^(\+?264|0)(6|8)\d{7}$/,
  'en-NG': /^(\+?234|0)?[789]\d{9}$/,
  'en-NZ': /^(\+?64|0)[28]\d{7,9}$/,
  'en-PK': /^((00|\+)?92|0)3[0-6]\d{8}$/,
  'en-PH': /^(09|\+639)\d{9}$/,
  'en-RW': /^(\+?250|0)?[7]\d{8}$/,
  'en-SG': /^(\+65)?[3689]\d{7}$/,
  'en-SL': /^(\+?232|0)\d{8}$/,
  'en-TZ': /^(\+?255|0)?[67]\d{8}$/,
  'en-UG': /^(\+?256|0)?[7]\d{8}$/,
  'en-US': /^((\+1|1)?( |-)?)?(\([2-9][0-9]{2}\)|[2-9][0-9]{2})( |-)?([2-9][0-9]{2}( |-)?[0-9]{4})$/,
  'en-ZA': /^(\+?27|0)\d{9}$/,
  'en-ZM': /^(\+?26)?09[567]\d{7}$/,
  'en-ZW': /^(\+263)[0-9]{9}$/,
  'en-BW': /^(\+?267)?(7[1-8]{1})\d{6}$/,
  'es-AR': /^\+?549(11|[2368]\d)\d{8}$/,
  'es-BO': /^(\+?591)?(6|7)\d{7}$/,
  'es-CO': /^(\+?57)?3(0(0|1|2|4|5)|1\d|2[0-4]|5(0|1))\d{7}$/,
  'es-CL': /^(\+?56|0)[2-9]\d{1}\d{7}$/,
  'es-CR': /^(\+506)?[2-8]\d{7}$/,
  'es-CU': /^(\+53|0053)?5\d{7}/,
  'es-DO': /^(\+?1)?8[024]9\d{7}$/,
  'es-HN': /^(\+?504)?[9|8]\d{7}$/,
  'es-EC': /^(\+?593|0)([2-7]|9[2-9])\d{7}$/,
  'es-ES': /^(\+?34)?[6|7]\d{8}$/,
  'es-PE': /^(\+?51)?9\d{8}$/,
  'es-MX': /^(\+?52)?(1|01)?\d{10,11}$/,
  'es-PA': /^(\+?507)\d{7,8}$/,
  'es-PY': /^(\+?595|0)9[9876]\d{7}$/,
  'es-SV': /^(\+?503)?[67]\d{7}$/,
  'es-UY': /^(\+598|0)9[1-9][\d]{6}$/,
  'es-VE': /^(\+?58)?(2|4)\d{9}$/,
  'et-EE': /^(\+?372)?\s?(5|8[1-4])\s?([0-9]\s?){6,7}$/,
  'fa-IR': /^(\+?98[\-\s]?|0)9[0-39]\d[\-\s]?\d{3}[\-\s]?\d{4}$/,
  'fi-FI': /^(\+?358|0)\s?(4(0|1|2|4|5|6)?|50)\s?(\d\s?){4,8}\d$/,
  'fj-FJ': /^(\+?679)?\s?\d{3}\s?\d{4}$/,
  'fo-FO': /^(\+?298)?\s?\d{2}\s?\d{2}\s?\d{2}$/,
  'fr-BF': /^(\+226|0)[67]\d{7}$/,
  'fr-CM': /^(\+?237)6[0-9]{8}$/,
  'fr-FR': /^(\+?33|0)[67]\d{8}$/,
  'fr-GF': /^(\+?594|0|00594)[67]\d{8}$/,
  'fr-GP': /^(\+?590|0|00590)[67]\d{8}$/,
  'fr-MQ': /^(\+?596|0|00596)[67]\d{8}$/,
  'fr-PF': /^(\+?689)?8[789]\d{6}$/,
  'fr-RE': /^(\+?262|0|00262)[67]\d{8}$/,
  'he-IL': /^(\+972|0)([23489]|5[012345689]|77)[1-9]\d{6}$/,
  'hu-HU': /^(\+?36|06)(20|30|31|50|70)\d{7}$/,
  'id-ID': /^(\+?62|0)8(1[123456789]|2[1238]|3[1238]|5[12356789]|7[78]|9[56789]|8[123456789])([\s?|\d]{5,11})$/,
  'it-IT': /^(\+?39)?\s?3\d{2} ?\d{6,7}$/,
  'it-SM': /^((\+378)|(0549)|(\+390549)|(\+3780549))?6\d{5,9}$/,
  'ja-JP': /^(\+81[ \-]?(\(0\))?|0)[6789]0[ \-]?\d{4}[ \-]?\d{4}$/,
  'ka-GE': /^(\+?995)?(5|79)\d{7}$/,
  'kk-KZ': /^(\+?7|8)?7\d{9}$/,
  'kl-GL': /^(\+?299)?\s?\d{2}\s?\d{2}\s?\d{2}$/,
  'ko-KR': /^((\+?82)[ \-]?)?0?1([0|1|6|7|8|9]{1})[ \-]?\d{3,4}[ \-]?\d{4}$/,
  'lt-LT': /^(\+370|8)\d{8}$/,
  'lv-LV': /^(\+?371)2\d{7}$/,
  'ms-MY': /^(\+?6?01){1}(([0145]{1}(\-|\s)?\d{7,8})|([236789]{1}(\s|\-)?\d{7}))$/,
  'mz-MZ': /^(\+?258)?8[234567]\d{7}$/,
  'nb-NO': /^(\+?47)?[49]\d{7}$/,
  'ne-NP': /^(\+?977)?9[78]\d{8}$/,
  'nl-BE': /^(\+?32|0)4\d{8}$/,
  'nl-NL': /^(((\+|00)?31\(0\))|((\+|00)?31)|0)6{1}\d{8}$/,
  'nn-NO': /^(\+?47)?[49]\d{7}$/,
  'pl-PL': /^(\+?48)? ?[5-8]\d ?\d{3} ?\d{2} ?\d{2}$/,
  'pt-BR': /^((\+?55\ ?[1-9]{2}\ ?)|(\+?55\ ?\([1-9]{2}\)\ ?)|(0[1-9]{2}\ ?)|(\([1-9]{2}\)\ ?)|([1-9]{2}\ ?))((\d{4}\-?\d{4})|(9[2-9]{1}\d{3}\-?\d{4}))$/,
  'pt-PT': /^(\+?351)?9[1236]\d{7}$/,
  'pt-AO': /^(\+244)\d{9}$/,
  'ro-RO': /^(\+?4?0)\s?7\d{2}(\/|\s|\.|\-)?\d{3}(\s|\.|\-)?\d{3}$/,
  'ru-RU': /^(\+?7|8)?9\d{9}$/,
  'si-LK': /^(?:0|94|\+94)?(7(0|1|2|4|5|6|7|8)( |-)?)\d{7}$/,
  'sl-SI': /^(\+386\s?|0)(\d{1}\s?\d{3}\s?\d{2}\s?\d{2}|\d{2}\s?\d{3}\s?\d{3})$/,
  'sk-SK': /^(\+?421)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$/,
  'sq-AL': /^(\+355|0)6[789]\d{6}$/,
  'sr-RS': /^(\+3816|06)[- \d]{5,9}$/,
  'sv-SE': /^(\+?46|0)[\s\-]?7[\s\-]?[02369]([\s\-]?\d){7}$/,
  'tg-TJ': /^(\+?992)?[5][5]\d{7}$/,
  'th-TH': /^(\+66|66|0)\d{9}$/,
  'tr-TR': /^(\+?90|0)?5\d{9}$/,
  'tk-TM': /^(\+993|993|8)\d{8}$/,
  'uk-UA': /^(\+?38|8)?0\d{9}$/,
  'uz-UZ': /^(\+?998)?(6[125-79]|7[1-69]|88|9\d)\d{7}$/,
  'vi-VN': /^((\+?84)|0)((3([2-9]))|(5([25689]))|(7([0|6-9]))|(8([1-9]))|(9([0-9])))([0-9]{7})$/,
  'zh-CN': /^((\+|00)86)?(1[3-9]|9[28])\d{9}$/,
  'zh-TW': /^(\+?886\-?|0)?9\d{8}$/,
  'dz-BT': /^(\+?975|0)?(17|16|77|02)\d{6}$/
};
/* eslint-enable max-len */
// aliases

phones['en-CA'] = phones['en-US'];
phones['fr-CA'] = phones['en-CA'];
phones['fr-BE'] = phones['nl-BE'];
phones['zh-HK'] = phones['en-HK'];
phones['zh-MO'] = phones['en-MO'];
phones['ga-IE'] = phones['en-IE'];
phones['fr-CH'] = phones['de-CH'];
phones['it-CH'] = phones['fr-CH'];
export default function isMobilePhone(str, locale, options) {
  assertString(str);

  if (options && options.strictMode && !str.startsWith('+')) {
    return false;
  }

  if (Array.isArray(locale)) {
    return locale.some(function (key) {
      // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
      // istanbul ignore else
      if (phones.hasOwnProperty(key)) {
        var phone = phones[key];

        if (phone.test(str)) {
          return true;
        }
      }

      return false;
    });
  } else if (locale in phones) {
    return phones[locale].test(str); // alias falsey locale as 'any'
  } else if (!locale || locale === 'any') {
    for (var key in phones) {
      // istanbul ignore else
      if (phones.hasOwnProperty(key)) {
        var phone = phones[key];

        if (phone.test(str)) {
          return true;
        }
      }
    }

    return false;
  }

  throw new Error("Invalid locale '".concat(locale, "'"));
}
export var locales = Object.keys(phones);import assertString from './util/assertString';
import isHexadecimal from './isHexadecimal';
export default function isMongoId(str) {
  assertString(str);
  return isHexadecimal(str) && str.length === 24;
}import assertString from './util/assertString';
/* eslint-disable no-control-regex */

var multibyte = /[^\x00-\x7F]/;
/* eslint-enable no-control-regex */

export default function isMultibyte(str) {
  assertString(str);
  return multibyte.test(str);
}import assertString from './util/assertString';
import { decimal } from './alpha';
var numericNoSymbols = /^[0-9]+$/;
export default function isNumeric(str, options) {
  assertString(str);

  if (options && options.no_symbols) {
    return numericNoSymbols.test(str);
  }

  return new RegExp("^[+-]?([0-9]*[".concat((options || {}).locale ? decimal[options.locale] : '.', "])?[0-9]+$")).test(str);
}import assertString from './util/assertString';
var octal = /^(0o)?[0-7]+$/i;
export default function isOctal(str) {
  assertString(str);
  return octal.test(str);
}import assertString from './util/assertString';
/**
 * Reference:
 * https://en.wikipedia.org/ -- Wikipedia
 * https://docs.microsoft.com/en-us/microsoft-365/compliance/eu-passport-number -- EU Passport Number
 * https://countrycode.org/ -- Country Codes
 */

var passportRegexByCountryCode = {
  AM: /^[A-Z]{2}\d{7}$/,
  // ARMENIA
  AR: /^[A-Z]{3}\d{6}$/,
  // ARGENTINA
  AT: /^[A-Z]\d{7}$/,
  // AUSTRIA
  AU: /^[A-Z]\d{7}$/,
  // AUSTRALIA
  BE: /^[A-Z]{2}\d{6}$/,
  // BELGIUM
  BG: /^\d{9}$/,
  // BULGARIA
  BR: /^[A-Z]{2}\d{6}$/,
  // BRAZIL
  BY: /^[A-Z]{2}\d{7}$/,
  // BELARUS
  CA: /^[A-Z]{2}\d{6}$/,
  // CANADA
  CH: /^[A-Z]\d{7}$/,
  // SWITZERLAND
  CN: /^G\d{8}$|^E(?![IO])[A-Z0-9]\d{7}$/,
  // CHINA [G=Ordinary, E=Electronic] followed by 8-digits, or E followed by any UPPERCASE letter (except I and O) followed by 7 digits
  CY: /^[A-Z](\d{6}|\d{8})$/,
  // CYPRUS
  CZ: /^\d{8}$/,
  // CZECH REPUBLIC
  DE: /^[CFGHJKLMNPRTVWXYZ0-9]{9}$/,
  // GERMANY
  DK: /^\d{9}$/,
  // DENMARK
  DZ: /^\d{9}$/,
  // ALGERIA
  EE: /^([A-Z]\d{7}|[A-Z]{2}\d{7})$/,
  // ESTONIA (K followed by 7-digits), e-passports have 2 UPPERCASE followed by 7 digits
  ES: /^[A-Z0-9]{2}([A-Z0-9]?)\d{6}$/,
  // SPAIN
  FI: /^[A-Z]{2}\d{7}$/,
  // FINLAND
  FR: /^\d{2}[A-Z]{2}\d{5}$/,
  // FRANCE
  GB: /^\d{9}$/,
  // UNITED KINGDOM
  GR: /^[A-Z]{2}\d{7}$/,
  // GREECE
  HR: /^\d{9}$/,
  // CROATIA
  HU: /^[A-Z]{2}(\d{6}|\d{7})$/,
  // HUNGARY
  IE: /^[A-Z0-9]{2}\d{7}$/,
  // IRELAND
  IN: /^[A-Z]{1}-?\d{7}$/,
  // INDIA
  ID: /^[A-C]\d{7}$/,
  // INDONESIA
  IR: /^[A-Z]\d{8}$/,
  // IRAN
  IS: /^(A)\d{7}$/,
  // ICELAND
  IT: /^[A-Z0-9]{2}\d{7}$/,
  // ITALY
  JP: /^[A-Z]{2}\d{7}$/,
  // JAPAN
  KR: /^[MS]\d{8}$/,
  // SOUTH KOREA, REPUBLIC OF KOREA, [S=PS Passports, M=PM Passports]
  LT: /^[A-Z0-9]{8}$/,
  // LITHUANIA
  LU: /^[A-Z0-9]{8}$/,
  // LUXEMBURG
  LV: /^[A-Z0-9]{2}\d{7}$/,
  // LATVIA
  LY: /^[A-Z0-9]{8}$/,
  // LIBYA
  MT: /^\d{7}$/,
  // MALTA
  MZ: /^([A-Z]{2}\d{7})|(\d{2}[A-Z]{2}\d{5})$/,
  // MOZAMBIQUE
  MY: /^[AHK]\d{8}$/,
  // MALAYSIA
  NL: /^[A-Z]{2}[A-Z0-9]{6}\d$/,
  // NETHERLANDS
  PL: /^[A-Z]{2}\d{7}$/,
  // POLAND
  PT: /^[A-Z]\d{6}$/,
  // PORTUGAL
  RO: /^\d{8,9}$/,
  // ROMANIA
  RU: /^\d{9}$/,
  // RUSSIAN FEDERATION
  SE: /^\d{8}$/,
  // SWEDEN
  SL: /^(P)[A-Z]\d{7}$/,
  // SLOVANIA
  SK: /^[0-9A-Z]\d{7}$/,
  // SLOVAKIA
  TR: /^[A-Z]\d{8}$/,
  // TURKEY
  UA: /^[A-Z]{2}\d{6}$/,
  // UKRAINE
  US: /^\d{9}$/ // UNITED STATES

};
/**
 * Check if str is a valid passport number
 * relative to provided ISO Country Code.
 *
 * @param {string} str
 * @param {string} countryCode
 * @return {boolean}
 */

export default function isPassportNumber(str, countryCode) {
  assertString(str);
  /** Remove All Whitespaces, Convert to UPPERCASE */

  var normalizedStr = str.replace(/\s/g, '').toUpperCase();
  return countryCode.toUpperCase() in passportRegexByCountryCode && passportRegexByCountryCode[countryCode].test(normalizedStr);
}import isInt from './isInt';
export default function isPort(str) {
  return isInt(str, {
    min: 0,
    max: 65535
  });
}import assertString from './util/assertString'; // common patterns

var threeDigit = /^\d{3}$/;
var fourDigit = /^\d{4}$/;
var fiveDigit = /^\d{5}$/;
var sixDigit = /^\d{6}$/;
var patterns = {
  AD: /^AD\d{3}$/,
  AT: fourDigit,
  AU: fourDigit,
  AZ: /^AZ\d{4}$/,
  BE: fourDigit,
  BG: fourDigit,
  BR: /^\d{5}-\d{3}$/,
  BY: /2[1-4]{1}\d{4}$/,
  CA: /^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][\s\-]?\d[ABCEGHJ-NPRSTV-Z]\d$/i,
  CH: fourDigit,
  CN: /^(0[1-7]|1[012356]|2[0-7]|3[0-6]|4[0-7]|5[1-7]|6[1-7]|7[1-5]|8[1345]|9[09])\d{4}$/,
  CZ: /^\d{3}\s?\d{2}$/,
  DE: fiveDigit,
  DK: fourDigit,
  DO: fiveDigit,
  DZ: fiveDigit,
  EE: fiveDigit,
  ES: /^(5[0-2]{1}|[0-4]{1}\d{1})\d{3}$/,
  FI: fiveDigit,
  FR: /^\d{2}\s?\d{3}$/,
  GB: /^(gir\s?0aa|[a-z]{1,2}\d[\da-z]?\s?(\d[a-z]{2})?)$/i,
  GR: /^\d{3}\s?\d{2}$/,
  HR: /^([1-5]\d{4}$)/,
  HT: /^HT\d{4}$/,
  HU: fourDigit,
  ID: fiveDigit,
  IE: /^(?!.*(?:o))[A-Za-z]\d[\dw]\s\w{4}$/i,
  IL: /^(\d{5}|\d{7})$/,
  IN: /^((?!10|29|35|54|55|65|66|86|87|88|89)[1-9][0-9]{5})$/,
  IR: /\b(?!(\d)\1{3})[13-9]{4}[1346-9][013-9]{5}\b/,
  IS: threeDigit,
  IT: fiveDigit,
  JP: /^\d{3}\-\d{4}$/,
  KE: fiveDigit,
  KR: /^(\d{5}|\d{6})$/,
  LI: /^(948[5-9]|949[0-7])$/,
  LT: /^LT\-\d{5}$/,
  LU: fourDigit,
  LV: /^LV\-\d{4}$/,
  LK: fiveDigit,
  MX: fiveDigit,
  MT: /^[A-Za-z]{3}\s{0,1}\d{4}$/,
  MY: fiveDigit,
  NL: /^\d{4}\s?[a-z]{2}$/i,
  NO: fourDigit,
  NP: /^(10|21|22|32|33|34|44|45|56|57)\d{3}$|^(977)$/i,
  NZ: fourDigit,
  PL: /^\d{2}\-\d{3}$/,
  PR: /^00[679]\d{2}([ -]\d{4})?$/,
  PT: /^\d{4}\-\d{3}?$/,
  RO: sixDigit,
  RU: sixDigit,
  SA: fiveDigit,
  SE: /^[1-9]\d{2}\s?\d{2}$/,
  SG: sixDigit,
  SI: fourDigit,
  SK: /^\d{3}\s?\d{2}$/,
  TH: fiveDigit,
  TN: fourDigit,
  TW: /^\d{3}(\d{2})?$/,
  UA: fiveDigit,
  US: /^\d{5}(-\d{4})?$/,
  ZA: fourDigit,
  ZM: fiveDigit
};
export var locales = Object.keys(patterns);
export default function isPostalCode(str, locale) {
  assertString(str);

  if (locale in patterns) {
    return patterns[locale].test(str);
  } else if (locale === 'any') {
    for (var key in patterns) {
      // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
      // istanbul ignore else
      if (patterns.hasOwnProperty(key)) {
        var pattern = patterns[key];

        if (pattern.test(str)) {
          return true;
        }
      }
    }

    return false;
  }

  throw new Error("Invalid locale '".concat(locale, "'"));
}import assertString from './util/assertString';
/* Based on https://tools.ietf.org/html/rfc3339#section-5.6 */

var dateFullYear = /[0-9]{4}/;
var dateMonth = /(0[1-9]|1[0-2])/;
var dateMDay = /([12]\d|0[1-9]|3[01])/;
var timeHour = /([01][0-9]|2[0-3])/;
var timeMinute = /[0-5][0-9]/;
var timeSecond = /([0-5][0-9]|60)/;
var timeSecFrac = /(\.[0-9]+)?/;
var timeNumOffset = new RegExp("[-+]".concat(timeHour.source, ":").concat(timeMinute.source));
var timeOffset = new RegExp("([zZ]|".concat(timeNumOffset.source, ")"));
var partialTime = new RegExp("".concat(timeHour.source, ":").concat(timeMinute.source, ":").concat(timeSecond.source).concat(timeSecFrac.source));
var fullDate = new RegExp("".concat(dateFullYear.source, "-").concat(dateMonth.source, "-").concat(dateMDay.source));
var fullTime = new RegExp("".concat(partialTime.source).concat(timeOffset.source));
var rfc3339 = new RegExp("^".concat(fullDate.source, "[ tT]").concat(fullTime.source, "$"));
export default function isRFC3339(str) {
  assertString(str);
  return rfc3339.test(str);
}import assertString from './util/assertString';
var rgbColor = /^rgb\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){2}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\)$/;
var rgbaColor = /^rgba\((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)$/;
var rgbColorPercent = /^rgb\((([0-9]%|[1-9][0-9]%|100%),){2}([0-9]%|[1-9][0-9]%|100%)\)/;
var rgbaColorPercent = /^rgba\((([0-9]%|[1-9][0-9]%|100%),){3}(0?\.\d|1(\.0)?|0(\.0)?)\)/;
export default function isRgbColor(str) {
  var includePercentValues = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
  assertString(str);

  if (!includePercentValues) {
    return rgbColor.test(str) || rgbaColor.test(str);
  }

  return rgbColor.test(str) || rgbaColor.test(str) || rgbColorPercent.test(str) || rgbaColorPercent.test(str);
}import assertString from './util/assertString';
import multilineRegexp from './util/multilineRegex';
/**
 * Regular Expression to match
 * semantic versioning (SemVer)
 * built from multi-line, multi-parts regexp
 * Reference: https://semver.org/
 */

var semanticVersioningRegex = multilineRegexp(['^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)', '(?:-((?:0|[1-9]\\d*|\\d*[a-z-][0-9a-z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-z-][0-9a-z-]*))*))', '?(?:\\+([0-9a-z-]+(?:\\.[0-9a-z-]+)*))?$'], 'i');
export default function isSemVer(str) {
  assertString(str);
  return semanticVersioningRegex.test(str);
}import assertString from './util/assertString';
var charsetRegex = /^[^\s-_](?!.*?[-_]{2,})[a-z0-9-\\][^\s]*[^-_\s]$/;
export default function isSlug(str) {
  assertString(str);
  return charsetRegex.test(str);
}import merge from './util/merge';
import assertString from './util/assertString';
var upperCaseRegex = /^[A-Z]$/;
var lowerCaseRegex = /^[a-z]$/;
var numberRegex = /^[0-9]$/;
var symbolRegex = /^[-#!$@%^&*()_+|~=`{}\[\]:";'<>?,.\/ ]$/;
var defaultOptions = {
  minLength: 8,
  minLowercase: 1,
  minUppercase: 1,
  minNumbers: 1,
  minSymbols: 1,
  returnScore: false,
  pointsPerUnique: 1,
  pointsPerRepeat: 0.5,
  pointsForContainingLower: 10,
  pointsForContainingUpper: 10,
  pointsForContainingNumber: 10,
  pointsForContainingSymbol: 10
};
/* Counts number of occurrences of each char in a string
 * could be moved to util/ ?
*/

function countChars(str) {
  var result = {};
  Array.from(str).forEach(function (_char) {
    var curVal = result[_char];

    if (curVal) {
      result[_char] += 1;
    } else {
      result[_char] = 1;
    }
  });
  return result;
}
/* Return information about a password */


function analyzePassword(password) {
  var charMap = countChars(password);
  var analysis = {
    length: password.length,
    uniqueChars: Object.keys(charMap).length,
    uppercaseCount: 0,
    lowercaseCount: 0,
    numberCount: 0,
    symbolCount: 0
  };
  Object.keys(charMap).forEach(function (_char2) {
    /* istanbul ignore else */
    if (upperCaseRegex.test(_char2)) {
      analysis.uppercaseCount += charMap[_char2];
    } else if (lowerCaseRegex.test(_char2)) {
      analysis.lowercaseCount += charMap[_char2];
    } else if (numberRegex.test(_char2)) {
      analysis.numberCount += charMap[_char2];
    } else if (symbolRegex.test(_char2)) {
      analysis.symbolCount += charMap[_char2];
    }
  });
  return analysis;
}

function scorePassword(analysis, scoringOptions) {
  var points = 0;
  points += analysis.uniqueChars * scoringOptions.pointsPerUnique;
  points += (analysis.length - analysis.uniqueChars) * scoringOptions.pointsPerRepeat;

  if (analysis.lowercaseCount > 0) {
    points += scoringOptions.pointsForContainingLower;
  }

  if (analysis.uppercaseCount > 0) {
    points += scoringOptions.pointsForContainingUpper;
  }

  if (analysis.numberCount > 0) {
    points += scoringOptions.pointsForContainingNumber;
  }

  if (analysis.symbolCount > 0) {
    points += scoringOptions.pointsForContainingSymbol;
  }

  return points;
}

export default function isStrongPassword(str) {
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
  assertString(str);
  var analysis = analyzePassword(str);
  options = merge(options || {}, defaultOptions);

  if (options.returnScore) {
    return scorePassword(analysis, options);
  }

  return analysis.length >= options.minLength && analysis.lowercaseCount >= options.minLowercase && analysis.uppercaseCount >= options.minUppercase && analysis.numberCount >= options.minNumbers && analysis.symbolCount >= options.minSymbols;
}import assertString from './util/assertString';
var surrogatePair = /[\uD800-\uDBFF][\uDC00-\uDFFF]/;
export default function isSurrogatePair(str) {
  assertString(str);
  return surrogatePair.test(str);
}function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }

function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }

function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }

function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }

import assertString from './util/assertString';
import * as algorithms from './util/algorithms';
import isDate from './isDate';
/**
 * TIN Validation
 * Validates Tax Identification Numbers (TINs) from the US, EU member states and the United Kingdom.
 *
 * EU-UK:
 * National TIN validity is calculated using public algorithms as made available by DG TAXUD.
 *
 * See `https://ec.europa.eu/taxation_customs/tin/specs/FS-TIN%20Algorithms-Public.docx` for more information.
 *
 * US:
 * An Employer Identification Number (EIN), also known as a Federal Tax Identification Number,
 *  is used to identify a business entity.
 *
 * NOTES:
 *  - Prefix 47 is being reserved for future use
 *  - Prefixes 26, 27, 45, 46 and 47 were previously assigned by the Philadelphia campus.
 *
 * See `http://www.irs.gov/Businesses/Small-Businesses-&-Self-Employed/How-EINs-are-Assigned-and-Valid-EIN-Prefixes`
 * for more information.
 */
// Locale functions

/*
 * bg-BG validation function
 * (Edinen graždanski nomer (EGN/ЕГН), persons only)
 * Checks if birth date (first six digits) is valid and calculates check (last) digit
 */

function bgBgCheck(tin) {
  // Extract full year, normalize month and check birth date validity
  var century_year = tin.slice(0, 2);
  var month = parseInt(tin.slice(2, 4), 10);

  if (month > 40) {
    month -= 40;
    century_year = "20".concat(century_year);
  } else if (month > 20) {
    month -= 20;
    century_year = "18".concat(century_year);
  } else {
    century_year = "19".concat(century_year);
  }

  if (month < 10) {
    month = "0".concat(month);
  }

  var date = "".concat(century_year, "/").concat(month, "/").concat(tin.slice(4, 6));

  if (!isDate(date, 'YYYY/MM/DD')) {
    return false;
  } // split digits into an array for further processing


  var digits = tin.split('').map(function (a) {
    return parseInt(a, 10);
  }); // Calculate checksum by multiplying digits with fixed values

  var multip_lookup = [2, 4, 8, 5, 10, 9, 7, 3, 6];
  var checksum = 0;

  for (var i = 0; i < multip_lookup.length; i++) {
    checksum += digits[i] * multip_lookup[i];
  }

  checksum = checksum % 11 === 10 ? 0 : checksum % 11;
  return checksum === digits[9];
}
/*
 * cs-CZ validation function
 * (Rodné číslo (RČ), persons only)
 * Checks if birth date (first six digits) is valid and divisibility by 11
 * Material not in DG TAXUD document sourced from:
 * -`https://lorenc.info/3MA381/overeni-spravnosti-rodneho-cisla.htm`
 * -`https://www.mvcr.cz/clanek/rady-a-sluzby-dokumenty-rodne-cislo.aspx`
 */


function csCzCheck(tin) {
  tin = tin.replace(/\W/, ''); // Extract full year from TIN length

  var full_year = parseInt(tin.slice(0, 2), 10);

  if (tin.length === 10) {
    if (full_year < 54) {
      full_year = "20".concat(full_year);
    } else {
      full_year = "19".concat(full_year);
    }
  } else {
    if (tin.slice(6) === '000') {
      return false;
    } // Three-zero serial not assigned before 1954


    if (full_year < 54) {
      full_year = "19".concat(full_year);
    } else {
      return false; // No 18XX years seen in any of the resources
    }
  } // Add missing zero if needed


  if (full_year.length === 3) {
    full_year = [full_year.slice(0, 2), '0', full_year.slice(2)].join('');
  } // Extract month from TIN and normalize


  var month = parseInt(tin.slice(2, 4), 10);

  if (month > 50) {
    month -= 50;
  }

  if (month > 20) {
    // Month-plus-twenty was only introduced in 2004
    if (parseInt(full_year, 10) < 2004) {
      return false;
    }

    month -= 20;
  }

  if (month < 10) {
    month = "0".concat(month);
  } // Check date validity


  var date = "".concat(full_year, "/").concat(month, "/").concat(tin.slice(4, 6));

  if (!isDate(date, 'YYYY/MM/DD')) {
    return false;
  } // Verify divisibility by 11


  if (tin.length === 10) {
    if (parseInt(tin, 10) % 11 !== 0) {
      // Some numbers up to and including 1985 are still valid if
      // check (last) digit equals 0 and modulo of first 9 digits equals 10
      var checkdigit = parseInt(tin.slice(0, 9), 10) % 11;

      if (parseInt(full_year, 10) < 1986 && checkdigit === 10) {
        if (parseInt(tin.slice(9), 10) !== 0) {
          return false;
        }
      } else {
        return false;
      }
    }
  }

  return true;
}
/*
 * de-AT validation function
 * (Abgabenkontonummer, persons/entities)
 * Verify TIN validity by calling luhnCheck()
 */


function deAtCheck(tin) {
  return algorithms.luhnCheck(tin);
}
/*
 * de-DE validation function
 * (Steueridentifikationsnummer (Steuer-IdNr.), persons only)
 * Tests for single duplicate/triplicate value, then calculates ISO 7064 check (last) digit
 * Partial implementation of spec (same result with both algorithms always)
 */


function deDeCheck(tin) {
  // Split digits into an array for further processing
  var digits = tin.split('').map(function (a) {
    return parseInt(a, 10);
  }); // Fill array with strings of number positions

  var occurences = [];

  for (var i = 0; i < digits.length - 1; i++) {
    occurences.push('');

    for (var j = 0; j < digits.length - 1; j++) {
      if (digits[i] === digits[j]) {
        occurences[i] += j;
      }
    }
  } // Remove digits with one occurence and test for only one duplicate/triplicate


  occurences = occurences.filter(function (a) {
    return a.length > 1;
  });

  if (occurences.length !== 2 && occurences.length !== 3) {
    return false;
  } // In case of triplicate value only two digits are allowed next to each other


  if (occurences[0].length === 3) {
    var trip_locations = occurences[0].split('').map(function (a) {
      return parseInt(a, 10);
    });
    var recurrent = 0; // Amount of neighbour occurences

    for (var _i = 0; _i < trip_locations.length - 1; _i++) {
      if (trip_locations[_i] + 1 === trip_locations[_i + 1]) {
        recurrent += 1;
      }
    }

    if (recurrent === 2) {
      return false;
    }
  }

  return algorithms.iso7064Check(tin);
}
/*
 * dk-DK validation function
 * (CPR-nummer (personnummer), persons only)
 * Checks if birth date (first six digits) is valid and assigned to century (seventh) digit,
 * and calculates check (last) digit
 */


function dkDkCheck(tin) {
  tin = tin.replace(/\W/, ''); // Extract year, check if valid for given century digit and add century

  var year = parseInt(tin.slice(4, 6), 10);
  var century_digit = tin.slice(6, 7);

  switch (century_digit) {
    case '0':
    case '1':
    case '2':
    case '3':
      year = "19".concat(year);
      break;

    case '4':
    case '9':
      if (year < 37) {
        year = "20".concat(year);
      } else {
        year = "19".concat(year);
      }

      break;

    default:
      if (year < 37) {
        year = "20".concat(year);
      } else if (year > 58) {
        year = "18".concat(year);
      } else {
        return false;
      }

      break;
  } // Add missing zero if needed


  if (year.length === 3) {
    year = [year.slice(0, 2), '0', year.slice(2)].join('');
  } // Check date validity


  var date = "".concat(year, "/").concat(tin.slice(2, 4), "/").concat(tin.slice(0, 2));

  if (!isDate(date, 'YYYY/MM/DD')) {
    return false;
  } // Split digits into an array for further processing


  var digits = tin.split('').map(function (a) {
    return parseInt(a, 10);
  });
  var checksum = 0;
  var weight = 4; // Multiply by weight and add to checksum

  for (var i = 0; i < 9; i++) {
    checksum += digits[i] * weight;
    weight -= 1;

    if (weight === 1) {
      weight = 7;
    }
  }

  checksum %= 11;

  if (checksum === 1) {
    return false;
  }

  return checksum === 0 ? digits[9] === 0 : digits[9] === 11 - checksum;
}
/*
 * el-CY validation function
 * (Arithmos Forologikou Mitroou (AFM/ΑΦΜ), persons only)
 * Verify TIN validity by calculating ASCII value of check (last) character
 */


function elCyCheck(tin) {
  // split digits into an array for further processing
  var digits = tin.slice(0, 8).split('').map(function (a) {
    return parseInt(a, 10);
  });
  var checksum = 0; // add digits in even places

  for (var i = 1; i < digits.length; i += 2) {
    checksum += digits[i];
  } // add digits in odd places


  for (var _i2 = 0; _i2 < digits.length; _i2 += 2) {
    if (digits[_i2] < 2) {
      checksum += 1 - digits[_i2];
    } else {
      checksum += 2 * (digits[_i2] - 2) + 5;

      if (digits[_i2] > 4) {
        checksum += 2;
      }
    }
  }

  return String.fromCharCode(checksum % 26 + 65) === tin.charAt(8);
}
/*
 * el-GR validation function
 * (Arithmos Forologikou Mitroou (AFM/ΑΦΜ), persons/entities)
 * Verify TIN validity by calculating check (last) digit
 * Algorithm not in DG TAXUD document- sourced from:
 * - `http://epixeirisi.gr/%CE%9A%CE%A1%CE%99%CE%A3%CE%99%CE%9C%CE%91-%CE%98%CE%95%CE%9C%CE%91%CE%A4%CE%91-%CE%A6%CE%9F%CE%A1%CE%9F%CE%9B%CE%9F%CE%93%CE%99%CE%91%CE%A3-%CE%9A%CE%91%CE%99-%CE%9B%CE%9F%CE%93%CE%99%CE%A3%CE%A4%CE%99%CE%9A%CE%97%CE%A3/23791/%CE%91%CF%81%CE%B9%CE%B8%CE%BC%CF%8C%CF%82-%CE%A6%CE%BF%CF%81%CE%BF%CE%BB%CE%BF%CE%B3%CE%B9%CE%BA%CE%BF%CF%8D-%CE%9C%CE%B7%CF%84%CF%81%CF%8E%CE%BF%CF%85`
 */


function elGrCheck(tin) {
  // split digits into an array for further processing
  var digits = tin.split('').map(function (a) {
    return parseInt(a, 10);
  });
  var checksum = 0;

  for (var i = 0; i < 8; i++) {
    checksum += digits[i] * Math.pow(2, 8 - i);
  }

  return checksum % 11 % 10 === digits[8];
}
/*
 * en-GB validation function (should go here if needed)
 * (National Insurance Number (NINO) or Unique Taxpayer Reference (UTR),
 * persons/entities respectively)
 */

/*
 * en-IE validation function
 * (Personal Public Service Number (PPS No), persons only)
 * Verify TIN validity by calculating check (second to last) character
 */


function enIeCheck(tin) {
  var checksum = algorithms.reverseMultiplyAndSum(tin.split('').slice(0, 7).map(function (a) {
    return parseInt(a, 10);
  }), 8);

  if (tin.length === 9 && tin[8] !== 'W') {
    checksum += (tin[8].charCodeAt(0) - 64) * 9;
  }

  checksum %= 23;

  if (checksum === 0) {
    return tin[7].toUpperCase() === 'W';
  }

  return tin[7].toUpperCase() === String.fromCharCode(64 + checksum);
} // Valid US IRS campus prefixes


var enUsCampusPrefix = {
  andover: ['10', '12'],
  atlanta: ['60', '67'],
  austin: ['50', '53'],
  brookhaven: ['01', '02', '03', '04', '05', '06', '11', '13', '14', '16', '21', '22', '23', '25', '34', '51', '52', '54', '55', '56', '57', '58', '59', '65'],
  cincinnati: ['30', '32', '35', '36', '37', '38', '61'],
  fresno: ['15', '24'],
  internet: ['20', '26', '27', '45', '46', '47'],
  kansas: ['40', '44'],
  memphis: ['94', '95'],
  ogden: ['80', '90'],
  philadelphia: ['33', '39', '41', '42', '43', '46', '48', '62', '63', '64', '66', '68', '71', '72', '73', '74', '75', '76', '77', '81', '82', '83', '84', '85', '86', '87', '88', '91', '92', '93', '98', '99'],
  sba: ['31']
}; // Return an array of all US IRS campus prefixes

function enUsGetPrefixes() {
  var prefixes = [];

  for (var location in enUsCampusPrefix) {
    // https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md#ignoring-code-for-coverage-purposes
    // istanbul ignore else
    if (enUsCampusPrefix.hasOwnProperty(location)) {
      prefixes.push.apply(prefixes, _toConsumableArray(enUsCampusPrefix[location]));
    }
  }

  return prefixes;
}
/*
 * en-US validation function
 * Verify that the TIN starts with a valid IRS campus prefix
 */


function enUsCheck(tin) {
  return enUsGetPrefixes().indexOf(tin.substr(0, 2)) !== -1;
}
/*
 * es-ES validation function
 * (Documento Nacional de Identidad (DNI)
 * or Número de Identificación de Extranjero (NIE), persons only)
 * Verify TIN validity by calculating check (last) character
 */


function esEsCheck(tin) {
  // Split characters into an array for further processing
  var chars = tin.toUpperCase().split(''); // Replace initial letter if needed

  if (isNaN(parseInt(chars[0], 10)) && chars.length > 1) {
    var lead_replace = 0;

    switch (chars[0]) {
      case 'Y':
        lead_replace = 1;
        break;

      case 'Z':
        lead_replace = 2;
        break;

      default:
    }

    chars.splice(0, 1, lead_replace); // Fill with zeros if smaller than proper
  } else {
    while (chars.length < 9) {
      chars.unshift(0);
    }
  } // Calculate checksum and check according to lookup


  var lookup = ['T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E'];
  chars = chars.join('');
  var checksum = parseInt(chars.slice(0, 8), 10) % 23;
  return chars[8] === lookup[checksum];
}
/*
 * et-EE validation function
 * (Isikukood (IK), persons only)
 * Checks if birth date (century digit and six following) is valid and calculates check (last) digit
 * Material not in DG TAXUD document sourced from:
 * - `https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Estonia-TIN.pdf`
 */


function etEeCheck(tin) {
  // Extract year and add century
  var full_year = tin.slice(1, 3);
  var century_digit = tin.slice(0, 1);

  switch (century_digit) {
    case '1':
    case '2':
      full_year = "18".concat(full_year);
      break;

    case '3':
    case '4':
      full_year = "19".concat(full_year);
      break;

    default:
      full_year = "20".concat(full_year);
      break;
  } // Check date validity


  var date = "".concat(full_year, "/").concat(tin.slice(3, 5), "/").concat(tin.slice(5, 7));

  if (!isDate(date, 'YYYY/MM/DD')) {
    return false;
  } // Split digits into an array for further processing


  var digits = tin.split('').map(function (a) {
    return parseInt(a, 10);
  });
  var checksum = 0;
  var weight = 1; // Multiply by weight and add to checksum

  for (var i = 0; i < 10; i++) {
    checksum += digits[i] * weight;
    weight += 1;

    if (weight === 10) {
      weight = 1;
    }
  } // Do again if modulo 11 of checksum is 10


  if (checksum % 11 === 10) {
    checksum = 0;
    weight = 3;

    for (var _i3 = 0; _i3 < 10; _i3++) {
      checksum += digits[_i3] * weight;
      weight += 1;

      if (weight === 10) {
        weight = 1;
      }
    }

    if (checksum % 11 === 10) {
      return digits[10] === 0;
    }
  }

  return checksum % 11 === digits[10];
}
/*
 * fi-FI validation function
 * (Henkilötunnus (HETU), persons only)
 * Checks if birth date (first six digits plus century symbol) is valid
 * and calculates check (last) digit
 */


function fiFiCheck(tin) {
  // Extract year and add century
  var full_year = tin.slice(4, 6);
  var century_symbol = tin.slice(6, 7);

  switch (century_symbol) {
    case '+':
      full_year = "18".concat(full_year);
      break;

    case '-':
      full_year = "19".concat(full_year);
      break;

    default:
      full_year = "20".concat(full_year);
      break;
  } // Check date validity


  var date = "".concat(full_year, "/").concat(tin.slice(2, 4), "/").concat(tin.slice(0, 2));

  if (!isDate(date, 'YYYY/MM/DD')) {
    return false;
  } // Calculate check character


  var checksum = parseInt(tin.slice(0, 6) + tin.slice(7, 10), 10) % 31;

  if (checksum < 10) {
    return checksum === parseInt(tin.slice(10), 10);
  }

  checksum -= 10;
  var letters_lookup = ['A', 'B', 'C', 'D', 'E', 'F', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y'];
  return letters_lookup[checksum] === tin.slice(10);
}
/*
 * fr/nl-BE validation function
 * (Numéro national (N.N.), persons only)
 * Checks if birth date (first six digits) is valid and calculates check (last two) digits
 */


function frBeCheck(tin) {
  // Zero month/day value is acceptable
  if (tin.slice(2, 4) !== '00' || tin.slice(4, 6) !== '00') {
    // Extract date from first six digits of TIN
    var date = "".concat(tin.slice(0, 2), "/").concat(tin.slice(2, 4), "/").concat(tin.slice(4, 6));

    if (!isDate(date, 'YY/MM/DD')) {
      return false;
    }
  }

  var checksum = 97 - parseInt(tin.slice(0, 9), 10) % 97;
  var checkdigits = parseInt(tin.slice(9, 11), 10);

  if (checksum !== checkdigits) {
    checksum = 97 - parseInt("2".concat(tin.slice(0, 9)), 10) % 97;

    if (checksum !== checkdigits) {
      return false;
    }
  }

  return true;
}
/*
 * fr-FR validation function
 * (Numéro fiscal de référence (numéro SPI), persons only)
 * Verify TIN validity by calculating check (last three) digits
 */


function frFrCheck(tin) {
  tin = tin.replace(/\s/g, '');
  var checksum = parseInt(tin.slice(0, 10), 10) % 511;
  var checkdigits = parseInt(tin.slice(10, 13), 10);
  return checksum === checkdigits;
}
/*
 * fr/lb-LU validation function
 * (numéro d’identification personnelle, persons only)
 * Verify birth date validity and run Luhn and Verhoeff checks
 */


function frLuCheck(tin) {
  // Extract date and check validity
  var date = "".concat(tin.slice(0, 4), "/").concat(tin.slice(4, 6), "/").concat(tin.slice(6, 8));

  if (!isDate(date, 'YYYY/MM/DD')) {
    return false;
  } // Run Luhn check


  if (!algorithms.luhnCheck(tin.slice(0, 12))) {
    return false;
  } // Remove Luhn check digit and run Verhoeff check


  return algorithms.verhoeffCheck("".concat(tin.slice(0, 11)).concat(tin[12]));
}
/*
 * hr-HR validation function
 * (Osobni identifikacijski broj (OIB), persons/entities)
 * Verify TIN validity by calling iso7064Check(digits)
 */


function hrHrCheck(tin) {
  return algorithms.iso7064Check(tin);
}
/*
 * hu-HU validation function
 * (Adóazonosító jel, persons only)
 * Verify TIN validity by calculating check (last) digit
 */


function huHuCheck(tin) {
  // split digits into an array for further processing
  var digits = tin.split('').map(function (a) {
    return parseInt(a, 10);
  });
  var checksum = 8;

  for (var i = 1; i < 9; i++) {
    checksum += digits[i] * (i + 1);
  }

  return checksum % 11 === digits[9];
}
/*
 * lt-LT validation function (should go here if needed)
 * (Asmens kodas, persons/entities respectively)
 * Current validation check is alias of etEeCheck- same format applies
 */

/*
 * it-IT first/last name validity check
 * Accepts it-IT TIN-encoded names as a three-element character array and checks their validity
 * Due to lack of clarity between resources ("Are only Italian consonants used?
 * What happens if a person has X in their name?" etc.) only two test conditions
 * have been implemented:
 * Vowels may only be followed by other vowels or an X character
 * and X characters after vowels may only be followed by other X characters.
 */


function itItNameCheck(name) {
  // true at the first occurence of a vowel
  var vowelflag = false; // true at the first occurence of an X AFTER vowel
  // (to properly handle last names with X as consonant)

  var xflag = false;

  for (var i = 0; i < 3; i++) {
    if (!vowelflag && /[AEIOU]/.test(name[i])) {
      vowelflag = true;
    } else if (!xflag && vowelflag && name[i] === 'X') {
      xflag = true;
    } else if (i > 0) {
      if (vowelflag && !xflag) {
        if (!/[AEIOU]/.test(name[i])) {
          return false;
        }
      }

      if (xflag) {
        if (!/X/.test(name[i])) {
          return false;
        }
      }
    }
  }

  return true;
}
/*
 * it-IT validation function
 * (Codice fiscale (TIN-IT), persons only)
 * Verify name, birth date and codice catastale validity
 * and calculate check character.
 * Material not in DG-TAXUD document sourced from:
 * `https://en.wikipedia.org/wiki/Italian_fiscal_code`
 */


function itItCheck(tin) {
  // Capitalize and split characters into an array for further processing
  var chars = tin.toUpperCase().split(''); // Check first and last name validity calling itItNameCheck()

  if (!itItNameCheck(chars.slice(0, 3))) {
    return false;
  }

  if (!itItNameCheck(chars.slice(3, 6))) {
    return false;
  } // Convert letters in number spaces back to numbers if any


  var number_locations = [6, 7, 9, 10, 12, 13, 14];
  var number_replace = {
    L: '0',
    M: '1',
    N: '2',
    P: '3',
    Q: '4',
    R: '5',
    S: '6',
    T: '7',
    U: '8',
    V: '9'
  };

  for (var _i4 = 0, _number_locations = number_locations; _i4 < _number_locations.length; _i4++) {
    var i = _number_locations[_i4];

    if (chars[i] in number_replace) {
      chars.splice(i, 1, number_replace[chars[i]]);
    }
  } // Extract month and day, and check date validity


  var month_replace = {
    A: '01',
    B: '02',
    C: '03',
    D: '04',
    E: '05',
    H: '06',
    L: '07',
    M: '08',
    P: '09',
    R: '10',
    S: '11',
    T: '12'
  };
  var month = month_replace[chars[8]];
  var day = parseInt(chars[9] + chars[10], 10);

  if (day > 40) {
    day -= 40;
  }

  if (day < 10) {
    day = "0".concat(day);
  }

  var date = "".concat(chars[6]).concat(chars[7], "/").concat(month, "/").concat(day);

  if (!isDate(date, 'YY/MM/DD')) {
    return false;
  } // Calculate check character by adding up even and odd characters as numbers


  var checksum = 0;

  for (var _i5 = 1; _i5 < chars.length - 1; _i5 += 2) {
    var char_to_int = parseInt(chars[_i5], 10);

    if (isNaN(char_to_int)) {
      char_to_int = chars[_i5].charCodeAt(0) - 65;
    }

    checksum += char_to_int;
  }

  var odd_convert = {
    // Maps of characters at odd places
    A: 1,
    B: 0,
    C: 5,
    D: 7,
    E: 9,
    F: 13,
    G: 15,
    H: 17,
    I: 19,
    J: 21,
    K: 2,
    L: 4,
    M: 18,
    N: 20,
    O: 11,
    P: 3,
    Q: 6,
    R: 8,
    S: 12,
    T: 14,
    U: 16,
    V: 10,
    W: 22,
    X: 25,
    Y: 24,
    Z: 23,
    0: 1,
    1: 0
  };

  for (var _i6 = 0; _i6 < chars.length - 1; _i6 += 2) {
    var _char_to_int = 0;

    if (chars[_i6] in odd_convert) {
      _char_to_int = odd_convert[chars[_i6]];
    } else {
      var multiplier = parseInt(chars[_i6], 10);
      _char_to_int = 2 * multiplier + 1;

      if (multiplier > 4) {
        _char_to_int += 2;
      }
    }

    checksum += _char_to_int;
  }

  if (String.fromCharCode(65 + checksum % 26) !== chars[15]) {
    return false;
  }

  return true;
}
/*
 * lv-LV validation function
 * (Personas kods (PK), persons only)
 * Check validity of birth date and calculate check (last) digit
 * Support only for old format numbers (not starting with '32', issued before 2017/07/01)
 * Material not in DG TAXUD document sourced from:
 * `https://boot.ritakafija.lv/forums/index.php?/topic/88314-personas-koda-algoritms-%C4%8Deksumma/`
 */


function lvLvCheck(tin) {
  tin = tin.replace(/\W/, ''); // Extract date from TIN

  var day = tin.slice(0, 2);

  if (day !== '32') {
    // No date/checksum check if new format
    var month = tin.slice(2, 4);

    if (month !== '00') {
      // No date check if unknown month
      var full_year = tin.slice(4, 6);

      switch (tin[6]) {
        case '0':
          full_year = "18".concat(full_year);
          break;

        case '1':
          full_year = "19".concat(full_year);
          break;

        default:
          full_year = "20".concat(full_year);
          break;
      } // Check date validity


      var date = "".concat(full_year, "/").concat(tin.slice(2, 4), "/").concat(day);

      if (!isDate(date, 'YYYY/MM/DD')) {
        return false;
      }
    } // Calculate check digit


    var checksum = 1101;
    var multip_lookup = [1, 6, 3, 7, 9, 10, 5, 8, 4, 2];

    for (var i = 0; i < tin.length - 1; i++) {
      checksum -= parseInt(tin[i], 10) * multip_lookup[i];
    }

    return parseInt(tin[10], 10) === checksum % 11;
  }

  return true;
}
/*
 * mt-MT validation function
 * (Identity Card Number or Unique Taxpayer Reference, persons/entities)
 * Verify Identity Card Number structure (no other tests found)
 */


function mtMtCheck(tin) {
  if (tin.length !== 9) {
    // No tests for UTR
    var chars = tin.toUpperCase().split(''); // Fill with zeros if smaller than proper

    while (chars.length < 8) {
      chars.unshift(0);
    } // Validate format according to last character


    switch (tin[7]) {
      case 'A':
      case 'P':
        if (parseInt(chars[6], 10) === 0) {
          return false;
        }

        break;

      default:
        {
          var first_part = parseInt(chars.join('').slice(0, 5), 10);

          if (first_part > 32000) {
            return false;
          }

          var second_part = parseInt(chars.join('').slice(5, 7), 10);

          if (first_part === second_part) {
            return false;
          }
        }
    }
  }

  return true;
}
/*
 * nl-NL validation function
 * (Burgerservicenummer (BSN) or Rechtspersonen Samenwerkingsverbanden Informatie Nummer (RSIN),
 * persons/entities respectively)
 * Verify TIN validity by calculating check (last) digit (variant of MOD 11)
 */


function nlNlCheck(tin) {
  return algorithms.reverseMultiplyAndSum(tin.split('').slice(0, 8).map(function (a) {
    return parseInt(a, 10);
  }), 9) % 11 === parseInt(tin[8], 10);
}
/*
 * pl-PL validation function
 * (Powszechny Elektroniczny System Ewidencji Ludności (PESEL)
 * or Numer identyfikacji podatkowej (NIP), persons/entities)
 * Verify TIN validity by validating birth date (PESEL) and calculating check (last) digit
 */


function plPlCheck(tin) {
  // NIP
  if (tin.length === 10) {
    // Calculate last digit by multiplying with lookup
    var lookup = [6, 5, 7, 2, 3, 4, 5, 6, 7];
    var _checksum = 0;

    for (var i = 0; i < lookup.length; i++) {
      _checksum += parseInt(tin[i], 10) * lookup[i];
    }

    _checksum %= 11;

    if (_checksum === 10) {
      return false;
    }

    return _checksum === parseInt(tin[9], 10);
  } // PESEL
  // Extract full year using month


  var full_year = tin.slice(0, 2);
  var month = parseInt(tin.slice(2, 4), 10);

  if (month > 80) {
    full_year = "18".concat(full_year);
    month -= 80;
  } else if (month > 60) {
    full_year = "22".concat(full_year);
    month -= 60;
  } else if (month > 40) {
    full_year = "21".concat(full_year);
    month -= 40;
  } else if (month > 20) {
    full_year = "20".concat(full_year);
    month -= 20;
  } else {
    full_year = "19".concat(full_year);
  } // Add leading zero to month if needed


  if (month < 10) {
    month = "0".concat(month);
  } // Check date validity


  var date = "".concat(full_year, "/").concat(month, "/").concat(tin.slice(4, 6));

  if (!isDate(date, 'YYYY/MM/DD')) {
    return false;
  } // Calculate last digit by mulitplying with odd one-digit numbers except 5


  var checksum = 0;
  var multiplier = 1;

  for (var _i7 = 0; _i7 < tin.length - 1; _i7++) {
    checksum += parseInt(tin[_i7], 10) * multiplier % 10;
    multiplier += 2;

    if (multiplier > 10) {
      multiplier = 1;
    } else if (multiplier === 5) {
      multiplier += 2;
    }
  }

  checksum = 10 - checksum % 10;
  return checksum === parseInt(tin[10], 10);
}
/*
* pt-BR validation function
* (Cadastro de Pessoas Físicas (CPF, persons)
* Cadastro Nacional de Pessoas Jurídicas (CNPJ, entities)
* Both inputs will be validated
*/


function ptBrCheck(tin) {
  if (tin.length === 11) {
    var _sum;

    var remainder;
    _sum = 0;
    if ( // Reject known invalid CPFs
    tin === '11111111111' || tin === '22222222222' || tin === '33333333333' || tin === '44444444444' || tin === '55555555555' || tin === '66666666666' || tin === '77777777777' || tin === '88888888888' || tin === '99999999999' || tin === '00000000000') return false;

    for (var i = 1; i <= 9; i++) {
      _sum += parseInt(tin.substring(i - 1, i), 10) * (11 - i);
    }

    remainder = _sum * 10 % 11;
    if (remainder === 10) remainder = 0;
    if (remainder !== parseInt(tin.substring(9, 10), 10)) return false;
    _sum = 0;

    for (var _i8 = 1; _i8 <= 10; _i8++) {
      _sum += parseInt(tin.substring(_i8 - 1, _i8), 10) * (12 - _i8);
    }

    remainder = _sum * 10 % 11;
    if (remainder === 10) remainder = 0;
    if (remainder !== parseInt(tin.substring(10, 11), 10)) return false;
    return true;
  }

  if ( // Reject know invalid CNPJs
  tin === '00000000000000' || tin === '11111111111111' || tin === '22222222222222' || tin === '33333333333333' || tin === '44444444444444' || tin === '55555555555555' || tin === '66666666666666' || tin === '77777777777777' || tin === '88888888888888' || tin === '99999999999999') {
    return false;
  }

  var length = tin.length - 2;
  var identifiers = tin.substring(0, length);
  var verificators = tin.substring(length);
  var sum = 0;
  var pos = length - 7;

  for (var _i9 = length; _i9 >= 1; _i9--) {
    sum += identifiers.charAt(length - _i9) * pos;
    pos -= 1;

    if (pos < 2) {
      pos = 9;
    }
  }

  var result = sum % 11 < 2 ? 0 : 11 - sum % 11;

  if (result !== parseInt(verificators.charAt(0), 10)) {
    return false;
  }

  length += 1;
  identifiers = tin.substring(0, length);
  sum = 0;
  pos = length - 7;

  for (var _i10 = length; _i10 >= 1; _i10--) {
    sum += identifiers.charAt(length - _i10) * pos;
    pos -= 1;

    if (pos < 2) {
      pos = 9;
    }
  }

  result = sum % 11 < 2 ? 0 : 11 - sum % 11;

  if (result !== parseInt(verificators.charAt(1), 10)) {
    return false;
  }

  return true;
}
/*
 * pt-PT validation function
 * (Número de identificação fiscal (NIF), persons/entities)
 * Verify TIN validity by calculating check (last) digit (variant of MOD 11)
 */


function ptPtCheck(tin) {
  var checksum = 11 - algorithms.reverseMultiplyAndSum(tin.split('').slice(0, 8).map(function (a) {
    return parseInt(a, 10);
  }), 9) % 11;

  if (checksum > 9) {
    return parseInt(tin[8], 10) === 0;
  }

  return checksum === parseInt(tin[8], 10);
}
/*
 * ro-RO validation function
 * (Cod Numeric Personal (CNP) or Cod de înregistrare fiscală (CIF),
 * persons only)
 * Verify CNP validity by calculating check (last) digit (test not found for CIF)
 * Material not in DG TAXUD document sourced from:
 * `https://en.wikipedia.org/wiki/National_identification_number#Romania`
 */


function roRoCheck(tin) {
  if (tin.slice(0, 4) !== '9000') {
    // No test found for this format
    // Extract full year using century digit if possible
    var full_year = tin.slice(1, 3);

    switch (tin[0]) {
      case '1':
      case '2':
        full_year = "19".concat(full_year);
        break;

      case '3':
      case '4':
        full_year = "18".concat(full_year);
        break;

      case '5':
      case '6':
        full_year = "20".concat(full_year);
        break;

      default:
    } // Check date validity


    var date = "".concat(full_year, "/").concat(tin.slice(3, 5), "/").concat(tin.slice(5, 7));

    if (date.length === 8) {
      if (!isDate(date, 'YY/MM/DD')) {
        return false;
      }
    } else if (!isDate(date, 'YYYY/MM/DD')) {
      return false;
    } // Calculate check digit


    var digits = tin.split('').map(function (a) {
      return parseInt(a, 10);
    });
    var multipliers = [2, 7, 9, 1, 4, 6, 3, 5, 8, 2, 7, 9];
    var checksum = 0;

    for (var i = 0; i < multipliers.length; i++) {
      checksum += digits[i] * multipliers[i];
    }

    if (checksum % 11 === 10) {
      return digits[12] === 1;
    }

    return digits[12] === checksum % 11;
  }

  return true;
}
/*
 * sk-SK validation function
 * (Rodné číslo (RČ) or bezvýznamové identifikačné číslo (BIČ), persons only)
 * Checks validity of pre-1954 birth numbers (rodné číslo) only
 * Due to the introduction of the pseudo-random BIČ it is not possible to test
 * post-1954 birth numbers without knowing whether they are BIČ or RČ beforehand
 */


function skSkCheck(tin) {
  if (tin.length === 9) {
    tin = tin.replace(/\W/, '');

    if (tin.slice(6) === '000') {
      return false;
    } // Three-zero serial not assigned before 1954
    // Extract full year from TIN length


    var full_year = parseInt(tin.slice(0, 2), 10);

    if (full_year > 53) {
      return false;
    }

    if (full_year < 10) {
      full_year = "190".concat(full_year);
    } else {
      full_year = "19".concat(full_year);
    } // Extract month from TIN and normalize


    var month = parseInt(tin.slice(2, 4), 10);

    if (month > 50) {
      month -= 50;
    }

    if (month < 10) {
      month = "0".concat(month);
    } // Check date validity


    var date = "".concat(full_year, "/").concat(month, "/").concat(tin.slice(4, 6));

    if (!isDate(date, 'YYYY/MM/DD')) {
      return false;
    }
  }

  return true;
}
/*
 * sl-SI validation function
 * (Davčna številka, persons/entities)
 * Verify TIN validity by calculating check (last) digit (variant of MOD 11)
 */


function slSiCheck(tin) {
  var checksum = 11 - algorithms.reverseMultiplyAndSum(tin.split('').slice(0, 7).map(function (a) {
    return parseInt(a, 10);
  }), 8) % 11;

  if (checksum === 10) {
    return parseInt(tin[7], 10) === 0;
  }

  return checksum === parseInt(tin[7], 10);
}
/*
 * sv-SE validation function
 * (Personnummer or samordningsnummer, persons only)
 * Checks validity of birth date and calls luhnCheck() to validate check (last) digit
 */


function svSeCheck(tin) {
  // Make copy of TIN and normalize to two-digit year form
  var tin_copy = tin.slice(0);

  if (tin.length > 11) {
    tin_copy = tin_copy.slice(2);
  } // Extract date of birth


  var full_year = '';
  var month = tin_copy.slice(2, 4);
  var day = parseInt(tin_copy.slice(4, 6), 10);

  if (tin.length > 11) {
    full_year = tin.slice(0, 4);
  } else {
    full_year = tin.slice(0, 2);

    if (tin.length === 11 && day < 60) {
      // Extract full year from centenarian symbol
      // Should work just fine until year 10000 or so
      var current_year = new Date().getFullYear().toString();
      var current_century = parseInt(current_year.slice(0, 2), 10);
      current_year = parseInt(current_year, 10);

      if (tin[6] === '-') {
        if (parseInt("".concat(current_century).concat(full_year), 10) > current_year) {
          full_year = "".concat(current_century - 1).concat(full_year);
        } else {
          full_year = "".concat(current_century).concat(full_year);
        }
      } else {
        full_year = "".concat(current_century - 1).concat(full_year);

        if (current_year - parseInt(full_year, 10) < 100) {
          return false;
        }
      }
    }
  } // Normalize day and check date validity


  if (day > 60) {
    day -= 60;
  }

  if (day < 10) {
    day = "0".concat(day);
  }

  var date = "".concat(full_year, "/").concat(month, "/").concat(day);

  if (date.length === 8) {
    if (!isDate(date, 'YY/MM/DD')) {
      return false;
    }
  } else if (!isDate(date, 'YYYY/MM/DD')) {
    return false;
  }

  return algorithms.luhnCheck(tin.replace(/\W/, ''));
} // Locale lookup objects

/*
 * Tax id regex formats for various locales
 *
 * Where not explicitly specified in DG-TAXUD document both
 * uppercase and lowercase letters are acceptable.
 */


var taxIdFormat = {
  'bg-BG': /^\d{10}$/,
  'cs-CZ': /^\d{6}\/{0,1}\d{3,4}$/,
  'de-AT': /^\d{9}$/,
  'de-DE': /^[1-9]\d{10}$/,
  'dk-DK': /^\d{6}-{0,1}\d{4}$/,
  'el-CY': /^[09]\d{7}[A-Z]$/,
  'el-GR': /^([0-4]|[7-9])\d{8}$/,
  'en-GB': /^\d{10}$|^(?!GB|NK|TN|ZZ)(?![DFIQUV])[A-Z](?![DFIQUVO])[A-Z]\d{6}[ABCD ]$/i,
  'en-IE': /^\d{7}[A-W][A-IW]{0,1}$/i,
  'en-US': /^\d{2}[- ]{0,1}\d{7}$/,
  'es-ES': /^(\d{0,8}|[XYZKLM]\d{7})[A-HJ-NP-TV-Z]$/i,
  'et-EE': /^[1-6]\d{6}(00[1-9]|0[1-9][0-9]|[1-6][0-9]{2}|70[0-9]|710)\d$/,
  'fi-FI': /^\d{6}[-+A]\d{3}[0-9A-FHJ-NPR-Y]$/i,
  'fr-BE': /^\d{11}$/,
  'fr-FR': /^[0-3]\d{12}$|^[0-3]\d\s\d{2}(\s\d{3}){3}$/,
  // Conforms both to official spec and provided example
  'fr-LU': /^\d{13}$/,
  'hr-HR': /^\d{11}$/,
  'hu-HU': /^8\d{9}$/,
  'it-IT': /^[A-Z]{6}[L-NP-V0-9]{2}[A-EHLMPRST][L-NP-V0-9]{2}[A-ILMZ][L-NP-V0-9]{3}[A-Z]$/i,
  'lv-LV': /^\d{6}-{0,1}\d{5}$/,
  // Conforms both to DG TAXUD spec and original research
  'mt-MT': /^\d{3,7}[APMGLHBZ]$|^([1-8])\1\d{7}$/i,
  'nl-NL': /^\d{9}$/,
  'pl-PL': /^\d{10,11}$/,
  'pt-BR': /(?:^\d{11}$)|(?:^\d{14}$)/,
  'pt-PT': /^\d{9}$/,
  'ro-RO': /^\d{13}$/,
  'sk-SK': /^\d{6}\/{0,1}\d{3,4}$/,
  'sl-SI': /^[1-9]\d{7}$/,
  'sv-SE': /^(\d{6}[-+]{0,1}\d{4}|(18|19|20)\d{6}[-+]{0,1}\d{4})$/
}; // taxIdFormat locale aliases

taxIdFormat['lb-LU'] = taxIdFormat['fr-LU'];
taxIdFormat['lt-LT'] = taxIdFormat['et-EE'];
taxIdFormat['nl-BE'] = taxIdFormat['fr-BE']; // Algorithmic tax id check functions for various locales

var taxIdCheck = {
  'bg-BG': bgBgCheck,
  'cs-CZ': csCzCheck,
  'de-AT': deAtCheck,
  'de-DE': deDeCheck,
  'dk-DK': dkDkCheck,
  'el-CY': elCyCheck,
  'el-GR': elGrCheck,
  'en-IE': enIeCheck,
  'en-US': enUsCheck,
  'es-ES': esEsCheck,
  'et-EE': etEeCheck,
  'fi-FI': fiFiCheck,
  'fr-BE': frBeCheck,
  'fr-FR': frFrCheck,
  'fr-LU': frLuCheck,
  'hr-HR': hrHrCheck,
  'hu-HU': huHuCheck,
  'it-IT': itItCheck,
  'lv-LV': lvLvCheck,
  'mt-MT': mtMtCheck,
  'nl-NL': nlNlCheck,
  'pl-PL': plPlCheck,
  'pt-BR': ptBrCheck,
  'pt-PT': ptPtCheck,
  'ro-RO': roRoCheck,
  'sk-SK': skSkCheck,
  'sl-SI': slSiCheck,
  'sv-SE': svSeCheck
}; // taxIdCheck locale aliases

taxIdCheck['lb-LU'] = taxIdCheck['fr-LU'];
taxIdCheck['lt-LT'] = taxIdCheck['et-EE'];
taxIdCheck['nl-BE'] = taxIdCheck['fr-BE']; // Regexes for locales where characters should be omitted before checking format

var allsymbols = /[-\\\/!@#$%\^&\*\(\)\+\=\[\]]+/g;
var sanitizeRegexes = {
  'de-AT': allsymbols,
  'de-DE': /[\/\\]/g,
  'fr-BE': allsymbols
}; // sanitizeRegexes locale aliases

sanitizeRegexes['nl-BE'] = sanitizeRegexes['fr-BE'];
/*
 * Validator function
 * Return true if the passed string is a valid tax identification number
 * for the specified locale.
 * Throw an error exception if the locale is not supported.
 */

export default function isTaxID(str) {
  var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en-US';
  assertString(str); // Copy TIN to avoid replacement if sanitized

  var strcopy = str.slice(0);

  if (locale in taxIdFormat) {
    if (locale in sanitizeRegexes) {
      strcopy = strcopy.replace(sanitizeRegexes[locale], '');
    }

    if (!taxIdFormat[locale].test(strcopy)) {
      return false;
    }

    if (locale in taxIdCheck) {
      return taxIdCheck[locale](strcopy);
    } // Fallthrough; not all locales have algorithmic checks


    return true;
  }

  throw new Error("Invalid locale '".concat(locale, "'"));
}function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }

function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }

function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }

function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

import assertString from './util/assertString';
import isFQDN from './isFQDN';
import isIP from './isIP';
import merge from './util/merge';
/*
options for isURL method

require_protocol - if set as true isURL will return false if protocol is not present in the URL
require_valid_protocol - isURL will check if the URL's protocol is present in the protocols option
protocols - valid protocols can be modified with this option
require_host - if set as false isURL will not check if host is present in the URL
require_port - if set as true isURL will check if port is present in the URL
allow_protocol_relative_urls - if set as true protocol relative URLs will be allowed
validate_length - if set as false isURL will skip string length validation (IE maximum is 2083)

*/

var default_url_options = {
  protocols: ['http', 'https', 'ftp'],
  require_tld: true,
  require_protocol: false,
  require_host: true,
  require_port: false,
  require_valid_protocol: true,
  allow_underscores: false,
  allow_trailing_dot: false,
  allow_protocol_relative_urls: false,
  allow_fragments: true,
  allow_query_components: true,
  validate_length: true
};
var wrapped_ipv6 = /^\[([^\]]+)\](?::([0-9]+))?$/;

function isRegExp(obj) {
  return Object.prototype.toString.call(obj) === '[object RegExp]';
}

function checkHost(host, matches) {
  for (var i = 0; i < matches.length; i++) {
    var match = matches[i];

    if (host === match || isRegExp(match) && match.test(host)) {
      return true;
    }
  }

  return false;
}

export default function isURL(url, options) {
  assertString(url);

  if (!url || /[\s<>]/.test(url)) {
    return false;
  }

  if (url.indexOf('mailto:') === 0) {
    return false;
  }

  options = merge(options, default_url_options);

  if (options.validate_length && url.length >= 2083) {
    return false;
  }

  if (!options.allow_fragments && url.includes('#')) {
    return false;
  }

  if (!options.allow_query_components && (url.includes('?') || url.includes('&'))) {
    return false;
  }

  var protocol, auth, host, hostname, port, port_str, split, ipv6;
  split = url.split('#');
  url = split.shift();
  split = url.split('?');
  url = split.shift();
  split = url.split('://');

  if (split.length > 1) {
    protocol = split.shift().toLowerCase();

    if (options.require_valid_protocol && options.protocols.indexOf(protocol) === -1) {
      return false;
    }
  } else if (options.require_protocol) {
    return false;
  } else if (url.substr(0, 2) === '//') {
    if (!options.allow_protocol_relative_urls) {
      return false;
    }

    split[0] = url.substr(2);
  }

  url = split.join('://');

  if (url === '') {
    return false;
  }

  split = url.split('/');
  url = split.shift();

  if (url === '' && !options.require_host) {
    return true;
  }

  split = url.split('@');

  if (split.length > 1) {
    if (options.disallow_auth) {
      return false;
    }

    if (split[0] === '') {
      return false;
    }

    auth = split.shift();

    if (auth.indexOf(':') >= 0 && auth.split(':').length > 2) {
      return false;
    }

    var _auth$split = auth.split(':'),
        _auth$split2 = _slicedToArray(_auth$split, 2),
        user = _auth$split2[0],
        password = _auth$split2[1];

    if (user === '' && password === '') {
      return false;
    }
  }

  hostname = split.join('@');
  port_str = null;
  ipv6 = null;
  var ipv6_match = hostname.match(wrapped_ipv6);

  if (ipv6_match) {
    host = '';
    ipv6 = ipv6_match[1];
    port_str = ipv6_match[2] || null;
  } else {
    split = hostname.split(':');
    host = split.shift();

    if (split.length) {
      port_str = split.join(':');
    }
  }

  if (port_str !== null && port_str.length > 0) {
    port = parseInt(port_str, 10);

    if (!/^[0-9]+$/.test(port_str) || port <= 0 || port > 65535) {
      return false;
    }
  } else if (options.require_port) {
    return false;
  }

  if (options.host_whitelist) {
    return checkHost(host, options.host_whitelist);
  }

  if (!isIP(host) && !isFQDN(host, options) && (!ipv6 || !isIP(ipv6, 6))) {
    return false;
  }

  host = host || ipv6;

  if (options.host_blacklist && checkHost(host, options.host_blacklist)) {
    return false;
  }

  return true;
}import assertString from './util/assertString';
var uuid = {
  1: /^[0-9A-F]{8}-[0-9A-F]{4}-1[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,
  2: /^[0-9A-F]{8}-[0-9A-F]{4}-2[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,
  3: /^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,
  4: /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,
  5: /^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,
  all: /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i
};
export default function isUUID(str, version) {
  assertString(str);
  var pattern = uuid[![undefined, null].includes(version) ? version : 'all'];
  return !!pattern && pattern.test(str);
}import assertString from './util/assertString';
export default function isUppercase(str) {
  assertString(str);
  return str === str.toUpperCase();
}import assertString from './util/assertString';
export var vatMatchers = {
  GB: /^GB((\d{3} \d{4} ([0-8][0-9]|9[0-6]))|(\d{9} \d{3})|(((GD[0-4])|(HA[5-9]))[0-9]{2}))$/,
  IT: /^(IT)?[0-9]{11}$/,
  NL: /^(NL)?[0-9]{9}B[0-9]{2}$/
};
export default function isVAT(str, countryCode) {
  assertString(str);
  assertString(countryCode);

  if (countryCode in vatMatchers) {
    return vatMatchers[countryCode].test(str);
  }

  throw new Error("Invalid country code: '".concat(countryCode, "'"));
}import assertString from './util/assertString';
import { fullWidth } from './isFullWidth';
import { halfWidth } from './isHalfWidth';
export default function isVariableWidth(str) {
  assertString(str);
  return fullWidth.test(str) && halfWidth.test(str);
}import assertString from './util/assertString';
export default function isWhitelisted(str, chars) {
  assertString(str);

  for (var i = str.length - 1; i >= 0; i--) {
    if (chars.indexOf(str[i]) === -1) {
      return false;
    }
  }

  return true;
}import assertString from './util/assertString';
export default function ltrim(str, chars) {
  assertString(str); // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping

  var pattern = chars ? new RegExp("^[".concat(chars.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), "]+"), 'g') : /^\s+/g;
  return str.replace(pattern, '');
}import assertString from './util/assertString';
export default function matches(str, pattern, modifiers) {
  assertString(str);

  if (Object.prototype.toString.call(pattern) !== '[object RegExp]') {
    pattern = new RegExp(pattern, modifiers);
  }

  return pattern.test(str);
}import merge from './util/merge';
var default_normalize_email_options = {
  // The following options apply to all email addresses
  // Lowercases the local part of the email address.
  // Please note this may violate RFC 5321 as per http://stackoverflow.com/a/9808332/192024).
  // The domain is always lowercased, as per RFC 1035
  all_lowercase: true,
  // The following conversions are specific to GMail
  // Lowercases the local part of the GMail address (known to be case-insensitive)
  gmail_lowercase: true,
  // Removes dots from the local part of the email address, as that's ignored by GMail
  gmail_remove_dots: true,
  // Removes the subaddress (e.g. "+foo") from the email address
  gmail_remove_subaddress: true,
  // Conversts the googlemail.com domain to gmail.com
  gmail_convert_googlemaildotcom: true,
  // The following conversions are specific to Outlook.com / Windows Live / Hotmail
  // Lowercases the local part of the Outlook.com address (known to be case-insensitive)
  outlookdotcom_lowercase: true,
  // Removes the subaddress (e.g. "+foo") from the email address
  outlookdotcom_remove_subaddress: true,
  // The following conversions are specific to Yahoo
  // Lowercases the local part of the Yahoo address (known to be case-insensitive)
  yahoo_lowercase: true,
  // Removes the subaddress (e.g. "-foo") from the email address
  yahoo_remove_subaddress: true,
  // The following conversions are specific to Yandex
  // Lowercases the local part of the Yandex address (known to be case-insensitive)
  yandex_lowercase: true,
  // The following conversions are specific to iCloud
  // Lowercases the local part of the iCloud address (known to be case-insensitive)
  icloud_lowercase: true,
  // Removes the subaddress (e.g. "+foo") from the email address
  icloud_remove_subaddress: true
}; // List of domains used by iCloud

var icloud_domains = ['icloud.com', 'me.com']; // List of domains used by Outlook.com and its predecessors
// This list is likely incomplete.
// Partial reference:
// https://blogs.office.com/2013/04/17/outlook-com-gets-two-step-verification-sign-in-by-alias-and-new-international-domains/

var outlookdotcom_domains = ['hotmail.at', 'hotmail.be', 'hotmail.ca', 'hotmail.cl', 'hotmail.co.il', 'hotmail.co.nz', 'hotmail.co.th', 'hotmail.co.uk', 'hotmail.com', 'hotmail.com.ar', 'hotmail.com.au', 'hotmail.com.br', 'hotmail.com.gr', 'hotmail.com.mx', 'hotmail.com.pe', 'hotmail.com.tr', 'hotmail.com.vn', 'hotmail.cz', 'hotmail.de', 'hotmail.dk', 'hotmail.es', 'hotmail.fr', 'hotmail.hu', 'hotmail.id', 'hotmail.ie', 'hotmail.in', 'hotmail.it', 'hotmail.jp', 'hotmail.kr', 'hotmail.lv', 'hotmail.my', 'hotmail.ph', 'hotmail.pt', 'hotmail.sa', 'hotmail.sg', 'hotmail.sk', 'live.be', 'live.co.uk', 'live.com', 'live.com.ar', 'live.com.mx', 'live.de', 'live.es', 'live.eu', 'live.fr', 'live.it', 'live.nl', 'msn.com', 'outlook.at', 'outlook.be', 'outlook.cl', 'outlook.co.il', 'outlook.co.nz', 'outlook.co.th', 'outlook.com', 'outlook.com.ar', 'outlook.com.au', 'outlook.com.br', 'outlook.com.gr', 'outlook.com.pe', 'outlook.com.tr', 'outlook.com.vn', 'outlook.cz', 'outlook.de', 'outlook.dk', 'outlook.es', 'outlook.fr', 'outlook.hu', 'outlook.id', 'outlook.ie', 'outlook.in', 'outlook.it', 'outlook.jp', 'outlook.kr', 'outlook.lv', 'outlook.my', 'outlook.ph', 'outlook.pt', 'outlook.sa', 'outlook.sg', 'outlook.sk', 'passport.com']; // List of domains used by Yahoo Mail
// This list is likely incomplete

var yahoo_domains = ['rocketmail.com', 'yahoo.ca', 'yahoo.co.uk', 'yahoo.com', 'yahoo.de', 'yahoo.fr', 'yahoo.in', 'yahoo.it', 'ymail.com']; // List of domains used by yandex.ru

var yandex_domains = ['yandex.ru', 'yandex.ua', 'yandex.kz', 'yandex.com', 'yandex.by', 'ya.ru']; // replace single dots, but not multiple consecutive dots

function dotsReplacer(match) {
  if (match.length > 1) {
    return match;
  }

  return '';
}

export default function normalizeEmail(email, options) {
  options = merge(options, default_normalize_email_options);
  var raw_parts = email.split('@');
  var domain = raw_parts.pop();
  var user = raw_parts.join('@');
  var parts = [user, domain]; // The domain is always lowercased, as it's case-insensitive per RFC 1035

  parts[1] = parts[1].toLowerCase();

  if (parts[1] === 'gmail.com' || parts[1] === 'googlemail.com') {
    // Address is GMail
    if (options.gmail_remove_subaddress) {
      parts[0] = parts[0].split('+')[0];
    }

    if (options.gmail_remove_dots) {
      // this does not replace consecutive dots like example..email@gmail.com
      parts[0] = parts[0].replace(/\.+/g, dotsReplacer);
    }

    if (!parts[0].length) {
      return false;
    }

    if (options.all_lowercase || options.gmail_lowercase) {
      parts[0] = parts[0].toLowerCase();
    }

    parts[1] = options.gmail_convert_googlemaildotcom ? 'gmail.com' : parts[1];
  } else if (icloud_domains.indexOf(parts[1]) >= 0) {
    // Address is iCloud
    if (options.icloud_remove_subaddress) {
      parts[0] = parts[0].split('+')[0];
    }

    if (!parts[0].length) {
      return false;
    }

    if (options.all_lowercase || options.icloud_lowercase) {
      parts[0] = parts[0].toLowerCase();
    }
  } else if (outlookdotcom_domains.indexOf(parts[1]) >= 0) {
    // Address is Outlook.com
    if (options.outlookdotcom_remove_subaddress) {
      parts[0] = parts[0].split('+')[0];
    }

    if (!parts[0].length) {
      return false;
    }

    if (options.all_lowercase || options.outlookdotcom_lowercase) {
      parts[0] = parts[0].toLowerCase();
    }
  } else if (yahoo_domains.indexOf(parts[1]) >= 0) {
    // Address is Yahoo
    if (options.yahoo_remove_subaddress) {
      var components = parts[0].split('-');
      parts[0] = components.length > 1 ? components.slice(0, -1).join('-') : components[0];
    }

    if (!parts[0].length) {
      return false;
    }

    if (options.all_lowercase || options.yahoo_lowercase) {
      parts[0] = parts[0].toLowerCase();
    }
  } else if (yandex_domains.indexOf(parts[1]) >= 0) {
    if (options.all_lowercase || options.yandex_lowercase) {
      parts[0] = parts[0].toLowerCase();
    }

    parts[1] = 'yandex.ru'; // all yandex domains are equal, 1st preferred
  } else if (options.all_lowercase) {
    // Any other address
    parts[0] = parts[0].toLowerCase();
  }

  return parts.join('@');
}import assertString from './util/assertString';
export default function rtrim(str, chars) {
  assertString(str);

  if (chars) {
    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping
    var pattern = new RegExp("[".concat(chars.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), "]+$"), 'g');
    return str.replace(pattern, '');
  } // Use a faster and more safe than regex trim method https://blog.stevenlevithan.com/archives/faster-trim-javascript


  var strIndex = str.length - 1;

  while (/\s/.test(str.charAt(strIndex))) {
    strIndex -= 1;
  }

  return str.slice(0, strIndex + 1);
}import assertString from './util/assertString';
import blacklist from './blacklist';
export default function stripLow(str, keep_new_lines) {
  assertString(str);
  var chars = keep_new_lines ? '\\x00-\\x09\\x0B\\x0C\\x0E-\\x1F\\x7F' : '\\x00-\\x1F\\x7F';
  return blacklist(str, chars);
}import assertString from './util/assertString';
export default function toBoolean(str, strict) {
  assertString(str);

  if (strict) {
    return str === '1' || /^true$/i.test(str);
  }

  return str !== '0' && !/^false$/i.test(str) && str !== '';
}import assertString from './util/assertString';
export default function toDate(date) {
  assertString(date);
  date = Date.parse(date);
  return !isNaN(date) ? new Date(date) : null;
}import isFloat from './isFloat';
export default function toFloat(str) {
  if (!isFloat(str)) return NaN;
  return parseFloat(str);
}import assertString from './util/assertString';
export default function toInt(str, radix) {
  assertString(str);
  return parseInt(str, radix || 10);
}import rtrim from './rtrim';
import ltrim from './ltrim';
export default function trim(str, chars) {
  return rtrim(ltrim(str, chars), chars);
}import assertString from './util/assertString';
export default function unescape(str) {
  assertString(str);
  return str.replace(/&quot;/g, '"').replace(/&#x27;/g, "'").replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&#x2F;/g, '/').replace(/&#x5C;/g, '\\').replace(/&#96;/g, '`').replace(/&amp;/g, '&'); // &amp; replacement has to be the last one to prevent
  // bugs with intermediate strings containing escape sequences
  // See: https://github.com/validatorjs/validator.js/issues/1827
}import assertString from './util/assertString';
export default function whitelist(str, chars) {
  assertString(str);
  return str.replace(new RegExp("[^".concat(chars, "]+"), 'g'), '');
}/**
 * Algorithmic validation functions
 * May be used as is or implemented in the workflow of other validators.
 */

/*
 * ISO 7064 validation function
 * Called with a string of numbers (incl. check digit)
 * to validate according to ISO 7064 (MOD 11, 10).
 */
export function iso7064Check(str) {
  var checkvalue = 10;

  for (var i = 0; i < str.length - 1; i++) {
    checkvalue = (parseInt(str[i], 10) + checkvalue) % 10 === 0 ? 10 * 2 % 11 : (parseInt(str[i], 10) + checkvalue) % 10 * 2 % 11;
  }

  checkvalue = checkvalue === 1 ? 0 : 11 - checkvalue;
  return checkvalue === parseInt(str[10], 10);
}
/*
 * Luhn (mod 10) validation function
 * Called with a string of numbers (incl. check digit)
 * to validate according to the Luhn algorithm.
 */

export function luhnCheck(str) {
  var checksum = 0;
  var second = false;

  for (var i = str.length - 1; i >= 0; i--) {
    if (second) {
      var product = parseInt(str[i], 10) * 2;

      if (product > 9) {
        // sum digits of product and add to checksum
        checksum += product.toString().split('').map(function (a) {
          return parseInt(a, 10);
        }).reduce(function (a, b) {
          return a + b;
        }, 0);
      } else {
        checksum += product;
      }
    } else {
      checksum += parseInt(str[i], 10);
    }

    second = !second;
  }

  return checksum % 10 === 0;
}
/*
 * Reverse TIN multiplication and summation helper function
 * Called with an array of single-digit integers and a base multiplier
 * to calculate the sum of the digits multiplied in reverse.
 * Normally used in variations of MOD 11 algorithmic checks.
 */

export function reverseMultiplyAndSum(digits, base) {
  var total = 0;

  for (var i = 0; i < digits.length; i++) {
    total += digits[i] * (base - i);
  }

  return total;
}
/*
 * Verhoeff validation helper function
 * Called with a string of numbers
 * to validate according to the Verhoeff algorithm.
 */

export function verhoeffCheck(str) {
  var d_table = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 0, 6, 7, 8, 9, 5], [2, 3, 4, 0, 1, 7, 8, 9, 5, 6], [3, 4, 0, 1, 2, 8, 9, 5, 6, 7], [4, 0, 1, 2, 3, 9, 5, 6, 7, 8], [5, 9, 8, 7, 6, 0, 4, 3, 2, 1], [6, 5, 9, 8, 7, 1, 0, 4, 3, 2], [7, 6, 5, 9, 8, 2, 1, 0, 4, 3], [8, 7, 6, 5, 9, 3, 2, 1, 0, 4], [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]];
  var p_table = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 5, 7, 6, 2, 8, 3, 0, 9, 4], [5, 8, 0, 3, 7, 9, 6, 1, 4, 2], [8, 9, 1, 6, 0, 4, 3, 5, 2, 7], [9, 4, 5, 3, 1, 2, 6, 8, 7, 0], [4, 2, 8, 6, 5, 7, 3, 9, 0, 1], [2, 7, 9, 3, 8, 0, 6, 4, 1, 5], [7, 0, 4, 6, 9, 1, 3, 2, 5, 8]]; // Copy (to prevent replacement) and reverse

  var str_copy = str.split('').reverse().join('');
  var checksum = 0;

  for (var i = 0; i < str_copy.length; i++) {
    checksum = d_table[checksum][p_table[i % 8][parseInt(str_copy[i], 10)]];
  }

  return checksum === 0;
}function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

export default function assertString(input) {
  var isString = typeof input === 'string' || input instanceof String;

  if (!isString) {
    var invalidType = _typeof(input);

    if (input === null) invalidType = 'null';else if (invalidType === 'object') invalidType = input.constructor.name;
    throw new TypeError("Expected a string but received a ".concat(invalidType));
  }
}var includes = function includes(arr, val) {
  return arr.some(function (arrVal) {
    return val === arrVal;
  });
};

export default includes;export default function merge() {
  var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  var defaults = arguments.length > 1 ? arguments[1] : undefined;

  for (var key in defaults) {
    if (typeof obj[key] === 'undefined') {
      obj[key] = defaults[key];
    }
  }

  return obj;
}/**
 * Build RegExp object from an array
 * of multiple/multi-line regexp parts
 *
 * @param {string[]} parts
 * @param {string} flags
 * @return {object} - RegExp object
 */
export default function multilineRegexp(parts, flags) {
  var regexpAsStringLiteral = parts.join('');
  return new RegExp(regexpAsStringLiteral, flags);
}function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

export default function toString(input) {
  if (_typeof(input) === 'object' && input !== null) {
    if (typeof input.toString === 'function') {
      input = input.toString();
    } else {
      input = '[object Object]';
    }
  } else if (input === null || typeof input === 'undefined' || isNaN(input) && !input.length) {
    input = '';
  }

  return String(input);
}/**
 * Better way to handle type checking
 * null, {}, array and date are objects, which confuses
 */
export default function typeOf(input) {
  var rawObject = Object.prototype.toString.call(input).toLowerCase();
  var typeOfRegex = /\[object (.*)]/g;
  var type = typeOfRegex.exec(rawObject)[1];
  return type;
}1.1.2 / 2017-09-23
==================

  * perf: improve header token parsing speed

1.1.1 / 2017-03-20
==================

  * perf: hoist regular expression

1.1.0 / 2015-09-29
==================

  * Only accept valid field names in the `field` argument
    - Ensures the resulting string is a valid HTTP header value

1.0.1 / 2015-07-08
==================

  * Fix setting empty header from empty `field`
  * perf: enable strict mode
  * perf: remove argument reassignments

1.0.0 / 2014-08-10
==================

  * Accept valid `Vary` header string as `field`
  * Add `vary.append` for low-level string manipulation
  * Move to `jshttp` orgainzation

0.1.0 / 2014-06-05
==================

  * Support array of fields to set

0.0.0 / 2014-06-04
==================

  * Initial release
(The MIT License)

Copyright (c) 2014-2017 Douglas Christopher Wilson

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.
/*!
 * vary
 * Copyright(c) 2014-2017 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module exports.
 */

module.exports = vary
module.exports.append = append

/**
 * RegExp to match field-name in RFC 7230 sec 3.2
 *
 * field-name    = token
 * token         = 1*tchar
 * tchar         = "!" / "#" / "$" / "%" / "&" / "'" / "*"
 *               / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~"
 *               / DIGIT / ALPHA
 *               ; any VCHAR, except delimiters
 */

var FIELD_NAME_REGEXP = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/

/**
 * Append a field to a vary header.
 *
 * @param {String} header
 * @param {String|Array} field
 * @return {String}
 * @public
 */

function append (header, field) {
  if (typeof header !== 'string') {
    throw new TypeError('header argument is required')
  }

  if (!field) {
    throw new TypeError('field argument is required')
  }

  // get fields array
  var fields = !Array.isArray(field)
    ? parse(String(field))
    : field

  // assert on invalid field names
  for (var j = 0; j < fields.length; j++) {
    if (!FIELD_NAME_REGEXP.test(fields[j])) {
      throw new TypeError('field argument contains an invalid header name')
    }
  }

  // existing, unspecified vary
  if (header === '*') {
    return header
  }

  // enumerate current values
  var val = header
  var vals = parse(header.toLowerCase())

  // unspecified vary
  if (fields.indexOf('*') !== -1 || vals.indexOf('*') !== -1) {
    return '*'
  }

  for (var i = 0; i < fields.length; i++) {
    var fld = fields[i].toLowerCase()

    // append value (case-preserving)
    if (vals.indexOf(fld) === -1) {
      vals.push(fld)
      val = val
        ? val + ', ' + fields[i]
        : fields[i]
    }
  }

  return val
}

/**
 * Parse a vary header into an array.
 *
 * @param {String} header
 * @return {Array}
 * @private
 */

function parse (header) {
  var end = 0
  var list = []
  var start = 0

  // gather tokens
  for (var i = 0, len = header.length; i < len; i++) {
    switch (header.charCodeAt(i)) {
      case 0x20: /*   */
        if (start === end) {
          start = end = i + 1
        }
        break
      case 0x2c: /* , */
        list.push(header.substring(start, end))
        start = end = i + 1
        break
      default:
        end = i + 1
        break
    }
  }

  // final token
  list.push(header.substring(start, end))

  return list
}

/**
 * Mark that a request is varied on a header field.
 *
 * @param {Object} res
 * @param {String|Array} field
 * @public
 */

function vary (res, field) {
  if (!res || !res.getHeader || !res.setHeader) {
    // quack quack
    throw new TypeError('res argument is required')
  }

  // get existing header
  var val = res.getHeader('Vary') || ''
  var header = Array.isArray(val)
    ? val.join(', ')
    : String(val)

  // set new header
  if ((val = append(header, field))) {
    res.setHeader('Vary', val)
  }
}
{
  "name": "vary",
  "description": "Manipulate the HTTP Vary header",
  "version": "1.1.2",
  "author": "Douglas Christopher Wilson <doug@somethingdoug.com>",
  "license": "MIT",
  "repository": "jshttp/vary",
  "devDependencies": {
    "beautify-benchmark": "0.2.4",
    "benchmark": "2.1.4",
    "eslint": "3.19.0",
    "eslint-config-standard": "10.2.1",
    "eslint-plugin-import": "2.7.0",
    "eslint-plugin-markdown": "1.0.0-beta.6",
    "eslint-plugin-node": "5.1.1",
    "eslint-plugin-promise": "3.5.0",
    "eslint-plugin-standard": "3.0.1",
    "istanbul": "0.4.5",
    "mocha": "2.5.3",
    "supertest": "1.1.0"
  },
  "files": [
    "HISTORY.md",
    "LICENSE",
    "README.md",
    "index.js"
  ],
  "engines": {
    "node": ">= 0.8"
  }
}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.
{
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me)",
  "name": "which",
  "description": "Like which(1) unix command. Find the first instance of an executable in the PATH.",
  "version": "2.0.2",
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/node-which.git"
  },
  "main": "which.js",
  "bin": {
    "node-which": "./bin/node-which"
  },
  "license": "ISC",
  "dependencies": {
    "isexe": "^2.0.0"
  },
  "devDependencies": {
    "mkdirp": "^0.5.0",
    "rimraf": "^2.6.2",
    "tap": "^14.6.9"
  },
  "files": [
    "which.js",
    "bin/node-which"
  ],
  "tap": {
    "check-coverage": true
  },
  "engines": {
    "node": ">= 8"
  }
}const isWindows = process.platform === 'win32' ||
    process.env.OSTYPE === 'cygwin' ||
    process.env.OSTYPE === 'msys'

const path = require('path')
const COLON = isWindows ? ';' : ':'
const isexe = require('isexe')

const getNotFoundError = (cmd) =>
  Object.assign(new Error(`not found: ${cmd}`), { code: 'ENOENT' })

const getPathInfo = (cmd, opt) => {
  const colon = opt.colon || COLON

  // If it has a slash, then we don't bother searching the pathenv.
  // just check the file itself, and that's it.
  const pathEnv = cmd.match(/\//) || isWindows && cmd.match(/\\/) ? ['']
    : (
      [
        // windows always checks the cwd first
        ...(isWindows ? [process.cwd()] : []),
        ...(opt.path || process.env.PATH ||
          /* istanbul ignore next: very unusual */ '').split(colon),
      ]
    )
  const pathExtExe = isWindows
    ? opt.pathExt || process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM'
    : ''
  const pathExt = isWindows ? pathExtExe.split(colon) : ['']

  if (isWindows) {
    if (cmd.indexOf('.') !== -1 && pathExt[0] !== '')
      pathExt.unshift('')
  }

  return {
    pathEnv,
    pathExt,
    pathExtExe,
  }
}

const which = (cmd, opt, cb) => {
  if (typeof opt === 'function') {
    cb = opt
    opt = {}
  }
  if (!opt)
    opt = {}

  const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt)
  const found = []

  const step = i => new Promise((resolve, reject) => {
    if (i === pathEnv.length)
      return opt.all && found.length ? resolve(found)
        : reject(getNotFoundError(cmd))

    const ppRaw = pathEnv[i]
    const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw

    const pCmd = path.join(pathPart, cmd)
    const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd
      : pCmd

    resolve(subStep(p, i, 0))
  })

  const subStep = (p, i, ii) => new Promise((resolve, reject) => {
    if (ii === pathExt.length)
      return resolve(step(i + 1))
    const ext = pathExt[ii]
    isexe(p + ext, { pathExt: pathExtExe }, (er, is) => {
      if (!er && is) {
        if (opt.all)
          found.push(p + ext)
        else
          return resolve(p + ext)
      }
      return resolve(subStep(p, i, ii + 1))
    })
  })

  return cb ? step(0).then(res => cb(null, res), cb) : step(0)
}

const whichSync = (cmd, opt) => {
  opt = opt || {}

  const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt)
  const found = []

  for (let i = 0; i < pathEnv.length; i ++) {
    const ppRaw = pathEnv[i]
    const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw

    const pCmd = path.join(pathPart, cmd)
    const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd
      : pCmd

    for (let j = 0; j < pathExt.length; j ++) {
      const cur = p + pathExt[j]
      try {
        const is = isexe.sync(cur, { pathExt: pathExtExe })
        if (is) {
          if (opt.all)
            found.push(cur)
          else
            return cur
        }
      } catch (ex) {}
    }
  }

  if (opt.all && found.length)
    return found

  if (opt.nothrow)
    return null

  throw getNotFoundError(cmd)
}

module.exports = which
which.sync = whichSync
#!/usr/bin/env node
var which = require("../")
if (process.argv.length < 3)
  usage()

function usage () {
  console.error('usage: which [-as] program ...')
  process.exit(1)
}

var all = false
var silent = false
var dashdash = false
var args = process.argv.slice(2).filter(function (arg) {
  if (dashdash || !/^-/.test(arg))
    return true

  if (arg === '--') {
    dashdash = true
    return false
  }

  var flags = arg.substr(1).split('')
  for (var f = 0; f < flags.length; f++) {
    var flag = flags[f]
    switch (flag) {
      case 's':
        silent = true
        break
      case 'a':
        all = true
        break
      default:
        console.error('which: illegal option -- ' + flag)
        usage()
    }
  }
  return false
})

process.exit(args.reduce(function (pv, current) {
  try {
    var f = which.sync(current, { all: all })
    if (all)
      f = f.join('\n')
    if (!silent)
      console.log(f)
    return pv;
  } catch (e) {
    return 1;
  }
}, 0))
root = true

[*]
indent_style = tab
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 150

[CHANGELOG.md]
indent_style = space
indent_size = 2

[*.json]
max_line_length = off

[Makefile]
max_line_length = off
coverage/
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"lines": 86,
	"statements": 85.93,
	"functions": 82.43,
	"branches": 76.06,
	"exclude": [
		"coverage",
		"test"
	]
}
MIT License

Copyright (c) 2019 Jordan Harband

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 isString = require('is-string');
var isNumber = require('is-number-object');
var isBoolean = require('is-boolean-object');
var isSymbol = require('is-symbol');
var isBigInt = require('is-bigint');

// eslint-disable-next-line consistent-return
module.exports = function whichBoxedPrimitive(value) {
	// eslint-disable-next-line eqeqeq
	if (value == null || (typeof value !== 'object' && typeof value !== 'function')) {
		return null;
	}
	if (isString(value)) {
		return 'String';
	}
	if (isNumber(value)) {
		return 'Number';
	}
	if (isBoolean(value)) {
		return 'Boolean';
	}
	if (isSymbol(value)) {
		return 'Symbol';
	}
	if (isBigInt(value)) {
		return 'BigInt';
	}
};
{
  "name": "which-boxed-primitive",
  "version": "1.0.2",
  "description": "Which kind of boxed JS primitive is this?",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/inspect-js/which-boxed-primitive.git"
  },
  "author": "Jordan Harband <ljharb@gmail.com>",
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "license": "MIT",
  "homepage": "https://github.com/inspect-js/which-boxed-primitive#readme",
  "dependencies": {
    "is-bigint": "^1.0.1",
    "is-boolean-object": "^1.1.0",
    "is-number-object": "^1.0.4",
    "is-string": "^1.0.5",
    "is-symbol": "^1.0.3"
  },
  "devDependencies": {
    "@ljharb/eslint-config": "^17.3.0",
    "aud": "^1.1.3",
    "auto-changelog": "^2.2.1",
    "eslint": "^7.15.0",
    "has-symbols": "^1.0.1",
    "in-publish": "^2.0.1",
    "nyc": "^10.3.2",
    "object-inspect": "^1.9.0",
    "safe-publish-latest": "^1.1.4",
    "tape": "^5.0.1"
  },
  "auto-changelog": {
    "output": "CHANGELOG.md",
    "template": "keepachangelog",
    "unreleased": false,
    "commitLimit": false,
    "backfillLimit": false,
    "hideCredit": true
  }
}# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/which-boxed-primitive
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
Copyright (c) 2015, Rebecca Turner <me@re-becca.org>

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.

'use strict'
var stringWidth = require('string-width')

exports.center = alignCenter
exports.left = alignLeft
exports.right = alignRight

// lodash's way of generating pad characters.

function createPadding (width) {
  var result = ''
  var string = ' '
  var n = width
  do {
    if (n % 2) {
      result += string;
    }
    n = Math.floor(n / 2);
    string += string;
  } while (n);

  return result;
}

function alignLeft (str, width) {
  var trimmed = str.trimRight()
  if (trimmed.length === 0 && str.length >= width) return str
  var padding = ''
  var strWidth = stringWidth(trimmed)

  if (strWidth < width) {
    padding = createPadding(width - strWidth)
  }

  return trimmed + padding
}

function alignRight (str, width) {
  var trimmed = str.trimLeft()
  if (trimmed.length === 0 && str.length >= width) return str
  var padding = ''
  var strWidth = stringWidth(trimmed)

  if (strWidth < width) {
    padding = createPadding(width - strWidth)
  }

  return padding + trimmed
}

function alignCenter (str, width) {
  var trimmed = str.trim()
  if (trimmed.length === 0 && str.length >= width) return str
  var padLeft = ''
  var padRight = ''
  var strWidth = stringWidth(trimmed)

  if (strWidth < width) {
    var padLeftBy = parseInt((width - strWidth) / 2, 10) 
    padLeft = createPadding(padLeftBy)
    padRight = createPadding(width - (strWidth + padLeftBy))
  }

  return padLeft + trimmed + padRight
}
{
  "name": "wide-align",
  "version": "1.1.5",
  "description": "A wide-character aware text alignment function for use on the console or with fixed width fonts.",
  "main": "align.js",
  "author": "Rebecca Turner <me@re-becca.org> (http://re-becca.org/)",
  "license": "ISC",
  "repository": {
    "type": "git",
    "url": "https://github.com/iarna/wide-align"
  },
  "//": "But not version 5 of string-width, as that's ESM only",
  "dependencies": {
    "string-width": "^1.0.2 || 2 || 3 || 4"
  },
  "devDependencies": {
    "tap": "*"
  },
  "files": [
    "align.js"
  ]
}The MIT License (MIT)

Copyright (c) 2013 Christian Schwarz

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": "wkx",
  "version": "0.5.0",
  "description": "A WKT/WKB/EWKT/EWKB/TWKB/GeoJSON parser and serializer",
  "main": "lib/wkx.js",
  "types": "lib/wkx.d.ts",
  "files": [
    "dist/",
    "lib/"
  ],
  "author": "Christian Schwarz",
  "license": "MIT",
  "devDependencies": {
    "async": "^3.2.0",
    "browserify": "^16.5.0",
    "coveralls": "^3.0.11",
    "deep-eql": "^4.0.0",
    "jshint": "^2.11.0",
    "json-stringify-pretty-compact": "^2.0.0",
    "mkdirp": "^1.0.3",
    "mocha": "^7.1.1",
    "nyc": "^15.0.0",
    "pg": "^7.18.2",
    "uglify-js": "^3.8.0"
  },
  "repository": {
    "type": "git",
    "url": "http://github.com/cschwarz/wkx.git"
  },
  "dependencies": {
    "@types/node": "*"
  }
}module.exports = BinaryReader;

function BinaryReader(buffer, isBigEndian) {
    this.buffer = buffer;
    this.position = 0;
    this.isBigEndian = isBigEndian || false;
}

function _read(readLE, readBE, size) {
    return function () {
        var value;

        if (this.isBigEndian)
            value = readBE.call(this.buffer, this.position);
        else
            value = readLE.call(this.buffer, this.position);

        this.position += size;

        return value;
    };
}

BinaryReader.prototype.readUInt8 = _read(Buffer.prototype.readUInt8, Buffer.prototype.readUInt8, 1);
BinaryReader.prototype.readUInt16 = _read(Buffer.prototype.readUInt16LE, Buffer.prototype.readUInt16BE, 2);
BinaryReader.prototype.readUInt32 = _read(Buffer.prototype.readUInt32LE, Buffer.prototype.readUInt32BE, 4);
BinaryReader.prototype.readInt8 = _read(Buffer.prototype.readInt8, Buffer.prototype.readInt8, 1);
BinaryReader.prototype.readInt16 = _read(Buffer.prototype.readInt16LE, Buffer.prototype.readInt16BE, 2);
BinaryReader.prototype.readInt32 = _read(Buffer.prototype.readInt32LE, Buffer.prototype.readInt32BE, 4);
BinaryReader.prototype.readFloat = _read(Buffer.prototype.readFloatLE, Buffer.prototype.readFloatBE, 4);
BinaryReader.prototype.readDouble = _read(Buffer.prototype.readDoubleLE, Buffer.prototype.readDoubleBE, 8);

BinaryReader.prototype.readVarInt = function () {
    var nextByte,
        result = 0,
        bytesRead = 0;

    do {
        nextByte = this.buffer[this.position + bytesRead];
        result += (nextByte & 0x7F) << (7 * bytesRead);
        bytesRead++;
    } while (nextByte >= 0x80);

    this.position += bytesRead;

    return result;
};
module.exports = BinaryWriter;

function BinaryWriter(size, allowResize) {
    this.buffer = new Buffer(size);
    this.position = 0;
    this.allowResize = allowResize;
}

function _write(write, size) {
    return function (value, noAssert) {
        this.ensureSize(size);

        write.call(this.buffer, value, this.position, noAssert);
        this.position += size;
    };
}

BinaryWriter.prototype.writeUInt8 = _write(Buffer.prototype.writeUInt8, 1);
BinaryWriter.prototype.writeUInt16LE = _write(Buffer.prototype.writeUInt16LE, 2);
BinaryWriter.prototype.writeUInt16BE = _write(Buffer.prototype.writeUInt16BE, 2);
BinaryWriter.prototype.writeUInt32LE = _write(Buffer.prototype.writeUInt32LE, 4);
BinaryWriter.prototype.writeUInt32BE = _write(Buffer.prototype.writeUInt32BE, 4);
BinaryWriter.prototype.writeInt8 = _write(Buffer.prototype.writeInt8, 1);
BinaryWriter.prototype.writeInt16LE = _write(Buffer.prototype.writeInt16LE, 2);
BinaryWriter.prototype.writeInt16BE = _write(Buffer.prototype.writeInt16BE, 2);
BinaryWriter.prototype.writeInt32LE = _write(Buffer.prototype.writeInt32LE, 4);
BinaryWriter.prototype.writeInt32BE = _write(Buffer.prototype.writeInt32BE, 4);
BinaryWriter.prototype.writeFloatLE = _write(Buffer.prototype.writeFloatLE, 4);
BinaryWriter.prototype.writeFloatBE = _write(Buffer.prototype.writeFloatBE, 4);
BinaryWriter.prototype.writeDoubleLE = _write(Buffer.prototype.writeDoubleLE, 8);
BinaryWriter.prototype.writeDoubleBE = _write(Buffer.prototype.writeDoubleBE, 8);

BinaryWriter.prototype.writeBuffer = function (buffer) {
    this.ensureSize(buffer.length);

    buffer.copy(this.buffer, this.position, 0, buffer.length);
    this.position += buffer.length;
};

BinaryWriter.prototype.writeVarInt = function (value) {
    var length = 1;

    while ((value & 0xFFFFFF80) !== 0) {
        this.writeUInt8((value & 0x7F) | 0x80);
        value >>>= 7;
        length++;
    }

    this.writeUInt8(value & 0x7F);

    return length;
};

BinaryWriter.prototype.ensureSize = function (size) {
    if (this.buffer.length < this.position + size) {
        if (this.allowResize) {
            var tempBuffer = new Buffer(this.position + size);
            this.buffer.copy(tempBuffer, 0, 0, this.buffer.length);
            this.buffer = tempBuffer;
        }
        else {
            throw new RangeError('index out of range');
        }
    }
};
module.exports = Geometry;

var Types = require('./types');
var Point = require('./point');
var LineString = require('./linestring');
var Polygon = require('./polygon');
var MultiPoint = require('./multipoint');
var MultiLineString = require('./multilinestring');
var MultiPolygon = require('./multipolygon');
var GeometryCollection = require('./geometrycollection');
var BinaryReader = require('./binaryreader');
var BinaryWriter = require('./binarywriter');
var WktParser = require('./wktparser');
var ZigZag = require('./zigzag.js');

function Geometry() {
    this.srid = undefined;
    this.hasZ = false;
    this.hasM = false;
}

Geometry.parse = function (value, options) {
    var valueType = typeof value;

    if (valueType === 'string' || value instanceof WktParser)
        return Geometry._parseWkt(value);
    else if (Buffer.isBuffer(value) || value instanceof BinaryReader)
        return Geometry._parseWkb(value, options);
    else
        throw new Error('first argument must be a string or Buffer');
};

Geometry._parseWkt = function (value) {
    var wktParser,
        srid;

    if (value instanceof WktParser)
        wktParser = value;
    else
        wktParser = new WktParser(value);

    var match = wktParser.matchRegex([/^SRID=(\d+);/]);
    if (match)
        srid = parseInt(match[1], 10);

    var geometryType = wktParser.matchType();
    var dimension = wktParser.matchDimension();

    var options = {
        srid: srid,
        hasZ: dimension.hasZ,
        hasM: dimension.hasM
    };

    switch (geometryType) {
        case Types.wkt.Point:
            return Point._parseWkt(wktParser, options);
        case Types.wkt.LineString:
            return LineString._parseWkt(wktParser, options);
        case Types.wkt.Polygon:
            return Polygon._parseWkt(wktParser, options);
        case Types.wkt.MultiPoint:
            return MultiPoint._parseWkt(wktParser, options);
        case Types.wkt.MultiLineString:
            return MultiLineString._parseWkt(wktParser, options);
        case Types.wkt.MultiPolygon:
            return MultiPolygon._parseWkt(wktParser, options);
        case Types.wkt.GeometryCollection:
            return GeometryCollection._parseWkt(wktParser, options);
    }
};

Geometry._parseWkb = function (value, parentOptions) {
    var binaryReader,
        wkbType,
        geometryType,
        options = {};

    if (value instanceof BinaryReader)
        binaryReader = value;
    else
        binaryReader = new BinaryReader(value);

    binaryReader.isBigEndian = !binaryReader.readInt8();

    wkbType = binaryReader.readUInt32();

    options.hasSrid = (wkbType & 0x20000000) === 0x20000000;
    options.isEwkb = (wkbType & 0x20000000) || (wkbType & 0x40000000) || (wkbType & 0x80000000);

    if (options.hasSrid)
        options.srid = binaryReader.readUInt32();

    options.hasZ = false;
    options.hasM = false;

    if (!options.isEwkb && (!parentOptions || !parentOptions.isEwkb)) {
        if (wkbType >= 1000 && wkbType < 2000) {
            options.hasZ = true;
            geometryType = wkbType - 1000;
        }
        else if (wkbType >= 2000 && wkbType < 3000) {
            options.hasM = true;
            geometryType = wkbType - 2000;
        }
        else if (wkbType >= 3000 && wkbType < 4000) {
            options.hasZ = true;
            options.hasM = true;
            geometryType = wkbType - 3000;
        }
        else {
            geometryType = wkbType;
        }
    }
    else {
        if (wkbType & 0x80000000)
            options.hasZ = true;
        if (wkbType & 0x40000000)
            options.hasM = true;

        geometryType = wkbType & 0xF;
    }

    switch (geometryType) {
        case Types.wkb.Point:
            return Point._parseWkb(binaryReader, options);
        case Types.wkb.LineString:
            return LineString._parseWkb(binaryReader, options);
        case Types.wkb.Polygon:
            return Polygon._parseWkb(binaryReader, options);
        case Types.wkb.MultiPoint:
            return MultiPoint._parseWkb(binaryReader, options);
        case Types.wkb.MultiLineString:
            return MultiLineString._parseWkb(binaryReader, options);
        case Types.wkb.MultiPolygon:
            return MultiPolygon._parseWkb(binaryReader, options);
        case Types.wkb.GeometryCollection:
            return GeometryCollection._parseWkb(binaryReader, options);
        default:
            throw new Error('GeometryType ' + geometryType + ' not supported');
    }
};

Geometry.parseTwkb = function (value) {
    var binaryReader,
        options = {};

    if (value instanceof BinaryReader)
        binaryReader = value;
    else
        binaryReader = new BinaryReader(value);

    var type = binaryReader.readUInt8();
    var metadataHeader = binaryReader.readUInt8();

    var geometryType = type & 0x0F;
    options.precision = ZigZag.decode(type >> 4);
    options.precisionFactor = Math.pow(10, options.precision);

    options.hasBoundingBox = metadataHeader >> 0 & 1;
    options.hasSizeAttribute = metadataHeader >> 1 & 1;
    options.hasIdList = metadataHeader >> 2 & 1;
    options.hasExtendedPrecision = metadataHeader >> 3 & 1;
    options.isEmpty = metadataHeader >> 4 & 1;

    if (options.hasExtendedPrecision) {
        var extendedPrecision = binaryReader.readUInt8();
        options.hasZ = (extendedPrecision & 0x01) === 0x01;
        options.hasM = (extendedPrecision & 0x02) === 0x02;

        options.zPrecision = ZigZag.decode((extendedPrecision & 0x1C) >> 2);
        options.zPrecisionFactor = Math.pow(10, options.zPrecision);

        options.mPrecision = ZigZag.decode((extendedPrecision & 0xE0) >> 5);
        options.mPrecisionFactor = Math.pow(10, options.mPrecision);
    }
    else {
        options.hasZ = false;
        options.hasM = false;
    }

    if (options.hasSizeAttribute)
        binaryReader.readVarInt();
    if (options.hasBoundingBox) {
        var dimensions = 2;

        if (options.hasZ)
            dimensions++;
        if (options.hasM)
            dimensions++;

        for (var i = 0; i < dimensions; i++) {
            binaryReader.readVarInt();
            binaryReader.readVarInt();
        }
    }

    switch (geometryType) {
        case Types.wkb.Point:
            return Point._parseTwkb(binaryReader, options);
        case Types.wkb.LineString:
            return LineString._parseTwkb(binaryReader, options);
        case Types.wkb.Polygon:
            return Polygon._parseTwkb(binaryReader, options);
        case Types.wkb.MultiPoint:
            return MultiPoint._parseTwkb(binaryReader, options);
        case Types.wkb.MultiLineString:
            return MultiLineString._parseTwkb(binaryReader, options);
        case Types.wkb.MultiPolygon:
            return MultiPolygon._parseTwkb(binaryReader, options);
        case Types.wkb.GeometryCollection:
            return GeometryCollection._parseTwkb(binaryReader, options);
        default:
            throw new Error('GeometryType ' + geometryType + ' not supported');
    }
};

Geometry.parseGeoJSON = function (value) {
    return Geometry._parseGeoJSON(value);
};

Geometry._parseGeoJSON = function (value, isSubGeometry) {
    var geometry;

    switch (value.type) {
        case Types.geoJSON.Point:
            geometry = Point._parseGeoJSON(value); break;
        case Types.geoJSON.LineString:
            geometry = LineString._parseGeoJSON(value); break;
        case Types.geoJSON.Polygon:
            geometry = Polygon._parseGeoJSON(value); break;
        case Types.geoJSON.MultiPoint:
            geometry = MultiPoint._parseGeoJSON(value); break;
        case Types.geoJSON.MultiLineString:
            geometry = MultiLineString._parseGeoJSON(value); break;
        case Types.geoJSON.MultiPolygon:
            geometry = MultiPolygon._parseGeoJSON(value); break;
        case Types.geoJSON.GeometryCollection:
            geometry = GeometryCollection._parseGeoJSON(value); break;
        default:
            throw new Error('GeometryType ' + value.type + ' not supported');
    }

    if (value.crs && value.crs.type && value.crs.type === 'name' && value.crs.properties && value.crs.properties.name) {
        var crs = value.crs.properties.name;

        if (crs.indexOf('EPSG:') === 0)
            geometry.srid = parseInt(crs.substring(5));
        else if (crs.indexOf('urn:ogc:def:crs:EPSG::') === 0)
            geometry.srid = parseInt(crs.substring(22));
        else
            throw new Error('Unsupported crs: ' + crs);
    }
    else if (!isSubGeometry) {
        geometry.srid = 4326;
    }

    return geometry;
};

Geometry.prototype.toEwkt = function () {
    return 'SRID=' + this.srid + ';' + this.toWkt();
};

Geometry.prototype.toEwkb = function () {
    var ewkb = new BinaryWriter(this._getWkbSize() + 4);
    var wkb = this.toWkb();

    ewkb.writeInt8(1);
    ewkb.writeUInt32LE((wkb.slice(1, 5).readUInt32LE(0) | 0x20000000) >>> 0, true);
    ewkb.writeUInt32LE(this.srid);

    ewkb.writeBuffer(wkb.slice(5));

    return ewkb.buffer;
};

Geometry.prototype._getWktType = function (wktType, isEmpty) {
    var wkt = wktType;

    if (this.hasZ && this.hasM)
        wkt += ' ZM ';
    else if (this.hasZ)
        wkt += ' Z ';
    else if (this.hasM)
        wkt += ' M ';

    if (isEmpty && !this.hasZ && !this.hasM)
        wkt += ' ';

    if (isEmpty)
        wkt += 'EMPTY';

    return wkt;
};

Geometry.prototype._getWktCoordinate = function (point) {
    var coordinates = point.x + ' ' + point.y;

    if (this.hasZ)
        coordinates += ' ' + point.z;
    if (this.hasM)
        coordinates += ' ' + point.m;

    return coordinates;
};

Geometry.prototype._writeWkbType = function (wkb, geometryType, parentOptions) {
    var dimensionType = 0;

    if (typeof this.srid === 'undefined' && (!parentOptions || typeof parentOptions.srid === 'undefined')) {
        if (this.hasZ && this.hasM)
            dimensionType += 3000;
        else if (this.hasZ)
            dimensionType += 1000;
        else if (this.hasM)
            dimensionType += 2000;
    }
    else {
        if (this.hasZ)
            dimensionType |= 0x80000000;
        if (this.hasM)
            dimensionType |= 0x40000000;
    }

    wkb.writeUInt32LE((dimensionType + geometryType) >>> 0, true);
};

Geometry.getTwkbPrecision = function (xyPrecision, zPrecision, mPrecision) {
    return {
        xy: xyPrecision,
        z: zPrecision,
        m: mPrecision,
        xyFactor: Math.pow(10, xyPrecision),
        zFactor: Math.pow(10, zPrecision),
        mFactor: Math.pow(10, mPrecision)
    };
};

Geometry.prototype._writeTwkbHeader = function (twkb, geometryType, precision, isEmpty) {
    var type = (ZigZag.encode(precision.xy) << 4) + geometryType;
    var metadataHeader = (this.hasZ || this.hasM) << 3;
    metadataHeader += isEmpty << 4;

    twkb.writeUInt8(type);
    twkb.writeUInt8(metadataHeader);

    if (this.hasZ || this.hasM) {
        var extendedPrecision = 0;
        if (this.hasZ)
            extendedPrecision |= 0x1;
        if (this.hasM)
            extendedPrecision |= 0x2;

        twkb.writeUInt8(extendedPrecision);
    }
};

Geometry.prototype.toGeoJSON = function (options) {
    var geoJSON = {};

    if (this.srid) {
        if (options) {
            if (options.shortCrs) {
                geoJSON.crs = {
                    type: 'name',
                    properties: {
                        name: 'EPSG:' + this.srid
                    }
                };
            }
            else if (options.longCrs) {
                geoJSON.crs = {
                    type: 'name',
                    properties: {
                        name: 'urn:ogc:def:crs:EPSG::' + this.srid
                    }
                };
            }
        }
    }

    return geoJSON;
};
module.exports = GeometryCollection;

var util = require('util');

var Types = require('./types');
var Geometry = require('./geometry');
var BinaryWriter = require('./binarywriter');

function GeometryCollection(geometries, srid) {
    Geometry.call(this);

    this.geometries = geometries || [];
	this.srid = srid;

    if (this.geometries.length > 0) {
        this.hasZ = this.geometries[0].hasZ;
        this.hasM = this.geometries[0].hasM;
    }
}

util.inherits(GeometryCollection, Geometry);

GeometryCollection.Z = function (geometries, srid) {
    var geometryCollection = new GeometryCollection(geometries, srid);
    geometryCollection.hasZ = true;
    return geometryCollection;
};

GeometryCollection.M = function (geometries, srid) {
    var geometryCollection = new GeometryCollection(geometries, srid);
    geometryCollection.hasM = true;
    return geometryCollection;
};

GeometryCollection.ZM = function (geometries, srid) {
    var geometryCollection = new GeometryCollection(geometries, srid);
    geometryCollection.hasZ = true;
    geometryCollection.hasM = true;
    return geometryCollection;
};

GeometryCollection._parseWkt = function (value, options) {
    var geometryCollection = new GeometryCollection();
    geometryCollection.srid = options.srid;
    geometryCollection.hasZ = options.hasZ;
    geometryCollection.hasM = options.hasM;

    if (value.isMatch(['EMPTY']))
        return geometryCollection;

    value.expectGroupStart();

    do {
        geometryCollection.geometries.push(Geometry.parse(value));
    } while (value.isMatch([',']));

    value.expectGroupEnd();

    return geometryCollection;
};

GeometryCollection._parseWkb = function (value, options) {
    var geometryCollection = new GeometryCollection();
    geometryCollection.srid = options.srid;
    geometryCollection.hasZ = options.hasZ;
    geometryCollection.hasM = options.hasM;

    var geometryCount = value.readUInt32();

    for (var i = 0; i < geometryCount; i++)
        geometryCollection.geometries.push(Geometry.parse(value, options));

    return geometryCollection;
};

GeometryCollection._parseTwkb = function (value, options) {
    var geometryCollection = new GeometryCollection();
    geometryCollection.hasZ = options.hasZ;
    geometryCollection.hasM = options.hasM;

    if (options.isEmpty)
        return geometryCollection;

    var geometryCount = value.readVarInt();

    for (var i = 0; i < geometryCount; i++)
        geometryCollection.geometries.push(Geometry.parseTwkb(value));

    return geometryCollection;
};

GeometryCollection._parseGeoJSON = function (value) {
    var geometryCollection = new GeometryCollection();

    for (var i = 0; i < value.geometries.length; i++)
        geometryCollection.geometries.push(Geometry._parseGeoJSON(value.geometries[i], true));

    if (geometryCollection.geometries.length > 0)
        geometryCollection.hasZ = geometryCollection.geometries[0].hasZ;

    return geometryCollection;
};

GeometryCollection.prototype.toWkt = function () {
    if (this.geometries.length === 0)
        return this._getWktType(Types.wkt.GeometryCollection, true);

    var wkt = this._getWktType(Types.wkt.GeometryCollection, false) + '(';

    for (var i = 0; i < this.geometries.length; i++)
        wkt += this.geometries[i].toWkt() + ',';

    wkt = wkt.slice(0, -1);
    wkt += ')';

    return wkt;
};

GeometryCollection.prototype.toWkb = function () {
    var wkb = new BinaryWriter(this._getWkbSize());

    wkb.writeInt8(1);

    this._writeWkbType(wkb, Types.wkb.GeometryCollection);
    wkb.writeUInt32LE(this.geometries.length);

    for (var i = 0; i < this.geometries.length; i++)
        wkb.writeBuffer(this.geometries[i].toWkb({ srid: this.srid }));

    return wkb.buffer;
};

GeometryCollection.prototype.toTwkb = function () {
    var twkb = new BinaryWriter(0, true);

    var precision = Geometry.getTwkbPrecision(5, 0, 0);
    var isEmpty = this.geometries.length === 0;

    this._writeTwkbHeader(twkb, Types.wkb.GeometryCollection, precision, isEmpty);

    if (this.geometries.length > 0) {
        twkb.writeVarInt(this.geometries.length);

        for (var i = 0; i < this.geometries.length; i++)
            twkb.writeBuffer(this.geometries[i].toTwkb());
    }

    return twkb.buffer;
};

GeometryCollection.prototype._getWkbSize = function () {
    var size = 1 + 4 + 4;

    for (var i = 0; i < this.geometries.length; i++)
        size += this.geometries[i]._getWkbSize();

    return size;
};

GeometryCollection.prototype.toGeoJSON = function (options) {
    var geoJSON = Geometry.prototype.toGeoJSON.call(this, options);
    geoJSON.type = Types.geoJSON.GeometryCollection;
    geoJSON.geometries = [];

    for (var i = 0; i < this.geometries.length; i++)
        geoJSON.geometries.push(this.geometries[i].toGeoJSON());

    return geoJSON;
};
module.exports = LineString;

var util = require('util');

var Geometry = require('./geometry');
var Types = require('./types');
var Point = require('./point');
var BinaryWriter = require('./binarywriter');

function LineString(points, srid) {
    Geometry.call(this);

    this.points = points || [];
	this.srid = srid;

    if (this.points.length > 0) {
        this.hasZ = this.points[0].hasZ;
        this.hasM = this.points[0].hasM;
    }
}

util.inherits(LineString, Geometry);

LineString.Z = function (points, srid) {
    var lineString = new LineString(points, srid);
    lineString.hasZ = true;
    return lineString;
};

LineString.M = function (points, srid) {
    var lineString = new LineString(points, srid);
    lineString.hasM = true;
    return lineString;
};

LineString.ZM = function (points, srid) {
    var lineString = new LineString(points, srid);
    lineString.hasZ = true;
    lineString.hasM = true;
    return lineString;
};

LineString._parseWkt = function (value, options) {
    var lineString = new LineString();
    lineString.srid = options.srid;
    lineString.hasZ = options.hasZ;
    lineString.hasM = options.hasM;

    if (value.isMatch(['EMPTY']))
        return lineString;

    value.expectGroupStart();
    lineString.points.push.apply(lineString.points, value.matchCoordinates(options));
    value.expectGroupEnd();

    return lineString;
};

LineString._parseWkb = function (value, options) {
    var lineString = new LineString();
    lineString.srid = options.srid;
    lineString.hasZ = options.hasZ;
    lineString.hasM = options.hasM;

    var pointCount = value.readUInt32();

    for (var i = 0; i < pointCount; i++)
        lineString.points.push(Point._readWkbPoint(value, options));

    return lineString;
};

LineString._parseTwkb = function (value, options) {
    var lineString = new LineString();
    lineString.hasZ = options.hasZ;
    lineString.hasM = options.hasM;

    if (options.isEmpty)
        return lineString;

    var previousPoint = new Point(0, 0, options.hasZ ? 0 : undefined, options.hasM ? 0 : undefined);
    var pointCount = value.readVarInt();

    for (var i = 0; i < pointCount; i++)
        lineString.points.push(Point._readTwkbPoint(value, options, previousPoint));

    return lineString;
};

LineString._parseGeoJSON = function (value) {
    var lineString = new LineString();

    if (value.coordinates.length > 0)
        lineString.hasZ = value.coordinates[0].length > 2;

    for (var i = 0; i < value.coordinates.length; i++)
        lineString.points.push(Point._readGeoJSONPoint(value.coordinates[i]));

    return lineString;
};

LineString.prototype.toWkt = function () {
    if (this.points.length === 0)
        return this._getWktType(Types.wkt.LineString, true);

    return this._getWktType(Types.wkt.LineString, false) + this._toInnerWkt();
};

LineString.prototype._toInnerWkt = function () {
    var innerWkt = '(';

    for (var i = 0; i < this.points.length; i++)
        innerWkt += this._getWktCoordinate(this.points[i]) + ',';

    innerWkt = innerWkt.slice(0, -1);
    innerWkt += ')';

    return innerWkt;
};

LineString.prototype.toWkb = function (parentOptions) {
    var wkb = new BinaryWriter(this._getWkbSize());

    wkb.writeInt8(1);

    this._writeWkbType(wkb, Types.wkb.LineString, parentOptions);
    wkb.writeUInt32LE(this.points.length);

    for (var i = 0; i < this.points.length; i++)
        this.points[i]._writeWkbPoint(wkb);

    return wkb.buffer;
};

LineString.prototype.toTwkb = function () {
    var twkb = new BinaryWriter(0, true);

    var precision = Geometry.getTwkbPrecision(5, 0, 0);
    var isEmpty = this.points.length === 0;

    this._writeTwkbHeader(twkb, Types.wkb.LineString, precision, isEmpty);

    if (this.points.length > 0) {
        twkb.writeVarInt(this.points.length);

        var previousPoint = new Point(0, 0, 0, 0);
        for (var i = 0; i < this.points.length; i++)
            this.points[i]._writeTwkbPoint(twkb, precision, previousPoint);
    }

    return twkb.buffer;
};

LineString.prototype._getWkbSize = function () {
    var coordinateSize = 16;

    if (this.hasZ)
        coordinateSize += 8;
    if (this.hasM)
        coordinateSize += 8;

    return 1 + 4 + 4 + (this.points.length * coordinateSize);
};

LineString.prototype.toGeoJSON = function (options) {
    var geoJSON = Geometry.prototype.toGeoJSON.call(this, options);
    geoJSON.type = Types.geoJSON.LineString;
    geoJSON.coordinates = [];

    for (var i = 0; i < this.points.length; i++) {
        if (this.hasZ)
            geoJSON.coordinates.push([this.points[i].x, this.points[i].y, this.points[i].z]);
        else
            geoJSON.coordinates.push([this.points[i].x, this.points[i].y]);
    }

    return geoJSON;
};
module.exports = MultiLineString;

var util = require('util');

var Types = require('./types');
var Geometry = require('./geometry');
var Point = require('./point');
var LineString = require('./linestring');
var BinaryWriter = require('./binarywriter');

function MultiLineString(lineStrings, srid) {
    Geometry.call(this);

    this.lineStrings = lineStrings || [];
	this.srid = srid;

    if (this.lineStrings.length > 0) {
        this.hasZ = this.lineStrings[0].hasZ;
        this.hasM = this.lineStrings[0].hasM;
    }
}

util.inherits(MultiLineString, Geometry);

MultiLineString.Z = function (lineStrings, srid) {
    var multiLineString = new MultiLineString(lineStrings, srid);
    multiLineString.hasZ = true;
    return multiLineString;
};

MultiLineString.M = function (lineStrings, srid) {
    var multiLineString = new MultiLineString(lineStrings, srid);
    multiLineString.hasM = true;
    return multiLineString;
};

MultiLineString.ZM = function (lineStrings, srid) {
    var multiLineString = new MultiLineString(lineStrings, srid);
    multiLineString.hasZ = true;
    multiLineString.hasM = true;
    return multiLineString;
};

MultiLineString._parseWkt = function (value, options) {
    var multiLineString = new MultiLineString();
    multiLineString.srid = options.srid;
    multiLineString.hasZ = options.hasZ;
    multiLineString.hasM = options.hasM;

    if (value.isMatch(['EMPTY']))
        return multiLineString;

    value.expectGroupStart();

    do {
        value.expectGroupStart();
        multiLineString.lineStrings.push(new LineString(value.matchCoordinates(options)));
        value.expectGroupEnd();
    } while (value.isMatch([',']));

    value.expectGroupEnd();

    return multiLineString;
};

MultiLineString._parseWkb = function (value, options) {
    var multiLineString = new MultiLineString();
    multiLineString.srid = options.srid;
    multiLineString.hasZ = options.hasZ;
    multiLineString.hasM = options.hasM;

    var lineStringCount = value.readUInt32();

    for (var i = 0; i < lineStringCount; i++)
        multiLineString.lineStrings.push(Geometry.parse(value, options));

    return multiLineString;
};

MultiLineString._parseTwkb = function (value, options) {
    var multiLineString = new MultiLineString();
    multiLineString.hasZ = options.hasZ;
    multiLineString.hasM = options.hasM;

    if (options.isEmpty)
        return multiLineString;

    var previousPoint = new Point(0, 0, options.hasZ ? 0 : undefined, options.hasM ? 0 : undefined);
    var lineStringCount = value.readVarInt();

    for (var i = 0; i < lineStringCount; i++) {
        var lineString = new LineString();
        lineString.hasZ = options.hasZ;
        lineString.hasM = options.hasM;

        var pointCount = value.readVarInt();

        for (var j = 0; j < pointCount; j++)
            lineString.points.push(Point._readTwkbPoint(value, options, previousPoint));

        multiLineString.lineStrings.push(lineString);
    }

    return multiLineString;
};

MultiLineString._parseGeoJSON = function (value) {
    var multiLineString = new MultiLineString();

    if (value.coordinates.length > 0 && value.coordinates[0].length > 0)
        multiLineString.hasZ = value.coordinates[0][0].length > 2;

    for (var i = 0; i < value.coordinates.length; i++)
        multiLineString.lineStrings.push(LineString._parseGeoJSON({ coordinates: value.coordinates[i] }));

    return multiLineString;
};

MultiLineString.prototype.toWkt = function () {
    if (this.lineStrings.length === 0)
        return this._getWktType(Types.wkt.MultiLineString, true);

    var wkt = this._getWktType(Types.wkt.MultiLineString, false) + '(';

    for (var i = 0; i < this.lineStrings.length; i++)
        wkt += this.lineStrings[i]._toInnerWkt() + ',';

    wkt = wkt.slice(0, -1);
    wkt += ')';

    return wkt;
};

MultiLineString.prototype.toWkb = function () {
    var wkb = new BinaryWriter(this._getWkbSize());

    wkb.writeInt8(1);

    this._writeWkbType(wkb, Types.wkb.MultiLineString);
    wkb.writeUInt32LE(this.lineStrings.length);

    for (var i = 0; i < this.lineStrings.length; i++)
        wkb.writeBuffer(this.lineStrings[i].toWkb({ srid: this.srid }));

    return wkb.buffer;
};

MultiLineString.prototype.toTwkb = function () {
    var twkb = new BinaryWriter(0, true);

    var precision = Geometry.getTwkbPrecision(5, 0, 0);
    var isEmpty = this.lineStrings.length === 0;

    this._writeTwkbHeader(twkb, Types.wkb.MultiLineString, precision, isEmpty);

    if (this.lineStrings.length > 0) {
        twkb.writeVarInt(this.lineStrings.length);

        var previousPoint = new Point(0, 0, 0, 0);
        for (var i = 0; i < this.lineStrings.length; i++) {
            twkb.writeVarInt(this.lineStrings[i].points.length);

            for (var j = 0; j < this.lineStrings[i].points.length; j++)
                this.lineStrings[i].points[j]._writeTwkbPoint(twkb, precision, previousPoint);
        }
    }

    return twkb.buffer;
};

MultiLineString.prototype._getWkbSize = function () {
    var size = 1 + 4 + 4;

    for (var i = 0; i < this.lineStrings.length; i++)
        size += this.lineStrings[i]._getWkbSize();

    return size;
};

MultiLineString.prototype.toGeoJSON = function (options) {
    var geoJSON = Geometry.prototype.toGeoJSON.call(this, options);
    geoJSON.type = Types.geoJSON.MultiLineString;
    geoJSON.coordinates = [];

    for (var i = 0; i < this.lineStrings.length; i++)
        geoJSON.coordinates.push(this.lineStrings[i].toGeoJSON().coordinates);

    return geoJSON;
};
module.exports = MultiPoint;

var util = require('util');

var Types = require('./types');
var Geometry = require('./geometry');
var Point = require('./point');
var BinaryWriter = require('./binarywriter');

function MultiPoint(points, srid) {
    Geometry.call(this);

    this.points = points || [];
	this.srid = srid;
	
    if (this.points.length > 0) {
        this.hasZ = this.points[0].hasZ;
        this.hasM = this.points[0].hasM;
    }
}

util.inherits(MultiPoint, Geometry);

MultiPoint.Z = function (points, srid) {
    var multiPoint = new MultiPoint(points, srid);
    multiPoint.hasZ = true;
    return multiPoint;
};

MultiPoint.M = function (points, srid) {
    var multiPoint = new MultiPoint(points, srid);
    multiPoint.hasM = true;
    return multiPoint;
};

MultiPoint.ZM = function (points, srid) {
    var multiPoint = new MultiPoint(points, srid);
    multiPoint.hasZ = true;
    multiPoint.hasM = true;
    return multiPoint;
};

MultiPoint._parseWkt = function (value, options) {
    var multiPoint = new MultiPoint();
    multiPoint.srid = options.srid;
    multiPoint.hasZ = options.hasZ;
    multiPoint.hasM = options.hasM;

    if (value.isMatch(['EMPTY']))
        return multiPoint;

    value.expectGroupStart();
    multiPoint.points.push.apply(multiPoint.points, value.matchCoordinates(options));
    value.expectGroupEnd();

    return multiPoint;
};

MultiPoint._parseWkb = function (value, options) {
    var multiPoint = new MultiPoint();
    multiPoint.srid = options.srid;
    multiPoint.hasZ = options.hasZ;
    multiPoint.hasM = options.hasM;

    var pointCount = value.readUInt32();

    for (var i = 0; i < pointCount; i++)
        multiPoint.points.push(Geometry.parse(value, options));

    return multiPoint;
};

MultiPoint._parseTwkb = function (value, options) {
    var multiPoint = new MultiPoint();
    multiPoint.hasZ = options.hasZ;
    multiPoint.hasM = options.hasM;

    if (options.isEmpty)
        return multiPoint;

    var previousPoint = new Point(0, 0, options.hasZ ? 0 : undefined, options.hasM ? 0 : undefined);
    var pointCount = value.readVarInt();

    for (var i = 0; i < pointCount; i++)
        multiPoint.points.push(Point._readTwkbPoint(value, options, previousPoint));

    return multiPoint;
};

MultiPoint._parseGeoJSON = function (value) {
    var multiPoint = new MultiPoint();

    if (value.coordinates.length > 0)
        multiPoint.hasZ = value.coordinates[0].length > 2;

    for (var i = 0; i < value.coordinates.length; i++)
        multiPoint.points.push(Point._parseGeoJSON({ coordinates: value.coordinates[i] }));

    return multiPoint;
};

MultiPoint.prototype.toWkt = function () {
    if (this.points.length === 0)
        return this._getWktType(Types.wkt.MultiPoint, true);

    var wkt = this._getWktType(Types.wkt.MultiPoint, false) + '(';

    for (var i = 0; i < this.points.length; i++)
        wkt += this._getWktCoordinate(this.points[i]) + ',';

    wkt = wkt.slice(0, -1);
    wkt += ')';

    return wkt;
};

MultiPoint.prototype.toWkb = function () {
    var wkb = new BinaryWriter(this._getWkbSize());

    wkb.writeInt8(1);

    this._writeWkbType(wkb, Types.wkb.MultiPoint);
    wkb.writeUInt32LE(this.points.length);

    for (var i = 0; i < this.points.length; i++)
        wkb.writeBuffer(this.points[i].toWkb({ srid: this.srid }));

    return wkb.buffer;
};

MultiPoint.prototype.toTwkb = function () {
    var twkb = new BinaryWriter(0, true);

    var precision = Geometry.getTwkbPrecision(5, 0, 0);
    var isEmpty = this.points.length === 0;

    this._writeTwkbHeader(twkb, Types.wkb.MultiPoint, precision, isEmpty);

    if (this.points.length > 0) {
        twkb.writeVarInt(this.points.length);

        var previousPoint = new Point(0, 0, 0, 0);
        for (var i = 0; i < this.points.length; i++)
            this.points[i]._writeTwkbPoint(twkb, precision, previousPoint);
    }

    return twkb.buffer;
};

MultiPoint.prototype._getWkbSize = function () {
    var coordinateSize = 16;

    if (this.hasZ)
        coordinateSize += 8;
    if (this.hasM)
        coordinateSize += 8;

    coordinateSize += 5;

    return 1 + 4 + 4 + (this.points.length * coordinateSize);
};

MultiPoint.prototype.toGeoJSON = function (options) {
    var geoJSON = Geometry.prototype.toGeoJSON.call(this, options);
    geoJSON.type = Types.geoJSON.MultiPoint;
    geoJSON.coordinates = [];

    for (var i = 0; i < this.points.length; i++)
        geoJSON.coordinates.push(this.points[i].toGeoJSON().coordinates);

    return geoJSON;
};
module.exports = MultiPolygon;

var util = require('util');

var Types = require('./types');
var Geometry = require('./geometry');
var Point = require('./point');
var Polygon = require('./polygon');
var BinaryWriter = require('./binarywriter');

function MultiPolygon(polygons, srid) {
    Geometry.call(this);

    this.polygons = polygons || [];
	this.srid = srid;

    if (this.polygons.length > 0) {
        this.hasZ = this.polygons[0].hasZ;
        this.hasM = this.polygons[0].hasM;
    }
}

util.inherits(MultiPolygon, Geometry);

MultiPolygon.Z = function (polygons, srid) {
    var multiPolygon = new MultiPolygon(polygons, srid);
    multiPolygon.hasZ = true;
    return multiPolygon;
};

MultiPolygon.M = function (polygons, srid) {
    var multiPolygon = new MultiPolygon(polygons, srid);
    multiPolygon.hasM = true;
    return multiPolygon;
};

MultiPolygon.ZM = function (polygons, srid) {
    var multiPolygon = new MultiPolygon(polygons, srid);
    multiPolygon.hasZ = true;
    multiPolygon.hasM = true;
    return multiPolygon;
};

MultiPolygon._parseWkt = function (value, options) {
    var multiPolygon = new MultiPolygon();
    multiPolygon.srid = options.srid;
    multiPolygon.hasZ = options.hasZ;
    multiPolygon.hasM = options.hasM;

    if (value.isMatch(['EMPTY']))
        return multiPolygon;

    value.expectGroupStart();

    do {
        value.expectGroupStart();

        var exteriorRing = [];
        var interiorRings = [];

        value.expectGroupStart();
        exteriorRing.push.apply(exteriorRing, value.matchCoordinates(options));
        value.expectGroupEnd();

        while (value.isMatch([','])) {
            value.expectGroupStart();
            interiorRings.push(value.matchCoordinates(options));
            value.expectGroupEnd();
        }

        multiPolygon.polygons.push(new Polygon(exteriorRing, interiorRings));

        value.expectGroupEnd();

    } while (value.isMatch([',']));

    value.expectGroupEnd();

    return multiPolygon;
};

MultiPolygon._parseWkb = function (value, options) {
    var multiPolygon = new MultiPolygon();
    multiPolygon.srid = options.srid;
    multiPolygon.hasZ = options.hasZ;
    multiPolygon.hasM = options.hasM;

    var polygonCount = value.readUInt32();

    for (var i = 0; i < polygonCount; i++)
        multiPolygon.polygons.push(Geometry.parse(value, options));

    return multiPolygon;
};

MultiPolygon._parseTwkb = function (value, options) {
    var multiPolygon = new MultiPolygon();
    multiPolygon.hasZ = options.hasZ;
    multiPolygon.hasM = options.hasM;

    if (options.isEmpty)
        return multiPolygon;

    var previousPoint = new Point(0, 0, options.hasZ ? 0 : undefined, options.hasM ? 0 : undefined);
    var polygonCount = value.readVarInt();

    for (var i = 0; i < polygonCount; i++) {
        var polygon = new Polygon();
        polygon.hasZ = options.hasZ;
        polygon.hasM = options.hasM;

        var ringCount = value.readVarInt();
        var exteriorRingCount = value.readVarInt();

        for (var j = 0; j < exteriorRingCount; j++)
            polygon.exteriorRing.push(Point._readTwkbPoint(value, options, previousPoint));

        for (j = 1; j < ringCount; j++) {
            var interiorRing = [];

            var interiorRingCount = value.readVarInt();

            for (var k = 0; k < interiorRingCount; k++)
                interiorRing.push(Point._readTwkbPoint(value, options, previousPoint));

            polygon.interiorRings.push(interiorRing);
        }

        multiPolygon.polygons.push(polygon);
    }

    return multiPolygon;
};

MultiPolygon._parseGeoJSON = function (value) {
    var multiPolygon = new MultiPolygon();

    if (value.coordinates.length > 0 && value.coordinates[0].length > 0 && value.coordinates[0][0].length > 0)
        multiPolygon.hasZ = value.coordinates[0][0][0].length > 2;

    for (var i = 0; i < value.coordinates.length; i++)
        multiPolygon.polygons.push(Polygon._parseGeoJSON({ coordinates: value.coordinates[i] }));

    return multiPolygon;
};

MultiPolygon.prototype.toWkt = function () {
    if (this.polygons.length === 0)
        return this._getWktType(Types.wkt.MultiPolygon, true);

    var wkt = this._getWktType(Types.wkt.MultiPolygon, false) + '(';

    for (var i = 0; i < this.polygons.length; i++)
        wkt += this.polygons[i]._toInnerWkt() + ',';

    wkt = wkt.slice(0, -1);
    wkt += ')';

    return wkt;
};

MultiPolygon.prototype.toWkb = function () {
    var wkb = new BinaryWriter(this._getWkbSize());

    wkb.writeInt8(1);

    this._writeWkbType(wkb, Types.wkb.MultiPolygon);
    wkb.writeUInt32LE(this.polygons.length);

    for (var i = 0; i < this.polygons.length; i++)
        wkb.writeBuffer(this.polygons[i].toWkb({ srid: this.srid }));

    return wkb.buffer;
};

MultiPolygon.prototype.toTwkb = function () {
    var twkb = new BinaryWriter(0, true);

    var precision = Geometry.getTwkbPrecision(5, 0, 0);
    var isEmpty = this.polygons.length === 0;

    this._writeTwkbHeader(twkb, Types.wkb.MultiPolygon, precision, isEmpty);

    if (this.polygons.length > 0) {
        twkb.writeVarInt(this.polygons.length);

        var previousPoint = new Point(0, 0, 0, 0);
        for (var i = 0; i < this.polygons.length; i++) {
            twkb.writeVarInt(1 + this.polygons[i].interiorRings.length);

            twkb.writeVarInt(this.polygons[i].exteriorRing.length);

            for (var j = 0; j < this.polygons[i].exteriorRing.length; j++)
                this.polygons[i].exteriorRing[j]._writeTwkbPoint(twkb, precision, previousPoint);

            for (j = 0; j < this.polygons[i].interiorRings.length; j++) {
                twkb.writeVarInt(this.polygons[i].interiorRings[j].length);

                for (var k = 0; k < this.polygons[i].interiorRings[j].length; k++)
                    this.polygons[i].interiorRings[j][k]._writeTwkbPoint(twkb, precision, previousPoint);
            }
        }
    }

    return twkb.buffer;
};

MultiPolygon.prototype._getWkbSize = function () {
    var size = 1 + 4 + 4;

    for (var i = 0; i < this.polygons.length; i++)
        size += this.polygons[i]._getWkbSize();

    return size;
};

MultiPolygon.prototype.toGeoJSON = function (options) {
    var geoJSON = Geometry.prototype.toGeoJSON.call(this, options);
    geoJSON.type = Types.geoJSON.MultiPolygon;
    geoJSON.coordinates = [];

    for (var i = 0; i < this.polygons.length; i++)
        geoJSON.coordinates.push(this.polygons[i].toGeoJSON().coordinates);

    return geoJSON;
};
module.exports = Point;

var util = require('util');

var Geometry = require('./geometry');
var Types = require('./types');
var BinaryWriter = require('./binarywriter');
var ZigZag = require('./zigzag.js');

function Point(x, y, z, m, srid) {
    Geometry.call(this);

    this.x = x;
    this.y = y;
    this.z = z;
    this.m = m;
	this.srid = srid;

    this.hasZ = typeof this.z !== 'undefined';
    this.hasM = typeof this.m !== 'undefined';
}

util.inherits(Point, Geometry);

Point.Z = function (x, y, z, srid) {
    var point = new Point(x, y, z, undefined, srid);
    point.hasZ = true;
    return point;
};

Point.M = function (x, y, m, srid) {
    var point = new Point(x, y, undefined, m, srid);
    point.hasM = true;
    return point;
};

Point.ZM = function (x, y, z, m, srid) {
    var point = new Point(x, y, z, m, srid);
    point.hasZ = true;
    point.hasM = true;
    return point;
};

Point._parseWkt = function (value, options) {
    var point = new Point();
    point.srid = options.srid;
    point.hasZ = options.hasZ;
    point.hasM = options.hasM;

    if (value.isMatch(['EMPTY']))
        return point;

    value.expectGroupStart();

    var coordinate = value.matchCoordinate(options);

    point.x = coordinate.x;
    point.y = coordinate.y;
    point.z = coordinate.z;
    point.m = coordinate.m;

    value.expectGroupEnd();

    return point;
};

Point._parseWkb = function (value, options) {
    var point = Point._readWkbPoint(value, options);
    point.srid = options.srid;
    return point;
};

Point._readWkbPoint = function (value, options) {
    return new Point(value.readDouble(), value.readDouble(),
        options.hasZ ? value.readDouble() : undefined,
        options.hasM ? value.readDouble() : undefined);
};

Point._parseTwkb = function (value, options) {
    var point = new Point();
    point.hasZ = options.hasZ;
    point.hasM = options.hasM;

    if (options.isEmpty)
        return point;

    point.x = ZigZag.decode(value.readVarInt()) / options.precisionFactor;
    point.y = ZigZag.decode(value.readVarInt()) / options.precisionFactor;
    point.z = options.hasZ ? ZigZag.decode(value.readVarInt()) / options.zPrecisionFactor : undefined;
    point.m = options.hasM ? ZigZag.decode(value.readVarInt()) / options.mPrecisionFactor : undefined;

    return point;
};

Point._readTwkbPoint = function (value, options, previousPoint) {
    previousPoint.x += ZigZag.decode(value.readVarInt()) / options.precisionFactor;
    previousPoint.y += ZigZag.decode(value.readVarInt()) / options.precisionFactor;

    if (options.hasZ)
        previousPoint.z += ZigZag.decode(value.readVarInt()) / options.zPrecisionFactor;
    if (options.hasM)
        previousPoint.m += ZigZag.decode(value.readVarInt()) / options.mPrecisionFactor;

    return new Point(previousPoint.x, previousPoint.y, previousPoint.z, previousPoint.m);
};

Point._parseGeoJSON = function (value) {
    return Point._readGeoJSONPoint(value.coordinates);
};

Point._readGeoJSONPoint = function (coordinates) {
    if (coordinates.length === 0)
        return new Point();

    if (coordinates.length > 2)
        return new Point(coordinates[0], coordinates[1], coordinates[2]);

    return new Point(coordinates[0], coordinates[1]);
};

Point.prototype.toWkt = function () {
    if (typeof this.x === 'undefined' && typeof this.y === 'undefined' &&
        typeof this.z === 'undefined' && typeof this.m === 'undefined')
        return this._getWktType(Types.wkt.Point, true);

    return this._getWktType(Types.wkt.Point, false) + '(' + this._getWktCoordinate(this) + ')';
};

Point.prototype.toWkb = function (parentOptions) {
    var wkb = new BinaryWriter(this._getWkbSize());

    wkb.writeInt8(1);
    this._writeWkbType(wkb, Types.wkb.Point, parentOptions);

    if (typeof this.x === 'undefined' && typeof this.y === 'undefined') {
        wkb.writeDoubleLE(NaN);
        wkb.writeDoubleLE(NaN);

        if (this.hasZ)
            wkb.writeDoubleLE(NaN);
        if (this.hasM)
            wkb.writeDoubleLE(NaN);
    }
    else {
        this._writeWkbPoint(wkb);
    }

    return wkb.buffer;
};

Point.prototype._writeWkbPoint = function (wkb) {
    wkb.writeDoubleLE(this.x);
    wkb.writeDoubleLE(this.y);

    if (this.hasZ)
        wkb.writeDoubleLE(this.z);
    if (this.hasM)
        wkb.writeDoubleLE(this.m);
};

Point.prototype.toTwkb = function () {
    var twkb = new BinaryWriter(0, true);

    var precision = Geometry.getTwkbPrecision(5, 0, 0);
    var isEmpty = typeof this.x === 'undefined' && typeof this.y === 'undefined';

    this._writeTwkbHeader(twkb, Types.wkb.Point, precision, isEmpty);

    if (!isEmpty)
        this._writeTwkbPoint(twkb, precision, new Point(0, 0, 0, 0));

    return twkb.buffer;
};

Point.prototype._writeTwkbPoint = function (twkb, precision, previousPoint) {
    var x = this.x * precision.xyFactor;
    var y = this.y * precision.xyFactor;
    var z = this.z * precision.zFactor;
    var m = this.m * precision.mFactor;

    twkb.writeVarInt(ZigZag.encode(x - previousPoint.x));
    twkb.writeVarInt(ZigZag.encode(y - previousPoint.y));
    if (this.hasZ)
        twkb.writeVarInt(ZigZag.encode(z - previousPoint.z));
    if (this.hasM)
        twkb.writeVarInt(ZigZag.encode(m - previousPoint.m));

    previousPoint.x = x;
    previousPoint.y = y;
    previousPoint.z = z;
    previousPoint.m = m;
};

Point.prototype._getWkbSize = function () {
    var size = 1 + 4 + 8 + 8;

    if (this.hasZ)
        size += 8;
    if (this.hasM)
        size += 8;

    return size;
};

Point.prototype.toGeoJSON = function (options) {
    var geoJSON = Geometry.prototype.toGeoJSON.call(this, options);
    geoJSON.type = Types.geoJSON.Point;

    if (typeof this.x === 'undefined' && typeof this.y === 'undefined')
        geoJSON.coordinates = [];
    else if (typeof this.z !== 'undefined')
        geoJSON.coordinates = [this.x, this.y, this.z];
    else
        geoJSON.coordinates = [this.x, this.y];

    return geoJSON;
};
module.exports = Polygon;

var util = require('util');

var Geometry = require('./geometry');
var Types = require('./types');
var Point = require('./point');
var BinaryWriter = require('./binarywriter');

function Polygon(exteriorRing, interiorRings, srid) {
    Geometry.call(this);

    this.exteriorRing = exteriorRing || [];
    this.interiorRings = interiorRings || [];
	this.srid = srid;

    if (this.exteriorRing.length > 0) {
        this.hasZ = this.exteriorRing[0].hasZ;
        this.hasM = this.exteriorRing[0].hasM;
    }
}

util.inherits(Polygon, Geometry);

Polygon.Z = function (exteriorRing, interiorRings, srid) {
    var polygon = new Polygon(exteriorRing, interiorRings, srid);
    polygon.hasZ = true;
    return polygon;
};

Polygon.M = function (exteriorRing, interiorRings, srid) {
    var polygon = new Polygon(exteriorRing, interiorRings, srid);
    polygon.hasM = true;
    return polygon;
};

Polygon.ZM = function (exteriorRing, interiorRings, srid) {
    var polygon = new Polygon(exteriorRing, interiorRings, srid);
    polygon.hasZ = true;
    polygon.hasM = true;
    return polygon;
};

Polygon._parseWkt = function (value, options) {
    var polygon = new Polygon();
    polygon.srid = options.srid;
    polygon.hasZ = options.hasZ;
    polygon.hasM = options.hasM;

    if (value.isMatch(['EMPTY']))
        return polygon;

    value.expectGroupStart();

    value.expectGroupStart();
    polygon.exteriorRing.push.apply(polygon.exteriorRing, value.matchCoordinates(options));
    value.expectGroupEnd();

    while (value.isMatch([','])) {
        value.expectGroupStart();
        polygon.interiorRings.push(value.matchCoordinates(options));
        value.expectGroupEnd();
    }

    value.expectGroupEnd();

    return polygon;
};

Polygon._parseWkb = function (value, options) {
    var polygon = new Polygon();
    polygon.srid = options.srid;
    polygon.hasZ = options.hasZ;
    polygon.hasM = options.hasM;

    var ringCount = value.readUInt32();

    if (ringCount > 0) {
        var exteriorRingCount = value.readUInt32();

        for (var i = 0; i < exteriorRingCount; i++)
            polygon.exteriorRing.push(Point._readWkbPoint(value, options));

        for (i = 1; i < ringCount; i++) {
            var interiorRing = [];

            var interiorRingCount = value.readUInt32();

            for (var j = 0; j < interiorRingCount; j++)
                interiorRing.push(Point._readWkbPoint(value, options));

            polygon.interiorRings.push(interiorRing);
        }
    }

    return polygon;
};

Polygon._parseTwkb = function (value, options) {
    var polygon = new Polygon();
    polygon.hasZ = options.hasZ;
    polygon.hasM = options.hasM;

    if (options.isEmpty)
        return polygon;

    var previousPoint = new Point(0, 0, options.hasZ ? 0 : undefined, options.hasM ? 0 : undefined);
    var ringCount = value.readVarInt();
    var exteriorRingCount = value.readVarInt();

    for (var i = 0; i < exteriorRingCount; i++)
        polygon.exteriorRing.push(Point._readTwkbPoint(value, options, previousPoint));

    for (i = 1; i < ringCount; i++) {
        var interiorRing = [];

        var interiorRingCount = value.readVarInt();

        for (var j = 0; j < interiorRingCount; j++)
            interiorRing.push(Point._readTwkbPoint(value, options, previousPoint));

        polygon.interiorRings.push(interiorRing);
    }

    return polygon;
};

Polygon._parseGeoJSON = function (value) {
    var polygon = new Polygon();

    if (value.coordinates.length > 0 && value.coordinates[0].length > 0)
        polygon.hasZ = value.coordinates[0][0].length > 2;

    for (var i = 0; i < value.coordinates.length; i++) {
        if (i > 0)
            polygon.interiorRings.push([]);

        for (var j = 0; j  < value.coordinates[i].length; j++) {
            if (i === 0)
                polygon.exteriorRing.push(Point._readGeoJSONPoint(value.coordinates[i][j]));
            else
                polygon.interiorRings[i - 1].push(Point._readGeoJSONPoint(value.coordinates[i][j]));
        }
    }

    return polygon;
};

Polygon.prototype.toWkt = function () {
    if (this.exteriorRing.length === 0)
        return this._getWktType(Types.wkt.Polygon, true);

    return this._getWktType(Types.wkt.Polygon, false) + this._toInnerWkt();
};

Polygon.prototype._toInnerWkt = function () {
    var innerWkt = '((';

    for (var i = 0; i < this.exteriorRing.length; i++)
        innerWkt += this._getWktCoordinate(this.exteriorRing[i]) + ',';

    innerWkt = innerWkt.slice(0, -1);
    innerWkt += ')';

    for (i = 0; i < this.interiorRings.length; i++) {
        innerWkt += ',(';

        for (var j = 0; j < this.interiorRings[i].length; j++) {
            innerWkt += this._getWktCoordinate(this.interiorRings[i][j]) + ',';
        }

        innerWkt = innerWkt.slice(0, -1);
        innerWkt += ')';
    }

    innerWkt += ')';

    return innerWkt;
};

Polygon.prototype.toWkb = function (parentOptions) {
    var wkb = new BinaryWriter(this._getWkbSize());

    wkb.writeInt8(1);

    this._writeWkbType(wkb, Types.wkb.Polygon, parentOptions);

    if (this.exteriorRing.length > 0) {
        wkb.writeUInt32LE(1 + this.interiorRings.length);
        wkb.writeUInt32LE(this.exteriorRing.length);
    }
    else {
        wkb.writeUInt32LE(0);
    }

    for (var i = 0; i < this.exteriorRing.length; i++)
        this.exteriorRing[i]._writeWkbPoint(wkb);

    for (i = 0; i < this.interiorRings.length; i++) {
        wkb.writeUInt32LE(this.interiorRings[i].length);

        for (var j = 0; j < this.interiorRings[i].length; j++)
            this.interiorRings[i][j]._writeWkbPoint(wkb);
    }

    return wkb.buffer;
};

Polygon.prototype.toTwkb = function () {
    var twkb = new BinaryWriter(0, true);

    var precision = Geometry.getTwkbPrecision(5, 0, 0);
    var isEmpty = this.exteriorRing.length === 0;

    this._writeTwkbHeader(twkb, Types.wkb.Polygon, precision, isEmpty);

    if (this.exteriorRing.length > 0) {
        twkb.writeVarInt(1 + this.interiorRings.length);

        twkb.writeVarInt(this.exteriorRing.length);

        var previousPoint = new Point(0, 0, 0, 0);
        for (var i = 0; i < this.exteriorRing.length; i++)
            this.exteriorRing[i]._writeTwkbPoint(twkb, precision, previousPoint);

        for (i = 0; i < this.interiorRings.length; i++) {
            twkb.writeVarInt(this.interiorRings[i].length);

            for (var j = 0; j < this.interiorRings[i].length; j++)
                this.interiorRings[i][j]._writeTwkbPoint(twkb, precision, previousPoint);
        }
    }

    return twkb.buffer;
};

Polygon.prototype._getWkbSize = function () {
    var coordinateSize = 16;

    if (this.hasZ)
        coordinateSize += 8;
    if (this.hasM)
        coordinateSize += 8;

    var size = 1 + 4 + 4;

    if (this.exteriorRing.length > 0)
        size += 4 + (this.exteriorRing.length * coordinateSize);

    for (var i = 0; i < this.interiorRings.length; i++)
        size += 4 + (this.interiorRings[i].length * coordinateSize);

    return size;
};

Polygon.prototype.toGeoJSON = function (options) {
    var geoJSON = Geometry.prototype.toGeoJSON.call(this, options);
    geoJSON.type = Types.geoJSON.Polygon;
    geoJSON.coordinates = [];

    if (this.exteriorRing.length > 0) {
        var exteriorRing = [];

        for (var i = 0; i < this.exteriorRing.length; i++) {
            if (this.hasZ)
                exteriorRing.push([this.exteriorRing[i].x, this.exteriorRing[i].y, this.exteriorRing[i].z]);
            else
                exteriorRing.push([this.exteriorRing[i].x, this.exteriorRing[i].y]);
        }

        geoJSON.coordinates.push(exteriorRing);
    }

    for (var j = 0; j < this.interiorRings.length; j++) {
        var interiorRing = [];

        for (var k = 0; k < this.interiorRings[j].length; k++) {
            if (this.hasZ)
                interiorRing.push([this.interiorRings[j][k].x, this.interiorRings[j][k].y, this.interiorRings[j][k].z]);
            else
                interiorRing.push([this.interiorRings[j][k].x, this.interiorRings[j][k].y]);
        }

        geoJSON.coordinates.push(interiorRing);
    }

    return geoJSON;
};
module.exports = {
    wkt: {
        Point: 'POINT',
        LineString: 'LINESTRING',
        Polygon: 'POLYGON',
        MultiPoint: 'MULTIPOINT',
        MultiLineString: 'MULTILINESTRING',
        MultiPolygon: 'MULTIPOLYGON',
        GeometryCollection: 'GEOMETRYCOLLECTION'
    },
    wkb: {
        Point: 1,
        LineString: 2,
        Polygon: 3,
        MultiPoint: 4,
        MultiLineString: 5,
        MultiPolygon: 6,
        GeometryCollection: 7
    },
    geoJSON: {
        Point: 'Point',
        LineString: 'LineString',
        Polygon: 'Polygon',
        MultiPoint: 'MultiPoint',
        MultiLineString: 'MultiLineString',
        MultiPolygon: 'MultiPolygon',
        GeometryCollection: 'GeometryCollection'
    }
};
module.exports = WktParser;

var Types = require('./types');
var Point = require('./point');

function WktParser(value) {
    this.value = value;
    this.position = 0;
}

WktParser.prototype.match = function (tokens) {
    this.skipWhitespaces();

    for (var i = 0; i < tokens.length; i++) {
        if (this.value.substring(this.position).indexOf(tokens[i]) === 0) {
            this.position += tokens[i].length;
            return tokens[i];
        }
    }

    return null;
};

WktParser.prototype.matchRegex = function (tokens) {
    this.skipWhitespaces();

    for (var i = 0; i < tokens.length; i++) {
        var match = this.value.substring(this.position).match(tokens[i]);

        if (match) {
            this.position += match[0].length;
            return match;
        }
    }

    return null;
};

WktParser.prototype.isMatch = function (tokens) {
    this.skipWhitespaces();

    for (var i = 0; i < tokens.length; i++) {
        if (this.value.substring(this.position).indexOf(tokens[i]) === 0) {
            this.position += tokens[i].length;
            return true;
        }
    }

    return false;
};

WktParser.prototype.matchType = function () {
    var geometryType = this.match([Types.wkt.Point, Types.wkt.LineString, Types.wkt.Polygon, Types.wkt.MultiPoint,
    Types.wkt.MultiLineString, Types.wkt.MultiPolygon, Types.wkt.GeometryCollection]);

    if (!geometryType)
        throw new Error('Expected geometry type');

    return geometryType;
};

WktParser.prototype.matchDimension = function () {
    var dimension = this.match(['ZM', 'Z', 'M']);

    switch (dimension) {
        case 'ZM': return { hasZ: true, hasM: true };
        case 'Z': return { hasZ: true, hasM: false };
        case 'M': return { hasZ: false, hasM: true };
        default: return { hasZ: false, hasM: false };
    }
};

WktParser.prototype.expectGroupStart = function () {
    if (!this.isMatch(['(']))
        throw new Error('Expected group start');
};

WktParser.prototype.expectGroupEnd = function () {
    if (!this.isMatch([')']))
        throw new Error('Expected group end');
};

WktParser.prototype.matchCoordinate = function (options) {
    var match;

    if (options.hasZ && options.hasM)
        match = this.matchRegex([/^(\S*)\s+(\S*)\s+(\S*)\s+([^\s,)]*)/]);
    else if (options.hasZ || options.hasM)
        match = this.matchRegex([/^(\S*)\s+(\S*)\s+([^\s,)]*)/]);
    else
        match = this.matchRegex([/^(\S*)\s+([^\s,)]*)/]);

    if (!match)
        throw new Error('Expected coordinates');

    if (options.hasZ && options.hasM)
        return new Point(parseFloat(match[1]), parseFloat(match[2]), parseFloat(match[3]), parseFloat(match[4]));
    else if (options.hasZ)
        return new Point(parseFloat(match[1]), parseFloat(match[2]), parseFloat(match[3]));
    else if (options.hasM)
        return new Point(parseFloat(match[1]), parseFloat(match[2]), undefined, parseFloat(match[3]));
    else
        return new Point(parseFloat(match[1]), parseFloat(match[2]));
};

WktParser.prototype.matchCoordinates = function (options) {
    var coordinates = [];

    do {
        var startsWithBracket = this.isMatch(['(']);

        coordinates.push(this.matchCoordinate(options));

        if (startsWithBracket)
            this.expectGroupEnd();
    } while (this.isMatch([',']));

    return coordinates;
};

WktParser.prototype.skipWhitespaces = function () {
    while (this.position < this.value.length && this.value[this.position] === ' ')
        this.position++;
};
exports.Types = require('./types');
exports.Geometry = require('./geometry');
exports.Point = require('./point');
exports.LineString = require('./linestring');
exports.Polygon = require('./polygon');
exports.MultiPoint = require('./multipoint');
exports.MultiLineString = require('./multilinestring');
exports.MultiPolygon = require('./multipolygon');
exports.GeometryCollection = require('./geometrycollection');module.exports = {
    encode: function (value) {
        return (value << 1) ^ (value >> 31);
    },
    decode: function (value) {
        return (value >> 1) ^ (-(value & 1));
    }
};
require=(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
(function (Buffer){
module.exports = BinaryReader;

function BinaryReader(buffer, isBigEndian) {
    this.buffer = buffer;
    this.position = 0;
    this.isBigEndian = isBigEndian || false;
}

function _read(readLE, readBE, size) {
    return function () {
        var value;

        if (this.isBigEndian)
            value = readBE.call(this.buffer, this.position);
        else
            value = readLE.call(this.buffer, this.position);

        this.position += size;

        return value;
    };
}

BinaryReader.prototype.readUInt8 = _read(Buffer.prototype.readUInt8, Buffer.prototype.readUInt8, 1);
BinaryReader.prototype.readUInt16 = _read(Buffer.prototype.readUInt16LE, Buffer.prototype.readUInt16BE, 2);
BinaryReader.prototype.readUInt32 = _read(Buffer.prototype.readUInt32LE, Buffer.prototype.readUInt32BE, 4);
BinaryReader.prototype.readInt8 = _read(Buffer.prototype.readInt8, Buffer.prototype.readInt8, 1);
BinaryReader.prototype.readInt16 = _read(Buffer.prototype.readInt16LE, Buffer.prototype.readInt16BE, 2);
BinaryReader.prototype.readInt32 = _read(Buffer.prototype.readInt32LE, Buffer.prototype.readInt32BE, 4);
BinaryReader.prototype.readFloat = _read(Buffer.prototype.readFloatLE, Buffer.prototype.readFloatBE, 4);
BinaryReader.prototype.readDouble = _read(Buffer.prototype.readDoubleLE, Buffer.prototype.readDoubleBE, 8);

BinaryReader.prototype.readVarInt = function () {
    var nextByte,
        result = 0,
        bytesRead = 0;

    do {
        nextByte = this.buffer[this.position + bytesRead];
        result += (nextByte & 0x7F) << (7 * bytesRead);
        bytesRead++;
    } while (nextByte >= 0x80);

    this.position += bytesRead;

    return result;
};

}).call(this,require("buffer").Buffer)
},{"buffer":"buffer"}],2:[function(require,module,exports){
(function (Buffer){
module.exports = BinaryWriter;

function BinaryWriter(size, allowResize) {
    this.buffer = new Buffer(size);
    this.position = 0;
    this.allowResize = allowResize;
}

function _write(write, size) {
    return function (value, noAssert) {
        this.ensureSize(size);

        write.call(this.buffer, value, this.position, noAssert);
        this.position += size;
    };
}

BinaryWriter.prototype.writeUInt8 = _write(Buffer.prototype.writeUInt8, 1);
BinaryWriter.prototype.writeUInt16LE = _write(Buffer.prototype.writeUInt16LE, 2);
BinaryWriter.prototype.writeUInt16BE = _write(Buffer.prototype.writeUInt16BE, 2);
BinaryWriter.prototype.writeUInt32LE = _write(Buffer.prototype.writeUInt32LE, 4);
BinaryWriter.prototype.writeUInt32BE = _write(Buffer.prototype.writeUInt32BE, 4);
BinaryWriter.prototype.writeInt8 = _write(Buffer.prototype.writeInt8, 1);
BinaryWriter.prototype.writeInt16LE = _write(Buffer.prototype.writeInt16LE, 2);
BinaryWriter.prototype.writeInt16BE = _write(Buffer.prototype.writeInt16BE, 2);
BinaryWriter.prototype.writeInt32LE = _write(Buffer.prototype.writeInt32LE, 4);
BinaryWriter.prototype.writeInt32BE = _write(Buffer.prototype.writeInt32BE, 4);
BinaryWriter.prototype.writeFloatLE = _write(Buffer.prototype.writeFloatLE, 4);
BinaryWriter.prototype.writeFloatBE = _write(Buffer.prototype.writeFloatBE, 4);
BinaryWriter.prototype.writeDoubleLE = _write(Buffer.prototype.writeDoubleLE, 8);
BinaryWriter.prototype.writeDoubleBE = _write(Buffer.prototype.writeDoubleBE, 8);

BinaryWriter.prototype.writeBuffer = function (buffer) {
    this.ensureSize(buffer.length);

    buffer.copy(this.buffer, this.position, 0, buffer.length);
    this.position += buffer.length;
};

BinaryWriter.prototype.writeVarInt = function (value) {
    var length = 1;

    while ((value & 0xFFFFFF80) !== 0) {
        this.writeUInt8((value & 0x7F) | 0x80);
        value >>>= 7;
        length++;
    }

    this.writeUInt8(value & 0x7F);

    return length;
};

BinaryWriter.prototype.ensureSize = function (size) {
    if (this.buffer.length < this.position + size) {
        if (this.allowResize) {
            var tempBuffer = new Buffer(this.position + size);
            this.buffer.copy(tempBuffer, 0, 0, this.buffer.length);
            this.buffer = tempBuffer;
        }
        else {
            throw new RangeError('index out of range');
        }
    }
};

}).call(this,require("buffer").Buffer)
},{"buffer":"buffer"}],3:[function(require,module,exports){
(function (Buffer){
module.exports = Geometry;

var Types = require('./types');
var Point = require('./point');
var LineString = require('./linestring');
var Polygon = require('./polygon');
var MultiPoint = require('./multipoint');
var MultiLineString = require('./multilinestring');
var MultiPolygon = require('./multipolygon');
var GeometryCollection = require('./geometrycollection');
var BinaryReader = require('./binaryreader');
var BinaryWriter = require('./binarywriter');
var WktParser = require('./wktparser');
var ZigZag = require('./zigzag.js');

function Geometry() {
    this.srid = undefined;
    this.hasZ = false;
    this.hasM = false;
}

Geometry.parse = function (value, options) {
    var valueType = typeof value;

    if (valueType === 'string' || value instanceof WktParser)
        return Geometry._parseWkt(value);
    else if (Buffer.isBuffer(value) || value instanceof BinaryReader)
        return Geometry._parseWkb(value, options);
    else
        throw new Error('first argument must be a string or Buffer');
};

Geometry._parseWkt = function (value) {
    var wktParser,
        srid;

    if (value instanceof WktParser)
        wktParser = value;
    else
        wktParser = new WktParser(value);

    var match = wktParser.matchRegex([/^SRID=(\d+);/]);
    if (match)
        srid = parseInt(match[1], 10);

    var geometryType = wktParser.matchType();
    var dimension = wktParser.matchDimension();

    var options = {
        srid: srid,
        hasZ: dimension.hasZ,
        hasM: dimension.hasM
    };

    switch (geometryType) {
        case Types.wkt.Point:
            return Point._parseWkt(wktParser, options);
        case Types.wkt.LineString:
            return LineString._parseWkt(wktParser, options);
        case Types.wkt.Polygon:
            return Polygon._parseWkt(wktParser, options);
        case Types.wkt.MultiPoint:
            return MultiPoint._parseWkt(wktParser, options);
        case Types.wkt.MultiLineString:
            return MultiLineString._parseWkt(wktParser, options);
        case Types.wkt.MultiPolygon:
            return MultiPolygon._parseWkt(wktParser, options);
        case Types.wkt.GeometryCollection:
            return GeometryCollection._parseWkt(wktParser, options);
    }
};

Geometry._parseWkb = function (value, parentOptions) {
    var binaryReader,
        wkbType,
        geometryType,
        options = {};

    if (value instanceof BinaryReader)
        binaryReader = value;
    else
        binaryReader = new BinaryReader(value);

    binaryReader.isBigEndian = !binaryReader.readInt8();

    wkbType = binaryReader.readUInt32();

    options.hasSrid = (wkbType & 0x20000000) === 0x20000000;
    options.isEwkb = (wkbType & 0x20000000) || (wkbType & 0x40000000) || (wkbType & 0x80000000);

    if (options.hasSrid)
        options.srid = binaryReader.readUInt32();

    options.hasZ = false;
    options.hasM = false;

    if (!options.isEwkb && (!parentOptions || !parentOptions.isEwkb)) {
        if (wkbType >= 1000 && wkbType < 2000) {
            options.hasZ = true;
            geometryType = wkbType - 1000;
        }
        else if (wkbType >= 2000 && wkbType < 3000) {
            options.hasM = true;
            geometryType = wkbType - 2000;
        }
        else if (wkbType >= 3000 && wkbType < 4000) {
            options.hasZ = true;
            options.hasM = true;
            geometryType = wkbType - 3000;
        }
        else {
            geometryType = wkbType;
        }
    }
    else {
        if (wkbType & 0x80000000)
            options.hasZ = true;
        if (wkbType & 0x40000000)
            options.hasM = true;

        geometryType = wkbType & 0xF;
    }

    switch (geometryType) {
        case Types.wkb.Point:
            return Point._parseWkb(binaryReader, options);
        case Types.wkb.LineString:
            return LineString._parseWkb(binaryReader, options);
        case Types.wkb.Polygon:
            return Polygon._parseWkb(binaryReader, options);
        case Types.wkb.MultiPoint:
            return MultiPoint._parseWkb(binaryReader, options);
        case Types.wkb.MultiLineString:
            return MultiLineString._parseWkb(binaryReader, options);
        case Types.wkb.MultiPolygon:
            return MultiPolygon._parseWkb(binaryReader, options);
        case Types.wkb.GeometryCollection:
            return GeometryCollection._parseWkb(binaryReader, options);
        default:
            throw new Error('GeometryType ' + geometryType + ' not supported');
    }
};

Geometry.parseTwkb = function (value) {
    var binaryReader,
        options = {};

    if (value instanceof BinaryReader)
        binaryReader = value;
    else
        binaryReader = new BinaryReader(value);

    var type = binaryReader.readUInt8();
    var metadataHeader = binaryReader.readUInt8();

    var geometryType = type & 0x0F;
    options.precision = ZigZag.decode(type >> 4);
    options.precisionFactor = Math.pow(10, options.precision);

    options.hasBoundingBox = metadataHeader >> 0 & 1;
    options.hasSizeAttribute = metadataHeader >> 1 & 1;
    options.hasIdList = metadataHeader >> 2 & 1;
    options.hasExtendedPrecision = metadataHeader >> 3 & 1;
    options.isEmpty = metadataHeader >> 4 & 1;

    if (options.hasExtendedPrecision) {
        var extendedPrecision = binaryReader.readUInt8();
        options.hasZ = (extendedPrecision & 0x01) === 0x01;
        options.hasM = (extendedPrecision & 0x02) === 0x02;

        options.zPrecision = ZigZag.decode((extendedPrecision & 0x1C) >> 2);
        options.zPrecisionFactor = Math.pow(10, options.zPrecision);

        options.mPrecision = ZigZag.decode((extendedPrecision & 0xE0) >> 5);
        options.mPrecisionFactor = Math.pow(10, options.mPrecision);
    }
    else {
        options.hasZ = false;
        options.hasM = false;
    }

    if (options.hasSizeAttribute)
        binaryReader.readVarInt();
    if (options.hasBoundingBox) {
        var dimensions = 2;

        if (options.hasZ)
            dimensions++;
        if (options.hasM)
            dimensions++;

        for (var i = 0; i < dimensions; i++) {
            binaryReader.readVarInt();
            binaryReader.readVarInt();
        }
    }

    switch (geometryType) {
        case Types.wkb.Point:
            return Point._parseTwkb(binaryReader, options);
        case Types.wkb.LineString:
            return LineString._parseTwkb(binaryReader, options);
        case Types.wkb.Polygon:
            return Polygon._parseTwkb(binaryReader, options);
        case Types.wkb.MultiPoint:
            return MultiPoint._parseTwkb(binaryReader, options);
        case Types.wkb.MultiLineString:
            return MultiLineString._parseTwkb(binaryReader, options);
        case Types.wkb.MultiPolygon:
            return MultiPolygon._parseTwkb(binaryReader, options);
        case Types.wkb.GeometryCollection:
            return GeometryCollection._parseTwkb(binaryReader, options);
        default:
            throw new Error('GeometryType ' + geometryType + ' not supported');
    }
};

Geometry.parseGeoJSON = function (value) {
    return Geometry._parseGeoJSON(value);
};

Geometry._parseGeoJSON = function (value, isSubGeometry) {
    var geometry;

    switch (value.type) {
        case Types.geoJSON.Point:
            geometry = Point._parseGeoJSON(value); break;
        case Types.geoJSON.LineString:
            geometry = LineString._parseGeoJSON(value); break;
        case Types.geoJSON.Polygon:
            geometry = Polygon._parseGeoJSON(value); break;
        case Types.geoJSON.MultiPoint:
            geometry = MultiPoint._parseGeoJSON(value); break;
        case Types.geoJSON.MultiLineString:
            geometry = MultiLineString._parseGeoJSON(value); break;
        case Types.geoJSON.MultiPolygon:
            geometry = MultiPolygon._parseGeoJSON(value); break;
        case Types.geoJSON.GeometryCollection:
            geometry = GeometryCollection._parseGeoJSON(value); break;
        default:
            throw new Error('GeometryType ' + value.type + ' not supported');
    }

    if (value.crs && value.crs.type && value.crs.type === 'name' && value.crs.properties && value.crs.properties.name) {
        var crs = value.crs.properties.name;

        if (crs.indexOf('EPSG:') === 0)
            geometry.srid = parseInt(crs.substring(5));
        else if (crs.indexOf('urn:ogc:def:crs:EPSG::') === 0)
            geometry.srid = parseInt(crs.substring(22));
        else
            throw new Error('Unsupported crs: ' + crs);
    }
    else if (!isSubGeometry) {
        geometry.srid = 4326;
    }

    return geometry;
};

Geometry.prototype.toEwkt = function () {
    return 'SRID=' + this.srid + ';' + this.toWkt();
};

Geometry.prototype.toEwkb = function () {
    var ewkb = new BinaryWriter(this._getWkbSize() + 4);
    var wkb = this.toWkb();

    ewkb.writeInt8(1);
    ewkb.writeUInt32LE((wkb.slice(1, 5).readUInt32LE(0) | 0x20000000) >>> 0, true);
    ewkb.writeUInt32LE(this.srid);

    ewkb.writeBuffer(wkb.slice(5));

    return ewkb.buffer;
};

Geometry.prototype._getWktType = function (wktType, isEmpty) {
    var wkt = wktType;

    if (this.hasZ && this.hasM)
        wkt += ' ZM ';
    else if (this.hasZ)
        wkt += ' Z ';
    else if (this.hasM)
        wkt += ' M ';

    if (isEmpty && !this.hasZ && !this.hasM)
        wkt += ' ';

    if (isEmpty)
        wkt += 'EMPTY';

    return wkt;
};

Geometry.prototype._getWktCoordinate = function (point) {
    var coordinates = point.x + ' ' + point.y;

    if (this.hasZ)
        coordinates += ' ' + point.z;
    if (this.hasM)
        coordinates += ' ' + point.m;

    return coordinates;
};

Geometry.prototype._writeWkbType = function (wkb, geometryType, parentOptions) {
    var dimensionType = 0;

    if (typeof this.srid === 'undefined' && (!parentOptions || typeof parentOptions.srid === 'undefined')) {
        if (this.hasZ && this.hasM)
            dimensionType += 3000;
        else if (this.hasZ)
            dimensionType += 1000;
        else if (this.hasM)
            dimensionType += 2000;
    }
    else {
        if (this.hasZ)
            dimensionType |= 0x80000000;
        if (this.hasM)
            dimensionType |= 0x40000000;
    }

    wkb.writeUInt32LE((dimensionType + geometryType) >>> 0, true);
};

Geometry.getTwkbPrecision = function (xyPrecision, zPrecision, mPrecision) {
    return {
        xy: xyPrecision,
        z: zPrecision,
        m: mPrecision,
        xyFactor: Math.pow(10, xyPrecision),
        zFactor: Math.pow(10, zPrecision),
        mFactor: Math.pow(10, mPrecision)
    };
};

Geometry.prototype._writeTwkbHeader = function (twkb, geometryType, precision, isEmpty) {
    var type = (ZigZag.encode(precision.xy) << 4) + geometryType;
    var metadataHeader = (this.hasZ || this.hasM) << 3;
    metadataHeader += isEmpty << 4;

    twkb.writeUInt8(type);
    twkb.writeUInt8(metadataHeader);

    if (this.hasZ || this.hasM) {
        var extendedPrecision = 0;
        if (this.hasZ)
            extendedPrecision |= 0x1;
        if (this.hasM)
            extendedPrecision |= 0x2;

        twkb.writeUInt8(extendedPrecision);
    }
};

Geometry.prototype.toGeoJSON = function (options) {
    var geoJSON = {};

    if (this.srid) {
        if (options) {
            if (options.shortCrs) {
                geoJSON.crs = {
                    type: 'name',
                    properties: {
                        name: 'EPSG:' + this.srid
                    }
                };
            }
            else if (options.longCrs) {
                geoJSON.crs = {
                    type: 'name',
                    properties: {
                        name: 'urn:ogc:def:crs:EPSG::' + this.srid
                    }
                };
            }
        }
    }

    return geoJSON;
};

}).call(this,{"isBuffer":require("../node_modules/is-buffer/index.js")})
},{"../node_modules/is-buffer/index.js":17,"./binaryreader":1,"./binarywriter":2,"./geometrycollection":4,"./linestring":5,"./multilinestring":6,"./multipoint":7,"./multipolygon":8,"./point":9,"./polygon":10,"./types":11,"./wktparser":12,"./zigzag.js":13}],4:[function(require,module,exports){
module.exports = GeometryCollection;

var util = require('util');

var Types = require('./types');
var Geometry = require('./geometry');
var BinaryWriter = require('./binarywriter');

function GeometryCollection(geometries, srid) {
    Geometry.call(this);

    this.geometries = geometries || [];
	this.srid = srid;

    if (this.geometries.length > 0) {
        this.hasZ = this.geometries[0].hasZ;
        this.hasM = this.geometries[0].hasM;
    }
}

util.inherits(GeometryCollection, Geometry);

GeometryCollection.Z = function (geometries, srid) {
    var geometryCollection = new GeometryCollection(geometries, srid);
    geometryCollection.hasZ = true;
    return geometryCollection;
};

GeometryCollection.M = function (geometries, srid) {
    var geometryCollection = new GeometryCollection(geometries, srid);
    geometryCollection.hasM = true;
    return geometryCollection;
};

GeometryCollection.ZM = function (geometries, srid) {
    var geometryCollection = new GeometryCollection(geometries, srid);
    geometryCollection.hasZ = true;
    geometryCollection.hasM = true;
    return geometryCollection;
};

GeometryCollection._parseWkt = function (value, options) {
    var geometryCollection = new GeometryCollection();
    geometryCollection.srid = options.srid;
    geometryCollection.hasZ = options.hasZ;
    geometryCollection.hasM = options.hasM;

    if (value.isMatch(['EMPTY']))
        return geometryCollection;

    value.expectGroupStart();

    do {
        geometryCollection.geometries.push(Geometry.parse(value));
    } while (value.isMatch([',']));

    value.expectGroupEnd();

    return geometryCollection;
};

GeometryCollection._parseWkb = function (value, options) {
    var geometryCollection = new GeometryCollection();
    geometryCollection.srid = options.srid;
    geometryCollection.hasZ = options.hasZ;
    geometryCollection.hasM = options.hasM;

    var geometryCount = value.readUInt32();

    for (var i = 0; i < geometryCount; i++)
        geometryCollection.geometries.push(Geometry.parse(value, options));

    return geometryCollection;
};

GeometryCollection._parseTwkb = function (value, options) {
    var geometryCollection = new GeometryCollection();
    geometryCollection.hasZ = options.hasZ;
    geometryCollection.hasM = options.hasM;

    if (options.isEmpty)
        return geometryCollection;

    var geometryCount = value.readVarInt();

    for (var i = 0; i < geometryCount; i++)
        geometryCollection.geometries.push(Geometry.parseTwkb(value));

    return geometryCollection;
};

GeometryCollection._parseGeoJSON = function (value) {
    var geometryCollection = new GeometryCollection();

    for (var i = 0; i < value.geometries.length; i++)
        geometryCollection.geometries.push(Geometry._parseGeoJSON(value.geometries[i], true));

    if (geometryCollection.geometries.length > 0)
        geometryCollection.hasZ = geometryCollection.geometries[0].hasZ;

    return geometryCollection;
};

GeometryCollection.prototype.toWkt = function () {
    if (this.geometries.length === 0)
        return this._getWktType(Types.wkt.GeometryCollection, true);

    var wkt = this._getWktType(Types.wkt.GeometryCollection, false) + '(';

    for (var i = 0; i < this.geometries.length; i++)
        wkt += this.geometries[i].toWkt() + ',';

    wkt = wkt.slice(0, -1);
    wkt += ')';

    return wkt;
};

GeometryCollection.prototype.toWkb = function () {
    var wkb = new BinaryWriter(this._getWkbSize());

    wkb.writeInt8(1);

    this._writeWkbType(wkb, Types.wkb.GeometryCollection);
    wkb.writeUInt32LE(this.geometries.length);

    for (var i = 0; i < this.geometries.length; i++)
        wkb.writeBuffer(this.geometries[i].toWkb({ srid: this.srid }));

    return wkb.buffer;
};

GeometryCollection.prototype.toTwkb = function () {
    var twkb = new BinaryWriter(0, true);

    var precision = Geometry.getTwkbPrecision(5, 0, 0);
    var isEmpty = this.geometries.length === 0;

    this._writeTwkbHeader(twkb, Types.wkb.GeometryCollection, precision, isEmpty);

    if (this.geometries.length > 0) {
        twkb.writeVarInt(this.geometries.length);

        for (var i = 0; i < this.geometries.length; i++)
            twkb.writeBuffer(this.geometries[i].toTwkb());
    }

    return twkb.buffer;
};

GeometryCollection.prototype._getWkbSize = function () {
    var size = 1 + 4 + 4;

    for (var i = 0; i < this.geometries.length; i++)
        size += this.geometries[i]._getWkbSize();

    return size;
};

GeometryCollection.prototype.toGeoJSON = function (options) {
    var geoJSON = Geometry.prototype.toGeoJSON.call(this, options);
    geoJSON.type = Types.geoJSON.GeometryCollection;
    geoJSON.geometries = [];

    for (var i = 0; i < this.geometries.length; i++)
        geoJSON.geometries.push(this.geometries[i].toGeoJSON());

    return geoJSON;
};

},{"./binarywriter":2,"./geometry":3,"./types":11,"util":20}],5:[function(require,module,exports){
module.exports = LineString;

var util = require('util');

var Geometry = require('./geometry');
var Types = require('./types');
var Point = require('./point');
var BinaryWriter = require('./binarywriter');

function LineString(points, srid) {
    Geometry.call(this);

    this.points = points || [];
	this.srid = srid;

    if (this.points.length > 0) {
        this.hasZ = this.points[0].hasZ;
        this.hasM = this.points[0].hasM;
    }
}

util.inherits(LineString, Geometry);

LineString.Z = function (points, srid) {
    var lineString = new LineString(points, srid);
    lineString.hasZ = true;
    return lineString;
};

LineString.M = function (points, srid) {
    var lineString = new LineString(points, srid);
    lineString.hasM = true;
    return lineString;
};

LineString.ZM = function (points, srid) {
    var lineString = new LineString(points, srid);
    lineString.hasZ = true;
    lineString.hasM = true;
    return lineString;
};

LineString._parseWkt = function (value, options) {
    var lineString = new LineString();
    lineString.srid = options.srid;
    lineString.hasZ = options.hasZ;
    lineString.hasM = options.hasM;

    if (value.isMatch(['EMPTY']))
        return lineString;

    value.expectGroupStart();
    lineString.points.push.apply(lineString.points, value.matchCoordinates(options));
    value.expectGroupEnd();

    return lineString;
};

LineString._parseWkb = function (value, options) {
    var lineString = new LineString();
    lineString.srid = options.srid;
    lineString.hasZ = options.hasZ;
    lineString.hasM = options.hasM;

    var pointCount = value.readUInt32();

    for (var i = 0; i < pointCount; i++)
        lineString.points.push(Point._readWkbPoint(value, options));

    return lineString;
};

LineString._parseTwkb = function (value, options) {
    var lineString = new LineString();
    lineString.hasZ = options.hasZ;
    lineString.hasM = options.hasM;

    if (options.isEmpty)
        return lineString;

    var previousPoint = new Point(0, 0, options.hasZ ? 0 : undefined, options.hasM ? 0 : undefined);
    var pointCount = value.readVarInt();

    for (var i = 0; i < pointCount; i++)
        lineString.points.push(Point._readTwkbPoint(value, options, previousPoint));

    return lineString;
};

LineString._parseGeoJSON = function (value) {
    var lineString = new LineString();

    if (value.coordinates.length > 0)
        lineString.hasZ = value.coordinates[0].length > 2;

    for (var i = 0; i < value.coordinates.length; i++)
        lineString.points.push(Point._readGeoJSONPoint(value.coordinates[i]));

    return lineString;
};

LineString.prototype.toWkt = function () {
    if (this.points.length === 0)
        return this._getWktType(Types.wkt.LineString, true);

    return this._getWktType(Types.wkt.LineString, false) + this._toInnerWkt();
};

LineString.prototype._toInnerWkt = function () {
    var innerWkt = '(';

    for (var i = 0; i < this.points.length; i++)
        innerWkt += this._getWktCoordinate(this.points[i]) + ',';

    innerWkt = innerWkt.slice(0, -1);
    innerWkt += ')';

    return innerWkt;
};

LineString.prototype.toWkb = function (parentOptions) {
    var wkb = new BinaryWriter(this._getWkbSize());

    wkb.writeInt8(1);

    this._writeWkbType(wkb, Types.wkb.LineString, parentOptions);
    wkb.writeUInt32LE(this.points.length);

    for (var i = 0; i < this.points.length; i++)
        this.points[i]._writeWkbPoint(wkb);

    return wkb.buffer;
};

LineString.prototype.toTwkb = function () {
    var twkb = new BinaryWriter(0, true);

    var precision = Geometry.getTwkbPrecision(5, 0, 0);
    var isEmpty = this.points.length === 0;

    this._writeTwkbHeader(twkb, Types.wkb.LineString, precision, isEmpty);

    if (this.points.length > 0) {
        twkb.writeVarInt(this.points.length);

        var previousPoint = new Point(0, 0, 0, 0);
        for (var i = 0; i < this.points.length; i++)
            this.points[i]._writeTwkbPoint(twkb, precision, previousPoint);
    }

    return twkb.buffer;
};

LineString.prototype._getWkbSize = function () {
    var coordinateSize = 16;

    if (this.hasZ)
        coordinateSize += 8;
    if (this.hasM)
        coordinateSize += 8;

    return 1 + 4 + 4 + (this.points.length * coordinateSize);
};

LineString.prototype.toGeoJSON = function (options) {
    var geoJSON = Geometry.prototype.toGeoJSON.call(this, options);
    geoJSON.type = Types.geoJSON.LineString;
    geoJSON.coordinates = [];

    for (var i = 0; i < this.points.length; i++) {
        if (this.hasZ)
            geoJSON.coordinates.push([this.points[i].x, this.points[i].y, this.points[i].z]);
        else
            geoJSON.coordinates.push([this.points[i].x, this.points[i].y]);
    }

    return geoJSON;
};

},{"./binarywriter":2,"./geometry":3,"./point":9,"./types":11,"util":20}],6:[function(require,module,exports){
module.exports = MultiLineString;

var util = require('util');

var Types = require('./types');
var Geometry = require('./geometry');
var Point = require('./point');
var LineString = require('./linestring');
var BinaryWriter = require('./binarywriter');

function MultiLineString(lineStrings, srid) {
    Geometry.call(this);

    this.lineStrings = lineStrings || [];
	this.srid = srid;

    if (this.lineStrings.length > 0) {
        this.hasZ = this.lineStrings[0].hasZ;
        this.hasM = this.lineStrings[0].hasM;
    }
}

util.inherits(MultiLineString, Geometry);

MultiLineString.Z = function (lineStrings, srid) {
    var multiLineString = new MultiLineString(lineStrings, srid);
    multiLineString.hasZ = true;
    return multiLineString;
};

MultiLineString.M = function (lineStrings, srid) {
    var multiLineString = new MultiLineString(lineStrings, srid);
    multiLineString.hasM = true;
    return multiLineString;
};

MultiLineString.ZM = function (lineStrings, srid) {
    var multiLineString = new MultiLineString(lineStrings, srid);
    multiLineString.hasZ = true;
    multiLineString.hasM = true;
    return multiLineString;
};

MultiLineString._parseWkt = function (value, options) {
    var multiLineString = new MultiLineString();
    multiLineString.srid = options.srid;
    multiLineString.hasZ = options.hasZ;
    multiLineString.hasM = options.hasM;

    if (value.isMatch(['EMPTY']))
        return multiLineString;

    value.expectGroupStart();

    do {
        value.expectGroupStart();
        multiLineString.lineStrings.push(new LineString(value.matchCoordinates(options)));
        value.expectGroupEnd();
    } while (value.isMatch([',']));

    value.expectGroupEnd();

    return multiLineString;
};

MultiLineString._parseWkb = function (value, options) {
    var multiLineString = new MultiLineString();
    multiLineString.srid = options.srid;
    multiLineString.hasZ = options.hasZ;
    multiLineString.hasM = options.hasM;

    var lineStringCount = value.readUInt32();

    for (var i = 0; i < lineStringCount; i++)
        multiLineString.lineStrings.push(Geometry.parse(value, options));

    return multiLineString;
};

MultiLineString._parseTwkb = function (value, options) {
    var multiLineString = new MultiLineString();
    multiLineString.hasZ = options.hasZ;
    multiLineString.hasM = options.hasM;

    if (options.isEmpty)
        return multiLineString;

    var previousPoint = new Point(0, 0, options.hasZ ? 0 : undefined, options.hasM ? 0 : undefined);
    var lineStringCount = value.readVarInt();

    for (var i = 0; i < lineStringCount; i++) {
        var lineString = new LineString();
        lineString.hasZ = options.hasZ;
        lineString.hasM = options.hasM;

        var pointCount = value.readVarInt();

        for (var j = 0; j < pointCount; j++)
            lineString.points.push(Point._readTwkbPoint(value, options, previousPoint));

        multiLineString.lineStrings.push(lineString);
    }

    return multiLineString;
};

MultiLineString._parseGeoJSON = function (value) {
    var multiLineString = new MultiLineString();

    if (value.coordinates.length > 0 && value.coordinates[0].length > 0)
        multiLineString.hasZ = value.coordinates[0][0].length > 2;

    for (var i = 0; i < value.coordinates.length; i++)
        multiLineString.lineStrings.push(LineString._parseGeoJSON({ coordinates: value.coordinates[i] }));

    return multiLineString;
};

MultiLineString.prototype.toWkt = function () {
    if (this.lineStrings.length === 0)
        return this._getWktType(Types.wkt.MultiLineString, true);

    var wkt = this._getWktType(Types.wkt.MultiLineString, false) + '(';

    for (var i = 0; i < this.lineStrings.length; i++)
        wkt += this.lineStrings[i]._toInnerWkt() + ',';

    wkt = wkt.slice(0, -1);
    wkt += ')';

    return wkt;
};

MultiLineString.prototype.toWkb = function () {
    var wkb = new BinaryWriter(this._getWkbSize());

    wkb.writeInt8(1);

    this._writeWkbType(wkb, Types.wkb.MultiLineString);
    wkb.writeUInt32LE(this.lineStrings.length);

    for (var i = 0; i < this.lineStrings.length; i++)
        wkb.writeBuffer(this.lineStrings[i].toWkb({ srid: this.srid }));

    return wkb.buffer;
};

MultiLineString.prototype.toTwkb = function () {
    var twkb = new BinaryWriter(0, true);

    var precision = Geometry.getTwkbPrecision(5, 0, 0);
    var isEmpty = this.lineStrings.length === 0;

    this._writeTwkbHeader(twkb, Types.wkb.MultiLineString, precision, isEmpty);

    if (this.lineStrings.length > 0) {
        twkb.writeVarInt(this.lineStrings.length);

        var previousPoint = new Point(0, 0, 0, 0);
        for (var i = 0; i < this.lineStrings.length; i++) {
            twkb.writeVarInt(this.lineStrings[i].points.length);

            for (var j = 0; j < this.lineStrings[i].points.length; j++)
                this.lineStrings[i].points[j]._writeTwkbPoint(twkb, precision, previousPoint);
        }
    }

    return twkb.buffer;
};

MultiLineString.prototype._getWkbSize = function () {
    var size = 1 + 4 + 4;

    for (var i = 0; i < this.lineStrings.length; i++)
        size += this.lineStrings[i]._getWkbSize();

    return size;
};

MultiLineString.prototype.toGeoJSON = function (options) {
    var geoJSON = Geometry.prototype.toGeoJSON.call(this, options);
    geoJSON.type = Types.geoJSON.MultiLineString;
    geoJSON.coordinates = [];

    for (var i = 0; i < this.lineStrings.length; i++)
        geoJSON.coordinates.push(this.lineStrings[i].toGeoJSON().coordinates);

    return geoJSON;
};

},{"./binarywriter":2,"./geometry":3,"./linestring":5,"./point":9,"./types":11,"util":20}],7:[function(require,module,exports){
module.exports = MultiPoint;

var util = require('util');

var Types = require('./types');
var Geometry = require('./geometry');
var Point = require('./point');
var BinaryWriter = require('./binarywriter');

function MultiPoint(points, srid) {
    Geometry.call(this);

    this.points = points || [];
	this.srid = srid;
	
    if (this.points.length > 0) {
        this.hasZ = this.points[0].hasZ;
        this.hasM = this.points[0].hasM;
    }
}

util.inherits(MultiPoint, Geometry);

MultiPoint.Z = function (points, srid) {
    var multiPoint = new MultiPoint(points, srid);
    multiPoint.hasZ = true;
    return multiPoint;
};

MultiPoint.M = function (points, srid) {
    var multiPoint = new MultiPoint(points, srid);
    multiPoint.hasM = true;
    return multiPoint;
};

MultiPoint.ZM = function (points, srid) {
    var multiPoint = new MultiPoint(points, srid);
    multiPoint.hasZ = true;
    multiPoint.hasM = true;
    return multiPoint;
};

MultiPoint._parseWkt = function (value, options) {
    var multiPoint = new MultiPoint();
    multiPoint.srid = options.srid;
    multiPoint.hasZ = options.hasZ;
    multiPoint.hasM = options.hasM;

    if (value.isMatch(['EMPTY']))
        return multiPoint;

    value.expectGroupStart();
    multiPoint.points.push.apply(multiPoint.points, value.matchCoordinates(options));
    value.expectGroupEnd();

    return multiPoint;
};

MultiPoint._parseWkb = function (value, options) {
    var multiPoint = new MultiPoint();
    multiPoint.srid = options.srid;
    multiPoint.hasZ = options.hasZ;
    multiPoint.hasM = options.hasM;

    var pointCount = value.readUInt32();

    for (var i = 0; i < pointCount; i++)
        multiPoint.points.push(Geometry.parse(value, options));

    return multiPoint;
};

MultiPoint._parseTwkb = function (value, options) {
    var multiPoint = new MultiPoint();
    multiPoint.hasZ = options.hasZ;
    multiPoint.hasM = options.hasM;

    if (options.isEmpty)
        return multiPoint;

    var previousPoint = new Point(0, 0, options.hasZ ? 0 : undefined, options.hasM ? 0 : undefined);
    var pointCount = value.readVarInt();

    for (var i = 0; i < pointCount; i++)
        multiPoint.points.push(Point._readTwkbPoint(value, options, previousPoint));

    return multiPoint;
};

MultiPoint._parseGeoJSON = function (value) {
    var multiPoint = new MultiPoint();

    if (value.coordinates.length > 0)
        multiPoint.hasZ = value.coordinates[0].length > 2;

    for (var i = 0; i < value.coordinates.length; i++)
        multiPoint.points.push(Point._parseGeoJSON({ coordinates: value.coordinates[i] }));

    return multiPoint;
};

MultiPoint.prototype.toWkt = function () {
    if (this.points.length === 0)
        return this._getWktType(Types.wkt.MultiPoint, true);

    var wkt = this._getWktType(Types.wkt.MultiPoint, false) + '(';

    for (var i = 0; i < this.points.length; i++)
        wkt += this._getWktCoordinate(this.points[i]) + ',';

    wkt = wkt.slice(0, -1);
    wkt += ')';

    return wkt;
};

MultiPoint.prototype.toWkb = function () {
    var wkb = new BinaryWriter(this._getWkbSize());

    wkb.writeInt8(1);

    this._writeWkbType(wkb, Types.wkb.MultiPoint);
    wkb.writeUInt32LE(this.points.length);

    for (var i = 0; i < this.points.length; i++)
        wkb.writeBuffer(this.points[i].toWkb({ srid: this.srid }));

    return wkb.buffer;
};

MultiPoint.prototype.toTwkb = function () {
    var twkb = new BinaryWriter(0, true);

    var precision = Geometry.getTwkbPrecision(5, 0, 0);
    var isEmpty = this.points.length === 0;

    this._writeTwkbHeader(twkb, Types.wkb.MultiPoint, precision, isEmpty);

    if (this.points.length > 0) {
        twkb.writeVarInt(this.points.length);

        var previousPoint = new Point(0, 0, 0, 0);
        for (var i = 0; i < this.points.length; i++)
            this.points[i]._writeTwkbPoint(twkb, precision, previousPoint);
    }

    return twkb.buffer;
};

MultiPoint.prototype._getWkbSize = function () {
    var coordinateSize = 16;

    if (this.hasZ)
        coordinateSize += 8;
    if (this.hasM)
        coordinateSize += 8;

    coordinateSize += 5;

    return 1 + 4 + 4 + (this.points.length * coordinateSize);
};

MultiPoint.prototype.toGeoJSON = function (options) {
    var geoJSON = Geometry.prototype.toGeoJSON.call(this, options);
    geoJSON.type = Types.geoJSON.MultiPoint;
    geoJSON.coordinates = [];

    for (var i = 0; i < this.points.length; i++)
        geoJSON.coordinates.push(this.points[i].toGeoJSON().coordinates);

    return geoJSON;
};

},{"./binarywriter":2,"./geometry":3,"./point":9,"./types":11,"util":20}],8:[function(require,module,exports){
module.exports = MultiPolygon;

var util = require('util');

var Types = require('./types');
var Geometry = require('./geometry');
var Point = require('./point');
var Polygon = require('./polygon');
var BinaryWriter = require('./binarywriter');

function MultiPolygon(polygons, srid) {
    Geometry.call(this);

    this.polygons = polygons || [];
	this.srid = srid;

    if (this.polygons.length > 0) {
        this.hasZ = this.polygons[0].hasZ;
        this.hasM = this.polygons[0].hasM;
    }
}

util.inherits(MultiPolygon, Geometry);

MultiPolygon.Z = function (polygons, srid) {
    var multiPolygon = new MultiPolygon(polygons, srid);
    multiPolygon.hasZ = true;
    return multiPolygon;
};

MultiPolygon.M = function (polygons, srid) {
    var multiPolygon = new MultiPolygon(polygons, srid);
    multiPolygon.hasM = true;
    return multiPolygon;
};

MultiPolygon.ZM = function (polygons, srid) {
    var multiPolygon = new MultiPolygon(polygons, srid);
    multiPolygon.hasZ = true;
    multiPolygon.hasM = true;
    return multiPolygon;
};

MultiPolygon._parseWkt = function (value, options) {
    var multiPolygon = new MultiPolygon();
    multiPolygon.srid = options.srid;
    multiPolygon.hasZ = options.hasZ;
    multiPolygon.hasM = options.hasM;

    if (value.isMatch(['EMPTY']))
        return multiPolygon;

    value.expectGroupStart();

    do {
        value.expectGroupStart();

        var exteriorRing = [];
        var interiorRings = [];

        value.expectGroupStart();
        exteriorRing.push.apply(exteriorRing, value.matchCoordinates(options));
        value.expectGroupEnd();

        while (value.isMatch([','])) {
            value.expectGroupStart();
            interiorRings.push(value.matchCoordinates(options));
            value.expectGroupEnd();
        }

        multiPolygon.polygons.push(new Polygon(exteriorRing, interiorRings));

        value.expectGroupEnd();

    } while (value.isMatch([',']));

    value.expectGroupEnd();

    return multiPolygon;
};

MultiPolygon._parseWkb = function (value, options) {
    var multiPolygon = new MultiPolygon();
    multiPolygon.srid = options.srid;
    multiPolygon.hasZ = options.hasZ;
    multiPolygon.hasM = options.hasM;

    var polygonCount = value.readUInt32();

    for (var i = 0; i < polygonCount; i++)
        multiPolygon.polygons.push(Geometry.parse(value, options));

    return multiPolygon;
};

MultiPolygon._parseTwkb = function (value, options) {
    var multiPolygon = new MultiPolygon();
    multiPolygon.hasZ = options.hasZ;
    multiPolygon.hasM = options.hasM;

    if (options.isEmpty)
        return multiPolygon;

    var previousPoint = new Point(0, 0, options.hasZ ? 0 : undefined, options.hasM ? 0 : undefined);
    var polygonCount = value.readVarInt();

    for (var i = 0; i < polygonCount; i++) {
        var polygon = new Polygon();
        polygon.hasZ = options.hasZ;
        polygon.hasM = options.hasM;

        var ringCount = value.readVarInt();
        var exteriorRingCount = value.readVarInt();

        for (var j = 0; j < exteriorRingCount; j++)
            polygon.exteriorRing.push(Point._readTwkbPoint(value, options, previousPoint));

        for (j = 1; j < ringCount; j++) {
            var interiorRing = [];

            var interiorRingCount = value.readVarInt();

            for (var k = 0; k < interiorRingCount; k++)
                interiorRing.push(Point._readTwkbPoint(value, options, previousPoint));

            polygon.interiorRings.push(interiorRing);
        }

        multiPolygon.polygons.push(polygon);
    }

    return multiPolygon;
};

MultiPolygon._parseGeoJSON = function (value) {
    var multiPolygon = new MultiPolygon();

    if (value.coordinates.length > 0 && value.coordinates[0].length > 0 && value.coordinates[0][0].length > 0)
        multiPolygon.hasZ = value.coordinates[0][0][0].length > 2;

    for (var i = 0; i < value.coordinates.length; i++)
        multiPolygon.polygons.push(Polygon._parseGeoJSON({ coordinates: value.coordinates[i] }));

    return multiPolygon;
};

MultiPolygon.prototype.toWkt = function () {
    if (this.polygons.length === 0)
        return this._getWktType(Types.wkt.MultiPolygon, true);

    var wkt = this._getWktType(Types.wkt.MultiPolygon, false) + '(';

    for (var i = 0; i < this.polygons.length; i++)
        wkt += this.polygons[i]._toInnerWkt() + ',';

    wkt = wkt.slice(0, -1);
    wkt += ')';

    return wkt;
};

MultiPolygon.prototype.toWkb = function () {
    var wkb = new BinaryWriter(this._getWkbSize());

    wkb.writeInt8(1);

    this._writeWkbType(wkb, Types.wkb.MultiPolygon);
    wkb.writeUInt32LE(this.polygons.length);

    for (var i = 0; i < this.polygons.length; i++)
        wkb.writeBuffer(this.polygons[i].toWkb({ srid: this.srid }));

    return wkb.buffer;
};

MultiPolygon.prototype.toTwkb = function () {
    var twkb = new BinaryWriter(0, true);

    var precision = Geometry.getTwkbPrecision(5, 0, 0);
    var isEmpty = this.polygons.length === 0;

    this._writeTwkbHeader(twkb, Types.wkb.MultiPolygon, precision, isEmpty);

    if (this.polygons.length > 0) {
        twkb.writeVarInt(this.polygons.length);

        var previousPoint = new Point(0, 0, 0, 0);
        for (var i = 0; i < this.polygons.length; i++) {
            twkb.writeVarInt(1 + this.polygons[i].interiorRings.length);

            twkb.writeVarInt(this.polygons[i].exteriorRing.length);

            for (var j = 0; j < this.polygons[i].exteriorRing.length; j++)
                this.polygons[i].exteriorRing[j]._writeTwkbPoint(twkb, precision, previousPoint);

            for (j = 0; j < this.polygons[i].interiorRings.length; j++) {
                twkb.writeVarInt(this.polygons[i].interiorRings[j].length);

                for (var k = 0; k < this.polygons[i].interiorRings[j].length; k++)
                    this.polygons[i].interiorRings[j][k]._writeTwkbPoint(twkb, precision, previousPoint);
            }
        }
    }

    return twkb.buffer;
};

MultiPolygon.prototype._getWkbSize = function () {
    var size = 1 + 4 + 4;

    for (var i = 0; i < this.polygons.length; i++)
        size += this.polygons[i]._getWkbSize();

    return size;
};

MultiPolygon.prototype.toGeoJSON = function (options) {
    var geoJSON = Geometry.prototype.toGeoJSON.call(this, options);
    geoJSON.type = Types.geoJSON.MultiPolygon;
    geoJSON.coordinates = [];

    for (var i = 0; i < this.polygons.length; i++)
        geoJSON.coordinates.push(this.polygons[i].toGeoJSON().coordinates);

    return geoJSON;
};

},{"./binarywriter":2,"./geometry":3,"./point":9,"./polygon":10,"./types":11,"util":20}],9:[function(require,module,exports){
module.exports = Point;

var util = require('util');

var Geometry = require('./geometry');
var Types = require('./types');
var BinaryWriter = require('./binarywriter');
var ZigZag = require('./zigzag.js');

function Point(x, y, z, m, srid) {
    Geometry.call(this);

    this.x = x;
    this.y = y;
    this.z = z;
    this.m = m;
	this.srid = srid;

    this.hasZ = typeof this.z !== 'undefined';
    this.hasM = typeof this.m !== 'undefined';
}

util.inherits(Point, Geometry);

Point.Z = function (x, y, z, srid) {
    var point = new Point(x, y, z, undefined, srid);
    point.hasZ = true;
    return point;
};

Point.M = function (x, y, m, srid) {
    var point = new Point(x, y, undefined, m, srid);
    point.hasM = true;
    return point;
};

Point.ZM = function (x, y, z, m, srid) {
    var point = new Point(x, y, z, m, srid);
    point.hasZ = true;
    point.hasM = true;
    return point;
};

Point._parseWkt = function (value, options) {
    var point = new Point();
    point.srid = options.srid;
    point.hasZ = options.hasZ;
    point.hasM = options.hasM;

    if (value.isMatch(['EMPTY']))
        return point;

    value.expectGroupStart();

    var coordinate = value.matchCoordinate(options);

    point.x = coordinate.x;
    point.y = coordinate.y;
    point.z = coordinate.z;
    point.m = coordinate.m;

    value.expectGroupEnd();

    return point;
};

Point._parseWkb = function (value, options) {
    var point = Point._readWkbPoint(value, options);
    point.srid = options.srid;
    return point;
};

Point._readWkbPoint = function (value, options) {
    return new Point(value.readDouble(), value.readDouble(),
        options.hasZ ? value.readDouble() : undefined,
        options.hasM ? value.readDouble() : undefined);
};

Point._parseTwkb = function (value, options) {
    var point = new Point();
    point.hasZ = options.hasZ;
    point.hasM = options.hasM;

    if (options.isEmpty)
        return point;

    point.x = ZigZag.decode(value.readVarInt()) / options.precisionFactor;
    point.y = ZigZag.decode(value.readVarInt()) / options.precisionFactor;
    point.z = options.hasZ ? ZigZag.decode(value.readVarInt()) / options.zPrecisionFactor : undefined;
    point.m = options.hasM ? ZigZag.decode(value.readVarInt()) / options.mPrecisionFactor : undefined;

    return point;
};

Point._readTwkbPoint = function (value, options, previousPoint) {
    previousPoint.x += ZigZag.decode(value.readVarInt()) / options.precisionFactor;
    previousPoint.y += ZigZag.decode(value.readVarInt()) / options.precisionFactor;

    if (options.hasZ)
        previousPoint.z += ZigZag.decode(value.readVarInt()) / options.zPrecisionFactor;
    if (options.hasM)
        previousPoint.m += ZigZag.decode(value.readVarInt()) / options.mPrecisionFactor;

    return new Point(previousPoint.x, previousPoint.y, previousPoint.z, previousPoint.m);
};

Point._parseGeoJSON = function (value) {
    return Point._readGeoJSONPoint(value.coordinates);
};

Point._readGeoJSONPoint = function (coordinates) {
    if (coordinates.length === 0)
        return new Point();

    if (coordinates.length > 2)
        return new Point(coordinates[0], coordinates[1], coordinates[2]);

    return new Point(coordinates[0], coordinates[1]);
};

Point.prototype.toWkt = function () {
    if (typeof this.x === 'undefined' && typeof this.y === 'undefined' &&
        typeof this.z === 'undefined' && typeof this.m === 'undefined')
        return this._getWktType(Types.wkt.Point, true);

    return this._getWktType(Types.wkt.Point, false) + '(' + this._getWktCoordinate(this) + ')';
};

Point.prototype.toWkb = function (parentOptions) {
    var wkb = new BinaryWriter(this._getWkbSize());

    wkb.writeInt8(1);
    this._writeWkbType(wkb, Types.wkb.Point, parentOptions);

    if (typeof this.x === 'undefined' && typeof this.y === 'undefined') {
        wkb.writeDoubleLE(NaN);
        wkb.writeDoubleLE(NaN);

        if (this.hasZ)
            wkb.writeDoubleLE(NaN);
        if (this.hasM)
            wkb.writeDoubleLE(NaN);
    }
    else {
        this._writeWkbPoint(wkb);
    }

    return wkb.buffer;
};

Point.prototype._writeWkbPoint = function (wkb) {
    wkb.writeDoubleLE(this.x);
    wkb.writeDoubleLE(this.y);

    if (this.hasZ)
        wkb.writeDoubleLE(this.z);
    if (this.hasM)
        wkb.writeDoubleLE(this.m);
};

Point.prototype.toTwkb = function () {
    var twkb = new BinaryWriter(0, true);

    var precision = Geometry.getTwkbPrecision(5, 0, 0);
    var isEmpty = typeof this.x === 'undefined' && typeof this.y === 'undefined';

    this._writeTwkbHeader(twkb, Types.wkb.Point, precision, isEmpty);

    if (!isEmpty)
        this._writeTwkbPoint(twkb, precision, new Point(0, 0, 0, 0));

    return twkb.buffer;
};

Point.prototype._writeTwkbPoint = function (twkb, precision, previousPoint) {
    var x = this.x * precision.xyFactor;
    var y = this.y * precision.xyFactor;
    var z = this.z * precision.zFactor;
    var m = this.m * precision.mFactor;

    twkb.writeVarInt(ZigZag.encode(x - previousPoint.x));
    twkb.writeVarInt(ZigZag.encode(y - previousPoint.y));
    if (this.hasZ)
        twkb.writeVarInt(ZigZag.encode(z - previousPoint.z));
    if (this.hasM)
        twkb.writeVarInt(ZigZag.encode(m - previousPoint.m));

    previousPoint.x = x;
    previousPoint.y = y;
    previousPoint.z = z;
    previousPoint.m = m;
};

Point.prototype._getWkbSize = function () {
    var size = 1 + 4 + 8 + 8;

    if (this.hasZ)
        size += 8;
    if (this.hasM)
        size += 8;

    return size;
};

Point.prototype.toGeoJSON = function (options) {
    var geoJSON = Geometry.prototype.toGeoJSON.call(this, options);
    geoJSON.type = Types.geoJSON.Point;

    if (typeof this.x === 'undefined' && typeof this.y === 'undefined')
        geoJSON.coordinates = [];
    else if (typeof this.z !== 'undefined')
        geoJSON.coordinates = [this.x, this.y, this.z];
    else
        geoJSON.coordinates = [this.x, this.y];

    return geoJSON;
};

},{"./binarywriter":2,"./geometry":3,"./types":11,"./zigzag.js":13,"util":20}],10:[function(require,module,exports){
module.exports = Polygon;

var util = require('util');

var Geometry = require('./geometry');
var Types = require('./types');
var Point = require('./point');
var BinaryWriter = require('./binarywriter');

function Polygon(exteriorRing, interiorRings, srid) {
    Geometry.call(this);

    this.exteriorRing = exteriorRing || [];
    this.interiorRings = interiorRings || [];
	this.srid = srid;

    if (this.exteriorRing.length > 0) {
        this.hasZ = this.exteriorRing[0].hasZ;
        this.hasM = this.exteriorRing[0].hasM;
    }
}

util.inherits(Polygon, Geometry);

Polygon.Z = function (exteriorRing, interiorRings, srid) {
    var polygon = new Polygon(exteriorRing, interiorRings, srid);
    polygon.hasZ = true;
    return polygon;
};

Polygon.M = function (exteriorRing, interiorRings, srid) {
    var polygon = new Polygon(exteriorRing, interiorRings, srid);
    polygon.hasM = true;
    return polygon;
};

Polygon.ZM = function (exteriorRing, interiorRings, srid) {
    var polygon = new Polygon(exteriorRing, interiorRings, srid);
    polygon.hasZ = true;
    polygon.hasM = true;
    return polygon;
};

Polygon._parseWkt = function (value, options) {
    var polygon = new Polygon();
    polygon.srid = options.srid;
    polygon.hasZ = options.hasZ;
    polygon.hasM = options.hasM;

    if (value.isMatch(['EMPTY']))
        return polygon;

    value.expectGroupStart();

    value.expectGroupStart();
    polygon.exteriorRing.push.apply(polygon.exteriorRing, value.matchCoordinates(options));
    value.expectGroupEnd();

    while (value.isMatch([','])) {
        value.expectGroupStart();
        polygon.interiorRings.push(value.matchCoordinates(options));
        value.expectGroupEnd();
    }

    value.expectGroupEnd();

    return polygon;
};

Polygon._parseWkb = function (value, options) {
    var polygon = new Polygon();
    polygon.srid = options.srid;
    polygon.hasZ = options.hasZ;
    polygon.hasM = options.hasM;

    var ringCount = value.readUInt32();

    if (ringCount > 0) {
        var exteriorRingCount = value.readUInt32();

        for (var i = 0; i < exteriorRingCount; i++)
            polygon.exteriorRing.push(Point._readWkbPoint(value, options));

        for (i = 1; i < ringCount; i++) {
            var interiorRing = [];

            var interiorRingCount = value.readUInt32();

            for (var j = 0; j < interiorRingCount; j++)
                interiorRing.push(Point._readWkbPoint(value, options));

            polygon.interiorRings.push(interiorRing);
        }
    }

    return polygon;
};

Polygon._parseTwkb = function (value, options) {
    var polygon = new Polygon();
    polygon.hasZ = options.hasZ;
    polygon.hasM = options.hasM;

    if (options.isEmpty)
        return polygon;

    var previousPoint = new Point(0, 0, options.hasZ ? 0 : undefined, options.hasM ? 0 : undefined);
    var ringCount = value.readVarInt();
    var exteriorRingCount = value.readVarInt();

    for (var i = 0; i < exteriorRingCount; i++)
        polygon.exteriorRing.push(Point._readTwkbPoint(value, options, previousPoint));

    for (i = 1; i < ringCount; i++) {
        var interiorRing = [];

        var interiorRingCount = value.readVarInt();

        for (var j = 0; j < interiorRingCount; j++)
            interiorRing.push(Point._readTwkbPoint(value, options, previousPoint));

        polygon.interiorRings.push(interiorRing);
    }

    return polygon;
};

Polygon._parseGeoJSON = function (value) {
    var polygon = new Polygon();

    if (value.coordinates.length > 0 && value.coordinates[0].length > 0)
        polygon.hasZ = value.coordinates[0][0].length > 2;

    for (var i = 0; i < value.coordinates.length; i++) {
        if (i > 0)
            polygon.interiorRings.push([]);

        for (var j = 0; j  < value.coordinates[i].length; j++) {
            if (i === 0)
                polygon.exteriorRing.push(Point._readGeoJSONPoint(value.coordinates[i][j]));
            else
                polygon.interiorRings[i - 1].push(Point._readGeoJSONPoint(value.coordinates[i][j]));
        }
    }

    return polygon;
};

Polygon.prototype.toWkt = function () {
    if (this.exteriorRing.length === 0)
        return this._getWktType(Types.wkt.Polygon, true);

    return this._getWktType(Types.wkt.Polygon, false) + this._toInnerWkt();
};

Polygon.prototype._toInnerWkt = function () {
    var innerWkt = '((';

    for (var i = 0; i < this.exteriorRing.length; i++)
        innerWkt += this._getWktCoordinate(this.exteriorRing[i]) + ',';

    innerWkt = innerWkt.slice(0, -1);
    innerWkt += ')';

    for (i = 0; i < this.interiorRings.length; i++) {
        innerWkt += ',(';

        for (var j = 0; j < this.interiorRings[i].length; j++) {
            innerWkt += this._getWktCoordinate(this.interiorRings[i][j]) + ',';
        }

        innerWkt = innerWkt.slice(0, -1);
        innerWkt += ')';
    }

    innerWkt += ')';

    return innerWkt;
};

Polygon.prototype.toWkb = function (parentOptions) {
    var wkb = new BinaryWriter(this._getWkbSize());

    wkb.writeInt8(1);

    this._writeWkbType(wkb, Types.wkb.Polygon, parentOptions);

    if (this.exteriorRing.length > 0) {
        wkb.writeUInt32LE(1 + this.interiorRings.length);
        wkb.writeUInt32LE(this.exteriorRing.length);
    }
    else {
        wkb.writeUInt32LE(0);
    }

    for (var i = 0; i < this.exteriorRing.length; i++)
        this.exteriorRing[i]._writeWkbPoint(wkb);

    for (i = 0; i < this.interiorRings.length; i++) {
        wkb.writeUInt32LE(this.interiorRings[i].length);

        for (var j = 0; j < this.interiorRings[i].length; j++)
            this.interiorRings[i][j]._writeWkbPoint(wkb);
    }

    return wkb.buffer;
};

Polygon.prototype.toTwkb = function () {
    var twkb = new BinaryWriter(0, true);

    var precision = Geometry.getTwkbPrecision(5, 0, 0);
    var isEmpty = this.exteriorRing.length === 0;

    this._writeTwkbHeader(twkb, Types.wkb.Polygon, precision, isEmpty);

    if (this.exteriorRing.length > 0) {
        twkb.writeVarInt(1 + this.interiorRings.length);

        twkb.writeVarInt(this.exteriorRing.length);

        var previousPoint = new Point(0, 0, 0, 0);
        for (var i = 0; i < this.exteriorRing.length; i++)
            this.exteriorRing[i]._writeTwkbPoint(twkb, precision, previousPoint);

        for (i = 0; i < this.interiorRings.length; i++) {
            twkb.writeVarInt(this.interiorRings[i].length);

            for (var j = 0; j < this.interiorRings[i].length; j++)
                this.interiorRings[i][j]._writeTwkbPoint(twkb, precision, previousPoint);
        }
    }

    return twkb.buffer;
};

Polygon.prototype._getWkbSize = function () {
    var coordinateSize = 16;

    if (this.hasZ)
        coordinateSize += 8;
    if (this.hasM)
        coordinateSize += 8;

    var size = 1 + 4 + 4;

    if (this.exteriorRing.length > 0)
        size += 4 + (this.exteriorRing.length * coordinateSize);

    for (var i = 0; i < this.interiorRings.length; i++)
        size += 4 + (this.interiorRings[i].length * coordinateSize);

    return size;
};

Polygon.prototype.toGeoJSON = function (options) {
    var geoJSON = Geometry.prototype.toGeoJSON.call(this, options);
    geoJSON.type = Types.geoJSON.Polygon;
    geoJSON.coordinates = [];

    if (this.exteriorRing.length > 0) {
        var exteriorRing = [];

        for (var i = 0; i < this.exteriorRing.length; i++) {
            if (this.hasZ)
                exteriorRing.push([this.exteriorRing[i].x, this.exteriorRing[i].y, this.exteriorRing[i].z]);
            else
                exteriorRing.push([this.exteriorRing[i].x, this.exteriorRing[i].y]);
        }

        geoJSON.coordinates.push(exteriorRing);
    }

    for (var j = 0; j < this.interiorRings.length; j++) {
        var interiorRing = [];

        for (var k = 0; k < this.interiorRings[j].length; k++) {
            if (this.hasZ)
                interiorRing.push([this.interiorRings[j][k].x, this.interiorRings[j][k].y, this.interiorRings[j][k].z]);
            else
                interiorRing.push([this.interiorRings[j][k].x, this.interiorRings[j][k].y]);
        }

        geoJSON.coordinates.push(interiorRing);
    }

    return geoJSON;
};

},{"./binarywriter":2,"./geometry":3,"./point":9,"./types":11,"util":20}],11:[function(require,module,exports){
module.exports = {
    wkt: {
        Point: 'POINT',
        LineString: 'LINESTRING',
        Polygon: 'POLYGON',
        MultiPoint: 'MULTIPOINT',
        MultiLineString: 'MULTILINESTRING',
        MultiPolygon: 'MULTIPOLYGON',
        GeometryCollection: 'GEOMETRYCOLLECTION'
    },
    wkb: {
        Point: 1,
        LineString: 2,
        Polygon: 3,
        MultiPoint: 4,
        MultiLineString: 5,
        MultiPolygon: 6,
        GeometryCollection: 7
    },
    geoJSON: {
        Point: 'Point',
        LineString: 'LineString',
        Polygon: 'Polygon',
        MultiPoint: 'MultiPoint',
        MultiLineString: 'MultiLineString',
        MultiPolygon: 'MultiPolygon',
        GeometryCollection: 'GeometryCollection'
    }
};

},{}],12:[function(require,module,exports){
module.exports = WktParser;

var Types = require('./types');
var Point = require('./point');

function WktParser(value) {
    this.value = value;
    this.position = 0;
}

WktParser.prototype.match = function (tokens) {
    this.skipWhitespaces();

    for (var i = 0; i < tokens.length; i++) {
        if (this.value.substring(this.position).indexOf(tokens[i]) === 0) {
            this.position += tokens[i].length;
            return tokens[i];
        }
    }

    return null;
};

WktParser.prototype.matchRegex = function (tokens) {
    this.skipWhitespaces();

    for (var i = 0; i < tokens.length; i++) {
        var match = this.value.substring(this.position).match(tokens[i]);

        if (match) {
            this.position += match[0].length;
            return match;
        }
    }

    return null;
};

WktParser.prototype.isMatch = function (tokens) {
    this.skipWhitespaces();

    for (var i = 0; i < tokens.length; i++) {
        if (this.value.substring(this.position).indexOf(tokens[i]) === 0) {
            this.position += tokens[i].length;
            return true;
        }
    }

    return false;
};

WktParser.prototype.matchType = function () {
    var geometryType = this.match([Types.wkt.Point, Types.wkt.LineString, Types.wkt.Polygon, Types.wkt.MultiPoint,
    Types.wkt.MultiLineString, Types.wkt.MultiPolygon, Types.wkt.GeometryCollection]);

    if (!geometryType)
        throw new Error('Expected geometry type');

    return geometryType;
};

WktParser.prototype.matchDimension = function () {
    var dimension = this.match(['ZM', 'Z', 'M']);

    switch (dimension) {
        case 'ZM': return { hasZ: true, hasM: true };
        case 'Z': return { hasZ: true, hasM: false };
        case 'M': return { hasZ: false, hasM: true };
        default: return { hasZ: false, hasM: false };
    }
};

WktParser.prototype.expectGroupStart = function () {
    if (!this.isMatch(['(']))
        throw new Error('Expected group start');
};

WktParser.prototype.expectGroupEnd = function () {
    if (!this.isMatch([')']))
        throw new Error('Expected group end');
};

WktParser.prototype.matchCoordinate = function (options) {
    var match;

    if (options.hasZ && options.hasM)
        match = this.matchRegex([/^(\S*)\s+(\S*)\s+(\S*)\s+([^\s,)]*)/]);
    else if (options.hasZ || options.hasM)
        match = this.matchRegex([/^(\S*)\s+(\S*)\s+([^\s,)]*)/]);
    else
        match = this.matchRegex([/^(\S*)\s+([^\s,)]*)/]);

    if (!match)
        throw new Error('Expected coordinates');

    if (options.hasZ && options.hasM)
        return new Point(parseFloat(match[1]), parseFloat(match[2]), parseFloat(match[3]), parseFloat(match[4]));
    else if (options.hasZ)
        return new Point(parseFloat(match[1]), parseFloat(match[2]), parseFloat(match[3]));
    else if (options.hasM)
        return new Point(parseFloat(match[1]), parseFloat(match[2]), undefined, parseFloat(match[3]));
    else
        return new Point(parseFloat(match[1]), parseFloat(match[2]));
};

WktParser.prototype.matchCoordinates = function (options) {
    var coordinates = [];

    do {
        var startsWithBracket = this.isMatch(['(']);

        coordinates.push(this.matchCoordinate(options));

        if (startsWithBracket)
            this.expectGroupEnd();
    } while (this.isMatch([',']));

    return coordinates;
};

WktParser.prototype.skipWhitespaces = function () {
    while (this.position < this.value.length && this.value[this.position] === ' ')
        this.position++;
};

},{"./point":9,"./types":11}],13:[function(require,module,exports){
module.exports = {
    encode: function (value) {
        return (value << 1) ^ (value >> 31);
    },
    decode: function (value) {
        return (value >> 1) ^ (-(value & 1));
    }
};

},{}],14:[function(require,module,exports){
'use strict'

exports.byteLength = byteLength
exports.toByteArray = toByteArray
exports.fromByteArray = fromByteArray

var lookup = []
var revLookup = []
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array

var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
for (var i = 0, len = code.length; i < len; ++i) {
  lookup[i] = code[i]
  revLookup[code.charCodeAt(i)] = i
}

// Support decoding URL-safe base64 strings, as Node.js does.
// See: https://en.wikipedia.org/wiki/Base64#URL_applications
revLookup['-'.charCodeAt(0)] = 62
revLookup['_'.charCodeAt(0)] = 63

function getLens (b64) {
  var len = b64.length

  if (len % 4 > 0) {
    throw new Error('Invalid string. Length must be a multiple of 4')
  }

  // Trim off extra bytes after placeholder bytes are found
  // See: https://github.com/beatgammit/base64-js/issues/42
  var validLen = b64.indexOf('=')
  if (validLen === -1) validLen = len

  var placeHoldersLen = validLen === len
    ? 0
    : 4 - (validLen % 4)

  return [validLen, placeHoldersLen]
}

// base64 is 4/3 + up to two characters of the original data
function byteLength (b64) {
  var lens = getLens(b64)
  var validLen = lens[0]
  var placeHoldersLen = lens[1]
  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
}

function _byteLength (b64, validLen, placeHoldersLen) {
  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
}

function toByteArray (b64) {
  var tmp
  var lens = getLens(b64)
  var validLen = lens[0]
  var placeHoldersLen = lens[1]

  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))

  var curByte = 0

  // if there are placeholders, only get up to the last complete 4 chars
  var len = placeHoldersLen > 0
    ? validLen - 4
    : validLen

  var i
  for (i = 0; i < len; i += 4) {
    tmp =
      (revLookup[b64.charCodeAt(i)] << 18) |
      (revLookup[b64.charCodeAt(i + 1)] << 12) |
      (revLookup[b64.charCodeAt(i + 2)] << 6) |
      revLookup[b64.charCodeAt(i + 3)]
    arr[curByte++] = (tmp >> 16) & 0xFF
    arr[curByte++] = (tmp >> 8) & 0xFF
    arr[curByte++] = tmp & 0xFF
  }

  if (placeHoldersLen === 2) {
    tmp =
      (revLookup[b64.charCodeAt(i)] << 2) |
      (revLookup[b64.charCodeAt(i + 1)] >> 4)
    arr[curByte++] = tmp & 0xFF
  }

  if (placeHoldersLen === 1) {
    tmp =
      (revLookup[b64.charCodeAt(i)] << 10) |
      (revLookup[b64.charCodeAt(i + 1)] << 4) |
      (revLookup[b64.charCodeAt(i + 2)] >> 2)
    arr[curByte++] = (tmp >> 8) & 0xFF
    arr[curByte++] = tmp & 0xFF
  }

  return arr
}

function tripletToBase64 (num) {
  return lookup[num >> 18 & 0x3F] +
    lookup[num >> 12 & 0x3F] +
    lookup[num >> 6 & 0x3F] +
    lookup[num & 0x3F]
}

function encodeChunk (uint8, start, end) {
  var tmp
  var output = []
  for (var i = start; i < end; i += 3) {
    tmp =
      ((uint8[i] << 16) & 0xFF0000) +
      ((uint8[i + 1] << 8) & 0xFF00) +
      (uint8[i + 2] & 0xFF)
    output.push(tripletToBase64(tmp))
  }
  return output.join('')
}

function fromByteArray (uint8) {
  var tmp
  var len = uint8.length
  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
  var parts = []
  var maxChunkLength = 16383 // must be multiple of 3

  // go through the array every three bytes, we'll deal with trailing stuff later
  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
    parts.push(encodeChunk(
      uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)
    ))
  }

  // pad the end with zeros, but make sure to not forget the extra bytes
  if (extraBytes === 1) {
    tmp = uint8[len - 1]
    parts.push(
      lookup[tmp >> 2] +
      lookup[(tmp << 4) & 0x3F] +
      '=='
    )
  } else if (extraBytes === 2) {
    tmp = (uint8[len - 2] << 8) + uint8[len - 1]
    parts.push(
      lookup[tmp >> 10] +
      lookup[(tmp >> 4) & 0x3F] +
      lookup[(tmp << 2) & 0x3F] +
      '='
    )
  }

  return parts.join('')
}

},{}],15:[function(require,module,exports){
exports.read = function (buffer, offset, isLE, mLen, nBytes) {
  var e, m
  var eLen = (nBytes * 8) - mLen - 1
  var eMax = (1 << eLen) - 1
  var eBias = eMax >> 1
  var nBits = -7
  var i = isLE ? (nBytes - 1) : 0
  var d = isLE ? -1 : 1
  var s = buffer[offset + i]

  i += d

  e = s & ((1 << (-nBits)) - 1)
  s >>= (-nBits)
  nBits += eLen
  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}

  m = e & ((1 << (-nBits)) - 1)
  e >>= (-nBits)
  nBits += mLen
  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}

  if (e === 0) {
    e = 1 - eBias
  } else if (e === eMax) {
    return m ? NaN : ((s ? -1 : 1) * Infinity)
  } else {
    m = m + Math.pow(2, mLen)
    e = e - eBias
  }
  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
}

exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
  var e, m, c
  var eLen = (nBytes * 8) - mLen - 1
  var eMax = (1 << eLen) - 1
  var eBias = eMax >> 1
  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
  var i = isLE ? 0 : (nBytes - 1)
  var d = isLE ? 1 : -1
  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0

  value = Math.abs(value)

  if (isNaN(value) || value === Infinity) {
    m = isNaN(value) ? 1 : 0
    e = eMax
  } else {
    e = Math.floor(Math.log(value) / Math.LN2)
    if (value * (c = Math.pow(2, -e)) < 1) {
      e--
      c *= 2
    }
    if (e + eBias >= 1) {
      value += rt / c
    } else {
      value += rt * Math.pow(2, 1 - eBias)
    }
    if (value * c >= 2) {
      e++
      c /= 2
    }

    if (e + eBias >= eMax) {
      m = 0
      e = eMax
    } else if (e + eBias >= 1) {
      m = ((value * c) - 1) * Math.pow(2, mLen)
      e = e + eBias
    } else {
      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
      e = 0
    }
  }

  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}

  e = (e << mLen) | m
  eLen += mLen
  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}

  buffer[offset + i - d] |= s * 128
}

},{}],16:[function(require,module,exports){
if (typeof Object.create === 'function') {
  // implementation from standard node.js 'util' module
  module.exports = function inherits(ctor, superCtor) {
    ctor.super_ = superCtor
    ctor.prototype = Object.create(superCtor.prototype, {
      constructor: {
        value: ctor,
        enumerable: false,
        writable: true,
        configurable: true
      }
    });
  };
} else {
  // old school shim for old browsers
  module.exports = function inherits(ctor, superCtor) {
    ctor.super_ = superCtor
    var TempCtor = function () {}
    TempCtor.prototype = superCtor.prototype
    ctor.prototype = new TempCtor()
    ctor.prototype.constructor = ctor
  }
}

},{}],17:[function(require,module,exports){
/*!
 * Determine if an object is a Buffer
 *
 * @author   Feross Aboukhadijeh <https://feross.org>
 * @license  MIT
 */

// The _isBuffer check is for Safari 5-7 support, because it's missing
// Object.prototype.constructor. Remove this eventually
module.exports = function (obj) {
  return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)
}

function isBuffer (obj) {
  return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)
}

// For Node v0.10 support. Remove this eventually.
function isSlowBuffer (obj) {
  return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))
}

},{}],18:[function(require,module,exports){
// shim for using process in browser
var process = module.exports = {};

// cached from whatever global is present so that test runners that stub it
// don't break things.  But we need to wrap it in a try catch in case it is
// wrapped in strict mode code which doesn't define any globals.  It's inside a
// function because try/catches deoptimize in certain engines.

var cachedSetTimeout;
var cachedClearTimeout;

function defaultSetTimout() {
    throw new Error('setTimeout has not been defined');
}
function defaultClearTimeout () {
    throw new Error('clearTimeout has not been defined');
}
(function () {
    try {
        if (typeof setTimeout === 'function') {
            cachedSetTimeout = setTimeout;
        } else {
            cachedSetTimeout = defaultSetTimout;
        }
    } catch (e) {
        cachedSetTimeout = defaultSetTimout;
    }
    try {
        if (typeof clearTimeout === 'function') {
            cachedClearTimeout = clearTimeout;
        } else {
            cachedClearTimeout = defaultClearTimeout;
        }
    } catch (e) {
        cachedClearTimeout = defaultClearTimeout;
    }
} ())
function runTimeout(fun) {
    if (cachedSetTimeout === setTimeout) {
        //normal enviroments in sane situations
        return setTimeout(fun, 0);
    }
    // if setTimeout wasn't available but was latter defined
    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
        cachedSetTimeout = setTimeout;
        return setTimeout(fun, 0);
    }
    try {
        // when when somebody has screwed with setTimeout but no I.E. maddness
        return cachedSetTimeout(fun, 0);
    } catch(e){
        try {
            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
            return cachedSetTimeout.call(null, fun, 0);
        } catch(e){
            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
            return cachedSetTimeout.call(this, fun, 0);
        }
    }


}
function runClearTimeout(marker) {
    if (cachedClearTimeout === clearTimeout) {
        //normal enviroments in sane situations
        return clearTimeout(marker);
    }
    // if clearTimeout wasn't available but was latter defined
    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
        cachedClearTimeout = clearTimeout;
        return clearTimeout(marker);
    }
    try {
        // when when somebody has screwed with setTimeout but no I.E. maddness
        return cachedClearTimeout(marker);
    } catch (e){
        try {
            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
            return cachedClearTimeout.call(null, marker);
        } catch (e){
            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
            return cachedClearTimeout.call(this, marker);
        }
    }



}
var queue = [];
var draining = false;
var currentQueue;
var queueIndex = -1;

function cleanUpNextTick() {
    if (!draining || !currentQueue) {
        return;
    }
    draining = false;
    if (currentQueue.length) {
        queue = currentQueue.concat(queue);
    } else {
        queueIndex = -1;
    }
    if (queue.length) {
        drainQueue();
    }
}

function drainQueue() {
    if (draining) {
        return;
    }
    var timeout = runTimeout(cleanUpNextTick);
    draining = true;

    var len = queue.length;
    while(len) {
        currentQueue = queue;
        queue = [];
        while (++queueIndex < len) {
            if (currentQueue) {
                currentQueue[queueIndex].run();
            }
        }
        queueIndex = -1;
        len = queue.length;
    }
    currentQueue = null;
    draining = false;
    runClearTimeout(timeout);
}

process.nextTick = function (fun) {
    var args = new Array(arguments.length - 1);
    if (arguments.length > 1) {
        for (var i = 1; i < arguments.length; i++) {
            args[i - 1] = arguments[i];
        }
    }
    queue.push(new Item(fun, args));
    if (queue.length === 1 && !draining) {
        runTimeout(drainQueue);
    }
};

// v8 likes predictible objects
function Item(fun, array) {
    this.fun = fun;
    this.array = array;
}
Item.prototype.run = function () {
    this.fun.apply(null, this.array);
};
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
process.version = ''; // empty string to avoid regexp issues
process.versions = {};

function noop() {}

process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.prependListener = noop;
process.prependOnceListener = noop;

process.listeners = function (name) { return [] }

process.binding = function (name) {
    throw new Error('process.binding is not supported');
};

process.cwd = function () { return '/' };
process.chdir = function (dir) {
    throw new Error('process.chdir is not supported');
};
process.umask = function() { return 0; };

},{}],19:[function(require,module,exports){
module.exports = function isBuffer(arg) {
  return arg && typeof arg === 'object'
    && typeof arg.copy === 'function'
    && typeof arg.fill === 'function'
    && typeof arg.readUInt8 === 'function';
}
},{}],20:[function(require,module,exports){
(function (process,global){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.

var formatRegExp = /%[sdj%]/g;
exports.format = function(f) {
  if (!isString(f)) {
    var objects = [];
    for (var i = 0; i < arguments.length; i++) {
      objects.push(inspect(arguments[i]));
    }
    return objects.join(' ');
  }

  var i = 1;
  var args = arguments;
  var len = args.length;
  var str = String(f).replace(formatRegExp, function(x) {
    if (x === '%%') return '%';
    if (i >= len) return x;
    switch (x) {
      case '%s': return String(args[i++]);
      case '%d': return Number(args[i++]);
      case '%j':
        try {
          return JSON.stringify(args[i++]);
        } catch (_) {
          return '[Circular]';
        }
      default:
        return x;
    }
  });
  for (var x = args[i]; i < len; x = args[++i]) {
    if (isNull(x) || !isObject(x)) {
      str += ' ' + x;
    } else {
      str += ' ' + inspect(x);
    }
  }
  return str;
};


// Mark that a method should not be used.
// Returns a modified function which warns once by default.
// If --no-deprecation is set, then it is a no-op.
exports.deprecate = function(fn, msg) {
  // Allow for deprecating things in the process of starting up.
  if (isUndefined(global.process)) {
    return function() {
      return exports.deprecate(fn, msg).apply(this, arguments);
    };
  }

  if (process.noDeprecation === true) {
    return fn;
  }

  var warned = false;
  function deprecated() {
    if (!warned) {
      if (process.throwDeprecation) {
        throw new Error(msg);
      } else if (process.traceDeprecation) {
        console.trace(msg);
      } else {
        console.error(msg);
      }
      warned = true;
    }
    return fn.apply(this, arguments);
  }

  return deprecated;
};


var debugs = {};
var debugEnviron;
exports.debuglog = function(set) {
  if (isUndefined(debugEnviron))
    debugEnviron = process.env.NODE_DEBUG || '';
  set = set.toUpperCase();
  if (!debugs[set]) {
    if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
      var pid = process.pid;
      debugs[set] = function() {
        var msg = exports.format.apply(exports, arguments);
        console.error('%s %d: %s', set, pid, msg);
      };
    } else {
      debugs[set] = function() {};
    }
  }
  return debugs[set];
};


/**
 * Echos the value of a value. Trys to print the value out
 * in the best way possible given the different types.
 *
 * @param {Object} obj The object to print out.
 * @param {Object} opts Optional options object that alters the output.
 */
/* legacy: obj, showHidden, depth, colors*/
function inspect(obj, opts) {
  // default options
  var ctx = {
    seen: [],
    stylize: stylizeNoColor
  };
  // legacy...
  if (arguments.length >= 3) ctx.depth = arguments[2];
  if (arguments.length >= 4) ctx.colors = arguments[3];
  if (isBoolean(opts)) {
    // legacy...
    ctx.showHidden = opts;
  } else if (opts) {
    // got an "options" object
    exports._extend(ctx, opts);
  }
  // set default options
  if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
  if (isUndefined(ctx.depth)) ctx.depth = 2;
  if (isUndefined(ctx.colors)) ctx.colors = false;
  if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
  if (ctx.colors) ctx.stylize = stylizeWithColor;
  return formatValue(ctx, obj, ctx.depth);
}
exports.inspect = inspect;


// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
inspect.colors = {
  'bold' : [1, 22],
  'italic' : [3, 23],
  'underline' : [4, 24],
  'inverse' : [7, 27],
  'white' : [37, 39],
  'grey' : [90, 39],
  'black' : [30, 39],
  'blue' : [34, 39],
  'cyan' : [36, 39],
  'green' : [32, 39],
  'magenta' : [35, 39],
  'red' : [31, 39],
  'yellow' : [33, 39]
};

// Don't use 'blue' not visible on cmd.exe
inspect.styles = {
  'special': 'cyan',
  'number': 'yellow',
  'boolean': 'yellow',
  'undefined': 'grey',
  'null': 'bold',
  'string': 'green',
  'date': 'magenta',
  // "name": intentionally not styling
  'regexp': 'red'
};


function stylizeWithColor(str, styleType) {
  var style = inspect.styles[styleType];

  if (style) {
    return '\u001b[' + inspect.colors[style][0] + 'm' + str +
           '\u001b[' + inspect.colors[style][1] + 'm';
  } else {
    return str;
  }
}


function stylizeNoColor(str, styleType) {
  return str;
}


function arrayToHash(array) {
  var hash = {};

  array.forEach(function(val, idx) {
    hash[val] = true;
  });

  return hash;
}


function formatValue(ctx, value, recurseTimes) {
  // Provide a hook for user-specified inspect functions.
  // Check that value is an object with an inspect function on it
  if (ctx.customInspect &&
      value &&
      isFunction(value.inspect) &&
      // Filter out the util module, it's inspect function is special
      value.inspect !== exports.inspect &&
      // Also filter out any prototype objects using the circular check.
      !(value.constructor && value.constructor.prototype === value)) {
    var ret = value.inspect(recurseTimes, ctx);
    if (!isString(ret)) {
      ret = formatValue(ctx, ret, recurseTimes);
    }
    return ret;
  }

  // Primitive types cannot have properties
  var primitive = formatPrimitive(ctx, value);
  if (primitive) {
    return primitive;
  }

  // Look up the keys of the object.
  var keys = Object.keys(value);
  var visibleKeys = arrayToHash(keys);

  if (ctx.showHidden) {
    keys = Object.getOwnPropertyNames(value);
  }

  // IE doesn't make error fields non-enumerable
  // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
  if (isError(value)
      && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
    return formatError(value);
  }

  // Some type of object without properties can be shortcutted.
  if (keys.length === 0) {
    if (isFunction(value)) {
      var name = value.name ? ': ' + value.name : '';
      return ctx.stylize('[Function' + name + ']', 'special');
    }
    if (isRegExp(value)) {
      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
    }
    if (isDate(value)) {
      return ctx.stylize(Date.prototype.toString.call(value), 'date');
    }
    if (isError(value)) {
      return formatError(value);
    }
  }

  var base = '', array = false, braces = ['{', '}'];

  // Make Array say that they are Array
  if (isArray(value)) {
    array = true;
    braces = ['[', ']'];
  }

  // Make functions say that they are functions
  if (isFunction(value)) {
    var n = value.name ? ': ' + value.name : '';
    base = ' [Function' + n + ']';
  }

  // Make RegExps say that they are RegExps
  if (isRegExp(value)) {
    base = ' ' + RegExp.prototype.toString.call(value);
  }

  // Make dates with properties first say the date
  if (isDate(value)) {
    base = ' ' + Date.prototype.toUTCString.call(value);
  }

  // Make error with message first say the error
  if (isError(value)) {
    base = ' ' + formatError(value);
  }

  if (keys.length === 0 && (!array || value.length == 0)) {
    return braces[0] + base + braces[1];
  }

  if (recurseTimes < 0) {
    if (isRegExp(value)) {
      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
    } else {
      return ctx.stylize('[Object]', 'special');
    }
  }

  ctx.seen.push(value);

  var output;
  if (array) {
    output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
  } else {
    output = keys.map(function(key) {
      return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
    });
  }

  ctx.seen.pop();

  return reduceToSingleString(output, base, braces);
}


function formatPrimitive(ctx, value) {
  if (isUndefined(value))
    return ctx.stylize('undefined', 'undefined');
  if (isString(value)) {
    var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
                                             .replace(/'/g, "\\'")
                                             .replace(/\\"/g, '"') + '\'';
    return ctx.stylize(simple, 'string');
  }
  if (isNumber(value))
    return ctx.stylize('' + value, 'number');
  if (isBoolean(value))
    return ctx.stylize('' + value, 'boolean');
  // For some reason typeof null is "object", so special case here.
  if (isNull(value))
    return ctx.stylize('null', 'null');
}


function formatError(value) {
  return '[' + Error.prototype.toString.call(value) + ']';
}


function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
  var output = [];
  for (var i = 0, l = value.length; i < l; ++i) {
    if (hasOwnProperty(value, String(i))) {
      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
          String(i), true));
    } else {
      output.push('');
    }
  }
  keys.forEach(function(key) {
    if (!key.match(/^\d+$/)) {
      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
          key, true));
    }
  });
  return output;
}


function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
  var name, str, desc;
  desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
  if (desc.get) {
    if (desc.set) {
      str = ctx.stylize('[Getter/Setter]', 'special');
    } else {
      str = ctx.stylize('[Getter]', 'special');
    }
  } else {
    if (desc.set) {
      str = ctx.stylize('[Setter]', 'special');
    }
  }
  if (!hasOwnProperty(visibleKeys, key)) {
    name = '[' + key + ']';
  }
  if (!str) {
    if (ctx.seen.indexOf(desc.value) < 0) {
      if (isNull(recurseTimes)) {
        str = formatValue(ctx, desc.value, null);
      } else {
        str = formatValue(ctx, desc.value, recurseTimes - 1);
      }
      if (str.indexOf('\n') > -1) {
        if (array) {
          str = str.split('\n').map(function(line) {
            return '  ' + line;
          }).join('\n').substr(2);
        } else {
          str = '\n' + str.split('\n').map(function(line) {
            return '   ' + line;
          }).join('\n');
        }
      }
    } else {
      str = ctx.stylize('[Circular]', 'special');
    }
  }
  if (isUndefined(name)) {
    if (array && key.match(/^\d+$/)) {
      return str;
    }
    name = JSON.stringify('' + key);
    if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
      name = name.substr(1, name.length - 2);
      name = ctx.stylize(name, 'name');
    } else {
      name = name.replace(/'/g, "\\'")
                 .replace(/\\"/g, '"')
                 .replace(/(^"|"$)/g, "'");
      name = ctx.stylize(name, 'string');
    }
  }

  return name + ': ' + str;
}


function reduceToSingleString(output, base, braces) {
  var numLinesEst = 0;
  var length = output.reduce(function(prev, cur) {
    numLinesEst++;
    if (cur.indexOf('\n') >= 0) numLinesEst++;
    return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
  }, 0);

  if (length > 60) {
    return braces[0] +
           (base === '' ? '' : base + '\n ') +
           ' ' +
           output.join(',\n  ') +
           ' ' +
           braces[1];
  }

  return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
}


// NOTE: These type checking functions intentionally don't use `instanceof`
// because it is fragile and can be easily faked with `Object.create()`.
function isArray(ar) {
  return Array.isArray(ar);
}
exports.isArray = isArray;

function isBoolean(arg) {
  return typeof arg === 'boolean';
}
exports.isBoolean = isBoolean;

function isNull(arg) {
  return arg === null;
}
exports.isNull = isNull;

function isNullOrUndefined(arg) {
  return arg == null;
}
exports.isNullOrUndefined = isNullOrUndefined;

function isNumber(arg) {
  return typeof arg === 'number';
}
exports.isNumber = isNumber;

function isString(arg) {
  return typeof arg === 'string';
}
exports.isString = isString;

function isSymbol(arg) {
  return typeof arg === 'symbol';
}
exports.isSymbol = isSymbol;

function isUndefined(arg) {
  return arg === void 0;
}
exports.isUndefined = isUndefined;

function isRegExp(re) {
  return isObject(re) && objectToString(re) === '[object RegExp]';
}
exports.isRegExp = isRegExp;

function isObject(arg) {
  return typeof arg === 'object' && arg !== null;
}
exports.isObject = isObject;

function isDate(d) {
  return isObject(d) && objectToString(d) === '[object Date]';
}
exports.isDate = isDate;

function isError(e) {
  return isObject(e) &&
      (objectToString(e) === '[object Error]' || e instanceof Error);
}
exports.isError = isError;

function isFunction(arg) {
  return typeof arg === 'function';
}
exports.isFunction = isFunction;

function isPrimitive(arg) {
  return arg === null ||
         typeof arg === 'boolean' ||
         typeof arg === 'number' ||
         typeof arg === 'string' ||
         typeof arg === 'symbol' ||  // ES6 symbol
         typeof arg === 'undefined';
}
exports.isPrimitive = isPrimitive;

exports.isBuffer = require('./support/isBuffer');

function objectToString(o) {
  return Object.prototype.toString.call(o);
}


function pad(n) {
  return n < 10 ? '0' + n.toString(10) : n.toString(10);
}


var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
              'Oct', 'Nov', 'Dec'];

// 26 Feb 16:19:34
function timestamp() {
  var d = new Date();
  var time = [pad(d.getHours()),
              pad(d.getMinutes()),
              pad(d.getSeconds())].join(':');
  return [d.getDate(), months[d.getMonth()], time].join(' ');
}


// log is just a thin wrapper to console.log that prepends a timestamp
exports.log = function() {
  console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
};


/**
 * Inherit the prototype methods from one constructor into another.
 *
 * The Function.prototype.inherits from lang.js rewritten as a standalone
 * function (not on Function.prototype). NOTE: If this file is to be loaded
 * during bootstrapping this function needs to be rewritten using some native
 * functions as prototype setup using normal JavaScript does not work as
 * expected during bootstrapping (see mirror.js in r114903).
 *
 * @param {function} ctor Constructor function which needs to inherit the
 *     prototype.
 * @param {function} superCtor Constructor function to inherit prototype from.
 */
exports.inherits = require('inherits');

exports._extend = function(origin, add) {
  // Don't do anything if add isn't an object
  if (!add || !isObject(add)) return origin;

  var keys = Object.keys(add);
  var i = keys.length;
  while (i--) {
    origin[keys[i]] = add[keys[i]];
  }
  return origin;
};

function hasOwnProperty(obj, prop) {
  return Object.prototype.hasOwnProperty.call(obj, prop);
}

}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{"./support/isBuffer":19,"_process":18,"inherits":16}],"buffer":[function(require,module,exports){
(function (Buffer){
/*!
 * The buffer module from node.js, for the browser.
 *
 * @author   Feross Aboukhadijeh <https://feross.org>
 * @license  MIT
 */
/* eslint-disable no-proto */

'use strict'

var base64 = require('base64-js')
var ieee754 = require('ieee754')
var customInspectSymbol =
  (typeof Symbol === 'function' && typeof Symbol.for === 'function')
    ? Symbol.for('nodejs.util.inspect.custom')
    : null

exports.Buffer = Buffer
exports.SlowBuffer = SlowBuffer
exports.INSPECT_MAX_BYTES = 50

var K_MAX_LENGTH = 0x7fffffff
exports.kMaxLength = K_MAX_LENGTH

/**
 * If `Buffer.TYPED_ARRAY_SUPPORT`:
 *   === true    Use Uint8Array implementation (fastest)
 *   === false   Print warning and recommend using `buffer` v4.x which has an Object
 *               implementation (most compatible, even IE6)
 *
 * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
 * Opera 11.6+, iOS 4.2+.
 *
 * We report that the browser does not support typed arrays if the are not subclassable
 * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`
 * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support
 * for __proto__ and has a buggy typed array implementation.
 */
Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport()

if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&
    typeof console.error === 'function') {
  console.error(
    'This browser lacks typed array (Uint8Array) support which is required by ' +
    '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'
  )
}

function typedArraySupport () {
  // Can typed array instances can be augmented?
  try {
    var arr = new Uint8Array(1)
    var proto = { foo: function () { return 42 } }
    Object.setPrototypeOf(proto, Uint8Array.prototype)
    Object.setPrototypeOf(arr, proto)
    return arr.foo() === 42
  } catch (e) {
    return false
  }
}

Object.defineProperty(Buffer.prototype, 'parent', {
  enumerable: true,
  get: function () {
    if (!Buffer.isBuffer(this)) return undefined
    return this.buffer
  }
})

Object.defineProperty(Buffer.prototype, 'offset', {
  enumerable: true,
  get: function () {
    if (!Buffer.isBuffer(this)) return undefined
    return this.byteOffset
  }
})

function createBuffer (length) {
  if (length > K_MAX_LENGTH) {
    throw new RangeError('The value "' + length + '" is invalid for option "size"')
  }
  // Return an augmented `Uint8Array` instance
  var buf = new Uint8Array(length)
  Object.setPrototypeOf(buf, Buffer.prototype)
  return buf
}

/**
 * The Buffer constructor returns instances of `Uint8Array` that have their
 * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
 * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
 * and the `Uint8Array` methods. Square bracket notation works as expected -- it
 * returns a single octet.
 *
 * The `Uint8Array` prototype remains unmodified.
 */

function Buffer (arg, encodingOrOffset, length) {
  // Common case.
  if (typeof arg === 'number') {
    if (typeof encodingOrOffset === 'string') {
      throw new TypeError(
        'The "string" argument must be of type string. Received type number'
      )
    }
    return allocUnsafe(arg)
  }
  return from(arg, encodingOrOffset, length)
}

// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
if (typeof Symbol !== 'undefined' && Symbol.species != null &&
    Buffer[Symbol.species] === Buffer) {
  Object.defineProperty(Buffer, Symbol.species, {
    value: null,
    configurable: true,
    enumerable: false,
    writable: false
  })
}

Buffer.poolSize = 8192 // not used by this implementation

function from (value, encodingOrOffset, length) {
  if (typeof value === 'string') {
    return fromString(value, encodingOrOffset)
  }

  if (ArrayBuffer.isView(value)) {
    return fromArrayLike(value)
  }

  if (value == null) {
    throw new TypeError(
      'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
      'or Array-like Object. Received type ' + (typeof value)
    )
  }

  if (isInstance(value, ArrayBuffer) ||
      (value && isInstance(value.buffer, ArrayBuffer))) {
    return fromArrayBuffer(value, encodingOrOffset, length)
  }

  if (typeof SharedArrayBuffer !== 'undefined' &&
      (isInstance(value, SharedArrayBuffer) ||
      (value && isInstance(value.buffer, SharedArrayBuffer)))) {
    return fromArrayBuffer(value, encodingOrOffset, length)
  }

  if (typeof value === 'number') {
    throw new TypeError(
      'The "value" argument must not be of type number. Received type number'
    )
  }

  var valueOf = value.valueOf && value.valueOf()
  if (valueOf != null && valueOf !== value) {
    return Buffer.from(valueOf, encodingOrOffset, length)
  }

  var b = fromObject(value)
  if (b) return b

  if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&
      typeof value[Symbol.toPrimitive] === 'function') {
    return Buffer.from(
      value[Symbol.toPrimitive]('string'), encodingOrOffset, length
    )
  }

  throw new TypeError(
    'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
    'or Array-like Object. Received type ' + (typeof value)
  )
}

/**
 * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
 * if value is a number.
 * Buffer.from(str[, encoding])
 * Buffer.from(array)
 * Buffer.from(buffer)
 * Buffer.from(arrayBuffer[, byteOffset[, length]])
 **/
Buffer.from = function (value, encodingOrOffset, length) {
  return from(value, encodingOrOffset, length)
}

// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:
// https://github.com/feross/buffer/pull/148
Object.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)
Object.setPrototypeOf(Buffer, Uint8Array)

function assertSize (size) {
  if (typeof size !== 'number') {
    throw new TypeError('"size" argument must be of type number')
  } else if (size < 0) {
    throw new RangeError('The value "' + size + '" is invalid for option "size"')
  }
}

function alloc (size, fill, encoding) {
  assertSize(size)
  if (size <= 0) {
    return createBuffer(size)
  }
  if (fill !== undefined) {
    // Only pay attention to encoding if it's a string. This
    // prevents accidentally sending in a number that would
    // be interpretted as a start offset.
    return typeof encoding === 'string'
      ? createBuffer(size).fill(fill, encoding)
      : createBuffer(size).fill(fill)
  }
  return createBuffer(size)
}

/**
 * Creates a new filled Buffer instance.
 * alloc(size[, fill[, encoding]])
 **/
Buffer.alloc = function (size, fill, encoding) {
  return alloc(size, fill, encoding)
}

function allocUnsafe (size) {
  assertSize(size)
  return createBuffer(size < 0 ? 0 : checked(size) | 0)
}

/**
 * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
 * */
Buffer.allocUnsafe = function (size) {
  return allocUnsafe(size)
}
/**
 * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
 */
Buffer.allocUnsafeSlow = function (size) {
  return allocUnsafe(size)
}

function fromString (string, encoding) {
  if (typeof encoding !== 'string' || encoding === '') {
    encoding = 'utf8'
  }

  if (!Buffer.isEncoding(encoding)) {
    throw new TypeError('Unknown encoding: ' + encoding)
  }

  var length = byteLength(string, encoding) | 0
  var buf = createBuffer(length)

  var actual = buf.write(string, encoding)

  if (actual !== length) {
    // Writing a hex string, for example, that contains invalid characters will
    // cause everything after the first invalid character to be ignored. (e.g.
    // 'abxxcd' will be treated as 'ab')
    buf = buf.slice(0, actual)
  }

  return buf
}

function fromArrayLike (array) {
  var length = array.length < 0 ? 0 : checked(array.length) | 0
  var buf = createBuffer(length)
  for (var i = 0; i < length; i += 1) {
    buf[i] = array[i] & 255
  }
  return buf
}

function fromArrayBuffer (array, byteOffset, length) {
  if (byteOffset < 0 || array.byteLength < byteOffset) {
    throw new RangeError('"offset" is outside of buffer bounds')
  }

  if (array.byteLength < byteOffset + (length || 0)) {
    throw new RangeError('"length" is outside of buffer bounds')
  }

  var buf
  if (byteOffset === undefined && length === undefined) {
    buf = new Uint8Array(array)
  } else if (length === undefined) {
    buf = new Uint8Array(array, byteOffset)
  } else {
    buf = new Uint8Array(array, byteOffset, length)
  }

  // Return an augmented `Uint8Array` instance
  Object.setPrototypeOf(buf, Buffer.prototype)

  return buf
}

function fromObject (obj) {
  if (Buffer.isBuffer(obj)) {
    var len = checked(obj.length) | 0
    var buf = createBuffer(len)

    if (buf.length === 0) {
      return buf
    }

    obj.copy(buf, 0, 0, len)
    return buf
  }

  if (obj.length !== undefined) {
    if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {
      return createBuffer(0)
    }
    return fromArrayLike(obj)
  }

  if (obj.type === 'Buffer' && Array.isArray(obj.data)) {
    return fromArrayLike(obj.data)
  }
}

function checked (length) {
  // Note: cannot use `length < K_MAX_LENGTH` here because that fails when
  // length is NaN (which is otherwise coerced to zero.)
  if (length >= K_MAX_LENGTH) {
    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
                         'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')
  }
  return length | 0
}

function SlowBuffer (length) {
  if (+length != length) { // eslint-disable-line eqeqeq
    length = 0
  }
  return Buffer.alloc(+length)
}

Buffer.isBuffer = function isBuffer (b) {
  return b != null && b._isBuffer === true &&
    b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false
}

Buffer.compare = function compare (a, b) {
  if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)
  if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)
  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
    throw new TypeError(
      'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array'
    )
  }

  if (a === b) return 0

  var x = a.length
  var y = b.length

  for (var i = 0, len = Math.min(x, y); i < len; ++i) {
    if (a[i] !== b[i]) {
      x = a[i]
      y = b[i]
      break
    }
  }

  if (x < y) return -1
  if (y < x) return 1
  return 0
}

Buffer.isEncoding = function isEncoding (encoding) {
  switch (String(encoding).toLowerCase()) {
    case 'hex':
    case 'utf8':
    case 'utf-8':
    case 'ascii':
    case 'latin1':
    case 'binary':
    case 'base64':
    case 'ucs2':
    case 'ucs-2':
    case 'utf16le':
    case 'utf-16le':
      return true
    default:
      return false
  }
}

Buffer.concat = function concat (list, length) {
  if (!Array.isArray(list)) {
    throw new TypeError('"list" argument must be an Array of Buffers')
  }

  if (list.length === 0) {
    return Buffer.alloc(0)
  }

  var i
  if (length === undefined) {
    length = 0
    for (i = 0; i < list.length; ++i) {
      length += list[i].length
    }
  }

  var buffer = Buffer.allocUnsafe(length)
  var pos = 0
  for (i = 0; i < list.length; ++i) {
    var buf = list[i]
    if (isInstance(buf, Uint8Array)) {
      buf = Buffer.from(buf)
    }
    if (!Buffer.isBuffer(buf)) {
      throw new TypeError('"list" argument must be an Array of Buffers')
    }
    buf.copy(buffer, pos)
    pos += buf.length
  }
  return buffer
}

function byteLength (string, encoding) {
  if (Buffer.isBuffer(string)) {
    return string.length
  }
  if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {
    return string.byteLength
  }
  if (typeof string !== 'string') {
    throw new TypeError(
      'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' +
      'Received type ' + typeof string
    )
  }

  var len = string.length
  var mustMatch = (arguments.length > 2 && arguments[2] === true)
  if (!mustMatch && len === 0) return 0

  // Use a for loop to avoid recursion
  var loweredCase = false
  for (;;) {
    switch (encoding) {
      case 'ascii':
      case 'latin1':
      case 'binary':
        return len
      case 'utf8':
      case 'utf-8':
        return utf8ToBytes(string).length
      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return len * 2
      case 'hex':
        return len >>> 1
      case 'base64':
        return base64ToBytes(string).length
      default:
        if (loweredCase) {
          return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8
        }
        encoding = ('' + encoding).toLowerCase()
        loweredCase = true
    }
  }
}
Buffer.byteLength = byteLength

function slowToString (encoding, start, end) {
  var loweredCase = false

  // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
  // property of a typed array.

  // This behaves neither like String nor Uint8Array in that we set start/end
  // to their upper/lower bounds if the value passed is out of range.
  // undefined is handled specially as per ECMA-262 6th Edition,
  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
  if (start === undefined || start < 0) {
    start = 0
  }
  // Return early if start > this.length. Done here to prevent potential uint32
  // coercion fail below.
  if (start > this.length) {
    return ''
  }

  if (end === undefined || end > this.length) {
    end = this.length
  }

  if (end <= 0) {
    return ''
  }

  // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
  end >>>= 0
  start >>>= 0

  if (end <= start) {
    return ''
  }

  if (!encoding) encoding = 'utf8'

  while (true) {
    switch (encoding) {
      case 'hex':
        return hexSlice(this, start, end)

      case 'utf8':
      case 'utf-8':
        return utf8Slice(this, start, end)

      case 'ascii':
        return asciiSlice(this, start, end)

      case 'latin1':
      case 'binary':
        return latin1Slice(this, start, end)

      case 'base64':
        return base64Slice(this, start, end)

      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return utf16leSlice(this, start, end)

      default:
        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
        encoding = (encoding + '').toLowerCase()
        loweredCase = true
    }
  }
}

// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)
// to detect a Buffer instance. It's not possible to use `instanceof Buffer`
// reliably in a browserify context because there could be multiple different
// copies of the 'buffer' package in use. This method works even for Buffer
// instances that were created from another copy of the `buffer` package.
// See: https://github.com/feross/buffer/issues/154
Buffer.prototype._isBuffer = true

function swap (b, n, m) {
  var i = b[n]
  b[n] = b[m]
  b[m] = i
}

Buffer.prototype.swap16 = function swap16 () {
  var len = this.length
  if (len % 2 !== 0) {
    throw new RangeError('Buffer size must be a multiple of 16-bits')
  }
  for (var i = 0; i < len; i += 2) {
    swap(this, i, i + 1)
  }
  return this
}

Buffer.prototype.swap32 = function swap32 () {
  var len = this.length
  if (len % 4 !== 0) {
    throw new RangeError('Buffer size must be a multiple of 32-bits')
  }
  for (var i = 0; i < len; i += 4) {
    swap(this, i, i + 3)
    swap(this, i + 1, i + 2)
  }
  return this
}

Buffer.prototype.swap64 = function swap64 () {
  var len = this.length
  if (len % 8 !== 0) {
    throw new RangeError('Buffer size must be a multiple of 64-bits')
  }
  for (var i = 0; i < len; i += 8) {
    swap(this, i, i + 7)
    swap(this, i + 1, i + 6)
    swap(this, i + 2, i + 5)
    swap(this, i + 3, i + 4)
  }
  return this
}

Buffer.prototype.toString = function toString () {
  var length = this.length
  if (length === 0) return ''
  if (arguments.length === 0) return utf8Slice(this, 0, length)
  return slowToString.apply(this, arguments)
}

Buffer.prototype.toLocaleString = Buffer.prototype.toString

Buffer.prototype.equals = function equals (b) {
  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
  if (this === b) return true
  return Buffer.compare(this, b) === 0
}

Buffer.prototype.inspect = function inspect () {
  var str = ''
  var max = exports.INSPECT_MAX_BYTES
  str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()
  if (this.length > max) str += ' ... '
  return '<Buffer ' + str + '>'
}
if (customInspectSymbol) {
  Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect
}

Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
  if (isInstance(target, Uint8Array)) {
    target = Buffer.from(target, target.offset, target.byteLength)
  }
  if (!Buffer.isBuffer(target)) {
    throw new TypeError(
      'The "target" argument must be one of type Buffer or Uint8Array. ' +
      'Received type ' + (typeof target)
    )
  }

  if (start === undefined) {
    start = 0
  }
  if (end === undefined) {
    end = target ? target.length : 0
  }
  if (thisStart === undefined) {
    thisStart = 0
  }
  if (thisEnd === undefined) {
    thisEnd = this.length
  }

  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
    throw new RangeError('out of range index')
  }

  if (thisStart >= thisEnd && start >= end) {
    return 0
  }
  if (thisStart >= thisEnd) {
    return -1
  }
  if (start >= end) {
    return 1
  }

  start >>>= 0
  end >>>= 0
  thisStart >>>= 0
  thisEnd >>>= 0

  if (this === target) return 0

  var x = thisEnd - thisStart
  var y = end - start
  var len = Math.min(x, y)

  var thisCopy = this.slice(thisStart, thisEnd)
  var targetCopy = target.slice(start, end)

  for (var i = 0; i < len; ++i) {
    if (thisCopy[i] !== targetCopy[i]) {
      x = thisCopy[i]
      y = targetCopy[i]
      break
    }
  }

  if (x < y) return -1
  if (y < x) return 1
  return 0
}

// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
//
// Arguments:
// - buffer - a Buffer to search
// - val - a string, Buffer, or number
// - byteOffset - an index into `buffer`; will be clamped to an int32
// - encoding - an optional encoding, relevant is val is a string
// - dir - true for indexOf, false for lastIndexOf
function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
  // Empty buffer means no match
  if (buffer.length === 0) return -1

  // Normalize byteOffset
  if (typeof byteOffset === 'string') {
    encoding = byteOffset
    byteOffset = 0
  } else if (byteOffset > 0x7fffffff) {
    byteOffset = 0x7fffffff
  } else if (byteOffset < -0x80000000) {
    byteOffset = -0x80000000
  }
  byteOffset = +byteOffset // Coerce to Number.
  if (numberIsNaN(byteOffset)) {
    // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
    byteOffset = dir ? 0 : (buffer.length - 1)
  }

  // Normalize byteOffset: negative offsets start from the end of the buffer
  if (byteOffset < 0) byteOffset = buffer.length + byteOffset
  if (byteOffset >= buffer.length) {
    if (dir) return -1
    else byteOffset = buffer.length - 1
  } else if (byteOffset < 0) {
    if (dir) byteOffset = 0
    else return -1
  }

  // Normalize val
  if (typeof val === 'string') {
    val = Buffer.from(val, encoding)
  }

  // Finally, search either indexOf (if dir is true) or lastIndexOf
  if (Buffer.isBuffer(val)) {
    // Special case: looking for empty string/buffer always fails
    if (val.length === 0) {
      return -1
    }
    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
  } else if (typeof val === 'number') {
    val = val & 0xFF // Search for a byte value [0-255]
    if (typeof Uint8Array.prototype.indexOf === 'function') {
      if (dir) {
        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
      } else {
        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
      }
    }
    return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)
  }

  throw new TypeError('val must be string, number or Buffer')
}

function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
  var indexSize = 1
  var arrLength = arr.length
  var valLength = val.length

  if (encoding !== undefined) {
    encoding = String(encoding).toLowerCase()
    if (encoding === 'ucs2' || encoding === 'ucs-2' ||
        encoding === 'utf16le' || encoding === 'utf-16le') {
      if (arr.length < 2 || val.length < 2) {
        return -1
      }
      indexSize = 2
      arrLength /= 2
      valLength /= 2
      byteOffset /= 2
    }
  }

  function read (buf, i) {
    if (indexSize === 1) {
      return buf[i]
    } else {
      return buf.readUInt16BE(i * indexSize)
    }
  }

  var i
  if (dir) {
    var foundIndex = -1
    for (i = byteOffset; i < arrLength; i++) {
      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
        if (foundIndex === -1) foundIndex = i
        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
      } else {
        if (foundIndex !== -1) i -= i - foundIndex
        foundIndex = -1
      }
    }
  } else {
    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
    for (i = byteOffset; i >= 0; i--) {
      var found = true
      for (var j = 0; j < valLength; j++) {
        if (read(arr, i + j) !== read(val, j)) {
          found = false
          break
        }
      }
      if (found) return i
    }
  }

  return -1
}

Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
  return this.indexOf(val, byteOffset, encoding) !== -1
}

Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
}

Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
}

function hexWrite (buf, string, offset, length) {
  offset = Number(offset) || 0
  var remaining = buf.length - offset
  if (!length) {
    length = remaining
  } else {
    length = Number(length)
    if (length > remaining) {
      length = remaining
    }
  }

  var strLen = string.length

  if (length > strLen / 2) {
    length = strLen / 2
  }
  for (var i = 0; i < length; ++i) {
    var parsed = parseInt(string.substr(i * 2, 2), 16)
    if (numberIsNaN(parsed)) return i
    buf[offset + i] = parsed
  }
  return i
}

function utf8Write (buf, string, offset, length) {
  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
}

function asciiWrite (buf, string, offset, length) {
  return blitBuffer(asciiToBytes(string), buf, offset, length)
}

function latin1Write (buf, string, offset, length) {
  return asciiWrite(buf, string, offset, length)
}

function base64Write (buf, string, offset, length) {
  return blitBuffer(base64ToBytes(string), buf, offset, length)
}

function ucs2Write (buf, string, offset, length) {
  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
}

Buffer.prototype.write = function write (string, offset, length, encoding) {
  // Buffer#write(string)
  if (offset === undefined) {
    encoding = 'utf8'
    length = this.length
    offset = 0
  // Buffer#write(string, encoding)
  } else if (length === undefined && typeof offset === 'string') {
    encoding = offset
    length = this.length
    offset = 0
  // Buffer#write(string, offset[, length][, encoding])
  } else if (isFinite(offset)) {
    offset = offset >>> 0
    if (isFinite(length)) {
      length = length >>> 0
      if (encoding === undefined) encoding = 'utf8'
    } else {
      encoding = length
      length = undefined
    }
  } else {
    throw new Error(
      'Buffer.write(string, encoding, offset[, length]) is no longer supported'
    )
  }

  var remaining = this.length - offset
  if (length === undefined || length > remaining) length = remaining

  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
    throw new RangeError('Attempt to write outside buffer bounds')
  }

  if (!encoding) encoding = 'utf8'

  var loweredCase = false
  for (;;) {
    switch (encoding) {
      case 'hex':
        return hexWrite(this, string, offset, length)

      case 'utf8':
      case 'utf-8':
        return utf8Write(this, string, offset, length)

      case 'ascii':
        return asciiWrite(this, string, offset, length)

      case 'latin1':
      case 'binary':
        return latin1Write(this, string, offset, length)

      case 'base64':
        // Warning: maxLength not taken into account in base64Write
        return base64Write(this, string, offset, length)

      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return ucs2Write(this, string, offset, length)

      default:
        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
        encoding = ('' + encoding).toLowerCase()
        loweredCase = true
    }
  }
}

Buffer.prototype.toJSON = function toJSON () {
  return {
    type: 'Buffer',
    data: Array.prototype.slice.call(this._arr || this, 0)
  }
}

function base64Slice (buf, start, end) {
  if (start === 0 && end === buf.length) {
    return base64.fromByteArray(buf)
  } else {
    return base64.fromByteArray(buf.slice(start, end))
  }
}

function utf8Slice (buf, start, end) {
  end = Math.min(buf.length, end)
  var res = []

  var i = start
  while (i < end) {
    var firstByte = buf[i]
    var codePoint = null
    var bytesPerSequence = (firstByte > 0xEF) ? 4
      : (firstByte > 0xDF) ? 3
        : (firstByte > 0xBF) ? 2
          : 1

    if (i + bytesPerSequence <= end) {
      var secondByte, thirdByte, fourthByte, tempCodePoint

      switch (bytesPerSequence) {
        case 1:
          if (firstByte < 0x80) {
            codePoint = firstByte
          }
          break
        case 2:
          secondByte = buf[i + 1]
          if ((secondByte & 0xC0) === 0x80) {
            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
            if (tempCodePoint > 0x7F) {
              codePoint = tempCodePoint
            }
          }
          break
        case 3:
          secondByte = buf[i + 1]
          thirdByte = buf[i + 2]
          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
              codePoint = tempCodePoint
            }
          }
          break
        case 4:
          secondByte = buf[i + 1]
          thirdByte = buf[i + 2]
          fourthByte = buf[i + 3]
          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
              codePoint = tempCodePoint
            }
          }
      }
    }

    if (codePoint === null) {
      // we did not generate a valid codePoint so insert a
      // replacement char (U+FFFD) and advance only 1 byte
      codePoint = 0xFFFD
      bytesPerSequence = 1
    } else if (codePoint > 0xFFFF) {
      // encode to utf16 (surrogate pair dance)
      codePoint -= 0x10000
      res.push(codePoint >>> 10 & 0x3FF | 0xD800)
      codePoint = 0xDC00 | codePoint & 0x3FF
    }

    res.push(codePoint)
    i += bytesPerSequence
  }

  return decodeCodePointsArray(res)
}

// Based on http://stackoverflow.com/a/22747272/680742, the browser with
// the lowest limit is Chrome, with 0x10000 args.
// We go 1 magnitude less, for safety
var MAX_ARGUMENTS_LENGTH = 0x1000

function decodeCodePointsArray (codePoints) {
  var len = codePoints.length
  if (len <= MAX_ARGUMENTS_LENGTH) {
    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
  }

  // Decode in chunks to avoid "call stack size exceeded".
  var res = ''
  var i = 0
  while (i < len) {
    res += String.fromCharCode.apply(
      String,
      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
    )
  }
  return res
}

function asciiSlice (buf, start, end) {
  var ret = ''
  end = Math.min(buf.length, end)

  for (var i = start; i < end; ++i) {
    ret += String.fromCharCode(buf[i] & 0x7F)
  }
  return ret
}

function latin1Slice (buf, start, end) {
  var ret = ''
  end = Math.min(buf.length, end)

  for (var i = start; i < end; ++i) {
    ret += String.fromCharCode(buf[i])
  }
  return ret
}

function hexSlice (buf, start, end) {
  var len = buf.length

  if (!start || start < 0) start = 0
  if (!end || end < 0 || end > len) end = len

  var out = ''
  for (var i = start; i < end; ++i) {
    out += hexSliceLookupTable[buf[i]]
  }
  return out
}

function utf16leSlice (buf, start, end) {
  var bytes = buf.slice(start, end)
  var res = ''
  for (var i = 0; i < bytes.length; i += 2) {
    res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))
  }
  return res
}

Buffer.prototype.slice = function slice (start, end) {
  var len = this.length
  start = ~~start
  end = end === undefined ? len : ~~end

  if (start < 0) {
    start += len
    if (start < 0) start = 0
  } else if (start > len) {
    start = len
  }

  if (end < 0) {
    end += len
    if (end < 0) end = 0
  } else if (end > len) {
    end = len
  }

  if (end < start) end = start

  var newBuf = this.subarray(start, end)
  // Return an augmented `Uint8Array` instance
  Object.setPrototypeOf(newBuf, Buffer.prototype)

  return newBuf
}

/*
 * Need to make sure that buffer isn't trying to write out of bounds.
 */
function checkOffset (offset, ext, length) {
  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
}

Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  var val = this[offset]
  var mul = 1
  var i = 0
  while (++i < byteLength && (mul *= 0x100)) {
    val += this[offset + i] * mul
  }

  return val
}

Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) {
    checkOffset(offset, byteLength, this.length)
  }

  var val = this[offset + --byteLength]
  var mul = 1
  while (byteLength > 0 && (mul *= 0x100)) {
    val += this[offset + --byteLength] * mul
  }

  return val
}

Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 1, this.length)
  return this[offset]
}

Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  return this[offset] | (this[offset + 1] << 8)
}

Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  return (this[offset] << 8) | this[offset + 1]
}

Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return ((this[offset]) |
      (this[offset + 1] << 8) |
      (this[offset + 2] << 16)) +
      (this[offset + 3] * 0x1000000)
}

Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset] * 0x1000000) +
    ((this[offset + 1] << 16) |
    (this[offset + 2] << 8) |
    this[offset + 3])
}

Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  var val = this[offset]
  var mul = 1
  var i = 0
  while (++i < byteLength && (mul *= 0x100)) {
    val += this[offset + i] * mul
  }
  mul *= 0x80

  if (val >= mul) val -= Math.pow(2, 8 * byteLength)

  return val
}

Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  var i = byteLength
  var mul = 1
  var val = this[offset + --i]
  while (i > 0 && (mul *= 0x100)) {
    val += this[offset + --i] * mul
  }
  mul *= 0x80

  if (val >= mul) val -= Math.pow(2, 8 * byteLength)

  return val
}

Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 1, this.length)
  if (!(this[offset] & 0x80)) return (this[offset])
  return ((0xff - this[offset] + 1) * -1)
}

Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  var val = this[offset] | (this[offset + 1] << 8)
  return (val & 0x8000) ? val | 0xFFFF0000 : val
}

Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  var val = this[offset + 1] | (this[offset] << 8)
  return (val & 0x8000) ? val | 0xFFFF0000 : val
}

Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset]) |
    (this[offset + 1] << 8) |
    (this[offset + 2] << 16) |
    (this[offset + 3] << 24)
}

Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset] << 24) |
    (this[offset + 1] << 16) |
    (this[offset + 2] << 8) |
    (this[offset + 3])
}

Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)
  return ieee754.read(this, offset, true, 23, 4)
}

Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)
  return ieee754.read(this, offset, false, 23, 4)
}

Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 8, this.length)
  return ieee754.read(this, offset, true, 52, 8)
}

Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 8, this.length)
  return ieee754.read(this, offset, false, 52, 8)
}

function checkInt (buf, value, offset, ext, max, min) {
  if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
  if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
  if (offset + ext > buf.length) throw new RangeError('Index out of range')
}

Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) {
    var maxBytes = Math.pow(2, 8 * byteLength) - 1
    checkInt(this, value, offset, byteLength, maxBytes, 0)
  }

  var mul = 1
  var i = 0
  this[offset] = value & 0xFF
  while (++i < byteLength && (mul *= 0x100)) {
    this[offset + i] = (value / mul) & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) {
    var maxBytes = Math.pow(2, 8 * byteLength) - 1
    checkInt(this, value, offset, byteLength, maxBytes, 0)
  }

  var i = byteLength - 1
  var mul = 1
  this[offset + i] = value & 0xFF
  while (--i >= 0 && (mul *= 0x100)) {
    this[offset + i] = (value / mul) & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
  this[offset] = (value & 0xff)
  return offset + 1
}

Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
  this[offset] = (value & 0xff)
  this[offset + 1] = (value >>> 8)
  return offset + 2
}

Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
  this[offset] = (value >>> 8)
  this[offset + 1] = (value & 0xff)
  return offset + 2
}

Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
  this[offset + 3] = (value >>> 24)
  this[offset + 2] = (value >>> 16)
  this[offset + 1] = (value >>> 8)
  this[offset] = (value & 0xff)
  return offset + 4
}

Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
  this[offset] = (value >>> 24)
  this[offset + 1] = (value >>> 16)
  this[offset + 2] = (value >>> 8)
  this[offset + 3] = (value & 0xff)
  return offset + 4
}

Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    var limit = Math.pow(2, (8 * byteLength) - 1)

    checkInt(this, value, offset, byteLength, limit - 1, -limit)
  }

  var i = 0
  var mul = 1
  var sub = 0
  this[offset] = value & 0xFF
  while (++i < byteLength && (mul *= 0x100)) {
    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
      sub = 1
    }
    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    var limit = Math.pow(2, (8 * byteLength) - 1)

    checkInt(this, value, offset, byteLength, limit - 1, -limit)
  }

  var i = byteLength - 1
  var mul = 1
  var sub = 0
  this[offset + i] = value & 0xFF
  while (--i >= 0 && (mul *= 0x100)) {
    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
      sub = 1
    }
    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
  if (value < 0) value = 0xff + value + 1
  this[offset] = (value & 0xff)
  return offset + 1
}

Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
  this[offset] = (value & 0xff)
  this[offset + 1] = (value >>> 8)
  return offset + 2
}

Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
  this[offset] = (value >>> 8)
  this[offset + 1] = (value & 0xff)
  return offset + 2
}

Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
  this[offset] = (value & 0xff)
  this[offset + 1] = (value >>> 8)
  this[offset + 2] = (value >>> 16)
  this[offset + 3] = (value >>> 24)
  return offset + 4
}

Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
  if (value < 0) value = 0xffffffff + value + 1
  this[offset] = (value >>> 24)
  this[offset + 1] = (value >>> 16)
  this[offset + 2] = (value >>> 8)
  this[offset + 3] = (value & 0xff)
  return offset + 4
}

function checkIEEE754 (buf, value, offset, ext, max, min) {
  if (offset + ext > buf.length) throw new RangeError('Index out of range')
  if (offset < 0) throw new RangeError('Index out of range')
}

function writeFloat (buf, value, offset, littleEndian, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
  }
  ieee754.write(buf, value, offset, littleEndian, 23, 4)
  return offset + 4
}

Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
  return writeFloat(this, value, offset, true, noAssert)
}

Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
  return writeFloat(this, value, offset, false, noAssert)
}

function writeDouble (buf, value, offset, littleEndian, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
  }
  ieee754.write(buf, value, offset, littleEndian, 52, 8)
  return offset + 8
}

Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
  return writeDouble(this, value, offset, true, noAssert)
}

Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
  return writeDouble(this, value, offset, false, noAssert)
}

// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
Buffer.prototype.copy = function copy (target, targetStart, start, end) {
  if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')
  if (!start) start = 0
  if (!end && end !== 0) end = this.length
  if (targetStart >= target.length) targetStart = target.length
  if (!targetStart) targetStart = 0
  if (end > 0 && end < start) end = start

  // Copy 0 bytes; we're done
  if (end === start) return 0
  if (target.length === 0 || this.length === 0) return 0

  // Fatal error conditions
  if (targetStart < 0) {
    throw new RangeError('targetStart out of bounds')
  }
  if (start < 0 || start >= this.length) throw new RangeError('Index out of range')
  if (end < 0) throw new RangeError('sourceEnd out of bounds')

  // Are we oob?
  if (end > this.length) end = this.length
  if (target.length - targetStart < end - start) {
    end = target.length - targetStart + start
  }

  var len = end - start

  if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {
    // Use built-in when available, missing from IE11
    this.copyWithin(targetStart, start, end)
  } else if (this === target && start < targetStart && targetStart < end) {
    // descending copy from end
    for (var i = len - 1; i >= 0; --i) {
      target[i + targetStart] = this[i + start]
    }
  } else {
    Uint8Array.prototype.set.call(
      target,
      this.subarray(start, end),
      targetStart
    )
  }

  return len
}

// Usage:
//    buffer.fill(number[, offset[, end]])
//    buffer.fill(buffer[, offset[, end]])
//    buffer.fill(string[, offset[, end]][, encoding])
Buffer.prototype.fill = function fill (val, start, end, encoding) {
  // Handle string cases:
  if (typeof val === 'string') {
    if (typeof start === 'string') {
      encoding = start
      start = 0
      end = this.length
    } else if (typeof end === 'string') {
      encoding = end
      end = this.length
    }
    if (encoding !== undefined && typeof encoding !== 'string') {
      throw new TypeError('encoding must be a string')
    }
    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
      throw new TypeError('Unknown encoding: ' + encoding)
    }
    if (val.length === 1) {
      var code = val.charCodeAt(0)
      if ((encoding === 'utf8' && code < 128) ||
          encoding === 'latin1') {
        // Fast path: If `val` fits into a single byte, use that numeric value.
        val = code
      }
    }
  } else if (typeof val === 'number') {
    val = val & 255
  } else if (typeof val === 'boolean') {
    val = Number(val)
  }

  // Invalid ranges are not set to a default, so can range check early.
  if (start < 0 || this.length < start || this.length < end) {
    throw new RangeError('Out of range index')
  }

  if (end <= start) {
    return this
  }

  start = start >>> 0
  end = end === undefined ? this.length : end >>> 0

  if (!val) val = 0

  var i
  if (typeof val === 'number') {
    for (i = start; i < end; ++i) {
      this[i] = val
    }
  } else {
    var bytes = Buffer.isBuffer(val)
      ? val
      : Buffer.from(val, encoding)
    var len = bytes.length
    if (len === 0) {
      throw new TypeError('The value "' + val +
        '" is invalid for argument "value"')
    }
    for (i = 0; i < end - start; ++i) {
      this[i + start] = bytes[i % len]
    }
  }

  return this
}

// HELPER FUNCTIONS
// ================

var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g

function base64clean (str) {
  // Node takes equal signs as end of the Base64 encoding
  str = str.split('=')[0]
  // Node strips out invalid characters like \n and \t from the string, base64-js does not
  str = str.trim().replace(INVALID_BASE64_RE, '')
  // Node converts strings with length < 2 to ''
  if (str.length < 2) return ''
  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
  while (str.length % 4 !== 0) {
    str = str + '='
  }
  return str
}

function utf8ToBytes (string, units) {
  units = units || Infinity
  var codePoint
  var length = string.length
  var leadSurrogate = null
  var bytes = []

  for (var i = 0; i < length; ++i) {
    codePoint = string.charCodeAt(i)

    // is surrogate component
    if (codePoint > 0xD7FF && codePoint < 0xE000) {
      // last char was a lead
      if (!leadSurrogate) {
        // no lead yet
        if (codePoint > 0xDBFF) {
          // unexpected trail
          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
          continue
        } else if (i + 1 === length) {
          // unpaired lead
          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
          continue
        }

        // valid lead
        leadSurrogate = codePoint

        continue
      }

      // 2 leads in a row
      if (codePoint < 0xDC00) {
        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
        leadSurrogate = codePoint
        continue
      }

      // valid surrogate pair
      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
    } else if (leadSurrogate) {
      // valid bmp char, but last char was a lead
      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
    }

    leadSurrogate = null

    // encode utf8
    if (codePoint < 0x80) {
      if ((units -= 1) < 0) break
      bytes.push(codePoint)
    } else if (codePoint < 0x800) {
      if ((units -= 2) < 0) break
      bytes.push(
        codePoint >> 0x6 | 0xC0,
        codePoint & 0x3F | 0x80
      )
    } else if (codePoint < 0x10000) {
      if ((units -= 3) < 0) break
      bytes.push(
        codePoint >> 0xC | 0xE0,
        codePoint >> 0x6 & 0x3F | 0x80,
        codePoint & 0x3F | 0x80
      )
    } else if (codePoint < 0x110000) {
      if ((units -= 4) < 0) break
      bytes.push(
        codePoint >> 0x12 | 0xF0,
        codePoint >> 0xC & 0x3F | 0x80,
        codePoint >> 0x6 & 0x3F | 0x80,
        codePoint & 0x3F | 0x80
      )
    } else {
      throw new Error('Invalid code point')
    }
  }

  return bytes
}

function asciiToBytes (str) {
  var byteArray = []
  for (var i = 0; i < str.length; ++i) {
    // Node's code seems to be doing this and not & 0x7F..
    byteArray.push(str.charCodeAt(i) & 0xFF)
  }
  return byteArray
}

function utf16leToBytes (str, units) {
  var c, hi, lo
  var byteArray = []
  for (var i = 0; i < str.length; ++i) {
    if ((units -= 2) < 0) break

    c = str.charCodeAt(i)
    hi = c >> 8
    lo = c % 256
    byteArray.push(lo)
    byteArray.push(hi)
  }

  return byteArray
}

function base64ToBytes (str) {
  return base64.toByteArray(base64clean(str))
}

function blitBuffer (src, dst, offset, length) {
  for (var i = 0; i < length; ++i) {
    if ((i + offset >= dst.length) || (i >= src.length)) break
    dst[i + offset] = src[i]
  }
  return i
}

// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass
// the `instanceof` check but they should be treated as of that type.
// See: https://github.com/feross/buffer/issues/166
function isInstance (obj, type) {
  return obj instanceof type ||
    (obj != null && obj.constructor != null && obj.constructor.name != null &&
      obj.constructor.name === type.name)
}
function numberIsNaN (obj) {
  // For IE11 support
  return obj !== obj // eslint-disable-line no-self-compare
}

// Create lookup table for `toString('hex')`
// See: https://github.com/feross/buffer/issues/219
var hexSliceLookupTable = (function () {
  var alphabet = '0123456789abcdef'
  var table = new Array(256)
  for (var i = 0; i < 16; ++i) {
    var i16 = i * 16
    for (var j = 0; j < 16; ++j) {
      table[i16 + j] = alphabet[i] + alphabet[j]
    }
  }
  return table
})()

}).call(this,require("buffer").Buffer)
},{"base64-js":14,"buffer":"buffer","ieee754":15}],"wkx":[function(require,module,exports){
exports.Types = require('./types');
exports.Geometry = require('./geometry');
exports.Point = require('./point');
exports.LineString = require('./linestring');
exports.Polygon = require('./polygon');
exports.MultiPoint = require('./multipoint');
exports.MultiLineString = require('./multilinestring');
exports.MultiPolygon = require('./multipolygon');
exports.GeometryCollection = require('./geometrycollection');
},{"./geometry":3,"./geometrycollection":4,"./linestring":5,"./multilinestring":6,"./multipoint":7,"./multipolygon":8,"./point":9,"./polygon":10,"./types":11}]},{},["wkx"]);
require=function o(s,a,h){function u(e,t){if(!a[e]){if(!s[e]){var r="function"==typeof require&&require;if(!t&&r)return r(e,!0);if(p)return p(e,!0);var n=new Error("Cannot find module '"+e+"'");throw n.code="MODULE_NOT_FOUND",n}var i=a[e]={exports:{}};s[e][0].call(i.exports,function(t){return u(s[e][1][t]||t)},i,i.exports,o,s,a,h)}return a[e].exports}for(var p="function"==typeof require&&require,t=0;t<h.length;t++)u(h[t]);return u}({1:[function(t,n,e){(function(t){function e(t,e){this.buffer=t,this.position=0,this.isBigEndian=e||!1}function r(e,r,n){return function(){var t;return t=this.isBigEndian?r.call(this.buffer,this.position):e.call(this.buffer,this.position),this.position+=n,t}}(n.exports=e).prototype.readUInt8=r(t.prototype.readUInt8,t.prototype.readUInt8,1),e.prototype.readUInt16=r(t.prototype.readUInt16LE,t.prototype.readUInt16BE,2),e.prototype.readUInt32=r(t.prototype.readUInt32LE,t.prototype.readUInt32BE,4),e.prototype.readInt8=r(t.prototype.readInt8,t.prototype.readInt8,1),e.prototype.readInt16=r(t.prototype.readInt16LE,t.prototype.readInt16BE,2),e.prototype.readInt32=r(t.prototype.readInt32LE,t.prototype.readInt32BE,4),e.prototype.readFloat=r(t.prototype.readFloatLE,t.prototype.readFloatBE,4),e.prototype.readDouble=r(t.prototype.readDoubleLE,t.prototype.readDoubleBE,8),e.prototype.readVarInt=function(){for(var t,e=0,r=0;e+=(127&(t=this.buffer[this.position+r]))<<7*r,r++,128<=t;);return this.position+=r,e}}).call(this,t("buffer").Buffer)},{buffer:"buffer"}],2:[function(t,n,e){(function(r){function t(t,e){this.buffer=new r(t),this.position=0,this.allowResize=e}function e(r,n){return function(t,e){this.ensureSize(n),r.call(this.buffer,t,this.position,e),this.position+=n}}(n.exports=t).prototype.writeUInt8=e(r.prototype.writeUInt8,1),t.prototype.writeUInt16LE=e(r.prototype.writeUInt16LE,2),t.prototype.writeUInt16BE=e(r.prototype.writeUInt16BE,2),t.prototype.writeUInt32LE=e(r.prototype.writeUInt32LE,4),t.prototype.writeUInt32BE=e(r.prototype.writeUInt32BE,4),t.prototype.writeInt8=e(r.prototype.writeInt8,1),t.prototype.writeInt16LE=e(r.prototype.writeInt16LE,2),t.prototype.writeInt16BE=e(r.prototype.writeInt16BE,2),t.prototype.writeInt32LE=e(r.prototype.writeInt32LE,4),t.prototype.writeInt32BE=e(r.prototype.writeInt32BE,4),t.prototype.writeFloatLE=e(r.prototype.writeFloatLE,4),t.prototype.writeFloatBE=e(r.prototype.writeFloatBE,4),t.prototype.writeDoubleLE=e(r.prototype.writeDoubleLE,8),t.prototype.writeDoubleBE=e(r.prototype.writeDoubleBE,8),t.prototype.writeBuffer=function(t){this.ensureSize(t.length),t.copy(this.buffer,this.position,0,t.length),this.position+=t.length},t.prototype.writeVarInt=function(t){for(var e=1;0!=(4294967168&t);)this.writeUInt8(127&t|128),t>>>=7,e++;return this.writeUInt8(127&t),e},t.prototype.ensureSize=function(t){if(this.buffer.length<this.position+t){if(!this.allowResize)throw new RangeError("index out of range");var e=new r(this.position+t);this.buffer.copy(e,0,0,this.buffer.length),this.buffer=e}}}).call(this,t("buffer").Buffer)},{buffer:"buffer"}],3:[function(t,e,r){(function(r){e.exports=i;var u=t("./types"),p=t("./point"),f=t("./linestring"),c=t("./polygon"),l=t("./multipoint"),g=t("./multilinestring"),y=t("./multipolygon"),w=t("./geometrycollection"),d=t("./binaryreader"),n=t("./binarywriter"),a=t("./wktparser"),b=t("./zigzag.js");function i(){this.srid=void 0,this.hasZ=!1,this.hasM=!1}i.parse=function(t,e){if("string"==typeof t||t instanceof a)return i._parseWkt(t);if(r.isBuffer(t)||t instanceof d)return i._parseWkb(t,e);throw new Error("first argument must be a string or Buffer")},i._parseWkt=function(t){var e,r,n=(e=t instanceof a?t:new a(t)).matchRegex([/^SRID=(\d+);/]);n&&(r=parseInt(n[1],10));var i=e.matchType(),o=e.matchDimension(),s={srid:r,hasZ:o.hasZ,hasM:o.hasM};switch(i){case u.wkt.Point:return p._parseWkt(e,s);case u.wkt.LineString:return f._parseWkt(e,s);case u.wkt.Polygon:return c._parseWkt(e,s);case u.wkt.MultiPoint:return l._parseWkt(e,s);case u.wkt.MultiLineString:return g._parseWkt(e,s);case u.wkt.MultiPolygon:return y._parseWkt(e,s);case u.wkt.GeometryCollection:return w._parseWkt(e,s)}},i._parseWkb=function(t,e){var r,n,i,o={};switch((r=t instanceof d?t:new d(t)).isBigEndian=!r.readInt8(),n=r.readUInt32(),o.hasSrid=536870912==(536870912&n),o.isEwkb=536870912&n||1073741824&n||2147483648&n,o.hasSrid&&(o.srid=r.readUInt32()),o.hasZ=!1,o.hasM=!1,i=o.isEwkb||e&&e.isEwkb?(2147483648&n&&(o.hasZ=!0),1073741824&n&&(o.hasM=!0),15&n):1e3<=n&&n<2e3?(o.hasZ=!0,n-1e3):2e3<=n&&n<3e3?(o.hasM=!0,n-2e3):3e3<=n&&n<4e3?(o.hasZ=!0,o.hasM=!0,n-3e3):n){case u.wkb.Point:return p._parseWkb(r,o);case u.wkb.LineString:return f._parseWkb(r,o);case u.wkb.Polygon:return c._parseWkb(r,o);case u.wkb.MultiPoint:return l._parseWkb(r,o);case u.wkb.MultiLineString:return g._parseWkb(r,o);case u.wkb.MultiPolygon:return y._parseWkb(r,o);case u.wkb.GeometryCollection:return w._parseWkb(r,o);default:throw new Error("GeometryType "+i+" not supported")}},i.parseTwkb=function(t){var e,r={},n=(e=t instanceof d?t:new d(t)).readUInt8(),i=e.readUInt8(),o=15&n;if(r.precision=b.decode(n>>4),r.precisionFactor=Math.pow(10,r.precision),r.hasBoundingBox=i>>0&1,r.hasSizeAttribute=i>>1&1,r.hasIdList=i>>2&1,r.hasExtendedPrecision=i>>3&1,r.isEmpty=i>>4&1,r.hasExtendedPrecision){var s=e.readUInt8();r.hasZ=1==(1&s),r.hasM=2==(2&s),r.zPrecision=b.decode((28&s)>>2),r.zPrecisionFactor=Math.pow(10,r.zPrecision),r.mPrecision=b.decode((224&s)>>5),r.mPrecisionFactor=Math.pow(10,r.mPrecision)}else r.hasZ=!1,r.hasM=!1;if(r.hasSizeAttribute&&e.readVarInt(),r.hasBoundingBox){var a=2;r.hasZ&&a++,r.hasM&&a++;for(var h=0;h<a;h++)e.readVarInt(),e.readVarInt()}switch(o){case u.wkb.Point:return p._parseTwkb(e,r);case u.wkb.LineString:return f._parseTwkb(e,r);case u.wkb.Polygon:return c._parseTwkb(e,r);case u.wkb.MultiPoint:return l._parseTwkb(e,r);case u.wkb.MultiLineString:return g._parseTwkb(e,r);case u.wkb.MultiPolygon:return y._parseTwkb(e,r);case u.wkb.GeometryCollection:return w._parseTwkb(e,r);default:throw new Error("GeometryType "+o+" not supported")}},i.parseGeoJSON=function(t){return i._parseGeoJSON(t)},i._parseGeoJSON=function(t,e){var r;switch(t.type){case u.geoJSON.Point:r=p._parseGeoJSON(t);break;case u.geoJSON.LineString:r=f._parseGeoJSON(t);break;case u.geoJSON.Polygon:r=c._parseGeoJSON(t);break;case u.geoJSON.MultiPoint:r=l._parseGeoJSON(t);break;case u.geoJSON.MultiLineString:r=g._parseGeoJSON(t);break;case u.geoJSON.MultiPolygon:r=y._parseGeoJSON(t);break;case u.geoJSON.GeometryCollection:r=w._parseGeoJSON(t);break;default:throw new Error("GeometryType "+t.type+" not supported")}if(t.crs&&t.crs.type&&"name"===t.crs.type&&t.crs.properties&&t.crs.properties.name){var n=t.crs.properties.name;if(0===n.indexOf("EPSG:"))r.srid=parseInt(n.substring(5));else{if(0!==n.indexOf("urn:ogc:def:crs:EPSG::"))throw new Error("Unsupported crs: "+n);r.srid=parseInt(n.substring(22))}}else e||(r.srid=4326);return r},i.prototype.toEwkt=function(){return"SRID="+this.srid+";"+this.toWkt()},i.prototype.toEwkb=function(){var t=new n(this._getWkbSize()+4),e=this.toWkb();return t.writeInt8(1),t.writeUInt32LE((536870912|e.slice(1,5).readUInt32LE(0))>>>0,!0),t.writeUInt32LE(this.srid),t.writeBuffer(e.slice(5)),t.buffer},i.prototype._getWktType=function(t,e){var r=t;return this.hasZ&&this.hasM?r+=" ZM ":this.hasZ?r+=" Z ":this.hasM&&(r+=" M "),!e||this.hasZ||this.hasM||(r+=" "),e&&(r+="EMPTY"),r},i.prototype._getWktCoordinate=function(t){var e=t.x+" "+t.y;return this.hasZ&&(e+=" "+t.z),this.hasM&&(e+=" "+t.m),e},i.prototype._writeWkbType=function(t,e,r){var n=0;void 0!==this.srid||r&&void 0!==r.srid?(this.hasZ&&(n|=2147483648),this.hasM&&(n|=1073741824)):this.hasZ&&this.hasM?n+=3e3:this.hasZ?n+=1e3:this.hasM&&(n+=2e3),t.writeUInt32LE(n+e>>>0,!0)},i.getTwkbPrecision=function(t,e,r){return{xy:t,z:e,m:r,xyFactor:Math.pow(10,t),zFactor:Math.pow(10,e),mFactor:Math.pow(10,r)}},i.prototype._writeTwkbHeader=function(t,e,r,n){var i=(b.encode(r.xy)<<4)+e,o=(this.hasZ||this.hasM)<<3;if(o+=n<<4,t.writeUInt8(i),t.writeUInt8(o),this.hasZ||this.hasM){var s=0;this.hasZ&&(s|=1),this.hasM&&(s|=2),t.writeUInt8(s)}},i.prototype.toGeoJSON=function(t){var e={};return this.srid&&t&&(t.shortCrs?e.crs={type:"name",properties:{name:"EPSG:"+this.srid}}:t.longCrs&&(e.crs={type:"name",properties:{name:"urn:ogc:def:crs:EPSG::"+this.srid}})),e}}).call(this,{isBuffer:t("../node_modules/is-buffer/index.js")})},{"../node_modules/is-buffer/index.js":17,"./binaryreader":1,"./binarywriter":2,"./geometrycollection":4,"./linestring":5,"./multilinestring":6,"./multipoint":7,"./multipolygon":8,"./point":9,"./polygon":10,"./types":11,"./wktparser":12,"./zigzag.js":13}],4:[function(t,e,r){e.exports=a;var n=t("util"),i=t("./types"),o=t("./geometry"),s=t("./binarywriter");function a(t,e){o.call(this),this.geometries=t||[],this.srid=e,0<this.geometries.length&&(this.hasZ=this.geometries[0].hasZ,this.hasM=this.geometries[0].hasM)}n.inherits(a,o),a.Z=function(t,e){var r=new a(t,e);return r.hasZ=!0,r},a.M=function(t,e){var r=new a(t,e);return r.hasM=!0,r},a.ZM=function(t,e){var r=new a(t,e);return r.hasZ=!0,r.hasM=!0,r},a._parseWkt=function(t,e){var r=new a;if(r.srid=e.srid,r.hasZ=e.hasZ,r.hasM=e.hasM,t.isMatch(["EMPTY"]))return r;for(t.expectGroupStart();r.geometries.push(o.parse(t)),t.isMatch([","]););return t.expectGroupEnd(),r},a._parseWkb=function(t,e){var r=new a;r.srid=e.srid,r.hasZ=e.hasZ,r.hasM=e.hasM;for(var n=t.readUInt32(),i=0;i<n;i++)r.geometries.push(o.parse(t,e));return r},a._parseTwkb=function(t,e){var r=new a;if(r.hasZ=e.hasZ,r.hasM=e.hasM,e.isEmpty)return r;for(var n=t.readVarInt(),i=0;i<n;i++)r.geometries.push(o.parseTwkb(t));return r},a._parseGeoJSON=function(t){for(var e=new a,r=0;r<t.geometries.length;r++)e.geometries.push(o._parseGeoJSON(t.geometries[r],!0));return 0<e.geometries.length&&(e.hasZ=e.geometries[0].hasZ),e},a.prototype.toWkt=function(){if(0===this.geometries.length)return this._getWktType(i.wkt.GeometryCollection,!0);for(var t=this._getWktType(i.wkt.GeometryCollection,!1)+"(",e=0;e<this.geometries.length;e++)t+=this.geometries[e].toWkt()+",";return t=t.slice(0,-1),t+=")"},a.prototype.toWkb=function(){var t=new s(this._getWkbSize());t.writeInt8(1),this._writeWkbType(t,i.wkb.GeometryCollection),t.writeUInt32LE(this.geometries.length);for(var e=0;e<this.geometries.length;e++)t.writeBuffer(this.geometries[e].toWkb({srid:this.srid}));return t.buffer},a.prototype.toTwkb=function(){var t=new s(0,!0),e=o.getTwkbPrecision(5,0,0),r=0===this.geometries.length;if(this._writeTwkbHeader(t,i.wkb.GeometryCollection,e,r),0<this.geometries.length){t.writeVarInt(this.geometries.length);for(var n=0;n<this.geometries.length;n++)t.writeBuffer(this.geometries[n].toTwkb())}return t.buffer},a.prototype._getWkbSize=function(){for(var t=9,e=0;e<this.geometries.length;e++)t+=this.geometries[e]._getWkbSize();return t},a.prototype.toGeoJSON=function(t){var e=o.prototype.toGeoJSON.call(this,t);e.type=i.geoJSON.GeometryCollection,e.geometries=[];for(var r=0;r<this.geometries.length;r++)e.geometries.push(this.geometries[r].toGeoJSON());return e}},{"./binarywriter":2,"./geometry":3,"./types":11,util:20}],5:[function(t,e,r){e.exports=u;var n=t("util"),o=t("./geometry"),s=t("./types"),a=t("./point"),h=t("./binarywriter");function u(t,e){o.call(this),this.points=t||[],this.srid=e,0<this.points.length&&(this.hasZ=this.points[0].hasZ,this.hasM=this.points[0].hasM)}n.inherits(u,o),u.Z=function(t,e){var r=new u(t,e);return r.hasZ=!0,r},u.M=function(t,e){var r=new u(t,e);return r.hasM=!0,r},u.ZM=function(t,e){var r=new u(t,e);return r.hasZ=!0,r.hasM=!0,r},u._parseWkt=function(t,e){var r=new u;return r.srid=e.srid,r.hasZ=e.hasZ,r.hasM=e.hasM,t.isMatch(["EMPTY"])||(t.expectGroupStart(),r.points.push.apply(r.points,t.matchCoordinates(e)),t.expectGroupEnd()),r},u._parseWkb=function(t,e){var r=new u;r.srid=e.srid,r.hasZ=e.hasZ,r.hasM=e.hasM;for(var n=t.readUInt32(),i=0;i<n;i++)r.points.push(a._readWkbPoint(t,e));return r},u._parseTwkb=function(t,e){var r=new u;if(r.hasZ=e.hasZ,r.hasM=e.hasM,e.isEmpty)return r;for(var n=new a(0,0,e.hasZ?0:void 0,e.hasM?0:void 0),i=t.readVarInt(),o=0;o<i;o++)r.points.push(a._readTwkbPoint(t,e,n));return r},u._parseGeoJSON=function(t){var e=new u;0<t.coordinates.length&&(e.hasZ=2<t.coordinates[0].length);for(var r=0;r<t.coordinates.length;r++)e.points.push(a._readGeoJSONPoint(t.coordinates[r]));return e},u.prototype.toWkt=function(){return 0===this.points.length?this._getWktType(s.wkt.LineString,!0):this._getWktType(s.wkt.LineString,!1)+this._toInnerWkt()},u.prototype._toInnerWkt=function(){for(var t="(",e=0;e<this.points.length;e++)t+=this._getWktCoordinate(this.points[e])+",";return t=t.slice(0,-1),t+=")"},u.prototype.toWkb=function(t){var e=new h(this._getWkbSize());e.writeInt8(1),this._writeWkbType(e,s.wkb.LineString,t),e.writeUInt32LE(this.points.length);for(var r=0;r<this.points.length;r++)this.points[r]._writeWkbPoint(e);return e.buffer},u.prototype.toTwkb=function(){var t=new h(0,!0),e=o.getTwkbPrecision(5,0,0),r=0===this.points.length;if(this._writeTwkbHeader(t,s.wkb.LineString,e,r),0<this.points.length){t.writeVarInt(this.points.length);for(var n=new a(0,0,0,0),i=0;i<this.points.length;i++)this.points[i]._writeTwkbPoint(t,e,n)}return t.buffer},u.prototype._getWkbSize=function(){var t=16;return this.hasZ&&(t+=8),this.hasM&&(t+=8),9+this.points.length*t},u.prototype.toGeoJSON=function(t){var e=o.prototype.toGeoJSON.call(this,t);e.type=s.geoJSON.LineString,e.coordinates=[];for(var r=0;r<this.points.length;r++)this.hasZ?e.coordinates.push([this.points[r].x,this.points[r].y,this.points[r].z]):e.coordinates.push([this.points[r].x,this.points[r].y]);return e}},{"./binarywriter":2,"./geometry":3,"./point":9,"./types":11,util:20}],6:[function(t,e,r){e.exports=f;var n=t("util"),s=t("./types"),a=t("./geometry"),u=t("./point"),p=t("./linestring"),h=t("./binarywriter");function f(t,e){a.call(this),this.lineStrings=t||[],this.srid=e,0<this.lineStrings.length&&(this.hasZ=this.lineStrings[0].hasZ,this.hasM=this.lineStrings[0].hasM)}n.inherits(f,a),f.Z=function(t,e){var r=new f(t,e);return r.hasZ=!0,r},f.M=function(t,e){var r=new f(t,e);return r.hasM=!0,r},f.ZM=function(t,e){var r=new f(t,e);return r.hasZ=!0,r.hasM=!0,r},f._parseWkt=function(t,e){var r=new f;if(r.srid=e.srid,r.hasZ=e.hasZ,r.hasM=e.hasM,t.isMatch(["EMPTY"]))return r;for(t.expectGroupStart();t.expectGroupStart(),r.lineStrings.push(new p(t.matchCoordinates(e))),t.expectGroupEnd(),t.isMatch([","]););return t.expectGroupEnd(),r},f._parseWkb=function(t,e){var r=new f;r.srid=e.srid,r.hasZ=e.hasZ,r.hasM=e.hasM;for(var n=t.readUInt32(),i=0;i<n;i++)r.lineStrings.push(a.parse(t,e));return r},f._parseTwkb=function(t,e){var r=new f;if(r.hasZ=e.hasZ,r.hasM=e.hasM,e.isEmpty)return r;for(var n=new u(0,0,e.hasZ?0:void 0,e.hasM?0:void 0),i=t.readVarInt(),o=0;o<i;o++){var s=new p;s.hasZ=e.hasZ,s.hasM=e.hasM;for(var a=t.readVarInt(),h=0;h<a;h++)s.points.push(u._readTwkbPoint(t,e,n));r.lineStrings.push(s)}return r},f._parseGeoJSON=function(t){var e=new f;0<t.coordinates.length&&0<t.coordinates[0].length&&(e.hasZ=2<t.coordinates[0][0].length);for(var r=0;r<t.coordinates.length;r++)e.lineStrings.push(p._parseGeoJSON({coordinates:t.coordinates[r]}));return e},f.prototype.toWkt=function(){if(0===this.lineStrings.length)return this._getWktType(s.wkt.MultiLineString,!0);for(var t=this._getWktType(s.wkt.MultiLineString,!1)+"(",e=0;e<this.lineStrings.length;e++)t+=this.lineStrings[e]._toInnerWkt()+",";return t=t.slice(0,-1),t+=")"},f.prototype.toWkb=function(){var t=new h(this._getWkbSize());t.writeInt8(1),this._writeWkbType(t,s.wkb.MultiLineString),t.writeUInt32LE(this.lineStrings.length);for(var e=0;e<this.lineStrings.length;e++)t.writeBuffer(this.lineStrings[e].toWkb({srid:this.srid}));return t.buffer},f.prototype.toTwkb=function(){var t=new h(0,!0),e=a.getTwkbPrecision(5,0,0),r=0===this.lineStrings.length;if(this._writeTwkbHeader(t,s.wkb.MultiLineString,e,r),0<this.lineStrings.length){t.writeVarInt(this.lineStrings.length);for(var n=new u(0,0,0,0),i=0;i<this.lineStrings.length;i++){t.writeVarInt(this.lineStrings[i].points.length);for(var o=0;o<this.lineStrings[i].points.length;o++)this.lineStrings[i].points[o]._writeTwkbPoint(t,e,n)}}return t.buffer},f.prototype._getWkbSize=function(){for(var t=9,e=0;e<this.lineStrings.length;e++)t+=this.lineStrings[e]._getWkbSize();return t},f.prototype.toGeoJSON=function(t){var e=a.prototype.toGeoJSON.call(this,t);e.type=s.geoJSON.MultiLineString,e.coordinates=[];for(var r=0;r<this.lineStrings.length;r++)e.coordinates.push(this.lineStrings[r].toGeoJSON().coordinates);return e}},{"./binarywriter":2,"./geometry":3,"./linestring":5,"./point":9,"./types":11,util:20}],7:[function(t,e,r){e.exports=u;var n=t("util"),o=t("./types"),s=t("./geometry"),a=t("./point"),h=t("./binarywriter");function u(t,e){s.call(this),this.points=t||[],this.srid=e,0<this.points.length&&(this.hasZ=this.points[0].hasZ,this.hasM=this.points[0].hasM)}n.inherits(u,s),u.Z=function(t,e){var r=new u(t,e);return r.hasZ=!0,r},u.M=function(t,e){var r=new u(t,e);return r.hasM=!0,r},u.ZM=function(t,e){var r=new u(t,e);return r.hasZ=!0,r.hasM=!0,r},u._parseWkt=function(t,e){var r=new u;return r.srid=e.srid,r.hasZ=e.hasZ,r.hasM=e.hasM,t.isMatch(["EMPTY"])||(t.expectGroupStart(),r.points.push.apply(r.points,t.matchCoordinates(e)),t.expectGroupEnd()),r},u._parseWkb=function(t,e){var r=new u;r.srid=e.srid,r.hasZ=e.hasZ,r.hasM=e.hasM;for(var n=t.readUInt32(),i=0;i<n;i++)r.points.push(s.parse(t,e));return r},u._parseTwkb=function(t,e){var r=new u;if(r.hasZ=e.hasZ,r.hasM=e.hasM,e.isEmpty)return r;for(var n=new a(0,0,e.hasZ?0:void 0,e.hasM?0:void 0),i=t.readVarInt(),o=0;o<i;o++)r.points.push(a._readTwkbPoint(t,e,n));return r},u._parseGeoJSON=function(t){var e=new u;0<t.coordinates.length&&(e.hasZ=2<t.coordinates[0].length);for(var r=0;r<t.coordinates.length;r++)e.points.push(a._parseGeoJSON({coordinates:t.coordinates[r]}));return e},u.prototype.toWkt=function(){if(0===this.points.length)return this._getWktType(o.wkt.MultiPoint,!0);for(var t=this._getWktType(o.wkt.MultiPoint,!1)+"(",e=0;e<this.points.length;e++)t+=this._getWktCoordinate(this.points[e])+",";return t=t.slice(0,-1),t+=")"},u.prototype.toWkb=function(){var t=new h(this._getWkbSize());t.writeInt8(1),this._writeWkbType(t,o.wkb.MultiPoint),t.writeUInt32LE(this.points.length);for(var e=0;e<this.points.length;e++)t.writeBuffer(this.points[e].toWkb({srid:this.srid}));return t.buffer},u.prototype.toTwkb=function(){var t=new h(0,!0),e=s.getTwkbPrecision(5,0,0),r=0===this.points.length;if(this._writeTwkbHeader(t,o.wkb.MultiPoint,e,r),0<this.points.length){t.writeVarInt(this.points.length);for(var n=new a(0,0,0,0),i=0;i<this.points.length;i++)this.points[i]._writeTwkbPoint(t,e,n)}return t.buffer},u.prototype._getWkbSize=function(){var t=16;return this.hasZ&&(t+=8),this.hasM&&(t+=8),t+=5,9+this.points.length*t},u.prototype.toGeoJSON=function(t){var e=s.prototype.toGeoJSON.call(this,t);e.type=o.geoJSON.MultiPoint,e.coordinates=[];for(var r=0;r<this.points.length;r++)e.coordinates.push(this.points[r].toGeoJSON().coordinates);return e}},{"./binarywriter":2,"./geometry":3,"./point":9,"./types":11,util:20}],8:[function(t,e,r){e.exports=y;var n=t("util"),a=t("./types"),h=t("./geometry"),l=t("./point"),g=t("./polygon"),u=t("./binarywriter");function y(t,e){h.call(this),this.polygons=t||[],this.srid=e,0<this.polygons.length&&(this.hasZ=this.polygons[0].hasZ,this.hasM=this.polygons[0].hasM)}n.inherits(y,h),y.Z=function(t,e){var r=new y(t,e);return r.hasZ=!0,r},y.M=function(t,e){var r=new y(t,e);return r.hasM=!0,r},y.ZM=function(t,e){var r=new y(t,e);return r.hasZ=!0,r.hasM=!0,r},y._parseWkt=function(t,e){var r=new y;if(r.srid=e.srid,r.hasZ=e.hasZ,r.hasM=e.hasM,t.isMatch(["EMPTY"]))return r;t.expectGroupStart();do{t.expectGroupStart();var n=[],i=[];for(t.expectGroupStart(),n.push.apply(n,t.matchCoordinates(e)),t.expectGroupEnd();t.isMatch([","]);)t.expectGroupStart(),i.push(t.matchCoordinates(e)),t.expectGroupEnd();r.polygons.push(new g(n,i)),t.expectGroupEnd()}while(t.isMatch([","]));return t.expectGroupEnd(),r},y._parseWkb=function(t,e){var r=new y;r.srid=e.srid,r.hasZ=e.hasZ,r.hasM=e.hasM;for(var n=t.readUInt32(),i=0;i<n;i++)r.polygons.push(h.parse(t,e));return r},y._parseTwkb=function(t,e){var r=new y;if(r.hasZ=e.hasZ,r.hasM=e.hasM,e.isEmpty)return r;for(var n=new l(0,0,e.hasZ?0:void 0,e.hasM?0:void 0),i=t.readVarInt(),o=0;o<i;o++){var s=new g;s.hasZ=e.hasZ,s.hasM=e.hasM;for(var a=t.readVarInt(),h=t.readVarInt(),u=0;u<h;u++)s.exteriorRing.push(l._readTwkbPoint(t,e,n));for(u=1;u<a;u++){for(var p=[],f=t.readVarInt(),c=0;c<f;c++)p.push(l._readTwkbPoint(t,e,n));s.interiorRings.push(p)}r.polygons.push(s)}return r},y._parseGeoJSON=function(t){var e=new y;0<t.coordinates.length&&0<t.coordinates[0].length&&0<t.coordinates[0][0].length&&(e.hasZ=2<t.coordinates[0][0][0].length);for(var r=0;r<t.coordinates.length;r++)e.polygons.push(g._parseGeoJSON({coordinates:t.coordinates[r]}));return e},y.prototype.toWkt=function(){if(0===this.polygons.length)return this._getWktType(a.wkt.MultiPolygon,!0);for(var t=this._getWktType(a.wkt.MultiPolygon,!1)+"(",e=0;e<this.polygons.length;e++)t+=this.polygons[e]._toInnerWkt()+",";return t=t.slice(0,-1),t+=")"},y.prototype.toWkb=function(){var t=new u(this._getWkbSize());t.writeInt8(1),this._writeWkbType(t,a.wkb.MultiPolygon),t.writeUInt32LE(this.polygons.length);for(var e=0;e<this.polygons.length;e++)t.writeBuffer(this.polygons[e].toWkb({srid:this.srid}));return t.buffer},y.prototype.toTwkb=function(){var t=new u(0,!0),e=h.getTwkbPrecision(5,0,0),r=0===this.polygons.length;if(this._writeTwkbHeader(t,a.wkb.MultiPolygon,e,r),0<this.polygons.length){t.writeVarInt(this.polygons.length);for(var n=new l(0,0,0,0),i=0;i<this.polygons.length;i++){t.writeVarInt(1+this.polygons[i].interiorRings.length),t.writeVarInt(this.polygons[i].exteriorRing.length);for(var o=0;o<this.polygons[i].exteriorRing.length;o++)this.polygons[i].exteriorRing[o]._writeTwkbPoint(t,e,n);for(o=0;o<this.polygons[i].interiorRings.length;o++){t.writeVarInt(this.polygons[i].interiorRings[o].length);for(var s=0;s<this.polygons[i].interiorRings[o].length;s++)this.polygons[i].interiorRings[o][s]._writeTwkbPoint(t,e,n)}}}return t.buffer},y.prototype._getWkbSize=function(){for(var t=9,e=0;e<this.polygons.length;e++)t+=this.polygons[e]._getWkbSize();return t},y.prototype.toGeoJSON=function(t){var e=h.prototype.toGeoJSON.call(this,t);e.type=a.geoJSON.MultiPolygon,e.coordinates=[];for(var r=0;r<this.polygons.length;r++)e.coordinates.push(this.polygons[r].toGeoJSON().coordinates);return e}},{"./binarywriter":2,"./geometry":3,"./point":9,"./polygon":10,"./types":11,util:20}],9:[function(t,e,r){e.exports=h;var n=t("util"),o=t("./geometry"),i=t("./types"),s=t("./binarywriter"),a=t("./zigzag.js");function h(t,e,r,n,i){o.call(this),this.x=t,this.y=e,this.z=r,this.m=n,this.srid=i,this.hasZ=void 0!==this.z,this.hasM=void 0!==this.m}n.inherits(h,o),h.Z=function(t,e,r,n){var i=new h(t,e,r,void 0,n);return i.hasZ=!0,i},h.M=function(t,e,r,n){var i=new h(t,e,void 0,r,n);return i.hasM=!0,i},h.ZM=function(t,e,r,n,i){var o=new h(t,e,r,n,i);return o.hasZ=!0,o.hasM=!0,o},h._parseWkt=function(t,e){var r=new h;if(r.srid=e.srid,r.hasZ=e.hasZ,r.hasM=e.hasM,t.isMatch(["EMPTY"]))return r;t.expectGroupStart();var n=t.matchCoordinate(e);return r.x=n.x,r.y=n.y,r.z=n.z,r.m=n.m,t.expectGroupEnd(),r},h._parseWkb=function(t,e){var r=h._readWkbPoint(t,e);return r.srid=e.srid,r},h._readWkbPoint=function(t,e){return new h(t.readDouble(),t.readDouble(),e.hasZ?t.readDouble():void 0,e.hasM?t.readDouble():void 0)},h._parseTwkb=function(t,e){var r=new h;return r.hasZ=e.hasZ,r.hasM=e.hasM,e.isEmpty||(r.x=a.decode(t.readVarInt())/e.precisionFactor,r.y=a.decode(t.readVarInt())/e.precisionFactor,r.z=e.hasZ?a.decode(t.readVarInt())/e.zPrecisionFactor:void 0,r.m=e.hasM?a.decode(t.readVarInt())/e.mPrecisionFactor:void 0),r},h._readTwkbPoint=function(t,e,r){return r.x+=a.decode(t.readVarInt())/e.precisionFactor,r.y+=a.decode(t.readVarInt())/e.precisionFactor,e.hasZ&&(r.z+=a.decode(t.readVarInt())/e.zPrecisionFactor),e.hasM&&(r.m+=a.decode(t.readVarInt())/e.mPrecisionFactor),new h(r.x,r.y,r.z,r.m)},h._parseGeoJSON=function(t){return h._readGeoJSONPoint(t.coordinates)},h._readGeoJSONPoint=function(t){return 0===t.length?new h:2<t.length?new h(t[0],t[1],t[2]):new h(t[0],t[1])},h.prototype.toWkt=function(){return void 0===this.x&&void 0===this.y&&void 0===this.z&&void 0===this.m?this._getWktType(i.wkt.Point,!0):this._getWktType(i.wkt.Point,!1)+"("+this._getWktCoordinate(this)+")"},h.prototype.toWkb=function(t){var e=new s(this._getWkbSize());return e.writeInt8(1),this._writeWkbType(e,i.wkb.Point,t),void 0===this.x&&void 0===this.y?(e.writeDoubleLE(NaN),e.writeDoubleLE(NaN),this.hasZ&&e.writeDoubleLE(NaN),this.hasM&&e.writeDoubleLE(NaN)):this._writeWkbPoint(e),e.buffer},h.prototype._writeWkbPoint=function(t){t.writeDoubleLE(this.x),t.writeDoubleLE(this.y),this.hasZ&&t.writeDoubleLE(this.z),this.hasM&&t.writeDoubleLE(this.m)},h.prototype.toTwkb=function(){var t=new s(0,!0),e=o.getTwkbPrecision(5,0,0),r=void 0===this.x&&void 0===this.y;return this._writeTwkbHeader(t,i.wkb.Point,e,r),r||this._writeTwkbPoint(t,e,new h(0,0,0,0)),t.buffer},h.prototype._writeTwkbPoint=function(t,e,r){var n=this.x*e.xyFactor,i=this.y*e.xyFactor,o=this.z*e.zFactor,s=this.m*e.mFactor;t.writeVarInt(a.encode(n-r.x)),t.writeVarInt(a.encode(i-r.y)),this.hasZ&&t.writeVarInt(a.encode(o-r.z)),this.hasM&&t.writeVarInt(a.encode(s-r.m)),r.x=n,r.y=i,r.z=o,r.m=s},h.prototype._getWkbSize=function(){var t=21;return this.hasZ&&(t+=8),this.hasM&&(t+=8),t},h.prototype.toGeoJSON=function(t){var e=o.prototype.toGeoJSON.call(this,t);return e.type=i.geoJSON.Point,void 0===this.x&&void 0===this.y?e.coordinates=[]:void 0!==this.z?e.coordinates=[this.x,this.y,this.z]:e.coordinates=[this.x,this.y],e}},{"./binarywriter":2,"./geometry":3,"./types":11,"./zigzag.js":13,util:20}],10:[function(t,e,r){e.exports=f;var n=t("util"),a=t("./geometry"),h=t("./types"),p=t("./point"),s=t("./binarywriter");function f(t,e,r){a.call(this),this.exteriorRing=t||[],this.interiorRings=e||[],this.srid=r,0<this.exteriorRing.length&&(this.hasZ=this.exteriorRing[0].hasZ,this.hasM=this.exteriorRing[0].hasM)}n.inherits(f,a),f.Z=function(t,e,r){var n=new f(t,e,r);return n.hasZ=!0,n},f.M=function(t,e,r){var n=new f(t,e,r);return n.hasM=!0,n},f.ZM=function(t,e,r){var n=new f(t,e,r);return n.hasZ=!0,n.hasM=!0,n},f._parseWkt=function(t,e){var r=new f;if(r.srid=e.srid,r.hasZ=e.hasZ,r.hasM=e.hasM,t.isMatch(["EMPTY"]))return r;for(t.expectGroupStart(),t.expectGroupStart(),r.exteriorRing.push.apply(r.exteriorRing,t.matchCoordinates(e)),t.expectGroupEnd();t.isMatch([","]);)t.expectGroupStart(),r.interiorRings.push(t.matchCoordinates(e)),t.expectGroupEnd();return t.expectGroupEnd(),r},f._parseWkb=function(t,e){var r=new f;r.srid=e.srid,r.hasZ=e.hasZ,r.hasM=e.hasM;var n=t.readUInt32();if(0<n){for(var i=t.readUInt32(),o=0;o<i;o++)r.exteriorRing.push(p._readWkbPoint(t,e));for(o=1;o<n;o++){for(var s=[],a=t.readUInt32(),h=0;h<a;h++)s.push(p._readWkbPoint(t,e));r.interiorRings.push(s)}}return r},f._parseTwkb=function(t,e){var r=new f;if(r.hasZ=e.hasZ,r.hasM=e.hasM,e.isEmpty)return r;for(var n=new p(0,0,e.hasZ?0:void 0,e.hasM?0:void 0),i=t.readVarInt(),o=t.readVarInt(),s=0;s<o;s++)r.exteriorRing.push(p._readTwkbPoint(t,e,n));for(s=1;s<i;s++){for(var a=[],h=t.readVarInt(),u=0;u<h;u++)a.push(p._readTwkbPoint(t,e,n));r.interiorRings.push(a)}return r},f._parseGeoJSON=function(t){var e=new f;0<t.coordinates.length&&0<t.coordinates[0].length&&(e.hasZ=2<t.coordinates[0][0].length);for(var r=0;r<t.coordinates.length;r++){0<r&&e.interiorRings.push([]);for(var n=0;n<t.coordinates[r].length;n++)0===r?e.exteriorRing.push(p._readGeoJSONPoint(t.coordinates[r][n])):e.interiorRings[r-1].push(p._readGeoJSONPoint(t.coordinates[r][n]))}return e},f.prototype.toWkt=function(){return 0===this.exteriorRing.length?this._getWktType(h.wkt.Polygon,!0):this._getWktType(h.wkt.Polygon,!1)+this._toInnerWkt()},f.prototype._toInnerWkt=function(){for(var t="((",e=0;e<this.exteriorRing.length;e++)t+=this._getWktCoordinate(this.exteriorRing[e])+",";for(t=t.slice(0,-1),t+=")",e=0;e<this.interiorRings.length;e++){t+=",(";for(var r=0;r<this.interiorRings[e].length;r++)t+=this._getWktCoordinate(this.interiorRings[e][r])+",";t=t.slice(0,-1),t+=")"}return t+=")"},f.prototype.toWkb=function(t){var e=new s(this._getWkbSize());e.writeInt8(1),this._writeWkbType(e,h.wkb.Polygon,t),0<this.exteriorRing.length?(e.writeUInt32LE(1+this.interiorRings.length),e.writeUInt32LE(this.exteriorRing.length)):e.writeUInt32LE(0);for(var r=0;r<this.exteriorRing.length;r++)this.exteriorRing[r]._writeWkbPoint(e);for(r=0;r<this.interiorRings.length;r++){e.writeUInt32LE(this.interiorRings[r].length);for(var n=0;n<this.interiorRings[r].length;n++)this.interiorRings[r][n]._writeWkbPoint(e)}return e.buffer},f.prototype.toTwkb=function(){var t=new s(0,!0),e=a.getTwkbPrecision(5,0,0),r=0===this.exteriorRing.length;if(this._writeTwkbHeader(t,h.wkb.Polygon,e,r),0<this.exteriorRing.length){t.writeVarInt(1+this.interiorRings.length),t.writeVarInt(this.exteriorRing.length);for(var n=new p(0,0,0,0),i=0;i<this.exteriorRing.length;i++)this.exteriorRing[i]._writeTwkbPoint(t,e,n);for(i=0;i<this.interiorRings.length;i++){t.writeVarInt(this.interiorRings[i].length);for(var o=0;o<this.interiorRings[i].length;o++)this.interiorRings[i][o]._writeTwkbPoint(t,e,n)}}return t.buffer},f.prototype._getWkbSize=function(){var t=16;this.hasZ&&(t+=8),this.hasM&&(t+=8);var e=9;0<this.exteriorRing.length&&(e+=4+this.exteriorRing.length*t);for(var r=0;r<this.interiorRings.length;r++)e+=4+this.interiorRings[r].length*t;return e},f.prototype.toGeoJSON=function(t){var e=a.prototype.toGeoJSON.call(this,t);if(e.type=h.geoJSON.Polygon,e.coordinates=[],0<this.exteriorRing.length){for(var r=[],n=0;n<this.exteriorRing.length;n++)this.hasZ?r.push([this.exteriorRing[n].x,this.exteriorRing[n].y,this.exteriorRing[n].z]):r.push([this.exteriorRing[n].x,this.exteriorRing[n].y]);e.coordinates.push(r)}for(var i=0;i<this.interiorRings.length;i++){for(var o=[],s=0;s<this.interiorRings[i].length;s++)this.hasZ?o.push([this.interiorRings[i][s].x,this.interiorRings[i][s].y,this.interiorRings[i][s].z]):o.push([this.interiorRings[i][s].x,this.interiorRings[i][s].y]);e.coordinates.push(o)}return e}},{"./binarywriter":2,"./geometry":3,"./point":9,"./types":11,util:20}],11:[function(t,e,r){e.exports={wkt:{Point:"POINT",LineString:"LINESTRING",Polygon:"POLYGON",MultiPoint:"MULTIPOINT",MultiLineString:"MULTILINESTRING",MultiPolygon:"MULTIPOLYGON",GeometryCollection:"GEOMETRYCOLLECTION"},wkb:{Point:1,LineString:2,Polygon:3,MultiPoint:4,MultiLineString:5,MultiPolygon:6,GeometryCollection:7},geoJSON:{Point:"Point",LineString:"LineString",Polygon:"Polygon",MultiPoint:"MultiPoint",MultiLineString:"MultiLineString",MultiPolygon:"MultiPolygon",GeometryCollection:"GeometryCollection"}}},{}],12:[function(t,e,r){e.exports=o;var n=t("./types"),i=t("./point");function o(t){this.value=t,this.position=0}o.prototype.match=function(t){this.skipWhitespaces();for(var e=0;e<t.length;e++)if(0===this.value.substring(this.position).indexOf(t[e]))return this.position+=t[e].length,t[e];return null},o.prototype.matchRegex=function(t){this.skipWhitespaces();for(var e=0;e<t.length;e++){var r=this.value.substring(this.position).match(t[e]);if(r)return this.position+=r[0].length,r}return null},o.prototype.isMatch=function(t){this.skipWhitespaces();for(var e=0;e<t.length;e++)if(0===this.value.substring(this.position).indexOf(t[e]))return this.position+=t[e].length,!0;return!1},o.prototype.matchType=function(){var t=this.match([n.wkt.Point,n.wkt.LineString,n.wkt.Polygon,n.wkt.MultiPoint,n.wkt.MultiLineString,n.wkt.MultiPolygon,n.wkt.GeometryCollection]);if(!t)throw new Error("Expected geometry type");return t},o.prototype.matchDimension=function(){switch(this.match(["ZM","Z","M"])){case"ZM":return{hasZ:!0,hasM:!0};case"Z":return{hasZ:!0,hasM:!1};case"M":return{hasZ:!1,hasM:!0};default:return{hasZ:!1,hasM:!1}}},o.prototype.expectGroupStart=function(){if(!this.isMatch(["("]))throw new Error("Expected group start")},o.prototype.expectGroupEnd=function(){if(!this.isMatch([")"]))throw new Error("Expected group end")},o.prototype.matchCoordinate=function(t){var e;if(!(e=t.hasZ&&t.hasM?this.matchRegex([/^(\S*)\s+(\S*)\s+(\S*)\s+([^\s,)]*)/]):t.hasZ||t.hasM?this.matchRegex([/^(\S*)\s+(\S*)\s+([^\s,)]*)/]):this.matchRegex([/^(\S*)\s+([^\s,)]*)/])))throw new Error("Expected coordinates");return t.hasZ&&t.hasM?new i(parseFloat(e[1]),parseFloat(e[2]),parseFloat(e[3]),parseFloat(e[4])):t.hasZ?new i(parseFloat(e[1]),parseFloat(e[2]),parseFloat(e[3])):t.hasM?new i(parseFloat(e[1]),parseFloat(e[2]),void 0,parseFloat(e[3])):new i(parseFloat(e[1]),parseFloat(e[2]))},o.prototype.matchCoordinates=function(t){var e=[];do{var r=this.isMatch(["("]);e.push(this.matchCoordinate(t)),r&&this.expectGroupEnd()}while(this.isMatch([","]));return e},o.prototype.skipWhitespaces=function(){for(;this.position<this.value.length&&" "===this.value[this.position];)this.position++}},{"./point":9,"./types":11}],13:[function(t,e,r){e.exports={encode:function(t){return t<<1^t>>31},decode:function(t){return t>>1^-(1&t)}}},{}],14:[function(t,e,r){"use strict";r.byteLength=function(t){var e=f(t),r=e[0],n=e[1];return 3*(r+n)/4-n},r.toByteArray=function(t){var e,r,n=f(t),i=n[0],o=n[1],s=new p(function(t,e){return 3*(t+e)/4-e}(i,o)),a=0,h=0<o?i-4:i;for(r=0;r<h;r+=4)e=u[t.charCodeAt(r)]<<18|u[t.charCodeAt(r+1)]<<12|u[t.charCodeAt(r+2)]<<6|u[t.charCodeAt(r+3)],s[a++]=e>>16&255,s[a++]=e>>8&255,s[a++]=255&e;2===o&&(e=u[t.charCodeAt(r)]<<2|u[t.charCodeAt(r+1)]>>4,s[a++]=255&e);1===o&&(e=u[t.charCodeAt(r)]<<10|u[t.charCodeAt(r+1)]<<4|u[t.charCodeAt(r+2)]>>2,s[a++]=e>>8&255,s[a++]=255&e);return s},r.fromByteArray=function(t){for(var e,r=t.length,n=r%3,i=[],o=0,s=r-n;o<s;o+=16383)i.push(h(t,o,s<o+16383?s:o+16383));1==n?(e=t[r-1],i.push(a[e>>2]+a[e<<4&63]+"==")):2==n&&(e=(t[r-2]<<8)+t[r-1],i.push(a[e>>10]+a[e>>4&63]+a[e<<2&63]+"="));return i.join("")};for(var a=[],u=[],p="undefined"!=typeof Uint8Array?Uint8Array:Array,n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",i=0,o=n.length;i<o;++i)a[i]=n[i],u[n.charCodeAt(i)]=i;function f(t){var e=t.length;if(0<e%4)throw new Error("Invalid string. Length must be a multiple of 4");var r=t.indexOf("=");return-1===r&&(r=e),[r,r===e?0:4-r%4]}function h(t,e,r){for(var n,i,o=[],s=e;s<r;s+=3)n=(t[s]<<16&16711680)+(t[s+1]<<8&65280)+(255&t[s+2]),o.push(a[(i=n)>>18&63]+a[i>>12&63]+a[i>>6&63]+a[63&i]);return o.join("")}u["-".charCodeAt(0)]=62,u["_".charCodeAt(0)]=63},{}],15:[function(t,e,r){r.read=function(t,e,r,n,i){var o,s,a=8*i-n-1,h=(1<<a)-1,u=h>>1,p=-7,f=r?i-1:0,c=r?-1:1,l=t[e+f];for(f+=c,o=l&(1<<-p)-1,l>>=-p,p+=a;0<p;o=256*o+t[e+f],f+=c,p-=8);for(s=o&(1<<-p)-1,o>>=-p,p+=n;0<p;s=256*s+t[e+f],f+=c,p-=8);if(0===o)o=1-u;else{if(o===h)return s?NaN:1/0*(l?-1:1);s+=Math.pow(2,n),o-=u}return(l?-1:1)*s*Math.pow(2,o-n)},r.write=function(t,e,r,n,i,o){var s,a,h,u=8*o-i-1,p=(1<<u)-1,f=p>>1,c=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,l=n?0:o-1,g=n?1:-1,y=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,s=p):(s=Math.floor(Math.log(e)/Math.LN2),e*(h=Math.pow(2,-s))<1&&(s--,h*=2),2<=(e+=1<=s+f?c/h:c*Math.pow(2,1-f))*h&&(s++,h/=2),p<=s+f?(a=0,s=p):1<=s+f?(a=(e*h-1)*Math.pow(2,i),s+=f):(a=e*Math.pow(2,f-1)*Math.pow(2,i),s=0));8<=i;t[r+l]=255&a,l+=g,a/=256,i-=8);for(s=s<<i|a,u+=i;0<u;t[r+l]=255&s,l+=g,s/=256,u-=8);t[r+l-g]|=128*y}},{}],16:[function(t,e,r){"function"==typeof Object.create?e.exports=function(t,e){t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:e.exports=function(t,e){t.super_=e;function r(){}r.prototype=e.prototype,t.prototype=new r,t.prototype.constructor=t}},{}],17:[function(t,e,r){function n(t){return!!t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)}e.exports=function(t){return null!=t&&(n(t)||"function"==typeof(e=t).readFloatLE&&"function"==typeof e.slice&&n(e.slice(0,0))||!!t._isBuffer);var e}},{}],18:[function(t,e,r){var n,i,o=e.exports={};function s(){throw new Error("setTimeout has not been defined")}function a(){throw new Error("clearTimeout has not been defined")}function h(e){if(n===setTimeout)return setTimeout(e,0);if((n===s||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:s}catch(t){n=s}try{i="function"==typeof clearTimeout?clearTimeout:a}catch(t){i=a}}();var u,p=[],f=!1,c=-1;function l(){f&&u&&(f=!1,u.length?p=u.concat(p):c=-1,p.length&&g())}function g(){if(!f){var t=h(l);f=!0;for(var e=p.length;e;){for(u=p,p=[];++c<e;)u&&u[c].run();c=-1,e=p.length}u=null,f=!1,function(e){if(i===clearTimeout)return clearTimeout(e);if((i===a||!i)&&clearTimeout)return i=clearTimeout,clearTimeout(e);try{i(e)}catch(t){try{return i.call(null,e)}catch(t){return i.call(this,e)}}}(t)}}function y(t,e){this.fun=t,this.array=e}function w(){}o.nextTick=function(t){var e=new Array(arguments.length-1);if(1<arguments.length)for(var r=1;r<arguments.length;r++)e[r-1]=arguments[r];p.push(new y(t,e)),1!==p.length||f||h(g)},y.prototype.run=function(){this.fun.apply(null,this.array)},o.title="browser",o.browser=!0,o.env={},o.argv=[],o.version="",o.versions={},o.on=w,o.addListener=w,o.once=w,o.off=w,o.removeListener=w,o.removeAllListeners=w,o.emit=w,o.prependListener=w,o.prependOnceListener=w,o.listeners=function(t){return[]},o.binding=function(t){throw new Error("process.binding is not supported")},o.cwd=function(){return"/"},o.chdir=function(t){throw new Error("process.chdir is not supported")},o.umask=function(){return 0}},{}],19:[function(t,e,r){e.exports=function(t){return t&&"object"==typeof t&&"function"==typeof t.copy&&"function"==typeof t.fill&&"function"==typeof t.readUInt8}},{}],20:[function(c,t,x){(function(n,i){var a=/%[sdj%]/g;x.format=function(t){if(!m(t)){for(var e=[],r=0;r<arguments.length;r++)e.push(h(arguments[r]));return e.join(" ")}r=1;for(var n=arguments,i=n.length,o=String(t).replace(a,function(t){if("%%"===t)return"%";if(i<=r)return t;switch(t){case"%s":return String(n[r++]);case"%d":return Number(n[r++]);case"%j":try{return JSON.stringify(n[r++])}catch(t){return"[Circular]"}default:return t}}),s=n[r];r<i;s=n[++r])b(s)||!p(s)?o+=" "+s:o+=" "+h(s);return o},x.deprecate=function(t,e){if(k(i.process))return function(){return x.deprecate(t,e).apply(this,arguments)};if(!0===n.noDeprecation)return t;var r=!1;return function(){if(!r){if(n.throwDeprecation)throw new Error(e);n.traceDeprecation?console.trace(e):console.error(e),r=!0}return t.apply(this,arguments)}};var t,o={};function h(t,e){var r={seen:[],stylize:u};return 3<=arguments.length&&(r.depth=arguments[2]),4<=arguments.length&&(r.colors=arguments[3]),d(e)?r.showHidden=e:e&&x._extend(r,e),k(r.showHidden)&&(r.showHidden=!1),k(r.depth)&&(r.depth=2),k(r.colors)&&(r.colors=!1),k(r.customInspect)&&(r.customInspect=!0),r.colors&&(r.stylize=s),l(r,t,r.depth)}function s(t,e){var r=h.styles[e];return r?"["+h.colors[r][0]+"m"+t+"["+h.colors[r][1]+"m":t}function u(t,e){return t}function l(e,r,n){if(e.customInspect&&r&&I(r.inspect)&&r.inspect!==x.inspect&&(!r.constructor||r.constructor.prototype!==r)){var t=r.inspect(n,e);return m(t)||(t=l(e,t,n)),t}var i=function(t,e){if(k(e))return t.stylize("undefined","undefined");if(m(e)){var r="'"+JSON.stringify(e).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return t.stylize(r,"string")}if(v(e))return t.stylize(""+e,"number");if(d(e))return t.stylize(""+e,"boolean");if(b(e))return t.stylize("null","null")}(e,r);if(i)return i;var o,s=Object.keys(r),a=(o={},s.forEach(function(t,e){o[t]=!0}),o);if(e.showHidden&&(s=Object.getOwnPropertyNames(r)),S(r)&&(0<=s.indexOf("message")||0<=s.indexOf("description")))return g(r);if(0===s.length){if(I(r)){var h=r.name?": "+r.name:"";return e.stylize("[Function"+h+"]","special")}if(M(r))return e.stylize(RegExp.prototype.toString.call(r),"regexp");if(E(r))return e.stylize(Date.prototype.toString.call(r),"date");if(S(r))return g(r)}var u,p="",f=!1,c=["{","}"];w(r)&&(f=!0,c=["[","]"]),I(r)&&(p=" [Function"+(r.name?": "+r.name:"")+"]");return M(r)&&(p=" "+RegExp.prototype.toString.call(r)),E(r)&&(p=" "+Date.prototype.toUTCString.call(r)),S(r)&&(p=" "+g(r)),0!==s.length||f&&0!=r.length?n<0?M(r)?e.stylize(RegExp.prototype.toString.call(r),"regexp"):e.stylize("[Object]","special"):(e.seen.push(r),u=f?function(e,r,n,i,t){for(var o=[],s=0,a=r.length;s<a;++s)_(r,String(s))?o.push(y(e,r,n,i,String(s),!0)):o.push("");return t.forEach(function(t){t.match(/^\d+$/)||o.push(y(e,r,n,i,t,!0))}),o}(e,r,n,a,s):s.map(function(t){return y(e,r,n,a,t,f)}),e.seen.pop(),function(t,e,r){if(60<t.reduce(function(t,e){return 0<=e.indexOf("\n")&&0,t+e.replace(/\u001b\[\d\d?m/g,"").length+1},0))return r[0]+(""===e?"":e+"\n ")+" "+t.join(",\n  ")+" "+r[1];return r[0]+e+" "+t.join(", ")+" "+r[1]}(u,p,c)):c[0]+p+c[1]}function g(t){return"["+Error.prototype.toString.call(t)+"]"}function y(t,e,r,n,i,o){var s,a,h;if((h=Object.getOwnPropertyDescriptor(e,i)||{value:e[i]}).get?a=h.set?t.stylize("[Getter/Setter]","special"):t.stylize("[Getter]","special"):h.set&&(a=t.stylize("[Setter]","special")),_(n,i)||(s="["+i+"]"),a||(t.seen.indexOf(h.value)<0?-1<(a=b(r)?l(t,h.value,null):l(t,h.value,r-1)).indexOf("\n")&&(a=o?a.split("\n").map(function(t){return"  "+t}).join("\n").substr(2):"\n"+a.split("\n").map(function(t){return"   "+t}).join("\n")):a=t.stylize("[Circular]","special")),k(s)){if(o&&i.match(/^\d+$/))return a;s=(s=JSON.stringify(""+i)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(s=s.substr(1,s.length-2),t.stylize(s,"name")):(s=s.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),t.stylize(s,"string"))}return s+": "+a}function w(t){return Array.isArray(t)}function d(t){return"boolean"==typeof t}function b(t){return null===t}function v(t){return"number"==typeof t}function m(t){return"string"==typeof t}function k(t){return void 0===t}function M(t){return p(t)&&"[object RegExp]"===e(t)}function p(t){return"object"==typeof t&&null!==t}function E(t){return p(t)&&"[object Date]"===e(t)}function S(t){return p(t)&&("[object Error]"===e(t)||t instanceof Error)}function I(t){return"function"==typeof t}function e(t){return Object.prototype.toString.call(t)}function r(t){return t<10?"0"+t.toString(10):t.toString(10)}x.debuglog=function(e){if(k(t)&&(t=n.env.NODE_DEBUG||""),e=e.toUpperCase(),!o[e])if(new RegExp("\\b"+e+"\\b","i").test(t)){var r=n.pid;o[e]=function(){var t=x.format.apply(x,arguments);console.error("%s %d: %s",e,r,t)}}else o[e]=function(){};return o[e]},(x.inspect=h).colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},h.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"},x.isArray=w,x.isBoolean=d,x.isNull=b,x.isNullOrUndefined=function(t){return null==t},x.isNumber=v,x.isString=m,x.isSymbol=function(t){return"symbol"==typeof t},x.isUndefined=k,x.isRegExp=M,x.isObject=p,x.isDate=E,x.isError=S,x.isFunction=I,x.isPrimitive=function(t){return null===t||"boolean"==typeof t||"number"==typeof t||"string"==typeof t||"symbol"==typeof t||void 0===t},x.isBuffer=c("./support/isBuffer");var f=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function _(t,e){return Object.prototype.hasOwnProperty.call(t,e)}x.log=function(){var t,e;console.log("%s - %s",(t=new Date,e=[r(t.getHours()),r(t.getMinutes()),r(t.getSeconds())].join(":"),[t.getDate(),f[t.getMonth()],e].join(" ")),x.format.apply(x,arguments))},x.inherits=c("inherits"),x._extend=function(t,e){if(!e||!p(e))return t;for(var r=Object.keys(e),n=r.length;n--;)t[r[n]]=e[r[n]];return t}}).call(this,c("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./support/isBuffer":19,_process:18,inherits:16}],buffer:[function(N,t,z){(function(f){"use strict";var n=N("base64-js"),o=N("ieee754"),t="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;z.Buffer=f,z.SlowBuffer=function(t){+t!=t&&(t=0);return f.alloc(+t)},z.INSPECT_MAX_BYTES=50;var r=2147483647;function s(t){if(r<t)throw new RangeError('The value "'+t+'" is invalid for option "size"');var e=new Uint8Array(t);return Object.setPrototypeOf(e,f.prototype),e}function f(t,e,r){if("number"!=typeof t)return i(t,e,r);if("string"==typeof e)throw new TypeError('The "string" argument must be of type string. Received type number');return h(t)}function i(t,e,r){if("string"==typeof t)return function(t,e){"string"==typeof e&&""!==e||(e="utf8");if(!f.isEncoding(e))throw new TypeError("Unknown encoding: "+e);var r=0|l(t,e),n=s(r),i=n.write(t,e);i!==r&&(n=n.slice(0,i));return n}(t,e);if(ArrayBuffer.isView(t))return u(t);if(null==t)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t);if(R(t,ArrayBuffer)||t&&R(t.buffer,ArrayBuffer))return p(t,e,r);if("undefined"!=typeof SharedArrayBuffer&&(R(t,SharedArrayBuffer)||t&&R(t.buffer,SharedArrayBuffer)))return p(t,e,r);if("number"==typeof t)throw new TypeError('The "value" argument must not be of type number. Received type number');var n=t.valueOf&&t.valueOf();if(null!=n&&n!==t)return f.from(n,e,r);var i=function(t){if(f.isBuffer(t)){var e=0|c(t.length),r=s(e);return 0===r.length?r:(t.copy(r,0,0,e),r)}if(void 0!==t.length)return"number"!=typeof t.length||U(t.length)?s(0):u(t);if("Buffer"===t.type&&Array.isArray(t.data))return u(t.data)}(t);if(i)return i;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof t[Symbol.toPrimitive])return f.from(t[Symbol.toPrimitive]("string"),e,r);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t)}function a(t){if("number"!=typeof t)throw new TypeError('"size" argument must be of type number');if(t<0)throw new RangeError('The value "'+t+'" is invalid for option "size"')}function h(t){return a(t),s(t<0?0:0|c(t))}function u(t){for(var e=t.length<0?0:0|c(t.length),r=s(e),n=0;n<e;n+=1)r[n]=255&t[n];return r}function p(t,e,r){if(e<0||t.byteLength<e)throw new RangeError('"offset" is outside of buffer bounds');if(t.byteLength<e+(r||0))throw new RangeError('"length" is outside of buffer bounds');var n;return n=void 0===e&&void 0===r?new Uint8Array(t):void 0===r?new Uint8Array(t,e):new Uint8Array(t,e,r),Object.setPrototypeOf(n,f.prototype),n}function c(t){if(r<=t)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+r.toString(16)+" bytes");return 0|t}function l(t,e){if(f.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||R(t,ArrayBuffer))return t.byteLength;if("string"!=typeof t)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof t);var r=t.length,n=2<arguments.length&&!0===arguments[2];if(!n&&0===r)return 0;for(var i=!1;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":return W(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return L(t).length;default:if(i)return n?-1:W(t).length;e=(""+e).toLowerCase(),i=!0}}function g(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function y(t,e,r,n,i){if(0===t.length)return-1;if("string"==typeof r?(n=r,r=0):2147483647<r?r=2147483647:r<-2147483648&&(r=-2147483648),U(r=+r)&&(r=i?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(i)return-1;r=t.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof e&&(e=f.from(e,n)),f.isBuffer(e))return 0===e.length?-1:w(t,e,r,n,i);if("number"==typeof e)return e&=255,"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):w(t,[e],r,n,i);throw new TypeError("val must be string, number or Buffer")}function w(t,e,r,n,i){var o,s=1,a=t.length,h=e.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||e.length<2)return-1;a/=s=2,h/=2,r/=2}function u(t,e){return 1===s?t[e]:t.readUInt16BE(e*s)}if(i){var p=-1;for(o=r;o<a;o++)if(u(t,o)===u(e,-1===p?0:o-p)){if(-1===p&&(p=o),o-p+1===h)return p*s}else-1!==p&&(o-=o-p),p=-1}else for(a<r+h&&(r=a-h),o=r;0<=o;o--){for(var f=!0,c=0;c<h;c++)if(u(t,o+c)!==u(e,c)){f=!1;break}if(f)return o}return-1}function d(t,e,r,n){r=Number(r)||0;var i=t.length-r;(!n||i<(n=Number(n)))&&(n=i);var o=e.length;o/2<n&&(n=o/2);for(var s=0;s<n;++s){var a=parseInt(e.substr(2*s,2),16);if(U(a))return s;t[r+s]=a}return s}function b(t,e,r,n){return B(function(t){for(var e=[],r=0;r<t.length;++r)e.push(255&t.charCodeAt(r));return e}(e),t,r,n)}function v(t,e,r,n){return B(function(t,e){for(var r,n,i,o=[],s=0;s<t.length&&!((e-=2)<0);++s)r=t.charCodeAt(s),n=r>>8,i=r%256,o.push(i),o.push(n);return o}(e,t.length-r),t,r,n)}function m(t,e,r){return 0===e&&r===t.length?n.fromByteArray(t):n.fromByteArray(t.slice(e,r))}function k(t,e,r){r=Math.min(t.length,r);for(var n=[],i=e;i<r;){var o,s,a,h,u=t[i],p=null,f=239<u?4:223<u?3:191<u?2:1;if(i+f<=r)switch(f){case 1:u<128&&(p=u);break;case 2:128==(192&(o=t[i+1]))&&127<(h=(31&u)<<6|63&o)&&(p=h);break;case 3:o=t[i+1],s=t[i+2],128==(192&o)&&128==(192&s)&&2047<(h=(15&u)<<12|(63&o)<<6|63&s)&&(h<55296||57343<h)&&(p=h);break;case 4:o=t[i+1],s=t[i+2],a=t[i+3],128==(192&o)&&128==(192&s)&&128==(192&a)&&65535<(h=(15&u)<<18|(63&o)<<12|(63&s)<<6|63&a)&&h<1114112&&(p=h)}null===p?(p=65533,f=1):65535<p&&(p-=65536,n.push(p>>>10&1023|55296),p=56320|1023&p),n.push(p),i+=f}return function(t){var e=t.length;if(e<=M)return String.fromCharCode.apply(String,t);var r="",n=0;for(;n<e;)r+=String.fromCharCode.apply(String,t.slice(n,n+=M));return r}(n)}z.kMaxLength=r,(f.TYPED_ARRAY_SUPPORT=function(){try{var t=new Uint8Array(1),e={foo:function(){return 42}};return Object.setPrototypeOf(e,Uint8Array.prototype),Object.setPrototypeOf(t,e),42===t.foo()}catch(t){return!1}}())||"undefined"==typeof console||"function"!=typeof console.error||console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support."),Object.defineProperty(f.prototype,"parent",{enumerable:!0,get:function(){if(f.isBuffer(this))return this.buffer}}),Object.defineProperty(f.prototype,"offset",{enumerable:!0,get:function(){if(f.isBuffer(this))return this.byteOffset}}),"undefined"!=typeof Symbol&&null!=Symbol.species&&f[Symbol.species]===f&&Object.defineProperty(f,Symbol.species,{value:null,configurable:!0,enumerable:!1,writable:!1}),f.poolSize=8192,f.from=function(t,e,r){return i(t,e,r)},Object.setPrototypeOf(f.prototype,Uint8Array.prototype),Object.setPrototypeOf(f,Uint8Array),f.alloc=function(t,e,r){return i=e,o=r,a(n=t),n<=0||void 0===i?s(n):"string"==typeof o?s(n).fill(i,o):s(n).fill(i);var n,i,o},f.allocUnsafe=function(t){return h(t)},f.allocUnsafeSlow=function(t){return h(t)},f.isBuffer=function(t){return null!=t&&!0===t._isBuffer&&t!==f.prototype},f.compare=function(t,e){if(R(t,Uint8Array)&&(t=f.from(t,t.offset,t.byteLength)),R(e,Uint8Array)&&(e=f.from(e,e.offset,e.byteLength)),!f.isBuffer(t)||!f.isBuffer(e))throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if(t===e)return 0;for(var r=t.length,n=e.length,i=0,o=Math.min(r,n);i<o;++i)if(t[i]!==e[i]){r=t[i],n=e[i];break}return r<n?-1:n<r?1:0},f.isEncoding=function(t){switch(String(t).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},f.concat=function(t,e){if(!Array.isArray(t))throw new TypeError('"list" argument must be an Array of Buffers');if(0===t.length)return f.alloc(0);var r;if(void 0===e)for(r=e=0;r<t.length;++r)e+=t[r].length;var n=f.allocUnsafe(e),i=0;for(r=0;r<t.length;++r){var o=t[r];if(R(o,Uint8Array)&&(o=f.from(o)),!f.isBuffer(o))throw new TypeError('"list" argument must be an Array of Buffers');o.copy(n,i),i+=o.length}return n},f.byteLength=l,f.prototype._isBuffer=!0,f.prototype.swap16=function(){var t=this.length;if(t%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var e=0;e<t;e+=2)g(this,e,e+1);return this},f.prototype.swap32=function(){var t=this.length;if(t%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var e=0;e<t;e+=4)g(this,e,e+3),g(this,e+1,e+2);return this},f.prototype.swap64=function(){var t=this.length;if(t%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var e=0;e<t;e+=8)g(this,e,e+7),g(this,e+1,e+6),g(this,e+2,e+5),g(this,e+3,e+4);return this},f.prototype.toLocaleString=f.prototype.toString=function(){var t=this.length;return 0===t?"":0===arguments.length?k(this,0,t):function(t,e,r){var n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(e>>>=0))return"";for(t=t||"utf8";;)switch(t){case"hex":return I(this,e,r);case"utf8":case"utf-8":return k(this,e,r);case"ascii":return E(this,e,r);case"latin1":case"binary":return S(this,e,r);case"base64":return m(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return _(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}.apply(this,arguments)},f.prototype.equals=function(t){if(!f.isBuffer(t))throw new TypeError("Argument must be a Buffer");return this===t||0===f.compare(this,t)},f.prototype.inspect=function(){var t="",e=z.INSPECT_MAX_BYTES;return t=this.toString("hex",0,e).replace(/(.{2})/g,"$1 ").trim(),this.length>e&&(t+=" ... "),"<Buffer "+t+">"},t&&(f.prototype[t]=f.prototype.inspect),f.prototype.compare=function(t,e,r,n,i){if(R(t,Uint8Array)&&(t=f.from(t,t.offset,t.byteLength)),!f.isBuffer(t))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof t);if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),e<0||r>t.length||n<0||i>this.length)throw new RangeError("out of range index");if(i<=n&&r<=e)return 0;if(i<=n)return-1;if(r<=e)return 1;if(this===t)return 0;for(var o=(i>>>=0)-(n>>>=0),s=(r>>>=0)-(e>>>=0),a=Math.min(o,s),h=this.slice(n,i),u=t.slice(e,r),p=0;p<a;++p)if(h[p]!==u[p]){o=h[p],s=u[p];break}return o<s?-1:s<o?1:0},f.prototype.includes=function(t,e,r){return-1!==this.indexOf(t,e,r)},f.prototype.indexOf=function(t,e,r){return y(this,t,e,r,!0)},f.prototype.lastIndexOf=function(t,e,r){return y(this,t,e,r,!1)},f.prototype.write=function(t,e,r,n){if(void 0===e)n="utf8",r=this.length,e=0;else if(void 0===r&&"string"==typeof e)n=e,r=this.length,e=0;else{if(!isFinite(e))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");e>>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n="utf8")):(n=r,r=void 0)}var i=this.length-e;if((void 0===r||i<r)&&(r=i),0<t.length&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");n=n||"utf8";for(var o,s,a,h,u,p,f=!1;;)switch(n){case"hex":return d(this,t,e,r);case"utf8":case"utf-8":return u=e,p=r,B(W(t,(h=this).length-u),h,u,p);case"ascii":return b(this,t,e,r);case"latin1":case"binary":return b(this,t,e,r);case"base64":return o=this,s=e,a=r,B(L(t),o,s,a);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return v(this,t,e,r);default:if(f)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),f=!0}},f.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var M=4096;function E(t,e,r){var n="";r=Math.min(t.length,r);for(var i=e;i<r;++i)n+=String.fromCharCode(127&t[i]);return n}function S(t,e,r){var n="";r=Math.min(t.length,r);for(var i=e;i<r;++i)n+=String.fromCharCode(t[i]);return n}function I(t,e,r){var n=t.length;(!e||e<0)&&(e=0),(!r||r<0||n<r)&&(r=n);for(var i="",o=e;o<r;++o)i+=G[t[o]];return i}function _(t,e,r){for(var n=t.slice(e,r),i="",o=0;o<n.length;o+=2)i+=String.fromCharCode(n[o]+256*n[o+1]);return i}function x(t,e,r){if(t%1!=0||t<0)throw new RangeError("offset is not uint");if(r<t+e)throw new RangeError("Trying to access beyond buffer length")}function T(t,e,r,n,i,o){if(!f.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(i<e||e<o)throw new RangeError('"value" argument is out of bounds');if(r+n>t.length)throw new RangeError("Index out of range")}function P(t,e,r,n){if(r+n>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function Z(t,e,r,n,i){return e=+e,r>>>=0,i||P(t,0,r,4),o.write(t,e,r,n,23,4),r+4}function O(t,e,r,n,i){return e=+e,r>>>=0,i||P(t,0,r,8),o.write(t,e,r,n,52,8),r+8}f.prototype.slice=function(t,e){var r=this.length;(t=~~t)<0?(t+=r)<0&&(t=0):r<t&&(t=r),(e=void 0===e?r:~~e)<0?(e+=r)<0&&(e=0):r<e&&(e=r),e<t&&(e=t);var n=this.subarray(t,e);return Object.setPrototypeOf(n,f.prototype),n},f.prototype.readUIntLE=function(t,e,r){t>>>=0,e>>>=0,r||x(t,e,this.length);for(var n=this[t],i=1,o=0;++o<e&&(i*=256);)n+=this[t+o]*i;return n},f.prototype.readUIntBE=function(t,e,r){t>>>=0,e>>>=0,r||x(t,e,this.length);for(var n=this[t+--e],i=1;0<e&&(i*=256);)n+=this[t+--e]*i;return n},f.prototype.readUInt8=function(t,e){return t>>>=0,e||x(t,1,this.length),this[t]},f.prototype.readUInt16LE=function(t,e){return t>>>=0,e||x(t,2,this.length),this[t]|this[t+1]<<8},f.prototype.readUInt16BE=function(t,e){return t>>>=0,e||x(t,2,this.length),this[t]<<8|this[t+1]},f.prototype.readUInt32LE=function(t,e){return t>>>=0,e||x(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},f.prototype.readUInt32BE=function(t,e){return t>>>=0,e||x(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},f.prototype.readIntLE=function(t,e,r){t>>>=0,e>>>=0,r||x(t,e,this.length);for(var n=this[t],i=1,o=0;++o<e&&(i*=256);)n+=this[t+o]*i;return(i*=128)<=n&&(n-=Math.pow(2,8*e)),n},f.prototype.readIntBE=function(t,e,r){t>>>=0,e>>>=0,r||x(t,e,this.length);for(var n=e,i=1,o=this[t+--n];0<n&&(i*=256);)o+=this[t+--n]*i;return(i*=128)<=o&&(o-=Math.pow(2,8*e)),o},f.prototype.readInt8=function(t,e){return t>>>=0,e||x(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},f.prototype.readInt16LE=function(t,e){t>>>=0,e||x(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},f.prototype.readInt16BE=function(t,e){t>>>=0,e||x(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},f.prototype.readInt32LE=function(t,e){return t>>>=0,e||x(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},f.prototype.readInt32BE=function(t,e){return t>>>=0,e||x(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},f.prototype.readFloatLE=function(t,e){return t>>>=0,e||x(t,4,this.length),o.read(this,t,!0,23,4)},f.prototype.readFloatBE=function(t,e){return t>>>=0,e||x(t,4,this.length),o.read(this,t,!1,23,4)},f.prototype.readDoubleLE=function(t,e){return t>>>=0,e||x(t,8,this.length),o.read(this,t,!0,52,8)},f.prototype.readDoubleBE=function(t,e){return t>>>=0,e||x(t,8,this.length),o.read(this,t,!1,52,8)},f.prototype.writeUIntLE=function(t,e,r,n){t=+t,e>>>=0,r>>>=0,n||T(this,t,e,r,Math.pow(2,8*r)-1,0);var i=1,o=0;for(this[e]=255&t;++o<r&&(i*=256);)this[e+o]=t/i&255;return e+r},f.prototype.writeUIntBE=function(t,e,r,n){t=+t,e>>>=0,r>>>=0,n||T(this,t,e,r,Math.pow(2,8*r)-1,0);var i=r-1,o=1;for(this[e+i]=255&t;0<=--i&&(o*=256);)this[e+i]=t/o&255;return e+r},f.prototype.writeUInt8=function(t,e,r){return t=+t,e>>>=0,r||T(this,t,e,1,255,0),this[e]=255&t,e+1},f.prototype.writeUInt16LE=function(t,e,r){return t=+t,e>>>=0,r||T(this,t,e,2,65535,0),this[e]=255&t,this[e+1]=t>>>8,e+2},f.prototype.writeUInt16BE=function(t,e,r){return t=+t,e>>>=0,r||T(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=255&t,e+2},f.prototype.writeUInt32LE=function(t,e,r){return t=+t,e>>>=0,r||T(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t,e+4},f.prototype.writeUInt32BE=function(t,e,r){return t=+t,e>>>=0,r||T(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},f.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e>>>=0,!n){var i=Math.pow(2,8*r-1);T(this,t,e,r,i-1,-i)}var o=0,s=1,a=0;for(this[e]=255&t;++o<r&&(s*=256);)t<0&&0===a&&0!==this[e+o-1]&&(a=1),this[e+o]=(t/s>>0)-a&255;return e+r},f.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e>>>=0,!n){var i=Math.pow(2,8*r-1);T(this,t,e,r,i-1,-i)}var o=r-1,s=1,a=0;for(this[e+o]=255&t;0<=--o&&(s*=256);)t<0&&0===a&&0!==this[e+o+1]&&(a=1),this[e+o]=(t/s>>0)-a&255;return e+r},f.prototype.writeInt8=function(t,e,r){return t=+t,e>>>=0,r||T(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=255&t,e+1},f.prototype.writeInt16LE=function(t,e,r){return t=+t,e>>>=0,r||T(this,t,e,2,32767,-32768),this[e]=255&t,this[e+1]=t>>>8,e+2},f.prototype.writeInt16BE=function(t,e,r){return t=+t,e>>>=0,r||T(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=255&t,e+2},f.prototype.writeInt32LE=function(t,e,r){return t=+t,e>>>=0,r||T(this,t,e,4,2147483647,-2147483648),this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},f.prototype.writeInt32BE=function(t,e,r){return t=+t,e>>>=0,r||T(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},f.prototype.writeFloatLE=function(t,e,r){return Z(this,t,e,!0,r)},f.prototype.writeFloatBE=function(t,e,r){return Z(this,t,e,!1,r)},f.prototype.writeDoubleLE=function(t,e,r){return O(this,t,e,!0,r)},f.prototype.writeDoubleBE=function(t,e,r){return O(this,t,e,!1,r)},f.prototype.copy=function(t,e,r,n){if(!f.isBuffer(t))throw new TypeError("argument should be a Buffer");if(r=r||0,n||0===n||(n=this.length),e>=t.length&&(e=t.length),e=e||0,0<n&&n<r&&(n=r),n===r)return 0;if(0===t.length||0===this.length)return 0;if(e<0)throw new RangeError("targetStart out of bounds");if(r<0||r>=this.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-e<n-r&&(n=t.length-e+r);var i=n-r;if(this===t&&"function"==typeof Uint8Array.prototype.copyWithin)this.copyWithin(e,r,n);else if(this===t&&r<e&&e<n)for(var o=i-1;0<=o;--o)t[o+e]=this[o+r];else Uint8Array.prototype.set.call(t,this.subarray(r,n),e);return i},f.prototype.fill=function(t,e,r,n){if("string"==typeof t){if("string"==typeof e?(n=e,e=0,r=this.length):"string"==typeof r&&(n=r,r=this.length),void 0!==n&&"string"!=typeof n)throw new TypeError("encoding must be a string");if("string"==typeof n&&!f.isEncoding(n))throw new TypeError("Unknown encoding: "+n);if(1===t.length){var i=t.charCodeAt(0);("utf8"===n&&i<128||"latin1"===n)&&(t=i)}}else"number"==typeof t?t&=255:"boolean"==typeof t&&(t=Number(t));if(e<0||this.length<e||this.length<r)throw new RangeError("Out of range index");if(r<=e)return this;var o;if(e>>>=0,r=void 0===r?this.length:r>>>0,"number"==typeof(t=t||0))for(o=e;o<r;++o)this[o]=t;else{var s=f.isBuffer(t)?t:f.from(t,n),a=s.length;if(0===a)throw new TypeError('The value "'+t+'" is invalid for argument "value"');for(o=0;o<r-e;++o)this[o+e]=s[o%a]}return this};var e=/[^+/0-9A-Za-z-_]/g;function W(t,e){var r;e=e||1/0;for(var n=t.length,i=null,o=[],s=0;s<n;++s){if(55295<(r=t.charCodeAt(s))&&r<57344){if(!i){if(56319<r){-1<(e-=3)&&o.push(239,191,189);continue}if(s+1===n){-1<(e-=3)&&o.push(239,191,189);continue}i=r;continue}if(r<56320){-1<(e-=3)&&o.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&-1<(e-=3)&&o.push(239,191,189);if(i=null,r<128){if(--e<0)break;o.push(r)}else if(r<2048){if((e-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function L(t){return n.toByteArray(function(t){if((t=(t=t.split("=")[0]).trim().replace(e,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function B(t,e,r,n){for(var i=0;i<n&&!(i+r>=e.length||i>=t.length);++i)e[i+r]=t[i];return i}function R(t,e){return t instanceof e||null!=t&&null!=t.constructor&&null!=t.constructor.name&&t.constructor.name===e.name}function U(t){return t!=t}var G=function(){for(var t="0123456789abcdef",e=new Array(256),r=0;r<16;++r)for(var n=16*r,i=0;i<16;++i)e[n+i]=t[r]+t[i];return e}()}).call(this,N("buffer").Buffer)},{"base64-js":14,buffer:"buffer",ieee754:15}],wkx:[function(t,e,r){r.Types=t("./types"),r.Geometry=t("./geometry"),r.Point=t("./point"),r.LineString=t("./linestring"),r.Polygon=t("./polygon"),r.MultiPoint=t("./multipoint"),r.MultiLineString=t("./multilinestring"),r.MultiPolygon=t("./multipolygon"),r.GeometryCollection=t("./geometrycollection")},{"./geometry":3,"./geometrycollection":4,"./linestring":5,"./multilinestring":6,"./multipoint":7,"./multipolygon":8,"./point":9,"./polygon":10,"./types":11}]},{},["wkx"]);
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.
{
  "name": "wrappy",
  "version": "1.0.2",
  "description": "Callback wrapping utility",
  "main": "wrappy.js",
  "files": [
    "wrappy.js"
  ],
  "directories": {
    "test": "test"
  },
  "dependencies": {},
  "devDependencies": {
    "tap": "^2.3.1"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/npm/wrappy"
  },
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
  "license": "ISC",
  "homepage": "https://github.com/npm/wrappy"
}// Returns a wrapper function that returns a wrapped callback
// The wrapper function should do some stuff, and return a
// presumably different callback function.
// This makes sure that own properties are retained, so that
// decorations and such are not lost along the way.
module.exports = wrappy
function wrappy (fn, cb) {
  if (fn && cb) return wrappy(fn)(cb)

  if (typeof fn !== 'function')
    throw new TypeError('need wrapper function')

  Object.keys(fn).forEach(function (k) {
    wrapper[k] = fn[k]
  })

  return wrapper

  function wrapper() {
    var args = new Array(arguments.length)
    for (var i = 0; i < args.length; i++) {
      args[i] = arguments[i]
    }
    var ret = fn.apply(this, args)
    var cb = args[args.length-1]
    if (typeof ret === 'function' && ret !== cb) {
      Object.keys(cb).forEach(function (k) {
        ret[k] = cb[k]
      })
    }
    return ret
  }
}
Copyright 2010, 2011, 2012, 2013. All rights reserved.

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": "xml2js",
  "description": "Simple XML to JavaScript object converter.",
  "homepage": "https://github.com/Leonidas-from-XIV/node-xml2js",
  "version": "0.4.23",
  "author": "Marek Kubica <marek@xivilization.net> (https://xivilization.net)",
  "main": "./lib/xml2js",
  "files": [
    "lib"
  ],
  "directories": {
    "lib": "./lib"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/Leonidas-from-XIV/node-xml2js.git"
  },
  "dependencies": {
    "sax": ">=0.6.0",
    "xmlbuilder": "~11.0.0"
  },
  "devDependencies": {
    "coffee-script": ">=1.10.0",
    "coveralls": "^3.0.1",
    "diff": ">=1.0.8",
    "docco": ">=0.6.2",
    "nyc": ">=2.2.1",
    "zap": ">=0.2.9"
  },
  "engines": {
    "node": ">=4.0.0"
  },
  "license": "MIT"
}// Generated by CoffeeScript 1.12.7
(function() {
  "use strict";
  exports.stripBOM = function(str) {
    if (str[0] === '\uFEFF') {
      return str.substring(1);
    } else {
      return str;
    }
  };

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  "use strict";
  var builder, defaults, escapeCDATA, requiresCDATA, wrapCDATA,
    hasProp = {}.hasOwnProperty;

  builder = require('xmlbuilder');

  defaults = require('./defaults').defaults;

  requiresCDATA = function(entry) {
    return typeof entry === "string" && (entry.indexOf('&') >= 0 || entry.indexOf('>') >= 0 || entry.indexOf('<') >= 0);
  };

  wrapCDATA = function(entry) {
    return "<![CDATA[" + (escapeCDATA(entry)) + "]]>";
  };

  escapeCDATA = function(entry) {
    return entry.replace(']]>', ']]]]><![CDATA[>');
  };

  exports.Builder = (function() {
    function Builder(opts) {
      var key, ref, value;
      this.options = {};
      ref = defaults["0.2"];
      for (key in ref) {
        if (!hasProp.call(ref, key)) continue;
        value = ref[key];
        this.options[key] = value;
      }
      for (key in opts) {
        if (!hasProp.call(opts, key)) continue;
        value = opts[key];
        this.options[key] = value;
      }
    }

    Builder.prototype.buildObject = function(rootObj) {
      var attrkey, charkey, render, rootElement, rootName;
      attrkey = this.options.attrkey;
      charkey = this.options.charkey;
      if ((Object.keys(rootObj).length === 1) && (this.options.rootName === defaults['0.2'].rootName)) {
        rootName = Object.keys(rootObj)[0];
        rootObj = rootObj[rootName];
      } else {
        rootName = this.options.rootName;
      }
      render = (function(_this) {
        return function(element, obj) {
          var attr, child, entry, index, key, value;
          if (typeof obj !== 'object') {
            if (_this.options.cdata && requiresCDATA(obj)) {
              element.raw(wrapCDATA(obj));
            } else {
              element.txt(obj);
            }
          } else if (Array.isArray(obj)) {
            for (index in obj) {
              if (!hasProp.call(obj, index)) continue;
              child = obj[index];
              for (key in child) {
                entry = child[key];
                element = render(element.ele(key), entry).up();
              }
            }
          } else {
            for (key in obj) {
              if (!hasProp.call(obj, key)) continue;
              child = obj[key];
              if (key === attrkey) {
                if (typeof child === "object") {
                  for (attr in child) {
                    value = child[attr];
                    element = element.att(attr, value);
                  }
                }
              } else if (key === charkey) {
                if (_this.options.cdata && requiresCDATA(child)) {
                  element = element.raw(wrapCDATA(child));
                } else {
                  element = element.txt(child);
                }
              } else if (Array.isArray(child)) {
                for (index in child) {
                  if (!hasProp.call(child, index)) continue;
                  entry = child[index];
                  if (typeof entry === 'string') {
                    if (_this.options.cdata && requiresCDATA(entry)) {
                      element = element.ele(key).raw(wrapCDATA(entry)).up();
                    } else {
                      element = element.ele(key, entry).up();
                    }
                  } else {
                    element = render(element.ele(key), entry).up();
                  }
                }
              } else if (typeof child === "object") {
                element = render(element.ele(key), child).up();
              } else {
                if (typeof child === 'string' && _this.options.cdata && requiresCDATA(child)) {
                  element = element.ele(key).raw(wrapCDATA(child)).up();
                } else {
                  if (child == null) {
                    child = '';
                  }
                  element = element.ele(key, child.toString()).up();
                }
              }
            }
          }
          return element;
        };
      })(this);
      rootElement = builder.create(rootName, this.options.xmldec, this.options.doctype, {
        headless: this.options.headless,
        allowSurrogateChars: this.options.allowSurrogateChars
      });
      return render(rootElement, rootObj).end(this.options.renderOpts);
    };

    return Builder;

  })();

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  exports.defaults = {
    "0.1": {
      explicitCharkey: false,
      trim: true,
      normalize: true,
      normalizeTags: false,
      attrkey: "@",
      charkey: "#",
      explicitArray: false,
      ignoreAttrs: false,
      mergeAttrs: false,
      explicitRoot: false,
      validator: null,
      xmlns: false,
      explicitChildren: false,
      childkey: '@@',
      charsAsChildren: false,
      includeWhiteChars: false,
      async: false,
      strict: true,
      attrNameProcessors: null,
      attrValueProcessors: null,
      tagNameProcessors: null,
      valueProcessors: null,
      emptyTag: ''
    },
    "0.2": {
      explicitCharkey: false,
      trim: false,
      normalize: false,
      normalizeTags: false,
      attrkey: "$",
      charkey: "_",
      explicitArray: true,
      ignoreAttrs: false,
      mergeAttrs: false,
      explicitRoot: true,
      validator: null,
      xmlns: false,
      explicitChildren: false,
      preserveChildrenOrder: false,
      childkey: '$$',
      charsAsChildren: false,
      includeWhiteChars: false,
      async: false,
      strict: true,
      attrNameProcessors: null,
      attrValueProcessors: null,
      tagNameProcessors: null,
      valueProcessors: null,
      rootName: 'root',
      xmldec: {
        'version': '1.0',
        'encoding': 'UTF-8',
        'standalone': true
      },
      doctype: null,
      renderOpts: {
        'pretty': true,
        'indent': '  ',
        'newline': '\n'
      },
      headless: false,
      chunkSize: 10000,
      emptyTag: '',
      cdata: false
    }
  };

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  "use strict";
  var bom, defaults, events, isEmpty, processItem, processors, sax, setImmediate,
    bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  sax = require('sax');

  events = require('events');

  bom = require('./bom');

  processors = require('./processors');

  setImmediate = require('timers').setImmediate;

  defaults = require('./defaults').defaults;

  isEmpty = function(thing) {
    return typeof thing === "object" && (thing != null) && Object.keys(thing).length === 0;
  };

  processItem = function(processors, item, key) {
    var i, len, process;
    for (i = 0, len = processors.length; i < len; i++) {
      process = processors[i];
      item = process(item, key);
    }
    return item;
  };

  exports.Parser = (function(superClass) {
    extend(Parser, superClass);

    function Parser(opts) {
      this.parseStringPromise = bind(this.parseStringPromise, this);
      this.parseString = bind(this.parseString, this);
      this.reset = bind(this.reset, this);
      this.assignOrPush = bind(this.assignOrPush, this);
      this.processAsync = bind(this.processAsync, this);
      var key, ref, value;
      if (!(this instanceof exports.Parser)) {
        return new exports.Parser(opts);
      }
      this.options = {};
      ref = defaults["0.2"];
      for (key in ref) {
        if (!hasProp.call(ref, key)) continue;
        value = ref[key];
        this.options[key] = value;
      }
      for (key in opts) {
        if (!hasProp.call(opts, key)) continue;
        value = opts[key];
        this.options[key] = value;
      }
      if (this.options.xmlns) {
        this.options.xmlnskey = this.options.attrkey + "ns";
      }
      if (this.options.normalizeTags) {
        if (!this.options.tagNameProcessors) {
          this.options.tagNameProcessors = [];
        }
        this.options.tagNameProcessors.unshift(processors.normalize);
      }
      this.reset();
    }

    Parser.prototype.processAsync = function() {
      var chunk, err;
      try {
        if (this.remaining.length <= this.options.chunkSize) {
          chunk = this.remaining;
          this.remaining = '';
          this.saxParser = this.saxParser.write(chunk);
          return this.saxParser.close();
        } else {
          chunk = this.remaining.substr(0, this.options.chunkSize);
          this.remaining = this.remaining.substr(this.options.chunkSize, this.remaining.length);
          this.saxParser = this.saxParser.write(chunk);
          return setImmediate(this.processAsync);
        }
      } catch (error1) {
        err = error1;
        if (!this.saxParser.errThrown) {
          this.saxParser.errThrown = true;
          return this.emit(err);
        }
      }
    };

    Parser.prototype.assignOrPush = function(obj, key, newValue) {
      if (!(key in obj)) {
        if (!this.options.explicitArray) {
          return obj[key] = newValue;
        } else {
          return obj[key] = [newValue];
        }
      } else {
        if (!(obj[key] instanceof Array)) {
          obj[key] = [obj[key]];
        }
        return obj[key].push(newValue);
      }
    };

    Parser.prototype.reset = function() {
      var attrkey, charkey, ontext, stack;
      this.removeAllListeners();
      this.saxParser = sax.parser(this.options.strict, {
        trim: false,
        normalize: false,
        xmlns: this.options.xmlns
      });
      this.saxParser.errThrown = false;
      this.saxParser.onerror = (function(_this) {
        return function(error) {
          _this.saxParser.resume();
          if (!_this.saxParser.errThrown) {
            _this.saxParser.errThrown = true;
            return _this.emit("error", error);
          }
        };
      })(this);
      this.saxParser.onend = (function(_this) {
        return function() {
          if (!_this.saxParser.ended) {
            _this.saxParser.ended = true;
            return _this.emit("end", _this.resultObject);
          }
        };
      })(this);
      this.saxParser.ended = false;
      this.EXPLICIT_CHARKEY = this.options.explicitCharkey;
      this.resultObject = null;
      stack = [];
      attrkey = this.options.attrkey;
      charkey = this.options.charkey;
      this.saxParser.onopentag = (function(_this) {
        return function(node) {
          var key, newValue, obj, processedKey, ref;
          obj = {};
          obj[charkey] = "";
          if (!_this.options.ignoreAttrs) {
            ref = node.attributes;
            for (key in ref) {
              if (!hasProp.call(ref, key)) continue;
              if (!(attrkey in obj) && !_this.options.mergeAttrs) {
                obj[attrkey] = {};
              }
              newValue = _this.options.attrValueProcessors ? processItem(_this.options.attrValueProcessors, node.attributes[key], key) : node.attributes[key];
              processedKey = _this.options.attrNameProcessors ? processItem(_this.options.attrNameProcessors, key) : key;
              if (_this.options.mergeAttrs) {
                _this.assignOrPush(obj, processedKey, newValue);
              } else {
                obj[attrkey][processedKey] = newValue;
              }
            }
          }
          obj["#name"] = _this.options.tagNameProcessors ? processItem(_this.options.tagNameProcessors, node.name) : node.name;
          if (_this.options.xmlns) {
            obj[_this.options.xmlnskey] = {
              uri: node.uri,
              local: node.local
            };
          }
          return stack.push(obj);
        };
      })(this);
      this.saxParser.onclosetag = (function(_this) {
        return function() {
          var cdata, emptyStr, key, node, nodeName, obj, objClone, old, s, xpath;
          obj = stack.pop();
          nodeName = obj["#name"];
          if (!_this.options.explicitChildren || !_this.options.preserveChildrenOrder) {
            delete obj["#name"];
          }
          if (obj.cdata === true) {
            cdata = obj.cdata;
            delete obj.cdata;
          }
          s = stack[stack.length - 1];
          if (obj[charkey].match(/^\s*$/) && !cdata) {
            emptyStr = obj[charkey];
            delete obj[charkey];
          } else {
            if (_this.options.trim) {
              obj[charkey] = obj[charkey].trim();
            }
            if (_this.options.normalize) {
              obj[charkey] = obj[charkey].replace(/\s{2,}/g, " ").trim();
            }
            obj[charkey] = _this.options.valueProcessors ? processItem(_this.options.valueProcessors, obj[charkey], nodeName) : obj[charkey];
            if (Object.keys(obj).length === 1 && charkey in obj && !_this.EXPLICIT_CHARKEY) {
              obj = obj[charkey];
            }
          }
          if (isEmpty(obj)) {
            obj = _this.options.emptyTag !== '' ? _this.options.emptyTag : emptyStr;
          }
          if (_this.options.validator != null) {
            xpath = "/" + ((function() {
              var i, len, results;
              results = [];
              for (i = 0, len = stack.length; i < len; i++) {
                node = stack[i];
                results.push(node["#name"]);
              }
              return results;
            })()).concat(nodeName).join("/");
            (function() {
              var err;
              try {
                return obj = _this.options.validator(xpath, s && s[nodeName], obj);
              } catch (error1) {
                err = error1;
                return _this.emit("error", err);
              }
            })();
          }
          if (_this.options.explicitChildren && !_this.options.mergeAttrs && typeof obj === 'object') {
            if (!_this.options.preserveChildrenOrder) {
              node = {};
              if (_this.options.attrkey in obj) {
                node[_this.options.attrkey] = obj[_this.options.attrkey];
                delete obj[_this.options.attrkey];
              }
              if (!_this.options.charsAsChildren && _this.options.charkey in obj) {
                node[_this.options.charkey] = obj[_this.options.charkey];
                delete obj[_this.options.charkey];
              }
              if (Object.getOwnPropertyNames(obj).length > 0) {
                node[_this.options.childkey] = obj;
              }
              obj = node;
            } else if (s) {
              s[_this.options.childkey] = s[_this.options.childkey] || [];
              objClone = {};
              for (key in obj) {
                if (!hasProp.call(obj, key)) continue;
                objClone[key] = obj[key];
              }
              s[_this.options.childkey].push(objClone);
              delete obj["#name"];
              if (Object.keys(obj).length === 1 && charkey in obj && !_this.EXPLICIT_CHARKEY) {
                obj = obj[charkey];
              }
            }
          }
          if (stack.length > 0) {
            return _this.assignOrPush(s, nodeName, obj);
          } else {
            if (_this.options.explicitRoot) {
              old = obj;
              obj = {};
              obj[nodeName] = old;
            }
            _this.resultObject = obj;
            _this.saxParser.ended = true;
            return _this.emit("end", _this.resultObject);
          }
        };
      })(this);
      ontext = (function(_this) {
        return function(text) {
          var charChild, s;
          s = stack[stack.length - 1];
          if (s) {
            s[charkey] += text;
            if (_this.options.explicitChildren && _this.options.preserveChildrenOrder && _this.options.charsAsChildren && (_this.options.includeWhiteChars || text.replace(/\\n/g, '').trim() !== '')) {
              s[_this.options.childkey] = s[_this.options.childkey] || [];
              charChild = {
                '#name': '__text__'
              };
              charChild[charkey] = text;
              if (_this.options.normalize) {
                charChild[charkey] = charChild[charkey].replace(/\s{2,}/g, " ").trim();
              }
              s[_this.options.childkey].push(charChild);
            }
            return s;
          }
        };
      })(this);
      this.saxParser.ontext = ontext;
      return this.saxParser.oncdata = (function(_this) {
        return function(text) {
          var s;
          s = ontext(text);
          if (s) {
            return s.cdata = true;
          }
        };
      })(this);
    };

    Parser.prototype.parseString = function(str, cb) {
      var err;
      if ((cb != null) && typeof cb === "function") {
        this.on("end", function(result) {
          this.reset();
          return cb(null, result);
        });
        this.on("error", function(err) {
          this.reset();
          return cb(err);
        });
      }
      try {
        str = str.toString();
        if (str.trim() === '') {
          this.emit("end", null);
          return true;
        }
        str = bom.stripBOM(str);
        if (this.options.async) {
          this.remaining = str;
          setImmediate(this.processAsync);
          return this.saxParser;
        }
        return this.saxParser.write(str).close();
      } catch (error1) {
        err = error1;
        if (!(this.saxParser.errThrown || this.saxParser.ended)) {
          this.emit('error', err);
          return this.saxParser.errThrown = true;
        } else if (this.saxParser.ended) {
          throw err;
        }
      }
    };

    Parser.prototype.parseStringPromise = function(str) {
      return new Promise((function(_this) {
        return function(resolve, reject) {
          return _this.parseString(str, function(err, value) {
            if (err) {
              return reject(err);
            } else {
              return resolve(value);
            }
          });
        };
      })(this));
    };

    return Parser;

  })(events);

  exports.parseString = function(str, a, b) {
    var cb, options, parser;
    if (b != null) {
      if (typeof b === 'function') {
        cb = b;
      }
      if (typeof a === 'object') {
        options = a;
      }
    } else {
      if (typeof a === 'function') {
        cb = a;
      }
      options = {};
    }
    parser = new exports.Parser(options);
    return parser.parseString(str, cb);
  };

  exports.parseStringPromise = function(str, a) {
    var options, parser;
    if (typeof a === 'object') {
      options = a;
    }
    parser = new exports.Parser(options);
    return parser.parseStringPromise(str);
  };

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  "use strict";
  var prefixMatch;

  prefixMatch = new RegExp(/(?!xmlns)^.*:/);

  exports.normalize = function(str) {
    return str.toLowerCase();
  };

  exports.firstCharLowerCase = function(str) {
    return str.charAt(0).toLowerCase() + str.slice(1);
  };

  exports.stripPrefix = function(str) {
    return str.replace(prefixMatch, '');
  };

  exports.parseNumbers = function(str) {
    if (!isNaN(str)) {
      str = str % 1 === 0 ? parseInt(str, 10) : parseFloat(str);
    }
    return str;
  };

  exports.parseBooleans = function(str) {
    if (/^(?:true|false)$/i.test(str)) {
      str = str.toLowerCase() === 'true';
    }
    return str;
  };

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  "use strict";
  var builder, defaults, parser, processors,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  defaults = require('./defaults');

  builder = require('./builder');

  parser = require('./parser');

  processors = require('./processors');

  exports.defaults = defaults.defaults;

  exports.processors = processors;

  exports.ValidationError = (function(superClass) {
    extend(ValidationError, superClass);

    function ValidationError(message) {
      this.message = message;
    }

    return ValidationError;

  })(Error);

  exports.Builder = builder.Builder;

  exports.Parser = parser.Parser;

  exports.parseString = parser.parseString;

  exports.parseStringPromise = parser.parseStringPromise;

}).call(this);
The MIT License (MIT)

Copyright (c) 2013 Ozgur Ozcitak

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": "xmlbuilder",
  "version": "11.0.1",
  "homepage": "http://github.com/oozcitak/xmlbuilder-js",
  "description": "An XML builder for node.js",
  "author": "Ozgur Ozcitak <oozcitak@gmail.com>",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "git://github.com/oozcitak/xmlbuilder-js.git"
  },
  "main": "./lib/index",
  "typings": "./typings/index.d.ts",
  "engines": {
    "node": ">=4.0"
  },
  "dependencies": {},
  "devDependencies": {
    "coffeescript": "1.*",
    "mocha": "*",
    "coffee-coverage": "2.*",
    "istanbul": "*",
    "coveralls": "*",
    "xpath": "*"
  }
}// Generated by CoffeeScript 1.12.7
(function() {
  module.exports = {
    Restriction: 1,
    Extension: 2,
    Union: 4,
    List: 8
  };

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  module.exports = {
    Disconnected: 1,
    Preceding: 2,
    Following: 4,
    Contains: 8,
    ContainedBy: 16,
    ImplementationSpecific: 32
  };

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  module.exports = {
    Element: 1,
    Attribute: 2,
    Text: 3,
    CData: 4,
    EntityReference: 5,
    EntityDeclaration: 6,
    ProcessingInstruction: 7,
    Comment: 8,
    Document: 9,
    DocType: 10,
    DocumentFragment: 11,
    NotationDeclaration: 12,
    Declaration: 201,
    Raw: 202,
    AttributeDeclaration: 203,
    ElementDeclaration: 204,
    Dummy: 205
  };

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  module.exports = {
    Clones: 1,
    Imported: 2,
    Deleted: 3,
    Renamed: 4,
    Adopted: 5
  };

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var assign, getValue, isArray, isEmpty, isFunction, isObject, isPlainObject,
    slice = [].slice,
    hasProp = {}.hasOwnProperty;

  assign = function() {
    var i, key, len, source, sources, target;
    target = arguments[0], sources = 2 <= arguments.length ? slice.call(arguments, 1) : [];
    if (isFunction(Object.assign)) {
      Object.assign.apply(null, arguments);
    } else {
      for (i = 0, len = sources.length; i < len; i++) {
        source = sources[i];
        if (source != null) {
          for (key in source) {
            if (!hasProp.call(source, key)) continue;
            target[key] = source[key];
          }
        }
      }
    }
    return target;
  };

  isFunction = function(val) {
    return !!val && Object.prototype.toString.call(val) === '[object Function]';
  };

  isObject = function(val) {
    var ref;
    return !!val && ((ref = typeof val) === 'function' || ref === 'object');
  };

  isArray = function(val) {
    if (isFunction(Array.isArray)) {
      return Array.isArray(val);
    } else {
      return Object.prototype.toString.call(val) === '[object Array]';
    }
  };

  isEmpty = function(val) {
    var key;
    if (isArray(val)) {
      return !val.length;
    } else {
      for (key in val) {
        if (!hasProp.call(val, key)) continue;
        return false;
      }
      return true;
    }
  };

  isPlainObject = function(val) {
    var ctor, proto;
    return isObject(val) && (proto = Object.getPrototypeOf(val)) && (ctor = proto.constructor) && (typeof ctor === 'function') && (ctor instanceof ctor) && (Function.prototype.toString.call(ctor) === Function.prototype.toString.call(Object));
  };

  getValue = function(obj) {
    if (isFunction(obj.valueOf)) {
      return obj.valueOf();
    } else {
      return obj;
    }
  };

  module.exports.assign = assign;

  module.exports.isFunction = isFunction;

  module.exports.isObject = isObject;

  module.exports.isArray = isArray;

  module.exports.isEmpty = isEmpty;

  module.exports.isPlainObject = isPlainObject;

  module.exports.getValue = getValue;

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  module.exports = {
    None: 0,
    OpenTag: 1,
    InsideTag: 2,
    CloseTag: 3
  };

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var NodeType, XMLAttribute, XMLNode;

  NodeType = require('./NodeType');

  XMLNode = require('./XMLNode');

  module.exports = XMLAttribute = (function() {
    function XMLAttribute(parent, name, value) {
      this.parent = parent;
      if (this.parent) {
        this.options = this.parent.options;
        this.stringify = this.parent.stringify;
      }
      if (name == null) {
        throw new Error("Missing attribute name. " + this.debugInfo(name));
      }
      this.name = this.stringify.name(name);
      this.value = this.stringify.attValue(value);
      this.type = NodeType.Attribute;
      this.isId = false;
      this.schemaTypeInfo = null;
    }

    Object.defineProperty(XMLAttribute.prototype, 'nodeType', {
      get: function() {
        return this.type;
      }
    });

    Object.defineProperty(XMLAttribute.prototype, 'ownerElement', {
      get: function() {
        return this.parent;
      }
    });

    Object.defineProperty(XMLAttribute.prototype, 'textContent', {
      get: function() {
        return this.value;
      },
      set: function(value) {
        return this.value = value || '';
      }
    });

    Object.defineProperty(XMLAttribute.prototype, 'namespaceURI', {
      get: function() {
        return '';
      }
    });

    Object.defineProperty(XMLAttribute.prototype, 'prefix', {
      get: function() {
        return '';
      }
    });

    Object.defineProperty(XMLAttribute.prototype, 'localName', {
      get: function() {
        return this.name;
      }
    });

    Object.defineProperty(XMLAttribute.prototype, 'specified', {
      get: function() {
        return true;
      }
    });

    XMLAttribute.prototype.clone = function() {
      return Object.create(this);
    };

    XMLAttribute.prototype.toString = function(options) {
      return this.options.writer.attribute(this, this.options.writer.filterOptions(options));
    };

    XMLAttribute.prototype.debugInfo = function(name) {
      name = name || this.name;
      if (name == null) {
        return "parent: <" + this.parent.name + ">";
      } else {
        return "attribute: {" + name + "}, parent: <" + this.parent.name + ">";
      }
    };

    XMLAttribute.prototype.isEqualNode = function(node) {
      if (node.namespaceURI !== this.namespaceURI) {
        return false;
      }
      if (node.prefix !== this.prefix) {
        return false;
      }
      if (node.localName !== this.localName) {
        return false;
      }
      if (node.value !== this.value) {
        return false;
      }
      return true;
    };

    return XMLAttribute;

  })();

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var NodeType, XMLCData, XMLCharacterData,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  NodeType = require('./NodeType');

  XMLCharacterData = require('./XMLCharacterData');

  module.exports = XMLCData = (function(superClass) {
    extend(XMLCData, superClass);

    function XMLCData(parent, text) {
      XMLCData.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing CDATA text. " + this.debugInfo());
      }
      this.name = "#cdata-section";
      this.type = NodeType.CData;
      this.value = this.stringify.cdata(text);
    }

    XMLCData.prototype.clone = function() {
      return Object.create(this);
    };

    XMLCData.prototype.toString = function(options) {
      return this.options.writer.cdata(this, this.options.writer.filterOptions(options));
    };

    return XMLCData;

  })(XMLCharacterData);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLCharacterData, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  module.exports = XMLCharacterData = (function(superClass) {
    extend(XMLCharacterData, superClass);

    function XMLCharacterData(parent) {
      XMLCharacterData.__super__.constructor.call(this, parent);
      this.value = '';
    }

    Object.defineProperty(XMLCharacterData.prototype, 'data', {
      get: function() {
        return this.value;
      },
      set: function(value) {
        return this.value = value || '';
      }
    });

    Object.defineProperty(XMLCharacterData.prototype, 'length', {
      get: function() {
        return this.value.length;
      }
    });

    Object.defineProperty(XMLCharacterData.prototype, 'textContent', {
      get: function() {
        return this.value;
      },
      set: function(value) {
        return this.value = value || '';
      }
    });

    XMLCharacterData.prototype.clone = function() {
      return Object.create(this);
    };

    XMLCharacterData.prototype.substringData = function(offset, count) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLCharacterData.prototype.appendData = function(arg) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLCharacterData.prototype.insertData = function(offset, arg) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLCharacterData.prototype.deleteData = function(offset, count) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLCharacterData.prototype.replaceData = function(offset, count, arg) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLCharacterData.prototype.isEqualNode = function(node) {
      if (!XMLCharacterData.__super__.isEqualNode.apply(this, arguments).isEqualNode(node)) {
        return false;
      }
      if (node.data !== this.data) {
        return false;
      }
      return true;
    };

    return XMLCharacterData;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var NodeType, XMLCharacterData, XMLComment,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  NodeType = require('./NodeType');

  XMLCharacterData = require('./XMLCharacterData');

  module.exports = XMLComment = (function(superClass) {
    extend(XMLComment, superClass);

    function XMLComment(parent, text) {
      XMLComment.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing comment text. " + this.debugInfo());
      }
      this.name = "#comment";
      this.type = NodeType.Comment;
      this.value = this.stringify.comment(text);
    }

    XMLComment.prototype.clone = function() {
      return Object.create(this);
    };

    XMLComment.prototype.toString = function(options) {
      return this.options.writer.comment(this, this.options.writer.filterOptions(options));
    };

    return XMLComment;

  })(XMLCharacterData);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDOMConfiguration, XMLDOMErrorHandler, XMLDOMStringList;

  XMLDOMErrorHandler = require('./XMLDOMErrorHandler');

  XMLDOMStringList = require('./XMLDOMStringList');

  module.exports = XMLDOMConfiguration = (function() {
    function XMLDOMConfiguration() {
      var clonedSelf;
      this.defaultParams = {
        "canonical-form": false,
        "cdata-sections": false,
        "comments": false,
        "datatype-normalization": false,
        "element-content-whitespace": true,
        "entities": true,
        "error-handler": new XMLDOMErrorHandler(),
        "infoset": true,
        "validate-if-schema": false,
        "namespaces": true,
        "namespace-declarations": true,
        "normalize-characters": false,
        "schema-location": '',
        "schema-type": '',
        "split-cdata-sections": true,
        "validate": false,
        "well-formed": true
      };
      this.params = clonedSelf = Object.create(this.defaultParams);
    }

    Object.defineProperty(XMLDOMConfiguration.prototype, 'parameterNames', {
      get: function() {
        return new XMLDOMStringList(Object.keys(this.defaultParams));
      }
    });

    XMLDOMConfiguration.prototype.getParameter = function(name) {
      if (this.params.hasOwnProperty(name)) {
        return this.params[name];
      } else {
        return null;
      }
    };

    XMLDOMConfiguration.prototype.canSetParameter = function(name, value) {
      return true;
    };

    XMLDOMConfiguration.prototype.setParameter = function(name, value) {
      if (value != null) {
        return this.params[name] = value;
      } else {
        return delete this.params[name];
      }
    };

    return XMLDOMConfiguration;

  })();

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDOMErrorHandler;

  module.exports = XMLDOMErrorHandler = (function() {
    function XMLDOMErrorHandler() {}

    XMLDOMErrorHandler.prototype.handleError = function(error) {
      throw new Error(error);
    };

    return XMLDOMErrorHandler;

  })();

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDOMImplementation;

  module.exports = XMLDOMImplementation = (function() {
    function XMLDOMImplementation() {}

    XMLDOMImplementation.prototype.hasFeature = function(feature, version) {
      return true;
    };

    XMLDOMImplementation.prototype.createDocumentType = function(qualifiedName, publicId, systemId) {
      throw new Error("This DOM method is not implemented.");
    };

    XMLDOMImplementation.prototype.createDocument = function(namespaceURI, qualifiedName, doctype) {
      throw new Error("This DOM method is not implemented.");
    };

    XMLDOMImplementation.prototype.createHTMLDocument = function(title) {
      throw new Error("This DOM method is not implemented.");
    };

    XMLDOMImplementation.prototype.getFeature = function(feature, version) {
      throw new Error("This DOM method is not implemented.");
    };

    return XMLDOMImplementation;

  })();

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLDOMStringList;

  module.exports = XMLDOMStringList = (function() {
    function XMLDOMStringList(arr) {
      this.arr = arr || [];
    }

    Object.defineProperty(XMLDOMStringList.prototype, 'length', {
      get: function() {
        return this.arr.length;
      }
    });

    XMLDOMStringList.prototype.item = function(index) {
      return this.arr[index] || null;
    };

    XMLDOMStringList.prototype.contains = function(str) {
      return this.arr.indexOf(str) !== -1;
    };

    return XMLDOMStringList;

  })();

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var NodeType, XMLDTDAttList, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  NodeType = require('./NodeType');

  module.exports = XMLDTDAttList = (function(superClass) {
    extend(XMLDTDAttList, superClass);

    function XMLDTDAttList(parent, elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      XMLDTDAttList.__super__.constructor.call(this, parent);
      if (elementName == null) {
        throw new Error("Missing DTD element name. " + this.debugInfo());
      }
      if (attributeName == null) {
        throw new Error("Missing DTD attribute name. " + this.debugInfo(elementName));
      }
      if (!attributeType) {
        throw new Error("Missing DTD attribute type. " + this.debugInfo(elementName));
      }
      if (!defaultValueType) {
        throw new Error("Missing DTD attribute default. " + this.debugInfo(elementName));
      }
      if (defaultValueType.indexOf('#') !== 0) {
        defaultValueType = '#' + defaultValueType;
      }
      if (!defaultValueType.match(/^(#REQUIRED|#IMPLIED|#FIXED|#DEFAULT)$/)) {
        throw new Error("Invalid default value type; expected: #REQUIRED, #IMPLIED, #FIXED or #DEFAULT. " + this.debugInfo(elementName));
      }
      if (defaultValue && !defaultValueType.match(/^(#FIXED|#DEFAULT)$/)) {
        throw new Error("Default value only applies to #FIXED or #DEFAULT. " + this.debugInfo(elementName));
      }
      this.elementName = this.stringify.name(elementName);
      this.type = NodeType.AttributeDeclaration;
      this.attributeName = this.stringify.name(attributeName);
      this.attributeType = this.stringify.dtdAttType(attributeType);
      if (defaultValue) {
        this.defaultValue = this.stringify.dtdAttDefault(defaultValue);
      }
      this.defaultValueType = defaultValueType;
    }

    XMLDTDAttList.prototype.toString = function(options) {
      return this.options.writer.dtdAttList(this, this.options.writer.filterOptions(options));
    };

    return XMLDTDAttList;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var NodeType, XMLDTDElement, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  NodeType = require('./NodeType');

  module.exports = XMLDTDElement = (function(superClass) {
    extend(XMLDTDElement, superClass);

    function XMLDTDElement(parent, name, value) {
      XMLDTDElement.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing DTD element name. " + this.debugInfo());
      }
      if (!value) {
        value = '(#PCDATA)';
      }
      if (Array.isArray(value)) {
        value = '(' + value.join(',') + ')';
      }
      this.name = this.stringify.name(name);
      this.type = NodeType.ElementDeclaration;
      this.value = this.stringify.dtdElementValue(value);
    }

    XMLDTDElement.prototype.toString = function(options) {
      return this.options.writer.dtdElement(this, this.options.writer.filterOptions(options));
    };

    return XMLDTDElement;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var NodeType, XMLDTDEntity, XMLNode, isObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isObject = require('./Utility').isObject;

  XMLNode = require('./XMLNode');

  NodeType = require('./NodeType');

  module.exports = XMLDTDEntity = (function(superClass) {
    extend(XMLDTDEntity, superClass);

    function XMLDTDEntity(parent, pe, name, value) {
      XMLDTDEntity.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing DTD entity name. " + this.debugInfo(name));
      }
      if (value == null) {
        throw new Error("Missing DTD entity value. " + this.debugInfo(name));
      }
      this.pe = !!pe;
      this.name = this.stringify.name(name);
      this.type = NodeType.EntityDeclaration;
      if (!isObject(value)) {
        this.value = this.stringify.dtdEntityValue(value);
        this.internal = true;
      } else {
        if (!value.pubID && !value.sysID) {
          throw new Error("Public and/or system identifiers are required for an external entity. " + this.debugInfo(name));
        }
        if (value.pubID && !value.sysID) {
          throw new Error("System identifier is required for a public external entity. " + this.debugInfo(name));
        }
        this.internal = false;
        if (value.pubID != null) {
          this.pubID = this.stringify.dtdPubID(value.pubID);
        }
        if (value.sysID != null) {
          this.sysID = this.stringify.dtdSysID(value.sysID);
        }
        if (value.nData != null) {
          this.nData = this.stringify.dtdNData(value.nData);
        }
        if (this.pe && this.nData) {
          throw new Error("Notation declaration is not allowed in a parameter entity. " + this.debugInfo(name));
        }
      }
    }

    Object.defineProperty(XMLDTDEntity.prototype, 'publicId', {
      get: function() {
        return this.pubID;
      }
    });

    Object.defineProperty(XMLDTDEntity.prototype, 'systemId', {
      get: function() {
        return this.sysID;
      }
    });

    Object.defineProperty(XMLDTDEntity.prototype, 'notationName', {
      get: function() {
        return this.nData || null;
      }
    });

    Object.defineProperty(XMLDTDEntity.prototype, 'inputEncoding', {
      get: function() {
        return null;
      }
    });

    Object.defineProperty(XMLDTDEntity.prototype, 'xmlEncoding', {
      get: function() {
        return null;
      }
    });

    Object.defineProperty(XMLDTDEntity.prototype, 'xmlVersion', {
      get: function() {
        return null;
      }
    });

    XMLDTDEntity.prototype.toString = function(options) {
      return this.options.writer.dtdEntity(this, this.options.writer.filterOptions(options));
    };

    return XMLDTDEntity;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var NodeType, XMLDTDNotation, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  NodeType = require('./NodeType');

  module.exports = XMLDTDNotation = (function(superClass) {
    extend(XMLDTDNotation, superClass);

    function XMLDTDNotation(parent, name, value) {
      XMLDTDNotation.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing DTD notation name. " + this.debugInfo(name));
      }
      if (!value.pubID && !value.sysID) {
        throw new Error("Public or system identifiers are required for an external entity. " + this.debugInfo(name));
      }
      this.name = this.stringify.name(name);
      this.type = NodeType.NotationDeclaration;
      if (value.pubID != null) {
        this.pubID = this.stringify.dtdPubID(value.pubID);
      }
      if (value.sysID != null) {
        this.sysID = this.stringify.dtdSysID(value.sysID);
      }
    }

    Object.defineProperty(XMLDTDNotation.prototype, 'publicId', {
      get: function() {
        return this.pubID;
      }
    });

    Object.defineProperty(XMLDTDNotation.prototype, 'systemId', {
      get: function() {
        return this.sysID;
      }
    });

    XMLDTDNotation.prototype.toString = function(options) {
      return this.options.writer.dtdNotation(this, this.options.writer.filterOptions(options));
    };

    return XMLDTDNotation;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var NodeType, XMLDeclaration, XMLNode, isObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isObject = require('./Utility').isObject;

  XMLNode = require('./XMLNode');

  NodeType = require('./NodeType');

  module.exports = XMLDeclaration = (function(superClass) {
    extend(XMLDeclaration, superClass);

    function XMLDeclaration(parent, version, encoding, standalone) {
      var ref;
      XMLDeclaration.__super__.constructor.call(this, parent);
      if (isObject(version)) {
        ref = version, version = ref.version, encoding = ref.encoding, standalone = ref.standalone;
      }
      if (!version) {
        version = '1.0';
      }
      this.type = NodeType.Declaration;
      this.version = this.stringify.xmlVersion(version);
      if (encoding != null) {
        this.encoding = this.stringify.xmlEncoding(encoding);
      }
      if (standalone != null) {
        this.standalone = this.stringify.xmlStandalone(standalone);
      }
    }

    XMLDeclaration.prototype.toString = function(options) {
      return this.options.writer.declaration(this, this.options.writer.filterOptions(options));
    };

    return XMLDeclaration;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var NodeType, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDocType, XMLNamedNodeMap, XMLNode, isObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isObject = require('./Utility').isObject;

  XMLNode = require('./XMLNode');

  NodeType = require('./NodeType');

  XMLDTDAttList = require('./XMLDTDAttList');

  XMLDTDEntity = require('./XMLDTDEntity');

  XMLDTDElement = require('./XMLDTDElement');

  XMLDTDNotation = require('./XMLDTDNotation');

  XMLNamedNodeMap = require('./XMLNamedNodeMap');

  module.exports = XMLDocType = (function(superClass) {
    extend(XMLDocType, superClass);

    function XMLDocType(parent, pubID, sysID) {
      var child, i, len, ref, ref1, ref2;
      XMLDocType.__super__.constructor.call(this, parent);
      this.type = NodeType.DocType;
      if (parent.children) {
        ref = parent.children;
        for (i = 0, len = ref.length; i < len; i++) {
          child = ref[i];
          if (child.type === NodeType.Element) {
            this.name = child.name;
            break;
          }
        }
      }
      this.documentObject = parent;
      if (isObject(pubID)) {
        ref1 = pubID, pubID = ref1.pubID, sysID = ref1.sysID;
      }
      if (sysID == null) {
        ref2 = [pubID, sysID], sysID = ref2[0], pubID = ref2[1];
      }
      if (pubID != null) {
        this.pubID = this.stringify.dtdPubID(pubID);
      }
      if (sysID != null) {
        this.sysID = this.stringify.dtdSysID(sysID);
      }
    }

    Object.defineProperty(XMLDocType.prototype, 'entities', {
      get: function() {
        var child, i, len, nodes, ref;
        nodes = {};
        ref = this.children;
        for (i = 0, len = ref.length; i < len; i++) {
          child = ref[i];
          if ((child.type === NodeType.EntityDeclaration) && !child.pe) {
            nodes[child.name] = child;
          }
        }
        return new XMLNamedNodeMap(nodes);
      }
    });

    Object.defineProperty(XMLDocType.prototype, 'notations', {
      get: function() {
        var child, i, len, nodes, ref;
        nodes = {};
        ref = this.children;
        for (i = 0, len = ref.length; i < len; i++) {
          child = ref[i];
          if (child.type === NodeType.NotationDeclaration) {
            nodes[child.name] = child;
          }
        }
        return new XMLNamedNodeMap(nodes);
      }
    });

    Object.defineProperty(XMLDocType.prototype, 'publicId', {
      get: function() {
        return this.pubID;
      }
    });

    Object.defineProperty(XMLDocType.prototype, 'systemId', {
      get: function() {
        return this.sysID;
      }
    });

    Object.defineProperty(XMLDocType.prototype, 'internalSubset', {
      get: function() {
        throw new Error("This DOM method is not implemented." + this.debugInfo());
      }
    });

    XMLDocType.prototype.element = function(name, value) {
      var child;
      child = new XMLDTDElement(this, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      var child;
      child = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.entity = function(name, value) {
      var child;
      child = new XMLDTDEntity(this, false, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.pEntity = function(name, value) {
      var child;
      child = new XMLDTDEntity(this, true, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.notation = function(name, value) {
      var child;
      child = new XMLDTDNotation(this, name, value);
      this.children.push(child);
      return this;
    };

    XMLDocType.prototype.toString = function(options) {
      return this.options.writer.docType(this, this.options.writer.filterOptions(options));
    };

    XMLDocType.prototype.ele = function(name, value) {
      return this.element(name, value);
    };

    XMLDocType.prototype.att = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      return this.attList(elementName, attributeName, attributeType, defaultValueType, defaultValue);
    };

    XMLDocType.prototype.ent = function(name, value) {
      return this.entity(name, value);
    };

    XMLDocType.prototype.pent = function(name, value) {
      return this.pEntity(name, value);
    };

    XMLDocType.prototype.not = function(name, value) {
      return this.notation(name, value);
    };

    XMLDocType.prototype.up = function() {
      return this.root() || this.documentObject;
    };

    XMLDocType.prototype.isEqualNode = function(node) {
      if (!XMLDocType.__super__.isEqualNode.apply(this, arguments).isEqualNode(node)) {
        return false;
      }
      if (node.name !== this.name) {
        return false;
      }
      if (node.publicId !== this.publicId) {
        return false;
      }
      if (node.systemId !== this.systemId) {
        return false;
      }
      return true;
    };

    return XMLDocType;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var NodeType, XMLDOMConfiguration, XMLDOMImplementation, XMLDocument, XMLNode, XMLStringWriter, XMLStringifier, isPlainObject,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  isPlainObject = require('./Utility').isPlainObject;

  XMLDOMImplementation = require('./XMLDOMImplementation');

  XMLDOMConfiguration = require('./XMLDOMConfiguration');

  XMLNode = require('./XMLNode');

  NodeType = require('./NodeType');

  XMLStringifier = require('./XMLStringifier');

  XMLStringWriter = require('./XMLStringWriter');

  module.exports = XMLDocument = (function(superClass) {
    extend(XMLDocument, superClass);

    function XMLDocument(options) {
      XMLDocument.__super__.constructor.call(this, null);
      this.name = "#document";
      this.type = NodeType.Document;
      this.documentURI = null;
      this.domConfig = new XMLDOMConfiguration();
      options || (options = {});
      if (!options.writer) {
        options.writer = new XMLStringWriter();
      }
      this.options = options;
      this.stringify = new XMLStringifier(options);
    }

    Object.defineProperty(XMLDocument.prototype, 'implementation', {
      value: new XMLDOMImplementation()
    });

    Object.defineProperty(XMLDocument.prototype, 'doctype', {
      get: function() {
        var child, i, len, ref;
        ref = this.children;
        for (i = 0, len = ref.length; i < len; i++) {
          child = ref[i];
          if (child.type === NodeType.DocType) {
            return child;
          }
        }
        return null;
      }
    });

    Object.defineProperty(XMLDocument.prototype, 'documentElement', {
      get: function() {
        return this.rootObject || null;
      }
    });

    Object.defineProperty(XMLDocument.prototype, 'inputEncoding', {
      get: function() {
        return null;
      }
    });

    Object.defineProperty(XMLDocument.prototype, 'strictErrorChecking', {
      get: function() {
        return false;
      }
    });

    Object.defineProperty(XMLDocument.prototype, 'xmlEncoding', {
      get: function() {
        if (this.children.length !== 0 && this.children[0].type === NodeType.Declaration) {
          return this.children[0].encoding;
        } else {
          return null;
        }
      }
    });

    Object.defineProperty(XMLDocument.prototype, 'xmlStandalone', {
      get: function() {
        if (this.children.length !== 0 && this.children[0].type === NodeType.Declaration) {
          return this.children[0].standalone === 'yes';
        } else {
          return false;
        }
      }
    });

    Object.defineProperty(XMLDocument.prototype, 'xmlVersion', {
      get: function() {
        if (this.children.length !== 0 && this.children[0].type === NodeType.Declaration) {
          return this.children[0].version;
        } else {
          return "1.0";
        }
      }
    });

    Object.defineProperty(XMLDocument.prototype, 'URL', {
      get: function() {
        return this.documentURI;
      }
    });

    Object.defineProperty(XMLDocument.prototype, 'origin', {
      get: function() {
        return null;
      }
    });

    Object.defineProperty(XMLDocument.prototype, 'compatMode', {
      get: function() {
        return null;
      }
    });

    Object.defineProperty(XMLDocument.prototype, 'characterSet', {
      get: function() {
        return null;
      }
    });

    Object.defineProperty(XMLDocument.prototype, 'contentType', {
      get: function() {
        return null;
      }
    });

    XMLDocument.prototype.end = function(writer) {
      var writerOptions;
      writerOptions = {};
      if (!writer) {
        writer = this.options.writer;
      } else if (isPlainObject(writer)) {
        writerOptions = writer;
        writer = this.options.writer;
      }
      return writer.document(this, writer.filterOptions(writerOptions));
    };

    XMLDocument.prototype.toString = function(options) {
      return this.options.writer.document(this, this.options.writer.filterOptions(options));
    };

    XMLDocument.prototype.createElement = function(tagName) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLDocument.prototype.createDocumentFragment = function() {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLDocument.prototype.createTextNode = function(data) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLDocument.prototype.createComment = function(data) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLDocument.prototype.createCDATASection = function(data) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLDocument.prototype.createProcessingInstruction = function(target, data) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLDocument.prototype.createAttribute = function(name) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLDocument.prototype.createEntityReference = function(name) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLDocument.prototype.getElementsByTagName = function(tagname) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLDocument.prototype.importNode = function(importedNode, deep) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLDocument.prototype.createElementNS = function(namespaceURI, qualifiedName) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLDocument.prototype.createAttributeNS = function(namespaceURI, qualifiedName) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLDocument.prototype.getElementsByTagNameNS = function(namespaceURI, localName) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLDocument.prototype.getElementById = function(elementId) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLDocument.prototype.adoptNode = function(source) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLDocument.prototype.normalizeDocument = function() {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLDocument.prototype.renameNode = function(node, namespaceURI, qualifiedName) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLDocument.prototype.getElementsByClassName = function(classNames) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLDocument.prototype.createEvent = function(eventInterface) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLDocument.prototype.createRange = function() {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLDocument.prototype.createNodeIterator = function(root, whatToShow, filter) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLDocument.prototype.createTreeWalker = function(root, whatToShow, filter) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    return XMLDocument;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var NodeType, WriterState, XMLAttribute, XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLDocument, XMLDocumentCB, XMLElement, XMLProcessingInstruction, XMLRaw, XMLStringWriter, XMLStringifier, XMLText, getValue, isFunction, isObject, isPlainObject, ref,
    hasProp = {}.hasOwnProperty;

  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, isPlainObject = ref.isPlainObject, getValue = ref.getValue;

  NodeType = require('./NodeType');

  XMLDocument = require('./XMLDocument');

  XMLElement = require('./XMLElement');

  XMLCData = require('./XMLCData');

  XMLComment = require('./XMLComment');

  XMLRaw = require('./XMLRaw');

  XMLText = require('./XMLText');

  XMLProcessingInstruction = require('./XMLProcessingInstruction');

  XMLDeclaration = require('./XMLDeclaration');

  XMLDocType = require('./XMLDocType');

  XMLDTDAttList = require('./XMLDTDAttList');

  XMLDTDEntity = require('./XMLDTDEntity');

  XMLDTDElement = require('./XMLDTDElement');

  XMLDTDNotation = require('./XMLDTDNotation');

  XMLAttribute = require('./XMLAttribute');

  XMLStringifier = require('./XMLStringifier');

  XMLStringWriter = require('./XMLStringWriter');

  WriterState = require('./WriterState');

  module.exports = XMLDocumentCB = (function() {
    function XMLDocumentCB(options, onData, onEnd) {
      var writerOptions;
      this.name = "?xml";
      this.type = NodeType.Document;
      options || (options = {});
      writerOptions = {};
      if (!options.writer) {
        options.writer = new XMLStringWriter();
      } else if (isPlainObject(options.writer)) {
        writerOptions = options.writer;
        options.writer = new XMLStringWriter();
      }
      this.options = options;
      this.writer = options.writer;
      this.writerOptions = this.writer.filterOptions(writerOptions);
      this.stringify = new XMLStringifier(options);
      this.onDataCallback = onData || function() {};
      this.onEndCallback = onEnd || function() {};
      this.currentNode = null;
      this.currentLevel = -1;
      this.openTags = {};
      this.documentStarted = false;
      this.documentCompleted = false;
      this.root = null;
    }

    XMLDocumentCB.prototype.createChildNode = function(node) {
      var att, attName, attributes, child, i, len, ref1, ref2;
      switch (node.type) {
        case NodeType.CData:
          this.cdata(node.value);
          break;
        case NodeType.Comment:
          this.comment(node.value);
          break;
        case NodeType.Element:
          attributes = {};
          ref1 = node.attribs;
          for (attName in ref1) {
            if (!hasProp.call(ref1, attName)) continue;
            att = ref1[attName];
            attributes[attName] = att.value;
          }
          this.node(node.name, attributes);
          break;
        case NodeType.Dummy:
          this.dummy();
          break;
        case NodeType.Raw:
          this.raw(node.value);
          break;
        case NodeType.Text:
          this.text(node.value);
          break;
        case NodeType.ProcessingInstruction:
          this.instruction(node.target, node.value);
          break;
        default:
          throw new Error("This XML node type is not supported in a JS object: " + node.constructor.name);
      }
      ref2 = node.children;
      for (i = 0, len = ref2.length; i < len; i++) {
        child = ref2[i];
        this.createChildNode(child);
        if (child.type === NodeType.Element) {
          this.up();
        }
      }
      return this;
    };

    XMLDocumentCB.prototype.dummy = function() {
      return this;
    };

    XMLDocumentCB.prototype.node = function(name, attributes, text) {
      var ref1;
      if (name == null) {
        throw new Error("Missing node name.");
      }
      if (this.root && this.currentLevel === -1) {
        throw new Error("Document can only have one root node. " + this.debugInfo(name));
      }
      this.openCurrent();
      name = getValue(name);
      if (attributes == null) {
        attributes = {};
      }
      attributes = getValue(attributes);
      if (!isObject(attributes)) {
        ref1 = [attributes, text], text = ref1[0], attributes = ref1[1];
      }
      this.currentNode = new XMLElement(this, name, attributes);
      this.currentNode.children = false;
      this.currentLevel++;
      this.openTags[this.currentLevel] = this.currentNode;
      if (text != null) {
        this.text(text);
      }
      return this;
    };

    XMLDocumentCB.prototype.element = function(name, attributes, text) {
      var child, i, len, oldValidationFlag, ref1, root;
      if (this.currentNode && this.currentNode.type === NodeType.DocType) {
        this.dtdElement.apply(this, arguments);
      } else {
        if (Array.isArray(name) || isObject(name) || isFunction(name)) {
          oldValidationFlag = this.options.noValidation;
          this.options.noValidation = true;
          root = new XMLDocument(this.options).element('TEMP_ROOT');
          root.element(name);
          this.options.noValidation = oldValidationFlag;
          ref1 = root.children;
          for (i = 0, len = ref1.length; i < len; i++) {
            child = ref1[i];
            this.createChildNode(child);
            if (child.type === NodeType.Element) {
              this.up();
            }
          }
        } else {
          this.node(name, attributes, text);
        }
      }
      return this;
    };

    XMLDocumentCB.prototype.attribute = function(name, value) {
      var attName, attValue;
      if (!this.currentNode || this.currentNode.children) {
        throw new Error("att() can only be used immediately after an ele() call in callback mode. " + this.debugInfo(name));
      }
      if (name != null) {
        name = getValue(name);
      }
      if (isObject(name)) {
        for (attName in name) {
          if (!hasProp.call(name, attName)) continue;
          attValue = name[attName];
          this.attribute(attName, attValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        if (this.options.keepNullAttributes && (value == null)) {
          this.currentNode.attribs[name] = new XMLAttribute(this, name, "");
        } else if (value != null) {
          this.currentNode.attribs[name] = new XMLAttribute(this, name, value);
        }
      }
      return this;
    };

    XMLDocumentCB.prototype.text = function(value) {
      var node;
      this.openCurrent();
      node = new XMLText(this, value);
      this.onData(this.writer.text(node, this.writerOptions, this.currentLevel + 1), this.currentLevel + 1);
      return this;
    };

    XMLDocumentCB.prototype.cdata = function(value) {
      var node;
      this.openCurrent();
      node = new XMLCData(this, value);
      this.onData(this.writer.cdata(node, this.writerOptions, this.currentLevel + 1), this.currentLevel + 1);
      return this;
    };

    XMLDocumentCB.prototype.comment = function(value) {
      var node;
      this.openCurrent();
      node = new XMLComment(this, value);
      this.onData(this.writer.comment(node, this.writerOptions, this.currentLevel + 1), this.currentLevel + 1);
      return this;
    };

    XMLDocumentCB.prototype.raw = function(value) {
      var node;
      this.openCurrent();
      node = new XMLRaw(this, value);
      this.onData(this.writer.raw(node, this.writerOptions, this.currentLevel + 1), this.currentLevel + 1);
      return this;
    };

    XMLDocumentCB.prototype.instruction = function(target, value) {
      var i, insTarget, insValue, len, node;
      this.openCurrent();
      if (target != null) {
        target = getValue(target);
      }
      if (value != null) {
        value = getValue(value);
      }
      if (Array.isArray(target)) {
        for (i = 0, len = target.length; i < len; i++) {
          insTarget = target[i];
          this.instruction(insTarget);
        }
      } else if (isObject(target)) {
        for (insTarget in target) {
          if (!hasProp.call(target, insTarget)) continue;
          insValue = target[insTarget];
          this.instruction(insTarget, insValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        node = new XMLProcessingInstruction(this, target, value);
        this.onData(this.writer.processingInstruction(node, this.writerOptions, this.currentLevel + 1), this.currentLevel + 1);
      }
      return this;
    };

    XMLDocumentCB.prototype.declaration = function(version, encoding, standalone) {
      var node;
      this.openCurrent();
      if (this.documentStarted) {
        throw new Error("declaration() must be the first node.");
      }
      node = new XMLDeclaration(this, version, encoding, standalone);
      this.onData(this.writer.declaration(node, this.writerOptions, this.currentLevel + 1), this.currentLevel + 1);
      return this;
    };

    XMLDocumentCB.prototype.doctype = function(root, pubID, sysID) {
      this.openCurrent();
      if (root == null) {
        throw new Error("Missing root node name.");
      }
      if (this.root) {
        throw new Error("dtd() must come before the root node.");
      }
      this.currentNode = new XMLDocType(this, pubID, sysID);
      this.currentNode.rootNodeName = root;
      this.currentNode.children = false;
      this.currentLevel++;
      this.openTags[this.currentLevel] = this.currentNode;
      return this;
    };

    XMLDocumentCB.prototype.dtdElement = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDElement(this, name, value);
      this.onData(this.writer.dtdElement(node, this.writerOptions, this.currentLevel + 1), this.currentLevel + 1);
      return this;
    };

    XMLDocumentCB.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
      var node;
      this.openCurrent();
      node = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue);
      this.onData(this.writer.dtdAttList(node, this.writerOptions, this.currentLevel + 1), this.currentLevel + 1);
      return this;
    };

    XMLDocumentCB.prototype.entity = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDEntity(this, false, name, value);
      this.onData(this.writer.dtdEntity(node, this.writerOptions, this.currentLevel + 1), this.currentLevel + 1);
      return this;
    };

    XMLDocumentCB.prototype.pEntity = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDEntity(this, true, name, value);
      this.onData(this.writer.dtdEntity(node, this.writerOptions, this.currentLevel + 1), this.currentLevel + 1);
      return this;
    };

    XMLDocumentCB.prototype.notation = function(name, value) {
      var node;
      this.openCurrent();
      node = new XMLDTDNotation(this, name, value);
      this.onData(this.writer.dtdNotation(node, this.writerOptions, this.currentLevel + 1), this.currentLevel + 1);
      return this;
    };

    XMLDocumentCB.prototype.up = function() {
      if (this.currentLevel < 0) {
        throw new Error("The document node has no parent.");
      }
      if (this.currentNode) {
        if (this.currentNode.children) {
          this.closeNode(this.currentNode);
        } else {
          this.openNode(this.currentNode);
        }
        this.currentNode = null;
      } else {
        this.closeNode(this.openTags[this.currentLevel]);
      }
      delete this.openTags[this.currentLevel];
      this.currentLevel--;
      return this;
    };

    XMLDocumentCB.prototype.end = function() {
      while (this.currentLevel >= 0) {
        this.up();
      }
      return this.onEnd();
    };

    XMLDocumentCB.prototype.openCurrent = function() {
      if (this.currentNode) {
        this.currentNode.children = true;
        return this.openNode(this.currentNode);
      }
    };

    XMLDocumentCB.prototype.openNode = function(node) {
      var att, chunk, name, ref1;
      if (!node.isOpen) {
        if (!this.root && this.currentLevel === 0 && node.type === NodeType.Element) {
          this.root = node;
        }
        chunk = '';
        if (node.type === NodeType.Element) {
          this.writerOptions.state = WriterState.OpenTag;
          chunk = this.writer.indent(node, this.writerOptions, this.currentLevel) + '<' + node.name;
          ref1 = node.attribs;
          for (name in ref1) {
            if (!hasProp.call(ref1, name)) continue;
            att = ref1[name];
            chunk += this.writer.attribute(att, this.writerOptions, this.currentLevel);
          }
          chunk += (node.children ? '>' : '/>') + this.writer.endline(node, this.writerOptions, this.currentLevel);
          this.writerOptions.state = WriterState.InsideTag;
        } else {
          this.writerOptions.state = WriterState.OpenTag;
          chunk = this.writer.indent(node, this.writerOptions, this.currentLevel) + '<!DOCTYPE ' + node.rootNodeName;
          if (node.pubID && node.sysID) {
            chunk += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
          } else if (node.sysID) {
            chunk += ' SYSTEM "' + node.sysID + '"';
          }
          if (node.children) {
            chunk += ' [';
            this.writerOptions.state = WriterState.InsideTag;
          } else {
            this.writerOptions.state = WriterState.CloseTag;
            chunk += '>';
          }
          chunk += this.writer.endline(node, this.writerOptions, this.currentLevel);
        }
        this.onData(chunk, this.currentLevel);
        return node.isOpen = true;
      }
    };

    XMLDocumentCB.prototype.closeNode = function(node) {
      var chunk;
      if (!node.isClosed) {
        chunk = '';
        this.writerOptions.state = WriterState.CloseTag;
        if (node.type === NodeType.Element) {
          chunk = this.writer.indent(node, this.writerOptions, this.currentLevel) + '</' + node.name + '>' + this.writer.endline(node, this.writerOptions, this.currentLevel);
        } else {
          chunk = this.writer.indent(node, this.writerOptions, this.currentLevel) + ']>' + this.writer.endline(node, this.writerOptions, this.currentLevel);
        }
        this.writerOptions.state = WriterState.None;
        this.onData(chunk, this.currentLevel);
        return node.isClosed = true;
      }
    };

    XMLDocumentCB.prototype.onData = function(chunk, level) {
      this.documentStarted = true;
      return this.onDataCallback(chunk, level + 1);
    };

    XMLDocumentCB.prototype.onEnd = function() {
      this.documentCompleted = true;
      return this.onEndCallback();
    };

    XMLDocumentCB.prototype.debugInfo = function(name) {
      if (name == null) {
        return "";
      } else {
        return "node: <" + name + ">";
      }
    };

    XMLDocumentCB.prototype.ele = function() {
      return this.element.apply(this, arguments);
    };

    XMLDocumentCB.prototype.nod = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLDocumentCB.prototype.txt = function(value) {
      return this.text(value);
    };

    XMLDocumentCB.prototype.dat = function(value) {
      return this.cdata(value);
    };

    XMLDocumentCB.prototype.com = function(value) {
      return this.comment(value);
    };

    XMLDocumentCB.prototype.ins = function(target, value) {
      return this.instruction(target, value);
    };

    XMLDocumentCB.prototype.dec = function(version, encoding, standalone) {
      return this.declaration(version, encoding, standalone);
    };

    XMLDocumentCB.prototype.dtd = function(root, pubID, sysID) {
      return this.doctype(root, pubID, sysID);
    };

    XMLDocumentCB.prototype.e = function(name, attributes, text) {
      return this.element(name, attributes, text);
    };

    XMLDocumentCB.prototype.n = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLDocumentCB.prototype.t = function(value) {
      return this.text(value);
    };

    XMLDocumentCB.prototype.d = function(value) {
      return this.cdata(value);
    };

    XMLDocumentCB.prototype.c = function(value) {
      return this.comment(value);
    };

    XMLDocumentCB.prototype.r = function(value) {
      return this.raw(value);
    };

    XMLDocumentCB.prototype.i = function(target, value) {
      return this.instruction(target, value);
    };

    XMLDocumentCB.prototype.att = function() {
      if (this.currentNode && this.currentNode.type === NodeType.DocType) {
        return this.attList.apply(this, arguments);
      } else {
        return this.attribute.apply(this, arguments);
      }
    };

    XMLDocumentCB.prototype.a = function() {
      if (this.currentNode && this.currentNode.type === NodeType.DocType) {
        return this.attList.apply(this, arguments);
      } else {
        return this.attribute.apply(this, arguments);
      }
    };

    XMLDocumentCB.prototype.ent = function(name, value) {
      return this.entity(name, value);
    };

    XMLDocumentCB.prototype.pent = function(name, value) {
      return this.pEntity(name, value);
    };

    XMLDocumentCB.prototype.not = function(name, value) {
      return this.notation(name, value);
    };

    return XMLDocumentCB;

  })();

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var NodeType, XMLDocumentFragment, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  NodeType = require('./NodeType');

  module.exports = XMLDocumentFragment = (function(superClass) {
    extend(XMLDocumentFragment, superClass);

    function XMLDocumentFragment() {
      XMLDocumentFragment.__super__.constructor.call(this, null);
      this.name = "#document-fragment";
      this.type = NodeType.DocumentFragment;
    }

    return XMLDocumentFragment;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var NodeType, XMLDummy, XMLNode,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLNode = require('./XMLNode');

  NodeType = require('./NodeType');

  module.exports = XMLDummy = (function(superClass) {
    extend(XMLDummy, superClass);

    function XMLDummy(parent) {
      XMLDummy.__super__.constructor.call(this, parent);
      this.type = NodeType.Dummy;
    }

    XMLDummy.prototype.clone = function() {
      return Object.create(this);
    };

    XMLDummy.prototype.toString = function(options) {
      return '';
    };

    return XMLDummy;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var NodeType, XMLAttribute, XMLElement, XMLNamedNodeMap, XMLNode, getValue, isFunction, isObject, ref,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  ref = require('./Utility'), isObject = ref.isObject, isFunction = ref.isFunction, getValue = ref.getValue;

  XMLNode = require('./XMLNode');

  NodeType = require('./NodeType');

  XMLAttribute = require('./XMLAttribute');

  XMLNamedNodeMap = require('./XMLNamedNodeMap');

  module.exports = XMLElement = (function(superClass) {
    extend(XMLElement, superClass);

    function XMLElement(parent, name, attributes) {
      var child, j, len, ref1;
      XMLElement.__super__.constructor.call(this, parent);
      if (name == null) {
        throw new Error("Missing element name. " + this.debugInfo());
      }
      this.name = this.stringify.name(name);
      this.type = NodeType.Element;
      this.attribs = {};
      this.schemaTypeInfo = null;
      if (attributes != null) {
        this.attribute(attributes);
      }
      if (parent.type === NodeType.Document) {
        this.isRoot = true;
        this.documentObject = parent;
        parent.rootObject = this;
        if (parent.children) {
          ref1 = parent.children;
          for (j = 0, len = ref1.length; j < len; j++) {
            child = ref1[j];
            if (child.type === NodeType.DocType) {
              child.name = this.name;
              break;
            }
          }
        }
      }
    }

    Object.defineProperty(XMLElement.prototype, 'tagName', {
      get: function() {
        return this.name;
      }
    });

    Object.defineProperty(XMLElement.prototype, 'namespaceURI', {
      get: function() {
        return '';
      }
    });

    Object.defineProperty(XMLElement.prototype, 'prefix', {
      get: function() {
        return '';
      }
    });

    Object.defineProperty(XMLElement.prototype, 'localName', {
      get: function() {
        return this.name;
      }
    });

    Object.defineProperty(XMLElement.prototype, 'id', {
      get: function() {
        throw new Error("This DOM method is not implemented." + this.debugInfo());
      }
    });

    Object.defineProperty(XMLElement.prototype, 'className', {
      get: function() {
        throw new Error("This DOM method is not implemented." + this.debugInfo());
      }
    });

    Object.defineProperty(XMLElement.prototype, 'classList', {
      get: function() {
        throw new Error("This DOM method is not implemented." + this.debugInfo());
      }
    });

    Object.defineProperty(XMLElement.prototype, 'attributes', {
      get: function() {
        if (!this.attributeMap || !this.attributeMap.nodes) {
          this.attributeMap = new XMLNamedNodeMap(this.attribs);
        }
        return this.attributeMap;
      }
    });

    XMLElement.prototype.clone = function() {
      var att, attName, clonedSelf, ref1;
      clonedSelf = Object.create(this);
      if (clonedSelf.isRoot) {
        clonedSelf.documentObject = null;
      }
      clonedSelf.attribs = {};
      ref1 = this.attribs;
      for (attName in ref1) {
        if (!hasProp.call(ref1, attName)) continue;
        att = ref1[attName];
        clonedSelf.attribs[attName] = att.clone();
      }
      clonedSelf.children = [];
      this.children.forEach(function(child) {
        var clonedChild;
        clonedChild = child.clone();
        clonedChild.parent = clonedSelf;
        return clonedSelf.children.push(clonedChild);
      });
      return clonedSelf;
    };

    XMLElement.prototype.attribute = function(name, value) {
      var attName, attValue;
      if (name != null) {
        name = getValue(name);
      }
      if (isObject(name)) {
        for (attName in name) {
          if (!hasProp.call(name, attName)) continue;
          attValue = name[attName];
          this.attribute(attName, attValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        if (this.options.keepNullAttributes && (value == null)) {
          this.attribs[name] = new XMLAttribute(this, name, "");
        } else if (value != null) {
          this.attribs[name] = new XMLAttribute(this, name, value);
        }
      }
      return this;
    };

    XMLElement.prototype.removeAttribute = function(name) {
      var attName, j, len;
      if (name == null) {
        throw new Error("Missing attribute name. " + this.debugInfo());
      }
      name = getValue(name);
      if (Array.isArray(name)) {
        for (j = 0, len = name.length; j < len; j++) {
          attName = name[j];
          delete this.attribs[attName];
        }
      } else {
        delete this.attribs[name];
      }
      return this;
    };

    XMLElement.prototype.toString = function(options) {
      return this.options.writer.element(this, this.options.writer.filterOptions(options));
    };

    XMLElement.prototype.att = function(name, value) {
      return this.attribute(name, value);
    };

    XMLElement.prototype.a = function(name, value) {
      return this.attribute(name, value);
    };

    XMLElement.prototype.getAttribute = function(name) {
      if (this.attribs.hasOwnProperty(name)) {
        return this.attribs[name].value;
      } else {
        return null;
      }
    };

    XMLElement.prototype.setAttribute = function(name, value) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLElement.prototype.getAttributeNode = function(name) {
      if (this.attribs.hasOwnProperty(name)) {
        return this.attribs[name];
      } else {
        return null;
      }
    };

    XMLElement.prototype.setAttributeNode = function(newAttr) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLElement.prototype.removeAttributeNode = function(oldAttr) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLElement.prototype.getElementsByTagName = function(name) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLElement.prototype.getAttributeNS = function(namespaceURI, localName) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLElement.prototype.setAttributeNS = function(namespaceURI, qualifiedName, value) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLElement.prototype.removeAttributeNS = function(namespaceURI, localName) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLElement.prototype.getAttributeNodeNS = function(namespaceURI, localName) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLElement.prototype.setAttributeNodeNS = function(newAttr) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLElement.prototype.getElementsByTagNameNS = function(namespaceURI, localName) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLElement.prototype.hasAttribute = function(name) {
      return this.attribs.hasOwnProperty(name);
    };

    XMLElement.prototype.hasAttributeNS = function(namespaceURI, localName) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLElement.prototype.setIdAttribute = function(name, isId) {
      if (this.attribs.hasOwnProperty(name)) {
        return this.attribs[name].isId;
      } else {
        return isId;
      }
    };

    XMLElement.prototype.setIdAttributeNS = function(namespaceURI, localName, isId) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLElement.prototype.setIdAttributeNode = function(idAttr, isId) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLElement.prototype.getElementsByTagName = function(tagname) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLElement.prototype.getElementsByTagNameNS = function(namespaceURI, localName) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLElement.prototype.getElementsByClassName = function(classNames) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLElement.prototype.isEqualNode = function(node) {
      var i, j, ref1;
      if (!XMLElement.__super__.isEqualNode.apply(this, arguments).isEqualNode(node)) {
        return false;
      }
      if (node.namespaceURI !== this.namespaceURI) {
        return false;
      }
      if (node.prefix !== this.prefix) {
        return false;
      }
      if (node.localName !== this.localName) {
        return false;
      }
      if (node.attribs.length !== this.attribs.length) {
        return false;
      }
      for (i = j = 0, ref1 = this.attribs.length - 1; 0 <= ref1 ? j <= ref1 : j >= ref1; i = 0 <= ref1 ? ++j : --j) {
        if (!this.attribs[i].isEqualNode(node.attribs[i])) {
          return false;
        }
      }
      return true;
    };

    return XMLElement;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLNamedNodeMap;

  module.exports = XMLNamedNodeMap = (function() {
    function XMLNamedNodeMap(nodes) {
      this.nodes = nodes;
    }

    Object.defineProperty(XMLNamedNodeMap.prototype, 'length', {
      get: function() {
        return Object.keys(this.nodes).length || 0;
      }
    });

    XMLNamedNodeMap.prototype.clone = function() {
      return this.nodes = null;
    };

    XMLNamedNodeMap.prototype.getNamedItem = function(name) {
      return this.nodes[name];
    };

    XMLNamedNodeMap.prototype.setNamedItem = function(node) {
      var oldNode;
      oldNode = this.nodes[node.nodeName];
      this.nodes[node.nodeName] = node;
      return oldNode || null;
    };

    XMLNamedNodeMap.prototype.removeNamedItem = function(name) {
      var oldNode;
      oldNode = this.nodes[name];
      delete this.nodes[name];
      return oldNode || null;
    };

    XMLNamedNodeMap.prototype.item = function(index) {
      return this.nodes[Object.keys(this.nodes)[index]] || null;
    };

    XMLNamedNodeMap.prototype.getNamedItemNS = function(namespaceURI, localName) {
      throw new Error("This DOM method is not implemented.");
    };

    XMLNamedNodeMap.prototype.setNamedItemNS = function(node) {
      throw new Error("This DOM method is not implemented.");
    };

    XMLNamedNodeMap.prototype.removeNamedItemNS = function(namespaceURI, localName) {
      throw new Error("This DOM method is not implemented.");
    };

    return XMLNamedNodeMap;

  })();

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var DocumentPosition, NodeType, XMLCData, XMLComment, XMLDeclaration, XMLDocType, XMLDummy, XMLElement, XMLNamedNodeMap, XMLNode, XMLNodeList, XMLProcessingInstruction, XMLRaw, XMLText, getValue, isEmpty, isFunction, isObject, ref1,
    hasProp = {}.hasOwnProperty;

  ref1 = require('./Utility'), isObject = ref1.isObject, isFunction = ref1.isFunction, isEmpty = ref1.isEmpty, getValue = ref1.getValue;

  XMLElement = null;

  XMLCData = null;

  XMLComment = null;

  XMLDeclaration = null;

  XMLDocType = null;

  XMLRaw = null;

  XMLText = null;

  XMLProcessingInstruction = null;

  XMLDummy = null;

  NodeType = null;

  XMLNodeList = null;

  XMLNamedNodeMap = null;

  DocumentPosition = null;

  module.exports = XMLNode = (function() {
    function XMLNode(parent1) {
      this.parent = parent1;
      if (this.parent) {
        this.options = this.parent.options;
        this.stringify = this.parent.stringify;
      }
      this.value = null;
      this.children = [];
      this.baseURI = null;
      if (!XMLElement) {
        XMLElement = require('./XMLElement');
        XMLCData = require('./XMLCData');
        XMLComment = require('./XMLComment');
        XMLDeclaration = require('./XMLDeclaration');
        XMLDocType = require('./XMLDocType');
        XMLRaw = require('./XMLRaw');
        XMLText = require('./XMLText');
        XMLProcessingInstruction = require('./XMLProcessingInstruction');
        XMLDummy = require('./XMLDummy');
        NodeType = require('./NodeType');
        XMLNodeList = require('./XMLNodeList');
        XMLNamedNodeMap = require('./XMLNamedNodeMap');
        DocumentPosition = require('./DocumentPosition');
      }
    }

    Object.defineProperty(XMLNode.prototype, 'nodeName', {
      get: function() {
        return this.name;
      }
    });

    Object.defineProperty(XMLNode.prototype, 'nodeType', {
      get: function() {
        return this.type;
      }
    });

    Object.defineProperty(XMLNode.prototype, 'nodeValue', {
      get: function() {
        return this.value;
      }
    });

    Object.defineProperty(XMLNode.prototype, 'parentNode', {
      get: function() {
        return this.parent;
      }
    });

    Object.defineProperty(XMLNode.prototype, 'childNodes', {
      get: function() {
        if (!this.childNodeList || !this.childNodeList.nodes) {
          this.childNodeList = new XMLNodeList(this.children);
        }
        return this.childNodeList;
      }
    });

    Object.defineProperty(XMLNode.prototype, 'firstChild', {
      get: function() {
        return this.children[0] || null;
      }
    });

    Object.defineProperty(XMLNode.prototype, 'lastChild', {
      get: function() {
        return this.children[this.children.length - 1] || null;
      }
    });

    Object.defineProperty(XMLNode.prototype, 'previousSibling', {
      get: function() {
        var i;
        i = this.parent.children.indexOf(this);
        return this.parent.children[i - 1] || null;
      }
    });

    Object.defineProperty(XMLNode.prototype, 'nextSibling', {
      get: function() {
        var i;
        i = this.parent.children.indexOf(this);
        return this.parent.children[i + 1] || null;
      }
    });

    Object.defineProperty(XMLNode.prototype, 'ownerDocument', {
      get: function() {
        return this.document() || null;
      }
    });

    Object.defineProperty(XMLNode.prototype, 'textContent', {
      get: function() {
        var child, j, len, ref2, str;
        if (this.nodeType === NodeType.Element || this.nodeType === NodeType.DocumentFragment) {
          str = '';
          ref2 = this.children;
          for (j = 0, len = ref2.length; j < len; j++) {
            child = ref2[j];
            if (child.textContent) {
              str += child.textContent;
            }
          }
          return str;
        } else {
          return null;
        }
      },
      set: function(value) {
        throw new Error("This DOM method is not implemented." + this.debugInfo());
      }
    });

    XMLNode.prototype.setParent = function(parent) {
      var child, j, len, ref2, results;
      this.parent = parent;
      if (parent) {
        this.options = parent.options;
        this.stringify = parent.stringify;
      }
      ref2 = this.children;
      results = [];
      for (j = 0, len = ref2.length; j < len; j++) {
        child = ref2[j];
        results.push(child.setParent(this));
      }
      return results;
    };

    XMLNode.prototype.element = function(name, attributes, text) {
      var childNode, item, j, k, key, lastChild, len, len1, ref2, ref3, val;
      lastChild = null;
      if (attributes === null && (text == null)) {
        ref2 = [{}, null], attributes = ref2[0], text = ref2[1];
      }
      if (attributes == null) {
        attributes = {};
      }
      attributes = getValue(attributes);
      if (!isObject(attributes)) {
        ref3 = [attributes, text], text = ref3[0], attributes = ref3[1];
      }
      if (name != null) {
        name = getValue(name);
      }
      if (Array.isArray(name)) {
        for (j = 0, len = name.length; j < len; j++) {
          item = name[j];
          lastChild = this.element(item);
        }
      } else if (isFunction(name)) {
        lastChild = this.element(name.apply());
      } else if (isObject(name)) {
        for (key in name) {
          if (!hasProp.call(name, key)) continue;
          val = name[key];
          if (isFunction(val)) {
            val = val.apply();
          }
          if (!this.options.ignoreDecorators && this.stringify.convertAttKey && key.indexOf(this.stringify.convertAttKey) === 0) {
            lastChild = this.attribute(key.substr(this.stringify.convertAttKey.length), val);
          } else if (!this.options.separateArrayItems && Array.isArray(val) && isEmpty(val)) {
            lastChild = this.dummy();
          } else if (isObject(val) && isEmpty(val)) {
            lastChild = this.element(key);
          } else if (!this.options.keepNullNodes && (val == null)) {
            lastChild = this.dummy();
          } else if (!this.options.separateArrayItems && Array.isArray(val)) {
            for (k = 0, len1 = val.length; k < len1; k++) {
              item = val[k];
              childNode = {};
              childNode[key] = item;
              lastChild = this.element(childNode);
            }
          } else if (isObject(val)) {
            if (!this.options.ignoreDecorators && this.stringify.convertTextKey && key.indexOf(this.stringify.convertTextKey) === 0) {
              lastChild = this.element(val);
            } else {
              lastChild = this.element(key);
              lastChild.element(val);
            }
          } else {
            lastChild = this.element(key, val);
          }
        }
      } else if (!this.options.keepNullNodes && text === null) {
        lastChild = this.dummy();
      } else {
        if (!this.options.ignoreDecorators && this.stringify.convertTextKey && name.indexOf(this.stringify.convertTextKey) === 0) {
          lastChild = this.text(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertCDataKey && name.indexOf(this.stringify.convertCDataKey) === 0) {
          lastChild = this.cdata(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertCommentKey && name.indexOf(this.stringify.convertCommentKey) === 0) {
          lastChild = this.comment(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertRawKey && name.indexOf(this.stringify.convertRawKey) === 0) {
          lastChild = this.raw(text);
        } else if (!this.options.ignoreDecorators && this.stringify.convertPIKey && name.indexOf(this.stringify.convertPIKey) === 0) {
          lastChild = this.instruction(name.substr(this.stringify.convertPIKey.length), text);
        } else {
          lastChild = this.node(name, attributes, text);
        }
      }
      if (lastChild == null) {
        throw new Error("Could not create any elements with: " + name + ". " + this.debugInfo());
      }
      return lastChild;
    };

    XMLNode.prototype.insertBefore = function(name, attributes, text) {
      var child, i, newChild, refChild, removed;
      if (name != null ? name.type : void 0) {
        newChild = name;
        refChild = attributes;
        newChild.setParent(this);
        if (refChild) {
          i = children.indexOf(refChild);
          removed = children.splice(i);
          children.push(newChild);
          Array.prototype.push.apply(children, removed);
        } else {
          children.push(newChild);
        }
        return newChild;
      } else {
        if (this.isRoot) {
          throw new Error("Cannot insert elements at root level. " + this.debugInfo(name));
        }
        i = this.parent.children.indexOf(this);
        removed = this.parent.children.splice(i);
        child = this.parent.element(name, attributes, text);
        Array.prototype.push.apply(this.parent.children, removed);
        return child;
      }
    };

    XMLNode.prototype.insertAfter = function(name, attributes, text) {
      var child, i, removed;
      if (this.isRoot) {
        throw new Error("Cannot insert elements at root level. " + this.debugInfo(name));
      }
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i + 1);
      child = this.parent.element(name, attributes, text);
      Array.prototype.push.apply(this.parent.children, removed);
      return child;
    };

    XMLNode.prototype.remove = function() {
      var i, ref2;
      if (this.isRoot) {
        throw new Error("Cannot remove the root element. " + this.debugInfo());
      }
      i = this.parent.children.indexOf(this);
      [].splice.apply(this.parent.children, [i, i - i + 1].concat(ref2 = [])), ref2;
      return this.parent;
    };

    XMLNode.prototype.node = function(name, attributes, text) {
      var child, ref2;
      if (name != null) {
        name = getValue(name);
      }
      attributes || (attributes = {});
      attributes = getValue(attributes);
      if (!isObject(attributes)) {
        ref2 = [attributes, text], text = ref2[0], attributes = ref2[1];
      }
      child = new XMLElement(this, name, attributes);
      if (text != null) {
        child.text(text);
      }
      this.children.push(child);
      return child;
    };

    XMLNode.prototype.text = function(value) {
      var child;
      if (isObject(value)) {
        this.element(value);
      }
      child = new XMLText(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.cdata = function(value) {
      var child;
      child = new XMLCData(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.comment = function(value) {
      var child;
      child = new XMLComment(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.commentBefore = function(value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i);
      child = this.parent.comment(value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.commentAfter = function(value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i + 1);
      child = this.parent.comment(value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.raw = function(value) {
      var child;
      child = new XMLRaw(this, value);
      this.children.push(child);
      return this;
    };

    XMLNode.prototype.dummy = function() {
      var child;
      child = new XMLDummy(this);
      return child;
    };

    XMLNode.prototype.instruction = function(target, value) {
      var insTarget, insValue, instruction, j, len;
      if (target != null) {
        target = getValue(target);
      }
      if (value != null) {
        value = getValue(value);
      }
      if (Array.isArray(target)) {
        for (j = 0, len = target.length; j < len; j++) {
          insTarget = target[j];
          this.instruction(insTarget);
        }
      } else if (isObject(target)) {
        for (insTarget in target) {
          if (!hasProp.call(target, insTarget)) continue;
          insValue = target[insTarget];
          this.instruction(insTarget, insValue);
        }
      } else {
        if (isFunction(value)) {
          value = value.apply();
        }
        instruction = new XMLProcessingInstruction(this, target, value);
        this.children.push(instruction);
      }
      return this;
    };

    XMLNode.prototype.instructionBefore = function(target, value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i);
      child = this.parent.instruction(target, value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.instructionAfter = function(target, value) {
      var child, i, removed;
      i = this.parent.children.indexOf(this);
      removed = this.parent.children.splice(i + 1);
      child = this.parent.instruction(target, value);
      Array.prototype.push.apply(this.parent.children, removed);
      return this;
    };

    XMLNode.prototype.declaration = function(version, encoding, standalone) {
      var doc, xmldec;
      doc = this.document();
      xmldec = new XMLDeclaration(doc, version, encoding, standalone);
      if (doc.children.length === 0) {
        doc.children.unshift(xmldec);
      } else if (doc.children[0].type === NodeType.Declaration) {
        doc.children[0] = xmldec;
      } else {
        doc.children.unshift(xmldec);
      }
      return doc.root() || doc;
    };

    XMLNode.prototype.dtd = function(pubID, sysID) {
      var child, doc, doctype, i, j, k, len, len1, ref2, ref3;
      doc = this.document();
      doctype = new XMLDocType(doc, pubID, sysID);
      ref2 = doc.children;
      for (i = j = 0, len = ref2.length; j < len; i = ++j) {
        child = ref2[i];
        if (child.type === NodeType.DocType) {
          doc.children[i] = doctype;
          return doctype;
        }
      }
      ref3 = doc.children;
      for (i = k = 0, len1 = ref3.length; k < len1; i = ++k) {
        child = ref3[i];
        if (child.isRoot) {
          doc.children.splice(i, 0, doctype);
          return doctype;
        }
      }
      doc.children.push(doctype);
      return doctype;
    };

    XMLNode.prototype.up = function() {
      if (this.isRoot) {
        throw new Error("The root node has no parent. Use doc() if you need to get the document object.");
      }
      return this.parent;
    };

    XMLNode.prototype.root = function() {
      var node;
      node = this;
      while (node) {
        if (node.type === NodeType.Document) {
          return node.rootObject;
        } else if (node.isRoot) {
          return node;
        } else {
          node = node.parent;
        }
      }
    };

    XMLNode.prototype.document = function() {
      var node;
      node = this;
      while (node) {
        if (node.type === NodeType.Document) {
          return node;
        } else {
          node = node.parent;
        }
      }
    };

    XMLNode.prototype.end = function(options) {
      return this.document().end(options);
    };

    XMLNode.prototype.prev = function() {
      var i;
      i = this.parent.children.indexOf(this);
      if (i < 1) {
        throw new Error("Already at the first node. " + this.debugInfo());
      }
      return this.parent.children[i - 1];
    };

    XMLNode.prototype.next = function() {
      var i;
      i = this.parent.children.indexOf(this);
      if (i === -1 || i === this.parent.children.length - 1) {
        throw new Error("Already at the last node. " + this.debugInfo());
      }
      return this.parent.children[i + 1];
    };

    XMLNode.prototype.importDocument = function(doc) {
      var clonedRoot;
      clonedRoot = doc.root().clone();
      clonedRoot.parent = this;
      clonedRoot.isRoot = false;
      this.children.push(clonedRoot);
      return this;
    };

    XMLNode.prototype.debugInfo = function(name) {
      var ref2, ref3;
      name = name || this.name;
      if ((name == null) && !((ref2 = this.parent) != null ? ref2.name : void 0)) {
        return "";
      } else if (name == null) {
        return "parent: <" + this.parent.name + ">";
      } else if (!((ref3 = this.parent) != null ? ref3.name : void 0)) {
        return "node: <" + name + ">";
      } else {
        return "node: <" + name + ">, parent: <" + this.parent.name + ">";
      }
    };

    XMLNode.prototype.ele = function(name, attributes, text) {
      return this.element(name, attributes, text);
    };

    XMLNode.prototype.nod = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLNode.prototype.txt = function(value) {
      return this.text(value);
    };

    XMLNode.prototype.dat = function(value) {
      return this.cdata(value);
    };

    XMLNode.prototype.com = function(value) {
      return this.comment(value);
    };

    XMLNode.prototype.ins = function(target, value) {
      return this.instruction(target, value);
    };

    XMLNode.prototype.doc = function() {
      return this.document();
    };

    XMLNode.prototype.dec = function(version, encoding, standalone) {
      return this.declaration(version, encoding, standalone);
    };

    XMLNode.prototype.e = function(name, attributes, text) {
      return this.element(name, attributes, text);
    };

    XMLNode.prototype.n = function(name, attributes, text) {
      return this.node(name, attributes, text);
    };

    XMLNode.prototype.t = function(value) {
      return this.text(value);
    };

    XMLNode.prototype.d = function(value) {
      return this.cdata(value);
    };

    XMLNode.prototype.c = function(value) {
      return this.comment(value);
    };

    XMLNode.prototype.r = function(value) {
      return this.raw(value);
    };

    XMLNode.prototype.i = function(target, value) {
      return this.instruction(target, value);
    };

    XMLNode.prototype.u = function() {
      return this.up();
    };

    XMLNode.prototype.importXMLBuilder = function(doc) {
      return this.importDocument(doc);
    };

    XMLNode.prototype.replaceChild = function(newChild, oldChild) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLNode.prototype.removeChild = function(oldChild) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLNode.prototype.appendChild = function(newChild) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLNode.prototype.hasChildNodes = function() {
      return this.children.length !== 0;
    };

    XMLNode.prototype.cloneNode = function(deep) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLNode.prototype.normalize = function() {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLNode.prototype.isSupported = function(feature, version) {
      return true;
    };

    XMLNode.prototype.hasAttributes = function() {
      return this.attribs.length !== 0;
    };

    XMLNode.prototype.compareDocumentPosition = function(other) {
      var ref, res;
      ref = this;
      if (ref === other) {
        return 0;
      } else if (this.document() !== other.document()) {
        res = DocumentPosition.Disconnected | DocumentPosition.ImplementationSpecific;
        if (Math.random() < 0.5) {
          res |= DocumentPosition.Preceding;
        } else {
          res |= DocumentPosition.Following;
        }
        return res;
      } else if (ref.isAncestor(other)) {
        return DocumentPosition.Contains | DocumentPosition.Preceding;
      } else if (ref.isDescendant(other)) {
        return DocumentPosition.Contains | DocumentPosition.Following;
      } else if (ref.isPreceding(other)) {
        return DocumentPosition.Preceding;
      } else {
        return DocumentPosition.Following;
      }
    };

    XMLNode.prototype.isSameNode = function(other) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLNode.prototype.lookupPrefix = function(namespaceURI) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLNode.prototype.isDefaultNamespace = function(namespaceURI) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLNode.prototype.lookupNamespaceURI = function(prefix) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLNode.prototype.isEqualNode = function(node) {
      var i, j, ref2;
      if (node.nodeType !== this.nodeType) {
        return false;
      }
      if (node.children.length !== this.children.length) {
        return false;
      }
      for (i = j = 0, ref2 = this.children.length - 1; 0 <= ref2 ? j <= ref2 : j >= ref2; i = 0 <= ref2 ? ++j : --j) {
        if (!this.children[i].isEqualNode(node.children[i])) {
          return false;
        }
      }
      return true;
    };

    XMLNode.prototype.getFeature = function(feature, version) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLNode.prototype.setUserData = function(key, data, handler) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLNode.prototype.getUserData = function(key) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLNode.prototype.contains = function(other) {
      if (!other) {
        return false;
      }
      return other === this || this.isDescendant(other);
    };

    XMLNode.prototype.isDescendant = function(node) {
      var child, isDescendantChild, j, len, ref2;
      ref2 = this.children;
      for (j = 0, len = ref2.length; j < len; j++) {
        child = ref2[j];
        if (node === child) {
          return true;
        }
        isDescendantChild = child.isDescendant(node);
        if (isDescendantChild) {
          return true;
        }
      }
      return false;
    };

    XMLNode.prototype.isAncestor = function(node) {
      return node.isDescendant(this);
    };

    XMLNode.prototype.isPreceding = function(node) {
      var nodePos, thisPos;
      nodePos = this.treePosition(node);
      thisPos = this.treePosition(this);
      if (nodePos === -1 || thisPos === -1) {
        return false;
      } else {
        return nodePos < thisPos;
      }
    };

    XMLNode.prototype.isFollowing = function(node) {
      var nodePos, thisPos;
      nodePos = this.treePosition(node);
      thisPos = this.treePosition(this);
      if (nodePos === -1 || thisPos === -1) {
        return false;
      } else {
        return nodePos > thisPos;
      }
    };

    XMLNode.prototype.treePosition = function(node) {
      var found, pos;
      pos = 0;
      found = false;
      this.foreachTreeNode(this.document(), function(childNode) {
        pos++;
        if (!found && childNode === node) {
          return found = true;
        }
      });
      if (found) {
        return pos;
      } else {
        return -1;
      }
    };

    XMLNode.prototype.foreachTreeNode = function(node, func) {
      var child, j, len, ref2, res;
      node || (node = this.document());
      ref2 = node.children;
      for (j = 0, len = ref2.length; j < len; j++) {
        child = ref2[j];
        if (res = func(child)) {
          return res;
        } else {
          res = this.foreachTreeNode(child, func);
          if (res) {
            return res;
          }
        }
      }
    };

    return XMLNode;

  })();

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLNodeFilter;

  module.exports = XMLNodeFilter = (function() {
    function XMLNodeFilter() {}

    XMLNodeFilter.prototype.FilterAccept = 1;

    XMLNodeFilter.prototype.FilterReject = 2;

    XMLNodeFilter.prototype.FilterSkip = 3;

    XMLNodeFilter.prototype.ShowAll = 0xffffffff;

    XMLNodeFilter.prototype.ShowElement = 0x1;

    XMLNodeFilter.prototype.ShowAttribute = 0x2;

    XMLNodeFilter.prototype.ShowText = 0x4;

    XMLNodeFilter.prototype.ShowCDataSection = 0x8;

    XMLNodeFilter.prototype.ShowEntityReference = 0x10;

    XMLNodeFilter.prototype.ShowEntity = 0x20;

    XMLNodeFilter.prototype.ShowProcessingInstruction = 0x40;

    XMLNodeFilter.prototype.ShowComment = 0x80;

    XMLNodeFilter.prototype.ShowDocument = 0x100;

    XMLNodeFilter.prototype.ShowDocumentType = 0x200;

    XMLNodeFilter.prototype.ShowDocumentFragment = 0x400;

    XMLNodeFilter.prototype.ShowNotation = 0x800;

    XMLNodeFilter.prototype.acceptNode = function(node) {
      throw new Error("This DOM method is not implemented.");
    };

    return XMLNodeFilter;

  })();

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLNodeList;

  module.exports = XMLNodeList = (function() {
    function XMLNodeList(nodes) {
      this.nodes = nodes;
    }

    Object.defineProperty(XMLNodeList.prototype, 'length', {
      get: function() {
        return this.nodes.length || 0;
      }
    });

    XMLNodeList.prototype.clone = function() {
      return this.nodes = null;
    };

    XMLNodeList.prototype.item = function(index) {
      return this.nodes[index] || null;
    };

    return XMLNodeList;

  })();

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var NodeType, XMLCharacterData, XMLProcessingInstruction,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  NodeType = require('./NodeType');

  XMLCharacterData = require('./XMLCharacterData');

  module.exports = XMLProcessingInstruction = (function(superClass) {
    extend(XMLProcessingInstruction, superClass);

    function XMLProcessingInstruction(parent, target, value) {
      XMLProcessingInstruction.__super__.constructor.call(this, parent);
      if (target == null) {
        throw new Error("Missing instruction target. " + this.debugInfo());
      }
      this.type = NodeType.ProcessingInstruction;
      this.target = this.stringify.insTarget(target);
      this.name = this.target;
      if (value) {
        this.value = this.stringify.insValue(value);
      }
    }

    XMLProcessingInstruction.prototype.clone = function() {
      return Object.create(this);
    };

    XMLProcessingInstruction.prototype.toString = function(options) {
      return this.options.writer.processingInstruction(this, this.options.writer.filterOptions(options));
    };

    XMLProcessingInstruction.prototype.isEqualNode = function(node) {
      if (!XMLProcessingInstruction.__super__.isEqualNode.apply(this, arguments).isEqualNode(node)) {
        return false;
      }
      if (node.target !== this.target) {
        return false;
      }
      return true;
    };

    return XMLProcessingInstruction;

  })(XMLCharacterData);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var NodeType, XMLNode, XMLRaw,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  NodeType = require('./NodeType');

  XMLNode = require('./XMLNode');

  module.exports = XMLRaw = (function(superClass) {
    extend(XMLRaw, superClass);

    function XMLRaw(parent, text) {
      XMLRaw.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing raw text. " + this.debugInfo());
      }
      this.type = NodeType.Raw;
      this.value = this.stringify.raw(text);
    }

    XMLRaw.prototype.clone = function() {
      return Object.create(this);
    };

    XMLRaw.prototype.toString = function(options) {
      return this.options.writer.raw(this, this.options.writer.filterOptions(options));
    };

    return XMLRaw;

  })(XMLNode);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var NodeType, WriterState, XMLStreamWriter, XMLWriterBase,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  NodeType = require('./NodeType');

  XMLWriterBase = require('./XMLWriterBase');

  WriterState = require('./WriterState');

  module.exports = XMLStreamWriter = (function(superClass) {
    extend(XMLStreamWriter, superClass);

    function XMLStreamWriter(stream, options) {
      this.stream = stream;
      XMLStreamWriter.__super__.constructor.call(this, options);
    }

    XMLStreamWriter.prototype.endline = function(node, options, level) {
      if (node.isLastRootNode && options.state === WriterState.CloseTag) {
        return '';
      } else {
        return XMLStreamWriter.__super__.endline.call(this, node, options, level);
      }
    };

    XMLStreamWriter.prototype.document = function(doc, options) {
      var child, i, j, k, len, len1, ref, ref1, results;
      ref = doc.children;
      for (i = j = 0, len = ref.length; j < len; i = ++j) {
        child = ref[i];
        child.isLastRootNode = i === doc.children.length - 1;
      }
      options = this.filterOptions(options);
      ref1 = doc.children;
      results = [];
      for (k = 0, len1 = ref1.length; k < len1; k++) {
        child = ref1[k];
        results.push(this.writeChildNode(child, options, 0));
      }
      return results;
    };

    XMLStreamWriter.prototype.attribute = function(att, options, level) {
      return this.stream.write(XMLStreamWriter.__super__.attribute.call(this, att, options, level));
    };

    XMLStreamWriter.prototype.cdata = function(node, options, level) {
      return this.stream.write(XMLStreamWriter.__super__.cdata.call(this, node, options, level));
    };

    XMLStreamWriter.prototype.comment = function(node, options, level) {
      return this.stream.write(XMLStreamWriter.__super__.comment.call(this, node, options, level));
    };

    XMLStreamWriter.prototype.declaration = function(node, options, level) {
      return this.stream.write(XMLStreamWriter.__super__.declaration.call(this, node, options, level));
    };

    XMLStreamWriter.prototype.docType = function(node, options, level) {
      var child, j, len, ref;
      level || (level = 0);
      this.openNode(node, options, level);
      options.state = WriterState.OpenTag;
      this.stream.write(this.indent(node, options, level));
      this.stream.write('<!DOCTYPE ' + node.root().name);
      if (node.pubID && node.sysID) {
        this.stream.write(' PUBLIC "' + node.pubID + '" "' + node.sysID + '"');
      } else if (node.sysID) {
        this.stream.write(' SYSTEM "' + node.sysID + '"');
      }
      if (node.children.length > 0) {
        this.stream.write(' [');
        this.stream.write(this.endline(node, options, level));
        options.state = WriterState.InsideTag;
        ref = node.children;
        for (j = 0, len = ref.length; j < len; j++) {
          child = ref[j];
          this.writeChildNode(child, options, level + 1);
        }
        options.state = WriterState.CloseTag;
        this.stream.write(']');
      }
      options.state = WriterState.CloseTag;
      this.stream.write(options.spaceBeforeSlash + '>');
      this.stream.write(this.endline(node, options, level));
      options.state = WriterState.None;
      return this.closeNode(node, options, level);
    };

    XMLStreamWriter.prototype.element = function(node, options, level) {
      var att, child, childNodeCount, firstChildNode, j, len, name, prettySuppressed, ref, ref1;
      level || (level = 0);
      this.openNode(node, options, level);
      options.state = WriterState.OpenTag;
      this.stream.write(this.indent(node, options, level) + '<' + node.name);
      ref = node.attribs;
      for (name in ref) {
        if (!hasProp.call(ref, name)) continue;
        att = ref[name];
        this.attribute(att, options, level);
      }
      childNodeCount = node.children.length;
      firstChildNode = childNodeCount === 0 ? null : node.children[0];
      if (childNodeCount === 0 || node.children.every(function(e) {
        return (e.type === NodeType.Text || e.type === NodeType.Raw) && e.value === '';
      })) {
        if (options.allowEmpty) {
          this.stream.write('>');
          options.state = WriterState.CloseTag;
          this.stream.write('</' + node.name + '>');
        } else {
          options.state = WriterState.CloseTag;
          this.stream.write(options.spaceBeforeSlash + '/>');
        }
      } else if (options.pretty && childNodeCount === 1 && (firstChildNode.type === NodeType.Text || firstChildNode.type === NodeType.Raw) && (firstChildNode.value != null)) {
        this.stream.write('>');
        options.state = WriterState.InsideTag;
        options.suppressPrettyCount++;
        prettySuppressed = true;
        this.writeChildNode(firstChildNode, options, level + 1);
        options.suppressPrettyCount--;
        prettySuppressed = false;
        options.state = WriterState.CloseTag;
        this.stream.write('</' + node.name + '>');
      } else {
        this.stream.write('>' + this.endline(node, options, level));
        options.state = WriterState.InsideTag;
        ref1 = node.children;
        for (j = 0, len = ref1.length; j < len; j++) {
          child = ref1[j];
          this.writeChildNode(child, options, level + 1);
        }
        options.state = WriterState.CloseTag;
        this.stream.write(this.indent(node, options, level) + '</' + node.name + '>');
      }
      this.stream.write(this.endline(node, options, level));
      options.state = WriterState.None;
      return this.closeNode(node, options, level);
    };

    XMLStreamWriter.prototype.processingInstruction = function(node, options, level) {
      return this.stream.write(XMLStreamWriter.__super__.processingInstruction.call(this, node, options, level));
    };

    XMLStreamWriter.prototype.raw = function(node, options, level) {
      return this.stream.write(XMLStreamWriter.__super__.raw.call(this, node, options, level));
    };

    XMLStreamWriter.prototype.text = function(node, options, level) {
      return this.stream.write(XMLStreamWriter.__super__.text.call(this, node, options, level));
    };

    XMLStreamWriter.prototype.dtdAttList = function(node, options, level) {
      return this.stream.write(XMLStreamWriter.__super__.dtdAttList.call(this, node, options, level));
    };

    XMLStreamWriter.prototype.dtdElement = function(node, options, level) {
      return this.stream.write(XMLStreamWriter.__super__.dtdElement.call(this, node, options, level));
    };

    XMLStreamWriter.prototype.dtdEntity = function(node, options, level) {
      return this.stream.write(XMLStreamWriter.__super__.dtdEntity.call(this, node, options, level));
    };

    XMLStreamWriter.prototype.dtdNotation = function(node, options, level) {
      return this.stream.write(XMLStreamWriter.__super__.dtdNotation.call(this, node, options, level));
    };

    return XMLStreamWriter;

  })(XMLWriterBase);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLStringWriter, XMLWriterBase,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  XMLWriterBase = require('./XMLWriterBase');

  module.exports = XMLStringWriter = (function(superClass) {
    extend(XMLStringWriter, superClass);

    function XMLStringWriter(options) {
      XMLStringWriter.__super__.constructor.call(this, options);
    }

    XMLStringWriter.prototype.document = function(doc, options) {
      var child, i, len, r, ref;
      options = this.filterOptions(options);
      r = '';
      ref = doc.children;
      for (i = 0, len = ref.length; i < len; i++) {
        child = ref[i];
        r += this.writeChildNode(child, options, 0);
      }
      if (options.pretty && r.slice(-options.newline.length) === options.newline) {
        r = r.slice(0, -options.newline.length);
      }
      return r;
    };

    return XMLStringWriter;

  })(XMLWriterBase);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var XMLStringifier,
    bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
    hasProp = {}.hasOwnProperty;

  module.exports = XMLStringifier = (function() {
    function XMLStringifier(options) {
      this.assertLegalName = bind(this.assertLegalName, this);
      this.assertLegalChar = bind(this.assertLegalChar, this);
      var key, ref, value;
      options || (options = {});
      this.options = options;
      if (!this.options.version) {
        this.options.version = '1.0';
      }
      ref = options.stringify || {};
      for (key in ref) {
        if (!hasProp.call(ref, key)) continue;
        value = ref[key];
        this[key] = value;
      }
    }

    XMLStringifier.prototype.name = function(val) {
      if (this.options.noValidation) {
        return val;
      }
      return this.assertLegalName('' + val || '');
    };

    XMLStringifier.prototype.text = function(val) {
      if (this.options.noValidation) {
        return val;
      }
      return this.assertLegalChar(this.textEscape('' + val || ''));
    };

    XMLStringifier.prototype.cdata = function(val) {
      if (this.options.noValidation) {
        return val;
      }
      val = '' + val || '';
      val = val.replace(']]>', ']]]]><![CDATA[>');
      return this.assertLegalChar(val);
    };

    XMLStringifier.prototype.comment = function(val) {
      if (this.options.noValidation) {
        return val;
      }
      val = '' + val || '';
      if (val.match(/--/)) {
        throw new Error("Comment text cannot contain double-hypen: " + val);
      }
      return this.assertLegalChar(val);
    };

    XMLStringifier.prototype.raw = function(val) {
      if (this.options.noValidation) {
        return val;
      }
      return '' + val || '';
    };

    XMLStringifier.prototype.attValue = function(val) {
      if (this.options.noValidation) {
        return val;
      }
      return this.assertLegalChar(this.attEscape(val = '' + val || ''));
    };

    XMLStringifier.prototype.insTarget = function(val) {
      if (this.options.noValidation) {
        return val;
      }
      return this.assertLegalChar('' + val || '');
    };

    XMLStringifier.prototype.insValue = function(val) {
      if (this.options.noValidation) {
        return val;
      }
      val = '' + val || '';
      if (val.match(/\?>/)) {
        throw new Error("Invalid processing instruction value: " + val);
      }
      return this.assertLegalChar(val);
    };

    XMLStringifier.prototype.xmlVersion = function(val) {
      if (this.options.noValidation) {
        return val;
      }
      val = '' + val || '';
      if (!val.match(/1\.[0-9]+/)) {
        throw new Error("Invalid version number: " + val);
      }
      return val;
    };

    XMLStringifier.prototype.xmlEncoding = function(val) {
      if (this.options.noValidation) {
        return val;
      }
      val = '' + val || '';
      if (!val.match(/^[A-Za-z](?:[A-Za-z0-9._-])*$/)) {
        throw new Error("Invalid encoding: " + val);
      }
      return this.assertLegalChar(val);
    };

    XMLStringifier.prototype.xmlStandalone = function(val) {
      if (this.options.noValidation) {
        return val;
      }
      if (val) {
        return "yes";
      } else {
        return "no";
      }
    };

    XMLStringifier.prototype.dtdPubID = function(val) {
      if (this.options.noValidation) {
        return val;
      }
      return this.assertLegalChar('' + val || '');
    };

    XMLStringifier.prototype.dtdSysID = function(val) {
      if (this.options.noValidation) {
        return val;
      }
      return this.assertLegalChar('' + val || '');
    };

    XMLStringifier.prototype.dtdElementValue = function(val) {
      if (this.options.noValidation) {
        return val;
      }
      return this.assertLegalChar('' + val || '');
    };

    XMLStringifier.prototype.dtdAttType = function(val) {
      if (this.options.noValidation) {
        return val;
      }
      return this.assertLegalChar('' + val || '');
    };

    XMLStringifier.prototype.dtdAttDefault = function(val) {
      if (this.options.noValidation) {
        return val;
      }
      return this.assertLegalChar('' + val || '');
    };

    XMLStringifier.prototype.dtdEntityValue = function(val) {
      if (this.options.noValidation) {
        return val;
      }
      return this.assertLegalChar('' + val || '');
    };

    XMLStringifier.prototype.dtdNData = function(val) {
      if (this.options.noValidation) {
        return val;
      }
      return this.assertLegalChar('' + val || '');
    };

    XMLStringifier.prototype.convertAttKey = '@';

    XMLStringifier.prototype.convertPIKey = '?';

    XMLStringifier.prototype.convertTextKey = '#text';

    XMLStringifier.prototype.convertCDataKey = '#cdata';

    XMLStringifier.prototype.convertCommentKey = '#comment';

    XMLStringifier.prototype.convertRawKey = '#raw';

    XMLStringifier.prototype.assertLegalChar = function(str) {
      var regex, res;
      if (this.options.noValidation) {
        return str;
      }
      regex = '';
      if (this.options.version === '1.0') {
        regex = /[\0-\x08\x0B\f\x0E-\x1F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/;
        if (res = str.match(regex)) {
          throw new Error("Invalid character in string: " + str + " at index " + res.index);
        }
      } else if (this.options.version === '1.1') {
        regex = /[\0\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/;
        if (res = str.match(regex)) {
          throw new Error("Invalid character in string: " + str + " at index " + res.index);
        }
      }
      return str;
    };

    XMLStringifier.prototype.assertLegalName = function(str) {
      var regex;
      if (this.options.noValidation) {
        return str;
      }
      this.assertLegalChar(str);
      regex = /^([:A-Z_a-z\xC0-\xD6\xD8-\xF6\xF8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|[\uD800-\uDB7F][\uDC00-\uDFFF])([\x2D\.0-:A-Z_a-z\xB7\xC0-\xD6\xD8-\xF6\xF8-\u037D\u037F-\u1FFF\u200C\u200D\u203F\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|[\uD800-\uDB7F][\uDC00-\uDFFF])*$/;
      if (!str.match(regex)) {
        throw new Error("Invalid character in name");
      }
      return str;
    };

    XMLStringifier.prototype.textEscape = function(str) {
      var ampregex;
      if (this.options.noValidation) {
        return str;
      }
      ampregex = this.options.noDoubleEncoding ? /(?!&\S+;)&/g : /&/g;
      return str.replace(ampregex, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\r/g, '&#xD;');
    };

    XMLStringifier.prototype.attEscape = function(str) {
      var ampregex;
      if (this.options.noValidation) {
        return str;
      }
      ampregex = this.options.noDoubleEncoding ? /(?!&\S+;)&/g : /&/g;
      return str.replace(ampregex, '&amp;').replace(/</g, '&lt;').replace(/"/g, '&quot;').replace(/\t/g, '&#x9;').replace(/\n/g, '&#xA;').replace(/\r/g, '&#xD;');
    };

    return XMLStringifier;

  })();

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var NodeType, XMLCharacterData, XMLText,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty;

  NodeType = require('./NodeType');

  XMLCharacterData = require('./XMLCharacterData');

  module.exports = XMLText = (function(superClass) {
    extend(XMLText, superClass);

    function XMLText(parent, text) {
      XMLText.__super__.constructor.call(this, parent);
      if (text == null) {
        throw new Error("Missing element text. " + this.debugInfo());
      }
      this.name = "#text";
      this.type = NodeType.Text;
      this.value = this.stringify.text(text);
    }

    Object.defineProperty(XMLText.prototype, 'isElementContentWhitespace', {
      get: function() {
        throw new Error("This DOM method is not implemented." + this.debugInfo());
      }
    });

    Object.defineProperty(XMLText.prototype, 'wholeText', {
      get: function() {
        var next, prev, str;
        str = '';
        prev = this.previousSibling;
        while (prev) {
          str = prev.data + str;
          prev = prev.previousSibling;
        }
        str += this.data;
        next = this.nextSibling;
        while (next) {
          str = str + next.data;
          next = next.nextSibling;
        }
        return str;
      }
    });

    XMLText.prototype.clone = function() {
      return Object.create(this);
    };

    XMLText.prototype.toString = function(options) {
      return this.options.writer.text(this, this.options.writer.filterOptions(options));
    };

    XMLText.prototype.splitText = function(offset) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    XMLText.prototype.replaceWholeText = function(content) {
      throw new Error("This DOM method is not implemented." + this.debugInfo());
    };

    return XMLText;

  })(XMLCharacterData);

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var Derivation, XMLTypeInfo;

  Derivation = require('./Derivation');

  module.exports = XMLTypeInfo = (function() {
    function XMLTypeInfo(typeName, typeNamespace) {
      this.typeName = typeName;
      this.typeNamespace = typeNamespace;
    }

    XMLTypeInfo.prototype.isDerivedFrom = function(typeNamespaceArg, typeNameArg, derivationMethod) {
      throw new Error("This DOM method is not implemented.");
    };

    return XMLTypeInfo;

  })();

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var OperationType, XMLUserDataHandler;

  OperationType = require('./OperationType');

  module.exports = XMLUserDataHandler = (function() {
    function XMLUserDataHandler() {}

    XMLUserDataHandler.prototype.handle = function(operation, key, data, src, dst) {};

    return XMLUserDataHandler;

  })();

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var NodeType, WriterState, XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDeclaration, XMLDocType, XMLDummy, XMLElement, XMLProcessingInstruction, XMLRaw, XMLText, XMLWriterBase, assign,
    hasProp = {}.hasOwnProperty;

  assign = require('./Utility').assign;

  NodeType = require('./NodeType');

  XMLDeclaration = require('./XMLDeclaration');

  XMLDocType = require('./XMLDocType');

  XMLCData = require('./XMLCData');

  XMLComment = require('./XMLComment');

  XMLElement = require('./XMLElement');

  XMLRaw = require('./XMLRaw');

  XMLText = require('./XMLText');

  XMLProcessingInstruction = require('./XMLProcessingInstruction');

  XMLDummy = require('./XMLDummy');

  XMLDTDAttList = require('./XMLDTDAttList');

  XMLDTDElement = require('./XMLDTDElement');

  XMLDTDEntity = require('./XMLDTDEntity');

  XMLDTDNotation = require('./XMLDTDNotation');

  WriterState = require('./WriterState');

  module.exports = XMLWriterBase = (function() {
    function XMLWriterBase(options) {
      var key, ref, value;
      options || (options = {});
      this.options = options;
      ref = options.writer || {};
      for (key in ref) {
        if (!hasProp.call(ref, key)) continue;
        value = ref[key];
        this["_" + key] = this[key];
        this[key] = value;
      }
    }

    XMLWriterBase.prototype.filterOptions = function(options) {
      var filteredOptions, ref, ref1, ref2, ref3, ref4, ref5, ref6;
      options || (options = {});
      options = assign({}, this.options, options);
      filteredOptions = {
        writer: this
      };
      filteredOptions.pretty = options.pretty || false;
      filteredOptions.allowEmpty = options.allowEmpty || false;
      filteredOptions.indent = (ref = options.indent) != null ? ref : '  ';
      filteredOptions.newline = (ref1 = options.newline) != null ? ref1 : '\n';
      filteredOptions.offset = (ref2 = options.offset) != null ? ref2 : 0;
      filteredOptions.dontPrettyTextNodes = (ref3 = (ref4 = options.dontPrettyTextNodes) != null ? ref4 : options.dontprettytextnodes) != null ? ref3 : 0;
      filteredOptions.spaceBeforeSlash = (ref5 = (ref6 = options.spaceBeforeSlash) != null ? ref6 : options.spacebeforeslash) != null ? ref5 : '';
      if (filteredOptions.spaceBeforeSlash === true) {
        filteredOptions.spaceBeforeSlash = ' ';
      }
      filteredOptions.suppressPrettyCount = 0;
      filteredOptions.user = {};
      filteredOptions.state = WriterState.None;
      return filteredOptions;
    };

    XMLWriterBase.prototype.indent = function(node, options, level) {
      var indentLevel;
      if (!options.pretty || options.suppressPrettyCount) {
        return '';
      } else if (options.pretty) {
        indentLevel = (level || 0) + options.offset + 1;
        if (indentLevel > 0) {
          return new Array(indentLevel).join(options.indent);
        }
      }
      return '';
    };

    XMLWriterBase.prototype.endline = function(node, options, level) {
      if (!options.pretty || options.suppressPrettyCount) {
        return '';
      } else {
        return options.newline;
      }
    };

    XMLWriterBase.prototype.attribute = function(att, options, level) {
      var r;
      this.openAttribute(att, options, level);
      r = ' ' + att.name + '="' + att.value + '"';
      this.closeAttribute(att, options, level);
      return r;
    };

    XMLWriterBase.prototype.cdata = function(node, options, level) {
      var r;
      this.openNode(node, options, level);
      options.state = WriterState.OpenTag;
      r = this.indent(node, options, level) + '<![CDATA[';
      options.state = WriterState.InsideTag;
      r += node.value;
      options.state = WriterState.CloseTag;
      r += ']]>' + this.endline(node, options, level);
      options.state = WriterState.None;
      this.closeNode(node, options, level);
      return r;
    };

    XMLWriterBase.prototype.comment = function(node, options, level) {
      var r;
      this.openNode(node, options, level);
      options.state = WriterState.OpenTag;
      r = this.indent(node, options, level) + '<!-- ';
      options.state = WriterState.InsideTag;
      r += node.value;
      options.state = WriterState.CloseTag;
      r += ' -->' + this.endline(node, options, level);
      options.state = WriterState.None;
      this.closeNode(node, options, level);
      return r;
    };

    XMLWriterBase.prototype.declaration = function(node, options, level) {
      var r;
      this.openNode(node, options, level);
      options.state = WriterState.OpenTag;
      r = this.indent(node, options, level) + '<?xml';
      options.state = WriterState.InsideTag;
      r += ' version="' + node.version + '"';
      if (node.encoding != null) {
        r += ' encoding="' + node.encoding + '"';
      }
      if (node.standalone != null) {
        r += ' standalone="' + node.standalone + '"';
      }
      options.state = WriterState.CloseTag;
      r += options.spaceBeforeSlash + '?>';
      r += this.endline(node, options, level);
      options.state = WriterState.None;
      this.closeNode(node, options, level);
      return r;
    };

    XMLWriterBase.prototype.docType = function(node, options, level) {
      var child, i, len, r, ref;
      level || (level = 0);
      this.openNode(node, options, level);
      options.state = WriterState.OpenTag;
      r = this.indent(node, options, level);
      r += '<!DOCTYPE ' + node.root().name;
      if (node.pubID && node.sysID) {
        r += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
      } else if (node.sysID) {
        r += ' SYSTEM "' + node.sysID + '"';
      }
      if (node.children.length > 0) {
        r += ' [';
        r += this.endline(node, options, level);
        options.state = WriterState.InsideTag;
        ref = node.children;
        for (i = 0, len = ref.length; i < len; i++) {
          child = ref[i];
          r += this.writeChildNode(child, options, level + 1);
        }
        options.state = WriterState.CloseTag;
        r += ']';
      }
      options.state = WriterState.CloseTag;
      r += options.spaceBeforeSlash + '>';
      r += this.endline(node, options, level);
      options.state = WriterState.None;
      this.closeNode(node, options, level);
      return r;
    };

    XMLWriterBase.prototype.element = function(node, options, level) {
      var att, child, childNodeCount, firstChildNode, i, j, len, len1, name, prettySuppressed, r, ref, ref1, ref2;
      level || (level = 0);
      prettySuppressed = false;
      r = '';
      this.openNode(node, options, level);
      options.state = WriterState.OpenTag;
      r += this.indent(node, options, level) + '<' + node.name;
      ref = node.attribs;
      for (name in ref) {
        if (!hasProp.call(ref, name)) continue;
        att = ref[name];
        r += this.attribute(att, options, level);
      }
      childNodeCount = node.children.length;
      firstChildNode = childNodeCount === 0 ? null : node.children[0];
      if (childNodeCount === 0 || node.children.every(function(e) {
        return (e.type === NodeType.Text || e.type === NodeType.Raw) && e.value === '';
      })) {
        if (options.allowEmpty) {
          r += '>';
          options.state = WriterState.CloseTag;
          r += '</' + node.name + '>' + this.endline(node, options, level);
        } else {
          options.state = WriterState.CloseTag;
          r += options.spaceBeforeSlash + '/>' + this.endline(node, options, level);
        }
      } else if (options.pretty && childNodeCount === 1 && (firstChildNode.type === NodeType.Text || firstChildNode.type === NodeType.Raw) && (firstChildNode.value != null)) {
        r += '>';
        options.state = WriterState.InsideTag;
        options.suppressPrettyCount++;
        prettySuppressed = true;
        r += this.writeChildNode(firstChildNode, options, level + 1);
        options.suppressPrettyCount--;
        prettySuppressed = false;
        options.state = WriterState.CloseTag;
        r += '</' + node.name + '>' + this.endline(node, options, level);
      } else {
        if (options.dontPrettyTextNodes) {
          ref1 = node.children;
          for (i = 0, len = ref1.length; i < len; i++) {
            child = ref1[i];
            if ((child.type === NodeType.Text || child.type === NodeType.Raw) && (child.value != null)) {
              options.suppressPrettyCount++;
              prettySuppressed = true;
              break;
            }
          }
        }
        r += '>' + this.endline(node, options, level);
        options.state = WriterState.InsideTag;
        ref2 = node.children;
        for (j = 0, len1 = ref2.length; j < len1; j++) {
          child = ref2[j];
          r += this.writeChildNode(child, options, level + 1);
        }
        options.state = WriterState.CloseTag;
        r += this.indent(node, options, level) + '</' + node.name + '>';
        if (prettySuppressed) {
          options.suppressPrettyCount--;
        }
        r += this.endline(node, options, level);
        options.state = WriterState.None;
      }
      this.closeNode(node, options, level);
      return r;
    };

    XMLWriterBase.prototype.writeChildNode = function(node, options, level) {
      switch (node.type) {
        case NodeType.CData:
          return this.cdata(node, options, level);
        case NodeType.Comment:
          return this.comment(node, options, level);
        case NodeType.Element:
          return this.element(node, options, level);
        case NodeType.Raw:
          return this.raw(node, options, level);
        case NodeType.Text:
          return this.text(node, options, level);
        case NodeType.ProcessingInstruction:
          return this.processingInstruction(node, options, level);
        case NodeType.Dummy:
          return '';
        case NodeType.Declaration:
          return this.declaration(node, options, level);
        case NodeType.DocType:
          return this.docType(node, options, level);
        case NodeType.AttributeDeclaration:
          return this.dtdAttList(node, options, level);
        case NodeType.ElementDeclaration:
          return this.dtdElement(node, options, level);
        case NodeType.EntityDeclaration:
          return this.dtdEntity(node, options, level);
        case NodeType.NotationDeclaration:
          return this.dtdNotation(node, options, level);
        default:
          throw new Error("Unknown XML node type: " + node.constructor.name);
      }
    };

    XMLWriterBase.prototype.processingInstruction = function(node, options, level) {
      var r;
      this.openNode(node, options, level);
      options.state = WriterState.OpenTag;
      r = this.indent(node, options, level) + '<?';
      options.state = WriterState.InsideTag;
      r += node.target;
      if (node.value) {
        r += ' ' + node.value;
      }
      options.state = WriterState.CloseTag;
      r += options.spaceBeforeSlash + '?>';
      r += this.endline(node, options, level);
      options.state = WriterState.None;
      this.closeNode(node, options, level);
      return r;
    };

    XMLWriterBase.prototype.raw = function(node, options, level) {
      var r;
      this.openNode(node, options, level);
      options.state = WriterState.OpenTag;
      r = this.indent(node, options, level);
      options.state = WriterState.InsideTag;
      r += node.value;
      options.state = WriterState.CloseTag;
      r += this.endline(node, options, level);
      options.state = WriterState.None;
      this.closeNode(node, options, level);
      return r;
    };

    XMLWriterBase.prototype.text = function(node, options, level) {
      var r;
      this.openNode(node, options, level);
      options.state = WriterState.OpenTag;
      r = this.indent(node, options, level);
      options.state = WriterState.InsideTag;
      r += node.value;
      options.state = WriterState.CloseTag;
      r += this.endline(node, options, level);
      options.state = WriterState.None;
      this.closeNode(node, options, level);
      return r;
    };

    XMLWriterBase.prototype.dtdAttList = function(node, options, level) {
      var r;
      this.openNode(node, options, level);
      options.state = WriterState.OpenTag;
      r = this.indent(node, options, level) + '<!ATTLIST';
      options.state = WriterState.InsideTag;
      r += ' ' + node.elementName + ' ' + node.attributeName + ' ' + node.attributeType;
      if (node.defaultValueType !== '#DEFAULT') {
        r += ' ' + node.defaultValueType;
      }
      if (node.defaultValue) {
        r += ' "' + node.defaultValue + '"';
      }
      options.state = WriterState.CloseTag;
      r += options.spaceBeforeSlash + '>' + this.endline(node, options, level);
      options.state = WriterState.None;
      this.closeNode(node, options, level);
      return r;
    };

    XMLWriterBase.prototype.dtdElement = function(node, options, level) {
      var r;
      this.openNode(node, options, level);
      options.state = WriterState.OpenTag;
      r = this.indent(node, options, level) + '<!ELEMENT';
      options.state = WriterState.InsideTag;
      r += ' ' + node.name + ' ' + node.value;
      options.state = WriterState.CloseTag;
      r += options.spaceBeforeSlash + '>' + this.endline(node, options, level);
      options.state = WriterState.None;
      this.closeNode(node, options, level);
      return r;
    };

    XMLWriterBase.prototype.dtdEntity = function(node, options, level) {
      var r;
      this.openNode(node, options, level);
      options.state = WriterState.OpenTag;
      r = this.indent(node, options, level) + '<!ENTITY';
      options.state = WriterState.InsideTag;
      if (node.pe) {
        r += ' %';
      }
      r += ' ' + node.name;
      if (node.value) {
        r += ' "' + node.value + '"';
      } else {
        if (node.pubID && node.sysID) {
          r += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
        } else if (node.sysID) {
          r += ' SYSTEM "' + node.sysID + '"';
        }
        if (node.nData) {
          r += ' NDATA ' + node.nData;
        }
      }
      options.state = WriterState.CloseTag;
      r += options.spaceBeforeSlash + '>' + this.endline(node, options, level);
      options.state = WriterState.None;
      this.closeNode(node, options, level);
      return r;
    };

    XMLWriterBase.prototype.dtdNotation = function(node, options, level) {
      var r;
      this.openNode(node, options, level);
      options.state = WriterState.OpenTag;
      r = this.indent(node, options, level) + '<!NOTATION';
      options.state = WriterState.InsideTag;
      r += ' ' + node.name;
      if (node.pubID && node.sysID) {
        r += ' PUBLIC "' + node.pubID + '" "' + node.sysID + '"';
      } else if (node.pubID) {
        r += ' PUBLIC "' + node.pubID + '"';
      } else if (node.sysID) {
        r += ' SYSTEM "' + node.sysID + '"';
      }
      options.state = WriterState.CloseTag;
      r += options.spaceBeforeSlash + '>' + this.endline(node, options, level);
      options.state = WriterState.None;
      this.closeNode(node, options, level);
      return r;
    };

    XMLWriterBase.prototype.openNode = function(node, options, level) {};

    XMLWriterBase.prototype.closeNode = function(node, options, level) {};

    XMLWriterBase.prototype.openAttribute = function(att, options, level) {};

    XMLWriterBase.prototype.closeAttribute = function(att, options, level) {};

    return XMLWriterBase;

  })();

}).call(this);
// Generated by CoffeeScript 1.12.7
(function() {
  var NodeType, WriterState, XMLDOMImplementation, XMLDocument, XMLDocumentCB, XMLStreamWriter, XMLStringWriter, assign, isFunction, ref;

  ref = require('./Utility'), assign = ref.assign, isFunction = ref.isFunction;

  XMLDOMImplementation = require('./XMLDOMImplementation');

  XMLDocument = require('./XMLDocument');

  XMLDocumentCB = require('./XMLDocumentCB');

  XMLStringWriter = require('./XMLStringWriter');

  XMLStreamWriter = require('./XMLStreamWriter');

  NodeType = require('./NodeType');

  WriterState = require('./WriterState');

  module.exports.create = function(name, xmldec, doctype, options) {
    var doc, root;
    if (name == null) {
      throw new Error("Root element needs a name.");
    }
    options = assign({}, xmldec, doctype, options);
    doc = new XMLDocument(options);
    root = doc.element(name);
    if (!options.headless) {
      doc.declaration(options);
      if ((options.pubID != null) || (options.sysID != null)) {
        doc.dtd(options);
      }
    }
    return root;
  };

  module.exports.begin = function(options, onData, onEnd) {
    var ref1;
    if (isFunction(options)) {
      ref1 = [options, onData], onData = ref1[0], onEnd = ref1[1];
      options = {};
    }
    if (onData) {
      return new XMLDocumentCB(options, onData, onEnd);
    } else {
      return new XMLDocument(options);
    }
  };

  module.exports.stringWriter = function(options) {
    return new XMLStringWriter(options);
  };

  module.exports.streamWriter = function(stream, options) {
    return new XMLStreamWriter(stream, options);
  };

  module.exports.implementation = new XMLDOMImplementation();

  module.exports.nodeType = NodeType;

  module.exports.writerState = WriterState;

}).call(this);
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.
'use strict'
module.exports = function (Yallist) {
  Yallist.prototype[Symbol.iterator] = function* () {
    for (let walker = this.head; walker; walker = walker.next) {
      yield walker.value
    }
  }
}
{
  "name": "yallist",
  "version": "4.0.0",
  "description": "Yet Another Linked List",
  "main": "yallist.js",
  "directories": {
    "test": "test"
  },
  "files": [
    "yallist.js",
    "iterator.js"
  ],
  "dependencies": {},
  "devDependencies": {
    "tap": "^12.1.0"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/isaacs/yallist.git"
  },
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
  "license": "ISC"
}'use strict'
module.exports = Yallist

Yallist.Node = Node
Yallist.create = Yallist

function Yallist (list) {
  var self = this
  if (!(self instanceof Yallist)) {
    self = new Yallist()
  }

  self.tail = null
  self.head = null
  self.length = 0

  if (list && typeof list.forEach === 'function') {
    list.forEach(function (item) {
      self.push(item)
    })
  } else if (arguments.length > 0) {
    for (var i = 0, l = arguments.length; i < l; i++) {
      self.push(arguments[i])
    }
  }

  return self
}

Yallist.prototype.removeNode = function (node) {
  if (node.list !== this) {
    throw new Error('removing node which does not belong to this list')
  }

  var next = node.next
  var prev = node.prev

  if (next) {
    next.prev = prev
  }

  if (prev) {
    prev.next = next
  }

  if (node === this.head) {
    this.head = next
  }
  if (node === this.tail) {
    this.tail = prev
  }

  node.list.length--
  node.next = null
  node.prev = null
  node.list = null

  return next
}

Yallist.prototype.unshiftNode = function (node) {
  if (node === this.head) {
    return
  }

  if (node.list) {
    node.list.removeNode(node)
  }

  var head = this.head
  node.list = this
  node.next = head
  if (head) {
    head.prev = node
  }

  this.head = node
  if (!this.tail) {
    this.tail = node
  }
  this.length++
}

Yallist.prototype.pushNode = function (node) {
  if (node === this.tail) {
    return
  }

  if (node.list) {
    node.list.removeNode(node)
  }

  var tail = this.tail
  node.list = this
  node.prev = tail
  if (tail) {
    tail.next = node
  }

  this.tail = node
  if (!this.head) {
    this.head = node
  }
  this.length++
}

Yallist.prototype.push = function () {
  for (var i = 0, l = arguments.length; i < l; i++) {
    push(this, arguments[i])
  }
  return this.length
}

Yallist.prototype.unshift = function () {
  for (var i = 0, l = arguments.length; i < l; i++) {
    unshift(this, arguments[i])
  }
  return this.length
}

Yallist.prototype.pop = function () {
  if (!this.tail) {
    return undefined
  }

  var res = this.tail.value
  this.tail = this.tail.prev
  if (this.tail) {
    this.tail.next = null
  } else {
    this.head = null
  }
  this.length--
  return res
}

Yallist.prototype.shift = function () {
  if (!this.head) {
    return undefined
  }

  var res = this.head.value
  this.head = this.head.next
  if (this.head) {
    this.head.prev = null
  } else {
    this.tail = null
  }
  this.length--
  return res
}

Yallist.prototype.forEach = function (fn, thisp) {
  thisp = thisp || this
  for (var walker = this.head, i = 0; walker !== null; i++) {
    fn.call(thisp, walker.value, i, this)
    walker = walker.next
  }
}

Yallist.prototype.forEachReverse = function (fn, thisp) {
  thisp = thisp || this
  for (var walker = this.tail, i = this.length - 1; walker !== null; i--) {
    fn.call(thisp, walker.value, i, this)
    walker = walker.prev
  }
}

Yallist.prototype.get = function (n) {
  for (var i = 0, walker = this.head; walker !== null && i < n; i++) {
    // abort out of the list early if we hit a cycle
    walker = walker.next
  }
  if (i === n && walker !== null) {
    return walker.value
  }
}

Yallist.prototype.getReverse = function (n) {
  for (var i = 0, walker = this.tail; walker !== null && i < n; i++) {
    // abort out of the list early if we hit a cycle
    walker = walker.prev
  }
  if (i === n && walker !== null) {
    return walker.value
  }
}

Yallist.prototype.map = function (fn, thisp) {
  thisp = thisp || this
  var res = new Yallist()
  for (var walker = this.head; walker !== null;) {
    res.push(fn.call(thisp, walker.value, this))
    walker = walker.next
  }
  return res
}

Yallist.prototype.mapReverse = function (fn, thisp) {
  thisp = thisp || this
  var res = new Yallist()
  for (var walker = this.tail; walker !== null;) {
    res.push(fn.call(thisp, walker.value, this))
    walker = walker.prev
  }
  return res
}

Yallist.prototype.reduce = function (fn, initial) {
  var acc
  var walker = this.head
  if (arguments.length > 1) {
    acc = initial
  } else if (this.head) {
    walker = this.head.next
    acc = this.head.value
  } else {
    throw new TypeError('Reduce of empty list with no initial value')
  }

  for (var i = 0; walker !== null; i++) {
    acc = fn(acc, walker.value, i)
    walker = walker.next
  }

  return acc
}

Yallist.prototype.reduceReverse = function (fn, initial) {
  var acc
  var walker = this.tail
  if (arguments.length > 1) {
    acc = initial
  } else if (this.tail) {
    walker = this.tail.prev
    acc = this.tail.value
  } else {
    throw new TypeError('Reduce of empty list with no initial value')
  }

  for (var i = this.length - 1; walker !== null; i--) {
    acc = fn(acc, walker.value, i)
    walker = walker.prev
  }

  return acc
}

Yallist.prototype.toArray = function () {
  var arr = new Array(this.length)
  for (var i = 0, walker = this.head; walker !== null; i++) {
    arr[i] = walker.value
    walker = walker.next
  }
  return arr
}

Yallist.prototype.toArrayReverse = function () {
  var arr = new Array(this.length)
  for (var i = 0, walker = this.tail; walker !== null; i++) {
    arr[i] = walker.value
    walker = walker.prev
  }
  return arr
}

Yallist.prototype.slice = function (from, to) {
  to = to || this.length
  if (to < 0) {
    to += this.length
  }
  from = from || 0
  if (from < 0) {
    from += this.length
  }
  var ret = new Yallist()
  if (to < from || to < 0) {
    return ret
  }
  if (from < 0) {
    from = 0
  }
  if (to > this.length) {
    to = this.length
  }
  for (var i = 0, walker = this.head; walker !== null && i < from; i++) {
    walker = walker.next
  }
  for (; walker !== null && i < to; i++, walker = walker.next) {
    ret.push(walker.value)
  }
  return ret
}

Yallist.prototype.sliceReverse = function (from, to) {
  to = to || this.length
  if (to < 0) {
    to += this.length
  }
  from = from || 0
  if (from < 0) {
    from += this.length
  }
  var ret = new Yallist()
  if (to < from || to < 0) {
    return ret
  }
  if (from < 0) {
    from = 0
  }
  if (to > this.length) {
    to = this.length
  }
  for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) {
    walker = walker.prev
  }
  for (; walker !== null && i > from; i--, walker = walker.prev) {
    ret.push(walker.value)
  }
  return ret
}

Yallist.prototype.splice = function (start, deleteCount, ...nodes) {
  if (start > this.length) {
    start = this.length - 1
  }
  if (start < 0) {
    start = this.length + start;
  }

  for (var i = 0, walker = this.head; walker !== null && i < start; i++) {
    walker = walker.next
  }

  var ret = []
  for (var i = 0; walker && i < deleteCount; i++) {
    ret.push(walker.value)
    walker = this.removeNode(walker)
  }
  if (walker === null) {
    walker = this.tail
  }

  if (walker !== this.head && walker !== this.tail) {
    walker = walker.prev
  }

  for (var i = 0; i < nodes.length; i++) {
    walker = insert(this, walker, nodes[i])
  }
  return ret;
}

Yallist.prototype.reverse = function () {
  var head = this.head
  var tail = this.tail
  for (var walker = head; walker !== null; walker = walker.prev) {
    var p = walker.prev
    walker.prev = walker.next
    walker.next = p
  }
  this.head = tail
  this.tail = head
  return this
}

function insert (self, node, value) {
  var inserted = node === self.head ?
    new Node(value, null, node, self) :
    new Node(value, node, node.next, self)

  if (inserted.next === null) {
    self.tail = inserted
  }
  if (inserted.prev === null) {
    self.head = inserted
  }

  self.length++

  return inserted
}

function push (self, item) {
  self.tail = new Node(item, self.tail, null, self)
  if (!self.head) {
    self.head = self.tail
  }
  self.length++
}

function unshift (self, item) {
  self.head = new Node(item, null, self.head, self)
  if (!self.tail) {
    self.tail = self.head
  }
  self.length++
}

function Node (value, prev, next, list) {
  if (!(this instanceof Node)) {
    return new Node(value, prev, next, list)
  }

  this.list = list
  this.value = value

  if (prev) {
    prev.next = this
    this.prev = prev
  } else {
    this.prev = null
  }

  if (next) {
    next.prev = this
    this.next = next
  } else {
    this.next = null
  }
}

try {
  // add if support for Symbol.iterator is present
  require('./iterator.js')(Yallist)
} catch (er) {}
1.1.2 / 2018-01-11
==================

  * perf: remove argument reassignment
  * Support Node.js 0.6 to 9.x

1.1.1 / 2017-07-27
==================

  * Remove unnecessary `Buffer` loading
  * Support Node.js 0.6 to 8.x

1.1.0 / 2015-09-14
==================

  * Enable strict mode in more places
  * Support io.js 3.x
  * Support io.js 2.x
  * Support web browser loading
    - Requires bundler like Browserify or webpack

1.0.1 / 2015-04-07
==================

  * Fix `TypeError`s when under `'use strict'` code
  * Fix useless type name on auto-generated messages
  * Support io.js 1.x
  * Support Node.js 0.12

1.0.0 / 2014-09-17
==================

  * No changes

0.4.5 / 2014-09-09
==================

  * Improve call speed to functions using the function wrapper
  * Support Node.js 0.6

0.4.4 / 2014-07-27
==================

  * Work-around v8 generating empty stack traces

0.4.3 / 2014-07-26
==================

  * Fix exception when global `Error.stackTraceLimit` is too low

0.4.2 / 2014-07-19
==================

  * Correct call site for wrapped functions and properties

0.4.1 / 2014-07-19
==================

  * Improve automatic message generation for function properties

0.4.0 / 2014-07-19
==================

  * Add `TRACE_DEPRECATION` environment variable
  * Remove non-standard grey color from color output
  * Support `--no-deprecation` argument
  * Support `--trace-deprecation` argument
  * Support `deprecate.property(fn, prop, message)`

0.3.0 / 2014-06-16
==================

  * Add `NO_DEPRECATION` environment variable

0.2.0 / 2014-06-15
==================

  * Add `deprecate.property(obj, prop, message)`
  * Remove `supports-color` dependency for node.js 0.8

0.1.0 / 2014-06-15
==================

  * Add `deprecate.function(fn, message)`
  * Add `process.on('deprecation', fn)` emitter
  * Automatically generate message when omitted from `deprecate()`

0.0.1 / 2014-06-15
==================

  * Fix warning for dynamic calls at singe call site

0.0.0 / 2014-06-15
==================

  * Initial implementation
(The MIT License)

Copyright (c) 2014-2017 Douglas Christopher Wilson

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.
/*!
 * depd
 * Copyright(c) 2014-2017 Douglas Christopher Wilson
 * MIT Licensed
 */

/**
 * Module dependencies.
 */

var callSiteToString = require('./lib/compat').callSiteToString
var eventListenerCount = require('./lib/compat').eventListenerCount
var relative = require('path').relative

/**
 * Module exports.
 */

module.exports = depd

/**
 * Get the path to base files on.
 */

var basePath = process.cwd()

/**
 * Determine if namespace is contained in the string.
 */

function containsNamespace (str, namespace) {
  var vals = str.split(/[ ,]+/)
  var ns = String(namespace).toLowerCase()

  for (var i = 0; i < vals.length; i++) {
    var val = vals[i]

    // namespace contained
    if (val && (val === '*' || val.toLowerCase() === ns)) {
      return true
    }
  }

  return false
}

/**
 * Convert a data descriptor to accessor descriptor.
 */

function convertDataDescriptorToAccessor (obj, prop, message) {
  var descriptor = Object.getOwnPropertyDescriptor(obj, prop)
  var value = descriptor.value

  descriptor.get = function getter () { return value }

  if (descriptor.writable) {
    descriptor.set = function setter (val) { return (value = val) }
  }

  delete descriptor.value
  delete descriptor.writable

  Object.defineProperty(obj, prop, descriptor)

  return descriptor
}

/**
 * Create arguments string to keep arity.
 */

function createArgumentsString (arity) {
  var str = ''

  for (var i = 0; i < arity; i++) {
    str += ', arg' + i
  }

  return str.substr(2)
}

/**
 * Create stack string from stack.
 */

function createStackString (stack) {
  var str = this.name + ': ' + this.namespace

  if (this.message) {
    str += ' deprecated ' + this.message
  }

  for (var i = 0; i < stack.length; i++) {
    str += '\n    at ' + callSiteToString(stack[i])
  }

  return str
}

/**
 * Create deprecate for namespace in caller.
 */

function depd (namespace) {
  if (!namespace) {
    throw new TypeError('argument namespace is required')
  }

  var stack = getStack()
  var site = callSiteLocation(stack[1])
  var file = site[0]

  function deprecate (message) {
    // call to self as log
    log.call(deprecate, message)
  }

  deprecate._file = file
  deprecate._ignored = isignored(namespace)
  deprecate._namespace = namespace
  deprecate._traced = istraced(namespace)
  deprecate._warned = Object.create(null)

  deprecate.function = wrapfunction
  deprecate.property = wrapproperty

  return deprecate
}

/**
 * Determine if namespace is ignored.
 */

function isignored (namespace) {
  /* istanbul ignore next: tested in a child processs */
  if (process.noDeprecation) {
    // --no-deprecation support
    return true
  }

  var str = process.env.NO_DEPRECATION || ''

  // namespace ignored
  return containsNamespace(str, namespace)
}

/**
 * Determine if namespace is traced.
 */

function istraced (namespace) {
  /* istanbul ignore next: tested in a child processs */
  if (process.traceDeprecation) {
    // --trace-deprecation support
    return true
  }

  var str = process.env.TRACE_DEPRECATION || ''

  // namespace traced
  return containsNamespace(str, namespace)
}

/**
 * Display deprecation message.
 */

function log (message, site) {
  var haslisteners = eventListenerCount(process, 'deprecation') !== 0

  // abort early if no destination
  if (!haslisteners && this._ignored) {
    return
  }

  var caller
  var callFile
  var callSite
  var depSite
  var i = 0
  var seen = false
  var stack = getStack()
  var file = this._file

  if (site) {
    // provided site
    depSite = site
    callSite = callSiteLocation(stack[1])
    callSite.name = depSite.name
    file = callSite[0]
  } else {
    // get call site
    i = 2
    depSite = callSiteLocation(stack[i])
    callSite = depSite
  }

  // get caller of deprecated thing in relation to file
  for (; i < stack.length; i++) {
    caller = callSiteLocation(stack[i])
    callFile = caller[0]

    if (callFile === file) {
      seen = true
    } else if (callFile === this._file) {
      file = this._file
    } else if (seen) {
      break
    }
  }

  var key = caller
    ? depSite.join(':') + '__' + caller.join(':')
    : undefined

  if (key !== undefined && key in this._warned) {
    // already warned
    return
  }

  this._warned[key] = true

  // generate automatic message from call site
  var msg = message
  if (!msg) {
    msg = callSite === depSite || !callSite.name
      ? defaultMessage(depSite)
      : defaultMessage(callSite)
  }

  // emit deprecation if listeners exist
  if (haslisteners) {
    var err = DeprecationError(this._namespace, msg, stack.slice(i))
    process.emit('deprecation', err)
    return
  }

  // format and write message
  var format = process.stderr.isTTY
    ? formatColor
    : formatPlain
  var output = format.call(this, msg, caller, stack.slice(i))
  process.stderr.write(output + '\n', 'utf8')
}

/**
 * Get call site location as array.
 */

function callSiteLocation (callSite) {
  var file = callSite.getFileName() || '<anonymous>'
  var line = callSite.getLineNumber()
  var colm = callSite.getColumnNumber()

  if (callSite.isEval()) {
    file = callSite.getEvalOrigin() + ', ' + file
  }

  var site = [file, line, colm]

  site.callSite = callSite
  site.name = callSite.getFunctionName()

  return site
}

/**
 * Generate a default message from the site.
 */

function defaultMessage (site) {
  var callSite = site.callSite
  var funcName = site.name

  // make useful anonymous name
  if (!funcName) {
    funcName = '<anonymous@' + formatLocation(site) + '>'
  }

  var context = callSite.getThis()
  var typeName = context && callSite.getTypeName()

  // ignore useless type name
  if (typeName === 'Object') {
    typeName = undefined
  }

  // make useful type name
  if (typeName === 'Function') {
    typeName = context.name || typeName
  }

  return typeName && callSite.getMethodName()
    ? typeName + '.' + funcName
    : funcName
}

/**
 * Format deprecation message without color.
 */

function formatPlain (msg, caller, stack) {
  var timestamp = new Date().toUTCString()

  var formatted = timestamp +
    ' ' + this._namespace +
    ' deprecated ' + msg

  // add stack trace
  if (this._traced) {
    for (var i = 0; i < stack.length; i++) {
      formatted += '\n    at ' + callSiteToString(stack[i])
    }

    return formatted
  }

  if (caller) {
    formatted += ' at ' + formatLocation(caller)
  }

  return formatted
}

/**
 * Format deprecation message with color.
 */

function formatColor (msg, caller, stack) {
  var formatted = '\x1b[36;1m' + this._namespace + '\x1b[22;39m' + // bold cyan
    ' \x1b[33;1mdeprecated\x1b[22;39m' + // bold yellow
    ' \x1b[0m' + msg + '\x1b[39m' // reset

  // add stack trace
  if (this._traced) {
    for (var i = 0; i < stack.length; i++) {
      formatted += '\n    \x1b[36mat ' + callSiteToString(stack[i]) + '\x1b[39m' // cyan
    }

    return formatted
  }

  if (caller) {
    formatted += ' \x1b[36m' + formatLocation(caller) + '\x1b[39m' // cyan
  }

  return formatted
}

/**
 * Format call site location.
 */

function formatLocation (callSite) {
  return relative(basePath, callSite[0]) +
    ':' + callSite[1] +
    ':' + callSite[2]
}

/**
 * Get the stack as array of call sites.
 */

function getStack () {
  var limit = Error.stackTraceLimit
  var obj = {}
  var prep = Error.prepareStackTrace

  Error.prepareStackTrace = prepareObjectStackTrace
  Error.stackTraceLimit = Math.max(10, limit)

  // capture the stack
  Error.captureStackTrace(obj)

  // slice this function off the top
  var stack = obj.stack.slice(1)

  Error.prepareStackTrace = prep
  Error.stackTraceLimit = limit

  return stack
}

/**
 * Capture call site stack from v8.
 */

function prepareObjectStackTrace (obj, stack) {
  return stack
}

/**
 * Return a wrapped function in a deprecation message.
 */

function wrapfunction (fn, message) {
  if (typeof fn !== 'function') {
    throw new TypeError('argument fn must be a function')
  }

  var args = createArgumentsString(fn.length)
  var deprecate = this // eslint-disable-line no-unused-vars
  var stack = getStack()
  var site = callSiteLocation(stack[1])

  site.name = fn.name

   // eslint-disable-next-line no-eval
  var deprecatedfn = eval('(function (' + args + ') {\n' +
    '"use strict"\n' +
    'log.call(deprecate, message, site)\n' +
    'return fn.apply(this, arguments)\n' +
    '})')

  return deprecatedfn
}

/**
 * Wrap property in a deprecation message.
 */

function wrapproperty (obj, prop, message) {
  if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) {
    throw new TypeError('argument obj must be object')
  }

  var descriptor = Object.getOwnPropertyDescriptor(obj, prop)

  if (!descriptor) {
    throw new TypeError('must call property on owner object')
  }

  if (!descriptor.configurable) {
    throw new TypeError('property must be configurable')
  }

  var deprecate = this
  var stack = getStack()
  var site = callSiteLocation(stack[1])

  // set site name
  site.name = prop

  // convert data descriptor
  if ('value' in descriptor) {
    descriptor = convertDataDescriptorToAccessor(obj, prop, message)
  }

  var get = descriptor.get
  var set = descriptor.set

  // wrap getter
  if (typeof get === 'function') {
    descriptor.get = function getter () {
      log.call(deprecate, message, site)
      return get.apply(this, arguments)
    }
  }

  // wrap setter
  if (typeof set === 'function') {
    descriptor.set = function setter () {
      log.call(deprecate, message, site)
      return set.apply(this, arguments)
    }
  }

  Object.defineProperty(obj, prop, descriptor)
}

/**
 * Create DeprecationError for deprecation
 */

function DeprecationError (namespace, message, stack) {
  var error = new Error()
  var stackString

  Object.defineProperty(error, 'constructor', {
    value: DeprecationError
  })

  Object.defineProperty(error, 'message', {
    configurable: true,
    enumerable: false,
    value: message,
    writable: true
  })

  Object.defineProperty(error, 'name', {
    enumerable: false,
    configurable: true,
    value: 'DeprecationError',
    writable: true
  })

  Object.defineProperty(error, 'namespace', {
    configurable: true,
    enumerable: false,
    value: namespace,
    writable: true
  })

  Object.defineProperty(error, 'stack', {
    configurable: true,
    enumerable: false,
    get: function () {
      if (stackString !== undefined) {
        return stackString
      }

      // prepare stack trace
      return (stackString = createStackString.call(this, stack))
    },
    set: function setter (val) {
      stackString = val
    }
  })

  return error
}
{
  "name": "depd",
  "description": "Deprecate all the things",
  "version": "1.1.2",
  "author": "Douglas Christopher Wilson <doug@somethingdoug.com>",
  "license": "MIT",
  "repository": "dougwilson/nodejs-depd",
  "browser": "lib/browser/index.js",
  "devDependencies": {
    "benchmark": "2.1.4",
    "beautify-benchmark": "0.2.4",
    "eslint": "3.19.0",
    "eslint-config-standard": "7.1.0",
    "eslint-plugin-markdown": "1.0.0-beta.7",
    "eslint-plugin-promise": "3.6.0",
    "eslint-plugin-standard": "3.0.1",
    "istanbul": "0.4.5",
    "mocha": "~1.21.5"
  },
  "files": [
    "lib/",
    "History.md",
    "LICENSE",
    "index.js",
    "Readme.md"
  ],
  "engines": {
    "node": ">= 0.6"
  }
}/*!
 * depd
 * Copyright(c) 2014 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module exports.
 */

module.exports = callSiteToString

/**
 * Format a CallSite file location to a string.
 */

function callSiteFileLocation (callSite) {
  var fileName
  var fileLocation = ''

  if (callSite.isNative()) {
    fileLocation = 'native'
  } else if (callSite.isEval()) {
    fileName = callSite.getScriptNameOrSourceURL()
    if (!fileName) {
      fileLocation = callSite.getEvalOrigin()
    }
  } else {
    fileName = callSite.getFileName()
  }

  if (fileName) {
    fileLocation += fileName

    var lineNumber = callSite.getLineNumber()
    if (lineNumber != null) {
      fileLocation += ':' + lineNumber

      var columnNumber = callSite.getColumnNumber()
      if (columnNumber) {
        fileLocation += ':' + columnNumber
      }
    }
  }

  return fileLocation || 'unknown source'
}

/**
 * Format a CallSite to a string.
 */

function callSiteToString (callSite) {
  var addSuffix = true
  var fileLocation = callSiteFileLocation(callSite)
  var functionName = callSite.getFunctionName()
  var isConstructor = callSite.isConstructor()
  var isMethodCall = !(callSite.isToplevel() || isConstructor)
  var line = ''

  if (isMethodCall) {
    var methodName = callSite.getMethodName()
    var typeName = getConstructorName(callSite)

    if (functionName) {
      if (typeName && functionName.indexOf(typeName) !== 0) {
        line += typeName + '.'
      }

      line += functionName

      if (methodName && functionName.lastIndexOf('.' + methodName) !== functionName.length - methodName.length - 1) {
        line += ' [as ' + methodName + ']'
      }
    } else {
      line += typeName + '.' + (methodName || '<anonymous>')
    }
  } else if (isConstructor) {
    line += 'new ' + (functionName || '<anonymous>')
  } else if (functionName) {
    line += functionName
  } else {
    addSuffix = false
    line += fileLocation
  }

  if (addSuffix) {
    line += ' (' + fileLocation + ')'
  }

  return line
}

/**
 * Get constructor name of reviver.
 */

function getConstructorName (obj) {
  var receiver = obj.receiver
  return (receiver.constructor && receiver.constructor.name) || null
}
/*!
 * depd
 * Copyright(c) 2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module exports.
 * @public
 */

module.exports = eventListenerCount

/**
 * Get the count of listeners on an event emitter of a specific type.
 */

function eventListenerCount (emitter, type) {
  return emitter.listeners(type).length
}
/*!
 * depd
 * Copyright(c) 2014-2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module dependencies.
 * @private
 */

var EventEmitter = require('events').EventEmitter

/**
 * Module exports.
 * @public
 */

lazyProperty(module.exports, 'callSiteToString', function callSiteToString () {
  var limit = Error.stackTraceLimit
  var obj = {}
  var prep = Error.prepareStackTrace

  function prepareObjectStackTrace (obj, stack) {
    return stack
  }

  Error.prepareStackTrace = prepareObjectStackTrace
  Error.stackTraceLimit = 2

  // capture the stack
  Error.captureStackTrace(obj)

  // slice the stack
  var stack = obj.stack.slice()

  Error.prepareStackTrace = prep
  Error.stackTraceLimit = limit

  return stack[0].toString ? toString : require('./callsite-tostring')
})

lazyProperty(module.exports, 'eventListenerCount', function eventListenerCount () {
  return EventEmitter.listenerCount || require('./event-listener-count')
})

/**
 * Define a lazy property.
 */

function lazyProperty (obj, prop, getter) {
  function get () {
    var val = getter()

    Object.defineProperty(obj, prop, {
      configurable: true,
      enumerable: true,
      value: val
    })

    return val
  }

  Object.defineProperty(obj, prop, {
    configurable: true,
    enumerable: true,
    get: get
  })
}

/**
 * Call toString() on the obj
 */

function toString (obj) {
  return obj.toString()
}
/*!
 * depd
 * Copyright(c) 2015 Douglas Christopher Wilson
 * MIT Licensed
 */

'use strict'

/**
 * Module exports.
 * @public
 */

module.exports = depd

/**
 * Create deprecate for namespace in caller.
 */

function depd (namespace) {
  if (!namespace) {
    throw new TypeError('argument namespace is required')
  }

  function deprecate (message) {
    // no-op in browser
  }

  deprecate._file = undefined
  deprecate._ignored = true
  deprecate._namespace = namespace
  deprecate._traced = false
  deprecate._warned = Object.create(null)

  deprecate.function = wrapfunction
  deprecate.property = wrapproperty

  return deprecate
}

/**
 * Return a wrapped function in a deprecation message.
 *
 * This is a no-op version of the wrapper, which does nothing but call
 * validation.
 */

function wrapfunction (fn, message) {
  if (typeof fn !== 'function') {
    throw new TypeError('argument fn must be a function')
  }

  return fn
}

/**
 * Wrap property in a deprecation message.
 *
 * This is a no-op version of the wrapper, which does nothing but call
 * validation.
 */

function wrapproperty (obj, prop, message) {
  if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) {
    throw new TypeError('argument obj must be object')
  }

  var descriptor = Object.getOwnPropertyDescriptor(obj, prop)

  if (!descriptor) {
    throw new TypeError('must call property on owner object')
  }

  if (!descriptor.configurable) {
    throw new TypeError('property must be configurable')
  }
}
Copyright (c) 2012 Felix Geisendörfer (felix@debuggable.com) and contributors

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

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

 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
# Form-Data [![NPM Module](https://img.shields.io/npm/v/form-data.svg)](https://www.npmjs.com/package/form-data) [![Join the chat at https://gitter.im/form-data/form-data](http://form-data.github.io/images/gitterbadge.svg)](https://gitter.im/form-data/form-data)

A library to create readable ```"multipart/form-data"``` streams. Can be used to submit forms and file uploads to other web applications.

The API of this library is inspired by the [XMLHttpRequest-2 FormData Interface][xhr2-fd].

[xhr2-fd]: http://dev.w3.org/2006/webapi/XMLHttpRequest-2/Overview.html#the-formdata-interface

[![Linux Build](https://img.shields.io/travis/form-data/form-data/v4.0.0.svg?label=linux:6.x-12.x)](https://travis-ci.org/form-data/form-data)
[![MacOS Build](https://img.shields.io/travis/form-data/form-data/v4.0.0.svg?label=macos:6.x-12.x)](https://travis-ci.org/form-data/form-data)
[![Windows Build](https://img.shields.io/travis/form-data/form-data/v4.0.0.svg?label=windows:6.x-12.x)](https://travis-ci.org/form-data/form-data)

[![Coverage Status](https://img.shields.io/coveralls/form-data/form-data/v4.0.0.svg?label=code+coverage)](https://coveralls.io/github/form-data/form-data?branch=master)
[![Dependency Status](https://img.shields.io/david/form-data/form-data.svg)](https://david-dm.org/form-data/form-data)

## Install

```
npm install --save form-data
```

## Usage

In this example we are constructing a form with 3 fields that contain a string,
a buffer and a file stream.

``` javascript
var FormData = require('form-data');
var fs = require('fs');

var form = new FormData();
form.append('my_field', 'my value');
form.append('my_buffer', new Buffer(10));
form.append('my_file', fs.createReadStream('/foo/bar.jpg'));
```

Also you can use http-response stream:

``` javascript
var FormData = require('form-data');
var http = require('http');

var form = new FormData();

http.request('http://nodejs.org/images/logo.png', function(response) {
  form.append('my_field', 'my value');
  form.append('my_buffer', new Buffer(10));
  form.append('my_logo', response);
});
```

Or @mikeal's [request](https://github.com/request/request) stream:

``` javascript
var FormData = require('form-data');
var request = require('request');

var form = new FormData();

form.append('my_field', 'my value');
form.append('my_buffer', new Buffer(10));
form.append('my_logo', request('http://nodejs.org/images/logo.png'));
```

In order to submit this form to a web application, call ```submit(url, [callback])``` method:

``` javascript
form.submit('http://example.org/', function(err, res) {
  // res – response object (http.IncomingMessage)  //
  res.resume();
});

```

For more advanced request manipulations ```submit()``` method returns ```http.ClientRequest``` object, or you can choose from one of the alternative submission methods.

### Custom options

You can provide custom options, such as `maxDataSize`:

``` javascript
var FormData = require('form-data');

var form = new FormData({ maxDataSize: 20971520 });
form.append('my_field', 'my value');
form.append('my_buffer', /* something big */);
```

List of available options could be found in [combined-stream](https://github.com/felixge/node-combined-stream/blob/master/lib/combined_stream.js#L7-L15)

### Alternative submission methods

You can use node's http client interface:

``` javascript
var http = require('http');

var request = http.request({
  method: 'post',
  host: 'example.org',
  path: '/upload',
  headers: form.getHeaders()
});

form.pipe(request);

request.on('response', function(res) {
  console.log(res.statusCode);
});
```

Or if you would prefer the `'Content-Length'` header to be set for you:

``` javascript
form.submit('example.org/upload', function(err, res) {
  console.log(res.statusCode);
});
```

To use custom headers and pre-known length in parts:

``` javascript
var CRLF = '\r\n';
var form = new FormData();

var options = {
  header: CRLF + '--' + form.getBoundary() + CRLF + 'X-Custom-Header: 123' + CRLF + CRLF,
  knownLength: 1
};

form.append('my_buffer', buffer, options);

form.submit('http://example.com/', function(err, res) {
  if (err) throw err;
  console.log('Done');
});
```

Form-Data can recognize and fetch all the required information from common types of streams (```fs.readStream```, ```http.response``` and ```mikeal's request```), for some other types of streams you'd need to provide "file"-related information manually:

``` javascript
someModule.stream(function(err, stdout, stderr) {
  if (err) throw err;

  var form = new FormData();

  form.append('file', stdout, {
    filename: 'unicycle.jpg', // ... or:
    filepath: 'photos/toys/unicycle.jpg',
    contentType: 'image/jpeg',
    knownLength: 19806
  });

  form.submit('http://example.com/', function(err, res) {
    if (err) throw err;
    console.log('Done');
  });
});
```

The `filepath` property overrides `filename` and may contain a relative path. This is typically used when uploading [multiple files from a directory](https://wicg.github.io/entries-api/#dom-htmlinputelement-webkitdirectory).

For edge cases, like POST request to URL with query string or to pass HTTP auth credentials, object can be passed to `form.submit()` as first parameter:

``` javascript
form.submit({
  host: 'example.com',
  path: '/probably.php?extra=params',
  auth: 'username:password'
}, function(err, res) {
  console.log(res.statusCode);
});
```

In case you need to also send custom HTTP headers with the POST request, you can use the `headers` key in first parameter of `form.submit()`:

``` javascript
form.submit({
  host: 'example.com',
  path: '/surelynot.php',
  headers: {'x-test-header': 'test-header-value'}
}, function(err, res) {
  console.log(res.statusCode);
});
```

### Methods

- [_Void_ append( **String** _field_, **Mixed** _value_ [, **Mixed** _options_] )](https://github.com/form-data/form-data#void-append-string-field-mixed-value--mixed-options-).
- [_Headers_ getHeaders( [**Headers** _userHeaders_] )](https://github.com/form-data/form-data#array-getheaders-array-userheaders-)
- [_String_ getBoundary()](https://github.com/form-data/form-data#string-getboundary)
- [_Void_ setBoundary()](https://github.com/form-data/form-data#void-setboundary)
- [_Buffer_ getBuffer()](https://github.com/form-data/form-data#buffer-getbuffer)
- [_Integer_ getLengthSync()](https://github.com/form-data/form-data#integer-getlengthsync)
- [_Integer_ getLength( **function** _callback_ )](https://github.com/form-data/form-data#integer-getlength-function-callback-)
- [_Boolean_ hasKnownLength()](https://github.com/form-data/form-data#boolean-hasknownlength)
- [_Request_ submit( _params_, **function** _callback_ )](https://github.com/form-data/form-data#request-submit-params-function-callback-)
- [_String_ toString()](https://github.com/form-data/form-data#string-tostring)

#### _Void_ append( **String** _field_, **Mixed** _value_ [, **Mixed** _options_] )
Append data to the form. You can submit about any format (string, integer, boolean, buffer, etc.). However, Arrays are not supported and need to be turned into strings by the user.
```javascript
var form = new FormData();
form.append( 'my_string', 'my value' );
form.append( 'my_integer', 1 );
form.append( 'my_boolean', true );
form.append( 'my_buffer', new Buffer(10) );
form.append( 'my_array_as_json', JSON.stringify( ['bird','cute'] ) )
```

You may provide a string for options, or an object.
```javascript
// Set filename by providing a string for options
form.append( 'my_file', fs.createReadStream('/foo/bar.jpg'), 'bar.jpg' );

// provide an object.
form.append( 'my_file', fs.createReadStream('/foo/bar.jpg'), {filename: 'bar.jpg', contentType: 'image/jpeg', knownLength: 19806} );
```

#### _Headers_ getHeaders( [**Headers** _userHeaders_] )
This method adds the correct `content-type` header to the provided array of `userHeaders`.

#### _String_ getBoundary()
Return the boundary of the formData. By default, the boundary consists of 26 `-` followed by 24 numbers
for example:
```javascript
--------------------------515890814546601021194782
```

#### _Void_ setBoundary(String _boundary_)
Set the boundary string, overriding the default behavior described above.

_Note: The boundary must be unique and may not appear in the data._

#### _Buffer_ getBuffer()
Return the full formdata request package, as a Buffer. You can insert this Buffer in e.g. Axios to send multipart data.
```javascript
var form = new FormData();
form.append( 'my_buffer', Buffer.from([0x4a,0x42,0x20,0x52,0x6f,0x63,0x6b,0x73]) );
form.append( 'my_file', fs.readFileSync('/foo/bar.jpg') );

axios.post( 'https://example.com/path/to/api',
            form.getBuffer(),
            form.getHeaders()
          )
```
**Note:** Because the output is of type Buffer, you can only append types that are accepted by Buffer: *string, Buffer, ArrayBuffer, Array, or Array-like Object*. A ReadStream for example will result in an error.

#### _Integer_ getLengthSync()
Same as `getLength` but synchronous.

_Note: getLengthSync __doesn't__ calculate streams length._

#### _Integer_ getLength( **function** _callback_ )
Returns the `Content-Length` async. The callback is used to handle errors and continue once the length has been calculated
```javascript
this.getLength(function(err, length) {
  if (err) {
    this._error(err);
    return;
  }

  // add content length
  request.setHeader('Content-Length', length);

  ...
}.bind(this));
```

#### _Boolean_ hasKnownLength()
Checks if the length of added values is known.

#### _Request_ submit( _params_, **function** _callback_ )
Submit the form to a web application.
```javascript
var form = new FormData();
form.append( 'my_string', 'Hello World' );

form.submit( 'http://example.com/', function(err, res) {
  // res – response object (http.IncomingMessage)  //
  res.resume();
} );
```

#### _String_ toString()
Returns the form data as a string. Don't use this if you are sending files or buffers, use `getBuffer()` instead.

### Integration with other libraries

#### Request

Form submission using  [request](https://github.com/request/request):

```javascript
var formData = {
  my_field: 'my_value',
  my_file: fs.createReadStream(__dirname + '/unicycle.jpg'),
};

request.post({url:'http://service.com/upload', formData: formData}, function(err, httpResponse, body) {
  if (err) {
    return console.error('upload failed:', err);
  }
  console.log('Upload successful!  Server responded with:', body);
});
```

For more details see [request readme](https://github.com/request/request#multipartform-data-multipart-form-uploads).

#### node-fetch

You can also submit a form using [node-fetch](https://github.com/bitinn/node-fetch):

```javascript
var form = new FormData();

form.append('a', 1);

fetch('http://example.com', { method: 'POST', body: form })
    .then(function(res) {
        return res.json();
    }).then(function(json) {
        console.log(json);
    });
```

#### axios

In Node.js you can post a file using [axios](https://github.com/axios/axios):
```javascript
const form = new FormData();
const stream = fs.createReadStream(PATH_TO_FILE);

form.append('image', stream);

// In Node.js environment you need to set boundary in the header field 'Content-Type' by calling method `getHeaders`
const formHeaders = form.getHeaders();

axios.post('http://example.com', form, {
  headers: {
    ...formHeaders,
  },
})
.then(response => response)
.catch(error => error)
```

## Notes

- ```getLengthSync()``` method DOESN'T calculate length for streams, use ```knownLength``` options as workaround.
- ```getLength(cb)``` will send an error as first parameter of callback if stream length cannot be calculated (e.g. send in custom streams w/o using ```knownLength```).
- ```submit``` will not add `content-length` if form length is unknown or not calculable.
- Starting version `2.x` FormData has dropped support for `node@0.10.x`.
- Starting version `3.x` FormData has dropped support for `node@4.x`.

## License

Form-Data is released under the [MIT](License) license.
{
  "author": "Felix Geisendörfer <felix@debuggable.com> (http://debuggable.com/)",
  "name": "form-data",
  "description": "A library to create readable \"multipart/form-data\" streams. Can be used to submit forms and file uploads to other web applications.",
  "version": "4.0.0",
  "repository": {
    "type": "git",
    "url": "git://github.com/form-data/form-data.git"
  },
  "main": "./lib/form_data",
  "browser": "./lib/browser",
  "typings": "./index.d.ts",
  "pre-commit": [
    "lint",
    "ci-test",
    "check"
  ],
  "engines": {
    "node": ">= 6"
  },
  "dependencies": {
    "asynckit": "^0.4.0",
    "combined-stream": "^1.0.8",
    "mime-types": "^2.1.12"
  },
  "devDependencies": {
    "@types/node": "^12.0.10",
    "browserify": "^13.1.1",
    "browserify-istanbul": "^2.0.0",
    "coveralls": "^3.0.4",
    "cross-spawn": "^6.0.5",
    "eslint": "^6.0.1",
    "fake": "^0.2.2",
    "far": "^0.0.7",
    "formidable": "^1.0.17",
    "in-publish": "^2.0.0",
    "is-node-modern": "^1.0.0",
    "istanbul": "^0.4.5",
    "obake": "^0.1.2",
    "puppeteer": "^1.19.0",
    "pkgfiles": "^2.3.0",
    "pre-commit": "^1.1.3",
    "request": "^2.88.0",
    "rimraf": "^2.7.1",
    "tape": "^4.6.2",
    "typescript": "^3.5.2"
  },
  "license": "MIT"
}/* eslint-env browser */
module.exports = typeof self == 'object' ? self.FormData : window.FormData;
var CombinedStream = require('combined-stream');
var util = require('util');
var path = require('path');
var http = require('http');
var https = require('https');
var parseUrl = require('url').parse;
var fs = require('fs');
var Stream = require('stream').Stream;
var mime = require('mime-types');
var asynckit = require('asynckit');
var populate = require('./populate.js');

// Public API
module.exports = FormData;

// make it a Stream
util.inherits(FormData, CombinedStream);

/**
 * Create readable "multipart/form-data" streams.
 * Can be used to submit forms
 * and file uploads to other web applications.
 *
 * @constructor
 * @param {Object} options - Properties to be added/overriden for FormData and CombinedStream
 */
function FormData(options) {
  if (!(this instanceof FormData)) {
    return new FormData(options);
  }

  this._overheadLength = 0;
  this._valueLength = 0;
  this._valuesToMeasure = [];

  CombinedStream.call(this);

  options = options || {};
  for (var option in options) {
    this[option] = options[option];
  }
}

FormData.LINE_BREAK = '\r\n';
FormData.DEFAULT_CONTENT_TYPE = 'application/octet-stream';

FormData.prototype.append = function(field, value, options) {

  options = options || {};

  // allow filename as single option
  if (typeof options == 'string') {
    options = {filename: options};
  }

  var append = CombinedStream.prototype.append.bind(this);

  // all that streamy business can't handle numbers
  if (typeof value == 'number') {
    value = '' + value;
  }

  // https://github.com/felixge/node-form-data/issues/38
  if (util.isArray(value)) {
    // Please convert your array into string
    // the way web server expects it
    this._error(new Error('Arrays are not supported.'));
    return;
  }

  var header = this._multiPartHeader(field, value, options);
  var footer = this._multiPartFooter();

  append(header);
  append(value);
  append(footer);

  // pass along options.knownLength
  this._trackLength(header, value, options);
};

FormData.prototype._trackLength = function(header, value, options) {
  var valueLength = 0;

  // used w/ getLengthSync(), when length is known.
  // e.g. for streaming directly from a remote server,
  // w/ a known file a size, and not wanting to wait for
  // incoming file to finish to get its size.
  if (options.knownLength != null) {
    valueLength += +options.knownLength;
  } else if (Buffer.isBuffer(value)) {
    valueLength = value.length;
  } else if (typeof value === 'string') {
    valueLength = Buffer.byteLength(value);
  }

  this._valueLength += valueLength;

  // @check why add CRLF? does this account for custom/multiple CRLFs?
  this._overheadLength +=
    Buffer.byteLength(header) +
    FormData.LINE_BREAK.length;

  // empty or either doesn't have path or not an http response or not a stream
  if (!value || ( !value.path && !(value.readable && value.hasOwnProperty('httpVersion')) && !(value instanceof Stream))) {
    return;
  }

  // no need to bother with the length
  if (!options.knownLength) {
    this._valuesToMeasure.push(value);
  }
};

FormData.prototype._lengthRetriever = function(value, callback) {

  if (value.hasOwnProperty('fd')) {

    // take read range into a account
    // `end` = Infinity –> read file till the end
    //
    // TODO: Looks like there is bug in Node fs.createReadStream
    // it doesn't respect `end` options without `start` options
    // Fix it when node fixes it.
    // https://github.com/joyent/node/issues/7819
    if (value.end != undefined && value.end != Infinity && value.start != undefined) {

      // when end specified
      // no need to calculate range
      // inclusive, starts with 0
      callback(null, value.end + 1 - (value.start ? value.start : 0));

    // not that fast snoopy
    } else {
      // still need to fetch file size from fs
      fs.stat(value.path, function(err, stat) {

        var fileSize;

        if (err) {
          callback(err);
          return;
        }

        // update final size based on the range options
        fileSize = stat.size - (value.start ? value.start : 0);
        callback(null, fileSize);
      });
    }

  // or http response
  } else if (value.hasOwnProperty('httpVersion')) {
    callback(null, +value.headers['content-length']);

  // or request stream http://github.com/mikeal/request
  } else if (value.hasOwnProperty('httpModule')) {
    // wait till response come back
    value.on('response', function(response) {
      value.pause();
      callback(null, +response.headers['content-length']);
    });
    value.resume();

  // something else
  } else {
    callback('Unknown stream');
  }
};

FormData.prototype._multiPartHeader = function(field, value, options) {
  // custom header specified (as string)?
  // it becomes responsible for boundary
  // (e.g. to handle extra CRLFs on .NET servers)
  if (typeof options.header == 'string') {
    return options.header;
  }

  var contentDisposition = this._getContentDisposition(value, options);
  var contentType = this._getContentType(value, options);

  var contents = '';
  var headers  = {
    // add custom disposition as third element or keep it two elements if not
    'Content-Disposition': ['form-data', 'name="' + field + '"'].concat(contentDisposition || []),
    // if no content type. allow it to be empty array
    'Content-Type': [].concat(contentType || [])
  };

  // allow custom headers.
  if (typeof options.header == 'object') {
    populate(headers, options.header);
  }

  var header;
  for (var prop in headers) {
    if (!headers.hasOwnProperty(prop)) continue;
    header = headers[prop];

    // skip nullish headers.
    if (header == null) {
      continue;
    }

    // convert all headers to arrays.
    if (!Array.isArray(header)) {
      header = [header];
    }

    // add non-empty headers.
    if (header.length) {
      contents += prop + ': ' + header.join('; ') + FormData.LINE_BREAK;
    }
  }

  return '--' + this.getBoundary() + FormData.LINE_BREAK + contents + FormData.LINE_BREAK;
};

FormData.prototype._getContentDisposition = function(value, options) {

  var filename
    , contentDisposition
    ;

  if (typeof options.filepath === 'string') {
    // custom filepath for relative paths
    filename = path.normalize(options.filepath).replace(/\\/g, '/');
  } else if (options.filename || value.name || value.path) {
    // custom filename take precedence
    // formidable and the browser add a name property
    // fs- and request- streams have path property
    filename = path.basename(options.filename || value.name || value.path);
  } else if (value.readable && value.hasOwnProperty('httpVersion')) {
    // or try http response
    filename = path.basename(value.client._httpMessage.path || '');
  }

  if (filename) {
    contentDisposition = 'filename="' + filename + '"';
  }

  return contentDisposition;
};

FormData.prototype._getContentType = function(value, options) {

  // use custom content-type above all
  var contentType = options.contentType;

  // or try `name` from formidable, browser
  if (!contentType && value.name) {
    contentType = mime.lookup(value.name);
  }

  // or try `path` from fs-, request- streams
  if (!contentType && value.path) {
    contentType = mime.lookup(value.path);
  }

  // or if it's http-reponse
  if (!contentType && value.readable && value.hasOwnProperty('httpVersion')) {
    contentType = value.headers['content-type'];
  }

  // or guess it from the filepath or filename
  if (!contentType && (options.filepath || options.filename)) {
    contentType = mime.lookup(options.filepath || options.filename);
  }

  // fallback to the default content type if `value` is not simple value
  if (!contentType && typeof value == 'object') {
    contentType = FormData.DEFAULT_CONTENT_TYPE;
  }

  return contentType;
};

FormData.prototype._multiPartFooter = function() {
  return function(next) {
    var footer = FormData.LINE_BREAK;

    var lastPart = (this._streams.length === 0);
    if (lastPart) {
      footer += this._lastBoundary();
    }

    next(footer);
  }.bind(this);
};

FormData.prototype._lastBoundary = function() {
  return '--' + this.getBoundary() + '--' + FormData.LINE_BREAK;
};

FormData.prototype.getHeaders = function(userHeaders) {
  var header;
  var formHeaders = {
    'content-type': 'multipart/form-data; boundary=' + this.getBoundary()
  };

  for (header in userHeaders) {
    if (userHeaders.hasOwnProperty(header)) {
      formHeaders[header.toLowerCase()] = userHeaders[header];
    }
  }

  return formHeaders;
};

FormData.prototype.setBoundary = function(boundary) {
  this._boundary = boundary;
};

FormData.prototype.getBoundary = function() {
  if (!this._boundary) {
    this._generateBoundary();
  }

  return this._boundary;
};

FormData.prototype.getBuffer = function() {
  var dataBuffer = new Buffer.alloc( 0 );
  var boundary = this.getBoundary();

  // Create the form content. Add Line breaks to the end of data.
  for (var i = 0, len = this._streams.length; i < len; i++) {
    if (typeof this._streams[i] !== 'function') {

      // Add content to the buffer.
      if(Buffer.isBuffer(this._streams[i])) {
        dataBuffer = Buffer.concat( [dataBuffer, this._streams[i]]);
      }else {
        dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(this._streams[i])]);
      }

      // Add break after content.
      if (typeof this._streams[i] !== 'string' || this._streams[i].substring( 2, boundary.length + 2 ) !== boundary) {
        dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(FormData.LINE_BREAK)] );
      }
    }
  }

  // Add the footer and return the Buffer object.
  return Buffer.concat( [dataBuffer, Buffer.from(this._lastBoundary())] );
};

FormData.prototype._generateBoundary = function() {
  // This generates a 50 character boundary similar to those used by Firefox.
  // They are optimized for boyer-moore parsing.
  var boundary = '--------------------------';
  for (var i = 0; i < 24; i++) {
    boundary += Math.floor(Math.random() * 10).toString(16);
  }

  this._boundary = boundary;
};

// Note: getLengthSync DOESN'T calculate streams length
// As workaround one can calculate file size manually
// and add it as knownLength option
FormData.prototype.getLengthSync = function() {
  var knownLength = this._overheadLength + this._valueLength;

  // Don't get confused, there are 3 "internal" streams for each keyval pair
  // so it basically checks if there is any value added to the form
  if (this._streams.length) {
    knownLength += this._lastBoundary().length;
  }

  // https://github.com/form-data/form-data/issues/40
  if (!this.hasKnownLength()) {
    // Some async length retrievers are present
    // therefore synchronous length calculation is false.
    // Please use getLength(callback) to get proper length
    this._error(new Error('Cannot calculate proper length in synchronous way.'));
  }

  return knownLength;
};

// Public API to check if length of added values is known
// https://github.com/form-data/form-data/issues/196
// https://github.com/form-data/form-data/issues/262
FormData.prototype.hasKnownLength = function() {
  var hasKnownLength = true;

  if (this._valuesToMeasure.length) {
    hasKnownLength = false;
  }

  return hasKnownLength;
};

FormData.prototype.getLength = function(cb) {
  var knownLength = this._overheadLength + this._valueLength;

  if (this._streams.length) {
    knownLength += this._lastBoundary().length;
  }

  if (!this._valuesToMeasure.length) {
    process.nextTick(cb.bind(this, null, knownLength));
    return;
  }

  asynckit.parallel(this._valuesToMeasure, this._lengthRetriever, function(err, values) {
    if (err) {
      cb(err);
      return;
    }

    values.forEach(function(length) {
      knownLength += length;
    });

    cb(null, knownLength);
  });
};

FormData.prototype.submit = function(params, cb) {
  var request
    , options
    , defaults = {method: 'post'}
    ;

  // parse provided url if it's string
  // or treat it as options object
  if (typeof params == 'string') {

    params = parseUrl(params);
    options = populate({
      port: params.port,
      path: params.pathname,
      host: params.hostname,
      protocol: params.protocol
    }, defaults);

  // use custom params
  } else {

    options = populate(params, defaults);
    // if no port provided use default one
    if (!options.port) {
      options.port = options.protocol == 'https:' ? 443 : 80;
    }
  }

  // put that good code in getHeaders to some use
  options.headers = this.getHeaders(params.headers);

  // https if specified, fallback to http in any other case
  if (options.protocol == 'https:') {
    request = https.request(options);
  } else {
    request = http.request(options);
  }

  // get content length and fire away
  this.getLength(function(err, length) {
    if (err && err !== 'Unknown stream') {
      this._error(err);
      return;
    }

    // add content length
    if (length) {
      request.setHeader('Content-Length', length);
    }

    this.pipe(request);
    if (cb) {
      var onResponse;

      var callback = function (error, responce) {
        request.removeListener('error', callback);
        request.removeListener('response', onResponse);

        return cb.call(this, error, responce);
      };

      onResponse = callback.bind(this, null);

      request.on('error', callback);
      request.on('response', onResponse);
    }
  }.bind(this));

  return request;
};

FormData.prototype._error = function(err) {
  if (!this.error) {
    this.error = err;
    this.pause();
    this.emit('error', err);
  }
};

FormData.prototype.toString = function () {
  return '[object FormData]';
};
// populates missing values
module.exports = function(dst, src) {

  Object.keys(src).forEach(function(prop)
  {
    dst[prop] = dst[prop] || src[prop];
  });

  return dst;
};
3.1.2 / 2022-01-27
==================

  * Fix return value for un-parsable strings

3.1.1 / 2021-11-15
==================

  * Fix "thousandsSeparator" incorrecting formatting fractional part

3.1.0 / 2019-01-22
==================

  * Add petabyte (`pb`) support

3.0.0 / 2017-08-31
==================

  * Change "kB" to "KB" in format output
  * Remove support for Node.js 0.6
  * Remove support for ComponentJS

2.5.0 / 2017-03-24
==================

  * Add option "unit"

2.4.0 / 2016-06-01
==================

  * Add option "unitSeparator"

2.3.0 / 2016-02-15
==================

  * Drop partial bytes on all parsed units
  * Fix non-finite numbers to `.format` to return `null`
  * Fix parsing byte string that looks like hex
  * perf: hoist regular expressions

2.2.0 / 2015-11-13
==================

  * add option "decimalPlaces"
  * add option "fixedDecimals"

2.1.0 / 2015-05-21
==================

  * add `.format` export
  * add `.parse` export

2.0.2 / 2015-05-20
==================

  * remove map recreation
  * remove unnecessary object construction

2.0.1 / 2015-05-07
==================

  * fix browserify require
  * remove node.extend dependency

2.0.0 / 2015-04-12
==================

  * add option "case"
  * add option "thousandsSeparator"
  * return "null" on invalid parse input
  * support proper round-trip: bytes(bytes(num)) === num
  * units no longer case sensitive when parsing

1.0.0 / 2014-05-05
==================

 * add negative support. fixes #6

0.3.0 / 2014-03-19
==================

 * added terabyte support

0.2.1 / 2013-04-01
==================

  * add .component

0.2.0 / 2012-10-28
==================

  * bytes(200).should.eql('200b')

0.1.0 / 2012-07-04
==================

  * add bytes to string conversion [yields]
(The MIT License)

Copyright (c) 2012-2014 TJ Holowaychuk <tj@vision-media.ca>
Copyright (c) 2015 Jed Watson <jed.watson@me.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.
/*!
 * bytes
 * Copyright(c) 2012-2014 TJ Holowaychuk
 * Copyright(c) 2015 Jed Watson
 * MIT Licensed
 */

'use strict';

/**
 * Module exports.
 * @public
 */

module.exports = bytes;
module.exports.format = format;
module.exports.parse = parse;

/**
 * Module variables.
 * @private
 */

var formatThousandsRegExp = /\B(?=(\d{3})+(?!\d))/g;

var formatDecimalsRegExp = /(?:\.0*|(\.[^0]+)0+)$/;

var map = {
  b:  1,
  kb: 1 << 10,
  mb: 1 << 20,
  gb: 1 << 30,
  tb: Math.pow(1024, 4),
  pb: Math.pow(1024, 5),
};

var parseRegExp = /^((-|\+)?(\d+(?:\.\d+)?)) *(kb|mb|gb|tb|pb)$/i;

/**
 * Convert the given value in bytes into a string or parse to string to an integer in bytes.
 *
 * @param {string|number} value
 * @param {{
 *  case: [string],
 *  decimalPlaces: [number]
 *  fixedDecimals: [boolean]
 *  thousandsSeparator: [string]
 *  unitSeparator: [string]
 *  }} [options] bytes options.
 *
 * @returns {string|number|null}
 */

function bytes(value, options) {
  if (typeof value === 'string') {
    return parse(value);
  }

  if (typeof value === 'number') {
    return format(value, options);
  }

  return null;
}

/**
 * Format the given value in bytes into a string.
 *
 * If the value is negative, it is kept as such. If it is a float,
 * it is rounded.
 *
 * @param {number} value
 * @param {object} [options]
 * @param {number} [options.decimalPlaces=2]
 * @param {number} [options.fixedDecimals=false]
 * @param {string} [options.thousandsSeparator=]
 * @param {string} [options.unit=]
 * @param {string} [options.unitSeparator=]
 *
 * @returns {string|null}
 * @public
 */

function format(value, options) {
  if (!Number.isFinite(value)) {
    return null;
  }

  var mag = Math.abs(value);
  var thousandsSeparator = (options && options.thousandsSeparator) || '';
  var unitSeparator = (options && options.unitSeparator) || '';
  var decimalPlaces = (options && options.decimalPlaces !== undefined) ? options.decimalPlaces : 2;
  var fixedDecimals = Boolean(options && options.fixedDecimals);
  var unit = (options && options.unit) || '';

  if (!unit || !map[unit.toLowerCase()]) {
    if (mag >= map.pb) {
      unit = 'PB';
    } else if (mag >= map.tb) {
      unit = 'TB';
    } else if (mag >= map.gb) {
      unit = 'GB';
    } else if (mag >= map.mb) {
      unit = 'MB';
    } else if (mag >= map.kb) {
      unit = 'KB';
    } else {
      unit = 'B';
    }
  }

  var val = value / map[unit.toLowerCase()];
  var str = val.toFixed(decimalPlaces);

  if (!fixedDecimals) {
    str = str.replace(formatDecimalsRegExp, '$1');
  }

  if (thousandsSeparator) {
    str = str.split('.').map(function (s, i) {
      return i === 0
        ? s.replace(formatThousandsRegExp, thousandsSeparator)
        : s
    }).join('.');
  }

  return str + unitSeparator + unit;
}

/**
 * Parse the string value into an integer in bytes.
 *
 * If no unit is given, it is assumed the value is in bytes.
 *
 * @param {number|string} val
 *
 * @returns {number|null}
 * @public
 */

function parse(val) {
  if (typeof val === 'number' && !isNaN(val)) {
    return val;
  }

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

  // Test if the string passed is valid
  var results = parseRegExp.exec(val);
  var floatValue;
  var unit = 'b';

  if (!results) {
    // Nothing could be extracted from the given string
    floatValue = parseInt(val, 10);
    unit = 'b'
  } else {
    // Retrieve the value and the unit
    floatValue = parseFloat(results[1]);
    unit = results[4].toLowerCase();
  }

  if (isNaN(floatValue)) {
    return null;
  }

  return Math.floor(map[unit] * floatValue);
}
{
  "name": "bytes",
  "description": "Utility to parse a string bytes to bytes and vice-versa",
  "version": "3.1.2",
  "author": "TJ Holowaychuk <tj@vision-media.ca> (http://tjholowaychuk.com)",
  "license": "MIT",
  "repository": "visionmedia/bytes.js",
  "devDependencies": {
    "eslint": "7.32.0",
    "eslint-plugin-markdown": "2.2.1",
    "mocha": "9.2.0",
    "nyc": "15.1.0"
  },
  "files": [
    "History.md",
    "LICENSE",
    "Readme.md",
    "index.js"
  ],
  "engines": {
    "node": ">= 0.8"
  }
}(The MIT License)

Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca>

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.

# get Makefile directory name: http://stackoverflow.com/a/5982798/376773
THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)

# BIN directory
BIN := $(THIS_DIR)/node_modules/.bin

# Path
PATH := node_modules/.bin:$(PATH)
SHELL := /bin/bash

# applications
NODE ?= $(shell which node)
YARN ?= $(shell which yarn)
PKG ?= $(if $(YARN),$(YARN),$(NODE) $(shell which npm))
BROWSERIFY ?= $(NODE) $(BIN)/browserify

.FORCE:

install: node_modules

node_modules: package.json
	@NODE_ENV= $(PKG) install
	@touch node_modules

lint: .FORCE
	eslint browser.js debug.js index.js node.js

test-node: .FORCE
	istanbul cover node_modules/mocha/bin/_mocha -- test/**.js

test-browser: .FORCE
	mkdir -p dist

	@$(BROWSERIFY) \
		--standalone debug \
		. > dist/debug.js

	karma start --single-run
	rimraf dist

test: .FORCE
	concurrently \
		"make test-node" \
		"make test-browser"

coveralls:
	cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js

.PHONY: all install clean distclean
{
  "name": "debug",
  "repo": "visionmedia/debug",
  "description": "small debugging utility",
  "version": "2.6.9",
  "keywords": [
    "debug",
    "log",
    "debugger"
  ],
  "main": "src/browser.js",
  "scripts": [
    "src/browser.js",
    "src/debug.js"
  ],
  "dependencies": {
    "rauchg/ms.js": "0.7.1"
  }
}
module.exports = require('./src/node');
{
  "name": "debug",
  "version": "2.6.9",
  "repository": {
    "type": "git",
    "url": "git://github.com/visionmedia/debug.git"
  },
  "description": "small debugging utility",
  "author": "TJ Holowaychuk <tj@vision-media.ca>",
  "license": "MIT",
  "dependencies": {
    "ms": "2.0.0"
  },
  "devDependencies": {
    "browserify": "9.0.3",
    "chai": "^3.5.0",
    "concurrently": "^3.1.0",
    "coveralls": "^2.11.15",
    "eslint": "^3.12.1",
    "istanbul": "^0.4.5",
    "karma": "^1.3.0",
    "karma-chai": "^0.1.0",
    "karma-mocha": "^1.3.0",
    "karma-phantomjs-launcher": "^1.0.2",
    "karma-sinon": "^1.0.5",
    "mocha": "^3.2.0",
    "mocha-lcov-reporter": "^1.2.0",
    "rimraf": "^2.5.4",
    "sinon": "^1.17.6",
    "sinon-chai": "^2.8.0"
  },
  "main": "./src/index.js",
  "browser": "./src/browser.js",
  "component": {
    "scripts": {
      "debug/index.js": "browser.js",
      "debug/debug.js": "debug.js"
    }
  }
}/**
 * This is the web browser implementation of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = require('./debug');
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;
exports.storage = 'undefined' != typeof chrome
               && 'undefined' != typeof chrome.storage
                  ? chrome.storage.local
                  : localstorage();

/**
 * Colors.
 */

exports.colors = [
  'lightseagreen',
  'forestgreen',
  'goldenrod',
  'dodgerblue',
  'darkorchid',
  'crimson'
];

/**
 * Currently only WebKit-based Web Inspectors, Firefox >= v31,
 * and the Firebug extension (any Firefox version) are known
 * to support "%c" CSS customizations.
 *
 * TODO: add a `localStorage` variable to explicitly enable/disable colors
 */

function useColors() {
  // NB: In an Electron preload script, document will be defined but not fully
  // initialized. Since we know we're in Chrome, we'll just detect this case
  // explicitly
  if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {
    return true;
  }

  // is webkit? http://stackoverflow.com/a/16459606/376773
  // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
  return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
    // is firebug? http://stackoverflow.com/a/398120/376773
    (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
    // is firefox >= v31?
    // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
    // double check webkit in userAgent just in case we are in a worker
    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
}

/**
 * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
 */

exports.formatters.j = function(v) {
  try {
    return JSON.stringify(v);
  } catch (err) {
    return '[UnexpectedJSONParseError]: ' + err.message;
  }
};


/**
 * Colorize log arguments if enabled.
 *
 * @api public
 */

function formatArgs(args) {
  var useColors = this.useColors;

  args[0] = (useColors ? '%c' : '')
    + this.namespace
    + (useColors ? ' %c' : ' ')
    + args[0]
    + (useColors ? '%c ' : ' ')
    + '+' + exports.humanize(this.diff);

  if (!useColors) return;

  var c = 'color: ' + this.color;
  args.splice(1, 0, c, 'color: inherit')

  // the final "%c" is somewhat tricky, because there could be other
  // arguments passed either before or after the %c, so we need to
  // figure out the correct index to insert the CSS into
  var index = 0;
  var lastC = 0;
  args[0].replace(/%[a-zA-Z%]/g, function(match) {
    if ('%%' === match) return;
    index++;
    if ('%c' === match) {
      // we only are interested in the *last* %c
      // (the user may have provided their own)
      lastC = index;
    }
  });

  args.splice(lastC, 0, c);
}

/**
 * Invokes `console.log()` when available.
 * No-op when `console.log` is not a "function".
 *
 * @api public
 */

function log() {
  // this hackery is required for IE8/9, where
  // the `console.log` function doesn't have 'apply'
  return 'object' === typeof console
    && console.log
    && Function.prototype.apply.call(console.log, console, arguments);
}

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */

function save(namespaces) {
  try {
    if (null == namespaces) {
      exports.storage.removeItem('debug');
    } else {
      exports.storage.debug = namespaces;
    }
  } catch(e) {}
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */

function load() {
  var r;
  try {
    r = exports.storage.debug;
  } catch(e) {}

  // If debug isn't set in LS, and we're in Electron, try to load $DEBUG
  if (!r && typeof process !== 'undefined' && 'env' in process) {
    r = process.env.DEBUG;
  }

  return r;
}

/**
 * Enable namespaces listed in `localStorage.debug` initially.
 */

exports.enable(load());

/**
 * Localstorage attempts to return the localstorage.
 *
 * This is necessary because safari throws
 * when a user disables cookies/localstorage
 * and you attempt to access it.
 *
 * @return {LocalStorage}
 * @api private
 */

function localstorage() {
  try {
    return window.localStorage;
  } catch (e) {}
}

/**
 * This is the common logic for both the Node.js and web browser
 * implementations of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = createDebug.debug = createDebug['default'] = createDebug;
exports.coerce = coerce;
exports.disable = disable;
exports.enable = enable;
exports.enabled = enabled;
exports.humanize = require('ms');

/**
 * The currently active debug mode names, and names to skip.
 */

exports.names = [];
exports.skips = [];

/**
 * Map of special "%n" handling functions, for the debug "format" argument.
 *
 * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
 */

exports.formatters = {};

/**
 * Previous log timestamp.
 */

var prevTime;

/**
 * Select a color.
 * @param {String} namespace
 * @return {Number}
 * @api private
 */

function selectColor(namespace) {
  var hash = 0, i;

  for (i in namespace) {
    hash  = ((hash << 5) - hash) + namespace.charCodeAt(i);
    hash |= 0; // Convert to 32bit integer
  }

  return exports.colors[Math.abs(hash) % exports.colors.length];
}

/**
 * Create a debugger with the given `namespace`.
 *
 * @param {String} namespace
 * @return {Function}
 * @api public
 */

function createDebug(namespace) {

  function debug() {
    // disabled?
    if (!debug.enabled) return;

    var self = debug;

    // set `diff` timestamp
    var curr = +new Date();
    var ms = curr - (prevTime || curr);
    self.diff = ms;
    self.prev = prevTime;
    self.curr = curr;
    prevTime = curr;

    // turn the `arguments` into a proper Array
    var args = new Array(arguments.length);
    for (var i = 0; i < args.length; i++) {
      args[i] = arguments[i];
    }

    args[0] = exports.coerce(args[0]);

    if ('string' !== typeof args[0]) {
      // anything else let's inspect with %O
      args.unshift('%O');
    }

    // apply any `formatters` transformations
    var index = 0;
    args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {
      // if we encounter an escaped % then don't increase the array index
      if (match === '%%') return match;
      index++;
      var formatter = exports.formatters[format];
      if ('function' === typeof formatter) {
        var val = args[index];
        match = formatter.call(self, val);

        // now we need to remove `args[index]` since it's inlined in the `format`
        args.splice(index, 1);
        index--;
      }
      return match;
    });

    // apply env-specific formatting (colors, etc.)
    exports.formatArgs.call(self, args);

    var logFn = debug.log || exports.log || console.log.bind(console);
    logFn.apply(self, args);
  }

  debug.namespace = namespace;
  debug.enabled = exports.enabled(namespace);
  debug.useColors = exports.useColors();
  debug.color = selectColor(namespace);

  // env-specific initialization logic for debug instances
  if ('function' === typeof exports.init) {
    exports.init(debug);
  }

  return debug;
}

/**
 * Enables a debug mode by namespaces. This can include modes
 * separated by a colon and wildcards.
 *
 * @param {String} namespaces
 * @api public
 */

function enable(namespaces) {
  exports.save(namespaces);

  exports.names = [];
  exports.skips = [];

  var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
  var len = split.length;

  for (var i = 0; i < len; i++) {
    if (!split[i]) continue; // ignore empty strings
    namespaces = split[i].replace(/\*/g, '.*?');
    if (namespaces[0] === '-') {
      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
    } else {
      exports.names.push(new RegExp('^' + namespaces + '$'));
    }
  }
}

/**
 * Disable debug output.
 *
 * @api public
 */

function disable() {
  exports.enable('');
}

/**
 * Returns true if the given mode name is enabled, false otherwise.
 *
 * @param {String} name
 * @return {Boolean}
 * @api public
 */

function enabled(name) {
  var i, len;
  for (i = 0, len = exports.skips.length; i < len; i++) {
    if (exports.skips[i].test(name)) {
      return false;
    }
  }
  for (i = 0, len = exports.names.length; i < len; i++) {
    if (exports.names[i].test(name)) {
      return true;
    }
  }
  return false;
}

/**
 * Coerce `val`.
 *
 * @param {Mixed} val
 * @return {Mixed}
 * @api private
 */

function coerce(val) {
  if (val instanceof Error) return val.stack || val.message;
  return val;
}
/**
 * Detect Electron renderer process, which is node, but we should
 * treat as a browser.
 */

if (typeof process !== 'undefined' && process.type === 'renderer') {
  module.exports = require('./browser.js');
} else {
  module.exports = require('./node.js');
}
module.exports = inspectorLog;

// black hole
const nullStream = new (require('stream').Writable)();
nullStream._write = () => {};

/**
 * Outputs a `console.log()` to the Node.js Inspector console *only*.
 */
function inspectorLog() {
  const stdout = console._stdout;
  console._stdout = nullStream;
  console.log.apply(console, arguments);
  console._stdout = stdout;
}
/**
 * Module dependencies.
 */

var tty = require('tty');
var util = require('util');

/**
 * This is the Node.js implementation of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = require('./debug');
exports.init = init;
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;

/**
 * Colors.
 */

exports.colors = [6, 2, 3, 4, 5, 1];

/**
 * Build up the default `inspectOpts` object from the environment variables.
 *
 *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
 */

exports.inspectOpts = Object.keys(process.env).filter(function (key) {
  return /^debug_/i.test(key);
}).reduce(function (obj, key) {
  // camel-case
  var prop = key
    .substring(6)
    .toLowerCase()
    .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() });

  // coerce string value into JS value
  var val = process.env[key];
  if (/^(yes|on|true|enabled)$/i.test(val)) val = true;
  else if (/^(no|off|false|disabled)$/i.test(val)) val = false;
  else if (val === 'null') val = null;
  else val = Number(val);

  obj[prop] = val;
  return obj;
}, {});

/**
 * The file descriptor to write the `debug()` calls to.
 * Set the `DEBUG_FD` env variable to override with another value. i.e.:
 *
 *   $ DEBUG_FD=3 node script.js 3>debug.log
 */

var fd = parseInt(process.env.DEBUG_FD, 10) || 2;

if (1 !== fd && 2 !== fd) {
  util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')()
}

var stream = 1 === fd ? process.stdout :
             2 === fd ? process.stderr :
             createWritableStdioStream(fd);

/**
 * Is stdout a TTY? Colored output is enabled when `true`.
 */

function useColors() {
  return 'colors' in exports.inspectOpts
    ? Boolean(exports.inspectOpts.colors)
    : tty.isatty(fd);
}

/**
 * Map %o to `util.inspect()`, all on a single line.
 */

exports.formatters.o = function(v) {
  this.inspectOpts.colors = this.useColors;
  return util.inspect(v, this.inspectOpts)
    .split('\n').map(function(str) {
      return str.trim()
    }).join(' ');
};

/**
 * Map %o to `util.inspect()`, allowing multiple lines if needed.
 */

exports.formatters.O = function(v) {
  this.inspectOpts.colors = this.useColors;
  return util.inspect(v, this.inspectOpts);
};

/**
 * Adds ANSI color escape codes if enabled.
 *
 * @api public
 */

function formatArgs(args) {
  var name = this.namespace;
  var useColors = this.useColors;

  if (useColors) {
    var c = this.color;
    var prefix = '  \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m';

    args[0] = prefix + args[0].split('\n').join('\n' + prefix);
    args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m');
  } else {
    args[0] = new Date().toUTCString()
      + ' ' + name + ' ' + args[0];
  }
}

/**
 * Invokes `util.format()` with the specified arguments and writes to `stream`.
 */

function log() {
  return stream.write(util.format.apply(util, arguments) + '\n');
}

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */

function save(namespaces) {
  if (null == namespaces) {
    // If you set a process.env field to null or undefined, it gets cast to the
    // string 'null' or 'undefined'. Just delete instead.
    delete process.env.DEBUG;
  } else {
    process.env.DEBUG = namespaces;
  }
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */

function load() {
  return process.env.DEBUG;
}

/**
 * Copied from `node/src/node.js`.
 *
 * XXX: It's lame that node doesn't expose this API out-of-the-box. It also
 * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame.
 */

function createWritableStdioStream (fd) {
  var stream;
  var tty_wrap = process.binding('tty_wrap');

  // Note stream._type is used for test-module-load-list.js

  switch (tty_wrap.guessHandleType(fd)) {
    case 'TTY':
      stream = new tty.WriteStream(fd);
      stream._type = 'tty';

      // Hack to have stream not keep the event loop alive.
      // See https://github.com/joyent/node/issues/1726
      if (stream._handle && stream._handle.unref) {
        stream._handle.unref();
      }
      break;

    case 'FILE':
      var fs = require('fs');
      stream = new fs.SyncWriteStream(fd, { autoClose: false });
      stream._type = 'fs';
      break;

    case 'PIPE':
    case 'TCP':
      var net = require('net');
      stream = new net.Socket({
        fd: fd,
        readable: false,
        writable: true
      });

      // FIXME Should probably have an option in net.Socket to create a
      // stream from an existing fd which is writable only. But for now
      // we'll just add this hack and set the `readable` member to false.
      // Test: ./node test/fixtures/echo.js < /etc/passwd
      stream.readable = false;
      stream.read = null;
      stream._type = 'pipe';

      // FIXME Hack to have stream not keep the event loop alive.
      // See https://github.com/joyent/node/issues/1726
      if (stream._handle && stream._handle.unref) {
        stream._handle.unref();
      }
      break;

    default:
      // Probably an error on in uv_guess_handle()
      throw new Error('Implement me. Unknown stream file type!');
  }

  // For supporting legacy API we put the FD here.
  stream.fd = fd;

  stream._isStdio = true;

  return stream;
}

/**
 * Init logic for `debug` instances.
 *
 * Create a new `inspectOpts` object in case `useColors` is set
 * differently for a particular `debug` instance.
 */

function init (debug) {
  debug.inspectOpts = {};

  var keys = Object.keys(exports.inspectOpts);
  for (var i = 0; i < keys.length; i++) {
    debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
  }
}

/**
 * Enable namespaces listed in `process.env.DEBUG` initially.
 */

exports.enable(load());
Copyright (c) 2011 Alexander Shtuchkin

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": "iconv-lite",
  "description": "Convert character encodings in pure javascript.",
  "version": "0.4.24",
  "license": "MIT",
  "author": "Alexander Shtuchkin <ashtuchkin@gmail.com>",
  "main": "./lib/index.js",
  "typings": "./lib/index.d.ts",
  "homepage": "https://github.com/ashtuchkin/iconv-lite",
  "repository": {
    "type": "git",
    "url": "git://github.com/ashtuchkin/iconv-lite.git"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "browser": {
    "./lib/extend-node": false,
    "./lib/streams": false
  },
  "devDependencies": {
    "mocha": "^3.1.0",
    "request": "~2.87.0",
    "unorm": "*",
    "errto": "*",
    "async": "*",
    "istanbul": "*",
    "semver": "*",
    "iconv": "*"
  },
  "dependencies": {
    "safer-buffer": ">= 2.1.2 < 3"
  }
}"use strict";

var BOMChar = '\uFEFF';

exports.PrependBOM = PrependBOMWrapper
function PrependBOMWrapper(encoder, options) {
    this.encoder = encoder;
    this.addBOM = true;
}

PrependBOMWrapper.prototype.write = function(str) {
    if (this.addBOM) {
        str = BOMChar + str;
        this.addBOM = false;
    }

    return this.encoder.write(str);
}

PrependBOMWrapper.prototype.end = function() {
    return this.encoder.end();
}


//------------------------------------------------------------------------------

exports.StripBOM = StripBOMWrapper;
function StripBOMWrapper(decoder, options) {
    this.decoder = decoder;
    this.pass = false;
    this.options = options || {};
}

StripBOMWrapper.prototype.write = function(buf) {
    var res = this.decoder.write(buf);
    if (this.pass || !res)
        return res;

    if (res[0] === BOMChar) {
        res = res.slice(1);
        if (typeof this.options.stripBOM === 'function')
            this.options.stripBOM();
    }

    this.pass = true;
    return res;
}

StripBOMWrapper.prototype.end = function() {
    return this.decoder.end();
}

"use strict";
var Buffer = require("buffer").Buffer;
// Note: not polyfilled with safer-buffer on a purpose, as overrides Buffer

// == Extend Node primitives to use iconv-lite =================================

module.exports = function (iconv) {
    var original = undefined; // Place to keep original methods.

    // Node authors rewrote Buffer internals to make it compatible with
    // Uint8Array and we cannot patch key functions since then.
    // Note: this does use older Buffer API on a purpose
    iconv.supportsNodeEncodingsExtension = !(Buffer.from || new Buffer(0) instanceof Uint8Array);

    iconv.extendNodeEncodings = function extendNodeEncodings() {
        if (original) return;
        original = {};

        if (!iconv.supportsNodeEncodingsExtension) {
            console.error("ACTION NEEDED: require('iconv-lite').extendNodeEncodings() is not supported in your version of Node");
            console.error("See more info at https://github.com/ashtuchkin/iconv-lite/wiki/Node-v4-compatibility");
            return;
        }

        var nodeNativeEncodings = {
            'hex': true, 'utf8': true, 'utf-8': true, 'ascii': true, 'binary': true, 
            'base64': true, 'ucs2': true, 'ucs-2': true, 'utf16le': true, 'utf-16le': true,
        };

        Buffer.isNativeEncoding = function(enc) {
            return enc && nodeNativeEncodings[enc.toLowerCase()];
        }

        // -- SlowBuffer -----------------------------------------------------------
        var SlowBuffer = require('buffer').SlowBuffer;

        original.SlowBufferToString = SlowBuffer.prototype.toString;
        SlowBuffer.prototype.toString = function(encoding, start, end) {
            encoding = String(encoding || 'utf8').toLowerCase();

            // Use native conversion when possible
            if (Buffer.isNativeEncoding(encoding))
                return original.SlowBufferToString.call(this, encoding, start, end);

            // Otherwise, use our decoding method.
            if (typeof start == 'undefined') start = 0;
            if (typeof end == 'undefined') end = this.length;
            return iconv.decode(this.slice(start, end), encoding);
        }

        original.SlowBufferWrite = SlowBuffer.prototype.write;
        SlowBuffer.prototype.write = function(string, offset, length, encoding) {
            // Support both (string, offset, length, encoding)
            // and the legacy (string, encoding, offset, length)
            if (isFinite(offset)) {
                if (!isFinite(length)) {
                    encoding = length;
                    length = undefined;
                }
            } else {  // legacy
                var swap = encoding;
                encoding = offset;
                offset = length;
                length = swap;
            }

            offset = +offset || 0;
            var remaining = this.length - offset;
            if (!length) {
                length = remaining;
            } else {
                length = +length;
                if (length > remaining) {
                    length = remaining;
                }
            }
            encoding = String(encoding || 'utf8').toLowerCase();

            // Use native conversion when possible
            if (Buffer.isNativeEncoding(encoding))
                return original.SlowBufferWrite.call(this, string, offset, length, encoding);

            if (string.length > 0 && (length < 0 || offset < 0))
                throw new RangeError('attempt to write beyond buffer bounds');

            // Otherwise, use our encoding method.
            var buf = iconv.encode(string, encoding);
            if (buf.length < length) length = buf.length;
            buf.copy(this, offset, 0, length);
            return length;
        }

        // -- Buffer ---------------------------------------------------------------

        original.BufferIsEncoding = Buffer.isEncoding;
        Buffer.isEncoding = function(encoding) {
            return Buffer.isNativeEncoding(encoding) || iconv.encodingExists(encoding);
        }

        original.BufferByteLength = Buffer.byteLength;
        Buffer.byteLength = SlowBuffer.byteLength = function(str, encoding) {
            encoding = String(encoding || 'utf8').toLowerCase();

            // Use native conversion when possible
            if (Buffer.isNativeEncoding(encoding))
                return original.BufferByteLength.call(this, str, encoding);

            // Slow, I know, but we don't have a better way yet.
            return iconv.encode(str, encoding).length;
        }

        original.BufferToString = Buffer.prototype.toString;
        Buffer.prototype.toString = function(encoding, start, end) {
            encoding = String(encoding || 'utf8').toLowerCase();

            // Use native conversion when possible
            if (Buffer.isNativeEncoding(encoding))
                return original.BufferToString.call(this, encoding, start, end);

            // Otherwise, use our decoding method.
            if (typeof start == 'undefined') start = 0;
            if (typeof end == 'undefined') end = this.length;
            return iconv.decode(this.slice(start, end), encoding);
        }

        original.BufferWrite = Buffer.prototype.write;
        Buffer.prototype.write = function(string, offset, length, encoding) {
            var _offset = offset, _length = length, _encoding = encoding;
            // Support both (string, offset, length, encoding)
            // and the legacy (string, encoding, offset, length)
            if (isFinite(offset)) {
                if (!isFinite(length)) {
                    encoding = length;
                    length = undefined;
                }
            } else {  // legacy
                var swap = encoding;
                encoding = offset;
                offset = length;
                length = swap;
            }

            encoding = String(encoding || 'utf8').toLowerCase();

            // Use native conversion when possible
            if (Buffer.isNativeEncoding(encoding))
                return original.BufferWrite.call(this, string, _offset, _length, _encoding);

            offset = +offset || 0;
            var remaining = this.length - offset;
            if (!length) {
                length = remaining;
            } else {
                length = +length;
                if (length > remaining) {
                    length = remaining;
                }
            }

            if (string.length > 0 && (length < 0 || offset < 0))
                throw new RangeError('attempt to write beyond buffer bounds');

            // Otherwise, use our encoding method.
            var buf = iconv.encode(string, encoding);
            if (buf.length < length) length = buf.length;
            buf.copy(this, offset, 0, length);
            return length;

            // TODO: Set _charsWritten.
        }


        // -- Readable -------------------------------------------------------------
        if (iconv.supportsStreams) {
            var Readable = require('stream').Readable;

            original.ReadableSetEncoding = Readable.prototype.setEncoding;
            Readable.prototype.setEncoding = function setEncoding(enc, options) {
                // Use our own decoder, it has the same interface.
                // We cannot use original function as it doesn't handle BOM-s.
                this._readableState.decoder = iconv.getDecoder(enc, options);
                this._readableState.encoding = enc;
            }

            Readable.prototype.collect = iconv._collect;
        }
    }

    // Remove iconv-lite Node primitive extensions.
    iconv.undoExtendNodeEncodings = function undoExtendNodeEncodings() {
        if (!iconv.supportsNodeEncodingsExtension)
            return;
        if (!original)
            throw new Error("require('iconv-lite').undoExtendNodeEncodings(): Nothing to undo; extendNodeEncodings() is not called.")

        delete Buffer.isNativeEncoding;

        var SlowBuffer = require('buffer').SlowBuffer;

        SlowBuffer.prototype.toString = original.SlowBufferToString;
        SlowBuffer.prototype.write = original.SlowBufferWrite;

        Buffer.isEncoding = original.BufferIsEncoding;
        Buffer.byteLength = original.BufferByteLength;
        Buffer.prototype.toString = original.BufferToString;
        Buffer.prototype.write = original.BufferWrite;

        if (iconv.supportsStreams) {
            var Readable = require('stream').Readable;

            Readable.prototype.setEncoding = original.ReadableSetEncoding;
            delete Readable.prototype.collect;
        }

        original = undefined;
    }
}
"use strict";

// Some environments don't have global Buffer (e.g. React Native).
// Solution would be installing npm modules "buffer" and "stream" explicitly.
var Buffer = require("safer-buffer").Buffer;

var bomHandling = require("./bom-handling"),
    iconv = module.exports;

// All codecs and aliases are kept here, keyed by encoding name/alias.
// They are lazy loaded in `iconv.getCodec` from `encodings/index.js`.
iconv.encodings = null;

// Characters emitted in case of error.
iconv.defaultCharUnicode = '�';
iconv.defaultCharSingleByte = '?';

// Public API.
iconv.encode = function encode(str, encoding, options) {
    str = "" + (str || ""); // Ensure string.

    var encoder = iconv.getEncoder(encoding, options);

    var res = encoder.write(str);
    var trail = encoder.end();
    
    return (trail && trail.length > 0) ? Buffer.concat([res, trail]) : res;
}

iconv.decode = function decode(buf, encoding, options) {
    if (typeof buf === 'string') {
        if (!iconv.skipDecodeWarning) {
            console.error('Iconv-lite warning: decode()-ing strings is deprecated. Refer to https://github.com/ashtuchkin/iconv-lite/wiki/Use-Buffers-when-decoding');
            iconv.skipDecodeWarning = true;
        }

        buf = Buffer.from("" + (buf || ""), "binary"); // Ensure buffer.
    }

    var decoder = iconv.getDecoder(encoding, options);

    var res = decoder.write(buf);
    var trail = decoder.end();

    return trail ? (res + trail) : res;
}

iconv.encodingExists = function encodingExists(enc) {
    try {
        iconv.getCodec(enc);
        return true;
    } catch (e) {
        return false;
    }
}

// Legacy aliases to convert functions
iconv.toEncoding = iconv.encode;
iconv.fromEncoding = iconv.decode;

// Search for a codec in iconv.encodings. Cache codec data in iconv._codecDataCache.
iconv._codecDataCache = {};
iconv.getCodec = function getCodec(encoding) {
    if (!iconv.encodings)
        iconv.encodings = require("../encodings"); // Lazy load all encoding definitions.
    
    // Canonicalize encoding name: strip all non-alphanumeric chars and appended year.
    var enc = iconv._canonicalizeEncoding(encoding);

    // Traverse iconv.encodings to find actual codec.
    var codecOptions = {};
    while (true) {
        var codec = iconv._codecDataCache[enc];
        if (codec)
            return codec;

        var codecDef = iconv.encodings[enc];

        switch (typeof codecDef) {
            case "string": // Direct alias to other encoding.
                enc = codecDef;
                break;

            case "object": // Alias with options. Can be layered.
                for (var key in codecDef)
                    codecOptions[key] = codecDef[key];

                if (!codecOptions.encodingName)
                    codecOptions.encodingName = enc;
                
                enc = codecDef.type;
                break;

            case "function": // Codec itself.
                if (!codecOptions.encodingName)
                    codecOptions.encodingName = enc;

                // The codec function must load all tables and return object with .encoder and .decoder methods.
                // It'll be called only once (for each different options object).
                codec = new codecDef(codecOptions, iconv);

                iconv._codecDataCache[codecOptions.encodingName] = codec; // Save it to be reused later.
                return codec;

            default:
                throw new Error("Encoding not recognized: '" + encoding + "' (searched as: '"+enc+"')");
        }
    }
}

iconv._canonicalizeEncoding = function(encoding) {
    // Canonicalize encoding name: strip all non-alphanumeric chars and appended year.
    return (''+encoding).toLowerCase().replace(/:\d{4}$|[^0-9a-z]/g, "");
}

iconv.getEncoder = function getEncoder(encoding, options) {
    var codec = iconv.getCodec(encoding),
        encoder = new codec.encoder(options, codec);

    if (codec.bomAware && options && options.addBOM)
        encoder = new bomHandling.PrependBOM(encoder, options);

    return encoder;
}

iconv.getDecoder = function getDecoder(encoding, options) {
    var codec = iconv.getCodec(encoding),
        decoder = new codec.decoder(options, codec);

    if (codec.bomAware && !(options && options.stripBOM === false))
        decoder = new bomHandling.StripBOM(decoder, options);

    return decoder;
}


// Load extensions in Node. All of them are omitted in Browserify build via 'browser' field in package.json.
var nodeVer = typeof process !== 'undefined' && process.versions && process.versions.node;
if (nodeVer) {

    // Load streaming support in Node v0.10+
    var nodeVerArr = nodeVer.split(".").map(Number);
    if (nodeVerArr[0] > 0 || nodeVerArr[1] >= 10) {
        require("./streams")(iconv);
    }

    // Load Node primitive extensions.
    require("./extend-node")(iconv);
}

if ("Ā" != "\u0100") {
    console.error("iconv-lite warning: javascript files use encoding different from utf-8. See https://github.com/ashtuchkin/iconv-lite/wiki/Javascript-source-file-encodings for more info.");
}
"use strict";

var Buffer = require("buffer").Buffer,
    Transform = require("stream").Transform;


// == Exports ==================================================================
module.exports = function(iconv) {
    
    // Additional Public API.
    iconv.encodeStream = function encodeStream(encoding, options) {
        return new IconvLiteEncoderStream(iconv.getEncoder(encoding, options), options);
    }

    iconv.decodeStream = function decodeStream(encoding, options) {
        return new IconvLiteDecoderStream(iconv.getDecoder(encoding, options), options);
    }

    iconv.supportsStreams = true;


    // Not published yet.
    iconv.IconvLiteEncoderStream = IconvLiteEncoderStream;
    iconv.IconvLiteDecoderStream = IconvLiteDecoderStream;
    iconv._collect = IconvLiteDecoderStream.prototype.collect;
};


// == Encoder stream =======================================================
function IconvLiteEncoderStream(conv, options) {
    this.conv = conv;
    options = options || {};
    options.decodeStrings = false; // We accept only strings, so we don't need to decode them.
    Transform.call(this, options);
}

IconvLiteEncoderStream.prototype = Object.create(Transform.prototype, {
    constructor: { value: IconvLiteEncoderStream }
});

IconvLiteEncoderStream.prototype._transform = function(chunk, encoding, done) {
    if (typeof chunk != 'string')
        return done(new Error("Iconv encoding stream needs strings as its input."));
    try {
        var res = this.conv.write(chunk);
        if (res && res.length) this.push(res);
        done();
    }
    catch (e) {
        done(e);
    }
}

IconvLiteEncoderStream.prototype._flush = function(done) {
    try {
        var res = this.conv.end();
        if (res && res.length) this.push(res);
        done();
    }
    catch (e) {
        done(e);
    }
}

IconvLiteEncoderStream.prototype.collect = function(cb) {
    var chunks = [];
    this.on('error', cb);
    this.on('data', function(chunk) { chunks.push(chunk); });
    this.on('end', function() {
        cb(null, Buffer.concat(chunks));
    });
    return this;
}


// == Decoder stream =======================================================
function IconvLiteDecoderStream(conv, options) {
    this.conv = conv;
    options = options || {};
    options.encoding = this.encoding = 'utf8'; // We output strings.
    Transform.call(this, options);
}

IconvLiteDecoderStream.prototype = Object.create(Transform.prototype, {
    constructor: { value: IconvLiteDecoderStream }
});

IconvLiteDecoderStream.prototype._transform = function(chunk, encoding, done) {
    if (!Buffer.isBuffer(chunk))
        return done(new Error("Iconv decoding stream needs buffers as its input."));
    try {
        var res = this.conv.write(chunk);
        if (res && res.length) this.push(res, this.encoding);
        done();
    }
    catch (e) {
        done(e);
    }
}

IconvLiteDecoderStream.prototype._flush = function(done) {
    try {
        var res = this.conv.end();
        if (res && res.length) this.push(res, this.encoding);                
        done();
    }
    catch (e) {
        done(e);
    }
}

IconvLiteDecoderStream.prototype.collect = function(cb) {
    var res = '';
    this.on('error', cb);
    this.on('data', function(chunk) { res += chunk; });
    this.on('end', function() {
        cb(null, res);
    });
    return this;
}

"use strict";
var Buffer = require("safer-buffer").Buffer;

// Multibyte codec. In this scheme, a character is represented by 1 or more bytes.
// Our codec supports UTF-16 surrogates, extensions for GB18030 and unicode sequences.
// To save memory and loading time, we read table files only when requested.

exports._dbcs = DBCSCodec;

var UNASSIGNED = -1,
    GB18030_CODE = -2,
    SEQ_START  = -10,
    NODE_START = -1000,
    UNASSIGNED_NODE = new Array(0x100),
    DEF_CHAR = -1;

for (var i = 0; i < 0x100; i++)
    UNASSIGNED_NODE[i] = UNASSIGNED;


// Class DBCSCodec reads and initializes mapping tables.
function DBCSCodec(codecOptions, iconv) {
    this.encodingName = codecOptions.encodingName;
    if (!codecOptions)
        throw new Error("DBCS codec is called without the data.")
    if (!codecOptions.table)
        throw new Error("Encoding '" + this.encodingName + "' has no data.");

    // Load tables.
    var mappingTable = codecOptions.table();


    // Decode tables: MBCS -> Unicode.

    // decodeTables is a trie, encoded as an array of arrays of integers. Internal arrays are trie nodes and all have len = 256.
    // Trie root is decodeTables[0].
    // Values: >=  0 -> unicode character code. can be > 0xFFFF
    //         == UNASSIGNED -> unknown/unassigned sequence.
    //         == GB18030_CODE -> this is the end of a GB18030 4-byte sequence.
    //         <= NODE_START -> index of the next node in our trie to process next byte.
    //         <= SEQ_START  -> index of the start of a character code sequence, in decodeTableSeq.
    this.decodeTables = [];
    this.decodeTables[0] = UNASSIGNED_NODE.slice(0); // Create root node.

    // Sometimes a MBCS char corresponds to a sequence of unicode chars. We store them as arrays of integers here. 
    this.decodeTableSeq = [];

    // Actual mapping tables consist of chunks. Use them to fill up decode tables.
    for (var i = 0; i < mappingTable.length; i++)
        this._addDecodeChunk(mappingTable[i]);

    this.defaultCharUnicode = iconv.defaultCharUnicode;

    
    // Encode tables: Unicode -> DBCS.

    // `encodeTable` is array mapping from unicode char to encoded char. All its values are integers for performance.
    // Because it can be sparse, it is represented as array of buckets by 256 chars each. Bucket can be null.
    // Values: >=  0 -> it is a normal char. Write the value (if <=256 then 1 byte, if <=65536 then 2 bytes, etc.).
    //         == UNASSIGNED -> no conversion found. Output a default char.
    //         <= SEQ_START  -> it's an index in encodeTableSeq, see below. The character starts a sequence.
    this.encodeTable = [];
    
    // `encodeTableSeq` is used when a sequence of unicode characters is encoded as a single code. We use a tree of
    // objects where keys correspond to characters in sequence and leafs are the encoded dbcs values. A special DEF_CHAR key
    // means end of sequence (needed when one sequence is a strict subsequence of another).
    // Objects are kept separately from encodeTable to increase performance.
    this.encodeTableSeq = [];

    // Some chars can be decoded, but need not be encoded.
    var skipEncodeChars = {};
    if (codecOptions.encodeSkipVals)
        for (var i = 0; i < codecOptions.encodeSkipVals.length; i++) {
            var val = codecOptions.encodeSkipVals[i];
            if (typeof val === 'number')
                skipEncodeChars[val] = true;
            else
                for (var j = val.from; j <= val.to; j++)
                    skipEncodeChars[j] = true;
        }
        
    // Use decode trie to recursively fill out encode tables.
    this._fillEncodeTable(0, 0, skipEncodeChars);

    // Add more encoding pairs when needed.
    if (codecOptions.encodeAdd) {
        for (var uChar in codecOptions.encodeAdd)
            if (Object.prototype.hasOwnProperty.call(codecOptions.encodeAdd, uChar))
                this._setEncodeChar(uChar.charCodeAt(0), codecOptions.encodeAdd[uChar]);
    }

    this.defCharSB  = this.encodeTable[0][iconv.defaultCharSingleByte.charCodeAt(0)];
    if (this.defCharSB === UNASSIGNED) this.defCharSB = this.encodeTable[0]['?'];
    if (this.defCharSB === UNASSIGNED) this.defCharSB = "?".charCodeAt(0);


    // Load & create GB18030 tables when needed.
    if (typeof codecOptions.gb18030 === 'function') {
        this.gb18030 = codecOptions.gb18030(); // Load GB18030 ranges.

        // Add GB18030 decode tables.
        var thirdByteNodeIdx = this.decodeTables.length;
        var thirdByteNode = this.decodeTables[thirdByteNodeIdx] = UNASSIGNED_NODE.slice(0);

        var fourthByteNodeIdx = this.decodeTables.length;
        var fourthByteNode = this.decodeTables[fourthByteNodeIdx] = UNASSIGNED_NODE.slice(0);

        for (var i = 0x81; i <= 0xFE; i++) {
            var secondByteNodeIdx = NODE_START - this.decodeTables[0][i];
            var secondByteNode = this.decodeTables[secondByteNodeIdx];
            for (var j = 0x30; j <= 0x39; j++)
                secondByteNode[j] = NODE_START - thirdByteNodeIdx;
        }
        for (var i = 0x81; i <= 0xFE; i++)
            thirdByteNode[i] = NODE_START - fourthByteNodeIdx;
        for (var i = 0x30; i <= 0x39; i++)
            fourthByteNode[i] = GB18030_CODE
    }        
}

DBCSCodec.prototype.encoder = DBCSEncoder;
DBCSCodec.prototype.decoder = DBCSDecoder;

// Decoder helpers
DBCSCodec.prototype._getDecodeTrieNode = function(addr) {
    var bytes = [];
    for (; addr > 0; addr >>= 8)
        bytes.push(addr & 0xFF);
    if (bytes.length == 0)
        bytes.push(0);

    var node = this.decodeTables[0];
    for (var i = bytes.length-1; i > 0; i--) { // Traverse nodes deeper into the trie.
        var val = node[bytes[i]];

        if (val == UNASSIGNED) { // Create new node.
            node[bytes[i]] = NODE_START - this.decodeTables.length;
            this.decodeTables.push(node = UNASSIGNED_NODE.slice(0));
        }
        else if (val <= NODE_START) { // Existing node.
            node = this.decodeTables[NODE_START - val];
        }
        else
            throw new Error("Overwrite byte in " + this.encodingName + ", addr: " + addr.toString(16));
    }
    return node;
}


DBCSCodec.prototype._addDecodeChunk = function(chunk) {
    // First element of chunk is the hex mbcs code where we start.
    var curAddr = parseInt(chunk[0], 16);

    // Choose the decoding node where we'll write our chars.
    var writeTable = this._getDecodeTrieNode(curAddr);
    curAddr = curAddr & 0xFF;

    // Write all other elements of the chunk to the table.
    for (var k = 1; k < chunk.length; k++) {
        var part = chunk[k];
        if (typeof part === "string") { // String, write as-is.
            for (var l = 0; l < part.length;) {
                var code = part.charCodeAt(l++);
                if (0xD800 <= code && code < 0xDC00) { // Decode surrogate
                    var codeTrail = part.charCodeAt(l++);
                    if (0xDC00 <= codeTrail && codeTrail < 0xE000)
                        writeTable[curAddr++] = 0x10000 + (code - 0xD800) * 0x400 + (codeTrail - 0xDC00);
                    else
                        throw new Error("Incorrect surrogate pair in "  + this.encodingName + " at chunk " + chunk[0]);
                }
                else if (0x0FF0 < code && code <= 0x0FFF) { // Character sequence (our own encoding used)
                    var len = 0xFFF - code + 2;
                    var seq = [];
                    for (var m = 0; m < len; m++)
                        seq.push(part.charCodeAt(l++)); // Simple variation: don't support surrogates or subsequences in seq.

                    writeTable[curAddr++] = SEQ_START - this.decodeTableSeq.length;
                    this.decodeTableSeq.push(seq);
                }
                else
                    writeTable[curAddr++] = code; // Basic char
            }
        } 
        else if (typeof part === "number") { // Integer, meaning increasing sequence starting with prev character.
            var charCode = writeTable[curAddr - 1] + 1;
            for (var l = 0; l < part; l++)
                writeTable[curAddr++] = charCode++;
        }
        else
            throw new Error("Incorrect type '" + typeof part + "' given in "  + this.encodingName + " at chunk " + chunk[0]);
    }
    if (curAddr > 0xFF)
        throw new Error("Incorrect chunk in "  + this.encodingName + " at addr " + chunk[0] + ": too long" + curAddr);
}

// Encoder helpers
DBCSCodec.prototype._getEncodeBucket = function(uCode) {
    var high = uCode >> 8; // This could be > 0xFF because of astral characters.
    if (this.encodeTable[high] === undefined)
        this.encodeTable[high] = UNASSIGNED_NODE.slice(0); // Create bucket on demand.
    return this.encodeTable[high];
}

DBCSCodec.prototype._setEncodeChar = function(uCode, dbcsCode) {
    var bucket = this._getEncodeBucket(uCode);
    var low = uCode & 0xFF;
    if (bucket[low] <= SEQ_START)
        this.encodeTableSeq[SEQ_START-bucket[low]][DEF_CHAR] = dbcsCode; // There's already a sequence, set a single-char subsequence of it.
    else if (bucket[low] == UNASSIGNED)
        bucket[low] = dbcsCode;
}

DBCSCodec.prototype._setEncodeSequence = function(seq, dbcsCode) {
    
    // Get the root of character tree according to first character of the sequence.
    var uCode = seq[0];
    var bucket = this._getEncodeBucket(uCode);
    var low = uCode & 0xFF;

    var node;
    if (bucket[low] <= SEQ_START) {
        // There's already a sequence with  - use it.
        node = this.encodeTableSeq[SEQ_START-bucket[low]];
    }
    else {
        // There was no sequence object - allocate a new one.
        node = {};
        if (bucket[low] !== UNASSIGNED) node[DEF_CHAR] = bucket[low]; // If a char was set before - make it a single-char subsequence.
        bucket[low] = SEQ_START - this.encodeTableSeq.length;
        this.encodeTableSeq.push(node);
    }

    // Traverse the character tree, allocating new nodes as needed.
    for (var j = 1; j < seq.length-1; j++) {
        var oldVal = node[uCode];
        if (typeof oldVal === 'object')
            node = oldVal;
        else {
            node = node[uCode] = {}
            if (oldVal !== undefined)
                node[DEF_CHAR] = oldVal
        }
    }

    // Set the leaf to given dbcsCode.
    uCode = seq[seq.length-1];
    node[uCode] = dbcsCode;
}

DBCSCodec.prototype._fillEncodeTable = function(nodeIdx, prefix, skipEncodeChars) {
    var node = this.decodeTables[nodeIdx];
    for (var i = 0; i < 0x100; i++) {
        var uCode = node[i];
        var mbCode = prefix + i;
        if (skipEncodeChars[mbCode])
            continue;

        if (uCode >= 0)
            this._setEncodeChar(uCode, mbCode);
        else if (uCode <= NODE_START)
            this._fillEncodeTable(NODE_START - uCode, mbCode << 8, skipEncodeChars);
        else if (uCode <= SEQ_START)
            this._setEncodeSequence(this.decodeTableSeq[SEQ_START - uCode], mbCode);
    }
}



// == Encoder ==================================================================

function DBCSEncoder(options, codec) {
    // Encoder state
    this.leadSurrogate = -1;
    this.seqObj = undefined;
    
    // Static data
    this.encodeTable = codec.encodeTable;
    this.encodeTableSeq = codec.encodeTableSeq;
    this.defaultCharSingleByte = codec.defCharSB;
    this.gb18030 = codec.gb18030;
}

DBCSEncoder.prototype.write = function(str) {
    var newBuf = Buffer.alloc(str.length * (this.gb18030 ? 4 : 3)),
        leadSurrogate = this.leadSurrogate,
        seqObj = this.seqObj, nextChar = -1,
        i = 0, j = 0;

    while (true) {
        // 0. Get next character.
        if (nextChar === -1) {
            if (i == str.length) break;
            var uCode = str.charCodeAt(i++);
        }
        else {
            var uCode = nextChar;
            nextChar = -1;    
        }

        // 1. Handle surrogates.
        if (0xD800 <= uCode && uCode < 0xE000) { // Char is one of surrogates.
            if (uCode < 0xDC00) { // We've got lead surrogate.
                if (leadSurrogate === -1) {
                    leadSurrogate = uCode;
                    continue;
                } else {
                    leadSurrogate = uCode;
                    // Double lead surrogate found.
                    uCode = UNASSIGNED;
                }
            } else { // We've got trail surrogate.
                if (leadSurrogate !== -1) {
                    uCode = 0x10000 + (leadSurrogate - 0xD800) * 0x400 + (uCode - 0xDC00);
                    leadSurrogate = -1;
                } else {
                    // Incomplete surrogate pair - only trail surrogate found.
                    uCode = UNASSIGNED;
                }
                
            }
        }
        else if (leadSurrogate !== -1) {
            // Incomplete surrogate pair - only lead surrogate found.
            nextChar = uCode; uCode = UNASSIGNED; // Write an error, then current char.
            leadSurrogate = -1;
        }

        // 2. Convert uCode character.
        var dbcsCode = UNASSIGNED;
        if (seqObj !== undefined && uCode != UNASSIGNED) { // We are in the middle of the sequence
            var resCode = seqObj[uCode];
            if (typeof resCode === 'object') { // Sequence continues.
                seqObj = resCode;
                continue;

            } else if (typeof resCode == 'number') { // Sequence finished. Write it.
                dbcsCode = resCode;

            } else if (resCode == undefined) { // Current character is not part of the sequence.

                // Try default character for this sequence
                resCode = seqObj[DEF_CHAR];
                if (resCode !== undefined) {
                    dbcsCode = resCode; // Found. Write it.
                    nextChar = uCode; // Current character will be written too in the next iteration.

                } else {
                    // TODO: What if we have no default? (resCode == undefined)
                    // Then, we should write first char of the sequence as-is and try the rest recursively.
                    // Didn't do it for now because no encoding has this situation yet.
                    // Currently, just skip the sequence and write current char.
                }
            }
            seqObj = undefined;
        }
        else if (uCode >= 0) {  // Regular character
            var subtable = this.encodeTable[uCode >> 8];
            if (subtable !== undefined)
                dbcsCode = subtable[uCode & 0xFF];
            
            if (dbcsCode <= SEQ_START) { // Sequence start
                seqObj = this.encodeTableSeq[SEQ_START-dbcsCode];
                continue;
            }

            if (dbcsCode == UNASSIGNED && this.gb18030) {
                // Use GB18030 algorithm to find character(s) to write.
                var idx = findIdx(this.gb18030.uChars, uCode);
                if (idx != -1) {
                    var dbcsCode = this.gb18030.gbChars[idx] + (uCode - this.gb18030.uChars[idx]);
                    newBuf[j++] = 0x81 + Math.floor(dbcsCode / 12600); dbcsCode = dbcsCode % 12600;
                    newBuf[j++] = 0x30 + Math.floor(dbcsCode / 1260); dbcsCode = dbcsCode % 1260;
                    newBuf[j++] = 0x81 + Math.floor(dbcsCode / 10); dbcsCode = dbcsCode % 10;
                    newBuf[j++] = 0x30 + dbcsCode;
                    continue;
                }
            }
        }

        // 3. Write dbcsCode character.
        if (dbcsCode === UNASSIGNED)
            dbcsCode = this.defaultCharSingleByte;
        
        if (dbcsCode < 0x100) {
            newBuf[j++] = dbcsCode;
        }
        else if (dbcsCode < 0x10000) {
            newBuf[j++] = dbcsCode >> 8;   // high byte
            newBuf[j++] = dbcsCode & 0xFF; // low byte
        }
        else {
            newBuf[j++] = dbcsCode >> 16;
            newBuf[j++] = (dbcsCode >> 8) & 0xFF;
            newBuf[j++] = dbcsCode & 0xFF;
        }
    }

    this.seqObj = seqObj;
    this.leadSurrogate = leadSurrogate;
    return newBuf.slice(0, j);
}

DBCSEncoder.prototype.end = function() {
    if (this.leadSurrogate === -1 && this.seqObj === undefined)
        return; // All clean. Most often case.

    var newBuf = Buffer.alloc(10), j = 0;

    if (this.seqObj) { // We're in the sequence.
        var dbcsCode = this.seqObj[DEF_CHAR];
        if (dbcsCode !== undefined) { // Write beginning of the sequence.
            if (dbcsCode < 0x100) {
                newBuf[j++] = dbcsCode;
            }
            else {
                newBuf[j++] = dbcsCode >> 8;   // high byte
                newBuf[j++] = dbcsCode & 0xFF; // low byte
            }
        } else {
            // See todo above.
        }
        this.seqObj = undefined;
    }

    if (this.leadSurrogate !== -1) {
        // Incomplete surrogate pair - only lead surrogate found.
        newBuf[j++] = this.defaultCharSingleByte;
        this.leadSurrogate = -1;
    }
    
    return newBuf.slice(0, j);
}

// Export for testing
DBCSEncoder.prototype.findIdx = findIdx;


// == Decoder ==================================================================

function DBCSDecoder(options, codec) {
    // Decoder state
    this.nodeIdx = 0;
    this.prevBuf = Buffer.alloc(0);

    // Static data
    this.decodeTables = codec.decodeTables;
    this.decodeTableSeq = codec.decodeTableSeq;
    this.defaultCharUnicode = codec.defaultCharUnicode;
    this.gb18030 = codec.gb18030;
}

DBCSDecoder.prototype.write = function(buf) {
    var newBuf = Buffer.alloc(buf.length*2),
        nodeIdx = this.nodeIdx, 
        prevBuf = this.prevBuf, prevBufOffset = this.prevBuf.length,
        seqStart = -this.prevBuf.length, // idx of the start of current parsed sequence.
        uCode;

    if (prevBufOffset > 0) // Make prev buf overlap a little to make it easier to slice later.
        prevBuf = Buffer.concat([prevBuf, buf.slice(0, 10)]);
    
    for (var i = 0, j = 0; i < buf.length; i++) {
        var curByte = (i >= 0) ? buf[i] : prevBuf[i + prevBufOffset];

        // Lookup in current trie node.
        var uCode = this.decodeTables[nodeIdx][curByte];

        if (uCode >= 0) { 
            // Normal character, just use it.
        }
        else if (uCode === UNASSIGNED) { // Unknown char.
            // TODO: Callback with seq.
            //var curSeq = (seqStart >= 0) ? buf.slice(seqStart, i+1) : prevBuf.slice(seqStart + prevBufOffset, i+1 + prevBufOffset);
            i = seqStart; // Try to parse again, after skipping first byte of the sequence ('i' will be incremented by 'for' cycle).
            uCode = this.defaultCharUnicode.charCodeAt(0);
        }
        else if (uCode === GB18030_CODE) {
            var curSeq = (seqStart >= 0) ? buf.slice(seqStart, i+1) : prevBuf.slice(seqStart + prevBufOffset, i+1 + prevBufOffset);
            var ptr = (curSeq[0]-0x81)*12600 + (curSeq[1]-0x30)*1260 + (curSeq[2]-0x81)*10 + (curSeq[3]-0x30);
            var idx = findIdx(this.gb18030.gbChars, ptr);
            uCode = this.gb18030.uChars[idx] + ptr - this.gb18030.gbChars[idx];
        }
        else if (uCode <= NODE_START) { // Go to next trie node.
            nodeIdx = NODE_START - uCode;
            continue;
        }
        else if (uCode <= SEQ_START) { // Output a sequence of chars.
            var seq = this.decodeTableSeq[SEQ_START - uCode];
            for (var k = 0; k < seq.length - 1; k++) {
                uCode = seq[k];
                newBuf[j++] = uCode & 0xFF;
                newBuf[j++] = uCode >> 8;
            }
            uCode = seq[seq.length-1];
        }
        else
            throw new Error("iconv-lite internal error: invalid decoding table value " + uCode + " at " + nodeIdx + "/" + curByte);

        // Write the character to buffer, handling higher planes using surrogate pair.
        if (uCode > 0xFFFF) { 
            uCode -= 0x10000;
            var uCodeLead = 0xD800 + Math.floor(uCode / 0x400);
            newBuf[j++] = uCodeLead & 0xFF;
            newBuf[j++] = uCodeLead >> 8;

            uCode = 0xDC00 + uCode % 0x400;
        }
        newBuf[j++] = uCode & 0xFF;
        newBuf[j++] = uCode >> 8;

        // Reset trie node.
        nodeIdx = 0; seqStart = i+1;
    }

    this.nodeIdx = nodeIdx;
    this.prevBuf = (seqStart >= 0) ? buf.slice(seqStart) : prevBuf.slice(seqStart + prevBufOffset);
    return newBuf.slice(0, j).toString('ucs2');
}

DBCSDecoder.prototype.end = function() {
    var ret = '';

    // Try to parse all remaining chars.
    while (this.prevBuf.length > 0) {
        // Skip 1 character in the buffer.
        ret += this.defaultCharUnicode;
        var buf = this.prevBuf.slice(1);

        // Parse remaining as usual.
        this.prevBuf = Buffer.alloc(0);
        this.nodeIdx = 0;
        if (buf.length > 0)
            ret += this.write(buf);
    }

    this.nodeIdx = 0;
    return ret;
}

// Binary search for GB18030. Returns largest i such that table[i] <= val.
function findIdx(table, val) {
    if (table[0] > val)
        return -1;

    var l = 0, r = table.length;
    while (l < r-1) { // always table[l] <= val < table[r]
        var mid = l + Math.floor((r-l+1)/2);
        if (table[mid] <= val)
            l = mid;
        else
            r = mid;
    }
    return l;
}

"use strict";

// Description of supported double byte encodings and aliases.
// Tables are not require()-d until they are needed to speed up library load.
// require()-s are direct to support Browserify.

module.exports = {
    
    // == Japanese/ShiftJIS ====================================================
    // All japanese encodings are based on JIS X set of standards:
    // JIS X 0201 - Single-byte encoding of ASCII + ¥ + Kana chars at 0xA1-0xDF.
    // JIS X 0208 - Main set of 6879 characters, placed in 94x94 plane, to be encoded by 2 bytes. 
    //              Has several variations in 1978, 1983, 1990 and 1997.
    // JIS X 0212 - Supplementary plane of 6067 chars in 94x94 plane. 1990. Effectively dead.
    // JIS X 0213 - Extension and modern replacement of 0208 and 0212. Total chars: 11233.
    //              2 planes, first is superset of 0208, second - revised 0212.
    //              Introduced in 2000, revised 2004. Some characters are in Unicode Plane 2 (0x2xxxx)

    // Byte encodings are:
    //  * Shift_JIS: Compatible with 0201, uses not defined chars in top half as lead bytes for double-byte
    //               encoding of 0208. Lead byte ranges: 0x81-0x9F, 0xE0-0xEF; Trail byte ranges: 0x40-0x7E, 0x80-0x9E, 0x9F-0xFC.
    //               Windows CP932 is a superset of Shift_JIS. Some companies added more chars, notably KDDI.
    //  * EUC-JP:    Up to 3 bytes per character. Used mostly on *nixes.
    //               0x00-0x7F       - lower part of 0201
    //               0x8E, 0xA1-0xDF - upper part of 0201
    //               (0xA1-0xFE)x2   - 0208 plane (94x94).
    //               0x8F, (0xA1-0xFE)x2 - 0212 plane (94x94).
    //  * JIS X 208: 7-bit, direct encoding of 0208. Byte ranges: 0x21-0x7E (94 values). Uncommon.
    //               Used as-is in ISO2022 family.
    //  * ISO2022-JP: Stateful encoding, with escape sequences to switch between ASCII, 
    //                0201-1976 Roman, 0208-1978, 0208-1983.
    //  * ISO2022-JP-1: Adds esc seq for 0212-1990.
    //  * ISO2022-JP-2: Adds esc seq for GB2313-1980, KSX1001-1992, ISO8859-1, ISO8859-7.
    //  * ISO2022-JP-3: Adds esc seq for 0201-1976 Kana set, 0213-2000 Planes 1, 2.
    //  * ISO2022-JP-2004: Adds 0213-2004 Plane 1.
    //
    // After JIS X 0213 appeared, Shift_JIS-2004, EUC-JISX0213 and ISO2022-JP-2004 followed, with just changing the planes.
    //
    // Overall, it seems that it's a mess :( http://www8.plala.or.jp/tkubota1/unicode-symbols-map2.html

    'shiftjis': {
        type: '_dbcs',
        table: function() { return require('./tables/shiftjis.json') },
        encodeAdd: {'\u00a5': 0x5C, '\u203E': 0x7E},
        encodeSkipVals: [{from: 0xED40, to: 0xF940}],
    },
    'csshiftjis': 'shiftjis',
    'mskanji': 'shiftjis',
    'sjis': 'shiftjis',
    'windows31j': 'shiftjis',
    'ms31j': 'shiftjis',
    'xsjis': 'shiftjis',
    'windows932': 'shiftjis',
    'ms932': 'shiftjis',
    '932': 'shiftjis',
    'cp932': 'shiftjis',

    'eucjp': {
        type: '_dbcs',
        table: function() { return require('./tables/eucjp.json') },
        encodeAdd: {'\u00a5': 0x5C, '\u203E': 0x7E},
    },

    // TODO: KDDI extension to Shift_JIS
    // TODO: IBM CCSID 942 = CP932, but F0-F9 custom chars and other char changes.
    // TODO: IBM CCSID 943 = Shift_JIS = CP932 with original Shift_JIS lower 128 chars.


    // == Chinese/GBK ==========================================================
    // http://en.wikipedia.org/wiki/GBK
    // We mostly implement W3C recommendation: https://www.w3.org/TR/encoding/#gbk-encoder

    // Oldest GB2312 (1981, ~7600 chars) is a subset of CP936
    'gb2312': 'cp936',
    'gb231280': 'cp936',
    'gb23121980': 'cp936',
    'csgb2312': 'cp936',
    'csiso58gb231280': 'cp936',
    'euccn': 'cp936',

    // Microsoft's CP936 is a subset and approximation of GBK.
    'windows936': 'cp936',
    'ms936': 'cp936',
    '936': 'cp936',
    'cp936': {
        type: '_dbcs',
        table: function() { return require('./tables/cp936.json') },
    },

    // GBK (~22000 chars) is an extension of CP936 that added user-mapped chars and some other.
    'gbk': {
        type: '_dbcs',
        table: function() { return require('./tables/cp936.json').concat(require('./tables/gbk-added.json')) },
    },
    'xgbk': 'gbk',
    'isoir58': 'gbk',

    // GB18030 is an algorithmic extension of GBK.
    // Main source: https://www.w3.org/TR/encoding/#gbk-encoder
    // http://icu-project.org/docs/papers/gb18030.html
    // http://source.icu-project.org/repos/icu/data/trunk/charset/data/xml/gb-18030-2000.xml
    // http://www.khngai.com/chinese/charmap/tblgbk.php?page=0
    'gb18030': {
        type: '_dbcs',
        table: function() { return require('./tables/cp936.json').concat(require('./tables/gbk-added.json')) },
        gb18030: function() { return require('./tables/gb18030-ranges.json') },
        encodeSkipVals: [0x80],
        encodeAdd: {'€': 0xA2E3},
    },

    'chinese': 'gb18030',


    // == Korean ===============================================================
    // EUC-KR, KS_C_5601 and KS X 1001 are exactly the same.
    'windows949': 'cp949',
    'ms949': 'cp949',
    '949': 'cp949',
    'cp949': {
        type: '_dbcs',
        table: function() { return require('./tables/cp949.json') },
    },

    'cseuckr': 'cp949',
    'csksc56011987': 'cp949',
    'euckr': 'cp949',
    'isoir149': 'cp949',
    'korean': 'cp949',
    'ksc56011987': 'cp949',
    'ksc56011989': 'cp949',
    'ksc5601': 'cp949',


    // == Big5/Taiwan/Hong Kong ================================================
    // There are lots of tables for Big5 and cp950. Please see the following links for history:
    // http://moztw.org/docs/big5/  http://www.haible.de/bruno/charsets/conversion-tables/Big5.html
    // Variations, in roughly number of defined chars:
    //  * Windows CP 950: Microsoft variant of Big5. Canonical: http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP950.TXT
    //  * Windows CP 951: Microsoft variant of Big5-HKSCS-2001. Seems to be never public. http://me.abelcheung.org/articles/research/what-is-cp951/
    //  * Big5-2003 (Taiwan standard) almost superset of cp950.
    //  * Unicode-at-on (UAO) / Mozilla 1.8. Falling out of use on the Web. Not supported by other browsers.
    //  * Big5-HKSCS (-2001, -2004, -2008). Hong Kong standard. 
    //    many unicode code points moved from PUA to Supplementary plane (U+2XXXX) over the years.
    //    Plus, it has 4 combining sequences.
    //    Seems that Mozilla refused to support it for 10 yrs. https://bugzilla.mozilla.org/show_bug.cgi?id=162431 https://bugzilla.mozilla.org/show_bug.cgi?id=310299
    //    because big5-hkscs is the only encoding to include astral characters in non-algorithmic way.
    //    Implementations are not consistent within browsers; sometimes labeled as just big5.
    //    MS Internet Explorer switches from big5 to big5-hkscs when a patch applied.
    //    Great discussion & recap of what's going on https://bugzilla.mozilla.org/show_bug.cgi?id=912470#c31
    //    In the encoder, it might make sense to support encoding old PUA mappings to Big5 bytes seq-s.
    //    Official spec: http://www.ogcio.gov.hk/en/business/tech_promotion/ccli/terms/doc/2003cmp_2008.txt
    //                   http://www.ogcio.gov.hk/tc/business/tech_promotion/ccli/terms/doc/hkscs-2008-big5-iso.txt
    // 
    // Current understanding of how to deal with Big5(-HKSCS) is in the Encoding Standard, http://encoding.spec.whatwg.org/#big5-encoder
    // Unicode mapping (http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/OTHER/BIG5.TXT) is said to be wrong.

    'windows950': 'cp950',
    'ms950': 'cp950',
    '950': 'cp950',
    'cp950': {
        type: '_dbcs',
        table: function() { return require('./tables/cp950.json') },
    },

    // Big5 has many variations and is an extension of cp950. We use Encoding Standard's as a consensus.
    'big5': 'big5hkscs',
    'big5hkscs': {
        type: '_dbcs',
        table: function() { return require('./tables/cp950.json').concat(require('./tables/big5-added.json')) },
        encodeSkipVals: [0xa2cc],
    },

    'cnbig5': 'big5hkscs',
    'csbig5': 'big5hkscs',
    'xxbig5': 'big5hkscs',
};
"use strict";

// Update this array if you add/rename/remove files in this directory.
// We support Browserify by skipping automatic module discovery and requiring modules directly.
var modules = [
    require("./internal"),
    require("./utf16"),
    require("./utf7"),
    require("./sbcs-codec"),
    require("./sbcs-data"),
    require("./sbcs-data-generated"),
    require("./dbcs-codec"),
    require("./dbcs-data"),
];

// Put all encoding/alias/codec definitions to single object and export it. 
for (var i = 0; i < modules.length; i++) {
    var module = modules[i];
    for (var enc in module)
        if (Object.prototype.hasOwnProperty.call(module, enc))
            exports[enc] = module[enc];
}
"use strict";
var Buffer = require("safer-buffer").Buffer;

// Export Node.js internal encodings.

module.exports = {
    // Encodings
    utf8:   { type: "_internal", bomAware: true},
    cesu8:  { type: "_internal", bomAware: true},
    unicode11utf8: "utf8",

    ucs2:   { type: "_internal", bomAware: true},
    utf16le: "ucs2",

    binary: { type: "_internal" },
    base64: { type: "_internal" },
    hex:    { type: "_internal" },

    // Codec.
    _internal: InternalCodec,
};

//------------------------------------------------------------------------------

function InternalCodec(codecOptions, iconv) {
    this.enc = codecOptions.encodingName;
    this.bomAware = codecOptions.bomAware;

    if (this.enc === "base64")
        this.encoder = InternalEncoderBase64;
    else if (this.enc === "cesu8") {
        this.enc = "utf8"; // Use utf8 for decoding.
        this.encoder = InternalEncoderCesu8;

        // Add decoder for versions of Node not supporting CESU-8
        if (Buffer.from('eda0bdedb2a9', 'hex').toString() !== '💩') {
            this.decoder = InternalDecoderCesu8;
            this.defaultCharUnicode = iconv.defaultCharUnicode;
        }
    }
}

InternalCodec.prototype.encoder = InternalEncoder;
InternalCodec.prototype.decoder = InternalDecoder;

//------------------------------------------------------------------------------

// We use node.js internal decoder. Its signature is the same as ours.
var StringDecoder = require('string_decoder').StringDecoder;

if (!StringDecoder.prototype.end) // Node v0.8 doesn't have this method.
    StringDecoder.prototype.end = function() {};


function InternalDecoder(options, codec) {
    StringDecoder.call(this, codec.enc);
}

InternalDecoder.prototype = StringDecoder.prototype;


//------------------------------------------------------------------------------
// Encoder is mostly trivial

function InternalEncoder(options, codec) {
    this.enc = codec.enc;
}

InternalEncoder.prototype.write = function(str) {
    return Buffer.from(str, this.enc);
}

InternalEncoder.prototype.end = function() {
}


//------------------------------------------------------------------------------
// Except base64 encoder, which must keep its state.

function InternalEncoderBase64(options, codec) {
    this.prevStr = '';
}

InternalEncoderBase64.prototype.write = function(str) {
    str = this.prevStr + str;
    var completeQuads = str.length - (str.length % 4);
    this.prevStr = str.slice(completeQuads);
    str = str.slice(0, completeQuads);

    return Buffer.from(str, "base64");
}

InternalEncoderBase64.prototype.end = function() {
    return Buffer.from(this.prevStr, "base64");
}


//------------------------------------------------------------------------------
// CESU-8 encoder is also special.

function InternalEncoderCesu8(options, codec) {
}

InternalEncoderCesu8.prototype.write = function(str) {
    var buf = Buffer.alloc(str.length * 3), bufIdx = 0;
    for (var i = 0; i < str.length; i++) {
        var charCode = str.charCodeAt(i);
        // Naive implementation, but it works because CESU-8 is especially easy
        // to convert from UTF-16 (which all JS strings are encoded in).
        if (charCode < 0x80)
            buf[bufIdx++] = charCode;
        else if (charCode < 0x800) {
            buf[bufIdx++] = 0xC0 + (charCode >>> 6);
            buf[bufIdx++] = 0x80 + (charCode & 0x3f);
        }
        else { // charCode will always be < 0x10000 in javascript.
            buf[bufIdx++] = 0xE0 + (charCode >>> 12);
            buf[bufIdx++] = 0x80 + ((charCode >>> 6) & 0x3f);
            buf[bufIdx++] = 0x80 + (charCode & 0x3f);
        }
    }
    return buf.slice(0, bufIdx);
}

InternalEncoderCesu8.prototype.end = function() {
}

//------------------------------------------------------------------------------
// CESU-8 decoder is not implemented in Node v4.0+

function InternalDecoderCesu8(options, codec) {
    this.acc = 0;
    this.contBytes = 0;
    this.accBytes = 0;
    this.defaultCharUnicode = codec.defaultCharUnicode;
}

InternalDecoderCesu8.prototype.write = function(buf) {
    var acc = this.acc, contBytes = this.contBytes, accBytes = this.accBytes, 
        res = '';
    for (var i = 0; i < buf.length; i++) {
        var curByte = buf[i];
        if ((curByte & 0xC0) !== 0x80) { // Leading byte
            if (contBytes > 0) { // Previous code is invalid
                res += this.defaultCharUnicode;
                contBytes = 0;
            }

            if (curByte < 0x80) { // Single-byte code
                res += String.fromCharCode(curByte);
            } else if (curByte < 0xE0) { // Two-byte code
                acc = curByte & 0x1F;
                contBytes = 1; accBytes = 1;
            } else if (curByte < 0xF0) { // Three-byte code
                acc = curByte & 0x0F;
                contBytes = 2; accBytes = 1;
            } else { // Four or more are not supported for CESU-8.
                res += this.defaultCharUnicode;
            }
        } else { // Continuation byte
            if (contBytes > 0) { // We're waiting for it.
                acc = (acc << 6) | (curByte & 0x3f);
                contBytes--; accBytes++;
                if (contBytes === 0) {
                    // Check for overlong encoding, but support Modified UTF-8 (encoding NULL as C0 80)
                    if (accBytes === 2 && acc < 0x80 && acc > 0)
                        res += this.defaultCharUnicode;
                    else if (accBytes === 3 && acc < 0x800)
                        res += this.defaultCharUnicode;
                    else
                        // Actually add character.
                        res += String.fromCharCode(acc);
                }
            } else { // Unexpected continuation byte
                res += this.defaultCharUnicode;
            }
        }
    }
    this.acc = acc; this.contBytes = contBytes; this.accBytes = accBytes;
    return res;
}

InternalDecoderCesu8.prototype.end = function() {
    var res = 0;
    if (this.contBytes > 0)
        res += this.defaultCharUnicode;
    return res;
}
"use strict";
var Buffer = require("safer-buffer").Buffer;

// Single-byte codec. Needs a 'chars' string parameter that contains 256 or 128 chars that
// correspond to encoded bytes (if 128 - then lower half is ASCII). 

exports._sbcs = SBCSCodec;
function SBCSCodec(codecOptions, iconv) {
    if (!codecOptions)
        throw new Error("SBCS codec is called without the data.")
    
    // Prepare char buffer for decoding.
    if (!codecOptions.chars || (codecOptions.chars.length !== 128 && codecOptions.chars.length !== 256))
        throw new Error("Encoding '"+codecOptions.type+"' has incorrect 'chars' (must be of len 128 or 256)");
    
    if (codecOptions.chars.length === 128) {
        var asciiString = "";
        for (var i = 0; i < 128; i++)
            asciiString += String.fromCharCode(i);
        codecOptions.chars = asciiString + codecOptions.chars;
    }

    this.decodeBuf = Buffer.from(codecOptions.chars, 'ucs2');
    
    // Encoding buffer.
    var encodeBuf = Buffer.alloc(65536, iconv.defaultCharSingleByte.charCodeAt(0));

    for (var i = 0; i < codecOptions.chars.length; i++)
        encodeBuf[codecOptions.chars.charCodeAt(i)] = i;

    this.encodeBuf = encodeBuf;
}

SBCSCodec.prototype.encoder = SBCSEncoder;
SBCSCodec.prototype.decoder = SBCSDecoder;


function SBCSEncoder(options, codec) {
    this.encodeBuf = codec.encodeBuf;
}

SBCSEncoder.prototype.write = function(str) {
    var buf = Buffer.alloc(str.length);
    for (var i = 0; i < str.length; i++)
        buf[i] = this.encodeBuf[str.charCodeAt(i)];
    
    return buf;
}

SBCSEncoder.prototype.end = function() {
}


function SBCSDecoder(options, codec) {
    this.decodeBuf = codec.decodeBuf;
}

SBCSDecoder.prototype.write = function(buf) {
    // Strings are immutable in JS -> we use ucs2 buffer to speed up computations.
    var decodeBuf = this.decodeBuf;
    var newBuf = Buffer.alloc(buf.length*2);
    var idx1 = 0, idx2 = 0;
    for (var i = 0; i < buf.length; i++) {
        idx1 = buf[i]*2; idx2 = i*2;
        newBuf[idx2] = decodeBuf[idx1];
        newBuf[idx2+1] = decodeBuf[idx1+1];
    }
    return newBuf.toString('ucs2');
}

SBCSDecoder.prototype.end = function() {
}
"use strict";

// Generated data for sbcs codec. Don't edit manually. Regenerate using generation/gen-sbcs.js script.
module.exports = {
  "437": "cp437",
  "737": "cp737",
  "775": "cp775",
  "850": "cp850",
  "852": "cp852",
  "855": "cp855",
  "856": "cp856",
  "857": "cp857",
  "858": "cp858",
  "860": "cp860",
  "861": "cp861",
  "862": "cp862",
  "863": "cp863",
  "864": "cp864",
  "865": "cp865",
  "866": "cp866",
  "869": "cp869",
  "874": "windows874",
  "922": "cp922",
  "1046": "cp1046",
  "1124": "cp1124",
  "1125": "cp1125",
  "1129": "cp1129",
  "1133": "cp1133",
  "1161": "cp1161",
  "1162": "cp1162",
  "1163": "cp1163",
  "1250": "windows1250",
  "1251": "windows1251",
  "1252": "windows1252",
  "1253": "windows1253",
  "1254": "windows1254",
  "1255": "windows1255",
  "1256": "windows1256",
  "1257": "windows1257",
  "1258": "windows1258",
  "28591": "iso88591",
  "28592": "iso88592",
  "28593": "iso88593",
  "28594": "iso88594",
  "28595": "iso88595",
  "28596": "iso88596",
  "28597": "iso88597",
  "28598": "iso88598",
  "28599": "iso88599",
  "28600": "iso885910",
  "28601": "iso885911",
  "28603": "iso885913",
  "28604": "iso885914",
  "28605": "iso885915",
  "28606": "iso885916",
  "windows874": {
    "type": "_sbcs",
    "chars": "€����…�����������‘’“”•–—�������� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����"
  },
  "win874": "windows874",
  "cp874": "windows874",
  "windows1250": {
    "type": "_sbcs",
    "chars": "€�‚�„…†‡�‰Š‹ŚŤŽŹ�‘’“”•–—�™š›śťžź ˇ˘Ł¤Ą¦§¨©Ş«¬­®Ż°±˛ł´µ¶·¸ąş»Ľ˝ľżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙"
  },
  "win1250": "windows1250",
  "cp1250": "windows1250",
  "windows1251": {
    "type": "_sbcs",
    "chars": "ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—�™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬­®Ї°±Ііґµ¶·ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя"
  },
  "win1251": "windows1251",
  "cp1251": "windows1251",
  "windows1252": {
    "type": "_sbcs",
    "chars": "€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
  },
  "win1252": "windows1252",
  "cp1252": "windows1252",
  "windows1253": {
    "type": "_sbcs",
    "chars": "€�‚ƒ„…†‡�‰�‹�����‘’“”•–—�™�›���� ΅Ά£¤¥¦§¨©�«¬­®―°±²³΄µ¶·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�"
  },
  "win1253": "windows1253",
  "cp1253": "windows1253",
  "windows1254": {
    "type": "_sbcs",
    "chars": "€�‚ƒ„…†‡ˆ‰Š‹Œ����‘’“”•–—˜™š›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖ×ØÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ"
  },
  "win1254": "windows1254",
  "cp1254": "windows1254",
  "windows1255": {
    "type": "_sbcs",
    "chars": "€�‚ƒ„…†‡ˆ‰�‹�����‘’“”•–—˜™�›���� ¡¢£₪¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾¿ְֱֲֳִֵֶַָֹֺֻּֽ־ֿ׀ׁׂ׃װױײ׳״�������אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏�"
  },
  "win1255": "windows1255",
  "cp1255": "windows1255",
  "windows1256": {
    "type": "_sbcs",
    "chars": "€پ‚ƒ„…†‡ˆ‰ٹ‹Œچژڈگ‘’“”•–—ک™ڑ›œ‌‍ں ،¢£¤¥¦§¨©ھ«¬­®¯°±²³´µ¶·¸¹؛»¼½¾؟ہءآأؤإئابةتثجحخدذرزسشصض×طظعغـفقكàلâمنهوçèéêëىيîïًٌٍَôُِ÷ّùْûü‎‏ے"
  },
  "win1256": "windows1256",
  "cp1256": "windows1256",
  "windows1257": {
    "type": "_sbcs",
    "chars": "€�‚�„…†‡�‰�‹�¨ˇ¸�‘’“”•–—�™�›�¯˛� �¢£¤�¦§Ø©Ŗ«¬­®Æ°±²³´µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž˙"
  },
  "win1257": "windows1257",
  "cp1257": "windows1257",
  "windows1258": {
    "type": "_sbcs",
    "chars": "€�‚ƒ„…†‡ˆ‰�‹Œ����‘’“”•–—˜™�›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ"
  },
  "win1258": "windows1258",
  "cp1258": "windows1258",
  "iso88591": {
    "type": "_sbcs",
    "chars": " ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
  },
  "cp28591": "iso88591",
  "iso88592": {
    "type": "_sbcs",
    "chars": " Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙"
  },
  "cp28592": "iso88592",
  "iso88593": {
    "type": "_sbcs",
    "chars": " Ħ˘£¤�Ĥ§¨İŞĞĴ­�Ż°ħ²³´µĥ·¸ışğĵ½�żÀÁÂ�ÄĊĈÇÈÉÊËÌÍÎÏ�ÑÒÓÔĠÖ×ĜÙÚÛÜŬŜßàáâ�äċĉçèéêëìíîï�ñòóôġö÷ĝùúûüŭŝ˙"
  },
  "cp28593": "iso88593",
  "iso88594": {
    "type": "_sbcs",
    "chars": " ĄĸŖ¤ĨĻ§¨ŠĒĢŦ­Ž¯°ą˛ŗ´ĩļˇ¸šēģŧŊžŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎĪĐŅŌĶÔÕÖ×ØŲÚÛÜŨŪßāáâãäåæįčéęëėíîīđņōķôõö÷øųúûüũū˙"
  },
  "cp28594": "iso88594",
  "iso88595": {
    "type": "_sbcs",
    "chars": " ЁЂЃЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ"
  },
  "cp28595": "iso88595",
  "iso88596": {
    "type": "_sbcs",
    "chars": " ���¤�������،­�������������؛���؟�ءآأؤإئابةتثجحخدذرزسشصضطظعغ�����ـفقكلمنهوىيًٌٍَُِّْ�������������"
  },
  "cp28596": "iso88596",
  "iso88597": {
    "type": "_sbcs",
    "chars": " ‘’£€₯¦§¨©ͺ«¬­�―°±²³΄΅Ά·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�"
  },
  "cp28597": "iso88597",
  "iso88598": {
    "type": "_sbcs",
    "chars": " �¢£¤¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾��������������������������������‗אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏�"
  },
  "cp28598": "iso88598",
  "iso88599": {
    "type": "_sbcs",
    "chars": " ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖ×ØÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ"
  },
  "cp28599": "iso88599",
  "iso885910": {
    "type": "_sbcs",
    "chars": " ĄĒĢĪĨĶ§ĻĐŠŦŽ­ŪŊ°ąēģīĩķ·ļđšŧž―ūŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎÏÐŅŌÓÔÕÖŨØŲÚÛÜÝÞßāáâãäåæįčéęëėíîïðņōóôõöũøųúûüýþĸ"
  },
  "cp28600": "iso885910",
  "iso885911": {
    "type": "_sbcs",
    "chars": " กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����"
  },
  "cp28601": "iso885911",
  "iso885913": {
    "type": "_sbcs",
    "chars": " ”¢£¤„¦§Ø©Ŗ«¬­®Æ°±²³“µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž’"
  },
  "cp28603": "iso885913",
  "iso885914": {
    "type": "_sbcs",
    "chars": " Ḃḃ£ĊċḊ§Ẁ©ẂḋỲ­®ŸḞḟĠġṀṁ¶ṖẁṗẃṠỳẄẅṡÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏŴÑÒÓÔÕÖṪØÙÚÛÜÝŶßàáâãäåæçèéêëìíîïŵñòóôõöṫøùúûüýŷÿ"
  },
  "cp28604": "iso885914",
  "iso885915": {
    "type": "_sbcs",
    "chars": " ¡¢£€¥Š§š©ª«¬­®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
  },
  "cp28605": "iso885915",
  "iso885916": {
    "type": "_sbcs",
    "chars": " ĄąŁ€„Š§š©Ș«Ź­źŻ°±ČłŽ”¶·žčș»ŒœŸżÀÁÂĂÄĆÆÇÈÉÊËÌÍÎÏĐŃÒÓÔŐÖŚŰÙÚÛÜĘȚßàáâăäćæçèéêëìíîïđńòóôőöśűùúûüęțÿ"
  },
  "cp28606": "iso885916",
  "cp437": {
    "type": "_sbcs",
    "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñÑªº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
  },
  "ibm437": "cp437",
  "csibm437": "cp437",
  "cp737": {
    "type": "_sbcs",
    "chars": "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρσςτυφχψ░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ωάέήϊίόύϋώΆΈΉΊΌΎΏ±≥≤ΪΫ÷≈°∙·√ⁿ²■ "
  },
  "ibm737": "cp737",
  "csibm737": "cp737",
  "cp775": {
    "type": "_sbcs",
    "chars": "ĆüéāäģåćłēŖŗīŹÄÅÉæÆōöĢ¢ŚśÖÜø£Ø×¤ĀĪóŻżź”¦©®¬½¼Ł«»░▒▓│┤ĄČĘĖ╣║╗╝ĮŠ┐└┴┬├─┼ŲŪ╚╔╩╦╠═╬Žąčęėįšųūž┘┌█▄▌▐▀ÓßŌŃõÕµńĶķĻļņĒŅ’­±“¾¶§÷„°∙·¹³²■ "
  },
  "ibm775": "cp775",
  "csibm775": "cp775",
  "cp850": {
    "type": "_sbcs",
    "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñÑªº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýÝ¯´­±‗¾¶§÷¸°¨·¹³²■ "
  },
  "ibm850": "cp850",
  "csibm850": "cp850",
  "cp852": {
    "type": "_sbcs",
    "chars": "ÇüéâäůćçłëŐőîŹÄĆÉĹĺôöĽľŚśÖÜŤťŁ×čáíóúĄąŽžĘę¬źČş«»░▒▓│┤ÁÂĚŞ╣║╗╝Żż┐└┴┬├─┼Ăă╚╔╩╦╠═╬¤đĐĎËďŇÍÎě┘┌█▄ŢŮ▀ÓßÔŃńňŠšŔÚŕŰýÝţ´­˝˛ˇ˘§÷¸°¨˙űŘř■ "
  },
  "ibm852": "cp852",
  "csibm852": "cp852",
  "cp855": {
    "type": "_sbcs",
    "chars": "ђЂѓЃёЁєЄѕЅіІїЇјЈљЉњЊћЋќЌўЎџЏюЮъЪаАбБцЦдДеЕфФгГ«»░▒▓│┤хХиИ╣║╗╝йЙ┐└┴┬├─┼кК╚╔╩╦╠═╬¤лЛмМнНоОп┘┌█▄Пя▀ЯрРсСтТуУжЖвВьЬ№­ыЫзЗшШэЭщЩчЧ§■ "
  },
  "ibm855": "cp855",
  "csibm855": "cp855",
  "cp856": {
    "type": "_sbcs",
    "chars": "אבגדהוזחטיךכלםמןנסעףפץצקרשת�£�×����������®¬½¼�«»░▒▓│┤���©╣║╗╝¢¥┐└┴┬├─┼��╚╔╩╦╠═╬¤���������┘┌█▄¦�▀������µ�������¯´­±‗¾¶§÷¸°¨·¹³²■ "
  },
  "ibm856": "cp856",
  "csibm856": "cp856",
  "cp857": {
    "type": "_sbcs",
    "chars": "ÇüéâäàåçêëèïîıÄÅÉæÆôöòûùİÖÜø£ØŞşáíóúñÑĞğ¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ºªÊËÈ�ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµ�×ÚÛÙìÿ¯´­±�¾¶§÷¸°¨·¹³²■ "
  },
  "ibm857": "cp857",
  "csibm857": "cp857",
  "cp858": {
    "type": "_sbcs",
    "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñÑªº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈ€ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýÝ¯´­±‗¾¶§÷¸°¨·¹³²■ "
  },
  "ibm858": "cp858",
  "csibm858": "cp858",
  "cp860": {
    "type": "_sbcs",
    "chars": "ÇüéâãàÁçêÊèÍÔìÃÂÉÀÈôõòÚùÌÕÜ¢£Ù₧ÓáíóúñÑªº¿Ò¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
  },
  "ibm860": "cp860",
  "csibm860": "cp860",
  "cp861": {
    "type": "_sbcs",
    "chars": "ÇüéâäàåçêëèÐðÞÄÅÉæÆôöþûÝýÖÜø£Ø₧ƒáíóúÁÍÓÚ¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
  },
  "ibm861": "cp861",
  "csibm861": "cp861",
  "cp862": {
    "type": "_sbcs",
    "chars": "אבגדהוזחטיךכלםמןנסעףפץצקרשת¢£¥₧ƒáíóúñÑªº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
  },
  "ibm862": "cp862",
  "csibm862": "cp862",
  "cp863": {
    "type": "_sbcs",
    "chars": "ÇüéâÂà¶çêëèïî‗À§ÉÈÊôËÏûù¤ÔÜ¢£ÙÛƒ¦´óú¨¸³¯Î⌐¬½¼¾«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
  },
  "ibm863": "cp863",
  "csibm863": "cp863",
  "cp864": {
    "type": "_sbcs",
    "chars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$٪&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~°·∙√▒─│┼┤┬├┴┐┌└┘β∞φ±½¼≈«»ﻷﻸ��ﻻﻼ� ­ﺂ£¤ﺄ��ﺎﺏﺕﺙ،ﺝﺡﺥ٠١٢٣٤٥٦٧٨٩ﻑ؛ﺱﺵﺹ؟¢ﺀﺁﺃﺅﻊﺋﺍﺑﺓﺗﺛﺟﺣﺧﺩﺫﺭﺯﺳﺷﺻﺿﻁﻅﻋﻏ¦¬÷×ﻉـﻓﻗﻛﻟﻣﻧﻫﻭﻯﻳﺽﻌﻎﻍﻡﹽّﻥﻩﻬﻰﻲﻐﻕﻵﻶﻝﻙﻱ■�"
  },
  "ibm864": "cp864",
  "csibm864": "cp864",
  "cp865": {
    "type": "_sbcs",
    "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø₧ƒáíóúñÑªº¿⌐¬½¼¡«¤░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
  },
  "ibm865": "cp865",
  "csibm865": "cp865",
  "cp866": {
    "type": "_sbcs",
    "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№¤■ "
  },
  "ibm866": "cp866",
  "csibm866": "cp866",
  "cp869": {
    "type": "_sbcs",
    "chars": "������Ά�·¬¦‘’Έ―ΉΊΪΌ��ΎΫ©Ώ²³ά£έήίϊΐόύΑΒΓΔΕΖΗ½ΘΙ«»░▒▓│┤ΚΛΜΝ╣║╗╝ΞΟ┐└┴┬├─┼ΠΡ╚╔╩╦╠═╬ΣΤΥΦΧΨΩαβγ┘┌█▄δε▀ζηθικλμνξοπρσςτ΄­±υφχ§ψ΅°¨ωϋΰώ■ "
  },
  "ibm869": "cp869",
  "csibm869": "cp869",
  "cp922": {
    "type": "_sbcs",
    "chars": " ¡¢£¤¥¦§¨©ª«¬­®‾°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏŠÑÒÓÔÕÖ×ØÙÚÛÜÝŽßàáâãäåæçèéêëìíîïšñòóôõö÷øùúûüýžÿ"
  },
  "ibm922": "cp922",
  "csibm922": "cp922",
  "cp1046": {
    "type": "_sbcs",
    "chars": "ﺈ×÷ﹱ■│─┐┌└┘ﹹﹻﹽﹿﹷﺊﻰﻳﻲﻎﻏﻐﻶﻸﻺﻼ ¤ﺋﺑﺗﺛﺟﺣ،­ﺧﺳ٠١٢٣٤٥٦٧٨٩ﺷ؛ﺻﺿﻊ؟ﻋءآأؤإئابةتثجحخدذرزسشصضطﻇعغﻌﺂﺄﺎﻓـفقكلمنهوىيًٌٍَُِّْﻗﻛﻟﻵﻷﻹﻻﻣﻧﻬﻩ�"
  },
  "ibm1046": "cp1046",
  "csibm1046": "cp1046",
  "cp1124": {
    "type": "_sbcs",
    "chars": " ЁЂҐЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђґєѕіїјљњћќ§ўџ"
  },
  "ibm1124": "cp1124",
  "csibm1124": "cp1124",
  "cp1125": {
    "type": "_sbcs",
    "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёҐґЄєІіЇї·√№¤■ "
  },
  "ibm1125": "cp1125",
  "csibm1125": "cp1125",
  "cp1129": {
    "type": "_sbcs",
    "chars": " ¡¢£¤¥¦§œ©ª«¬­®¯°±²³Ÿµ¶·Œ¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ"
  },
  "ibm1129": "cp1129",
  "csibm1129": "cp1129",
  "cp1133": {
    "type": "_sbcs",
    "chars": " ກຂຄງຈສຊຍດຕຖທນບປຜຝພຟມຢຣລວຫອຮ���ຯະາຳິີຶືຸູຼັົຽ���ເແໂໃໄ່້໊໋໌ໍໆ�ໜໝ₭����������������໐໑໒໓໔໕໖໗໘໙��¢¬¦�"
  },
  "ibm1133": "cp1133",
  "csibm1133": "cp1133",
  "cp1161": {
    "type": "_sbcs",
    "chars": "��������������������������������่กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู้๊๋€฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛¢¬¦ "
  },
  "ibm1161": "cp1161",
  "csibm1161": "cp1161",
  "cp1162": {
    "type": "_sbcs",
    "chars": "€…‘’“”•–— กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����"
  },
  "ibm1162": "cp1162",
  "csibm1162": "cp1162",
  "cp1163": {
    "type": "_sbcs",
    "chars": " ¡¢£€¥¦§œ©ª«¬­®¯°±²³Ÿµ¶·Œ¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ"
  },
  "ibm1163": "cp1163",
  "csibm1163": "cp1163",
  "maccroatian": {
    "type": "_sbcs",
    "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®Š™´¨≠ŽØ∞±≤≥∆µ∂∑∏š∫ªºΩžø¿¡¬√ƒ≈Ć«Č… ÀÃÕŒœĐ—“”‘’÷◊�©⁄¤‹›Æ»–·‚„‰ÂćÁčÈÍÎÏÌÓÔđÒÚÛÙıˆ˜¯πË˚¸Êæˇ"
  },
  "maccyrillic": {
    "type": "_sbcs",
    "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°¢£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµ∂ЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤"
  },
  "macgreek": {
    "type": "_sbcs",
    "chars": "Ä¹²É³ÖÜ΅àâä΄¨çéèêë£™îï•½‰ôö¦­ùûü†ΓΔΘΛΞΠß®©ΣΪ§≠°·Α±≤≥¥ΒΕΖΗΙΚΜΦΫΨΩάΝ¬ΟΡ≈Τ«»… ΥΧΆΈœ–―“”‘’÷ΉΊΌΎέήίόΏύαβψδεφγηιξκλμνοπώρστθωςχυζϊϋΐΰ�"
  },
  "maciceland": {
    "type": "_sbcs",
    "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûüÝ°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤ÐðÞþý·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ"
  },
  "macroman": {
    "type": "_sbcs",
    "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›ﬁﬂ‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ"
  },
  "macromania": {
    "type": "_sbcs",
    "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ĂŞ∞±≤≥¥µ∂∑∏π∫ªºΩăş¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›Ţţ‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ"
  },
  "macthai": {
    "type": "_sbcs",
    "chars": "«»…“”�•‘’� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู﻿​–—฿เแโใไๅๆ็่้๊๋์ํ™๏๐๑๒๓๔๕๖๗๘๙®©����"
  },
  "macturkish": {
    "type": "_sbcs",
    "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸĞğİıŞş‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙ�ˆ˜¯˘˙˚¸˝˛ˇ"
  },
  "macukraine": {
    "type": "_sbcs",
    "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°Ґ£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµґЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤"
  },
  "koi8r": {
    "type": "_sbcs",
    "chars": "─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ё╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡Ё╢╣╤╥╦╧╨╩╪╫╬©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ"
  },
  "koi8u": {
    "type": "_sbcs",
    "chars": "─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ёє╔ії╗╘╙╚╛ґ╝╞╟╠╡ЁЄ╣ІЇ╦╧╨╩╪Ґ╬©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ"
  },
  "koi8ru": {
    "type": "_sbcs",
    "chars": "─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ёє╔ії╗╘╙╚╛ґў╞╟╠╡ЁЄ╣ІЇ╦╧╨╩╪ҐЎ©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ"
  },
  "koi8t": {
    "type": "_sbcs",
    "chars": "қғ‚Ғ„…†‡�‰ҳ‹ҲҷҶ�Қ‘’“”•–—�™�›�����ӯӮё¤ӣ¦§���«¬­®�°±²Ё�Ӣ¶·�№�»���©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ"
  },
  "armscii8": {
    "type": "_sbcs",
    "chars": " �և։)(»«—.՝,-֊…՜՛՞ԱաԲբԳգԴդԵեԶզԷէԸըԹթԺժԻիԼլԽխԾծԿկՀհՁձՂղՃճՄմՅյՆնՇշՈոՉչՊպՋջՌռՍսՎվՏտՐրՑցՒւՓփՔքՕօՖֆ՚�"
  },
  "rk1048": {
    "type": "_sbcs",
    "chars": "ЂЃ‚ѓ„…†‡€‰Љ‹ЊҚҺЏђ‘’“”•–—�™љ›њқһџ ҰұӘ¤Ө¦§Ё©Ғ«¬­®Ү°±Ііөµ¶·ё№ғ»әҢңүАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя"
  },
  "tcvn": {
    "type": "_sbcs",
    "chars": "\u0000ÚỤ\u0003ỪỬỮ\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010ỨỰỲỶỸÝỴ\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÀẢÃÁẠẶẬÈẺẼÉẸỆÌỈĨÍỊÒỎÕÓỌỘỜỞỠỚỢÙỦŨ ĂÂÊÔƠƯĐăâêôơưđẶ̀̀̉̃́àảãáạẲằẳẵắẴẮẦẨẪẤỀặầẩẫấậèỂẻẽéẹềểễếệìỉỄẾỒĩíịòỔỏõóọồổỗốộờởỡớợùỖủũúụừửữứựỳỷỹýỵỐ"
  },
  "georgianacademy": {
    "type": "_sbcs",
    "chars": "‚ƒ„…†‡ˆ‰Š‹Œ‘’“”•–—˜™š›œŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿აბგდევზთიკლმნოპჟრსტუფქღყშჩცძწჭხჯჰჱჲჳჴჵჶçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
  },
  "georgianps": {
    "type": "_sbcs",
    "chars": "‚ƒ„…†‡ˆ‰Š‹Œ‘’“”•–—˜™š›œŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿აბგდევზჱთიკლმნჲოპჟრსტჳუფქღყშჩცძწჭხჴჯჰჵæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
  },
  "pt154": {
    "type": "_sbcs",
    "chars": "ҖҒӮғ„…ҶҮҲүҠӢҢҚҺҸҗ‘’“”•–—ҳҷҡӣңқһҹ ЎўЈӨҘҰ§Ё©Ә«¬ӯ®Ҝ°ұІіҙө¶·ё№ә»јҪҫҝАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя"
  },
  "viscii": {
    "type": "_sbcs",
    "chars": "\u0000\u0001Ẳ\u0003\u0004ẴẪ\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013Ỷ\u0015\u0016\u0017\u0018Ỹ\u001a\u001b\u001c\u001dỴ\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ẠẮẰẶẤẦẨẬẼẸẾỀỂỄỆỐỒỔỖỘỢỚỜỞỊỎỌỈỦŨỤỲÕắằặấầẩậẽẹếềểễệốồổỗỠƠộờởịỰỨỪỬơớƯÀÁÂÃẢĂẳẵÈÉÊẺÌÍĨỳĐứÒÓÔạỷừửÙÚỹỵÝỡưàáâãảăữẫèéêẻìíĩỉđựòóôõỏọụùúũủýợỮ"
  },
  "iso646cn": {
    "type": "_sbcs",
    "chars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}‾��������������������������������������������������������������������������������������������������������������������������������"
  },
  "iso646jp": {
    "type": "_sbcs",
    "chars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[¥]^_`abcdefghijklmnopqrstuvwxyz{|}‾��������������������������������������������������������������������������������������������������������������������������������"
  },
  "hproman8": {
    "type": "_sbcs",
    "chars": " ÀÂÈÊËÎÏ´ˋˆ¨˜ÙÛ₤¯Ýý°ÇçÑñ¡¿¤£¥§ƒ¢âêôûáéóúàèòùäëöüÅîØÆåíøæÄìÖÜÉïßÔÁÃãÐðÍÌÓÒÕõŠšÚŸÿÞþ·µ¶¾—¼½ªº«■»±�"
  },
  "macintosh": {
    "type": "_sbcs",
    "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›ﬁﬂ‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ"
  },
  "ascii": {
    "type": "_sbcs",
    "chars": "��������������������������������������������������������������������������������������������������������������������������������"
  },
  "tis620": {
    "type": "_sbcs",
    "chars": "���������������������������������กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����"
  }
}"use strict";

// Manually added data to be used by sbcs codec in addition to generated one.

module.exports = {
    // Not supported by iconv, not sure why.
    "10029": "maccenteuro",
    "maccenteuro": {
        "type": "_sbcs",
        "chars": "ÄĀāÉĄÖÜáąČäčĆćéŹźĎíďĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅņŃ¬√ńŇ∆«»… ňŐÕőŌ–—“”‘’÷◊ōŔŕŘ‹›řŖŗŠ‚„šŚśÁŤťÍŽžŪÓÔūŮÚůŰűŲųÝýķŻŁżĢˇ"
    },

    "808": "cp808",
    "ibm808": "cp808",
    "cp808": {
        "type": "_sbcs",
        "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№€■ "
    },

    "mik": {
        "type": "_sbcs",
        "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя└┴┬├─┼╣║╚╔╩╦╠═╬┐░▒▓│┤№§╗╝┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
    },

    // Aliases of generated encodings.
    "ascii8bit": "ascii",
    "usascii": "ascii",
    "ansix34": "ascii",
    "ansix341968": "ascii",
    "ansix341986": "ascii",
    "csascii": "ascii",
    "cp367": "ascii",
    "ibm367": "ascii",
    "isoir6": "ascii",
    "iso646us": "ascii",
    "iso646irv": "ascii",
    "us": "ascii",

    "latin1": "iso88591",
    "latin2": "iso88592",
    "latin3": "iso88593",
    "latin4": "iso88594",
    "latin5": "iso88599",
    "latin6": "iso885910",
    "latin7": "iso885913",
    "latin8": "iso885914",
    "latin9": "iso885915",
    "latin10": "iso885916",

    "csisolatin1": "iso88591",
    "csisolatin2": "iso88592",
    "csisolatin3": "iso88593",
    "csisolatin4": "iso88594",
    "csisolatincyrillic": "iso88595",
    "csisolatinarabic": "iso88596",
    "csisolatingreek" : "iso88597",
    "csisolatinhebrew": "iso88598",
    "csisolatin5": "iso88599",
    "csisolatin6": "iso885910",

    "l1": "iso88591",
    "l2": "iso88592",
    "l3": "iso88593",
    "l4": "iso88594",
    "l5": "iso88599",
    "l6": "iso885910",
    "l7": "iso885913",
    "l8": "iso885914",
    "l9": "iso885915",
    "l10": "iso885916",

    "isoir14": "iso646jp",
    "isoir57": "iso646cn",
    "isoir100": "iso88591",
    "isoir101": "iso88592",
    "isoir109": "iso88593",
    "isoir110": "iso88594",
    "isoir144": "iso88595",
    "isoir127": "iso88596",
    "isoir126": "iso88597",
    "isoir138": "iso88598",
    "isoir148": "iso88599",
    "isoir157": "iso885910",
    "isoir166": "tis620",
    "isoir179": "iso885913",
    "isoir199": "iso885914",
    "isoir203": "iso885915",
    "isoir226": "iso885916",

    "cp819": "iso88591",
    "ibm819": "iso88591",

    "cyrillic": "iso88595",

    "arabic": "iso88596",
    "arabic8": "iso88596",
    "ecma114": "iso88596",
    "asmo708": "iso88596",

    "greek" : "iso88597",
    "greek8" : "iso88597",
    "ecma118" : "iso88597",
    "elot928" : "iso88597",

    "hebrew": "iso88598",
    "hebrew8": "iso88598",

    "turkish": "iso88599",
    "turkish8": "iso88599",

    "thai": "iso885911",
    "thai8": "iso885911",

    "celtic": "iso885914",
    "celtic8": "iso885914",
    "isoceltic": "iso885914",

    "tis6200": "tis620",
    "tis62025291": "tis620",
    "tis62025330": "tis620",

    "10000": "macroman",
    "10006": "macgreek",
    "10007": "maccyrillic",
    "10079": "maciceland",
    "10081": "macturkish",

    "cspc8codepage437": "cp437",
    "cspc775baltic": "cp775",
    "cspc850multilingual": "cp850",
    "cspcp852": "cp852",
    "cspc862latinhebrew": "cp862",
    "cpgr": "cp869",

    "msee": "cp1250",
    "mscyrl": "cp1251",
    "msansi": "cp1252",
    "msgreek": "cp1253",
    "msturk": "cp1254",
    "mshebr": "cp1255",
    "msarab": "cp1256",
    "winbaltrim": "cp1257",

    "cp20866": "koi8r",
    "20866": "koi8r",
    "ibm878": "koi8r",
    "cskoi8r": "koi8r",

    "cp21866": "koi8u",
    "21866": "koi8u",
    "ibm1168": "koi8u",

    "strk10482002": "rk1048",

    "tcvn5712": "tcvn",
    "tcvn57121": "tcvn",

    "gb198880": "iso646cn",
    "cn": "iso646cn",

    "csiso14jisc6220ro": "iso646jp",
    "jisc62201969ro": "iso646jp",
    "jp": "iso646jp",

    "cshproman8": "hproman8",
    "r8": "hproman8",
    "roman8": "hproman8",
    "xroman8": "hproman8",
    "ibm1051": "hproman8",

    "mac": "macintosh",
    "csmacintosh": "macintosh",
};

"use strict";
var Buffer = require("safer-buffer").Buffer;

// Note: UTF16-LE (or UCS2) codec is Node.js native. See encodings/internal.js

// == UTF16-BE codec. ==========================================================

exports.utf16be = Utf16BECodec;
function Utf16BECodec() {
}

Utf16BECodec.prototype.encoder = Utf16BEEncoder;
Utf16BECodec.prototype.decoder = Utf16BEDecoder;
Utf16BECodec.prototype.bomAware = true;


// -- Encoding

function Utf16BEEncoder() {
}

Utf16BEEncoder.prototype.write = function(str) {
    var buf = Buffer.from(str, 'ucs2');
    for (var i = 0; i < buf.length; i += 2) {
        var tmp = buf[i]; buf[i] = buf[i+1]; buf[i+1] = tmp;
    }
    return buf;
}

Utf16BEEncoder.prototype.end = function() {
}


// -- Decoding

function Utf16BEDecoder() {
    this.overflowByte = -1;
}

Utf16BEDecoder.prototype.write = function(buf) {
    if (buf.length == 0)
        return '';

    var buf2 = Buffer.alloc(buf.length + 1),
        i = 0, j = 0;

    if (this.overflowByte !== -1) {
        buf2[0] = buf[0];
        buf2[1] = this.overflowByte;
        i = 1; j = 2;
    }

    for (; i < buf.length-1; i += 2, j+= 2) {
        buf2[j] = buf[i+1];
        buf2[j+1] = buf[i];
    }

    this.overflowByte = (i == buf.length-1) ? buf[buf.length-1] : -1;

    return buf2.slice(0, j).toString('ucs2');
}

Utf16BEDecoder.prototype.end = function() {
}


// == UTF-16 codec =============================================================
// Decoder chooses automatically from UTF-16LE and UTF-16BE using BOM and space-based heuristic.
// Defaults to UTF-16LE, as it's prevalent and default in Node.
// http://en.wikipedia.org/wiki/UTF-16 and http://encoding.spec.whatwg.org/#utf-16le
// Decoder default can be changed: iconv.decode(buf, 'utf16', {defaultEncoding: 'utf-16be'});

// Encoder uses UTF-16LE and prepends BOM (which can be overridden with addBOM: false).

exports.utf16 = Utf16Codec;
function Utf16Codec(codecOptions, iconv) {
    this.iconv = iconv;
}

Utf16Codec.prototype.encoder = Utf16Encoder;
Utf16Codec.prototype.decoder = Utf16Decoder;


// -- Encoding (pass-through)

function Utf16Encoder(options, codec) {
    options = options || {};
    if (options.addBOM === undefined)
        options.addBOM = true;
    this.encoder = codec.iconv.getEncoder('utf-16le', options);
}

Utf16Encoder.prototype.write = function(str) {
    return this.encoder.write(str);
}

Utf16Encoder.prototype.end = function() {
    return this.encoder.end();
}


// -- Decoding

function Utf16Decoder(options, codec) {
    this.decoder = null;
    this.initialBytes = [];
    this.initialBytesLen = 0;

    this.options = options || {};
    this.iconv = codec.iconv;
}

Utf16Decoder.prototype.write = function(buf) {
    if (!this.decoder) {
        // Codec is not chosen yet. Accumulate initial bytes.
        this.initialBytes.push(buf);
        this.initialBytesLen += buf.length;
        
        if (this.initialBytesLen < 16) // We need more bytes to use space heuristic (see below)
            return '';

        // We have enough bytes -> detect endianness.
        var buf = Buffer.concat(this.initialBytes),
            encoding = detectEncoding(buf, this.options.defaultEncoding);
        this.decoder = this.iconv.getDecoder(encoding, this.options);
        this.initialBytes.length = this.initialBytesLen = 0;
    }

    return this.decoder.write(buf);
}

Utf16Decoder.prototype.end = function() {
    if (!this.decoder) {
        var buf = Buffer.concat(this.initialBytes),
            encoding = detectEncoding(buf, this.options.defaultEncoding);
        this.decoder = this.iconv.getDecoder(encoding, this.options);

        var res = this.decoder.write(buf),
            trail = this.decoder.end();

        return trail ? (res + trail) : res;
    }
    return this.decoder.end();
}

function detectEncoding(buf, defaultEncoding) {
    var enc = defaultEncoding || 'utf-16le';

    if (buf.length >= 2) {
        // Check BOM.
        if (buf[0] == 0xFE && buf[1] == 0xFF) // UTF-16BE BOM
            enc = 'utf-16be';
        else if (buf[0] == 0xFF && buf[1] == 0xFE) // UTF-16LE BOM
            enc = 'utf-16le';
        else {
            // No BOM found. Try to deduce encoding from initial content.
            // Most of the time, the content has ASCII chars (U+00**), but the opposite (U+**00) is uncommon.
            // So, we count ASCII as if it was LE or BE, and decide from that.
            var asciiCharsLE = 0, asciiCharsBE = 0, // Counts of chars in both positions
                _len = Math.min(buf.length - (buf.length % 2), 64); // Len is always even.

            for (var i = 0; i < _len; i += 2) {
                if (buf[i] === 0 && buf[i+1] !== 0) asciiCharsBE++;
                if (buf[i] !== 0 && buf[i+1] === 0) asciiCharsLE++;
            }

            if (asciiCharsBE > asciiCharsLE)
                enc = 'utf-16be';
            else if (asciiCharsBE < asciiCharsLE)
                enc = 'utf-16le';
        }
    }

    return enc;
}


"use strict";
var Buffer = require("safer-buffer").Buffer;

// UTF-7 codec, according to https://tools.ietf.org/html/rfc2152
// See also below a UTF-7-IMAP codec, according to http://tools.ietf.org/html/rfc3501#section-5.1.3

exports.utf7 = Utf7Codec;
exports.unicode11utf7 = 'utf7'; // Alias UNICODE-1-1-UTF-7
function Utf7Codec(codecOptions, iconv) {
    this.iconv = iconv;
};

Utf7Codec.prototype.encoder = Utf7Encoder;
Utf7Codec.prototype.decoder = Utf7Decoder;
Utf7Codec.prototype.bomAware = true;


// -- Encoding

var nonDirectChars = /[^A-Za-z0-9'\(\),-\.\/:\? \n\r\t]+/g;

function Utf7Encoder(options, codec) {
    this.iconv = codec.iconv;
}

Utf7Encoder.prototype.write = function(str) {
    // Naive implementation.
    // Non-direct chars are encoded as "+<base64>-"; single "+" char is encoded as "+-".
    return Buffer.from(str.replace(nonDirectChars, function(chunk) {
        return "+" + (chunk === '+' ? '' : 
            this.iconv.encode(chunk, 'utf16-be').toString('base64').replace(/=+$/, '')) 
            + "-";
    }.bind(this)));
}

Utf7Encoder.prototype.end = function() {
}


// -- Decoding

function Utf7Decoder(options, codec) {
    this.iconv = codec.iconv;
    this.inBase64 = false;
    this.base64Accum = '';
}

var base64Regex = /[A-Za-z0-9\/+]/;
var base64Chars = [];
for (var i = 0; i < 256; i++)
    base64Chars[i] = base64Regex.test(String.fromCharCode(i));

var plusChar = '+'.charCodeAt(0), 
    minusChar = '-'.charCodeAt(0),
    andChar = '&'.charCodeAt(0);

Utf7Decoder.prototype.write = function(buf) {
    var res = "", lastI = 0,
        inBase64 = this.inBase64,
        base64Accum = this.base64Accum;

    // The decoder is more involved as we must handle chunks in stream.

    for (var i = 0; i < buf.length; i++) {
        if (!inBase64) { // We're in direct mode.
            // Write direct chars until '+'
            if (buf[i] == plusChar) {
                res += this.iconv.decode(buf.slice(lastI, i), "ascii"); // Write direct chars.
                lastI = i+1;
                inBase64 = true;
            }
        } else { // We decode base64.
            if (!base64Chars[buf[i]]) { // Base64 ended.
                if (i == lastI && buf[i] == minusChar) {// "+-" -> "+"
                    res += "+";
                } else {
                    var b64str = base64Accum + buf.slice(lastI, i).toString();
                    res += this.iconv.decode(Buffer.from(b64str, 'base64'), "utf16-be");
                }

                if (buf[i] != minusChar) // Minus is absorbed after base64.
                    i--;

                lastI = i+1;
                inBase64 = false;
                base64Accum = '';
            }
        }
    }

    if (!inBase64) {
        res += this.iconv.decode(buf.slice(lastI), "ascii"); // Write direct chars.
    } else {
        var b64str = base64Accum + buf.slice(lastI).toString();

        var canBeDecoded = b64str.length - (b64str.length % 8); // Minimal chunk: 2 quads -> 2x3 bytes -> 3 chars.
        base64Accum = b64str.slice(canBeDecoded); // The rest will be decoded in future.
        b64str = b64str.slice(0, canBeDecoded);

        res += this.iconv.decode(Buffer.from(b64str, 'base64'), "utf16-be");
    }

    this.inBase64 = inBase64;
    this.base64Accum = base64Accum;

    return res;
}

Utf7Decoder.prototype.end = function() {
    var res = "";
    if (this.inBase64 && this.base64Accum.length > 0)
        res = this.iconv.decode(Buffer.from(this.base64Accum, 'base64'), "utf16-be");

    this.inBase64 = false;
    this.base64Accum = '';
    return res;
}


// UTF-7-IMAP codec.
// RFC3501 Sec. 5.1.3 Modified UTF-7 (http://tools.ietf.org/html/rfc3501#section-5.1.3)
// Differences:
//  * Base64 part is started by "&" instead of "+"
//  * Direct characters are 0x20-0x7E, except "&" (0x26)
//  * In Base64, "," is used instead of "/"
//  * Base64 must not be used to represent direct characters.
//  * No implicit shift back from Base64 (should always end with '-')
//  * String must end in non-shifted position.
//  * "-&" while in base64 is not allowed.


exports.utf7imap = Utf7IMAPCodec;
function Utf7IMAPCodec(codecOptions, iconv) {
    this.iconv = iconv;
};

Utf7IMAPCodec.prototype.encoder = Utf7IMAPEncoder;
Utf7IMAPCodec.prototype.decoder = Utf7IMAPDecoder;
Utf7IMAPCodec.prototype.bomAware = true;


// -- Encoding

function Utf7IMAPEncoder(options, codec) {
    this.iconv = codec.iconv;
    this.inBase64 = false;
    this.base64Accum = Buffer.alloc(6);
    this.base64AccumIdx = 0;
}

Utf7IMAPEncoder.prototype.write = function(str) {
    var inBase64 = this.inBase64,
        base64Accum = this.base64Accum,
        base64AccumIdx = this.base64AccumIdx,
        buf = Buffer.alloc(str.length*5 + 10), bufIdx = 0;

    for (var i = 0; i < str.length; i++) {
        var uChar = str.charCodeAt(i);
        if (0x20 <= uChar && uChar <= 0x7E) { // Direct character or '&'.
            if (inBase64) {
                if (base64AccumIdx > 0) {
                    bufIdx += buf.write(base64Accum.slice(0, base64AccumIdx).toString('base64').replace(/\//g, ',').replace(/=+$/, ''), bufIdx);
                    base64AccumIdx = 0;
                }

                buf[bufIdx++] = minusChar; // Write '-', then go to direct mode.
                inBase64 = false;
            }

            if (!inBase64) {
                buf[bufIdx++] = uChar; // Write direct character

                if (uChar === andChar)  // Ampersand -> '&-'
                    buf[bufIdx++] = minusChar;
            }

        } else { // Non-direct character
            if (!inBase64) {
                buf[bufIdx++] = andChar; // Write '&', then go to base64 mode.
                inBase64 = true;
            }
            if (inBase64) {
                base64Accum[base64AccumIdx++] = uChar >> 8;
                base64Accum[base64AccumIdx++] = uChar & 0xFF;

                if (base64AccumIdx == base64Accum.length) {
                    bufIdx += buf.write(base64Accum.toString('base64').replace(/\//g, ','), bufIdx);
                    base64AccumIdx = 0;
                }
            }
        }
    }

    this.inBase64 = inBase64;
    this.base64AccumIdx = base64AccumIdx;

    return buf.slice(0, bufIdx);
}

Utf7IMAPEncoder.prototype.end = function() {
    var buf = Buffer.alloc(10), bufIdx = 0;
    if (this.inBase64) {
        if (this.base64AccumIdx > 0) {
            bufIdx += buf.write(this.base64Accum.slice(0, this.base64AccumIdx).toString('base64').replace(/\//g, ',').replace(/=+$/, ''), bufIdx);
            this.base64AccumIdx = 0;
        }

        buf[bufIdx++] = minusChar; // Write '-', then go to direct mode.
        this.inBase64 = false;
    }

    return buf.slice(0, bufIdx);
}


// -- Decoding

function Utf7IMAPDecoder(options, codec) {
    this.iconv = codec.iconv;
    this.inBase64 = false;
    this.base64Accum = '';
}

var base64IMAPChars = base64Chars.slice();
base64IMAPChars[','.charCodeAt(0)] = true;

Utf7IMAPDecoder.prototype.write = function(buf) {
    var res = "", lastI = 0,
        inBase64 = this.inBase64,
        base64Accum = this.base64Accum;

    // The decoder is more involved as we must handle chunks in stream.
    // It is forgiving, closer to standard UTF-7 (for example, '-' is optional at the end).

    for (var i = 0; i < buf.length; i++) {
        if (!inBase64) { // We're in direct mode.
            // Write direct chars until '&'
            if (buf[i] == andChar) {
                res += this.iconv.decode(buf.slice(lastI, i), "ascii"); // Write direct chars.
                lastI = i+1;
                inBase64 = true;
            }
        } else { // We decode base64.
            if (!base64IMAPChars[buf[i]]) { // Base64 ended.
                if (i == lastI && buf[i] == minusChar) { // "&-" -> "&"
                    res += "&";
                } else {
                    var b64str = base64Accum + buf.slice(lastI, i).toString().replace(/,/g, '/');
                    res += this.iconv.decode(Buffer.from(b64str, 'base64'), "utf16-be");
                }

                if (buf[i] != minusChar) // Minus may be absorbed after base64.
                    i--;

                lastI = i+1;
                inBase64 = false;
                base64Accum = '';
            }
        }
    }

    if (!inBase64) {
        res += this.iconv.decode(buf.slice(lastI), "ascii"); // Write direct chars.
    } else {
        var b64str = base64Accum + buf.slice(lastI).toString().replace(/,/g, '/');

        var canBeDecoded = b64str.length - (b64str.length % 8); // Minimal chunk: 2 quads -> 2x3 bytes -> 3 chars.
        base64Accum = b64str.slice(canBeDecoded); // The rest will be decoded in future.
        b64str = b64str.slice(0, canBeDecoded);

        res += this.iconv.decode(Buffer.from(b64str, 'base64'), "utf16-be");
    }

    this.inBase64 = inBase64;
    this.base64Accum = base64Accum;

    return res;
}

Utf7IMAPDecoder.prototype.end = function() {
    var res = "";
    if (this.inBase64 && this.base64Accum.length > 0)
        res = this.iconv.decode(Buffer.from(this.base64Accum, 'base64'), "utf16-be");

    this.inBase64 = false;
    this.base64Accum = '';
    return res;
}


[
["8740","䏰䰲䘃䖦䕸𧉧䵷䖳𧲱䳢𧳅㮕䜶䝄䱇䱀𤊿𣘗𧍒𦺋𧃒䱗𪍑䝏䗚䲅𧱬䴇䪤䚡𦬣爥𥩔𡩣𣸆𣽡晍囻"],
["8767","綕夝𨮹㷴霴𧯯寛𡵞媤㘥𩺰嫑宷峼杮薓𩥅瑡璝㡵𡵓𣚞𦀡㻬"],
["87a1","𥣞㫵竼龗𤅡𨤍𣇪𠪊𣉞䌊蒄龖鐯䤰蘓墖靊鈘秐稲晠権袝瑌篅枂稬剏遆㓦珄𥶹瓆鿇垳䤯呌䄱𣚎堘穲𧭥讏䚮𦺈䆁𥶙箮𢒼鿈𢓁𢓉𢓌鿉蔄𣖻䂴鿊䓡𪷿拁灮鿋"],
["8840","㇀",4,"𠄌㇅𠃑𠃍㇆㇇𠃋𡿨㇈𠃊㇉㇊㇋㇌𠄎㇍㇎ĀÁǍÀĒÉĚÈŌÓǑÒ࿿Ê̄Ế࿿Ê̌ỀÊāáǎàɑēéěèīíǐìōóǒòūúǔùǖǘǚ"],
["88a1","ǜü࿿ê̄ế࿿ê̌ềêɡ⏚⏛"],
["8940","𪎩𡅅"],
["8943","攊"],
["8946","丽滝鵎釟"],
["894c","𧜵撑会伨侨兖兴农凤务动医华发变团声处备夲头学实実岚庆总斉柾栄桥济炼电纤纬纺织经统缆缷艺苏药视设询车轧轮"],
["89a1","琑糼緍楆竉刧"],
["89ab","醌碸酞肼"],
["89b0","贋胶𠧧"],
["89b5","肟黇䳍鷉鸌䰾𩷶𧀎鸊𪄳㗁"],
["89c1","溚舾甙"],
["89c5","䤑马骏龙禇𨑬𡷊𠗐𢫦两亁亀亇亿仫伷㑌侽㹈倃傈㑽㒓㒥円夅凛凼刅争剹劐匧㗇厩㕑厰㕓参吣㕭㕲㚁咓咣咴咹哐哯唘唣唨㖘唿㖥㖿嗗㗅"],
["8a40","𧶄唥"],
["8a43","𠱂𠴕𥄫喐𢳆㧬𠍁蹆𤶸𩓥䁓𨂾睺𢰸㨴䟕𨅝𦧲𤷪擝𠵼𠾴𠳕𡃴撍蹾𠺖𠰋𠽤𢲩𨉖𤓓"],
["8a64","𠵆𩩍𨃩䟴𤺧𢳂骲㩧𩗴㿭㔆𥋇𩟔𧣈𢵄鵮頕"],
["8a76","䏙𦂥撴哣𢵌𢯊𡁷㧻𡁯"],
["8aa1","𦛚𦜖𧦠擪𥁒𠱃蹨𢆡𨭌𠜱"],
["8aac","䠋𠆩㿺塳𢶍"],
["8ab2","𤗈𠓼𦂗𠽌𠶖啹䂻䎺"],
["8abb","䪴𢩦𡂝膪飵𠶜捹㧾𢝵跀嚡摼㹃"],
["8ac9","𪘁𠸉𢫏𢳉"],
["8ace","𡃈𣧂㦒㨆𨊛㕸𥹉𢃇噒𠼱𢲲𩜠㒼氽𤸻"],
["8adf","𧕴𢺋𢈈𪙛𨳍𠹺𠰴𦠜羓𡃏𢠃𢤹㗻𥇣𠺌𠾍𠺪㾓𠼰𠵇𡅏𠹌"],
["8af6","𠺫𠮩𠵈𡃀𡄽㿹𢚖搲𠾭"],
["8b40","𣏴𧘹𢯎𠵾𠵿𢱑𢱕㨘𠺘𡃇𠼮𪘲𦭐𨳒𨶙𨳊閪哌苄喹"],
["8b55","𩻃鰦骶𧝞𢷮煀腭胬尜𦕲脴㞗卟𨂽醶𠻺𠸏𠹷𠻻㗝𤷫㘉𠳖嚯𢞵𡃉𠸐𠹸𡁸𡅈𨈇𡑕𠹹𤹐𢶤婔𡀝𡀞𡃵𡃶垜𠸑"],
["8ba1","𧚔𨋍𠾵𠹻𥅾㜃𠾶𡆀𥋘𪊽𤧚𡠺𤅷𨉼墙剨㘚𥜽箲孨䠀䬬鼧䧧鰟鮍𥭴𣄽嗻㗲嚉丨夂𡯁屮靑𠂆乛亻㔾尣彑忄㣺扌攵歺氵氺灬爫丬犭𤣩罒礻糹罓𦉪㓁"],
["8bde","𦍋耂肀𦘒𦥑卝衤见𧢲讠贝钅镸长门𨸏韦页风飞饣𩠐鱼鸟黄歯龜丷𠂇阝户钢"],
["8c40","倻淾𩱳龦㷉袏𤅎灷峵䬠𥇍㕙𥴰愢𨨲辧釶熑朙玺𣊁𪄇㲋𡦀䬐磤琂冮𨜏䀉橣𪊺䈣蘏𠩯稪𩥇𨫪靕灍匤𢁾鏴盙𨧣龧矝亣俰傼丯众龨吴綋墒壐𡶶庒庙忂𢜒斋"],
["8ca1","𣏹椙橃𣱣泿"],
["8ca7","爀𤔅玌㻛𤨓嬕璹讃𥲤𥚕窓篬糃繬苸薗龩袐龪躹龫迏蕟駠鈡龬𨶹𡐿䁱䊢娚"],
["8cc9","顨杫䉶圽"],
["8cce","藖𤥻芿𧄍䲁𦵴嵻𦬕𦾾龭龮宖龯曧繛湗秊㶈䓃𣉖𢞖䎚䔶"],
["8ce6","峕𣬚諹屸㴒𣕑嵸龲煗䕘𤃬𡸣䱷㥸㑊𠆤𦱁諌侴𠈹妿腬顖𩣺弻"],
["8d40","𠮟"],
["8d42","𢇁𨥭䄂䚻𩁹㼇龳𪆵䃸㟖䛷𦱆䅼𨚲𧏿䕭㣔𥒚䕡䔛䶉䱻䵶䗪㿈𤬏㙡䓞䒽䇭崾嵈嵖㷼㠏嶤嶹㠠㠸幂庽弥徃㤈㤔㤿㥍惗愽峥㦉憷憹懏㦸戬抐拥挘㧸嚱"],
["8da1","㨃揢揻搇摚㩋擀崕嘡龟㪗斆㪽旿晓㫲暒㬢朖㭂枤栀㭘桊梄㭲㭱㭻椉楃牜楤榟榅㮼槖㯝橥橴橱檂㯬檙㯲檫檵櫔櫶殁毁毪汵沪㳋洂洆洦涁㳯涤涱渕渘温溆𨧀溻滢滚齿滨滩漤漴㵆𣽁澁澾㵪㵵熷岙㶊瀬㶑灐灔灯灿炉𠌥䏁㗱𠻘"],
["8e40","𣻗垾𦻓焾𥟠㙎榢𨯩孴穉𥣡𩓙穥穽𥦬窻窰竂竃燑𦒍䇊竚竝竪䇯咲𥰁笋筕笩𥌎𥳾箢筯莜𥮴𦱿篐萡箒箸𥴠㶭𥱥蒒篺簆簵𥳁籄粃𤢂粦晽𤕸糉糇糦籴糳糵糎"],
["8ea1","繧䔝𦹄絝𦻖璍綉綫焵綳緒𤁗𦀩緤㴓緵𡟹緥𨍭縝𦄡𦅚繮纒䌫鑬縧罀罁罇礶𦋐駡羗𦍑羣𡙡𠁨䕜𣝦䔃𨌺翺𦒉者耈耝耨耯𪂇𦳃耻耼聡𢜔䦉𦘦𣷣𦛨朥肧𨩈脇脚墰𢛶汿𦒘𤾸擧𡒊舘𡡞橓𤩥𤪕䑺舩𠬍𦩒𣵾俹𡓽蓢荢𦬊𤦧𣔰𡝳𣷸芪椛芳䇛"],
["8f40","蕋苐茚𠸖𡞴㛁𣅽𣕚艻苢茘𣺋𦶣𦬅𦮗𣗎㶿茝嗬莅䔋𦶥莬菁菓㑾𦻔橗蕚㒖𦹂𢻯葘𥯤葱㷓䓤檧葊𣲵祘蒨𦮖𦹷𦹃蓞萏莑䒠蒓蓤𥲑䉀𥳀䕃蔴嫲𦺙䔧蕳䔖枿蘖"],
["8fa1","𨘥𨘻藁𧂈蘂𡖂𧃍䕫䕪蘨㙈𡢢号𧎚虾蝱𪃸蟮𢰧螱蟚蠏噡虬桖䘏衅衆𧗠𣶹𧗤衞袜䙛袴袵揁装睷𧜏覇覊覦覩覧覼𨨥觧𧤤𧪽誜瞓釾誐𧩙竩𧬺𣾏䜓𧬸煼謌謟𥐰𥕥謿譌譍誩𤩺讐讛誯𡛟䘕衏貛𧵔𧶏貫㜥𧵓賖𧶘𧶽贒贃𡤐賛灜贑𤳉㻐起"],
["9040","趩𨀂𡀔𤦊㭼𨆼𧄌竧躭躶軃鋔輙輭𨍥𨐒辥錃𪊟𠩐辳䤪𨧞𨔽𣶻廸𣉢迹𪀔𨚼𨔁𢌥㦀𦻗逷𨔼𧪾遡𨕬𨘋邨𨜓郄𨛦邮都酧㫰醩釄粬𨤳𡺉鈎沟鉁鉢𥖹銹𨫆𣲛𨬌𥗛"],
["90a1","𠴱錬鍫𨫡𨯫炏嫃𨫢𨫥䥥鉄𨯬𨰹𨯿鍳鑛躼閅閦鐦閠濶䊹𢙺𨛘𡉼𣸮䧟氜陻隖䅬隣𦻕懚隶磵𨫠隽双䦡𦲸𠉴𦐐𩂯𩃥𤫑𡤕𣌊霱虂霶䨏䔽䖅𤫩灵孁霛靜𩇕靗孊𩇫靟鐥僐𣂷𣂼鞉鞟鞱鞾韀韒韠𥑬韮琜𩐳響韵𩐝𧥺䫑頴頳顋顦㬎𧅵㵑𠘰𤅜"],
["9140","𥜆飊颷飈飇䫿𦴧𡛓喰飡飦飬鍸餹𤨩䭲𩡗𩤅駵騌騻騐驘𥜥㛄𩂱𩯕髠髢𩬅髴䰎鬔鬭𨘀倴鬴𦦨㣃𣁽魐魀𩴾婅𡡣鮎𤉋鰂鯿鰌𩹨鷔𩾷𪆒𪆫𪃡𪄣𪇟鵾鶃𪄴鸎梈"],
["91a1","鷄𢅛𪆓𪈠𡤻𪈳鴹𪂹𪊴麐麕麞麢䴴麪麯𤍤黁㭠㧥㴝伲㞾𨰫鼂鼈䮖鐤𦶢鼗鼖鼹嚟嚊齅馸𩂋韲葿齢齩竜龎爖䮾𤥵𤦻煷𤧸𤍈𤩑玞𨯚𡣺禟𨥾𨸶鍩鏳𨩄鋬鎁鏋𨥬𤒹爗㻫睲穃烐𤑳𤏸煾𡟯炣𡢾𣖙㻇𡢅𥐯𡟸㜢𡛻𡠹㛡𡝴𡣑𥽋㜣𡛀坛𤨥𡏾𡊨"],
["9240","𡏆𡒶蔃𣚦蔃葕𤦔𧅥𣸱𥕜𣻻𧁒䓴𣛮𩦝𦼦柹㜳㰕㷧塬𡤢栐䁗𣜿𤃡𤂋𤄏𦰡哋嚞𦚱嚒𠿟𠮨𠸍鏆𨬓鎜仸儫㠙𤐶亼𠑥𠍿佋侊𥙑婨𠆫𠏋㦙𠌊𠐔㐵伩𠋀𨺳𠉵諚𠈌亘"],
["92a1","働儍侢伃𤨎𣺊佂倮偬傁俌俥偘僼兙兛兝兞湶𣖕𣸹𣺿浲𡢄𣺉冨凃𠗠䓝𠒣𠒒𠒑赺𨪜𠜎剙劤𠡳勡鍮䙺熌𤎌𠰠𤦬𡃤槑𠸝瑹㻞璙琔瑖玘䮎𤪼𤂍叐㖄爏𤃉喴𠍅响𠯆圝鉝雴鍦埝垍坿㘾壋媙𨩆𡛺𡝯𡜐娬妸銏婾嫏娒𥥆𡧳𡡡𤊕㛵洅瑃娡𥺃"],
["9340","媁𨯗𠐓鏠璌𡌃焅䥲鐈𨧻鎽㞠尞岞幞幈𡦖𡥼𣫮廍孏𡤃𡤄㜁𡢠㛝𡛾㛓脪𨩇𡶺𣑲𨦨弌弎𡤧𡞫婫𡜻孄蘔𧗽衠恾𢡠𢘫忛㺸𢖯𢖾𩂈𦽳懀𠀾𠁆𢘛憙憘恵𢲛𢴇𤛔𩅍"],
["93a1","摱𤙥𢭪㨩𢬢𣑐𩣪𢹸挷𪑛撶挱揑𤧣𢵧护𢲡搻敫楲㯴𣂎𣊭𤦉𣊫唍𣋠𡣙𩐿曎𣊉𣆳㫠䆐𥖄𨬢𥖏𡛼𥕛𥐥磮𣄃𡠪𣈴㑤𣈏𣆂𤋉暎𦴤晫䮓昰𧡰𡷫晣𣋒𣋡昞𥡲㣑𣠺𣞼㮙𣞢𣏾瓐㮖枏𤘪梶栞㯄檾㡣𣟕𤒇樳橒櫉欅𡤒攑梘橌㯗橺歗𣿀𣲚鎠鋲𨯪𨫋"],
["9440","銉𨀞𨧜鑧涥漋𤧬浧𣽿㶏渄𤀼娽渊塇洤硂焻𤌚𤉶烱牐犇犔𤞏𤜥兹𤪤𠗫瑺𣻸𣙟𤩊𤤗𥿡㼆㺱𤫟𨰣𣼵悧㻳瓌琼鎇琷䒟𦷪䕑疃㽣𤳙𤴆㽘畕癳𪗆㬙瑨𨫌𤦫𤦎㫻"],
["94a1","㷍𤩎㻿𤧅𤣳釺圲鍂𨫣𡡤僟𥈡𥇧睸𣈲眎眏睻𤚗𣞁㩞𤣰琸璛㺿𤪺𤫇䃈𤪖𦆮錇𥖁砞碍碈磒珐祙𧝁𥛣䄎禛蒖禥樭𣻺稺秴䅮𡛦䄲鈵秱𠵌𤦌𠊙𣶺𡝮㖗啫㕰㚪𠇔𠰍竢婙𢛵𥪯𥪜娍𠉛磰娪𥯆竾䇹籝籭䈑𥮳𥺼𥺦糍𤧹𡞰粎籼粮檲緜縇緓罎𦉡"],
["9540","𦅜𧭈綗𥺂䉪𦭵𠤖柖𠁎𣗏埄𦐒𦏸𤥢翝笧𠠬𥫩𥵃笌𥸎駦虅驣樜𣐿㧢𤧷𦖭騟𦖠蒀𧄧𦳑䓪脷䐂胆脉腂𦞴飃𦩂艢艥𦩑葓𦶧蘐𧈛媆䅿𡡀嬫𡢡嫤𡣘蚠蜨𣶏蠭𧐢娂"],
["95a1","衮佅袇袿裦襥襍𥚃襔𧞅𧞄𨯵𨯙𨮜𨧹㺭蒣䛵䛏㟲訽訜𩑈彍鈫𤊄旔焩烄𡡅鵭貟賩𧷜妚矃姰䍮㛔踪躧𤰉輰轊䋴汘澻𢌡䢛潹溋𡟚鯩㚵𤤯邻邗啱䤆醻鐄𨩋䁢𨫼鐧𨰝𨰻蓥訫閙閧閗閖𨴴瑅㻂𤣿𤩂𤏪㻧𣈥随𨻧𨹦𨹥㻌𤧭𤩸𣿮琒瑫㻼靁𩂰"],
["9640","桇䨝𩂓𥟟靝鍨𨦉𨰦𨬯𦎾銺嬑譩䤼珹𤈛鞛靱餸𠼦巁𨯅𤪲頟𩓚鋶𩗗釥䓀𨭐𤩧𨭤飜𨩅㼀鈪䤥萔餻饍𧬆㷽馛䭯馪驜𨭥𥣈檏騡嫾騯𩣱䮐𩥈馼䮽䮗鍽塲𡌂堢𤦸"],
["96a1","𡓨硄𢜟𣶸棅㵽鑘㤧慐𢞁𢥫愇鱏鱓鱻鰵鰐魿鯏𩸭鮟𪇵𪃾鴡䲮𤄄鸘䲰鴌𪆴𪃭𪃳𩤯鶥蒽𦸒𦿟𦮂藼䔳𦶤𦺄𦷰萠藮𦸀𣟗𦁤秢𣖜𣙀䤭𤧞㵢鏛銾鍈𠊿碹鉷鑍俤㑀遤𥕝砽硔碶硋𡝗𣇉𤥁㚚佲濚濙瀞瀞吔𤆵垻壳垊鴖埗焴㒯𤆬燫𦱀𤾗嬨𡞵𨩉"],
["9740","愌嫎娋䊼𤒈㜬䭻𨧼鎻鎸𡣖𠼝葲𦳀𡐓𤋺𢰦𤏁妔𣶷𦝁綨𦅛𦂤𤦹𤦋𨧺鋥珢㻩璴𨭣𡢟㻡𤪳櫘珳珻㻖𤨾𤪔𡟙𤩦𠎧𡐤𤧥瑈𤤖炥𤥶銄珦鍟𠓾錱𨫎𨨖鎆𨯧𥗕䤵𨪂煫"],
["97a1","𤥃𠳿嚤𠘚𠯫𠲸唂秄𡟺緾𡛂𤩐𡡒䔮鐁㜊𨫀𤦭妰𡢿𡢃𧒄媡㛢𣵛㚰鉟婹𨪁𡡢鍴㳍𠪴䪖㦊僴㵩㵌𡎜煵䋻𨈘渏𩃤䓫浗𧹏灧沯㳖𣿭𣸭渂漌㵯𠏵畑㚼㓈䚀㻚䡱姄鉮䤾轁𨰜𦯀堒埈㛖𡑒烾𤍢𤩱𢿣𡊰𢎽梹楧𡎘𣓥𧯴𣛟𨪃𣟖𣏺𤲟樚𣚭𦲷萾䓟䓎"],
["9840","𦴦𦵑𦲂𦿞漗𧄉茽𡜺菭𦲀𧁓𡟛妉媂𡞳婡婱𡤅𤇼㜭姯𡜼㛇熎鎐暚𤊥婮娫𤊓樫𣻹𧜶𤑛𤋊焝𤉙𨧡侰𦴨峂𤓎𧹍𤎽樌𤉖𡌄炦焳𤏩㶥泟勇𤩏繥姫崯㷳彜𤩝𡟟綤萦"],
["98a1","咅𣫺𣌀𠈔坾𠣕𠘙㿥𡾞𪊶瀃𩅛嵰玏糓𨩙𩐠俈翧狍猐𧫴猸猹𥛶獁獈㺩𧬘遬燵𤣲珡臶㻊県㻑沢国琙琞琟㻢㻰㻴㻺瓓㼎㽓畂畭畲疍㽼痈痜㿀癍㿗癴㿜発𤽜熈嘣覀塩䀝睃䀹条䁅㗛瞘䁪䁯属瞾矋売砘点砜䂨砹硇硑硦葈𥔵礳栃礲䄃"],
["9940","䄉禑禙辻稆込䅧窑䆲窼艹䇄竏竛䇏両筢筬筻簒簛䉠䉺类粜䊌粸䊔糭输烀𠳏総緔緐緽羮羴犟䎗耠耥笹耮耱联㷌垴炠肷胩䏭脌猪脎脒畠脔䐁㬹腖腙腚"],
["99a1","䐓堺腼膄䐥膓䐭膥埯臁臤艔䒏芦艶苊苘苿䒰荗险榊萅烵葤惣蒈䔄蒾蓡蓸蔐蔸蕒䔻蕯蕰藠䕷虲蚒蚲蛯际螋䘆䘗袮裿褤襇覑𧥧訩訸誔誴豑賔賲贜䞘塟跃䟭仮踺嗘坔蹱嗵躰䠷軎転軤軭軲辷迁迊迌逳駄䢭飠鈓䤞鈨鉘鉫銱銮銿"],
["9a40","鋣鋫鋳鋴鋽鍃鎄鎭䥅䥑麿鐗匁鐝鐭鐾䥪鑔鑹锭関䦧间阳䧥枠䨤靀䨵鞲韂噔䫤惨颹䬙飱塄餎餙冴餜餷饂饝饢䭰駅䮝騼鬏窃魩鮁鯝鯱鯴䱭鰠㝯𡯂鵉鰺"],
["9aa1","黾噐鶓鶽鷀鷼银辶鹻麬麱麽黆铜黢黱黸竈齄𠂔𠊷𠎠椚铃妬𠓗塀铁㞹𠗕𠘕𠙶𡚺块煳𠫂𠫍𠮿呪吆𠯋咞𠯻𠰻𠱓𠱥𠱼惧𠲍噺𠲵𠳝𠳭𠵯𠶲𠷈楕鰯螥𠸄𠸎𠻗𠾐𠼭𠹳尠𠾼帋𡁜𡁏𡁶朞𡁻𡂈𡂖㙇𡂿𡃓𡄯𡄻卤蒭𡋣𡍵𡌶讁𡕷𡘙𡟃𡟇乸炻𡠭𡥪"],
["9b40","𡨭𡩅𡰪𡱰𡲬𡻈拃𡻕𡼕熘桕𢁅槩㛈𢉼𢏗𢏺𢜪𢡱𢥏苽𢥧𢦓𢫕覥𢫨辠𢬎鞸𢬿顇骽𢱌"],
["9b62","𢲈𢲷𥯨𢴈𢴒𢶷𢶕𢹂𢽴𢿌𣀳𣁦𣌟𣏞徱晈暿𧩹𣕧𣗳爁𤦺矗𣘚𣜖纇𠍆墵朎"],
["9ba1","椘𣪧𧙗𥿢𣸑𣺹𧗾𢂚䣐䪸𤄙𨪚𤋮𤌍𤀻𤌴𤎖𤩅𠗊凒𠘑妟𡺨㮾𣳿𤐄𤓖垈𤙴㦛𤜯𨗨𩧉㝢𢇃譞𨭎駖𤠒𤣻𤨕爉𤫀𠱸奥𤺥𤾆𠝹軚𥀬劏圿煱𥊙𥐙𣽊𤪧喼𥑆𥑮𦭒釔㑳𥔿𧘲𥕞䜘𥕢𥕦𥟇𤤿𥡝偦㓻𣏌惞𥤃䝼𨥈𥪮𥮉𥰆𡶐垡煑澶𦄂𧰒遖𦆲𤾚譢𦐂𦑊"],
["9c40","嵛𦯷輶𦒄𡤜諪𤧶𦒈𣿯𦔒䯀𦖿𦚵𢜛鑥𥟡憕娧晉侻嚹𤔡𦛼乪𤤴陖涏𦲽㘘襷𦞙𦡮𦐑𦡞營𦣇筂𩃀𠨑𦤦鄄𦤹穅鷰𦧺騦𦨭㙟𦑩𠀡禃𦨴𦭛崬𣔙菏𦮝䛐𦲤画补𦶮墶"],
["9ca1","㜜𢖍𧁋𧇍㱔𧊀𧊅銁𢅺𧊋錰𧋦𤧐氹钟𧑐𠻸蠧裵𢤦𨑳𡞱溸𤨪𡠠㦤㚹尐秣䔿暶𩲭𩢤襃𧟌𧡘囖䃟𡘊㦡𣜯𨃨𡏅熭荦𧧝𩆨婧䲷𧂯𨦫𧧽𧨊𧬋𧵦𤅺筃祾𨀉澵𪋟樃𨌘厢𦸇鎿栶靝𨅯𨀣𦦵𡏭𣈯𨁈嶅𨰰𨂃圕頣𨥉嶫𤦈斾槕叒𤪥𣾁㰑朶𨂐𨃴𨄮𡾡𨅏"],
["9d40","𨆉𨆯𨈚𨌆𨌯𨎊㗊𨑨𨚪䣺揦𨥖砈鉕𨦸䏲𨧧䏟𨧨𨭆𨯔姸𨰉輋𨿅𩃬筑𩄐𩄼㷷𩅞𤫊运犏嚋𩓧𩗩𩖰𩖸𩜲𩣑𩥉𩥪𩧃𩨨𩬎𩵚𩶛纟𩻸𩼣䲤镇𪊓熢𪋿䶑递𪗋䶜𠲜达嗁"],
["9da1","辺𢒰边𤪓䔉繿潖檱仪㓤𨬬𧢝㜺躀𡟵𨀤𨭬𨮙𧨾𦚯㷫𧙕𣲷𥘵𥥖亚𥺁𦉘嚿𠹭踎孭𣺈𤲞揞拐𡟶𡡻攰嘭𥱊吚𥌑㷆𩶘䱽嘢嘞罉𥻘奵𣵀蝰东𠿪𠵉𣚺脗鵞贘瘻鱅癎瞹鍅吲腈苷嘥脲萘肽嗪祢噃吖𠺝㗎嘅嗱曱𨋢㘭甴嗰喺咗啲𠱁𠲖廐𥅈𠹶𢱢"],
["9e40","𠺢麫絚嗞𡁵抝靭咔賍燶酶揼掹揾啩𢭃鱲𢺳冚㓟𠶧冧呍唞唓癦踭𦢊疱肶蠄螆裇膶萜𡃁䓬猄𤜆宐茋𦢓噻𢛴𧴯𤆣𧵳𦻐𧊶酰𡇙鈈𣳼𪚩𠺬𠻹牦𡲢䝎𤿂𧿹𠿫䃺"],
["9ea1","鱝攟𢶠䣳𤟠𩵼𠿬𠸊恢𧖣𠿭"],
["9ead","𦁈𡆇熣纎鵐业丄㕷嬍沲卧㚬㧜卽㚥𤘘墚𤭮舭呋垪𥪕𠥹"],
["9ec5","㩒𢑥獴𩺬䴉鯭𣳾𩼰䱛𤾩𩖞𩿞葜𣶶𧊲𦞳𣜠挮紥𣻷𣸬㨪逈勌㹴㙺䗩𠒎癀嫰𠺶硺𧼮墧䂿噼鮋嵴癔𪐴麅䳡痹㟻愙𣃚𤏲"],
["9ef5","噝𡊩垧𤥣𩸆刴𧂮㖭汊鵼"],
["9f40","籖鬹埞𡝬屓擓𩓐𦌵𧅤蚭𠴨𦴢𤫢𠵱"],
["9f4f","凾𡼏嶎霃𡷑麁遌笟鬂峑箣扨挵髿篏鬪籾鬮籂粆鰕篼鬉鼗鰛𤤾齚啳寃俽麘俲剠㸆勑坧偖妷帒韈鶫轜呩鞴饀鞺匬愰"],
["9fa1","椬叚鰊鴂䰻陁榀傦畆𡝭駚剳"],
["9fae","酙隁酜"],
["9fb2","酑𨺗捿𦴣櫊嘑醎畺抅𠏼獏籰𥰡𣳽"],
["9fc1","𤤙盖鮝个𠳔莾衂"],
["9fc9","届槀僭坺刟巵从氱𠇲伹咜哚劚趂㗾弌㗳"],
["9fdb","歒酼龥鮗頮颴骺麨麄煺笔"],
["9fe7","毺蠘罸"],
["9feb","嘠𪙊蹷齓"],
["9ff0","跔蹏鸜踁抂𨍽踨蹵竓𤩷稾磘泪詧瘇"],
["a040","𨩚鼦泎蟖痃𪊲硓咢贌狢獱謭猂瓱賫𤪻蘯徺袠䒷"],
["a055","𡠻𦸅"],
["a058","詾𢔛"],
["a05b","惽癧髗鵄鍮鮏蟵"],
["a063","蠏賷猬霡鮰㗖犲䰇籑饊𦅙慙䰄麖慽"],
["a073","坟慯抦戹拎㩜懢厪𣏵捤栂㗒"],
["a0a1","嵗𨯂迚𨸹"],
["a0a6","僙𡵆礆匲阸𠼻䁥"],
["a0ae","矾"],
["a0b0","糂𥼚糚稭聦聣絍甅瓲覔舚朌聢𧒆聛瓰脃眤覉𦟌畓𦻑螩蟎臈螌詉貭譃眫瓸蓚㘵榲趦"],
["a0d4","覩瑨涹蟁𤀑瓧㷛煶悤憜㳑煢恷"],
["a0e2","罱𨬭牐惩䭾删㰘𣳇𥻗𧙖𥔱𡥄𡋾𩤃𦷜𧂭峁𦆭𨨏𣙷𠃮𦡆𤼎䕢嬟𦍌齐麦𦉫"],
["a3c0","␀",31,"␡"],
["c6a1","①",9,"⑴",9,"ⅰ",9,"丶丿亅亠冂冖冫勹匸卩厶夊宀巛⼳广廴彐彡攴无疒癶辵隶¨ˆヽヾゝゞ〃仝々〆〇ー［］✽ぁ",23],
["c740","す",58,"ァアィイ"],
["c7a1","ゥ",81,"А",5,"ЁЖ",4],
["c840","Л",26,"ёж",25,"⇧↸↹㇏𠃌乚𠂊刂䒑"],
["c8a1","龰冈龱𧘇"],
["c8cd","￢￤＇＂㈱№℡゛゜⺀⺄⺆⺇⺈⺊⺌⺍⺕⺜⺝⺥⺧⺪⺬⺮⺶⺼⺾⻆⻊⻌⻍⻏⻖⻗⻞⻣"],
["c8f5","ʃɐɛɔɵœøŋʊɪ"],
["f9fe","￭"],
["fa40","𠕇鋛𠗟𣿅蕌䊵珯况㙉𤥂𨧤鍄𡧛苮𣳈砼杄拟𤤳𨦪𠊠𦮳𡌅侫𢓭倈𦴩𧪄𣘀𤪱𢔓倩𠍾徤𠎀𠍇滛𠐟偽儁㑺儎顬㝃萖𤦤𠒇兠𣎴兪𠯿𢃼𠋥𢔰𠖎𣈳𡦃宂蝽𠖳𣲙冲冸"],
["faa1","鴴凉减凑㳜凓𤪦决凢卂凭菍椾𣜭彻刋刦刼劵剗劔効勅簕蕂勠蘍𦬓包𨫞啉滙𣾀𠥔𣿬匳卄𠯢泋𡜦栛珕恊㺪㣌𡛨燝䒢卭却𨚫卾卿𡖖𡘓矦厓𨪛厠厫厮玧𥝲㽙玜叁叅汉义埾叙㪫𠮏叠𣿫𢶣叶𠱷吓灹唫晗浛呭𦭓𠵴啝咏咤䞦𡜍𠻝㶴𠵍"],
["fb40","𨦼𢚘啇䳭启琗喆喩嘅𡣗𤀺䕒𤐵暳𡂴嘷曍𣊊暤暭噍噏磱囱鞇叾圀囯园𨭦㘣𡉏坆𤆥汮炋坂㚱𦱾埦𡐖堃𡑔𤍣堦𤯵塜墪㕡壠壜𡈼壻寿坃𪅐𤉸鏓㖡够梦㛃湙"],
["fba1","𡘾娤啓𡚒蔅姉𠵎𦲁𦴪𡟜姙𡟻𡞲𦶦浱𡠨𡛕姹𦹅媫婣㛦𤦩婷㜈媖瑥嫓𦾡𢕔㶅𡤑㜲𡚸広勐孶斈孼𧨎䀄䡝𠈄寕慠𡨴𥧌𠖥寳宝䴐尅𡭄尓珎尔𡲥𦬨屉䣝岅峩峯嶋𡷹𡸷崐崘嵆𡺤岺巗苼㠭𤤁𢁉𢅳芇㠶㯂帮檊幵幺𤒼𠳓厦亷廐厨𡝱帉廴𨒂"],
["fc40","廹廻㢠廼栾鐛弍𠇁弢㫞䢮𡌺强𦢈𢏐彘𢑱彣鞽𦹮彲鍀𨨶徧嶶㵟𥉐𡽪𧃸𢙨釖𠊞𨨩怱暅𡡷㥣㷇㘹垐𢞴祱㹀悞悤悳𤦂𤦏𧩓璤僡媠慤萤慂慈𦻒憁凴𠙖憇宪𣾷"],
["fca1","𢡟懓𨮝𩥝懐㤲𢦀𢣁怣慜攞掋𠄘担𡝰拕𢸍捬𤧟㨗搸揸𡎎𡟼撐澊𢸶頔𤂌𥜝擡擥鑻㩦携㩗敍漖𤨨𤨣斅敭敟𣁾斵𤥀䬷旑䃘𡠩无旣忟𣐀昘𣇷𣇸晄𣆤𣆥晋𠹵晧𥇦晳晴𡸽𣈱𨗴𣇈𥌓矅𢣷馤朂𤎜𤨡㬫槺𣟂杞杧杢𤇍𩃭柗䓩栢湐鈼栁𣏦𦶠桝"],
["fd40","𣑯槡樋𨫟楳棃𣗍椁椀㴲㨁𣘼㮀枬楡𨩊䋼椶榘㮡𠏉荣傐槹𣙙𢄪橅𣜃檝㯳枱櫈𩆜㰍欝𠤣惞欵歴𢟍溵𣫛𠎵𡥘㝀吡𣭚毡𣻼毜氷𢒋𤣱𦭑汚舦汹𣶼䓅𣶽𤆤𤤌𤤀"],
["fda1","𣳉㛥㳫𠴲鮃𣇹𢒑羏样𦴥𦶡𦷫涖浜湼漄𤥿𤂅𦹲蔳𦽴凇沜渝萮𨬡港𣸯瑓𣾂秌湏媑𣁋濸㜍澝𣸰滺𡒗𤀽䕕鏰潄潜㵎潴𩅰㴻澟𤅄濓𤂑𤅕𤀹𣿰𣾴𤄿凟𤅖𤅗𤅀𦇝灋灾炧炁烌烕烖烟䄄㷨熴熖𤉷焫煅媈煊煮岜𤍥煏鍢𤋁焬𤑚𤨧𤨢熺𨯨炽爎"],
["fe40","鑂爕夑鑃爤鍁𥘅爮牀𤥴梽牕牗㹕𣁄栍漽犂猪猫𤠣𨠫䣭𨠄猨献珏玪𠰺𦨮珉瑉𤇢𡛧𤨤昣㛅𤦷𤦍𤧻珷琕椃𤨦琹𠗃㻗瑜𢢭瑠𨺲瑇珤瑶莹瑬㜰瑴鏱樬璂䥓𤪌"],
["fea1","𤅟𤩹𨮏孆𨰃𡢞瓈𡦈甎瓩甞𨻙𡩋寗𨺬鎅畍畊畧畮𤾂㼄𤴓疎瑝疞疴瘂瘬癑癏癯癶𦏵皐臯㟸𦤑𦤎皡皥皷盌𦾟葢𥂝𥅽𡸜眞眦着撯𥈠睘𣊬瞯𨥤𨥨𡛁矴砉𡍶𤨒棊碯磇磓隥礮𥗠磗礴碱𧘌辸袄𨬫𦂃𢘜禆褀椂禀𥡗禝𧬹礼禩渪𧄦㺨秆𩄍秔"]
]
[
["0","\u0000",127,"€"],
["8140","丂丄丅丆丏丒丗丟丠両丣並丩丮丯丱丳丵丷丼乀乁乂乄乆乊乑乕乗乚乛乢乣乤乥乧乨乪",5,"乲乴",9,"乿",6,"亇亊"],
["8180","亐亖亗亙亜亝亞亣亪亯亰亱亴亶亷亸亹亼亽亾仈仌仏仐仒仚仛仜仠仢仦仧仩仭仮仯仱仴仸仹仺仼仾伀伂",6,"伋伌伒",4,"伜伝伡伣伨伩伬伭伮伱伳伵伷伹伻伾",4,"佄佅佇",5,"佒佔佖佡佢佦佨佪佫佭佮佱佲併佷佸佹佺佽侀侁侂侅來侇侊侌侎侐侒侓侕侖侘侙侚侜侞侟価侢"],
["8240","侤侫侭侰",4,"侶",8,"俀俁係俆俇俈俉俋俌俍俒",4,"俙俛俠俢俤俥俧俫俬俰俲俴俵俶俷俹俻俼俽俿",11],
["8280","個倎倐們倓倕倖倗倛倝倞倠倢倣値倧倫倯",10,"倻倽倿偀偁偂偄偅偆偉偊偋偍偐",4,"偖偗偘偙偛偝",7,"偦",5,"偭",8,"偸偹偺偼偽傁傂傃傄傆傇傉傊傋傌傎",20,"傤傦傪傫傭",4,"傳",6,"傼"],
["8340","傽",17,"僐",5,"僗僘僙僛",10,"僨僩僪僫僯僰僱僲僴僶",4,"僼",9,"儈"],
["8380","儉儊儌",5,"儓",13,"儢",28,"兂兇兊兌兎兏児兒兓兗兘兙兛兝",4,"兣兤兦內兩兪兯兲兺兾兿冃冄円冇冊冋冎冏冐冑冓冔冘冚冝冞冟冡冣冦",4,"冭冮冴冸冹冺冾冿凁凂凃凅凈凊凍凎凐凒",5],
["8440","凘凙凚凜凞凟凢凣凥",5,"凬凮凱凲凴凷凾刄刅刉刋刌刏刐刓刔刕刜刞刟刡刢刣別刦刧刪刬刯刱刲刴刵刼刾剄",5,"剋剎剏剒剓剕剗剘"],
["8480","剙剚剛剝剟剠剢剣剤剦剨剫剬剭剮剰剱剳",9,"剾劀劃",4,"劉",6,"劑劒劔",6,"劜劤劥劦劧劮劯劰労",9,"勀勁勂勄勅勆勈勊勌勍勎勏勑勓勔動勗務",5,"勠勡勢勣勥",10,"勱",7,"勻勼勽匁匂匃匄匇匉匊匋匌匎"],
["8540","匑匒匓匔匘匛匜匞匟匢匤匥匧匨匩匫匬匭匯",9,"匼匽區卂卄卆卋卌卍卐協単卙卛卝卥卨卪卬卭卲卶卹卻卼卽卾厀厁厃厇厈厊厎厏"],
["8580","厐",4,"厖厗厙厛厜厞厠厡厤厧厪厫厬厭厯",6,"厷厸厹厺厼厽厾叀參",4,"収叏叐叒叓叕叚叜叝叞叡叢叧叴叺叾叿吀吂吅吇吋吔吘吙吚吜吢吤吥吪吰吳吶吷吺吽吿呁呂呄呅呇呉呌呍呎呏呑呚呝",4,"呣呥呧呩",7,"呴呹呺呾呿咁咃咅咇咈咉咊咍咑咓咗咘咜咞咟咠咡"],
["8640","咢咥咮咰咲咵咶咷咹咺咼咾哃哅哊哋哖哘哛哠",4,"哫哬哯哰哱哴",5,"哻哾唀唂唃唄唅唈唊",4,"唒唓唕",5,"唜唝唞唟唡唥唦"],
["8680","唨唩唫唭唲唴唵唶唸唹唺唻唽啀啂啅啇啈啋",4,"啑啒啓啔啗",4,"啝啞啟啠啢啣啨啩啫啯",5,"啹啺啽啿喅喆喌喍喎喐喒喓喕喖喗喚喛喞喠",6,"喨",8,"喲喴営喸喺喼喿",4,"嗆嗇嗈嗊嗋嗎嗏嗐嗕嗗",4,"嗞嗠嗢嗧嗩嗭嗮嗰嗱嗴嗶嗸",4,"嗿嘂嘃嘄嘅"],
["8740","嘆嘇嘊嘋嘍嘐",7,"嘙嘚嘜嘝嘠嘡嘢嘥嘦嘨嘩嘪嘫嘮嘯嘰嘳嘵嘷嘸嘺嘼嘽嘾噀",11,"噏",4,"噕噖噚噛噝",4],
["8780","噣噥噦噧噭噮噯噰噲噳噴噵噷噸噹噺噽",7,"嚇",6,"嚐嚑嚒嚔",14,"嚤",10,"嚰",6,"嚸嚹嚺嚻嚽",12,"囋",8,"囕囖囘囙囜団囥",5,"囬囮囯囲図囶囷囸囻囼圀圁圂圅圇國",6],
["8840","園",9,"圝圞圠圡圢圤圥圦圧圫圱圲圴",4,"圼圽圿坁坃坄坅坆坈坉坋坒",4,"坘坙坢坣坥坧坬坮坰坱坲坴坵坸坹坺坽坾坿垀"],
["8880","垁垇垈垉垊垍",4,"垔",6,"垜垝垞垟垥垨垪垬垯垰垱垳垵垶垷垹",8,"埄",6,"埌埍埐埑埓埖埗埛埜埞埡埢埣埥",7,"埮埰埱埲埳埵埶執埻埼埾埿堁堃堄堅堈堉堊堌堎堏堐堒堓堔堖堗堘堚堛堜堝堟堢堣堥",4,"堫",4,"報堲堳場堶",7],
["8940","堾",5,"塅",6,"塎塏塐塒塓塕塖塗塙",4,"塟",5,"塦",4,"塭",16,"塿墂墄墆墇墈墊墋墌"],
["8980","墍",4,"墔",4,"墛墜墝墠",7,"墪",17,"墽墾墿壀壂壃壄壆",10,"壒壓壔壖",13,"壥",5,"壭壯壱売壴壵壷壸壺",7,"夃夅夆夈",4,"夎夐夑夒夓夗夘夛夝夞夠夡夢夣夦夨夬夰夲夳夵夶夻"],
["8a40","夽夾夿奀奃奅奆奊奌奍奐奒奓奙奛",4,"奡奣奤奦",12,"奵奷奺奻奼奾奿妀妅妉妋妌妎妏妐妑妔妕妘妚妛妜妝妟妠妡妢妦"],
["8a80","妧妬妭妰妱妳",5,"妺妼妽妿",6,"姇姈姉姌姍姎姏姕姖姙姛姞",4,"姤姦姧姩姪姫姭",11,"姺姼姽姾娀娂娊娋娍娎娏娐娒娔娕娖娗娙娚娛娝娞娡娢娤娦娧娨娪",6,"娳娵娷",4,"娽娾娿婁",4,"婇婈婋",9,"婖婗婘婙婛",5],
["8b40","婡婣婤婥婦婨婩婫",8,"婸婹婻婼婽婾媀",17,"媓",6,"媜",13,"媫媬"],
["8b80","媭",4,"媴媶媷媹",4,"媿嫀嫃",5,"嫊嫋嫍",4,"嫓嫕嫗嫙嫚嫛嫝嫞嫟嫢嫤嫥嫧嫨嫪嫬",4,"嫲",22,"嬊",11,"嬘",25,"嬳嬵嬶嬸",7,"孁",6],
["8c40","孈",7,"孒孖孞孠孡孧孨孫孭孮孯孲孴孶孷學孹孻孼孾孿宂宆宊宍宎宐宑宒宔宖実宧宨宩宬宭宮宯宱宲宷宺宻宼寀寁寃寈寉寊寋寍寎寏"],
["8c80","寑寔",8,"寠寢寣實寧審",4,"寯寱",6,"寽対尀専尃尅將專尋尌對導尐尒尓尗尙尛尞尟尠尡尣尦尨尩尪尫尭尮尯尰尲尳尵尶尷屃屄屆屇屌屍屒屓屔屖屗屘屚屛屜屝屟屢層屧",6,"屰屲",6,"屻屼屽屾岀岃",4,"岉岊岋岎岏岒岓岕岝",4,"岤",4],
["8d40","岪岮岯岰岲岴岶岹岺岻岼岾峀峂峃峅",5,"峌",5,"峓",5,"峚",6,"峢峣峧峩峫峬峮峯峱",9,"峼",4],
["8d80","崁崄崅崈",5,"崏",4,"崕崗崘崙崚崜崝崟",4,"崥崨崪崫崬崯",4,"崵",7,"崿",7,"嵈嵉嵍",10,"嵙嵚嵜嵞",10,"嵪嵭嵮嵰嵱嵲嵳嵵",12,"嶃",21,"嶚嶛嶜嶞嶟嶠"],
["8e40","嶡",21,"嶸",12,"巆",6,"巎",12,"巜巟巠巣巤巪巬巭"],
["8e80","巰巵巶巸",4,"巿帀帄帇帉帊帋帍帎帒帓帗帞",7,"帨",4,"帯帰帲",4,"帹帺帾帿幀幁幃幆",5,"幍",6,"幖",4,"幜幝幟幠幣",14,"幵幷幹幾庁庂広庅庈庉庌庍庎庒庘庛庝庡庢庣庤庨",4,"庮",4,"庴庺庻庼庽庿",6],
["8f40","廆廇廈廋",5,"廔廕廗廘廙廚廜",11,"廩廫",8,"廵廸廹廻廼廽弅弆弇弉弌弍弎弐弒弔弖弙弚弜弝弞弡弢弣弤"],
["8f80","弨弫弬弮弰弲",6,"弻弽弾弿彁",14,"彑彔彙彚彛彜彞彟彠彣彥彧彨彫彮彯彲彴彵彶彸彺彽彾彿徃徆徍徎徏徑従徔徖徚徛徝從徟徠徢",5,"復徫徬徯",5,"徶徸徹徺徻徾",4,"忇忈忊忋忎忓忔忕忚忛応忞忟忢忣忥忦忨忩忬忯忰忲忳忴忶忷忹忺忼怇"],
["9040","怈怉怋怌怐怑怓怗怘怚怞怟怢怣怤怬怭怮怰",4,"怶",4,"怽怾恀恄",6,"恌恎恏恑恓恔恖恗恘恛恜恞恟恠恡恥恦恮恱恲恴恵恷恾悀"],
["9080","悁悂悅悆悇悈悊悋悎悏悐悑悓悕悗悘悙悜悞悡悢悤悥悧悩悪悮悰悳悵悶悷悹悺悽",7,"惇惈惉惌",4,"惒惓惔惖惗惙惛惞惡",4,"惪惱惲惵惷惸惻",4,"愂愃愄愅愇愊愋愌愐",4,"愖愗愘愙愛愜愝愞愡愢愥愨愩愪愬",18,"慀",6],
["9140","慇慉態慍慏慐慒慓慔慖",6,"慞慟慠慡慣慤慥慦慩",6,"慱慲慳慴慶慸",18,"憌憍憏",4,"憕"],
["9180","憖",6,"憞",8,"憪憫憭",9,"憸",5,"憿懀懁懃",4,"應懌",4,"懓懕",16,"懧",13,"懶",8,"戀",5,"戇戉戓戔戙戜戝戞戠戣戦戧戨戩戫戭戯戰戱戲戵戶戸",4,"扂扄扅扆扊"],
["9240","扏扐払扖扗扙扚扜",6,"扤扥扨扱扲扴扵扷扸扺扻扽抁抂抃抅抆抇抈抋",5,"抔抙抜抝択抣抦抧抩抪抭抮抯抰抲抳抴抶抷抸抺抾拀拁"],
["9280","拃拋拏拑拕拝拞拠拡拤拪拫拰拲拵拸拹拺拻挀挃挄挅挆挊挋挌挍挏挐挒挓挔挕挗挘挙挜挦挧挩挬挭挮挰挱挳",5,"挻挼挾挿捀捁捄捇捈捊捑捒捓捔捖",7,"捠捤捥捦捨捪捫捬捯捰捲捳捴捵捸捹捼捽捾捿掁掃掄掅掆掋掍掑掓掔掕掗掙",6,"採掤掦掫掯掱掲掵掶掹掻掽掿揀"],
["9340","揁揂揃揅揇揈揊揋揌揑揓揔揕揗",6,"揟揢揤",4,"揫揬揮揯揰揱揳揵揷揹揺揻揼揾搃搄搆",4,"損搎搑搒搕",5,"搝搟搢搣搤"],
["9380","搥搧搨搩搫搮",5,"搵",4,"搻搼搾摀摂摃摉摋",6,"摓摕摖摗摙",4,"摟",7,"摨摪摫摬摮",9,"摻",6,"撃撆撈",8,"撓撔撗撘撚撛撜撝撟",4,"撥撦撧撨撪撫撯撱撲撳撴撶撹撻撽撾撿擁擃擄擆",6,"擏擑擓擔擕擖擙據"],
["9440","擛擜擝擟擠擡擣擥擧",24,"攁",7,"攊",7,"攓",4,"攙",8],
["9480","攢攣攤攦",4,"攬攭攰攱攲攳攷攺攼攽敀",4,"敆敇敊敋敍敎敐敒敓敔敗敘敚敜敟敠敡敤敥敧敨敩敪敭敮敯敱敳敵敶數",14,"斈斉斊斍斎斏斒斔斕斖斘斚斝斞斠斢斣斦斨斪斬斮斱",7,"斺斻斾斿旀旂旇旈旉旊旍旐旑旓旔旕旘",7,"旡旣旤旪旫"],
["9540","旲旳旴旵旸旹旻",4,"昁昄昅昇昈昉昋昍昐昑昒昖昗昘昚昛昜昞昡昢昣昤昦昩昪昫昬昮昰昲昳昷",4,"昽昿晀時晄",6,"晍晎晐晑晘"],
["9580","晙晛晜晝晞晠晢晣晥晧晩",4,"晱晲晳晵晸晹晻晼晽晿暀暁暃暅暆暈暉暊暋暍暎暏暐暒暓暔暕暘",4,"暞",8,"暩",4,"暯",4,"暵暶暷暸暺暻暼暽暿",25,"曚曞",7,"曧曨曪",5,"曱曵曶書曺曻曽朁朂會"],
["9640","朄朅朆朇朌朎朏朑朒朓朖朘朙朚朜朞朠",5,"朧朩朮朰朲朳朶朷朸朹朻朼朾朿杁杄杅杇杊杋杍杒杔杕杗",4,"杝杢杣杤杦杧杫杬杮東杴杶"],
["9680","杸杹杺杻杽枀枂枃枅枆枈枊枌枍枎枏枑枒枓枔枖枙枛枟枠枡枤枦枩枬枮枱枲枴枹",7,"柂柅",9,"柕柖柗柛柟柡柣柤柦柧柨柪柫柭柮柲柵",7,"柾栁栂栃栄栆栍栐栒栔栕栘",4,"栞栟栠栢",6,"栫",6,"栴栵栶栺栻栿桇桋桍桏桒桖",5],
["9740","桜桝桞桟桪桬",7,"桵桸",8,"梂梄梇",7,"梐梑梒梔梕梖梘",9,"梣梤梥梩梪梫梬梮梱梲梴梶梷梸"],
["9780","梹",6,"棁棃",5,"棊棌棎棏棐棑棓棔棖棗棙棛",4,"棡棢棤",9,"棯棲棳棴棶棷棸棻棽棾棿椀椂椃椄椆",4,"椌椏椑椓",11,"椡椢椣椥",7,"椮椯椱椲椳椵椶椷椸椺椻椼椾楀楁楃",16,"楕楖楘楙楛楜楟"],
["9840","楡楢楤楥楧楨楩楪楬業楯楰楲",4,"楺楻楽楾楿榁榃榅榊榋榌榎",5,"榖榗榙榚榝",9,"榩榪榬榮榯榰榲榳榵榶榸榹榺榼榽"],
["9880","榾榿槀槂",7,"構槍槏槑槒槓槕",5,"槜槝槞槡",11,"槮槯槰槱槳",9,"槾樀",9,"樋",11,"標",5,"樠樢",5,"権樫樬樭樮樰樲樳樴樶",6,"樿",4,"橅橆橈",7,"橑",6,"橚"],
["9940","橜",4,"橢橣橤橦",10,"橲",6,"橺橻橽橾橿檁檂檃檅",8,"檏檒",4,"檘",7,"檡",5],
["9980","檧檨檪檭",114,"欥欦欨",6],
["9a40","欯欰欱欳欴欵欶欸欻欼欽欿歀歁歂歄歅歈歊歋歍",11,"歚",7,"歨歩歫",13,"歺歽歾歿殀殅殈"],
["9a80","殌殎殏殐殑殔殕殗殘殙殜",4,"殢",7,"殫",7,"殶殸",6,"毀毃毄毆",4,"毌毎毐毑毘毚毜",4,"毢",7,"毬毭毮毰毱毲毴毶毷毸毺毻毼毾",6,"氈",4,"氎氒気氜氝氞氠氣氥氫氬氭氱氳氶氷氹氺氻氼氾氿汃汄汅汈汋",4,"汑汒汓汖汘"],
["9b40","汙汚汢汣汥汦汧汫",4,"汱汳汵汷汸決汻汼汿沀沄沇沊沋沍沎沑沒沕沖沗沘沚沜沝沞沠沢沨沬沯沰沴沵沶沷沺泀況泂泃泆泇泈泋泍泎泏泑泒泘"],
["9b80","泙泚泜泝泟泤泦泧泩泬泭泲泴泹泿洀洂洃洅洆洈洉洊洍洏洐洑洓洔洕洖洘洜洝洟",5,"洦洨洩洬洭洯洰洴洶洷洸洺洿浀浂浄浉浌浐浕浖浗浘浛浝浟浡浢浤浥浧浨浫浬浭浰浱浲浳浵浶浹浺浻浽",4,"涃涄涆涇涊涋涍涏涐涒涖",4,"涜涢涥涬涭涰涱涳涴涶涷涹",5,"淁淂淃淈淉淊"],
["9c40","淍淎淏淐淒淓淔淕淗淚淛淜淟淢淣淥淧淨淩淪淭淯淰淲淴淵淶淸淺淽",7,"渆渇済渉渋渏渒渓渕渘渙減渜渞渟渢渦渧渨渪測渮渰渱渳渵"],
["9c80","渶渷渹渻",7,"湅",7,"湏湐湑湒湕湗湙湚湜湝湞湠",10,"湬湭湯",14,"満溁溂溄溇溈溊",4,"溑",6,"溙溚溛溝溞溠溡溣溤溦溨溩溫溬溭溮溰溳溵溸溹溼溾溿滀滃滄滅滆滈滉滊滌滍滎滐滒滖滘滙滛滜滝滣滧滪",5],
["9d40","滰滱滲滳滵滶滷滸滺",7,"漃漄漅漇漈漊",4,"漐漑漒漖",9,"漡漢漣漥漦漧漨漬漮漰漲漴漵漷",6,"漿潀潁潂"],
["9d80","潃潄潅潈潉潊潌潎",9,"潙潚潛潝潟潠潡潣潤潥潧",5,"潯潰潱潳潵潶潷潹潻潽",6,"澅澆澇澊澋澏",12,"澝澞澟澠澢",4,"澨",10,"澴澵澷澸澺",5,"濁濃",5,"濊",6,"濓",10,"濟濢濣濤濥"],
["9e40","濦",7,"濰",32,"瀒",7,"瀜",6,"瀤",6],
["9e80","瀫",9,"瀶瀷瀸瀺",17,"灍灎灐",13,"灟",11,"灮灱灲灳灴灷灹灺灻災炁炂炃炄炆炇炈炋炌炍炏炐炑炓炗炘炚炛炞",12,"炰炲炴炵炶為炾炿烄烅烆烇烉烋",12,"烚"],
["9f40","烜烝烞烠烡烢烣烥烪烮烰",6,"烸烺烻烼烾",10,"焋",4,"焑焒焔焗焛",10,"焧",7,"焲焳焴"],
["9f80","焵焷",13,"煆煇煈煉煋煍煏",12,"煝煟",4,"煥煩",4,"煯煰煱煴煵煶煷煹煻煼煾",5,"熅",4,"熋熌熍熎熐熑熒熓熕熖熗熚",4,"熡",6,"熩熪熫熭",5,"熴熶熷熸熺",8,"燄",9,"燏",4],
["a040","燖",9,"燡燢燣燤燦燨",5,"燯",9,"燺",11,"爇",19],
["a080","爛爜爞",9,"爩爫爭爮爯爲爳爴爺爼爾牀",6,"牉牊牋牎牏牐牑牓牔牕牗牘牚牜牞牠牣牤牥牨牪牫牬牭牰牱牳牴牶牷牸牻牼牽犂犃犅",4,"犌犎犐犑犓",11,"犠",11,"犮犱犲犳犵犺",6,"狅狆狇狉狊狋狌狏狑狓狔狕狖狘狚狛"],
["a1a1","　、。·ˉˇ¨〃々—～‖…‘’“”〔〕〈",7,"〖〗【】±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴♂♀°′″℃＄¤￠￡‰§№☆★○●◎◇◆□■△▲※→←↑↓〓"],
["a2a1","ⅰ",9],
["a2b1","⒈",19,"⑴",19,"①",9],
["a2e5","㈠",9],
["a2f1","Ⅰ",11],
["a3a1","！＂＃￥％",88,"￣"],
["a4a1","ぁ",82],
["a5a1","ァ",85],
["a6a1","Α",16,"Σ",6],
["a6c1","α",16,"σ",6],
["a6e0","︵︶︹︺︿﹀︽︾﹁﹂﹃﹄"],
["a6ee","︻︼︷︸︱"],
["a6f4","︳︴"],
["a7a1","А",5,"ЁЖ",25],
["a7d1","а",5,"ёж",25],
["a840","ˊˋ˙–―‥‵℅℉↖↗↘↙∕∟∣≒≦≧⊿═",35,"▁",6],
["a880","█",7,"▓▔▕▼▽◢◣◤◥☉⊕〒〝〞"],
["a8a1","āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüêɑ"],
["a8bd","ńň"],
["a8c0","ɡ"],
["a8c5","ㄅ",36],
["a940","〡",8,"㊣㎎㎏㎜㎝㎞㎡㏄㏎㏑㏒㏕︰￢￤"],
["a959","℡㈱"],
["a95c","‐"],
["a960","ー゛゜ヽヾ〆ゝゞ﹉",9,"﹔﹕﹖﹗﹙",8],
["a980","﹢",4,"﹨﹩﹪﹫"],
["a996","〇"],
["a9a4","─",75],
["aa40","狜狝狟狢",5,"狪狫狵狶狹狽狾狿猀猂猄",5,"猋猌猍猏猐猑猒猔猘猙猚猟猠猣猤猦猧猨猭猯猰猲猳猵猶猺猻猼猽獀",8],
["aa80","獉獊獋獌獎獏獑獓獔獕獖獘",7,"獡",10,"獮獰獱"],
["ab40","獲",11,"獿",4,"玅玆玈玊玌玍玏玐玒玓玔玕玗玘玙玚玜玝玞玠玡玣",5,"玪玬玭玱玴玵玶玸玹玼玽玾玿珁珃",4],
["ab80","珋珌珎珒",6,"珚珛珜珝珟珡珢珣珤珦珨珪珫珬珮珯珰珱珳",4],
["ac40","珸",10,"琄琇琈琋琌琍琎琑",8,"琜",5,"琣琤琧琩琫琭琯琱琲琷",4,"琽琾琿瑀瑂",11],
["ac80","瑎",6,"瑖瑘瑝瑠",12,"瑮瑯瑱",4,"瑸瑹瑺"],
["ad40","瑻瑼瑽瑿璂璄璅璆璈璉璊璌璍璏璑",10,"璝璟",7,"璪",15,"璻",12],
["ad80","瓈",9,"瓓",8,"瓝瓟瓡瓥瓧",6,"瓰瓱瓲"],
["ae40","瓳瓵瓸",6,"甀甁甂甃甅",7,"甎甐甒甔甕甖甗甛甝甞甠",4,"甦甧甪甮甴甶甹甼甽甿畁畂畃畄畆畇畉畊畍畐畑畒畓畕畖畗畘"],
["ae80","畝",7,"畧畨畩畫",6,"畳畵當畷畺",4,"疀疁疂疄疅疇"],
["af40","疈疉疊疌疍疎疐疓疕疘疛疜疞疢疦",4,"疭疶疷疺疻疿痀痁痆痋痌痎痏痐痑痓痗痙痚痜痝痟痠痡痥痩痬痭痮痯痲痳痵痶痷痸痺痻痽痾瘂瘄瘆瘇"],
["af80","瘈瘉瘋瘍瘎瘏瘑瘒瘓瘔瘖瘚瘜瘝瘞瘡瘣瘧瘨瘬瘮瘯瘱瘲瘶瘷瘹瘺瘻瘽癁療癄"],
["b040","癅",6,"癎",5,"癕癗",4,"癝癟癠癡癢癤",6,"癬癭癮癰",7,"癹発發癿皀皁皃皅皉皊皌皍皏皐皒皔皕皗皘皚皛"],
["b080","皜",7,"皥",8,"皯皰皳皵",9,"盀盁盃啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥"],
["b140","盄盇盉盋盌盓盕盙盚盜盝盞盠",4,"盦",7,"盰盳盵盶盷盺盻盽盿眀眂眃眅眆眊県眎",10,"眛眜眝眞眡眣眤眥眧眪眫"],
["b180","眬眮眰",4,"眹眻眽眾眿睂睄睅睆睈",7,"睒",7,"睜薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳"],
["b240","睝睞睟睠睤睧睩睪睭",11,"睺睻睼瞁瞂瞃瞆",5,"瞏瞐瞓",11,"瞡瞣瞤瞦瞨瞫瞭瞮瞯瞱瞲瞴瞶",4],
["b280","瞼瞾矀",12,"矎",8,"矘矙矚矝",4,"矤病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖"],
["b340","矦矨矪矯矰矱矲矴矵矷矹矺矻矼砃",5,"砊砋砎砏砐砓砕砙砛砞砠砡砢砤砨砪砫砮砯砱砲砳砵砶砽砿硁硂硃硄硆硈硉硊硋硍硏硑硓硔硘硙硚"],
["b380","硛硜硞",11,"硯",7,"硸硹硺硻硽",6,"场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚"],
["b440","碄碅碆碈碊碋碏碐碒碔碕碖碙碝碞碠碢碤碦碨",7,"碵碶碷碸確碻碼碽碿磀磂磃磄磆磇磈磌磍磎磏磑磒磓磖磗磘磚",9],
["b480","磤磥磦磧磩磪磫磭",4,"磳磵磶磸磹磻",5,"礂礃礄礆",6,"础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮"],
["b540","礍",5,"礔",9,"礟",4,"礥",14,"礵",4,"礽礿祂祃祄祅祇祊",8,"祔祕祘祙祡祣"],
["b580","祤祦祩祪祫祬祮祰",6,"祹祻",4,"禂禃禆禇禈禉禋禌禍禎禐禑禒怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠"],
["b640","禓",6,"禛",11,"禨",10,"禴",4,"禼禿秂秄秅秇秈秊秌秎秏秐秓秔秖秗秙",5,"秠秡秢秥秨秪"],
["b680","秬秮秱",6,"秹秺秼秾秿稁稄稅稇稈稉稊稌稏",4,"稕稖稘稙稛稜丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二"],
["b740","稝稟稡稢稤",14,"稴稵稶稸稺稾穀",5,"穇",9,"穒",4,"穘",16],
["b780","穩",6,"穱穲穳穵穻穼穽穾窂窅窇窉窊窋窌窎窏窐窓窔窙窚窛窞窡窢贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服"],
["b840","窣窤窧窩窪窫窮",4,"窴",10,"竀",10,"竌",9,"竗竘竚竛竜竝竡竢竤竧",5,"竮竰竱竲竳"],
["b880","竴",4,"竻竼竾笀笁笂笅笇笉笌笍笎笐笒笓笖笗笘笚笜笝笟笡笢笣笧笩笭浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹"],
["b940","笯笰笲笴笵笶笷笹笻笽笿",5,"筆筈筊筍筎筓筕筗筙筜筞筟筡筣",10,"筯筰筳筴筶筸筺筼筽筿箁箂箃箄箆",6,"箎箏"],
["b980","箑箒箓箖箘箙箚箛箞箟箠箣箤箥箮箯箰箲箳箵箶箷箹",7,"篂篃範埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈"],
["ba40","篅篈築篊篋篍篎篏篐篒篔",4,"篛篜篞篟篠篢篣篤篧篨篩篫篬篭篯篰篲",4,"篸篹篺篻篽篿",7,"簈簉簊簍簎簐",5,"簗簘簙"],
["ba80","簚",4,"簠",5,"簨簩簫",12,"簹",5,"籂骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖"],
["bb40","籃",9,"籎",36,"籵",5,"籾",9],
["bb80","粈粊",6,"粓粔粖粙粚粛粠粡粣粦粧粨粩粫粬粭粯粰粴",4,"粺粻弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕"],
["bc40","粿糀糂糃糄糆糉糋糎",6,"糘糚糛糝糞糡",6,"糩",5,"糰",7,"糹糺糼",13,"紋",5],
["bc80","紑",14,"紡紣紤紥紦紨紩紪紬紭紮細",6,"肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件"],
["bd40","紷",54,"絯",7],
["bd80","絸",32,"健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸"],
["be40","継",12,"綧",6,"綯",42],
["be80","線",32,"尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻"],
["bf40","緻",62],
["bf80","縺縼",4,"繂",4,"繈",21,"俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀"],
["c040","繞",35,"纃",23,"纜纝纞"],
["c080","纮纴纻纼绖绤绬绹缊缐缞缷缹缻",6,"罃罆",9,"罒罓馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐"],
["c140","罖罙罛罜罝罞罠罣",4,"罫罬罭罯罰罳罵罶罷罸罺罻罼罽罿羀羂",7,"羋羍羏",4,"羕",4,"羛羜羠羢羣羥羦羨",6,"羱"],
["c180","羳",4,"羺羻羾翀翂翃翄翆翇翈翉翋翍翏",4,"翖翗翙",5,"翢翣痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿"],
["c240","翤翧翨翪翫翬翭翯翲翴",6,"翽翾翿耂耇耈耉耊耎耏耑耓耚耛耝耞耟耡耣耤耫",5,"耲耴耹耺耼耾聀聁聄聅聇聈聉聎聏聐聑聓聕聖聗"],
["c280","聙聛",13,"聫",5,"聲",11,"隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫"],
["c340","聾肁肂肅肈肊肍",5,"肔肕肗肙肞肣肦肧肨肬肰肳肵肶肸肹肻胅胇",4,"胏",6,"胘胟胠胢胣胦胮胵胷胹胻胾胿脀脁脃脄脅脇脈脋"],
["c380","脌脕脗脙脛脜脝脟",12,"脭脮脰脳脴脵脷脹",4,"脿谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸"],
["c440","腀",5,"腇腉腍腎腏腒腖腗腘腛",4,"腡腢腣腤腦腨腪腫腬腯腲腳腵腶腷腸膁膃",4,"膉膋膌膍膎膐膒",5,"膙膚膞",4,"膤膥"],
["c480","膧膩膫",7,"膴",5,"膼膽膾膿臄臅臇臈臉臋臍",6,"摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁"],
["c540","臔",14,"臤臥臦臨臩臫臮",4,"臵",5,"臽臿舃與",4,"舎舏舑舓舕",5,"舝舠舤舥舦舧舩舮舲舺舼舽舿"],
["c580","艀艁艂艃艅艆艈艊艌艍艎艐",7,"艙艛艜艝艞艠",7,"艩拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗"],
["c640","艪艫艬艭艱艵艶艷艸艻艼芀芁芃芅芆芇芉芌芐芓芔芕芖芚芛芞芠芢芣芧芲芵芶芺芻芼芿苀苂苃苅苆苉苐苖苙苚苝苢苧苨苩苪苬苭苮苰苲苳苵苶苸"],
["c680","苺苼",4,"茊茋茍茐茒茓茖茘茙茝",9,"茩茪茮茰茲茷茻茽啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐"],
["c740","茾茿荁荂荄荅荈荊",4,"荓荕",4,"荝荢荰",6,"荹荺荾",6,"莇莈莊莋莌莍莏莐莑莔莕莖莗莙莚莝莟莡",6,"莬莭莮"],
["c780","莯莵莻莾莿菂菃菄菆菈菉菋菍菎菐菑菒菓菕菗菙菚菛菞菢菣菤菦菧菨菫菬菭恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠"],
["c840","菮華菳",4,"菺菻菼菾菿萀萂萅萇萈萉萊萐萒",5,"萙萚萛萞",5,"萩",7,"萲",5,"萹萺萻萾",7,"葇葈葉"],
["c880","葊",6,"葒",4,"葘葝葞葟葠葢葤",4,"葪葮葯葰葲葴葷葹葻葼取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁"],
["c940","葽",4,"蒃蒄蒅蒆蒊蒍蒏",7,"蒘蒚蒛蒝蒞蒟蒠蒢",12,"蒰蒱蒳蒵蒶蒷蒻蒼蒾蓀蓂蓃蓅蓆蓇蓈蓋蓌蓎蓏蓒蓔蓕蓗"],
["c980","蓘",4,"蓞蓡蓢蓤蓧",4,"蓭蓮蓯蓱",10,"蓽蓾蔀蔁蔂伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳"],
["ca40","蔃",8,"蔍蔎蔏蔐蔒蔔蔕蔖蔘蔙蔛蔜蔝蔞蔠蔢",8,"蔭",9,"蔾",4,"蕄蕅蕆蕇蕋",10],
["ca80","蕗蕘蕚蕛蕜蕝蕟",4,"蕥蕦蕧蕩",8,"蕳蕵蕶蕷蕸蕼蕽蕿薀薁省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱"],
["cb40","薂薃薆薈",6,"薐",10,"薝",6,"薥薦薧薩薫薬薭薱",5,"薸薺",6,"藂",6,"藊",4,"藑藒"],
["cb80","藔藖",5,"藝",6,"藥藦藧藨藪",14,"恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔"],
["cc40","藹藺藼藽藾蘀",4,"蘆",10,"蘒蘓蘔蘕蘗",15,"蘨蘪",13,"蘹蘺蘻蘽蘾蘿虀"],
["cc80","虁",11,"虒虓處",4,"虛虜虝號虠虡虣",7,"獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃"],
["cd40","虭虯虰虲",6,"蚃",6,"蚎",4,"蚔蚖",5,"蚞",4,"蚥蚦蚫蚭蚮蚲蚳蚷蚸蚹蚻",4,"蛁蛂蛃蛅蛈蛌蛍蛒蛓蛕蛖蛗蛚蛜"],
["cd80","蛝蛠蛡蛢蛣蛥蛦蛧蛨蛪蛫蛬蛯蛵蛶蛷蛺蛻蛼蛽蛿蜁蜄蜅蜆蜋蜌蜎蜏蜐蜑蜔蜖汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威"],
["ce40","蜙蜛蜝蜟蜠蜤蜦蜧蜨蜪蜫蜬蜭蜯蜰蜲蜳蜵蜶蜸蜹蜺蜼蜽蝀",6,"蝊蝋蝍蝏蝐蝑蝒蝔蝕蝖蝘蝚",5,"蝡蝢蝦",7,"蝯蝱蝲蝳蝵"],
["ce80","蝷蝸蝹蝺蝿螀螁螄螆螇螉螊螌螎",4,"螔螕螖螘",6,"螠",4,"巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺"],
["cf40","螥螦螧螩螪螮螰螱螲螴螶螷螸螹螻螼螾螿蟁",4,"蟇蟈蟉蟌",4,"蟔",6,"蟜蟝蟞蟟蟡蟢蟣蟤蟦蟧蟨蟩蟫蟬蟭蟯",9],
["cf80","蟺蟻蟼蟽蟿蠀蠁蠂蠄",5,"蠋",7,"蠔蠗蠘蠙蠚蠜",4,"蠣稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓"],
["d040","蠤",13,"蠳",5,"蠺蠻蠽蠾蠿衁衂衃衆",5,"衎",5,"衕衖衘衚",6,"衦衧衪衭衯衱衳衴衵衶衸衹衺"],
["d080","衻衼袀袃袆袇袉袊袌袎袏袐袑袓袔袕袗",4,"袝",4,"袣袥",5,"小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄"],
["d140","袬袮袯袰袲",4,"袸袹袺袻袽袾袿裀裃裄裇裈裊裋裌裍裏裐裑裓裖裗裚",4,"裠裡裦裧裩",6,"裲裵裶裷裺裻製裿褀褁褃",5],
["d180","褉褋",4,"褑褔",4,"褜",4,"褢褣褤褦褧褨褩褬褭褮褯褱褲褳褵褷选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶"],
["d240","褸",8,"襂襃襅",24,"襠",5,"襧",19,"襼"],
["d280","襽襾覀覂覄覅覇",26,"摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐"],
["d340","覢",30,"觃觍觓觔觕觗觘觙觛觝觟觠觡觢觤觧觨觩觪觬觭觮觰觱觲觴",6],
["d380","觻",4,"訁",5,"計",21,"印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉"],
["d440","訞",31,"訿",8,"詉",21],
["d480","詟",25,"詺",6,"浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧"],
["d540","誁",7,"誋",7,"誔",46],
["d580","諃",32,"铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政"],
["d640","諤",34,"謈",27],
["d680","謤謥謧",30,"帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑"],
["d740","譆",31,"譧",4,"譭",25],
["d780","讇",24,"讬讱讻诇诐诪谉谞住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座"],
["d840","谸",8,"豂豃豄豅豈豊豋豍",7,"豖豗豘豙豛",5,"豣",6,"豬",6,"豴豵豶豷豻",6,"貃貄貆貇"],
["d880","貈貋貍",6,"貕貖貗貙",20,"亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝"],
["d940","貮",62],
["d980","賭",32,"佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼"],
["da40","贎",14,"贠赑赒赗赟赥赨赩赪赬赮赯赱赲赸",8,"趂趃趆趇趈趉趌",4,"趒趓趕",9,"趠趡"],
["da80","趢趤",12,"趲趶趷趹趻趽跀跁跂跅跇跈跉跊跍跐跒跓跔凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺"],
["db40","跕跘跙跜跠跡跢跥跦跧跩跭跮跰跱跲跴跶跼跾",6,"踆踇踈踋踍踎踐踑踒踓踕",7,"踠踡踤",4,"踫踭踰踲踳踴踶踷踸踻踼踾"],
["db80","踿蹃蹅蹆蹌",4,"蹓",5,"蹚",11,"蹧蹨蹪蹫蹮蹱邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝"],
["dc40","蹳蹵蹷",4,"蹽蹾躀躂躃躄躆躈",6,"躑躒躓躕",6,"躝躟",11,"躭躮躰躱躳",6,"躻",7],
["dc80","軃",10,"軏",21,"堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥"],
["dd40","軥",62],
["dd80","輤",32,"荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺"],
["de40","轅",32,"轪辀辌辒辝辠辡辢辤辥辦辧辪辬辭辮辯農辳辴辵辷辸辺辻込辿迀迃迆"],
["de80","迉",4,"迏迒迖迗迚迠迡迣迧迬迯迱迲迴迵迶迺迻迼迾迿逇逈逌逎逓逕逘蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖"],
["df40","這逜連逤逥逧",5,"逰",4,"逷逹逺逽逿遀遃遅遆遈",4,"過達違遖遙遚遜",5,"遤遦遧適遪遫遬遯",4,"遶",6,"遾邁"],
["df80","還邅邆邇邉邊邌",4,"邒邔邖邘邚邜邞邟邠邤邥邧邨邩邫邭邲邷邼邽邿郀摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼"],
["e040","郂郃郆郈郉郋郌郍郒郔郕郖郘郙郚郞郟郠郣郤郥郩郪郬郮郰郱郲郳郵郶郷郹郺郻郼郿鄀鄁鄃鄅",19,"鄚鄛鄜"],
["e080","鄝鄟鄠鄡鄤",10,"鄰鄲",6,"鄺",8,"酄唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼"],
["e140","酅酇酈酑酓酔酕酖酘酙酛酜酟酠酦酧酨酫酭酳酺酻酼醀",4,"醆醈醊醎醏醓",6,"醜",5,"醤",5,"醫醬醰醱醲醳醶醷醸醹醻"],
["e180","醼",10,"釈釋釐釒",9,"針",8,"帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺"],
["e240","釦",62],
["e280","鈥",32,"狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧",5,"饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂"],
["e340","鉆",45,"鉵",16],
["e380","銆",7,"銏",24,"恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾"],
["e440","銨",5,"銯",24,"鋉",31],
["e480","鋩",32,"洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑"],
["e540","錊",51,"錿",10],
["e580","鍊",31,"鍫濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣"],
["e640","鍬",34,"鎐",27],
["e680","鎬",29,"鏋鏌鏍妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩"],
["e740","鏎",7,"鏗",54],
["e780","鐎",32,"纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡",6,"缪缫缬缭缯",4,"缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬"],
["e840","鐯",14,"鐿",43,"鑬鑭鑮鑯"],
["e880","鑰",20,"钑钖钘铇铏铓铔铚铦铻锜锠琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹"],
["e940","锧锳锽镃镈镋镕镚镠镮镴镵長",7,"門",42],
["e980","閫",32,"椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋"],
["ea40","闌",27,"闬闿阇阓阘阛阞阠阣",6,"阫阬阭阯阰阷阸阹阺阾陁陃陊陎陏陑陒陓陖陗"],
["ea80","陘陙陚陜陝陞陠陣陥陦陫陭",4,"陳陸",12,"隇隉隊辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰"],
["eb40","隌階隑隒隓隕隖隚際隝",9,"隨",7,"隱隲隴隵隷隸隺隻隿雂雃雈雊雋雐雑雓雔雖",9,"雡",6,"雫"],
["eb80","雬雭雮雰雱雲雴雵雸雺電雼雽雿霂霃霅霊霋霌霐霑霒霔霕霗",4,"霝霟霠搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻"],
["ec40","霡",8,"霫霬霮霯霱霳",4,"霺霻霼霽霿",18,"靔靕靗靘靚靜靝靟靣靤靦靧靨靪",7],
["ec80","靲靵靷",4,"靽",7,"鞆",4,"鞌鞎鞏鞐鞓鞕鞖鞗鞙",4,"臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐"],
["ed40","鞞鞟鞡鞢鞤",6,"鞬鞮鞰鞱鞳鞵",46],
["ed80","韤韥韨韮",4,"韴韷",23,"怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨"],
["ee40","頏",62],
["ee80","顎",32,"睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶",4,"钼钽钿铄铈",6,"铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪"],
["ef40","顯",5,"颋颎颒颕颙颣風",37,"飏飐飔飖飗飛飜飝飠",4],
["ef80","飥飦飩",30,"铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒",4,"锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤",8,"镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔"],
["f040","餈",4,"餎餏餑",28,"餯",26],
["f080","饊",9,"饖",12,"饤饦饳饸饹饻饾馂馃馉稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨",4,"鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦",6,"鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙"],
["f140","馌馎馚",10,"馦馧馩",47],
["f180","駙",32,"瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃"],
["f240","駺",62],
["f280","騹",32,"颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒"],
["f340","驚",17,"驲骃骉骍骎骔骕骙骦骩",6,"骲骳骴骵骹骻骽骾骿髃髄髆",4,"髍髎髏髐髒體髕髖髗髙髚髛髜"],
["f380","髝髞髠髢髣髤髥髧髨髩髪髬髮髰",8,"髺髼",6,"鬄鬅鬆蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋"],
["f440","鬇鬉",5,"鬐鬑鬒鬔",10,"鬠鬡鬢鬤",10,"鬰鬱鬳",7,"鬽鬾鬿魀魆魊魋魌魎魐魒魓魕",5],
["f480","魛",32,"簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤"],
["f540","魼",62],
["f580","鮻",32,"酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜"],
["f640","鯜",62],
["f680","鰛",32,"觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅",5,"龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞",5,"鲥",4,"鲫鲭鲮鲰",7,"鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋"],
["f740","鰼",62],
["f780","鱻鱽鱾鲀鲃鲄鲉鲊鲌鲏鲓鲖鲗鲘鲙鲝鲪鲬鲯鲹鲾",4,"鳈鳉鳑鳒鳚鳛鳠鳡鳌",4,"鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄"],
["f840","鳣",62],
["f880","鴢",32],
["f940","鵃",62],
["f980","鶂",32],
["fa40","鶣",62],
["fa80","鷢",32],
["fb40","鸃",27,"鸤鸧鸮鸰鸴鸻鸼鹀鹍鹐鹒鹓鹔鹖鹙鹝鹟鹠鹡鹢鹥鹮鹯鹲鹴",9,"麀"],
["fb80","麁麃麄麅麆麉麊麌",5,"麔",8,"麞麠",5,"麧麨麩麪"],
["fc40","麫",8,"麵麶麷麹麺麼麿",4,"黅黆黇黈黊黋黌黐黒黓黕黖黗黙黚點黡黣黤黦黨黫黬黭黮黰",8,"黺黽黿",6],
["fc80","鼆",4,"鼌鼏鼑鼒鼔鼕鼖鼘鼚",5,"鼡鼣",8,"鼭鼮鼰鼱"],
["fd40","鼲",4,"鼸鼺鼼鼿",4,"齅",10,"齒",38],
["fd80","齹",5,"龁龂龍",11,"龜龝龞龡",4,"郎凉秊裏隣"],
["fe40","兀嗀﨎﨏﨑﨓﨔礼﨟蘒﨡﨣﨤﨧﨨﨩"]
]
[
["0","\u0000",127],
["8141","갂갃갅갆갋",4,"갘갞갟갡갢갣갥",6,"갮갲갳갴"],
["8161","갵갶갷갺갻갽갾갿걁",9,"걌걎",5,"걕"],
["8181","걖걗걙걚걛걝",18,"걲걳걵걶걹걻",4,"겂겇겈겍겎겏겑겒겓겕",6,"겞겢",5,"겫겭겮겱",6,"겺겾겿곀곂곃곅곆곇곉곊곋곍",7,"곖곘",7,"곢곣곥곦곩곫곭곮곲곴곷",4,"곾곿괁괂괃괅괇",4,"괎괐괒괓"],
["8241","괔괕괖괗괙괚괛괝괞괟괡",7,"괪괫괮",5],
["8261","괶괷괹괺괻괽",6,"굆굈굊",5,"굑굒굓굕굖굗"],
["8281","굙",7,"굢굤",7,"굮굯굱굲굷굸굹굺굾궀궃",4,"궊궋궍궎궏궑",10,"궞",5,"궥",17,"궸",7,"귂귃귅귆귇귉",6,"귒귔",7,"귝귞귟귡귢귣귥",18],
["8341","귺귻귽귾긂",5,"긊긌긎",5,"긕",7],
["8361","긝",18,"긲긳긵긶긹긻긼"],
["8381","긽긾긿깂깄깇깈깉깋깏깑깒깓깕깗",4,"깞깢깣깤깦깧깪깫깭깮깯깱",6,"깺깾",5,"꺆",5,"꺍",46,"꺿껁껂껃껅",6,"껎껒",5,"껚껛껝",8],
["8441","껦껧껩껪껬껮",5,"껵껶껷껹껺껻껽",8],
["8461","꼆꼉꼊꼋꼌꼎꼏꼑",18],
["8481","꼤",7,"꼮꼯꼱꼳꼵",6,"꼾꽀꽄꽅꽆꽇꽊",5,"꽑",10,"꽞",5,"꽦",18,"꽺",5,"꾁꾂꾃꾅꾆꾇꾉",6,"꾒꾓꾔꾖",5,"꾝",26,"꾺꾻꾽꾾"],
["8541","꾿꿁",5,"꿊꿌꿏",4,"꿕",6,"꿝",4],
["8561","꿢",5,"꿪",5,"꿲꿳꿵꿶꿷꿹",6,"뀂뀃"],
["8581","뀅",6,"뀍뀎뀏뀑뀒뀓뀕",6,"뀞",9,"뀩",26,"끆끇끉끋끍끏끐끑끒끖끘끚끛끜끞",29,"끾끿낁낂낃낅",6,"낎낐낒",5,"낛낝낞낣낤"],
["8641","낥낦낧낪낰낲낶낷낹낺낻낽",6,"냆냊",5,"냒"],
["8661","냓냕냖냗냙",6,"냡냢냣냤냦",10],
["8681","냱",22,"넊넍넎넏넑넔넕넖넗넚넞",4,"넦넧넩넪넫넭",6,"넶넺",5,"녂녃녅녆녇녉",6,"녒녓녖녗녙녚녛녝녞녟녡",22,"녺녻녽녾녿놁놃",4,"놊놌놎놏놐놑놕놖놗놙놚놛놝"],
["8741","놞",9,"놩",15],
["8761","놹",18,"뇍뇎뇏뇑뇒뇓뇕"],
["8781","뇖",5,"뇞뇠",7,"뇪뇫뇭뇮뇯뇱",7,"뇺뇼뇾",5,"눆눇눉눊눍",6,"눖눘눚",5,"눡",18,"눵",6,"눽",26,"뉙뉚뉛뉝뉞뉟뉡",6,"뉪",4],
["8841","뉯",4,"뉶",5,"뉽",6,"늆늇늈늊",4],
["8861","늏늒늓늕늖늗늛",4,"늢늤늧늨늩늫늭늮늯늱늲늳늵늶늷"],
["8881","늸",15,"닊닋닍닎닏닑닓",4,"닚닜닞닟닠닡닣닧닩닪닰닱닲닶닼닽닾댂댃댅댆댇댉",6,"댒댖",5,"댝",54,"덗덙덚덝덠덡덢덣"],
["8941","덦덨덪덬덭덯덲덳덵덶덷덹",6,"뎂뎆",5,"뎍"],
["8961","뎎뎏뎑뎒뎓뎕",10,"뎢",5,"뎩뎪뎫뎭"],
["8981","뎮",21,"돆돇돉돊돍돏돑돒돓돖돘돚돜돞돟돡돢돣돥돦돧돩",18,"돽",18,"됑",6,"됙됚됛됝됞됟됡",6,"됪됬",7,"됵",15],
["8a41","둅",10,"둒둓둕둖둗둙",6,"둢둤둦"],
["8a61","둧",4,"둭",18,"뒁뒂"],
["8a81","뒃",4,"뒉",19,"뒞",5,"뒥뒦뒧뒩뒪뒫뒭",7,"뒶뒸뒺",5,"듁듂듃듅듆듇듉",6,"듑듒듓듔듖",5,"듞듟듡듢듥듧",4,"듮듰듲",5,"듹",26,"딖딗딙딚딝"],
["8b41","딞",5,"딦딫",4,"딲딳딵딶딷딹",6,"땂땆"],
["8b61","땇땈땉땊땎땏땑땒땓땕",6,"땞땢",8],
["8b81","땫",52,"떢떣떥떦떧떩떬떭떮떯떲떶",4,"떾떿뗁뗂뗃뗅",6,"뗎뗒",5,"뗙",18,"뗭",18],
["8c41","똀",15,"똒똓똕똖똗똙",4],
["8c61","똞",6,"똦",5,"똭",6,"똵",5],
["8c81","똻",12,"뙉",26,"뙥뙦뙧뙩",50,"뚞뚟뚡뚢뚣뚥",5,"뚭뚮뚯뚰뚲",16],
["8d41","뛃",16,"뛕",8],
["8d61","뛞",17,"뛱뛲뛳뛵뛶뛷뛹뛺"],
["8d81","뛻",4,"뜂뜃뜄뜆",33,"뜪뜫뜭뜮뜱",6,"뜺뜼",7,"띅띆띇띉띊띋띍",6,"띖",9,"띡띢띣띥띦띧띩",6,"띲띴띶",5,"띾띿랁랂랃랅",6,"랎랓랔랕랚랛랝랞"],
["8e41","랟랡",6,"랪랮",5,"랶랷랹",8],
["8e61","럂",4,"럈럊",19],
["8e81","럞",13,"럮럯럱럲럳럵",6,"럾렂",4,"렊렋렍렎렏렑",6,"렚렜렞",5,"렦렧렩렪렫렭",6,"렶렺",5,"롁롂롃롅",11,"롒롔",7,"롞롟롡롢롣롥",6,"롮롰롲",5,"롹롺롻롽",7],
["8f41","뢅",7,"뢎",17],
["8f61","뢠",7,"뢩",6,"뢱뢲뢳뢵뢶뢷뢹",4],
["8f81","뢾뢿룂룄룆",5,"룍룎룏룑룒룓룕",7,"룞룠룢",5,"룪룫룭룮룯룱",6,"룺룼룾",5,"뤅",18,"뤙",6,"뤡",26,"뤾뤿륁륂륃륅",6,"륍륎륐륒",5],
["9041","륚륛륝륞륟륡",6,"륪륬륮",5,"륶륷륹륺륻륽"],
["9061","륾",5,"릆릈릋릌릏",15],
["9081","릟",12,"릮릯릱릲릳릵",6,"릾맀맂",5,"맊맋맍맓",4,"맚맜맟맠맢맦맧맩맪맫맭",6,"맶맻",4,"먂",5,"먉",11,"먖",33,"먺먻먽먾먿멁멃멄멅멆"],
["9141","멇멊멌멏멐멑멒멖멗멙멚멛멝",6,"멦멪",5],
["9161","멲멳멵멶멷멹",9,"몆몈몉몊몋몍",5],
["9181","몓",20,"몪몭몮몯몱몳",4,"몺몼몾",5,"뫅뫆뫇뫉",14,"뫚",33,"뫽뫾뫿묁묂묃묅",7,"묎묐묒",5,"묙묚묛묝묞묟묡",6],
["9241","묨묪묬",7,"묷묹묺묿",4,"뭆뭈뭊뭋뭌뭎뭑뭒"],
["9261","뭓뭕뭖뭗뭙",7,"뭢뭤",7,"뭭",4],
["9281","뭲",21,"뮉뮊뮋뮍뮎뮏뮑",18,"뮥뮦뮧뮩뮪뮫뮭",6,"뮵뮶뮸",7,"믁믂믃믅믆믇믉",6,"믑믒믔",35,"믺믻믽믾밁"],
["9341","밃",4,"밊밎밐밒밓밙밚밠밡밢밣밦밨밪밫밬밮밯밲밳밵"],
["9361","밶밷밹",6,"뱂뱆뱇뱈뱊뱋뱎뱏뱑",8],
["9381","뱚뱛뱜뱞",37,"벆벇벉벊벍벏",4,"벖벘벛",4,"벢벣벥벦벩",6,"벲벶",5,"벾벿볁볂볃볅",7,"볎볒볓볔볖볗볙볚볛볝",22,"볷볹볺볻볽"],
["9441","볾",5,"봆봈봊",5,"봑봒봓봕",8],
["9461","봞",5,"봥",6,"봭",12],
["9481","봺",5,"뵁",6,"뵊뵋뵍뵎뵏뵑",6,"뵚",9,"뵥뵦뵧뵩",22,"붂붃붅붆붋",4,"붒붔붖붗붘붛붝",6,"붥",10,"붱",6,"붹",24],
["9541","뷒뷓뷖뷗뷙뷚뷛뷝",11,"뷪",5,"뷱"],
["9561","뷲뷳뷵뷶뷷뷹",6,"븁븂븄븆",5,"븎븏븑븒븓"],
["9581","븕",6,"븞븠",35,"빆빇빉빊빋빍빏",4,"빖빘빜빝빞빟빢빣빥빦빧빩빫",4,"빲빶",4,"빾빿뺁뺂뺃뺅",6,"뺎뺒",5,"뺚",13,"뺩",14],
["9641","뺸",23,"뻒뻓"],
["9661","뻕뻖뻙",6,"뻡뻢뻦",5,"뻭",8],
["9681","뻶",10,"뼂",5,"뼊",13,"뼚뼞",33,"뽂뽃뽅뽆뽇뽉",6,"뽒뽓뽔뽖",44],
["9741","뾃",16,"뾕",8],
["9761","뾞",17,"뾱",7],
["9781","뾹",11,"뿆",5,"뿎뿏뿑뿒뿓뿕",6,"뿝뿞뿠뿢",89,"쀽쀾쀿"],
["9841","쁀",16,"쁒",5,"쁙쁚쁛"],
["9861","쁝쁞쁟쁡",6,"쁪",15],
["9881","쁺",21,"삒삓삕삖삗삙",6,"삢삤삦",5,"삮삱삲삷",4,"삾샂샃샄샆샇샊샋샍샎샏샑",6,"샚샞",5,"샦샧샩샪샫샭",6,"샶샸샺",5,"섁섂섃섅섆섇섉",6,"섑섒섓섔섖",5,"섡섢섥섨섩섪섫섮"],
["9941","섲섳섴섵섷섺섻섽섾섿셁",6,"셊셎",5,"셖셗"],
["9961","셙셚셛셝",6,"셦셪",5,"셱셲셳셵셶셷셹셺셻"],
["9981","셼",8,"솆",5,"솏솑솒솓솕솗",4,"솞솠솢솣솤솦솧솪솫솭솮솯솱",11,"솾",5,"쇅쇆쇇쇉쇊쇋쇍",6,"쇕쇖쇙",6,"쇡쇢쇣쇥쇦쇧쇩",6,"쇲쇴",7,"쇾쇿숁숂숃숅",6,"숎숐숒",5,"숚숛숝숞숡숢숣"],
["9a41","숤숥숦숧숪숬숮숰숳숵",16],
["9a61","쉆쉇쉉",6,"쉒쉓쉕쉖쉗쉙",6,"쉡쉢쉣쉤쉦"],
["9a81","쉧",4,"쉮쉯쉱쉲쉳쉵",6,"쉾슀슂",5,"슊",5,"슑",6,"슙슚슜슞",5,"슦슧슩슪슫슮",5,"슶슸슺",33,"싞싟싡싢싥",5,"싮싰싲싳싴싵싷싺싽싾싿쌁",6,"쌊쌋쌎쌏"],
["9b41","쌐쌑쌒쌖쌗쌙쌚쌛쌝",6,"쌦쌧쌪",8],
["9b61","쌳",17,"썆",7],
["9b81","썎",25,"썪썫썭썮썯썱썳",4,"썺썻썾",5,"쎅쎆쎇쎉쎊쎋쎍",50,"쏁",22,"쏚"],
["9c41","쏛쏝쏞쏡쏣",4,"쏪쏫쏬쏮",5,"쏶쏷쏹",5],
["9c61","쏿",8,"쐉",6,"쐑",9],
["9c81","쐛",8,"쐥",6,"쐭쐮쐯쐱쐲쐳쐵",6,"쐾",9,"쑉",26,"쑦쑧쑩쑪쑫쑭",6,"쑶쑷쑸쑺",5,"쒁",18,"쒕",6,"쒝",12],
["9d41","쒪",13,"쒹쒺쒻쒽",8],
["9d61","쓆",25],
["9d81","쓠",8,"쓪",5,"쓲쓳쓵쓶쓷쓹쓻쓼쓽쓾씂",9,"씍씎씏씑씒씓씕",6,"씝",10,"씪씫씭씮씯씱",6,"씺씼씾",5,"앆앇앋앏앐앑앒앖앚앛앜앟앢앣앥앦앧앩",6,"앲앶",5,"앾앿얁얂얃얅얆얈얉얊얋얎얐얒얓얔"],
["9e41","얖얙얚얛얝얞얟얡",7,"얪",9,"얶"],
["9e61","얷얺얿",4,"엋엍엏엒엓엕엖엗엙",6,"엢엤엦엧"],
["9e81","엨엩엪엫엯엱엲엳엵엸엹엺엻옂옃옄옉옊옋옍옎옏옑",6,"옚옝",6,"옦옧옩옪옫옯옱옲옶옸옺옼옽옾옿왂왃왅왆왇왉",6,"왒왖",5,"왞왟왡",10,"왭왮왰왲",5,"왺왻왽왾왿욁",6,"욊욌욎",5,"욖욗욙욚욛욝",6,"욦"],
["9f41","욨욪",5,"욲욳욵욶욷욻",4,"웂웄웆",5,"웎"],
["9f61","웏웑웒웓웕",6,"웞웟웢",5,"웪웫웭웮웯웱웲"],
["9f81","웳",4,"웺웻웼웾",5,"윆윇윉윊윋윍",6,"윖윘윚",5,"윢윣윥윦윧윩",6,"윲윴윶윸윹윺윻윾윿읁읂읃읅",4,"읋읎읐읙읚읛읝읞읟읡",6,"읩읪읬",7,"읶읷읹읺읻읿잀잁잂잆잋잌잍잏잒잓잕잙잛",4,"잢잧",4,"잮잯잱잲잳잵잶잷"],
["a041","잸잹잺잻잾쟂",5,"쟊쟋쟍쟏쟑",6,"쟙쟚쟛쟜"],
["a061","쟞",5,"쟥쟦쟧쟩쟪쟫쟭",13],
["a081","쟻",4,"젂젃젅젆젇젉젋",4,"젒젔젗",4,"젞젟젡젢젣젥",6,"젮젰젲",5,"젹젺젻젽젾젿졁",6,"졊졋졎",5,"졕",26,"졲졳졵졶졷졹졻",4,"좂좄좈좉좊좎",5,"좕",7,"좞좠좢좣좤"],
["a141","좥좦좧좩",18,"좾좿죀죁"],
["a161","죂죃죅죆죇죉죊죋죍",6,"죖죘죚",5,"죢죣죥"],
["a181","죦",14,"죶",5,"죾죿줁줂줃줇",4,"줎　、。·‥…¨〃­―∥＼∼‘’“”〔〕〈",9,"±×÷≠≤≥∞∴°′″℃Å￠￡￥♂♀∠⊥⌒∂∇≡≒§※☆★○●◎◇◆□■△▲▽▼→←↑↓↔〓≪≫√∽∝∵∫∬∈∋⊆⊇⊂⊃∪∩∧∨￢"],
["a241","줐줒",5,"줙",18],
["a261","줭",6,"줵",18],
["a281","쥈",7,"쥒쥓쥕쥖쥗쥙",6,"쥢쥤",7,"쥭쥮쥯⇒⇔∀∃´～ˇ˘˝˚˙¸˛¡¿ː∮∑∏¤℉‰◁◀▷▶♤♠♡♥♧♣⊙◈▣◐◑▒▤▥▨▧▦▩♨☏☎☜☞¶†‡↕↗↙↖↘♭♩♪♬㉿㈜№㏇™㏂㏘℡€®"],
["a341","쥱쥲쥳쥵",6,"쥽",10,"즊즋즍즎즏"],
["a361","즑",6,"즚즜즞",16],
["a381","즯",16,"짂짃짅짆짉짋",4,"짒짔짗짘짛！",58,"￦］",32,"￣"],
["a441","짞짟짡짣짥짦짨짩짪짫짮짲",5,"짺짻짽짾짿쨁쨂쨃쨄"],
["a461","쨅쨆쨇쨊쨎",5,"쨕쨖쨗쨙",12],
["a481","쨦쨧쨨쨪",28,"ㄱ",93],
["a541","쩇",4,"쩎쩏쩑쩒쩓쩕",6,"쩞쩢",5,"쩩쩪"],
["a561","쩫",17,"쩾",5,"쪅쪆"],
["a581","쪇",16,"쪙",14,"ⅰ",9],
["a5b0","Ⅰ",9],
["a5c1","Α",16,"Σ",6],
["a5e1","α",16,"σ",6],
["a641","쪨",19,"쪾쪿쫁쫂쫃쫅"],
["a661","쫆",5,"쫎쫐쫒쫔쫕쫖쫗쫚",5,"쫡",6],
["a681","쫨쫩쫪쫫쫭",6,"쫵",18,"쬉쬊─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂┒┑┚┙┖┕┎┍┞┟┡┢┦┧┩┪┭┮┱┲┵┶┹┺┽┾╀╁╃",7],
["a741","쬋",4,"쬑쬒쬓쬕쬖쬗쬙",6,"쬢",7],
["a761","쬪",22,"쭂쭃쭄"],
["a781","쭅쭆쭇쭊쭋쭍쭎쭏쭑",6,"쭚쭛쭜쭞",5,"쭥",7,"㎕㎖㎗ℓ㎘㏄㎣㎤㎥㎦㎙",9,"㏊㎍㎎㎏㏏㎈㎉㏈㎧㎨㎰",9,"㎀",4,"㎺",5,"㎐",4,"Ω㏀㏁㎊㎋㎌㏖㏅㎭㎮㎯㏛㎩㎪㎫㎬㏝㏐㏓㏃㏉㏜㏆"],
["a841","쭭",10,"쭺",14],
["a861","쮉",18,"쮝",6],
["a881","쮤",19,"쮹",11,"ÆÐªĦ"],
["a8a6","Ĳ"],
["a8a8","ĿŁØŒºÞŦŊ"],
["a8b1","㉠",27,"ⓐ",25,"①",14,"½⅓⅔¼¾⅛⅜⅝⅞"],
["a941","쯅",14,"쯕",10],
["a961","쯠쯡쯢쯣쯥쯦쯨쯪",18],
["a981","쯽",14,"찎찏찑찒찓찕",6,"찞찟찠찣찤æđðħıĳĸŀłøœßþŧŋŉ㈀",27,"⒜",25,"⑴",14,"¹²³⁴ⁿ₁₂₃₄"],
["aa41","찥찦찪찫찭찯찱",6,"찺찿",4,"챆챇챉챊챋챍챎"],
["aa61","챏",4,"챖챚",5,"챡챢챣챥챧챩",6,"챱챲"],
["aa81","챳챴챶",29,"ぁ",82],
["ab41","첔첕첖첗첚첛첝첞첟첡",6,"첪첮",5,"첶첷첹"],
["ab61","첺첻첽",6,"쳆쳈쳊",5,"쳑쳒쳓쳕",5],
["ab81","쳛",8,"쳥",6,"쳭쳮쳯쳱",12,"ァ",85],
["ac41","쳾쳿촀촂",5,"촊촋촍촎촏촑",6,"촚촜촞촟촠"],
["ac61","촡촢촣촥촦촧촩촪촫촭",11,"촺",4],
["ac81","촿",28,"쵝쵞쵟А",5,"ЁЖ",25],
["acd1","а",5,"ёж",25],
["ad41","쵡쵢쵣쵥",6,"쵮쵰쵲",5,"쵹",7],
["ad61","춁",6,"춉",10,"춖춗춙춚춛춝춞춟"],
["ad81","춠춡춢춣춦춨춪",5,"춱",18,"췅"],
["ae41","췆",5,"췍췎췏췑",16],
["ae61","췢",5,"췩췪췫췭췮췯췱",6,"췺췼췾",4],
["ae81","츃츅츆츇츉츊츋츍",6,"츕츖츗츘츚",5,"츢츣츥츦츧츩츪츫"],
["af41","츬츭츮츯츲츴츶",19],
["af61","칊",13,"칚칛칝칞칢",5,"칪칬"],
["af81","칮",5,"칶칷칹칺칻칽",6,"캆캈캊",5,"캒캓캕캖캗캙"],
["b041","캚",5,"캢캦",5,"캮",12],
["b061","캻",5,"컂",19],
["b081","컖",13,"컦컧컩컪컭",6,"컶컺",5,"가각간갇갈갉갊감",7,"같",4,"갠갤갬갭갯갰갱갸갹갼걀걋걍걔걘걜거걱건걷걸걺검겁것겄겅겆겉겊겋게겐겔겜겝겟겠겡겨격겪견겯결겸겹겻겼경곁계곈곌곕곗고곡곤곧골곪곬곯곰곱곳공곶과곽관괄괆"],
["b141","켂켃켅켆켇켉",6,"켒켔켖",5,"켝켞켟켡켢켣"],
["b161","켥",6,"켮켲",5,"켹",11],
["b181","콅",14,"콖콗콙콚콛콝",6,"콦콨콪콫콬괌괍괏광괘괜괠괩괬괭괴괵괸괼굄굅굇굉교굔굘굡굣구국군굳굴굵굶굻굼굽굿궁궂궈궉권궐궜궝궤궷귀귁귄귈귐귑귓규균귤그극근귿글긁금급긋긍긔기긱긴긷길긺김깁깃깅깆깊까깍깎깐깔깖깜깝깟깠깡깥깨깩깬깰깸"],
["b241","콭콮콯콲콳콵콶콷콹",6,"쾁쾂쾃쾄쾆",5,"쾍"],
["b261","쾎",18,"쾢",5,"쾩"],
["b281","쾪",5,"쾱",18,"쿅",6,"깹깻깼깽꺄꺅꺌꺼꺽꺾껀껄껌껍껏껐껑께껙껜껨껫껭껴껸껼꼇꼈꼍꼐꼬꼭꼰꼲꼴꼼꼽꼿꽁꽂꽃꽈꽉꽐꽜꽝꽤꽥꽹꾀꾄꾈꾐꾑꾕꾜꾸꾹꾼꿀꿇꿈꿉꿋꿍꿎꿔꿜꿨꿩꿰꿱꿴꿸뀀뀁뀄뀌뀐뀔뀜뀝뀨끄끅끈끊끌끎끓끔끕끗끙"],
["b341","쿌",19,"쿢쿣쿥쿦쿧쿩"],
["b361","쿪",5,"쿲쿴쿶",5,"쿽쿾쿿퀁퀂퀃퀅",5],
["b381","퀋",5,"퀒",5,"퀙",19,"끝끼끽낀낄낌낍낏낑나낙낚난낟날낡낢남납낫",4,"낱낳내낵낸낼냄냅냇냈냉냐냑냔냘냠냥너넉넋넌널넒넓넘넙넛넜넝넣네넥넨넬넴넵넷넸넹녀녁년녈념녑녔녕녘녜녠노녹논놀놂놈놉놋농높놓놔놘놜놨뇌뇐뇔뇜뇝"],
["b441","퀮",5,"퀶퀷퀹퀺퀻퀽",6,"큆큈큊",5],
["b461","큑큒큓큕큖큗큙",6,"큡",10,"큮큯"],
["b481","큱큲큳큵",6,"큾큿킀킂",18,"뇟뇨뇩뇬뇰뇹뇻뇽누눅눈눋눌눔눕눗눙눠눴눼뉘뉜뉠뉨뉩뉴뉵뉼늄늅늉느늑는늘늙늚늠늡늣능늦늪늬늰늴니닉닌닐닒님닙닛닝닢다닥닦단닫",4,"닳담답닷",4,"닿대댁댄댈댐댑댓댔댕댜더덕덖던덛덜덞덟덤덥"],
["b541","킕",14,"킦킧킩킪킫킭",5],
["b561","킳킶킸킺",5,"탂탃탅탆탇탊",5,"탒탖",4],
["b581","탛탞탟탡탢탣탥",6,"탮탲",5,"탹",11,"덧덩덫덮데덱덴델뎀뎁뎃뎄뎅뎌뎐뎔뎠뎡뎨뎬도독돈돋돌돎돐돔돕돗동돛돝돠돤돨돼됐되된될됨됩됫됴두둑둔둘둠둡둣둥둬뒀뒈뒝뒤뒨뒬뒵뒷뒹듀듄듈듐듕드득든듣들듦듬듭듯등듸디딕딘딛딜딤딥딧딨딩딪따딱딴딸"],
["b641","턅",7,"턎",17],
["b661","턠",15,"턲턳턵턶턷턹턻턼턽턾"],
["b681","턿텂텆",5,"텎텏텑텒텓텕",6,"텞텠텢",5,"텩텪텫텭땀땁땃땄땅땋때땍땐땔땜땝땟땠땡떠떡떤떨떪떫떰떱떳떴떵떻떼떽뗀뗄뗌뗍뗏뗐뗑뗘뗬또똑똔똘똥똬똴뙈뙤뙨뚜뚝뚠뚤뚫뚬뚱뛔뛰뛴뛸뜀뜁뜅뜨뜩뜬뜯뜰뜸뜹뜻띄띈띌띔띕띠띤띨띰띱띳띵라락란랄람랍랏랐랑랒랖랗"],
["b741","텮",13,"텽",6,"톅톆톇톉톊"],
["b761","톋",20,"톢톣톥톦톧"],
["b781","톩",6,"톲톴톶톷톸톹톻톽톾톿퇁",14,"래랙랜랠램랩랫랬랭랴략랸럇량러럭런럴럼럽럿렀렁렇레렉렌렐렘렙렛렝려력련렬렴렵렷렸령례롄롑롓로록론롤롬롭롯롱롸롼뢍뢨뢰뢴뢸룀룁룃룅료룐룔룝룟룡루룩룬룰룸룹룻룽뤄뤘뤠뤼뤽륀륄륌륏륑류륙륜률륨륩"],
["b841","퇐",7,"퇙",17],
["b861","퇫",8,"퇵퇶퇷퇹",13],
["b881","툈툊",5,"툑",24,"륫륭르륵른를름릅릇릉릊릍릎리릭린릴림립릿링마막만많",4,"맘맙맛망맞맡맣매맥맨맬맴맵맷맸맹맺먀먁먈먕머먹먼멀멂멈멉멋멍멎멓메멕멘멜멤멥멧멨멩며멱면멸몃몄명몇몌모목몫몬몰몲몸몹못몽뫄뫈뫘뫙뫼"],
["b941","툪툫툮툯툱툲툳툵",6,"툾퉀퉂",5,"퉉퉊퉋퉌"],
["b961","퉍",14,"퉝",6,"퉥퉦퉧퉨"],
["b981","퉩",22,"튂튃튅튆튇튉튊튋튌묀묄묍묏묑묘묜묠묩묫무묵묶문묻물묽묾뭄뭅뭇뭉뭍뭏뭐뭔뭘뭡뭣뭬뮈뮌뮐뮤뮨뮬뮴뮷므믄믈믐믓미믹민믿밀밂밈밉밋밌밍및밑바",4,"받",4,"밤밥밧방밭배백밴밸뱀뱁뱃뱄뱅뱉뱌뱍뱐뱝버벅번벋벌벎범법벗"],
["ba41","튍튎튏튒튓튔튖",5,"튝튞튟튡튢튣튥",6,"튭"],
["ba61","튮튯튰튲",5,"튺튻튽튾틁틃",4,"틊틌",5],
["ba81","틒틓틕틖틗틙틚틛틝",6,"틦",9,"틲틳틵틶틷틹틺벙벚베벡벤벧벨벰벱벳벴벵벼벽변별볍볏볐병볕볘볜보복볶본볼봄봅봇봉봐봔봤봬뵀뵈뵉뵌뵐뵘뵙뵤뵨부북분붇불붉붊붐붑붓붕붙붚붜붤붰붸뷔뷕뷘뷜뷩뷰뷴뷸븀븃븅브븍븐블븜븝븟비빅빈빌빎빔빕빗빙빚빛빠빡빤"],
["bb41","틻",4,"팂팄팆",5,"팏팑팒팓팕팗",4,"팞팢팣"],
["bb61","팤팦팧팪팫팭팮팯팱",6,"팺팾",5,"퍆퍇퍈퍉"],
["bb81","퍊",31,"빨빪빰빱빳빴빵빻빼빽뺀뺄뺌뺍뺏뺐뺑뺘뺙뺨뻐뻑뻔뻗뻘뻠뻣뻤뻥뻬뼁뼈뼉뼘뼙뼛뼜뼝뽀뽁뽄뽈뽐뽑뽕뾔뾰뿅뿌뿍뿐뿔뿜뿟뿡쀼쁑쁘쁜쁠쁨쁩삐삑삔삘삠삡삣삥사삭삯산삳살삵삶삼삽삿샀상샅새색샌샐샘샙샛샜생샤"],
["bc41","퍪",17,"퍾퍿펁펂펃펅펆펇"],
["bc61","펈펉펊펋펎펒",5,"펚펛펝펞펟펡",6,"펪펬펮"],
["bc81","펯",4,"펵펶펷펹펺펻펽",6,"폆폇폊",5,"폑",5,"샥샨샬샴샵샷샹섀섄섈섐섕서",4,"섣설섦섧섬섭섯섰성섶세섹센셀셈셉셋셌셍셔셕션셜셤셥셧셨셩셰셴셸솅소속솎손솔솖솜솝솟송솥솨솩솬솰솽쇄쇈쇌쇔쇗쇘쇠쇤쇨쇰쇱쇳쇼쇽숀숄숌숍숏숑수숙순숟술숨숩숫숭"],
["bd41","폗폙",7,"폢폤",7,"폮폯폱폲폳폵폶폷"],
["bd61","폸폹폺폻폾퐀퐂",5,"퐉",13],
["bd81","퐗",5,"퐞",25,"숯숱숲숴쉈쉐쉑쉔쉘쉠쉥쉬쉭쉰쉴쉼쉽쉿슁슈슉슐슘슛슝스슥슨슬슭슴습슷승시식신싣실싫심십싯싱싶싸싹싻싼쌀쌈쌉쌌쌍쌓쌔쌕쌘쌜쌤쌥쌨쌩썅써썩썬썰썲썸썹썼썽쎄쎈쎌쏀쏘쏙쏜쏟쏠쏢쏨쏩쏭쏴쏵쏸쐈쐐쐤쐬쐰"],
["be41","퐸",7,"푁푂푃푅",14],
["be61","푔",7,"푝푞푟푡푢푣푥",7,"푮푰푱푲"],
["be81","푳",4,"푺푻푽푾풁풃",4,"풊풌풎",5,"풕",8,"쐴쐼쐽쑈쑤쑥쑨쑬쑴쑵쑹쒀쒔쒜쒸쒼쓩쓰쓱쓴쓸쓺쓿씀씁씌씐씔씜씨씩씬씰씸씹씻씽아악안앉않알앍앎앓암압앗았앙앝앞애액앤앨앰앱앳앴앵야약얀얄얇얌얍얏양얕얗얘얜얠얩어억언얹얻얼얽얾엄",6,"엌엎"],
["bf41","풞",10,"풪",14],
["bf61","풹",18,"퓍퓎퓏퓑퓒퓓퓕"],
["bf81","퓖",5,"퓝퓞퓠",7,"퓩퓪퓫퓭퓮퓯퓱",6,"퓹퓺퓼에엑엔엘엠엡엣엥여역엮연열엶엷염",5,"옅옆옇예옌옐옘옙옛옜오옥온올옭옮옰옳옴옵옷옹옻와왁완왈왐왑왓왔왕왜왝왠왬왯왱외왹왼욀욈욉욋욍요욕욘욜욤욥욧용우욱운울욹욺움웁웃웅워웍원월웜웝웠웡웨"],
["c041","퓾",5,"픅픆픇픉픊픋픍",6,"픖픘",5],
["c061","픞",25],
["c081","픸픹픺픻픾픿핁핂핃핅",6,"핎핐핒",5,"핚핛핝핞핟핡핢핣웩웬웰웸웹웽위윅윈윌윔윕윗윙유육윤율윰윱윳융윷으윽은을읊음읍읏응",7,"읜읠읨읫이익인일읽읾잃임입잇있잉잊잎자작잔잖잗잘잚잠잡잣잤장잦재잭잰잴잼잽잿쟀쟁쟈쟉쟌쟎쟐쟘쟝쟤쟨쟬저적전절젊"],
["c141","핤핦핧핪핬핮",5,"핶핷핹핺핻핽",6,"햆햊햋"],
["c161","햌햍햎햏햑",19,"햦햧"],
["c181","햨",31,"점접젓정젖제젝젠젤젬젭젯젱져젼졀졈졉졌졍졔조족존졸졺좀좁좃종좆좇좋좌좍좔좝좟좡좨좼좽죄죈죌죔죕죗죙죠죡죤죵주죽준줄줅줆줌줍줏중줘줬줴쥐쥑쥔쥘쥠쥡쥣쥬쥰쥴쥼즈즉즌즐즘즙즛증지직진짇질짊짐집짓"],
["c241","헊헋헍헎헏헑헓",4,"헚헜헞",5,"헦헧헩헪헫헭헮"],
["c261","헯",4,"헶헸헺",5,"혂혃혅혆혇혉",6,"혒"],
["c281","혖",5,"혝혞혟혡혢혣혥",7,"혮",9,"혺혻징짖짙짚짜짝짠짢짤짧짬짭짯짰짱째짹짼쨀쨈쨉쨋쨌쨍쨔쨘쨩쩌쩍쩐쩔쩜쩝쩟쩠쩡쩨쩽쪄쪘쪼쪽쫀쫄쫌쫍쫏쫑쫓쫘쫙쫠쫬쫴쬈쬐쬔쬘쬠쬡쭁쭈쭉쭌쭐쭘쭙쭝쭤쭸쭹쮜쮸쯔쯤쯧쯩찌찍찐찔찜찝찡찢찧차착찬찮찰참찹찻"],
["c341","혽혾혿홁홂홃홄홆홇홊홌홎홏홐홒홓홖홗홙홚홛홝",4],
["c361","홢",4,"홨홪",5,"홲홳홵",11],
["c381","횁횂횄횆",5,"횎횏횑횒횓횕",7,"횞횠횢",5,"횩횪찼창찾채책챈챌챔챕챗챘챙챠챤챦챨챰챵처척천철첨첩첫첬청체첵첸첼쳄쳅쳇쳉쳐쳔쳤쳬쳰촁초촉촌촐촘촙촛총촤촨촬촹최쵠쵤쵬쵭쵯쵱쵸춈추축춘출춤춥춧충춰췄췌췐취췬췰췸췹췻췽츄츈츌츔츙츠측츤츨츰츱츳층"],
["c441","횫횭횮횯횱",7,"횺횼",7,"훆훇훉훊훋"],
["c461","훍훎훏훐훒훓훕훖훘훚",5,"훡훢훣훥훦훧훩",4],
["c481","훮훯훱훲훳훴훶",5,"훾훿휁휂휃휅",11,"휒휓휔치칙친칟칠칡침칩칫칭카칵칸칼캄캅캇캉캐캑캔캘캠캡캣캤캥캬캭컁커컥컨컫컬컴컵컷컸컹케켁켄켈켐켑켓켕켜켠켤켬켭켯켰켱켸코콕콘콜콤콥콧콩콰콱콴콸쾀쾅쾌쾡쾨쾰쿄쿠쿡쿤쿨쿰쿱쿳쿵쿼퀀퀄퀑퀘퀭퀴퀵퀸퀼"],
["c541","휕휖휗휚휛휝휞휟휡",6,"휪휬휮",5,"휶휷휹"],
["c561","휺휻휽",6,"흅흆흈흊",5,"흒흓흕흚",4],
["c581","흟흢흤흦흧흨흪흫흭흮흯흱흲흳흵",6,"흾흿힀힂",5,"힊힋큄큅큇큉큐큔큘큠크큭큰클큼큽킁키킥킨킬킴킵킷킹타탁탄탈탉탐탑탓탔탕태택탠탤탬탭탯탰탱탸턍터턱턴털턺텀텁텃텄텅테텍텐텔템텝텟텡텨텬텼톄톈토톡톤톨톰톱톳통톺톼퇀퇘퇴퇸툇툉툐투툭툰툴툼툽툿퉁퉈퉜"],
["c641","힍힎힏힑",6,"힚힜힞",5],
["c6a1","퉤튀튁튄튈튐튑튕튜튠튤튬튱트특튼튿틀틂틈틉틋틔틘틜틤틥티틱틴틸팀팁팃팅파팍팎판팔팖팜팝팟팠팡팥패팩팬팰팸팹팻팼팽퍄퍅퍼퍽펀펄펌펍펏펐펑페펙펜펠펨펩펫펭펴편펼폄폅폈평폐폘폡폣포폭폰폴폼폽폿퐁"],
["c7a1","퐈퐝푀푄표푠푤푭푯푸푹푼푿풀풂품풉풋풍풔풩퓌퓐퓔퓜퓟퓨퓬퓰퓸퓻퓽프픈플픔픕픗피픽핀필핌핍핏핑하학한할핥함합핫항해핵핸핼햄햅햇했행햐향허헉헌헐헒험헙헛헝헤헥헨헬헴헵헷헹혀혁현혈혐협혓혔형혜혠"],
["c8a1","혤혭호혹혼홀홅홈홉홋홍홑화확환활홧황홰홱홴횃횅회획횐횔횝횟횡효횬횰횹횻후훅훈훌훑훔훗훙훠훤훨훰훵훼훽휀휄휑휘휙휜휠휨휩휫휭휴휵휸휼흄흇흉흐흑흔흖흗흘흙흠흡흣흥흩희흰흴흼흽힁히힉힌힐힘힙힛힝"],
["caa1","伽佳假價加可呵哥嘉嫁家暇架枷柯歌珂痂稼苛茄街袈訶賈跏軻迦駕刻却各恪慤殼珏脚覺角閣侃刊墾奸姦干幹懇揀杆柬桿澗癎看磵稈竿簡肝艮艱諫間乫喝曷渴碣竭葛褐蝎鞨勘坎堪嵌感憾戡敢柑橄減甘疳監瞰紺邯鑑鑒龕"],
["cba1","匣岬甲胛鉀閘剛堈姜岡崗康强彊慷江畺疆糠絳綱羌腔舡薑襁講鋼降鱇介价個凱塏愷愾慨改槪漑疥皆盖箇芥蓋豈鎧開喀客坑更粳羹醵倨去居巨拒据據擧渠炬祛距踞車遽鉅鋸乾件健巾建愆楗腱虔蹇鍵騫乞傑杰桀儉劍劒檢"],
["cca1","瞼鈐黔劫怯迲偈憩揭擊格檄激膈覡隔堅牽犬甄絹繭肩見譴遣鵑抉決潔結缺訣兼慊箝謙鉗鎌京俓倞傾儆勁勍卿坰境庚徑慶憬擎敬景暻更梗涇炅烱璟璥瓊痙硬磬竟競絅經耕耿脛莖警輕逕鏡頃頸驚鯨係啓堺契季屆悸戒桂械"],
["cda1","棨溪界癸磎稽系繫繼計誡谿階鷄古叩告呱固姑孤尻庫拷攷故敲暠枯槁沽痼皐睾稿羔考股膏苦苽菰藁蠱袴誥賈辜錮雇顧高鼓哭斛曲梏穀谷鵠困坤崑昆梱棍滾琨袞鯤汨滑骨供公共功孔工恐恭拱控攻珙空蚣貢鞏串寡戈果瓜"],
["cea1","科菓誇課跨過鍋顆廓槨藿郭串冠官寬慣棺款灌琯瓘管罐菅觀貫關館刮恝括适侊光匡壙廣曠洸炚狂珖筐胱鑛卦掛罫乖傀塊壞怪愧拐槐魁宏紘肱轟交僑咬喬嬌嶠巧攪敎校橋狡皎矯絞翹膠蕎蛟較轎郊餃驕鮫丘久九仇俱具勾"],
["cfa1","區口句咎嘔坵垢寇嶇廐懼拘救枸柩構歐毆毬求溝灸狗玖球瞿矩究絿耉臼舅舊苟衢謳購軀逑邱鉤銶駒驅鳩鷗龜國局菊鞠鞫麴君窘群裙軍郡堀屈掘窟宮弓穹窮芎躬倦券勸卷圈拳捲權淃眷厥獗蕨蹶闕机櫃潰詭軌饋句晷歸貴"],
["d0a1","鬼龜叫圭奎揆槻珪硅窺竅糾葵規赳逵閨勻均畇筠菌鈞龜橘克剋劇戟棘極隙僅劤勤懃斤根槿瑾筋芹菫覲謹近饉契今妗擒昑檎琴禁禽芩衾衿襟金錦伋及急扱汲級給亘兢矜肯企伎其冀嗜器圻基埼夔奇妓寄岐崎己幾忌技旗旣"],
["d1a1","朞期杞棋棄機欺氣汽沂淇玘琦琪璂璣畸畿碁磯祁祇祈祺箕紀綺羈耆耭肌記譏豈起錡錤飢饑騎騏驥麒緊佶吉拮桔金喫儺喇奈娜懦懶拏拿癩",5,"那樂",4,"諾酪駱亂卵暖欄煖爛蘭難鸞捏捺南嵐枏楠湳濫男藍襤拉"],
["d2a1","納臘蠟衲囊娘廊",4,"乃來內奈柰耐冷女年撚秊念恬拈捻寧寗努勞奴弩怒擄櫓爐瑙盧",5,"駑魯",10,"濃籠聾膿農惱牢磊腦賂雷尿壘",7,"嫩訥杻紐勒",5,"能菱陵尼泥匿溺多茶"],
["d3a1","丹亶但單團壇彖斷旦檀段湍短端簞緞蛋袒鄲鍛撻澾獺疸達啖坍憺擔曇淡湛潭澹痰聃膽蕁覃談譚錟沓畓答踏遝唐堂塘幢戇撞棠當糖螳黨代垈坮大對岱帶待戴擡玳臺袋貸隊黛宅德悳倒刀到圖堵塗導屠島嶋度徒悼挑掉搗桃"],
["d4a1","棹櫂淘渡滔濤燾盜睹禱稻萄覩賭跳蹈逃途道都鍍陶韜毒瀆牘犢獨督禿篤纛讀墩惇敦旽暾沌焞燉豚頓乭突仝冬凍動同憧東桐棟洞潼疼瞳童胴董銅兜斗杜枓痘竇荳讀豆逗頭屯臀芚遁遯鈍得嶝橙燈登等藤謄鄧騰喇懶拏癩羅"],
["d5a1","蘿螺裸邏樂洛烙珞絡落諾酪駱丹亂卵欄欒瀾爛蘭鸞剌辣嵐擥攬欖濫籃纜藍襤覽拉臘蠟廊朗浪狼琅瑯螂郞來崍徠萊冷掠略亮倆兩凉梁樑粮粱糧良諒輛量侶儷勵呂廬慮戾旅櫚濾礪藜蠣閭驢驪麗黎力曆歷瀝礫轢靂憐戀攣漣"],
["d6a1","煉璉練聯蓮輦連鍊冽列劣洌烈裂廉斂殮濂簾獵令伶囹寧岺嶺怜玲笭羚翎聆逞鈴零靈領齡例澧禮醴隷勞怒撈擄櫓潞瀘爐盧老蘆虜路輅露魯鷺鹵碌祿綠菉錄鹿麓論壟弄朧瀧瓏籠聾儡瀨牢磊賂賚賴雷了僚寮廖料燎療瞭聊蓼"],
["d7a1","遼鬧龍壘婁屢樓淚漏瘻累縷蔞褸鏤陋劉旒柳榴流溜瀏琉瑠留瘤硫謬類六戮陸侖倫崙淪綸輪律慄栗率隆勒肋凜凌楞稜綾菱陵俚利厘吏唎履悧李梨浬犁狸理璃異痢籬罹羸莉裏裡里釐離鯉吝潾燐璘藺躪隣鱗麟林淋琳臨霖砬"],
["d8a1","立笠粒摩瑪痲碼磨馬魔麻寞幕漠膜莫邈万卍娩巒彎慢挽晩曼滿漫灣瞞萬蔓蠻輓饅鰻唜抹末沫茉襪靺亡妄忘忙望網罔芒茫莽輞邙埋妹媒寐昧枚梅每煤罵買賣邁魅脈貊陌驀麥孟氓猛盲盟萌冪覓免冕勉棉沔眄眠綿緬面麵滅"],
["d9a1","蔑冥名命明暝椧溟皿瞑茗蓂螟酩銘鳴袂侮冒募姆帽慕摸摹暮某模母毛牟牡瑁眸矛耗芼茅謀謨貌木沐牧目睦穆鶩歿沒夢朦蒙卯墓妙廟描昴杳渺猫竗苗錨務巫憮懋戊拇撫无楙武毋無珷畝繆舞茂蕪誣貿霧鵡墨默們刎吻問文"],
["daa1","汶紊紋聞蚊門雯勿沕物味媚尾嵋彌微未梶楣渼湄眉米美薇謎迷靡黴岷悶愍憫敏旻旼民泯玟珉緡閔密蜜謐剝博拍搏撲朴樸泊珀璞箔粕縛膊舶薄迫雹駁伴半反叛拌搬攀斑槃泮潘班畔瘢盤盼磐磻礬絆般蟠返頒飯勃拔撥渤潑"],
["dba1","發跋醱鉢髮魃倣傍坊妨尨幇彷房放方旁昉枋榜滂磅紡肪膀舫芳蒡蚌訪謗邦防龐倍俳北培徘拜排杯湃焙盃背胚裴裵褙賠輩配陪伯佰帛柏栢白百魄幡樊煩燔番磻繁蕃藩飜伐筏罰閥凡帆梵氾汎泛犯範范法琺僻劈壁擘檗璧癖"],
["dca1","碧蘗闢霹便卞弁變辨辯邊別瞥鱉鼈丙倂兵屛幷昞昺柄棅炳甁病秉竝輧餠騈保堡報寶普步洑湺潽珤甫菩補褓譜輔伏僕匐卜宓復服福腹茯蔔複覆輹輻馥鰒本乶俸奉封峯峰捧棒烽熢琫縫蓬蜂逢鋒鳳不付俯傅剖副否咐埠夫婦"],
["dda1","孚孵富府復扶敷斧浮溥父符簿缶腐腑膚艀芙莩訃負賦賻赴趺部釜阜附駙鳧北分吩噴墳奔奮忿憤扮昐汾焚盆粉糞紛芬賁雰不佛弗彿拂崩朋棚硼繃鵬丕備匕匪卑妃婢庇悲憊扉批斐枇榧比毖毗毘沸泌琵痺砒碑秕秘粃緋翡肥"],
["dea1","脾臂菲蜚裨誹譬費鄙非飛鼻嚬嬪彬斌檳殯浜濱瀕牝玭貧賓頻憑氷聘騁乍事些仕伺似使俟僿史司唆嗣四士奢娑寫寺射巳師徙思捨斜斯柶査梭死沙泗渣瀉獅砂社祀祠私篩紗絲肆舍莎蓑蛇裟詐詞謝賜赦辭邪飼駟麝削數朔索"],
["dfa1","傘刪山散汕珊産疝算蒜酸霰乷撒殺煞薩三參杉森渗芟蔘衫揷澁鈒颯上傷像償商喪嘗孀尙峠常床庠廂想桑橡湘爽牀狀相祥箱翔裳觴詳象賞霜塞璽賽嗇塞穡索色牲生甥省笙墅壻嶼序庶徐恕抒捿敍暑曙書栖棲犀瑞筮絮緖署"],
["e0a1","胥舒薯西誓逝鋤黍鼠夕奭席惜昔晳析汐淅潟石碩蓆釋錫仙僊先善嬋宣扇敾旋渲煽琁瑄璇璿癬禪線繕羨腺膳船蘚蟬詵跣選銑鐥饍鮮卨屑楔泄洩渫舌薛褻設說雪齧剡暹殲纖蟾贍閃陝攝涉燮葉城姓宬性惺成星晟猩珹盛省筬"],
["e1a1","聖聲腥誠醒世勢歲洗稅笹細說貰召嘯塑宵小少巢所掃搔昭梳沼消溯瀟炤燒甦疏疎瘙笑篠簫素紹蔬蕭蘇訴逍遡邵銷韶騷俗屬束涑粟續謖贖速孫巽損蓀遜飡率宋悚松淞訟誦送頌刷殺灑碎鎖衰釗修受嗽囚垂壽嫂守岫峀帥愁"],
["e2a1","戍手授搜收數樹殊水洙漱燧狩獸琇璲瘦睡秀穗竪粹綏綬繡羞脩茱蒐蓚藪袖誰讐輸遂邃酬銖銹隋隧隨雖需須首髓鬚叔塾夙孰宿淑潚熟琡璹肅菽巡徇循恂旬栒楯橓殉洵淳珣盾瞬筍純脣舜荀蓴蕣詢諄醇錞順馴戌術述鉥崇崧"],
["e3a1","嵩瑟膝蝨濕拾習褶襲丞乘僧勝升承昇繩蠅陞侍匙嘶始媤尸屎屍市弑恃施是時枾柴猜矢示翅蒔蓍視試詩諡豕豺埴寔式息拭植殖湜熄篒蝕識軾食飾伸侁信呻娠宸愼新晨燼申神紳腎臣莘薪藎蜃訊身辛辰迅失室實悉審尋心沁"],
["e4a1","沈深瀋甚芯諶什十拾雙氏亞俄兒啞娥峨我牙芽莪蛾衙訝阿雅餓鴉鵝堊岳嶽幄惡愕握樂渥鄂鍔顎鰐齷安岸按晏案眼雁鞍顔鮟斡謁軋閼唵岩巖庵暗癌菴闇壓押狎鴨仰央怏昻殃秧鴦厓哀埃崖愛曖涯碍艾隘靄厄扼掖液縊腋額"],
["e5a1","櫻罌鶯鸚也倻冶夜惹揶椰爺耶若野弱掠略約若葯蒻藥躍亮佯兩凉壤孃恙揚攘敭暘梁楊樣洋瀁煬痒瘍禳穰糧羊良襄諒讓釀陽量養圄御於漁瘀禦語馭魚齬億憶抑檍臆偃堰彦焉言諺孼蘖俺儼嚴奄掩淹嶪業円予余勵呂女如廬"],
["e6a1","旅歟汝濾璵礖礪與艅茹輿轝閭餘驪麗黎亦力域役易曆歷疫繹譯轢逆驛嚥堧姸娟宴年延憐戀捐挻撚椽沇沿涎涓淵演漣烟然煙煉燃燕璉硏硯秊筵緣練縯聯衍軟輦蓮連鉛鍊鳶列劣咽悅涅烈熱裂說閱厭廉念捻染殮炎焰琰艶苒"],
["e7a1","簾閻髥鹽曄獵燁葉令囹塋寧嶺嶸影怜映暎楹榮永泳渶潁濚瀛瀯煐營獰玲瑛瑩瓔盈穎纓羚聆英詠迎鈴鍈零霙靈領乂倪例刈叡曳汭濊猊睿穢芮藝蘂禮裔詣譽豫醴銳隸霓預五伍俉傲午吾吳嗚塢墺奧娛寤悟惡懊敖旿晤梧汚澳"],
["e8a1","烏熬獒筽蜈誤鰲鼇屋沃獄玉鈺溫瑥瘟穩縕蘊兀壅擁瓮甕癰翁邕雍饔渦瓦窩窪臥蛙蝸訛婉完宛梡椀浣玩琓琬碗緩翫脘腕莞豌阮頑曰往旺枉汪王倭娃歪矮外嵬巍猥畏了僚僥凹堯夭妖姚寥寮尿嶢拗搖撓擾料曜樂橈燎燿瑤療"],
["e9a1","窈窯繇繞耀腰蓼蟯要謠遙遼邀饒慾欲浴縟褥辱俑傭冗勇埇墉容庸慂榕涌湧溶熔瑢用甬聳茸蓉踊鎔鏞龍于佑偶優又友右宇寓尤愚憂旴牛玗瑀盂祐禑禹紆羽芋藕虞迂遇郵釪隅雨雩勖彧旭昱栯煜稶郁頊云暈橒殞澐熉耘芸蕓"],
["eaa1","運隕雲韻蔚鬱亐熊雄元原員圓園垣媛嫄寃怨愿援沅洹湲源爰猿瑗苑袁轅遠阮院願鴛月越鉞位偉僞危圍委威尉慰暐渭爲瑋緯胃萎葦蔿蝟衛褘謂違韋魏乳侑儒兪劉唯喩孺宥幼幽庾悠惟愈愉揄攸有杻柔柚柳楡楢油洧流游溜"],
["eba1","濡猶猷琉瑜由留癒硫紐維臾萸裕誘諛諭踰蹂遊逾遺酉釉鍮類六堉戮毓肉育陸倫允奫尹崙淪潤玧胤贇輪鈗閏律慄栗率聿戎瀜絨融隆垠恩慇殷誾銀隱乙吟淫蔭陰音飮揖泣邑凝應膺鷹依倚儀宜意懿擬椅毅疑矣義艤薏蟻衣誼"],
["eca1","議醫二以伊利吏夷姨履已弛彛怡易李梨泥爾珥理異痍痢移罹而耳肄苡荑裏裡貽貳邇里離飴餌匿溺瀷益翊翌翼謚人仁刃印吝咽因姻寅引忍湮燐璘絪茵藺蚓認隣靭靷鱗麟一佚佾壹日溢逸鎰馹任壬妊姙恁林淋稔臨荏賃入卄"],
["eda1","立笠粒仍剩孕芿仔刺咨姉姿子字孜恣慈滋炙煮玆瓷疵磁紫者自茨蔗藉諮資雌作勺嚼斫昨灼炸爵綽芍酌雀鵲孱棧殘潺盞岑暫潛箴簪蠶雜丈仗匠場墻壯奬將帳庄張掌暲杖樟檣欌漿牆狀獐璋章粧腸臟臧莊葬蔣薔藏裝贓醬長"],
["eea1","障再哉在宰才材栽梓渽滓災縡裁財載齋齎爭箏諍錚佇低儲咀姐底抵杵楮樗沮渚狙猪疽箸紵苧菹著藷詛貯躇這邸雎齟勣吊嫡寂摘敵滴狄炙的積笛籍績翟荻謫賊赤跡蹟迪迹適鏑佃佺傳全典前剪塡塼奠專展廛悛戰栓殿氈澱"],
["efa1","煎琠田甸畑癲筌箋箭篆纏詮輾轉鈿銓錢鐫電顚顫餞切截折浙癤竊節絶占岾店漸点粘霑鮎點接摺蝶丁井亭停偵呈姃定幀庭廷征情挺政整旌晶晸柾楨檉正汀淀淨渟湞瀞炡玎珽町睛碇禎程穽精綎艇訂諪貞鄭酊釘鉦鋌錠霆靖"],
["f0a1","靜頂鼎制劑啼堤帝弟悌提梯濟祭第臍薺製諸蹄醍除際霽題齊俎兆凋助嘲弔彫措操早晁曺曹朝條棗槽漕潮照燥爪璪眺祖祚租稠窕粗糟組繰肇藻蚤詔調趙躁造遭釣阻雕鳥族簇足鏃存尊卒拙猝倧宗從悰慫棕淙琮種終綜縱腫"],
["f1a1","踪踵鍾鐘佐坐左座挫罪主住侏做姝胄呪周嗾奏宙州廚晝朱柱株注洲湊澍炷珠疇籌紂紬綢舟蛛註誅走躊輳週酎酒鑄駐竹粥俊儁准埈寯峻晙樽浚準濬焌畯竣蠢逡遵雋駿茁中仲衆重卽櫛楫汁葺增憎曾拯烝甑症繒蒸證贈之只"],
["f2a1","咫地址志持指摯支旨智枝枳止池沚漬知砥祉祗紙肢脂至芝芷蜘誌識贄趾遲直稙稷織職唇嗔塵振搢晉晋桭榛殄津溱珍瑨璡畛疹盡眞瞋秦縉縝臻蔯袗診賑軫辰進鎭陣陳震侄叱姪嫉帙桎瓆疾秩窒膣蛭質跌迭斟朕什執潗緝輯"],
["f3a1","鏶集徵懲澄且侘借叉嗟嵯差次此磋箚茶蹉車遮捉搾着窄錯鑿齪撰澯燦璨瓚竄簒纂粲纘讚贊鑽餐饌刹察擦札紮僭參塹慘慙懺斬站讒讖倉倡創唱娼廠彰愴敞昌昶暢槍滄漲猖瘡窓脹艙菖蒼債埰寀寨彩採砦綵菜蔡采釵冊柵策"],
["f4a1","責凄妻悽處倜刺剔尺慽戚拓擲斥滌瘠脊蹠陟隻仟千喘天川擅泉淺玔穿舛薦賤踐遷釧闡阡韆凸哲喆徹撤澈綴輟轍鐵僉尖沾添甛瞻簽籤詹諂堞妾帖捷牒疊睫諜貼輒廳晴淸聽菁請靑鯖切剃替涕滯締諦逮遞體初剿哨憔抄招梢"],
["f5a1","椒楚樵炒焦硝礁礎秒稍肖艸苕草蕉貂超酢醋醮促囑燭矗蜀觸寸忖村邨叢塚寵悤憁摠總聰蔥銃撮催崔最墜抽推椎楸樞湫皺秋芻萩諏趨追鄒酋醜錐錘鎚雛騶鰍丑畜祝竺筑築縮蓄蹙蹴軸逐春椿瑃出朮黜充忠沖蟲衝衷悴膵萃"],
["f6a1","贅取吹嘴娶就炊翠聚脆臭趣醉驟鷲側仄厠惻測層侈値嗤峙幟恥梔治淄熾痔痴癡稚穉緇緻置致蚩輜雉馳齒則勅飭親七柒漆侵寢枕沈浸琛砧針鍼蟄秤稱快他咤唾墮妥惰打拖朶楕舵陀馱駝倬卓啄坼度托拓擢晫柝濁濯琢琸託"],
["f7a1","鐸呑嘆坦彈憚歎灘炭綻誕奪脫探眈耽貪塔搭榻宕帑湯糖蕩兌台太怠態殆汰泰笞胎苔跆邰颱宅擇澤撑攄兎吐土討慟桶洞痛筒統通堆槌腿褪退頹偸套妬投透鬪慝特闖坡婆巴把播擺杷波派爬琶破罷芭跛頗判坂板版瓣販辦鈑"],
["f8a1","阪八叭捌佩唄悖敗沛浿牌狽稗覇貝彭澎烹膨愎便偏扁片篇編翩遍鞭騙貶坪平枰萍評吠嬖幣廢弊斃肺蔽閉陛佈包匍匏咆哺圃布怖抛抱捕暴泡浦疱砲胞脯苞葡蒲袍褒逋鋪飽鮑幅暴曝瀑爆輻俵剽彪慓杓標漂瓢票表豹飇飄驃"],
["f9a1","品稟楓諷豊風馮彼披疲皮被避陂匹弼必泌珌畢疋筆苾馝乏逼下何厦夏廈昰河瑕荷蝦賀遐霞鰕壑學虐謔鶴寒恨悍旱汗漢澣瀚罕翰閑閒限韓割轄函含咸啣喊檻涵緘艦銜陷鹹合哈盒蛤閤闔陜亢伉姮嫦巷恒抗杭桁沆港缸肛航"],
["faa1","行降項亥偕咳垓奚孩害懈楷海瀣蟹解該諧邂駭骸劾核倖幸杏荇行享向嚮珦鄕響餉饗香噓墟虛許憲櫶獻軒歇險驗奕爀赫革俔峴弦懸晛泫炫玄玹現眩睍絃絢縣舷衒見賢鉉顯孑穴血頁嫌俠協夾峽挾浹狹脅脇莢鋏頰亨兄刑型"],
["fba1","形泂滎瀅灐炯熒珩瑩荊螢衡逈邢鎣馨兮彗惠慧暳蕙蹊醯鞋乎互呼壕壺好岵弧戶扈昊晧毫浩淏湖滸澔濠濩灝狐琥瑚瓠皓祜糊縞胡芦葫蒿虎號蝴護豪鎬頀顥惑或酷婚昏混渾琿魂忽惚笏哄弘汞泓洪烘紅虹訌鴻化和嬅樺火畵"],
["fca1","禍禾花華話譁貨靴廓擴攫確碻穫丸喚奐宦幻患換歡晥桓渙煥環紈還驩鰥活滑猾豁闊凰幌徨恍惶愰慌晃晄榥況湟滉潢煌璜皇篁簧荒蝗遑隍黃匯回廻徊恢悔懷晦會檜淮澮灰獪繪膾茴蛔誨賄劃獲宖橫鐄哮嚆孝效斅曉梟涍淆"],
["fda1","爻肴酵驍侯候厚后吼喉嗅帿後朽煦珝逅勛勳塤壎焄熏燻薰訓暈薨喧暄煊萱卉喙毁彙徽揮暉煇諱輝麾休携烋畦虧恤譎鷸兇凶匈洶胸黑昕欣炘痕吃屹紇訖欠欽歆吸恰洽翕興僖凞喜噫囍姬嬉希憙憘戱晞曦熙熹熺犧禧稀羲詰"]
]
[
["0","\u0000",127],
["a140","　，、。．‧；：？！︰…‥﹐﹑﹒·﹔﹕﹖﹗｜–︱—︳╴︴﹏（）︵︶｛｝︷︸〔〕︹︺【】︻︼《》︽︾〈〉︿﹀「」﹁﹂『』﹃﹄﹙﹚"],
["a1a1","﹛﹜﹝﹞‘’“”〝〞‵′＃＆＊※§〃○●△▲◎☆★◇◆□■▽▼㊣℅¯￣＿ˍ﹉﹊﹍﹎﹋﹌﹟﹠﹡＋－×÷±√＜＞＝≦≧≠∞≒≡﹢",4,"～∩∪⊥∠∟⊿㏒㏑∫∮∵∴♀♂⊕⊙↑↓←→↖↗↙↘∥∣／"],
["a240","＼∕﹨＄￥〒￠￡％＠℃℉﹩﹪﹫㏕㎜㎝㎞㏎㎡㎎㎏㏄°兙兛兞兝兡兣嗧瓩糎▁",7,"▏▎▍▌▋▊▉┼┴┬┤├▔─│▕┌┐└┘╭"],
["a2a1","╮╰╯═╞╪╡◢◣◥◤╱╲╳０",9,"Ⅰ",9,"〡",8,"十卄卅Ａ",25,"ａ",21],
["a340","ｗｘｙｚΑ",16,"Σ",6,"α",16,"σ",6,"ㄅ",10],
["a3a1","ㄐ",25,"˙ˉˊˇˋ"],
["a3e1","€"],
["a440","一乙丁七乃九了二人儿入八几刀刁力匕十卜又三下丈上丫丸凡久么也乞于亡兀刃勺千叉口土士夕大女子孑孓寸小尢尸山川工己已巳巾干廾弋弓才"],
["a4a1","丑丐不中丰丹之尹予云井互五亢仁什仃仆仇仍今介仄元允內六兮公冗凶分切刈勻勾勿化匹午升卅卞厄友及反壬天夫太夭孔少尤尺屯巴幻廿弔引心戈戶手扎支文斗斤方日曰月木欠止歹毋比毛氏水火爪父爻片牙牛犬王丙"],
["a540","世丕且丘主乍乏乎以付仔仕他仗代令仙仞充兄冉冊冬凹出凸刊加功包匆北匝仟半卉卡占卯卮去可古右召叮叩叨叼司叵叫另只史叱台句叭叻四囚外"],
["a5a1","央失奴奶孕它尼巨巧左市布平幼弁弘弗必戊打扔扒扑斥旦朮本未末札正母民氐永汁汀氾犯玄玉瓜瓦甘生用甩田由甲申疋白皮皿目矛矢石示禾穴立丞丟乒乓乩亙交亦亥仿伉伙伊伕伍伐休伏仲件任仰仳份企伋光兇兆先全"],
["a640","共再冰列刑划刎刖劣匈匡匠印危吉吏同吊吐吁吋各向名合吃后吆吒因回囝圳地在圭圬圯圩夙多夷夸妄奸妃好她如妁字存宇守宅安寺尖屹州帆并年"],
["a6a1","式弛忙忖戎戌戍成扣扛托收早旨旬旭曲曳有朽朴朱朵次此死氖汝汗汙江池汐汕污汛汍汎灰牟牝百竹米糸缶羊羽老考而耒耳聿肉肋肌臣自至臼舌舛舟艮色艾虫血行衣西阡串亨位住佇佗佞伴佛何估佐佑伽伺伸佃佔似但佣"],
["a740","作你伯低伶余佝佈佚兌克免兵冶冷別判利刪刨劫助努劬匣即卵吝吭吞吾否呎吧呆呃吳呈呂君吩告吹吻吸吮吵吶吠吼呀吱含吟听囪困囤囫坊坑址坍"],
["a7a1","均坎圾坐坏圻壯夾妝妒妨妞妣妙妖妍妤妓妊妥孝孜孚孛完宋宏尬局屁尿尾岐岑岔岌巫希序庇床廷弄弟彤形彷役忘忌志忍忱快忸忪戒我抄抗抖技扶抉扭把扼找批扳抒扯折扮投抓抑抆改攻攸旱更束李杏材村杜杖杞杉杆杠"],
["a840","杓杗步每求汞沙沁沈沉沅沛汪決沐汰沌汨沖沒汽沃汲汾汴沆汶沍沔沘沂灶灼災灸牢牡牠狄狂玖甬甫男甸皂盯矣私秀禿究系罕肖肓肝肘肛肚育良芒"],
["a8a1","芋芍見角言谷豆豕貝赤走足身車辛辰迂迆迅迄巡邑邢邪邦那酉釆里防阮阱阪阬並乖乳事些亞享京佯依侍佳使佬供例來侃佰併侈佩佻侖佾侏侑佺兔兒兕兩具其典冽函刻券刷刺到刮制剁劾劻卒協卓卑卦卷卸卹取叔受味呵"],
["a940","咖呸咕咀呻呷咄咒咆呼咐呱呶和咚呢周咋命咎固垃坷坪坩坡坦坤坼夜奉奇奈奄奔妾妻委妹妮姑姆姐姍始姓姊妯妳姒姅孟孤季宗定官宜宙宛尚屈居"],
["a9a1","屆岷岡岸岩岫岱岳帘帚帖帕帛帑幸庚店府底庖延弦弧弩往征彿彼忝忠忽念忿怏怔怯怵怖怪怕怡性怩怫怛或戕房戾所承拉拌拄抿拂抹拒招披拓拔拋拈抨抽押拐拙拇拍抵拚抱拘拖拗拆抬拎放斧於旺昔易昌昆昂明昀昏昕昊"],
["aa40","昇服朋杭枋枕東果杳杷枇枝林杯杰板枉松析杵枚枓杼杪杲欣武歧歿氓氛泣注泳沱泌泥河沽沾沼波沫法泓沸泄油況沮泗泅泱沿治泡泛泊沬泯泜泖泠"],
["aaa1","炕炎炒炊炙爬爭爸版牧物狀狎狙狗狐玩玨玟玫玥甽疝疙疚的盂盲直知矽社祀祁秉秈空穹竺糾罔羌羋者肺肥肢肱股肫肩肴肪肯臥臾舍芳芝芙芭芽芟芹花芬芥芯芸芣芰芾芷虎虱初表軋迎返近邵邸邱邶采金長門阜陀阿阻附"],
["ab40","陂隹雨青非亟亭亮信侵侯便俠俑俏保促侶俘俟俊俗侮俐俄係俚俎俞侷兗冒冑冠剎剃削前剌剋則勇勉勃勁匍南卻厚叛咬哀咨哎哉咸咦咳哇哂咽咪品"],
["aba1","哄哈咯咫咱咻咩咧咿囿垂型垠垣垢城垮垓奕契奏奎奐姜姘姿姣姨娃姥姪姚姦威姻孩宣宦室客宥封屎屏屍屋峙峒巷帝帥帟幽庠度建弈弭彥很待徊律徇後徉怒思怠急怎怨恍恰恨恢恆恃恬恫恪恤扁拜挖按拼拭持拮拽指拱拷"],
["ac40","拯括拾拴挑挂政故斫施既春昭映昧是星昨昱昤曷柿染柱柔某柬架枯柵柩柯柄柑枴柚查枸柏柞柳枰柙柢柝柒歪殃殆段毒毗氟泉洋洲洪流津洌洱洞洗"],
["aca1","活洽派洶洛泵洹洧洸洩洮洵洎洫炫為炳炬炯炭炸炮炤爰牲牯牴狩狠狡玷珊玻玲珍珀玳甚甭畏界畎畋疫疤疥疢疣癸皆皇皈盈盆盃盅省盹相眉看盾盼眇矜砂研砌砍祆祉祈祇禹禺科秒秋穿突竿竽籽紂紅紀紉紇約紆缸美羿耄"],
["ad40","耐耍耑耶胖胥胚胃胄背胡胛胎胞胤胝致舢苧范茅苣苛苦茄若茂茉苒苗英茁苜苔苑苞苓苟苯茆虐虹虻虺衍衫要觔計訂訃貞負赴赳趴軍軌述迦迢迪迥"],
["ada1","迭迫迤迨郊郎郁郃酋酊重閂限陋陌降面革韋韭音頁風飛食首香乘亳倌倍倣俯倦倥俸倩倖倆值借倚倒們俺倀倔倨俱倡個候倘俳修倭倪俾倫倉兼冤冥冢凍凌准凋剖剜剔剛剝匪卿原厝叟哨唐唁唷哼哥哲唆哺唔哩哭員唉哮哪"],
["ae40","哦唧唇哽唏圃圄埂埔埋埃堉夏套奘奚娑娘娜娟娛娓姬娠娣娩娥娌娉孫屘宰害家宴宮宵容宸射屑展屐峭峽峻峪峨峰島崁峴差席師庫庭座弱徒徑徐恙"],
["aea1","恣恥恐恕恭恩息悄悟悚悍悔悌悅悖扇拳挈拿捎挾振捕捂捆捏捉挺捐挽挪挫挨捍捌效敉料旁旅時晉晏晃晒晌晅晁書朔朕朗校核案框桓根桂桔栩梳栗桌桑栽柴桐桀格桃株桅栓栘桁殊殉殷氣氧氨氦氤泰浪涕消涇浦浸海浙涓"],
["af40","浬涉浮浚浴浩涌涊浹涅浥涔烊烘烤烙烈烏爹特狼狹狽狸狷玆班琉珮珠珪珞畔畝畜畚留疾病症疲疳疽疼疹痂疸皋皰益盍盎眩真眠眨矩砰砧砸砝破砷"],
["afa1","砥砭砠砟砲祕祐祠祟祖神祝祗祚秤秣秧租秦秩秘窄窈站笆笑粉紡紗紋紊素索純紐紕級紜納紙紛缺罟羔翅翁耆耘耕耙耗耽耿胱脂胰脅胭胴脆胸胳脈能脊胼胯臭臬舀舐航舫舨般芻茫荒荔荊茸荐草茵茴荏茲茹茶茗荀茱茨荃"],
["b040","虔蚊蚪蚓蚤蚩蚌蚣蚜衰衷袁袂衽衹記訐討訌訕訊託訓訖訏訑豈豺豹財貢起躬軒軔軏辱送逆迷退迺迴逃追逅迸邕郡郝郢酒配酌釘針釗釜釙閃院陣陡"],
["b0a1","陛陝除陘陞隻飢馬骨高鬥鬲鬼乾偺偽停假偃偌做偉健偶偎偕偵側偷偏倏偯偭兜冕凰剪副勒務勘動匐匏匙匿區匾參曼商啪啦啄啞啡啃啊唱啖問啕唯啤唸售啜唬啣唳啁啗圈國圉域堅堊堆埠埤基堂堵執培夠奢娶婁婉婦婪婀"],
["b140","娼婢婚婆婊孰寇寅寄寂宿密尉專將屠屜屝崇崆崎崛崖崢崑崩崔崙崤崧崗巢常帶帳帷康庸庶庵庾張強彗彬彩彫得徙從徘御徠徜恿患悉悠您惋悴惦悽"],
["b1a1","情悻悵惜悼惘惕惆惟悸惚惇戚戛扈掠控捲掖探接捷捧掘措捱掩掉掃掛捫推掄授掙採掬排掏掀捻捩捨捺敝敖救教敗啟敏敘敕敔斜斛斬族旋旌旎晝晚晤晨晦晞曹勗望梁梯梢梓梵桿桶梱梧梗械梃棄梭梆梅梔條梨梟梡梂欲殺"],
["b240","毫毬氫涎涼淳淙液淡淌淤添淺清淇淋涯淑涮淞淹涸混淵淅淒渚涵淚淫淘淪深淮淨淆淄涪淬涿淦烹焉焊烽烯爽牽犁猜猛猖猓猙率琅琊球理現琍瓠瓶"],
["b2a1","瓷甜產略畦畢異疏痔痕疵痊痍皎盔盒盛眷眾眼眶眸眺硫硃硎祥票祭移窒窕笠笨笛第符笙笞笮粒粗粕絆絃統紮紹紼絀細紳組累終紲紱缽羞羚翌翎習耜聊聆脯脖脣脫脩脰脤舂舵舷舶船莎莞莘荸莢莖莽莫莒莊莓莉莠荷荻荼"],
["b340","莆莧處彪蛇蛀蚶蛄蚵蛆蛋蚱蚯蛉術袞袈被袒袖袍袋覓規訪訝訣訥許設訟訛訢豉豚販責貫貨貪貧赧赦趾趺軛軟這逍通逗連速逝逐逕逞造透逢逖逛途"],
["b3a1","部郭都酗野釵釦釣釧釭釩閉陪陵陳陸陰陴陶陷陬雀雪雩章竟頂頃魚鳥鹵鹿麥麻傢傍傅備傑傀傖傘傚最凱割剴創剩勞勝勛博厥啻喀喧啼喊喝喘喂喜喪喔喇喋喃喳單喟唾喲喚喻喬喱啾喉喫喙圍堯堪場堤堰報堡堝堠壹壺奠"],
["b440","婷媚婿媒媛媧孳孱寒富寓寐尊尋就嵌嵐崴嵇巽幅帽幀幃幾廊廁廂廄弼彭復循徨惑惡悲悶惠愜愣惺愕惰惻惴慨惱愎惶愉愀愒戟扉掣掌描揀揩揉揆揍"],
["b4a1","插揣提握揖揭揮捶援揪換摒揚揹敞敦敢散斑斐斯普晰晴晶景暑智晾晷曾替期朝棺棕棠棘棗椅棟棵森棧棹棒棲棣棋棍植椒椎棉棚楮棻款欺欽殘殖殼毯氮氯氬港游湔渡渲湧湊渠渥渣減湛湘渤湖湮渭渦湯渴湍渺測湃渝渾滋"],
["b540","溉渙湎湣湄湲湩湟焙焚焦焰無然煮焜牌犄犀猶猥猴猩琺琪琳琢琥琵琶琴琯琛琦琨甥甦畫番痢痛痣痙痘痞痠登發皖皓皴盜睏短硝硬硯稍稈程稅稀窘"],
["b5a1","窗窖童竣等策筆筐筒答筍筋筏筑粟粥絞結絨絕紫絮絲絡給絢絰絳善翔翕耋聒肅腕腔腋腑腎脹腆脾腌腓腴舒舜菩萃菸萍菠菅萋菁華菱菴著萊菰萌菌菽菲菊萸萎萄菜萇菔菟虛蛟蛙蛭蛔蛛蛤蛐蛞街裁裂袱覃視註詠評詞証詁"],
["b640","詔詛詐詆訴診訶詖象貂貯貼貳貽賁費賀貴買貶貿貸越超趁跎距跋跚跑跌跛跆軻軸軼辜逮逵週逸進逶鄂郵鄉郾酣酥量鈔鈕鈣鈉鈞鈍鈐鈇鈑閔閏開閑"],
["b6a1","間閒閎隊階隋陽隅隆隍陲隄雁雅雄集雇雯雲韌項順須飧飪飯飩飲飭馮馭黃黍黑亂傭債傲傳僅傾催傷傻傯僇剿剷剽募勦勤勢勣匯嗟嗨嗓嗦嗎嗜嗇嗑嗣嗤嗯嗚嗡嗅嗆嗥嗉園圓塞塑塘塗塚塔填塌塭塊塢塒塋奧嫁嫉嫌媾媽媼"],
["b740","媳嫂媲嵩嵯幌幹廉廈弒彙徬微愚意慈感想愛惹愁愈慎慌慄慍愾愴愧愍愆愷戡戢搓搾搞搪搭搽搬搏搜搔損搶搖搗搆敬斟新暗暉暇暈暖暄暘暍會榔業"],
["b7a1","楚楷楠楔極椰概楊楨楫楞楓楹榆楝楣楛歇歲毀殿毓毽溢溯滓溶滂源溝滇滅溥溘溼溺溫滑準溜滄滔溪溧溴煎煙煩煤煉照煜煬煦煌煥煞煆煨煖爺牒猷獅猿猾瑯瑚瑕瑟瑞瑁琿瑙瑛瑜當畸瘀痰瘁痲痱痺痿痴痳盞盟睛睫睦睞督"],
["b840","睹睪睬睜睥睨睢矮碎碰碗碘碌碉硼碑碓硿祺祿禁萬禽稜稚稠稔稟稞窟窠筷節筠筮筧粱粳粵經絹綑綁綏絛置罩罪署義羨群聖聘肆肄腱腰腸腥腮腳腫"],
["b8a1","腹腺腦舅艇蒂葷落萱葵葦葫葉葬葛萼萵葡董葩葭葆虞虜號蛹蜓蜈蜇蜀蛾蛻蜂蜃蜆蜊衙裟裔裙補裘裝裡裊裕裒覜解詫該詳試詩詰誇詼詣誠話誅詭詢詮詬詹詻訾詨豢貊貉賊資賈賄貲賃賂賅跡跟跨路跳跺跪跤跦躲較載軾輊"],
["b940","辟農運遊道遂達逼違遐遇遏過遍遑逾遁鄒鄗酬酪酩釉鈷鉗鈸鈽鉀鈾鉛鉋鉤鉑鈴鉉鉍鉅鈹鈿鉚閘隘隔隕雍雋雉雊雷電雹零靖靴靶預頑頓頊頒頌飼飴"],
["b9a1","飽飾馳馱馴髡鳩麂鼎鼓鼠僧僮僥僖僭僚僕像僑僱僎僩兢凳劃劂匱厭嗾嘀嘛嘗嗽嘔嘆嘉嘍嘎嗷嘖嘟嘈嘐嗶團圖塵塾境墓墊塹墅塽壽夥夢夤奪奩嫡嫦嫩嫗嫖嫘嫣孵寞寧寡寥實寨寢寤察對屢嶄嶇幛幣幕幗幔廓廖弊彆彰徹慇"],
["ba40","愿態慷慢慣慟慚慘慵截撇摘摔撤摸摟摺摑摧搴摭摻敲斡旗旖暢暨暝榜榨榕槁榮槓構榛榷榻榫榴槐槍榭槌榦槃榣歉歌氳漳演滾漓滴漩漾漠漬漏漂漢"],
["baa1","滿滯漆漱漸漲漣漕漫漯澈漪滬漁滲滌滷熔熙煽熊熄熒爾犒犖獄獐瑤瑣瑪瑰瑭甄疑瘧瘍瘋瘉瘓盡監瞄睽睿睡磁碟碧碳碩碣禎福禍種稱窪窩竭端管箕箋筵算箝箔箏箸箇箄粹粽精綻綰綜綽綾綠緊綴網綱綺綢綿綵綸維緒緇綬"],
["bb40","罰翠翡翟聞聚肇腐膀膏膈膊腿膂臧臺與舔舞艋蓉蒿蓆蓄蒙蒞蒲蒜蓋蒸蓀蓓蒐蒼蓑蓊蜿蜜蜻蜢蜥蜴蜘蝕蜷蜩裳褂裴裹裸製裨褚裯誦誌語誣認誡誓誤"],
["bba1","說誥誨誘誑誚誧豪貍貌賓賑賒赫趙趕跼輔輒輕輓辣遠遘遜遣遙遞遢遝遛鄙鄘鄞酵酸酷酴鉸銀銅銘銖鉻銓銜銨鉼銑閡閨閩閣閥閤隙障際雌雒需靼鞅韶頗領颯颱餃餅餌餉駁骯骰髦魁魂鳴鳶鳳麼鼻齊億儀僻僵價儂儈儉儅凜"],
["bc40","劇劈劉劍劊勰厲嘮嘻嘹嘲嘿嘴嘩噓噎噗噴嘶嘯嘰墀墟增墳墜墮墩墦奭嬉嫻嬋嫵嬌嬈寮寬審寫層履嶝嶔幢幟幡廢廚廟廝廣廠彈影德徵慶慧慮慝慕憂"],
["bca1","慼慰慫慾憧憐憫憎憬憚憤憔憮戮摩摯摹撞撲撈撐撰撥撓撕撩撒撮播撫撚撬撙撢撳敵敷數暮暫暴暱樣樟槨樁樞標槽模樓樊槳樂樅槭樑歐歎殤毅毆漿潼澄潑潦潔澆潭潛潸潮澎潺潰潤澗潘滕潯潠潟熟熬熱熨牖犛獎獗瑩璋璃"],
["bd40","瑾璀畿瘠瘩瘟瘤瘦瘡瘢皚皺盤瞎瞇瞌瞑瞋磋磅確磊碾磕碼磐稿稼穀稽稷稻窯窮箭箱範箴篆篇篁箠篌糊締練緯緻緘緬緝編緣線緞緩綞緙緲緹罵罷羯"],
["bda1","翩耦膛膜膝膠膚膘蔗蔽蔚蓮蔬蔭蔓蔑蔣蔡蔔蓬蔥蓿蔆螂蝴蝶蝠蝦蝸蝨蝙蝗蝌蝓衛衝褐複褒褓褕褊誼諒談諄誕請諸課諉諂調誰論諍誶誹諛豌豎豬賠賞賦賤賬賭賢賣賜質賡赭趟趣踫踐踝踢踏踩踟踡踞躺輝輛輟輩輦輪輜輞"],
["be40","輥適遮遨遭遷鄰鄭鄧鄱醇醉醋醃鋅銻銷鋪銬鋤鋁銳銼鋒鋇鋰銲閭閱霄霆震霉靠鞍鞋鞏頡頫頜颳養餓餒餘駝駐駟駛駑駕駒駙骷髮髯鬧魅魄魷魯鴆鴉"],
["bea1","鴃麩麾黎墨齒儒儘儔儐儕冀冪凝劑劓勳噙噫噹噩噤噸噪器噥噱噯噬噢噶壁墾壇壅奮嬝嬴學寰導彊憲憑憩憊懍憶憾懊懈戰擅擁擋撻撼據擄擇擂操撿擒擔撾整曆曉暹曄曇暸樽樸樺橙橫橘樹橄橢橡橋橇樵機橈歙歷氅濂澱澡"],
["bf40","濃澤濁澧澳激澹澶澦澠澴熾燉燐燒燈燕熹燎燙燜燃燄獨璜璣璘璟璞瓢甌甍瘴瘸瘺盧盥瞠瞞瞟瞥磨磚磬磧禦積穎穆穌穋窺篙簑築篤篛篡篩篦糕糖縊"],
["bfa1","縑縈縛縣縞縝縉縐罹羲翰翱翮耨膳膩膨臻興艘艙蕊蕙蕈蕨蕩蕃蕉蕭蕪蕞螃螟螞螢融衡褪褲褥褫褡親覦諦諺諫諱謀諜諧諮諾謁謂諷諭諳諶諼豫豭貓賴蹄踱踴蹂踹踵輻輯輸輳辨辦遵遴選遲遼遺鄴醒錠錶鋸錳錯錢鋼錫錄錚"],
["c040","錐錦錡錕錮錙閻隧隨險雕霎霑霖霍霓霏靛靜靦鞘頰頸頻頷頭頹頤餐館餞餛餡餚駭駢駱骸骼髻髭鬨鮑鴕鴣鴦鴨鴒鴛默黔龍龜優償儡儲勵嚎嚀嚐嚅嚇"],
["c0a1","嚏壕壓壑壎嬰嬪嬤孺尷屨嶼嶺嶽嶸幫彌徽應懂懇懦懋戲戴擎擊擘擠擰擦擬擱擢擭斂斃曙曖檀檔檄檢檜櫛檣橾檗檐檠歜殮毚氈濘濱濟濠濛濤濫濯澀濬濡濩濕濮濰燧營燮燦燥燭燬燴燠爵牆獰獲璩環璦璨癆療癌盪瞳瞪瞰瞬"],
["c140","瞧瞭矯磷磺磴磯礁禧禪穗窿簇簍篾篷簌篠糠糜糞糢糟糙糝縮績繆縷縲繃縫總縱繅繁縴縹繈縵縿縯罄翳翼聱聲聰聯聳臆臃膺臂臀膿膽臉膾臨舉艱薪"],
["c1a1","薄蕾薜薑薔薯薛薇薨薊虧蟀蟑螳蟒蟆螫螻螺蟈蟋褻褶襄褸褽覬謎謗謙講謊謠謝謄謐豁谿豳賺賽購賸賻趨蹉蹋蹈蹊轄輾轂轅輿避遽還邁邂邀鄹醣醞醜鍍鎂錨鍵鍊鍥鍋錘鍾鍬鍛鍰鍚鍔闊闋闌闈闆隱隸雖霜霞鞠韓顆颶餵騁"],
["c240","駿鮮鮫鮪鮭鴻鴿麋黏點黜黝黛鼾齋叢嚕嚮壙壘嬸彝懣戳擴擲擾攆擺擻擷斷曜朦檳檬櫃檻檸櫂檮檯歟歸殯瀉瀋濾瀆濺瀑瀏燻燼燾燸獷獵璧璿甕癖癘"],
["c2a1","癒瞽瞿瞻瞼礎禮穡穢穠竄竅簫簧簪簞簣簡糧織繕繞繚繡繒繙罈翹翻職聶臍臏舊藏薩藍藐藉薰薺薹薦蟯蟬蟲蟠覆覲觴謨謹謬謫豐贅蹙蹣蹦蹤蹟蹕軀轉轍邇邃邈醫醬釐鎔鎊鎖鎢鎳鎮鎬鎰鎘鎚鎗闔闖闐闕離雜雙雛雞霤鞣鞦"],
["c340","鞭韹額顏題顎顓颺餾餿餽餮馥騎髁鬃鬆魏魎魍鯊鯉鯽鯈鯀鵑鵝鵠黠鼕鼬儳嚥壞壟壢寵龐廬懲懷懶懵攀攏曠曝櫥櫝櫚櫓瀛瀟瀨瀚瀝瀕瀘爆爍牘犢獸"],
["c3a1","獺璽瓊瓣疇疆癟癡矇礙禱穫穩簾簿簸簽簷籀繫繭繹繩繪羅繳羶羹羸臘藩藝藪藕藤藥藷蟻蠅蠍蟹蟾襠襟襖襞譁譜識證譚譎譏譆譙贈贊蹼蹲躇蹶蹬蹺蹴轔轎辭邊邋醱醮鏡鏑鏟鏃鏈鏜鏝鏖鏢鏍鏘鏤鏗鏨關隴難霪霧靡韜韻類"],
["c440","願顛颼饅饉騖騙鬍鯨鯧鯖鯛鶉鵡鵲鵪鵬麒麗麓麴勸嚨嚷嚶嚴嚼壤孀孃孽寶巉懸懺攘攔攙曦朧櫬瀾瀰瀲爐獻瓏癢癥礦礪礬礫竇競籌籃籍糯糰辮繽繼"],
["c4a1","纂罌耀臚艦藻藹蘑藺蘆蘋蘇蘊蠔蠕襤覺觸議譬警譯譟譫贏贍躉躁躅躂醴釋鐘鐃鏽闡霰飄饒饑馨騫騰騷騵鰓鰍鹹麵黨鼯齟齣齡儷儸囁囀囂夔屬巍懼懾攝攜斕曩櫻欄櫺殲灌爛犧瓖瓔癩矓籐纏續羼蘗蘭蘚蠣蠢蠡蠟襪襬覽譴"],
["c540","護譽贓躊躍躋轟辯醺鐮鐳鐵鐺鐸鐲鐫闢霸霹露響顧顥饗驅驃驀騾髏魔魑鰭鰥鶯鶴鷂鶸麝黯鼙齜齦齧儼儻囈囊囉孿巔巒彎懿攤權歡灑灘玀瓤疊癮癬"],
["c5a1","禳籠籟聾聽臟襲襯觼讀贖贗躑躓轡酈鑄鑑鑒霽霾韃韁顫饕驕驍髒鬚鱉鰱鰾鰻鷓鷗鼴齬齪龔囌巖戀攣攫攪曬欐瓚竊籤籣籥纓纖纔臢蘸蘿蠱變邐邏鑣鑠鑤靨顯饜驚驛驗髓體髑鱔鱗鱖鷥麟黴囑壩攬灞癱癲矗罐羈蠶蠹衢讓讒"],
["c640","讖艷贛釀鑪靂靈靄韆顰驟鬢魘鱟鷹鷺鹼鹽鼇齷齲廳欖灣籬籮蠻觀躡釁鑲鑰顱饞髖鬣黌灤矚讚鑷韉驢驥纜讜躪釅鑽鑾鑼鱷鱸黷豔鑿鸚爨驪鬱鸛鸞籲"],
["c940","乂乜凵匚厂万丌乇亍囗兀屮彳丏冇与丮亓仂仉仈冘勼卬厹圠夃夬尐巿旡殳毌气爿丱丼仨仜仩仡仝仚刌匜卌圢圣夗夯宁宄尒尻屴屳帄庀庂忉戉扐氕"],
["c9a1","氶汃氿氻犮犰玊禸肊阞伎优伬仵伔仱伀价伈伝伂伅伢伓伄仴伒冱刓刉刐劦匢匟卍厊吇囡囟圮圪圴夼妀奼妅奻奾奷奿孖尕尥屼屺屻屾巟幵庄异弚彴忕忔忏扜扞扤扡扦扢扙扠扚扥旯旮朾朹朸朻机朿朼朳氘汆汒汜汏汊汔汋"],
["ca40","汌灱牞犴犵玎甪癿穵网艸艼芀艽艿虍襾邙邗邘邛邔阢阤阠阣佖伻佢佉体佤伾佧佒佟佁佘伭伳伿佡冏冹刜刞刡劭劮匉卣卲厎厏吰吷吪呔呅吙吜吥吘"],
["caa1","吽呏呁吨吤呇囮囧囥坁坅坌坉坋坒夆奀妦妘妠妗妎妢妐妏妧妡宎宒尨尪岍岏岈岋岉岒岊岆岓岕巠帊帎庋庉庌庈庍弅弝彸彶忒忑忐忭忨忮忳忡忤忣忺忯忷忻怀忴戺抃抌抎抏抔抇扱扻扺扰抁抈扷扽扲扴攷旰旴旳旲旵杅杇"],
["cb40","杙杕杌杈杝杍杚杋毐氙氚汸汧汫沄沋沏汱汯汩沚汭沇沕沜汦汳汥汻沎灴灺牣犿犽狃狆狁犺狅玕玗玓玔玒町甹疔疕皁礽耴肕肙肐肒肜芐芏芅芎芑芓"],
["cba1","芊芃芄豸迉辿邟邡邥邞邧邠阰阨阯阭丳侘佼侅佽侀侇佶佴侉侄佷佌侗佪侚佹侁佸侐侜侔侞侒侂侕佫佮冞冼冾刵刲刳剆刱劼匊匋匼厒厔咇呿咁咑咂咈呫呺呾呥呬呴呦咍呯呡呠咘呣呧呤囷囹坯坲坭坫坱坰坶垀坵坻坳坴坢"],
["cc40","坨坽夌奅妵妺姏姎妲姌姁妶妼姃姖妱妽姀姈妴姇孢孥宓宕屄屇岮岤岠岵岯岨岬岟岣岭岢岪岧岝岥岶岰岦帗帔帙弨弢弣弤彔徂彾彽忞忥怭怦怙怲怋"],
["cca1","怴怊怗怳怚怞怬怢怍怐怮怓怑怌怉怜戔戽抭抴拑抾抪抶拊抮抳抯抻抩抰抸攽斨斻昉旼昄昒昈旻昃昋昍昅旽昑昐曶朊枅杬枎枒杶杻枘枆构杴枍枌杺枟枑枙枃杽极杸杹枔欥殀歾毞氝沓泬泫泮泙沶泔沭泧沷泐泂沺泃泆泭泲"],
["cd40","泒泝沴沊沝沀泞泀洰泍泇沰泹泏泩泑炔炘炅炓炆炄炑炖炂炚炃牪狖狋狘狉狜狒狔狚狌狑玤玡玭玦玢玠玬玝瓝瓨甿畀甾疌疘皯盳盱盰盵矸矼矹矻矺"],
["cda1","矷祂礿秅穸穻竻籵糽耵肏肮肣肸肵肭舠芠苀芫芚芘芛芵芧芮芼芞芺芴芨芡芩苂芤苃芶芢虰虯虭虮豖迒迋迓迍迖迕迗邲邴邯邳邰阹阽阼阺陃俍俅俓侲俉俋俁俔俜俙侻侳俛俇俖侺俀侹俬剄剉勀勂匽卼厗厖厙厘咺咡咭咥哏"],
["ce40","哃茍咷咮哖咶哅哆咠呰咼咢咾呲哞咰垵垞垟垤垌垗垝垛垔垘垏垙垥垚垕壴复奓姡姞姮娀姱姝姺姽姼姶姤姲姷姛姩姳姵姠姾姴姭宨屌峐峘峌峗峋峛"],
["cea1","峞峚峉峇峊峖峓峔峏峈峆峎峟峸巹帡帢帣帠帤庰庤庢庛庣庥弇弮彖徆怷怹恔恲恞恅恓恇恉恛恌恀恂恟怤恄恘恦恮扂扃拏挍挋拵挎挃拫拹挏挌拸拶挀挓挔拺挕拻拰敁敃斪斿昶昡昲昵昜昦昢昳昫昺昝昴昹昮朏朐柁柲柈枺"],
["cf40","柜枻柸柘柀枷柅柫柤柟枵柍枳柷柶柮柣柂枹柎柧柰枲柼柆柭柌枮柦柛柺柉柊柃柪柋欨殂殄殶毖毘毠氠氡洨洴洭洟洼洿洒洊泚洳洄洙洺洚洑洀洝浂"],
["cfa1","洁洘洷洃洏浀洇洠洬洈洢洉洐炷炟炾炱炰炡炴炵炩牁牉牊牬牰牳牮狊狤狨狫狟狪狦狣玅珌珂珈珅玹玶玵玴珫玿珇玾珃珆玸珋瓬瓮甮畇畈疧疪癹盄眈眃眄眅眊盷盻盺矧矨砆砑砒砅砐砏砎砉砃砓祊祌祋祅祄秕种秏秖秎窀"],
["d040","穾竑笀笁籺籸籹籿粀粁紃紈紁罘羑羍羾耇耎耏耔耷胘胇胠胑胈胂胐胅胣胙胜胊胕胉胏胗胦胍臿舡芔苙苾苹茇苨茀苕茺苫苖苴苬苡苲苵茌苻苶苰苪"],
["d0a1","苤苠苺苳苭虷虴虼虳衁衎衧衪衩觓訄訇赲迣迡迮迠郱邽邿郕郅邾郇郋郈釔釓陔陏陑陓陊陎倞倅倇倓倢倰倛俵俴倳倷倬俶俷倗倜倠倧倵倯倱倎党冔冓凊凄凅凈凎剡剚剒剞剟剕剢勍匎厞唦哢唗唒哧哳哤唚哿唄唈哫唑唅哱"],
["d140","唊哻哷哸哠唎唃唋圁圂埌堲埕埒垺埆垽垼垸垶垿埇埐垹埁夎奊娙娖娭娮娕娏娗娊娞娳孬宧宭宬尃屖屔峬峿峮峱峷崀峹帩帨庨庮庪庬弳弰彧恝恚恧"],
["d1a1","恁悢悈悀悒悁悝悃悕悛悗悇悜悎戙扆拲挐捖挬捄捅挶捃揤挹捋捊挼挩捁挴捘捔捙挭捇挳捚捑挸捗捀捈敊敆旆旃旄旂晊晟晇晑朒朓栟栚桉栲栳栻桋桏栖栱栜栵栫栭栯桎桄栴栝栒栔栦栨栮桍栺栥栠欬欯欭欱欴歭肂殈毦毤"],
["d240","毨毣毢毧氥浺浣浤浶洍浡涒浘浢浭浯涑涍淯浿涆浞浧浠涗浰浼浟涂涘洯浨涋浾涀涄洖涃浻浽浵涐烜烓烑烝烋缹烢烗烒烞烠烔烍烅烆烇烚烎烡牂牸"],
["d2a1","牷牶猀狺狴狾狶狳狻猁珓珙珥珖玼珧珣珩珜珒珛珔珝珚珗珘珨瓞瓟瓴瓵甡畛畟疰痁疻痄痀疿疶疺皊盉眝眛眐眓眒眣眑眕眙眚眢眧砣砬砢砵砯砨砮砫砡砩砳砪砱祔祛祏祜祓祒祑秫秬秠秮秭秪秜秞秝窆窉窅窋窌窊窇竘笐"],
["d340","笄笓笅笏笈笊笎笉笒粄粑粊粌粈粍粅紞紝紑紎紘紖紓紟紒紏紌罜罡罞罠罝罛羖羒翃翂翀耖耾耹胺胲胹胵脁胻脀舁舯舥茳茭荄茙荑茥荖茿荁茦茜茢"],
["d3a1","荂荎茛茪茈茼荍茖茤茠茷茯茩荇荅荌荓茞茬荋茧荈虓虒蚢蚨蚖蚍蚑蚞蚇蚗蚆蚋蚚蚅蚥蚙蚡蚧蚕蚘蚎蚝蚐蚔衃衄衭衵衶衲袀衱衿衯袃衾衴衼訒豇豗豻貤貣赶赸趵趷趶軑軓迾迵适迿迻逄迼迶郖郠郙郚郣郟郥郘郛郗郜郤酐"],
["d440","酎酏釕釢釚陜陟隼飣髟鬯乿偰偪偡偞偠偓偋偝偲偈偍偁偛偊偢倕偅偟偩偫偣偤偆偀偮偳偗偑凐剫剭剬剮勖勓匭厜啵啶唼啍啐唴唪啑啢唶唵唰啒啅"],
["d4a1","唌唲啥啎唹啈唭唻啀啋圊圇埻堔埢埶埜埴堀埭埽堈埸堋埳埏堇埮埣埲埥埬埡堎埼堐埧堁堌埱埩埰堍堄奜婠婘婕婧婞娸娵婭婐婟婥婬婓婤婗婃婝婒婄婛婈媎娾婍娹婌婰婩婇婑婖婂婜孲孮寁寀屙崞崋崝崚崠崌崨崍崦崥崏"],
["d540","崰崒崣崟崮帾帴庱庴庹庲庳弶弸徛徖徟悊悐悆悾悰悺惓惔惏惤惙惝惈悱惛悷惊悿惃惍惀挲捥掊掂捽掽掞掭掝掗掫掎捯掇掐据掯捵掜捭掮捼掤挻掟"],
["d5a1","捸掅掁掑掍捰敓旍晥晡晛晙晜晢朘桹梇梐梜桭桮梮梫楖桯梣梬梩桵桴梲梏桷梒桼桫桲梪梀桱桾梛梖梋梠梉梤桸桻梑梌梊桽欶欳欷欸殑殏殍殎殌氪淀涫涴涳湴涬淩淢涷淶淔渀淈淠淟淖涾淥淜淝淛淴淊涽淭淰涺淕淂淏淉"],
["d640","淐淲淓淽淗淍淣涻烺焍烷焗烴焌烰焄烳焐烼烿焆焓焀烸烶焋焂焎牾牻牼牿猝猗猇猑猘猊猈狿猏猞玈珶珸珵琄琁珽琇琀珺珼珿琌琋珴琈畤畣痎痒痏"],
["d6a1","痋痌痑痐皏皉盓眹眯眭眱眲眴眳眽眥眻眵硈硒硉硍硊硌砦硅硐祤祧祩祪祣祫祡离秺秸秶秷窏窔窐笵筇笴笥笰笢笤笳笘笪笝笱笫笭笯笲笸笚笣粔粘粖粣紵紽紸紶紺絅紬紩絁絇紾紿絊紻紨罣羕羜羝羛翊翋翍翐翑翇翏翉耟"],
["d740","耞耛聇聃聈脘脥脙脛脭脟脬脞脡脕脧脝脢舑舸舳舺舴舲艴莐莣莨莍荺荳莤荴莏莁莕莙荵莔莩荽莃莌莝莛莪莋荾莥莯莈莗莰荿莦莇莮荶莚虙虖蚿蚷"],
["d7a1","蛂蛁蛅蚺蚰蛈蚹蚳蚸蛌蚴蚻蚼蛃蚽蚾衒袉袕袨袢袪袚袑袡袟袘袧袙袛袗袤袬袌袓袎覂觖觙觕訰訧訬訞谹谻豜豝豽貥赽赻赹趼跂趹趿跁軘軞軝軜軗軠軡逤逋逑逜逌逡郯郪郰郴郲郳郔郫郬郩酖酘酚酓酕釬釴釱釳釸釤釹釪"],
["d840","釫釷釨釮镺閆閈陼陭陫陱陯隿靪頄飥馗傛傕傔傞傋傣傃傌傎傝偨傜傒傂傇兟凔匒匑厤厧喑喨喥喭啷噅喢喓喈喏喵喁喣喒喤啽喌喦啿喕喡喎圌堩堷"],
["d8a1","堙堞堧堣堨埵塈堥堜堛堳堿堶堮堹堸堭堬堻奡媯媔媟婺媢媞婸媦婼媥媬媕媮娷媄媊媗媃媋媩婻婽媌媜媏媓媝寪寍寋寔寑寊寎尌尰崷嵃嵫嵁嵋崿崵嵑嵎嵕崳崺嵒崽崱嵙嵂崹嵉崸崼崲崶嵀嵅幄幁彘徦徥徫惉悹惌惢惎惄愔"],
["d940","惲愊愖愅惵愓惸惼惾惁愃愘愝愐惿愄愋扊掔掱掰揎揥揨揯揃撝揳揊揠揶揕揲揵摡揟掾揝揜揄揘揓揂揇揌揋揈揰揗揙攲敧敪敤敜敨敥斌斝斞斮旐旒"],
["d9a1","晼晬晻暀晱晹晪晲朁椌棓椄棜椪棬棪棱椏棖棷棫棤棶椓椐棳棡椇棌椈楰梴椑棯棆椔棸棐棽棼棨椋椊椗棎棈棝棞棦棴棑椆棔棩椕椥棇欹欻欿欼殔殗殙殕殽毰毲毳氰淼湆湇渟湉溈渼渽湅湢渫渿湁湝湳渜渳湋湀湑渻渃渮湞"],
["da40","湨湜湡渱渨湠湱湫渹渢渰湓湥渧湸湤湷湕湹湒湦渵渶湚焠焞焯烻焮焱焣焥焢焲焟焨焺焛牋牚犈犉犆犅犋猒猋猰猢猱猳猧猲猭猦猣猵猌琮琬琰琫琖"],
["daa1","琚琡琭琱琤琣琝琩琠琲瓻甯畯畬痧痚痡痦痝痟痤痗皕皒盚睆睇睄睍睅睊睎睋睌矞矬硠硤硥硜硭硱硪确硰硩硨硞硢祴祳祲祰稂稊稃稌稄窙竦竤筊笻筄筈筌筎筀筘筅粢粞粨粡絘絯絣絓絖絧絪絏絭絜絫絒絔絩絑絟絎缾缿罥"],
["db40","罦羢羠羡翗聑聏聐胾胔腃腊腒腏腇脽腍脺臦臮臷臸臹舄舼舽舿艵茻菏菹萣菀菨萒菧菤菼菶萐菆菈菫菣莿萁菝菥菘菿菡菋菎菖菵菉萉萏菞萑萆菂菳"],
["dba1","菕菺菇菑菪萓菃菬菮菄菻菗菢萛菛菾蛘蛢蛦蛓蛣蛚蛪蛝蛫蛜蛬蛩蛗蛨蛑衈衖衕袺裗袹袸裀袾袶袼袷袽袲褁裉覕覘覗觝觚觛詎詍訹詙詀詗詘詄詅詒詈詑詊詌詏豟貁貀貺貾貰貹貵趄趀趉跘跓跍跇跖跜跏跕跙跈跗跅軯軷軺"],
["dc40","軹軦軮軥軵軧軨軶軫軱軬軴軩逭逴逯鄆鄬鄄郿郼鄈郹郻鄁鄀鄇鄅鄃酡酤酟酢酠鈁鈊鈥鈃鈚鈦鈏鈌鈀鈒釿釽鈆鈄鈧鈂鈜鈤鈙鈗鈅鈖镻閍閌閐隇陾隈"],
["dca1","隉隃隀雂雈雃雱雰靬靰靮頇颩飫鳦黹亃亄亶傽傿僆傮僄僊傴僈僂傰僁傺傱僋僉傶傸凗剺剸剻剼嗃嗛嗌嗐嗋嗊嗝嗀嗔嗄嗩喿嗒喍嗏嗕嗢嗖嗈嗲嗍嗙嗂圔塓塨塤塏塍塉塯塕塎塝塙塥塛堽塣塱壼嫇嫄嫋媺媸媱媵媰媿嫈媻嫆"],
["dd40","媷嫀嫊媴媶嫍媹媐寖寘寙尟尳嵱嵣嵊嵥嵲嵬嵞嵨嵧嵢巰幏幎幊幍幋廅廌廆廋廇彀徯徭惷慉慊愫慅愶愲愮慆愯慏愩慀戠酨戣戥戤揅揱揫搐搒搉搠搤"],
["dda1","搳摃搟搕搘搹搷搢搣搌搦搰搨摁搵搯搊搚摀搥搧搋揧搛搮搡搎敯斒旓暆暌暕暐暋暊暙暔晸朠楦楟椸楎楢楱椿楅楪椹楂楗楙楺楈楉椵楬椳椽楥棰楸椴楩楀楯楄楶楘楁楴楌椻楋椷楜楏楑椲楒椯楻椼歆歅歃歂歈歁殛嗀毻毼"],
["de40","毹毷毸溛滖滈溏滀溟溓溔溠溱溹滆滒溽滁溞滉溷溰滍溦滏溲溾滃滜滘溙溒溎溍溤溡溿溳滐滊溗溮溣煇煔煒煣煠煁煝煢煲煸煪煡煂煘煃煋煰煟煐煓"],
["dea1","煄煍煚牏犍犌犑犐犎猼獂猻猺獀獊獉瑄瑊瑋瑒瑑瑗瑀瑏瑐瑎瑂瑆瑍瑔瓡瓿瓾瓽甝畹畷榃痯瘏瘃痷痾痼痹痸瘐痻痶痭痵痽皙皵盝睕睟睠睒睖睚睩睧睔睙睭矠碇碚碔碏碄碕碅碆碡碃硹碙碀碖硻祼禂祽祹稑稘稙稒稗稕稢稓"],
["df40","稛稐窣窢窞竫筦筤筭筴筩筲筥筳筱筰筡筸筶筣粲粴粯綈綆綀綍絿綅絺綎絻綃絼綌綔綄絽綒罭罫罧罨罬羦羥羧翛翜耡腤腠腷腜腩腛腢腲朡腞腶腧腯"],
["dfa1","腄腡舝艉艄艀艂艅蓱萿葖葶葹蒏蒍葥葑葀蒆葧萰葍葽葚葙葴葳葝蔇葞萷萺萴葺葃葸萲葅萩菙葋萯葂萭葟葰萹葎葌葒葯蓅蒎萻葇萶萳葨葾葄萫葠葔葮葐蜋蜄蛷蜌蛺蛖蛵蝍蛸蜎蜉蜁蛶蜍蜅裖裋裍裎裞裛裚裌裐覅覛觟觥觤"],
["e040","觡觠觢觜触詶誆詿詡訿詷誂誄詵誃誁詴詺谼豋豊豥豤豦貆貄貅賌赨赩趑趌趎趏趍趓趔趐趒跰跠跬跱跮跐跩跣跢跧跲跫跴輆軿輁輀輅輇輈輂輋遒逿"],
["e0a1","遄遉逽鄐鄍鄏鄑鄖鄔鄋鄎酮酯鉈鉒鈰鈺鉦鈳鉥鉞銃鈮鉊鉆鉭鉬鉏鉠鉧鉯鈶鉡鉰鈱鉔鉣鉐鉲鉎鉓鉌鉖鈲閟閜閞閛隒隓隑隗雎雺雽雸雵靳靷靸靲頏頍頎颬飶飹馯馲馰馵骭骫魛鳪鳭鳧麀黽僦僔僗僨僳僛僪僝僤僓僬僰僯僣僠"],
["e140","凘劀劁勩勫匰厬嘧嘕嘌嘒嗼嘏嘜嘁嘓嘂嗺嘝嘄嗿嗹墉塼墐墘墆墁塿塴墋塺墇墑墎塶墂墈塻墔墏壾奫嫜嫮嫥嫕嫪嫚嫭嫫嫳嫢嫠嫛嫬嫞嫝嫙嫨嫟孷寠"],
["e1a1","寣屣嶂嶀嵽嶆嵺嶁嵷嶊嶉嶈嵾嵼嶍嵹嵿幘幙幓廘廑廗廎廜廕廙廒廔彄彃彯徶愬愨慁慞慱慳慒慓慲慬憀慴慔慺慛慥愻慪慡慖戩戧戫搫摍摛摝摴摶摲摳摽摵摦撦摎撂摞摜摋摓摠摐摿搿摬摫摙摥摷敳斠暡暠暟朅朄朢榱榶槉"],
["e240","榠槎榖榰榬榼榑榙榎榧榍榩榾榯榿槄榽榤槔榹槊榚槏榳榓榪榡榞槙榗榐槂榵榥槆歊歍歋殞殟殠毃毄毾滎滵滱漃漥滸漷滻漮漉潎漙漚漧漘漻漒滭漊"],
["e2a1","漶潳滹滮漭潀漰漼漵滫漇漎潃漅滽滶漹漜滼漺漟漍漞漈漡熇熐熉熀熅熂熏煻熆熁熗牄牓犗犕犓獃獍獑獌瑢瑳瑱瑵瑲瑧瑮甀甂甃畽疐瘖瘈瘌瘕瘑瘊瘔皸瞁睼瞅瞂睮瞀睯睾瞃碲碪碴碭碨硾碫碞碥碠碬碢碤禘禊禋禖禕禔禓"],
["e340","禗禈禒禐稫穊稰稯稨稦窨窫窬竮箈箜箊箑箐箖箍箌箛箎箅箘劄箙箤箂粻粿粼粺綧綷緂綣綪緁緀緅綝緎緄緆緋緌綯綹綖綼綟綦綮綩綡緉罳翢翣翥翞"],
["e3a1","耤聝聜膉膆膃膇膍膌膋舕蒗蒤蒡蒟蒺蓎蓂蒬蒮蒫蒹蒴蓁蓍蒪蒚蒱蓐蒝蒧蒻蒢蒔蓇蓌蒛蒩蒯蒨蓖蒘蒶蓏蒠蓗蓔蓒蓛蒰蒑虡蜳蜣蜨蝫蝀蜮蜞蜡蜙蜛蝃蜬蝁蜾蝆蜠蜲蜪蜭蜼蜒蜺蜱蜵蝂蜦蜧蜸蜤蜚蜰蜑裷裧裱裲裺裾裮裼裶裻"],
["e440","裰裬裫覝覡覟覞觩觫觨誫誙誋誒誏誖谽豨豩賕賏賗趖踉踂跿踍跽踊踃踇踆踅跾踀踄輐輑輎輍鄣鄜鄠鄢鄟鄝鄚鄤鄡鄛酺酲酹酳銥銤鉶銛鉺銠銔銪銍"],
["e4a1","銦銚銫鉹銗鉿銣鋮銎銂銕銢鉽銈銡銊銆銌銙銧鉾銇銩銝銋鈭隞隡雿靘靽靺靾鞃鞀鞂靻鞄鞁靿韎韍頖颭颮餂餀餇馝馜駃馹馻馺駂馽駇骱髣髧鬾鬿魠魡魟鳱鳲鳵麧僿儃儰僸儆儇僶僾儋儌僽儊劋劌勱勯噈噂噌嘵噁噊噉噆噘"],
["e540","噚噀嘳嘽嘬嘾嘸嘪嘺圚墫墝墱墠墣墯墬墥墡壿嫿嫴嫽嫷嫶嬃嫸嬂嫹嬁嬇嬅嬏屧嶙嶗嶟嶒嶢嶓嶕嶠嶜嶡嶚嶞幩幝幠幜緳廛廞廡彉徲憋憃慹憱憰憢憉"],
["e5a1","憛憓憯憭憟憒憪憡憍慦憳戭摮摰撖撠撅撗撜撏撋撊撌撣撟摨撱撘敶敺敹敻斲斳暵暰暩暲暷暪暯樀樆樗槥槸樕槱槤樠槿槬槢樛樝槾樧槲槮樔槷槧橀樈槦槻樍槼槫樉樄樘樥樏槶樦樇槴樖歑殥殣殢殦氁氀毿氂潁漦潾澇濆澒"],
["e640","澍澉澌潢潏澅潚澖潶潬澂潕潲潒潐潗澔澓潝漀潡潫潽潧澐潓澋潩潿澕潣潷潪潻熲熯熛熰熠熚熩熵熝熥熞熤熡熪熜熧熳犘犚獘獒獞獟獠獝獛獡獚獙"],
["e6a1","獢璇璉璊璆璁瑽璅璈瑼瑹甈甇畾瘥瘞瘙瘝瘜瘣瘚瘨瘛皜皝皞皛瞍瞏瞉瞈磍碻磏磌磑磎磔磈磃磄磉禚禡禠禜禢禛歶稹窲窴窳箷篋箾箬篎箯箹篊箵糅糈糌糋緷緛緪緧緗緡縃緺緦緶緱緰緮緟罶羬羰羭翭翫翪翬翦翨聤聧膣膟"],
["e740","膞膕膢膙膗舖艏艓艒艐艎艑蔤蔻蔏蔀蔩蔎蔉蔍蔟蔊蔧蔜蓻蔫蓺蔈蔌蓴蔪蓲蔕蓷蓫蓳蓼蔒蓪蓩蔖蓾蔨蔝蔮蔂蓽蔞蓶蔱蔦蓧蓨蓰蓯蓹蔘蔠蔰蔋蔙蔯虢"],
["e7a1","蝖蝣蝤蝷蟡蝳蝘蝔蝛蝒蝡蝚蝑蝞蝭蝪蝐蝎蝟蝝蝯蝬蝺蝮蝜蝥蝏蝻蝵蝢蝧蝩衚褅褌褔褋褗褘褙褆褖褑褎褉覢覤覣觭觰觬諏諆誸諓諑諔諕誻諗誾諀諅諘諃誺誽諙谾豍貏賥賟賙賨賚賝賧趠趜趡趛踠踣踥踤踮踕踛踖踑踙踦踧"],
["e840","踔踒踘踓踜踗踚輬輤輘輚輠輣輖輗遳遰遯遧遫鄯鄫鄩鄪鄲鄦鄮醅醆醊醁醂醄醀鋐鋃鋄鋀鋙銶鋏鋱鋟鋘鋩鋗鋝鋌鋯鋂鋨鋊鋈鋎鋦鋍鋕鋉鋠鋞鋧鋑鋓"],
["e8a1","銵鋡鋆銴镼閬閫閮閰隤隢雓霅霈霂靚鞊鞎鞈韐韏頞頝頦頩頨頠頛頧颲餈飺餑餔餖餗餕駜駍駏駓駔駎駉駖駘駋駗駌骳髬髫髳髲髱魆魃魧魴魱魦魶魵魰魨魤魬鳼鳺鳽鳿鳷鴇鴀鳹鳻鴈鴅鴄麃黓鼏鼐儜儓儗儚儑凞匴叡噰噠噮"],
["e940","噳噦噣噭噲噞噷圜圛壈墽壉墿墺壂墼壆嬗嬙嬛嬡嬔嬓嬐嬖嬨嬚嬠嬞寯嶬嶱嶩嶧嶵嶰嶮嶪嶨嶲嶭嶯嶴幧幨幦幯廩廧廦廨廥彋徼憝憨憖懅憴懆懁懌憺"],
["e9a1","憿憸憌擗擖擐擏擉撽撉擃擛擳擙攳敿敼斢曈暾曀曊曋曏暽暻暺曌朣樴橦橉橧樲橨樾橝橭橶橛橑樨橚樻樿橁橪橤橐橏橔橯橩橠樼橞橖橕橍橎橆歕歔歖殧殪殫毈毇氄氃氆澭濋澣濇澼濎濈潞濄澽澞濊澨瀄澥澮澺澬澪濏澿澸"],
["ea40","澢濉澫濍澯澲澰燅燂熿熸燖燀燁燋燔燊燇燏熽燘熼燆燚燛犝犞獩獦獧獬獥獫獪瑿璚璠璔璒璕璡甋疀瘯瘭瘱瘽瘳瘼瘵瘲瘰皻盦瞚瞝瞡瞜瞛瞢瞣瞕瞙"],
["eaa1","瞗磝磩磥磪磞磣磛磡磢磭磟磠禤穄穈穇窶窸窵窱窷篞篣篧篝篕篥篚篨篹篔篪篢篜篫篘篟糒糔糗糐糑縒縡縗縌縟縠縓縎縜縕縚縢縋縏縖縍縔縥縤罃罻罼罺羱翯耪耩聬膱膦膮膹膵膫膰膬膴膲膷膧臲艕艖艗蕖蕅蕫蕍蕓蕡蕘"],
["eb40","蕀蕆蕤蕁蕢蕄蕑蕇蕣蔾蕛蕱蕎蕮蕵蕕蕧蕠薌蕦蕝蕔蕥蕬虣虥虤螛螏螗螓螒螈螁螖螘蝹螇螣螅螐螑螝螄螔螜螚螉褞褦褰褭褮褧褱褢褩褣褯褬褟觱諠"],
["eba1","諢諲諴諵諝謔諤諟諰諈諞諡諨諿諯諻貑貒貐賵賮賱賰賳赬赮趥趧踳踾踸蹀蹅踶踼踽蹁踰踿躽輶輮輵輲輹輷輴遶遹遻邆郺鄳鄵鄶醓醐醑醍醏錧錞錈錟錆錏鍺錸錼錛錣錒錁鍆錭錎錍鋋錝鋺錥錓鋹鋷錴錂錤鋿錩錹錵錪錔錌"],
["ec40","錋鋾錉錀鋻錖閼闍閾閹閺閶閿閵閽隩雔霋霒霐鞙鞗鞔韰韸頵頯頲餤餟餧餩馞駮駬駥駤駰駣駪駩駧骹骿骴骻髶髺髹髷鬳鮀鮅鮇魼魾魻鮂鮓鮒鮐魺鮕"],
["eca1","魽鮈鴥鴗鴠鴞鴔鴩鴝鴘鴢鴐鴙鴟麈麆麇麮麭黕黖黺鼒鼽儦儥儢儤儠儩勴嚓嚌嚍嚆嚄嚃噾嚂噿嚁壖壔壏壒嬭嬥嬲嬣嬬嬧嬦嬯嬮孻寱寲嶷幬幪徾徻懃憵憼懧懠懥懤懨懞擯擩擣擫擤擨斁斀斶旚曒檍檖檁檥檉檟檛檡檞檇檓檎"],
["ed40","檕檃檨檤檑橿檦檚檅檌檒歛殭氉濌澩濴濔濣濜濭濧濦濞濲濝濢濨燡燱燨燲燤燰燢獳獮獯璗璲璫璐璪璭璱璥璯甐甑甒甏疄癃癈癉癇皤盩瞵瞫瞲瞷瞶"],
["eda1","瞴瞱瞨矰磳磽礂磻磼磲礅磹磾礄禫禨穜穛穖穘穔穚窾竀竁簅簏篲簀篿篻簎篴簋篳簂簉簃簁篸篽簆篰篱簐簊糨縭縼繂縳顈縸縪繉繀繇縩繌縰縻縶繄縺罅罿罾罽翴翲耬膻臄臌臊臅臇膼臩艛艚艜薃薀薏薧薕薠薋薣蕻薤薚薞"],
["ee40","蕷蕼薉薡蕺蕸蕗薎薖薆薍薙薝薁薢薂薈薅蕹蕶薘薐薟虨螾螪螭蟅螰螬螹螵螼螮蟉蟃蟂蟌螷螯蟄蟊螴螶螿螸螽蟞螲褵褳褼褾襁襒褷襂覭覯覮觲觳謞"],
["eea1","謘謖謑謅謋謢謏謒謕謇謍謈謆謜謓謚豏豰豲豱豯貕貔賹赯蹎蹍蹓蹐蹌蹇轃轀邅遾鄸醚醢醛醙醟醡醝醠鎡鎃鎯鍤鍖鍇鍼鍘鍜鍶鍉鍐鍑鍠鍭鎏鍌鍪鍹鍗鍕鍒鍏鍱鍷鍻鍡鍞鍣鍧鎀鍎鍙闇闀闉闃闅閷隮隰隬霠霟霘霝霙鞚鞡鞜"],
["ef40","鞞鞝韕韔韱顁顄顊顉顅顃餥餫餬餪餳餲餯餭餱餰馘馣馡騂駺駴駷駹駸駶駻駽駾駼騃骾髾髽鬁髼魈鮚鮨鮞鮛鮦鮡鮥鮤鮆鮢鮠鮯鴳鵁鵧鴶鴮鴯鴱鴸鴰"],
["efa1","鵅鵂鵃鴾鴷鵀鴽翵鴭麊麉麍麰黈黚黻黿鼤鼣鼢齔龠儱儭儮嚘嚜嚗嚚嚝嚙奰嬼屩屪巀幭幮懘懟懭懮懱懪懰懫懖懩擿攄擽擸攁攃擼斔旛曚曛曘櫅檹檽櫡櫆檺檶檷櫇檴檭歞毉氋瀇瀌瀍瀁瀅瀔瀎濿瀀濻瀦濼濷瀊爁燿燹爃燽獶"],
["f040","璸瓀璵瓁璾璶璻瓂甔甓癜癤癙癐癓癗癚皦皽盬矂瞺磿礌礓礔礉礐礒礑禭禬穟簜簩簙簠簟簭簝簦簨簢簥簰繜繐繖繣繘繢繟繑繠繗繓羵羳翷翸聵臑臒"],
["f0a1","臐艟艞薴藆藀藃藂薳薵薽藇藄薿藋藎藈藅薱薶藒蘤薸薷薾虩蟧蟦蟢蟛蟫蟪蟥蟟蟳蟤蟔蟜蟓蟭蟘蟣螤蟗蟙蠁蟴蟨蟝襓襋襏襌襆襐襑襉謪謧謣謳謰謵譇謯謼謾謱謥謷謦謶謮謤謻謽謺豂豵貙貘貗賾贄贂贀蹜蹢蹠蹗蹖蹞蹥蹧"],
["f140","蹛蹚蹡蹝蹩蹔轆轇轈轋鄨鄺鄻鄾醨醥醧醯醪鎵鎌鎒鎷鎛鎝鎉鎧鎎鎪鎞鎦鎕鎈鎙鎟鎍鎱鎑鎲鎤鎨鎴鎣鎥闒闓闑隳雗雚巂雟雘雝霣霢霥鞬鞮鞨鞫鞤鞪"],
["f1a1","鞢鞥韗韙韖韘韺顐顑顒颸饁餼餺騏騋騉騍騄騑騊騅騇騆髀髜鬈鬄鬅鬩鬵魊魌魋鯇鯆鯃鮿鯁鮵鮸鯓鮶鯄鮹鮽鵜鵓鵏鵊鵛鵋鵙鵖鵌鵗鵒鵔鵟鵘鵚麎麌黟鼁鼀鼖鼥鼫鼪鼩鼨齌齕儴儵劖勷厴嚫嚭嚦嚧嚪嚬壚壝壛夒嬽嬾嬿巃幰"],
["f240","徿懻攇攐攍攉攌攎斄旞旝曞櫧櫠櫌櫑櫙櫋櫟櫜櫐櫫櫏櫍櫞歠殰氌瀙瀧瀠瀖瀫瀡瀢瀣瀩瀗瀤瀜瀪爌爊爇爂爅犥犦犤犣犡瓋瓅璷瓃甖癠矉矊矄矱礝礛"],
["f2a1","礡礜礗礞禰穧穨簳簼簹簬簻糬糪繶繵繸繰繷繯繺繲繴繨罋罊羃羆羷翽翾聸臗臕艤艡艣藫藱藭藙藡藨藚藗藬藲藸藘藟藣藜藑藰藦藯藞藢蠀蟺蠃蟶蟷蠉蠌蠋蠆蟼蠈蟿蠊蠂襢襚襛襗襡襜襘襝襙覈覷覶觶譐譈譊譀譓譖譔譋譕"],
["f340","譑譂譒譗豃豷豶貚贆贇贉趬趪趭趫蹭蹸蹳蹪蹯蹻軂轒轑轏轐轓辴酀鄿醰醭鏞鏇鏏鏂鏚鏐鏹鏬鏌鏙鎩鏦鏊鏔鏮鏣鏕鏄鏎鏀鏒鏧镽闚闛雡霩霫霬霨霦"],
["f3a1","鞳鞷鞶韝韞韟顜顙顝顗颿颽颻颾饈饇饃馦馧騚騕騥騝騤騛騢騠騧騣騞騜騔髂鬋鬊鬎鬌鬷鯪鯫鯠鯞鯤鯦鯢鯰鯔鯗鯬鯜鯙鯥鯕鯡鯚鵷鶁鶊鶄鶈鵱鶀鵸鶆鶋鶌鵽鵫鵴鵵鵰鵩鶅鵳鵻鶂鵯鵹鵿鶇鵨麔麑黀黼鼭齀齁齍齖齗齘匷嚲"],
["f440","嚵嚳壣孅巆巇廮廯忀忁懹攗攖攕攓旟曨曣曤櫳櫰櫪櫨櫹櫱櫮櫯瀼瀵瀯瀷瀴瀱灂瀸瀿瀺瀹灀瀻瀳灁爓爔犨獽獼璺皫皪皾盭矌矎矏矍矲礥礣礧礨礤礩"],
["f4a1","禲穮穬穭竷籉籈籊籇籅糮繻繾纁纀羺翿聹臛臙舋艨艩蘢藿蘁藾蘛蘀藶蘄蘉蘅蘌藽蠙蠐蠑蠗蠓蠖襣襦覹觷譠譪譝譨譣譥譧譭趮躆躈躄轙轖轗轕轘轚邍酃酁醷醵醲醳鐋鐓鏻鐠鐏鐔鏾鐕鐐鐨鐙鐍鏵鐀鏷鐇鐎鐖鐒鏺鐉鏸鐊鏿"],
["f540","鏼鐌鏶鐑鐆闞闠闟霮霯鞹鞻韽韾顠顢顣顟飁飂饐饎饙饌饋饓騲騴騱騬騪騶騩騮騸騭髇髊髆鬐鬒鬑鰋鰈鯷鰅鰒鯸鱀鰇鰎鰆鰗鰔鰉鶟鶙鶤鶝鶒鶘鶐鶛"],
["f5a1","鶠鶔鶜鶪鶗鶡鶚鶢鶨鶞鶣鶿鶩鶖鶦鶧麙麛麚黥黤黧黦鼰鼮齛齠齞齝齙龑儺儹劘劗囃嚽嚾孈孇巋巏廱懽攛欂櫼欃櫸欀灃灄灊灈灉灅灆爝爚爙獾甗癪矐礭礱礯籔籓糲纊纇纈纋纆纍罍羻耰臝蘘蘪蘦蘟蘣蘜蘙蘧蘮蘡蘠蘩蘞蘥"],
["f640","蠩蠝蠛蠠蠤蠜蠫衊襭襩襮襫觺譹譸譅譺譻贐贔趯躎躌轞轛轝酆酄酅醹鐿鐻鐶鐩鐽鐼鐰鐹鐪鐷鐬鑀鐱闥闤闣霵霺鞿韡顤飉飆飀饘饖騹騽驆驄驂驁騺"],
["f6a1","騿髍鬕鬗鬘鬖鬺魒鰫鰝鰜鰬鰣鰨鰩鰤鰡鶷鶶鶼鷁鷇鷊鷏鶾鷅鷃鶻鶵鷎鶹鶺鶬鷈鶱鶭鷌鶳鷍鶲鹺麜黫黮黭鼛鼘鼚鼱齎齥齤龒亹囆囅囋奱孋孌巕巑廲攡攠攦攢欋欈欉氍灕灖灗灒爞爟犩獿瓘瓕瓙瓗癭皭礵禴穰穱籗籜籙籛籚"],
["f740","糴糱纑罏羇臞艫蘴蘵蘳蘬蘲蘶蠬蠨蠦蠪蠥襱覿覾觻譾讄讂讆讅譿贕躕躔躚躒躐躖躗轠轢酇鑌鑐鑊鑋鑏鑇鑅鑈鑉鑆霿韣顪顩飋饔饛驎驓驔驌驏驈驊"],
["f7a1","驉驒驐髐鬙鬫鬻魖魕鱆鱈鰿鱄鰹鰳鱁鰼鰷鰴鰲鰽鰶鷛鷒鷞鷚鷋鷐鷜鷑鷟鷩鷙鷘鷖鷵鷕鷝麶黰鼵鼳鼲齂齫龕龢儽劙壨壧奲孍巘蠯彏戁戃戄攩攥斖曫欑欒欏毊灛灚爢玂玁玃癰矔籧籦纕艬蘺虀蘹蘼蘱蘻蘾蠰蠲蠮蠳襶襴襳觾"],
["f840","讌讎讋讈豅贙躘轤轣醼鑢鑕鑝鑗鑞韄韅頀驖驙鬞鬟鬠鱒鱘鱐鱊鱍鱋鱕鱙鱌鱎鷻鷷鷯鷣鷫鷸鷤鷶鷡鷮鷦鷲鷰鷢鷬鷴鷳鷨鷭黂黐黲黳鼆鼜鼸鼷鼶齃齏"],
["f8a1","齱齰齮齯囓囍孎屭攭曭曮欓灟灡灝灠爣瓛瓥矕礸禷禶籪纗羉艭虃蠸蠷蠵衋讔讕躞躟躠躝醾醽釂鑫鑨鑩雥靆靃靇韇韥驞髕魙鱣鱧鱦鱢鱞鱠鸂鷾鸇鸃鸆鸅鸀鸁鸉鷿鷽鸄麠鼞齆齴齵齶囔攮斸欘欙欗欚灢爦犪矘矙礹籩籫糶纚"],
["f940","纘纛纙臠臡虆虇虈襹襺襼襻觿讘讙躥躤躣鑮鑭鑯鑱鑳靉顲饟鱨鱮鱭鸋鸍鸐鸏鸒鸑麡黵鼉齇齸齻齺齹圞灦籯蠼趲躦釃鑴鑸鑶鑵驠鱴鱳鱱鱵鸔鸓黶鼊"],
["f9a1","龤灨灥糷虪蠾蠽蠿讞貜躩軉靋顳顴飌饡馫驤驦驧鬤鸕鸗齈戇欞爧虌躨钂钀钁驩驨鬮鸙爩虋讟钃鱹麷癵驫鱺鸝灩灪麤齾齉龘碁銹裏墻恒粧嫺╔╦╗╠╬╣╚╩╝╒╤╕╞╪╡╘╧╛╓╥╖╟╫╢╙╨╜║═╭╮╰╯▓"]
]
[
["0","\u0000",127],
["8ea1","｡",62],
["a1a1","　、。，．・：；？！゛゜´｀¨＾￣＿ヽヾゝゞ〃仝々〆〇ー―‐／＼～∥｜…‥‘’“”（）〔〕［］｛｝〈",9,"＋－±×÷＝≠＜＞≦≧∞∴♂♀°′″℃￥＄￠￡％＃＆＊＠§☆★○●◎◇"],
["a2a1","◆□■△▲▽▼※〒→←↑↓〓"],
["a2ba","∈∋⊆⊇⊂⊃∪∩"],
["a2ca","∧∨￢⇒⇔∀∃"],
["a2dc","∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬"],
["a2f2","Å‰♯♭♪†‡¶"],
["a2fe","◯"],
["a3b0","０",9],
["a3c1","Ａ",25],
["a3e1","ａ",25],
["a4a1","ぁ",82],
["a5a1","ァ",85],
["a6a1","Α",16,"Σ",6],
["a6c1","α",16,"σ",6],
["a7a1","А",5,"ЁЖ",25],
["a7d1","а",5,"ёж",25],
["a8a1","─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂"],
["ada1","①",19,"Ⅰ",9],
["adc0","㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡"],
["addf","㍻〝〟№㏍℡㊤",4,"㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪"],
["b0a1","亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭"],
["b1a1","院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応"],
["b2a1","押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改"],
["b3a1","魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱"],
["b4a1","粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄"],
["b5a1","機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京"],
["b6a1","供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈"],
["b7a1","掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲"],
["b8a1","検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向"],
["b9a1","后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込"],
["baa1","此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷"],
["bba1","察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時"],
["bca1","次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周"],
["bda1","宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償"],
["bea1","勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾"],
["bfa1","拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾"],
["c0a1","澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線"],
["c1a1","繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎"],
["c2a1","臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只"],
["c3a1","叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵"],
["c4a1","帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓"],
["c5a1","邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到"],
["c6a1","董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入"],
["c7a1","如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦"],
["c8a1","函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美"],
["c9a1","鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服"],
["caa1","福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋"],
["cba1","法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満"],
["cca1","漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒"],
["cda1","諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃"],
["cea1","痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯"],
["cfa1","蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕"],
["d0a1","弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲"],
["d1a1","僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨"],
["d2a1","辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨"],
["d3a1","咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉"],
["d4a1","圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩"],
["d5a1","奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓"],
["d6a1","屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏"],
["d7a1","廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚"],
["d8a1","悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛"],
["d9a1","戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼"],
["daa1","據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼"],
["dba1","曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍"],
["dca1","棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣"],
["dda1","檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾"],
["dea1","沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌"],
["dfa1","漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼"],
["e0a1","燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱"],
["e1a1","瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰"],
["e2a1","癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬"],
["e3a1","磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐"],
["e4a1","筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆"],
["e5a1","紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺"],
["e6a1","罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋"],
["e7a1","隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙"],
["e8a1","茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈"],
["e9a1","蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙"],
["eaa1","蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞"],
["eba1","襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫"],
["eca1","譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊"],
["eda1","蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸"],
["eea1","遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮"],
["efa1","錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞"],
["f0a1","陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰"],
["f1a1","顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷"],
["f2a1","髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈"],
["f3a1","鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠"],
["f4a1","堯槇遙瑤凜熙"],
["f9a1","纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德"],
["faa1","忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱"],
["fba1","犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚"],
["fca1","釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑"],
["fcf1","ⅰ",9,"￢￤＇＂"],
["8fa2af","˘ˇ¸˙˝¯˛˚～΄΅"],
["8fa2c2","¡¦¿"],
["8fa2eb","ºª©®™¤№"],
["8fa6e1","ΆΈΉΊΪ"],
["8fa6e7","Ό"],
["8fa6e9","ΎΫ"],
["8fa6ec","Ώ"],
["8fa6f1","άέήίϊΐόςύϋΰώ"],
["8fa7c2","Ђ",10,"ЎЏ"],
["8fa7f2","ђ",10,"ўџ"],
["8fa9a1","ÆĐ"],
["8fa9a4","Ħ"],
["8fa9a6","Ĳ"],
["8fa9a8","ŁĿ"],
["8fa9ab","ŊØŒ"],
["8fa9af","ŦÞ"],
["8fa9c1","æđðħıĳĸłŀŉŋøœßŧþ"],
["8faaa1","ÁÀÄÂĂǍĀĄÅÃĆĈČÇĊĎÉÈËÊĚĖĒĘ"],
["8faaba","ĜĞĢĠĤÍÌÏÎǏİĪĮĨĴĶĹĽĻŃŇŅÑÓÒÖÔǑŐŌÕŔŘŖŚŜŠŞŤŢÚÙÜÛŬǓŰŪŲŮŨǗǛǙǕŴÝŸŶŹŽŻ"],
["8faba1","áàäâăǎāąåãćĉčçċďéèëêěėēęǵĝğ"],
["8fabbd","ġĥíìïîǐ"],
["8fabc5","īįĩĵķĺľļńňņñóòöôǒőōõŕřŗśŝšşťţúùüûŭǔűūųůũǘǜǚǖŵýÿŷźžż"],
["8fb0a1","丂丄丅丌丒丟丣两丨丫丮丯丰丵乀乁乄乇乑乚乜乣乨乩乴乵乹乿亍亖亗亝亯亹仃仐仚仛仠仡仢仨仯仱仳仵份仾仿伀伂伃伈伋伌伒伕伖众伙伮伱你伳伵伷伹伻伾佀佂佈佉佋佌佒佔佖佘佟佣佪佬佮佱佷佸佹佺佽佾侁侂侄"],
["8fb1a1","侅侉侊侌侎侐侒侓侔侗侙侚侞侟侲侷侹侻侼侽侾俀俁俅俆俈俉俋俌俍俏俒俜俠俢俰俲俼俽俿倀倁倄倇倊倌倎倐倓倗倘倛倜倝倞倢倧倮倰倲倳倵偀偁偂偅偆偊偌偎偑偒偓偗偙偟偠偢偣偦偧偪偭偰偱倻傁傃傄傆傊傎傏傐"],
["8fb2a1","傒傓傔傖傛傜傞",4,"傪傯傰傹傺傽僀僃僄僇僌僎僐僓僔僘僜僝僟僢僤僦僨僩僯僱僶僺僾儃儆儇儈儋儌儍儎僲儐儗儙儛儜儝儞儣儧儨儬儭儯儱儳儴儵儸儹兂兊兏兓兕兗兘兟兤兦兾冃冄冋冎冘冝冡冣冭冸冺冼冾冿凂"],
["8fb3a1","凈减凑凒凓凕凘凞凢凥凮凲凳凴凷刁刂刅划刓刕刖刘刢刨刱刲刵刼剅剉剕剗剘剚剜剟剠剡剦剮剷剸剹劀劂劅劊劌劓劕劖劗劘劚劜劤劥劦劧劯劰劶劷劸劺劻劽勀勄勆勈勌勏勑勔勖勛勜勡勥勨勩勪勬勰勱勴勶勷匀匃匊匋"],
["8fb4a1","匌匑匓匘匛匜匞匟匥匧匨匩匫匬匭匰匲匵匼匽匾卂卌卋卙卛卡卣卥卬卭卲卹卾厃厇厈厎厓厔厙厝厡厤厪厫厯厲厴厵厷厸厺厽叀叅叏叒叓叕叚叝叞叠另叧叵吂吓吚吡吧吨吪启吱吴吵呃呄呇呍呏呞呢呤呦呧呩呫呭呮呴呿"],
["8fb5a1","咁咃咅咈咉咍咑咕咖咜咟咡咦咧咩咪咭咮咱咷咹咺咻咿哆哊响哎哠哪哬哯哶哼哾哿唀唁唅唈唉唌唍唎唕唪唫唲唵唶唻唼唽啁啇啉啊啍啐啑啘啚啛啞啠啡啤啦啿喁喂喆喈喎喏喑喒喓喔喗喣喤喭喲喿嗁嗃嗆嗉嗋嗌嗎嗑嗒"],
["8fb6a1","嗓嗗嗘嗛嗞嗢嗩嗶嗿嘅嘈嘊嘍",5,"嘙嘬嘰嘳嘵嘷嘹嘻嘼嘽嘿噀噁噃噄噆噉噋噍噏噔噞噠噡噢噣噦噩噭噯噱噲噵嚄嚅嚈嚋嚌嚕嚙嚚嚝嚞嚟嚦嚧嚨嚩嚫嚬嚭嚱嚳嚷嚾囅囉囊囋囏囐囌囍囙囜囝囟囡囤",4,"囱囫园"],
["8fb7a1","囶囷圁圂圇圊圌圑圕圚圛圝圠圢圣圤圥圩圪圬圮圯圳圴圽圾圿坅坆坌坍坒坢坥坧坨坫坭",4,"坳坴坵坷坹坺坻坼坾垁垃垌垔垗垙垚垜垝垞垟垡垕垧垨垩垬垸垽埇埈埌埏埕埝埞埤埦埧埩埭埰埵埶埸埽埾埿堃堄堈堉埡"],
["8fb8a1","堌堍堛堞堟堠堦堧堭堲堹堿塉塌塍塏塐塕塟塡塤塧塨塸塼塿墀墁墇墈墉墊墌墍墏墐墔墖墝墠墡墢墦墩墱墲壄墼壂壈壍壎壐壒壔壖壚壝壡壢壩壳夅夆夋夌夒夓夔虁夝夡夣夤夨夯夰夳夵夶夿奃奆奒奓奙奛奝奞奟奡奣奫奭"],
["8fb9a1","奯奲奵奶她奻奼妋妌妎妒妕妗妟妤妧妭妮妯妰妳妷妺妼姁姃姄姈姊姍姒姝姞姟姣姤姧姮姯姱姲姴姷娀娄娌娍娎娒娓娞娣娤娧娨娪娭娰婄婅婇婈婌婐婕婞婣婥婧婭婷婺婻婾媋媐媓媖媙媜媞媟媠媢媧媬媱媲媳媵媸媺媻媿"],
["8fbaa1","嫄嫆嫈嫏嫚嫜嫠嫥嫪嫮嫵嫶嫽嬀嬁嬈嬗嬴嬙嬛嬝嬡嬥嬭嬸孁孋孌孒孖孞孨孮孯孼孽孾孿宁宄宆宊宎宐宑宓宔宖宨宩宬宭宯宱宲宷宺宼寀寁寍寏寖",4,"寠寯寱寴寽尌尗尞尟尣尦尩尫尬尮尰尲尵尶屙屚屜屢屣屧屨屩"],
["8fbba1","屭屰屴屵屺屻屼屽岇岈岊岏岒岝岟岠岢岣岦岪岲岴岵岺峉峋峒峝峗峮峱峲峴崁崆崍崒崫崣崤崦崧崱崴崹崽崿嵂嵃嵆嵈嵕嵑嵙嵊嵟嵠嵡嵢嵤嵪嵭嵰嵹嵺嵾嵿嶁嶃嶈嶊嶒嶓嶔嶕嶙嶛嶟嶠嶧嶫嶰嶴嶸嶹巃巇巋巐巎巘巙巠巤"],
["8fbca1","巩巸巹帀帇帍帒帔帕帘帟帠帮帨帲帵帾幋幐幉幑幖幘幛幜幞幨幪",4,"幰庀庋庎庢庤庥庨庪庬庱庳庽庾庿廆廌廋廎廑廒廔廕廜廞廥廫异弆弇弈弎弙弜弝弡弢弣弤弨弫弬弮弰弴弶弻弽弿彀彄彅彇彍彐彔彘彛彠彣彤彧"],
["8fbda1","彯彲彴彵彸彺彽彾徉徍徏徖徜徝徢徧徫徤徬徯徰徱徸忄忇忈忉忋忐",4,"忞忡忢忨忩忪忬忭忮忯忲忳忶忺忼怇怊怍怓怔怗怘怚怟怤怭怳怵恀恇恈恉恌恑恔恖恗恝恡恧恱恾恿悂悆悈悊悎悑悓悕悘悝悞悢悤悥您悰悱悷"],
["8fbea1","悻悾惂惄惈惉惊惋惎惏惔惕惙惛惝惞惢惥惲惵惸惼惽愂愇愊愌愐",4,"愖愗愙愜愞愢愪愫愰愱愵愶愷愹慁慅慆慉慞慠慬慲慸慻慼慿憀憁憃憄憋憍憒憓憗憘憜憝憟憠憥憨憪憭憸憹憼懀懁懂懎懏懕懜懝懞懟懡懢懧懩懥"],
["8fbfa1","懬懭懯戁戃戄戇戓戕戜戠戢戣戧戩戫戹戽扂扃扄扆扌扐扑扒扔扖扚扜扤扭扯扳扺扽抍抎抏抐抦抨抳抶抷抺抾抿拄拎拕拖拚拪拲拴拼拽挃挄挊挋挍挐挓挖挘挩挪挭挵挶挹挼捁捂捃捄捆捊捋捎捒捓捔捘捛捥捦捬捭捱捴捵"],
["8fc0a1","捸捼捽捿掂掄掇掊掐掔掕掙掚掞掤掦掭掮掯掽揁揅揈揎揑揓揔揕揜揠揥揪揬揲揳揵揸揹搉搊搐搒搔搘搞搠搢搤搥搩搪搯搰搵搽搿摋摏摑摒摓摔摚摛摜摝摟摠摡摣摭摳摴摻摽撅撇撏撐撑撘撙撛撝撟撡撣撦撨撬撳撽撾撿"],
["8fc1a1","擄擉擊擋擌擎擐擑擕擗擤擥擩擪擭擰擵擷擻擿攁攄攈攉攊攏攓攔攖攙攛攞攟攢攦攩攮攱攺攼攽敃敇敉敐敒敔敟敠敧敫敺敽斁斅斊斒斕斘斝斠斣斦斮斲斳斴斿旂旈旉旎旐旔旖旘旟旰旲旴旵旹旾旿昀昄昈昉昍昑昒昕昖昝"],
["8fc2a1","昞昡昢昣昤昦昩昪昫昬昮昰昱昳昹昷晀晅晆晊晌晑晎晗晘晙晛晜晠晡曻晪晫晬晾晳晵晿晷晸晹晻暀晼暋暌暍暐暒暙暚暛暜暟暠暤暭暱暲暵暻暿曀曂曃曈曌曎曏曔曛曟曨曫曬曮曺朅朇朎朓朙朜朠朢朳朾杅杇杈杌杔杕杝"],
["8fc3a1","杦杬杮杴杶杻极构枎枏枑枓枖枘枙枛枰枱枲枵枻枼枽柹柀柂柃柅柈柉柒柗柙柜柡柦柰柲柶柷桒栔栙栝栟栨栧栬栭栯栰栱栳栻栿桄桅桊桌桕桗桘桛桫桮",4,"桵桹桺桻桼梂梄梆梈梖梘梚梜梡梣梥梩梪梮梲梻棅棈棌棏"],
["8fc4a1","棐棑棓棖棙棜棝棥棨棪棫棬棭棰棱棵棶棻棼棽椆椉椊椐椑椓椖椗椱椳椵椸椻楂楅楉楎楗楛楣楤楥楦楨楩楬楰楱楲楺楻楿榀榍榒榖榘榡榥榦榨榫榭榯榷榸榺榼槅槈槑槖槗槢槥槮槯槱槳槵槾樀樁樃樏樑樕樚樝樠樤樨樰樲"],
["8fc5a1","樴樷樻樾樿橅橆橉橊橎橐橑橒橕橖橛橤橧橪橱橳橾檁檃檆檇檉檋檑檛檝檞檟檥檫檯檰檱檴檽檾檿櫆櫉櫈櫌櫐櫔櫕櫖櫜櫝櫤櫧櫬櫰櫱櫲櫼櫽欂欃欆欇欉欏欐欑欗欛欞欤欨欫欬欯欵欶欻欿歆歊歍歒歖歘歝歠歧歫歮歰歵歽"],
["8fc6a1","歾殂殅殗殛殟殠殢殣殨殩殬殭殮殰殸殹殽殾毃毄毉毌毖毚毡毣毦毧毮毱毷毹毿氂氄氅氉氍氎氐氒氙氟氦氧氨氬氮氳氵氶氺氻氿汊汋汍汏汒汔汙汛汜汫汭汯汴汶汸汹汻沅沆沇沉沔沕沗沘沜沟沰沲沴泂泆泍泏泐泑泒泔泖"],
["8fc7a1","泚泜泠泧泩泫泬泮泲泴洄洇洊洎洏洑洓洚洦洧洨汧洮洯洱洹洼洿浗浞浟浡浥浧浯浰浼涂涇涑涒涔涖涗涘涪涬涴涷涹涽涿淄淈淊淎淏淖淛淝淟淠淢淥淩淯淰淴淶淼渀渄渞渢渧渲渶渹渻渼湄湅湈湉湋湏湑湒湓湔湗湜湝湞"],
["8fc8a1","湢湣湨湳湻湽溍溓溙溠溧溭溮溱溳溻溿滀滁滃滇滈滊滍滎滏滫滭滮滹滻滽漄漈漊漌漍漖漘漚漛漦漩漪漯漰漳漶漻漼漭潏潑潒潓潗潙潚潝潞潡潢潨潬潽潾澃澇澈澋澌澍澐澒澓澔澖澚澟澠澥澦澧澨澮澯澰澵澶澼濅濇濈濊"],
["8fc9a1","濚濞濨濩濰濵濹濼濽瀀瀅瀆瀇瀍瀗瀠瀣瀯瀴瀷瀹瀼灃灄灈灉灊灋灔灕灝灞灎灤灥灬灮灵灶灾炁炅炆炔",4,"炛炤炫炰炱炴炷烊烑烓烔烕烖烘烜烤烺焃",4,"焋焌焏焞焠焫焭焯焰焱焸煁煅煆煇煊煋煐煒煗煚煜煞煠"],
["8fcaa1","煨煹熀熅熇熌熒熚熛熠熢熯熰熲熳熺熿燀燁燄燋燌燓燖燙燚燜燸燾爀爇爈爉爓爗爚爝爟爤爫爯爴爸爹牁牂牃牅牎牏牐牓牕牖牚牜牞牠牣牨牫牮牯牱牷牸牻牼牿犄犉犍犎犓犛犨犭犮犱犴犾狁狇狉狌狕狖狘狟狥狳狴狺狻"],
["8fcba1","狾猂猄猅猇猋猍猒猓猘猙猞猢猤猧猨猬猱猲猵猺猻猽獃獍獐獒獖獘獝獞獟獠獦獧獩獫獬獮獯獱獷獹獼玀玁玃玅玆玎玐玓玕玗玘玜玞玟玠玢玥玦玪玫玭玵玷玹玼玽玿珅珆珉珋珌珏珒珓珖珙珝珡珣珦珧珩珴珵珷珹珺珻珽"],
["8fcca1","珿琀琁琄琇琊琑琚琛琤琦琨",9,"琹瑀瑃瑄瑆瑇瑋瑍瑑瑒瑗瑝瑢瑦瑧瑨瑫瑭瑮瑱瑲璀璁璅璆璇璉璏璐璑璒璘璙璚璜璟璠璡璣璦璨璩璪璫璮璯璱璲璵璹璻璿瓈瓉瓌瓐瓓瓘瓚瓛瓞瓟瓤瓨瓪瓫瓯瓴瓺瓻瓼瓿甆"],
["8fcda1","甒甖甗甠甡甤甧甩甪甯甶甹甽甾甿畀畃畇畈畎畐畒畗畞畟畡畯畱畹",5,"疁疅疐疒疓疕疙疜疢疤疴疺疿痀痁痄痆痌痎痏痗痜痟痠痡痤痧痬痮痯痱痹瘀瘂瘃瘄瘇瘈瘊瘌瘏瘒瘓瘕瘖瘙瘛瘜瘝瘞瘣瘥瘦瘩瘭瘲瘳瘵瘸瘹"],
["8fcea1","瘺瘼癊癀癁癃癄癅癉癋癕癙癟癤癥癭癮癯癱癴皁皅皌皍皕皛皜皝皟皠皢",6,"皪皭皽盁盅盉盋盌盎盔盙盠盦盨盬盰盱盶盹盼眀眆眊眎眒眔眕眗眙眚眜眢眨眭眮眯眴眵眶眹眽眾睂睅睆睊睍睎睏睒睖睗睜睞睟睠睢"],
["8fcfa1","睤睧睪睬睰睲睳睴睺睽瞀瞄瞌瞍瞔瞕瞖瞚瞟瞢瞧瞪瞮瞯瞱瞵瞾矃矉矑矒矕矙矞矟矠矤矦矪矬矰矱矴矸矻砅砆砉砍砎砑砝砡砢砣砭砮砰砵砷硃硄硇硈硌硎硒硜硞硠硡硣硤硨硪确硺硾碊碏碔碘碡碝碞碟碤碨碬碭碰碱碲碳"],
["8fd0a1","碻碽碿磇磈磉磌磎磒磓磕磖磤磛磟磠磡磦磪磲磳礀磶磷磺磻磿礆礌礐礚礜礞礟礠礥礧礩礭礱礴礵礻礽礿祄祅祆祊祋祏祑祔祘祛祜祧祩祫祲祹祻祼祾禋禌禑禓禔禕禖禘禛禜禡禨禩禫禯禱禴禸离秂秄秇秈秊秏秔秖秚秝秞"],
["8fd1a1","秠秢秥秪秫秭秱秸秼稂稃稇稉稊稌稑稕稛稞稡稧稫稭稯稰稴稵稸稹稺穄穅穇穈穌穕穖穙穜穝穟穠穥穧穪穭穵穸穾窀窂窅窆窊窋窐窑窔窞窠窣窬窳窵窹窻窼竆竉竌竎竑竛竨竩竫竬竱竴竻竽竾笇笔笟笣笧笩笪笫笭笮笯笰"],
["8fd2a1","笱笴笽笿筀筁筇筎筕筠筤筦筩筪筭筯筲筳筷箄箉箎箐箑箖箛箞箠箥箬箯箰箲箵箶箺箻箼箽篂篅篈篊篔篖篗篙篚篛篨篪篲篴篵篸篹篺篼篾簁簂簃簄簆簉簋簌簎簏簙簛簠簥簦簨簬簱簳簴簶簹簺籆籊籕籑籒籓籙",5],
["8fd3a1","籡籣籧籩籭籮籰籲籹籼籽粆粇粏粔粞粠粦粰粶粷粺粻粼粿糄糇糈糉糍糏糓糔糕糗糙糚糝糦糩糫糵紃紇紈紉紏紑紒紓紖紝紞紣紦紪紭紱紼紽紾絀絁絇絈絍絑絓絗絙絚絜絝絥絧絪絰絸絺絻絿綁綂綃綅綆綈綋綌綍綑綖綗綝"],
["8fd4a1","綞綦綧綪綳綶綷綹緂",4,"緌緍緎緗緙縀緢緥緦緪緫緭緱緵緶緹緺縈縐縑縕縗縜縝縠縧縨縬縭縯縳縶縿繄繅繇繎繐繒繘繟繡繢繥繫繮繯繳繸繾纁纆纇纊纍纑纕纘纚纝纞缼缻缽缾缿罃罄罇罏罒罓罛罜罝罡罣罤罥罦罭"],
["8fd5a1","罱罽罾罿羀羋羍羏羐羑羖羗羜羡羢羦羪羭羴羼羿翀翃翈翎翏翛翟翣翥翨翬翮翯翲翺翽翾翿耇耈耊耍耎耏耑耓耔耖耝耞耟耠耤耦耬耮耰耴耵耷耹耺耼耾聀聄聠聤聦聭聱聵肁肈肎肜肞肦肧肫肸肹胈胍胏胒胔胕胗胘胠胭胮"],
["8fd6a1","胰胲胳胶胹胺胾脃脋脖脗脘脜脞脠脤脧脬脰脵脺脼腅腇腊腌腒腗腠腡腧腨腩腭腯腷膁膐膄膅膆膋膎膖膘膛膞膢膮膲膴膻臋臃臅臊臎臏臕臗臛臝臞臡臤臫臬臰臱臲臵臶臸臹臽臿舀舃舏舓舔舙舚舝舡舢舨舲舴舺艃艄艅艆"],
["8fd7a1","艋艎艏艑艖艜艠艣艧艭艴艻艽艿芀芁芃芄芇芉芊芎芑芔芖芘芚芛芠芡芣芤芧芨芩芪芮芰芲芴芷芺芼芾芿苆苐苕苚苠苢苤苨苪苭苯苶苷苽苾茀茁茇茈茊茋荔茛茝茞茟茡茢茬茭茮茰茳茷茺茼茽荂荃荄荇荍荎荑荕荖荗荰荸"],
["8fd8a1","荽荿莀莂莄莆莍莒莔莕莘莙莛莜莝莦莧莩莬莾莿菀菇菉菏菐菑菔菝荓菨菪菶菸菹菼萁萆萊萏萑萕萙莭萯萹葅葇葈葊葍葏葑葒葖葘葙葚葜葠葤葥葧葪葰葳葴葶葸葼葽蒁蒅蒒蒓蒕蒞蒦蒨蒩蒪蒯蒱蒴蒺蒽蒾蓀蓂蓇蓈蓌蓏蓓"],
["8fd9a1","蓜蓧蓪蓯蓰蓱蓲蓷蔲蓺蓻蓽蔂蔃蔇蔌蔎蔐蔜蔞蔢蔣蔤蔥蔧蔪蔫蔯蔳蔴蔶蔿蕆蕏",4,"蕖蕙蕜",6,"蕤蕫蕯蕹蕺蕻蕽蕿薁薅薆薉薋薌薏薓薘薝薟薠薢薥薧薴薶薷薸薼薽薾薿藂藇藊藋藎薭藘藚藟藠藦藨藭藳藶藼"],
["8fdaa1","藿蘀蘄蘅蘍蘎蘐蘑蘒蘘蘙蘛蘞蘡蘧蘩蘶蘸蘺蘼蘽虀虂虆虒虓虖虗虘虙虝虠",4,"虩虬虯虵虶虷虺蚍蚑蚖蚘蚚蚜蚡蚦蚧蚨蚭蚱蚳蚴蚵蚷蚸蚹蚿蛀蛁蛃蛅蛑蛒蛕蛗蛚蛜蛠蛣蛥蛧蚈蛺蛼蛽蜄蜅蜇蜋蜎蜏蜐蜓蜔蜙蜞蜟蜡蜣"],
["8fdba1","蜨蜮蜯蜱蜲蜹蜺蜼蜽蜾蝀蝃蝅蝍蝘蝝蝡蝤蝥蝯蝱蝲蝻螃",6,"螋螌螐螓螕螗螘螙螞螠螣螧螬螭螮螱螵螾螿蟁蟈蟉蟊蟎蟕蟖蟙蟚蟜蟟蟢蟣蟤蟪蟫蟭蟱蟳蟸蟺蟿蠁蠃蠆蠉蠊蠋蠐蠙蠒蠓蠔蠘蠚蠛蠜蠞蠟蠨蠭蠮蠰蠲蠵"],
["8fdca1","蠺蠼衁衃衅衈衉衊衋衎衑衕衖衘衚衜衟衠衤衩衱衹衻袀袘袚袛袜袟袠袨袪袺袽袾裀裊",4,"裑裒裓裛裞裧裯裰裱裵裷褁褆褍褎褏褕褖褘褙褚褜褠褦褧褨褰褱褲褵褹褺褾襀襂襅襆襉襏襒襗襚襛襜襡襢襣襫襮襰襳襵襺"],
["8fdda1","襻襼襽覉覍覐覔覕覛覜覟覠覥覰覴覵覶覷覼觔",4,"觥觩觫觭觱觳觶觹觽觿訄訅訇訏訑訒訔訕訞訠訢訤訦訫訬訯訵訷訽訾詀詃詅詇詉詍詎詓詖詗詘詜詝詡詥詧詵詶詷詹詺詻詾詿誀誃誆誋誏誐誒誖誗誙誟誧誩誮誯誳"],
["8fdea1","誶誷誻誾諃諆諈諉諊諑諓諔諕諗諝諟諬諰諴諵諶諼諿謅謆謋謑謜謞謟謊謭謰謷謼譂",4,"譈譒譓譔譙譍譞譣譭譶譸譹譼譾讁讄讅讋讍讏讔讕讜讞讟谸谹谽谾豅豇豉豋豏豑豓豔豗豘豛豝豙豣豤豦豨豩豭豳豵豶豻豾貆"],
["8fdfa1","貇貋貐貒貓貙貛貜貤貹貺賅賆賉賋賏賖賕賙賝賡賨賬賯賰賲賵賷賸賾賿贁贃贉贒贗贛赥赩赬赮赿趂趄趈趍趐趑趕趞趟趠趦趫趬趯趲趵趷趹趻跀跅跆跇跈跊跎跑跔跕跗跙跤跥跧跬跰趼跱跲跴跽踁踄踅踆踋踑踔踖踠踡踢"],
["8fe0a1","踣踦踧踱踳踶踷踸踹踽蹀蹁蹋蹍蹎蹏蹔蹛蹜蹝蹞蹡蹢蹩蹬蹭蹯蹰蹱蹹蹺蹻躂躃躉躐躒躕躚躛躝躞躢躧躩躭躮躳躵躺躻軀軁軃軄軇軏軑軔軜軨軮軰軱軷軹軺軭輀輂輇輈輏輐輖輗輘輞輠輡輣輥輧輨輬輭輮輴輵輶輷輺轀轁"],
["8fe1a1","轃轇轏轑",4,"轘轝轞轥辝辠辡辤辥辦辵辶辸达迀迁迆迊迋迍运迒迓迕迠迣迤迨迮迱迵迶迻迾适逄逈逌逘逛逨逩逯逪逬逭逳逴逷逿遃遄遌遛遝遢遦遧遬遰遴遹邅邈邋邌邎邐邕邗邘邙邛邠邡邢邥邰邲邳邴邶邽郌邾郃"],
["8fe2a1","郄郅郇郈郕郗郘郙郜郝郟郥郒郶郫郯郰郴郾郿鄀鄄鄅鄆鄈鄍鄐鄔鄖鄗鄘鄚鄜鄞鄠鄥鄢鄣鄧鄩鄮鄯鄱鄴鄶鄷鄹鄺鄼鄽酃酇酈酏酓酗酙酚酛酡酤酧酭酴酹酺酻醁醃醅醆醊醎醑醓醔醕醘醞醡醦醨醬醭醮醰醱醲醳醶醻醼醽醿"],
["8fe3a1","釂釃釅釓釔釗釙釚釞釤釥釩釪釬",5,"釷釹釻釽鈀鈁鈄鈅鈆鈇鈉鈊鈌鈐鈒鈓鈖鈘鈜鈝鈣鈤鈥鈦鈨鈮鈯鈰鈳鈵鈶鈸鈹鈺鈼鈾鉀鉂鉃鉆鉇鉊鉍鉎鉏鉑鉘鉙鉜鉝鉠鉡鉥鉧鉨鉩鉮鉯鉰鉵",4,"鉻鉼鉽鉿銈銉銊銍銎銒銗"],
["8fe4a1","銙銟銠銤銥銧銨銫銯銲銶銸銺銻銼銽銿",4,"鋅鋆鋇鋈鋋鋌鋍鋎鋐鋓鋕鋗鋘鋙鋜鋝鋟鋠鋡鋣鋥鋧鋨鋬鋮鋰鋹鋻鋿錀錂錈錍錑錔錕錜錝錞錟錡錤錥錧錩錪錳錴錶錷鍇鍈鍉鍐鍑鍒鍕鍗鍘鍚鍞鍤鍥鍧鍩鍪鍭鍯鍰鍱鍳鍴鍶"],
["8fe5a1","鍺鍽鍿鎀鎁鎂鎈鎊鎋鎍鎏鎒鎕鎘鎛鎞鎡鎣鎤鎦鎨鎫鎴鎵鎶鎺鎩鏁鏄鏅鏆鏇鏉",4,"鏓鏙鏜鏞鏟鏢鏦鏧鏹鏷鏸鏺鏻鏽鐁鐂鐄鐈鐉鐍鐎鐏鐕鐖鐗鐟鐮鐯鐱鐲鐳鐴鐻鐿鐽鑃鑅鑈鑊鑌鑕鑙鑜鑟鑡鑣鑨鑫鑭鑮鑯鑱鑲钄钃镸镹"],
["8fe6a1","镾閄閈閌閍閎閝閞閟閡閦閩閫閬閴閶閺閽閿闆闈闉闋闐闑闒闓闙闚闝闞闟闠闤闦阝阞阢阤阥阦阬阱阳阷阸阹阺阼阽陁陒陔陖陗陘陡陮陴陻陼陾陿隁隂隃隄隉隑隖隚隝隟隤隥隦隩隮隯隳隺雊雒嶲雘雚雝雞雟雩雯雱雺霂"],
["8fe7a1","霃霅霉霚霛霝霡霢霣霨霱霳靁靃靊靎靏靕靗靘靚靛靣靧靪靮靳靶靷靸靻靽靿鞀鞉鞕鞖鞗鞙鞚鞞鞟鞢鞬鞮鞱鞲鞵鞶鞸鞹鞺鞼鞾鞿韁韄韅韇韉韊韌韍韎韐韑韔韗韘韙韝韞韠韛韡韤韯韱韴韷韸韺頇頊頙頍頎頔頖頜頞頠頣頦"],
["8fe8a1","頫頮頯頰頲頳頵頥頾顄顇顊顑顒顓顖顗顙顚顢顣顥顦顪顬颫颭颮颰颴颷颸颺颻颿飂飅飈飌飡飣飥飦飧飪飳飶餂餇餈餑餕餖餗餚餛餜餟餢餦餧餫餱",4,"餹餺餻餼饀饁饆饇饈饍饎饔饘饙饛饜饞饟饠馛馝馟馦馰馱馲馵"],
["8fe9a1","馹馺馽馿駃駉駓駔駙駚駜駞駧駪駫駬駰駴駵駹駽駾騂騃騄騋騌騐騑騖騞騠騢騣騤騧騭騮騳騵騶騸驇驁驄驊驋驌驎驑驔驖驝骪骬骮骯骲骴骵骶骹骻骾骿髁髃髆髈髎髐髒髕髖髗髛髜髠髤髥髧髩髬髲髳髵髹髺髽髿",4],
["8feaa1","鬄鬅鬈鬉鬋鬌鬍鬎鬐鬒鬖鬙鬛鬜鬠鬦鬫鬭鬳鬴鬵鬷鬹鬺鬽魈魋魌魕魖魗魛魞魡魣魥魦魨魪",4,"魳魵魷魸魹魿鮀鮄鮅鮆鮇鮉鮊鮋鮍鮏鮐鮔鮚鮝鮞鮦鮧鮩鮬鮰鮱鮲鮷鮸鮻鮼鮾鮿鯁鯇鯈鯎鯐鯗鯘鯝鯟鯥鯧鯪鯫鯯鯳鯷鯸"],
["8feba1","鯹鯺鯽鯿鰀鰂鰋鰏鰑鰖鰘鰙鰚鰜鰞鰢鰣鰦",4,"鰱鰵鰶鰷鰽鱁鱃鱄鱅鱉鱊鱎鱏鱐鱓鱔鱖鱘鱛鱝鱞鱟鱣鱩鱪鱜鱫鱨鱮鱰鱲鱵鱷鱻鳦鳲鳷鳹鴋鴂鴑鴗鴘鴜鴝鴞鴯鴰鴲鴳鴴鴺鴼鵅鴽鵂鵃鵇鵊鵓鵔鵟鵣鵢鵥鵩鵪鵫鵰鵶鵷鵻"],
["8feca1","鵼鵾鶃鶄鶆鶊鶍鶎鶒鶓鶕鶖鶗鶘鶡鶪鶬鶮鶱鶵鶹鶼鶿鷃鷇鷉鷊鷔鷕鷖鷗鷚鷞鷟鷠鷥鷧鷩鷫鷮鷰鷳鷴鷾鸊鸂鸇鸎鸐鸑鸒鸕鸖鸙鸜鸝鹺鹻鹼麀麂麃麄麅麇麎麏麖麘麛麞麤麨麬麮麯麰麳麴麵黆黈黋黕黟黤黧黬黭黮黰黱黲黵"],
["8feda1","黸黿鼂鼃鼉鼏鼐鼑鼒鼔鼖鼗鼙鼚鼛鼟鼢鼦鼪鼫鼯鼱鼲鼴鼷鼹鼺鼼鼽鼿齁齃",4,"齓齕齖齗齘齚齝齞齨齩齭",4,"齳齵齺齽龏龐龑龒龔龖龗龞龡龢龣龥"]
]
{"uChars":[128,165,169,178,184,216,226,235,238,244,248,251,253,258,276,284,300,325,329,334,364,463,465,467,469,471,473,475,477,506,594,610,712,716,730,930,938,962,970,1026,1104,1106,8209,8215,8218,8222,8231,8241,8244,8246,8252,8365,8452,8454,8458,8471,8482,8556,8570,8596,8602,8713,8720,8722,8726,8731,8737,8740,8742,8748,8751,8760,8766,8777,8781,8787,8802,8808,8816,8854,8858,8870,8896,8979,9322,9372,9548,9588,9616,9622,9634,9652,9662,9672,9676,9680,9702,9735,9738,9793,9795,11906,11909,11913,11917,11928,11944,11947,11951,11956,11960,11964,11979,12284,12292,12312,12319,12330,12351,12436,12447,12535,12543,12586,12842,12850,12964,13200,13215,13218,13253,13263,13267,13270,13384,13428,13727,13839,13851,14617,14703,14801,14816,14964,15183,15471,15585,16471,16736,17208,17325,17330,17374,17623,17997,18018,18212,18218,18301,18318,18760,18811,18814,18820,18823,18844,18848,18872,19576,19620,19738,19887,40870,59244,59336,59367,59413,59417,59423,59431,59437,59443,59452,59460,59478,59493,63789,63866,63894,63976,63986,64016,64018,64021,64025,64034,64037,64042,65074,65093,65107,65112,65127,65132,65375,65510,65536],"gbChars":[0,36,38,45,50,81,89,95,96,100,103,104,105,109,126,133,148,172,175,179,208,306,307,308,309,310,311,312,313,341,428,443,544,545,558,741,742,749,750,805,819,820,7922,7924,7925,7927,7934,7943,7944,7945,7950,8062,8148,8149,8152,8164,8174,8236,8240,8262,8264,8374,8380,8381,8384,8388,8390,8392,8393,8394,8396,8401,8406,8416,8419,8424,8437,8439,8445,8482,8485,8496,8521,8603,8936,8946,9046,9050,9063,9066,9076,9092,9100,9108,9111,9113,9131,9162,9164,9218,9219,11329,11331,11334,11336,11346,11361,11363,11366,11370,11372,11375,11389,11682,11686,11687,11692,11694,11714,11716,11723,11725,11730,11736,11982,11989,12102,12336,12348,12350,12384,12393,12395,12397,12510,12553,12851,12962,12973,13738,13823,13919,13933,14080,14298,14585,14698,15583,15847,16318,16434,16438,16481,16729,17102,17122,17315,17320,17402,17418,17859,17909,17911,17915,17916,17936,17939,17961,18664,18703,18814,18962,19043,33469,33470,33471,33484,33485,33490,33497,33501,33505,33513,33520,33536,33550,37845,37921,37948,38029,38038,38064,38065,38066,38069,38075,38076,38078,39108,39109,39113,39114,39115,39116,39265,39394,189000]}[
["a140","",62],
["a180","",32],
["a240","",62],
["a280","",32],
["a2ab","",5],
["a2e3","€"],
["a2ef",""],
["a2fd",""],
["a340","",62],
["a380","",31,"　"],
["a440","",62],
["a480","",32],
["a4f4","",10],
["a540","",62],
["a580","",32],
["a5f7","",7],
["a640","",62],
["a680","",32],
["a6b9","",7],
["a6d9","",6],
["a6ec",""],
["a6f3",""],
["a6f6","",8],
["a740","",62],
["a780","",32],
["a7c2","",14],
["a7f2","",12],
["a896","",10],
["a8bc",""],
["a8bf","ǹ"],
["a8c1",""],
["a8ea","",20],
["a958",""],
["a95b",""],
["a95d",""],
["a989","〾⿰",11],
["a997","",12],
["a9f0","",14],
["aaa1","",93],
["aba1","",93],
["aca1","",93],
["ada1","",93],
["aea1","",93],
["afa1","",93],
["d7fa","",4],
["f8a1","",93],
["f9a1","",93],
["faa1","",93],
["fba1","",93],
["fca1","",93],
["fda1","",93],
["fe50","⺁⺄㑳㑇⺈⺋㖞㘚㘎⺌⺗㥮㤘㧏㧟㩳㧐㭎㱮㳠⺧⺪䁖䅟⺮䌷⺳⺶⺷䎱䎬⺻䏝䓖䙡䙌"],
["fe80","䜣䜩䝼䞍⻊䥇䥺䥽䦂䦃䦅䦆䦟䦛䦷䦶䲣䲟䲠䲡䱷䲢䴓",6,"䶮",93]
]
[
["0","\u0000",128],
["a1","｡",62],
["8140","　、。，．・：；？！゛゜´｀¨＾￣＿ヽヾゝゞ〃仝々〆〇ー―‐／＼～∥｜…‥‘’“”（）〔〕［］｛｝〈",9,"＋－±×"],
["8180","÷＝≠＜＞≦≧∞∴♂♀°′″℃￥＄￠￡％＃＆＊＠§☆★○●◎◇◆□■△▲▽▼※〒→←↑↓〓"],
["81b8","∈∋⊆⊇⊂⊃∪∩"],
["81c8","∧∨￢⇒⇔∀∃"],
["81da","∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬"],
["81f0","Å‰♯♭♪†‡¶"],
["81fc","◯"],
["824f","０",9],
["8260","Ａ",25],
["8281","ａ",25],
["829f","ぁ",82],
["8340","ァ",62],
["8380","ム",22],
["839f","Α",16,"Σ",6],
["83bf","α",16,"σ",6],
["8440","А",5,"ЁЖ",25],
["8470","а",5,"ёж",7],
["8480","о",17],
["849f","─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂"],
["8740","①",19,"Ⅰ",9],
["875f","㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡"],
["877e","㍻"],
["8780","〝〟№㏍℡㊤",4,"㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪"],
["889f","亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭"],
["8940","院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円"],
["8980","園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改"],
["8a40","魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫"],
["8a80","橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄"],
["8b40","機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救"],
["8b80","朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈"],
["8c40","掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨"],
["8c80","劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向"],
["8d40","后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降"],
["8d80","項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷"],
["8e40","察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止"],
["8e80","死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周"],
["8f40","宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳"],
["8f80","準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾"],
["9040","拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨"],
["9080","逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線"],
["9140","繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻"],
["9180","操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只"],
["9240","叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄"],
["9280","逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓"],
["9340","邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬"],
["9380","凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入"],
["9440","如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅"],
["9480","楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美"],
["9540","鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷"],
["9580","斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋"],
["9640","法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆"],
["9680","摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒"],
["9740","諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲"],
["9780","沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯"],
["9840","蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕"],
["989f","弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲"],
["9940","僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭"],
["9980","凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨"],
["9a40","咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸"],
["9a80","噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩"],
["9b40","奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀"],
["9b80","它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏"],
["9c40","廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠"],
["9c80","怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛"],
["9d40","戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫"],
["9d80","捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼"],
["9e40","曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎"],
["9e80","梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣"],
["9f40","檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯"],
["9f80","麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌"],
["e040","漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝"],
["e080","烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱"],
["e140","瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿"],
["e180","痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬"],
["e240","磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰"],
["e280","窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆"],
["e340","紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷"],
["e380","縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋"],
["e440","隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤"],
["e480","艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈"],
["e540","蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬"],
["e580","蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞"],
["e640","襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧"],
["e680","諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊"],
["e740","蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜"],
["e780","轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮"],
["e840","錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙"],
["e880","閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰"],
["e940","顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃"],
["e980","騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈"],
["ea40","鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯"],
["ea80","黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠堯槇遙瑤凜熙"],
["ed40","纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏"],
["ed80","塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱"],
["ee40","犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙"],
["ee80","蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑"],
["eeef","ⅰ",9,"￢￤＇＂"],
["f040","",62],
["f080","",124],
["f140","",62],
["f180","",124],
["f240","",62],
["f280","",124],
["f340","",62],
["f380","",124],
["f440","",62],
["f480","",124],
["f540","",62],
["f580","",124],
["f640","",62],
["f680","",124],
["f740","",62],
["f780","",124],
["f840","",62],
["f880","",124],
["f940",""],
["fa40","ⅰ",9,"Ⅰ",9,"￢￤＇＂㈱№℡∵纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊"],
["fa80","兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯"],
["fb40","涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神"],
["fb80","祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙"],
["fc40","髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑"]
]
/**
 * Helpers.
 */

var s = 1000;
var m = s * 60;
var h = m * 60;
var d = h * 24;
var y = d * 365.25;

/**
 * Parse or format the given `val`.
 *
 * Options:
 *
 *  - `long` verbose formatting [false]
 *
 * @param {String|Number} val
 * @param {Object} [options]
 * @throws {Error} throw an error if val is not a non-empty string or a number
 * @return {String|Number}
 * @api public
 */

module.exports = function(val, options) {
  options = options || {};
  var type = typeof val;
  if (type === 'string' && val.length > 0) {
    return parse(val);
  } else if (type === 'number' && isNaN(val) === false) {
    return options.long ? fmtLong(val) : fmtShort(val);
  }
  throw new Error(
    'val is not a non-empty string or a valid number. val=' +
      JSON.stringify(val)
  );
};

/**
 * Parse the given `str` and return milliseconds.
 *
 * @param {String} str
 * @return {Number}
 * @api private
 */

function parse(str) {
  str = String(str);
  if (str.length > 100) {
    return;
  }
  var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(
    str
  );
  if (!match) {
    return;
  }
  var n = parseFloat(match[1]);
  var type = (match[2] || 'ms').toLowerCase();
  switch (type) {
    case 'years':
    case 'year':
    case 'yrs':
    case 'yr':
    case 'y':
      return n * y;
    case 'days':
    case 'day':
    case 'd':
      return n * d;
    case 'hours':
    case 'hour':
    case 'hrs':
    case 'hr':
    case 'h':
      return n * h;
    case 'minutes':
    case 'minute':
    case 'mins':
    case 'min':
    case 'm':
      return n * m;
    case 'seconds':
    case 'second':
    case 'secs':
    case 'sec':
    case 's':
      return n * s;
    case 'milliseconds':
    case 'millisecond':
    case 'msecs':
    case 'msec':
    case 'ms':
      return n;
    default:
      return undefined;
  }
}

/**
 * Short format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtShort(ms) {
  if (ms >= d) {
    return Math.round(ms / d) + 'd';
  }
  if (ms >= h) {
    return Math.round(ms / h) + 'h';
  }
  if (ms >= m) {
    return Math.round(ms / m) + 'm';
  }
  if (ms >= s) {
    return Math.round(ms / s) + 's';
  }
  return ms + 'ms';
}

/**
 * Long format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtLong(ms) {
  return plural(ms, d, 'day') ||
    plural(ms, h, 'hour') ||
    plural(ms, m, 'minute') ||
    plural(ms, s, 'second') ||
    ms + ' ms';
}

/**
 * Pluralization helper.
 */

function plural(ms, n, name) {
  if (ms < n) {
    return;
  }
  if (ms < n * 1.5) {
    return Math.floor(ms / n) + ' ' + name;
  }
  return Math.ceil(ms / n) + ' ' + name + 's';
}
The MIT License (MIT)

Copyright (c) 2016 Zeit, Inc.

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": "ms",
  "version": "2.0.0",
  "description": "Tiny milisecond conversion utility",
  "repository": "zeit/ms",
  "main": "./index",
  "files": [
    "index.js"
  ],
  "lint-staged": {
    "*.js": [
      "npm run lint",
      "prettier --single-quote --write",
      "git add"
    ]
  },
  "license": "MIT",
  "devDependencies": {
    "eslint": "3.19.0",
    "expect.js": "0.3.1",
    "husky": "0.13.3",
    "lint-staged": "3.4.1",
    "mocha": "3.4.1"
  }
}root = true

[*]
indent_style = space
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 160
quote_type = single

[test/*]
max_line_length = off

[LICENSE.md]
indent_size = off

[*.md]
max_line_length = off

[*.json]
max_line_length = off

[Makefile]
max_line_length = off

[CHANGELOG.md]
indent_style = space
indent_size = 2

[LICENSE]
indent_size = 2
max_line_length = off

[coverage/**/*]
indent_size = off
indent_style = off
indent = off
max_line_length = off
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"lines": 86,
	"statements": 85.93,
	"functions": 82.43,
	"branches": 76.06,
	"exclude": [
		"coverage",
		"dist"
	]
}
BSD 3-Clause License

Copyright (c) 2014, Nathan LaFreniere and other [contributors](https://github.com/ljharb/qs/graphs/contributors)
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.

3. Neither the name of the copyright holder nor the names of its
   contributors may 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 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.
{
  "name": "qs",
  "description": "A querystring parser that supports nesting and arrays, with a depth limit",
  "homepage": "https://github.com/ljharb/qs",
  "version": "6.10.3",
  "repository": {
    "type": "git",
    "url": "https://github.com/ljharb/qs.git"
  },
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "main": "lib/index.js",
  "engines": {
    "node": ">=0.6"
  },
  "dependencies": {
    "side-channel": "^1.0.4"
  },
  "devDependencies": {
    "@ljharb/eslint-config": "^20.1.0",
    "aud": "^1.1.5",
    "browserify": "^16.5.2",
    "eclint": "^2.8.1",
    "eslint": "^8.6.0",
    "evalmd": "^0.0.19",
    "for-each": "^0.3.3",
    "has-symbols": "^1.0.2",
    "iconv-lite": "^0.5.1",
    "in-publish": "^2.0.1",
    "mkdirp": "^0.5.5",
    "nyc": "^10.3.2",
    "object-inspect": "^1.12.0",
    "qs-iconv": "^1.0.4",
    "safe-publish-latest": "^2.0.0",
    "safer-buffer": "^2.1.2",
    "tape": "^5.4.0"
  },
  "license": "BSD-3-Clause",
  "greenkeeper": {
    "ignore": [
      "iconv-lite",
      "mkdirp"
    ]
  }
}'use strict';

var replace = String.prototype.replace;
var percentTwenties = /%20/g;

var Format = {
    RFC1738: 'RFC1738',
    RFC3986: 'RFC3986'
};

module.exports = {
    'default': Format.RFC3986,
    formatters: {
        RFC1738: function (value) {
            return replace.call(value, percentTwenties, '+');
        },
        RFC3986: function (value) {
            return String(value);
        }
    },
    RFC1738: Format.RFC1738,
    RFC3986: Format.RFC3986
};
'use strict';

var stringify = require('./stringify');
var parse = require('./parse');
var formats = require('./formats');

module.exports = {
    formats: formats,
    parse: parse,
    stringify: stringify
};
'use strict';

var utils = require('./utils');

var has = Object.prototype.hasOwnProperty;
var isArray = Array.isArray;

var defaults = {
    allowDots: false,
    allowPrototypes: false,
    allowSparse: false,
    arrayLimit: 20,
    charset: 'utf-8',
    charsetSentinel: false,
    comma: false,
    decoder: utils.decode,
    delimiter: '&',
    depth: 5,
    ignoreQueryPrefix: false,
    interpretNumericEntities: false,
    parameterLimit: 1000,
    parseArrays: true,
    plainObjects: false,
    strictNullHandling: false
};

var interpretNumericEntities = function (str) {
    return str.replace(/&#(\d+);/g, function ($0, numberStr) {
        return String.fromCharCode(parseInt(numberStr, 10));
    });
};

var parseArrayValue = function (val, options) {
    if (val && typeof val === 'string' && options.comma && val.indexOf(',') > -1) {
        return val.split(',');
    }

    return val;
};

// This is what browsers will submit when the ✓ character occurs in an
// application/x-www-form-urlencoded body and the encoding of the page containing
// the form is iso-8859-1, or when the submitted form has an accept-charset
// attribute of iso-8859-1. Presumably also with other charsets that do not contain
// the ✓ character, such as us-ascii.
var isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('&#10003;')

// These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded.
var charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓')

var parseValues = function parseQueryStringValues(str, options) {
    var obj = {};
    var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str;
    var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit;
    var parts = cleanStr.split(options.delimiter, limit);
    var skipIndex = -1; // Keep track of where the utf8 sentinel was found
    var i;

    var charset = options.charset;
    if (options.charsetSentinel) {
        for (i = 0; i < parts.length; ++i) {
            if (parts[i].indexOf('utf8=') === 0) {
                if (parts[i] === charsetSentinel) {
                    charset = 'utf-8';
                } else if (parts[i] === isoSentinel) {
                    charset = 'iso-8859-1';
                }
                skipIndex = i;
                i = parts.length; // The eslint settings do not allow break;
            }
        }
    }

    for (i = 0; i < parts.length; ++i) {
        if (i === skipIndex) {
            continue;
        }
        var part = parts[i];

        var bracketEqualsPos = part.indexOf(']=');
        var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;

        var key, val;
        if (pos === -1) {
            key = options.decoder(part, defaults.decoder, charset, 'key');
            val = options.strictNullHandling ? null : '';
        } else {
            key = options.decoder(part.slice(0, pos), defaults.decoder, charset, 'key');
            val = utils.maybeMap(
                parseArrayValue(part.slice(pos + 1), options),
                function (encodedVal) {
                    return options.decoder(encodedVal, defaults.decoder, charset, 'value');
                }
            );
        }

        if (val && options.interpretNumericEntities && charset === 'iso-8859-1') {
            val = interpretNumericEntities(val);
        }

        if (part.indexOf('[]=') > -1) {
            val = isArray(val) ? [val] : val;
        }

        if (has.call(obj, key)) {
            obj[key] = utils.combine(obj[key], val);
        } else {
            obj[key] = val;
        }
    }

    return obj;
};

var parseObject = function (chain, val, options, valuesParsed) {
    var leaf = valuesParsed ? val : parseArrayValue(val, options);

    for (var i = chain.length - 1; i >= 0; --i) {
        var obj;
        var root = chain[i];

        if (root === '[]' && options.parseArrays) {
            obj = [].concat(leaf);
        } else {
            obj = options.plainObjects ? Object.create(null) : {};
            var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;
            var index = parseInt(cleanRoot, 10);
            if (!options.parseArrays && cleanRoot === '') {
                obj = { 0: leaf };
            } else if (
                !isNaN(index)
                && root !== cleanRoot
                && String(index) === cleanRoot
                && index >= 0
                && (options.parseArrays && index <= options.arrayLimit)
            ) {
                obj = [];
                obj[index] = leaf;
            } else if (cleanRoot !== '__proto__') {
                obj[cleanRoot] = leaf;
            }
        }

        leaf = obj;
    }

    return leaf;
};

var parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) {
    if (!givenKey) {
        return;
    }

    // Transform dot notation to bracket notation
    var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey;

    // The regex chunks

    var brackets = /(\[[^[\]]*])/;
    var child = /(\[[^[\]]*])/g;

    // Get the parent

    var segment = options.depth > 0 && brackets.exec(key);
    var parent = segment ? key.slice(0, segment.index) : key;

    // Stash the parent if it exists

    var keys = [];
    if (parent) {
        // If we aren't using plain objects, optionally prefix keys that would overwrite object prototype properties
        if (!options.plainObjects && has.call(Object.prototype, parent)) {
            if (!options.allowPrototypes) {
                return;
            }
        }

        keys.push(parent);
    }

    // Loop through children appending to the array until we hit depth

    var i = 0;
    while (options.depth > 0 && (segment = child.exec(key)) !== null && i < options.depth) {
        i += 1;
        if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) {
            if (!options.allowPrototypes) {
                return;
            }
        }
        keys.push(segment[1]);
    }

    // If there's a remainder, just add whatever is left

    if (segment) {
        keys.push('[' + key.slice(segment.index) + ']');
    }

    return parseObject(keys, val, options, valuesParsed);
};

var normalizeParseOptions = function normalizeParseOptions(opts) {
    if (!opts) {
        return defaults;
    }

    if (opts.decoder !== null && opts.decoder !== undefined && typeof opts.decoder !== 'function') {
        throw new TypeError('Decoder has to be a function.');
    }

    if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {
        throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');
    }
    var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset;

    return {
        allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots,
        allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes,
        allowSparse: typeof opts.allowSparse === 'boolean' ? opts.allowSparse : defaults.allowSparse,
        arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit,
        charset: charset,
        charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,
        comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma,
        decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder,
        delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter,
        // eslint-disable-next-line no-implicit-coercion, no-extra-parens
        depth: (typeof opts.depth === 'number' || opts.depth === false) ? +opts.depth : defaults.depth,
        ignoreQueryPrefix: opts.ignoreQueryPrefix === true,
        interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities,
        parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit,
        parseArrays: opts.parseArrays !== false,
        plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects,
        strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling
    };
};

module.exports = function (str, opts) {
    var options = normalizeParseOptions(opts);

    if (str === '' || str === null || typeof str === 'undefined') {
        return options.plainObjects ? Object.create(null) : {};
    }

    var tempObj = typeof str === 'string' ? parseValues(str, options) : str;
    var obj = options.plainObjects ? Object.create(null) : {};

    // Iterate over the keys and setup the new object

    var keys = Object.keys(tempObj);
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        var newObj = parseKeys(key, tempObj[key], options, typeof str === 'string');
        obj = utils.merge(obj, newObj, options);
    }

    if (options.allowSparse === true) {
        return obj;
    }

    return utils.compact(obj);
};
'use strict';

var getSideChannel = require('side-channel');
var utils = require('./utils');
var formats = require('./formats');
var has = Object.prototype.hasOwnProperty;

var arrayPrefixGenerators = {
    brackets: function brackets(prefix) {
        return prefix + '[]';
    },
    comma: 'comma',
    indices: function indices(prefix, key) {
        return prefix + '[' + key + ']';
    },
    repeat: function repeat(prefix) {
        return prefix;
    }
};

var isArray = Array.isArray;
var split = String.prototype.split;
var push = Array.prototype.push;
var pushToArray = function (arr, valueOrArray) {
    push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]);
};

var toISO = Date.prototype.toISOString;

var defaultFormat = formats['default'];
var defaults = {
    addQueryPrefix: false,
    allowDots: false,
    charset: 'utf-8',
    charsetSentinel: false,
    delimiter: '&',
    encode: true,
    encoder: utils.encode,
    encodeValuesOnly: false,
    format: defaultFormat,
    formatter: formats.formatters[defaultFormat],
    // deprecated
    indices: false,
    serializeDate: function serializeDate(date) {
        return toISO.call(date);
    },
    skipNulls: false,
    strictNullHandling: false
};

var isNonNullishPrimitive = function isNonNullishPrimitive(v) {
    return typeof v === 'string'
        || typeof v === 'number'
        || typeof v === 'boolean'
        || typeof v === 'symbol'
        || typeof v === 'bigint';
};

var sentinel = {};

var stringify = function stringify(
    object,
    prefix,
    generateArrayPrefix,
    strictNullHandling,
    skipNulls,
    encoder,
    filter,
    sort,
    allowDots,
    serializeDate,
    format,
    formatter,
    encodeValuesOnly,
    charset,
    sideChannel
) {
    var obj = object;

    var tmpSc = sideChannel;
    var step = 0;
    var findFlag = false;
    while ((tmpSc = tmpSc.get(sentinel)) !== void undefined && !findFlag) {
        // Where object last appeared in the ref tree
        var pos = tmpSc.get(object);
        step += 1;
        if (typeof pos !== 'undefined') {
            if (pos === step) {
                throw new RangeError('Cyclic object value');
            } else {
                findFlag = true; // Break while
            }
        }
        if (typeof tmpSc.get(sentinel) === 'undefined') {
            step = 0;
        }
    }

    if (typeof filter === 'function') {
        obj = filter(prefix, obj);
    } else if (obj instanceof Date) {
        obj = serializeDate(obj);
    } else if (generateArrayPrefix === 'comma' && isArray(obj)) {
        obj = utils.maybeMap(obj, function (value) {
            if (value instanceof Date) {
                return serializeDate(value);
            }
            return value;
        });
    }

    if (obj === null) {
        if (strictNullHandling) {
            return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key', format) : prefix;
        }

        obj = '';
    }

    if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) {
        if (encoder) {
            var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset, 'key', format);
            if (generateArrayPrefix === 'comma' && encodeValuesOnly) {
                var valuesArray = split.call(String(obj), ',');
                var valuesJoined = '';
                for (var i = 0; i < valuesArray.length; ++i) {
                    valuesJoined += (i === 0 ? '' : ',') + formatter(encoder(valuesArray[i], defaults.encoder, charset, 'value', format));
                }
                return [formatter(keyValue) + '=' + valuesJoined];
            }
            return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset, 'value', format))];
        }
        return [formatter(prefix) + '=' + formatter(String(obj))];
    }

    var values = [];

    if (typeof obj === 'undefined') {
        return values;
    }

    var objKeys;
    if (generateArrayPrefix === 'comma' && isArray(obj)) {
        // we need to join elements in
        objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }];
    } else if (isArray(filter)) {
        objKeys = filter;
    } else {
        var keys = Object.keys(obj);
        objKeys = sort ? keys.sort(sort) : keys;
    }

    for (var j = 0; j < objKeys.length; ++j) {
        var key = objKeys[j];
        var value = typeof key === 'object' && typeof key.value !== 'undefined' ? key.value : obj[key];

        if (skipNulls && value === null) {
            continue;
        }

        var keyPrefix = isArray(obj)
            ? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(prefix, key) : prefix
            : prefix + (allowDots ? '.' + key : '[' + key + ']');

        sideChannel.set(object, step);
        var valueSideChannel = getSideChannel();
        valueSideChannel.set(sentinel, sideChannel);
        pushToArray(values, stringify(
            value,
            keyPrefix,
            generateArrayPrefix,
            strictNullHandling,
            skipNulls,
            encoder,
            filter,
            sort,
            allowDots,
            serializeDate,
            format,
            formatter,
            encodeValuesOnly,
            charset,
            valueSideChannel
        ));
    }

    return values;
};

var normalizeStringifyOptions = function normalizeStringifyOptions(opts) {
    if (!opts) {
        return defaults;
    }

    if (opts.encoder !== null && typeof opts.encoder !== 'undefined' && typeof opts.encoder !== 'function') {
        throw new TypeError('Encoder has to be a function.');
    }

    var charset = opts.charset || defaults.charset;
    if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {
        throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');
    }

    var format = formats['default'];
    if (typeof opts.format !== 'undefined') {
        if (!has.call(formats.formatters, opts.format)) {
            throw new TypeError('Unknown format option provided.');
        }
        format = opts.format;
    }
    var formatter = formats.formatters[format];

    var filter = defaults.filter;
    if (typeof opts.filter === 'function' || isArray(opts.filter)) {
        filter = opts.filter;
    }

    return {
        addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix,
        allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots,
        charset: charset,
        charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,
        delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter,
        encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode,
        encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder,
        encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly,
        filter: filter,
        format: format,
        formatter: formatter,
        serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate,
        skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls,
        sort: typeof opts.sort === 'function' ? opts.sort : null,
        strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling
    };
};

module.exports = function (object, opts) {
    var obj = object;
    var options = normalizeStringifyOptions(opts);

    var objKeys;
    var filter;

    if (typeof options.filter === 'function') {
        filter = options.filter;
        obj = filter('', obj);
    } else if (isArray(options.filter)) {
        filter = options.filter;
        objKeys = filter;
    }

    var keys = [];

    if (typeof obj !== 'object' || obj === null) {
        return '';
    }

    var arrayFormat;
    if (opts && opts.arrayFormat in arrayPrefixGenerators) {
        arrayFormat = opts.arrayFormat;
    } else if (opts && 'indices' in opts) {
        arrayFormat = opts.indices ? 'indices' : 'repeat';
    } else {
        arrayFormat = 'indices';
    }

    var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];

    if (!objKeys) {
        objKeys = Object.keys(obj);
    }

    if (options.sort) {
        objKeys.sort(options.sort);
    }

    var sideChannel = getSideChannel();
    for (var i = 0; i < objKeys.length; ++i) {
        var key = objKeys[i];

        if (options.skipNulls && obj[key] === null) {
            continue;
        }
        pushToArray(keys, stringify(
            obj[key],
            key,
            generateArrayPrefix,
            options.strictNullHandling,
            options.skipNulls,
            options.encode ? options.encoder : null,
            options.filter,
            options.sort,
            options.allowDots,
            options.serializeDate,
            options.format,
            options.formatter,
            options.encodeValuesOnly,
            options.charset,
            sideChannel
        ));
    }

    var joined = keys.join(options.delimiter);
    var prefix = options.addQueryPrefix === true ? '?' : '';

    if (options.charsetSentinel) {
        if (options.charset === 'iso-8859-1') {
            // encodeURIComponent('&#10003;'), the "numeric entity" representation of a checkmark
            prefix += 'utf8=%26%2310003%3B&';
        } else {
            // encodeURIComponent('✓')
            prefix += 'utf8=%E2%9C%93&';
        }
    }

    return joined.length > 0 ? prefix + joined : '';
};
'use strict';

var formats = require('./formats');

var has = Object.prototype.hasOwnProperty;
var isArray = Array.isArray;

var hexTable = (function () {
    var array = [];
    for (var i = 0; i < 256; ++i) {
        array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());
    }

    return array;
}());

var compactQueue = function compactQueue(queue) {
    while (queue.length > 1) {
        var item = queue.pop();
        var obj = item.obj[item.prop];

        if (isArray(obj)) {
            var compacted = [];

            for (var j = 0; j < obj.length; ++j) {
                if (typeof obj[j] !== 'undefined') {
                    compacted.push(obj[j]);
                }
            }

            item.obj[item.prop] = compacted;
        }
    }
};

var arrayToObject = function arrayToObject(source, options) {
    var obj = options && options.plainObjects ? Object.create(null) : {};
    for (var i = 0; i < source.length; ++i) {
        if (typeof source[i] !== 'undefined') {
            obj[i] = source[i];
        }
    }

    return obj;
};

var merge = function merge(target, source, options) {
    /* eslint no-param-reassign: 0 */
    if (!source) {
        return target;
    }

    if (typeof source !== 'object') {
        if (isArray(target)) {
            target.push(source);
        } else if (target && typeof target === 'object') {
            if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) {
                target[source] = true;
            }
        } else {
            return [target, source];
        }

        return target;
    }

    if (!target || typeof target !== 'object') {
        return [target].concat(source);
    }

    var mergeTarget = target;
    if (isArray(target) && !isArray(source)) {
        mergeTarget = arrayToObject(target, options);
    }

    if (isArray(target) && isArray(source)) {
        source.forEach(function (item, i) {
            if (has.call(target, i)) {
                var targetItem = target[i];
                if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') {
                    target[i] = merge(targetItem, item, options);
                } else {
                    target.push(item);
                }
            } else {
                target[i] = item;
            }
        });
        return target;
    }

    return Object.keys(source).reduce(function (acc, key) {
        var value = source[key];

        if (has.call(acc, key)) {
            acc[key] = merge(acc[key], value, options);
        } else {
            acc[key] = value;
        }
        return acc;
    }, mergeTarget);
};

var assign = function assignSingleSource(target, source) {
    return Object.keys(source).reduce(function (acc, key) {
        acc[key] = source[key];
        return acc;
    }, target);
};

var decode = function (str, decoder, charset) {
    var strWithoutPlus = str.replace(/\+/g, ' ');
    if (charset === 'iso-8859-1') {
        // unescape never throws, no try...catch needed:
        return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape);
    }
    // utf-8
    try {
        return decodeURIComponent(strWithoutPlus);
    } catch (e) {
        return strWithoutPlus;
    }
};

var encode = function encode(str, defaultEncoder, charset, kind, format) {
    // This code was originally written by Brian White (mscdex) for the io.js core querystring library.
    // It has been adapted here for stricter adherence to RFC 3986
    if (str.length === 0) {
        return str;
    }

    var string = str;
    if (typeof str === 'symbol') {
        string = Symbol.prototype.toString.call(str);
    } else if (typeof str !== 'string') {
        string = String(str);
    }

    if (charset === 'iso-8859-1') {
        return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) {
            return '%26%23' + parseInt($0.slice(2), 16) + '%3B';
        });
    }

    var out = '';
    for (var i = 0; i < string.length; ++i) {
        var c = string.charCodeAt(i);

        if (
            c === 0x2D // -
            || c === 0x2E // .
            || c === 0x5F // _
            || c === 0x7E // ~
            || (c >= 0x30 && c <= 0x39) // 0-9
            || (c >= 0x41 && c <= 0x5A) // a-z
            || (c >= 0x61 && c <= 0x7A) // A-Z
            || (format === formats.RFC1738 && (c === 0x28 || c === 0x29)) // ( )
        ) {
            out += string.charAt(i);
            continue;
        }

        if (c < 0x80) {
            out = out + hexTable[c];
            continue;
        }

        if (c < 0x800) {
            out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);
            continue;
        }

        if (c < 0xD800 || c >= 0xE000) {
            out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);
            continue;
        }

        i += 1;
        c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));
        /* eslint operator-linebreak: [2, "before"] */
        out += hexTable[0xF0 | (c >> 18)]
            + hexTable[0x80 | ((c >> 12) & 0x3F)]
            + hexTable[0x80 | ((c >> 6) & 0x3F)]
            + hexTable[0x80 | (c & 0x3F)];
    }

    return out;
};

var compact = function compact(value) {
    var queue = [{ obj: { o: value }, prop: 'o' }];
    var refs = [];

    for (var i = 0; i < queue.length; ++i) {
        var item = queue[i];
        var obj = item.obj[item.prop];

        var keys = Object.keys(obj);
        for (var j = 0; j < keys.length; ++j) {
            var key = keys[j];
            var val = obj[key];
            if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {
                queue.push({ obj: obj, prop: key });
                refs.push(val);
            }
        }
    }

    compactQueue(queue);

    return value;
};

var isRegExp = function isRegExp(obj) {
    return Object.prototype.toString.call(obj) === '[object RegExp]';
};

var isBuffer = function isBuffer(obj) {
    if (!obj || typeof obj !== 'object') {
        return false;
    }

    return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));
};

var combine = function combine(a, b) {
    return [].concat(a, b);
};

var maybeMap = function maybeMap(val, fn) {
    if (isArray(val)) {
        var mapped = [];
        for (var i = 0; i < val.length; i += 1) {
            mapped.push(fn(val[i]));
        }
        return mapped;
    }
    return fn(val);
};

module.exports = {
    arrayToObject: arrayToObject,
    assign: assign,
    combine: combine,
    compact: compact,
    decode: decode,
    encode: encode,
    isBuffer: isBuffer,
    isRegExp: isRegExp,
    maybeMap: maybeMap,
    merge: merge
};
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Qs = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
'use strict';

var replace = String.prototype.replace;
var percentTwenties = /%20/g;

var Format = {
    RFC1738: 'RFC1738',
    RFC3986: 'RFC3986'
};

module.exports = {
    'default': Format.RFC3986,
    formatters: {
        RFC1738: function (value) {
            return replace.call(value, percentTwenties, '+');
        },
        RFC3986: function (value) {
            return String(value);
        }
    },
    RFC1738: Format.RFC1738,
    RFC3986: Format.RFC3986
};

},{}],2:[function(require,module,exports){
'use strict';

var stringify = require('./stringify');
var parse = require('./parse');
var formats = require('./formats');

module.exports = {
    formats: formats,
    parse: parse,
    stringify: stringify
};

},{"./formats":1,"./parse":3,"./stringify":4}],3:[function(require,module,exports){
'use strict';

var utils = require('./utils');

var has = Object.prototype.hasOwnProperty;
var isArray = Array.isArray;

var defaults = {
    allowDots: false,
    allowPrototypes: false,
    allowSparse: false,
    arrayLimit: 20,
    charset: 'utf-8',
    charsetSentinel: false,
    comma: false,
    decoder: utils.decode,
    delimiter: '&',
    depth: 5,
    ignoreQueryPrefix: false,
    interpretNumericEntities: false,
    parameterLimit: 1000,
    parseArrays: true,
    plainObjects: false,
    strictNullHandling: false
};

var interpretNumericEntities = function (str) {
    return str.replace(/&#(\d+);/g, function ($0, numberStr) {
        return String.fromCharCode(parseInt(numberStr, 10));
    });
};

var parseArrayValue = function (val, options) {
    if (val && typeof val === 'string' && options.comma && val.indexOf(',') > -1) {
        return val.split(',');
    }

    return val;
};

// This is what browsers will submit when the ✓ character occurs in an
// application/x-www-form-urlencoded body and the encoding of the page containing
// the form is iso-8859-1, or when the submitted form has an accept-charset
// attribute of iso-8859-1. Presumably also with other charsets that do not contain
// the ✓ character, such as us-ascii.
var isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('&#10003;')

// These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded.
var charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓')

var parseValues = function parseQueryStringValues(str, options) {
    var obj = {};
    var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str;
    var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit;
    var parts = cleanStr.split(options.delimiter, limit);
    var skipIndex = -1; // Keep track of where the utf8 sentinel was found
    var i;

    var charset = options.charset;
    if (options.charsetSentinel) {
        for (i = 0; i < parts.length; ++i) {
            if (parts[i].indexOf('utf8=') === 0) {
                if (parts[i] === charsetSentinel) {
                    charset = 'utf-8';
                } else if (parts[i] === isoSentinel) {
                    charset = 'iso-8859-1';
                }
                skipIndex = i;
                i = parts.length; // The eslint settings do not allow break;
            }
        }
    }

    for (i = 0; i < parts.length; ++i) {
        if (i === skipIndex) {
            continue;
        }
        var part = parts[i];

        var bracketEqualsPos = part.indexOf(']=');
        var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;

        var key, val;
        if (pos === -1) {
            key = options.decoder(part, defaults.decoder, charset, 'key');
            val = options.strictNullHandling ? null : '';
        } else {
            key = options.decoder(part.slice(0, pos), defaults.decoder, charset, 'key');
            val = utils.maybeMap(
                parseArrayValue(part.slice(pos + 1), options),
                function (encodedVal) {
                    return options.decoder(encodedVal, defaults.decoder, charset, 'value');
                }
            );
        }

        if (val && options.interpretNumericEntities && charset === 'iso-8859-1') {
            val = interpretNumericEntities(val);
        }

        if (part.indexOf('[]=') > -1) {
            val = isArray(val) ? [val] : val;
        }

        if (has.call(obj, key)) {
            obj[key] = utils.combine(obj[key], val);
        } else {
            obj[key] = val;
        }
    }

    return obj;
};

var parseObject = function (chain, val, options, valuesParsed) {
    var leaf = valuesParsed ? val : parseArrayValue(val, options);

    for (var i = chain.length - 1; i >= 0; --i) {
        var obj;
        var root = chain[i];

        if (root === '[]' && options.parseArrays) {
            obj = [].concat(leaf);
        } else {
            obj = options.plainObjects ? Object.create(null) : {};
            var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;
            var index = parseInt(cleanRoot, 10);
            if (!options.parseArrays && cleanRoot === '') {
                obj = { 0: leaf };
            } else if (
                !isNaN(index)
                && root !== cleanRoot
                && String(index) === cleanRoot
                && index >= 0
                && (options.parseArrays && index <= options.arrayLimit)
            ) {
                obj = [];
                obj[index] = leaf;
            } else if (cleanRoot !== '__proto__') {
                obj[cleanRoot] = leaf;
            }
        }

        leaf = obj;
    }

    return leaf;
};

var parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) {
    if (!givenKey) {
        return;
    }

    // Transform dot notation to bracket notation
    var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey;

    // The regex chunks

    var brackets = /(\[[^[\]]*])/;
    var child = /(\[[^[\]]*])/g;

    // Get the parent

    var segment = options.depth > 0 && brackets.exec(key);
    var parent = segment ? key.slice(0, segment.index) : key;

    // Stash the parent if it exists

    var keys = [];
    if (parent) {
        // If we aren't using plain objects, optionally prefix keys that would overwrite object prototype properties
        if (!options.plainObjects && has.call(Object.prototype, parent)) {
            if (!options.allowPrototypes) {
                return;
            }
        }

        keys.push(parent);
    }

    // Loop through children appending to the array until we hit depth

    var i = 0;
    while (options.depth > 0 && (segment = child.exec(key)) !== null && i < options.depth) {
        i += 1;
        if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) {
            if (!options.allowPrototypes) {
                return;
            }
        }
        keys.push(segment[1]);
    }

    // If there's a remainder, just add whatever is left

    if (segment) {
        keys.push('[' + key.slice(segment.index) + ']');
    }

    return parseObject(keys, val, options, valuesParsed);
};

var normalizeParseOptions = function normalizeParseOptions(opts) {
    if (!opts) {
        return defaults;
    }

    if (opts.decoder !== null && opts.decoder !== undefined && typeof opts.decoder !== 'function') {
        throw new TypeError('Decoder has to be a function.');
    }

    if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {
        throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');
    }
    var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset;

    return {
        allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots,
        allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes,
        allowSparse: typeof opts.allowSparse === 'boolean' ? opts.allowSparse : defaults.allowSparse,
        arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit,
        charset: charset,
        charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,
        comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma,
        decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder,
        delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter,
        // eslint-disable-next-line no-implicit-coercion, no-extra-parens
        depth: (typeof opts.depth === 'number' || opts.depth === false) ? +opts.depth : defaults.depth,
        ignoreQueryPrefix: opts.ignoreQueryPrefix === true,
        interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities,
        parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit,
        parseArrays: opts.parseArrays !== false,
        plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects,
        strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling
    };
};

module.exports = function (str, opts) {
    var options = normalizeParseOptions(opts);

    if (str === '' || str === null || typeof str === 'undefined') {
        return options.plainObjects ? Object.create(null) : {};
    }

    var tempObj = typeof str === 'string' ? parseValues(str, options) : str;
    var obj = options.plainObjects ? Object.create(null) : {};

    // Iterate over the keys and setup the new object

    var keys = Object.keys(tempObj);
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        var newObj = parseKeys(key, tempObj[key], options, typeof str === 'string');
        obj = utils.merge(obj, newObj, options);
    }

    if (options.allowSparse === true) {
        return obj;
    }

    return utils.compact(obj);
};

},{"./utils":5}],4:[function(require,module,exports){
'use strict';

var getSideChannel = require('side-channel');
var utils = require('./utils');
var formats = require('./formats');
var has = Object.prototype.hasOwnProperty;

var arrayPrefixGenerators = {
    brackets: function brackets(prefix) {
        return prefix + '[]';
    },
    comma: 'comma',
    indices: function indices(prefix, key) {
        return prefix + '[' + key + ']';
    },
    repeat: function repeat(prefix) {
        return prefix;
    }
};

var isArray = Array.isArray;
var split = String.prototype.split;
var push = Array.prototype.push;
var pushToArray = function (arr, valueOrArray) {
    push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]);
};

var toISO = Date.prototype.toISOString;

var defaultFormat = formats['default'];
var defaults = {
    addQueryPrefix: false,
    allowDots: false,
    charset: 'utf-8',
    charsetSentinel: false,
    delimiter: '&',
    encode: true,
    encoder: utils.encode,
    encodeValuesOnly: false,
    format: defaultFormat,
    formatter: formats.formatters[defaultFormat],
    // deprecated
    indices: false,
    serializeDate: function serializeDate(date) {
        return toISO.call(date);
    },
    skipNulls: false,
    strictNullHandling: false
};

var isNonNullishPrimitive = function isNonNullishPrimitive(v) {
    return typeof v === 'string'
        || typeof v === 'number'
        || typeof v === 'boolean'
        || typeof v === 'symbol'
        || typeof v === 'bigint';
};

var sentinel = {};

var stringify = function stringify(
    object,
    prefix,
    generateArrayPrefix,
    strictNullHandling,
    skipNulls,
    encoder,
    filter,
    sort,
    allowDots,
    serializeDate,
    format,
    formatter,
    encodeValuesOnly,
    charset,
    sideChannel
) {
    var obj = object;

    var tmpSc = sideChannel;
    var step = 0;
    var findFlag = false;
    while ((tmpSc = tmpSc.get(sentinel)) !== void undefined && !findFlag) {
        // Where object last appeared in the ref tree
        var pos = tmpSc.get(object);
        step += 1;
        if (typeof pos !== 'undefined') {
            if (pos === step) {
                throw new RangeError('Cyclic object value');
            } else {
                findFlag = true; // Break while
            }
        }
        if (typeof tmpSc.get(sentinel) === 'undefined') {
            step = 0;
        }
    }

    if (typeof filter === 'function') {
        obj = filter(prefix, obj);
    } else if (obj instanceof Date) {
        obj = serializeDate(obj);
    } else if (generateArrayPrefix === 'comma' && isArray(obj)) {
        obj = utils.maybeMap(obj, function (value) {
            if (value instanceof Date) {
                return serializeDate(value);
            }
            return value;
        });
    }

    if (obj === null) {
        if (strictNullHandling) {
            return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key', format) : prefix;
        }

        obj = '';
    }

    if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) {
        if (encoder) {
            var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset, 'key', format);
            if (generateArrayPrefix === 'comma' && encodeValuesOnly) {
                var valuesArray = split.call(String(obj), ',');
                var valuesJoined = '';
                for (var i = 0; i < valuesArray.length; ++i) {
                    valuesJoined += (i === 0 ? '' : ',') + formatter(encoder(valuesArray[i], defaults.encoder, charset, 'value', format));
                }
                return [formatter(keyValue) + '=' + valuesJoined];
            }
            return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset, 'value', format))];
        }
        return [formatter(prefix) + '=' + formatter(String(obj))];
    }

    var values = [];

    if (typeof obj === 'undefined') {
        return values;
    }

    var objKeys;
    if (generateArrayPrefix === 'comma' && isArray(obj)) {
        // we need to join elements in
        objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }];
    } else if (isArray(filter)) {
        objKeys = filter;
    } else {
        var keys = Object.keys(obj);
        objKeys = sort ? keys.sort(sort) : keys;
    }

    for (var j = 0; j < objKeys.length; ++j) {
        var key = objKeys[j];
        var value = typeof key === 'object' && typeof key.value !== 'undefined' ? key.value : obj[key];

        if (skipNulls && value === null) {
            continue;
        }

        var keyPrefix = isArray(obj)
            ? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(prefix, key) : prefix
            : prefix + (allowDots ? '.' + key : '[' + key + ']');

        sideChannel.set(object, step);
        var valueSideChannel = getSideChannel();
        valueSideChannel.set(sentinel, sideChannel);
        pushToArray(values, stringify(
            value,
            keyPrefix,
            generateArrayPrefix,
            strictNullHandling,
            skipNulls,
            encoder,
            filter,
            sort,
            allowDots,
            serializeDate,
            format,
            formatter,
            encodeValuesOnly,
            charset,
            valueSideChannel
        ));
    }

    return values;
};

var normalizeStringifyOptions = function normalizeStringifyOptions(opts) {
    if (!opts) {
        return defaults;
    }

    if (opts.encoder !== null && typeof opts.encoder !== 'undefined' && typeof opts.encoder !== 'function') {
        throw new TypeError('Encoder has to be a function.');
    }

    var charset = opts.charset || defaults.charset;
    if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {
        throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');
    }

    var format = formats['default'];
    if (typeof opts.format !== 'undefined') {
        if (!has.call(formats.formatters, opts.format)) {
            throw new TypeError('Unknown format option provided.');
        }
        format = opts.format;
    }
    var formatter = formats.formatters[format];

    var filter = defaults.filter;
    if (typeof opts.filter === 'function' || isArray(opts.filter)) {
        filter = opts.filter;
    }

    return {
        addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix,
        allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots,
        charset: charset,
        charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,
        delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter,
        encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode,
        encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder,
        encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly,
        filter: filter,
        format: format,
        formatter: formatter,
        serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate,
        skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls,
        sort: typeof opts.sort === 'function' ? opts.sort : null,
        strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling
    };
};

module.exports = function (object, opts) {
    var obj = object;
    var options = normalizeStringifyOptions(opts);

    var objKeys;
    var filter;

    if (typeof options.filter === 'function') {
        filter = options.filter;
        obj = filter('', obj);
    } else if (isArray(options.filter)) {
        filter = options.filter;
        objKeys = filter;
    }

    var keys = [];

    if (typeof obj !== 'object' || obj === null) {
        return '';
    }

    var arrayFormat;
    if (opts && opts.arrayFormat in arrayPrefixGenerators) {
        arrayFormat = opts.arrayFormat;
    } else if (opts && 'indices' in opts) {
        arrayFormat = opts.indices ? 'indices' : 'repeat';
    } else {
        arrayFormat = 'indices';
    }

    var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];

    if (!objKeys) {
        objKeys = Object.keys(obj);
    }

    if (options.sort) {
        objKeys.sort(options.sort);
    }

    var sideChannel = getSideChannel();
    for (var i = 0; i < objKeys.length; ++i) {
        var key = objKeys[i];

        if (options.skipNulls && obj[key] === null) {
            continue;
        }
        pushToArray(keys, stringify(
            obj[key],
            key,
            generateArrayPrefix,
            options.strictNullHandling,
            options.skipNulls,
            options.encode ? options.encoder : null,
            options.filter,
            options.sort,
            options.allowDots,
            options.serializeDate,
            options.format,
            options.formatter,
            options.encodeValuesOnly,
            options.charset,
            sideChannel
        ));
    }

    var joined = keys.join(options.delimiter);
    var prefix = options.addQueryPrefix === true ? '?' : '';

    if (options.charsetSentinel) {
        if (options.charset === 'iso-8859-1') {
            // encodeURIComponent('&#10003;'), the "numeric entity" representation of a checkmark
            prefix += 'utf8=%26%2310003%3B&';
        } else {
            // encodeURIComponent('✓')
            prefix += 'utf8=%E2%9C%93&';
        }
    }

    return joined.length > 0 ? prefix + joined : '';
};

},{"./formats":1,"./utils":5,"side-channel":16}],5:[function(require,module,exports){
'use strict';

var formats = require('./formats');

var has = Object.prototype.hasOwnProperty;
var isArray = Array.isArray;

var hexTable = (function () {
    var array = [];
    for (var i = 0; i < 256; ++i) {
        array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());
    }

    return array;
}());

var compactQueue = function compactQueue(queue) {
    while (queue.length > 1) {
        var item = queue.pop();
        var obj = item.obj[item.prop];

        if (isArray(obj)) {
            var compacted = [];

            for (var j = 0; j < obj.length; ++j) {
                if (typeof obj[j] !== 'undefined') {
                    compacted.push(obj[j]);
                }
            }

            item.obj[item.prop] = compacted;
        }
    }
};

var arrayToObject = function arrayToObject(source, options) {
    var obj = options && options.plainObjects ? Object.create(null) : {};
    for (var i = 0; i < source.length; ++i) {
        if (typeof source[i] !== 'undefined') {
            obj[i] = source[i];
        }
    }

    return obj;
};

var merge = function merge(target, source, options) {
    /* eslint no-param-reassign: 0 */
    if (!source) {
        return target;
    }

    if (typeof source !== 'object') {
        if (isArray(target)) {
            target.push(source);
        } else if (target && typeof target === 'object') {
            if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) {
                target[source] = true;
            }
        } else {
            return [target, source];
        }

        return target;
    }

    if (!target || typeof target !== 'object') {
        return [target].concat(source);
    }

    var mergeTarget = target;
    if (isArray(target) && !isArray(source)) {
        mergeTarget = arrayToObject(target, options);
    }

    if (isArray(target) && isArray(source)) {
        source.forEach(function (item, i) {
            if (has.call(target, i)) {
                var targetItem = target[i];
                if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') {
                    target[i] = merge(targetItem, item, options);
                } else {
                    target.push(item);
                }
            } else {
                target[i] = item;
            }
        });
        return target;
    }

    return Object.keys(source).reduce(function (acc, key) {
        var value = source[key];

        if (has.call(acc, key)) {
            acc[key] = merge(acc[key], value, options);
        } else {
            acc[key] = value;
        }
        return acc;
    }, mergeTarget);
};

var assign = function assignSingleSource(target, source) {
    return Object.keys(source).reduce(function (acc, key) {
        acc[key] = source[key];
        return acc;
    }, target);
};

var decode = function (str, decoder, charset) {
    var strWithoutPlus = str.replace(/\+/g, ' ');
    if (charset === 'iso-8859-1') {
        // unescape never throws, no try...catch needed:
        return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape);
    }
    // utf-8
    try {
        return decodeURIComponent(strWithoutPlus);
    } catch (e) {
        return strWithoutPlus;
    }
};

var encode = function encode(str, defaultEncoder, charset, kind, format) {
    // This code was originally written by Brian White (mscdex) for the io.js core querystring library.
    // It has been adapted here for stricter adherence to RFC 3986
    if (str.length === 0) {
        return str;
    }

    var string = str;
    if (typeof str === 'symbol') {
        string = Symbol.prototype.toString.call(str);
    } else if (typeof str !== 'string') {
        string = String(str);
    }

    if (charset === 'iso-8859-1') {
        return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) {
            return '%26%23' + parseInt($0.slice(2), 16) + '%3B';
        });
    }

    var out = '';
    for (var i = 0; i < string.length; ++i) {
        var c = string.charCodeAt(i);

        if (
            c === 0x2D // -
            || c === 0x2E // .
            || c === 0x5F // _
            || c === 0x7E // ~
            || (c >= 0x30 && c <= 0x39) // 0-9
            || (c >= 0x41 && c <= 0x5A) // a-z
            || (c >= 0x61 && c <= 0x7A) // A-Z
            || (format === formats.RFC1738 && (c === 0x28 || c === 0x29)) // ( )
        ) {
            out += string.charAt(i);
            continue;
        }

        if (c < 0x80) {
            out = out + hexTable[c];
            continue;
        }

        if (c < 0x800) {
            out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);
            continue;
        }

        if (c < 0xD800 || c >= 0xE000) {
            out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);
            continue;
        }

        i += 1;
        c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));
        /* eslint operator-linebreak: [2, "before"] */
        out += hexTable[0xF0 | (c >> 18)]
            + hexTable[0x80 | ((c >> 12) & 0x3F)]
            + hexTable[0x80 | ((c >> 6) & 0x3F)]
            + hexTable[0x80 | (c & 0x3F)];
    }

    return out;
};

var compact = function compact(value) {
    var queue = [{ obj: { o: value }, prop: 'o' }];
    var refs = [];

    for (var i = 0; i < queue.length; ++i) {
        var item = queue[i];
        var obj = item.obj[item.prop];

        var keys = Object.keys(obj);
        for (var j = 0; j < keys.length; ++j) {
            var key = keys[j];
            var val = obj[key];
            if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {
                queue.push({ obj: obj, prop: key });
                refs.push(val);
            }
        }
    }

    compactQueue(queue);

    return value;
};

var isRegExp = function isRegExp(obj) {
    return Object.prototype.toString.call(obj) === '[object RegExp]';
};

var isBuffer = function isBuffer(obj) {
    if (!obj || typeof obj !== 'object') {
        return false;
    }

    return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));
};

var combine = function combine(a, b) {
    return [].concat(a, b);
};

var maybeMap = function maybeMap(val, fn) {
    if (isArray(val)) {
        var mapped = [];
        for (var i = 0; i < val.length; i += 1) {
            mapped.push(fn(val[i]));
        }
        return mapped;
    }
    return fn(val);
};

module.exports = {
    arrayToObject: arrayToObject,
    assign: assign,
    combine: combine,
    compact: compact,
    decode: decode,
    encode: encode,
    isBuffer: isBuffer,
    isRegExp: isRegExp,
    maybeMap: maybeMap,
    merge: merge
};

},{"./formats":1}],6:[function(require,module,exports){

},{}],7:[function(require,module,exports){
'use strict';

var GetIntrinsic = require('get-intrinsic');

var callBind = require('./');

var $indexOf = callBind(GetIntrinsic('String.prototype.indexOf'));

module.exports = function callBoundIntrinsic(name, allowMissing) {
	var intrinsic = GetIntrinsic(name, !!allowMissing);
	if (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) {
		return callBind(intrinsic);
	}
	return intrinsic;
};

},{"./":8,"get-intrinsic":11}],8:[function(require,module,exports){
'use strict';

var bind = require('function-bind');
var GetIntrinsic = require('get-intrinsic');

var $apply = GetIntrinsic('%Function.prototype.apply%');
var $call = GetIntrinsic('%Function.prototype.call%');
var $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply);

var $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%', true);
var $defineProperty = GetIntrinsic('%Object.defineProperty%', true);
var $max = GetIntrinsic('%Math.max%');

if ($defineProperty) {
	try {
		$defineProperty({}, 'a', { value: 1 });
	} catch (e) {
		// IE 8 has a broken defineProperty
		$defineProperty = null;
	}
}

module.exports = function callBind(originalFunction) {
	var func = $reflectApply(bind, $call, arguments);
	if ($gOPD && $defineProperty) {
		var desc = $gOPD(func, 'length');
		if (desc.configurable) {
			// original length, plus the receiver, minus any additional arguments (after the receiver)
			$defineProperty(
				func,
				'length',
				{ value: 1 + $max(0, originalFunction.length - (arguments.length - 1)) }
			);
		}
	}
	return func;
};

var applyBind = function applyBind() {
	return $reflectApply(bind, $apply, arguments);
};

if ($defineProperty) {
	$defineProperty(module.exports, 'apply', { value: applyBind });
} else {
	module.exports.apply = applyBind;
}

},{"function-bind":10,"get-intrinsic":11}],9:[function(require,module,exports){
'use strict';

/* eslint no-invalid-this: 1 */

var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
var slice = Array.prototype.slice;
var toStr = Object.prototype.toString;
var funcType = '[object Function]';

module.exports = function bind(that) {
    var target = this;
    if (typeof target !== 'function' || toStr.call(target) !== funcType) {
        throw new TypeError(ERROR_MESSAGE + target);
    }
    var args = slice.call(arguments, 1);

    var bound;
    var binder = function () {
        if (this instanceof bound) {
            var result = target.apply(
                this,
                args.concat(slice.call(arguments))
            );
            if (Object(result) === result) {
                return result;
            }
            return this;
        } else {
            return target.apply(
                that,
                args.concat(slice.call(arguments))
            );
        }
    };

    var boundLength = Math.max(0, target.length - args.length);
    var boundArgs = [];
    for (var i = 0; i < boundLength; i++) {
        boundArgs.push('$' + i);
    }

    bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);

    if (target.prototype) {
        var Empty = function Empty() {};
        Empty.prototype = target.prototype;
        bound.prototype = new Empty();
        Empty.prototype = null;
    }

    return bound;
};

},{}],10:[function(require,module,exports){
'use strict';

var implementation = require('./implementation');

module.exports = Function.prototype.bind || implementation;

},{"./implementation":9}],11:[function(require,module,exports){
'use strict';

var undefined;

var $SyntaxError = SyntaxError;
var $Function = Function;
var $TypeError = TypeError;

// eslint-disable-next-line consistent-return
var getEvalledConstructor = function (expressionSyntax) {
	try {
		return $Function('"use strict"; return (' + expressionSyntax + ').constructor;')();
	} catch (e) {}
};

var $gOPD = Object.getOwnPropertyDescriptor;
if ($gOPD) {
	try {
		$gOPD({}, '');
	} catch (e) {
		$gOPD = null; // this is IE 8, which has a broken gOPD
	}
}

var throwTypeError = function () {
	throw new $TypeError();
};
var ThrowTypeError = $gOPD
	? (function () {
		try {
			// eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties
			arguments.callee; // IE 8 does not throw here
			return throwTypeError;
		} catch (calleeThrows) {
			try {
				// IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '')
				return $gOPD(arguments, 'callee').get;
			} catch (gOPDthrows) {
				return throwTypeError;
			}
		}
	}())
	: throwTypeError;

var hasSymbols = require('has-symbols')();

var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto

var needsEval = {};

var TypedArray = typeof Uint8Array === 'undefined' ? undefined : getProto(Uint8Array);

var INTRINSICS = {
	'%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError,
	'%Array%': Array,
	'%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,
	'%ArrayIteratorPrototype%': hasSymbols ? getProto([][Symbol.iterator]()) : undefined,
	'%AsyncFromSyncIteratorPrototype%': undefined,
	'%AsyncFunction%': needsEval,
	'%AsyncGenerator%': needsEval,
	'%AsyncGeneratorFunction%': needsEval,
	'%AsyncIteratorPrototype%': needsEval,
	'%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,
	'%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt,
	'%Boolean%': Boolean,
	'%DataView%': typeof DataView === 'undefined' ? undefined : DataView,
	'%Date%': Date,
	'%decodeURI%': decodeURI,
	'%decodeURIComponent%': decodeURIComponent,
	'%encodeURI%': encodeURI,
	'%encodeURIComponent%': encodeURIComponent,
	'%Error%': Error,
	'%eval%': eval, // eslint-disable-line no-eval
	'%EvalError%': EvalError,
	'%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,
	'%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,
	'%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry,
	'%Function%': $Function,
	'%GeneratorFunction%': needsEval,
	'%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,
	'%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,
	'%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,
	'%isFinite%': isFinite,
	'%isNaN%': isNaN,
	'%IteratorPrototype%': hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined,
	'%JSON%': typeof JSON === 'object' ? JSON : undefined,
	'%Map%': typeof Map === 'undefined' ? undefined : Map,
	'%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols ? undefined : getProto(new Map()[Symbol.iterator]()),
	'%Math%': Math,
	'%Number%': Number,
	'%Object%': Object,
	'%parseFloat%': parseFloat,
	'%parseInt%': parseInt,
	'%Promise%': typeof Promise === 'undefined' ? undefined : Promise,
	'%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,
	'%RangeError%': RangeError,
	'%ReferenceError%': ReferenceError,
	'%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,
	'%RegExp%': RegExp,
	'%Set%': typeof Set === 'undefined' ? undefined : Set,
	'%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols ? undefined : getProto(new Set()[Symbol.iterator]()),
	'%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,
	'%String%': String,
	'%StringIteratorPrototype%': hasSymbols ? getProto(''[Symbol.iterator]()) : undefined,
	'%Symbol%': hasSymbols ? Symbol : undefined,
	'%SyntaxError%': $SyntaxError,
	'%ThrowTypeError%': ThrowTypeError,
	'%TypedArray%': TypedArray,
	'%TypeError%': $TypeError,
	'%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,
	'%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,
	'%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,
	'%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,
	'%URIError%': URIError,
	'%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,
	'%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef,
	'%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet
};

var doEval = function doEval(name) {
	var value;
	if (name === '%AsyncFunction%') {
		value = getEvalledConstructor('async function () {}');
	} else if (name === '%GeneratorFunction%') {
		value = getEvalledConstructor('function* () {}');
	} else if (name === '%AsyncGeneratorFunction%') {
		value = getEvalledConstructor('async function* () {}');
	} else if (name === '%AsyncGenerator%') {
		var fn = doEval('%AsyncGeneratorFunction%');
		if (fn) {
			value = fn.prototype;
		}
	} else if (name === '%AsyncIteratorPrototype%') {
		var gen = doEval('%AsyncGenerator%');
		if (gen) {
			value = getProto(gen.prototype);
		}
	}

	INTRINSICS[name] = value;

	return value;
};

var LEGACY_ALIASES = {
	'%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'],
	'%ArrayPrototype%': ['Array', 'prototype'],
	'%ArrayProto_entries%': ['Array', 'prototype', 'entries'],
	'%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'],
	'%ArrayProto_keys%': ['Array', 'prototype', 'keys'],
	'%ArrayProto_values%': ['Array', 'prototype', 'values'],
	'%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'],
	'%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'],
	'%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'],
	'%BooleanPrototype%': ['Boolean', 'prototype'],
	'%DataViewPrototype%': ['DataView', 'prototype'],
	'%DatePrototype%': ['Date', 'prototype'],
	'%ErrorPrototype%': ['Error', 'prototype'],
	'%EvalErrorPrototype%': ['EvalError', 'prototype'],
	'%Float32ArrayPrototype%': ['Float32Array', 'prototype'],
	'%Float64ArrayPrototype%': ['Float64Array', 'prototype'],
	'%FunctionPrototype%': ['Function', 'prototype'],
	'%Generator%': ['GeneratorFunction', 'prototype'],
	'%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'],
	'%Int8ArrayPrototype%': ['Int8Array', 'prototype'],
	'%Int16ArrayPrototype%': ['Int16Array', 'prototype'],
	'%Int32ArrayPrototype%': ['Int32Array', 'prototype'],
	'%JSONParse%': ['JSON', 'parse'],
	'%JSONStringify%': ['JSON', 'stringify'],
	'%MapPrototype%': ['Map', 'prototype'],
	'%NumberPrototype%': ['Number', 'prototype'],
	'%ObjectPrototype%': ['Object', 'prototype'],
	'%ObjProto_toString%': ['Object', 'prototype', 'toString'],
	'%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'],
	'%PromisePrototype%': ['Promise', 'prototype'],
	'%PromiseProto_then%': ['Promise', 'prototype', 'then'],
	'%Promise_all%': ['Promise', 'all'],
	'%Promise_reject%': ['Promise', 'reject'],
	'%Promise_resolve%': ['Promise', 'resolve'],
	'%RangeErrorPrototype%': ['RangeError', 'prototype'],
	'%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'],
	'%RegExpPrototype%': ['RegExp', 'prototype'],
	'%SetPrototype%': ['Set', 'prototype'],
	'%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'],
	'%StringPrototype%': ['String', 'prototype'],
	'%SymbolPrototype%': ['Symbol', 'prototype'],
	'%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'],
	'%TypedArrayPrototype%': ['TypedArray', 'prototype'],
	'%TypeErrorPrototype%': ['TypeError', 'prototype'],
	'%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'],
	'%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'],
	'%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'],
	'%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'],
	'%URIErrorPrototype%': ['URIError', 'prototype'],
	'%WeakMapPrototype%': ['WeakMap', 'prototype'],
	'%WeakSetPrototype%': ['WeakSet', 'prototype']
};

var bind = require('function-bind');
var hasOwn = require('has');
var $concat = bind.call(Function.call, Array.prototype.concat);
var $spliceApply = bind.call(Function.apply, Array.prototype.splice);
var $replace = bind.call(Function.call, String.prototype.replace);
var $strSlice = bind.call(Function.call, String.prototype.slice);

/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */
var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g;
var reEscapeChar = /\\(\\)?/g; /** Used to match backslashes in property paths. */
var stringToPath = function stringToPath(string) {
	var first = $strSlice(string, 0, 1);
	var last = $strSlice(string, -1);
	if (first === '%' && last !== '%') {
		throw new $SyntaxError('invalid intrinsic syntax, expected closing `%`');
	} else if (last === '%' && first !== '%') {
		throw new $SyntaxError('invalid intrinsic syntax, expected opening `%`');
	}
	var result = [];
	$replace(string, rePropName, function (match, number, quote, subString) {
		result[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match;
	});
	return result;
};
/* end adaptation */

var getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {
	var intrinsicName = name;
	var alias;
	if (hasOwn(LEGACY_ALIASES, intrinsicName)) {
		alias = LEGACY_ALIASES[intrinsicName];
		intrinsicName = '%' + alias[0] + '%';
	}

	if (hasOwn(INTRINSICS, intrinsicName)) {
		var value = INTRINSICS[intrinsicName];
		if (value === needsEval) {
			value = doEval(intrinsicName);
		}
		if (typeof value === 'undefined' && !allowMissing) {
			throw new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');
		}

		return {
			alias: alias,
			name: intrinsicName,
			value: value
		};
	}

	throw new $SyntaxError('intrinsic ' + name + ' does not exist!');
};

module.exports = function GetIntrinsic(name, allowMissing) {
	if (typeof name !== 'string' || name.length === 0) {
		throw new $TypeError('intrinsic name must be a non-empty string');
	}
	if (arguments.length > 1 && typeof allowMissing !== 'boolean') {
		throw new $TypeError('"allowMissing" argument must be a boolean');
	}

	var parts = stringToPath(name);
	var intrinsicBaseName = parts.length > 0 ? parts[0] : '';

	var intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing);
	var intrinsicRealName = intrinsic.name;
	var value = intrinsic.value;
	var skipFurtherCaching = false;

	var alias = intrinsic.alias;
	if (alias) {
		intrinsicBaseName = alias[0];
		$spliceApply(parts, $concat([0, 1], alias));
	}

	for (var i = 1, isOwn = true; i < parts.length; i += 1) {
		var part = parts[i];
		var first = $strSlice(part, 0, 1);
		var last = $strSlice(part, -1);
		if (
			(
				(first === '"' || first === "'" || first === '`')
				|| (last === '"' || last === "'" || last === '`')
			)
			&& first !== last
		) {
			throw new $SyntaxError('property names with quotes must have matching quotes');
		}
		if (part === 'constructor' || !isOwn) {
			skipFurtherCaching = true;
		}

		intrinsicBaseName += '.' + part;
		intrinsicRealName = '%' + intrinsicBaseName + '%';

		if (hasOwn(INTRINSICS, intrinsicRealName)) {
			value = INTRINSICS[intrinsicRealName];
		} else if (value != null) {
			if (!(part in value)) {
				if (!allowMissing) {
					throw new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.');
				}
				return void undefined;
			}
			if ($gOPD && (i + 1) >= parts.length) {
				var desc = $gOPD(value, part);
				isOwn = !!desc;

				// By convention, when a data property is converted to an accessor
				// property to emulate a data property that does not suffer from
				// the override mistake, that accessor's getter is marked with
				// an `originalValue` property. Here, when we detect this, we
				// uphold the illusion by pretending to see that original data
				// property, i.e., returning the value rather than the getter
				// itself.
				if (isOwn && 'get' in desc && !('originalValue' in desc.get)) {
					value = desc.get;
				} else {
					value = value[part];
				}
			} else {
				isOwn = hasOwn(value, part);
				value = value[part];
			}

			if (isOwn && !skipFurtherCaching) {
				INTRINSICS[intrinsicRealName] = value;
			}
		}
	}
	return value;
};

},{"function-bind":10,"has":14,"has-symbols":12}],12:[function(require,module,exports){
'use strict';

var origSymbol = typeof Symbol !== 'undefined' && Symbol;
var hasSymbolSham = require('./shams');

module.exports = function hasNativeSymbols() {
	if (typeof origSymbol !== 'function') { return false; }
	if (typeof Symbol !== 'function') { return false; }
	if (typeof origSymbol('foo') !== 'symbol') { return false; }
	if (typeof Symbol('bar') !== 'symbol') { return false; }

	return hasSymbolSham();
};

},{"./shams":13}],13:[function(require,module,exports){
'use strict';

/* eslint complexity: [2, 18], max-statements: [2, 33] */
module.exports = function hasSymbols() {
	if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
	if (typeof Symbol.iterator === 'symbol') { return true; }

	var obj = {};
	var sym = Symbol('test');
	var symObj = Object(sym);
	if (typeof sym === 'string') { return false; }

	if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }
	if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }

	// temp disabled per https://github.com/ljharb/object.assign/issues/17
	// if (sym instanceof Symbol) { return false; }
	// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
	// if (!(symObj instanceof Symbol)) { return false; }

	// if (typeof Symbol.prototype.toString !== 'function') { return false; }
	// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }

	var symVal = 42;
	obj[sym] = symVal;
	for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop
	if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }

	if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }

	var syms = Object.getOwnPropertySymbols(obj);
	if (syms.length !== 1 || syms[0] !== sym) { return false; }

	if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }

	if (typeof Object.getOwnPropertyDescriptor === 'function') {
		var descriptor = Object.getOwnPropertyDescriptor(obj, sym);
		if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
	}

	return true;
};

},{}],14:[function(require,module,exports){
'use strict';

var bind = require('function-bind');

module.exports = bind.call(Function.call, Object.prototype.hasOwnProperty);

},{"function-bind":10}],15:[function(require,module,exports){
var hasMap = typeof Map === 'function' && Map.prototype;
var mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, 'size') : null;
var mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === 'function' ? mapSizeDescriptor.get : null;
var mapForEach = hasMap && Map.prototype.forEach;
var hasSet = typeof Set === 'function' && Set.prototype;
var setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, 'size') : null;
var setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === 'function' ? setSizeDescriptor.get : null;
var setForEach = hasSet && Set.prototype.forEach;
var hasWeakMap = typeof WeakMap === 'function' && WeakMap.prototype;
var weakMapHas = hasWeakMap ? WeakMap.prototype.has : null;
var hasWeakSet = typeof WeakSet === 'function' && WeakSet.prototype;
var weakSetHas = hasWeakSet ? WeakSet.prototype.has : null;
var hasWeakRef = typeof WeakRef === 'function' && WeakRef.prototype;
var weakRefDeref = hasWeakRef ? WeakRef.prototype.deref : null;
var booleanValueOf = Boolean.prototype.valueOf;
var objectToString = Object.prototype.toString;
var functionToString = Function.prototype.toString;
var $match = String.prototype.match;
var $slice = String.prototype.slice;
var $replace = String.prototype.replace;
var $toUpperCase = String.prototype.toUpperCase;
var $toLowerCase = String.prototype.toLowerCase;
var $test = RegExp.prototype.test;
var $concat = Array.prototype.concat;
var $join = Array.prototype.join;
var $arrSlice = Array.prototype.slice;
var $floor = Math.floor;
var bigIntValueOf = typeof BigInt === 'function' ? BigInt.prototype.valueOf : null;
var gOPS = Object.getOwnPropertySymbols;
var symToString = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? Symbol.prototype.toString : null;
var hasShammedSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'object';
// ie, `has-tostringtag/shams
var toStringTag = typeof Symbol === 'function' && Symbol.toStringTag && (typeof Symbol.toStringTag === hasShammedSymbols ? 'object' : 'symbol')
    ? Symbol.toStringTag
    : null;
var isEnumerable = Object.prototype.propertyIsEnumerable;

var gPO = (typeof Reflect === 'function' ? Reflect.getPrototypeOf : Object.getPrototypeOf) || (
    [].__proto__ === Array.prototype // eslint-disable-line no-proto
        ? function (O) {
            return O.__proto__; // eslint-disable-line no-proto
        }
        : null
);

function addNumericSeparator(num, str) {
    if (
        num === Infinity
        || num === -Infinity
        || num !== num
        || (num && num > -1000 && num < 1000)
        || $test.call(/e/, str)
    ) {
        return str;
    }
    var sepRegex = /[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;
    if (typeof num === 'number') {
        var int = num < 0 ? -$floor(-num) : $floor(num); // trunc(num)
        if (int !== num) {
            var intStr = String(int);
            var dec = $slice.call(str, intStr.length + 1);
            return $replace.call(intStr, sepRegex, '$&_') + '.' + $replace.call($replace.call(dec, /([0-9]{3})/g, '$&_'), /_$/, '');
        }
    }
    return $replace.call(str, sepRegex, '$&_');
}

var inspectCustom = require('./util.inspect').custom;
var inspectSymbol = inspectCustom && isSymbol(inspectCustom) ? inspectCustom : null;

module.exports = function inspect_(obj, options, depth, seen) {
    var opts = options || {};

    if (has(opts, 'quoteStyle') && (opts.quoteStyle !== 'single' && opts.quoteStyle !== 'double')) {
        throw new TypeError('option "quoteStyle" must be "single" or "double"');
    }
    if (
        has(opts, 'maxStringLength') && (typeof opts.maxStringLength === 'number'
            ? opts.maxStringLength < 0 && opts.maxStringLength !== Infinity
            : opts.maxStringLength !== null
        )
    ) {
        throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');
    }
    var customInspect = has(opts, 'customInspect') ? opts.customInspect : true;
    if (typeof customInspect !== 'boolean' && customInspect !== 'symbol') {
        throw new TypeError('option "customInspect", if provided, must be `true`, `false`, or `\'symbol\'`');
    }

    if (
        has(opts, 'indent')
        && opts.indent !== null
        && opts.indent !== '\t'
        && !(parseInt(opts.indent, 10) === opts.indent && opts.indent > 0)
    ) {
        throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');
    }
    if (has(opts, 'numericSeparator') && typeof opts.numericSeparator !== 'boolean') {
        throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');
    }
    var numericSeparator = opts.numericSeparator;

    if (typeof obj === 'undefined') {
        return 'undefined';
    }
    if (obj === null) {
        return 'null';
    }
    if (typeof obj === 'boolean') {
        return obj ? 'true' : 'false';
    }

    if (typeof obj === 'string') {
        return inspectString(obj, opts);
    }
    if (typeof obj === 'number') {
        if (obj === 0) {
            return Infinity / obj > 0 ? '0' : '-0';
        }
        var str = String(obj);
        return numericSeparator ? addNumericSeparator(obj, str) : str;
    }
    if (typeof obj === 'bigint') {
        var bigIntStr = String(obj) + 'n';
        return numericSeparator ? addNumericSeparator(obj, bigIntStr) : bigIntStr;
    }

    var maxDepth = typeof opts.depth === 'undefined' ? 5 : opts.depth;
    if (typeof depth === 'undefined') { depth = 0; }
    if (depth >= maxDepth && maxDepth > 0 && typeof obj === 'object') {
        return isArray(obj) ? '[Array]' : '[Object]';
    }

    var indent = getIndent(opts, depth);

    if (typeof seen === 'undefined') {
        seen = [];
    } else if (indexOf(seen, obj) >= 0) {
        return '[Circular]';
    }

    function inspect(value, from, noIndent) {
        if (from) {
            seen = $arrSlice.call(seen);
            seen.push(from);
        }
        if (noIndent) {
            var newOpts = {
                depth: opts.depth
            };
            if (has(opts, 'quoteStyle')) {
                newOpts.quoteStyle = opts.quoteStyle;
            }
            return inspect_(value, newOpts, depth + 1, seen);
        }
        return inspect_(value, opts, depth + 1, seen);
    }

    if (typeof obj === 'function') {
        var name = nameOf(obj);
        var keys = arrObjKeys(obj, inspect);
        return '[Function' + (name ? ': ' + name : ' (anonymous)') + ']' + (keys.length > 0 ? ' { ' + $join.call(keys, ', ') + ' }' : '');
    }
    if (isSymbol(obj)) {
        var symString = hasShammedSymbols ? $replace.call(String(obj), /^(Symbol\(.*\))_[^)]*$/, '$1') : symToString.call(obj);
        return typeof obj === 'object' && !hasShammedSymbols ? markBoxed(symString) : symString;
    }
    if (isElement(obj)) {
        var s = '<' + $toLowerCase.call(String(obj.nodeName));
        var attrs = obj.attributes || [];
        for (var i = 0; i < attrs.length; i++) {
            s += ' ' + attrs[i].name + '=' + wrapQuotes(quote(attrs[i].value), 'double', opts);
        }
        s += '>';
        if (obj.childNodes && obj.childNodes.length) { s += '...'; }
        s += '</' + $toLowerCase.call(String(obj.nodeName)) + '>';
        return s;
    }
    if (isArray(obj)) {
        if (obj.length === 0) { return '[]'; }
        var xs = arrObjKeys(obj, inspect);
        if (indent && !singleLineValues(xs)) {
            return '[' + indentedJoin(xs, indent) + ']';
        }
        return '[ ' + $join.call(xs, ', ') + ' ]';
    }
    if (isError(obj)) {
        var parts = arrObjKeys(obj, inspect);
        if ('cause' in obj && !isEnumerable.call(obj, 'cause')) {
            return '{ [' + String(obj) + '] ' + $join.call($concat.call('[cause]: ' + inspect(obj.cause), parts), ', ') + ' }';
        }
        if (parts.length === 0) { return '[' + String(obj) + ']'; }
        return '{ [' + String(obj) + '] ' + $join.call(parts, ', ') + ' }';
    }
    if (typeof obj === 'object' && customInspect) {
        if (inspectSymbol && typeof obj[inspectSymbol] === 'function') {
            return obj[inspectSymbol]();
        } else if (customInspect !== 'symbol' && typeof obj.inspect === 'function') {
            return obj.inspect();
        }
    }
    if (isMap(obj)) {
        var mapParts = [];
        mapForEach.call(obj, function (value, key) {
            mapParts.push(inspect(key, obj, true) + ' => ' + inspect(value, obj));
        });
        return collectionOf('Map', mapSize.call(obj), mapParts, indent);
    }
    if (isSet(obj)) {
        var setParts = [];
        setForEach.call(obj, function (value) {
            setParts.push(inspect(value, obj));
        });
        return collectionOf('Set', setSize.call(obj), setParts, indent);
    }
    if (isWeakMap(obj)) {
        return weakCollectionOf('WeakMap');
    }
    if (isWeakSet(obj)) {
        return weakCollectionOf('WeakSet');
    }
    if (isWeakRef(obj)) {
        return weakCollectionOf('WeakRef');
    }
    if (isNumber(obj)) {
        return markBoxed(inspect(Number(obj)));
    }
    if (isBigInt(obj)) {
        return markBoxed(inspect(bigIntValueOf.call(obj)));
    }
    if (isBoolean(obj)) {
        return markBoxed(booleanValueOf.call(obj));
    }
    if (isString(obj)) {
        return markBoxed(inspect(String(obj)));
    }
    if (!isDate(obj) && !isRegExp(obj)) {
        var ys = arrObjKeys(obj, inspect);
        var isPlainObject = gPO ? gPO(obj) === Object.prototype : obj instanceof Object || obj.constructor === Object;
        var protoTag = obj instanceof Object ? '' : 'null prototype';
        var stringTag = !isPlainObject && toStringTag && Object(obj) === obj && toStringTag in obj ? $slice.call(toStr(obj), 8, -1) : protoTag ? 'Object' : '';
        var constructorTag = isPlainObject || typeof obj.constructor !== 'function' ? '' : obj.constructor.name ? obj.constructor.name + ' ' : '';
        var tag = constructorTag + (stringTag || protoTag ? '[' + $join.call($concat.call([], stringTag || [], protoTag || []), ': ') + '] ' : '');
        if (ys.length === 0) { return tag + '{}'; }
        if (indent) {
            return tag + '{' + indentedJoin(ys, indent) + '}';
        }
        return tag + '{ ' + $join.call(ys, ', ') + ' }';
    }
    return String(obj);
};

function wrapQuotes(s, defaultStyle, opts) {
    var quoteChar = (opts.quoteStyle || defaultStyle) === 'double' ? '"' : "'";
    return quoteChar + s + quoteChar;
}

function quote(s) {
    return $replace.call(String(s), /"/g, '&quot;');
}

function isArray(obj) { return toStr(obj) === '[object Array]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isDate(obj) { return toStr(obj) === '[object Date]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isRegExp(obj) { return toStr(obj) === '[object RegExp]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isError(obj) { return toStr(obj) === '[object Error]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isString(obj) { return toStr(obj) === '[object String]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isNumber(obj) { return toStr(obj) === '[object Number]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isBoolean(obj) { return toStr(obj) === '[object Boolean]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }

// Symbol and BigInt do have Symbol.toStringTag by spec, so that can't be used to eliminate false positives
function isSymbol(obj) {
    if (hasShammedSymbols) {
        return obj && typeof obj === 'object' && obj instanceof Symbol;
    }
    if (typeof obj === 'symbol') {
        return true;
    }
    if (!obj || typeof obj !== 'object' || !symToString) {
        return false;
    }
    try {
        symToString.call(obj);
        return true;
    } catch (e) {}
    return false;
}

function isBigInt(obj) {
    if (!obj || typeof obj !== 'object' || !bigIntValueOf) {
        return false;
    }
    try {
        bigIntValueOf.call(obj);
        return true;
    } catch (e) {}
    return false;
}

var hasOwn = Object.prototype.hasOwnProperty || function (key) { return key in this; };
function has(obj, key) {
    return hasOwn.call(obj, key);
}

function toStr(obj) {
    return objectToString.call(obj);
}

function nameOf(f) {
    if (f.name) { return f.name; }
    var m = $match.call(functionToString.call(f), /^function\s*([\w$]+)/);
    if (m) { return m[1]; }
    return null;
}

function indexOf(xs, x) {
    if (xs.indexOf) { return xs.indexOf(x); }
    for (var i = 0, l = xs.length; i < l; i++) {
        if (xs[i] === x) { return i; }
    }
    return -1;
}

function isMap(x) {
    if (!mapSize || !x || typeof x !== 'object') {
        return false;
    }
    try {
        mapSize.call(x);
        try {
            setSize.call(x);
        } catch (s) {
            return true;
        }
        return x instanceof Map; // core-js workaround, pre-v2.5.0
    } catch (e) {}
    return false;
}

function isWeakMap(x) {
    if (!weakMapHas || !x || typeof x !== 'object') {
        return false;
    }
    try {
        weakMapHas.call(x, weakMapHas);
        try {
            weakSetHas.call(x, weakSetHas);
        } catch (s) {
            return true;
        }
        return x instanceof WeakMap; // core-js workaround, pre-v2.5.0
    } catch (e) {}
    return false;
}

function isWeakRef(x) {
    if (!weakRefDeref || !x || typeof x !== 'object') {
        return false;
    }
    try {
        weakRefDeref.call(x);
        return true;
    } catch (e) {}
    return false;
}

function isSet(x) {
    if (!setSize || !x || typeof x !== 'object') {
        return false;
    }
    try {
        setSize.call(x);
        try {
            mapSize.call(x);
        } catch (m) {
            return true;
        }
        return x instanceof Set; // core-js workaround, pre-v2.5.0
    } catch (e) {}
    return false;
}

function isWeakSet(x) {
    if (!weakSetHas || !x || typeof x !== 'object') {
        return false;
    }
    try {
        weakSetHas.call(x, weakSetHas);
        try {
            weakMapHas.call(x, weakMapHas);
        } catch (s) {
            return true;
        }
        return x instanceof WeakSet; // core-js workaround, pre-v2.5.0
    } catch (e) {}
    return false;
}

function isElement(x) {
    if (!x || typeof x !== 'object') { return false; }
    if (typeof HTMLElement !== 'undefined' && x instanceof HTMLElement) {
        return true;
    }
    return typeof x.nodeName === 'string' && typeof x.getAttribute === 'function';
}

function inspectString(str, opts) {
    if (str.length > opts.maxStringLength) {
        var remaining = str.length - opts.maxStringLength;
        var trailer = '... ' + remaining + ' more character' + (remaining > 1 ? 's' : '');
        return inspectString($slice.call(str, 0, opts.maxStringLength), opts) + trailer;
    }
    // eslint-disable-next-line no-control-regex
    var s = $replace.call($replace.call(str, /(['\\])/g, '\\$1'), /[\x00-\x1f]/g, lowbyte);
    return wrapQuotes(s, 'single', opts);
}

function lowbyte(c) {
    var n = c.charCodeAt(0);
    var x = {
        8: 'b',
        9: 't',
        10: 'n',
        12: 'f',
        13: 'r'
    }[n];
    if (x) { return '\\' + x; }
    return '\\x' + (n < 0x10 ? '0' : '') + $toUpperCase.call(n.toString(16));
}

function markBoxed(str) {
    return 'Object(' + str + ')';
}

function weakCollectionOf(type) {
    return type + ' { ? }';
}

function collectionOf(type, size, entries, indent) {
    var joinedEntries = indent ? indentedJoin(entries, indent) : $join.call(entries, ', ');
    return type + ' (' + size + ') {' + joinedEntries + '}';
}

function singleLineValues(xs) {
    for (var i = 0; i < xs.length; i++) {
        if (indexOf(xs[i], '\n') >= 0) {
            return false;
        }
    }
    return true;
}

function getIndent(opts, depth) {
    var baseIndent;
    if (opts.indent === '\t') {
        baseIndent = '\t';
    } else if (typeof opts.indent === 'number' && opts.indent > 0) {
        baseIndent = $join.call(Array(opts.indent + 1), ' ');
    } else {
        return null;
    }
    return {
        base: baseIndent,
        prev: $join.call(Array(depth + 1), baseIndent)
    };
}

function indentedJoin(xs, indent) {
    if (xs.length === 0) { return ''; }
    var lineJoiner = '\n' + indent.prev + indent.base;
    return lineJoiner + $join.call(xs, ',' + lineJoiner) + '\n' + indent.prev;
}

function arrObjKeys(obj, inspect) {
    var isArr = isArray(obj);
    var xs = [];
    if (isArr) {
        xs.length = obj.length;
        for (var i = 0; i < obj.length; i++) {
            xs[i] = has(obj, i) ? inspect(obj[i], obj) : '';
        }
    }
    var syms = typeof gOPS === 'function' ? gOPS(obj) : [];
    var symMap;
    if (hasShammedSymbols) {
        symMap = {};
        for (var k = 0; k < syms.length; k++) {
            symMap['$' + syms[k]] = syms[k];
        }
    }

    for (var key in obj) { // eslint-disable-line no-restricted-syntax
        if (!has(obj, key)) { continue; } // eslint-disable-line no-restricted-syntax, no-continue
        if (isArr && String(Number(key)) === key && key < obj.length) { continue; } // eslint-disable-line no-restricted-syntax, no-continue
        if (hasShammedSymbols && symMap['$' + key] instanceof Symbol) {
            // this is to prevent shammed Symbols, which are stored as strings, from being included in the string key section
            continue; // eslint-disable-line no-restricted-syntax, no-continue
        } else if ($test.call(/[^\w$]/, key)) {
            xs.push(inspect(key, obj) + ': ' + inspect(obj[key], obj));
        } else {
            xs.push(key + ': ' + inspect(obj[key], obj));
        }
    }
    if (typeof gOPS === 'function') {
        for (var j = 0; j < syms.length; j++) {
            if (isEnumerable.call(obj, syms[j])) {
                xs.push('[' + inspect(syms[j]) + ']: ' + inspect(obj[syms[j]], obj));
            }
        }
    }
    return xs;
}

},{"./util.inspect":6}],16:[function(require,module,exports){
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');
var inspect = require('object-inspect');

var $TypeError = GetIntrinsic('%TypeError%');
var $WeakMap = GetIntrinsic('%WeakMap%', true);
var $Map = GetIntrinsic('%Map%', true);

var $weakMapGet = callBound('WeakMap.prototype.get', true);
var $weakMapSet = callBound('WeakMap.prototype.set', true);
var $weakMapHas = callBound('WeakMap.prototype.has', true);
var $mapGet = callBound('Map.prototype.get', true);
var $mapSet = callBound('Map.prototype.set', true);
var $mapHas = callBound('Map.prototype.has', true);

/*
 * This function traverses the list returning the node corresponding to the
 * given key.
 *
 * That node is also moved to the head of the list, so that if it's accessed
 * again we don't need to traverse the whole list. By doing so, all the recently
 * used nodes can be accessed relatively quickly.
 */
var listGetNode = function (list, key) { // eslint-disable-line consistent-return
	for (var prev = list, curr; (curr = prev.next) !== null; prev = curr) {
		if (curr.key === key) {
			prev.next = curr.next;
			curr.next = list.next;
			list.next = curr; // eslint-disable-line no-param-reassign
			return curr;
		}
	}
};

var listGet = function (objects, key) {
	var node = listGetNode(objects, key);
	return node && node.value;
};
var listSet = function (objects, key, value) {
	var node = listGetNode(objects, key);
	if (node) {
		node.value = value;
	} else {
		// Prepend the new node to the beginning of the list
		objects.next = { // eslint-disable-line no-param-reassign
			key: key,
			next: objects.next,
			value: value
		};
	}
};
var listHas = function (objects, key) {
	return !!listGetNode(objects, key);
};

module.exports = function getSideChannel() {
	var $wm;
	var $m;
	var $o;
	var channel = {
		assert: function (key) {
			if (!channel.has(key)) {
				throw new $TypeError('Side channel does not contain ' + inspect(key));
			}
		},
		get: function (key) { // eslint-disable-line consistent-return
			if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {
				if ($wm) {
					return $weakMapGet($wm, key);
				}
			} else if ($Map) {
				if ($m) {
					return $mapGet($m, key);
				}
			} else {
				if ($o) { // eslint-disable-line no-lonely-if
					return listGet($o, key);
				}
			}
		},
		has: function (key) {
			if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {
				if ($wm) {
					return $weakMapHas($wm, key);
				}
			} else if ($Map) {
				if ($m) {
					return $mapHas($m, key);
				}
			} else {
				if ($o) { // eslint-disable-line no-lonely-if
					return listHas($o, key);
				}
			}
			return false;
		},
		set: function (key, value) {
			if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {
				if (!$wm) {
					$wm = new $WeakMap();
				}
				$weakMapSet($wm, key, value);
			} else if ($Map) {
				if (!$m) {
					$m = new $Map();
				}
				$mapSet($m, key, value);
			} else {
				if (!$o) {
					/*
					 * Initialize the linked list as an empty node, so that we don't have
					 * to special-case handling of the first node: we can always refer to
					 * it as (previous node).next, instead of something like (list).head
					 */
					$o = { key: {}, next: null };
				}
				listSet($o, key, value);
			}
		}
	};
	return channel;
};

},{"call-bind/callBound":7,"get-intrinsic":11,"object-inspect":15}]},{},[2])(2)
});
# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/qs
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with a single custom sponsorship URL
The MIT License (MIT)

Copyright (c) Feross Aboukhadijeh

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.
/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
/* eslint-disable node/no-deprecated-api */
var buffer = require('buffer')
var Buffer = buffer.Buffer

// alternative to using Object.keys for old browsers
function copyProps (src, dst) {
  for (var key in src) {
    dst[key] = src[key]
  }
}
if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
  module.exports = buffer
} else {
  // Copy properties from require('buffer')
  copyProps(buffer, exports)
  exports.Buffer = SafeBuffer
}

function SafeBuffer (arg, encodingOrOffset, length) {
  return Buffer(arg, encodingOrOffset, length)
}

SafeBuffer.prototype = Object.create(Buffer.prototype)

// Copy static methods from Buffer
copyProps(Buffer, SafeBuffer)

SafeBuffer.from = function (arg, encodingOrOffset, length) {
  if (typeof arg === 'number') {
    throw new TypeError('Argument must not be a number')
  }
  return Buffer(arg, encodingOrOffset, length)
}

SafeBuffer.alloc = function (size, fill, encoding) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  var buf = Buffer(size)
  if (fill !== undefined) {
    if (typeof encoding === 'string') {
      buf.fill(fill, encoding)
    } else {
      buf.fill(fill)
    }
  } else {
    buf.fill(0)
  }
  return buf
}

SafeBuffer.allocUnsafe = function (size) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  return Buffer(size)
}

SafeBuffer.allocUnsafeSlow = function (size) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  return buffer.SlowBuffer(size)
}
{
  "name": "safe-buffer",
  "description": "Safer Node.js Buffer API",
  "version": "5.2.1",
  "author": {
    "name": "Feross Aboukhadijeh",
    "email": "feross@feross.org",
    "url": "https://feross.org"
  },
  "devDependencies": {
    "standard": "*",
    "tape": "^5.0.0"
  },
  "homepage": "https://github.com/feross/safe-buffer",
  "license": "MIT",
  "main": "index.js",
  "types": "index.d.ts",
  "repository": {
    "type": "git",
    "url": "git://github.com/feross/safe-buffer.git"
  },
  "funding": [
    {
      "type": "github",
      "url": "https://github.com/sponsors/feross"
    },
    {
      "type": "patreon",
      "url": "https://www.patreon.com/feross"
    },
    {
      "type": "consulting",
      "url": "https://feross.org/support"
    }
  ]
}A. HISTORY OF THE SOFTWARE
==========================

Python was created in the early 1990s by Guido van Rossum at Stichting
Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
as a successor of a language called ABC.  Guido remains Python's
principal author, although it includes many contributions from others.

In 1995, Guido continued his work on Python at the Corporation for
National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
in Reston, Virginia where he released several versions of the
software.

In May 2000, Guido and the Python core development team moved to
BeOpen.com to form the BeOpen PythonLabs team.  In October of the same
year, the PythonLabs team moved to Digital Creations, which became
Zope Corporation.  In 2001, the Python Software Foundation (PSF, see
https://www.python.org/psf/) was formed, a non-profit organization
created specifically to own Python-related Intellectual Property.
Zope Corporation was a sponsoring member of the PSF.

All Python releases are Open Source (see http://www.opensource.org for
the Open Source Definition).  Historically, most, but not all, Python
releases have also been GPL-compatible; the table below summarizes
the various releases.

    Release         Derived     Year        Owner       GPL-
                    from                                compatible? (1)

    0.9.0 thru 1.2              1991-1995   CWI         yes
    1.3 thru 1.5.2  1.2         1995-1999   CNRI        yes
    1.6             1.5.2       2000        CNRI        no
    2.0             1.6         2000        BeOpen.com  no
    1.6.1           1.6         2001        CNRI        yes (2)
    2.1             2.0+1.6.1   2001        PSF         no
    2.0.1           2.0+1.6.1   2001        PSF         yes
    2.1.1           2.1+2.0.1   2001        PSF         yes
    2.1.2           2.1.1       2002        PSF         yes
    2.1.3           2.1.2       2002        PSF         yes
    2.2 and above   2.1.1       2001-now    PSF         yes

Footnotes:

(1) GPL-compatible doesn't mean that we're distributing Python under
    the GPL.  All Python licenses, unlike the GPL, let you distribute
    a modified version without making your changes open source.  The
    GPL-compatible licenses make it possible to combine Python with
    other software that is released under the GPL; the others don't.

(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
    because its license has a choice of law clause.  According to
    CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
    is "not incompatible" with the GPL.

Thanks to the many outside volunteers who have worked under Guido's
direction to make these releases possible.


B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
===============================================================

PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
--------------------------------------------

1. This LICENSE AGREEMENT is between the Python Software Foundation
("PSF"), and the Individual or Organization ("Licensee") accessing and
otherwise using this software ("Python") in source or binary form and
its associated documentation.

2. Subject to the terms and conditions of this License Agreement, PSF hereby
grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
analyze, test, perform and/or display publicly, prepare derivative works,
distribute, and otherwise use Python alone or in any derivative version,
provided, however, that PSF's License Agreement and PSF's notice of copyright,
i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Python Software Foundation;
All Rights Reserved" are retained in Python alone or in any derivative version
prepared by Licensee.

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python.

4. PSF is making Python available to Licensee on an "AS IS"
basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. Nothing in this License Agreement shall be deemed to create any
relationship of agency, partnership, or joint venture between PSF and
Licensee.  This License Agreement does not grant permission to use PSF
trademarks or trade name in a trademark sense to endorse or promote
products or services of Licensee, or any third party.

8. By copying, installing or otherwise using Python, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
-------------------------------------------

BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1

1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
Individual or Organization ("Licensee") accessing and otherwise using
this software in source or binary form and its associated
documentation ("the Software").

2. Subject to the terms and conditions of this BeOpen Python License
Agreement, BeOpen hereby grants Licensee a non-exclusive,
royalty-free, world-wide license to reproduce, analyze, test, perform
and/or display publicly, prepare derivative works, distribute, and
otherwise use the Software alone or in any derivative version,
provided, however, that the BeOpen Python License is retained in the
Software, alone or in any derivative version prepared by Licensee.

3. BeOpen is making the Software available to Licensee on an "AS IS"
basis.  BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

5. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

6. This License Agreement shall be governed by and interpreted in all
respects by the law of the State of California, excluding conflict of
law provisions.  Nothing in this License Agreement shall be deemed to
create any relationship of agency, partnership, or joint venture
between BeOpen and Licensee.  This License Agreement does not grant
permission to use BeOpen trademarks or trade names in a trademark
sense to endorse or promote products or services of Licensee, or any
third party.  As an exception, the "BeOpen Python" logos available at
http://www.pythonlabs.com/logos.html may be used according to the
permissions granted on that web page.

7. By copying, installing or otherwise using the software, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
---------------------------------------

1. This LICENSE AGREEMENT is between the Corporation for National
Research Initiatives, having an office at 1895 Preston White Drive,
Reston, VA 20191 ("CNRI"), and the Individual or Organization
("Licensee") accessing and otherwise using Python 1.6.1 software in
source or binary form and its associated documentation.

2. Subject to the terms and conditions of this License Agreement, CNRI
hereby grants Licensee a nonexclusive, royalty-free, world-wide
license to reproduce, analyze, test, perform and/or display publicly,
prepare derivative works, distribute, and otherwise use Python 1.6.1
alone or in any derivative version, provided, however, that CNRI's
License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
1995-2001 Corporation for National Research Initiatives; All Rights
Reserved" are retained in Python 1.6.1 alone or in any derivative
version prepared by Licensee.  Alternately, in lieu of CNRI's License
Agreement, Licensee may substitute the following text (omitting the
quotes): "Python 1.6.1 is made available subject to the terms and
conditions in CNRI's License Agreement.  This Agreement together with
Python 1.6.1 may be located on the Internet using the following
unique, persistent identifier (known as a handle): 1895.22/1013.  This
Agreement may also be obtained from a proxy server on the Internet
using the following URL: http://hdl.handle.net/1895.22/1013".

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python 1.6.1 or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python 1.6.1.

4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
basis.  CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. This License Agreement shall be governed by the federal
intellectual property law of the United States, including without
limitation the federal copyright law, and, to the extent such
U.S. federal law does not apply, by the law of the Commonwealth of
Virginia, excluding Virginia's conflict of law provisions.
Notwithstanding the foregoing, with regard to derivative works based
on Python 1.6.1 that incorporate non-separable material that was
previously distributed under the GNU General Public License (GPL), the
law of the Commonwealth of Virginia shall govern this License
Agreement only as to issues arising under or with respect to
Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in this
License Agreement shall be deemed to create any relationship of
agency, partnership, or joint venture between CNRI and Licensee.  This
License Agreement does not grant permission to use CNRI trademarks or
trade name in a trademark sense to endorse or promote products or
services of Licensee, or any third party.

8. By clicking on the "ACCEPT" button where indicated, or by copying,
installing or otherwise using Python 1.6.1, Licensee agrees to be
bound by the terms and conditions of this License Agreement.

        ACCEPT


CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
--------------------------------------------------

Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
The Netherlands.  All rights reserved.

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Stichting Mathematisch
Centrum or CWI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.

STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
FOR ANY SPECIAL, 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.
// Port of python's argparse module, version 3.9.0:
// https://github.com/python/cpython/blob/v3.9.0rc1/Lib/argparse.py

'use strict'

// Copyright (C) 2010-2020 Python Software Foundation.
// Copyright (C) 2020 argparse.js authors

/*
 * Command-line parsing library
 *
 * This module is an optparse-inspired command-line parsing library that:
 *
 *     - handles both optional and positional arguments
 *     - produces highly informative usage messages
 *     - supports parsers that dispatch to sub-parsers
 *
 * The following is a simple usage example that sums integers from the
 * command-line and writes the result to a file::
 *
 *     parser = argparse.ArgumentParser(
 *         description='sum the integers at the command line')
 *     parser.add_argument(
 *         'integers', metavar='int', nargs='+', type=int,
 *         help='an integer to be summed')
 *     parser.add_argument(
 *         '--log', default=sys.stdout, type=argparse.FileType('w'),
 *         help='the file where the sum should be written')
 *     args = parser.parse_args()
 *     args.log.write('%s' % sum(args.integers))
 *     args.log.close()
 *
 * The module contains the following public classes:
 *
 *     - ArgumentParser -- The main entry point for command-line parsing. As the
 *         example above shows, the add_argument() method is used to populate
 *         the parser with actions for optional and positional arguments. Then
 *         the parse_args() method is invoked to convert the args at the
 *         command-line into an object with attributes.
 *
 *     - ArgumentError -- The exception raised by ArgumentParser objects when
 *         there are errors with the parser's actions. Errors raised while
 *         parsing the command-line are caught by ArgumentParser and emitted
 *         as command-line messages.
 *
 *     - FileType -- A factory for defining types of files to be created. As the
 *         example above shows, instances of FileType are typically passed as
 *         the type= argument of add_argument() calls.
 *
 *     - Action -- The base class for parser actions. Typically actions are
 *         selected by passing strings like 'store_true' or 'append_const' to
 *         the action= argument of add_argument(). However, for greater
 *         customization of ArgumentParser actions, subclasses of Action may
 *         be defined and passed as the action= argument.
 *
 *     - HelpFormatter, RawDescriptionHelpFormatter, RawTextHelpFormatter,
 *         ArgumentDefaultsHelpFormatter -- Formatter classes which
 *         may be passed as the formatter_class= argument to the
 *         ArgumentParser constructor. HelpFormatter is the default,
 *         RawDescriptionHelpFormatter and RawTextHelpFormatter tell the parser
 *         not to change the formatting for help text, and
 *         ArgumentDefaultsHelpFormatter adds information about argument defaults
 *         to the help.
 *
 * All other classes in this module are considered implementation details.
 * (Also note that HelpFormatter and RawDescriptionHelpFormatter are only
 * considered public as object names -- the API of the formatter objects is
 * still considered an implementation detail.)
 */

const SUPPRESS = '==SUPPRESS=='

const OPTIONAL = '?'
const ZERO_OR_MORE = '*'
const ONE_OR_MORE = '+'
const PARSER = 'A...'
const REMAINDER = '...'
const _UNRECOGNIZED_ARGS_ATTR = '_unrecognized_args'


// ==================================
// Utility functions used for porting
// ==================================
const assert = require('assert')
const util = require('util')
const fs = require('fs')
const sub = require('./lib/sub')
const path = require('path')
const repr = util.inspect

function get_argv() {
    // omit first argument (which is assumed to be interpreter - `node`, `coffee`, `ts-node`, etc.)
    return process.argv.slice(1)
}

function get_terminal_size() {
    return {
        columns: +process.env.COLUMNS || process.stdout.columns || 80
    }
}

function hasattr(object, name) {
    return Object.prototype.hasOwnProperty.call(object, name)
}

function getattr(object, name, value) {
    return hasattr(object, name) ? object[name] : value
}

function setattr(object, name, value) {
    object[name] = value
}

function setdefault(object, name, value) {
    if (!hasattr(object, name)) object[name] = value
    return object[name]
}

function delattr(object, name) {
    delete object[name]
}

function range(from, to, step=1) {
    // range(10) is equivalent to range(0, 10)
    if (arguments.length === 1) [ to, from ] = [ from, 0 ]
    if (typeof from !== 'number' || typeof to !== 'number' || typeof step !== 'number') {
        throw new TypeError('argument cannot be interpreted as an integer')
    }
    if (step === 0) throw new TypeError('range() arg 3 must not be zero')

    let result = []
    if (step > 0) {
        for (let i = from; i < to; i += step) result.push(i)
    } else {
        for (let i = from; i > to; i += step) result.push(i)
    }
    return result
}

function splitlines(str, keepends = false) {
    let result
    if (!keepends) {
        result = str.split(/\r\n|[\n\r\v\f\x1c\x1d\x1e\x85\u2028\u2029]/)
    } else {
        result = []
        let parts = str.split(/(\r\n|[\n\r\v\f\x1c\x1d\x1e\x85\u2028\u2029])/)
        for (let i = 0; i < parts.length; i += 2) {
            result.push(parts[i] + (i + 1 < parts.length ? parts[i + 1] : ''))
        }
    }
    if (!result[result.length - 1]) result.pop()
    return result
}

function _string_lstrip(string, prefix_chars) {
    let idx = 0
    while (idx < string.length && prefix_chars.includes(string[idx])) idx++
    return idx ? string.slice(idx) : string
}

function _string_split(string, sep, maxsplit) {
    let result = string.split(sep)
    if (result.length > maxsplit) {
        result = result.slice(0, maxsplit).concat([ result.slice(maxsplit).join(sep) ])
    }
    return result
}

function _array_equal(array1, array2) {
    if (array1.length !== array2.length) return false
    for (let i = 0; i < array1.length; i++) {
        if (array1[i] !== array2[i]) return false
    }
    return true
}

function _array_remove(array, item) {
    let idx = array.indexOf(item)
    if (idx === -1) throw new TypeError(sub('%r not in list', item))
    array.splice(idx, 1)
}

// normalize choices to array;
// this isn't required in python because `in` and `map` operators work with anything,
// but in js dealing with multiple types here is too clunky
function _choices_to_array(choices) {
    if (choices === undefined) {
        return []
    } else if (Array.isArray(choices)) {
        return choices
    } else if (choices !== null && typeof choices[Symbol.iterator] === 'function') {
        return Array.from(choices)
    } else if (typeof choices === 'object' && choices !== null) {
        return Object.keys(choices)
    } else {
        throw new Error(sub('invalid choices value: %r', choices))
    }
}

// decorator that allows a class to be called without new
function _callable(cls) {
    let result = { // object is needed for inferred class name
        [cls.name]: function (...args) {
            let this_class = new.target === result || !new.target
            return Reflect.construct(cls, args, this_class ? cls : new.target)
        }
    }
    result[cls.name].prototype = cls.prototype
    // fix default tag for toString, e.g. [object Action] instead of [object Object]
    cls.prototype[Symbol.toStringTag] = cls.name
    return result[cls.name]
}

function _alias(object, from, to) {
    try {
        let name = object.constructor.name
        Object.defineProperty(object, from, {
            value: util.deprecate(object[to], sub('%s.%s() is renamed to %s.%s()',
                name, from, name, to)),
            enumerable: false
        })
    } catch {}
}

// decorator that allows snake_case class methods to be called with camelCase and vice versa
function _camelcase_alias(_class) {
    for (let name of Object.getOwnPropertyNames(_class.prototype)) {
        let camelcase = name.replace(/\w_[a-z]/g, s => s[0] + s[2].toUpperCase())
        if (camelcase !== name) _alias(_class.prototype, camelcase, name)
    }
    return _class
}

function _to_legacy_name(key) {
    key = key.replace(/\w_[a-z]/g, s => s[0] + s[2].toUpperCase())
    if (key === 'default') key = 'defaultValue'
    if (key === 'const') key = 'constant'
    return key
}

function _to_new_name(key) {
    if (key === 'defaultValue') key = 'default'
    if (key === 'constant') key = 'const'
    key = key.replace(/[A-Z]/g, c => '_' + c.toLowerCase())
    return key
}

// parse options
let no_default = Symbol('no_default_value')
function _parse_opts(args, descriptor) {
    function get_name() {
        let stack = new Error().stack.split('\n')
            .map(x => x.match(/^    at (.*) \(.*\)$/))
            .filter(Boolean)
            .map(m => m[1])
            .map(fn => fn.match(/[^ .]*$/)[0])

        if (stack.length && stack[0] === get_name.name) stack.shift()
        if (stack.length && stack[0] === _parse_opts.name) stack.shift()
        return stack.length ? stack[0] : ''
    }

    args = Array.from(args)
    let kwargs = {}
    let result = []
    let last_opt = args.length && args[args.length - 1]

    if (typeof last_opt === 'object' && last_opt !== null && !Array.isArray(last_opt) &&
        (!last_opt.constructor || last_opt.constructor.name === 'Object')) {
        kwargs = Object.assign({}, args.pop())
    }

    // LEGACY (v1 compatibility): camelcase
    let renames = []
    for (let key of Object.keys(descriptor)) {
        let old_name = _to_legacy_name(key)
        if (old_name !== key && (old_name in kwargs)) {
            if (key in kwargs) {
                // default and defaultValue specified at the same time, happens often in old tests
                //throw new TypeError(sub('%s() got multiple values for argument %r', get_name(), key))
            } else {
                kwargs[key] = kwargs[old_name]
            }
            renames.push([ old_name, key ])
            delete kwargs[old_name]
        }
    }
    if (renames.length) {
        let name = get_name()
        deprecate('camelcase_' + name, sub('%s(): following options are renamed: %s',
            name, renames.map(([ a, b ]) => sub('%r -> %r', a, b))))
    }
    // end

    let missing_positionals = []
    let positional_count = args.length

    for (let [ key, def ] of Object.entries(descriptor)) {
        if (key[0] === '*') {
            if (key.length > 0 && key[1] === '*') {
                // LEGACY (v1 compatibility): camelcase
                let renames = []
                for (let key of Object.keys(kwargs)) {
                    let new_name = _to_new_name(key)
                    if (new_name !== key && (key in kwargs)) {
                        if (new_name in kwargs) {
                            // default and defaultValue specified at the same time, happens often in old tests
                            //throw new TypeError(sub('%s() got multiple values for argument %r', get_name(), new_name))
                        } else {
                            kwargs[new_name] = kwargs[key]
                        }
                        renames.push([ key, new_name ])
                        delete kwargs[key]
                    }
                }
                if (renames.length) {
                    let name = get_name()
                    deprecate('camelcase_' + name, sub('%s(): following options are renamed: %s',
                        name, renames.map(([ a, b ]) => sub('%r -> %r', a, b))))
                }
                // end
                result.push(kwargs)
                kwargs = {}
            } else {
                result.push(args)
                args = []
            }
        } else if (key in kwargs && args.length > 0) {
            throw new TypeError(sub('%s() got multiple values for argument %r', get_name(), key))
        } else if (key in kwargs) {
            result.push(kwargs[key])
            delete kwargs[key]
        } else if (args.length > 0) {
            result.push(args.shift())
        } else if (def !== no_default) {
            result.push(def)
        } else {
            missing_positionals.push(key)
        }
    }

    if (Object.keys(kwargs).length) {
        throw new TypeError(sub('%s() got an unexpected keyword argument %r',
            get_name(), Object.keys(kwargs)[0]))
    }

    if (args.length) {
        let from = Object.entries(descriptor).filter(([ k, v ]) => k[0] !== '*' && v !== no_default).length
        let to = Object.entries(descriptor).filter(([ k ]) => k[0] !== '*').length
        throw new TypeError(sub('%s() takes %s positional argument%s but %s %s given',
            get_name(),
            from === to ? sub('from %s to %s', from, to) : to,
            from === to && to === 1 ? '' : 's',
            positional_count,
            positional_count === 1 ? 'was' : 'were'))
    }

    if (missing_positionals.length) {
        let strs = missing_positionals.map(repr)
        if (strs.length > 1) strs[strs.length - 1] = 'and ' + strs[strs.length - 1]
        let str_joined = strs.join(strs.length === 2 ? '' : ', ')
        throw new TypeError(sub('%s() missing %i required positional argument%s: %s',
            get_name(), strs.length, strs.length === 1 ? '' : 's', str_joined))
    }

    return result
}

let _deprecations = {}
function deprecate(id, string) {
    _deprecations[id] = _deprecations[id] || util.deprecate(() => {}, string)
    _deprecations[id]()
}


// =============================
// Utility functions and classes
// =============================
function _AttributeHolder(cls = Object) {
    /*
     *  Abstract base class that provides __repr__.
     *
     *  The __repr__ method returns a string in the format::
     *      ClassName(attr=name, attr=name, ...)
     *  The attributes are determined either by a class-level attribute,
     *  '_kwarg_names', or by inspecting the instance __dict__.
     */

    return class _AttributeHolder extends cls {
        [util.inspect.custom]() {
            let type_name = this.constructor.name
            let arg_strings = []
            let star_args = {}
            for (let arg of this._get_args()) {
                arg_strings.push(repr(arg))
            }
            for (let [ name, value ] of this._get_kwargs()) {
                if (/^[a-z_][a-z0-9_$]*$/i.test(name)) {
                    arg_strings.push(sub('%s=%r', name, value))
                } else {
                    star_args[name] = value
                }
            }
            if (Object.keys(star_args).length) {
                arg_strings.push(sub('**%s', repr(star_args)))
            }
            return sub('%s(%s)', type_name, arg_strings.join(', '))
        }

        toString() {
            return this[util.inspect.custom]()
        }

        _get_kwargs() {
            return Object.entries(this)
        }

        _get_args() {
            return []
        }
    }
}


function _copy_items(items) {
    if (items === undefined) {
        return []
    }
    return items.slice(0)
}


// ===============
// Formatting Help
// ===============
const HelpFormatter = _camelcase_alias(_callable(class HelpFormatter {
    /*
     *  Formatter for generating usage messages and argument help strings.
     *
     *  Only the name of this class is considered a public API. All the methods
     *  provided by the class are considered an implementation detail.
     */

    constructor() {
        let [
            prog,
            indent_increment,
            max_help_position,
            width
        ] = _parse_opts(arguments, {
            prog: no_default,
            indent_increment: 2,
            max_help_position: 24,
            width: undefined
        })

        // default setting for width
        if (width === undefined) {
            width = get_terminal_size().columns
            width -= 2
        }

        this._prog = prog
        this._indent_increment = indent_increment
        this._max_help_position = Math.min(max_help_position,
                                      Math.max(width - 20, indent_increment * 2))
        this._width = width

        this._current_indent = 0
        this._level = 0
        this._action_max_length = 0

        this._root_section = this._Section(this, undefined)
        this._current_section = this._root_section

        this._whitespace_matcher = /[ \t\n\r\f\v]+/g // equivalent to python /\s+/ with ASCII flag
        this._long_break_matcher = /\n\n\n+/g
    }

    // ===============================
    // Section and indentation methods
    // ===============================
    _indent() {
        this._current_indent += this._indent_increment
        this._level += 1
    }

    _dedent() {
        this._current_indent -= this._indent_increment
        assert(this._current_indent >= 0, 'Indent decreased below 0.')
        this._level -= 1
    }

    _add_item(func, args) {
        this._current_section.items.push([ func, args ])
    }

    // ========================
    // Message building methods
    // ========================
    start_section(heading) {
        this._indent()
        let section = this._Section(this, this._current_section, heading)
        this._add_item(section.format_help.bind(section), [])
        this._current_section = section
    }

    end_section() {
        this._current_section = this._current_section.parent
        this._dedent()
    }

    add_text(text) {
        if (text !== SUPPRESS && text !== undefined) {
            this._add_item(this._format_text.bind(this), [text])
        }
    }

    add_usage(usage, actions, groups, prefix = undefined) {
        if (usage !== SUPPRESS) {
            let args = [ usage, actions, groups, prefix ]
            this._add_item(this._format_usage.bind(this), args)
        }
    }

    add_argument(action) {
        if (action.help !== SUPPRESS) {

            // find all invocations
            let invocations = [this._format_action_invocation(action)]
            for (let subaction of this._iter_indented_subactions(action)) {
                invocations.push(this._format_action_invocation(subaction))
            }

            // update the maximum item length
            let invocation_length = Math.max(...invocations.map(invocation => invocation.length))
            let action_length = invocation_length + this._current_indent
            this._action_max_length = Math.max(this._action_max_length,
                                               action_length)

            // add the item to the list
            this._add_item(this._format_action.bind(this), [action])
        }
    }

    add_arguments(actions) {
        for (let action of actions) {
            this.add_argument(action)
        }
    }

    // =======================
    // Help-formatting methods
    // =======================
    format_help() {
        let help = this._root_section.format_help()
        if (help) {
            help = help.replace(this._long_break_matcher, '\n\n')
            help = help.replace(/^\n+|\n+$/g, '') + '\n'
        }
        return help
    }

    _join_parts(part_strings) {
        return part_strings.filter(part => part && part !== SUPPRESS).join('')
    }

    _format_usage(usage, actions, groups, prefix) {
        if (prefix === undefined) {
            prefix = 'usage: '
        }

        // if usage is specified, use that
        if (usage !== undefined) {
            usage = sub(usage, { prog: this._prog })

        // if no optionals or positionals are available, usage is just prog
        } else if (usage === undefined && !actions.length) {
            usage = sub('%(prog)s', { prog: this._prog })

        // if optionals and positionals are available, calculate usage
        } else if (usage === undefined) {
            let prog = sub('%(prog)s', { prog: this._prog })

            // split optionals from positionals
            let optionals = []
            let positionals = []
            for (let action of actions) {
                if (action.option_strings.length) {
                    optionals.push(action)
                } else {
                    positionals.push(action)
                }
            }

            // build full usage string
            let action_usage = this._format_actions_usage([].concat(optionals).concat(positionals), groups)
            usage = [ prog, action_usage ].map(String).join(' ')

            // wrap the usage parts if it's too long
            let text_width = this._width - this._current_indent
            if (prefix.length + usage.length > text_width) {

                // break usage into wrappable parts
                let part_regexp = /\(.*?\)+(?=\s|$)|\[.*?\]+(?=\s|$)|\S+/g
                let opt_usage = this._format_actions_usage(optionals, groups)
                let pos_usage = this._format_actions_usage(positionals, groups)
                let opt_parts = opt_usage.match(part_regexp) || []
                let pos_parts = pos_usage.match(part_regexp) || []
                assert(opt_parts.join(' ') === opt_usage)
                assert(pos_parts.join(' ') === pos_usage)

                // helper for wrapping lines
                let get_lines = (parts, indent, prefix = undefined) => {
                    let lines = []
                    let line = []
                    let line_len
                    if (prefix !== undefined) {
                        line_len = prefix.length - 1
                    } else {
                        line_len = indent.length - 1
                    }
                    for (let part of parts) {
                        if (line_len + 1 + part.length > text_width && line) {
                            lines.push(indent + line.join(' '))
                            line = []
                            line_len = indent.length - 1
                        }
                        line.push(part)
                        line_len += part.length + 1
                    }
                    if (line.length) {
                        lines.push(indent + line.join(' '))
                    }
                    if (prefix !== undefined) {
                        lines[0] = lines[0].slice(indent.length)
                    }
                    return lines
                }

                let lines

                // if prog is short, follow it with optionals or positionals
                if (prefix.length + prog.length <= 0.75 * text_width) {
                    let indent = ' '.repeat(prefix.length + prog.length + 1)
                    if (opt_parts.length) {
                        lines = get_lines([prog].concat(opt_parts), indent, prefix)
                        lines = lines.concat(get_lines(pos_parts, indent))
                    } else if (pos_parts.length) {
                        lines = get_lines([prog].concat(pos_parts), indent, prefix)
                    } else {
                        lines = [prog]
                    }

                // if prog is long, put it on its own line
                } else {
                    let indent = ' '.repeat(prefix.length)
                    let parts = [].concat(opt_parts).concat(pos_parts)
                    lines = get_lines(parts, indent)
                    if (lines.length > 1) {
                        lines = []
                        lines = lines.concat(get_lines(opt_parts, indent))
                        lines = lines.concat(get_lines(pos_parts, indent))
                    }
                    lines = [prog].concat(lines)
                }

                // join lines into usage
                usage = lines.join('\n')
            }
        }

        // prefix with 'usage:'
        return sub('%s%s\n\n', prefix, usage)
    }

    _format_actions_usage(actions, groups) {
        // find group indices and identify actions in groups
        let group_actions = new Set()
        let inserts = {}
        for (let group of groups) {
            let start = actions.indexOf(group._group_actions[0])
            if (start === -1) {
                continue
            } else {
                let end = start + group._group_actions.length
                if (_array_equal(actions.slice(start, end), group._group_actions)) {
                    for (let action of group._group_actions) {
                        group_actions.add(action)
                    }
                    if (!group.required) {
                        if (start in inserts) {
                            inserts[start] += ' ['
                        } else {
                            inserts[start] = '['
                        }
                        if (end in inserts) {
                            inserts[end] += ']'
                        } else {
                            inserts[end] = ']'
                        }
                    } else {
                        if (start in inserts) {
                            inserts[start] += ' ('
                        } else {
                            inserts[start] = '('
                        }
                        if (end in inserts) {
                            inserts[end] += ')'
                        } else {
                            inserts[end] = ')'
                        }
                    }
                    for (let i of range(start + 1, end)) {
                        inserts[i] = '|'
                    }
                }
            }
        }

        // collect all actions format strings
        let parts = []
        for (let [ i, action ] of Object.entries(actions)) {

            // suppressed arguments are marked with None
            // remove | separators for suppressed arguments
            if (action.help === SUPPRESS) {
                parts.push(undefined)
                if (inserts[+i] === '|') {
                    delete inserts[+i]
                } else if (inserts[+i + 1] === '|') {
                    delete inserts[+i + 1]
                }

            // produce all arg strings
            } else if (!action.option_strings.length) {
                let default_value = this._get_default_metavar_for_positional(action)
                let part = this._format_args(action, default_value)

                // if it's in a group, strip the outer []
                if (group_actions.has(action)) {
                    if (part[0] === '[' && part[part.length - 1] === ']') {
                        part = part.slice(1, -1)
                    }
                }

                // add the action string to the list
                parts.push(part)

            // produce the first way to invoke the option in brackets
            } else {
                let option_string = action.option_strings[0]
                let part

                // if the Optional doesn't take a value, format is:
                //    -s or --long
                if (action.nargs === 0) {
                    part = action.format_usage()

                // if the Optional takes a value, format is:
                //    -s ARGS or --long ARGS
                } else {
                    let default_value = this._get_default_metavar_for_optional(action)
                    let args_string = this._format_args(action, default_value)
                    part = sub('%s %s', option_string, args_string)
                }

                // make it look optional if it's not required or in a group
                if (!action.required && !group_actions.has(action)) {
                    part = sub('[%s]', part)
                }

                // add the action string to the list
                parts.push(part)
            }
        }

        // insert things at the necessary indices
        for (let i of Object.keys(inserts).map(Number).sort((a, b) => b - a)) {
            parts.splice(+i, 0, inserts[+i])
        }

        // join all the action items with spaces
        let text = parts.filter(Boolean).join(' ')

        // clean up separators for mutually exclusive groups
        text = text.replace(/([\[(]) /g, '$1')
        text = text.replace(/ ([\])])/g, '$1')
        text = text.replace(/[\[(] *[\])]/g, '')
        text = text.replace(/\(([^|]*)\)/g, '$1', text)
        text = text.trim()

        // return the text
        return text
    }

    _format_text(text) {
        if (text.includes('%(prog)')) {
            text = sub(text, { prog: this._prog })
        }
        let text_width = Math.max(this._width - this._current_indent, 11)
        let indent = ' '.repeat(this._current_indent)
        return this._fill_text(text, text_width, indent) + '\n\n'
    }

    _format_action(action) {
        // determine the required width and the entry label
        let help_position = Math.min(this._action_max_length + 2,
                                     this._max_help_position)
        let help_width = Math.max(this._width - help_position, 11)
        let action_width = help_position - this._current_indent - 2
        let action_header = this._format_action_invocation(action)
        let indent_first

        // no help; start on same line and add a final newline
        if (!action.help) {
            let tup = [ this._current_indent, '', action_header ]
            action_header = sub('%*s%s\n', ...tup)

        // short action name; start on the same line and pad two spaces
        } else if (action_header.length <= action_width) {
            let tup = [ this._current_indent, '', action_width, action_header ]
            action_header = sub('%*s%-*s  ', ...tup)
            indent_first = 0

        // long action name; start on the next line
        } else {
            let tup = [ this._current_indent, '', action_header ]
            action_header = sub('%*s%s\n', ...tup)
            indent_first = help_position
        }

        // collect the pieces of the action help
        let parts = [action_header]

        // if there was help for the action, add lines of help text
        if (action.help) {
            let help_text = this._expand_help(action)
            let help_lines = this._split_lines(help_text, help_width)
            parts.push(sub('%*s%s\n', indent_first, '', help_lines[0]))
            for (let line of help_lines.slice(1)) {
                parts.push(sub('%*s%s\n', help_position, '', line))
            }

        // or add a newline if the description doesn't end with one
        } else if (!action_header.endsWith('\n')) {
            parts.push('\n')
        }

        // if there are any sub-actions, add their help as well
        for (let subaction of this._iter_indented_subactions(action)) {
            parts.push(this._format_action(subaction))
        }

        // return a single string
        return this._join_parts(parts)
    }

    _format_action_invocation(action) {
        if (!action.option_strings.length) {
            let default_value = this._get_default_metavar_for_positional(action)
            let metavar = this._metavar_formatter(action, default_value)(1)[0]
            return metavar

        } else {
            let parts = []

            // if the Optional doesn't take a value, format is:
            //    -s, --long
            if (action.nargs === 0) {
                parts = parts.concat(action.option_strings)

            // if the Optional takes a value, format is:
            //    -s ARGS, --long ARGS
            } else {
                let default_value = this._get_default_metavar_for_optional(action)
                let args_string = this._format_args(action, default_value)
                for (let option_string of action.option_strings) {
                    parts.push(sub('%s %s', option_string, args_string))
                }
            }

            return parts.join(', ')
        }
    }

    _metavar_formatter(action, default_metavar) {
        let result
        if (action.metavar !== undefined) {
            result = action.metavar
        } else if (action.choices !== undefined) {
            let choice_strs = _choices_to_array(action.choices).map(String)
            result = sub('{%s}', choice_strs.join(','))
        } else {
            result = default_metavar
        }

        function format(tuple_size) {
            if (Array.isArray(result)) {
                return result
            } else {
                return Array(tuple_size).fill(result)
            }
        }
        return format
    }

    _format_args(action, default_metavar) {
        let get_metavar = this._metavar_formatter(action, default_metavar)
        let result
        if (action.nargs === undefined) {
            result = sub('%s', ...get_metavar(1))
        } else if (action.nargs === OPTIONAL) {
            result = sub('[%s]', ...get_metavar(1))
        } else if (action.nargs === ZERO_OR_MORE) {
            let metavar = get_metavar(1)
            if (metavar.length === 2) {
                result = sub('[%s [%s ...]]', ...metavar)
            } else {
                result = sub('[%s ...]', ...metavar)
            }
        } else if (action.nargs === ONE_OR_MORE) {
            result = sub('%s [%s ...]', ...get_metavar(2))
        } else if (action.nargs === REMAINDER) {
            result = '...'
        } else if (action.nargs === PARSER) {
            result = sub('%s ...', ...get_metavar(1))
        } else if (action.nargs === SUPPRESS) {
            result = ''
        } else {
            let formats
            try {
                formats = range(action.nargs).map(() => '%s')
            } catch (err) {
                throw new TypeError('invalid nargs value')
            }
            result = sub(formats.join(' '), ...get_metavar(action.nargs))
        }
        return result
    }

    _expand_help(action) {
        let params = Object.assign({ prog: this._prog }, action)
        for (let name of Object.keys(params)) {
            if (params[name] === SUPPRESS) {
                delete params[name]
            }
        }
        for (let name of Object.keys(params)) {
            if (params[name] && params[name].name) {
                params[name] = params[name].name
            }
        }
        if (params.choices !== undefined) {
            let choices_str = _choices_to_array(params.choices).map(String).join(', ')
            params.choices = choices_str
        }
        // LEGACY (v1 compatibility): camelcase
        for (let key of Object.keys(params)) {
            let old_name = _to_legacy_name(key)
            if (old_name !== key) {
                params[old_name] = params[key]
            }
        }
        // end
        return sub(this._get_help_string(action), params)
    }

    * _iter_indented_subactions(action) {
        if (typeof action._get_subactions === 'function') {
            this._indent()
            yield* action._get_subactions()
            this._dedent()
        }
    }

    _split_lines(text, width) {
        text = text.replace(this._whitespace_matcher, ' ').trim()
        // The textwrap module is used only for formatting help.
        // Delay its import for speeding up the common usage of argparse.
        let textwrap = require('./lib/textwrap')
        return textwrap.wrap(text, { width })
    }

    _fill_text(text, width, indent) {
        text = text.replace(this._whitespace_matcher, ' ').trim()
        let textwrap = require('./lib/textwrap')
        return textwrap.fill(text, { width,
                                     initial_indent: indent,
                                     subsequent_indent: indent })
    }

    _get_help_string(action) {
        return action.help
    }

    _get_default_metavar_for_optional(action) {
        return action.dest.toUpperCase()
    }

    _get_default_metavar_for_positional(action) {
        return action.dest
    }
}))

HelpFormatter.prototype._Section = _callable(class _Section {

    constructor(formatter, parent, heading = undefined) {
        this.formatter = formatter
        this.parent = parent
        this.heading = heading
        this.items = []
    }

    format_help() {
        // format the indented section
        if (this.parent !== undefined) {
            this.formatter._indent()
        }
        let item_help = this.formatter._join_parts(this.items.map(([ func, args ]) => func.apply(null, args)))
        if (this.parent !== undefined) {
            this.formatter._dedent()
        }

        // return nothing if the section was empty
        if (!item_help) {
            return ''
        }

        // add the heading if the section was non-empty
        let heading
        if (this.heading !== SUPPRESS && this.heading !== undefined) {
            let current_indent = this.formatter._current_indent
            heading = sub('%*s%s:\n', current_indent, '', this.heading)
        } else {
            heading = ''
        }

        // join the section-initial newline, the heading and the help
        return this.formatter._join_parts(['\n', heading, item_help, '\n'])
    }
})


const RawDescriptionHelpFormatter = _camelcase_alias(_callable(class RawDescriptionHelpFormatter extends HelpFormatter {
    /*
     *  Help message formatter which retains any formatting in descriptions.
     *
     *  Only the name of this class is considered a public API. All the methods
     *  provided by the class are considered an implementation detail.
     */

    _fill_text(text, width, indent) {
        return splitlines(text, true).map(line => indent + line).join('')
    }
}))


const RawTextHelpFormatter = _camelcase_alias(_callable(class RawTextHelpFormatter extends RawDescriptionHelpFormatter {
    /*
     *  Help message formatter which retains formatting of all help text.
     *
     *  Only the name of this class is considered a public API. All the methods
     *  provided by the class are considered an implementation detail.
     */

    _split_lines(text/*, width*/) {
        return splitlines(text)
    }
}))


const ArgumentDefaultsHelpFormatter = _camelcase_alias(_callable(class ArgumentDefaultsHelpFormatter extends HelpFormatter {
    /*
     *  Help message formatter which adds default values to argument help.
     *
     *  Only the name of this class is considered a public API. All the methods
     *  provided by the class are considered an implementation detail.
     */

    _get_help_string(action) {
        let help = action.help
        // LEGACY (v1 compatibility): additional check for defaultValue needed
        if (!action.help.includes('%(default)') && !action.help.includes('%(defaultValue)')) {
            if (action.default !== SUPPRESS) {
                let defaulting_nargs = [OPTIONAL, ZERO_OR_MORE]
                if (action.option_strings.length || defaulting_nargs.includes(action.nargs)) {
                    help += ' (default: %(default)s)'
                }
            }
        }
        return help
    }
}))


const MetavarTypeHelpFormatter = _camelcase_alias(_callable(class MetavarTypeHelpFormatter extends HelpFormatter {
    /*
     *  Help message formatter which uses the argument 'type' as the default
     *  metavar value (instead of the argument 'dest')
     *
     *  Only the name of this class is considered a public API. All the methods
     *  provided by the class are considered an implementation detail.
     */

    _get_default_metavar_for_optional(action) {
        return typeof action.type === 'function' ? action.type.name : action.type
    }

    _get_default_metavar_for_positional(action) {
        return typeof action.type === 'function' ? action.type.name : action.type
    }
}))


// =====================
// Options and Arguments
// =====================
function _get_action_name(argument) {
    if (argument === undefined) {
        return undefined
    } else if (argument.option_strings.length) {
        return argument.option_strings.join('/')
    } else if (![ undefined, SUPPRESS ].includes(argument.metavar)) {
        return argument.metavar
    } else if (![ undefined, SUPPRESS ].includes(argument.dest)) {
        return argument.dest
    } else {
        return undefined
    }
}


const ArgumentError = _callable(class ArgumentError extends Error {
    /*
     *  An error from creating or using an argument (optional or positional).
     *
     *  The string value of this exception is the message, augmented with
     *  information about the argument that caused it.
     */

    constructor(argument, message) {
        super()
        this.name = 'ArgumentError'
        this._argument_name = _get_action_name(argument)
        this._message = message
        this.message = this.str()
    }

    str() {
        let format
        if (this._argument_name === undefined) {
            format = '%(message)s'
        } else {
            format = 'argument %(argument_name)s: %(message)s'
        }
        return sub(format, { message: this._message,
                             argument_name: this._argument_name })
    }
})


const ArgumentTypeError = _callable(class ArgumentTypeError extends Error {
    /*
     * An error from trying to convert a command line string to a type.
     */

    constructor(message) {
        super(message)
        this.name = 'ArgumentTypeError'
    }
})


// ==============
// Action classes
// ==============
const Action = _camelcase_alias(_callable(class Action extends _AttributeHolder(Function) {
    /*
     *  Information about how to convert command line strings to Python objects.
     *
     *  Action objects are used by an ArgumentParser to represent the information
     *  needed to parse a single argument from one or more strings from the
     *  command line. The keyword arguments to the Action constructor are also
     *  all attributes of Action instances.
     *
     *  Keyword Arguments:
     *
     *      - option_strings -- A list of command-line option strings which
     *          should be associated with this action.
     *
     *      - dest -- The name of the attribute to hold the created object(s)
     *
     *      - nargs -- The number of command-line arguments that should be
     *          consumed. By default, one argument will be consumed and a single
     *          value will be produced.  Other values include:
     *              - N (an integer) consumes N arguments (and produces a list)
     *              - '?' consumes zero or one arguments
     *              - '*' consumes zero or more arguments (and produces a list)
     *              - '+' consumes one or more arguments (and produces a list)
     *          Note that the difference between the default and nargs=1 is that
     *          with the default, a single value will be produced, while with
     *          nargs=1, a list containing a single value will be produced.
     *
     *      - const -- The value to be produced if the option is specified and the
     *          option uses an action that takes no values.
     *
     *      - default -- The value to be produced if the option is not specified.
     *
     *      - type -- A callable that accepts a single string argument, and
     *          returns the converted value.  The standard Python types str, int,
     *          float, and complex are useful examples of such callables.  If None,
     *          str is used.
     *
     *      - choices -- A container of values that should be allowed. If not None,
     *          after a command-line argument has been converted to the appropriate
     *          type, an exception will be raised if it is not a member of this
     *          collection.
     *
     *      - required -- True if the action must always be specified at the
     *          command line. This is only meaningful for optional command-line
     *          arguments.
     *
     *      - help -- The help string describing the argument.
     *
     *      - metavar -- The name to be used for the option's argument with the
     *          help string. If None, the 'dest' value will be used as the name.
     */

    constructor() {
        let [
            option_strings,
            dest,
            nargs,
            const_value,
            default_value,
            type,
            choices,
            required,
            help,
            metavar
        ] = _parse_opts(arguments, {
            option_strings: no_default,
            dest: no_default,
            nargs: undefined,
            const: undefined,
            default: undefined,
            type: undefined,
            choices: undefined,
            required: false,
            help: undefined,
            metavar: undefined
        })

        // when this class is called as a function, redirect it to .call() method of itself
        super('return arguments.callee.call.apply(arguments.callee, arguments)')

        this.option_strings = option_strings
        this.dest = dest
        this.nargs = nargs
        this.const = const_value
        this.default = default_value
        this.type = type
        this.choices = choices
        this.required = required
        this.help = help
        this.metavar = metavar
    }

    _get_kwargs() {
        let names = [
            'option_strings',
            'dest',
            'nargs',
            'const',
            'default',
            'type',
            'choices',
            'help',
            'metavar'
        ]
        return names.map(name => [ name, getattr(this, name) ])
    }

    format_usage() {
        return this.option_strings[0]
    }

    call(/*parser, namespace, values, option_string = undefined*/) {
        throw new Error('.call() not defined')
    }
}))


const BooleanOptionalAction = _camelcase_alias(_callable(class BooleanOptionalAction extends Action {

    constructor() {
        let [
            option_strings,
            dest,
            default_value,
            type,
            choices,
            required,
            help,
            metavar
        ] = _parse_opts(arguments, {
            option_strings: no_default,
            dest: no_default,
            default: undefined,
            type: undefined,
            choices: undefined,
            required: false,
            help: undefined,
            metavar: undefined
        })

        let _option_strings = []
        for (let option_string of option_strings) {
            _option_strings.push(option_string)

            if (option_string.startsWith('--')) {
                option_string = '--no-' + option_string.slice(2)
                _option_strings.push(option_string)
            }
        }

        if (help !== undefined && default_value !== undefined) {
            help += ` (default: ${default_value})`
        }

        super({
            option_strings: _option_strings,
            dest,
            nargs: 0,
            default: default_value,
            type,
            choices,
            required,
            help,
            metavar
        })
    }

    call(parser, namespace, values, option_string = undefined) {
        if (this.option_strings.includes(option_string)) {
            setattr(namespace, this.dest, !option_string.startsWith('--no-'))
        }
    }

    format_usage() {
        return this.option_strings.join(' | ')
    }
}))


const _StoreAction = _callable(class _StoreAction extends Action {

    constructor() {
        let [
            option_strings,
            dest,
            nargs,
            const_value,
            default_value,
            type,
            choices,
            required,
            help,
            metavar
        ] = _parse_opts(arguments, {
            option_strings: no_default,
            dest: no_default,
            nargs: undefined,
            const: undefined,
            default: undefined,
            type: undefined,
            choices: undefined,
            required: false,
            help: undefined,
            metavar: undefined
        })

        if (nargs === 0) {
            throw new TypeError('nargs for store actions must be != 0; if you ' +
                        'have nothing to store, actions such as store ' +
                        'true or store const may be more appropriate')
        }
        if (const_value !== undefined && nargs !== OPTIONAL) {
            throw new TypeError(sub('nargs must be %r to supply const', OPTIONAL))
        }
        super({
            option_strings,
            dest,
            nargs,
            const: const_value,
            default: default_value,
            type,
            choices,
            required,
            help,
            metavar
        })
    }

    call(parser, namespace, values/*, option_string = undefined*/) {
        setattr(namespace, this.dest, values)
    }
})


const _StoreConstAction = _callable(class _StoreConstAction extends Action {

    constructor() {
        let [
            option_strings,
            dest,
            const_value,
            default_value,
            required,
            help
            //, metavar
        ] = _parse_opts(arguments, {
            option_strings: no_default,
            dest: no_default,
            const: no_default,
            default: undefined,
            required: false,
            help: undefined,
            metavar: undefined
        })

        super({
            option_strings,
            dest,
            nargs: 0,
            const: const_value,
            default: default_value,
            required,
            help
        })
    }

    call(parser, namespace/*, values, option_string = undefined*/) {
        setattr(namespace, this.dest, this.const)
    }
})


const _StoreTrueAction = _callable(class _StoreTrueAction extends _StoreConstAction {

    constructor() {
        let [
            option_strings,
            dest,
            default_value,
            required,
            help
        ] = _parse_opts(arguments, {
            option_strings: no_default,
            dest: no_default,
            default: false,
            required: false,
            help: undefined
        })

        super({
            option_strings,
            dest,
            const: true,
            default: default_value,
            required,
            help
        })
    }
})


const _StoreFalseAction = _callable(class _StoreFalseAction extends _StoreConstAction {

    constructor() {
        let [
            option_strings,
            dest,
            default_value,
            required,
            help
        ] = _parse_opts(arguments, {
            option_strings: no_default,
            dest: no_default,
            default: true,
            required: false,
            help: undefined
        })

        super({
            option_strings,
            dest,
            const: false,
            default: default_value,
            required,
            help
        })
    }
})


const _AppendAction = _callable(class _AppendAction extends Action {

    constructor() {
        let [
            option_strings,
            dest,
            nargs,
            const_value,
            default_value,
            type,
            choices,
            required,
            help,
            metavar
        ] = _parse_opts(arguments, {
            option_strings: no_default,
            dest: no_default,
            nargs: undefined,
            const: undefined,
            default: undefined,
            type: undefined,
            choices: undefined,
            required: false,
            help: undefined,
            metavar: undefined
        })

        if (nargs === 0) {
            throw new TypeError('nargs for append actions must be != 0; if arg ' +
                        'strings are not supplying the value to append, ' +
                        'the append const action may be more appropriate')
        }
        if (const_value !== undefined && nargs !== OPTIONAL) {
            throw new TypeError(sub('nargs must be %r to supply const', OPTIONAL))
        }
        super({
            option_strings,
            dest,
            nargs,
            const: const_value,
            default: default_value,
            type,
            choices,
            required,
            help,
            metavar
        })
    }

    call(parser, namespace, values/*, option_string = undefined*/) {
        let items = getattr(namespace, this.dest, undefined)
        items = _copy_items(items)
        items.push(values)
        setattr(namespace, this.dest, items)
    }
})


const _AppendConstAction = _callable(class _AppendConstAction extends Action {

    constructor() {
        let [
            option_strings,
            dest,
            const_value,
            default_value,
            required,
            help,
            metavar
        ] = _parse_opts(arguments, {
            option_strings: no_default,
            dest: no_default,
            const: no_default,
            default: undefined,
            required: false,
            help: undefined,
            metavar: undefined
        })

        super({
            option_strings,
            dest,
            nargs: 0,
            const: const_value,
            default: default_value,
            required,
            help,
            metavar
        })
    }

    call(parser, namespace/*, values, option_string = undefined*/) {
        let items = getattr(namespace, this.dest, undefined)
        items = _copy_items(items)
        items.push(this.const)
        setattr(namespace, this.dest, items)
    }
})


const _CountAction = _callable(class _CountAction extends Action {

    constructor() {
        let [
            option_strings,
            dest,
            default_value,
            required,
            help
        ] = _parse_opts(arguments, {
            option_strings: no_default,
            dest: no_default,
            default: undefined,
            required: false,
            help: undefined
        })

        super({
            option_strings,
            dest,
            nargs: 0,
            default: default_value,
            required,
            help
        })
    }

    call(parser, namespace/*, values, option_string = undefined*/) {
        let count = getattr(namespace, this.dest, undefined)
        if (count === undefined) {
            count = 0
        }
        setattr(namespace, this.dest, count + 1)
    }
})


const _HelpAction = _callable(class _HelpAction extends Action {

    constructor() {
        let [
            option_strings,
            dest,
            default_value,
            help
        ] = _parse_opts(arguments, {
            option_strings: no_default,
            dest: SUPPRESS,
            default: SUPPRESS,
            help: undefined
        })

        super({
            option_strings,
            dest,
            default: default_value,
            nargs: 0,
            help
        })
    }

    call(parser/*, namespace, values, option_string = undefined*/) {
        parser.print_help()
        parser.exit()
    }
})


const _VersionAction = _callable(class _VersionAction extends Action {

    constructor() {
        let [
            option_strings,
            version,
            dest,
            default_value,
            help
        ] = _parse_opts(arguments, {
            option_strings: no_default,
            version: undefined,
            dest: SUPPRESS,
            default: SUPPRESS,
            help: "show program's version number and exit"
        })

        super({
            option_strings,
            dest,
            default: default_value,
            nargs: 0,
            help
        })
        this.version = version
    }

    call(parser/*, namespace, values, option_string = undefined*/) {
        let version = this.version
        if (version === undefined) {
            version = parser.version
        }
        let formatter = parser._get_formatter()
        formatter.add_text(version)
        parser._print_message(formatter.format_help(), process.stdout)
        parser.exit()
    }
})


const _SubParsersAction = _camelcase_alias(_callable(class _SubParsersAction extends Action {

    constructor() {
        let [
            option_strings,
            prog,
            parser_class,
            dest,
            required,
            help,
            metavar
        ] = _parse_opts(arguments, {
            option_strings: no_default,
            prog: no_default,
            parser_class: no_default,
            dest: SUPPRESS,
            required: false,
            help: undefined,
            metavar: undefined
        })

        let name_parser_map = {}

        super({
            option_strings,
            dest,
            nargs: PARSER,
            choices: name_parser_map,
            required,
            help,
            metavar
        })

        this._prog_prefix = prog
        this._parser_class = parser_class
        this._name_parser_map = name_parser_map
        this._choices_actions = []
    }

    add_parser() {
        let [
            name,
            kwargs
        ] = _parse_opts(arguments, {
            name: no_default,
            '**kwargs': no_default
        })

        // set prog from the existing prefix
        if (kwargs.prog === undefined) {
            kwargs.prog = sub('%s %s', this._prog_prefix, name)
        }

        let aliases = getattr(kwargs, 'aliases', [])
        delete kwargs.aliases

        // create a pseudo-action to hold the choice help
        if ('help' in kwargs) {
            let help = kwargs.help
            delete kwargs.help
            let choice_action = this._ChoicesPseudoAction(name, aliases, help)
            this._choices_actions.push(choice_action)
        }

        // create the parser and add it to the map
        let parser = new this._parser_class(kwargs)
        this._name_parser_map[name] = parser

        // make parser available under aliases also
        for (let alias of aliases) {
            this._name_parser_map[alias] = parser
        }

        return parser
    }

    _get_subactions() {
        return this._choices_actions
    }

    call(parser, namespace, values/*, option_string = undefined*/) {
        let parser_name = values[0]
        let arg_strings = values.slice(1)

        // set the parser name if requested
        if (this.dest !== SUPPRESS) {
            setattr(namespace, this.dest, parser_name)
        }

        // select the parser
        if (hasattr(this._name_parser_map, parser_name)) {
            parser = this._name_parser_map[parser_name]
        } else {
            let args = {parser_name,
                        choices: this._name_parser_map.join(', ')}
            let msg = sub('unknown parser %(parser_name)r (choices: %(choices)s)', args)
            throw new ArgumentError(this, msg)
        }

        // parse all the remaining options into the namespace
        // store any unrecognized options on the object, so that the top
        // level parser can decide what to do with them

        // In case this subparser defines new defaults, we parse them
        // in a new namespace object and then update the original
        // namespace for the relevant parts.
        let subnamespace
        [ subnamespace, arg_strings ] = parser.parse_known_args(arg_strings, undefined)
        for (let [ key, value ] of Object.entries(subnamespace)) {
            setattr(namespace, key, value)
        }

        if (arg_strings.length) {
            setdefault(namespace, _UNRECOGNIZED_ARGS_ATTR, [])
            getattr(namespace, _UNRECOGNIZED_ARGS_ATTR).push(...arg_strings)
        }
    }
}))


_SubParsersAction.prototype._ChoicesPseudoAction = _callable(class _ChoicesPseudoAction extends Action {
    constructor(name, aliases, help) {
        let metavar = name, dest = name
        if (aliases.length) {
            metavar += sub(' (%s)', aliases.join(', '))
        }
        super({ option_strings: [], dest, help, metavar })
    }
})


const _ExtendAction = _callable(class _ExtendAction extends _AppendAction {
    call(parser, namespace, values/*, option_string = undefined*/) {
        let items = getattr(namespace, this.dest, undefined)
        items = _copy_items(items)
        items = items.concat(values)
        setattr(namespace, this.dest, items)
    }
})


// ==============
// Type classes
// ==============
const FileType = _callable(class FileType extends Function {
    /*
     *  Factory for creating file object types
     *
     *  Instances of FileType are typically passed as type= arguments to the
     *  ArgumentParser add_argument() method.
     *
     *  Keyword Arguments:
     *      - mode -- A string indicating how the file is to be opened. Accepts the
     *          same values as the builtin open() function.
     *      - bufsize -- The file's desired buffer size. Accepts the same values as
     *          the builtin open() function.
     *      - encoding -- The file's encoding. Accepts the same values as the
     *          builtin open() function.
     *      - errors -- A string indicating how encoding and decoding errors are to
     *          be handled. Accepts the same value as the builtin open() function.
     */

    constructor() {
        let [
            flags,
            encoding,
            mode,
            autoClose,
            emitClose,
            start,
            end,
            highWaterMark,
            fs
        ] = _parse_opts(arguments, {
            flags: 'r',
            encoding: undefined,
            mode: undefined, // 0o666
            autoClose: undefined, // true
            emitClose: undefined, // false
            start: undefined, // 0
            end: undefined, // Infinity
            highWaterMark: undefined, // 64 * 1024
            fs: undefined
        })

        // when this class is called as a function, redirect it to .call() method of itself
        super('return arguments.callee.call.apply(arguments.callee, arguments)')

        Object.defineProperty(this, 'name', {
            get() {
                return sub('FileType(%r)', flags)
            }
        })
        this._flags = flags
        this._options = {}
        if (encoding !== undefined) this._options.encoding = encoding
        if (mode !== undefined) this._options.mode = mode
        if (autoClose !== undefined) this._options.autoClose = autoClose
        if (emitClose !== undefined) this._options.emitClose = emitClose
        if (start !== undefined) this._options.start = start
        if (end !== undefined) this._options.end = end
        if (highWaterMark !== undefined) this._options.highWaterMark = highWaterMark
        if (fs !== undefined) this._options.fs = fs
    }

    call(string) {
        // the special argument "-" means sys.std{in,out}
        if (string === '-') {
            if (this._flags.includes('r')) {
                return process.stdin
            } else if (this._flags.includes('w')) {
                return process.stdout
            } else {
                let msg = sub('argument "-" with mode %r', this._flags)
                throw new TypeError(msg)
            }
        }

        // all other arguments are used as file names
        let fd
        try {
            fd = fs.openSync(string, this._flags, this._options.mode)
        } catch (e) {
            let args = { filename: string, error: e.message }
            let message = "can't open '%(filename)s': %(error)s"
            throw new ArgumentTypeError(sub(message, args))
        }

        let options = Object.assign({ fd, flags: this._flags }, this._options)
        if (this._flags.includes('r')) {
            return fs.createReadStream(undefined, options)
        } else if (this._flags.includes('w')) {
            return fs.createWriteStream(undefined, options)
        } else {
            let msg = sub('argument "%s" with mode %r', string, this._flags)
            throw new TypeError(msg)
        }
    }

    [util.inspect.custom]() {
        let args = [ this._flags ]
        let kwargs = Object.entries(this._options).map(([ k, v ]) => {
            if (k === 'mode') v = { value: v, [util.inspect.custom]() { return '0o' + this.value.toString(8) } }
            return [ k, v ]
        })
        let args_str = []
                .concat(args.filter(arg => arg !== -1).map(repr))
                .concat(kwargs.filter(([/*kw*/, arg]) => arg !== undefined)
                    .map(([kw, arg]) => sub('%s=%r', kw, arg)))
                .join(', ')
        return sub('%s(%s)', this.constructor.name, args_str)
    }

    toString() {
        return this[util.inspect.custom]()
    }
})

// ===========================
// Optional and Positional Parsing
// ===========================
const Namespace = _callable(class Namespace extends _AttributeHolder() {
    /*
     *  Simple object for storing attributes.
     *
     *  Implements equality by attribute names and values, and provides a simple
     *  string representation.
     */

    constructor(options = {}) {
        super()
        Object.assign(this, options)
    }
})

// unset string tag to mimic plain object
Namespace.prototype[Symbol.toStringTag] = undefined


const _ActionsContainer = _camelcase_alias(_callable(class _ActionsContainer {

    constructor() {
        let [
            description,
            prefix_chars,
            argument_default,
            conflict_handler
        ] = _parse_opts(arguments, {
            description: no_default,
            prefix_chars: no_default,
            argument_default: no_default,
            conflict_handler: no_default
        })

        this.description = description
        this.argument_default = argument_default
        this.prefix_chars = prefix_chars
        this.conflict_handler = conflict_handler

        // set up registries
        this._registries = {}

        // register actions
        this.register('action', undefined, _StoreAction)
        this.register('action', 'store', _StoreAction)
        this.register('action', 'store_const', _StoreConstAction)
        this.register('action', 'store_true', _StoreTrueAction)
        this.register('action', 'store_false', _StoreFalseAction)
        this.register('action', 'append', _AppendAction)
        this.register('action', 'append_const', _AppendConstAction)
        this.register('action', 'count', _CountAction)
        this.register('action', 'help', _HelpAction)
        this.register('action', 'version', _VersionAction)
        this.register('action', 'parsers', _SubParsersAction)
        this.register('action', 'extend', _ExtendAction)
        // LEGACY (v1 compatibility): camelcase variants
        ;[ 'storeConst', 'storeTrue', 'storeFalse', 'appendConst' ].forEach(old_name => {
            let new_name = _to_new_name(old_name)
            this.register('action', old_name, util.deprecate(this._registry_get('action', new_name),
                sub('{action: "%s"} is renamed to {action: "%s"}', old_name, new_name)))
        })
        // end

        // raise an exception if the conflict handler is invalid
        this._get_handler()

        // action storage
        this._actions = []
        this._option_string_actions = {}

        // groups
        this._action_groups = []
        this._mutually_exclusive_groups = []

        // defaults storage
        this._defaults = {}

        // determines whether an "option" looks like a negative number
        this._negative_number_matcher = /^-\d+$|^-\d*\.\d+$/

        // whether or not there are any optionals that look like negative
        // numbers -- uses a list so it can be shared and edited
        this._has_negative_number_optionals = []
    }

    // ====================
    // Registration methods
    // ====================
    register(registry_name, value, object) {
        let registry = setdefault(this._registries, registry_name, {})
        registry[value] = object
    }

    _registry_get(registry_name, value, default_value = undefined) {
        return getattr(this._registries[registry_name], value, default_value)
    }

    // ==================================
    // Namespace default accessor methods
    // ==================================
    set_defaults(kwargs) {
        Object.assign(this._defaults, kwargs)

        // if these defaults match any existing arguments, replace
        // the previous default on the object with the new one
        for (let action of this._actions) {
            if (action.dest in kwargs) {
                action.default = kwargs[action.dest]
            }
        }
    }

    get_default(dest) {
        for (let action of this._actions) {
            if (action.dest === dest && action.default !== undefined) {
                return action.default
            }
        }
        return this._defaults[dest]
    }


    // =======================
    // Adding argument actions
    // =======================
    add_argument() {
        /*
         *  add_argument(dest, ..., name=value, ...)
         *  add_argument(option_string, option_string, ..., name=value, ...)
         */
        let [
            args,
            kwargs
        ] = _parse_opts(arguments, {
            '*args': no_default,
            '**kwargs': no_default
        })
        // LEGACY (v1 compatibility), old-style add_argument([ args ], { options })
        if (args.length === 1 && Array.isArray(args[0])) {
            args = args[0]
            deprecate('argument-array',
                sub('use add_argument(%(args)s, {...}) instead of add_argument([ %(args)s ], { ... })', {
                    args: args.map(repr).join(', ')
                }))
        }
        // end

        // if no positional args are supplied or only one is supplied and
        // it doesn't look like an option string, parse a positional
        // argument
        let chars = this.prefix_chars
        if (!args.length || args.length === 1 && !chars.includes(args[0][0])) {
            if (args.length && 'dest' in kwargs) {
                throw new TypeError('dest supplied twice for positional argument')
            }
            kwargs = this._get_positional_kwargs(...args, kwargs)

        // otherwise, we're adding an optional argument
        } else {
            kwargs = this._get_optional_kwargs(...args, kwargs)
        }

        // if no default was supplied, use the parser-level default
        if (!('default' in kwargs)) {
            let dest = kwargs.dest
            if (dest in this._defaults) {
                kwargs.default = this._defaults[dest]
            } else if (this.argument_default !== undefined) {
                kwargs.default = this.argument_default
            }
        }

        // create the action object, and add it to the parser
        let action_class = this._pop_action_class(kwargs)
        if (typeof action_class !== 'function') {
            throw new TypeError(sub('unknown action "%s"', action_class))
        }
        // eslint-disable-next-line new-cap
        let action = new action_class(kwargs)

        // raise an error if the action type is not callable
        let type_func = this._registry_get('type', action.type, action.type)
        if (typeof type_func !== 'function') {
            throw new TypeError(sub('%r is not callable', type_func))
        }

        if (type_func === FileType) {
            throw new TypeError(sub('%r is a FileType class object, instance of it' +
                                    ' must be passed', type_func))
        }

        // raise an error if the metavar does not match the type
        if ('_get_formatter' in this) {
            try {
                this._get_formatter()._format_args(action, undefined)
            } catch (err) {
                // check for 'invalid nargs value' is an artifact of TypeError and ValueError in js being the same
                if (err instanceof TypeError && err.message !== 'invalid nargs value') {
                    throw new TypeError('length of metavar tuple does not match nargs')
                } else {
                    throw err
                }
            }
        }

        return this._add_action(action)
    }

    add_argument_group() {
        let group = _ArgumentGroup(this, ...arguments)
        this._action_groups.push(group)
        return group
    }

    add_mutually_exclusive_group() {
        // eslint-disable-next-line no-use-before-define
        let group = _MutuallyExclusiveGroup(this, ...arguments)
        this._mutually_exclusive_groups.push(group)
        return group
    }

    _add_action(action) {
        // resolve any conflicts
        this._check_conflict(action)

        // add to actions list
        this._actions.push(action)
        action.container = this

        // index the action by any option strings it has
        for (let option_string of action.option_strings) {
            this._option_string_actions[option_string] = action
        }

        // set the flag if any option strings look like negative numbers
        for (let option_string of action.option_strings) {
            if (this._negative_number_matcher.test(option_string)) {
                if (!this._has_negative_number_optionals.length) {
                    this._has_negative_number_optionals.push(true)
                }
            }
        }

        // return the created action
        return action
    }

    _remove_action(action) {
        _array_remove(this._actions, action)
    }

    _add_container_actions(container) {
        // collect groups by titles
        let title_group_map = {}
        for (let group of this._action_groups) {
            if (group.title in title_group_map) {
                let msg = 'cannot merge actions - two groups are named %r'
                throw new TypeError(sub(msg, group.title))
            }
            title_group_map[group.title] = group
        }

        // map each action to its group
        let group_map = new Map()
        for (let group of container._action_groups) {

            // if a group with the title exists, use that, otherwise
            // create a new group matching the container's group
            if (!(group.title in title_group_map)) {
                title_group_map[group.title] = this.add_argument_group({
                    title: group.title,
                    description: group.description,
                    conflict_handler: group.conflict_handler
                })
            }

            // map the actions to their new group
            for (let action of group._group_actions) {
                group_map.set(action, title_group_map[group.title])
            }
        }

        // add container's mutually exclusive groups
        // NOTE: if add_mutually_exclusive_group ever gains title= and
        // description= then this code will need to be expanded as above
        for (let group of container._mutually_exclusive_groups) {
            let mutex_group = this.add_mutually_exclusive_group({
                required: group.required
            })

            // map the actions to their new mutex group
            for (let action of group._group_actions) {
                group_map.set(action, mutex_group)
            }
        }

        // add all actions to this container or their group
        for (let action of container._actions) {
            group_map.get(action)._add_action(action)
        }
    }

    _get_positional_kwargs() {
        let [
            dest,
            kwargs
        ] = _parse_opts(arguments, {
            dest: no_default,
            '**kwargs': no_default
        })

        // make sure required is not specified
        if ('required' in kwargs) {
            let msg = "'required' is an invalid argument for positionals"
            throw new TypeError(msg)
        }

        // mark positional arguments as required if at least one is
        // always required
        if (![OPTIONAL, ZERO_OR_MORE].includes(kwargs.nargs)) {
            kwargs.required = true
        }
        if (kwargs.nargs === ZERO_OR_MORE && !('default' in kwargs)) {
            kwargs.required = true
        }

        // return the keyword arguments with no option strings
        return Object.assign(kwargs, { dest, option_strings: [] })
    }

    _get_optional_kwargs() {
        let [
            args,
            kwargs
        ] = _parse_opts(arguments, {
            '*args': no_default,
            '**kwargs': no_default
        })

        // determine short and long option strings
        let option_strings = []
        let long_option_strings = []
        let option_string
        for (option_string of args) {
            // error on strings that don't start with an appropriate prefix
            if (!this.prefix_chars.includes(option_string[0])) {
                let args = {option: option_string,
                            prefix_chars: this.prefix_chars}
                let msg = 'invalid option string %(option)r: ' +
                          'must start with a character %(prefix_chars)r'
                throw new TypeError(sub(msg, args))
            }

            // strings starting with two prefix characters are long options
            option_strings.push(option_string)
            if (option_string.length > 1 && this.prefix_chars.includes(option_string[1])) {
                long_option_strings.push(option_string)
            }
        }

        // infer destination, '--foo-bar' -> 'foo_bar' and '-x' -> 'x'
        let dest = kwargs.dest
        delete kwargs.dest
        if (dest === undefined) {
            let dest_option_string
            if (long_option_strings.length) {
                dest_option_string = long_option_strings[0]
            } else {
                dest_option_string = option_strings[0]
            }
            dest = _string_lstrip(dest_option_string, this.prefix_chars)
            if (!dest) {
                let msg = 'dest= is required for options like %r'
                throw new TypeError(sub(msg, option_string))
            }
            dest = dest.replace(/-/g, '_')
        }

        // return the updated keyword arguments
        return Object.assign(kwargs, { dest, option_strings })
    }

    _pop_action_class(kwargs, default_value = undefined) {
        let action = getattr(kwargs, 'action', default_value)
        delete kwargs.action
        return this._registry_get('action', action, action)
    }

    _get_handler() {
        // determine function from conflict handler string
        let handler_func_name = sub('_handle_conflict_%s', this.conflict_handler)
        if (typeof this[handler_func_name] === 'function') {
            return this[handler_func_name]
        } else {
            let msg = 'invalid conflict_resolution value: %r'
            throw new TypeError(sub(msg, this.conflict_handler))
        }
    }

    _check_conflict(action) {

        // find all options that conflict with this option
        let confl_optionals = []
        for (let option_string of action.option_strings) {
            if (hasattr(this._option_string_actions, option_string)) {
                let confl_optional = this._option_string_actions[option_string]
                confl_optionals.push([ option_string, confl_optional ])
            }
        }

        // resolve any conflicts
        if (confl_optionals.length) {
            let conflict_handler = this._get_handler()
            conflict_handler.call(this, action, confl_optionals)
        }
    }

    _handle_conflict_error(action, conflicting_actions) {
        let message = conflicting_actions.length === 1 ?
            'conflicting option string: %s' :
            'conflicting option strings: %s'
        let conflict_string = conflicting_actions.map(([ option_string/*, action*/ ]) => option_string).join(', ')
        throw new ArgumentError(action, sub(message, conflict_string))
    }

    _handle_conflict_resolve(action, conflicting_actions) {

        // remove all conflicting options
        for (let [ option_string, action ] of conflicting_actions) {

            // remove the conflicting option
            _array_remove(action.option_strings, option_string)
            delete this._option_string_actions[option_string]

            // if the option now has no option string, remove it from the
            // container holding it
            if (!action.option_strings.length) {
                action.container._remove_action(action)
            }
        }
    }
}))


const _ArgumentGroup = _callable(class _ArgumentGroup extends _ActionsContainer {

    constructor() {
        let [
            container,
            title,
            description,
            kwargs
        ] = _parse_opts(arguments, {
            container: no_default,
            title: undefined,
            description: undefined,
            '**kwargs': no_default
        })

        // add any missing keyword arguments by checking the container
        setdefault(kwargs, 'conflict_handler', container.conflict_handler)
        setdefault(kwargs, 'prefix_chars', container.prefix_chars)
        setdefault(kwargs, 'argument_default', container.argument_default)
        super(Object.assign({ description }, kwargs))

        // group attributes
        this.title = title
        this._group_actions = []

        // share most attributes with the container
        this._registries = container._registries
        this._actions = container._actions
        this._option_string_actions = container._option_string_actions
        this._defaults = container._defaults
        this._has_negative_number_optionals =
            container._has_negative_number_optionals
        this._mutually_exclusive_groups = container._mutually_exclusive_groups
    }

    _add_action(action) {
        action = super._add_action(action)
        this._group_actions.push(action)
        return action
    }

    _remove_action(action) {
        super._remove_action(action)
        _array_remove(this._group_actions, action)
    }
})


const _MutuallyExclusiveGroup = _callable(class _MutuallyExclusiveGroup extends _ArgumentGroup {

    constructor() {
        let [
            container,
            required
        ] = _parse_opts(arguments, {
            container: no_default,
            required: false
        })

        super(container)
        this.required = required
        this._container = container
    }

    _add_action(action) {
        if (action.required) {
            let msg = 'mutually exclusive arguments must be optional'
            throw new TypeError(msg)
        }
        action = this._container._add_action(action)
        this._group_actions.push(action)
        return action
    }

    _remove_action(action) {
        this._container._remove_action(action)
        _array_remove(this._group_actions, action)
    }
})


const ArgumentParser = _camelcase_alias(_callable(class ArgumentParser extends _AttributeHolder(_ActionsContainer) {
    /*
     *  Object for parsing command line strings into Python objects.
     *
     *  Keyword Arguments:
     *      - prog -- The name of the program (default: sys.argv[0])
     *      - usage -- A usage message (default: auto-generated from arguments)
     *      - description -- A description of what the program does
     *      - epilog -- Text following the argument descriptions
     *      - parents -- Parsers whose arguments should be copied into this one
     *      - formatter_class -- HelpFormatter class for printing help messages
     *      - prefix_chars -- Characters that prefix optional arguments
     *      - fromfile_prefix_chars -- Characters that prefix files containing
     *          additional arguments
     *      - argument_default -- The default value for all arguments
     *      - conflict_handler -- String indicating how to handle conflicts
     *      - add_help -- Add a -h/-help option
     *      - allow_abbrev -- Allow long options to be abbreviated unambiguously
     *      - exit_on_error -- Determines whether or not ArgumentParser exits with
     *          error info when an error occurs
     */

    constructor() {
        let [
            prog,
            usage,
            description,
            epilog,
            parents,
            formatter_class,
            prefix_chars,
            fromfile_prefix_chars,
            argument_default,
            conflict_handler,
            add_help,
            allow_abbrev,
            exit_on_error,
            debug, // LEGACY (v1 compatibility), debug mode
            version // LEGACY (v1 compatibility), version
        ] = _parse_opts(arguments, {
            prog: undefined,
            usage: undefined,
            description: undefined,
            epilog: undefined,
            parents: [],
            formatter_class: HelpFormatter,
            prefix_chars: '-',
            fromfile_prefix_chars: undefined,
            argument_default: undefined,
            conflict_handler: 'error',
            add_help: true,
            allow_abbrev: true,
            exit_on_error: true,
            debug: undefined, // LEGACY (v1 compatibility), debug mode
            version: undefined // LEGACY (v1 compatibility), version
        })

        // LEGACY (v1 compatibility)
        if (debug !== undefined) {
            deprecate('debug',
                'The "debug" argument to ArgumentParser is deprecated. Please ' +
                'override ArgumentParser.exit function instead.'
            )
        }

        if (version !== undefined) {
            deprecate('version',
                'The "version" argument to ArgumentParser is deprecated. Please use ' +
                "add_argument(..., { action: 'version', version: 'N', ... }) instead."
            )
        }
        // end

        super({
            description,
            prefix_chars,
            argument_default,
            conflict_handler
        })

        // default setting for prog
        if (prog === undefined) {
            prog = path.basename(get_argv()[0] || '')
        }

        this.prog = prog
        this.usage = usage
        this.epilog = epilog
        this.formatter_class = formatter_class
        this.fromfile_prefix_chars = fromfile_prefix_chars
        this.add_help = add_help
        this.allow_abbrev = allow_abbrev
        this.exit_on_error = exit_on_error
        // LEGACY (v1 compatibility), debug mode
        this.debug = debug
        // end

        this._positionals = this.add_argument_group('positional arguments')
        this._optionals = this.add_argument_group('optional arguments')
        this._subparsers = undefined

        // register types
        function identity(string) {
            return string
        }
        this.register('type', undefined, identity)
        this.register('type', null, identity)
        this.register('type', 'auto', identity)
        this.register('type', 'int', function (x) {
            let result = Number(x)
            if (!Number.isInteger(result)) {
                throw new TypeError(sub('could not convert string to int: %r', x))
            }
            return result
        })
        this.register('type', 'float', function (x) {
            let result = Number(x)
            if (isNaN(result)) {
                throw new TypeError(sub('could not convert string to float: %r', x))
            }
            return result
        })
        this.register('type', 'str', String)
        // LEGACY (v1 compatibility): custom types
        this.register('type', 'string',
            util.deprecate(String, 'use {type:"str"} or {type:String} instead of {type:"string"}'))
        // end

        // add help argument if necessary
        // (using explicit default to override global argument_default)
        let default_prefix = prefix_chars.includes('-') ? '-' : prefix_chars[0]
        if (this.add_help) {
            this.add_argument(
                default_prefix + 'h',
                default_prefix.repeat(2) + 'help',
                {
                    action: 'help',
                    default: SUPPRESS,
                    help: 'show this help message and exit'
                }
            )
        }
        // LEGACY (v1 compatibility), version
        if (version) {
            this.add_argument(
                default_prefix + 'v',
                default_prefix.repeat(2) + 'version',
                {
                    action: 'version',
                    default: SUPPRESS,
                    version: this.version,
                    help: "show program's version number and exit"
                }
            )
        }
        // end

        // add parent arguments and defaults
        for (let parent of parents) {
            this._add_container_actions(parent)
            Object.assign(this._defaults, parent._defaults)
        }
    }

    // =======================
    // Pretty __repr__ methods
    // =======================
    _get_kwargs() {
        let names = [
            'prog',
            'usage',
            'description',
            'formatter_class',
            'conflict_handler',
            'add_help'
        ]
        return names.map(name => [ name, getattr(this, name) ])
    }

    // ==================================
    // Optional/Positional adding methods
    // ==================================
    add_subparsers() {
        let [
            kwargs
        ] = _parse_opts(arguments, {
            '**kwargs': no_default
        })

        if (this._subparsers !== undefined) {
            this.error('cannot have multiple subparser arguments')
        }

        // add the parser class to the arguments if it's not present
        setdefault(kwargs, 'parser_class', this.constructor)

        if ('title' in kwargs || 'description' in kwargs) {
            let title = getattr(kwargs, 'title', 'subcommands')
            let description = getattr(kwargs, 'description', undefined)
            delete kwargs.title
            delete kwargs.description
            this._subparsers = this.add_argument_group(title, description)
        } else {
            this._subparsers = this._positionals
        }

        // prog defaults to the usage message of this parser, skipping
        // optional arguments and with no "usage:" prefix
        if (kwargs.prog === undefined) {
            let formatter = this._get_formatter()
            let positionals = this._get_positional_actions()
            let groups = this._mutually_exclusive_groups
            formatter.add_usage(this.usage, positionals, groups, '')
            kwargs.prog = formatter.format_help().trim()
        }

        // create the parsers action and add it to the positionals list
        let parsers_class = this._pop_action_class(kwargs, 'parsers')
        // eslint-disable-next-line new-cap
        let action = new parsers_class(Object.assign({ option_strings: [] }, kwargs))
        this._subparsers._add_action(action)

        // return the created parsers action
        return action
    }

    _add_action(action) {
        if (action.option_strings.length) {
            this._optionals._add_action(action)
        } else {
            this._positionals._add_action(action)
        }
        return action
    }

    _get_optional_actions() {
        return this._actions.filter(action => action.option_strings.length)
    }

    _get_positional_actions() {
        return this._actions.filter(action => !action.option_strings.length)
    }

    // =====================================
    // Command line argument parsing methods
    // =====================================
    parse_args(args = undefined, namespace = undefined) {
        let argv
        [ args, argv ] = this.parse_known_args(args, namespace)
        if (argv && argv.length > 0) {
            let msg = 'unrecognized arguments: %s'
            this.error(sub(msg, argv.join(' ')))
        }
        return args
    }

    parse_known_args(args = undefined, namespace = undefined) {
        if (args === undefined) {
            args = get_argv().slice(1)
        }

        // default Namespace built from parser defaults
        if (namespace === undefined) {
            namespace = new Namespace()
        }

        // add any action defaults that aren't present
        for (let action of this._actions) {
            if (action.dest !== SUPPRESS) {
                if (!hasattr(namespace, action.dest)) {
                    if (action.default !== SUPPRESS) {
                        setattr(namespace, action.dest, action.default)
                    }
                }
            }
        }

        // add any parser defaults that aren't present
        for (let dest of Object.keys(this._defaults)) {
            if (!hasattr(namespace, dest)) {
                setattr(namespace, dest, this._defaults[dest])
            }
        }

        // parse the arguments and exit if there are any errors
        if (this.exit_on_error) {
            try {
                [ namespace, args ] = this._parse_known_args(args, namespace)
            } catch (err) {
                if (err instanceof ArgumentError) {
                    this.error(err.message)
                } else {
                    throw err
                }
            }
        } else {
            [ namespace, args ] = this._parse_known_args(args, namespace)
        }

        if (hasattr(namespace, _UNRECOGNIZED_ARGS_ATTR)) {
            args = args.concat(getattr(namespace, _UNRECOGNIZED_ARGS_ATTR))
            delattr(namespace, _UNRECOGNIZED_ARGS_ATTR)
        }

        return [ namespace, args ]
    }

    _parse_known_args(arg_strings, namespace) {
        // replace arg strings that are file references
        if (this.fromfile_prefix_chars !== undefined) {
            arg_strings = this._read_args_from_files(arg_strings)
        }

        // map all mutually exclusive arguments to the other arguments
        // they can't occur with
        let action_conflicts = new Map()
        for (let mutex_group of this._mutually_exclusive_groups) {
            let group_actions = mutex_group._group_actions
            for (let [ i, mutex_action ] of Object.entries(mutex_group._group_actions)) {
                let conflicts = action_conflicts.get(mutex_action) || []
                conflicts = conflicts.concat(group_actions.slice(0, +i))
                conflicts = conflicts.concat(group_actions.slice(+i + 1))
                action_conflicts.set(mutex_action, conflicts)
            }
        }

        // find all option indices, and determine the arg_string_pattern
        // which has an 'O' if there is an option at an index,
        // an 'A' if there is an argument, or a '-' if there is a '--'
        let option_string_indices = {}
        let arg_string_pattern_parts = []
        let arg_strings_iter = Object.entries(arg_strings)[Symbol.iterator]()
        for (let [ i, arg_string ] of arg_strings_iter) {

            // all args after -- are non-options
            if (arg_string === '--') {
                arg_string_pattern_parts.push('-')
                for ([ i, arg_string ] of arg_strings_iter) {
                    arg_string_pattern_parts.push('A')
                }

            // otherwise, add the arg to the arg strings
            // and note the index if it was an option
            } else {
                let option_tuple = this._parse_optional(arg_string)
                let pattern
                if (option_tuple === undefined) {
                    pattern = 'A'
                } else {
                    option_string_indices[i] = option_tuple
                    pattern = 'O'
                }
                arg_string_pattern_parts.push(pattern)
            }
        }

        // join the pieces together to form the pattern
        let arg_strings_pattern = arg_string_pattern_parts.join('')

        // converts arg strings to the appropriate and then takes the action
        let seen_actions = new Set()
        let seen_non_default_actions = new Set()
        let extras

        let take_action = (action, argument_strings, option_string = undefined) => {
            seen_actions.add(action)
            let argument_values = this._get_values(action, argument_strings)

            // error if this argument is not allowed with other previously
            // seen arguments, assuming that actions that use the default
            // value don't really count as "present"
            if (argument_values !== action.default) {
                seen_non_default_actions.add(action)
                for (let conflict_action of action_conflicts.get(action) || []) {
                    if (seen_non_default_actions.has(conflict_action)) {
                        let msg = 'not allowed with argument %s'
                        let action_name = _get_action_name(conflict_action)
                        throw new ArgumentError(action, sub(msg, action_name))
                    }
                }
            }

            // take the action if we didn't receive a SUPPRESS value
            // (e.g. from a default)
            if (argument_values !== SUPPRESS) {
                action(this, namespace, argument_values, option_string)
            }
        }

        // function to convert arg_strings into an optional action
        let consume_optional = start_index => {

            // get the optional identified at this index
            let option_tuple = option_string_indices[start_index]
            let [ action, option_string, explicit_arg ] = option_tuple

            // identify additional optionals in the same arg string
            // (e.g. -xyz is the same as -x -y -z if no args are required)
            let action_tuples = []
            let stop
            for (;;) {

                // if we found no optional action, skip it
                if (action === undefined) {
                    extras.push(arg_strings[start_index])
                    return start_index + 1
                }

                // if there is an explicit argument, try to match the
                // optional's string arguments to only this
                if (explicit_arg !== undefined) {
                    let arg_count = this._match_argument(action, 'A')

                    // if the action is a single-dash option and takes no
                    // arguments, try to parse more single-dash options out
                    // of the tail of the option string
                    let chars = this.prefix_chars
                    if (arg_count === 0 && !chars.includes(option_string[1])) {
                        action_tuples.push([ action, [], option_string ])
                        let char = option_string[0]
                        option_string = char + explicit_arg[0]
                        let new_explicit_arg = explicit_arg.slice(1) || undefined
                        let optionals_map = this._option_string_actions
                        if (hasattr(optionals_map, option_string)) {
                            action = optionals_map[option_string]
                            explicit_arg = new_explicit_arg
                        } else {
                            let msg = 'ignored explicit argument %r'
                            throw new ArgumentError(action, sub(msg, explicit_arg))
                        }

                    // if the action expect exactly one argument, we've
                    // successfully matched the option; exit the loop
                    } else if (arg_count === 1) {
                        stop = start_index + 1
                        let args = [ explicit_arg ]
                        action_tuples.push([ action, args, option_string ])
                        break

                    // error if a double-dash option did not use the
                    // explicit argument
                    } else {
                        let msg = 'ignored explicit argument %r'
                        throw new ArgumentError(action, sub(msg, explicit_arg))
                    }

                // if there is no explicit argument, try to match the
                // optional's string arguments with the following strings
                // if successful, exit the loop
                } else {
                    let start = start_index + 1
                    let selected_patterns = arg_strings_pattern.slice(start)
                    let arg_count = this._match_argument(action, selected_patterns)
                    stop = start + arg_count
                    let args = arg_strings.slice(start, stop)
                    action_tuples.push([ action, args, option_string ])
                    break
                }
            }

            // add the Optional to the list and return the index at which
            // the Optional's string args stopped
            assert(action_tuples.length)
            for (let [ action, args, option_string ] of action_tuples) {
                take_action(action, args, option_string)
            }
            return stop
        }

        // the list of Positionals left to be parsed; this is modified
        // by consume_positionals()
        let positionals = this._get_positional_actions()

        // function to convert arg_strings into positional actions
        let consume_positionals = start_index => {
            // match as many Positionals as possible
            let selected_pattern = arg_strings_pattern.slice(start_index)
            let arg_counts = this._match_arguments_partial(positionals, selected_pattern)

            // slice off the appropriate arg strings for each Positional
            // and add the Positional and its args to the list
            for (let i = 0; i < positionals.length && i < arg_counts.length; i++) {
                let action = positionals[i]
                let arg_count = arg_counts[i]
                let args = arg_strings.slice(start_index, start_index + arg_count)
                start_index += arg_count
                take_action(action, args)
            }

            // slice off the Positionals that we just parsed and return the
            // index at which the Positionals' string args stopped
            positionals = positionals.slice(arg_counts.length)
            return start_index
        }

        // consume Positionals and Optionals alternately, until we have
        // passed the last option string
        extras = []
        let start_index = 0
        let max_option_string_index = Math.max(-1, ...Object.keys(option_string_indices).map(Number))
        while (start_index <= max_option_string_index) {

            // consume any Positionals preceding the next option
            let next_option_string_index = Math.min(
                // eslint-disable-next-line no-loop-func
                ...Object.keys(option_string_indices).map(Number).filter(index => index >= start_index)
            )
            if (start_index !== next_option_string_index) {
                let positionals_end_index = consume_positionals(start_index)

                // only try to parse the next optional if we didn't consume
                // the option string during the positionals parsing
                if (positionals_end_index > start_index) {
                    start_index = positionals_end_index
                    continue
                } else {
                    start_index = positionals_end_index
                }
            }

            // if we consumed all the positionals we could and we're not
            // at the index of an option string, there were extra arguments
            if (!(start_index in option_string_indices)) {
                let strings = arg_strings.slice(start_index, next_option_string_index)
                extras = extras.concat(strings)
                start_index = next_option_string_index
            }

            // consume the next optional and any arguments for it
            start_index = consume_optional(start_index)
        }

        // consume any positionals following the last Optional
        let stop_index = consume_positionals(start_index)

        // if we didn't consume all the argument strings, there were extras
        extras = extras.concat(arg_strings.slice(stop_index))

        // make sure all required actions were present and also convert
        // action defaults which were not given as arguments
        let required_actions = []
        for (let action of this._actions) {
            if (!seen_actions.has(action)) {
                if (action.required) {
                    required_actions.push(_get_action_name(action))
                } else {
                    // Convert action default now instead of doing it before
                    // parsing arguments to avoid calling convert functions
                    // twice (which may fail) if the argument was given, but
                    // only if it was defined already in the namespace
                    if (action.default !== undefined &&
                        typeof action.default === 'string' &&
                        hasattr(namespace, action.dest) &&
                        action.default === getattr(namespace, action.dest)) {
                        setattr(namespace, action.dest,
                                this._get_value(action, action.default))
                    }
                }
            }
        }

        if (required_actions.length) {
            this.error(sub('the following arguments are required: %s',
                       required_actions.join(', ')))
        }

        // make sure all required groups had one option present
        for (let group of this._mutually_exclusive_groups) {
            if (group.required) {
                let no_actions_used = true
                for (let action of group._group_actions) {
                    if (seen_non_default_actions.has(action)) {
                        no_actions_used = false
                        break
                    }
                }

                // if no actions were used, report the error
                if (no_actions_used) {
                    let names = group._group_actions
                        .filter(action => action.help !== SUPPRESS)
                        .map(action => _get_action_name(action))
                    let msg = 'one of the arguments %s is required'
                    this.error(sub(msg, names.join(' ')))
                }
            }
        }

        // return the updated namespace and the extra arguments
        return [ namespace, extras ]
    }

    _read_args_from_files(arg_strings) {
        // expand arguments referencing files
        let new_arg_strings = []
        for (let arg_string of arg_strings) {

            // for regular arguments, just add them back into the list
            if (!arg_string || !this.fromfile_prefix_chars.includes(arg_string[0])) {
                new_arg_strings.push(arg_string)

            // replace arguments referencing files with the file content
            } else {
                try {
                    let args_file = fs.readFileSync(arg_string.slice(1), 'utf8')
                    let arg_strings = []
                    for (let arg_line of splitlines(args_file)) {
                        for (let arg of this.convert_arg_line_to_args(arg_line)) {
                            arg_strings.push(arg)
                        }
                    }
                    arg_strings = this._read_args_from_files(arg_strings)
                    new_arg_strings = new_arg_strings.concat(arg_strings)
                } catch (err) {
                    this.error(err.message)
                }
            }
        }

        // return the modified argument list
        return new_arg_strings
    }

    convert_arg_line_to_args(arg_line) {
        return [arg_line]
    }

    _match_argument(action, arg_strings_pattern) {
        // match the pattern for this action to the arg strings
        let nargs_pattern = this._get_nargs_pattern(action)
        let match = arg_strings_pattern.match(new RegExp('^' + nargs_pattern))

        // raise an exception if we weren't able to find a match
        if (match === null) {
            let nargs_errors = {
                undefined: 'expected one argument',
                [OPTIONAL]: 'expected at most one argument',
                [ONE_OR_MORE]: 'expected at least one argument'
            }
            let msg = nargs_errors[action.nargs]
            if (msg === undefined) {
                msg = sub(action.nargs === 1 ? 'expected %s argument' : 'expected %s arguments', action.nargs)
            }
            throw new ArgumentError(action, msg)
        }

        // return the number of arguments matched
        return match[1].length
    }

    _match_arguments_partial(actions, arg_strings_pattern) {
        // progressively shorten the actions list by slicing off the
        // final actions until we find a match
        let result = []
        for (let i of range(actions.length, 0, -1)) {
            let actions_slice = actions.slice(0, i)
            let pattern = actions_slice.map(action => this._get_nargs_pattern(action)).join('')
            let match = arg_strings_pattern.match(new RegExp('^' + pattern))
            if (match !== null) {
                result = result.concat(match.slice(1).map(string => string.length))
                break
            }
        }

        // return the list of arg string counts
        return result
    }

    _parse_optional(arg_string) {
        // if it's an empty string, it was meant to be a positional
        if (!arg_string) {
            return undefined
        }

        // if it doesn't start with a prefix, it was meant to be positional
        if (!this.prefix_chars.includes(arg_string[0])) {
            return undefined
        }

        // if the option string is present in the parser, return the action
        if (arg_string in this._option_string_actions) {
            let action = this._option_string_actions[arg_string]
            return [ action, arg_string, undefined ]
        }

        // if it's just a single character, it was meant to be positional
        if (arg_string.length === 1) {
            return undefined
        }

        // if the option string before the "=" is present, return the action
        if (arg_string.includes('=')) {
            let [ option_string, explicit_arg ] = _string_split(arg_string, '=', 1)
            if (option_string in this._option_string_actions) {
                let action = this._option_string_actions[option_string]
                return [ action, option_string, explicit_arg ]
            }
        }

        // search through all possible prefixes of the option string
        // and all actions in the parser for possible interpretations
        let option_tuples = this._get_option_tuples(arg_string)

        // if multiple actions match, the option string was ambiguous
        if (option_tuples.length > 1) {
            let options = option_tuples.map(([ /*action*/, option_string/*, explicit_arg*/ ]) => option_string).join(', ')
            let args = {option: arg_string, matches: options}
            let msg = 'ambiguous option: %(option)s could match %(matches)s'
            this.error(sub(msg, args))

        // if exactly one action matched, this segmentation is good,
        // so return the parsed action
        } else if (option_tuples.length === 1) {
            let [ option_tuple ] = option_tuples
            return option_tuple
        }

        // if it was not found as an option, but it looks like a negative
        // number, it was meant to be positional
        // unless there are negative-number-like options
        if (this._negative_number_matcher.test(arg_string)) {
            if (!this._has_negative_number_optionals.length) {
                return undefined
            }
        }

        // if it contains a space, it was meant to be a positional
        if (arg_string.includes(' ')) {
            return undefined
        }

        // it was meant to be an optional but there is no such option
        // in this parser (though it might be a valid option in a subparser)
        return [ undefined, arg_string, undefined ]
    }

    _get_option_tuples(option_string) {
        let result = []

        // option strings starting with two prefix characters are only
        // split at the '='
        let chars = this.prefix_chars
        if (chars.includes(option_string[0]) && chars.includes(option_string[1])) {
            if (this.allow_abbrev) {
                let option_prefix, explicit_arg
                if (option_string.includes('=')) {
                    [ option_prefix, explicit_arg ] = _string_split(option_string, '=', 1)
                } else {
                    option_prefix = option_string
                    explicit_arg = undefined
                }
                for (let option_string of Object.keys(this._option_string_actions)) {
                    if (option_string.startsWith(option_prefix)) {
                        let action = this._option_string_actions[option_string]
                        let tup = [ action, option_string, explicit_arg ]
                        result.push(tup)
                    }
                }
            }

        // single character options can be concatenated with their arguments
        // but multiple character options always have to have their argument
        // separate
        } else if (chars.includes(option_string[0]) && !chars.includes(option_string[1])) {
            let option_prefix = option_string
            let explicit_arg = undefined
            let short_option_prefix = option_string.slice(0, 2)
            let short_explicit_arg = option_string.slice(2)

            for (let option_string of Object.keys(this._option_string_actions)) {
                if (option_string === short_option_prefix) {
                    let action = this._option_string_actions[option_string]
                    let tup = [ action, option_string, short_explicit_arg ]
                    result.push(tup)
                } else if (option_string.startsWith(option_prefix)) {
                    let action = this._option_string_actions[option_string]
                    let tup = [ action, option_string, explicit_arg ]
                    result.push(tup)
                }
            }

        // shouldn't ever get here
        } else {
            this.error(sub('unexpected option string: %s', option_string))
        }

        // return the collected option tuples
        return result
    }

    _get_nargs_pattern(action) {
        // in all examples below, we have to allow for '--' args
        // which are represented as '-' in the pattern
        let nargs = action.nargs
        let nargs_pattern

        // the default (None) is assumed to be a single argument
        if (nargs === undefined) {
            nargs_pattern = '(-*A-*)'

        // allow zero or one arguments
        } else if (nargs === OPTIONAL) {
            nargs_pattern = '(-*A?-*)'

        // allow zero or more arguments
        } else if (nargs === ZERO_OR_MORE) {
            nargs_pattern = '(-*[A-]*)'

        // allow one or more arguments
        } else if (nargs === ONE_OR_MORE) {
            nargs_pattern = '(-*A[A-]*)'

        // allow any number of options or arguments
        } else if (nargs === REMAINDER) {
            nargs_pattern = '([-AO]*)'

        // allow one argument followed by any number of options or arguments
        } else if (nargs === PARSER) {
            nargs_pattern = '(-*A[-AO]*)'

        // suppress action, like nargs=0
        } else if (nargs === SUPPRESS) {
            nargs_pattern = '(-*-*)'

        // all others should be integers
        } else {
            nargs_pattern = sub('(-*%s-*)', 'A'.repeat(nargs).split('').join('-*'))
        }

        // if this is an optional action, -- is not allowed
        if (action.option_strings.length) {
            nargs_pattern = nargs_pattern.replace(/-\*/g, '')
            nargs_pattern = nargs_pattern.replace(/-/g, '')
        }

        // return the pattern
        return nargs_pattern
    }

    // ========================
    // Alt command line argument parsing, allowing free intermix
    // ========================

    parse_intermixed_args(args = undefined, namespace = undefined) {
        let argv
        [ args, argv ] = this.parse_known_intermixed_args(args, namespace)
        if (argv.length) {
            let msg = 'unrecognized arguments: %s'
            this.error(sub(msg, argv.join(' ')))
        }
        return args
    }

    parse_known_intermixed_args(args = undefined, namespace = undefined) {
        // returns a namespace and list of extras
        //
        // positional can be freely intermixed with optionals.  optionals are
        // first parsed with all positional arguments deactivated.  The 'extras'
        // are then parsed.  If the parser definition is incompatible with the
        // intermixed assumptions (e.g. use of REMAINDER, subparsers) a
        // TypeError is raised.
        //
        // positionals are 'deactivated' by setting nargs and default to
        // SUPPRESS.  This blocks the addition of that positional to the
        // namespace

        let extras
        let positionals = this._get_positional_actions()
        let a = positionals.filter(action => [ PARSER, REMAINDER ].includes(action.nargs))
        if (a.length) {
            throw new TypeError(sub('parse_intermixed_args: positional arg' +
                                    ' with nargs=%s', a[0].nargs))
        }

        for (let group of this._mutually_exclusive_groups) {
            for (let action of group._group_actions) {
                if (positionals.includes(action)) {
                    throw new TypeError('parse_intermixed_args: positional in' +
                                        ' mutuallyExclusiveGroup')
                }
            }
        }

        let save_usage
        try {
            save_usage = this.usage
            let remaining_args
            try {
                if (this.usage === undefined) {
                    // capture the full usage for use in error messages
                    this.usage = this.format_usage().slice(7)
                }
                for (let action of positionals) {
                    // deactivate positionals
                    action.save_nargs = action.nargs
                    // action.nargs = 0
                    action.nargs = SUPPRESS
                    action.save_default = action.default
                    action.default = SUPPRESS
                }
                [ namespace, remaining_args ] = this.parse_known_args(args,
                                                                      namespace)
                for (let action of positionals) {
                    // remove the empty positional values from namespace
                    let attr = getattr(namespace, action.dest)
                    if (Array.isArray(attr) && attr.length === 0) {
                        // eslint-disable-next-line no-console
                        console.warn(sub('Do not expect %s in %s', action.dest, namespace))
                        delattr(namespace, action.dest)
                    }
                }
            } finally {
                // restore nargs and usage before exiting
                for (let action of positionals) {
                    action.nargs = action.save_nargs
                    action.default = action.save_default
                }
            }
            let optionals = this._get_optional_actions()
            try {
                // parse positionals.  optionals aren't normally required, but
                // they could be, so make sure they aren't.
                for (let action of optionals) {
                    action.save_required = action.required
                    action.required = false
                }
                for (let group of this._mutually_exclusive_groups) {
                    group.save_required = group.required
                    group.required = false
                }
                [ namespace, extras ] = this.parse_known_args(remaining_args,
                                                              namespace)
            } finally {
                // restore parser values before exiting
                for (let action of optionals) {
                    action.required = action.save_required
                }
                for (let group of this._mutually_exclusive_groups) {
                    group.required = group.save_required
                }
            }
        } finally {
            this.usage = save_usage
        }
        return [ namespace, extras ]
    }

    // ========================
    // Value conversion methods
    // ========================
    _get_values(action, arg_strings) {
        // for everything but PARSER, REMAINDER args, strip out first '--'
        if (![PARSER, REMAINDER].includes(action.nargs)) {
            try {
                _array_remove(arg_strings, '--')
            } catch (err) {}
        }

        let value
        // optional argument produces a default when not present
        if (!arg_strings.length && action.nargs === OPTIONAL) {
            if (action.option_strings.length) {
                value = action.const
            } else {
                value = action.default
            }
            if (typeof value === 'string') {
                value = this._get_value(action, value)
                this._check_value(action, value)
            }

        // when nargs='*' on a positional, if there were no command-line
        // args, use the default if it is anything other than None
        } else if (!arg_strings.length && action.nargs === ZERO_OR_MORE &&
              !action.option_strings.length) {
            if (action.default !== undefined) {
                value = action.default
            } else {
                value = arg_strings
            }
            this._check_value(action, value)

        // single argument or optional argument produces a single value
        } else if (arg_strings.length === 1 && [undefined, OPTIONAL].includes(action.nargs)) {
            let arg_string = arg_strings[0]
            value = this._get_value(action, arg_string)
            this._check_value(action, value)

        // REMAINDER arguments convert all values, checking none
        } else if (action.nargs === REMAINDER) {
            value = arg_strings.map(v => this._get_value(action, v))

        // PARSER arguments convert all values, but check only the first
        } else if (action.nargs === PARSER) {
            value = arg_strings.map(v => this._get_value(action, v))
            this._check_value(action, value[0])

        // SUPPRESS argument does not put anything in the namespace
        } else if (action.nargs === SUPPRESS) {
            value = SUPPRESS

        // all other types of nargs produce a list
        } else {
            value = arg_strings.map(v => this._get_value(action, v))
            for (let v of value) {
                this._check_value(action, v)
            }
        }

        // return the converted value
        return value
    }

    _get_value(action, arg_string) {
        let type_func = this._registry_get('type', action.type, action.type)
        if (typeof type_func !== 'function') {
            let msg = '%r is not callable'
            throw new ArgumentError(action, sub(msg, type_func))
        }

        // convert the value to the appropriate type
        let result
        try {
            try {
                result = type_func(arg_string)
            } catch (err) {
                // Dear TC39, why would you ever consider making es6 classes not callable?
                // We had one universal interface, [[Call]], which worked for anything
                // (with familiar this-instanceof guard for classes). Now we have two.
                if (err instanceof TypeError &&
                    /Class constructor .* cannot be invoked without 'new'/.test(err.message)) {
                    // eslint-disable-next-line new-cap
                    result = new type_func(arg_string)
                } else {
                    throw err
                }
            }

        } catch (err) {
            // ArgumentTypeErrors indicate errors
            if (err instanceof ArgumentTypeError) {
                //let name = getattr(action.type, 'name', repr(action.type))
                let msg = err.message
                throw new ArgumentError(action, msg)

            // TypeErrors or ValueErrors also indicate errors
            } else if (err instanceof TypeError) {
                let name = getattr(action.type, 'name', repr(action.type))
                let args = {type: name, value: arg_string}
                let msg = 'invalid %(type)s value: %(value)r'
                throw new ArgumentError(action, sub(msg, args))
            } else {
                throw err
            }
        }

        // return the converted value
        return result
    }

    _check_value(action, value) {
        // converted value must be one of the choices (if specified)
        if (action.choices !== undefined && !_choices_to_array(action.choices).includes(value)) {
            let args = {value,
                        choices: _choices_to_array(action.choices).map(repr).join(', ')}
            let msg = 'invalid choice: %(value)r (choose from %(choices)s)'
            throw new ArgumentError(action, sub(msg, args))
        }
    }

    // =======================
    // Help-formatting methods
    // =======================
    format_usage() {
        let formatter = this._get_formatter()
        formatter.add_usage(this.usage, this._actions,
                            this._mutually_exclusive_groups)
        return formatter.format_help()
    }

    format_help() {
        let formatter = this._get_formatter()

        // usage
        formatter.add_usage(this.usage, this._actions,
                            this._mutually_exclusive_groups)

        // description
        formatter.add_text(this.description)

        // positionals, optionals and user-defined groups
        for (let action_group of this._action_groups) {
            formatter.start_section(action_group.title)
            formatter.add_text(action_group.description)
            formatter.add_arguments(action_group._group_actions)
            formatter.end_section()
        }

        // epilog
        formatter.add_text(this.epilog)

        // determine help from format above
        return formatter.format_help()
    }

    _get_formatter() {
        // eslint-disable-next-line new-cap
        return new this.formatter_class({ prog: this.prog })
    }

    // =====================
    // Help-printing methods
    // =====================
    print_usage(file = undefined) {
        if (file === undefined) file = process.stdout
        this._print_message(this.format_usage(), file)
    }

    print_help(file = undefined) {
        if (file === undefined) file = process.stdout
        this._print_message(this.format_help(), file)
    }

    _print_message(message, file = undefined) {
        if (message) {
            if (file === undefined) file = process.stderr
            file.write(message)
        }
    }

    // ===============
    // Exiting methods
    // ===============
    exit(status = 0, message = undefined) {
        if (message) {
            this._print_message(message, process.stderr)
        }
        process.exit(status)
    }

    error(message) {
        /*
         *  error(message: string)
         *
         *  Prints a usage message incorporating the message to stderr and
         *  exits.
         *
         *  If you override this in a subclass, it should not return -- it
         *  should either exit or raise an exception.
         */

        // LEGACY (v1 compatibility), debug mode
        if (this.debug === true) throw new Error(message)
        // end
        this.print_usage(process.stderr)
        let args = {prog: this.prog, message: message}
        this.exit(2, sub('%(prog)s: error: %(message)s\n', args))
    }
}))


module.exports = {
    ArgumentParser,
    ArgumentError,
    ArgumentTypeError,
    BooleanOptionalAction,
    FileType,
    HelpFormatter,
    ArgumentDefaultsHelpFormatter,
    RawDescriptionHelpFormatter,
    RawTextHelpFormatter,
    MetavarTypeHelpFormatter,
    Namespace,
    Action,
    ONE_OR_MORE,
    OPTIONAL,
    PARSER,
    REMAINDER,
    SUPPRESS,
    ZERO_OR_MORE
}

// LEGACY (v1 compatibility), Const alias
Object.defineProperty(module.exports, 'Const', {
    get() {
        let result = {}
        Object.entries({ ONE_OR_MORE, OPTIONAL, PARSER, REMAINDER, SUPPRESS, ZERO_OR_MORE }).forEach(([ n, v ]) => {
            Object.defineProperty(result, n, {
                get() {
                    deprecate(n, sub('use argparse.%s instead of argparse.Const.%s', n, n))
                    return v
                }
            })
        })
        Object.entries({ _UNRECOGNIZED_ARGS_ATTR }).forEach(([ n, v ]) => {
            Object.defineProperty(result, n, {
                get() {
                    deprecate(n, sub('argparse.Const.%s is an internal symbol and will no longer be available', n))
                    return v
                }
            })
        })
        return result
    },
    enumerable: false
})
// end
{
  "name": "argparse",
  "description": "CLI arguments parser. Native port of python's argparse.",
  "version": "2.0.1",
  "main": "argparse.js",
  "files": [
    "argparse.js",
    "lib/"
  ],
  "license": "Python-2.0",
  "repository": "nodeca/argparse",
  "devDependencies": {
    "@babel/eslint-parser": "^7.11.0",
    "@babel/plugin-syntax-class-properties": "^7.10.4",
    "eslint": "^7.5.0",
    "mocha": "^8.0.1",
    "nyc": "^15.1.0"
  }
}// Limited implementation of python % string operator, supports only %s and %r for now
// (other formats are not used here, but may appear in custom templates)

'use strict'

const { inspect } = require('util')


module.exports = function sub(pattern, ...values) {
    let regex = /%(?:(%)|(-)?(\*)?(?:\((\w+)\))?([A-Za-z]))/g

    let result = pattern.replace(regex, function (_, is_literal, is_left_align, is_padded, name, format) {
        if (is_literal) return '%'

        let padded_count = 0
        if (is_padded) {
            if (values.length === 0) throw new TypeError('not enough arguments for format string')
            padded_count = values.shift()
            if (!Number.isInteger(padded_count)) throw new TypeError('* wants int')
        }

        let str
        if (name !== undefined) {
            let dict = values[0]
            if (typeof dict !== 'object' || dict === null) throw new TypeError('format requires a mapping')
            if (!(name in dict)) throw new TypeError(`no such key: '${name}'`)
            str = dict[name]
        } else {
            if (values.length === 0) throw new TypeError('not enough arguments for format string')
            str = values.shift()
        }

        switch (format) {
            case 's':
                str = String(str)
                break
            case 'r':
                str = inspect(str)
                break
            case 'd':
            case 'i':
                if (typeof str !== 'number') {
                    throw new TypeError(`%${format} format: a number is required, not ${typeof str}`)
                }
                str = String(str.toFixed(0))
                break
            default:
                throw new TypeError(`unsupported format character '${format}'`)
        }

        if (padded_count > 0) {
            return is_left_align ? str.padEnd(padded_count) : str.padStart(padded_count)
        } else {
            return str
        }
    })

    if (values.length) {
        if (values.length === 1 && typeof values[0] === 'object' && values[0] !== null) {
            // mapping
        } else {
            throw new TypeError('not all arguments converted during string formatting')
        }
    }

    return result
}
// Partial port of python's argparse module, version 3.9.0 (only wrap and fill functions):
// https://github.com/python/cpython/blob/v3.9.0b4/Lib/textwrap.py

'use strict'

/*
 * Text wrapping and filling.
 */

// Copyright (C) 1999-2001 Gregory P. Ward.
// Copyright (C) 2002, 2003 Python Software Foundation.
// Copyright (C) 2020 argparse.js authors
// Originally written by Greg Ward <gward@python.net>

// Hardcode the recognized whitespace characters to the US-ASCII
// whitespace characters.  The main reason for doing this is that
// some Unicode spaces (like \u00a0) are non-breaking whitespaces.
//
// This less funky little regex just split on recognized spaces. E.g.
//   "Hello there -- you goof-ball, use the -b option!"
// splits into
//   Hello/ /there/ /--/ /you/ /goof-ball,/ /use/ /the/ /-b/ /option!/
const wordsep_simple_re = /([\t\n\x0b\x0c\r ]+)/

class TextWrapper {
    /*
     *  Object for wrapping/filling text.  The public interface consists of
     *  the wrap() and fill() methods; the other methods are just there for
     *  subclasses to override in order to tweak the default behaviour.
     *  If you want to completely replace the main wrapping algorithm,
     *  you'll probably have to override _wrap_chunks().
     *
     *  Several instance attributes control various aspects of wrapping:
     *    width (default: 70)
     *      the maximum width of wrapped lines (unless break_long_words
     *      is false)
     *    initial_indent (default: "")
     *      string that will be prepended to the first line of wrapped
     *      output.  Counts towards the line's width.
     *    subsequent_indent (default: "")
     *      string that will be prepended to all lines save the first
     *      of wrapped output; also counts towards each line's width.
     *    expand_tabs (default: true)
     *      Expand tabs in input text to spaces before further processing.
     *      Each tab will become 0 .. 'tabsize' spaces, depending on its position
     *      in its line.  If false, each tab is treated as a single character.
     *    tabsize (default: 8)
     *      Expand tabs in input text to 0 .. 'tabsize' spaces, unless
     *      'expand_tabs' is false.
     *    replace_whitespace (default: true)
     *      Replace all whitespace characters in the input text by spaces
     *      after tab expansion.  Note that if expand_tabs is false and
     *      replace_whitespace is true, every tab will be converted to a
     *      single space!
     *    fix_sentence_endings (default: false)
     *      Ensure that sentence-ending punctuation is always followed
     *      by two spaces.  Off by default because the algorithm is
     *      (unavoidably) imperfect.
     *    break_long_words (default: true)
     *      Break words longer than 'width'.  If false, those words will not
     *      be broken, and some lines might be longer than 'width'.
     *    break_on_hyphens (default: true)
     *      Allow breaking hyphenated words. If true, wrapping will occur
     *      preferably on whitespaces and right after hyphens part of
     *      compound words.
     *    drop_whitespace (default: true)
     *      Drop leading and trailing whitespace from lines.
     *    max_lines (default: None)
     *      Truncate wrapped lines.
     *    placeholder (default: ' [...]')
     *      Append to the last line of truncated text.
     */

    constructor(options = {}) {
        let {
            width = 70,
            initial_indent = '',
            subsequent_indent = '',
            expand_tabs = true,
            replace_whitespace = true,
            fix_sentence_endings = false,
            break_long_words = true,
            drop_whitespace = true,
            break_on_hyphens = true,
            tabsize = 8,
            max_lines = undefined,
            placeholder=' [...]'
        } = options

        this.width = width
        this.initial_indent = initial_indent
        this.subsequent_indent = subsequent_indent
        this.expand_tabs = expand_tabs
        this.replace_whitespace = replace_whitespace
        this.fix_sentence_endings = fix_sentence_endings
        this.break_long_words = break_long_words
        this.drop_whitespace = drop_whitespace
        this.break_on_hyphens = break_on_hyphens
        this.tabsize = tabsize
        this.max_lines = max_lines
        this.placeholder = placeholder
    }


    // -- Private methods -----------------------------------------------
    // (possibly useful for subclasses to override)

    _munge_whitespace(text) {
        /*
         *  _munge_whitespace(text : string) -> string
         *
         *  Munge whitespace in text: expand tabs and convert all other
         *  whitespace characters to spaces.  Eg. " foo\\tbar\\n\\nbaz"
         *  becomes " foo    bar  baz".
         */
        if (this.expand_tabs) {
            text = text.replace(/\t/g, ' '.repeat(this.tabsize)) // not strictly correct in js
        }
        if (this.replace_whitespace) {
            text = text.replace(/[\t\n\x0b\x0c\r]/g, ' ')
        }
        return text
    }

    _split(text) {
        /*
         *  _split(text : string) -> [string]
         *
         *  Split the text to wrap into indivisible chunks.  Chunks are
         *  not quite the same as words; see _wrap_chunks() for full
         *  details.  As an example, the text
         *    Look, goof-ball -- use the -b option!
         *  breaks into the following chunks:
         *    'Look,', ' ', 'goof-', 'ball', ' ', '--', ' ',
         *    'use', ' ', 'the', ' ', '-b', ' ', 'option!'
         *  if break_on_hyphens is True, or in:
         *    'Look,', ' ', 'goof-ball', ' ', '--', ' ',
         *    'use', ' ', 'the', ' ', '-b', ' ', option!'
         *  otherwise.
         */
        let chunks = text.split(wordsep_simple_re)
        chunks = chunks.filter(Boolean)
        return chunks
    }

    _handle_long_word(reversed_chunks, cur_line, cur_len, width) {
        /*
         *  _handle_long_word(chunks : [string],
         *                    cur_line : [string],
         *                    cur_len : int, width : int)
         *
         *  Handle a chunk of text (most likely a word, not whitespace) that
         *  is too long to fit in any line.
         */
        // Figure out when indent is larger than the specified width, and make
        // sure at least one character is stripped off on every pass
        let space_left
        if (width < 1) {
            space_left = 1
        } else {
            space_left = width - cur_len
        }

        // If we're allowed to break long words, then do so: put as much
        // of the next chunk onto the current line as will fit.
        if (this.break_long_words) {
            cur_line.push(reversed_chunks[reversed_chunks.length - 1].slice(0, space_left))
            reversed_chunks[reversed_chunks.length - 1] = reversed_chunks[reversed_chunks.length - 1].slice(space_left)

        // Otherwise, we have to preserve the long word intact.  Only add
        // it to the current line if there's nothing already there --
        // that minimizes how much we violate the width constraint.
        } else if (!cur_line) {
            cur_line.push(...reversed_chunks.pop())
        }

        // If we're not allowed to break long words, and there's already
        // text on the current line, do nothing.  Next time through the
        // main loop of _wrap_chunks(), we'll wind up here again, but
        // cur_len will be zero, so the next line will be entirely
        // devoted to the long word that we can't handle right now.
    }

    _wrap_chunks(chunks) {
        /*
         *  _wrap_chunks(chunks : [string]) -> [string]
         *
         *  Wrap a sequence of text chunks and return a list of lines of
         *  length 'self.width' or less.  (If 'break_long_words' is false,
         *  some lines may be longer than this.)  Chunks correspond roughly
         *  to words and the whitespace between them: each chunk is
         *  indivisible (modulo 'break_long_words'), but a line break can
         *  come between any two chunks.  Chunks should not have internal
         *  whitespace; ie. a chunk is either all whitespace or a "word".
         *  Whitespace chunks will be removed from the beginning and end of
         *  lines, but apart from that whitespace is preserved.
         */
        let lines = []
        let indent
        if (this.width <= 0) {
            throw Error(`invalid width ${this.width} (must be > 0)`)
        }
        if (this.max_lines !== undefined) {
            if (this.max_lines > 1) {
                indent = this.subsequent_indent
            } else {
                indent = this.initial_indent
            }
            if (indent.length + this.placeholder.trimStart().length > this.width) {
                throw Error('placeholder too large for max width')
            }
        }

        // Arrange in reverse order so items can be efficiently popped
        // from a stack of chucks.
        chunks = chunks.reverse()

        while (chunks.length > 0) {

            // Start the list of chunks that will make up the current line.
            // cur_len is just the length of all the chunks in cur_line.
            let cur_line = []
            let cur_len = 0

            // Figure out which static string will prefix this line.
            let indent
            if (lines) {
                indent = this.subsequent_indent
            } else {
                indent = this.initial_indent
            }

            // Maximum width for this line.
            let width = this.width - indent.length

            // First chunk on line is whitespace -- drop it, unless this
            // is the very beginning of the text (ie. no lines started yet).
            if (this.drop_whitespace && chunks[chunks.length - 1].trim() === '' && lines.length > 0) {
                chunks.pop()
            }

            while (chunks.length > 0) {
                let l = chunks[chunks.length - 1].length

                // Can at least squeeze this chunk onto the current line.
                if (cur_len + l <= width) {
                    cur_line.push(chunks.pop())
                    cur_len += l

                // Nope, this line is full.
                } else {
                    break
                }
            }

            // The current line is full, and the next chunk is too big to
            // fit on *any* line (not just this one).
            if (chunks.length && chunks[chunks.length - 1].length > width) {
                this._handle_long_word(chunks, cur_line, cur_len, width)
                cur_len = cur_line.map(l => l.length).reduce((a, b) => a + b, 0)
            }

            // If the last chunk on this line is all whitespace, drop it.
            if (this.drop_whitespace && cur_line.length > 0 && cur_line[cur_line.length - 1].trim() === '') {
                cur_len -= cur_line[cur_line.length - 1].length
                cur_line.pop()
            }

            if (cur_line) {
                if (this.max_lines === undefined ||
                    lines.length + 1 < this.max_lines ||
                    (chunks.length === 0 ||
                     this.drop_whitespace &&
                     chunks.length === 1 &&
                     !chunks[0].trim()) && cur_len <= width) {
                    // Convert current line back to a string and store it in
                    // list of all lines (return value).
                    lines.push(indent + cur_line.join(''))
                } else {
                    let had_break = false
                    while (cur_line) {
                        if (cur_line[cur_line.length - 1].trim() &&
                            cur_len + this.placeholder.length <= width) {
                            cur_line.push(this.placeholder)
                            lines.push(indent + cur_line.join(''))
                            had_break = true
                            break
                        }
                        cur_len -= cur_line[-1].length
                        cur_line.pop()
                    }
                    if (!had_break) {
                        if (lines) {
                            let prev_line = lines[lines.length - 1].trimEnd()
                            if (prev_line.length + this.placeholder.length <=
                                    this.width) {
                                lines[lines.length - 1] = prev_line + this.placeholder
                                break
                            }
                        }
                        lines.push(indent + this.placeholder.lstrip())
                    }
                    break
                }
            }
        }

        return lines
    }

    _split_chunks(text) {
        text = this._munge_whitespace(text)
        return this._split(text)
    }

    // -- Public interface ----------------------------------------------

    wrap(text) {
        /*
         *  wrap(text : string) -> [string]
         *
         *  Reformat the single paragraph in 'text' so it fits in lines of
         *  no more than 'self.width' columns, and return a list of wrapped
         *  lines.  Tabs in 'text' are expanded with string.expandtabs(),
         *  and all other whitespace characters (including newline) are
         *  converted to space.
         */
        let chunks = this._split_chunks(text)
        // not implemented in js
        //if (this.fix_sentence_endings) {
        //    this._fix_sentence_endings(chunks)
        //}
        return this._wrap_chunks(chunks)
    }

    fill(text) {
        /*
         *  fill(text : string) -> string
         *
         *  Reformat the single paragraph in 'text' to fit in lines of no
         *  more than 'self.width' columns, and return a new string
         *  containing the entire wrapped paragraph.
         */
        return this.wrap(text).join('\n')
    }
}


// -- Convenience interface ---------------------------------------------

function wrap(text, options = {}) {
    /*
     *  Wrap a single paragraph of text, returning a list of wrapped lines.
     *
     *  Reformat the single paragraph in 'text' so it fits in lines of no
     *  more than 'width' columns, and return a list of wrapped lines.  By
     *  default, tabs in 'text' are expanded with string.expandtabs(), and
     *  all other whitespace characters (including newline) are converted to
     *  space.  See TextWrapper class for available keyword args to customize
     *  wrapping behaviour.
     */
    let { width = 70, ...kwargs } = options
    let w = new TextWrapper(Object.assign({ width }, kwargs))
    return w.wrap(text)
}

function fill(text, options = {}) {
    /*
     *  Fill a single paragraph of text, returning a new string.
     *
     *  Reformat the single paragraph in 'text' to fit in lines of no more
     *  than 'width' columns, and return a new string containing the entire
     *  wrapped paragraph.  As with wrap(), tabs are expanded and other
     *  whitespace characters converted to space.  See TextWrapper class for
     *  available keyword args to customize wrapping behaviour.
     */
    let { width = 70, ...kwargs } = options
    let w = new TextWrapper(Object.assign({ width }, kwargs))
    return w.fill(text)
}

// -- Loosely related functionality -------------------------------------

let _whitespace_only_re = /^[ \t]+$/mg
let _leading_whitespace_re = /(^[ \t]*)(?:[^ \t\n])/mg

function dedent(text) {
    /*
     *  Remove any common leading whitespace from every line in `text`.
     *
     *  This can be used to make triple-quoted strings line up with the left
     *  edge of the display, while still presenting them in the source code
     *  in indented form.
     *
     *  Note that tabs and spaces are both treated as whitespace, but they
     *  are not equal: the lines "  hello" and "\\thello" are
     *  considered to have no common leading whitespace.
     *
     *  Entirely blank lines are normalized to a newline character.
     */
    // Look for the longest leading string of spaces and tabs common to
    // all lines.
    let margin = undefined
    text = text.replace(_whitespace_only_re, '')
    let indents = text.match(_leading_whitespace_re) || []
    for (let indent of indents) {
        indent = indent.slice(0, -1)

        if (margin === undefined) {
            margin = indent

        // Current line more deeply indented than previous winner:
        // no change (previous winner is still on top).
        } else if (indent.startsWith(margin)) {
            // pass

        // Current line consistent with and no deeper than previous winner:
        // it's the new winner.
        } else if (margin.startsWith(indent)) {
            margin = indent

        // Find the largest common whitespace between current line and previous
        // winner.
        } else {
            for (let i = 0; i < margin.length && i < indent.length; i++) {
                if (margin[i] !== indent[i]) {
                    margin = margin.slice(0, i)
                    break
                }
            }
        }
    }

    if (margin) {
        text = text.replace(new RegExp('^' + margin, 'mg'), '')
    }
    return text
}

module.exports = { wrap, fill, dedent }
(The MIT License)

Copyright (C) 2011-2015 by Vitaly Puzrin

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 loader = require('./lib/loader');
var dumper = require('./lib/dumper');


function renamed(from, to) {
  return function () {
    throw new Error('Function yaml.' + from + ' is removed in js-yaml 4. ' +
      'Use yaml.' + to + ' instead, which is now safe by default.');
  };
}


module.exports.Type                = require('./lib/type');
module.exports.Schema              = require('./lib/schema');
module.exports.FAILSAFE_SCHEMA     = require('./lib/schema/failsafe');
module.exports.JSON_SCHEMA         = require('./lib/schema/json');
module.exports.CORE_SCHEMA         = require('./lib/schema/core');
module.exports.DEFAULT_SCHEMA      = require('./lib/schema/default');
module.exports.load                = loader.load;
module.exports.loadAll             = loader.loadAll;
module.exports.dump                = dumper.dump;
module.exports.YAMLException       = require('./lib/exception');

// Re-export all types in case user wants to create custom schema
module.exports.types = {
  binary:    require('./lib/type/binary'),
  float:     require('./lib/type/float'),
  map:       require('./lib/type/map'),
  null:      require('./lib/type/null'),
  pairs:     require('./lib/type/pairs'),
  set:       require('./lib/type/set'),
  timestamp: require('./lib/type/timestamp'),
  bool:      require('./lib/type/bool'),
  int:       require('./lib/type/int'),
  merge:     require('./lib/type/merge'),
  omap:      require('./lib/type/omap'),
  seq:       require('./lib/type/seq'),
  str:       require('./lib/type/str')
};

// Removed functions from JS-YAML 3.0.x
module.exports.safeLoad            = renamed('safeLoad', 'load');
module.exports.safeLoadAll         = renamed('safeLoadAll', 'loadAll');
module.exports.safeDump            = renamed('safeDump', 'dump');
{
  "name": "js-yaml",
  "version": "4.1.0",
  "description": "YAML 1.2 parser and serializer",
  "author": "Vladimir Zapparov <dervus.grim@gmail.com>",
  "license": "MIT",
  "repository": "nodeca/js-yaml",
  "files": [
    "index.js",
    "lib/",
    "bin/",
    "dist/"
  ],
  "bin": {
    "js-yaml": "bin/js-yaml.js"
  },
  "module": "./dist/js-yaml.mjs",
  "exports": {
    ".": {
      "import": "./dist/js-yaml.mjs",
      "require": "./index.js"
    },
    "./package.json": "./package.json"
  },
  "unpkg": "dist/js-yaml.min.js",
  "jsdelivr": "dist/js-yaml.min.js",
  "dependencies": {
    "argparse": "^2.0.1"
  },
  "devDependencies": {
    "@rollup/plugin-commonjs": "^17.0.0",
    "@rollup/plugin-node-resolve": "^11.0.0",
    "ansi": "^0.3.1",
    "benchmark": "^2.1.4",
    "codemirror": "^5.13.4",
    "eslint": "^7.0.0",
    "fast-check": "^2.8.0",
    "gh-pages": "^3.1.0",
    "mocha": "^8.2.1",
    "nyc": "^15.1.0",
    "rollup": "^2.34.1",
    "rollup-plugin-node-polyfills": "^0.2.1",
    "rollup-plugin-terser": "^7.0.2",
    "shelljs": "^0.8.4"
  }
}'use strict';


function isNothing(subject) {
  return (typeof subject === 'undefined') || (subject === null);
}


function isObject(subject) {
  return (typeof subject === 'object') && (subject !== null);
}


function toArray(sequence) {
  if (Array.isArray(sequence)) return sequence;
  else if (isNothing(sequence)) return [];

  return [ sequence ];
}


function extend(target, source) {
  var index, length, key, sourceKeys;

  if (source) {
    sourceKeys = Object.keys(source);

    for (index = 0, length = sourceKeys.length; index < length; index += 1) {
      key = sourceKeys[index];
      target[key] = source[key];
    }
  }

  return target;
}


function repeat(string, count) {
  var result = '', cycle;

  for (cycle = 0; cycle < count; cycle += 1) {
    result += string;
  }

  return result;
}


function isNegativeZero(number) {
  return (number === 0) && (Number.NEGATIVE_INFINITY === 1 / number);
}


module.exports.isNothing      = isNothing;
module.exports.isObject       = isObject;
module.exports.toArray        = toArray;
module.exports.repeat         = repeat;
module.exports.isNegativeZero = isNegativeZero;
module.exports.extend         = extend;
'use strict';

/*eslint-disable no-use-before-define*/

var common              = require('./common');
var YAMLException       = require('./exception');
var DEFAULT_SCHEMA      = require('./schema/default');

var _toString       = Object.prototype.toString;
var _hasOwnProperty = Object.prototype.hasOwnProperty;

var CHAR_BOM                  = 0xFEFF;
var CHAR_TAB                  = 0x09; /* Tab */
var CHAR_LINE_FEED            = 0x0A; /* LF */
var CHAR_CARRIAGE_RETURN      = 0x0D; /* CR */
var CHAR_SPACE                = 0x20; /* Space */
var CHAR_EXCLAMATION          = 0x21; /* ! */
var CHAR_DOUBLE_QUOTE         = 0x22; /* " */
var CHAR_SHARP                = 0x23; /* # */
var CHAR_PERCENT              = 0x25; /* % */
var CHAR_AMPERSAND            = 0x26; /* & */
var CHAR_SINGLE_QUOTE         = 0x27; /* ' */
var CHAR_ASTERISK             = 0x2A; /* * */
var CHAR_COMMA                = 0x2C; /* , */
var CHAR_MINUS                = 0x2D; /* - */
var CHAR_COLON                = 0x3A; /* : */
var CHAR_EQUALS               = 0x3D; /* = */
var CHAR_GREATER_THAN         = 0x3E; /* > */
var CHAR_QUESTION             = 0x3F; /* ? */
var CHAR_COMMERCIAL_AT        = 0x40; /* @ */
var CHAR_LEFT_SQUARE_BRACKET  = 0x5B; /* [ */
var CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */
var CHAR_GRAVE_ACCENT         = 0x60; /* ` */
var CHAR_LEFT_CURLY_BRACKET   = 0x7B; /* { */
var CHAR_VERTICAL_LINE        = 0x7C; /* | */
var CHAR_RIGHT_CURLY_BRACKET  = 0x7D; /* } */

var ESCAPE_SEQUENCES = {};

ESCAPE_SEQUENCES[0x00]   = '\\0';
ESCAPE_SEQUENCES[0x07]   = '\\a';
ESCAPE_SEQUENCES[0x08]   = '\\b';
ESCAPE_SEQUENCES[0x09]   = '\\t';
ESCAPE_SEQUENCES[0x0A]   = '\\n';
ESCAPE_SEQUENCES[0x0B]   = '\\v';
ESCAPE_SEQUENCES[0x0C]   = '\\f';
ESCAPE_SEQUENCES[0x0D]   = '\\r';
ESCAPE_SEQUENCES[0x1B]   = '\\e';
ESCAPE_SEQUENCES[0x22]   = '\\"';
ESCAPE_SEQUENCES[0x5C]   = '\\\\';
ESCAPE_SEQUENCES[0x85]   = '\\N';
ESCAPE_SEQUENCES[0xA0]   = '\\_';
ESCAPE_SEQUENCES[0x2028] = '\\L';
ESCAPE_SEQUENCES[0x2029] = '\\P';

var DEPRECATED_BOOLEANS_SYNTAX = [
  'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON',
  'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF'
];

var DEPRECATED_BASE60_SYNTAX = /^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/;

function compileStyleMap(schema, map) {
  var result, keys, index, length, tag, style, type;

  if (map === null) return {};

  result = {};
  keys = Object.keys(map);

  for (index = 0, length = keys.length; index < length; index += 1) {
    tag = keys[index];
    style = String(map[tag]);

    if (tag.slice(0, 2) === '!!') {
      tag = 'tag:yaml.org,2002:' + tag.slice(2);
    }
    type = schema.compiledTypeMap['fallback'][tag];

    if (type && _hasOwnProperty.call(type.styleAliases, style)) {
      style = type.styleAliases[style];
    }

    result[tag] = style;
  }

  return result;
}

function encodeHex(character) {
  var string, handle, length;

  string = character.toString(16).toUpperCase();

  if (character <= 0xFF) {
    handle = 'x';
    length = 2;
  } else if (character <= 0xFFFF) {
    handle = 'u';
    length = 4;
  } else if (character <= 0xFFFFFFFF) {
    handle = 'U';
    length = 8;
  } else {
    throw new YAMLException('code point within a string may not be greater than 0xFFFFFFFF');
  }

  return '\\' + handle + common.repeat('0', length - string.length) + string;
}


var QUOTING_TYPE_SINGLE = 1,
    QUOTING_TYPE_DOUBLE = 2;

function State(options) {
  this.schema        = options['schema'] || DEFAULT_SCHEMA;
  this.indent        = Math.max(1, (options['indent'] || 2));
  this.noArrayIndent = options['noArrayIndent'] || false;
  this.skipInvalid   = options['skipInvalid'] || false;
  this.flowLevel     = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']);
  this.styleMap      = compileStyleMap(this.schema, options['styles'] || null);
  this.sortKeys      = options['sortKeys'] || false;
  this.lineWidth     = options['lineWidth'] || 80;
  this.noRefs        = options['noRefs'] || false;
  this.noCompatMode  = options['noCompatMode'] || false;
  this.condenseFlow  = options['condenseFlow'] || false;
  this.quotingType   = options['quotingType'] === '"' ? QUOTING_TYPE_DOUBLE : QUOTING_TYPE_SINGLE;
  this.forceQuotes   = options['forceQuotes'] || false;
  this.replacer      = typeof options['replacer'] === 'function' ? options['replacer'] : null;

  this.implicitTypes = this.schema.compiledImplicit;
  this.explicitTypes = this.schema.compiledExplicit;

  this.tag = null;
  this.result = '';

  this.duplicates = [];
  this.usedDuplicates = null;
}

// Indents every line in a string. Empty lines (\n only) are not indented.
function indentString(string, spaces) {
  var ind = common.repeat(' ', spaces),
      position = 0,
      next = -1,
      result = '',
      line,
      length = string.length;

  while (position < length) {
    next = string.indexOf('\n', position);
    if (next === -1) {
      line = string.slice(position);
      position = length;
    } else {
      line = string.slice(position, next + 1);
      position = next + 1;
    }

    if (line.length && line !== '\n') result += ind;

    result += line;
  }

  return result;
}

function generateNextLine(state, level) {
  return '\n' + common.repeat(' ', state.indent * level);
}

function testImplicitResolving(state, str) {
  var index, length, type;

  for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {
    type = state.implicitTypes[index];

    if (type.resolve(str)) {
      return true;
    }
  }

  return false;
}

// [33] s-white ::= s-space | s-tab
function isWhitespace(c) {
  return c === CHAR_SPACE || c === CHAR_TAB;
}

// Returns true if the character can be printed without escaping.
// From YAML 1.2: "any allowed characters known to be non-printable
// should also be escaped. [However,] This isn’t mandatory"
// Derived from nb-char - \t - #x85 - #xA0 - #x2028 - #x2029.
function isPrintable(c) {
  return  (0x00020 <= c && c <= 0x00007E)
      || ((0x000A1 <= c && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029)
      || ((0x0E000 <= c && c <= 0x00FFFD) && c !== CHAR_BOM)
      ||  (0x10000 <= c && c <= 0x10FFFF);
}

// [34] ns-char ::= nb-char - s-white
// [27] nb-char ::= c-printable - b-char - c-byte-order-mark
// [26] b-char  ::= b-line-feed | b-carriage-return
// Including s-white (for some reason, examples doesn't match specs in this aspect)
// ns-char ::= c-printable - b-line-feed - b-carriage-return - c-byte-order-mark
function isNsCharOrWhitespace(c) {
  return isPrintable(c)
    && c !== CHAR_BOM
    // - b-char
    && c !== CHAR_CARRIAGE_RETURN
    && c !== CHAR_LINE_FEED;
}

// [127]  ns-plain-safe(c) ::= c = flow-out  ⇒ ns-plain-safe-out
//                             c = flow-in   ⇒ ns-plain-safe-in
//                             c = block-key ⇒ ns-plain-safe-out
//                             c = flow-key  ⇒ ns-plain-safe-in
// [128] ns-plain-safe-out ::= ns-char
// [129]  ns-plain-safe-in ::= ns-char - c-flow-indicator
// [130]  ns-plain-char(c) ::=  ( ns-plain-safe(c) - “:” - “#” )
//                            | ( /* An ns-char preceding */ “#” )
//                            | ( “:” /* Followed by an ns-plain-safe(c) */ )
function isPlainSafe(c, prev, inblock) {
  var cIsNsCharOrWhitespace = isNsCharOrWhitespace(c);
  var cIsNsChar = cIsNsCharOrWhitespace && !isWhitespace(c);
  return (
    // ns-plain-safe
    inblock ? // c = flow-in
      cIsNsCharOrWhitespace
      : cIsNsCharOrWhitespace
        // - c-flow-indicator
        && c !== CHAR_COMMA
        && c !== CHAR_LEFT_SQUARE_BRACKET
        && c !== CHAR_RIGHT_SQUARE_BRACKET
        && c !== CHAR_LEFT_CURLY_BRACKET
        && c !== CHAR_RIGHT_CURLY_BRACKET
  )
    // ns-plain-char
    && c !== CHAR_SHARP // false on '#'
    && !(prev === CHAR_COLON && !cIsNsChar) // false on ': '
    || (isNsCharOrWhitespace(prev) && !isWhitespace(prev) && c === CHAR_SHARP) // change to true on '[^ ]#'
    || (prev === CHAR_COLON && cIsNsChar); // change to true on ':[^ ]'
}

// Simplified test for values allowed as the first character in plain style.
function isPlainSafeFirst(c) {
  // Uses a subset of ns-char - c-indicator
  // where ns-char = nb-char - s-white.
  // No support of ( ( “?” | “:” | “-” ) /* Followed by an ns-plain-safe(c)) */ ) part
  return isPrintable(c) && c !== CHAR_BOM
    && !isWhitespace(c) // - s-white
    // - (c-indicator ::=
    // “-” | “?” | “:” | “,” | “[” | “]” | “{” | “}”
    && c !== CHAR_MINUS
    && c !== CHAR_QUESTION
    && c !== CHAR_COLON
    && c !== CHAR_COMMA
    && c !== CHAR_LEFT_SQUARE_BRACKET
    && c !== CHAR_RIGHT_SQUARE_BRACKET
    && c !== CHAR_LEFT_CURLY_BRACKET
    && c !== CHAR_RIGHT_CURLY_BRACKET
    // | “#” | “&” | “*” | “!” | “|” | “=” | “>” | “'” | “"”
    && c !== CHAR_SHARP
    && c !== CHAR_AMPERSAND
    && c !== CHAR_ASTERISK
    && c !== CHAR_EXCLAMATION
    && c !== CHAR_VERTICAL_LINE
    && c !== CHAR_EQUALS
    && c !== CHAR_GREATER_THAN
    && c !== CHAR_SINGLE_QUOTE
    && c !== CHAR_DOUBLE_QUOTE
    // | “%” | “@” | “`”)
    && c !== CHAR_PERCENT
    && c !== CHAR_COMMERCIAL_AT
    && c !== CHAR_GRAVE_ACCENT;
}

// Simplified test for values allowed as the last character in plain style.
function isPlainSafeLast(c) {
  // just not whitespace or colon, it will be checked to be plain character later
  return !isWhitespace(c) && c !== CHAR_COLON;
}

// Same as 'string'.codePointAt(pos), but works in older browsers.
function codePointAt(string, pos) {
  var first = string.charCodeAt(pos), second;
  if (first >= 0xD800 && first <= 0xDBFF && pos + 1 < string.length) {
    second = string.charCodeAt(pos + 1);
    if (second >= 0xDC00 && second <= 0xDFFF) {
      // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
      return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;
    }
  }
  return first;
}

// Determines whether block indentation indicator is required.
function needIndentIndicator(string) {
  var leadingSpaceRe = /^\n* /;
  return leadingSpaceRe.test(string);
}

var STYLE_PLAIN   = 1,
    STYLE_SINGLE  = 2,
    STYLE_LITERAL = 3,
    STYLE_FOLDED  = 4,
    STYLE_DOUBLE  = 5;

// Determines which scalar styles are possible and returns the preferred style.
// lineWidth = -1 => no limit.
// Pre-conditions: str.length > 0.
// Post-conditions:
//    STYLE_PLAIN or STYLE_SINGLE => no \n are in the string.
//    STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1).
//    STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1).
function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth,
  testAmbiguousType, quotingType, forceQuotes, inblock) {

  var i;
  var char = 0;
  var prevChar = null;
  var hasLineBreak = false;
  var hasFoldableLine = false; // only checked if shouldTrackWidth
  var shouldTrackWidth = lineWidth !== -1;
  var previousLineBreak = -1; // count the first line correctly
  var plain = isPlainSafeFirst(codePointAt(string, 0))
          && isPlainSafeLast(codePointAt(string, string.length - 1));

  if (singleLineOnly || forceQuotes) {
    // Case: no block styles.
    // Check for disallowed characters to rule out plain and single.
    for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {
      char = codePointAt(string, i);
      if (!isPrintable(char)) {
        return STYLE_DOUBLE;
      }
      plain = plain && isPlainSafe(char, prevChar, inblock);
      prevChar = char;
    }
  } else {
    // Case: block styles permitted.
    for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {
      char = codePointAt(string, i);
      if (char === CHAR_LINE_FEED) {
        hasLineBreak = true;
        // Check if any line can be folded.
        if (shouldTrackWidth) {
          hasFoldableLine = hasFoldableLine ||
            // Foldable line = too long, and not more-indented.
            (i - previousLineBreak - 1 > lineWidth &&
             string[previousLineBreak + 1] !== ' ');
          previousLineBreak = i;
        }
      } else if (!isPrintable(char)) {
        return STYLE_DOUBLE;
      }
      plain = plain && isPlainSafe(char, prevChar, inblock);
      prevChar = char;
    }
    // in case the end is missing a \n
    hasFoldableLine = hasFoldableLine || (shouldTrackWidth &&
      (i - previousLineBreak - 1 > lineWidth &&
       string[previousLineBreak + 1] !== ' '));
  }
  // Although every style can represent \n without escaping, prefer block styles
  // for multiline, since they're more readable and they don't add empty lines.
  // Also prefer folding a super-long line.
  if (!hasLineBreak && !hasFoldableLine) {
    // Strings interpretable as another type have to be quoted;
    // e.g. the string 'true' vs. the boolean true.
    if (plain && !forceQuotes && !testAmbiguousType(string)) {
      return STYLE_PLAIN;
    }
    return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;
  }
  // Edge case: block indentation indicator can only have one digit.
  if (indentPerLevel > 9 && needIndentIndicator(string)) {
    return STYLE_DOUBLE;
  }
  // At this point we know block styles are valid.
  // Prefer literal style unless we want to fold.
  if (!forceQuotes) {
    return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;
  }
  return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;
}

// Note: line breaking/folding is implemented for only the folded style.
// NB. We drop the last trailing newline (if any) of a returned block scalar
//  since the dumper adds its own newline. This always works:
//    • No ending newline => unaffected; already using strip "-" chomping.
//    • Ending newline    => removed then restored.
//  Importantly, this keeps the "+" chomp indicator from gaining an extra line.
function writeScalar(state, string, level, iskey, inblock) {
  state.dump = (function () {
    if (string.length === 0) {
      return state.quotingType === QUOTING_TYPE_DOUBLE ? '""' : "''";
    }
    if (!state.noCompatMode) {
      if (DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1 || DEPRECATED_BASE60_SYNTAX.test(string)) {
        return state.quotingType === QUOTING_TYPE_DOUBLE ? ('"' + string + '"') : ("'" + string + "'");
      }
    }

    var indent = state.indent * Math.max(1, level); // no 0-indent scalars
    // As indentation gets deeper, let the width decrease monotonically
    // to the lower bound min(state.lineWidth, 40).
    // Note that this implies
    //  state.lineWidth ≤ 40 + state.indent: width is fixed at the lower bound.
    //  state.lineWidth > 40 + state.indent: width decreases until the lower bound.
    // This behaves better than a constant minimum width which disallows narrower options,
    // or an indent threshold which causes the width to suddenly increase.
    var lineWidth = state.lineWidth === -1
      ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);

    // Without knowing if keys are implicit/explicit, assume implicit for safety.
    var singleLineOnly = iskey
      // No block styles in flow mode.
      || (state.flowLevel > -1 && level >= state.flowLevel);
    function testAmbiguity(string) {
      return testImplicitResolving(state, string);
    }

    switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth,
      testAmbiguity, state.quotingType, state.forceQuotes && !iskey, inblock)) {

      case STYLE_PLAIN:
        return string;
      case STYLE_SINGLE:
        return "'" + string.replace(/'/g, "''") + "'";
      case STYLE_LITERAL:
        return '|' + blockHeader(string, state.indent)
          + dropEndingNewline(indentString(string, indent));
      case STYLE_FOLDED:
        return '>' + blockHeader(string, state.indent)
          + dropEndingNewline(indentString(foldString(string, lineWidth), indent));
      case STYLE_DOUBLE:
        return '"' + escapeString(string, lineWidth) + '"';
      default:
        throw new YAMLException('impossible error: invalid scalar style');
    }
  }());
}

// Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9.
function blockHeader(string, indentPerLevel) {
  var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : '';

  // note the special case: the string '\n' counts as a "trailing" empty line.
  var clip =          string[string.length - 1] === '\n';
  var keep = clip && (string[string.length - 2] === '\n' || string === '\n');
  var chomp = keep ? '+' : (clip ? '' : '-');

  return indentIndicator + chomp + '\n';
}

// (See the note for writeScalar.)
function dropEndingNewline(string) {
  return string[string.length - 1] === '\n' ? string.slice(0, -1) : string;
}

// Note: a long line without a suitable break point will exceed the width limit.
// Pre-conditions: every char in str isPrintable, str.length > 0, width > 0.
function foldString(string, width) {
  // In folded style, $k$ consecutive newlines output as $k+1$ newlines—
  // unless they're before or after a more-indented line, or at the very
  // beginning or end, in which case $k$ maps to $k$.
  // Therefore, parse each chunk as newline(s) followed by a content line.
  var lineRe = /(\n+)([^\n]*)/g;

  // first line (possibly an empty line)
  var result = (function () {
    var nextLF = string.indexOf('\n');
    nextLF = nextLF !== -1 ? nextLF : string.length;
    lineRe.lastIndex = nextLF;
    return foldLine(string.slice(0, nextLF), width);
  }());
  // If we haven't reached the first content line yet, don't add an extra \n.
  var prevMoreIndented = string[0] === '\n' || string[0] === ' ';
  var moreIndented;

  // rest of the lines
  var match;
  while ((match = lineRe.exec(string))) {
    var prefix = match[1], line = match[2];
    moreIndented = (line[0] === ' ');
    result += prefix
      + (!prevMoreIndented && !moreIndented && line !== ''
        ? '\n' : '')
      + foldLine(line, width);
    prevMoreIndented = moreIndented;
  }

  return result;
}

// Greedy line breaking.
// Picks the longest line under the limit each time,
// otherwise settles for the shortest line over the limit.
// NB. More-indented lines *cannot* be folded, as that would add an extra \n.
function foldLine(line, width) {
  if (line === '' || line[0] === ' ') return line;

  // Since a more-indented line adds a \n, breaks can't be followed by a space.
  var breakRe = / [^ ]/g; // note: the match index will always be <= length-2.
  var match;
  // start is an inclusive index. end, curr, and next are exclusive.
  var start = 0, end, curr = 0, next = 0;
  var result = '';

  // Invariants: 0 <= start <= length-1.
  //   0 <= curr <= next <= max(0, length-2). curr - start <= width.
  // Inside the loop:
  //   A match implies length >= 2, so curr and next are <= length-2.
  while ((match = breakRe.exec(line))) {
    next = match.index;
    // maintain invariant: curr - start <= width
    if (next - start > width) {
      end = (curr > start) ? curr : next; // derive end <= length-2
      result += '\n' + line.slice(start, end);
      // skip the space that was output as \n
      start = end + 1;                    // derive start <= length-1
    }
    curr = next;
  }

  // By the invariants, start <= length-1, so there is something left over.
  // It is either the whole string or a part starting from non-whitespace.
  result += '\n';
  // Insert a break if the remainder is too long and there is a break available.
  if (line.length - start > width && curr > start) {
    result += line.slice(start, curr) + '\n' + line.slice(curr + 1);
  } else {
    result += line.slice(start);
  }

  return result.slice(1); // drop extra \n joiner
}

// Escapes a double-quoted string.
function escapeString(string) {
  var result = '';
  var char = 0;
  var escapeSeq;

  for (var i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {
    char = codePointAt(string, i);
    escapeSeq = ESCAPE_SEQUENCES[char];

    if (!escapeSeq && isPrintable(char)) {
      result += string[i];
      if (char >= 0x10000) result += string[i + 1];
    } else {
      result += escapeSeq || encodeHex(char);
    }
  }

  return result;
}

function writeFlowSequence(state, level, object) {
  var _result = '',
      _tag    = state.tag,
      index,
      length,
      value;

  for (index = 0, length = object.length; index < length; index += 1) {
    value = object[index];

    if (state.replacer) {
      value = state.replacer.call(object, String(index), value);
    }

    // Write only valid elements, put null instead of invalid elements.
    if (writeNode(state, level, value, false, false) ||
        (typeof value === 'undefined' &&
         writeNode(state, level, null, false, false))) {

      if (_result !== '') _result += ',' + (!state.condenseFlow ? ' ' : '');
      _result += state.dump;
    }
  }

  state.tag = _tag;
  state.dump = '[' + _result + ']';
}

function writeBlockSequence(state, level, object, compact) {
  var _result = '',
      _tag    = state.tag,
      index,
      length,
      value;

  for (index = 0, length = object.length; index < length; index += 1) {
    value = object[index];

    if (state.replacer) {
      value = state.replacer.call(object, String(index), value);
    }

    // Write only valid elements, put null instead of invalid elements.
    if (writeNode(state, level + 1, value, true, true, false, true) ||
        (typeof value === 'undefined' &&
         writeNode(state, level + 1, null, true, true, false, true))) {

      if (!compact || _result !== '') {
        _result += generateNextLine(state, level);
      }

      if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
        _result += '-';
      } else {
        _result += '- ';
      }

      _result += state.dump;
    }
  }

  state.tag = _tag;
  state.dump = _result || '[]'; // Empty sequence if no valid values.
}

function writeFlowMapping(state, level, object) {
  var _result       = '',
      _tag          = state.tag,
      objectKeyList = Object.keys(object),
      index,
      length,
      objectKey,
      objectValue,
      pairBuffer;

  for (index = 0, length = objectKeyList.length; index < length; index += 1) {

    pairBuffer = '';
    if (_result !== '') pairBuffer += ', ';

    if (state.condenseFlow) pairBuffer += '"';

    objectKey = objectKeyList[index];
    objectValue = object[objectKey];

    if (state.replacer) {
      objectValue = state.replacer.call(object, objectKey, objectValue);
    }

    if (!writeNode(state, level, objectKey, false, false)) {
      continue; // Skip this pair because of invalid key;
    }

    if (state.dump.length > 1024) pairBuffer += '? ';

    pairBuffer += state.dump + (state.condenseFlow ? '"' : '') + ':' + (state.condenseFlow ? '' : ' ');

    if (!writeNode(state, level, objectValue, false, false)) {
      continue; // Skip this pair because of invalid value.
    }

    pairBuffer += state.dump;

    // Both key and value are valid.
    _result += pairBuffer;
  }

  state.tag = _tag;
  state.dump = '{' + _result + '}';
}

function writeBlockMapping(state, level, object, compact) {
  var _result       = '',
      _tag          = state.tag,
      objectKeyList = Object.keys(object),
      index,
      length,
      objectKey,
      objectValue,
      explicitPair,
      pairBuffer;

  // Allow sorting keys so that the output file is deterministic
  if (state.sortKeys === true) {
    // Default sorting
    objectKeyList.sort();
  } else if (typeof state.sortKeys === 'function') {
    // Custom sort function
    objectKeyList.sort(state.sortKeys);
  } else if (state.sortKeys) {
    // Something is wrong
    throw new YAMLException('sortKeys must be a boolean or a function');
  }

  for (index = 0, length = objectKeyList.length; index < length; index += 1) {
    pairBuffer = '';

    if (!compact || _result !== '') {
      pairBuffer += generateNextLine(state, level);
    }

    objectKey = objectKeyList[index];
    objectValue = object[objectKey];

    if (state.replacer) {
      objectValue = state.replacer.call(object, objectKey, objectValue);
    }

    if (!writeNode(state, level + 1, objectKey, true, true, true)) {
      continue; // Skip this pair because of invalid key.
    }

    explicitPair = (state.tag !== null && state.tag !== '?') ||
                   (state.dump && state.dump.length > 1024);

    if (explicitPair) {
      if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
        pairBuffer += '?';
      } else {
        pairBuffer += '? ';
      }
    }

    pairBuffer += state.dump;

    if (explicitPair) {
      pairBuffer += generateNextLine(state, level);
    }

    if (!writeNode(state, level + 1, objectValue, true, explicitPair)) {
      continue; // Skip this pair because of invalid value.
    }

    if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
      pairBuffer += ':';
    } else {
      pairBuffer += ': ';
    }

    pairBuffer += state.dump;

    // Both key and value are valid.
    _result += pairBuffer;
  }

  state.tag = _tag;
  state.dump = _result || '{}'; // Empty mapping if no valid pairs.
}

function detectType(state, object, explicit) {
  var _result, typeList, index, length, type, style;

  typeList = explicit ? state.explicitTypes : state.implicitTypes;

  for (index = 0, length = typeList.length; index < length; index += 1) {
    type = typeList[index];

    if ((type.instanceOf  || type.predicate) &&
        (!type.instanceOf || ((typeof object === 'object') && (object instanceof type.instanceOf))) &&
        (!type.predicate  || type.predicate(object))) {

      if (explicit) {
        if (type.multi && type.representName) {
          state.tag = type.representName(object);
        } else {
          state.tag = type.tag;
        }
      } else {
        state.tag = '?';
      }

      if (type.represent) {
        style = state.styleMap[type.tag] || type.defaultStyle;

        if (_toString.call(type.represent) === '[object Function]') {
          _result = type.represent(object, style);
        } else if (_hasOwnProperty.call(type.represent, style)) {
          _result = type.represent[style](object, style);
        } else {
          throw new YAMLException('!<' + type.tag + '> tag resolver accepts not "' + style + '" style');
        }

        state.dump = _result;
      }

      return true;
    }
  }

  return false;
}

// Serializes `object` and writes it to global `result`.
// Returns true on success, or false on invalid object.
//
function writeNode(state, level, object, block, compact, iskey, isblockseq) {
  state.tag = null;
  state.dump = object;

  if (!detectType(state, object, false)) {
    detectType(state, object, true);
  }

  var type = _toString.call(state.dump);
  var inblock = block;
  var tagStr;

  if (block) {
    block = (state.flowLevel < 0 || state.flowLevel > level);
  }

  var objectOrArray = type === '[object Object]' || type === '[object Array]',
      duplicateIndex,
      duplicate;

  if (objectOrArray) {
    duplicateIndex = state.duplicates.indexOf(object);
    duplicate = duplicateIndex !== -1;
  }

  if ((state.tag !== null && state.tag !== '?') || duplicate || (state.indent !== 2 && level > 0)) {
    compact = false;
  }

  if (duplicate && state.usedDuplicates[duplicateIndex]) {
    state.dump = '*ref_' + duplicateIndex;
  } else {
    if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {
      state.usedDuplicates[duplicateIndex] = true;
    }
    if (type === '[object Object]') {
      if (block && (Object.keys(state.dump).length !== 0)) {
        writeBlockMapping(state, level, state.dump, compact);
        if (duplicate) {
          state.dump = '&ref_' + duplicateIndex + state.dump;
        }
      } else {
        writeFlowMapping(state, level, state.dump);
        if (duplicate) {
          state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;
        }
      }
    } else if (type === '[object Array]') {
      if (block && (state.dump.length !== 0)) {
        if (state.noArrayIndent && !isblockseq && level > 0) {
          writeBlockSequence(state, level - 1, state.dump, compact);
        } else {
          writeBlockSequence(state, level, state.dump, compact);
        }
        if (duplicate) {
          state.dump = '&ref_' + duplicateIndex + state.dump;
        }
      } else {
        writeFlowSequence(state, level, state.dump);
        if (duplicate) {
          state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;
        }
      }
    } else if (type === '[object String]') {
      if (state.tag !== '?') {
        writeScalar(state, state.dump, level, iskey, inblock);
      }
    } else if (type === '[object Undefined]') {
      return false;
    } else {
      if (state.skipInvalid) return false;
      throw new YAMLException('unacceptable kind of an object to dump ' + type);
    }

    if (state.tag !== null && state.tag !== '?') {
      // Need to encode all characters except those allowed by the spec:
      //
      // [35] ns-dec-digit    ::=  [#x30-#x39] /* 0-9 */
      // [36] ns-hex-digit    ::=  ns-dec-digit
      //                         | [#x41-#x46] /* A-F */ | [#x61-#x66] /* a-f */
      // [37] ns-ascii-letter ::=  [#x41-#x5A] /* A-Z */ | [#x61-#x7A] /* a-z */
      // [38] ns-word-char    ::=  ns-dec-digit | ns-ascii-letter | “-”
      // [39] ns-uri-char     ::=  “%” ns-hex-digit ns-hex-digit | ns-word-char | “#”
      //                         | “;” | “/” | “?” | “:” | “@” | “&” | “=” | “+” | “$” | “,”
      //                         | “_” | “.” | “!” | “~” | “*” | “'” | “(” | “)” | “[” | “]”
      //
      // Also need to encode '!' because it has special meaning (end of tag prefix).
      //
      tagStr = encodeURI(
        state.tag[0] === '!' ? state.tag.slice(1) : state.tag
      ).replace(/!/g, '%21');

      if (state.tag[0] === '!') {
        tagStr = '!' + tagStr;
      } else if (tagStr.slice(0, 18) === 'tag:yaml.org,2002:') {
        tagStr = '!!' + tagStr.slice(18);
      } else {
        tagStr = '!<' + tagStr + '>';
      }

      state.dump = tagStr + ' ' + state.dump;
    }
  }

  return true;
}

function getDuplicateReferences(object, state) {
  var objects = [],
      duplicatesIndexes = [],
      index,
      length;

  inspectNode(object, objects, duplicatesIndexes);

  for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {
    state.duplicates.push(objects[duplicatesIndexes[index]]);
  }
  state.usedDuplicates = new Array(length);
}

function inspectNode(object, objects, duplicatesIndexes) {
  var objectKeyList,
      index,
      length;

  if (object !== null && typeof object === 'object') {
    index = objects.indexOf(object);
    if (index !== -1) {
      if (duplicatesIndexes.indexOf(index) === -1) {
        duplicatesIndexes.push(index);
      }
    } else {
      objects.push(object);

      if (Array.isArray(object)) {
        for (index = 0, length = object.length; index < length; index += 1) {
          inspectNode(object[index], objects, duplicatesIndexes);
        }
      } else {
        objectKeyList = Object.keys(object);

        for (index = 0, length = objectKeyList.length; index < length; index += 1) {
          inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);
        }
      }
    }
  }
}

function dump(input, options) {
  options = options || {};

  var state = new State(options);

  if (!state.noRefs) getDuplicateReferences(input, state);

  var value = input;

  if (state.replacer) {
    value = state.replacer.call({ '': value }, '', value);
  }

  if (writeNode(state, 0, value, true, true)) return state.dump + '\n';

  return '';
}

module.exports.dump = dump;
// YAML error class. http://stackoverflow.com/questions/8458984
//
'use strict';


function formatError(exception, compact) {
  var where = '', message = exception.reason || '(unknown reason)';

  if (!exception.mark) return message;

  if (exception.mark.name) {
    where += 'in "' + exception.mark.name + '" ';
  }

  where += '(' + (exception.mark.line + 1) + ':' + (exception.mark.column + 1) + ')';

  if (!compact && exception.mark.snippet) {
    where += '\n\n' + exception.mark.snippet;
  }

  return message + ' ' + where;
}


function YAMLException(reason, mark) {
  // Super constructor
  Error.call(this);

  this.name = 'YAMLException';
  this.reason = reason;
  this.mark = mark;
  this.message = formatError(this, false);

  // Include stack trace in error object
  if (Error.captureStackTrace) {
    // Chrome and NodeJS
    Error.captureStackTrace(this, this.constructor);
  } else {
    // FF, IE 10+ and Safari 6+. Fallback for others
    this.stack = (new Error()).stack || '';
  }
}


// Inherit from Error
YAMLException.prototype = Object.create(Error.prototype);
YAMLException.prototype.constructor = YAMLException;


YAMLException.prototype.toString = function toString(compact) {
  return this.name + ': ' + formatError(this, compact);
};


module.exports = YAMLException;
'use strict';

/*eslint-disable max-len,no-use-before-define*/

var common              = require('./common');
var YAMLException       = require('./exception');
var makeSnippet         = require('./snippet');
var DEFAULT_SCHEMA      = require('./schema/default');


var _hasOwnProperty = Object.prototype.hasOwnProperty;


var CONTEXT_FLOW_IN   = 1;
var CONTEXT_FLOW_OUT  = 2;
var CONTEXT_BLOCK_IN  = 3;
var CONTEXT_BLOCK_OUT = 4;


var CHOMPING_CLIP  = 1;
var CHOMPING_STRIP = 2;
var CHOMPING_KEEP  = 3;


var PATTERN_NON_PRINTABLE         = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/;
var PATTERN_NON_ASCII_LINE_BREAKS = /[\x85\u2028\u2029]/;
var PATTERN_FLOW_INDICATORS       = /[,\[\]\{\}]/;
var PATTERN_TAG_HANDLE            = /^(?:!|!!|![a-z\-]+!)$/i;
var PATTERN_TAG_URI               = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;


function _class(obj) { return Object.prototype.toString.call(obj); }

function is_EOL(c) {
  return (c === 0x0A/* LF */) || (c === 0x0D/* CR */);
}

function is_WHITE_SPACE(c) {
  return (c === 0x09/* Tab */) || (c === 0x20/* Space */);
}

function is_WS_OR_EOL(c) {
  return (c === 0x09/* Tab */) ||
         (c === 0x20/* Space */) ||
         (c === 0x0A/* LF */) ||
         (c === 0x0D/* CR */);
}

function is_FLOW_INDICATOR(c) {
  return c === 0x2C/* , */ ||
         c === 0x5B/* [ */ ||
         c === 0x5D/* ] */ ||
         c === 0x7B/* { */ ||
         c === 0x7D/* } */;
}

function fromHexCode(c) {
  var lc;

  if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {
    return c - 0x30;
  }

  /*eslint-disable no-bitwise*/
  lc = c | 0x20;

  if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) {
    return lc - 0x61 + 10;
  }

  return -1;
}

function escapedHexLen(c) {
  if (c === 0x78/* x */) { return 2; }
  if (c === 0x75/* u */) { return 4; }
  if (c === 0x55/* U */) { return 8; }
  return 0;
}

function fromDecimalCode(c) {
  if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {
    return c - 0x30;
  }

  return -1;
}

function simpleEscapeSequence(c) {
  /* eslint-disable indent */
  return (c === 0x30/* 0 */) ? '\x00' :
        (c === 0x61/* a */) ? '\x07' :
        (c === 0x62/* b */) ? '\x08' :
        (c === 0x74/* t */) ? '\x09' :
        (c === 0x09/* Tab */) ? '\x09' :
        (c === 0x6E/* n */) ? '\x0A' :
        (c === 0x76/* v */) ? '\x0B' :
        (c === 0x66/* f */) ? '\x0C' :
        (c === 0x72/* r */) ? '\x0D' :
        (c === 0x65/* e */) ? '\x1B' :
        (c === 0x20/* Space */) ? ' ' :
        (c === 0x22/* " */) ? '\x22' :
        (c === 0x2F/* / */) ? '/' :
        (c === 0x5C/* \ */) ? '\x5C' :
        (c === 0x4E/* N */) ? '\x85' :
        (c === 0x5F/* _ */) ? '\xA0' :
        (c === 0x4C/* L */) ? '\u2028' :
        (c === 0x50/* P */) ? '\u2029' : '';
}

function charFromCodepoint(c) {
  if (c <= 0xFFFF) {
    return String.fromCharCode(c);
  }
  // Encode UTF-16 surrogate pair
  // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF
  return String.fromCharCode(
    ((c - 0x010000) >> 10) + 0xD800,
    ((c - 0x010000) & 0x03FF) + 0xDC00
  );
}

var simpleEscapeCheck = new Array(256); // integer, for fast access
var simpleEscapeMap = new Array(256);
for (var i = 0; i < 256; i++) {
  simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;
  simpleEscapeMap[i] = simpleEscapeSequence(i);
}


function State(input, options) {
  this.input = input;

  this.filename  = options['filename']  || null;
  this.schema    = options['schema']    || DEFAULT_SCHEMA;
  this.onWarning = options['onWarning'] || null;
  // (Hidden) Remove? makes the loader to expect YAML 1.1 documents
  // if such documents have no explicit %YAML directive
  this.legacy    = options['legacy']    || false;

  this.json      = options['json']      || false;
  this.listener  = options['listener']  || null;

  this.implicitTypes = this.schema.compiledImplicit;
  this.typeMap       = this.schema.compiledTypeMap;

  this.length     = input.length;
  this.position   = 0;
  this.line       = 0;
  this.lineStart  = 0;
  this.lineIndent = 0;

  // position of first leading tab in the current line,
  // used to make sure there are no tabs in the indentation
  this.firstTabInLine = -1;

  this.documents = [];

  /*
  this.version;
  this.checkLineBreaks;
  this.tagMap;
  this.anchorMap;
  this.tag;
  this.anchor;
  this.kind;
  this.result;*/

}


function generateError(state, message) {
  var mark = {
    name:     state.filename,
    buffer:   state.input.slice(0, -1), // omit trailing \0
    position: state.position,
    line:     state.line,
    column:   state.position - state.lineStart
  };

  mark.snippet = makeSnippet(mark);

  return new YAMLException(message, mark);
}

function throwError(state, message) {
  throw generateError(state, message);
}

function throwWarning(state, message) {
  if (state.onWarning) {
    state.onWarning.call(null, generateError(state, message));
  }
}


var directiveHandlers = {

  YAML: function handleYamlDirective(state, name, args) {

    var match, major, minor;

    if (state.version !== null) {
      throwError(state, 'duplication of %YAML directive');
    }

    if (args.length !== 1) {
      throwError(state, 'YAML directive accepts exactly one argument');
    }

    match = /^([0-9]+)\.([0-9]+)$/.exec(args[0]);

    if (match === null) {
      throwError(state, 'ill-formed argument of the YAML directive');
    }

    major = parseInt(match[1], 10);
    minor = parseInt(match[2], 10);

    if (major !== 1) {
      throwError(state, 'unacceptable YAML version of the document');
    }

    state.version = args[0];
    state.checkLineBreaks = (minor < 2);

    if (minor !== 1 && minor !== 2) {
      throwWarning(state, 'unsupported YAML version of the document');
    }
  },

  TAG: function handleTagDirective(state, name, args) {

    var handle, prefix;

    if (args.length !== 2) {
      throwError(state, 'TAG directive accepts exactly two arguments');
    }

    handle = args[0];
    prefix = args[1];

    if (!PATTERN_TAG_HANDLE.test(handle)) {
      throwError(state, 'ill-formed tag handle (first argument) of the TAG directive');
    }

    if (_hasOwnProperty.call(state.tagMap, handle)) {
      throwError(state, 'there is a previously declared suffix for "' + handle + '" tag handle');
    }

    if (!PATTERN_TAG_URI.test(prefix)) {
      throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive');
    }

    try {
      prefix = decodeURIComponent(prefix);
    } catch (err) {
      throwError(state, 'tag prefix is malformed: ' + prefix);
    }

    state.tagMap[handle] = prefix;
  }
};


function captureSegment(state, start, end, checkJson) {
  var _position, _length, _character, _result;

  if (start < end) {
    _result = state.input.slice(start, end);

    if (checkJson) {
      for (_position = 0, _length = _result.length; _position < _length; _position += 1) {
        _character = _result.charCodeAt(_position);
        if (!(_character === 0x09 ||
              (0x20 <= _character && _character <= 0x10FFFF))) {
          throwError(state, 'expected valid JSON character');
        }
      }
    } else if (PATTERN_NON_PRINTABLE.test(_result)) {
      throwError(state, 'the stream contains non-printable characters');
    }

    state.result += _result;
  }
}

function mergeMappings(state, destination, source, overridableKeys) {
  var sourceKeys, key, index, quantity;

  if (!common.isObject(source)) {
    throwError(state, 'cannot merge mappings; the provided source object is unacceptable');
  }

  sourceKeys = Object.keys(source);

  for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {
    key = sourceKeys[index];

    if (!_hasOwnProperty.call(destination, key)) {
      destination[key] = source[key];
      overridableKeys[key] = true;
    }
  }
}

function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode,
  startLine, startLineStart, startPos) {

  var index, quantity;

  // The output is a plain object here, so keys can only be strings.
  // We need to convert keyNode to a string, but doing so can hang the process
  // (deeply nested arrays that explode exponentially using aliases).
  if (Array.isArray(keyNode)) {
    keyNode = Array.prototype.slice.call(keyNode);

    for (index = 0, quantity = keyNode.length; index < quantity; index += 1) {
      if (Array.isArray(keyNode[index])) {
        throwError(state, 'nested arrays are not supported inside keys');
      }

      if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') {
        keyNode[index] = '[object Object]';
      }
    }
  }

  // Avoid code execution in load() via toString property
  // (still use its own toString for arrays, timestamps,
  // and whatever user schema extensions happen to have @@toStringTag)
  if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') {
    keyNode = '[object Object]';
  }


  keyNode = String(keyNode);

  if (_result === null) {
    _result = {};
  }

  if (keyTag === 'tag:yaml.org,2002:merge') {
    if (Array.isArray(valueNode)) {
      for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {
        mergeMappings(state, _result, valueNode[index], overridableKeys);
      }
    } else {
      mergeMappings(state, _result, valueNode, overridableKeys);
    }
  } else {
    if (!state.json &&
        !_hasOwnProperty.call(overridableKeys, keyNode) &&
        _hasOwnProperty.call(_result, keyNode)) {
      state.line = startLine || state.line;
      state.lineStart = startLineStart || state.lineStart;
      state.position = startPos || state.position;
      throwError(state, 'duplicated mapping key');
    }

    // used for this specific key only because Object.defineProperty is slow
    if (keyNode === '__proto__') {
      Object.defineProperty(_result, keyNode, {
        configurable: true,
        enumerable: true,
        writable: true,
        value: valueNode
      });
    } else {
      _result[keyNode] = valueNode;
    }
    delete overridableKeys[keyNode];
  }

  return _result;
}

function readLineBreak(state) {
  var ch;

  ch = state.input.charCodeAt(state.position);

  if (ch === 0x0A/* LF */) {
    state.position++;
  } else if (ch === 0x0D/* CR */) {
    state.position++;
    if (state.input.charCodeAt(state.position) === 0x0A/* LF */) {
      state.position++;
    }
  } else {
    throwError(state, 'a line break is expected');
  }

  state.line += 1;
  state.lineStart = state.position;
  state.firstTabInLine = -1;
}

function skipSeparationSpace(state, allowComments, checkIndent) {
  var lineBreaks = 0,
      ch = state.input.charCodeAt(state.position);

  while (ch !== 0) {
    while (is_WHITE_SPACE(ch)) {
      if (ch === 0x09/* Tab */ && state.firstTabInLine === -1) {
        state.firstTabInLine = state.position;
      }
      ch = state.input.charCodeAt(++state.position);
    }

    if (allowComments && ch === 0x23/* # */) {
      do {
        ch = state.input.charCodeAt(++state.position);
      } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && ch !== 0);
    }

    if (is_EOL(ch)) {
      readLineBreak(state);

      ch = state.input.charCodeAt(state.position);
      lineBreaks++;
      state.lineIndent = 0;

      while (ch === 0x20/* Space */) {
        state.lineIndent++;
        ch = state.input.charCodeAt(++state.position);
      }
    } else {
      break;
    }
  }

  if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {
    throwWarning(state, 'deficient indentation');
  }

  return lineBreaks;
}

function testDocumentSeparator(state) {
  var _position = state.position,
      ch;

  ch = state.input.charCodeAt(_position);

  // Condition state.position === state.lineStart is tested
  // in parent on each call, for efficiency. No needs to test here again.
  if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) &&
      ch === state.input.charCodeAt(_position + 1) &&
      ch === state.input.charCodeAt(_position + 2)) {

    _position += 3;

    ch = state.input.charCodeAt(_position);

    if (ch === 0 || is_WS_OR_EOL(ch)) {
      return true;
    }
  }

  return false;
}

function writeFoldedLines(state, count) {
  if (count === 1) {
    state.result += ' ';
  } else if (count > 1) {
    state.result += common.repeat('\n', count - 1);
  }
}


function readPlainScalar(state, nodeIndent, withinFlowCollection) {
  var preceding,
      following,
      captureStart,
      captureEnd,
      hasPendingContent,
      _line,
      _lineStart,
      _lineIndent,
      _kind = state.kind,
      _result = state.result,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (is_WS_OR_EOL(ch)      ||
      is_FLOW_INDICATOR(ch) ||
      ch === 0x23/* # */    ||
      ch === 0x26/* & */    ||
      ch === 0x2A/* * */    ||
      ch === 0x21/* ! */    ||
      ch === 0x7C/* | */    ||
      ch === 0x3E/* > */    ||
      ch === 0x27/* ' */    ||
      ch === 0x22/* " */    ||
      ch === 0x25/* % */    ||
      ch === 0x40/* @ */    ||
      ch === 0x60/* ` */) {
    return false;
  }

  if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) {
    following = state.input.charCodeAt(state.position + 1);

    if (is_WS_OR_EOL(following) ||
        withinFlowCollection && is_FLOW_INDICATOR(following)) {
      return false;
    }
  }

  state.kind = 'scalar';
  state.result = '';
  captureStart = captureEnd = state.position;
  hasPendingContent = false;

  while (ch !== 0) {
    if (ch === 0x3A/* : */) {
      following = state.input.charCodeAt(state.position + 1);

      if (is_WS_OR_EOL(following) ||
          withinFlowCollection && is_FLOW_INDICATOR(following)) {
        break;
      }

    } else if (ch === 0x23/* # */) {
      preceding = state.input.charCodeAt(state.position - 1);

      if (is_WS_OR_EOL(preceding)) {
        break;
      }

    } else if ((state.position === state.lineStart && testDocumentSeparator(state)) ||
               withinFlowCollection && is_FLOW_INDICATOR(ch)) {
      break;

    } else if (is_EOL(ch)) {
      _line = state.line;
      _lineStart = state.lineStart;
      _lineIndent = state.lineIndent;
      skipSeparationSpace(state, false, -1);

      if (state.lineIndent >= nodeIndent) {
        hasPendingContent = true;
        ch = state.input.charCodeAt(state.position);
        continue;
      } else {
        state.position = captureEnd;
        state.line = _line;
        state.lineStart = _lineStart;
        state.lineIndent = _lineIndent;
        break;
      }
    }

    if (hasPendingContent) {
      captureSegment(state, captureStart, captureEnd, false);
      writeFoldedLines(state, state.line - _line);
      captureStart = captureEnd = state.position;
      hasPendingContent = false;
    }

    if (!is_WHITE_SPACE(ch)) {
      captureEnd = state.position + 1;
    }

    ch = state.input.charCodeAt(++state.position);
  }

  captureSegment(state, captureStart, captureEnd, false);

  if (state.result) {
    return true;
  }

  state.kind = _kind;
  state.result = _result;
  return false;
}

function readSingleQuotedScalar(state, nodeIndent) {
  var ch,
      captureStart, captureEnd;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x27/* ' */) {
    return false;
  }

  state.kind = 'scalar';
  state.result = '';
  state.position++;
  captureStart = captureEnd = state.position;

  while ((ch = state.input.charCodeAt(state.position)) !== 0) {
    if (ch === 0x27/* ' */) {
      captureSegment(state, captureStart, state.position, true);
      ch = state.input.charCodeAt(++state.position);

      if (ch === 0x27/* ' */) {
        captureStart = state.position;
        state.position++;
        captureEnd = state.position;
      } else {
        return true;
      }

    } else if (is_EOL(ch)) {
      captureSegment(state, captureStart, captureEnd, true);
      writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));
      captureStart = captureEnd = state.position;

    } else if (state.position === state.lineStart && testDocumentSeparator(state)) {
      throwError(state, 'unexpected end of the document within a single quoted scalar');

    } else {
      state.position++;
      captureEnd = state.position;
    }
  }

  throwError(state, 'unexpected end of the stream within a single quoted scalar');
}

function readDoubleQuotedScalar(state, nodeIndent) {
  var captureStart,
      captureEnd,
      hexLength,
      hexResult,
      tmp,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x22/* " */) {
    return false;
  }

  state.kind = 'scalar';
  state.result = '';
  state.position++;
  captureStart = captureEnd = state.position;

  while ((ch = state.input.charCodeAt(state.position)) !== 0) {
    if (ch === 0x22/* " */) {
      captureSegment(state, captureStart, state.position, true);
      state.position++;
      return true;

    } else if (ch === 0x5C/* \ */) {
      captureSegment(state, captureStart, state.position, true);
      ch = state.input.charCodeAt(++state.position);

      if (is_EOL(ch)) {
        skipSeparationSpace(state, false, nodeIndent);

        // TODO: rework to inline fn with no type cast?
      } else if (ch < 256 && simpleEscapeCheck[ch]) {
        state.result += simpleEscapeMap[ch];
        state.position++;

      } else if ((tmp = escapedHexLen(ch)) > 0) {
        hexLength = tmp;
        hexResult = 0;

        for (; hexLength > 0; hexLength--) {
          ch = state.input.charCodeAt(++state.position);

          if ((tmp = fromHexCode(ch)) >= 0) {
            hexResult = (hexResult << 4) + tmp;

          } else {
            throwError(state, 'expected hexadecimal character');
          }
        }

        state.result += charFromCodepoint(hexResult);

        state.position++;

      } else {
        throwError(state, 'unknown escape sequence');
      }

      captureStart = captureEnd = state.position;

    } else if (is_EOL(ch)) {
      captureSegment(state, captureStart, captureEnd, true);
      writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));
      captureStart = captureEnd = state.position;

    } else if (state.position === state.lineStart && testDocumentSeparator(state)) {
      throwError(state, 'unexpected end of the document within a double quoted scalar');

    } else {
      state.position++;
      captureEnd = state.position;
    }
  }

  throwError(state, 'unexpected end of the stream within a double quoted scalar');
}

function readFlowCollection(state, nodeIndent) {
  var readNext = true,
      _line,
      _lineStart,
      _pos,
      _tag     = state.tag,
      _result,
      _anchor  = state.anchor,
      following,
      terminator,
      isPair,
      isExplicitPair,
      isMapping,
      overridableKeys = Object.create(null),
      keyNode,
      keyTag,
      valueNode,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch === 0x5B/* [ */) {
    terminator = 0x5D;/* ] */
    isMapping = false;
    _result = [];
  } else if (ch === 0x7B/* { */) {
    terminator = 0x7D;/* } */
    isMapping = true;
    _result = {};
  } else {
    return false;
  }

  if (state.anchor !== null) {
    state.anchorMap[state.anchor] = _result;
  }

  ch = state.input.charCodeAt(++state.position);

  while (ch !== 0) {
    skipSeparationSpace(state, true, nodeIndent);

    ch = state.input.charCodeAt(state.position);

    if (ch === terminator) {
      state.position++;
      state.tag = _tag;
      state.anchor = _anchor;
      state.kind = isMapping ? 'mapping' : 'sequence';
      state.result = _result;
      return true;
    } else if (!readNext) {
      throwError(state, 'missed comma between flow collection entries');
    } else if (ch === 0x2C/* , */) {
      // "flow collection entries can never be completely empty", as per YAML 1.2, section 7.4
      throwError(state, "expected the node content, but found ','");
    }

    keyTag = keyNode = valueNode = null;
    isPair = isExplicitPair = false;

    if (ch === 0x3F/* ? */) {
      following = state.input.charCodeAt(state.position + 1);

      if (is_WS_OR_EOL(following)) {
        isPair = isExplicitPair = true;
        state.position++;
        skipSeparationSpace(state, true, nodeIndent);
      }
    }

    _line = state.line; // Save the current line.
    _lineStart = state.lineStart;
    _pos = state.position;
    composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);
    keyTag = state.tag;
    keyNode = state.result;
    skipSeparationSpace(state, true, nodeIndent);

    ch = state.input.charCodeAt(state.position);

    if ((isExplicitPair || state.line === _line) && ch === 0x3A/* : */) {
      isPair = true;
      ch = state.input.charCodeAt(++state.position);
      skipSeparationSpace(state, true, nodeIndent);
      composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);
      valueNode = state.result;
    }

    if (isMapping) {
      storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos);
    } else if (isPair) {
      _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos));
    } else {
      _result.push(keyNode);
    }

    skipSeparationSpace(state, true, nodeIndent);

    ch = state.input.charCodeAt(state.position);

    if (ch === 0x2C/* , */) {
      readNext = true;
      ch = state.input.charCodeAt(++state.position);
    } else {
      readNext = false;
    }
  }

  throwError(state, 'unexpected end of the stream within a flow collection');
}

function readBlockScalar(state, nodeIndent) {
  var captureStart,
      folding,
      chomping       = CHOMPING_CLIP,
      didReadContent = false,
      detectedIndent = false,
      textIndent     = nodeIndent,
      emptyLines     = 0,
      atMoreIndented = false,
      tmp,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch === 0x7C/* | */) {
    folding = false;
  } else if (ch === 0x3E/* > */) {
    folding = true;
  } else {
    return false;
  }

  state.kind = 'scalar';
  state.result = '';

  while (ch !== 0) {
    ch = state.input.charCodeAt(++state.position);

    if (ch === 0x2B/* + */ || ch === 0x2D/* - */) {
      if (CHOMPING_CLIP === chomping) {
        chomping = (ch === 0x2B/* + */) ? CHOMPING_KEEP : CHOMPING_STRIP;
      } else {
        throwError(state, 'repeat of a chomping mode identifier');
      }

    } else if ((tmp = fromDecimalCode(ch)) >= 0) {
      if (tmp === 0) {
        throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one');
      } else if (!detectedIndent) {
        textIndent = nodeIndent + tmp - 1;
        detectedIndent = true;
      } else {
        throwError(state, 'repeat of an indentation width identifier');
      }

    } else {
      break;
    }
  }

  if (is_WHITE_SPACE(ch)) {
    do { ch = state.input.charCodeAt(++state.position); }
    while (is_WHITE_SPACE(ch));

    if (ch === 0x23/* # */) {
      do { ch = state.input.charCodeAt(++state.position); }
      while (!is_EOL(ch) && (ch !== 0));
    }
  }

  while (ch !== 0) {
    readLineBreak(state);
    state.lineIndent = 0;

    ch = state.input.charCodeAt(state.position);

    while ((!detectedIndent || state.lineIndent < textIndent) &&
           (ch === 0x20/* Space */)) {
      state.lineIndent++;
      ch = state.input.charCodeAt(++state.position);
    }

    if (!detectedIndent && state.lineIndent > textIndent) {
      textIndent = state.lineIndent;
    }

    if (is_EOL(ch)) {
      emptyLines++;
      continue;
    }

    // End of the scalar.
    if (state.lineIndent < textIndent) {

      // Perform the chomping.
      if (chomping === CHOMPING_KEEP) {
        state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines);
      } else if (chomping === CHOMPING_CLIP) {
        if (didReadContent) { // i.e. only if the scalar is not empty.
          state.result += '\n';
        }
      }

      // Break this `while` cycle and go to the funciton's epilogue.
      break;
    }

    // Folded style: use fancy rules to handle line breaks.
    if (folding) {

      // Lines starting with white space characters (more-indented lines) are not folded.
      if (is_WHITE_SPACE(ch)) {
        atMoreIndented = true;
        // except for the first content line (cf. Example 8.1)
        state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines);

      // End of more-indented block.
      } else if (atMoreIndented) {
        atMoreIndented = false;
        state.result += common.repeat('\n', emptyLines + 1);

      // Just one line break - perceive as the same line.
      } else if (emptyLines === 0) {
        if (didReadContent) { // i.e. only if we have already read some scalar content.
          state.result += ' ';
        }

      // Several line breaks - perceive as different lines.
      } else {
        state.result += common.repeat('\n', emptyLines);
      }

    // Literal style: just add exact number of line breaks between content lines.
    } else {
      // Keep all line breaks except the header line break.
      state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines);
    }

    didReadContent = true;
    detectedIndent = true;
    emptyLines = 0;
    captureStart = state.position;

    while (!is_EOL(ch) && (ch !== 0)) {
      ch = state.input.charCodeAt(++state.position);
    }

    captureSegment(state, captureStart, state.position, false);
  }

  return true;
}

function readBlockSequence(state, nodeIndent) {
  var _line,
      _tag      = state.tag,
      _anchor   = state.anchor,
      _result   = [],
      following,
      detected  = false,
      ch;

  // there is a leading tab before this token, so it can't be a block sequence/mapping;
  // it can still be flow sequence/mapping or a scalar
  if (state.firstTabInLine !== -1) return false;

  if (state.anchor !== null) {
    state.anchorMap[state.anchor] = _result;
  }

  ch = state.input.charCodeAt(state.position);

  while (ch !== 0) {
    if (state.firstTabInLine !== -1) {
      state.position = state.firstTabInLine;
      throwError(state, 'tab characters must not be used in indentation');
    }

    if (ch !== 0x2D/* - */) {
      break;
    }

    following = state.input.charCodeAt(state.position + 1);

    if (!is_WS_OR_EOL(following)) {
      break;
    }

    detected = true;
    state.position++;

    if (skipSeparationSpace(state, true, -1)) {
      if (state.lineIndent <= nodeIndent) {
        _result.push(null);
        ch = state.input.charCodeAt(state.position);
        continue;
      }
    }

    _line = state.line;
    composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);
    _result.push(state.result);
    skipSeparationSpace(state, true, -1);

    ch = state.input.charCodeAt(state.position);

    if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {
      throwError(state, 'bad indentation of a sequence entry');
    } else if (state.lineIndent < nodeIndent) {
      break;
    }
  }

  if (detected) {
    state.tag = _tag;
    state.anchor = _anchor;
    state.kind = 'sequence';
    state.result = _result;
    return true;
  }
  return false;
}

function readBlockMapping(state, nodeIndent, flowIndent) {
  var following,
      allowCompact,
      _line,
      _keyLine,
      _keyLineStart,
      _keyPos,
      _tag          = state.tag,
      _anchor       = state.anchor,
      _result       = {},
      overridableKeys = Object.create(null),
      keyTag        = null,
      keyNode       = null,
      valueNode     = null,
      atExplicitKey = false,
      detected      = false,
      ch;

  // there is a leading tab before this token, so it can't be a block sequence/mapping;
  // it can still be flow sequence/mapping or a scalar
  if (state.firstTabInLine !== -1) return false;

  if (state.anchor !== null) {
    state.anchorMap[state.anchor] = _result;
  }

  ch = state.input.charCodeAt(state.position);

  while (ch !== 0) {
    if (!atExplicitKey && state.firstTabInLine !== -1) {
      state.position = state.firstTabInLine;
      throwError(state, 'tab characters must not be used in indentation');
    }

    following = state.input.charCodeAt(state.position + 1);
    _line = state.line; // Save the current line.

    //
    // Explicit notation case. There are two separate blocks:
    // first for the key (denoted by "?") and second for the value (denoted by ":")
    //
    if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && is_WS_OR_EOL(following)) {

      if (ch === 0x3F/* ? */) {
        if (atExplicitKey) {
          storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);
          keyTag = keyNode = valueNode = null;
        }

        detected = true;
        atExplicitKey = true;
        allowCompact = true;

      } else if (atExplicitKey) {
        // i.e. 0x3A/* : */ === character after the explicit key.
        atExplicitKey = false;
        allowCompact = true;

      } else {
        throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line');
      }

      state.position += 1;
      ch = following;

    //
    // Implicit notation case. Flow-style node as the key first, then ":", and the value.
    //
    } else {
      _keyLine = state.line;
      _keyLineStart = state.lineStart;
      _keyPos = state.position;

      if (!composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {
        // Neither implicit nor explicit notation.
        // Reading is done. Go to the epilogue.
        break;
      }

      if (state.line === _line) {
        ch = state.input.charCodeAt(state.position);

        while (is_WHITE_SPACE(ch)) {
          ch = state.input.charCodeAt(++state.position);
        }

        if (ch === 0x3A/* : */) {
          ch = state.input.charCodeAt(++state.position);

          if (!is_WS_OR_EOL(ch)) {
            throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping');
          }

          if (atExplicitKey) {
            storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);
            keyTag = keyNode = valueNode = null;
          }

          detected = true;
          atExplicitKey = false;
          allowCompact = false;
          keyTag = state.tag;
          keyNode = state.result;

        } else if (detected) {
          throwError(state, 'can not read an implicit mapping pair; a colon is missed');

        } else {
          state.tag = _tag;
          state.anchor = _anchor;
          return true; // Keep the result of `composeNode`.
        }

      } else if (detected) {
        throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key');

      } else {
        state.tag = _tag;
        state.anchor = _anchor;
        return true; // Keep the result of `composeNode`.
      }
    }

    //
    // Common reading code for both explicit and implicit notations.
    //
    if (state.line === _line || state.lineIndent > nodeIndent) {
      if (atExplicitKey) {
        _keyLine = state.line;
        _keyLineStart = state.lineStart;
        _keyPos = state.position;
      }

      if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {
        if (atExplicitKey) {
          keyNode = state.result;
        } else {
          valueNode = state.result;
        }
      }

      if (!atExplicitKey) {
        storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _keyLine, _keyLineStart, _keyPos);
        keyTag = keyNode = valueNode = null;
      }

      skipSeparationSpace(state, true, -1);
      ch = state.input.charCodeAt(state.position);
    }

    if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {
      throwError(state, 'bad indentation of a mapping entry');
    } else if (state.lineIndent < nodeIndent) {
      break;
    }
  }

  //
  // Epilogue.
  //

  // Special case: last mapping's node contains only the key in explicit notation.
  if (atExplicitKey) {
    storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);
  }

  // Expose the resulting mapping.
  if (detected) {
    state.tag = _tag;
    state.anchor = _anchor;
    state.kind = 'mapping';
    state.result = _result;
  }

  return detected;
}

function readTagProperty(state) {
  var _position,
      isVerbatim = false,
      isNamed    = false,
      tagHandle,
      tagName,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x21/* ! */) return false;

  if (state.tag !== null) {
    throwError(state, 'duplication of a tag property');
  }

  ch = state.input.charCodeAt(++state.position);

  if (ch === 0x3C/* < */) {
    isVerbatim = true;
    ch = state.input.charCodeAt(++state.position);

  } else if (ch === 0x21/* ! */) {
    isNamed = true;
    tagHandle = '!!';
    ch = state.input.charCodeAt(++state.position);

  } else {
    tagHandle = '!';
  }

  _position = state.position;

  if (isVerbatim) {
    do { ch = state.input.charCodeAt(++state.position); }
    while (ch !== 0 && ch !== 0x3E/* > */);

    if (state.position < state.length) {
      tagName = state.input.slice(_position, state.position);
      ch = state.input.charCodeAt(++state.position);
    } else {
      throwError(state, 'unexpected end of the stream within a verbatim tag');
    }
  } else {
    while (ch !== 0 && !is_WS_OR_EOL(ch)) {

      if (ch === 0x21/* ! */) {
        if (!isNamed) {
          tagHandle = state.input.slice(_position - 1, state.position + 1);

          if (!PATTERN_TAG_HANDLE.test(tagHandle)) {
            throwError(state, 'named tag handle cannot contain such characters');
          }

          isNamed = true;
          _position = state.position + 1;
        } else {
          throwError(state, 'tag suffix cannot contain exclamation marks');
        }
      }

      ch = state.input.charCodeAt(++state.position);
    }

    tagName = state.input.slice(_position, state.position);

    if (PATTERN_FLOW_INDICATORS.test(tagName)) {
      throwError(state, 'tag suffix cannot contain flow indicator characters');
    }
  }

  if (tagName && !PATTERN_TAG_URI.test(tagName)) {
    throwError(state, 'tag name cannot contain such characters: ' + tagName);
  }

  try {
    tagName = decodeURIComponent(tagName);
  } catch (err) {
    throwError(state, 'tag name is malformed: ' + tagName);
  }

  if (isVerbatim) {
    state.tag = tagName;

  } else if (_hasOwnProperty.call(state.tagMap, tagHandle)) {
    state.tag = state.tagMap[tagHandle] + tagName;

  } else if (tagHandle === '!') {
    state.tag = '!' + tagName;

  } else if (tagHandle === '!!') {
    state.tag = 'tag:yaml.org,2002:' + tagName;

  } else {
    throwError(state, 'undeclared tag handle "' + tagHandle + '"');
  }

  return true;
}

function readAnchorProperty(state) {
  var _position,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x26/* & */) return false;

  if (state.anchor !== null) {
    throwError(state, 'duplication of an anchor property');
  }

  ch = state.input.charCodeAt(++state.position);
  _position = state.position;

  while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {
    ch = state.input.charCodeAt(++state.position);
  }

  if (state.position === _position) {
    throwError(state, 'name of an anchor node must contain at least one character');
  }

  state.anchor = state.input.slice(_position, state.position);
  return true;
}

function readAlias(state) {
  var _position, alias,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x2A/* * */) return false;

  ch = state.input.charCodeAt(++state.position);
  _position = state.position;

  while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {
    ch = state.input.charCodeAt(++state.position);
  }

  if (state.position === _position) {
    throwError(state, 'name of an alias node must contain at least one character');
  }

  alias = state.input.slice(_position, state.position);

  if (!_hasOwnProperty.call(state.anchorMap, alias)) {
    throwError(state, 'unidentified alias "' + alias + '"');
  }

  state.result = state.anchorMap[alias];
  skipSeparationSpace(state, true, -1);
  return true;
}

function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {
  var allowBlockStyles,
      allowBlockScalars,
      allowBlockCollections,
      indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this<parent
      atNewLine  = false,
      hasContent = false,
      typeIndex,
      typeQuantity,
      typeList,
      type,
      flowIndent,
      blockIndent;

  if (state.listener !== null) {
    state.listener('open', state);
  }

  state.tag    = null;
  state.anchor = null;
  state.kind   = null;
  state.result = null;

  allowBlockStyles = allowBlockScalars = allowBlockCollections =
    CONTEXT_BLOCK_OUT === nodeContext ||
    CONTEXT_BLOCK_IN  === nodeContext;

  if (allowToSeek) {
    if (skipSeparationSpace(state, true, -1)) {
      atNewLine = true;

      if (state.lineIndent > parentIndent) {
        indentStatus = 1;
      } else if (state.lineIndent === parentIndent) {
        indentStatus = 0;
      } else if (state.lineIndent < parentIndent) {
        indentStatus = -1;
      }
    }
  }

  if (indentStatus === 1) {
    while (readTagProperty(state) || readAnchorProperty(state)) {
      if (skipSeparationSpace(state, true, -1)) {
        atNewLine = true;
        allowBlockCollections = allowBlockStyles;

        if (state.lineIndent > parentIndent) {
          indentStatus = 1;
        } else if (state.lineIndent === parentIndent) {
          indentStatus = 0;
        } else if (state.lineIndent < parentIndent) {
          indentStatus = -1;
        }
      } else {
        allowBlockCollections = false;
      }
    }
  }

  if (allowBlockCollections) {
    allowBlockCollections = atNewLine || allowCompact;
  }

  if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {
    if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {
      flowIndent = parentIndent;
    } else {
      flowIndent = parentIndent + 1;
    }

    blockIndent = state.position - state.lineStart;

    if (indentStatus === 1) {
      if (allowBlockCollections &&
          (readBlockSequence(state, blockIndent) ||
           readBlockMapping(state, blockIndent, flowIndent)) ||
          readFlowCollection(state, flowIndent)) {
        hasContent = true;
      } else {
        if ((allowBlockScalars && readBlockScalar(state, flowIndent)) ||
            readSingleQuotedScalar(state, flowIndent) ||
            readDoubleQuotedScalar(state, flowIndent)) {
          hasContent = true;

        } else if (readAlias(state)) {
          hasContent = true;

          if (state.tag !== null || state.anchor !== null) {
            throwError(state, 'alias node should not have any properties');
          }

        } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {
          hasContent = true;

          if (state.tag === null) {
            state.tag = '?';
          }
        }

        if (state.anchor !== null) {
          state.anchorMap[state.anchor] = state.result;
        }
      }
    } else if (indentStatus === 0) {
      // Special case: block sequences are allowed to have same indentation level as the parent.
      // http://www.yaml.org/spec/1.2/spec.html#id2799784
      hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);
    }
  }

  if (state.tag === null) {
    if (state.anchor !== null) {
      state.anchorMap[state.anchor] = state.result;
    }

  } else if (state.tag === '?') {
    // Implicit resolving is not allowed for non-scalar types, and '?'
    // non-specific tag is only automatically assigned to plain scalars.
    //
    // We only need to check kind conformity in case user explicitly assigns '?'
    // tag, for example like this: "!<?> [0]"
    //
    if (state.result !== null && state.kind !== 'scalar') {
      throwError(state, 'unacceptable node kind for !<?> tag; it should be "scalar", not "' + state.kind + '"');
    }

    for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) {
      type = state.implicitTypes[typeIndex];

      if (type.resolve(state.result)) { // `state.result` updated in resolver if matched
        state.result = type.construct(state.result);
        state.tag = type.tag;
        if (state.anchor !== null) {
          state.anchorMap[state.anchor] = state.result;
        }
        break;
      }
    }
  } else if (state.tag !== '!') {
    if (_hasOwnProperty.call(state.typeMap[state.kind || 'fallback'], state.tag)) {
      type = state.typeMap[state.kind || 'fallback'][state.tag];
    } else {
      // looking for multi type
      type = null;
      typeList = state.typeMap.multi[state.kind || 'fallback'];

      for (typeIndex = 0, typeQuantity = typeList.length; typeIndex < typeQuantity; typeIndex += 1) {
        if (state.tag.slice(0, typeList[typeIndex].tag.length) === typeList[typeIndex].tag) {
          type = typeList[typeIndex];
          break;
        }
      }
    }

    if (!type) {
      throwError(state, 'unknown tag !<' + state.tag + '>');
    }

    if (state.result !== null && type.kind !== state.kind) {
      throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be "' + type.kind + '", not "' + state.kind + '"');
    }

    if (!type.resolve(state.result, state.tag)) { // `state.result` updated in resolver if matched
      throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag');
    } else {
      state.result = type.construct(state.result, state.tag);
      if (state.anchor !== null) {
        state.anchorMap[state.anchor] = state.result;
      }
    }
  }

  if (state.listener !== null) {
    state.listener('close', state);
  }
  return state.tag !== null ||  state.anchor !== null || hasContent;
}

function readDocument(state) {
  var documentStart = state.position,
      _position,
      directiveName,
      directiveArgs,
      hasDirectives = false,
      ch;

  state.version = null;
  state.checkLineBreaks = state.legacy;
  state.tagMap = Object.create(null);
  state.anchorMap = Object.create(null);

  while ((ch = state.input.charCodeAt(state.position)) !== 0) {
    skipSeparationSpace(state, true, -1);

    ch = state.input.charCodeAt(state.position);

    if (state.lineIndent > 0 || ch !== 0x25/* % */) {
      break;
    }

    hasDirectives = true;
    ch = state.input.charCodeAt(++state.position);
    _position = state.position;

    while (ch !== 0 && !is_WS_OR_EOL(ch)) {
      ch = state.input.charCodeAt(++state.position);
    }

    directiveName = state.input.slice(_position, state.position);
    directiveArgs = [];

    if (directiveName.length < 1) {
      throwError(state, 'directive name must not be less than one character in length');
    }

    while (ch !== 0) {
      while (is_WHITE_SPACE(ch)) {
        ch = state.input.charCodeAt(++state.position);
      }

      if (ch === 0x23/* # */) {
        do { ch = state.input.charCodeAt(++state.position); }
        while (ch !== 0 && !is_EOL(ch));
        break;
      }

      if (is_EOL(ch)) break;

      _position = state.position;

      while (ch !== 0 && !is_WS_OR_EOL(ch)) {
        ch = state.input.charCodeAt(++state.position);
      }

      directiveArgs.push(state.input.slice(_position, state.position));
    }

    if (ch !== 0) readLineBreak(state);

    if (_hasOwnProperty.call(directiveHandlers, directiveName)) {
      directiveHandlers[directiveName](state, directiveName, directiveArgs);
    } else {
      throwWarning(state, 'unknown document directive "' + directiveName + '"');
    }
  }

  skipSeparationSpace(state, true, -1);

  if (state.lineIndent === 0 &&
      state.input.charCodeAt(state.position)     === 0x2D/* - */ &&
      state.input.charCodeAt(state.position + 1) === 0x2D/* - */ &&
      state.input.charCodeAt(state.position + 2) === 0x2D/* - */) {
    state.position += 3;
    skipSeparationSpace(state, true, -1);

  } else if (hasDirectives) {
    throwError(state, 'directives end mark is expected');
  }

  composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);
  skipSeparationSpace(state, true, -1);

  if (state.checkLineBreaks &&
      PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {
    throwWarning(state, 'non-ASCII line breaks are interpreted as content');
  }

  state.documents.push(state.result);

  if (state.position === state.lineStart && testDocumentSeparator(state)) {

    if (state.input.charCodeAt(state.position) === 0x2E/* . */) {
      state.position += 3;
      skipSeparationSpace(state, true, -1);
    }
    return;
  }

  if (state.position < (state.length - 1)) {
    throwError(state, 'end of the stream or a document separator is expected');
  } else {
    return;
  }
}


function loadDocuments(input, options) {
  input = String(input);
  options = options || {};

  if (input.length !== 0) {

    // Add tailing `\n` if not exists
    if (input.charCodeAt(input.length - 1) !== 0x0A/* LF */ &&
        input.charCodeAt(input.length - 1) !== 0x0D/* CR */) {
      input += '\n';
    }

    // Strip BOM
    if (input.charCodeAt(0) === 0xFEFF) {
      input = input.slice(1);
    }
  }

  var state = new State(input, options);

  var nullpos = input.indexOf('\0');

  if (nullpos !== -1) {
    state.position = nullpos;
    throwError(state, 'null byte is not allowed in input');
  }

  // Use 0 as string terminator. That significantly simplifies bounds check.
  state.input += '\0';

  while (state.input.charCodeAt(state.position) === 0x20/* Space */) {
    state.lineIndent += 1;
    state.position += 1;
  }

  while (state.position < (state.length - 1)) {
    readDocument(state);
  }

  return state.documents;
}


function loadAll(input, iterator, options) {
  if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') {
    options = iterator;
    iterator = null;
  }

  var documents = loadDocuments(input, options);

  if (typeof iterator !== 'function') {
    return documents;
  }

  for (var index = 0, length = documents.length; index < length; index += 1) {
    iterator(documents[index]);
  }
}


function load(input, options) {
  var documents = loadDocuments(input, options);

  if (documents.length === 0) {
    /*eslint-disable no-undefined*/
    return undefined;
  } else if (documents.length === 1) {
    return documents[0];
  }
  throw new YAMLException('expected a single document in the stream, but found more');
}


module.exports.loadAll = loadAll;
module.exports.load    = load;
'use strict';

/*eslint-disable max-len*/

var YAMLException = require('./exception');
var Type          = require('./type');


function compileList(schema, name) {
  var result = [];

  schema[name].forEach(function (currentType) {
    var newIndex = result.length;

    result.forEach(function (previousType, previousIndex) {
      if (previousType.tag === currentType.tag &&
          previousType.kind === currentType.kind &&
          previousType.multi === currentType.multi) {

        newIndex = previousIndex;
      }
    });

    result[newIndex] = currentType;
  });

  return result;
}


function compileMap(/* lists... */) {
  var result = {
        scalar: {},
        sequence: {},
        mapping: {},
        fallback: {},
        multi: {
          scalar: [],
          sequence: [],
          mapping: [],
          fallback: []
        }
      }, index, length;

  function collectType(type) {
    if (type.multi) {
      result.multi[type.kind].push(type);
      result.multi['fallback'].push(type);
    } else {
      result[type.kind][type.tag] = result['fallback'][type.tag] = type;
    }
  }

  for (index = 0, length = arguments.length; index < length; index += 1) {
    arguments[index].forEach(collectType);
  }
  return result;
}


function Schema(definition) {
  return this.extend(definition);
}


Schema.prototype.extend = function extend(definition) {
  var implicit = [];
  var explicit = [];

  if (definition instanceof Type) {
    // Schema.extend(type)
    explicit.push(definition);

  } else if (Array.isArray(definition)) {
    // Schema.extend([ type1, type2, ... ])
    explicit = explicit.concat(definition);

  } else if (definition && (Array.isArray(definition.implicit) || Array.isArray(definition.explicit))) {
    // Schema.extend({ explicit: [ type1, type2, ... ], implicit: [ type1, type2, ... ] })
    if (definition.implicit) implicit = implicit.concat(definition.implicit);
    if (definition.explicit) explicit = explicit.concat(definition.explicit);

  } else {
    throw new YAMLException('Schema.extend argument should be a Type, [ Type ], ' +
      'or a schema definition ({ implicit: [...], explicit: [...] })');
  }

  implicit.forEach(function (type) {
    if (!(type instanceof Type)) {
      throw new YAMLException('Specified list of YAML types (or a single Type object) contains a non-Type object.');
    }

    if (type.loadKind && type.loadKind !== 'scalar') {
      throw new YAMLException('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.');
    }

    if (type.multi) {
      throw new YAMLException('There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.');
    }
  });

  explicit.forEach(function (type) {
    if (!(type instanceof Type)) {
      throw new YAMLException('Specified list of YAML types (or a single Type object) contains a non-Type object.');
    }
  });

  var result = Object.create(Schema.prototype);

  result.implicit = (this.implicit || []).concat(implicit);
  result.explicit = (this.explicit || []).concat(explicit);

  result.compiledImplicit = compileList(result, 'implicit');
  result.compiledExplicit = compileList(result, 'explicit');
  result.compiledTypeMap  = compileMap(result.compiledImplicit, result.compiledExplicit);

  return result;
};


module.exports = Schema;
'use strict';


var common = require('./common');


// get snippet for a single line, respecting maxLength
function getLine(buffer, lineStart, lineEnd, position, maxLineLength) {
  var head = '';
  var tail = '';
  var maxHalfLength = Math.floor(maxLineLength / 2) - 1;

  if (position - lineStart > maxHalfLength) {
    head = ' ... ';
    lineStart = position - maxHalfLength + head.length;
  }

  if (lineEnd - position > maxHalfLength) {
    tail = ' ...';
    lineEnd = position + maxHalfLength - tail.length;
  }

  return {
    str: head + buffer.slice(lineStart, lineEnd).replace(/\t/g, '→') + tail,
    pos: position - lineStart + head.length // relative position
  };
}


function padStart(string, max) {
  return common.repeat(' ', max - string.length) + string;
}


function makeSnippet(mark, options) {
  options = Object.create(options || null);

  if (!mark.buffer) return null;

  if (!options.maxLength) options.maxLength = 79;
  if (typeof options.indent      !== 'number') options.indent      = 1;
  if (typeof options.linesBefore !== 'number') options.linesBefore = 3;
  if (typeof options.linesAfter  !== 'number') options.linesAfter  = 2;

  var re = /\r?\n|\r|\0/g;
  var lineStarts = [ 0 ];
  var lineEnds = [];
  var match;
  var foundLineNo = -1;

  while ((match = re.exec(mark.buffer))) {
    lineEnds.push(match.index);
    lineStarts.push(match.index + match[0].length);

    if (mark.position <= match.index && foundLineNo < 0) {
      foundLineNo = lineStarts.length - 2;
    }
  }

  if (foundLineNo < 0) foundLineNo = lineStarts.length - 1;

  var result = '', i, line;
  var lineNoLength = Math.min(mark.line + options.linesAfter, lineEnds.length).toString().length;
  var maxLineLength = options.maxLength - (options.indent + lineNoLength + 3);

  for (i = 1; i <= options.linesBefore; i++) {
    if (foundLineNo - i < 0) break;
    line = getLine(
      mark.buffer,
      lineStarts[foundLineNo - i],
      lineEnds[foundLineNo - i],
      mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo - i]),
      maxLineLength
    );
    result = common.repeat(' ', options.indent) + padStart((mark.line - i + 1).toString(), lineNoLength) +
      ' | ' + line.str + '\n' + result;
  }

  line = getLine(mark.buffer, lineStarts[foundLineNo], lineEnds[foundLineNo], mark.position, maxLineLength);
  result += common.repeat(' ', options.indent) + padStart((mark.line + 1).toString(), lineNoLength) +
    ' | ' + line.str + '\n';
  result += common.repeat('-', options.indent + lineNoLength + 3 + line.pos) + '^' + '\n';

  for (i = 1; i <= options.linesAfter; i++) {
    if (foundLineNo + i >= lineEnds.length) break;
    line = getLine(
      mark.buffer,
      lineStarts[foundLineNo + i],
      lineEnds[foundLineNo + i],
      mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo + i]),
      maxLineLength
    );
    result += common.repeat(' ', options.indent) + padStart((mark.line + i + 1).toString(), lineNoLength) +
      ' | ' + line.str + '\n';
  }

  return result.replace(/\n$/, '');
}


module.exports = makeSnippet;
'use strict';

var YAMLException = require('./exception');

var TYPE_CONSTRUCTOR_OPTIONS = [
  'kind',
  'multi',
  'resolve',
  'construct',
  'instanceOf',
  'predicate',
  'represent',
  'representName',
  'defaultStyle',
  'styleAliases'
];

var YAML_NODE_KINDS = [
  'scalar',
  'sequence',
  'mapping'
];

function compileStyleAliases(map) {
  var result = {};

  if (map !== null) {
    Object.keys(map).forEach(function (style) {
      map[style].forEach(function (alias) {
        result[String(alias)] = style;
      });
    });
  }

  return result;
}

function Type(tag, options) {
  options = options || {};

  Object.keys(options).forEach(function (name) {
    if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {
      throw new YAMLException('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.');
    }
  });

  // TODO: Add tag format check.
  this.options       = options; // keep original options in case user wants to extend this type later
  this.tag           = tag;
  this.kind          = options['kind']          || null;
  this.resolve       = options['resolve']       || function () { return true; };
  this.construct     = options['construct']     || function (data) { return data; };
  this.instanceOf    = options['instanceOf']    || null;
  this.predicate     = options['predicate']     || null;
  this.represent     = options['represent']     || null;
  this.representName = options['representName'] || null;
  this.defaultStyle  = options['defaultStyle']  || null;
  this.multi         = options['multi']         || false;
  this.styleAliases  = compileStyleAliases(options['styleAliases'] || null);

  if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {
    throw new YAMLException('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.');
  }
}

module.exports = Type;
'use strict';

/*eslint-disable no-bitwise*/


var Type = require('../type');


// [ 64, 65, 66 ] -> [ padding, CR, LF ]
var BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r';


function resolveYamlBinary(data) {
  if (data === null) return false;

  var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP;

  // Convert one by one.
  for (idx = 0; idx < max; idx++) {
    code = map.indexOf(data.charAt(idx));

    // Skip CR/LF
    if (code > 64) continue;

    // Fail on illegal characters
    if (code < 0) return false;

    bitlen += 6;
  }

  // If there are any bits left, source was corrupted
  return (bitlen % 8) === 0;
}

function constructYamlBinary(data) {
  var idx, tailbits,
      input = data.replace(/[\r\n=]/g, ''), // remove CR/LF & padding to simplify scan
      max = input.length,
      map = BASE64_MAP,
      bits = 0,
      result = [];

  // Collect by 6*4 bits (3 bytes)

  for (idx = 0; idx < max; idx++) {
    if ((idx % 4 === 0) && idx) {
      result.push((bits >> 16) & 0xFF);
      result.push((bits >> 8) & 0xFF);
      result.push(bits & 0xFF);
    }

    bits = (bits << 6) | map.indexOf(input.charAt(idx));
  }

  // Dump tail

  tailbits = (max % 4) * 6;

  if (tailbits === 0) {
    result.push((bits >> 16) & 0xFF);
    result.push((bits >> 8) & 0xFF);
    result.push(bits & 0xFF);
  } else if (tailbits === 18) {
    result.push((bits >> 10) & 0xFF);
    result.push((bits >> 2) & 0xFF);
  } else if (tailbits === 12) {
    result.push((bits >> 4) & 0xFF);
  }

  return new Uint8Array(result);
}

function representYamlBinary(object /*, style*/) {
  var result = '', bits = 0, idx, tail,
      max = object.length,
      map = BASE64_MAP;

  // Convert every three bytes to 4 ASCII characters.

  for (idx = 0; idx < max; idx++) {
    if ((idx % 3 === 0) && idx) {
      result += map[(bits >> 18) & 0x3F];
      result += map[(bits >> 12) & 0x3F];
      result += map[(bits >> 6) & 0x3F];
      result += map[bits & 0x3F];
    }

    bits = (bits << 8) + object[idx];
  }

  // Dump tail

  tail = max % 3;

  if (tail === 0) {
    result += map[(bits >> 18) & 0x3F];
    result += map[(bits >> 12) & 0x3F];
    result += map[(bits >> 6) & 0x3F];
    result += map[bits & 0x3F];
  } else if (tail === 2) {
    result += map[(bits >> 10) & 0x3F];
    result += map[(bits >> 4) & 0x3F];
    result += map[(bits << 2) & 0x3F];
    result += map[64];
  } else if (tail === 1) {
    result += map[(bits >> 2) & 0x3F];
    result += map[(bits << 4) & 0x3F];
    result += map[64];
    result += map[64];
  }

  return result;
}

function isBinary(obj) {
  return Object.prototype.toString.call(obj) ===  '[object Uint8Array]';
}

module.exports = new Type('tag:yaml.org,2002:binary', {
  kind: 'scalar',
  resolve: resolveYamlBinary,
  construct: constructYamlBinary,
  predicate: isBinary,
  represent: representYamlBinary
});
'use strict';

var Type = require('../type');

function resolveYamlBoolean(data) {
  if (data === null) return false;

  var max = data.length;

  return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) ||
         (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE'));
}

function constructYamlBoolean(data) {
  return data === 'true' ||
         data === 'True' ||
         data === 'TRUE';
}

function isBoolean(object) {
  return Object.prototype.toString.call(object) === '[object Boolean]';
}

module.exports = new Type('tag:yaml.org,2002:bool', {
  kind: 'scalar',
  resolve: resolveYamlBoolean,
  construct: constructYamlBoolean,
  predicate: isBoolean,
  represent: {
    lowercase: function (object) { return object ? 'true' : 'false'; },
    uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; },
    camelcase: function (object) { return object ? 'True' : 'False'; }
  },
  defaultStyle: 'lowercase'
});
'use strict';

var common = require('../common');
var Type   = require('../type');

var YAML_FLOAT_PATTERN = new RegExp(
  // 2.5e4, 2.5 and integers
  '^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' +
  // .2e4, .2
  // special case, seems not from spec
  '|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' +
  // .inf
  '|[-+]?\\.(?:inf|Inf|INF)' +
  // .nan
  '|\\.(?:nan|NaN|NAN))$');

function resolveYamlFloat(data) {
  if (data === null) return false;

  if (!YAML_FLOAT_PATTERN.test(data) ||
      // Quick hack to not allow integers end with `_`
      // Probably should update regexp & check speed
      data[data.length - 1] === '_') {
    return false;
  }

  return true;
}

function constructYamlFloat(data) {
  var value, sign;

  value  = data.replace(/_/g, '').toLowerCase();
  sign   = value[0] === '-' ? -1 : 1;

  if ('+-'.indexOf(value[0]) >= 0) {
    value = value.slice(1);
  }

  if (value === '.inf') {
    return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;

  } else if (value === '.nan') {
    return NaN;
  }
  return sign * parseFloat(value, 10);
}


var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;

function representYamlFloat(object, style) {
  var res;

  if (isNaN(object)) {
    switch (style) {
      case 'lowercase': return '.nan';
      case 'uppercase': return '.NAN';
      case 'camelcase': return '.NaN';
    }
  } else if (Number.POSITIVE_INFINITY === object) {
    switch (style) {
      case 'lowercase': return '.inf';
      case 'uppercase': return '.INF';
      case 'camelcase': return '.Inf';
    }
  } else if (Number.NEGATIVE_INFINITY === object) {
    switch (style) {
      case 'lowercase': return '-.inf';
      case 'uppercase': return '-.INF';
      case 'camelcase': return '-.Inf';
    }
  } else if (common.isNegativeZero(object)) {
    return '-0.0';
  }

  res = object.toString(10);

  // JS stringifier can build scientific format without dots: 5e-100,
  // while YAML requres dot: 5.e-100. Fix it with simple hack

  return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res;
}

function isFloat(object) {
  return (Object.prototype.toString.call(object) === '[object Number]') &&
         (object % 1 !== 0 || common.isNegativeZero(object));
}

module.exports = new Type('tag:yaml.org,2002:float', {
  kind: 'scalar',
  resolve: resolveYamlFloat,
  construct: constructYamlFloat,
  predicate: isFloat,
  represent: representYamlFloat,
  defaultStyle: 'lowercase'
});
'use strict';

var common = require('../common');
var Type   = require('../type');

function isHexCode(c) {
  return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) ||
         ((0x41/* A */ <= c) && (c <= 0x46/* F */)) ||
         ((0x61/* a */ <= c) && (c <= 0x66/* f */));
}

function isOctCode(c) {
  return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */));
}

function isDecCode(c) {
  return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */));
}

function resolveYamlInteger(data) {
  if (data === null) return false;

  var max = data.length,
      index = 0,
      hasDigits = false,
      ch;

  if (!max) return false;

  ch = data[index];

  // sign
  if (ch === '-' || ch === '+') {
    ch = data[++index];
  }

  if (ch === '0') {
    // 0
    if (index + 1 === max) return true;
    ch = data[++index];

    // base 2, base 8, base 16

    if (ch === 'b') {
      // base 2
      index++;

      for (; index < max; index++) {
        ch = data[index];
        if (ch === '_') continue;
        if (ch !== '0' && ch !== '1') return false;
        hasDigits = true;
      }
      return hasDigits && ch !== '_';
    }


    if (ch === 'x') {
      // base 16
      index++;

      for (; index < max; index++) {
        ch = data[index];
        if (ch === '_') continue;
        if (!isHexCode(data.charCodeAt(index))) return false;
        hasDigits = true;
      }
      return hasDigits && ch !== '_';
    }


    if (ch === 'o') {
      // base 8
      index++;

      for (; index < max; index++) {
        ch = data[index];
        if (ch === '_') continue;
        if (!isOctCode(data.charCodeAt(index))) return false;
        hasDigits = true;
      }
      return hasDigits && ch !== '_';
    }
  }

  // base 10 (except 0)

  // value should not start with `_`;
  if (ch === '_') return false;

  for (; index < max; index++) {
    ch = data[index];
    if (ch === '_') continue;
    if (!isDecCode(data.charCodeAt(index))) {
      return false;
    }
    hasDigits = true;
  }

  // Should have digits and should not end with `_`
  if (!hasDigits || ch === '_') return false;

  return true;
}

function constructYamlInteger(data) {
  var value = data, sign = 1, ch;

  if (value.indexOf('_') !== -1) {
    value = value.replace(/_/g, '');
  }

  ch = value[0];

  if (ch === '-' || ch === '+') {
    if (ch === '-') sign = -1;
    value = value.slice(1);
    ch = value[0];
  }

  if (value === '0') return 0;

  if (ch === '0') {
    if (value[1] === 'b') return sign * parseInt(value.slice(2), 2);
    if (value[1] === 'x') return sign * parseInt(value.slice(2), 16);
    if (value[1] === 'o') return sign * parseInt(value.slice(2), 8);
  }

  return sign * parseInt(value, 10);
}

function isInteger(object) {
  return (Object.prototype.toString.call(object)) === '[object Number]' &&
         (object % 1 === 0 && !common.isNegativeZero(object));
}

module.exports = new Type('tag:yaml.org,2002:int', {
  kind: 'scalar',
  resolve: resolveYamlInteger,
  construct: constructYamlInteger,
  predicate: isInteger,
  represent: {
    binary:      function (obj) { return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); },
    octal:       function (obj) { return obj >= 0 ? '0o'  + obj.toString(8) : '-0o'  + obj.toString(8).slice(1); },
    decimal:     function (obj) { return obj.toString(10); },
    /* eslint-disable max-len */
    hexadecimal: function (obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() :  '-0x' + obj.toString(16).toUpperCase().slice(1); }
  },
  defaultStyle: 'decimal',
  styleAliases: {
    binary:      [ 2,  'bin' ],
    octal:       [ 8,  'oct' ],
    decimal:     [ 10, 'dec' ],
    hexadecimal: [ 16, 'hex' ]
  }
});
'use strict';

var Type = require('../type');

module.exports = new Type('tag:yaml.org,2002:map', {
  kind: 'mapping',
  construct: function (data) { return data !== null ? data : {}; }
});
'use strict';

var Type = require('../type');

function resolveYamlMerge(data) {
  return data === '<<' || data === null;
}

module.exports = new Type('tag:yaml.org,2002:merge', {
  kind: 'scalar',
  resolve: resolveYamlMerge
});
'use strict';

var Type = require('../type');

function resolveYamlNull(data) {
  if (data === null) return true;

  var max = data.length;

  return (max === 1 && data === '~') ||
         (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL'));
}

function constructYamlNull() {
  return null;
}

function isNull(object) {
  return object === null;
}

module.exports = new Type('tag:yaml.org,2002:null', {
  kind: 'scalar',
  resolve: resolveYamlNull,
  construct: constructYamlNull,
  predicate: isNull,
  represent: {
    canonical: function () { return '~';    },
    lowercase: function () { return 'null'; },
    uppercase: function () { return 'NULL'; },
    camelcase: function () { return 'Null'; },
    empty:     function () { return '';     }
  },
  defaultStyle: 'lowercase'
});
'use strict';

var Type = require('../type');

var _hasOwnProperty = Object.prototype.hasOwnProperty;
var _toString       = Object.prototype.toString;

function resolveYamlOmap(data) {
  if (data === null) return true;

  var objectKeys = [], index, length, pair, pairKey, pairHasKey,
      object = data;

  for (index = 0, length = object.length; index < length; index += 1) {
    pair = object[index];
    pairHasKey = false;

    if (_toString.call(pair) !== '[object Object]') return false;

    for (pairKey in pair) {
      if (_hasOwnProperty.call(pair, pairKey)) {
        if (!pairHasKey) pairHasKey = true;
        else return false;
      }
    }

    if (!pairHasKey) return false;

    if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);
    else return false;
  }

  return true;
}

function constructYamlOmap(data) {
  return data !== null ? data : [];
}

module.exports = new Type('tag:yaml.org,2002:omap', {
  kind: 'sequence',
  resolve: resolveYamlOmap,
  construct: constructYamlOmap
});
'use strict';

var Type = require('../type');

var _toString = Object.prototype.toString;

function resolveYamlPairs(data) {
  if (data === null) return true;

  var index, length, pair, keys, result,
      object = data;

  result = new Array(object.length);

  for (index = 0, length = object.length; index < length; index += 1) {
    pair = object[index];

    if (_toString.call(pair) !== '[object Object]') return false;

    keys = Object.keys(pair);

    if (keys.length !== 1) return false;

    result[index] = [ keys[0], pair[keys[0]] ];
  }

  return true;
}

function constructYamlPairs(data) {
  if (data === null) return [];

  var index, length, pair, keys, result,
      object = data;

  result = new Array(object.length);

  for (index = 0, length = object.length; index < length; index += 1) {
    pair = object[index];

    keys = Object.keys(pair);

    result[index] = [ keys[0], pair[keys[0]] ];
  }

  return result;
}

module.exports = new Type('tag:yaml.org,2002:pairs', {
  kind: 'sequence',
  resolve: resolveYamlPairs,
  construct: constructYamlPairs
});
'use strict';

var Type = require('../type');

module.exports = new Type('tag:yaml.org,2002:seq', {
  kind: 'sequence',
  construct: function (data) { return data !== null ? data : []; }
});
'use strict';

var Type = require('../type');

var _hasOwnProperty = Object.prototype.hasOwnProperty;

function resolveYamlSet(data) {
  if (data === null) return true;

  var key, object = data;

  for (key in object) {
    if (_hasOwnProperty.call(object, key)) {
      if (object[key] !== null) return false;
    }
  }

  return true;
}

function constructYamlSet(data) {
  return data !== null ? data : {};
}

module.exports = new Type('tag:yaml.org,2002:set', {
  kind: 'mapping',
  resolve: resolveYamlSet,
  construct: constructYamlSet
});
'use strict';

var Type = require('../type');

module.exports = new Type('tag:yaml.org,2002:str', {
  kind: 'scalar',
  construct: function (data) { return data !== null ? data : ''; }
});
'use strict';

var Type = require('../type');

var YAML_DATE_REGEXP = new RegExp(
  '^([0-9][0-9][0-9][0-9])'          + // [1] year
  '-([0-9][0-9])'                    + // [2] month
  '-([0-9][0-9])$');                   // [3] day

var YAML_TIMESTAMP_REGEXP = new RegExp(
  '^([0-9][0-9][0-9][0-9])'          + // [1] year
  '-([0-9][0-9]?)'                   + // [2] month
  '-([0-9][0-9]?)'                   + // [3] day
  '(?:[Tt]|[ \\t]+)'                 + // ...
  '([0-9][0-9]?)'                    + // [4] hour
  ':([0-9][0-9])'                    + // [5] minute
  ':([0-9][0-9])'                    + // [6] second
  '(?:\\.([0-9]*))?'                 + // [7] fraction
  '(?:[ \\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour
  '(?::([0-9][0-9]))?))?$');           // [11] tz_minute

function resolveYamlTimestamp(data) {
  if (data === null) return false;
  if (YAML_DATE_REGEXP.exec(data) !== null) return true;
  if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true;
  return false;
}

function constructYamlTimestamp(data) {
  var match, year, month, day, hour, minute, second, fraction = 0,
      delta = null, tz_hour, tz_minute, date;

  match = YAML_DATE_REGEXP.exec(data);
  if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data);

  if (match === null) throw new Error('Date resolve error');

  // match: [1] year [2] month [3] day

  year = +(match[1]);
  month = +(match[2]) - 1; // JS month starts with 0
  day = +(match[3]);

  if (!match[4]) { // no hour
    return new Date(Date.UTC(year, month, day));
  }

  // match: [4] hour [5] minute [6] second [7] fraction

  hour = +(match[4]);
  minute = +(match[5]);
  second = +(match[6]);

  if (match[7]) {
    fraction = match[7].slice(0, 3);
    while (fraction.length < 3) { // milli-seconds
      fraction += '0';
    }
    fraction = +fraction;
  }

  // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute

  if (match[9]) {
    tz_hour = +(match[10]);
    tz_minute = +(match[11] || 0);
    delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds
    if (match[9] === '-') delta = -delta;
  }

  date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));

  if (delta) date.setTime(date.getTime() - delta);

  return date;
}

function representYamlTimestamp(object /*, style*/) {
  return object.toISOString();
}

module.exports = new Type('tag:yaml.org,2002:timestamp', {
  kind: 'scalar',
  resolve: resolveYamlTimestamp,
  construct: constructYamlTimestamp,
  instanceOf: Date,
  represent: representYamlTimestamp
});
// Standard YAML's Core schema.
// http://www.yaml.org/spec/1.2/spec.html#id2804923
//
// NOTE: JS-YAML does not support schema-specific tag resolution restrictions.
// So, Core schema has no distinctions from JSON schema is JS-YAML.


'use strict';


module.exports = require('./json');
// JS-YAML's default schema for `safeLoad` function.
// It is not described in the YAML specification.
//
// This schema is based on standard YAML's Core schema and includes most of
// extra types described at YAML tag repository. (http://yaml.org/type/)


'use strict';


module.exports = require('./core').extend({
  implicit: [
    require('../type/timestamp'),
    require('../type/merge')
  ],
  explicit: [
    require('../type/binary'),
    require('../type/omap'),
    require('../type/pairs'),
    require('../type/set')
  ]
});
// Standard YAML's Failsafe schema.
// http://www.yaml.org/spec/1.2/spec.html#id2802346


'use strict';


var Schema = require('../schema');


module.exports = new Schema({
  explicit: [
    require('../type/str'),
    require('../type/seq'),
    require('../type/map')
  ]
});
// Standard YAML's JSON schema.
// http://www.yaml.org/spec/1.2/spec.html#id2803231
//
// NOTE: JS-YAML does not support schema-specific tag resolution restrictions.
// So, this schema is not such strict as defined in the YAML specification.
// It allows numbers in binary notaion, use `Null` and `NULL` as `null`, etc.


'use strict';


module.exports = require('./failsafe').extend({
  implicit: [
    require('../type/null'),
    require('../type/bool'),
    require('../type/int'),
    require('../type/float')
  ]
});

/*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT */
(function (global, factory) {
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
  typeof define === 'function' && define.amd ? define(['exports'], factory) :
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.jsyaml = {}));
}(this, (function (exports) { 'use strict';

  function isNothing(subject) {
    return (typeof subject === 'undefined') || (subject === null);
  }


  function isObject(subject) {
    return (typeof subject === 'object') && (subject !== null);
  }


  function toArray(sequence) {
    if (Array.isArray(sequence)) return sequence;
    else if (isNothing(sequence)) return [];

    return [ sequence ];
  }


  function extend(target, source) {
    var index, length, key, sourceKeys;

    if (source) {
      sourceKeys = Object.keys(source);

      for (index = 0, length = sourceKeys.length; index < length; index += 1) {
        key = sourceKeys[index];
        target[key] = source[key];
      }
    }

    return target;
  }


  function repeat(string, count) {
    var result = '', cycle;

    for (cycle = 0; cycle < count; cycle += 1) {
      result += string;
    }

    return result;
  }


  function isNegativeZero(number) {
    return (number === 0) && (Number.NEGATIVE_INFINITY === 1 / number);
  }


  var isNothing_1      = isNothing;
  var isObject_1       = isObject;
  var toArray_1        = toArray;
  var repeat_1         = repeat;
  var isNegativeZero_1 = isNegativeZero;
  var extend_1         = extend;

  var common = {
  	isNothing: isNothing_1,
  	isObject: isObject_1,
  	toArray: toArray_1,
  	repeat: repeat_1,
  	isNegativeZero: isNegativeZero_1,
  	extend: extend_1
  };

  // YAML error class. http://stackoverflow.com/questions/8458984


  function formatError(exception, compact) {
    var where = '', message = exception.reason || '(unknown reason)';

    if (!exception.mark) return message;

    if (exception.mark.name) {
      where += 'in "' + exception.mark.name + '" ';
    }

    where += '(' + (exception.mark.line + 1) + ':' + (exception.mark.column + 1) + ')';

    if (!compact && exception.mark.snippet) {
      where += '\n\n' + exception.mark.snippet;
    }

    return message + ' ' + where;
  }


  function YAMLException$1(reason, mark) {
    // Super constructor
    Error.call(this);

    this.name = 'YAMLException';
    this.reason = reason;
    this.mark = mark;
    this.message = formatError(this, false);

    // Include stack trace in error object
    if (Error.captureStackTrace) {
      // Chrome and NodeJS
      Error.captureStackTrace(this, this.constructor);
    } else {
      // FF, IE 10+ and Safari 6+. Fallback for others
      this.stack = (new Error()).stack || '';
    }
  }


  // Inherit from Error
  YAMLException$1.prototype = Object.create(Error.prototype);
  YAMLException$1.prototype.constructor = YAMLException$1;


  YAMLException$1.prototype.toString = function toString(compact) {
    return this.name + ': ' + formatError(this, compact);
  };


  var exception = YAMLException$1;

  // get snippet for a single line, respecting maxLength
  function getLine(buffer, lineStart, lineEnd, position, maxLineLength) {
    var head = '';
    var tail = '';
    var maxHalfLength = Math.floor(maxLineLength / 2) - 1;

    if (position - lineStart > maxHalfLength) {
      head = ' ... ';
      lineStart = position - maxHalfLength + head.length;
    }

    if (lineEnd - position > maxHalfLength) {
      tail = ' ...';
      lineEnd = position + maxHalfLength - tail.length;
    }

    return {
      str: head + buffer.slice(lineStart, lineEnd).replace(/\t/g, '→') + tail,
      pos: position - lineStart + head.length // relative position
    };
  }


  function padStart(string, max) {
    return common.repeat(' ', max - string.length) + string;
  }


  function makeSnippet(mark, options) {
    options = Object.create(options || null);

    if (!mark.buffer) return null;

    if (!options.maxLength) options.maxLength = 79;
    if (typeof options.indent      !== 'number') options.indent      = 1;
    if (typeof options.linesBefore !== 'number') options.linesBefore = 3;
    if (typeof options.linesAfter  !== 'number') options.linesAfter  = 2;

    var re = /\r?\n|\r|\0/g;
    var lineStarts = [ 0 ];
    var lineEnds = [];
    var match;
    var foundLineNo = -1;

    while ((match = re.exec(mark.buffer))) {
      lineEnds.push(match.index);
      lineStarts.push(match.index + match[0].length);

      if (mark.position <= match.index && foundLineNo < 0) {
        foundLineNo = lineStarts.length - 2;
      }
    }

    if (foundLineNo < 0) foundLineNo = lineStarts.length - 1;

    var result = '', i, line;
    var lineNoLength = Math.min(mark.line + options.linesAfter, lineEnds.length).toString().length;
    var maxLineLength = options.maxLength - (options.indent + lineNoLength + 3);

    for (i = 1; i <= options.linesBefore; i++) {
      if (foundLineNo - i < 0) break;
      line = getLine(
        mark.buffer,
        lineStarts[foundLineNo - i],
        lineEnds[foundLineNo - i],
        mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo - i]),
        maxLineLength
      );
      result = common.repeat(' ', options.indent) + padStart((mark.line - i + 1).toString(), lineNoLength) +
        ' | ' + line.str + '\n' + result;
    }

    line = getLine(mark.buffer, lineStarts[foundLineNo], lineEnds[foundLineNo], mark.position, maxLineLength);
    result += common.repeat(' ', options.indent) + padStart((mark.line + 1).toString(), lineNoLength) +
      ' | ' + line.str + '\n';
    result += common.repeat('-', options.indent + lineNoLength + 3 + line.pos) + '^' + '\n';

    for (i = 1; i <= options.linesAfter; i++) {
      if (foundLineNo + i >= lineEnds.length) break;
      line = getLine(
        mark.buffer,
        lineStarts[foundLineNo + i],
        lineEnds[foundLineNo + i],
        mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo + i]),
        maxLineLength
      );
      result += common.repeat(' ', options.indent) + padStart((mark.line + i + 1).toString(), lineNoLength) +
        ' | ' + line.str + '\n';
    }

    return result.replace(/\n$/, '');
  }


  var snippet = makeSnippet;

  var TYPE_CONSTRUCTOR_OPTIONS = [
    'kind',
    'multi',
    'resolve',
    'construct',
    'instanceOf',
    'predicate',
    'represent',
    'representName',
    'defaultStyle',
    'styleAliases'
  ];

  var YAML_NODE_KINDS = [
    'scalar',
    'sequence',
    'mapping'
  ];

  function compileStyleAliases(map) {
    var result = {};

    if (map !== null) {
      Object.keys(map).forEach(function (style) {
        map[style].forEach(function (alias) {
          result[String(alias)] = style;
        });
      });
    }

    return result;
  }

  function Type$1(tag, options) {
    options = options || {};

    Object.keys(options).forEach(function (name) {
      if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {
        throw new exception('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.');
      }
    });

    // TODO: Add tag format check.
    this.options       = options; // keep original options in case user wants to extend this type later
    this.tag           = tag;
    this.kind          = options['kind']          || null;
    this.resolve       = options['resolve']       || function () { return true; };
    this.construct     = options['construct']     || function (data) { return data; };
    this.instanceOf    = options['instanceOf']    || null;
    this.predicate     = options['predicate']     || null;
    this.represent     = options['represent']     || null;
    this.representName = options['representName'] || null;
    this.defaultStyle  = options['defaultStyle']  || null;
    this.multi         = options['multi']         || false;
    this.styleAliases  = compileStyleAliases(options['styleAliases'] || null);

    if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {
      throw new exception('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.');
    }
  }

  var type = Type$1;

  /*eslint-disable max-len*/





  function compileList(schema, name) {
    var result = [];

    schema[name].forEach(function (currentType) {
      var newIndex = result.length;

      result.forEach(function (previousType, previousIndex) {
        if (previousType.tag === currentType.tag &&
            previousType.kind === currentType.kind &&
            previousType.multi === currentType.multi) {

          newIndex = previousIndex;
        }
      });

      result[newIndex] = currentType;
    });

    return result;
  }


  function compileMap(/* lists... */) {
    var result = {
          scalar: {},
          sequence: {},
          mapping: {},
          fallback: {},
          multi: {
            scalar: [],
            sequence: [],
            mapping: [],
            fallback: []
          }
        }, index, length;

    function collectType(type) {
      if (type.multi) {
        result.multi[type.kind].push(type);
        result.multi['fallback'].push(type);
      } else {
        result[type.kind][type.tag] = result['fallback'][type.tag] = type;
      }
    }

    for (index = 0, length = arguments.length; index < length; index += 1) {
      arguments[index].forEach(collectType);
    }
    return result;
  }


  function Schema$1(definition) {
    return this.extend(definition);
  }


  Schema$1.prototype.extend = function extend(definition) {
    var implicit = [];
    var explicit = [];

    if (definition instanceof type) {
      // Schema.extend(type)
      explicit.push(definition);

    } else if (Array.isArray(definition)) {
      // Schema.extend([ type1, type2, ... ])
      explicit = explicit.concat(definition);

    } else if (definition && (Array.isArray(definition.implicit) || Array.isArray(definition.explicit))) {
      // Schema.extend({ explicit: [ type1, type2, ... ], implicit: [ type1, type2, ... ] })
      if (definition.implicit) implicit = implicit.concat(definition.implicit);
      if (definition.explicit) explicit = explicit.concat(definition.explicit);

    } else {
      throw new exception('Schema.extend argument should be a Type, [ Type ], ' +
        'or a schema definition ({ implicit: [...], explicit: [...] })');
    }

    implicit.forEach(function (type$1) {
      if (!(type$1 instanceof type)) {
        throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');
      }

      if (type$1.loadKind && type$1.loadKind !== 'scalar') {
        throw new exception('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.');
      }

      if (type$1.multi) {
        throw new exception('There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.');
      }
    });

    explicit.forEach(function (type$1) {
      if (!(type$1 instanceof type)) {
        throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');
      }
    });

    var result = Object.create(Schema$1.prototype);

    result.implicit = (this.implicit || []).concat(implicit);
    result.explicit = (this.explicit || []).concat(explicit);

    result.compiledImplicit = compileList(result, 'implicit');
    result.compiledExplicit = compileList(result, 'explicit');
    result.compiledTypeMap  = compileMap(result.compiledImplicit, result.compiledExplicit);

    return result;
  };


  var schema = Schema$1;

  var str = new type('tag:yaml.org,2002:str', {
    kind: 'scalar',
    construct: function (data) { return data !== null ? data : ''; }
  });

  var seq = new type('tag:yaml.org,2002:seq', {
    kind: 'sequence',
    construct: function (data) { return data !== null ? data : []; }
  });

  var map = new type('tag:yaml.org,2002:map', {
    kind: 'mapping',
    construct: function (data) { return data !== null ? data : {}; }
  });

  var failsafe = new schema({
    explicit: [
      str,
      seq,
      map
    ]
  });

  function resolveYamlNull(data) {
    if (data === null) return true;

    var max = data.length;

    return (max === 1 && data === '~') ||
           (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL'));
  }

  function constructYamlNull() {
    return null;
  }

  function isNull(object) {
    return object === null;
  }

  var _null = new type('tag:yaml.org,2002:null', {
    kind: 'scalar',
    resolve: resolveYamlNull,
    construct: constructYamlNull,
    predicate: isNull,
    represent: {
      canonical: function () { return '~';    },
      lowercase: function () { return 'null'; },
      uppercase: function () { return 'NULL'; },
      camelcase: function () { return 'Null'; },
      empty:     function () { return '';     }
    },
    defaultStyle: 'lowercase'
  });

  function resolveYamlBoolean(data) {
    if (data === null) return false;

    var max = data.length;

    return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) ||
           (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE'));
  }

  function constructYamlBoolean(data) {
    return data === 'true' ||
           data === 'True' ||
           data === 'TRUE';
  }

  function isBoolean(object) {
    return Object.prototype.toString.call(object) === '[object Boolean]';
  }

  var bool = new type('tag:yaml.org,2002:bool', {
    kind: 'scalar',
    resolve: resolveYamlBoolean,
    construct: constructYamlBoolean,
    predicate: isBoolean,
    represent: {
      lowercase: function (object) { return object ? 'true' : 'false'; },
      uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; },
      camelcase: function (object) { return object ? 'True' : 'False'; }
    },
    defaultStyle: 'lowercase'
  });

  function isHexCode(c) {
    return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) ||
           ((0x41/* A */ <= c) && (c <= 0x46/* F */)) ||
           ((0x61/* a */ <= c) && (c <= 0x66/* f */));
  }

  function isOctCode(c) {
    return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */));
  }

  function isDecCode(c) {
    return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */));
  }

  function resolveYamlInteger(data) {
    if (data === null) return false;

    var max = data.length,
        index = 0,
        hasDigits = false,
        ch;

    if (!max) return false;

    ch = data[index];

    // sign
    if (ch === '-' || ch === '+') {
      ch = data[++index];
    }

    if (ch === '0') {
      // 0
      if (index + 1 === max) return true;
      ch = data[++index];

      // base 2, base 8, base 16

      if (ch === 'b') {
        // base 2
        index++;

        for (; index < max; index++) {
          ch = data[index];
          if (ch === '_') continue;
          if (ch !== '0' && ch !== '1') return false;
          hasDigits = true;
        }
        return hasDigits && ch !== '_';
      }


      if (ch === 'x') {
        // base 16
        index++;

        for (; index < max; index++) {
          ch = data[index];
          if (ch === '_') continue;
          if (!isHexCode(data.charCodeAt(index))) return false;
          hasDigits = true;
        }
        return hasDigits && ch !== '_';
      }


      if (ch === 'o') {
        // base 8
        index++;

        for (; index < max; index++) {
          ch = data[index];
          if (ch === '_') continue;
          if (!isOctCode(data.charCodeAt(index))) return false;
          hasDigits = true;
        }
        return hasDigits && ch !== '_';
      }
    }

    // base 10 (except 0)

    // value should not start with `_`;
    if (ch === '_') return false;

    for (; index < max; index++) {
      ch = data[index];
      if (ch === '_') continue;
      if (!isDecCode(data.charCodeAt(index))) {
        return false;
      }
      hasDigits = true;
    }

    // Should have digits and should not end with `_`
    if (!hasDigits || ch === '_') return false;

    return true;
  }

  function constructYamlInteger(data) {
    var value = data, sign = 1, ch;

    if (value.indexOf('_') !== -1) {
      value = value.replace(/_/g, '');
    }

    ch = value[0];

    if (ch === '-' || ch === '+') {
      if (ch === '-') sign = -1;
      value = value.slice(1);
      ch = value[0];
    }

    if (value === '0') return 0;

    if (ch === '0') {
      if (value[1] === 'b') return sign * parseInt(value.slice(2), 2);
      if (value[1] === 'x') return sign * parseInt(value.slice(2), 16);
      if (value[1] === 'o') return sign * parseInt(value.slice(2), 8);
    }

    return sign * parseInt(value, 10);
  }

  function isInteger(object) {
    return (Object.prototype.toString.call(object)) === '[object Number]' &&
           (object % 1 === 0 && !common.isNegativeZero(object));
  }

  var int = new type('tag:yaml.org,2002:int', {
    kind: 'scalar',
    resolve: resolveYamlInteger,
    construct: constructYamlInteger,
    predicate: isInteger,
    represent: {
      binary:      function (obj) { return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); },
      octal:       function (obj) { return obj >= 0 ? '0o'  + obj.toString(8) : '-0o'  + obj.toString(8).slice(1); },
      decimal:     function (obj) { return obj.toString(10); },
      /* eslint-disable max-len */
      hexadecimal: function (obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() :  '-0x' + obj.toString(16).toUpperCase().slice(1); }
    },
    defaultStyle: 'decimal',
    styleAliases: {
      binary:      [ 2,  'bin' ],
      octal:       [ 8,  'oct' ],
      decimal:     [ 10, 'dec' ],
      hexadecimal: [ 16, 'hex' ]
    }
  });

  var YAML_FLOAT_PATTERN = new RegExp(
    // 2.5e4, 2.5 and integers
    '^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' +
    // .2e4, .2
    // special case, seems not from spec
    '|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' +
    // .inf
    '|[-+]?\\.(?:inf|Inf|INF)' +
    // .nan
    '|\\.(?:nan|NaN|NAN))$');

  function resolveYamlFloat(data) {
    if (data === null) return false;

    if (!YAML_FLOAT_PATTERN.test(data) ||
        // Quick hack to not allow integers end with `_`
        // Probably should update regexp & check speed
        data[data.length - 1] === '_') {
      return false;
    }

    return true;
  }

  function constructYamlFloat(data) {
    var value, sign;

    value  = data.replace(/_/g, '').toLowerCase();
    sign   = value[0] === '-' ? -1 : 1;

    if ('+-'.indexOf(value[0]) >= 0) {
      value = value.slice(1);
    }

    if (value === '.inf') {
      return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;

    } else if (value === '.nan') {
      return NaN;
    }
    return sign * parseFloat(value, 10);
  }


  var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;

  function representYamlFloat(object, style) {
    var res;

    if (isNaN(object)) {
      switch (style) {
        case 'lowercase': return '.nan';
        case 'uppercase': return '.NAN';
        case 'camelcase': return '.NaN';
      }
    } else if (Number.POSITIVE_INFINITY === object) {
      switch (style) {
        case 'lowercase': return '.inf';
        case 'uppercase': return '.INF';
        case 'camelcase': return '.Inf';
      }
    } else if (Number.NEGATIVE_INFINITY === object) {
      switch (style) {
        case 'lowercase': return '-.inf';
        case 'uppercase': return '-.INF';
        case 'camelcase': return '-.Inf';
      }
    } else if (common.isNegativeZero(object)) {
      return '-0.0';
    }

    res = object.toString(10);

    // JS stringifier can build scientific format without dots: 5e-100,
    // while YAML requres dot: 5.e-100. Fix it with simple hack

    return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res;
  }

  function isFloat(object) {
    return (Object.prototype.toString.call(object) === '[object Number]') &&
           (object % 1 !== 0 || common.isNegativeZero(object));
  }

  var float = new type('tag:yaml.org,2002:float', {
    kind: 'scalar',
    resolve: resolveYamlFloat,
    construct: constructYamlFloat,
    predicate: isFloat,
    represent: representYamlFloat,
    defaultStyle: 'lowercase'
  });

  var json = failsafe.extend({
    implicit: [
      _null,
      bool,
      int,
      float
    ]
  });

  var core = json;

  var YAML_DATE_REGEXP = new RegExp(
    '^([0-9][0-9][0-9][0-9])'          + // [1] year
    '-([0-9][0-9])'                    + // [2] month
    '-([0-9][0-9])$');                   // [3] day

  var YAML_TIMESTAMP_REGEXP = new RegExp(
    '^([0-9][0-9][0-9][0-9])'          + // [1] year
    '-([0-9][0-9]?)'                   + // [2] month
    '-([0-9][0-9]?)'                   + // [3] day
    '(?:[Tt]|[ \\t]+)'                 + // ...
    '([0-9][0-9]?)'                    + // [4] hour
    ':([0-9][0-9])'                    + // [5] minute
    ':([0-9][0-9])'                    + // [6] second
    '(?:\\.([0-9]*))?'                 + // [7] fraction
    '(?:[ \\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour
    '(?::([0-9][0-9]))?))?$');           // [11] tz_minute

  function resolveYamlTimestamp(data) {
    if (data === null) return false;
    if (YAML_DATE_REGEXP.exec(data) !== null) return true;
    if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true;
    return false;
  }

  function constructYamlTimestamp(data) {
    var match, year, month, day, hour, minute, second, fraction = 0,
        delta = null, tz_hour, tz_minute, date;

    match = YAML_DATE_REGEXP.exec(data);
    if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data);

    if (match === null) throw new Error('Date resolve error');

    // match: [1] year [2] month [3] day

    year = +(match[1]);
    month = +(match[2]) - 1; // JS month starts with 0
    day = +(match[3]);

    if (!match[4]) { // no hour
      return new Date(Date.UTC(year, month, day));
    }

    // match: [4] hour [5] minute [6] second [7] fraction

    hour = +(match[4]);
    minute = +(match[5]);
    second = +(match[6]);

    if (match[7]) {
      fraction = match[7].slice(0, 3);
      while (fraction.length < 3) { // milli-seconds
        fraction += '0';
      }
      fraction = +fraction;
    }

    // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute

    if (match[9]) {
      tz_hour = +(match[10]);
      tz_minute = +(match[11] || 0);
      delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds
      if (match[9] === '-') delta = -delta;
    }

    date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));

    if (delta) date.setTime(date.getTime() - delta);

    return date;
  }

  function representYamlTimestamp(object /*, style*/) {
    return object.toISOString();
  }

  var timestamp = new type('tag:yaml.org,2002:timestamp', {
    kind: 'scalar',
    resolve: resolveYamlTimestamp,
    construct: constructYamlTimestamp,
    instanceOf: Date,
    represent: representYamlTimestamp
  });

  function resolveYamlMerge(data) {
    return data === '<<' || data === null;
  }

  var merge = new type('tag:yaml.org,2002:merge', {
    kind: 'scalar',
    resolve: resolveYamlMerge
  });

  /*eslint-disable no-bitwise*/





  // [ 64, 65, 66 ] -> [ padding, CR, LF ]
  var BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r';


  function resolveYamlBinary(data) {
    if (data === null) return false;

    var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP;

    // Convert one by one.
    for (idx = 0; idx < max; idx++) {
      code = map.indexOf(data.charAt(idx));

      // Skip CR/LF
      if (code > 64) continue;

      // Fail on illegal characters
      if (code < 0) return false;

      bitlen += 6;
    }

    // If there are any bits left, source was corrupted
    return (bitlen % 8) === 0;
  }

  function constructYamlBinary(data) {
    var idx, tailbits,
        input = data.replace(/[\r\n=]/g, ''), // remove CR/LF & padding to simplify scan
        max = input.length,
        map = BASE64_MAP,
        bits = 0,
        result = [];

    // Collect by 6*4 bits (3 bytes)

    for (idx = 0; idx < max; idx++) {
      if ((idx % 4 === 0) && idx) {
        result.push((bits >> 16) & 0xFF);
        result.push((bits >> 8) & 0xFF);
        result.push(bits & 0xFF);
      }

      bits = (bits << 6) | map.indexOf(input.charAt(idx));
    }

    // Dump tail

    tailbits = (max % 4) * 6;

    if (tailbits === 0) {
      result.push((bits >> 16) & 0xFF);
      result.push((bits >> 8) & 0xFF);
      result.push(bits & 0xFF);
    } else if (tailbits === 18) {
      result.push((bits >> 10) & 0xFF);
      result.push((bits >> 2) & 0xFF);
    } else if (tailbits === 12) {
      result.push((bits >> 4) & 0xFF);
    }

    return new Uint8Array(result);
  }

  function representYamlBinary(object /*, style*/) {
    var result = '', bits = 0, idx, tail,
        max = object.length,
        map = BASE64_MAP;

    // Convert every three bytes to 4 ASCII characters.

    for (idx = 0; idx < max; idx++) {
      if ((idx % 3 === 0) && idx) {
        result += map[(bits >> 18) & 0x3F];
        result += map[(bits >> 12) & 0x3F];
        result += map[(bits >> 6) & 0x3F];
        result += map[bits & 0x3F];
      }

      bits = (bits << 8) + object[idx];
    }

    // Dump tail

    tail = max % 3;

    if (tail === 0) {
      result += map[(bits >> 18) & 0x3F];
      result += map[(bits >> 12) & 0x3F];
      result += map[(bits >> 6) & 0x3F];
      result += map[bits & 0x3F];
    } else if (tail === 2) {
      result += map[(bits >> 10) & 0x3F];
      result += map[(bits >> 4) & 0x3F];
      result += map[(bits << 2) & 0x3F];
      result += map[64];
    } else if (tail === 1) {
      result += map[(bits >> 2) & 0x3F];
      result += map[(bits << 4) & 0x3F];
      result += map[64];
      result += map[64];
    }

    return result;
  }

  function isBinary(obj) {
    return Object.prototype.toString.call(obj) ===  '[object Uint8Array]';
  }

  var binary = new type('tag:yaml.org,2002:binary', {
    kind: 'scalar',
    resolve: resolveYamlBinary,
    construct: constructYamlBinary,
    predicate: isBinary,
    represent: representYamlBinary
  });

  var _hasOwnProperty$3 = Object.prototype.hasOwnProperty;
  var _toString$2       = Object.prototype.toString;

  function resolveYamlOmap(data) {
    if (data === null) return true;

    var objectKeys = [], index, length, pair, pairKey, pairHasKey,
        object = data;

    for (index = 0, length = object.length; index < length; index += 1) {
      pair = object[index];
      pairHasKey = false;

      if (_toString$2.call(pair) !== '[object Object]') return false;

      for (pairKey in pair) {
        if (_hasOwnProperty$3.call(pair, pairKey)) {
          if (!pairHasKey) pairHasKey = true;
          else return false;
        }
      }

      if (!pairHasKey) return false;

      if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);
      else return false;
    }

    return true;
  }

  function constructYamlOmap(data) {
    return data !== null ? data : [];
  }

  var omap = new type('tag:yaml.org,2002:omap', {
    kind: 'sequence',
    resolve: resolveYamlOmap,
    construct: constructYamlOmap
  });

  var _toString$1 = Object.prototype.toString;

  function resolveYamlPairs(data) {
    if (data === null) return true;

    var index, length, pair, keys, result,
        object = data;

    result = new Array(object.length);

    for (index = 0, length = object.length; index < length; index += 1) {
      pair = object[index];

      if (_toString$1.call(pair) !== '[object Object]') return false;

      keys = Object.keys(pair);

      if (keys.length !== 1) return false;

      result[index] = [ keys[0], pair[keys[0]] ];
    }

    return true;
  }

  function constructYamlPairs(data) {
    if (data === null) return [];

    var index, length, pair, keys, result,
        object = data;

    result = new Array(object.length);

    for (index = 0, length = object.length; index < length; index += 1) {
      pair = object[index];

      keys = Object.keys(pair);

      result[index] = [ keys[0], pair[keys[0]] ];
    }

    return result;
  }

  var pairs = new type('tag:yaml.org,2002:pairs', {
    kind: 'sequence',
    resolve: resolveYamlPairs,
    construct: constructYamlPairs
  });

  var _hasOwnProperty$2 = Object.prototype.hasOwnProperty;

  function resolveYamlSet(data) {
    if (data === null) return true;

    var key, object = data;

    for (key in object) {
      if (_hasOwnProperty$2.call(object, key)) {
        if (object[key] !== null) return false;
      }
    }

    return true;
  }

  function constructYamlSet(data) {
    return data !== null ? data : {};
  }

  var set = new type('tag:yaml.org,2002:set', {
    kind: 'mapping',
    resolve: resolveYamlSet,
    construct: constructYamlSet
  });

  var _default = core.extend({
    implicit: [
      timestamp,
      merge
    ],
    explicit: [
      binary,
      omap,
      pairs,
      set
    ]
  });

  /*eslint-disable max-len,no-use-before-define*/







  var _hasOwnProperty$1 = Object.prototype.hasOwnProperty;


  var CONTEXT_FLOW_IN   = 1;
  var CONTEXT_FLOW_OUT  = 2;
  var CONTEXT_BLOCK_IN  = 3;
  var CONTEXT_BLOCK_OUT = 4;


  var CHOMPING_CLIP  = 1;
  var CHOMPING_STRIP = 2;
  var CHOMPING_KEEP  = 3;


  var PATTERN_NON_PRINTABLE         = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/;
  var PATTERN_NON_ASCII_LINE_BREAKS = /[\x85\u2028\u2029]/;
  var PATTERN_FLOW_INDICATORS       = /[,\[\]\{\}]/;
  var PATTERN_TAG_HANDLE            = /^(?:!|!!|![a-z\-]+!)$/i;
  var PATTERN_TAG_URI               = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;


  function _class(obj) { return Object.prototype.toString.call(obj); }

  function is_EOL(c) {
    return (c === 0x0A/* LF */) || (c === 0x0D/* CR */);
  }

  function is_WHITE_SPACE(c) {
    return (c === 0x09/* Tab */) || (c === 0x20/* Space */);
  }

  function is_WS_OR_EOL(c) {
    return (c === 0x09/* Tab */) ||
           (c === 0x20/* Space */) ||
           (c === 0x0A/* LF */) ||
           (c === 0x0D/* CR */);
  }

  function is_FLOW_INDICATOR(c) {
    return c === 0x2C/* , */ ||
           c === 0x5B/* [ */ ||
           c === 0x5D/* ] */ ||
           c === 0x7B/* { */ ||
           c === 0x7D/* } */;
  }

  function fromHexCode(c) {
    var lc;

    if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {
      return c - 0x30;
    }

    /*eslint-disable no-bitwise*/
    lc = c | 0x20;

    if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) {
      return lc - 0x61 + 10;
    }

    return -1;
  }

  function escapedHexLen(c) {
    if (c === 0x78/* x */) { return 2; }
    if (c === 0x75/* u */) { return 4; }
    if (c === 0x55/* U */) { return 8; }
    return 0;
  }

  function fromDecimalCode(c) {
    if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {
      return c - 0x30;
    }

    return -1;
  }

  function simpleEscapeSequence(c) {
    /* eslint-disable indent */
    return (c === 0x30/* 0 */) ? '\x00' :
          (c === 0x61/* a */) ? '\x07' :
          (c === 0x62/* b */) ? '\x08' :
          (c === 0x74/* t */) ? '\x09' :
          (c === 0x09/* Tab */) ? '\x09' :
          (c === 0x6E/* n */) ? '\x0A' :
          (c === 0x76/* v */) ? '\x0B' :
          (c === 0x66/* f */) ? '\x0C' :
          (c === 0x72/* r */) ? '\x0D' :
          (c === 0x65/* e */) ? '\x1B' :
          (c === 0x20/* Space */) ? ' ' :
          (c === 0x22/* " */) ? '\x22' :
          (c === 0x2F/* / */) ? '/' :
          (c === 0x5C/* \ */) ? '\x5C' :
          (c === 0x4E/* N */) ? '\x85' :
          (c === 0x5F/* _ */) ? '\xA0' :
          (c === 0x4C/* L */) ? '\u2028' :
          (c === 0x50/* P */) ? '\u2029' : '';
  }

  function charFromCodepoint(c) {
    if (c <= 0xFFFF) {
      return String.fromCharCode(c);
    }
    // Encode UTF-16 surrogate pair
    // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF
    return String.fromCharCode(
      ((c - 0x010000) >> 10) + 0xD800,
      ((c - 0x010000) & 0x03FF) + 0xDC00
    );
  }

  var simpleEscapeCheck = new Array(256); // integer, for fast access
  var simpleEscapeMap = new Array(256);
  for (var i = 0; i < 256; i++) {
    simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;
    simpleEscapeMap[i] = simpleEscapeSequence(i);
  }


  function State$1(input, options) {
    this.input = input;

    this.filename  = options['filename']  || null;
    this.schema    = options['schema']    || _default;
    this.onWarning = options['onWarning'] || null;
    // (Hidden) Remove? makes the loader to expect YAML 1.1 documents
    // if such documents have no explicit %YAML directive
    this.legacy    = options['legacy']    || false;

    this.json      = options['json']      || false;
    this.listener  = options['listener']  || null;

    this.implicitTypes = this.schema.compiledImplicit;
    this.typeMap       = this.schema.compiledTypeMap;

    this.length     = input.length;
    this.position   = 0;
    this.line       = 0;
    this.lineStart  = 0;
    this.lineIndent = 0;

    // position of first leading tab in the current line,
    // used to make sure there are no tabs in the indentation
    this.firstTabInLine = -1;

    this.documents = [];

    /*
    this.version;
    this.checkLineBreaks;
    this.tagMap;
    this.anchorMap;
    this.tag;
    this.anchor;
    this.kind;
    this.result;*/

  }


  function generateError(state, message) {
    var mark = {
      name:     state.filename,
      buffer:   state.input.slice(0, -1), // omit trailing \0
      position: state.position,
      line:     state.line,
      column:   state.position - state.lineStart
    };

    mark.snippet = snippet(mark);

    return new exception(message, mark);
  }

  function throwError(state, message) {
    throw generateError(state, message);
  }

  function throwWarning(state, message) {
    if (state.onWarning) {
      state.onWarning.call(null, generateError(state, message));
    }
  }


  var directiveHandlers = {

    YAML: function handleYamlDirective(state, name, args) {

      var match, major, minor;

      if (state.version !== null) {
        throwError(state, 'duplication of %YAML directive');
      }

      if (args.length !== 1) {
        throwError(state, 'YAML directive accepts exactly one argument');
      }

      match = /^([0-9]+)\.([0-9]+)$/.exec(args[0]);

      if (match === null) {
        throwError(state, 'ill-formed argument of the YAML directive');
      }

      major = parseInt(match[1], 10);
      minor = parseInt(match[2], 10);

      if (major !== 1) {
        throwError(state, 'unacceptable YAML version of the document');
      }

      state.version = args[0];
      state.checkLineBreaks = (minor < 2);

      if (minor !== 1 && minor !== 2) {
        throwWarning(state, 'unsupported YAML version of the document');
      }
    },

    TAG: function handleTagDirective(state, name, args) {

      var handle, prefix;

      if (args.length !== 2) {
        throwError(state, 'TAG directive accepts exactly two arguments');
      }

      handle = args[0];
      prefix = args[1];

      if (!PATTERN_TAG_HANDLE.test(handle)) {
        throwError(state, 'ill-formed tag handle (first argument) of the TAG directive');
      }

      if (_hasOwnProperty$1.call(state.tagMap, handle)) {
        throwError(state, 'there is a previously declared suffix for "' + handle + '" tag handle');
      }

      if (!PATTERN_TAG_URI.test(prefix)) {
        throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive');
      }

      try {
        prefix = decodeURIComponent(prefix);
      } catch (err) {
        throwError(state, 'tag prefix is malformed: ' + prefix);
      }

      state.tagMap[handle] = prefix;
    }
  };


  function captureSegment(state, start, end, checkJson) {
    var _position, _length, _character, _result;

    if (start < end) {
      _result = state.input.slice(start, end);

      if (checkJson) {
        for (_position = 0, _length = _result.length; _position < _length; _position += 1) {
          _character = _result.charCodeAt(_position);
          if (!(_character === 0x09 ||
                (0x20 <= _character && _character <= 0x10FFFF))) {
            throwError(state, 'expected valid JSON character');
          }
        }
      } else if (PATTERN_NON_PRINTABLE.test(_result)) {
        throwError(state, 'the stream contains non-printable characters');
      }

      state.result += _result;
    }
  }

  function mergeMappings(state, destination, source, overridableKeys) {
    var sourceKeys, key, index, quantity;

    if (!common.isObject(source)) {
      throwError(state, 'cannot merge mappings; the provided source object is unacceptable');
    }

    sourceKeys = Object.keys(source);

    for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {
      key = sourceKeys[index];

      if (!_hasOwnProperty$1.call(destination, key)) {
        destination[key] = source[key];
        overridableKeys[key] = true;
      }
    }
  }

  function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode,
    startLine, startLineStart, startPos) {

    var index, quantity;

    // The output is a plain object here, so keys can only be strings.
    // We need to convert keyNode to a string, but doing so can hang the process
    // (deeply nested arrays that explode exponentially using aliases).
    if (Array.isArray(keyNode)) {
      keyNode = Array.prototype.slice.call(keyNode);

      for (index = 0, quantity = keyNode.length; index < quantity; index += 1) {
        if (Array.isArray(keyNode[index])) {
          throwError(state, 'nested arrays are not supported inside keys');
        }

        if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') {
          keyNode[index] = '[object Object]';
        }
      }
    }

    // Avoid code execution in load() via toString property
    // (still use its own toString for arrays, timestamps,
    // and whatever user schema extensions happen to have @@toStringTag)
    if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') {
      keyNode = '[object Object]';
    }


    keyNode = String(keyNode);

    if (_result === null) {
      _result = {};
    }

    if (keyTag === 'tag:yaml.org,2002:merge') {
      if (Array.isArray(valueNode)) {
        for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {
          mergeMappings(state, _result, valueNode[index], overridableKeys);
        }
      } else {
        mergeMappings(state, _result, valueNode, overridableKeys);
      }
    } else {
      if (!state.json &&
          !_hasOwnProperty$1.call(overridableKeys, keyNode) &&
          _hasOwnProperty$1.call(_result, keyNode)) {
        state.line = startLine || state.line;
        state.lineStart = startLineStart || state.lineStart;
        state.position = startPos || state.position;
        throwError(state, 'duplicated mapping key');
      }

      // used for this specific key only because Object.defineProperty is slow
      if (keyNode === '__proto__') {
        Object.defineProperty(_result, keyNode, {
          configurable: true,
          enumerable: true,
          writable: true,
          value: valueNode
        });
      } else {
        _result[keyNode] = valueNode;
      }
      delete overridableKeys[keyNode];
    }

    return _result;
  }

  function readLineBreak(state) {
    var ch;

    ch = state.input.charCodeAt(state.position);

    if (ch === 0x0A/* LF */) {
      state.position++;
    } else if (ch === 0x0D/* CR */) {
      state.position++;
      if (state.input.charCodeAt(state.position) === 0x0A/* LF */) {
        state.position++;
      }
    } else {
      throwError(state, 'a line break is expected');
    }

    state.line += 1;
    state.lineStart = state.position;
    state.firstTabInLine = -1;
  }

  function skipSeparationSpace(state, allowComments, checkIndent) {
    var lineBreaks = 0,
        ch = state.input.charCodeAt(state.position);

    while (ch !== 0) {
      while (is_WHITE_SPACE(ch)) {
        if (ch === 0x09/* Tab */ && state.firstTabInLine === -1) {
          state.firstTabInLine = state.position;
        }
        ch = state.input.charCodeAt(++state.position);
      }

      if (allowComments && ch === 0x23/* # */) {
        do {
          ch = state.input.charCodeAt(++state.position);
        } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && ch !== 0);
      }

      if (is_EOL(ch)) {
        readLineBreak(state);

        ch = state.input.charCodeAt(state.position);
        lineBreaks++;
        state.lineIndent = 0;

        while (ch === 0x20/* Space */) {
          state.lineIndent++;
          ch = state.input.charCodeAt(++state.position);
        }
      } else {
        break;
      }
    }

    if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {
      throwWarning(state, 'deficient indentation');
    }

    return lineBreaks;
  }

  function testDocumentSeparator(state) {
    var _position = state.position,
        ch;

    ch = state.input.charCodeAt(_position);

    // Condition state.position === state.lineStart is tested
    // in parent on each call, for efficiency. No needs to test here again.
    if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) &&
        ch === state.input.charCodeAt(_position + 1) &&
        ch === state.input.charCodeAt(_position + 2)) {

      _position += 3;

      ch = state.input.charCodeAt(_position);

      if (ch === 0 || is_WS_OR_EOL(ch)) {
        return true;
      }
    }

    return false;
  }

  function writeFoldedLines(state, count) {
    if (count === 1) {
      state.result += ' ';
    } else if (count > 1) {
      state.result += common.repeat('\n', count - 1);
    }
  }


  function readPlainScalar(state, nodeIndent, withinFlowCollection) {
    var preceding,
        following,
        captureStart,
        captureEnd,
        hasPendingContent,
        _line,
        _lineStart,
        _lineIndent,
        _kind = state.kind,
        _result = state.result,
        ch;

    ch = state.input.charCodeAt(state.position);

    if (is_WS_OR_EOL(ch)      ||
        is_FLOW_INDICATOR(ch) ||
        ch === 0x23/* # */    ||
        ch === 0x26/* & */    ||
        ch === 0x2A/* * */    ||
        ch === 0x21/* ! */    ||
        ch === 0x7C/* | */    ||
        ch === 0x3E/* > */    ||
        ch === 0x27/* ' */    ||
        ch === 0x22/* " */    ||
        ch === 0x25/* % */    ||
        ch === 0x40/* @ */    ||
        ch === 0x60/* ` */) {
      return false;
    }

    if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) {
      following = state.input.charCodeAt(state.position + 1);

      if (is_WS_OR_EOL(following) ||
          withinFlowCollection && is_FLOW_INDICATOR(following)) {
        return false;
      }
    }

    state.kind = 'scalar';
    state.result = '';
    captureStart = captureEnd = state.position;
    hasPendingContent = false;

    while (ch !== 0) {
      if (ch === 0x3A/* : */) {
        following = state.input.charCodeAt(state.position + 1);

        if (is_WS_OR_EOL(following) ||
            withinFlowCollection && is_FLOW_INDICATOR(following)) {
          break;
        }

      } else if (ch === 0x23/* # */) {
        preceding = state.input.charCodeAt(state.position - 1);

        if (is_WS_OR_EOL(preceding)) {
          break;
        }

      } else if ((state.position === state.lineStart && testDocumentSeparator(state)) ||
                 withinFlowCollection && is_FLOW_INDICATOR(ch)) {
        break;

      } else if (is_EOL(ch)) {
        _line = state.line;
        _lineStart = state.lineStart;
        _lineIndent = state.lineIndent;
        skipSeparationSpace(state, false, -1);

        if (state.lineIndent >= nodeIndent) {
          hasPendingContent = true;
          ch = state.input.charCodeAt(state.position);
          continue;
        } else {
          state.position = captureEnd;
          state.line = _line;
          state.lineStart = _lineStart;
          state.lineIndent = _lineIndent;
          break;
        }
      }

      if (hasPendingContent) {
        captureSegment(state, captureStart, captureEnd, false);
        writeFoldedLines(state, state.line - _line);
        captureStart = captureEnd = state.position;
        hasPendingContent = false;
      }

      if (!is_WHITE_SPACE(ch)) {
        captureEnd = state.position + 1;
      }

      ch = state.input.charCodeAt(++state.position);
    }

    captureSegment(state, captureStart, captureEnd, false);

    if (state.result) {
      return true;
    }

    state.kind = _kind;
    state.result = _result;
    return false;
  }

  function readSingleQuotedScalar(state, nodeIndent) {
    var ch,
        captureStart, captureEnd;

    ch = state.input.charCodeAt(state.position);

    if (ch !== 0x27/* ' */) {
      return false;
    }

    state.kind = 'scalar';
    state.result = '';
    state.position++;
    captureStart = captureEnd = state.position;

    while ((ch = state.input.charCodeAt(state.position)) !== 0) {
      if (ch === 0x27/* ' */) {
        captureSegment(state, captureStart, state.position, true);
        ch = state.input.charCodeAt(++state.position);

        if (ch === 0x27/* ' */) {
          captureStart = state.position;
          state.position++;
          captureEnd = state.position;
        } else {
          return true;
        }

      } else if (is_EOL(ch)) {
        captureSegment(state, captureStart, captureEnd, true);
        writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));
        captureStart = captureEnd = state.position;

      } else if (state.position === state.lineStart && testDocumentSeparator(state)) {
        throwError(state, 'unexpected end of the document within a single quoted scalar');

      } else {
        state.position++;
        captureEnd = state.position;
      }
    }

    throwError(state, 'unexpected end of the stream within a single quoted scalar');
  }

  function readDoubleQuotedScalar(state, nodeIndent) {
    var captureStart,
        captureEnd,
        hexLength,
        hexResult,
        tmp,
        ch;

    ch = state.input.charCodeAt(state.position);

    if (ch !== 0x22/* " */) {
      return false;
    }

    state.kind = 'scalar';
    state.result = '';
    state.position++;
    captureStart = captureEnd = state.position;

    while ((ch = state.input.charCodeAt(state.position)) !== 0) {
      if (ch === 0x22/* " */) {
        captureSegment(state, captureStart, state.position, true);
        state.position++;
        return true;

      } else if (ch === 0x5C/* \ */) {
        captureSegment(state, captureStart, state.position, true);
        ch = state.input.charCodeAt(++state.position);

        if (is_EOL(ch)) {
          skipSeparationSpace(state, false, nodeIndent);

          // TODO: rework to inline fn with no type cast?
        } else if (ch < 256 && simpleEscapeCheck[ch]) {
          state.result += simpleEscapeMap[ch];
          state.position++;

        } else if ((tmp = escapedHexLen(ch)) > 0) {
          hexLength = tmp;
          hexResult = 0;

          for (; hexLength > 0; hexLength--) {
            ch = state.input.charCodeAt(++state.position);

            if ((tmp = fromHexCode(ch)) >= 0) {
              hexResult = (hexResult << 4) + tmp;

            } else {
              throwError(state, 'expected hexadecimal character');
            }
          }

          state.result += charFromCodepoint(hexResult);

          state.position++;

        } else {
          throwError(state, 'unknown escape sequence');
        }

        captureStart = captureEnd = state.position;

      } else if (is_EOL(ch)) {
        captureSegment(state, captureStart, captureEnd, true);
        writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));
        captureStart = captureEnd = state.position;

      } else if (state.position === state.lineStart && testDocumentSeparator(state)) {
        throwError(state, 'unexpected end of the document within a double quoted scalar');

      } else {
        state.position++;
        captureEnd = state.position;
      }
    }

    throwError(state, 'unexpected end of the stream within a double quoted scalar');
  }

  function readFlowCollection(state, nodeIndent) {
    var readNext = true,
        _line,
        _lineStart,
        _pos,
        _tag     = state.tag,
        _result,
        _anchor  = state.anchor,
        following,
        terminator,
        isPair,
        isExplicitPair,
        isMapping,
        overridableKeys = Object.create(null),
        keyNode,
        keyTag,
        valueNode,
        ch;

    ch = state.input.charCodeAt(state.position);

    if (ch === 0x5B/* [ */) {
      terminator = 0x5D;/* ] */
      isMapping = false;
      _result = [];
    } else if (ch === 0x7B/* { */) {
      terminator = 0x7D;/* } */
      isMapping = true;
      _result = {};
    } else {
      return false;
    }

    if (state.anchor !== null) {
      state.anchorMap[state.anchor] = _result;
    }

    ch = state.input.charCodeAt(++state.position);

    while (ch !== 0) {
      skipSeparationSpace(state, true, nodeIndent);

      ch = state.input.charCodeAt(state.position);

      if (ch === terminator) {
        state.position++;
        state.tag = _tag;
        state.anchor = _anchor;
        state.kind = isMapping ? 'mapping' : 'sequence';
        state.result = _result;
        return true;
      } else if (!readNext) {
        throwError(state, 'missed comma between flow collection entries');
      } else if (ch === 0x2C/* , */) {
        // "flow collection entries can never be completely empty", as per YAML 1.2, section 7.4
        throwError(state, "expected the node content, but found ','");
      }

      keyTag = keyNode = valueNode = null;
      isPair = isExplicitPair = false;

      if (ch === 0x3F/* ? */) {
        following = state.input.charCodeAt(state.position + 1);

        if (is_WS_OR_EOL(following)) {
          isPair = isExplicitPair = true;
          state.position++;
          skipSeparationSpace(state, true, nodeIndent);
        }
      }

      _line = state.line; // Save the current line.
      _lineStart = state.lineStart;
      _pos = state.position;
      composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);
      keyTag = state.tag;
      keyNode = state.result;
      skipSeparationSpace(state, true, nodeIndent);

      ch = state.input.charCodeAt(state.position);

      if ((isExplicitPair || state.line === _line) && ch === 0x3A/* : */) {
        isPair = true;
        ch = state.input.charCodeAt(++state.position);
        skipSeparationSpace(state, true, nodeIndent);
        composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);
        valueNode = state.result;
      }

      if (isMapping) {
        storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos);
      } else if (isPair) {
        _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos));
      } else {
        _result.push(keyNode);
      }

      skipSeparationSpace(state, true, nodeIndent);

      ch = state.input.charCodeAt(state.position);

      if (ch === 0x2C/* , */) {
        readNext = true;
        ch = state.input.charCodeAt(++state.position);
      } else {
        readNext = false;
      }
    }

    throwError(state, 'unexpected end of the stream within a flow collection');
  }

  function readBlockScalar(state, nodeIndent) {
    var captureStart,
        folding,
        chomping       = CHOMPING_CLIP,
        didReadContent = false,
        detectedIndent = false,
        textIndent     = nodeIndent,
        emptyLines     = 0,
        atMoreIndented = false,
        tmp,
        ch;

    ch = state.input.charCodeAt(state.position);

    if (ch === 0x7C/* | */) {
      folding = false;
    } else if (ch === 0x3E/* > */) {
      folding = true;
    } else {
      return false;
    }

    state.kind = 'scalar';
    state.result = '';

    while (ch !== 0) {
      ch = state.input.charCodeAt(++state.position);

      if (ch === 0x2B/* + */ || ch === 0x2D/* - */) {
        if (CHOMPING_CLIP === chomping) {
          chomping = (ch === 0x2B/* + */) ? CHOMPING_KEEP : CHOMPING_STRIP;
        } else {
          throwError(state, 'repeat of a chomping mode identifier');
        }

      } else if ((tmp = fromDecimalCode(ch)) >= 0) {
        if (tmp === 0) {
          throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one');
        } else if (!detectedIndent) {
          textIndent = nodeIndent + tmp - 1;
          detectedIndent = true;
        } else {
          throwError(state, 'repeat of an indentation width identifier');
        }

      } else {
        break;
      }
    }

    if (is_WHITE_SPACE(ch)) {
      do { ch = state.input.charCodeAt(++state.position); }
      while (is_WHITE_SPACE(ch));

      if (ch === 0x23/* # */) {
        do { ch = state.input.charCodeAt(++state.position); }
        while (!is_EOL(ch) && (ch !== 0));
      }
    }

    while (ch !== 0) {
      readLineBreak(state);
      state.lineIndent = 0;

      ch = state.input.charCodeAt(state.position);

      while ((!detectedIndent || state.lineIndent < textIndent) &&
             (ch === 0x20/* Space */)) {
        state.lineIndent++;
        ch = state.input.charCodeAt(++state.position);
      }

      if (!detectedIndent && state.lineIndent > textIndent) {
        textIndent = state.lineIndent;
      }

      if (is_EOL(ch)) {
        emptyLines++;
        continue;
      }

      // End of the scalar.
      if (state.lineIndent < textIndent) {

        // Perform the chomping.
        if (chomping === CHOMPING_KEEP) {
          state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines);
        } else if (chomping === CHOMPING_CLIP) {
          if (didReadContent) { // i.e. only if the scalar is not empty.
            state.result += '\n';
          }
        }

        // Break this `while` cycle and go to the funciton's epilogue.
        break;
      }

      // Folded style: use fancy rules to handle line breaks.
      if (folding) {

        // Lines starting with white space characters (more-indented lines) are not folded.
        if (is_WHITE_SPACE(ch)) {
          atMoreIndented = true;
          // except for the first content line (cf. Example 8.1)
          state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines);

        // End of more-indented block.
        } else if (atMoreIndented) {
          atMoreIndented = false;
          state.result += common.repeat('\n', emptyLines + 1);

        // Just one line break - perceive as the same line.
        } else if (emptyLines === 0) {
          if (didReadContent) { // i.e. only if we have already read some scalar content.
            state.result += ' ';
          }

        // Several line breaks - perceive as different lines.
        } else {
          state.result += common.repeat('\n', emptyLines);
        }

      // Literal style: just add exact number of line breaks between content lines.
      } else {
        // Keep all line breaks except the header line break.
        state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines);
      }

      didReadContent = true;
      detectedIndent = true;
      emptyLines = 0;
      captureStart = state.position;

      while (!is_EOL(ch) && (ch !== 0)) {
        ch = state.input.charCodeAt(++state.position);
      }

      captureSegment(state, captureStart, state.position, false);
    }

    return true;
  }

  function readBlockSequence(state, nodeIndent) {
    var _line,
        _tag      = state.tag,
        _anchor   = state.anchor,
        _result   = [],
        following,
        detected  = false,
        ch;

    // there is a leading tab before this token, so it can't be a block sequence/mapping;
    // it can still be flow sequence/mapping or a scalar
    if (state.firstTabInLine !== -1) return false;

    if (state.anchor !== null) {
      state.anchorMap[state.anchor] = _result;
    }

    ch = state.input.charCodeAt(state.position);

    while (ch !== 0) {
      if (state.firstTabInLine !== -1) {
        state.position = state.firstTabInLine;
        throwError(state, 'tab characters must not be used in indentation');
      }

      if (ch !== 0x2D/* - */) {
        break;
      }

      following = state.input.charCodeAt(state.position + 1);

      if (!is_WS_OR_EOL(following)) {
        break;
      }

      detected = true;
      state.position++;

      if (skipSeparationSpace(state, true, -1)) {
        if (state.lineIndent <= nodeIndent) {
          _result.push(null);
          ch = state.input.charCodeAt(state.position);
          continue;
        }
      }

      _line = state.line;
      composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);
      _result.push(state.result);
      skipSeparationSpace(state, true, -1);

      ch = state.input.charCodeAt(state.position);

      if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {
        throwError(state, 'bad indentation of a sequence entry');
      } else if (state.lineIndent < nodeIndent) {
        break;
      }
    }

    if (detected) {
      state.tag = _tag;
      state.anchor = _anchor;
      state.kind = 'sequence';
      state.result = _result;
      return true;
    }
    return false;
  }

  function readBlockMapping(state, nodeIndent, flowIndent) {
    var following,
        allowCompact,
        _line,
        _keyLine,
        _keyLineStart,
        _keyPos,
        _tag          = state.tag,
        _anchor       = state.anchor,
        _result       = {},
        overridableKeys = Object.create(null),
        keyTag        = null,
        keyNode       = null,
        valueNode     = null,
        atExplicitKey = false,
        detected      = false,
        ch;

    // there is a leading tab before this token, so it can't be a block sequence/mapping;
    // it can still be flow sequence/mapping or a scalar
    if (state.firstTabInLine !== -1) return false;

    if (state.anchor !== null) {
      state.anchorMap[state.anchor] = _result;
    }

    ch = state.input.charCodeAt(state.position);

    while (ch !== 0) {
      if (!atExplicitKey && state.firstTabInLine !== -1) {
        state.position = state.firstTabInLine;
        throwError(state, 'tab characters must not be used in indentation');
      }

      following = state.input.charCodeAt(state.position + 1);
      _line = state.line; // Save the current line.

      //
      // Explicit notation case. There are two separate blocks:
      // first for the key (denoted by "?") and second for the value (denoted by ":")
      //
      if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && is_WS_OR_EOL(following)) {

        if (ch === 0x3F/* ? */) {
          if (atExplicitKey) {
            storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);
            keyTag = keyNode = valueNode = null;
          }

          detected = true;
          atExplicitKey = true;
          allowCompact = true;

        } else if (atExplicitKey) {
          // i.e. 0x3A/* : */ === character after the explicit key.
          atExplicitKey = false;
          allowCompact = true;

        } else {
          throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line');
        }

        state.position += 1;
        ch = following;

      //
      // Implicit notation case. Flow-style node as the key first, then ":", and the value.
      //
      } else {
        _keyLine = state.line;
        _keyLineStart = state.lineStart;
        _keyPos = state.position;

        if (!composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {
          // Neither implicit nor explicit notation.
          // Reading is done. Go to the epilogue.
          break;
        }

        if (state.line === _line) {
          ch = state.input.charCodeAt(state.position);

          while (is_WHITE_SPACE(ch)) {
            ch = state.input.charCodeAt(++state.position);
          }

          if (ch === 0x3A/* : */) {
            ch = state.input.charCodeAt(++state.position);

            if (!is_WS_OR_EOL(ch)) {
              throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping');
            }

            if (atExplicitKey) {
              storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);
              keyTag = keyNode = valueNode = null;
            }

            detected = true;
            atExplicitKey = false;
            allowCompact = false;
            keyTag = state.tag;
            keyNode = state.result;

          } else if (detected) {
            throwError(state, 'can not read an implicit mapping pair; a colon is missed');

          } else {
            state.tag = _tag;
            state.anchor = _anchor;
            return true; // Keep the result of `composeNode`.
          }

        } else if (detected) {
          throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key');

        } else {
          state.tag = _tag;
          state.anchor = _anchor;
          return true; // Keep the result of `composeNode`.
        }
      }

      //
      // Common reading code for both explicit and implicit notations.
      //
      if (state.line === _line || state.lineIndent > nodeIndent) {
        if (atExplicitKey) {
          _keyLine = state.line;
          _keyLineStart = state.lineStart;
          _keyPos = state.position;
        }

        if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {
          if (atExplicitKey) {
            keyNode = state.result;
          } else {
            valueNode = state.result;
          }
        }

        if (!atExplicitKey) {
          storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _keyLine, _keyLineStart, _keyPos);
          keyTag = keyNode = valueNode = null;
        }

        skipSeparationSpace(state, true, -1);
        ch = state.input.charCodeAt(state.position);
      }

      if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {
        throwError(state, 'bad indentation of a mapping entry');
      } else if (state.lineIndent < nodeIndent) {
        break;
      }
    }

    //
    // Epilogue.
    //

    // Special case: last mapping's node contains only the key in explicit notation.
    if (atExplicitKey) {
      storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);
    }

    // Expose the resulting mapping.
    if (detected) {
      state.tag = _tag;
      state.anchor = _anchor;
      state.kind = 'mapping';
      state.result = _result;
    }

    return detected;
  }

  function readTagProperty(state) {
    var _position,
        isVerbatim = false,
        isNamed    = false,
        tagHandle,
        tagName,
        ch;

    ch = state.input.charCodeAt(state.position);

    if (ch !== 0x21/* ! */) return false;

    if (state.tag !== null) {
      throwError(state, 'duplication of a tag property');
    }

    ch = state.input.charCodeAt(++state.position);

    if (ch === 0x3C/* < */) {
      isVerbatim = true;
      ch = state.input.charCodeAt(++state.position);

    } else if (ch === 0x21/* ! */) {
      isNamed = true;
      tagHandle = '!!';
      ch = state.input.charCodeAt(++state.position);

    } else {
      tagHandle = '!';
    }

    _position = state.position;

    if (isVerbatim) {
      do { ch = state.input.charCodeAt(++state.position); }
      while (ch !== 0 && ch !== 0x3E/* > */);

      if (state.position < state.length) {
        tagName = state.input.slice(_position, state.position);
        ch = state.input.charCodeAt(++state.position);
      } else {
        throwError(state, 'unexpected end of the stream within a verbatim tag');
      }
    } else {
      while (ch !== 0 && !is_WS_OR_EOL(ch)) {

        if (ch === 0x21/* ! */) {
          if (!isNamed) {
            tagHandle = state.input.slice(_position - 1, state.position + 1);

            if (!PATTERN_TAG_HANDLE.test(tagHandle)) {
              throwError(state, 'named tag handle cannot contain such characters');
            }

            isNamed = true;
            _position = state.position + 1;
          } else {
            throwError(state, 'tag suffix cannot contain exclamation marks');
          }
        }

        ch = state.input.charCodeAt(++state.position);
      }

      tagName = state.input.slice(_position, state.position);

      if (PATTERN_FLOW_INDICATORS.test(tagName)) {
        throwError(state, 'tag suffix cannot contain flow indicator characters');
      }
    }

    if (tagName && !PATTERN_TAG_URI.test(tagName)) {
      throwError(state, 'tag name cannot contain such characters: ' + tagName);
    }

    try {
      tagName = decodeURIComponent(tagName);
    } catch (err) {
      throwError(state, 'tag name is malformed: ' + tagName);
    }

    if (isVerbatim) {
      state.tag = tagName;

    } else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) {
      state.tag = state.tagMap[tagHandle] + tagName;

    } else if (tagHandle === '!') {
      state.tag = '!' + tagName;

    } else if (tagHandle === '!!') {
      state.tag = 'tag:yaml.org,2002:' + tagName;

    } else {
      throwError(state, 'undeclared tag handle "' + tagHandle + '"');
    }

    return true;
  }

  function readAnchorProperty(state) {
    var _position,
        ch;

    ch = state.input.charCodeAt(state.position);

    if (ch !== 0x26/* & */) return false;

    if (state.anchor !== null) {
      throwError(state, 'duplication of an anchor property');
    }

    ch = state.input.charCodeAt(++state.position);
    _position = state.position;

    while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {
      ch = state.input.charCodeAt(++state.position);
    }

    if (state.position === _position) {
      throwError(state, 'name of an anchor node must contain at least one character');
    }

    state.anchor = state.input.slice(_position, state.position);
    return true;
  }

  function readAlias(state) {
    var _position, alias,
        ch;

    ch = state.input.charCodeAt(state.position);

    if (ch !== 0x2A/* * */) return false;

    ch = state.input.charCodeAt(++state.position);
    _position = state.position;

    while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {
      ch = state.input.charCodeAt(++state.position);
    }

    if (state.position === _position) {
      throwError(state, 'name of an alias node must contain at least one character');
    }

    alias = state.input.slice(_position, state.position);

    if (!_hasOwnProperty$1.call(state.anchorMap, alias)) {
      throwError(state, 'unidentified alias "' + alias + '"');
    }

    state.result = state.anchorMap[alias];
    skipSeparationSpace(state, true, -1);
    return true;
  }

  function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {
    var allowBlockStyles,
        allowBlockScalars,
        allowBlockCollections,
        indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this<parent
        atNewLine  = false,
        hasContent = false,
        typeIndex,
        typeQuantity,
        typeList,
        type,
        flowIndent,
        blockIndent;

    if (state.listener !== null) {
      state.listener('open', state);
    }

    state.tag    = null;
    state.anchor = null;
    state.kind   = null;
    state.result = null;

    allowBlockStyles = allowBlockScalars = allowBlockCollections =
      CONTEXT_BLOCK_OUT === nodeContext ||
      CONTEXT_BLOCK_IN  === nodeContext;

    if (allowToSeek) {
      if (skipSeparationSpace(state, true, -1)) {
        atNewLine = true;

        if (state.lineIndent > parentIndent) {
          indentStatus = 1;
        } else if (state.lineIndent === parentIndent) {
          indentStatus = 0;
        } else if (state.lineIndent < parentIndent) {
          indentStatus = -1;
        }
      }
    }

    if (indentStatus === 1) {
      while (readTagProperty(state) || readAnchorProperty(state)) {
        if (skipSeparationSpace(state, true, -1)) {
          atNewLine = true;
          allowBlockCollections = allowBlockStyles;

          if (state.lineIndent > parentIndent) {
            indentStatus = 1;
          } else if (state.lineIndent === parentIndent) {
            indentStatus = 0;
          } else if (state.lineIndent < parentIndent) {
            indentStatus = -1;
          }
        } else {
          allowBlockCollections = false;
        }
      }
    }

    if (allowBlockCollections) {
      allowBlockCollections = atNewLine || allowCompact;
    }

    if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {
      if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {
        flowIndent = parentIndent;
      } else {
        flowIndent = parentIndent + 1;
      }

      blockIndent = state.position - state.lineStart;

      if (indentStatus === 1) {
        if (allowBlockCollections &&
            (readBlockSequence(state, blockIndent) ||
             readBlockMapping(state, blockIndent, flowIndent)) ||
            readFlowCollection(state, flowIndent)) {
          hasContent = true;
        } else {
          if ((allowBlockScalars && readBlockScalar(state, flowIndent)) ||
              readSingleQuotedScalar(state, flowIndent) ||
              readDoubleQuotedScalar(state, flowIndent)) {
            hasContent = true;

          } else if (readAlias(state)) {
            hasContent = true;

            if (state.tag !== null || state.anchor !== null) {
              throwError(state, 'alias node should not have any properties');
            }

          } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {
            hasContent = true;

            if (state.tag === null) {
              state.tag = '?';
            }
          }

          if (state.anchor !== null) {
            state.anchorMap[state.anchor] = state.result;
          }
        }
      } else if (indentStatus === 0) {
        // Special case: block sequences are allowed to have same indentation level as the parent.
        // http://www.yaml.org/spec/1.2/spec.html#id2799784
        hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);
      }
    }

    if (state.tag === null) {
      if (state.anchor !== null) {
        state.anchorMap[state.anchor] = state.result;
      }

    } else if (state.tag === '?') {
      // Implicit resolving is not allowed for non-scalar types, and '?'
      // non-specific tag is only automatically assigned to plain scalars.
      //
      // We only need to check kind conformity in case user explicitly assigns '?'
      // tag, for example like this: "!<?> [0]"
      //
      if (state.result !== null && state.kind !== 'scalar') {
        throwError(state, 'unacceptable node kind for !<?> tag; it should be "scalar", not "' + state.kind + '"');
      }

      for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) {
        type = state.implicitTypes[typeIndex];

        if (type.resolve(state.result)) { // `state.result` updated in resolver if matched
          state.result = type.construct(state.result);
          state.tag = type.tag;
          if (state.anchor !== null) {
            state.anchorMap[state.anchor] = state.result;
          }
          break;
        }
      }
    } else if (state.tag !== '!') {
      if (_hasOwnProperty$1.call(state.typeMap[state.kind || 'fallback'], state.tag)) {
        type = state.typeMap[state.kind || 'fallback'][state.tag];
      } else {
        // looking for multi type
        type = null;
        typeList = state.typeMap.multi[state.kind || 'fallback'];

        for (typeIndex = 0, typeQuantity = typeList.length; typeIndex < typeQuantity; typeIndex += 1) {
          if (state.tag.slice(0, typeList[typeIndex].tag.length) === typeList[typeIndex].tag) {
            type = typeList[typeIndex];
            break;
          }
        }
      }

      if (!type) {
        throwError(state, 'unknown tag !<' + state.tag + '>');
      }

      if (state.result !== null && type.kind !== state.kind) {
        throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be "' + type.kind + '", not "' + state.kind + '"');
      }

      if (!type.resolve(state.result, state.tag)) { // `state.result` updated in resolver if matched
        throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag');
      } else {
        state.result = type.construct(state.result, state.tag);
        if (state.anchor !== null) {
          state.anchorMap[state.anchor] = state.result;
        }
      }
    }

    if (state.listener !== null) {
      state.listener('close', state);
    }
    return state.tag !== null ||  state.anchor !== null || hasContent;
  }

  function readDocument(state) {
    var documentStart = state.position,
        _position,
        directiveName,
        directiveArgs,
        hasDirectives = false,
        ch;

    state.version = null;
    state.checkLineBreaks = state.legacy;
    state.tagMap = Object.create(null);
    state.anchorMap = Object.create(null);

    while ((ch = state.input.charCodeAt(state.position)) !== 0) {
      skipSeparationSpace(state, true, -1);

      ch = state.input.charCodeAt(state.position);

      if (state.lineIndent > 0 || ch !== 0x25/* % */) {
        break;
      }

      hasDirectives = true;
      ch = state.input.charCodeAt(++state.position);
      _position = state.position;

      while (ch !== 0 && !is_WS_OR_EOL(ch)) {
        ch = state.input.charCodeAt(++state.position);
      }

      directiveName = state.input.slice(_position, state.position);
      directiveArgs = [];

      if (directiveName.length < 1) {
        throwError(state, 'directive name must not be less than one character in length');
      }

      while (ch !== 0) {
        while (is_WHITE_SPACE(ch)) {
          ch = state.input.charCodeAt(++state.position);
        }

        if (ch === 0x23/* # */) {
          do { ch = state.input.charCodeAt(++state.position); }
          while (ch !== 0 && !is_EOL(ch));
          break;
        }

        if (is_EOL(ch)) break;

        _position = state.position;

        while (ch !== 0 && !is_WS_OR_EOL(ch)) {
          ch = state.input.charCodeAt(++state.position);
        }

        directiveArgs.push(state.input.slice(_position, state.position));
      }

      if (ch !== 0) readLineBreak(state);

      if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) {
        directiveHandlers[directiveName](state, directiveName, directiveArgs);
      } else {
        throwWarning(state, 'unknown document directive "' + directiveName + '"');
      }
    }

    skipSeparationSpace(state, true, -1);

    if (state.lineIndent === 0 &&
        state.input.charCodeAt(state.position)     === 0x2D/* - */ &&
        state.input.charCodeAt(state.position + 1) === 0x2D/* - */ &&
        state.input.charCodeAt(state.position + 2) === 0x2D/* - */) {
      state.position += 3;
      skipSeparationSpace(state, true, -1);

    } else if (hasDirectives) {
      throwError(state, 'directives end mark is expected');
    }

    composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);
    skipSeparationSpace(state, true, -1);

    if (state.checkLineBreaks &&
        PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {
      throwWarning(state, 'non-ASCII line breaks are interpreted as content');
    }

    state.documents.push(state.result);

    if (state.position === state.lineStart && testDocumentSeparator(state)) {

      if (state.input.charCodeAt(state.position) === 0x2E/* . */) {
        state.position += 3;
        skipSeparationSpace(state, true, -1);
      }
      return;
    }

    if (state.position < (state.length - 1)) {
      throwError(state, 'end of the stream or a document separator is expected');
    } else {
      return;
    }
  }


  function loadDocuments(input, options) {
    input = String(input);
    options = options || {};

    if (input.length !== 0) {

      // Add tailing `\n` if not exists
      if (input.charCodeAt(input.length - 1) !== 0x0A/* LF */ &&
          input.charCodeAt(input.length - 1) !== 0x0D/* CR */) {
        input += '\n';
      }

      // Strip BOM
      if (input.charCodeAt(0) === 0xFEFF) {
        input = input.slice(1);
      }
    }

    var state = new State$1(input, options);

    var nullpos = input.indexOf('\0');

    if (nullpos !== -1) {
      state.position = nullpos;
      throwError(state, 'null byte is not allowed in input');
    }

    // Use 0 as string terminator. That significantly simplifies bounds check.
    state.input += '\0';

    while (state.input.charCodeAt(state.position) === 0x20/* Space */) {
      state.lineIndent += 1;
      state.position += 1;
    }

    while (state.position < (state.length - 1)) {
      readDocument(state);
    }

    return state.documents;
  }


  function loadAll$1(input, iterator, options) {
    if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') {
      options = iterator;
      iterator = null;
    }

    var documents = loadDocuments(input, options);

    if (typeof iterator !== 'function') {
      return documents;
    }

    for (var index = 0, length = documents.length; index < length; index += 1) {
      iterator(documents[index]);
    }
  }


  function load$1(input, options) {
    var documents = loadDocuments(input, options);

    if (documents.length === 0) {
      /*eslint-disable no-undefined*/
      return undefined;
    } else if (documents.length === 1) {
      return documents[0];
    }
    throw new exception('expected a single document in the stream, but found more');
  }


  var loadAll_1 = loadAll$1;
  var load_1    = load$1;

  var loader = {
  	loadAll: loadAll_1,
  	load: load_1
  };

  /*eslint-disable no-use-before-define*/





  var _toString       = Object.prototype.toString;
  var _hasOwnProperty = Object.prototype.hasOwnProperty;

  var CHAR_BOM                  = 0xFEFF;
  var CHAR_TAB                  = 0x09; /* Tab */
  var CHAR_LINE_FEED            = 0x0A; /* LF */
  var CHAR_CARRIAGE_RETURN      = 0x0D; /* CR */
  var CHAR_SPACE                = 0x20; /* Space */
  var CHAR_EXCLAMATION          = 0x21; /* ! */
  var CHAR_DOUBLE_QUOTE         = 0x22; /* " */
  var CHAR_SHARP                = 0x23; /* # */
  var CHAR_PERCENT              = 0x25; /* % */
  var CHAR_AMPERSAND            = 0x26; /* & */
  var CHAR_SINGLE_QUOTE         = 0x27; /* ' */
  var CHAR_ASTERISK             = 0x2A; /* * */
  var CHAR_COMMA                = 0x2C; /* , */
  var CHAR_MINUS                = 0x2D; /* - */
  var CHAR_COLON                = 0x3A; /* : */
  var CHAR_EQUALS               = 0x3D; /* = */
  var CHAR_GREATER_THAN         = 0x3E; /* > */
  var CHAR_QUESTION             = 0x3F; /* ? */
  var CHAR_COMMERCIAL_AT        = 0x40; /* @ */
  var CHAR_LEFT_SQUARE_BRACKET  = 0x5B; /* [ */
  var CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */
  var CHAR_GRAVE_ACCENT         = 0x60; /* ` */
  var CHAR_LEFT_CURLY_BRACKET   = 0x7B; /* { */
  var CHAR_VERTICAL_LINE        = 0x7C; /* | */
  var CHAR_RIGHT_CURLY_BRACKET  = 0x7D; /* } */

  var ESCAPE_SEQUENCES = {};

  ESCAPE_SEQUENCES[0x00]   = '\\0';
  ESCAPE_SEQUENCES[0x07]   = '\\a';
  ESCAPE_SEQUENCES[0x08]   = '\\b';
  ESCAPE_SEQUENCES[0x09]   = '\\t';
  ESCAPE_SEQUENCES[0x0A]   = '\\n';
  ESCAPE_SEQUENCES[0x0B]   = '\\v';
  ESCAPE_SEQUENCES[0x0C]   = '\\f';
  ESCAPE_SEQUENCES[0x0D]   = '\\r';
  ESCAPE_SEQUENCES[0x1B]   = '\\e';
  ESCAPE_SEQUENCES[0x22]   = '\\"';
  ESCAPE_SEQUENCES[0x5C]   = '\\\\';
  ESCAPE_SEQUENCES[0x85]   = '\\N';
  ESCAPE_SEQUENCES[0xA0]   = '\\_';
  ESCAPE_SEQUENCES[0x2028] = '\\L';
  ESCAPE_SEQUENCES[0x2029] = '\\P';

  var DEPRECATED_BOOLEANS_SYNTAX = [
    'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON',
    'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF'
  ];

  var DEPRECATED_BASE60_SYNTAX = /^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/;

  function compileStyleMap(schema, map) {
    var result, keys, index, length, tag, style, type;

    if (map === null) return {};

    result = {};
    keys = Object.keys(map);

    for (index = 0, length = keys.length; index < length; index += 1) {
      tag = keys[index];
      style = String(map[tag]);

      if (tag.slice(0, 2) === '!!') {
        tag = 'tag:yaml.org,2002:' + tag.slice(2);
      }
      type = schema.compiledTypeMap['fallback'][tag];

      if (type && _hasOwnProperty.call(type.styleAliases, style)) {
        style = type.styleAliases[style];
      }

      result[tag] = style;
    }

    return result;
  }

  function encodeHex(character) {
    var string, handle, length;

    string = character.toString(16).toUpperCase();

    if (character <= 0xFF) {
      handle = 'x';
      length = 2;
    } else if (character <= 0xFFFF) {
      handle = 'u';
      length = 4;
    } else if (character <= 0xFFFFFFFF) {
      handle = 'U';
      length = 8;
    } else {
      throw new exception('code point within a string may not be greater than 0xFFFFFFFF');
    }

    return '\\' + handle + common.repeat('0', length - string.length) + string;
  }


  var QUOTING_TYPE_SINGLE = 1,
      QUOTING_TYPE_DOUBLE = 2;

  function State(options) {
    this.schema        = options['schema'] || _default;
    this.indent        = Math.max(1, (options['indent'] || 2));
    this.noArrayIndent = options['noArrayIndent'] || false;
    this.skipInvalid   = options['skipInvalid'] || false;
    this.flowLevel     = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']);
    this.styleMap      = compileStyleMap(this.schema, options['styles'] || null);
    this.sortKeys      = options['sortKeys'] || false;
    this.lineWidth     = options['lineWidth'] || 80;
    this.noRefs        = options['noRefs'] || false;
    this.noCompatMode  = options['noCompatMode'] || false;
    this.condenseFlow  = options['condenseFlow'] || false;
    this.quotingType   = options['quotingType'] === '"' ? QUOTING_TYPE_DOUBLE : QUOTING_TYPE_SINGLE;
    this.forceQuotes   = options['forceQuotes'] || false;
    this.replacer      = typeof options['replacer'] === 'function' ? options['replacer'] : null;

    this.implicitTypes = this.schema.compiledImplicit;
    this.explicitTypes = this.schema.compiledExplicit;

    this.tag = null;
    this.result = '';

    this.duplicates = [];
    this.usedDuplicates = null;
  }

  // Indents every line in a string. Empty lines (\n only) are not indented.
  function indentString(string, spaces) {
    var ind = common.repeat(' ', spaces),
        position = 0,
        next = -1,
        result = '',
        line,
        length = string.length;

    while (position < length) {
      next = string.indexOf('\n', position);
      if (next === -1) {
        line = string.slice(position);
        position = length;
      } else {
        line = string.slice(position, next + 1);
        position = next + 1;
      }

      if (line.length && line !== '\n') result += ind;

      result += line;
    }

    return result;
  }

  function generateNextLine(state, level) {
    return '\n' + common.repeat(' ', state.indent * level);
  }

  function testImplicitResolving(state, str) {
    var index, length, type;

    for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {
      type = state.implicitTypes[index];

      if (type.resolve(str)) {
        return true;
      }
    }

    return false;
  }

  // [33] s-white ::= s-space | s-tab
  function isWhitespace(c) {
    return c === CHAR_SPACE || c === CHAR_TAB;
  }

  // Returns true if the character can be printed without escaping.
  // From YAML 1.2: "any allowed characters known to be non-printable
  // should also be escaped. [However,] This isn’t mandatory"
  // Derived from nb-char - \t - #x85 - #xA0 - #x2028 - #x2029.
  function isPrintable(c) {
    return  (0x00020 <= c && c <= 0x00007E)
        || ((0x000A1 <= c && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029)
        || ((0x0E000 <= c && c <= 0x00FFFD) && c !== CHAR_BOM)
        ||  (0x10000 <= c && c <= 0x10FFFF);
  }

  // [34] ns-char ::= nb-char - s-white
  // [27] nb-char ::= c-printable - b-char - c-byte-order-mark
  // [26] b-char  ::= b-line-feed | b-carriage-return
  // Including s-white (for some reason, examples doesn't match specs in this aspect)
  // ns-char ::= c-printable - b-line-feed - b-carriage-return - c-byte-order-mark
  function isNsCharOrWhitespace(c) {
    return isPrintable(c)
      && c !== CHAR_BOM
      // - b-char
      && c !== CHAR_CARRIAGE_RETURN
      && c !== CHAR_LINE_FEED;
  }

  // [127]  ns-plain-safe(c) ::= c = flow-out  ⇒ ns-plain-safe-out
  //                             c = flow-in   ⇒ ns-plain-safe-in
  //                             c = block-key ⇒ ns-plain-safe-out
  //                             c = flow-key  ⇒ ns-plain-safe-in
  // [128] ns-plain-safe-out ::= ns-char
  // [129]  ns-plain-safe-in ::= ns-char - c-flow-indicator
  // [130]  ns-plain-char(c) ::=  ( ns-plain-safe(c) - “:” - “#” )
  //                            | ( /* An ns-char preceding */ “#” )
  //                            | ( “:” /* Followed by an ns-plain-safe(c) */ )
  function isPlainSafe(c, prev, inblock) {
    var cIsNsCharOrWhitespace = isNsCharOrWhitespace(c);
    var cIsNsChar = cIsNsCharOrWhitespace && !isWhitespace(c);
    return (
      // ns-plain-safe
      inblock ? // c = flow-in
        cIsNsCharOrWhitespace
        : cIsNsCharOrWhitespace
          // - c-flow-indicator
          && c !== CHAR_COMMA
          && c !== CHAR_LEFT_SQUARE_BRACKET
          && c !== CHAR_RIGHT_SQUARE_BRACKET
          && c !== CHAR_LEFT_CURLY_BRACKET
          && c !== CHAR_RIGHT_CURLY_BRACKET
    )
      // ns-plain-char
      && c !== CHAR_SHARP // false on '#'
      && !(prev === CHAR_COLON && !cIsNsChar) // false on ': '
      || (isNsCharOrWhitespace(prev) && !isWhitespace(prev) && c === CHAR_SHARP) // change to true on '[^ ]#'
      || (prev === CHAR_COLON && cIsNsChar); // change to true on ':[^ ]'
  }

  // Simplified test for values allowed as the first character in plain style.
  function isPlainSafeFirst(c) {
    // Uses a subset of ns-char - c-indicator
    // where ns-char = nb-char - s-white.
    // No support of ( ( “?” | “:” | “-” ) /* Followed by an ns-plain-safe(c)) */ ) part
    return isPrintable(c) && c !== CHAR_BOM
      && !isWhitespace(c) // - s-white
      // - (c-indicator ::=
      // “-” | “?” | “:” | “,” | “[” | “]” | “{” | “}”
      && c !== CHAR_MINUS
      && c !== CHAR_QUESTION
      && c !== CHAR_COLON
      && c !== CHAR_COMMA
      && c !== CHAR_LEFT_SQUARE_BRACKET
      && c !== CHAR_RIGHT_SQUARE_BRACKET
      && c !== CHAR_LEFT_CURLY_BRACKET
      && c !== CHAR_RIGHT_CURLY_BRACKET
      // | “#” | “&” | “*” | “!” | “|” | “=” | “>” | “'” | “"”
      && c !== CHAR_SHARP
      && c !== CHAR_AMPERSAND
      && c !== CHAR_ASTERISK
      && c !== CHAR_EXCLAMATION
      && c !== CHAR_VERTICAL_LINE
      && c !== CHAR_EQUALS
      && c !== CHAR_GREATER_THAN
      && c !== CHAR_SINGLE_QUOTE
      && c !== CHAR_DOUBLE_QUOTE
      // | “%” | “@” | “`”)
      && c !== CHAR_PERCENT
      && c !== CHAR_COMMERCIAL_AT
      && c !== CHAR_GRAVE_ACCENT;
  }

  // Simplified test for values allowed as the last character in plain style.
  function isPlainSafeLast(c) {
    // just not whitespace or colon, it will be checked to be plain character later
    return !isWhitespace(c) && c !== CHAR_COLON;
  }

  // Same as 'string'.codePointAt(pos), but works in older browsers.
  function codePointAt(string, pos) {
    var first = string.charCodeAt(pos), second;
    if (first >= 0xD800 && first <= 0xDBFF && pos + 1 < string.length) {
      second = string.charCodeAt(pos + 1);
      if (second >= 0xDC00 && second <= 0xDFFF) {
        // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
        return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;
      }
    }
    return first;
  }

  // Determines whether block indentation indicator is required.
  function needIndentIndicator(string) {
    var leadingSpaceRe = /^\n* /;
    return leadingSpaceRe.test(string);
  }

  var STYLE_PLAIN   = 1,
      STYLE_SINGLE  = 2,
      STYLE_LITERAL = 3,
      STYLE_FOLDED  = 4,
      STYLE_DOUBLE  = 5;

  // Determines which scalar styles are possible and returns the preferred style.
  // lineWidth = -1 => no limit.
  // Pre-conditions: str.length > 0.
  // Post-conditions:
  //    STYLE_PLAIN or STYLE_SINGLE => no \n are in the string.
  //    STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1).
  //    STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1).
  function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth,
    testAmbiguousType, quotingType, forceQuotes, inblock) {

    var i;
    var char = 0;
    var prevChar = null;
    var hasLineBreak = false;
    var hasFoldableLine = false; // only checked if shouldTrackWidth
    var shouldTrackWidth = lineWidth !== -1;
    var previousLineBreak = -1; // count the first line correctly
    var plain = isPlainSafeFirst(codePointAt(string, 0))
            && isPlainSafeLast(codePointAt(string, string.length - 1));

    if (singleLineOnly || forceQuotes) {
      // Case: no block styles.
      // Check for disallowed characters to rule out plain and single.
      for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {
        char = codePointAt(string, i);
        if (!isPrintable(char)) {
          return STYLE_DOUBLE;
        }
        plain = plain && isPlainSafe(char, prevChar, inblock);
        prevChar = char;
      }
    } else {
      // Case: block styles permitted.
      for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {
        char = codePointAt(string, i);
        if (char === CHAR_LINE_FEED) {
          hasLineBreak = true;
          // Check if any line can be folded.
          if (shouldTrackWidth) {
            hasFoldableLine = hasFoldableLine ||
              // Foldable line = too long, and not more-indented.
              (i - previousLineBreak - 1 > lineWidth &&
               string[previousLineBreak + 1] !== ' ');
            previousLineBreak = i;
          }
        } else if (!isPrintable(char)) {
          return STYLE_DOUBLE;
        }
        plain = plain && isPlainSafe(char, prevChar, inblock);
        prevChar = char;
      }
      // in case the end is missing a \n
      hasFoldableLine = hasFoldableLine || (shouldTrackWidth &&
        (i - previousLineBreak - 1 > lineWidth &&
         string[previousLineBreak + 1] !== ' '));
    }
    // Although every style can represent \n without escaping, prefer block styles
    // for multiline, since they're more readable and they don't add empty lines.
    // Also prefer folding a super-long line.
    if (!hasLineBreak && !hasFoldableLine) {
      // Strings interpretable as another type have to be quoted;
      // e.g. the string 'true' vs. the boolean true.
      if (plain && !forceQuotes && !testAmbiguousType(string)) {
        return STYLE_PLAIN;
      }
      return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;
    }
    // Edge case: block indentation indicator can only have one digit.
    if (indentPerLevel > 9 && needIndentIndicator(string)) {
      return STYLE_DOUBLE;
    }
    // At this point we know block styles are valid.
    // Prefer literal style unless we want to fold.
    if (!forceQuotes) {
      return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;
    }
    return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;
  }

  // Note: line breaking/folding is implemented for only the folded style.
  // NB. We drop the last trailing newline (if any) of a returned block scalar
  //  since the dumper adds its own newline. This always works:
  //    • No ending newline => unaffected; already using strip "-" chomping.
  //    • Ending newline    => removed then restored.
  //  Importantly, this keeps the "+" chomp indicator from gaining an extra line.
  function writeScalar(state, string, level, iskey, inblock) {
    state.dump = (function () {
      if (string.length === 0) {
        return state.quotingType === QUOTING_TYPE_DOUBLE ? '""' : "''";
      }
      if (!state.noCompatMode) {
        if (DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1 || DEPRECATED_BASE60_SYNTAX.test(string)) {
          return state.quotingType === QUOTING_TYPE_DOUBLE ? ('"' + string + '"') : ("'" + string + "'");
        }
      }

      var indent = state.indent * Math.max(1, level); // no 0-indent scalars
      // As indentation gets deeper, let the width decrease monotonically
      // to the lower bound min(state.lineWidth, 40).
      // Note that this implies
      //  state.lineWidth ≤ 40 + state.indent: width is fixed at the lower bound.
      //  state.lineWidth > 40 + state.indent: width decreases until the lower bound.
      // This behaves better than a constant minimum width which disallows narrower options,
      // or an indent threshold which causes the width to suddenly increase.
      var lineWidth = state.lineWidth === -1
        ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);

      // Without knowing if keys are implicit/explicit, assume implicit for safety.
      var singleLineOnly = iskey
        // No block styles in flow mode.
        || (state.flowLevel > -1 && level >= state.flowLevel);
      function testAmbiguity(string) {
        return testImplicitResolving(state, string);
      }

      switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth,
        testAmbiguity, state.quotingType, state.forceQuotes && !iskey, inblock)) {

        case STYLE_PLAIN:
          return string;
        case STYLE_SINGLE:
          return "'" + string.replace(/'/g, "''") + "'";
        case STYLE_LITERAL:
          return '|' + blockHeader(string, state.indent)
            + dropEndingNewline(indentString(string, indent));
        case STYLE_FOLDED:
          return '>' + blockHeader(string, state.indent)
            + dropEndingNewline(indentString(foldString(string, lineWidth), indent));
        case STYLE_DOUBLE:
          return '"' + escapeString(string) + '"';
        default:
          throw new exception('impossible error: invalid scalar style');
      }
    }());
  }

  // Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9.
  function blockHeader(string, indentPerLevel) {
    var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : '';

    // note the special case: the string '\n' counts as a "trailing" empty line.
    var clip =          string[string.length - 1] === '\n';
    var keep = clip && (string[string.length - 2] === '\n' || string === '\n');
    var chomp = keep ? '+' : (clip ? '' : '-');

    return indentIndicator + chomp + '\n';
  }

  // (See the note for writeScalar.)
  function dropEndingNewline(string) {
    return string[string.length - 1] === '\n' ? string.slice(0, -1) : string;
  }

  // Note: a long line without a suitable break point will exceed the width limit.
  // Pre-conditions: every char in str isPrintable, str.length > 0, width > 0.
  function foldString(string, width) {
    // In folded style, $k$ consecutive newlines output as $k+1$ newlines—
    // unless they're before or after a more-indented line, or at the very
    // beginning or end, in which case $k$ maps to $k$.
    // Therefore, parse each chunk as newline(s) followed by a content line.
    var lineRe = /(\n+)([^\n]*)/g;

    // first line (possibly an empty line)
    var result = (function () {
      var nextLF = string.indexOf('\n');
      nextLF = nextLF !== -1 ? nextLF : string.length;
      lineRe.lastIndex = nextLF;
      return foldLine(string.slice(0, nextLF), width);
    }());
    // If we haven't reached the first content line yet, don't add an extra \n.
    var prevMoreIndented = string[0] === '\n' || string[0] === ' ';
    var moreIndented;

    // rest of the lines
    var match;
    while ((match = lineRe.exec(string))) {
      var prefix = match[1], line = match[2];
      moreIndented = (line[0] === ' ');
      result += prefix
        + (!prevMoreIndented && !moreIndented && line !== ''
          ? '\n' : '')
        + foldLine(line, width);
      prevMoreIndented = moreIndented;
    }

    return result;
  }

  // Greedy line breaking.
  // Picks the longest line under the limit each time,
  // otherwise settles for the shortest line over the limit.
  // NB. More-indented lines *cannot* be folded, as that would add an extra \n.
  function foldLine(line, width) {
    if (line === '' || line[0] === ' ') return line;

    // Since a more-indented line adds a \n, breaks can't be followed by a space.
    var breakRe = / [^ ]/g; // note: the match index will always be <= length-2.
    var match;
    // start is an inclusive index. end, curr, and next are exclusive.
    var start = 0, end, curr = 0, next = 0;
    var result = '';

    // Invariants: 0 <= start <= length-1.
    //   0 <= curr <= next <= max(0, length-2). curr - start <= width.
    // Inside the loop:
    //   A match implies length >= 2, so curr and next are <= length-2.
    while ((match = breakRe.exec(line))) {
      next = match.index;
      // maintain invariant: curr - start <= width
      if (next - start > width) {
        end = (curr > start) ? curr : next; // derive end <= length-2
        result += '\n' + line.slice(start, end);
        // skip the space that was output as \n
        start = end + 1;                    // derive start <= length-1
      }
      curr = next;
    }

    // By the invariants, start <= length-1, so there is something left over.
    // It is either the whole string or a part starting from non-whitespace.
    result += '\n';
    // Insert a break if the remainder is too long and there is a break available.
    if (line.length - start > width && curr > start) {
      result += line.slice(start, curr) + '\n' + line.slice(curr + 1);
    } else {
      result += line.slice(start);
    }

    return result.slice(1); // drop extra \n joiner
  }

  // Escapes a double-quoted string.
  function escapeString(string) {
    var result = '';
    var char = 0;
    var escapeSeq;

    for (var i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {
      char = codePointAt(string, i);
      escapeSeq = ESCAPE_SEQUENCES[char];

      if (!escapeSeq && isPrintable(char)) {
        result += string[i];
        if (char >= 0x10000) result += string[i + 1];
      } else {
        result += escapeSeq || encodeHex(char);
      }
    }

    return result;
  }

  function writeFlowSequence(state, level, object) {
    var _result = '',
        _tag    = state.tag,
        index,
        length,
        value;

    for (index = 0, length = object.length; index < length; index += 1) {
      value = object[index];

      if (state.replacer) {
        value = state.replacer.call(object, String(index), value);
      }

      // Write only valid elements, put null instead of invalid elements.
      if (writeNode(state, level, value, false, false) ||
          (typeof value === 'undefined' &&
           writeNode(state, level, null, false, false))) {

        if (_result !== '') _result += ',' + (!state.condenseFlow ? ' ' : '');
        _result += state.dump;
      }
    }

    state.tag = _tag;
    state.dump = '[' + _result + ']';
  }

  function writeBlockSequence(state, level, object, compact) {
    var _result = '',
        _tag    = state.tag,
        index,
        length,
        value;

    for (index = 0, length = object.length; index < length; index += 1) {
      value = object[index];

      if (state.replacer) {
        value = state.replacer.call(object, String(index), value);
      }

      // Write only valid elements, put null instead of invalid elements.
      if (writeNode(state, level + 1, value, true, true, false, true) ||
          (typeof value === 'undefined' &&
           writeNode(state, level + 1, null, true, true, false, true))) {

        if (!compact || _result !== '') {
          _result += generateNextLine(state, level);
        }

        if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
          _result += '-';
        } else {
          _result += '- ';
        }

        _result += state.dump;
      }
    }

    state.tag = _tag;
    state.dump = _result || '[]'; // Empty sequence if no valid values.
  }

  function writeFlowMapping(state, level, object) {
    var _result       = '',
        _tag          = state.tag,
        objectKeyList = Object.keys(object),
        index,
        length,
        objectKey,
        objectValue,
        pairBuffer;

    for (index = 0, length = objectKeyList.length; index < length; index += 1) {

      pairBuffer = '';
      if (_result !== '') pairBuffer += ', ';

      if (state.condenseFlow) pairBuffer += '"';

      objectKey = objectKeyList[index];
      objectValue = object[objectKey];

      if (state.replacer) {
        objectValue = state.replacer.call(object, objectKey, objectValue);
      }

      if (!writeNode(state, level, objectKey, false, false)) {
        continue; // Skip this pair because of invalid key;
      }

      if (state.dump.length > 1024) pairBuffer += '? ';

      pairBuffer += state.dump + (state.condenseFlow ? '"' : '') + ':' + (state.condenseFlow ? '' : ' ');

      if (!writeNode(state, level, objectValue, false, false)) {
        continue; // Skip this pair because of invalid value.
      }

      pairBuffer += state.dump;

      // Both key and value are valid.
      _result += pairBuffer;
    }

    state.tag = _tag;
    state.dump = '{' + _result + '}';
  }

  function writeBlockMapping(state, level, object, compact) {
    var _result       = '',
        _tag          = state.tag,
        objectKeyList = Object.keys(object),
        index,
        length,
        objectKey,
        objectValue,
        explicitPair,
        pairBuffer;

    // Allow sorting keys so that the output file is deterministic
    if (state.sortKeys === true) {
      // Default sorting
      objectKeyList.sort();
    } else if (typeof state.sortKeys === 'function') {
      // Custom sort function
      objectKeyList.sort(state.sortKeys);
    } else if (state.sortKeys) {
      // Something is wrong
      throw new exception('sortKeys must be a boolean or a function');
    }

    for (index = 0, length = objectKeyList.length; index < length; index += 1) {
      pairBuffer = '';

      if (!compact || _result !== '') {
        pairBuffer += generateNextLine(state, level);
      }

      objectKey = objectKeyList[index];
      objectValue = object[objectKey];

      if (state.replacer) {
        objectValue = state.replacer.call(object, objectKey, objectValue);
      }

      if (!writeNode(state, level + 1, objectKey, true, true, true)) {
        continue; // Skip this pair because of invalid key.
      }

      explicitPair = (state.tag !== null && state.tag !== '?') ||
                     (state.dump && state.dump.length > 1024);

      if (explicitPair) {
        if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
          pairBuffer += '?';
        } else {
          pairBuffer += '? ';
        }
      }

      pairBuffer += state.dump;

      if (explicitPair) {
        pairBuffer += generateNextLine(state, level);
      }

      if (!writeNode(state, level + 1, objectValue, true, explicitPair)) {
        continue; // Skip this pair because of invalid value.
      }

      if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
        pairBuffer += ':';
      } else {
        pairBuffer += ': ';
      }

      pairBuffer += state.dump;

      // Both key and value are valid.
      _result += pairBuffer;
    }

    state.tag = _tag;
    state.dump = _result || '{}'; // Empty mapping if no valid pairs.
  }

  function detectType(state, object, explicit) {
    var _result, typeList, index, length, type, style;

    typeList = explicit ? state.explicitTypes : state.implicitTypes;

    for (index = 0, length = typeList.length; index < length; index += 1) {
      type = typeList[index];

      if ((type.instanceOf  || type.predicate) &&
          (!type.instanceOf || ((typeof object === 'object') && (object instanceof type.instanceOf))) &&
          (!type.predicate  || type.predicate(object))) {

        if (explicit) {
          if (type.multi && type.representName) {
            state.tag = type.representName(object);
          } else {
            state.tag = type.tag;
          }
        } else {
          state.tag = '?';
        }

        if (type.represent) {
          style = state.styleMap[type.tag] || type.defaultStyle;

          if (_toString.call(type.represent) === '[object Function]') {
            _result = type.represent(object, style);
          } else if (_hasOwnProperty.call(type.represent, style)) {
            _result = type.represent[style](object, style);
          } else {
            throw new exception('!<' + type.tag + '> tag resolver accepts not "' + style + '" style');
          }

          state.dump = _result;
        }

        return true;
      }
    }

    return false;
  }

  // Serializes `object` and writes it to global `result`.
  // Returns true on success, or false on invalid object.
  //
  function writeNode(state, level, object, block, compact, iskey, isblockseq) {
    state.tag = null;
    state.dump = object;

    if (!detectType(state, object, false)) {
      detectType(state, object, true);
    }

    var type = _toString.call(state.dump);
    var inblock = block;
    var tagStr;

    if (block) {
      block = (state.flowLevel < 0 || state.flowLevel > level);
    }

    var objectOrArray = type === '[object Object]' || type === '[object Array]',
        duplicateIndex,
        duplicate;

    if (objectOrArray) {
      duplicateIndex = state.duplicates.indexOf(object);
      duplicate = duplicateIndex !== -1;
    }

    if ((state.tag !== null && state.tag !== '?') || duplicate || (state.indent !== 2 && level > 0)) {
      compact = false;
    }

    if (duplicate && state.usedDuplicates[duplicateIndex]) {
      state.dump = '*ref_' + duplicateIndex;
    } else {
      if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {
        state.usedDuplicates[duplicateIndex] = true;
      }
      if (type === '[object Object]') {
        if (block && (Object.keys(state.dump).length !== 0)) {
          writeBlockMapping(state, level, state.dump, compact);
          if (duplicate) {
            state.dump = '&ref_' + duplicateIndex + state.dump;
          }
        } else {
          writeFlowMapping(state, level, state.dump);
          if (duplicate) {
            state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;
          }
        }
      } else if (type === '[object Array]') {
        if (block && (state.dump.length !== 0)) {
          if (state.noArrayIndent && !isblockseq && level > 0) {
            writeBlockSequence(state, level - 1, state.dump, compact);
          } else {
            writeBlockSequence(state, level, state.dump, compact);
          }
          if (duplicate) {
            state.dump = '&ref_' + duplicateIndex + state.dump;
          }
        } else {
          writeFlowSequence(state, level, state.dump);
          if (duplicate) {
            state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;
          }
        }
      } else if (type === '[object String]') {
        if (state.tag !== '?') {
          writeScalar(state, state.dump, level, iskey, inblock);
        }
      } else if (type === '[object Undefined]') {
        return false;
      } else {
        if (state.skipInvalid) return false;
        throw new exception('unacceptable kind of an object to dump ' + type);
      }

      if (state.tag !== null && state.tag !== '?') {
        // Need to encode all characters except those allowed by the spec:
        //
        // [35] ns-dec-digit    ::=  [#x30-#x39] /* 0-9 */
        // [36] ns-hex-digit    ::=  ns-dec-digit
        //                         | [#x41-#x46] /* A-F */ | [#x61-#x66] /* a-f */
        // [37] ns-ascii-letter ::=  [#x41-#x5A] /* A-Z */ | [#x61-#x7A] /* a-z */
        // [38] ns-word-char    ::=  ns-dec-digit | ns-ascii-letter | “-”
        // [39] ns-uri-char     ::=  “%” ns-hex-digit ns-hex-digit | ns-word-char | “#”
        //                         | “;” | “/” | “?” | “:” | “@” | “&” | “=” | “+” | “$” | “,”
        //                         | “_” | “.” | “!” | “~” | “*” | “'” | “(” | “)” | “[” | “]”
        //
        // Also need to encode '!' because it has special meaning (end of tag prefix).
        //
        tagStr = encodeURI(
          state.tag[0] === '!' ? state.tag.slice(1) : state.tag
        ).replace(/!/g, '%21');

        if (state.tag[0] === '!') {
          tagStr = '!' + tagStr;
        } else if (tagStr.slice(0, 18) === 'tag:yaml.org,2002:') {
          tagStr = '!!' + tagStr.slice(18);
        } else {
          tagStr = '!<' + tagStr + '>';
        }

        state.dump = tagStr + ' ' + state.dump;
      }
    }

    return true;
  }

  function getDuplicateReferences(object, state) {
    var objects = [],
        duplicatesIndexes = [],
        index,
        length;

    inspectNode(object, objects, duplicatesIndexes);

    for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {
      state.duplicates.push(objects[duplicatesIndexes[index]]);
    }
    state.usedDuplicates = new Array(length);
  }

  function inspectNode(object, objects, duplicatesIndexes) {
    var objectKeyList,
        index,
        length;

    if (object !== null && typeof object === 'object') {
      index = objects.indexOf(object);
      if (index !== -1) {
        if (duplicatesIndexes.indexOf(index) === -1) {
          duplicatesIndexes.push(index);
        }
      } else {
        objects.push(object);

        if (Array.isArray(object)) {
          for (index = 0, length = object.length; index < length; index += 1) {
            inspectNode(object[index], objects, duplicatesIndexes);
          }
        } else {
          objectKeyList = Object.keys(object);

          for (index = 0, length = objectKeyList.length; index < length; index += 1) {
            inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);
          }
        }
      }
    }
  }

  function dump$1(input, options) {
    options = options || {};

    var state = new State(options);

    if (!state.noRefs) getDuplicateReferences(input, state);

    var value = input;

    if (state.replacer) {
      value = state.replacer.call({ '': value }, '', value);
    }

    if (writeNode(state, 0, value, true, true)) return state.dump + '\n';

    return '';
  }

  var dump_1 = dump$1;

  var dumper = {
  	dump: dump_1
  };

  function renamed(from, to) {
    return function () {
      throw new Error('Function yaml.' + from + ' is removed in js-yaml 4. ' +
        'Use yaml.' + to + ' instead, which is now safe by default.');
    };
  }


  var Type                = type;
  var Schema              = schema;
  var FAILSAFE_SCHEMA     = failsafe;
  var JSON_SCHEMA         = json;
  var CORE_SCHEMA         = core;
  var DEFAULT_SCHEMA      = _default;
  var load                = loader.load;
  var loadAll             = loader.loadAll;
  var dump                = dumper.dump;
  var YAMLException       = exception;

  // Re-export all types in case user wants to create custom schema
  var types = {
    binary:    binary,
    float:     float,
    map:       map,
    null:      _null,
    pairs:     pairs,
    set:       set,
    timestamp: timestamp,
    bool:      bool,
    int:       int,
    merge:     merge,
    omap:      omap,
    seq:       seq,
    str:       str
  };

  // Removed functions from JS-YAML 3.0.x
  var safeLoad            = renamed('safeLoad', 'load');
  var safeLoadAll         = renamed('safeLoadAll', 'loadAll');
  var safeDump            = renamed('safeDump', 'dump');

  var jsYaml = {
  	Type: Type,
  	Schema: Schema,
  	FAILSAFE_SCHEMA: FAILSAFE_SCHEMA,
  	JSON_SCHEMA: JSON_SCHEMA,
  	CORE_SCHEMA: CORE_SCHEMA,
  	DEFAULT_SCHEMA: DEFAULT_SCHEMA,
  	load: load,
  	loadAll: loadAll,
  	dump: dump,
  	YAMLException: YAMLException,
  	types: types,
  	safeLoad: safeLoad,
  	safeLoadAll: safeLoadAll,
  	safeDump: safeDump
  };

  exports.CORE_SCHEMA = CORE_SCHEMA;
  exports.DEFAULT_SCHEMA = DEFAULT_SCHEMA;
  exports.FAILSAFE_SCHEMA = FAILSAFE_SCHEMA;
  exports.JSON_SCHEMA = JSON_SCHEMA;
  exports.Schema = Schema;
  exports.Type = Type;
  exports.YAMLException = YAMLException;
  exports.default = jsYaml;
  exports.dump = dump;
  exports.load = load;
  exports.loadAll = loadAll;
  exports.safeDump = safeDump;
  exports.safeLoad = safeLoad;
  exports.safeLoadAll = safeLoadAll;
  exports.types = types;

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

})));
/*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT */
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).jsyaml={})}(this,(function(e){"use strict";function t(e){return null==e}var n={isNothing:t,isObject:function(e){return"object"==typeof e&&null!==e},toArray:function(e){return Array.isArray(e)?e:t(e)?[]:[e]},repeat:function(e,t){var n,i="";for(n=0;n<t;n+=1)i+=e;return i},isNegativeZero:function(e){return 0===e&&Number.NEGATIVE_INFINITY===1/e},extend:function(e,t){var n,i,r,o;if(t)for(n=0,i=(o=Object.keys(t)).length;n<i;n+=1)e[r=o[n]]=t[r];return e}};function i(e,t){var n="",i=e.reason||"(unknown reason)";return e.mark?(e.mark.name&&(n+='in "'+e.mark.name+'" '),n+="("+(e.mark.line+1)+":"+(e.mark.column+1)+")",!t&&e.mark.snippet&&(n+="\n\n"+e.mark.snippet),i+" "+n):i}function r(e,t){Error.call(this),this.name="YAMLException",this.reason=e,this.mark=t,this.message=i(this,!1),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack||""}r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r.prototype.toString=function(e){return this.name+": "+i(this,e)};var o=r;function a(e,t,n,i,r){var o="",a="",l=Math.floor(r/2)-1;return i-t>l&&(t=i-l+(o=" ... ").length),n-i>l&&(n=i+l-(a=" ...").length),{str:o+e.slice(t,n).replace(/\t/g,"→")+a,pos:i-t+o.length}}function l(e,t){return n.repeat(" ",t-e.length)+e}var c=function(e,t){if(t=Object.create(t||null),!e.buffer)return null;t.maxLength||(t.maxLength=79),"number"!=typeof t.indent&&(t.indent=1),"number"!=typeof t.linesBefore&&(t.linesBefore=3),"number"!=typeof t.linesAfter&&(t.linesAfter=2);for(var i,r=/\r?\n|\r|\0/g,o=[0],c=[],s=-1;i=r.exec(e.buffer);)c.push(i.index),o.push(i.index+i[0].length),e.position<=i.index&&s<0&&(s=o.length-2);s<0&&(s=o.length-1);var u,p,f="",d=Math.min(e.line+t.linesAfter,c.length).toString().length,h=t.maxLength-(t.indent+d+3);for(u=1;u<=t.linesBefore&&!(s-u<0);u++)p=a(e.buffer,o[s-u],c[s-u],e.position-(o[s]-o[s-u]),h),f=n.repeat(" ",t.indent)+l((e.line-u+1).toString(),d)+" | "+p.str+"\n"+f;for(p=a(e.buffer,o[s],c[s],e.position,h),f+=n.repeat(" ",t.indent)+l((e.line+1).toString(),d)+" | "+p.str+"\n",f+=n.repeat("-",t.indent+d+3+p.pos)+"^\n",u=1;u<=t.linesAfter&&!(s+u>=c.length);u++)p=a(e.buffer,o[s+u],c[s+u],e.position-(o[s]-o[s+u]),h),f+=n.repeat(" ",t.indent)+l((e.line+u+1).toString(),d)+" | "+p.str+"\n";return f.replace(/\n$/,"")},s=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],u=["scalar","sequence","mapping"];var p=function(e,t){if(t=t||{},Object.keys(t).forEach((function(t){if(-1===s.indexOf(t))throw new o('Unknown option "'+t+'" is met in definition of "'+e+'" YAML type.')})),this.options=t,this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.representName=t.representName||null,this.defaultStyle=t.defaultStyle||null,this.multi=t.multi||!1,this.styleAliases=function(e){var t={};return null!==e&&Object.keys(e).forEach((function(n){e[n].forEach((function(e){t[String(e)]=n}))})),t}(t.styleAliases||null),-1===u.indexOf(this.kind))throw new o('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')};function f(e,t){var n=[];return e[t].forEach((function(e){var t=n.length;n.forEach((function(n,i){n.tag===e.tag&&n.kind===e.kind&&n.multi===e.multi&&(t=i)})),n[t]=e})),n}function d(e){return this.extend(e)}d.prototype.extend=function(e){var t=[],n=[];if(e instanceof p)n.push(e);else if(Array.isArray(e))n=n.concat(e);else{if(!e||!Array.isArray(e.implicit)&&!Array.isArray(e.explicit))throw new o("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");e.implicit&&(t=t.concat(e.implicit)),e.explicit&&(n=n.concat(e.explicit))}t.forEach((function(e){if(!(e instanceof p))throw new o("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(e.loadKind&&"scalar"!==e.loadKind)throw new o("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(e.multi)throw new o("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")})),n.forEach((function(e){if(!(e instanceof p))throw new o("Specified list of YAML types (or a single Type object) contains a non-Type object.")}));var i=Object.create(d.prototype);return i.implicit=(this.implicit||[]).concat(t),i.explicit=(this.explicit||[]).concat(n),i.compiledImplicit=f(i,"implicit"),i.compiledExplicit=f(i,"explicit"),i.compiledTypeMap=function(){var e,t,n={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}};function i(e){e.multi?(n.multi[e.kind].push(e),n.multi.fallback.push(e)):n[e.kind][e.tag]=n.fallback[e.tag]=e}for(e=0,t=arguments.length;e<t;e+=1)arguments[e].forEach(i);return n}(i.compiledImplicit,i.compiledExplicit),i};var h=d,g=new p("tag:yaml.org,2002:str",{kind:"scalar",construct:function(e){return null!==e?e:""}}),m=new p("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(e){return null!==e?e:[]}}),y=new p("tag:yaml.org,2002:map",{kind:"mapping",construct:function(e){return null!==e?e:{}}}),b=new h({explicit:[g,m,y]});var A=new p("tag:yaml.org,2002:null",{kind:"scalar",resolve:function(e){if(null===e)return!0;var t=e.length;return 1===t&&"~"===e||4===t&&("null"===e||"Null"===e||"NULL"===e)},construct:function(){return null},predicate:function(e){return null===e},represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"},empty:function(){return""}},defaultStyle:"lowercase"});var v=new p("tag:yaml.org,2002:bool",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t=e.length;return 4===t&&("true"===e||"True"===e||"TRUE"===e)||5===t&&("false"===e||"False"===e||"FALSE"===e)},construct:function(e){return"true"===e||"True"===e||"TRUE"===e},predicate:function(e){return"[object Boolean]"===Object.prototype.toString.call(e)},represent:{lowercase:function(e){return e?"true":"false"},uppercase:function(e){return e?"TRUE":"FALSE"},camelcase:function(e){return e?"True":"False"}},defaultStyle:"lowercase"});function w(e){return 48<=e&&e<=55}function k(e){return 48<=e&&e<=57}var C=new p("tag:yaml.org,2002:int",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t,n,i=e.length,r=0,o=!1;if(!i)return!1;if("-"!==(t=e[r])&&"+"!==t||(t=e[++r]),"0"===t){if(r+1===i)return!0;if("b"===(t=e[++r])){for(r++;r<i;r++)if("_"!==(t=e[r])){if("0"!==t&&"1"!==t)return!1;o=!0}return o&&"_"!==t}if("x"===t){for(r++;r<i;r++)if("_"!==(t=e[r])){if(!(48<=(n=e.charCodeAt(r))&&n<=57||65<=n&&n<=70||97<=n&&n<=102))return!1;o=!0}return o&&"_"!==t}if("o"===t){for(r++;r<i;r++)if("_"!==(t=e[r])){if(!w(e.charCodeAt(r)))return!1;o=!0}return o&&"_"!==t}}if("_"===t)return!1;for(;r<i;r++)if("_"!==(t=e[r])){if(!k(e.charCodeAt(r)))return!1;o=!0}return!(!o||"_"===t)},construct:function(e){var t,n=e,i=1;if(-1!==n.indexOf("_")&&(n=n.replace(/_/g,"")),"-"!==(t=n[0])&&"+"!==t||("-"===t&&(i=-1),t=(n=n.slice(1))[0]),"0"===n)return 0;if("0"===t){if("b"===n[1])return i*parseInt(n.slice(2),2);if("x"===n[1])return i*parseInt(n.slice(2),16);if("o"===n[1])return i*parseInt(n.slice(2),8)}return i*parseInt(n,10)},predicate:function(e){return"[object Number]"===Object.prototype.toString.call(e)&&e%1==0&&!n.isNegativeZero(e)},represent:{binary:function(e){return e>=0?"0b"+e.toString(2):"-0b"+e.toString(2).slice(1)},octal:function(e){return e>=0?"0o"+e.toString(8):"-0o"+e.toString(8).slice(1)},decimal:function(e){return e.toString(10)},hexadecimal:function(e){return e>=0?"0x"+e.toString(16).toUpperCase():"-0x"+e.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),x=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");var I=/^[-+]?[0-9]+e/;var S=new p("tag:yaml.org,2002:float",{kind:"scalar",resolve:function(e){return null!==e&&!(!x.test(e)||"_"===e[e.length-1])},construct:function(e){var t,n;return n="-"===(t=e.replace(/_/g,"").toLowerCase())[0]?-1:1,"+-".indexOf(t[0])>=0&&(t=t.slice(1)),".inf"===t?1===n?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===t?NaN:n*parseFloat(t,10)},predicate:function(e){return"[object Number]"===Object.prototype.toString.call(e)&&(e%1!=0||n.isNegativeZero(e))},represent:function(e,t){var i;if(isNaN(e))switch(t){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===e)switch(t){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===e)switch(t){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(n.isNegativeZero(e))return"-0.0";return i=e.toString(10),I.test(i)?i.replace("e",".e"):i},defaultStyle:"lowercase"}),O=b.extend({implicit:[A,v,C,S]}),j=O,T=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),N=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");var F=new p("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:function(e){return null!==e&&(null!==T.exec(e)||null!==N.exec(e))},construct:function(e){var t,n,i,r,o,a,l,c,s=0,u=null;if(null===(t=T.exec(e))&&(t=N.exec(e)),null===t)throw new Error("Date resolve error");if(n=+t[1],i=+t[2]-1,r=+t[3],!t[4])return new Date(Date.UTC(n,i,r));if(o=+t[4],a=+t[5],l=+t[6],t[7]){for(s=t[7].slice(0,3);s.length<3;)s+="0";s=+s}return t[9]&&(u=6e4*(60*+t[10]+ +(t[11]||0)),"-"===t[9]&&(u=-u)),c=new Date(Date.UTC(n,i,r,o,a,l,s)),u&&c.setTime(c.getTime()-u),c},instanceOf:Date,represent:function(e){return e.toISOString()}});var E=new p("tag:yaml.org,2002:merge",{kind:"scalar",resolve:function(e){return"<<"===e||null===e}}),M="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";var L=new p("tag:yaml.org,2002:binary",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t,n,i=0,r=e.length,o=M;for(n=0;n<r;n++)if(!((t=o.indexOf(e.charAt(n)))>64)){if(t<0)return!1;i+=6}return i%8==0},construct:function(e){var t,n,i=e.replace(/[\r\n=]/g,""),r=i.length,o=M,a=0,l=[];for(t=0;t<r;t++)t%4==0&&t&&(l.push(a>>16&255),l.push(a>>8&255),l.push(255&a)),a=a<<6|o.indexOf(i.charAt(t));return 0===(n=r%4*6)?(l.push(a>>16&255),l.push(a>>8&255),l.push(255&a)):18===n?(l.push(a>>10&255),l.push(a>>2&255)):12===n&&l.push(a>>4&255),new Uint8Array(l)},predicate:function(e){return"[object Uint8Array]"===Object.prototype.toString.call(e)},represent:function(e){var t,n,i="",r=0,o=e.length,a=M;for(t=0;t<o;t++)t%3==0&&t&&(i+=a[r>>18&63],i+=a[r>>12&63],i+=a[r>>6&63],i+=a[63&r]),r=(r<<8)+e[t];return 0===(n=o%3)?(i+=a[r>>18&63],i+=a[r>>12&63],i+=a[r>>6&63],i+=a[63&r]):2===n?(i+=a[r>>10&63],i+=a[r>>4&63],i+=a[r<<2&63],i+=a[64]):1===n&&(i+=a[r>>2&63],i+=a[r<<4&63],i+=a[64],i+=a[64]),i}}),_=Object.prototype.hasOwnProperty,D=Object.prototype.toString;var U=new p("tag:yaml.org,2002:omap",{kind:"sequence",resolve:function(e){if(null===e)return!0;var t,n,i,r,o,a=[],l=e;for(t=0,n=l.length;t<n;t+=1){if(i=l[t],o=!1,"[object Object]"!==D.call(i))return!1;for(r in i)if(_.call(i,r)){if(o)return!1;o=!0}if(!o)return!1;if(-1!==a.indexOf(r))return!1;a.push(r)}return!0},construct:function(e){return null!==e?e:[]}}),q=Object.prototype.toString;var Y=new p("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:function(e){if(null===e)return!0;var t,n,i,r,o,a=e;for(o=new Array(a.length),t=0,n=a.length;t<n;t+=1){if(i=a[t],"[object Object]"!==q.call(i))return!1;if(1!==(r=Object.keys(i)).length)return!1;o[t]=[r[0],i[r[0]]]}return!0},construct:function(e){if(null===e)return[];var t,n,i,r,o,a=e;for(o=new Array(a.length),t=0,n=a.length;t<n;t+=1)i=a[t],r=Object.keys(i),o[t]=[r[0],i[r[0]]];return o}}),R=Object.prototype.hasOwnProperty;var B=new p("tag:yaml.org,2002:set",{kind:"mapping",resolve:function(e){if(null===e)return!0;var t,n=e;for(t in n)if(R.call(n,t)&&null!==n[t])return!1;return!0},construct:function(e){return null!==e?e:{}}}),K=j.extend({implicit:[F,E],explicit:[L,U,Y,B]}),P=Object.prototype.hasOwnProperty,W=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,H=/[\x85\u2028\u2029]/,$=/[,\[\]\{\}]/,G=/^(?:!|!!|![a-z\-]+!)$/i,V=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function Z(e){return Object.prototype.toString.call(e)}function J(e){return 10===e||13===e}function Q(e){return 9===e||32===e}function z(e){return 9===e||32===e||10===e||13===e}function X(e){return 44===e||91===e||93===e||123===e||125===e}function ee(e){var t;return 48<=e&&e<=57?e-48:97<=(t=32|e)&&t<=102?t-97+10:-1}function te(e){return 48===e?"\0":97===e?"":98===e?"\b":116===e||9===e?"\t":110===e?"\n":118===e?"\v":102===e?"\f":114===e?"\r":101===e?"":32===e?" ":34===e?'"':47===e?"/":92===e?"\\":78===e?"":95===e?" ":76===e?"\u2028":80===e?"\u2029":""}function ne(e){return e<=65535?String.fromCharCode(e):String.fromCharCode(55296+(e-65536>>10),56320+(e-65536&1023))}for(var ie=new Array(256),re=new Array(256),oe=0;oe<256;oe++)ie[oe]=te(oe)?1:0,re[oe]=te(oe);function ae(e,t){this.input=e,this.filename=t.filename||null,this.schema=t.schema||K,this.onWarning=t.onWarning||null,this.legacy=t.legacy||!1,this.json=t.json||!1,this.listener=t.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function le(e,t){var n={name:e.filename,buffer:e.input.slice(0,-1),position:e.position,line:e.line,column:e.position-e.lineStart};return n.snippet=c(n),new o(t,n)}function ce(e,t){throw le(e,t)}function se(e,t){e.onWarning&&e.onWarning.call(null,le(e,t))}var ue={YAML:function(e,t,n){var i,r,o;null!==e.version&&ce(e,"duplication of %YAML directive"),1!==n.length&&ce(e,"YAML directive accepts exactly one argument"),null===(i=/^([0-9]+)\.([0-9]+)$/.exec(n[0]))&&ce(e,"ill-formed argument of the YAML directive"),r=parseInt(i[1],10),o=parseInt(i[2],10),1!==r&&ce(e,"unacceptable YAML version of the document"),e.version=n[0],e.checkLineBreaks=o<2,1!==o&&2!==o&&se(e,"unsupported YAML version of the document")},TAG:function(e,t,n){var i,r;2!==n.length&&ce(e,"TAG directive accepts exactly two arguments"),i=n[0],r=n[1],G.test(i)||ce(e,"ill-formed tag handle (first argument) of the TAG directive"),P.call(e.tagMap,i)&&ce(e,'there is a previously declared suffix for "'+i+'" tag handle'),V.test(r)||ce(e,"ill-formed tag prefix (second argument) of the TAG directive");try{r=decodeURIComponent(r)}catch(t){ce(e,"tag prefix is malformed: "+r)}e.tagMap[i]=r}};function pe(e,t,n,i){var r,o,a,l;if(t<n){if(l=e.input.slice(t,n),i)for(r=0,o=l.length;r<o;r+=1)9===(a=l.charCodeAt(r))||32<=a&&a<=1114111||ce(e,"expected valid JSON character");else W.test(l)&&ce(e,"the stream contains non-printable characters");e.result+=l}}function fe(e,t,i,r){var o,a,l,c;for(n.isObject(i)||ce(e,"cannot merge mappings; the provided source object is unacceptable"),l=0,c=(o=Object.keys(i)).length;l<c;l+=1)a=o[l],P.call(t,a)||(t[a]=i[a],r[a]=!0)}function de(e,t,n,i,r,o,a,l,c){var s,u;if(Array.isArray(r))for(s=0,u=(r=Array.prototype.slice.call(r)).length;s<u;s+=1)Array.isArray(r[s])&&ce(e,"nested arrays are not supported inside keys"),"object"==typeof r&&"[object Object]"===Z(r[s])&&(r[s]="[object Object]");if("object"==typeof r&&"[object Object]"===Z(r)&&(r="[object Object]"),r=String(r),null===t&&(t={}),"tag:yaml.org,2002:merge"===i)if(Array.isArray(o))for(s=0,u=o.length;s<u;s+=1)fe(e,t,o[s],n);else fe(e,t,o,n);else e.json||P.call(n,r)||!P.call(t,r)||(e.line=a||e.line,e.lineStart=l||e.lineStart,e.position=c||e.position,ce(e,"duplicated mapping key")),"__proto__"===r?Object.defineProperty(t,r,{configurable:!0,enumerable:!0,writable:!0,value:o}):t[r]=o,delete n[r];return t}function he(e){var t;10===(t=e.input.charCodeAt(e.position))?e.position++:13===t?(e.position++,10===e.input.charCodeAt(e.position)&&e.position++):ce(e,"a line break is expected"),e.line+=1,e.lineStart=e.position,e.firstTabInLine=-1}function ge(e,t,n){for(var i=0,r=e.input.charCodeAt(e.position);0!==r;){for(;Q(r);)9===r&&-1===e.firstTabInLine&&(e.firstTabInLine=e.position),r=e.input.charCodeAt(++e.position);if(t&&35===r)do{r=e.input.charCodeAt(++e.position)}while(10!==r&&13!==r&&0!==r);if(!J(r))break;for(he(e),r=e.input.charCodeAt(e.position),i++,e.lineIndent=0;32===r;)e.lineIndent++,r=e.input.charCodeAt(++e.position)}return-1!==n&&0!==i&&e.lineIndent<n&&se(e,"deficient indentation"),i}function me(e){var t,n=e.position;return!(45!==(t=e.input.charCodeAt(n))&&46!==t||t!==e.input.charCodeAt(n+1)||t!==e.input.charCodeAt(n+2)||(n+=3,0!==(t=e.input.charCodeAt(n))&&!z(t)))}function ye(e,t){1===t?e.result+=" ":t>1&&(e.result+=n.repeat("\n",t-1))}function be(e,t){var n,i,r=e.tag,o=e.anchor,a=[],l=!1;if(-1!==e.firstTabInLine)return!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=a),i=e.input.charCodeAt(e.position);0!==i&&(-1!==e.firstTabInLine&&(e.position=e.firstTabInLine,ce(e,"tab characters must not be used in indentation")),45===i)&&z(e.input.charCodeAt(e.position+1));)if(l=!0,e.position++,ge(e,!0,-1)&&e.lineIndent<=t)a.push(null),i=e.input.charCodeAt(e.position);else if(n=e.line,we(e,t,3,!1,!0),a.push(e.result),ge(e,!0,-1),i=e.input.charCodeAt(e.position),(e.line===n||e.lineIndent>t)&&0!==i)ce(e,"bad indentation of a sequence entry");else if(e.lineIndent<t)break;return!!l&&(e.tag=r,e.anchor=o,e.kind="sequence",e.result=a,!0)}function Ae(e){var t,n,i,r,o=!1,a=!1;if(33!==(r=e.input.charCodeAt(e.position)))return!1;if(null!==e.tag&&ce(e,"duplication of a tag property"),60===(r=e.input.charCodeAt(++e.position))?(o=!0,r=e.input.charCodeAt(++e.position)):33===r?(a=!0,n="!!",r=e.input.charCodeAt(++e.position)):n="!",t=e.position,o){do{r=e.input.charCodeAt(++e.position)}while(0!==r&&62!==r);e.position<e.length?(i=e.input.slice(t,e.position),r=e.input.charCodeAt(++e.position)):ce(e,"unexpected end of the stream within a verbatim tag")}else{for(;0!==r&&!z(r);)33===r&&(a?ce(e,"tag suffix cannot contain exclamation marks"):(n=e.input.slice(t-1,e.position+1),G.test(n)||ce(e,"named tag handle cannot contain such characters"),a=!0,t=e.position+1)),r=e.input.charCodeAt(++e.position);i=e.input.slice(t,e.position),$.test(i)&&ce(e,"tag suffix cannot contain flow indicator characters")}i&&!V.test(i)&&ce(e,"tag name cannot contain such characters: "+i);try{i=decodeURIComponent(i)}catch(t){ce(e,"tag name is malformed: "+i)}return o?e.tag=i:P.call(e.tagMap,n)?e.tag=e.tagMap[n]+i:"!"===n?e.tag="!"+i:"!!"===n?e.tag="tag:yaml.org,2002:"+i:ce(e,'undeclared tag handle "'+n+'"'),!0}function ve(e){var t,n;if(38!==(n=e.input.charCodeAt(e.position)))return!1;for(null!==e.anchor&&ce(e,"duplication of an anchor property"),n=e.input.charCodeAt(++e.position),t=e.position;0!==n&&!z(n)&&!X(n);)n=e.input.charCodeAt(++e.position);return e.position===t&&ce(e,"name of an anchor node must contain at least one character"),e.anchor=e.input.slice(t,e.position),!0}function we(e,t,i,r,o){var a,l,c,s,u,p,f,d,h,g=1,m=!1,y=!1;if(null!==e.listener&&e.listener("open",e),e.tag=null,e.anchor=null,e.kind=null,e.result=null,a=l=c=4===i||3===i,r&&ge(e,!0,-1)&&(m=!0,e.lineIndent>t?g=1:e.lineIndent===t?g=0:e.lineIndent<t&&(g=-1)),1===g)for(;Ae(e)||ve(e);)ge(e,!0,-1)?(m=!0,c=a,e.lineIndent>t?g=1:e.lineIndent===t?g=0:e.lineIndent<t&&(g=-1)):c=!1;if(c&&(c=m||o),1!==g&&4!==i||(d=1===i||2===i?t:t+1,h=e.position-e.lineStart,1===g?c&&(be(e,h)||function(e,t,n){var i,r,o,a,l,c,s,u=e.tag,p=e.anchor,f={},d=Object.create(null),h=null,g=null,m=null,y=!1,b=!1;if(-1!==e.firstTabInLine)return!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=f),s=e.input.charCodeAt(e.position);0!==s;){if(y||-1===e.firstTabInLine||(e.position=e.firstTabInLine,ce(e,"tab characters must not be used in indentation")),i=e.input.charCodeAt(e.position+1),o=e.line,63!==s&&58!==s||!z(i)){if(a=e.line,l=e.lineStart,c=e.position,!we(e,n,2,!1,!0))break;if(e.line===o){for(s=e.input.charCodeAt(e.position);Q(s);)s=e.input.charCodeAt(++e.position);if(58===s)z(s=e.input.charCodeAt(++e.position))||ce(e,"a whitespace character is expected after the key-value separator within a block mapping"),y&&(de(e,f,d,h,g,null,a,l,c),h=g=m=null),b=!0,y=!1,r=!1,h=e.tag,g=e.result;else{if(!b)return e.tag=u,e.anchor=p,!0;ce(e,"can not read an implicit mapping pair; a colon is missed")}}else{if(!b)return e.tag=u,e.anchor=p,!0;ce(e,"can not read a block mapping entry; a multiline key may not be an implicit key")}}else 63===s?(y&&(de(e,f,d,h,g,null,a,l,c),h=g=m=null),b=!0,y=!0,r=!0):y?(y=!1,r=!0):ce(e,"incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line"),e.position+=1,s=i;if((e.line===o||e.lineIndent>t)&&(y&&(a=e.line,l=e.lineStart,c=e.position),we(e,t,4,!0,r)&&(y?g=e.result:m=e.result),y||(de(e,f,d,h,g,m,a,l,c),h=g=m=null),ge(e,!0,-1),s=e.input.charCodeAt(e.position)),(e.line===o||e.lineIndent>t)&&0!==s)ce(e,"bad indentation of a mapping entry");else if(e.lineIndent<t)break}return y&&de(e,f,d,h,g,null,a,l,c),b&&(e.tag=u,e.anchor=p,e.kind="mapping",e.result=f),b}(e,h,d))||function(e,t){var n,i,r,o,a,l,c,s,u,p,f,d,h=!0,g=e.tag,m=e.anchor,y=Object.create(null);if(91===(d=e.input.charCodeAt(e.position)))a=93,s=!1,o=[];else{if(123!==d)return!1;a=125,s=!0,o={}}for(null!==e.anchor&&(e.anchorMap[e.anchor]=o),d=e.input.charCodeAt(++e.position);0!==d;){if(ge(e,!0,t),(d=e.input.charCodeAt(e.position))===a)return e.position++,e.tag=g,e.anchor=m,e.kind=s?"mapping":"sequence",e.result=o,!0;h?44===d&&ce(e,"expected the node content, but found ','"):ce(e,"missed comma between flow collection entries"),f=null,l=c=!1,63===d&&z(e.input.charCodeAt(e.position+1))&&(l=c=!0,e.position++,ge(e,!0,t)),n=e.line,i=e.lineStart,r=e.position,we(e,t,1,!1,!0),p=e.tag,u=e.result,ge(e,!0,t),d=e.input.charCodeAt(e.position),!c&&e.line!==n||58!==d||(l=!0,d=e.input.charCodeAt(++e.position),ge(e,!0,t),we(e,t,1,!1,!0),f=e.result),s?de(e,o,y,p,u,f,n,i,r):l?o.push(de(e,null,y,p,u,f,n,i,r)):o.push(u),ge(e,!0,t),44===(d=e.input.charCodeAt(e.position))?(h=!0,d=e.input.charCodeAt(++e.position)):h=!1}ce(e,"unexpected end of the stream within a flow collection")}(e,d)?y=!0:(l&&function(e,t){var i,r,o,a,l,c=1,s=!1,u=!1,p=t,f=0,d=!1;if(124===(a=e.input.charCodeAt(e.position)))r=!1;else{if(62!==a)return!1;r=!0}for(e.kind="scalar",e.result="";0!==a;)if(43===(a=e.input.charCodeAt(++e.position))||45===a)1===c?c=43===a?3:2:ce(e,"repeat of a chomping mode identifier");else{if(!((o=48<=(l=a)&&l<=57?l-48:-1)>=0))break;0===o?ce(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):u?ce(e,"repeat of an indentation width identifier"):(p=t+o-1,u=!0)}if(Q(a)){do{a=e.input.charCodeAt(++e.position)}while(Q(a));if(35===a)do{a=e.input.charCodeAt(++e.position)}while(!J(a)&&0!==a)}for(;0!==a;){for(he(e),e.lineIndent=0,a=e.input.charCodeAt(e.position);(!u||e.lineIndent<p)&&32===a;)e.lineIndent++,a=e.input.charCodeAt(++e.position);if(!u&&e.lineIndent>p&&(p=e.lineIndent),J(a))f++;else{if(e.lineIndent<p){3===c?e.result+=n.repeat("\n",s?1+f:f):1===c&&s&&(e.result+="\n");break}for(r?Q(a)?(d=!0,e.result+=n.repeat("\n",s?1+f:f)):d?(d=!1,e.result+=n.repeat("\n",f+1)):0===f?s&&(e.result+=" "):e.result+=n.repeat("\n",f):e.result+=n.repeat("\n",s?1+f:f),s=!0,u=!0,f=0,i=e.position;!J(a)&&0!==a;)a=e.input.charCodeAt(++e.position);pe(e,i,e.position,!1)}}return!0}(e,d)||function(e,t){var n,i,r;if(39!==(n=e.input.charCodeAt(e.position)))return!1;for(e.kind="scalar",e.result="",e.position++,i=r=e.position;0!==(n=e.input.charCodeAt(e.position));)if(39===n){if(pe(e,i,e.position,!0),39!==(n=e.input.charCodeAt(++e.position)))return!0;i=e.position,e.position++,r=e.position}else J(n)?(pe(e,i,r,!0),ye(e,ge(e,!1,t)),i=r=e.position):e.position===e.lineStart&&me(e)?ce(e,"unexpected end of the document within a single quoted scalar"):(e.position++,r=e.position);ce(e,"unexpected end of the stream within a single quoted scalar")}(e,d)||function(e,t){var n,i,r,o,a,l,c;if(34!==(l=e.input.charCodeAt(e.position)))return!1;for(e.kind="scalar",e.result="",e.position++,n=i=e.position;0!==(l=e.input.charCodeAt(e.position));){if(34===l)return pe(e,n,e.position,!0),e.position++,!0;if(92===l){if(pe(e,n,e.position,!0),J(l=e.input.charCodeAt(++e.position)))ge(e,!1,t);else if(l<256&&ie[l])e.result+=re[l],e.position++;else if((a=120===(c=l)?2:117===c?4:85===c?8:0)>0){for(r=a,o=0;r>0;r--)(a=ee(l=e.input.charCodeAt(++e.position)))>=0?o=(o<<4)+a:ce(e,"expected hexadecimal character");e.result+=ne(o),e.position++}else ce(e,"unknown escape sequence");n=i=e.position}else J(l)?(pe(e,n,i,!0),ye(e,ge(e,!1,t)),n=i=e.position):e.position===e.lineStart&&me(e)?ce(e,"unexpected end of the document within a double quoted scalar"):(e.position++,i=e.position)}ce(e,"unexpected end of the stream within a double quoted scalar")}(e,d)?y=!0:!function(e){var t,n,i;if(42!==(i=e.input.charCodeAt(e.position)))return!1;for(i=e.input.charCodeAt(++e.position),t=e.position;0!==i&&!z(i)&&!X(i);)i=e.input.charCodeAt(++e.position);return e.position===t&&ce(e,"name of an alias node must contain at least one character"),n=e.input.slice(t,e.position),P.call(e.anchorMap,n)||ce(e,'unidentified alias "'+n+'"'),e.result=e.anchorMap[n],ge(e,!0,-1),!0}(e)?function(e,t,n){var i,r,o,a,l,c,s,u,p=e.kind,f=e.result;if(z(u=e.input.charCodeAt(e.position))||X(u)||35===u||38===u||42===u||33===u||124===u||62===u||39===u||34===u||37===u||64===u||96===u)return!1;if((63===u||45===u)&&(z(i=e.input.charCodeAt(e.position+1))||n&&X(i)))return!1;for(e.kind="scalar",e.result="",r=o=e.position,a=!1;0!==u;){if(58===u){if(z(i=e.input.charCodeAt(e.position+1))||n&&X(i))break}else if(35===u){if(z(e.input.charCodeAt(e.position-1)))break}else{if(e.position===e.lineStart&&me(e)||n&&X(u))break;if(J(u)){if(l=e.line,c=e.lineStart,s=e.lineIndent,ge(e,!1,-1),e.lineIndent>=t){a=!0,u=e.input.charCodeAt(e.position);continue}e.position=o,e.line=l,e.lineStart=c,e.lineIndent=s;break}}a&&(pe(e,r,o,!1),ye(e,e.line-l),r=o=e.position,a=!1),Q(u)||(o=e.position+1),u=e.input.charCodeAt(++e.position)}return pe(e,r,o,!1),!!e.result||(e.kind=p,e.result=f,!1)}(e,d,1===i)&&(y=!0,null===e.tag&&(e.tag="?")):(y=!0,null===e.tag&&null===e.anchor||ce(e,"alias node should not have any properties")),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):0===g&&(y=c&&be(e,h))),null===e.tag)null!==e.anchor&&(e.anchorMap[e.anchor]=e.result);else if("?"===e.tag){for(null!==e.result&&"scalar"!==e.kind&&ce(e,'unacceptable node kind for !<?> tag; it should be "scalar", not "'+e.kind+'"'),s=0,u=e.implicitTypes.length;s<u;s+=1)if((f=e.implicitTypes[s]).resolve(e.result)){e.result=f.construct(e.result),e.tag=f.tag,null!==e.anchor&&(e.anchorMap[e.anchor]=e.result);break}}else if("!"!==e.tag){if(P.call(e.typeMap[e.kind||"fallback"],e.tag))f=e.typeMap[e.kind||"fallback"][e.tag];else for(f=null,s=0,u=(p=e.typeMap.multi[e.kind||"fallback"]).length;s<u;s+=1)if(e.tag.slice(0,p[s].tag.length)===p[s].tag){f=p[s];break}f||ce(e,"unknown tag !<"+e.tag+">"),null!==e.result&&f.kind!==e.kind&&ce(e,"unacceptable node kind for !<"+e.tag+'> tag; it should be "'+f.kind+'", not "'+e.kind+'"'),f.resolve(e.result,e.tag)?(e.result=f.construct(e.result,e.tag),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):ce(e,"cannot resolve a node with !<"+e.tag+"> explicit tag")}return null!==e.listener&&e.listener("close",e),null!==e.tag||null!==e.anchor||y}function ke(e){var t,n,i,r,o=e.position,a=!1;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap=Object.create(null),e.anchorMap=Object.create(null);0!==(r=e.input.charCodeAt(e.position))&&(ge(e,!0,-1),r=e.input.charCodeAt(e.position),!(e.lineIndent>0||37!==r));){for(a=!0,r=e.input.charCodeAt(++e.position),t=e.position;0!==r&&!z(r);)r=e.input.charCodeAt(++e.position);for(i=[],(n=e.input.slice(t,e.position)).length<1&&ce(e,"directive name must not be less than one character in length");0!==r;){for(;Q(r);)r=e.input.charCodeAt(++e.position);if(35===r){do{r=e.input.charCodeAt(++e.position)}while(0!==r&&!J(r));break}if(J(r))break;for(t=e.position;0!==r&&!z(r);)r=e.input.charCodeAt(++e.position);i.push(e.input.slice(t,e.position))}0!==r&&he(e),P.call(ue,n)?ue[n](e,n,i):se(e,'unknown document directive "'+n+'"')}ge(e,!0,-1),0===e.lineIndent&&45===e.input.charCodeAt(e.position)&&45===e.input.charCodeAt(e.position+1)&&45===e.input.charCodeAt(e.position+2)?(e.position+=3,ge(e,!0,-1)):a&&ce(e,"directives end mark is expected"),we(e,e.lineIndent-1,4,!1,!0),ge(e,!0,-1),e.checkLineBreaks&&H.test(e.input.slice(o,e.position))&&se(e,"non-ASCII line breaks are interpreted as content"),e.documents.push(e.result),e.position===e.lineStart&&me(e)?46===e.input.charCodeAt(e.position)&&(e.position+=3,ge(e,!0,-1)):e.position<e.length-1&&ce(e,"end of the stream or a document separator is expected")}function Ce(e,t){t=t||{},0!==(e=String(e)).length&&(10!==e.charCodeAt(e.length-1)&&13!==e.charCodeAt(e.length-1)&&(e+="\n"),65279===e.charCodeAt(0)&&(e=e.slice(1)));var n=new ae(e,t),i=e.indexOf("\0");for(-1!==i&&(n.position=i,ce(n,"null byte is not allowed in input")),n.input+="\0";32===n.input.charCodeAt(n.position);)n.lineIndent+=1,n.position+=1;for(;n.position<n.length-1;)ke(n);return n.documents}var xe={loadAll:function(e,t,n){null!==t&&"object"==typeof t&&void 0===n&&(n=t,t=null);var i=Ce(e,n);if("function"!=typeof t)return i;for(var r=0,o=i.length;r<o;r+=1)t(i[r])},load:function(e,t){var n=Ce(e,t);if(0!==n.length){if(1===n.length)return n[0];throw new o("expected a single document in the stream, but found more")}}},Ie=Object.prototype.toString,Se=Object.prototype.hasOwnProperty,Oe=65279,je={0:"\\0",7:"\\a",8:"\\b",9:"\\t",10:"\\n",11:"\\v",12:"\\f",13:"\\r",27:"\\e",34:'\\"',92:"\\\\",133:"\\N",160:"\\_",8232:"\\L",8233:"\\P"},Te=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"],Ne=/^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/;function Fe(e){var t,i,r;if(t=e.toString(16).toUpperCase(),e<=255)i="x",r=2;else if(e<=65535)i="u",r=4;else{if(!(e<=4294967295))throw new o("code point within a string may not be greater than 0xFFFFFFFF");i="U",r=8}return"\\"+i+n.repeat("0",r-t.length)+t}function Ee(e){this.schema=e.schema||K,this.indent=Math.max(1,e.indent||2),this.noArrayIndent=e.noArrayIndent||!1,this.skipInvalid=e.skipInvalid||!1,this.flowLevel=n.isNothing(e.flowLevel)?-1:e.flowLevel,this.styleMap=function(e,t){var n,i,r,o,a,l,c;if(null===t)return{};for(n={},r=0,o=(i=Object.keys(t)).length;r<o;r+=1)a=i[r],l=String(t[a]),"!!"===a.slice(0,2)&&(a="tag:yaml.org,2002:"+a.slice(2)),(c=e.compiledTypeMap.fallback[a])&&Se.call(c.styleAliases,l)&&(l=c.styleAliases[l]),n[a]=l;return n}(this.schema,e.styles||null),this.sortKeys=e.sortKeys||!1,this.lineWidth=e.lineWidth||80,this.noRefs=e.noRefs||!1,this.noCompatMode=e.noCompatMode||!1,this.condenseFlow=e.condenseFlow||!1,this.quotingType='"'===e.quotingType?2:1,this.forceQuotes=e.forceQuotes||!1,this.replacer="function"==typeof e.replacer?e.replacer:null,this.implicitTypes=this.schema.compiledImplicit,this.explicitTypes=this.schema.compiledExplicit,this.tag=null,this.result="",this.duplicates=[],this.usedDuplicates=null}function Me(e,t){for(var i,r=n.repeat(" ",t),o=0,a=-1,l="",c=e.length;o<c;)-1===(a=e.indexOf("\n",o))?(i=e.slice(o),o=c):(i=e.slice(o,a+1),o=a+1),i.length&&"\n"!==i&&(l+=r),l+=i;return l}function Le(e,t){return"\n"+n.repeat(" ",e.indent*t)}function _e(e){return 32===e||9===e}function De(e){return 32<=e&&e<=126||161<=e&&e<=55295&&8232!==e&&8233!==e||57344<=e&&e<=65533&&e!==Oe||65536<=e&&e<=1114111}function Ue(e){return De(e)&&e!==Oe&&13!==e&&10!==e}function qe(e,t,n){var i=Ue(e),r=i&&!_e(e);return(n?i:i&&44!==e&&91!==e&&93!==e&&123!==e&&125!==e)&&35!==e&&!(58===t&&!r)||Ue(t)&&!_e(t)&&35===e||58===t&&r}function Ye(e,t){var n,i=e.charCodeAt(t);return i>=55296&&i<=56319&&t+1<e.length&&(n=e.charCodeAt(t+1))>=56320&&n<=57343?1024*(i-55296)+n-56320+65536:i}function Re(e){return/^\n* /.test(e)}function Be(e,t,n,i,r,o,a,l){var c,s,u=0,p=null,f=!1,d=!1,h=-1!==i,g=-1,m=De(s=Ye(e,0))&&s!==Oe&&!_e(s)&&45!==s&&63!==s&&58!==s&&44!==s&&91!==s&&93!==s&&123!==s&&125!==s&&35!==s&&38!==s&&42!==s&&33!==s&&124!==s&&61!==s&&62!==s&&39!==s&&34!==s&&37!==s&&64!==s&&96!==s&&function(e){return!_e(e)&&58!==e}(Ye(e,e.length-1));if(t||a)for(c=0;c<e.length;u>=65536?c+=2:c++){if(!De(u=Ye(e,c)))return 5;m=m&&qe(u,p,l),p=u}else{for(c=0;c<e.length;u>=65536?c+=2:c++){if(10===(u=Ye(e,c)))f=!0,h&&(d=d||c-g-1>i&&" "!==e[g+1],g=c);else if(!De(u))return 5;m=m&&qe(u,p,l),p=u}d=d||h&&c-g-1>i&&" "!==e[g+1]}return f||d?n>9&&Re(e)?5:a?2===o?5:2:d?4:3:!m||a||r(e)?2===o?5:2:1}function Ke(e,t,n,i,r){e.dump=function(){if(0===t.length)return 2===e.quotingType?'""':"''";if(!e.noCompatMode&&(-1!==Te.indexOf(t)||Ne.test(t)))return 2===e.quotingType?'"'+t+'"':"'"+t+"'";var a=e.indent*Math.max(1,n),l=-1===e.lineWidth?-1:Math.max(Math.min(e.lineWidth,40),e.lineWidth-a),c=i||e.flowLevel>-1&&n>=e.flowLevel;switch(Be(t,c,e.indent,l,(function(t){return function(e,t){var n,i;for(n=0,i=e.implicitTypes.length;n<i;n+=1)if(e.implicitTypes[n].resolve(t))return!0;return!1}(e,t)}),e.quotingType,e.forceQuotes&&!i,r)){case 1:return t;case 2:return"'"+t.replace(/'/g,"''")+"'";case 3:return"|"+Pe(t,e.indent)+We(Me(t,a));case 4:return">"+Pe(t,e.indent)+We(Me(function(e,t){var n,i,r=/(\n+)([^\n]*)/g,o=(l=e.indexOf("\n"),l=-1!==l?l:e.length,r.lastIndex=l,He(e.slice(0,l),t)),a="\n"===e[0]||" "===e[0];var l;for(;i=r.exec(e);){var c=i[1],s=i[2];n=" "===s[0],o+=c+(a||n||""===s?"":"\n")+He(s,t),a=n}return o}(t,l),a));case 5:return'"'+function(e){for(var t,n="",i=0,r=0;r<e.length;i>=65536?r+=2:r++)i=Ye(e,r),!(t=je[i])&&De(i)?(n+=e[r],i>=65536&&(n+=e[r+1])):n+=t||Fe(i);return n}(t)+'"';default:throw new o("impossible error: invalid scalar style")}}()}function Pe(e,t){var n=Re(e)?String(t):"",i="\n"===e[e.length-1];return n+(i&&("\n"===e[e.length-2]||"\n"===e)?"+":i?"":"-")+"\n"}function We(e){return"\n"===e[e.length-1]?e.slice(0,-1):e}function He(e,t){if(""===e||" "===e[0])return e;for(var n,i,r=/ [^ ]/g,o=0,a=0,l=0,c="";n=r.exec(e);)(l=n.index)-o>t&&(i=a>o?a:l,c+="\n"+e.slice(o,i),o=i+1),a=l;return c+="\n",e.length-o>t&&a>o?c+=e.slice(o,a)+"\n"+e.slice(a+1):c+=e.slice(o),c.slice(1)}function $e(e,t,n,i){var r,o,a,l="",c=e.tag;for(r=0,o=n.length;r<o;r+=1)a=n[r],e.replacer&&(a=e.replacer.call(n,String(r),a)),(Ve(e,t+1,a,!0,!0,!1,!0)||void 0===a&&Ve(e,t+1,null,!0,!0,!1,!0))&&(i&&""===l||(l+=Le(e,t)),e.dump&&10===e.dump.charCodeAt(0)?l+="-":l+="- ",l+=e.dump);e.tag=c,e.dump=l||"[]"}function Ge(e,t,n){var i,r,a,l,c,s;for(a=0,l=(r=n?e.explicitTypes:e.implicitTypes).length;a<l;a+=1)if(((c=r[a]).instanceOf||c.predicate)&&(!c.instanceOf||"object"==typeof t&&t instanceof c.instanceOf)&&(!c.predicate||c.predicate(t))){if(n?c.multi&&c.representName?e.tag=c.representName(t):e.tag=c.tag:e.tag="?",c.represent){if(s=e.styleMap[c.tag]||c.defaultStyle,"[object Function]"===Ie.call(c.represent))i=c.represent(t,s);else{if(!Se.call(c.represent,s))throw new o("!<"+c.tag+'> tag resolver accepts not "'+s+'" style');i=c.represent[s](t,s)}e.dump=i}return!0}return!1}function Ve(e,t,n,i,r,a,l){e.tag=null,e.dump=n,Ge(e,n,!1)||Ge(e,n,!0);var c,s=Ie.call(e.dump),u=i;i&&(i=e.flowLevel<0||e.flowLevel>t);var p,f,d="[object Object]"===s||"[object Array]"===s;if(d&&(f=-1!==(p=e.duplicates.indexOf(n))),(null!==e.tag&&"?"!==e.tag||f||2!==e.indent&&t>0)&&(r=!1),f&&e.usedDuplicates[p])e.dump="*ref_"+p;else{if(d&&f&&!e.usedDuplicates[p]&&(e.usedDuplicates[p]=!0),"[object Object]"===s)i&&0!==Object.keys(e.dump).length?(!function(e,t,n,i){var r,a,l,c,s,u,p="",f=e.tag,d=Object.keys(n);if(!0===e.sortKeys)d.sort();else if("function"==typeof e.sortKeys)d.sort(e.sortKeys);else if(e.sortKeys)throw new o("sortKeys must be a boolean or a function");for(r=0,a=d.length;r<a;r+=1)u="",i&&""===p||(u+=Le(e,t)),c=n[l=d[r]],e.replacer&&(c=e.replacer.call(n,l,c)),Ve(e,t+1,l,!0,!0,!0)&&((s=null!==e.tag&&"?"!==e.tag||e.dump&&e.dump.length>1024)&&(e.dump&&10===e.dump.charCodeAt(0)?u+="?":u+="? "),u+=e.dump,s&&(u+=Le(e,t)),Ve(e,t+1,c,!0,s)&&(e.dump&&10===e.dump.charCodeAt(0)?u+=":":u+=": ",p+=u+=e.dump));e.tag=f,e.dump=p||"{}"}(e,t,e.dump,r),f&&(e.dump="&ref_"+p+e.dump)):(!function(e,t,n){var i,r,o,a,l,c="",s=e.tag,u=Object.keys(n);for(i=0,r=u.length;i<r;i+=1)l="",""!==c&&(l+=", "),e.condenseFlow&&(l+='"'),a=n[o=u[i]],e.replacer&&(a=e.replacer.call(n,o,a)),Ve(e,t,o,!1,!1)&&(e.dump.length>1024&&(l+="? "),l+=e.dump+(e.condenseFlow?'"':"")+":"+(e.condenseFlow?"":" "),Ve(e,t,a,!1,!1)&&(c+=l+=e.dump));e.tag=s,e.dump="{"+c+"}"}(e,t,e.dump),f&&(e.dump="&ref_"+p+" "+e.dump));else if("[object Array]"===s)i&&0!==e.dump.length?(e.noArrayIndent&&!l&&t>0?$e(e,t-1,e.dump,r):$e(e,t,e.dump,r),f&&(e.dump="&ref_"+p+e.dump)):(!function(e,t,n){var i,r,o,a="",l=e.tag;for(i=0,r=n.length;i<r;i+=1)o=n[i],e.replacer&&(o=e.replacer.call(n,String(i),o)),(Ve(e,t,o,!1,!1)||void 0===o&&Ve(e,t,null,!1,!1))&&(""!==a&&(a+=","+(e.condenseFlow?"":" ")),a+=e.dump);e.tag=l,e.dump="["+a+"]"}(e,t,e.dump),f&&(e.dump="&ref_"+p+" "+e.dump));else{if("[object String]"!==s){if("[object Undefined]"===s)return!1;if(e.skipInvalid)return!1;throw new o("unacceptable kind of an object to dump "+s)}"?"!==e.tag&&Ke(e,e.dump,t,a,u)}null!==e.tag&&"?"!==e.tag&&(c=encodeURI("!"===e.tag[0]?e.tag.slice(1):e.tag).replace(/!/g,"%21"),c="!"===e.tag[0]?"!"+c:"tag:yaml.org,2002:"===c.slice(0,18)?"!!"+c.slice(18):"!<"+c+">",e.dump=c+" "+e.dump)}return!0}function Ze(e,t){var n,i,r=[],o=[];for(Je(e,r,o),n=0,i=o.length;n<i;n+=1)t.duplicates.push(r[o[n]]);t.usedDuplicates=new Array(i)}function Je(e,t,n){var i,r,o;if(null!==e&&"object"==typeof e)if(-1!==(r=t.indexOf(e)))-1===n.indexOf(r)&&n.push(r);else if(t.push(e),Array.isArray(e))for(r=0,o=e.length;r<o;r+=1)Je(e[r],t,n);else for(r=0,o=(i=Object.keys(e)).length;r<o;r+=1)Je(e[i[r]],t,n)}function Qe(e,t){return function(){throw new Error("Function yaml."+e+" is removed in js-yaml 4. Use yaml."+t+" instead, which is now safe by default.")}}var ze=p,Xe=h,et=b,tt=O,nt=j,it=K,rt=xe.load,ot=xe.loadAll,at={dump:function(e,t){var n=new Ee(t=t||{});n.noRefs||Ze(e,n);var i=e;return n.replacer&&(i=n.replacer.call({"":i},"",i)),Ve(n,0,i,!0,!0)?n.dump+"\n":""}}.dump,lt=o,ct={binary:L,float:S,map:y,null:A,pairs:Y,set:B,timestamp:F,bool:v,int:C,merge:E,omap:U,seq:m,str:g},st=Qe("safeLoad","load"),ut=Qe("safeLoadAll","loadAll"),pt=Qe("safeDump","dump"),ft={Type:ze,Schema:Xe,FAILSAFE_SCHEMA:et,JSON_SCHEMA:tt,CORE_SCHEMA:nt,DEFAULT_SCHEMA:it,load:rt,loadAll:ot,dump:at,YAMLException:lt,types:ct,safeLoad:st,safeLoadAll:ut,safeDump:pt};e.CORE_SCHEMA=nt,e.DEFAULT_SCHEMA=it,e.FAILSAFE_SCHEMA=et,e.JSON_SCHEMA=tt,e.Schema=Xe,e.Type=ze,e.YAMLException=lt,e.default=ft,e.dump=at,e.load=rt,e.loadAll=ot,e.safeDump=pt,e.safeLoad=st,e.safeLoadAll=ut,e.types=ct,Object.defineProperty(e,"__esModule",{value:!0})}));

/*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT */
function isNothing(subject) {
  return (typeof subject === 'undefined') || (subject === null);
}


function isObject(subject) {
  return (typeof subject === 'object') && (subject !== null);
}


function toArray(sequence) {
  if (Array.isArray(sequence)) return sequence;
  else if (isNothing(sequence)) return [];

  return [ sequence ];
}


function extend(target, source) {
  var index, length, key, sourceKeys;

  if (source) {
    sourceKeys = Object.keys(source);

    for (index = 0, length = sourceKeys.length; index < length; index += 1) {
      key = sourceKeys[index];
      target[key] = source[key];
    }
  }

  return target;
}


function repeat(string, count) {
  var result = '', cycle;

  for (cycle = 0; cycle < count; cycle += 1) {
    result += string;
  }

  return result;
}


function isNegativeZero(number) {
  return (number === 0) && (Number.NEGATIVE_INFINITY === 1 / number);
}


var isNothing_1      = isNothing;
var isObject_1       = isObject;
var toArray_1        = toArray;
var repeat_1         = repeat;
var isNegativeZero_1 = isNegativeZero;
var extend_1         = extend;

var common = {
	isNothing: isNothing_1,
	isObject: isObject_1,
	toArray: toArray_1,
	repeat: repeat_1,
	isNegativeZero: isNegativeZero_1,
	extend: extend_1
};

// YAML error class. http://stackoverflow.com/questions/8458984


function formatError(exception, compact) {
  var where = '', message = exception.reason || '(unknown reason)';

  if (!exception.mark) return message;

  if (exception.mark.name) {
    where += 'in "' + exception.mark.name + '" ';
  }

  where += '(' + (exception.mark.line + 1) + ':' + (exception.mark.column + 1) + ')';

  if (!compact && exception.mark.snippet) {
    where += '\n\n' + exception.mark.snippet;
  }

  return message + ' ' + where;
}


function YAMLException$1(reason, mark) {
  // Super constructor
  Error.call(this);

  this.name = 'YAMLException';
  this.reason = reason;
  this.mark = mark;
  this.message = formatError(this, false);

  // Include stack trace in error object
  if (Error.captureStackTrace) {
    // Chrome and NodeJS
    Error.captureStackTrace(this, this.constructor);
  } else {
    // FF, IE 10+ and Safari 6+. Fallback for others
    this.stack = (new Error()).stack || '';
  }
}


// Inherit from Error
YAMLException$1.prototype = Object.create(Error.prototype);
YAMLException$1.prototype.constructor = YAMLException$1;


YAMLException$1.prototype.toString = function toString(compact) {
  return this.name + ': ' + formatError(this, compact);
};


var exception = YAMLException$1;

// get snippet for a single line, respecting maxLength
function getLine(buffer, lineStart, lineEnd, position, maxLineLength) {
  var head = '';
  var tail = '';
  var maxHalfLength = Math.floor(maxLineLength / 2) - 1;

  if (position - lineStart > maxHalfLength) {
    head = ' ... ';
    lineStart = position - maxHalfLength + head.length;
  }

  if (lineEnd - position > maxHalfLength) {
    tail = ' ...';
    lineEnd = position + maxHalfLength - tail.length;
  }

  return {
    str: head + buffer.slice(lineStart, lineEnd).replace(/\t/g, '→') + tail,
    pos: position - lineStart + head.length // relative position
  };
}


function padStart(string, max) {
  return common.repeat(' ', max - string.length) + string;
}


function makeSnippet(mark, options) {
  options = Object.create(options || null);

  if (!mark.buffer) return null;

  if (!options.maxLength) options.maxLength = 79;
  if (typeof options.indent      !== 'number') options.indent      = 1;
  if (typeof options.linesBefore !== 'number') options.linesBefore = 3;
  if (typeof options.linesAfter  !== 'number') options.linesAfter  = 2;

  var re = /\r?\n|\r|\0/g;
  var lineStarts = [ 0 ];
  var lineEnds = [];
  var match;
  var foundLineNo = -1;

  while ((match = re.exec(mark.buffer))) {
    lineEnds.push(match.index);
    lineStarts.push(match.index + match[0].length);

    if (mark.position <= match.index && foundLineNo < 0) {
      foundLineNo = lineStarts.length - 2;
    }
  }

  if (foundLineNo < 0) foundLineNo = lineStarts.length - 1;

  var result = '', i, line;
  var lineNoLength = Math.min(mark.line + options.linesAfter, lineEnds.length).toString().length;
  var maxLineLength = options.maxLength - (options.indent + lineNoLength + 3);

  for (i = 1; i <= options.linesBefore; i++) {
    if (foundLineNo - i < 0) break;
    line = getLine(
      mark.buffer,
      lineStarts[foundLineNo - i],
      lineEnds[foundLineNo - i],
      mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo - i]),
      maxLineLength
    );
    result = common.repeat(' ', options.indent) + padStart((mark.line - i + 1).toString(), lineNoLength) +
      ' | ' + line.str + '\n' + result;
  }

  line = getLine(mark.buffer, lineStarts[foundLineNo], lineEnds[foundLineNo], mark.position, maxLineLength);
  result += common.repeat(' ', options.indent) + padStart((mark.line + 1).toString(), lineNoLength) +
    ' | ' + line.str + '\n';
  result += common.repeat('-', options.indent + lineNoLength + 3 + line.pos) + '^' + '\n';

  for (i = 1; i <= options.linesAfter; i++) {
    if (foundLineNo + i >= lineEnds.length) break;
    line = getLine(
      mark.buffer,
      lineStarts[foundLineNo + i],
      lineEnds[foundLineNo + i],
      mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo + i]),
      maxLineLength
    );
    result += common.repeat(' ', options.indent) + padStart((mark.line + i + 1).toString(), lineNoLength) +
      ' | ' + line.str + '\n';
  }

  return result.replace(/\n$/, '');
}


var snippet = makeSnippet;

var TYPE_CONSTRUCTOR_OPTIONS = [
  'kind',
  'multi',
  'resolve',
  'construct',
  'instanceOf',
  'predicate',
  'represent',
  'representName',
  'defaultStyle',
  'styleAliases'
];

var YAML_NODE_KINDS = [
  'scalar',
  'sequence',
  'mapping'
];

function compileStyleAliases(map) {
  var result = {};

  if (map !== null) {
    Object.keys(map).forEach(function (style) {
      map[style].forEach(function (alias) {
        result[String(alias)] = style;
      });
    });
  }

  return result;
}

function Type$1(tag, options) {
  options = options || {};

  Object.keys(options).forEach(function (name) {
    if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {
      throw new exception('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.');
    }
  });

  // TODO: Add tag format check.
  this.options       = options; // keep original options in case user wants to extend this type later
  this.tag           = tag;
  this.kind          = options['kind']          || null;
  this.resolve       = options['resolve']       || function () { return true; };
  this.construct     = options['construct']     || function (data) { return data; };
  this.instanceOf    = options['instanceOf']    || null;
  this.predicate     = options['predicate']     || null;
  this.represent     = options['represent']     || null;
  this.representName = options['representName'] || null;
  this.defaultStyle  = options['defaultStyle']  || null;
  this.multi         = options['multi']         || false;
  this.styleAliases  = compileStyleAliases(options['styleAliases'] || null);

  if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {
    throw new exception('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.');
  }
}

var type = Type$1;

/*eslint-disable max-len*/





function compileList(schema, name) {
  var result = [];

  schema[name].forEach(function (currentType) {
    var newIndex = result.length;

    result.forEach(function (previousType, previousIndex) {
      if (previousType.tag === currentType.tag &&
          previousType.kind === currentType.kind &&
          previousType.multi === currentType.multi) {

        newIndex = previousIndex;
      }
    });

    result[newIndex] = currentType;
  });

  return result;
}


function compileMap(/* lists... */) {
  var result = {
        scalar: {},
        sequence: {},
        mapping: {},
        fallback: {},
        multi: {
          scalar: [],
          sequence: [],
          mapping: [],
          fallback: []
        }
      }, index, length;

  function collectType(type) {
    if (type.multi) {
      result.multi[type.kind].push(type);
      result.multi['fallback'].push(type);
    } else {
      result[type.kind][type.tag] = result['fallback'][type.tag] = type;
    }
  }

  for (index = 0, length = arguments.length; index < length; index += 1) {
    arguments[index].forEach(collectType);
  }
  return result;
}


function Schema$1(definition) {
  return this.extend(definition);
}


Schema$1.prototype.extend = function extend(definition) {
  var implicit = [];
  var explicit = [];

  if (definition instanceof type) {
    // Schema.extend(type)
    explicit.push(definition);

  } else if (Array.isArray(definition)) {
    // Schema.extend([ type1, type2, ... ])
    explicit = explicit.concat(definition);

  } else if (definition && (Array.isArray(definition.implicit) || Array.isArray(definition.explicit))) {
    // Schema.extend({ explicit: [ type1, type2, ... ], implicit: [ type1, type2, ... ] })
    if (definition.implicit) implicit = implicit.concat(definition.implicit);
    if (definition.explicit) explicit = explicit.concat(definition.explicit);

  } else {
    throw new exception('Schema.extend argument should be a Type, [ Type ], ' +
      'or a schema definition ({ implicit: [...], explicit: [...] })');
  }

  implicit.forEach(function (type$1) {
    if (!(type$1 instanceof type)) {
      throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');
    }

    if (type$1.loadKind && type$1.loadKind !== 'scalar') {
      throw new exception('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.');
    }

    if (type$1.multi) {
      throw new exception('There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.');
    }
  });

  explicit.forEach(function (type$1) {
    if (!(type$1 instanceof type)) {
      throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');
    }
  });

  var result = Object.create(Schema$1.prototype);

  result.implicit = (this.implicit || []).concat(implicit);
  result.explicit = (this.explicit || []).concat(explicit);

  result.compiledImplicit = compileList(result, 'implicit');
  result.compiledExplicit = compileList(result, 'explicit');
  result.compiledTypeMap  = compileMap(result.compiledImplicit, result.compiledExplicit);

  return result;
};


var schema = Schema$1;

var str = new type('tag:yaml.org,2002:str', {
  kind: 'scalar',
  construct: function (data) { return data !== null ? data : ''; }
});

var seq = new type('tag:yaml.org,2002:seq', {
  kind: 'sequence',
  construct: function (data) { return data !== null ? data : []; }
});

var map = new type('tag:yaml.org,2002:map', {
  kind: 'mapping',
  construct: function (data) { return data !== null ? data : {}; }
});

var failsafe = new schema({
  explicit: [
    str,
    seq,
    map
  ]
});

function resolveYamlNull(data) {
  if (data === null) return true;

  var max = data.length;

  return (max === 1 && data === '~') ||
         (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL'));
}

function constructYamlNull() {
  return null;
}

function isNull(object) {
  return object === null;
}

var _null = new type('tag:yaml.org,2002:null', {
  kind: 'scalar',
  resolve: resolveYamlNull,
  construct: constructYamlNull,
  predicate: isNull,
  represent: {
    canonical: function () { return '~';    },
    lowercase: function () { return 'null'; },
    uppercase: function () { return 'NULL'; },
    camelcase: function () { return 'Null'; },
    empty:     function () { return '';     }
  },
  defaultStyle: 'lowercase'
});

function resolveYamlBoolean(data) {
  if (data === null) return false;

  var max = data.length;

  return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) ||
         (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE'));
}

function constructYamlBoolean(data) {
  return data === 'true' ||
         data === 'True' ||
         data === 'TRUE';
}

function isBoolean(object) {
  return Object.prototype.toString.call(object) === '[object Boolean]';
}

var bool = new type('tag:yaml.org,2002:bool', {
  kind: 'scalar',
  resolve: resolveYamlBoolean,
  construct: constructYamlBoolean,
  predicate: isBoolean,
  represent: {
    lowercase: function (object) { return object ? 'true' : 'false'; },
    uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; },
    camelcase: function (object) { return object ? 'True' : 'False'; }
  },
  defaultStyle: 'lowercase'
});

function isHexCode(c) {
  return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) ||
         ((0x41/* A */ <= c) && (c <= 0x46/* F */)) ||
         ((0x61/* a */ <= c) && (c <= 0x66/* f */));
}

function isOctCode(c) {
  return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */));
}

function isDecCode(c) {
  return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */));
}

function resolveYamlInteger(data) {
  if (data === null) return false;

  var max = data.length,
      index = 0,
      hasDigits = false,
      ch;

  if (!max) return false;

  ch = data[index];

  // sign
  if (ch === '-' || ch === '+') {
    ch = data[++index];
  }

  if (ch === '0') {
    // 0
    if (index + 1 === max) return true;
    ch = data[++index];

    // base 2, base 8, base 16

    if (ch === 'b') {
      // base 2
      index++;

      for (; index < max; index++) {
        ch = data[index];
        if (ch === '_') continue;
        if (ch !== '0' && ch !== '1') return false;
        hasDigits = true;
      }
      return hasDigits && ch !== '_';
    }


    if (ch === 'x') {
      // base 16
      index++;

      for (; index < max; index++) {
        ch = data[index];
        if (ch === '_') continue;
        if (!isHexCode(data.charCodeAt(index))) return false;
        hasDigits = true;
      }
      return hasDigits && ch !== '_';
    }


    if (ch === 'o') {
      // base 8
      index++;

      for (; index < max; index++) {
        ch = data[index];
        if (ch === '_') continue;
        if (!isOctCode(data.charCodeAt(index))) return false;
        hasDigits = true;
      }
      return hasDigits && ch !== '_';
    }
  }

  // base 10 (except 0)

  // value should not start with `_`;
  if (ch === '_') return false;

  for (; index < max; index++) {
    ch = data[index];
    if (ch === '_') continue;
    if (!isDecCode(data.charCodeAt(index))) {
      return false;
    }
    hasDigits = true;
  }

  // Should have digits and should not end with `_`
  if (!hasDigits || ch === '_') return false;

  return true;
}

function constructYamlInteger(data) {
  var value = data, sign = 1, ch;

  if (value.indexOf('_') !== -1) {
    value = value.replace(/_/g, '');
  }

  ch = value[0];

  if (ch === '-' || ch === '+') {
    if (ch === '-') sign = -1;
    value = value.slice(1);
    ch = value[0];
  }

  if (value === '0') return 0;

  if (ch === '0') {
    if (value[1] === 'b') return sign * parseInt(value.slice(2), 2);
    if (value[1] === 'x') return sign * parseInt(value.slice(2), 16);
    if (value[1] === 'o') return sign * parseInt(value.slice(2), 8);
  }

  return sign * parseInt(value, 10);
}

function isInteger(object) {
  return (Object.prototype.toString.call(object)) === '[object Number]' &&
         (object % 1 === 0 && !common.isNegativeZero(object));
}

var int = new type('tag:yaml.org,2002:int', {
  kind: 'scalar',
  resolve: resolveYamlInteger,
  construct: constructYamlInteger,
  predicate: isInteger,
  represent: {
    binary:      function (obj) { return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); },
    octal:       function (obj) { return obj >= 0 ? '0o'  + obj.toString(8) : '-0o'  + obj.toString(8).slice(1); },
    decimal:     function (obj) { return obj.toString(10); },
    /* eslint-disable max-len */
    hexadecimal: function (obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() :  '-0x' + obj.toString(16).toUpperCase().slice(1); }
  },
  defaultStyle: 'decimal',
  styleAliases: {
    binary:      [ 2,  'bin' ],
    octal:       [ 8,  'oct' ],
    decimal:     [ 10, 'dec' ],
    hexadecimal: [ 16, 'hex' ]
  }
});

var YAML_FLOAT_PATTERN = new RegExp(
  // 2.5e4, 2.5 and integers
  '^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' +
  // .2e4, .2
  // special case, seems not from spec
  '|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' +
  // .inf
  '|[-+]?\\.(?:inf|Inf|INF)' +
  // .nan
  '|\\.(?:nan|NaN|NAN))$');

function resolveYamlFloat(data) {
  if (data === null) return false;

  if (!YAML_FLOAT_PATTERN.test(data) ||
      // Quick hack to not allow integers end with `_`
      // Probably should update regexp & check speed
      data[data.length - 1] === '_') {
    return false;
  }

  return true;
}

function constructYamlFloat(data) {
  var value, sign;

  value  = data.replace(/_/g, '').toLowerCase();
  sign   = value[0] === '-' ? -1 : 1;

  if ('+-'.indexOf(value[0]) >= 0) {
    value = value.slice(1);
  }

  if (value === '.inf') {
    return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;

  } else if (value === '.nan') {
    return NaN;
  }
  return sign * parseFloat(value, 10);
}


var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;

function representYamlFloat(object, style) {
  var res;

  if (isNaN(object)) {
    switch (style) {
      case 'lowercase': return '.nan';
      case 'uppercase': return '.NAN';
      case 'camelcase': return '.NaN';
    }
  } else if (Number.POSITIVE_INFINITY === object) {
    switch (style) {
      case 'lowercase': return '.inf';
      case 'uppercase': return '.INF';
      case 'camelcase': return '.Inf';
    }
  } else if (Number.NEGATIVE_INFINITY === object) {
    switch (style) {
      case 'lowercase': return '-.inf';
      case 'uppercase': return '-.INF';
      case 'camelcase': return '-.Inf';
    }
  } else if (common.isNegativeZero(object)) {
    return '-0.0';
  }

  res = object.toString(10);

  // JS stringifier can build scientific format without dots: 5e-100,
  // while YAML requres dot: 5.e-100. Fix it with simple hack

  return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res;
}

function isFloat(object) {
  return (Object.prototype.toString.call(object) === '[object Number]') &&
         (object % 1 !== 0 || common.isNegativeZero(object));
}

var float = new type('tag:yaml.org,2002:float', {
  kind: 'scalar',
  resolve: resolveYamlFloat,
  construct: constructYamlFloat,
  predicate: isFloat,
  represent: representYamlFloat,
  defaultStyle: 'lowercase'
});

var json = failsafe.extend({
  implicit: [
    _null,
    bool,
    int,
    float
  ]
});

var core = json;

var YAML_DATE_REGEXP = new RegExp(
  '^([0-9][0-9][0-9][0-9])'          + // [1] year
  '-([0-9][0-9])'                    + // [2] month
  '-([0-9][0-9])$');                   // [3] day

var YAML_TIMESTAMP_REGEXP = new RegExp(
  '^([0-9][0-9][0-9][0-9])'          + // [1] year
  '-([0-9][0-9]?)'                   + // [2] month
  '-([0-9][0-9]?)'                   + // [3] day
  '(?:[Tt]|[ \\t]+)'                 + // ...
  '([0-9][0-9]?)'                    + // [4] hour
  ':([0-9][0-9])'                    + // [5] minute
  ':([0-9][0-9])'                    + // [6] second
  '(?:\\.([0-9]*))?'                 + // [7] fraction
  '(?:[ \\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour
  '(?::([0-9][0-9]))?))?$');           // [11] tz_minute

function resolveYamlTimestamp(data) {
  if (data === null) return false;
  if (YAML_DATE_REGEXP.exec(data) !== null) return true;
  if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true;
  return false;
}

function constructYamlTimestamp(data) {
  var match, year, month, day, hour, minute, second, fraction = 0,
      delta = null, tz_hour, tz_minute, date;

  match = YAML_DATE_REGEXP.exec(data);
  if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data);

  if (match === null) throw new Error('Date resolve error');

  // match: [1] year [2] month [3] day

  year = +(match[1]);
  month = +(match[2]) - 1; // JS month starts with 0
  day = +(match[3]);

  if (!match[4]) { // no hour
    return new Date(Date.UTC(year, month, day));
  }

  // match: [4] hour [5] minute [6] second [7] fraction

  hour = +(match[4]);
  minute = +(match[5]);
  second = +(match[6]);

  if (match[7]) {
    fraction = match[7].slice(0, 3);
    while (fraction.length < 3) { // milli-seconds
      fraction += '0';
    }
    fraction = +fraction;
  }

  // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute

  if (match[9]) {
    tz_hour = +(match[10]);
    tz_minute = +(match[11] || 0);
    delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds
    if (match[9] === '-') delta = -delta;
  }

  date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));

  if (delta) date.setTime(date.getTime() - delta);

  return date;
}

function representYamlTimestamp(object /*, style*/) {
  return object.toISOString();
}

var timestamp = new type('tag:yaml.org,2002:timestamp', {
  kind: 'scalar',
  resolve: resolveYamlTimestamp,
  construct: constructYamlTimestamp,
  instanceOf: Date,
  represent: representYamlTimestamp
});

function resolveYamlMerge(data) {
  return data === '<<' || data === null;
}

var merge = new type('tag:yaml.org,2002:merge', {
  kind: 'scalar',
  resolve: resolveYamlMerge
});

/*eslint-disable no-bitwise*/





// [ 64, 65, 66 ] -> [ padding, CR, LF ]
var BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r';


function resolveYamlBinary(data) {
  if (data === null) return false;

  var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP;

  // Convert one by one.
  for (idx = 0; idx < max; idx++) {
    code = map.indexOf(data.charAt(idx));

    // Skip CR/LF
    if (code > 64) continue;

    // Fail on illegal characters
    if (code < 0) return false;

    bitlen += 6;
  }

  // If there are any bits left, source was corrupted
  return (bitlen % 8) === 0;
}

function constructYamlBinary(data) {
  var idx, tailbits,
      input = data.replace(/[\r\n=]/g, ''), // remove CR/LF & padding to simplify scan
      max = input.length,
      map = BASE64_MAP,
      bits = 0,
      result = [];

  // Collect by 6*4 bits (3 bytes)

  for (idx = 0; idx < max; idx++) {
    if ((idx % 4 === 0) && idx) {
      result.push((bits >> 16) & 0xFF);
      result.push((bits >> 8) & 0xFF);
      result.push(bits & 0xFF);
    }

    bits = (bits << 6) | map.indexOf(input.charAt(idx));
  }

  // Dump tail

  tailbits = (max % 4) * 6;

  if (tailbits === 0) {
    result.push((bits >> 16) & 0xFF);
    result.push((bits >> 8) & 0xFF);
    result.push(bits & 0xFF);
  } else if (tailbits === 18) {
    result.push((bits >> 10) & 0xFF);
    result.push((bits >> 2) & 0xFF);
  } else if (tailbits === 12) {
    result.push((bits >> 4) & 0xFF);
  }

  return new Uint8Array(result);
}

function representYamlBinary(object /*, style*/) {
  var result = '', bits = 0, idx, tail,
      max = object.length,
      map = BASE64_MAP;

  // Convert every three bytes to 4 ASCII characters.

  for (idx = 0; idx < max; idx++) {
    if ((idx % 3 === 0) && idx) {
      result += map[(bits >> 18) & 0x3F];
      result += map[(bits >> 12) & 0x3F];
      result += map[(bits >> 6) & 0x3F];
      result += map[bits & 0x3F];
    }

    bits = (bits << 8) + object[idx];
  }

  // Dump tail

  tail = max % 3;

  if (tail === 0) {
    result += map[(bits >> 18) & 0x3F];
    result += map[(bits >> 12) & 0x3F];
    result += map[(bits >> 6) & 0x3F];
    result += map[bits & 0x3F];
  } else if (tail === 2) {
    result += map[(bits >> 10) & 0x3F];
    result += map[(bits >> 4) & 0x3F];
    result += map[(bits << 2) & 0x3F];
    result += map[64];
  } else if (tail === 1) {
    result += map[(bits >> 2) & 0x3F];
    result += map[(bits << 4) & 0x3F];
    result += map[64];
    result += map[64];
  }

  return result;
}

function isBinary(obj) {
  return Object.prototype.toString.call(obj) ===  '[object Uint8Array]';
}

var binary = new type('tag:yaml.org,2002:binary', {
  kind: 'scalar',
  resolve: resolveYamlBinary,
  construct: constructYamlBinary,
  predicate: isBinary,
  represent: representYamlBinary
});

var _hasOwnProperty$3 = Object.prototype.hasOwnProperty;
var _toString$2       = Object.prototype.toString;

function resolveYamlOmap(data) {
  if (data === null) return true;

  var objectKeys = [], index, length, pair, pairKey, pairHasKey,
      object = data;

  for (index = 0, length = object.length; index < length; index += 1) {
    pair = object[index];
    pairHasKey = false;

    if (_toString$2.call(pair) !== '[object Object]') return false;

    for (pairKey in pair) {
      if (_hasOwnProperty$3.call(pair, pairKey)) {
        if (!pairHasKey) pairHasKey = true;
        else return false;
      }
    }

    if (!pairHasKey) return false;

    if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);
    else return false;
  }

  return true;
}

function constructYamlOmap(data) {
  return data !== null ? data : [];
}

var omap = new type('tag:yaml.org,2002:omap', {
  kind: 'sequence',
  resolve: resolveYamlOmap,
  construct: constructYamlOmap
});

var _toString$1 = Object.prototype.toString;

function resolveYamlPairs(data) {
  if (data === null) return true;

  var index, length, pair, keys, result,
      object = data;

  result = new Array(object.length);

  for (index = 0, length = object.length; index < length; index += 1) {
    pair = object[index];

    if (_toString$1.call(pair) !== '[object Object]') return false;

    keys = Object.keys(pair);

    if (keys.length !== 1) return false;

    result[index] = [ keys[0], pair[keys[0]] ];
  }

  return true;
}

function constructYamlPairs(data) {
  if (data === null) return [];

  var index, length, pair, keys, result,
      object = data;

  result = new Array(object.length);

  for (index = 0, length = object.length; index < length; index += 1) {
    pair = object[index];

    keys = Object.keys(pair);

    result[index] = [ keys[0], pair[keys[0]] ];
  }

  return result;
}

var pairs = new type('tag:yaml.org,2002:pairs', {
  kind: 'sequence',
  resolve: resolveYamlPairs,
  construct: constructYamlPairs
});

var _hasOwnProperty$2 = Object.prototype.hasOwnProperty;

function resolveYamlSet(data) {
  if (data === null) return true;

  var key, object = data;

  for (key in object) {
    if (_hasOwnProperty$2.call(object, key)) {
      if (object[key] !== null) return false;
    }
  }

  return true;
}

function constructYamlSet(data) {
  return data !== null ? data : {};
}

var set = new type('tag:yaml.org,2002:set', {
  kind: 'mapping',
  resolve: resolveYamlSet,
  construct: constructYamlSet
});

var _default = core.extend({
  implicit: [
    timestamp,
    merge
  ],
  explicit: [
    binary,
    omap,
    pairs,
    set
  ]
});

/*eslint-disable max-len,no-use-before-define*/







var _hasOwnProperty$1 = Object.prototype.hasOwnProperty;


var CONTEXT_FLOW_IN   = 1;
var CONTEXT_FLOW_OUT  = 2;
var CONTEXT_BLOCK_IN  = 3;
var CONTEXT_BLOCK_OUT = 4;


var CHOMPING_CLIP  = 1;
var CHOMPING_STRIP = 2;
var CHOMPING_KEEP  = 3;


var PATTERN_NON_PRINTABLE         = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/;
var PATTERN_NON_ASCII_LINE_BREAKS = /[\x85\u2028\u2029]/;
var PATTERN_FLOW_INDICATORS       = /[,\[\]\{\}]/;
var PATTERN_TAG_HANDLE            = /^(?:!|!!|![a-z\-]+!)$/i;
var PATTERN_TAG_URI               = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;


function _class(obj) { return Object.prototype.toString.call(obj); }

function is_EOL(c) {
  return (c === 0x0A/* LF */) || (c === 0x0D/* CR */);
}

function is_WHITE_SPACE(c) {
  return (c === 0x09/* Tab */) || (c === 0x20/* Space */);
}

function is_WS_OR_EOL(c) {
  return (c === 0x09/* Tab */) ||
         (c === 0x20/* Space */) ||
         (c === 0x0A/* LF */) ||
         (c === 0x0D/* CR */);
}

function is_FLOW_INDICATOR(c) {
  return c === 0x2C/* , */ ||
         c === 0x5B/* [ */ ||
         c === 0x5D/* ] */ ||
         c === 0x7B/* { */ ||
         c === 0x7D/* } */;
}

function fromHexCode(c) {
  var lc;

  if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {
    return c - 0x30;
  }

  /*eslint-disable no-bitwise*/
  lc = c | 0x20;

  if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) {
    return lc - 0x61 + 10;
  }

  return -1;
}

function escapedHexLen(c) {
  if (c === 0x78/* x */) { return 2; }
  if (c === 0x75/* u */) { return 4; }
  if (c === 0x55/* U */) { return 8; }
  return 0;
}

function fromDecimalCode(c) {
  if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {
    return c - 0x30;
  }

  return -1;
}

function simpleEscapeSequence(c) {
  /* eslint-disable indent */
  return (c === 0x30/* 0 */) ? '\x00' :
        (c === 0x61/* a */) ? '\x07' :
        (c === 0x62/* b */) ? '\x08' :
        (c === 0x74/* t */) ? '\x09' :
        (c === 0x09/* Tab */) ? '\x09' :
        (c === 0x6E/* n */) ? '\x0A' :
        (c === 0x76/* v */) ? '\x0B' :
        (c === 0x66/* f */) ? '\x0C' :
        (c === 0x72/* r */) ? '\x0D' :
        (c === 0x65/* e */) ? '\x1B' :
        (c === 0x20/* Space */) ? ' ' :
        (c === 0x22/* " */) ? '\x22' :
        (c === 0x2F/* / */) ? '/' :
        (c === 0x5C/* \ */) ? '\x5C' :
        (c === 0x4E/* N */) ? '\x85' :
        (c === 0x5F/* _ */) ? '\xA0' :
        (c === 0x4C/* L */) ? '\u2028' :
        (c === 0x50/* P */) ? '\u2029' : '';
}

function charFromCodepoint(c) {
  if (c <= 0xFFFF) {
    return String.fromCharCode(c);
  }
  // Encode UTF-16 surrogate pair
  // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF
  return String.fromCharCode(
    ((c - 0x010000) >> 10) + 0xD800,
    ((c - 0x010000) & 0x03FF) + 0xDC00
  );
}

var simpleEscapeCheck = new Array(256); // integer, for fast access
var simpleEscapeMap = new Array(256);
for (var i = 0; i < 256; i++) {
  simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;
  simpleEscapeMap[i] = simpleEscapeSequence(i);
}


function State$1(input, options) {
  this.input = input;

  this.filename  = options['filename']  || null;
  this.schema    = options['schema']    || _default;
  this.onWarning = options['onWarning'] || null;
  // (Hidden) Remove? makes the loader to expect YAML 1.1 documents
  // if such documents have no explicit %YAML directive
  this.legacy    = options['legacy']    || false;

  this.json      = options['json']      || false;
  this.listener  = options['listener']  || null;

  this.implicitTypes = this.schema.compiledImplicit;
  this.typeMap       = this.schema.compiledTypeMap;

  this.length     = input.length;
  this.position   = 0;
  this.line       = 0;
  this.lineStart  = 0;
  this.lineIndent = 0;

  // position of first leading tab in the current line,
  // used to make sure there are no tabs in the indentation
  this.firstTabInLine = -1;

  this.documents = [];

  /*
  this.version;
  this.checkLineBreaks;
  this.tagMap;
  this.anchorMap;
  this.tag;
  this.anchor;
  this.kind;
  this.result;*/

}


function generateError(state, message) {
  var mark = {
    name:     state.filename,
    buffer:   state.input.slice(0, -1), // omit trailing \0
    position: state.position,
    line:     state.line,
    column:   state.position - state.lineStart
  };

  mark.snippet = snippet(mark);

  return new exception(message, mark);
}

function throwError(state, message) {
  throw generateError(state, message);
}

function throwWarning(state, message) {
  if (state.onWarning) {
    state.onWarning.call(null, generateError(state, message));
  }
}


var directiveHandlers = {

  YAML: function handleYamlDirective(state, name, args) {

    var match, major, minor;

    if (state.version !== null) {
      throwError(state, 'duplication of %YAML directive');
    }

    if (args.length !== 1) {
      throwError(state, 'YAML directive accepts exactly one argument');
    }

    match = /^([0-9]+)\.([0-9]+)$/.exec(args[0]);

    if (match === null) {
      throwError(state, 'ill-formed argument of the YAML directive');
    }

    major = parseInt(match[1], 10);
    minor = parseInt(match[2], 10);

    if (major !== 1) {
      throwError(state, 'unacceptable YAML version of the document');
    }

    state.version = args[0];
    state.checkLineBreaks = (minor < 2);

    if (minor !== 1 && minor !== 2) {
      throwWarning(state, 'unsupported YAML version of the document');
    }
  },

  TAG: function handleTagDirective(state, name, args) {

    var handle, prefix;

    if (args.length !== 2) {
      throwError(state, 'TAG directive accepts exactly two arguments');
    }

    handle = args[0];
    prefix = args[1];

    if (!PATTERN_TAG_HANDLE.test(handle)) {
      throwError(state, 'ill-formed tag handle (first argument) of the TAG directive');
    }

    if (_hasOwnProperty$1.call(state.tagMap, handle)) {
      throwError(state, 'there is a previously declared suffix for "' + handle + '" tag handle');
    }

    if (!PATTERN_TAG_URI.test(prefix)) {
      throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive');
    }

    try {
      prefix = decodeURIComponent(prefix);
    } catch (err) {
      throwError(state, 'tag prefix is malformed: ' + prefix);
    }

    state.tagMap[handle] = prefix;
  }
};


function captureSegment(state, start, end, checkJson) {
  var _position, _length, _character, _result;

  if (start < end) {
    _result = state.input.slice(start, end);

    if (checkJson) {
      for (_position = 0, _length = _result.length; _position < _length; _position += 1) {
        _character = _result.charCodeAt(_position);
        if (!(_character === 0x09 ||
              (0x20 <= _character && _character <= 0x10FFFF))) {
          throwError(state, 'expected valid JSON character');
        }
      }
    } else if (PATTERN_NON_PRINTABLE.test(_result)) {
      throwError(state, 'the stream contains non-printable characters');
    }

    state.result += _result;
  }
}

function mergeMappings(state, destination, source, overridableKeys) {
  var sourceKeys, key, index, quantity;

  if (!common.isObject(source)) {
    throwError(state, 'cannot merge mappings; the provided source object is unacceptable');
  }

  sourceKeys = Object.keys(source);

  for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {
    key = sourceKeys[index];

    if (!_hasOwnProperty$1.call(destination, key)) {
      destination[key] = source[key];
      overridableKeys[key] = true;
    }
  }
}

function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode,
  startLine, startLineStart, startPos) {

  var index, quantity;

  // The output is a plain object here, so keys can only be strings.
  // We need to convert keyNode to a string, but doing so can hang the process
  // (deeply nested arrays that explode exponentially using aliases).
  if (Array.isArray(keyNode)) {
    keyNode = Array.prototype.slice.call(keyNode);

    for (index = 0, quantity = keyNode.length; index < quantity; index += 1) {
      if (Array.isArray(keyNode[index])) {
        throwError(state, 'nested arrays are not supported inside keys');
      }

      if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') {
        keyNode[index] = '[object Object]';
      }
    }
  }

  // Avoid code execution in load() via toString property
  // (still use its own toString for arrays, timestamps,
  // and whatever user schema extensions happen to have @@toStringTag)
  if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') {
    keyNode = '[object Object]';
  }


  keyNode = String(keyNode);

  if (_result === null) {
    _result = {};
  }

  if (keyTag === 'tag:yaml.org,2002:merge') {
    if (Array.isArray(valueNode)) {
      for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {
        mergeMappings(state, _result, valueNode[index], overridableKeys);
      }
    } else {
      mergeMappings(state, _result, valueNode, overridableKeys);
    }
  } else {
    if (!state.json &&
        !_hasOwnProperty$1.call(overridableKeys, keyNode) &&
        _hasOwnProperty$1.call(_result, keyNode)) {
      state.line = startLine || state.line;
      state.lineStart = startLineStart || state.lineStart;
      state.position = startPos || state.position;
      throwError(state, 'duplicated mapping key');
    }

    // used for this specific key only because Object.defineProperty is slow
    if (keyNode === '__proto__') {
      Object.defineProperty(_result, keyNode, {
        configurable: true,
        enumerable: true,
        writable: true,
        value: valueNode
      });
    } else {
      _result[keyNode] = valueNode;
    }
    delete overridableKeys[keyNode];
  }

  return _result;
}

function readLineBreak(state) {
  var ch;

  ch = state.input.charCodeAt(state.position);

  if (ch === 0x0A/* LF */) {
    state.position++;
  } else if (ch === 0x0D/* CR */) {
    state.position++;
    if (state.input.charCodeAt(state.position) === 0x0A/* LF */) {
      state.position++;
    }
  } else {
    throwError(state, 'a line break is expected');
  }

  state.line += 1;
  state.lineStart = state.position;
  state.firstTabInLine = -1;
}

function skipSeparationSpace(state, allowComments, checkIndent) {
  var lineBreaks = 0,
      ch = state.input.charCodeAt(state.position);

  while (ch !== 0) {
    while (is_WHITE_SPACE(ch)) {
      if (ch === 0x09/* Tab */ && state.firstTabInLine === -1) {
        state.firstTabInLine = state.position;
      }
      ch = state.input.charCodeAt(++state.position);
    }

    if (allowComments && ch === 0x23/* # */) {
      do {
        ch = state.input.charCodeAt(++state.position);
      } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && ch !== 0);
    }

    if (is_EOL(ch)) {
      readLineBreak(state);

      ch = state.input.charCodeAt(state.position);
      lineBreaks++;
      state.lineIndent = 0;

      while (ch === 0x20/* Space */) {
        state.lineIndent++;
        ch = state.input.charCodeAt(++state.position);
      }
    } else {
      break;
    }
  }

  if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {
    throwWarning(state, 'deficient indentation');
  }

  return lineBreaks;
}

function testDocumentSeparator(state) {
  var _position = state.position,
      ch;

  ch = state.input.charCodeAt(_position);

  // Condition state.position === state.lineStart is tested
  // in parent on each call, for efficiency. No needs to test here again.
  if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) &&
      ch === state.input.charCodeAt(_position + 1) &&
      ch === state.input.charCodeAt(_position + 2)) {

    _position += 3;

    ch = state.input.charCodeAt(_position);

    if (ch === 0 || is_WS_OR_EOL(ch)) {
      return true;
    }
  }

  return false;
}

function writeFoldedLines(state, count) {
  if (count === 1) {
    state.result += ' ';
  } else if (count > 1) {
    state.result += common.repeat('\n', count - 1);
  }
}


function readPlainScalar(state, nodeIndent, withinFlowCollection) {
  var preceding,
      following,
      captureStart,
      captureEnd,
      hasPendingContent,
      _line,
      _lineStart,
      _lineIndent,
      _kind = state.kind,
      _result = state.result,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (is_WS_OR_EOL(ch)      ||
      is_FLOW_INDICATOR(ch) ||
      ch === 0x23/* # */    ||
      ch === 0x26/* & */    ||
      ch === 0x2A/* * */    ||
      ch === 0x21/* ! */    ||
      ch === 0x7C/* | */    ||
      ch === 0x3E/* > */    ||
      ch === 0x27/* ' */    ||
      ch === 0x22/* " */    ||
      ch === 0x25/* % */    ||
      ch === 0x40/* @ */    ||
      ch === 0x60/* ` */) {
    return false;
  }

  if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) {
    following = state.input.charCodeAt(state.position + 1);

    if (is_WS_OR_EOL(following) ||
        withinFlowCollection && is_FLOW_INDICATOR(following)) {
      return false;
    }
  }

  state.kind = 'scalar';
  state.result = '';
  captureStart = captureEnd = state.position;
  hasPendingContent = false;

  while (ch !== 0) {
    if (ch === 0x3A/* : */) {
      following = state.input.charCodeAt(state.position + 1);

      if (is_WS_OR_EOL(following) ||
          withinFlowCollection && is_FLOW_INDICATOR(following)) {
        break;
      }

    } else if (ch === 0x23/* # */) {
      preceding = state.input.charCodeAt(state.position - 1);

      if (is_WS_OR_EOL(preceding)) {
        break;
      }

    } else if ((state.position === state.lineStart && testDocumentSeparator(state)) ||
               withinFlowCollection && is_FLOW_INDICATOR(ch)) {
      break;

    } else if (is_EOL(ch)) {
      _line = state.line;
      _lineStart = state.lineStart;
      _lineIndent = state.lineIndent;
      skipSeparationSpace(state, false, -1);

      if (state.lineIndent >= nodeIndent) {
        hasPendingContent = true;
        ch = state.input.charCodeAt(state.position);
        continue;
      } else {
        state.position = captureEnd;
        state.line = _line;
        state.lineStart = _lineStart;
        state.lineIndent = _lineIndent;
        break;
      }
    }

    if (hasPendingContent) {
      captureSegment(state, captureStart, captureEnd, false);
      writeFoldedLines(state, state.line - _line);
      captureStart = captureEnd = state.position;
      hasPendingContent = false;
    }

    if (!is_WHITE_SPACE(ch)) {
      captureEnd = state.position + 1;
    }

    ch = state.input.charCodeAt(++state.position);
  }

  captureSegment(state, captureStart, captureEnd, false);

  if (state.result) {
    return true;
  }

  state.kind = _kind;
  state.result = _result;
  return false;
}

function readSingleQuotedScalar(state, nodeIndent) {
  var ch,
      captureStart, captureEnd;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x27/* ' */) {
    return false;
  }

  state.kind = 'scalar';
  state.result = '';
  state.position++;
  captureStart = captureEnd = state.position;

  while ((ch = state.input.charCodeAt(state.position)) !== 0) {
    if (ch === 0x27/* ' */) {
      captureSegment(state, captureStart, state.position, true);
      ch = state.input.charCodeAt(++state.position);

      if (ch === 0x27/* ' */) {
        captureStart = state.position;
        state.position++;
        captureEnd = state.position;
      } else {
        return true;
      }

    } else if (is_EOL(ch)) {
      captureSegment(state, captureStart, captureEnd, true);
      writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));
      captureStart = captureEnd = state.position;

    } else if (state.position === state.lineStart && testDocumentSeparator(state)) {
      throwError(state, 'unexpected end of the document within a single quoted scalar');

    } else {
      state.position++;
      captureEnd = state.position;
    }
  }

  throwError(state, 'unexpected end of the stream within a single quoted scalar');
}

function readDoubleQuotedScalar(state, nodeIndent) {
  var captureStart,
      captureEnd,
      hexLength,
      hexResult,
      tmp,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x22/* " */) {
    return false;
  }

  state.kind = 'scalar';
  state.result = '';
  state.position++;
  captureStart = captureEnd = state.position;

  while ((ch = state.input.charCodeAt(state.position)) !== 0) {
    if (ch === 0x22/* " */) {
      captureSegment(state, captureStart, state.position, true);
      state.position++;
      return true;

    } else if (ch === 0x5C/* \ */) {
      captureSegment(state, captureStart, state.position, true);
      ch = state.input.charCodeAt(++state.position);

      if (is_EOL(ch)) {
        skipSeparationSpace(state, false, nodeIndent);

        // TODO: rework to inline fn with no type cast?
      } else if (ch < 256 && simpleEscapeCheck[ch]) {
        state.result += simpleEscapeMap[ch];
        state.position++;

      } else if ((tmp = escapedHexLen(ch)) > 0) {
        hexLength = tmp;
        hexResult = 0;

        for (; hexLength > 0; hexLength--) {
          ch = state.input.charCodeAt(++state.position);

          if ((tmp = fromHexCode(ch)) >= 0) {
            hexResult = (hexResult << 4) + tmp;

          } else {
            throwError(state, 'expected hexadecimal character');
          }
        }

        state.result += charFromCodepoint(hexResult);

        state.position++;

      } else {
        throwError(state, 'unknown escape sequence');
      }

      captureStart = captureEnd = state.position;

    } else if (is_EOL(ch)) {
      captureSegment(state, captureStart, captureEnd, true);
      writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));
      captureStart = captureEnd = state.position;

    } else if (state.position === state.lineStart && testDocumentSeparator(state)) {
      throwError(state, 'unexpected end of the document within a double quoted scalar');

    } else {
      state.position++;
      captureEnd = state.position;
    }
  }

  throwError(state, 'unexpected end of the stream within a double quoted scalar');
}

function readFlowCollection(state, nodeIndent) {
  var readNext = true,
      _line,
      _lineStart,
      _pos,
      _tag     = state.tag,
      _result,
      _anchor  = state.anchor,
      following,
      terminator,
      isPair,
      isExplicitPair,
      isMapping,
      overridableKeys = Object.create(null),
      keyNode,
      keyTag,
      valueNode,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch === 0x5B/* [ */) {
    terminator = 0x5D;/* ] */
    isMapping = false;
    _result = [];
  } else if (ch === 0x7B/* { */) {
    terminator = 0x7D;/* } */
    isMapping = true;
    _result = {};
  } else {
    return false;
  }

  if (state.anchor !== null) {
    state.anchorMap[state.anchor] = _result;
  }

  ch = state.input.charCodeAt(++state.position);

  while (ch !== 0) {
    skipSeparationSpace(state, true, nodeIndent);

    ch = state.input.charCodeAt(state.position);

    if (ch === terminator) {
      state.position++;
      state.tag = _tag;
      state.anchor = _anchor;
      state.kind = isMapping ? 'mapping' : 'sequence';
      state.result = _result;
      return true;
    } else if (!readNext) {
      throwError(state, 'missed comma between flow collection entries');
    } else if (ch === 0x2C/* , */) {
      // "flow collection entries can never be completely empty", as per YAML 1.2, section 7.4
      throwError(state, "expected the node content, but found ','");
    }

    keyTag = keyNode = valueNode = null;
    isPair = isExplicitPair = false;

    if (ch === 0x3F/* ? */) {
      following = state.input.charCodeAt(state.position + 1);

      if (is_WS_OR_EOL(following)) {
        isPair = isExplicitPair = true;
        state.position++;
        skipSeparationSpace(state, true, nodeIndent);
      }
    }

    _line = state.line; // Save the current line.
    _lineStart = state.lineStart;
    _pos = state.position;
    composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);
    keyTag = state.tag;
    keyNode = state.result;
    skipSeparationSpace(state, true, nodeIndent);

    ch = state.input.charCodeAt(state.position);

    if ((isExplicitPair || state.line === _line) && ch === 0x3A/* : */) {
      isPair = true;
      ch = state.input.charCodeAt(++state.position);
      skipSeparationSpace(state, true, nodeIndent);
      composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);
      valueNode = state.result;
    }

    if (isMapping) {
      storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos);
    } else if (isPair) {
      _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos));
    } else {
      _result.push(keyNode);
    }

    skipSeparationSpace(state, true, nodeIndent);

    ch = state.input.charCodeAt(state.position);

    if (ch === 0x2C/* , */) {
      readNext = true;
      ch = state.input.charCodeAt(++state.position);
    } else {
      readNext = false;
    }
  }

  throwError(state, 'unexpected end of the stream within a flow collection');
}

function readBlockScalar(state, nodeIndent) {
  var captureStart,
      folding,
      chomping       = CHOMPING_CLIP,
      didReadContent = false,
      detectedIndent = false,
      textIndent     = nodeIndent,
      emptyLines     = 0,
      atMoreIndented = false,
      tmp,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch === 0x7C/* | */) {
    folding = false;
  } else if (ch === 0x3E/* > */) {
    folding = true;
  } else {
    return false;
  }

  state.kind = 'scalar';
  state.result = '';

  while (ch !== 0) {
    ch = state.input.charCodeAt(++state.position);

    if (ch === 0x2B/* + */ || ch === 0x2D/* - */) {
      if (CHOMPING_CLIP === chomping) {
        chomping = (ch === 0x2B/* + */) ? CHOMPING_KEEP : CHOMPING_STRIP;
      } else {
        throwError(state, 'repeat of a chomping mode identifier');
      }

    } else if ((tmp = fromDecimalCode(ch)) >= 0) {
      if (tmp === 0) {
        throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one');
      } else if (!detectedIndent) {
        textIndent = nodeIndent + tmp - 1;
        detectedIndent = true;
      } else {
        throwError(state, 'repeat of an indentation width identifier');
      }

    } else {
      break;
    }
  }

  if (is_WHITE_SPACE(ch)) {
    do { ch = state.input.charCodeAt(++state.position); }
    while (is_WHITE_SPACE(ch));

    if (ch === 0x23/* # */) {
      do { ch = state.input.charCodeAt(++state.position); }
      while (!is_EOL(ch) && (ch !== 0));
    }
  }

  while (ch !== 0) {
    readLineBreak(state);
    state.lineIndent = 0;

    ch = state.input.charCodeAt(state.position);

    while ((!detectedIndent || state.lineIndent < textIndent) &&
           (ch === 0x20/* Space */)) {
      state.lineIndent++;
      ch = state.input.charCodeAt(++state.position);
    }

    if (!detectedIndent && state.lineIndent > textIndent) {
      textIndent = state.lineIndent;
    }

    if (is_EOL(ch)) {
      emptyLines++;
      continue;
    }

    // End of the scalar.
    if (state.lineIndent < textIndent) {

      // Perform the chomping.
      if (chomping === CHOMPING_KEEP) {
        state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines);
      } else if (chomping === CHOMPING_CLIP) {
        if (didReadContent) { // i.e. only if the scalar is not empty.
          state.result += '\n';
        }
      }

      // Break this `while` cycle and go to the funciton's epilogue.
      break;
    }

    // Folded style: use fancy rules to handle line breaks.
    if (folding) {

      // Lines starting with white space characters (more-indented lines) are not folded.
      if (is_WHITE_SPACE(ch)) {
        atMoreIndented = true;
        // except for the first content line (cf. Example 8.1)
        state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines);

      // End of more-indented block.
      } else if (atMoreIndented) {
        atMoreIndented = false;
        state.result += common.repeat('\n', emptyLines + 1);

      // Just one line break - perceive as the same line.
      } else if (emptyLines === 0) {
        if (didReadContent) { // i.e. only if we have already read some scalar content.
          state.result += ' ';
        }

      // Several line breaks - perceive as different lines.
      } else {
        state.result += common.repeat('\n', emptyLines);
      }

    // Literal style: just add exact number of line breaks between content lines.
    } else {
      // Keep all line breaks except the header line break.
      state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines);
    }

    didReadContent = true;
    detectedIndent = true;
    emptyLines = 0;
    captureStart = state.position;

    while (!is_EOL(ch) && (ch !== 0)) {
      ch = state.input.charCodeAt(++state.position);
    }

    captureSegment(state, captureStart, state.position, false);
  }

  return true;
}

function readBlockSequence(state, nodeIndent) {
  var _line,
      _tag      = state.tag,
      _anchor   = state.anchor,
      _result   = [],
      following,
      detected  = false,
      ch;

  // there is a leading tab before this token, so it can't be a block sequence/mapping;
  // it can still be flow sequence/mapping or a scalar
  if (state.firstTabInLine !== -1) return false;

  if (state.anchor !== null) {
    state.anchorMap[state.anchor] = _result;
  }

  ch = state.input.charCodeAt(state.position);

  while (ch !== 0) {
    if (state.firstTabInLine !== -1) {
      state.position = state.firstTabInLine;
      throwError(state, 'tab characters must not be used in indentation');
    }

    if (ch !== 0x2D/* - */) {
      break;
    }

    following = state.input.charCodeAt(state.position + 1);

    if (!is_WS_OR_EOL(following)) {
      break;
    }

    detected = true;
    state.position++;

    if (skipSeparationSpace(state, true, -1)) {
      if (state.lineIndent <= nodeIndent) {
        _result.push(null);
        ch = state.input.charCodeAt(state.position);
        continue;
      }
    }

    _line = state.line;
    composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);
    _result.push(state.result);
    skipSeparationSpace(state, true, -1);

    ch = state.input.charCodeAt(state.position);

    if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {
      throwError(state, 'bad indentation of a sequence entry');
    } else if (state.lineIndent < nodeIndent) {
      break;
    }
  }

  if (detected) {
    state.tag = _tag;
    state.anchor = _anchor;
    state.kind = 'sequence';
    state.result = _result;
    return true;
  }
  return false;
}

function readBlockMapping(state, nodeIndent, flowIndent) {
  var following,
      allowCompact,
      _line,
      _keyLine,
      _keyLineStart,
      _keyPos,
      _tag          = state.tag,
      _anchor       = state.anchor,
      _result       = {},
      overridableKeys = Object.create(null),
      keyTag        = null,
      keyNode       = null,
      valueNode     = null,
      atExplicitKey = false,
      detected      = false,
      ch;

  // there is a leading tab before this token, so it can't be a block sequence/mapping;
  // it can still be flow sequence/mapping or a scalar
  if (state.firstTabInLine !== -1) return false;

  if (state.anchor !== null) {
    state.anchorMap[state.anchor] = _result;
  }

  ch = state.input.charCodeAt(state.position);

  while (ch !== 0) {
    if (!atExplicitKey && state.firstTabInLine !== -1) {
      state.position = state.firstTabInLine;
      throwError(state, 'tab characters must not be used in indentation');
    }

    following = state.input.charCodeAt(state.position + 1);
    _line = state.line; // Save the current line.

    //
    // Explicit notation case. There are two separate blocks:
    // first for the key (denoted by "?") and second for the value (denoted by ":")
    //
    if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && is_WS_OR_EOL(following)) {

      if (ch === 0x3F/* ? */) {
        if (atExplicitKey) {
          storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);
          keyTag = keyNode = valueNode = null;
        }

        detected = true;
        atExplicitKey = true;
        allowCompact = true;

      } else if (atExplicitKey) {
        // i.e. 0x3A/* : */ === character after the explicit key.
        atExplicitKey = false;
        allowCompact = true;

      } else {
        throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line');
      }

      state.position += 1;
      ch = following;

    //
    // Implicit notation case. Flow-style node as the key first, then ":", and the value.
    //
    } else {
      _keyLine = state.line;
      _keyLineStart = state.lineStart;
      _keyPos = state.position;

      if (!composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {
        // Neither implicit nor explicit notation.
        // Reading is done. Go to the epilogue.
        break;
      }

      if (state.line === _line) {
        ch = state.input.charCodeAt(state.position);

        while (is_WHITE_SPACE(ch)) {
          ch = state.input.charCodeAt(++state.position);
        }

        if (ch === 0x3A/* : */) {
          ch = state.input.charCodeAt(++state.position);

          if (!is_WS_OR_EOL(ch)) {
            throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping');
          }

          if (atExplicitKey) {
            storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);
            keyTag = keyNode = valueNode = null;
          }

          detected = true;
          atExplicitKey = false;
          allowCompact = false;
          keyTag = state.tag;
          keyNode = state.result;

        } else if (detected) {
          throwError(state, 'can not read an implicit mapping pair; a colon is missed');

        } else {
          state.tag = _tag;
          state.anchor = _anchor;
          return true; // Keep the result of `composeNode`.
        }

      } else if (detected) {
        throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key');

      } else {
        state.tag = _tag;
        state.anchor = _anchor;
        return true; // Keep the result of `composeNode`.
      }
    }

    //
    // Common reading code for both explicit and implicit notations.
    //
    if (state.line === _line || state.lineIndent > nodeIndent) {
      if (atExplicitKey) {
        _keyLine = state.line;
        _keyLineStart = state.lineStart;
        _keyPos = state.position;
      }

      if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {
        if (atExplicitKey) {
          keyNode = state.result;
        } else {
          valueNode = state.result;
        }
      }

      if (!atExplicitKey) {
        storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _keyLine, _keyLineStart, _keyPos);
        keyTag = keyNode = valueNode = null;
      }

      skipSeparationSpace(state, true, -1);
      ch = state.input.charCodeAt(state.position);
    }

    if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {
      throwError(state, 'bad indentation of a mapping entry');
    } else if (state.lineIndent < nodeIndent) {
      break;
    }
  }

  //
  // Epilogue.
  //

  // Special case: last mapping's node contains only the key in explicit notation.
  if (atExplicitKey) {
    storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);
  }

  // Expose the resulting mapping.
  if (detected) {
    state.tag = _tag;
    state.anchor = _anchor;
    state.kind = 'mapping';
    state.result = _result;
  }

  return detected;
}

function readTagProperty(state) {
  var _position,
      isVerbatim = false,
      isNamed    = false,
      tagHandle,
      tagName,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x21/* ! */) return false;

  if (state.tag !== null) {
    throwError(state, 'duplication of a tag property');
  }

  ch = state.input.charCodeAt(++state.position);

  if (ch === 0x3C/* < */) {
    isVerbatim = true;
    ch = state.input.charCodeAt(++state.position);

  } else if (ch === 0x21/* ! */) {
    isNamed = true;
    tagHandle = '!!';
    ch = state.input.charCodeAt(++state.position);

  } else {
    tagHandle = '!';
  }

  _position = state.position;

  if (isVerbatim) {
    do { ch = state.input.charCodeAt(++state.position); }
    while (ch !== 0 && ch !== 0x3E/* > */);

    if (state.position < state.length) {
      tagName = state.input.slice(_position, state.position);
      ch = state.input.charCodeAt(++state.position);
    } else {
      throwError(state, 'unexpected end of the stream within a verbatim tag');
    }
  } else {
    while (ch !== 0 && !is_WS_OR_EOL(ch)) {

      if (ch === 0x21/* ! */) {
        if (!isNamed) {
          tagHandle = state.input.slice(_position - 1, state.position + 1);

          if (!PATTERN_TAG_HANDLE.test(tagHandle)) {
            throwError(state, 'named tag handle cannot contain such characters');
          }

          isNamed = true;
          _position = state.position + 1;
        } else {
          throwError(state, 'tag suffix cannot contain exclamation marks');
        }
      }

      ch = state.input.charCodeAt(++state.position);
    }

    tagName = state.input.slice(_position, state.position);

    if (PATTERN_FLOW_INDICATORS.test(tagName)) {
      throwError(state, 'tag suffix cannot contain flow indicator characters');
    }
  }

  if (tagName && !PATTERN_TAG_URI.test(tagName)) {
    throwError(state, 'tag name cannot contain such characters: ' + tagName);
  }

  try {
    tagName = decodeURIComponent(tagName);
  } catch (err) {
    throwError(state, 'tag name is malformed: ' + tagName);
  }

  if (isVerbatim) {
    state.tag = tagName;

  } else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) {
    state.tag = state.tagMap[tagHandle] + tagName;

  } else if (tagHandle === '!') {
    state.tag = '!' + tagName;

  } else if (tagHandle === '!!') {
    state.tag = 'tag:yaml.org,2002:' + tagName;

  } else {
    throwError(state, 'undeclared tag handle "' + tagHandle + '"');
  }

  return true;
}

function readAnchorProperty(state) {
  var _position,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x26/* & */) return false;

  if (state.anchor !== null) {
    throwError(state, 'duplication of an anchor property');
  }

  ch = state.input.charCodeAt(++state.position);
  _position = state.position;

  while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {
    ch = state.input.charCodeAt(++state.position);
  }

  if (state.position === _position) {
    throwError(state, 'name of an anchor node must contain at least one character');
  }

  state.anchor = state.input.slice(_position, state.position);
  return true;
}

function readAlias(state) {
  var _position, alias,
      ch;

  ch = state.input.charCodeAt(state.position);

  if (ch !== 0x2A/* * */) return false;

  ch = state.input.charCodeAt(++state.position);
  _position = state.position;

  while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {
    ch = state.input.charCodeAt(++state.position);
  }

  if (state.position === _position) {
    throwError(state, 'name of an alias node must contain at least one character');
  }

  alias = state.input.slice(_position, state.position);

  if (!_hasOwnProperty$1.call(state.anchorMap, alias)) {
    throwError(state, 'unidentified alias "' + alias + '"');
  }

  state.result = state.anchorMap[alias];
  skipSeparationSpace(state, true, -1);
  return true;
}

function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {
  var allowBlockStyles,
      allowBlockScalars,
      allowBlockCollections,
      indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this<parent
      atNewLine  = false,
      hasContent = false,
      typeIndex,
      typeQuantity,
      typeList,
      type,
      flowIndent,
      blockIndent;

  if (state.listener !== null) {
    state.listener('open', state);
  }

  state.tag    = null;
  state.anchor = null;
  state.kind   = null;
  state.result = null;

  allowBlockStyles = allowBlockScalars = allowBlockCollections =
    CONTEXT_BLOCK_OUT === nodeContext ||
    CONTEXT_BLOCK_IN  === nodeContext;

  if (allowToSeek) {
    if (skipSeparationSpace(state, true, -1)) {
      atNewLine = true;

      if (state.lineIndent > parentIndent) {
        indentStatus = 1;
      } else if (state.lineIndent === parentIndent) {
        indentStatus = 0;
      } else if (state.lineIndent < parentIndent) {
        indentStatus = -1;
      }
    }
  }

  if (indentStatus === 1) {
    while (readTagProperty(state) || readAnchorProperty(state)) {
      if (skipSeparationSpace(state, true, -1)) {
        atNewLine = true;
        allowBlockCollections = allowBlockStyles;

        if (state.lineIndent > parentIndent) {
          indentStatus = 1;
        } else if (state.lineIndent === parentIndent) {
          indentStatus = 0;
        } else if (state.lineIndent < parentIndent) {
          indentStatus = -1;
        }
      } else {
        allowBlockCollections = false;
      }
    }
  }

  if (allowBlockCollections) {
    allowBlockCollections = atNewLine || allowCompact;
  }

  if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {
    if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {
      flowIndent = parentIndent;
    } else {
      flowIndent = parentIndent + 1;
    }

    blockIndent = state.position - state.lineStart;

    if (indentStatus === 1) {
      if (allowBlockCollections &&
          (readBlockSequence(state, blockIndent) ||
           readBlockMapping(state, blockIndent, flowIndent)) ||
          readFlowCollection(state, flowIndent)) {
        hasContent = true;
      } else {
        if ((allowBlockScalars && readBlockScalar(state, flowIndent)) ||
            readSingleQuotedScalar(state, flowIndent) ||
            readDoubleQuotedScalar(state, flowIndent)) {
          hasContent = true;

        } else if (readAlias(state)) {
          hasContent = true;

          if (state.tag !== null || state.anchor !== null) {
            throwError(state, 'alias node should not have any properties');
          }

        } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {
          hasContent = true;

          if (state.tag === null) {
            state.tag = '?';
          }
        }

        if (state.anchor !== null) {
          state.anchorMap[state.anchor] = state.result;
        }
      }
    } else if (indentStatus === 0) {
      // Special case: block sequences are allowed to have same indentation level as the parent.
      // http://www.yaml.org/spec/1.2/spec.html#id2799784
      hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);
    }
  }

  if (state.tag === null) {
    if (state.anchor !== null) {
      state.anchorMap[state.anchor] = state.result;
    }

  } else if (state.tag === '?') {
    // Implicit resolving is not allowed for non-scalar types, and '?'
    // non-specific tag is only automatically assigned to plain scalars.
    //
    // We only need to check kind conformity in case user explicitly assigns '?'
    // tag, for example like this: "!<?> [0]"
    //
    if (state.result !== null && state.kind !== 'scalar') {
      throwError(state, 'unacceptable node kind for !<?> tag; it should be "scalar", not "' + state.kind + '"');
    }

    for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) {
      type = state.implicitTypes[typeIndex];

      if (type.resolve(state.result)) { // `state.result` updated in resolver if matched
        state.result = type.construct(state.result);
        state.tag = type.tag;
        if (state.anchor !== null) {
          state.anchorMap[state.anchor] = state.result;
        }
        break;
      }
    }
  } else if (state.tag !== '!') {
    if (_hasOwnProperty$1.call(state.typeMap[state.kind || 'fallback'], state.tag)) {
      type = state.typeMap[state.kind || 'fallback'][state.tag];
    } else {
      // looking for multi type
      type = null;
      typeList = state.typeMap.multi[state.kind || 'fallback'];

      for (typeIndex = 0, typeQuantity = typeList.length; typeIndex < typeQuantity; typeIndex += 1) {
        if (state.tag.slice(0, typeList[typeIndex].tag.length) === typeList[typeIndex].tag) {
          type = typeList[typeIndex];
          break;
        }
      }
    }

    if (!type) {
      throwError(state, 'unknown tag !<' + state.tag + '>');
    }

    if (state.result !== null && type.kind !== state.kind) {
      throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be "' + type.kind + '", not "' + state.kind + '"');
    }

    if (!type.resolve(state.result, state.tag)) { // `state.result` updated in resolver if matched
      throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag');
    } else {
      state.result = type.construct(state.result, state.tag);
      if (state.anchor !== null) {
        state.anchorMap[state.anchor] = state.result;
      }
    }
  }

  if (state.listener !== null) {
    state.listener('close', state);
  }
  return state.tag !== null ||  state.anchor !== null || hasContent;
}

function readDocument(state) {
  var documentStart = state.position,
      _position,
      directiveName,
      directiveArgs,
      hasDirectives = false,
      ch;

  state.version = null;
  state.checkLineBreaks = state.legacy;
  state.tagMap = Object.create(null);
  state.anchorMap = Object.create(null);

  while ((ch = state.input.charCodeAt(state.position)) !== 0) {
    skipSeparationSpace(state, true, -1);

    ch = state.input.charCodeAt(state.position);

    if (state.lineIndent > 0 || ch !== 0x25/* % */) {
      break;
    }

    hasDirectives = true;
    ch = state.input.charCodeAt(++state.position);
    _position = state.position;

    while (ch !== 0 && !is_WS_OR_EOL(ch)) {
      ch = state.input.charCodeAt(++state.position);
    }

    directiveName = state.input.slice(_position, state.position);
    directiveArgs = [];

    if (directiveName.length < 1) {
      throwError(state, 'directive name must not be less than one character in length');
    }

    while (ch !== 0) {
      while (is_WHITE_SPACE(ch)) {
        ch = state.input.charCodeAt(++state.position);
      }

      if (ch === 0x23/* # */) {
        do { ch = state.input.charCodeAt(++state.position); }
        while (ch !== 0 && !is_EOL(ch));
        break;
      }

      if (is_EOL(ch)) break;

      _position = state.position;

      while (ch !== 0 && !is_WS_OR_EOL(ch)) {
        ch = state.input.charCodeAt(++state.position);
      }

      directiveArgs.push(state.input.slice(_position, state.position));
    }

    if (ch !== 0) readLineBreak(state);

    if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) {
      directiveHandlers[directiveName](state, directiveName, directiveArgs);
    } else {
      throwWarning(state, 'unknown document directive "' + directiveName + '"');
    }
  }

  skipSeparationSpace(state, true, -1);

  if (state.lineIndent === 0 &&
      state.input.charCodeAt(state.position)     === 0x2D/* - */ &&
      state.input.charCodeAt(state.position + 1) === 0x2D/* - */ &&
      state.input.charCodeAt(state.position + 2) === 0x2D/* - */) {
    state.position += 3;
    skipSeparationSpace(state, true, -1);

  } else if (hasDirectives) {
    throwError(state, 'directives end mark is expected');
  }

  composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);
  skipSeparationSpace(state, true, -1);

  if (state.checkLineBreaks &&
      PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {
    throwWarning(state, 'non-ASCII line breaks are interpreted as content');
  }

  state.documents.push(state.result);

  if (state.position === state.lineStart && testDocumentSeparator(state)) {

    if (state.input.charCodeAt(state.position) === 0x2E/* . */) {
      state.position += 3;
      skipSeparationSpace(state, true, -1);
    }
    return;
  }

  if (state.position < (state.length - 1)) {
    throwError(state, 'end of the stream or a document separator is expected');
  } else {
    return;
  }
}


function loadDocuments(input, options) {
  input = String(input);
  options = options || {};

  if (input.length !== 0) {

    // Add tailing `\n` if not exists
    if (input.charCodeAt(input.length - 1) !== 0x0A/* LF */ &&
        input.charCodeAt(input.length - 1) !== 0x0D/* CR */) {
      input += '\n';
    }

    // Strip BOM
    if (input.charCodeAt(0) === 0xFEFF) {
      input = input.slice(1);
    }
  }

  var state = new State$1(input, options);

  var nullpos = input.indexOf('\0');

  if (nullpos !== -1) {
    state.position = nullpos;
    throwError(state, 'null byte is not allowed in input');
  }

  // Use 0 as string terminator. That significantly simplifies bounds check.
  state.input += '\0';

  while (state.input.charCodeAt(state.position) === 0x20/* Space */) {
    state.lineIndent += 1;
    state.position += 1;
  }

  while (state.position < (state.length - 1)) {
    readDocument(state);
  }

  return state.documents;
}


function loadAll$1(input, iterator, options) {
  if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') {
    options = iterator;
    iterator = null;
  }

  var documents = loadDocuments(input, options);

  if (typeof iterator !== 'function') {
    return documents;
  }

  for (var index = 0, length = documents.length; index < length; index += 1) {
    iterator(documents[index]);
  }
}


function load$1(input, options) {
  var documents = loadDocuments(input, options);

  if (documents.length === 0) {
    /*eslint-disable no-undefined*/
    return undefined;
  } else if (documents.length === 1) {
    return documents[0];
  }
  throw new exception('expected a single document in the stream, but found more');
}


var loadAll_1 = loadAll$1;
var load_1    = load$1;

var loader = {
	loadAll: loadAll_1,
	load: load_1
};

/*eslint-disable no-use-before-define*/





var _toString       = Object.prototype.toString;
var _hasOwnProperty = Object.prototype.hasOwnProperty;

var CHAR_BOM                  = 0xFEFF;
var CHAR_TAB                  = 0x09; /* Tab */
var CHAR_LINE_FEED            = 0x0A; /* LF */
var CHAR_CARRIAGE_RETURN      = 0x0D; /* CR */
var CHAR_SPACE                = 0x20; /* Space */
var CHAR_EXCLAMATION          = 0x21; /* ! */
var CHAR_DOUBLE_QUOTE         = 0x22; /* " */
var CHAR_SHARP                = 0x23; /* # */
var CHAR_PERCENT              = 0x25; /* % */
var CHAR_AMPERSAND            = 0x26; /* & */
var CHAR_SINGLE_QUOTE         = 0x27; /* ' */
var CHAR_ASTERISK             = 0x2A; /* * */
var CHAR_COMMA                = 0x2C; /* , */
var CHAR_MINUS                = 0x2D; /* - */
var CHAR_COLON                = 0x3A; /* : */
var CHAR_EQUALS               = 0x3D; /* = */
var CHAR_GREATER_THAN         = 0x3E; /* > */
var CHAR_QUESTION             = 0x3F; /* ? */
var CHAR_COMMERCIAL_AT        = 0x40; /* @ */
var CHAR_LEFT_SQUARE_BRACKET  = 0x5B; /* [ */
var CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */
var CHAR_GRAVE_ACCENT         = 0x60; /* ` */
var CHAR_LEFT_CURLY_BRACKET   = 0x7B; /* { */
var CHAR_VERTICAL_LINE        = 0x7C; /* | */
var CHAR_RIGHT_CURLY_BRACKET  = 0x7D; /* } */

var ESCAPE_SEQUENCES = {};

ESCAPE_SEQUENCES[0x00]   = '\\0';
ESCAPE_SEQUENCES[0x07]   = '\\a';
ESCAPE_SEQUENCES[0x08]   = '\\b';
ESCAPE_SEQUENCES[0x09]   = '\\t';
ESCAPE_SEQUENCES[0x0A]   = '\\n';
ESCAPE_SEQUENCES[0x0B]   = '\\v';
ESCAPE_SEQUENCES[0x0C]   = '\\f';
ESCAPE_SEQUENCES[0x0D]   = '\\r';
ESCAPE_SEQUENCES[0x1B]   = '\\e';
ESCAPE_SEQUENCES[0x22]   = '\\"';
ESCAPE_SEQUENCES[0x5C]   = '\\\\';
ESCAPE_SEQUENCES[0x85]   = '\\N';
ESCAPE_SEQUENCES[0xA0]   = '\\_';
ESCAPE_SEQUENCES[0x2028] = '\\L';
ESCAPE_SEQUENCES[0x2029] = '\\P';

var DEPRECATED_BOOLEANS_SYNTAX = [
  'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON',
  'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF'
];

var DEPRECATED_BASE60_SYNTAX = /^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/;

function compileStyleMap(schema, map) {
  var result, keys, index, length, tag, style, type;

  if (map === null) return {};

  result = {};
  keys = Object.keys(map);

  for (index = 0, length = keys.length; index < length; index += 1) {
    tag = keys[index];
    style = String(map[tag]);

    if (tag.slice(0, 2) === '!!') {
      tag = 'tag:yaml.org,2002:' + tag.slice(2);
    }
    type = schema.compiledTypeMap['fallback'][tag];

    if (type && _hasOwnProperty.call(type.styleAliases, style)) {
      style = type.styleAliases[style];
    }

    result[tag] = style;
  }

  return result;
}

function encodeHex(character) {
  var string, handle, length;

  string = character.toString(16).toUpperCase();

  if (character <= 0xFF) {
    handle = 'x';
    length = 2;
  } else if (character <= 0xFFFF) {
    handle = 'u';
    length = 4;
  } else if (character <= 0xFFFFFFFF) {
    handle = 'U';
    length = 8;
  } else {
    throw new exception('code point within a string may not be greater than 0xFFFFFFFF');
  }

  return '\\' + handle + common.repeat('0', length - string.length) + string;
}


var QUOTING_TYPE_SINGLE = 1,
    QUOTING_TYPE_DOUBLE = 2;

function State(options) {
  this.schema        = options['schema'] || _default;
  this.indent        = Math.max(1, (options['indent'] || 2));
  this.noArrayIndent = options['noArrayIndent'] || false;
  this.skipInvalid   = options['skipInvalid'] || false;
  this.flowLevel     = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']);
  this.styleMap      = compileStyleMap(this.schema, options['styles'] || null);
  this.sortKeys      = options['sortKeys'] || false;
  this.lineWidth     = options['lineWidth'] || 80;
  this.noRefs        = options['noRefs'] || false;
  this.noCompatMode  = options['noCompatMode'] || false;
  this.condenseFlow  = options['condenseFlow'] || false;
  this.quotingType   = options['quotingType'] === '"' ? QUOTING_TYPE_DOUBLE : QUOTING_TYPE_SINGLE;
  this.forceQuotes   = options['forceQuotes'] || false;
  this.replacer      = typeof options['replacer'] === 'function' ? options['replacer'] : null;

  this.implicitTypes = this.schema.compiledImplicit;
  this.explicitTypes = this.schema.compiledExplicit;

  this.tag = null;
  this.result = '';

  this.duplicates = [];
  this.usedDuplicates = null;
}

// Indents every line in a string. Empty lines (\n only) are not indented.
function indentString(string, spaces) {
  var ind = common.repeat(' ', spaces),
      position = 0,
      next = -1,
      result = '',
      line,
      length = string.length;

  while (position < length) {
    next = string.indexOf('\n', position);
    if (next === -1) {
      line = string.slice(position);
      position = length;
    } else {
      line = string.slice(position, next + 1);
      position = next + 1;
    }

    if (line.length && line !== '\n') result += ind;

    result += line;
  }

  return result;
}

function generateNextLine(state, level) {
  return '\n' + common.repeat(' ', state.indent * level);
}

function testImplicitResolving(state, str) {
  var index, length, type;

  for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {
    type = state.implicitTypes[index];

    if (type.resolve(str)) {
      return true;
    }
  }

  return false;
}

// [33] s-white ::= s-space | s-tab
function isWhitespace(c) {
  return c === CHAR_SPACE || c === CHAR_TAB;
}

// Returns true if the character can be printed without escaping.
// From YAML 1.2: "any allowed characters known to be non-printable
// should also be escaped. [However,] This isn’t mandatory"
// Derived from nb-char - \t - #x85 - #xA0 - #x2028 - #x2029.
function isPrintable(c) {
  return  (0x00020 <= c && c <= 0x00007E)
      || ((0x000A1 <= c && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029)
      || ((0x0E000 <= c && c <= 0x00FFFD) && c !== CHAR_BOM)
      ||  (0x10000 <= c && c <= 0x10FFFF);
}

// [34] ns-char ::= nb-char - s-white
// [27] nb-char ::= c-printable - b-char - c-byte-order-mark
// [26] b-char  ::= b-line-feed | b-carriage-return
// Including s-white (for some reason, examples doesn't match specs in this aspect)
// ns-char ::= c-printable - b-line-feed - b-carriage-return - c-byte-order-mark
function isNsCharOrWhitespace(c) {
  return isPrintable(c)
    && c !== CHAR_BOM
    // - b-char
    && c !== CHAR_CARRIAGE_RETURN
    && c !== CHAR_LINE_FEED;
}

// [127]  ns-plain-safe(c) ::= c = flow-out  ⇒ ns-plain-safe-out
//                             c = flow-in   ⇒ ns-plain-safe-in
//                             c = block-key ⇒ ns-plain-safe-out
//                             c = flow-key  ⇒ ns-plain-safe-in
// [128] ns-plain-safe-out ::= ns-char
// [129]  ns-plain-safe-in ::= ns-char - c-flow-indicator
// [130]  ns-plain-char(c) ::=  ( ns-plain-safe(c) - “:” - “#” )
//                            | ( /* An ns-char preceding */ “#” )
//                            | ( “:” /* Followed by an ns-plain-safe(c) */ )
function isPlainSafe(c, prev, inblock) {
  var cIsNsCharOrWhitespace = isNsCharOrWhitespace(c);
  var cIsNsChar = cIsNsCharOrWhitespace && !isWhitespace(c);
  return (
    // ns-plain-safe
    inblock ? // c = flow-in
      cIsNsCharOrWhitespace
      : cIsNsCharOrWhitespace
        // - c-flow-indicator
        && c !== CHAR_COMMA
        && c !== CHAR_LEFT_SQUARE_BRACKET
        && c !== CHAR_RIGHT_SQUARE_BRACKET
        && c !== CHAR_LEFT_CURLY_BRACKET
        && c !== CHAR_RIGHT_CURLY_BRACKET
  )
    // ns-plain-char
    && c !== CHAR_SHARP // false on '#'
    && !(prev === CHAR_COLON && !cIsNsChar) // false on ': '
    || (isNsCharOrWhitespace(prev) && !isWhitespace(prev) && c === CHAR_SHARP) // change to true on '[^ ]#'
    || (prev === CHAR_COLON && cIsNsChar); // change to true on ':[^ ]'
}

// Simplified test for values allowed as the first character in plain style.
function isPlainSafeFirst(c) {
  // Uses a subset of ns-char - c-indicator
  // where ns-char = nb-char - s-white.
  // No support of ( ( “?” | “:” | “-” ) /* Followed by an ns-plain-safe(c)) */ ) part
  return isPrintable(c) && c !== CHAR_BOM
    && !isWhitespace(c) // - s-white
    // - (c-indicator ::=
    // “-” | “?” | “:” | “,” | “[” | “]” | “{” | “}”
    && c !== CHAR_MINUS
    && c !== CHAR_QUESTION
    && c !== CHAR_COLON
    && c !== CHAR_COMMA
    && c !== CHAR_LEFT_SQUARE_BRACKET
    && c !== CHAR_RIGHT_SQUARE_BRACKET
    && c !== CHAR_LEFT_CURLY_BRACKET
    && c !== CHAR_RIGHT_CURLY_BRACKET
    // | “#” | “&” | “*” | “!” | “|” | “=” | “>” | “'” | “"”
    && c !== CHAR_SHARP
    && c !== CHAR_AMPERSAND
    && c !== CHAR_ASTERISK
    && c !== CHAR_EXCLAMATION
    && c !== CHAR_VERTICAL_LINE
    && c !== CHAR_EQUALS
    && c !== CHAR_GREATER_THAN
    && c !== CHAR_SINGLE_QUOTE
    && c !== CHAR_DOUBLE_QUOTE
    // | “%” | “@” | “`”)
    && c !== CHAR_PERCENT
    && c !== CHAR_COMMERCIAL_AT
    && c !== CHAR_GRAVE_ACCENT;
}

// Simplified test for values allowed as the last character in plain style.
function isPlainSafeLast(c) {
  // just not whitespace or colon, it will be checked to be plain character later
  return !isWhitespace(c) && c !== CHAR_COLON;
}

// Same as 'string'.codePointAt(pos), but works in older browsers.
function codePointAt(string, pos) {
  var first = string.charCodeAt(pos), second;
  if (first >= 0xD800 && first <= 0xDBFF && pos + 1 < string.length) {
    second = string.charCodeAt(pos + 1);
    if (second >= 0xDC00 && second <= 0xDFFF) {
      // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
      return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;
    }
  }
  return first;
}

// Determines whether block indentation indicator is required.
function needIndentIndicator(string) {
  var leadingSpaceRe = /^\n* /;
  return leadingSpaceRe.test(string);
}

var STYLE_PLAIN   = 1,
    STYLE_SINGLE  = 2,
    STYLE_LITERAL = 3,
    STYLE_FOLDED  = 4,
    STYLE_DOUBLE  = 5;

// Determines which scalar styles are possible and returns the preferred style.
// lineWidth = -1 => no limit.
// Pre-conditions: str.length > 0.
// Post-conditions:
//    STYLE_PLAIN or STYLE_SINGLE => no \n are in the string.
//    STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1).
//    STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1).
function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth,
  testAmbiguousType, quotingType, forceQuotes, inblock) {

  var i;
  var char = 0;
  var prevChar = null;
  var hasLineBreak = false;
  var hasFoldableLine = false; // only checked if shouldTrackWidth
  var shouldTrackWidth = lineWidth !== -1;
  var previousLineBreak = -1; // count the first line correctly
  var plain = isPlainSafeFirst(codePointAt(string, 0))
          && isPlainSafeLast(codePointAt(string, string.length - 1));

  if (singleLineOnly || forceQuotes) {
    // Case: no block styles.
    // Check for disallowed characters to rule out plain and single.
    for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {
      char = codePointAt(string, i);
      if (!isPrintable(char)) {
        return STYLE_DOUBLE;
      }
      plain = plain && isPlainSafe(char, prevChar, inblock);
      prevChar = char;
    }
  } else {
    // Case: block styles permitted.
    for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {
      char = codePointAt(string, i);
      if (char === CHAR_LINE_FEED) {
        hasLineBreak = true;
        // Check if any line can be folded.
        if (shouldTrackWidth) {
          hasFoldableLine = hasFoldableLine ||
            // Foldable line = too long, and not more-indented.
            (i - previousLineBreak - 1 > lineWidth &&
             string[previousLineBreak + 1] !== ' ');
          previousLineBreak = i;
        }
      } else if (!isPrintable(char)) {
        return STYLE_DOUBLE;
      }
      plain = plain && isPlainSafe(char, prevChar, inblock);
      prevChar = char;
    }
    // in case the end is missing a \n
    hasFoldableLine = hasFoldableLine || (shouldTrackWidth &&
      (i - previousLineBreak - 1 > lineWidth &&
       string[previousLineBreak + 1] !== ' '));
  }
  // Although every style can represent \n without escaping, prefer block styles
  // for multiline, since they're more readable and they don't add empty lines.
  // Also prefer folding a super-long line.
  if (!hasLineBreak && !hasFoldableLine) {
    // Strings interpretable as another type have to be quoted;
    // e.g. the string 'true' vs. the boolean true.
    if (plain && !forceQuotes && !testAmbiguousType(string)) {
      return STYLE_PLAIN;
    }
    return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;
  }
  // Edge case: block indentation indicator can only have one digit.
  if (indentPerLevel > 9 && needIndentIndicator(string)) {
    return STYLE_DOUBLE;
  }
  // At this point we know block styles are valid.
  // Prefer literal style unless we want to fold.
  if (!forceQuotes) {
    return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;
  }
  return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;
}

// Note: line breaking/folding is implemented for only the folded style.
// NB. We drop the last trailing newline (if any) of a returned block scalar
//  since the dumper adds its own newline. This always works:
//    • No ending newline => unaffected; already using strip "-" chomping.
//    • Ending newline    => removed then restored.
//  Importantly, this keeps the "+" chomp indicator from gaining an extra line.
function writeScalar(state, string, level, iskey, inblock) {
  state.dump = (function () {
    if (string.length === 0) {
      return state.quotingType === QUOTING_TYPE_DOUBLE ? '""' : "''";
    }
    if (!state.noCompatMode) {
      if (DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1 || DEPRECATED_BASE60_SYNTAX.test(string)) {
        return state.quotingType === QUOTING_TYPE_DOUBLE ? ('"' + string + '"') : ("'" + string + "'");
      }
    }

    var indent = state.indent * Math.max(1, level); // no 0-indent scalars
    // As indentation gets deeper, let the width decrease monotonically
    // to the lower bound min(state.lineWidth, 40).
    // Note that this implies
    //  state.lineWidth ≤ 40 + state.indent: width is fixed at the lower bound.
    //  state.lineWidth > 40 + state.indent: width decreases until the lower bound.
    // This behaves better than a constant minimum width which disallows narrower options,
    // or an indent threshold which causes the width to suddenly increase.
    var lineWidth = state.lineWidth === -1
      ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);

    // Without knowing if keys are implicit/explicit, assume implicit for safety.
    var singleLineOnly = iskey
      // No block styles in flow mode.
      || (state.flowLevel > -1 && level >= state.flowLevel);
    function testAmbiguity(string) {
      return testImplicitResolving(state, string);
    }

    switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth,
      testAmbiguity, state.quotingType, state.forceQuotes && !iskey, inblock)) {

      case STYLE_PLAIN:
        return string;
      case STYLE_SINGLE:
        return "'" + string.replace(/'/g, "''") + "'";
      case STYLE_LITERAL:
        return '|' + blockHeader(string, state.indent)
          + dropEndingNewline(indentString(string, indent));
      case STYLE_FOLDED:
        return '>' + blockHeader(string, state.indent)
          + dropEndingNewline(indentString(foldString(string, lineWidth), indent));
      case STYLE_DOUBLE:
        return '"' + escapeString(string) + '"';
      default:
        throw new exception('impossible error: invalid scalar style');
    }
  }());
}

// Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9.
function blockHeader(string, indentPerLevel) {
  var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : '';

  // note the special case: the string '\n' counts as a "trailing" empty line.
  var clip =          string[string.length - 1] === '\n';
  var keep = clip && (string[string.length - 2] === '\n' || string === '\n');
  var chomp = keep ? '+' : (clip ? '' : '-');

  return indentIndicator + chomp + '\n';
}

// (See the note for writeScalar.)
function dropEndingNewline(string) {
  return string[string.length - 1] === '\n' ? string.slice(0, -1) : string;
}

// Note: a long line without a suitable break point will exceed the width limit.
// Pre-conditions: every char in str isPrintable, str.length > 0, width > 0.
function foldString(string, width) {
  // In folded style, $k$ consecutive newlines output as $k+1$ newlines—
  // unless they're before or after a more-indented line, or at the very
  // beginning or end, in which case $k$ maps to $k$.
  // Therefore, parse each chunk as newline(s) followed by a content line.
  var lineRe = /(\n+)([^\n]*)/g;

  // first line (possibly an empty line)
  var result = (function () {
    var nextLF = string.indexOf('\n');
    nextLF = nextLF !== -1 ? nextLF : string.length;
    lineRe.lastIndex = nextLF;
    return foldLine(string.slice(0, nextLF), width);
  }());
  // If we haven't reached the first content line yet, don't add an extra \n.
  var prevMoreIndented = string[0] === '\n' || string[0] === ' ';
  var moreIndented;

  // rest of the lines
  var match;
  while ((match = lineRe.exec(string))) {
    var prefix = match[1], line = match[2];
    moreIndented = (line[0] === ' ');
    result += prefix
      + (!prevMoreIndented && !moreIndented && line !== ''
        ? '\n' : '')
      + foldLine(line, width);
    prevMoreIndented = moreIndented;
  }

  return result;
}

// Greedy line breaking.
// Picks the longest line under the limit each time,
// otherwise settles for the shortest line over the limit.
// NB. More-indented lines *cannot* be folded, as that would add an extra \n.
function foldLine(line, width) {
  if (line === '' || line[0] === ' ') return line;

  // Since a more-indented line adds a \n, breaks can't be followed by a space.
  var breakRe = / [^ ]/g; // note: the match index will always be <= length-2.
  var match;
  // start is an inclusive index. end, curr, and next are exclusive.
  var start = 0, end, curr = 0, next = 0;
  var result = '';

  // Invariants: 0 <= start <= length-1.
  //   0 <= curr <= next <= max(0, length-2). curr - start <= width.
  // Inside the loop:
  //   A match implies length >= 2, so curr and next are <= length-2.
  while ((match = breakRe.exec(line))) {
    next = match.index;
    // maintain invariant: curr - start <= width
    if (next - start > width) {
      end = (curr > start) ? curr : next; // derive end <= length-2
      result += '\n' + line.slice(start, end);
      // skip the space that was output as \n
      start = end + 1;                    // derive start <= length-1
    }
    curr = next;
  }

  // By the invariants, start <= length-1, so there is something left over.
  // It is either the whole string or a part starting from non-whitespace.
  result += '\n';
  // Insert a break if the remainder is too long and there is a break available.
  if (line.length - start > width && curr > start) {
    result += line.slice(start, curr) + '\n' + line.slice(curr + 1);
  } else {
    result += line.slice(start);
  }

  return result.slice(1); // drop extra \n joiner
}

// Escapes a double-quoted string.
function escapeString(string) {
  var result = '';
  var char = 0;
  var escapeSeq;

  for (var i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {
    char = codePointAt(string, i);
    escapeSeq = ESCAPE_SEQUENCES[char];

    if (!escapeSeq && isPrintable(char)) {
      result += string[i];
      if (char >= 0x10000) result += string[i + 1];
    } else {
      result += escapeSeq || encodeHex(char);
    }
  }

  return result;
}

function writeFlowSequence(state, level, object) {
  var _result = '',
      _tag    = state.tag,
      index,
      length,
      value;

  for (index = 0, length = object.length; index < length; index += 1) {
    value = object[index];

    if (state.replacer) {
      value = state.replacer.call(object, String(index), value);
    }

    // Write only valid elements, put null instead of invalid elements.
    if (writeNode(state, level, value, false, false) ||
        (typeof value === 'undefined' &&
         writeNode(state, level, null, false, false))) {

      if (_result !== '') _result += ',' + (!state.condenseFlow ? ' ' : '');
      _result += state.dump;
    }
  }

  state.tag = _tag;
  state.dump = '[' + _result + ']';
}

function writeBlockSequence(state, level, object, compact) {
  var _result = '',
      _tag    = state.tag,
      index,
      length,
      value;

  for (index = 0, length = object.length; index < length; index += 1) {
    value = object[index];

    if (state.replacer) {
      value = state.replacer.call(object, String(index), value);
    }

    // Write only valid elements, put null instead of invalid elements.
    if (writeNode(state, level + 1, value, true, true, false, true) ||
        (typeof value === 'undefined' &&
         writeNode(state, level + 1, null, true, true, false, true))) {

      if (!compact || _result !== '') {
        _result += generateNextLine(state, level);
      }

      if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
        _result += '-';
      } else {
        _result += '- ';
      }

      _result += state.dump;
    }
  }

  state.tag = _tag;
  state.dump = _result || '[]'; // Empty sequence if no valid values.
}

function writeFlowMapping(state, level, object) {
  var _result       = '',
      _tag          = state.tag,
      objectKeyList = Object.keys(object),
      index,
      length,
      objectKey,
      objectValue,
      pairBuffer;

  for (index = 0, length = objectKeyList.length; index < length; index += 1) {

    pairBuffer = '';
    if (_result !== '') pairBuffer += ', ';

    if (state.condenseFlow) pairBuffer += '"';

    objectKey = objectKeyList[index];
    objectValue = object[objectKey];

    if (state.replacer) {
      objectValue = state.replacer.call(object, objectKey, objectValue);
    }

    if (!writeNode(state, level, objectKey, false, false)) {
      continue; // Skip this pair because of invalid key;
    }

    if (state.dump.length > 1024) pairBuffer += '? ';

    pairBuffer += state.dump + (state.condenseFlow ? '"' : '') + ':' + (state.condenseFlow ? '' : ' ');

    if (!writeNode(state, level, objectValue, false, false)) {
      continue; // Skip this pair because of invalid value.
    }

    pairBuffer += state.dump;

    // Both key and value are valid.
    _result += pairBuffer;
  }

  state.tag = _tag;
  state.dump = '{' + _result + '}';
}

function writeBlockMapping(state, level, object, compact) {
  var _result       = '',
      _tag          = state.tag,
      objectKeyList = Object.keys(object),
      index,
      length,
      objectKey,
      objectValue,
      explicitPair,
      pairBuffer;

  // Allow sorting keys so that the output file is deterministic
  if (state.sortKeys === true) {
    // Default sorting
    objectKeyList.sort();
  } else if (typeof state.sortKeys === 'function') {
    // Custom sort function
    objectKeyList.sort(state.sortKeys);
  } else if (state.sortKeys) {
    // Something is wrong
    throw new exception('sortKeys must be a boolean or a function');
  }

  for (index = 0, length = objectKeyList.length; index < length; index += 1) {
    pairBuffer = '';

    if (!compact || _result !== '') {
      pairBuffer += generateNextLine(state, level);
    }

    objectKey = objectKeyList[index];
    objectValue = object[objectKey];

    if (state.replacer) {
      objectValue = state.replacer.call(object, objectKey, objectValue);
    }

    if (!writeNode(state, level + 1, objectKey, true, true, true)) {
      continue; // Skip this pair because of invalid key.
    }

    explicitPair = (state.tag !== null && state.tag !== '?') ||
                   (state.dump && state.dump.length > 1024);

    if (explicitPair) {
      if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
        pairBuffer += '?';
      } else {
        pairBuffer += '? ';
      }
    }

    pairBuffer += state.dump;

    if (explicitPair) {
      pairBuffer += generateNextLine(state, level);
    }

    if (!writeNode(state, level + 1, objectValue, true, explicitPair)) {
      continue; // Skip this pair because of invalid value.
    }

    if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
      pairBuffer += ':';
    } else {
      pairBuffer += ': ';
    }

    pairBuffer += state.dump;

    // Both key and value are valid.
    _result += pairBuffer;
  }

  state.tag = _tag;
  state.dump = _result || '{}'; // Empty mapping if no valid pairs.
}

function detectType(state, object, explicit) {
  var _result, typeList, index, length, type, style;

  typeList = explicit ? state.explicitTypes : state.implicitTypes;

  for (index = 0, length = typeList.length; index < length; index += 1) {
    type = typeList[index];

    if ((type.instanceOf  || type.predicate) &&
        (!type.instanceOf || ((typeof object === 'object') && (object instanceof type.instanceOf))) &&
        (!type.predicate  || type.predicate(object))) {

      if (explicit) {
        if (type.multi && type.representName) {
          state.tag = type.representName(object);
        } else {
          state.tag = type.tag;
        }
      } else {
        state.tag = '?';
      }

      if (type.represent) {
        style = state.styleMap[type.tag] || type.defaultStyle;

        if (_toString.call(type.represent) === '[object Function]') {
          _result = type.represent(object, style);
        } else if (_hasOwnProperty.call(type.represent, style)) {
          _result = type.represent[style](object, style);
        } else {
          throw new exception('!<' + type.tag + '> tag resolver accepts not "' + style + '" style');
        }

        state.dump = _result;
      }

      return true;
    }
  }

  return false;
}

// Serializes `object` and writes it to global `result`.
// Returns true on success, or false on invalid object.
//
function writeNode(state, level, object, block, compact, iskey, isblockseq) {
  state.tag = null;
  state.dump = object;

  if (!detectType(state, object, false)) {
    detectType(state, object, true);
  }

  var type = _toString.call(state.dump);
  var inblock = block;
  var tagStr;

  if (block) {
    block = (state.flowLevel < 0 || state.flowLevel > level);
  }

  var objectOrArray = type === '[object Object]' || type === '[object Array]',
      duplicateIndex,
      duplicate;

  if (objectOrArray) {
    duplicateIndex = state.duplicates.indexOf(object);
    duplicate = duplicateIndex !== -1;
  }

  if ((state.tag !== null && state.tag !== '?') || duplicate || (state.indent !== 2 && level > 0)) {
    compact = false;
  }

  if (duplicate && state.usedDuplicates[duplicateIndex]) {
    state.dump = '*ref_' + duplicateIndex;
  } else {
    if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {
      state.usedDuplicates[duplicateIndex] = true;
    }
    if (type === '[object Object]') {
      if (block && (Object.keys(state.dump).length !== 0)) {
        writeBlockMapping(state, level, state.dump, compact);
        if (duplicate) {
          state.dump = '&ref_' + duplicateIndex + state.dump;
        }
      } else {
        writeFlowMapping(state, level, state.dump);
        if (duplicate) {
          state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;
        }
      }
    } else if (type === '[object Array]') {
      if (block && (state.dump.length !== 0)) {
        if (state.noArrayIndent && !isblockseq && level > 0) {
          writeBlockSequence(state, level - 1, state.dump, compact);
        } else {
          writeBlockSequence(state, level, state.dump, compact);
        }
        if (duplicate) {
          state.dump = '&ref_' + duplicateIndex + state.dump;
        }
      } else {
        writeFlowSequence(state, level, state.dump);
        if (duplicate) {
          state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;
        }
      }
    } else if (type === '[object String]') {
      if (state.tag !== '?') {
        writeScalar(state, state.dump, level, iskey, inblock);
      }
    } else if (type === '[object Undefined]') {
      return false;
    } else {
      if (state.skipInvalid) return false;
      throw new exception('unacceptable kind of an object to dump ' + type);
    }

    if (state.tag !== null && state.tag !== '?') {
      // Need to encode all characters except those allowed by the spec:
      //
      // [35] ns-dec-digit    ::=  [#x30-#x39] /* 0-9 */
      // [36] ns-hex-digit    ::=  ns-dec-digit
      //                         | [#x41-#x46] /* A-F */ | [#x61-#x66] /* a-f */
      // [37] ns-ascii-letter ::=  [#x41-#x5A] /* A-Z */ | [#x61-#x7A] /* a-z */
      // [38] ns-word-char    ::=  ns-dec-digit | ns-ascii-letter | “-”
      // [39] ns-uri-char     ::=  “%” ns-hex-digit ns-hex-digit | ns-word-char | “#”
      //                         | “;” | “/” | “?” | “:” | “@” | “&” | “=” | “+” | “$” | “,”
      //                         | “_” | “.” | “!” | “~” | “*” | “'” | “(” | “)” | “[” | “]”
      //
      // Also need to encode '!' because it has special meaning (end of tag prefix).
      //
      tagStr = encodeURI(
        state.tag[0] === '!' ? state.tag.slice(1) : state.tag
      ).replace(/!/g, '%21');

      if (state.tag[0] === '!') {
        tagStr = '!' + tagStr;
      } else if (tagStr.slice(0, 18) === 'tag:yaml.org,2002:') {
        tagStr = '!!' + tagStr.slice(18);
      } else {
        tagStr = '!<' + tagStr + '>';
      }

      state.dump = tagStr + ' ' + state.dump;
    }
  }

  return true;
}

function getDuplicateReferences(object, state) {
  var objects = [],
      duplicatesIndexes = [],
      index,
      length;

  inspectNode(object, objects, duplicatesIndexes);

  for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {
    state.duplicates.push(objects[duplicatesIndexes[index]]);
  }
  state.usedDuplicates = new Array(length);
}

function inspectNode(object, objects, duplicatesIndexes) {
  var objectKeyList,
      index,
      length;

  if (object !== null && typeof object === 'object') {
    index = objects.indexOf(object);
    if (index !== -1) {
      if (duplicatesIndexes.indexOf(index) === -1) {
        duplicatesIndexes.push(index);
      }
    } else {
      objects.push(object);

      if (Array.isArray(object)) {
        for (index = 0, length = object.length; index < length; index += 1) {
          inspectNode(object[index], objects, duplicatesIndexes);
        }
      } else {
        objectKeyList = Object.keys(object);

        for (index = 0, length = objectKeyList.length; index < length; index += 1) {
          inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);
        }
      }
    }
  }
}

function dump$1(input, options) {
  options = options || {};

  var state = new State(options);

  if (!state.noRefs) getDuplicateReferences(input, state);

  var value = input;

  if (state.replacer) {
    value = state.replacer.call({ '': value }, '', value);
  }

  if (writeNode(state, 0, value, true, true)) return state.dump + '\n';

  return '';
}

var dump_1 = dump$1;

var dumper = {
	dump: dump_1
};

function renamed(from, to) {
  return function () {
    throw new Error('Function yaml.' + from + ' is removed in js-yaml 4. ' +
      'Use yaml.' + to + ' instead, which is now safe by default.');
  };
}


var Type                = type;
var Schema              = schema;
var FAILSAFE_SCHEMA     = failsafe;
var JSON_SCHEMA         = json;
var CORE_SCHEMA         = core;
var DEFAULT_SCHEMA      = _default;
var load                = loader.load;
var loadAll             = loader.loadAll;
var dump                = dumper.dump;
var YAMLException       = exception;

// Re-export all types in case user wants to create custom schema
var types = {
  binary:    binary,
  float:     float,
  map:       map,
  null:      _null,
  pairs:     pairs,
  set:       set,
  timestamp: timestamp,
  bool:      bool,
  int:       int,
  merge:     merge,
  omap:      omap,
  seq:       seq,
  str:       str
};

// Removed functions from JS-YAML 3.0.x
var safeLoad            = renamed('safeLoad', 'load');
var safeLoadAll         = renamed('safeLoadAll', 'loadAll');
var safeDump            = renamed('safeDump', 'dump');

var jsYaml = {
	Type: Type,
	Schema: Schema,
	FAILSAFE_SCHEMA: FAILSAFE_SCHEMA,
	JSON_SCHEMA: JSON_SCHEMA,
	CORE_SCHEMA: CORE_SCHEMA,
	DEFAULT_SCHEMA: DEFAULT_SCHEMA,
	load: load,
	loadAll: loadAll,
	dump: dump,
	YAMLException: YAMLException,
	types: types,
	safeLoad: safeLoad,
	safeLoadAll: safeLoadAll,
	safeDump: safeDump
};

export default jsYaml;
export { CORE_SCHEMA, DEFAULT_SCHEMA, FAILSAFE_SCHEMA, JSON_SCHEMA, Schema, Type, YAMLException, dump, load, loadAll, safeDump, safeLoad, safeLoadAll, types };
#!/usr/bin/env node


'use strict';

/*eslint-disable no-console*/


var fs       = require('fs');
var argparse = require('argparse');
var yaml     = require('..');


////////////////////////////////////////////////////////////////////////////////


var cli = new argparse.ArgumentParser({
  prog:     'js-yaml',
  add_help:  true
});

cli.add_argument('-v', '--version', {
  action: 'version',
  version: require('../package.json').version
});

cli.add_argument('-c', '--compact', {
  help:   'Display errors in compact mode',
  action: 'store_true'
});

// deprecated (not needed after we removed output colors)
// option suppressed, but not completely removed for compatibility
cli.add_argument('-j', '--to-json', {
  help:   argparse.SUPPRESS,
  dest:   'json',
  action: 'store_true'
});

cli.add_argument('-t', '--trace', {
  help:   'Show stack trace on error',
  action: 'store_true'
});

cli.add_argument('file', {
  help:   'File to read, utf-8 encoded without BOM',
  nargs:  '?',
  default: '-'
});


////////////////////////////////////////////////////////////////////////////////


var options = cli.parse_args();


////////////////////////////////////////////////////////////////////////////////

function readFile(filename, encoding, callback) {
  if (options.file === '-') {
    // read from stdin

    var chunks = [];

    process.stdin.on('data', function (chunk) {
      chunks.push(chunk);
    });

    process.stdin.on('end', function () {
      return callback(null, Buffer.concat(chunks).toString(encoding));
    });
  } else {
    fs.readFile(filename, encoding, callback);
  }
}

readFile(options.file, 'utf8', function (error, input) {
  var output, isYaml;

  if (error) {
    if (error.code === 'ENOENT') {
      console.error('File not found: ' + options.file);
      process.exit(2);
    }

    console.error(
      options.trace && error.stack ||
      error.message ||
      String(error));

    process.exit(1);
  }

  try {
    output = JSON.parse(input);
    isYaml = false;
  } catch (err) {
    if (err instanceof SyntaxError) {
      try {
        output = [];
        yaml.loadAll(input, function (doc) { output.push(doc); }, {});
        isYaml = true;

        if (output.length === 0) output = null;
        else if (output.length === 1) output = output[0];

      } catch (e) {
        if (options.trace && err.stack) console.error(e.stack);
        else console.error(e.toString(options.compact));

        process.exit(1);
      }
    } else {
      console.error(
        options.trace && err.stack ||
        err.message ||
        String(err));

      process.exit(1);
    }
  }

  if (isYaml) console.log(JSON.stringify(output, null, '  '));
  else console.log(yaml.dump(output));
});
The MIT License (MIT)

Copyright (c) 2014 Blake Embrey (hello@blakeembrey.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.
'use strict'

/**
 * Expose `arrayFlatten`.
 */
module.exports = arrayFlatten

/**
 * Recursive flatten function with depth.
 *
 * @param  {Array}  array
 * @param  {Array}  result
 * @param  {Number} depth
 * @return {Array}
 */
function flattenWithDepth (array, result, depth) {
  for (var i = 0; i < array.length; i++) {
    var value = array[i]

    if (depth > 0 && Array.isArray(value)) {
      flattenWithDepth(value, result, depth - 1)
    } else {
      result.push(value)
    }
  }

  return result
}

/**
 * Recursive flatten function. Omitting depth is slightly faster.
 *
 * @param  {Array} array
 * @param  {Array} result
 * @return {Array}
 */
function flattenForever (array, result) {
  for (var i = 0; i < array.length; i++) {
    var value = array[i]

    if (Array.isArray(value)) {
      flattenForever(value, result)
    } else {
      result.push(value)
    }
  }

  return result
}

/**
 * Flatten an array, with the ability to define a depth.
 *
 * @param  {Array}  array
 * @param  {Number} depth
 * @return {Array}
 */
function arrayFlatten (array, depth) {
  if (depth == null) {
    return flattenForever(array, [])
  }

  return flattenWithDepth(array, [], depth)
}
{
  "name": "array-flatten",
  "version": "1.1.1",
  "description": "Flatten an array of nested arrays into a single flat array",
  "main": "array-flatten.js",
  "files": [
    "array-flatten.js",
    "LICENSE"
  ],
  "repository": {
    "type": "git",
    "url": "git://github.com/blakeembrey/array-flatten.git"
  },
  "author": {
    "name": "Blake Embrey",
    "email": "hello@blakeembrey.com",
    "url": "http://blakeembrey.me"
  },
  "license": "MIT",
  "homepage": "https://github.com/blakeembrey/array-flatten",
  "devDependencies": {
    "istanbul": "^0.3.13",
    "mocha": "^2.2.4",
    "pre-commit": "^1.0.7",
    "standard": "^3.7.3"
  }
}(The MIT License)

Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca>

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.

# get Makefile directory name: http://stackoverflow.com/a/5982798/376773
THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)

# BIN directory
BIN := $(THIS_DIR)/node_modules/.bin

# Path
PATH := node_modules/.bin:$(PATH)
SHELL := /bin/bash

# applications
NODE ?= $(shell which node)
YARN ?= $(shell which yarn)
PKG ?= $(if $(YARN),$(YARN),$(NODE) $(shell which npm))
BROWSERIFY ?= $(NODE) $(BIN)/browserify

.FORCE:

install: node_modules

node_modules: package.json
	@NODE_ENV= $(PKG) install
	@touch node_modules

lint: .FORCE
	eslint browser.js debug.js index.js node.js

test-node: .FORCE
	istanbul cover node_modules/mocha/bin/_mocha -- test/**.js

test-browser: .FORCE
	mkdir -p dist

	@$(BROWSERIFY) \
		--standalone debug \
		. > dist/debug.js

	karma start --single-run
	rimraf dist

test: .FORCE
	concurrently \
		"make test-node" \
		"make test-browser"

coveralls:
	cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js

.PHONY: all install clean distclean
{
  "name": "debug",
  "repo": "visionmedia/debug",
  "description": "small debugging utility",
  "version": "2.6.9",
  "keywords": [
    "debug",
    "log",
    "debugger"
  ],
  "main": "src/browser.js",
  "scripts": [
    "src/browser.js",
    "src/debug.js"
  ],
  "dependencies": {
    "rauchg/ms.js": "0.7.1"
  }
}
module.exports = require('./src/node');
{
  "name": "debug",
  "version": "2.6.9",
  "repository": {
    "type": "git",
    "url": "git://github.com/visionmedia/debug.git"
  },
  "description": "small debugging utility",
  "author": "TJ Holowaychuk <tj@vision-media.ca>",
  "license": "MIT",
  "dependencies": {
    "ms": "2.0.0"
  },
  "devDependencies": {
    "browserify": "9.0.3",
    "chai": "^3.5.0",
    "concurrently": "^3.1.0",
    "coveralls": "^2.11.15",
    "eslint": "^3.12.1",
    "istanbul": "^0.4.5",
    "karma": "^1.3.0",
    "karma-chai": "^0.1.0",
    "karma-mocha": "^1.3.0",
    "karma-phantomjs-launcher": "^1.0.2",
    "karma-sinon": "^1.0.5",
    "mocha": "^3.2.0",
    "mocha-lcov-reporter": "^1.2.0",
    "rimraf": "^2.5.4",
    "sinon": "^1.17.6",
    "sinon-chai": "^2.8.0"
  },
  "main": "./src/index.js",
  "browser": "./src/browser.js",
  "component": {
    "scripts": {
      "debug/index.js": "browser.js",
      "debug/debug.js": "debug.js"
    }
  }
}/**
 * This is the web browser implementation of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = require('./debug');
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;
exports.storage = 'undefined' != typeof chrome
               && 'undefined' != typeof chrome.storage
                  ? chrome.storage.local
                  : localstorage();

/**
 * Colors.
 */

exports.colors = [
  'lightseagreen',
  'forestgreen',
  'goldenrod',
  'dodgerblue',
  'darkorchid',
  'crimson'
];

/**
 * Currently only WebKit-based Web Inspectors, Firefox >= v31,
 * and the Firebug extension (any Firefox version) are known
 * to support "%c" CSS customizations.
 *
 * TODO: add a `localStorage` variable to explicitly enable/disable colors
 */

function useColors() {
  // NB: In an Electron preload script, document will be defined but not fully
  // initialized. Since we know we're in Chrome, we'll just detect this case
  // explicitly
  if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {
    return true;
  }

  // is webkit? http://stackoverflow.com/a/16459606/376773
  // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
  return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
    // is firebug? http://stackoverflow.com/a/398120/376773
    (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
    // is firefox >= v31?
    // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
    // double check webkit in userAgent just in case we are in a worker
    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
}

/**
 * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
 */

exports.formatters.j = function(v) {
  try {
    return JSON.stringify(v);
  } catch (err) {
    return '[UnexpectedJSONParseError]: ' + err.message;
  }
};


/**
 * Colorize log arguments if enabled.
 *
 * @api public
 */

function formatArgs(args) {
  var useColors = this.useColors;

  args[0] = (useColors ? '%c' : '')
    + this.namespace
    + (useColors ? ' %c' : ' ')
    + args[0]
    + (useColors ? '%c ' : ' ')
    + '+' + exports.humanize(this.diff);

  if (!useColors) return;

  var c = 'color: ' + this.color;
  args.splice(1, 0, c, 'color: inherit')

  // the final "%c" is somewhat tricky, because there could be other
  // arguments passed either before or after the %c, so we need to
  // figure out the correct index to insert the CSS into
  var index = 0;
  var lastC = 0;
  args[0].replace(/%[a-zA-Z%]/g, function(match) {
    if ('%%' === match) return;
    index++;
    if ('%c' === match) {
      // we only are interested in the *last* %c
      // (the user may have provided their own)
      lastC = index;
    }
  });

  args.splice(lastC, 0, c);
}

/**
 * Invokes `console.log()` when available.
 * No-op when `console.log` is not a "function".
 *
 * @api public
 */

function log() {
  // this hackery is required for IE8/9, where
  // the `console.log` function doesn't have 'apply'
  return 'object' === typeof console
    && console.log
    && Function.prototype.apply.call(console.log, console, arguments);
}

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */

function save(namespaces) {
  try {
    if (null == namespaces) {
      exports.storage.removeItem('debug');
    } else {
      exports.storage.debug = namespaces;
    }
  } catch(e) {}
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */

function load() {
  var r;
  try {
    r = exports.storage.debug;
  } catch(e) {}

  // If debug isn't set in LS, and we're in Electron, try to load $DEBUG
  if (!r && typeof process !== 'undefined' && 'env' in process) {
    r = process.env.DEBUG;
  }

  return r;
}

/**
 * Enable namespaces listed in `localStorage.debug` initially.
 */

exports.enable(load());

/**
 * Localstorage attempts to return the localstorage.
 *
 * This is necessary because safari throws
 * when a user disables cookies/localstorage
 * and you attempt to access it.
 *
 * @return {LocalStorage}
 * @api private
 */

function localstorage() {
  try {
    return window.localStorage;
  } catch (e) {}
}

/**
 * This is the common logic for both the Node.js and web browser
 * implementations of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = createDebug.debug = createDebug['default'] = createDebug;
exports.coerce = coerce;
exports.disable = disable;
exports.enable = enable;
exports.enabled = enabled;
exports.humanize = require('ms');

/**
 * The currently active debug mode names, and names to skip.
 */

exports.names = [];
exports.skips = [];

/**
 * Map of special "%n" handling functions, for the debug "format" argument.
 *
 * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
 */

exports.formatters = {};

/**
 * Previous log timestamp.
 */

var prevTime;

/**
 * Select a color.
 * @param {String} namespace
 * @return {Number}
 * @api private
 */

function selectColor(namespace) {
  var hash = 0, i;

  for (i in namespace) {
    hash  = ((hash << 5) - hash) + namespace.charCodeAt(i);
    hash |= 0; // Convert to 32bit integer
  }

  return exports.colors[Math.abs(hash) % exports.colors.length];
}

/**
 * Create a debugger with the given `namespace`.
 *
 * @param {String} namespace
 * @return {Function}
 * @api public
 */

function createDebug(namespace) {

  function debug() {
    // disabled?
    if (!debug.enabled) return;

    var self = debug;

    // set `diff` timestamp
    var curr = +new Date();
    var ms = curr - (prevTime || curr);
    self.diff = ms;
    self.prev = prevTime;
    self.curr = curr;
    prevTime = curr;

    // turn the `arguments` into a proper Array
    var args = new Array(arguments.length);
    for (var i = 0; i < args.length; i++) {
      args[i] = arguments[i];
    }

    args[0] = exports.coerce(args[0]);

    if ('string' !== typeof args[0]) {
      // anything else let's inspect with %O
      args.unshift('%O');
    }

    // apply any `formatters` transformations
    var index = 0;
    args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {
      // if we encounter an escaped % then don't increase the array index
      if (match === '%%') return match;
      index++;
      var formatter = exports.formatters[format];
      if ('function' === typeof formatter) {
        var val = args[index];
        match = formatter.call(self, val);

        // now we need to remove `args[index]` since it's inlined in the `format`
        args.splice(index, 1);
        index--;
      }
      return match;
    });

    // apply env-specific formatting (colors, etc.)
    exports.formatArgs.call(self, args);

    var logFn = debug.log || exports.log || console.log.bind(console);
    logFn.apply(self, args);
  }

  debug.namespace = namespace;
  debug.enabled = exports.enabled(namespace);
  debug.useColors = exports.useColors();
  debug.color = selectColor(namespace);

  // env-specific initialization logic for debug instances
  if ('function' === typeof exports.init) {
    exports.init(debug);
  }

  return debug;
}

/**
 * Enables a debug mode by namespaces. This can include modes
 * separated by a colon and wildcards.
 *
 * @param {String} namespaces
 * @api public
 */

function enable(namespaces) {
  exports.save(namespaces);

  exports.names = [];
  exports.skips = [];

  var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
  var len = split.length;

  for (var i = 0; i < len; i++) {
    if (!split[i]) continue; // ignore empty strings
    namespaces = split[i].replace(/\*/g, '.*?');
    if (namespaces[0] === '-') {
      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
    } else {
      exports.names.push(new RegExp('^' + namespaces + '$'));
    }
  }
}

/**
 * Disable debug output.
 *
 * @api public
 */

function disable() {
  exports.enable('');
}

/**
 * Returns true if the given mode name is enabled, false otherwise.
 *
 * @param {String} name
 * @return {Boolean}
 * @api public
 */

function enabled(name) {
  var i, len;
  for (i = 0, len = exports.skips.length; i < len; i++) {
    if (exports.skips[i].test(name)) {
      return false;
    }
  }
  for (i = 0, len = exports.names.length; i < len; i++) {
    if (exports.names[i].test(name)) {
      return true;
    }
  }
  return false;
}

/**
 * Coerce `val`.
 *
 * @param {Mixed} val
 * @return {Mixed}
 * @api private
 */

function coerce(val) {
  if (val instanceof Error) return val.stack || val.message;
  return val;
}
/**
 * Detect Electron renderer process, which is node, but we should
 * treat as a browser.
 */

if (typeof process !== 'undefined' && process.type === 'renderer') {
  module.exports = require('./browser.js');
} else {
  module.exports = require('./node.js');
}
module.exports = inspectorLog;

// black hole
const nullStream = new (require('stream').Writable)();
nullStream._write = () => {};

/**
 * Outputs a `console.log()` to the Node.js Inspector console *only*.
 */
function inspectorLog() {
  const stdout = console._stdout;
  console._stdout = nullStream;
  console.log.apply(console, arguments);
  console._stdout = stdout;
}
/**
 * Module dependencies.
 */

var tty = require('tty');
var util = require('util');

/**
 * This is the Node.js implementation of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = require('./debug');
exports.init = init;
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;

/**
 * Colors.
 */

exports.colors = [6, 2, 3, 4, 5, 1];

/**
 * Build up the default `inspectOpts` object from the environment variables.
 *
 *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
 */

exports.inspectOpts = Object.keys(process.env).filter(function (key) {
  return /^debug_/i.test(key);
}).reduce(function (obj, key) {
  // camel-case
  var prop = key
    .substring(6)
    .toLowerCase()
    .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() });

  // coerce string value into JS value
  var val = process.env[key];
  if (/^(yes|on|true|enabled)$/i.test(val)) val = true;
  else if (/^(no|off|false|disabled)$/i.test(val)) val = false;
  else if (val === 'null') val = null;
  else val = Number(val);

  obj[prop] = val;
  return obj;
}, {});

/**
 * The file descriptor to write the `debug()` calls to.
 * Set the `DEBUG_FD` env variable to override with another value. i.e.:
 *
 *   $ DEBUG_FD=3 node script.js 3>debug.log
 */

var fd = parseInt(process.env.DEBUG_FD, 10) || 2;

if (1 !== fd && 2 !== fd) {
  util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')()
}

var stream = 1 === fd ? process.stdout :
             2 === fd ? process.stderr :
             createWritableStdioStream(fd);

/**
 * Is stdout a TTY? Colored output is enabled when `true`.
 */

function useColors() {
  return 'colors' in exports.inspectOpts
    ? Boolean(exports.inspectOpts.colors)
    : tty.isatty(fd);
}

/**
 * Map %o to `util.inspect()`, all on a single line.
 */

exports.formatters.o = function(v) {
  this.inspectOpts.colors = this.useColors;
  return util.inspect(v, this.inspectOpts)
    .split('\n').map(function(str) {
      return str.trim()
    }).join(' ');
};

/**
 * Map %o to `util.inspect()`, allowing multiple lines if needed.
 */

exports.formatters.O = function(v) {
  this.inspectOpts.colors = this.useColors;
  return util.inspect(v, this.inspectOpts);
};

/**
 * Adds ANSI color escape codes if enabled.
 *
 * @api public
 */

function formatArgs(args) {
  var name = this.namespace;
  var useColors = this.useColors;

  if (useColors) {
    var c = this.color;
    var prefix = '  \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m';

    args[0] = prefix + args[0].split('\n').join('\n' + prefix);
    args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m');
  } else {
    args[0] = new Date().toUTCString()
      + ' ' + name + ' ' + args[0];
  }
}

/**
 * Invokes `util.format()` with the specified arguments and writes to `stream`.
 */

function log() {
  return stream.write(util.format.apply(util, arguments) + '\n');
}

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */

function save(namespaces) {
  if (null == namespaces) {
    // If you set a process.env field to null or undefined, it gets cast to the
    // string 'null' or 'undefined'. Just delete instead.
    delete process.env.DEBUG;
  } else {
    process.env.DEBUG = namespaces;
  }
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */

function load() {
  return process.env.DEBUG;
}

/**
 * Copied from `node/src/node.js`.
 *
 * XXX: It's lame that node doesn't expose this API out-of-the-box. It also
 * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame.
 */

function createWritableStdioStream (fd) {
  var stream;
  var tty_wrap = process.binding('tty_wrap');

  // Note stream._type is used for test-module-load-list.js

  switch (tty_wrap.guessHandleType(fd)) {
    case 'TTY':
      stream = new tty.WriteStream(fd);
      stream._type = 'tty';

      // Hack to have stream not keep the event loop alive.
      // See https://github.com/joyent/node/issues/1726
      if (stream._handle && stream._handle.unref) {
        stream._handle.unref();
      }
      break;

    case 'FILE':
      var fs = require('fs');
      stream = new fs.SyncWriteStream(fd, { autoClose: false });
      stream._type = 'fs';
      break;

    case 'PIPE':
    case 'TCP':
      var net = require('net');
      stream = new net.Socket({
        fd: fd,
        readable: false,
        writable: true
      });

      // FIXME Should probably have an option in net.Socket to create a
      // stream from an existing fd which is writable only. But for now
      // we'll just add this hack and set the `readable` member to false.
      // Test: ./node test/fixtures/echo.js < /etc/passwd
      stream.readable = false;
      stream.read = null;
      stream._type = 'pipe';

      // FIXME Hack to have stream not keep the event loop alive.
      // See https://github.com/joyent/node/issues/1726
      if (stream._handle && stream._handle.unref) {
        stream._handle.unref();
      }
      break;

    default:
      // Probably an error on in uv_guess_handle()
      throw new Error('Implement me. Unknown stream file type!');
  }

  // For supporting legacy API we put the FD here.
  stream.fd = fd;

  stream._isStdio = true;

  return stream;
}

/**
 * Init logic for `debug` instances.
 *
 * Create a new `inspectOpts` object in case `useColors` is set
 * differently for a particular `debug` instance.
 */

function init (debug) {
  debug.inspectOpts = {};

  var keys = Object.keys(exports.inspectOpts);
  for (var i = 0; i < keys.length; i++) {
    debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
  }
}

/**
 * Enable namespaces listed in `process.env.DEBUG` initially.
 */

exports.enable(load());
/**
 * Helpers.
 */

var s = 1000;
var m = s * 60;
var h = m * 60;
var d = h * 24;
var y = d * 365.25;

/**
 * Parse or format the given `val`.
 *
 * Options:
 *
 *  - `long` verbose formatting [false]
 *
 * @param {String|Number} val
 * @param {Object} [options]
 * @throws {Error} throw an error if val is not a non-empty string or a number
 * @return {String|Number}
 * @api public
 */

module.exports = function(val, options) {
  options = options || {};
  var type = typeof val;
  if (type === 'string' && val.length > 0) {
    return parse(val);
  } else if (type === 'number' && isNaN(val) === false) {
    return options.long ? fmtLong(val) : fmtShort(val);
  }
  throw new Error(
    'val is not a non-empty string or a valid number. val=' +
      JSON.stringify(val)
  );
};

/**
 * Parse the given `str` and return milliseconds.
 *
 * @param {String} str
 * @return {Number}
 * @api private
 */

function parse(str) {
  str = String(str);
  if (str.length > 100) {
    return;
  }
  var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(
    str
  );
  if (!match) {
    return;
  }
  var n = parseFloat(match[1]);
  var type = (match[2] || 'ms').toLowerCase();
  switch (type) {
    case 'years':
    case 'year':
    case 'yrs':
    case 'yr':
    case 'y':
      return n * y;
    case 'days':
    case 'day':
    case 'd':
      return n * d;
    case 'hours':
    case 'hour':
    case 'hrs':
    case 'hr':
    case 'h':
      return n * h;
    case 'minutes':
    case 'minute':
    case 'mins':
    case 'min':
    case 'm':
      return n * m;
    case 'seconds':
    case 'second':
    case 'secs':
    case 'sec':
    case 's':
      return n * s;
    case 'milliseconds':
    case 'millisecond':
    case 'msecs':
    case 'msec':
    case 'ms':
      return n;
    default:
      return undefined;
  }
}

/**
 * Short format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtShort(ms) {
  if (ms >= d) {
    return Math.round(ms / d) + 'd';
  }
  if (ms >= h) {
    return Math.round(ms / h) + 'h';
  }
  if (ms >= m) {
    return Math.round(ms / m) + 'm';
  }
  if (ms >= s) {
    return Math.round(ms / s) + 's';
  }
  return ms + 'ms';
}

/**
 * Long format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtLong(ms) {
  return plural(ms, d, 'day') ||
    plural(ms, h, 'hour') ||
    plural(ms, m, 'minute') ||
    plural(ms, s, 'second') ||
    ms + ' ms';
}

/**
 * Pluralization helper.
 */

function plural(ms, n, name) {
  if (ms < n) {
    return;
  }
  if (ms < n * 1.5) {
    return Math.floor(ms / n) + ' ' + name;
  }
  return Math.ceil(ms / n) + ' ' + name + 's';
}
The MIT License (MIT)

Copyright (c) 2016 Zeit, Inc.

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": "ms",
  "version": "2.0.0",
  "description": "Tiny milisecond conversion utility",
  "repository": "zeit/ms",
  "main": "./index",
  "files": [
    "index.js"
  ],
  "lint-staged": {
    "*.js": [
      "npm run lint",
      "prettier --single-quote --write",
      "git add"
    ]
  },
  "license": "MIT",
  "devDependencies": {
    "eslint": "3.19.0",
    "expect.js": "0.3.1",
    "husky": "0.13.3",
    "lint-staged": "3.4.1",
    "mocha": "3.4.1"
  }
}root = true

[*]
indent_style = space
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 160
quote_type = single

[test/*]
max_line_length = off

[LICENSE.md]
indent_size = off

[*.md]
max_line_length = off

[*.json]
max_line_length = off

[Makefile]
max_line_length = off

[CHANGELOG.md]
indent_style = space
indent_size = 2

[LICENSE]
indent_size = 2
max_line_length = off

[coverage/**/*]
indent_size = off
indent_style = off
indent = off
max_line_length = off
{
	"all": true,
	"check-coverage": false,
	"reporter": ["text-summary", "text", "html", "json"],
	"lines": 86,
	"statements": 85.93,
	"functions": 82.43,
	"branches": 76.06,
	"exclude": [
		"coverage",
		"dist"
	]
}
BSD 3-Clause License

Copyright (c) 2014, Nathan LaFreniere and other [contributors](https://github.com/ljharb/qs/graphs/contributors)
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.

3. Neither the name of the copyright holder nor the names of its
   contributors may 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 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.
{
  "name": "qs",
  "description": "A querystring parser that supports nesting and arrays, with a depth limit",
  "homepage": "https://github.com/ljharb/qs",
  "version": "6.10.3",
  "repository": {
    "type": "git",
    "url": "https://github.com/ljharb/qs.git"
  },
  "funding": {
    "url": "https://github.com/sponsors/ljharb"
  },
  "main": "lib/index.js",
  "engines": {
    "node": ">=0.6"
  },
  "dependencies": {
    "side-channel": "^1.0.4"
  },
  "devDependencies": {
    "@ljharb/eslint-config": "^20.1.0",
    "aud": "^1.1.5",
    "browserify": "^16.5.2",
    "eclint": "^2.8.1",
    "eslint": "^8.6.0",
    "evalmd": "^0.0.19",
    "for-each": "^0.3.3",
    "has-symbols": "^1.0.2",
    "iconv-lite": "^0.5.1",
    "in-publish": "^2.0.1",
    "mkdirp": "^0.5.5",
    "nyc": "^10.3.2",
    "object-inspect": "^1.12.0",
    "qs-iconv": "^1.0.4",
    "safe-publish-latest": "^2.0.0",
    "safer-buffer": "^2.1.2",
    "tape": "^5.4.0"
  },
  "license": "BSD-3-Clause",
  "greenkeeper": {
    "ignore": [
      "iconv-lite",
      "mkdirp"
    ]
  }
}'use strict';

var replace = String.prototype.replace;
var percentTwenties = /%20/g;

var Format = {
    RFC1738: 'RFC1738',
    RFC3986: 'RFC3986'
};

module.exports = {
    'default': Format.RFC3986,
    formatters: {
        RFC1738: function (value) {
            return replace.call(value, percentTwenties, '+');
        },
        RFC3986: function (value) {
            return String(value);
        }
    },
    RFC1738: Format.RFC1738,
    RFC3986: Format.RFC3986
};
'use strict';

var stringify = require('./stringify');
var parse = require('./parse');
var formats = require('./formats');

module.exports = {
    formats: formats,
    parse: parse,
    stringify: stringify
};
'use strict';

var utils = require('./utils');

var has = Object.prototype.hasOwnProperty;
var isArray = Array.isArray;

var defaults = {
    allowDots: false,
    allowPrototypes: false,
    allowSparse: false,
    arrayLimit: 20,
    charset: 'utf-8',
    charsetSentinel: false,
    comma: false,
    decoder: utils.decode,
    delimiter: '&',
    depth: 5,
    ignoreQueryPrefix: false,
    interpretNumericEntities: false,
    parameterLimit: 1000,
    parseArrays: true,
    plainObjects: false,
    strictNullHandling: false
};

var interpretNumericEntities = function (str) {
    return str.replace(/&#(\d+);/g, function ($0, numberStr) {
        return String.fromCharCode(parseInt(numberStr, 10));
    });
};

var parseArrayValue = function (val, options) {
    if (val && typeof val === 'string' && options.comma && val.indexOf(',') > -1) {
        return val.split(',');
    }

    return val;
};

// This is what browsers will submit when the ✓ character occurs in an
// application/x-www-form-urlencoded body and the encoding of the page containing
// the form is iso-8859-1, or when the submitted form has an accept-charset
// attribute of iso-8859-1. Presumably also with other charsets that do not contain
// the ✓ character, such as us-ascii.
var isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('&#10003;')

// These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded.
var charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓')

var parseValues = function parseQueryStringValues(str, options) {
    var obj = {};
    var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str;
    var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit;
    var parts = cleanStr.split(options.delimiter, limit);
    var skipIndex = -1; // Keep track of where the utf8 sentinel was found
    var i;

    var charset = options.charset;
    if (options.charsetSentinel) {
        for (i = 0; i < parts.length; ++i) {
            if (parts[i].indexOf('utf8=') === 0) {
                if (parts[i] === charsetSentinel) {
                    charset = 'utf-8';
                } else if (parts[i] === isoSentinel) {
                    charset = 'iso-8859-1';
                }
                skipIndex = i;
                i = parts.length; // The eslint settings do not allow break;
            }
        }
    }

    for (i = 0; i < parts.length; ++i) {
        if (i === skipIndex) {
            continue;
        }
        var part = parts[i];

        var bracketEqualsPos = part.indexOf(']=');
        var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;

        var key, val;
        if (pos === -1) {
            key = options.decoder(part, defaults.decoder, charset, 'key');
            val = options.strictNullHandling ? null : '';
        } else {
            key = options.decoder(part.slice(0, pos), defaults.decoder, charset, 'key');
            val = utils.maybeMap(
                parseArrayValue(part.slice(pos + 1), options),
                function (encodedVal) {
                    return options.decoder(encodedVal, defaults.decoder, charset, 'value');
                }
            );
        }

        if (val && options.interpretNumericEntities && charset === 'iso-8859-1') {
            val = interpretNumericEntities(val);
        }

        if (part.indexOf('[]=') > -1) {
            val = isArray(val) ? [val] : val;
        }

        if (has.call(obj, key)) {
            obj[key] = utils.combine(obj[key], val);
        } else {
            obj[key] = val;
        }
    }

    return obj;
};

var parseObject = function (chain, val, options, valuesParsed) {
    var leaf = valuesParsed ? val : parseArrayValue(val, options);

    for (var i = chain.length - 1; i >= 0; --i) {
        var obj;
        var root = chain[i];

        if (root === '[]' && options.parseArrays) {
            obj = [].concat(leaf);
        } else {
            obj = options.plainObjects ? Object.create(null) : {};
            var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;
            var index = parseInt(cleanRoot, 10);
            if (!options.parseArrays && cleanRoot === '') {
                obj = { 0: leaf };
            } else if (
                !isNaN(index)
                && root !== cleanRoot
                && String(index) === cleanRoot
                && index >= 0
                && (options.parseArrays && index <= options.arrayLimit)
            ) {
                obj = [];
                obj[index] = leaf;
            } else if (cleanRoot !== '__proto__') {
                obj[cleanRoot] = leaf;
            }
        }

        leaf = obj;
    }

    return leaf;
};

var parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) {
    if (!givenKey) {
        return;
    }

    // Transform dot notation to bracket notation
    var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey;

    // The regex chunks

    var brackets = /(\[[^[\]]*])/;
    var child = /(\[[^[\]]*])/g;

    // Get the parent

    var segment = options.depth > 0 && brackets.exec(key);
    var parent = segment ? key.slice(0, segment.index) : key;

    // Stash the parent if it exists

    var keys = [];
    if (parent) {
        // If we aren't using plain objects, optionally prefix keys that would overwrite object prototype properties
        if (!options.plainObjects && has.call(Object.prototype, parent)) {
            if (!options.allowPrototypes) {
                return;
            }
        }

        keys.push(parent);
    }

    // Loop through children appending to the array until we hit depth

    var i = 0;
    while (options.depth > 0 && (segment = child.exec(key)) !== null && i < options.depth) {
        i += 1;
        if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) {
            if (!options.allowPrototypes) {
                return;
            }
        }
        keys.push(segment[1]);
    }

    // If there's a remainder, just add whatever is left

    if (segment) {
        keys.push('[' + key.slice(segment.index) + ']');
    }

    return parseObject(keys, val, options, valuesParsed);
};

var normalizeParseOptions = function normalizeParseOptions(opts) {
    if (!opts) {
        return defaults;
    }

    if (opts.decoder !== null && opts.decoder !== undefined && typeof opts.decoder !== 'function') {
        throw new TypeError('Decoder has to be a function.');
    }

    if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {
        throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');
    }
    var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset;

    return {
        allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots,
        allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes,
        allowSparse: typeof opts.allowSparse === 'boolean' ? opts.allowSparse : defaults.allowSparse,
        arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit,
        charset: charset,
        charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,
        comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma,
        decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder,
        delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter,
        // eslint-disable-next-line no-implicit-coercion, no-extra-parens
        depth: (typeof opts.depth === 'number' || opts.depth === false) ? +opts.depth : defaults.depth,
        ignoreQueryPrefix: opts.ignoreQueryPrefix === true,
        interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities,
        parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit,
        parseArrays: opts.parseArrays !== false,
        plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects,
        strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling
    };
};

module.exports = function (str, opts) {
    var options = normalizeParseOptions(opts);

    if (str === '' || str === null || typeof str === 'undefined') {
        return options.plainObjects ? Object.create(null) : {};
    }

    var tempObj = typeof str === 'string' ? parseValues(str, options) : str;
    var obj = options.plainObjects ? Object.create(null) : {};

    // Iterate over the keys and setup the new object

    var keys = Object.keys(tempObj);
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        var newObj = parseKeys(key, tempObj[key], options, typeof str === 'string');
        obj = utils.merge(obj, newObj, options);
    }

    if (options.allowSparse === true) {
        return obj;
    }

    return utils.compact(obj);
};
'use strict';

var getSideChannel = require('side-channel');
var utils = require('./utils');
var formats = require('./formats');
var has = Object.prototype.hasOwnProperty;

var arrayPrefixGenerators = {
    brackets: function brackets(prefix) {
        return prefix + '[]';
    },
    comma: 'comma',
    indices: function indices(prefix, key) {
        return prefix + '[' + key + ']';
    },
    repeat: function repeat(prefix) {
        return prefix;
    }
};

var isArray = Array.isArray;
var split = String.prototype.split;
var push = Array.prototype.push;
var pushToArray = function (arr, valueOrArray) {
    push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]);
};

var toISO = Date.prototype.toISOString;

var defaultFormat = formats['default'];
var defaults = {
    addQueryPrefix: false,
    allowDots: false,
    charset: 'utf-8',
    charsetSentinel: false,
    delimiter: '&',
    encode: true,
    encoder: utils.encode,
    encodeValuesOnly: false,
    format: defaultFormat,
    formatter: formats.formatters[defaultFormat],
    // deprecated
    indices: false,
    serializeDate: function serializeDate(date) {
        return toISO.call(date);
    },
    skipNulls: false,
    strictNullHandling: false
};

var isNonNullishPrimitive = function isNonNullishPrimitive(v) {
    return typeof v === 'string'
        || typeof v === 'number'
        || typeof v === 'boolean'
        || typeof v === 'symbol'
        || typeof v === 'bigint';
};

var sentinel = {};

var stringify = function stringify(
    object,
    prefix,
    generateArrayPrefix,
    strictNullHandling,
    skipNulls,
    encoder,
    filter,
    sort,
    allowDots,
    serializeDate,
    format,
    formatter,
    encodeValuesOnly,
    charset,
    sideChannel
) {
    var obj = object;

    var tmpSc = sideChannel;
    var step = 0;
    var findFlag = false;
    while ((tmpSc = tmpSc.get(sentinel)) !== void undefined && !findFlag) {
        // Where object last appeared in the ref tree
        var pos = tmpSc.get(object);
        step += 1;
        if (typeof pos !== 'undefined') {
            if (pos === step) {
                throw new RangeError('Cyclic object value');
            } else {
                findFlag = true; // Break while
            }
        }
        if (typeof tmpSc.get(sentinel) === 'undefined') {
            step = 0;
        }
    }

    if (typeof filter === 'function') {
        obj = filter(prefix, obj);
    } else if (obj instanceof Date) {
        obj = serializeDate(obj);
    } else if (generateArrayPrefix === 'comma' && isArray(obj)) {
        obj = utils.maybeMap(obj, function (value) {
            if (value instanceof Date) {
                return serializeDate(value);
            }
            return value;
        });
    }

    if (obj === null) {
        if (strictNullHandling) {
            return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key', format) : prefix;
        }

        obj = '';
    }

    if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) {
        if (encoder) {
            var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset, 'key', format);
            if (generateArrayPrefix === 'comma' && encodeValuesOnly) {
                var valuesArray = split.call(String(obj), ',');
                var valuesJoined = '';
                for (var i = 0; i < valuesArray.length; ++i) {
                    valuesJoined += (i === 0 ? '' : ',') + formatter(encoder(valuesArray[i], defaults.encoder, charset, 'value', format));
                }
                return [formatter(keyValue) + '=' + valuesJoined];
            }
            return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset, 'value', format))];
        }
        return [formatter(prefix) + '=' + formatter(String(obj))];
    }

    var values = [];

    if (typeof obj === 'undefined') {
        return values;
    }

    var objKeys;
    if (generateArrayPrefix === 'comma' && isArray(obj)) {
        // we need to join elements in
        objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }];
    } else if (isArray(filter)) {
        objKeys = filter;
    } else {
        var keys = Object.keys(obj);
        objKeys = sort ? keys.sort(sort) : keys;
    }

    for (var j = 0; j < objKeys.length; ++j) {
        var key = objKeys[j];
        var value = typeof key === 'object' && typeof key.value !== 'undefined' ? key.value : obj[key];

        if (skipNulls && value === null) {
            continue;
        }

        var keyPrefix = isArray(obj)
            ? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(prefix, key) : prefix
            : prefix + (allowDots ? '.' + key : '[' + key + ']');

        sideChannel.set(object, step);
        var valueSideChannel = getSideChannel();
        valueSideChannel.set(sentinel, sideChannel);
        pushToArray(values, stringify(
            value,
            keyPrefix,
            generateArrayPrefix,
            strictNullHandling,
            skipNulls,
            encoder,
            filter,
            sort,
            allowDots,
            serializeDate,
            format,
            formatter,
            encodeValuesOnly,
            charset,
            valueSideChannel
        ));
    }

    return values;
};

var normalizeStringifyOptions = function normalizeStringifyOptions(opts) {
    if (!opts) {
        return defaults;
    }

    if (opts.encoder !== null && typeof opts.encoder !== 'undefined' && typeof opts.encoder !== 'function') {
        throw new TypeError('Encoder has to be a function.');
    }

    var charset = opts.charset || defaults.charset;
    if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {
        throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');
    }

    var format = formats['default'];
    if (typeof opts.format !== 'undefined') {
        if (!has.call(formats.formatters, opts.format)) {
            throw new TypeError('Unknown format option provided.');
        }
        format = opts.format;
    }
    var formatter = formats.formatters[format];

    var filter = defaults.filter;
    if (typeof opts.filter === 'function' || isArray(opts.filter)) {
        filter = opts.filter;
    }

    return {
        addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix,
        allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots,
        charset: charset,
        charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,
        delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter,
        encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode,
        encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder,
        encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly,
        filter: filter,
        format: format,
        formatter: formatter,
        serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate,
        skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls,
        sort: typeof opts.sort === 'function' ? opts.sort : null,
        strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling
    };
};

module.exports = function (object, opts) {
    var obj = object;
    var options = normalizeStringifyOptions(opts);

    var objKeys;
    var filter;

    if (typeof options.filter === 'function') {
        filter = options.filter;
        obj = filter('', obj);
    } else if (isArray(options.filter)) {
        filter = options.filter;
        objKeys = filter;
    }

    var keys = [];

    if (typeof obj !== 'object' || obj === null) {
        return '';
    }

    var arrayFormat;
    if (opts && opts.arrayFormat in arrayPrefixGenerators) {
        arrayFormat = opts.arrayFormat;
    } else if (opts && 'indices' in opts) {
        arrayFormat = opts.indices ? 'indices' : 'repeat';
    } else {
        arrayFormat = 'indices';
    }

    var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];

    if (!objKeys) {
        objKeys = Object.keys(obj);
    }

    if (options.sort) {
        objKeys.sort(options.sort);
    }

    var sideChannel = getSideChannel();
    for (var i = 0; i < objKeys.length; ++i) {
        var key = objKeys[i];

        if (options.skipNulls && obj[key] === null) {
            continue;
        }
        pushToArray(keys, stringify(
            obj[key],
            key,
            generateArrayPrefix,
            options.strictNullHandling,
            options.skipNulls,
            options.encode ? options.encoder : null,
            options.filter,
            options.sort,
            options.allowDots,
            options.serializeDate,
            options.format,
            options.formatter,
            options.encodeValuesOnly,
            options.charset,
            sideChannel
        ));
    }

    var joined = keys.join(options.delimiter);
    var prefix = options.addQueryPrefix === true ? '?' : '';

    if (options.charsetSentinel) {
        if (options.charset === 'iso-8859-1') {
            // encodeURIComponent('&#10003;'), the "numeric entity" representation of a checkmark
            prefix += 'utf8=%26%2310003%3B&';
        } else {
            // encodeURIComponent('✓')
            prefix += 'utf8=%E2%9C%93&';
        }
    }

    return joined.length > 0 ? prefix + joined : '';
};
'use strict';

var formats = require('./formats');

var has = Object.prototype.hasOwnProperty;
var isArray = Array.isArray;

var hexTable = (function () {
    var array = [];
    for (var i = 0; i < 256; ++i) {
        array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());
    }

    return array;
}());

var compactQueue = function compactQueue(queue) {
    while (queue.length > 1) {
        var item = queue.pop();
        var obj = item.obj[item.prop];

        if (isArray(obj)) {
            var compacted = [];

            for (var j = 0; j < obj.length; ++j) {
                if (typeof obj[j] !== 'undefined') {
                    compacted.push(obj[j]);
                }
            }

            item.obj[item.prop] = compacted;
        }
    }
};

var arrayToObject = function arrayToObject(source, options) {
    var obj = options && options.plainObjects ? Object.create(null) : {};
    for (var i = 0; i < source.length; ++i) {
        if (typeof source[i] !== 'undefined') {
            obj[i] = source[i];
        }
    }

    return obj;
};

var merge = function merge(target, source, options) {
    /* eslint no-param-reassign: 0 */
    if (!source) {
        return target;
    }

    if (typeof source !== 'object') {
        if (isArray(target)) {
            target.push(source);
        } else if (target && typeof target === 'object') {
            if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) {
                target[source] = true;
            }
        } else {
            return [target, source];
        }

        return target;
    }

    if (!target || typeof target !== 'object') {
        return [target].concat(source);
    }

    var mergeTarget = target;
    if (isArray(target) && !isArray(source)) {
        mergeTarget = arrayToObject(target, options);
    }

    if (isArray(target) && isArray(source)) {
        source.forEach(function (item, i) {
            if (has.call(target, i)) {
                var targetItem = target[i];
                if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') {
                    target[i] = merge(targetItem, item, options);
                } else {
                    target.push(item);
                }
            } else {
                target[i] = item;
            }
        });
        return target;
    }

    return Object.keys(source).reduce(function (acc, key) {
        var value = source[key];

        if (has.call(acc, key)) {
            acc[key] = merge(acc[key], value, options);
        } else {
            acc[key] = value;
        }
        return acc;
    }, mergeTarget);
};

var assign = function assignSingleSource(target, source) {
    return Object.keys(source).reduce(function (acc, key) {
        acc[key] = source[key];
        return acc;
    }, target);
};

var decode = function (str, decoder, charset) {
    var strWithoutPlus = str.replace(/\+/g, ' ');
    if (charset === 'iso-8859-1') {
        // unescape never throws, no try...catch needed:
        return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape);
    }
    // utf-8
    try {
        return decodeURIComponent(strWithoutPlus);
    } catch (e) {
        return strWithoutPlus;
    }
};

var encode = function encode(str, defaultEncoder, charset, kind, format) {
    // This code was originally written by Brian White (mscdex) for the io.js core querystring library.
    // It has been adapted here for stricter adherence to RFC 3986
    if (str.length === 0) {
        return str;
    }

    var string = str;
    if (typeof str === 'symbol') {
        string = Symbol.prototype.toString.call(str);
    } else if (typeof str !== 'string') {
        string = String(str);
    }

    if (charset === 'iso-8859-1') {
        return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) {
            return '%26%23' + parseInt($0.slice(2), 16) + '%3B';
        });
    }

    var out = '';
    for (var i = 0; i < string.length; ++i) {
        var c = string.charCodeAt(i);

        if (
            c === 0x2D // -
            || c === 0x2E // .
            || c === 0x5F // _
            || c === 0x7E // ~
            || (c >= 0x30 && c <= 0x39) // 0-9
            || (c >= 0x41 && c <= 0x5A) // a-z
            || (c >= 0x61 && c <= 0x7A) // A-Z
            || (format === formats.RFC1738 && (c === 0x28 || c === 0x29)) // ( )
        ) {
            out += string.charAt(i);
            continue;
        }

        if (c < 0x80) {
            out = out + hexTable[c];
            continue;
        }

        if (c < 0x800) {
            out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);
            continue;
        }

        if (c < 0xD800 || c >= 0xE000) {
            out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);
            continue;
        }

        i += 1;
        c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));
        /* eslint operator-linebreak: [2, "before"] */
        out += hexTable[0xF0 | (c >> 18)]
            + hexTable[0x80 | ((c >> 12) & 0x3F)]
            + hexTable[0x80 | ((c >> 6) & 0x3F)]
            + hexTable[0x80 | (c & 0x3F)];
    }

    return out;
};

var compact = function compact(value) {
    var queue = [{ obj: { o: value }, prop: 'o' }];
    var refs = [];

    for (var i = 0; i < queue.length; ++i) {
        var item = queue[i];
        var obj = item.obj[item.prop];

        var keys = Object.keys(obj);
        for (var j = 0; j < keys.length; ++j) {
            var key = keys[j];
            var val = obj[key];
            if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {
                queue.push({ obj: obj, prop: key });
                refs.push(val);
            }
        }
    }

    compactQueue(queue);

    return value;
};

var isRegExp = function isRegExp(obj) {
    return Object.prototype.toString.call(obj) === '[object RegExp]';
};

var isBuffer = function isBuffer(obj) {
    if (!obj || typeof obj !== 'object') {
        return false;
    }

    return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));
};

var combine = function combine(a, b) {
    return [].concat(a, b);
};

var maybeMap = function maybeMap(val, fn) {
    if (isArray(val)) {
        var mapped = [];
        for (var i = 0; i < val.length; i += 1) {
            mapped.push(fn(val[i]));
        }
        return mapped;
    }
    return fn(val);
};

module.exports = {
    arrayToObject: arrayToObject,
    assign: assign,
    combine: combine,
    compact: compact,
    decode: decode,
    encode: encode,
    isBuffer: isBuffer,
    isRegExp: isRegExp,
    maybeMap: maybeMap,
    merge: merge
};
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Qs = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
'use strict';

var replace = String.prototype.replace;
var percentTwenties = /%20/g;

var Format = {
    RFC1738: 'RFC1738',
    RFC3986: 'RFC3986'
};

module.exports = {
    'default': Format.RFC3986,
    formatters: {
        RFC1738: function (value) {
            return replace.call(value, percentTwenties, '+');
        },
        RFC3986: function (value) {
            return String(value);
        }
    },
    RFC1738: Format.RFC1738,
    RFC3986: Format.RFC3986
};

},{}],2:[function(require,module,exports){
'use strict';

var stringify = require('./stringify');
var parse = require('./parse');
var formats = require('./formats');

module.exports = {
    formats: formats,
    parse: parse,
    stringify: stringify
};

},{"./formats":1,"./parse":3,"./stringify":4}],3:[function(require,module,exports){
'use strict';

var utils = require('./utils');

var has = Object.prototype.hasOwnProperty;
var isArray = Array.isArray;

var defaults = {
    allowDots: false,
    allowPrototypes: false,
    allowSparse: false,
    arrayLimit: 20,
    charset: 'utf-8',
    charsetSentinel: false,
    comma: false,
    decoder: utils.decode,
    delimiter: '&',
    depth: 5,
    ignoreQueryPrefix: false,
    interpretNumericEntities: false,
    parameterLimit: 1000,
    parseArrays: true,
    plainObjects: false,
    strictNullHandling: false
};

var interpretNumericEntities = function (str) {
    return str.replace(/&#(\d+);/g, function ($0, numberStr) {
        return String.fromCharCode(parseInt(numberStr, 10));
    });
};

var parseArrayValue = function (val, options) {
    if (val && typeof val === 'string' && options.comma && val.indexOf(',') > -1) {
        return val.split(',');
    }

    return val;
};

// This is what browsers will submit when the ✓ character occurs in an
// application/x-www-form-urlencoded body and the encoding of the page containing
// the form is iso-8859-1, or when the submitted form has an accept-charset
// attribute of iso-8859-1. Presumably also with other charsets that do not contain
// the ✓ character, such as us-ascii.
var isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('&#10003;')

// These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded.
var charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓')

var parseValues = function parseQueryStringValues(str, options) {
    var obj = {};
    var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str;
    var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit;
    var parts = cleanStr.split(options.delimiter, limit);
    var skipIndex = -1; // Keep track of where the utf8 sentinel was found
    var i;

    var charset = options.charset;
    if (options.charsetSentinel) {
        for (i = 0; i < parts.length; ++i) {
            if (parts[i].indexOf('utf8=') === 0) {
                if (parts[i] === charsetSentinel) {
                    charset = 'utf-8';
                } else if (parts[i] === isoSentinel) {
                    charset = 'iso-8859-1';
                }
                skipIndex = i;
                i = parts.length; // The eslint settings do not allow break;
            }
        }
    }

    for (i = 0; i < parts.length; ++i) {
        if (i === skipIndex) {
            continue;
        }
        var part = parts[i];

        var bracketEqualsPos = part.indexOf(']=');
        var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;

        var key, val;
        if (pos === -1) {
            key = options.decoder(part, defaults.decoder, charset, 'key');
            val = options.strictNullHandling ? null : '';
        } else {
            key = options.decoder(part.slice(0, pos), defaults.decoder, charset, 'key');
            val = utils.maybeMap(
                parseArrayValue(part.slice(pos + 1), options),
                function (encodedVal) {
                    return options.decoder(encodedVal, defaults.decoder, charset, 'value');
                }
            );
        }

        if (val && options.interpretNumericEntities && charset === 'iso-8859-1') {
            val = interpretNumericEntities(val);
        }

        if (part.indexOf('[]=') > -1) {
            val = isArray(val) ? [val] : val;
        }

        if (has.call(obj, key)) {
            obj[key] = utils.combine(obj[key], val);
        } else {
            obj[key] = val;
        }
    }

    return obj;
};

var parseObject = function (chain, val, options, valuesParsed) {
    var leaf = valuesParsed ? val : parseArrayValue(val, options);

    for (var i = chain.length - 1; i >= 0; --i) {
        var obj;
        var root = chain[i];

        if (root === '[]' && options.parseArrays) {
            obj = [].concat(leaf);
        } else {
            obj = options.plainObjects ? Object.create(null) : {};
            var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;
            var index = parseInt(cleanRoot, 10);
            if (!options.parseArrays && cleanRoot === '') {
                obj = { 0: leaf };
            } else if (
                !isNaN(index)
                && root !== cleanRoot
                && String(index) === cleanRoot
                && index >= 0
                && (options.parseArrays && index <= options.arrayLimit)
            ) {
                obj = [];
                obj[index] = leaf;
            } else if (cleanRoot !== '__proto__') {
                obj[cleanRoot] = leaf;
            }
        }

        leaf = obj;
    }

    return leaf;
};

var parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) {
    if (!givenKey) {
        return;
    }

    // Transform dot notation to bracket notation
    var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey;

    // The regex chunks

    var brackets = /(\[[^[\]]*])/;
    var child = /(\[[^[\]]*])/g;

    // Get the parent

    var segment = options.depth > 0 && brackets.exec(key);
    var parent = segment ? key.slice(0, segment.index) : key;

    // Stash the parent if it exists

    var keys = [];
    if (parent) {
        // If we aren't using plain objects, optionally prefix keys that would overwrite object prototype properties
        if (!options.plainObjects && has.call(Object.prototype, parent)) {
            if (!options.allowPrototypes) {
                return;
            }
        }

        keys.push(parent);
    }

    // Loop through children appending to the array until we hit depth

    var i = 0;
    while (options.depth > 0 && (segment = child.exec(key)) !== null && i < options.depth) {
        i += 1;
        if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) {
            if (!options.allowPrototypes) {
                return;
            }
        }
        keys.push(segment[1]);
    }

    // If there's a remainder, just add whatever is left

    if (segment) {
        keys.push('[' + key.slice(segment.index) + ']');
    }

    return parseObject(keys, val, options, valuesParsed);
};

var normalizeParseOptions = function normalizeParseOptions(opts) {
    if (!opts) {
        return defaults;
    }

    if (opts.decoder !== null && opts.decoder !== undefined && typeof opts.decoder !== 'function') {
        throw new TypeError('Decoder has to be a function.');
    }

    if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {
        throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');
    }
    var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset;

    return {
        allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots,
        allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes,
        allowSparse: typeof opts.allowSparse === 'boolean' ? opts.allowSparse : defaults.allowSparse,
        arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit,
        charset: charset,
        charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,
        comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma,
        decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder,
        delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter,
        // eslint-disable-next-line no-implicit-coercion, no-extra-parens
        depth: (typeof opts.depth === 'number' || opts.depth === false) ? +opts.depth : defaults.depth,
        ignoreQueryPrefix: opts.ignoreQueryPrefix === true,
        interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities,
        parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit,
        parseArrays: opts.parseArrays !== false,
        plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects,
        strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling
    };
};

module.exports = function (str, opts) {
    var options = normalizeParseOptions(opts);

    if (str === '' || str === null || typeof str === 'undefined') {
        return options.plainObjects ? Object.create(null) : {};
    }

    var tempObj = typeof str === 'string' ? parseValues(str, options) : str;
    var obj = options.plainObjects ? Object.create(null) : {};

    // Iterate over the keys and setup the new object

    var keys = Object.keys(tempObj);
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        var newObj = parseKeys(key, tempObj[key], options, typeof str === 'string');
        obj = utils.merge(obj, newObj, options);
    }

    if (options.allowSparse === true) {
        return obj;
    }

    return utils.compact(obj);
};

},{"./utils":5}],4:[function(require,module,exports){
'use strict';

var getSideChannel = require('side-channel');
var utils = require('./utils');
var formats = require('./formats');
var has = Object.prototype.hasOwnProperty;

var arrayPrefixGenerators = {
    brackets: function brackets(prefix) {
        return prefix + '[]';
    },
    comma: 'comma',
    indices: function indices(prefix, key) {
        return prefix + '[' + key + ']';
    },
    repeat: function repeat(prefix) {
        return prefix;
    }
};

var isArray = Array.isArray;
var split = String.prototype.split;
var push = Array.prototype.push;
var pushToArray = function (arr, valueOrArray) {
    push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]);
};

var toISO = Date.prototype.toISOString;

var defaultFormat = formats['default'];
var defaults = {
    addQueryPrefix: false,
    allowDots: false,
    charset: 'utf-8',
    charsetSentinel: false,
    delimiter: '&',
    encode: true,
    encoder: utils.encode,
    encodeValuesOnly: false,
    format: defaultFormat,
    formatter: formats.formatters[defaultFormat],
    // deprecated
    indices: false,
    serializeDate: function serializeDate(date) {
        return toISO.call(date);
    },
    skipNulls: false,
    strictNullHandling: false
};

var isNonNullishPrimitive = function isNonNullishPrimitive(v) {
    return typeof v === 'string'
        || typeof v === 'number'
        || typeof v === 'boolean'
        || typeof v === 'symbol'
        || typeof v === 'bigint';
};

var sentinel = {};

var stringify = function stringify(
    object,
    prefix,
    generateArrayPrefix,
    strictNullHandling,
    skipNulls,
    encoder,
    filter,
    sort,
    allowDots,
    serializeDate,
    format,
    formatter,
    encodeValuesOnly,
    charset,
    sideChannel
) {
    var obj = object;

    var tmpSc = sideChannel;
    var step = 0;
    var findFlag = false;
    while ((tmpSc = tmpSc.get(sentinel)) !== void undefined && !findFlag) {
        // Where object last appeared in the ref tree
        var pos = tmpSc.get(object);
        step += 1;
        if (typeof pos !== 'undefined') {
            if (pos === step) {
                throw new RangeError('Cyclic object value');
            } else {
                findFlag = true; // Break while
            }
        }
        if (typeof tmpSc.get(sentinel) === 'undefined') {
            step = 0;
        }
    }

    if (typeof filter === 'function') {
        obj = filter(prefix, obj);
    } else if (obj instanceof Date) {
        obj = serializeDate(obj);
    } else if (generateArrayPrefix === 'comma' && isArray(obj)) {
        obj = utils.maybeMap(obj, function (value) {
            if (value instanceof Date) {
                return serializeDate(value);
            }
            return value;
        });
    }

    if (obj === null) {
        if (strictNullHandling) {
            return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key', format) : prefix;
        }

        obj = '';
    }

    if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) {
        if (encoder) {
            var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset, 'key', format);
            if (generateArrayPrefix === 'comma' && encodeValuesOnly) {
                var valuesArray = split.call(String(obj), ',');
                var valuesJoined = '';
                for (var i = 0; i < valuesArray.length; ++i) {
                    valuesJoined += (i === 0 ? '' : ',') + formatter(encoder(valuesArray[i], defaults.encoder, charset, 'value', format));
                }
                return [formatter(keyValue) + '=' + valuesJoined];
            }
            return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset, 'value', format))];
        }
        return [formatter(prefix) + '=' + formatter(String(obj))];
    }

    var values = [];

    if (typeof obj === 'undefined') {
        return values;
    }

    var objKeys;
    if (generateArrayPrefix === 'comma' && isArray(obj)) {
        // we need to join elements in
        objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }];
    } else if (isArray(filter)) {
        objKeys = filter;
    } else {
        var keys = Object.keys(obj);
        objKeys = sort ? keys.sort(sort) : keys;
    }

    for (var j = 0; j < objKeys.length; ++j) {
        var key = objKeys[j];
        var value = typeof key === 'object' && typeof key.value !== 'undefined' ? key.value : obj[key];

        if (skipNulls && value === null) {
            continue;
        }

        var keyPrefix = isArray(obj)
            ? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(prefix, key) : prefix
            : prefix + (allowDots ? '.' + key : '[' + key + ']');

        sideChannel.set(object, step);
        var valueSideChannel = getSideChannel();
        valueSideChannel.set(sentinel, sideChannel);
        pushToArray(values, stringify(
            value,
            keyPrefix,
            generateArrayPrefix,
            strictNullHandling,
            skipNulls,
            encoder,
            filter,
            sort,
            allowDots,
            serializeDate,
            format,
            formatter,
            encodeValuesOnly,
            charset,
            valueSideChannel
        ));
    }

    return values;
};

var normalizeStringifyOptions = function normalizeStringifyOptions(opts) {
    if (!opts) {
        return defaults;
    }

    if (opts.encoder !== null && typeof opts.encoder !== 'undefined' && typeof opts.encoder !== 'function') {
        throw new TypeError('Encoder has to be a function.');
    }

    var charset = opts.charset || defaults.charset;
    if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {
        throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');
    }

    var format = formats['default'];
    if (typeof opts.format !== 'undefined') {
        if (!has.call(formats.formatters, opts.format)) {
            throw new TypeError('Unknown format option provided.');
        }
        format = opts.format;
    }
    var formatter = formats.formatters[format];

    var filter = defaults.filter;
    if (typeof opts.filter === 'function' || isArray(opts.filter)) {
        filter = opts.filter;
    }

    return {
        addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix,
        allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots,
        charset: charset,
        charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,
        delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter,
        encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode,
        encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder,
        encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly,
        filter: filter,
        format: format,
        formatter: formatter,
        serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate,
        skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls,
        sort: typeof opts.sort === 'function' ? opts.sort : null,
        strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling
    };
};

module.exports = function (object, opts) {
    var obj = object;
    var options = normalizeStringifyOptions(opts);

    var objKeys;
    var filter;

    if (typeof options.filter === 'function') {
        filter = options.filter;
        obj = filter('', obj);
    } else if (isArray(options.filter)) {
        filter = options.filter;
        objKeys = filter;
    }

    var keys = [];

    if (typeof obj !== 'object' || obj === null) {
        return '';
    }

    var arrayFormat;
    if (opts && opts.arrayFormat in arrayPrefixGenerators) {
        arrayFormat = opts.arrayFormat;
    } else if (opts && 'indices' in opts) {
        arrayFormat = opts.indices ? 'indices' : 'repeat';
    } else {
        arrayFormat = 'indices';
    }

    var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];

    if (!objKeys) {
        objKeys = Object.keys(obj);
    }

    if (options.sort) {
        objKeys.sort(options.sort);
    }

    var sideChannel = getSideChannel();
    for (var i = 0; i < objKeys.length; ++i) {
        var key = objKeys[i];

        if (options.skipNulls && obj[key] === null) {
            continue;
        }
        pushToArray(keys, stringify(
            obj[key],
            key,
            generateArrayPrefix,
            options.strictNullHandling,
            options.skipNulls,
            options.encode ? options.encoder : null,
            options.filter,
            options.sort,
            options.allowDots,
            options.serializeDate,
            options.format,
            options.formatter,
            options.encodeValuesOnly,
            options.charset,
            sideChannel
        ));
    }

    var joined = keys.join(options.delimiter);
    var prefix = options.addQueryPrefix === true ? '?' : '';

    if (options.charsetSentinel) {
        if (options.charset === 'iso-8859-1') {
            // encodeURIComponent('&#10003;'), the "numeric entity" representation of a checkmark
            prefix += 'utf8=%26%2310003%3B&';
        } else {
            // encodeURIComponent('✓')
            prefix += 'utf8=%E2%9C%93&';
        }
    }

    return joined.length > 0 ? prefix + joined : '';
};

},{"./formats":1,"./utils":5,"side-channel":16}],5:[function(require,module,exports){
'use strict';

var formats = require('./formats');

var has = Object.prototype.hasOwnProperty;
var isArray = Array.isArray;

var hexTable = (function () {
    var array = [];
    for (var i = 0; i < 256; ++i) {
        array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());
    }

    return array;
}());

var compactQueue = function compactQueue(queue) {
    while (queue.length > 1) {
        var item = queue.pop();
        var obj = item.obj[item.prop];

        if (isArray(obj)) {
            var compacted = [];

            for (var j = 0; j < obj.length; ++j) {
                if (typeof obj[j] !== 'undefined') {
                    compacted.push(obj[j]);
                }
            }

            item.obj[item.prop] = compacted;
        }
    }
};

var arrayToObject = function arrayToObject(source, options) {
    var obj = options && options.plainObjects ? Object.create(null) : {};
    for (var i = 0; i < source.length; ++i) {
        if (typeof source[i] !== 'undefined') {
            obj[i] = source[i];
        }
    }

    return obj;
};

var merge = function merge(target, source, options) {
    /* eslint no-param-reassign: 0 */
    if (!source) {
        return target;
    }

    if (typeof source !== 'object') {
        if (isArray(target)) {
            target.push(source);
        } else if (target && typeof target === 'object') {
            if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) {
                target[source] = true;
            }
        } else {
            return [target, source];
        }

        return target;
    }

    if (!target || typeof target !== 'object') {
        return [target].concat(source);
    }

    var mergeTarget = target;
    if (isArray(target) && !isArray(source)) {
        mergeTarget = arrayToObject(target, options);
    }

    if (isArray(target) && isArray(source)) {
        source.forEach(function (item, i) {
            if (has.call(target, i)) {
                var targetItem = target[i];
                if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') {
                    target[i] = merge(targetItem, item, options);
                } else {
                    target.push(item);
                }
            } else {
                target[i] = item;
            }
        });
        return target;
    }

    return Object.keys(source).reduce(function (acc, key) {
        var value = source[key];

        if (has.call(acc, key)) {
            acc[key] = merge(acc[key], value, options);
        } else {
            acc[key] = value;
        }
        return acc;
    }, mergeTarget);
};

var assign = function assignSingleSource(target, source) {
    return Object.keys(source).reduce(function (acc, key) {
        acc[key] = source[key];
        return acc;
    }, target);
};

var decode = function (str, decoder, charset) {
    var strWithoutPlus = str.replace(/\+/g, ' ');
    if (charset === 'iso-8859-1') {
        // unescape never throws, no try...catch needed:
        return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape);
    }
    // utf-8
    try {
        return decodeURIComponent(strWithoutPlus);
    } catch (e) {
        return strWithoutPlus;
    }
};

var encode = function encode(str, defaultEncoder, charset, kind, format) {
    // This code was originally written by Brian White (mscdex) for the io.js core querystring library.
    // It has been adapted here for stricter adherence to RFC 3986
    if (str.length === 0) {
        return str;
    }

    var string = str;
    if (typeof str === 'symbol') {
        string = Symbol.prototype.toString.call(str);
    } else if (typeof str !== 'string') {
        string = String(str);
    }

    if (charset === 'iso-8859-1') {
        return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) {
            return '%26%23' + parseInt($0.slice(2), 16) + '%3B';
        });
    }

    var out = '';
    for (var i = 0; i < string.length; ++i) {
        var c = string.charCodeAt(i);

        if (
            c === 0x2D // -
            || c === 0x2E // .
            || c === 0x5F // _
            || c === 0x7E // ~
            || (c >= 0x30 && c <= 0x39) // 0-9
            || (c >= 0x41 && c <= 0x5A) // a-z
            || (c >= 0x61 && c <= 0x7A) // A-Z
            || (format === formats.RFC1738 && (c === 0x28 || c === 0x29)) // ( )
        ) {
            out += string.charAt(i);
            continue;
        }

        if (c < 0x80) {
            out = out + hexTable[c];
            continue;
        }

        if (c < 0x800) {
            out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);
            continue;
        }

        if (c < 0xD800 || c >= 0xE000) {
            out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);
            continue;
        }

        i += 1;
        c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));
        /* eslint operator-linebreak: [2, "before"] */
        out += hexTable[0xF0 | (c >> 18)]
            + hexTable[0x80 | ((c >> 12) & 0x3F)]
            + hexTable[0x80 | ((c >> 6) & 0x3F)]
            + hexTable[0x80 | (c & 0x3F)];
    }

    return out;
};

var compact = function compact(value) {
    var queue = [{ obj: { o: value }, prop: 'o' }];
    var refs = [];

    for (var i = 0; i < queue.length; ++i) {
        var item = queue[i];
        var obj = item.obj[item.prop];

        var keys = Object.keys(obj);
        for (var j = 0; j < keys.length; ++j) {
            var key = keys[j];
            var val = obj[key];
            if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {
                queue.push({ obj: obj, prop: key });
                refs.push(val);
            }
        }
    }

    compactQueue(queue);

    return value;
};

var isRegExp = function isRegExp(obj) {
    return Object.prototype.toString.call(obj) === '[object RegExp]';
};

var isBuffer = function isBuffer(obj) {
    if (!obj || typeof obj !== 'object') {
        return false;
    }

    return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));
};

var combine = function combine(a, b) {
    return [].concat(a, b);
};

var maybeMap = function maybeMap(val, fn) {
    if (isArray(val)) {
        var mapped = [];
        for (var i = 0; i < val.length; i += 1) {
            mapped.push(fn(val[i]));
        }
        return mapped;
    }
    return fn(val);
};

module.exports = {
    arrayToObject: arrayToObject,
    assign: assign,
    combine: combine,
    compact: compact,
    decode: decode,
    encode: encode,
    isBuffer: isBuffer,
    isRegExp: isRegExp,
    maybeMap: maybeMap,
    merge: merge
};

},{"./formats":1}],6:[function(require,module,exports){

},{}],7:[function(require,module,exports){
'use strict';

var GetIntrinsic = require('get-intrinsic');

var callBind = require('./');

var $indexOf = callBind(GetIntrinsic('String.prototype.indexOf'));

module.exports = function callBoundIntrinsic(name, allowMissing) {
	var intrinsic = GetIntrinsic(name, !!allowMissing);
	if (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) {
		return callBind(intrinsic);
	}
	return intrinsic;
};

},{"./":8,"get-intrinsic":11}],8:[function(require,module,exports){
'use strict';

var bind = require('function-bind');
var GetIntrinsic = require('get-intrinsic');

var $apply = GetIntrinsic('%Function.prototype.apply%');
var $call = GetIntrinsic('%Function.prototype.call%');
var $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply);

var $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%', true);
var $defineProperty = GetIntrinsic('%Object.defineProperty%', true);
var $max = GetIntrinsic('%Math.max%');

if ($defineProperty) {
	try {
		$defineProperty({}, 'a', { value: 1 });
	} catch (e) {
		// IE 8 has a broken defineProperty
		$defineProperty = null;
	}
}

module.exports = function callBind(originalFunction) {
	var func = $reflectApply(bind, $call, arguments);
	if ($gOPD && $defineProperty) {
		var desc = $gOPD(func, 'length');
		if (desc.configurable) {
			// original length, plus the receiver, minus any additional arguments (after the receiver)
			$defineProperty(
				func,
				'length',
				{ value: 1 + $max(0, originalFunction.length - (arguments.length - 1)) }
			);
		}
	}
	return func;
};

var applyBind = function applyBind() {
	return $reflectApply(bind, $apply, arguments);
};

if ($defineProperty) {
	$defineProperty(module.exports, 'apply', { value: applyBind });
} else {
	module.exports.apply = applyBind;
}

},{"function-bind":10,"get-intrinsic":11}],9:[function(require,module,exports){
'use strict';

/* eslint no-invalid-this: 1 */

var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
var slice = Array.prototype.slice;
var toStr = Object.prototype.toString;
var funcType = '[object Function]';

module.exports = function bind(that) {
    var target = this;
    if (typeof target !== 'function' || toStr.call(target) !== funcType) {
        throw new TypeError(ERROR_MESSAGE + target);
    }
    var args = slice.call(arguments, 1);

    var bound;
    var binder = function () {
        if (this instanceof bound) {
            var result = target.apply(
                this,
                args.concat(slice.call(arguments))
            );
            if (Object(result) === result) {
                return result;
            }
            return this;
        } else {
            return target.apply(
                that,
                args.concat(slice.call(arguments))
            );
        }
    };

    var boundLength = Math.max(0, target.length - args.length);
    var boundArgs = [];
    for (var i = 0; i < boundLength; i++) {
        boundArgs.push('$' + i);
    }

    bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);

    if (target.prototype) {
        var Empty = function Empty() {};
        Empty.prototype = target.prototype;
        bound.prototype = new Empty();
        Empty.prototype = null;
    }

    return bound;
};

},{}],10:[function(require,module,exports){
'use strict';

var implementation = require('./implementation');

module.exports = Function.prototype.bind || implementation;

},{"./implementation":9}],11:[function(require,module,exports){
'use strict';

var undefined;

var $SyntaxError = SyntaxError;
var $Function = Function;
var $TypeError = TypeError;

// eslint-disable-next-line consistent-return
var getEvalledConstructor = function (expressionSyntax) {
	try {
		return $Function('"use strict"; return (' + expressionSyntax + ').constructor;')();
	} catch (e) {}
};

var $gOPD = Object.getOwnPropertyDescriptor;
if ($gOPD) {
	try {
		$gOPD({}, '');
	} catch (e) {
		$gOPD = null; // this is IE 8, which has a broken gOPD
	}
}

var throwTypeError = function () {
	throw new $TypeError();
};
var ThrowTypeError = $gOPD
	? (function () {
		try {
			// eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties
			arguments.callee; // IE 8 does not throw here
			return throwTypeError;
		} catch (calleeThrows) {
			try {
				// IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '')
				return $gOPD(arguments, 'callee').get;
			} catch (gOPDthrows) {
				return throwTypeError;
			}
		}
	}())
	: throwTypeError;

var hasSymbols = require('has-symbols')();

var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto

var needsEval = {};

var TypedArray = typeof Uint8Array === 'undefined' ? undefined : getProto(Uint8Array);

var INTRINSICS = {
	'%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError,
	'%Array%': Array,
	'%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,
	'%ArrayIteratorPrototype%': hasSymbols ? getProto([][Symbol.iterator]()) : undefined,
	'%AsyncFromSyncIteratorPrototype%': undefined,
	'%AsyncFunction%': needsEval,
	'%AsyncGenerator%': needsEval,
	'%AsyncGeneratorFunction%': needsEval,
	'%AsyncIteratorPrototype%': needsEval,
	'%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,
	'%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt,
	'%Boolean%': Boolean,
	'%DataView%': typeof DataView === 'undefined' ? undefined : DataView,
	'%Date%': Date,
	'%decodeURI%': decodeURI,
	'%decodeURIComponent%': decodeURIComponent,
	'%encodeURI%': encodeURI,
	'%encodeURIComponent%': encodeURIComponent,
	'%Error%': Error,
	'%eval%': eval, // eslint-disable-line no-eval
	'%EvalError%': EvalError,
	'%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,
	'%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,
	'%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry,
	'%Function%': $Function,
	'%GeneratorFunction%': needsEval,
	'%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,
	'%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,
	'%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,
	'%isFinite%': isFinite,
	'%isNaN%': isNaN,
	'%IteratorPrototype%': hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined,
	'%JSON%': typeof JSON === 'object' ? JSON : undefined,
	'%Map%': typeof Map === 'undefined' ? undefined : Map,
	'%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols ? undefined : getProto(new Map()[Symbol.iterator]()),
	'%Math%': Math,
	'%Number%': Number,
	'%Object%': Object,
	'%parseFloat%': parseFloat,
	'%parseInt%': parseInt,
	'%Promise%': typeof Promise === 'undefined' ? undefined : Promise,
	'%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,
	'%RangeError%': RangeError,
	'%ReferenceError%': ReferenceError,
	'%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,
	'%RegExp%': RegExp,
	'%Set%': typeof Set === 'undefined' ? undefined : Set,
	'%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols ? undefined : getProto(new Set()[Symbol.iterator]()),
	'%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,
	'%String%': String,
	'%StringIteratorPrototype%': hasSymbols ? getProto(''[Symbol.iterator]()) : undefined,
	'%Symbol%': hasSymbols ? Symbol : undefined,
	'%SyntaxError%': $SyntaxError,
	'%ThrowTypeError%': ThrowTypeError,
	'%TypedArray%': TypedArray,
	'%TypeError%': $TypeError,
	'%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,
	'%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,
	'%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,
	'%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,
	'%URIError%': URIError,
	'%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,
	'%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef,
	'%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet
};

var doEval = function doEval(name) {
	var value;
	if (name === '%AsyncFunction%') {
		value = getEvalledConstructor('async function () {}');
	} else if (name === '%GeneratorFunction%') {
		value = getEvalledConstructor('function* () {}');
	} else if (name === '%AsyncGeneratorFunction%') {
		value = getEvalledConstructor('async function* () {}');
	} else if (name === '%AsyncGenerator%') {
		var fn = doEval('%AsyncGeneratorFunction%');
		if (fn) {
			value = fn.prototype;
		}
	} else if (name === '%AsyncIteratorPrototype%') {
		var gen = doEval('%AsyncGenerator%');
		if (gen) {
			value = getProto(gen.prototype);
		}
	}

	INTRINSICS[name] = value;

	return value;
};

var LEGACY_ALIASES = {
	'%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'],
	'%ArrayPrototype%': ['Array', 'prototype'],
	'%ArrayProto_entries%': ['Array', 'prototype', 'entries'],
	'%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'],
	'%ArrayProto_keys%': ['Array', 'prototype', 'keys'],
	'%ArrayProto_values%': ['Array', 'prototype', 'values'],
	'%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'],
	'%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'],
	'%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'],
	'%BooleanPrototype%': ['Boolean', 'prototype'],
	'%DataViewPrototype%': ['DataView', 'prototype'],
	'%DatePrototype%': ['Date', 'prototype'],
	'%ErrorPrototype%': ['Error', 'prototype'],
	'%EvalErrorPrototype%': ['EvalError', 'prototype'],
	'%Float32ArrayPrototype%': ['Float32Array', 'prototype'],
	'%Float64ArrayPrototype%': ['Float64Array', 'prototype'],
	'%FunctionPrototype%': ['Function', 'prototype'],
	'%Generator%': ['GeneratorFunction', 'prototype'],
	'%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'],
	'%Int8ArrayPrototype%': ['Int8Array', 'prototype'],
	'%Int16ArrayPrototype%': ['Int16Array', 'prototype'],
	'%Int32ArrayPrototype%': ['Int32Array', 'prototype'],
	'%JSONParse%': ['JSON', 'parse'],
	'%JSONStringify%': ['JSON', 'stringify'],
	'%MapPrototype%': ['Map', 'prototype'],
	'%NumberPrototype%': ['Number', 'prototype'],
	'%ObjectPrototype%': ['Object', 'prototype'],
	'%ObjProto_toString%': ['Object', 'prototype', 'toString'],
	'%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'],
	'%PromisePrototype%': ['Promise', 'prototype'],
	'%PromiseProto_then%': ['Promise', 'prototype', 'then'],
	'%Promise_all%': ['Promise', 'all'],
	'%Promise_reject%': ['Promise', 'reject'],
	'%Promise_resolve%': ['Promise', 'resolve'],
	'%RangeErrorPrototype%': ['RangeError', 'prototype'],
	'%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'],
	'%RegExpPrototype%': ['RegExp', 'prototype'],
	'%SetPrototype%': ['Set', 'prototype'],
	'%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'],
	'%StringPrototype%': ['String', 'prototype'],
	'%SymbolPrototype%': ['Symbol', 'prototype'],
	'%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'],
	'%TypedArrayPrototype%': ['TypedArray', 'prototype'],
	'%TypeErrorPrototype%': ['TypeError', 'prototype'],
	'%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'],
	'%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'],
	'%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'],
	'%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'],
	'%URIErrorPrototype%': ['URIError', 'prototype'],
	'%WeakMapPrototype%': ['WeakMap', 'prototype'],
	'%WeakSetPrototype%': ['WeakSet', 'prototype']
};

var bind = require('function-bind');
var hasOwn = require('has');
var $concat = bind.call(Function.call, Array.prototype.concat);
var $spliceApply = bind.call(Function.apply, Array.prototype.splice);
var $replace = bind.call(Function.call, String.prototype.replace);
var $strSlice = bind.call(Function.call, String.prototype.slice);

/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */
var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g;
var reEscapeChar = /\\(\\)?/g; /** Used to match backslashes in property paths. */
var stringToPath = function stringToPath(string) {
	var first = $strSlice(string, 0, 1);
	var last = $strSlice(string, -1);
	if (first === '%' && last !== '%') {
		throw new $SyntaxError('invalid intrinsic syntax, expected closing `%`');
	} else if (last === '%' && first !== '%') {
		throw new $SyntaxError('invalid intrinsic syntax, expected opening `%`');
	}
	var result = [];
	$replace(string, rePropName, function (match, number, quote, subString) {
		result[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match;
	});
	return result;
};
/* end adaptation */

var getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {
	var intrinsicName = name;
	var alias;
	if (hasOwn(LEGACY_ALIASES, intrinsicName)) {
		alias = LEGACY_ALIASES[intrinsicName];
		intrinsicName = '%' + alias[0] + '%';
	}

	if (hasOwn(INTRINSICS, intrinsicName)) {
		var value = INTRINSICS[intrinsicName];
		if (value === needsEval) {
			value = doEval(intrinsicName);
		}
		if (typeof value === 'undefined' && !allowMissing) {
			throw new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');
		}

		return {
			alias: alias,
			name: intrinsicName,
			value: value
		};
	}

	throw new $SyntaxError('intrinsic ' + name + ' does not exist!');
};

module.exports = function GetIntrinsic(name, allowMissing) {
	if (typeof name !== 'string' || name.length === 0) {
		throw new $TypeError('intrinsic name must be a non-empty string');
	}
	if (arguments.length > 1 && typeof allowMissing !== 'boolean') {
		throw new $TypeError('"allowMissing" argument must be a boolean');
	}

	var parts = stringToPath(name);
	var intrinsicBaseName = parts.length > 0 ? parts[0] : '';

	var intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing);
	var intrinsicRealName = intrinsic.name;
	var value = intrinsic.value;
	var skipFurtherCaching = false;

	var alias = intrinsic.alias;
	if (alias) {
		intrinsicBaseName = alias[0];
		$spliceApply(parts, $concat([0, 1], alias));
	}

	for (var i = 1, isOwn = true; i < parts.length; i += 1) {
		var part = parts[i];
		var first = $strSlice(part, 0, 1);
		var last = $strSlice(part, -1);
		if (
			(
				(first === '"' || first === "'" || first === '`')
				|| (last === '"' || last === "'" || last === '`')
			)
			&& first !== last
		) {
			throw new $SyntaxError('property names with quotes must have matching quotes');
		}
		if (part === 'constructor' || !isOwn) {
			skipFurtherCaching = true;
		}

		intrinsicBaseName += '.' + part;
		intrinsicRealName = '%' + intrinsicBaseName + '%';

		if (hasOwn(INTRINSICS, intrinsicRealName)) {
			value = INTRINSICS[intrinsicRealName];
		} else if (value != null) {
			if (!(part in value)) {
				if (!allowMissing) {
					throw new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.');
				}
				return void undefined;
			}
			if ($gOPD && (i + 1) >= parts.length) {
				var desc = $gOPD(value, part);
				isOwn = !!desc;

				// By convention, when a data property is converted to an accessor
				// property to emulate a data property that does not suffer from
				// the override mistake, that accessor's getter is marked with
				// an `originalValue` property. Here, when we detect this, we
				// uphold the illusion by pretending to see that original data
				// property, i.e., returning the value rather than the getter
				// itself.
				if (isOwn && 'get' in desc && !('originalValue' in desc.get)) {
					value = desc.get;
				} else {
					value = value[part];
				}
			} else {
				isOwn = hasOwn(value, part);
				value = value[part];
			}

			if (isOwn && !skipFurtherCaching) {
				INTRINSICS[intrinsicRealName] = value;
			}
		}
	}
	return value;
};

},{"function-bind":10,"has":14,"has-symbols":12}],12:[function(require,module,exports){
'use strict';

var origSymbol = typeof Symbol !== 'undefined' && Symbol;
var hasSymbolSham = require('./shams');

module.exports = function hasNativeSymbols() {
	if (typeof origSymbol !== 'function') { return false; }
	if (typeof Symbol !== 'function') { return false; }
	if (typeof origSymbol('foo') !== 'symbol') { return false; }
	if (typeof Symbol('bar') !== 'symbol') { return false; }

	return hasSymbolSham();
};

},{"./shams":13}],13:[function(require,module,exports){
'use strict';

/* eslint complexity: [2, 18], max-statements: [2, 33] */
module.exports = function hasSymbols() {
	if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
	if (typeof Symbol.iterator === 'symbol') { return true; }

	var obj = {};
	var sym = Symbol('test');
	var symObj = Object(sym);
	if (typeof sym === 'string') { return false; }

	if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }
	if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }

	// temp disabled per https://github.com/ljharb/object.assign/issues/17
	// if (sym instanceof Symbol) { return false; }
	// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
	// if (!(symObj instanceof Symbol)) { return false; }

	// if (typeof Symbol.prototype.toString !== 'function') { return false; }
	// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }

	var symVal = 42;
	obj[sym] = symVal;
	for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop
	if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }

	if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }

	var syms = Object.getOwnPropertySymbols(obj);
	if (syms.length !== 1 || syms[0] !== sym) { return false; }

	if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }

	if (typeof Object.getOwnPropertyDescriptor === 'function') {
		var descriptor = Object.getOwnPropertyDescriptor(obj, sym);
		if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
	}

	return true;
};

},{}],14:[function(require,module,exports){
'use strict';

var bind = require('function-bind');

module.exports = bind.call(Function.call, Object.prototype.hasOwnProperty);

},{"function-bind":10}],15:[function(require,module,exports){
var hasMap = typeof Map === 'function' && Map.prototype;
var mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, 'size') : null;
var mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === 'function' ? mapSizeDescriptor.get : null;
var mapForEach = hasMap && Map.prototype.forEach;
var hasSet = typeof Set === 'function' && Set.prototype;
var setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, 'size') : null;
var setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === 'function' ? setSizeDescriptor.get : null;
var setForEach = hasSet && Set.prototype.forEach;
var hasWeakMap = typeof WeakMap === 'function' && WeakMap.prototype;
var weakMapHas = hasWeakMap ? WeakMap.prototype.has : null;
var hasWeakSet = typeof WeakSet === 'function' && WeakSet.prototype;
var weakSetHas = hasWeakSet ? WeakSet.prototype.has : null;
var hasWeakRef = typeof WeakRef === 'function' && WeakRef.prototype;
var weakRefDeref = hasWeakRef ? WeakRef.prototype.deref : null;
var booleanValueOf = Boolean.prototype.valueOf;
var objectToString = Object.prototype.toString;
var functionToString = Function.prototype.toString;
var $match = String.prototype.match;
var $slice = String.prototype.slice;
var $replace = String.prototype.replace;
var $toUpperCase = String.prototype.toUpperCase;
var $toLowerCase = String.prototype.toLowerCase;
var $test = RegExp.prototype.test;
var $concat = Array.prototype.concat;
var $join = Array.prototype.join;
var $arrSlice = Array.prototype.slice;
var $floor = Math.floor;
var bigIntValueOf = typeof BigInt === 'function' ? BigInt.prototype.valueOf : null;
var gOPS = Object.getOwnPropertySymbols;
var symToString = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? Symbol.prototype.toString : null;
var hasShammedSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'object';
// ie, `has-tostringtag/shams
var toStringTag = typeof Symbol === 'function' && Symbol.toStringTag && (typeof Symbol.toStringTag === hasShammedSymbols ? 'object' : 'symbol')
    ? Symbol.toStringTag
    : null;
var isEnumerable = Object.prototype.propertyIsEnumerable;

var gPO = (typeof Reflect === 'function' ? Reflect.getPrototypeOf : Object.getPrototypeOf) || (
    [].__proto__ === Array.prototype // eslint-disable-line no-proto
        ? function (O) {
            return O.__proto__; // eslint-disable-line no-proto
        }
        : null
);

function addNumericSeparator(num, str) {
    if (
        num === Infinity
        || num === -Infinity
        || num !== num
        || (num && num > -1000 && num < 1000)
        || $test.call(/e/, str)
    ) {
        return str;
    }
    var sepRegex = /[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;
    if (typeof num === 'number') {
        var int = num < 0 ? -$floor(-num) : $floor(num); // trunc(num)
        if (int !== num) {
            var intStr = String(int);
            var dec = $slice.call(str, intStr.length + 1);
            return $replace.call(intStr, sepRegex, '$&_') + '.' + $replace.call($replace.call(dec, /([0-9]{3})/g, '$&_'), /_$/, '');
        }
    }
    return $replace.call(str, sepRegex, '$&_');
}

var inspectCustom = require('./util.inspect').custom;
var inspectSymbol = inspectCustom && isSymbol(inspectCustom) ? inspectCustom : null;

module.exports = function inspect_(obj, options, depth, seen) {
    var opts = options || {};

    if (has(opts, 'quoteStyle') && (opts.quoteStyle !== 'single' && opts.quoteStyle !== 'double')) {
        throw new TypeError('option "quoteStyle" must be "single" or "double"');
    }
    if (
        has(opts, 'maxStringLength') && (typeof opts.maxStringLength === 'number'
            ? opts.maxStringLength < 0 && opts.maxStringLength !== Infinity
            : opts.maxStringLength !== null
        )
    ) {
        throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');
    }
    var customInspect = has(opts, 'customInspect') ? opts.customInspect : true;
    if (typeof customInspect !== 'boolean' && customInspect !== 'symbol') {
        throw new TypeError('option "customInspect", if provided, must be `true`, `false`, or `\'symbol\'`');
    }

    if (
        has(opts, 'indent')
        && opts.indent !== null
        && opts.indent !== '\t'
        && !(parseInt(opts.indent, 10) === opts.indent && opts.indent > 0)
    ) {
        throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');
    }
    if (has(opts, 'numericSeparator') && typeof opts.numericSeparator !== 'boolean') {
        throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');
    }
    var numericSeparator = opts.numericSeparator;

    if (typeof obj === 'undefined') {
        return 'undefined';
    }
    if (obj === null) {
        return 'null';
    }
    if (typeof obj === 'boolean') {
        return obj ? 'true' : 'false';
    }

    if (typeof obj === 'string') {
        return inspectString(obj, opts);
    }
    if (typeof obj === 'number') {
        if (obj === 0) {
            return Infinity / obj > 0 ? '0' : '-0';
        }
        var str = String(obj);
        return numericSeparator ? addNumericSeparator(obj, str) : str;
    }
    if (typeof obj === 'bigint') {
        var bigIntStr = String(obj) + 'n';
        return numericSeparator ? addNumericSeparator(obj, bigIntStr) : bigIntStr;
    }

    var maxDepth = typeof opts.depth === 'undefined' ? 5 : opts.depth;
    if (typeof depth === 'undefined') { depth = 0; }
    if (depth >= maxDepth && maxDepth > 0 && typeof obj === 'object') {
        return isArray(obj) ? '[Array]' : '[Object]';
    }

    var indent = getIndent(opts, depth);

    if (typeof seen === 'undefined') {
        seen = [];
    } else if (indexOf(seen, obj) >= 0) {
        return '[Circular]';
    }

    function inspect(value, from, noIndent) {
        if (from) {
            seen = $arrSlice.call(seen);
            seen.push(from);
        }
        if (noIndent) {
            var newOpts = {
                depth: opts.depth
            };
            if (has(opts, 'quoteStyle')) {
                newOpts.quoteStyle = opts.quoteStyle;
            }
            return inspect_(value, newOpts, depth + 1, seen);
        }
        return inspect_(value, opts, depth + 1, seen);
    }

    if (typeof obj === 'function') {
        var name = nameOf(obj);
        var keys = arrObjKeys(obj, inspect);
        return '[Function' + (name ? ': ' + name : ' (anonymous)') + ']' + (keys.length > 0 ? ' { ' + $join.call(keys, ', ') + ' }' : '');
    }
    if (isSymbol(obj)) {
        var symString = hasShammedSymbols ? $replace.call(String(obj), /^(Symbol\(.*\))_[^)]*$/, '$1') : symToString.call(obj);
        return typeof obj === 'object' && !hasShammedSymbols ? markBoxed(symString) : symString;
    }
    if (isElement(obj)) {
        var s = '<' + $toLowerCase.call(String(obj.nodeName));
        var attrs = obj.attributes || [];
        for (var i = 0; i < attrs.length; i++) {
            s += ' ' + attrs[i].name + '=' + wrapQuotes(quote(attrs[i].value), 'double', opts);
        }
        s += '>';
        if (obj.childNodes && obj.childNodes.length) { s += '...'; }
        s += '</' + $toLowerCase.call(String(obj.nodeName)) + '>';
        return s;
    }
    if (isArray(obj)) {
        if (obj.length === 0) { return '[]'; }
        var xs = arrObjKeys(obj, inspect);
        if (indent && !singleLineValues(xs)) {
            return '[' + indentedJoin(xs, indent) + ']';
        }
        return '[ ' + $join.call(xs, ', ') + ' ]';
    }
    if (isError(obj)) {
        var parts = arrObjKeys(obj, inspect);
        if ('cause' in obj && !isEnumerable.call(obj, 'cause')) {
            return '{ [' + String(obj) + '] ' + $join.call($concat.call('[cause]: ' + inspect(obj.cause), parts), ', ') + ' }';
        }
        if (parts.length === 0) { return '[' + String(obj) + ']'; }
        return '{ [' + String(obj) + '] ' + $join.call(parts, ', ') + ' }';
    }
    if (typeof obj === 'object' && customInspect) {
        if (inspectSymbol && typeof obj[inspectSymbol] === 'function') {
            return obj[inspectSymbol]();
        } else if (customInspect !== 'symbol' && typeof obj.inspect === 'function') {
            return obj.inspect();
        }
    }
    if (isMap(obj)) {
        var mapParts = [];
        mapForEach.call(obj, function (value, key) {
            mapParts.push(inspect(key, obj, true) + ' => ' + inspect(value, obj));
        });
        return collectionOf('Map', mapSize.call(obj), mapParts, indent);
    }
    if (isSet(obj)) {
        var setParts = [];
        setForEach.call(obj, function (value) {
            setParts.push(inspect(value, obj));
        });
        return collectionOf('Set', setSize.call(obj), setParts, indent);
    }
    if (isWeakMap(obj)) {
        return weakCollectionOf('WeakMap');
    }
    if (isWeakSet(obj)) {
        return weakCollectionOf('WeakSet');
    }
    if (isWeakRef(obj)) {
        return weakCollectionOf('WeakRef');
    }
    if (isNumber(obj)) {
        return markBoxed(inspect(Number(obj)));
    }
    if (isBigInt(obj)) {
        return markBoxed(inspect(bigIntValueOf.call(obj)));
    }
    if (isBoolean(obj)) {
        return markBoxed(booleanValueOf.call(obj));
    }
    if (isString(obj)) {
        return markBoxed(inspect(String(obj)));
    }
    if (!isDate(obj) && !isRegExp(obj)) {
        var ys = arrObjKeys(obj, inspect);
        var isPlainObject = gPO ? gPO(obj) === Object.prototype : obj instanceof Object || obj.constructor === Object;
        var protoTag = obj instanceof Object ? '' : 'null prototype';
        var stringTag = !isPlainObject && toStringTag && Object(obj) === obj && toStringTag in obj ? $slice.call(toStr(obj), 8, -1) : protoTag ? 'Object' : '';
        var constructorTag = isPlainObject || typeof obj.constructor !== 'function' ? '' : obj.constructor.name ? obj.constructor.name + ' ' : '';
        var tag = constructorTag + (stringTag || protoTag ? '[' + $join.call($concat.call([], stringTag || [], protoTag || []), ': ') + '] ' : '');
        if (ys.length === 0) { return tag + '{}'; }
        if (indent) {
            return tag + '{' + indentedJoin(ys, indent) + '}';
        }
        return tag + '{ ' + $join.call(ys, ', ') + ' }';
    }
    return String(obj);
};

function wrapQuotes(s, defaultStyle, opts) {
    var quoteChar = (opts.quoteStyle || defaultStyle) === 'double' ? '"' : "'";
    return quoteChar + s + quoteChar;
}

function quote(s) {
    return $replace.call(String(s), /"/g, '&quot;');
}

function isArray(obj) { return toStr(obj) === '[object Array]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isDate(obj) { return toStr(obj) === '[object Date]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isRegExp(obj) { return toStr(obj) === '[object RegExp]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isError(obj) { return toStr(obj) === '[object Error]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isString(obj) { return toStr(obj) === '[object String]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isNumber(obj) { return toStr(obj) === '[object Number]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
function isBoolean(obj) { return toStr(obj) === '[object Boolean]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }

// Symbol and BigInt do have Symbol.toStringTag by spec, so that can't be used to eliminate false positives
function isSymbol(obj) {
    if (hasShammedSymbols) {
        return obj && typeof obj === 'object' && obj instanceof Symbol;
    }
    if (typeof obj === 'symbol') {
        return true;
    }
    if (!obj || typeof obj !== 'object' || !symToString) {
        return false;
    }
    try {
        symToString.call(obj);
        return true;
    } catch (e) {}
    return false;
}

function isBigInt(obj) {
    if (!obj || typeof obj !== 'object' || !bigIntValueOf) {
        return false;
    }
    try {
        bigIntValueOf.call(obj);
        return true;
    } catch (e) {}
    return false;
}

var hasOwn = Object.prototype.hasOwnProperty || function (key) { return key in this; };
function has(obj, key) {
    return hasOwn.call(obj, key);
}

function toStr(obj) {
    return objectToString.call(obj);
}

function nameOf(f) {
    if (f.name) { return f.name; }
    var m = $match.call(functionToString.call(f), /^function\s*([\w$]+)/);
    if (m) { return m[1]; }
    return null;
}

function indexOf(xs, x) {
    if (xs.indexOf) { return xs.indexOf(x); }
    for (var i = 0, l = xs.length; i < l; i++) {
        if (xs[i] === x) { return i; }
    }
    return -1;
}

function isMap(x) {
    if (!mapSize || !x || typeof x !== 'object') {
        return false;
    }
    try {
        mapSize.call(x);
        try {
            setSize.call(x);
        } catch (s) {
            return true;
        }
        return x instanceof Map; // core-js workaround, pre-v2.5.0
    } catch (e) {}
    return false;
}

function isWeakMap(x) {
    if (!weakMapHas || !x || typeof x !== 'object') {
        return false;
    }
    try {
        weakMapHas.call(x, weakMapHas);
        try {
            weakSetHas.call(x, weakSetHas);
        } catch (s) {
            return true;
        }
        return x instanceof WeakMap; // core-js workaround, pre-v2.5.0
    } catch (e) {}
    return false;
}

function isWeakRef(x) {
    if (!weakRefDeref || !x || typeof x !== 'object') {
        return false;
    }
    try {
        weakRefDeref.call(x);
        return true;
    } catch (e) {}
    return false;
}

function isSet(x) {
    if (!setSize || !x || typeof x !== 'object') {
        return false;
    }
    try {
        setSize.call(x);
        try {
            mapSize.call(x);
        } catch (m) {
            return true;
        }
        return x instanceof Set; // core-js workaround, pre-v2.5.0
    } catch (e) {}
    return false;
}

function isWeakSet(x) {
    if (!weakSetHas || !x || typeof x !== 'object') {
        return false;
    }
    try {
        weakSetHas.call(x, weakSetHas);
        try {
            weakMapHas.call(x, weakMapHas);
        } catch (s) {
            return true;
        }
        return x instanceof WeakSet; // core-js workaround, pre-v2.5.0
    } catch (e) {}
    return false;
}

function isElement(x) {
    if (!x || typeof x !== 'object') { return false; }
    if (typeof HTMLElement !== 'undefined' && x instanceof HTMLElement) {
        return true;
    }
    return typeof x.nodeName === 'string' && typeof x.getAttribute === 'function';
}

function inspectString(str, opts) {
    if (str.length > opts.maxStringLength) {
        var remaining = str.length - opts.maxStringLength;
        var trailer = '... ' + remaining + ' more character' + (remaining > 1 ? 's' : '');
        return inspectString($slice.call(str, 0, opts.maxStringLength), opts) + trailer;
    }
    // eslint-disable-next-line no-control-regex
    var s = $replace.call($replace.call(str, /(['\\])/g, '\\$1'), /[\x00-\x1f]/g, lowbyte);
    return wrapQuotes(s, 'single', opts);
}

function lowbyte(c) {
    var n = c.charCodeAt(0);
    var x = {
        8: 'b',
        9: 't',
        10: 'n',
        12: 'f',
        13: 'r'
    }[n];
    if (x) { return '\\' + x; }
    return '\\x' + (n < 0x10 ? '0' : '') + $toUpperCase.call(n.toString(16));
}

function markBoxed(str) {
    return 'Object(' + str + ')';
}

function weakCollectionOf(type) {
    return type + ' { ? }';
}

function collectionOf(type, size, entries, indent) {
    var joinedEntries = indent ? indentedJoin(entries, indent) : $join.call(entries, ', ');
    return type + ' (' + size + ') {' + joinedEntries + '}';
}

function singleLineValues(xs) {
    for (var i = 0; i < xs.length; i++) {
        if (indexOf(xs[i], '\n') >= 0) {
            return false;
        }
    }
    return true;
}

function getIndent(opts, depth) {
    var baseIndent;
    if (opts.indent === '\t') {
        baseIndent = '\t';
    } else if (typeof opts.indent === 'number' && opts.indent > 0) {
        baseIndent = $join.call(Array(opts.indent + 1), ' ');
    } else {
        return null;
    }
    return {
        base: baseIndent,
        prev: $join.call(Array(depth + 1), baseIndent)
    };
}

function indentedJoin(xs, indent) {
    if (xs.length === 0) { return ''; }
    var lineJoiner = '\n' + indent.prev + indent.base;
    return lineJoiner + $join.call(xs, ',' + lineJoiner) + '\n' + indent.prev;
}

function arrObjKeys(obj, inspect) {
    var isArr = isArray(obj);
    var xs = [];
    if (isArr) {
        xs.length = obj.length;
        for (var i = 0; i < obj.length; i++) {
            xs[i] = has(obj, i) ? inspect(obj[i], obj) : '';
        }
    }
    var syms = typeof gOPS === 'function' ? gOPS(obj) : [];
    var symMap;
    if (hasShammedSymbols) {
        symMap = {};
        for (var k = 0; k < syms.length; k++) {
            symMap['$' + syms[k]] = syms[k];
        }
    }

    for (var key in obj) { // eslint-disable-line no-restricted-syntax
        if (!has(obj, key)) { continue; } // eslint-disable-line no-restricted-syntax, no-continue
        if (isArr && String(Number(key)) === key && key < obj.length) { continue; } // eslint-disable-line no-restricted-syntax, no-continue
        if (hasShammedSymbols && symMap['$' + key] instanceof Symbol) {
            // this is to prevent shammed Symbols, which are stored as strings, from being included in the string key section
            continue; // eslint-disable-line no-restricted-syntax, no-continue
        } else if ($test.call(/[^\w$]/, key)) {
            xs.push(inspect(key, obj) + ': ' + inspect(obj[key], obj));
        } else {
            xs.push(key + ': ' + inspect(obj[key], obj));
        }
    }
    if (typeof gOPS === 'function') {
        for (var j = 0; j < syms.length; j++) {
            if (isEnumerable.call(obj, syms[j])) {
                xs.push('[' + inspect(syms[j]) + ']: ' + inspect(obj[syms[j]], obj));
            }
        }
    }
    return xs;
}

},{"./util.inspect":6}],16:[function(require,module,exports){
'use strict';

var GetIntrinsic = require('get-intrinsic');
var callBound = require('call-bind/callBound');
var inspect = require('object-inspect');

var $TypeError = GetIntrinsic('%TypeError%');
var $WeakMap = GetIntrinsic('%WeakMap%', true);
var $Map = GetIntrinsic('%Map%', true);

var $weakMapGet = callBound('WeakMap.prototype.get', true);
var $weakMapSet = callBound('WeakMap.prototype.set', true);
var $weakMapHas = callBound('WeakMap.prototype.has', true);
var $mapGet = callBound('Map.prototype.get', true);
var $mapSet = callBound('Map.prototype.set', true);
var $mapHas = callBound('Map.prototype.has', true);

/*
 * This function traverses the list returning the node corresponding to the
 * given key.
 *
 * That node is also moved to the head of the list, so that if it's accessed
 * again we don't need to traverse the whole list. By doing so, all the recently
 * used nodes can be accessed relatively quickly.
 */
var listGetNode = function (list, key) { // eslint-disable-line consistent-return
	for (var prev = list, curr; (curr = prev.next) !== null; prev = curr) {
		if (curr.key === key) {
			prev.next = curr.next;
			curr.next = list.next;
			list.next = curr; // eslint-disable-line no-param-reassign
			return curr;
		}
	}
};

var listGet = function (objects, key) {
	var node = listGetNode(objects, key);
	return node && node.value;
};
var listSet = function (objects, key, value) {
	var node = listGetNode(objects, key);
	if (node) {
		node.value = value;
	} else {
		// Prepend the new node to the beginning of the list
		objects.next = { // eslint-disable-line no-param-reassign
			key: key,
			next: objects.next,
			value: value
		};
	}
};
var listHas = function (objects, key) {
	return !!listGetNode(objects, key);
};

module.exports = function getSideChannel() {
	var $wm;
	var $m;
	var $o;
	var channel = {
		assert: function (key) {
			if (!channel.has(key)) {
				throw new $TypeError('Side channel does not contain ' + inspect(key));
			}
		},
		get: function (key) { // eslint-disable-line consistent-return
			if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {
				if ($wm) {
					return $weakMapGet($wm, key);
				}
			} else if ($Map) {
				if ($m) {
					return $mapGet($m, key);
				}
			} else {
				if ($o) { // eslint-disable-line no-lonely-if
					return listGet($o, key);
				}
			}
		},
		has: function (key) {
			if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {
				if ($wm) {
					return $weakMapHas($wm, key);
				}
			} else if ($Map) {
				if ($m) {
					return $mapHas($m, key);
				}
			} else {
				if ($o) { // eslint-disable-line no-lonely-if
					return listHas($o, key);
				}
			}
			return false;
		},
		set: function (key, value) {
			if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {
				if (!$wm) {
					$wm = new $WeakMap();
				}
				$weakMapSet($wm, key, value);
			} else if ($Map) {
				if (!$m) {
					$m = new $Map();
				}
				$mapSet($m, key, value);
			} else {
				if (!$o) {
					/*
					 * Initialize the linked list as an empty node, so that we don't have
					 * to special-case handling of the first node: we can always refer to
					 * it as (previous node).next, instead of something like (list).head
					 */
					$o = { key: {}, next: null };
				}
				listSet($o, key, value);
			}
		}
	};
	return channel;
};

},{"call-bind/callBound":7,"get-intrinsic":11,"object-inspect":15}]},{},[2])(2)
});
# These are supported funding model platforms

github: [ljharb]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: npm/qs
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with a single custom sponsorship URL
The MIT License (MIT)

Copyright (c) Feross Aboukhadijeh

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.
/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
/* eslint-disable node/no-deprecated-api */
var buffer = require('buffer')
var Buffer = buffer.Buffer

// alternative to using Object.keys for old browsers
function copyProps (src, dst) {
  for (var key in src) {
    dst[key] = src[key]
  }
}
if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
  module.exports = buffer
} else {
  // Copy properties from require('buffer')
  copyProps(buffer, exports)
  exports.Buffer = SafeBuffer
}

function SafeBuffer (arg, encodingOrOffset, length) {
  return Buffer(arg, encodingOrOffset, length)
}

SafeBuffer.prototype = Object.create(Buffer.prototype)

// Copy static methods from Buffer
copyProps(Buffer, SafeBuffer)

SafeBuffer.from = function (arg, encodingOrOffset, length) {
  if (typeof arg === 'number') {
    throw new TypeError('Argument must not be a number')
  }
  return Buffer(arg, encodingOrOffset, length)
}

SafeBuffer.alloc = function (size, fill, encoding) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  var buf = Buffer(size)
  if (fill !== undefined) {
    if (typeof encoding === 'string') {
      buf.fill(fill, encoding)
    } else {
      buf.fill(fill)
    }
  } else {
    buf.fill(0)
  }
  return buf
}

SafeBuffer.allocUnsafe = function (size) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  return Buffer(size)
}

SafeBuffer.allocUnsafeSlow = function (size) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  return buffer.SlowBuffer(size)
}
{
  "name": "safe-buffer",
  "description": "Safer Node.js Buffer API",
  "version": "5.2.1",
  "author": {
    "name": "Feross Aboukhadijeh",
    "email": "feross@feross.org",
    "url": "https://feross.org"
  },
  "devDependencies": {
    "standard": "*",
    "tape": "^5.0.0"
  },
  "homepage": "https://github.com/feross/safe-buffer",
  "license": "MIT",
  "main": "index.js",
  "types": "index.d.ts",
  "repository": {
    "type": "git",
    "url": "git://github.com/feross/safe-buffer.git"
  },
  "funding": [
    {
      "type": "github",
      "url": "https://github.com/sponsors/feross"
    },
    {
      "type": "patreon",
      "url": "https://www.patreon.com/feross"
    },
    {
      "type": "consulting",
      "url": "https://feross.org/support"
    }
  ]
}(The MIT License)

Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca>

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.

# get Makefile directory name: http://stackoverflow.com/a/5982798/376773
THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)

# BIN directory
BIN := $(THIS_DIR)/node_modules/.bin

# Path
PATH := node_modules/.bin:$(PATH)
SHELL := /bin/bash

# applications
NODE ?= $(shell which node)
YARN ?= $(shell which yarn)
PKG ?= $(if $(YARN),$(YARN),$(NODE) $(shell which npm))
BROWSERIFY ?= $(NODE) $(BIN)/browserify

.FORCE:

install: node_modules

node_modules: package.json
	@NODE_ENV= $(PKG) install
	@touch node_modules

lint: .FORCE
	eslint browser.js debug.js index.js node.js

test-node: .FORCE
	istanbul cover node_modules/mocha/bin/_mocha -- test/**.js

test-browser: .FORCE
	mkdir -p dist

	@$(BROWSERIFY) \
		--standalone debug \
		. > dist/debug.js

	karma start --single-run
	rimraf dist

test: .FORCE
	concurrently \
		"make test-node" \
		"make test-browser"

coveralls:
	cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js

.PHONY: all install clean distclean
{
  "name": "debug",
  "repo": "visionmedia/debug",
  "description": "small debugging utility",
  "version": "2.6.9",
  "keywords": [
    "debug",
    "log",
    "debugger"
  ],
  "main": "src/browser.js",
  "scripts": [
    "src/browser.js",
    "src/debug.js"
  ],
  "dependencies": {
    "rauchg/ms.js": "0.7.1"
  }
}
module.exports = require('./src/node');
{
  "name": "debug",
  "version": "2.6.9",
  "repository": {
    "type": "git",
    "url": "git://github.com/visionmedia/debug.git"
  },
  "description": "small debugging utility",
  "author": "TJ Holowaychuk <tj@vision-media.ca>",
  "license": "MIT",
  "dependencies": {
    "ms": "2.0.0"
  },
  "devDependencies": {
    "browserify": "9.0.3",
    "chai": "^3.5.0",
    "concurrently": "^3.1.0",
    "coveralls": "^2.11.15",
    "eslint": "^3.12.1",
    "istanbul": "^0.4.5",
    "karma": "^1.3.0",
    "karma-chai": "^0.1.0",
    "karma-mocha": "^1.3.0",
    "karma-phantomjs-launcher": "^1.0.2",
    "karma-sinon": "^1.0.5",
    "mocha": "^3.2.0",
    "mocha-lcov-reporter": "^1.2.0",
    "rimraf": "^2.5.4",
    "sinon": "^1.17.6",
    "sinon-chai": "^2.8.0"
  },
  "main": "./src/index.js",
  "browser": "./src/browser.js",
  "component": {
    "scripts": {
      "debug/index.js": "browser.js",
      "debug/debug.js": "debug.js"
    }
  }
}/**
 * This is the web browser implementation of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = require('./debug');
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;
exports.storage = 'undefined' != typeof chrome
               && 'undefined' != typeof chrome.storage
                  ? chrome.storage.local
                  : localstorage();

/**
 * Colors.
 */

exports.colors = [
  'lightseagreen',
  'forestgreen',
  'goldenrod',
  'dodgerblue',
  'darkorchid',
  'crimson'
];

/**
 * Currently only WebKit-based Web Inspectors, Firefox >= v31,
 * and the Firebug extension (any Firefox version) are known
 * to support "%c" CSS customizations.
 *
 * TODO: add a `localStorage` variable to explicitly enable/disable colors
 */

function useColors() {
  // NB: In an Electron preload script, document will be defined but not fully
  // initialized. Since we know we're in Chrome, we'll just detect this case
  // explicitly
  if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {
    return true;
  }

  // is webkit? http://stackoverflow.com/a/16459606/376773
  // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
  return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
    // is firebug? http://stackoverflow.com/a/398120/376773
    (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
    // is firefox >= v31?
    // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
    // double check webkit in userAgent just in case we are in a worker
    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
}

/**
 * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
 */

exports.formatters.j = function(v) {
  try {
    return JSON.stringify(v);
  } catch (err) {
    return '[UnexpectedJSONParseError]: ' + err.message;
  }
};


/**
 * Colorize log arguments if enabled.
 *
 * @api public
 */

function formatArgs(args) {
  var useColors = this.useColors;

  args[0] = (useColors ? '%c' : '')
    + this.namespace
    + (useColors ? ' %c' : ' ')
    + args[0]
    + (useColors ? '%c ' : ' ')
    + '+' + exports.humanize(this.diff);

  if (!useColors) return;

  var c = 'color: ' + this.color;
  args.splice(1, 0, c, 'color: inherit')

  // the final "%c" is somewhat tricky, because there could be other
  // arguments passed either before or after the %c, so we need to
  // figure out the correct index to insert the CSS into
  var index = 0;
  var lastC = 0;
  args[0].replace(/%[a-zA-Z%]/g, function(match) {
    if ('%%' === match) return;
    index++;
    if ('%c' === match) {
      // we only are interested in the *last* %c
      // (the user may have provided their own)
      lastC = index;
    }
  });

  args.splice(lastC, 0, c);
}

/**
 * Invokes `console.log()` when available.
 * No-op when `console.log` is not a "function".
 *
 * @api public
 */

function log() {
  // this hackery is required for IE8/9, where
  // the `console.log` function doesn't have 'apply'
  return 'object' === typeof console
    && console.log
    && Function.prototype.apply.call(console.log, console, arguments);
}

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */

function save(namespaces) {
  try {
    if (null == namespaces) {
      exports.storage.removeItem('debug');
    } else {
      exports.storage.debug = namespaces;
    }
  } catch(e) {}
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */

function load() {
  var r;
  try {
    r = exports.storage.debug;
  } catch(e) {}

  // If debug isn't set in LS, and we're in Electron, try to load $DEBUG
  if (!r && typeof process !== 'undefined' && 'env' in process) {
    r = process.env.DEBUG;
  }

  return r;
}

/**
 * Enable namespaces listed in `localStorage.debug` initially.
 */

exports.enable(load());

/**
 * Localstorage attempts to return the localstorage.
 *
 * This is necessary because safari throws
 * when a user disables cookies/localstorage
 * and you attempt to access it.
 *
 * @return {LocalStorage}
 * @api private
 */

function localstorage() {
  try {
    return window.localStorage;
  } catch (e) {}
}

/**
 * This is the common logic for both the Node.js and web browser
 * implementations of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = createDebug.debug = createDebug['default'] = createDebug;
exports.coerce = coerce;
exports.disable = disable;
exports.enable = enable;
exports.enabled = enabled;
exports.humanize = require('ms');

/**
 * The currently active debug mode names, and names to skip.
 */

exports.names = [];
exports.skips = [];

/**
 * Map of special "%n" handling functions, for the debug "format" argument.
 *
 * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
 */

exports.formatters = {};

/**
 * Previous log timestamp.
 */

var prevTime;

/**
 * Select a color.
 * @param {String} namespace
 * @return {Number}
 * @api private
 */

function selectColor(namespace) {
  var hash = 0, i;

  for (i in namespace) {
    hash  = ((hash << 5) - hash) + namespace.charCodeAt(i);
    hash |= 0; // Convert to 32bit integer
  }

  return exports.colors[Math.abs(hash) % exports.colors.length];
}

/**
 * Create a debugger with the given `namespace`.
 *
 * @param {String} namespace
 * @return {Function}
 * @api public
 */

function createDebug(namespace) {

  function debug() {
    // disabled?
    if (!debug.enabled) return;

    var self = debug;

    // set `diff` timestamp
    var curr = +new Date();
    var ms = curr - (prevTime || curr);
    self.diff = ms;
    self.prev = prevTime;
    self.curr = curr;
    prevTime = curr;

    // turn the `arguments` into a proper Array
    var args = new Array(arguments.length);
    for (var i = 0; i < args.length; i++) {
      args[i] = arguments[i];
    }

    args[0] = exports.coerce(args[0]);

    if ('string' !== typeof args[0]) {
      // anything else let's inspect with %O
      args.unshift('%O');
    }

    // apply any `formatters` transformations
    var index = 0;
    args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {
      // if we encounter an escaped % then don't increase the array index
      if (match === '%%') return match;
      index++;
      var formatter = exports.formatters[format];
      if ('function' === typeof formatter) {
        var val = args[index];
        match = formatter.call(self, val);

        // now we need to remove `args[index]` since it's inlined in the `format`
        args.splice(index, 1);
        index--;
      }
      return match;
    });

    // apply env-specific formatting (colors, etc.)
    exports.formatArgs.call(self, args);

    var logFn = debug.log || exports.log || console.log.bind(console);
    logFn.apply(self, args);
  }

  debug.namespace = namespace;
  debug.enabled = exports.enabled(namespace);
  debug.useColors = exports.useColors();
  debug.color = selectColor(namespace);

  // env-specific initialization logic for debug instances
  if ('function' === typeof exports.init) {
    exports.init(debug);
  }

  return debug;
}

/**
 * Enables a debug mode by namespaces. This can include modes
 * separated by a colon and wildcards.
 *
 * @param {String} namespaces
 * @api public
 */

function enable(namespaces) {
  exports.save(namespaces);

  exports.names = [];
  exports.skips = [];

  var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
  var len = split.length;

  for (var i = 0; i < len; i++) {
    if (!split[i]) continue; // ignore empty strings
    namespaces = split[i].replace(/\*/g, '.*?');
    if (namespaces[0] === '-') {
      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
    } else {
      exports.names.push(new RegExp('^' + namespaces + '$'));
    }
  }
}

/**
 * Disable debug output.
 *
 * @api public
 */

function disable() {
  exports.enable('');
}

/**
 * Returns true if the given mode name is enabled, false otherwise.
 *
 * @param {String} name
 * @return {Boolean}
 * @api public
 */

function enabled(name) {
  var i, len;
  for (i = 0, len = exports.skips.length; i < len; i++) {
    if (exports.skips[i].test(name)) {
      return false;
    }
  }
  for (i = 0, len = exports.names.length; i < len; i++) {
    if (exports.names[i].test(name)) {
      return true;
    }
  }
  return false;
}

/**
 * Coerce `val`.
 *
 * @param {Mixed} val
 * @return {Mixed}
 * @api private
 */

function coerce(val) {
  if (val instanceof Error) return val.stack || val.message;
  return val;
}
/**
 * Detect Electron renderer process, which is node, but we should
 * treat as a browser.
 */

if (typeof process !== 'undefined' && process.type === 'renderer') {
  module.exports = require('./browser.js');
} else {
  module.exports = require('./node.js');
}
module.exports = inspectorLog;

// black hole
const nullStream = new (require('stream').Writable)();
nullStream._write = () => {};

/**
 * Outputs a `console.log()` to the Node.js Inspector console *only*.
 */
function inspectorLog() {
  const stdout = console._stdout;
  console._stdout = nullStream;
  console.log.apply(console, arguments);
  console._stdout = stdout;
}
/**
 * Module dependencies.
 */

var tty = require('tty');
var util = require('util');

/**
 * This is the Node.js implementation of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = require('./debug');
exports.init = init;
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;

/**
 * Colors.
 */

exports.colors = [6, 2, 3, 4, 5, 1];

/**
 * Build up the default `inspectOpts` object from the environment variables.
 *
 *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
 */

exports.inspectOpts = Object.keys(process.env).filter(function (key) {
  return /^debug_/i.test(key);
}).reduce(function (obj, key) {
  // camel-case
  var prop = key
    .substring(6)
    .toLowerCase()
    .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() });

  // coerce string value into JS value
  var val = process.env[key];
  if (/^(yes|on|true|enabled)$/i.test(val)) val = true;
  else if (/^(no|off|false|disabled)$/i.test(val)) val = false;
  else if (val === 'null') val = null;
  else val = Number(val);

  obj[prop] = val;
  return obj;
}, {});

/**
 * The file descriptor to write the `debug()` calls to.
 * Set the `DEBUG_FD` env variable to override with another value. i.e.:
 *
 *   $ DEBUG_FD=3 node script.js 3>debug.log
 */

var fd = parseInt(process.env.DEBUG_FD, 10) || 2;

if (1 !== fd && 2 !== fd) {
  util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')()
}

var stream = 1 === fd ? process.stdout :
             2 === fd ? process.stderr :
             createWritableStdioStream(fd);

/**
 * Is stdout a TTY? Colored output is enabled when `true`.
 */

function useColors() {
  return 'colors' in exports.inspectOpts
    ? Boolean(exports.inspectOpts.colors)
    : tty.isatty(fd);
}

/**
 * Map %o to `util.inspect()`, all on a single line.
 */

exports.formatters.o = function(v) {
  this.inspectOpts.colors = this.useColors;
  return util.inspect(v, this.inspectOpts)
    .split('\n').map(function(str) {
      return str.trim()
    }).join(' ');
};

/**
 * Map %o to `util.inspect()`, allowing multiple lines if needed.
 */

exports.formatters.O = function(v) {
  this.inspectOpts.colors = this.useColors;
  return util.inspect(v, this.inspectOpts);
};

/**
 * Adds ANSI color escape codes if enabled.
 *
 * @api public
 */

function formatArgs(args) {
  var name = this.namespace;
  var useColors = this.useColors;

  if (useColors) {
    var c = this.color;
    var prefix = '  \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m';

    args[0] = prefix + args[0].split('\n').join('\n' + prefix);
    args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m');
  } else {
    args[0] = new Date().toUTCString()
      + ' ' + name + ' ' + args[0];
  }
}

/**
 * Invokes `util.format()` with the specified arguments and writes to `stream`.
 */

function log() {
  return stream.write(util.format.apply(util, arguments) + '\n');
}

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */

function save(namespaces) {
  if (null == namespaces) {
    // If you set a process.env field to null or undefined, it gets cast to the
    // string 'null' or 'undefined'. Just delete instead.
    delete process.env.DEBUG;
  } else {
    process.env.DEBUG = namespaces;
  }
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */

function load() {
  return process.env.DEBUG;
}

/**
 * Copied from `node/src/node.js`.
 *
 * XXX: It's lame that node doesn't expose this API out-of-the-box. It also
 * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame.
 */

function createWritableStdioStream (fd) {
  var stream;
  var tty_wrap = process.binding('tty_wrap');

  // Note stream._type is used for test-module-load-list.js

  switch (tty_wrap.guessHandleType(fd)) {
    case 'TTY':
      stream = new tty.WriteStream(fd);
      stream._type = 'tty';

      // Hack to have stream not keep the event loop alive.
      // See https://github.com/joyent/node/issues/1726
      if (stream._handle && stream._handle.unref) {
        stream._handle.unref();
      }
      break;

    case 'FILE':
      var fs = require('fs');
      stream = new fs.SyncWriteStream(fd, { autoClose: false });
      stream._type = 'fs';
      break;

    case 'PIPE':
    case 'TCP':
      var net = require('net');
      stream = new net.Socket({
        fd: fd,
        readable: false,
        writable: true
      });

      // FIXME Should probably have an option in net.Socket to create a
      // stream from an existing fd which is writable only. But for now
      // we'll just add this hack and set the `readable` member to false.
      // Test: ./node test/fixtures/echo.js < /etc/passwd
      stream.readable = false;
      stream.read = null;
      stream._type = 'pipe';

      // FIXME Hack to have stream not keep the event loop alive.
      // See https://github.com/joyent/node/issues/1726
      if (stream._handle && stream._handle.unref) {
        stream._handle.unref();
      }
      break;

    default:
      // Probably an error on in uv_guess_handle()
      throw new Error('Implement me. Unknown stream file type!');
  }

  // For supporting legacy API we put the FD here.
  stream.fd = fd;

  stream._isStdio = true;

  return stream;
}

/**
 * Init logic for `debug` instances.
 *
 * Create a new `inspectOpts` object in case `useColors` is set
 * differently for a particular `debug` instance.
 */

function init (debug) {
  debug.inspectOpts = {};

  var keys = Object.keys(exports.inspectOpts);
  for (var i = 0; i < keys.length; i++) {
    debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
  }
}

/**
 * Enable namespaces listed in `process.env.DEBUG` initially.
 */

exports.enable(load());
/**
 * Helpers.
 */

var s = 1000;
var m = s * 60;
var h = m * 60;
var d = h * 24;
var y = d * 365.25;

/**
 * Parse or format the given `val`.
 *
 * Options:
 *
 *  - `long` verbose formatting [false]
 *
 * @param {String|Number} val
 * @param {Object} [options]
 * @throws {Error} throw an error if val is not a non-empty string or a number
 * @return {String|Number}
 * @api public
 */

module.exports = function(val, options) {
  options = options || {};
  var type = typeof val;
  if (type === 'string' && val.length > 0) {
    return parse(val);
  } else if (type === 'number' && isNaN(val) === false) {
    return options.long ? fmtLong(val) : fmtShort(val);
  }
  throw new Error(
    'val is not a non-empty string or a valid number. val=' +
      JSON.stringify(val)
  );
};

/**
 * Parse the given `str` and return milliseconds.
 *
 * @param {String} str
 * @return {Number}
 * @api private
 */

function parse(str) {
  str = String(str);
  if (str.length > 100) {
    return;
  }
  var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(
    str
  );
  if (!match) {
    return;
  }
  var n = parseFloat(match[1]);
  var type = (match[2] || 'ms').toLowerCase();
  switch (type) {
    case 'years':
    case 'year':
    case 'yrs':
    case 'yr':
    case 'y':
      return n * y;
    case 'days':
    case 'day':
    case 'd':
      return n * d;
    case 'hours':
    case 'hour':
    case 'hrs':
    case 'hr':
    case 'h':
      return n * h;
    case 'minutes':
    case 'minute':
    case 'mins':
    case 'min':
    case 'm':
      return n * m;
    case 'seconds':
    case 'second':
    case 'secs':
    case 'sec':
    case 's':
      return n * s;
    case 'milliseconds':
    case 'millisecond':
    case 'msecs':
    case 'msec':
    case 'ms':
      return n;
    default:
      return undefined;
  }
}

/**
 * Short format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtShort(ms) {
  if (ms >= d) {
    return Math.round(ms / d) + 'd';
  }
  if (ms >= h) {
    return Math.round(ms / h) + 'h';
  }
  if (ms >= m) {
    return Math.round(ms / m) + 'm';
  }
  if (ms >= s) {
    return Math.round(ms / s) + 's';
  }
  return ms + 'ms';
}

/**
 * Long format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtLong(ms) {
  return plural(ms, d, 'day') ||
    plural(ms, h, 'hour') ||
    plural(ms, m, 'minute') ||
    plural(ms, s, 'second') ||
    ms + ' ms';
}

/**
 * Pluralization helper.
 */

function plural(ms, n, name) {
  if (ms < n) {
    return;
  }
  if (ms < n * 1.5) {
    return Math.floor(ms / n) + ' ' + name;
  }
  return Math.ceil(ms / n) + ' ' + name + 's';
}
The MIT License (MIT)

Copyright (c) 2016 Zeit, Inc.

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": "ms",
  "version": "2.0.0",
  "description": "Tiny milisecond conversion utility",
  "repository": "zeit/ms",
  "main": "./index",
  "files": [
    "index.js"
  ],
  "lint-staged": {
    "*.js": [
      "npm run lint",
      "prettier --single-quote --write",
      "git add"
    ]
  },
  "license": "MIT",
  "devDependencies": {
    "eslint": "3.19.0",
    "expect.js": "0.3.1",
    "husky": "0.13.3",
    "lint-staged": "3.4.1",
    "mocha": "3.4.1"
  }
}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.

## Glob Logo

Glob's logo created by Tanya Brassie <http://tanyabrassie.com/>, licensed
under a Creative Commons Attribution-ShareAlike 4.0 International License
https://creativecommons.org/licenses/by-sa/4.0/
exports.setopts = setopts
exports.ownProp = ownProp
exports.makeAbs = makeAbs
exports.finish = finish
exports.mark = mark
exports.isIgnored = isIgnored
exports.childrenIgnored = childrenIgnored

function ownProp (obj, field) {
  return Object.prototype.hasOwnProperty.call(obj, field)
}

var fs = require("fs")
var path = require("path")
var minimatch = require("minimatch")
var isAbsolute = require("path-is-absolute")
var Minimatch = minimatch.Minimatch

function alphasort (a, b) {
  return a.localeCompare(b, 'en')
}

function setupIgnores (self, options) {
  self.ignore = options.ignore || []

  if (!Array.isArray(self.ignore))
    self.ignore = [self.ignore]

  if (self.ignore.length) {
    self.ignore = self.ignore.map(ignoreMap)
  }
}

// ignore patterns are always in dot:true mode.
function ignoreMap (pattern) {
  var gmatcher = null
  if (pattern.slice(-3) === '/**') {
    var gpattern = pattern.replace(/(\/\*\*)+$/, '')
    gmatcher = new Minimatch(gpattern, { dot: true })
  }

  return {
    matcher: new Minimatch(pattern, { dot: true }),
    gmatcher: gmatcher
  }
}

function setopts (self, pattern, options) {
  if (!options)
    options = {}

  // base-matching: just use globstar for that.
  if (options.matchBase && -1 === pattern.indexOf("/")) {
    if (options.noglobstar) {
      throw new Error("base matching requires globstar")
    }
    pattern = "**/" + pattern
  }

  self.silent = !!options.silent
  self.pattern = pattern
  self.strict = options.strict !== false
  self.realpath = !!options.realpath
  self.realpathCache = options.realpathCache || Object.create(null)
  self.follow = !!options.follow
  self.dot = !!options.dot
  self.mark = !!options.mark
  self.nodir = !!options.nodir
  if (self.nodir)
    self.mark = true
  self.sync = !!options.sync
  self.nounique = !!options.nounique
  self.nonull = !!options.nonull
  self.nosort = !!options.nosort
  self.nocase = !!options.nocase
  self.stat = !!options.stat
  self.noprocess = !!options.noprocess
  self.absolute = !!options.absolute
  self.fs = options.fs || fs

  self.maxLength = options.maxLength || Infinity
  self.cache = options.cache || Object.create(null)
  self.statCache = options.statCache || Object.create(null)
  self.symlinks = options.symlinks || Object.create(null)

  setupIgnores(self, options)

  self.changedCwd = false
  var cwd = process.cwd()
  if (!ownProp(options, "cwd"))
    self.cwd = cwd
  else {
    self.cwd = path.resolve(options.cwd)
    self.changedCwd = self.cwd !== cwd
  }

  self.root = options.root || path.resolve(self.cwd, "/")
  self.root = path.resolve(self.root)
  if (process.platform === "win32")
    self.root = self.root.replace(/\\/g, "/")

  // TODO: is an absolute `cwd` supposed to be resolved against `root`?
  // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test')
  self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd)
  if (process.platform === "win32")
    self.cwdAbs = self.cwdAbs.replace(/\\/g, "/")
  self.nomount = !!options.nomount

  // disable comments and negation in Minimatch.
  // Note that they are not supported in Glob itself anyway.
  options.nonegate = true
  options.nocomment = true
  // always treat \ in patterns as escapes, not path separators
  options.allowWindowsEscape = false

  self.minimatch = new Minimatch(pattern, options)
  self.options = self.minimatch.options
}

function finish (self) {
  var nou = self.nounique
  var all = nou ? [] : Object.create(null)

  for (var i = 0, l = self.matches.length; i < l; i ++) {
    var matches = self.matches[i]
    if (!matches || Object.keys(matches).length === 0) {
      if (self.nonull) {
        // do like the shell, and spit out the literal glob
        var literal = self.minimatch.globSet[i]
        if (nou)
          all.push(literal)
        else
          all[literal] = true
      }
    } else {
      // had matches
      var m = Object.keys(matches)
      if (nou)
        all.push.apply(all, m)
      else
        m.forEach(function (m) {
          all[m] = true
        })
    }
  }

  if (!nou)
    all = Object.keys(all)

  if (!self.nosort)
    all = all.sort(alphasort)

  // at *some* point we statted all of these
  if (self.mark) {
    for (var i = 0; i < all.length; i++) {
      all[i] = self._mark(all[i])
    }
    if (self.nodir) {
      all = all.filter(function (e) {
        var notDir = !(/\/$/.test(e))
        var c = self.cache[e] || self.cache[makeAbs(self, e)]
        if (notDir && c)
          notDir = c !== 'DIR' && !Array.isArray(c)
        return notDir
      })
    }
  }

  if (self.ignore.length)
    all = all.filter(function(m) {
      return !isIgnored(self, m)
    })

  self.found = all
}

function mark (self, p) {
  var abs = makeAbs(self, p)
  var c = self.cache[abs]
  var m = p
  if (c) {
    var isDir = c === 'DIR' || Array.isArray(c)
    var slash = p.slice(-1) === '/'

    if (isDir && !slash)
      m += '/'
    else if (!isDir && slash)
      m = m.slice(0, -1)

    if (m !== p) {
      var mabs = makeAbs(self, m)
      self.statCache[mabs] = self.statCache[abs]
      self.cache[mabs] = self.cache[abs]
    }
  }

  return m
}

// lotta situps...
function makeAbs (self, f) {
  var abs = f
  if (f.charAt(0) === '/') {
    abs = path.join(self.root, f)
  } else if (isAbsolute(f) || f === '') {
    abs = f
  } else if (self.changedCwd) {
    abs = path.resolve(self.cwd, f)
  } else {
    abs = path.resolve(f)
  }

  if (process.platform === 'win32')
    abs = abs.replace(/\\/g, '/')

  return abs
}


// Return true, if pattern ends with globstar '**', for the accompanying parent directory.
// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents
function isIgnored (self, path) {
  if (!self.ignore.length)
    return false

  return self.ignore.some(function(item) {
    return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path))
  })
}

function childrenIgnored (self, path) {
  if (!self.ignore.length)
    return false

  return self.ignore.some(function(item) {
    return !!(item.gmatcher && item.gmatcher.match(path))
  })
}
// Approach:
//
// 1. Get the minimatch set
// 2. For each pattern in the set, PROCESS(pattern, false)
// 3. Store matches per-set, then uniq them
//
// PROCESS(pattern, inGlobStar)
// Get the first [n] items from pattern that are all strings
// Join these together.  This is PREFIX.
//   If there is no more remaining, then stat(PREFIX) and
//   add to matches if it succeeds.  END.
//
// If inGlobStar and PREFIX is symlink and points to dir
//   set ENTRIES = []
// else readdir(PREFIX) as ENTRIES
//   If fail, END
//
// with ENTRIES
//   If pattern[n] is GLOBSTAR
//     // handle the case where the globstar match is empty
//     // by pruning it out, and testing the resulting pattern
//     PROCESS(pattern[0..n] + pattern[n+1 .. $], false)
//     // handle other cases.
//     for ENTRY in ENTRIES (not dotfiles)
//       // attach globstar + tail onto the entry
//       // Mark that this entry is a globstar match
//       PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)
//
//   else // not globstar
//     for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)
//       Test ENTRY against pattern[n]
//       If fails, continue
//       If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])
//
// Caveat:
//   Cache all stats and readdirs results to minimize syscall.  Since all
//   we ever care about is existence and directory-ness, we can just keep
//   `true` for files, and [children,...] for directories, or `false` for
//   things that don't exist.

module.exports = glob

var rp = require('fs.realpath')
var minimatch = require('minimatch')
var Minimatch = minimatch.Minimatch
var inherits = require('inherits')
var EE = require('events').EventEmitter
var path = require('path')
var assert = require('assert')
var isAbsolute = require('path-is-absolute')
var globSync = require('./sync.js')
var common = require('./common.js')
var setopts = common.setopts
var ownProp = common.ownProp
var inflight = require('inflight')
var util = require('util')
var childrenIgnored = common.childrenIgnored
var isIgnored = common.isIgnored

var once = require('once')

function glob (pattern, options, cb) {
  if (typeof options === 'function') cb = options, options = {}
  if (!options) options = {}

  if (options.sync) {
    if (cb)
      throw new TypeError('callback provided to sync glob')
    return globSync(pattern, options)
  }

  return new Glob(pattern, options, cb)
}

glob.sync = globSync
var GlobSync = glob.GlobSync = globSync.GlobSync

// old api surface
glob.glob = glob

function extend (origin, add) {
  if (add === null || typeof add !== 'object') {
    return origin
  }

  var keys = Object.keys(add)
  var i = keys.length
  while (i--) {
    origin[keys[i]] = add[keys[i]]
  }
  return origin
}

glob.hasMagic = function (pattern, options_) {
  var options = extend({}, options_)
  options.noprocess = true

  var g = new Glob(pattern, options)
  var set = g.minimatch.set

  if (!pattern)
    return false

  if (set.length > 1)
    return true

  for (var j = 0; j < set[0].length; j++) {
    if (typeof set[0][j] !== 'string')
      return true
  }

  return false
}

glob.Glob = Glob
inherits(Glob, EE)
function Glob (pattern, options, cb) {
  if (typeof options === 'function') {
    cb = options
    options = null
  }

  if (options && options.sync) {
    if (cb)
      throw new TypeError('callback provided to sync glob')
    return new GlobSync(pattern, options)
  }

  if (!(this instanceof Glob))
    return new Glob(pattern, options, cb)

  setopts(this, pattern, options)
  this._didRealPath = false

  // process each pattern in the minimatch set
  var n = this.minimatch.set.length

  // The matches are stored as {<filename>: true,...} so that
  // duplicates are automagically pruned.
  // Later, we do an Object.keys() on these.
  // Keep them as a list so we can fill in when nonull is set.
  this.matches = new Array(n)

  if (typeof cb === 'function') {
    cb = once(cb)
    this.on('error', cb)
    this.on('end', function (matches) {
      cb(null, matches)
    })
  }

  var self = this
  this._processing = 0

  this._emitQueue = []
  this._processQueue = []
  this.paused = false

  if (this.noprocess)
    return this

  if (n === 0)
    return done()

  var sync = true
  for (var i = 0; i < n; i ++) {
    this._process(this.minimatch.set[i], i, false, done)
  }
  sync = false

  function done () {
    --self._processing
    if (self._processing <= 0) {
      if (sync) {
        process.nextTick(function () {
          self._finish()
        })
      } else {
        self._finish()
      }
    }
  }
}

Glob.prototype._finish = function () {
  assert(this instanceof Glob)
  if (this.aborted)
    return

  if (this.realpath && !this._didRealpath)
    return this._realpath()

  common.finish(this)
  this.emit('end', this.found)
}

Glob.prototype._realpath = function () {
  if (this._didRealpath)
    return

  this._didRealpath = true

  var n = this.matches.length
  if (n === 0)
    return this._finish()

  var self = this
  for (var i = 0; i < this.matches.length; i++)
    this._realpathSet(i, next)

  function next () {
    if (--n === 0)
      self._finish()
  }
}

Glob.prototype._realpathSet = function (index, cb) {
  var matchset = this.matches[index]
  if (!matchset)
    return cb()

  var found = Object.keys(matchset)
  var self = this
  var n = found.length

  if (n === 0)
    return cb()

  var set = this.matches[index] = Object.create(null)
  found.forEach(function (p, i) {
    // If there's a problem with the stat, then it means that
    // one or more of the links in the realpath couldn't be
    // resolved.  just return the abs value in that case.
    p = self._makeAbs(p)
    rp.realpath(p, self.realpathCache, function (er, real) {
      if (!er)
        set[real] = true
      else if (er.syscall === 'stat')
        set[p] = true
      else
        self.emit('error', er) // srsly wtf right here

      if (--n === 0) {
        self.matches[index] = set
        cb()
      }
    })
  })
}

Glob.prototype._mark = function (p) {
  return common.mark(this, p)
}

Glob.prototype._makeAbs = function (f) {
  return common.makeAbs(this, f)
}

Glob.prototype.abort = function () {
  this.aborted = true
  this.emit('abort')
}

Glob.prototype.pause = function () {
  if (!this.paused) {
    this.paused = true
    this.emit('pause')
  }
}

Glob.prototype.resume = function () {
  if (this.paused) {
    this.emit('resume')
    this.paused = false
    if (this._emitQueue.length) {
      var eq = this._emitQueue.slice(0)
      this._emitQueue.length = 0
      for (var i = 0; i < eq.length; i ++) {
        var e = eq[i]
        this._emitMatch(e[0], e[1])
      }
    }
    if (this._processQueue.length) {
      var pq = this._processQueue.slice(0)
      this._processQueue.length = 0
      for (var i = 0; i < pq.length; i ++) {
        var p = pq[i]
        this._processing--
        this._process(p[0], p[1], p[2], p[3])
      }
    }
  }
}

Glob.prototype._process = function (pattern, index, inGlobStar, cb) {
  assert(this instanceof Glob)
  assert(typeof cb === 'function')

  if (this.aborted)
    return

  this._processing++
  if (this.paused) {
    this._processQueue.push([pattern, index, inGlobStar, cb])
    return
  }

  //console.error('PROCESS %d', this._processing, pattern)

  // Get the first [n] parts of pattern that are all strings.
  var n = 0
  while (typeof pattern[n] === 'string') {
    n ++
  }
  // now n is the index of the first one that is *not* a string.

  // see if there's anything else
  var prefix
  switch (n) {
    // if not, then this is rather simple
    case pattern.length:
      this._processSimple(pattern.join('/'), index, cb)
      return

    case 0:
      // pattern *starts* with some non-trivial item.
      // going to readdir(cwd), but not include the prefix in matches.
      prefix = null
      break

    default:
      // pattern has some string bits in the front.
      // whatever it starts with, whether that's 'absolute' like /foo/bar,
      // or 'relative' like '../baz'
      prefix = pattern.slice(0, n).join('/')
      break
  }

  var remain = pattern.slice(n)

  // get the list of entries.
  var read
  if (prefix === null)
    read = '.'
  else if (isAbsolute(prefix) ||
      isAbsolute(pattern.map(function (p) {
        return typeof p === 'string' ? p : '[*]'
      }).join('/'))) {
    if (!prefix || !isAbsolute(prefix))
      prefix = '/' + prefix
    read = prefix
  } else
    read = prefix

  var abs = this._makeAbs(read)

  //if ignored, skip _processing
  if (childrenIgnored(this, read))
    return cb()

  var isGlobStar = remain[0] === minimatch.GLOBSTAR
  if (isGlobStar)
    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb)
  else
    this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb)
}

Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {
  var self = this
  this._readdir(abs, inGlobStar, function (er, entries) {
    return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
  })
}

Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {

  // if the abs isn't a dir, then nothing can match!
  if (!entries)
    return cb()

  // It will only match dot entries if it starts with a dot, or if
  // dot is set.  Stuff like @(.foo|.bar) isn't allowed.
  var pn = remain[0]
  var negate = !!this.minimatch.negate
  var rawGlob = pn._glob
  var dotOk = this.dot || rawGlob.charAt(0) === '.'

  var matchedEntries = []
  for (var i = 0; i < entries.length; i++) {
    var e = entries[i]
    if (e.charAt(0) !== '.' || dotOk) {
      var m
      if (negate && !prefix) {
        m = !e.match(pn)
      } else {
        m = e.match(pn)
      }
      if (m)
        matchedEntries.push(e)
    }
  }

  //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)

  var len = matchedEntries.length
  // If there are no matched entries, then nothing matches.
  if (len === 0)
    return cb()

  // if this is the last remaining pattern bit, then no need for
  // an additional stat *unless* the user has specified mark or
  // stat explicitly.  We know they exist, since readdir returned
  // them.

  if (remain.length === 1 && !this.mark && !this.stat) {
    if (!this.matches[index])
      this.matches[index] = Object.create(null)

    for (var i = 0; i < len; i ++) {
      var e = matchedEntries[i]
      if (prefix) {
        if (prefix !== '/')
          e = prefix + '/' + e
        else
          e = prefix + e
      }

      if (e.charAt(0) === '/' && !this.nomount) {
        e = path.join(this.root, e)
      }
      this._emitMatch(index, e)
    }
    // This was the last one, and no stats were needed
    return cb()
  }

  // now test all matched entries as stand-ins for that part
  // of the pattern.
  remain.shift()
  for (var i = 0; i < len; i ++) {
    var e = matchedEntries[i]
    var newPattern
    if (prefix) {
      if (prefix !== '/')
        e = prefix + '/' + e
      else
        e = prefix + e
    }
    this._process([e].concat(remain), index, inGlobStar, cb)
  }
  cb()
}

Glob.prototype._emitMatch = function (index, e) {
  if (this.aborted)
    return

  if (isIgnored(this, e))
    return

  if (this.paused) {
    this._emitQueue.push([index, e])
    return
  }

  var abs = isAbsolute(e) ? e : this._makeAbs(e)

  if (this.mark)
    e = this._mark(e)

  if (this.absolute)
    e = abs

  if (this.matches[index][e])
    return

  if (this.nodir) {
    var c = this.cache[abs]
    if (c === 'DIR' || Array.isArray(c))
      return
  }

  this.matches[index][e] = true

  var st = this.statCache[abs]
  if (st)
    this.emit('stat', e, st)

  this.emit('match', e)
}

Glob.prototype._readdirInGlobStar = function (abs, cb) {
  if (this.aborted)
    return

  // follow all symlinked directories forever
  // just proceed as if this is a non-globstar situation
  if (this.follow)
    return this._readdir(abs, false, cb)

  var lstatkey = 'lstat\0' + abs
  var self = this
  var lstatcb = inflight(lstatkey, lstatcb_)

  if (lstatcb)
    self.fs.lstat(abs, lstatcb)

  function lstatcb_ (er, lstat) {
    if (er && er.code === 'ENOENT')
      return cb()

    var isSym = lstat && lstat.isSymbolicLink()
    self.symlinks[abs] = isSym

    // If it's not a symlink or a dir, then it's definitely a regular file.
    // don't bother doing a readdir in that case.
    if (!isSym && lstat && !lstat.isDirectory()) {
      self.cache[abs] = 'FILE'
      cb()
    } else
      self._readdir(abs, false, cb)
  }
}

Glob.prototype._readdir = function (abs, inGlobStar, cb) {
  if (this.aborted)
    return

  cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb)
  if (!cb)
    return

  //console.error('RD %j %j', +inGlobStar, abs)
  if (inGlobStar && !ownProp(this.symlinks, abs))
    return this._readdirInGlobStar(abs, cb)

  if (ownProp(this.cache, abs)) {
    var c = this.cache[abs]
    if (!c || c === 'FILE')
      return cb()

    if (Array.isArray(c))
      return cb(null, c)
  }

  var self = this
  self.fs.readdir(abs, readdirCb(this, abs, cb))
}

function readdirCb (self, abs, cb) {
  return function (er, entries) {
    if (er)
      self._readdirError(abs, er, cb)
    else
      self._readdirEntries(abs, entries, cb)
  }
}

Glob.prototype._readdirEntries = function (abs, entries, cb) {
  if (this.aborted)
    return

  // if we haven't asked to stat everything, then just
  // assume that everything in there exists, so we can avoid
  // having to stat it a second time.
  if (!this.mark && !this.stat) {
    for (var i = 0; i < entries.length; i ++) {
      var e = entries[i]
      if (abs === '/')
        e = abs + e
      else
        e = abs + '/' + e
      this.cache[e] = true
    }
  }

  this.cache[abs] = entries
  return cb(null, entries)
}

Glob.prototype._readdirError = function (f, er, cb) {
  if (this.aborted)
    return

  // handle errors, and cache the information
  switch (er.code) {
    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
    case 'ENOTDIR': // totally normal. means it *does* exist.
      var abs = this._makeAbs(f)
      this.cache[abs] = 'FILE'
      if (abs === this.cwdAbs) {
        var error = new Error(er.code + ' invalid cwd ' + this.cwd)
        error.path = this.cwd
        error.code = er.code
        this.emit('error', error)
        this.abort()
      }
      break

    case 'ENOENT': // not terribly unusual
    case 'ELOOP':
    case 'ENAMETOOLONG':
    case 'UNKNOWN':
      this.cache[this._makeAbs(f)] = false
      break

    default: // some unusual error.  Treat as failure.
      this.cache[this._makeAbs(f)] = false
      if (this.strict) {
        this.emit('error', er)
        // If the error is handled, then we abort
        // if not, we threw out of here
        this.abort()
      }
      if (!this.silent)
        console.error('glob error', er)
      break
  }

  return cb()
}

Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {
  var self = this
  this._readdir(abs, inGlobStar, function (er, entries) {
    self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
  })
}


Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
  //console.error('pgs2', prefix, remain[0], entries)

  // no entries means not a dir, so it can never have matches
  // foo.txt/** doesn't match foo.txt
  if (!entries)
    return cb()

  // test without the globstar, and with every child both below
  // and replacing the globstar.
  var remainWithoutGlobStar = remain.slice(1)
  var gspref = prefix ? [ prefix ] : []
  var noGlobStar = gspref.concat(remainWithoutGlobStar)

  // the noGlobStar pattern exits the inGlobStar state
  this._process(noGlobStar, index, false, cb)

  var isSym = this.symlinks[abs]
  var len = entries.length

  // If it's a symlink, and we're in a globstar, then stop
  if (isSym && inGlobStar)
    return cb()

  for (var i = 0; i < len; i++) {
    var e = entries[i]
    if (e.charAt(0) === '.' && !this.dot)
      continue

    // these two cases enter the inGlobStar state
    var instead = gspref.concat(entries[i], remainWithoutGlobStar)
    this._process(instead, index, true, cb)

    var below = gspref.concat(entries[i], remain)
    this._process(below, index, true, cb)
  }

  cb()
}

Glob.prototype._processSimple = function (prefix, index, cb) {
  // XXX review this.  Shouldn't it be doing the mounting etc
  // before doing stat?  kinda weird?
  var self = this
  this._stat(prefix, function (er, exists) {
    self._processSimple2(prefix, index, er, exists, cb)
  })
}
Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {

  //console.error('ps2', prefix, exists)

  if (!this.matches[index])
    this.matches[index] = Object.create(null)

  // If it doesn't exist, then just mark the lack of results
  if (!exists)
    return cb()

  if (prefix && isAbsolute(prefix) && !this.nomount) {
    var trail = /[\/\\]$/.test(prefix)
    if (prefix.charAt(0) === '/') {
      prefix = path.join(this.root, prefix)
    } else {
      prefix = path.resolve(this.root, prefix)
      if (trail)
        prefix += '/'
    }
  }

  if (process.platform === 'win32')
    prefix = prefix.replace(/\\/g, '/')

  // Mark this as a match
  this._emitMatch(index, prefix)
  cb()
}

// Returns either 'DIR', 'FILE', or false
Glob.prototype._stat = function (f, cb) {
  var abs = this._makeAbs(f)
  var needDir = f.slice(-1) === '/'

  if (f.length > this.maxLength)
    return cb()

  if (!this.stat && ownProp(this.cache, abs)) {
    var c = this.cache[abs]

    if (Array.isArray(c))
      c = 'DIR'

    // It exists, but maybe not how we need it
    if (!needDir || c === 'DIR')
      return cb(null, c)

    if (needDir && c === 'FILE')
      return cb()

    // otherwise we have to stat, because maybe c=true
    // if we know it exists, but not what it is.
  }

  var exists
  var stat = this.statCache[abs]
  if (stat !== undefined) {
    if (stat === false)
      return cb(null, stat)
    else {
      var type = stat.isDirectory() ? 'DIR' : 'FILE'
      if (needDir && type === 'FILE')
        return cb()
      else
        return cb(null, type, stat)
    }
  }

  var self = this
  var statcb = inflight('stat\0' + abs, lstatcb_)
  if (statcb)
    self.fs.lstat(abs, statcb)

  function lstatcb_ (er, lstat) {
    if (lstat && lstat.isSymbolicLink()) {
      // If it's a symlink, then treat it as the target, unless
      // the target does not exist, then treat it as a file.
      return self.fs.stat(abs, function (er, stat) {
        if (er)
          self._stat2(f, abs, null, lstat, cb)
        else
          self._stat2(f, abs, er, stat, cb)
      })
    } else {
      self._stat2(f, abs, er, lstat, cb)
    }
  }
}

Glob.prototype._stat2 = function (f, abs, er, stat, cb) {
  if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {
    this.statCache[abs] = false
    return cb()
  }

  var needDir = f.slice(-1) === '/'
  this.statCache[abs] = stat

  if (abs.slice(-1) === '/' && stat && !stat.isDirectory())
    return cb(null, false, stat)

  var c = true
  if (stat)
    c = stat.isDirectory() ? 'DIR' : 'FILE'
  this.cache[abs] = this.cache[abs] || c

  if (needDir && c === 'FILE')
    return cb()

  return cb(null, c, stat)
}
{
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
  "name": "glob",
  "description": "a little globber",
  "version": "7.2.3",
  "publishConfig": {
    "tag": "v7-legacy"
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/node-glob.git"
  },
  "main": "glob.js",
  "files": [
    "glob.js",
    "sync.js",
    "common.js"
  ],
  "engines": {
    "node": "*"
  },
  "dependencies": {
    "fs.realpath": "^1.0.0",
    "inflight": "^1.0.4",
    "inherits": "2",
    "minimatch": "^3.1.1",
    "once": "^1.3.0",
    "path-is-absolute": "^1.0.0"
  },
  "devDependencies": {
    "memfs": "^3.2.0",
    "mkdirp": "0",
    "rimraf": "^2.2.8",
    "tap": "^15.0.6",
    "tick": "0.0.6"
  },
  "tap": {
    "before": "test/00-setup.js",
    "after": "test/zz-cleanup.js",
    "jobs": 1
  },
  "license": "ISC",
  "funding": {
    "url": "https://github.com/sponsors/isaacs"
  }
}module.exports = globSync
globSync.GlobSync = GlobSync

var rp = require('fs.realpath')
var minimatch = require('minimatch')
var Minimatch = minimatch.Minimatch
var Glob = require('./glob.js').Glob
var util = require('util')
var path = require('path')
var assert = require('assert')
var isAbsolute = require('path-is-absolute')
var common = require('./common.js')
var setopts = common.setopts
var ownProp = common.ownProp
var childrenIgnored = common.childrenIgnored
var isIgnored = common.isIgnored

function globSync (pattern, options) {
  if (typeof options === 'function' || arguments.length === 3)
    throw new TypeError('callback provided to sync glob\n'+
                        'See: https://github.com/isaacs/node-glob/issues/167')

  return new GlobSync(pattern, options).found
}

function GlobSync (pattern, options) {
  if (!pattern)
    throw new Error('must provide pattern')

  if (typeof options === 'function' || arguments.length === 3)
    throw new TypeError('callback provided to sync glob\n'+
                        'See: https://github.com/isaacs/node-glob/issues/167')

  if (!(this instanceof GlobSync))
    return new GlobSync(pattern, options)

  setopts(this, pattern, options)

  if (this.noprocess)
    return this

  var n = this.minimatch.set.length
  this.matches = new Array(n)
  for (var i = 0; i < n; i ++) {
    this._process(this.minimatch.set[i], i, false)
  }
  this._finish()
}

GlobSync.prototype._finish = function () {
  assert.ok(this instanceof GlobSync)
  if (this.realpath) {
    var self = this
    this.matches.forEach(function (matchset, index) {
      var set = self.matches[index] = Object.create(null)
      for (var p in matchset) {
        try {
          p = self._makeAbs(p)
          var real = rp.realpathSync(p, self.realpathCache)
          set[real] = true
        } catch (er) {
          if (er.syscall === 'stat')
            set[self._makeAbs(p)] = true
          else
            throw er
        }
      }
    })
  }
  common.finish(this)
}


GlobSync.prototype._process = function (pattern, index, inGlobStar) {
  assert.ok(this instanceof GlobSync)

  // Get the first [n] parts of pattern that are all strings.
  var n = 0
  while (typeof pattern[n] === 'string') {
    n ++
  }
  // now n is the index of the first one that is *not* a string.

  // See if there's anything else
  var prefix
  switch (n) {
    // if not, then this is rather simple
    case pattern.length:
      this._processSimple(pattern.join('/'), index)
      return

    case 0:
      // pattern *starts* with some non-trivial item.
      // going to readdir(cwd), but not include the prefix in matches.
      prefix = null
      break

    default:
      // pattern has some string bits in the front.
      // whatever it starts with, whether that's 'absolute' like /foo/bar,
      // or 'relative' like '../baz'
      prefix = pattern.slice(0, n).join('/')
      break
  }

  var remain = pattern.slice(n)

  // get the list of entries.
  var read
  if (prefix === null)
    read = '.'
  else if (isAbsolute(prefix) ||
      isAbsolute(pattern.map(function (p) {
        return typeof p === 'string' ? p : '[*]'
      }).join('/'))) {
    if (!prefix || !isAbsolute(prefix))
      prefix = '/' + prefix
    read = prefix
  } else
    read = prefix

  var abs = this._makeAbs(read)

  //if ignored, skip processing
  if (childrenIgnored(this, read))
    return

  var isGlobStar = remain[0] === minimatch.GLOBSTAR
  if (isGlobStar)
    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar)
  else
    this._processReaddir(prefix, read, abs, remain, index, inGlobStar)
}


GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) {
  var entries = this._readdir(abs, inGlobStar)

  // if the abs isn't a dir, then nothing can match!
  if (!entries)
    return

  // It will only match dot entries if it starts with a dot, or if
  // dot is set.  Stuff like @(.foo|.bar) isn't allowed.
  var pn = remain[0]
  var negate = !!this.minimatch.negate
  var rawGlob = pn._glob
  var dotOk = this.dot || rawGlob.charAt(0) === '.'

  var matchedEntries = []
  for (var i = 0; i < entries.length; i++) {
    var e = entries[i]
    if (e.charAt(0) !== '.' || dotOk) {
      var m
      if (negate && !prefix) {
        m = !e.match(pn)
      } else {
        m = e.match(pn)
      }
      if (m)
        matchedEntries.push(e)
    }
  }

  var len = matchedEntries.length
  // If there are no matched entries, then nothing matches.
  if (len === 0)
    return

  // if this is the last remaining pattern bit, then no need for
  // an additional stat *unless* the user has specified mark or
  // stat explicitly.  We know they exist, since readdir returned
  // them.

  if (remain.length === 1 && !this.mark && !this.stat) {
    if (!this.matches[index])
      this.matches[index] = Object.create(null)

    for (var i = 0; i < len; i ++) {
      var e = matchedEntries[i]
      if (prefix) {
        if (prefix.slice(-1) !== '/')
          e = prefix + '/' + e
        else
          e = prefix + e
      }

      if (e.charAt(0) === '/' && !this.nomount) {
        e = path.join(this.root, e)
      }
      this._emitMatch(index, e)
    }
    // This was the last one, and no stats were needed
    return
  }

  // now test all matched entries as stand-ins for that part
  // of the pattern.
  remain.shift()
  for (var i = 0; i < len; i ++) {
    var e = matchedEntries[i]
    var newPattern
    if (prefix)
      newPattern = [prefix, e]
    else
      newPattern = [e]
    this._process(newPattern.concat(remain), index, inGlobStar)
  }
}


GlobSync.prototype._emitMatch = function (index, e) {
  if (isIgnored(this, e))
    return

  var abs = this._makeAbs(e)

  if (this.mark)
    e = this._mark(e)

  if (this.absolute) {
    e = abs
  }

  if (this.matches[index][e])
    return

  if (this.nodir) {
    var c = this.cache[abs]
    if (c === 'DIR' || Array.isArray(c))
      return
  }

  this.matches[index][e] = true

  if (this.stat)
    this._stat(e)
}


GlobSync.prototype._readdirInGlobStar = function (abs) {
  // follow all symlinked directories forever
  // just proceed as if this is a non-globstar situation
  if (this.follow)
    return this._readdir(abs, false)

  var entries
  var lstat
  var stat
  try {
    lstat = this.fs.lstatSync(abs)
  } catch (er) {
    if (er.code === 'ENOENT') {
      // lstat failed, doesn't exist
      return null
    }
  }

  var isSym = lstat && lstat.isSymbolicLink()
  this.symlinks[abs] = isSym

  // If it's not a symlink or a dir, then it's definitely a regular file.
  // don't bother doing a readdir in that case.
  if (!isSym && lstat && !lstat.isDirectory())
    this.cache[abs] = 'FILE'
  else
    entries = this._readdir(abs, false)

  return entries
}

GlobSync.prototype._readdir = function (abs, inGlobStar) {
  var entries

  if (inGlobStar && !ownProp(this.symlinks, abs))
    return this._readdirInGlobStar(abs)

  if (ownProp(this.cache, abs)) {
    var c = this.cache[abs]
    if (!c || c === 'FILE')
      return null

    if (Array.isArray(c))
      return c
  }

  try {
    return this._readdirEntries(abs, this.fs.readdirSync(abs))
  } catch (er) {
    this._readdirError(abs, er)
    return null
  }
}

GlobSync.prototype._readdirEntries = function (abs, entries) {
  // if we haven't asked to stat everything, then just
  // assume that everything in there exists, so we can avoid
  // having to stat it a second time.
  if (!this.mark && !this.stat) {
    for (var i = 0; i < entries.length; i ++) {
      var e = entries[i]
      if (abs === '/')
        e = abs + e
      else
        e = abs + '/' + e
      this.cache[e] = true
    }
  }

  this.cache[abs] = entries

  // mark and cache dir-ness
  return entries
}

GlobSync.prototype._readdirError = function (f, er) {
  // handle errors, and cache the information
  switch (er.code) {
    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
    case 'ENOTDIR': // totally normal. means it *does* exist.
      var abs = this._makeAbs(f)
      this.cache[abs] = 'FILE'
      if (abs === this.cwdAbs) {
        var error = new Error(er.code + ' invalid cwd ' + this.cwd)
        error.path = this.cwd
        error.code = er.code
        throw error
      }
      break

    case 'ENOENT': // not terribly unusual
    case 'ELOOP':
    case 'ENAMETOOLONG':
    case 'UNKNOWN':
      this.cache[this._makeAbs(f)] = false
      break

    default: // some unusual error.  Treat as failure.
      this.cache[this._makeAbs(f)] = false
      if (this.strict)
        throw er
      if (!this.silent)
        console.error('glob error', er)
      break
  }
}

GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) {

  var entries = this._readdir(abs, inGlobStar)

  // no entries means not a dir, so it can never have matches
  // foo.txt/** doesn't match foo.txt
  if (!entries)
    return

  // test without the globstar, and with every child both below
  // and replacing the globstar.
  var remainWithoutGlobStar = remain.slice(1)
  var gspref = prefix ? [ prefix ] : []
  var noGlobStar = gspref.concat(remainWithoutGlobStar)

  // the noGlobStar pattern exits the inGlobStar state
  this._process(noGlobStar, index, false)

  var len = entries.length
  var isSym = this.symlinks[abs]

  // If it's a symlink, and we're in a globstar, then stop
  if (isSym && inGlobStar)
    return

  for (var i = 0; i < len; i++) {
    var e = entries[i]
    if (e.charAt(0) === '.' && !this.dot)
      continue

    // these two cases enter the inGlobStar state
    var instead = gspref.concat(entries[i], remainWithoutGlobStar)
    this._process(instead, index, true)

    var below = gspref.concat(entries[i], remain)
    this._process(below, index, true)
  }
}

GlobSync.prototype._processSimple = function (prefix, index) {
  // XXX review this.  Shouldn't it be doing the mounting etc
  // before doing stat?  kinda weird?
  var exists = this._stat(prefix)

  if (!this.matches[index])
    this.matches[index] = Object.create(null)

  // If it doesn't exist, then just mark the lack of results
  if (!exists)
    return

  if (prefix && isAbsolute(prefix) && !this.nomount) {
    var trail = /[\/\\]$/.test(prefix)
    if (prefix.charAt(0) === '/') {
      prefix = path.join(this.root, prefix)
    } else {
      prefix = path.resolve(this.root, prefix)
      if (trail)
        prefix += '/'
    }
  }

  if (process.platform === 'win32')
    prefix = prefix.replace(/\\/g, '/')

  // Mark this as a match
  this._emitMatch(index, prefix)
}

// Returns either 'DIR', 'FILE', or false
GlobSync.prototype._stat = function (f) {
  var abs = this._makeAbs(f)
  var needDir = f.slice(-1) === '/'

  if (f.length > this.maxLength)
    return false

  if (!this.stat && ownProp(this.cache, abs)) {
    var c = this.cache[abs]

    if (Array.isArray(c))
      c = 'DIR'

    // It exists, but maybe not how we need it
    if (!needDir || c === 'DIR')
      return c

    if (needDir && c === 'FILE')
      return false

    // otherwise we have to stat, because maybe c=true
    // if we know it exists, but not what it is.
  }

  var exists
  var stat = this.statCache[abs]
  if (!stat) {
    var lstat
    try {
      lstat = this.fs.lstatSync(abs)
    } catch (er) {
      if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {
        this.statCache[abs] = false
        return false
      }
    }

    if (lstat && lstat.isSymbolicLink()) {
      try {
        stat = this.fs.statSync(abs)
      } catch (er) {
        stat = lstat
      }
    } else {
      stat = lstat
    }
  }

  this.statCache[abs] = stat

  var c = true
  if (stat)
    c = stat.isDirectory() ? 'DIR' : 'FILE'

  this.cache[abs] = this.cache[abs] || c

  if (needDir && c === 'FILE')
    return false

  return c
}

GlobSync.prototype._mark = function (p) {
  return common.mark(this, p)
}

GlobSync.prototype._makeAbs = function (f) {
  return common.makeAbs(this, f)
}
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

var rimraf = require('./')

var help = false
var dashdash = false
var noglob = false
var args = process.argv.slice(2).filter(function(arg) {
  if (dashdash)
    return !!arg
  else if (arg === '--')
    dashdash = true
  else if (arg === '--no-glob' || arg === '-G')
    noglob = true
  else if (arg === '--glob' || arg === '-g')
    noglob = false
  else if (arg.match(/^(-+|\/)(h(elp)?|\?)$/))
    help = true
  else
    return !!arg
})

if (help || args.length === 0) {
  // If they didn't ask for help, then this is not a "success"
  var log = help ? console.log : console.error
  log('Usage: rimraf <path> [<path> ...]')
  log('')
  log('  Deletes all files and folders at "path" recursively.')
  log('')
  log('Options:')
  log('')
  log('  -h, --help     Display this usage info')
  log('  -G, --no-glob  Do not expand glob patterns in arguments')
  log('  -g, --glob     Expand glob patterns in arguments (default)')
  process.exit(help ? 0 : 1)
} else
  go(0)

function go (n) {
  if (n >= args.length)
    return
  var options = {}
  if (noglob)
    options = { glob: false }
  rimraf(args[n], options, function (er) {
    if (er)
      throw er
    go(n+1)
  })
}
{
  "name": "rimraf",
  "version": "2.7.1",
  "main": "rimraf.js",
  "description": "A deep deletion module for node (like `rm -rf`)",
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
  "license": "ISC",
  "repository": "git://github.com/isaacs/rimraf.git",
  "bin": "./bin.js",
  "dependencies": {
    "glob": "^7.1.3"
  },
  "files": [
    "LICENSE",
    "README.md",
    "bin.js",
    "rimraf.js"
  ],
  "devDependencies": {
    "mkdirp": "^0.5.1",
    "tap": "^12.1.1"
  }
}module.exports = rimraf
rimraf.sync = rimrafSync

var assert = require("assert")
var path = require("path")
var fs = require("fs")
var glob = undefined
try {
  glob = require("glob")
} catch (_err) {
  // treat glob as optional.
}
var _0666 = parseInt('666', 8)

var defaultGlobOpts = {
  nosort: true,
  silent: true
}

// for EMFILE handling
var timeout = 0

var isWindows = (process.platform === "win32")

function defaults (options) {
  var methods = [
    'unlink',
    'chmod',
    'stat',
    'lstat',
    'rmdir',
    'readdir'
  ]
  methods.forEach(function(m) {
    options[m] = options[m] || fs[m]
    m = m + 'Sync'
    options[m] = options[m] || fs[m]
  })

  options.maxBusyTries = options.maxBusyTries || 3
  options.emfileWait = options.emfileWait || 1000
  if (options.glob === false) {
    options.disableGlob = true
  }
  if (options.disableGlob !== true && glob === undefined) {
    throw Error('glob dependency not found, set `options.disableGlob = true` if intentional')
  }
  options.disableGlob = options.disableGlob || false
  options.glob = options.glob || defaultGlobOpts
}

function rimraf (p, options, cb) {
  if (typeof options === 'function') {
    cb = options
    options = {}
  }

  assert(p, 'rimraf: missing path')
  assert.equal(typeof p, 'string', 'rimraf: path should be a string')
  assert.equal(typeof cb, 'function', 'rimraf: callback function required')
  assert(options, 'rimraf: invalid options argument provided')
  assert.equal(typeof options, 'object', 'rimraf: options should be object')

  defaults(options)

  var busyTries = 0
  var errState = null
  var n = 0

  if (options.disableGlob || !glob.hasMagic(p))
    return afterGlob(null, [p])

  options.lstat(p, function (er, stat) {
    if (!er)
      return afterGlob(null, [p])

    glob(p, options.glob, afterGlob)
  })

  function next (er) {
    errState = errState || er
    if (--n === 0)
      cb(errState)
  }

  function afterGlob (er, results) {
    if (er)
      return cb(er)

    n = results.length
    if (n === 0)
      return cb()

    results.forEach(function (p) {
      rimraf_(p, options, function CB (er) {
        if (er) {
          if ((er.code === "EBUSY" || er.code === "ENOTEMPTY" || er.code === "EPERM") &&
              busyTries < options.maxBusyTries) {
            busyTries ++
            var time = busyTries * 100
            // try again, with the same exact callback as this one.
            return setTimeout(function () {
              rimraf_(p, options, CB)
            }, time)
          }

          // this one won't happen if graceful-fs is used.
          if (er.code === "EMFILE" && timeout < options.emfileWait) {
            return setTimeout(function () {
              rimraf_(p, options, CB)
            }, timeout ++)
          }

          // already gone
          if (er.code === "ENOENT") er = null
        }

        timeout = 0
        next(er)
      })
    })
  }
}

// Two possible strategies.
// 1. Assume it's a file.  unlink it, then do the dir stuff on EPERM or EISDIR
// 2. Assume it's a directory.  readdir, then do the file stuff on ENOTDIR
//
// Both result in an extra syscall when you guess wrong.  However, there
// are likely far more normal files in the world than directories.  This
// is based on the assumption that a the average number of files per
// directory is >= 1.
//
// If anyone ever complains about this, then I guess the strategy could
// be made configurable somehow.  But until then, YAGNI.
function rimraf_ (p, options, cb) {
  assert(p)
  assert(options)
  assert(typeof cb === 'function')

  // sunos lets the root user unlink directories, which is... weird.
  // so we have to lstat here and make sure it's not a dir.
  options.lstat(p, function (er, st) {
    if (er && er.code === "ENOENT")
      return cb(null)

    // Windows can EPERM on stat.  Life is suffering.
    if (er && er.code === "EPERM" && isWindows)
      fixWinEPERM(p, options, er, cb)

    if (st && st.isDirectory())
      return rmdir(p, options, er, cb)

    options.unlink(p, function (er) {
      if (er) {
        if (er.code === "ENOENT")
          return cb(null)
        if (er.code === "EPERM")
          return (isWindows)
            ? fixWinEPERM(p, options, er, cb)
            : rmdir(p, options, er, cb)
        if (er.code === "EISDIR")
          return rmdir(p, options, er, cb)
      }
      return cb(er)
    })
  })
}

function fixWinEPERM (p, options, er, cb) {
  assert(p)
  assert(options)
  assert(typeof cb === 'function')
  if (er)
    assert(er instanceof Error)

  options.chmod(p, _0666, function (er2) {
    if (er2)
      cb(er2.code === "ENOENT" ? null : er)
    else
      options.stat(p, function(er3, stats) {
        if (er3)
          cb(er3.code === "ENOENT" ? null : er)
        else if (stats.isDirectory())
          rmdir(p, options, er, cb)
        else
          options.unlink(p, cb)
      })
  })
}

function fixWinEPERMSync (p, options, er) {
  assert(p)
  assert(options)
  if (er)
    assert(er instanceof Error)

  try {
    options.chmodSync(p, _0666)
  } catch (er2) {
    if (er2.code === "ENOENT")
      return
    else
      throw er
  }

  try {
    var stats = options.statSync(p)
  } catch (er3) {
    if (er3.code === "ENOENT")
      return
    else
      throw er
  }

  if (stats.isDirectory())
    rmdirSync(p, options, er)
  else
    options.unlinkSync(p)
}

function rmdir (p, options, originalEr, cb) {
  assert(p)
  assert(options)
  if (originalEr)
    assert(originalEr instanceof Error)
  assert(typeof cb === 'function')

  // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)
  // if we guessed wrong, and it's not a directory, then
  // raise the original error.
  options.rmdir(p, function (er) {
    if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM"))
      rmkids(p, options, cb)
    else if (er && er.code === "ENOTDIR")
      cb(originalEr)
    else
      cb(er)
  })
}

function rmkids(p, options, cb) {
  assert(p)
  assert(options)
  assert(typeof cb === 'function')

  options.readdir(p, function (er, files) {
    if (er)
      return cb(er)
    var n = files.length
    if (n === 0)
      return options.rmdir(p, cb)
    var errState
    files.forEach(function (f) {
      rimraf(path.join(p, f), options, function (er) {
        if (errState)
          return
        if (er)
          return cb(errState = er)
        if (--n === 0)
          options.rmdir(p, cb)
      })
    })
  })
}

// this looks simpler, and is strictly *faster*, but will
// tie up the JavaScript thread and fail on excessively
// deep directory trees.
function rimrafSync (p, options) {
  options = options || {}
  defaults(options)

  assert(p, 'rimraf: missing path')
  assert.equal(typeof p, 'string', 'rimraf: path should be a string')
  assert(options, 'rimraf: missing options')
  assert.equal(typeof options, 'object', 'rimraf: options should be object')

  var results

  if (options.disableGlob || !glob.hasMagic(p)) {
    results = [p]
  } else {
    try {
      options.lstatSync(p)
      results = [p]
    } catch (er) {
      results = glob.sync(p, options.glob)
    }
  }

  if (!results.length)
    return

  for (var i = 0; i < results.length; i++) {
    var p = results[i]

    try {
      var st = options.lstatSync(p)
    } catch (er) {
      if (er.code === "ENOENT")
        return

      // Windows can EPERM on stat.  Life is suffering.
      if (er.code === "EPERM" && isWindows)
        fixWinEPERMSync(p, options, er)
    }

    try {
      // sunos lets the root user unlink directories, which is... weird.
      if (st && st.isDirectory())
        rmdirSync(p, options, null)
      else
        options.unlinkSync(p)
    } catch (er) {
      if (er.code === "ENOENT")
        return
      if (er.code === "EPERM")
        return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er)
      if (er.code !== "EISDIR")
        throw er

      rmdirSync(p, options, er)
    }
  }
}

function rmdirSync (p, options, originalEr) {
  assert(p)
  assert(options)
  if (originalEr)
    assert(originalEr instanceof Error)

  try {
    options.rmdirSync(p)
  } catch (er) {
    if (er.code === "ENOENT")
      return
    if (er.code === "ENOTDIR")
      throw originalEr
    if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")
      rmkidsSync(p, options)
  }
}

function rmkidsSync (p, options) {
  assert(p)
  assert(options)
  options.readdirSync(p).forEach(function (f) {
    rimrafSync(path.join(p, f), options)
  })

  // We only end up here once we got ENOTEMPTY at least once, and
  // at this point, we are guaranteed to have removed all the kids.
  // So, we know that it won't be ENOENT or ENOTDIR or anything else.
  // try really hard to delete stuff on windows, because it has a
  // PROFOUNDLY annoying habit of not closing handles promptly when
  // files are deleted, resulting in spurious ENOTEMPTY errors.
  var retries = isWindows ? 100 : 1
  var i = 0
  do {
    var threw = true
    try {
      var ret = options.rmdirSync(p, options)
      threw = false
      return ret
    } finally {
      if (++i < retries && threw)
        continue
    }
  } while (true)
}
MIT License

Copyright (c) 2013 Julian Gruber <julian@juliangruber.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.
var balanced = require('balanced-match');

module.exports = expandTop;

var escSlash = '\0SLASH'+Math.random()+'\0';
var escOpen = '\0OPEN'+Math.random()+'\0';
var escClose = '\0CLOSE'+Math.random()+'\0';
var escComma = '\0COMMA'+Math.random()+'\0';
var escPeriod = '\0PERIOD'+Math.random()+'\0';

function numeric(str) {
  return parseInt(str, 10) == str
    ? parseInt(str, 10)
    : str.charCodeAt(0);
}

function escapeBraces(str) {
  return str.split('\\\\').join(escSlash)
            .split('\\{').join(escOpen)
            .split('\\}').join(escClose)
            .split('\\,').join(escComma)
            .split('\\.').join(escPeriod);
}

function unescapeBraces(str) {
  return str.split(escSlash).join('\\')
            .split(escOpen).join('{')
            .split(escClose).join('}')
            .split(escComma).join(',')
            .split(escPeriod).join('.');
}


// Basically just str.split(","), but handling cases
// where we have nested braced sections, which should be
// treated as individual members, like {a,{b,c},d}
function parseCommaParts(str) {
  if (!str)
    return [''];

  var parts = [];
  var m = balanced('{', '}', str);

  if (!m)
    return str.split(',');

  var pre = m.pre;
  var body = m.body;
  var post = m.post;
  var p = pre.split(',');

  p[p.length-1] += '{' + body + '}';
  var postParts = parseCommaParts(post);
  if (post.length) {
    p[p.length-1] += postParts.shift();
    p.push.apply(p, postParts);
  }

  parts.push.apply(parts, p);

  return parts;
}

function expandTop(str) {
  if (!str)
    return [];

  // I don't know why Bash 4.3 does this, but it does.
  // Anything starting with {} will have the first two bytes preserved
  // but *only* at the top level, so {},a}b will not expand to anything,
  // but a{},b}c will be expanded to [a}c,abc].
  // One could argue that this is a bug in Bash, but since the goal of
  // this module is to match Bash's rules, we escape a leading {}
  if (str.substr(0, 2) === '{}') {
    str = '\\{\\}' + str.substr(2);
  }

  return expand(escapeBraces(str), true).map(unescapeBraces);
}

function embrace(str) {
  return '{' + str + '}';
}
function isPadded(el) {
  return /^-?0\d/.test(el);
}

function lte(i, y) {
  return i <= y;
}
function gte(i, y) {
  return i >= y;
}

function expand(str, isTop) {
  var expansions = [];

  var m = balanced('{', '}', str);
  if (!m) return [str];

  // no need to expand pre, since it is guaranteed to be free of brace-sets
  var pre = m.pre;
  var post = m.post.length
    ? expand(m.post, false)
    : [''];

  if (/\$$/.test(m.pre)) {    
    for (var k = 0; k < post.length; k++) {
      var expansion = pre+ '{' + m.body + '}' + post[k];
      expansions.push(expansion);
    }
  } else {
    var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
    var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
    var isSequence = isNumericSequence || isAlphaSequence;
    var isOptions = m.body.indexOf(',') >= 0;
    if (!isSequence && !isOptions) {
      // {a},b}
      if (m.post.match(/,.*\}/)) {
        str = m.pre + '{' + m.body + escClose + m.post;
        return expand(str);
      }
      return [str];
    }

    var n;
    if (isSequence) {
      n = m.body.split(/\.\./);
    } else {
      n = parseCommaParts(m.body);
      if (n.length === 1) {
        // x{{a,b}}y ==> x{a}y x{b}y
        n = expand(n[0], false).map(embrace);
        if (n.length === 1) {
          return post.map(function(p) {
            return m.pre + n[0] + p;
          });
        }
      }
    }

    // at this point, n is the parts, and we know it's not a comma set
    // with a single entry.
    var N;

    if (isSequence) {
      var x = numeric(n[0]);
      var y = numeric(n[1]);
      var width = Math.max(n[0].length, n[1].length)
      var incr = n.length == 3
        ? Math.abs(numeric(n[2]))
        : 1;
      var test = lte;
      var reverse = y < x;
      if (reverse) {
        incr *= -1;
        test = gte;
      }
      var pad = n.some(isPadded);

      N = [];

      for (var i = x; test(i, y); i += incr) {
        var c;
        if (isAlphaSequence) {
          c = String.fromCharCode(i);
          if (c === '\\')
            c = '';
        } else {
          c = String(i);
          if (pad) {
            var need = width - c.length;
            if (need > 0) {
              var z = new Array(need + 1).join('0');
              if (i < 0)
                c = '-' + z + c.slice(1);
              else
                c = z + c;
            }
          }
        }
        N.push(c);
      }
    } else {
      N = [];

      for (var j = 0; j < n.length; j++) {
        N.push.apply(N, expand(n[j], false));
      }
    }

    for (var j = 0; j < N.length; j++) {
      for (var k = 0; k < post.length; k++) {
        var expansion = pre + N[j] + post[k];
        if (!isTop || isSequence || expansion)
          expansions.push(expansion);
      }
    }
  }

  return expansions;
}

{
  "name": "brace-expansion",
  "description": "Brace expansion as known from sh/bash",
  "version": "2.0.1",
  "repository": {
    "type": "git",
    "url": "git://github.com/juliangruber/brace-expansion.git"
  },
  "homepage": "https://github.com/juliangruber/brace-expansion",
  "main": "index.js",
  "dependencies": {
    "balanced-match": "^1.0.0"
  },
  "devDependencies": {
    "@c4312/matcha": "^1.3.1",
    "tape": "^4.6.0"
  },
  "author": {
    "name": "Julian Gruber",
    "email": "mail@juliangruber.com",
    "url": "http://juliangruber.com"
  },
  "license": "MIT",
  "testling": {
    "files": "test/*.js",
    "browsers": [
      "ie/8..latest",
      "firefox/20..latest",
      "firefox/nightly",
      "chrome/25..latest",
      "chrome/canary",
      "opera/12..latest",
      "opera/next",
      "safari/5.1..latest",
      "ipad/6.0..latest",
      "iphone/6.0..latest",
      "android-browser/4.2..latest"
    ]
  }
}tidelift: "npm/brace-expansion"
patreon: juliangruber
The ISC License

Copyright (c) 2011-2022 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.
const minimatch = module.exports = (p, pattern, options = {}) => {
  assertValidPattern(pattern)

  // shortcut: comments match nothing.
  if (!options.nocomment && pattern.charAt(0) === '#') {
    return false
  }

  return new Minimatch(pattern, options).match(p)
}

module.exports = minimatch

const path = require('./lib/path.js')
minimatch.sep = path.sep

const GLOBSTAR = Symbol('globstar **')
minimatch.GLOBSTAR = GLOBSTAR
const expand = require('brace-expansion')

const plTypes = {
  '!': { open: '(?:(?!(?:', close: '))[^/]*?)'},
  '?': { open: '(?:', close: ')?' },
  '+': { open: '(?:', close: ')+' },
  '*': { open: '(?:', close: ')*' },
  '@': { open: '(?:', close: ')' }
}

// any single thing other than /
// don't need to escape / when using new RegExp()
const qmark = '[^/]'

// * => any number of characters
const star = qmark + '*?'

// ** when dots are allowed.  Anything goes, except .. and .
// not (^ or / followed by one or two dots followed by $ or /),
// followed by anything, any number of times.
const twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?'

// not a ^ or / followed by a dot,
// followed by anything, any number of times.
const twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?'

// "abc" -> { a:true, b:true, c:true }
const charSet = s => s.split('').reduce((set, c) => {
  set[c] = true
  return set
}, {})

// characters that need to be escaped in RegExp.
const reSpecials = charSet('().*{}+?[]^$\\!')

// characters that indicate we have to add the pattern start
const addPatternStartSet = charSet('[.(')

// normalizes slashes.
const slashSplit = /\/+/

minimatch.filter = (pattern, options = {}) =>
  (p, i, list) => minimatch(p, pattern, options)

const ext = (a, b = {}) => {
  const t = {}
  Object.keys(a).forEach(k => t[k] = a[k])
  Object.keys(b).forEach(k => t[k] = b[k])
  return t
}

minimatch.defaults = def => {
  if (!def || typeof def !== 'object' || !Object.keys(def).length) {
    return minimatch
  }

  const orig = minimatch

  const m = (p, pattern, options) => orig(p, pattern, ext(def, options))
  m.Minimatch = class Minimatch extends orig.Minimatch {
    constructor (pattern, options) {
      super(pattern, ext(def, options))
    }
  }
  m.Minimatch.defaults = options => orig.defaults(ext(def, options)).Minimatch
  m.filter = (pattern, options) => orig.filter(pattern, ext(def, options))
  m.defaults = options => orig.defaults(ext(def, options))
  m.makeRe = (pattern, options) => orig.makeRe(pattern, ext(def, options))
  m.braceExpand = (pattern, options) => orig.braceExpand(pattern, ext(def, options))
  m.match = (list, pattern, options) => orig.match(list, pattern, ext(def, options))

  return m
}





// Brace expansion:
// a{b,c}d -> abd acd
// a{b,}c -> abc ac
// a{0..3}d -> a0d a1d a2d a3d
// a{b,c{d,e}f}g -> abg acdfg acefg
// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
//
// Invalid sets are not expanded.
// a{2..}b -> a{2..}b
// a{b}c -> a{b}c
minimatch.braceExpand = (pattern, options) => braceExpand(pattern, options)

const braceExpand = (pattern, options = {}) => {
  assertValidPattern(pattern)

  // Thanks to Yeting Li <https://github.com/yetingli> for
  // improving this regexp to avoid a ReDOS vulnerability.
  if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) {
    // shortcut. no need to expand.
    return [pattern]
  }

  return expand(pattern)
}

const MAX_PATTERN_LENGTH = 1024 * 64
const assertValidPattern = pattern => {
  if (typeof pattern !== 'string') {
    throw new TypeError('invalid pattern')
  }

  if (pattern.length > MAX_PATTERN_LENGTH) {
    throw new TypeError('pattern is too long')
  }
}

// parse a component of the expanded set.
// At this point, no pattern may contain "/" in it
// so we're going to return a 2d array, where each entry is the full
// pattern, split on '/', and then turned into a regular expression.
// A regexp is made at the end which joins each array with an
// escaped /, and another full one which joins each regexp with |.
//
// Following the lead of Bash 4.1, note that "**" only has special meaning
// when it is the *only* thing in a path portion.  Otherwise, any series
// of * is equivalent to a single *.  Globstar behavior is enabled by
// default, and can be disabled by setting options.noglobstar.
const SUBPARSE = Symbol('subparse')

minimatch.makeRe = (pattern, options) =>
  new Minimatch(pattern, options || {}).makeRe()

minimatch.match = (list, pattern, options = {}) => {
  const mm = new Minimatch(pattern, options)
  list = list.filter(f => mm.match(f))
  if (mm.options.nonull && !list.length) {
    list.push(pattern)
  }
  return list
}

// replace stuff like \* with *
const globUnescape = s => s.replace(/\\(.)/g, '$1')
const regExpEscape = s => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')

class Minimatch {
  constructor (pattern, options) {
    assertValidPattern(pattern)

    if (!options) options = {}

    this.options = options
    this.set = []
    this.pattern = pattern
    this.windowsPathsNoEscape = !!options.windowsPathsNoEscape ||
      options.allowWindowsEscape === false
    if (this.windowsPathsNoEscape) {
      this.pattern = this.pattern.replace(/\\/g, '/')
    }
    this.regexp = null
    this.negate = false
    this.comment = false
    this.empty = false
    this.partial = !!options.partial

    // make the set of regexps etc.
    this.make()
  }

  debug () {}

  make () {
    const pattern = this.pattern
    const options = this.options

    // empty patterns and comments match nothing.
    if (!options.nocomment && pattern.charAt(0) === '#') {
      this.comment = true
      return
    }
    if (!pattern) {
      this.empty = true
      return
    }

    // step 1: figure out negation, etc.
    this.parseNegate()

    // step 2: expand braces
    let set = this.globSet = this.braceExpand()

    if (options.debug) this.debug = (...args) => console.error(...args)

    this.debug(this.pattern, set)

    // step 3: now we have a set, so turn each one into a series of path-portion
    // matching patterns.
    // These will be regexps, except in the case of "**", which is
    // set to the GLOBSTAR object for globstar behavior,
    // and will not contain any / characters
    set = this.globParts = set.map(s => s.split(slashSplit))

    this.debug(this.pattern, set)

    // glob --> regexps
    set = set.map((s, si, set) => s.map(this.parse, this))

    this.debug(this.pattern, set)

    // filter out everything that didn't compile properly.
    set = set.filter(s => s.indexOf(false) === -1)

    this.debug(this.pattern, set)

    this.set = set
  }

  parseNegate () {
    if (this.options.nonegate) return

    const pattern = this.pattern
    let negate = false
    let negateOffset = 0

    for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {
      negate = !negate
      negateOffset++
    }

    if (negateOffset) this.pattern = pattern.substr(negateOffset)
    this.negate = negate
  }

  // set partial to true to test if, for example,
  // "/a/b" matches the start of "/*/b/*/d"
  // Partial means, if you run out of file before you run
  // out of pattern, then that's fine, as long as all
  // the parts match.
  matchOne (file, pattern, partial) {
    var options = this.options

    this.debug('matchOne',
      { 'this': this, file: file, pattern: pattern })

    this.debug('matchOne', file.length, pattern.length)

    for (var fi = 0,
        pi = 0,
        fl = file.length,
        pl = pattern.length
        ; (fi < fl) && (pi < pl)
        ; fi++, pi++) {
      this.debug('matchOne loop')
      var p = pattern[pi]
      var f = file[fi]

      this.debug(pattern, p, f)

      // should be impossible.
      // some invalid regexp stuff in the set.
      /* istanbul ignore if */
      if (p === false) return false

      if (p === GLOBSTAR) {
        this.debug('GLOBSTAR', [pattern, p, f])

        // "**"
        // a/**/b/**/c would match the following:
        // a/b/x/y/z/c
        // a/x/y/z/b/c
        // a/b/x/b/x/c
        // a/b/c
        // To do this, take the rest of the pattern after
        // the **, and see if it would match the file remainder.
        // If so, return success.
        // If not, the ** "swallows" a segment, and try again.
        // This is recursively awful.
        //
        // a/**/b/**/c matching a/b/x/y/z/c
        // - a matches a
        // - doublestar
        //   - matchOne(b/x/y/z/c, b/**/c)
        //     - b matches b
        //     - doublestar
        //       - matchOne(x/y/z/c, c) -> no
        //       - matchOne(y/z/c, c) -> no
        //       - matchOne(z/c, c) -> no
        //       - matchOne(c, c) yes, hit
        var fr = fi
        var pr = pi + 1
        if (pr === pl) {
          this.debug('** at the end')
          // a ** at the end will just swallow the rest.
          // We have found a match.
          // however, it will not swallow /.x, unless
          // options.dot is set.
          // . and .. are *never* matched by **, for explosively
          // exponential reasons.
          for (; fi < fl; fi++) {
            if (file[fi] === '.' || file[fi] === '..' ||
              (!options.dot && file[fi].charAt(0) === '.')) return false
          }
          return true
        }

        // ok, let's see if we can swallow whatever we can.
        while (fr < fl) {
          var swallowee = file[fr]

          this.debug('\nglobstar while', file, fr, pattern, pr, swallowee)

          // XXX remove this slice.  Just pass the start index.
          if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
            this.debug('globstar found match!', fr, fl, swallowee)
            // found a match.
            return true
          } else {
            // can't swallow "." or ".." ever.
            // can only swallow ".foo" when explicitly asked.
            if (swallowee === '.' || swallowee === '..' ||
              (!options.dot && swallowee.charAt(0) === '.')) {
              this.debug('dot detected!', file, fr, pattern, pr)
              break
            }

            // ** swallows a segment, and continue.
            this.debug('globstar swallow a segment, and continue')
            fr++
          }
        }

        // no match was found.
        // However, in partial mode, we can't say this is necessarily over.
        // If there's more *pattern* left, then
        /* istanbul ignore if */
        if (partial) {
          // ran out of file
          this.debug('\n>>> no match, partial?', file, fr, pattern, pr)
          if (fr === fl) return true
        }
        return false
      }

      // something other than **
      // non-magic patterns just have to match exactly
      // patterns with magic have been turned into regexps.
      var hit
      if (typeof p === 'string') {
        hit = f === p
        this.debug('string match', p, f, hit)
      } else {
        hit = f.match(p)
        this.debug('pattern match', p, f, hit)
      }

      if (!hit) return false
    }

    // Note: ending in / means that we'll get a final ""
    // at the end of the pattern.  This can only match a
    // corresponding "" at the end of the file.
    // If the file ends in /, then it can only match a
    // a pattern that ends in /, unless the pattern just
    // doesn't have any more for it. But, a/b/ should *not*
    // match "a/b/*", even though "" matches against the
    // [^/]*? pattern, except in partial mode, where it might
    // simply not be reached yet.
    // However, a/b/ should still satisfy a/*

    // now either we fell off the end of the pattern, or we're done.
    if (fi === fl && pi === pl) {
      // ran out of pattern and filename at the same time.
      // an exact hit!
      return true
    } else if (fi === fl) {
      // ran out of file, but still had pattern left.
      // this is ok if we're doing the match as part of
      // a glob fs traversal.
      return partial
    } else /* istanbul ignore else */ if (pi === pl) {
      // ran out of pattern, still have file left.
      // this is only acceptable if we're on the very last
      // empty segment of a file with a trailing slash.
      // a/* should match a/b/
      return (fi === fl - 1) && (file[fi] === '')
    }

    // should be unreachable.
    /* istanbul ignore next */
    throw new Error('wtf?')
  }

  braceExpand () {
    return braceExpand(this.pattern, this.options)
  }

  parse (pattern, isSub) {
    assertValidPattern(pattern)

    const options = this.options

    // shortcuts
    if (pattern === '**') {
      if (!options.noglobstar)
        return GLOBSTAR
      else
        pattern = '*'
    }
    if (pattern === '') return ''

    let re = ''
    let hasMagic = !!options.nocase
    let escaping = false
    // ? => one single character
    const patternListStack = []
    const negativeLists = []
    let stateChar
    let inClass = false
    let reClassStart = -1
    let classStart = -1
    let cs
    let pl
    let sp
    // . and .. never match anything that doesn't start with .,
    // even when options.dot is set.
    const patternStart = pattern.charAt(0) === '.' ? '' // anything
    // not (start or / followed by . or .. followed by / or end)
    : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))'
    : '(?!\\.)'

    const clearStateChar = () => {
      if (stateChar) {
        // we had some state-tracking character
        // that wasn't consumed by this pass.
        switch (stateChar) {
          case '*':
            re += star
            hasMagic = true
          break
          case '?':
            re += qmark
            hasMagic = true
          break
          default:
            re += '\\' + stateChar
          break
        }
        this.debug('clearStateChar %j %j', stateChar, re)
        stateChar = false
      }
    }

    for (let i = 0, c; (i < pattern.length) && (c = pattern.charAt(i)); i++) {
      this.debug('%s\t%s %s %j', pattern, i, re, c)

      // skip over any that are escaped.
      if (escaping) {
        /* istanbul ignore next - completely not allowed, even escaped. */
        if (c === '/') {
          return false
        }

        if (reSpecials[c]) {
          re += '\\'
        }
        re += c
        escaping = false
        continue
      }

      switch (c) {
        /* istanbul ignore next */
        case '/': {
          // Should already be path-split by now.
          return false
        }

        case '\\':
          clearStateChar()
          escaping = true
        continue

        // the various stateChar values
        // for the "extglob" stuff.
        case '?':
        case '*':
        case '+':
        case '@':
        case '!':
          this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c)

          // all of those are literals inside a class, except that
          // the glob [!a] means [^a] in regexp
          if (inClass) {
            this.debug('  in class')
            if (c === '!' && i === classStart + 1) c = '^'
            re += c
            continue
          }

          // if we already have a stateChar, then it means
          // that there was something like ** or +? in there.
          // Handle the stateChar, then proceed with this one.
          this.debug('call clearStateChar %j', stateChar)
          clearStateChar()
          stateChar = c
          // if extglob is disabled, then +(asdf|foo) isn't a thing.
          // just clear the statechar *now*, rather than even diving into
          // the patternList stuff.
          if (options.noext) clearStateChar()
        continue

        case '(':
          if (inClass) {
            re += '('
            continue
          }

          if (!stateChar) {
            re += '\\('
            continue
          }

          patternListStack.push({
            type: stateChar,
            start: i - 1,
            reStart: re.length,
            open: plTypes[stateChar].open,
            close: plTypes[stateChar].close
          })
          // negation is (?:(?!js)[^/]*)
          re += stateChar === '!' ? '(?:(?!(?:' : '(?:'
          this.debug('plType %j %j', stateChar, re)
          stateChar = false
        continue

        case ')':
          if (inClass || !patternListStack.length) {
            re += '\\)'
            continue
          }

          clearStateChar()
          hasMagic = true
          pl = patternListStack.pop()
          // negation is (?:(?!js)[^/]*)
          // The others are (?:<pattern>)<type>
          re += pl.close
          if (pl.type === '!') {
            negativeLists.push(pl)
          }
          pl.reEnd = re.length
        continue

        case '|':
          if (inClass || !patternListStack.length) {
            re += '\\|'
            continue
          }

          clearStateChar()
          re += '|'
        continue

        // these are mostly the same in regexp and glob
        case '[':
          // swallow any state-tracking char before the [
          clearStateChar()

          if (inClass) {
            re += '\\' + c
            continue
          }

          inClass = true
          classStart = i
          reClassStart = re.length
          re += c
        continue

        case ']':
          //  a right bracket shall lose its special
          //  meaning and represent itself in
          //  a bracket expression if it occurs
          //  first in the list.  -- POSIX.2 2.8.3.2
          if (i === classStart + 1 || !inClass) {
            re += '\\' + c
            continue
          }

          // handle the case where we left a class open.
          // "[z-a]" is valid, equivalent to "\[z-a\]"
          // split where the last [ was, make sure we don't have
          // an invalid re. if so, re-walk the contents of the
          // would-be class to re-translate any characters that
          // were passed through as-is
          // TODO: It would probably be faster to determine this
          // without a try/catch and a new RegExp, but it's tricky
          // to do safely.  For now, this is safe and works.
          cs = pattern.substring(classStart + 1, i)
          try {
            RegExp('[' + cs + ']')
          } catch (er) {
            // not a valid class!
            sp = this.parse(cs, SUBPARSE)
            re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]'
            hasMagic = hasMagic || sp[1]
            inClass = false
            continue
          }

          // finish up the class.
          hasMagic = true
          inClass = false
          re += c
        continue

        default:
          // swallow any state char that wasn't consumed
          clearStateChar()

          if (reSpecials[c] && !(c === '^' && inClass)) {
            re += '\\'
          }

          re += c
          break

      } // switch
    } // for

    // handle the case where we left a class open.
    // "[abc" is valid, equivalent to "\[abc"
    if (inClass) {
      // split where the last [ was, and escape it
      // this is a huge pita.  We now have to re-walk
      // the contents of the would-be class to re-translate
      // any characters that were passed through as-is
      cs = pattern.substr(classStart + 1)
      sp = this.parse(cs, SUBPARSE)
      re = re.substr(0, reClassStart) + '\\[' + sp[0]
      hasMagic = hasMagic || sp[1]
    }

    // handle the case where we had a +( thing at the *end*
    // of the pattern.
    // each pattern list stack adds 3 chars, and we need to go through
    // and escape any | chars that were passed through as-is for the regexp.
    // Go through and escape them, taking care not to double-escape any
    // | chars that were already escaped.
    for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {
      let tail
      tail = re.slice(pl.reStart + pl.open.length)
      this.debug('setting tail', re, pl)
      // maybe some even number of \, then maybe 1 \, followed by a |
      tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, (_, $1, $2) => {
        /* istanbul ignore else - should already be done */
        if (!$2) {
          // the | isn't already escaped, so escape it.
          $2 = '\\'
        }

        // need to escape all those slashes *again*, without escaping the
        // one that we need for escaping the | character.  As it works out,
        // escaping an even number of slashes can be done by simply repeating
        // it exactly after itself.  That's why this trick works.
        //
        // I am sorry that you have to see this.
        return $1 + $1 + $2 + '|'
      })

      this.debug('tail=%j\n   %s', tail, tail, pl, re)
      const t = pl.type === '*' ? star
        : pl.type === '?' ? qmark
        : '\\' + pl.type

      hasMagic = true
      re = re.slice(0, pl.reStart) + t + '\\(' + tail
    }

    // handle trailing things that only matter at the very end.
    clearStateChar()
    if (escaping) {
      // trailing \\
      re += '\\\\'
    }

    // only need to apply the nodot start if the re starts with
    // something that could conceivably capture a dot
    const addPatternStart = addPatternStartSet[re.charAt(0)]

    // Hack to work around lack of negative lookbehind in JS
    // A pattern like: *.!(x).!(y|z) needs to ensure that a name
    // like 'a.xyz.yz' doesn't match.  So, the first negative
    // lookahead, has to look ALL the way ahead, to the end of
    // the pattern.
    for (let n = negativeLists.length - 1; n > -1; n--) {
      const nl = negativeLists[n]

      const nlBefore = re.slice(0, nl.reStart)
      const nlFirst = re.slice(nl.reStart, nl.reEnd - 8)
      let nlAfter = re.slice(nl.reEnd)
      const nlLast = re.slice(nl.reEnd - 8, nl.reEnd) + nlAfter

      // Handle nested stuff like *(*.js|!(*.json)), where open parens
      // mean that we should *not* include the ) in the bit that is considered
      // "after" the negated section.
      const openParensBefore = nlBefore.split('(').length - 1
      let cleanAfter = nlAfter
      for (let i = 0; i < openParensBefore; i++) {
        cleanAfter = cleanAfter.replace(/\)[+*?]?/, '')
      }
      nlAfter = cleanAfter

      const dollar = nlAfter === '' && isSub !== SUBPARSE ? '$' : ''
      re = nlBefore + nlFirst + nlAfter + dollar + nlLast
    }

    // if the re is not "" at this point, then we need to make sure
    // it doesn't match against an empty path part.
    // Otherwise a/* will match a/, which it should not.
    if (re !== '' && hasMagic) {
      re = '(?=.)' + re
    }

    if (addPatternStart) {
      re = patternStart + re
    }

    // parsing just a piece of a larger pattern.
    if (isSub === SUBPARSE) {
      return [re, hasMagic]
    }

    // skip the regexp for non-magical patterns
    // unescape anything in it, though, so that it'll be
    // an exact match against a file etc.
    if (!hasMagic) {
      return globUnescape(pattern)
    }

    const flags = options.nocase ? 'i' : ''
    try {
      return Object.assign(new RegExp('^' + re + '$', flags), {
        _glob: pattern,
        _src: re,
      })
    } catch (er) /* istanbul ignore next - should be impossible */ {
      // If it was an invalid regular expression, then it can't match
      // anything.  This trick looks for a character after the end of
      // the string, which is of course impossible, except in multi-line
      // mode, but it's not a /m regex.
      return new RegExp('$.')
    }
  }

  makeRe () {
    if (this.regexp || this.regexp === false) return this.regexp

    // at this point, this.set is a 2d array of partial
    // pattern strings, or "**".
    //
    // It's better to use .match().  This function shouldn't
    // be used, really, but it's pretty convenient sometimes,
    // when you just want to work with a regex.
    const set = this.set

    if (!set.length) {
      this.regexp = false
      return this.regexp
    }
    const options = this.options

    const twoStar = options.noglobstar ? star
      : options.dot ? twoStarDot
      : twoStarNoDot
    const flags = options.nocase ? 'i' : ''

    // coalesce globstars and regexpify non-globstar patterns
    // if it's the only item, then we just do one twoStar
    // if it's the first, and there are more, prepend (\/|twoStar\/)? to next
    // if it's the last, append (\/twoStar|) to previous
    // if it's in the middle, append (\/|\/twoStar\/) to previous
    // then filter out GLOBSTAR symbols
    let re = set.map(pattern => {
      pattern = pattern.map(p =>
        typeof p === 'string' ? regExpEscape(p)
        : p === GLOBSTAR ? GLOBSTAR
        : p._src
      ).reduce((set, p) => {
        if (!(set[set.length - 1] === GLOBSTAR && p === GLOBSTAR)) {
          set.push(p)
        }
        return set
      }, [])
      pattern.forEach((p, i) => {
        if (p !== GLOBSTAR || pattern[i-1] === GLOBSTAR) {
          return
        }
        if (i === 0) {
          if (pattern.length > 1) {
            pattern[i+1] = '(?:\\\/|' + twoStar + '\\\/)?' + pattern[i+1]
          } else {
            pattern[i] = twoStar
          }
        } else if (i === pattern.length - 1) {
          pattern[i-1] += '(?:\\\/|' + twoStar + ')?'
        } else {
          pattern[i-1] += '(?:\\\/|\\\/' + twoStar + '\\\/)' + pattern[i+1]
          pattern[i+1] = GLOBSTAR
        }
      })
      return pattern.filter(p => p !== GLOBSTAR).join('/')
    }).join('|')

    // must match entire pattern
    // ending in a * or ** will make it less strict.
    re = '^(?:' + re + ')$'

    // can match anything, as long as it's not this.
    if (this.negate) re = '^(?!' + re + ').*$'

    try {
      this.regexp = new RegExp(re, flags)
    } catch (ex) /* istanbul ignore next - should be impossible */ {
      this.regexp = false
    }
    return this.regexp
  }

  match (f, partial = this.partial) {
    this.debug('match', f, this.pattern)
    // short-circuit in the case of busted things.
    // comments, etc.
    if (this.comment) return false
    if (this.empty) return f === ''

    if (f === '/' && partial) return true

    const options = this.options

    // windows: need to use /, not \
    if (path.sep !== '/') {
      f = f.split(path.sep).join('/')
    }

    // treat the test path as a set of pathparts.
    f = f.split(slashSplit)
    this.debug(this.pattern, 'split', f)

    // just ONE of the pattern sets in this.set needs to match
    // in order for it to be valid.  If negating, then just one
    // match means that we have failed.
    // Either way, return on the first hit.

    const set = this.set
    this.debug(this.pattern, 'set', set)

    // Find the basename of the path by looking for the last non-empty segment
    let filename
    for (let i = f.length - 1; i >= 0; i--) {
      filename = f[i]
      if (filename) break
    }

    for (let i = 0; i < set.length; i++) {
      const pattern = set[i]
      let file = f
      if (options.matchBase && pattern.length === 1) {
        file = [filename]
      }
      const hit = this.matchOne(file, pattern, partial)
      if (hit) {
        if (options.flipNegate) return true
        return !this.negate
      }
    }

    // didn't get any hits.  this is success if it's a negative
    // pattern, failure otherwise.
    if (options.flipNegate) return false
    return this.negate
  }

  static defaults (def) {
    return minimatch.defaults(def).Minimatch
  }
}

minimatch.Minimatch = Minimatch
{
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me)",
  "name": "minimatch",
  "description": "a glob matcher in javascript",
  "version": "5.1.0",
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/minimatch.git"
  },
  "main": "minimatch.js",
  "engines": {
    "node": ">=10"
  },
  "dependencies": {
    "brace-expansion": "^2.0.1"
  },
  "devDependencies": {
    "tap": "^15.1.6"
  },
  "license": "ISC",
  "files": [
    "minimatch.js",
    "lib"
  ]
}const isWindows = typeof process === 'object' &&
  process &&
  process.platform === 'win32'
module.exports = isWindows ? { sep: '\\' } : { sep: '/' }
Copyright (c) 2013 Brian J. Brennan

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

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

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
var bufferEqual = require('buffer-equal-constant-time');
var Buffer = require('safe-buffer').Buffer;
var crypto = require('crypto');
var formatEcdsa = require('ecdsa-sig-formatter');
var util = require('util');

var MSG_INVALID_ALGORITHM = '"%s" is not a valid algorithm.\n  Supported algorithms are:\n  "HS256", "HS384", "HS512", "RS256", "RS384", "RS512", "PS256", "PS384", "PS512", "ES256", "ES384", "ES512" and "none".'
var MSG_INVALID_SECRET = 'secret must be a string or buffer';
var MSG_INVALID_VERIFIER_KEY = 'key must be a string or a buffer';
var MSG_INVALID_SIGNER_KEY = 'key must be a string, a buffer or an object';

var supportsKeyObjects = typeof crypto.createPublicKey === 'function';
if (supportsKeyObjects) {
  MSG_INVALID_VERIFIER_KEY += ' or a KeyObject';
  MSG_INVALID_SECRET += 'or a KeyObject';
}

function checkIsPublicKey(key) {
  if (Buffer.isBuffer(key)) {
    return;
  }

  if (typeof key === 'string') {
    return;
  }

  if (!supportsKeyObjects) {
    throw typeError(MSG_INVALID_VERIFIER_KEY);
  }

  if (typeof key !== 'object') {
    throw typeError(MSG_INVALID_VERIFIER_KEY);
  }

  if (typeof key.type !== 'string') {
    throw typeError(MSG_INVALID_VERIFIER_KEY);
  }

  if (typeof key.asymmetricKeyType !== 'string') {
    throw typeError(MSG_INVALID_VERIFIER_KEY);
  }

  if (typeof key.export !== 'function') {
    throw typeError(MSG_INVALID_VERIFIER_KEY);
  }
};

function checkIsPrivateKey(key) {
  if (Buffer.isBuffer(key)) {
    return;
  }

  if (typeof key === 'string') {
    return;
  }

  if (typeof key === 'object') {
    return;
  }

  throw typeError(MSG_INVALID_SIGNER_KEY);
};

function checkIsSecretKey(key) {
  if (Buffer.isBuffer(key)) {
    return;
  }

  if (typeof key === 'string') {
    return key;
  }

  if (!supportsKeyObjects) {
    throw typeError(MSG_INVALID_SECRET);
  }

  if (typeof key !== 'object') {
    throw typeError(MSG_INVALID_SECRET);
  }

  if (key.type !== 'secret') {
    throw typeError(MSG_INVALID_SECRET);
  }

  if (typeof key.export !== 'function') {
    throw typeError(MSG_INVALID_SECRET);
  }
}

function fromBase64(base64) {
  return base64
    .replace(/=/g, '')
    .replace(/\+/g, '-')
    .replace(/\//g, '_');
}

function toBase64(base64url) {
  base64url = base64url.toString();

  var padding = 4 - base64url.length % 4;
  if (padding !== 4) {
    for (var i = 0; i < padding; ++i) {
      base64url += '=';
    }
  }

  return base64url
    .replace(/\-/g, '+')
    .replace(/_/g, '/');
}

function typeError(template) {
  var args = [].slice.call(arguments, 1);
  var errMsg = util.format.bind(util, template).apply(null, args);
  return new TypeError(errMsg);
}

function bufferOrString(obj) {
  return Buffer.isBuffer(obj) || typeof obj === 'string';
}

function normalizeInput(thing) {
  if (!bufferOrString(thing))
    thing = JSON.stringify(thing);
  return thing;
}

function createHmacSigner(bits) {
  return function sign(thing, secret) {
    checkIsSecretKey(secret);
    thing = normalizeInput(thing);
    var hmac = crypto.createHmac('sha' + bits, secret);
    var sig = (hmac.update(thing), hmac.digest('base64'))
    return fromBase64(sig);
  }
}

function createHmacVerifier(bits) {
  return function verify(thing, signature, secret) {
    var computedSig = createHmacSigner(bits)(thing, secret);
    return bufferEqual(Buffer.from(signature), Buffer.from(computedSig));
  }
}

function createKeySigner(bits) {
 return function sign(thing, privateKey) {
    checkIsPrivateKey(privateKey);
    thing = normalizeInput(thing);
    // Even though we are specifying "RSA" here, this works with ECDSA
    // keys as well.
    var signer = crypto.createSign('RSA-SHA' + bits);
    var sig = (signer.update(thing), signer.sign(privateKey, 'base64'));
    return fromBase64(sig);
  }
}

function createKeyVerifier(bits) {
  return function verify(thing, signature, publicKey) {
    checkIsPublicKey(publicKey);
    thing = normalizeInput(thing);
    signature = toBase64(signature);
    var verifier = crypto.createVerify('RSA-SHA' + bits);
    verifier.update(thing);
    return verifier.verify(publicKey, signature, 'base64');
  }
}

function createPSSKeySigner(bits) {
  return function sign(thing, privateKey) {
    checkIsPrivateKey(privateKey);
    thing = normalizeInput(thing);
    var signer = crypto.createSign('RSA-SHA' + bits);
    var sig = (signer.update(thing), signer.sign({
      key: privateKey,
      padding: crypto.constants.RSA_PKCS1_PSS_PADDING,
      saltLength: crypto.constants.RSA_PSS_SALTLEN_DIGEST
    }, 'base64'));
    return fromBase64(sig);
  }
}

function createPSSKeyVerifier(bits) {
  return function verify(thing, signature, publicKey) {
    checkIsPublicKey(publicKey);
    thing = normalizeInput(thing);
    signature = toBase64(signature);
    var verifier = crypto.createVerify('RSA-SHA' + bits);
    verifier.update(thing);
    return verifier.verify({
      key: publicKey,
      padding: crypto.constants.RSA_PKCS1_PSS_PADDING,
      saltLength: crypto.constants.RSA_PSS_SALTLEN_DIGEST
    }, signature, 'base64');
  }
}

function createECDSASigner(bits) {
  var inner = createKeySigner(bits);
  return function sign() {
    var signature = inner.apply(null, arguments);
    signature = formatEcdsa.derToJose(signature, 'ES' + bits);
    return signature;
  };
}

function createECDSAVerifer(bits) {
  var inner = createKeyVerifier(bits);
  return function verify(thing, signature, publicKey) {
    signature = formatEcdsa.joseToDer(signature, 'ES' + bits).toString('base64');
    var result = inner(thing, signature, publicKey);
    return result;
  };
}

function createNoneSigner() {
  return function sign() {
    return '';
  }
}

function createNoneVerifier() {
  return function verify(thing, signature) {
    return signature === '';
  }
}

module.exports = function jwa(algorithm) {
  var signerFactories = {
    hs: createHmacSigner,
    rs: createKeySigner,
    ps: createPSSKeySigner,
    es: createECDSASigner,
    none: createNoneSigner,
  }
  var verifierFactories = {
    hs: createHmacVerifier,
    rs: createKeyVerifier,
    ps: createPSSKeyVerifier,
    es: createECDSAVerifer,
    none: createNoneVerifier,
  }
  var match = algorithm.match(/^(RS|PS|ES|HS)(256|384|512)$|^(none)$/i);
  if (!match)
    throw typeError(MSG_INVALID_ALGORITHM, algorithm);
  var algo = (match[1] || match[3]).toLowerCase();
  var bits = match[2];

  return {
    sign: signerFactories[algo](bits),
    verify: verifierFactories[algo](bits),
  }
};
{
  "name": "jwa",
  "version": "1.4.1",
  "description": "JWA implementation (supports all JWS algorithms)",
  "main": "index.js",
  "directories": {
    "test": "test"
  },
  "dependencies": {
    "buffer-equal-constant-time": "1.0.1",
    "ecdsa-sig-formatter": "1.0.11",
    "safe-buffer": "^5.0.1"
  },
  "devDependencies": {
    "base64url": "^2.0.0",
    "jwk-to-pem": "^2.0.1",
    "semver": "4.3.6",
    "tap": "6.2.0"
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/brianloveswords/node-jwa.git"
  },
  "author": "Brian J. Brennan <brianloveswords@gmail.com>",
  "license": "MIT"
}Copyright (c) 2013 Brian J. Brennan

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.
/*global exports*/
var SignStream = require('./lib/sign-stream');
var VerifyStream = require('./lib/verify-stream');

var ALGORITHMS = [
  'HS256', 'HS384', 'HS512',
  'RS256', 'RS384', 'RS512',
  'PS256', 'PS384', 'PS512',
  'ES256', 'ES384', 'ES512'
];

exports.ALGORITHMS = ALGORITHMS;
exports.sign = SignStream.sign;
exports.verify = VerifyStream.verify;
exports.decode = VerifyStream.decode;
exports.isValid = VerifyStream.isValid;
exports.createSign = function createSign(opts) {
  return new SignStream(opts);
};
exports.createVerify = function createVerify(opts) {
  return new VerifyStream(opts);
};
{
  "name": "jws",
  "version": "3.2.2",
  "description": "Implementation of JSON Web Signatures",
  "main": "index.js",
  "directories": {
    "test": "test"
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/brianloveswords/node-jws.git"
  },
  "author": "Brian J Brennan",
  "license": "MIT",
  "readmeFilename": "readme.md",
  "dependencies": {
    "jwa": "^1.4.1",
    "safe-buffer": "^5.0.1"
  },
  "devDependencies": {
    "semver": "^5.1.0",
    "tape": "~2.14.0"
  }
}/*global module, process*/
var Buffer = require('safe-buffer').Buffer;
var Stream = require('stream');
var util = require('util');

function DataStream(data) {
  this.buffer = null;
  this.writable = true;
  this.readable = true;

  // No input
  if (!data) {
    this.buffer = Buffer.alloc(0);
    return this;
  }

  // Stream
  if (typeof data.pipe === 'function') {
    this.buffer = Buffer.alloc(0);
    data.pipe(this);
    return this;
  }

  // Buffer or String
  // or Object (assumedly a passworded key)
  if (data.length || typeof data === 'object') {
    this.buffer = data;
    this.writable = false;
    process.nextTick(function () {
      this.emit('end', data);
      this.readable = false;
      this.emit('close');
    }.bind(this));
    return this;
  }

  throw new TypeError('Unexpected data type ('+ typeof data + ')');
}
util.inherits(DataStream, Stream);

DataStream.prototype.write = function write(data) {
  this.buffer = Buffer.concat([this.buffer, Buffer.from(data)]);
  this.emit('data', data);
};

DataStream.prototype.end = function end(data) {
  if (data)
    this.write(data);
  this.emit('end', data);
  this.emit('close');
  this.writable = false;
  this.readable = false;
};

module.exports = DataStream;
/*global module*/
var Buffer = require('safe-buffer').Buffer;
var DataStream = require('./data-stream');
var jwa = require('jwa');
var Stream = require('stream');
var toString = require('./tostring');
var util = require('util');

function base64url(string, encoding) {
  return Buffer
    .from(string, encoding)
    .toString('base64')
    .replace(/=/g, '')
    .replace(/\+/g, '-')
    .replace(/\//g, '_');
}

function jwsSecuredInput(header, payload, encoding) {
  encoding = encoding || 'utf8';
  var encodedHeader = base64url(toString(header), 'binary');
  var encodedPayload = base64url(toString(payload), encoding);
  return util.format('%s.%s', encodedHeader, encodedPayload);
}

function jwsSign(opts) {
  var header = opts.header;
  var payload = opts.payload;
  var secretOrKey = opts.secret || opts.privateKey;
  var encoding = opts.encoding;
  var algo = jwa(header.alg);
  var securedInput = jwsSecuredInput(header, payload, encoding);
  var signature = algo.sign(securedInput, secretOrKey);
  return util.format('%s.%s', securedInput, signature);
}

function SignStream(opts) {
  var secret = opts.secret||opts.privateKey||opts.key;
  var secretStream = new DataStream(secret);
  this.readable = true;
  this.header = opts.header;
  this.encoding = opts.encoding;
  this.secret = this.privateKey = this.key = secretStream;
  this.payload = new DataStream(opts.payload);
  this.secret.once('close', function () {
    if (!this.payload.writable && this.readable)
      this.sign();
  }.bind(this));

  this.payload.once('close', function () {
    if (!this.secret.writable && this.readable)
      this.sign();
  }.bind(this));
}
util.inherits(SignStream, Stream);

SignStream.prototype.sign = function sign() {
  try {
    var signature = jwsSign({
      header: this.header,
      payload: this.payload.buffer,
      secret: this.secret.buffer,
      encoding: this.encoding
    });
    this.emit('done', signature);
    this.emit('data', signature);
    this.emit('end');
    this.readable = false;
    return signature;
  } catch (e) {
    this.readable = false;
    this.emit('error', e);
    this.emit('close');
  }
};

SignStream.sign = jwsSign;

module.exports = SignStream;
/*global module*/
var Buffer = require('buffer').Buffer;

module.exports = function toString(obj) {
  if (typeof obj === 'string')
    return obj;
  if (typeof obj === 'number' || Buffer.isBuffer(obj))
    return obj.toString();
  return JSON.stringify(obj);
};
/*global module*/
var Buffer = require('safe-buffer').Buffer;
var DataStream = require('./data-stream');
var jwa = require('jwa');
var Stream = require('stream');
var toString = require('./tostring');
var util = require('util');
var JWS_REGEX = /^[a-zA-Z0-9\-_]+?\.[a-zA-Z0-9\-_]+?\.([a-zA-Z0-9\-_]+)?$/;

function isObject(thing) {
  return Object.prototype.toString.call(thing) === '[object Object]';
}

function safeJsonParse(thing) {
  if (isObject(thing))
    return thing;
  try { return JSON.parse(thing); }
  catch (e) { return undefined; }
}

function headerFromJWS(jwsSig) {
  var encodedHeader = jwsSig.split('.', 1)[0];
  return safeJsonParse(Buffer.from(encodedHeader, 'base64').toString('binary'));
}

function securedInputFromJWS(jwsSig) {
  return jwsSig.split('.', 2).join('.');
}

function signatureFromJWS(jwsSig) {
  return jwsSig.split('.')[2];
}

function payloadFromJWS(jwsSig, encoding) {
  encoding = encoding || 'utf8';
  var payload = jwsSig.split('.')[1];
  return Buffer.from(payload, 'base64').toString(encoding);
}

function isValidJws(string) {
  return JWS_REGEX.test(string) && !!headerFromJWS(string);
}

function jwsVerify(jwsSig, algorithm, secretOrKey) {
  if (!algorithm) {
    var err = new Error("Missing algorithm parameter for jws.verify");
    err.code = "MISSING_ALGORITHM";
    throw err;
  }
  jwsSig = toString(jwsSig);
  var signature = signatureFromJWS(jwsSig);
  var securedInput = securedInputFromJWS(jwsSig);
  var algo = jwa(algorithm);
  return algo.verify(securedInput, signature, secretOrKey);
}

function jwsDecode(jwsSig, opts) {
  opts = opts || {};
  jwsSig = toString(jwsSig);

  if (!isValidJws(jwsSig))
    return null;

  var header = headerFromJWS(jwsSig);

  if (!header)
    return null;

  var payload = payloadFromJWS(jwsSig);
  if (header.typ === 'JWT' || opts.json)
    payload = JSON.parse(payload, opts.encoding);

  return {
    header: header,
    payload: payload,
    signature: signatureFromJWS(jwsSig)
  };
}

function VerifyStream(opts) {
  opts = opts || {};
  var secretOrKey = opts.secret||opts.publicKey||opts.key;
  var secretStream = new DataStream(secretOrKey);
  this.readable = true;
  this.algorithm = opts.algorithm;
  this.encoding = opts.encoding;
  this.secret = this.publicKey = this.key = secretStream;
  this.signature = new DataStream(opts.signature);
  this.secret.once('close', function () {
    if (!this.signature.writable && this.readable)
      this.verify();
  }.bind(this));

  this.signature.once('close', function () {
    if (!this.secret.writable && this.readable)
      this.verify();
  }.bind(this));
}
util.inherits(VerifyStream, Stream);
VerifyStream.prototype.verify = function verify() {
  try {
    var valid = jwsVerify(this.signature.buffer, this.algorithm, this.key.buffer);
    var obj = jwsDecode(this.signature.buffer, this.encoding);
    this.emit('done', valid, obj);
    this.emit('data', valid);
    this.emit('end');
    this.readable = false;
    return valid;
  } catch (e) {
    this.readable = false;
    this.emit('error', e);
    this.emit('close');
  }
};

VerifyStream.decode = jwsDecode;
VerifyStream.isValid = isValidJws;
VerifyStream.verify = jwsVerify;

module.exports = VerifyStream;
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.
{
  "name": "semver",
  "version": "5.7.1",
  "description": "The semantic version parser used by npm.",
  "main": "semver.js",
  "devDependencies": {
    "tap": "^13.0.0-rc.18"
  },
  "license": "ISC",
  "repository": "https://github.com/npm/node-semver",
  "bin": {
    "semver": "./bin/semver"
  },
  "files": [
    "bin",
    "range.bnf",
    "semver.js"
  ],
  "tap": {
    "check-coverage": true
  }
}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]+
exports = module.exports = SemVer

var debug
/* istanbul ignore next */
if (typeof process === 'object' &&
    process.env &&
    process.env.NODE_DEBUG &&
    /\bsemver\b/i.test(process.env.NODE_DEBUG)) {
  debug = function () {
    var args = Array.prototype.slice.call(arguments, 0)
    args.unshift('SEMVER')
    console.log.apply(console, args)
  }
} else {
  debug = function () {}
}

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

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

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

// The actual regexps go on exports.re
var re = exports.re = []
var src = exports.src = []
var R = 0

// 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.

var NUMERICIDENTIFIER = R++
src[NUMERICIDENTIFIER] = '0|[1-9]\\d*'
var NUMERICIDENTIFIERLOOSE = R++
src[NUMERICIDENTIFIERLOOSE] = '[0-9]+'

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

var NONNUMERICIDENTIFIER = R++
src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*'

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

var MAINVERSION = R++
src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' +
                   '(' + src[NUMERICIDENTIFIER] + ')\\.' +
                   '(' + src[NUMERICIDENTIFIER] + ')'

var MAINVERSIONLOOSE = R++
src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
                        '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
                        '(' + src[NUMERICIDENTIFIERLOOSE] + ')'

// ## Pre-release Version Identifier
// A numeric identifier, or a non-numeric identifier.

var PRERELEASEIDENTIFIER = R++
src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] +
                            '|' + src[NONNUMERICIDENTIFIER] + ')'

var PRERELEASEIDENTIFIERLOOSE = R++
src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] +
                                 '|' + src[NONNUMERICIDENTIFIER] + ')'

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

var PRERELEASE = R++
src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] +
                  '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))'

var PRERELEASELOOSE = R++
src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] +
                       '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))'

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

var BUILDIDENTIFIER = R++
src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+'

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

var BUILD = R++
src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] +
             '(?:\\.' + src[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.

var FULL = R++
var FULLPLAIN = 'v?' + src[MAINVERSION] +
                src[PRERELEASE] + '?' +
                src[BUILD] + '?'

src[FULL] = '^' + 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.
var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] +
                 src[PRERELEASELOOSE] + '?' +
                 src[BUILD] + '?'

var LOOSE = R++
src[LOOSE] = '^' + LOOSEPLAIN + '$'

var GTLT = R++
src[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.
var XRANGEIDENTIFIERLOOSE = R++
src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'
var XRANGEIDENTIFIER = R++
src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*'

var XRANGEPLAIN = R++
src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' +
                   '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
                   '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
                   '(?:' + src[PRERELEASE] + ')?' +
                   src[BUILD] + '?' +
                   ')?)?'

var XRANGEPLAINLOOSE = R++
src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
                        '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
                        '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
                        '(?:' + src[PRERELEASELOOSE] + ')?' +
                        src[BUILD] + '?' +
                        ')?)?'

var XRANGE = R++
src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$'
var XRANGELOOSE = R++
src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$'

// Coercion.
// Extract anything that could conceivably be a part of a valid semver
var COERCE = R++
src[COERCE] = '(?:^|[^\\d])' +
              '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' +
              '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
              '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
              '(?:$|[^\\d])'

// Tilde ranges.
// Meaning is "reasonably at or greater than"
var LONETILDE = R++
src[LONETILDE] = '(?:~>?)'

var TILDETRIM = R++
src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+'
re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g')
var tildeTrimReplace = '$1~'

var TILDE = R++
src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$'
var TILDELOOSE = R++
src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$'

// Caret ranges.
// Meaning is "at least and backwards compatible with"
var LONECARET = R++
src[LONECARET] = '(?:\\^)'

var CARETTRIM = R++
src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+'
re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g')
var caretTrimReplace = '$1^'

var CARET = R++
src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$'
var CARETLOOSE = R++
src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$'

// A simple gt/lt/eq thing, or just "" to indicate "any version"
var COMPARATORLOOSE = R++
src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$'
var COMPARATOR = R++
src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$'

// An expression to strip any whitespace between the gtlt and the thing
// it modifies, so that `> 1.2.3` ==> `>1.2.3`
var COMPARATORTRIM = R++
src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] +
                      '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')'

// this one has to use the /g flag
re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g')
var 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.
var HYPHENRANGE = R++
src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' +
                   '\\s+-\\s+' +
                   '(' + src[XRANGEPLAIN] + ')' +
                   '\\s*$'

var HYPHENRANGELOOSE = R++
src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' +
                        '\\s+-\\s+' +
                        '(' + src[XRANGEPLAINLOOSE] + ')' +
                        '\\s*$'

// Star ranges basically just allow anything at all.
var STAR = R++
src[STAR] = '(<|>)?=?\\s*\\*'

// Compile to actual regexp objects.
// All are flag-free, unless they were created above with a flag.
for (var i = 0; i < R; i++) {
  debug(i, src[i])
  if (!re[i]) {
    re[i] = new RegExp(src[i])
  }
}

exports.parse = parse
function parse (version, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

  if (version instanceof SemVer) {
    return version
  }

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

  if (version.length > MAX_LENGTH) {
    return null
  }

  var r = options.loose ? re[LOOSE] : re[FULL]
  if (!r.test(version)) {
    return null
  }

  try {
    return new SemVer(version, options)
  } catch (er) {
    return null
  }
}

exports.valid = valid
function valid (version, options) {
  var v = parse(version, options)
  return v ? v.version : null
}

exports.clean = clean
function clean (version, options) {
  var s = parse(version.trim().replace(/^[=v]+/, ''), options)
  return s ? s.version : null
}

exports.SemVer = SemVer

function SemVer (version, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }
  if (version instanceof SemVer) {
    if (version.loose === options.loose) {
      return version
    } else {
      version = version.version
    }
  } else if (typeof version !== 'string') {
    throw new TypeError('Invalid Version: ' + version)
  }

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

  if (!(this instanceof SemVer)) {
    return new SemVer(version, options)
  }

  debug('SemVer', version, options)
  this.options = options
  this.loose = !!options.loose

  var m = version.trim().match(options.loose ? re[LOOSE] : re[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(function (id) {
      if (/^[0-9]+$/.test(id)) {
        var num = +id
        if (num >= 0 && num < MAX_SAFE_INTEGER) {
          return num
        }
      }
      return id
    })
  }

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

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

SemVer.prototype.toString = function () {
  return this.version
}

SemVer.prototype.compare = function (other) {
  debug('SemVer.compare', this.version, this.options, other)
  if (!(other instanceof SemVer)) {
    other = new SemVer(other, this.options)
  }

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

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

  return compareIdentifiers(this.major, other.major) ||
         compareIdentifiers(this.minor, other.minor) ||
         compareIdentifiers(this.patch, other.patch)
}

SemVer.prototype.comparePre = function (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
  }

  var i = 0
  do {
    var a = this.prerelease[i]
    var 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)
}

// preminor will bump the version up to the next minor release, and immediately
// down to pre-release. premajor and prepatch work the same way.
SemVer.prototype.inc = function (release, identifier) {
  switch (release) {
    case 'premajor':
      this.prerelease.length = 0
      this.patch = 0
      this.minor = 0
      this.major++
      this.inc('pre', identifier)
      break
    case 'preminor':
      this.prerelease.length = 0
      this.patch = 0
      this.minor++
      this.inc('pre', identifier)
      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)
      this.inc('pre', identifier)
      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)
      }
      this.inc('pre', identifier)
      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':
      if (this.prerelease.length === 0) {
        this.prerelease = [0]
      } else {
        var 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
          this.prerelease.push(0)
        }
      }
      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
        if (this.prerelease[0] === identifier) {
          if (isNaN(this.prerelease[1])) {
            this.prerelease = [identifier, 0]
          }
        } else {
          this.prerelease = [identifier, 0]
        }
      }
      break

    default:
      throw new Error('invalid increment argument: ' + release)
  }
  this.format()
  this.raw = this.version
  return this
}

exports.inc = inc
function inc (version, release, loose, identifier) {
  if (typeof (loose) === 'string') {
    identifier = loose
    loose = undefined
  }

  try {
    return new SemVer(version, loose).inc(release, identifier).version
  } catch (er) {
    return null
  }
}

exports.diff = diff
function diff (version1, version2) {
  if (eq(version1, version2)) {
    return null
  } else {
    var v1 = parse(version1)
    var v2 = parse(version2)
    var prefix = ''
    if (v1.prerelease.length || v2.prerelease.length) {
      prefix = 'pre'
      var defaultResult = 'prerelease'
    }
    for (var key in v1) {
      if (key === 'major' || key === 'minor' || key === 'patch') {
        if (v1[key] !== v2[key]) {
          return prefix + key
        }
      }
    }
    return defaultResult // may be undefined
  }
}

exports.compareIdentifiers = compareIdentifiers

var numeric = /^[0-9]+$/
function compareIdentifiers (a, b) {
  var anum = numeric.test(a)
  var 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
}

exports.rcompareIdentifiers = rcompareIdentifiers
function rcompareIdentifiers (a, b) {
  return compareIdentifiers(b, a)
}

exports.major = major
function major (a, loose) {
  return new SemVer(a, loose).major
}

exports.minor = minor
function minor (a, loose) {
  return new SemVer(a, loose).minor
}

exports.patch = patch
function patch (a, loose) {
  return new SemVer(a, loose).patch
}

exports.compare = compare
function compare (a, b, loose) {
  return new SemVer(a, loose).compare(new SemVer(b, loose))
}

exports.compareLoose = compareLoose
function compareLoose (a, b) {
  return compare(a, b, true)
}

exports.rcompare = rcompare
function rcompare (a, b, loose) {
  return compare(b, a, loose)
}

exports.sort = sort
function sort (list, loose) {
  return list.sort(function (a, b) {
    return exports.compare(a, b, loose)
  })
}

exports.rsort = rsort
function rsort (list, loose) {
  return list.sort(function (a, b) {
    return exports.rcompare(a, b, loose)
  })
}

exports.gt = gt
function gt (a, b, loose) {
  return compare(a, b, loose) > 0
}

exports.lt = lt
function lt (a, b, loose) {
  return compare(a, b, loose) < 0
}

exports.eq = eq
function eq (a, b, loose) {
  return compare(a, b, loose) === 0
}

exports.neq = neq
function neq (a, b, loose) {
  return compare(a, b, loose) !== 0
}

exports.gte = gte
function gte (a, b, loose) {
  return compare(a, b, loose) >= 0
}

exports.lte = lte
function lte (a, b, loose) {
  return compare(a, b, loose) <= 0
}

exports.cmp = cmp
function 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)
  }
}

exports.Comparator = Comparator
function Comparator (comp, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

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

  if (!(this instanceof Comparator)) {
    return new Comparator(comp, options)
  }

  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)
}

var ANY = {}
Comparator.prototype.parse = function (comp) {
  var r = this.options.loose ? re[COMPARATORLOOSE] : re[COMPARATOR]
  var m = comp.match(r)

  if (!m) {
    throw new TypeError('Invalid comparator: ' + comp)
  }

  this.operator = 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)
  }
}

Comparator.prototype.toString = function () {
  return this.value
}

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

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

  if (typeof version === 'string') {
    version = new SemVer(version, this.options)
  }

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

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

  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

  var rangeTmp

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

  var sameDirectionIncreasing =
    (this.operator === '>=' || this.operator === '>') &&
    (comp.operator === '>=' || comp.operator === '>')
  var sameDirectionDecreasing =
    (this.operator === '<=' || this.operator === '<') &&
    (comp.operator === '<=' || comp.operator === '<')
  var sameSemVer = this.semver.version === comp.semver.version
  var differentDirectionsInclusive =
    (this.operator === '>=' || this.operator === '<=') &&
    (comp.operator === '>=' || comp.operator === '<=')
  var oppositeDirectionsLessThan =
    cmp(this.semver, '<', comp.semver, options) &&
    ((this.operator === '>=' || this.operator === '>') &&
    (comp.operator === '<=' || comp.operator === '<'))
  var oppositeDirectionsGreaterThan =
    cmp(this.semver, '>', comp.semver, options) &&
    ((this.operator === '<=' || this.operator === '<') &&
    (comp.operator === '>=' || comp.operator === '>'))

  return sameDirectionIncreasing || sameDirectionDecreasing ||
    (sameSemVer && differentDirectionsInclusive) ||
    oppositeDirectionsLessThan || oppositeDirectionsGreaterThan
}

exports.Range = Range
function Range (range, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

  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) {
    return new Range(range.value, options)
  }

  if (!(this instanceof Range)) {
    return new Range(range, options)
  }

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

  // First, split based on boolean or ||
  this.raw = range
  this.set = range.split(/\s*\|\|\s*/).map(function (range) {
    return this.parseRange(range.trim())
  }, this).filter(function (c) {
    // throw out any that are not relevant for whatever reason
    return c.length
  })

  if (!this.set.length) {
    throw new TypeError('Invalid SemVer Range: ' + range)
  }

  this.format()
}

Range.prototype.format = function () {
  this.range = this.set.map(function (comps) {
    return comps.join(' ').trim()
  }).join('||').trim()
  return this.range
}

Range.prototype.toString = function () {
  return this.range
}

Range.prototype.parseRange = function (range) {
  var loose = this.options.loose
  range = range.trim()
  // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
  var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE]
  range = range.replace(hr, hyphenReplace)
  debug('hyphen replace', range)
  // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
  range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace)
  debug('comparator trim', range, re[COMPARATORTRIM])

  // `~ 1.2.3` => `~1.2.3`
  range = range.replace(re[TILDETRIM], tildeTrimReplace)

  // `^ 1.2.3` => `^1.2.3`
  range = range.replace(re[CARETTRIM], caretTrimReplace)

  // normalize spaces
  range = range.split(/\s+/).join(' ')

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

  var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR]
  var set = range.split(' ').map(function (comp) {
    return parseComparator(comp, this.options)
  }, this).join(' ').split(/\s+/)
  if (this.options.loose) {
    // in loose mode, throw out any that are not valid comparators
    set = set.filter(function (comp) {
      return !!comp.match(compRe)
    })
  }
  set = set.map(function (comp) {
    return new Comparator(comp, this.options)
  }, this)

  return set
}

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

  return this.set.some(function (thisComparators) {
    return thisComparators.every(function (thisComparator) {
      return range.set.some(function (rangeComparators) {
        return rangeComparators.every(function (rangeComparator) {
          return thisComparator.intersects(rangeComparator, options)
        })
      })
    })
  })
}

// Mostly just for testing and legacy API reasons
exports.toComparators = toComparators
function toComparators (range, options) {
  return new Range(range, options).set.map(function (comp) {
    return comp.map(function (c) {
      return c.value
    }).join(' ').trim().split(' ')
  })
}

// comprised of xranges, tildes, stars, and gtlt's at this point.
// already replaced the hyphen ranges
// turn into a set of JUST comparators.
function parseComparator (comp, options) {
  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
}

function isX (id) {
  return !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
// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0
// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0
// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0
// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0
function replaceTildes (comp, options) {
  return comp.trim().split(/\s+/).map(function (comp) {
    return replaceTilde(comp, options)
  }).join(' ')
}

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

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

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

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

function replaceCaret (comp, options) {
  debug('caret', comp, options)
  var r = options.loose ? re[CARETLOOSE] : re[CARET]
  return comp.replace(r, function (_, M, m, p, pr) {
    debug('caret', comp, _, M, m, p, pr)
    var ret

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

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

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

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

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

    if (xM) {
      if (gtlt === '>' || gtlt === '<') {
        // nothing is allowed
        ret = '<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
        // >1.2.3 => >= 1.2.4
        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
        }
      }

      ret = gtlt + M + '.' + m + '.' + p
    } else if (xm) {
      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'
    } else if (xp) {
      ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.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.
function replaceStars (comp, options) {
  debug('replaceStars', comp, options)
  // Looseness is ignored here.  star is always as loose as it gets!
  return comp.trim().replace(re[STAR], '')
}

// This function is passed to string.replace(re[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 Any 3.4.x will do
// 1.2 - 3.4 => >=1.2.0 <3.5.0
function hyphenReplace ($0,
  from, fM, fm, fp, fpr, fb,
  to, tM, tm, tp, tpr, tb) {
  if (isX(fM)) {
    from = ''
  } else if (isX(fm)) {
    from = '>=' + fM + '.0.0'
  } else if (isX(fp)) {
    from = '>=' + fM + '.' + fm + '.0'
  } else {
    from = '>=' + from
  }

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

  return (from + ' ' + to).trim()
}

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

  if (typeof version === 'string') {
    version = new SemVer(version, this.options)
  }

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

function testSet (set, version, options) {
  for (var 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 (i = 0; i < set.length; i++) {
      debug(set[i].semver)
      if (set[i].semver === ANY) {
        continue
      }

      if (set[i].semver.prerelease.length > 0) {
        var 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
}

exports.satisfies = satisfies
function satisfies (version, range, options) {
  try {
    range = new Range(range, options)
  } catch (er) {
    return false
  }
  return range.test(version)
}

exports.maxSatisfying = maxSatisfying
function maxSatisfying (versions, range, options) {
  var max = null
  var maxSV = null
  try {
    var rangeObj = new Range(range, options)
  } catch (er) {
    return null
  }
  versions.forEach(function (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
}

exports.minSatisfying = minSatisfying
function minSatisfying (versions, range, options) {
  var min = null
  var minSV = null
  try {
    var rangeObj = new Range(range, options)
  } catch (er) {
    return null
  }
  versions.forEach(function (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
}

exports.minVersion = minVersion
function minVersion (range, loose) {
  range = new Range(range, loose)

  var 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 (var i = 0; i < range.set.length; ++i) {
    var comparators = range.set[i]

    comparators.forEach(function (comparator) {
      // Clone to avoid manipulating the comparator's semver object.
      var 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 (!minver || gt(minver, compver)) {
            minver = compver
          }
          break
        case '<':
        case '<=':
          /* Ignore maximum versions */
          break
        /* istanbul ignore next */
        default:
          throw new Error('Unexpected operation: ' + comparator.operator)
      }
    })
  }

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

  return null
}

exports.validRange = validRange
function 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
  }
}

// Determine if version is less than all the versions possible in the range
exports.ltr = ltr
function ltr (version, range, options) {
  return outside(version, range, '<', options)
}

// Determine if version is greater than all the versions possible in the range.
exports.gtr = gtr
function gtr (version, range, options) {
  return outside(version, range, '>', options)
}

exports.outside = outside
function outside (version, range, hilo, options) {
  version = new SemVer(version, options)
  range = new Range(range, options)

  var 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 satisifes 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 (var i = 0; i < range.set.length; ++i) {
    var comparators = range.set[i]

    var high = null
    var low = null

    comparators.forEach(function (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
}

exports.prerelease = prerelease
function prerelease (version, options) {
  var parsed = parse(version, options)
  return (parsed && parsed.prerelease.length) ? parsed.prerelease : null
}

exports.intersects = intersects
function intersects (r1, r2, options) {
  r1 = new Range(r1, options)
  r2 = new Range(r2, options)
  return r1.intersects(r2)
}

exports.coerce = coerce
function coerce (version) {
  if (version instanceof SemVer) {
    return version
  }

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

  var match = version.match(re[COERCE])

  if (match == null) {
    return null
  }

  return parse(match[1] +
    '.' + (match[2] || '0') +
    '.' + (match[3] || '0'))
}
#!/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.

var argv = process.argv.slice(2)

var versions = []

var range = []

var inc = null

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

var loose = false

var includePrerelease = false

var coerce = false

var identifier

var semver = require('../semver')

var reverse = false

var options = {}

main()

function main () {
  if (!argv.length) return help()
  while (argv.length) {
    var a = argv.shift()
    var indexOfEqualSign = a.indexOf('=')
    if (indexOfEqualSign !== -1) {
      a = a.slice(0, indexOfEqualSign)
      argv.unshift(a.slice(indexOfEqualSign + 1))
    }
    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':
            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 '-c': case '--coerce':
        coerce = true
        break
      case '-h': case '--help': case '-?':
        return help()
      default:
        versions.push(a)
        break
    }
  }

  var options = { loose: loose, includePrerelease: includePrerelease }

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

  for (var i = 0, l = range.length; i < l; i++) {
    versions = versions.filter(function (v) {
      return semver.satisfies(v, range[i], options)
    })
    if (!versions.length) return fail()
  }
  return success(versions)
}

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

function fail () { process.exit(1) }

function success () {
  var compare = reverse ? 'rcompare' : 'compare'
  versions.sort(function (a, b) {
    return semver[compare](a, b, options)
  }).map(function (v) {
    return semver.clean(v, options)
  }).map(function (v) {
    return inc ? semver.inc(v, inc, options, identifier) : v
  }).forEach(function (v, i, _) { console.log(v) })
}

function 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, or prerelease.  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)',
    '',
    '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.'
  ].join('\n'))
}
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.
{
  "name": "semver",
  "version": "6.3.0",
  "description": "The semantic version parser used by npm.",
  "main": "semver.js",
  "devDependencies": {
    "tap": "^14.3.1"
  },
  "license": "ISC",
  "repository": "https://github.com/npm/node-semver",
  "bin": {
    "semver": "./bin/semver.js"
  },
  "files": [
    "bin",
    "range.bnf",
    "semver.js"
  ],
  "tap": {
    "check-coverage": true
  }
}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]+
exports = module.exports = SemVer

var debug
/* istanbul ignore next */
if (typeof process === 'object' &&
    process.env &&
    process.env.NODE_DEBUG &&
    /\bsemver\b/i.test(process.env.NODE_DEBUG)) {
  debug = function () {
    var args = Array.prototype.slice.call(arguments, 0)
    args.unshift('SEMVER')
    console.log.apply(console, args)
  }
} else {
  debug = function () {}
}

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

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

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

// The actual regexps go on exports.re
var re = exports.re = []
var src = exports.src = []
var t = exports.tokens = {}
var R = 0

function tok (n) {
  t[n] = R++
}

// 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.

tok('NUMERICIDENTIFIER')
src[t.NUMERICIDENTIFIER] = '0|[1-9]\\d*'
tok('NUMERICIDENTIFIERLOOSE')
src[t.NUMERICIDENTIFIERLOOSE] = '[0-9]+'

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

tok('NONNUMERICIDENTIFIER')
src[t.NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*'

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

tok('MAINVERSION')
src[t.MAINVERSION] = '(' + src[t.NUMERICIDENTIFIER] + ')\\.' +
                   '(' + src[t.NUMERICIDENTIFIER] + ')\\.' +
                   '(' + src[t.NUMERICIDENTIFIER] + ')'

tok('MAINVERSIONLOOSE')
src[t.MAINVERSIONLOOSE] = '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')\\.' +
                        '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')\\.' +
                        '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')'

// ## Pre-release Version Identifier
// A numeric identifier, or a non-numeric identifier.

tok('PRERELEASEIDENTIFIER')
src[t.PRERELEASEIDENTIFIER] = '(?:' + src[t.NUMERICIDENTIFIER] +
                            '|' + src[t.NONNUMERICIDENTIFIER] + ')'

tok('PRERELEASEIDENTIFIERLOOSE')
src[t.PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[t.NUMERICIDENTIFIERLOOSE] +
                                 '|' + src[t.NONNUMERICIDENTIFIER] + ')'

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

tok('PRERELEASE')
src[t.PRERELEASE] = '(?:-(' + src[t.PRERELEASEIDENTIFIER] +
                  '(?:\\.' + src[t.PRERELEASEIDENTIFIER] + ')*))'

tok('PRERELEASELOOSE')
src[t.PRERELEASELOOSE] = '(?:-?(' + src[t.PRERELEASEIDENTIFIERLOOSE] +
                       '(?:\\.' + src[t.PRERELEASEIDENTIFIERLOOSE] + ')*))'

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

tok('BUILDIDENTIFIER')
src[t.BUILDIDENTIFIER] = '[0-9A-Za-z-]+'

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

tok('BUILD')
src[t.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.

tok('FULL')
tok('FULLPLAIN')
src[t.FULLPLAIN] = 'v?' + src[t.MAINVERSION] +
                  src[t.PRERELEASE] + '?' +
                  src[t.BUILD] + '?'

src[t.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.
tok('LOOSEPLAIN')
src[t.LOOSEPLAIN] = '[v=\\s]*' + src[t.MAINVERSIONLOOSE] +
                  src[t.PRERELEASELOOSE] + '?' +
                  src[t.BUILD] + '?'

tok('LOOSE')
src[t.LOOSE] = '^' + src[t.LOOSEPLAIN] + '$'

tok('GTLT')
src[t.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.
tok('XRANGEIDENTIFIERLOOSE')
src[t.XRANGEIDENTIFIERLOOSE] = src[t.NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'
tok('XRANGEIDENTIFIER')
src[t.XRANGEIDENTIFIER] = src[t.NUMERICIDENTIFIER] + '|x|X|\\*'

tok('XRANGEPLAIN')
src[t.XRANGEPLAIN] = '[v=\\s]*(' + src[t.XRANGEIDENTIFIER] + ')' +
                   '(?:\\.(' + src[t.XRANGEIDENTIFIER] + ')' +
                   '(?:\\.(' + src[t.XRANGEIDENTIFIER] + ')' +
                   '(?:' + src[t.PRERELEASE] + ')?' +
                   src[t.BUILD] + '?' +
                   ')?)?'

tok('XRANGEPLAINLOOSE')
src[t.XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' +
                        '(?:\\.(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' +
                        '(?:\\.(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' +
                        '(?:' + src[t.PRERELEASELOOSE] + ')?' +
                        src[t.BUILD] + '?' +
                        ')?)?'

tok('XRANGE')
src[t.XRANGE] = '^' + src[t.GTLT] + '\\s*' + src[t.XRANGEPLAIN] + '$'
tok('XRANGELOOSE')
src[t.XRANGELOOSE] = '^' + src[t.GTLT] + '\\s*' + src[t.XRANGEPLAINLOOSE] + '$'

// Coercion.
// Extract anything that could conceivably be a part of a valid semver
tok('COERCE')
src[t.COERCE] = '(^|[^\\d])' +
              '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' +
              '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
              '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
              '(?:$|[^\\d])'
tok('COERCERTL')
re[t.COERCERTL] = new RegExp(src[t.COERCE], 'g')

// Tilde ranges.
// Meaning is "reasonably at or greater than"
tok('LONETILDE')
src[t.LONETILDE] = '(?:~>?)'

tok('TILDETRIM')
src[t.TILDETRIM] = '(\\s*)' + src[t.LONETILDE] + '\\s+'
re[t.TILDETRIM] = new RegExp(src[t.TILDETRIM], 'g')
var tildeTrimReplace = '$1~'

tok('TILDE')
src[t.TILDE] = '^' + src[t.LONETILDE] + src[t.XRANGEPLAIN] + '$'
tok('TILDELOOSE')
src[t.TILDELOOSE] = '^' + src[t.LONETILDE] + src[t.XRANGEPLAINLOOSE] + '$'

// Caret ranges.
// Meaning is "at least and backwards compatible with"
tok('LONECARET')
src[t.LONECARET] = '(?:\\^)'

tok('CARETTRIM')
src[t.CARETTRIM] = '(\\s*)' + src[t.LONECARET] + '\\s+'
re[t.CARETTRIM] = new RegExp(src[t.CARETTRIM], 'g')
var caretTrimReplace = '$1^'

tok('CARET')
src[t.CARET] = '^' + src[t.LONECARET] + src[t.XRANGEPLAIN] + '$'
tok('CARETLOOSE')
src[t.CARETLOOSE] = '^' + src[t.LONECARET] + src[t.XRANGEPLAINLOOSE] + '$'

// A simple gt/lt/eq thing, or just "" to indicate "any version"
tok('COMPARATORLOOSE')
src[t.COMPARATORLOOSE] = '^' + src[t.GTLT] + '\\s*(' + src[t.LOOSEPLAIN] + ')$|^$'
tok('COMPARATOR')
src[t.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`
tok('COMPARATORTRIM')
src[t.COMPARATORTRIM] = '(\\s*)' + src[t.GTLT] +
                      '\\s*(' + src[t.LOOSEPLAIN] + '|' + src[t.XRANGEPLAIN] + ')'

// this one has to use the /g flag
re[t.COMPARATORTRIM] = new RegExp(src[t.COMPARATORTRIM], 'g')
var 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.
tok('HYPHENRANGE')
src[t.HYPHENRANGE] = '^\\s*(' + src[t.XRANGEPLAIN] + ')' +
                   '\\s+-\\s+' +
                   '(' + src[t.XRANGEPLAIN] + ')' +
                   '\\s*$'

tok('HYPHENRANGELOOSE')
src[t.HYPHENRANGELOOSE] = '^\\s*(' + src[t.XRANGEPLAINLOOSE] + ')' +
                        '\\s+-\\s+' +
                        '(' + src[t.XRANGEPLAINLOOSE] + ')' +
                        '\\s*$'

// Star ranges basically just allow anything at all.
tok('STAR')
src[t.STAR] = '(<|>)?=?\\s*\\*'

// Compile to actual regexp objects.
// All are flag-free, unless they were created above with a flag.
for (var i = 0; i < R; i++) {
  debug(i, src[i])
  if (!re[i]) {
    re[i] = new RegExp(src[i])
  }
}

exports.parse = parse
function parse (version, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

  if (version instanceof SemVer) {
    return version
  }

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

  if (version.length > MAX_LENGTH) {
    return null
  }

  var r = options.loose ? re[t.LOOSE] : re[t.FULL]
  if (!r.test(version)) {
    return null
  }

  try {
    return new SemVer(version, options)
  } catch (er) {
    return null
  }
}

exports.valid = valid
function valid (version, options) {
  var v = parse(version, options)
  return v ? v.version : null
}

exports.clean = clean
function clean (version, options) {
  var s = parse(version.trim().replace(/^[=v]+/, ''), options)
  return s ? s.version : null
}

exports.SemVer = SemVer

function SemVer (version, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }
  if (version instanceof SemVer) {
    if (version.loose === options.loose) {
      return version
    } else {
      version = version.version
    }
  } else if (typeof version !== 'string') {
    throw new TypeError('Invalid Version: ' + version)
  }

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

  if (!(this instanceof SemVer)) {
    return new SemVer(version, options)
  }

  debug('SemVer', version, options)
  this.options = options
  this.loose = !!options.loose

  var 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(function (id) {
      if (/^[0-9]+$/.test(id)) {
        var num = +id
        if (num >= 0 && num < MAX_SAFE_INTEGER) {
          return num
        }
      }
      return id
    })
  }

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

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

SemVer.prototype.toString = function () {
  return this.version
}

SemVer.prototype.compare = function (other) {
  debug('SemVer.compare', this.version, this.options, other)
  if (!(other instanceof SemVer)) {
    other = new SemVer(other, this.options)
  }

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

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

  return compareIdentifiers(this.major, other.major) ||
         compareIdentifiers(this.minor, other.minor) ||
         compareIdentifiers(this.patch, other.patch)
}

SemVer.prototype.comparePre = function (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
  }

  var i = 0
  do {
    var a = this.prerelease[i]
    var 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)
}

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

  var i = 0
  do {
    var a = this.build[i]
    var b = other.build[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)
}

// preminor will bump the version up to the next minor release, and immediately
// down to pre-release. premajor and prepatch work the same way.
SemVer.prototype.inc = function (release, identifier) {
  switch (release) {
    case 'premajor':
      this.prerelease.length = 0
      this.patch = 0
      this.minor = 0
      this.major++
      this.inc('pre', identifier)
      break
    case 'preminor':
      this.prerelease.length = 0
      this.patch = 0
      this.minor++
      this.inc('pre', identifier)
      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)
      this.inc('pre', identifier)
      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)
      }
      this.inc('pre', identifier)
      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':
      if (this.prerelease.length === 0) {
        this.prerelease = [0]
      } else {
        var 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
          this.prerelease.push(0)
        }
      }
      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
        if (this.prerelease[0] === identifier) {
          if (isNaN(this.prerelease[1])) {
            this.prerelease = [identifier, 0]
          }
        } else {
          this.prerelease = [identifier, 0]
        }
      }
      break

    default:
      throw new Error('invalid increment argument: ' + release)
  }
  this.format()
  this.raw = this.version
  return this
}

exports.inc = inc
function inc (version, release, loose, identifier) {
  if (typeof (loose) === 'string') {
    identifier = loose
    loose = undefined
  }

  try {
    return new SemVer(version, loose).inc(release, identifier).version
  } catch (er) {
    return null
  }
}

exports.diff = diff
function diff (version1, version2) {
  if (eq(version1, version2)) {
    return null
  } else {
    var v1 = parse(version1)
    var v2 = parse(version2)
    var prefix = ''
    if (v1.prerelease.length || v2.prerelease.length) {
      prefix = 'pre'
      var defaultResult = 'prerelease'
    }
    for (var key in v1) {
      if (key === 'major' || key === 'minor' || key === 'patch') {
        if (v1[key] !== v2[key]) {
          return prefix + key
        }
      }
    }
    return defaultResult // may be undefined
  }
}

exports.compareIdentifiers = compareIdentifiers

var numeric = /^[0-9]+$/
function compareIdentifiers (a, b) {
  var anum = numeric.test(a)
  var 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
}

exports.rcompareIdentifiers = rcompareIdentifiers
function rcompareIdentifiers (a, b) {
  return compareIdentifiers(b, a)
}

exports.major = major
function major (a, loose) {
  return new SemVer(a, loose).major
}

exports.minor = minor
function minor (a, loose) {
  return new SemVer(a, loose).minor
}

exports.patch = patch
function patch (a, loose) {
  return new SemVer(a, loose).patch
}

exports.compare = compare
function compare (a, b, loose) {
  return new SemVer(a, loose).compare(new SemVer(b, loose))
}

exports.compareLoose = compareLoose
function compareLoose (a, b) {
  return compare(a, b, true)
}

exports.compareBuild = compareBuild
function compareBuild (a, b, loose) {
  var versionA = new SemVer(a, loose)
  var versionB = new SemVer(b, loose)
  return versionA.compare(versionB) || versionA.compareBuild(versionB)
}

exports.rcompare = rcompare
function rcompare (a, b, loose) {
  return compare(b, a, loose)
}

exports.sort = sort
function sort (list, loose) {
  return list.sort(function (a, b) {
    return exports.compareBuild(a, b, loose)
  })
}

exports.rsort = rsort
function rsort (list, loose) {
  return list.sort(function (a, b) {
    return exports.compareBuild(b, a, loose)
  })
}

exports.gt = gt
function gt (a, b, loose) {
  return compare(a, b, loose) > 0
}

exports.lt = lt
function lt (a, b, loose) {
  return compare(a, b, loose) < 0
}

exports.eq = eq
function eq (a, b, loose) {
  return compare(a, b, loose) === 0
}

exports.neq = neq
function neq (a, b, loose) {
  return compare(a, b, loose) !== 0
}

exports.gte = gte
function gte (a, b, loose) {
  return compare(a, b, loose) >= 0
}

exports.lte = lte
function lte (a, b, loose) {
  return compare(a, b, loose) <= 0
}

exports.cmp = cmp
function 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)
  }
}

exports.Comparator = Comparator
function Comparator (comp, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

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

  if (!(this instanceof Comparator)) {
    return new Comparator(comp, options)
  }

  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)
}

var ANY = {}
Comparator.prototype.parse = function (comp) {
  var r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]
  var 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)
  }
}

Comparator.prototype.toString = function () {
  return this.value
}

Comparator.prototype.test = function (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)
}

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

  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

  var rangeTmp

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

  var sameDirectionIncreasing =
    (this.operator === '>=' || this.operator === '>') &&
    (comp.operator === '>=' || comp.operator === '>')
  var sameDirectionDecreasing =
    (this.operator === '<=' || this.operator === '<') &&
    (comp.operator === '<=' || comp.operator === '<')
  var sameSemVer = this.semver.version === comp.semver.version
  var differentDirectionsInclusive =
    (this.operator === '>=' || this.operator === '<=') &&
    (comp.operator === '>=' || comp.operator === '<=')
  var oppositeDirectionsLessThan =
    cmp(this.semver, '<', comp.semver, options) &&
    ((this.operator === '>=' || this.operator === '>') &&
    (comp.operator === '<=' || comp.operator === '<'))
  var oppositeDirectionsGreaterThan =
    cmp(this.semver, '>', comp.semver, options) &&
    ((this.operator === '<=' || this.operator === '<') &&
    (comp.operator === '>=' || comp.operator === '>'))

  return sameDirectionIncreasing || sameDirectionDecreasing ||
    (sameSemVer && differentDirectionsInclusive) ||
    oppositeDirectionsLessThan || oppositeDirectionsGreaterThan
}

exports.Range = Range
function Range (range, options) {
  if (!options || typeof options !== 'object') {
    options = {
      loose: !!options,
      includePrerelease: false
    }
  }

  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) {
    return new Range(range.value, options)
  }

  if (!(this instanceof Range)) {
    return new Range(range, options)
  }

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

  // First, split based on boolean or ||
  this.raw = range
  this.set = range.split(/\s*\|\|\s*/).map(function (range) {
    return this.parseRange(range.trim())
  }, this).filter(function (c) {
    // throw out any that are not relevant for whatever reason
    return c.length
  })

  if (!this.set.length) {
    throw new TypeError('Invalid SemVer Range: ' + range)
  }

  this.format()
}

Range.prototype.format = function () {
  this.range = this.set.map(function (comps) {
    return comps.join(' ').trim()
  }).join('||').trim()
  return this.range
}

Range.prototype.toString = function () {
  return this.range
}

Range.prototype.parseRange = function (range) {
  var loose = this.options.loose
  range = range.trim()
  // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
  var hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]
  range = range.replace(hr, hyphenReplace)
  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, re[t.COMPARATORTRIM])

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

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

  // normalize spaces
  range = range.split(/\s+/).join(' ')

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

  var compRe = loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]
  var set = range.split(' ').map(function (comp) {
    return parseComparator(comp, this.options)
  }, this).join(' ').split(/\s+/)
  if (this.options.loose) {
    // in loose mode, throw out any that are not valid comparators
    set = set.filter(function (comp) {
      return !!comp.match(compRe)
    })
  }
  set = set.map(function (comp) {
    return new Comparator(comp, this.options)
  }, this)

  return set
}

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

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

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

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

    testComparator = remainingComparators.pop()
  }

  return result
}

// Mostly just for testing and legacy API reasons
exports.toComparators = toComparators
function toComparators (range, options) {
  return new Range(range, options).set.map(function (comp) {
    return comp.map(function (c) {
      return c.value
    }).join(' ').trim().split(' ')
  })
}

// comprised of xranges, tildes, stars, and gtlt's at this point.
// already replaced the hyphen ranges
// turn into a set of JUST comparators.
function parseComparator (comp, options) {
  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
}

function isX (id) {
  return !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
// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0
// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0
// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0
// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0
function replaceTildes (comp, options) {
  return comp.trim().split(/\s+/).map(function (comp) {
    return replaceTilde(comp, options)
  }).join(' ')
}

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

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

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

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

function replaceCaret (comp, options) {
  debug('caret', comp, options)
  var r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]
  return comp.replace(r, function (_, M, m, p, pr) {
    debug('caret', comp, _, M, m, p, pr)
    var ret

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

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

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

function replaceXRange (comp, options) {
  comp = comp.trim()
  var r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]
  return comp.replace(r, function (ret, gtlt, M, m, p, pr) {
    debug('xRange', comp, ret, gtlt, M, m, p, pr)
    var xM = isX(M)
    var xm = xM || isX(m)
    var xp = xm || isX(p)
    var 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
        // >1.2.3 => >= 1.2.4
        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
        }
      }

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

    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.
function 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], '')
}

// 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 Any 3.4.x will do
// 1.2 - 3.4 => >=1.2.0 <3.5.0
function hyphenReplace ($0,
  from, fM, fm, fp, fpr, fb,
  to, tM, tm, tp, tpr, tb) {
  if (isX(fM)) {
    from = ''
  } else if (isX(fm)) {
    from = '>=' + fM + '.0.0'
  } else if (isX(fp)) {
    from = '>=' + fM + '.' + fm + '.0'
  } else {
    from = '>=' + from
  }

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

  return (from + ' ' + to).trim()
}

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

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

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

function testSet (set, version, options) {
  for (var 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 (i = 0; i < set.length; i++) {
      debug(set[i].semver)
      if (set[i].semver === ANY) {
        continue
      }

      if (set[i].semver.prerelease.length > 0) {
        var 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
}

exports.satisfies = satisfies
function satisfies (version, range, options) {
  try {
    range = new Range(range, options)
  } catch (er) {
    return false
  }
  return range.test(version)
}

exports.maxSatisfying = maxSatisfying
function maxSatisfying (versions, range, options) {
  var max = null
  var maxSV = null
  try {
    var rangeObj = new Range(range, options)
  } catch (er) {
    return null
  }
  versions.forEach(function (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
}

exports.minSatisfying = minSatisfying
function minSatisfying (versions, range, options) {
  var min = null
  var minSV = null
  try {
    var rangeObj = new Range(range, options)
  } catch (er) {
    return null
  }
  versions.forEach(function (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
}

exports.minVersion = minVersion
function minVersion (range, loose) {
  range = new Range(range, loose)

  var 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 (var i = 0; i < range.set.length; ++i) {
    var comparators = range.set[i]

    comparators.forEach(function (comparator) {
      // Clone to avoid manipulating the comparator's semver object.
      var 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 (!minver || gt(minver, compver)) {
            minver = compver
          }
          break
        case '<':
        case '<=':
          /* Ignore maximum versions */
          break
        /* istanbul ignore next */
        default:
          throw new Error('Unexpected operation: ' + comparator.operator)
      }
    })
  }

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

  return null
}

exports.validRange = validRange
function 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
  }
}

// Determine if version is less than all the versions possible in the range
exports.ltr = ltr
function ltr (version, range, options) {
  return outside(version, range, '<', options)
}

// Determine if version is greater than all the versions possible in the range.
exports.gtr = gtr
function gtr (version, range, options) {
  return outside(version, range, '>', options)
}

exports.outside = outside
function outside (version, range, hilo, options) {
  version = new SemVer(version, options)
  range = new Range(range, options)

  var 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 satisifes 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 (var i = 0; i < range.set.length; ++i) {
    var comparators = range.set[i]

    var high = null
    var low = null

    comparators.forEach(function (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
}

exports.prerelease = prerelease
function prerelease (version, options) {
  var parsed = parse(version, options)
  return (parsed && parsed.prerelease.length) ? parsed.prerelease : null
}

exports.intersects = intersects
function intersects (r1, r2, options) {
  r1 = new Range(r1, options)
  r2 = new Range(r2, options)
  return r1.intersects(r2)
}

exports.coerce = coerce
function coerce (version, options) {
  if (version instanceof SemVer) {
    return version
  }

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

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

  options = options || {}

  var match = null
  if (!options.rtl) {
    match = version.match(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'
    //
    // 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.
    var next
    while ((next = re[t.COERCERTL].exec(version)) &&
      (!match || match.index + match[0].length !== version.length)
    ) {
      if (!match ||
          next.index + next[0].length !== match.index + match[0].length) {
        match = next
      }
      re[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length
    }
    // leave it in a clean state
    re[t.COERCERTL].lastIndex = -1
  }

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

  return parse(match[2] +
    '.' + (match[3] || '0') +
    '.' + (match[4] || '0'), options)
}
#!/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.

var argv = process.argv.slice(2)

var versions = []

var range = []

var inc = null

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

var loose = false

var includePrerelease = false

var coerce = false

var rtl = false

var identifier

var semver = require('../semver')

var reverse = false

var options = {}

main()

function main () {
  if (!argv.length) return help()
  while (argv.length) {
    var a = argv.shift()
    var indexOfEqualSign = a.indexOf('=')
    if (indexOfEqualSign !== -1) {
      a = a.slice(0, indexOfEqualSign)
      argv.unshift(a.slice(indexOfEqualSign + 1))
    }
    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':
            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 '-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
    }
  }

  var options = { loose: loose, includePrerelease: includePrerelease, rtl: rtl }

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

  for (var i = 0, l = range.length; i < l; i++) {
    versions = versions.filter(function (v) {
      return semver.satisfies(v, range[i], options)
    })
    if (!versions.length) return fail()
  }
  return success(versions)
}

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

function fail () { process.exit(1) }

function success () {
  var compare = reverse ? 'rcompare' : 'compare'
  versions.sort(function (a, b) {
    return semver[compare](a, b, options)
  }).map(function (v) {
    return semver.clean(v, options)
  }).map(function (v) {
    return inc ? semver.inc(v, inc, options, identifier) : v
  }).forEach(function (v, i, _) { console.log(v) })
}

function 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, or prerelease.  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)',
    '',
    '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.'
  ].join('\n'))
}
(The MIT License)

Copyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>

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.
import commander from './index.js';

// wrapper to provide named exports for ESM.
export const {
  program,
  createCommand,
  createArgument,
  createOption,
  CommanderError,
  InvalidArgumentError,
  InvalidOptionArgumentError, // deprecated old name
  Command,
  Argument,
  Option,
  Help
} = commander;
const { Argument } = require('./lib/argument.js');
const { Command } = require('./lib/command.js');
const { CommanderError, InvalidArgumentError } = require('./lib/error.js');
const { Help } = require('./lib/help.js');
const { Option } = require('./lib/option.js');

// @ts-check

/**
 * Expose the root command.
 */

exports = module.exports = new Command();
exports.program = exports; // More explicit access to global command.
// Implicit export of createArgument, createCommand, and createOption.

/**
 * Expose classes
 */

exports.Argument = Argument;
exports.Command = Command;
exports.CommanderError = CommanderError;
exports.Help = Help;
exports.InvalidArgumentError = InvalidArgumentError;
exports.InvalidOptionArgumentError = InvalidArgumentError; // Deprecated
exports.Option = Option;
{
  "versions": [
    {
      "version": "*",
      "target": {
        "node": "supported"
      },
      "response": {
        "type": "time-permitting"
      },
      "backing": {
        "npm-funding": true
      }
    }
  ]
}
{
  "name": "commander",
  "version": "9.4.0",
  "description": "the complete solution for node.js command-line programs",
  "author": "TJ Holowaychuk <tj@vision-media.ca>",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/tj/commander.js.git"
  },
  "files": [
    "index.js",
    "lib/*.js",
    "esm.mjs",
    "typings/index.d.ts",
    "package-support.json"
  ],
  "type": "commonjs",
  "main": "./index.js",
  "exports": {
    ".": {
      "types": "./typings/index.d.ts",
      "require": "./index.js",
      "import": "./esm.mjs"
    },
    "./esm.mjs": "./esm.mjs"
  },
  "devDependencies": {
    "@types/jest": "^28.1.4",
    "@types/node": "^16.11.15",
    "@typescript-eslint/eslint-plugin": "^5.30.6",
    "@typescript-eslint/parser": "^5.30.6",
    "eslint": "^8.19.0",
    "eslint-config-standard": "^17.0.0",
    "eslint-config-standard-with-typescript": "^22.0.0",
    "eslint-plugin-import": "^2.25.3",
    "eslint-plugin-jest": "^26.5.3",
    "eslint-plugin-n": "^15.2.4",
    "eslint-plugin-promise": "^6.0.0",
    "jest": "^28.1.2",
    "ts-jest": "^28.0.5",
    "tsd": "^0.22.0",
    "typescript": "^4.7.4"
  },
  "types": "typings/index.d.ts",
  "jest": {
    "testEnvironment": "node",
    "collectCoverage": true,
    "transform": {
      "^.+\\.tsx?$": "ts-jest"
    },
    "testPathIgnorePatterns": [
      "/node_modules/"
    ]
  },
  "engines": {
    "node": "^12.20.0 || >=14"
  },
  "support": true
}const { InvalidArgumentError } = require('./error.js');

// @ts-check

class Argument {
  /**
   * Initialize a new command argument with the given name and description.
   * The default is that the argument is required, and you can explicitly
   * indicate this with <> around the name. Put [] around the name for an optional argument.
   *
   * @param {string} name
   * @param {string} [description]
   */

  constructor(name, description) {
    this.description = description || '';
    this.variadic = false;
    this.parseArg = undefined;
    this.defaultValue = undefined;
    this.defaultValueDescription = undefined;
    this.argChoices = undefined;

    switch (name[0]) {
      case '<': // e.g. <required>
        this.required = true;
        this._name = name.slice(1, -1);
        break;
      case '[': // e.g. [optional]
        this.required = false;
        this._name = name.slice(1, -1);
        break;
      default:
        this.required = true;
        this._name = name;
        break;
    }

    if (this._name.length > 3 && this._name.slice(-3) === '...') {
      this.variadic = true;
      this._name = this._name.slice(0, -3);
    }
  }

  /**
   * Return argument name.
   *
   * @return {string}
   */

  name() {
    return this._name;
  }

  /**
   * @api private
   */

  _concatValue(value, previous) {
    if (previous === this.defaultValue || !Array.isArray(previous)) {
      return [value];
    }

    return previous.concat(value);
  }

  /**
   * Set the default value, and optionally supply the description to be displayed in the help.
   *
   * @param {any} value
   * @param {string} [description]
   * @return {Argument}
   */

  default(value, description) {
    this.defaultValue = value;
    this.defaultValueDescription = description;
    return this;
  }

  /**
   * Set the custom handler for processing CLI command arguments into argument values.
   *
   * @param {Function} [fn]
   * @return {Argument}
   */

  argParser(fn) {
    this.parseArg = fn;
    return this;
  }

  /**
   * Only allow argument value to be one of choices.
   *
   * @param {string[]} values
   * @return {Argument}
   */

  choices(values) {
    this.argChoices = values.slice();
    this.parseArg = (arg, previous) => {
      if (!this.argChoices.includes(arg)) {
        throw new InvalidArgumentError(`Allowed choices are ${this.argChoices.join(', ')}.`);
      }
      if (this.variadic) {
        return this._concatValue(arg, previous);
      }
      return arg;
    };
    return this;
  }

  /**
   * Make argument required.
   */
  argRequired() {
    this.required = true;
    return this;
  }

  /**
   * Make argument optional.
   */
  argOptional() {
    this.required = false;
    return this;
  }
}

/**
 * Takes an argument and returns its human readable equivalent for help usage.
 *
 * @param {Argument} arg
 * @return {string}
 * @api private
 */

function humanReadableArgName(arg) {
  const nameOutput = arg.name() + (arg.variadic === true ? '...' : '');

  return arg.required
    ? '<' + nameOutput + '>'
    : '[' + nameOutput + ']';
}

exports.Argument = Argument;
exports.humanReadableArgName = humanReadableArgName;
const EventEmitter = require('events').EventEmitter;
const childProcess = require('child_process');
const path = require('path');
const fs = require('fs');
const process = require('process');

const { Argument, humanReadableArgName } = require('./argument.js');
const { CommanderError } = require('./error.js');
const { Help } = require('./help.js');
const { Option, splitOptionFlags, DualOptions } = require('./option.js');
const { suggestSimilar } = require('./suggestSimilar');

// @ts-check

class Command extends EventEmitter {
  /**
   * Initialize a new `Command`.
   *
   * @param {string} [name]
   */

  constructor(name) {
    super();
    /** @type {Command[]} */
    this.commands = [];
    /** @type {Option[]} */
    this.options = [];
    this.parent = null;
    this._allowUnknownOption = false;
    this._allowExcessArguments = true;
    /** @type {Argument[]} */
    this._args = [];
    /** @type {string[]} */
    this.args = []; // cli args with options removed
    this.rawArgs = [];
    this.processedArgs = []; // like .args but after custom processing and collecting variadic
    this._scriptPath = null;
    this._name = name || '';
    this._optionValues = {};
    this._optionValueSources = {}; // default < config < env < cli
    this._storeOptionsAsProperties = false;
    this._actionHandler = null;
    this._executableHandler = false;
    this._executableFile = null; // custom name for executable
    this._executableDir = null; // custom search directory for subcommands
    this._defaultCommandName = null;
    this._exitCallback = null;
    this._aliases = [];
    this._combineFlagAndOptionalValue = true;
    this._description = '';
    this._summary = '';
    this._argsDescription = undefined; // legacy
    this._enablePositionalOptions = false;
    this._passThroughOptions = false;
    this._lifeCycleHooks = {}; // a hash of arrays
    /** @type {boolean | string} */
    this._showHelpAfterError = false;
    this._showSuggestionAfterError = true;

    // see .configureOutput() for docs
    this._outputConfiguration = {
      writeOut: (str) => process.stdout.write(str),
      writeErr: (str) => process.stderr.write(str),
      getOutHelpWidth: () => process.stdout.isTTY ? process.stdout.columns : undefined,
      getErrHelpWidth: () => process.stderr.isTTY ? process.stderr.columns : undefined,
      outputError: (str, write) => write(str)
    };

    this._hidden = false;
    this._hasHelpOption = true;
    this._helpFlags = '-h, --help';
    this._helpDescription = 'display help for command';
    this._helpShortFlag = '-h';
    this._helpLongFlag = '--help';
    this._addImplicitHelpCommand = undefined; // Deliberately undefined, not decided whether true or false
    this._helpCommandName = 'help';
    this._helpCommandnameAndArgs = 'help [command]';
    this._helpCommandDescription = 'display help for command';
    this._helpConfiguration = {};
  }

  /**
   * Copy settings that are useful to have in common across root command and subcommands.
   *
   * (Used internally when adding a command using `.command()` so subcommands inherit parent settings.)
   *
   * @param {Command} sourceCommand
   * @return {Command} `this` command for chaining
   */
  copyInheritedSettings(sourceCommand) {
    this._outputConfiguration = sourceCommand._outputConfiguration;
    this._hasHelpOption = sourceCommand._hasHelpOption;
    this._helpFlags = sourceCommand._helpFlags;
    this._helpDescription = sourceCommand._helpDescription;
    this._helpShortFlag = sourceCommand._helpShortFlag;
    this._helpLongFlag = sourceCommand._helpLongFlag;
    this._helpCommandName = sourceCommand._helpCommandName;
    this._helpCommandnameAndArgs = sourceCommand._helpCommandnameAndArgs;
    this._helpCommandDescription = sourceCommand._helpCommandDescription;
    this._helpConfiguration = sourceCommand._helpConfiguration;
    this._exitCallback = sourceCommand._exitCallback;
    this._storeOptionsAsProperties = sourceCommand._storeOptionsAsProperties;
    this._combineFlagAndOptionalValue = sourceCommand._combineFlagAndOptionalValue;
    this._allowExcessArguments = sourceCommand._allowExcessArguments;
    this._enablePositionalOptions = sourceCommand._enablePositionalOptions;
    this._showHelpAfterError = sourceCommand._showHelpAfterError;
    this._showSuggestionAfterError = sourceCommand._showSuggestionAfterError;

    return this;
  }

  /**
   * Define a command.
   *
   * There are two styles of command: pay attention to where to put the description.
   *
   * @example
   * // Command implemented using action handler (description is supplied separately to `.command`)
   * program
   *   .command('clone <source> [destination]')
   *   .description('clone a repository into a newly created directory')
   *   .action((source, destination) => {
   *     console.log('clone command called');
   *   });
   *
   * // Command implemented using separate executable file (description is second parameter to `.command`)
   * program
   *   .command('start <service>', 'start named service')
   *   .command('stop [service]', 'stop named service, or all if no name supplied');
   *
   * @param {string} nameAndArgs - command name and arguments, args are `<required>` or `[optional]` and last may also be `variadic...`
   * @param {Object|string} [actionOptsOrExecDesc] - configuration options (for action), or description (for executable)
   * @param {Object} [execOpts] - configuration options (for executable)
   * @return {Command} returns new command for action handler, or `this` for executable command
   */

  command(nameAndArgs, actionOptsOrExecDesc, execOpts) {
    let desc = actionOptsOrExecDesc;
    let opts = execOpts;
    if (typeof desc === 'object' && desc !== null) {
      opts = desc;
      desc = null;
    }
    opts = opts || {};
    const [, name, args] = nameAndArgs.match(/([^ ]+) *(.*)/);

    const cmd = this.createCommand(name);
    if (desc) {
      cmd.description(desc);
      cmd._executableHandler = true;
    }
    if (opts.isDefault) this._defaultCommandName = cmd._name;
    cmd._hidden = !!(opts.noHelp || opts.hidden); // noHelp is deprecated old name for hidden
    cmd._executableFile = opts.executableFile || null; // Custom name for executable file, set missing to null to match constructor
    if (args) cmd.arguments(args);
    this.commands.push(cmd);
    cmd.parent = this;
    cmd.copyInheritedSettings(this);

    if (desc) return this;
    return cmd;
  }

  /**
   * Factory routine to create a new unattached command.
   *
   * See .command() for creating an attached subcommand, which uses this routine to
   * create the command. You can override createCommand to customise subcommands.
   *
   * @param {string} [name]
   * @return {Command} new command
   */

  createCommand(name) {
    return new Command(name);
  }

  /**
   * You can customise the help with a subclass of Help by overriding createHelp,
   * or by overriding Help properties using configureHelp().
   *
   * @return {Help}
   */

  createHelp() {
    return Object.assign(new Help(), this.configureHelp());
  }

  /**
   * You can customise the help by overriding Help properties using configureHelp(),
   * or with a subclass of Help by overriding createHelp().
   *
   * @param {Object} [configuration] - configuration options
   * @return {Command|Object} `this` command for chaining, or stored configuration
   */

  configureHelp(configuration) {
    if (configuration === undefined) return this._helpConfiguration;

    this._helpConfiguration = configuration;
    return this;
  }

  /**
   * The default output goes to stdout and stderr. You can customise this for special
   * applications. You can also customise the display of errors by overriding outputError.
   *
   * The configuration properties are all functions:
   *
   *     // functions to change where being written, stdout and stderr
   *     writeOut(str)
   *     writeErr(str)
   *     // matching functions to specify width for wrapping help
   *     getOutHelpWidth()
   *     getErrHelpWidth()
   *     // functions based on what is being written out
   *     outputError(str, write) // used for displaying errors, and not used for displaying help
   *
   * @param {Object} [configuration] - configuration options
   * @return {Command|Object} `this` command for chaining, or stored configuration
   */

  configureOutput(configuration) {
    if (configuration === undefined) return this._outputConfiguration;

    Object.assign(this._outputConfiguration, configuration);
    return this;
  }

  /**
   * Display the help or a custom message after an error occurs.
   *
   * @param {boolean|string} [displayHelp]
   * @return {Command} `this` command for chaining
   */
  showHelpAfterError(displayHelp = true) {
    if (typeof displayHelp !== 'string') displayHelp = !!displayHelp;
    this._showHelpAfterError = displayHelp;
    return this;
  }

  /**
   * Display suggestion of similar commands for unknown commands, or options for unknown options.
   *
   * @param {boolean} [displaySuggestion]
   * @return {Command} `this` command for chaining
   */
  showSuggestionAfterError(displaySuggestion = true) {
    this._showSuggestionAfterError = !!displaySuggestion;
    return this;
  }

  /**
   * Add a prepared subcommand.
   *
   * See .command() for creating an attached subcommand which inherits settings from its parent.
   *
   * @param {Command} cmd - new subcommand
   * @param {Object} [opts] - configuration options
   * @return {Command} `this` command for chaining
   */

  addCommand(cmd, opts) {
    if (!cmd._name) {
      throw new Error(`Command passed to .addCommand() must have a name
- specify the name in Command constructor or using .name()`);
    }

    opts = opts || {};
    if (opts.isDefault) this._defaultCommandName = cmd._name;
    if (opts.noHelp || opts.hidden) cmd._hidden = true; // modifying passed command due to existing implementation

    this.commands.push(cmd);
    cmd.parent = this;
    return this;
  }

  /**
   * Factory routine to create a new unattached argument.
   *
   * See .argument() for creating an attached argument, which uses this routine to
   * create the argument. You can override createArgument to return a custom argument.
   *
   * @param {string} name
   * @param {string} [description]
   * @return {Argument} new argument
   */

  createArgument(name, description) {
    return new Argument(name, description);
  }

  /**
   * Define argument syntax for command.
   *
   * The default is that the argument is required, and you can explicitly
   * indicate this with <> around the name. Put [] around the name for an optional argument.
   *
   * @example
   * program.argument('<input-file>');
   * program.argument('[output-file]');
   *
   * @param {string} name
   * @param {string} [description]
   * @param {Function|*} [fn] - custom argument processing function
   * @param {*} [defaultValue]
   * @return {Command} `this` command for chaining
   */
  argument(name, description, fn, defaultValue) {
    const argument = this.createArgument(name, description);
    if (typeof fn === 'function') {
      argument.default(defaultValue).argParser(fn);
    } else {
      argument.default(fn);
    }
    this.addArgument(argument);
    return this;
  }

  /**
   * Define argument syntax for command, adding multiple at once (without descriptions).
   *
   * See also .argument().
   *
   * @example
   * program.arguments('<cmd> [env]');
   *
   * @param {string} names
   * @return {Command} `this` command for chaining
   */

  arguments(names) {
    names.split(/ +/).forEach((detail) => {
      this.argument(detail);
    });
    return this;
  }

  /**
   * Define argument syntax for command, adding a prepared argument.
   *
   * @param {Argument} argument
   * @return {Command} `this` command for chaining
   */
  addArgument(argument) {
    const previousArgument = this._args.slice(-1)[0];
    if (previousArgument && previousArgument.variadic) {
      throw new Error(`only the last argument can be variadic '${previousArgument.name()}'`);
    }
    if (argument.required && argument.defaultValue !== undefined && argument.parseArg === undefined) {
      throw new Error(`a default value for a required argument is never used: '${argument.name()}'`);
    }
    this._args.push(argument);
    return this;
  }

  /**
   * Override default decision whether to add implicit help command.
   *
   *    addHelpCommand() // force on
   *    addHelpCommand(false); // force off
   *    addHelpCommand('help [cmd]', 'display help for [cmd]'); // force on with custom details
   *
   * @return {Command} `this` command for chaining
   */

  addHelpCommand(enableOrNameAndArgs, description) {
    if (enableOrNameAndArgs === false) {
      this._addImplicitHelpCommand = false;
    } else {
      this._addImplicitHelpCommand = true;
      if (typeof enableOrNameAndArgs === 'string') {
        this._helpCommandName = enableOrNameAndArgs.split(' ')[0];
        this._helpCommandnameAndArgs = enableOrNameAndArgs;
      }
      this._helpCommandDescription = description || this._helpCommandDescription;
    }
    return this;
  }

  /**
   * @return {boolean}
   * @api private
   */

  _hasImplicitHelpCommand() {
    if (this._addImplicitHelpCommand === undefined) {
      return this.commands.length && !this._actionHandler && !this._findCommand('help');
    }
    return this._addImplicitHelpCommand;
  }

  /**
   * Add hook for life cycle event.
   *
   * @param {string} event
   * @param {Function} listener
   * @return {Command} `this` command for chaining
   */

  hook(event, listener) {
    const allowedValues = ['preSubcommand', 'preAction', 'postAction'];
    if (!allowedValues.includes(event)) {
      throw new Error(`Unexpected value for event passed to hook : '${event}'.
Expecting one of '${allowedValues.join("', '")}'`);
    }
    if (this._lifeCycleHooks[event]) {
      this._lifeCycleHooks[event].push(listener);
    } else {
      this._lifeCycleHooks[event] = [listener];
    }
    return this;
  }

  /**
   * Register callback to use as replacement for calling process.exit.
   *
   * @param {Function} [fn] optional callback which will be passed a CommanderError, defaults to throwing
   * @return {Command} `this` command for chaining
   */

  exitOverride(fn) {
    if (fn) {
      this._exitCallback = fn;
    } else {
      this._exitCallback = (err) => {
        if (err.code !== 'commander.executeSubCommandAsync') {
          throw err;
        } else {
          // Async callback from spawn events, not useful to throw.
        }
      };
    }
    return this;
  }

  /**
   * Call process.exit, and _exitCallback if defined.
   *
   * @param {number} exitCode exit code for using with process.exit
   * @param {string} code an id string representing the error
   * @param {string} message human-readable description of the error
   * @return never
   * @api private
   */

  _exit(exitCode, code, message) {
    if (this._exitCallback) {
      this._exitCallback(new CommanderError(exitCode, code, message));
      // Expecting this line is not reached.
    }
    process.exit(exitCode);
  }

  /**
   * Register callback `fn` for the command.
   *
   * @example
   * program
   *   .command('serve')
   *   .description('start service')
   *   .action(function() {
   *      // do work here
   *   });
   *
   * @param {Function} fn
   * @return {Command} `this` command for chaining
   */

  action(fn) {
    const listener = (args) => {
      // The .action callback takes an extra parameter which is the command or options.
      const expectedArgsCount = this._args.length;
      const actionArgs = args.slice(0, expectedArgsCount);
      if (this._storeOptionsAsProperties) {
        actionArgs[expectedArgsCount] = this; // backwards compatible "options"
      } else {
        actionArgs[expectedArgsCount] = this.opts();
      }
      actionArgs.push(this);

      return fn.apply(this, actionArgs);
    };
    this._actionHandler = listener;
    return this;
  }

  /**
   * Factory routine to create a new unattached option.
   *
   * See .option() for creating an attached option, which uses this routine to
   * create the option. You can override createOption to return a custom option.
   *
   * @param {string} flags
   * @param {string} [description]
   * @return {Option} new option
   */

  createOption(flags, description) {
    return new Option(flags, description);
  }

  /**
   * Add an option.
   *
   * @param {Option} option
   * @return {Command} `this` command for chaining
   */
  addOption(option) {
    const oname = option.name();
    const name = option.attributeName();

    // store default value
    if (option.negate) {
      // --no-foo is special and defaults foo to true, unless a --foo option is already defined
      const positiveLongFlag = option.long.replace(/^--no-/, '--');
      if (!this._findOption(positiveLongFlag)) {
        this.setOptionValueWithSource(name, option.defaultValue === undefined ? true : option.defaultValue, 'default');
      }
    } else if (option.defaultValue !== undefined) {
      this.setOptionValueWithSource(name, option.defaultValue, 'default');
    }

    // register the option
    this.options.push(option);

    // handler for cli and env supplied values
    const handleOptionValue = (val, invalidValueMessage, valueSource) => {
      // val is null for optional option used without an optional-argument.
      // val is undefined for boolean and negated option.
      if (val == null && option.presetArg !== undefined) {
        val = option.presetArg;
      }

      // custom processing
      const oldValue = this.getOptionValue(name);
      if (val !== null && option.parseArg) {
        try {
          val = option.parseArg(val, oldValue);
        } catch (err) {
          if (err.code === 'commander.invalidArgument') {
            const message = `${invalidValueMessage} ${err.message}`;
            this.error(message, { exitCode: err.exitCode, code: err.code });
          }
          throw err;
        }
      } else if (val !== null && option.variadic) {
        val = option._concatValue(val, oldValue);
      }

      // Fill-in appropriate missing values. Long winded but easy to follow.
      if (val == null) {
        if (option.negate) {
          val = false;
        } else if (option.isBoolean() || option.optional) {
          val = true;
        } else {
          val = ''; // not normal, parseArg might have failed or be a mock function for testing
        }
      }
      this.setOptionValueWithSource(name, val, valueSource);
    };

    this.on('option:' + oname, (val) => {
      const invalidValueMessage = `error: option '${option.flags}' argument '${val}' is invalid.`;
      handleOptionValue(val, invalidValueMessage, 'cli');
    });

    if (option.envVar) {
      this.on('optionEnv:' + oname, (val) => {
        const invalidValueMessage = `error: option '${option.flags}' value '${val}' from env '${option.envVar}' is invalid.`;
        handleOptionValue(val, invalidValueMessage, 'env');
      });
    }

    return this;
  }

  /**
   * Internal implementation shared by .option() and .requiredOption()
   *
   * @api private
   */
  _optionEx(config, flags, description, fn, defaultValue) {
    if (typeof flags === 'object' && flags instanceof Option) {
      throw new Error('To add an Option object use addOption() instead of option() or requiredOption()');
    }
    const option = this.createOption(flags, description);
    option.makeOptionMandatory(!!config.mandatory);
    if (typeof fn === 'function') {
      option.default(defaultValue).argParser(fn);
    } else if (fn instanceof RegExp) {
      // deprecated
      const regex = fn;
      fn = (val, def) => {
        const m = regex.exec(val);
        return m ? m[0] : def;
      };
      option.default(defaultValue).argParser(fn);
    } else {
      option.default(fn);
    }

    return this.addOption(option);
  }

  /**
   * Define option with `flags`, `description` and optional
   * coercion `fn`.
   *
   * The `flags` string contains the short and/or long flags,
   * separated by comma, a pipe or space. The following are all valid
   * all will output this way when `--help` is used.
   *
   *     "-p, --pepper"
   *     "-p|--pepper"
   *     "-p --pepper"
   *
   * @example
   * // simple boolean defaulting to undefined
   * program.option('-p, --pepper', 'add pepper');
   *
   * program.pepper
   * // => undefined
   *
   * --pepper
   * program.pepper
   * // => true
   *
   * // simple boolean defaulting to true (unless non-negated option is also defined)
   * program.option('-C, --no-cheese', 'remove cheese');
   *
   * program.cheese
   * // => true
   *
   * --no-cheese
   * program.cheese
   * // => false
   *
   * // required argument
   * program.option('-C, --chdir <path>', 'change the working directory');
   *
   * --chdir /tmp
   * program.chdir
   * // => "/tmp"
   *
   * // optional argument
   * program.option('-c, --cheese [type]', 'add cheese [marble]');
   *
   * @param {string} flags
   * @param {string} [description]
   * @param {Function|*} [fn] - custom option processing function or default value
   * @param {*} [defaultValue]
   * @return {Command} `this` command for chaining
   */

  option(flags, description, fn, defaultValue) {
    return this._optionEx({}, flags, description, fn, defaultValue);
  }

  /**
  * Add a required option which must have a value after parsing. This usually means
  * the option must be specified on the command line. (Otherwise the same as .option().)
  *
  * The `flags` string contains the short and/or long flags, separated by comma, a pipe or space.
  *
  * @param {string} flags
  * @param {string} [description]
  * @param {Function|*} [fn] - custom option processing function or default value
  * @param {*} [defaultValue]
  * @return {Command} `this` command for chaining
  */

  requiredOption(flags, description, fn, defaultValue) {
    return this._optionEx({ mandatory: true }, flags, description, fn, defaultValue);
  }

  /**
   * Alter parsing of short flags with optional values.
   *
   * @example
   * // for `.option('-f,--flag [value]'):
   * program.combineFlagAndOptionalValue(true);  // `-f80` is treated like `--flag=80`, this is the default behaviour
   * program.combineFlagAndOptionalValue(false) // `-fb` is treated like `-f -b`
   *
   * @param {Boolean} [combine=true] - if `true` or omitted, an optional value can be specified directly after the flag.
   */
  combineFlagAndOptionalValue(combine = true) {
    this._combineFlagAndOptionalValue = !!combine;
    return this;
  }

  /**
   * Allow unknown options on the command line.
   *
   * @param {Boolean} [allowUnknown=true] - if `true` or omitted, no error will be thrown
   * for unknown options.
   */
  allowUnknownOption(allowUnknown = true) {
    this._allowUnknownOption = !!allowUnknown;
    return this;
  }

  /**
   * Allow excess command-arguments on the command line. Pass false to make excess arguments an error.
   *
   * @param {Boolean} [allowExcess=true] - if `true` or omitted, no error will be thrown
   * for excess arguments.
   */
  allowExcessArguments(allowExcess = true) {
    this._allowExcessArguments = !!allowExcess;
    return this;
  }

  /**
   * Enable positional options. Positional means global options are specified before subcommands which lets
   * subcommands reuse the same option names, and also enables subcommands to turn on passThroughOptions.
   * The default behaviour is non-positional and global options may appear anywhere on the command line.
   *
   * @param {Boolean} [positional=true]
   */
  enablePositionalOptions(positional = true) {
    this._enablePositionalOptions = !!positional;
    return this;
  }

  /**
   * Pass through options that come after command-arguments rather than treat them as command-options,
   * so actual command-options come before command-arguments. Turning this on for a subcommand requires
   * positional options to have been enabled on the program (parent commands).
   * The default behaviour is non-positional and options may appear before or after command-arguments.
   *
   * @param {Boolean} [passThrough=true]
   * for unknown options.
   */
  passThroughOptions(passThrough = true) {
    this._passThroughOptions = !!passThrough;
    if (!!this.parent && passThrough && !this.parent._enablePositionalOptions) {
      throw new Error('passThroughOptions can not be used without turning on enablePositionalOptions for parent command(s)');
    }
    return this;
  }

  /**
    * Whether to store option values as properties on command object,
    * or store separately (specify false). In both cases the option values can be accessed using .opts().
    *
    * @param {boolean} [storeAsProperties=true]
    * @return {Command} `this` command for chaining
    */

  storeOptionsAsProperties(storeAsProperties = true) {
    this._storeOptionsAsProperties = !!storeAsProperties;
    if (this.options.length) {
      throw new Error('call .storeOptionsAsProperties() before adding options');
    }
    return this;
  }

  /**
   * Retrieve option value.
   *
   * @param {string} key
   * @return {Object} value
   */

  getOptionValue(key) {
    if (this._storeOptionsAsProperties) {
      return this[key];
    }
    return this._optionValues[key];
  }

  /**
   * Store option value.
   *
   * @param {string} key
   * @param {Object} value
   * @return {Command} `this` command for chaining
   */

  setOptionValue(key, value) {
    if (this._storeOptionsAsProperties) {
      this[key] = value;
    } else {
      this._optionValues[key] = value;
    }
    return this;
  }

  /**
   * Store option value and where the value came from.
    *
    * @param {string} key
    * @param {Object} value
    * @param {string} source - expected values are default/config/env/cli
    * @return {Command} `this` command for chaining
    */

  setOptionValueWithSource(key, value, source) {
    this.setOptionValue(key, value);
    this._optionValueSources[key] = source;
    return this;
  }

  /**
    * Get source of option value.
    * Expected values are default | config | env | cli
    *
    * @param {string} key
    * @return {string}
    */

  getOptionValueSource(key) {
    return this._optionValueSources[key];
  }

  /**
   * Get user arguments from implied or explicit arguments.
   * Side-effects: set _scriptPath if args included script. Used for default program name, and subcommand searches.
   *
   * @api private
   */

  _prepareUserArgs(argv, parseOptions) {
    if (argv !== undefined && !Array.isArray(argv)) {
      throw new Error('first parameter to parse must be array or undefined');
    }
    parseOptions = parseOptions || {};

    // Default to using process.argv
    if (argv === undefined) {
      argv = process.argv;
      // @ts-ignore: unknown property
      if (process.versions && process.versions.electron) {
        parseOptions.from = 'electron';
      }
    }
    this.rawArgs = argv.slice();

    // make it a little easier for callers by supporting various argv conventions
    let userArgs;
    switch (parseOptions.from) {
      case undefined:
      case 'node':
        this._scriptPath = argv[1];
        userArgs = argv.slice(2);
        break;
      case 'electron':
        // @ts-ignore: unknown property
        if (process.defaultApp) {
          this._scriptPath = argv[1];
          userArgs = argv.slice(2);
        } else {
          userArgs = argv.slice(1);
        }
        break;
      case 'user':
        userArgs = argv.slice(0);
        break;
      default:
        throw new Error(`unexpected parse option { from: '${parseOptions.from}' }`);
    }

    // Find default name for program from arguments.
    if (!this._name && this._scriptPath) this.nameFromFilename(this._scriptPath);
    this._name = this._name || 'program';

    return userArgs;
  }

  /**
   * Parse `argv`, setting options and invoking commands when defined.
   *
   * The default expectation is that the arguments are from node and have the application as argv[0]
   * and the script being run in argv[1], with user parameters after that.
   *
   * @example
   * program.parse(process.argv);
   * program.parse(); // implicitly use process.argv and auto-detect node vs electron conventions
   * program.parse(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]
   *
   * @param {string[]} [argv] - optional, defaults to process.argv
   * @param {Object} [parseOptions] - optionally specify style of options with from: node/user/electron
   * @param {string} [parseOptions.from] - where the args are from: 'node', 'user', 'electron'
   * @return {Command} `this` command for chaining
   */

  parse(argv, parseOptions) {
    const userArgs = this._prepareUserArgs(argv, parseOptions);
    this._parseCommand([], userArgs);

    return this;
  }

  /**
   * Parse `argv`, setting options and invoking commands when defined.
   *
   * Use parseAsync instead of parse if any of your action handlers are async. Returns a Promise.
   *
   * The default expectation is that the arguments are from node and have the application as argv[0]
   * and the script being run in argv[1], with user parameters after that.
   *
   * @example
   * await program.parseAsync(process.argv);
   * await program.parseAsync(); // implicitly use process.argv and auto-detect node vs electron conventions
   * await program.parseAsync(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]
   *
   * @param {string[]} [argv]
   * @param {Object} [parseOptions]
   * @param {string} parseOptions.from - where the args are from: 'node', 'user', 'electron'
   * @return {Promise}
   */

  async parseAsync(argv, parseOptions) {
    const userArgs = this._prepareUserArgs(argv, parseOptions);
    await this._parseCommand([], userArgs);

    return this;
  }

  /**
   * Execute a sub-command executable.
   *
   * @api private
   */

  _executeSubCommand(subcommand, args) {
    args = args.slice();
    let launchWithNode = false; // Use node for source targets so do not need to get permissions correct, and on Windows.
    const sourceExt = ['.js', '.ts', '.tsx', '.mjs', '.cjs'];

    function findFile(baseDir, baseName) {
      // Look for specified file
      const localBin = path.resolve(baseDir, baseName);
      if (fs.existsSync(localBin)) return localBin;

      // Stop looking if candidate already has an expected extension.
      if (sourceExt.includes(path.extname(baseName))) return undefined;

      // Try all the extensions.
      const foundExt = sourceExt.find(ext => fs.existsSync(`${localBin}${ext}`));
      if (foundExt) return `${localBin}${foundExt}`;

      return undefined;
    }

    // Not checking for help first. Unlikely to have mandatory and executable, and can't robustly test for help flags in external command.
    this._checkForMissingMandatoryOptions();
    this._checkForConflictingOptions();

    // executableFile and executableDir might be full path, or just a name
    let executableFile = subcommand._executableFile || `${this._name}-${subcommand._name}`;
    let executableDir = this._executableDir || '';
    if (this._scriptPath) {
      let resolvedScriptPath; // resolve possible symlink for installed npm binary
      try {
        resolvedScriptPath = fs.realpathSync(this._scriptPath);
      } catch (err) {
        resolvedScriptPath = this._scriptPath;
      }
      executableDir = path.resolve(path.dirname(resolvedScriptPath), executableDir);
    }

    // Look for a local file in preference to a command in PATH.
    if (executableDir) {
      let localFile = findFile(executableDir, executableFile);

      // Legacy search using prefix of script name instead of command name
      if (!localFile && !subcommand._executableFile && this._scriptPath) {
        const legacyName = path.basename(this._scriptPath, path.extname(this._scriptPath));
        if (legacyName !== this._name) {
          localFile = findFile(executableDir, `${legacyName}-${subcommand._name}`);
        }
      }
      executableFile = localFile || executableFile;
    }

    launchWithNode = sourceExt.includes(path.extname(executableFile));

    let proc;
    if (process.platform !== 'win32') {
      if (launchWithNode) {
        args.unshift(executableFile);
        // add executable arguments to spawn
        args = incrementNodeInspectorPort(process.execArgv).concat(args);

        proc = childProcess.spawn(process.argv[0], args, { stdio: 'inherit' });
      } else {
        proc = childProcess.spawn(executableFile, args, { stdio: 'inherit' });
      }
    } else {
      args.unshift(executableFile);
      // add executable arguments to spawn
      args = incrementNodeInspectorPort(process.execArgv).concat(args);
      proc = childProcess.spawn(process.execPath, args, { stdio: 'inherit' });
    }

    if (!proc.killed) { // testing mainly to avoid leak warnings during unit tests with mocked spawn
      const signals = ['SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGINT', 'SIGHUP'];
      signals.forEach((signal) => {
        // @ts-ignore
        process.on(signal, () => {
          if (proc.killed === false && proc.exitCode === null) {
            proc.kill(signal);
          }
        });
      });
    }

    // By default terminate process when spawned process terminates.
    // Suppressing the exit if exitCallback defined is a bit messy and of limited use, but does allow process to stay running!
    const exitCallback = this._exitCallback;
    if (!exitCallback) {
      proc.on('close', process.exit.bind(process));
    } else {
      proc.on('close', () => {
        exitCallback(new CommanderError(process.exitCode || 0, 'commander.executeSubCommandAsync', '(close)'));
      });
    }
    proc.on('error', (err) => {
      // @ts-ignore
      if (err.code === 'ENOENT') {
        const executableDirMessage = executableDir
          ? `searched for local subcommand relative to directory '${executableDir}'`
          : 'no directory for search for local subcommand, use .executableDir() to supply a custom directory';
        const executableMissing = `'${executableFile}' does not exist
 - if '${subcommand._name}' is not meant to be an executable command, remove description parameter from '.command()' and use '.description()' instead
 - if the default executable name is not suitable, use the executableFile option to supply a custom name or path
 - ${executableDirMessage}`;
        throw new Error(executableMissing);
      // @ts-ignore
      } else if (err.code === 'EACCES') {
        throw new Error(`'${executableFile}' not executable`);
      }
      if (!exitCallback) {
        process.exit(1);
      } else {
        const wrappedError = new CommanderError(1, 'commander.executeSubCommandAsync', '(error)');
        wrappedError.nestedError = err;
        exitCallback(wrappedError);
      }
    });

    // Store the reference to the child process
    this.runningCommand = proc;
  }

  /**
   * @api private
   */

  _dispatchSubcommand(commandName, operands, unknown) {
    const subCommand = this._findCommand(commandName);
    if (!subCommand) this.help({ error: true });

    let hookResult;
    hookResult = this._chainOrCallSubCommandHook(hookResult, subCommand, 'preSubcommand');
    hookResult = this._chainOrCall(hookResult, () => {
      if (subCommand._executableHandler) {
        this._executeSubCommand(subCommand, operands.concat(unknown));
      } else {
        return subCommand._parseCommand(operands, unknown);
      }
    });
    return hookResult;
  }

  /**
   * Check this.args against expected this._args.
   *
   * @api private
   */

  _checkNumberOfArguments() {
    // too few
    this._args.forEach((arg, i) => {
      if (arg.required && this.args[i] == null) {
        this.missingArgument(arg.name());
      }
    });
    // too many
    if (this._args.length > 0 && this._args[this._args.length - 1].variadic) {
      return;
    }
    if (this.args.length > this._args.length) {
      this._excessArguments(this.args);
    }
  }

  /**
   * Process this.args using this._args and save as this.processedArgs!
   *
   * @api private
   */

  _processArguments() {
    const myParseArg = (argument, value, previous) => {
      // Extra processing for nice error message on parsing failure.
      let parsedValue = value;
      if (value !== null && argument.parseArg) {
        try {
          parsedValue = argument.parseArg(value, previous);
        } catch (err) {
          if (err.code === 'commander.invalidArgument') {
            const message = `error: command-argument value '${value}' is invalid for argument '${argument.name()}'. ${err.message}`;
            this.error(message, { exitCode: err.exitCode, code: err.code });
          }
          throw err;
        }
      }
      return parsedValue;
    };

    this._checkNumberOfArguments();

    const processedArgs = [];
    this._args.forEach((declaredArg, index) => {
      let value = declaredArg.defaultValue;
      if (declaredArg.variadic) {
        // Collect together remaining arguments for passing together as an array.
        if (index < this.args.length) {
          value = this.args.slice(index);
          if (declaredArg.parseArg) {
            value = value.reduce((processed, v) => {
              return myParseArg(declaredArg, v, processed);
            }, declaredArg.defaultValue);
          }
        } else if (value === undefined) {
          value = [];
        }
      } else if (index < this.args.length) {
        value = this.args[index];
        if (declaredArg.parseArg) {
          value = myParseArg(declaredArg, value, declaredArg.defaultValue);
        }
      }
      processedArgs[index] = value;
    });
    this.processedArgs = processedArgs;
  }

  /**
   * Once we have a promise we chain, but call synchronously until then.
   *
   * @param {Promise|undefined} promise
   * @param {Function} fn
   * @return {Promise|undefined}
   * @api private
   */

  _chainOrCall(promise, fn) {
    // thenable
    if (promise && promise.then && typeof promise.then === 'function') {
      // already have a promise, chain callback
      return promise.then(() => fn());
    }
    // callback might return a promise
    return fn();
  }

  /**
   *
   * @param {Promise|undefined} promise
   * @param {string} event
   * @return {Promise|undefined}
   * @api private
   */

  _chainOrCallHooks(promise, event) {
    let result = promise;
    const hooks = [];
    getCommandAndParents(this)
      .reverse()
      .filter(cmd => cmd._lifeCycleHooks[event] !== undefined)
      .forEach(hookedCommand => {
        hookedCommand._lifeCycleHooks[event].forEach((callback) => {
          hooks.push({ hookedCommand, callback });
        });
      });
    if (event === 'postAction') {
      hooks.reverse();
    }

    hooks.forEach((hookDetail) => {
      result = this._chainOrCall(result, () => {
        return hookDetail.callback(hookDetail.hookedCommand, this);
      });
    });
    return result;
  }

  /**
   *
   * @param {Promise|undefined} promise
   * @param {Command} subCommand
   * @param {string} event
   * @return {Promise|undefined}
   * @api private
   */

  _chainOrCallSubCommandHook(promise, subCommand, event) {
    let result = promise;
    if (this._lifeCycleHooks[event] !== undefined) {
      this._lifeCycleHooks[event].forEach((hook) => {
        result = this._chainOrCall(result, () => {
          return hook(this, subCommand);
        });
      });
    }
    return result;
  }

  /**
   * Process arguments in context of this command.
   * Returns action result, in case it is a promise.
   *
   * @api private
   */

  _parseCommand(operands, unknown) {
    const parsed = this.parseOptions(unknown);
    this._parseOptionsEnv(); // after cli, so parseArg not called on both cli and env
    this._parseOptionsImplied();
    operands = operands.concat(parsed.operands);
    unknown = parsed.unknown;
    this.args = operands.concat(unknown);

    if (operands && this._findCommand(operands[0])) {
      return this._dispatchSubcommand(operands[0], operands.slice(1), unknown);
    }
    if (this._hasImplicitHelpCommand() && operands[0] === this._helpCommandName) {
      if (operands.length === 1) {
        this.help();
      }
      return this._dispatchSubcommand(operands[1], [], [this._helpLongFlag]);
    }
    if (this._defaultCommandName) {
      outputHelpIfRequested(this, unknown); // Run the help for default command from parent rather than passing to default command
      return this._dispatchSubcommand(this._defaultCommandName, operands, unknown);
    }
    if (this.commands.length && this.args.length === 0 && !this._actionHandler && !this._defaultCommandName) {
      // probably missing subcommand and no handler, user needs help (and exit)
      this.help({ error: true });
    }

    outputHelpIfRequested(this, parsed.unknown);
    this._checkForMissingMandatoryOptions();
    this._checkForConflictingOptions();

    // We do not always call this check to avoid masking a "better" error, like unknown command.
    const checkForUnknownOptions = () => {
      if (parsed.unknown.length > 0) {
        this.unknownOption(parsed.unknown[0]);
      }
    };

    const commandEvent = `command:${this.name()}`;
    if (this._actionHandler) {
      checkForUnknownOptions();
      this._processArguments();

      let actionResult;
      actionResult = this._chainOrCallHooks(actionResult, 'preAction');
      actionResult = this._chainOrCall(actionResult, () => this._actionHandler(this.processedArgs));
      if (this.parent) {
        actionResult = this._chainOrCall(actionResult, () => {
          this.parent.emit(commandEvent, operands, unknown); // legacy
        });
      }
      actionResult = this._chainOrCallHooks(actionResult, 'postAction');
      return actionResult;
    }
    if (this.parent && this.parent.listenerCount(commandEvent)) {
      checkForUnknownOptions();
      this._processArguments();
      this.parent.emit(commandEvent, operands, unknown); // legacy
    } else if (operands.length) {
      if (this._findCommand('*')) { // legacy default command
        return this._dispatchSubcommand('*', operands, unknown);
      }
      if (this.listenerCount('command:*')) {
        // skip option check, emit event for possible misspelling suggestion
        this.emit('command:*', operands, unknown);
      } else if (this.commands.length) {
        this.unknownCommand();
      } else {
        checkForUnknownOptions();
        this._processArguments();
      }
    } else if (this.commands.length) {
      checkForUnknownOptions();
      // This command has subcommands and nothing hooked up at this level, so display help (and exit).
      this.help({ error: true });
    } else {
      checkForUnknownOptions();
      this._processArguments();
      // fall through for caller to handle after calling .parse()
    }
  }

  /**
   * Find matching command.
   *
   * @api private
   */
  _findCommand(name) {
    if (!name) return undefined;
    return this.commands.find(cmd => cmd._name === name || cmd._aliases.includes(name));
  }

  /**
   * Return an option matching `arg` if any.
   *
   * @param {string} arg
   * @return {Option}
   * @api private
   */

  _findOption(arg) {
    return this.options.find(option => option.is(arg));
  }

  /**
   * Display an error message if a mandatory option does not have a value.
   * Called after checking for help flags in leaf subcommand.
   *
   * @api private
   */

  _checkForMissingMandatoryOptions() {
    // Walk up hierarchy so can call in subcommand after checking for displaying help.
    for (let cmd = this; cmd; cmd = cmd.parent) {
      cmd.options.forEach((anOption) => {
        if (anOption.mandatory && (cmd.getOptionValue(anOption.attributeName()) === undefined)) {
          cmd.missingMandatoryOptionValue(anOption);
        }
      });
    }
  }

  /**
   * Display an error message if conflicting options are used together in this.
   *
   * @api private
   */
  _checkForConflictingLocalOptions() {
    const definedNonDefaultOptions = this.options.filter(
      (option) => {
        const optionKey = option.attributeName();
        if (this.getOptionValue(optionKey) === undefined) {
          return false;
        }
        return this.getOptionValueSource(optionKey) !== 'default';
      }
    );

    const optionsWithConflicting = definedNonDefaultOptions.filter(
      (option) => option.conflictsWith.length > 0
    );

    optionsWithConflicting.forEach((option) => {
      const conflictingAndDefined = definedNonDefaultOptions.find((defined) =>
        option.conflictsWith.includes(defined.attributeName())
      );
      if (conflictingAndDefined) {
        this._conflictingOption(option, conflictingAndDefined);
      }
    });
  }

  /**
   * Display an error message if conflicting options are used together.
   * Called after checking for help flags in leaf subcommand.
   *
   * @api private
   */
  _checkForConflictingOptions() {
    // Walk up hierarchy so can call in subcommand after checking for displaying help.
    for (let cmd = this; cmd; cmd = cmd.parent) {
      cmd._checkForConflictingLocalOptions();
    }
  }

  /**
   * Parse options from `argv` removing known options,
   * and return argv split into operands and unknown arguments.
   *
   * Examples:
   *
   *     argv => operands, unknown
   *     --known kkk op => [op], []
   *     op --known kkk => [op], []
   *     sub --unknown uuu op => [sub], [--unknown uuu op]
   *     sub -- --unknown uuu op => [sub --unknown uuu op], []
   *
   * @param {String[]} argv
   * @return {{operands: String[], unknown: String[]}}
   */

  parseOptions(argv) {
    const operands = []; // operands, not options or values
    const unknown = []; // first unknown option and remaining unknown args
    let dest = operands;
    const args = argv.slice();

    function maybeOption(arg) {
      return arg.length > 1 && arg[0] === '-';
    }

    // parse options
    let activeVariadicOption = null;
    while (args.length) {
      const arg = args.shift();

      // literal
      if (arg === '--') {
        if (dest === unknown) dest.push(arg);
        dest.push(...args);
        break;
      }

      if (activeVariadicOption && !maybeOption(arg)) {
        this.emit(`option:${activeVariadicOption.name()}`, arg);
        continue;
      }
      activeVariadicOption = null;

      if (maybeOption(arg)) {
        const option = this._findOption(arg);
        // recognised option, call listener to assign value with possible custom processing
        if (option) {
          if (option.required) {
            const value = args.shift();
            if (value === undefined) this.optionMissingArgument(option);
            this.emit(`option:${option.name()}`, value);
          } else if (option.optional) {
            let value = null;
            // historical behaviour is optional value is following arg unless an option
            if (args.length > 0 && !maybeOption(args[0])) {
              value = args.shift();
            }
            this.emit(`option:${option.name()}`, value);
          } else { // boolean flag
            this.emit(`option:${option.name()}`);
          }
          activeVariadicOption = option.variadic ? option : null;
          continue;
        }
      }

      // Look for combo options following single dash, eat first one if known.
      if (arg.length > 2 && arg[0] === '-' && arg[1] !== '-') {
        const option = this._findOption(`-${arg[1]}`);
        if (option) {
          if (option.required || (option.optional && this._combineFlagAndOptionalValue)) {
            // option with value following in same argument
            this.emit(`option:${option.name()}`, arg.slice(2));
          } else {
            // boolean option, emit and put back remainder of arg for further processing
            this.emit(`option:${option.name()}`);
            args.unshift(`-${arg.slice(2)}`);
          }
          continue;
        }
      }

      // Look for known long flag with value, like --foo=bar
      if (/^--[^=]+=/.test(arg)) {
        const index = arg.indexOf('=');
        const option = this._findOption(arg.slice(0, index));
        if (option && (option.required || option.optional)) {
          this.emit(`option:${option.name()}`, arg.slice(index + 1));
          continue;
        }
      }

      // Not a recognised option by this command.
      // Might be a command-argument, or subcommand option, or unknown option, or help command or option.

      // An unknown option means further arguments also classified as unknown so can be reprocessed by subcommands.
      if (maybeOption(arg)) {
        dest = unknown;
      }

      // If using positionalOptions, stop processing our options at subcommand.
      if ((this._enablePositionalOptions || this._passThroughOptions) && operands.length === 0 && unknown.length === 0) {
        if (this._findCommand(arg)) {
          operands.push(arg);
          if (args.length > 0) unknown.push(...args);
          break;
        } else if (arg === this._helpCommandName && this._hasImplicitHelpCommand()) {
          operands.push(arg);
          if (args.length > 0) operands.push(...args);
          break;
        } else if (this._defaultCommandName) {
          unknown.push(arg);
          if (args.length > 0) unknown.push(...args);
          break;
        }
      }

      // If using passThroughOptions, stop processing options at first command-argument.
      if (this._passThroughOptions) {
        dest.push(arg);
        if (args.length > 0) dest.push(...args);
        break;
      }

      // add arg
      dest.push(arg);
    }

    return { operands, unknown };
  }

  /**
   * Return an object containing local option values as key-value pairs.
   *
   * @return {Object}
   */
  opts() {
    if (this._storeOptionsAsProperties) {
      // Preserve original behaviour so backwards compatible when still using properties
      const result = {};
      const len = this.options.length;

      for (let i = 0; i < len; i++) {
        const key = this.options[i].attributeName();
        result[key] = key === this._versionOptionName ? this._version : this[key];
      }
      return result;
    }

    return this._optionValues;
  }

  /**
   * Return an object containing merged local and global option values as key-value pairs.
   *
   * @return {Object}
   */
  optsWithGlobals() {
    // globals overwrite locals
    return getCommandAndParents(this).reduce(
      (combinedOptions, cmd) => Object.assign(combinedOptions, cmd.opts()),
      {}
    );
  }

  /**
   * Display error message and exit (or call exitOverride).
   *
   * @param {string} message
   * @param {Object} [errorOptions]
   * @param {string} [errorOptions.code] - an id string representing the error
   * @param {number} [errorOptions.exitCode] - used with process.exit
   */
  error(message, errorOptions) {
    // output handling
    this._outputConfiguration.outputError(`${message}\n`, this._outputConfiguration.writeErr);
    if (typeof this._showHelpAfterError === 'string') {
      this._outputConfiguration.writeErr(`${this._showHelpAfterError}\n`);
    } else if (this._showHelpAfterError) {
      this._outputConfiguration.writeErr('\n');
      this.outputHelp({ error: true });
    }

    // exit handling
    const config = errorOptions || {};
    const exitCode = config.exitCode || 1;
    const code = config.code || 'commander.error';
    this._exit(exitCode, code, message);
  }

  /**
   * Apply any option related environment variables, if option does
   * not have a value from cli or client code.
   *
   * @api private
   */
  _parseOptionsEnv() {
    this.options.forEach((option) => {
      if (option.envVar && option.envVar in process.env) {
        const optionKey = option.attributeName();
        // Priority check. Do not overwrite cli or options from unknown source (client-code).
        if (this.getOptionValue(optionKey) === undefined || ['default', 'config', 'env'].includes(this.getOptionValueSource(optionKey))) {
          if (option.required || option.optional) { // option can take a value
            // keep very simple, optional always takes value
            this.emit(`optionEnv:${option.name()}`, process.env[option.envVar]);
          } else { // boolean
            // keep very simple, only care that envVar defined and not the value
            this.emit(`optionEnv:${option.name()}`);
          }
        }
      }
    });
  }

  /**
   * Apply any implied option values, if option is undefined or default value.
   *
   * @api private
   */
  _parseOptionsImplied() {
    const dualHelper = new DualOptions(this.options);
    const hasCustomOptionValue = (optionKey) => {
      return this.getOptionValue(optionKey) !== undefined && !['default', 'implied'].includes(this.getOptionValueSource(optionKey));
    };
    this.options
      .filter(option => (option.implied !== undefined) &&
        hasCustomOptionValue(option.attributeName()) &&
        dualHelper.valueFromOption(this.getOptionValue(option.attributeName()), option))
      .forEach((option) => {
        Object.keys(option.implied)
          .filter(impliedKey => !hasCustomOptionValue(impliedKey))
          .forEach(impliedKey => {
            this.setOptionValueWithSource(impliedKey, option.implied[impliedKey], 'implied');
          });
      });
  }

  /**
   * Argument `name` is missing.
   *
   * @param {string} name
   * @api private
   */

  missingArgument(name) {
    const message = `error: missing required argument '${name}'`;
    this.error(message, { code: 'commander.missingArgument' });
  }

  /**
   * `Option` is missing an argument.
   *
   * @param {Option} option
   * @api private
   */

  optionMissingArgument(option) {
    const message = `error: option '${option.flags}' argument missing`;
    this.error(message, { code: 'commander.optionMissingArgument' });
  }

  /**
   * `Option` does not have a value, and is a mandatory option.
   *
   * @param {Option} option
   * @api private
   */

  missingMandatoryOptionValue(option) {
    const message = `error: required option '${option.flags}' not specified`;
    this.error(message, { code: 'commander.missingMandatoryOptionValue' });
  }

  /**
   * `Option` conflicts with another option.
   *
   * @param {Option} option
   * @param {Option} conflictingOption
   * @api private
   */
  _conflictingOption(option, conflictingOption) {
    // The calling code does not know whether a negated option is the source of the
    // value, so do some work to take an educated guess.
    const findBestOptionFromValue = (option) => {
      const optionKey = option.attributeName();
      const optionValue = this.getOptionValue(optionKey);
      const negativeOption = this.options.find(target => target.negate && optionKey === target.attributeName());
      const positiveOption = this.options.find(target => !target.negate && optionKey === target.attributeName());
      if (negativeOption && (
        (negativeOption.presetArg === undefined && optionValue === false) ||
        (negativeOption.presetArg !== undefined && optionValue === negativeOption.presetArg)
      )) {
        return negativeOption;
      }
      return positiveOption || option;
    };

    const getErrorMessage = (option) => {
      const bestOption = findBestOptionFromValue(option);
      const optionKey = bestOption.attributeName();
      const source = this.getOptionValueSource(optionKey);
      if (source === 'env') {
        return `environment variable '${bestOption.envVar}'`;
      }
      return `option '${bestOption.flags}'`;
    };

    const message = `error: ${getErrorMessage(option)} cannot be used with ${getErrorMessage(conflictingOption)}`;
    this.error(message, { code: 'commander.conflictingOption' });
  }

  /**
   * Unknown option `flag`.
   *
   * @param {string} flag
   * @api private
   */

  unknownOption(flag) {
    if (this._allowUnknownOption) return;
    let suggestion = '';

    if (flag.startsWith('--') && this._showSuggestionAfterError) {
      // Looping to pick up the global options too
      let candidateFlags = [];
      let command = this;
      do {
        const moreFlags = command.createHelp().visibleOptions(command)
          .filter(option => option.long)
          .map(option => option.long);
        candidateFlags = candidateFlags.concat(moreFlags);
        command = command.parent;
      } while (command && !command._enablePositionalOptions);
      suggestion = suggestSimilar(flag, candidateFlags);
    }

    const message = `error: unknown option '${flag}'${suggestion}`;
    this.error(message, { code: 'commander.unknownOption' });
  }

  /**
   * Excess arguments, more than expected.
   *
   * @param {string[]} receivedArgs
   * @api private
   */

  _excessArguments(receivedArgs) {
    if (this._allowExcessArguments) return;

    const expected = this._args.length;
    const s = (expected === 1) ? '' : 's';
    const forSubcommand = this.parent ? ` for '${this.name()}'` : '';
    const message = `error: too many arguments${forSubcommand}. Expected ${expected} argument${s} but got ${receivedArgs.length}.`;
    this.error(message, { code: 'commander.excessArguments' });
  }

  /**
   * Unknown command.
   *
   * @api private
   */

  unknownCommand() {
    const unknownName = this.args[0];
    let suggestion = '';

    if (this._showSuggestionAfterError) {
      const candidateNames = [];
      this.createHelp().visibleCommands(this).forEach((command) => {
        candidateNames.push(command.name());
        // just visible alias
        if (command.alias()) candidateNames.push(command.alias());
      });
      suggestion = suggestSimilar(unknownName, candidateNames);
    }

    const message = `error: unknown command '${unknownName}'${suggestion}`;
    this.error(message, { code: 'commander.unknownCommand' });
  }

  /**
   * Set the program version to `str`.
   *
   * This method auto-registers the "-V, --version" flag
   * which will print the version number when passed.
   *
   * You can optionally supply the  flags and description to override the defaults.
   *
   * @param {string} str
   * @param {string} [flags]
   * @param {string} [description]
   * @return {this | string} `this` command for chaining, or version string if no arguments
   */

  version(str, flags, description) {
    if (str === undefined) return this._version;
    this._version = str;
    flags = flags || '-V, --version';
    description = description || 'output the version number';
    const versionOption = this.createOption(flags, description);
    this._versionOptionName = versionOption.attributeName();
    this.options.push(versionOption);
    this.on('option:' + versionOption.name(), () => {
      this._outputConfiguration.writeOut(`${str}\n`);
      this._exit(0, 'commander.version', str);
    });
    return this;
  }

  /**
   * Set the description.
   *
   * @param {string} [str]
   * @param {Object} [argsDescription]
   * @return {string|Command}
   */
  description(str, argsDescription) {
    if (str === undefined && argsDescription === undefined) return this._description;
    this._description = str;
    if (argsDescription) {
      this._argsDescription = argsDescription;
    }
    return this;
  }

  /**
   * Set the summary. Used when listed as subcommand of parent.
   *
   * @param {string} [str]
   * @return {string|Command}
   */
  summary(str) {
    if (str === undefined) return this._summary;
    this._summary = str;
    return this;
  }

  /**
   * Set an alias for the command.
   *
   * You may call more than once to add multiple aliases. Only the first alias is shown in the auto-generated help.
   *
   * @param {string} [alias]
   * @return {string|Command}
   */

  alias(alias) {
    if (alias === undefined) return this._aliases[0]; // just return first, for backwards compatibility

    /** @type {Command} */
    let command = this;
    if (this.commands.length !== 0 && this.commands[this.commands.length - 1]._executableHandler) {
      // assume adding alias for last added executable subcommand, rather than this
      command = this.commands[this.commands.length - 1];
    }

    if (alias === command._name) throw new Error('Command alias can\'t be the same as its name');

    command._aliases.push(alias);
    return this;
  }

  /**
   * Set aliases for the command.
   *
   * Only the first alias is shown in the auto-generated help.
   *
   * @param {string[]} [aliases]
   * @return {string[]|Command}
   */

  aliases(aliases) {
    // Getter for the array of aliases is the main reason for having aliases() in addition to alias().
    if (aliases === undefined) return this._aliases;

    aliases.forEach((alias) => this.alias(alias));
    return this;
  }

  /**
   * Set / get the command usage `str`.
   *
   * @param {string} [str]
   * @return {String|Command}
   */

  usage(str) {
    if (str === undefined) {
      if (this._usage) return this._usage;

      const args = this._args.map((arg) => {
        return humanReadableArgName(arg);
      });
      return [].concat(
        (this.options.length || this._hasHelpOption ? '[options]' : []),
        (this.commands.length ? '[command]' : []),
        (this._args.length ? args : [])
      ).join(' ');
    }

    this._usage = str;
    return this;
  }

  /**
   * Get or set the name of the command.
   *
   * @param {string} [str]
   * @return {string|Command}
   */

  name(str) {
    if (str === undefined) return this._name;
    this._name = str;
    return this;
  }

  /**
   * Set the name of the command from script filename, such as process.argv[1],
   * or require.main.filename, or __filename.
   *
   * (Used internally and public although not documented in README.)
   *
   * @example
   * program.nameFromFilename(require.main.filename);
   *
   * @param {string} filename
   * @return {Command}
   */

  nameFromFilename(filename) {
    this._name = path.basename(filename, path.extname(filename));

    return this;
  }

  /**
   * Get or set the directory for searching for executable subcommands of this command.
   *
   * @example
   * program.executableDir(__dirname);
   * // or
   * program.executableDir('subcommands');
   *
   * @param {string} [path]
   * @return {string|Command}
   */

  executableDir(path) {
    if (path === undefined) return this._executableDir;
    this._executableDir = path;
    return this;
  }

  /**
   * Return program help documentation.
   *
   * @param {{ error: boolean }} [contextOptions] - pass {error:true} to wrap for stderr instead of stdout
   * @return {string}
   */

  helpInformation(contextOptions) {
    const helper = this.createHelp();
    if (helper.helpWidth === undefined) {
      helper.helpWidth = (contextOptions && contextOptions.error) ? this._outputConfiguration.getErrHelpWidth() : this._outputConfiguration.getOutHelpWidth();
    }
    return helper.formatHelp(this, helper);
  }

  /**
   * @api private
   */

  _getHelpContext(contextOptions) {
    contextOptions = contextOptions || {};
    const context = { error: !!contextOptions.error };
    let write;
    if (context.error) {
      write = (arg) => this._outputConfiguration.writeErr(arg);
    } else {
      write = (arg) => this._outputConfiguration.writeOut(arg);
    }
    context.write = contextOptions.write || write;
    context.command = this;
    return context;
  }

  /**
   * Output help information for this command.
   *
   * Outputs built-in help, and custom text added using `.addHelpText()`.
   *
   * @param {{ error: boolean } | Function} [contextOptions] - pass {error:true} to write to stderr instead of stdout
   */

  outputHelp(contextOptions) {
    let deprecatedCallback;
    if (typeof contextOptions === 'function') {
      deprecatedCallback = contextOptions;
      contextOptions = undefined;
    }
    const context = this._getHelpContext(contextOptions);

    getCommandAndParents(this).reverse().forEach(command => command.emit('beforeAllHelp', context));
    this.emit('beforeHelp', context);

    let helpInformation = this.helpInformation(context);
    if (deprecatedCallback) {
      helpInformation = deprecatedCallback(helpInformation);
      if (typeof helpInformation !== 'string' && !Buffer.isBuffer(helpInformation)) {
        throw new Error('outputHelp callback must return a string or a Buffer');
      }
    }
    context.write(helpInformation);

    this.emit(this._helpLongFlag); // deprecated
    this.emit('afterHelp', context);
    getCommandAndParents(this).forEach(command => command.emit('afterAllHelp', context));
  }

  /**
   * You can pass in flags and a description to override the help
   * flags and help description for your command. Pass in false to
   * disable the built-in help option.
   *
   * @param {string | boolean} [flags]
   * @param {string} [description]
   * @return {Command} `this` command for chaining
   */

  helpOption(flags, description) {
    if (typeof flags === 'boolean') {
      this._hasHelpOption = flags;
      return this;
    }
    this._helpFlags = flags || this._helpFlags;
    this._helpDescription = description || this._helpDescription;

    const helpFlags = splitOptionFlags(this._helpFlags);
    this._helpShortFlag = helpFlags.shortFlag;
    this._helpLongFlag = helpFlags.longFlag;

    return this;
  }

  /**
   * Output help information and exit.
   *
   * Outputs built-in help, and custom text added using `.addHelpText()`.
   *
   * @param {{ error: boolean }} [contextOptions] - pass {error:true} to write to stderr instead of stdout
   */

  help(contextOptions) {
    this.outputHelp(contextOptions);
    let exitCode = process.exitCode || 0;
    if (exitCode === 0 && contextOptions && typeof contextOptions !== 'function' && contextOptions.error) {
      exitCode = 1;
    }
    // message: do not have all displayed text available so only passing placeholder.
    this._exit(exitCode, 'commander.help', '(outputHelp)');
  }

  /**
   * Add additional text to be displayed with the built-in help.
   *
   * Position is 'before' or 'after' to affect just this command,
   * and 'beforeAll' or 'afterAll' to affect this command and all its subcommands.
   *
   * @param {string} position - before or after built-in help
   * @param {string | Function} text - string to add, or a function returning a string
   * @return {Command} `this` command for chaining
   */
  addHelpText(position, text) {
    const allowedValues = ['beforeAll', 'before', 'after', 'afterAll'];
    if (!allowedValues.includes(position)) {
      throw new Error(`Unexpected value for position to addHelpText.
Expecting one of '${allowedValues.join("', '")}'`);
    }
    const helpEvent = `${position}Help`;
    this.on(helpEvent, (context) => {
      let helpStr;
      if (typeof text === 'function') {
        helpStr = text({ error: context.error, command: context.command });
      } else {
        helpStr = text;
      }
      // Ignore falsy value when nothing to output.
      if (helpStr) {
        context.write(`${helpStr}\n`);
      }
    });
    return this;
  }
}

/**
 * Output help information if help flags specified
 *
 * @param {Command} cmd - command to output help for
 * @param {Array} args - array of options to search for help flags
 * @api private
 */

function outputHelpIfRequested(cmd, args) {
  const helpOption = cmd._hasHelpOption && args.find(arg => arg === cmd._helpLongFlag || arg === cmd._helpShortFlag);
  if (helpOption) {
    cmd.outputHelp();
    // (Do not have all displayed text available so only passing placeholder.)
    cmd._exit(0, 'commander.helpDisplayed', '(outputHelp)');
  }
}

/**
 * Scan arguments and increment port number for inspect calls (to avoid conflicts when spawning new command).
 *
 * @param {string[]} args - array of arguments from node.execArgv
 * @returns {string[]}
 * @api private
 */

function incrementNodeInspectorPort(args) {
  // Testing for these options:
  //  --inspect[=[host:]port]
  //  --inspect-brk[=[host:]port]
  //  --inspect-port=[host:]port
  return args.map((arg) => {
    if (!arg.startsWith('--inspect')) {
      return arg;
    }
    let debugOption;
    let debugHost = '127.0.0.1';
    let debugPort = '9229';
    let match;
    if ((match = arg.match(/^(--inspect(-brk)?)$/)) !== null) {
      // e.g. --inspect
      debugOption = match[1];
    } else if ((match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+)$/)) !== null) {
      debugOption = match[1];
      if (/^\d+$/.test(match[3])) {
        // e.g. --inspect=1234
        debugPort = match[3];
      } else {
        // e.g. --inspect=localhost
        debugHost = match[3];
      }
    } else if ((match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/)) !== null) {
      // e.g. --inspect=localhost:1234
      debugOption = match[1];
      debugHost = match[3];
      debugPort = match[4];
    }

    if (debugOption && debugPort !== '0') {
      return `${debugOption}=${debugHost}:${parseInt(debugPort) + 1}`;
    }
    return arg;
  });
}

/**
 * @param {Command} startCommand
 * @returns {Command[]}
 * @api private
 */

function getCommandAndParents(startCommand) {
  const result = [];
  for (let command = startCommand; command; command = command.parent) {
    result.push(command);
  }
  return result;
}

exports.Command = Command;
// @ts-check

/**
 * CommanderError class
 * @class
 */
class CommanderError extends Error {
  /**
   * Constructs the CommanderError class
   * @param {number} exitCode suggested exit code which could be used with process.exit
   * @param {string} code an id string representing the error
   * @param {string} message human-readable description of the error
   * @constructor
   */
  constructor(exitCode, code, message) {
    super(message);
    // properly capture stack trace in Node.js
    Error.captureStackTrace(this, this.constructor);
    this.name = this.constructor.name;
    this.code = code;
    this.exitCode = exitCode;
    this.nestedError = undefined;
  }
}

/**
 * InvalidArgumentError class
 * @class
 */
class InvalidArgumentError extends CommanderError {
  /**
   * Constructs the InvalidArgumentError class
   * @param {string} [message] explanation of why argument is invalid
   * @constructor
   */
  constructor(message) {
    super(1, 'commander.invalidArgument', message);
    // properly capture stack trace in Node.js
    Error.captureStackTrace(this, this.constructor);
    this.name = this.constructor.name;
  }
}

exports.CommanderError = CommanderError;
exports.InvalidArgumentError = InvalidArgumentError;
const { humanReadableArgName } = require('./argument.js');

/**
 * TypeScript import types for JSDoc, used by Visual Studio Code IntelliSense and `npm run typescript-checkJS`
 * https://www.typescriptlang.org/docs/handbook/jsdoc-supported-types.html#import-types
 * @typedef { import("./argument.js").Argument } Argument
 * @typedef { import("./command.js").Command } Command
 * @typedef { import("./option.js").Option } Option
 */

// @ts-check

// Although this is a class, methods are static in style to allow override using subclass or just functions.
class Help {
  constructor() {
    this.helpWidth = undefined;
    this.sortSubcommands = false;
    this.sortOptions = false;
  }

  /**
   * Get an array of the visible subcommands. Includes a placeholder for the implicit help command, if there is one.
   *
   * @param {Command} cmd
   * @returns {Command[]}
   */

  visibleCommands(cmd) {
    const visibleCommands = cmd.commands.filter(cmd => !cmd._hidden);
    if (cmd._hasImplicitHelpCommand()) {
      // Create a command matching the implicit help command.
      const [, helpName, helpArgs] = cmd._helpCommandnameAndArgs.match(/([^ ]+) *(.*)/);
      const helpCommand = cmd.createCommand(helpName)
        .helpOption(false);
      helpCommand.description(cmd._helpCommandDescription);
      if (helpArgs) helpCommand.arguments(helpArgs);
      visibleCommands.push(helpCommand);
    }
    if (this.sortSubcommands) {
      visibleCommands.sort((a, b) => {
        // @ts-ignore: overloaded return type
        return a.name().localeCompare(b.name());
      });
    }
    return visibleCommands;
  }

  /**
   * Get an array of the visible options. Includes a placeholder for the implicit help option, if there is one.
   *
   * @param {Command} cmd
   * @returns {Option[]}
   */

  visibleOptions(cmd) {
    const visibleOptions = cmd.options.filter((option) => !option.hidden);
    // Implicit help
    const showShortHelpFlag = cmd._hasHelpOption && cmd._helpShortFlag && !cmd._findOption(cmd._helpShortFlag);
    const showLongHelpFlag = cmd._hasHelpOption && !cmd._findOption(cmd._helpLongFlag);
    if (showShortHelpFlag || showLongHelpFlag) {
      let helpOption;
      if (!showShortHelpFlag) {
        helpOption = cmd.createOption(cmd._helpLongFlag, cmd._helpDescription);
      } else if (!showLongHelpFlag) {
        helpOption = cmd.createOption(cmd._helpShortFlag, cmd._helpDescription);
      } else {
        helpOption = cmd.createOption(cmd._helpFlags, cmd._helpDescription);
      }
      visibleOptions.push(helpOption);
    }
    if (this.sortOptions) {
      const getSortKey = (option) => {
        // WYSIWYG for order displayed in help with short before long, no special handling for negated.
        return option.short ? option.short.replace(/^-/, '') : option.long.replace(/^--/, '');
      };
      visibleOptions.sort((a, b) => {
        return getSortKey(a).localeCompare(getSortKey(b));
      });
    }
    return visibleOptions;
  }

  /**
   * Get an array of the arguments if any have a description.
   *
   * @param {Command} cmd
   * @returns {Argument[]}
   */

  visibleArguments(cmd) {
    // Side effect! Apply the legacy descriptions before the arguments are displayed.
    if (cmd._argsDescription) {
      cmd._args.forEach(argument => {
        argument.description = argument.description || cmd._argsDescription[argument.name()] || '';
      });
    }

    // If there are any arguments with a description then return all the arguments.
    if (cmd._args.find(argument => argument.description)) {
      return cmd._args;
    }
    return [];
  }

  /**
   * Get the command term to show in the list of subcommands.
   *
   * @param {Command} cmd
   * @returns {string}
   */

  subcommandTerm(cmd) {
    // Legacy. Ignores custom usage string, and nested commands.
    const args = cmd._args.map(arg => humanReadableArgName(arg)).join(' ');
    return cmd._name +
      (cmd._aliases[0] ? '|' + cmd._aliases[0] : '') +
      (cmd.options.length ? ' [options]' : '') + // simplistic check for non-help option
      (args ? ' ' + args : '');
  }

  /**
   * Get the option term to show in the list of options.
   *
   * @param {Option} option
   * @returns {string}
   */

  optionTerm(option) {
    return option.flags;
  }

  /**
   * Get the argument term to show in the list of arguments.
   *
   * @param {Argument} argument
   * @returns {string}
   */

  argumentTerm(argument) {
    return argument.name();
  }

  /**
   * Get the longest command term length.
   *
   * @param {Command} cmd
   * @param {Help} helper
   * @returns {number}
   */

  longestSubcommandTermLength(cmd, helper) {
    return helper.visibleCommands(cmd).reduce((max, command) => {
      return Math.max(max, helper.subcommandTerm(command).length);
    }, 0);
  }

  /**
   * Get the longest option term length.
   *
   * @param {Command} cmd
   * @param {Help} helper
   * @returns {number}
   */

  longestOptionTermLength(cmd, helper) {
    return helper.visibleOptions(cmd).reduce((max, option) => {
      return Math.max(max, helper.optionTerm(option).length);
    }, 0);
  }

  /**
   * Get the longest argument term length.
   *
   * @param {Command} cmd
   * @param {Help} helper
   * @returns {number}
   */

  longestArgumentTermLength(cmd, helper) {
    return helper.visibleArguments(cmd).reduce((max, argument) => {
      return Math.max(max, helper.argumentTerm(argument).length);
    }, 0);
  }

  /**
   * Get the command usage to be displayed at the top of the built-in help.
   *
   * @param {Command} cmd
   * @returns {string}
   */

  commandUsage(cmd) {
    // Usage
    let cmdName = cmd._name;
    if (cmd._aliases[0]) {
      cmdName = cmdName + '|' + cmd._aliases[0];
    }
    let parentCmdNames = '';
    for (let parentCmd = cmd.parent; parentCmd; parentCmd = parentCmd.parent) {
      parentCmdNames = parentCmd.name() + ' ' + parentCmdNames;
    }
    return parentCmdNames + cmdName + ' ' + cmd.usage();
  }

  /**
   * Get the description for the command.
   *
   * @param {Command} cmd
   * @returns {string}
   */

  commandDescription(cmd) {
    // @ts-ignore: overloaded return type
    return cmd.description();
  }

  /**
   * Get the subcommand summary to show in the list of subcommands.
   * (Fallback to description for backwards compatiblity.)
   *
   * @param {Command} cmd
   * @returns {string}
   */

  subcommandDescription(cmd) {
    // @ts-ignore: overloaded return type
    return cmd.summary() || cmd.description();
  }

  /**
   * Get the option description to show in the list of options.
   *
   * @param {Option} option
   * @return {string}
   */

  optionDescription(option) {
    const extraInfo = [];

    if (option.argChoices) {
      extraInfo.push(
        // use stringify to match the display of the default value
        `choices: ${option.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`);
    }
    if (option.defaultValue !== undefined) {
      // default for boolean and negated more for programmer than end user,
      // but show true/false for boolean option as may be for hand-rolled env or config processing.
      const showDefault = option.required || option.optional ||
        (option.isBoolean() && typeof option.defaultValue === 'boolean');
      if (showDefault) {
        extraInfo.push(`default: ${option.defaultValueDescription || JSON.stringify(option.defaultValue)}`);
      }
    }
    // preset for boolean and negated are more for programmer than end user
    if (option.presetArg !== undefined && option.optional) {
      extraInfo.push(`preset: ${JSON.stringify(option.presetArg)}`);
    }
    if (option.envVar !== undefined) {
      extraInfo.push(`env: ${option.envVar}`);
    }
    if (extraInfo.length > 0) {
      return `${option.description} (${extraInfo.join(', ')})`;
    }

    return option.description;
  }

  /**
   * Get the argument description to show in the list of arguments.
   *
   * @param {Argument} argument
   * @return {string}
   */

  argumentDescription(argument) {
    const extraInfo = [];
    if (argument.argChoices) {
      extraInfo.push(
        // use stringify to match the display of the default value
        `choices: ${argument.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`);
    }
    if (argument.defaultValue !== undefined) {
      extraInfo.push(`default: ${argument.defaultValueDescription || JSON.stringify(argument.defaultValue)}`);
    }
    if (extraInfo.length > 0) {
      const extraDescripton = `(${extraInfo.join(', ')})`;
      if (argument.description) {
        return `${argument.description} ${extraDescripton}`;
      }
      return extraDescripton;
    }
    return argument.description;
  }

  /**
   * Generate the built-in help text.
   *
   * @param {Command} cmd
   * @param {Help} helper
   * @returns {string}
   */

  formatHelp(cmd, helper) {
    const termWidth = helper.padWidth(cmd, helper);
    const helpWidth = helper.helpWidth || 80;
    const itemIndentWidth = 2;
    const itemSeparatorWidth = 2; // between term and description
    function formatItem(term, description) {
      if (description) {
        const fullText = `${term.padEnd(termWidth + itemSeparatorWidth)}${description}`;
        return helper.wrap(fullText, helpWidth - itemIndentWidth, termWidth + itemSeparatorWidth);
      }
      return term;
    }
    function formatList(textArray) {
      return textArray.join('\n').replace(/^/gm, ' '.repeat(itemIndentWidth));
    }

    // Usage
    let output = [`Usage: ${helper.commandUsage(cmd)}`, ''];

    // Description
    const commandDescription = helper.commandDescription(cmd);
    if (commandDescription.length > 0) {
      output = output.concat([commandDescription, '']);
    }

    // Arguments
    const argumentList = helper.visibleArguments(cmd).map((argument) => {
      return formatItem(helper.argumentTerm(argument), helper.argumentDescription(argument));
    });
    if (argumentList.length > 0) {
      output = output.concat(['Arguments:', formatList(argumentList), '']);
    }

    // Options
    const optionList = helper.visibleOptions(cmd).map((option) => {
      return formatItem(helper.optionTerm(option), helper.optionDescription(option));
    });
    if (optionList.length > 0) {
      output = output.concat(['Options:', formatList(optionList), '']);
    }

    // Commands
    const commandList = helper.visibleCommands(cmd).map((cmd) => {
      return formatItem(helper.subcommandTerm(cmd), helper.subcommandDescription(cmd));
    });
    if (commandList.length > 0) {
      output = output.concat(['Commands:', formatList(commandList), '']);
    }

    return output.join('\n');
  }

  /**
   * Calculate the pad width from the maximum term length.
   *
   * @param {Command} cmd
   * @param {Help} helper
   * @returns {number}
   */

  padWidth(cmd, helper) {
    return Math.max(
      helper.longestOptionTermLength(cmd, helper),
      helper.longestSubcommandTermLength(cmd, helper),
      helper.longestArgumentTermLength(cmd, helper)
    );
  }

  /**
   * Wrap the given string to width characters per line, with lines after the first indented.
   * Do not wrap if insufficient room for wrapping (minColumnWidth), or string is manually formatted.
   *
   * @param {string} str
   * @param {number} width
   * @param {number} indent
   * @param {number} [minColumnWidth=40]
   * @return {string}
   *
   */

  wrap(str, width, indent, minColumnWidth = 40) {
    // Detect manually wrapped and indented strings by searching for line breaks
    // followed by multiple spaces/tabs.
    if (str.match(/[\n]\s+/)) return str;
    // Do not wrap if not enough room for a wrapped column of text (as could end up with a word per line).
    const columnWidth = width - indent;
    if (columnWidth < minColumnWidth) return str;

    const leadingStr = str.slice(0, indent);
    const columnText = str.slice(indent);

    const indentString = ' '.repeat(indent);
    const regex = new RegExp('.{1,' + (columnWidth - 1) + '}([\\s\u200B]|$)|[^\\s\u200B]+?([\\s\u200B]|$)', 'g');
    const lines = columnText.match(regex) || [];
    return leadingStr + lines.map((line, i) => {
      if (line.slice(-1) === '\n') {
        line = line.slice(0, line.length - 1);
      }
      return ((i > 0) ? indentString : '') + line.trimRight();
    }).join('\n');
  }
}

exports.Help = Help;
const { InvalidArgumentError } = require('./error.js');

// @ts-check

class Option {
  /**
   * Initialize a new `Option` with the given `flags` and `description`.
   *
   * @param {string} flags
   * @param {string} [description]
   */

  constructor(flags, description) {
    this.flags = flags;
    this.description = description || '';

    this.required = flags.includes('<'); // A value must be supplied when the option is specified.
    this.optional = flags.includes('['); // A value is optional when the option is specified.
    // variadic test ignores <value,...> et al which might be used to describe custom splitting of single argument
    this.variadic = /\w\.\.\.[>\]]$/.test(flags); // The option can take multiple values.
    this.mandatory = false; // The option must have a value after parsing, which usually means it must be specified on command line.
    const optionFlags = splitOptionFlags(flags);
    this.short = optionFlags.shortFlag;
    this.long = optionFlags.longFlag;
    this.negate = false;
    if (this.long) {
      this.negate = this.long.startsWith('--no-');
    }
    this.defaultValue = undefined;
    this.defaultValueDescription = undefined;
    this.presetArg = undefined;
    this.envVar = undefined;
    this.parseArg = undefined;
    this.hidden = false;
    this.argChoices = undefined;
    this.conflictsWith = [];
    this.implied = undefined;
  }

  /**
   * Set the default value, and optionally supply the description to be displayed in the help.
   *
   * @param {any} value
   * @param {string} [description]
   * @return {Option}
   */

  default(value, description) {
    this.defaultValue = value;
    this.defaultValueDescription = description;
    return this;
  }

  /**
   * Preset to use when option used without option-argument, especially optional but also boolean and negated.
   * The custom processing (parseArg) is called.
   *
   * @example
   * new Option('--color').default('GREYSCALE').preset('RGB');
   * new Option('--donate [amount]').preset('20').argParser(parseFloat);
   *
   * @param {any} arg
   * @return {Option}
   */

  preset(arg) {
    this.presetArg = arg;
    return this;
  }

  /**
   * Add option name(s) that conflict with this option.
   * An error will be displayed if conflicting options are found during parsing.
   *
   * @example
   * new Option('--rgb').conflicts('cmyk');
   * new Option('--js').conflicts(['ts', 'jsx']);
   *
   * @param {string | string[]} names
   * @return {Option}
   */

  conflicts(names) {
    this.conflictsWith = this.conflictsWith.concat(names);
    return this;
  }

  /**
   * Specify implied option values for when this option is set and the implied options are not.
   *
   * The custom processing (parseArg) is not called on the implied values.
   *
   * @example
   * program
   *   .addOption(new Option('--log', 'write logging information to file'))
   *   .addOption(new Option('--trace', 'log extra details').implies({ log: 'trace.txt' }));
   *
   * @param {Object} impliedOptionValues
   * @return {Option}
   */
  implies(impliedOptionValues) {
    this.implied = Object.assign(this.implied || {}, impliedOptionValues);
    return this;
  }

  /**
   * Set environment variable to check for option value.
   * Priority order of option values is default < env < cli
   *
   * @param {string} name
   * @return {Option}
   */

  env(name) {
    this.envVar = name;
    return this;
  }

  /**
   * Set the custom handler for processing CLI option arguments into option values.
   *
   * @param {Function} [fn]
   * @return {Option}
   */

  argParser(fn) {
    this.parseArg = fn;
    return this;
  }

  /**
   * Whether the option is mandatory and must have a value after parsing.
   *
   * @param {boolean} [mandatory=true]
   * @return {Option}
   */

  makeOptionMandatory(mandatory = true) {
    this.mandatory = !!mandatory;
    return this;
  }

  /**
   * Hide option in help.
   *
   * @param {boolean} [hide=true]
   * @return {Option}
   */

  hideHelp(hide = true) {
    this.hidden = !!hide;
    return this;
  }

  /**
   * @api private
   */

  _concatValue(value, previous) {
    if (previous === this.defaultValue || !Array.isArray(previous)) {
      return [value];
    }

    return previous.concat(value);
  }

  /**
   * Only allow option value to be one of choices.
   *
   * @param {string[]} values
   * @return {Option}
   */

  choices(values) {
    this.argChoices = values.slice();
    this.parseArg = (arg, previous) => {
      if (!this.argChoices.includes(arg)) {
        throw new InvalidArgumentError(`Allowed choices are ${this.argChoices.join(', ')}.`);
      }
      if (this.variadic) {
        return this._concatValue(arg, previous);
      }
      return arg;
    };
    return this;
  }

  /**
   * Return option name.
   *
   * @return {string}
   */

  name() {
    if (this.long) {
      return this.long.replace(/^--/, '');
    }
    return this.short.replace(/^-/, '');
  }

  /**
   * Return option name, in a camelcase format that can be used
   * as a object attribute key.
   *
   * @return {string}
   * @api private
   */

  attributeName() {
    return camelcase(this.name().replace(/^no-/, ''));
  }

  /**
   * Check if `arg` matches the short or long flag.
   *
   * @param {string} arg
   * @return {boolean}
   * @api private
   */

  is(arg) {
    return this.short === arg || this.long === arg;
  }

  /**
   * Return whether a boolean option.
   *
   * Options are one of boolean, negated, required argument, or optional argument.
   *
   * @return {boolean}
   * @api private
   */

  isBoolean() {
    return !this.required && !this.optional && !this.negate;
  }
}

/**
 * This class is to make it easier to work with dual options, without changing the existing
 * implementation. We support separate dual options for separate positive and negative options,
 * like `--build` and `--no-build`, which share a single option value. This works nicely for some
 * use cases, but is tricky for others where we want separate behaviours despite
 * the single shared option value.
 */
class DualOptions {
  /**
   * @param {Option[]} options
   */
  constructor(options) {
    this.positiveOptions = new Map();
    this.negativeOptions = new Map();
    this.dualOptions = new Set();
    options.forEach(option => {
      if (option.negate) {
        this.negativeOptions.set(option.attributeName(), option);
      } else {
        this.positiveOptions.set(option.attributeName(), option);
      }
    });
    this.negativeOptions.forEach((value, key) => {
      if (this.positiveOptions.has(key)) {
        this.dualOptions.add(key);
      }
    });
  }

  /**
   * Did the value come from the option, and not from possible matching dual option?
   *
   * @param {any} value
   * @param {Option} option
   * @returns {boolean}
   */
  valueFromOption(value, option) {
    const optionKey = option.attributeName();
    if (!this.dualOptions.has(optionKey)) return true;

    // Use the value to deduce if (probably) came from the option.
    const preset = this.negativeOptions.get(optionKey).presetArg;
    const negativeValue = (preset !== undefined) ? preset : false;
    return option.negate === (negativeValue === value);
  }
}

/**
 * Convert string from kebab-case to camelCase.
 *
 * @param {string} str
 * @return {string}
 * @api private
 */

function camelcase(str) {
  return str.split('-').reduce((str, word) => {
    return str + word[0].toUpperCase() + word.slice(1);
  });
}

/**
 * Split the short and long flag out of something like '-m,--mixed <value>'
 *
 * @api private
 */

function splitOptionFlags(flags) {
  let shortFlag;
  let longFlag;
  // Use original very loose parsing to maintain backwards compatibility for now,
  // which allowed for example unintended `-sw, --short-word` [sic].
  const flagParts = flags.split(/[ |,]+/);
  if (flagParts.length > 1 && !/^[[<]/.test(flagParts[1])) shortFlag = flagParts.shift();
  longFlag = flagParts.shift();
  // Add support for lone short flag without significantly changing parsing!
  if (!shortFlag && /^-[^-]$/.test(longFlag)) {
    shortFlag = longFlag;
    longFlag = undefined;
  }
  return { shortFlag, longFlag };
}

exports.Option = Option;
exports.splitOptionFlags = splitOptionFlags;
exports.DualOptions = DualOptions;
const maxDistance = 3;

function editDistance(a, b) {
  // https://en.wikipedia.org/wiki/Damerau–Levenshtein_distance
  // Calculating optimal string alignment distance, no substring is edited more than once.
  // (Simple implementation.)

  // Quick early exit, return worst case.
  if (Math.abs(a.length - b.length) > maxDistance) return Math.max(a.length, b.length);

  // distance between prefix substrings of a and b
  const d = [];

  // pure deletions turn a into empty string
  for (let i = 0; i <= a.length; i++) {
    d[i] = [i];
  }
  // pure insertions turn empty string into b
  for (let j = 0; j <= b.length; j++) {
    d[0][j] = j;
  }

  // fill matrix
  for (let j = 1; j <= b.length; j++) {
    for (let i = 1; i <= a.length; i++) {
      let cost = 1;
      if (a[i - 1] === b[j - 1]) {
        cost = 0;
      } else {
        cost = 1;
      }
      d[i][j] = Math.min(
        d[i - 1][j] + 1, // deletion
        d[i][j - 1] + 1, // insertion
        d[i - 1][j - 1] + cost // substitution
      );
      // transposition
      if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) {
        d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + 1);
      }
    }
  }

  return d[a.length][b.length];
}

/**
 * Find close matches, restricted to same number of edits.
 *
 * @param {string} word
 * @param {string[]} candidates
 * @returns {string}
 */

function suggestSimilar(word, candidates) {
  if (!candidates || candidates.length === 0) return '';
  // remove possible duplicates
  candidates = Array.from(new Set(candidates));

  const searchingOptions = word.startsWith('--');
  if (searchingOptions) {
    word = word.slice(2);
    candidates = candidates.map(candidate => candidate.slice(2));
  }

  let similar = [];
  let bestDistance = maxDistance;
  const minSimilarity = 0.4;
  candidates.forEach((candidate) => {
    if (candidate.length <= 1) return; // no one character guesses

    const distance = editDistance(word, candidate);
    const length = Math.max(word.length, candidate.length);
    const similarity = (length - distance) / length;
    if (similarity > minSimilarity) {
      if (distance < bestDistance) {
        // better edit distance, throw away previous worse matches
        bestDistance = distance;
        similar = [candidate];
      } else if (distance === bestDistance) {
        similar.push(candidate);
      }
    }
  });

  similar.sort((a, b) => a.localeCompare(b));
  if (searchingOptions) {
    similar = similar.map(candidate => `--${candidate}`);
  }

  if (similar.length > 1) {
    return `\n(Did you mean one of ${similar.join(', ')}?)`;
  }
  if (similar.length === 1) {
    return `\n(Did you mean ${similar[0]}?)`;
  }
  return '';
}

exports.suggestSimilar = suggestSimilar;
"use strict";

var punycode = require("punycode");
var mappingTable = require("./lib/mappingTable.json");

var PROCESSING_OPTIONS = {
  TRANSITIONAL: 0,
  NONTRANSITIONAL: 1
};

function normalize(str) { // fix bug in v8
  return str.split('\u0000').map(function (s) { return s.normalize('NFC'); }).join('\u0000');
}

function findStatus(val) {
  var start = 0;
  var end = mappingTable.length - 1;

  while (start <= end) {
    var mid = Math.floor((start + end) / 2);

    var target = mappingTable[mid];
    if (target[0][0] <= val && target[0][1] >= val) {
      return target;
    } else if (target[0][0] > val) {
      end = mid - 1;
    } else {
      start = mid + 1;
    }
  }

  return null;
}

var regexAstralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;

function countSymbols(string) {
  return string
    // replace every surrogate pair with a BMP symbol
    .replace(regexAstralSymbols, '_')
    // then get the length
    .length;
}

function mapChars(domain_name, useSTD3, processing_option) {
  var hasError = false;
  var processed = "";

  var len = countSymbols(domain_name);
  for (var i = 0; i < len; ++i) {
    var codePoint = domain_name.codePointAt(i);
    var status = findStatus(codePoint);

    switch (status[1]) {
      case "disallowed":
        hasError = true;
        processed += String.fromCodePoint(codePoint);
        break;
      case "ignored":
        break;
      case "mapped":
        processed += String.fromCodePoint.apply(String, status[2]);
        break;
      case "deviation":
        if (processing_option === PROCESSING_OPTIONS.TRANSITIONAL) {
          processed += String.fromCodePoint.apply(String, status[2]);
        } else {
          processed += String.fromCodePoint(codePoint);
        }
        break;
      case "valid":
        processed += String.fromCodePoint(codePoint);
        break;
      case "disallowed_STD3_mapped":
        if (useSTD3) {
          hasError = true;
          processed += String.fromCodePoint(codePoint);
        } else {
          processed += String.fromCodePoint.apply(String, status[2]);
        }
        break;
      case "disallowed_STD3_valid":
        if (useSTD3) {
          hasError = true;
        }

        processed += String.fromCodePoint(codePoint);
        break;
    }
  }

  return {
    string: processed,
    error: hasError
  };
}

var combiningMarksRegex = /[\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08E4-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D01-\u0D03\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u18A9\u1920-\u192B\u1930-\u193B\u19B0-\u19C0\u19C8\u19C9\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFC-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C4\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2D]|\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD804[\uDC00-\uDC02\uDC38-\uDC46\uDC7F-\uDC82\uDCB0-\uDCBA\uDD00-\uDD02\uDD27-\uDD34\uDD73\uDD80-\uDD82\uDDB3-\uDDC0\uDE2C-\uDE37\uDEDF-\uDEEA\uDF01-\uDF03\uDF3C\uDF3E-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDCB0-\uDCC3\uDDAF-\uDDB5\uDDB8-\uDDC0\uDE30-\uDE40\uDEAB-\uDEB7]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF51-\uDF7E\uDF8F-\uDF92]|\uD82F[\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD83A[\uDCD0-\uDCD6]|\uDB40[\uDD00-\uDDEF]/;

function validateLabel(label, processing_option) {
  if (label.substr(0, 4) === "xn--") {
    label = punycode.toUnicode(label);
    processing_option = PROCESSING_OPTIONS.NONTRANSITIONAL;
  }

  var error = false;

  if (normalize(label) !== label ||
      (label[3] === "-" && label[4] === "-") ||
      label[0] === "-" || label[label.length - 1] === "-" ||
      label.indexOf(".") !== -1 ||
      label.search(combiningMarksRegex) === 0) {
    error = true;
  }

  var len = countSymbols(label);
  for (var i = 0; i < len; ++i) {
    var status = findStatus(label.codePointAt(i));
    if ((processing === PROCESSING_OPTIONS.TRANSITIONAL && status[1] !== "valid") ||
        (processing === PROCESSING_OPTIONS.NONTRANSITIONAL &&
         status[1] !== "valid" && status[1] !== "deviation")) {
      error = true;
      break;
    }
  }

  return {
    label: label,
    error: error
  };
}

function processing(domain_name, useSTD3, processing_option) {
  var result = mapChars(domain_name, useSTD3, processing_option);
  result.string = normalize(result.string);

  var labels = result.string.split(".");
  for (var i = 0; i < labels.length; ++i) {
    try {
      var validation = validateLabel(labels[i]);
      labels[i] = validation.label;
      result.error = result.error || validation.error;
    } catch(e) {
      result.error = true;
    }
  }

  return {
    string: labels.join("."),
    error: result.error
  };
}

module.exports.toASCII = function(domain_name, useSTD3, processing_option, verifyDnsLength) {
  var result = processing(domain_name, useSTD3, processing_option);
  var labels = result.string.split(".");
  labels = labels.map(function(l) {
    try {
      return punycode.toASCII(l);
    } catch(e) {
      result.error = true;
      return l;
    }
  });

  if (verifyDnsLength) {
    var total = labels.slice(0, labels.length - 1).join(".").length;
    if (total.length > 253 || total.length === 0) {
      result.error = true;
    }

    for (var i=0; i < labels.length; ++i) {
      if (labels.length > 63 || labels.length === 0) {
        result.error = true;
        break;
      }
    }
  }

  if (result.error) return null;
  return labels.join(".");
};

module.exports.toUnicode = function(domain_name, useSTD3) {
  var result = processing(domain_name, useSTD3, PROCESSING_OPTIONS.NONTRANSITIONAL);

  return {
    domain: result.string,
    error: result.error
  };
};

module.exports.PROCESSING_OPTIONS = PROCESSING_OPTIONS;
{
  "name": "tr46",
  "version": "0.0.3",
  "description": "An implementation of the Unicode TR46 spec",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/Sebmaster/tr46.js.git"
  },
  "author": "Sebastian Mayr <npm@smayr.name>",
  "license": "MIT",
  "homepage": "https://github.com/Sebmaster/tr46.js#readme",
  "devDependencies": {
    "mocha": "^2.2.5",
    "request": "^2.57.0"
  }
}[[[0,44],"disallowed_STD3_valid"],[[45,46],"valid"],[[47,47],"disallowed_STD3_valid"],[[48,57],"valid"],[[58,64],"disallowed_STD3_valid"],[[65,65],"mapped",[97]],[[66,66],"mapped",[98]],[[67,67],"mapped",[99]],[[68,68],"mapped",[100]],[[69,69],"mapped",[101]],[[70,70],"mapped",[102]],[[71,71],"mapped",[103]],[[72,72],"mapped",[104]],[[73,73],"mapped",[105]],[[74,74],"mapped",[106]],[[75,75],"mapped",[107]],[[76,76],"mapped",[108]],[[77,77],"mapped",[109]],[[78,78],"mapped",[110]],[[79,79],"mapped",[111]],[[80,80],"mapped",[112]],[[81,81],"mapped",[113]],[[82,82],"mapped",[114]],[[83,83],"mapped",[115]],[[84,84],"mapped",[116]],[[85,85],"mapped",[117]],[[86,86],"mapped",[118]],[[87,87],"mapped",[119]],[[88,88],"mapped",[120]],[[89,89],"mapped",[121]],[[90,90],"mapped",[122]],[[91,96],"disallowed_STD3_valid"],[[97,122],"valid"],[[123,127],"disallowed_STD3_valid"],[[128,159],"disallowed"],[[160,160],"disallowed_STD3_mapped",[32]],[[161,167],"valid",[],"NV8"],[[168,168],"disallowed_STD3_mapped",[32,776]],[[169,169],"valid",[],"NV8"],[[170,170],"mapped",[97]],[[171,172],"valid",[],"NV8"],[[173,173],"ignored"],[[174,174],"valid",[],"NV8"],[[175,175],"disallowed_STD3_mapped",[32,772]],[[176,177],"valid",[],"NV8"],[[178,178],"mapped",[50]],[[179,179],"mapped",[51]],[[180,180],"disallowed_STD3_mapped",[32,769]],[[181,181],"mapped",[956]],[[182,182],"valid",[],"NV8"],[[183,183],"valid"],[[184,184],"disallowed_STD3_mapped",[32,807]],[[185,185],"mapped",[49]],[[186,186],"mapped",[111]],[[187,187],"valid",[],"NV8"],[[188,188],"mapped",[49,8260,52]],[[189,189],"mapped",[49,8260,50]],[[190,190],"mapped",[51,8260,52]],[[191,191],"valid",[],"NV8"],[[192,192],"mapped",[224]],[[193,193],"mapped",[225]],[[194,194],"mapped",[226]],[[195,195],"mapped",[227]],[[196,196],"mapped",[228]],[[197,197],"mapped",[229]],[[198,198],"mapped",[230]],[[199,199],"mapped",[231]],[[200,200],"mapped",[232]],[[201,201],"mapped",[233]],[[202,202],"mapped",[234]],[[203,203],"mapped",[235]],[[204,204],"mapped",[236]],[[205,205],"mapped",[237]],[[206,206],"mapped",[238]],[[207,207],"mapped",[239]],[[208,208],"mapped",[240]],[[209,209],"mapped",[241]],[[210,210],"mapped",[242]],[[211,211],"mapped",[243]],[[212,212],"mapped",[244]],[[213,213],"mapped",[245]],[[214,214],"mapped",[246]],[[215,215],"valid",[],"NV8"],[[216,216],"mapped",[248]],[[217,217],"mapped",[249]],[[218,218],"mapped",[250]],[[219,219],"mapped",[251]],[[220,220],"mapped",[252]],[[221,221],"mapped",[253]],[[222,222],"mapped",[254]],[[223,223],"deviation",[115,115]],[[224,246],"valid"],[[247,247],"valid",[],"NV8"],[[248,255],"valid"],[[256,256],"mapped",[257]],[[257,257],"valid"],[[258,258],"mapped",[259]],[[259,259],"valid"],[[260,260],"mapped",[261]],[[261,261],"valid"],[[262,262],"mapped",[263]],[[263,263],"valid"],[[264,264],"mapped",[265]],[[265,265],"valid"],[[266,266],"mapped",[267]],[[267,267],"valid"],[[268,268],"mapped",[269]],[[269,269],"valid"],[[270,270],"mapped",[271]],[[271,271],"valid"],[[272,272],"mapped",[273]],[[273,273],"valid"],[[274,274],"mapped",[275]],[[275,275],"valid"],[[276,276],"mapped",[277]],[[277,277],"valid"],[[278,278],"mapped",[279]],[[279,279],"valid"],[[280,280],"mapped",[281]],[[281,281],"valid"],[[282,282],"mapped",[283]],[[283,283],"valid"],[[284,284],"mapped",[285]],[[285,285],"valid"],[[286,286],"mapped",[287]],[[287,287],"valid"],[[288,288],"mapped",[289]],[[289,289],"valid"],[[290,290],"mapped",[291]],[[291,291],"valid"],[[292,292],"mapped",[293]],[[293,293],"valid"],[[294,294],"mapped",[295]],[[295,295],"valid"],[[296,296],"mapped",[297]],[[297,297],"valid"],[[298,298],"mapped",[299]],[[299,299],"valid"],[[300,300],"mapped",[301]],[[301,301],"valid"],[[302,302],"mapped",[303]],[[303,303],"valid"],[[304,304],"mapped",[105,775]],[[305,305],"valid"],[[306,307],"mapped",[105,106]],[[308,308],"mapped",[309]],[[309,309],"valid"],[[310,310],"mapped",[311]],[[311,312],"valid"],[[313,313],"mapped",[314]],[[314,314],"valid"],[[315,315],"mapped",[316]],[[316,316],"valid"],[[317,317],"mapped",[318]],[[318,318],"valid"],[[319,320],"mapped",[108,183]],[[321,321],"mapped",[322]],[[322,322],"valid"],[[323,323],"mapped",[324]],[[324,324],"valid"],[[325,325],"mapped",[326]],[[326,326],"valid"],[[327,327],"mapped",[328]],[[328,328],"valid"],[[329,329],"mapped",[700,110]],[[330,330],"mapped",[331]],[[331,331],"valid"],[[332,332],"mapped",[333]],[[333,333],"valid"],[[334,334],"mapped",[335]],[[335,335],"valid"],[[336,336],"mapped",[337]],[[337,337],"valid"],[[338,338],"mapped",[339]],[[339,339],"valid"],[[340,340],"mapped",[341]],[[341,341],"valid"],[[342,342],"mapped",[343]],[[343,343],"valid"],[[344,344],"mapped",[345]],[[345,345],"valid"],[[346,346],"mapped",[347]],[[347,347],"valid"],[[348,348],"mapped",[349]],[[349,349],"valid"],[[350,350],"mapped",[351]],[[351,351],"valid"],[[352,352],"mapped",[353]],[[353,353],"valid"],[[354,354],"mapped",[355]],[[355,355],"valid"],[[356,356],"mapped",[357]],[[357,357],"valid"],[[358,358],"mapped",[359]],[[359,359],"valid"],[[360,360],"mapped",[361]],[[361,361],"valid"],[[362,362],"mapped",[363]],[[363,363],"valid"],[[364,364],"mapped",[365]],[[365,365],"valid"],[[366,366],"mapped",[367]],[[367,367],"valid"],[[368,368],"mapped",[369]],[[369,369],"valid"],[[370,370],"mapped",[371]],[[371,371],"valid"],[[372,372],"mapped",[373]],[[373,373],"valid"],[[374,374],"mapped",[375]],[[375,375],"valid"],[[376,376],"mapped",[255]],[[377,377],"mapped",[378]],[[378,378],"valid"],[[379,379],"mapped",[380]],[[380,380],"valid"],[[381,381],"mapped",[382]],[[382,382],"valid"],[[383,383],"mapped",[115]],[[384,384],"valid"],[[385,385],"mapped",[595]],[[386,386],"mapped",[387]],[[387,387],"valid"],[[388,388],"mapped",[389]],[[389,389],"valid"],[[390,390],"mapped",[596]],[[391,391],"mapped",[392]],[[392,392],"valid"],[[393,393],"mapped",[598]],[[394,394],"mapped",[599]],[[395,395],"mapped",[396]],[[396,397],"valid"],[[398,398],"mapped",[477]],[[399,399],"mapped",[601]],[[400,400],"mapped",[603]],[[401,401],"mapped",[402]],[[402,402],"valid"],[[403,403],"mapped",[608]],[[404,404],"mapped",[611]],[[405,405],"valid"],[[406,406],"mapped",[617]],[[407,407],"mapped",[616]],[[408,408],"mapped",[409]],[[409,411],"valid"],[[412,412],"mapped",[623]],[[413,413],"mapped",[626]],[[414,414],"valid"],[[415,415],"mapped",[629]],[[416,416],"mapped",[417]],[[417,417],"valid"],[[418,418],"mapped",[419]],[[419,419],"valid"],[[420,420],"mapped",[421]],[[421,421],"valid"],[[422,422],"mapped",[640]],[[423,423],"mapped",[424]],[[424,424],"valid"],[[425,425],"mapped",[643]],[[426,427],"valid"],[[428,428],"mapped",[429]],[[429,429],"valid"],[[430,430],"mapped",[648]],[[431,431],"mapped",[432]],[[432,432],"valid"],[[433,433],"mapped",[650]],[[434,434],"mapped",[651]],[[435,435],"mapped",[436]],[[436,436],"valid"],[[437,437],"mapped",[438]],[[438,438],"valid"],[[439,439],"mapped",[658]],[[440,440],"mapped",[441]],[[441,443],"valid"],[[444,444],"mapped",[445]],[[445,451],"valid"],[[452,454],"mapped",[100,382]],[[455,457],"mapped",[108,106]],[[458,460],"mapped",[110,106]],[[461,461],"mapped",[462]],[[462,462],"valid"],[[463,463],"mapped",[464]],[[464,464],"valid"],[[465,465],"mapped",[466]],[[466,466],"valid"],[[467,467],"mapped",[468]],[[468,468],"valid"],[[469,469],"mapped",[470]],[[470,470],"valid"],[[471,471],"mapped",[472]],[[472,472],"valid"],[[473,473],"mapped",[474]],[[474,474],"valid"],[[475,475],"mapped",[476]],[[476,477],"valid"],[[478,478],"mapped",[479]],[[479,479],"valid"],[[480,480],"mapped",[481]],[[481,481],"valid"],[[482,482],"mapped",[483]],[[483,483],"valid"],[[484,484],"mapped",[485]],[[485,485],"valid"],[[486,486],"mapped",[487]],[[487,487],"valid"],[[488,488],"mapped",[489]],[[489,489],"valid"],[[490,490],"mapped",[491]],[[491,491],"valid"],[[492,492],"mapped",[493]],[[493,493],"valid"],[[494,494],"mapped",[495]],[[495,496],"valid"],[[497,499],"mapped",[100,122]],[[500,500],"mapped",[501]],[[501,501],"valid"],[[502,502],"mapped",[405]],[[503,503],"mapped",[447]],[[504,504],"mapped",[505]],[[505,505],"valid"],[[506,506],"mapped",[507]],[[507,507],"valid"],[[508,508],"mapped",[509]],[[509,509],"valid"],[[510,510],"mapped",[511]],[[511,511],"valid"],[[512,512],"mapped",[513]],[[513,513],"valid"],[[514,514],"mapped",[515]],[[515,515],"valid"],[[516,516],"mapped",[517]],[[517,517],"valid"],[[518,518],"mapped",[519]],[[519,519],"valid"],[[520,520],"mapped",[521]],[[521,521],"valid"],[[522,522],"mapped",[523]],[[523,523],"valid"],[[524,524],"mapped",[525]],[[525,525],"valid"],[[526,526],"mapped",[527]],[[527,527],"valid"],[[528,528],"mapped",[529]],[[529,529],"valid"],[[530,530],"mapped",[531]],[[531,531],"valid"],[[532,532],"mapped",[533]],[[533,533],"valid"],[[534,534],"mapped",[535]],[[535,535],"valid"],[[536,536],"mapped",[537]],[[537,537],"valid"],[[538,538],"mapped",[539]],[[539,539],"valid"],[[540,540],"mapped",[541]],[[541,541],"valid"],[[542,542],"mapped",[543]],[[543,543],"valid"],[[544,544],"mapped",[414]],[[545,545],"valid"],[[546,546],"mapped",[547]],[[547,547],"valid"],[[548,548],"mapped",[549]],[[549,549],"valid"],[[550,550],"mapped",[551]],[[551,551],"valid"],[[552,552],"mapped",[553]],[[553,553],"valid"],[[554,554],"mapped",[555]],[[555,555],"valid"],[[556,556],"mapped",[557]],[[557,557],"valid"],[[558,558],"mapped",[559]],[[559,559],"valid"],[[560,560],"mapped",[561]],[[561,561],"valid"],[[562,562],"mapped",[563]],[[563,563],"valid"],[[564,566],"valid"],[[567,569],"valid"],[[570,570],"mapped",[11365]],[[571,571],"mapped",[572]],[[572,572],"valid"],[[573,573],"mapped",[410]],[[574,574],"mapped",[11366]],[[575,576],"valid"],[[577,577],"mapped",[578]],[[578,578],"valid"],[[579,579],"mapped",[384]],[[580,580],"mapped",[649]],[[581,581],"mapped",[652]],[[582,582],"mapped",[583]],[[583,583],"valid"],[[584,584],"mapped",[585]],[[585,585],"valid"],[[586,586],"mapped",[587]],[[587,587],"valid"],[[588,588],"mapped",[589]],[[589,589],"valid"],[[590,590],"mapped",[591]],[[591,591],"valid"],[[592,680],"valid"],[[681,685],"valid"],[[686,687],"valid"],[[688,688],"mapped",[104]],[[689,689],"mapped",[614]],[[690,690],"mapped",[106]],[[691,691],"mapped",[114]],[[692,692],"mapped",[633]],[[693,693],"mapped",[635]],[[694,694],"mapped",[641]],[[695,695],"mapped",[119]],[[696,696],"mapped",[121]],[[697,705],"valid"],[[706,709],"valid",[],"NV8"],[[710,721],"valid"],[[722,727],"valid",[],"NV8"],[[728,728],"disallowed_STD3_mapped",[32,774]],[[729,729],"disallowed_STD3_mapped",[32,775]],[[730,730],"disallowed_STD3_mapped",[32,778]],[[731,731],"disallowed_STD3_mapped",[32,808]],[[732,732],"disallowed_STD3_mapped",[32,771]],[[733,733],"disallowed_STD3_mapped",[32,779]],[[734,734],"valid",[],"NV8"],[[735,735],"valid",[],"NV8"],[[736,736],"mapped",[611]],[[737,737],"mapped",[108]],[[738,738],"mapped",[115]],[[739,739],"mapped",[120]],[[740,740],"mapped",[661]],[[741,745],"valid",[],"NV8"],[[746,747],"valid",[],"NV8"],[[748,748],"valid"],[[749,749],"valid",[],"NV8"],[[750,750],"valid"],[[751,767],"valid",[],"NV8"],[[768,831],"valid"],[[832,832],"mapped",[768]],[[833,833],"mapped",[769]],[[834,834],"valid"],[[835,835],"mapped",[787]],[[836,836],"mapped",[776,769]],[[837,837],"mapped",[953]],[[838,846],"valid"],[[847,847],"ignored"],[[848,855],"valid"],[[856,860],"valid"],[[861,863],"valid"],[[864,865],"valid"],[[866,866],"valid"],[[867,879],"valid"],[[880,880],"mapped",[881]],[[881,881],"valid"],[[882,882],"mapped",[883]],[[883,883],"valid"],[[884,884],"mapped",[697]],[[885,885],"valid"],[[886,886],"mapped",[887]],[[887,887],"valid"],[[888,889],"disallowed"],[[890,890],"disallowed_STD3_mapped",[32,953]],[[891,893],"valid"],[[894,894],"disallowed_STD3_mapped",[59]],[[895,895],"mapped",[1011]],[[896,899],"disallowed"],[[900,900],"disallowed_STD3_mapped",[32,769]],[[901,901],"disallowed_STD3_mapped",[32,776,769]],[[902,902],"mapped",[940]],[[903,903],"mapped",[183]],[[904,904],"mapped",[941]],[[905,905],"mapped",[942]],[[906,906],"mapped",[943]],[[907,907],"disallowed"],[[908,908],"mapped",[972]],[[909,909],"disallowed"],[[910,910],"mapped",[973]],[[911,911],"mapped",[974]],[[912,912],"valid"],[[913,913],"mapped",[945]],[[914,914],"mapped",[946]],[[915,915],"mapped",[947]],[[916,916],"mapped",[948]],[[917,917],"mapped",[949]],[[918,918],"mapped",[950]],[[919,919],"mapped",[951]],[[920,920],"mapped",[952]],[[921,921],"mapped",[953]],[[922,922],"mapped",[954]],[[923,923],"mapped",[955]],[[924,924],"mapped",[956]],[[925,925],"mapped",[957]],[[926,926],"mapped",[958]],[[927,927],"mapped",[959]],[[928,928],"mapped",[960]],[[929,929],"mapped",[961]],[[930,930],"disallowed"],[[931,931],"mapped",[963]],[[932,932],"mapped",[964]],[[933,933],"mapped",[965]],[[934,934],"mapped",[966]],[[935,935],"mapped",[967]],[[936,936],"mapped",[968]],[[937,937],"mapped",[969]],[[938,938],"mapped",[970]],[[939,939],"mapped",[971]],[[940,961],"valid"],[[962,962],"deviation",[963]],[[963,974],"valid"],[[975,975],"mapped",[983]],[[976,976],"mapped",[946]],[[977,977],"mapped",[952]],[[978,978],"mapped",[965]],[[979,979],"mapped",[973]],[[980,980],"mapped",[971]],[[981,981],"mapped",[966]],[[982,982],"mapped",[960]],[[983,983],"valid"],[[984,984],"mapped",[985]],[[985,985],"valid"],[[986,986],"mapped",[987]],[[987,987],"valid"],[[988,988],"mapped",[989]],[[989,989],"valid"],[[990,990],"mapped",[991]],[[991,991],"valid"],[[992,992],"mapped",[993]],[[993,993],"valid"],[[994,994],"mapped",[995]],[[995,995],"valid"],[[996,996],"mapped",[997]],[[997,997],"valid"],[[998,998],"mapped",[999]],[[999,999],"valid"],[[1000,1000],"mapped",[1001]],[[1001,1001],"valid"],[[1002,1002],"mapped",[1003]],[[1003,1003],"valid"],[[1004,1004],"mapped",[1005]],[[1005,1005],"valid"],[[1006,1006],"mapped",[1007]],[[1007,1007],"valid"],[[1008,1008],"mapped",[954]],[[1009,1009],"mapped",[961]],[[1010,1010],"mapped",[963]],[[1011,1011],"valid"],[[1012,1012],"mapped",[952]],[[1013,1013],"mapped",[949]],[[1014,1014],"valid",[],"NV8"],[[1015,1015],"mapped",[1016]],[[1016,1016],"valid"],[[1017,1017],"mapped",[963]],[[1018,1018],"mapped",[1019]],[[1019,1019],"valid"],[[1020,1020],"valid"],[[1021,1021],"mapped",[891]],[[1022,1022],"mapped",[892]],[[1023,1023],"mapped",[893]],[[1024,1024],"mapped",[1104]],[[1025,1025],"mapped",[1105]],[[1026,1026],"mapped",[1106]],[[1027,1027],"mapped",[1107]],[[1028,1028],"mapped",[1108]],[[1029,1029],"mapped",[1109]],[[1030,1030],"mapped",[1110]],[[1031,1031],"mapped",[1111]],[[1032,1032],"mapped",[1112]],[[1033,1033],"mapped",[1113]],[[1034,1034],"mapped",[1114]],[[1035,1035],"mapped",[1115]],[[1036,1036],"mapped",[1116]],[[1037,1037],"mapped",[1117]],[[1038,1038],"mapped",[1118]],[[1039,1039],"mapped",[1119]],[[1040,1040],"mapped",[1072]],[[1041,1041],"mapped",[1073]],[[1042,1042],"mapped",[1074]],[[1043,1043],"mapped",[1075]],[[1044,1044],"mapped",[1076]],[[1045,1045],"mapped",[1077]],[[1046,1046],"mapped",[1078]],[[1047,1047],"mapped",[1079]],[[1048,1048],"mapped",[1080]],[[1049,1049],"mapped",[1081]],[[1050,1050],"mapped",[1082]],[[1051,1051],"mapped",[1083]],[[1052,1052],"mapped",[1084]],[[1053,1053],"mapped",[1085]],[[1054,1054],"mapped",[1086]],[[1055,1055],"mapped",[1087]],[[1056,1056],"mapped",[1088]],[[1057,1057],"mapped",[1089]],[[1058,1058],"mapped",[1090]],[[1059,1059],"mapped",[1091]],[[1060,1060],"mapped",[1092]],[[1061,1061],"mapped",[1093]],[[1062,1062],"mapped",[1094]],[[1063,1063],"mapped",[1095]],[[1064,1064],"mapped",[1096]],[[1065,1065],"mapped",[1097]],[[1066,1066],"mapped",[1098]],[[1067,1067],"mapped",[1099]],[[1068,1068],"mapped",[1100]],[[1069,1069],"mapped",[1101]],[[1070,1070],"mapped",[1102]],[[1071,1071],"mapped",[1103]],[[1072,1103],"valid"],[[1104,1104],"valid"],[[1105,1116],"valid"],[[1117,1117],"valid"],[[1118,1119],"valid"],[[1120,1120],"mapped",[1121]],[[1121,1121],"valid"],[[1122,1122],"mapped",[1123]],[[1123,1123],"valid"],[[1124,1124],"mapped",[1125]],[[1125,1125],"valid"],[[1126,1126],"mapped",[1127]],[[1127,1127],"valid"],[[1128,1128],"mapped",[1129]],[[1129,1129],"valid"],[[1130,1130],"mapped",[1131]],[[1131,1131],"valid"],[[1132,1132],"mapped",[1133]],[[1133,1133],"valid"],[[1134,1134],"mapped",[1135]],[[1135,1135],"valid"],[[1136,1136],"mapped",[1137]],[[1137,1137],"valid"],[[1138,1138],"mapped",[1139]],[[1139,1139],"valid"],[[1140,1140],"mapped",[1141]],[[1141,1141],"valid"],[[1142,1142],"mapped",[1143]],[[1143,1143],"valid"],[[1144,1144],"mapped",[1145]],[[1145,1145],"valid"],[[1146,1146],"mapped",[1147]],[[1147,1147],"valid"],[[1148,1148],"mapped",[1149]],[[1149,1149],"valid"],[[1150,1150],"mapped",[1151]],[[1151,1151],"valid"],[[1152,1152],"mapped",[1153]],[[1153,1153],"valid"],[[1154,1154],"valid",[],"NV8"],[[1155,1158],"valid"],[[1159,1159],"valid"],[[1160,1161],"valid",[],"NV8"],[[1162,1162],"mapped",[1163]],[[1163,1163],"valid"],[[1164,1164],"mapped",[1165]],[[1165,1165],"valid"],[[1166,1166],"mapped",[1167]],[[1167,1167],"valid"],[[1168,1168],"mapped",[1169]],[[1169,1169],"valid"],[[1170,1170],"mapped",[1171]],[[1171,1171],"valid"],[[1172,1172],"mapped",[1173]],[[1173,1173],"valid"],[[1174,1174],"mapped",[1175]],[[1175,1175],"valid"],[[1176,1176],"mapped",[1177]],[[1177,1177],"valid"],[[1178,1178],"mapped",[1179]],[[1179,1179],"valid"],[[1180,1180],"mapped",[1181]],[[1181,1181],"valid"],[[1182,1182],"mapped",[1183]],[[1183,1183],"valid"],[[1184,1184],"mapped",[1185]],[[1185,1185],"valid"],[[1186,1186],"mapped",[1187]],[[1187,1187],"valid"],[[1188,1188],"mapped",[1189]],[[1189,1189],"valid"],[[1190,1190],"mapped",[1191]],[[1191,1191],"valid"],[[1192,1192],"mapped",[1193]],[[1193,1193],"valid"],[[1194,1194],"mapped",[1195]],[[1195,1195],"valid"],[[1196,1196],"mapped",[1197]],[[1197,1197],"valid"],[[1198,1198],"mapped",[1199]],[[1199,1199],"valid"],[[1200,1200],"mapped",[1201]],[[1201,1201],"valid"],[[1202,1202],"mapped",[1203]],[[1203,1203],"valid"],[[1204,1204],"mapped",[1205]],[[1205,1205],"valid"],[[1206,1206],"mapped",[1207]],[[1207,1207],"valid"],[[1208,1208],"mapped",[1209]],[[1209,1209],"valid"],[[1210,1210],"mapped",[1211]],[[1211,1211],"valid"],[[1212,1212],"mapped",[1213]],[[1213,1213],"valid"],[[1214,1214],"mapped",[1215]],[[1215,1215],"valid"],[[1216,1216],"disallowed"],[[1217,1217],"mapped",[1218]],[[1218,1218],"valid"],[[1219,1219],"mapped",[1220]],[[1220,1220],"valid"],[[1221,1221],"mapped",[1222]],[[1222,1222],"valid"],[[1223,1223],"mapped",[1224]],[[1224,1224],"valid"],[[1225,1225],"mapped",[1226]],[[1226,1226],"valid"],[[1227,1227],"mapped",[1228]],[[1228,1228],"valid"],[[1229,1229],"mapped",[1230]],[[1230,1230],"valid"],[[1231,1231],"valid"],[[1232,1232],"mapped",[1233]],[[1233,1233],"valid"],[[1234,1234],"mapped",[1235]],[[1235,1235],"valid"],[[1236,1236],"mapped",[1237]],[[1237,1237],"valid"],[[1238,1238],"mapped",[1239]],[[1239,1239],"valid"],[[1240,1240],"mapped",[1241]],[[1241,1241],"valid"],[[1242,1242],"mapped",[1243]],[[1243,1243],"valid"],[[1244,1244],"mapped",[1245]],[[1245,1245],"valid"],[[1246,1246],"mapped",[1247]],[[1247,1247],"valid"],[[1248,1248],"mapped",[1249]],[[1249,1249],"valid"],[[1250,1250],"mapped",[1251]],[[1251,1251],"valid"],[[1252,1252],"mapped",[1253]],[[1253,1253],"valid"],[[1254,1254],"mapped",[1255]],[[1255,1255],"valid"],[[1256,1256],"mapped",[1257]],[[1257,1257],"valid"],[[1258,1258],"mapped",[1259]],[[1259,1259],"valid"],[[1260,1260],"mapped",[1261]],[[1261,1261],"valid"],[[1262,1262],"mapped",[1263]],[[1263,1263],"valid"],[[1264,1264],"mapped",[1265]],[[1265,1265],"valid"],[[1266,1266],"mapped",[1267]],[[1267,1267],"valid"],[[1268,1268],"mapped",[1269]],[[1269,1269],"valid"],[[1270,1270],"mapped",[1271]],[[1271,1271],"valid"],[[1272,1272],"mapped",[1273]],[[1273,1273],"valid"],[[1274,1274],"mapped",[1275]],[[1275,1275],"valid"],[[1276,1276],"mapped",[1277]],[[1277,1277],"valid"],[[1278,1278],"mapped",[1279]],[[1279,1279],"valid"],[[1280,1280],"mapped",[1281]],[[1281,1281],"valid"],[[1282,1282],"mapped",[1283]],[[1283,1283],"valid"],[[1284,1284],"mapped",[1285]],[[1285,1285],"valid"],[[1286,1286],"mapped",[1287]],[[1287,1287],"valid"],[[1288,1288],"mapped",[1289]],[[1289,1289],"valid"],[[1290,1290],"mapped",[1291]],[[1291,1291],"valid"],[[1292,1292],"mapped",[1293]],[[1293,1293],"valid"],[[1294,1294],"mapped",[1295]],[[1295,1295],"valid"],[[1296,1296],"mapped",[1297]],[[1297,1297],"valid"],[[1298,1298],"mapped",[1299]],[[1299,1299],"valid"],[[1300,1300],"mapped",[1301]],[[1301,1301],"valid"],[[1302,1302],"mapped",[1303]],[[1303,1303],"valid"],[[1304,1304],"mapped",[1305]],[[1305,1305],"valid"],[[1306,1306],"mapped",[1307]],[[1307,1307],"valid"],[[1308,1308],"mapped",[1309]],[[1309,1309],"valid"],[[1310,1310],"mapped",[1311]],[[1311,1311],"valid"],[[1312,1312],"mapped",[1313]],[[1313,1313],"valid"],[[1314,1314],"mapped",[1315]],[[1315,1315],"valid"],[[1316,1316],"mapped",[1317]],[[1317,1317],"valid"],[[1318,1318],"mapped",[1319]],[[1319,1319],"valid"],[[1320,1320],"mapped",[1321]],[[1321,1321],"valid"],[[1322,1322],"mapped",[1323]],[[1323,1323],"valid"],[[1324,1324],"mapped",[1325]],[[1325,1325],"valid"],[[1326,1326],"mapped",[1327]],[[1327,1327],"valid"],[[1328,1328],"disallowed"],[[1329,1329],"mapped",[1377]],[[1330,1330],"mapped",[1378]],[[1331,1331],"mapped",[1379]],[[1332,1332],"mapped",[1380]],[[1333,1333],"mapped",[1381]],[[1334,1334],"mapped",[1382]],[[1335,1335],"mapped",[1383]],[[1336,1336],"mapped",[1384]],[[1337,1337],"mapped",[1385]],[[1338,1338],"mapped",[1386]],[[1339,1339],"mapped",[1387]],[[1340,1340],"mapped",[1388]],[[1341,1341],"mapped",[1389]],[[1342,1342],"mapped",[1390]],[[1343,1343],"mapped",[1391]],[[1344,1344],"mapped",[1392]],[[1345,1345],"mapped",[1393]],[[1346,1346],"mapped",[1394]],[[1347,1347],"mapped",[1395]],[[1348,1348],"mapped",[1396]],[[1349,1349],"mapped",[1397]],[[1350,1350],"mapped",[1398]],[[1351,1351],"mapped",[1399]],[[1352,1352],"mapped",[1400]],[[1353,1353],"mapped",[1401]],[[1354,1354],"mapped",[1402]],[[1355,1355],"mapped",[1403]],[[1356,1356],"mapped",[1404]],[[1357,1357],"mapped",[1405]],[[1358,1358],"mapped",[1406]],[[1359,1359],"mapped",[1407]],[[1360,1360],"mapped",[1408]],[[1361,1361],"mapped",[1409]],[[1362,1362],"mapped",[1410]],[[1363,1363],"mapped",[1411]],[[1364,1364],"mapped",[1412]],[[1365,1365],"mapped",[1413]],[[1366,1366],"mapped",[1414]],[[1367,1368],"disallowed"],[[1369,1369],"valid"],[[1370,1375],"valid",[],"NV8"],[[1376,1376],"disallowed"],[[1377,1414],"valid"],[[1415,1415],"mapped",[1381,1410]],[[1416,1416],"disallowed"],[[1417,1417],"valid",[],"NV8"],[[1418,1418],"valid",[],"NV8"],[[1419,1420],"disallowed"],[[1421,1422],"valid",[],"NV8"],[[1423,1423],"valid",[],"NV8"],[[1424,1424],"disallowed"],[[1425,1441],"valid"],[[1442,1442],"valid"],[[1443,1455],"valid"],[[1456,1465],"valid"],[[1466,1466],"valid"],[[1467,1469],"valid"],[[1470,1470],"valid",[],"NV8"],[[1471,1471],"valid"],[[1472,1472],"valid",[],"NV8"],[[1473,1474],"valid"],[[1475,1475],"valid",[],"NV8"],[[1476,1476],"valid"],[[1477,1477],"valid"],[[1478,1478],"valid",[],"NV8"],[[1479,1479],"valid"],[[1480,1487],"disallowed"],[[1488,1514],"valid"],[[1515,1519],"disallowed"],[[1520,1524],"valid"],[[1525,1535],"disallowed"],[[1536,1539],"disallowed"],[[1540,1540],"disallowed"],[[1541,1541],"disallowed"],[[1542,1546],"valid",[],"NV8"],[[1547,1547],"valid",[],"NV8"],[[1548,1548],"valid",[],"NV8"],[[1549,1551],"valid",[],"NV8"],[[1552,1557],"valid"],[[1558,1562],"valid"],[[1563,1563],"valid",[],"NV8"],[[1564,1564],"disallowed"],[[1565,1565],"disallowed"],[[1566,1566],"valid",[],"NV8"],[[1567,1567],"valid",[],"NV8"],[[1568,1568],"valid"],[[1569,1594],"valid"],[[1595,1599],"valid"],[[1600,1600],"valid",[],"NV8"],[[1601,1618],"valid"],[[1619,1621],"valid"],[[1622,1624],"valid"],[[1625,1630],"valid"],[[1631,1631],"valid"],[[1632,1641],"valid"],[[1642,1645],"valid",[],"NV8"],[[1646,1647],"valid"],[[1648,1652],"valid"],[[1653,1653],"mapped",[1575,1652]],[[1654,1654],"mapped",[1608,1652]],[[1655,1655],"mapped",[1735,1652]],[[1656,1656],"mapped",[1610,1652]],[[1657,1719],"valid"],[[1720,1721],"valid"],[[1722,1726],"valid"],[[1727,1727],"valid"],[[1728,1742],"valid"],[[1743,1743],"valid"],[[1744,1747],"valid"],[[1748,1748],"valid",[],"NV8"],[[1749,1756],"valid"],[[1757,1757],"disallowed"],[[1758,1758],"valid",[],"NV8"],[[1759,1768],"valid"],[[1769,1769],"valid",[],"NV8"],[[1770,1773],"valid"],[[1774,1775],"valid"],[[1776,1785],"valid"],[[1786,1790],"valid"],[[1791,1791],"valid"],[[1792,1805],"valid",[],"NV8"],[[1806,1806],"disallowed"],[[1807,1807],"disallowed"],[[1808,1836],"valid"],[[1837,1839],"valid"],[[1840,1866],"valid"],[[1867,1868],"disallowed"],[[1869,1871],"valid"],[[1872,1901],"valid"],[[1902,1919],"valid"],[[1920,1968],"valid"],[[1969,1969],"valid"],[[1970,1983],"disallowed"],[[1984,2037],"valid"],[[2038,2042],"valid",[],"NV8"],[[2043,2047],"disallowed"],[[2048,2093],"valid"],[[2094,2095],"disallowed"],[[2096,2110],"valid",[],"NV8"],[[2111,2111],"disallowed"],[[2112,2139],"valid"],[[2140,2141],"disallowed"],[[2142,2142],"valid",[],"NV8"],[[2143,2207],"disallowed"],[[2208,2208],"valid"],[[2209,2209],"valid"],[[2210,2220],"valid"],[[2221,2226],"valid"],[[2227,2228],"valid"],[[2229,2274],"disallowed"],[[2275,2275],"valid"],[[2276,2302],"valid"],[[2303,2303],"valid"],[[2304,2304],"valid"],[[2305,2307],"valid"],[[2308,2308],"valid"],[[2309,2361],"valid"],[[2362,2363],"valid"],[[2364,2381],"valid"],[[2382,2382],"valid"],[[2383,2383],"valid"],[[2384,2388],"valid"],[[2389,2389],"valid"],[[2390,2391],"valid"],[[2392,2392],"mapped",[2325,2364]],[[2393,2393],"mapped",[2326,2364]],[[2394,2394],"mapped",[2327,2364]],[[2395,2395],"mapped",[2332,2364]],[[2396,2396],"mapped",[2337,2364]],[[2397,2397],"mapped",[2338,2364]],[[2398,2398],"mapped",[2347,2364]],[[2399,2399],"mapped",[2351,2364]],[[2400,2403],"valid"],[[2404,2405],"valid",[],"NV8"],[[2406,2415],"valid"],[[2416,2416],"valid",[],"NV8"],[[2417,2418],"valid"],[[2419,2423],"valid"],[[2424,2424],"valid"],[[2425,2426],"valid"],[[2427,2428],"valid"],[[2429,2429],"valid"],[[2430,2431],"valid"],[[2432,2432],"valid"],[[2433,2435],"valid"],[[2436,2436],"disallowed"],[[2437,2444],"valid"],[[2445,2446],"disallowed"],[[2447,2448],"valid"],[[2449,2450],"disallowed"],[[2451,2472],"valid"],[[2473,2473],"disallowed"],[[2474,2480],"valid"],[[2481,2481],"disallowed"],[[2482,2482],"valid"],[[2483,2485],"disallowed"],[[2486,2489],"valid"],[[2490,2491],"disallowed"],[[2492,2492],"valid"],[[2493,2493],"valid"],[[2494,2500],"valid"],[[2501,2502],"disallowed"],[[2503,2504],"valid"],[[2505,2506],"disallowed"],[[2507,2509],"valid"],[[2510,2510],"valid"],[[2511,2518],"disallowed"],[[2519,2519],"valid"],[[2520,2523],"disallowed"],[[2524,2524],"mapped",[2465,2492]],[[2525,2525],"mapped",[2466,2492]],[[2526,2526],"disallowed"],[[2527,2527],"mapped",[2479,2492]],[[2528,2531],"valid"],[[2532,2533],"disallowed"],[[2534,2545],"valid"],[[2546,2554],"valid",[],"NV8"],[[2555,2555],"valid",[],"NV8"],[[2556,2560],"disallowed"],[[2561,2561],"valid"],[[2562,2562],"valid"],[[2563,2563],"valid"],[[2564,2564],"disallowed"],[[2565,2570],"valid"],[[2571,2574],"disallowed"],[[2575,2576],"valid"],[[2577,2578],"disallowed"],[[2579,2600],"valid"],[[2601,2601],"disallowed"],[[2602,2608],"valid"],[[2609,2609],"disallowed"],[[2610,2610],"valid"],[[2611,2611],"mapped",[2610,2620]],[[2612,2612],"disallowed"],[[2613,2613],"valid"],[[2614,2614],"mapped",[2616,2620]],[[2615,2615],"disallowed"],[[2616,2617],"valid"],[[2618,2619],"disallowed"],[[2620,2620],"valid"],[[2621,2621],"disallowed"],[[2622,2626],"valid"],[[2627,2630],"disallowed"],[[2631,2632],"valid"],[[2633,2634],"disallowed"],[[2635,2637],"valid"],[[2638,2640],"disallowed"],[[2641,2641],"valid"],[[2642,2648],"disallowed"],[[2649,2649],"mapped",[2582,2620]],[[2650,2650],"mapped",[2583,2620]],[[2651,2651],"mapped",[2588,2620]],[[2652,2652],"valid"],[[2653,2653],"disallowed"],[[2654,2654],"mapped",[2603,2620]],[[2655,2661],"disallowed"],[[2662,2676],"valid"],[[2677,2677],"valid"],[[2678,2688],"disallowed"],[[2689,2691],"valid"],[[2692,2692],"disallowed"],[[2693,2699],"valid"],[[2700,2700],"valid"],[[2701,2701],"valid"],[[2702,2702],"disallowed"],[[2703,2705],"valid"],[[2706,2706],"disallowed"],[[2707,2728],"valid"],[[2729,2729],"disallowed"],[[2730,2736],"valid"],[[2737,2737],"disallowed"],[[2738,2739],"valid"],[[2740,2740],"disallowed"],[[2741,2745],"valid"],[[2746,2747],"disallowed"],[[2748,2757],"valid"],[[2758,2758],"disallowed"],[[2759,2761],"valid"],[[2762,2762],"disallowed"],[[2763,2765],"valid"],[[2766,2767],"disallowed"],[[2768,2768],"valid"],[[2769,2783],"disallowed"],[[2784,2784],"valid"],[[2785,2787],"valid"],[[2788,2789],"disallowed"],[[2790,2799],"valid"],[[2800,2800],"valid",[],"NV8"],[[2801,2801],"valid",[],"NV8"],[[2802,2808],"disallowed"],[[2809,2809],"valid"],[[2810,2816],"disallowed"],[[2817,2819],"valid"],[[2820,2820],"disallowed"],[[2821,2828],"valid"],[[2829,2830],"disallowed"],[[2831,2832],"valid"],[[2833,2834],"disallowed"],[[2835,2856],"valid"],[[2857,2857],"disallowed"],[[2858,2864],"valid"],[[2865,2865],"disallowed"],[[2866,2867],"valid"],[[2868,2868],"disallowed"],[[2869,2869],"valid"],[[2870,2873],"valid"],[[2874,2875],"disallowed"],[[2876,2883],"valid"],[[2884,2884],"valid"],[[2885,2886],"disallowed"],[[2887,2888],"valid"],[[2889,2890],"disallowed"],[[2891,2893],"valid"],[[2894,2901],"disallowed"],[[2902,2903],"valid"],[[2904,2907],"disallowed"],[[2908,2908],"mapped",[2849,2876]],[[2909,2909],"mapped",[2850,2876]],[[2910,2910],"disallowed"],[[2911,2913],"valid"],[[2914,2915],"valid"],[[2916,2917],"disallowed"],[[2918,2927],"valid"],[[2928,2928],"valid",[],"NV8"],[[2929,2929],"valid"],[[2930,2935],"valid",[],"NV8"],[[2936,2945],"disallowed"],[[2946,2947],"valid"],[[2948,2948],"disallowed"],[[2949,2954],"valid"],[[2955,2957],"disallowed"],[[2958,2960],"valid"],[[2961,2961],"disallowed"],[[2962,2965],"valid"],[[2966,2968],"disallowed"],[[2969,2970],"valid"],[[2971,2971],"disallowed"],[[2972,2972],"valid"],[[2973,2973],"disallowed"],[[2974,2975],"valid"],[[2976,2978],"disallowed"],[[2979,2980],"valid"],[[2981,2983],"disallowed"],[[2984,2986],"valid"],[[2987,2989],"disallowed"],[[2990,2997],"valid"],[[2998,2998],"valid"],[[2999,3001],"valid"],[[3002,3005],"disallowed"],[[3006,3010],"valid"],[[3011,3013],"disallowed"],[[3014,3016],"valid"],[[3017,3017],"disallowed"],[[3018,3021],"valid"],[[3022,3023],"disallowed"],[[3024,3024],"valid"],[[3025,3030],"disallowed"],[[3031,3031],"valid"],[[3032,3045],"disallowed"],[[3046,3046],"valid"],[[3047,3055],"valid"],[[3056,3058],"valid",[],"NV8"],[[3059,3066],"valid",[],"NV8"],[[3067,3071],"disallowed"],[[3072,3072],"valid"],[[3073,3075],"valid"],[[3076,3076],"disallowed"],[[3077,3084],"valid"],[[3085,3085],"disallowed"],[[3086,3088],"valid"],[[3089,3089],"disallowed"],[[3090,3112],"valid"],[[3113,3113],"disallowed"],[[3114,3123],"valid"],[[3124,3124],"valid"],[[3125,3129],"valid"],[[3130,3132],"disallowed"],[[3133,3133],"valid"],[[3134,3140],"valid"],[[3141,3141],"disallowed"],[[3142,3144],"valid"],[[3145,3145],"disallowed"],[[3146,3149],"valid"],[[3150,3156],"disallowed"],[[3157,3158],"valid"],[[3159,3159],"disallowed"],[[3160,3161],"valid"],[[3162,3162],"valid"],[[3163,3167],"disallowed"],[[3168,3169],"valid"],[[3170,3171],"valid"],[[3172,3173],"disallowed"],[[3174,3183],"valid"],[[3184,3191],"disallowed"],[[3192,3199],"valid",[],"NV8"],[[3200,3200],"disallowed"],[[3201,3201],"valid"],[[3202,3203],"valid"],[[3204,3204],"disallowed"],[[3205,3212],"valid"],[[3213,3213],"disallowed"],[[3214,3216],"valid"],[[3217,3217],"disallowed"],[[3218,3240],"valid"],[[3241,3241],"disallowed"],[[3242,3251],"valid"],[[3252,3252],"disallowed"],[[3253,3257],"valid"],[[3258,3259],"disallowed"],[[3260,3261],"valid"],[[3262,3268],"valid"],[[3269,3269],"disallowed"],[[3270,3272],"valid"],[[3273,3273],"disallowed"],[[3274,3277],"valid"],[[3278,3284],"disallowed"],[[3285,3286],"valid"],[[3287,3293],"disallowed"],[[3294,3294],"valid"],[[3295,3295],"disallowed"],[[3296,3297],"valid"],[[3298,3299],"valid"],[[3300,3301],"disallowed"],[[3302,3311],"valid"],[[3312,3312],"disallowed"],[[3313,3314],"valid"],[[3315,3328],"disallowed"],[[3329,3329],"valid"],[[3330,3331],"valid"],[[3332,3332],"disallowed"],[[3333,3340],"valid"],[[3341,3341],"disallowed"],[[3342,3344],"valid"],[[3345,3345],"disallowed"],[[3346,3368],"valid"],[[3369,3369],"valid"],[[3370,3385],"valid"],[[3386,3386],"valid"],[[3387,3388],"disallowed"],[[3389,3389],"valid"],[[3390,3395],"valid"],[[3396,3396],"valid"],[[3397,3397],"disallowed"],[[3398,3400],"valid"],[[3401,3401],"disallowed"],[[3402,3405],"valid"],[[3406,3406],"valid"],[[3407,3414],"disallowed"],[[3415,3415],"valid"],[[3416,3422],"disallowed"],[[3423,3423],"valid"],[[3424,3425],"valid"],[[3426,3427],"valid"],[[3428,3429],"disallowed"],[[3430,3439],"valid"],[[3440,3445],"valid",[],"NV8"],[[3446,3448],"disallowed"],[[3449,3449],"valid",[],"NV8"],[[3450,3455],"valid"],[[3456,3457],"disallowed"],[[3458,3459],"valid"],[[3460,3460],"disallowed"],[[3461,3478],"valid"],[[3479,3481],"disallowed"],[[3482,3505],"valid"],[[3506,3506],"disallowed"],[[3507,3515],"valid"],[[3516,3516],"disallowed"],[[3517,3517],"valid"],[[3518,3519],"disallowed"],[[3520,3526],"valid"],[[3527,3529],"disallowed"],[[3530,3530],"valid"],[[3531,3534],"disallowed"],[[3535,3540],"valid"],[[3541,3541],"disallowed"],[[3542,3542],"valid"],[[3543,3543],"disallowed"],[[3544,3551],"valid"],[[3552,3557],"disallowed"],[[3558,3567],"valid"],[[3568,3569],"disallowed"],[[3570,3571],"valid"],[[3572,3572],"valid",[],"NV8"],[[3573,3584],"disallowed"],[[3585,3634],"valid"],[[3635,3635],"mapped",[3661,3634]],[[3636,3642],"valid"],[[3643,3646],"disallowed"],[[3647,3647],"valid",[],"NV8"],[[3648,3662],"valid"],[[3663,3663],"valid",[],"NV8"],[[3664,3673],"valid"],[[3674,3675],"valid",[],"NV8"],[[3676,3712],"disallowed"],[[3713,3714],"valid"],[[3715,3715],"disallowed"],[[3716,3716],"valid"],[[3717,3718],"disallowed"],[[3719,3720],"valid"],[[3721,3721],"disallowed"],[[3722,3722],"valid"],[[3723,3724],"disallowed"],[[3725,3725],"valid"],[[3726,3731],"disallowed"],[[3732,3735],"valid"],[[3736,3736],"disallowed"],[[3737,3743],"valid"],[[3744,3744],"disallowed"],[[3745,3747],"valid"],[[3748,3748],"disallowed"],[[3749,3749],"valid"],[[3750,3750],"disallowed"],[[3751,3751],"valid"],[[3752,3753],"disallowed"],[[3754,3755],"valid"],[[3756,3756],"disallowed"],[[3757,3762],"valid"],[[3763,3763],"mapped",[3789,3762]],[[3764,3769],"valid"],[[3770,3770],"disallowed"],[[3771,3773],"valid"],[[3774,3775],"disallowed"],[[3776,3780],"valid"],[[3781,3781],"disallowed"],[[3782,3782],"valid"],[[3783,3783],"disallowed"],[[3784,3789],"valid"],[[3790,3791],"disallowed"],[[3792,3801],"valid"],[[3802,3803],"disallowed"],[[3804,3804],"mapped",[3755,3737]],[[3805,3805],"mapped",[3755,3745]],[[3806,3807],"valid"],[[3808,3839],"disallowed"],[[3840,3840],"valid"],[[3841,3850],"valid",[],"NV8"],[[3851,3851],"valid"],[[3852,3852],"mapped",[3851]],[[3853,3863],"valid",[],"NV8"],[[3864,3865],"valid"],[[3866,3871],"valid",[],"NV8"],[[3872,3881],"valid"],[[3882,3892],"valid",[],"NV8"],[[3893,3893],"valid"],[[3894,3894],"valid",[],"NV8"],[[3895,3895],"valid"],[[3896,3896],"valid",[],"NV8"],[[3897,3897],"valid"],[[3898,3901],"valid",[],"NV8"],[[3902,3906],"valid"],[[3907,3907],"mapped",[3906,4023]],[[3908,3911],"valid"],[[3912,3912],"disallowed"],[[3913,3916],"valid"],[[3917,3917],"mapped",[3916,4023]],[[3918,3921],"valid"],[[3922,3922],"mapped",[3921,4023]],[[3923,3926],"valid"],[[3927,3927],"mapped",[3926,4023]],[[3928,3931],"valid"],[[3932,3932],"mapped",[3931,4023]],[[3933,3944],"valid"],[[3945,3945],"mapped",[3904,4021]],[[3946,3946],"valid"],[[3947,3948],"valid"],[[3949,3952],"disallowed"],[[3953,3954],"valid"],[[3955,3955],"mapped",[3953,3954]],[[3956,3956],"valid"],[[3957,3957],"mapped",[3953,3956]],[[3958,3958],"mapped",[4018,3968]],[[3959,3959],"mapped",[4018,3953,3968]],[[3960,3960],"mapped",[4019,3968]],[[3961,3961],"mapped",[4019,3953,3968]],[[3962,3968],"valid"],[[3969,3969],"mapped",[3953,3968]],[[3970,3972],"valid"],[[3973,3973],"valid",[],"NV8"],[[3974,3979],"valid"],[[3980,3983],"valid"],[[3984,3986],"valid"],[[3987,3987],"mapped",[3986,4023]],[[3988,3989],"valid"],[[3990,3990],"valid"],[[3991,3991],"valid"],[[3992,3992],"disallowed"],[[3993,3996],"valid"],[[3997,3997],"mapped",[3996,4023]],[[3998,4001],"valid"],[[4002,4002],"mapped",[4001,4023]],[[4003,4006],"valid"],[[4007,4007],"mapped",[4006,4023]],[[4008,4011],"valid"],[[4012,4012],"mapped",[4011,4023]],[[4013,4013],"valid"],[[4014,4016],"valid"],[[4017,4023],"valid"],[[4024,4024],"valid"],[[4025,4025],"mapped",[3984,4021]],[[4026,4028],"valid"],[[4029,4029],"disallowed"],[[4030,4037],"valid",[],"NV8"],[[4038,4038],"valid"],[[4039,4044],"valid",[],"NV8"],[[4045,4045],"disallowed"],[[4046,4046],"valid",[],"NV8"],[[4047,4047],"valid",[],"NV8"],[[4048,4049],"valid",[],"NV8"],[[4050,4052],"valid",[],"NV8"],[[4053,4056],"valid",[],"NV8"],[[4057,4058],"valid",[],"NV8"],[[4059,4095],"disallowed"],[[4096,4129],"valid"],[[4130,4130],"valid"],[[4131,4135],"valid"],[[4136,4136],"valid"],[[4137,4138],"valid"],[[4139,4139],"valid"],[[4140,4146],"valid"],[[4147,4149],"valid"],[[4150,4153],"valid"],[[4154,4159],"valid"],[[4160,4169],"valid"],[[4170,4175],"valid",[],"NV8"],[[4176,4185],"valid"],[[4186,4249],"valid"],[[4250,4253],"valid"],[[4254,4255],"valid",[],"NV8"],[[4256,4293],"disallowed"],[[4294,4294],"disallowed"],[[4295,4295],"mapped",[11559]],[[4296,4300],"disallowed"],[[4301,4301],"mapped",[11565]],[[4302,4303],"disallowed"],[[4304,4342],"valid"],[[4343,4344],"valid"],[[4345,4346],"valid"],[[4347,4347],"valid",[],"NV8"],[[4348,4348],"mapped",[4316]],[[4349,4351],"valid"],[[4352,4441],"valid",[],"NV8"],[[4442,4446],"valid",[],"NV8"],[[4447,4448],"disallowed"],[[4449,4514],"valid",[],"NV8"],[[4515,4519],"valid",[],"NV8"],[[4520,4601],"valid",[],"NV8"],[[4602,4607],"valid",[],"NV8"],[[4608,4614],"valid"],[[4615,4615],"valid"],[[4616,4678],"valid"],[[4679,4679],"valid"],[[4680,4680],"valid"],[[4681,4681],"disallowed"],[[4682,4685],"valid"],[[4686,4687],"disallowed"],[[4688,4694],"valid"],[[4695,4695],"disallowed"],[[4696,4696],"valid"],[[4697,4697],"disallowed"],[[4698,4701],"valid"],[[4702,4703],"disallowed"],[[4704,4742],"valid"],[[4743,4743],"valid"],[[4744,4744],"valid"],[[4745,4745],"disallowed"],[[4746,4749],"valid"],[[4750,4751],"disallowed"],[[4752,4782],"valid"],[[4783,4783],"valid"],[[4784,4784],"valid"],[[4785,4785],"disallowed"],[[4786,4789],"valid"],[[4790,4791],"disallowed"],[[4792,4798],"valid"],[[4799,4799],"disallowed"],[[4800,4800],"valid"],[[4801,4801],"disallowed"],[[4802,4805],"valid"],[[4806,4807],"disallowed"],[[4808,4814],"valid"],[[4815,4815],"valid"],[[4816,4822],"valid"],[[4823,4823],"disallowed"],[[4824,4846],"valid"],[[4847,4847],"valid"],[[4848,4878],"valid"],[[4879,4879],"valid"],[[4880,4880],"valid"],[[4881,4881],"disallowed"],[[4882,4885],"valid"],[[4886,4887],"disallowed"],[[4888,4894],"valid"],[[4895,4895],"valid"],[[4896,4934],"valid"],[[4935,4935],"valid"],[[4936,4954],"valid"],[[4955,4956],"disallowed"],[[4957,4958],"valid"],[[4959,4959],"valid"],[[4960,4960],"valid",[],"NV8"],[[4961,4988],"valid",[],"NV8"],[[4989,4991],"disallowed"],[[4992,5007],"valid"],[[5008,5017],"valid",[],"NV8"],[[5018,5023],"disallowed"],[[5024,5108],"valid"],[[5109,5109],"valid"],[[5110,5111],"disallowed"],[[5112,5112],"mapped",[5104]],[[5113,5113],"mapped",[5105]],[[5114,5114],"mapped",[5106]],[[5115,5115],"mapped",[5107]],[[5116,5116],"mapped",[5108]],[[5117,5117],"mapped",[5109]],[[5118,5119],"disallowed"],[[5120,5120],"valid",[],"NV8"],[[5121,5740],"valid"],[[5741,5742],"valid",[],"NV8"],[[5743,5750],"valid"],[[5751,5759],"valid"],[[5760,5760],"disallowed"],[[5761,5786],"valid"],[[5787,5788],"valid",[],"NV8"],[[5789,5791],"disallowed"],[[5792,5866],"valid"],[[5867,5872],"valid",[],"NV8"],[[5873,5880],"valid"],[[5881,5887],"disallowed"],[[5888,5900],"valid"],[[5901,5901],"disallowed"],[[5902,5908],"valid"],[[5909,5919],"disallowed"],[[5920,5940],"valid"],[[5941,5942],"valid",[],"NV8"],[[5943,5951],"disallowed"],[[5952,5971],"valid"],[[5972,5983],"disallowed"],[[5984,5996],"valid"],[[5997,5997],"disallowed"],[[5998,6000],"valid"],[[6001,6001],"disallowed"],[[6002,6003],"valid"],[[6004,6015],"disallowed"],[[6016,6067],"valid"],[[6068,6069],"disallowed"],[[6070,6099],"valid"],[[6100,6102],"valid",[],"NV8"],[[6103,6103],"valid"],[[6104,6107],"valid",[],"NV8"],[[6108,6108],"valid"],[[6109,6109],"valid"],[[6110,6111],"disallowed"],[[6112,6121],"valid"],[[6122,6127],"disallowed"],[[6128,6137],"valid",[],"NV8"],[[6138,6143],"disallowed"],[[6144,6149],"valid",[],"NV8"],[[6150,6150],"disallowed"],[[6151,6154],"valid",[],"NV8"],[[6155,6157],"ignored"],[[6158,6158],"disallowed"],[[6159,6159],"disallowed"],[[6160,6169],"valid"],[[6170,6175],"disallowed"],[[6176,6263],"valid"],[[6264,6271],"disallowed"],[[6272,6313],"valid"],[[6314,6314],"valid"],[[6315,6319],"disallowed"],[[6320,6389],"valid"],[[6390,6399],"disallowed"],[[6400,6428],"valid"],[[6429,6430],"valid"],[[6431,6431],"disallowed"],[[6432,6443],"valid"],[[6444,6447],"disallowed"],[[6448,6459],"valid"],[[6460,6463],"disallowed"],[[6464,6464],"valid",[],"NV8"],[[6465,6467],"disallowed"],[[6468,6469],"valid",[],"NV8"],[[6470,6509],"valid"],[[6510,6511],"disallowed"],[[6512,6516],"valid"],[[6517,6527],"disallowed"],[[6528,6569],"valid"],[[6570,6571],"valid"],[[6572,6575],"disallowed"],[[6576,6601],"valid"],[[6602,6607],"disallowed"],[[6608,6617],"valid"],[[6618,6618],"valid",[],"XV8"],[[6619,6621],"disallowed"],[[6622,6623],"valid",[],"NV8"],[[6624,6655],"valid",[],"NV8"],[[6656,6683],"valid"],[[6684,6685],"disallowed"],[[6686,6687],"valid",[],"NV8"],[[6688,6750],"valid"],[[6751,6751],"disallowed"],[[6752,6780],"valid"],[[6781,6782],"disallowed"],[[6783,6793],"valid"],[[6794,6799],"disallowed"],[[6800,6809],"valid"],[[6810,6815],"disallowed"],[[6816,6822],"valid",[],"NV8"],[[6823,6823],"valid"],[[6824,6829],"valid",[],"NV8"],[[6830,6831],"disallowed"],[[6832,6845],"valid"],[[6846,6846],"valid",[],"NV8"],[[6847,6911],"disallowed"],[[6912,6987],"valid"],[[6988,6991],"disallowed"],[[6992,7001],"valid"],[[7002,7018],"valid",[],"NV8"],[[7019,7027],"valid"],[[7028,7036],"valid",[],"NV8"],[[7037,7039],"disallowed"],[[7040,7082],"valid"],[[7083,7085],"valid"],[[7086,7097],"valid"],[[7098,7103],"valid"],[[7104,7155],"valid"],[[7156,7163],"disallowed"],[[7164,7167],"valid",[],"NV8"],[[7168,7223],"valid"],[[7224,7226],"disallowed"],[[7227,7231],"valid",[],"NV8"],[[7232,7241],"valid"],[[7242,7244],"disallowed"],[[7245,7293],"valid"],[[7294,7295],"valid",[],"NV8"],[[7296,7359],"disallowed"],[[7360,7367],"valid",[],"NV8"],[[7368,7375],"disallowed"],[[7376,7378],"valid"],[[7379,7379],"valid",[],"NV8"],[[7380,7410],"valid"],[[7411,7414],"valid"],[[7415,7415],"disallowed"],[[7416,7417],"valid"],[[7418,7423],"disallowed"],[[7424,7467],"valid"],[[7468,7468],"mapped",[97]],[[7469,7469],"mapped",[230]],[[7470,7470],"mapped",[98]],[[7471,7471],"valid"],[[7472,7472],"mapped",[100]],[[7473,7473],"mapped",[101]],[[7474,7474],"mapped",[477]],[[7475,7475],"mapped",[103]],[[7476,7476],"mapped",[104]],[[7477,7477],"mapped",[105]],[[7478,7478],"mapped",[106]],[[7479,7479],"mapped",[107]],[[7480,7480],"mapped",[108]],[[7481,7481],"mapped",[109]],[[7482,7482],"mapped",[110]],[[7483,7483],"valid"],[[7484,7484],"mapped",[111]],[[7485,7485],"mapped",[547]],[[7486,7486],"mapped",[112]],[[7487,7487],"mapped",[114]],[[7488,7488],"mapped",[116]],[[7489,7489],"mapped",[117]],[[7490,7490],"mapped",[119]],[[7491,7491],"mapped",[97]],[[7492,7492],"mapped",[592]],[[7493,7493],"mapped",[593]],[[7494,7494],"mapped",[7426]],[[7495,7495],"mapped",[98]],[[7496,7496],"mapped",[100]],[[7497,7497],"mapped",[101]],[[7498,7498],"mapped",[601]],[[7499,7499],"mapped",[603]],[[7500,7500],"mapped",[604]],[[7501,7501],"mapped",[103]],[[7502,7502],"valid"],[[7503,7503],"mapped",[107]],[[7504,7504],"mapped",[109]],[[7505,7505],"mapped",[331]],[[7506,7506],"mapped",[111]],[[7507,7507],"mapped",[596]],[[7508,7508],"mapped",[7446]],[[7509,7509],"mapped",[7447]],[[7510,7510],"mapped",[112]],[[7511,7511],"mapped",[116]],[[7512,7512],"mapped",[117]],[[7513,7513],"mapped",[7453]],[[7514,7514],"mapped",[623]],[[7515,7515],"mapped",[118]],[[7516,7516],"mapped",[7461]],[[7517,7517],"mapped",[946]],[[7518,7518],"mapped",[947]],[[7519,7519],"mapped",[948]],[[7520,7520],"mapped",[966]],[[7521,7521],"mapped",[967]],[[7522,7522],"mapped",[105]],[[7523,7523],"mapped",[114]],[[7524,7524],"mapped",[117]],[[7525,7525],"mapped",[118]],[[7526,7526],"mapped",[946]],[[7527,7527],"mapped",[947]],[[7528,7528],"mapped",[961]],[[7529,7529],"mapped",[966]],[[7530,7530],"mapped",[967]],[[7531,7531],"valid"],[[7532,7543],"valid"],[[7544,7544],"mapped",[1085]],[[7545,7578],"valid"],[[7579,7579],"mapped",[594]],[[7580,7580],"mapped",[99]],[[7581,7581],"mapped",[597]],[[7582,7582],"mapped",[240]],[[7583,7583],"mapped",[604]],[[7584,7584],"mapped",[102]],[[7585,7585],"mapped",[607]],[[7586,7586],"mapped",[609]],[[7587,7587],"mapped",[613]],[[7588,7588],"mapped",[616]],[[7589,7589],"mapped",[617]],[[7590,7590],"mapped",[618]],[[7591,7591],"mapped",[7547]],[[7592,7592],"mapped",[669]],[[7593,7593],"mapped",[621]],[[7594,7594],"mapped",[7557]],[[7595,7595],"mapped",[671]],[[7596,7596],"mapped",[625]],[[7597,7597],"mapped",[624]],[[7598,7598],"mapped",[626]],[[7599,7599],"mapped",[627]],[[7600,7600],"mapped",[628]],[[7601,7601],"mapped",[629]],[[7602,7602],"mapped",[632]],[[7603,7603],"mapped",[642]],[[7604,7604],"mapped",[643]],[[7605,7605],"mapped",[427]],[[7606,7606],"mapped",[649]],[[7607,7607],"mapped",[650]],[[7608,7608],"mapped",[7452]],[[7609,7609],"mapped",[651]],[[7610,7610],"mapped",[652]],[[7611,7611],"mapped",[122]],[[7612,7612],"mapped",[656]],[[7613,7613],"mapped",[657]],[[7614,7614],"mapped",[658]],[[7615,7615],"mapped",[952]],[[7616,7619],"valid"],[[7620,7626],"valid"],[[7627,7654],"valid"],[[7655,7669],"valid"],[[7670,7675],"disallowed"],[[7676,7676],"valid"],[[7677,7677],"valid"],[[7678,7679],"valid"],[[7680,7680],"mapped",[7681]],[[7681,7681],"valid"],[[7682,7682],"mapped",[7683]],[[7683,7683],"valid"],[[7684,7684],"mapped",[7685]],[[7685,7685],"valid"],[[7686,7686],"mapped",[7687]],[[7687,7687],"valid"],[[7688,7688],"mapped",[7689]],[[7689,7689],"valid"],[[7690,7690],"mapped",[7691]],[[7691,7691],"valid"],[[7692,7692],"mapped",[7693]],[[7693,7693],"valid"],[[7694,7694],"mapped",[7695]],[[7695,7695],"valid"],[[7696,7696],"mapped",[7697]],[[7697,7697],"valid"],[[7698,7698],"mapped",[7699]],[[7699,7699],"valid"],[[7700,7700],"mapped",[7701]],[[7701,7701],"valid"],[[7702,7702],"mapped",[7703]],[[7703,7703],"valid"],[[7704,7704],"mapped",[7705]],[[7705,7705],"valid"],[[7706,7706],"mapped",[7707]],[[7707,7707],"valid"],[[7708,7708],"mapped",[7709]],[[7709,7709],"valid"],[[7710,7710],"mapped",[7711]],[[7711,7711],"valid"],[[7712,7712],"mapped",[7713]],[[7713,7713],"valid"],[[7714,7714],"mapped",[7715]],[[7715,7715],"valid"],[[7716,7716],"mapped",[7717]],[[7717,7717],"valid"],[[7718,7718],"mapped",[7719]],[[7719,7719],"valid"],[[7720,7720],"mapped",[7721]],[[7721,7721],"valid"],[[7722,7722],"mapped",[7723]],[[7723,7723],"valid"],[[7724,7724],"mapped",[7725]],[[7725,7725],"valid"],[[7726,7726],"mapped",[7727]],[[7727,7727],"valid"],[[7728,7728],"mapped",[7729]],[[7729,7729],"valid"],[[7730,7730],"mapped",[7731]],[[7731,7731],"valid"],[[7732,7732],"mapped",[7733]],[[7733,7733],"valid"],[[7734,7734],"mapped",[7735]],[[7735,7735],"valid"],[[7736,7736],"mapped",[7737]],[[7737,7737],"valid"],[[7738,7738],"mapped",[7739]],[[7739,7739],"valid"],[[7740,7740],"mapped",[7741]],[[7741,7741],"valid"],[[7742,7742],"mapped",[7743]],[[7743,7743],"valid"],[[7744,7744],"mapped",[7745]],[[7745,7745],"valid"],[[7746,7746],"mapped",[7747]],[[7747,7747],"valid"],[[7748,7748],"mapped",[7749]],[[7749,7749],"valid"],[[7750,7750],"mapped",[7751]],[[7751,7751],"valid"],[[7752,7752],"mapped",[7753]],[[7753,7753],"valid"],[[7754,7754],"mapped",[7755]],[[7755,7755],"valid"],[[7756,7756],"mapped",[7757]],[[7757,7757],"valid"],[[7758,7758],"mapped",[7759]],[[7759,7759],"valid"],[[7760,7760],"mapped",[7761]],[[7761,7761],"valid"],[[7762,7762],"mapped",[7763]],[[7763,7763],"valid"],[[7764,7764],"mapped",[7765]],[[7765,7765],"valid"],[[7766,7766],"mapped",[7767]],[[7767,7767],"valid"],[[7768,7768],"mapped",[7769]],[[7769,7769],"valid"],[[7770,7770],"mapped",[7771]],[[7771,7771],"valid"],[[7772,7772],"mapped",[7773]],[[7773,7773],"valid"],[[7774,7774],"mapped",[7775]],[[7775,7775],"valid"],[[7776,7776],"mapped",[7777]],[[7777,7777],"valid"],[[7778,7778],"mapped",[7779]],[[7779,7779],"valid"],[[7780,7780],"mapped",[7781]],[[7781,7781],"valid"],[[7782,7782],"mapped",[7783]],[[7783,7783],"valid"],[[7784,7784],"mapped",[7785]],[[7785,7785],"valid"],[[7786,7786],"mapped",[7787]],[[7787,7787],"valid"],[[7788,7788],"mapped",[7789]],[[7789,7789],"valid"],[[7790,7790],"mapped",[7791]],[[7791,7791],"valid"],[[7792,7792],"mapped",[7793]],[[7793,7793],"valid"],[[7794,7794],"mapped",[7795]],[[7795,7795],"valid"],[[7796,7796],"mapped",[7797]],[[7797,7797],"valid"],[[7798,7798],"mapped",[7799]],[[7799,7799],"valid"],[[7800,7800],"mapped",[7801]],[[7801,7801],"valid"],[[7802,7802],"mapped",[7803]],[[7803,7803],"valid"],[[7804,7804],"mapped",[7805]],[[7805,7805],"valid"],[[7806,7806],"mapped",[7807]],[[7807,7807],"valid"],[[7808,7808],"mapped",[7809]],[[7809,7809],"valid"],[[7810,7810],"mapped",[7811]],[[7811,7811],"valid"],[[7812,7812],"mapped",[7813]],[[7813,7813],"valid"],[[7814,7814],"mapped",[7815]],[[7815,7815],"valid"],[[7816,7816],"mapped",[7817]],[[7817,7817],"valid"],[[7818,7818],"mapped",[7819]],[[7819,7819],"valid"],[[7820,7820],"mapped",[7821]],[[7821,7821],"valid"],[[7822,7822],"mapped",[7823]],[[7823,7823],"valid"],[[7824,7824],"mapped",[7825]],[[7825,7825],"valid"],[[7826,7826],"mapped",[7827]],[[7827,7827],"valid"],[[7828,7828],"mapped",[7829]],[[7829,7833],"valid"],[[7834,7834],"mapped",[97,702]],[[7835,7835],"mapped",[7777]],[[7836,7837],"valid"],[[7838,7838],"mapped",[115,115]],[[7839,7839],"valid"],[[7840,7840],"mapped",[7841]],[[7841,7841],"valid"],[[7842,7842],"mapped",[7843]],[[7843,7843],"valid"],[[7844,7844],"mapped",[7845]],[[7845,7845],"valid"],[[7846,7846],"mapped",[7847]],[[7847,7847],"valid"],[[7848,7848],"mapped",[7849]],[[7849,7849],"valid"],[[7850,7850],"mapped",[7851]],[[7851,7851],"valid"],[[7852,7852],"mapped",[7853]],[[7853,7853],"valid"],[[7854,7854],"mapped",[7855]],[[7855,7855],"valid"],[[7856,7856],"mapped",[7857]],[[7857,7857],"valid"],[[7858,7858],"mapped",[7859]],[[7859,7859],"valid"],[[7860,7860],"mapped",[7861]],[[7861,7861],"valid"],[[7862,7862],"mapped",[7863]],[[7863,7863],"valid"],[[7864,7864],"mapped",[7865]],[[7865,7865],"valid"],[[7866,7866],"mapped",[7867]],[[7867,7867],"valid"],[[7868,7868],"mapped",[7869]],[[7869,7869],"valid"],[[7870,7870],"mapped",[7871]],[[7871,7871],"valid"],[[7872,7872],"mapped",[7873]],[[7873,7873],"valid"],[[7874,7874],"mapped",[7875]],[[7875,7875],"valid"],[[7876,7876],"mapped",[7877]],[[7877,7877],"valid"],[[7878,7878],"mapped",[7879]],[[7879,7879],"valid"],[[7880,7880],"mapped",[7881]],[[7881,7881],"valid"],[[7882,7882],"mapped",[7883]],[[7883,7883],"valid"],[[7884,7884],"mapped",[7885]],[[7885,7885],"valid"],[[7886,7886],"mapped",[7887]],[[7887,7887],"valid"],[[7888,7888],"mapped",[7889]],[[7889,7889],"valid"],[[7890,7890],"mapped",[7891]],[[7891,7891],"valid"],[[7892,7892],"mapped",[7893]],[[7893,7893],"valid"],[[7894,7894],"mapped",[7895]],[[7895,7895],"valid"],[[7896,7896],"mapped",[7897]],[[7897,7897],"valid"],[[7898,7898],"mapped",[7899]],[[7899,7899],"valid"],[[7900,7900],"mapped",[7901]],[[7901,7901],"valid"],[[7902,7902],"mapped",[7903]],[[7903,7903],"valid"],[[7904,7904],"mapped",[7905]],[[7905,7905],"valid"],[[7906,7906],"mapped",[7907]],[[7907,7907],"valid"],[[7908,7908],"mapped",[7909]],[[7909,7909],"valid"],[[7910,7910],"mapped",[7911]],[[7911,7911],"valid"],[[7912,7912],"mapped",[7913]],[[7913,7913],"valid"],[[7914,7914],"mapped",[7915]],[[7915,7915],"valid"],[[7916,7916],"mapped",[7917]],[[7917,7917],"valid"],[[7918,7918],"mapped",[7919]],[[7919,7919],"valid"],[[7920,7920],"mapped",[7921]],[[7921,7921],"valid"],[[7922,7922],"mapped",[7923]],[[7923,7923],"valid"],[[7924,7924],"mapped",[7925]],[[7925,7925],"valid"],[[7926,7926],"mapped",[7927]],[[7927,7927],"valid"],[[7928,7928],"mapped",[7929]],[[7929,7929],"valid"],[[7930,7930],"mapped",[7931]],[[7931,7931],"valid"],[[7932,7932],"mapped",[7933]],[[7933,7933],"valid"],[[7934,7934],"mapped",[7935]],[[7935,7935],"valid"],[[7936,7943],"valid"],[[7944,7944],"mapped",[7936]],[[7945,7945],"mapped",[7937]],[[7946,7946],"mapped",[7938]],[[7947,7947],"mapped",[7939]],[[7948,7948],"mapped",[7940]],[[7949,7949],"mapped",[7941]],[[7950,7950],"mapped",[7942]],[[7951,7951],"mapped",[7943]],[[7952,7957],"valid"],[[7958,7959],"disallowed"],[[7960,7960],"mapped",[7952]],[[7961,7961],"mapped",[7953]],[[7962,7962],"mapped",[7954]],[[7963,7963],"mapped",[7955]],[[7964,7964],"mapped",[7956]],[[7965,7965],"mapped",[7957]],[[7966,7967],"disallowed"],[[7968,7975],"valid"],[[7976,7976],"mapped",[7968]],[[7977,7977],"mapped",[7969]],[[7978,7978],"mapped",[7970]],[[7979,7979],"mapped",[7971]],[[7980,7980],"mapped",[7972]],[[7981,7981],"mapped",[7973]],[[7982,7982],"mapped",[7974]],[[7983,7983],"mapped",[7975]],[[7984,7991],"valid"],[[7992,7992],"mapped",[7984]],[[7993,7993],"mapped",[7985]],[[7994,7994],"mapped",[7986]],[[7995,7995],"mapped",[7987]],[[7996,7996],"mapped",[7988]],[[7997,7997],"mapped",[7989]],[[7998,7998],"mapped",[7990]],[[7999,7999],"mapped",[7991]],[[8000,8005],"valid"],[[8006,8007],"disallowed"],[[8008,8008],"mapped",[8000]],[[8009,8009],"mapped",[8001]],[[8010,8010],"mapped",[8002]],[[8011,8011],"mapped",[8003]],[[8012,8012],"mapped",[8004]],[[8013,8013],"mapped",[8005]],[[8014,8015],"disallowed"],[[8016,8023],"valid"],[[8024,8024],"disallowed"],[[8025,8025],"mapped",[8017]],[[8026,8026],"disallowed"],[[8027,8027],"mapped",[8019]],[[8028,8028],"disallowed"],[[8029,8029],"mapped",[8021]],[[8030,8030],"disallowed"],[[8031,8031],"mapped",[8023]],[[8032,8039],"valid"],[[8040,8040],"mapped",[8032]],[[8041,8041],"mapped",[8033]],[[8042,8042],"mapped",[8034]],[[8043,8043],"mapped",[8035]],[[8044,8044],"mapped",[8036]],[[8045,8045],"mapped",[8037]],[[8046,8046],"mapped",[8038]],[[8047,8047],"mapped",[8039]],[[8048,8048],"valid"],[[8049,8049],"mapped",[940]],[[8050,8050],"valid"],[[8051,8051],"mapped",[941]],[[8052,8052],"valid"],[[8053,8053],"mapped",[942]],[[8054,8054],"valid"],[[8055,8055],"mapped",[943]],[[8056,8056],"valid"],[[8057,8057],"mapped",[972]],[[8058,8058],"valid"],[[8059,8059],"mapped",[973]],[[8060,8060],"valid"],[[8061,8061],"mapped",[974]],[[8062,8063],"disallowed"],[[8064,8064],"mapped",[7936,953]],[[8065,8065],"mapped",[7937,953]],[[8066,8066],"mapped",[7938,953]],[[8067,8067],"mapped",[7939,953]],[[8068,8068],"mapped",[7940,953]],[[8069,8069],"mapped",[7941,953]],[[8070,8070],"mapped",[7942,953]],[[8071,8071],"mapped",[7943,953]],[[8072,8072],"mapped",[7936,953]],[[8073,8073],"mapped",[7937,953]],[[8074,8074],"mapped",[7938,953]],[[8075,8075],"mapped",[7939,953]],[[8076,8076],"mapped",[7940,953]],[[8077,8077],"mapped",[7941,953]],[[8078,8078],"mapped",[7942,953]],[[8079,8079],"mapped",[7943,953]],[[8080,8080],"mapped",[7968,953]],[[8081,8081],"mapped",[7969,953]],[[8082,8082],"mapped",[7970,953]],[[8083,8083],"mapped",[7971,953]],[[8084,8084],"mapped",[7972,953]],[[8085,8085],"mapped",[7973,953]],[[8086,8086],"mapped",[7974,953]],[[8087,8087],"mapped",[7975,953]],[[8088,8088],"mapped",[7968,953]],[[8089,8089],"mapped",[7969,953]],[[8090,8090],"mapped",[7970,953]],[[8091,8091],"mapped",[7971,953]],[[8092,8092],"mapped",[7972,953]],[[8093,8093],"mapped",[7973,953]],[[8094,8094],"mapped",[7974,953]],[[8095,8095],"mapped",[7975,953]],[[8096,8096],"mapped",[8032,953]],[[8097,8097],"mapped",[8033,953]],[[8098,8098],"mapped",[8034,953]],[[8099,8099],"mapped",[8035,953]],[[8100,8100],"mapped",[8036,953]],[[8101,8101],"mapped",[8037,953]],[[8102,8102],"mapped",[8038,953]],[[8103,8103],"mapped",[8039,953]],[[8104,8104],"mapped",[8032,953]],[[8105,8105],"mapped",[8033,953]],[[8106,8106],"mapped",[8034,953]],[[8107,8107],"mapped",[8035,953]],[[8108,8108],"mapped",[8036,953]],[[8109,8109],"mapped",[8037,953]],[[8110,8110],"mapped",[8038,953]],[[8111,8111],"mapped",[8039,953]],[[8112,8113],"valid"],[[8114,8114],"mapped",[8048,953]],[[8115,8115],"mapped",[945,953]],[[8116,8116],"mapped",[940,953]],[[8117,8117],"disallowed"],[[8118,8118],"valid"],[[8119,8119],"mapped",[8118,953]],[[8120,8120],"mapped",[8112]],[[8121,8121],"mapped",[8113]],[[8122,8122],"mapped",[8048]],[[8123,8123],"mapped",[940]],[[8124,8124],"mapped",[945,953]],[[8125,8125],"disallowed_STD3_mapped",[32,787]],[[8126,8126],"mapped",[953]],[[8127,8127],"disallowed_STD3_mapped",[32,787]],[[8128,8128],"disallowed_STD3_mapped",[32,834]],[[8129,8129],"disallowed_STD3_mapped",[32,776,834]],[[8130,8130],"mapped",[8052,953]],[[8131,8131],"mapped",[951,953]],[[8132,8132],"mapped",[942,953]],[[8133,8133],"disallowed"],[[8134,8134],"valid"],[[8135,8135],"mapped",[8134,953]],[[8136,8136],"mapped",[8050]],[[8137,8137],"mapped",[941]],[[8138,8138],"mapped",[8052]],[[8139,8139],"mapped",[942]],[[8140,8140],"mapped",[951,953]],[[8141,8141],"disallowed_STD3_mapped",[32,787,768]],[[8142,8142],"disallowed_STD3_mapped",[32,787,769]],[[8143,8143],"disallowed_STD3_mapped",[32,787,834]],[[8144,8146],"valid"],[[8147,8147],"mapped",[912]],[[8148,8149],"disallowed"],[[8150,8151],"valid"],[[8152,8152],"mapped",[8144]],[[8153,8153],"mapped",[8145]],[[8154,8154],"mapped",[8054]],[[8155,8155],"mapped",[943]],[[8156,8156],"disallowed"],[[8157,8157],"disallowed_STD3_mapped",[32,788,768]],[[8158,8158],"disallowed_STD3_mapped",[32,788,769]],[[8159,8159],"disallowed_STD3_mapped",[32,788,834]],[[8160,8162],"valid"],[[8163,8163],"mapped",[944]],[[8164,8167],"valid"],[[8168,8168],"mapped",[8160]],[[8169,8169],"mapped",[8161]],[[8170,8170],"mapped",[8058]],[[8171,8171],"mapped",[973]],[[8172,8172],"mapped",[8165]],[[8173,8173],"disallowed_STD3_mapped",[32,776,768]],[[8174,8174],"disallowed_STD3_mapped",[32,776,769]],[[8175,8175],"disallowed_STD3_mapped",[96]],[[8176,8177],"disallowed"],[[8178,8178],"mapped",[8060,953]],[[8179,8179],"mapped",[969,953]],[[8180,8180],"mapped",[974,953]],[[8181,8181],"disallowed"],[[8182,8182],"valid"],[[8183,8183],"mapped",[8182,953]],[[8184,8184],"mapped",[8056]],[[8185,8185],"mapped",[972]],[[8186,8186],"mapped",[8060]],[[8187,8187],"mapped",[974]],[[8188,8188],"mapped",[969,953]],[[8189,8189],"disallowed_STD3_mapped",[32,769]],[[8190,8190],"disallowed_STD3_mapped",[32,788]],[[8191,8191],"disallowed"],[[8192,8202],"disallowed_STD3_mapped",[32]],[[8203,8203],"ignored"],[[8204,8205],"deviation",[]],[[8206,8207],"disallowed"],[[8208,8208],"valid",[],"NV8"],[[8209,8209],"mapped",[8208]],[[8210,8214],"valid",[],"NV8"],[[8215,8215],"disallowed_STD3_mapped",[32,819]],[[8216,8227],"valid",[],"NV8"],[[8228,8230],"disallowed"],[[8231,8231],"valid",[],"NV8"],[[8232,8238],"disallowed"],[[8239,8239],"disallowed_STD3_mapped",[32]],[[8240,8242],"valid",[],"NV8"],[[8243,8243],"mapped",[8242,8242]],[[8244,8244],"mapped",[8242,8242,8242]],[[8245,8245],"valid",[],"NV8"],[[8246,8246],"mapped",[8245,8245]],[[8247,8247],"mapped",[8245,8245,8245]],[[8248,8251],"valid",[],"NV8"],[[8252,8252],"disallowed_STD3_mapped",[33,33]],[[8253,8253],"valid",[],"NV8"],[[8254,8254],"disallowed_STD3_mapped",[32,773]],[[8255,8262],"valid",[],"NV8"],[[8263,8263],"disallowed_STD3_mapped",[63,63]],[[8264,8264],"disallowed_STD3_mapped",[63,33]],[[8265,8265],"disallowed_STD3_mapped",[33,63]],[[8266,8269],"valid",[],"NV8"],[[8270,8274],"valid",[],"NV8"],[[8275,8276],"valid",[],"NV8"],[[8277,8278],"valid",[],"NV8"],[[8279,8279],"mapped",[8242,8242,8242,8242]],[[8280,8286],"valid",[],"NV8"],[[8287,8287],"disallowed_STD3_mapped",[32]],[[8288,8288],"ignored"],[[8289,8291],"disallowed"],[[8292,8292],"ignored"],[[8293,8293],"disallowed"],[[8294,8297],"disallowed"],[[8298,8303],"disallowed"],[[8304,8304],"mapped",[48]],[[8305,8305],"mapped",[105]],[[8306,8307],"disallowed"],[[8308,8308],"mapped",[52]],[[8309,8309],"mapped",[53]],[[8310,8310],"mapped",[54]],[[8311,8311],"mapped",[55]],[[8312,8312],"mapped",[56]],[[8313,8313],"mapped",[57]],[[8314,8314],"disallowed_STD3_mapped",[43]],[[8315,8315],"mapped",[8722]],[[8316,8316],"disallowed_STD3_mapped",[61]],[[8317,8317],"disallowed_STD3_mapped",[40]],[[8318,8318],"disallowed_STD3_mapped",[41]],[[8319,8319],"mapped",[110]],[[8320,8320],"mapped",[48]],[[8321,8321],"mapped",[49]],[[8322,8322],"mapped",[50]],[[8323,8323],"mapped",[51]],[[8324,8324],"mapped",[52]],[[8325,8325],"mapped",[53]],[[8326,8326],"mapped",[54]],[[8327,8327],"mapped",[55]],[[8328,8328],"mapped",[56]],[[8329,8329],"mapped",[57]],[[8330,8330],"disallowed_STD3_mapped",[43]],[[8331,8331],"mapped",[8722]],[[8332,8332],"disallowed_STD3_mapped",[61]],[[8333,8333],"disallowed_STD3_mapped",[40]],[[8334,8334],"disallowed_STD3_mapped",[41]],[[8335,8335],"disallowed"],[[8336,8336],"mapped",[97]],[[8337,8337],"mapped",[101]],[[8338,8338],"mapped",[111]],[[8339,8339],"mapped",[120]],[[8340,8340],"mapped",[601]],[[8341,8341],"mapped",[104]],[[8342,8342],"mapped",[107]],[[8343,8343],"mapped",[108]],[[8344,8344],"mapped",[109]],[[8345,8345],"mapped",[110]],[[8346,8346],"mapped",[112]],[[8347,8347],"mapped",[115]],[[8348,8348],"mapped",[116]],[[8349,8351],"disallowed"],[[8352,8359],"valid",[],"NV8"],[[8360,8360],"mapped",[114,115]],[[8361,8362],"valid",[],"NV8"],[[8363,8363],"valid",[],"NV8"],[[8364,8364],"valid",[],"NV8"],[[8365,8367],"valid",[],"NV8"],[[8368,8369],"valid",[],"NV8"],[[8370,8373],"valid",[],"NV8"],[[8374,8376],"valid",[],"NV8"],[[8377,8377],"valid",[],"NV8"],[[8378,8378],"valid",[],"NV8"],[[8379,8381],"valid",[],"NV8"],[[8382,8382],"valid",[],"NV8"],[[8383,8399],"disallowed"],[[8400,8417],"valid",[],"NV8"],[[8418,8419],"valid",[],"NV8"],[[8420,8426],"valid",[],"NV8"],[[8427,8427],"valid",[],"NV8"],[[8428,8431],"valid",[],"NV8"],[[8432,8432],"valid",[],"NV8"],[[8433,8447],"disallowed"],[[8448,8448],"disallowed_STD3_mapped",[97,47,99]],[[8449,8449],"disallowed_STD3_mapped",[97,47,115]],[[8450,8450],"mapped",[99]],[[8451,8451],"mapped",[176,99]],[[8452,8452],"valid",[],"NV8"],[[8453,8453],"disallowed_STD3_mapped",[99,47,111]],[[8454,8454],"disallowed_STD3_mapped",[99,47,117]],[[8455,8455],"mapped",[603]],[[8456,8456],"valid",[],"NV8"],[[8457,8457],"mapped",[176,102]],[[8458,8458],"mapped",[103]],[[8459,8462],"mapped",[104]],[[8463,8463],"mapped",[295]],[[8464,8465],"mapped",[105]],[[8466,8467],"mapped",[108]],[[8468,8468],"valid",[],"NV8"],[[8469,8469],"mapped",[110]],[[8470,8470],"mapped",[110,111]],[[8471,8472],"valid",[],"NV8"],[[8473,8473],"mapped",[112]],[[8474,8474],"mapped",[113]],[[8475,8477],"mapped",[114]],[[8478,8479],"valid",[],"NV8"],[[8480,8480],"mapped",[115,109]],[[8481,8481],"mapped",[116,101,108]],[[8482,8482],"mapped",[116,109]],[[8483,8483],"valid",[],"NV8"],[[8484,8484],"mapped",[122]],[[8485,8485],"valid",[],"NV8"],[[8486,8486],"mapped",[969]],[[8487,8487],"valid",[],"NV8"],[[8488,8488],"mapped",[122]],[[8489,8489],"valid",[],"NV8"],[[8490,8490],"mapped",[107]],[[8491,8491],"mapped",[229]],[[8492,8492],"mapped",[98]],[[8493,8493],"mapped",[99]],[[8494,8494],"valid",[],"NV8"],[[8495,8496],"mapped",[101]],[[8497,8497],"mapped",[102]],[[8498,8498],"disallowed"],[[8499,8499],"mapped",[109]],[[8500,8500],"mapped",[111]],[[8501,8501],"mapped",[1488]],[[8502,8502],"mapped",[1489]],[[8503,8503],"mapped",[1490]],[[8504,8504],"mapped",[1491]],[[8505,8505],"mapped",[105]],[[8506,8506],"valid",[],"NV8"],[[8507,8507],"mapped",[102,97,120]],[[8508,8508],"mapped",[960]],[[8509,8510],"mapped",[947]],[[8511,8511],"mapped",[960]],[[8512,8512],"mapped",[8721]],[[8513,8516],"valid",[],"NV8"],[[8517,8518],"mapped",[100]],[[8519,8519],"mapped",[101]],[[8520,8520],"mapped",[105]],[[8521,8521],"mapped",[106]],[[8522,8523],"valid",[],"NV8"],[[8524,8524],"valid",[],"NV8"],[[8525,8525],"valid",[],"NV8"],[[8526,8526],"valid"],[[8527,8527],"valid",[],"NV8"],[[8528,8528],"mapped",[49,8260,55]],[[8529,8529],"mapped",[49,8260,57]],[[8530,8530],"mapped",[49,8260,49,48]],[[8531,8531],"mapped",[49,8260,51]],[[8532,8532],"mapped",[50,8260,51]],[[8533,8533],"mapped",[49,8260,53]],[[8534,8534],"mapped",[50,8260,53]],[[8535,8535],"mapped",[51,8260,53]],[[8536,8536],"mapped",[52,8260,53]],[[8537,8537],"mapped",[49,8260,54]],[[8538,8538],"mapped",[53,8260,54]],[[8539,8539],"mapped",[49,8260,56]],[[8540,8540],"mapped",[51,8260,56]],[[8541,8541],"mapped",[53,8260,56]],[[8542,8542],"mapped",[55,8260,56]],[[8543,8543],"mapped",[49,8260]],[[8544,8544],"mapped",[105]],[[8545,8545],"mapped",[105,105]],[[8546,8546],"mapped",[105,105,105]],[[8547,8547],"mapped",[105,118]],[[8548,8548],"mapped",[118]],[[8549,8549],"mapped",[118,105]],[[8550,8550],"mapped",[118,105,105]],[[8551,8551],"mapped",[118,105,105,105]],[[8552,8552],"mapped",[105,120]],[[8553,8553],"mapped",[120]],[[8554,8554],"mapped",[120,105]],[[8555,8555],"mapped",[120,105,105]],[[8556,8556],"mapped",[108]],[[8557,8557],"mapped",[99]],[[8558,8558],"mapped",[100]],[[8559,8559],"mapped",[109]],[[8560,8560],"mapped",[105]],[[8561,8561],"mapped",[105,105]],[[8562,8562],"mapped",[105,105,105]],[[8563,8563],"mapped",[105,118]],[[8564,8564],"mapped",[118]],[[8565,8565],"mapped",[118,105]],[[8566,8566],"mapped",[118,105,105]],[[8567,8567],"mapped",[118,105,105,105]],[[8568,8568],"mapped",[105,120]],[[8569,8569],"mapped",[120]],[[8570,8570],"mapped",[120,105]],[[8571,8571],"mapped",[120,105,105]],[[8572,8572],"mapped",[108]],[[8573,8573],"mapped",[99]],[[8574,8574],"mapped",[100]],[[8575,8575],"mapped",[109]],[[8576,8578],"valid",[],"NV8"],[[8579,8579],"disallowed"],[[8580,8580],"valid"],[[8581,8584],"valid",[],"NV8"],[[8585,8585],"mapped",[48,8260,51]],[[8586,8587],"valid",[],"NV8"],[[8588,8591],"disallowed"],[[8592,8682],"valid",[],"NV8"],[[8683,8691],"valid",[],"NV8"],[[8692,8703],"valid",[],"NV8"],[[8704,8747],"valid",[],"NV8"],[[8748,8748],"mapped",[8747,8747]],[[8749,8749],"mapped",[8747,8747,8747]],[[8750,8750],"valid",[],"NV8"],[[8751,8751],"mapped",[8750,8750]],[[8752,8752],"mapped",[8750,8750,8750]],[[8753,8799],"valid",[],"NV8"],[[8800,8800],"disallowed_STD3_valid"],[[8801,8813],"valid",[],"NV8"],[[8814,8815],"disallowed_STD3_valid"],[[8816,8945],"valid",[],"NV8"],[[8946,8959],"valid",[],"NV8"],[[8960,8960],"valid",[],"NV8"],[[8961,8961],"valid",[],"NV8"],[[8962,9000],"valid",[],"NV8"],[[9001,9001],"mapped",[12296]],[[9002,9002],"mapped",[12297]],[[9003,9082],"valid",[],"NV8"],[[9083,9083],"valid",[],"NV8"],[[9084,9084],"valid",[],"NV8"],[[9085,9114],"valid",[],"NV8"],[[9115,9166],"valid",[],"NV8"],[[9167,9168],"valid",[],"NV8"],[[9169,9179],"valid",[],"NV8"],[[9180,9191],"valid",[],"NV8"],[[9192,9192],"valid",[],"NV8"],[[9193,9203],"valid",[],"NV8"],[[9204,9210],"valid",[],"NV8"],[[9211,9215],"disallowed"],[[9216,9252],"valid",[],"NV8"],[[9253,9254],"valid",[],"NV8"],[[9255,9279],"disallowed"],[[9280,9290],"valid",[],"NV8"],[[9291,9311],"disallowed"],[[9312,9312],"mapped",[49]],[[9313,9313],"mapped",[50]],[[9314,9314],"mapped",[51]],[[9315,9315],"mapped",[52]],[[9316,9316],"mapped",[53]],[[9317,9317],"mapped",[54]],[[9318,9318],"mapped",[55]],[[9319,9319],"mapped",[56]],[[9320,9320],"mapped",[57]],[[9321,9321],"mapped",[49,48]],[[9322,9322],"mapped",[49,49]],[[9323,9323],"mapped",[49,50]],[[9324,9324],"mapped",[49,51]],[[9325,9325],"mapped",[49,52]],[[9326,9326],"mapped",[49,53]],[[9327,9327],"mapped",[49,54]],[[9328,9328],"mapped",[49,55]],[[9329,9329],"mapped",[49,56]],[[9330,9330],"mapped",[49,57]],[[9331,9331],"mapped",[50,48]],[[9332,9332],"disallowed_STD3_mapped",[40,49,41]],[[9333,9333],"disallowed_STD3_mapped",[40,50,41]],[[9334,9334],"disallowed_STD3_mapped",[40,51,41]],[[9335,9335],"disallowed_STD3_mapped",[40,52,41]],[[9336,9336],"disallowed_STD3_mapped",[40,53,41]],[[9337,9337],"disallowed_STD3_mapped",[40,54,41]],[[9338,9338],"disallowed_STD3_mapped",[40,55,41]],[[9339,9339],"disallowed_STD3_mapped",[40,56,41]],[[9340,9340],"disallowed_STD3_mapped",[40,57,41]],[[9341,9341],"disallowed_STD3_mapped",[40,49,48,41]],[[9342,9342],"disallowed_STD3_mapped",[40,49,49,41]],[[9343,9343],"disallowed_STD3_mapped",[40,49,50,41]],[[9344,9344],"disallowed_STD3_mapped",[40,49,51,41]],[[9345,9345],"disallowed_STD3_mapped",[40,49,52,41]],[[9346,9346],"disallowed_STD3_mapped",[40,49,53,41]],[[9347,9347],"disallowed_STD3_mapped",[40,49,54,41]],[[9348,9348],"disallowed_STD3_mapped",[40,49,55,41]],[[9349,9349],"disallowed_STD3_mapped",[40,49,56,41]],[[9350,9350],"disallowed_STD3_mapped",[40,49,57,41]],[[9351,9351],"disallowed_STD3_mapped",[40,50,48,41]],[[9352,9371],"disallowed"],[[9372,9372],"disallowed_STD3_mapped",[40,97,41]],[[9373,9373],"disallowed_STD3_mapped",[40,98,41]],[[9374,9374],"disallowed_STD3_mapped",[40,99,41]],[[9375,9375],"disallowed_STD3_mapped",[40,100,41]],[[9376,9376],"disallowed_STD3_mapped",[40,101,41]],[[9377,9377],"disallowed_STD3_mapped",[40,102,41]],[[9378,9378],"disallowed_STD3_mapped",[40,103,41]],[[9379,9379],"disallowed_STD3_mapped",[40,104,41]],[[9380,9380],"disallowed_STD3_mapped",[40,105,41]],[[9381,9381],"disallowed_STD3_mapped",[40,106,41]],[[9382,9382],"disallowed_STD3_mapped",[40,107,41]],[[9383,9383],"disallowed_STD3_mapped",[40,108,41]],[[9384,9384],"disallowed_STD3_mapped",[40,109,41]],[[9385,9385],"disallowed_STD3_mapped",[40,110,41]],[[9386,9386],"disallowed_STD3_mapped",[40,111,41]],[[9387,9387],"disallowed_STD3_mapped",[40,112,41]],[[9388,9388],"disallowed_STD3_mapped",[40,113,41]],[[9389,9389],"disallowed_STD3_mapped",[40,114,41]],[[9390,9390],"disallowed_STD3_mapped",[40,115,41]],[[9391,9391],"disallowed_STD3_mapped",[40,116,41]],[[9392,9392],"disallowed_STD3_mapped",[40,117,41]],[[9393,9393],"disallowed_STD3_mapped",[40,118,41]],[[9394,9394],"disallowed_STD3_mapped",[40,119,41]],[[9395,9395],"disallowed_STD3_mapped",[40,120,41]],[[9396,9396],"disallowed_STD3_mapped",[40,121,41]],[[9397,9397],"disallowed_STD3_mapped",[40,122,41]],[[9398,9398],"mapped",[97]],[[9399,9399],"mapped",[98]],[[9400,9400],"mapped",[99]],[[9401,9401],"mapped",[100]],[[9402,9402],"mapped",[101]],[[9403,9403],"mapped",[102]],[[9404,9404],"mapped",[103]],[[9405,9405],"mapped",[104]],[[9406,9406],"mapped",[105]],[[9407,9407],"mapped",[106]],[[9408,9408],"mapped",[107]],[[9409,9409],"mapped",[108]],[[9410,9410],"mapped",[109]],[[9411,9411],"mapped",[110]],[[9412,9412],"mapped",[111]],[[9413,9413],"mapped",[112]],[[9414,9414],"mapped",[113]],[[9415,9415],"mapped",[114]],[[9416,9416],"mapped",[115]],[[9417,9417],"mapped",[116]],[[9418,9418],"mapped",[117]],[[9419,9419],"mapped",[118]],[[9420,9420],"mapped",[119]],[[9421,9421],"mapped",[120]],[[9422,9422],"mapped",[121]],[[9423,9423],"mapped",[122]],[[9424,9424],"mapped",[97]],[[9425,9425],"mapped",[98]],[[9426,9426],"mapped",[99]],[[9427,9427],"mapped",[100]],[[9428,9428],"mapped",[101]],[[9429,9429],"mapped",[102]],[[9430,9430],"mapped",[103]],[[9431,9431],"mapped",[104]],[[9432,9432],"mapped",[105]],[[9433,9433],"mapped",[106]],[[9434,9434],"mapped",[107]],[[9435,9435],"mapped",[108]],[[9436,9436],"mapped",[109]],[[9437,9437],"mapped",[110]],[[9438,9438],"mapped",[111]],[[9439,9439],"mapped",[112]],[[9440,9440],"mapped",[113]],[[9441,9441],"mapped",[114]],[[9442,9442],"mapped",[115]],[[9443,9443],"mapped",[116]],[[9444,9444],"mapped",[117]],[[9445,9445],"mapped",[118]],[[9446,9446],"mapped",[119]],[[9447,9447],"mapped",[120]],[[9448,9448],"mapped",[121]],[[9449,9449],"mapped",[122]],[[9450,9450],"mapped",[48]],[[9451,9470],"valid",[],"NV8"],[[9471,9471],"valid",[],"NV8"],[[9472,9621],"valid",[],"NV8"],[[9622,9631],"valid",[],"NV8"],[[9632,9711],"valid",[],"NV8"],[[9712,9719],"valid",[],"NV8"],[[9720,9727],"valid",[],"NV8"],[[9728,9747],"valid",[],"NV8"],[[9748,9749],"valid",[],"NV8"],[[9750,9751],"valid",[],"NV8"],[[9752,9752],"valid",[],"NV8"],[[9753,9753],"valid",[],"NV8"],[[9754,9839],"valid",[],"NV8"],[[9840,9841],"valid",[],"NV8"],[[9842,9853],"valid",[],"NV8"],[[9854,9855],"valid",[],"NV8"],[[9856,9865],"valid",[],"NV8"],[[9866,9873],"valid",[],"NV8"],[[9874,9884],"valid",[],"NV8"],[[9885,9885],"valid",[],"NV8"],[[9886,9887],"valid",[],"NV8"],[[9888,9889],"valid",[],"NV8"],[[9890,9905],"valid",[],"NV8"],[[9906,9906],"valid",[],"NV8"],[[9907,9916],"valid",[],"NV8"],[[9917,9919],"valid",[],"NV8"],[[9920,9923],"valid",[],"NV8"],[[9924,9933],"valid",[],"NV8"],[[9934,9934],"valid",[],"NV8"],[[9935,9953],"valid",[],"NV8"],[[9954,9954],"valid",[],"NV8"],[[9955,9955],"valid",[],"NV8"],[[9956,9959],"valid",[],"NV8"],[[9960,9983],"valid",[],"NV8"],[[9984,9984],"valid",[],"NV8"],[[9985,9988],"valid",[],"NV8"],[[9989,9989],"valid",[],"NV8"],[[9990,9993],"valid",[],"NV8"],[[9994,9995],"valid",[],"NV8"],[[9996,10023],"valid",[],"NV8"],[[10024,10024],"valid",[],"NV8"],[[10025,10059],"valid",[],"NV8"],[[10060,10060],"valid",[],"NV8"],[[10061,10061],"valid",[],"NV8"],[[10062,10062],"valid",[],"NV8"],[[10063,10066],"valid",[],"NV8"],[[10067,10069],"valid",[],"NV8"],[[10070,10070],"valid",[],"NV8"],[[10071,10071],"valid",[],"NV8"],[[10072,10078],"valid",[],"NV8"],[[10079,10080],"valid",[],"NV8"],[[10081,10087],"valid",[],"NV8"],[[10088,10101],"valid",[],"NV8"],[[10102,10132],"valid",[],"NV8"],[[10133,10135],"valid",[],"NV8"],[[10136,10159],"valid",[],"NV8"],[[10160,10160],"valid",[],"NV8"],[[10161,10174],"valid",[],"NV8"],[[10175,10175],"valid",[],"NV8"],[[10176,10182],"valid",[],"NV8"],[[10183,10186],"valid",[],"NV8"],[[10187,10187],"valid",[],"NV8"],[[10188,10188],"valid",[],"NV8"],[[10189,10189],"valid",[],"NV8"],[[10190,10191],"valid",[],"NV8"],[[10192,10219],"valid",[],"NV8"],[[10220,10223],"valid",[],"NV8"],[[10224,10239],"valid",[],"NV8"],[[10240,10495],"valid",[],"NV8"],[[10496,10763],"valid",[],"NV8"],[[10764,10764],"mapped",[8747,8747,8747,8747]],[[10765,10867],"valid",[],"NV8"],[[10868,10868],"disallowed_STD3_mapped",[58,58,61]],[[10869,10869],"disallowed_STD3_mapped",[61,61]],[[10870,10870],"disallowed_STD3_mapped",[61,61,61]],[[10871,10971],"valid",[],"NV8"],[[10972,10972],"mapped",[10973,824]],[[10973,11007],"valid",[],"NV8"],[[11008,11021],"valid",[],"NV8"],[[11022,11027],"valid",[],"NV8"],[[11028,11034],"valid",[],"NV8"],[[11035,11039],"valid",[],"NV8"],[[11040,11043],"valid",[],"NV8"],[[11044,11084],"valid",[],"NV8"],[[11085,11087],"valid",[],"NV8"],[[11088,11092],"valid",[],"NV8"],[[11093,11097],"valid",[],"NV8"],[[11098,11123],"valid",[],"NV8"],[[11124,11125],"disallowed"],[[11126,11157],"valid",[],"NV8"],[[11158,11159],"disallowed"],[[11160,11193],"valid",[],"NV8"],[[11194,11196],"disallowed"],[[11197,11208],"valid",[],"NV8"],[[11209,11209],"disallowed"],[[11210,11217],"valid",[],"NV8"],[[11218,11243],"disallowed"],[[11244,11247],"valid",[],"NV8"],[[11248,11263],"disallowed"],[[11264,11264],"mapped",[11312]],[[11265,11265],"mapped",[11313]],[[11266,11266],"mapped",[11314]],[[11267,11267],"mapped",[11315]],[[11268,11268],"mapped",[11316]],[[11269,11269],"mapped",[11317]],[[11270,11270],"mapped",[11318]],[[11271,11271],"mapped",[11319]],[[11272,11272],"mapped",[11320]],[[11273,11273],"mapped",[11321]],[[11274,11274],"mapped",[11322]],[[11275,11275],"mapped",[11323]],[[11276,11276],"mapped",[11324]],[[11277,11277],"mapped",[11325]],[[11278,11278],"mapped",[11326]],[[11279,11279],"mapped",[11327]],[[11280,11280],"mapped",[11328]],[[11281,11281],"mapped",[11329]],[[11282,11282],"mapped",[11330]],[[11283,11283],"mapped",[11331]],[[11284,11284],"mapped",[11332]],[[11285,11285],"mapped",[11333]],[[11286,11286],"mapped",[11334]],[[11287,11287],"mapped",[11335]],[[11288,11288],"mapped",[11336]],[[11289,11289],"mapped",[11337]],[[11290,11290],"mapped",[11338]],[[11291,11291],"mapped",[11339]],[[11292,11292],"mapped",[11340]],[[11293,11293],"mapped",[11341]],[[11294,11294],"mapped",[11342]],[[11295,11295],"mapped",[11343]],[[11296,11296],"mapped",[11344]],[[11297,11297],"mapped",[11345]],[[11298,11298],"mapped",[11346]],[[11299,11299],"mapped",[11347]],[[11300,11300],"mapped",[11348]],[[11301,11301],"mapped",[11349]],[[11302,11302],"mapped",[11350]],[[11303,11303],"mapped",[11351]],[[11304,11304],"mapped",[11352]],[[11305,11305],"mapped",[11353]],[[11306,11306],"mapped",[11354]],[[11307,11307],"mapped",[11355]],[[11308,11308],"mapped",[11356]],[[11309,11309],"mapped",[11357]],[[11310,11310],"mapped",[11358]],[[11311,11311],"disallowed"],[[11312,11358],"valid"],[[11359,11359],"disallowed"],[[11360,11360],"mapped",[11361]],[[11361,11361],"valid"],[[11362,11362],"mapped",[619]],[[11363,11363],"mapped",[7549]],[[11364,11364],"mapped",[637]],[[11365,11366],"valid"],[[11367,11367],"mapped",[11368]],[[11368,11368],"valid"],[[11369,11369],"mapped",[11370]],[[11370,11370],"valid"],[[11371,11371],"mapped",[11372]],[[11372,11372],"valid"],[[11373,11373],"mapped",[593]],[[11374,11374],"mapped",[625]],[[11375,11375],"mapped",[592]],[[11376,11376],"mapped",[594]],[[11377,11377],"valid"],[[11378,11378],"mapped",[11379]],[[11379,11379],"valid"],[[11380,11380],"valid"],[[11381,11381],"mapped",[11382]],[[11382,11383],"valid"],[[11384,11387],"valid"],[[11388,11388],"mapped",[106]],[[11389,11389],"mapped",[118]],[[11390,11390],"mapped",[575]],[[11391,11391],"mapped",[576]],[[11392,11392],"mapped",[11393]],[[11393,11393],"valid"],[[11394,11394],"mapped",[11395]],[[11395,11395],"valid"],[[11396,11396],"mapped",[11397]],[[11397,11397],"valid"],[[11398,11398],"mapped",[11399]],[[11399,11399],"valid"],[[11400,11400],"mapped",[11401]],[[11401,11401],"valid"],[[11402,11402],"mapped",[11403]],[[11403,11403],"valid"],[[11404,11404],"mapped",[11405]],[[11405,11405],"valid"],[[11406,11406],"mapped",[11407]],[[11407,11407],"valid"],[[11408,11408],"mapped",[11409]],[[11409,11409],"valid"],[[11410,11410],"mapped",[11411]],[[11411,11411],"valid"],[[11412,11412],"mapped",[11413]],[[11413,11413],"valid"],[[11414,11414],"mapped",[11415]],[[11415,11415],"valid"],[[11416,11416],"mapped",[11417]],[[11417,11417],"valid"],[[11418,11418],"mapped",[11419]],[[11419,11419],"valid"],[[11420,11420],"mapped",[11421]],[[11421,11421],"valid"],[[11422,11422],"mapped",[11423]],[[11423,11423],"valid"],[[11424,11424],"mapped",[11425]],[[11425,11425],"valid"],[[11426,11426],"mapped",[11427]],[[11427,11427],"valid"],[[11428,11428],"mapped",[11429]],[[11429,11429],"valid"],[[11430,11430],"mapped",[11431]],[[11431,11431],"valid"],[[11432,11432],"mapped",[11433]],[[11433,11433],"valid"],[[11434,11434],"mapped",[11435]],[[11435,11435],"valid"],[[11436,11436],"mapped",[11437]],[[11437,11437],"valid"],[[11438,11438],"mapped",[11439]],[[11439,11439],"valid"],[[11440,11440],"mapped",[11441]],[[11441,11441],"valid"],[[11442,11442],"mapped",[11443]],[[11443,11443],"valid"],[[11444,11444],"mapped",[11445]],[[11445,11445],"valid"],[[11446,11446],"mapped",[11447]],[[11447,11447],"valid"],[[11448,11448],"mapped",[11449]],[[11449,11449],"valid"],[[11450,11450],"mapped",[11451]],[[11451,11451],"valid"],[[11452,11452],"mapped",[11453]],[[11453,11453],"valid"],[[11454,11454],"mapped",[11455]],[[11455,11455],"valid"],[[11456,11456],"mapped",[11457]],[[11457,11457],"valid"],[[11458,11458],"mapped",[11459]],[[11459,11459],"valid"],[[11460,11460],"mapped",[11461]],[[11461,11461],"valid"],[[11462,11462],"mapped",[11463]],[[11463,11463],"valid"],[[11464,11464],"mapped",[11465]],[[11465,11465],"valid"],[[11466,11466],"mapped",[11467]],[[11467,11467],"valid"],[[11468,11468],"mapped",[11469]],[[11469,11469],"valid"],[[11470,11470],"mapped",[11471]],[[11471,11471],"valid"],[[11472,11472],"mapped",[11473]],[[11473,11473],"valid"],[[11474,11474],"mapped",[11475]],[[11475,11475],"valid"],[[11476,11476],"mapped",[11477]],[[11477,11477],"valid"],[[11478,11478],"mapped",[11479]],[[11479,11479],"valid"],[[11480,11480],"mapped",[11481]],[[11481,11481],"valid"],[[11482,11482],"mapped",[11483]],[[11483,11483],"valid"],[[11484,11484],"mapped",[11485]],[[11485,11485],"valid"],[[11486,11486],"mapped",[11487]],[[11487,11487],"valid"],[[11488,11488],"mapped",[11489]],[[11489,11489],"valid"],[[11490,11490],"mapped",[11491]],[[11491,11492],"valid"],[[11493,11498],"valid",[],"NV8"],[[11499,11499],"mapped",[11500]],[[11500,11500],"valid"],[[11501,11501],"mapped",[11502]],[[11502,11505],"valid"],[[11506,11506],"mapped",[11507]],[[11507,11507],"valid"],[[11508,11512],"disallowed"],[[11513,11519],"valid",[],"NV8"],[[11520,11557],"valid"],[[11558,11558],"disallowed"],[[11559,11559],"valid"],[[11560,11564],"disallowed"],[[11565,11565],"valid"],[[11566,11567],"disallowed"],[[11568,11621],"valid"],[[11622,11623],"valid"],[[11624,11630],"disallowed"],[[11631,11631],"mapped",[11617]],[[11632,11632],"valid",[],"NV8"],[[11633,11646],"disallowed"],[[11647,11647],"valid"],[[11648,11670],"valid"],[[11671,11679],"disallowed"],[[11680,11686],"valid"],[[11687,11687],"disallowed"],[[11688,11694],"valid"],[[11695,11695],"disallowed"],[[11696,11702],"valid"],[[11703,11703],"disallowed"],[[11704,11710],"valid"],[[11711,11711],"disallowed"],[[11712,11718],"valid"],[[11719,11719],"disallowed"],[[11720,11726],"valid"],[[11727,11727],"disallowed"],[[11728,11734],"valid"],[[11735,11735],"disallowed"],[[11736,11742],"valid"],[[11743,11743],"disallowed"],[[11744,11775],"valid"],[[11776,11799],"valid",[],"NV8"],[[11800,11803],"valid",[],"NV8"],[[11804,11805],"valid",[],"NV8"],[[11806,11822],"valid",[],"NV8"],[[11823,11823],"valid"],[[11824,11824],"valid",[],"NV8"],[[11825,11825],"valid",[],"NV8"],[[11826,11835],"valid",[],"NV8"],[[11836,11842],"valid",[],"NV8"],[[11843,11903],"disallowed"],[[11904,11929],"valid",[],"NV8"],[[11930,11930],"disallowed"],[[11931,11934],"valid",[],"NV8"],[[11935,11935],"mapped",[27597]],[[11936,12018],"valid",[],"NV8"],[[12019,12019],"mapped",[40863]],[[12020,12031],"disallowed"],[[12032,12032],"mapped",[19968]],[[12033,12033],"mapped",[20008]],[[12034,12034],"mapped",[20022]],[[12035,12035],"mapped",[20031]],[[12036,12036],"mapped",[20057]],[[12037,12037],"mapped",[20101]],[[12038,12038],"mapped",[20108]],[[12039,12039],"mapped",[20128]],[[12040,12040],"mapped",[20154]],[[12041,12041],"mapped",[20799]],[[12042,12042],"mapped",[20837]],[[12043,12043],"mapped",[20843]],[[12044,12044],"mapped",[20866]],[[12045,12045],"mapped",[20886]],[[12046,12046],"mapped",[20907]],[[12047,12047],"mapped",[20960]],[[12048,12048],"mapped",[20981]],[[12049,12049],"mapped",[20992]],[[12050,12050],"mapped",[21147]],[[12051,12051],"mapped",[21241]],[[12052,12052],"mapped",[21269]],[[12053,12053],"mapped",[21274]],[[12054,12054],"mapped",[21304]],[[12055,12055],"mapped",[21313]],[[12056,12056],"mapped",[21340]],[[12057,12057],"mapped",[21353]],[[12058,12058],"mapped",[21378]],[[12059,12059],"mapped",[21430]],[[12060,12060],"mapped",[21448]],[[12061,12061],"mapped",[21475]],[[12062,12062],"mapped",[22231]],[[12063,12063],"mapped",[22303]],[[12064,12064],"mapped",[22763]],[[12065,12065],"mapped",[22786]],[[12066,12066],"mapped",[22794]],[[12067,12067],"mapped",[22805]],[[12068,12068],"mapped",[22823]],[[12069,12069],"mapped",[22899]],[[12070,12070],"mapped",[23376]],[[12071,12071],"mapped",[23424]],[[12072,12072],"mapped",[23544]],[[12073,12073],"mapped",[23567]],[[12074,12074],"mapped",[23586]],[[12075,12075],"mapped",[23608]],[[12076,12076],"mapped",[23662]],[[12077,12077],"mapped",[23665]],[[12078,12078],"mapped",[24027]],[[12079,12079],"mapped",[24037]],[[12080,12080],"mapped",[24049]],[[12081,12081],"mapped",[24062]],[[12082,12082],"mapped",[24178]],[[12083,12083],"mapped",[24186]],[[12084,12084],"mapped",[24191]],[[12085,12085],"mapped",[24308]],[[12086,12086],"mapped",[24318]],[[12087,12087],"mapped",[24331]],[[12088,12088],"mapped",[24339]],[[12089,12089],"mapped",[24400]],[[12090,12090],"mapped",[24417]],[[12091,12091],"mapped",[24435]],[[12092,12092],"mapped",[24515]],[[12093,12093],"mapped",[25096]],[[12094,12094],"mapped",[25142]],[[12095,12095],"mapped",[25163]],[[12096,12096],"mapped",[25903]],[[12097,12097],"mapped",[25908]],[[12098,12098],"mapped",[25991]],[[12099,12099],"mapped",[26007]],[[12100,12100],"mapped",[26020]],[[12101,12101],"mapped",[26041]],[[12102,12102],"mapped",[26080]],[[12103,12103],"mapped",[26085]],[[12104,12104],"mapped",[26352]],[[12105,12105],"mapped",[26376]],[[12106,12106],"mapped",[26408]],[[12107,12107],"mapped",[27424]],[[12108,12108],"mapped",[27490]],[[12109,12109],"mapped",[27513]],[[12110,12110],"mapped",[27571]],[[12111,12111],"mapped",[27595]],[[12112,12112],"mapped",[27604]],[[12113,12113],"mapped",[27611]],[[12114,12114],"mapped",[27663]],[[12115,12115],"mapped",[27668]],[[12116,12116],"mapped",[27700]],[[12117,12117],"mapped",[28779]],[[12118,12118],"mapped",[29226]],[[12119,12119],"mapped",[29238]],[[12120,12120],"mapped",[29243]],[[12121,12121],"mapped",[29247]],[[12122,12122],"mapped",[29255]],[[12123,12123],"mapped",[29273]],[[12124,12124],"mapped",[29275]],[[12125,12125],"mapped",[29356]],[[12126,12126],"mapped",[29572]],[[12127,12127],"mapped",[29577]],[[12128,12128],"mapped",[29916]],[[12129,12129],"mapped",[29926]],[[12130,12130],"mapped",[29976]],[[12131,12131],"mapped",[29983]],[[12132,12132],"mapped",[29992]],[[12133,12133],"mapped",[30000]],[[12134,12134],"mapped",[30091]],[[12135,12135],"mapped",[30098]],[[12136,12136],"mapped",[30326]],[[12137,12137],"mapped",[30333]],[[12138,12138],"mapped",[30382]],[[12139,12139],"mapped",[30399]],[[12140,12140],"mapped",[30446]],[[12141,12141],"mapped",[30683]],[[12142,12142],"mapped",[30690]],[[12143,12143],"mapped",[30707]],[[12144,12144],"mapped",[31034]],[[12145,12145],"mapped",[31160]],[[12146,12146],"mapped",[31166]],[[12147,12147],"mapped",[31348]],[[12148,12148],"mapped",[31435]],[[12149,12149],"mapped",[31481]],[[12150,12150],"mapped",[31859]],[[12151,12151],"mapped",[31992]],[[12152,12152],"mapped",[32566]],[[12153,12153],"mapped",[32593]],[[12154,12154],"mapped",[32650]],[[12155,12155],"mapped",[32701]],[[12156,12156],"mapped",[32769]],[[12157,12157],"mapped",[32780]],[[12158,12158],"mapped",[32786]],[[12159,12159],"mapped",[32819]],[[12160,12160],"mapped",[32895]],[[12161,12161],"mapped",[32905]],[[12162,12162],"mapped",[33251]],[[12163,12163],"mapped",[33258]],[[12164,12164],"mapped",[33267]],[[12165,12165],"mapped",[33276]],[[12166,12166],"mapped",[33292]],[[12167,12167],"mapped",[33307]],[[12168,12168],"mapped",[33311]],[[12169,12169],"mapped",[33390]],[[12170,12170],"mapped",[33394]],[[12171,12171],"mapped",[33400]],[[12172,12172],"mapped",[34381]],[[12173,12173],"mapped",[34411]],[[12174,12174],"mapped",[34880]],[[12175,12175],"mapped",[34892]],[[12176,12176],"mapped",[34915]],[[12177,12177],"mapped",[35198]],[[12178,12178],"mapped",[35211]],[[12179,12179],"mapped",[35282]],[[12180,12180],"mapped",[35328]],[[12181,12181],"mapped",[35895]],[[12182,12182],"mapped",[35910]],[[12183,12183],"mapped",[35925]],[[12184,12184],"mapped",[35960]],[[12185,12185],"mapped",[35997]],[[12186,12186],"mapped",[36196]],[[12187,12187],"mapped",[36208]],[[12188,12188],"mapped",[36275]],[[12189,12189],"mapped",[36523]],[[12190,12190],"mapped",[36554]],[[12191,12191],"mapped",[36763]],[[12192,12192],"mapped",[36784]],[[12193,12193],"mapped",[36789]],[[12194,12194],"mapped",[37009]],[[12195,12195],"mapped",[37193]],[[12196,12196],"mapped",[37318]],[[12197,12197],"mapped",[37324]],[[12198,12198],"mapped",[37329]],[[12199,12199],"mapped",[38263]],[[12200,12200],"mapped",[38272]],[[12201,12201],"mapped",[38428]],[[12202,12202],"mapped",[38582]],[[12203,12203],"mapped",[38585]],[[12204,12204],"mapped",[38632]],[[12205,12205],"mapped",[38737]],[[12206,12206],"mapped",[38750]],[[12207,12207],"mapped",[38754]],[[12208,12208],"mapped",[38761]],[[12209,12209],"mapped",[38859]],[[12210,12210],"mapped",[38893]],[[12211,12211],"mapped",[38899]],[[12212,12212],"mapped",[38913]],[[12213,12213],"mapped",[39080]],[[12214,12214],"mapped",[39131]],[[12215,12215],"mapped",[39135]],[[12216,12216],"mapped",[39318]],[[12217,12217],"mapped",[39321]],[[12218,12218],"mapped",[39340]],[[12219,12219],"mapped",[39592]],[[12220,12220],"mapped",[39640]],[[12221,12221],"mapped",[39647]],[[12222,12222],"mapped",[39717]],[[12223,12223],"mapped",[39727]],[[12224,12224],"mapped",[39730]],[[12225,12225],"mapped",[39740]],[[12226,12226],"mapped",[39770]],[[12227,12227],"mapped",[40165]],[[12228,12228],"mapped",[40565]],[[12229,12229],"mapped",[40575]],[[12230,12230],"mapped",[40613]],[[12231,12231],"mapped",[40635]],[[12232,12232],"mapped",[40643]],[[12233,12233],"mapped",[40653]],[[12234,12234],"mapped",[40657]],[[12235,12235],"mapped",[40697]],[[12236,12236],"mapped",[40701]],[[12237,12237],"mapped",[40718]],[[12238,12238],"mapped",[40723]],[[12239,12239],"mapped",[40736]],[[12240,12240],"mapped",[40763]],[[12241,12241],"mapped",[40778]],[[12242,12242],"mapped",[40786]],[[12243,12243],"mapped",[40845]],[[12244,12244],"mapped",[40860]],[[12245,12245],"mapped",[40864]],[[12246,12271],"disallowed"],[[12272,12283],"disallowed"],[[12284,12287],"disallowed"],[[12288,12288],"disallowed_STD3_mapped",[32]],[[12289,12289],"valid",[],"NV8"],[[12290,12290],"mapped",[46]],[[12291,12292],"valid",[],"NV8"],[[12293,12295],"valid"],[[12296,12329],"valid",[],"NV8"],[[12330,12333],"valid"],[[12334,12341],"valid",[],"NV8"],[[12342,12342],"mapped",[12306]],[[12343,12343],"valid",[],"NV8"],[[12344,12344],"mapped",[21313]],[[12345,12345],"mapped",[21316]],[[12346,12346],"mapped",[21317]],[[12347,12347],"valid",[],"NV8"],[[12348,12348],"valid"],[[12349,12349],"valid",[],"NV8"],[[12350,12350],"valid",[],"NV8"],[[12351,12351],"valid",[],"NV8"],[[12352,12352],"disallowed"],[[12353,12436],"valid"],[[12437,12438],"valid"],[[12439,12440],"disallowed"],[[12441,12442],"valid"],[[12443,12443],"disallowed_STD3_mapped",[32,12441]],[[12444,12444],"disallowed_STD3_mapped",[32,12442]],[[12445,12446],"valid"],[[12447,12447],"mapped",[12424,12426]],[[12448,12448],"valid",[],"NV8"],[[12449,12542],"valid"],[[12543,12543],"mapped",[12467,12488]],[[12544,12548],"disallowed"],[[12549,12588],"valid"],[[12589,12589],"valid"],[[12590,12592],"disallowed"],[[12593,12593],"mapped",[4352]],[[12594,12594],"mapped",[4353]],[[12595,12595],"mapped",[4522]],[[12596,12596],"mapped",[4354]],[[12597,12597],"mapped",[4524]],[[12598,12598],"mapped",[4525]],[[12599,12599],"mapped",[4355]],[[12600,12600],"mapped",[4356]],[[12601,12601],"mapped",[4357]],[[12602,12602],"mapped",[4528]],[[12603,12603],"mapped",[4529]],[[12604,12604],"mapped",[4530]],[[12605,12605],"mapped",[4531]],[[12606,12606],"mapped",[4532]],[[12607,12607],"mapped",[4533]],[[12608,12608],"mapped",[4378]],[[12609,12609],"mapped",[4358]],[[12610,12610],"mapped",[4359]],[[12611,12611],"mapped",[4360]],[[12612,12612],"mapped",[4385]],[[12613,12613],"mapped",[4361]],[[12614,12614],"mapped",[4362]],[[12615,12615],"mapped",[4363]],[[12616,12616],"mapped",[4364]],[[12617,12617],"mapped",[4365]],[[12618,12618],"mapped",[4366]],[[12619,12619],"mapped",[4367]],[[12620,12620],"mapped",[4368]],[[12621,12621],"mapped",[4369]],[[12622,12622],"mapped",[4370]],[[12623,12623],"mapped",[4449]],[[12624,12624],"mapped",[4450]],[[12625,12625],"mapped",[4451]],[[12626,12626],"mapped",[4452]],[[12627,12627],"mapped",[4453]],[[12628,12628],"mapped",[4454]],[[12629,12629],"mapped",[4455]],[[12630,12630],"mapped",[4456]],[[12631,12631],"mapped",[4457]],[[12632,12632],"mapped",[4458]],[[12633,12633],"mapped",[4459]],[[12634,12634],"mapped",[4460]],[[12635,12635],"mapped",[4461]],[[12636,12636],"mapped",[4462]],[[12637,12637],"mapped",[4463]],[[12638,12638],"mapped",[4464]],[[12639,12639],"mapped",[4465]],[[12640,12640],"mapped",[4466]],[[12641,12641],"mapped",[4467]],[[12642,12642],"mapped",[4468]],[[12643,12643],"mapped",[4469]],[[12644,12644],"disallowed"],[[12645,12645],"mapped",[4372]],[[12646,12646],"mapped",[4373]],[[12647,12647],"mapped",[4551]],[[12648,12648],"mapped",[4552]],[[12649,12649],"mapped",[4556]],[[12650,12650],"mapped",[4558]],[[12651,12651],"mapped",[4563]],[[12652,12652],"mapped",[4567]],[[12653,12653],"mapped",[4569]],[[12654,12654],"mapped",[4380]],[[12655,12655],"mapped",[4573]],[[12656,12656],"mapped",[4575]],[[12657,12657],"mapped",[4381]],[[12658,12658],"mapped",[4382]],[[12659,12659],"mapped",[4384]],[[12660,12660],"mapped",[4386]],[[12661,12661],"mapped",[4387]],[[12662,12662],"mapped",[4391]],[[12663,12663],"mapped",[4393]],[[12664,12664],"mapped",[4395]],[[12665,12665],"mapped",[4396]],[[12666,12666],"mapped",[4397]],[[12667,12667],"mapped",[4398]],[[12668,12668],"mapped",[4399]],[[12669,12669],"mapped",[4402]],[[12670,12670],"mapped",[4406]],[[12671,12671],"mapped",[4416]],[[12672,12672],"mapped",[4423]],[[12673,12673],"mapped",[4428]],[[12674,12674],"mapped",[4593]],[[12675,12675],"mapped",[4594]],[[12676,12676],"mapped",[4439]],[[12677,12677],"mapped",[4440]],[[12678,12678],"mapped",[4441]],[[12679,12679],"mapped",[4484]],[[12680,12680],"mapped",[4485]],[[12681,12681],"mapped",[4488]],[[12682,12682],"mapped",[4497]],[[12683,12683],"mapped",[4498]],[[12684,12684],"mapped",[4500]],[[12685,12685],"mapped",[4510]],[[12686,12686],"mapped",[4513]],[[12687,12687],"disallowed"],[[12688,12689],"valid",[],"NV8"],[[12690,12690],"mapped",[19968]],[[12691,12691],"mapped",[20108]],[[12692,12692],"mapped",[19977]],[[12693,12693],"mapped",[22235]],[[12694,12694],"mapped",[19978]],[[12695,12695],"mapped",[20013]],[[12696,12696],"mapped",[19979]],[[12697,12697],"mapped",[30002]],[[12698,12698],"mapped",[20057]],[[12699,12699],"mapped",[19993]],[[12700,12700],"mapped",[19969]],[[12701,12701],"mapped",[22825]],[[12702,12702],"mapped",[22320]],[[12703,12703],"mapped",[20154]],[[12704,12727],"valid"],[[12728,12730],"valid"],[[12731,12735],"disallowed"],[[12736,12751],"valid",[],"NV8"],[[12752,12771],"valid",[],"NV8"],[[12772,12783],"disallowed"],[[12784,12799],"valid"],[[12800,12800],"disallowed_STD3_mapped",[40,4352,41]],[[12801,12801],"disallowed_STD3_mapped",[40,4354,41]],[[12802,12802],"disallowed_STD3_mapped",[40,4355,41]],[[12803,12803],"disallowed_STD3_mapped",[40,4357,41]],[[12804,12804],"disallowed_STD3_mapped",[40,4358,41]],[[12805,12805],"disallowed_STD3_mapped",[40,4359,41]],[[12806,12806],"disallowed_STD3_mapped",[40,4361,41]],[[12807,12807],"disallowed_STD3_mapped",[40,4363,41]],[[12808,12808],"disallowed_STD3_mapped",[40,4364,41]],[[12809,12809],"disallowed_STD3_mapped",[40,4366,41]],[[12810,12810],"disallowed_STD3_mapped",[40,4367,41]],[[12811,12811],"disallowed_STD3_mapped",[40,4368,41]],[[12812,12812],"disallowed_STD3_mapped",[40,4369,41]],[[12813,12813],"disallowed_STD3_mapped",[40,4370,41]],[[12814,12814],"disallowed_STD3_mapped",[40,44032,41]],[[12815,12815],"disallowed_STD3_mapped",[40,45208,41]],[[12816,12816],"disallowed_STD3_mapped",[40,45796,41]],[[12817,12817],"disallowed_STD3_mapped",[40,46972,41]],[[12818,12818],"disallowed_STD3_mapped",[40,47560,41]],[[12819,12819],"disallowed_STD3_mapped",[40,48148,41]],[[12820,12820],"disallowed_STD3_mapped",[40,49324,41]],[[12821,12821],"disallowed_STD3_mapped",[40,50500,41]],[[12822,12822],"disallowed_STD3_mapped",[40,51088,41]],[[12823,12823],"disallowed_STD3_mapped",[40,52264,41]],[[12824,12824],"disallowed_STD3_mapped",[40,52852,41]],[[12825,12825],"disallowed_STD3_mapped",[40,53440,41]],[[12826,12826],"disallowed_STD3_mapped",[40,54028,41]],[[12827,12827],"disallowed_STD3_mapped",[40,54616,41]],[[12828,12828],"disallowed_STD3_mapped",[40,51452,41]],[[12829,12829],"disallowed_STD3_mapped",[40,50724,51204,41]],[[12830,12830],"disallowed_STD3_mapped",[40,50724,54980,41]],[[12831,12831],"disallowed"],[[12832,12832],"disallowed_STD3_mapped",[40,19968,41]],[[12833,12833],"disallowed_STD3_mapped",[40,20108,41]],[[12834,12834],"disallowed_STD3_mapped",[40,19977,41]],[[12835,12835],"disallowed_STD3_mapped",[40,22235,41]],[[12836,12836],"disallowed_STD3_mapped",[40,20116,41]],[[12837,12837],"disallowed_STD3_mapped",[40,20845,41]],[[12838,12838],"disallowed_STD3_mapped",[40,19971,41]],[[12839,12839],"disallowed_STD3_mapped",[40,20843,41]],[[12840,12840],"disallowed_STD3_mapped",[40,20061,41]],[[12841,12841],"disallowed_STD3_mapped",[40,21313,41]],[[12842,12842],"disallowed_STD3_mapped",[40,26376,41]],[[12843,12843],"disallowed_STD3_mapped",[40,28779,41]],[[12844,12844],"disallowed_STD3_mapped",[40,27700,41]],[[12845,12845],"disallowed_STD3_mapped",[40,26408,41]],[[12846,12846],"disallowed_STD3_mapped",[40,37329,41]],[[12847,12847],"disallowed_STD3_mapped",[40,22303,41]],[[12848,12848],"disallowed_STD3_mapped",[40,26085,41]],[[12849,12849],"disallowed_STD3_mapped",[40,26666,41]],[[12850,12850],"disallowed_STD3_mapped",[40,26377,41]],[[12851,12851],"disallowed_STD3_mapped",[40,31038,41]],[[12852,12852],"disallowed_STD3_mapped",[40,21517,41]],[[12853,12853],"disallowed_STD3_mapped",[40,29305,41]],[[12854,12854],"disallowed_STD3_mapped",[40,36001,41]],[[12855,12855],"disallowed_STD3_mapped",[40,31069,41]],[[12856,12856],"disallowed_STD3_mapped",[40,21172,41]],[[12857,12857],"disallowed_STD3_mapped",[40,20195,41]],[[12858,12858],"disallowed_STD3_mapped",[40,21628,41]],[[12859,12859],"disallowed_STD3_mapped",[40,23398,41]],[[12860,12860],"disallowed_STD3_mapped",[40,30435,41]],[[12861,12861],"disallowed_STD3_mapped",[40,20225,41]],[[12862,12862],"disallowed_STD3_mapped",[40,36039,41]],[[12863,12863],"disallowed_STD3_mapped",[40,21332,41]],[[12864,12864],"disallowed_STD3_mapped",[40,31085,41]],[[12865,12865],"disallowed_STD3_mapped",[40,20241,41]],[[12866,12866],"disallowed_STD3_mapped",[40,33258,41]],[[12867,12867],"disallowed_STD3_mapped",[40,33267,41]],[[12868,12868],"mapped",[21839]],[[12869,12869],"mapped",[24188]],[[12870,12870],"mapped",[25991]],[[12871,12871],"mapped",[31631]],[[12872,12879],"valid",[],"NV8"],[[12880,12880],"mapped",[112,116,101]],[[12881,12881],"mapped",[50,49]],[[12882,12882],"mapped",[50,50]],[[12883,12883],"mapped",[50,51]],[[12884,12884],"mapped",[50,52]],[[12885,12885],"mapped",[50,53]],[[12886,12886],"mapped",[50,54]],[[12887,12887],"mapped",[50,55]],[[12888,12888],"mapped",[50,56]],[[12889,12889],"mapped",[50,57]],[[12890,12890],"mapped",[51,48]],[[12891,12891],"mapped",[51,49]],[[12892,12892],"mapped",[51,50]],[[12893,12893],"mapped",[51,51]],[[12894,12894],"mapped",[51,52]],[[12895,12895],"mapped",[51,53]],[[12896,12896],"mapped",[4352]],[[12897,12897],"mapped",[4354]],[[12898,12898],"mapped",[4355]],[[12899,12899],"mapped",[4357]],[[12900,12900],"mapped",[4358]],[[12901,12901],"mapped",[4359]],[[12902,12902],"mapped",[4361]],[[12903,12903],"mapped",[4363]],[[12904,12904],"mapped",[4364]],[[12905,12905],"mapped",[4366]],[[12906,12906],"mapped",[4367]],[[12907,12907],"mapped",[4368]],[[12908,12908],"mapped",[4369]],[[12909,12909],"mapped",[4370]],[[12910,12910],"mapped",[44032]],[[12911,12911],"mapped",[45208]],[[12912,12912],"mapped",[45796]],[[12913,12913],"mapped",[46972]],[[12914,12914],"mapped",[47560]],[[12915,12915],"mapped",[48148]],[[12916,12916],"mapped",[49324]],[[12917,12917],"mapped",[50500]],[[12918,12918],"mapped",[51088]],[[12919,12919],"mapped",[52264]],[[12920,12920],"mapped",[52852]],[[12921,12921],"mapped",[53440]],[[12922,12922],"mapped",[54028]],[[12923,12923],"mapped",[54616]],[[12924,12924],"mapped",[52280,44256]],[[12925,12925],"mapped",[51452,51032]],[[12926,12926],"mapped",[50864]],[[12927,12927],"valid",[],"NV8"],[[12928,12928],"mapped",[19968]],[[12929,12929],"mapped",[20108]],[[12930,12930],"mapped",[19977]],[[12931,12931],"mapped",[22235]],[[12932,12932],"mapped",[20116]],[[12933,12933],"mapped",[20845]],[[12934,12934],"mapped",[19971]],[[12935,12935],"mapped",[20843]],[[12936,12936],"mapped",[20061]],[[12937,12937],"mapped",[21313]],[[12938,12938],"mapped",[26376]],[[12939,12939],"mapped",[28779]],[[12940,12940],"mapped",[27700]],[[12941,12941],"mapped",[26408]],[[12942,12942],"mapped",[37329]],[[12943,12943],"mapped",[22303]],[[12944,12944],"mapped",[26085]],[[12945,12945],"mapped",[26666]],[[12946,12946],"mapped",[26377]],[[12947,12947],"mapped",[31038]],[[12948,12948],"mapped",[21517]],[[12949,12949],"mapped",[29305]],[[12950,12950],"mapped",[36001]],[[12951,12951],"mapped",[31069]],[[12952,12952],"mapped",[21172]],[[12953,12953],"mapped",[31192]],[[12954,12954],"mapped",[30007]],[[12955,12955],"mapped",[22899]],[[12956,12956],"mapped",[36969]],[[12957,12957],"mapped",[20778]],[[12958,12958],"mapped",[21360]],[[12959,12959],"mapped",[27880]],[[12960,12960],"mapped",[38917]],[[12961,12961],"mapped",[20241]],[[12962,12962],"mapped",[20889]],[[12963,12963],"mapped",[27491]],[[12964,12964],"mapped",[19978]],[[12965,12965],"mapped",[20013]],[[12966,12966],"mapped",[19979]],[[12967,12967],"mapped",[24038]],[[12968,12968],"mapped",[21491]],[[12969,12969],"mapped",[21307]],[[12970,12970],"mapped",[23447]],[[12971,12971],"mapped",[23398]],[[12972,12972],"mapped",[30435]],[[12973,12973],"mapped",[20225]],[[12974,12974],"mapped",[36039]],[[12975,12975],"mapped",[21332]],[[12976,12976],"mapped",[22812]],[[12977,12977],"mapped",[51,54]],[[12978,12978],"mapped",[51,55]],[[12979,12979],"mapped",[51,56]],[[12980,12980],"mapped",[51,57]],[[12981,12981],"mapped",[52,48]],[[12982,12982],"mapped",[52,49]],[[12983,12983],"mapped",[52,50]],[[12984,12984],"mapped",[52,51]],[[12985,12985],"mapped",[52,52]],[[12986,12986],"mapped",[52,53]],[[12987,12987],"mapped",[52,54]],[[12988,12988],"mapped",[52,55]],[[12989,12989],"mapped",[52,56]],[[12990,12990],"mapped",[52,57]],[[12991,12991],"mapped",[53,48]],[[12992,12992],"mapped",[49,26376]],[[12993,12993],"mapped",[50,26376]],[[12994,12994],"mapped",[51,26376]],[[12995,12995],"mapped",[52,26376]],[[12996,12996],"mapped",[53,26376]],[[12997,12997],"mapped",[54,26376]],[[12998,12998],"mapped",[55,26376]],[[12999,12999],"mapped",[56,26376]],[[13000,13000],"mapped",[57,26376]],[[13001,13001],"mapped",[49,48,26376]],[[13002,13002],"mapped",[49,49,26376]],[[13003,13003],"mapped",[49,50,26376]],[[13004,13004],"mapped",[104,103]],[[13005,13005],"mapped",[101,114,103]],[[13006,13006],"mapped",[101,118]],[[13007,13007],"mapped",[108,116,100]],[[13008,13008],"mapped",[12450]],[[13009,13009],"mapped",[12452]],[[13010,13010],"mapped",[12454]],[[13011,13011],"mapped",[12456]],[[13012,13012],"mapped",[12458]],[[13013,13013],"mapped",[12459]],[[13014,13014],"mapped",[12461]],[[13015,13015],"mapped",[12463]],[[13016,13016],"mapped",[12465]],[[13017,13017],"mapped",[12467]],[[13018,13018],"mapped",[12469]],[[13019,13019],"mapped",[12471]],[[13020,13020],"mapped",[12473]],[[13021,13021],"mapped",[12475]],[[13022,13022],"mapped",[12477]],[[13023,13023],"mapped",[12479]],[[13024,13024],"mapped",[12481]],[[13025,13025],"mapped",[12484]],[[13026,13026],"mapped",[12486]],[[13027,13027],"mapped",[12488]],[[13028,13028],"mapped",[12490]],[[13029,13029],"mapped",[12491]],[[13030,13030],"mapped",[12492]],[[13031,13031],"mapped",[12493]],[[13032,13032],"mapped",[12494]],[[13033,13033],"mapped",[12495]],[[13034,13034],"mapped",[12498]],[[13035,13035],"mapped",[12501]],[[13036,13036],"mapped",[12504]],[[13037,13037],"mapped",[12507]],[[13038,13038],"mapped",[12510]],[[13039,13039],"mapped",[12511]],[[13040,13040],"mapped",[12512]],[[13041,13041],"mapped",[12513]],[[13042,13042],"mapped",[12514]],[[13043,13043],"mapped",[12516]],[[13044,13044],"mapped",[12518]],[[13045,13045],"mapped",[12520]],[[13046,13046],"mapped",[12521]],[[13047,13047],"mapped",[12522]],[[13048,13048],"mapped",[12523]],[[13049,13049],"mapped",[12524]],[[13050,13050],"mapped",[12525]],[[13051,13051],"mapped",[12527]],[[13052,13052],"mapped",[12528]],[[13053,13053],"mapped",[12529]],[[13054,13054],"mapped",[12530]],[[13055,13055],"disallowed"],[[13056,13056],"mapped",[12450,12497,12540,12488]],[[13057,13057],"mapped",[12450,12523,12501,12449]],[[13058,13058],"mapped",[12450,12531,12506,12450]],[[13059,13059],"mapped",[12450,12540,12523]],[[13060,13060],"mapped",[12452,12491,12531,12464]],[[13061,13061],"mapped",[12452,12531,12481]],[[13062,13062],"mapped",[12454,12457,12531]],[[13063,13063],"mapped",[12456,12473,12463,12540,12489]],[[13064,13064],"mapped",[12456,12540,12459,12540]],[[13065,13065],"mapped",[12458,12531,12473]],[[13066,13066],"mapped",[12458,12540,12512]],[[13067,13067],"mapped",[12459,12452,12522]],[[13068,13068],"mapped",[12459,12521,12483,12488]],[[13069,13069],"mapped",[12459,12525,12522,12540]],[[13070,13070],"mapped",[12460,12525,12531]],[[13071,13071],"mapped",[12460,12531,12510]],[[13072,13072],"mapped",[12462,12460]],[[13073,13073],"mapped",[12462,12491,12540]],[[13074,13074],"mapped",[12461,12517,12522,12540]],[[13075,13075],"mapped",[12462,12523,12480,12540]],[[13076,13076],"mapped",[12461,12525]],[[13077,13077],"mapped",[12461,12525,12464,12521,12512]],[[13078,13078],"mapped",[12461,12525,12513,12540,12488,12523]],[[13079,13079],"mapped",[12461,12525,12527,12483,12488]],[[13080,13080],"mapped",[12464,12521,12512]],[[13081,13081],"mapped",[12464,12521,12512,12488,12531]],[[13082,13082],"mapped",[12463,12523,12476,12452,12525]],[[13083,13083],"mapped",[12463,12525,12540,12493]],[[13084,13084],"mapped",[12465,12540,12473]],[[13085,13085],"mapped",[12467,12523,12490]],[[13086,13086],"mapped",[12467,12540,12509]],[[13087,13087],"mapped",[12469,12452,12463,12523]],[[13088,13088],"mapped",[12469,12531,12481,12540,12512]],[[13089,13089],"mapped",[12471,12522,12531,12464]],[[13090,13090],"mapped",[12475,12531,12481]],[[13091,13091],"mapped",[12475,12531,12488]],[[13092,13092],"mapped",[12480,12540,12473]],[[13093,13093],"mapped",[12487,12471]],[[13094,13094],"mapped",[12489,12523]],[[13095,13095],"mapped",[12488,12531]],[[13096,13096],"mapped",[12490,12494]],[[13097,13097],"mapped",[12494,12483,12488]],[[13098,13098],"mapped",[12495,12452,12484]],[[13099,13099],"mapped",[12497,12540,12475,12531,12488]],[[13100,13100],"mapped",[12497,12540,12484]],[[13101,13101],"mapped",[12496,12540,12524,12523]],[[13102,13102],"mapped",[12500,12450,12473,12488,12523]],[[13103,13103],"mapped",[12500,12463,12523]],[[13104,13104],"mapped",[12500,12467]],[[13105,13105],"mapped",[12499,12523]],[[13106,13106],"mapped",[12501,12449,12521,12483,12489]],[[13107,13107],"mapped",[12501,12451,12540,12488]],[[13108,13108],"mapped",[12502,12483,12471,12455,12523]],[[13109,13109],"mapped",[12501,12521,12531]],[[13110,13110],"mapped",[12504,12463,12479,12540,12523]],[[13111,13111],"mapped",[12506,12477]],[[13112,13112],"mapped",[12506,12491,12498]],[[13113,13113],"mapped",[12504,12523,12484]],[[13114,13114],"mapped",[12506,12531,12473]],[[13115,13115],"mapped",[12506,12540,12472]],[[13116,13116],"mapped",[12505,12540,12479]],[[13117,13117],"mapped",[12509,12452,12531,12488]],[[13118,13118],"mapped",[12508,12523,12488]],[[13119,13119],"mapped",[12507,12531]],[[13120,13120],"mapped",[12509,12531,12489]],[[13121,13121],"mapped",[12507,12540,12523]],[[13122,13122],"mapped",[12507,12540,12531]],[[13123,13123],"mapped",[12510,12452,12463,12525]],[[13124,13124],"mapped",[12510,12452,12523]],[[13125,13125],"mapped",[12510,12483,12495]],[[13126,13126],"mapped",[12510,12523,12463]],[[13127,13127],"mapped",[12510,12531,12471,12519,12531]],[[13128,13128],"mapped",[12511,12463,12525,12531]],[[13129,13129],"mapped",[12511,12522]],[[13130,13130],"mapped",[12511,12522,12496,12540,12523]],[[13131,13131],"mapped",[12513,12460]],[[13132,13132],"mapped",[12513,12460,12488,12531]],[[13133,13133],"mapped",[12513,12540,12488,12523]],[[13134,13134],"mapped",[12516,12540,12489]],[[13135,13135],"mapped",[12516,12540,12523]],[[13136,13136],"mapped",[12518,12450,12531]],[[13137,13137],"mapped",[12522,12483,12488,12523]],[[13138,13138],"mapped",[12522,12521]],[[13139,13139],"mapped",[12523,12500,12540]],[[13140,13140],"mapped",[12523,12540,12502,12523]],[[13141,13141],"mapped",[12524,12512]],[[13142,13142],"mapped",[12524,12531,12488,12466,12531]],[[13143,13143],"mapped",[12527,12483,12488]],[[13144,13144],"mapped",[48,28857]],[[13145,13145],"mapped",[49,28857]],[[13146,13146],"mapped",[50,28857]],[[13147,13147],"mapped",[51,28857]],[[13148,13148],"mapped",[52,28857]],[[13149,13149],"mapped",[53,28857]],[[13150,13150],"mapped",[54,28857]],[[13151,13151],"mapped",[55,28857]],[[13152,13152],"mapped",[56,28857]],[[13153,13153],"mapped",[57,28857]],[[13154,13154],"mapped",[49,48,28857]],[[13155,13155],"mapped",[49,49,28857]],[[13156,13156],"mapped",[49,50,28857]],[[13157,13157],"mapped",[49,51,28857]],[[13158,13158],"mapped",[49,52,28857]],[[13159,13159],"mapped",[49,53,28857]],[[13160,13160],"mapped",[49,54,28857]],[[13161,13161],"mapped",[49,55,28857]],[[13162,13162],"mapped",[49,56,28857]],[[13163,13163],"mapped",[49,57,28857]],[[13164,13164],"mapped",[50,48,28857]],[[13165,13165],"mapped",[50,49,28857]],[[13166,13166],"mapped",[50,50,28857]],[[13167,13167],"mapped",[50,51,28857]],[[13168,13168],"mapped",[50,52,28857]],[[13169,13169],"mapped",[104,112,97]],[[13170,13170],"mapped",[100,97]],[[13171,13171],"mapped",[97,117]],[[13172,13172],"mapped",[98,97,114]],[[13173,13173],"mapped",[111,118]],[[13174,13174],"mapped",[112,99]],[[13175,13175],"mapped",[100,109]],[[13176,13176],"mapped",[100,109,50]],[[13177,13177],"mapped",[100,109,51]],[[13178,13178],"mapped",[105,117]],[[13179,13179],"mapped",[24179,25104]],[[13180,13180],"mapped",[26157,21644]],[[13181,13181],"mapped",[22823,27491]],[[13182,13182],"mapped",[26126,27835]],[[13183,13183],"mapped",[26666,24335,20250,31038]],[[13184,13184],"mapped",[112,97]],[[13185,13185],"mapped",[110,97]],[[13186,13186],"mapped",[956,97]],[[13187,13187],"mapped",[109,97]],[[13188,13188],"mapped",[107,97]],[[13189,13189],"mapped",[107,98]],[[13190,13190],"mapped",[109,98]],[[13191,13191],"mapped",[103,98]],[[13192,13192],"mapped",[99,97,108]],[[13193,13193],"mapped",[107,99,97,108]],[[13194,13194],"mapped",[112,102]],[[13195,13195],"mapped",[110,102]],[[13196,13196],"mapped",[956,102]],[[13197,13197],"mapped",[956,103]],[[13198,13198],"mapped",[109,103]],[[13199,13199],"mapped",[107,103]],[[13200,13200],"mapped",[104,122]],[[13201,13201],"mapped",[107,104,122]],[[13202,13202],"mapped",[109,104,122]],[[13203,13203],"mapped",[103,104,122]],[[13204,13204],"mapped",[116,104,122]],[[13205,13205],"mapped",[956,108]],[[13206,13206],"mapped",[109,108]],[[13207,13207],"mapped",[100,108]],[[13208,13208],"mapped",[107,108]],[[13209,13209],"mapped",[102,109]],[[13210,13210],"mapped",[110,109]],[[13211,13211],"mapped",[956,109]],[[13212,13212],"mapped",[109,109]],[[13213,13213],"mapped",[99,109]],[[13214,13214],"mapped",[107,109]],[[13215,13215],"mapped",[109,109,50]],[[13216,13216],"mapped",[99,109,50]],[[13217,13217],"mapped",[109,50]],[[13218,13218],"mapped",[107,109,50]],[[13219,13219],"mapped",[109,109,51]],[[13220,13220],"mapped",[99,109,51]],[[13221,13221],"mapped",[109,51]],[[13222,13222],"mapped",[107,109,51]],[[13223,13223],"mapped",[109,8725,115]],[[13224,13224],"mapped",[109,8725,115,50]],[[13225,13225],"mapped",[112,97]],[[13226,13226],"mapped",[107,112,97]],[[13227,13227],"mapped",[109,112,97]],[[13228,13228],"mapped",[103,112,97]],[[13229,13229],"mapped",[114,97,100]],[[13230,13230],"mapped",[114,97,100,8725,115]],[[13231,13231],"mapped",[114,97,100,8725,115,50]],[[13232,13232],"mapped",[112,115]],[[13233,13233],"mapped",[110,115]],[[13234,13234],"mapped",[956,115]],[[13235,13235],"mapped",[109,115]],[[13236,13236],"mapped",[112,118]],[[13237,13237],"mapped",[110,118]],[[13238,13238],"mapped",[956,118]],[[13239,13239],"mapped",[109,118]],[[13240,13240],"mapped",[107,118]],[[13241,13241],"mapped",[109,118]],[[13242,13242],"mapped",[112,119]],[[13243,13243],"mapped",[110,119]],[[13244,13244],"mapped",[956,119]],[[13245,13245],"mapped",[109,119]],[[13246,13246],"mapped",[107,119]],[[13247,13247],"mapped",[109,119]],[[13248,13248],"mapped",[107,969]],[[13249,13249],"mapped",[109,969]],[[13250,13250],"disallowed"],[[13251,13251],"mapped",[98,113]],[[13252,13252],"mapped",[99,99]],[[13253,13253],"mapped",[99,100]],[[13254,13254],"mapped",[99,8725,107,103]],[[13255,13255],"disallowed"],[[13256,13256],"mapped",[100,98]],[[13257,13257],"mapped",[103,121]],[[13258,13258],"mapped",[104,97]],[[13259,13259],"mapped",[104,112]],[[13260,13260],"mapped",[105,110]],[[13261,13261],"mapped",[107,107]],[[13262,13262],"mapped",[107,109]],[[13263,13263],"mapped",[107,116]],[[13264,13264],"mapped",[108,109]],[[13265,13265],"mapped",[108,110]],[[13266,13266],"mapped",[108,111,103]],[[13267,13267],"mapped",[108,120]],[[13268,13268],"mapped",[109,98]],[[13269,13269],"mapped",[109,105,108]],[[13270,13270],"mapped",[109,111,108]],[[13271,13271],"mapped",[112,104]],[[13272,13272],"disallowed"],[[13273,13273],"mapped",[112,112,109]],[[13274,13274],"mapped",[112,114]],[[13275,13275],"mapped",[115,114]],[[13276,13276],"mapped",[115,118]],[[13277,13277],"mapped",[119,98]],[[13278,13278],"mapped",[118,8725,109]],[[13279,13279],"mapped",[97,8725,109]],[[13280,13280],"mapped",[49,26085]],[[13281,13281],"mapped",[50,26085]],[[13282,13282],"mapped",[51,26085]],[[13283,13283],"mapped",[52,26085]],[[13284,13284],"mapped",[53,26085]],[[13285,13285],"mapped",[54,26085]],[[13286,13286],"mapped",[55,26085]],[[13287,13287],"mapped",[56,26085]],[[13288,13288],"mapped",[57,26085]],[[13289,13289],"mapped",[49,48,26085]],[[13290,13290],"mapped",[49,49,26085]],[[13291,13291],"mapped",[49,50,26085]],[[13292,13292],"mapped",[49,51,26085]],[[13293,13293],"mapped",[49,52,26085]],[[13294,13294],"mapped",[49,53,26085]],[[13295,13295],"mapped",[49,54,26085]],[[13296,13296],"mapped",[49,55,26085]],[[13297,13297],"mapped",[49,56,26085]],[[13298,13298],"mapped",[49,57,26085]],[[13299,13299],"mapped",[50,48,26085]],[[13300,13300],"mapped",[50,49,26085]],[[13301,13301],"mapped",[50,50,26085]],[[13302,13302],"mapped",[50,51,26085]],[[13303,13303],"mapped",[50,52,26085]],[[13304,13304],"mapped",[50,53,26085]],[[13305,13305],"mapped",[50,54,26085]],[[13306,13306],"mapped",[50,55,26085]],[[13307,13307],"mapped",[50,56,26085]],[[13308,13308],"mapped",[50,57,26085]],[[13309,13309],"mapped",[51,48,26085]],[[13310,13310],"mapped",[51,49,26085]],[[13311,13311],"mapped",[103,97,108]],[[13312,19893],"valid"],[[19894,19903],"disallowed"],[[19904,19967],"valid",[],"NV8"],[[19968,40869],"valid"],[[40870,40891],"valid"],[[40892,40899],"valid"],[[40900,40907],"valid"],[[40908,40908],"valid"],[[40909,40917],"valid"],[[40918,40959],"disallowed"],[[40960,42124],"valid"],[[42125,42127],"disallowed"],[[42128,42145],"valid",[],"NV8"],[[42146,42147],"valid",[],"NV8"],[[42148,42163],"valid",[],"NV8"],[[42164,42164],"valid",[],"NV8"],[[42165,42176],"valid",[],"NV8"],[[42177,42177],"valid",[],"NV8"],[[42178,42180],"valid",[],"NV8"],[[42181,42181],"valid",[],"NV8"],[[42182,42182],"valid",[],"NV8"],[[42183,42191],"disallowed"],[[42192,42237],"valid"],[[42238,42239],"valid",[],"NV8"],[[42240,42508],"valid"],[[42509,42511],"valid",[],"NV8"],[[42512,42539],"valid"],[[42540,42559],"disallowed"],[[42560,42560],"mapped",[42561]],[[42561,42561],"valid"],[[42562,42562],"mapped",[42563]],[[42563,42563],"valid"],[[42564,42564],"mapped",[42565]],[[42565,42565],"valid"],[[42566,42566],"mapped",[42567]],[[42567,42567],"valid"],[[42568,42568],"mapped",[42569]],[[42569,42569],"valid"],[[42570,42570],"mapped",[42571]],[[42571,42571],"valid"],[[42572,42572],"mapped",[42573]],[[42573,42573],"valid"],[[42574,42574],"mapped",[42575]],[[42575,42575],"valid"],[[42576,42576],"mapped",[42577]],[[42577,42577],"valid"],[[42578,42578],"mapped",[42579]],[[42579,42579],"valid"],[[42580,42580],"mapped",[42581]],[[42581,42581],"valid"],[[42582,42582],"mapped",[42583]],[[42583,42583],"valid"],[[42584,42584],"mapped",[42585]],[[42585,42585],"valid"],[[42586,42586],"mapped",[42587]],[[42587,42587],"valid"],[[42588,42588],"mapped",[42589]],[[42589,42589],"valid"],[[42590,42590],"mapped",[42591]],[[42591,42591],"valid"],[[42592,42592],"mapped",[42593]],[[42593,42593],"valid"],[[42594,42594],"mapped",[42595]],[[42595,42595],"valid"],[[42596,42596],"mapped",[42597]],[[42597,42597],"valid"],[[42598,42598],"mapped",[42599]],[[42599,42599],"valid"],[[42600,42600],"mapped",[42601]],[[42601,42601],"valid"],[[42602,42602],"mapped",[42603]],[[42603,42603],"valid"],[[42604,42604],"mapped",[42605]],[[42605,42607],"valid"],[[42608,42611],"valid",[],"NV8"],[[42612,42619],"valid"],[[42620,42621],"valid"],[[42622,42622],"valid",[],"NV8"],[[42623,42623],"valid"],[[42624,42624],"mapped",[42625]],[[42625,42625],"valid"],[[42626,42626],"mapped",[42627]],[[42627,42627],"valid"],[[42628,42628],"mapped",[42629]],[[42629,42629],"valid"],[[42630,42630],"mapped",[42631]],[[42631,42631],"valid"],[[42632,42632],"mapped",[42633]],[[42633,42633],"valid"],[[42634,42634],"mapped",[42635]],[[42635,42635],"valid"],[[42636,42636],"mapped",[42637]],[[42637,42637],"valid"],[[42638,42638],"mapped",[42639]],[[42639,42639],"valid"],[[42640,42640],"mapped",[42641]],[[42641,42641],"valid"],[[42642,42642],"mapped",[42643]],[[42643,42643],"valid"],[[42644,42644],"mapped",[42645]],[[42645,42645],"valid"],[[42646,42646],"mapped",[42647]],[[42647,42647],"valid"],[[42648,42648],"mapped",[42649]],[[42649,42649],"valid"],[[42650,42650],"mapped",[42651]],[[42651,42651],"valid"],[[42652,42652],"mapped",[1098]],[[42653,42653],"mapped",[1100]],[[42654,42654],"valid"],[[42655,42655],"valid"],[[42656,42725],"valid"],[[42726,42735],"valid",[],"NV8"],[[42736,42737],"valid"],[[42738,42743],"valid",[],"NV8"],[[42744,42751],"disallowed"],[[42752,42774],"valid",[],"NV8"],[[42775,42778],"valid"],[[42779,42783],"valid"],[[42784,42785],"valid",[],"NV8"],[[42786,42786],"mapped",[42787]],[[42787,42787],"valid"],[[42788,42788],"mapped",[42789]],[[42789,42789],"valid"],[[42790,42790],"mapped",[42791]],[[42791,42791],"valid"],[[42792,42792],"mapped",[42793]],[[42793,42793],"valid"],[[42794,42794],"mapped",[42795]],[[42795,42795],"valid"],[[42796,42796],"mapped",[42797]],[[42797,42797],"valid"],[[42798,42798],"mapped",[42799]],[[42799,42801],"valid"],[[42802,42802],"mapped",[42803]],[[42803,42803],"valid"],[[42804,42804],"mapped",[42805]],[[42805,42805],"valid"],[[42806,42806],"mapped",[42807]],[[42807,42807],"valid"],[[42808,42808],"mapped",[42809]],[[42809,42809],"valid"],[[42810,42810],"mapped",[42811]],[[42811,42811],"valid"],[[42812,42812],"mapped",[42813]],[[42813,42813],"valid"],[[42814,42814],"mapped",[42815]],[[42815,42815],"valid"],[[42816,42816],"mapped",[42817]],[[42817,42817],"valid"],[[42818,42818],"mapped",[42819]],[[42819,42819],"valid"],[[42820,42820],"mapped",[42821]],[[42821,42821],"valid"],[[42822,42822],"mapped",[42823]],[[42823,42823],"valid"],[[42824,42824],"mapped",[42825]],[[42825,42825],"valid"],[[42826,42826],"mapped",[42827]],[[42827,42827],"valid"],[[42828,42828],"mapped",[42829]],[[42829,42829],"valid"],[[42830,42830],"mapped",[42831]],[[42831,42831],"valid"],[[42832,42832],"mapped",[42833]],[[42833,42833],"valid"],[[42834,42834],"mapped",[42835]],[[42835,42835],"valid"],[[42836,42836],"mapped",[42837]],[[42837,42837],"valid"],[[42838,42838],"mapped",[42839]],[[42839,42839],"valid"],[[42840,42840],"mapped",[42841]],[[42841,42841],"valid"],[[42842,42842],"mapped",[42843]],[[42843,42843],"valid"],[[42844,42844],"mapped",[42845]],[[42845,42845],"valid"],[[42846,42846],"mapped",[42847]],[[42847,42847],"valid"],[[42848,42848],"mapped",[42849]],[[42849,42849],"valid"],[[42850,42850],"mapped",[42851]],[[42851,42851],"valid"],[[42852,42852],"mapped",[42853]],[[42853,42853],"valid"],[[42854,42854],"mapped",[42855]],[[42855,42855],"valid"],[[42856,42856],"mapped",[42857]],[[42857,42857],"valid"],[[42858,42858],"mapped",[42859]],[[42859,42859],"valid"],[[42860,42860],"mapped",[42861]],[[42861,42861],"valid"],[[42862,42862],"mapped",[42863]],[[42863,42863],"valid"],[[42864,42864],"mapped",[42863]],[[42865,42872],"valid"],[[42873,42873],"mapped",[42874]],[[42874,42874],"valid"],[[42875,42875],"mapped",[42876]],[[42876,42876],"valid"],[[42877,42877],"mapped",[7545]],[[42878,42878],"mapped",[42879]],[[42879,42879],"valid"],[[42880,42880],"mapped",[42881]],[[42881,42881],"valid"],[[42882,42882],"mapped",[42883]],[[42883,42883],"valid"],[[42884,42884],"mapped",[42885]],[[42885,42885],"valid"],[[42886,42886],"mapped",[42887]],[[42887,42888],"valid"],[[42889,42890],"valid",[],"NV8"],[[42891,42891],"mapped",[42892]],[[42892,42892],"valid"],[[42893,42893],"mapped",[613]],[[42894,42894],"valid"],[[42895,42895],"valid"],[[42896,42896],"mapped",[42897]],[[42897,42897],"valid"],[[42898,42898],"mapped",[42899]],[[42899,42899],"valid"],[[42900,42901],"valid"],[[42902,42902],"mapped",[42903]],[[42903,42903],"valid"],[[42904,42904],"mapped",[42905]],[[42905,42905],"valid"],[[42906,42906],"mapped",[42907]],[[42907,42907],"valid"],[[42908,42908],"mapped",[42909]],[[42909,42909],"valid"],[[42910,42910],"mapped",[42911]],[[42911,42911],"valid"],[[42912,42912],"mapped",[42913]],[[42913,42913],"valid"],[[42914,42914],"mapped",[42915]],[[42915,42915],"valid"],[[42916,42916],"mapped",[42917]],[[42917,42917],"valid"],[[42918,42918],"mapped",[42919]],[[42919,42919],"valid"],[[42920,42920],"mapped",[42921]],[[42921,42921],"valid"],[[42922,42922],"mapped",[614]],[[42923,42923],"mapped",[604]],[[42924,42924],"mapped",[609]],[[42925,42925],"mapped",[620]],[[42926,42927],"disallowed"],[[42928,42928],"mapped",[670]],[[42929,42929],"mapped",[647]],[[42930,42930],"mapped",[669]],[[42931,42931],"mapped",[43859]],[[42932,42932],"mapped",[42933]],[[42933,42933],"valid"],[[42934,42934],"mapped",[42935]],[[42935,42935],"valid"],[[42936,42998],"disallowed"],[[42999,42999],"valid"],[[43000,43000],"mapped",[295]],[[43001,43001],"mapped",[339]],[[43002,43002],"valid"],[[43003,43007],"valid"],[[43008,43047],"valid"],[[43048,43051],"valid",[],"NV8"],[[43052,43055],"disallowed"],[[43056,43065],"valid",[],"NV8"],[[43066,43071],"disallowed"],[[43072,43123],"valid"],[[43124,43127],"valid",[],"NV8"],[[43128,43135],"disallowed"],[[43136,43204],"valid"],[[43205,43213],"disallowed"],[[43214,43215],"valid",[],"NV8"],[[43216,43225],"valid"],[[43226,43231],"disallowed"],[[43232,43255],"valid"],[[43256,43258],"valid",[],"NV8"],[[43259,43259],"valid"],[[43260,43260],"valid",[],"NV8"],[[43261,43261],"valid"],[[43262,43263],"disallowed"],[[43264,43309],"valid"],[[43310,43311],"valid",[],"NV8"],[[43312,43347],"valid"],[[43348,43358],"disallowed"],[[43359,43359],"valid",[],"NV8"],[[43360,43388],"valid",[],"NV8"],[[43389,43391],"disallowed"],[[43392,43456],"valid"],[[43457,43469],"valid",[],"NV8"],[[43470,43470],"disallowed"],[[43471,43481],"valid"],[[43482,43485],"disallowed"],[[43486,43487],"valid",[],"NV8"],[[43488,43518],"valid"],[[43519,43519],"disallowed"],[[43520,43574],"valid"],[[43575,43583],"disallowed"],[[43584,43597],"valid"],[[43598,43599],"disallowed"],[[43600,43609],"valid"],[[43610,43611],"disallowed"],[[43612,43615],"valid",[],"NV8"],[[43616,43638],"valid"],[[43639,43641],"valid",[],"NV8"],[[43642,43643],"valid"],[[43644,43647],"valid"],[[43648,43714],"valid"],[[43715,43738],"disallowed"],[[43739,43741],"valid"],[[43742,43743],"valid",[],"NV8"],[[43744,43759],"valid"],[[43760,43761],"valid",[],"NV8"],[[43762,43766],"valid"],[[43767,43776],"disallowed"],[[43777,43782],"valid"],[[43783,43784],"disallowed"],[[43785,43790],"valid"],[[43791,43792],"disallowed"],[[43793,43798],"valid"],[[43799,43807],"disallowed"],[[43808,43814],"valid"],[[43815,43815],"disallowed"],[[43816,43822],"valid"],[[43823,43823],"disallowed"],[[43824,43866],"valid"],[[43867,43867],"valid",[],"NV8"],[[43868,43868],"mapped",[42791]],[[43869,43869],"mapped",[43831]],[[43870,43870],"mapped",[619]],[[43871,43871],"mapped",[43858]],[[43872,43875],"valid"],[[43876,43877],"valid"],[[43878,43887],"disallowed"],[[43888,43888],"mapped",[5024]],[[43889,43889],"mapped",[5025]],[[43890,43890],"mapped",[5026]],[[43891,43891],"mapped",[5027]],[[43892,43892],"mapped",[5028]],[[43893,43893],"mapped",[5029]],[[43894,43894],"mapped",[5030]],[[43895,43895],"mapped",[5031]],[[43896,43896],"mapped",[5032]],[[43897,43897],"mapped",[5033]],[[43898,43898],"mapped",[5034]],[[43899,43899],"mapped",[5035]],[[43900,43900],"mapped",[5036]],[[43901,43901],"mapped",[5037]],[[43902,43902],"mapped",[5038]],[[43903,43903],"mapped",[5039]],[[43904,43904],"mapped",[5040]],[[43905,43905],"mapped",[5041]],[[43906,43906],"mapped",[5042]],[[43907,43907],"mapped",[5043]],[[43908,43908],"mapped",[5044]],[[43909,43909],"mapped",[5045]],[[43910,43910],"mapped",[5046]],[[43911,43911],"mapped",[5047]],[[43912,43912],"mapped",[5048]],[[43913,43913],"mapped",[5049]],[[43914,43914],"mapped",[5050]],[[43915,43915],"mapped",[5051]],[[43916,43916],"mapped",[5052]],[[43917,43917],"mapped",[5053]],[[43918,43918],"mapped",[5054]],[[43919,43919],"mapped",[5055]],[[43920,43920],"mapped",[5056]],[[43921,43921],"mapped",[5057]],[[43922,43922],"mapped",[5058]],[[43923,43923],"mapped",[5059]],[[43924,43924],"mapped",[5060]],[[43925,43925],"mapped",[5061]],[[43926,43926],"mapped",[5062]],[[43927,43927],"mapped",[5063]],[[43928,43928],"mapped",[5064]],[[43929,43929],"mapped",[5065]],[[43930,43930],"mapped",[5066]],[[43931,43931],"mapped",[5067]],[[43932,43932],"mapped",[5068]],[[43933,43933],"mapped",[5069]],[[43934,43934],"mapped",[5070]],[[43935,43935],"mapped",[5071]],[[43936,43936],"mapped",[5072]],[[43937,43937],"mapped",[5073]],[[43938,43938],"mapped",[5074]],[[43939,43939],"mapped",[5075]],[[43940,43940],"mapped",[5076]],[[43941,43941],"mapped",[5077]],[[43942,43942],"mapped",[5078]],[[43943,43943],"mapped",[5079]],[[43944,43944],"mapped",[5080]],[[43945,43945],"mapped",[5081]],[[43946,43946],"mapped",[5082]],[[43947,43947],"mapped",[5083]],[[43948,43948],"mapped",[5084]],[[43949,43949],"mapped",[5085]],[[43950,43950],"mapped",[5086]],[[43951,43951],"mapped",[5087]],[[43952,43952],"mapped",[5088]],[[43953,43953],"mapped",[5089]],[[43954,43954],"mapped",[5090]],[[43955,43955],"mapped",[5091]],[[43956,43956],"mapped",[5092]],[[43957,43957],"mapped",[5093]],[[43958,43958],"mapped",[5094]],[[43959,43959],"mapped",[5095]],[[43960,43960],"mapped",[5096]],[[43961,43961],"mapped",[5097]],[[43962,43962],"mapped",[5098]],[[43963,43963],"mapped",[5099]],[[43964,43964],"mapped",[5100]],[[43965,43965],"mapped",[5101]],[[43966,43966],"mapped",[5102]],[[43967,43967],"mapped",[5103]],[[43968,44010],"valid"],[[44011,44011],"valid",[],"NV8"],[[44012,44013],"valid"],[[44014,44015],"disallowed"],[[44016,44025],"valid"],[[44026,44031],"disallowed"],[[44032,55203],"valid"],[[55204,55215],"disallowed"],[[55216,55238],"valid",[],"NV8"],[[55239,55242],"disallowed"],[[55243,55291],"valid",[],"NV8"],[[55292,55295],"disallowed"],[[55296,57343],"disallowed"],[[57344,63743],"disallowed"],[[63744,63744],"mapped",[35912]],[[63745,63745],"mapped",[26356]],[[63746,63746],"mapped",[36554]],[[63747,63747],"mapped",[36040]],[[63748,63748],"mapped",[28369]],[[63749,63749],"mapped",[20018]],[[63750,63750],"mapped",[21477]],[[63751,63752],"mapped",[40860]],[[63753,63753],"mapped",[22865]],[[63754,63754],"mapped",[37329]],[[63755,63755],"mapped",[21895]],[[63756,63756],"mapped",[22856]],[[63757,63757],"mapped",[25078]],[[63758,63758],"mapped",[30313]],[[63759,63759],"mapped",[32645]],[[63760,63760],"mapped",[34367]],[[63761,63761],"mapped",[34746]],[[63762,63762],"mapped",[35064]],[[63763,63763],"mapped",[37007]],[[63764,63764],"mapped",[27138]],[[63765,63765],"mapped",[27931]],[[63766,63766],"mapped",[28889]],[[63767,63767],"mapped",[29662]],[[63768,63768],"mapped",[33853]],[[63769,63769],"mapped",[37226]],[[63770,63770],"mapped",[39409]],[[63771,63771],"mapped",[20098]],[[63772,63772],"mapped",[21365]],[[63773,63773],"mapped",[27396]],[[63774,63774],"mapped",[29211]],[[63775,63775],"mapped",[34349]],[[63776,63776],"mapped",[40478]],[[63777,63777],"mapped",[23888]],[[63778,63778],"mapped",[28651]],[[63779,63779],"mapped",[34253]],[[63780,63780],"mapped",[35172]],[[63781,63781],"mapped",[25289]],[[63782,63782],"mapped",[33240]],[[63783,63783],"mapped",[34847]],[[63784,63784],"mapped",[24266]],[[63785,63785],"mapped",[26391]],[[63786,63786],"mapped",[28010]],[[63787,63787],"mapped",[29436]],[[63788,63788],"mapped",[37070]],[[63789,63789],"mapped",[20358]],[[63790,63790],"mapped",[20919]],[[63791,63791],"mapped",[21214]],[[63792,63792],"mapped",[25796]],[[63793,63793],"mapped",[27347]],[[63794,63794],"mapped",[29200]],[[63795,63795],"mapped",[30439]],[[63796,63796],"mapped",[32769]],[[63797,63797],"mapped",[34310]],[[63798,63798],"mapped",[34396]],[[63799,63799],"mapped",[36335]],[[63800,63800],"mapped",[38706]],[[63801,63801],"mapped",[39791]],[[63802,63802],"mapped",[40442]],[[63803,63803],"mapped",[30860]],[[63804,63804],"mapped",[31103]],[[63805,63805],"mapped",[32160]],[[63806,63806],"mapped",[33737]],[[63807,63807],"mapped",[37636]],[[63808,63808],"mapped",[40575]],[[63809,63809],"mapped",[35542]],[[63810,63810],"mapped",[22751]],[[63811,63811],"mapped",[24324]],[[63812,63812],"mapped",[31840]],[[63813,63813],"mapped",[32894]],[[63814,63814],"mapped",[29282]],[[63815,63815],"mapped",[30922]],[[63816,63816],"mapped",[36034]],[[63817,63817],"mapped",[38647]],[[63818,63818],"mapped",[22744]],[[63819,63819],"mapped",[23650]],[[63820,63820],"mapped",[27155]],[[63821,63821],"mapped",[28122]],[[63822,63822],"mapped",[28431]],[[63823,63823],"mapped",[32047]],[[63824,63824],"mapped",[32311]],[[63825,63825],"mapped",[38475]],[[63826,63826],"mapped",[21202]],[[63827,63827],"mapped",[32907]],[[63828,63828],"mapped",[20956]],[[63829,63829],"mapped",[20940]],[[63830,63830],"mapped",[31260]],[[63831,63831],"mapped",[32190]],[[63832,63832],"mapped",[33777]],[[63833,63833],"mapped",[38517]],[[63834,63834],"mapped",[35712]],[[63835,63835],"mapped",[25295]],[[63836,63836],"mapped",[27138]],[[63837,63837],"mapped",[35582]],[[63838,63838],"mapped",[20025]],[[63839,63839],"mapped",[23527]],[[63840,63840],"mapped",[24594]],[[63841,63841],"mapped",[29575]],[[63842,63842],"mapped",[30064]],[[63843,63843],"mapped",[21271]],[[63844,63844],"mapped",[30971]],[[63845,63845],"mapped",[20415]],[[63846,63846],"mapped",[24489]],[[63847,63847],"mapped",[19981]],[[63848,63848],"mapped",[27852]],[[63849,63849],"mapped",[25976]],[[63850,63850],"mapped",[32034]],[[63851,63851],"mapped",[21443]],[[63852,63852],"mapped",[22622]],[[63853,63853],"mapped",[30465]],[[63854,63854],"mapped",[33865]],[[63855,63855],"mapped",[35498]],[[63856,63856],"mapped",[27578]],[[63857,63857],"mapped",[36784]],[[63858,63858],"mapped",[27784]],[[63859,63859],"mapped",[25342]],[[63860,63860],"mapped",[33509]],[[63861,63861],"mapped",[25504]],[[63862,63862],"mapped",[30053]],[[63863,63863],"mapped",[20142]],[[63864,63864],"mapped",[20841]],[[63865,63865],"mapped",[20937]],[[63866,63866],"mapped",[26753]],[[63867,63867],"mapped",[31975]],[[63868,63868],"mapped",[33391]],[[63869,63869],"mapped",[35538]],[[63870,63870],"mapped",[37327]],[[63871,63871],"mapped",[21237]],[[63872,63872],"mapped",[21570]],[[63873,63873],"mapped",[22899]],[[63874,63874],"mapped",[24300]],[[63875,63875],"mapped",[26053]],[[63876,63876],"mapped",[28670]],[[63877,63877],"mapped",[31018]],[[63878,63878],"mapped",[38317]],[[63879,63879],"mapped",[39530]],[[63880,63880],"mapped",[40599]],[[63881,63881],"mapped",[40654]],[[63882,63882],"mapped",[21147]],[[63883,63883],"mapped",[26310]],[[63884,63884],"mapped",[27511]],[[63885,63885],"mapped",[36706]],[[63886,63886],"mapped",[24180]],[[63887,63887],"mapped",[24976]],[[63888,63888],"mapped",[25088]],[[63889,63889],"mapped",[25754]],[[63890,63890],"mapped",[28451]],[[63891,63891],"mapped",[29001]],[[63892,63892],"mapped",[29833]],[[63893,63893],"mapped",[31178]],[[63894,63894],"mapped",[32244]],[[63895,63895],"mapped",[32879]],[[63896,63896],"mapped",[36646]],[[63897,63897],"mapped",[34030]],[[63898,63898],"mapped",[36899]],[[63899,63899],"mapped",[37706]],[[63900,63900],"mapped",[21015]],[[63901,63901],"mapped",[21155]],[[63902,63902],"mapped",[21693]],[[63903,63903],"mapped",[28872]],[[63904,63904],"mapped",[35010]],[[63905,63905],"mapped",[35498]],[[63906,63906],"mapped",[24265]],[[63907,63907],"mapped",[24565]],[[63908,63908],"mapped",[25467]],[[63909,63909],"mapped",[27566]],[[63910,63910],"mapped",[31806]],[[63911,63911],"mapped",[29557]],[[63912,63912],"mapped",[20196]],[[63913,63913],"mapped",[22265]],[[63914,63914],"mapped",[23527]],[[63915,63915],"mapped",[23994]],[[63916,63916],"mapped",[24604]],[[63917,63917],"mapped",[29618]],[[63918,63918],"mapped",[29801]],[[63919,63919],"mapped",[32666]],[[63920,63920],"mapped",[32838]],[[63921,63921],"mapped",[37428]],[[63922,63922],"mapped",[38646]],[[63923,63923],"mapped",[38728]],[[63924,63924],"mapped",[38936]],[[63925,63925],"mapped",[20363]],[[63926,63926],"mapped",[31150]],[[63927,63927],"mapped",[37300]],[[63928,63928],"mapped",[38584]],[[63929,63929],"mapped",[24801]],[[63930,63930],"mapped",[20102]],[[63931,63931],"mapped",[20698]],[[63932,63932],"mapped",[23534]],[[63933,63933],"mapped",[23615]],[[63934,63934],"mapped",[26009]],[[63935,63935],"mapped",[27138]],[[63936,63936],"mapped",[29134]],[[63937,63937],"mapped",[30274]],[[63938,63938],"mapped",[34044]],[[63939,63939],"mapped",[36988]],[[63940,63940],"mapped",[40845]],[[63941,63941],"mapped",[26248]],[[63942,63942],"mapped",[38446]],[[63943,63943],"mapped",[21129]],[[63944,63944],"mapped",[26491]],[[63945,63945],"mapped",[26611]],[[63946,63946],"mapped",[27969]],[[63947,63947],"mapped",[28316]],[[63948,63948],"mapped",[29705]],[[63949,63949],"mapped",[30041]],[[63950,63950],"mapped",[30827]],[[63951,63951],"mapped",[32016]],[[63952,63952],"mapped",[39006]],[[63953,63953],"mapped",[20845]],[[63954,63954],"mapped",[25134]],[[63955,63955],"mapped",[38520]],[[63956,63956],"mapped",[20523]],[[63957,63957],"mapped",[23833]],[[63958,63958],"mapped",[28138]],[[63959,63959],"mapped",[36650]],[[63960,63960],"mapped",[24459]],[[63961,63961],"mapped",[24900]],[[63962,63962],"mapped",[26647]],[[63963,63963],"mapped",[29575]],[[63964,63964],"mapped",[38534]],[[63965,63965],"mapped",[21033]],[[63966,63966],"mapped",[21519]],[[63967,63967],"mapped",[23653]],[[63968,63968],"mapped",[26131]],[[63969,63969],"mapped",[26446]],[[63970,63970],"mapped",[26792]],[[63971,63971],"mapped",[27877]],[[63972,63972],"mapped",[29702]],[[63973,63973],"mapped",[30178]],[[63974,63974],"mapped",[32633]],[[63975,63975],"mapped",[35023]],[[63976,63976],"mapped",[35041]],[[63977,63977],"mapped",[37324]],[[63978,63978],"mapped",[38626]],[[63979,63979],"mapped",[21311]],[[63980,63980],"mapped",[28346]],[[63981,63981],"mapped",[21533]],[[63982,63982],"mapped",[29136]],[[63983,63983],"mapped",[29848]],[[63984,63984],"mapped",[34298]],[[63985,63985],"mapped",[38563]],[[63986,63986],"mapped",[40023]],[[63987,63987],"mapped",[40607]],[[63988,63988],"mapped",[26519]],[[63989,63989],"mapped",[28107]],[[63990,63990],"mapped",[33256]],[[63991,63991],"mapped",[31435]],[[63992,63992],"mapped",[31520]],[[63993,63993],"mapped",[31890]],[[63994,63994],"mapped",[29376]],[[63995,63995],"mapped",[28825]],[[63996,63996],"mapped",[35672]],[[63997,63997],"mapped",[20160]],[[63998,63998],"mapped",[33590]],[[63999,63999],"mapped",[21050]],[[64000,64000],"mapped",[20999]],[[64001,64001],"mapped",[24230]],[[64002,64002],"mapped",[25299]],[[64003,64003],"mapped",[31958]],[[64004,64004],"mapped",[23429]],[[64005,64005],"mapped",[27934]],[[64006,64006],"mapped",[26292]],[[64007,64007],"mapped",[36667]],[[64008,64008],"mapped",[34892]],[[64009,64009],"mapped",[38477]],[[64010,64010],"mapped",[35211]],[[64011,64011],"mapped",[24275]],[[64012,64012],"mapped",[20800]],[[64013,64013],"mapped",[21952]],[[64014,64015],"valid"],[[64016,64016],"mapped",[22618]],[[64017,64017],"valid"],[[64018,64018],"mapped",[26228]],[[64019,64020],"valid"],[[64021,64021],"mapped",[20958]],[[64022,64022],"mapped",[29482]],[[64023,64023],"mapped",[30410]],[[64024,64024],"mapped",[31036]],[[64025,64025],"mapped",[31070]],[[64026,64026],"mapped",[31077]],[[64027,64027],"mapped",[31119]],[[64028,64028],"mapped",[38742]],[[64029,64029],"mapped",[31934]],[[64030,64030],"mapped",[32701]],[[64031,64031],"valid"],[[64032,64032],"mapped",[34322]],[[64033,64033],"valid"],[[64034,64034],"mapped",[35576]],[[64035,64036],"valid"],[[64037,64037],"mapped",[36920]],[[64038,64038],"mapped",[37117]],[[64039,64041],"valid"],[[64042,64042],"mapped",[39151]],[[64043,64043],"mapped",[39164]],[[64044,64044],"mapped",[39208]],[[64045,64045],"mapped",[40372]],[[64046,64046],"mapped",[37086]],[[64047,64047],"mapped",[38583]],[[64048,64048],"mapped",[20398]],[[64049,64049],"mapped",[20711]],[[64050,64050],"mapped",[20813]],[[64051,64051],"mapped",[21193]],[[64052,64052],"mapped",[21220]],[[64053,64053],"mapped",[21329]],[[64054,64054],"mapped",[21917]],[[64055,64055],"mapped",[22022]],[[64056,64056],"mapped",[22120]],[[64057,64057],"mapped",[22592]],[[64058,64058],"mapped",[22696]],[[64059,64059],"mapped",[23652]],[[64060,64060],"mapped",[23662]],[[64061,64061],"mapped",[24724]],[[64062,64062],"mapped",[24936]],[[64063,64063],"mapped",[24974]],[[64064,64064],"mapped",[25074]],[[64065,64065],"mapped",[25935]],[[64066,64066],"mapped",[26082]],[[64067,64067],"mapped",[26257]],[[64068,64068],"mapped",[26757]],[[64069,64069],"mapped",[28023]],[[64070,64070],"mapped",[28186]],[[64071,64071],"mapped",[28450]],[[64072,64072],"mapped",[29038]],[[64073,64073],"mapped",[29227]],[[64074,64074],"mapped",[29730]],[[64075,64075],"mapped",[30865]],[[64076,64076],"mapped",[31038]],[[64077,64077],"mapped",[31049]],[[64078,64078],"mapped",[31048]],[[64079,64079],"mapped",[31056]],[[64080,64080],"mapped",[31062]],[[64081,64081],"mapped",[31069]],[[64082,64082],"mapped",[31117]],[[64083,64083],"mapped",[31118]],[[64084,64084],"mapped",[31296]],[[64085,64085],"mapped",[31361]],[[64086,64086],"mapped",[31680]],[[64087,64087],"mapped",[32244]],[[64088,64088],"mapped",[32265]],[[64089,64089],"mapped",[32321]],[[64090,64090],"mapped",[32626]],[[64091,64091],"mapped",[32773]],[[64092,64092],"mapped",[33261]],[[64093,64094],"mapped",[33401]],[[64095,64095],"mapped",[33879]],[[64096,64096],"mapped",[35088]],[[64097,64097],"mapped",[35222]],[[64098,64098],"mapped",[35585]],[[64099,64099],"mapped",[35641]],[[64100,64100],"mapped",[36051]],[[64101,64101],"mapped",[36104]],[[64102,64102],"mapped",[36790]],[[64103,64103],"mapped",[36920]],[[64104,64104],"mapped",[38627]],[[64105,64105],"mapped",[38911]],[[64106,64106],"mapped",[38971]],[[64107,64107],"mapped",[24693]],[[64108,64108],"mapped",[148206]],[[64109,64109],"mapped",[33304]],[[64110,64111],"disallowed"],[[64112,64112],"mapped",[20006]],[[64113,64113],"mapped",[20917]],[[64114,64114],"mapped",[20840]],[[64115,64115],"mapped",[20352]],[[64116,64116],"mapped",[20805]],[[64117,64117],"mapped",[20864]],[[64118,64118],"mapped",[21191]],[[64119,64119],"mapped",[21242]],[[64120,64120],"mapped",[21917]],[[64121,64121],"mapped",[21845]],[[64122,64122],"mapped",[21913]],[[64123,64123],"mapped",[21986]],[[64124,64124],"mapped",[22618]],[[64125,64125],"mapped",[22707]],[[64126,64126],"mapped",[22852]],[[64127,64127],"mapped",[22868]],[[64128,64128],"mapped",[23138]],[[64129,64129],"mapped",[23336]],[[64130,64130],"mapped",[24274]],[[64131,64131],"mapped",[24281]],[[64132,64132],"mapped",[24425]],[[64133,64133],"mapped",[24493]],[[64134,64134],"mapped",[24792]],[[64135,64135],"mapped",[24910]],[[64136,64136],"mapped",[24840]],[[64137,64137],"mapped",[24974]],[[64138,64138],"mapped",[24928]],[[64139,64139],"mapped",[25074]],[[64140,64140],"mapped",[25140]],[[64141,64141],"mapped",[25540]],[[64142,64142],"mapped",[25628]],[[64143,64143],"mapped",[25682]],[[64144,64144],"mapped",[25942]],[[64145,64145],"mapped",[26228]],[[64146,64146],"mapped",[26391]],[[64147,64147],"mapped",[26395]],[[64148,64148],"mapped",[26454]],[[64149,64149],"mapped",[27513]],[[64150,64150],"mapped",[27578]],[[64151,64151],"mapped",[27969]],[[64152,64152],"mapped",[28379]],[[64153,64153],"mapped",[28363]],[[64154,64154],"mapped",[28450]],[[64155,64155],"mapped",[28702]],[[64156,64156],"mapped",[29038]],[[64157,64157],"mapped",[30631]],[[64158,64158],"mapped",[29237]],[[64159,64159],"mapped",[29359]],[[64160,64160],"mapped",[29482]],[[64161,64161],"mapped",[29809]],[[64162,64162],"mapped",[29958]],[[64163,64163],"mapped",[30011]],[[64164,64164],"mapped",[30237]],[[64165,64165],"mapped",[30239]],[[64166,64166],"mapped",[30410]],[[64167,64167],"mapped",[30427]],[[64168,64168],"mapped",[30452]],[[64169,64169],"mapped",[30538]],[[64170,64170],"mapped",[30528]],[[64171,64171],"mapped",[30924]],[[64172,64172],"mapped",[31409]],[[64173,64173],"mapped",[31680]],[[64174,64174],"mapped",[31867]],[[64175,64175],"mapped",[32091]],[[64176,64176],"mapped",[32244]],[[64177,64177],"mapped",[32574]],[[64178,64178],"mapped",[32773]],[[64179,64179],"mapped",[33618]],[[64180,64180],"mapped",[33775]],[[64181,64181],"mapped",[34681]],[[64182,64182],"mapped",[35137]],[[64183,64183],"mapped",[35206]],[[64184,64184],"mapped",[35222]],[[64185,64185],"mapped",[35519]],[[64186,64186],"mapped",[35576]],[[64187,64187],"mapped",[35531]],[[64188,64188],"mapped",[35585]],[[64189,64189],"mapped",[35582]],[[64190,64190],"mapped",[35565]],[[64191,64191],"mapped",[35641]],[[64192,64192],"mapped",[35722]],[[64193,64193],"mapped",[36104]],[[64194,64194],"mapped",[36664]],[[64195,64195],"mapped",[36978]],[[64196,64196],"mapped",[37273]],[[64197,64197],"mapped",[37494]],[[64198,64198],"mapped",[38524]],[[64199,64199],"mapped",[38627]],[[64200,64200],"mapped",[38742]],[[64201,64201],"mapped",[38875]],[[64202,64202],"mapped",[38911]],[[64203,64203],"mapped",[38923]],[[64204,64204],"mapped",[38971]],[[64205,64205],"mapped",[39698]],[[64206,64206],"mapped",[40860]],[[64207,64207],"mapped",[141386]],[[64208,64208],"mapped",[141380]],[[64209,64209],"mapped",[144341]],[[64210,64210],"mapped",[15261]],[[64211,64211],"mapped",[16408]],[[64212,64212],"mapped",[16441]],[[64213,64213],"mapped",[152137]],[[64214,64214],"mapped",[154832]],[[64215,64215],"mapped",[163539]],[[64216,64216],"mapped",[40771]],[[64217,64217],"mapped",[40846]],[[64218,64255],"disallowed"],[[64256,64256],"mapped",[102,102]],[[64257,64257],"mapped",[102,105]],[[64258,64258],"mapped",[102,108]],[[64259,64259],"mapped",[102,102,105]],[[64260,64260],"mapped",[102,102,108]],[[64261,64262],"mapped",[115,116]],[[64263,64274],"disallowed"],[[64275,64275],"mapped",[1396,1398]],[[64276,64276],"mapped",[1396,1381]],[[64277,64277],"mapped",[1396,1387]],[[64278,64278],"mapped",[1406,1398]],[[64279,64279],"mapped",[1396,1389]],[[64280,64284],"disallowed"],[[64285,64285],"mapped",[1497,1460]],[[64286,64286],"valid"],[[64287,64287],"mapped",[1522,1463]],[[64288,64288],"mapped",[1506]],[[64289,64289],"mapped",[1488]],[[64290,64290],"mapped",[1491]],[[64291,64291],"mapped",[1492]],[[64292,64292],"mapped",[1499]],[[64293,64293],"mapped",[1500]],[[64294,64294],"mapped",[1501]],[[64295,64295],"mapped",[1512]],[[64296,64296],"mapped",[1514]],[[64297,64297],"disallowed_STD3_mapped",[43]],[[64298,64298],"mapped",[1513,1473]],[[64299,64299],"mapped",[1513,1474]],[[64300,64300],"mapped",[1513,1468,1473]],[[64301,64301],"mapped",[1513,1468,1474]],[[64302,64302],"mapped",[1488,1463]],[[64303,64303],"mapped",[1488,1464]],[[64304,64304],"mapped",[1488,1468]],[[64305,64305],"mapped",[1489,1468]],[[64306,64306],"mapped",[1490,1468]],[[64307,64307],"mapped",[1491,1468]],[[64308,64308],"mapped",[1492,1468]],[[64309,64309],"mapped",[1493,1468]],[[64310,64310],"mapped",[1494,1468]],[[64311,64311],"disallowed"],[[64312,64312],"mapped",[1496,1468]],[[64313,64313],"mapped",[1497,1468]],[[64314,64314],"mapped",[1498,1468]],[[64315,64315],"mapped",[1499,1468]],[[64316,64316],"mapped",[1500,1468]],[[64317,64317],"disallowed"],[[64318,64318],"mapped",[1502,1468]],[[64319,64319],"disallowed"],[[64320,64320],"mapped",[1504,1468]],[[64321,64321],"mapped",[1505,1468]],[[64322,64322],"disallowed"],[[64323,64323],"mapped",[1507,1468]],[[64324,64324],"mapped",[1508,1468]],[[64325,64325],"disallowed"],[[64326,64326],"mapped",[1510,1468]],[[64327,64327],"mapped",[1511,1468]],[[64328,64328],"mapped",[1512,1468]],[[64329,64329],"mapped",[1513,1468]],[[64330,64330],"mapped",[1514,1468]],[[64331,64331],"mapped",[1493,1465]],[[64332,64332],"mapped",[1489,1471]],[[64333,64333],"mapped",[1499,1471]],[[64334,64334],"mapped",[1508,1471]],[[64335,64335],"mapped",[1488,1500]],[[64336,64337],"mapped",[1649]],[[64338,64341],"mapped",[1659]],[[64342,64345],"mapped",[1662]],[[64346,64349],"mapped",[1664]],[[64350,64353],"mapped",[1658]],[[64354,64357],"mapped",[1663]],[[64358,64361],"mapped",[1657]],[[64362,64365],"mapped",[1700]],[[64366,64369],"mapped",[1702]],[[64370,64373],"mapped",[1668]],[[64374,64377],"mapped",[1667]],[[64378,64381],"mapped",[1670]],[[64382,64385],"mapped",[1671]],[[64386,64387],"mapped",[1677]],[[64388,64389],"mapped",[1676]],[[64390,64391],"mapped",[1678]],[[64392,64393],"mapped",[1672]],[[64394,64395],"mapped",[1688]],[[64396,64397],"mapped",[1681]],[[64398,64401],"mapped",[1705]],[[64402,64405],"mapped",[1711]],[[64406,64409],"mapped",[1715]],[[64410,64413],"mapped",[1713]],[[64414,64415],"mapped",[1722]],[[64416,64419],"mapped",[1723]],[[64420,64421],"mapped",[1728]],[[64422,64425],"mapped",[1729]],[[64426,64429],"mapped",[1726]],[[64430,64431],"mapped",[1746]],[[64432,64433],"mapped",[1747]],[[64434,64449],"valid",[],"NV8"],[[64450,64466],"disallowed"],[[64467,64470],"mapped",[1709]],[[64471,64472],"mapped",[1735]],[[64473,64474],"mapped",[1734]],[[64475,64476],"mapped",[1736]],[[64477,64477],"mapped",[1735,1652]],[[64478,64479],"mapped",[1739]],[[64480,64481],"mapped",[1733]],[[64482,64483],"mapped",[1737]],[[64484,64487],"mapped",[1744]],[[64488,64489],"mapped",[1609]],[[64490,64491],"mapped",[1574,1575]],[[64492,64493],"mapped",[1574,1749]],[[64494,64495],"mapped",[1574,1608]],[[64496,64497],"mapped",[1574,1735]],[[64498,64499],"mapped",[1574,1734]],[[64500,64501],"mapped",[1574,1736]],[[64502,64504],"mapped",[1574,1744]],[[64505,64507],"mapped",[1574,1609]],[[64508,64511],"mapped",[1740]],[[64512,64512],"mapped",[1574,1580]],[[64513,64513],"mapped",[1574,1581]],[[64514,64514],"mapped",[1574,1605]],[[64515,64515],"mapped",[1574,1609]],[[64516,64516],"mapped",[1574,1610]],[[64517,64517],"mapped",[1576,1580]],[[64518,64518],"mapped",[1576,1581]],[[64519,64519],"mapped",[1576,1582]],[[64520,64520],"mapped",[1576,1605]],[[64521,64521],"mapped",[1576,1609]],[[64522,64522],"mapped",[1576,1610]],[[64523,64523],"mapped",[1578,1580]],[[64524,64524],"mapped",[1578,1581]],[[64525,64525],"mapped",[1578,1582]],[[64526,64526],"mapped",[1578,1605]],[[64527,64527],"mapped",[1578,1609]],[[64528,64528],"mapped",[1578,1610]],[[64529,64529],"mapped",[1579,1580]],[[64530,64530],"mapped",[1579,1605]],[[64531,64531],"mapped",[1579,1609]],[[64532,64532],"mapped",[1579,1610]],[[64533,64533],"mapped",[1580,1581]],[[64534,64534],"mapped",[1580,1605]],[[64535,64535],"mapped",[1581,1580]],[[64536,64536],"mapped",[1581,1605]],[[64537,64537],"mapped",[1582,1580]],[[64538,64538],"mapped",[1582,1581]],[[64539,64539],"mapped",[1582,1605]],[[64540,64540],"mapped",[1587,1580]],[[64541,64541],"mapped",[1587,1581]],[[64542,64542],"mapped",[1587,1582]],[[64543,64543],"mapped",[1587,1605]],[[64544,64544],"mapped",[1589,1581]],[[64545,64545],"mapped",[1589,1605]],[[64546,64546],"mapped",[1590,1580]],[[64547,64547],"mapped",[1590,1581]],[[64548,64548],"mapped",[1590,1582]],[[64549,64549],"mapped",[1590,1605]],[[64550,64550],"mapped",[1591,1581]],[[64551,64551],"mapped",[1591,1605]],[[64552,64552],"mapped",[1592,1605]],[[64553,64553],"mapped",[1593,1580]],[[64554,64554],"mapped",[1593,1605]],[[64555,64555],"mapped",[1594,1580]],[[64556,64556],"mapped",[1594,1605]],[[64557,64557],"mapped",[1601,1580]],[[64558,64558],"mapped",[1601,1581]],[[64559,64559],"mapped",[1601,1582]],[[64560,64560],"mapped",[1601,1605]],[[64561,64561],"mapped",[1601,1609]],[[64562,64562],"mapped",[1601,1610]],[[64563,64563],"mapped",[1602,1581]],[[64564,64564],"mapped",[1602,1605]],[[64565,64565],"mapped",[1602,1609]],[[64566,64566],"mapped",[1602,1610]],[[64567,64567],"mapped",[1603,1575]],[[64568,64568],"mapped",[1603,1580]],[[64569,64569],"mapped",[1603,1581]],[[64570,64570],"mapped",[1603,1582]],[[64571,64571],"mapped",[1603,1604]],[[64572,64572],"mapped",[1603,1605]],[[64573,64573],"mapped",[1603,1609]],[[64574,64574],"mapped",[1603,1610]],[[64575,64575],"mapped",[1604,1580]],[[64576,64576],"mapped",[1604,1581]],[[64577,64577],"mapped",[1604,1582]],[[64578,64578],"mapped",[1604,1605]],[[64579,64579],"mapped",[1604,1609]],[[64580,64580],"mapped",[1604,1610]],[[64581,64581],"mapped",[1605,1580]],[[64582,64582],"mapped",[1605,1581]],[[64583,64583],"mapped",[1605,1582]],[[64584,64584],"mapped",[1605,1605]],[[64585,64585],"mapped",[1605,1609]],[[64586,64586],"mapped",[1605,1610]],[[64587,64587],"mapped",[1606,1580]],[[64588,64588],"mapped",[1606,1581]],[[64589,64589],"mapped",[1606,1582]],[[64590,64590],"mapped",[1606,1605]],[[64591,64591],"mapped",[1606,1609]],[[64592,64592],"mapped",[1606,1610]],[[64593,64593],"mapped",[1607,1580]],[[64594,64594],"mapped",[1607,1605]],[[64595,64595],"mapped",[1607,1609]],[[64596,64596],"mapped",[1607,1610]],[[64597,64597],"mapped",[1610,1580]],[[64598,64598],"mapped",[1610,1581]],[[64599,64599],"mapped",[1610,1582]],[[64600,64600],"mapped",[1610,1605]],[[64601,64601],"mapped",[1610,1609]],[[64602,64602],"mapped",[1610,1610]],[[64603,64603],"mapped",[1584,1648]],[[64604,64604],"mapped",[1585,1648]],[[64605,64605],"mapped",[1609,1648]],[[64606,64606],"disallowed_STD3_mapped",[32,1612,1617]],[[64607,64607],"disallowed_STD3_mapped",[32,1613,1617]],[[64608,64608],"disallowed_STD3_mapped",[32,1614,1617]],[[64609,64609],"disallowed_STD3_mapped",[32,1615,1617]],[[64610,64610],"disallowed_STD3_mapped",[32,1616,1617]],[[64611,64611],"disallowed_STD3_mapped",[32,1617,1648]],[[64612,64612],"mapped",[1574,1585]],[[64613,64613],"mapped",[1574,1586]],[[64614,64614],"mapped",[1574,1605]],[[64615,64615],"mapped",[1574,1606]],[[64616,64616],"mapped",[1574,1609]],[[64617,64617],"mapped",[1574,1610]],[[64618,64618],"mapped",[1576,1585]],[[64619,64619],"mapped",[1576,1586]],[[64620,64620],"mapped",[1576,1605]],[[64621,64621],"mapped",[1576,1606]],[[64622,64622],"mapped",[1576,1609]],[[64623,64623],"mapped",[1576,1610]],[[64624,64624],"mapped",[1578,1585]],[[64625,64625],"mapped",[1578,1586]],[[64626,64626],"mapped",[1578,1605]],[[64627,64627],"mapped",[1578,1606]],[[64628,64628],"mapped",[1578,1609]],[[64629,64629],"mapped",[1578,1610]],[[64630,64630],"mapped",[1579,1585]],[[64631,64631],"mapped",[1579,1586]],[[64632,64632],"mapped",[1579,1605]],[[64633,64633],"mapped",[1579,1606]],[[64634,64634],"mapped",[1579,1609]],[[64635,64635],"mapped",[1579,1610]],[[64636,64636],"mapped",[1601,1609]],[[64637,64637],"mapped",[1601,1610]],[[64638,64638],"mapped",[1602,1609]],[[64639,64639],"mapped",[1602,1610]],[[64640,64640],"mapped",[1603,1575]],[[64641,64641],"mapped",[1603,1604]],[[64642,64642],"mapped",[1603,1605]],[[64643,64643],"mapped",[1603,1609]],[[64644,64644],"mapped",[1603,1610]],[[64645,64645],"mapped",[1604,1605]],[[64646,64646],"mapped",[1604,1609]],[[64647,64647],"mapped",[1604,1610]],[[64648,64648],"mapped",[1605,1575]],[[64649,64649],"mapped",[1605,1605]],[[64650,64650],"mapped",[1606,1585]],[[64651,64651],"mapped",[1606,1586]],[[64652,64652],"mapped",[1606,1605]],[[64653,64653],"mapped",[1606,1606]],[[64654,64654],"mapped",[1606,1609]],[[64655,64655],"mapped",[1606,1610]],[[64656,64656],"mapped",[1609,1648]],[[64657,64657],"mapped",[1610,1585]],[[64658,64658],"mapped",[1610,1586]],[[64659,64659],"mapped",[1610,1605]],[[64660,64660],"mapped",[1610,1606]],[[64661,64661],"mapped",[1610,1609]],[[64662,64662],"mapped",[1610,1610]],[[64663,64663],"mapped",[1574,1580]],[[64664,64664],"mapped",[1574,1581]],[[64665,64665],"mapped",[1574,1582]],[[64666,64666],"mapped",[1574,1605]],[[64667,64667],"mapped",[1574,1607]],[[64668,64668],"mapped",[1576,1580]],[[64669,64669],"mapped",[1576,1581]],[[64670,64670],"mapped",[1576,1582]],[[64671,64671],"mapped",[1576,1605]],[[64672,64672],"mapped",[1576,1607]],[[64673,64673],"mapped",[1578,1580]],[[64674,64674],"mapped",[1578,1581]],[[64675,64675],"mapped",[1578,1582]],[[64676,64676],"mapped",[1578,1605]],[[64677,64677],"mapped",[1578,1607]],[[64678,64678],"mapped",[1579,1605]],[[64679,64679],"mapped",[1580,1581]],[[64680,64680],"mapped",[1580,1605]],[[64681,64681],"mapped",[1581,1580]],[[64682,64682],"mapped",[1581,1605]],[[64683,64683],"mapped",[1582,1580]],[[64684,64684],"mapped",[1582,1605]],[[64685,64685],"mapped",[1587,1580]],[[64686,64686],"mapped",[1587,1581]],[[64687,64687],"mapped",[1587,1582]],[[64688,64688],"mapped",[1587,1605]],[[64689,64689],"mapped",[1589,1581]],[[64690,64690],"mapped",[1589,1582]],[[64691,64691],"mapped",[1589,1605]],[[64692,64692],"mapped",[1590,1580]],[[64693,64693],"mapped",[1590,1581]],[[64694,64694],"mapped",[1590,1582]],[[64695,64695],"mapped",[1590,1605]],[[64696,64696],"mapped",[1591,1581]],[[64697,64697],"mapped",[1592,1605]],[[64698,64698],"mapped",[1593,1580]],[[64699,64699],"mapped",[1593,1605]],[[64700,64700],"mapped",[1594,1580]],[[64701,64701],"mapped",[1594,1605]],[[64702,64702],"mapped",[1601,1580]],[[64703,64703],"mapped",[1601,1581]],[[64704,64704],"mapped",[1601,1582]],[[64705,64705],"mapped",[1601,1605]],[[64706,64706],"mapped",[1602,1581]],[[64707,64707],"mapped",[1602,1605]],[[64708,64708],"mapped",[1603,1580]],[[64709,64709],"mapped",[1603,1581]],[[64710,64710],"mapped",[1603,1582]],[[64711,64711],"mapped",[1603,1604]],[[64712,64712],"mapped",[1603,1605]],[[64713,64713],"mapped",[1604,1580]],[[64714,64714],"mapped",[1604,1581]],[[64715,64715],"mapped",[1604,1582]],[[64716,64716],"mapped",[1604,1605]],[[64717,64717],"mapped",[1604,1607]],[[64718,64718],"mapped",[1605,1580]],[[64719,64719],"mapped",[1605,1581]],[[64720,64720],"mapped",[1605,1582]],[[64721,64721],"mapped",[1605,1605]],[[64722,64722],"mapped",[1606,1580]],[[64723,64723],"mapped",[1606,1581]],[[64724,64724],"mapped",[1606,1582]],[[64725,64725],"mapped",[1606,1605]],[[64726,64726],"mapped",[1606,1607]],[[64727,64727],"mapped",[1607,1580]],[[64728,64728],"mapped",[1607,1605]],[[64729,64729],"mapped",[1607,1648]],[[64730,64730],"mapped",[1610,1580]],[[64731,64731],"mapped",[1610,1581]],[[64732,64732],"mapped",[1610,1582]],[[64733,64733],"mapped",[1610,1605]],[[64734,64734],"mapped",[1610,1607]],[[64735,64735],"mapped",[1574,1605]],[[64736,64736],"mapped",[1574,1607]],[[64737,64737],"mapped",[1576,1605]],[[64738,64738],"mapped",[1576,1607]],[[64739,64739],"mapped",[1578,1605]],[[64740,64740],"mapped",[1578,1607]],[[64741,64741],"mapped",[1579,1605]],[[64742,64742],"mapped",[1579,1607]],[[64743,64743],"mapped",[1587,1605]],[[64744,64744],"mapped",[1587,1607]],[[64745,64745],"mapped",[1588,1605]],[[64746,64746],"mapped",[1588,1607]],[[64747,64747],"mapped",[1603,1604]],[[64748,64748],"mapped",[1603,1605]],[[64749,64749],"mapped",[1604,1605]],[[64750,64750],"mapped",[1606,1605]],[[64751,64751],"mapped",[1606,1607]],[[64752,64752],"mapped",[1610,1605]],[[64753,64753],"mapped",[1610,1607]],[[64754,64754],"mapped",[1600,1614,1617]],[[64755,64755],"mapped",[1600,1615,1617]],[[64756,64756],"mapped",[1600,1616,1617]],[[64757,64757],"mapped",[1591,1609]],[[64758,64758],"mapped",[1591,1610]],[[64759,64759],"mapped",[1593,1609]],[[64760,64760],"mapped",[1593,1610]],[[64761,64761],"mapped",[1594,1609]],[[64762,64762],"mapped",[1594,1610]],[[64763,64763],"mapped",[1587,1609]],[[64764,64764],"mapped",[1587,1610]],[[64765,64765],"mapped",[1588,1609]],[[64766,64766],"mapped",[1588,1610]],[[64767,64767],"mapped",[1581,1609]],[[64768,64768],"mapped",[1581,1610]],[[64769,64769],"mapped",[1580,1609]],[[64770,64770],"mapped",[1580,1610]],[[64771,64771],"mapped",[1582,1609]],[[64772,64772],"mapped",[1582,1610]],[[64773,64773],"mapped",[1589,1609]],[[64774,64774],"mapped",[1589,1610]],[[64775,64775],"mapped",[1590,1609]],[[64776,64776],"mapped",[1590,1610]],[[64777,64777],"mapped",[1588,1580]],[[64778,64778],"mapped",[1588,1581]],[[64779,64779],"mapped",[1588,1582]],[[64780,64780],"mapped",[1588,1605]],[[64781,64781],"mapped",[1588,1585]],[[64782,64782],"mapped",[1587,1585]],[[64783,64783],"mapped",[1589,1585]],[[64784,64784],"mapped",[1590,1585]],[[64785,64785],"mapped",[1591,1609]],[[64786,64786],"mapped",[1591,1610]],[[64787,64787],"mapped",[1593,1609]],[[64788,64788],"mapped",[1593,1610]],[[64789,64789],"mapped",[1594,1609]],[[64790,64790],"mapped",[1594,1610]],[[64791,64791],"mapped",[1587,1609]],[[64792,64792],"mapped",[1587,1610]],[[64793,64793],"mapped",[1588,1609]],[[64794,64794],"mapped",[1588,1610]],[[64795,64795],"mapped",[1581,1609]],[[64796,64796],"mapped",[1581,1610]],[[64797,64797],"mapped",[1580,1609]],[[64798,64798],"mapped",[1580,1610]],[[64799,64799],"mapped",[1582,1609]],[[64800,64800],"mapped",[1582,1610]],[[64801,64801],"mapped",[1589,1609]],[[64802,64802],"mapped",[1589,1610]],[[64803,64803],"mapped",[1590,1609]],[[64804,64804],"mapped",[1590,1610]],[[64805,64805],"mapped",[1588,1580]],[[64806,64806],"mapped",[1588,1581]],[[64807,64807],"mapped",[1588,1582]],[[64808,64808],"mapped",[1588,1605]],[[64809,64809],"mapped",[1588,1585]],[[64810,64810],"mapped",[1587,1585]],[[64811,64811],"mapped",[1589,1585]],[[64812,64812],"mapped",[1590,1585]],[[64813,64813],"mapped",[1588,1580]],[[64814,64814],"mapped",[1588,1581]],[[64815,64815],"mapped",[1588,1582]],[[64816,64816],"mapped",[1588,1605]],[[64817,64817],"mapped",[1587,1607]],[[64818,64818],"mapped",[1588,1607]],[[64819,64819],"mapped",[1591,1605]],[[64820,64820],"mapped",[1587,1580]],[[64821,64821],"mapped",[1587,1581]],[[64822,64822],"mapped",[1587,1582]],[[64823,64823],"mapped",[1588,1580]],[[64824,64824],"mapped",[1588,1581]],[[64825,64825],"mapped",[1588,1582]],[[64826,64826],"mapped",[1591,1605]],[[64827,64827],"mapped",[1592,1605]],[[64828,64829],"mapped",[1575,1611]],[[64830,64831],"valid",[],"NV8"],[[64832,64847],"disallowed"],[[64848,64848],"mapped",[1578,1580,1605]],[[64849,64850],"mapped",[1578,1581,1580]],[[64851,64851],"mapped",[1578,1581,1605]],[[64852,64852],"mapped",[1578,1582,1605]],[[64853,64853],"mapped",[1578,1605,1580]],[[64854,64854],"mapped",[1578,1605,1581]],[[64855,64855],"mapped",[1578,1605,1582]],[[64856,64857],"mapped",[1580,1605,1581]],[[64858,64858],"mapped",[1581,1605,1610]],[[64859,64859],"mapped",[1581,1605,1609]],[[64860,64860],"mapped",[1587,1581,1580]],[[64861,64861],"mapped",[1587,1580,1581]],[[64862,64862],"mapped",[1587,1580,1609]],[[64863,64864],"mapped",[1587,1605,1581]],[[64865,64865],"mapped",[1587,1605,1580]],[[64866,64867],"mapped",[1587,1605,1605]],[[64868,64869],"mapped",[1589,1581,1581]],[[64870,64870],"mapped",[1589,1605,1605]],[[64871,64872],"mapped",[1588,1581,1605]],[[64873,64873],"mapped",[1588,1580,1610]],[[64874,64875],"mapped",[1588,1605,1582]],[[64876,64877],"mapped",[1588,1605,1605]],[[64878,64878],"mapped",[1590,1581,1609]],[[64879,64880],"mapped",[1590,1582,1605]],[[64881,64882],"mapped",[1591,1605,1581]],[[64883,64883],"mapped",[1591,1605,1605]],[[64884,64884],"mapped",[1591,1605,1610]],[[64885,64885],"mapped",[1593,1580,1605]],[[64886,64887],"mapped",[1593,1605,1605]],[[64888,64888],"mapped",[1593,1605,1609]],[[64889,64889],"mapped",[1594,1605,1605]],[[64890,64890],"mapped",[1594,1605,1610]],[[64891,64891],"mapped",[1594,1605,1609]],[[64892,64893],"mapped",[1601,1582,1605]],[[64894,64894],"mapped",[1602,1605,1581]],[[64895,64895],"mapped",[1602,1605,1605]],[[64896,64896],"mapped",[1604,1581,1605]],[[64897,64897],"mapped",[1604,1581,1610]],[[64898,64898],"mapped",[1604,1581,1609]],[[64899,64900],"mapped",[1604,1580,1580]],[[64901,64902],"mapped",[1604,1582,1605]],[[64903,64904],"mapped",[1604,1605,1581]],[[64905,64905],"mapped",[1605,1581,1580]],[[64906,64906],"mapped",[1605,1581,1605]],[[64907,64907],"mapped",[1605,1581,1610]],[[64908,64908],"mapped",[1605,1580,1581]],[[64909,64909],"mapped",[1605,1580,1605]],[[64910,64910],"mapped",[1605,1582,1580]],[[64911,64911],"mapped",[1605,1582,1605]],[[64912,64913],"disallowed"],[[64914,64914],"mapped",[1605,1580,1582]],[[64915,64915],"mapped",[1607,1605,1580]],[[64916,64916],"mapped",[1607,1605,1605]],[[64917,64917],"mapped",[1606,1581,1605]],[[64918,64918],"mapped",[1606,1581,1609]],[[64919,64920],"mapped",[1606,1580,1605]],[[64921,64921],"mapped",[1606,1580,1609]],[[64922,64922],"mapped",[1606,1605,1610]],[[64923,64923],"mapped",[1606,1605,1609]],[[64924,64925],"mapped",[1610,1605,1605]],[[64926,64926],"mapped",[1576,1582,1610]],[[64927,64927],"mapped",[1578,1580,1610]],[[64928,64928],"mapped",[1578,1580,1609]],[[64929,64929],"mapped",[1578,1582,1610]],[[64930,64930],"mapped",[1578,1582,1609]],[[64931,64931],"mapped",[1578,1605,1610]],[[64932,64932],"mapped",[1578,1605,1609]],[[64933,64933],"mapped",[1580,1605,1610]],[[64934,64934],"mapped",[1580,1581,1609]],[[64935,64935],"mapped",[1580,1605,1609]],[[64936,64936],"mapped",[1587,1582,1609]],[[64937,64937],"mapped",[1589,1581,1610]],[[64938,64938],"mapped",[1588,1581,1610]],[[64939,64939],"mapped",[1590,1581,1610]],[[64940,64940],"mapped",[1604,1580,1610]],[[64941,64941],"mapped",[1604,1605,1610]],[[64942,64942],"mapped",[1610,1581,1610]],[[64943,64943],"mapped",[1610,1580,1610]],[[64944,64944],"mapped",[1610,1605,1610]],[[64945,64945],"mapped",[1605,1605,1610]],[[64946,64946],"mapped",[1602,1605,1610]],[[64947,64947],"mapped",[1606,1581,1610]],[[64948,64948],"mapped",[1602,1605,1581]],[[64949,64949],"mapped",[1604,1581,1605]],[[64950,64950],"mapped",[1593,1605,1610]],[[64951,64951],"mapped",[1603,1605,1610]],[[64952,64952],"mapped",[1606,1580,1581]],[[64953,64953],"mapped",[1605,1582,1610]],[[64954,64954],"mapped",[1604,1580,1605]],[[64955,64955],"mapped",[1603,1605,1605]],[[64956,64956],"mapped",[1604,1580,1605]],[[64957,64957],"mapped",[1606,1580,1581]],[[64958,64958],"mapped",[1580,1581,1610]],[[64959,64959],"mapped",[1581,1580,1610]],[[64960,64960],"mapped",[1605,1580,1610]],[[64961,64961],"mapped",[1601,1605,1610]],[[64962,64962],"mapped",[1576,1581,1610]],[[64963,64963],"mapped",[1603,1605,1605]],[[64964,64964],"mapped",[1593,1580,1605]],[[64965,64965],"mapped",[1589,1605,1605]],[[64966,64966],"mapped",[1587,1582,1610]],[[64967,64967],"mapped",[1606,1580,1610]],[[64968,64975],"disallowed"],[[64976,65007],"disallowed"],[[65008,65008],"mapped",[1589,1604,1746]],[[65009,65009],"mapped",[1602,1604,1746]],[[65010,65010],"mapped",[1575,1604,1604,1607]],[[65011,65011],"mapped",[1575,1603,1576,1585]],[[65012,65012],"mapped",[1605,1581,1605,1583]],[[65013,65013],"mapped",[1589,1604,1593,1605]],[[65014,65014],"mapped",[1585,1587,1608,1604]],[[65015,65015],"mapped",[1593,1604,1610,1607]],[[65016,65016],"mapped",[1608,1587,1604,1605]],[[65017,65017],"mapped",[1589,1604,1609]],[[65018,65018],"disallowed_STD3_mapped",[1589,1604,1609,32,1575,1604,1604,1607,32,1593,1604,1610,1607,32,1608,1587,1604,1605]],[[65019,65019],"disallowed_STD3_mapped",[1580,1604,32,1580,1604,1575,1604,1607]],[[65020,65020],"mapped",[1585,1740,1575,1604]],[[65021,65021],"valid",[],"NV8"],[[65022,65023],"disallowed"],[[65024,65039],"ignored"],[[65040,65040],"disallowed_STD3_mapped",[44]],[[65041,65041],"mapped",[12289]],[[65042,65042],"disallowed"],[[65043,65043],"disallowed_STD3_mapped",[58]],[[65044,65044],"disallowed_STD3_mapped",[59]],[[65045,65045],"disallowed_STD3_mapped",[33]],[[65046,65046],"disallowed_STD3_mapped",[63]],[[65047,65047],"mapped",[12310]],[[65048,65048],"mapped",[12311]],[[65049,65049],"disallowed"],[[65050,65055],"disallowed"],[[65056,65059],"valid"],[[65060,65062],"valid"],[[65063,65069],"valid"],[[65070,65071],"valid"],[[65072,65072],"disallowed"],[[65073,65073],"mapped",[8212]],[[65074,65074],"mapped",[8211]],[[65075,65076],"disallowed_STD3_mapped",[95]],[[65077,65077],"disallowed_STD3_mapped",[40]],[[65078,65078],"disallowed_STD3_mapped",[41]],[[65079,65079],"disallowed_STD3_mapped",[123]],[[65080,65080],"disallowed_STD3_mapped",[125]],[[65081,65081],"mapped",[12308]],[[65082,65082],"mapped",[12309]],[[65083,65083],"mapped",[12304]],[[65084,65084],"mapped",[12305]],[[65085,65085],"mapped",[12298]],[[65086,65086],"mapped",[12299]],[[65087,65087],"mapped",[12296]],[[65088,65088],"mapped",[12297]],[[65089,65089],"mapped",[12300]],[[65090,65090],"mapped",[12301]],[[65091,65091],"mapped",[12302]],[[65092,65092],"mapped",[12303]],[[65093,65094],"valid",[],"NV8"],[[65095,65095],"disallowed_STD3_mapped",[91]],[[65096,65096],"disallowed_STD3_mapped",[93]],[[65097,65100],"disallowed_STD3_mapped",[32,773]],[[65101,65103],"disallowed_STD3_mapped",[95]],[[65104,65104],"disallowed_STD3_mapped",[44]],[[65105,65105],"mapped",[12289]],[[65106,65106],"disallowed"],[[65107,65107],"disallowed"],[[65108,65108],"disallowed_STD3_mapped",[59]],[[65109,65109],"disallowed_STD3_mapped",[58]],[[65110,65110],"disallowed_STD3_mapped",[63]],[[65111,65111],"disallowed_STD3_mapped",[33]],[[65112,65112],"mapped",[8212]],[[65113,65113],"disallowed_STD3_mapped",[40]],[[65114,65114],"disallowed_STD3_mapped",[41]],[[65115,65115],"disallowed_STD3_mapped",[123]],[[65116,65116],"disallowed_STD3_mapped",[125]],[[65117,65117],"mapped",[12308]],[[65118,65118],"mapped",[12309]],[[65119,65119],"disallowed_STD3_mapped",[35]],[[65120,65120],"disallowed_STD3_mapped",[38]],[[65121,65121],"disallowed_STD3_mapped",[42]],[[65122,65122],"disallowed_STD3_mapped",[43]],[[65123,65123],"mapped",[45]],[[65124,65124],"disallowed_STD3_mapped",[60]],[[65125,65125],"disallowed_STD3_mapped",[62]],[[65126,65126],"disallowed_STD3_mapped",[61]],[[65127,65127],"disallowed"],[[65128,65128],"disallowed_STD3_mapped",[92]],[[65129,65129],"disallowed_STD3_mapped",[36]],[[65130,65130],"disallowed_STD3_mapped",[37]],[[65131,65131],"disallowed_STD3_mapped",[64]],[[65132,65135],"disallowed"],[[65136,65136],"disallowed_STD3_mapped",[32,1611]],[[65137,65137],"mapped",[1600,1611]],[[65138,65138],"disallowed_STD3_mapped",[32,1612]],[[65139,65139],"valid"],[[65140,65140],"disallowed_STD3_mapped",[32,1613]],[[65141,65141],"disallowed"],[[65142,65142],"disallowed_STD3_mapped",[32,1614]],[[65143,65143],"mapped",[1600,1614]],[[65144,65144],"disallowed_STD3_mapped",[32,1615]],[[65145,65145],"mapped",[1600,1615]],[[65146,65146],"disallowed_STD3_mapped",[32,1616]],[[65147,65147],"mapped",[1600,1616]],[[65148,65148],"disallowed_STD3_mapped",[32,1617]],[[65149,65149],"mapped",[1600,1617]],[[65150,65150],"disallowed_STD3_mapped",[32,1618]],[[65151,65151],"mapped",[1600,1618]],[[65152,65152],"mapped",[1569]],[[65153,65154],"mapped",[1570]],[[65155,65156],"mapped",[1571]],[[65157,65158],"mapped",[1572]],[[65159,65160],"mapped",[1573]],[[65161,65164],"mapped",[1574]],[[65165,65166],"mapped",[1575]],[[65167,65170],"mapped",[1576]],[[65171,65172],"mapped",[1577]],[[65173,65176],"mapped",[1578]],[[65177,65180],"mapped",[1579]],[[65181,65184],"mapped",[1580]],[[65185,65188],"mapped",[1581]],[[65189,65192],"mapped",[1582]],[[65193,65194],"mapped",[1583]],[[65195,65196],"mapped",[1584]],[[65197,65198],"mapped",[1585]],[[65199,65200],"mapped",[1586]],[[65201,65204],"mapped",[1587]],[[65205,65208],"mapped",[1588]],[[65209,65212],"mapped",[1589]],[[65213,65216],"mapped",[1590]],[[65217,65220],"mapped",[1591]],[[65221,65224],"mapped",[1592]],[[65225,65228],"mapped",[1593]],[[65229,65232],"mapped",[1594]],[[65233,65236],"mapped",[1601]],[[65237,65240],"mapped",[1602]],[[65241,65244],"mapped",[1603]],[[65245,65248],"mapped",[1604]],[[65249,65252],"mapped",[1605]],[[65253,65256],"mapped",[1606]],[[65257,65260],"mapped",[1607]],[[65261,65262],"mapped",[1608]],[[65263,65264],"mapped",[1609]],[[65265,65268],"mapped",[1610]],[[65269,65270],"mapped",[1604,1570]],[[65271,65272],"mapped",[1604,1571]],[[65273,65274],"mapped",[1604,1573]],[[65275,65276],"mapped",[1604,1575]],[[65277,65278],"disallowed"],[[65279,65279],"ignored"],[[65280,65280],"disallowed"],[[65281,65281],"disallowed_STD3_mapped",[33]],[[65282,65282],"disallowed_STD3_mapped",[34]],[[65283,65283],"disallowed_STD3_mapped",[35]],[[65284,65284],"disallowed_STD3_mapped",[36]],[[65285,65285],"disallowed_STD3_mapped",[37]],[[65286,65286],"disallowed_STD3_mapped",[38]],[[65287,65287],"disallowed_STD3_mapped",[39]],[[65288,65288],"disallowed_STD3_mapped",[40]],[[65289,65289],"disallowed_STD3_mapped",[41]],[[65290,65290],"disallowed_STD3_mapped",[42]],[[65291,65291],"disallowed_STD3_mapped",[43]],[[65292,65292],"disallowed_STD3_mapped",[44]],[[65293,65293],"mapped",[45]],[[65294,65294],"mapped",[46]],[[65295,65295],"disallowed_STD3_mapped",[47]],[[65296,65296],"mapped",[48]],[[65297,65297],"mapped",[49]],[[65298,65298],"mapped",[50]],[[65299,65299],"mapped",[51]],[[65300,65300],"mapped",[52]],[[65301,65301],"mapped",[53]],[[65302,65302],"mapped",[54]],[[65303,65303],"mapped",[55]],[[65304,65304],"mapped",[56]],[[65305,65305],"mapped",[57]],[[65306,65306],"disallowed_STD3_mapped",[58]],[[65307,65307],"disallowed_STD3_mapped",[59]],[[65308,65308],"disallowed_STD3_mapped",[60]],[[65309,65309],"disallowed_STD3_mapped",[61]],[[65310,65310],"disallowed_STD3_mapped",[62]],[[65311,65311],"disallowed_STD3_mapped",[63]],[[65312,65312],"disallowed_STD3_mapped",[64]],[[65313,65313],"mapped",[97]],[[65314,65314],"mapped",[98]],[[65315,65315],"mapped",[99]],[[65316,65316],"mapped",[100]],[[65317,65317],"mapped",[101]],[[65318,65318],"mapped",[102]],[[65319,65319],"mapped",[103]],[[65320,65320],"mapped",[104]],[[65321,65321],"mapped",[105]],[[65322,65322],"mapped",[106]],[[65323,65323],"mapped",[107]],[[65324,65324],"mapped",[108]],[[65325,65325],"mapped",[109]],[[65326,65326],"mapped",[110]],[[65327,65327],"mapped",[111]],[[65328,65328],"mapped",[112]],[[65329,65329],"mapped",[113]],[[65330,65330],"mapped",[114]],[[65331,65331],"mapped",[115]],[[65332,65332],"mapped",[116]],[[65333,65333],"mapped",[117]],[[65334,65334],"mapped",[118]],[[65335,65335],"mapped",[119]],[[65336,65336],"mapped",[120]],[[65337,65337],"mapped",[121]],[[65338,65338],"mapped",[122]],[[65339,65339],"disallowed_STD3_mapped",[91]],[[65340,65340],"disallowed_STD3_mapped",[92]],[[65341,65341],"disallowed_STD3_mapped",[93]],[[65342,65342],"disallowed_STD3_mapped",[94]],[[65343,65343],"disallowed_STD3_mapped",[95]],[[65344,65344],"disallowed_STD3_mapped",[96]],[[65345,65345],"mapped",[97]],[[65346,65346],"mapped",[98]],[[65347,65347],"mapped",[99]],[[65348,65348],"mapped",[100]],[[65349,65349],"mapped",[101]],[[65350,65350],"mapped",[102]],[[65351,65351],"mapped",[103]],[[65352,65352],"mapped",[104]],[[65353,65353],"mapped",[105]],[[65354,65354],"mapped",[106]],[[65355,65355],"mapped",[107]],[[65356,65356],"mapped",[108]],[[65357,65357],"mapped",[109]],[[65358,65358],"mapped",[110]],[[65359,65359],"mapped",[111]],[[65360,65360],"mapped",[112]],[[65361,65361],"mapped",[113]],[[65362,65362],"mapped",[114]],[[65363,65363],"mapped",[115]],[[65364,65364],"mapped",[116]],[[65365,65365],"mapped",[117]],[[65366,65366],"mapped",[118]],[[65367,65367],"mapped",[119]],[[65368,65368],"mapped",[120]],[[65369,65369],"mapped",[121]],[[65370,65370],"mapped",[122]],[[65371,65371],"disallowed_STD3_mapped",[123]],[[65372,65372],"disallowed_STD3_mapped",[124]],[[65373,65373],"disallowed_STD3_mapped",[125]],[[65374,65374],"disallowed_STD3_mapped",[126]],[[65375,65375],"mapped",[10629]],[[65376,65376],"mapped",[10630]],[[65377,65377],"mapped",[46]],[[65378,65378],"mapped",[12300]],[[65379,65379],"mapped",[12301]],[[65380,65380],"mapped",[12289]],[[65381,65381],"mapped",[12539]],[[65382,65382],"mapped",[12530]],[[65383,65383],"mapped",[12449]],[[65384,65384],"mapped",[12451]],[[65385,65385],"mapped",[12453]],[[65386,65386],"mapped",[12455]],[[65387,65387],"mapped",[12457]],[[65388,65388],"mapped",[12515]],[[65389,65389],"mapped",[12517]],[[65390,65390],"mapped",[12519]],[[65391,65391],"mapped",[12483]],[[65392,65392],"mapped",[12540]],[[65393,65393],"mapped",[12450]],[[65394,65394],"mapped",[12452]],[[65395,65395],"mapped",[12454]],[[65396,65396],"mapped",[12456]],[[65397,65397],"mapped",[12458]],[[65398,65398],"mapped",[12459]],[[65399,65399],"mapped",[12461]],[[65400,65400],"mapped",[12463]],[[65401,65401],"mapped",[12465]],[[65402,65402],"mapped",[12467]],[[65403,65403],"mapped",[12469]],[[65404,65404],"mapped",[12471]],[[65405,65405],"mapped",[12473]],[[65406,65406],"mapped",[12475]],[[65407,65407],"mapped",[12477]],[[65408,65408],"mapped",[12479]],[[65409,65409],"mapped",[12481]],[[65410,65410],"mapped",[12484]],[[65411,65411],"mapped",[12486]],[[65412,65412],"mapped",[12488]],[[65413,65413],"mapped",[12490]],[[65414,65414],"mapped",[12491]],[[65415,65415],"mapped",[12492]],[[65416,65416],"mapped",[12493]],[[65417,65417],"mapped",[12494]],[[65418,65418],"mapped",[12495]],[[65419,65419],"mapped",[12498]],[[65420,65420],"mapped",[12501]],[[65421,65421],"mapped",[12504]],[[65422,65422],"mapped",[12507]],[[65423,65423],"mapped",[12510]],[[65424,65424],"mapped",[12511]],[[65425,65425],"mapped",[12512]],[[65426,65426],"mapped",[12513]],[[65427,65427],"mapped",[12514]],[[65428,65428],"mapped",[12516]],[[65429,65429],"mapped",[12518]],[[65430,65430],"mapped",[12520]],[[65431,65431],"mapped",[12521]],[[65432,65432],"mapped",[12522]],[[65433,65433],"mapped",[12523]],[[65434,65434],"mapped",[12524]],[[65435,65435],"mapped",[12525]],[[65436,65436],"mapped",[12527]],[[65437,65437],"mapped",[12531]],[[65438,65438],"mapped",[12441]],[[65439,65439],"mapped",[12442]],[[65440,65440],"disallowed"],[[65441,65441],"mapped",[4352]],[[65442,65442],"mapped",[4353]],[[65443,65443],"mapped",[4522]],[[65444,65444],"mapped",[4354]],[[65445,65445],"mapped",[4524]],[[65446,65446],"mapped",[4525]],[[65447,65447],"mapped",[4355]],[[65448,65448],"mapped",[4356]],[[65449,65449],"mapped",[4357]],[[65450,65450],"mapped",[4528]],[[65451,65451],"mapped",[4529]],[[65452,65452],"mapped",[4530]],[[65453,65453],"mapped",[4531]],[[65454,65454],"mapped",[4532]],[[65455,65455],"mapped",[4533]],[[65456,65456],"mapped",[4378]],[[65457,65457],"mapped",[4358]],[[65458,65458],"mapped",[4359]],[[65459,65459],"mapped",[4360]],[[65460,65460],"mapped",[4385]],[[65461,65461],"mapped",[4361]],[[65462,65462],"mapped",[4362]],[[65463,65463],"mapped",[4363]],[[65464,65464],"mapped",[4364]],[[65465,65465],"mapped",[4365]],[[65466,65466],"mapped",[4366]],[[65467,65467],"mapped",[4367]],[[65468,65468],"mapped",[4368]],[[65469,65469],"mapped",[4369]],[[65470,65470],"mapped",[4370]],[[65471,65473],"disallowed"],[[65474,65474],"mapped",[4449]],[[65475,65475],"mapped",[4450]],[[65476,65476],"mapped",[4451]],[[65477,65477],"mapped",[4452]],[[65478,65478],"mapped",[4453]],[[65479,65479],"mapped",[4454]],[[65480,65481],"disallowed"],[[65482,65482],"mapped",[4455]],[[65483,65483],"mapped",[4456]],[[65484,65484],"mapped",[4457]],[[65485,65485],"mapped",[4458]],[[65486,65486],"mapped",[4459]],[[65487,65487],"mapped",[4460]],[[65488,65489],"disallowed"],[[65490,65490],"mapped",[4461]],[[65491,65491],"mapped",[4462]],[[65492,65492],"mapped",[4463]],[[65493,65493],"mapped",[4464]],[[65494,65494],"mapped",[4465]],[[65495,65495],"mapped",[4466]],[[65496,65497],"disallowed"],[[65498,65498],"mapped",[4467]],[[65499,65499],"mapped",[4468]],[[65500,65500],"mapped",[4469]],[[65501,65503],"disallowed"],[[65504,65504],"mapped",[162]],[[65505,65505],"mapped",[163]],[[65506,65506],"mapped",[172]],[[65507,65507],"disallowed_STD3_mapped",[32,772]],[[65508,65508],"mapped",[166]],[[65509,65509],"mapped",[165]],[[65510,65510],"mapped",[8361]],[[65511,65511],"disallowed"],[[65512,65512],"mapped",[9474]],[[65513,65513],"mapped",[8592]],[[65514,65514],"mapped",[8593]],[[65515,65515],"mapped",[8594]],[[65516,65516],"mapped",[8595]],[[65517,65517],"mapped",[9632]],[[65518,65518],"mapped",[9675]],[[65519,65528],"disallowed"],[[65529,65531],"disallowed"],[[65532,65532],"disallowed"],[[65533,65533],"disallowed"],[[65534,65535],"disallowed"],[[65536,65547],"valid"],[[65548,65548],"disallowed"],[[65549,65574],"valid"],[[65575,65575],"disallowed"],[[65576,65594],"valid"],[[65595,65595],"disallowed"],[[65596,65597],"valid"],[[65598,65598],"disallowed"],[[65599,65613],"valid"],[[65614,65615],"disallowed"],[[65616,65629],"valid"],[[65630,65663],"disallowed"],[[65664,65786],"valid"],[[65787,65791],"disallowed"],[[65792,65794],"valid",[],"NV8"],[[65795,65798],"disallowed"],[[65799,65843],"valid",[],"NV8"],[[65844,65846],"disallowed"],[[65847,65855],"valid",[],"NV8"],[[65856,65930],"valid",[],"NV8"],[[65931,65932],"valid",[],"NV8"],[[65933,65935],"disallowed"],[[65936,65947],"valid",[],"NV8"],[[65948,65951],"disallowed"],[[65952,65952],"valid",[],"NV8"],[[65953,65999],"disallowed"],[[66000,66044],"valid",[],"NV8"],[[66045,66045],"valid"],[[66046,66175],"disallowed"],[[66176,66204],"valid"],[[66205,66207],"disallowed"],[[66208,66256],"valid"],[[66257,66271],"disallowed"],[[66272,66272],"valid"],[[66273,66299],"valid",[],"NV8"],[[66300,66303],"disallowed"],[[66304,66334],"valid"],[[66335,66335],"valid"],[[66336,66339],"valid",[],"NV8"],[[66340,66351],"disallowed"],[[66352,66368],"valid"],[[66369,66369],"valid",[],"NV8"],[[66370,66377],"valid"],[[66378,66378],"valid",[],"NV8"],[[66379,66383],"disallowed"],[[66384,66426],"valid"],[[66427,66431],"disallowed"],[[66432,66461],"valid"],[[66462,66462],"disallowed"],[[66463,66463],"valid",[],"NV8"],[[66464,66499],"valid"],[[66500,66503],"disallowed"],[[66504,66511],"valid"],[[66512,66517],"valid",[],"NV8"],[[66518,66559],"disallowed"],[[66560,66560],"mapped",[66600]],[[66561,66561],"mapped",[66601]],[[66562,66562],"mapped",[66602]],[[66563,66563],"mapped",[66603]],[[66564,66564],"mapped",[66604]],[[66565,66565],"mapped",[66605]],[[66566,66566],"mapped",[66606]],[[66567,66567],"mapped",[66607]],[[66568,66568],"mapped",[66608]],[[66569,66569],"mapped",[66609]],[[66570,66570],"mapped",[66610]],[[66571,66571],"mapped",[66611]],[[66572,66572],"mapped",[66612]],[[66573,66573],"mapped",[66613]],[[66574,66574],"mapped",[66614]],[[66575,66575],"mapped",[66615]],[[66576,66576],"mapped",[66616]],[[66577,66577],"mapped",[66617]],[[66578,66578],"mapped",[66618]],[[66579,66579],"mapped",[66619]],[[66580,66580],"mapped",[66620]],[[66581,66581],"mapped",[66621]],[[66582,66582],"mapped",[66622]],[[66583,66583],"mapped",[66623]],[[66584,66584],"mapped",[66624]],[[66585,66585],"mapped",[66625]],[[66586,66586],"mapped",[66626]],[[66587,66587],"mapped",[66627]],[[66588,66588],"mapped",[66628]],[[66589,66589],"mapped",[66629]],[[66590,66590],"mapped",[66630]],[[66591,66591],"mapped",[66631]],[[66592,66592],"mapped",[66632]],[[66593,66593],"mapped",[66633]],[[66594,66594],"mapped",[66634]],[[66595,66595],"mapped",[66635]],[[66596,66596],"mapped",[66636]],[[66597,66597],"mapped",[66637]],[[66598,66598],"mapped",[66638]],[[66599,66599],"mapped",[66639]],[[66600,66637],"valid"],[[66638,66717],"valid"],[[66718,66719],"disallowed"],[[66720,66729],"valid"],[[66730,66815],"disallowed"],[[66816,66855],"valid"],[[66856,66863],"disallowed"],[[66864,66915],"valid"],[[66916,66926],"disallowed"],[[66927,66927],"valid",[],"NV8"],[[66928,67071],"disallowed"],[[67072,67382],"valid"],[[67383,67391],"disallowed"],[[67392,67413],"valid"],[[67414,67423],"disallowed"],[[67424,67431],"valid"],[[67432,67583],"disallowed"],[[67584,67589],"valid"],[[67590,67591],"disallowed"],[[67592,67592],"valid"],[[67593,67593],"disallowed"],[[67594,67637],"valid"],[[67638,67638],"disallowed"],[[67639,67640],"valid"],[[67641,67643],"disallowed"],[[67644,67644],"valid"],[[67645,67646],"disallowed"],[[67647,67647],"valid"],[[67648,67669],"valid"],[[67670,67670],"disallowed"],[[67671,67679],"valid",[],"NV8"],[[67680,67702],"valid"],[[67703,67711],"valid",[],"NV8"],[[67712,67742],"valid"],[[67743,67750],"disallowed"],[[67751,67759],"valid",[],"NV8"],[[67760,67807],"disallowed"],[[67808,67826],"valid"],[[67827,67827],"disallowed"],[[67828,67829],"valid"],[[67830,67834],"disallowed"],[[67835,67839],"valid",[],"NV8"],[[67840,67861],"valid"],[[67862,67865],"valid",[],"NV8"],[[67866,67867],"valid",[],"NV8"],[[67868,67870],"disallowed"],[[67871,67871],"valid",[],"NV8"],[[67872,67897],"valid"],[[67898,67902],"disallowed"],[[67903,67903],"valid",[],"NV8"],[[67904,67967],"disallowed"],[[67968,68023],"valid"],[[68024,68027],"disallowed"],[[68028,68029],"valid",[],"NV8"],[[68030,68031],"valid"],[[68032,68047],"valid",[],"NV8"],[[68048,68049],"disallowed"],[[68050,68095],"valid",[],"NV8"],[[68096,68099],"valid"],[[68100,68100],"disallowed"],[[68101,68102],"valid"],[[68103,68107],"disallowed"],[[68108,68115],"valid"],[[68116,68116],"disallowed"],[[68117,68119],"valid"],[[68120,68120],"disallowed"],[[68121,68147],"valid"],[[68148,68151],"disallowed"],[[68152,68154],"valid"],[[68155,68158],"disallowed"],[[68159,68159],"valid"],[[68160,68167],"valid",[],"NV8"],[[68168,68175],"disallowed"],[[68176,68184],"valid",[],"NV8"],[[68185,68191],"disallowed"],[[68192,68220],"valid"],[[68221,68223],"valid",[],"NV8"],[[68224,68252],"valid"],[[68253,68255],"valid",[],"NV8"],[[68256,68287],"disallowed"],[[68288,68295],"valid"],[[68296,68296],"valid",[],"NV8"],[[68297,68326],"valid"],[[68327,68330],"disallowed"],[[68331,68342],"valid",[],"NV8"],[[68343,68351],"disallowed"],[[68352,68405],"valid"],[[68406,68408],"disallowed"],[[68409,68415],"valid",[],"NV8"],[[68416,68437],"valid"],[[68438,68439],"disallowed"],[[68440,68447],"valid",[],"NV8"],[[68448,68466],"valid"],[[68467,68471],"disallowed"],[[68472,68479],"valid",[],"NV8"],[[68480,68497],"valid"],[[68498,68504],"disallowed"],[[68505,68508],"valid",[],"NV8"],[[68509,68520],"disallowed"],[[68521,68527],"valid",[],"NV8"],[[68528,68607],"disallowed"],[[68608,68680],"valid"],[[68681,68735],"disallowed"],[[68736,68736],"mapped",[68800]],[[68737,68737],"mapped",[68801]],[[68738,68738],"mapped",[68802]],[[68739,68739],"mapped",[68803]],[[68740,68740],"mapped",[68804]],[[68741,68741],"mapped",[68805]],[[68742,68742],"mapped",[68806]],[[68743,68743],"mapped",[68807]],[[68744,68744],"mapped",[68808]],[[68745,68745],"mapped",[68809]],[[68746,68746],"mapped",[68810]],[[68747,68747],"mapped",[68811]],[[68748,68748],"mapped",[68812]],[[68749,68749],"mapped",[68813]],[[68750,68750],"mapped",[68814]],[[68751,68751],"mapped",[68815]],[[68752,68752],"mapped",[68816]],[[68753,68753],"mapped",[68817]],[[68754,68754],"mapped",[68818]],[[68755,68755],"mapped",[68819]],[[68756,68756],"mapped",[68820]],[[68757,68757],"mapped",[68821]],[[68758,68758],"mapped",[68822]],[[68759,68759],"mapped",[68823]],[[68760,68760],"mapped",[68824]],[[68761,68761],"mapped",[68825]],[[68762,68762],"mapped",[68826]],[[68763,68763],"mapped",[68827]],[[68764,68764],"mapped",[68828]],[[68765,68765],"mapped",[68829]],[[68766,68766],"mapped",[68830]],[[68767,68767],"mapped",[68831]],[[68768,68768],"mapped",[68832]],[[68769,68769],"mapped",[68833]],[[68770,68770],"mapped",[68834]],[[68771,68771],"mapped",[68835]],[[68772,68772],"mapped",[68836]],[[68773,68773],"mapped",[68837]],[[68774,68774],"mapped",[68838]],[[68775,68775],"mapped",[68839]],[[68776,68776],"mapped",[68840]],[[68777,68777],"mapped",[68841]],[[68778,68778],"mapped",[68842]],[[68779,68779],"mapped",[68843]],[[68780,68780],"mapped",[68844]],[[68781,68781],"mapped",[68845]],[[68782,68782],"mapped",[68846]],[[68783,68783],"mapped",[68847]],[[68784,68784],"mapped",[68848]],[[68785,68785],"mapped",[68849]],[[68786,68786],"mapped",[68850]],[[68787,68799],"disallowed"],[[68800,68850],"valid"],[[68851,68857],"disallowed"],[[68858,68863],"valid",[],"NV8"],[[68864,69215],"disallowed"],[[69216,69246],"valid",[],"NV8"],[[69247,69631],"disallowed"],[[69632,69702],"valid"],[[69703,69709],"valid",[],"NV8"],[[69710,69713],"disallowed"],[[69714,69733],"valid",[],"NV8"],[[69734,69743],"valid"],[[69744,69758],"disallowed"],[[69759,69759],"valid"],[[69760,69818],"valid"],[[69819,69820],"valid",[],"NV8"],[[69821,69821],"disallowed"],[[69822,69825],"valid",[],"NV8"],[[69826,69839],"disallowed"],[[69840,69864],"valid"],[[69865,69871],"disallowed"],[[69872,69881],"valid"],[[69882,69887],"disallowed"],[[69888,69940],"valid"],[[69941,69941],"disallowed"],[[69942,69951],"valid"],[[69952,69955],"valid",[],"NV8"],[[69956,69967],"disallowed"],[[69968,70003],"valid"],[[70004,70005],"valid",[],"NV8"],[[70006,70006],"valid"],[[70007,70015],"disallowed"],[[70016,70084],"valid"],[[70085,70088],"valid",[],"NV8"],[[70089,70089],"valid",[],"NV8"],[[70090,70092],"valid"],[[70093,70093],"valid",[],"NV8"],[[70094,70095],"disallowed"],[[70096,70105],"valid"],[[70106,70106],"valid"],[[70107,70107],"valid",[],"NV8"],[[70108,70108],"valid"],[[70109,70111],"valid",[],"NV8"],[[70112,70112],"disallowed"],[[70113,70132],"valid",[],"NV8"],[[70133,70143],"disallowed"],[[70144,70161],"valid"],[[70162,70162],"disallowed"],[[70163,70199],"valid"],[[70200,70205],"valid",[],"NV8"],[[70206,70271],"disallowed"],[[70272,70278],"valid"],[[70279,70279],"disallowed"],[[70280,70280],"valid"],[[70281,70281],"disallowed"],[[70282,70285],"valid"],[[70286,70286],"disallowed"],[[70287,70301],"valid"],[[70302,70302],"disallowed"],[[70303,70312],"valid"],[[70313,70313],"valid",[],"NV8"],[[70314,70319],"disallowed"],[[70320,70378],"valid"],[[70379,70383],"disallowed"],[[70384,70393],"valid"],[[70394,70399],"disallowed"],[[70400,70400],"valid"],[[70401,70403],"valid"],[[70404,70404],"disallowed"],[[70405,70412],"valid"],[[70413,70414],"disallowed"],[[70415,70416],"valid"],[[70417,70418],"disallowed"],[[70419,70440],"valid"],[[70441,70441],"disallowed"],[[70442,70448],"valid"],[[70449,70449],"disallowed"],[[70450,70451],"valid"],[[70452,70452],"disallowed"],[[70453,70457],"valid"],[[70458,70459],"disallowed"],[[70460,70468],"valid"],[[70469,70470],"disallowed"],[[70471,70472],"valid"],[[70473,70474],"disallowed"],[[70475,70477],"valid"],[[70478,70479],"disallowed"],[[70480,70480],"valid"],[[70481,70486],"disallowed"],[[70487,70487],"valid"],[[70488,70492],"disallowed"],[[70493,70499],"valid"],[[70500,70501],"disallowed"],[[70502,70508],"valid"],[[70509,70511],"disallowed"],[[70512,70516],"valid"],[[70517,70783],"disallowed"],[[70784,70853],"valid"],[[70854,70854],"valid",[],"NV8"],[[70855,70855],"valid"],[[70856,70863],"disallowed"],[[70864,70873],"valid"],[[70874,71039],"disallowed"],[[71040,71093],"valid"],[[71094,71095],"disallowed"],[[71096,71104],"valid"],[[71105,71113],"valid",[],"NV8"],[[71114,71127],"valid",[],"NV8"],[[71128,71133],"valid"],[[71134,71167],"disallowed"],[[71168,71232],"valid"],[[71233,71235],"valid",[],"NV8"],[[71236,71236],"valid"],[[71237,71247],"disallowed"],[[71248,71257],"valid"],[[71258,71295],"disallowed"],[[71296,71351],"valid"],[[71352,71359],"disallowed"],[[71360,71369],"valid"],[[71370,71423],"disallowed"],[[71424,71449],"valid"],[[71450,71452],"disallowed"],[[71453,71467],"valid"],[[71468,71471],"disallowed"],[[71472,71481],"valid"],[[71482,71487],"valid",[],"NV8"],[[71488,71839],"disallowed"],[[71840,71840],"mapped",[71872]],[[71841,71841],"mapped",[71873]],[[71842,71842],"mapped",[71874]],[[71843,71843],"mapped",[71875]],[[71844,71844],"mapped",[71876]],[[71845,71845],"mapped",[71877]],[[71846,71846],"mapped",[71878]],[[71847,71847],"mapped",[71879]],[[71848,71848],"mapped",[71880]],[[71849,71849],"mapped",[71881]],[[71850,71850],"mapped",[71882]],[[71851,71851],"mapped",[71883]],[[71852,71852],"mapped",[71884]],[[71853,71853],"mapped",[71885]],[[71854,71854],"mapped",[71886]],[[71855,71855],"mapped",[71887]],[[71856,71856],"mapped",[71888]],[[71857,71857],"mapped",[71889]],[[71858,71858],"mapped",[71890]],[[71859,71859],"mapped",[71891]],[[71860,71860],"mapped",[71892]],[[71861,71861],"mapped",[71893]],[[71862,71862],"mapped",[71894]],[[71863,71863],"mapped",[71895]],[[71864,71864],"mapped",[71896]],[[71865,71865],"mapped",[71897]],[[71866,71866],"mapped",[71898]],[[71867,71867],"mapped",[71899]],[[71868,71868],"mapped",[71900]],[[71869,71869],"mapped",[71901]],[[71870,71870],"mapped",[71902]],[[71871,71871],"mapped",[71903]],[[71872,71913],"valid"],[[71914,71922],"valid",[],"NV8"],[[71923,71934],"disallowed"],[[71935,71935],"valid"],[[71936,72383],"disallowed"],[[72384,72440],"valid"],[[72441,73727],"disallowed"],[[73728,74606],"valid"],[[74607,74648],"valid"],[[74649,74649],"valid"],[[74650,74751],"disallowed"],[[74752,74850],"valid",[],"NV8"],[[74851,74862],"valid",[],"NV8"],[[74863,74863],"disallowed"],[[74864,74867],"valid",[],"NV8"],[[74868,74868],"valid",[],"NV8"],[[74869,74879],"disallowed"],[[74880,75075],"valid"],[[75076,77823],"disallowed"],[[77824,78894],"valid"],[[78895,82943],"disallowed"],[[82944,83526],"valid"],[[83527,92159],"disallowed"],[[92160,92728],"valid"],[[92729,92735],"disallowed"],[[92736,92766],"valid"],[[92767,92767],"disallowed"],[[92768,92777],"valid"],[[92778,92781],"disallowed"],[[92782,92783],"valid",[],"NV8"],[[92784,92879],"disallowed"],[[92880,92909],"valid"],[[92910,92911],"disallowed"],[[92912,92916],"valid"],[[92917,92917],"valid",[],"NV8"],[[92918,92927],"disallowed"],[[92928,92982],"valid"],[[92983,92991],"valid",[],"NV8"],[[92992,92995],"valid"],[[92996,92997],"valid",[],"NV8"],[[92998,93007],"disallowed"],[[93008,93017],"valid"],[[93018,93018],"disallowed"],[[93019,93025],"valid",[],"NV8"],[[93026,93026],"disallowed"],[[93027,93047],"valid"],[[93048,93052],"disallowed"],[[93053,93071],"valid"],[[93072,93951],"disallowed"],[[93952,94020],"valid"],[[94021,94031],"disallowed"],[[94032,94078],"valid"],[[94079,94094],"disallowed"],[[94095,94111],"valid"],[[94112,110591],"disallowed"],[[110592,110593],"valid"],[[110594,113663],"disallowed"],[[113664,113770],"valid"],[[113771,113775],"disallowed"],[[113776,113788],"valid"],[[113789,113791],"disallowed"],[[113792,113800],"valid"],[[113801,113807],"disallowed"],[[113808,113817],"valid"],[[113818,113819],"disallowed"],[[113820,113820],"valid",[],"NV8"],[[113821,113822],"valid"],[[113823,113823],"valid",[],"NV8"],[[113824,113827],"ignored"],[[113828,118783],"disallowed"],[[118784,119029],"valid",[],"NV8"],[[119030,119039],"disallowed"],[[119040,119078],"valid",[],"NV8"],[[119079,119080],"disallowed"],[[119081,119081],"valid",[],"NV8"],[[119082,119133],"valid",[],"NV8"],[[119134,119134],"mapped",[119127,119141]],[[119135,119135],"mapped",[119128,119141]],[[119136,119136],"mapped",[119128,119141,119150]],[[119137,119137],"mapped",[119128,119141,119151]],[[119138,119138],"mapped",[119128,119141,119152]],[[119139,119139],"mapped",[119128,119141,119153]],[[119140,119140],"mapped",[119128,119141,119154]],[[119141,119154],"valid",[],"NV8"],[[119155,119162],"disallowed"],[[119163,119226],"valid",[],"NV8"],[[119227,119227],"mapped",[119225,119141]],[[119228,119228],"mapped",[119226,119141]],[[119229,119229],"mapped",[119225,119141,119150]],[[119230,119230],"mapped",[119226,119141,119150]],[[119231,119231],"mapped",[119225,119141,119151]],[[119232,119232],"mapped",[119226,119141,119151]],[[119233,119261],"valid",[],"NV8"],[[119262,119272],"valid",[],"NV8"],[[119273,119295],"disallowed"],[[119296,119365],"valid",[],"NV8"],[[119366,119551],"disallowed"],[[119552,119638],"valid",[],"NV8"],[[119639,119647],"disallowed"],[[119648,119665],"valid",[],"NV8"],[[119666,119807],"disallowed"],[[119808,119808],"mapped",[97]],[[119809,119809],"mapped",[98]],[[119810,119810],"mapped",[99]],[[119811,119811],"mapped",[100]],[[119812,119812],"mapped",[101]],[[119813,119813],"mapped",[102]],[[119814,119814],"mapped",[103]],[[119815,119815],"mapped",[104]],[[119816,119816],"mapped",[105]],[[119817,119817],"mapped",[106]],[[119818,119818],"mapped",[107]],[[119819,119819],"mapped",[108]],[[119820,119820],"mapped",[109]],[[119821,119821],"mapped",[110]],[[119822,119822],"mapped",[111]],[[119823,119823],"mapped",[112]],[[119824,119824],"mapped",[113]],[[119825,119825],"mapped",[114]],[[119826,119826],"mapped",[115]],[[119827,119827],"mapped",[116]],[[119828,119828],"mapped",[117]],[[119829,119829],"mapped",[118]],[[119830,119830],"mapped",[119]],[[119831,119831],"mapped",[120]],[[119832,119832],"mapped",[121]],[[119833,119833],"mapped",[122]],[[119834,119834],"mapped",[97]],[[119835,119835],"mapped",[98]],[[119836,119836],"mapped",[99]],[[119837,119837],"mapped",[100]],[[119838,119838],"mapped",[101]],[[119839,119839],"mapped",[102]],[[119840,119840],"mapped",[103]],[[119841,119841],"mapped",[104]],[[119842,119842],"mapped",[105]],[[119843,119843],"mapped",[106]],[[119844,119844],"mapped",[107]],[[119845,119845],"mapped",[108]],[[119846,119846],"mapped",[109]],[[119847,119847],"mapped",[110]],[[119848,119848],"mapped",[111]],[[119849,119849],"mapped",[112]],[[119850,119850],"mapped",[113]],[[119851,119851],"mapped",[114]],[[119852,119852],"mapped",[115]],[[119853,119853],"mapped",[116]],[[119854,119854],"mapped",[117]],[[119855,119855],"mapped",[118]],[[119856,119856],"mapped",[119]],[[119857,119857],"mapped",[120]],[[119858,119858],"mapped",[121]],[[119859,119859],"mapped",[122]],[[119860,119860],"mapped",[97]],[[119861,119861],"mapped",[98]],[[119862,119862],"mapped",[99]],[[119863,119863],"mapped",[100]],[[119864,119864],"mapped",[101]],[[119865,119865],"mapped",[102]],[[119866,119866],"mapped",[103]],[[119867,119867],"mapped",[104]],[[119868,119868],"mapped",[105]],[[119869,119869],"mapped",[106]],[[119870,119870],"mapped",[107]],[[119871,119871],"mapped",[108]],[[119872,119872],"mapped",[109]],[[119873,119873],"mapped",[110]],[[119874,119874],"mapped",[111]],[[119875,119875],"mapped",[112]],[[119876,119876],"mapped",[113]],[[119877,119877],"mapped",[114]],[[119878,119878],"mapped",[115]],[[119879,119879],"mapped",[116]],[[119880,119880],"mapped",[117]],[[119881,119881],"mapped",[118]],[[119882,119882],"mapped",[119]],[[119883,119883],"mapped",[120]],[[119884,119884],"mapped",[121]],[[119885,119885],"mapped",[122]],[[119886,119886],"mapped",[97]],[[119887,119887],"mapped",[98]],[[119888,119888],"mapped",[99]],[[119889,119889],"mapped",[100]],[[119890,119890],"mapped",[101]],[[119891,119891],"mapped",[102]],[[119892,119892],"mapped",[103]],[[119893,119893],"disallowed"],[[119894,119894],"mapped",[105]],[[119895,119895],"mapped",[106]],[[119896,119896],"mapped",[107]],[[119897,119897],"mapped",[108]],[[119898,119898],"mapped",[109]],[[119899,119899],"mapped",[110]],[[119900,119900],"mapped",[111]],[[119901,119901],"mapped",[112]],[[119902,119902],"mapped",[113]],[[119903,119903],"mapped",[114]],[[119904,119904],"mapped",[115]],[[119905,119905],"mapped",[116]],[[119906,119906],"mapped",[117]],[[119907,119907],"mapped",[118]],[[119908,119908],"mapped",[119]],[[119909,119909],"mapped",[120]],[[119910,119910],"mapped",[121]],[[119911,119911],"mapped",[122]],[[119912,119912],"mapped",[97]],[[119913,119913],"mapped",[98]],[[119914,119914],"mapped",[99]],[[119915,119915],"mapped",[100]],[[119916,119916],"mapped",[101]],[[119917,119917],"mapped",[102]],[[119918,119918],"mapped",[103]],[[119919,119919],"mapped",[104]],[[119920,119920],"mapped",[105]],[[119921,119921],"mapped",[106]],[[119922,119922],"mapped",[107]],[[119923,119923],"mapped",[108]],[[119924,119924],"mapped",[109]],[[119925,119925],"mapped",[110]],[[119926,119926],"mapped",[111]],[[119927,119927],"mapped",[112]],[[119928,119928],"mapped",[113]],[[119929,119929],"mapped",[114]],[[119930,119930],"mapped",[115]],[[119931,119931],"mapped",[116]],[[119932,119932],"mapped",[117]],[[119933,119933],"mapped",[118]],[[119934,119934],"mapped",[119]],[[119935,119935],"mapped",[120]],[[119936,119936],"mapped",[121]],[[119937,119937],"mapped",[122]],[[119938,119938],"mapped",[97]],[[119939,119939],"mapped",[98]],[[119940,119940],"mapped",[99]],[[119941,119941],"mapped",[100]],[[119942,119942],"mapped",[101]],[[119943,119943],"mapped",[102]],[[119944,119944],"mapped",[103]],[[119945,119945],"mapped",[104]],[[119946,119946],"mapped",[105]],[[119947,119947],"mapped",[106]],[[119948,119948],"mapped",[107]],[[119949,119949],"mapped",[108]],[[119950,119950],"mapped",[109]],[[119951,119951],"mapped",[110]],[[119952,119952],"mapped",[111]],[[119953,119953],"mapped",[112]],[[119954,119954],"mapped",[113]],[[119955,119955],"mapped",[114]],[[119956,119956],"mapped",[115]],[[119957,119957],"mapped",[116]],[[119958,119958],"mapped",[117]],[[119959,119959],"mapped",[118]],[[119960,119960],"mapped",[119]],[[119961,119961],"mapped",[120]],[[119962,119962],"mapped",[121]],[[119963,119963],"mapped",[122]],[[119964,119964],"mapped",[97]],[[119965,119965],"disallowed"],[[119966,119966],"mapped",[99]],[[119967,119967],"mapped",[100]],[[119968,119969],"disallowed"],[[119970,119970],"mapped",[103]],[[119971,119972],"disallowed"],[[119973,119973],"mapped",[106]],[[119974,119974],"mapped",[107]],[[119975,119976],"disallowed"],[[119977,119977],"mapped",[110]],[[119978,119978],"mapped",[111]],[[119979,119979],"mapped",[112]],[[119980,119980],"mapped",[113]],[[119981,119981],"disallowed"],[[119982,119982],"mapped",[115]],[[119983,119983],"mapped",[116]],[[119984,119984],"mapped",[117]],[[119985,119985],"mapped",[118]],[[119986,119986],"mapped",[119]],[[119987,119987],"mapped",[120]],[[119988,119988],"mapped",[121]],[[119989,119989],"mapped",[122]],[[119990,119990],"mapped",[97]],[[119991,119991],"mapped",[98]],[[119992,119992],"mapped",[99]],[[119993,119993],"mapped",[100]],[[119994,119994],"disallowed"],[[119995,119995],"mapped",[102]],[[119996,119996],"disallowed"],[[119997,119997],"mapped",[104]],[[119998,119998],"mapped",[105]],[[119999,119999],"mapped",[106]],[[120000,120000],"mapped",[107]],[[120001,120001],"mapped",[108]],[[120002,120002],"mapped",[109]],[[120003,120003],"mapped",[110]],[[120004,120004],"disallowed"],[[120005,120005],"mapped",[112]],[[120006,120006],"mapped",[113]],[[120007,120007],"mapped",[114]],[[120008,120008],"mapped",[115]],[[120009,120009],"mapped",[116]],[[120010,120010],"mapped",[117]],[[120011,120011],"mapped",[118]],[[120012,120012],"mapped",[119]],[[120013,120013],"mapped",[120]],[[120014,120014],"mapped",[121]],[[120015,120015],"mapped",[122]],[[120016,120016],"mapped",[97]],[[120017,120017],"mapped",[98]],[[120018,120018],"mapped",[99]],[[120019,120019],"mapped",[100]],[[120020,120020],"mapped",[101]],[[120021,120021],"mapped",[102]],[[120022,120022],"mapped",[103]],[[120023,120023],"mapped",[104]],[[120024,120024],"mapped",[105]],[[120025,120025],"mapped",[106]],[[120026,120026],"mapped",[107]],[[120027,120027],"mapped",[108]],[[120028,120028],"mapped",[109]],[[120029,120029],"mapped",[110]],[[120030,120030],"mapped",[111]],[[120031,120031],"mapped",[112]],[[120032,120032],"mapped",[113]],[[120033,120033],"mapped",[114]],[[120034,120034],"mapped",[115]],[[120035,120035],"mapped",[116]],[[120036,120036],"mapped",[117]],[[120037,120037],"mapped",[118]],[[120038,120038],"mapped",[119]],[[120039,120039],"mapped",[120]],[[120040,120040],"mapped",[121]],[[120041,120041],"mapped",[122]],[[120042,120042],"mapped",[97]],[[120043,120043],"mapped",[98]],[[120044,120044],"mapped",[99]],[[120045,120045],"mapped",[100]],[[120046,120046],"mapped",[101]],[[120047,120047],"mapped",[102]],[[120048,120048],"mapped",[103]],[[120049,120049],"mapped",[104]],[[120050,120050],"mapped",[105]],[[120051,120051],"mapped",[106]],[[120052,120052],"mapped",[107]],[[120053,120053],"mapped",[108]],[[120054,120054],"mapped",[109]],[[120055,120055],"mapped",[110]],[[120056,120056],"mapped",[111]],[[120057,120057],"mapped",[112]],[[120058,120058],"mapped",[113]],[[120059,120059],"mapped",[114]],[[120060,120060],"mapped",[115]],[[120061,120061],"mapped",[116]],[[120062,120062],"mapped",[117]],[[120063,120063],"mapped",[118]],[[120064,120064],"mapped",[119]],[[120065,120065],"mapped",[120]],[[120066,120066],"mapped",[121]],[[120067,120067],"mapped",[122]],[[120068,120068],"mapped",[97]],[[120069,120069],"mapped",[98]],[[120070,120070],"disallowed"],[[120071,120071],"mapped",[100]],[[120072,120072],"mapped",[101]],[[120073,120073],"mapped",[102]],[[120074,120074],"mapped",[103]],[[120075,120076],"disallowed"],[[120077,120077],"mapped",[106]],[[120078,120078],"mapped",[107]],[[120079,120079],"mapped",[108]],[[120080,120080],"mapped",[109]],[[120081,120081],"mapped",[110]],[[120082,120082],"mapped",[111]],[[120083,120083],"mapped",[112]],[[120084,120084],"mapped",[113]],[[120085,120085],"disallowed"],[[120086,120086],"mapped",[115]],[[120087,120087],"mapped",[116]],[[120088,120088],"mapped",[117]],[[120089,120089],"mapped",[118]],[[120090,120090],"mapped",[119]],[[120091,120091],"mapped",[120]],[[120092,120092],"mapped",[121]],[[120093,120093],"disallowed"],[[120094,120094],"mapped",[97]],[[120095,120095],"mapped",[98]],[[120096,120096],"mapped",[99]],[[120097,120097],"mapped",[100]],[[120098,120098],"mapped",[101]],[[120099,120099],"mapped",[102]],[[120100,120100],"mapped",[103]],[[120101,120101],"mapped",[104]],[[120102,120102],"mapped",[105]],[[120103,120103],"mapped",[106]],[[120104,120104],"mapped",[107]],[[120105,120105],"mapped",[108]],[[120106,120106],"mapped",[109]],[[120107,120107],"mapped",[110]],[[120108,120108],"mapped",[111]],[[120109,120109],"mapped",[112]],[[120110,120110],"mapped",[113]],[[120111,120111],"mapped",[114]],[[120112,120112],"mapped",[115]],[[120113,120113],"mapped",[116]],[[120114,120114],"mapped",[117]],[[120115,120115],"mapped",[118]],[[120116,120116],"mapped",[119]],[[120117,120117],"mapped",[120]],[[120118,120118],"mapped",[121]],[[120119,120119],"mapped",[122]],[[120120,120120],"mapped",[97]],[[120121,120121],"mapped",[98]],[[120122,120122],"disallowed"],[[120123,120123],"mapped",[100]],[[120124,120124],"mapped",[101]],[[120125,120125],"mapped",[102]],[[120126,120126],"mapped",[103]],[[120127,120127],"disallowed"],[[120128,120128],"mapped",[105]],[[120129,120129],"mapped",[106]],[[120130,120130],"mapped",[107]],[[120131,120131],"mapped",[108]],[[120132,120132],"mapped",[109]],[[120133,120133],"disallowed"],[[120134,120134],"mapped",[111]],[[120135,120137],"disallowed"],[[120138,120138],"mapped",[115]],[[120139,120139],"mapped",[116]],[[120140,120140],"mapped",[117]],[[120141,120141],"mapped",[118]],[[120142,120142],"mapped",[119]],[[120143,120143],"mapped",[120]],[[120144,120144],"mapped",[121]],[[120145,120145],"disallowed"],[[120146,120146],"mapped",[97]],[[120147,120147],"mapped",[98]],[[120148,120148],"mapped",[99]],[[120149,120149],"mapped",[100]],[[120150,120150],"mapped",[101]],[[120151,120151],"mapped",[102]],[[120152,120152],"mapped",[103]],[[120153,120153],"mapped",[104]],[[120154,120154],"mapped",[105]],[[120155,120155],"mapped",[106]],[[120156,120156],"mapped",[107]],[[120157,120157],"mapped",[108]],[[120158,120158],"mapped",[109]],[[120159,120159],"mapped",[110]],[[120160,120160],"mapped",[111]],[[120161,120161],"mapped",[112]],[[120162,120162],"mapped",[113]],[[120163,120163],"mapped",[114]],[[120164,120164],"mapped",[115]],[[120165,120165],"mapped",[116]],[[120166,120166],"mapped",[117]],[[120167,120167],"mapped",[118]],[[120168,120168],"mapped",[119]],[[120169,120169],"mapped",[120]],[[120170,120170],"mapped",[121]],[[120171,120171],"mapped",[122]],[[120172,120172],"mapped",[97]],[[120173,120173],"mapped",[98]],[[120174,120174],"mapped",[99]],[[120175,120175],"mapped",[100]],[[120176,120176],"mapped",[101]],[[120177,120177],"mapped",[102]],[[120178,120178],"mapped",[103]],[[120179,120179],"mapped",[104]],[[120180,120180],"mapped",[105]],[[120181,120181],"mapped",[106]],[[120182,120182],"mapped",[107]],[[120183,120183],"mapped",[108]],[[120184,120184],"mapped",[109]],[[120185,120185],"mapped",[110]],[[120186,120186],"mapped",[111]],[[120187,120187],"mapped",[112]],[[120188,120188],"mapped",[113]],[[120189,120189],"mapped",[114]],[[120190,120190],"mapped",[115]],[[120191,120191],"mapped",[116]],[[120192,120192],"mapped",[117]],[[120193,120193],"mapped",[118]],[[120194,120194],"mapped",[119]],[[120195,120195],"mapped",[120]],[[120196,120196],"mapped",[121]],[[120197,120197],"mapped",[122]],[[120198,120198],"mapped",[97]],[[120199,120199],"mapped",[98]],[[120200,120200],"mapped",[99]],[[120201,120201],"mapped",[100]],[[120202,120202],"mapped",[101]],[[120203,120203],"mapped",[102]],[[120204,120204],"mapped",[103]],[[120205,120205],"mapped",[104]],[[120206,120206],"mapped",[105]],[[120207,120207],"mapped",[106]],[[120208,120208],"mapped",[107]],[[120209,120209],"mapped",[108]],[[120210,120210],"mapped",[109]],[[120211,120211],"mapped",[110]],[[120212,120212],"mapped",[111]],[[120213,120213],"mapped",[112]],[[120214,120214],"mapped",[113]],[[120215,120215],"mapped",[114]],[[120216,120216],"mapped",[115]],[[120217,120217],"mapped",[116]],[[120218,120218],"mapped",[117]],[[120219,120219],"mapped",[118]],[[120220,120220],"mapped",[119]],[[120221,120221],"mapped",[120]],[[120222,120222],"mapped",[121]],[[120223,120223],"mapped",[122]],[[120224,120224],"mapped",[97]],[[120225,120225],"mapped",[98]],[[120226,120226],"mapped",[99]],[[120227,120227],"mapped",[100]],[[120228,120228],"mapped",[101]],[[120229,120229],"mapped",[102]],[[120230,120230],"mapped",[103]],[[120231,120231],"mapped",[104]],[[120232,120232],"mapped",[105]],[[120233,120233],"mapped",[106]],[[120234,120234],"mapped",[107]],[[120235,120235],"mapped",[108]],[[120236,120236],"mapped",[109]],[[120237,120237],"mapped",[110]],[[120238,120238],"mapped",[111]],[[120239,120239],"mapped",[112]],[[120240,120240],"mapped",[113]],[[120241,120241],"mapped",[114]],[[120242,120242],"mapped",[115]],[[120243,120243],"mapped",[116]],[[120244,120244],"mapped",[117]],[[120245,120245],"mapped",[118]],[[120246,120246],"mapped",[119]],[[120247,120247],"mapped",[120]],[[120248,120248],"mapped",[121]],[[120249,120249],"mapped",[122]],[[120250,120250],"mapped",[97]],[[120251,120251],"mapped",[98]],[[120252,120252],"mapped",[99]],[[120253,120253],"mapped",[100]],[[120254,120254],"mapped",[101]],[[120255,120255],"mapped",[102]],[[120256,120256],"mapped",[103]],[[120257,120257],"mapped",[104]],[[120258,120258],"mapped",[105]],[[120259,120259],"mapped",[106]],[[120260,120260],"mapped",[107]],[[120261,120261],"mapped",[108]],[[120262,120262],"mapped",[109]],[[120263,120263],"mapped",[110]],[[120264,120264],"mapped",[111]],[[120265,120265],"mapped",[112]],[[120266,120266],"mapped",[113]],[[120267,120267],"mapped",[114]],[[120268,120268],"mapped",[115]],[[120269,120269],"mapped",[116]],[[120270,120270],"mapped",[117]],[[120271,120271],"mapped",[118]],[[120272,120272],"mapped",[119]],[[120273,120273],"mapped",[120]],[[120274,120274],"mapped",[121]],[[120275,120275],"mapped",[122]],[[120276,120276],"mapped",[97]],[[120277,120277],"mapped",[98]],[[120278,120278],"mapped",[99]],[[120279,120279],"mapped",[100]],[[120280,120280],"mapped",[101]],[[120281,120281],"mapped",[102]],[[120282,120282],"mapped",[103]],[[120283,120283],"mapped",[104]],[[120284,120284],"mapped",[105]],[[120285,120285],"mapped",[106]],[[120286,120286],"mapped",[107]],[[120287,120287],"mapped",[108]],[[120288,120288],"mapped",[109]],[[120289,120289],"mapped",[110]],[[120290,120290],"mapped",[111]],[[120291,120291],"mapped",[112]],[[120292,120292],"mapped",[113]],[[120293,120293],"mapped",[114]],[[120294,120294],"mapped",[115]],[[120295,120295],"mapped",[116]],[[120296,120296],"mapped",[117]],[[120297,120297],"mapped",[118]],[[120298,120298],"mapped",[119]],[[120299,120299],"mapped",[120]],[[120300,120300],"mapped",[121]],[[120301,120301],"mapped",[122]],[[120302,120302],"mapped",[97]],[[120303,120303],"mapped",[98]],[[120304,120304],"mapped",[99]],[[120305,120305],"mapped",[100]],[[120306,120306],"mapped",[101]],[[120307,120307],"mapped",[102]],[[120308,120308],"mapped",[103]],[[120309,120309],"mapped",[104]],[[120310,120310],"mapped",[105]],[[120311,120311],"mapped",[106]],[[120312,120312],"mapped",[107]],[[120313,120313],"mapped",[108]],[[120314,120314],"mapped",[109]],[[120315,120315],"mapped",[110]],[[120316,120316],"mapped",[111]],[[120317,120317],"mapped",[112]],[[120318,120318],"mapped",[113]],[[120319,120319],"mapped",[114]],[[120320,120320],"mapped",[115]],[[120321,120321],"mapped",[116]],[[120322,120322],"mapped",[117]],[[120323,120323],"mapped",[118]],[[120324,120324],"mapped",[119]],[[120325,120325],"mapped",[120]],[[120326,120326],"mapped",[121]],[[120327,120327],"mapped",[122]],[[120328,120328],"mapped",[97]],[[120329,120329],"mapped",[98]],[[120330,120330],"mapped",[99]],[[120331,120331],"mapped",[100]],[[120332,120332],"mapped",[101]],[[120333,120333],"mapped",[102]],[[120334,120334],"mapped",[103]],[[120335,120335],"mapped",[104]],[[120336,120336],"mapped",[105]],[[120337,120337],"mapped",[106]],[[120338,120338],"mapped",[107]],[[120339,120339],"mapped",[108]],[[120340,120340],"mapped",[109]],[[120341,120341],"mapped",[110]],[[120342,120342],"mapped",[111]],[[120343,120343],"mapped",[112]],[[120344,120344],"mapped",[113]],[[120345,120345],"mapped",[114]],[[120346,120346],"mapped",[115]],[[120347,120347],"mapped",[116]],[[120348,120348],"mapped",[117]],[[120349,120349],"mapped",[118]],[[120350,120350],"mapped",[119]],[[120351,120351],"mapped",[120]],[[120352,120352],"mapped",[121]],[[120353,120353],"mapped",[122]],[[120354,120354],"mapped",[97]],[[120355,120355],"mapped",[98]],[[120356,120356],"mapped",[99]],[[120357,120357],"mapped",[100]],[[120358,120358],"mapped",[101]],[[120359,120359],"mapped",[102]],[[120360,120360],"mapped",[103]],[[120361,120361],"mapped",[104]],[[120362,120362],"mapped",[105]],[[120363,120363],"mapped",[106]],[[120364,120364],"mapped",[107]],[[120365,120365],"mapped",[108]],[[120366,120366],"mapped",[109]],[[120367,120367],"mapped",[110]],[[120368,120368],"mapped",[111]],[[120369,120369],"mapped",[112]],[[120370,120370],"mapped",[113]],[[120371,120371],"mapped",[114]],[[120372,120372],"mapped",[115]],[[120373,120373],"mapped",[116]],[[120374,120374],"mapped",[117]],[[120375,120375],"mapped",[118]],[[120376,120376],"mapped",[119]],[[120377,120377],"mapped",[120]],[[120378,120378],"mapped",[121]],[[120379,120379],"mapped",[122]],[[120380,120380],"mapped",[97]],[[120381,120381],"mapped",[98]],[[120382,120382],"mapped",[99]],[[120383,120383],"mapped",[100]],[[120384,120384],"mapped",[101]],[[120385,120385],"mapped",[102]],[[120386,120386],"mapped",[103]],[[120387,120387],"mapped",[104]],[[120388,120388],"mapped",[105]],[[120389,120389],"mapped",[106]],[[120390,120390],"mapped",[107]],[[120391,120391],"mapped",[108]],[[120392,120392],"mapped",[109]],[[120393,120393],"mapped",[110]],[[120394,120394],"mapped",[111]],[[120395,120395],"mapped",[112]],[[120396,120396],"mapped",[113]],[[120397,120397],"mapped",[114]],[[120398,120398],"mapped",[115]],[[120399,120399],"mapped",[116]],[[120400,120400],"mapped",[117]],[[120401,120401],"mapped",[118]],[[120402,120402],"mapped",[119]],[[120403,120403],"mapped",[120]],[[120404,120404],"mapped",[121]],[[120405,120405],"mapped",[122]],[[120406,120406],"mapped",[97]],[[120407,120407],"mapped",[98]],[[120408,120408],"mapped",[99]],[[120409,120409],"mapped",[100]],[[120410,120410],"mapped",[101]],[[120411,120411],"mapped",[102]],[[120412,120412],"mapped",[103]],[[120413,120413],"mapped",[104]],[[120414,120414],"mapped",[105]],[[120415,120415],"mapped",[106]],[[120416,120416],"mapped",[107]],[[120417,120417],"mapped",[108]],[[120418,120418],"mapped",[109]],[[120419,120419],"mapped",[110]],[[120420,120420],"mapped",[111]],[[120421,120421],"mapped",[112]],[[120422,120422],"mapped",[113]],[[120423,120423],"mapped",[114]],[[120424,120424],"mapped",[115]],[[120425,120425],"mapped",[116]],[[120426,120426],"mapped",[117]],[[120427,120427],"mapped",[118]],[[120428,120428],"mapped",[119]],[[120429,120429],"mapped",[120]],[[120430,120430],"mapped",[121]],[[120431,120431],"mapped",[122]],[[120432,120432],"mapped",[97]],[[120433,120433],"mapped",[98]],[[120434,120434],"mapped",[99]],[[120435,120435],"mapped",[100]],[[120436,120436],"mapped",[101]],[[120437,120437],"mapped",[102]],[[120438,120438],"mapped",[103]],[[120439,120439],"mapped",[104]],[[120440,120440],"mapped",[105]],[[120441,120441],"mapped",[106]],[[120442,120442],"mapped",[107]],[[120443,120443],"mapped",[108]],[[120444,120444],"mapped",[109]],[[120445,120445],"mapped",[110]],[[120446,120446],"mapped",[111]],[[120447,120447],"mapped",[112]],[[120448,120448],"mapped",[113]],[[120449,120449],"mapped",[114]],[[120450,120450],"mapped",[115]],[[120451,120451],"mapped",[116]],[[120452,120452],"mapped",[117]],[[120453,120453],"mapped",[118]],[[120454,120454],"mapped",[119]],[[120455,120455],"mapped",[120]],[[120456,120456],"mapped",[121]],[[120457,120457],"mapped",[122]],[[120458,120458],"mapped",[97]],[[120459,120459],"mapped",[98]],[[120460,120460],"mapped",[99]],[[120461,120461],"mapped",[100]],[[120462,120462],"mapped",[101]],[[120463,120463],"mapped",[102]],[[120464,120464],"mapped",[103]],[[120465,120465],"mapped",[104]],[[120466,120466],"mapped",[105]],[[120467,120467],"mapped",[106]],[[120468,120468],"mapped",[107]],[[120469,120469],"mapped",[108]],[[120470,120470],"mapped",[109]],[[120471,120471],"mapped",[110]],[[120472,120472],"mapped",[111]],[[120473,120473],"mapped",[112]],[[120474,120474],"mapped",[113]],[[120475,120475],"mapped",[114]],[[120476,120476],"mapped",[115]],[[120477,120477],"mapped",[116]],[[120478,120478],"mapped",[117]],[[120479,120479],"mapped",[118]],[[120480,120480],"mapped",[119]],[[120481,120481],"mapped",[120]],[[120482,120482],"mapped",[121]],[[120483,120483],"mapped",[122]],[[120484,120484],"mapped",[305]],[[120485,120485],"mapped",[567]],[[120486,120487],"disallowed"],[[120488,120488],"mapped",[945]],[[120489,120489],"mapped",[946]],[[120490,120490],"mapped",[947]],[[120491,120491],"mapped",[948]],[[120492,120492],"mapped",[949]],[[120493,120493],"mapped",[950]],[[120494,120494],"mapped",[951]],[[120495,120495],"mapped",[952]],[[120496,120496],"mapped",[953]],[[120497,120497],"mapped",[954]],[[120498,120498],"mapped",[955]],[[120499,120499],"mapped",[956]],[[120500,120500],"mapped",[957]],[[120501,120501],"mapped",[958]],[[120502,120502],"mapped",[959]],[[120503,120503],"mapped",[960]],[[120504,120504],"mapped",[961]],[[120505,120505],"mapped",[952]],[[120506,120506],"mapped",[963]],[[120507,120507],"mapped",[964]],[[120508,120508],"mapped",[965]],[[120509,120509],"mapped",[966]],[[120510,120510],"mapped",[967]],[[120511,120511],"mapped",[968]],[[120512,120512],"mapped",[969]],[[120513,120513],"mapped",[8711]],[[120514,120514],"mapped",[945]],[[120515,120515],"mapped",[946]],[[120516,120516],"mapped",[947]],[[120517,120517],"mapped",[948]],[[120518,120518],"mapped",[949]],[[120519,120519],"mapped",[950]],[[120520,120520],"mapped",[951]],[[120521,120521],"mapped",[952]],[[120522,120522],"mapped",[953]],[[120523,120523],"mapped",[954]],[[120524,120524],"mapped",[955]],[[120525,120525],"mapped",[956]],[[120526,120526],"mapped",[957]],[[120527,120527],"mapped",[958]],[[120528,120528],"mapped",[959]],[[120529,120529],"mapped",[960]],[[120530,120530],"mapped",[961]],[[120531,120532],"mapped",[963]],[[120533,120533],"mapped",[964]],[[120534,120534],"mapped",[965]],[[120535,120535],"mapped",[966]],[[120536,120536],"mapped",[967]],[[120537,120537],"mapped",[968]],[[120538,120538],"mapped",[969]],[[120539,120539],"mapped",[8706]],[[120540,120540],"mapped",[949]],[[120541,120541],"mapped",[952]],[[120542,120542],"mapped",[954]],[[120543,120543],"mapped",[966]],[[120544,120544],"mapped",[961]],[[120545,120545],"mapped",[960]],[[120546,120546],"mapped",[945]],[[120547,120547],"mapped",[946]],[[120548,120548],"mapped",[947]],[[120549,120549],"mapped",[948]],[[120550,120550],"mapped",[949]],[[120551,120551],"mapped",[950]],[[120552,120552],"mapped",[951]],[[120553,120553],"mapped",[952]],[[120554,120554],"mapped",[953]],[[120555,120555],"mapped",[954]],[[120556,120556],"mapped",[955]],[[120557,120557],"mapped",[956]],[[120558,120558],"mapped",[957]],[[120559,120559],"mapped",[958]],[[120560,120560],"mapped",[959]],[[120561,120561],"mapped",[960]],[[120562,120562],"mapped",[961]],[[120563,120563],"mapped",[952]],[[120564,120564],"mapped",[963]],[[120565,120565],"mapped",[964]],[[120566,120566],"mapped",[965]],[[120567,120567],"mapped",[966]],[[120568,120568],"mapped",[967]],[[120569,120569],"mapped",[968]],[[120570,120570],"mapped",[969]],[[120571,120571],"mapped",[8711]],[[120572,120572],"mapped",[945]],[[120573,120573],"mapped",[946]],[[120574,120574],"mapped",[947]],[[120575,120575],"mapped",[948]],[[120576,120576],"mapped",[949]],[[120577,120577],"mapped",[950]],[[120578,120578],"mapped",[951]],[[120579,120579],"mapped",[952]],[[120580,120580],"mapped",[953]],[[120581,120581],"mapped",[954]],[[120582,120582],"mapped",[955]],[[120583,120583],"mapped",[956]],[[120584,120584],"mapped",[957]],[[120585,120585],"mapped",[958]],[[120586,120586],"mapped",[959]],[[120587,120587],"mapped",[960]],[[120588,120588],"mapped",[961]],[[120589,120590],"mapped",[963]],[[120591,120591],"mapped",[964]],[[120592,120592],"mapped",[965]],[[120593,120593],"mapped",[966]],[[120594,120594],"mapped",[967]],[[120595,120595],"mapped",[968]],[[120596,120596],"mapped",[969]],[[120597,120597],"mapped",[8706]],[[120598,120598],"mapped",[949]],[[120599,120599],"mapped",[952]],[[120600,120600],"mapped",[954]],[[120601,120601],"mapped",[966]],[[120602,120602],"mapped",[961]],[[120603,120603],"mapped",[960]],[[120604,120604],"mapped",[945]],[[120605,120605],"mapped",[946]],[[120606,120606],"mapped",[947]],[[120607,120607],"mapped",[948]],[[120608,120608],"mapped",[949]],[[120609,120609],"mapped",[950]],[[120610,120610],"mapped",[951]],[[120611,120611],"mapped",[952]],[[120612,120612],"mapped",[953]],[[120613,120613],"mapped",[954]],[[120614,120614],"mapped",[955]],[[120615,120615],"mapped",[956]],[[120616,120616],"mapped",[957]],[[120617,120617],"mapped",[958]],[[120618,120618],"mapped",[959]],[[120619,120619],"mapped",[960]],[[120620,120620],"mapped",[961]],[[120621,120621],"mapped",[952]],[[120622,120622],"mapped",[963]],[[120623,120623],"mapped",[964]],[[120624,120624],"mapped",[965]],[[120625,120625],"mapped",[966]],[[120626,120626],"mapped",[967]],[[120627,120627],"mapped",[968]],[[120628,120628],"mapped",[969]],[[120629,120629],"mapped",[8711]],[[120630,120630],"mapped",[945]],[[120631,120631],"mapped",[946]],[[120632,120632],"mapped",[947]],[[120633,120633],"mapped",[948]],[[120634,120634],"mapped",[949]],[[120635,120635],"mapped",[950]],[[120636,120636],"mapped",[951]],[[120637,120637],"mapped",[952]],[[120638,120638],"mapped",[953]],[[120639,120639],"mapped",[954]],[[120640,120640],"mapped",[955]],[[120641,120641],"mapped",[956]],[[120642,120642],"mapped",[957]],[[120643,120643],"mapped",[958]],[[120644,120644],"mapped",[959]],[[120645,120645],"mapped",[960]],[[120646,120646],"mapped",[961]],[[120647,120648],"mapped",[963]],[[120649,120649],"mapped",[964]],[[120650,120650],"mapped",[965]],[[120651,120651],"mapped",[966]],[[120652,120652],"mapped",[967]],[[120653,120653],"mapped",[968]],[[120654,120654],"mapped",[969]],[[120655,120655],"mapped",[8706]],[[120656,120656],"mapped",[949]],[[120657,120657],"mapped",[952]],[[120658,120658],"mapped",[954]],[[120659,120659],"mapped",[966]],[[120660,120660],"mapped",[961]],[[120661,120661],"mapped",[960]],[[120662,120662],"mapped",[945]],[[120663,120663],"mapped",[946]],[[120664,120664],"mapped",[947]],[[120665,120665],"mapped",[948]],[[120666,120666],"mapped",[949]],[[120667,120667],"mapped",[950]],[[120668,120668],"mapped",[951]],[[120669,120669],"mapped",[952]],[[120670,120670],"mapped",[953]],[[120671,120671],"mapped",[954]],[[120672,120672],"mapped",[955]],[[120673,120673],"mapped",[956]],[[120674,120674],"mapped",[957]],[[120675,120675],"mapped",[958]],[[120676,120676],"mapped",[959]],[[120677,120677],"mapped",[960]],[[120678,120678],"mapped",[961]],[[120679,120679],"mapped",[952]],[[120680,120680],"mapped",[963]],[[120681,120681],"mapped",[964]],[[120682,120682],"mapped",[965]],[[120683,120683],"mapped",[966]],[[120684,120684],"mapped",[967]],[[120685,120685],"mapped",[968]],[[120686,120686],"mapped",[969]],[[120687,120687],"mapped",[8711]],[[120688,120688],"mapped",[945]],[[120689,120689],"mapped",[946]],[[120690,120690],"mapped",[947]],[[120691,120691],"mapped",[948]],[[120692,120692],"mapped",[949]],[[120693,120693],"mapped",[950]],[[120694,120694],"mapped",[951]],[[120695,120695],"mapped",[952]],[[120696,120696],"mapped",[953]],[[120697,120697],"mapped",[954]],[[120698,120698],"mapped",[955]],[[120699,120699],"mapped",[956]],[[120700,120700],"mapped",[957]],[[120701,120701],"mapped",[958]],[[120702,120702],"mapped",[959]],[[120703,120703],"mapped",[960]],[[120704,120704],"mapped",[961]],[[120705,120706],"mapped",[963]],[[120707,120707],"mapped",[964]],[[120708,120708],"mapped",[965]],[[120709,120709],"mapped",[966]],[[120710,120710],"mapped",[967]],[[120711,120711],"mapped",[968]],[[120712,120712],"mapped",[969]],[[120713,120713],"mapped",[8706]],[[120714,120714],"mapped",[949]],[[120715,120715],"mapped",[952]],[[120716,120716],"mapped",[954]],[[120717,120717],"mapped",[966]],[[120718,120718],"mapped",[961]],[[120719,120719],"mapped",[960]],[[120720,120720],"mapped",[945]],[[120721,120721],"mapped",[946]],[[120722,120722],"mapped",[947]],[[120723,120723],"mapped",[948]],[[120724,120724],"mapped",[949]],[[120725,120725],"mapped",[950]],[[120726,120726],"mapped",[951]],[[120727,120727],"mapped",[952]],[[120728,120728],"mapped",[953]],[[120729,120729],"mapped",[954]],[[120730,120730],"mapped",[955]],[[120731,120731],"mapped",[956]],[[120732,120732],"mapped",[957]],[[120733,120733],"mapped",[958]],[[120734,120734],"mapped",[959]],[[120735,120735],"mapped",[960]],[[120736,120736],"mapped",[961]],[[120737,120737],"mapped",[952]],[[120738,120738],"mapped",[963]],[[120739,120739],"mapped",[964]],[[120740,120740],"mapped",[965]],[[120741,120741],"mapped",[966]],[[120742,120742],"mapped",[967]],[[120743,120743],"mapped",[968]],[[120744,120744],"mapped",[969]],[[120745,120745],"mapped",[8711]],[[120746,120746],"mapped",[945]],[[120747,120747],"mapped",[946]],[[120748,120748],"mapped",[947]],[[120749,120749],"mapped",[948]],[[120750,120750],"mapped",[949]],[[120751,120751],"mapped",[950]],[[120752,120752],"mapped",[951]],[[120753,120753],"mapped",[952]],[[120754,120754],"mapped",[953]],[[120755,120755],"mapped",[954]],[[120756,120756],"mapped",[955]],[[120757,120757],"mapped",[956]],[[120758,120758],"mapped",[957]],[[120759,120759],"mapped",[958]],[[120760,120760],"mapped",[959]],[[120761,120761],"mapped",[960]],[[120762,120762],"mapped",[961]],[[120763,120764],"mapped",[963]],[[120765,120765],"mapped",[964]],[[120766,120766],"mapped",[965]],[[120767,120767],"mapped",[966]],[[120768,120768],"mapped",[967]],[[120769,120769],"mapped",[968]],[[120770,120770],"mapped",[969]],[[120771,120771],"mapped",[8706]],[[120772,120772],"mapped",[949]],[[120773,120773],"mapped",[952]],[[120774,120774],"mapped",[954]],[[120775,120775],"mapped",[966]],[[120776,120776],"mapped",[961]],[[120777,120777],"mapped",[960]],[[120778,120779],"mapped",[989]],[[120780,120781],"disallowed"],[[120782,120782],"mapped",[48]],[[120783,120783],"mapped",[49]],[[120784,120784],"mapped",[50]],[[120785,120785],"mapped",[51]],[[120786,120786],"mapped",[52]],[[120787,120787],"mapped",[53]],[[120788,120788],"mapped",[54]],[[120789,120789],"mapped",[55]],[[120790,120790],"mapped",[56]],[[120791,120791],"mapped",[57]],[[120792,120792],"mapped",[48]],[[120793,120793],"mapped",[49]],[[120794,120794],"mapped",[50]],[[120795,120795],"mapped",[51]],[[120796,120796],"mapped",[52]],[[120797,120797],"mapped",[53]],[[120798,120798],"mapped",[54]],[[120799,120799],"mapped",[55]],[[120800,120800],"mapped",[56]],[[120801,120801],"mapped",[57]],[[120802,120802],"mapped",[48]],[[120803,120803],"mapped",[49]],[[120804,120804],"mapped",[50]],[[120805,120805],"mapped",[51]],[[120806,120806],"mapped",[52]],[[120807,120807],"mapped",[53]],[[120808,120808],"mapped",[54]],[[120809,120809],"mapped",[55]],[[120810,120810],"mapped",[56]],[[120811,120811],"mapped",[57]],[[120812,120812],"mapped",[48]],[[120813,120813],"mapped",[49]],[[120814,120814],"mapped",[50]],[[120815,120815],"mapped",[51]],[[120816,120816],"mapped",[52]],[[120817,120817],"mapped",[53]],[[120818,120818],"mapped",[54]],[[120819,120819],"mapped",[55]],[[120820,120820],"mapped",[56]],[[120821,120821],"mapped",[57]],[[120822,120822],"mapped",[48]],[[120823,120823],"mapped",[49]],[[120824,120824],"mapped",[50]],[[120825,120825],"mapped",[51]],[[120826,120826],"mapped",[52]],[[120827,120827],"mapped",[53]],[[120828,120828],"mapped",[54]],[[120829,120829],"mapped",[55]],[[120830,120830],"mapped",[56]],[[120831,120831],"mapped",[57]],[[120832,121343],"valid",[],"NV8"],[[121344,121398],"valid"],[[121399,121402],"valid",[],"NV8"],[[121403,121452],"valid"],[[121453,121460],"valid",[],"NV8"],[[121461,121461],"valid"],[[121462,121475],"valid",[],"NV8"],[[121476,121476],"valid"],[[121477,121483],"valid",[],"NV8"],[[121484,121498],"disallowed"],[[121499,121503],"valid"],[[121504,121504],"disallowed"],[[121505,121519],"valid"],[[121520,124927],"disallowed"],[[124928,125124],"valid"],[[125125,125126],"disallowed"],[[125127,125135],"valid",[],"NV8"],[[125136,125142],"valid"],[[125143,126463],"disallowed"],[[126464,126464],"mapped",[1575]],[[126465,126465],"mapped",[1576]],[[126466,126466],"mapped",[1580]],[[126467,126467],"mapped",[1583]],[[126468,126468],"disallowed"],[[126469,126469],"mapped",[1608]],[[126470,126470],"mapped",[1586]],[[126471,126471],"mapped",[1581]],[[126472,126472],"mapped",[1591]],[[126473,126473],"mapped",[1610]],[[126474,126474],"mapped",[1603]],[[126475,126475],"mapped",[1604]],[[126476,126476],"mapped",[1605]],[[126477,126477],"mapped",[1606]],[[126478,126478],"mapped",[1587]],[[126479,126479],"mapped",[1593]],[[126480,126480],"mapped",[1601]],[[126481,126481],"mapped",[1589]],[[126482,126482],"mapped",[1602]],[[126483,126483],"mapped",[1585]],[[126484,126484],"mapped",[1588]],[[126485,126485],"mapped",[1578]],[[126486,126486],"mapped",[1579]],[[126487,126487],"mapped",[1582]],[[126488,126488],"mapped",[1584]],[[126489,126489],"mapped",[1590]],[[126490,126490],"mapped",[1592]],[[126491,126491],"mapped",[1594]],[[126492,126492],"mapped",[1646]],[[126493,126493],"mapped",[1722]],[[126494,126494],"mapped",[1697]],[[126495,126495],"mapped",[1647]],[[126496,126496],"disallowed"],[[126497,126497],"mapped",[1576]],[[126498,126498],"mapped",[1580]],[[126499,126499],"disallowed"],[[126500,126500],"mapped",[1607]],[[126501,126502],"disallowed"],[[126503,126503],"mapped",[1581]],[[126504,126504],"disallowed"],[[126505,126505],"mapped",[1610]],[[126506,126506],"mapped",[1603]],[[126507,126507],"mapped",[1604]],[[126508,126508],"mapped",[1605]],[[126509,126509],"mapped",[1606]],[[126510,126510],"mapped",[1587]],[[126511,126511],"mapped",[1593]],[[126512,126512],"mapped",[1601]],[[126513,126513],"mapped",[1589]],[[126514,126514],"mapped",[1602]],[[126515,126515],"disallowed"],[[126516,126516],"mapped",[1588]],[[126517,126517],"mapped",[1578]],[[126518,126518],"mapped",[1579]],[[126519,126519],"mapped",[1582]],[[126520,126520],"disallowed"],[[126521,126521],"mapped",[1590]],[[126522,126522],"disallowed"],[[126523,126523],"mapped",[1594]],[[126524,126529],"disallowed"],[[126530,126530],"mapped",[1580]],[[126531,126534],"disallowed"],[[126535,126535],"mapped",[1581]],[[126536,126536],"disallowed"],[[126537,126537],"mapped",[1610]],[[126538,126538],"disallowed"],[[126539,126539],"mapped",[1604]],[[126540,126540],"disallowed"],[[126541,126541],"mapped",[1606]],[[126542,126542],"mapped",[1587]],[[126543,126543],"mapped",[1593]],[[126544,126544],"disallowed"],[[126545,126545],"mapped",[1589]],[[126546,126546],"mapped",[1602]],[[126547,126547],"disallowed"],[[126548,126548],"mapped",[1588]],[[126549,126550],"disallowed"],[[126551,126551],"mapped",[1582]],[[126552,126552],"disallowed"],[[126553,126553],"mapped",[1590]],[[126554,126554],"disallowed"],[[126555,126555],"mapped",[1594]],[[126556,126556],"disallowed"],[[126557,126557],"mapped",[1722]],[[126558,126558],"disallowed"],[[126559,126559],"mapped",[1647]],[[126560,126560],"disallowed"],[[126561,126561],"mapped",[1576]],[[126562,126562],"mapped",[1580]],[[126563,126563],"disallowed"],[[126564,126564],"mapped",[1607]],[[126565,126566],"disallowed"],[[126567,126567],"mapped",[1581]],[[126568,126568],"mapped",[1591]],[[126569,126569],"mapped",[1610]],[[126570,126570],"mapped",[1603]],[[126571,126571],"disallowed"],[[126572,126572],"mapped",[1605]],[[126573,126573],"mapped",[1606]],[[126574,126574],"mapped",[1587]],[[126575,126575],"mapped",[1593]],[[126576,126576],"mapped",[1601]],[[126577,126577],"mapped",[1589]],[[126578,126578],"mapped",[1602]],[[126579,126579],"disallowed"],[[126580,126580],"mapped",[1588]],[[126581,126581],"mapped",[1578]],[[126582,126582],"mapped",[1579]],[[126583,126583],"mapped",[1582]],[[126584,126584],"disallowed"],[[126585,126585],"mapped",[1590]],[[126586,126586],"mapped",[1592]],[[126587,126587],"mapped",[1594]],[[126588,126588],"mapped",[1646]],[[126589,126589],"disallowed"],[[126590,126590],"mapped",[1697]],[[126591,126591],"disallowed"],[[126592,126592],"mapped",[1575]],[[126593,126593],"mapped",[1576]],[[126594,126594],"mapped",[1580]],[[126595,126595],"mapped",[1583]],[[126596,126596],"mapped",[1607]],[[126597,126597],"mapped",[1608]],[[126598,126598],"mapped",[1586]],[[126599,126599],"mapped",[1581]],[[126600,126600],"mapped",[1591]],[[126601,126601],"mapped",[1610]],[[126602,126602],"disallowed"],[[126603,126603],"mapped",[1604]],[[126604,126604],"mapped",[1605]],[[126605,126605],"mapped",[1606]],[[126606,126606],"mapped",[1587]],[[126607,126607],"mapped",[1593]],[[126608,126608],"mapped",[1601]],[[126609,126609],"mapped",[1589]],[[126610,126610],"mapped",[1602]],[[126611,126611],"mapped",[1585]],[[126612,126612],"mapped",[1588]],[[126613,126613],"mapped",[1578]],[[126614,126614],"mapped",[1579]],[[126615,126615],"mapped",[1582]],[[126616,126616],"mapped",[1584]],[[126617,126617],"mapped",[1590]],[[126618,126618],"mapped",[1592]],[[126619,126619],"mapped",[1594]],[[126620,126624],"disallowed"],[[126625,126625],"mapped",[1576]],[[126626,126626],"mapped",[1580]],[[126627,126627],"mapped",[1583]],[[126628,126628],"disallowed"],[[126629,126629],"mapped",[1608]],[[126630,126630],"mapped",[1586]],[[126631,126631],"mapped",[1581]],[[126632,126632],"mapped",[1591]],[[126633,126633],"mapped",[1610]],[[126634,126634],"disallowed"],[[126635,126635],"mapped",[1604]],[[126636,126636],"mapped",[1605]],[[126637,126637],"mapped",[1606]],[[126638,126638],"mapped",[1587]],[[126639,126639],"mapped",[1593]],[[126640,126640],"mapped",[1601]],[[126641,126641],"mapped",[1589]],[[126642,126642],"mapped",[1602]],[[126643,126643],"mapped",[1585]],[[126644,126644],"mapped",[1588]],[[126645,126645],"mapped",[1578]],[[126646,126646],"mapped",[1579]],[[126647,126647],"mapped",[1582]],[[126648,126648],"mapped",[1584]],[[126649,126649],"mapped",[1590]],[[126650,126650],"mapped",[1592]],[[126651,126651],"mapped",[1594]],[[126652,126703],"disallowed"],[[126704,126705],"valid",[],"NV8"],[[126706,126975],"disallowed"],[[126976,127019],"valid",[],"NV8"],[[127020,127023],"disallowed"],[[127024,127123],"valid",[],"NV8"],[[127124,127135],"disallowed"],[[127136,127150],"valid",[],"NV8"],[[127151,127152],"disallowed"],[[127153,127166],"valid",[],"NV8"],[[127167,127167],"valid",[],"NV8"],[[127168,127168],"disallowed"],[[127169,127183],"valid",[],"NV8"],[[127184,127184],"disallowed"],[[127185,127199],"valid",[],"NV8"],[[127200,127221],"valid",[],"NV8"],[[127222,127231],"disallowed"],[[127232,127232],"disallowed"],[[127233,127233],"disallowed_STD3_mapped",[48,44]],[[127234,127234],"disallowed_STD3_mapped",[49,44]],[[127235,127235],"disallowed_STD3_mapped",[50,44]],[[127236,127236],"disallowed_STD3_mapped",[51,44]],[[127237,127237],"disallowed_STD3_mapped",[52,44]],[[127238,127238],"disallowed_STD3_mapped",[53,44]],[[127239,127239],"disallowed_STD3_mapped",[54,44]],[[127240,127240],"disallowed_STD3_mapped",[55,44]],[[127241,127241],"disallowed_STD3_mapped",[56,44]],[[127242,127242],"disallowed_STD3_mapped",[57,44]],[[127243,127244],"valid",[],"NV8"],[[127245,127247],"disallowed"],[[127248,127248],"disallowed_STD3_mapped",[40,97,41]],[[127249,127249],"disallowed_STD3_mapped",[40,98,41]],[[127250,127250],"disallowed_STD3_mapped",[40,99,41]],[[127251,127251],"disallowed_STD3_mapped",[40,100,41]],[[127252,127252],"disallowed_STD3_mapped",[40,101,41]],[[127253,127253],"disallowed_STD3_mapped",[40,102,41]],[[127254,127254],"disallowed_STD3_mapped",[40,103,41]],[[127255,127255],"disallowed_STD3_mapped",[40,104,41]],[[127256,127256],"disallowed_STD3_mapped",[40,105,41]],[[127257,127257],"disallowed_STD3_mapped",[40,106,41]],[[127258,127258],"disallowed_STD3_mapped",[40,107,41]],[[127259,127259],"disallowed_STD3_mapped",[40,108,41]],[[127260,127260],"disallowed_STD3_mapped",[40,109,41]],[[127261,127261],"disallowed_STD3_mapped",[40,110,41]],[[127262,127262],"disallowed_STD3_mapped",[40,111,41]],[[127263,127263],"disallowed_STD3_mapped",[40,112,41]],[[127264,127264],"disallowed_STD3_mapped",[40,113,41]],[[127265,127265],"disallowed_STD3_mapped",[40,114,41]],[[127266,127266],"disallowed_STD3_mapped",[40,115,41]],[[127267,127267],"disallowed_STD3_mapped",[40,116,41]],[[127268,127268],"disallowed_STD3_mapped",[40,117,41]],[[127269,127269],"disallowed_STD3_mapped",[40,118,41]],[[127270,127270],"disallowed_STD3_mapped",[40,119,41]],[[127271,127271],"disallowed_STD3_mapped",[40,120,41]],[[127272,127272],"disallowed_STD3_mapped",[40,121,41]],[[127273,127273],"disallowed_STD3_mapped",[40,122,41]],[[127274,127274],"mapped",[12308,115,12309]],[[127275,127275],"mapped",[99]],[[127276,127276],"mapped",[114]],[[127277,127277],"mapped",[99,100]],[[127278,127278],"mapped",[119,122]],[[127279,127279],"disallowed"],[[127280,127280],"mapped",[97]],[[127281,127281],"mapped",[98]],[[127282,127282],"mapped",[99]],[[127283,127283],"mapped",[100]],[[127284,127284],"mapped",[101]],[[127285,127285],"mapped",[102]],[[127286,127286],"mapped",[103]],[[127287,127287],"mapped",[104]],[[127288,127288],"mapped",[105]],[[127289,127289],"mapped",[106]],[[127290,127290],"mapped",[107]],[[127291,127291],"mapped",[108]],[[127292,127292],"mapped",[109]],[[127293,127293],"mapped",[110]],[[127294,127294],"mapped",[111]],[[127295,127295],"mapped",[112]],[[127296,127296],"mapped",[113]],[[127297,127297],"mapped",[114]],[[127298,127298],"mapped",[115]],[[127299,127299],"mapped",[116]],[[127300,127300],"mapped",[117]],[[127301,127301],"mapped",[118]],[[127302,127302],"mapped",[119]],[[127303,127303],"mapped",[120]],[[127304,127304],"mapped",[121]],[[127305,127305],"mapped",[122]],[[127306,127306],"mapped",[104,118]],[[127307,127307],"mapped",[109,118]],[[127308,127308],"mapped",[115,100]],[[127309,127309],"mapped",[115,115]],[[127310,127310],"mapped",[112,112,118]],[[127311,127311],"mapped",[119,99]],[[127312,127318],"valid",[],"NV8"],[[127319,127319],"valid",[],"NV8"],[[127320,127326],"valid",[],"NV8"],[[127327,127327],"valid",[],"NV8"],[[127328,127337],"valid",[],"NV8"],[[127338,127338],"mapped",[109,99]],[[127339,127339],"mapped",[109,100]],[[127340,127343],"disallowed"],[[127344,127352],"valid",[],"NV8"],[[127353,127353],"valid",[],"NV8"],[[127354,127354],"valid",[],"NV8"],[[127355,127356],"valid",[],"NV8"],[[127357,127358],"valid",[],"NV8"],[[127359,127359],"valid",[],"NV8"],[[127360,127369],"valid",[],"NV8"],[[127370,127373],"valid",[],"NV8"],[[127374,127375],"valid",[],"NV8"],[[127376,127376],"mapped",[100,106]],[[127377,127386],"valid",[],"NV8"],[[127387,127461],"disallowed"],[[127462,127487],"valid",[],"NV8"],[[127488,127488],"mapped",[12411,12363]],[[127489,127489],"mapped",[12467,12467]],[[127490,127490],"mapped",[12469]],[[127491,127503],"disallowed"],[[127504,127504],"mapped",[25163]],[[127505,127505],"mapped",[23383]],[[127506,127506],"mapped",[21452]],[[127507,127507],"mapped",[12487]],[[127508,127508],"mapped",[20108]],[[127509,127509],"mapped",[22810]],[[127510,127510],"mapped",[35299]],[[127511,127511],"mapped",[22825]],[[127512,127512],"mapped",[20132]],[[127513,127513],"mapped",[26144]],[[127514,127514],"mapped",[28961]],[[127515,127515],"mapped",[26009]],[[127516,127516],"mapped",[21069]],[[127517,127517],"mapped",[24460]],[[127518,127518],"mapped",[20877]],[[127519,127519],"mapped",[26032]],[[127520,127520],"mapped",[21021]],[[127521,127521],"mapped",[32066]],[[127522,127522],"mapped",[29983]],[[127523,127523],"mapped",[36009]],[[127524,127524],"mapped",[22768]],[[127525,127525],"mapped",[21561]],[[127526,127526],"mapped",[28436]],[[127527,127527],"mapped",[25237]],[[127528,127528],"mapped",[25429]],[[127529,127529],"mapped",[19968]],[[127530,127530],"mapped",[19977]],[[127531,127531],"mapped",[36938]],[[127532,127532],"mapped",[24038]],[[127533,127533],"mapped",[20013]],[[127534,127534],"mapped",[21491]],[[127535,127535],"mapped",[25351]],[[127536,127536],"mapped",[36208]],[[127537,127537],"mapped",[25171]],[[127538,127538],"mapped",[31105]],[[127539,127539],"mapped",[31354]],[[127540,127540],"mapped",[21512]],[[127541,127541],"mapped",[28288]],[[127542,127542],"mapped",[26377]],[[127543,127543],"mapped",[26376]],[[127544,127544],"mapped",[30003]],[[127545,127545],"mapped",[21106]],[[127546,127546],"mapped",[21942]],[[127547,127551],"disallowed"],[[127552,127552],"mapped",[12308,26412,12309]],[[127553,127553],"mapped",[12308,19977,12309]],[[127554,127554],"mapped",[12308,20108,12309]],[[127555,127555],"mapped",[12308,23433,12309]],[[127556,127556],"mapped",[12308,28857,12309]],[[127557,127557],"mapped",[12308,25171,12309]],[[127558,127558],"mapped",[12308,30423,12309]],[[127559,127559],"mapped",[12308,21213,12309]],[[127560,127560],"mapped",[12308,25943,12309]],[[127561,127567],"disallowed"],[[127568,127568],"mapped",[24471]],[[127569,127569],"mapped",[21487]],[[127570,127743],"disallowed"],[[127744,127776],"valid",[],"NV8"],[[127777,127788],"valid",[],"NV8"],[[127789,127791],"valid",[],"NV8"],[[127792,127797],"valid",[],"NV8"],[[127798,127798],"valid",[],"NV8"],[[127799,127868],"valid",[],"NV8"],[[127869,127869],"valid",[],"NV8"],[[127870,127871],"valid",[],"NV8"],[[127872,127891],"valid",[],"NV8"],[[127892,127903],"valid",[],"NV8"],[[127904,127940],"valid",[],"NV8"],[[127941,127941],"valid",[],"NV8"],[[127942,127946],"valid",[],"NV8"],[[127947,127950],"valid",[],"NV8"],[[127951,127955],"valid",[],"NV8"],[[127956,127967],"valid",[],"NV8"],[[127968,127984],"valid",[],"NV8"],[[127985,127991],"valid",[],"NV8"],[[127992,127999],"valid",[],"NV8"],[[128000,128062],"valid",[],"NV8"],[[128063,128063],"valid",[],"NV8"],[[128064,128064],"valid",[],"NV8"],[[128065,128065],"valid",[],"NV8"],[[128066,128247],"valid",[],"NV8"],[[128248,128248],"valid",[],"NV8"],[[128249,128252],"valid",[],"NV8"],[[128253,128254],"valid",[],"NV8"],[[128255,128255],"valid",[],"NV8"],[[128256,128317],"valid",[],"NV8"],[[128318,128319],"valid",[],"NV8"],[[128320,128323],"valid",[],"NV8"],[[128324,128330],"valid",[],"NV8"],[[128331,128335],"valid",[],"NV8"],[[128336,128359],"valid",[],"NV8"],[[128360,128377],"valid",[],"NV8"],[[128378,128378],"disallowed"],[[128379,128419],"valid",[],"NV8"],[[128420,128420],"disallowed"],[[128421,128506],"valid",[],"NV8"],[[128507,128511],"valid",[],"NV8"],[[128512,128512],"valid",[],"NV8"],[[128513,128528],"valid",[],"NV8"],[[128529,128529],"valid",[],"NV8"],[[128530,128532],"valid",[],"NV8"],[[128533,128533],"valid",[],"NV8"],[[128534,128534],"valid",[],"NV8"],[[128535,128535],"valid",[],"NV8"],[[128536,128536],"valid",[],"NV8"],[[128537,128537],"valid",[],"NV8"],[[128538,128538],"valid",[],"NV8"],[[128539,128539],"valid",[],"NV8"],[[128540,128542],"valid",[],"NV8"],[[128543,128543],"valid",[],"NV8"],[[128544,128549],"valid",[],"NV8"],[[128550,128551],"valid",[],"NV8"],[[128552,128555],"valid",[],"NV8"],[[128556,128556],"valid",[],"NV8"],[[128557,128557],"valid",[],"NV8"],[[128558,128559],"valid",[],"NV8"],[[128560,128563],"valid",[],"NV8"],[[128564,128564],"valid",[],"NV8"],[[128565,128576],"valid",[],"NV8"],[[128577,128578],"valid",[],"NV8"],[[128579,128580],"valid",[],"NV8"],[[128581,128591],"valid",[],"NV8"],[[128592,128639],"valid",[],"NV8"],[[128640,128709],"valid",[],"NV8"],[[128710,128719],"valid",[],"NV8"],[[128720,128720],"valid",[],"NV8"],[[128721,128735],"disallowed"],[[128736,128748],"valid",[],"NV8"],[[128749,128751],"disallowed"],[[128752,128755],"valid",[],"NV8"],[[128756,128767],"disallowed"],[[128768,128883],"valid",[],"NV8"],[[128884,128895],"disallowed"],[[128896,128980],"valid",[],"NV8"],[[128981,129023],"disallowed"],[[129024,129035],"valid",[],"NV8"],[[129036,129039],"disallowed"],[[129040,129095],"valid",[],"NV8"],[[129096,129103],"disallowed"],[[129104,129113],"valid",[],"NV8"],[[129114,129119],"disallowed"],[[129120,129159],"valid",[],"NV8"],[[129160,129167],"disallowed"],[[129168,129197],"valid",[],"NV8"],[[129198,129295],"disallowed"],[[129296,129304],"valid",[],"NV8"],[[129305,129407],"disallowed"],[[129408,129412],"valid",[],"NV8"],[[129413,129471],"disallowed"],[[129472,129472],"valid",[],"NV8"],[[129473,131069],"disallowed"],[[131070,131071],"disallowed"],[[131072,173782],"valid"],[[173783,173823],"disallowed"],[[173824,177972],"valid"],[[177973,177983],"disallowed"],[[177984,178205],"valid"],[[178206,178207],"disallowed"],[[178208,183969],"valid"],[[183970,194559],"disallowed"],[[194560,194560],"mapped",[20029]],[[194561,194561],"mapped",[20024]],[[194562,194562],"mapped",[20033]],[[194563,194563],"mapped",[131362]],[[194564,194564],"mapped",[20320]],[[194565,194565],"mapped",[20398]],[[194566,194566],"mapped",[20411]],[[194567,194567],"mapped",[20482]],[[194568,194568],"mapped",[20602]],[[194569,194569],"mapped",[20633]],[[194570,194570],"mapped",[20711]],[[194571,194571],"mapped",[20687]],[[194572,194572],"mapped",[13470]],[[194573,194573],"mapped",[132666]],[[194574,194574],"mapped",[20813]],[[194575,194575],"mapped",[20820]],[[194576,194576],"mapped",[20836]],[[194577,194577],"mapped",[20855]],[[194578,194578],"mapped",[132380]],[[194579,194579],"mapped",[13497]],[[194580,194580],"mapped",[20839]],[[194581,194581],"mapped",[20877]],[[194582,194582],"mapped",[132427]],[[194583,194583],"mapped",[20887]],[[194584,194584],"mapped",[20900]],[[194585,194585],"mapped",[20172]],[[194586,194586],"mapped",[20908]],[[194587,194587],"mapped",[20917]],[[194588,194588],"mapped",[168415]],[[194589,194589],"mapped",[20981]],[[194590,194590],"mapped",[20995]],[[194591,194591],"mapped",[13535]],[[194592,194592],"mapped",[21051]],[[194593,194593],"mapped",[21062]],[[194594,194594],"mapped",[21106]],[[194595,194595],"mapped",[21111]],[[194596,194596],"mapped",[13589]],[[194597,194597],"mapped",[21191]],[[194598,194598],"mapped",[21193]],[[194599,194599],"mapped",[21220]],[[194600,194600],"mapped",[21242]],[[194601,194601],"mapped",[21253]],[[194602,194602],"mapped",[21254]],[[194603,194603],"mapped",[21271]],[[194604,194604],"mapped",[21321]],[[194605,194605],"mapped",[21329]],[[194606,194606],"mapped",[21338]],[[194607,194607],"mapped",[21363]],[[194608,194608],"mapped",[21373]],[[194609,194611],"mapped",[21375]],[[194612,194612],"mapped",[133676]],[[194613,194613],"mapped",[28784]],[[194614,194614],"mapped",[21450]],[[194615,194615],"mapped",[21471]],[[194616,194616],"mapped",[133987]],[[194617,194617],"mapped",[21483]],[[194618,194618],"mapped",[21489]],[[194619,194619],"mapped",[21510]],[[194620,194620],"mapped",[21662]],[[194621,194621],"mapped",[21560]],[[194622,194622],"mapped",[21576]],[[194623,194623],"mapped",[21608]],[[194624,194624],"mapped",[21666]],[[194625,194625],"mapped",[21750]],[[194626,194626],"mapped",[21776]],[[194627,194627],"mapped",[21843]],[[194628,194628],"mapped",[21859]],[[194629,194630],"mapped",[21892]],[[194631,194631],"mapped",[21913]],[[194632,194632],"mapped",[21931]],[[194633,194633],"mapped",[21939]],[[194634,194634],"mapped",[21954]],[[194635,194635],"mapped",[22294]],[[194636,194636],"mapped",[22022]],[[194637,194637],"mapped",[22295]],[[194638,194638],"mapped",[22097]],[[194639,194639],"mapped",[22132]],[[194640,194640],"mapped",[20999]],[[194641,194641],"mapped",[22766]],[[194642,194642],"mapped",[22478]],[[194643,194643],"mapped",[22516]],[[194644,194644],"mapped",[22541]],[[194645,194645],"mapped",[22411]],[[194646,194646],"mapped",[22578]],[[194647,194647],"mapped",[22577]],[[194648,194648],"mapped",[22700]],[[194649,194649],"mapped",[136420]],[[194650,194650],"mapped",[22770]],[[194651,194651],"mapped",[22775]],[[194652,194652],"mapped",[22790]],[[194653,194653],"mapped",[22810]],[[194654,194654],"mapped",[22818]],[[194655,194655],"mapped",[22882]],[[194656,194656],"mapped",[136872]],[[194657,194657],"mapped",[136938]],[[194658,194658],"mapped",[23020]],[[194659,194659],"mapped",[23067]],[[194660,194660],"mapped",[23079]],[[194661,194661],"mapped",[23000]],[[194662,194662],"mapped",[23142]],[[194663,194663],"mapped",[14062]],[[194664,194664],"disallowed"],[[194665,194665],"mapped",[23304]],[[194666,194667],"mapped",[23358]],[[194668,194668],"mapped",[137672]],[[194669,194669],"mapped",[23491]],[[194670,194670],"mapped",[23512]],[[194671,194671],"mapped",[23527]],[[194672,194672],"mapped",[23539]],[[194673,194673],"mapped",[138008]],[[194674,194674],"mapped",[23551]],[[194675,194675],"mapped",[23558]],[[194676,194676],"disallowed"],[[194677,194677],"mapped",[23586]],[[194678,194678],"mapped",[14209]],[[194679,194679],"mapped",[23648]],[[194680,194680],"mapped",[23662]],[[194681,194681],"mapped",[23744]],[[194682,194682],"mapped",[23693]],[[194683,194683],"mapped",[138724]],[[194684,194684],"mapped",[23875]],[[194685,194685],"mapped",[138726]],[[194686,194686],"mapped",[23918]],[[194687,194687],"mapped",[23915]],[[194688,194688],"mapped",[23932]],[[194689,194689],"mapped",[24033]],[[194690,194690],"mapped",[24034]],[[194691,194691],"mapped",[14383]],[[194692,194692],"mapped",[24061]],[[194693,194693],"mapped",[24104]],[[194694,194694],"mapped",[24125]],[[194695,194695],"mapped",[24169]],[[194696,194696],"mapped",[14434]],[[194697,194697],"mapped",[139651]],[[194698,194698],"mapped",[14460]],[[194699,194699],"mapped",[24240]],[[194700,194700],"mapped",[24243]],[[194701,194701],"mapped",[24246]],[[194702,194702],"mapped",[24266]],[[194703,194703],"mapped",[172946]],[[194704,194704],"mapped",[24318]],[[194705,194706],"mapped",[140081]],[[194707,194707],"mapped",[33281]],[[194708,194709],"mapped",[24354]],[[194710,194710],"mapped",[14535]],[[194711,194711],"mapped",[144056]],[[194712,194712],"mapped",[156122]],[[194713,194713],"mapped",[24418]],[[194714,194714],"mapped",[24427]],[[194715,194715],"mapped",[14563]],[[194716,194716],"mapped",[24474]],[[194717,194717],"mapped",[24525]],[[194718,194718],"mapped",[24535]],[[194719,194719],"mapped",[24569]],[[194720,194720],"mapped",[24705]],[[194721,194721],"mapped",[14650]],[[194722,194722],"mapped",[14620]],[[194723,194723],"mapped",[24724]],[[194724,194724],"mapped",[141012]],[[194725,194725],"mapped",[24775]],[[194726,194726],"mapped",[24904]],[[194727,194727],"mapped",[24908]],[[194728,194728],"mapped",[24910]],[[194729,194729],"mapped",[24908]],[[194730,194730],"mapped",[24954]],[[194731,194731],"mapped",[24974]],[[194732,194732],"mapped",[25010]],[[194733,194733],"mapped",[24996]],[[194734,194734],"mapped",[25007]],[[194735,194735],"mapped",[25054]],[[194736,194736],"mapped",[25074]],[[194737,194737],"mapped",[25078]],[[194738,194738],"mapped",[25104]],[[194739,194739],"mapped",[25115]],[[194740,194740],"mapped",[25181]],[[194741,194741],"mapped",[25265]],[[194742,194742],"mapped",[25300]],[[194743,194743],"mapped",[25424]],[[194744,194744],"mapped",[142092]],[[194745,194745],"mapped",[25405]],[[194746,194746],"mapped",[25340]],[[194747,194747],"mapped",[25448]],[[194748,194748],"mapped",[25475]],[[194749,194749],"mapped",[25572]],[[194750,194750],"mapped",[142321]],[[194751,194751],"mapped",[25634]],[[194752,194752],"mapped",[25541]],[[194753,194753],"mapped",[25513]],[[194754,194754],"mapped",[14894]],[[194755,194755],"mapped",[25705]],[[194756,194756],"mapped",[25726]],[[194757,194757],"mapped",[25757]],[[194758,194758],"mapped",[25719]],[[194759,194759],"mapped",[14956]],[[194760,194760],"mapped",[25935]],[[194761,194761],"mapped",[25964]],[[194762,194762],"mapped",[143370]],[[194763,194763],"mapped",[26083]],[[194764,194764],"mapped",[26360]],[[194765,194765],"mapped",[26185]],[[194766,194766],"mapped",[15129]],[[194767,194767],"mapped",[26257]],[[194768,194768],"mapped",[15112]],[[194769,194769],"mapped",[15076]],[[194770,194770],"mapped",[20882]],[[194771,194771],"mapped",[20885]],[[194772,194772],"mapped",[26368]],[[194773,194773],"mapped",[26268]],[[194774,194774],"mapped",[32941]],[[194775,194775],"mapped",[17369]],[[194776,194776],"mapped",[26391]],[[194777,194777],"mapped",[26395]],[[194778,194778],"mapped",[26401]],[[194779,194779],"mapped",[26462]],[[194780,194780],"mapped",[26451]],[[194781,194781],"mapped",[144323]],[[194782,194782],"mapped",[15177]],[[194783,194783],"mapped",[26618]],[[194784,194784],"mapped",[26501]],[[194785,194785],"mapped",[26706]],[[194786,194786],"mapped",[26757]],[[194787,194787],"mapped",[144493]],[[194788,194788],"mapped",[26766]],[[194789,194789],"mapped",[26655]],[[194790,194790],"mapped",[26900]],[[194791,194791],"mapped",[15261]],[[194792,194792],"mapped",[26946]],[[194793,194793],"mapped",[27043]],[[194794,194794],"mapped",[27114]],[[194795,194795],"mapped",[27304]],[[194796,194796],"mapped",[145059]],[[194797,194797],"mapped",[27355]],[[194798,194798],"mapped",[15384]],[[194799,194799],"mapped",[27425]],[[194800,194800],"mapped",[145575]],[[194801,194801],"mapped",[27476]],[[194802,194802],"mapped",[15438]],[[194803,194803],"mapped",[27506]],[[194804,194804],"mapped",[27551]],[[194805,194805],"mapped",[27578]],[[194806,194806],"mapped",[27579]],[[194807,194807],"mapped",[146061]],[[194808,194808],"mapped",[138507]],[[194809,194809],"mapped",[146170]],[[194810,194810],"mapped",[27726]],[[194811,194811],"mapped",[146620]],[[194812,194812],"mapped",[27839]],[[194813,194813],"mapped",[27853]],[[194814,194814],"mapped",[27751]],[[194815,194815],"mapped",[27926]],[[194816,194816],"mapped",[27966]],[[194817,194817],"mapped",[28023]],[[194818,194818],"mapped",[27969]],[[194819,194819],"mapped",[28009]],[[194820,194820],"mapped",[28024]],[[194821,194821],"mapped",[28037]],[[194822,194822],"mapped",[146718]],[[194823,194823],"mapped",[27956]],[[194824,194824],"mapped",[28207]],[[194825,194825],"mapped",[28270]],[[194826,194826],"mapped",[15667]],[[194827,194827],"mapped",[28363]],[[194828,194828],"mapped",[28359]],[[194829,194829],"mapped",[147153]],[[194830,194830],"mapped",[28153]],[[194831,194831],"mapped",[28526]],[[194832,194832],"mapped",[147294]],[[194833,194833],"mapped",[147342]],[[194834,194834],"mapped",[28614]],[[194835,194835],"mapped",[28729]],[[194836,194836],"mapped",[28702]],[[194837,194837],"mapped",[28699]],[[194838,194838],"mapped",[15766]],[[194839,194839],"mapped",[28746]],[[194840,194840],"mapped",[28797]],[[194841,194841],"mapped",[28791]],[[194842,194842],"mapped",[28845]],[[194843,194843],"mapped",[132389]],[[194844,194844],"mapped",[28997]],[[194845,194845],"mapped",[148067]],[[194846,194846],"mapped",[29084]],[[194847,194847],"disallowed"],[[194848,194848],"mapped",[29224]],[[194849,194849],"mapped",[29237]],[[194850,194850],"mapped",[29264]],[[194851,194851],"mapped",[149000]],[[194852,194852],"mapped",[29312]],[[194853,194853],"mapped",[29333]],[[194854,194854],"mapped",[149301]],[[194855,194855],"mapped",[149524]],[[194856,194856],"mapped",[29562]],[[194857,194857],"mapped",[29579]],[[194858,194858],"mapped",[16044]],[[194859,194859],"mapped",[29605]],[[194860,194861],"mapped",[16056]],[[194862,194862],"mapped",[29767]],[[194863,194863],"mapped",[29788]],[[194864,194864],"mapped",[29809]],[[194865,194865],"mapped",[29829]],[[194866,194866],"mapped",[29898]],[[194867,194867],"mapped",[16155]],[[194868,194868],"mapped",[29988]],[[194869,194869],"mapped",[150582]],[[194870,194870],"mapped",[30014]],[[194871,194871],"mapped",[150674]],[[194872,194872],"mapped",[30064]],[[194873,194873],"mapped",[139679]],[[194874,194874],"mapped",[30224]],[[194875,194875],"mapped",[151457]],[[194876,194876],"mapped",[151480]],[[194877,194877],"mapped",[151620]],[[194878,194878],"mapped",[16380]],[[194879,194879],"mapped",[16392]],[[194880,194880],"mapped",[30452]],[[194881,194881],"mapped",[151795]],[[194882,194882],"mapped",[151794]],[[194883,194883],"mapped",[151833]],[[194884,194884],"mapped",[151859]],[[194885,194885],"mapped",[30494]],[[194886,194887],"mapped",[30495]],[[194888,194888],"mapped",[30538]],[[194889,194889],"mapped",[16441]],[[194890,194890],"mapped",[30603]],[[194891,194891],"mapped",[16454]],[[194892,194892],"mapped",[16534]],[[194893,194893],"mapped",[152605]],[[194894,194894],"mapped",[30798]],[[194895,194895],"mapped",[30860]],[[194896,194896],"mapped",[30924]],[[194897,194897],"mapped",[16611]],[[194898,194898],"mapped",[153126]],[[194899,194899],"mapped",[31062]],[[194900,194900],"mapped",[153242]],[[194901,194901],"mapped",[153285]],[[194902,194902],"mapped",[31119]],[[194903,194903],"mapped",[31211]],[[194904,194904],"mapped",[16687]],[[194905,194905],"mapped",[31296]],[[194906,194906],"mapped",[31306]],[[194907,194907],"mapped",[31311]],[[194908,194908],"mapped",[153980]],[[194909,194910],"mapped",[154279]],[[194911,194911],"disallowed"],[[194912,194912],"mapped",[16898]],[[194913,194913],"mapped",[154539]],[[194914,194914],"mapped",[31686]],[[194915,194915],"mapped",[31689]],[[194916,194916],"mapped",[16935]],[[194917,194917],"mapped",[154752]],[[194918,194918],"mapped",[31954]],[[194919,194919],"mapped",[17056]],[[194920,194920],"mapped",[31976]],[[194921,194921],"mapped",[31971]],[[194922,194922],"mapped",[32000]],[[194923,194923],"mapped",[155526]],[[194924,194924],"mapped",[32099]],[[194925,194925],"mapped",[17153]],[[194926,194926],"mapped",[32199]],[[194927,194927],"mapped",[32258]],[[194928,194928],"mapped",[32325]],[[194929,194929],"mapped",[17204]],[[194930,194930],"mapped",[156200]],[[194931,194931],"mapped",[156231]],[[194932,194932],"mapped",[17241]],[[194933,194933],"mapped",[156377]],[[194934,194934],"mapped",[32634]],[[194935,194935],"mapped",[156478]],[[194936,194936],"mapped",[32661]],[[194937,194937],"mapped",[32762]],[[194938,194938],"mapped",[32773]],[[194939,194939],"mapped",[156890]],[[194940,194940],"mapped",[156963]],[[194941,194941],"mapped",[32864]],[[194942,194942],"mapped",[157096]],[[194943,194943],"mapped",[32880]],[[194944,194944],"mapped",[144223]],[[194945,194945],"mapped",[17365]],[[194946,194946],"mapped",[32946]],[[194947,194947],"mapped",[33027]],[[194948,194948],"mapped",[17419]],[[194949,194949],"mapped",[33086]],[[194950,194950],"mapped",[23221]],[[194951,194951],"mapped",[157607]],[[194952,194952],"mapped",[157621]],[[194953,194953],"mapped",[144275]],[[194954,194954],"mapped",[144284]],[[194955,194955],"mapped",[33281]],[[194956,194956],"mapped",[33284]],[[194957,194957],"mapped",[36766]],[[194958,194958],"mapped",[17515]],[[194959,194959],"mapped",[33425]],[[194960,194960],"mapped",[33419]],[[194961,194961],"mapped",[33437]],[[194962,194962],"mapped",[21171]],[[194963,194963],"mapped",[33457]],[[194964,194964],"mapped",[33459]],[[194965,194965],"mapped",[33469]],[[194966,194966],"mapped",[33510]],[[194967,194967],"mapped",[158524]],[[194968,194968],"mapped",[33509]],[[194969,194969],"mapped",[33565]],[[194970,194970],"mapped",[33635]],[[194971,194971],"mapped",[33709]],[[194972,194972],"mapped",[33571]],[[194973,194973],"mapped",[33725]],[[194974,194974],"mapped",[33767]],[[194975,194975],"mapped",[33879]],[[194976,194976],"mapped",[33619]],[[194977,194977],"mapped",[33738]],[[194978,194978],"mapped",[33740]],[[194979,194979],"mapped",[33756]],[[194980,194980],"mapped",[158774]],[[194981,194981],"mapped",[159083]],[[194982,194982],"mapped",[158933]],[[194983,194983],"mapped",[17707]],[[194984,194984],"mapped",[34033]],[[194985,194985],"mapped",[34035]],[[194986,194986],"mapped",[34070]],[[194987,194987],"mapped",[160714]],[[194988,194988],"mapped",[34148]],[[194989,194989],"mapped",[159532]],[[194990,194990],"mapped",[17757]],[[194991,194991],"mapped",[17761]],[[194992,194992],"mapped",[159665]],[[194993,194993],"mapped",[159954]],[[194994,194994],"mapped",[17771]],[[194995,194995],"mapped",[34384]],[[194996,194996],"mapped",[34396]],[[194997,194997],"mapped",[34407]],[[194998,194998],"mapped",[34409]],[[194999,194999],"mapped",[34473]],[[195000,195000],"mapped",[34440]],[[195001,195001],"mapped",[34574]],[[195002,195002],"mapped",[34530]],[[195003,195003],"mapped",[34681]],[[195004,195004],"mapped",[34600]],[[195005,195005],"mapped",[34667]],[[195006,195006],"mapped",[34694]],[[195007,195007],"disallowed"],[[195008,195008],"mapped",[34785]],[[195009,195009],"mapped",[34817]],[[195010,195010],"mapped",[17913]],[[195011,195011],"mapped",[34912]],[[195012,195012],"mapped",[34915]],[[195013,195013],"mapped",[161383]],[[195014,195014],"mapped",[35031]],[[195015,195015],"mapped",[35038]],[[195016,195016],"mapped",[17973]],[[195017,195017],"mapped",[35066]],[[195018,195018],"mapped",[13499]],[[195019,195019],"mapped",[161966]],[[195020,195020],"mapped",[162150]],[[195021,195021],"mapped",[18110]],[[195022,195022],"mapped",[18119]],[[195023,195023],"mapped",[35488]],[[195024,195024],"mapped",[35565]],[[195025,195025],"mapped",[35722]],[[195026,195026],"mapped",[35925]],[[195027,195027],"mapped",[162984]],[[195028,195028],"mapped",[36011]],[[195029,195029],"mapped",[36033]],[[195030,195030],"mapped",[36123]],[[195031,195031],"mapped",[36215]],[[195032,195032],"mapped",[163631]],[[195033,195033],"mapped",[133124]],[[195034,195034],"mapped",[36299]],[[195035,195035],"mapped",[36284]],[[195036,195036],"mapped",[36336]],[[195037,195037],"mapped",[133342]],[[195038,195038],"mapped",[36564]],[[195039,195039],"mapped",[36664]],[[195040,195040],"mapped",[165330]],[[195041,195041],"mapped",[165357]],[[195042,195042],"mapped",[37012]],[[195043,195043],"mapped",[37105]],[[195044,195044],"mapped",[37137]],[[195045,195045],"mapped",[165678]],[[195046,195046],"mapped",[37147]],[[195047,195047],"mapped",[37432]],[[195048,195048],"mapped",[37591]],[[195049,195049],"mapped",[37592]],[[195050,195050],"mapped",[37500]],[[195051,195051],"mapped",[37881]],[[195052,195052],"mapped",[37909]],[[195053,195053],"mapped",[166906]],[[195054,195054],"mapped",[38283]],[[195055,195055],"mapped",[18837]],[[195056,195056],"mapped",[38327]],[[195057,195057],"mapped",[167287]],[[195058,195058],"mapped",[18918]],[[195059,195059],"mapped",[38595]],[[195060,195060],"mapped",[23986]],[[195061,195061],"mapped",[38691]],[[195062,195062],"mapped",[168261]],[[195063,195063],"mapped",[168474]],[[195064,195064],"mapped",[19054]],[[195065,195065],"mapped",[19062]],[[195066,195066],"mapped",[38880]],[[195067,195067],"mapped",[168970]],[[195068,195068],"mapped",[19122]],[[195069,195069],"mapped",[169110]],[[195070,195071],"mapped",[38923]],[[195072,195072],"mapped",[38953]],[[195073,195073],"mapped",[169398]],[[195074,195074],"mapped",[39138]],[[195075,195075],"mapped",[19251]],[[195076,195076],"mapped",[39209]],[[195077,195077],"mapped",[39335]],[[195078,195078],"mapped",[39362]],[[195079,195079],"mapped",[39422]],[[195080,195080],"mapped",[19406]],[[195081,195081],"mapped",[170800]],[[195082,195082],"mapped",[39698]],[[195083,195083],"mapped",[40000]],[[195084,195084],"mapped",[40189]],[[195085,195085],"mapped",[19662]],[[195086,195086],"mapped",[19693]],[[195087,195087],"mapped",[40295]],[[195088,195088],"mapped",[172238]],[[195089,195089],"mapped",[19704]],[[195090,195090],"mapped",[172293]],[[195091,195091],"mapped",[172558]],[[195092,195092],"mapped",[172689]],[[195093,195093],"mapped",[40635]],[[195094,195094],"mapped",[19798]],[[195095,195095],"mapped",[40697]],[[195096,195096],"mapped",[40702]],[[195097,195097],"mapped",[40709]],[[195098,195098],"mapped",[40719]],[[195099,195099],"mapped",[40726]],[[195100,195100],"mapped",[40763]],[[195101,195101],"mapped",[173568]],[[195102,196605],"disallowed"],[[196606,196607],"disallowed"],[[196608,262141],"disallowed"],[[262142,262143],"disallowed"],[[262144,327677],"disallowed"],[[327678,327679],"disallowed"],[[327680,393213],"disallowed"],[[393214,393215],"disallowed"],[[393216,458749],"disallowed"],[[458750,458751],"disallowed"],[[458752,524285],"disallowed"],[[524286,524287],"disallowed"],[[524288,589821],"disallowed"],[[589822,589823],"disallowed"],[[589824,655357],"disallowed"],[[655358,655359],"disallowed"],[[655360,720893],"disallowed"],[[720894,720895],"disallowed"],[[720896,786429],"disallowed"],[[786430,786431],"disallowed"],[[786432,851965],"disallowed"],[[851966,851967],"disallowed"],[[851968,917501],"disallowed"],[[917502,917503],"disallowed"],[[917504,917504],"disallowed"],[[917505,917505],"disallowed"],[[917506,917535],"disallowed"],[[917536,917631],"disallowed"],[[917632,917759],"disallowed"],[[917760,917999],"ignored"],[[918000,983037],"disallowed"],[[983038,983039],"disallowed"],[[983040,1048573],"disallowed"],[[1048574,1048575],"disallowed"],[[1048576,1114109],"disallowed"],[[1114110,1114111],"disallowed"]]# The BSD 2-Clause License

Copyright (c) 2014, Domenic Denicola
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.
{
  "name": "webidl-conversions",
  "version": "3.0.1",
  "description": "Implements the WebIDL algorithms for converting to and from JavaScript values",
  "main": "lib/index.js",
  "repository": "jsdom/webidl-conversions",
  "files": [
    "lib/"
  ],
  "author": "Domenic Denicola <d@domenic.me> (https://domenic.me/)",
  "license": "BSD-2-Clause",
  "devDependencies": {
    "mocha": "^1.21.4"
  }
}"use strict";

var conversions = {};
module.exports = conversions;

function sign(x) {
    return x < 0 ? -1 : 1;
}

function evenRound(x) {
    // Round x to the nearest integer, choosing the even integer if it lies halfway between two.
    if ((x % 1) === 0.5 && (x & 1) === 0) { // [even number].5; round down (i.e. floor)
        return Math.floor(x);
    } else {
        return Math.round(x);
    }
}

function createNumberConversion(bitLength, typeOpts) {
    if (!typeOpts.unsigned) {
        --bitLength;
    }
    const lowerBound = typeOpts.unsigned ? 0 : -Math.pow(2, bitLength);
    const upperBound = Math.pow(2, bitLength) - 1;

    const moduloVal = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength) : Math.pow(2, bitLength);
    const moduloBound = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength - 1) : Math.pow(2, bitLength - 1);

    return function(V, opts) {
        if (!opts) opts = {};

        let x = +V;

        if (opts.enforceRange) {
            if (!Number.isFinite(x)) {
                throw new TypeError("Argument is not a finite number");
            }

            x = sign(x) * Math.floor(Math.abs(x));
            if (x < lowerBound || x > upperBound) {
                throw new TypeError("Argument is not in byte range");
            }

            return x;
        }

        if (!isNaN(x) && opts.clamp) {
            x = evenRound(x);

            if (x < lowerBound) x = lowerBound;
            if (x > upperBound) x = upperBound;
            return x;
        }

        if (!Number.isFinite(x) || x === 0) {
            return 0;
        }

        x = sign(x) * Math.floor(Math.abs(x));
        x = x % moduloVal;

        if (!typeOpts.unsigned && x >= moduloBound) {
            return x - moduloVal;
        } else if (typeOpts.unsigned) {
            if (x < 0) {
              x += moduloVal;
            } else if (x === -0) { // don't return negative zero
              return 0;
            }
        }

        return x;
    }
}

conversions["void"] = function () {
    return undefined;
};

conversions["boolean"] = function (val) {
    return !!val;
};

conversions["byte"] = createNumberConversion(8, { unsigned: false });
conversions["octet"] = createNumberConversion(8, { unsigned: true });

conversions["short"] = createNumberConversion(16, { unsigned: false });
conversions["unsigned short"] = createNumberConversion(16, { unsigned: true });

conversions["long"] = createNumberConversion(32, { unsigned: false });
conversions["unsigned long"] = createNumberConversion(32, { unsigned: true });

conversions["long long"] = createNumberConversion(32, { unsigned: false, moduloBitLength: 64 });
conversions["unsigned long long"] = createNumberConversion(32, { unsigned: true, moduloBitLength: 64 });

conversions["double"] = function (V) {
    const x = +V;

    if (!Number.isFinite(x)) {
        throw new TypeError("Argument is not a finite floating-point value");
    }

    return x;
};

conversions["unrestricted double"] = function (V) {
    const x = +V;

    if (isNaN(x)) {
        throw new TypeError("Argument is NaN");
    }

    return x;
};

// not quite valid, but good enough for JS
conversions["float"] = conversions["double"];
conversions["unrestricted float"] = conversions["unrestricted double"];

conversions["DOMString"] = function (V, opts) {
    if (!opts) opts = {};

    if (opts.treatNullAsEmptyString && V === null) {
        return "";
    }

    return String(V);
};

conversions["ByteString"] = function (V, opts) {
    const x = String(V);
    let c = undefined;
    for (let i = 0; (c = x.codePointAt(i)) !== undefined; ++i) {
        if (c > 255) {
            throw new TypeError("Argument is not a valid bytestring");
        }
    }

    return x;
};

conversions["USVString"] = function (V) {
    const S = String(V);
    const n = S.length;
    const U = [];
    for (let i = 0; i < n; ++i) {
        const c = S.charCodeAt(i);
        if (c < 0xD800 || c > 0xDFFF) {
            U.push(String.fromCodePoint(c));
        } else if (0xDC00 <= c && c <= 0xDFFF) {
            U.push(String.fromCodePoint(0xFFFD));
        } else {
            if (i === n - 1) {
                U.push(String.fromCodePoint(0xFFFD));
            } else {
                const d = S.charCodeAt(i + 1);
                if (0xDC00 <= d && d <= 0xDFFF) {
                    const a = c & 0x3FF;
                    const b = d & 0x3FF;
                    U.push(String.fromCodePoint((2 << 15) + (2 << 9) * a + b));
                    ++i;
                } else {
                    U.push(String.fromCodePoint(0xFFFD));
                }
            }
        }
    }

    return U.join('');
};

conversions["Date"] = function (V, opts) {
    if (!(V instanceof Date)) {
        throw new TypeError("Argument is not a Date object");
    }
    if (isNaN(V)) {
        return undefined;
    }

    return V;
};

conversions["RegExp"] = function (V, opts) {
    if (!(V instanceof RegExp)) {
        V = new RegExp(V);
    }

    return V;
};
The MIT License (MIT)

Copyright (c) 2015–2016 Sebastian Mayr

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": "whatwg-url",
  "version": "5.0.0",
  "description": "An implementation of the WHATWG URL Standard's URL API and parsing machinery",
  "main": "lib/public-api.js",
  "files": [
    "lib/"
  ],
  "author": "Sebastian Mayr <github@smayr.name>",
  "license": "MIT",
  "repository": "jsdom/whatwg-url",
  "dependencies": {
    "tr46": "~0.0.3",
    "webidl-conversions": "^3.0.0"
  },
  "devDependencies": {
    "eslint": "^2.6.0",
    "istanbul": "~0.4.3",
    "mocha": "^2.2.4",
    "recast": "~0.10.29",
    "request": "^2.55.0",
    "webidl2js": "^3.0.2"
  }
}"use strict";
const usm = require("./url-state-machine");

exports.implementation = class URLImpl {
  constructor(constructorArgs) {
    const url = constructorArgs[0];
    const base = constructorArgs[1];

    let parsedBase = null;
    if (base !== undefined) {
      parsedBase = usm.basicURLParse(base);
      if (parsedBase === "failure") {
        throw new TypeError("Invalid base URL");
      }
    }

    const parsedURL = usm.basicURLParse(url, { baseURL: parsedBase });
    if (parsedURL === "failure") {
      throw new TypeError("Invalid URL");
    }

    this._url = parsedURL;

    // TODO: query stuff
  }

  get href() {
    return usm.serializeURL(this._url);
  }

  set href(v) {
    const parsedURL = usm.basicURLParse(v);
    if (parsedURL === "failure") {
      throw new TypeError("Invalid URL");
    }

    this._url = parsedURL;
  }

  get origin() {
    return usm.serializeURLOrigin(this._url);
  }

  get protocol() {
    return this._url.scheme + ":";
  }

  set protocol(v) {
    usm.basicURLParse(v + ":", { url: this._url, stateOverride: "scheme start" });
  }

  get username() {
    return this._url.username;
  }

  set username(v) {
    if (usm.cannotHaveAUsernamePasswordPort(this._url)) {
      return;
    }

    usm.setTheUsername(this._url, v);
  }

  get password() {
    return this._url.password;
  }

  set password(v) {
    if (usm.cannotHaveAUsernamePasswordPort(this._url)) {
      return;
    }

    usm.setThePassword(this._url, v);
  }

  get host() {
    const url = this._url;

    if (url.host === null) {
      return "";
    }

    if (url.port === null) {
      return usm.serializeHost(url.host);
    }

    return usm.serializeHost(url.host) + ":" + usm.serializeInteger(url.port);
  }

  set host(v) {
    if (this._url.cannotBeABaseURL) {
      return;
    }

    usm.basicURLParse(v, { url: this._url, stateOverride: "host" });
  }

  get hostname() {
    if (this._url.host === null) {
      return "";
    }

    return usm.serializeHost(this._url.host);
  }

  set hostname(v) {
    if (this._url.cannotBeABaseURL) {
      return;
    }

    usm.basicURLParse(v, { url: this._url, stateOverride: "hostname" });
  }

  get port() {
    if (this._url.port === null) {
      return "";
    }

    return usm.serializeInteger(this._url.port);
  }

  set port(v) {
    if (usm.cannotHaveAUsernamePasswordPort(this._url)) {
      return;
    }

    if (v === "") {
      this._url.port = null;
    } else {
      usm.basicURLParse(v, { url: this._url, stateOverride: "port" });
    }
  }

  get pathname() {
    if (this._url.cannotBeABaseURL) {
      return this._url.path[0];
    }

    if (this._url.path.length === 0) {
      return "";
    }

    return "/" + this._url.path.join("/");
  }

  set pathname(v) {
    if (this._url.cannotBeABaseURL) {
      return;
    }

    this._url.path = [];
    usm.basicURLParse(v, { url: this._url, stateOverride: "path start" });
  }

  get search() {
    if (this._url.query === null || this._url.query === "") {
      return "";
    }

    return "?" + this._url.query;
  }

  set search(v) {
    // TODO: query stuff

    const url = this._url;

    if (v === "") {
      url.query = null;
      return;
    }

    const input = v[0] === "?" ? v.substring(1) : v;
    url.query = "";
    usm.basicURLParse(input, { url, stateOverride: "query" });
  }

  get hash() {
    if (this._url.fragment === null || this._url.fragment === "") {
      return "";
    }

    return "#" + this._url.fragment;
  }

  set hash(v) {
    if (v === "") {
      this._url.fragment = null;
      return;
    }

    const input = v[0] === "#" ? v.substring(1) : v;
    this._url.fragment = "";
    usm.basicURLParse(input, { url: this._url, stateOverride: "fragment" });
  }

  toJSON() {
    return this.href;
  }
};
"use strict";

const conversions = require("webidl-conversions");
const utils = require("./utils.js");
const Impl = require(".//URL-impl.js");

const impl = utils.implSymbol;

function URL(url) {
  if (!this || this[impl] || !(this instanceof URL)) {
    throw new TypeError("Failed to construct 'URL': Please use the 'new' operator, this DOM object constructor cannot be called as a function.");
  }
  if (arguments.length < 1) {
    throw new TypeError("Failed to construct 'URL': 1 argument required, but only " + arguments.length + " present.");
  }
  const args = [];
  for (let i = 0; i < arguments.length && i < 2; ++i) {
    args[i] = arguments[i];
  }
  args[0] = conversions["USVString"](args[0]);
  if (args[1] !== undefined) {
  args[1] = conversions["USVString"](args[1]);
  }

  module.exports.setup(this, args);
}

URL.prototype.toJSON = function toJSON() {
  if (!this || !module.exports.is(this)) {
    throw new TypeError("Illegal invocation");
  }
  const args = [];
  for (let i = 0; i < arguments.length && i < 0; ++i) {
    args[i] = arguments[i];
  }
  return this[impl].toJSON.apply(this[impl], args);
};
Object.defineProperty(URL.prototype, "href", {
  get() {
    return this[impl].href;
  },
  set(V) {
    V = conversions["USVString"](V);
    this[impl].href = V;
  },
  enumerable: true,
  configurable: true
});

URL.prototype.toString = function () {
  if (!this || !module.exports.is(this)) {
    throw new TypeError("Illegal invocation");
  }
  return this.href;
};

Object.defineProperty(URL.prototype, "origin", {
  get() {
    return this[impl].origin;
  },
  enumerable: true,
  configurable: true
});

Object.defineProperty(URL.prototype, "protocol", {
  get() {
    return this[impl].protocol;
  },
  set(V) {
    V = conversions["USVString"](V);
    this[impl].protocol = V;
  },
  enumerable: true,
  configurable: true
});

Object.defineProperty(URL.prototype, "username", {
  get() {
    return this[impl].username;
  },
  set(V) {
    V = conversions["USVString"](V);
    this[impl].username = V;
  },
  enumerable: true,
  configurable: true
});

Object.defineProperty(URL.prototype, "password", {
  get() {
    return this[impl].password;
  },
  set(V) {
    V = conversions["USVString"](V);
    this[impl].password = V;
  },
  enumerable: true,
  configurable: true
});

Object.defineProperty(URL.prototype, "host", {
  get() {
    return this[impl].host;
  },
  set(V) {
    V = conversions["USVString"](V);
    this[impl].host = V;
  },
  enumerable: true,
  configurable: true
});

Object.defineProperty(URL.prototype, "hostname", {
  get() {
    return this[impl].hostname;
  },
  set(V) {
    V = conversions["USVString"](V);
    this[impl].hostname = V;
  },
  enumerable: true,
  configurable: true
});

Object.defineProperty(URL.prototype, "port", {
  get() {
    return this[impl].port;
  },
  set(V) {
    V = conversions["USVString"](V);
    this[impl].port = V;
  },
  enumerable: true,
  configurable: true
});

Object.defineProperty(URL.prototype, "pathname", {
  get() {
    return this[impl].pathname;
  },
  set(V) {
    V = conversions["USVString"](V);
    this[impl].pathname = V;
  },
  enumerable: true,
  configurable: true
});

Object.defineProperty(URL.prototype, "search", {
  get() {
    return this[impl].search;
  },
  set(V) {
    V = conversions["USVString"](V);
    this[impl].search = V;
  },
  enumerable: true,
  configurable: true
});

Object.defineProperty(URL.prototype, "hash", {
  get() {
    return this[impl].hash;
  },
  set(V) {
    V = conversions["USVString"](V);
    this[impl].hash = V;
  },
  enumerable: true,
  configurable: true
});


module.exports = {
  is(obj) {
    return !!obj && obj[impl] instanceof Impl.implementation;
  },
  create(constructorArgs, privateData) {
    let obj = Object.create(URL.prototype);
    this.setup(obj, constructorArgs, privateData);
    return obj;
  },
  setup(obj, constructorArgs, privateData) {
    if (!privateData) privateData = {};
    privateData.wrapper = obj;

    obj[impl] = new Impl.implementation(constructorArgs, privateData);
    obj[impl][utils.wrapperSymbol] = obj;
  },
  interface: URL,
  expose: {
    Window: { URL: URL },
    Worker: { URL: URL }
  }
};

"use strict";

exports.URL = require("./URL").interface;
exports.serializeURL = require("./url-state-machine").serializeURL;
exports.serializeURLOrigin = require("./url-state-machine").serializeURLOrigin;
exports.basicURLParse = require("./url-state-machine").basicURLParse;
exports.setTheUsername = require("./url-state-machine").setTheUsername;
exports.setThePassword = require("./url-state-machine").setThePassword;
exports.serializeHost = require("./url-state-machine").serializeHost;
exports.serializeInteger = require("./url-state-machine").serializeInteger;
exports.parseURL = require("./url-state-machine").parseURL;
"use strict";
const punycode = require("punycode");
const tr46 = require("tr46");

const specialSchemes = {
  ftp: 21,
  file: null,
  gopher: 70,
  http: 80,
  https: 443,
  ws: 80,
  wss: 443
};

const failure = Symbol("failure");

function countSymbols(str) {
  return punycode.ucs2.decode(str).length;
}

function at(input, idx) {
  const c = input[idx];
  return isNaN(c) ? undefined : String.fromCodePoint(c);
}

function isASCIIDigit(c) {
  return c >= 0x30 && c <= 0x39;
}

function isASCIIAlpha(c) {
  return (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A);
}

function isASCIIAlphanumeric(c) {
  return isASCIIAlpha(c) || isASCIIDigit(c);
}

function isASCIIHex(c) {
  return isASCIIDigit(c) || (c >= 0x41 && c <= 0x46) || (c >= 0x61 && c <= 0x66);
}

function isSingleDot(buffer) {
  return buffer === "." || buffer.toLowerCase() === "%2e";
}

function isDoubleDot(buffer) {
  buffer = buffer.toLowerCase();
  return buffer === ".." || buffer === "%2e." || buffer === ".%2e" || buffer === "%2e%2e";
}

function isWindowsDriveLetterCodePoints(cp1, cp2) {
  return isASCIIAlpha(cp1) && (cp2 === 58 || cp2 === 124);
}

function isWindowsDriveLetterString(string) {
  return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && (string[1] === ":" || string[1] === "|");
}

function isNormalizedWindowsDriveLetterString(string) {
  return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && string[1] === ":";
}

function containsForbiddenHostCodePoint(string) {
  return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|%|\/|:|\?|@|\[|\\|\]/) !== -1;
}

function containsForbiddenHostCodePointExcludingPercent(string) {
  return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|\/|:|\?|@|\[|\\|\]/) !== -1;
}

function isSpecialScheme(scheme) {
  return specialSchemes[scheme] !== undefined;
}

function isSpecial(url) {
  return isSpecialScheme(url.scheme);
}

function defaultPort(scheme) {
  return specialSchemes[scheme];
}

function percentEncode(c) {
  let hex = c.toString(16).toUpperCase();
  if (hex.length === 1) {
    hex = "0" + hex;
  }

  return "%" + hex;
}

function utf8PercentEncode(c) {
  const buf = new Buffer(c);

  let str = "";

  for (let i = 0; i < buf.length; ++i) {
    str += percentEncode(buf[i]);
  }

  return str;
}

function utf8PercentDecode(str) {
  const input = new Buffer(str);
  const output = [];
  for (let i = 0; i < input.length; ++i) {
    if (input[i] !== 37) {
      output.push(input[i]);
    } else if (input[i] === 37 && isASCIIHex(input[i + 1]) && isASCIIHex(input[i + 2])) {
      output.push(parseInt(input.slice(i + 1, i + 3).toString(), 16));
      i += 2;
    } else {
      output.push(input[i]);
    }
  }
  return new Buffer(output).toString();
}

function isC0ControlPercentEncode(c) {
  return c <= 0x1F || c > 0x7E;
}

const extraPathPercentEncodeSet = new Set([32, 34, 35, 60, 62, 63, 96, 123, 125]);
function isPathPercentEncode(c) {
  return isC0ControlPercentEncode(c) || extraPathPercentEncodeSet.has(c);
}

const extraUserinfoPercentEncodeSet =
  new Set([47, 58, 59, 61, 64, 91, 92, 93, 94, 124]);
function isUserinfoPercentEncode(c) {
  return isPathPercentEncode(c) || extraUserinfoPercentEncodeSet.has(c);
}

function percentEncodeChar(c, encodeSetPredicate) {
  const cStr = String.fromCodePoint(c);

  if (encodeSetPredicate(c)) {
    return utf8PercentEncode(cStr);
  }

  return cStr;
}

function parseIPv4Number(input) {
  let R = 10;

  if (input.length >= 2 && input.charAt(0) === "0" && input.charAt(1).toLowerCase() === "x") {
    input = input.substring(2);
    R = 16;
  } else if (input.length >= 2 && input.charAt(0) === "0") {
    input = input.substring(1);
    R = 8;
  }

  if (input === "") {
    return 0;
  }

  const regex = R === 10 ? /[^0-9]/ : (R === 16 ? /[^0-9A-Fa-f]/ : /[^0-7]/);
  if (regex.test(input)) {
    return failure;
  }

  return parseInt(input, R);
}

function parseIPv4(input) {
  const parts = input.split(".");
  if (parts[parts.length - 1] === "") {
    if (parts.length > 1) {
      parts.pop();
    }
  }

  if (parts.length > 4) {
    return input;
  }

  const numbers = [];
  for (const part of parts) {
    if (part === "") {
      return input;
    }
    const n = parseIPv4Number(part);
    if (n === failure) {
      return input;
    }

    numbers.push(n);
  }

  for (let i = 0; i < numbers.length - 1; ++i) {
    if (numbers[i] > 255) {
      return failure;
    }
  }
  if (numbers[numbers.length - 1] >= Math.pow(256, 5 - numbers.length)) {
    return failure;
  }

  let ipv4 = numbers.pop();
  let counter = 0;

  for (const n of numbers) {
    ipv4 += n * Math.pow(256, 3 - counter);
    ++counter;
  }

  return ipv4;
}

function serializeIPv4(address) {
  let output = "";
  let n = address;

  for (let i = 1; i <= 4; ++i) {
    output = String(n % 256) + output;
    if (i !== 4) {
      output = "." + output;
    }
    n = Math.floor(n / 256);
  }

  return output;
}

function parseIPv6(input) {
  const address = [0, 0, 0, 0, 0, 0, 0, 0];
  let pieceIndex = 0;
  let compress = null;
  let pointer = 0;

  input = punycode.ucs2.decode(input);

  if (input[pointer] === 58) {
    if (input[pointer + 1] !== 58) {
      return failure;
    }

    pointer += 2;
    ++pieceIndex;
    compress = pieceIndex;
  }

  while (pointer < input.length) {
    if (pieceIndex === 8) {
      return failure;
    }

    if (input[pointer] === 58) {
      if (compress !== null) {
        return failure;
      }
      ++pointer;
      ++pieceIndex;
      compress = pieceIndex;
      continue;
    }

    let value = 0;
    let length = 0;

    while (length < 4 && isASCIIHex(input[pointer])) {
      value = value * 0x10 + parseInt(at(input, pointer), 16);
      ++pointer;
      ++length;
    }

    if (input[pointer] === 46) {
      if (length === 0) {
        return failure;
      }

      pointer -= length;

      if (pieceIndex > 6) {
        return failure;
      }

      let numbersSeen = 0;

      while (input[pointer] !== undefined) {
        let ipv4Piece = null;

        if (numbersSeen > 0) {
          if (input[pointer] === 46 && numbersSeen < 4) {
            ++pointer;
          } else {
            return failure;
          }
        }

        if (!isASCIIDigit(input[pointer])) {
          return failure;
        }

        while (isASCIIDigit(input[pointer])) {
          const number = parseInt(at(input, pointer));
          if (ipv4Piece === null) {
            ipv4Piece = number;
          } else if (ipv4Piece === 0) {
            return failure;
          } else {
            ipv4Piece = ipv4Piece * 10 + number;
          }
          if (ipv4Piece > 255) {
            return failure;
          }
          ++pointer;
        }

        address[pieceIndex] = address[pieceIndex] * 0x100 + ipv4Piece;

        ++numbersSeen;

        if (numbersSeen === 2 || numbersSeen === 4) {
          ++pieceIndex;
        }
      }

      if (numbersSeen !== 4) {
        return failure;
      }

      break;
    } else if (input[pointer] === 58) {
      ++pointer;
      if (input[pointer] === undefined) {
        return failure;
      }
    } else if (input[pointer] !== undefined) {
      return failure;
    }

    address[pieceIndex] = value;
    ++pieceIndex;
  }

  if (compress !== null) {
    let swaps = pieceIndex - compress;
    pieceIndex = 7;
    while (pieceIndex !== 0 && swaps > 0) {
      const temp = address[compress + swaps - 1];
      address[compress + swaps - 1] = address[pieceIndex];
      address[pieceIndex] = temp;
      --pieceIndex;
      --swaps;
    }
  } else if (compress === null && pieceIndex !== 8) {
    return failure;
  }

  return address;
}

function serializeIPv6(address) {
  let output = "";
  const seqResult = findLongestZeroSequence(address);
  const compress = seqResult.idx;
  let ignore0 = false;

  for (let pieceIndex = 0; pieceIndex <= 7; ++pieceIndex) {
    if (ignore0 && address[pieceIndex] === 0) {
      continue;
    } else if (ignore0) {
      ignore0 = false;
    }

    if (compress === pieceIndex) {
      const separator = pieceIndex === 0 ? "::" : ":";
      output += separator;
      ignore0 = true;
      continue;
    }

    output += address[pieceIndex].toString(16);

    if (pieceIndex !== 7) {
      output += ":";
    }
  }

  return output;
}

function parseHost(input, isSpecialArg) {
  if (input[0] === "[") {
    if (input[input.length - 1] !== "]") {
      return failure;
    }

    return parseIPv6(input.substring(1, input.length - 1));
  }

  if (!isSpecialArg) {
    return parseOpaqueHost(input);
  }

  const domain = utf8PercentDecode(input);
  const asciiDomain = tr46.toASCII(domain, false, tr46.PROCESSING_OPTIONS.NONTRANSITIONAL, false);
  if (asciiDomain === null) {
    return failure;
  }

  if (containsForbiddenHostCodePoint(asciiDomain)) {
    return failure;
  }

  const ipv4Host = parseIPv4(asciiDomain);
  if (typeof ipv4Host === "number" || ipv4Host === failure) {
    return ipv4Host;
  }

  return asciiDomain;
}

function parseOpaqueHost(input) {
  if (containsForbiddenHostCodePointExcludingPercent(input)) {
    return failure;
  }

  let output = "";
  const decoded = punycode.ucs2.decode(input);
  for (let i = 0; i < decoded.length; ++i) {
    output += percentEncodeChar(decoded[i], isC0ControlPercentEncode);
  }
  return output;
}

function findLongestZeroSequence(arr) {
  let maxIdx = null;
  let maxLen = 1; // only find elements > 1
  let currStart = null;
  let currLen = 0;

  for (let i = 0; i < arr.length; ++i) {
    if (arr[i] !== 0) {
      if (currLen > maxLen) {
        maxIdx = currStart;
        maxLen = currLen;
      }

      currStart = null;
      currLen = 0;
    } else {
      if (currStart === null) {
        currStart = i;
      }
      ++currLen;
    }
  }

  // if trailing zeros
  if (currLen > maxLen) {
    maxIdx = currStart;
    maxLen = currLen;
  }

  return {
    idx: maxIdx,
    len: maxLen
  };
}

function serializeHost(host) {
  if (typeof host === "number") {
    return serializeIPv4(host);
  }

  // IPv6 serializer
  if (host instanceof Array) {
    return "[" + serializeIPv6(host) + "]";
  }

  return host;
}

function trimControlChars(url) {
  return url.replace(/^[\u0000-\u001F\u0020]+|[\u0000-\u001F\u0020]+$/g, "");
}

function trimTabAndNewline(url) {
  return url.replace(/\u0009|\u000A|\u000D/g, "");
}

function shortenPath(url) {
  const path = url.path;
  if (path.length === 0) {
    return;
  }
  if (url.scheme === "file" && path.length === 1 && isNormalizedWindowsDriveLetter(path[0])) {
    return;
  }

  path.pop();
}

function includesCredentials(url) {
  return url.username !== "" || url.password !== "";
}

function cannotHaveAUsernamePasswordPort(url) {
  return url.host === null || url.host === "" || url.cannotBeABaseURL || url.scheme === "file";
}

function isNormalizedWindowsDriveLetter(string) {
  return /^[A-Za-z]:$/.test(string);
}

function URLStateMachine(input, base, encodingOverride, url, stateOverride) {
  this.pointer = 0;
  this.input = input;
  this.base = base || null;
  this.encodingOverride = encodingOverride || "utf-8";
  this.stateOverride = stateOverride;
  this.url = url;
  this.failure = false;
  this.parseError = false;

  if (!this.url) {
    this.url = {
      scheme: "",
      username: "",
      password: "",
      host: null,
      port: null,
      path: [],
      query: null,
      fragment: null,

      cannotBeABaseURL: false
    };

    const res = trimControlChars(this.input);
    if (res !== this.input) {
      this.parseError = true;
    }
    this.input = res;
  }

  const res = trimTabAndNewline(this.input);
  if (res !== this.input) {
    this.parseError = true;
  }
  this.input = res;

  this.state = stateOverride || "scheme start";

  this.buffer = "";
  this.atFlag = false;
  this.arrFlag = false;
  this.passwordTokenSeenFlag = false;

  this.input = punycode.ucs2.decode(this.input);

  for (; this.pointer <= this.input.length; ++this.pointer) {
    const c = this.input[this.pointer];
    const cStr = isNaN(c) ? undefined : String.fromCodePoint(c);

    // exec state machine
    const ret = this["parse " + this.state](c, cStr);
    if (!ret) {
      break; // terminate algorithm
    } else if (ret === failure) {
      this.failure = true;
      break;
    }
  }
}

URLStateMachine.prototype["parse scheme start"] = function parseSchemeStart(c, cStr) {
  if (isASCIIAlpha(c)) {
    this.buffer += cStr.toLowerCase();
    this.state = "scheme";
  } else if (!this.stateOverride) {
    this.state = "no scheme";
    --this.pointer;
  } else {
    this.parseError = true;
    return failure;
  }

  return true;
};

URLStateMachine.prototype["parse scheme"] = function parseScheme(c, cStr) {
  if (isASCIIAlphanumeric(c) || c === 43 || c === 45 || c === 46) {
    this.buffer += cStr.toLowerCase();
  } else if (c === 58) {
    if (this.stateOverride) {
      if (isSpecial(this.url) && !isSpecialScheme(this.buffer)) {
        return false;
      }

      if (!isSpecial(this.url) && isSpecialScheme(this.buffer)) {
        return false;
      }

      if ((includesCredentials(this.url) || this.url.port !== null) && this.buffer === "file") {
        return false;
      }

      if (this.url.scheme === "file" && (this.url.host === "" || this.url.host === null)) {
        return false;
      }
    }
    this.url.scheme = this.buffer;
    this.buffer = "";
    if (this.stateOverride) {
      return false;
    }
    if (this.url.scheme === "file") {
      if (this.input[this.pointer + 1] !== 47 || this.input[this.pointer + 2] !== 47) {
        this.parseError = true;
      }
      this.state = "file";
    } else if (isSpecial(this.url) && this.base !== null && this.base.scheme === this.url.scheme) {
      this.state = "special relative or authority";
    } else if (isSpecial(this.url)) {
      this.state = "special authority slashes";
    } else if (this.input[this.pointer + 1] === 47) {
      this.state = "path or authority";
      ++this.pointer;
    } else {
      this.url.cannotBeABaseURL = true;
      this.url.path.push("");
      this.state = "cannot-be-a-base-URL path";
    }
  } else if (!this.stateOverride) {
    this.buffer = "";
    this.state = "no scheme";
    this.pointer = -1;
  } else {
    this.parseError = true;
    return failure;
  }

  return true;
};

URLStateMachine.prototype["parse no scheme"] = function parseNoScheme(c) {
  if (this.base === null || (this.base.cannotBeABaseURL && c !== 35)) {
    return failure;
  } else if (this.base.cannotBeABaseURL && c === 35) {
    this.url.scheme = this.base.scheme;
    this.url.path = this.base.path.slice();
    this.url.query = this.base.query;
    this.url.fragment = "";
    this.url.cannotBeABaseURL = true;
    this.state = "fragment";
  } else if (this.base.scheme === "file") {
    this.state = "file";
    --this.pointer;
  } else {
    this.state = "relative";
    --this.pointer;
  }

  return true;
};

URLStateMachine.prototype["parse special relative or authority"] = function parseSpecialRelativeOrAuthority(c) {
  if (c === 47 && this.input[this.pointer + 1] === 47) {
    this.state = "special authority ignore slashes";
    ++this.pointer;
  } else {
    this.parseError = true;
    this.state = "relative";
    --this.pointer;
  }

  return true;
};

URLStateMachine.prototype["parse path or authority"] = function parsePathOrAuthority(c) {
  if (c === 47) {
    this.state = "authority";
  } else {
    this.state = "path";
    --this.pointer;
  }

  return true;
};

URLStateMachine.prototype["parse relative"] = function parseRelative(c) {
  this.url.scheme = this.base.scheme;
  if (isNaN(c)) {
    this.url.username = this.base.username;
    this.url.password = this.base.password;
    this.url.host = this.base.host;
    this.url.port = this.base.port;
    this.url.path = this.base.path.slice();
    this.url.query = this.base.query;
  } else if (c === 47) {
    this.state = "relative slash";
  } else if (c === 63) {
    this.url.username = this.base.username;
    this.url.password = this.base.password;
    this.url.host = this.base.host;
    this.url.port = this.base.port;
    this.url.path = this.base.path.slice();
    this.url.query = "";
    this.state = "query";
  } else if (c === 35) {
    this.url.username = this.base.username;
    this.url.password = this.base.password;
    this.url.host = this.base.host;
    this.url.port = this.base.port;
    this.url.path = this.base.path.slice();
    this.url.query = this.base.query;
    this.url.fragment = "";
    this.state = "fragment";
  } else if (isSpecial(this.url) && c === 92) {
    this.parseError = true;
    this.state = "relative slash";
  } else {
    this.url.username = this.base.username;
    this.url.password = this.base.password;
    this.url.host = this.base.host;
    this.url.port = this.base.port;
    this.url.path = this.base.path.slice(0, this.base.path.length - 1);

    this.state = "path";
    --this.pointer;
  }

  return true;
};

URLStateMachine.prototype["parse relative slash"] = function parseRelativeSlash(c) {
  if (isSpecial(this.url) && (c === 47 || c === 92)) {
    if (c === 92) {
      this.parseError = true;
    }
    this.state = "special authority ignore slashes";
  } else if (c === 47) {
    this.state = "authority";
  } else {
    this.url.username = this.base.username;
    this.url.password = this.base.password;
    this.url.host = this.base.host;
    this.url.port = this.base.port;
    this.state = "path";
    --this.pointer;
  }

  return true;
};

URLStateMachine.prototype["parse special authority slashes"] = function parseSpecialAuthoritySlashes(c) {
  if (c === 47 && this.input[this.pointer + 1] === 47) {
    this.state = "special authority ignore slashes";
    ++this.pointer;
  } else {
    this.parseError = true;
    this.state = "special authority ignore slashes";
    --this.pointer;
  }

  return true;
};

URLStateMachine.prototype["parse special authority ignore slashes"] = function parseSpecialAuthorityIgnoreSlashes(c) {
  if (c !== 47 && c !== 92) {
    this.state = "authority";
    --this.pointer;
  } else {
    this.parseError = true;
  }

  return true;
};

URLStateMachine.prototype["parse authority"] = function parseAuthority(c, cStr) {
  if (c === 64) {
    this.parseError = true;
    if (this.atFlag) {
      this.buffer = "%40" + this.buffer;
    }
    this.atFlag = true;

    // careful, this is based on buffer and has its own pointer (this.pointer != pointer) and inner chars
    const len = countSymbols(this.buffer);
    for (let pointer = 0; pointer < len; ++pointer) {
      const codePoint = this.buffer.codePointAt(pointer);

      if (codePoint === 58 && !this.passwordTokenSeenFlag) {
        this.passwordTokenSeenFlag = true;
        continue;
      }
      const encodedCodePoints = percentEncodeChar(codePoint, isUserinfoPercentEncode);
      if (this.passwordTokenSeenFlag) {
        this.url.password += encodedCodePoints;
      } else {
        this.url.username += encodedCodePoints;
      }
    }
    this.buffer = "";
  } else if (isNaN(c) || c === 47 || c === 63 || c === 35 ||
             (isSpecial(this.url) && c === 92)) {
    if (this.atFlag && this.buffer === "") {
      this.parseError = true;
      return failure;
    }
    this.pointer -= countSymbols(this.buffer) + 1;
    this.buffer = "";
    this.state = "host";
  } else {
    this.buffer += cStr;
  }

  return true;
};

URLStateMachine.prototype["parse hostname"] =
URLStateMachine.prototype["parse host"] = function parseHostName(c, cStr) {
  if (this.stateOverride && this.url.scheme === "file") {
    --this.pointer;
    this.state = "file host";
  } else if (c === 58 && !this.arrFlag) {
    if (this.buffer === "") {
      this.parseError = true;
      return failure;
    }

    const host = parseHost(this.buffer, isSpecial(this.url));
    if (host === failure) {
      return failure;
    }

    this.url.host = host;
    this.buffer = "";
    this.state = "port";
    if (this.stateOverride === "hostname") {
      return false;
    }
  } else if (isNaN(c) || c === 47 || c === 63 || c === 35 ||
             (isSpecial(this.url) && c === 92)) {
    --this.pointer;
    if (isSpecial(this.url) && this.buffer === "") {
      this.parseError = true;
      return failure;
    } else if (this.stateOverride && this.buffer === "" &&
               (includesCredentials(this.url) || this.url.port !== null)) {
      this.parseError = true;
      return false;
    }

    const host = parseHost(this.buffer, isSpecial(this.url));
    if (host === failure) {
      return failure;
    }

    this.url.host = host;
    this.buffer = "";
    this.state = "path start";
    if (this.stateOverride) {
      return false;
    }
  } else {
    if (c === 91) {
      this.arrFlag = true;
    } else if (c === 93) {
      this.arrFlag = false;
    }
    this.buffer += cStr;
  }

  return true;
};

URLStateMachine.prototype["parse port"] = function parsePort(c, cStr) {
  if (isASCIIDigit(c)) {
    this.buffer += cStr;
  } else if (isNaN(c) || c === 47 || c === 63 || c === 35 ||
             (isSpecial(this.url) && c === 92) ||
             this.stateOverride) {
    if (this.buffer !== "") {
      const port = parseInt(this.buffer);
      if (port > Math.pow(2, 16) - 1) {
        this.parseError = true;
        return failure;
      }
      this.url.port = port === defaultPort(this.url.scheme) ? null : port;
      this.buffer = "";
    }
    if (this.stateOverride) {
      return false;
    }
    this.state = "path start";
    --this.pointer;
  } else {
    this.parseError = true;
    return failure;
  }

  return true;
};

const fileOtherwiseCodePoints = new Set([47, 92, 63, 35]);

URLStateMachine.prototype["parse file"] = function parseFile(c) {
  this.url.scheme = "file";

  if (c === 47 || c === 92) {
    if (c === 92) {
      this.parseError = true;
    }
    this.state = "file slash";
  } else if (this.base !== null && this.base.scheme === "file") {
    if (isNaN(c)) {
      this.url.host = this.base.host;
      this.url.path = this.base.path.slice();
      this.url.query = this.base.query;
    } else if (c === 63) {
      this.url.host = this.base.host;
      this.url.path = this.base.path.slice();
      this.url.query = "";
      this.state = "query";
    } else if (c === 35) {
      this.url.host = this.base.host;
      this.url.path = this.base.path.slice();
      this.url.query = this.base.query;
      this.url.fragment = "";
      this.state = "fragment";
    } else {
      if (this.input.length - this.pointer - 1 === 0 || // remaining consists of 0 code points
          !isWindowsDriveLetterCodePoints(c, this.input[this.pointer + 1]) ||
          (this.input.length - this.pointer - 1 >= 2 && // remaining has at least 2 code points
           !fileOtherwiseCodePoints.has(this.input[this.pointer + 2]))) {
        this.url.host = this.base.host;
        this.url.path = this.base.path.slice();
        shortenPath(this.url);
      } else {
        this.parseError = true;
      }

      this.state = "path";
      --this.pointer;
    }
  } else {
    this.state = "path";
    --this.pointer;
  }

  return true;
};

URLStateMachine.prototype["parse file slash"] = function parseFileSlash(c) {
  if (c === 47 || c === 92) {
    if (c === 92) {
      this.parseError = true;
    }
    this.state = "file host";
  } else {
    if (this.base !== null && this.base.scheme === "file") {
      if (isNormalizedWindowsDriveLetterString(this.base.path[0])) {
        this.url.path.push(this.base.path[0]);
      } else {
        this.url.host = this.base.host;
      }
    }
    this.state = "path";
    --this.pointer;
  }

  return true;
};

URLStateMachine.prototype["parse file host"] = function parseFileHost(c, cStr) {
  if (isNaN(c) || c === 47 || c === 92 || c === 63 || c === 35) {
    --this.pointer;
    if (!this.stateOverride && isWindowsDriveLetterString(this.buffer)) {
      this.parseError = true;
      this.state = "path";
    } else if (this.buffer === "") {
      this.url.host = "";
      if (this.stateOverride) {
        return false;
      }
      this.state = "path start";
    } else {
      let host = parseHost(this.buffer, isSpecial(this.url));
      if (host === failure) {
        return failure;
      }
      if (host === "localhost") {
        host = "";
      }
      this.url.host = host;

      if (this.stateOverride) {
        return false;
      }

      this.buffer = "";
      this.state = "path start";
    }
  } else {
    this.buffer += cStr;
  }

  return true;
};

URLStateMachine.prototype["parse path start"] = function parsePathStart(c) {
  if (isSpecial(this.url)) {
    if (c === 92) {
      this.parseError = true;
    }
    this.state = "path";

    if (c !== 47 && c !== 92) {
      --this.pointer;
    }
  } else if (!this.stateOverride && c === 63) {
    this.url.query = "";
    this.state = "query";
  } else if (!this.stateOverride && c === 35) {
    this.url.fragment = "";
    this.state = "fragment";
  } else if (c !== undefined) {
    this.state = "path";
    if (c !== 47) {
      --this.pointer;
    }
  }

  return true;
};

URLStateMachine.prototype["parse path"] = function parsePath(c) {
  if (isNaN(c) || c === 47 || (isSpecial(this.url) && c === 92) ||
      (!this.stateOverride && (c === 63 || c === 35))) {
    if (isSpecial(this.url) && c === 92) {
      this.parseError = true;
    }

    if (isDoubleDot(this.buffer)) {
      shortenPath(this.url);
      if (c !== 47 && !(isSpecial(this.url) && c === 92)) {
        this.url.path.push("");
      }
    } else if (isSingleDot(this.buffer) && c !== 47 &&
               !(isSpecial(this.url) && c === 92)) {
      this.url.path.push("");
    } else if (!isSingleDot(this.buffer)) {
      if (this.url.scheme === "file" && this.url.path.length === 0 && isWindowsDriveLetterString(this.buffer)) {
        if (this.url.host !== "" && this.url.host !== null) {
          this.parseError = true;
          this.url.host = "";
        }
        this.buffer = this.buffer[0] + ":";
      }
      this.url.path.push(this.buffer);
    }
    this.buffer = "";
    if (this.url.scheme === "file" && (c === undefined || c === 63 || c === 35)) {
      while (this.url.path.length > 1 && this.url.path[0] === "") {
        this.parseError = true;
        this.url.path.shift();
      }
    }
    if (c === 63) {
      this.url.query = "";
      this.state = "query";
    }
    if (c === 35) {
      this.url.fragment = "";
      this.state = "fragment";
    }
  } else {
    // TODO: If c is not a URL code point and not "%", parse error.

    if (c === 37 &&
      (!isASCIIHex(this.input[this.pointer + 1]) ||
        !isASCIIHex(this.input[this.pointer + 2]))) {
      this.parseError = true;
    }

    this.buffer += percentEncodeChar(c, isPathPercentEncode);
  }

  return true;
};

URLStateMachine.prototype["parse cannot-be-a-base-URL path"] = function parseCannotBeABaseURLPath(c) {
  if (c === 63) {
    this.url.query = "";
    this.state = "query";
  } else if (c === 35) {
    this.url.fragment = "";
    this.state = "fragment";
  } else {
    // TODO: Add: not a URL code point
    if (!isNaN(c) && c !== 37) {
      this.parseError = true;
    }

    if (c === 37 &&
        (!isASCIIHex(this.input[this.pointer + 1]) ||
         !isASCIIHex(this.input[this.pointer + 2]))) {
      this.parseError = true;
    }

    if (!isNaN(c)) {
      this.url.path[0] = this.url.path[0] + percentEncodeChar(c, isC0ControlPercentEncode);
    }
  }

  return true;
};

URLStateMachine.prototype["parse query"] = function parseQuery(c, cStr) {
  if (isNaN(c) || (!this.stateOverride && c === 35)) {
    if (!isSpecial(this.url) || this.url.scheme === "ws" || this.url.scheme === "wss") {
      this.encodingOverride = "utf-8";
    }

    const buffer = new Buffer(this.buffer); // TODO: Use encoding override instead
    for (let i = 0; i < buffer.length; ++i) {
      if (buffer[i] < 0x21 || buffer[i] > 0x7E || buffer[i] === 0x22 || buffer[i] === 0x23 ||
          buffer[i] === 0x3C || buffer[i] === 0x3E) {
        this.url.query += percentEncode(buffer[i]);
      } else {
        this.url.query += String.fromCodePoint(buffer[i]);
      }
    }

    this.buffer = "";
    if (c === 35) {
      this.url.fragment = "";
      this.state = "fragment";
    }
  } else {
    // TODO: If c is not a URL code point and not "%", parse error.
    if (c === 37 &&
      (!isASCIIHex(this.input[this.pointer + 1]) ||
        !isASCIIHex(this.input[this.pointer + 2]))) {
      this.parseError = true;
    }

    this.buffer += cStr;
  }

  return true;
};

URLStateMachine.prototype["parse fragment"] = function parseFragment(c) {
  if (isNaN(c)) { // do nothing
  } else if (c === 0x0) {
    this.parseError = true;
  } else {
    // TODO: If c is not a URL code point and not "%", parse error.
    if (c === 37 &&
      (!isASCIIHex(this.input[this.pointer + 1]) ||
        !isASCIIHex(this.input[this.pointer + 2]))) {
      this.parseError = true;
    }

    this.url.fragment += percentEncodeChar(c, isC0ControlPercentEncode);
  }

  return true;
};

function serializeURL(url, excludeFragment) {
  let output = url.scheme + ":";
  if (url.host !== null) {
    output += "//";

    if (url.username !== "" || url.password !== "") {
      output += url.username;
      if (url.password !== "") {
        output += ":" + url.password;
      }
      output += "@";
    }

    output += serializeHost(url.host);

    if (url.port !== null) {
      output += ":" + url.port;
    }
  } else if (url.host === null && url.scheme === "file") {
    output += "//";
  }

  if (url.cannotBeABaseURL) {
    output += url.path[0];
  } else {
    for (const string of url.path) {
      output += "/" + string;
    }
  }

  if (url.query !== null) {
    output += "?" + url.query;
  }

  if (!excludeFragment && url.fragment !== null) {
    output += "#" + url.fragment;
  }

  return output;
}

function serializeOrigin(tuple) {
  let result = tuple.scheme + "://";
  result += serializeHost(tuple.host);

  if (tuple.port !== null) {
    result += ":" + tuple.port;
  }

  return result;
}

module.exports.serializeURL = serializeURL;

module.exports.serializeURLOrigin = function (url) {
  // https://url.spec.whatwg.org/#concept-url-origin
  switch (url.scheme) {
    case "blob":
      try {
        return module.exports.serializeURLOrigin(module.exports.parseURL(url.path[0]));
      } catch (e) {
        // serializing an opaque origin returns "null"
        return "null";
      }
    case "ftp":
    case "gopher":
    case "http":
    case "https":
    case "ws":
    case "wss":
      return serializeOrigin({
        scheme: url.scheme,
        host: url.host,
        port: url.port
      });
    case "file":
      // spec says "exercise to the reader", chrome says "file://"
      return "file://";
    default:
      // serializing an opaque origin returns "null"
      return "null";
  }
};

module.exports.basicURLParse = function (input, options) {
  if (options === undefined) {
    options = {};
  }

  const usm = new URLStateMachine(input, options.baseURL, options.encodingOverride, options.url, options.stateOverride);
  if (usm.failure) {
    return "failure";
  }

  return usm.url;
};

module.exports.setTheUsername = function (url, username) {
  url.username = "";
  const decoded = punycode.ucs2.decode(username);
  for (let i = 0; i < decoded.length; ++i) {
    url.username += percentEncodeChar(decoded[i], isUserinfoPercentEncode);
  }
};

module.exports.setThePassword = function (url, password) {
  url.password = "";
  const decoded = punycode.ucs2.decode(password);
  for (let i = 0; i < decoded.length; ++i) {
    url.password += percentEncodeChar(decoded[i], isUserinfoPercentEncode);
  }
};

module.exports.serializeHost = serializeHost;

module.exports.cannotHaveAUsernamePasswordPort = cannotHaveAUsernamePasswordPort;

module.exports.serializeInteger = function (integer) {
  return String(integer);
};

module.exports.parseURL = function (input, options) {
  if (options === undefined) {
    options = {};
  }

  // We don't handle blobs, so this just delegates:
  return module.exports.basicURLParse(input, { baseURL: options.baseURL, encodingOverride: options.encodingOverride });
};
"use strict";

module.exports.mixin = function mixin(target, source) {
  const keys = Object.getOwnPropertyNames(source);
  for (let i = 0; i < keys.length; ++i) {
    Object.defineProperty(target, keys[i], Object.getOwnPropertyDescriptor(source, keys[i]));
  }
};

module.exports.wrapperSymbol = Symbol("wrapper");
module.exports.implSymbol = Symbol("impl");

module.exports.wrapperForImpl = function (impl) {
  return impl[module.exports.wrapperSymbol];
};

module.exports.implForWrapper = function (wrapper) {
  return wrapper[module.exports.implSymbol];
};

Copyright (c) 2011:
Tim Koschützki (tim@debuggable.com)
Felix Geisendörfer (felix@debuggable.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.
SHELL := /bin/bash

release-major: test
	npm version major -m "Release %s"
	git push
	npm publish

release-minor: test
	npm version minor -m "Release %s"
	git push
	npm publish

release-patch: test
	npm version patch -m "Release %s"
	git push
	npm publish

.PHONY: test release-major release-minor release-patch
GIF89a 1            $ )()),)1011419899<9A@AADAJHJJLJRPRRURZYZZ]Zbabbebjijjmjsqssus{y{{}{,     1  pH,Ȥrl:ШtJZجxˀ(xL.gan<51zD/w<
5[:,R6C3 o &H>1 -%>8I7v24Jš! Hڄ<l 	֋7H:D<*E DL/"5=Vp zczC!A%PbB	~trLBT`6EO|Q#(E
t' F8QȂB\,p
TQ.0cC+M7Ʋ!("yX"f0%ֺ֪Wj䁀4L
@ <FXCB|PmJX#4LTQDB.-ǷvDMč#/.8!+0سk7 L:ჴx&x0a8s:. o͗+6 "M9G_P7;@G`mD7S;s\(y&&G(Cn2͘n?h G0
Co #DI$-yc4
),@-a:5fE  E*ݛ="eC	;$ ̱|qg{`٨A &	 AH
jj>`_maAB)
gP髆)krQC &L`0 08@ٴ^+3 ly<`+qLB>h ɭCKE8fKľ|@AW,E{DwDD&,(у\2	 t<́w5l1b4,B'L7PGD/I2Iphl,$q&,50 >M-(*Doǽ7*\y%cPdYկY^3ngD ;module.exports = require('./lib/retry');{
  "author": "Tim Koschützki <tim@debuggable.com> (http://debuggable.com/)",
  "name": "retry",
  "description": "Abstraction for exponential and custom retry strategies for failed operations.",
  "license": "MIT",
  "version": "0.12.0",
  "homepage": "https://github.com/tim-kos/node-retry",
  "repository": {
    "type": "git",
    "url": "git://github.com/tim-kos/node-retry.git"
  },
  "directories": {
    "lib": "./lib"
  },
  "main": "index",
  "engines": {
    "node": ">= 4"
  },
  "dependencies": {},
  "devDependencies": {
    "fake": "0.2.0",
    "istanbul": "^0.4.5",
    "tape": "^4.8.0"
  }
}var RetryOperation = require('./retry_operation');

exports.operation = function(options) {
  var timeouts = exports.timeouts(options);
  return new RetryOperation(timeouts, {
      forever: options && options.forever,
      unref: options && options.unref,
      maxRetryTime: options && options.maxRetryTime
  });
};

exports.timeouts = function(options) {
  if (options instanceof Array) {
    return [].concat(options);
  }

  var opts = {
    retries: 10,
    factor: 2,
    minTimeout: 1 * 1000,
    maxTimeout: Infinity,
    randomize: false
  };
  for (var key in options) {
    opts[key] = options[key];
  }

  if (opts.minTimeout > opts.maxTimeout) {
    throw new Error('minTimeout is greater than maxTimeout');
  }

  var timeouts = [];
  for (var i = 0; i < opts.retries; i++) {
    timeouts.push(this.createTimeout(i, opts));
  }

  if (options && options.forever && !timeouts.length) {
    timeouts.push(this.createTimeout(i, opts));
  }

  // sort the array numerically ascending
  timeouts.sort(function(a,b) {
    return a - b;
  });

  return timeouts;
};

exports.createTimeout = function(attempt, opts) {
  var random = (opts.randomize)
    ? (Math.random() + 1)
    : 1;

  var timeout = Math.round(random * opts.minTimeout * Math.pow(opts.factor, attempt));
  timeout = Math.min(timeout, opts.maxTimeout);

  return timeout;
};

exports.wrap = function(obj, options, methods) {
  if (options instanceof Array) {
    methods = options;
    options = null;
  }

  if (!methods) {
    methods = [];
    for (var key in obj) {
      if (typeof obj[key] === 'function') {
        methods.push(key);
      }
    }
  }

  for (var i = 0; i < methods.length; i++) {
    var method   = methods[i];
    var original = obj[method];

    obj[method] = function retryWrapper(original) {
      var op       = exports.operation(options);
      var args     = Array.prototype.slice.call(arguments, 1);
      var callback = args.pop();

      args.push(function(err) {
        if (op.retry(err)) {
          return;
        }
        if (err) {
          arguments[0] = op.mainError();
        }
        callback.apply(this, arguments);
      });

      op.attempt(function() {
        original.apply(obj, args);
      });
    }.bind(obj, original);
    obj[method].options = options;
  }
};
function RetryOperation(timeouts, options) {
  // Compatibility for the old (timeouts, retryForever) signature
  if (typeof options === 'boolean') {
    options = { forever: options };
  }

  this._originalTimeouts = JSON.parse(JSON.stringify(timeouts));
  this._timeouts = timeouts;
  this._options = options || {};
  this._maxRetryTime = options && options.maxRetryTime || Infinity;
  this._fn = null;
  this._errors = [];
  this._attempts = 1;
  this._operationTimeout = null;
  this._operationTimeoutCb = null;
  this._timeout = null;
  this._operationStart = null;

  if (this._options.forever) {
    this._cachedTimeouts = this._timeouts.slice(0);
  }
}
module.exports = RetryOperation;

RetryOperation.prototype.reset = function() {
  this._attempts = 1;
  this._timeouts = this._originalTimeouts;
}

RetryOperation.prototype.stop = function() {
  if (this._timeout) {
    clearTimeout(this._timeout);
  }

  this._timeouts       = [];
  this._cachedTimeouts = null;
};

RetryOperation.prototype.retry = function(err) {
  if (this._timeout) {
    clearTimeout(this._timeout);
  }

  if (!err) {
    return false;
  }
  var currentTime = new Date().getTime();
  if (err && currentTime - this._operationStart >= this._maxRetryTime) {
    this._errors.unshift(new Error('RetryOperation timeout occurred'));
    return false;
  }

  this._errors.push(err);

  var timeout = this._timeouts.shift();
  if (timeout === undefined) {
    if (this._cachedTimeouts) {
      // retry forever, only keep last error
      this._errors.splice(this._errors.length - 1, this._errors.length);
      this._timeouts = this._cachedTimeouts.slice(0);
      timeout = this._timeouts.shift();
    } else {
      return false;
    }
  }

  var self = this;
  var timer = setTimeout(function() {
    self._attempts++;

    if (self._operationTimeoutCb) {
      self._timeout = setTimeout(function() {
        self._operationTimeoutCb(self._attempts);
      }, self._operationTimeout);

      if (self._options.unref) {
          self._timeout.unref();
      }
    }

    self._fn(self._attempts);
  }, timeout);

  if (this._options.unref) {
      timer.unref();
  }

  return true;
};

RetryOperation.prototype.attempt = function(fn, timeoutOps) {
  this._fn = fn;

  if (timeoutOps) {
    if (timeoutOps.timeout) {
      this._operationTimeout = timeoutOps.timeout;
    }
    if (timeoutOps.cb) {
      this._operationTimeoutCb = timeoutOps.cb;
    }
  }

  var self = this;
  if (this._operationTimeoutCb) {
    this._timeout = setTimeout(function() {
      self._operationTimeoutCb();
    }, self._operationTimeout);
  }

  this._operationStart = new Date().getTime();

  this._fn(this._attempts);
};

RetryOperation.prototype.try = function(fn) {
  console.log('Using RetryOperation.try() is deprecated');
  this.attempt(fn);
};

RetryOperation.prototype.start = function(fn) {
  console.log('Using RetryOperation.start() is deprecated');
  this.attempt(fn);
};

RetryOperation.prototype.start = RetryOperation.prototype.try;

RetryOperation.prototype.errors = function() {
  return this._errors;
};

RetryOperation.prototype.attempts = function() {
  return this._attempts;
};

RetryOperation.prototype.mainError = function() {
  if (this._errors.length === 0) {
    return null;
  }

  var counts = {};
  var mainError = null;
  var mainErrorCount = 0;

  for (var i = 0; i < this._errors.length; i++) {
    var error = this._errors[i];
    var message = error.message;
    var count = (counts[message] || 0) + 1;

    counts[message] = count;

    if (count >= mainErrorCount) {
      mainError = error;
      mainErrorCount = count;
    }
  }

  return mainError;
};
Copyright (C) 2011-2017 whitequark <whitequark@whitequark.org>

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.
(function(){var r,t,n,e,i,o,a,s;t={},s=this,"undefined"!=typeof module&&null!==module&&module.exports?module.exports=t:s.ipaddr=t,a=function(r,t,n,e){var i,o;if(r.length!==t.length)throw new Error("ipaddr: cannot match CIDR for objects with different lengths");for(i=0;e>0;){if((o=n-e)<0&&(o=0),r[i]>>o!=t[i]>>o)return!1;e-=n,i+=1}return!0},t.subnetMatch=function(r,t,n){var e,i,o,a,s;null==n&&(n="unicast");for(o in t)for(!(a=t[o])[0]||a[0]instanceof Array||(a=[a]),e=0,i=a.length;e<i;e++)if(s=a[e],r.kind()===s[0].kind()&&r.match.apply(r,s))return o;return n},t.IPv4=function(){function r(r){var t,n,e;if(4!==r.length)throw new Error("ipaddr: ipv4 octet count should be 4");for(t=0,n=r.length;t<n;t++)if(!(0<=(e=r[t])&&e<=255))throw new Error("ipaddr: ipv4 octet should fit in 8 bits");this.octets=r}return r.prototype.kind=function(){return"ipv4"},r.prototype.toString=function(){return this.octets.join(".")},r.prototype.toNormalizedString=function(){return this.toString()},r.prototype.toByteArray=function(){return this.octets.slice(0)},r.prototype.match=function(r,t){var n;if(void 0===t&&(r=(n=r)[0],t=n[1]),"ipv4"!==r.kind())throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one");return a(this.octets,r.octets,8,t)},r.prototype.SpecialRanges={unspecified:[[new r([0,0,0,0]),8]],broadcast:[[new r([255,255,255,255]),32]],multicast:[[new r([224,0,0,0]),4]],linkLocal:[[new r([169,254,0,0]),16]],loopback:[[new r([127,0,0,0]),8]],carrierGradeNat:[[new r([100,64,0,0]),10]],private:[[new r([10,0,0,0]),8],[new r([172,16,0,0]),12],[new r([192,168,0,0]),16]],reserved:[[new r([192,0,0,0]),24],[new r([192,0,2,0]),24],[new r([192,88,99,0]),24],[new r([198,51,100,0]),24],[new r([203,0,113,0]),24],[new r([240,0,0,0]),4]]},r.prototype.range=function(){return t.subnetMatch(this,this.SpecialRanges)},r.prototype.toIPv4MappedAddress=function(){return t.IPv6.parse("::ffff:"+this.toString())},r.prototype.prefixLengthFromSubnetMask=function(){var r,t,n,e,i,o,a;for(a={0:8,128:7,192:6,224:5,240:4,248:3,252:2,254:1,255:0},r=0,i=!1,t=n=3;n>=0;t=n+=-1){if(!((e=this.octets[t])in a))return null;if(o=a[e],i&&0!==o)return null;8!==o&&(i=!0),r+=o}return 32-r},r}(),n="(0?\\d+|0x[a-f0-9]+)",e={fourOctet:new RegExp("^"+n+"\\."+n+"\\."+n+"\\."+n+"$","i"),longValue:new RegExp("^"+n+"$","i")},t.IPv4.parser=function(r){var t,n,i,o,a;if(n=function(r){return"0"===r[0]&&"x"!==r[1]?parseInt(r,8):parseInt(r)},t=r.match(e.fourOctet))return function(){var r,e,o,a;for(a=[],r=0,e=(o=t.slice(1,6)).length;r<e;r++)i=o[r],a.push(n(i));return a}();if(t=r.match(e.longValue)){if((a=n(t[1]))>4294967295||a<0)throw new Error("ipaddr: address outside defined range");return function(){var r,t;for(t=[],o=r=0;r<=24;o=r+=8)t.push(a>>o&255);return t}().reverse()}return null},t.IPv6=function(){function r(r,t){var n,e,i,o,a,s;if(16===r.length)for(this.parts=[],n=e=0;e<=14;n=e+=2)this.parts.push(r[n]<<8|r[n+1]);else{if(8!==r.length)throw new Error("ipaddr: ipv6 part count should be 8 or 16");this.parts=r}for(i=0,o=(s=this.parts).length;i<o;i++)if(!(0<=(a=s[i])&&a<=65535))throw new Error("ipaddr: ipv6 part should fit in 16 bits");t&&(this.zoneId=t)}return r.prototype.kind=function(){return"ipv6"},r.prototype.toString=function(){return this.toNormalizedString().replace(/((^|:)(0(:|$))+)/,"::")},r.prototype.toRFC5952String=function(){var r,t,n,e,i;for(e=/((^|:)(0(:|$)){2,})/g,i=this.toNormalizedString(),r=0,t=-1;n=e.exec(i);)n[0].length>t&&(r=n.index,t=n[0].length);return t<0?i:i.substring(0,r)+"::"+i.substring(r+t)},r.prototype.toByteArray=function(){var r,t,n,e,i;for(r=[],t=0,n=(i=this.parts).length;t<n;t++)e=i[t],r.push(e>>8),r.push(255&e);return r},r.prototype.toNormalizedString=function(){var r,t,n;return r=function(){var r,n,e,i;for(i=[],r=0,n=(e=this.parts).length;r<n;r++)t=e[r],i.push(t.toString(16));return i}.call(this).join(":"),n="",this.zoneId&&(n="%"+this.zoneId),r+n},r.prototype.toFixedLengthString=function(){var r,t,n;return r=function(){var r,n,e,i;for(i=[],r=0,n=(e=this.parts).length;r<n;r++)t=e[r],i.push(t.toString(16).padStart(4,"0"));return i}.call(this).join(":"),n="",this.zoneId&&(n="%"+this.zoneId),r+n},r.prototype.match=function(r,t){var n;if(void 0===t&&(r=(n=r)[0],t=n[1]),"ipv6"!==r.kind())throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one");return a(this.parts,r.parts,16,t)},r.prototype.SpecialRanges={unspecified:[new r([0,0,0,0,0,0,0,0]),128],linkLocal:[new r([65152,0,0,0,0,0,0,0]),10],multicast:[new r([65280,0,0,0,0,0,0,0]),8],loopback:[new r([0,0,0,0,0,0,0,1]),128],uniqueLocal:[new r([64512,0,0,0,0,0,0,0]),7],ipv4Mapped:[new r([0,0,0,0,0,65535,0,0]),96],rfc6145:[new r([0,0,0,0,65535,0,0,0]),96],rfc6052:[new r([100,65435,0,0,0,0,0,0]),96],"6to4":[new r([8194,0,0,0,0,0,0,0]),16],teredo:[new r([8193,0,0,0,0,0,0,0]),32],reserved:[[new r([8193,3512,0,0,0,0,0,0]),32]]},r.prototype.range=function(){return t.subnetMatch(this,this.SpecialRanges)},r.prototype.isIPv4MappedAddress=function(){return"ipv4Mapped"===this.range()},r.prototype.toIPv4Address=function(){var r,n,e;if(!this.isIPv4MappedAddress())throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4");return e=this.parts.slice(-2),r=e[0],n=e[1],new t.IPv4([r>>8,255&r,n>>8,255&n])},r.prototype.prefixLengthFromSubnetMask=function(){var r,t,n,e,i,o,a;for(a={0:16,32768:15,49152:14,57344:13,61440:12,63488:11,64512:10,65024:9,65280:8,65408:7,65472:6,65504:5,65520:4,65528:3,65532:2,65534:1,65535:0},r=0,i=!1,t=n=7;n>=0;t=n+=-1){if(!((e=this.parts[t])in a))return null;if(o=a[e],i&&0!==o)return null;16!==o&&(i=!0),r+=o}return 128-r},r}(),i="(?:[0-9a-f]+::?)+",o={zoneIndex:new RegExp("%[0-9a-z]{1,}","i"),native:new RegExp("^(::)?("+i+")?([0-9a-f]+)?(::)?(%[0-9a-z]{1,})?$","i"),transitional:new RegExp("^((?:"+i+")|(?:::)(?:"+i+")?)"+n+"\\."+n+"\\."+n+"\\."+n+"(%[0-9a-z]{1,})?$","i")},r=function(r,t){var n,e,i,a,s,p;if(r.indexOf("::")!==r.lastIndexOf("::"))return null;for((p=(r.match(o.zoneIndex)||[])[0])&&(p=p.substring(1),r=r.replace(/%.+$/,"")),n=0,e=-1;(e=r.indexOf(":",e+1))>=0;)n++;if("::"===r.substr(0,2)&&n--,"::"===r.substr(-2,2)&&n--,n>t)return null;for(s=t-n,a=":";s--;)a+="0:";return":"===(r=r.replace("::",a))[0]&&(r=r.slice(1)),":"===r[r.length-1]&&(r=r.slice(0,-1)),t=function(){var t,n,e,o;for(o=[],t=0,n=(e=r.split(":")).length;t<n;t++)i=e[t],o.push(parseInt(i,16));return o}(),{parts:t,zoneId:p}},t.IPv6.parser=function(t){var n,e,i,a,s,p,u;if(o.native.test(t))return r(t,8);if((a=t.match(o.transitional))&&(u=a[6]||"",(n=r(a[1].slice(0,-1)+u,6)).parts)){for(e=0,i=(p=[parseInt(a[2]),parseInt(a[3]),parseInt(a[4]),parseInt(a[5])]).length;e<i;e++)if(!(0<=(s=p[e])&&s<=255))return null;return n.parts.push(p[0]<<8|p[1]),n.parts.push(p[2]<<8|p[3]),{parts:n.parts,zoneId:n.zoneId}}return null},t.IPv4.isIPv4=t.IPv6.isIPv6=function(r){return null!==this.parser(r)},t.IPv4.isValid=function(r){try{return new this(this.parser(r)),!0}catch(r){return r,!1}},t.IPv4.isValidFourPartDecimal=function(r){return!(!t.IPv4.isValid(r)||!r.match(/^(0|[1-9]\d*)(\.(0|[1-9]\d*)){3}$/))},t.IPv6.isValid=function(r){var t;if("string"==typeof r&&-1===r.indexOf(":"))return!1;try{return t=this.parser(r),new this(t.parts,t.zoneId),!0}catch(r){return r,!1}},t.IPv4.parse=function(r){var t;if(null===(t=this.parser(r)))throw new Error("ipaddr: string is not formatted like ip address");return new this(t)},t.IPv6.parse=function(r){var t;if(null===(t=this.parser(r)).parts)throw new Error("ipaddr: string is not formatted like ip address");return new this(t.parts,t.zoneId)},t.IPv4.parseCIDR=function(r){var t,n,e;if((n=r.match(/^(.+)\/(\d+)$/))&&(t=parseInt(n[2]))>=0&&t<=32)return e=[this.parse(n[1]),t],Object.defineProperty(e,"toString",{value:function(){return this.join("/")}}),e;throw new Error("ipaddr: string is not formatted like an IPv4 CIDR range")},t.IPv4.subnetMaskFromPrefixLength=function(r){var t,n,e;if((r=parseInt(r))<0||r>32)throw new Error("ipaddr: invalid IPv4 prefix length");for(e=[0,0,0,0],n=0,t=Math.floor(r/8);n<t;)e[n]=255,n++;return t<4&&(e[t]=Math.pow(2,r%8)-1<<8-r%8),new this(e)},t.IPv4.broadcastAddressFromCIDR=function(r){var t,n,e,i,o;try{for(e=(t=this.parseCIDR(r))[0].toByteArray(),o=this.subnetMaskFromPrefixLength(t[1]).toByteArray(),i=[],n=0;n<4;)i.push(parseInt(e[n],10)|255^parseInt(o[n],10)),n++;return new this(i)}catch(r){throw r,new Error("ipaddr: the address does not have IPv4 CIDR format")}},t.IPv4.networkAddressFromCIDR=function(r){var t,n,e,i,o;try{for(e=(t=this.parseCIDR(r))[0].toByteArray(),o=this.subnetMaskFromPrefixLength(t[1]).toByteArray(),i=[],n=0;n<4;)i.push(parseInt(e[n],10)&parseInt(o[n],10)),n++;return new this(i)}catch(r){throw r,new Error("ipaddr: the address does not have IPv4 CIDR format")}},t.IPv6.parseCIDR=function(r){var t,n,e;if((n=r.match(/^(.+)\/(\d+)$/))&&(t=parseInt(n[2]))>=0&&t<=128)return e=[this.parse(n[1]),t],Object.defineProperty(e,"toString",{value:function(){return this.join("/")}}),e;throw new Error("ipaddr: string is not formatted like an IPv6 CIDR range")},t.isValid=function(r){return t.IPv6.isValid(r)||t.IPv4.isValid(r)},t.parse=function(r){if(t.IPv6.isValid(r))return t.IPv6.parse(r);if(t.IPv4.isValid(r))return t.IPv4.parse(r);throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format")},t.parseCIDR=function(r){try{return t.IPv6.parseCIDR(r)}catch(n){n;try{return t.IPv4.parseCIDR(r)}catch(r){throw r,new Error("ipaddr: the address has neither IPv6 nor IPv4 CIDR format")}}},t.fromByteArray=function(r){var n;if(4===(n=r.length))return new t.IPv4(r);if(16===n)return new t.IPv6(r);throw new Error("ipaddr: the binary input is neither an IPv6 nor IPv4 address")},t.process=function(r){var t;return t=this.parse(r),"ipv6"===t.kind()&&t.isIPv4MappedAddress()?t.toIPv4Address():t}}).call(this);{
  "name": "ipaddr.js",
  "description": "A library for manipulating IPv4 and IPv6 addresses in JavaScript.",
  "version": "1.9.1",
  "author": "whitequark <whitequark@whitequark.org>",
  "directories": {
    "lib": "./lib"
  },
  "dependencies": {},
  "devDependencies": {
    "coffee-script": "~1.12.6",
    "nodeunit": "^0.11.3",
    "uglify-js": "~3.0.19"
  },
  "files": [
    "lib/",
    "LICENSE",
    "ipaddr.min.js"
  ],
  "repository": "git://github.com/whitequark/ipaddr.js",
  "main": "./lib/ipaddr.js",
  "engines": {
    "node": ">= 0.10"
  },
  "license": "MIT",
  "types": "./lib/ipaddr.js.d.ts"
}(function() {
  var expandIPv6, ipaddr, ipv4Part, ipv4Regexes, ipv6Part, ipv6Regexes, matchCIDR, root, zoneIndex;

  ipaddr = {};

  root = this;

  if ((typeof module !== "undefined" && module !== null) && module.exports) {
    module.exports = ipaddr;
  } else {
    root['ipaddr'] = ipaddr;
  }

  matchCIDR = function(first, second, partSize, cidrBits) {
    var part, shift;
    if (first.length !== second.length) {
      throw new Error("ipaddr: cannot match CIDR for objects with different lengths");
    }
    part = 0;
    while (cidrBits > 0) {
      shift = partSize - cidrBits;
      if (shift < 0) {
        shift = 0;
      }
      if (first[part] >> shift !== second[part] >> shift) {
        return false;
      }
      cidrBits -= partSize;
      part += 1;
    }
    return true;
  };

  ipaddr.subnetMatch = function(address, rangeList, defaultName) {
    var k, len, rangeName, rangeSubnets, subnet;
    if (defaultName == null) {
      defaultName = 'unicast';
    }
    for (rangeName in rangeList) {
      rangeSubnets = rangeList[rangeName];
      if (rangeSubnets[0] && !(rangeSubnets[0] instanceof Array)) {
        rangeSubnets = [rangeSubnets];
      }
      for (k = 0, len = rangeSubnets.length; k < len; k++) {
        subnet = rangeSubnets[k];
        if (address.kind() === subnet[0].kind()) {
          if (address.match.apply(address, subnet)) {
            return rangeName;
          }
        }
      }
    }
    return defaultName;
  };

  ipaddr.IPv4 = (function() {
    function IPv4(octets) {
      var k, len, octet;
      if (octets.length !== 4) {
        throw new Error("ipaddr: ipv4 octet count should be 4");
      }
      for (k = 0, len = octets.length; k < len; k++) {
        octet = octets[k];
        if (!((0 <= octet && octet <= 255))) {
          throw new Error("ipaddr: ipv4 octet should fit in 8 bits");
        }
      }
      this.octets = octets;
    }

    IPv4.prototype.kind = function() {
      return 'ipv4';
    };

    IPv4.prototype.toString = function() {
      return this.octets.join(".");
    };

    IPv4.prototype.toNormalizedString = function() {
      return this.toString();
    };

    IPv4.prototype.toByteArray = function() {
      return this.octets.slice(0);
    };

    IPv4.prototype.match = function(other, cidrRange) {
      var ref;
      if (cidrRange === void 0) {
        ref = other, other = ref[0], cidrRange = ref[1];
      }
      if (other.kind() !== 'ipv4') {
        throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one");
      }
      return matchCIDR(this.octets, other.octets, 8, cidrRange);
    };

    IPv4.prototype.SpecialRanges = {
      unspecified: [[new IPv4([0, 0, 0, 0]), 8]],
      broadcast: [[new IPv4([255, 255, 255, 255]), 32]],
      multicast: [[new IPv4([224, 0, 0, 0]), 4]],
      linkLocal: [[new IPv4([169, 254, 0, 0]), 16]],
      loopback: [[new IPv4([127, 0, 0, 0]), 8]],
      carrierGradeNat: [[new IPv4([100, 64, 0, 0]), 10]],
      "private": [[new IPv4([10, 0, 0, 0]), 8], [new IPv4([172, 16, 0, 0]), 12], [new IPv4([192, 168, 0, 0]), 16]],
      reserved: [[new IPv4([192, 0, 0, 0]), 24], [new IPv4([192, 0, 2, 0]), 24], [new IPv4([192, 88, 99, 0]), 24], [new IPv4([198, 51, 100, 0]), 24], [new IPv4([203, 0, 113, 0]), 24], [new IPv4([240, 0, 0, 0]), 4]]
    };

    IPv4.prototype.range = function() {
      return ipaddr.subnetMatch(this, this.SpecialRanges);
    };

    IPv4.prototype.toIPv4MappedAddress = function() {
      return ipaddr.IPv6.parse("::ffff:" + (this.toString()));
    };

    IPv4.prototype.prefixLengthFromSubnetMask = function() {
      var cidr, i, k, octet, stop, zeros, zerotable;
      zerotable = {
        0: 8,
        128: 7,
        192: 6,
        224: 5,
        240: 4,
        248: 3,
        252: 2,
        254: 1,
        255: 0
      };
      cidr = 0;
      stop = false;
      for (i = k = 3; k >= 0; i = k += -1) {
        octet = this.octets[i];
        if (octet in zerotable) {
          zeros = zerotable[octet];
          if (stop && zeros !== 0) {
            return null;
          }
          if (zeros !== 8) {
            stop = true;
          }
          cidr += zeros;
        } else {
          return null;
        }
      }
      return 32 - cidr;
    };

    return IPv4;

  })();

  ipv4Part = "(0?\\d+|0x[a-f0-9]+)";

  ipv4Regexes = {
    fourOctet: new RegExp("^" + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "$", 'i'),
    longValue: new RegExp("^" + ipv4Part + "$", 'i')
  };

  ipaddr.IPv4.parser = function(string) {
    var match, parseIntAuto, part, shift, value;
    parseIntAuto = function(string) {
      if (string[0] === "0" && string[1] !== "x") {
        return parseInt(string, 8);
      } else {
        return parseInt(string);
      }
    };
    if (match = string.match(ipv4Regexes.fourOctet)) {
      return (function() {
        var k, len, ref, results;
        ref = match.slice(1, 6);
        results = [];
        for (k = 0, len = ref.length; k < len; k++) {
          part = ref[k];
          results.push(parseIntAuto(part));
        }
        return results;
      })();
    } else if (match = string.match(ipv4Regexes.longValue)) {
      value = parseIntAuto(match[1]);
      if (value > 0xffffffff || value < 0) {
        throw new Error("ipaddr: address outside defined range");
      }
      return ((function() {
        var k, results;
        results = [];
        for (shift = k = 0; k <= 24; shift = k += 8) {
          results.push((value >> shift) & 0xff);
        }
        return results;
      })()).reverse();
    } else {
      return null;
    }
  };

  ipaddr.IPv6 = (function() {
    function IPv6(parts, zoneId) {
      var i, k, l, len, part, ref;
      if (parts.length === 16) {
        this.parts = [];
        for (i = k = 0; k <= 14; i = k += 2) {
          this.parts.push((parts[i] << 8) | parts[i + 1]);
        }
      } else if (parts.length === 8) {
        this.parts = parts;
      } else {
        throw new Error("ipaddr: ipv6 part count should be 8 or 16");
      }
      ref = this.parts;
      for (l = 0, len = ref.length; l < len; l++) {
        part = ref[l];
        if (!((0 <= part && part <= 0xffff))) {
          throw new Error("ipaddr: ipv6 part should fit in 16 bits");
        }
      }
      if (zoneId) {
        this.zoneId = zoneId;
      }
    }

    IPv6.prototype.kind = function() {
      return 'ipv6';
    };

    IPv6.prototype.toString = function() {
      return this.toNormalizedString().replace(/((^|:)(0(:|$))+)/, '::');
    };

    IPv6.prototype.toRFC5952String = function() {
      var bestMatchIndex, bestMatchLength, match, regex, string;
      regex = /((^|:)(0(:|$)){2,})/g;
      string = this.toNormalizedString();
      bestMatchIndex = 0;
      bestMatchLength = -1;
      while ((match = regex.exec(string))) {
        if (match[0].length > bestMatchLength) {
          bestMatchIndex = match.index;
          bestMatchLength = match[0].length;
        }
      }
      if (bestMatchLength < 0) {
        return string;
      }
      return string.substring(0, bestMatchIndex) + '::' + string.substring(bestMatchIndex + bestMatchLength);
    };

    IPv6.prototype.toByteArray = function() {
      var bytes, k, len, part, ref;
      bytes = [];
      ref = this.parts;
      for (k = 0, len = ref.length; k < len; k++) {
        part = ref[k];
        bytes.push(part >> 8);
        bytes.push(part & 0xff);
      }
      return bytes;
    };

    IPv6.prototype.toNormalizedString = function() {
      var addr, part, suffix;
      addr = ((function() {
        var k, len, ref, results;
        ref = this.parts;
        results = [];
        for (k = 0, len = ref.length; k < len; k++) {
          part = ref[k];
          results.push(part.toString(16));
        }
        return results;
      }).call(this)).join(":");
      suffix = '';
      if (this.zoneId) {
        suffix = '%' + this.zoneId;
      }
      return addr + suffix;
    };

    IPv6.prototype.toFixedLengthString = function() {
      var addr, part, suffix;
      addr = ((function() {
        var k, len, ref, results;
        ref = this.parts;
        results = [];
        for (k = 0, len = ref.length; k < len; k++) {
          part = ref[k];
          results.push(part.toString(16).padStart(4, '0'));
        }
        return results;
      }).call(this)).join(":");
      suffix = '';
      if (this.zoneId) {
        suffix = '%' + this.zoneId;
      }
      return addr + suffix;
    };

    IPv6.prototype.match = function(other, cidrRange) {
      var ref;
      if (cidrRange === void 0) {
        ref = other, other = ref[0], cidrRange = ref[1];
      }
      if (other.kind() !== 'ipv6') {
        throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one");
      }
      return matchCIDR(this.parts, other.parts, 16, cidrRange);
    };

    IPv6.prototype.SpecialRanges = {
      unspecified: [new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128],
      linkLocal: [new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10],
      multicast: [new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8],
      loopback: [new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128],
      uniqueLocal: [new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7],
      ipv4Mapped: [new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96],
      rfc6145: [new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96],
      rfc6052: [new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96],
      '6to4': [new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16],
      teredo: [new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32],
      reserved: [[new IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32]]
    };

    IPv6.prototype.range = function() {
      return ipaddr.subnetMatch(this, this.SpecialRanges);
    };

    IPv6.prototype.isIPv4MappedAddress = function() {
      return this.range() === 'ipv4Mapped';
    };

    IPv6.prototype.toIPv4Address = function() {
      var high, low, ref;
      if (!this.isIPv4MappedAddress()) {
        throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4");
      }
      ref = this.parts.slice(-2), high = ref[0], low = ref[1];
      return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]);
    };

    IPv6.prototype.prefixLengthFromSubnetMask = function() {
      var cidr, i, k, part, stop, zeros, zerotable;
      zerotable = {
        0: 16,
        32768: 15,
        49152: 14,
        57344: 13,
        61440: 12,
        63488: 11,
        64512: 10,
        65024: 9,
        65280: 8,
        65408: 7,
        65472: 6,
        65504: 5,
        65520: 4,
        65528: 3,
        65532: 2,
        65534: 1,
        65535: 0
      };
      cidr = 0;
      stop = false;
      for (i = k = 7; k >= 0; i = k += -1) {
        part = this.parts[i];
        if (part in zerotable) {
          zeros = zerotable[part];
          if (stop && zeros !== 0) {
            return null;
          }
          if (zeros !== 16) {
            stop = true;
          }
          cidr += zeros;
        } else {
          return null;
        }
      }
      return 128 - cidr;
    };

    return IPv6;

  })();

  ipv6Part = "(?:[0-9a-f]+::?)+";

  zoneIndex = "%[0-9a-z]{1,}";

  ipv6Regexes = {
    zoneIndex: new RegExp(zoneIndex, 'i'),
    "native": new RegExp("^(::)?(" + ipv6Part + ")?([0-9a-f]+)?(::)?(" + zoneIndex + ")?$", 'i'),
    transitional: new RegExp(("^((?:" + ipv6Part + ")|(?:::)(?:" + ipv6Part + ")?)") + (ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part) + ("(" + zoneIndex + ")?$"), 'i')
  };

  expandIPv6 = function(string, parts) {
    var colonCount, lastColon, part, replacement, replacementCount, zoneId;
    if (string.indexOf('::') !== string.lastIndexOf('::')) {
      return null;
    }
    zoneId = (string.match(ipv6Regexes['zoneIndex']) || [])[0];
    if (zoneId) {
      zoneId = zoneId.substring(1);
      string = string.replace(/%.+$/, '');
    }
    colonCount = 0;
    lastColon = -1;
    while ((lastColon = string.indexOf(':', lastColon + 1)) >= 0) {
      colonCount++;
    }
    if (string.substr(0, 2) === '::') {
      colonCount--;
    }
    if (string.substr(-2, 2) === '::') {
      colonCount--;
    }
    if (colonCount > parts) {
      return null;
    }
    replacementCount = parts - colonCount;
    replacement = ':';
    while (replacementCount--) {
      replacement += '0:';
    }
    string = string.replace('::', replacement);
    if (string[0] === ':') {
      string = string.slice(1);
    }
    if (string[string.length - 1] === ':') {
      string = string.slice(0, -1);
    }
    parts = (function() {
      var k, len, ref, results;
      ref = string.split(":");
      results = [];
      for (k = 0, len = ref.length; k < len; k++) {
        part = ref[k];
        results.push(parseInt(part, 16));
      }
      return results;
    })();
    return {
      parts: parts,
      zoneId: zoneId
    };
  };

  ipaddr.IPv6.parser = function(string) {
    var addr, k, len, match, octet, octets, zoneId;
    if (ipv6Regexes['native'].test(string)) {
      return expandIPv6(string, 8);
    } else if (match = string.match(ipv6Regexes['transitional'])) {
      zoneId = match[6] || '';
      addr = expandIPv6(match[1].slice(0, -1) + zoneId, 6);
      if (addr.parts) {
        octets = [parseInt(match[2]), parseInt(match[3]), parseInt(match[4]), parseInt(match[5])];
        for (k = 0, len = octets.length; k < len; k++) {
          octet = octets[k];
          if (!((0 <= octet && octet <= 255))) {
            return null;
          }
        }
        addr.parts.push(octets[0] << 8 | octets[1]);
        addr.parts.push(octets[2] << 8 | octets[3]);
        return {
          parts: addr.parts,
          zoneId: addr.zoneId
        };
      }
    }
    return null;
  };

  ipaddr.IPv4.isIPv4 = ipaddr.IPv6.isIPv6 = function(string) {
    return this.parser(string) !== null;
  };

  ipaddr.IPv4.isValid = function(string) {
    var e;
    try {
      new this(this.parser(string));
      return true;
    } catch (error1) {
      e = error1;
      return false;
    }
  };

  ipaddr.IPv4.isValidFourPartDecimal = function(string) {
    if (ipaddr.IPv4.isValid(string) && string.match(/^(0|[1-9]\d*)(\.(0|[1-9]\d*)){3}$/)) {
      return true;
    } else {
      return false;
    }
  };

  ipaddr.IPv6.isValid = function(string) {
    var addr, e;
    if (typeof string === "string" && string.indexOf(":") === -1) {
      return false;
    }
    try {
      addr = this.parser(string);
      new this(addr.parts, addr.zoneId);
      return true;
    } catch (error1) {
      e = error1;
      return false;
    }
  };

  ipaddr.IPv4.parse = function(string) {
    var parts;
    parts = this.parser(string);
    if (parts === null) {
      throw new Error("ipaddr: string is not formatted like ip address");
    }
    return new this(parts);
  };

  ipaddr.IPv6.parse = function(string) {
    var addr;
    addr = this.parser(string);
    if (addr.parts === null) {
      throw new Error("ipaddr: string is not formatted like ip address");
    }
    return new this(addr.parts, addr.zoneId);
  };

  ipaddr.IPv4.parseCIDR = function(string) {
    var maskLength, match, parsed;
    if (match = string.match(/^(.+)\/(\d+)$/)) {
      maskLength = parseInt(match[2]);
      if (maskLength >= 0 && maskLength <= 32) {
        parsed = [this.parse(match[1]), maskLength];
        Object.defineProperty(parsed, 'toString', {
          value: function() {
            return this.join('/');
          }
        });
        return parsed;
      }
    }
    throw new Error("ipaddr: string is not formatted like an IPv4 CIDR range");
  };

  ipaddr.IPv4.subnetMaskFromPrefixLength = function(prefix) {
    var filledOctetCount, j, octets;
    prefix = parseInt(prefix);
    if (prefix < 0 || prefix > 32) {
      throw new Error('ipaddr: invalid IPv4 prefix length');
    }
    octets = [0, 0, 0, 0];
    j = 0;
    filledOctetCount = Math.floor(prefix / 8);
    while (j < filledOctetCount) {
      octets[j] = 255;
      j++;
    }
    if (filledOctetCount < 4) {
      octets[filledOctetCount] = Math.pow(2, prefix % 8) - 1 << 8 - (prefix % 8);
    }
    return new this(octets);
  };

  ipaddr.IPv4.broadcastAddressFromCIDR = function(string) {
    var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets;
    try {
      cidr = this.parseCIDR(string);
      ipInterfaceOctets = cidr[0].toByteArray();
      subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();
      octets = [];
      i = 0;
      while (i < 4) {
        octets.push(parseInt(ipInterfaceOctets[i], 10) | parseInt(subnetMaskOctets[i], 10) ^ 255);
        i++;
      }
      return new this(octets);
    } catch (error1) {
      error = error1;
      throw new Error('ipaddr: the address does not have IPv4 CIDR format');
    }
  };

  ipaddr.IPv4.networkAddressFromCIDR = function(string) {
    var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets;
    try {
      cidr = this.parseCIDR(string);
      ipInterfaceOctets = cidr[0].toByteArray();
      subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();
      octets = [];
      i = 0;
      while (i < 4) {
        octets.push(parseInt(ipInterfaceOctets[i], 10) & parseInt(subnetMaskOctets[i], 10));
        i++;
      }
      return new this(octets);
    } catch (error1) {
      error = error1;
      throw new Error('ipaddr: the address does not have IPv4 CIDR format');
    }
  };

  ipaddr.IPv6.parseCIDR = function(string) {
    var maskLength, match, parsed;
    if (match = string.match(/^(.+)\/(\d+)$/)) {
      maskLength = parseInt(match[2]);
      if (maskLength >= 0 && maskLength <= 128) {
        parsed = [this.parse(match[1]), maskLength];
        Object.defineProperty(parsed, 'toString', {
          value: function() {
            return this.join('/');
          }
        });
        return parsed;
      }
    }
    throw new Error("ipaddr: string is not formatted like an IPv6 CIDR range");
  };

  ipaddr.isValid = function(string) {
    return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string);
  };

  ipaddr.parse = function(string) {
    if (ipaddr.IPv6.isValid(string)) {
      return ipaddr.IPv6.parse(string);
    } else if (ipaddr.IPv4.isValid(string)) {
      return ipaddr.IPv4.parse(string);
    } else {
      throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format");
    }
  };

  ipaddr.parseCIDR = function(string) {
    var e;
    try {
      return ipaddr.IPv6.parseCIDR(string);
    } catch (error1) {
      e = error1;
      try {
        return ipaddr.IPv4.parseCIDR(string);
      } catch (error1) {
        e = error1;
        throw new Error("ipaddr: the address has neither IPv6 nor IPv4 CIDR format");
      }
    }
  };

  ipaddr.fromByteArray = function(bytes) {
    var length;
    length = bytes.length;
    if (length === 4) {
      return new ipaddr.IPv4(bytes);
    } else if (length === 16) {
      return new ipaddr.IPv6(bytes);
    } else {
      throw new Error("ipaddr: the binary input is neither an IPv6 nor IPv4 address");
    }
  };

  ipaddr.process = function(string) {
    var addr;
    addr = this.parse(string);
    if (addr.kind() === 'ipv6' && addr.isIPv4MappedAddress()) {
      return addr.toIPv4Address();
    } else {
      return addr;
    }
  };

}).call(this);
3.1.2 / 2022-01-27
==================

  * Fix return value for un-parsable strings

3.1.1 / 2021-11-15
==================

  * Fix "thousandsSeparator" incorrecting formatting fractional part

3.1.0 / 2019-01-22
==================

  * Add petabyte (`pb`) support

3.0.0 / 2017-08-31
==================

  * Change "kB" to "KB" in format output
  * Remove support for Node.js 0.6
  * Remove support for ComponentJS

2.5.0 / 2017-03-24
==================

  * Add option "unit"

2.4.0 / 2016-06-01
==================

  * Add option "unitSeparator"

2.3.0 / 2016-02-15
==================

  * Drop partial bytes on all parsed units
  * Fix non-finite numbers to `.format` to return `null`
  * Fix parsing byte string that looks like hex
  * perf: hoist regular expressions

2.2.0 / 2015-11-13
==================

  * add option "decimalPlaces"
  * add option "fixedDecimals"

2.1.0 / 2015-05-21
==================

  * add `.format` export
  * add `.parse` export

2.0.2 / 2015-05-20
==================

  * remove map recreation
  * remove unnecessary object construction

2.0.1 / 2015-05-07
==================

  * fix browserify require
  * remove node.extend dependency

2.0.0 / 2015-04-12
==================

  * add option "case"
  * add option "thousandsSeparator"
  * return "null" on invalid parse input
  * support proper round-trip: bytes(bytes(num)) === num
  * units no longer case sensitive when parsing

1.0.0 / 2014-05-05
==================

 * add negative support. fixes #6

0.3.0 / 2014-03-19
==================

 * added terabyte support

0.2.1 / 2013-04-01
==================

  * add .component

0.2.0 / 2012-10-28
==================

  * bytes(200).should.eql('200b')

0.1.0 / 2012-07-04
==================

  * add bytes to string conversion [yields]
(The MIT License)

Copyright (c) 2012-2014 TJ Holowaychuk <tj@vision-media.ca>
Copyright (c) 2015 Jed Watson <jed.watson@me.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.
/*!
 * bytes
 * Copyright(c) 2012-2014 TJ Holowaychuk
 * Copyright(c) 2015 Jed Watson
 * MIT Licensed
 */

'use strict';

/**
 * Module exports.
 * @public
 */

module.exports = bytes;
module.exports.format = format;
module.exports.parse = parse;

/**
 * Module variables.
 * @private
 */

var formatThousandsRegExp = /\B(?=(\d{3})+(?!\d))/g;

var formatDecimalsRegExp = /(?:\.0*|(\.[^0]+)0+)$/;

var map = {
  b:  1,
  kb: 1 << 10,
  mb: 1 << 20,
  gb: 1 << 30,
  tb: Math.pow(1024, 4),
  pb: Math.pow(1024, 5),
};

var parseRegExp = /^((-|\+)?(\d+(?:\.\d+)?)) *(kb|mb|gb|tb|pb)$/i;

/**
 * Convert the given value in bytes into a string or parse to string to an integer in bytes.
 *
 * @param {string|number} value
 * @param {{
 *  case: [string],
 *  decimalPlaces: [number]
 *  fixedDecimals: [boolean]
 *  thousandsSeparator: [string]
 *  unitSeparator: [string]
 *  }} [options] bytes options.
 *
 * @returns {string|number|null}
 */

function bytes(value, options) {
  if (typeof value === 'string') {
    return parse(value);
  }

  if (typeof value === 'number') {
    return format(value, options);
  }

  return null;
}

/**
 * Format the given value in bytes into a string.
 *
 * If the value is negative, it is kept as such. If it is a float,
 * it is rounded.
 *
 * @param {number} value
 * @param {object} [options]
 * @param {number} [options.decimalPlaces=2]
 * @param {number} [options.fixedDecimals=false]
 * @param {string} [options.thousandsSeparator=]
 * @param {string} [options.unit=]
 * @param {string} [options.unitSeparator=]
 *
 * @returns {string|null}
 * @public
 */

function format(value, options) {
  if (!Number.isFinite(value)) {
    return null;
  }

  var mag = Math.abs(value);
  var thousandsSeparator = (options && options.thousandsSeparator) || '';
  var unitSeparator = (options && options.unitSeparator) || '';
  var decimalPlaces = (options && options.decimalPlaces !== undefined) ? options.decimalPlaces : 2;
  var fixedDecimals = Boolean(options && options.fixedDecimals);
  var unit = (options && options.unit) || '';

  if (!unit || !map[unit.toLowerCase()]) {
    if (mag >= map.pb) {
      unit = 'PB';
    } else if (mag >= map.tb) {
      unit = 'TB';
    } else if (mag >= map.gb) {
      unit = 'GB';
    } else if (mag >= map.mb) {
      unit = 'MB';
    } else if (mag >= map.kb) {
      unit = 'KB';
    } else {
      unit = 'B';
    }
  }

  var val = value / map[unit.toLowerCase()];
  var str = val.toFixed(decimalPlaces);

  if (!fixedDecimals) {
    str = str.replace(formatDecimalsRegExp, '$1');
  }

  if (thousandsSeparator) {
    str = str.split('.').map(function (s, i) {
      return i === 0
        ? s.replace(formatThousandsRegExp, thousandsSeparator)
        : s
    }).join('.');
  }

  return str + unitSeparator + unit;
}

/**
 * Parse the string value into an integer in bytes.
 *
 * If no unit is given, it is assumed the value is in bytes.
 *
 * @param {number|string} val
 *
 * @returns {number|null}
 * @public
 */

function parse(val) {
  if (typeof val === 'number' && !isNaN(val)) {
    return val;
  }

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

  // Test if the string passed is valid
  var results = parseRegExp.exec(val);
  var floatValue;
  var unit = 'b';

  if (!results) {
    // Nothing could be extracted from the given string
    floatValue = parseInt(val, 10);
    unit = 'b'
  } else {
    // Retrieve the value and the unit
    floatValue = parseFloat(results[1]);
    unit = results[4].toLowerCase();
  }

  if (isNaN(floatValue)) {
    return null;
  }

  return Math.floor(map[unit] * floatValue);
}
{
  "name": "bytes",
  "description": "Utility to parse a string bytes to bytes and vice-versa",
  "version": "3.1.2",
  "author": "TJ Holowaychuk <tj@vision-media.ca> (http://tjholowaychuk.com)",
  "license": "MIT",
  "repository": "visionmedia/bytes.js",
  "devDependencies": {
    "eslint": "7.32.0",
    "eslint-plugin-markdown": "2.2.1",
    "mocha": "9.2.0",
    "nyc": "15.1.0"
  },
  "files": [
    "History.md",
    "LICENSE",
    "Readme.md",
    "index.js"
  ],
  "engines": {
    "node": ">= 0.8"
  }
}Copyright (c) 2011 Alexander Shtuchkin

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": "iconv-lite",
  "description": "Convert character encodings in pure javascript.",
  "version": "0.4.24",
  "license": "MIT",
  "author": "Alexander Shtuchkin <ashtuchkin@gmail.com>",
  "main": "./lib/index.js",
  "typings": "./lib/index.d.ts",
  "homepage": "https://github.com/ashtuchkin/iconv-lite",
  "repository": {
    "type": "git",
    "url": "git://github.com/ashtuchkin/iconv-lite.git"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "browser": {
    "./lib/extend-node": false,
    "./lib/streams": false
  },
  "devDependencies": {
    "mocha": "^3.1.0",
    "request": "~2.87.0",
    "unorm": "*",
    "errto": "*",
    "async": "*",
    "istanbul": "*",
    "semver": "*",
    "iconv": "*"
  },
  "dependencies": {
    "safer-buffer": ">= 2.1.2 < 3"
  }
}"use strict";

var BOMChar = '\uFEFF';

exports.PrependBOM = PrependBOMWrapper
function PrependBOMWrapper(encoder, options) {
    this.encoder = encoder;
    this.addBOM = true;
}

PrependBOMWrapper.prototype.write = function(str) {
    if (this.addBOM) {
        str = BOMChar + str;
        this.addBOM = false;
    }

    return this.encoder.write(str);
}

PrependBOMWrapper.prototype.end = function() {
    return this.encoder.end();
}


//------------------------------------------------------------------------------

exports.StripBOM = StripBOMWrapper;
function StripBOMWrapper(decoder, options) {
    this.decoder = decoder;
    this.pass = false;
    this.options = options || {};
}

StripBOMWrapper.prototype.write = function(buf) {
    var res = this.decoder.write(buf);
    if (this.pass || !res)
        return res;

    if (res[0] === BOMChar) {
        res = res.slice(1);
        if (typeof this.options.stripBOM === 'function')
            this.options.stripBOM();
    }

    this.pass = true;
    return res;
}

StripBOMWrapper.prototype.end = function() {
    return this.decoder.end();
}

"use strict";
var Buffer = require("buffer").Buffer;
// Note: not polyfilled with safer-buffer on a purpose, as overrides Buffer

// == Extend Node primitives to use iconv-lite =================================

module.exports = function (iconv) {
    var original = undefined; // Place to keep original methods.

    // Node authors rewrote Buffer internals to make it compatible with
    // Uint8Array and we cannot patch key functions since then.
    // Note: this does use older Buffer API on a purpose
    iconv.supportsNodeEncodingsExtension = !(Buffer.from || new Buffer(0) instanceof Uint8Array);

    iconv.extendNodeEncodings = function extendNodeEncodings() {
        if (original) return;
        original = {};

        if (!iconv.supportsNodeEncodingsExtension) {
            console.error("ACTION NEEDED: require('iconv-lite').extendNodeEncodings() is not supported in your version of Node");
            console.error("See more info at https://github.com/ashtuchkin/iconv-lite/wiki/Node-v4-compatibility");
            return;
        }

        var nodeNativeEncodings = {
            'hex': true, 'utf8': true, 'utf-8': true, 'ascii': true, 'binary': true, 
            'base64': true, 'ucs2': true, 'ucs-2': true, 'utf16le': true, 'utf-16le': true,
        };

        Buffer.isNativeEncoding = function(enc) {
            return enc && nodeNativeEncodings[enc.toLowerCase()];
        }

        // -- SlowBuffer -----------------------------------------------------------
        var SlowBuffer = require('buffer').SlowBuffer;

        original.SlowBufferToString = SlowBuffer.prototype.toString;
        SlowBuffer.prototype.toString = function(encoding, start, end) {
            encoding = String(encoding || 'utf8').toLowerCase();

            // Use native conversion when possible
            if (Buffer.isNativeEncoding(encoding))
                return original.SlowBufferToString.call(this, encoding, start, end);

            // Otherwise, use our decoding method.
            if (typeof start == 'undefined') start = 0;
            if (typeof end == 'undefined') end = this.length;
            return iconv.decode(this.slice(start, end), encoding);
        }

        original.SlowBufferWrite = SlowBuffer.prototype.write;
        SlowBuffer.prototype.write = function(string, offset, length, encoding) {
            // Support both (string, offset, length, encoding)
            // and the legacy (string, encoding, offset, length)
            if (isFinite(offset)) {
                if (!isFinite(length)) {
                    encoding = length;
                    length = undefined;
                }
            } else {  // legacy
                var swap = encoding;
                encoding = offset;
                offset = length;
                length = swap;
            }

            offset = +offset || 0;
            var remaining = this.length - offset;
            if (!length) {
                length = remaining;
            } else {
                length = +length;
                if (length > remaining) {
                    length = remaining;
                }
            }
            encoding = String(encoding || 'utf8').toLowerCase();

            // Use native conversion when possible
            if (Buffer.isNativeEncoding(encoding))
                return original.SlowBufferWrite.call(this, string, offset, length, encoding);

            if (string.length > 0 && (length < 0 || offset < 0))
                throw new RangeError('attempt to write beyond buffer bounds');

            // Otherwise, use our encoding method.
            var buf = iconv.encode(string, encoding);
            if (buf.length < length) length = buf.length;
            buf.copy(this, offset, 0, length);
            return length;
        }

        // -- Buffer ---------------------------------------------------------------

        original.BufferIsEncoding = Buffer.isEncoding;
        Buffer.isEncoding = function(encoding) {
            return Buffer.isNativeEncoding(encoding) || iconv.encodingExists(encoding);
        }

        original.BufferByteLength = Buffer.byteLength;
        Buffer.byteLength = SlowBuffer.byteLength = function(str, encoding) {
            encoding = String(encoding || 'utf8').toLowerCase();

            // Use native conversion when possible
            if (Buffer.isNativeEncoding(encoding))
                return original.BufferByteLength.call(this, str, encoding);

            // Slow, I know, but we don't have a better way yet.
            return iconv.encode(str, encoding).length;
        }

        original.BufferToString = Buffer.prototype.toString;
        Buffer.prototype.toString = function(encoding, start, end) {
            encoding = String(encoding || 'utf8').toLowerCase();

            // Use native conversion when possible
            if (Buffer.isNativeEncoding(encoding))
                return original.BufferToString.call(this, encoding, start, end);

            // Otherwise, use our decoding method.
            if (typeof start == 'undefined') start = 0;
            if (typeof end == 'undefined') end = this.length;
            return iconv.decode(this.slice(start, end), encoding);
        }

        original.BufferWrite = Buffer.prototype.write;
        Buffer.prototype.write = function(string, offset, length, encoding) {
            var _offset = offset, _length = length, _encoding = encoding;
            // Support both (string, offset, length, encoding)
            // and the legacy (string, encoding, offset, length)
            if (isFinite(offset)) {
                if (!isFinite(length)) {
                    encoding = length;
                    length = undefined;
                }
            } else {  // legacy
                var swap = encoding;
                encoding = offset;
                offset = length;
                length = swap;
            }

            encoding = String(encoding || 'utf8').toLowerCase();

            // Use native conversion when possible
            if (Buffer.isNativeEncoding(encoding))
                return original.BufferWrite.call(this, string, _offset, _length, _encoding);

            offset = +offset || 0;
            var remaining = this.length - offset;
            if (!length) {
                length = remaining;
            } else {
                length = +length;
                if (length > remaining) {
                    length = remaining;
                }
            }

            if (string.length > 0 && (length < 0 || offset < 0))
                throw new RangeError('attempt to write beyond buffer bounds');

            // Otherwise, use our encoding method.
            var buf = iconv.encode(string, encoding);
            if (buf.length < length) length = buf.length;
            buf.copy(this, offset, 0, length);
            return length;

            // TODO: Set _charsWritten.
        }


        // -- Readable -------------------------------------------------------------
        if (iconv.supportsStreams) {
            var Readable = require('stream').Readable;

            original.ReadableSetEncoding = Readable.prototype.setEncoding;
            Readable.prototype.setEncoding = function setEncoding(enc, options) {
                // Use our own decoder, it has the same interface.
                // We cannot use original function as it doesn't handle BOM-s.
                this._readableState.decoder = iconv.getDecoder(enc, options);
                this._readableState.encoding = enc;
            }

            Readable.prototype.collect = iconv._collect;
        }
    }

    // Remove iconv-lite Node primitive extensions.
    iconv.undoExtendNodeEncodings = function undoExtendNodeEncodings() {
        if (!iconv.supportsNodeEncodingsExtension)
            return;
        if (!original)
            throw new Error("require('iconv-lite').undoExtendNodeEncodings(): Nothing to undo; extendNodeEncodings() is not called.")

        delete Buffer.isNativeEncoding;

        var SlowBuffer = require('buffer').SlowBuffer;

        SlowBuffer.prototype.toString = original.SlowBufferToString;
        SlowBuffer.prototype.write = original.SlowBufferWrite;

        Buffer.isEncoding = original.BufferIsEncoding;
        Buffer.byteLength = original.BufferByteLength;
        Buffer.prototype.toString = original.BufferToString;
        Buffer.prototype.write = original.BufferWrite;

        if (iconv.supportsStreams) {
            var Readable = require('stream').Readable;

            Readable.prototype.setEncoding = original.ReadableSetEncoding;
            delete Readable.prototype.collect;
        }

        original = undefined;
    }
}
"use strict";

// Some environments don't have global Buffer (e.g. React Native).
// Solution would be installing npm modules "buffer" and "stream" explicitly.
var Buffer = require("safer-buffer").Buffer;

var bomHandling = require("./bom-handling"),
    iconv = module.exports;

// All codecs and aliases are kept here, keyed by encoding name/alias.
// They are lazy loaded in `iconv.getCodec` from `encodings/index.js`.
iconv.encodings = null;

// Characters emitted in case of error.
iconv.defaultCharUnicode = '�';
iconv.defaultCharSingleByte = '?';

// Public API.
iconv.encode = function encode(str, encoding, options) {
    str = "" + (str || ""); // Ensure string.

    var encoder = iconv.getEncoder(encoding, options);

    var res = encoder.write(str);
    var trail = encoder.end();
    
    return (trail && trail.length > 0) ? Buffer.concat([res, trail]) : res;
}

iconv.decode = function decode(buf, encoding, options) {
    if (typeof buf === 'string') {
        if (!iconv.skipDecodeWarning) {
            console.error('Iconv-lite warning: decode()-ing strings is deprecated. Refer to https://github.com/ashtuchkin/iconv-lite/wiki/Use-Buffers-when-decoding');
            iconv.skipDecodeWarning = true;
        }

        buf = Buffer.from("" + (buf || ""), "binary"); // Ensure buffer.
    }

    var decoder = iconv.getDecoder(encoding, options);

    var res = decoder.write(buf);
    var trail = decoder.end();

    return trail ? (res + trail) : res;
}

iconv.encodingExists = function encodingExists(enc) {
    try {
        iconv.getCodec(enc);
        return true;
    } catch (e) {
        return false;
    }
}

// Legacy aliases to convert functions
iconv.toEncoding = iconv.encode;
iconv.fromEncoding = iconv.decode;

// Search for a codec in iconv.encodings. Cache codec data in iconv._codecDataCache.
iconv._codecDataCache = {};
iconv.getCodec = function getCodec(encoding) {
    if (!iconv.encodings)
        iconv.encodings = require("../encodings"); // Lazy load all encoding definitions.
    
    // Canonicalize encoding name: strip all non-alphanumeric chars and appended year.
    var enc = iconv._canonicalizeEncoding(encoding);

    // Traverse iconv.encodings to find actual codec.
    var codecOptions = {};
    while (true) {
        var codec = iconv._codecDataCache[enc];
        if (codec)
            return codec;

        var codecDef = iconv.encodings[enc];

        switch (typeof codecDef) {
            case "string": // Direct alias to other encoding.
                enc = codecDef;
                break;

            case "object": // Alias with options. Can be layered.
                for (var key in codecDef)
                    codecOptions[key] = codecDef[key];

                if (!codecOptions.encodingName)
                    codecOptions.encodingName = enc;
                
                enc = codecDef.type;
                break;

            case "function": // Codec itself.
                if (!codecOptions.encodingName)
                    codecOptions.encodingName = enc;

                // The codec function must load all tables and return object with .encoder and .decoder methods.
                // It'll be called only once (for each different options object).
                codec = new codecDef(codecOptions, iconv);

                iconv._codecDataCache[codecOptions.encodingName] = codec; // Save it to be reused later.
                return codec;

            default:
                throw new Error("Encoding not recognized: '" + encoding + "' (searched as: '"+enc+"')");
        }
    }
}

iconv._canonicalizeEncoding = function(encoding) {
    // Canonicalize encoding name: strip all non-alphanumeric chars and appended year.
    return (''+encoding).toLowerCase().replace(/:\d{4}$|[^0-9a-z]/g, "");
}

iconv.getEncoder = function getEncoder(encoding, options) {
    var codec = iconv.getCodec(encoding),
        encoder = new codec.encoder(options, codec);

    if (codec.bomAware && options && options.addBOM)
        encoder = new bomHandling.PrependBOM(encoder, options);

    return encoder;
}

iconv.getDecoder = function getDecoder(encoding, options) {
    var codec = iconv.getCodec(encoding),
        decoder = new codec.decoder(options, codec);

    if (codec.bomAware && !(options && options.stripBOM === false))
        decoder = new bomHandling.StripBOM(decoder, options);

    return decoder;
}


// Load extensions in Node. All of them are omitted in Browserify build via 'browser' field in package.json.
var nodeVer = typeof process !== 'undefined' && process.versions && process.versions.node;
if (nodeVer) {

    // Load streaming support in Node v0.10+
    var nodeVerArr = nodeVer.split(".").map(Number);
    if (nodeVerArr[0] > 0 || nodeVerArr[1] >= 10) {
        require("./streams")(iconv);
    }

    // Load Node primitive extensions.
    require("./extend-node")(iconv);
}

if ("Ā" != "\u0100") {
    console.error("iconv-lite warning: javascript files use encoding different from utf-8. See https://github.com/ashtuchkin/iconv-lite/wiki/Javascript-source-file-encodings for more info.");
}
"use strict";

var Buffer = require("buffer").Buffer,
    Transform = require("stream").Transform;


// == Exports ==================================================================
module.exports = function(iconv) {
    
    // Additional Public API.
    iconv.encodeStream = function encodeStream(encoding, options) {
        return new IconvLiteEncoderStream(iconv.getEncoder(encoding, options), options);
    }

    iconv.decodeStream = function decodeStream(encoding, options) {
        return new IconvLiteDecoderStream(iconv.getDecoder(encoding, options), options);
    }

    iconv.supportsStreams = true;


    // Not published yet.
    iconv.IconvLiteEncoderStream = IconvLiteEncoderStream;
    iconv.IconvLiteDecoderStream = IconvLiteDecoderStream;
    iconv._collect = IconvLiteDecoderStream.prototype.collect;
};


// == Encoder stream =======================================================
function IconvLiteEncoderStream(conv, options) {
    this.conv = conv;
    options = options || {};
    options.decodeStrings = false; // We accept only strings, so we don't need to decode them.
    Transform.call(this, options);
}

IconvLiteEncoderStream.prototype = Object.create(Transform.prototype, {
    constructor: { value: IconvLiteEncoderStream }
});

IconvLiteEncoderStream.prototype._transform = function(chunk, encoding, done) {
    if (typeof chunk != 'string')
        return done(new Error("Iconv encoding stream needs strings as its input."));
    try {
        var res = this.conv.write(chunk);
        if (res && res.length) this.push(res);
        done();
    }
    catch (e) {
        done(e);
    }
}

IconvLiteEncoderStream.prototype._flush = function(done) {
    try {
        var res = this.conv.end();
        if (res && res.length) this.push(res);
        done();
    }
    catch (e) {
        done(e);
    }
}

IconvLiteEncoderStream.prototype.collect = function(cb) {
    var chunks = [];
    this.on('error', cb);
    this.on('data', function(chunk) { chunks.push(chunk); });
    this.on('end', function() {
        cb(null, Buffer.concat(chunks));
    });
    return this;
}


// == Decoder stream =======================================================
function IconvLiteDecoderStream(conv, options) {
    this.conv = conv;
    options = options || {};
    options.encoding = this.encoding = 'utf8'; // We output strings.
    Transform.call(this, options);
}

IconvLiteDecoderStream.prototype = Object.create(Transform.prototype, {
    constructor: { value: IconvLiteDecoderStream }
});

IconvLiteDecoderStream.prototype._transform = function(chunk, encoding, done) {
    if (!Buffer.isBuffer(chunk))
        return done(new Error("Iconv decoding stream needs buffers as its input."));
    try {
        var res = this.conv.write(chunk);
        if (res && res.length) this.push(res, this.encoding);
        done();
    }
    catch (e) {
        done(e);
    }
}

IconvLiteDecoderStream.prototype._flush = function(done) {
    try {
        var res = this.conv.end();
        if (res && res.length) this.push(res, this.encoding);                
        done();
    }
    catch (e) {
        done(e);
    }
}

IconvLiteDecoderStream.prototype.collect = function(cb) {
    var res = '';
    this.on('error', cb);
    this.on('data', function(chunk) { res += chunk; });
    this.on('end', function() {
        cb(null, res);
    });
    return this;
}

"use strict";
var Buffer = require("safer-buffer").Buffer;

// Multibyte codec. In this scheme, a character is represented by 1 or more bytes.
// Our codec supports UTF-16 surrogates, extensions for GB18030 and unicode sequences.
// To save memory and loading time, we read table files only when requested.

exports._dbcs = DBCSCodec;

var UNASSIGNED = -1,
    GB18030_CODE = -2,
    SEQ_START  = -10,
    NODE_START = -1000,
    UNASSIGNED_NODE = new Array(0x100),
    DEF_CHAR = -1;

for (var i = 0; i < 0x100; i++)
    UNASSIGNED_NODE[i] = UNASSIGNED;


// Class DBCSCodec reads and initializes mapping tables.
function DBCSCodec(codecOptions, iconv) {
    this.encodingName = codecOptions.encodingName;
    if (!codecOptions)
        throw new Error("DBCS codec is called without the data.")
    if (!codecOptions.table)
        throw new Error("Encoding '" + this.encodingName + "' has no data.");

    // Load tables.
    var mappingTable = codecOptions.table();


    // Decode tables: MBCS -> Unicode.

    // decodeTables is a trie, encoded as an array of arrays of integers. Internal arrays are trie nodes and all have len = 256.
    // Trie root is decodeTables[0].
    // Values: >=  0 -> unicode character code. can be > 0xFFFF
    //         == UNASSIGNED -> unknown/unassigned sequence.
    //         == GB18030_CODE -> this is the end of a GB18030 4-byte sequence.
    //         <= NODE_START -> index of the next node in our trie to process next byte.
    //         <= SEQ_START  -> index of the start of a character code sequence, in decodeTableSeq.
    this.decodeTables = [];
    this.decodeTables[0] = UNASSIGNED_NODE.slice(0); // Create root node.

    // Sometimes a MBCS char corresponds to a sequence of unicode chars. We store them as arrays of integers here. 
    this.decodeTableSeq = [];

    // Actual mapping tables consist of chunks. Use them to fill up decode tables.
    for (var i = 0; i < mappingTable.length; i++)
        this._addDecodeChunk(mappingTable[i]);

    this.defaultCharUnicode = iconv.defaultCharUnicode;

    
    // Encode tables: Unicode -> DBCS.

    // `encodeTable` is array mapping from unicode char to encoded char. All its values are integers for performance.
    // Because it can be sparse, it is represented as array of buckets by 256 chars each. Bucket can be null.
    // Values: >=  0 -> it is a normal char. Write the value (if <=256 then 1 byte, if <=65536 then 2 bytes, etc.).
    //         == UNASSIGNED -> no conversion found. Output a default char.
    //         <= SEQ_START  -> it's an index in encodeTableSeq, see below. The character starts a sequence.
    this.encodeTable = [];
    
    // `encodeTableSeq` is used when a sequence of unicode characters is encoded as a single code. We use a tree of
    // objects where keys correspond to characters in sequence and leafs are the encoded dbcs values. A special DEF_CHAR key
    // means end of sequence (needed when one sequence is a strict subsequence of another).
    // Objects are kept separately from encodeTable to increase performance.
    this.encodeTableSeq = [];

    // Some chars can be decoded, but need not be encoded.
    var skipEncodeChars = {};
    if (codecOptions.encodeSkipVals)
        for (var i = 0; i < codecOptions.encodeSkipVals.length; i++) {
            var val = codecOptions.encodeSkipVals[i];
            if (typeof val === 'number')
                skipEncodeChars[val] = true;
            else
                for (var j = val.from; j <= val.to; j++)
                    skipEncodeChars[j] = true;
        }
        
    // Use decode trie to recursively fill out encode tables.
    this._fillEncodeTable(0, 0, skipEncodeChars);

    // Add more encoding pairs when needed.
    if (codecOptions.encodeAdd) {
        for (var uChar in codecOptions.encodeAdd)
            if (Object.prototype.hasOwnProperty.call(codecOptions.encodeAdd, uChar))
                this._setEncodeChar(uChar.charCodeAt(0), codecOptions.encodeAdd[uChar]);
    }

    this.defCharSB  = this.encodeTable[0][iconv.defaultCharSingleByte.charCodeAt(0)];
    if (this.defCharSB === UNASSIGNED) this.defCharSB = this.encodeTable[0]['?'];
    if (this.defCharSB === UNASSIGNED) this.defCharSB = "?".charCodeAt(0);


    // Load & create GB18030 tables when needed.
    if (typeof codecOptions.gb18030 === 'function') {
        this.gb18030 = codecOptions.gb18030(); // Load GB18030 ranges.

        // Add GB18030 decode tables.
        var thirdByteNodeIdx = this.decodeTables.length;
        var thirdByteNode = this.decodeTables[thirdByteNodeIdx] = UNASSIGNED_NODE.slice(0);

        var fourthByteNodeIdx = this.decodeTables.length;
        var fourthByteNode = this.decodeTables[fourthByteNodeIdx] = UNASSIGNED_NODE.slice(0);

        for (var i = 0x81; i <= 0xFE; i++) {
            var secondByteNodeIdx = NODE_START - this.decodeTables[0][i];
            var secondByteNode = this.decodeTables[secondByteNodeIdx];
            for (var j = 0x30; j <= 0x39; j++)
                secondByteNode[j] = NODE_START - thirdByteNodeIdx;
        }
        for (var i = 0x81; i <= 0xFE; i++)
            thirdByteNode[i] = NODE_START - fourthByteNodeIdx;
        for (var i = 0x30; i <= 0x39; i++)
            fourthByteNode[i] = GB18030_CODE
    }        
}

DBCSCodec.prototype.encoder = DBCSEncoder;
DBCSCodec.prototype.decoder = DBCSDecoder;

// Decoder helpers
DBCSCodec.prototype._getDecodeTrieNode = function(addr) {
    var bytes = [];
    for (; addr > 0; addr >>= 8)
        bytes.push(addr & 0xFF);
    if (bytes.length == 0)
        bytes.push(0);

    var node = this.decodeTables[0];
    for (var i = bytes.length-1; i > 0; i--) { // Traverse nodes deeper into the trie.
        var val = node[bytes[i]];

        if (val == UNASSIGNED) { // Create new node.
            node[bytes[i]] = NODE_START - this.decodeTables.length;
            this.decodeTables.push(node = UNASSIGNED_NODE.slice(0));
        }
        else if (val <= NODE_START) { // Existing node.
            node = this.decodeTables[NODE_START - val];
        }
        else
            throw new Error("Overwrite byte in " + this.encodingName + ", addr: " + addr.toString(16));
    }
    return node;
}


DBCSCodec.prototype._addDecodeChunk = function(chunk) {
    // First element of chunk is the hex mbcs code where we start.
    var curAddr = parseInt(chunk[0], 16);

    // Choose the decoding node where we'll write our chars.
    var writeTable = this._getDecodeTrieNode(curAddr);
    curAddr = curAddr & 0xFF;

    // Write all other elements of the chunk to the table.
    for (var k = 1; k < chunk.length; k++) {
        var part = chunk[k];
        if (typeof part === "string") { // String, write as-is.
            for (var l = 0; l < part.length;) {
                var code = part.charCodeAt(l++);
                if (0xD800 <= code && code < 0xDC00) { // Decode surrogate
                    var codeTrail = part.charCodeAt(l++);
                    if (0xDC00 <= codeTrail && codeTrail < 0xE000)
                        writeTable[curAddr++] = 0x10000 + (code - 0xD800) * 0x400 + (codeTrail - 0xDC00);
                    else
                        throw new Error("Incorrect surrogate pair in "  + this.encodingName + " at chunk " + chunk[0]);
                }
                else if (0x0FF0 < code && code <= 0x0FFF) { // Character sequence (our own encoding used)
                    var len = 0xFFF - code + 2;
                    var seq = [];
                    for (var m = 0; m < len; m++)
                        seq.push(part.charCodeAt(l++)); // Simple variation: don't support surrogates or subsequences in seq.

                    writeTable[curAddr++] = SEQ_START - this.decodeTableSeq.length;
                    this.decodeTableSeq.push(seq);
                }
                else
                    writeTable[curAddr++] = code; // Basic char
            }
        } 
        else if (typeof part === "number") { // Integer, meaning increasing sequence starting with prev character.
            var charCode = writeTable[curAddr - 1] + 1;
            for (var l = 0; l < part; l++)
                writeTable[curAddr++] = charCode++;
        }
        else
            throw new Error("Incorrect type '" + typeof part + "' given in "  + this.encodingName + " at chunk " + chunk[0]);
    }
    if (curAddr > 0xFF)
        throw new Error("Incorrect chunk in "  + this.encodingName + " at addr " + chunk[0] + ": too long" + curAddr);
}

// Encoder helpers
DBCSCodec.prototype._getEncodeBucket = function(uCode) {
    var high = uCode >> 8; // This could be > 0xFF because of astral characters.
    if (this.encodeTable[high] === undefined)
        this.encodeTable[high] = UNASSIGNED_NODE.slice(0); // Create bucket on demand.
    return this.encodeTable[high];
}

DBCSCodec.prototype._setEncodeChar = function(uCode, dbcsCode) {
    var bucket = this._getEncodeBucket(uCode);
    var low = uCode & 0xFF;
    if (bucket[low] <= SEQ_START)
        this.encodeTableSeq[SEQ_START-bucket[low]][DEF_CHAR] = dbcsCode; // There's already a sequence, set a single-char subsequence of it.
    else if (bucket[low] == UNASSIGNED)
        bucket[low] = dbcsCode;
}

DBCSCodec.prototype._setEncodeSequence = function(seq, dbcsCode) {
    
    // Get the root of character tree according to first character of the sequence.
    var uCode = seq[0];
    var bucket = this._getEncodeBucket(uCode);
    var low = uCode & 0xFF;

    var node;
    if (bucket[low] <= SEQ_START) {
        // There's already a sequence with  - use it.
        node = this.encodeTableSeq[SEQ_START-bucket[low]];
    }
    else {
        // There was no sequence object - allocate a new one.
        node = {};
        if (bucket[low] !== UNASSIGNED) node[DEF_CHAR] = bucket[low]; // If a char was set before - make it a single-char subsequence.
        bucket[low] = SEQ_START - this.encodeTableSeq.length;
        this.encodeTableSeq.push(node);
    }

    // Traverse the character tree, allocating new nodes as needed.
    for (var j = 1; j < seq.length-1; j++) {
        var oldVal = node[uCode];
        if (typeof oldVal === 'object')
            node = oldVal;
        else {
            node = node[uCode] = {}
            if (oldVal !== undefined)
                node[DEF_CHAR] = oldVal
        }
    }

    // Set the leaf to given dbcsCode.
    uCode = seq[seq.length-1];
    node[uCode] = dbcsCode;
}

DBCSCodec.prototype._fillEncodeTable = function(nodeIdx, prefix, skipEncodeChars) {
    var node = this.decodeTables[nodeIdx];
    for (var i = 0; i < 0x100; i++) {
        var uCode = node[i];
        var mbCode = prefix + i;
        if (skipEncodeChars[mbCode])
            continue;

        if (uCode >= 0)
            this._setEncodeChar(uCode, mbCode);
        else if (uCode <= NODE_START)
            this._fillEncodeTable(NODE_START - uCode, mbCode << 8, skipEncodeChars);
        else if (uCode <= SEQ_START)
            this._setEncodeSequence(this.decodeTableSeq[SEQ_START - uCode], mbCode);
    }
}



// == Encoder ==================================================================

function DBCSEncoder(options, codec) {
    // Encoder state
    this.leadSurrogate = -1;
    this.seqObj = undefined;
    
    // Static data
    this.encodeTable = codec.encodeTable;
    this.encodeTableSeq = codec.encodeTableSeq;
    this.defaultCharSingleByte = codec.defCharSB;
    this.gb18030 = codec.gb18030;
}

DBCSEncoder.prototype.write = function(str) {
    var newBuf = Buffer.alloc(str.length * (this.gb18030 ? 4 : 3)),
        leadSurrogate = this.leadSurrogate,
        seqObj = this.seqObj, nextChar = -1,
        i = 0, j = 0;

    while (true) {
        // 0. Get next character.
        if (nextChar === -1) {
            if (i == str.length) break;
            var uCode = str.charCodeAt(i++);
        }
        else {
            var uCode = nextChar;
            nextChar = -1;    
        }

        // 1. Handle surrogates.
        if (0xD800 <= uCode && uCode < 0xE000) { // Char is one of surrogates.
            if (uCode < 0xDC00) { // We've got lead surrogate.
                if (leadSurrogate === -1) {
                    leadSurrogate = uCode;
                    continue;
                } else {
                    leadSurrogate = uCode;
                    // Double lead surrogate found.
                    uCode = UNASSIGNED;
                }
            } else { // We've got trail surrogate.
                if (leadSurrogate !== -1) {
                    uCode = 0x10000 + (leadSurrogate - 0xD800) * 0x400 + (uCode - 0xDC00);
                    leadSurrogate = -1;
                } else {
                    // Incomplete surrogate pair - only trail surrogate found.
                    uCode = UNASSIGNED;
                }
                
            }
        }
        else if (leadSurrogate !== -1) {
            // Incomplete surrogate pair - only lead surrogate found.
            nextChar = uCode; uCode = UNASSIGNED; // Write an error, then current char.
            leadSurrogate = -1;
        }

        // 2. Convert uCode character.
        var dbcsCode = UNASSIGNED;
        if (seqObj !== undefined && uCode != UNASSIGNED) { // We are in the middle of the sequence
            var resCode = seqObj[uCode];
            if (typeof resCode === 'object') { // Sequence continues.
                seqObj = resCode;
                continue;

            } else if (typeof resCode == 'number') { // Sequence finished. Write it.
                dbcsCode = resCode;

            } else if (resCode == undefined) { // Current character is not part of the sequence.

                // Try default character for this sequence
                resCode = seqObj[DEF_CHAR];
                if (resCode !== undefined) {
                    dbcsCode = resCode; // Found. Write it.
                    nextChar = uCode; // Current character will be written too in the next iteration.

                } else {
                    // TODO: What if we have no default? (resCode == undefined)
                    // Then, we should write first char of the sequence as-is and try the rest recursively.
                    // Didn't do it for now because no encoding has this situation yet.
                    // Currently, just skip the sequence and write current char.
                }
            }
            seqObj = undefined;
        }
        else if (uCode >= 0) {  // Regular character
            var subtable = this.encodeTable[uCode >> 8];
            if (subtable !== undefined)
                dbcsCode = subtable[uCode & 0xFF];
            
            if (dbcsCode <= SEQ_START) { // Sequence start
                seqObj = this.encodeTableSeq[SEQ_START-dbcsCode];
                continue;
            }

            if (dbcsCode == UNASSIGNED && this.gb18030) {
                // Use GB18030 algorithm to find character(s) to write.
                var idx = findIdx(this.gb18030.uChars, uCode);
                if (idx != -1) {
                    var dbcsCode = this.gb18030.gbChars[idx] + (uCode - this.gb18030.uChars[idx]);
                    newBuf[j++] = 0x81 + Math.floor(dbcsCode / 12600); dbcsCode = dbcsCode % 12600;
                    newBuf[j++] = 0x30 + Math.floor(dbcsCode / 1260); dbcsCode = dbcsCode % 1260;
                    newBuf[j++] = 0x81 + Math.floor(dbcsCode / 10); dbcsCode = dbcsCode % 10;
                    newBuf[j++] = 0x30 + dbcsCode;
                    continue;
                }
            }
        }

        // 3. Write dbcsCode character.
        if (dbcsCode === UNASSIGNED)
            dbcsCode = this.defaultCharSingleByte;
        
        if (dbcsCode < 0x100) {
            newBuf[j++] = dbcsCode;
        }
        else if (dbcsCode < 0x10000) {
            newBuf[j++] = dbcsCode >> 8;   // high byte
            newBuf[j++] = dbcsCode & 0xFF; // low byte
        }
        else {
            newBuf[j++] = dbcsCode >> 16;
            newBuf[j++] = (dbcsCode >> 8) & 0xFF;
            newBuf[j++] = dbcsCode & 0xFF;
        }
    }

    this.seqObj = seqObj;
    this.leadSurrogate = leadSurrogate;
    return newBuf.slice(0, j);
}

DBCSEncoder.prototype.end = function() {
    if (this.leadSurrogate === -1 && this.seqObj === undefined)
        return; // All clean. Most often case.

    var newBuf = Buffer.alloc(10), j = 0;

    if (this.seqObj) { // We're in the sequence.
        var dbcsCode = this.seqObj[DEF_CHAR];
        if (dbcsCode !== undefined) { // Write beginning of the sequence.
            if (dbcsCode < 0x100) {
                newBuf[j++] = dbcsCode;
            }
            else {
                newBuf[j++] = dbcsCode >> 8;   // high byte
                newBuf[j++] = dbcsCode & 0xFF; // low byte
            }
        } else {
            // See todo above.
        }
        this.seqObj = undefined;
    }

    if (this.leadSurrogate !== -1) {
        // Incomplete surrogate pair - only lead surrogate found.
        newBuf[j++] = this.defaultCharSingleByte;
        this.leadSurrogate = -1;
    }
    
    return newBuf.slice(0, j);
}

// Export for testing
DBCSEncoder.prototype.findIdx = findIdx;


// == Decoder ==================================================================

function DBCSDecoder(options, codec) {
    // Decoder state
    this.nodeIdx = 0;
    this.prevBuf = Buffer.alloc(0);

    // Static data
    this.decodeTables = codec.decodeTables;
    this.decodeTableSeq = codec.decodeTableSeq;
    this.defaultCharUnicode = codec.defaultCharUnicode;
    this.gb18030 = codec.gb18030;
}

DBCSDecoder.prototype.write = function(buf) {
    var newBuf = Buffer.alloc(buf.length*2),
        nodeIdx = this.nodeIdx, 
        prevBuf = this.prevBuf, prevBufOffset = this.prevBuf.length,
        seqStart = -this.prevBuf.length, // idx of the start of current parsed sequence.
        uCode;

    if (prevBufOffset > 0) // Make prev buf overlap a little to make it easier to slice later.
        prevBuf = Buffer.concat([prevBuf, buf.slice(0, 10)]);
    
    for (var i = 0, j = 0; i < buf.length; i++) {
        var curByte = (i >= 0) ? buf[i] : prevBuf[i + prevBufOffset];

        // Lookup in current trie node.
        var uCode = this.decodeTables[nodeIdx][curByte];

        if (uCode >= 0) { 
            // Normal character, just use it.
        }
        else if (uCode === UNASSIGNED) { // Unknown char.
            // TODO: Callback with seq.
            //var curSeq = (seqStart >= 0) ? buf.slice(seqStart, i+1) : prevBuf.slice(seqStart + prevBufOffset, i+1 + prevBufOffset);
            i = seqStart; // Try to parse again, after skipping first byte of the sequence ('i' will be incremented by 'for' cycle).
            uCode = this.defaultCharUnicode.charCodeAt(0);
        }
        else if (uCode === GB18030_CODE) {
            var curSeq = (seqStart >= 0) ? buf.slice(seqStart, i+1) : prevBuf.slice(seqStart + prevBufOffset, i+1 + prevBufOffset);
            var ptr = (curSeq[0]-0x81)*12600 + (curSeq[1]-0x30)*1260 + (curSeq[2]-0x81)*10 + (curSeq[3]-0x30);
            var idx = findIdx(this.gb18030.gbChars, ptr);
            uCode = this.gb18030.uChars[idx] + ptr - this.gb18030.gbChars[idx];
        }
        else if (uCode <= NODE_START) { // Go to next trie node.
            nodeIdx = NODE_START - uCode;
            continue;
        }
        else if (uCode <= SEQ_START) { // Output a sequence of chars.
            var seq = this.decodeTableSeq[SEQ_START - uCode];
            for (var k = 0; k < seq.length - 1; k++) {
                uCode = seq[k];
                newBuf[j++] = uCode & 0xFF;
                newBuf[j++] = uCode >> 8;
            }
            uCode = seq[seq.length-1];
        }
        else
            throw new Error("iconv-lite internal error: invalid decoding table value " + uCode + " at " + nodeIdx + "/" + curByte);

        // Write the character to buffer, handling higher planes using surrogate pair.
        if (uCode > 0xFFFF) { 
            uCode -= 0x10000;
            var uCodeLead = 0xD800 + Math.floor(uCode / 0x400);
            newBuf[j++] = uCodeLead & 0xFF;
            newBuf[j++] = uCodeLead >> 8;

            uCode = 0xDC00 + uCode % 0x400;
        }
        newBuf[j++] = uCode & 0xFF;
        newBuf[j++] = uCode >> 8;

        // Reset trie node.
        nodeIdx = 0; seqStart = i+1;
    }

    this.nodeIdx = nodeIdx;
    this.prevBuf = (seqStart >= 0) ? buf.slice(seqStart) : prevBuf.slice(seqStart + prevBufOffset);
    return newBuf.slice(0, j).toString('ucs2');
}

DBCSDecoder.prototype.end = function() {
    var ret = '';

    // Try to parse all remaining chars.
    while (this.prevBuf.length > 0) {
        // Skip 1 character in the buffer.
        ret += this.defaultCharUnicode;
        var buf = this.prevBuf.slice(1);

        // Parse remaining as usual.
        this.prevBuf = Buffer.alloc(0);
        this.nodeIdx = 0;
        if (buf.length > 0)
            ret += this.write(buf);
    }

    this.nodeIdx = 0;
    return ret;
}

// Binary search for GB18030. Returns largest i such that table[i] <= val.
function findIdx(table, val) {
    if (table[0] > val)
        return -1;

    var l = 0, r = table.length;
    while (l < r-1) { // always table[l] <= val < table[r]
        var mid = l + Math.floor((r-l+1)/2);
        if (table[mid] <= val)
            l = mid;
        else
            r = mid;
    }
    return l;
}

"use strict";

// Description of supported double byte encodings and aliases.
// Tables are not require()-d until they are needed to speed up library load.
// require()-s are direct to support Browserify.

module.exports = {
    
    // == Japanese/ShiftJIS ====================================================
    // All japanese encodings are based on JIS X set of standards:
    // JIS X 0201 - Single-byte encoding of ASCII + ¥ + Kana chars at 0xA1-0xDF.
    // JIS X 0208 - Main set of 6879 characters, placed in 94x94 plane, to be encoded by 2 bytes. 
    //              Has several variations in 1978, 1983, 1990 and 1997.
    // JIS X 0212 - Supplementary plane of 6067 chars in 94x94 plane. 1990. Effectively dead.
    // JIS X 0213 - Extension and modern replacement of 0208 and 0212. Total chars: 11233.
    //              2 planes, first is superset of 0208, second - revised 0212.
    //              Introduced in 2000, revised 2004. Some characters are in Unicode Plane 2 (0x2xxxx)

    // Byte encodings are:
    //  * Shift_JIS: Compatible with 0201, uses not defined chars in top half as lead bytes for double-byte
    //               encoding of 0208. Lead byte ranges: 0x81-0x9F, 0xE0-0xEF; Trail byte ranges: 0x40-0x7E, 0x80-0x9E, 0x9F-0xFC.
    //               Windows CP932 is a superset of Shift_JIS. Some companies added more chars, notably KDDI.
    //  * EUC-JP:    Up to 3 bytes per character. Used mostly on *nixes.
    //               0x00-0x7F       - lower part of 0201
    //               0x8E, 0xA1-0xDF - upper part of 0201
    //               (0xA1-0xFE)x2   - 0208 plane (94x94).
    //               0x8F, (0xA1-0xFE)x2 - 0212 plane (94x94).
    //  * JIS X 208: 7-bit, direct encoding of 0208. Byte ranges: 0x21-0x7E (94 values). Uncommon.
    //               Used as-is in ISO2022 family.
    //  * ISO2022-JP: Stateful encoding, with escape sequences to switch between ASCII, 
    //                0201-1976 Roman, 0208-1978, 0208-1983.
    //  * ISO2022-JP-1: Adds esc seq for 0212-1990.
    //  * ISO2022-JP-2: Adds esc seq for GB2313-1980, KSX1001-1992, ISO8859-1, ISO8859-7.
    //  * ISO2022-JP-3: Adds esc seq for 0201-1976 Kana set, 0213-2000 Planes 1, 2.
    //  * ISO2022-JP-2004: Adds 0213-2004 Plane 1.
    //
    // After JIS X 0213 appeared, Shift_JIS-2004, EUC-JISX0213 and ISO2022-JP-2004 followed, with just changing the planes.
    //
    // Overall, it seems that it's a mess :( http://www8.plala.or.jp/tkubota1/unicode-symbols-map2.html

    'shiftjis': {
        type: '_dbcs',
        table: function() { return require('./tables/shiftjis.json') },
        encodeAdd: {'\u00a5': 0x5C, '\u203E': 0x7E},
        encodeSkipVals: [{from: 0xED40, to: 0xF940}],
    },
    'csshiftjis': 'shiftjis',
    'mskanji': 'shiftjis',
    'sjis': 'shiftjis',
    'windows31j': 'shiftjis',
    'ms31j': 'shiftjis',
    'xsjis': 'shiftjis',
    'windows932': 'shiftjis',
    'ms932': 'shiftjis',
    '932': 'shiftjis',
    'cp932': 'shiftjis',

    'eucjp': {
        type: '_dbcs',
        table: function() { return require('./tables/eucjp.json') },
        encodeAdd: {'\u00a5': 0x5C, '\u203E': 0x7E},
    },

    // TODO: KDDI extension to Shift_JIS
    // TODO: IBM CCSID 942 = CP932, but F0-F9 custom chars and other char changes.
    // TODO: IBM CCSID 943 = Shift_JIS = CP932 with original Shift_JIS lower 128 chars.


    // == Chinese/GBK ==========================================================
    // http://en.wikipedia.org/wiki/GBK
    // We mostly implement W3C recommendation: https://www.w3.org/TR/encoding/#gbk-encoder

    // Oldest GB2312 (1981, ~7600 chars) is a subset of CP936
    'gb2312': 'cp936',
    'gb231280': 'cp936',
    'gb23121980': 'cp936',
    'csgb2312': 'cp936',
    'csiso58gb231280': 'cp936',
    'euccn': 'cp936',

    // Microsoft's CP936 is a subset and approximation of GBK.
    'windows936': 'cp936',
    'ms936': 'cp936',
    '936': 'cp936',
    'cp936': {
        type: '_dbcs',
        table: function() { return require('./tables/cp936.json') },
    },

    // GBK (~22000 chars) is an extension of CP936 that added user-mapped chars and some other.
    'gbk': {
        type: '_dbcs',
        table: function() { return require('./tables/cp936.json').concat(require('./tables/gbk-added.json')) },
    },
    'xgbk': 'gbk',
    'isoir58': 'gbk',

    // GB18030 is an algorithmic extension of GBK.
    // Main source: https://www.w3.org/TR/encoding/#gbk-encoder
    // http://icu-project.org/docs/papers/gb18030.html
    // http://source.icu-project.org/repos/icu/data/trunk/charset/data/xml/gb-18030-2000.xml
    // http://www.khngai.com/chinese/charmap/tblgbk.php?page=0
    'gb18030': {
        type: '_dbcs',
        table: function() { return require('./tables/cp936.json').concat(require('./tables/gbk-added.json')) },
        gb18030: function() { return require('./tables/gb18030-ranges.json') },
        encodeSkipVals: [0x80],
        encodeAdd: {'€': 0xA2E3},
    },

    'chinese': 'gb18030',


    // == Korean ===============================================================
    // EUC-KR, KS_C_5601 and KS X 1001 are exactly the same.
    'windows949': 'cp949',
    'ms949': 'cp949',
    '949': 'cp949',
    'cp949': {
        type: '_dbcs',
        table: function() { return require('./tables/cp949.json') },
    },

    'cseuckr': 'cp949',
    'csksc56011987': 'cp949',
    'euckr': 'cp949',
    'isoir149': 'cp949',
    'korean': 'cp949',
    'ksc56011987': 'cp949',
    'ksc56011989': 'cp949',
    'ksc5601': 'cp949',


    // == Big5/Taiwan/Hong Kong ================================================
    // There are lots of tables for Big5 and cp950. Please see the following links for history:
    // http://moztw.org/docs/big5/  http://www.haible.de/bruno/charsets/conversion-tables/Big5.html
    // Variations, in roughly number of defined chars:
    //  * Windows CP 950: Microsoft variant of Big5. Canonical: http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP950.TXT
    //  * Windows CP 951: Microsoft variant of Big5-HKSCS-2001. Seems to be never public. http://me.abelcheung.org/articles/research/what-is-cp951/
    //  * Big5-2003 (Taiwan standard) almost superset of cp950.
    //  * Unicode-at-on (UAO) / Mozilla 1.8. Falling out of use on the Web. Not supported by other browsers.
    //  * Big5-HKSCS (-2001, -2004, -2008). Hong Kong standard. 
    //    many unicode code points moved from PUA to Supplementary plane (U+2XXXX) over the years.
    //    Plus, it has 4 combining sequences.
    //    Seems that Mozilla refused to support it for 10 yrs. https://bugzilla.mozilla.org/show_bug.cgi?id=162431 https://bugzilla.mozilla.org/show_bug.cgi?id=310299
    //    because big5-hkscs is the only encoding to include astral characters in non-algorithmic way.
    //    Implementations are not consistent within browsers; sometimes labeled as just big5.
    //    MS Internet Explorer switches from big5 to big5-hkscs when a patch applied.
    //    Great discussion & recap of what's going on https://bugzilla.mozilla.org/show_bug.cgi?id=912470#c31
    //    In the encoder, it might make sense to support encoding old PUA mappings to Big5 bytes seq-s.
    //    Official spec: http://www.ogcio.gov.hk/en/business/tech_promotion/ccli/terms/doc/2003cmp_2008.txt
    //                   http://www.ogcio.gov.hk/tc/business/tech_promotion/ccli/terms/doc/hkscs-2008-big5-iso.txt
    // 
    // Current understanding of how to deal with Big5(-HKSCS) is in the Encoding Standard, http://encoding.spec.whatwg.org/#big5-encoder
    // Unicode mapping (http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/OTHER/BIG5.TXT) is said to be wrong.

    'windows950': 'cp950',
    'ms950': 'cp950',
    '950': 'cp950',
    'cp950': {
        type: '_dbcs',
        table: function() { return require('./tables/cp950.json') },
    },

    // Big5 has many variations and is an extension of cp950. We use Encoding Standard's as a consensus.
    'big5': 'big5hkscs',
    'big5hkscs': {
        type: '_dbcs',
        table: function() { return require('./tables/cp950.json').concat(require('./tables/big5-added.json')) },
        encodeSkipVals: [0xa2cc],
    },

    'cnbig5': 'big5hkscs',
    'csbig5': 'big5hkscs',
    'xxbig5': 'big5hkscs',
};
"use strict";

// Update this array if you add/rename/remove files in this directory.
// We support Browserify by skipping automatic module discovery and requiring modules directly.
var modules = [
    require("./internal"),
    require("./utf16"),
    require("./utf7"),
    require("./sbcs-codec"),
    require("./sbcs-data"),
    require("./sbcs-data-generated"),
    require("./dbcs-codec"),
    require("./dbcs-data"),
];

// Put all encoding/alias/codec definitions to single object and export it. 
for (var i = 0; i < modules.length; i++) {
    var module = modules[i];
    for (var enc in module)
        if (Object.prototype.hasOwnProperty.call(module, enc))
            exports[enc] = module[enc];
}
"use strict";
var Buffer = require("safer-buffer").Buffer;

// Export Node.js internal encodings.

module.exports = {
    // Encodings
    utf8:   { type: "_internal", bomAware: true},
    cesu8:  { type: "_internal", bomAware: true},
    unicode11utf8: "utf8",

    ucs2:   { type: "_internal", bomAware: true},
    utf16le: "ucs2",

    binary: { type: "_internal" },
    base64: { type: "_internal" },
    hex:    { type: "_internal" },

    // Codec.
    _internal: InternalCodec,
};

//------------------------------------------------------------------------------

function InternalCodec(codecOptions, iconv) {
    this.enc = codecOptions.encodingName;
    this.bomAware = codecOptions.bomAware;

    if (this.enc === "base64")
        this.encoder = InternalEncoderBase64;
    else if (this.enc === "cesu8") {
        this.enc = "utf8"; // Use utf8 for decoding.
        this.encoder = InternalEncoderCesu8;

        // Add decoder for versions of Node not supporting CESU-8
        if (Buffer.from('eda0bdedb2a9', 'hex').toString() !== '💩') {
            this.decoder = InternalDecoderCesu8;
            this.defaultCharUnicode = iconv.defaultCharUnicode;
        }
    }
}

InternalCodec.prototype.encoder = InternalEncoder;
InternalCodec.prototype.decoder = InternalDecoder;

//------------------------------------------------------------------------------

// We use node.js internal decoder. Its signature is the same as ours.
var StringDecoder = require('string_decoder').StringDecoder;

if (!StringDecoder.prototype.end) // Node v0.8 doesn't have this method.
    StringDecoder.prototype.end = function() {};


function InternalDecoder(options, codec) {
    StringDecoder.call(this, codec.enc);
}

InternalDecoder.prototype = StringDecoder.prototype;


//------------------------------------------------------------------------------
// Encoder is mostly trivial

function InternalEncoder(options, codec) {
    this.enc = codec.enc;
}

InternalEncoder.prototype.write = function(str) {
    return Buffer.from(str, this.enc);
}

InternalEncoder.prototype.end = function() {
}


//------------------------------------------------------------------------------
// Except base64 encoder, which must keep its state.

function InternalEncoderBase64(options, codec) {
    this.prevStr = '';
}

InternalEncoderBase64.prototype.write = function(str) {
    str = this.prevStr + str;
    var completeQuads = str.length - (str.length % 4);
    this.prevStr = str.slice(completeQuads);
    str = str.slice(0, completeQuads);

    return Buffer.from(str, "base64");
}

InternalEncoderBase64.prototype.end = function() {
    return Buffer.from(this.prevStr, "base64");
}


//------------------------------------------------------------------------------
// CESU-8 encoder is also special.

function InternalEncoderCesu8(options, codec) {
}

InternalEncoderCesu8.prototype.write = function(str) {
    var buf = Buffer.alloc(str.length * 3), bufIdx = 0;
    for (var i = 0; i < str.length; i++) {
        var charCode = str.charCodeAt(i);
        // Naive implementation, but it works because CESU-8 is especially easy
        // to convert from UTF-16 (which all JS strings are encoded in).
        if (charCode < 0x80)
            buf[bufIdx++] = charCode;
        else if (charCode < 0x800) {
            buf[bufIdx++] = 0xC0 + (charCode >>> 6);
            buf[bufIdx++] = 0x80 + (charCode & 0x3f);
        }
        else { // charCode will always be < 0x10000 in javascript.
            buf[bufIdx++] = 0xE0 + (charCode >>> 12);
            buf[bufIdx++] = 0x80 + ((charCode >>> 6) & 0x3f);
            buf[bufIdx++] = 0x80 + (charCode & 0x3f);
        }
    }
    return buf.slice(0, bufIdx);
}

InternalEncoderCesu8.prototype.end = function() {
}

//------------------------------------------------------------------------------
// CESU-8 decoder is not implemented in Node v4.0+

function InternalDecoderCesu8(options, codec) {
    this.acc = 0;
    this.contBytes = 0;
    this.accBytes = 0;
    this.defaultCharUnicode = codec.defaultCharUnicode;
}

InternalDecoderCesu8.prototype.write = function(buf) {
    var acc = this.acc, contBytes = this.contBytes, accBytes = this.accBytes, 
        res = '';
    for (var i = 0; i < buf.length; i++) {
        var curByte = buf[i];
        if ((curByte & 0xC0) !== 0x80) { // Leading byte
            if (contBytes > 0) { // Previous code is invalid
                res += this.defaultCharUnicode;
                contBytes = 0;
            }

            if (curByte < 0x80) { // Single-byte code
                res += String.fromCharCode(curByte);
            } else if (curByte < 0xE0) { // Two-byte code
                acc = curByte & 0x1F;
                contBytes = 1; accBytes = 1;
            } else if (curByte < 0xF0) { // Three-byte code
                acc = curByte & 0x0F;
                contBytes = 2; accBytes = 1;
            } else { // Four or more are not supported for CESU-8.
                res += this.defaultCharUnicode;
            }
        } else { // Continuation byte
            if (contBytes > 0) { // We're waiting for it.
                acc = (acc << 6) | (curByte & 0x3f);
                contBytes--; accBytes++;
                if (contBytes === 0) {
                    // Check for overlong encoding, but support Modified UTF-8 (encoding NULL as C0 80)
                    if (accBytes === 2 && acc < 0x80 && acc > 0)
                        res += this.defaultCharUnicode;
                    else if (accBytes === 3 && acc < 0x800)
                        res += this.defaultCharUnicode;
                    else
                        // Actually add character.
                        res += String.fromCharCode(acc);
                }
            } else { // Unexpected continuation byte
                res += this.defaultCharUnicode;
            }
        }
    }
    this.acc = acc; this.contBytes = contBytes; this.accBytes = accBytes;
    return res;
}

InternalDecoderCesu8.prototype.end = function() {
    var res = 0;
    if (this.contBytes > 0)
        res += this.defaultCharUnicode;
    return res;
}
"use strict";
var Buffer = require("safer-buffer").Buffer;

// Single-byte codec. Needs a 'chars' string parameter that contains 256 or 128 chars that
// correspond to encoded bytes (if 128 - then lower half is ASCII). 

exports._sbcs = SBCSCodec;
function SBCSCodec(codecOptions, iconv) {
    if (!codecOptions)
        throw new Error("SBCS codec is called without the data.")
    
    // Prepare char buffer for decoding.
    if (!codecOptions.chars || (codecOptions.chars.length !== 128 && codecOptions.chars.length !== 256))
        throw new Error("Encoding '"+codecOptions.type+"' has incorrect 'chars' (must be of len 128 or 256)");
    
    if (codecOptions.chars.length === 128) {
        var asciiString = "";
        for (var i = 0; i < 128; i++)
            asciiString += String.fromCharCode(i);
        codecOptions.chars = asciiString + codecOptions.chars;
    }

    this.decodeBuf = Buffer.from(codecOptions.chars, 'ucs2');
    
    // Encoding buffer.
    var encodeBuf = Buffer.alloc(65536, iconv.defaultCharSingleByte.charCodeAt(0));

    for (var i = 0; i < codecOptions.chars.length; i++)
        encodeBuf[codecOptions.chars.charCodeAt(i)] = i;

    this.encodeBuf = encodeBuf;
}

SBCSCodec.prototype.encoder = SBCSEncoder;
SBCSCodec.prototype.decoder = SBCSDecoder;


function SBCSEncoder(options, codec) {
    this.encodeBuf = codec.encodeBuf;
}

SBCSEncoder.prototype.write = function(str) {
    var buf = Buffer.alloc(str.length);
    for (var i = 0; i < str.length; i++)
        buf[i] = this.encodeBuf[str.charCodeAt(i)];
    
    return buf;
}

SBCSEncoder.prototype.end = function() {
}


function SBCSDecoder(options, codec) {
    this.decodeBuf = codec.decodeBuf;
}

SBCSDecoder.prototype.write = function(buf) {
    // Strings are immutable in JS -> we use ucs2 buffer to speed up computations.
    var decodeBuf = this.decodeBuf;
    var newBuf = Buffer.alloc(buf.length*2);
    var idx1 = 0, idx2 = 0;
    for (var i = 0; i < buf.length; i++) {
        idx1 = buf[i]*2; idx2 = i*2;
        newBuf[idx2] = decodeBuf[idx1];
        newBuf[idx2+1] = decodeBuf[idx1+1];
    }
    return newBuf.toString('ucs2');
}

SBCSDecoder.prototype.end = function() {
}
"use strict";

// Generated data for sbcs codec. Don't edit manually. Regenerate using generation/gen-sbcs.js script.
module.exports = {
  "437": "cp437",
  "737": "cp737",
  "775": "cp775",
  "850": "cp850",
  "852": "cp852",
  "855": "cp855",
  "856": "cp856",
  "857": "cp857",
  "858": "cp858",
  "860": "cp860",
  "861": "cp861",
  "862": "cp862",
  "863": "cp863",
  "864": "cp864",
  "865": "cp865",
  "866": "cp866",
  "869": "cp869",
  "874": "windows874",
  "922": "cp922",
  "1046": "cp1046",
  "1124": "cp1124",
  "1125": "cp1125",
  "1129": "cp1129",
  "1133": "cp1133",
  "1161": "cp1161",
  "1162": "cp1162",
  "1163": "cp1163",
  "1250": "windows1250",
  "1251": "windows1251",
  "1252": "windows1252",
  "1253": "windows1253",
  "1254": "windows1254",
  "1255": "windows1255",
  "1256": "windows1256",
  "1257": "windows1257",
  "1258": "windows1258",
  "28591": "iso88591",
  "28592": "iso88592",
  "28593": "iso88593",
  "28594": "iso88594",
  "28595": "iso88595",
  "28596": "iso88596",
  "28597": "iso88597",
  "28598": "iso88598",
  "28599": "iso88599",
  "28600": "iso885910",
  "28601": "iso885911",
  "28603": "iso885913",
  "28604": "iso885914",
  "28605": "iso885915",
  "28606": "iso885916",
  "windows874": {
    "type": "_sbcs",
    "chars": "€����…�����������‘’“”•–—�������� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����"
  },
  "win874": "windows874",
  "cp874": "windows874",
  "windows1250": {
    "type": "_sbcs",
    "chars": "€�‚�„…†‡�‰Š‹ŚŤŽŹ�‘’“”•–—�™š›śťžź ˇ˘Ł¤Ą¦§¨©Ş«¬­®Ż°±˛ł´µ¶·¸ąş»Ľ˝ľżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙"
  },
  "win1250": "windows1250",
  "cp1250": "windows1250",
  "windows1251": {
    "type": "_sbcs",
    "chars": "ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—�™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬­®Ї°±Ііґµ¶·ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя"
  },
  "win1251": "windows1251",
  "cp1251": "windows1251",
  "windows1252": {
    "type": "_sbcs",
    "chars": "€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
  },
  "win1252": "windows1252",
  "cp1252": "windows1252",
  "windows1253": {
    "type": "_sbcs",
    "chars": "€�‚ƒ„…†‡�‰�‹�����‘’“”•–—�™�›���� ΅Ά£¤¥¦§¨©�«¬­®―°±²³΄µ¶·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�"
  },
  "win1253": "windows1253",
  "cp1253": "windows1253",
  "windows1254": {
    "type": "_sbcs",
    "chars": "€�‚ƒ„…†‡ˆ‰Š‹Œ����‘’“”•–—˜™š›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖ×ØÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ"
  },
  "win1254": "windows1254",
  "cp1254": "windows1254",
  "windows1255": {
    "type": "_sbcs",
    "chars": "€�‚ƒ„…†‡ˆ‰�‹�����‘’“”•–—˜™�›���� ¡¢£₪¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾¿ְֱֲֳִֵֶַָֹֺֻּֽ־ֿ׀ׁׂ׃װױײ׳״�������אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏�"
  },
  "win1255": "windows1255",
  "cp1255": "windows1255",
  "windows1256": {
    "type": "_sbcs",
    "chars": "€پ‚ƒ„…†‡ˆ‰ٹ‹Œچژڈگ‘’“”•–—ک™ڑ›œ‌‍ں ،¢£¤¥¦§¨©ھ«¬­®¯°±²³´µ¶·¸¹؛»¼½¾؟ہءآأؤإئابةتثجحخدذرزسشصض×طظعغـفقكàلâمنهوçèéêëىيîïًٌٍَôُِ÷ّùْûü‎‏ے"
  },
  "win1256": "windows1256",
  "cp1256": "windows1256",
  "windows1257": {
    "type": "_sbcs",
    "chars": "€�‚�„…†‡�‰�‹�¨ˇ¸�‘’“”•–—�™�›�¯˛� �¢£¤�¦§Ø©Ŗ«¬­®Æ°±²³´µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž˙"
  },
  "win1257": "windows1257",
  "cp1257": "windows1257",
  "windows1258": {
    "type": "_sbcs",
    "chars": "€�‚ƒ„…†‡ˆ‰�‹Œ����‘’“”•–—˜™�›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ"
  },
  "win1258": "windows1258",
  "cp1258": "windows1258",
  "iso88591": {
    "type": "_sbcs",
    "chars": " ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
  },
  "cp28591": "iso88591",
  "iso88592": {
    "type": "_sbcs",
    "chars": " Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙"
  },
  "cp28592": "iso88592",
  "iso88593": {
    "type": "_sbcs",
    "chars": " Ħ˘£¤�Ĥ§¨İŞĞĴ­�Ż°ħ²³´µĥ·¸ışğĵ½�żÀÁÂ�ÄĊĈÇÈÉÊËÌÍÎÏ�ÑÒÓÔĠÖ×ĜÙÚÛÜŬŜßàáâ�äċĉçèéêëìíîï�ñòóôġö÷ĝùúûüŭŝ˙"
  },
  "cp28593": "iso88593",
  "iso88594": {
    "type": "_sbcs",
    "chars": " ĄĸŖ¤ĨĻ§¨ŠĒĢŦ­Ž¯°ą˛ŗ´ĩļˇ¸šēģŧŊžŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎĪĐŅŌĶÔÕÖ×ØŲÚÛÜŨŪßāáâãäåæįčéęëėíîīđņōķôõö÷øųúûüũū˙"
  },
  "cp28594": "iso88594",
  "iso88595": {
    "type": "_sbcs",
    "chars": " ЁЂЃЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ"
  },
  "cp28595": "iso88595",
  "iso88596": {
    "type": "_sbcs",
    "chars": " ���¤�������،­�������������؛���؟�ءآأؤإئابةتثجحخدذرزسشصضطظعغ�����ـفقكلمنهوىيًٌٍَُِّْ�������������"
  },
  "cp28596": "iso88596",
  "iso88597": {
    "type": "_sbcs",
    "chars": " ‘’£€₯¦§¨©ͺ«¬­�―°±²³΄΅Ά·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�"
  },
  "cp28597": "iso88597",
  "iso88598": {
    "type": "_sbcs",
    "chars": " �¢£¤¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾��������������������������������‗אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏�"
  },
  "cp28598": "iso88598",
  "iso88599": {
    "type": "_sbcs",
    "chars": " ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖ×ØÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ"
  },
  "cp28599": "iso88599",
  "iso885910": {
    "type": "_sbcs",
    "chars": " ĄĒĢĪĨĶ§ĻĐŠŦŽ­ŪŊ°ąēģīĩķ·ļđšŧž―ūŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎÏÐŅŌÓÔÕÖŨØŲÚÛÜÝÞßāáâãäåæįčéęëėíîïðņōóôõöũøųúûüýþĸ"
  },
  "cp28600": "iso885910",
  "iso885911": {
    "type": "_sbcs",
    "chars": " กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����"
  },
  "cp28601": "iso885911",
  "iso885913": {
    "type": "_sbcs",
    "chars": " ”¢£¤„¦§Ø©Ŗ«¬­®Æ°±²³“µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž’"
  },
  "cp28603": "iso885913",
  "iso885914": {
    "type": "_sbcs",
    "chars": " Ḃḃ£ĊċḊ§Ẁ©ẂḋỲ­®ŸḞḟĠġṀṁ¶ṖẁṗẃṠỳẄẅṡÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏŴÑÒÓÔÕÖṪØÙÚÛÜÝŶßàáâãäåæçèéêëìíîïŵñòóôõöṫøùúûüýŷÿ"
  },
  "cp28604": "iso885914",
  "iso885915": {
    "type": "_sbcs",
    "chars": " ¡¢£€¥Š§š©ª«¬­®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
  },
  "cp28605": "iso885915",
  "iso885916": {
    "type": "_sbcs",
    "chars": " ĄąŁ€„Š§š©Ș«Ź­źŻ°±ČłŽ”¶·žčș»ŒœŸżÀÁÂĂÄĆÆÇÈÉÊËÌÍÎÏĐŃÒÓÔŐÖŚŰÙÚÛÜĘȚßàáâăäćæçèéêëìíîïđńòóôőöśűùúûüęțÿ"
  },
  "cp28606": "iso885916",
  "cp437": {
    "type": "_sbcs",
    "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñÑªº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
  },
  "ibm437": "cp437",
  "csibm437": "cp437",
  "cp737": {
    "type": "_sbcs",
    "chars": "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρσςτυφχψ░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ωάέήϊίόύϋώΆΈΉΊΌΎΏ±≥≤ΪΫ÷≈°∙·√ⁿ²■ "
  },
  "ibm737": "cp737",
  "csibm737": "cp737",
  "cp775": {
    "type": "_sbcs",
    "chars": "ĆüéāäģåćłēŖŗīŹÄÅÉæÆōöĢ¢ŚśÖÜø£Ø×¤ĀĪóŻżź”¦©®¬½¼Ł«»░▒▓│┤ĄČĘĖ╣║╗╝ĮŠ┐└┴┬├─┼ŲŪ╚╔╩╦╠═╬Žąčęėįšųūž┘┌█▄▌▐▀ÓßŌŃõÕµńĶķĻļņĒŅ’­±“¾¶§÷„°∙·¹³²■ "
  },
  "ibm775": "cp775",
  "csibm775": "cp775",
  "cp850": {
    "type": "_sbcs",
    "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñÑªº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýÝ¯´­±‗¾¶§÷¸°¨·¹³²■ "
  },
  "ibm850": "cp850",
  "csibm850": "cp850",
  "cp852": {
    "type": "_sbcs",
    "chars": "ÇüéâäůćçłëŐőîŹÄĆÉĹĺôöĽľŚśÖÜŤťŁ×čáíóúĄąŽžĘę¬źČş«»░▒▓│┤ÁÂĚŞ╣║╗╝Żż┐└┴┬├─┼Ăă╚╔╩╦╠═╬¤đĐĎËďŇÍÎě┘┌█▄ŢŮ▀ÓßÔŃńňŠšŔÚŕŰýÝţ´­˝˛ˇ˘§÷¸°¨˙űŘř■ "
  },
  "ibm852": "cp852",
  "csibm852": "cp852",
  "cp855": {
    "type": "_sbcs",
    "chars": "ђЂѓЃёЁєЄѕЅіІїЇјЈљЉњЊћЋќЌўЎџЏюЮъЪаАбБцЦдДеЕфФгГ«»░▒▓│┤хХиИ╣║╗╝йЙ┐└┴┬├─┼кК╚╔╩╦╠═╬¤лЛмМнНоОп┘┌█▄Пя▀ЯрРсСтТуУжЖвВьЬ№­ыЫзЗшШэЭщЩчЧ§■ "
  },
  "ibm855": "cp855",
  "csibm855": "cp855",
  "cp856": {
    "type": "_sbcs",
    "chars": "אבגדהוזחטיךכלםמןנסעףפץצקרשת�£�×����������®¬½¼�«»░▒▓│┤���©╣║╗╝¢¥┐└┴┬├─┼��╚╔╩╦╠═╬¤���������┘┌█▄¦�▀������µ�������¯´­±‗¾¶§÷¸°¨·¹³²■ "
  },
  "ibm856": "cp856",
  "csibm856": "cp856",
  "cp857": {
    "type": "_sbcs",
    "chars": "ÇüéâäàåçêëèïîıÄÅÉæÆôöòûùİÖÜø£ØŞşáíóúñÑĞğ¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ºªÊËÈ�ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµ�×ÚÛÙìÿ¯´­±�¾¶§÷¸°¨·¹³²■ "
  },
  "ibm857": "cp857",
  "csibm857": "cp857",
  "cp858": {
    "type": "_sbcs",
    "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñÑªº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈ€ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýÝ¯´­±‗¾¶§÷¸°¨·¹³²■ "
  },
  "ibm858": "cp858",
  "csibm858": "cp858",
  "cp860": {
    "type": "_sbcs",
    "chars": "ÇüéâãàÁçêÊèÍÔìÃÂÉÀÈôõòÚùÌÕÜ¢£Ù₧ÓáíóúñÑªº¿Ò¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
  },
  "ibm860": "cp860",
  "csibm860": "cp860",
  "cp861": {
    "type": "_sbcs",
    "chars": "ÇüéâäàåçêëèÐðÞÄÅÉæÆôöþûÝýÖÜø£Ø₧ƒáíóúÁÍÓÚ¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
  },
  "ibm861": "cp861",
  "csibm861": "cp861",
  "cp862": {
    "type": "_sbcs",
    "chars": "אבגדהוזחטיךכלםמןנסעףפץצקרשת¢£¥₧ƒáíóúñÑªº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
  },
  "ibm862": "cp862",
  "csibm862": "cp862",
  "cp863": {
    "type": "_sbcs",
    "chars": "ÇüéâÂà¶çêëèïî‗À§ÉÈÊôËÏûù¤ÔÜ¢£ÙÛƒ¦´óú¨¸³¯Î⌐¬½¼¾«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
  },
  "ibm863": "cp863",
  "csibm863": "cp863",
  "cp864": {
    "type": "_sbcs",
    "chars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$٪&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~°·∙√▒─│┼┤┬├┴┐┌└┘β∞φ±½¼≈«»ﻷﻸ��ﻻﻼ� ­ﺂ£¤ﺄ��ﺎﺏﺕﺙ،ﺝﺡﺥ٠١٢٣٤٥٦٧٨٩ﻑ؛ﺱﺵﺹ؟¢ﺀﺁﺃﺅﻊﺋﺍﺑﺓﺗﺛﺟﺣﺧﺩﺫﺭﺯﺳﺷﺻﺿﻁﻅﻋﻏ¦¬÷×ﻉـﻓﻗﻛﻟﻣﻧﻫﻭﻯﻳﺽﻌﻎﻍﻡﹽّﻥﻩﻬﻰﻲﻐﻕﻵﻶﻝﻙﻱ■�"
  },
  "ibm864": "cp864",
  "csibm864": "cp864",
  "cp865": {
    "type": "_sbcs",
    "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø₧ƒáíóúñÑªº¿⌐¬½¼¡«¤░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
  },
  "ibm865": "cp865",
  "csibm865": "cp865",
  "cp866": {
    "type": "_sbcs",
    "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№¤■ "
  },
  "ibm866": "cp866",
  "csibm866": "cp866",
  "cp869": {
    "type": "_sbcs",
    "chars": "������Ά�·¬¦‘’Έ―ΉΊΪΌ��ΎΫ©Ώ²³ά£έήίϊΐόύΑΒΓΔΕΖΗ½ΘΙ«»░▒▓│┤ΚΛΜΝ╣║╗╝ΞΟ┐└┴┬├─┼ΠΡ╚╔╩╦╠═╬ΣΤΥΦΧΨΩαβγ┘┌█▄δε▀ζηθικλμνξοπρσςτ΄­±υφχ§ψ΅°¨ωϋΰώ■ "
  },
  "ibm869": "cp869",
  "csibm869": "cp869",
  "cp922": {
    "type": "_sbcs",
    "chars": " ¡¢£¤¥¦§¨©ª«¬­®‾°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏŠÑÒÓÔÕÖ×ØÙÚÛÜÝŽßàáâãäåæçèéêëìíîïšñòóôõö÷øùúûüýžÿ"
  },
  "ibm922": "cp922",
  "csibm922": "cp922",
  "cp1046": {
    "type": "_sbcs",
    "chars": "ﺈ×÷ﹱ■│─┐┌└┘ﹹﹻﹽﹿﹷﺊﻰﻳﻲﻎﻏﻐﻶﻸﻺﻼ ¤ﺋﺑﺗﺛﺟﺣ،­ﺧﺳ٠١٢٣٤٥٦٧٨٩ﺷ؛ﺻﺿﻊ؟ﻋءآأؤإئابةتثجحخدذرزسشصضطﻇعغﻌﺂﺄﺎﻓـفقكلمنهوىيًٌٍَُِّْﻗﻛﻟﻵﻷﻹﻻﻣﻧﻬﻩ�"
  },
  "ibm1046": "cp1046",
  "csibm1046": "cp1046",
  "cp1124": {
    "type": "_sbcs",
    "chars": " ЁЂҐЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђґєѕіїјљњћќ§ўџ"
  },
  "ibm1124": "cp1124",
  "csibm1124": "cp1124",
  "cp1125": {
    "type": "_sbcs",
    "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёҐґЄєІіЇї·√№¤■ "
  },
  "ibm1125": "cp1125",
  "csibm1125": "cp1125",
  "cp1129": {
    "type": "_sbcs",
    "chars": " ¡¢£¤¥¦§œ©ª«¬­®¯°±²³Ÿµ¶·Œ¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ"
  },
  "ibm1129": "cp1129",
  "csibm1129": "cp1129",
  "cp1133": {
    "type": "_sbcs",
    "chars": " ກຂຄງຈສຊຍດຕຖທນບປຜຝພຟມຢຣລວຫອຮ���ຯະາຳິີຶືຸູຼັົຽ���ເແໂໃໄ່້໊໋໌ໍໆ�ໜໝ₭����������������໐໑໒໓໔໕໖໗໘໙��¢¬¦�"
  },
  "ibm1133": "cp1133",
  "csibm1133": "cp1133",
  "cp1161": {
    "type": "_sbcs",
    "chars": "��������������������������������่กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู้๊๋€฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛¢¬¦ "
  },
  "ibm1161": "cp1161",
  "csibm1161": "cp1161",
  "cp1162": {
    "type": "_sbcs",
    "chars": "€…‘’“”•–— กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����"
  },
  "ibm1162": "cp1162",
  "csibm1162": "cp1162",
  "cp1163": {
    "type": "_sbcs",
    "chars": " ¡¢£€¥¦§œ©ª«¬­®¯°±²³Ÿµ¶·Œ¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ"
  },
  "ibm1163": "cp1163",
  "csibm1163": "cp1163",
  "maccroatian": {
    "type": "_sbcs",
    "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®Š™´¨≠ŽØ∞±≤≥∆µ∂∑∏š∫ªºΩžø¿¡¬√ƒ≈Ć«Č… ÀÃÕŒœĐ—“”‘’÷◊�©⁄¤‹›Æ»–·‚„‰ÂćÁčÈÍÎÏÌÓÔđÒÚÛÙıˆ˜¯πË˚¸Êæˇ"
  },
  "maccyrillic": {
    "type": "_sbcs",
    "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°¢£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµ∂ЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤"
  },
  "macgreek": {
    "type": "_sbcs",
    "chars": "Ä¹²É³ÖÜ΅àâä΄¨çéèêë£™îï•½‰ôö¦­ùûü†ΓΔΘΛΞΠß®©ΣΪ§≠°·Α±≤≥¥ΒΕΖΗΙΚΜΦΫΨΩάΝ¬ΟΡ≈Τ«»… ΥΧΆΈœ–―“”‘’÷ΉΊΌΎέήίόΏύαβψδεφγηιξκλμνοπώρστθωςχυζϊϋΐΰ�"
  },
  "maciceland": {
    "type": "_sbcs",
    "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûüÝ°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤ÐðÞþý·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ"
  },
  "macroman": {
    "type": "_sbcs",
    "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›ﬁﬂ‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ"
  },
  "macromania": {
    "type": "_sbcs",
    "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ĂŞ∞±≤≥¥µ∂∑∏π∫ªºΩăş¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›Ţţ‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ"
  },
  "macthai": {
    "type": "_sbcs",
    "chars": "«»…“”�•‘’� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู﻿​–—฿เแโใไๅๆ็่้๊๋์ํ™๏๐๑๒๓๔๕๖๗๘๙®©����"
  },
  "macturkish": {
    "type": "_sbcs",
    "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸĞğİıŞş‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙ�ˆ˜¯˘˙˚¸˝˛ˇ"
  },
  "macukraine": {
    "type": "_sbcs",
    "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°Ґ£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµґЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤"
  },
  "koi8r": {
    "type": "_sbcs",
    "chars": "─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ё╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡Ё╢╣╤╥╦╧╨╩╪╫╬©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ"
  },
  "koi8u": {
    "type": "_sbcs",
    "chars": "─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ёє╔ії╗╘╙╚╛ґ╝╞╟╠╡ЁЄ╣ІЇ╦╧╨╩╪Ґ╬©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ"
  },
  "koi8ru": {
    "type": "_sbcs",
    "chars": "─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ёє╔ії╗╘╙╚╛ґў╞╟╠╡ЁЄ╣ІЇ╦╧╨╩╪ҐЎ©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ"
  },
  "koi8t": {
    "type": "_sbcs",
    "chars": "қғ‚Ғ„…†‡�‰ҳ‹ҲҷҶ�Қ‘’“”•–—�™�›�����ӯӮё¤ӣ¦§���«¬­®�°±²Ё�Ӣ¶·�№�»���©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ"
  },
  "armscii8": {
    "type": "_sbcs",
    "chars": " �և։)(»«—.՝,-֊…՜՛՞ԱաԲբԳգԴդԵեԶզԷէԸըԹթԺժԻիԼլԽխԾծԿկՀհՁձՂղՃճՄմՅյՆնՇշՈոՉչՊպՋջՌռՍսՎվՏտՐրՑցՒւՓփՔքՕօՖֆ՚�"
  },
  "rk1048": {
    "type": "_sbcs",
    "chars": "ЂЃ‚ѓ„…†‡€‰Љ‹ЊҚҺЏђ‘’“”•–—�™љ›њқһџ ҰұӘ¤Ө¦§Ё©Ғ«¬­®Ү°±Ііөµ¶·ё№ғ»әҢңүАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя"
  },
  "tcvn": {
    "type": "_sbcs",
    "chars": "\u0000ÚỤ\u0003ỪỬỮ\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010ỨỰỲỶỸÝỴ\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÀẢÃÁẠẶẬÈẺẼÉẸỆÌỈĨÍỊÒỎÕÓỌỘỜỞỠỚỢÙỦŨ ĂÂÊÔƠƯĐăâêôơưđẶ̀̀̉̃́àảãáạẲằẳẵắẴẮẦẨẪẤỀặầẩẫấậèỂẻẽéẹềểễếệìỉỄẾỒĩíịòỔỏõóọồổỗốộờởỡớợùỖủũúụừửữứựỳỷỹýỵỐ"
  },
  "georgianacademy": {
    "type": "_sbcs",
    "chars": "‚ƒ„…†‡ˆ‰Š‹Œ‘’“”•–—˜™š›œŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿აბგდევზთიკლმნოპჟრსტუფქღყშჩცძწჭხჯჰჱჲჳჴჵჶçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
  },
  "georgianps": {
    "type": "_sbcs",
    "chars": "‚ƒ„…†‡ˆ‰Š‹Œ‘’“”•–—˜™š›œŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿აბგდევზჱთიკლმნჲოპჟრსტჳუფქღყშჩცძწჭხჴჯჰჵæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
  },
  "pt154": {
    "type": "_sbcs",
    "chars": "ҖҒӮғ„…ҶҮҲүҠӢҢҚҺҸҗ‘’“”•–—ҳҷҡӣңқһҹ ЎўЈӨҘҰ§Ё©Ә«¬ӯ®Ҝ°ұІіҙө¶·ё№ә»јҪҫҝАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя"
  },
  "viscii": {
    "type": "_sbcs",
    "chars": "\u0000\u0001Ẳ\u0003\u0004ẴẪ\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013Ỷ\u0015\u0016\u0017\u0018Ỹ\u001a\u001b\u001c\u001dỴ\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ẠẮẰẶẤẦẨẬẼẸẾỀỂỄỆỐỒỔỖỘỢỚỜỞỊỎỌỈỦŨỤỲÕắằặấầẩậẽẹếềểễệốồổỗỠƠộờởịỰỨỪỬơớƯÀÁÂÃẢĂẳẵÈÉÊẺÌÍĨỳĐứÒÓÔạỷừửÙÚỹỵÝỡưàáâãảăữẫèéêẻìíĩỉđựòóôõỏọụùúũủýợỮ"
  },
  "iso646cn": {
    "type": "_sbcs",
    "chars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}‾��������������������������������������������������������������������������������������������������������������������������������"
  },
  "iso646jp": {
    "type": "_sbcs",
    "chars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[¥]^_`abcdefghijklmnopqrstuvwxyz{|}‾��������������������������������������������������������������������������������������������������������������������������������"
  },
  "hproman8": {
    "type": "_sbcs",
    "chars": " ÀÂÈÊËÎÏ´ˋˆ¨˜ÙÛ₤¯Ýý°ÇçÑñ¡¿¤£¥§ƒ¢âêôûáéóúàèòùäëöüÅîØÆåíøæÄìÖÜÉïßÔÁÃãÐðÍÌÓÒÕõŠšÚŸÿÞþ·µ¶¾—¼½ªº«■»±�"
  },
  "macintosh": {
    "type": "_sbcs",
    "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›ﬁﬂ‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ"
  },
  "ascii": {
    "type": "_sbcs",
    "chars": "��������������������������������������������������������������������������������������������������������������������������������"
  },
  "tis620": {
    "type": "_sbcs",
    "chars": "���������������������������������กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����"
  }
}"use strict";

// Manually added data to be used by sbcs codec in addition to generated one.

module.exports = {
    // Not supported by iconv, not sure why.
    "10029": "maccenteuro",
    "maccenteuro": {
        "type": "_sbcs",
        "chars": "ÄĀāÉĄÖÜáąČäčĆćéŹźĎíďĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅņŃ¬√ńŇ∆«»… ňŐÕőŌ–—“”‘’÷◊ōŔŕŘ‹›řŖŗŠ‚„šŚśÁŤťÍŽžŪÓÔūŮÚůŰűŲųÝýķŻŁżĢˇ"
    },

    "808": "cp808",
    "ibm808": "cp808",
    "cp808": {
        "type": "_sbcs",
        "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№€■ "
    },

    "mik": {
        "type": "_sbcs",
        "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя└┴┬├─┼╣║╚╔╩╦╠═╬┐░▒▓│┤№§╗╝┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
    },

    // Aliases of generated encodings.
    "ascii8bit": "ascii",
    "usascii": "ascii",
    "ansix34": "ascii",
    "ansix341968": "ascii",
    "ansix341986": "ascii",
    "csascii": "ascii",
    "cp367": "ascii",
    "ibm367": "ascii",
    "isoir6": "ascii",
    "iso646us": "ascii",
    "iso646irv": "ascii",
    "us": "ascii",

    "latin1": "iso88591",
    "latin2": "iso88592",
    "latin3": "iso88593",
    "latin4": "iso88594",
    "latin5": "iso88599",
    "latin6": "iso885910",
    "latin7": "iso885913",
    "latin8": "iso885914",
    "latin9": "iso885915",
    "latin10": "iso885916",

    "csisolatin1": "iso88591",
    "csisolatin2": "iso88592",
    "csisolatin3": "iso88593",
    "csisolatin4": "iso88594",
    "csisolatincyrillic": "iso88595",
    "csisolatinarabic": "iso88596",
    "csisolatingreek" : "iso88597",
    "csisolatinhebrew": "iso88598",
    "csisolatin5": "iso88599",
    "csisolatin6": "iso885910",

    "l1": "iso88591",
    "l2": "iso88592",
    "l3": "iso88593",
    "l4": "iso88594",
    "l5": "iso88599",
    "l6": "iso885910",
    "l7": "iso885913",
    "l8": "iso885914",
    "l9": "iso885915",
    "l10": "iso885916",

    "isoir14": "iso646jp",
    "isoir57": "iso646cn",
    "isoir100": "iso88591",
    "isoir101": "iso88592",
    "isoir109": "iso88593",
    "isoir110": "iso88594",
    "isoir144": "iso88595",
    "isoir127": "iso88596",
    "isoir126": "iso88597",
    "isoir138": "iso88598",
    "isoir148": "iso88599",
    "isoir157": "iso885910",
    "isoir166": "tis620",
    "isoir179": "iso885913",
    "isoir199": "iso885914",
    "isoir203": "iso885915",
    "isoir226": "iso885916",

    "cp819": "iso88591",
    "ibm819": "iso88591",

    "cyrillic": "iso88595",

    "arabic": "iso88596",
    "arabic8": "iso88596",
    "ecma114": "iso88596",
    "asmo708": "iso88596",

    "greek" : "iso88597",
    "greek8" : "iso88597",
    "ecma118" : "iso88597",
    "elot928" : "iso88597",

    "hebrew": "iso88598",
    "hebrew8": "iso88598",

    "turkish": "iso88599",
    "turkish8": "iso88599",

    "thai": "iso885911",
    "thai8": "iso885911",

    "celtic": "iso885914",
    "celtic8": "iso885914",
    "isoceltic": "iso885914",

    "tis6200": "tis620",
    "tis62025291": "tis620",
    "tis62025330": "tis620",

    "10000": "macroman",
    "10006": "macgreek",
    "10007": "maccyrillic",
    "10079": "maciceland",
    "10081": "macturkish",

    "cspc8codepage437": "cp437",
    "cspc775baltic": "cp775",
    "cspc850multilingual": "cp850",
    "cspcp852": "cp852",
    "cspc862latinhebrew": "cp862",
    "cpgr": "cp869",

    "msee": "cp1250",
    "mscyrl": "cp1251",
    "msansi": "cp1252",
    "msgreek": "cp1253",
    "msturk": "cp1254",
    "mshebr": "cp1255",
    "msarab": "cp1256",
    "winbaltrim": "cp1257",

    "cp20866": "koi8r",
    "20866": "koi8r",
    "ibm878": "koi8r",
    "cskoi8r": "koi8r",

    "cp21866": "koi8u",
    "21866": "koi8u",
    "ibm1168": "koi8u",

    "strk10482002": "rk1048",

    "tcvn5712": "tcvn",
    "tcvn57121": "tcvn",

    "gb198880": "iso646cn",
    "cn": "iso646cn",

    "csiso14jisc6220ro": "iso646jp",
    "jisc62201969ro": "iso646jp",
    "jp": "iso646jp",

    "cshproman8": "hproman8",
    "r8": "hproman8",
    "roman8": "hproman8",
    "xroman8": "hproman8",
    "ibm1051": "hproman8",

    "mac": "macintosh",
    "csmacintosh": "macintosh",
};

"use strict";
var Buffer = require("safer-buffer").Buffer;

// Note: UTF16-LE (or UCS2) codec is Node.js native. See encodings/internal.js

// == UTF16-BE codec. ==========================================================

exports.utf16be = Utf16BECodec;
function Utf16BECodec() {
}

Utf16BECodec.prototype.encoder = Utf16BEEncoder;
Utf16BECodec.prototype.decoder = Utf16BEDecoder;
Utf16BECodec.prototype.bomAware = true;


// -- Encoding

function Utf16BEEncoder() {
}

Utf16BEEncoder.prototype.write = function(str) {
    var buf = Buffer.from(str, 'ucs2');
    for (var i = 0; i < buf.length; i += 2) {
        var tmp = buf[i]; buf[i] = buf[i+1]; buf[i+1] = tmp;
    }
    return buf;
}

Utf16BEEncoder.prototype.end = function() {
}


// -- Decoding

function Utf16BEDecoder() {
    this.overflowByte = -1;
}

Utf16BEDecoder.prototype.write = function(buf) {
    if (buf.length == 0)
        return '';

    var buf2 = Buffer.alloc(buf.length + 1),
        i = 0, j = 0;

    if (this.overflowByte !== -1) {
        buf2[0] = buf[0];
        buf2[1] = this.overflowByte;
        i = 1; j = 2;
    }

    for (; i < buf.length-1; i += 2, j+= 2) {
        buf2[j] = buf[i+1];
        buf2[j+1] = buf[i];
    }

    this.overflowByte = (i == buf.length-1) ? buf[buf.length-1] : -1;

    return buf2.slice(0, j).toString('ucs2');
}

Utf16BEDecoder.prototype.end = function() {
}


// == UTF-16 codec =============================================================
// Decoder chooses automatically from UTF-16LE and UTF-16BE using BOM and space-based heuristic.
// Defaults to UTF-16LE, as it's prevalent and default in Node.
// http://en.wikipedia.org/wiki/UTF-16 and http://encoding.spec.whatwg.org/#utf-16le
// Decoder default can be changed: iconv.decode(buf, 'utf16', {defaultEncoding: 'utf-16be'});

// Encoder uses UTF-16LE and prepends BOM (which can be overridden with addBOM: false).

exports.utf16 = Utf16Codec;
function Utf16Codec(codecOptions, iconv) {
    this.iconv = iconv;
}

Utf16Codec.prototype.encoder = Utf16Encoder;
Utf16Codec.prototype.decoder = Utf16Decoder;


// -- Encoding (pass-through)

function Utf16Encoder(options, codec) {
    options = options || {};
    if (options.addBOM === undefined)
        options.addBOM = true;
    this.encoder = codec.iconv.getEncoder('utf-16le', options);
}

Utf16Encoder.prototype.write = function(str) {
    return this.encoder.write(str);
}

Utf16Encoder.prototype.end = function() {
    return this.encoder.end();
}


// -- Decoding

function Utf16Decoder(options, codec) {
    this.decoder = null;
    this.initialBytes = [];
    this.initialBytesLen = 0;

    this.options = options || {};
    this.iconv = codec.iconv;
}

Utf16Decoder.prototype.write = function(buf) {
    if (!this.decoder) {
        // Codec is not chosen yet. Accumulate initial bytes.
        this.initialBytes.push(buf);
        this.initialBytesLen += buf.length;
        
        if (this.initialBytesLen < 16) // We need more bytes to use space heuristic (see below)
            return '';

        // We have enough bytes -> detect endianness.
        var buf = Buffer.concat(this.initialBytes),
            encoding = detectEncoding(buf, this.options.defaultEncoding);
        this.decoder = this.iconv.getDecoder(encoding, this.options);
        this.initialBytes.length = this.initialBytesLen = 0;
    }

    return this.decoder.write(buf);
}

Utf16Decoder.prototype.end = function() {
    if (!this.decoder) {
        var buf = Buffer.concat(this.initialBytes),
            encoding = detectEncoding(buf, this.options.defaultEncoding);
        this.decoder = this.iconv.getDecoder(encoding, this.options);

        var res = this.decoder.write(buf),
            trail = this.decoder.end();

        return trail ? (res + trail) : res;
    }
    return this.decoder.end();
}

function detectEncoding(buf, defaultEncoding) {
    var enc = defaultEncoding || 'utf-16le';

    if (buf.length >= 2) {
        // Check BOM.
        if (buf[0] == 0xFE && buf[1] == 0xFF) // UTF-16BE BOM
            enc = 'utf-16be';
        else if (buf[0] == 0xFF && buf[1] == 0xFE) // UTF-16LE BOM
            enc = 'utf-16le';
        else {
            // No BOM found. Try to deduce encoding from initial content.
            // Most of the time, the content has ASCII chars (U+00**), but the opposite (U+**00) is uncommon.
            // So, we count ASCII as if it was LE or BE, and decide from that.
            var asciiCharsLE = 0, asciiCharsBE = 0, // Counts of chars in both positions
                _len = Math.min(buf.length - (buf.length % 2), 64); // Len is always even.

            for (var i = 0; i < _len; i += 2) {
                if (buf[i] === 0 && buf[i+1] !== 0) asciiCharsBE++;
                if (buf[i] !== 0 && buf[i+1] === 0) asciiCharsLE++;
            }

            if (asciiCharsBE > asciiCharsLE)
                enc = 'utf-16be';
            else if (asciiCharsBE < asciiCharsLE)
                enc = 'utf-16le';
        }
    }

    return enc;
}


"use strict";
var Buffer = require("safer-buffer").Buffer;

// UTF-7 codec, according to https://tools.ietf.org/html/rfc2152
// See also below a UTF-7-IMAP codec, according to http://tools.ietf.org/html/rfc3501#section-5.1.3

exports.utf7 = Utf7Codec;
exports.unicode11utf7 = 'utf7'; // Alias UNICODE-1-1-UTF-7
function Utf7Codec(codecOptions, iconv) {
    this.iconv = iconv;
};

Utf7Codec.prototype.encoder = Utf7Encoder;
Utf7Codec.prototype.decoder = Utf7Decoder;
Utf7Codec.prototype.bomAware = true;


// -- Encoding

var nonDirectChars = /[^A-Za-z0-9'\(\),-\.\/:\? \n\r\t]+/g;

function Utf7Encoder(options, codec) {
    this.iconv = codec.iconv;
}

Utf7Encoder.prototype.write = function(str) {
    // Naive implementation.
    // Non-direct chars are encoded as "+<base64>-"; single "+" char is encoded as "+-".
    return Buffer.from(str.replace(nonDirectChars, function(chunk) {
        return "+" + (chunk === '+' ? '' : 
            this.iconv.encode(chunk, 'utf16-be').toString('base64').replace(/=+$/, '')) 
            + "-";
    }.bind(this)));
}

Utf7Encoder.prototype.end = function() {
}


// -- Decoding

function Utf7Decoder(options, codec) {
    this.iconv = codec.iconv;
    this.inBase64 = false;
    this.base64Accum = '';
}

var base64Regex = /[A-Za-z0-9\/+]/;
var base64Chars = [];
for (var i = 0; i < 256; i++)
    base64Chars[i] = base64Regex.test(String.fromCharCode(i));

var plusChar = '+'.charCodeAt(0), 
    minusChar = '-'.charCodeAt(0),
    andChar = '&'.charCodeAt(0);

Utf7Decoder.prototype.write = function(buf) {
    var res = "", lastI = 0,
        inBase64 = this.inBase64,
        base64Accum = this.base64Accum;

    // The decoder is more involved as we must handle chunks in stream.

    for (var i = 0; i < buf.length; i++) {
        if (!inBase64) { // We're in direct mode.
            // Write direct chars until '+'
            if (buf[i] == plusChar) {
                res += this.iconv.decode(buf.slice(lastI, i), "ascii"); // Write direct chars.
                lastI = i+1;
                inBase64 = true;
            }
        } else { // We decode base64.
            if (!base64Chars[buf[i]]) { // Base64 ended.
                if (i == lastI && buf[i] == minusChar) {// "+-" -> "+"
                    res += "+";
                } else {
                    var b64str = base64Accum + buf.slice(lastI, i).toString();
                    res += this.iconv.decode(Buffer.from(b64str, 'base64'), "utf16-be");
                }

                if (buf[i] != minusChar) // Minus is absorbed after base64.
                    i--;

                lastI = i+1;
                inBase64 = false;
                base64Accum = '';
            }
        }
    }

    if (!inBase64) {
        res += this.iconv.decode(buf.slice(lastI), "ascii"); // Write direct chars.
    } else {
        var b64str = base64Accum + buf.slice(lastI).toString();

        var canBeDecoded = b64str.length - (b64str.length % 8); // Minimal chunk: 2 quads -> 2x3 bytes -> 3 chars.
        base64Accum = b64str.slice(canBeDecoded); // The rest will be decoded in future.
        b64str = b64str.slice(0, canBeDecoded);

        res += this.iconv.decode(Buffer.from(b64str, 'base64'), "utf16-be");
    }

    this.inBase64 = inBase64;
    this.base64Accum = base64Accum;

    return res;
}

Utf7Decoder.prototype.end = function() {
    var res = "";
    if (this.inBase64 && this.base64Accum.length > 0)
        res = this.iconv.decode(Buffer.from(this.base64Accum, 'base64'), "utf16-be");

    this.inBase64 = false;
    this.base64Accum = '';
    return res;
}


// UTF-7-IMAP codec.
// RFC3501 Sec. 5.1.3 Modified UTF-7 (http://tools.ietf.org/html/rfc3501#section-5.1.3)
// Differences:
//  * Base64 part is started by "&" instead of "+"
//  * Direct characters are 0x20-0x7E, except "&" (0x26)
//  * In Base64, "," is used instead of "/"
//  * Base64 must not be used to represent direct characters.
//  * No implicit shift back from Base64 (should always end with '-')
//  * String must end in non-shifted position.
//  * "-&" while in base64 is not allowed.


exports.utf7imap = Utf7IMAPCodec;
function Utf7IMAPCodec(codecOptions, iconv) {
    this.iconv = iconv;
};

Utf7IMAPCodec.prototype.encoder = Utf7IMAPEncoder;
Utf7IMAPCodec.prototype.decoder = Utf7IMAPDecoder;
Utf7IMAPCodec.prototype.bomAware = true;


// -- Encoding

function Utf7IMAPEncoder(options, codec) {
    this.iconv = codec.iconv;
    this.inBase64 = false;
    this.base64Accum = Buffer.alloc(6);
    this.base64AccumIdx = 0;
}

Utf7IMAPEncoder.prototype.write = function(str) {
    var inBase64 = this.inBase64,
        base64Accum = this.base64Accum,
        base64AccumIdx = this.base64AccumIdx,
        buf = Buffer.alloc(str.length*5 + 10), bufIdx = 0;

    for (var i = 0; i < str.length; i++) {
        var uChar = str.charCodeAt(i);
        if (0x20 <= uChar && uChar <= 0x7E) { // Direct character or '&'.
            if (inBase64) {
                if (base64AccumIdx > 0) {
                    bufIdx += buf.write(base64Accum.slice(0, base64AccumIdx).toString('base64').replace(/\//g, ',').replace(/=+$/, ''), bufIdx);
                    base64AccumIdx = 0;
                }

                buf[bufIdx++] = minusChar; // Write '-', then go to direct mode.
                inBase64 = false;
            }

            if (!inBase64) {
                buf[bufIdx++] = uChar; // Write direct character

                if (uChar === andChar)  // Ampersand -> '&-'
                    buf[bufIdx++] = minusChar;
            }

        } else { // Non-direct character
            if (!inBase64) {
                buf[bufIdx++] = andChar; // Write '&', then go to base64 mode.
                inBase64 = true;
            }
            if (inBase64) {
                base64Accum[base64AccumIdx++] = uChar >> 8;
                base64Accum[base64AccumIdx++] = uChar & 0xFF;

                if (base64AccumIdx == base64Accum.length) {
                    bufIdx += buf.write(base64Accum.toString('base64').replace(/\//g, ','), bufIdx);
                    base64AccumIdx = 0;
                }
            }
        }
    }

    this.inBase64 = inBase64;
    this.base64AccumIdx = base64AccumIdx;

    return buf.slice(0, bufIdx);
}

Utf7IMAPEncoder.prototype.end = function() {
    var buf = Buffer.alloc(10), bufIdx = 0;
    if (this.inBase64) {
        if (this.base64AccumIdx > 0) {
            bufIdx += buf.write(this.base64Accum.slice(0, this.base64AccumIdx).toString('base64').replace(/\//g, ',').replace(/=+$/, ''), bufIdx);
            this.base64AccumIdx = 0;
        }

        buf[bufIdx++] = minusChar; // Write '-', then go to direct mode.
        this.inBase64 = false;
    }

    return buf.slice(0, bufIdx);
}


// -- Decoding

function Utf7IMAPDecoder(options, codec) {
    this.iconv = codec.iconv;
    this.inBase64 = false;
    this.base64Accum = '';
}

var base64IMAPChars = base64Chars.slice();
base64IMAPChars[','.charCodeAt(0)] = true;

Utf7IMAPDecoder.prototype.write = function(buf) {
    var res = "", lastI = 0,
        inBase64 = this.inBase64,
        base64Accum = this.base64Accum;

    // The decoder is more involved as we must handle chunks in stream.
    // It is forgiving, closer to standard UTF-7 (for example, '-' is optional at the end).

    for (var i = 0; i < buf.length; i++) {
        if (!inBase64) { // We're in direct mode.
            // Write direct chars until '&'
            if (buf[i] == andChar) {
                res += this.iconv.decode(buf.slice(lastI, i), "ascii"); // Write direct chars.
                lastI = i+1;
                inBase64 = true;
            }
        } else { // We decode base64.
            if (!base64IMAPChars[buf[i]]) { // Base64 ended.
                if (i == lastI && buf[i] == minusChar) { // "&-" -> "&"
                    res += "&";
                } else {
                    var b64str = base64Accum + buf.slice(lastI, i).toString().replace(/,/g, '/');
                    res += this.iconv.decode(Buffer.from(b64str, 'base64'), "utf16-be");
                }

                if (buf[i] != minusChar) // Minus may be absorbed after base64.
                    i--;

                lastI = i+1;
                inBase64 = false;
                base64Accum = '';
            }
        }
    }

    if (!inBase64) {
        res += this.iconv.decode(buf.slice(lastI), "ascii"); // Write direct chars.
    } else {
        var b64str = base64Accum + buf.slice(lastI).toString().replace(/,/g, '/');

        var canBeDecoded = b64str.length - (b64str.length % 8); // Minimal chunk: 2 quads -> 2x3 bytes -> 3 chars.
        base64Accum = b64str.slice(canBeDecoded); // The rest will be decoded in future.
        b64str = b64str.slice(0, canBeDecoded);

        res += this.iconv.decode(Buffer.from(b64str, 'base64'), "utf16-be");
    }

    this.inBase64 = inBase64;
    this.base64Accum = base64Accum;

    return res;
}

Utf7IMAPDecoder.prototype.end = function() {
    var res = "";
    if (this.inBase64 && this.base64Accum.length > 0)
        res = this.iconv.decode(Buffer.from(this.base64Accum, 'base64'), "utf16-be");

    this.inBase64 = false;
    this.base64Accum = '';
    return res;
}


[
["8740","䏰䰲䘃䖦䕸𧉧䵷䖳𧲱䳢𧳅㮕䜶䝄䱇䱀𤊿𣘗𧍒𦺋𧃒䱗𪍑䝏䗚䲅𧱬䴇䪤䚡𦬣爥𥩔𡩣𣸆𣽡晍囻"],
["8767","綕夝𨮹㷴霴𧯯寛𡵞媤㘥𩺰嫑宷峼杮薓𩥅瑡璝㡵𡵓𣚞𦀡㻬"],
["87a1","𥣞㫵竼龗𤅡𨤍𣇪𠪊𣉞䌊蒄龖鐯䤰蘓墖靊鈘秐稲晠権袝瑌篅枂稬剏遆㓦珄𥶹瓆鿇垳䤯呌䄱𣚎堘穲𧭥讏䚮𦺈䆁𥶙箮𢒼鿈𢓁𢓉𢓌鿉蔄𣖻䂴鿊䓡𪷿拁灮鿋"],
["8840","㇀",4,"𠄌㇅𠃑𠃍㇆㇇𠃋𡿨㇈𠃊㇉㇊㇋㇌𠄎㇍㇎ĀÁǍÀĒÉĚÈŌÓǑÒ࿿Ê̄Ế࿿Ê̌ỀÊāáǎàɑēéěèīíǐìōóǒòūúǔùǖǘǚ"],
["88a1","ǜü࿿ê̄ế࿿ê̌ềêɡ⏚⏛"],
["8940","𪎩𡅅"],
["8943","攊"],
["8946","丽滝鵎釟"],
["894c","𧜵撑会伨侨兖兴农凤务动医华发变团声处备夲头学实実岚庆总斉柾栄桥济炼电纤纬纺织经统缆缷艺苏药视设询车轧轮"],
["89a1","琑糼緍楆竉刧"],
["89ab","醌碸酞肼"],
["89b0","贋胶𠧧"],
["89b5","肟黇䳍鷉鸌䰾𩷶𧀎鸊𪄳㗁"],
["89c1","溚舾甙"],
["89c5","䤑马骏龙禇𨑬𡷊𠗐𢫦两亁亀亇亿仫伷㑌侽㹈倃傈㑽㒓㒥円夅凛凼刅争剹劐匧㗇厩㕑厰㕓参吣㕭㕲㚁咓咣咴咹哐哯唘唣唨㖘唿㖥㖿嗗㗅"],
["8a40","𧶄唥"],
["8a43","𠱂𠴕𥄫喐𢳆㧬𠍁蹆𤶸𩓥䁓𨂾睺𢰸㨴䟕𨅝𦧲𤷪擝𠵼𠾴𠳕𡃴撍蹾𠺖𠰋𠽤𢲩𨉖𤓓"],
["8a64","𠵆𩩍𨃩䟴𤺧𢳂骲㩧𩗴㿭㔆𥋇𩟔𧣈𢵄鵮頕"],
["8a76","䏙𦂥撴哣𢵌𢯊𡁷㧻𡁯"],
["8aa1","𦛚𦜖𧦠擪𥁒𠱃蹨𢆡𨭌𠜱"],
["8aac","䠋𠆩㿺塳𢶍"],
["8ab2","𤗈𠓼𦂗𠽌𠶖啹䂻䎺"],
["8abb","䪴𢩦𡂝膪飵𠶜捹㧾𢝵跀嚡摼㹃"],
["8ac9","𪘁𠸉𢫏𢳉"],
["8ace","𡃈𣧂㦒㨆𨊛㕸𥹉𢃇噒𠼱𢲲𩜠㒼氽𤸻"],
["8adf","𧕴𢺋𢈈𪙛𨳍𠹺𠰴𦠜羓𡃏𢠃𢤹㗻𥇣𠺌𠾍𠺪㾓𠼰𠵇𡅏𠹌"],
["8af6","𠺫𠮩𠵈𡃀𡄽㿹𢚖搲𠾭"],
["8b40","𣏴𧘹𢯎𠵾𠵿𢱑𢱕㨘𠺘𡃇𠼮𪘲𦭐𨳒𨶙𨳊閪哌苄喹"],
["8b55","𩻃鰦骶𧝞𢷮煀腭胬尜𦕲脴㞗卟𨂽醶𠻺𠸏𠹷𠻻㗝𤷫㘉𠳖嚯𢞵𡃉𠸐𠹸𡁸𡅈𨈇𡑕𠹹𤹐𢶤婔𡀝𡀞𡃵𡃶垜𠸑"],
["8ba1","𧚔𨋍𠾵𠹻𥅾㜃𠾶𡆀𥋘𪊽𤧚𡠺𤅷𨉼墙剨㘚𥜽箲孨䠀䬬鼧䧧鰟鮍𥭴𣄽嗻㗲嚉丨夂𡯁屮靑𠂆乛亻㔾尣彑忄㣺扌攵歺氵氺灬爫丬犭𤣩罒礻糹罓𦉪㓁"],
["8bde","𦍋耂肀𦘒𦥑卝衤见𧢲讠贝钅镸长门𨸏韦页风飞饣𩠐鱼鸟黄歯龜丷𠂇阝户钢"],
["8c40","倻淾𩱳龦㷉袏𤅎灷峵䬠𥇍㕙𥴰愢𨨲辧釶熑朙玺𣊁𪄇㲋𡦀䬐磤琂冮𨜏䀉橣𪊺䈣蘏𠩯稪𩥇𨫪靕灍匤𢁾鏴盙𨧣龧矝亣俰傼丯众龨吴綋墒壐𡶶庒庙忂𢜒斋"],
["8ca1","𣏹椙橃𣱣泿"],
["8ca7","爀𤔅玌㻛𤨓嬕璹讃𥲤𥚕窓篬糃繬苸薗龩袐龪躹龫迏蕟駠鈡龬𨶹𡐿䁱䊢娚"],
["8cc9","顨杫䉶圽"],
["8cce","藖𤥻芿𧄍䲁𦵴嵻𦬕𦾾龭龮宖龯曧繛湗秊㶈䓃𣉖𢞖䎚䔶"],
["8ce6","峕𣬚諹屸㴒𣕑嵸龲煗䕘𤃬𡸣䱷㥸㑊𠆤𦱁諌侴𠈹妿腬顖𩣺弻"],
["8d40","𠮟"],
["8d42","𢇁𨥭䄂䚻𩁹㼇龳𪆵䃸㟖䛷𦱆䅼𨚲𧏿䕭㣔𥒚䕡䔛䶉䱻䵶䗪㿈𤬏㙡䓞䒽䇭崾嵈嵖㷼㠏嶤嶹㠠㠸幂庽弥徃㤈㤔㤿㥍惗愽峥㦉憷憹懏㦸戬抐拥挘㧸嚱"],
["8da1","㨃揢揻搇摚㩋擀崕嘡龟㪗斆㪽旿晓㫲暒㬢朖㭂枤栀㭘桊梄㭲㭱㭻椉楃牜楤榟榅㮼槖㯝橥橴橱檂㯬檙㯲檫檵櫔櫶殁毁毪汵沪㳋洂洆洦涁㳯涤涱渕渘温溆𨧀溻滢滚齿滨滩漤漴㵆𣽁澁澾㵪㵵熷岙㶊瀬㶑灐灔灯灿炉𠌥䏁㗱𠻘"],
["8e40","𣻗垾𦻓焾𥟠㙎榢𨯩孴穉𥣡𩓙穥穽𥦬窻窰竂竃燑𦒍䇊竚竝竪䇯咲𥰁笋筕笩𥌎𥳾箢筯莜𥮴𦱿篐萡箒箸𥴠㶭𥱥蒒篺簆簵𥳁籄粃𤢂粦晽𤕸糉糇糦籴糳糵糎"],
["8ea1","繧䔝𦹄絝𦻖璍綉綫焵綳緒𤁗𦀩緤㴓緵𡟹緥𨍭縝𦄡𦅚繮纒䌫鑬縧罀罁罇礶𦋐駡羗𦍑羣𡙡𠁨䕜𣝦䔃𨌺翺𦒉者耈耝耨耯𪂇𦳃耻耼聡𢜔䦉𦘦𣷣𦛨朥肧𨩈脇脚墰𢛶汿𦒘𤾸擧𡒊舘𡡞橓𤩥𤪕䑺舩𠬍𦩒𣵾俹𡓽蓢荢𦬊𤦧𣔰𡝳𣷸芪椛芳䇛"],
["8f40","蕋苐茚𠸖𡞴㛁𣅽𣕚艻苢茘𣺋𦶣𦬅𦮗𣗎㶿茝嗬莅䔋𦶥莬菁菓㑾𦻔橗蕚㒖𦹂𢻯葘𥯤葱㷓䓤檧葊𣲵祘蒨𦮖𦹷𦹃蓞萏莑䒠蒓蓤𥲑䉀𥳀䕃蔴嫲𦺙䔧蕳䔖枿蘖"],
["8fa1","𨘥𨘻藁𧂈蘂𡖂𧃍䕫䕪蘨㙈𡢢号𧎚虾蝱𪃸蟮𢰧螱蟚蠏噡虬桖䘏衅衆𧗠𣶹𧗤衞袜䙛袴袵揁装睷𧜏覇覊覦覩覧覼𨨥觧𧤤𧪽誜瞓釾誐𧩙竩𧬺𣾏䜓𧬸煼謌謟𥐰𥕥謿譌譍誩𤩺讐讛誯𡛟䘕衏貛𧵔𧶏貫㜥𧵓賖𧶘𧶽贒贃𡤐賛灜贑𤳉㻐起"],
["9040","趩𨀂𡀔𤦊㭼𨆼𧄌竧躭躶軃鋔輙輭𨍥𨐒辥錃𪊟𠩐辳䤪𨧞𨔽𣶻廸𣉢迹𪀔𨚼𨔁𢌥㦀𦻗逷𨔼𧪾遡𨕬𨘋邨𨜓郄𨛦邮都酧㫰醩釄粬𨤳𡺉鈎沟鉁鉢𥖹銹𨫆𣲛𨬌𥗛"],
["90a1","𠴱錬鍫𨫡𨯫炏嫃𨫢𨫥䥥鉄𨯬𨰹𨯿鍳鑛躼閅閦鐦閠濶䊹𢙺𨛘𡉼𣸮䧟氜陻隖䅬隣𦻕懚隶磵𨫠隽双䦡𦲸𠉴𦐐𩂯𩃥𤫑𡤕𣌊霱虂霶䨏䔽䖅𤫩灵孁霛靜𩇕靗孊𩇫靟鐥僐𣂷𣂼鞉鞟鞱鞾韀韒韠𥑬韮琜𩐳響韵𩐝𧥺䫑頴頳顋顦㬎𧅵㵑𠘰𤅜"],
["9140","𥜆飊颷飈飇䫿𦴧𡛓喰飡飦飬鍸餹𤨩䭲𩡗𩤅駵騌騻騐驘𥜥㛄𩂱𩯕髠髢𩬅髴䰎鬔鬭𨘀倴鬴𦦨㣃𣁽魐魀𩴾婅𡡣鮎𤉋鰂鯿鰌𩹨鷔𩾷𪆒𪆫𪃡𪄣𪇟鵾鶃𪄴鸎梈"],
["91a1","鷄𢅛𪆓𪈠𡤻𪈳鴹𪂹𪊴麐麕麞麢䴴麪麯𤍤黁㭠㧥㴝伲㞾𨰫鼂鼈䮖鐤𦶢鼗鼖鼹嚟嚊齅馸𩂋韲葿齢齩竜龎爖䮾𤥵𤦻煷𤧸𤍈𤩑玞𨯚𡣺禟𨥾𨸶鍩鏳𨩄鋬鎁鏋𨥬𤒹爗㻫睲穃烐𤑳𤏸煾𡟯炣𡢾𣖙㻇𡢅𥐯𡟸㜢𡛻𡠹㛡𡝴𡣑𥽋㜣𡛀坛𤨥𡏾𡊨"],
["9240","𡏆𡒶蔃𣚦蔃葕𤦔𧅥𣸱𥕜𣻻𧁒䓴𣛮𩦝𦼦柹㜳㰕㷧塬𡤢栐䁗𣜿𤃡𤂋𤄏𦰡哋嚞𦚱嚒𠿟𠮨𠸍鏆𨬓鎜仸儫㠙𤐶亼𠑥𠍿佋侊𥙑婨𠆫𠏋㦙𠌊𠐔㐵伩𠋀𨺳𠉵諚𠈌亘"],
["92a1","働儍侢伃𤨎𣺊佂倮偬傁俌俥偘僼兙兛兝兞湶𣖕𣸹𣺿浲𡢄𣺉冨凃𠗠䓝𠒣𠒒𠒑赺𨪜𠜎剙劤𠡳勡鍮䙺熌𤎌𠰠𤦬𡃤槑𠸝瑹㻞璙琔瑖玘䮎𤪼𤂍叐㖄爏𤃉喴𠍅响𠯆圝鉝雴鍦埝垍坿㘾壋媙𨩆𡛺𡝯𡜐娬妸銏婾嫏娒𥥆𡧳𡡡𤊕㛵洅瑃娡𥺃"],
["9340","媁𨯗𠐓鏠璌𡌃焅䥲鐈𨧻鎽㞠尞岞幞幈𡦖𡥼𣫮廍孏𡤃𡤄㜁𡢠㛝𡛾㛓脪𨩇𡶺𣑲𨦨弌弎𡤧𡞫婫𡜻孄蘔𧗽衠恾𢡠𢘫忛㺸𢖯𢖾𩂈𦽳懀𠀾𠁆𢘛憙憘恵𢲛𢴇𤛔𩅍"],
["93a1","摱𤙥𢭪㨩𢬢𣑐𩣪𢹸挷𪑛撶挱揑𤧣𢵧护𢲡搻敫楲㯴𣂎𣊭𤦉𣊫唍𣋠𡣙𩐿曎𣊉𣆳㫠䆐𥖄𨬢𥖏𡛼𥕛𥐥磮𣄃𡠪𣈴㑤𣈏𣆂𤋉暎𦴤晫䮓昰𧡰𡷫晣𣋒𣋡昞𥡲㣑𣠺𣞼㮙𣞢𣏾瓐㮖枏𤘪梶栞㯄檾㡣𣟕𤒇樳橒櫉欅𡤒攑梘橌㯗橺歗𣿀𣲚鎠鋲𨯪𨫋"],
["9440","銉𨀞𨧜鑧涥漋𤧬浧𣽿㶏渄𤀼娽渊塇洤硂焻𤌚𤉶烱牐犇犔𤞏𤜥兹𤪤𠗫瑺𣻸𣙟𤩊𤤗𥿡㼆㺱𤫟𨰣𣼵悧㻳瓌琼鎇琷䒟𦷪䕑疃㽣𤳙𤴆㽘畕癳𪗆㬙瑨𨫌𤦫𤦎㫻"],
["94a1","㷍𤩎㻿𤧅𤣳釺圲鍂𨫣𡡤僟𥈡𥇧睸𣈲眎眏睻𤚗𣞁㩞𤣰琸璛㺿𤪺𤫇䃈𤪖𦆮錇𥖁砞碍碈磒珐祙𧝁𥛣䄎禛蒖禥樭𣻺稺秴䅮𡛦䄲鈵秱𠵌𤦌𠊙𣶺𡝮㖗啫㕰㚪𠇔𠰍竢婙𢛵𥪯𥪜娍𠉛磰娪𥯆竾䇹籝籭䈑𥮳𥺼𥺦糍𤧹𡞰粎籼粮檲緜縇緓罎𦉡"],
["9540","𦅜𧭈綗𥺂䉪𦭵𠤖柖𠁎𣗏埄𦐒𦏸𤥢翝笧𠠬𥫩𥵃笌𥸎駦虅驣樜𣐿㧢𤧷𦖭騟𦖠蒀𧄧𦳑䓪脷䐂胆脉腂𦞴飃𦩂艢艥𦩑葓𦶧蘐𧈛媆䅿𡡀嬫𡢡嫤𡣘蚠蜨𣶏蠭𧐢娂"],
["95a1","衮佅袇袿裦襥襍𥚃襔𧞅𧞄𨯵𨯙𨮜𨧹㺭蒣䛵䛏㟲訽訜𩑈彍鈫𤊄旔焩烄𡡅鵭貟賩𧷜妚矃姰䍮㛔踪躧𤰉輰轊䋴汘澻𢌡䢛潹溋𡟚鯩㚵𤤯邻邗啱䤆醻鐄𨩋䁢𨫼鐧𨰝𨰻蓥訫閙閧閗閖𨴴瑅㻂𤣿𤩂𤏪㻧𣈥随𨻧𨹦𨹥㻌𤧭𤩸𣿮琒瑫㻼靁𩂰"],
["9640","桇䨝𩂓𥟟靝鍨𨦉𨰦𨬯𦎾銺嬑譩䤼珹𤈛鞛靱餸𠼦巁𨯅𤪲頟𩓚鋶𩗗釥䓀𨭐𤩧𨭤飜𨩅㼀鈪䤥萔餻饍𧬆㷽馛䭯馪驜𨭥𥣈檏騡嫾騯𩣱䮐𩥈馼䮽䮗鍽塲𡌂堢𤦸"],
["96a1","𡓨硄𢜟𣶸棅㵽鑘㤧慐𢞁𢥫愇鱏鱓鱻鰵鰐魿鯏𩸭鮟𪇵𪃾鴡䲮𤄄鸘䲰鴌𪆴𪃭𪃳𩤯鶥蒽𦸒𦿟𦮂藼䔳𦶤𦺄𦷰萠藮𦸀𣟗𦁤秢𣖜𣙀䤭𤧞㵢鏛銾鍈𠊿碹鉷鑍俤㑀遤𥕝砽硔碶硋𡝗𣇉𤥁㚚佲濚濙瀞瀞吔𤆵垻壳垊鴖埗焴㒯𤆬燫𦱀𤾗嬨𡞵𨩉"],
["9740","愌嫎娋䊼𤒈㜬䭻𨧼鎻鎸𡣖𠼝葲𦳀𡐓𤋺𢰦𤏁妔𣶷𦝁綨𦅛𦂤𤦹𤦋𨧺鋥珢㻩璴𨭣𡢟㻡𤪳櫘珳珻㻖𤨾𤪔𡟙𤩦𠎧𡐤𤧥瑈𤤖炥𤥶銄珦鍟𠓾錱𨫎𨨖鎆𨯧𥗕䤵𨪂煫"],
["97a1","𤥃𠳿嚤𠘚𠯫𠲸唂秄𡟺緾𡛂𤩐𡡒䔮鐁㜊𨫀𤦭妰𡢿𡢃𧒄媡㛢𣵛㚰鉟婹𨪁𡡢鍴㳍𠪴䪖㦊僴㵩㵌𡎜煵䋻𨈘渏𩃤䓫浗𧹏灧沯㳖𣿭𣸭渂漌㵯𠏵畑㚼㓈䚀㻚䡱姄鉮䤾轁𨰜𦯀堒埈㛖𡑒烾𤍢𤩱𢿣𡊰𢎽梹楧𡎘𣓥𧯴𣛟𨪃𣟖𣏺𤲟樚𣚭𦲷萾䓟䓎"],
["9840","𦴦𦵑𦲂𦿞漗𧄉茽𡜺菭𦲀𧁓𡟛妉媂𡞳婡婱𡤅𤇼㜭姯𡜼㛇熎鎐暚𤊥婮娫𤊓樫𣻹𧜶𤑛𤋊焝𤉙𨧡侰𦴨峂𤓎𧹍𤎽樌𤉖𡌄炦焳𤏩㶥泟勇𤩏繥姫崯㷳彜𤩝𡟟綤萦"],
["98a1","咅𣫺𣌀𠈔坾𠣕𠘙㿥𡾞𪊶瀃𩅛嵰玏糓𨩙𩐠俈翧狍猐𧫴猸猹𥛶獁獈㺩𧬘遬燵𤣲珡臶㻊県㻑沢国琙琞琟㻢㻰㻴㻺瓓㼎㽓畂畭畲疍㽼痈痜㿀癍㿗癴㿜発𤽜熈嘣覀塩䀝睃䀹条䁅㗛瞘䁪䁯属瞾矋売砘点砜䂨砹硇硑硦葈𥔵礳栃礲䄃"],
["9940","䄉禑禙辻稆込䅧窑䆲窼艹䇄竏竛䇏両筢筬筻簒簛䉠䉺类粜䊌粸䊔糭输烀𠳏総緔緐緽羮羴犟䎗耠耥笹耮耱联㷌垴炠肷胩䏭脌猪脎脒畠脔䐁㬹腖腙腚"],
["99a1","䐓堺腼膄䐥膓䐭膥埯臁臤艔䒏芦艶苊苘苿䒰荗险榊萅烵葤惣蒈䔄蒾蓡蓸蔐蔸蕒䔻蕯蕰藠䕷虲蚒蚲蛯际螋䘆䘗袮裿褤襇覑𧥧訩訸誔誴豑賔賲贜䞘塟跃䟭仮踺嗘坔蹱嗵躰䠷軎転軤軭軲辷迁迊迌逳駄䢭飠鈓䤞鈨鉘鉫銱銮銿"],
["9a40","鋣鋫鋳鋴鋽鍃鎄鎭䥅䥑麿鐗匁鐝鐭鐾䥪鑔鑹锭関䦧间阳䧥枠䨤靀䨵鞲韂噔䫤惨颹䬙飱塄餎餙冴餜餷饂饝饢䭰駅䮝騼鬏窃魩鮁鯝鯱鯴䱭鰠㝯𡯂鵉鰺"],
["9aa1","黾噐鶓鶽鷀鷼银辶鹻麬麱麽黆铜黢黱黸竈齄𠂔𠊷𠎠椚铃妬𠓗塀铁㞹𠗕𠘕𠙶𡚺块煳𠫂𠫍𠮿呪吆𠯋咞𠯻𠰻𠱓𠱥𠱼惧𠲍噺𠲵𠳝𠳭𠵯𠶲𠷈楕鰯螥𠸄𠸎𠻗𠾐𠼭𠹳尠𠾼帋𡁜𡁏𡁶朞𡁻𡂈𡂖㙇𡂿𡃓𡄯𡄻卤蒭𡋣𡍵𡌶讁𡕷𡘙𡟃𡟇乸炻𡠭𡥪"],
["9b40","𡨭𡩅𡰪𡱰𡲬𡻈拃𡻕𡼕熘桕𢁅槩㛈𢉼𢏗𢏺𢜪𢡱𢥏苽𢥧𢦓𢫕覥𢫨辠𢬎鞸𢬿顇骽𢱌"],
["9b62","𢲈𢲷𥯨𢴈𢴒𢶷𢶕𢹂𢽴𢿌𣀳𣁦𣌟𣏞徱晈暿𧩹𣕧𣗳爁𤦺矗𣘚𣜖纇𠍆墵朎"],
["9ba1","椘𣪧𧙗𥿢𣸑𣺹𧗾𢂚䣐䪸𤄙𨪚𤋮𤌍𤀻𤌴𤎖𤩅𠗊凒𠘑妟𡺨㮾𣳿𤐄𤓖垈𤙴㦛𤜯𨗨𩧉㝢𢇃譞𨭎駖𤠒𤣻𤨕爉𤫀𠱸奥𤺥𤾆𠝹軚𥀬劏圿煱𥊙𥐙𣽊𤪧喼𥑆𥑮𦭒釔㑳𥔿𧘲𥕞䜘𥕢𥕦𥟇𤤿𥡝偦㓻𣏌惞𥤃䝼𨥈𥪮𥮉𥰆𡶐垡煑澶𦄂𧰒遖𦆲𤾚譢𦐂𦑊"],
["9c40","嵛𦯷輶𦒄𡤜諪𤧶𦒈𣿯𦔒䯀𦖿𦚵𢜛鑥𥟡憕娧晉侻嚹𤔡𦛼乪𤤴陖涏𦲽㘘襷𦞙𦡮𦐑𦡞營𦣇筂𩃀𠨑𦤦鄄𦤹穅鷰𦧺騦𦨭㙟𦑩𠀡禃𦨴𦭛崬𣔙菏𦮝䛐𦲤画补𦶮墶"],
["9ca1","㜜𢖍𧁋𧇍㱔𧊀𧊅銁𢅺𧊋錰𧋦𤧐氹钟𧑐𠻸蠧裵𢤦𨑳𡞱溸𤨪𡠠㦤㚹尐秣䔿暶𩲭𩢤襃𧟌𧡘囖䃟𡘊㦡𣜯𨃨𡏅熭荦𧧝𩆨婧䲷𧂯𨦫𧧽𧨊𧬋𧵦𤅺筃祾𨀉澵𪋟樃𨌘厢𦸇鎿栶靝𨅯𨀣𦦵𡏭𣈯𨁈嶅𨰰𨂃圕頣𨥉嶫𤦈斾槕叒𤪥𣾁㰑朶𨂐𨃴𨄮𡾡𨅏"],
["9d40","𨆉𨆯𨈚𨌆𨌯𨎊㗊𨑨𨚪䣺揦𨥖砈鉕𨦸䏲𨧧䏟𨧨𨭆𨯔姸𨰉輋𨿅𩃬筑𩄐𩄼㷷𩅞𤫊运犏嚋𩓧𩗩𩖰𩖸𩜲𩣑𩥉𩥪𩧃𩨨𩬎𩵚𩶛纟𩻸𩼣䲤镇𪊓熢𪋿䶑递𪗋䶜𠲜达嗁"],
["9da1","辺𢒰边𤪓䔉繿潖檱仪㓤𨬬𧢝㜺躀𡟵𨀤𨭬𨮙𧨾𦚯㷫𧙕𣲷𥘵𥥖亚𥺁𦉘嚿𠹭踎孭𣺈𤲞揞拐𡟶𡡻攰嘭𥱊吚𥌑㷆𩶘䱽嘢嘞罉𥻘奵𣵀蝰东𠿪𠵉𣚺脗鵞贘瘻鱅癎瞹鍅吲腈苷嘥脲萘肽嗪祢噃吖𠺝㗎嘅嗱曱𨋢㘭甴嗰喺咗啲𠱁𠲖廐𥅈𠹶𢱢"],
["9e40","𠺢麫絚嗞𡁵抝靭咔賍燶酶揼掹揾啩𢭃鱲𢺳冚㓟𠶧冧呍唞唓癦踭𦢊疱肶蠄螆裇膶萜𡃁䓬猄𤜆宐茋𦢓噻𢛴𧴯𤆣𧵳𦻐𧊶酰𡇙鈈𣳼𪚩𠺬𠻹牦𡲢䝎𤿂𧿹𠿫䃺"],
["9ea1","鱝攟𢶠䣳𤟠𩵼𠿬𠸊恢𧖣𠿭"],
["9ead","𦁈𡆇熣纎鵐业丄㕷嬍沲卧㚬㧜卽㚥𤘘墚𤭮舭呋垪𥪕𠥹"],
["9ec5","㩒𢑥獴𩺬䴉鯭𣳾𩼰䱛𤾩𩖞𩿞葜𣶶𧊲𦞳𣜠挮紥𣻷𣸬㨪逈勌㹴㙺䗩𠒎癀嫰𠺶硺𧼮墧䂿噼鮋嵴癔𪐴麅䳡痹㟻愙𣃚𤏲"],
["9ef5","噝𡊩垧𤥣𩸆刴𧂮㖭汊鵼"],
["9f40","籖鬹埞𡝬屓擓𩓐𦌵𧅤蚭𠴨𦴢𤫢𠵱"],
["9f4f","凾𡼏嶎霃𡷑麁遌笟鬂峑箣扨挵髿篏鬪籾鬮籂粆鰕篼鬉鼗鰛𤤾齚啳寃俽麘俲剠㸆勑坧偖妷帒韈鶫轜呩鞴饀鞺匬愰"],
["9fa1","椬叚鰊鴂䰻陁榀傦畆𡝭駚剳"],
["9fae","酙隁酜"],
["9fb2","酑𨺗捿𦴣櫊嘑醎畺抅𠏼獏籰𥰡𣳽"],
["9fc1","𤤙盖鮝个𠳔莾衂"],
["9fc9","届槀僭坺刟巵从氱𠇲伹咜哚劚趂㗾弌㗳"],
["9fdb","歒酼龥鮗頮颴骺麨麄煺笔"],
["9fe7","毺蠘罸"],
["9feb","嘠𪙊蹷齓"],
["9ff0","跔蹏鸜踁抂𨍽踨蹵竓𤩷稾磘泪詧瘇"],
["a040","𨩚鼦泎蟖痃𪊲硓咢贌狢獱謭猂瓱賫𤪻蘯徺袠䒷"],
["a055","𡠻𦸅"],
["a058","詾𢔛"],
["a05b","惽癧髗鵄鍮鮏蟵"],
["a063","蠏賷猬霡鮰㗖犲䰇籑饊𦅙慙䰄麖慽"],
["a073","坟慯抦戹拎㩜懢厪𣏵捤栂㗒"],
["a0a1","嵗𨯂迚𨸹"],
["a0a6","僙𡵆礆匲阸𠼻䁥"],
["a0ae","矾"],
["a0b0","糂𥼚糚稭聦聣絍甅瓲覔舚朌聢𧒆聛瓰脃眤覉𦟌畓𦻑螩蟎臈螌詉貭譃眫瓸蓚㘵榲趦"],
["a0d4","覩瑨涹蟁𤀑瓧㷛煶悤憜㳑煢恷"],
["a0e2","罱𨬭牐惩䭾删㰘𣳇𥻗𧙖𥔱𡥄𡋾𩤃𦷜𧂭峁𦆭𨨏𣙷𠃮𦡆𤼎䕢嬟𦍌齐麦𦉫"],
["a3c0","␀",31,"␡"],
["c6a1","①",9,"⑴",9,"ⅰ",9,"丶丿亅亠冂冖冫勹匸卩厶夊宀巛⼳广廴彐彡攴无疒癶辵隶¨ˆヽヾゝゞ〃仝々〆〇ー［］✽ぁ",23],
["c740","す",58,"ァアィイ"],
["c7a1","ゥ",81,"А",5,"ЁЖ",4],
["c840","Л",26,"ёж",25,"⇧↸↹㇏𠃌乚𠂊刂䒑"],
["c8a1","龰冈龱𧘇"],
["c8cd","￢￤＇＂㈱№℡゛゜⺀⺄⺆⺇⺈⺊⺌⺍⺕⺜⺝⺥⺧⺪⺬⺮⺶⺼⺾⻆⻊⻌⻍⻏⻖⻗⻞⻣"],
["c8f5","ʃɐɛɔɵœøŋʊɪ"],
["f9fe","￭"],
["fa40","𠕇鋛𠗟𣿅蕌䊵珯况㙉𤥂𨧤鍄𡧛苮𣳈砼杄拟𤤳𨦪𠊠𦮳𡌅侫𢓭倈𦴩𧪄𣘀𤪱𢔓倩𠍾徤𠎀𠍇滛𠐟偽儁㑺儎顬㝃萖𤦤𠒇兠𣎴兪𠯿𢃼𠋥𢔰𠖎𣈳𡦃宂蝽𠖳𣲙冲冸"],
["faa1","鴴凉减凑㳜凓𤪦决凢卂凭菍椾𣜭彻刋刦刼劵剗劔効勅簕蕂勠蘍𦬓包𨫞啉滙𣾀𠥔𣿬匳卄𠯢泋𡜦栛珕恊㺪㣌𡛨燝䒢卭却𨚫卾卿𡖖𡘓矦厓𨪛厠厫厮玧𥝲㽙玜叁叅汉义埾叙㪫𠮏叠𣿫𢶣叶𠱷吓灹唫晗浛呭𦭓𠵴啝咏咤䞦𡜍𠻝㶴𠵍"],
["fb40","𨦼𢚘啇䳭启琗喆喩嘅𡣗𤀺䕒𤐵暳𡂴嘷曍𣊊暤暭噍噏磱囱鞇叾圀囯园𨭦㘣𡉏坆𤆥汮炋坂㚱𦱾埦𡐖堃𡑔𤍣堦𤯵塜墪㕡壠壜𡈼壻寿坃𪅐𤉸鏓㖡够梦㛃湙"],
["fba1","𡘾娤啓𡚒蔅姉𠵎𦲁𦴪𡟜姙𡟻𡞲𦶦浱𡠨𡛕姹𦹅媫婣㛦𤦩婷㜈媖瑥嫓𦾡𢕔㶅𡤑㜲𡚸広勐孶斈孼𧨎䀄䡝𠈄寕慠𡨴𥧌𠖥寳宝䴐尅𡭄尓珎尔𡲥𦬨屉䣝岅峩峯嶋𡷹𡸷崐崘嵆𡺤岺巗苼㠭𤤁𢁉𢅳芇㠶㯂帮檊幵幺𤒼𠳓厦亷廐厨𡝱帉廴𨒂"],
["fc40","廹廻㢠廼栾鐛弍𠇁弢㫞䢮𡌺强𦢈𢏐彘𢑱彣鞽𦹮彲鍀𨨶徧嶶㵟𥉐𡽪𧃸𢙨釖𠊞𨨩怱暅𡡷㥣㷇㘹垐𢞴祱㹀悞悤悳𤦂𤦏𧩓璤僡媠慤萤慂慈𦻒憁凴𠙖憇宪𣾷"],
["fca1","𢡟懓𨮝𩥝懐㤲𢦀𢣁怣慜攞掋𠄘担𡝰拕𢸍捬𤧟㨗搸揸𡎎𡟼撐澊𢸶頔𤂌𥜝擡擥鑻㩦携㩗敍漖𤨨𤨣斅敭敟𣁾斵𤥀䬷旑䃘𡠩无旣忟𣐀昘𣇷𣇸晄𣆤𣆥晋𠹵晧𥇦晳晴𡸽𣈱𨗴𣇈𥌓矅𢣷馤朂𤎜𤨡㬫槺𣟂杞杧杢𤇍𩃭柗䓩栢湐鈼栁𣏦𦶠桝"],
["fd40","𣑯槡樋𨫟楳棃𣗍椁椀㴲㨁𣘼㮀枬楡𨩊䋼椶榘㮡𠏉荣傐槹𣙙𢄪橅𣜃檝㯳枱櫈𩆜㰍欝𠤣惞欵歴𢟍溵𣫛𠎵𡥘㝀吡𣭚毡𣻼毜氷𢒋𤣱𦭑汚舦汹𣶼䓅𣶽𤆤𤤌𤤀"],
["fda1","𣳉㛥㳫𠴲鮃𣇹𢒑羏样𦴥𦶡𦷫涖浜湼漄𤥿𤂅𦹲蔳𦽴凇沜渝萮𨬡港𣸯瑓𣾂秌湏媑𣁋濸㜍澝𣸰滺𡒗𤀽䕕鏰潄潜㵎潴𩅰㴻澟𤅄濓𤂑𤅕𤀹𣿰𣾴𤄿凟𤅖𤅗𤅀𦇝灋灾炧炁烌烕烖烟䄄㷨熴熖𤉷焫煅媈煊煮岜𤍥煏鍢𤋁焬𤑚𤨧𤨢熺𨯨炽爎"],
["fe40","鑂爕夑鑃爤鍁𥘅爮牀𤥴梽牕牗㹕𣁄栍漽犂猪猫𤠣𨠫䣭𨠄猨献珏玪𠰺𦨮珉瑉𤇢𡛧𤨤昣㛅𤦷𤦍𤧻珷琕椃𤨦琹𠗃㻗瑜𢢭瑠𨺲瑇珤瑶莹瑬㜰瑴鏱樬璂䥓𤪌"],
["fea1","𤅟𤩹𨮏孆𨰃𡢞瓈𡦈甎瓩甞𨻙𡩋寗𨺬鎅畍畊畧畮𤾂㼄𤴓疎瑝疞疴瘂瘬癑癏癯癶𦏵皐臯㟸𦤑𦤎皡皥皷盌𦾟葢𥂝𥅽𡸜眞眦着撯𥈠睘𣊬瞯𨥤𨥨𡛁矴砉𡍶𤨒棊碯磇磓隥礮𥗠磗礴碱𧘌辸袄𨬫𦂃𢘜禆褀椂禀𥡗禝𧬹礼禩渪𧄦㺨秆𩄍秔"]
]
[
["0","\u0000",127,"€"],
["8140","丂丄丅丆丏丒丗丟丠両丣並丩丮丯丱丳丵丷丼乀乁乂乄乆乊乑乕乗乚乛乢乣乤乥乧乨乪",5,"乲乴",9,"乿",6,"亇亊"],
["8180","亐亖亗亙亜亝亞亣亪亯亰亱亴亶亷亸亹亼亽亾仈仌仏仐仒仚仛仜仠仢仦仧仩仭仮仯仱仴仸仹仺仼仾伀伂",6,"伋伌伒",4,"伜伝伡伣伨伩伬伭伮伱伳伵伷伹伻伾",4,"佄佅佇",5,"佒佔佖佡佢佦佨佪佫佭佮佱佲併佷佸佹佺佽侀侁侂侅來侇侊侌侎侐侒侓侕侖侘侙侚侜侞侟価侢"],
["8240","侤侫侭侰",4,"侶",8,"俀俁係俆俇俈俉俋俌俍俒",4,"俙俛俠俢俤俥俧俫俬俰俲俴俵俶俷俹俻俼俽俿",11],
["8280","個倎倐們倓倕倖倗倛倝倞倠倢倣値倧倫倯",10,"倻倽倿偀偁偂偄偅偆偉偊偋偍偐",4,"偖偗偘偙偛偝",7,"偦",5,"偭",8,"偸偹偺偼偽傁傂傃傄傆傇傉傊傋傌傎",20,"傤傦傪傫傭",4,"傳",6,"傼"],
["8340","傽",17,"僐",5,"僗僘僙僛",10,"僨僩僪僫僯僰僱僲僴僶",4,"僼",9,"儈"],
["8380","儉儊儌",5,"儓",13,"儢",28,"兂兇兊兌兎兏児兒兓兗兘兙兛兝",4,"兣兤兦內兩兪兯兲兺兾兿冃冄円冇冊冋冎冏冐冑冓冔冘冚冝冞冟冡冣冦",4,"冭冮冴冸冹冺冾冿凁凂凃凅凈凊凍凎凐凒",5],
["8440","凘凙凚凜凞凟凢凣凥",5,"凬凮凱凲凴凷凾刄刅刉刋刌刏刐刓刔刕刜刞刟刡刢刣別刦刧刪刬刯刱刲刴刵刼刾剄",5,"剋剎剏剒剓剕剗剘"],
["8480","剙剚剛剝剟剠剢剣剤剦剨剫剬剭剮剰剱剳",9,"剾劀劃",4,"劉",6,"劑劒劔",6,"劜劤劥劦劧劮劯劰労",9,"勀勁勂勄勅勆勈勊勌勍勎勏勑勓勔動勗務",5,"勠勡勢勣勥",10,"勱",7,"勻勼勽匁匂匃匄匇匉匊匋匌匎"],
["8540","匑匒匓匔匘匛匜匞匟匢匤匥匧匨匩匫匬匭匯",9,"匼匽區卂卄卆卋卌卍卐協単卙卛卝卥卨卪卬卭卲卶卹卻卼卽卾厀厁厃厇厈厊厎厏"],
["8580","厐",4,"厖厗厙厛厜厞厠厡厤厧厪厫厬厭厯",6,"厷厸厹厺厼厽厾叀參",4,"収叏叐叒叓叕叚叜叝叞叡叢叧叴叺叾叿吀吂吅吇吋吔吘吙吚吜吢吤吥吪吰吳吶吷吺吽吿呁呂呄呅呇呉呌呍呎呏呑呚呝",4,"呣呥呧呩",7,"呴呹呺呾呿咁咃咅咇咈咉咊咍咑咓咗咘咜咞咟咠咡"],
["8640","咢咥咮咰咲咵咶咷咹咺咼咾哃哅哊哋哖哘哛哠",4,"哫哬哯哰哱哴",5,"哻哾唀唂唃唄唅唈唊",4,"唒唓唕",5,"唜唝唞唟唡唥唦"],
["8680","唨唩唫唭唲唴唵唶唸唹唺唻唽啀啂啅啇啈啋",4,"啑啒啓啔啗",4,"啝啞啟啠啢啣啨啩啫啯",5,"啹啺啽啿喅喆喌喍喎喐喒喓喕喖喗喚喛喞喠",6,"喨",8,"喲喴営喸喺喼喿",4,"嗆嗇嗈嗊嗋嗎嗏嗐嗕嗗",4,"嗞嗠嗢嗧嗩嗭嗮嗰嗱嗴嗶嗸",4,"嗿嘂嘃嘄嘅"],
["8740","嘆嘇嘊嘋嘍嘐",7,"嘙嘚嘜嘝嘠嘡嘢嘥嘦嘨嘩嘪嘫嘮嘯嘰嘳嘵嘷嘸嘺嘼嘽嘾噀",11,"噏",4,"噕噖噚噛噝",4],
["8780","噣噥噦噧噭噮噯噰噲噳噴噵噷噸噹噺噽",7,"嚇",6,"嚐嚑嚒嚔",14,"嚤",10,"嚰",6,"嚸嚹嚺嚻嚽",12,"囋",8,"囕囖囘囙囜団囥",5,"囬囮囯囲図囶囷囸囻囼圀圁圂圅圇國",6],
["8840","園",9,"圝圞圠圡圢圤圥圦圧圫圱圲圴",4,"圼圽圿坁坃坄坅坆坈坉坋坒",4,"坘坙坢坣坥坧坬坮坰坱坲坴坵坸坹坺坽坾坿垀"],
["8880","垁垇垈垉垊垍",4,"垔",6,"垜垝垞垟垥垨垪垬垯垰垱垳垵垶垷垹",8,"埄",6,"埌埍埐埑埓埖埗埛埜埞埡埢埣埥",7,"埮埰埱埲埳埵埶執埻埼埾埿堁堃堄堅堈堉堊堌堎堏堐堒堓堔堖堗堘堚堛堜堝堟堢堣堥",4,"堫",4,"報堲堳場堶",7],
["8940","堾",5,"塅",6,"塎塏塐塒塓塕塖塗塙",4,"塟",5,"塦",4,"塭",16,"塿墂墄墆墇墈墊墋墌"],
["8980","墍",4,"墔",4,"墛墜墝墠",7,"墪",17,"墽墾墿壀壂壃壄壆",10,"壒壓壔壖",13,"壥",5,"壭壯壱売壴壵壷壸壺",7,"夃夅夆夈",4,"夎夐夑夒夓夗夘夛夝夞夠夡夢夣夦夨夬夰夲夳夵夶夻"],
["8a40","夽夾夿奀奃奅奆奊奌奍奐奒奓奙奛",4,"奡奣奤奦",12,"奵奷奺奻奼奾奿妀妅妉妋妌妎妏妐妑妔妕妘妚妛妜妝妟妠妡妢妦"],
["8a80","妧妬妭妰妱妳",5,"妺妼妽妿",6,"姇姈姉姌姍姎姏姕姖姙姛姞",4,"姤姦姧姩姪姫姭",11,"姺姼姽姾娀娂娊娋娍娎娏娐娒娔娕娖娗娙娚娛娝娞娡娢娤娦娧娨娪",6,"娳娵娷",4,"娽娾娿婁",4,"婇婈婋",9,"婖婗婘婙婛",5],
["8b40","婡婣婤婥婦婨婩婫",8,"婸婹婻婼婽婾媀",17,"媓",6,"媜",13,"媫媬"],
["8b80","媭",4,"媴媶媷媹",4,"媿嫀嫃",5,"嫊嫋嫍",4,"嫓嫕嫗嫙嫚嫛嫝嫞嫟嫢嫤嫥嫧嫨嫪嫬",4,"嫲",22,"嬊",11,"嬘",25,"嬳嬵嬶嬸",7,"孁",6],
["8c40","孈",7,"孒孖孞孠孡孧孨孫孭孮孯孲孴孶孷學孹孻孼孾孿宂宆宊宍宎宐宑宒宔宖実宧宨宩宬宭宮宯宱宲宷宺宻宼寀寁寃寈寉寊寋寍寎寏"],
["8c80","寑寔",8,"寠寢寣實寧審",4,"寯寱",6,"寽対尀専尃尅將專尋尌對導尐尒尓尗尙尛尞尟尠尡尣尦尨尩尪尫尭尮尯尰尲尳尵尶尷屃屄屆屇屌屍屒屓屔屖屗屘屚屛屜屝屟屢層屧",6,"屰屲",6,"屻屼屽屾岀岃",4,"岉岊岋岎岏岒岓岕岝",4,"岤",4],
["8d40","岪岮岯岰岲岴岶岹岺岻岼岾峀峂峃峅",5,"峌",5,"峓",5,"峚",6,"峢峣峧峩峫峬峮峯峱",9,"峼",4],
["8d80","崁崄崅崈",5,"崏",4,"崕崗崘崙崚崜崝崟",4,"崥崨崪崫崬崯",4,"崵",7,"崿",7,"嵈嵉嵍",10,"嵙嵚嵜嵞",10,"嵪嵭嵮嵰嵱嵲嵳嵵",12,"嶃",21,"嶚嶛嶜嶞嶟嶠"],
["8e40","嶡",21,"嶸",12,"巆",6,"巎",12,"巜巟巠巣巤巪巬巭"],
["8e80","巰巵巶巸",4,"巿帀帄帇帉帊帋帍帎帒帓帗帞",7,"帨",4,"帯帰帲",4,"帹帺帾帿幀幁幃幆",5,"幍",6,"幖",4,"幜幝幟幠幣",14,"幵幷幹幾庁庂広庅庈庉庌庍庎庒庘庛庝庡庢庣庤庨",4,"庮",4,"庴庺庻庼庽庿",6],
["8f40","廆廇廈廋",5,"廔廕廗廘廙廚廜",11,"廩廫",8,"廵廸廹廻廼廽弅弆弇弉弌弍弎弐弒弔弖弙弚弜弝弞弡弢弣弤"],
["8f80","弨弫弬弮弰弲",6,"弻弽弾弿彁",14,"彑彔彙彚彛彜彞彟彠彣彥彧彨彫彮彯彲彴彵彶彸彺彽彾彿徃徆徍徎徏徑従徔徖徚徛徝從徟徠徢",5,"復徫徬徯",5,"徶徸徹徺徻徾",4,"忇忈忊忋忎忓忔忕忚忛応忞忟忢忣忥忦忨忩忬忯忰忲忳忴忶忷忹忺忼怇"],
["9040","怈怉怋怌怐怑怓怗怘怚怞怟怢怣怤怬怭怮怰",4,"怶",4,"怽怾恀恄",6,"恌恎恏恑恓恔恖恗恘恛恜恞恟恠恡恥恦恮恱恲恴恵恷恾悀"],
["9080","悁悂悅悆悇悈悊悋悎悏悐悑悓悕悗悘悙悜悞悡悢悤悥悧悩悪悮悰悳悵悶悷悹悺悽",7,"惇惈惉惌",4,"惒惓惔惖惗惙惛惞惡",4,"惪惱惲惵惷惸惻",4,"愂愃愄愅愇愊愋愌愐",4,"愖愗愘愙愛愜愝愞愡愢愥愨愩愪愬",18,"慀",6],
["9140","慇慉態慍慏慐慒慓慔慖",6,"慞慟慠慡慣慤慥慦慩",6,"慱慲慳慴慶慸",18,"憌憍憏",4,"憕"],
["9180","憖",6,"憞",8,"憪憫憭",9,"憸",5,"憿懀懁懃",4,"應懌",4,"懓懕",16,"懧",13,"懶",8,"戀",5,"戇戉戓戔戙戜戝戞戠戣戦戧戨戩戫戭戯戰戱戲戵戶戸",4,"扂扄扅扆扊"],
["9240","扏扐払扖扗扙扚扜",6,"扤扥扨扱扲扴扵扷扸扺扻扽抁抂抃抅抆抇抈抋",5,"抔抙抜抝択抣抦抧抩抪抭抮抯抰抲抳抴抶抷抸抺抾拀拁"],
["9280","拃拋拏拑拕拝拞拠拡拤拪拫拰拲拵拸拹拺拻挀挃挄挅挆挊挋挌挍挏挐挒挓挔挕挗挘挙挜挦挧挩挬挭挮挰挱挳",5,"挻挼挾挿捀捁捄捇捈捊捑捒捓捔捖",7,"捠捤捥捦捨捪捫捬捯捰捲捳捴捵捸捹捼捽捾捿掁掃掄掅掆掋掍掑掓掔掕掗掙",6,"採掤掦掫掯掱掲掵掶掹掻掽掿揀"],
["9340","揁揂揃揅揇揈揊揋揌揑揓揔揕揗",6,"揟揢揤",4,"揫揬揮揯揰揱揳揵揷揹揺揻揼揾搃搄搆",4,"損搎搑搒搕",5,"搝搟搢搣搤"],
["9380","搥搧搨搩搫搮",5,"搵",4,"搻搼搾摀摂摃摉摋",6,"摓摕摖摗摙",4,"摟",7,"摨摪摫摬摮",9,"摻",6,"撃撆撈",8,"撓撔撗撘撚撛撜撝撟",4,"撥撦撧撨撪撫撯撱撲撳撴撶撹撻撽撾撿擁擃擄擆",6,"擏擑擓擔擕擖擙據"],
["9440","擛擜擝擟擠擡擣擥擧",24,"攁",7,"攊",7,"攓",4,"攙",8],
["9480","攢攣攤攦",4,"攬攭攰攱攲攳攷攺攼攽敀",4,"敆敇敊敋敍敎敐敒敓敔敗敘敚敜敟敠敡敤敥敧敨敩敪敭敮敯敱敳敵敶數",14,"斈斉斊斍斎斏斒斔斕斖斘斚斝斞斠斢斣斦斨斪斬斮斱",7,"斺斻斾斿旀旂旇旈旉旊旍旐旑旓旔旕旘",7,"旡旣旤旪旫"],
["9540","旲旳旴旵旸旹旻",4,"昁昄昅昇昈昉昋昍昐昑昒昖昗昘昚昛昜昞昡昢昣昤昦昩昪昫昬昮昰昲昳昷",4,"昽昿晀時晄",6,"晍晎晐晑晘"],
["9580","晙晛晜晝晞晠晢晣晥晧晩",4,"晱晲晳晵晸晹晻晼晽晿暀暁暃暅暆暈暉暊暋暍暎暏暐暒暓暔暕暘",4,"暞",8,"暩",4,"暯",4,"暵暶暷暸暺暻暼暽暿",25,"曚曞",7,"曧曨曪",5,"曱曵曶書曺曻曽朁朂會"],
["9640","朄朅朆朇朌朎朏朑朒朓朖朘朙朚朜朞朠",5,"朧朩朮朰朲朳朶朷朸朹朻朼朾朿杁杄杅杇杊杋杍杒杔杕杗",4,"杝杢杣杤杦杧杫杬杮東杴杶"],
["9680","杸杹杺杻杽枀枂枃枅枆枈枊枌枍枎枏枑枒枓枔枖枙枛枟枠枡枤枦枩枬枮枱枲枴枹",7,"柂柅",9,"柕柖柗柛柟柡柣柤柦柧柨柪柫柭柮柲柵",7,"柾栁栂栃栄栆栍栐栒栔栕栘",4,"栞栟栠栢",6,"栫",6,"栴栵栶栺栻栿桇桋桍桏桒桖",5],
["9740","桜桝桞桟桪桬",7,"桵桸",8,"梂梄梇",7,"梐梑梒梔梕梖梘",9,"梣梤梥梩梪梫梬梮梱梲梴梶梷梸"],
["9780","梹",6,"棁棃",5,"棊棌棎棏棐棑棓棔棖棗棙棛",4,"棡棢棤",9,"棯棲棳棴棶棷棸棻棽棾棿椀椂椃椄椆",4,"椌椏椑椓",11,"椡椢椣椥",7,"椮椯椱椲椳椵椶椷椸椺椻椼椾楀楁楃",16,"楕楖楘楙楛楜楟"],
["9840","楡楢楤楥楧楨楩楪楬業楯楰楲",4,"楺楻楽楾楿榁榃榅榊榋榌榎",5,"榖榗榙榚榝",9,"榩榪榬榮榯榰榲榳榵榶榸榹榺榼榽"],
["9880","榾榿槀槂",7,"構槍槏槑槒槓槕",5,"槜槝槞槡",11,"槮槯槰槱槳",9,"槾樀",9,"樋",11,"標",5,"樠樢",5,"権樫樬樭樮樰樲樳樴樶",6,"樿",4,"橅橆橈",7,"橑",6,"橚"],
["9940","橜",4,"橢橣橤橦",10,"橲",6,"橺橻橽橾橿檁檂檃檅",8,"檏檒",4,"檘",7,"檡",5],
["9980","檧檨檪檭",114,"欥欦欨",6],
["9a40","欯欰欱欳欴欵欶欸欻欼欽欿歀歁歂歄歅歈歊歋歍",11,"歚",7,"歨歩歫",13,"歺歽歾歿殀殅殈"],
["9a80","殌殎殏殐殑殔殕殗殘殙殜",4,"殢",7,"殫",7,"殶殸",6,"毀毃毄毆",4,"毌毎毐毑毘毚毜",4,"毢",7,"毬毭毮毰毱毲毴毶毷毸毺毻毼毾",6,"氈",4,"氎氒気氜氝氞氠氣氥氫氬氭氱氳氶氷氹氺氻氼氾氿汃汄汅汈汋",4,"汑汒汓汖汘"],
["9b40","汙汚汢汣汥汦汧汫",4,"汱汳汵汷汸決汻汼汿沀沄沇沊沋沍沎沑沒沕沖沗沘沚沜沝沞沠沢沨沬沯沰沴沵沶沷沺泀況泂泃泆泇泈泋泍泎泏泑泒泘"],
["9b80","泙泚泜泝泟泤泦泧泩泬泭泲泴泹泿洀洂洃洅洆洈洉洊洍洏洐洑洓洔洕洖洘洜洝洟",5,"洦洨洩洬洭洯洰洴洶洷洸洺洿浀浂浄浉浌浐浕浖浗浘浛浝浟浡浢浤浥浧浨浫浬浭浰浱浲浳浵浶浹浺浻浽",4,"涃涄涆涇涊涋涍涏涐涒涖",4,"涜涢涥涬涭涰涱涳涴涶涷涹",5,"淁淂淃淈淉淊"],
["9c40","淍淎淏淐淒淓淔淕淗淚淛淜淟淢淣淥淧淨淩淪淭淯淰淲淴淵淶淸淺淽",7,"渆渇済渉渋渏渒渓渕渘渙減渜渞渟渢渦渧渨渪測渮渰渱渳渵"],
["9c80","渶渷渹渻",7,"湅",7,"湏湐湑湒湕湗湙湚湜湝湞湠",10,"湬湭湯",14,"満溁溂溄溇溈溊",4,"溑",6,"溙溚溛溝溞溠溡溣溤溦溨溩溫溬溭溮溰溳溵溸溹溼溾溿滀滃滄滅滆滈滉滊滌滍滎滐滒滖滘滙滛滜滝滣滧滪",5],
["9d40","滰滱滲滳滵滶滷滸滺",7,"漃漄漅漇漈漊",4,"漐漑漒漖",9,"漡漢漣漥漦漧漨漬漮漰漲漴漵漷",6,"漿潀潁潂"],
["9d80","潃潄潅潈潉潊潌潎",9,"潙潚潛潝潟潠潡潣潤潥潧",5,"潯潰潱潳潵潶潷潹潻潽",6,"澅澆澇澊澋澏",12,"澝澞澟澠澢",4,"澨",10,"澴澵澷澸澺",5,"濁濃",5,"濊",6,"濓",10,"濟濢濣濤濥"],
["9e40","濦",7,"濰",32,"瀒",7,"瀜",6,"瀤",6],
["9e80","瀫",9,"瀶瀷瀸瀺",17,"灍灎灐",13,"灟",11,"灮灱灲灳灴灷灹灺灻災炁炂炃炄炆炇炈炋炌炍炏炐炑炓炗炘炚炛炞",12,"炰炲炴炵炶為炾炿烄烅烆烇烉烋",12,"烚"],
["9f40","烜烝烞烠烡烢烣烥烪烮烰",6,"烸烺烻烼烾",10,"焋",4,"焑焒焔焗焛",10,"焧",7,"焲焳焴"],
["9f80","焵焷",13,"煆煇煈煉煋煍煏",12,"煝煟",4,"煥煩",4,"煯煰煱煴煵煶煷煹煻煼煾",5,"熅",4,"熋熌熍熎熐熑熒熓熕熖熗熚",4,"熡",6,"熩熪熫熭",5,"熴熶熷熸熺",8,"燄",9,"燏",4],
["a040","燖",9,"燡燢燣燤燦燨",5,"燯",9,"燺",11,"爇",19],
["a080","爛爜爞",9,"爩爫爭爮爯爲爳爴爺爼爾牀",6,"牉牊牋牎牏牐牑牓牔牕牗牘牚牜牞牠牣牤牥牨牪牫牬牭牰牱牳牴牶牷牸牻牼牽犂犃犅",4,"犌犎犐犑犓",11,"犠",11,"犮犱犲犳犵犺",6,"狅狆狇狉狊狋狌狏狑狓狔狕狖狘狚狛"],
["a1a1","　、。·ˉˇ¨〃々—～‖…‘’“”〔〕〈",7,"〖〗【】±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴♂♀°′″℃＄¤￠￡‰§№☆★○●◎◇◆□■△▲※→←↑↓〓"],
["a2a1","ⅰ",9],
["a2b1","⒈",19,"⑴",19,"①",9],
["a2e5","㈠",9],
["a2f1","Ⅰ",11],
["a3a1","！＂＃￥％",88,"￣"],
["a4a1","ぁ",82],
["a5a1","ァ",85],
["a6a1","Α",16,"Σ",6],
["a6c1","α",16,"σ",6],
["a6e0","︵︶︹︺︿﹀︽︾﹁﹂﹃﹄"],
["a6ee","︻︼︷︸︱"],
["a6f4","︳︴"],
["a7a1","А",5,"ЁЖ",25],
["a7d1","а",5,"ёж",25],
["a840","ˊˋ˙–―‥‵℅℉↖↗↘↙∕∟∣≒≦≧⊿═",35,"▁",6],
["a880","█",7,"▓▔▕▼▽◢◣◤◥☉⊕〒〝〞"],
["a8a1","āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüêɑ"],
["a8bd","ńň"],
["a8c0","ɡ"],
["a8c5","ㄅ",36],
["a940","〡",8,"㊣㎎㎏㎜㎝㎞㎡㏄㏎㏑㏒㏕︰￢￤"],
["a959","℡㈱"],
["a95c","‐"],
["a960","ー゛゜ヽヾ〆ゝゞ﹉",9,"﹔﹕﹖﹗﹙",8],
["a980","﹢",4,"﹨﹩﹪﹫"],
["a996","〇"],
["a9a4","─",75],
["aa40","狜狝狟狢",5,"狪狫狵狶狹狽狾狿猀猂猄",5,"猋猌猍猏猐猑猒猔猘猙猚猟猠猣猤猦猧猨猭猯猰猲猳猵猶猺猻猼猽獀",8],
["aa80","獉獊獋獌獎獏獑獓獔獕獖獘",7,"獡",10,"獮獰獱"],
["ab40","獲",11,"獿",4,"玅玆玈玊玌玍玏玐玒玓玔玕玗玘玙玚玜玝玞玠玡玣",5,"玪玬玭玱玴玵玶玸玹玼玽玾玿珁珃",4],
["ab80","珋珌珎珒",6,"珚珛珜珝珟珡珢珣珤珦珨珪珫珬珮珯珰珱珳",4],
["ac40","珸",10,"琄琇琈琋琌琍琎琑",8,"琜",5,"琣琤琧琩琫琭琯琱琲琷",4,"琽琾琿瑀瑂",11],
["ac80","瑎",6,"瑖瑘瑝瑠",12,"瑮瑯瑱",4,"瑸瑹瑺"],
["ad40","瑻瑼瑽瑿璂璄璅璆璈璉璊璌璍璏璑",10,"璝璟",7,"璪",15,"璻",12],
["ad80","瓈",9,"瓓",8,"瓝瓟瓡瓥瓧",6,"瓰瓱瓲"],
["ae40","瓳瓵瓸",6,"甀甁甂甃甅",7,"甎甐甒甔甕甖甗甛甝甞甠",4,"甦甧甪甮甴甶甹甼甽甿畁畂畃畄畆畇畉畊畍畐畑畒畓畕畖畗畘"],
["ae80","畝",7,"畧畨畩畫",6,"畳畵當畷畺",4,"疀疁疂疄疅疇"],
["af40","疈疉疊疌疍疎疐疓疕疘疛疜疞疢疦",4,"疭疶疷疺疻疿痀痁痆痋痌痎痏痐痑痓痗痙痚痜痝痟痠痡痥痩痬痭痮痯痲痳痵痶痷痸痺痻痽痾瘂瘄瘆瘇"],
["af80","瘈瘉瘋瘍瘎瘏瘑瘒瘓瘔瘖瘚瘜瘝瘞瘡瘣瘧瘨瘬瘮瘯瘱瘲瘶瘷瘹瘺瘻瘽癁療癄"],
["b040","癅",6,"癎",5,"癕癗",4,"癝癟癠癡癢癤",6,"癬癭癮癰",7,"癹発發癿皀皁皃皅皉皊皌皍皏皐皒皔皕皗皘皚皛"],
["b080","皜",7,"皥",8,"皯皰皳皵",9,"盀盁盃啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥"],
["b140","盄盇盉盋盌盓盕盙盚盜盝盞盠",4,"盦",7,"盰盳盵盶盷盺盻盽盿眀眂眃眅眆眊県眎",10,"眛眜眝眞眡眣眤眥眧眪眫"],
["b180","眬眮眰",4,"眹眻眽眾眿睂睄睅睆睈",7,"睒",7,"睜薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳"],
["b240","睝睞睟睠睤睧睩睪睭",11,"睺睻睼瞁瞂瞃瞆",5,"瞏瞐瞓",11,"瞡瞣瞤瞦瞨瞫瞭瞮瞯瞱瞲瞴瞶",4],
["b280","瞼瞾矀",12,"矎",8,"矘矙矚矝",4,"矤病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖"],
["b340","矦矨矪矯矰矱矲矴矵矷矹矺矻矼砃",5,"砊砋砎砏砐砓砕砙砛砞砠砡砢砤砨砪砫砮砯砱砲砳砵砶砽砿硁硂硃硄硆硈硉硊硋硍硏硑硓硔硘硙硚"],
["b380","硛硜硞",11,"硯",7,"硸硹硺硻硽",6,"场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚"],
["b440","碄碅碆碈碊碋碏碐碒碔碕碖碙碝碞碠碢碤碦碨",7,"碵碶碷碸確碻碼碽碿磀磂磃磄磆磇磈磌磍磎磏磑磒磓磖磗磘磚",9],
["b480","磤磥磦磧磩磪磫磭",4,"磳磵磶磸磹磻",5,"礂礃礄礆",6,"础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮"],
["b540","礍",5,"礔",9,"礟",4,"礥",14,"礵",4,"礽礿祂祃祄祅祇祊",8,"祔祕祘祙祡祣"],
["b580","祤祦祩祪祫祬祮祰",6,"祹祻",4,"禂禃禆禇禈禉禋禌禍禎禐禑禒怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠"],
["b640","禓",6,"禛",11,"禨",10,"禴",4,"禼禿秂秄秅秇秈秊秌秎秏秐秓秔秖秗秙",5,"秠秡秢秥秨秪"],
["b680","秬秮秱",6,"秹秺秼秾秿稁稄稅稇稈稉稊稌稏",4,"稕稖稘稙稛稜丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二"],
["b740","稝稟稡稢稤",14,"稴稵稶稸稺稾穀",5,"穇",9,"穒",4,"穘",16],
["b780","穩",6,"穱穲穳穵穻穼穽穾窂窅窇窉窊窋窌窎窏窐窓窔窙窚窛窞窡窢贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服"],
["b840","窣窤窧窩窪窫窮",4,"窴",10,"竀",10,"竌",9,"竗竘竚竛竜竝竡竢竤竧",5,"竮竰竱竲竳"],
["b880","竴",4,"竻竼竾笀笁笂笅笇笉笌笍笎笐笒笓笖笗笘笚笜笝笟笡笢笣笧笩笭浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹"],
["b940","笯笰笲笴笵笶笷笹笻笽笿",5,"筆筈筊筍筎筓筕筗筙筜筞筟筡筣",10,"筯筰筳筴筶筸筺筼筽筿箁箂箃箄箆",6,"箎箏"],
["b980","箑箒箓箖箘箙箚箛箞箟箠箣箤箥箮箯箰箲箳箵箶箷箹",7,"篂篃範埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈"],
["ba40","篅篈築篊篋篍篎篏篐篒篔",4,"篛篜篞篟篠篢篣篤篧篨篩篫篬篭篯篰篲",4,"篸篹篺篻篽篿",7,"簈簉簊簍簎簐",5,"簗簘簙"],
["ba80","簚",4,"簠",5,"簨簩簫",12,"簹",5,"籂骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖"],
["bb40","籃",9,"籎",36,"籵",5,"籾",9],
["bb80","粈粊",6,"粓粔粖粙粚粛粠粡粣粦粧粨粩粫粬粭粯粰粴",4,"粺粻弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕"],
["bc40","粿糀糂糃糄糆糉糋糎",6,"糘糚糛糝糞糡",6,"糩",5,"糰",7,"糹糺糼",13,"紋",5],
["bc80","紑",14,"紡紣紤紥紦紨紩紪紬紭紮細",6,"肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件"],
["bd40","紷",54,"絯",7],
["bd80","絸",32,"健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸"],
["be40","継",12,"綧",6,"綯",42],
["be80","線",32,"尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻"],
["bf40","緻",62],
["bf80","縺縼",4,"繂",4,"繈",21,"俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀"],
["c040","繞",35,"纃",23,"纜纝纞"],
["c080","纮纴纻纼绖绤绬绹缊缐缞缷缹缻",6,"罃罆",9,"罒罓馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐"],
["c140","罖罙罛罜罝罞罠罣",4,"罫罬罭罯罰罳罵罶罷罸罺罻罼罽罿羀羂",7,"羋羍羏",4,"羕",4,"羛羜羠羢羣羥羦羨",6,"羱"],
["c180","羳",4,"羺羻羾翀翂翃翄翆翇翈翉翋翍翏",4,"翖翗翙",5,"翢翣痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿"],
["c240","翤翧翨翪翫翬翭翯翲翴",6,"翽翾翿耂耇耈耉耊耎耏耑耓耚耛耝耞耟耡耣耤耫",5,"耲耴耹耺耼耾聀聁聄聅聇聈聉聎聏聐聑聓聕聖聗"],
["c280","聙聛",13,"聫",5,"聲",11,"隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫"],
["c340","聾肁肂肅肈肊肍",5,"肔肕肗肙肞肣肦肧肨肬肰肳肵肶肸肹肻胅胇",4,"胏",6,"胘胟胠胢胣胦胮胵胷胹胻胾胿脀脁脃脄脅脇脈脋"],
["c380","脌脕脗脙脛脜脝脟",12,"脭脮脰脳脴脵脷脹",4,"脿谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸"],
["c440","腀",5,"腇腉腍腎腏腒腖腗腘腛",4,"腡腢腣腤腦腨腪腫腬腯腲腳腵腶腷腸膁膃",4,"膉膋膌膍膎膐膒",5,"膙膚膞",4,"膤膥"],
["c480","膧膩膫",7,"膴",5,"膼膽膾膿臄臅臇臈臉臋臍",6,"摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁"],
["c540","臔",14,"臤臥臦臨臩臫臮",4,"臵",5,"臽臿舃與",4,"舎舏舑舓舕",5,"舝舠舤舥舦舧舩舮舲舺舼舽舿"],
["c580","艀艁艂艃艅艆艈艊艌艍艎艐",7,"艙艛艜艝艞艠",7,"艩拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗"],
["c640","艪艫艬艭艱艵艶艷艸艻艼芀芁芃芅芆芇芉芌芐芓芔芕芖芚芛芞芠芢芣芧芲芵芶芺芻芼芿苀苂苃苅苆苉苐苖苙苚苝苢苧苨苩苪苬苭苮苰苲苳苵苶苸"],
["c680","苺苼",4,"茊茋茍茐茒茓茖茘茙茝",9,"茩茪茮茰茲茷茻茽啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐"],
["c740","茾茿荁荂荄荅荈荊",4,"荓荕",4,"荝荢荰",6,"荹荺荾",6,"莇莈莊莋莌莍莏莐莑莔莕莖莗莙莚莝莟莡",6,"莬莭莮"],
["c780","莯莵莻莾莿菂菃菄菆菈菉菋菍菎菐菑菒菓菕菗菙菚菛菞菢菣菤菦菧菨菫菬菭恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠"],
["c840","菮華菳",4,"菺菻菼菾菿萀萂萅萇萈萉萊萐萒",5,"萙萚萛萞",5,"萩",7,"萲",5,"萹萺萻萾",7,"葇葈葉"],
["c880","葊",6,"葒",4,"葘葝葞葟葠葢葤",4,"葪葮葯葰葲葴葷葹葻葼取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁"],
["c940","葽",4,"蒃蒄蒅蒆蒊蒍蒏",7,"蒘蒚蒛蒝蒞蒟蒠蒢",12,"蒰蒱蒳蒵蒶蒷蒻蒼蒾蓀蓂蓃蓅蓆蓇蓈蓋蓌蓎蓏蓒蓔蓕蓗"],
["c980","蓘",4,"蓞蓡蓢蓤蓧",4,"蓭蓮蓯蓱",10,"蓽蓾蔀蔁蔂伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳"],
["ca40","蔃",8,"蔍蔎蔏蔐蔒蔔蔕蔖蔘蔙蔛蔜蔝蔞蔠蔢",8,"蔭",9,"蔾",4,"蕄蕅蕆蕇蕋",10],
["ca80","蕗蕘蕚蕛蕜蕝蕟",4,"蕥蕦蕧蕩",8,"蕳蕵蕶蕷蕸蕼蕽蕿薀薁省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱"],
["cb40","薂薃薆薈",6,"薐",10,"薝",6,"薥薦薧薩薫薬薭薱",5,"薸薺",6,"藂",6,"藊",4,"藑藒"],
["cb80","藔藖",5,"藝",6,"藥藦藧藨藪",14,"恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔"],
["cc40","藹藺藼藽藾蘀",4,"蘆",10,"蘒蘓蘔蘕蘗",15,"蘨蘪",13,"蘹蘺蘻蘽蘾蘿虀"],
["cc80","虁",11,"虒虓處",4,"虛虜虝號虠虡虣",7,"獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃"],
["cd40","虭虯虰虲",6,"蚃",6,"蚎",4,"蚔蚖",5,"蚞",4,"蚥蚦蚫蚭蚮蚲蚳蚷蚸蚹蚻",4,"蛁蛂蛃蛅蛈蛌蛍蛒蛓蛕蛖蛗蛚蛜"],
["cd80","蛝蛠蛡蛢蛣蛥蛦蛧蛨蛪蛫蛬蛯蛵蛶蛷蛺蛻蛼蛽蛿蜁蜄蜅蜆蜋蜌蜎蜏蜐蜑蜔蜖汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威"],
["ce40","蜙蜛蜝蜟蜠蜤蜦蜧蜨蜪蜫蜬蜭蜯蜰蜲蜳蜵蜶蜸蜹蜺蜼蜽蝀",6,"蝊蝋蝍蝏蝐蝑蝒蝔蝕蝖蝘蝚",5,"蝡蝢蝦",7,"蝯蝱蝲蝳蝵"],
["ce80","蝷蝸蝹蝺蝿螀螁螄螆螇螉螊螌螎",4,"螔螕螖螘",6,"螠",4,"巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺"],
["cf40","螥螦螧螩螪螮螰螱螲螴螶螷螸螹螻螼螾螿蟁",4,"蟇蟈蟉蟌",4,"蟔",6,"蟜蟝蟞蟟蟡蟢蟣蟤蟦蟧蟨蟩蟫蟬蟭蟯",9],
["cf80","蟺蟻蟼蟽蟿蠀蠁蠂蠄",5,"蠋",7,"蠔蠗蠘蠙蠚蠜",4,"蠣稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓"],
["d040","蠤",13,"蠳",5,"蠺蠻蠽蠾蠿衁衂衃衆",5,"衎",5,"衕衖衘衚",6,"衦衧衪衭衯衱衳衴衵衶衸衹衺"],
["d080","衻衼袀袃袆袇袉袊袌袎袏袐袑袓袔袕袗",4,"袝",4,"袣袥",5,"小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄"],
["d140","袬袮袯袰袲",4,"袸袹袺袻袽袾袿裀裃裄裇裈裊裋裌裍裏裐裑裓裖裗裚",4,"裠裡裦裧裩",6,"裲裵裶裷裺裻製裿褀褁褃",5],
["d180","褉褋",4,"褑褔",4,"褜",4,"褢褣褤褦褧褨褩褬褭褮褯褱褲褳褵褷选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶"],
["d240","褸",8,"襂襃襅",24,"襠",5,"襧",19,"襼"],
["d280","襽襾覀覂覄覅覇",26,"摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐"],
["d340","覢",30,"觃觍觓觔觕觗觘觙觛觝觟觠觡觢觤觧觨觩觪觬觭觮觰觱觲觴",6],
["d380","觻",4,"訁",5,"計",21,"印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉"],
["d440","訞",31,"訿",8,"詉",21],
["d480","詟",25,"詺",6,"浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧"],
["d540","誁",7,"誋",7,"誔",46],
["d580","諃",32,"铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政"],
["d640","諤",34,"謈",27],
["d680","謤謥謧",30,"帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑"],
["d740","譆",31,"譧",4,"譭",25],
["d780","讇",24,"讬讱讻诇诐诪谉谞住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座"],
["d840","谸",8,"豂豃豄豅豈豊豋豍",7,"豖豗豘豙豛",5,"豣",6,"豬",6,"豴豵豶豷豻",6,"貃貄貆貇"],
["d880","貈貋貍",6,"貕貖貗貙",20,"亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝"],
["d940","貮",62],
["d980","賭",32,"佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼"],
["da40","贎",14,"贠赑赒赗赟赥赨赩赪赬赮赯赱赲赸",8,"趂趃趆趇趈趉趌",4,"趒趓趕",9,"趠趡"],
["da80","趢趤",12,"趲趶趷趹趻趽跀跁跂跅跇跈跉跊跍跐跒跓跔凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺"],
["db40","跕跘跙跜跠跡跢跥跦跧跩跭跮跰跱跲跴跶跼跾",6,"踆踇踈踋踍踎踐踑踒踓踕",7,"踠踡踤",4,"踫踭踰踲踳踴踶踷踸踻踼踾"],
["db80","踿蹃蹅蹆蹌",4,"蹓",5,"蹚",11,"蹧蹨蹪蹫蹮蹱邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝"],
["dc40","蹳蹵蹷",4,"蹽蹾躀躂躃躄躆躈",6,"躑躒躓躕",6,"躝躟",11,"躭躮躰躱躳",6,"躻",7],
["dc80","軃",10,"軏",21,"堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥"],
["dd40","軥",62],
["dd80","輤",32,"荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺"],
["de40","轅",32,"轪辀辌辒辝辠辡辢辤辥辦辧辪辬辭辮辯農辳辴辵辷辸辺辻込辿迀迃迆"],
["de80","迉",4,"迏迒迖迗迚迠迡迣迧迬迯迱迲迴迵迶迺迻迼迾迿逇逈逌逎逓逕逘蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖"],
["df40","這逜連逤逥逧",5,"逰",4,"逷逹逺逽逿遀遃遅遆遈",4,"過達違遖遙遚遜",5,"遤遦遧適遪遫遬遯",4,"遶",6,"遾邁"],
["df80","還邅邆邇邉邊邌",4,"邒邔邖邘邚邜邞邟邠邤邥邧邨邩邫邭邲邷邼邽邿郀摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼"],
["e040","郂郃郆郈郉郋郌郍郒郔郕郖郘郙郚郞郟郠郣郤郥郩郪郬郮郰郱郲郳郵郶郷郹郺郻郼郿鄀鄁鄃鄅",19,"鄚鄛鄜"],
["e080","鄝鄟鄠鄡鄤",10,"鄰鄲",6,"鄺",8,"酄唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼"],
["e140","酅酇酈酑酓酔酕酖酘酙酛酜酟酠酦酧酨酫酭酳酺酻酼醀",4,"醆醈醊醎醏醓",6,"醜",5,"醤",5,"醫醬醰醱醲醳醶醷醸醹醻"],
["e180","醼",10,"釈釋釐釒",9,"針",8,"帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺"],
["e240","釦",62],
["e280","鈥",32,"狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧",5,"饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂"],
["e340","鉆",45,"鉵",16],
["e380","銆",7,"銏",24,"恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾"],
["e440","銨",5,"銯",24,"鋉",31],
["e480","鋩",32,"洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑"],
["e540","錊",51,"錿",10],
["e580","鍊",31,"鍫濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣"],
["e640","鍬",34,"鎐",27],
["e680","鎬",29,"鏋鏌鏍妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩"],
["e740","鏎",7,"鏗",54],
["e780","鐎",32,"纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡",6,"缪缫缬缭缯",4,"缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬"],
["e840","鐯",14,"鐿",43,"鑬鑭鑮鑯"],
["e880","鑰",20,"钑钖钘铇铏铓铔铚铦铻锜锠琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹"],
["e940","锧锳锽镃镈镋镕镚镠镮镴镵長",7,"門",42],
["e980","閫",32,"椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋"],
["ea40","闌",27,"闬闿阇阓阘阛阞阠阣",6,"阫阬阭阯阰阷阸阹阺阾陁陃陊陎陏陑陒陓陖陗"],
["ea80","陘陙陚陜陝陞陠陣陥陦陫陭",4,"陳陸",12,"隇隉隊辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰"],
["eb40","隌階隑隒隓隕隖隚際隝",9,"隨",7,"隱隲隴隵隷隸隺隻隿雂雃雈雊雋雐雑雓雔雖",9,"雡",6,"雫"],
["eb80","雬雭雮雰雱雲雴雵雸雺電雼雽雿霂霃霅霊霋霌霐霑霒霔霕霗",4,"霝霟霠搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻"],
["ec40","霡",8,"霫霬霮霯霱霳",4,"霺霻霼霽霿",18,"靔靕靗靘靚靜靝靟靣靤靦靧靨靪",7],
["ec80","靲靵靷",4,"靽",7,"鞆",4,"鞌鞎鞏鞐鞓鞕鞖鞗鞙",4,"臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐"],
["ed40","鞞鞟鞡鞢鞤",6,"鞬鞮鞰鞱鞳鞵",46],
["ed80","韤韥韨韮",4,"韴韷",23,"怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨"],
["ee40","頏",62],
["ee80","顎",32,"睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶",4,"钼钽钿铄铈",6,"铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪"],
["ef40","顯",5,"颋颎颒颕颙颣風",37,"飏飐飔飖飗飛飜飝飠",4],
["ef80","飥飦飩",30,"铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒",4,"锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤",8,"镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔"],
["f040","餈",4,"餎餏餑",28,"餯",26],
["f080","饊",9,"饖",12,"饤饦饳饸饹饻饾馂馃馉稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨",4,"鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦",6,"鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙"],
["f140","馌馎馚",10,"馦馧馩",47],
["f180","駙",32,"瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃"],
["f240","駺",62],
["f280","騹",32,"颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒"],
["f340","驚",17,"驲骃骉骍骎骔骕骙骦骩",6,"骲骳骴骵骹骻骽骾骿髃髄髆",4,"髍髎髏髐髒體髕髖髗髙髚髛髜"],
["f380","髝髞髠髢髣髤髥髧髨髩髪髬髮髰",8,"髺髼",6,"鬄鬅鬆蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋"],
["f440","鬇鬉",5,"鬐鬑鬒鬔",10,"鬠鬡鬢鬤",10,"鬰鬱鬳",7,"鬽鬾鬿魀魆魊魋魌魎魐魒魓魕",5],
["f480","魛",32,"簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤"],
["f540","魼",62],
["f580","鮻",32,"酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜"],
["f640","鯜",62],
["f680","鰛",32,"觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅",5,"龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞",5,"鲥",4,"鲫鲭鲮鲰",7,"鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋"],
["f740","鰼",62],
["f780","鱻鱽鱾鲀鲃鲄鲉鲊鲌鲏鲓鲖鲗鲘鲙鲝鲪鲬鲯鲹鲾",4,"鳈鳉鳑鳒鳚鳛鳠鳡鳌",4,"鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄"],
["f840","鳣",62],
["f880","鴢",32],
["f940","鵃",62],
["f980","鶂",32],
["fa40","鶣",62],
["fa80","鷢",32],
["fb40","鸃",27,"鸤鸧鸮鸰鸴鸻鸼鹀鹍鹐鹒鹓鹔鹖鹙鹝鹟鹠鹡鹢鹥鹮鹯鹲鹴",9,"麀"],
["fb80","麁麃麄麅麆麉麊麌",5,"麔",8,"麞麠",5,"麧麨麩麪"],
["fc40","麫",8,"麵麶麷麹麺麼麿",4,"黅黆黇黈黊黋黌黐黒黓黕黖黗黙黚點黡黣黤黦黨黫黬黭黮黰",8,"黺黽黿",6],
["fc80","鼆",4,"鼌鼏鼑鼒鼔鼕鼖鼘鼚",5,"鼡鼣",8,"鼭鼮鼰鼱"],
["fd40","鼲",4,"鼸鼺鼼鼿",4,"齅",10,"齒",38],
["fd80","齹",5,"龁龂龍",11,"龜龝龞龡",4,"郎凉秊裏隣"],
["fe40","兀嗀﨎﨏﨑﨓﨔礼﨟蘒﨡﨣﨤﨧﨨﨩"]
]
[
["0","\u0000",127],
["8141","갂갃갅갆갋",4,"갘갞갟갡갢갣갥",6,"갮갲갳갴"],
["8161","갵갶갷갺갻갽갾갿걁",9,"걌걎",5,"걕"],
["8181","걖걗걙걚걛걝",18,"걲걳걵걶걹걻",4,"겂겇겈겍겎겏겑겒겓겕",6,"겞겢",5,"겫겭겮겱",6,"겺겾겿곀곂곃곅곆곇곉곊곋곍",7,"곖곘",7,"곢곣곥곦곩곫곭곮곲곴곷",4,"곾곿괁괂괃괅괇",4,"괎괐괒괓"],
["8241","괔괕괖괗괙괚괛괝괞괟괡",7,"괪괫괮",5],
["8261","괶괷괹괺괻괽",6,"굆굈굊",5,"굑굒굓굕굖굗"],
["8281","굙",7,"굢굤",7,"굮굯굱굲굷굸굹굺굾궀궃",4,"궊궋궍궎궏궑",10,"궞",5,"궥",17,"궸",7,"귂귃귅귆귇귉",6,"귒귔",7,"귝귞귟귡귢귣귥",18],
["8341","귺귻귽귾긂",5,"긊긌긎",5,"긕",7],
["8361","긝",18,"긲긳긵긶긹긻긼"],
["8381","긽긾긿깂깄깇깈깉깋깏깑깒깓깕깗",4,"깞깢깣깤깦깧깪깫깭깮깯깱",6,"깺깾",5,"꺆",5,"꺍",46,"꺿껁껂껃껅",6,"껎껒",5,"껚껛껝",8],
["8441","껦껧껩껪껬껮",5,"껵껶껷껹껺껻껽",8],
["8461","꼆꼉꼊꼋꼌꼎꼏꼑",18],
["8481","꼤",7,"꼮꼯꼱꼳꼵",6,"꼾꽀꽄꽅꽆꽇꽊",5,"꽑",10,"꽞",5,"꽦",18,"꽺",5,"꾁꾂꾃꾅꾆꾇꾉",6,"꾒꾓꾔꾖",5,"꾝",26,"꾺꾻꾽꾾"],
["8541","꾿꿁",5,"꿊꿌꿏",4,"꿕",6,"꿝",4],
["8561","꿢",5,"꿪",5,"꿲꿳꿵꿶꿷꿹",6,"뀂뀃"],
["8581","뀅",6,"뀍뀎뀏뀑뀒뀓뀕",6,"뀞",9,"뀩",26,"끆끇끉끋끍끏끐끑끒끖끘끚끛끜끞",29,"끾끿낁낂낃낅",6,"낎낐낒",5,"낛낝낞낣낤"],
["8641","낥낦낧낪낰낲낶낷낹낺낻낽",6,"냆냊",5,"냒"],
["8661","냓냕냖냗냙",6,"냡냢냣냤냦",10],
["8681","냱",22,"넊넍넎넏넑넔넕넖넗넚넞",4,"넦넧넩넪넫넭",6,"넶넺",5,"녂녃녅녆녇녉",6,"녒녓녖녗녙녚녛녝녞녟녡",22,"녺녻녽녾녿놁놃",4,"놊놌놎놏놐놑놕놖놗놙놚놛놝"],
["8741","놞",9,"놩",15],
["8761","놹",18,"뇍뇎뇏뇑뇒뇓뇕"],
["8781","뇖",5,"뇞뇠",7,"뇪뇫뇭뇮뇯뇱",7,"뇺뇼뇾",5,"눆눇눉눊눍",6,"눖눘눚",5,"눡",18,"눵",6,"눽",26,"뉙뉚뉛뉝뉞뉟뉡",6,"뉪",4],
["8841","뉯",4,"뉶",5,"뉽",6,"늆늇늈늊",4],
["8861","늏늒늓늕늖늗늛",4,"늢늤늧늨늩늫늭늮늯늱늲늳늵늶늷"],
["8881","늸",15,"닊닋닍닎닏닑닓",4,"닚닜닞닟닠닡닣닧닩닪닰닱닲닶닼닽닾댂댃댅댆댇댉",6,"댒댖",5,"댝",54,"덗덙덚덝덠덡덢덣"],
["8941","덦덨덪덬덭덯덲덳덵덶덷덹",6,"뎂뎆",5,"뎍"],
["8961","뎎뎏뎑뎒뎓뎕",10,"뎢",5,"뎩뎪뎫뎭"],
["8981","뎮",21,"돆돇돉돊돍돏돑돒돓돖돘돚돜돞돟돡돢돣돥돦돧돩",18,"돽",18,"됑",6,"됙됚됛됝됞됟됡",6,"됪됬",7,"됵",15],
["8a41","둅",10,"둒둓둕둖둗둙",6,"둢둤둦"],
["8a61","둧",4,"둭",18,"뒁뒂"],
["8a81","뒃",4,"뒉",19,"뒞",5,"뒥뒦뒧뒩뒪뒫뒭",7,"뒶뒸뒺",5,"듁듂듃듅듆듇듉",6,"듑듒듓듔듖",5,"듞듟듡듢듥듧",4,"듮듰듲",5,"듹",26,"딖딗딙딚딝"],
["8b41","딞",5,"딦딫",4,"딲딳딵딶딷딹",6,"땂땆"],
["8b61","땇땈땉땊땎땏땑땒땓땕",6,"땞땢",8],
["8b81","땫",52,"떢떣떥떦떧떩떬떭떮떯떲떶",4,"떾떿뗁뗂뗃뗅",6,"뗎뗒",5,"뗙",18,"뗭",18],
["8c41","똀",15,"똒똓똕똖똗똙",4],
["8c61","똞",6,"똦",5,"똭",6,"똵",5],
["8c81","똻",12,"뙉",26,"뙥뙦뙧뙩",50,"뚞뚟뚡뚢뚣뚥",5,"뚭뚮뚯뚰뚲",16],
["8d41","뛃",16,"뛕",8],
["8d61","뛞",17,"뛱뛲뛳뛵뛶뛷뛹뛺"],
["8d81","뛻",4,"뜂뜃뜄뜆",33,"뜪뜫뜭뜮뜱",6,"뜺뜼",7,"띅띆띇띉띊띋띍",6,"띖",9,"띡띢띣띥띦띧띩",6,"띲띴띶",5,"띾띿랁랂랃랅",6,"랎랓랔랕랚랛랝랞"],
["8e41","랟랡",6,"랪랮",5,"랶랷랹",8],
["8e61","럂",4,"럈럊",19],
["8e81","럞",13,"럮럯럱럲럳럵",6,"럾렂",4,"렊렋렍렎렏렑",6,"렚렜렞",5,"렦렧렩렪렫렭",6,"렶렺",5,"롁롂롃롅",11,"롒롔",7,"롞롟롡롢롣롥",6,"롮롰롲",5,"롹롺롻롽",7],
["8f41","뢅",7,"뢎",17],
["8f61","뢠",7,"뢩",6,"뢱뢲뢳뢵뢶뢷뢹",4],
["8f81","뢾뢿룂룄룆",5,"룍룎룏룑룒룓룕",7,"룞룠룢",5,"룪룫룭룮룯룱",6,"룺룼룾",5,"뤅",18,"뤙",6,"뤡",26,"뤾뤿륁륂륃륅",6,"륍륎륐륒",5],
["9041","륚륛륝륞륟륡",6,"륪륬륮",5,"륶륷륹륺륻륽"],
["9061","륾",5,"릆릈릋릌릏",15],
["9081","릟",12,"릮릯릱릲릳릵",6,"릾맀맂",5,"맊맋맍맓",4,"맚맜맟맠맢맦맧맩맪맫맭",6,"맶맻",4,"먂",5,"먉",11,"먖",33,"먺먻먽먾먿멁멃멄멅멆"],
["9141","멇멊멌멏멐멑멒멖멗멙멚멛멝",6,"멦멪",5],
["9161","멲멳멵멶멷멹",9,"몆몈몉몊몋몍",5],
["9181","몓",20,"몪몭몮몯몱몳",4,"몺몼몾",5,"뫅뫆뫇뫉",14,"뫚",33,"뫽뫾뫿묁묂묃묅",7,"묎묐묒",5,"묙묚묛묝묞묟묡",6],
["9241","묨묪묬",7,"묷묹묺묿",4,"뭆뭈뭊뭋뭌뭎뭑뭒"],
["9261","뭓뭕뭖뭗뭙",7,"뭢뭤",7,"뭭",4],
["9281","뭲",21,"뮉뮊뮋뮍뮎뮏뮑",18,"뮥뮦뮧뮩뮪뮫뮭",6,"뮵뮶뮸",7,"믁믂믃믅믆믇믉",6,"믑믒믔",35,"믺믻믽믾밁"],
["9341","밃",4,"밊밎밐밒밓밙밚밠밡밢밣밦밨밪밫밬밮밯밲밳밵"],
["9361","밶밷밹",6,"뱂뱆뱇뱈뱊뱋뱎뱏뱑",8],
["9381","뱚뱛뱜뱞",37,"벆벇벉벊벍벏",4,"벖벘벛",4,"벢벣벥벦벩",6,"벲벶",5,"벾벿볁볂볃볅",7,"볎볒볓볔볖볗볙볚볛볝",22,"볷볹볺볻볽"],
["9441","볾",5,"봆봈봊",5,"봑봒봓봕",8],
["9461","봞",5,"봥",6,"봭",12],
["9481","봺",5,"뵁",6,"뵊뵋뵍뵎뵏뵑",6,"뵚",9,"뵥뵦뵧뵩",22,"붂붃붅붆붋",4,"붒붔붖붗붘붛붝",6,"붥",10,"붱",6,"붹",24],
["9541","뷒뷓뷖뷗뷙뷚뷛뷝",11,"뷪",5,"뷱"],
["9561","뷲뷳뷵뷶뷷뷹",6,"븁븂븄븆",5,"븎븏븑븒븓"],
["9581","븕",6,"븞븠",35,"빆빇빉빊빋빍빏",4,"빖빘빜빝빞빟빢빣빥빦빧빩빫",4,"빲빶",4,"빾빿뺁뺂뺃뺅",6,"뺎뺒",5,"뺚",13,"뺩",14],
["9641","뺸",23,"뻒뻓"],
["9661","뻕뻖뻙",6,"뻡뻢뻦",5,"뻭",8],
["9681","뻶",10,"뼂",5,"뼊",13,"뼚뼞",33,"뽂뽃뽅뽆뽇뽉",6,"뽒뽓뽔뽖",44],
["9741","뾃",16,"뾕",8],
["9761","뾞",17,"뾱",7],
["9781","뾹",11,"뿆",5,"뿎뿏뿑뿒뿓뿕",6,"뿝뿞뿠뿢",89,"쀽쀾쀿"],
["9841","쁀",16,"쁒",5,"쁙쁚쁛"],
["9861","쁝쁞쁟쁡",6,"쁪",15],
["9881","쁺",21,"삒삓삕삖삗삙",6,"삢삤삦",5,"삮삱삲삷",4,"삾샂샃샄샆샇샊샋샍샎샏샑",6,"샚샞",5,"샦샧샩샪샫샭",6,"샶샸샺",5,"섁섂섃섅섆섇섉",6,"섑섒섓섔섖",5,"섡섢섥섨섩섪섫섮"],
["9941","섲섳섴섵섷섺섻섽섾섿셁",6,"셊셎",5,"셖셗"],
["9961","셙셚셛셝",6,"셦셪",5,"셱셲셳셵셶셷셹셺셻"],
["9981","셼",8,"솆",5,"솏솑솒솓솕솗",4,"솞솠솢솣솤솦솧솪솫솭솮솯솱",11,"솾",5,"쇅쇆쇇쇉쇊쇋쇍",6,"쇕쇖쇙",6,"쇡쇢쇣쇥쇦쇧쇩",6,"쇲쇴",7,"쇾쇿숁숂숃숅",6,"숎숐숒",5,"숚숛숝숞숡숢숣"],
["9a41","숤숥숦숧숪숬숮숰숳숵",16],
["9a61","쉆쉇쉉",6,"쉒쉓쉕쉖쉗쉙",6,"쉡쉢쉣쉤쉦"],
["9a81","쉧",4,"쉮쉯쉱쉲쉳쉵",6,"쉾슀슂",5,"슊",5,"슑",6,"슙슚슜슞",5,"슦슧슩슪슫슮",5,"슶슸슺",33,"싞싟싡싢싥",5,"싮싰싲싳싴싵싷싺싽싾싿쌁",6,"쌊쌋쌎쌏"],
["9b41","쌐쌑쌒쌖쌗쌙쌚쌛쌝",6,"쌦쌧쌪",8],
["9b61","쌳",17,"썆",7],
["9b81","썎",25,"썪썫썭썮썯썱썳",4,"썺썻썾",5,"쎅쎆쎇쎉쎊쎋쎍",50,"쏁",22,"쏚"],
["9c41","쏛쏝쏞쏡쏣",4,"쏪쏫쏬쏮",5,"쏶쏷쏹",5],
["9c61","쏿",8,"쐉",6,"쐑",9],
["9c81","쐛",8,"쐥",6,"쐭쐮쐯쐱쐲쐳쐵",6,"쐾",9,"쑉",26,"쑦쑧쑩쑪쑫쑭",6,"쑶쑷쑸쑺",5,"쒁",18,"쒕",6,"쒝",12],
["9d41","쒪",13,"쒹쒺쒻쒽",8],
["9d61","쓆",25],
["9d81","쓠",8,"쓪",5,"쓲쓳쓵쓶쓷쓹쓻쓼쓽쓾씂",9,"씍씎씏씑씒씓씕",6,"씝",10,"씪씫씭씮씯씱",6,"씺씼씾",5,"앆앇앋앏앐앑앒앖앚앛앜앟앢앣앥앦앧앩",6,"앲앶",5,"앾앿얁얂얃얅얆얈얉얊얋얎얐얒얓얔"],
["9e41","얖얙얚얛얝얞얟얡",7,"얪",9,"얶"],
["9e61","얷얺얿",4,"엋엍엏엒엓엕엖엗엙",6,"엢엤엦엧"],
["9e81","엨엩엪엫엯엱엲엳엵엸엹엺엻옂옃옄옉옊옋옍옎옏옑",6,"옚옝",6,"옦옧옩옪옫옯옱옲옶옸옺옼옽옾옿왂왃왅왆왇왉",6,"왒왖",5,"왞왟왡",10,"왭왮왰왲",5,"왺왻왽왾왿욁",6,"욊욌욎",5,"욖욗욙욚욛욝",6,"욦"],
["9f41","욨욪",5,"욲욳욵욶욷욻",4,"웂웄웆",5,"웎"],
["9f61","웏웑웒웓웕",6,"웞웟웢",5,"웪웫웭웮웯웱웲"],
["9f81","웳",4,"웺웻웼웾",5,"윆윇윉윊윋윍",6,"윖윘윚",5,"윢윣윥윦윧윩",6,"윲윴윶윸윹윺윻윾윿읁읂읃읅",4,"읋읎읐읙읚읛읝읞읟읡",6,"읩읪읬",7,"읶읷읹읺읻읿잀잁잂잆잋잌잍잏잒잓잕잙잛",4,"잢잧",4,"잮잯잱잲잳잵잶잷"],
["a041","잸잹잺잻잾쟂",5,"쟊쟋쟍쟏쟑",6,"쟙쟚쟛쟜"],
["a061","쟞",5,"쟥쟦쟧쟩쟪쟫쟭",13],
["a081","쟻",4,"젂젃젅젆젇젉젋",4,"젒젔젗",4,"젞젟젡젢젣젥",6,"젮젰젲",5,"젹젺젻젽젾젿졁",6,"졊졋졎",5,"졕",26,"졲졳졵졶졷졹졻",4,"좂좄좈좉좊좎",5,"좕",7,"좞좠좢좣좤"],
["a141","좥좦좧좩",18,"좾좿죀죁"],
["a161","죂죃죅죆죇죉죊죋죍",6,"죖죘죚",5,"죢죣죥"],
["a181","죦",14,"죶",5,"죾죿줁줂줃줇",4,"줎　、。·‥…¨〃­―∥＼∼‘’“”〔〕〈",9,"±×÷≠≤≥∞∴°′″℃Å￠￡￥♂♀∠⊥⌒∂∇≡≒§※☆★○●◎◇◆□■△▲▽▼→←↑↓↔〓≪≫√∽∝∵∫∬∈∋⊆⊇⊂⊃∪∩∧∨￢"],
["a241","줐줒",5,"줙",18],
["a261","줭",6,"줵",18],
["a281","쥈",7,"쥒쥓쥕쥖쥗쥙",6,"쥢쥤",7,"쥭쥮쥯⇒⇔∀∃´～ˇ˘˝˚˙¸˛¡¿ː∮∑∏¤℉‰◁◀▷▶♤♠♡♥♧♣⊙◈▣◐◑▒▤▥▨▧▦▩♨☏☎☜☞¶†‡↕↗↙↖↘♭♩♪♬㉿㈜№㏇™㏂㏘℡€®"],
["a341","쥱쥲쥳쥵",6,"쥽",10,"즊즋즍즎즏"],
["a361","즑",6,"즚즜즞",16],
["a381","즯",16,"짂짃짅짆짉짋",4,"짒짔짗짘짛！",58,"￦］",32,"￣"],
["a441","짞짟짡짣짥짦짨짩짪짫짮짲",5,"짺짻짽짾짿쨁쨂쨃쨄"],
["a461","쨅쨆쨇쨊쨎",5,"쨕쨖쨗쨙",12],
["a481","쨦쨧쨨쨪",28,"ㄱ",93],
["a541","쩇",4,"쩎쩏쩑쩒쩓쩕",6,"쩞쩢",5,"쩩쩪"],
["a561","쩫",17,"쩾",5,"쪅쪆"],
["a581","쪇",16,"쪙",14,"ⅰ",9],
["a5b0","Ⅰ",9],
["a5c1","Α",16,"Σ",6],
["a5e1","α",16,"σ",6],
["a641","쪨",19,"쪾쪿쫁쫂쫃쫅"],
["a661","쫆",5,"쫎쫐쫒쫔쫕쫖쫗쫚",5,"쫡",6],
["a681","쫨쫩쫪쫫쫭",6,"쫵",18,"쬉쬊─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂┒┑┚┙┖┕┎┍┞┟┡┢┦┧┩┪┭┮┱┲┵┶┹┺┽┾╀╁╃",7],
["a741","쬋",4,"쬑쬒쬓쬕쬖쬗쬙",6,"쬢",7],
["a761","쬪",22,"쭂쭃쭄"],
["a781","쭅쭆쭇쭊쭋쭍쭎쭏쭑",6,"쭚쭛쭜쭞",5,"쭥",7,"㎕㎖㎗ℓ㎘㏄㎣㎤㎥㎦㎙",9,"㏊㎍㎎㎏㏏㎈㎉㏈㎧㎨㎰",9,"㎀",4,"㎺",5,"㎐",4,"Ω㏀㏁㎊㎋㎌㏖㏅㎭㎮㎯㏛㎩㎪㎫㎬㏝㏐㏓㏃㏉㏜㏆"],
["a841","쭭",10,"쭺",14],
["a861","쮉",18,"쮝",6],
["a881","쮤",19,"쮹",11,"ÆÐªĦ"],
["a8a6","Ĳ"],
["a8a8","ĿŁØŒºÞŦŊ"],
["a8b1","㉠",27,"ⓐ",25,"①",14,"½⅓⅔¼¾⅛⅜⅝⅞"],
["a941","쯅",14,"쯕",10],
["a961","쯠쯡쯢쯣쯥쯦쯨쯪",18],
["a981","쯽",14,"찎찏찑찒찓찕",6,"찞찟찠찣찤æđðħıĳĸŀłøœßþŧŋŉ㈀",27,"⒜",25,"⑴",14,"¹²³⁴ⁿ₁₂₃₄"],
["aa41","찥찦찪찫찭찯찱",6,"찺찿",4,"챆챇챉챊챋챍챎"],
["aa61","챏",4,"챖챚",5,"챡챢챣챥챧챩",6,"챱챲"],
["aa81","챳챴챶",29,"ぁ",82],
["ab41","첔첕첖첗첚첛첝첞첟첡",6,"첪첮",5,"첶첷첹"],
["ab61","첺첻첽",6,"쳆쳈쳊",5,"쳑쳒쳓쳕",5],
["ab81","쳛",8,"쳥",6,"쳭쳮쳯쳱",12,"ァ",85],
["ac41","쳾쳿촀촂",5,"촊촋촍촎촏촑",6,"촚촜촞촟촠"],
["ac61","촡촢촣촥촦촧촩촪촫촭",11,"촺",4],
["ac81","촿",28,"쵝쵞쵟А",5,"ЁЖ",25],
["acd1","а",5,"ёж",25],
["ad41","쵡쵢쵣쵥",6,"쵮쵰쵲",5,"쵹",7],
["ad61","춁",6,"춉",10,"춖춗춙춚춛춝춞춟"],
["ad81","춠춡춢춣춦춨춪",5,"춱",18,"췅"],
["ae41","췆",5,"췍췎췏췑",16],
["ae61","췢",5,"췩췪췫췭췮췯췱",6,"췺췼췾",4],
["ae81","츃츅츆츇츉츊츋츍",6,"츕츖츗츘츚",5,"츢츣츥츦츧츩츪츫"],
["af41","츬츭츮츯츲츴츶",19],
["af61","칊",13,"칚칛칝칞칢",5,"칪칬"],
["af81","칮",5,"칶칷칹칺칻칽",6,"캆캈캊",5,"캒캓캕캖캗캙"],
["b041","캚",5,"캢캦",5,"캮",12],
["b061","캻",5,"컂",19],
["b081","컖",13,"컦컧컩컪컭",6,"컶컺",5,"가각간갇갈갉갊감",7,"같",4,"갠갤갬갭갯갰갱갸갹갼걀걋걍걔걘걜거걱건걷걸걺검겁것겄겅겆겉겊겋게겐겔겜겝겟겠겡겨격겪견겯결겸겹겻겼경곁계곈곌곕곗고곡곤곧골곪곬곯곰곱곳공곶과곽관괄괆"],
["b141","켂켃켅켆켇켉",6,"켒켔켖",5,"켝켞켟켡켢켣"],
["b161","켥",6,"켮켲",5,"켹",11],
["b181","콅",14,"콖콗콙콚콛콝",6,"콦콨콪콫콬괌괍괏광괘괜괠괩괬괭괴괵괸괼굄굅굇굉교굔굘굡굣구국군굳굴굵굶굻굼굽굿궁궂궈궉권궐궜궝궤궷귀귁귄귈귐귑귓규균귤그극근귿글긁금급긋긍긔기긱긴긷길긺김깁깃깅깆깊까깍깎깐깔깖깜깝깟깠깡깥깨깩깬깰깸"],
["b241","콭콮콯콲콳콵콶콷콹",6,"쾁쾂쾃쾄쾆",5,"쾍"],
["b261","쾎",18,"쾢",5,"쾩"],
["b281","쾪",5,"쾱",18,"쿅",6,"깹깻깼깽꺄꺅꺌꺼꺽꺾껀껄껌껍껏껐껑께껙껜껨껫껭껴껸껼꼇꼈꼍꼐꼬꼭꼰꼲꼴꼼꼽꼿꽁꽂꽃꽈꽉꽐꽜꽝꽤꽥꽹꾀꾄꾈꾐꾑꾕꾜꾸꾹꾼꿀꿇꿈꿉꿋꿍꿎꿔꿜꿨꿩꿰꿱꿴꿸뀀뀁뀄뀌뀐뀔뀜뀝뀨끄끅끈끊끌끎끓끔끕끗끙"],
["b341","쿌",19,"쿢쿣쿥쿦쿧쿩"],
["b361","쿪",5,"쿲쿴쿶",5,"쿽쿾쿿퀁퀂퀃퀅",5],
["b381","퀋",5,"퀒",5,"퀙",19,"끝끼끽낀낄낌낍낏낑나낙낚난낟날낡낢남납낫",4,"낱낳내낵낸낼냄냅냇냈냉냐냑냔냘냠냥너넉넋넌널넒넓넘넙넛넜넝넣네넥넨넬넴넵넷넸넹녀녁년녈념녑녔녕녘녜녠노녹논놀놂놈놉놋농높놓놔놘놜놨뇌뇐뇔뇜뇝"],
["b441","퀮",5,"퀶퀷퀹퀺퀻퀽",6,"큆큈큊",5],
["b461","큑큒큓큕큖큗큙",6,"큡",10,"큮큯"],
["b481","큱큲큳큵",6,"큾큿킀킂",18,"뇟뇨뇩뇬뇰뇹뇻뇽누눅눈눋눌눔눕눗눙눠눴눼뉘뉜뉠뉨뉩뉴뉵뉼늄늅늉느늑는늘늙늚늠늡늣능늦늪늬늰늴니닉닌닐닒님닙닛닝닢다닥닦단닫",4,"닳담답닷",4,"닿대댁댄댈댐댑댓댔댕댜더덕덖던덛덜덞덟덤덥"],
["b541","킕",14,"킦킧킩킪킫킭",5],
["b561","킳킶킸킺",5,"탂탃탅탆탇탊",5,"탒탖",4],
["b581","탛탞탟탡탢탣탥",6,"탮탲",5,"탹",11,"덧덩덫덮데덱덴델뎀뎁뎃뎄뎅뎌뎐뎔뎠뎡뎨뎬도독돈돋돌돎돐돔돕돗동돛돝돠돤돨돼됐되된될됨됩됫됴두둑둔둘둠둡둣둥둬뒀뒈뒝뒤뒨뒬뒵뒷뒹듀듄듈듐듕드득든듣들듦듬듭듯등듸디딕딘딛딜딤딥딧딨딩딪따딱딴딸"],
["b641","턅",7,"턎",17],
["b661","턠",15,"턲턳턵턶턷턹턻턼턽턾"],
["b681","턿텂텆",5,"텎텏텑텒텓텕",6,"텞텠텢",5,"텩텪텫텭땀땁땃땄땅땋때땍땐땔땜땝땟땠땡떠떡떤떨떪떫떰떱떳떴떵떻떼떽뗀뗄뗌뗍뗏뗐뗑뗘뗬또똑똔똘똥똬똴뙈뙤뙨뚜뚝뚠뚤뚫뚬뚱뛔뛰뛴뛸뜀뜁뜅뜨뜩뜬뜯뜰뜸뜹뜻띄띈띌띔띕띠띤띨띰띱띳띵라락란랄람랍랏랐랑랒랖랗"],
["b741","텮",13,"텽",6,"톅톆톇톉톊"],
["b761","톋",20,"톢톣톥톦톧"],
["b781","톩",6,"톲톴톶톷톸톹톻톽톾톿퇁",14,"래랙랜랠램랩랫랬랭랴략랸럇량러럭런럴럼럽럿렀렁렇레렉렌렐렘렙렛렝려력련렬렴렵렷렸령례롄롑롓로록론롤롬롭롯롱롸롼뢍뢨뢰뢴뢸룀룁룃룅료룐룔룝룟룡루룩룬룰룸룹룻룽뤄뤘뤠뤼뤽륀륄륌륏륑류륙륜률륨륩"],
["b841","퇐",7,"퇙",17],
["b861","퇫",8,"퇵퇶퇷퇹",13],
["b881","툈툊",5,"툑",24,"륫륭르륵른를름릅릇릉릊릍릎리릭린릴림립릿링마막만많",4,"맘맙맛망맞맡맣매맥맨맬맴맵맷맸맹맺먀먁먈먕머먹먼멀멂멈멉멋멍멎멓메멕멘멜멤멥멧멨멩며멱면멸몃몄명몇몌모목몫몬몰몲몸몹못몽뫄뫈뫘뫙뫼"],
["b941","툪툫툮툯툱툲툳툵",6,"툾퉀퉂",5,"퉉퉊퉋퉌"],
["b961","퉍",14,"퉝",6,"퉥퉦퉧퉨"],
["b981","퉩",22,"튂튃튅튆튇튉튊튋튌묀묄묍묏묑묘묜묠묩묫무묵묶문묻물묽묾뭄뭅뭇뭉뭍뭏뭐뭔뭘뭡뭣뭬뮈뮌뮐뮤뮨뮬뮴뮷므믄믈믐믓미믹민믿밀밂밈밉밋밌밍및밑바",4,"받",4,"밤밥밧방밭배백밴밸뱀뱁뱃뱄뱅뱉뱌뱍뱐뱝버벅번벋벌벎범법벗"],
["ba41","튍튎튏튒튓튔튖",5,"튝튞튟튡튢튣튥",6,"튭"],
["ba61","튮튯튰튲",5,"튺튻튽튾틁틃",4,"틊틌",5],
["ba81","틒틓틕틖틗틙틚틛틝",6,"틦",9,"틲틳틵틶틷틹틺벙벚베벡벤벧벨벰벱벳벴벵벼벽변별볍볏볐병볕볘볜보복볶본볼봄봅봇봉봐봔봤봬뵀뵈뵉뵌뵐뵘뵙뵤뵨부북분붇불붉붊붐붑붓붕붙붚붜붤붰붸뷔뷕뷘뷜뷩뷰뷴뷸븀븃븅브븍븐블븜븝븟비빅빈빌빎빔빕빗빙빚빛빠빡빤"],
["bb41","틻",4,"팂팄팆",5,"팏팑팒팓팕팗",4,"팞팢팣"],
["bb61","팤팦팧팪팫팭팮팯팱",6,"팺팾",5,"퍆퍇퍈퍉"],
["bb81","퍊",31,"빨빪빰빱빳빴빵빻빼빽뺀뺄뺌뺍뺏뺐뺑뺘뺙뺨뻐뻑뻔뻗뻘뻠뻣뻤뻥뻬뼁뼈뼉뼘뼙뼛뼜뼝뽀뽁뽄뽈뽐뽑뽕뾔뾰뿅뿌뿍뿐뿔뿜뿟뿡쀼쁑쁘쁜쁠쁨쁩삐삑삔삘삠삡삣삥사삭삯산삳살삵삶삼삽삿샀상샅새색샌샐샘샙샛샜생샤"],
["bc41","퍪",17,"퍾퍿펁펂펃펅펆펇"],
["bc61","펈펉펊펋펎펒",5,"펚펛펝펞펟펡",6,"펪펬펮"],
["bc81","펯",4,"펵펶펷펹펺펻펽",6,"폆폇폊",5,"폑",5,"샥샨샬샴샵샷샹섀섄섈섐섕서",4,"섣설섦섧섬섭섯섰성섶세섹센셀셈셉셋셌셍셔셕션셜셤셥셧셨셩셰셴셸솅소속솎손솔솖솜솝솟송솥솨솩솬솰솽쇄쇈쇌쇔쇗쇘쇠쇤쇨쇰쇱쇳쇼쇽숀숄숌숍숏숑수숙순숟술숨숩숫숭"],
["bd41","폗폙",7,"폢폤",7,"폮폯폱폲폳폵폶폷"],
["bd61","폸폹폺폻폾퐀퐂",5,"퐉",13],
["bd81","퐗",5,"퐞",25,"숯숱숲숴쉈쉐쉑쉔쉘쉠쉥쉬쉭쉰쉴쉼쉽쉿슁슈슉슐슘슛슝스슥슨슬슭슴습슷승시식신싣실싫심십싯싱싶싸싹싻싼쌀쌈쌉쌌쌍쌓쌔쌕쌘쌜쌤쌥쌨쌩썅써썩썬썰썲썸썹썼썽쎄쎈쎌쏀쏘쏙쏜쏟쏠쏢쏨쏩쏭쏴쏵쏸쐈쐐쐤쐬쐰"],
["be41","퐸",7,"푁푂푃푅",14],
["be61","푔",7,"푝푞푟푡푢푣푥",7,"푮푰푱푲"],
["be81","푳",4,"푺푻푽푾풁풃",4,"풊풌풎",5,"풕",8,"쐴쐼쐽쑈쑤쑥쑨쑬쑴쑵쑹쒀쒔쒜쒸쒼쓩쓰쓱쓴쓸쓺쓿씀씁씌씐씔씜씨씩씬씰씸씹씻씽아악안앉않알앍앎앓암압앗았앙앝앞애액앤앨앰앱앳앴앵야약얀얄얇얌얍얏양얕얗얘얜얠얩어억언얹얻얼얽얾엄",6,"엌엎"],
["bf41","풞",10,"풪",14],
["bf61","풹",18,"퓍퓎퓏퓑퓒퓓퓕"],
["bf81","퓖",5,"퓝퓞퓠",7,"퓩퓪퓫퓭퓮퓯퓱",6,"퓹퓺퓼에엑엔엘엠엡엣엥여역엮연열엶엷염",5,"옅옆옇예옌옐옘옙옛옜오옥온올옭옮옰옳옴옵옷옹옻와왁완왈왐왑왓왔왕왜왝왠왬왯왱외왹왼욀욈욉욋욍요욕욘욜욤욥욧용우욱운울욹욺움웁웃웅워웍원월웜웝웠웡웨"],
["c041","퓾",5,"픅픆픇픉픊픋픍",6,"픖픘",5],
["c061","픞",25],
["c081","픸픹픺픻픾픿핁핂핃핅",6,"핎핐핒",5,"핚핛핝핞핟핡핢핣웩웬웰웸웹웽위윅윈윌윔윕윗윙유육윤율윰윱윳융윷으윽은을읊음읍읏응",7,"읜읠읨읫이익인일읽읾잃임입잇있잉잊잎자작잔잖잗잘잚잠잡잣잤장잦재잭잰잴잼잽잿쟀쟁쟈쟉쟌쟎쟐쟘쟝쟤쟨쟬저적전절젊"],
["c141","핤핦핧핪핬핮",5,"핶핷핹핺핻핽",6,"햆햊햋"],
["c161","햌햍햎햏햑",19,"햦햧"],
["c181","햨",31,"점접젓정젖제젝젠젤젬젭젯젱져젼졀졈졉졌졍졔조족존졸졺좀좁좃종좆좇좋좌좍좔좝좟좡좨좼좽죄죈죌죔죕죗죙죠죡죤죵주죽준줄줅줆줌줍줏중줘줬줴쥐쥑쥔쥘쥠쥡쥣쥬쥰쥴쥼즈즉즌즐즘즙즛증지직진짇질짊짐집짓"],
["c241","헊헋헍헎헏헑헓",4,"헚헜헞",5,"헦헧헩헪헫헭헮"],
["c261","헯",4,"헶헸헺",5,"혂혃혅혆혇혉",6,"혒"],
["c281","혖",5,"혝혞혟혡혢혣혥",7,"혮",9,"혺혻징짖짙짚짜짝짠짢짤짧짬짭짯짰짱째짹짼쨀쨈쨉쨋쨌쨍쨔쨘쨩쩌쩍쩐쩔쩜쩝쩟쩠쩡쩨쩽쪄쪘쪼쪽쫀쫄쫌쫍쫏쫑쫓쫘쫙쫠쫬쫴쬈쬐쬔쬘쬠쬡쭁쭈쭉쭌쭐쭘쭙쭝쭤쭸쭹쮜쮸쯔쯤쯧쯩찌찍찐찔찜찝찡찢찧차착찬찮찰참찹찻"],
["c341","혽혾혿홁홂홃홄홆홇홊홌홎홏홐홒홓홖홗홙홚홛홝",4],
["c361","홢",4,"홨홪",5,"홲홳홵",11],
["c381","횁횂횄횆",5,"횎횏횑횒횓횕",7,"횞횠횢",5,"횩횪찼창찾채책챈챌챔챕챗챘챙챠챤챦챨챰챵처척천철첨첩첫첬청체첵첸첼쳄쳅쳇쳉쳐쳔쳤쳬쳰촁초촉촌촐촘촙촛총촤촨촬촹최쵠쵤쵬쵭쵯쵱쵸춈추축춘출춤춥춧충춰췄췌췐취췬췰췸췹췻췽츄츈츌츔츙츠측츤츨츰츱츳층"],
["c441","횫횭횮횯횱",7,"횺횼",7,"훆훇훉훊훋"],
["c461","훍훎훏훐훒훓훕훖훘훚",5,"훡훢훣훥훦훧훩",4],
["c481","훮훯훱훲훳훴훶",5,"훾훿휁휂휃휅",11,"휒휓휔치칙친칟칠칡침칩칫칭카칵칸칼캄캅캇캉캐캑캔캘캠캡캣캤캥캬캭컁커컥컨컫컬컴컵컷컸컹케켁켄켈켐켑켓켕켜켠켤켬켭켯켰켱켸코콕콘콜콤콥콧콩콰콱콴콸쾀쾅쾌쾡쾨쾰쿄쿠쿡쿤쿨쿰쿱쿳쿵쿼퀀퀄퀑퀘퀭퀴퀵퀸퀼"],
["c541","휕휖휗휚휛휝휞휟휡",6,"휪휬휮",5,"휶휷휹"],
["c561","휺휻휽",6,"흅흆흈흊",5,"흒흓흕흚",4],
["c581","흟흢흤흦흧흨흪흫흭흮흯흱흲흳흵",6,"흾흿힀힂",5,"힊힋큄큅큇큉큐큔큘큠크큭큰클큼큽킁키킥킨킬킴킵킷킹타탁탄탈탉탐탑탓탔탕태택탠탤탬탭탯탰탱탸턍터턱턴털턺텀텁텃텄텅테텍텐텔템텝텟텡텨텬텼톄톈토톡톤톨톰톱톳통톺톼퇀퇘퇴퇸툇툉툐투툭툰툴툼툽툿퉁퉈퉜"],
["c641","힍힎힏힑",6,"힚힜힞",5],
["c6a1","퉤튀튁튄튈튐튑튕튜튠튤튬튱트특튼튿틀틂틈틉틋틔틘틜틤틥티틱틴틸팀팁팃팅파팍팎판팔팖팜팝팟팠팡팥패팩팬팰팸팹팻팼팽퍄퍅퍼퍽펀펄펌펍펏펐펑페펙펜펠펨펩펫펭펴편펼폄폅폈평폐폘폡폣포폭폰폴폼폽폿퐁"],
["c7a1","퐈퐝푀푄표푠푤푭푯푸푹푼푿풀풂품풉풋풍풔풩퓌퓐퓔퓜퓟퓨퓬퓰퓸퓻퓽프픈플픔픕픗피픽핀필핌핍핏핑하학한할핥함합핫항해핵핸핼햄햅햇했행햐향허헉헌헐헒험헙헛헝헤헥헨헬헴헵헷헹혀혁현혈혐협혓혔형혜혠"],
["c8a1","혤혭호혹혼홀홅홈홉홋홍홑화확환활홧황홰홱홴횃횅회획횐횔횝횟횡효횬횰횹횻후훅훈훌훑훔훗훙훠훤훨훰훵훼훽휀휄휑휘휙휜휠휨휩휫휭휴휵휸휼흄흇흉흐흑흔흖흗흘흙흠흡흣흥흩희흰흴흼흽힁히힉힌힐힘힙힛힝"],
["caa1","伽佳假價加可呵哥嘉嫁家暇架枷柯歌珂痂稼苛茄街袈訶賈跏軻迦駕刻却各恪慤殼珏脚覺角閣侃刊墾奸姦干幹懇揀杆柬桿澗癎看磵稈竿簡肝艮艱諫間乫喝曷渴碣竭葛褐蝎鞨勘坎堪嵌感憾戡敢柑橄減甘疳監瞰紺邯鑑鑒龕"],
["cba1","匣岬甲胛鉀閘剛堈姜岡崗康强彊慷江畺疆糠絳綱羌腔舡薑襁講鋼降鱇介价個凱塏愷愾慨改槪漑疥皆盖箇芥蓋豈鎧開喀客坑更粳羹醵倨去居巨拒据據擧渠炬祛距踞車遽鉅鋸乾件健巾建愆楗腱虔蹇鍵騫乞傑杰桀儉劍劒檢"],
["cca1","瞼鈐黔劫怯迲偈憩揭擊格檄激膈覡隔堅牽犬甄絹繭肩見譴遣鵑抉決潔結缺訣兼慊箝謙鉗鎌京俓倞傾儆勁勍卿坰境庚徑慶憬擎敬景暻更梗涇炅烱璟璥瓊痙硬磬竟競絅經耕耿脛莖警輕逕鏡頃頸驚鯨係啓堺契季屆悸戒桂械"],
["cda1","棨溪界癸磎稽系繫繼計誡谿階鷄古叩告呱固姑孤尻庫拷攷故敲暠枯槁沽痼皐睾稿羔考股膏苦苽菰藁蠱袴誥賈辜錮雇顧高鼓哭斛曲梏穀谷鵠困坤崑昆梱棍滾琨袞鯤汨滑骨供公共功孔工恐恭拱控攻珙空蚣貢鞏串寡戈果瓜"],
["cea1","科菓誇課跨過鍋顆廓槨藿郭串冠官寬慣棺款灌琯瓘管罐菅觀貫關館刮恝括适侊光匡壙廣曠洸炚狂珖筐胱鑛卦掛罫乖傀塊壞怪愧拐槐魁宏紘肱轟交僑咬喬嬌嶠巧攪敎校橋狡皎矯絞翹膠蕎蛟較轎郊餃驕鮫丘久九仇俱具勾"],
["cfa1","區口句咎嘔坵垢寇嶇廐懼拘救枸柩構歐毆毬求溝灸狗玖球瞿矩究絿耉臼舅舊苟衢謳購軀逑邱鉤銶駒驅鳩鷗龜國局菊鞠鞫麴君窘群裙軍郡堀屈掘窟宮弓穹窮芎躬倦券勸卷圈拳捲權淃眷厥獗蕨蹶闕机櫃潰詭軌饋句晷歸貴"],
["d0a1","鬼龜叫圭奎揆槻珪硅窺竅糾葵規赳逵閨勻均畇筠菌鈞龜橘克剋劇戟棘極隙僅劤勤懃斤根槿瑾筋芹菫覲謹近饉契今妗擒昑檎琴禁禽芩衾衿襟金錦伋及急扱汲級給亘兢矜肯企伎其冀嗜器圻基埼夔奇妓寄岐崎己幾忌技旗旣"],
["d1a1","朞期杞棋棄機欺氣汽沂淇玘琦琪璂璣畸畿碁磯祁祇祈祺箕紀綺羈耆耭肌記譏豈起錡錤飢饑騎騏驥麒緊佶吉拮桔金喫儺喇奈娜懦懶拏拿癩",5,"那樂",4,"諾酪駱亂卵暖欄煖爛蘭難鸞捏捺南嵐枏楠湳濫男藍襤拉"],
["d2a1","納臘蠟衲囊娘廊",4,"乃來內奈柰耐冷女年撚秊念恬拈捻寧寗努勞奴弩怒擄櫓爐瑙盧",5,"駑魯",10,"濃籠聾膿農惱牢磊腦賂雷尿壘",7,"嫩訥杻紐勒",5,"能菱陵尼泥匿溺多茶"],
["d3a1","丹亶但單團壇彖斷旦檀段湍短端簞緞蛋袒鄲鍛撻澾獺疸達啖坍憺擔曇淡湛潭澹痰聃膽蕁覃談譚錟沓畓答踏遝唐堂塘幢戇撞棠當糖螳黨代垈坮大對岱帶待戴擡玳臺袋貸隊黛宅德悳倒刀到圖堵塗導屠島嶋度徒悼挑掉搗桃"],
["d4a1","棹櫂淘渡滔濤燾盜睹禱稻萄覩賭跳蹈逃途道都鍍陶韜毒瀆牘犢獨督禿篤纛讀墩惇敦旽暾沌焞燉豚頓乭突仝冬凍動同憧東桐棟洞潼疼瞳童胴董銅兜斗杜枓痘竇荳讀豆逗頭屯臀芚遁遯鈍得嶝橙燈登等藤謄鄧騰喇懶拏癩羅"],
["d5a1","蘿螺裸邏樂洛烙珞絡落諾酪駱丹亂卵欄欒瀾爛蘭鸞剌辣嵐擥攬欖濫籃纜藍襤覽拉臘蠟廊朗浪狼琅瑯螂郞來崍徠萊冷掠略亮倆兩凉梁樑粮粱糧良諒輛量侶儷勵呂廬慮戾旅櫚濾礪藜蠣閭驢驪麗黎力曆歷瀝礫轢靂憐戀攣漣"],
["d6a1","煉璉練聯蓮輦連鍊冽列劣洌烈裂廉斂殮濂簾獵令伶囹寧岺嶺怜玲笭羚翎聆逞鈴零靈領齡例澧禮醴隷勞怒撈擄櫓潞瀘爐盧老蘆虜路輅露魯鷺鹵碌祿綠菉錄鹿麓論壟弄朧瀧瓏籠聾儡瀨牢磊賂賚賴雷了僚寮廖料燎療瞭聊蓼"],
["d7a1","遼鬧龍壘婁屢樓淚漏瘻累縷蔞褸鏤陋劉旒柳榴流溜瀏琉瑠留瘤硫謬類六戮陸侖倫崙淪綸輪律慄栗率隆勒肋凜凌楞稜綾菱陵俚利厘吏唎履悧李梨浬犁狸理璃異痢籬罹羸莉裏裡里釐離鯉吝潾燐璘藺躪隣鱗麟林淋琳臨霖砬"],
["d8a1","立笠粒摩瑪痲碼磨馬魔麻寞幕漠膜莫邈万卍娩巒彎慢挽晩曼滿漫灣瞞萬蔓蠻輓饅鰻唜抹末沫茉襪靺亡妄忘忙望網罔芒茫莽輞邙埋妹媒寐昧枚梅每煤罵買賣邁魅脈貊陌驀麥孟氓猛盲盟萌冪覓免冕勉棉沔眄眠綿緬面麵滅"],
["d9a1","蔑冥名命明暝椧溟皿瞑茗蓂螟酩銘鳴袂侮冒募姆帽慕摸摹暮某模母毛牟牡瑁眸矛耗芼茅謀謨貌木沐牧目睦穆鶩歿沒夢朦蒙卯墓妙廟描昴杳渺猫竗苗錨務巫憮懋戊拇撫无楙武毋無珷畝繆舞茂蕪誣貿霧鵡墨默們刎吻問文"],
["daa1","汶紊紋聞蚊門雯勿沕物味媚尾嵋彌微未梶楣渼湄眉米美薇謎迷靡黴岷悶愍憫敏旻旼民泯玟珉緡閔密蜜謐剝博拍搏撲朴樸泊珀璞箔粕縛膊舶薄迫雹駁伴半反叛拌搬攀斑槃泮潘班畔瘢盤盼磐磻礬絆般蟠返頒飯勃拔撥渤潑"],
["dba1","發跋醱鉢髮魃倣傍坊妨尨幇彷房放方旁昉枋榜滂磅紡肪膀舫芳蒡蚌訪謗邦防龐倍俳北培徘拜排杯湃焙盃背胚裴裵褙賠輩配陪伯佰帛柏栢白百魄幡樊煩燔番磻繁蕃藩飜伐筏罰閥凡帆梵氾汎泛犯範范法琺僻劈壁擘檗璧癖"],
["dca1","碧蘗闢霹便卞弁變辨辯邊別瞥鱉鼈丙倂兵屛幷昞昺柄棅炳甁病秉竝輧餠騈保堡報寶普步洑湺潽珤甫菩補褓譜輔伏僕匐卜宓復服福腹茯蔔複覆輹輻馥鰒本乶俸奉封峯峰捧棒烽熢琫縫蓬蜂逢鋒鳳不付俯傅剖副否咐埠夫婦"],
["dda1","孚孵富府復扶敷斧浮溥父符簿缶腐腑膚艀芙莩訃負賦賻赴趺部釜阜附駙鳧北分吩噴墳奔奮忿憤扮昐汾焚盆粉糞紛芬賁雰不佛弗彿拂崩朋棚硼繃鵬丕備匕匪卑妃婢庇悲憊扉批斐枇榧比毖毗毘沸泌琵痺砒碑秕秘粃緋翡肥"],
["dea1","脾臂菲蜚裨誹譬費鄙非飛鼻嚬嬪彬斌檳殯浜濱瀕牝玭貧賓頻憑氷聘騁乍事些仕伺似使俟僿史司唆嗣四士奢娑寫寺射巳師徙思捨斜斯柶査梭死沙泗渣瀉獅砂社祀祠私篩紗絲肆舍莎蓑蛇裟詐詞謝賜赦辭邪飼駟麝削數朔索"],
["dfa1","傘刪山散汕珊産疝算蒜酸霰乷撒殺煞薩三參杉森渗芟蔘衫揷澁鈒颯上傷像償商喪嘗孀尙峠常床庠廂想桑橡湘爽牀狀相祥箱翔裳觴詳象賞霜塞璽賽嗇塞穡索色牲生甥省笙墅壻嶼序庶徐恕抒捿敍暑曙書栖棲犀瑞筮絮緖署"],
["e0a1","胥舒薯西誓逝鋤黍鼠夕奭席惜昔晳析汐淅潟石碩蓆釋錫仙僊先善嬋宣扇敾旋渲煽琁瑄璇璿癬禪線繕羨腺膳船蘚蟬詵跣選銑鐥饍鮮卨屑楔泄洩渫舌薛褻設說雪齧剡暹殲纖蟾贍閃陝攝涉燮葉城姓宬性惺成星晟猩珹盛省筬"],
["e1a1","聖聲腥誠醒世勢歲洗稅笹細說貰召嘯塑宵小少巢所掃搔昭梳沼消溯瀟炤燒甦疏疎瘙笑篠簫素紹蔬蕭蘇訴逍遡邵銷韶騷俗屬束涑粟續謖贖速孫巽損蓀遜飡率宋悚松淞訟誦送頌刷殺灑碎鎖衰釗修受嗽囚垂壽嫂守岫峀帥愁"],
["e2a1","戍手授搜收數樹殊水洙漱燧狩獸琇璲瘦睡秀穗竪粹綏綬繡羞脩茱蒐蓚藪袖誰讐輸遂邃酬銖銹隋隧隨雖需須首髓鬚叔塾夙孰宿淑潚熟琡璹肅菽巡徇循恂旬栒楯橓殉洵淳珣盾瞬筍純脣舜荀蓴蕣詢諄醇錞順馴戌術述鉥崇崧"],
["e3a1","嵩瑟膝蝨濕拾習褶襲丞乘僧勝升承昇繩蠅陞侍匙嘶始媤尸屎屍市弑恃施是時枾柴猜矢示翅蒔蓍視試詩諡豕豺埴寔式息拭植殖湜熄篒蝕識軾食飾伸侁信呻娠宸愼新晨燼申神紳腎臣莘薪藎蜃訊身辛辰迅失室實悉審尋心沁"],
["e4a1","沈深瀋甚芯諶什十拾雙氏亞俄兒啞娥峨我牙芽莪蛾衙訝阿雅餓鴉鵝堊岳嶽幄惡愕握樂渥鄂鍔顎鰐齷安岸按晏案眼雁鞍顔鮟斡謁軋閼唵岩巖庵暗癌菴闇壓押狎鴨仰央怏昻殃秧鴦厓哀埃崖愛曖涯碍艾隘靄厄扼掖液縊腋額"],
["e5a1","櫻罌鶯鸚也倻冶夜惹揶椰爺耶若野弱掠略約若葯蒻藥躍亮佯兩凉壤孃恙揚攘敭暘梁楊樣洋瀁煬痒瘍禳穰糧羊良襄諒讓釀陽量養圄御於漁瘀禦語馭魚齬億憶抑檍臆偃堰彦焉言諺孼蘖俺儼嚴奄掩淹嶪業円予余勵呂女如廬"],
["e6a1","旅歟汝濾璵礖礪與艅茹輿轝閭餘驪麗黎亦力域役易曆歷疫繹譯轢逆驛嚥堧姸娟宴年延憐戀捐挻撚椽沇沿涎涓淵演漣烟然煙煉燃燕璉硏硯秊筵緣練縯聯衍軟輦蓮連鉛鍊鳶列劣咽悅涅烈熱裂說閱厭廉念捻染殮炎焰琰艶苒"],
["e7a1","簾閻髥鹽曄獵燁葉令囹塋寧嶺嶸影怜映暎楹榮永泳渶潁濚瀛瀯煐營獰玲瑛瑩瓔盈穎纓羚聆英詠迎鈴鍈零霙靈領乂倪例刈叡曳汭濊猊睿穢芮藝蘂禮裔詣譽豫醴銳隸霓預五伍俉傲午吾吳嗚塢墺奧娛寤悟惡懊敖旿晤梧汚澳"],
["e8a1","烏熬獒筽蜈誤鰲鼇屋沃獄玉鈺溫瑥瘟穩縕蘊兀壅擁瓮甕癰翁邕雍饔渦瓦窩窪臥蛙蝸訛婉完宛梡椀浣玩琓琬碗緩翫脘腕莞豌阮頑曰往旺枉汪王倭娃歪矮外嵬巍猥畏了僚僥凹堯夭妖姚寥寮尿嶢拗搖撓擾料曜樂橈燎燿瑤療"],
["e9a1","窈窯繇繞耀腰蓼蟯要謠遙遼邀饒慾欲浴縟褥辱俑傭冗勇埇墉容庸慂榕涌湧溶熔瑢用甬聳茸蓉踊鎔鏞龍于佑偶優又友右宇寓尤愚憂旴牛玗瑀盂祐禑禹紆羽芋藕虞迂遇郵釪隅雨雩勖彧旭昱栯煜稶郁頊云暈橒殞澐熉耘芸蕓"],
["eaa1","運隕雲韻蔚鬱亐熊雄元原員圓園垣媛嫄寃怨愿援沅洹湲源爰猿瑗苑袁轅遠阮院願鴛月越鉞位偉僞危圍委威尉慰暐渭爲瑋緯胃萎葦蔿蝟衛褘謂違韋魏乳侑儒兪劉唯喩孺宥幼幽庾悠惟愈愉揄攸有杻柔柚柳楡楢油洧流游溜"],
["eba1","濡猶猷琉瑜由留癒硫紐維臾萸裕誘諛諭踰蹂遊逾遺酉釉鍮類六堉戮毓肉育陸倫允奫尹崙淪潤玧胤贇輪鈗閏律慄栗率聿戎瀜絨融隆垠恩慇殷誾銀隱乙吟淫蔭陰音飮揖泣邑凝應膺鷹依倚儀宜意懿擬椅毅疑矣義艤薏蟻衣誼"],
["eca1","議醫二以伊利吏夷姨履已弛彛怡易李梨泥爾珥理異痍痢移罹而耳肄苡荑裏裡貽貳邇里離飴餌匿溺瀷益翊翌翼謚人仁刃印吝咽因姻寅引忍湮燐璘絪茵藺蚓認隣靭靷鱗麟一佚佾壹日溢逸鎰馹任壬妊姙恁林淋稔臨荏賃入卄"],
["eda1","立笠粒仍剩孕芿仔刺咨姉姿子字孜恣慈滋炙煮玆瓷疵磁紫者自茨蔗藉諮資雌作勺嚼斫昨灼炸爵綽芍酌雀鵲孱棧殘潺盞岑暫潛箴簪蠶雜丈仗匠場墻壯奬將帳庄張掌暲杖樟檣欌漿牆狀獐璋章粧腸臟臧莊葬蔣薔藏裝贓醬長"],
["eea1","障再哉在宰才材栽梓渽滓災縡裁財載齋齎爭箏諍錚佇低儲咀姐底抵杵楮樗沮渚狙猪疽箸紵苧菹著藷詛貯躇這邸雎齟勣吊嫡寂摘敵滴狄炙的積笛籍績翟荻謫賊赤跡蹟迪迹適鏑佃佺傳全典前剪塡塼奠專展廛悛戰栓殿氈澱"],
["efa1","煎琠田甸畑癲筌箋箭篆纏詮輾轉鈿銓錢鐫電顚顫餞切截折浙癤竊節絶占岾店漸点粘霑鮎點接摺蝶丁井亭停偵呈姃定幀庭廷征情挺政整旌晶晸柾楨檉正汀淀淨渟湞瀞炡玎珽町睛碇禎程穽精綎艇訂諪貞鄭酊釘鉦鋌錠霆靖"],
["f0a1","靜頂鼎制劑啼堤帝弟悌提梯濟祭第臍薺製諸蹄醍除際霽題齊俎兆凋助嘲弔彫措操早晁曺曹朝條棗槽漕潮照燥爪璪眺祖祚租稠窕粗糟組繰肇藻蚤詔調趙躁造遭釣阻雕鳥族簇足鏃存尊卒拙猝倧宗從悰慫棕淙琮種終綜縱腫"],
["f1a1","踪踵鍾鐘佐坐左座挫罪主住侏做姝胄呪周嗾奏宙州廚晝朱柱株注洲湊澍炷珠疇籌紂紬綢舟蛛註誅走躊輳週酎酒鑄駐竹粥俊儁准埈寯峻晙樽浚準濬焌畯竣蠢逡遵雋駿茁中仲衆重卽櫛楫汁葺增憎曾拯烝甑症繒蒸證贈之只"],
["f2a1","咫地址志持指摯支旨智枝枳止池沚漬知砥祉祗紙肢脂至芝芷蜘誌識贄趾遲直稙稷織職唇嗔塵振搢晉晋桭榛殄津溱珍瑨璡畛疹盡眞瞋秦縉縝臻蔯袗診賑軫辰進鎭陣陳震侄叱姪嫉帙桎瓆疾秩窒膣蛭質跌迭斟朕什執潗緝輯"],
["f3a1","鏶集徵懲澄且侘借叉嗟嵯差次此磋箚茶蹉車遮捉搾着窄錯鑿齪撰澯燦璨瓚竄簒纂粲纘讚贊鑽餐饌刹察擦札紮僭參塹慘慙懺斬站讒讖倉倡創唱娼廠彰愴敞昌昶暢槍滄漲猖瘡窓脹艙菖蒼債埰寀寨彩採砦綵菜蔡采釵冊柵策"],
["f4a1","責凄妻悽處倜刺剔尺慽戚拓擲斥滌瘠脊蹠陟隻仟千喘天川擅泉淺玔穿舛薦賤踐遷釧闡阡韆凸哲喆徹撤澈綴輟轍鐵僉尖沾添甛瞻簽籤詹諂堞妾帖捷牒疊睫諜貼輒廳晴淸聽菁請靑鯖切剃替涕滯締諦逮遞體初剿哨憔抄招梢"],
["f5a1","椒楚樵炒焦硝礁礎秒稍肖艸苕草蕉貂超酢醋醮促囑燭矗蜀觸寸忖村邨叢塚寵悤憁摠總聰蔥銃撮催崔最墜抽推椎楸樞湫皺秋芻萩諏趨追鄒酋醜錐錘鎚雛騶鰍丑畜祝竺筑築縮蓄蹙蹴軸逐春椿瑃出朮黜充忠沖蟲衝衷悴膵萃"],
["f6a1","贅取吹嘴娶就炊翠聚脆臭趣醉驟鷲側仄厠惻測層侈値嗤峙幟恥梔治淄熾痔痴癡稚穉緇緻置致蚩輜雉馳齒則勅飭親七柒漆侵寢枕沈浸琛砧針鍼蟄秤稱快他咤唾墮妥惰打拖朶楕舵陀馱駝倬卓啄坼度托拓擢晫柝濁濯琢琸託"],
["f7a1","鐸呑嘆坦彈憚歎灘炭綻誕奪脫探眈耽貪塔搭榻宕帑湯糖蕩兌台太怠態殆汰泰笞胎苔跆邰颱宅擇澤撑攄兎吐土討慟桶洞痛筒統通堆槌腿褪退頹偸套妬投透鬪慝特闖坡婆巴把播擺杷波派爬琶破罷芭跛頗判坂板版瓣販辦鈑"],
["f8a1","阪八叭捌佩唄悖敗沛浿牌狽稗覇貝彭澎烹膨愎便偏扁片篇編翩遍鞭騙貶坪平枰萍評吠嬖幣廢弊斃肺蔽閉陛佈包匍匏咆哺圃布怖抛抱捕暴泡浦疱砲胞脯苞葡蒲袍褒逋鋪飽鮑幅暴曝瀑爆輻俵剽彪慓杓標漂瓢票表豹飇飄驃"],
["f9a1","品稟楓諷豊風馮彼披疲皮被避陂匹弼必泌珌畢疋筆苾馝乏逼下何厦夏廈昰河瑕荷蝦賀遐霞鰕壑學虐謔鶴寒恨悍旱汗漢澣瀚罕翰閑閒限韓割轄函含咸啣喊檻涵緘艦銜陷鹹合哈盒蛤閤闔陜亢伉姮嫦巷恒抗杭桁沆港缸肛航"],
["faa1","行降項亥偕咳垓奚孩害懈楷海瀣蟹解該諧邂駭骸劾核倖幸杏荇行享向嚮珦鄕響餉饗香噓墟虛許憲櫶獻軒歇險驗奕爀赫革俔峴弦懸晛泫炫玄玹現眩睍絃絢縣舷衒見賢鉉顯孑穴血頁嫌俠協夾峽挾浹狹脅脇莢鋏頰亨兄刑型"],
["fba1","形泂滎瀅灐炯熒珩瑩荊螢衡逈邢鎣馨兮彗惠慧暳蕙蹊醯鞋乎互呼壕壺好岵弧戶扈昊晧毫浩淏湖滸澔濠濩灝狐琥瑚瓠皓祜糊縞胡芦葫蒿虎號蝴護豪鎬頀顥惑或酷婚昏混渾琿魂忽惚笏哄弘汞泓洪烘紅虹訌鴻化和嬅樺火畵"],
["fca1","禍禾花華話譁貨靴廓擴攫確碻穫丸喚奐宦幻患換歡晥桓渙煥環紈還驩鰥活滑猾豁闊凰幌徨恍惶愰慌晃晄榥況湟滉潢煌璜皇篁簧荒蝗遑隍黃匯回廻徊恢悔懷晦會檜淮澮灰獪繪膾茴蛔誨賄劃獲宖橫鐄哮嚆孝效斅曉梟涍淆"],
["fda1","爻肴酵驍侯候厚后吼喉嗅帿後朽煦珝逅勛勳塤壎焄熏燻薰訓暈薨喧暄煊萱卉喙毁彙徽揮暉煇諱輝麾休携烋畦虧恤譎鷸兇凶匈洶胸黑昕欣炘痕吃屹紇訖欠欽歆吸恰洽翕興僖凞喜噫囍姬嬉希憙憘戱晞曦熙熹熺犧禧稀羲詰"]
]
[
["0","\u0000",127],
["a140","　，、。．‧；：？！︰…‥﹐﹑﹒·﹔﹕﹖﹗｜–︱—︳╴︴﹏（）︵︶｛｝︷︸〔〕︹︺【】︻︼《》︽︾〈〉︿﹀「」﹁﹂『』﹃﹄﹙﹚"],
["a1a1","﹛﹜﹝﹞‘’“”〝〞‵′＃＆＊※§〃○●△▲◎☆★◇◆□■▽▼㊣℅¯￣＿ˍ﹉﹊﹍﹎﹋﹌﹟﹠﹡＋－×÷±√＜＞＝≦≧≠∞≒≡﹢",4,"～∩∪⊥∠∟⊿㏒㏑∫∮∵∴♀♂⊕⊙↑↓←→↖↗↙↘∥∣／"],
["a240","＼∕﹨＄￥〒￠￡％＠℃℉﹩﹪﹫㏕㎜㎝㎞㏎㎡㎎㎏㏄°兙兛兞兝兡兣嗧瓩糎▁",7,"▏▎▍▌▋▊▉┼┴┬┤├▔─│▕┌┐└┘╭"],
["a2a1","╮╰╯═╞╪╡◢◣◥◤╱╲╳０",9,"Ⅰ",9,"〡",8,"十卄卅Ａ",25,"ａ",21],
["a340","ｗｘｙｚΑ",16,"Σ",6,"α",16,"σ",6,"ㄅ",10],
["a3a1","ㄐ",25,"˙ˉˊˇˋ"],
["a3e1","€"],
["a440","一乙丁七乃九了二人儿入八几刀刁力匕十卜又三下丈上丫丸凡久么也乞于亡兀刃勺千叉口土士夕大女子孑孓寸小尢尸山川工己已巳巾干廾弋弓才"],
["a4a1","丑丐不中丰丹之尹予云井互五亢仁什仃仆仇仍今介仄元允內六兮公冗凶分切刈勻勾勿化匹午升卅卞厄友及反壬天夫太夭孔少尤尺屯巴幻廿弔引心戈戶手扎支文斗斤方日曰月木欠止歹毋比毛氏水火爪父爻片牙牛犬王丙"],
["a540","世丕且丘主乍乏乎以付仔仕他仗代令仙仞充兄冉冊冬凹出凸刊加功包匆北匝仟半卉卡占卯卮去可古右召叮叩叨叼司叵叫另只史叱台句叭叻四囚外"],
["a5a1","央失奴奶孕它尼巨巧左市布平幼弁弘弗必戊打扔扒扑斥旦朮本未末札正母民氐永汁汀氾犯玄玉瓜瓦甘生用甩田由甲申疋白皮皿目矛矢石示禾穴立丞丟乒乓乩亙交亦亥仿伉伙伊伕伍伐休伏仲件任仰仳份企伋光兇兆先全"],
["a640","共再冰列刑划刎刖劣匈匡匠印危吉吏同吊吐吁吋各向名合吃后吆吒因回囝圳地在圭圬圯圩夙多夷夸妄奸妃好她如妁字存宇守宅安寺尖屹州帆并年"],
["a6a1","式弛忙忖戎戌戍成扣扛托收早旨旬旭曲曳有朽朴朱朵次此死氖汝汗汙江池汐汕污汛汍汎灰牟牝百竹米糸缶羊羽老考而耒耳聿肉肋肌臣自至臼舌舛舟艮色艾虫血行衣西阡串亨位住佇佗佞伴佛何估佐佑伽伺伸佃佔似但佣"],
["a740","作你伯低伶余佝佈佚兌克免兵冶冷別判利刪刨劫助努劬匣即卵吝吭吞吾否呎吧呆呃吳呈呂君吩告吹吻吸吮吵吶吠吼呀吱含吟听囪困囤囫坊坑址坍"],
["a7a1","均坎圾坐坏圻壯夾妝妒妨妞妣妙妖妍妤妓妊妥孝孜孚孛完宋宏尬局屁尿尾岐岑岔岌巫希序庇床廷弄弟彤形彷役忘忌志忍忱快忸忪戒我抄抗抖技扶抉扭把扼找批扳抒扯折扮投抓抑抆改攻攸旱更束李杏材村杜杖杞杉杆杠"],
["a840","杓杗步每求汞沙沁沈沉沅沛汪決沐汰沌汨沖沒汽沃汲汾汴沆汶沍沔沘沂灶灼災灸牢牡牠狄狂玖甬甫男甸皂盯矣私秀禿究系罕肖肓肝肘肛肚育良芒"],
["a8a1","芋芍見角言谷豆豕貝赤走足身車辛辰迂迆迅迄巡邑邢邪邦那酉釆里防阮阱阪阬並乖乳事些亞享京佯依侍佳使佬供例來侃佰併侈佩佻侖佾侏侑佺兔兒兕兩具其典冽函刻券刷刺到刮制剁劾劻卒協卓卑卦卷卸卹取叔受味呵"],
["a940","咖呸咕咀呻呷咄咒咆呼咐呱呶和咚呢周咋命咎固垃坷坪坩坡坦坤坼夜奉奇奈奄奔妾妻委妹妮姑姆姐姍始姓姊妯妳姒姅孟孤季宗定官宜宙宛尚屈居"],
["a9a1","屆岷岡岸岩岫岱岳帘帚帖帕帛帑幸庚店府底庖延弦弧弩往征彿彼忝忠忽念忿怏怔怯怵怖怪怕怡性怩怫怛或戕房戾所承拉拌拄抿拂抹拒招披拓拔拋拈抨抽押拐拙拇拍抵拚抱拘拖拗拆抬拎放斧於旺昔易昌昆昂明昀昏昕昊"],
["aa40","昇服朋杭枋枕東果杳杷枇枝林杯杰板枉松析杵枚枓杼杪杲欣武歧歿氓氛泣注泳沱泌泥河沽沾沼波沫法泓沸泄油況沮泗泅泱沿治泡泛泊沬泯泜泖泠"],
["aaa1","炕炎炒炊炙爬爭爸版牧物狀狎狙狗狐玩玨玟玫玥甽疝疙疚的盂盲直知矽社祀祁秉秈空穹竺糾罔羌羋者肺肥肢肱股肫肩肴肪肯臥臾舍芳芝芙芭芽芟芹花芬芥芯芸芣芰芾芷虎虱初表軋迎返近邵邸邱邶采金長門阜陀阿阻附"],
["ab40","陂隹雨青非亟亭亮信侵侯便俠俑俏保促侶俘俟俊俗侮俐俄係俚俎俞侷兗冒冑冠剎剃削前剌剋則勇勉勃勁匍南卻厚叛咬哀咨哎哉咸咦咳哇哂咽咪品"],
["aba1","哄哈咯咫咱咻咩咧咿囿垂型垠垣垢城垮垓奕契奏奎奐姜姘姿姣姨娃姥姪姚姦威姻孩宣宦室客宥封屎屏屍屋峙峒巷帝帥帟幽庠度建弈弭彥很待徊律徇後徉怒思怠急怎怨恍恰恨恢恆恃恬恫恪恤扁拜挖按拼拭持拮拽指拱拷"],
["ac40","拯括拾拴挑挂政故斫施既春昭映昧是星昨昱昤曷柿染柱柔某柬架枯柵柩柯柄柑枴柚查枸柏柞柳枰柙柢柝柒歪殃殆段毒毗氟泉洋洲洪流津洌洱洞洗"],
["aca1","活洽派洶洛泵洹洧洸洩洮洵洎洫炫為炳炬炯炭炸炮炤爰牲牯牴狩狠狡玷珊玻玲珍珀玳甚甭畏界畎畋疫疤疥疢疣癸皆皇皈盈盆盃盅省盹相眉看盾盼眇矜砂研砌砍祆祉祈祇禹禺科秒秋穿突竿竽籽紂紅紀紉紇約紆缸美羿耄"],
["ad40","耐耍耑耶胖胥胚胃胄背胡胛胎胞胤胝致舢苧范茅苣苛苦茄若茂茉苒苗英茁苜苔苑苞苓苟苯茆虐虹虻虺衍衫要觔計訂訃貞負赴赳趴軍軌述迦迢迪迥"],
["ada1","迭迫迤迨郊郎郁郃酋酊重閂限陋陌降面革韋韭音頁風飛食首香乘亳倌倍倣俯倦倥俸倩倖倆值借倚倒們俺倀倔倨俱倡個候倘俳修倭倪俾倫倉兼冤冥冢凍凌准凋剖剜剔剛剝匪卿原厝叟哨唐唁唷哼哥哲唆哺唔哩哭員唉哮哪"],
["ae40","哦唧唇哽唏圃圄埂埔埋埃堉夏套奘奚娑娘娜娟娛娓姬娠娣娩娥娌娉孫屘宰害家宴宮宵容宸射屑展屐峭峽峻峪峨峰島崁峴差席師庫庭座弱徒徑徐恙"],
["aea1","恣恥恐恕恭恩息悄悟悚悍悔悌悅悖扇拳挈拿捎挾振捕捂捆捏捉挺捐挽挪挫挨捍捌效敉料旁旅時晉晏晃晒晌晅晁書朔朕朗校核案框桓根桂桔栩梳栗桌桑栽柴桐桀格桃株桅栓栘桁殊殉殷氣氧氨氦氤泰浪涕消涇浦浸海浙涓"],
["af40","浬涉浮浚浴浩涌涊浹涅浥涔烊烘烤烙烈烏爹特狼狹狽狸狷玆班琉珮珠珪珞畔畝畜畚留疾病症疲疳疽疼疹痂疸皋皰益盍盎眩真眠眨矩砰砧砸砝破砷"],
["afa1","砥砭砠砟砲祕祐祠祟祖神祝祗祚秤秣秧租秦秩秘窄窈站笆笑粉紡紗紋紊素索純紐紕級紜納紙紛缺罟羔翅翁耆耘耕耙耗耽耿胱脂胰脅胭胴脆胸胳脈能脊胼胯臭臬舀舐航舫舨般芻茫荒荔荊茸荐草茵茴荏茲茹茶茗荀茱茨荃"],
["b040","虔蚊蚪蚓蚤蚩蚌蚣蚜衰衷袁袂衽衹記訐討訌訕訊託訓訖訏訑豈豺豹財貢起躬軒軔軏辱送逆迷退迺迴逃追逅迸邕郡郝郢酒配酌釘針釗釜釙閃院陣陡"],
["b0a1","陛陝除陘陞隻飢馬骨高鬥鬲鬼乾偺偽停假偃偌做偉健偶偎偕偵側偷偏倏偯偭兜冕凰剪副勒務勘動匐匏匙匿區匾參曼商啪啦啄啞啡啃啊唱啖問啕唯啤唸售啜唬啣唳啁啗圈國圉域堅堊堆埠埤基堂堵執培夠奢娶婁婉婦婪婀"],
["b140","娼婢婚婆婊孰寇寅寄寂宿密尉專將屠屜屝崇崆崎崛崖崢崑崩崔崙崤崧崗巢常帶帳帷康庸庶庵庾張強彗彬彩彫得徙從徘御徠徜恿患悉悠您惋悴惦悽"],
["b1a1","情悻悵惜悼惘惕惆惟悸惚惇戚戛扈掠控捲掖探接捷捧掘措捱掩掉掃掛捫推掄授掙採掬排掏掀捻捩捨捺敝敖救教敗啟敏敘敕敔斜斛斬族旋旌旎晝晚晤晨晦晞曹勗望梁梯梢梓梵桿桶梱梧梗械梃棄梭梆梅梔條梨梟梡梂欲殺"],
["b240","毫毬氫涎涼淳淙液淡淌淤添淺清淇淋涯淑涮淞淹涸混淵淅淒渚涵淚淫淘淪深淮淨淆淄涪淬涿淦烹焉焊烽烯爽牽犁猜猛猖猓猙率琅琊球理現琍瓠瓶"],
["b2a1","瓷甜產略畦畢異疏痔痕疵痊痍皎盔盒盛眷眾眼眶眸眺硫硃硎祥票祭移窒窕笠笨笛第符笙笞笮粒粗粕絆絃統紮紹紼絀細紳組累終紲紱缽羞羚翌翎習耜聊聆脯脖脣脫脩脰脤舂舵舷舶船莎莞莘荸莢莖莽莫莒莊莓莉莠荷荻荼"],
["b340","莆莧處彪蛇蛀蚶蛄蚵蛆蛋蚱蚯蛉術袞袈被袒袖袍袋覓規訪訝訣訥許設訟訛訢豉豚販責貫貨貪貧赧赦趾趺軛軟這逍通逗連速逝逐逕逞造透逢逖逛途"],
["b3a1","部郭都酗野釵釦釣釧釭釩閉陪陵陳陸陰陴陶陷陬雀雪雩章竟頂頃魚鳥鹵鹿麥麻傢傍傅備傑傀傖傘傚最凱割剴創剩勞勝勛博厥啻喀喧啼喊喝喘喂喜喪喔喇喋喃喳單喟唾喲喚喻喬喱啾喉喫喙圍堯堪場堤堰報堡堝堠壹壺奠"],
["b440","婷媚婿媒媛媧孳孱寒富寓寐尊尋就嵌嵐崴嵇巽幅帽幀幃幾廊廁廂廄弼彭復循徨惑惡悲悶惠愜愣惺愕惰惻惴慨惱愎惶愉愀愒戟扉掣掌描揀揩揉揆揍"],
["b4a1","插揣提握揖揭揮捶援揪換摒揚揹敞敦敢散斑斐斯普晰晴晶景暑智晾晷曾替期朝棺棕棠棘棗椅棟棵森棧棹棒棲棣棋棍植椒椎棉棚楮棻款欺欽殘殖殼毯氮氯氬港游湔渡渲湧湊渠渥渣減湛湘渤湖湮渭渦湯渴湍渺測湃渝渾滋"],
["b540","溉渙湎湣湄湲湩湟焙焚焦焰無然煮焜牌犄犀猶猥猴猩琺琪琳琢琥琵琶琴琯琛琦琨甥甦畫番痢痛痣痙痘痞痠登發皖皓皴盜睏短硝硬硯稍稈程稅稀窘"],
["b5a1","窗窖童竣等策筆筐筒答筍筋筏筑粟粥絞結絨絕紫絮絲絡給絢絰絳善翔翕耋聒肅腕腔腋腑腎脹腆脾腌腓腴舒舜菩萃菸萍菠菅萋菁華菱菴著萊菰萌菌菽菲菊萸萎萄菜萇菔菟虛蛟蛙蛭蛔蛛蛤蛐蛞街裁裂袱覃視註詠評詞証詁"],
["b640","詔詛詐詆訴診訶詖象貂貯貼貳貽賁費賀貴買貶貿貸越超趁跎距跋跚跑跌跛跆軻軸軼辜逮逵週逸進逶鄂郵鄉郾酣酥量鈔鈕鈣鈉鈞鈍鈐鈇鈑閔閏開閑"],
["b6a1","間閒閎隊階隋陽隅隆隍陲隄雁雅雄集雇雯雲韌項順須飧飪飯飩飲飭馮馭黃黍黑亂傭債傲傳僅傾催傷傻傯僇剿剷剽募勦勤勢勣匯嗟嗨嗓嗦嗎嗜嗇嗑嗣嗤嗯嗚嗡嗅嗆嗥嗉園圓塞塑塘塗塚塔填塌塭塊塢塒塋奧嫁嫉嫌媾媽媼"],
["b740","媳嫂媲嵩嵯幌幹廉廈弒彙徬微愚意慈感想愛惹愁愈慎慌慄慍愾愴愧愍愆愷戡戢搓搾搞搪搭搽搬搏搜搔損搶搖搗搆敬斟新暗暉暇暈暖暄暘暍會榔業"],
["b7a1","楚楷楠楔極椰概楊楨楫楞楓楹榆楝楣楛歇歲毀殿毓毽溢溯滓溶滂源溝滇滅溥溘溼溺溫滑準溜滄滔溪溧溴煎煙煩煤煉照煜煬煦煌煥煞煆煨煖爺牒猷獅猿猾瑯瑚瑕瑟瑞瑁琿瑙瑛瑜當畸瘀痰瘁痲痱痺痿痴痳盞盟睛睫睦睞督"],
["b840","睹睪睬睜睥睨睢矮碎碰碗碘碌碉硼碑碓硿祺祿禁萬禽稜稚稠稔稟稞窟窠筷節筠筮筧粱粳粵經絹綑綁綏絛置罩罪署義羨群聖聘肆肄腱腰腸腥腮腳腫"],
["b8a1","腹腺腦舅艇蒂葷落萱葵葦葫葉葬葛萼萵葡董葩葭葆虞虜號蛹蜓蜈蜇蜀蛾蛻蜂蜃蜆蜊衙裟裔裙補裘裝裡裊裕裒覜解詫該詳試詩詰誇詼詣誠話誅詭詢詮詬詹詻訾詨豢貊貉賊資賈賄貲賃賂賅跡跟跨路跳跺跪跤跦躲較載軾輊"],
["b940","辟農運遊道遂達逼違遐遇遏過遍遑逾遁鄒鄗酬酪酩釉鈷鉗鈸鈽鉀鈾鉛鉋鉤鉑鈴鉉鉍鉅鈹鈿鉚閘隘隔隕雍雋雉雊雷電雹零靖靴靶預頑頓頊頒頌飼飴"],
["b9a1","飽飾馳馱馴髡鳩麂鼎鼓鼠僧僮僥僖僭僚僕像僑僱僎僩兢凳劃劂匱厭嗾嘀嘛嘗嗽嘔嘆嘉嘍嘎嗷嘖嘟嘈嘐嗶團圖塵塾境墓墊塹墅塽壽夥夢夤奪奩嫡嫦嫩嫗嫖嫘嫣孵寞寧寡寥實寨寢寤察對屢嶄嶇幛幣幕幗幔廓廖弊彆彰徹慇"],
["ba40","愿態慷慢慣慟慚慘慵截撇摘摔撤摸摟摺摑摧搴摭摻敲斡旗旖暢暨暝榜榨榕槁榮槓構榛榷榻榫榴槐槍榭槌榦槃榣歉歌氳漳演滾漓滴漩漾漠漬漏漂漢"],
["baa1","滿滯漆漱漸漲漣漕漫漯澈漪滬漁滲滌滷熔熙煽熊熄熒爾犒犖獄獐瑤瑣瑪瑰瑭甄疑瘧瘍瘋瘉瘓盡監瞄睽睿睡磁碟碧碳碩碣禎福禍種稱窪窩竭端管箕箋筵算箝箔箏箸箇箄粹粽精綻綰綜綽綾綠緊綴網綱綺綢綿綵綸維緒緇綬"],
["bb40","罰翠翡翟聞聚肇腐膀膏膈膊腿膂臧臺與舔舞艋蓉蒿蓆蓄蒙蒞蒲蒜蓋蒸蓀蓓蒐蒼蓑蓊蜿蜜蜻蜢蜥蜴蜘蝕蜷蜩裳褂裴裹裸製裨褚裯誦誌語誣認誡誓誤"],
["bba1","說誥誨誘誑誚誧豪貍貌賓賑賒赫趙趕跼輔輒輕輓辣遠遘遜遣遙遞遢遝遛鄙鄘鄞酵酸酷酴鉸銀銅銘銖鉻銓銜銨鉼銑閡閨閩閣閥閤隙障際雌雒需靼鞅韶頗領颯颱餃餅餌餉駁骯骰髦魁魂鳴鳶鳳麼鼻齊億儀僻僵價儂儈儉儅凜"],
["bc40","劇劈劉劍劊勰厲嘮嘻嘹嘲嘿嘴嘩噓噎噗噴嘶嘯嘰墀墟增墳墜墮墩墦奭嬉嫻嬋嫵嬌嬈寮寬審寫層履嶝嶔幢幟幡廢廚廟廝廣廠彈影德徵慶慧慮慝慕憂"],
["bca1","慼慰慫慾憧憐憫憎憬憚憤憔憮戮摩摯摹撞撲撈撐撰撥撓撕撩撒撮播撫撚撬撙撢撳敵敷數暮暫暴暱樣樟槨樁樞標槽模樓樊槳樂樅槭樑歐歎殤毅毆漿潼澄潑潦潔澆潭潛潸潮澎潺潰潤澗潘滕潯潠潟熟熬熱熨牖犛獎獗瑩璋璃"],
["bd40","瑾璀畿瘠瘩瘟瘤瘦瘡瘢皚皺盤瞎瞇瞌瞑瞋磋磅確磊碾磕碼磐稿稼穀稽稷稻窯窮箭箱範箴篆篇篁箠篌糊締練緯緻緘緬緝編緣線緞緩綞緙緲緹罵罷羯"],
["bda1","翩耦膛膜膝膠膚膘蔗蔽蔚蓮蔬蔭蔓蔑蔣蔡蔔蓬蔥蓿蔆螂蝴蝶蝠蝦蝸蝨蝙蝗蝌蝓衛衝褐複褒褓褕褊誼諒談諄誕請諸課諉諂調誰論諍誶誹諛豌豎豬賠賞賦賤賬賭賢賣賜質賡赭趟趣踫踐踝踢踏踩踟踡踞躺輝輛輟輩輦輪輜輞"],
["be40","輥適遮遨遭遷鄰鄭鄧鄱醇醉醋醃鋅銻銷鋪銬鋤鋁銳銼鋒鋇鋰銲閭閱霄霆震霉靠鞍鞋鞏頡頫頜颳養餓餒餘駝駐駟駛駑駕駒駙骷髮髯鬧魅魄魷魯鴆鴉"],
["bea1","鴃麩麾黎墨齒儒儘儔儐儕冀冪凝劑劓勳噙噫噹噩噤噸噪器噥噱噯噬噢噶壁墾壇壅奮嬝嬴學寰導彊憲憑憩憊懍憶憾懊懈戰擅擁擋撻撼據擄擇擂操撿擒擔撾整曆曉暹曄曇暸樽樸樺橙橫橘樹橄橢橡橋橇樵機橈歙歷氅濂澱澡"],
["bf40","濃澤濁澧澳激澹澶澦澠澴熾燉燐燒燈燕熹燎燙燜燃燄獨璜璣璘璟璞瓢甌甍瘴瘸瘺盧盥瞠瞞瞟瞥磨磚磬磧禦積穎穆穌穋窺篙簑築篤篛篡篩篦糕糖縊"],
["bfa1","縑縈縛縣縞縝縉縐罹羲翰翱翮耨膳膩膨臻興艘艙蕊蕙蕈蕨蕩蕃蕉蕭蕪蕞螃螟螞螢融衡褪褲褥褫褡親覦諦諺諫諱謀諜諧諮諾謁謂諷諭諳諶諼豫豭貓賴蹄踱踴蹂踹踵輻輯輸輳辨辦遵遴選遲遼遺鄴醒錠錶鋸錳錯錢鋼錫錄錚"],
["c040","錐錦錡錕錮錙閻隧隨險雕霎霑霖霍霓霏靛靜靦鞘頰頸頻頷頭頹頤餐館餞餛餡餚駭駢駱骸骼髻髭鬨鮑鴕鴣鴦鴨鴒鴛默黔龍龜優償儡儲勵嚎嚀嚐嚅嚇"],
["c0a1","嚏壕壓壑壎嬰嬪嬤孺尷屨嶼嶺嶽嶸幫彌徽應懂懇懦懋戲戴擎擊擘擠擰擦擬擱擢擭斂斃曙曖檀檔檄檢檜櫛檣橾檗檐檠歜殮毚氈濘濱濟濠濛濤濫濯澀濬濡濩濕濮濰燧營燮燦燥燭燬燴燠爵牆獰獲璩環璦璨癆療癌盪瞳瞪瞰瞬"],
["c140","瞧瞭矯磷磺磴磯礁禧禪穗窿簇簍篾篷簌篠糠糜糞糢糟糙糝縮績繆縷縲繃縫總縱繅繁縴縹繈縵縿縯罄翳翼聱聲聰聯聳臆臃膺臂臀膿膽臉膾臨舉艱薪"],
["c1a1","薄蕾薜薑薔薯薛薇薨薊虧蟀蟑螳蟒蟆螫螻螺蟈蟋褻褶襄褸褽覬謎謗謙講謊謠謝謄謐豁谿豳賺賽購賸賻趨蹉蹋蹈蹊轄輾轂轅輿避遽還邁邂邀鄹醣醞醜鍍鎂錨鍵鍊鍥鍋錘鍾鍬鍛鍰鍚鍔闊闋闌闈闆隱隸雖霜霞鞠韓顆颶餵騁"],
["c240","駿鮮鮫鮪鮭鴻鴿麋黏點黜黝黛鼾齋叢嚕嚮壙壘嬸彝懣戳擴擲擾攆擺擻擷斷曜朦檳檬櫃檻檸櫂檮檯歟歸殯瀉瀋濾瀆濺瀑瀏燻燼燾燸獷獵璧璿甕癖癘"],
["c2a1","癒瞽瞿瞻瞼礎禮穡穢穠竄竅簫簧簪簞簣簡糧織繕繞繚繡繒繙罈翹翻職聶臍臏舊藏薩藍藐藉薰薺薹薦蟯蟬蟲蟠覆覲觴謨謹謬謫豐贅蹙蹣蹦蹤蹟蹕軀轉轍邇邃邈醫醬釐鎔鎊鎖鎢鎳鎮鎬鎰鎘鎚鎗闔闖闐闕離雜雙雛雞霤鞣鞦"],
["c340","鞭韹額顏題顎顓颺餾餿餽餮馥騎髁鬃鬆魏魎魍鯊鯉鯽鯈鯀鵑鵝鵠黠鼕鼬儳嚥壞壟壢寵龐廬懲懷懶懵攀攏曠曝櫥櫝櫚櫓瀛瀟瀨瀚瀝瀕瀘爆爍牘犢獸"],
["c3a1","獺璽瓊瓣疇疆癟癡矇礙禱穫穩簾簿簸簽簷籀繫繭繹繩繪羅繳羶羹羸臘藩藝藪藕藤藥藷蟻蠅蠍蟹蟾襠襟襖襞譁譜識證譚譎譏譆譙贈贊蹼蹲躇蹶蹬蹺蹴轔轎辭邊邋醱醮鏡鏑鏟鏃鏈鏜鏝鏖鏢鏍鏘鏤鏗鏨關隴難霪霧靡韜韻類"],
["c440","願顛颼饅饉騖騙鬍鯨鯧鯖鯛鶉鵡鵲鵪鵬麒麗麓麴勸嚨嚷嚶嚴嚼壤孀孃孽寶巉懸懺攘攔攙曦朧櫬瀾瀰瀲爐獻瓏癢癥礦礪礬礫竇競籌籃籍糯糰辮繽繼"],
["c4a1","纂罌耀臚艦藻藹蘑藺蘆蘋蘇蘊蠔蠕襤覺觸議譬警譯譟譫贏贍躉躁躅躂醴釋鐘鐃鏽闡霰飄饒饑馨騫騰騷騵鰓鰍鹹麵黨鼯齟齣齡儷儸囁囀囂夔屬巍懼懾攝攜斕曩櫻欄櫺殲灌爛犧瓖瓔癩矓籐纏續羼蘗蘭蘚蠣蠢蠡蠟襪襬覽譴"],
["c540","護譽贓躊躍躋轟辯醺鐮鐳鐵鐺鐸鐲鐫闢霸霹露響顧顥饗驅驃驀騾髏魔魑鰭鰥鶯鶴鷂鶸麝黯鼙齜齦齧儼儻囈囊囉孿巔巒彎懿攤權歡灑灘玀瓤疊癮癬"],
["c5a1","禳籠籟聾聽臟襲襯觼讀贖贗躑躓轡酈鑄鑑鑒霽霾韃韁顫饕驕驍髒鬚鱉鰱鰾鰻鷓鷗鼴齬齪龔囌巖戀攣攫攪曬欐瓚竊籤籣籥纓纖纔臢蘸蘿蠱變邐邏鑣鑠鑤靨顯饜驚驛驗髓體髑鱔鱗鱖鷥麟黴囑壩攬灞癱癲矗罐羈蠶蠹衢讓讒"],
["c640","讖艷贛釀鑪靂靈靄韆顰驟鬢魘鱟鷹鷺鹼鹽鼇齷齲廳欖灣籬籮蠻觀躡釁鑲鑰顱饞髖鬣黌灤矚讚鑷韉驢驥纜讜躪釅鑽鑾鑼鱷鱸黷豔鑿鸚爨驪鬱鸛鸞籲"],
["c940","乂乜凵匚厂万丌乇亍囗兀屮彳丏冇与丮亓仂仉仈冘勼卬厹圠夃夬尐巿旡殳毌气爿丱丼仨仜仩仡仝仚刌匜卌圢圣夗夯宁宄尒尻屴屳帄庀庂忉戉扐氕"],
["c9a1","氶汃氿氻犮犰玊禸肊阞伎优伬仵伔仱伀价伈伝伂伅伢伓伄仴伒冱刓刉刐劦匢匟卍厊吇囡囟圮圪圴夼妀奼妅奻奾奷奿孖尕尥屼屺屻屾巟幵庄异弚彴忕忔忏扜扞扤扡扦扢扙扠扚扥旯旮朾朹朸朻机朿朼朳氘汆汒汜汏汊汔汋"],
["ca40","汌灱牞犴犵玎甪癿穵网艸艼芀艽艿虍襾邙邗邘邛邔阢阤阠阣佖伻佢佉体佤伾佧佒佟佁佘伭伳伿佡冏冹刜刞刡劭劮匉卣卲厎厏吰吷吪呔呅吙吜吥吘"],
["caa1","吽呏呁吨吤呇囮囧囥坁坅坌坉坋坒夆奀妦妘妠妗妎妢妐妏妧妡宎宒尨尪岍岏岈岋岉岒岊岆岓岕巠帊帎庋庉庌庈庍弅弝彸彶忒忑忐忭忨忮忳忡忤忣忺忯忷忻怀忴戺抃抌抎抏抔抇扱扻扺扰抁抈扷扽扲扴攷旰旴旳旲旵杅杇"],
["cb40","杙杕杌杈杝杍杚杋毐氙氚汸汧汫沄沋沏汱汯汩沚汭沇沕沜汦汳汥汻沎灴灺牣犿犽狃狆狁犺狅玕玗玓玔玒町甹疔疕皁礽耴肕肙肐肒肜芐芏芅芎芑芓"],
["cba1","芊芃芄豸迉辿邟邡邥邞邧邠阰阨阯阭丳侘佼侅佽侀侇佶佴侉侄佷佌侗佪侚佹侁佸侐侜侔侞侒侂侕佫佮冞冼冾刵刲刳剆刱劼匊匋匼厒厔咇呿咁咑咂咈呫呺呾呥呬呴呦咍呯呡呠咘呣呧呤囷囹坯坲坭坫坱坰坶垀坵坻坳坴坢"],
["cc40","坨坽夌奅妵妺姏姎妲姌姁妶妼姃姖妱妽姀姈妴姇孢孥宓宕屄屇岮岤岠岵岯岨岬岟岣岭岢岪岧岝岥岶岰岦帗帔帙弨弢弣弤彔徂彾彽忞忥怭怦怙怲怋"],
["cca1","怴怊怗怳怚怞怬怢怍怐怮怓怑怌怉怜戔戽抭抴拑抾抪抶拊抮抳抯抻抩抰抸攽斨斻昉旼昄昒昈旻昃昋昍昅旽昑昐曶朊枅杬枎枒杶杻枘枆构杴枍枌杺枟枑枙枃杽极杸杹枔欥殀歾毞氝沓泬泫泮泙沶泔沭泧沷泐泂沺泃泆泭泲"],
["cd40","泒泝沴沊沝沀泞泀洰泍泇沰泹泏泩泑炔炘炅炓炆炄炑炖炂炚炃牪狖狋狘狉狜狒狔狚狌狑玤玡玭玦玢玠玬玝瓝瓨甿畀甾疌疘皯盳盱盰盵矸矼矹矻矺"],
["cda1","矷祂礿秅穸穻竻籵糽耵肏肮肣肸肵肭舠芠苀芫芚芘芛芵芧芮芼芞芺芴芨芡芩苂芤苃芶芢虰虯虭虮豖迒迋迓迍迖迕迗邲邴邯邳邰阹阽阼阺陃俍俅俓侲俉俋俁俔俜俙侻侳俛俇俖侺俀侹俬剄剉勀勂匽卼厗厖厙厘咺咡咭咥哏"],
["ce40","哃茍咷咮哖咶哅哆咠呰咼咢咾呲哞咰垵垞垟垤垌垗垝垛垔垘垏垙垥垚垕壴复奓姡姞姮娀姱姝姺姽姼姶姤姲姷姛姩姳姵姠姾姴姭宨屌峐峘峌峗峋峛"],
["cea1","峞峚峉峇峊峖峓峔峏峈峆峎峟峸巹帡帢帣帠帤庰庤庢庛庣庥弇弮彖徆怷怹恔恲恞恅恓恇恉恛恌恀恂恟怤恄恘恦恮扂扃拏挍挋拵挎挃拫拹挏挌拸拶挀挓挔拺挕拻拰敁敃斪斿昶昡昲昵昜昦昢昳昫昺昝昴昹昮朏朐柁柲柈枺"],
["cf40","柜枻柸柘柀枷柅柫柤柟枵柍枳柷柶柮柣柂枹柎柧柰枲柼柆柭柌枮柦柛柺柉柊柃柪柋欨殂殄殶毖毘毠氠氡洨洴洭洟洼洿洒洊泚洳洄洙洺洚洑洀洝浂"],
["cfa1","洁洘洷洃洏浀洇洠洬洈洢洉洐炷炟炾炱炰炡炴炵炩牁牉牊牬牰牳牮狊狤狨狫狟狪狦狣玅珌珂珈珅玹玶玵玴珫玿珇玾珃珆玸珋瓬瓮甮畇畈疧疪癹盄眈眃眄眅眊盷盻盺矧矨砆砑砒砅砐砏砎砉砃砓祊祌祋祅祄秕种秏秖秎窀"],
["d040","穾竑笀笁籺籸籹籿粀粁紃紈紁罘羑羍羾耇耎耏耔耷胘胇胠胑胈胂胐胅胣胙胜胊胕胉胏胗胦胍臿舡芔苙苾苹茇苨茀苕茺苫苖苴苬苡苲苵茌苻苶苰苪"],
["d0a1","苤苠苺苳苭虷虴虼虳衁衎衧衪衩觓訄訇赲迣迡迮迠郱邽邿郕郅邾郇郋郈釔釓陔陏陑陓陊陎倞倅倇倓倢倰倛俵俴倳倷倬俶俷倗倜倠倧倵倯倱倎党冔冓凊凄凅凈凎剡剚剒剞剟剕剢勍匎厞唦哢唗唒哧哳哤唚哿唄唈哫唑唅哱"],
["d140","唊哻哷哸哠唎唃唋圁圂埌堲埕埒垺埆垽垼垸垶垿埇埐垹埁夎奊娙娖娭娮娕娏娗娊娞娳孬宧宭宬尃屖屔峬峿峮峱峷崀峹帩帨庨庮庪庬弳弰彧恝恚恧"],
["d1a1","恁悢悈悀悒悁悝悃悕悛悗悇悜悎戙扆拲挐捖挬捄捅挶捃揤挹捋捊挼挩捁挴捘捔捙挭捇挳捚捑挸捗捀捈敊敆旆旃旄旂晊晟晇晑朒朓栟栚桉栲栳栻桋桏栖栱栜栵栫栭栯桎桄栴栝栒栔栦栨栮桍栺栥栠欬欯欭欱欴歭肂殈毦毤"],
["d240","毨毣毢毧氥浺浣浤浶洍浡涒浘浢浭浯涑涍淯浿涆浞浧浠涗浰浼浟涂涘洯浨涋浾涀涄洖涃浻浽浵涐烜烓烑烝烋缹烢烗烒烞烠烔烍烅烆烇烚烎烡牂牸"],
["d2a1","牷牶猀狺狴狾狶狳狻猁珓珙珥珖玼珧珣珩珜珒珛珔珝珚珗珘珨瓞瓟瓴瓵甡畛畟疰痁疻痄痀疿疶疺皊盉眝眛眐眓眒眣眑眕眙眚眢眧砣砬砢砵砯砨砮砫砡砩砳砪砱祔祛祏祜祓祒祑秫秬秠秮秭秪秜秞秝窆窉窅窋窌窊窇竘笐"],
["d340","笄笓笅笏笈笊笎笉笒粄粑粊粌粈粍粅紞紝紑紎紘紖紓紟紒紏紌罜罡罞罠罝罛羖羒翃翂翀耖耾耹胺胲胹胵脁胻脀舁舯舥茳茭荄茙荑茥荖茿荁茦茜茢"],
["d3a1","荂荎茛茪茈茼荍茖茤茠茷茯茩荇荅荌荓茞茬荋茧荈虓虒蚢蚨蚖蚍蚑蚞蚇蚗蚆蚋蚚蚅蚥蚙蚡蚧蚕蚘蚎蚝蚐蚔衃衄衭衵衶衲袀衱衿衯袃衾衴衼訒豇豗豻貤貣赶赸趵趷趶軑軓迾迵适迿迻逄迼迶郖郠郙郚郣郟郥郘郛郗郜郤酐"],
["d440","酎酏釕釢釚陜陟隼飣髟鬯乿偰偪偡偞偠偓偋偝偲偈偍偁偛偊偢倕偅偟偩偫偣偤偆偀偮偳偗偑凐剫剭剬剮勖勓匭厜啵啶唼啍啐唴唪啑啢唶唵唰啒啅"],
["d4a1","唌唲啥啎唹啈唭唻啀啋圊圇埻堔埢埶埜埴堀埭埽堈埸堋埳埏堇埮埣埲埥埬埡堎埼堐埧堁堌埱埩埰堍堄奜婠婘婕婧婞娸娵婭婐婟婥婬婓婤婗婃婝婒婄婛婈媎娾婍娹婌婰婩婇婑婖婂婜孲孮寁寀屙崞崋崝崚崠崌崨崍崦崥崏"],
["d540","崰崒崣崟崮帾帴庱庴庹庲庳弶弸徛徖徟悊悐悆悾悰悺惓惔惏惤惙惝惈悱惛悷惊悿惃惍惀挲捥掊掂捽掽掞掭掝掗掫掎捯掇掐据掯捵掜捭掮捼掤挻掟"],
["d5a1","捸掅掁掑掍捰敓旍晥晡晛晙晜晢朘桹梇梐梜桭桮梮梫楖桯梣梬梩桵桴梲梏桷梒桼桫桲梪梀桱桾梛梖梋梠梉梤桸桻梑梌梊桽欶欳欷欸殑殏殍殎殌氪淀涫涴涳湴涬淩淢涷淶淔渀淈淠淟淖涾淥淜淝淛淴淊涽淭淰涺淕淂淏淉"],
["d640","淐淲淓淽淗淍淣涻烺焍烷焗烴焌烰焄烳焐烼烿焆焓焀烸烶焋焂焎牾牻牼牿猝猗猇猑猘猊猈狿猏猞玈珶珸珵琄琁珽琇琀珺珼珿琌琋珴琈畤畣痎痒痏"],
["d6a1","痋痌痑痐皏皉盓眹眯眭眱眲眴眳眽眥眻眵硈硒硉硍硊硌砦硅硐祤祧祩祪祣祫祡离秺秸秶秷窏窔窐笵筇笴笥笰笢笤笳笘笪笝笱笫笭笯笲笸笚笣粔粘粖粣紵紽紸紶紺絅紬紩絁絇紾紿絊紻紨罣羕羜羝羛翊翋翍翐翑翇翏翉耟"],
["d740","耞耛聇聃聈脘脥脙脛脭脟脬脞脡脕脧脝脢舑舸舳舺舴舲艴莐莣莨莍荺荳莤荴莏莁莕莙荵莔莩荽莃莌莝莛莪莋荾莥莯莈莗莰荿莦莇莮荶莚虙虖蚿蚷"],
["d7a1","蛂蛁蛅蚺蚰蛈蚹蚳蚸蛌蚴蚻蚼蛃蚽蚾衒袉袕袨袢袪袚袑袡袟袘袧袙袛袗袤袬袌袓袎覂觖觙觕訰訧訬訞谹谻豜豝豽貥赽赻赹趼跂趹趿跁軘軞軝軜軗軠軡逤逋逑逜逌逡郯郪郰郴郲郳郔郫郬郩酖酘酚酓酕釬釴釱釳釸釤釹釪"],
["d840","釫釷釨釮镺閆閈陼陭陫陱陯隿靪頄飥馗傛傕傔傞傋傣傃傌傎傝偨傜傒傂傇兟凔匒匑厤厧喑喨喥喭啷噅喢喓喈喏喵喁喣喒喤啽喌喦啿喕喡喎圌堩堷"],
["d8a1","堙堞堧堣堨埵塈堥堜堛堳堿堶堮堹堸堭堬堻奡媯媔媟婺媢媞婸媦婼媥媬媕媮娷媄媊媗媃媋媩婻婽媌媜媏媓媝寪寍寋寔寑寊寎尌尰崷嵃嵫嵁嵋崿崵嵑嵎嵕崳崺嵒崽崱嵙嵂崹嵉崸崼崲崶嵀嵅幄幁彘徦徥徫惉悹惌惢惎惄愔"],
["d940","惲愊愖愅惵愓惸惼惾惁愃愘愝愐惿愄愋扊掔掱掰揎揥揨揯揃撝揳揊揠揶揕揲揵摡揟掾揝揜揄揘揓揂揇揌揋揈揰揗揙攲敧敪敤敜敨敥斌斝斞斮旐旒"],
["d9a1","晼晬晻暀晱晹晪晲朁椌棓椄棜椪棬棪棱椏棖棷棫棤棶椓椐棳棡椇棌椈楰梴椑棯棆椔棸棐棽棼棨椋椊椗棎棈棝棞棦棴棑椆棔棩椕椥棇欹欻欿欼殔殗殙殕殽毰毲毳氰淼湆湇渟湉溈渼渽湅湢渫渿湁湝湳渜渳湋湀湑渻渃渮湞"],
["da40","湨湜湡渱渨湠湱湫渹渢渰湓湥渧湸湤湷湕湹湒湦渵渶湚焠焞焯烻焮焱焣焥焢焲焟焨焺焛牋牚犈犉犆犅犋猒猋猰猢猱猳猧猲猭猦猣猵猌琮琬琰琫琖"],
["daa1","琚琡琭琱琤琣琝琩琠琲瓻甯畯畬痧痚痡痦痝痟痤痗皕皒盚睆睇睄睍睅睊睎睋睌矞矬硠硤硥硜硭硱硪确硰硩硨硞硢祴祳祲祰稂稊稃稌稄窙竦竤筊笻筄筈筌筎筀筘筅粢粞粨粡絘絯絣絓絖絧絪絏絭絜絫絒絔絩絑絟絎缾缿罥"],
["db40","罦羢羠羡翗聑聏聐胾胔腃腊腒腏腇脽腍脺臦臮臷臸臹舄舼舽舿艵茻菏菹萣菀菨萒菧菤菼菶萐菆菈菫菣莿萁菝菥菘菿菡菋菎菖菵菉萉萏菞萑萆菂菳"],
["dba1","菕菺菇菑菪萓菃菬菮菄菻菗菢萛菛菾蛘蛢蛦蛓蛣蛚蛪蛝蛫蛜蛬蛩蛗蛨蛑衈衖衕袺裗袹袸裀袾袶袼袷袽袲褁裉覕覘覗觝觚觛詎詍訹詙詀詗詘詄詅詒詈詑詊詌詏豟貁貀貺貾貰貹貵趄趀趉跘跓跍跇跖跜跏跕跙跈跗跅軯軷軺"],
["dc40","軹軦軮軥軵軧軨軶軫軱軬軴軩逭逴逯鄆鄬鄄郿郼鄈郹郻鄁鄀鄇鄅鄃酡酤酟酢酠鈁鈊鈥鈃鈚鈦鈏鈌鈀鈒釿釽鈆鈄鈧鈂鈜鈤鈙鈗鈅鈖镻閍閌閐隇陾隈"],
["dca1","隉隃隀雂雈雃雱雰靬靰靮頇颩飫鳦黹亃亄亶傽傿僆傮僄僊傴僈僂傰僁傺傱僋僉傶傸凗剺剸剻剼嗃嗛嗌嗐嗋嗊嗝嗀嗔嗄嗩喿嗒喍嗏嗕嗢嗖嗈嗲嗍嗙嗂圔塓塨塤塏塍塉塯塕塎塝塙塥塛堽塣塱壼嫇嫄嫋媺媸媱媵媰媿嫈媻嫆"],
["dd40","媷嫀嫊媴媶嫍媹媐寖寘寙尟尳嵱嵣嵊嵥嵲嵬嵞嵨嵧嵢巰幏幎幊幍幋廅廌廆廋廇彀徯徭惷慉慊愫慅愶愲愮慆愯慏愩慀戠酨戣戥戤揅揱揫搐搒搉搠搤"],
["dda1","搳摃搟搕搘搹搷搢搣搌搦搰搨摁搵搯搊搚摀搥搧搋揧搛搮搡搎敯斒旓暆暌暕暐暋暊暙暔晸朠楦楟椸楎楢楱椿楅楪椹楂楗楙楺楈楉椵楬椳椽楥棰楸椴楩楀楯楄楶楘楁楴楌椻楋椷楜楏楑椲楒椯楻椼歆歅歃歂歈歁殛嗀毻毼"],
["de40","毹毷毸溛滖滈溏滀溟溓溔溠溱溹滆滒溽滁溞滉溷溰滍溦滏溲溾滃滜滘溙溒溎溍溤溡溿溳滐滊溗溮溣煇煔煒煣煠煁煝煢煲煸煪煡煂煘煃煋煰煟煐煓"],
["dea1","煄煍煚牏犍犌犑犐犎猼獂猻猺獀獊獉瑄瑊瑋瑒瑑瑗瑀瑏瑐瑎瑂瑆瑍瑔瓡瓿瓾瓽甝畹畷榃痯瘏瘃痷痾痼痹痸瘐痻痶痭痵痽皙皵盝睕睟睠睒睖睚睩睧睔睙睭矠碇碚碔碏碄碕碅碆碡碃硹碙碀碖硻祼禂祽祹稑稘稙稒稗稕稢稓"],
["df40","稛稐窣窢窞竫筦筤筭筴筩筲筥筳筱筰筡筸筶筣粲粴粯綈綆綀綍絿綅絺綎絻綃絼綌綔綄絽綒罭罫罧罨罬羦羥羧翛翜耡腤腠腷腜腩腛腢腲朡腞腶腧腯"],
["dfa1","腄腡舝艉艄艀艂艅蓱萿葖葶葹蒏蒍葥葑葀蒆葧萰葍葽葚葙葴葳葝蔇葞萷萺萴葺葃葸萲葅萩菙葋萯葂萭葟葰萹葎葌葒葯蓅蒎萻葇萶萳葨葾葄萫葠葔葮葐蜋蜄蛷蜌蛺蛖蛵蝍蛸蜎蜉蜁蛶蜍蜅裖裋裍裎裞裛裚裌裐覅覛觟觥觤"],
["e040","觡觠觢觜触詶誆詿詡訿詷誂誄詵誃誁詴詺谼豋豊豥豤豦貆貄貅賌赨赩趑趌趎趏趍趓趔趐趒跰跠跬跱跮跐跩跣跢跧跲跫跴輆軿輁輀輅輇輈輂輋遒逿"],
["e0a1","遄遉逽鄐鄍鄏鄑鄖鄔鄋鄎酮酯鉈鉒鈰鈺鉦鈳鉥鉞銃鈮鉊鉆鉭鉬鉏鉠鉧鉯鈶鉡鉰鈱鉔鉣鉐鉲鉎鉓鉌鉖鈲閟閜閞閛隒隓隑隗雎雺雽雸雵靳靷靸靲頏頍頎颬飶飹馯馲馰馵骭骫魛鳪鳭鳧麀黽僦僔僗僨僳僛僪僝僤僓僬僰僯僣僠"],
["e140","凘劀劁勩勫匰厬嘧嘕嘌嘒嗼嘏嘜嘁嘓嘂嗺嘝嘄嗿嗹墉塼墐墘墆墁塿塴墋塺墇墑墎塶墂墈塻墔墏壾奫嫜嫮嫥嫕嫪嫚嫭嫫嫳嫢嫠嫛嫬嫞嫝嫙嫨嫟孷寠"],
["e1a1","寣屣嶂嶀嵽嶆嵺嶁嵷嶊嶉嶈嵾嵼嶍嵹嵿幘幙幓廘廑廗廎廜廕廙廒廔彄彃彯徶愬愨慁慞慱慳慒慓慲慬憀慴慔慺慛慥愻慪慡慖戩戧戫搫摍摛摝摴摶摲摳摽摵摦撦摎撂摞摜摋摓摠摐摿搿摬摫摙摥摷敳斠暡暠暟朅朄朢榱榶槉"],
["e240","榠槎榖榰榬榼榑榙榎榧榍榩榾榯榿槄榽榤槔榹槊榚槏榳榓榪榡榞槙榗榐槂榵榥槆歊歍歋殞殟殠毃毄毾滎滵滱漃漥滸漷滻漮漉潎漙漚漧漘漻漒滭漊"],
["e2a1","漶潳滹滮漭潀漰漼漵滫漇漎潃漅滽滶漹漜滼漺漟漍漞漈漡熇熐熉熀熅熂熏煻熆熁熗牄牓犗犕犓獃獍獑獌瑢瑳瑱瑵瑲瑧瑮甀甂甃畽疐瘖瘈瘌瘕瘑瘊瘔皸瞁睼瞅瞂睮瞀睯睾瞃碲碪碴碭碨硾碫碞碥碠碬碢碤禘禊禋禖禕禔禓"],
["e340","禗禈禒禐稫穊稰稯稨稦窨窫窬竮箈箜箊箑箐箖箍箌箛箎箅箘劄箙箤箂粻粿粼粺綧綷緂綣綪緁緀緅綝緎緄緆緋緌綯綹綖綼綟綦綮綩綡緉罳翢翣翥翞"],
["e3a1","耤聝聜膉膆膃膇膍膌膋舕蒗蒤蒡蒟蒺蓎蓂蒬蒮蒫蒹蒴蓁蓍蒪蒚蒱蓐蒝蒧蒻蒢蒔蓇蓌蒛蒩蒯蒨蓖蒘蒶蓏蒠蓗蓔蓒蓛蒰蒑虡蜳蜣蜨蝫蝀蜮蜞蜡蜙蜛蝃蜬蝁蜾蝆蜠蜲蜪蜭蜼蜒蜺蜱蜵蝂蜦蜧蜸蜤蜚蜰蜑裷裧裱裲裺裾裮裼裶裻"],
["e440","裰裬裫覝覡覟覞觩觫觨誫誙誋誒誏誖谽豨豩賕賏賗趖踉踂跿踍跽踊踃踇踆踅跾踀踄輐輑輎輍鄣鄜鄠鄢鄟鄝鄚鄤鄡鄛酺酲酹酳銥銤鉶銛鉺銠銔銪銍"],
["e4a1","銦銚銫鉹銗鉿銣鋮銎銂銕銢鉽銈銡銊銆銌銙銧鉾銇銩銝銋鈭隞隡雿靘靽靺靾鞃鞀鞂靻鞄鞁靿韎韍頖颭颮餂餀餇馝馜駃馹馻馺駂馽駇骱髣髧鬾鬿魠魡魟鳱鳲鳵麧僿儃儰僸儆儇僶僾儋儌僽儊劋劌勱勯噈噂噌嘵噁噊噉噆噘"],
["e540","噚噀嘳嘽嘬嘾嘸嘪嘺圚墫墝墱墠墣墯墬墥墡壿嫿嫴嫽嫷嫶嬃嫸嬂嫹嬁嬇嬅嬏屧嶙嶗嶟嶒嶢嶓嶕嶠嶜嶡嶚嶞幩幝幠幜緳廛廞廡彉徲憋憃慹憱憰憢憉"],
["e5a1","憛憓憯憭憟憒憪憡憍慦憳戭摮摰撖撠撅撗撜撏撋撊撌撣撟摨撱撘敶敺敹敻斲斳暵暰暩暲暷暪暯樀樆樗槥槸樕槱槤樠槿槬槢樛樝槾樧槲槮樔槷槧橀樈槦槻樍槼槫樉樄樘樥樏槶樦樇槴樖歑殥殣殢殦氁氀毿氂潁漦潾澇濆澒"],
["e640","澍澉澌潢潏澅潚澖潶潬澂潕潲潒潐潗澔澓潝漀潡潫潽潧澐潓澋潩潿澕潣潷潪潻熲熯熛熰熠熚熩熵熝熥熞熤熡熪熜熧熳犘犚獘獒獞獟獠獝獛獡獚獙"],
["e6a1","獢璇璉璊璆璁瑽璅璈瑼瑹甈甇畾瘥瘞瘙瘝瘜瘣瘚瘨瘛皜皝皞皛瞍瞏瞉瞈磍碻磏磌磑磎磔磈磃磄磉禚禡禠禜禢禛歶稹窲窴窳箷篋箾箬篎箯箹篊箵糅糈糌糋緷緛緪緧緗緡縃緺緦緶緱緰緮緟罶羬羰羭翭翫翪翬翦翨聤聧膣膟"],
["e740","膞膕膢膙膗舖艏艓艒艐艎艑蔤蔻蔏蔀蔩蔎蔉蔍蔟蔊蔧蔜蓻蔫蓺蔈蔌蓴蔪蓲蔕蓷蓫蓳蓼蔒蓪蓩蔖蓾蔨蔝蔮蔂蓽蔞蓶蔱蔦蓧蓨蓰蓯蓹蔘蔠蔰蔋蔙蔯虢"],
["e7a1","蝖蝣蝤蝷蟡蝳蝘蝔蝛蝒蝡蝚蝑蝞蝭蝪蝐蝎蝟蝝蝯蝬蝺蝮蝜蝥蝏蝻蝵蝢蝧蝩衚褅褌褔褋褗褘褙褆褖褑褎褉覢覤覣觭觰觬諏諆誸諓諑諔諕誻諗誾諀諅諘諃誺誽諙谾豍貏賥賟賙賨賚賝賧趠趜趡趛踠踣踥踤踮踕踛踖踑踙踦踧"],
["e840","踔踒踘踓踜踗踚輬輤輘輚輠輣輖輗遳遰遯遧遫鄯鄫鄩鄪鄲鄦鄮醅醆醊醁醂醄醀鋐鋃鋄鋀鋙銶鋏鋱鋟鋘鋩鋗鋝鋌鋯鋂鋨鋊鋈鋎鋦鋍鋕鋉鋠鋞鋧鋑鋓"],
["e8a1","銵鋡鋆銴镼閬閫閮閰隤隢雓霅霈霂靚鞊鞎鞈韐韏頞頝頦頩頨頠頛頧颲餈飺餑餔餖餗餕駜駍駏駓駔駎駉駖駘駋駗駌骳髬髫髳髲髱魆魃魧魴魱魦魶魵魰魨魤魬鳼鳺鳽鳿鳷鴇鴀鳹鳻鴈鴅鴄麃黓鼏鼐儜儓儗儚儑凞匴叡噰噠噮"],
["e940","噳噦噣噭噲噞噷圜圛壈墽壉墿墺壂墼壆嬗嬙嬛嬡嬔嬓嬐嬖嬨嬚嬠嬞寯嶬嶱嶩嶧嶵嶰嶮嶪嶨嶲嶭嶯嶴幧幨幦幯廩廧廦廨廥彋徼憝憨憖懅憴懆懁懌憺"],
["e9a1","憿憸憌擗擖擐擏擉撽撉擃擛擳擙攳敿敼斢曈暾曀曊曋曏暽暻暺曌朣樴橦橉橧樲橨樾橝橭橶橛橑樨橚樻樿橁橪橤橐橏橔橯橩橠樼橞橖橕橍橎橆歕歔歖殧殪殫毈毇氄氃氆澭濋澣濇澼濎濈潞濄澽澞濊澨瀄澥澮澺澬澪濏澿澸"],
["ea40","澢濉澫濍澯澲澰燅燂熿熸燖燀燁燋燔燊燇燏熽燘熼燆燚燛犝犞獩獦獧獬獥獫獪瑿璚璠璔璒璕璡甋疀瘯瘭瘱瘽瘳瘼瘵瘲瘰皻盦瞚瞝瞡瞜瞛瞢瞣瞕瞙"],
["eaa1","瞗磝磩磥磪磞磣磛磡磢磭磟磠禤穄穈穇窶窸窵窱窷篞篣篧篝篕篥篚篨篹篔篪篢篜篫篘篟糒糔糗糐糑縒縡縗縌縟縠縓縎縜縕縚縢縋縏縖縍縔縥縤罃罻罼罺羱翯耪耩聬膱膦膮膹膵膫膰膬膴膲膷膧臲艕艖艗蕖蕅蕫蕍蕓蕡蕘"],
["eb40","蕀蕆蕤蕁蕢蕄蕑蕇蕣蔾蕛蕱蕎蕮蕵蕕蕧蕠薌蕦蕝蕔蕥蕬虣虥虤螛螏螗螓螒螈螁螖螘蝹螇螣螅螐螑螝螄螔螜螚螉褞褦褰褭褮褧褱褢褩褣褯褬褟觱諠"],
["eba1","諢諲諴諵諝謔諤諟諰諈諞諡諨諿諯諻貑貒貐賵賮賱賰賳赬赮趥趧踳踾踸蹀蹅踶踼踽蹁踰踿躽輶輮輵輲輹輷輴遶遹遻邆郺鄳鄵鄶醓醐醑醍醏錧錞錈錟錆錏鍺錸錼錛錣錒錁鍆錭錎錍鋋錝鋺錥錓鋹鋷錴錂錤鋿錩錹錵錪錔錌"],
["ec40","錋鋾錉錀鋻錖閼闍閾閹閺閶閿閵閽隩雔霋霒霐鞙鞗鞔韰韸頵頯頲餤餟餧餩馞駮駬駥駤駰駣駪駩駧骹骿骴骻髶髺髹髷鬳鮀鮅鮇魼魾魻鮂鮓鮒鮐魺鮕"],
["eca1","魽鮈鴥鴗鴠鴞鴔鴩鴝鴘鴢鴐鴙鴟麈麆麇麮麭黕黖黺鼒鼽儦儥儢儤儠儩勴嚓嚌嚍嚆嚄嚃噾嚂噿嚁壖壔壏壒嬭嬥嬲嬣嬬嬧嬦嬯嬮孻寱寲嶷幬幪徾徻懃憵憼懧懠懥懤懨懞擯擩擣擫擤擨斁斀斶旚曒檍檖檁檥檉檟檛檡檞檇檓檎"],
["ed40","檕檃檨檤檑橿檦檚檅檌檒歛殭氉濌澩濴濔濣濜濭濧濦濞濲濝濢濨燡燱燨燲燤燰燢獳獮獯璗璲璫璐璪璭璱璥璯甐甑甒甏疄癃癈癉癇皤盩瞵瞫瞲瞷瞶"],
["eda1","瞴瞱瞨矰磳磽礂磻磼磲礅磹磾礄禫禨穜穛穖穘穔穚窾竀竁簅簏篲簀篿篻簎篴簋篳簂簉簃簁篸篽簆篰篱簐簊糨縭縼繂縳顈縸縪繉繀繇縩繌縰縻縶繄縺罅罿罾罽翴翲耬膻臄臌臊臅臇膼臩艛艚艜薃薀薏薧薕薠薋薣蕻薤薚薞"],
["ee40","蕷蕼薉薡蕺蕸蕗薎薖薆薍薙薝薁薢薂薈薅蕹蕶薘薐薟虨螾螪螭蟅螰螬螹螵螼螮蟉蟃蟂蟌螷螯蟄蟊螴螶螿螸螽蟞螲褵褳褼褾襁襒褷襂覭覯覮觲觳謞"],
["eea1","謘謖謑謅謋謢謏謒謕謇謍謈謆謜謓謚豏豰豲豱豯貕貔賹赯蹎蹍蹓蹐蹌蹇轃轀邅遾鄸醚醢醛醙醟醡醝醠鎡鎃鎯鍤鍖鍇鍼鍘鍜鍶鍉鍐鍑鍠鍭鎏鍌鍪鍹鍗鍕鍒鍏鍱鍷鍻鍡鍞鍣鍧鎀鍎鍙闇闀闉闃闅閷隮隰隬霠霟霘霝霙鞚鞡鞜"],
["ef40","鞞鞝韕韔韱顁顄顊顉顅顃餥餫餬餪餳餲餯餭餱餰馘馣馡騂駺駴駷駹駸駶駻駽駾駼騃骾髾髽鬁髼魈鮚鮨鮞鮛鮦鮡鮥鮤鮆鮢鮠鮯鴳鵁鵧鴶鴮鴯鴱鴸鴰"],
["efa1","鵅鵂鵃鴾鴷鵀鴽翵鴭麊麉麍麰黈黚黻黿鼤鼣鼢齔龠儱儭儮嚘嚜嚗嚚嚝嚙奰嬼屩屪巀幭幮懘懟懭懮懱懪懰懫懖懩擿攄擽擸攁攃擼斔旛曚曛曘櫅檹檽櫡櫆檺檶檷櫇檴檭歞毉氋瀇瀌瀍瀁瀅瀔瀎濿瀀濻瀦濼濷瀊爁燿燹爃燽獶"],
["f040","璸瓀璵瓁璾璶璻瓂甔甓癜癤癙癐癓癗癚皦皽盬矂瞺磿礌礓礔礉礐礒礑禭禬穟簜簩簙簠簟簭簝簦簨簢簥簰繜繐繖繣繘繢繟繑繠繗繓羵羳翷翸聵臑臒"],
["f0a1","臐艟艞薴藆藀藃藂薳薵薽藇藄薿藋藎藈藅薱薶藒蘤薸薷薾虩蟧蟦蟢蟛蟫蟪蟥蟟蟳蟤蟔蟜蟓蟭蟘蟣螤蟗蟙蠁蟴蟨蟝襓襋襏襌襆襐襑襉謪謧謣謳謰謵譇謯謼謾謱謥謷謦謶謮謤謻謽謺豂豵貙貘貗賾贄贂贀蹜蹢蹠蹗蹖蹞蹥蹧"],
["f140","蹛蹚蹡蹝蹩蹔轆轇轈轋鄨鄺鄻鄾醨醥醧醯醪鎵鎌鎒鎷鎛鎝鎉鎧鎎鎪鎞鎦鎕鎈鎙鎟鎍鎱鎑鎲鎤鎨鎴鎣鎥闒闓闑隳雗雚巂雟雘雝霣霢霥鞬鞮鞨鞫鞤鞪"],
["f1a1","鞢鞥韗韙韖韘韺顐顑顒颸饁餼餺騏騋騉騍騄騑騊騅騇騆髀髜鬈鬄鬅鬩鬵魊魌魋鯇鯆鯃鮿鯁鮵鮸鯓鮶鯄鮹鮽鵜鵓鵏鵊鵛鵋鵙鵖鵌鵗鵒鵔鵟鵘鵚麎麌黟鼁鼀鼖鼥鼫鼪鼩鼨齌齕儴儵劖勷厴嚫嚭嚦嚧嚪嚬壚壝壛夒嬽嬾嬿巃幰"],
["f240","徿懻攇攐攍攉攌攎斄旞旝曞櫧櫠櫌櫑櫙櫋櫟櫜櫐櫫櫏櫍櫞歠殰氌瀙瀧瀠瀖瀫瀡瀢瀣瀩瀗瀤瀜瀪爌爊爇爂爅犥犦犤犣犡瓋瓅璷瓃甖癠矉矊矄矱礝礛"],
["f2a1","礡礜礗礞禰穧穨簳簼簹簬簻糬糪繶繵繸繰繷繯繺繲繴繨罋罊羃羆羷翽翾聸臗臕艤艡艣藫藱藭藙藡藨藚藗藬藲藸藘藟藣藜藑藰藦藯藞藢蠀蟺蠃蟶蟷蠉蠌蠋蠆蟼蠈蟿蠊蠂襢襚襛襗襡襜襘襝襙覈覷覶觶譐譈譊譀譓譖譔譋譕"],
["f340","譑譂譒譗豃豷豶貚贆贇贉趬趪趭趫蹭蹸蹳蹪蹯蹻軂轒轑轏轐轓辴酀鄿醰醭鏞鏇鏏鏂鏚鏐鏹鏬鏌鏙鎩鏦鏊鏔鏮鏣鏕鏄鏎鏀鏒鏧镽闚闛雡霩霫霬霨霦"],
["f3a1","鞳鞷鞶韝韞韟顜顙顝顗颿颽颻颾饈饇饃馦馧騚騕騥騝騤騛騢騠騧騣騞騜騔髂鬋鬊鬎鬌鬷鯪鯫鯠鯞鯤鯦鯢鯰鯔鯗鯬鯜鯙鯥鯕鯡鯚鵷鶁鶊鶄鶈鵱鶀鵸鶆鶋鶌鵽鵫鵴鵵鵰鵩鶅鵳鵻鶂鵯鵹鵿鶇鵨麔麑黀黼鼭齀齁齍齖齗齘匷嚲"],
["f440","嚵嚳壣孅巆巇廮廯忀忁懹攗攖攕攓旟曨曣曤櫳櫰櫪櫨櫹櫱櫮櫯瀼瀵瀯瀷瀴瀱灂瀸瀿瀺瀹灀瀻瀳灁爓爔犨獽獼璺皫皪皾盭矌矎矏矍矲礥礣礧礨礤礩"],
["f4a1","禲穮穬穭竷籉籈籊籇籅糮繻繾纁纀羺翿聹臛臙舋艨艩蘢藿蘁藾蘛蘀藶蘄蘉蘅蘌藽蠙蠐蠑蠗蠓蠖襣襦覹觷譠譪譝譨譣譥譧譭趮躆躈躄轙轖轗轕轘轚邍酃酁醷醵醲醳鐋鐓鏻鐠鐏鐔鏾鐕鐐鐨鐙鐍鏵鐀鏷鐇鐎鐖鐒鏺鐉鏸鐊鏿"],
["f540","鏼鐌鏶鐑鐆闞闠闟霮霯鞹鞻韽韾顠顢顣顟飁飂饐饎饙饌饋饓騲騴騱騬騪騶騩騮騸騭髇髊髆鬐鬒鬑鰋鰈鯷鰅鰒鯸鱀鰇鰎鰆鰗鰔鰉鶟鶙鶤鶝鶒鶘鶐鶛"],
["f5a1","鶠鶔鶜鶪鶗鶡鶚鶢鶨鶞鶣鶿鶩鶖鶦鶧麙麛麚黥黤黧黦鼰鼮齛齠齞齝齙龑儺儹劘劗囃嚽嚾孈孇巋巏廱懽攛欂櫼欃櫸欀灃灄灊灈灉灅灆爝爚爙獾甗癪矐礭礱礯籔籓糲纊纇纈纋纆纍罍羻耰臝蘘蘪蘦蘟蘣蘜蘙蘧蘮蘡蘠蘩蘞蘥"],
["f640","蠩蠝蠛蠠蠤蠜蠫衊襭襩襮襫觺譹譸譅譺譻贐贔趯躎躌轞轛轝酆酄酅醹鐿鐻鐶鐩鐽鐼鐰鐹鐪鐷鐬鑀鐱闥闤闣霵霺鞿韡顤飉飆飀饘饖騹騽驆驄驂驁騺"],
["f6a1","騿髍鬕鬗鬘鬖鬺魒鰫鰝鰜鰬鰣鰨鰩鰤鰡鶷鶶鶼鷁鷇鷊鷏鶾鷅鷃鶻鶵鷎鶹鶺鶬鷈鶱鶭鷌鶳鷍鶲鹺麜黫黮黭鼛鼘鼚鼱齎齥齤龒亹囆囅囋奱孋孌巕巑廲攡攠攦攢欋欈欉氍灕灖灗灒爞爟犩獿瓘瓕瓙瓗癭皭礵禴穰穱籗籜籙籛籚"],
["f740","糴糱纑罏羇臞艫蘴蘵蘳蘬蘲蘶蠬蠨蠦蠪蠥襱覿覾觻譾讄讂讆讅譿贕躕躔躚躒躐躖躗轠轢酇鑌鑐鑊鑋鑏鑇鑅鑈鑉鑆霿韣顪顩飋饔饛驎驓驔驌驏驈驊"],
["f7a1","驉驒驐髐鬙鬫鬻魖魕鱆鱈鰿鱄鰹鰳鱁鰼鰷鰴鰲鰽鰶鷛鷒鷞鷚鷋鷐鷜鷑鷟鷩鷙鷘鷖鷵鷕鷝麶黰鼵鼳鼲齂齫龕龢儽劙壨壧奲孍巘蠯彏戁戃戄攩攥斖曫欑欒欏毊灛灚爢玂玁玃癰矔籧籦纕艬蘺虀蘹蘼蘱蘻蘾蠰蠲蠮蠳襶襴襳觾"],
["f840","讌讎讋讈豅贙躘轤轣醼鑢鑕鑝鑗鑞韄韅頀驖驙鬞鬟鬠鱒鱘鱐鱊鱍鱋鱕鱙鱌鱎鷻鷷鷯鷣鷫鷸鷤鷶鷡鷮鷦鷲鷰鷢鷬鷴鷳鷨鷭黂黐黲黳鼆鼜鼸鼷鼶齃齏"],
["f8a1","齱齰齮齯囓囍孎屭攭曭曮欓灟灡灝灠爣瓛瓥矕礸禷禶籪纗羉艭虃蠸蠷蠵衋讔讕躞躟躠躝醾醽釂鑫鑨鑩雥靆靃靇韇韥驞髕魙鱣鱧鱦鱢鱞鱠鸂鷾鸇鸃鸆鸅鸀鸁鸉鷿鷽鸄麠鼞齆齴齵齶囔攮斸欘欙欗欚灢爦犪矘矙礹籩籫糶纚"],
["f940","纘纛纙臠臡虆虇虈襹襺襼襻觿讘讙躥躤躣鑮鑭鑯鑱鑳靉顲饟鱨鱮鱭鸋鸍鸐鸏鸒鸑麡黵鼉齇齸齻齺齹圞灦籯蠼趲躦釃鑴鑸鑶鑵驠鱴鱳鱱鱵鸔鸓黶鼊"],
["f9a1","龤灨灥糷虪蠾蠽蠿讞貜躩軉靋顳顴飌饡馫驤驦驧鬤鸕鸗齈戇欞爧虌躨钂钀钁驩驨鬮鸙爩虋讟钃鱹麷癵驫鱺鸝灩灪麤齾齉龘碁銹裏墻恒粧嫺╔╦╗╠╬╣╚╩╝╒╤╕╞╪╡╘╧╛╓╥╖╟╫╢╙╨╜║═╭╮╰╯▓"]
]
[
["0","\u0000",127],
["8ea1","｡",62],
["a1a1","　、。，．・：；？！゛゜´｀¨＾￣＿ヽヾゝゞ〃仝々〆〇ー―‐／＼～∥｜…‥‘’“”（）〔〕［］｛｝〈",9,"＋－±×÷＝≠＜＞≦≧∞∴♂♀°′″℃￥＄￠￡％＃＆＊＠§☆★○●◎◇"],
["a2a1","◆□■△▲▽▼※〒→←↑↓〓"],
["a2ba","∈∋⊆⊇⊂⊃∪∩"],
["a2ca","∧∨￢⇒⇔∀∃"],
["a2dc","∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬"],
["a2f2","Å‰♯♭♪†‡¶"],
["a2fe","◯"],
["a3b0","０",9],
["a3c1","Ａ",25],
["a3e1","ａ",25],
["a4a1","ぁ",82],
["a5a1","ァ",85],
["a6a1","Α",16,"Σ",6],
["a6c1","α",16,"σ",6],
["a7a1","А",5,"ЁЖ",25],
["a7d1","а",5,"ёж",25],
["a8a1","─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂"],
["ada1","①",19,"Ⅰ",9],
["adc0","㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡"],
["addf","㍻〝〟№㏍℡㊤",4,"㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪"],
["b0a1","亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭"],
["b1a1","院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応"],
["b2a1","押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改"],
["b3a1","魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱"],
["b4a1","粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄"],
["b5a1","機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京"],
["b6a1","供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈"],
["b7a1","掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲"],
["b8a1","検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向"],
["b9a1","后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込"],
["baa1","此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷"],
["bba1","察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時"],
["bca1","次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周"],
["bda1","宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償"],
["bea1","勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾"],
["bfa1","拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾"],
["c0a1","澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線"],
["c1a1","繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎"],
["c2a1","臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只"],
["c3a1","叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵"],
["c4a1","帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓"],
["c5a1","邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到"],
["c6a1","董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入"],
["c7a1","如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦"],
["c8a1","函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美"],
["c9a1","鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服"],
["caa1","福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋"],
["cba1","法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満"],
["cca1","漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒"],
["cda1","諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃"],
["cea1","痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯"],
["cfa1","蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕"],
["d0a1","弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲"],
["d1a1","僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨"],
["d2a1","辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨"],
["d3a1","咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉"],
["d4a1","圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩"],
["d5a1","奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓"],
["d6a1","屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏"],
["d7a1","廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚"],
["d8a1","悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛"],
["d9a1","戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼"],
["daa1","據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼"],
["dba1","曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍"],
["dca1","棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣"],
["dda1","檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾"],
["dea1","沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌"],
["dfa1","漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼"],
["e0a1","燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱"],
["e1a1","瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰"],
["e2a1","癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬"],
["e3a1","磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐"],
["e4a1","筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆"],
["e5a1","紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺"],
["e6a1","罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋"],
["e7a1","隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙"],
["e8a1","茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈"],
["e9a1","蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙"],
["eaa1","蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞"],
["eba1","襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫"],
["eca1","譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊"],
["eda1","蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸"],
["eea1","遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮"],
["efa1","錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞"],
["f0a1","陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰"],
["f1a1","顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷"],
["f2a1","髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈"],
["f3a1","鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠"],
["f4a1","堯槇遙瑤凜熙"],
["f9a1","纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德"],
["faa1","忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱"],
["fba1","犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚"],
["fca1","釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑"],
["fcf1","ⅰ",9,"￢￤＇＂"],
["8fa2af","˘ˇ¸˙˝¯˛˚～΄΅"],
["8fa2c2","¡¦¿"],
["8fa2eb","ºª©®™¤№"],
["8fa6e1","ΆΈΉΊΪ"],
["8fa6e7","Ό"],
["8fa6e9","ΎΫ"],
["8fa6ec","Ώ"],
["8fa6f1","άέήίϊΐόςύϋΰώ"],
["8fa7c2","Ђ",10,"ЎЏ"],
["8fa7f2","ђ",10,"ўџ"],
["8fa9a1","ÆĐ"],
["8fa9a4","Ħ"],
["8fa9a6","Ĳ"],
["8fa9a8","ŁĿ"],
["8fa9ab","ŊØŒ"],
["8fa9af","ŦÞ"],
["8fa9c1","æđðħıĳĸłŀŉŋøœßŧþ"],
["8faaa1","ÁÀÄÂĂǍĀĄÅÃĆĈČÇĊĎÉÈËÊĚĖĒĘ"],
["8faaba","ĜĞĢĠĤÍÌÏÎǏİĪĮĨĴĶĹĽĻŃŇŅÑÓÒÖÔǑŐŌÕŔŘŖŚŜŠŞŤŢÚÙÜÛŬǓŰŪŲŮŨǗǛǙǕŴÝŸŶŹŽŻ"],
["8faba1","áàäâăǎāąåãćĉčçċďéèëêěėēęǵĝğ"],
["8fabbd","ġĥíìïîǐ"],
["8fabc5","īįĩĵķĺľļńňņñóòöôǒőōõŕřŗśŝšşťţúùüûŭǔűūųůũǘǜǚǖŵýÿŷźžż"],
["8fb0a1","丂丄丅丌丒丟丣两丨丫丮丯丰丵乀乁乄乇乑乚乜乣乨乩乴乵乹乿亍亖亗亝亯亹仃仐仚仛仠仡仢仨仯仱仳仵份仾仿伀伂伃伈伋伌伒伕伖众伙伮伱你伳伵伷伹伻伾佀佂佈佉佋佌佒佔佖佘佟佣佪佬佮佱佷佸佹佺佽佾侁侂侄"],
["8fb1a1","侅侉侊侌侎侐侒侓侔侗侙侚侞侟侲侷侹侻侼侽侾俀俁俅俆俈俉俋俌俍俏俒俜俠俢俰俲俼俽俿倀倁倄倇倊倌倎倐倓倗倘倛倜倝倞倢倧倮倰倲倳倵偀偁偂偅偆偊偌偎偑偒偓偗偙偟偠偢偣偦偧偪偭偰偱倻傁傃傄傆傊傎傏傐"],
["8fb2a1","傒傓傔傖傛傜傞",4,"傪傯傰傹傺傽僀僃僄僇僌僎僐僓僔僘僜僝僟僢僤僦僨僩僯僱僶僺僾儃儆儇儈儋儌儍儎僲儐儗儙儛儜儝儞儣儧儨儬儭儯儱儳儴儵儸儹兂兊兏兓兕兗兘兟兤兦兾冃冄冋冎冘冝冡冣冭冸冺冼冾冿凂"],
["8fb3a1","凈减凑凒凓凕凘凞凢凥凮凲凳凴凷刁刂刅划刓刕刖刘刢刨刱刲刵刼剅剉剕剗剘剚剜剟剠剡剦剮剷剸剹劀劂劅劊劌劓劕劖劗劘劚劜劤劥劦劧劯劰劶劷劸劺劻劽勀勄勆勈勌勏勑勔勖勛勜勡勥勨勩勪勬勰勱勴勶勷匀匃匊匋"],
["8fb4a1","匌匑匓匘匛匜匞匟匥匧匨匩匫匬匭匰匲匵匼匽匾卂卌卋卙卛卡卣卥卬卭卲卹卾厃厇厈厎厓厔厙厝厡厤厪厫厯厲厴厵厷厸厺厽叀叅叏叒叓叕叚叝叞叠另叧叵吂吓吚吡吧吨吪启吱吴吵呃呄呇呍呏呞呢呤呦呧呩呫呭呮呴呿"],
["8fb5a1","咁咃咅咈咉咍咑咕咖咜咟咡咦咧咩咪咭咮咱咷咹咺咻咿哆哊响哎哠哪哬哯哶哼哾哿唀唁唅唈唉唌唍唎唕唪唫唲唵唶唻唼唽啁啇啉啊啍啐啑啘啚啛啞啠啡啤啦啿喁喂喆喈喎喏喑喒喓喔喗喣喤喭喲喿嗁嗃嗆嗉嗋嗌嗎嗑嗒"],
["8fb6a1","嗓嗗嗘嗛嗞嗢嗩嗶嗿嘅嘈嘊嘍",5,"嘙嘬嘰嘳嘵嘷嘹嘻嘼嘽嘿噀噁噃噄噆噉噋噍噏噔噞噠噡噢噣噦噩噭噯噱噲噵嚄嚅嚈嚋嚌嚕嚙嚚嚝嚞嚟嚦嚧嚨嚩嚫嚬嚭嚱嚳嚷嚾囅囉囊囋囏囐囌囍囙囜囝囟囡囤",4,"囱囫园"],
["8fb7a1","囶囷圁圂圇圊圌圑圕圚圛圝圠圢圣圤圥圩圪圬圮圯圳圴圽圾圿坅坆坌坍坒坢坥坧坨坫坭",4,"坳坴坵坷坹坺坻坼坾垁垃垌垔垗垙垚垜垝垞垟垡垕垧垨垩垬垸垽埇埈埌埏埕埝埞埤埦埧埩埭埰埵埶埸埽埾埿堃堄堈堉埡"],
["8fb8a1","堌堍堛堞堟堠堦堧堭堲堹堿塉塌塍塏塐塕塟塡塤塧塨塸塼塿墀墁墇墈墉墊墌墍墏墐墔墖墝墠墡墢墦墩墱墲壄墼壂壈壍壎壐壒壔壖壚壝壡壢壩壳夅夆夋夌夒夓夔虁夝夡夣夤夨夯夰夳夵夶夿奃奆奒奓奙奛奝奞奟奡奣奫奭"],
["8fb9a1","奯奲奵奶她奻奼妋妌妎妒妕妗妟妤妧妭妮妯妰妳妷妺妼姁姃姄姈姊姍姒姝姞姟姣姤姧姮姯姱姲姴姷娀娄娌娍娎娒娓娞娣娤娧娨娪娭娰婄婅婇婈婌婐婕婞婣婥婧婭婷婺婻婾媋媐媓媖媙媜媞媟媠媢媧媬媱媲媳媵媸媺媻媿"],
["8fbaa1","嫄嫆嫈嫏嫚嫜嫠嫥嫪嫮嫵嫶嫽嬀嬁嬈嬗嬴嬙嬛嬝嬡嬥嬭嬸孁孋孌孒孖孞孨孮孯孼孽孾孿宁宄宆宊宎宐宑宓宔宖宨宩宬宭宯宱宲宷宺宼寀寁寍寏寖",4,"寠寯寱寴寽尌尗尞尟尣尦尩尫尬尮尰尲尵尶屙屚屜屢屣屧屨屩"],
["8fbba1","屭屰屴屵屺屻屼屽岇岈岊岏岒岝岟岠岢岣岦岪岲岴岵岺峉峋峒峝峗峮峱峲峴崁崆崍崒崫崣崤崦崧崱崴崹崽崿嵂嵃嵆嵈嵕嵑嵙嵊嵟嵠嵡嵢嵤嵪嵭嵰嵹嵺嵾嵿嶁嶃嶈嶊嶒嶓嶔嶕嶙嶛嶟嶠嶧嶫嶰嶴嶸嶹巃巇巋巐巎巘巙巠巤"],
["8fbca1","巩巸巹帀帇帍帒帔帕帘帟帠帮帨帲帵帾幋幐幉幑幖幘幛幜幞幨幪",4,"幰庀庋庎庢庤庥庨庪庬庱庳庽庾庿廆廌廋廎廑廒廔廕廜廞廥廫异弆弇弈弎弙弜弝弡弢弣弤弨弫弬弮弰弴弶弻弽弿彀彄彅彇彍彐彔彘彛彠彣彤彧"],
["8fbda1","彯彲彴彵彸彺彽彾徉徍徏徖徜徝徢徧徫徤徬徯徰徱徸忄忇忈忉忋忐",4,"忞忡忢忨忩忪忬忭忮忯忲忳忶忺忼怇怊怍怓怔怗怘怚怟怤怭怳怵恀恇恈恉恌恑恔恖恗恝恡恧恱恾恿悂悆悈悊悎悑悓悕悘悝悞悢悤悥您悰悱悷"],
["8fbea1","悻悾惂惄惈惉惊惋惎惏惔惕惙惛惝惞惢惥惲惵惸惼惽愂愇愊愌愐",4,"愖愗愙愜愞愢愪愫愰愱愵愶愷愹慁慅慆慉慞慠慬慲慸慻慼慿憀憁憃憄憋憍憒憓憗憘憜憝憟憠憥憨憪憭憸憹憼懀懁懂懎懏懕懜懝懞懟懡懢懧懩懥"],
["8fbfa1","懬懭懯戁戃戄戇戓戕戜戠戢戣戧戩戫戹戽扂扃扄扆扌扐扑扒扔扖扚扜扤扭扯扳扺扽抍抎抏抐抦抨抳抶抷抺抾抿拄拎拕拖拚拪拲拴拼拽挃挄挊挋挍挐挓挖挘挩挪挭挵挶挹挼捁捂捃捄捆捊捋捎捒捓捔捘捛捥捦捬捭捱捴捵"],
["8fc0a1","捸捼捽捿掂掄掇掊掐掔掕掙掚掞掤掦掭掮掯掽揁揅揈揎揑揓揔揕揜揠揥揪揬揲揳揵揸揹搉搊搐搒搔搘搞搠搢搤搥搩搪搯搰搵搽搿摋摏摑摒摓摔摚摛摜摝摟摠摡摣摭摳摴摻摽撅撇撏撐撑撘撙撛撝撟撡撣撦撨撬撳撽撾撿"],
["8fc1a1","擄擉擊擋擌擎擐擑擕擗擤擥擩擪擭擰擵擷擻擿攁攄攈攉攊攏攓攔攖攙攛攞攟攢攦攩攮攱攺攼攽敃敇敉敐敒敔敟敠敧敫敺敽斁斅斊斒斕斘斝斠斣斦斮斲斳斴斿旂旈旉旎旐旔旖旘旟旰旲旴旵旹旾旿昀昄昈昉昍昑昒昕昖昝"],
["8fc2a1","昞昡昢昣昤昦昩昪昫昬昮昰昱昳昹昷晀晅晆晊晌晑晎晗晘晙晛晜晠晡曻晪晫晬晾晳晵晿晷晸晹晻暀晼暋暌暍暐暒暙暚暛暜暟暠暤暭暱暲暵暻暿曀曂曃曈曌曎曏曔曛曟曨曫曬曮曺朅朇朎朓朙朜朠朢朳朾杅杇杈杌杔杕杝"],
["8fc3a1","杦杬杮杴杶杻极构枎枏枑枓枖枘枙枛枰枱枲枵枻枼枽柹柀柂柃柅柈柉柒柗柙柜柡柦柰柲柶柷桒栔栙栝栟栨栧栬栭栯栰栱栳栻栿桄桅桊桌桕桗桘桛桫桮",4,"桵桹桺桻桼梂梄梆梈梖梘梚梜梡梣梥梩梪梮梲梻棅棈棌棏"],
["8fc4a1","棐棑棓棖棙棜棝棥棨棪棫棬棭棰棱棵棶棻棼棽椆椉椊椐椑椓椖椗椱椳椵椸椻楂楅楉楎楗楛楣楤楥楦楨楩楬楰楱楲楺楻楿榀榍榒榖榘榡榥榦榨榫榭榯榷榸榺榼槅槈槑槖槗槢槥槮槯槱槳槵槾樀樁樃樏樑樕樚樝樠樤樨樰樲"],
["8fc5a1","樴樷樻樾樿橅橆橉橊橎橐橑橒橕橖橛橤橧橪橱橳橾檁檃檆檇檉檋檑檛檝檞檟檥檫檯檰檱檴檽檾檿櫆櫉櫈櫌櫐櫔櫕櫖櫜櫝櫤櫧櫬櫰櫱櫲櫼櫽欂欃欆欇欉欏欐欑欗欛欞欤欨欫欬欯欵欶欻欿歆歊歍歒歖歘歝歠歧歫歮歰歵歽"],
["8fc6a1","歾殂殅殗殛殟殠殢殣殨殩殬殭殮殰殸殹殽殾毃毄毉毌毖毚毡毣毦毧毮毱毷毹毿氂氄氅氉氍氎氐氒氙氟氦氧氨氬氮氳氵氶氺氻氿汊汋汍汏汒汔汙汛汜汫汭汯汴汶汸汹汻沅沆沇沉沔沕沗沘沜沟沰沲沴泂泆泍泏泐泑泒泔泖"],
["8fc7a1","泚泜泠泧泩泫泬泮泲泴洄洇洊洎洏洑洓洚洦洧洨汧洮洯洱洹洼洿浗浞浟浡浥浧浯浰浼涂涇涑涒涔涖涗涘涪涬涴涷涹涽涿淄淈淊淎淏淖淛淝淟淠淢淥淩淯淰淴淶淼渀渄渞渢渧渲渶渹渻渼湄湅湈湉湋湏湑湒湓湔湗湜湝湞"],
["8fc8a1","湢湣湨湳湻湽溍溓溙溠溧溭溮溱溳溻溿滀滁滃滇滈滊滍滎滏滫滭滮滹滻滽漄漈漊漌漍漖漘漚漛漦漩漪漯漰漳漶漻漼漭潏潑潒潓潗潙潚潝潞潡潢潨潬潽潾澃澇澈澋澌澍澐澒澓澔澖澚澟澠澥澦澧澨澮澯澰澵澶澼濅濇濈濊"],
["8fc9a1","濚濞濨濩濰濵濹濼濽瀀瀅瀆瀇瀍瀗瀠瀣瀯瀴瀷瀹瀼灃灄灈灉灊灋灔灕灝灞灎灤灥灬灮灵灶灾炁炅炆炔",4,"炛炤炫炰炱炴炷烊烑烓烔烕烖烘烜烤烺焃",4,"焋焌焏焞焠焫焭焯焰焱焸煁煅煆煇煊煋煐煒煗煚煜煞煠"],
["8fcaa1","煨煹熀熅熇熌熒熚熛熠熢熯熰熲熳熺熿燀燁燄燋燌燓燖燙燚燜燸燾爀爇爈爉爓爗爚爝爟爤爫爯爴爸爹牁牂牃牅牎牏牐牓牕牖牚牜牞牠牣牨牫牮牯牱牷牸牻牼牿犄犉犍犎犓犛犨犭犮犱犴犾狁狇狉狌狕狖狘狟狥狳狴狺狻"],
["8fcba1","狾猂猄猅猇猋猍猒猓猘猙猞猢猤猧猨猬猱猲猵猺猻猽獃獍獐獒獖獘獝獞獟獠獦獧獩獫獬獮獯獱獷獹獼玀玁玃玅玆玎玐玓玕玗玘玜玞玟玠玢玥玦玪玫玭玵玷玹玼玽玿珅珆珉珋珌珏珒珓珖珙珝珡珣珦珧珩珴珵珷珹珺珻珽"],
["8fcca1","珿琀琁琄琇琊琑琚琛琤琦琨",9,"琹瑀瑃瑄瑆瑇瑋瑍瑑瑒瑗瑝瑢瑦瑧瑨瑫瑭瑮瑱瑲璀璁璅璆璇璉璏璐璑璒璘璙璚璜璟璠璡璣璦璨璩璪璫璮璯璱璲璵璹璻璿瓈瓉瓌瓐瓓瓘瓚瓛瓞瓟瓤瓨瓪瓫瓯瓴瓺瓻瓼瓿甆"],
["8fcda1","甒甖甗甠甡甤甧甩甪甯甶甹甽甾甿畀畃畇畈畎畐畒畗畞畟畡畯畱畹",5,"疁疅疐疒疓疕疙疜疢疤疴疺疿痀痁痄痆痌痎痏痗痜痟痠痡痤痧痬痮痯痱痹瘀瘂瘃瘄瘇瘈瘊瘌瘏瘒瘓瘕瘖瘙瘛瘜瘝瘞瘣瘥瘦瘩瘭瘲瘳瘵瘸瘹"],
["8fcea1","瘺瘼癊癀癁癃癄癅癉癋癕癙癟癤癥癭癮癯癱癴皁皅皌皍皕皛皜皝皟皠皢",6,"皪皭皽盁盅盉盋盌盎盔盙盠盦盨盬盰盱盶盹盼眀眆眊眎眒眔眕眗眙眚眜眢眨眭眮眯眴眵眶眹眽眾睂睅睆睊睍睎睏睒睖睗睜睞睟睠睢"],
["8fcfa1","睤睧睪睬睰睲睳睴睺睽瞀瞄瞌瞍瞔瞕瞖瞚瞟瞢瞧瞪瞮瞯瞱瞵瞾矃矉矑矒矕矙矞矟矠矤矦矪矬矰矱矴矸矻砅砆砉砍砎砑砝砡砢砣砭砮砰砵砷硃硄硇硈硌硎硒硜硞硠硡硣硤硨硪确硺硾碊碏碔碘碡碝碞碟碤碨碬碭碰碱碲碳"],
["8fd0a1","碻碽碿磇磈磉磌磎磒磓磕磖磤磛磟磠磡磦磪磲磳礀磶磷磺磻磿礆礌礐礚礜礞礟礠礥礧礩礭礱礴礵礻礽礿祄祅祆祊祋祏祑祔祘祛祜祧祩祫祲祹祻祼祾禋禌禑禓禔禕禖禘禛禜禡禨禩禫禯禱禴禸离秂秄秇秈秊秏秔秖秚秝秞"],
["8fd1a1","秠秢秥秪秫秭秱秸秼稂稃稇稉稊稌稑稕稛稞稡稧稫稭稯稰稴稵稸稹稺穄穅穇穈穌穕穖穙穜穝穟穠穥穧穪穭穵穸穾窀窂窅窆窊窋窐窑窔窞窠窣窬窳窵窹窻窼竆竉竌竎竑竛竨竩竫竬竱竴竻竽竾笇笔笟笣笧笩笪笫笭笮笯笰"],
["8fd2a1","笱笴笽笿筀筁筇筎筕筠筤筦筩筪筭筯筲筳筷箄箉箎箐箑箖箛箞箠箥箬箯箰箲箵箶箺箻箼箽篂篅篈篊篔篖篗篙篚篛篨篪篲篴篵篸篹篺篼篾簁簂簃簄簆簉簋簌簎簏簙簛簠簥簦簨簬簱簳簴簶簹簺籆籊籕籑籒籓籙",5],
["8fd3a1","籡籣籧籩籭籮籰籲籹籼籽粆粇粏粔粞粠粦粰粶粷粺粻粼粿糄糇糈糉糍糏糓糔糕糗糙糚糝糦糩糫糵紃紇紈紉紏紑紒紓紖紝紞紣紦紪紭紱紼紽紾絀絁絇絈絍絑絓絗絙絚絜絝絥絧絪絰絸絺絻絿綁綂綃綅綆綈綋綌綍綑綖綗綝"],
["8fd4a1","綞綦綧綪綳綶綷綹緂",4,"緌緍緎緗緙縀緢緥緦緪緫緭緱緵緶緹緺縈縐縑縕縗縜縝縠縧縨縬縭縯縳縶縿繄繅繇繎繐繒繘繟繡繢繥繫繮繯繳繸繾纁纆纇纊纍纑纕纘纚纝纞缼缻缽缾缿罃罄罇罏罒罓罛罜罝罡罣罤罥罦罭"],
["8fd5a1","罱罽罾罿羀羋羍羏羐羑羖羗羜羡羢羦羪羭羴羼羿翀翃翈翎翏翛翟翣翥翨翬翮翯翲翺翽翾翿耇耈耊耍耎耏耑耓耔耖耝耞耟耠耤耦耬耮耰耴耵耷耹耺耼耾聀聄聠聤聦聭聱聵肁肈肎肜肞肦肧肫肸肹胈胍胏胒胔胕胗胘胠胭胮"],
["8fd6a1","胰胲胳胶胹胺胾脃脋脖脗脘脜脞脠脤脧脬脰脵脺脼腅腇腊腌腒腗腠腡腧腨腩腭腯腷膁膐膄膅膆膋膎膖膘膛膞膢膮膲膴膻臋臃臅臊臎臏臕臗臛臝臞臡臤臫臬臰臱臲臵臶臸臹臽臿舀舃舏舓舔舙舚舝舡舢舨舲舴舺艃艄艅艆"],
["8fd7a1","艋艎艏艑艖艜艠艣艧艭艴艻艽艿芀芁芃芄芇芉芊芎芑芔芖芘芚芛芠芡芣芤芧芨芩芪芮芰芲芴芷芺芼芾芿苆苐苕苚苠苢苤苨苪苭苯苶苷苽苾茀茁茇茈茊茋荔茛茝茞茟茡茢茬茭茮茰茳茷茺茼茽荂荃荄荇荍荎荑荕荖荗荰荸"],
["8fd8a1","荽荿莀莂莄莆莍莒莔莕莘莙莛莜莝莦莧莩莬莾莿菀菇菉菏菐菑菔菝荓菨菪菶菸菹菼萁萆萊萏萑萕萙莭萯萹葅葇葈葊葍葏葑葒葖葘葙葚葜葠葤葥葧葪葰葳葴葶葸葼葽蒁蒅蒒蒓蒕蒞蒦蒨蒩蒪蒯蒱蒴蒺蒽蒾蓀蓂蓇蓈蓌蓏蓓"],
["8fd9a1","蓜蓧蓪蓯蓰蓱蓲蓷蔲蓺蓻蓽蔂蔃蔇蔌蔎蔐蔜蔞蔢蔣蔤蔥蔧蔪蔫蔯蔳蔴蔶蔿蕆蕏",4,"蕖蕙蕜",6,"蕤蕫蕯蕹蕺蕻蕽蕿薁薅薆薉薋薌薏薓薘薝薟薠薢薥薧薴薶薷薸薼薽薾薿藂藇藊藋藎薭藘藚藟藠藦藨藭藳藶藼"],
["8fdaa1","藿蘀蘄蘅蘍蘎蘐蘑蘒蘘蘙蘛蘞蘡蘧蘩蘶蘸蘺蘼蘽虀虂虆虒虓虖虗虘虙虝虠",4,"虩虬虯虵虶虷虺蚍蚑蚖蚘蚚蚜蚡蚦蚧蚨蚭蚱蚳蚴蚵蚷蚸蚹蚿蛀蛁蛃蛅蛑蛒蛕蛗蛚蛜蛠蛣蛥蛧蚈蛺蛼蛽蜄蜅蜇蜋蜎蜏蜐蜓蜔蜙蜞蜟蜡蜣"],
["8fdba1","蜨蜮蜯蜱蜲蜹蜺蜼蜽蜾蝀蝃蝅蝍蝘蝝蝡蝤蝥蝯蝱蝲蝻螃",6,"螋螌螐螓螕螗螘螙螞螠螣螧螬螭螮螱螵螾螿蟁蟈蟉蟊蟎蟕蟖蟙蟚蟜蟟蟢蟣蟤蟪蟫蟭蟱蟳蟸蟺蟿蠁蠃蠆蠉蠊蠋蠐蠙蠒蠓蠔蠘蠚蠛蠜蠞蠟蠨蠭蠮蠰蠲蠵"],
["8fdca1","蠺蠼衁衃衅衈衉衊衋衎衑衕衖衘衚衜衟衠衤衩衱衹衻袀袘袚袛袜袟袠袨袪袺袽袾裀裊",4,"裑裒裓裛裞裧裯裰裱裵裷褁褆褍褎褏褕褖褘褙褚褜褠褦褧褨褰褱褲褵褹褺褾襀襂襅襆襉襏襒襗襚襛襜襡襢襣襫襮襰襳襵襺"],
["8fdda1","襻襼襽覉覍覐覔覕覛覜覟覠覥覰覴覵覶覷覼觔",4,"觥觩觫觭觱觳觶觹觽觿訄訅訇訏訑訒訔訕訞訠訢訤訦訫訬訯訵訷訽訾詀詃詅詇詉詍詎詓詖詗詘詜詝詡詥詧詵詶詷詹詺詻詾詿誀誃誆誋誏誐誒誖誗誙誟誧誩誮誯誳"],
["8fdea1","誶誷誻誾諃諆諈諉諊諑諓諔諕諗諝諟諬諰諴諵諶諼諿謅謆謋謑謜謞謟謊謭謰謷謼譂",4,"譈譒譓譔譙譍譞譣譭譶譸譹譼譾讁讄讅讋讍讏讔讕讜讞讟谸谹谽谾豅豇豉豋豏豑豓豔豗豘豛豝豙豣豤豦豨豩豭豳豵豶豻豾貆"],
["8fdfa1","貇貋貐貒貓貙貛貜貤貹貺賅賆賉賋賏賖賕賙賝賡賨賬賯賰賲賵賷賸賾賿贁贃贉贒贗贛赥赩赬赮赿趂趄趈趍趐趑趕趞趟趠趦趫趬趯趲趵趷趹趻跀跅跆跇跈跊跎跑跔跕跗跙跤跥跧跬跰趼跱跲跴跽踁踄踅踆踋踑踔踖踠踡踢"],
["8fe0a1","踣踦踧踱踳踶踷踸踹踽蹀蹁蹋蹍蹎蹏蹔蹛蹜蹝蹞蹡蹢蹩蹬蹭蹯蹰蹱蹹蹺蹻躂躃躉躐躒躕躚躛躝躞躢躧躩躭躮躳躵躺躻軀軁軃軄軇軏軑軔軜軨軮軰軱軷軹軺軭輀輂輇輈輏輐輖輗輘輞輠輡輣輥輧輨輬輭輮輴輵輶輷輺轀轁"],
["8fe1a1","轃轇轏轑",4,"轘轝轞轥辝辠辡辤辥辦辵辶辸达迀迁迆迊迋迍运迒迓迕迠迣迤迨迮迱迵迶迻迾适逄逈逌逘逛逨逩逯逪逬逭逳逴逷逿遃遄遌遛遝遢遦遧遬遰遴遹邅邈邋邌邎邐邕邗邘邙邛邠邡邢邥邰邲邳邴邶邽郌邾郃"],
["8fe2a1","郄郅郇郈郕郗郘郙郜郝郟郥郒郶郫郯郰郴郾郿鄀鄄鄅鄆鄈鄍鄐鄔鄖鄗鄘鄚鄜鄞鄠鄥鄢鄣鄧鄩鄮鄯鄱鄴鄶鄷鄹鄺鄼鄽酃酇酈酏酓酗酙酚酛酡酤酧酭酴酹酺酻醁醃醅醆醊醎醑醓醔醕醘醞醡醦醨醬醭醮醰醱醲醳醶醻醼醽醿"],
["8fe3a1","釂釃釅釓釔釗釙釚釞釤釥釩釪釬",5,"釷釹釻釽鈀鈁鈄鈅鈆鈇鈉鈊鈌鈐鈒鈓鈖鈘鈜鈝鈣鈤鈥鈦鈨鈮鈯鈰鈳鈵鈶鈸鈹鈺鈼鈾鉀鉂鉃鉆鉇鉊鉍鉎鉏鉑鉘鉙鉜鉝鉠鉡鉥鉧鉨鉩鉮鉯鉰鉵",4,"鉻鉼鉽鉿銈銉銊銍銎銒銗"],
["8fe4a1","銙銟銠銤銥銧銨銫銯銲銶銸銺銻銼銽銿",4,"鋅鋆鋇鋈鋋鋌鋍鋎鋐鋓鋕鋗鋘鋙鋜鋝鋟鋠鋡鋣鋥鋧鋨鋬鋮鋰鋹鋻鋿錀錂錈錍錑錔錕錜錝錞錟錡錤錥錧錩錪錳錴錶錷鍇鍈鍉鍐鍑鍒鍕鍗鍘鍚鍞鍤鍥鍧鍩鍪鍭鍯鍰鍱鍳鍴鍶"],
["8fe5a1","鍺鍽鍿鎀鎁鎂鎈鎊鎋鎍鎏鎒鎕鎘鎛鎞鎡鎣鎤鎦鎨鎫鎴鎵鎶鎺鎩鏁鏄鏅鏆鏇鏉",4,"鏓鏙鏜鏞鏟鏢鏦鏧鏹鏷鏸鏺鏻鏽鐁鐂鐄鐈鐉鐍鐎鐏鐕鐖鐗鐟鐮鐯鐱鐲鐳鐴鐻鐿鐽鑃鑅鑈鑊鑌鑕鑙鑜鑟鑡鑣鑨鑫鑭鑮鑯鑱鑲钄钃镸镹"],
["8fe6a1","镾閄閈閌閍閎閝閞閟閡閦閩閫閬閴閶閺閽閿闆闈闉闋闐闑闒闓闙闚闝闞闟闠闤闦阝阞阢阤阥阦阬阱阳阷阸阹阺阼阽陁陒陔陖陗陘陡陮陴陻陼陾陿隁隂隃隄隉隑隖隚隝隟隤隥隦隩隮隯隳隺雊雒嶲雘雚雝雞雟雩雯雱雺霂"],
["8fe7a1","霃霅霉霚霛霝霡霢霣霨霱霳靁靃靊靎靏靕靗靘靚靛靣靧靪靮靳靶靷靸靻靽靿鞀鞉鞕鞖鞗鞙鞚鞞鞟鞢鞬鞮鞱鞲鞵鞶鞸鞹鞺鞼鞾鞿韁韄韅韇韉韊韌韍韎韐韑韔韗韘韙韝韞韠韛韡韤韯韱韴韷韸韺頇頊頙頍頎頔頖頜頞頠頣頦"],
["8fe8a1","頫頮頯頰頲頳頵頥頾顄顇顊顑顒顓顖顗顙顚顢顣顥顦顪顬颫颭颮颰颴颷颸颺颻颿飂飅飈飌飡飣飥飦飧飪飳飶餂餇餈餑餕餖餗餚餛餜餟餢餦餧餫餱",4,"餹餺餻餼饀饁饆饇饈饍饎饔饘饙饛饜饞饟饠馛馝馟馦馰馱馲馵"],
["8fe9a1","馹馺馽馿駃駉駓駔駙駚駜駞駧駪駫駬駰駴駵駹駽駾騂騃騄騋騌騐騑騖騞騠騢騣騤騧騭騮騳騵騶騸驇驁驄驊驋驌驎驑驔驖驝骪骬骮骯骲骴骵骶骹骻骾骿髁髃髆髈髎髐髒髕髖髗髛髜髠髤髥髧髩髬髲髳髵髹髺髽髿",4],
["8feaa1","鬄鬅鬈鬉鬋鬌鬍鬎鬐鬒鬖鬙鬛鬜鬠鬦鬫鬭鬳鬴鬵鬷鬹鬺鬽魈魋魌魕魖魗魛魞魡魣魥魦魨魪",4,"魳魵魷魸魹魿鮀鮄鮅鮆鮇鮉鮊鮋鮍鮏鮐鮔鮚鮝鮞鮦鮧鮩鮬鮰鮱鮲鮷鮸鮻鮼鮾鮿鯁鯇鯈鯎鯐鯗鯘鯝鯟鯥鯧鯪鯫鯯鯳鯷鯸"],
["8feba1","鯹鯺鯽鯿鰀鰂鰋鰏鰑鰖鰘鰙鰚鰜鰞鰢鰣鰦",4,"鰱鰵鰶鰷鰽鱁鱃鱄鱅鱉鱊鱎鱏鱐鱓鱔鱖鱘鱛鱝鱞鱟鱣鱩鱪鱜鱫鱨鱮鱰鱲鱵鱷鱻鳦鳲鳷鳹鴋鴂鴑鴗鴘鴜鴝鴞鴯鴰鴲鴳鴴鴺鴼鵅鴽鵂鵃鵇鵊鵓鵔鵟鵣鵢鵥鵩鵪鵫鵰鵶鵷鵻"],
["8feca1","鵼鵾鶃鶄鶆鶊鶍鶎鶒鶓鶕鶖鶗鶘鶡鶪鶬鶮鶱鶵鶹鶼鶿鷃鷇鷉鷊鷔鷕鷖鷗鷚鷞鷟鷠鷥鷧鷩鷫鷮鷰鷳鷴鷾鸊鸂鸇鸎鸐鸑鸒鸕鸖鸙鸜鸝鹺鹻鹼麀麂麃麄麅麇麎麏麖麘麛麞麤麨麬麮麯麰麳麴麵黆黈黋黕黟黤黧黬黭黮黰黱黲黵"],
["8feda1","黸黿鼂鼃鼉鼏鼐鼑鼒鼔鼖鼗鼙鼚鼛鼟鼢鼦鼪鼫鼯鼱鼲鼴鼷鼹鼺鼼鼽鼿齁齃",4,"齓齕齖齗齘齚齝齞齨齩齭",4,"齳齵齺齽龏龐龑龒龔龖龗龞龡龢龣龥"]
]
{"uChars":[128,165,169,178,184,216,226,235,238,244,248,251,253,258,276,284,300,325,329,334,364,463,465,467,469,471,473,475,477,506,594,610,712,716,730,930,938,962,970,1026,1104,1106,8209,8215,8218,8222,8231,8241,8244,8246,8252,8365,8452,8454,8458,8471,8482,8556,8570,8596,8602,8713,8720,8722,8726,8731,8737,8740,8742,8748,8751,8760,8766,8777,8781,8787,8802,8808,8816,8854,8858,8870,8896,8979,9322,9372,9548,9588,9616,9622,9634,9652,9662,9672,9676,9680,9702,9735,9738,9793,9795,11906,11909,11913,11917,11928,11944,11947,11951,11956,11960,11964,11979,12284,12292,12312,12319,12330,12351,12436,12447,12535,12543,12586,12842,12850,12964,13200,13215,13218,13253,13263,13267,13270,13384,13428,13727,13839,13851,14617,14703,14801,14816,14964,15183,15471,15585,16471,16736,17208,17325,17330,17374,17623,17997,18018,18212,18218,18301,18318,18760,18811,18814,18820,18823,18844,18848,18872,19576,19620,19738,19887,40870,59244,59336,59367,59413,59417,59423,59431,59437,59443,59452,59460,59478,59493,63789,63866,63894,63976,63986,64016,64018,64021,64025,64034,64037,64042,65074,65093,65107,65112,65127,65132,65375,65510,65536],"gbChars":[0,36,38,45,50,81,89,95,96,100,103,104,105,109,126,133,148,172,175,179,208,306,307,308,309,310,311,312,313,341,428,443,544,545,558,741,742,749,750,805,819,820,7922,7924,7925,7927,7934,7943,7944,7945,7950,8062,8148,8149,8152,8164,8174,8236,8240,8262,8264,8374,8380,8381,8384,8388,8390,8392,8393,8394,8396,8401,8406,8416,8419,8424,8437,8439,8445,8482,8485,8496,8521,8603,8936,8946,9046,9050,9063,9066,9076,9092,9100,9108,9111,9113,9131,9162,9164,9218,9219,11329,11331,11334,11336,11346,11361,11363,11366,11370,11372,11375,11389,11682,11686,11687,11692,11694,11714,11716,11723,11725,11730,11736,11982,11989,12102,12336,12348,12350,12384,12393,12395,12397,12510,12553,12851,12962,12973,13738,13823,13919,13933,14080,14298,14585,14698,15583,15847,16318,16434,16438,16481,16729,17102,17122,17315,17320,17402,17418,17859,17909,17911,17915,17916,17936,17939,17961,18664,18703,18814,18962,19043,33469,33470,33471,33484,33485,33490,33497,33501,33505,33513,33520,33536,33550,37845,37921,37948,38029,38038,38064,38065,38066,38069,38075,38076,38078,39108,39109,39113,39114,39115,39116,39265,39394,189000]}[
["a140","",62],
["a180","",32],
["a240","",62],
["a280","",32],
["a2ab","",5],
["a2e3","€"],
["a2ef",""],
["a2fd",""],
["a340","",62],
["a380","",31,"　"],
["a440","",62],
["a480","",32],
["a4f4","",10],
["a540","",62],
["a580","",32],
["a5f7","",7],
["a640","",62],
["a680","",32],
["a6b9","",7],
["a6d9","",6],
["a6ec",""],
["a6f3",""],
["a6f6","",8],
["a740","",62],
["a780","",32],
["a7c2","",14],
["a7f2","",12],
["a896","",10],
["a8bc",""],
["a8bf","ǹ"],
["a8c1",""],
["a8ea","",20],
["a958",""],
["a95b",""],
["a95d",""],
["a989","〾⿰",11],
["a997","",12],
["a9f0","",14],
["aaa1","",93],
["aba1","",93],
["aca1","",93],
["ada1","",93],
["aea1","",93],
["afa1","",93],
["d7fa","",4],
["f8a1","",93],
["f9a1","",93],
["faa1","",93],
["fba1","",93],
["fca1","",93],
["fda1","",93],
["fe50","⺁⺄㑳㑇⺈⺋㖞㘚㘎⺌⺗㥮㤘㧏㧟㩳㧐㭎㱮㳠⺧⺪䁖䅟⺮䌷⺳⺶⺷䎱䎬⺻䏝䓖䙡䙌"],
["fe80","䜣䜩䝼䞍⻊䥇䥺䥽䦂䦃䦅䦆䦟䦛䦷䦶䲣䲟䲠䲡䱷䲢䴓",6,"䶮",93]
]
[
["0","\u0000",128],
["a1","｡",62],
["8140","　、。，．・：；？！゛゜´｀¨＾￣＿ヽヾゝゞ〃仝々〆〇ー―‐／＼～∥｜…‥‘’“”（）〔〕［］｛｝〈",9,"＋－±×"],
["8180","÷＝≠＜＞≦≧∞∴♂♀°′″℃￥＄￠￡％＃＆＊＠§☆★○●◎◇◆□■△▲▽▼※〒→←↑↓〓"],
["81b8","∈∋⊆⊇⊂⊃∪∩"],
["81c8","∧∨￢⇒⇔∀∃"],
["81da","∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬"],
["81f0","Å‰♯♭♪†‡¶"],
["81fc","◯"],
["824f","０",9],
["8260","Ａ",25],
["8281","ａ",25],
["829f","ぁ",82],
["8340","ァ",62],
["8380","ム",22],
["839f","Α",16,"Σ",6],
["83bf","α",16,"σ",6],
["8440","А",5,"ЁЖ",25],
["8470","а",5,"ёж",7],
["8480","о",17],
["849f","─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂"],
["8740","①",19,"Ⅰ",9],
["875f","㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡"],
["877e","㍻"],
["8780","〝〟№㏍℡㊤",4,"㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪"],
["889f","亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭"],
["8940","院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円"],
["8980","園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改"],
["8a40","魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫"],
["8a80","橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄"],
["8b40","機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救"],
["8b80","朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈"],
["8c40","掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨"],
["8c80","劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向"],
["8d40","后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降"],
["8d80","項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷"],
["8e40","察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止"],
["8e80","死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周"],
["8f40","宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳"],
["8f80","準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾"],
["9040","拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨"],
["9080","逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線"],
["9140","繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻"],
["9180","操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只"],
["9240","叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄"],
["9280","逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓"],
["9340","邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬"],
["9380","凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入"],
["9440","如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅"],
["9480","楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美"],
["9540","鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷"],
["9580","斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋"],
["9640","法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆"],
["9680","摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒"],
["9740","諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲"],
["9780","沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯"],
["9840","蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕"],
["989f","弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲"],
["9940","僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭"],
["9980","凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨"],
["9a40","咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸"],
["9a80","噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩"],
["9b40","奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀"],
["9b80","它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏"],
["9c40","廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠"],
["9c80","怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛"],
["9d40","戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫"],
["9d80","捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼"],
["9e40","曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎"],
["9e80","梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣"],
["9f40","檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯"],
["9f80","麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌"],
["e040","漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝"],
["e080","烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱"],
["e140","瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿"],
["e180","痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬"],
["e240","磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰"],
["e280","窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆"],
["e340","紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷"],
["e380","縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋"],
["e440","隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤"],
["e480","艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈"],
["e540","蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬"],
["e580","蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞"],
["e640","襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧"],
["e680","諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊"],
["e740","蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜"],
["e780","轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮"],
["e840","錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙"],
["e880","閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰"],
["e940","顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃"],
["e980","騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈"],
["ea40","鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯"],
["ea80","黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠堯槇遙瑤凜熙"],
["ed40","纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏"],
["ed80","塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱"],
["ee40","犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙"],
["ee80","蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑"],
["eeef","ⅰ",9,"￢￤＇＂"],
["f040","",62],
["f080","",124],
["f140","",62],
["f180","",124],
["f240","",62],
["f280","",124],
["f340","",62],
["f380","",124],
["f440","",62],
["f480","",124],
["f540","",62],
["f580","",124],
["f640","",62],
["f680","",124],
["f740","",62],
["f780","",124],
["f840","",62],
["f880","",124],
["f940",""],
["fa40","ⅰ",9,"Ⅰ",9,"￢￤＇＂㈱№℡∵纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊"],
["fa80","兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯"],
["fb40","涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神"],
["fb80","祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙"],
["fc40","髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑"]
]
'use strict';
var singleComment = 1;
var multiComment = 2;

function stripWithoutWhitespace() {
	return '';
}

function stripWithWhitespace(str, start, end) {
	return str.slice(start, end).replace(/\S/g, ' ');
}

module.exports = function (str, opts) {
	opts = opts || {};

	var currentChar;
	var nextChar;
	var insideString = false;
	var insideComment = false;
	var offset = 0;
	var ret = '';
	var strip = opts.whitespace === false ? stripWithoutWhitespace : stripWithWhitespace;

	for (var i = 0; i < str.length; i++) {
		currentChar = str[i];
		nextChar = str[i + 1];

		if (!insideComment && currentChar === '"') {
			var escaped = str[i - 1] === '\\' && str[i - 2] !== '\\';
			if (!escaped) {
				insideString = !insideString;
			}
		}

		if (insideString) {
			continue;
		}

		if (!insideComment && currentChar + nextChar === '//') {
			ret += str.slice(offset, i);
			offset = i;
			insideComment = singleComment;
			i++;
		} else if (insideComment === singleComment && currentChar + nextChar === '\r\n') {
			i++;
			insideComment = false;
			ret += strip(str, offset, i);
			offset = i;
			continue;
		} else if (insideComment === singleComment && currentChar === '\n') {
			insideComment = false;
			ret += strip(str, offset, i);
			offset = i;
		} else if (!insideComment && currentChar + nextChar === '/*') {
			ret += str.slice(offset, i);
			offset = i;
			insideComment = multiComment;
			i++;
			continue;
		} else if (insideComment === multiComment && currentChar + nextChar === '*/') {
			i++;
			insideComment = false;
			ret += strip(str, offset, i + 1);
			offset = i + 1;
			continue;
		}
	}

	return ret + (insideComment ? strip(str.substr(offset)) : str.substr(offset));
};
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": "strip-json-comments",
  "version": "2.0.1",
  "description": "Strip comments from JSON. Lets you use comments in your JSON files!",
  "license": "MIT",
  "repository": "sindresorhus/strip-json-comments",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "sindresorhus.com"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "files": [
    "index.js"
  ],
  "devDependencies": {
    "ava": "*",
    "xo": "*"
  }
}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.

## Glob Logo

Glob's logo created by Tanya Brassie <http://tanyabrassie.com/>, licensed
under a Creative Commons Attribution-ShareAlike 4.0 International License
https://creativecommons.org/licenses/by-sa/4.0/
exports.setopts = setopts
exports.ownProp = ownProp
exports.makeAbs = makeAbs
exports.finish = finish
exports.mark = mark
exports.isIgnored = isIgnored
exports.childrenIgnored = childrenIgnored

function ownProp (obj, field) {
  return Object.prototype.hasOwnProperty.call(obj, field)
}

var fs = require("fs")
var path = require("path")
var minimatch = require("minimatch")
var isAbsolute = require("path-is-absolute")
var Minimatch = minimatch.Minimatch

function alphasort (a, b) {
  return a.localeCompare(b, 'en')
}

function setupIgnores (self, options) {
  self.ignore = options.ignore || []

  if (!Array.isArray(self.ignore))
    self.ignore = [self.ignore]

  if (self.ignore.length) {
    self.ignore = self.ignore.map(ignoreMap)
  }
}

// ignore patterns are always in dot:true mode.
function ignoreMap (pattern) {
  var gmatcher = null
  if (pattern.slice(-3) === '/**') {
    var gpattern = pattern.replace(/(\/\*\*)+$/, '')
    gmatcher = new Minimatch(gpattern, { dot: true })
  }

  return {
    matcher: new Minimatch(pattern, { dot: true }),
    gmatcher: gmatcher
  }
}

function setopts (self, pattern, options) {
  if (!options)
    options = {}

  // base-matching: just use globstar for that.
  if (options.matchBase && -1 === pattern.indexOf("/")) {
    if (options.noglobstar) {
      throw new Error("base matching requires globstar")
    }
    pattern = "**/" + pattern
  }

  self.silent = !!options.silent
  self.pattern = pattern
  self.strict = options.strict !== false
  self.realpath = !!options.realpath
  self.realpathCache = options.realpathCache || Object.create(null)
  self.follow = !!options.follow
  self.dot = !!options.dot
  self.mark = !!options.mark
  self.nodir = !!options.nodir
  if (self.nodir)
    self.mark = true
  self.sync = !!options.sync
  self.nounique = !!options.nounique
  self.nonull = !!options.nonull
  self.nosort = !!options.nosort
  self.nocase = !!options.nocase
  self.stat = !!options.stat
  self.noprocess = !!options.noprocess
  self.absolute = !!options.absolute
  self.fs = options.fs || fs

  self.maxLength = options.maxLength || Infinity
  self.cache = options.cache || Object.create(null)
  self.statCache = options.statCache || Object.create(null)
  self.symlinks = options.symlinks || Object.create(null)

  setupIgnores(self, options)

  self.changedCwd = false
  var cwd = process.cwd()
  if (!ownProp(options, "cwd"))
    self.cwd = cwd
  else {
    self.cwd = path.resolve(options.cwd)
    self.changedCwd = self.cwd !== cwd
  }

  self.root = options.root || path.resolve(self.cwd, "/")
  self.root = path.resolve(self.root)
  if (process.platform === "win32")
    self.root = self.root.replace(/\\/g, "/")

  // TODO: is an absolute `cwd` supposed to be resolved against `root`?
  // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test')
  self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd)
  if (process.platform === "win32")
    self.cwdAbs = self.cwdAbs.replace(/\\/g, "/")
  self.nomount = !!options.nomount

  // disable comments and negation in Minimatch.
  // Note that they are not supported in Glob itself anyway.
  options.nonegate = true
  options.nocomment = true
  // always treat \ in patterns as escapes, not path separators
  options.allowWindowsEscape = false

  self.minimatch = new Minimatch(pattern, options)
  self.options = self.minimatch.options
}

function finish (self) {
  var nou = self.nounique
  var all = nou ? [] : Object.create(null)

  for (var i = 0, l = self.matches.length; i < l; i ++) {
    var matches = self.matches[i]
    if (!matches || Object.keys(matches).length === 0) {
      if (self.nonull) {
        // do like the shell, and spit out the literal glob
        var literal = self.minimatch.globSet[i]
        if (nou)
          all.push(literal)
        else
          all[literal] = true
      }
    } else {
      // had matches
      var m = Object.keys(matches)
      if (nou)
        all.push.apply(all, m)
      else
        m.forEach(function (m) {
          all[m] = true
        })
    }
  }

  if (!nou)
    all = Object.keys(all)

  if (!self.nosort)
    all = all.sort(alphasort)

  // at *some* point we statted all of these
  if (self.mark) {
    for (var i = 0; i < all.length; i++) {
      all[i] = self._mark(all[i])
    }
    if (self.nodir) {
      all = all.filter(function (e) {
        var notDir = !(/\/$/.test(e))
        var c = self.cache[e] || self.cache[makeAbs(self, e)]
        if (notDir && c)
          notDir = c !== 'DIR' && !Array.isArray(c)
        return notDir
      })
    }
  }

  if (self.ignore.length)
    all = all.filter(function(m) {
      return !isIgnored(self, m)
    })

  self.found = all
}

function mark (self, p) {
  var abs = makeAbs(self, p)
  var c = self.cache[abs]
  var m = p
  if (c) {
    var isDir = c === 'DIR' || Array.isArray(c)
    var slash = p.slice(-1) === '/'

    if (isDir && !slash)
      m += '/'
    else if (!isDir && slash)
      m = m.slice(0, -1)

    if (m !== p) {
      var mabs = makeAbs(self, m)
      self.statCache[mabs] = self.statCache[abs]
      self.cache[mabs] = self.cache[abs]
    }
  }

  return m
}

// lotta situps...
function makeAbs (self, f) {
  var abs = f
  if (f.charAt(0) === '/') {
    abs = path.join(self.root, f)
  } else if (isAbsolute(f) || f === '') {
    abs = f
  } else if (self.changedCwd) {
    abs = path.resolve(self.cwd, f)
  } else {
    abs = path.resolve(f)
  }

  if (process.platform === 'win32')
    abs = abs.replace(/\\/g, '/')

  return abs
}


// Return true, if pattern ends with globstar '**', for the accompanying parent directory.
// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents
function isIgnored (self, path) {
  if (!self.ignore.length)
    return false

  return self.ignore.some(function(item) {
    return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path))
  })
}

function childrenIgnored (self, path) {
  if (!self.ignore.length)
    return false

  return self.ignore.some(function(item) {
    return !!(item.gmatcher && item.gmatcher.match(path))
  })
}
// Approach:
//
// 1. Get the minimatch set
// 2. For each pattern in the set, PROCESS(pattern, false)
// 3. Store matches per-set, then uniq them
//
// PROCESS(pattern, inGlobStar)
// Get the first [n] items from pattern that are all strings
// Join these together.  This is PREFIX.
//   If there is no more remaining, then stat(PREFIX) and
//   add to matches if it succeeds.  END.
//
// If inGlobStar and PREFIX is symlink and points to dir
//   set ENTRIES = []
// else readdir(PREFIX) as ENTRIES
//   If fail, END
//
// with ENTRIES
//   If pattern[n] is GLOBSTAR
//     // handle the case where the globstar match is empty
//     // by pruning it out, and testing the resulting pattern
//     PROCESS(pattern[0..n] + pattern[n+1 .. $], false)
//     // handle other cases.
//     for ENTRY in ENTRIES (not dotfiles)
//       // attach globstar + tail onto the entry
//       // Mark that this entry is a globstar match
//       PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)
//
//   else // not globstar
//     for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)
//       Test ENTRY against pattern[n]
//       If fails, continue
//       If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])
//
// Caveat:
//   Cache all stats and readdirs results to minimize syscall.  Since all
//   we ever care about is existence and directory-ness, we can just keep
//   `true` for files, and [children,...] for directories, or `false` for
//   things that don't exist.

module.exports = glob

var rp = require('fs.realpath')
var minimatch = require('minimatch')
var Minimatch = minimatch.Minimatch
var inherits = require('inherits')
var EE = require('events').EventEmitter
var path = require('path')
var assert = require('assert')
var isAbsolute = require('path-is-absolute')
var globSync = require('./sync.js')
var common = require('./common.js')
var setopts = common.setopts
var ownProp = common.ownProp
var inflight = require('inflight')
var util = require('util')
var childrenIgnored = common.childrenIgnored
var isIgnored = common.isIgnored

var once = require('once')

function glob (pattern, options, cb) {
  if (typeof options === 'function') cb = options, options = {}
  if (!options) options = {}

  if (options.sync) {
    if (cb)
      throw new TypeError('callback provided to sync glob')
    return globSync(pattern, options)
  }

  return new Glob(pattern, options, cb)
}

glob.sync = globSync
var GlobSync = glob.GlobSync = globSync.GlobSync

// old api surface
glob.glob = glob

function extend (origin, add) {
  if (add === null || typeof add !== 'object') {
    return origin
  }

  var keys = Object.keys(add)
  var i = keys.length
  while (i--) {
    origin[keys[i]] = add[keys[i]]
  }
  return origin
}

glob.hasMagic = function (pattern, options_) {
  var options = extend({}, options_)
  options.noprocess = true

  var g = new Glob(pattern, options)
  var set = g.minimatch.set

  if (!pattern)
    return false

  if (set.length > 1)
    return true

  for (var j = 0; j < set[0].length; j++) {
    if (typeof set[0][j] !== 'string')
      return true
  }

  return false
}

glob.Glob = Glob
inherits(Glob, EE)
function Glob (pattern, options, cb) {
  if (typeof options === 'function') {
    cb = options
    options = null
  }

  if (options && options.sync) {
    if (cb)
      throw new TypeError('callback provided to sync glob')
    return new GlobSync(pattern, options)
  }

  if (!(this instanceof Glob))
    return new Glob(pattern, options, cb)

  setopts(this, pattern, options)
  this._didRealPath = false

  // process each pattern in the minimatch set
  var n = this.minimatch.set.length

  // The matches are stored as {<filename>: true,...} so that
  // duplicates are automagically pruned.
  // Later, we do an Object.keys() on these.
  // Keep them as a list so we can fill in when nonull is set.
  this.matches = new Array(n)

  if (typeof cb === 'function') {
    cb = once(cb)
    this.on('error', cb)
    this.on('end', function (matches) {
      cb(null, matches)
    })
  }

  var self = this
  this._processing = 0

  this._emitQueue = []
  this._processQueue = []
  this.paused = false

  if (this.noprocess)
    return this

  if (n === 0)
    return done()

  var sync = true
  for (var i = 0; i < n; i ++) {
    this._process(this.minimatch.set[i], i, false, done)
  }
  sync = false

  function done () {
    --self._processing
    if (self._processing <= 0) {
      if (sync) {
        process.nextTick(function () {
          self._finish()
        })
      } else {
        self._finish()
      }
    }
  }
}

Glob.prototype._finish = function () {
  assert(this instanceof Glob)
  if (this.aborted)
    return

  if (this.realpath && !this._didRealpath)
    return this._realpath()

  common.finish(this)
  this.emit('end', this.found)
}

Glob.prototype._realpath = function () {
  if (this._didRealpath)
    return

  this._didRealpath = true

  var n = this.matches.length
  if (n === 0)
    return this._finish()

  var self = this
  for (var i = 0; i < this.matches.length; i++)
    this._realpathSet(i, next)

  function next () {
    if (--n === 0)
      self._finish()
  }
}

Glob.prototype._realpathSet = function (index, cb) {
  var matchset = this.matches[index]
  if (!matchset)
    return cb()

  var found = Object.keys(matchset)
  var self = this
  var n = found.length

  if (n === 0)
    return cb()

  var set = this.matches[index] = Object.create(null)
  found.forEach(function (p, i) {
    // If there's a problem with the stat, then it means that
    // one or more of the links in the realpath couldn't be
    // resolved.  just return the abs value in that case.
    p = self._makeAbs(p)
    rp.realpath(p, self.realpathCache, function (er, real) {
      if (!er)
        set[real] = true
      else if (er.syscall === 'stat')
        set[p] = true
      else
        self.emit('error', er) // srsly wtf right here

      if (--n === 0) {
        self.matches[index] = set
        cb()
      }
    })
  })
}

Glob.prototype._mark = function (p) {
  return common.mark(this, p)
}

Glob.prototype._makeAbs = function (f) {
  return common.makeAbs(this, f)
}

Glob.prototype.abort = function () {
  this.aborted = true
  this.emit('abort')
}

Glob.prototype.pause = function () {
  if (!this.paused) {
    this.paused = true
    this.emit('pause')
  }
}

Glob.prototype.resume = function () {
  if (this.paused) {
    this.emit('resume')
    this.paused = false
    if (this._emitQueue.length) {
      var eq = this._emitQueue.slice(0)
      this._emitQueue.length = 0
      for (var i = 0; i < eq.length; i ++) {
        var e = eq[i]
        this._emitMatch(e[0], e[1])
      }
    }
    if (this._processQueue.length) {
      var pq = this._processQueue.slice(0)
      this._processQueue.length = 0
      for (var i = 0; i < pq.length; i ++) {
        var p = pq[i]
        this._processing--
        this._process(p[0], p[1], p[2], p[3])
      }
    }
  }
}

Glob.prototype._process = function (pattern, index, inGlobStar, cb) {
  assert(this instanceof Glob)
  assert(typeof cb === 'function')

  if (this.aborted)
    return

  this._processing++
  if (this.paused) {
    this._processQueue.push([pattern, index, inGlobStar, cb])
    return
  }

  //console.error('PROCESS %d', this._processing, pattern)

  // Get the first [n] parts of pattern that are all strings.
  var n = 0
  while (typeof pattern[n] === 'string') {
    n ++
  }
  // now n is the index of the first one that is *not* a string.

  // see if there's anything else
  var prefix
  switch (n) {
    // if not, then this is rather simple
    case pattern.length:
      this._processSimple(pattern.join('/'), index, cb)
      return

    case 0:
      // pattern *starts* with some non-trivial item.
      // going to readdir(cwd), but not include the prefix in matches.
      prefix = null
      break

    default:
      // pattern has some string bits in the front.
      // whatever it starts with, whether that's 'absolute' like /foo/bar,
      // or 'relative' like '../baz'
      prefix = pattern.slice(0, n).join('/')
      break
  }

  var remain = pattern.slice(n)

  // get the list of entries.
  var read
  if (prefix === null)
    read = '.'
  else if (isAbsolute(prefix) ||
      isAbsolute(pattern.map(function (p) {
        return typeof p === 'string' ? p : '[*]'
      }).join('/'))) {
    if (!prefix || !isAbsolute(prefix))
      prefix = '/' + prefix
    read = prefix
  } else
    read = prefix

  var abs = this._makeAbs(read)

  //if ignored, skip _processing
  if (childrenIgnored(this, read))
    return cb()

  var isGlobStar = remain[0] === minimatch.GLOBSTAR
  if (isGlobStar)
    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb)
  else
    this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb)
}

Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {
  var self = this
  this._readdir(abs, inGlobStar, function (er, entries) {
    return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
  })
}

Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {

  // if the abs isn't a dir, then nothing can match!
  if (!entries)
    return cb()

  // It will only match dot entries if it starts with a dot, or if
  // dot is set.  Stuff like @(.foo|.bar) isn't allowed.
  var pn = remain[0]
  var negate = !!this.minimatch.negate
  var rawGlob = pn._glob
  var dotOk = this.dot || rawGlob.charAt(0) === '.'

  var matchedEntries = []
  for (var i = 0; i < entries.length; i++) {
    var e = entries[i]
    if (e.charAt(0) !== '.' || dotOk) {
      var m
      if (negate && !prefix) {
        m = !e.match(pn)
      } else {
        m = e.match(pn)
      }
      if (m)
        matchedEntries.push(e)
    }
  }

  //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)

  var len = matchedEntries.length
  // If there are no matched entries, then nothing matches.
  if (len === 0)
    return cb()

  // if this is the last remaining pattern bit, then no need for
  // an additional stat *unless* the user has specified mark or
  // stat explicitly.  We know they exist, since readdir returned
  // them.

  if (remain.length === 1 && !this.mark && !this.stat) {
    if (!this.matches[index])
      this.matches[index] = Object.create(null)

    for (var i = 0; i < len; i ++) {
      var e = matchedEntries[i]
      if (prefix) {
        if (prefix !== '/')
          e = prefix + '/' + e
        else
          e = prefix + e
      }

      if (e.charAt(0) === '/' && !this.nomount) {
        e = path.join(this.root, e)
      }
      this._emitMatch(index, e)
    }
    // This was the last one, and no stats were needed
    return cb()
  }

  // now test all matched entries as stand-ins for that part
  // of the pattern.
  remain.shift()
  for (var i = 0; i < len; i ++) {
    var e = matchedEntries[i]
    var newPattern
    if (prefix) {
      if (prefix !== '/')
        e = prefix + '/' + e
      else
        e = prefix + e
    }
    this._process([e].concat(remain), index, inGlobStar, cb)
  }
  cb()
}

Glob.prototype._emitMatch = function (index, e) {
  if (this.aborted)
    return

  if (isIgnored(this, e))
    return

  if (this.paused) {
    this._emitQueue.push([index, e])
    return
  }

  var abs = isAbsolute(e) ? e : this._makeAbs(e)

  if (this.mark)
    e = this._mark(e)

  if (this.absolute)
    e = abs

  if (this.matches[index][e])
    return

  if (this.nodir) {
    var c = this.cache[abs]
    if (c === 'DIR' || Array.isArray(c))
      return
  }

  this.matches[index][e] = true

  var st = this.statCache[abs]
  if (st)
    this.emit('stat', e, st)

  this.emit('match', e)
}

Glob.prototype._readdirInGlobStar = function (abs, cb) {
  if (this.aborted)
    return

  // follow all symlinked directories forever
  // just proceed as if this is a non-globstar situation
  if (this.follow)
    return this._readdir(abs, false, cb)

  var lstatkey = 'lstat\0' + abs
  var self = this
  var lstatcb = inflight(lstatkey, lstatcb_)

  if (lstatcb)
    self.fs.lstat(abs, lstatcb)

  function lstatcb_ (er, lstat) {
    if (er && er.code === 'ENOENT')
      return cb()

    var isSym = lstat && lstat.isSymbolicLink()
    self.symlinks[abs] = isSym

    // If it's not a symlink or a dir, then it's definitely a regular file.
    // don't bother doing a readdir in that case.
    if (!isSym && lstat && !lstat.isDirectory()) {
      self.cache[abs] = 'FILE'
      cb()
    } else
      self._readdir(abs, false, cb)
  }
}

Glob.prototype._readdir = function (abs, inGlobStar, cb) {
  if (this.aborted)
    return

  cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb)
  if (!cb)
    return

  //console.error('RD %j %j', +inGlobStar, abs)
  if (inGlobStar && !ownProp(this.symlinks, abs))
    return this._readdirInGlobStar(abs, cb)

  if (ownProp(this.cache, abs)) {
    var c = this.cache[abs]
    if (!c || c === 'FILE')
      return cb()

    if (Array.isArray(c))
      return cb(null, c)
  }

  var self = this
  self.fs.readdir(abs, readdirCb(this, abs, cb))
}

function readdirCb (self, abs, cb) {
  return function (er, entries) {
    if (er)
      self._readdirError(abs, er, cb)
    else
      self._readdirEntries(abs, entries, cb)
  }
}

Glob.prototype._readdirEntries = function (abs, entries, cb) {
  if (this.aborted)
    return

  // if we haven't asked to stat everything, then just
  // assume that everything in there exists, so we can avoid
  // having to stat it a second time.
  if (!this.mark && !this.stat) {
    for (var i = 0; i < entries.length; i ++) {
      var e = entries[i]
      if (abs === '/')
        e = abs + e
      else
        e = abs + '/' + e
      this.cache[e] = true
    }
  }

  this.cache[abs] = entries
  return cb(null, entries)
}

Glob.prototype._readdirError = function (f, er, cb) {
  if (this.aborted)
    return

  // handle errors, and cache the information
  switch (er.code) {
    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
    case 'ENOTDIR': // totally normal. means it *does* exist.
      var abs = this._makeAbs(f)
      this.cache[abs] = 'FILE'
      if (abs === this.cwdAbs) {
        var error = new Error(er.code + ' invalid cwd ' + this.cwd)
        error.path = this.cwd
        error.code = er.code
        this.emit('error', error)
        this.abort()
      }
      break

    case 'ENOENT': // not terribly unusual
    case 'ELOOP':
    case 'ENAMETOOLONG':
    case 'UNKNOWN':
      this.cache[this._makeAbs(f)] = false
      break

    default: // some unusual error.  Treat as failure.
      this.cache[this._makeAbs(f)] = false
      if (this.strict) {
        this.emit('error', er)
        // If the error is handled, then we abort
        // if not, we threw out of here
        this.abort()
      }
      if (!this.silent)
        console.error('glob error', er)
      break
  }

  return cb()
}

Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {
  var self = this
  this._readdir(abs, inGlobStar, function (er, entries) {
    self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
  })
}


Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
  //console.error('pgs2', prefix, remain[0], entries)

  // no entries means not a dir, so it can never have matches
  // foo.txt/** doesn't match foo.txt
  if (!entries)
    return cb()

  // test without the globstar, and with every child both below
  // and replacing the globstar.
  var remainWithoutGlobStar = remain.slice(1)
  var gspref = prefix ? [ prefix ] : []
  var noGlobStar = gspref.concat(remainWithoutGlobStar)

  // the noGlobStar pattern exits the inGlobStar state
  this._process(noGlobStar, index, false, cb)

  var isSym = this.symlinks[abs]
  var len = entries.length

  // If it's a symlink, and we're in a globstar, then stop
  if (isSym && inGlobStar)
    return cb()

  for (var i = 0; i < len; i++) {
    var e = entries[i]
    if (e.charAt(0) === '.' && !this.dot)
      continue

    // these two cases enter the inGlobStar state
    var instead = gspref.concat(entries[i], remainWithoutGlobStar)
    this._process(instead, index, true, cb)

    var below = gspref.concat(entries[i], remain)
    this._process(below, index, true, cb)
  }

  cb()
}

Glob.prototype._processSimple = function (prefix, index, cb) {
  // XXX review this.  Shouldn't it be doing the mounting etc
  // before doing stat?  kinda weird?
  var self = this
  this._stat(prefix, function (er, exists) {
    self._processSimple2(prefix, index, er, exists, cb)
  })
}
Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {

  //console.error('ps2', prefix, exists)

  if (!this.matches[index])
    this.matches[index] = Object.create(null)

  // If it doesn't exist, then just mark the lack of results
  if (!exists)
    return cb()

  if (prefix && isAbsolute(prefix) && !this.nomount) {
    var trail = /[\/\\]$/.test(prefix)
    if (prefix.charAt(0) === '/') {
      prefix = path.join(this.root, prefix)
    } else {
      prefix = path.resolve(this.root, prefix)
      if (trail)
        prefix += '/'
    }
  }

  if (process.platform === 'win32')
    prefix = prefix.replace(/\\/g, '/')

  // Mark this as a match
  this._emitMatch(index, prefix)
  cb()
}

// Returns either 'DIR', 'FILE', or false
Glob.prototype._stat = function (f, cb) {
  var abs = this._makeAbs(f)
  var needDir = f.slice(-1) === '/'

  if (f.length > this.maxLength)
    return cb()

  if (!this.stat && ownProp(this.cache, abs)) {
    var c = this.cache[abs]

    if (Array.isArray(c))
      c = 'DIR'

    // It exists, but maybe not how we need it
    if (!needDir || c === 'DIR')
      return cb(null, c)

    if (needDir && c === 'FILE')
      return cb()

    // otherwise we have to stat, because maybe c=true
    // if we know it exists, but not what it is.
  }

  var exists
  var stat = this.statCache[abs]
  if (stat !== undefined) {
    if (stat === false)
      return cb(null, stat)
    else {
      var type = stat.isDirectory() ? 'DIR' : 'FILE'
      if (needDir && type === 'FILE')
        return cb()
      else
        return cb(null, type, stat)
    }
  }

  var self = this
  var statcb = inflight('stat\0' + abs, lstatcb_)
  if (statcb)
    self.fs.lstat(abs, statcb)

  function lstatcb_ (er, lstat) {
    if (lstat && lstat.isSymbolicLink()) {
      // If it's a symlink, then treat it as the target, unless
      // the target does not exist, then treat it as a file.
      return self.fs.stat(abs, function (er, stat) {
        if (er)
          self._stat2(f, abs, null, lstat, cb)
        else
          self._stat2(f, abs, er, stat, cb)
      })
    } else {
      self._stat2(f, abs, er, lstat, cb)
    }
  }
}

Glob.prototype._stat2 = function (f, abs, er, stat, cb) {
  if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {
    this.statCache[abs] = false
    return cb()
  }

  var needDir = f.slice(-1) === '/'
  this.statCache[abs] = stat

  if (abs.slice(-1) === '/' && stat && !stat.isDirectory())
    return cb(null, false, stat)

  var c = true
  if (stat)
    c = stat.isDirectory() ? 'DIR' : 'FILE'
  this.cache[abs] = this.cache[abs] || c

  if (needDir && c === 'FILE')
    return cb()

  return cb(null, c, stat)
}
{
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
  "name": "glob",
  "description": "a little globber",
  "version": "7.2.3",
  "publishConfig": {
    "tag": "v7-legacy"
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/node-glob.git"
  },
  "main": "glob.js",
  "files": [
    "glob.js",
    "sync.js",
    "common.js"
  ],
  "engines": {
    "node": "*"
  },
  "dependencies": {
    "fs.realpath": "^1.0.0",
    "inflight": "^1.0.4",
    "inherits": "2",
    "minimatch": "^3.1.1",
    "once": "^1.3.0",
    "path-is-absolute": "^1.0.0"
  },
  "devDependencies": {
    "memfs": "^3.2.0",
    "mkdirp": "0",
    "rimraf": "^2.2.8",
    "tap": "^15.0.6",
    "tick": "0.0.6"
  },
  "tap": {
    "before": "test/00-setup.js",
    "after": "test/zz-cleanup.js",
    "jobs": 1
  },
  "license": "ISC",
  "funding": {
    "url": "https://github.com/sponsors/isaacs"
  }
}module.exports = globSync
globSync.GlobSync = GlobSync

var rp = require('fs.realpath')
var minimatch = require('minimatch')
var Minimatch = minimatch.Minimatch
var Glob = require('./glob.js').Glob
var util = require('util')
var path = require('path')
var assert = require('assert')
var isAbsolute = require('path-is-absolute')
var common = require('./common.js')
var setopts = common.setopts
var ownProp = common.ownProp
var childrenIgnored = common.childrenIgnored
var isIgnored = common.isIgnored

function globSync (pattern, options) {
  if (typeof options === 'function' || arguments.length === 3)
    throw new TypeError('callback provided to sync glob\n'+
                        'See: https://github.com/isaacs/node-glob/issues/167')

  return new GlobSync(pattern, options).found
}

function GlobSync (pattern, options) {
  if (!pattern)
    throw new Error('must provide pattern')

  if (typeof options === 'function' || arguments.length === 3)
    throw new TypeError('callback provided to sync glob\n'+
                        'See: https://github.com/isaacs/node-glob/issues/167')

  if (!(this instanceof GlobSync))
    return new GlobSync(pattern, options)

  setopts(this, pattern, options)

  if (this.noprocess)
    return this

  var n = this.minimatch.set.length
  this.matches = new Array(n)
  for (var i = 0; i < n; i ++) {
    this._process(this.minimatch.set[i], i, false)
  }
  this._finish()
}

GlobSync.prototype._finish = function () {
  assert.ok(this instanceof GlobSync)
  if (this.realpath) {
    var self = this
    this.matches.forEach(function (matchset, index) {
      var set = self.matches[index] = Object.create(null)
      for (var p in matchset) {
        try {
          p = self._makeAbs(p)
          var real = rp.realpathSync(p, self.realpathCache)
          set[real] = true
        } catch (er) {
          if (er.syscall === 'stat')
            set[self._makeAbs(p)] = true
          else
            throw er
        }
      }
    })
  }
  common.finish(this)
}


GlobSync.prototype._process = function (pattern, index, inGlobStar) {
  assert.ok(this instanceof GlobSync)

  // Get the first [n] parts of pattern that are all strings.
  var n = 0
  while (typeof pattern[n] === 'string') {
    n ++
  }
  // now n is the index of the first one that is *not* a string.

  // See if there's anything else
  var prefix
  switch (n) {
    // if not, then this is rather simple
    case pattern.length:
      this._processSimple(pattern.join('/'), index)
      return

    case 0:
      // pattern *starts* with some non-trivial item.
      // going to readdir(cwd), but not include the prefix in matches.
      prefix = null
      break

    default:
      // pattern has some string bits in the front.
      // whatever it starts with, whether that's 'absolute' like /foo/bar,
      // or 'relative' like '../baz'
      prefix = pattern.slice(0, n).join('/')
      break
  }

  var remain = pattern.slice(n)

  // get the list of entries.
  var read
  if (prefix === null)
    read = '.'
  else if (isAbsolute(prefix) ||
      isAbsolute(pattern.map(function (p) {
        return typeof p === 'string' ? p : '[*]'
      }).join('/'))) {
    if (!prefix || !isAbsolute(prefix))
      prefix = '/' + prefix
    read = prefix
  } else
    read = prefix

  var abs = this._makeAbs(read)

  //if ignored, skip processing
  if (childrenIgnored(this, read))
    return

  var isGlobStar = remain[0] === minimatch.GLOBSTAR
  if (isGlobStar)
    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar)
  else
    this._processReaddir(prefix, read, abs, remain, index, inGlobStar)
}


GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) {
  var entries = this._readdir(abs, inGlobStar)

  // if the abs isn't a dir, then nothing can match!
  if (!entries)
    return

  // It will only match dot entries if it starts with a dot, or if
  // dot is set.  Stuff like @(.foo|.bar) isn't allowed.
  var pn = remain[0]
  var negate = !!this.minimatch.negate
  var rawGlob = pn._glob
  var dotOk = this.dot || rawGlob.charAt(0) === '.'

  var matchedEntries = []
  for (var i = 0; i < entries.length; i++) {
    var e = entries[i]
    if (e.charAt(0) !== '.' || dotOk) {
      var m
      if (negate && !prefix) {
        m = !e.match(pn)
      } else {
        m = e.match(pn)
      }
      if (m)
        matchedEntries.push(e)
    }
  }

  var len = matchedEntries.length
  // If there are no matched entries, then nothing matches.
  if (len === 0)
    return

  // if this is the last remaining pattern bit, then no need for
  // an additional stat *unless* the user has specified mark or
  // stat explicitly.  We know they exist, since readdir returned
  // them.

  if (remain.length === 1 && !this.mark && !this.stat) {
    if (!this.matches[index])
      this.matches[index] = Object.create(null)

    for (var i = 0; i < len; i ++) {
      var e = matchedEntries[i]
      if (prefix) {
        if (prefix.slice(-1) !== '/')
          e = prefix + '/' + e
        else
          e = prefix + e
      }

      if (e.charAt(0) === '/' && !this.nomount) {
        e = path.join(this.root, e)
      }
      this._emitMatch(index, e)
    }
    // This was the last one, and no stats were needed
    return
  }

  // now test all matched entries as stand-ins for that part
  // of the pattern.
  remain.shift()
  for (var i = 0; i < len; i ++) {
    var e = matchedEntries[i]
    var newPattern
    if (prefix)
      newPattern = [prefix, e]
    else
      newPattern = [e]
    this._process(newPattern.concat(remain), index, inGlobStar)
  }
}


GlobSync.prototype._emitMatch = function (index, e) {
  if (isIgnored(this, e))
    return

  var abs = this._makeAbs(e)

  if (this.mark)
    e = this._mark(e)

  if (this.absolute) {
    e = abs
  }

  if (this.matches[index][e])
    return

  if (this.nodir) {
    var c = this.cache[abs]
    if (c === 'DIR' || Array.isArray(c))
      return
  }

  this.matches[index][e] = true

  if (this.stat)
    this._stat(e)
}


GlobSync.prototype._readdirInGlobStar = function (abs) {
  // follow all symlinked directories forever
  // just proceed as if this is a non-globstar situation
  if (this.follow)
    return this._readdir(abs, false)

  var entries
  var lstat
  var stat
  try {
    lstat = this.fs.lstatSync(abs)
  } catch (er) {
    if (er.code === 'ENOENT') {
      // lstat failed, doesn't exist
      return null
    }
  }

  var isSym = lstat && lstat.isSymbolicLink()
  this.symlinks[abs] = isSym

  // If it's not a symlink or a dir, then it's definitely a regular file.
  // don't bother doing a readdir in that case.
  if (!isSym && lstat && !lstat.isDirectory())
    this.cache[abs] = 'FILE'
  else
    entries = this._readdir(abs, false)

  return entries
}

GlobSync.prototype._readdir = function (abs, inGlobStar) {
  var entries

  if (inGlobStar && !ownProp(this.symlinks, abs))
    return this._readdirInGlobStar(abs)

  if (ownProp(this.cache, abs)) {
    var c = this.cache[abs]
    if (!c || c === 'FILE')
      return null

    if (Array.isArray(c))
      return c
  }

  try {
    return this._readdirEntries(abs, this.fs.readdirSync(abs))
  } catch (er) {
    this._readdirError(abs, er)
    return null
  }
}

GlobSync.prototype._readdirEntries = function (abs, entries) {
  // if we haven't asked to stat everything, then just
  // assume that everything in there exists, so we can avoid
  // having to stat it a second time.
  if (!this.mark && !this.stat) {
    for (var i = 0; i < entries.length; i ++) {
      var e = entries[i]
      if (abs === '/')
        e = abs + e
      else
        e = abs + '/' + e
      this.cache[e] = true
    }
  }

  this.cache[abs] = entries

  // mark and cache dir-ness
  return entries
}

GlobSync.prototype._readdirError = function (f, er) {
  // handle errors, and cache the information
  switch (er.code) {
    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
    case 'ENOTDIR': // totally normal. means it *does* exist.
      var abs = this._makeAbs(f)
      this.cache[abs] = 'FILE'
      if (abs === this.cwdAbs) {
        var error = new Error(er.code + ' invalid cwd ' + this.cwd)
        error.path = this.cwd
        error.code = er.code
        throw error
      }
      break

    case 'ENOENT': // not terribly unusual
    case 'ELOOP':
    case 'ENAMETOOLONG':
    case 'UNKNOWN':
      this.cache[this._makeAbs(f)] = false
      break

    default: // some unusual error.  Treat as failure.
      this.cache[this._makeAbs(f)] = false
      if (this.strict)
        throw er
      if (!this.silent)
        console.error('glob error', er)
      break
  }
}

GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) {

  var entries = this._readdir(abs, inGlobStar)

  // no entries means not a dir, so it can never have matches
  // foo.txt/** doesn't match foo.txt
  if (!entries)
    return

  // test without the globstar, and with every child both below
  // and replacing the globstar.
  var remainWithoutGlobStar = remain.slice(1)
  var gspref = prefix ? [ prefix ] : []
  var noGlobStar = gspref.concat(remainWithoutGlobStar)

  // the noGlobStar pattern exits the inGlobStar state
  this._process(noGlobStar, index, false)

  var len = entries.length
  var isSym = this.symlinks[abs]

  // If it's a symlink, and we're in a globstar, then stop
  if (isSym && inGlobStar)
    return

  for (var i = 0; i < len; i++) {
    var e = entries[i]
    if (e.charAt(0) === '.' && !this.dot)
      continue

    // these two cases enter the inGlobStar state
    var instead = gspref.concat(entries[i], remainWithoutGlobStar)
    this._process(instead, index, true)

    var below = gspref.concat(entries[i], remain)
    this._process(below, index, true)
  }
}

GlobSync.prototype._processSimple = function (prefix, index) {
  // XXX review this.  Shouldn't it be doing the mounting etc
  // before doing stat?  kinda weird?
  var exists = this._stat(prefix)

  if (!this.matches[index])
    this.matches[index] = Object.create(null)

  // If it doesn't exist, then just mark the lack of results
  if (!exists)
    return

  if (prefix && isAbsolute(prefix) && !this.nomount) {
    var trail = /[\/\\]$/.test(prefix)
    if (prefix.charAt(0) === '/') {
      prefix = path.join(this.root, prefix)
    } else {
      prefix = path.resolve(this.root, prefix)
      if (trail)
        prefix += '/'
    }
  }

  if (process.platform === 'win32')
    prefix = prefix.replace(/\\/g, '/')

  // Mark this as a match
  this._emitMatch(index, prefix)
}

// Returns either 'DIR', 'FILE', or false
GlobSync.prototype._stat = function (f) {
  var abs = this._makeAbs(f)
  var needDir = f.slice(-1) === '/'

  if (f.length > this.maxLength)
    return false

  if (!this.stat && ownProp(this.cache, abs)) {
    var c = this.cache[abs]

    if (Array.isArray(c))
      c = 'DIR'

    // It exists, but maybe not how we need it
    if (!needDir || c === 'DIR')
      return c

    if (needDir && c === 'FILE')
      return false

    // otherwise we have to stat, because maybe c=true
    // if we know it exists, but not what it is.
  }

  var exists
  var stat = this.statCache[abs]
  if (!stat) {
    var lstat
    try {
      lstat = this.fs.lstatSync(abs)
    } catch (er) {
      if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {
        this.statCache[abs] = false
        return false
      }
    }

    if (lstat && lstat.isSymbolicLink()) {
      try {
        stat = this.fs.statSync(abs)
      } catch (er) {
        stat = lstat
      }
    } else {
      stat = lstat
    }
  }

  this.statCache[abs] = stat

  var c = true
  if (stat)
    c = stat.isDirectory() ? 'DIR' : 'FILE'

  this.cache[abs] = this.cache[abs] || c

  if (needDir && c === 'FILE')
    return false

  return c
}

GlobSync.prototype._mark = function (p) {
  return common.mark(this, p)
}

GlobSync.prototype._makeAbs = function (f) {
  return common.makeAbs(this, f)
}
(The MIT License)

Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca>

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.

# get Makefile directory name: http://stackoverflow.com/a/5982798/376773
THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)

# BIN directory
BIN := $(THIS_DIR)/node_modules/.bin

# Path
PATH := node_modules/.bin:$(PATH)
SHELL := /bin/bash

# applications
NODE ?= $(shell which node)
YARN ?= $(shell which yarn)
PKG ?= $(if $(YARN),$(YARN),$(NODE) $(shell which npm))
BROWSERIFY ?= $(NODE) $(BIN)/browserify

.FORCE:

install: node_modules

node_modules: package.json
	@NODE_ENV= $(PKG) install
	@touch node_modules

lint: .FORCE
	eslint browser.js debug.js index.js node.js

test-node: .FORCE
	istanbul cover node_modules/mocha/bin/_mocha -- test/**.js

test-browser: .FORCE
	mkdir -p dist

	@$(BROWSERIFY) \
		--standalone debug \
		. > dist/debug.js

	karma start --single-run
	rimraf dist

test: .FORCE
	concurrently \
		"make test-node" \
		"make test-browser"

coveralls:
	cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js

.PHONY: all install clean distclean
{
  "name": "debug",
  "repo": "visionmedia/debug",
  "description": "small debugging utility",
  "version": "2.6.9",
  "keywords": [
    "debug",
    "log",
    "debugger"
  ],
  "main": "src/browser.js",
  "scripts": [
    "src/browser.js",
    "src/debug.js"
  ],
  "dependencies": {
    "rauchg/ms.js": "0.7.1"
  }
}
module.exports = require('./src/node');
{
  "name": "debug",
  "version": "2.6.9",
  "repository": {
    "type": "git",
    "url": "git://github.com/visionmedia/debug.git"
  },
  "description": "small debugging utility",
  "author": "TJ Holowaychuk <tj@vision-media.ca>",
  "license": "MIT",
  "dependencies": {
    "ms": "2.0.0"
  },
  "devDependencies": {
    "browserify": "9.0.3",
    "chai": "^3.5.0",
    "concurrently": "^3.1.0",
    "coveralls": "^2.11.15",
    "eslint": "^3.12.1",
    "istanbul": "^0.4.5",
    "karma": "^1.3.0",
    "karma-chai": "^0.1.0",
    "karma-mocha": "^1.3.0",
    "karma-phantomjs-launcher": "^1.0.2",
    "karma-sinon": "^1.0.5",
    "mocha": "^3.2.0",
    "mocha-lcov-reporter": "^1.2.0",
    "rimraf": "^2.5.4",
    "sinon": "^1.17.6",
    "sinon-chai": "^2.8.0"
  },
  "main": "./src/index.js",
  "browser": "./src/browser.js",
  "component": {
    "scripts": {
      "debug/index.js": "browser.js",
      "debug/debug.js": "debug.js"
    }
  }
}/**
 * This is the web browser implementation of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = require('./debug');
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;
exports.storage = 'undefined' != typeof chrome
               && 'undefined' != typeof chrome.storage
                  ? chrome.storage.local
                  : localstorage();

/**
 * Colors.
 */

exports.colors = [
  'lightseagreen',
  'forestgreen',
  'goldenrod',
  'dodgerblue',
  'darkorchid',
  'crimson'
];

/**
 * Currently only WebKit-based Web Inspectors, Firefox >= v31,
 * and the Firebug extension (any Firefox version) are known
 * to support "%c" CSS customizations.
 *
 * TODO: add a `localStorage` variable to explicitly enable/disable colors
 */

function useColors() {
  // NB: In an Electron preload script, document will be defined but not fully
  // initialized. Since we know we're in Chrome, we'll just detect this case
  // explicitly
  if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {
    return true;
  }

  // is webkit? http://stackoverflow.com/a/16459606/376773
  // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
  return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
    // is firebug? http://stackoverflow.com/a/398120/376773
    (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
    // is firefox >= v31?
    // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
    // double check webkit in userAgent just in case we are in a worker
    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
}

/**
 * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
 */

exports.formatters.j = function(v) {
  try {
    return JSON.stringify(v);
  } catch (err) {
    return '[UnexpectedJSONParseError]: ' + err.message;
  }
};


/**
 * Colorize log arguments if enabled.
 *
 * @api public
 */

function formatArgs(args) {
  var useColors = this.useColors;

  args[0] = (useColors ? '%c' : '')
    + this.namespace
    + (useColors ? ' %c' : ' ')
    + args[0]
    + (useColors ? '%c ' : ' ')
    + '+' + exports.humanize(this.diff);

  if (!useColors) return;

  var c = 'color: ' + this.color;
  args.splice(1, 0, c, 'color: inherit')

  // the final "%c" is somewhat tricky, because there could be other
  // arguments passed either before or after the %c, so we need to
  // figure out the correct index to insert the CSS into
  var index = 0;
  var lastC = 0;
  args[0].replace(/%[a-zA-Z%]/g, function(match) {
    if ('%%' === match) return;
    index++;
    if ('%c' === match) {
      // we only are interested in the *last* %c
      // (the user may have provided their own)
      lastC = index;
    }
  });

  args.splice(lastC, 0, c);
}

/**
 * Invokes `console.log()` when available.
 * No-op when `console.log` is not a "function".
 *
 * @api public
 */

function log() {
  // this hackery is required for IE8/9, where
  // the `console.log` function doesn't have 'apply'
  return 'object' === typeof console
    && console.log
    && Function.prototype.apply.call(console.log, console, arguments);
}

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */

function save(namespaces) {
  try {
    if (null == namespaces) {
      exports.storage.removeItem('debug');
    } else {
      exports.storage.debug = namespaces;
    }
  } catch(e) {}
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */

function load() {
  var r;
  try {
    r = exports.storage.debug;
  } catch(e) {}

  // If debug isn't set in LS, and we're in Electron, try to load $DEBUG
  if (!r && typeof process !== 'undefined' && 'env' in process) {
    r = process.env.DEBUG;
  }

  return r;
}

/**
 * Enable namespaces listed in `localStorage.debug` initially.
 */

exports.enable(load());

/**
 * Localstorage attempts to return the localstorage.
 *
 * This is necessary because safari throws
 * when a user disables cookies/localstorage
 * and you attempt to access it.
 *
 * @return {LocalStorage}
 * @api private
 */

function localstorage() {
  try {
    return window.localStorage;
  } catch (e) {}
}

/**
 * This is the common logic for both the Node.js and web browser
 * implementations of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = createDebug.debug = createDebug['default'] = createDebug;
exports.coerce = coerce;
exports.disable = disable;
exports.enable = enable;
exports.enabled = enabled;
exports.humanize = require('ms');

/**
 * The currently active debug mode names, and names to skip.
 */

exports.names = [];
exports.skips = [];

/**
 * Map of special "%n" handling functions, for the debug "format" argument.
 *
 * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
 */

exports.formatters = {};

/**
 * Previous log timestamp.
 */

var prevTime;

/**
 * Select a color.
 * @param {String} namespace
 * @return {Number}
 * @api private
 */

function selectColor(namespace) {
  var hash = 0, i;

  for (i in namespace) {
    hash  = ((hash << 5) - hash) + namespace.charCodeAt(i);
    hash |= 0; // Convert to 32bit integer
  }

  return exports.colors[Math.abs(hash) % exports.colors.length];
}

/**
 * Create a debugger with the given `namespace`.
 *
 * @param {String} namespace
 * @return {Function}
 * @api public
 */

function createDebug(namespace) {

  function debug() {
    // disabled?
    if (!debug.enabled) return;

    var self = debug;

    // set `diff` timestamp
    var curr = +new Date();
    var ms = curr - (prevTime || curr);
    self.diff = ms;
    self.prev = prevTime;
    self.curr = curr;
    prevTime = curr;

    // turn the `arguments` into a proper Array
    var args = new Array(arguments.length);
    for (var i = 0; i < args.length; i++) {
      args[i] = arguments[i];
    }

    args[0] = exports.coerce(args[0]);

    if ('string' !== typeof args[0]) {
      // anything else let's inspect with %O
      args.unshift('%O');
    }

    // apply any `formatters` transformations
    var index = 0;
    args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {
      // if we encounter an escaped % then don't increase the array index
      if (match === '%%') return match;
      index++;
      var formatter = exports.formatters[format];
      if ('function' === typeof formatter) {
        var val = args[index];
        match = formatter.call(self, val);

        // now we need to remove `args[index]` since it's inlined in the `format`
        args.splice(index, 1);
        index--;
      }
      return match;
    });

    // apply env-specific formatting (colors, etc.)
    exports.formatArgs.call(self, args);

    var logFn = debug.log || exports.log || console.log.bind(console);
    logFn.apply(self, args);
  }

  debug.namespace = namespace;
  debug.enabled = exports.enabled(namespace);
  debug.useColors = exports.useColors();
  debug.color = selectColor(namespace);

  // env-specific initialization logic for debug instances
  if ('function' === typeof exports.init) {
    exports.init(debug);
  }

  return debug;
}

/**
 * Enables a debug mode by namespaces. This can include modes
 * separated by a colon and wildcards.
 *
 * @param {String} namespaces
 * @api public
 */

function enable(namespaces) {
  exports.save(namespaces);

  exports.names = [];
  exports.skips = [];

  var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
  var len = split.length;

  for (var i = 0; i < len; i++) {
    if (!split[i]) continue; // ignore empty strings
    namespaces = split[i].replace(/\*/g, '.*?');
    if (namespaces[0] === '-') {
      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
    } else {
      exports.names.push(new RegExp('^' + namespaces + '$'));
    }
  }
}

/**
 * Disable debug output.
 *
 * @api public
 */

function disable() {
  exports.enable('');
}

/**
 * Returns true if the given mode name is enabled, false otherwise.
 *
 * @param {String} name
 * @return {Boolean}
 * @api public
 */

function enabled(name) {
  var i, len;
  for (i = 0, len = exports.skips.length; i < len; i++) {
    if (exports.skips[i].test(name)) {
      return false;
    }
  }
  for (i = 0, len = exports.names.length; i < len; i++) {
    if (exports.names[i].test(name)) {
      return true;
    }
  }
  return false;
}

/**
 * Coerce `val`.
 *
 * @param {Mixed} val
 * @return {Mixed}
 * @api private
 */

function coerce(val) {
  if (val instanceof Error) return val.stack || val.message;
  return val;
}
/**
 * Detect Electron renderer process, which is node, but we should
 * treat as a browser.
 */

if (typeof process !== 'undefined' && process.type === 'renderer') {
  module.exports = require('./browser.js');
} else {
  module.exports = require('./node.js');
}
module.exports = inspectorLog;

// black hole
const nullStream = new (require('stream').Writable)();
nullStream._write = () => {};

/**
 * Outputs a `console.log()` to the Node.js Inspector console *only*.
 */
function inspectorLog() {
  const stdout = console._stdout;
  console._stdout = nullStream;
  console.log.apply(console, arguments);
  console._stdout = stdout;
}
/**
 * Module dependencies.
 */

var tty = require('tty');
var util = require('util');

/**
 * This is the Node.js implementation of `debug()`.
 *
 * Expose `debug()` as the module.
 */

exports = module.exports = require('./debug');
exports.init = init;
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
exports.load = load;
exports.useColors = useColors;

/**
 * Colors.
 */

exports.colors = [6, 2, 3, 4, 5, 1];

/**
 * Build up the default `inspectOpts` object from the environment variables.
 *
 *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
 */

exports.inspectOpts = Object.keys(process.env).filter(function (key) {
  return /^debug_/i.test(key);
}).reduce(function (obj, key) {
  // camel-case
  var prop = key
    .substring(6)
    .toLowerCase()
    .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() });

  // coerce string value into JS value
  var val = process.env[key];
  if (/^(yes|on|true|enabled)$/i.test(val)) val = true;
  else if (/^(no|off|false|disabled)$/i.test(val)) val = false;
  else if (val === 'null') val = null;
  else val = Number(val);

  obj[prop] = val;
  return obj;
}, {});

/**
 * The file descriptor to write the `debug()` calls to.
 * Set the `DEBUG_FD` env variable to override with another value. i.e.:
 *
 *   $ DEBUG_FD=3 node script.js 3>debug.log
 */

var fd = parseInt(process.env.DEBUG_FD, 10) || 2;

if (1 !== fd && 2 !== fd) {
  util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')()
}

var stream = 1 === fd ? process.stdout :
             2 === fd ? process.stderr :
             createWritableStdioStream(fd);

/**
 * Is stdout a TTY? Colored output is enabled when `true`.
 */

function useColors() {
  return 'colors' in exports.inspectOpts
    ? Boolean(exports.inspectOpts.colors)
    : tty.isatty(fd);
}

/**
 * Map %o to `util.inspect()`, all on a single line.
 */

exports.formatters.o = function(v) {
  this.inspectOpts.colors = this.useColors;
  return util.inspect(v, this.inspectOpts)
    .split('\n').map(function(str) {
      return str.trim()
    }).join(' ');
};

/**
 * Map %o to `util.inspect()`, allowing multiple lines if needed.
 */

exports.formatters.O = function(v) {
  this.inspectOpts.colors = this.useColors;
  return util.inspect(v, this.inspectOpts);
};

/**
 * Adds ANSI color escape codes if enabled.
 *
 * @api public
 */

function formatArgs(args) {
  var name = this.namespace;
  var useColors = this.useColors;

  if (useColors) {
    var c = this.color;
    var prefix = '  \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m';

    args[0] = prefix + args[0].split('\n').join('\n' + prefix);
    args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m');
  } else {
    args[0] = new Date().toUTCString()
      + ' ' + name + ' ' + args[0];
  }
}

/**
 * Invokes `util.format()` with the specified arguments and writes to `stream`.
 */

function log() {
  return stream.write(util.format.apply(util, arguments) + '\n');
}

/**
 * Save `namespaces`.
 *
 * @param {String} namespaces
 * @api private
 */

function save(namespaces) {
  if (null == namespaces) {
    // If you set a process.env field to null or undefined, it gets cast to the
    // string 'null' or 'undefined'. Just delete instead.
    delete process.env.DEBUG;
  } else {
    process.env.DEBUG = namespaces;
  }
}

/**
 * Load `namespaces`.
 *
 * @return {String} returns the previously persisted debug modes
 * @api private
 */

function load() {
  return process.env.DEBUG;
}

/**
 * Copied from `node/src/node.js`.
 *
 * XXX: It's lame that node doesn't expose this API out-of-the-box. It also
 * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame.
 */

function createWritableStdioStream (fd) {
  var stream;
  var tty_wrap = process.binding('tty_wrap');

  // Note stream._type is used for test-module-load-list.js

  switch (tty_wrap.guessHandleType(fd)) {
    case 'TTY':
      stream = new tty.WriteStream(fd);
      stream._type = 'tty';

      // Hack to have stream not keep the event loop alive.
      // See https://github.com/joyent/node/issues/1726
      if (stream._handle && stream._handle.unref) {
        stream._handle.unref();
      }
      break;

    case 'FILE':
      var fs = require('fs');
      stream = new fs.SyncWriteStream(fd, { autoClose: false });
      stream._type = 'fs';
      break;

    case 'PIPE':
    case 'TCP':
      var net = require('net');
      stream = new net.Socket({
        fd: fd,
        readable: false,
        writable: true
      });

      // FIXME Should probably have an option in net.Socket to create a
      // stream from an existing fd which is writable only. But for now
      // we'll just add this hack and set the `readable` member to false.
      // Test: ./node test/fixtures/echo.js < /etc/passwd
      stream.readable = false;
      stream.read = null;
      stream._type = 'pipe';

      // FIXME Hack to have stream not keep the event loop alive.
      // See https://github.com/joyent/node/issues/1726
      if (stream._handle && stream._handle.unref) {
        stream._handle.unref();
      }
      break;

    default:
      // Probably an error on in uv_guess_handle()
      throw new Error('Implement me. Unknown stream file type!');
  }

  // For supporting legacy API we put the FD here.
  stream.fd = fd;

  stream._isStdio = true;

  return stream;
}

/**
 * Init logic for `debug` instances.
 *
 * Create a new `inspectOpts` object in case `useColors` is set
 * differently for a particular `debug` instance.
 */

function init (debug) {
  debug.inspectOpts = {};

  var keys = Object.keys(exports.inspectOpts);
  for (var i = 0; i < keys.length; i++) {
    debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
  }
}

/**
 * Enable namespaces listed in `process.env.DEBUG` initially.
 */

exports.enable(load());
/**
 * Helpers.
 */

var s = 1000;
var m = s * 60;
var h = m * 60;
var d = h * 24;
var w = d * 7;
var y = d * 365.25;

/**
 * Parse or format the given `val`.
 *
 * Options:
 *
 *  - `long` verbose formatting [false]
 *
 * @param {String|Number} val
 * @param {Object} [options]
 * @throws {Error} throw an error if val is not a non-empty string or a number
 * @return {String|Number}
 * @api public
 */

module.exports = function (val, options) {
  options = options || {};
  var type = typeof val;
  if (type === 'string' && val.length > 0) {
    return parse(val);
  } else if (type === 'number' && isFinite(val)) {
    return options.long ? fmtLong(val) : fmtShort(val);
  }
  throw new Error(
    'val is not a non-empty string or a valid number. val=' +
      JSON.stringify(val)
  );
};

/**
 * Parse the given `str` and return milliseconds.
 *
 * @param {String} str
 * @return {Number}
 * @api private
 */

function parse(str) {
  str = String(str);
  if (str.length > 100) {
    return;
  }
  var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(
    str
  );
  if (!match) {
    return;
  }
  var n = parseFloat(match[1]);
  var type = (match[2] || 'ms').toLowerCase();
  switch (type) {
    case 'years':
    case 'year':
    case 'yrs':
    case 'yr':
    case 'y':
      return n * y;
    case 'weeks':
    case 'week':
    case 'w':
      return n * w;
    case 'days':
    case 'day':
    case 'd':
      return n * d;
    case 'hours':
    case 'hour':
    case 'hrs':
    case 'hr':
    case 'h':
      return n * h;
    case 'minutes':
    case 'minute':
    case 'mins':
    case 'min':
    case 'm':
      return n * m;
    case 'seconds':
    case 'second':
    case 'secs':
    case 'sec':
    case 's':
      return n * s;
    case 'milliseconds':
    case 'millisecond':
    case 'msecs':
    case 'msec':
    case 'ms':
      return n;
    default:
      return undefined;
  }
}

/**
 * Short format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtShort(ms) {
  var msAbs = Math.abs(ms);
  if (msAbs >= d) {
    return Math.round(ms / d) + 'd';
  }
  if (msAbs >= h) {
    return Math.round(ms / h) + 'h';
  }
  if (msAbs >= m) {
    return Math.round(ms / m) + 'm';
  }
  if (msAbs >= s) {
    return Math.round(ms / s) + 's';
  }
  return ms + 'ms';
}

/**
 * Long format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtLong(ms) {
  var msAbs = Math.abs(ms);
  if (msAbs >= d) {
    return plural(ms, msAbs, d, 'day');
  }
  if (msAbs >= h) {
    return plural(ms, msAbs, h, 'hour');
  }
  if (msAbs >= m) {
    return plural(ms, msAbs, m, 'minute');
  }
  if (msAbs >= s) {
    return plural(ms, msAbs, s, 'second');
  }
  return ms + ' ms';
}

/**
 * Pluralization helper.
 */

function plural(ms, msAbs, n, name) {
  var isPlural = msAbs >= n * 1.5;
  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
}
The MIT License (MIT)

Copyright (c) 2020 Vercel, Inc.

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": "ms",
  "version": "2.1.3",
  "description": "Tiny millisecond conversion utility",
  "repository": "vercel/ms",
  "main": "./index",
  "files": [
    "index.js"
  ],
  "lint-staged": {
    "*.js": [
      "npm run lint",
      "prettier --single-quote --write",
      "git add"
    ]
  },
  "license": "MIT",
  "devDependencies": {
    "eslint": "4.18.2",
    "expect.js": "0.3.1",
    "husky": "0.14.3",
    "lint-staged": "5.0.0",
    "mocha": "4.0.1",
    "prettier": "2.0.5"
  }
}# Contributing

Please feel free to file GitHub Issues or propose Pull Requests. We're always happy to discuss improvements to this library!

## Testing

```shell
npm test
```

## Releasing

Releases are supposed to be done from master, version bumping is automated through [`standard-version`](https://github.com/conventional-changelog/standard-version):

```shell
npm run release -- --dry-run  # verify output manually
npm run release               # follow the instructions from the output of this command
```
The MIT License (MIT)

Copyright (c) 2010-2020 Robert Kieffer and other contributors

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

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

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "name": "uuid",
  "version": "8.3.2",
  "description": "RFC4122 (v1, v4, and v5) UUIDs",
  "commitlint": {
    "extends": [
      "@commitlint/config-conventional"
    ]
  },
  "license": "MIT",
  "bin": {
    "uuid": "./dist/bin/uuid"
  },
  "sideEffects": false,
  "main": "./dist/index.js",
  "exports": {
    ".": {
      "node": {
        "module": "./dist/esm-node/index.js",
        "require": "./dist/index.js",
        "import": "./wrapper.mjs"
      },
      "default": "./dist/esm-browser/index.js"
    },
    "./package.json": "./package.json"
  },
  "module": "./dist/esm-node/index.js",
  "browser": {
    "./dist/md5.js": "./dist/md5-browser.js",
    "./dist/rng.js": "./dist/rng-browser.js",
    "./dist/sha1.js": "./dist/sha1-browser.js",
    "./dist/esm-node/index.js": "./dist/esm-browser/index.js"
  },
  "files": [
    "CHANGELOG.md",
    "CONTRIBUTING.md",
    "LICENSE.md",
    "README.md",
    "dist",
    "wrapper.mjs"
  ],
  "devDependencies": {
    "@babel/cli": "7.11.6",
    "@babel/core": "7.11.6",
    "@babel/preset-env": "7.11.5",
    "@commitlint/cli": "11.0.0",
    "@commitlint/config-conventional": "11.0.0",
    "@rollup/plugin-node-resolve": "9.0.0",
    "babel-eslint": "10.1.0",
    "bundlewatch": "0.3.1",
    "eslint": "7.10.0",
    "eslint-config-prettier": "6.12.0",
    "eslint-config-standard": "14.1.1",
    "eslint-plugin-import": "2.22.1",
    "eslint-plugin-node": "11.1.0",
    "eslint-plugin-prettier": "3.1.4",
    "eslint-plugin-promise": "4.2.1",
    "eslint-plugin-standard": "4.0.1",
    "husky": "4.3.0",
    "jest": "25.5.4",
    "lint-staged": "10.4.0",
    "npm-run-all": "4.1.5",
    "optional-dev-dependency": "2.0.1",
    "prettier": "2.1.2",
    "random-seed": "0.3.0",
    "rollup": "2.28.2",
    "rollup-plugin-terser": "7.0.2",
    "runmd": "1.3.2",
    "standard-version": "9.0.0"
  },
  "optionalDevDependencies": {
    "@wdio/browserstack-service": "6.4.0",
    "@wdio/cli": "6.4.0",
    "@wdio/jasmine-framework": "6.4.0",
    "@wdio/local-runner": "6.4.0",
    "@wdio/spec-reporter": "6.4.0",
    "@wdio/static-server-service": "6.4.0",
    "@wdio/sync": "6.4.0"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/uuidjs/uuid.git"
  },
  "husky": {
    "hooks": {
      "commit-msg": "commitlint -E HUSKY_GIT_PARAMS",
      "pre-commit": "lint-staged"
    }
  },
  "lint-staged": {
    "*.{js,jsx,json,md}": [
      "prettier --write"
    ],
    "*.{js,jsx}": [
      "eslint --fix"
    ]
  },
  "standard-version": {
    "scripts": {
      "postchangelog": "prettier --write CHANGELOG.md"
    }
  }
}import uuid from './dist/index.js';
export const v1 = uuid.v1;
export const v3 = uuid.v3;
export const v4 = uuid.v4;
export const v5 = uuid.v5;
export const NIL = uuid.NIL;
export const version = uuid.version;
export const validate = uuid.validate;
export const stringify = uuid.stringify;
export const parse = uuid.parse;
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
Object.defineProperty(exports, "v1", {
  enumerable: true,
  get: function () {
    return _v.default;
  }
});
Object.defineProperty(exports, "v3", {
  enumerable: true,
  get: function () {
    return _v2.default;
  }
});
Object.defineProperty(exports, "v4", {
  enumerable: true,
  get: function () {
    return _v3.default;
  }
});
Object.defineProperty(exports, "v5", {
  enumerable: true,
  get: function () {
    return _v4.default;
  }
});
Object.defineProperty(exports, "NIL", {
  enumerable: true,
  get: function () {
    return _nil.default;
  }
});
Object.defineProperty(exports, "version", {
  enumerable: true,
  get: function () {
    return _version.default;
  }
});
Object.defineProperty(exports, "validate", {
  enumerable: true,
  get: function () {
    return _validate.default;
  }
});
Object.defineProperty(exports, "stringify", {
  enumerable: true,
  get: function () {
    return _stringify.default;
  }
});
Object.defineProperty(exports, "parse", {
  enumerable: true,
  get: function () {
    return _parse.default;
  }
});

var _v = _interopRequireDefault(require("./v1.js"));

var _v2 = _interopRequireDefault(require("./v3.js"));

var _v3 = _interopRequireDefault(require("./v4.js"));

var _v4 = _interopRequireDefault(require("./v5.js"));

var _nil = _interopRequireDefault(require("./nil.js"));

var _version = _interopRequireDefault(require("./version.js"));

var _validate = _interopRequireDefault(require("./validate.js"));

var _stringify = _interopRequireDefault(require("./stringify.js"));

var _parse = _interopRequireDefault(require("./parse.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/*
 * Browser-compatible JavaScript MD5
 *
 * Modification of JavaScript MD5
 * https://github.com/blueimp/JavaScript-MD5
 *
 * Copyright 2011, Sebastian Tschan
 * https://blueimp.net
 *
 * Licensed under the MIT license:
 * https://opensource.org/licenses/MIT
 *
 * Based on
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 */
function md5(bytes) {
  if (typeof bytes === 'string') {
    const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape

    bytes = new Uint8Array(msg.length);

    for (let i = 0; i < msg.length; ++i) {
      bytes[i] = msg.charCodeAt(i);
    }
  }

  return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));
}
/*
 * Convert an array of little-endian words to an array of bytes
 */


function md5ToHexEncodedArray(input) {
  const output = [];
  const length32 = input.length * 32;
  const hexTab = '0123456789abcdef';

  for (let i = 0; i < length32; i += 8) {
    const x = input[i >> 5] >>> i % 32 & 0xff;
    const hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);
    output.push(hex);
  }

  return output;
}
/**
 * Calculate output length with padding and bit length
 */


function getOutputLength(inputLength8) {
  return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;
}
/*
 * Calculate the MD5 of an array of little-endian words, and a bit length.
 */


function wordsToMd5(x, len) {
  /* append padding */
  x[len >> 5] |= 0x80 << len % 32;
  x[getOutputLength(len) - 1] = len;
  let a = 1732584193;
  let b = -271733879;
  let c = -1732584194;
  let d = 271733878;

  for (let i = 0; i < x.length; i += 16) {
    const olda = a;
    const oldb = b;
    const oldc = c;
    const oldd = d;
    a = md5ff(a, b, c, d, x[i], 7, -680876936);
    d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);
    c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);
    b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
    a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);
    d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
    c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
    b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);
    a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
    d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
    c = md5ff(c, d, a, b, x[i + 10], 17, -42063);
    b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
    a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
    d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);
    c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
    b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
    a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);
    d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
    c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);
    b = md5gg(b, c, d, a, x[i], 20, -373897302);
    a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);
    d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);
    c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);
    b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);
    a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);
    d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
    c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);
    b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
    a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
    d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);
    c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
    b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
    a = md5hh(a, b, c, d, x[i + 5], 4, -378558);
    d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
    c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
    b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);
    a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
    d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
    c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);
    b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
    a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);
    d = md5hh(d, a, b, c, x[i], 11, -358537222);
    c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);
    b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);
    a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);
    d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);
    c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);
    b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);
    a = md5ii(a, b, c, d, x[i], 6, -198630844);
    d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
    c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
    b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);
    a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
    d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
    c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);
    b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
    a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
    d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);
    c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
    b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
    a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);
    d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
    c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);
    b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);
    a = safeAdd(a, olda);
    b = safeAdd(b, oldb);
    c = safeAdd(c, oldc);
    d = safeAdd(d, oldd);
  }

  return [a, b, c, d];
}
/*
 * Convert an array bytes to an array of little-endian words
 * Characters >255 have their high-byte silently ignored.
 */


function bytesToWords(input) {
  if (input.length === 0) {
    return [];
  }

  const length8 = input.length * 8;
  const output = new Uint32Array(getOutputLength(length8));

  for (let i = 0; i < length8; i += 8) {
    output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;
  }

  return output;
}
/*
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
 * to work around bugs in some JS interpreters.
 */


function safeAdd(x, y) {
  const lsw = (x & 0xffff) + (y & 0xffff);
  const msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return msw << 16 | lsw & 0xffff;
}
/*
 * Bitwise rotate a 32-bit number to the left.
 */


function bitRotateLeft(num, cnt) {
  return num << cnt | num >>> 32 - cnt;
}
/*
 * These functions implement the four basic operations the algorithm uses.
 */


function md5cmn(q, a, b, x, s, t) {
  return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);
}

function md5ff(a, b, c, d, x, s, t) {
  return md5cmn(b & c | ~b & d, a, b, x, s, t);
}

function md5gg(a, b, c, d, x, s, t) {
  return md5cmn(b & d | c & ~d, a, b, x, s, t);
}

function md5hh(a, b, c, d, x, s, t) {
  return md5cmn(b ^ c ^ d, a, b, x, s, t);
}

function md5ii(a, b, c, d, x, s, t) {
  return md5cmn(c ^ (b | ~d), a, b, x, s, t);
}

var _default = md5;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _crypto = _interopRequireDefault(require("crypto"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function md5(bytes) {
  if (Array.isArray(bytes)) {
    bytes = Buffer.from(bytes);
  } else if (typeof bytes === 'string') {
    bytes = Buffer.from(bytes, 'utf8');
  }

  return _crypto.default.createHash('md5').update(bytes).digest();
}

var _default = md5;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var _default = '00000000-0000-0000-0000-000000000000';
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _validate = _interopRequireDefault(require("./validate.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function parse(uuid) {
  if (!(0, _validate.default)(uuid)) {
    throw TypeError('Invalid UUID');
  }

  let v;
  const arr = new Uint8Array(16); // Parse ########-....-....-....-............

  arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;
  arr[1] = v >>> 16 & 0xff;
  arr[2] = v >>> 8 & 0xff;
  arr[3] = v & 0xff; // Parse ........-####-....-....-............

  arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;
  arr[5] = v & 0xff; // Parse ........-....-####-....-............

  arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;
  arr[7] = v & 0xff; // Parse ........-....-....-####-............

  arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;
  arr[9] = v & 0xff; // Parse ........-....-....-....-############
  // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes)

  arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;
  arr[11] = v / 0x100000000 & 0xff;
  arr[12] = v >>> 24 & 0xff;
  arr[13] = v >>> 16 & 0xff;
  arr[14] = v >>> 8 & 0xff;
  arr[15] = v & 0xff;
  return arr;
}

var _default = parse;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var _default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = rng;
// Unique ID creation requires a high quality random # generator. In the browser we therefore
// require the crypto API and do not support built-in fallback to lower quality random number
// generators (like Math.random()).
let getRandomValues;
const rnds8 = new Uint8Array(16);

function rng() {
  // lazy load so that environments that need to polyfill have a chance to do so
  if (!getRandomValues) {
    // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. Also,
    // find the complete implementation of crypto (msCrypto) on IE11.
    getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);

    if (!getRandomValues) {
      throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');
    }
  }

  return getRandomValues(rnds8);
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = rng;

var _crypto = _interopRequireDefault(require("crypto"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate

let poolPtr = rnds8Pool.length;

function rng() {
  if (poolPtr > rnds8Pool.length - 16) {
    _crypto.default.randomFillSync(rnds8Pool);

    poolPtr = 0;
  }

  return rnds8Pool.slice(poolPtr, poolPtr += 16);
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

// Adapted from Chris Veness' SHA1 code at
// http://www.movable-type.co.uk/scripts/sha1.html
function f(s, x, y, z) {
  switch (s) {
    case 0:
      return x & y ^ ~x & z;

    case 1:
      return x ^ y ^ z;

    case 2:
      return x & y ^ x & z ^ y & z;

    case 3:
      return x ^ y ^ z;
  }
}

function ROTL(x, n) {
  return x << n | x >>> 32 - n;
}

function sha1(bytes) {
  const K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];
  const H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];

  if (typeof bytes === 'string') {
    const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape

    bytes = [];

    for (let i = 0; i < msg.length; ++i) {
      bytes.push(msg.charCodeAt(i));
    }
  } else if (!Array.isArray(bytes)) {
    // Convert Array-like to Array
    bytes = Array.prototype.slice.call(bytes);
  }

  bytes.push(0x80);
  const l = bytes.length / 4 + 2;
  const N = Math.ceil(l / 16);
  const M = new Array(N);

  for (let i = 0; i < N; ++i) {
    const arr = new Uint32Array(16);

    for (let j = 0; j < 16; ++j) {
      arr[j] = bytes[i * 64 + j * 4] << 24 | bytes[i * 64 + j * 4 + 1] << 16 | bytes[i * 64 + j * 4 + 2] << 8 | bytes[i * 64 + j * 4 + 3];
    }

    M[i] = arr;
  }

  M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);
  M[N - 1][14] = Math.floor(M[N - 1][14]);
  M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;

  for (let i = 0; i < N; ++i) {
    const W = new Uint32Array(80);

    for (let t = 0; t < 16; ++t) {
      W[t] = M[i][t];
    }

    for (let t = 16; t < 80; ++t) {
      W[t] = ROTL(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1);
    }

    let a = H[0];
    let b = H[1];
    let c = H[2];
    let d = H[3];
    let e = H[4];

    for (let t = 0; t < 80; ++t) {
      const s = Math.floor(t / 20);
      const T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[t] >>> 0;
      e = d;
      d = c;
      c = ROTL(b, 30) >>> 0;
      b = a;
      a = T;
    }

    H[0] = H[0] + a >>> 0;
    H[1] = H[1] + b >>> 0;
    H[2] = H[2] + c >>> 0;
    H[3] = H[3] + d >>> 0;
    H[4] = H[4] + e >>> 0;
  }

  return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];
}

var _default = sha1;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _crypto = _interopRequireDefault(require("crypto"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function sha1(bytes) {
  if (Array.isArray(bytes)) {
    bytes = Buffer.from(bytes);
  } else if (typeof bytes === 'string') {
    bytes = Buffer.from(bytes, 'utf8');
  }

  return _crypto.default.createHash('sha1').update(bytes).digest();
}

var _default = sha1;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _validate = _interopRequireDefault(require("./validate.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/**
 * Convert array of 16 byte values to UUID string format of the form:
 * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
 */
const byteToHex = [];

for (let i = 0; i < 256; ++i) {
  byteToHex.push((i + 0x100).toString(16).substr(1));
}

function stringify(arr, offset = 0) {
  // Note: Be careful editing this code!  It's been tuned for performance
  // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
  const uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID.  If this throws, it's likely due to one
  // of the following:
  // - One or more input array values don't map to a hex octet (leading to
  // "undefined" in the uuid)
  // - Invalid input values for the RFC `version` or `variant` fields

  if (!(0, _validate.default)(uuid)) {
    throw TypeError('Stringified UUID is invalid');
  }

  return uuid;
}

var _default = stringify;
exports.default = _default;"use strict";

var _assert = _interopRequireDefault(require("assert"));

var _v = _interopRequireDefault(require("./v1.js"));

var _v2 = _interopRequireDefault(require("./v3.js"));

var _v3 = _interopRequireDefault(require("./v4.js"));

var _v4 = _interopRequireDefault(require("./v5.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function usage() {
  console.log('Usage:');
  console.log('  uuid');
  console.log('  uuid v1');
  console.log('  uuid v3 <name> <namespace uuid>');
  console.log('  uuid v4');
  console.log('  uuid v5 <name> <namespace uuid>');
  console.log('  uuid --help');
  console.log('\nNote: <namespace uuid> may be "URL" or "DNS" to use the corresponding UUIDs defined by RFC4122');
}

const args = process.argv.slice(2);

if (args.indexOf('--help') >= 0) {
  usage();
  process.exit(0);
}

const version = args.shift() || 'v4';

switch (version) {
  case 'v1':
    console.log((0, _v.default)());
    break;

  case 'v3':
    {
      const name = args.shift();
      let namespace = args.shift();
      (0, _assert.default)(name != null, 'v3 name not specified');
      (0, _assert.default)(namespace != null, 'v3 namespace not specified');

      if (namespace === 'URL') {
        namespace = _v2.default.URL;
      }

      if (namespace === 'DNS') {
        namespace = _v2.default.DNS;
      }

      console.log((0, _v2.default)(name, namespace));
      break;
    }

  case 'v4':
    console.log((0, _v3.default)());
    break;

  case 'v5':
    {
      const name = args.shift();
      let namespace = args.shift();
      (0, _assert.default)(name != null, 'v5 name not specified');
      (0, _assert.default)(namespace != null, 'v5 namespace not specified');

      if (namespace === 'URL') {
        namespace = _v4.default.URL;
      }

      if (namespace === 'DNS') {
        namespace = _v4.default.DNS;
      }

      console.log((0, _v4.default)(name, namespace));
      break;
    }

  default:
    usage();
    process.exit(1);
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _rng = _interopRequireDefault(require("./rng.js"));

var _stringify = _interopRequireDefault(require("./stringify.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// **`v1()` - Generate time-based UUID**
//
// Inspired by https://github.com/LiosK/UUID.js
// and http://docs.python.org/library/uuid.html
let _nodeId;

let _clockseq; // Previous uuid creation time


let _lastMSecs = 0;
let _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details

function v1(options, buf, offset) {
  let i = buf && offset || 0;
  const b = buf || new Array(16);
  options = options || {};
  let node = options.node || _nodeId;
  let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not
  // specified.  We do this lazily to minimize issues related to insufficient
  // system entropy.  See #189

  if (node == null || clockseq == null) {
    const seedBytes = options.random || (options.rng || _rng.default)();

    if (node == null) {
      // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
      node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];
    }

    if (clockseq == null) {
      // Per 4.2.2, randomize (14 bit) clockseq
      clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
    }
  } // UUID timestamps are 100 nano-second units since the Gregorian epoch,
  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so
  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.


  let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock
  // cycle to simulate higher resolution clock

  let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)

  const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression

  if (dt < 0 && options.clockseq === undefined) {
    clockseq = clockseq + 1 & 0x3fff;
  } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
  // time interval


  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
    nsecs = 0;
  } // Per 4.2.1.2 Throw error if too many uuids are requested


  if (nsecs >= 10000) {
    throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
  }

  _lastMSecs = msecs;
  _lastNSecs = nsecs;
  _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch

  msecs += 12219292800000; // `time_low`

  const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
  b[i++] = tl >>> 24 & 0xff;
  b[i++] = tl >>> 16 & 0xff;
  b[i++] = tl >>> 8 & 0xff;
  b[i++] = tl & 0xff; // `time_mid`

  const tmh = msecs / 0x100000000 * 10000 & 0xfffffff;
  b[i++] = tmh >>> 8 & 0xff;
  b[i++] = tmh & 0xff; // `time_high_and_version`

  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version

  b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)

  b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`

  b[i++] = clockseq & 0xff; // `node`

  for (let n = 0; n < 6; ++n) {
    b[i + n] = node[n];
  }

  return buf || (0, _stringify.default)(b);
}

var _default = v1;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _v = _interopRequireDefault(require("./v35.js"));

var _md = _interopRequireDefault(require("./md5.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const v3 = (0, _v.default)('v3', 0x30, _md.default);
var _default = v3;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = _default;
exports.URL = exports.DNS = void 0;

var _stringify = _interopRequireDefault(require("./stringify.js"));

var _parse = _interopRequireDefault(require("./parse.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function stringToBytes(str) {
  str = unescape(encodeURIComponent(str)); // UTF8 escape

  const bytes = [];

  for (let i = 0; i < str.length; ++i) {
    bytes.push(str.charCodeAt(i));
  }

  return bytes;
}

const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
exports.DNS = DNS;
const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
exports.URL = URL;

function _default(name, version, hashfunc) {
  function generateUUID(value, namespace, buf, offset) {
    if (typeof value === 'string') {
      value = stringToBytes(value);
    }

    if (typeof namespace === 'string') {
      namespace = (0, _parse.default)(namespace);
    }

    if (namespace.length !== 16) {
      throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');
    } // Compute hash of namespace and value, Per 4.3
    // Future: Use spread syntax when supported on all platforms, e.g. `bytes =
    // hashfunc([...namespace, ... value])`


    let bytes = new Uint8Array(16 + value.length);
    bytes.set(namespace);
    bytes.set(value, namespace.length);
    bytes = hashfunc(bytes);
    bytes[6] = bytes[6] & 0x0f | version;
    bytes[8] = bytes[8] & 0x3f | 0x80;

    if (buf) {
      offset = offset || 0;

      for (let i = 0; i < 16; ++i) {
        buf[offset + i] = bytes[i];
      }

      return buf;
    }

    return (0, _stringify.default)(bytes);
  } // Function#name is not settable on some platforms (#270)


  try {
    generateUUID.name = name; // eslint-disable-next-line no-empty
  } catch (err) {} // For CommonJS default export support


  generateUUID.DNS = DNS;
  generateUUID.URL = URL;
  return generateUUID;
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _rng = _interopRequireDefault(require("./rng.js"));

var _stringify = _interopRequireDefault(require("./stringify.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function v4(options, buf, offset) {
  options = options || {};

  const rnds = options.random || (options.rng || _rng.default)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`


  rnds[6] = rnds[6] & 0x0f | 0x40;
  rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided

  if (buf) {
    offset = offset || 0;

    for (let i = 0; i < 16; ++i) {
      buf[offset + i] = rnds[i];
    }

    return buf;
  }

  return (0, _stringify.default)(rnds);
}

var _default = v4;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _v = _interopRequireDefault(require("./v35.js"));

var _sha = _interopRequireDefault(require("./sha1.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const v5 = (0, _v.default)('v5', 0x50, _sha.default);
var _default = v5;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _regex = _interopRequireDefault(require("./regex.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function validate(uuid) {
  return typeof uuid === 'string' && _regex.default.test(uuid);
}

var _default = validate;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _validate = _interopRequireDefault(require("./validate.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function version(uuid) {
  if (!(0, _validate.default)(uuid)) {
    throw TypeError('Invalid UUID');
  }

  return parseInt(uuid.substr(14, 1), 16);
}

var _default = version;
exports.default = _default;!function(r,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((r="undefined"!=typeof globalThis?globalThis:r||self).uuid={})}(this,(function(r){"use strict";var e,n=new Uint8Array(16);function t(){if(!e&&!(e="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return e(n)}var o=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function a(r){return"string"==typeof r&&o.test(r)}for(var i,u,f=[],s=0;s<256;++s)f.push((s+256).toString(16).substr(1));function c(r){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(f[r[e+0]]+f[r[e+1]]+f[r[e+2]]+f[r[e+3]]+"-"+f[r[e+4]]+f[r[e+5]]+"-"+f[r[e+6]]+f[r[e+7]]+"-"+f[r[e+8]]+f[r[e+9]]+"-"+f[r[e+10]]+f[r[e+11]]+f[r[e+12]]+f[r[e+13]]+f[r[e+14]]+f[r[e+15]]).toLowerCase();if(!a(n))throw TypeError("Stringified UUID is invalid");return n}var l=0,d=0;function v(r){if(!a(r))throw TypeError("Invalid UUID");var e,n=new Uint8Array(16);return n[0]=(e=parseInt(r.slice(0,8),16))>>>24,n[1]=e>>>16&255,n[2]=e>>>8&255,n[3]=255&e,n[4]=(e=parseInt(r.slice(9,13),16))>>>8,n[5]=255&e,n[6]=(e=parseInt(r.slice(14,18),16))>>>8,n[7]=255&e,n[8]=(e=parseInt(r.slice(19,23),16))>>>8,n[9]=255&e,n[10]=(e=parseInt(r.slice(24,36),16))/1099511627776&255,n[11]=e/4294967296&255,n[12]=e>>>24&255,n[13]=e>>>16&255,n[14]=e>>>8&255,n[15]=255&e,n}function p(r,e,n){function t(r,t,o,a){if("string"==typeof r&&(r=function(r){r=unescape(encodeURIComponent(r));for(var e=[],n=0;n<r.length;++n)e.push(r.charCodeAt(n));return e}(r)),"string"==typeof t&&(t=v(t)),16!==t.length)throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");var i=new Uint8Array(16+r.length);if(i.set(t),i.set(r,t.length),(i=n(i))[6]=15&i[6]|e,i[8]=63&i[8]|128,o){a=a||0;for(var u=0;u<16;++u)o[a+u]=i[u];return o}return c(i)}try{t.name=r}catch(r){}return t.DNS="6ba7b810-9dad-11d1-80b4-00c04fd430c8",t.URL="6ba7b811-9dad-11d1-80b4-00c04fd430c8",t}function h(r){return 14+(r+64>>>9<<4)+1}function y(r,e){var n=(65535&r)+(65535&e);return(r>>16)+(e>>16)+(n>>16)<<16|65535&n}function g(r,e,n,t,o,a){return y((i=y(y(e,r),y(t,a)))<<(u=o)|i>>>32-u,n);var i,u}function m(r,e,n,t,o,a,i){return g(e&n|~e&t,r,e,o,a,i)}function w(r,e,n,t,o,a,i){return g(e&t|n&~t,r,e,o,a,i)}function b(r,e,n,t,o,a,i){return g(e^n^t,r,e,o,a,i)}function A(r,e,n,t,o,a,i){return g(n^(e|~t),r,e,o,a,i)}var U=p("v3",48,(function(r){if("string"==typeof r){var e=unescape(encodeURIComponent(r));r=new Uint8Array(e.length);for(var n=0;n<e.length;++n)r[n]=e.charCodeAt(n)}return function(r){for(var e=[],n=32*r.length,t="0123456789abcdef",o=0;o<n;o+=8){var a=r[o>>5]>>>o%32&255,i=parseInt(t.charAt(a>>>4&15)+t.charAt(15&a),16);e.push(i)}return e}(function(r,e){r[e>>5]|=128<<e%32,r[h(e)-1]=e;for(var n=1732584193,t=-271733879,o=-1732584194,a=271733878,i=0;i<r.length;i+=16){var u=n,f=t,s=o,c=a;n=m(n,t,o,a,r[i],7,-680876936),a=m(a,n,t,o,r[i+1],12,-389564586),o=m(o,a,n,t,r[i+2],17,606105819),t=m(t,o,a,n,r[i+3],22,-1044525330),n=m(n,t,o,a,r[i+4],7,-176418897),a=m(a,n,t,o,r[i+5],12,1200080426),o=m(o,a,n,t,r[i+6],17,-1473231341),t=m(t,o,a,n,r[i+7],22,-45705983),n=m(n,t,o,a,r[i+8],7,1770035416),a=m(a,n,t,o,r[i+9],12,-1958414417),o=m(o,a,n,t,r[i+10],17,-42063),t=m(t,o,a,n,r[i+11],22,-1990404162),n=m(n,t,o,a,r[i+12],7,1804603682),a=m(a,n,t,o,r[i+13],12,-40341101),o=m(o,a,n,t,r[i+14],17,-1502002290),n=w(n,t=m(t,o,a,n,r[i+15],22,1236535329),o,a,r[i+1],5,-165796510),a=w(a,n,t,o,r[i+6],9,-1069501632),o=w(o,a,n,t,r[i+11],14,643717713),t=w(t,o,a,n,r[i],20,-373897302),n=w(n,t,o,a,r[i+5],5,-701558691),a=w(a,n,t,o,r[i+10],9,38016083),o=w(o,a,n,t,r[i+15],14,-660478335),t=w(t,o,a,n,r[i+4],20,-405537848),n=w(n,t,o,a,r[i+9],5,568446438),a=w(a,n,t,o,r[i+14],9,-1019803690),o=w(o,a,n,t,r[i+3],14,-187363961),t=w(t,o,a,n,r[i+8],20,1163531501),n=w(n,t,o,a,r[i+13],5,-1444681467),a=w(a,n,t,o,r[i+2],9,-51403784),o=w(o,a,n,t,r[i+7],14,1735328473),n=b(n,t=w(t,o,a,n,r[i+12],20,-1926607734),o,a,r[i+5],4,-378558),a=b(a,n,t,o,r[i+8],11,-2022574463),o=b(o,a,n,t,r[i+11],16,1839030562),t=b(t,o,a,n,r[i+14],23,-35309556),n=b(n,t,o,a,r[i+1],4,-1530992060),a=b(a,n,t,o,r[i+4],11,1272893353),o=b(o,a,n,t,r[i+7],16,-155497632),t=b(t,o,a,n,r[i+10],23,-1094730640),n=b(n,t,o,a,r[i+13],4,681279174),a=b(a,n,t,o,r[i],11,-358537222),o=b(o,a,n,t,r[i+3],16,-722521979),t=b(t,o,a,n,r[i+6],23,76029189),n=b(n,t,o,a,r[i+9],4,-640364487),a=b(a,n,t,o,r[i+12],11,-421815835),o=b(o,a,n,t,r[i+15],16,530742520),n=A(n,t=b(t,o,a,n,r[i+2],23,-995338651),o,a,r[i],6,-198630844),a=A(a,n,t,o,r[i+7],10,1126891415),o=A(o,a,n,t,r[i+14],15,-1416354905),t=A(t,o,a,n,r[i+5],21,-57434055),n=A(n,t,o,a,r[i+12],6,1700485571),a=A(a,n,t,o,r[i+3],10,-1894986606),o=A(o,a,n,t,r[i+10],15,-1051523),t=A(t,o,a,n,r[i+1],21,-2054922799),n=A(n,t,o,a,r[i+8],6,1873313359),a=A(a,n,t,o,r[i+15],10,-30611744),o=A(o,a,n,t,r[i+6],15,-1560198380),t=A(t,o,a,n,r[i+13],21,1309151649),n=A(n,t,o,a,r[i+4],6,-145523070),a=A(a,n,t,o,r[i+11],10,-1120210379),o=A(o,a,n,t,r[i+2],15,718787259),t=A(t,o,a,n,r[i+9],21,-343485551),n=y(n,u),t=y(t,f),o=y(o,s),a=y(a,c)}return[n,t,o,a]}(function(r){if(0===r.length)return[];for(var e=8*r.length,n=new Uint32Array(h(e)),t=0;t<e;t+=8)n[t>>5]|=(255&r[t/8])<<t%32;return n}(r),8*r.length))}));function I(r,e,n,t){switch(r){case 0:return e&n^~e&t;case 1:return e^n^t;case 2:return e&n^e&t^n&t;case 3:return e^n^t}}function C(r,e){return r<<e|r>>>32-e}var R=p("v5",80,(function(r){var e=[1518500249,1859775393,2400959708,3395469782],n=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof r){var t=unescape(encodeURIComponent(r));r=[];for(var o=0;o<t.length;++o)r.push(t.charCodeAt(o))}else Array.isArray(r)||(r=Array.prototype.slice.call(r));r.push(128);for(var a=r.length/4+2,i=Math.ceil(a/16),u=new Array(i),f=0;f<i;++f){for(var s=new Uint32Array(16),c=0;c<16;++c)s[c]=r[64*f+4*c]<<24|r[64*f+4*c+1]<<16|r[64*f+4*c+2]<<8|r[64*f+4*c+3];u[f]=s}u[i-1][14]=8*(r.length-1)/Math.pow(2,32),u[i-1][14]=Math.floor(u[i-1][14]),u[i-1][15]=8*(r.length-1)&4294967295;for(var l=0;l<i;++l){for(var d=new Uint32Array(80),v=0;v<16;++v)d[v]=u[l][v];for(var p=16;p<80;++p)d[p]=C(d[p-3]^d[p-8]^d[p-14]^d[p-16],1);for(var h=n[0],y=n[1],g=n[2],m=n[3],w=n[4],b=0;b<80;++b){var A=Math.floor(b/20),U=C(h,5)+I(A,y,g,m)+w+e[A]+d[b]>>>0;w=m,m=g,g=C(y,30)>>>0,y=h,h=U}n[0]=n[0]+h>>>0,n[1]=n[1]+y>>>0,n[2]=n[2]+g>>>0,n[3]=n[3]+m>>>0,n[4]=n[4]+w>>>0}return[n[0]>>24&255,n[0]>>16&255,n[0]>>8&255,255&n[0],n[1]>>24&255,n[1]>>16&255,n[1]>>8&255,255&n[1],n[2]>>24&255,n[2]>>16&255,n[2]>>8&255,255&n[2],n[3]>>24&255,n[3]>>16&255,n[3]>>8&255,255&n[3],n[4]>>24&255,n[4]>>16&255,n[4]>>8&255,255&n[4]]}));r.NIL="00000000-0000-0000-0000-000000000000",r.parse=v,r.stringify=c,r.v1=function(r,e,n){var o=e&&n||0,a=e||new Array(16),f=(r=r||{}).node||i,s=void 0!==r.clockseq?r.clockseq:u;if(null==f||null==s){var v=r.random||(r.rng||t)();null==f&&(f=i=[1|v[0],v[1],v[2],v[3],v[4],v[5]]),null==s&&(s=u=16383&(v[6]<<8|v[7]))}var p=void 0!==r.msecs?r.msecs:Date.now(),h=void 0!==r.nsecs?r.nsecs:d+1,y=p-l+(h-d)/1e4;if(y<0&&void 0===r.clockseq&&(s=s+1&16383),(y<0||p>l)&&void 0===r.nsecs&&(h=0),h>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");l=p,d=h,u=s;var g=(1e4*(268435455&(p+=122192928e5))+h)%4294967296;a[o++]=g>>>24&255,a[o++]=g>>>16&255,a[o++]=g>>>8&255,a[o++]=255&g;var m=p/4294967296*1e4&268435455;a[o++]=m>>>8&255,a[o++]=255&m,a[o++]=m>>>24&15|16,a[o++]=m>>>16&255,a[o++]=s>>>8|128,a[o++]=255&s;for(var w=0;w<6;++w)a[o+w]=f[w];return e||c(a)},r.v3=U,r.v4=function(r,e,n){var o=(r=r||{}).random||(r.rng||t)();if(o[6]=15&o[6]|64,o[8]=63&o[8]|128,e){n=n||0;for(var a=0;a<16;++a)e[n+a]=o[a];return e}return c(o)},r.v5=R,r.validate=a,r.version=function(r){if(!a(r))throw TypeError("Invalid UUID");return parseInt(r.substr(14,1),16)},Object.defineProperty(r,"__esModule",{value:!0})}));!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidNIL=n()}(this,(function(){"use strict";return"00000000-0000-0000-0000-000000000000"}));!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidParse=n()}(this,(function(){"use strict";var e=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;return function(n){if(!function(n){return"string"==typeof n&&e.test(n)}(n))throw TypeError("Invalid UUID");var t,i=new Uint8Array(16);return i[0]=(t=parseInt(n.slice(0,8),16))>>>24,i[1]=t>>>16&255,i[2]=t>>>8&255,i[3]=255&t,i[4]=(t=parseInt(n.slice(9,13),16))>>>8,i[5]=255&t,i[6]=(t=parseInt(n.slice(14,18),16))>>>8,i[7]=255&t,i[8]=(t=parseInt(n.slice(19,23),16))>>>8,i[9]=255&t,i[10]=(t=parseInt(n.slice(24,36),16))/1099511627776&255,i[11]=t/4294967296&255,i[12]=t>>>24&255,i[13]=t>>>16&255,i[14]=t>>>8&255,i[15]=255&t,i}}));!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidStringify=t()}(this,(function(){"use strict";var e=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function t(t){return"string"==typeof t&&e.test(t)}for(var i=[],n=0;n<256;++n)i.push((n+256).toString(16).substr(1));return function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,f=(i[e[n+0]]+i[e[n+1]]+i[e[n+2]]+i[e[n+3]]+"-"+i[e[n+4]]+i[e[n+5]]+"-"+i[e[n+6]]+i[e[n+7]]+"-"+i[e[n+8]]+i[e[n+9]]+"-"+i[e[n+10]]+i[e[n+11]]+i[e[n+12]]+i[e[n+13]]+i[e[n+14]]+i[e[n+15]]).toLowerCase();if(!t(f))throw TypeError("Stringified UUID is invalid");return f}}));!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidValidate=t()}(this,(function(){"use strict";var e=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;return function(t){return"string"==typeof t&&e.test(t)}}));!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidVersion=t()}(this,(function(){"use strict";var e=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;return function(t){if(!function(t){return"string"==typeof t&&e.test(t)}(t))throw TypeError("Invalid UUID");return parseInt(t.substr(14,1),16)}}));!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?module.exports=o():"function"==typeof define&&define.amd?define(o):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidv1=o()}(this,(function(){"use strict";var e,o=new Uint8Array(16);function t(){if(!e&&!(e="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return e(o)}var n=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function r(e){return"string"==typeof e&&n.test(e)}for(var i,u,s=[],a=0;a<256;++a)s.push((a+256).toString(16).substr(1));var d=0,f=0;return function(e,o,n){var a=o&&n||0,c=o||new Array(16),l=(e=e||{}).node||i,p=void 0!==e.clockseq?e.clockseq:u;if(null==l||null==p){var v=e.random||(e.rng||t)();null==l&&(l=i=[1|v[0],v[1],v[2],v[3],v[4],v[5]]),null==p&&(p=u=16383&(v[6]<<8|v[7]))}var y=void 0!==e.msecs?e.msecs:Date.now(),m=void 0!==e.nsecs?e.nsecs:f+1,g=y-d+(m-f)/1e4;if(g<0&&void 0===e.clockseq&&(p=p+1&16383),(g<0||y>d)&&void 0===e.nsecs&&(m=0),m>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");d=y,f=m,u=p;var h=(1e4*(268435455&(y+=122192928e5))+m)%4294967296;c[a++]=h>>>24&255,c[a++]=h>>>16&255,c[a++]=h>>>8&255,c[a++]=255&h;var w=y/4294967296*1e4&268435455;c[a++]=w>>>8&255,c[a++]=255&w,c[a++]=w>>>24&15|16,c[a++]=w>>>16&255,c[a++]=p>>>8|128,c[a++]=255&p;for(var b=0;b<6;++b)c[a+b]=l[b];return o||function(e){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,t=(s[e[o+0]]+s[e[o+1]]+s[e[o+2]]+s[e[o+3]]+"-"+s[e[o+4]]+s[e[o+5]]+"-"+s[e[o+6]]+s[e[o+7]]+"-"+s[e[o+8]]+s[e[o+9]]+"-"+s[e[o+10]]+s[e[o+11]]+s[e[o+12]]+s[e[o+13]]+s[e[o+14]]+s[e[o+15]]).toLowerCase();if(!r(t))throw TypeError("Stringified UUID is invalid");return t}(c)}}));!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define(r):(n="undefined"!=typeof globalThis?globalThis:n||self).uuidv3=r()}(this,(function(){"use strict";var n=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function r(r){return"string"==typeof r&&n.test(r)}for(var e=[],t=0;t<256;++t)e.push((t+256).toString(16).substr(1));function i(n){return 14+(n+64>>>9<<4)+1}function o(n,r){var e=(65535&n)+(65535&r);return(n>>16)+(r>>16)+(e>>16)<<16|65535&e}function a(n,r,e,t,i,a){return o((f=o(o(r,n),o(t,a)))<<(u=i)|f>>>32-u,e);var f,u}function f(n,r,e,t,i,o,f){return a(r&e|~r&t,n,r,i,o,f)}function u(n,r,e,t,i,o,f){return a(r&t|e&~t,n,r,i,o,f)}function c(n,r,e,t,i,o,f){return a(r^e^t,n,r,i,o,f)}function s(n,r,e,t,i,o,f){return a(e^(r|~t),n,r,i,o,f)}return function(n,t,i){function o(n,o,a,f){if("string"==typeof n&&(n=function(n){n=unescape(encodeURIComponent(n));for(var r=[],e=0;e<n.length;++e)r.push(n.charCodeAt(e));return r}(n)),"string"==typeof o&&(o=function(n){if(!r(n))throw TypeError("Invalid UUID");var e,t=new Uint8Array(16);return t[0]=(e=parseInt(n.slice(0,8),16))>>>24,t[1]=e>>>16&255,t[2]=e>>>8&255,t[3]=255&e,t[4]=(e=parseInt(n.slice(9,13),16))>>>8,t[5]=255&e,t[6]=(e=parseInt(n.slice(14,18),16))>>>8,t[7]=255&e,t[8]=(e=parseInt(n.slice(19,23),16))>>>8,t[9]=255&e,t[10]=(e=parseInt(n.slice(24,36),16))/1099511627776&255,t[11]=e/4294967296&255,t[12]=e>>>24&255,t[13]=e>>>16&255,t[14]=e>>>8&255,t[15]=255&e,t}(o)),16!==o.length)throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");var u=new Uint8Array(16+n.length);if(u.set(o),u.set(n,o.length),(u=i(u))[6]=15&u[6]|t,u[8]=63&u[8]|128,a){f=f||0;for(var c=0;c<16;++c)a[f+c]=u[c];return a}return function(n){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=(e[n[t+0]]+e[n[t+1]]+e[n[t+2]]+e[n[t+3]]+"-"+e[n[t+4]]+e[n[t+5]]+"-"+e[n[t+6]]+e[n[t+7]]+"-"+e[n[t+8]]+e[n[t+9]]+"-"+e[n[t+10]]+e[n[t+11]]+e[n[t+12]]+e[n[t+13]]+e[n[t+14]]+e[n[t+15]]).toLowerCase();if(!r(i))throw TypeError("Stringified UUID is invalid");return i}(u)}try{o.name=n}catch(n){}return o.DNS="6ba7b810-9dad-11d1-80b4-00c04fd430c8",o.URL="6ba7b811-9dad-11d1-80b4-00c04fd430c8",o}("v3",48,(function(n){if("string"==typeof n){var r=unescape(encodeURIComponent(n));n=new Uint8Array(r.length);for(var e=0;e<r.length;++e)n[e]=r.charCodeAt(e)}return function(n){for(var r=[],e=32*n.length,t="0123456789abcdef",i=0;i<e;i+=8){var o=n[i>>5]>>>i%32&255,a=parseInt(t.charAt(o>>>4&15)+t.charAt(15&o),16);r.push(a)}return r}(function(n,r){n[r>>5]|=128<<r%32,n[i(r)-1]=r;for(var e=1732584193,t=-271733879,a=-1732584194,l=271733878,d=0;d<n.length;d+=16){var p=e,h=t,v=a,g=l;e=f(e,t,a,l,n[d],7,-680876936),l=f(l,e,t,a,n[d+1],12,-389564586),a=f(a,l,e,t,n[d+2],17,606105819),t=f(t,a,l,e,n[d+3],22,-1044525330),e=f(e,t,a,l,n[d+4],7,-176418897),l=f(l,e,t,a,n[d+5],12,1200080426),a=f(a,l,e,t,n[d+6],17,-1473231341),t=f(t,a,l,e,n[d+7],22,-45705983),e=f(e,t,a,l,n[d+8],7,1770035416),l=f(l,e,t,a,n[d+9],12,-1958414417),a=f(a,l,e,t,n[d+10],17,-42063),t=f(t,a,l,e,n[d+11],22,-1990404162),e=f(e,t,a,l,n[d+12],7,1804603682),l=f(l,e,t,a,n[d+13],12,-40341101),a=f(a,l,e,t,n[d+14],17,-1502002290),e=u(e,t=f(t,a,l,e,n[d+15],22,1236535329),a,l,n[d+1],5,-165796510),l=u(l,e,t,a,n[d+6],9,-1069501632),a=u(a,l,e,t,n[d+11],14,643717713),t=u(t,a,l,e,n[d],20,-373897302),e=u(e,t,a,l,n[d+5],5,-701558691),l=u(l,e,t,a,n[d+10],9,38016083),a=u(a,l,e,t,n[d+15],14,-660478335),t=u(t,a,l,e,n[d+4],20,-405537848),e=u(e,t,a,l,n[d+9],5,568446438),l=u(l,e,t,a,n[d+14],9,-1019803690),a=u(a,l,e,t,n[d+3],14,-187363961),t=u(t,a,l,e,n[d+8],20,1163531501),e=u(e,t,a,l,n[d+13],5,-1444681467),l=u(l,e,t,a,n[d+2],9,-51403784),a=u(a,l,e,t,n[d+7],14,1735328473),e=c(e,t=u(t,a,l,e,n[d+12],20,-1926607734),a,l,n[d+5],4,-378558),l=c(l,e,t,a,n[d+8],11,-2022574463),a=c(a,l,e,t,n[d+11],16,1839030562),t=c(t,a,l,e,n[d+14],23,-35309556),e=c(e,t,a,l,n[d+1],4,-1530992060),l=c(l,e,t,a,n[d+4],11,1272893353),a=c(a,l,e,t,n[d+7],16,-155497632),t=c(t,a,l,e,n[d+10],23,-1094730640),e=c(e,t,a,l,n[d+13],4,681279174),l=c(l,e,t,a,n[d],11,-358537222),a=c(a,l,e,t,n[d+3],16,-722521979),t=c(t,a,l,e,n[d+6],23,76029189),e=c(e,t,a,l,n[d+9],4,-640364487),l=c(l,e,t,a,n[d+12],11,-421815835),a=c(a,l,e,t,n[d+15],16,530742520),e=s(e,t=c(t,a,l,e,n[d+2],23,-995338651),a,l,n[d],6,-198630844),l=s(l,e,t,a,n[d+7],10,1126891415),a=s(a,l,e,t,n[d+14],15,-1416354905),t=s(t,a,l,e,n[d+5],21,-57434055),e=s(e,t,a,l,n[d+12],6,1700485571),l=s(l,e,t,a,n[d+3],10,-1894986606),a=s(a,l,e,t,n[d+10],15,-1051523),t=s(t,a,l,e,n[d+1],21,-2054922799),e=s(e,t,a,l,n[d+8],6,1873313359),l=s(l,e,t,a,n[d+15],10,-30611744),a=s(a,l,e,t,n[d+6],15,-1560198380),t=s(t,a,l,e,n[d+13],21,1309151649),e=s(e,t,a,l,n[d+4],6,-145523070),l=s(l,e,t,a,n[d+11],10,-1120210379),a=s(a,l,e,t,n[d+2],15,718787259),t=s(t,a,l,e,n[d+9],21,-343485551),e=o(e,p),t=o(t,h),a=o(a,v),l=o(l,g)}return[e,t,a,l]}(function(n){if(0===n.length)return[];for(var r=8*n.length,e=new Uint32Array(i(r)),t=0;t<r;t+=8)e[t>>5]|=(255&n[t/8])<<t%32;return e}(n),8*n.length))}))}));!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).uuidv4=e()}(this,(function(){"use strict";var t,e=new Uint8Array(16);function o(){if(!t&&!(t="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return t(e)}var n=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function r(t){return"string"==typeof t&&n.test(t)}for(var i=[],u=0;u<256;++u)i.push((u+256).toString(16).substr(1));return function(t,e,n){var u=(t=t||{}).random||(t.rng||o)();if(u[6]=15&u[6]|64,u[8]=63&u[8]|128,e){n=n||0;for(var f=0;f<16;++f)e[n+f]=u[f];return e}return function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,o=(i[t[e+0]]+i[t[e+1]]+i[t[e+2]]+i[t[e+3]]+"-"+i[t[e+4]]+i[t[e+5]]+"-"+i[t[e+6]]+i[t[e+7]]+"-"+i[t[e+8]]+i[t[e+9]]+"-"+i[t[e+10]]+i[t[e+11]]+i[t[e+12]]+i[t[e+13]]+i[t[e+14]]+i[t[e+15]]).toLowerCase();if(!r(o))throw TypeError("Stringified UUID is invalid");return o}(u)}}));!function(r,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(r="undefined"!=typeof globalThis?globalThis:r||self).uuidv5=e()}(this,(function(){"use strict";var r=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function e(e){return"string"==typeof e&&r.test(e)}for(var t=[],n=0;n<256;++n)t.push((n+256).toString(16).substr(1));function a(r,e,t,n){switch(r){case 0:return e&t^~e&n;case 1:return e^t^n;case 2:return e&t^e&n^t&n;case 3:return e^t^n}}function o(r,e){return r<<e|r>>>32-e}return function(r,n,a){function o(r,o,i,f){if("string"==typeof r&&(r=function(r){r=unescape(encodeURIComponent(r));for(var e=[],t=0;t<r.length;++t)e.push(r.charCodeAt(t));return e}(r)),"string"==typeof o&&(o=function(r){if(!e(r))throw TypeError("Invalid UUID");var t,n=new Uint8Array(16);return n[0]=(t=parseInt(r.slice(0,8),16))>>>24,n[1]=t>>>16&255,n[2]=t>>>8&255,n[3]=255&t,n[4]=(t=parseInt(r.slice(9,13),16))>>>8,n[5]=255&t,n[6]=(t=parseInt(r.slice(14,18),16))>>>8,n[7]=255&t,n[8]=(t=parseInt(r.slice(19,23),16))>>>8,n[9]=255&t,n[10]=(t=parseInt(r.slice(24,36),16))/1099511627776&255,n[11]=t/4294967296&255,n[12]=t>>>24&255,n[13]=t>>>16&255,n[14]=t>>>8&255,n[15]=255&t,n}(o)),16!==o.length)throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");var s=new Uint8Array(16+r.length);if(s.set(o),s.set(r,o.length),(s=a(s))[6]=15&s[6]|n,s[8]=63&s[8]|128,i){f=f||0;for(var u=0;u<16;++u)i[f+u]=s[u];return i}return function(r){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=(t[r[n+0]]+t[r[n+1]]+t[r[n+2]]+t[r[n+3]]+"-"+t[r[n+4]]+t[r[n+5]]+"-"+t[r[n+6]]+t[r[n+7]]+"-"+t[r[n+8]]+t[r[n+9]]+"-"+t[r[n+10]]+t[r[n+11]]+t[r[n+12]]+t[r[n+13]]+t[r[n+14]]+t[r[n+15]]).toLowerCase();if(!e(a))throw TypeError("Stringified UUID is invalid");return a}(s)}try{o.name=r}catch(r){}return o.DNS="6ba7b810-9dad-11d1-80b4-00c04fd430c8",o.URL="6ba7b811-9dad-11d1-80b4-00c04fd430c8",o}("v5",80,(function(r){var e=[1518500249,1859775393,2400959708,3395469782],t=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof r){var n=unescape(encodeURIComponent(r));r=[];for(var i=0;i<n.length;++i)r.push(n.charCodeAt(i))}else Array.isArray(r)||(r=Array.prototype.slice.call(r));r.push(128);for(var f=r.length/4+2,s=Math.ceil(f/16),u=new Array(s),c=0;c<s;++c){for(var l=new Uint32Array(16),p=0;p<16;++p)l[p]=r[64*c+4*p]<<24|r[64*c+4*p+1]<<16|r[64*c+4*p+2]<<8|r[64*c+4*p+3];u[c]=l}u[s-1][14]=8*(r.length-1)/Math.pow(2,32),u[s-1][14]=Math.floor(u[s-1][14]),u[s-1][15]=8*(r.length-1)&4294967295;for(var d=0;d<s;++d){for(var h=new Uint32Array(80),v=0;v<16;++v)h[v]=u[d][v];for(var y=16;y<80;++y)h[y]=o(h[y-3]^h[y-8]^h[y-14]^h[y-16],1);for(var g=t[0],b=t[1],w=t[2],U=t[3],A=t[4],I=0;I<80;++I){var m=Math.floor(I/20),C=o(g,5)+a(m,b,w,U)+A+e[m]+h[I]>>>0;A=U,U=w,w=o(b,30)>>>0,b=g,g=C}t[0]=t[0]+g>>>0,t[1]=t[1]+b>>>0,t[2]=t[2]+w>>>0,t[3]=t[3]+U>>>0,t[4]=t[4]+A>>>0}return[t[0]>>24&255,t[0]>>16&255,t[0]>>8&255,255&t[0],t[1]>>24&255,t[1]>>16&255,t[1]>>8&255,255&t[1],t[2]>>24&255,t[2]>>16&255,t[2]>>8&255,255&t[2],t[3]>>24&255,t[3]>>16&255,t[3]>>8&255,255&t[3],t[4]>>24&255,t[4]>>16&255,t[4]>>8&255,255&t[4]]}))}));export { default as v1 } from './v1.js';
export { default as v3 } from './v3.js';
export { default as v4 } from './v4.js';
export { default as v5 } from './v5.js';
export { default as NIL } from './nil.js';
export { default as version } from './version.js';
export { default as validate } from './validate.js';
export { default as stringify } from './stringify.js';
export { default as parse } from './parse.js';import crypto from 'crypto';

function md5(bytes) {
  if (Array.isArray(bytes)) {
    bytes = Buffer.from(bytes);
  } else if (typeof bytes === 'string') {
    bytes = Buffer.from(bytes, 'utf8');
  }

  return crypto.createHash('md5').update(bytes).digest();
}

export default md5;export default '00000000-0000-0000-0000-000000000000';import validate from './validate.js';

function parse(uuid) {
  if (!validate(uuid)) {
    throw TypeError('Invalid UUID');
  }

  let v;
  const arr = new Uint8Array(16); // Parse ########-....-....-....-............

  arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;
  arr[1] = v >>> 16 & 0xff;
  arr[2] = v >>> 8 & 0xff;
  arr[3] = v & 0xff; // Parse ........-####-....-....-............

  arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;
  arr[5] = v & 0xff; // Parse ........-....-####-....-............

  arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;
  arr[7] = v & 0xff; // Parse ........-....-....-####-............

  arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;
  arr[9] = v & 0xff; // Parse ........-....-....-....-############
  // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes)

  arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;
  arr[11] = v / 0x100000000 & 0xff;
  arr[12] = v >>> 24 & 0xff;
  arr[13] = v >>> 16 & 0xff;
  arr[14] = v >>> 8 & 0xff;
  arr[15] = v & 0xff;
  return arr;
}

export default parse;export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;import crypto from 'crypto';
const rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate

let poolPtr = rnds8Pool.length;
export default function rng() {
  if (poolPtr > rnds8Pool.length - 16) {
    crypto.randomFillSync(rnds8Pool);
    poolPtr = 0;
  }

  return rnds8Pool.slice(poolPtr, poolPtr += 16);
}import crypto from 'crypto';

function sha1(bytes) {
  if (Array.isArray(bytes)) {
    bytes = Buffer.from(bytes);
  } else if (typeof bytes === 'string') {
    bytes = Buffer.from(bytes, 'utf8');
  }

  return crypto.createHash('sha1').update(bytes).digest();
}

export default sha1;import validate from './validate.js';
/**
 * Convert array of 16 byte values to UUID string format of the form:
 * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
 */

const byteToHex = [];

for (let i = 0; i < 256; ++i) {
  byteToHex.push((i + 0x100).toString(16).substr(1));
}

function stringify(arr, offset = 0) {
  // Note: Be careful editing this code!  It's been tuned for performance
  // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
  const uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID.  If this throws, it's likely due to one
  // of the following:
  // - One or more input array values don't map to a hex octet (leading to
  // "undefined" in the uuid)
  // - Invalid input values for the RFC `version` or `variant` fields

  if (!validate(uuid)) {
    throw TypeError('Stringified UUID is invalid');
  }

  return uuid;
}

export default stringify;import rng from './rng.js';
import stringify from './stringify.js'; // **`v1()` - Generate time-based UUID**
//
// Inspired by https://github.com/LiosK/UUID.js
// and http://docs.python.org/library/uuid.html

let _nodeId;

let _clockseq; // Previous uuid creation time


let _lastMSecs = 0;
let _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details

function v1(options, buf, offset) {
  let i = buf && offset || 0;
  const b = buf || new Array(16);
  options = options || {};
  let node = options.node || _nodeId;
  let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not
  // specified.  We do this lazily to minimize issues related to insufficient
  // system entropy.  See #189

  if (node == null || clockseq == null) {
    const seedBytes = options.random || (options.rng || rng)();

    if (node == null) {
      // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
      node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];
    }

    if (clockseq == null) {
      // Per 4.2.2, randomize (14 bit) clockseq
      clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
    }
  } // UUID timestamps are 100 nano-second units since the Gregorian epoch,
  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so
  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.


  let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock
  // cycle to simulate higher resolution clock

  let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)

  const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression

  if (dt < 0 && options.clockseq === undefined) {
    clockseq = clockseq + 1 & 0x3fff;
  } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
  // time interval


  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
    nsecs = 0;
  } // Per 4.2.1.2 Throw error if too many uuids are requested


  if (nsecs >= 10000) {
    throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
  }

  _lastMSecs = msecs;
  _lastNSecs = nsecs;
  _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch

  msecs += 12219292800000; // `time_low`

  const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
  b[i++] = tl >>> 24 & 0xff;
  b[i++] = tl >>> 16 & 0xff;
  b[i++] = tl >>> 8 & 0xff;
  b[i++] = tl & 0xff; // `time_mid`

  const tmh = msecs / 0x100000000 * 10000 & 0xfffffff;
  b[i++] = tmh >>> 8 & 0xff;
  b[i++] = tmh & 0xff; // `time_high_and_version`

  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version

  b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)

  b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`

  b[i++] = clockseq & 0xff; // `node`

  for (let n = 0; n < 6; ++n) {
    b[i + n] = node[n];
  }

  return buf || stringify(b);
}

export default v1;import v35 from './v35.js';
import md5 from './md5.js';
const v3 = v35('v3', 0x30, md5);
export default v3;import stringify from './stringify.js';
import parse from './parse.js';

function stringToBytes(str) {
  str = unescape(encodeURIComponent(str)); // UTF8 escape

  const bytes = [];

  for (let i = 0; i < str.length; ++i) {
    bytes.push(str.charCodeAt(i));
  }

  return bytes;
}

export const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
export const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
export default function (name, version, hashfunc) {
  function generateUUID(value, namespace, buf, offset) {
    if (typeof value === 'string') {
      value = stringToBytes(value);
    }

    if (typeof namespace === 'string') {
      namespace = parse(namespace);
    }

    if (namespace.length !== 16) {
      throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');
    } // Compute hash of namespace and value, Per 4.3
    // Future: Use spread syntax when supported on all platforms, e.g. `bytes =
    // hashfunc([...namespace, ... value])`


    let bytes = new Uint8Array(16 + value.length);
    bytes.set(namespace);
    bytes.set(value, namespace.length);
    bytes = hashfunc(bytes);
    bytes[6] = bytes[6] & 0x0f | version;
    bytes[8] = bytes[8] & 0x3f | 0x80;

    if (buf) {
      offset = offset || 0;

      for (let i = 0; i < 16; ++i) {
        buf[offset + i] = bytes[i];
      }

      return buf;
    }

    return stringify(bytes);
  } // Function#name is not settable on some platforms (#270)


  try {
    generateUUID.name = name; // eslint-disable-next-line no-empty
  } catch (err) {} // For CommonJS default export support


  generateUUID.DNS = DNS;
  generateUUID.URL = URL;
  return generateUUID;
}import rng from './rng.js';
import stringify from './stringify.js';

function v4(options, buf, offset) {
  options = options || {};
  const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`

  rnds[6] = rnds[6] & 0x0f | 0x40;
  rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided

  if (buf) {
    offset = offset || 0;

    for (let i = 0; i < 16; ++i) {
      buf[offset + i] = rnds[i];
    }

    return buf;
  }

  return stringify(rnds);
}

export default v4;import v35 from './v35.js';
import sha1 from './sha1.js';
const v5 = v35('v5', 0x50, sha1);
export default v5;import REGEX from './regex.js';

function validate(uuid) {
  return typeof uuid === 'string' && REGEX.test(uuid);
}

export default validate;import validate from './validate.js';

function version(uuid) {
  if (!validate(uuid)) {
    throw TypeError('Invalid UUID');
  }

  return parseInt(uuid.substr(14, 1), 16);
}

export default version;export { default as v1 } from './v1.js';
export { default as v3 } from './v3.js';
export { default as v4 } from './v4.js';
export { default as v5 } from './v5.js';
export { default as NIL } from './nil.js';
export { default as version } from './version.js';
export { default as validate } from './validate.js';
export { default as stringify } from './stringify.js';
export { default as parse } from './parse.js';/*
 * Browser-compatible JavaScript MD5
 *
 * Modification of JavaScript MD5
 * https://github.com/blueimp/JavaScript-MD5
 *
 * Copyright 2011, Sebastian Tschan
 * https://blueimp.net
 *
 * Licensed under the MIT license:
 * https://opensource.org/licenses/MIT
 *
 * Based on
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 */
function md5(bytes) {
  if (typeof bytes === 'string') {
    var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape

    bytes = new Uint8Array(msg.length);

    for (var i = 0; i < msg.length; ++i) {
      bytes[i] = msg.charCodeAt(i);
    }
  }

  return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));
}
/*
 * Convert an array of little-endian words to an array of bytes
 */


function md5ToHexEncodedArray(input) {
  var output = [];
  var length32 = input.length * 32;
  var hexTab = '0123456789abcdef';

  for (var i = 0; i < length32; i += 8) {
    var x = input[i >> 5] >>> i % 32 & 0xff;
    var hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);
    output.push(hex);
  }

  return output;
}
/**
 * Calculate output length with padding and bit length
 */


function getOutputLength(inputLength8) {
  return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;
}
/*
 * Calculate the MD5 of an array of little-endian words, and a bit length.
 */


function wordsToMd5(x, len) {
  /* append padding */
  x[len >> 5] |= 0x80 << len % 32;
  x[getOutputLength(len) - 1] = len;
  var a = 1732584193;
  var b = -271733879;
  var c = -1732584194;
  var d = 271733878;

  for (var i = 0; i < x.length; i += 16) {
    var olda = a;
    var oldb = b;
    var oldc = c;
    var oldd = d;
    a = md5ff(a, b, c, d, x[i], 7, -680876936);
    d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);
    c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);
    b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
    a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);
    d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
    c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
    b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);
    a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
    d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
    c = md5ff(c, d, a, b, x[i + 10], 17, -42063);
    b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
    a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
    d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);
    c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
    b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
    a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);
    d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
    c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);
    b = md5gg(b, c, d, a, x[i], 20, -373897302);
    a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);
    d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);
    c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);
    b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);
    a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);
    d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
    c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);
    b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
    a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
    d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);
    c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
    b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
    a = md5hh(a, b, c, d, x[i + 5], 4, -378558);
    d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
    c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
    b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);
    a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
    d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
    c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);
    b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
    a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);
    d = md5hh(d, a, b, c, x[i], 11, -358537222);
    c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);
    b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);
    a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);
    d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);
    c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);
    b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);
    a = md5ii(a, b, c, d, x[i], 6, -198630844);
    d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
    c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
    b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);
    a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
    d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
    c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);
    b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
    a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
    d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);
    c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
    b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
    a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);
    d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
    c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);
    b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);
    a = safeAdd(a, olda);
    b = safeAdd(b, oldb);
    c = safeAdd(c, oldc);
    d = safeAdd(d, oldd);
  }

  return [a, b, c, d];
}
/*
 * Convert an array bytes to an array of little-endian words
 * Characters >255 have their high-byte silently ignored.
 */


function bytesToWords(input) {
  if (input.length === 0) {
    return [];
  }

  var length8 = input.length * 8;
  var output = new Uint32Array(getOutputLength(length8));

  for (var i = 0; i < length8; i += 8) {
    output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;
  }

  return output;
}
/*
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
 * to work around bugs in some JS interpreters.
 */


function safeAdd(x, y) {
  var lsw = (x & 0xffff) + (y & 0xffff);
  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return msw << 16 | lsw & 0xffff;
}
/*
 * Bitwise rotate a 32-bit number to the left.
 */


function bitRotateLeft(num, cnt) {
  return num << cnt | num >>> 32 - cnt;
}
/*
 * These functions implement the four basic operations the algorithm uses.
 */


function md5cmn(q, a, b, x, s, t) {
  return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);
}

function md5ff(a, b, c, d, x, s, t) {
  return md5cmn(b & c | ~b & d, a, b, x, s, t);
}

function md5gg(a, b, c, d, x, s, t) {
  return md5cmn(b & d | c & ~d, a, b, x, s, t);
}

function md5hh(a, b, c, d, x, s, t) {
  return md5cmn(b ^ c ^ d, a, b, x, s, t);
}

function md5ii(a, b, c, d, x, s, t) {
  return md5cmn(c ^ (b | ~d), a, b, x, s, t);
}

export default md5;export default '00000000-0000-0000-0000-000000000000';import validate from './validate.js';

function parse(uuid) {
  if (!validate(uuid)) {
    throw TypeError('Invalid UUID');
  }

  var v;
  var arr = new Uint8Array(16); // Parse ########-....-....-....-............

  arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;
  arr[1] = v >>> 16 & 0xff;
  arr[2] = v >>> 8 & 0xff;
  arr[3] = v & 0xff; // Parse ........-####-....-....-............

  arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;
  arr[5] = v & 0xff; // Parse ........-....-####-....-............

  arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;
  arr[7] = v & 0xff; // Parse ........-....-....-####-............

  arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;
  arr[9] = v & 0xff; // Parse ........-....-....-....-############
  // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes)

  arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;
  arr[11] = v / 0x100000000 & 0xff;
  arr[12] = v >>> 24 & 0xff;
  arr[13] = v >>> 16 & 0xff;
  arr[14] = v >>> 8 & 0xff;
  arr[15] = v & 0xff;
  return arr;
}

export default parse;export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;// Unique ID creation requires a high quality random # generator. In the browser we therefore
// require the crypto API and do not support built-in fallback to lower quality random number
// generators (like Math.random()).
var getRandomValues;
var rnds8 = new Uint8Array(16);
export default function rng() {
  // lazy load so that environments that need to polyfill have a chance to do so
  if (!getRandomValues) {
    // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. Also,
    // find the complete implementation of crypto (msCrypto) on IE11.
    getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);

    if (!getRandomValues) {
      throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');
    }
  }

  return getRandomValues(rnds8);
}// Adapted from Chris Veness' SHA1 code at
// http://www.movable-type.co.uk/scripts/sha1.html
function f(s, x, y, z) {
  switch (s) {
    case 0:
      return x & y ^ ~x & z;

    case 1:
      return x ^ y ^ z;

    case 2:
      return x & y ^ x & z ^ y & z;

    case 3:
      return x ^ y ^ z;
  }
}

function ROTL(x, n) {
  return x << n | x >>> 32 - n;
}

function sha1(bytes) {
  var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];
  var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];

  if (typeof bytes === 'string') {
    var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape

    bytes = [];

    for (var i = 0; i < msg.length; ++i) {
      bytes.push(msg.charCodeAt(i));
    }
  } else if (!Array.isArray(bytes)) {
    // Convert Array-like to Array
    bytes = Array.prototype.slice.call(bytes);
  }

  bytes.push(0x80);
  var l = bytes.length / 4 + 2;
  var N = Math.ceil(l / 16);
  var M = new Array(N);

  for (var _i = 0; _i < N; ++_i) {
    var arr = new Uint32Array(16);

    for (var j = 0; j < 16; ++j) {
      arr[j] = bytes[_i * 64 + j * 4] << 24 | bytes[_i * 64 + j * 4 + 1] << 16 | bytes[_i * 64 + j * 4 + 2] << 8 | bytes[_i * 64 + j * 4 + 3];
    }

    M[_i] = arr;
  }

  M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);
  M[N - 1][14] = Math.floor(M[N - 1][14]);
  M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;

  for (var _i2 = 0; _i2 < N; ++_i2) {
    var W = new Uint32Array(80);

    for (var t = 0; t < 16; ++t) {
      W[t] = M[_i2][t];
    }

    for (var _t = 16; _t < 80; ++_t) {
      W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1);
    }

    var a = H[0];
    var b = H[1];
    var c = H[2];
    var d = H[3];
    var e = H[4];

    for (var _t2 = 0; _t2 < 80; ++_t2) {
      var s = Math.floor(_t2 / 20);
      var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 0;
      e = d;
      d = c;
      c = ROTL(b, 30) >>> 0;
      b = a;
      a = T;
    }

    H[0] = H[0] + a >>> 0;
    H[1] = H[1] + b >>> 0;
    H[2] = H[2] + c >>> 0;
    H[3] = H[3] + d >>> 0;
    H[4] = H[4] + e >>> 0;
  }

  return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];
}

export default sha1;import validate from './validate.js';
/**
 * Convert array of 16 byte values to UUID string format of the form:
 * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
 */

var byteToHex = [];

for (var i = 0; i < 256; ++i) {
  byteToHex.push((i + 0x100).toString(16).substr(1));
}

function stringify(arr) {
  var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  // Note: Be careful editing this code!  It's been tuned for performance
  // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
  var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID.  If this throws, it's likely due to one
  // of the following:
  // - One or more input array values don't map to a hex octet (leading to
  // "undefined" in the uuid)
  // - Invalid input values for the RFC `version` or `variant` fields

  if (!validate(uuid)) {
    throw TypeError('Stringified UUID is invalid');
  }

  return uuid;
}

export default stringify;import rng from './rng.js';
import stringify from './stringify.js'; // **`v1()` - Generate time-based UUID**
//
// Inspired by https://github.com/LiosK/UUID.js
// and http://docs.python.org/library/uuid.html

var _nodeId;

var _clockseq; // Previous uuid creation time


var _lastMSecs = 0;
var _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details

function v1(options, buf, offset) {
  var i = buf && offset || 0;
  var b = buf || new Array(16);
  options = options || {};
  var node = options.node || _nodeId;
  var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not
  // specified.  We do this lazily to minimize issues related to insufficient
  // system entropy.  See #189

  if (node == null || clockseq == null) {
    var seedBytes = options.random || (options.rng || rng)();

    if (node == null) {
      // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
      node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];
    }

    if (clockseq == null) {
      // Per 4.2.2, randomize (14 bit) clockseq
      clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
    }
  } // UUID timestamps are 100 nano-second units since the Gregorian epoch,
  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so
  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.


  var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock
  // cycle to simulate higher resolution clock

  var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)

  var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression

  if (dt < 0 && options.clockseq === undefined) {
    clockseq = clockseq + 1 & 0x3fff;
  } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
  // time interval


  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
    nsecs = 0;
  } // Per 4.2.1.2 Throw error if too many uuids are requested


  if (nsecs >= 10000) {
    throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
  }

  _lastMSecs = msecs;
  _lastNSecs = nsecs;
  _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch

  msecs += 12219292800000; // `time_low`

  var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
  b[i++] = tl >>> 24 & 0xff;
  b[i++] = tl >>> 16 & 0xff;
  b[i++] = tl >>> 8 & 0xff;
  b[i++] = tl & 0xff; // `time_mid`

  var tmh = msecs / 0x100000000 * 10000 & 0xfffffff;
  b[i++] = tmh >>> 8 & 0xff;
  b[i++] = tmh & 0xff; // `time_high_and_version`

  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version

  b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)

  b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`

  b[i++] = clockseq & 0xff; // `node`

  for (var n = 0; n < 6; ++n) {
    b[i + n] = node[n];
  }

  return buf || stringify(b);
}

export default v1;import v35 from './v35.js';
import md5 from './md5.js';
var v3 = v35('v3', 0x30, md5);
export default v3;import stringify from './stringify.js';
import parse from './parse.js';

function stringToBytes(str) {
  str = unescape(encodeURIComponent(str)); // UTF8 escape

  var bytes = [];

  for (var i = 0; i < str.length; ++i) {
    bytes.push(str.charCodeAt(i));
  }

  return bytes;
}

export var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
export var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
export default function (name, version, hashfunc) {
  function generateUUID(value, namespace, buf, offset) {
    if (typeof value === 'string') {
      value = stringToBytes(value);
    }

    if (typeof namespace === 'string') {
      namespace = parse(namespace);
    }

    if (namespace.length !== 16) {
      throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');
    } // Compute hash of namespace and value, Per 4.3
    // Future: Use spread syntax when supported on all platforms, e.g. `bytes =
    // hashfunc([...namespace, ... value])`


    var bytes = new Uint8Array(16 + value.length);
    bytes.set(namespace);
    bytes.set(value, namespace.length);
    bytes = hashfunc(bytes);
    bytes[6] = bytes[6] & 0x0f | version;
    bytes[8] = bytes[8] & 0x3f | 0x80;

    if (buf) {
      offset = offset || 0;

      for (var i = 0; i < 16; ++i) {
        buf[offset + i] = bytes[i];
      }

      return buf;
    }

    return stringify(bytes);
  } // Function#name is not settable on some platforms (#270)


  try {
    generateUUID.name = name; // eslint-disable-next-line no-empty
  } catch (err) {} // For CommonJS default export support


  generateUUID.DNS = DNS;
  generateUUID.URL = URL;
  return generateUUID;
}import rng from './rng.js';
import stringify from './stringify.js';

function v4(options, buf, offset) {
  options = options || {};
  var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`

  rnds[6] = rnds[6] & 0x0f | 0x40;
  rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided

  if (buf) {
    offset = offset || 0;

    for (var i = 0; i < 16; ++i) {
      buf[offset + i] = rnds[i];
    }

    return buf;
  }

  return stringify(rnds);
}

export default v4;import v35 from './v35.js';
import sha1 from './sha1.js';
var v5 = v35('v5', 0x50, sha1);
export default v5;import REGEX from './regex.js';

function validate(uuid) {
  return typeof uuid === 'string' && REGEX.test(uuid);
}

export default validate;import validate from './validate.js';

function version(uuid) {
  if (!validate(uuid)) {
    throw TypeError('Invalid UUID');
  }

  return parseInt(uuid.substr(14, 1), 16);
}

export default version;#!/usr/bin/env node
require('../uuid-bin');
'use strict';
const {Transform, PassThrough} = require('stream');
const zlib = require('zlib');
const mimicResponse = require('mimic-response');

module.exports = response => {
	const contentEncoding = (response.headers['content-encoding'] || '').toLowerCase();

	if (!['gzip', 'deflate', 'br'].includes(contentEncoding)) {
		return response;
	}

	// TODO: Remove this when targeting Node.js 12.
	const isBrotli = contentEncoding === 'br';
	if (isBrotli && typeof zlib.createBrotliDecompress !== 'function') {
		response.destroy(new Error('Brotli is not supported on Node.js < 12'));
		return response;
	}

	let isEmpty = true;

	const checker = new Transform({
		transform(data, _encoding, callback) {
			isEmpty = false;

			callback(null, data);
		},

		flush(callback) {
			callback();
		}
	});

	const finalStream = new PassThrough({
		autoDestroy: false,
		destroy(error, callback) {
			response.destroy();

			callback(error);
		}
	});

	const decompressStream = isBrotli ? zlib.createBrotliDecompress() : zlib.createUnzip();

	decompressStream.once('error', error => {
		if (isEmpty && !response.readable) {
			finalStream.end();
			return;
		}

		finalStream.destroy(error);
	});

	mimicResponse(response, finalStream);
	response.pipe(checker).pipe(decompressStream).pipe(finalStream);

	return finalStream;
};
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": "decompress-response",
  "version": "6.0.0",
  "description": "Decompress a HTTP response if needed",
  "license": "MIT",
  "repository": "sindresorhus/decompress-response",
  "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-response": "^3.1.0"
  },
  "devDependencies": {
    "@types/node": "^14.0.1",
    "ava": "^2.2.0",
    "get-stream": "^5.0.0",
    "pify": "^5.0.0",
    "tsd": "^0.11.0",
    "xo": "^0.30.0"
  }
}'use strict';

// We define these manually to ensure they're always copied
// even if they would move up the prototype chain
// https://nodejs.org/api/http.html#http_class_http_incomingmessage
const knownProperties = [
	'aborted',
	'complete',
	'headers',
	'httpVersion',
	'httpVersionMinor',
	'httpVersionMajor',
	'method',
	'rawHeaders',
	'rawTrailers',
	'setTimeout',
	'socket',
	'statusCode',
	'statusMessage',
	'trailers',
	'url'
];

module.exports = (fromStream, toStream) => {
	if (toStream._readableState.autoDestroy) {
		throw new Error('The second stream must have the `autoDestroy` option set to `false`');
	}

	const fromProperties = new Set(Object.keys(fromStream).concat(knownProperties));

	const properties = {};

	for (const property of fromProperties) {
		// Don't overwrite existing properties.
		if (property in toStream) {
			continue;
		}

		properties[property] = {
			get() {
				const value = fromStream[property];
				const isFunction = typeof value === 'function';

				return isFunction ? value.bind(fromStream) : value;
			},
			set(value) {
				fromStream[property] = value;
			},
			enumerable: true,
			configurable: false
		};
	}

	Object.defineProperties(toStream, properties);

	fromStream.once('aborted', () => {
		toStream.destroy();

		toStream.emit('aborted');
	});

	fromStream.once('close', () => {
		if (fromStream.complete) {
			if (toStream.readable) {
				toStream.once('end', () => {
					toStream.emit('close');
				});
			} else {
				toStream.emit('close');
			}
		} else {
			toStream.emit('close');
		}
	});

	return toStream;
};
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": "mimic-response",
  "version": "3.1.0",
  "description": "Mimic a Node.js HTTP response stream",
  "license": "MIT",
  "repository": "sindresorhus/mimic-response",
  "funding": "https://github.com/sponsors/sindresorhus",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "https://sindresorhus.com"
  },
  "engines": {
    "node": ">=10"
  },
  "files": [
    "index.d.ts",
    "index.js"
  ],
  "devDependencies": {
    "@types/node": "^14.0.1",
    "ava": "^2.4.0",
    "create-test-server": "^2.4.0",
    "p-event": "^4.1.0",
    "pify": "^5.0.0",
    "tsd": "^0.11.0",
    "xo": "^0.30.0"
  }
}<!-- This file is automatically added by @npmcli/template-oss. Do not edit. -->

ISC License

Copyright npm, Inc.

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 NPM DISCLAIMS ALL
WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
EVENT SHALL NPM 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.
{
  "name": "@npmcli/fs",
  "version": "1.1.1",
  "description": "filesystem utilities for the npm cli",
  "main": "lib/index.js",
  "files": [
    "bin",
    "lib"
  ],
  "author": "GitHub Inc.",
  "license": "ISC",
  "devDependencies": {
    "@npmcli/template-oss": "^2.3.1",
    "tap": "^15.0.9"
  },
  "dependencies": {
    "@gar/promisify": "^1.0.1",
    "semver": "^7.3.5"
  },
  "templateVersion": "2.3.1"
}const fs = require('./fs.js')
const getOptions = require('./common/get-options.js')
const owner = require('./common/owner.js')

const copyFile = async (src, dest, opts) => {
  const options = getOptions(opts, {
    copy: ['mode', 'owner'],
    wrap: 'mode',
  })

  const { uid, gid } = await owner.validate(dest, options.owner)

  // the node core method as of 16.5.0 does not support the mode being in an
  // object, so we have to pass the mode value directly
  const result = await fs.copyFile(src, dest, options.mode)

  await owner.update(dest, uid, gid)

  return result
}

module.exports = copyFile
'use strict'
const { inspect } = require('util')

// adapted from node's internal/errors
// https://github.com/nodejs/node/blob/c8a04049/lib/internal/errors.js

// close copy of node's internal SystemError class.
class SystemError {
  constructor (code, prefix, context) {
    // XXX context.code is undefined in all constructors used in cp/polyfill
    // that may be a bug copied from node, maybe the constructor should use
    // `code` not `errno`?  nodejs/node#41104
    let message = `${prefix}: ${context.syscall} returned ` +
                  `${context.code} (${context.message})`

    if (context.path !== undefined) {
      message += ` ${context.path}`
    }
    if (context.dest !== undefined) {
      message += ` => ${context.dest}`
    }

    this.code = code
    Object.defineProperties(this, {
      name: {
        value: 'SystemError',
        enumerable: false,
        writable: true,
        configurable: true,
      },
      message: {
        value: message,
        enumerable: false,
        writable: true,
        configurable: true,
      },
      info: {
        value: context,
        enumerable: true,
        configurable: true,
        writable: false,
      },
      errno: {
        get () {
          return context.errno
        },
        set (value) {
          context.errno = value
        },
        enumerable: true,
        configurable: true,
      },
      syscall: {
        get () {
          return context.syscall
        },
        set (value) {
          context.syscall = value
        },
        enumerable: true,
        configurable: true,
      },
    })

    if (context.path !== undefined) {
      Object.defineProperty(this, 'path', {
        get () {
          return context.path
        },
        set (value) {
          context.path = value
        },
        enumerable: true,
        configurable: true,
      })
    }

    if (context.dest !== undefined) {
      Object.defineProperty(this, 'dest', {
        get () {
          return context.dest
        },
        set (value) {
          context.dest = value
        },
        enumerable: true,
        configurable: true,
      })
    }
  }

  toString () {
    return `${this.name} [${this.code}]: ${this.message}`
  }

  [Symbol.for('nodejs.util.inspect.custom')] (_recurseTimes, ctx) {
    return inspect(this, {
      ...ctx,
      getters: true,
      customInspect: false,
    })
  }
}

function E (code, message) {
  module.exports[code] = class NodeError extends SystemError {
    constructor (ctx) {
      super(code, message, ctx)
    }
  }
}

E('ERR_FS_CP_DIR_TO_NON_DIR', 'Cannot overwrite directory with non-directory')
E('ERR_FS_CP_EEXIST', 'Target already exists')
E('ERR_FS_CP_EINVAL', 'Invalid src or dest')
E('ERR_FS_CP_FIFO_PIPE', 'Cannot copy a FIFO pipe')
E('ERR_FS_CP_NON_DIR_TO_DIR', 'Cannot overwrite non-directory with directory')
E('ERR_FS_CP_SOCKET', 'Cannot copy a socket file')
E('ERR_FS_CP_SYMLINK_TO_SUBDIRECTORY', 'Cannot overwrite symlink in subdirectory of self')
E('ERR_FS_CP_UNKNOWN', 'Cannot copy an unknown file type')
E('ERR_FS_EISDIR', 'Path is a directory')

module.exports.ERR_INVALID_ARG_TYPE = class ERR_INVALID_ARG_TYPE extends Error {
  constructor (name, expected, actual) {
    super()
    this.code = 'ERR_INVALID_ARG_TYPE'
    this.message = `The ${name} argument must be ${expected}. Received ${typeof actual}`
  }
}
const fs = require('fs')
const promisify = require('@gar/promisify')

// this module returns the core fs module wrapped in a proxy that promisifies
// method calls within the getter. we keep it in a separate module so that the
// overridden methods have a consistent way to get to promisified fs methods
// without creating a circular dependency
module.exports = promisify(fs)
module.exports = {
  ...require('./fs.js'),
  copyFile: require('./copy-file.js'),
  cp: require('./cp/index.js'),
  mkdir: require('./mkdir/index.js'),
  mkdtemp: require('./mkdtemp.js'),
  rm: require('./rm/index.js'),
  withTempDir: require('./with-temp-dir.js'),
  writeFile: require('./write-file.js'),
}
const { dirname, sep } = require('path')

const fs = require('./fs.js')
const getOptions = require('./common/get-options.js')
const owner = require('./common/owner.js')

const mkdtemp = async (prefix, opts) => {
  const options = getOptions(opts, {
    copy: ['encoding', 'owner'],
    wrap: 'encoding',
  })

  // mkdtemp relies on the trailing path separator to indicate if it should
  // create a directory inside of the prefix. if that's the case then the root
  // we infer ownership from is the prefix itself, otherwise it's the dirname
  // /tmp -> /tmpABCDEF, infers from /
  // /tmp/ -> /tmp/ABCDEF, infers from /tmp
  const root = prefix.endsWith(sep) ? prefix : dirname(prefix)
  const { uid, gid } = await owner.validate(root, options.owner)

  const result = await fs.mkdtemp(prefix, options)

  await owner.update(result, uid, gid)

  return result
}

module.exports = mkdtemp
const { join, sep } = require('path')

const getOptions = require('./common/get-options.js')
const mkdir = require('./mkdir/index.js')
const mkdtemp = require('./mkdtemp.js')
const rm = require('./rm/index.js')

// create a temp directory, ensure its permissions match its parent, then call
// the supplied function passing it the path to the directory. clean up after
// the function finishes, whether it throws or not
const withTempDir = async (root, fn, opts) => {
  const options = getOptions(opts, {
    copy: ['tmpPrefix'],
  })
  // create the directory, and fix its ownership
  await mkdir(root, { recursive: true, owner: 'inherit' })

  const target = await mkdtemp(join(`${root}${sep}`, options.tmpPrefix || ''), { owner: 'inherit' })
  let err
  let result

  try {
    result = await fn(target)
  } catch (_err) {
    err = _err
  }

  try {
    await rm(target, { force: true, recursive: true })
  } catch (err) {}

  if (err) {
    throw err
  }

  return result
}

module.exports = withTempDir
const fs = require('./fs.js')
const getOptions = require('./common/get-options.js')
const owner = require('./common/owner.js')

const writeFile = async (file, data, opts) => {
  const options = getOptions(opts, {
    copy: ['encoding', 'mode', 'flag', 'signal', 'owner'],
    wrap: 'encoding',
  })
  const { uid, gid } = await owner.validate(file, options.owner)

  const result = await fs.writeFile(file, data, options)

  await owner.update(file, uid, gid)

  return result
}

module.exports = writeFile
const fs = require('../fs.js')
const getOptions = require('../common/get-options.js')
const node = require('../common/node.js')
const polyfill = require('./polyfill.js')

// node 14.14.0 added fs.rm, which allows both the force and recursive options
const useNative = node.satisfies('>=14.14.0')

const rm = async (path, opts) => {
  const options = getOptions(opts, {
    copy: ['retryDelay', 'maxRetries', 'recursive', 'force'],
  })

  // the polyfill is tested separately from this module, no need to hack
  // process.version to try to trigger it just for coverage
  // istanbul ignore next
  return useNative
    ? fs.rm(path, options)
    : polyfill(path, options)
}

module.exports = rm
// this file is a modified version of the code in node core >=14.14.0
// which is, in turn, a modified version of the rimraf module on npm
// node core changes:
// - Use of the assert module has been replaced with core's error system.
// - All code related to the glob dependency has been removed.
// - Bring your own custom fs module is not currently supported.
// - Some basic code cleanup.
// changes here:
// - remove all callback related code
// - drop sync support
// - change assertions back to non-internal methods (see options.js)
// - throws ENOTDIR when rmdir gets an ENOENT for a path that exists in Windows
const errnos = require('os').constants.errno
const { join } = require('path')
const fs = require('../fs.js')

// error codes that mean we need to remove contents
const notEmptyCodes = new Set([
  'ENOTEMPTY',
  'EEXIST',
  'EPERM',
])

// error codes we can retry later
const retryCodes = new Set([
  'EBUSY',
  'EMFILE',
  'ENFILE',
  'ENOTEMPTY',
  'EPERM',
])

const isWindows = process.platform === 'win32'

const defaultOptions = {
  retryDelay: 100,
  maxRetries: 0,
  recursive: false,
  force: false,
}

// this is drastically simplified, but should be roughly equivalent to what
// node core throws
class ERR_FS_EISDIR extends Error {
  constructor (path) {
    super()
    this.info = {
      code: 'EISDIR',
      message: 'is a directory',
      path,
      syscall: 'rm',
      errno: errnos.EISDIR,
    }
    this.name = 'SystemError'
    this.code = 'ERR_FS_EISDIR'
    this.errno = errnos.EISDIR
    this.syscall = 'rm'
    this.path = path
    this.message = `Path is a directory: ${this.syscall} returned ` +
      `${this.info.code} (is a directory) ${path}`
  }

  toString () {
    return `${this.name} [${this.code}]: ${this.message}`
  }
}

class ENOTDIR extends Error {
  constructor (path) {
    super()
    this.name = 'Error'
    this.code = 'ENOTDIR'
    this.errno = errnos.ENOTDIR
    this.syscall = 'rmdir'
    this.path = path
    this.message = `not a directory, ${this.syscall} '${this.path}'`
  }

  toString () {
    return `${this.name}: ${this.code}: ${this.message}`
  }
}

// force is passed separately here because we respect it for the first entry
// into rimraf only, any further calls that are spawned as a result (i.e. to
// delete content within the target) will ignore ENOENT errors
const rimraf = async (path, options, isTop = false) => {
  const force = isTop ? options.force : true
  const stat = await fs.lstat(path)
    .catch((err) => {
      // we only ignore ENOENT if we're forcing this call
      if (err.code === 'ENOENT' && force) {
        return
      }

      if (isWindows && err.code === 'EPERM') {
        return fixEPERM(path, options, err, isTop)
      }

      throw err
    })

  // no stat object here means either lstat threw an ENOENT, or lstat threw
  // an EPERM and the fixPERM function took care of things. either way, we're
  // already done, so return early
  if (!stat) {
    return
  }

  if (stat.isDirectory()) {
    return rmdir(path, options, null, isTop)
  }

  return fs.unlink(path)
    .catch((err) => {
      if (err.code === 'ENOENT' && force) {
        return
      }

      if (err.code === 'EISDIR') {
        return rmdir(path, options, err, isTop)
      }

      if (err.code === 'EPERM') {
        // in windows, we handle this through fixEPERM which will also try to
        // delete things again. everywhere else since deleting the target as a
        // file didn't work we go ahead and try to delete it as a directory
        return isWindows
          ? fixEPERM(path, options, err, isTop)
          : rmdir(path, options, err, isTop)
      }

      throw err
    })
}

const fixEPERM = async (path, options, originalErr, isTop) => {
  const force = isTop ? options.force : true
  const targetMissing = await fs.chmod(path, 0o666)
    .catch((err) => {
      if (err.code === 'ENOENT' && force) {
        return true
      }

      throw originalErr
    })

  // got an ENOENT above, return now. no file = no problem
  if (targetMissing) {
    return
  }

  // this function does its own lstat rather than calling rimraf again to avoid
  // infinite recursion for a repeating EPERM
  const stat = await fs.lstat(path)
    .catch((err) => {
      if (err.code === 'ENOENT' && force) {
        return
      }

      throw originalErr
    })

  if (!stat) {
    return
  }

  if (stat.isDirectory()) {
    return rmdir(path, options, originalErr, isTop)
  }

  return fs.unlink(path)
}

const rmdir = async (path, options, originalErr, isTop) => {
  if (!options.recursive && isTop) {
    throw originalErr || new ERR_FS_EISDIR(path)
  }
  const force = isTop ? options.force : true

  return fs.rmdir(path)
    .catch(async (err) => {
      // in Windows, calling rmdir on a file path will fail with ENOENT rather
      // than ENOTDIR. to determine if that's what happened, we have to do
      // another lstat on the path. if the path isn't actually gone, we throw
      // away the ENOENT and replace it with our own ENOTDIR
      if (isWindows && err.code === 'ENOENT') {
        const stillExists = await fs.lstat(path).then(() => true, () => false)
        if (stillExists) {
          err = new ENOTDIR(path)
        }
      }

      // not there, not a problem
      if (err.code === 'ENOENT' && force) {
        return
      }

      // we may not have originalErr if lstat tells us our target is a
      // directory but that changes before we actually remove it, so
      // only throw it here if it's set
      if (originalErr && err.code === 'ENOTDIR') {
        throw originalErr
      }

      // the directory isn't empty, remove the contents and try again
      if (notEmptyCodes.has(err.code)) {
        const files = await fs.readdir(path)
        await Promise.all(files.map((file) => {
          const target = join(path, file)
          return rimraf(target, options)
        }))
        return fs.rmdir(path)
      }

      throw err
    })
}

const rm = async (path, opts) => {
  const options = { ...defaultOptions, ...opts }
  let retries = 0

  const errHandler = async (err) => {
    if (retryCodes.has(err.code) && ++retries < options.maxRetries) {
      const delay = retries * options.retryDelay
      await promiseTimeout(delay)
      return rimraf(path, options, true).catch(errHandler)
    }

    throw err
  }

  return rimraf(path, options, true).catch(errHandler)
}

const promiseTimeout = (ms) => new Promise((r) => setTimeout(r, ms))

module.exports = rm
const fs = require('../fs.js')
const getOptions = require('../common/get-options.js')
const node = require('../common/node.js')
const owner = require('../common/owner.js')

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

// node 10.12.0 added the options parameter, which allows recursive and mode
// properties to be passed
const useNative = node.satisfies('>=10.12.0')

// extends mkdir with the ability to specify an owner of the new dir
const mkdir = async (path, opts) => {
  const options = getOptions(opts, {
    copy: ['mode', 'recursive', 'owner'],
    wrap: 'mode',
  })
  const { uid, gid } = await owner.validate(path, options.owner)

  // the polyfill is tested separately from this module, no need to hack
  // process.version to try to trigger it just for coverage
  // istanbul ignore next
  const result = useNative
    ? await fs.mkdir(path, options)
    : await polyfill(path, options)

  await owner.update(path, uid, gid)

  return result
}

module.exports = mkdir
const { dirname } = require('path')

const fileURLToPath = require('../common/file-url-to-path/index.js')
const fs = require('../fs.js')

const defaultOptions = {
  mode: 0o777,
  recursive: false,
}

const mkdir = async (path, opts) => {
  const options = { ...defaultOptions, ...opts }

  // if we're not in recursive mode, just call the real mkdir with the path and
  // the mode option only
  if (!options.recursive) {
    return fs.mkdir(path, options.mode)
  }

  const makeDirectory = async (dir, mode) => {
    // we can't use dirname directly since these functions support URL
    // objects with the file: protocol as the path input, so first we get a
    // string path, then we can call dirname on that
    const parent = dir != null && dir.href && dir.origin
      ? dirname(fileURLToPath(dir))
      : dirname(dir)

    // if the parent is the dir itself, try to create it. anything but EISDIR
    // should be rethrown
    if (parent === dir) {
      try {
        await fs.mkdir(dir, opts)
      } catch (err) {
        if (err.code !== 'EISDIR') {
          throw err
        }
      }
      return undefined
    }

    try {
      await fs.mkdir(dir, mode)
      return dir
    } catch (err) {
      // ENOENT means the parent wasn't there, so create that
      if (err.code === 'ENOENT') {
        const made = await makeDirectory(parent, mode)
        await makeDirectory(dir, mode)
        // return the shallowest path we created, i.e. the result of creating
        // the parent
        return made
      }

      // an EEXIST means there's already something there
      // an EROFS means we have a read-only filesystem and can't create a dir
      // any other error is fatal and we should give up now
      if (err.code !== 'EEXIST' && err.code !== 'EROFS') {
        throw err
      }

      // stat the directory, if the result is a directory, then we successfully
      // created this one so return its path. otherwise, we reject with the
      // original error by ignoring the error in the catch
      try {
        const stat = await fs.stat(dir)
        if (stat.isDirectory()) {
          // if it already existed, we didn't create anything so return
          // undefined
          return undefined
        }
      } catch (_) {}

      // if the thing that's there isn't a directory, then just re-throw
      throw err
    }
  }

  return makeDirectory(path, options.mode)
}

module.exports = mkdir
(The MIT License)

Copyright (c) 2011-2017 JP Richardson

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.
const fs = require('../fs.js')
const getOptions = require('../common/get-options.js')
const node = require('../common/node.js')
const polyfill = require('./polyfill.js')

// node 16.7.0 added fs.cp
const useNative = node.satisfies('>=16.7.0')

const cp = async (src, dest, opts) => {
  const options = getOptions(opts, {
    copy: ['dereference', 'errorOnExist', 'filter', 'force', 'preserveTimestamps', 'recursive'],
  })

  // the polyfill is tested separately from this module, no need to hack
  // process.version to try to trigger it just for coverage
  // istanbul ignore next
  return useNative
    ? fs.cp(src, dest, options)
    : polyfill(src, dest, options)
}

module.exports = cp
// this file is a modified version of the code in node 17.2.0
// which is, in turn, a modified version of the fs-extra module on npm
// node core changes:
// - Use of the assert module has been replaced with core's error system.
// - All code related to the glob dependency has been removed.
// - Bring your own custom fs module is not currently supported.
// - Some basic code cleanup.
// changes here:
// - remove all callback related code
// - drop sync support
// - change assertions back to non-internal methods (see options.js)
// - throws ENOTDIR when rmdir gets an ENOENT for a path that exists in Windows
'use strict'

const {
  ERR_FS_CP_DIR_TO_NON_DIR,
  ERR_FS_CP_EEXIST,
  ERR_FS_CP_EINVAL,
  ERR_FS_CP_FIFO_PIPE,
  ERR_FS_CP_NON_DIR_TO_DIR,
  ERR_FS_CP_SOCKET,
  ERR_FS_CP_SYMLINK_TO_SUBDIRECTORY,
  ERR_FS_CP_UNKNOWN,
  ERR_FS_EISDIR,
  ERR_INVALID_ARG_TYPE,
} = require('../errors.js')
const {
  constants: {
    errno: {
      EEXIST,
      EISDIR,
      EINVAL,
      ENOTDIR,
    },
  },
} = require('os')
const {
  chmod,
  copyFile,
  lstat,
  mkdir,
  readdir,
  readlink,
  stat,
  symlink,
  unlink,
  utimes,
} = require('../fs.js')
const {
  dirname,
  isAbsolute,
  join,
  parse,
  resolve,
  sep,
  toNamespacedPath,
} = require('path')
const { fileURLToPath } = require('url')

const defaultOptions = {
  dereference: false,
  errorOnExist: false,
  filter: undefined,
  force: true,
  preserveTimestamps: false,
  recursive: false,
}

async function cp (src, dest, opts) {
  if (opts != null && typeof opts !== 'object') {
    throw new ERR_INVALID_ARG_TYPE('options', ['Object'], opts)
  }
  return cpFn(
    toNamespacedPath(getValidatedPath(src)),
    toNamespacedPath(getValidatedPath(dest)),
    { ...defaultOptions, ...opts })
}

function getValidatedPath (fileURLOrPath) {
  const path = fileURLOrPath != null && fileURLOrPath.href
      && fileURLOrPath.origin
    ? fileURLToPath(fileURLOrPath)
    : fileURLOrPath
  return path
}

async function cpFn (src, dest, opts) {
  // Warn about using preserveTimestamps on 32-bit node
  // istanbul ignore next
  if (opts.preserveTimestamps && process.arch === 'ia32') {
    const warning = 'Using the preserveTimestamps option in 32-bit ' +
      'node is not recommended'
    process.emitWarning(warning, 'TimestampPrecisionWarning')
  }
  const stats = await checkPaths(src, dest, opts)
  const { srcStat, destStat } = stats
  await checkParentPaths(src, srcStat, dest)
  if (opts.filter) {
    return handleFilter(checkParentDir, destStat, src, dest, opts)
  }
  return checkParentDir(destStat, src, dest, opts)
}

async function checkPaths (src, dest, opts) {
  const { 0: srcStat, 1: destStat } = await getStats(src, dest, opts)
  if (destStat) {
    if (areIdentical(srcStat, destStat)) {
      throw new ERR_FS_CP_EINVAL({
        message: 'src and dest cannot be the same',
        path: dest,
        syscall: 'cp',
        errno: EINVAL,
      })
    }
    if (srcStat.isDirectory() && !destStat.isDirectory()) {
      throw new ERR_FS_CP_DIR_TO_NON_DIR({
        message: `cannot overwrite directory ${src} ` +
            `with non-directory ${dest}`,
        path: dest,
        syscall: 'cp',
        errno: EISDIR,
      })
    }
    if (!srcStat.isDirectory() && destStat.isDirectory()) {
      throw new ERR_FS_CP_NON_DIR_TO_DIR({
        message: `cannot overwrite non-directory ${src} ` +
            `with directory ${dest}`,
        path: dest,
        syscall: 'cp',
        errno: ENOTDIR,
      })
    }
  }

  if (srcStat.isDirectory() && isSrcSubdir(src, dest)) {
    throw new ERR_FS_CP_EINVAL({
      message: `cannot copy ${src} to a subdirectory of self ${dest}`,
      path: dest,
      syscall: 'cp',
      errno: EINVAL,
    })
  }
  return { srcStat, destStat }
}

function areIdentical (srcStat, destStat) {
  return destStat.ino && destStat.dev && destStat.ino === srcStat.ino &&
    destStat.dev === srcStat.dev
}

function getStats (src, dest, opts) {
  const statFunc = opts.dereference ?
    (file) => stat(file, { bigint: true }) :
    (file) => lstat(file, { bigint: true })
  return Promise.all([
    statFunc(src),
    statFunc(dest).catch((err) => {
      // istanbul ignore next: unsure how to cover.
      if (err.code === 'ENOENT') {
        return null
      }
      // istanbul ignore next: unsure how to cover.
      throw err
    }),
  ])
}

async function checkParentDir (destStat, src, dest, opts) {
  const destParent = dirname(dest)
  const dirExists = await pathExists(destParent)
  if (dirExists) {
    return getStatsForCopy(destStat, src, dest, opts)
  }
  await mkdir(destParent, { recursive: true })
  return getStatsForCopy(destStat, src, dest, opts)
}

function pathExists (dest) {
  return stat(dest).then(
    () => true,
    // istanbul ignore next: not sure when this would occur
    (err) => (err.code === 'ENOENT' ? false : Promise.reject(err)))
}

// Recursively check if dest parent is a subdirectory of src.
// It works for all file types including symlinks since it
// checks the src and dest inodes. It starts from the deepest
// parent and stops once it reaches the src parent or the root path.
async function checkParentPaths (src, srcStat, dest) {
  const srcParent = resolve(dirname(src))
  const destParent = resolve(dirname(dest))
  if (destParent === srcParent || destParent === parse(destParent).root) {
    return
  }
  let destStat
  try {
    destStat = await stat(destParent, { bigint: true })
  } catch (err) {
    // istanbul ignore else: not sure when this would occur
    if (err.code === 'ENOENT') {
      return
    }
    // istanbul ignore next: not sure when this would occur
    throw err
  }
  if (areIdentical(srcStat, destStat)) {
    throw new ERR_FS_CP_EINVAL({
      message: `cannot copy ${src} to a subdirectory of self ${dest}`,
      path: dest,
      syscall: 'cp',
      errno: EINVAL,
    })
  }
  return checkParentPaths(src, srcStat, destParent)
}

const normalizePathToArray = (path) =>
  resolve(path).split(sep).filter(Boolean)

// Return true if dest is a subdir of src, otherwise false.
// It only checks the path strings.
function isSrcSubdir (src, dest) {
  const srcArr = normalizePathToArray(src)
  const destArr = normalizePathToArray(dest)
  return srcArr.every((cur, i) => destArr[i] === cur)
}

async function handleFilter (onInclude, destStat, src, dest, opts, cb) {
  const include = await opts.filter(src, dest)
  if (include) {
    return onInclude(destStat, src, dest, opts, cb)
  }
}

function startCopy (destStat, src, dest, opts) {
  if (opts.filter) {
    return handleFilter(getStatsForCopy, destStat, src, dest, opts)
  }
  return getStatsForCopy(destStat, src, dest, opts)
}

async function getStatsForCopy (destStat, src, dest, opts) {
  const statFn = opts.dereference ? stat : lstat
  const srcStat = await statFn(src)
  // istanbul ignore else: can't portably test FIFO
  if (srcStat.isDirectory() && opts.recursive) {
    return onDir(srcStat, destStat, src, dest, opts)
  } else if (srcStat.isDirectory()) {
    throw new ERR_FS_EISDIR({
      message: `${src} is a directory (not copied)`,
      path: src,
      syscall: 'cp',
      errno: EINVAL,
    })
  } else if (srcStat.isFile() ||
            srcStat.isCharacterDevice() ||
            srcStat.isBlockDevice()) {
    return onFile(srcStat, destStat, src, dest, opts)
  } else if (srcStat.isSymbolicLink()) {
    return onLink(destStat, src, dest)
  } else if (srcStat.isSocket()) {
    throw new ERR_FS_CP_SOCKET({
      message: `cannot copy a socket file: ${dest}`,
      path: dest,
      syscall: 'cp',
      errno: EINVAL,
    })
  } else if (srcStat.isFIFO()) {
    throw new ERR_FS_CP_FIFO_PIPE({
      message: `cannot copy a FIFO pipe: ${dest}`,
      path: dest,
      syscall: 'cp',
      errno: EINVAL,
    })
  }
  // istanbul ignore next: should be unreachable
  throw new ERR_FS_CP_UNKNOWN({
    message: `cannot copy an unknown file type: ${dest}`,
    path: dest,
    syscall: 'cp',
    errno: EINVAL,
  })
}

function onFile (srcStat, destStat, src, dest, opts) {
  if (!destStat) {
    return _copyFile(srcStat, src, dest, opts)
  }
  return mayCopyFile(srcStat, src, dest, opts)
}

async function mayCopyFile (srcStat, src, dest, opts) {
  if (opts.force) {
    await unlink(dest)
    return _copyFile(srcStat, src, dest, opts)
  } else if (opts.errorOnExist) {
    throw new ERR_FS_CP_EEXIST({
      message: `${dest} already exists`,
      path: dest,
      syscall: 'cp',
      errno: EEXIST,
    })
  }
}

async function _copyFile (srcStat, src, dest, opts) {
  await copyFile(src, dest)
  if (opts.preserveTimestamps) {
    return handleTimestampsAndMode(srcStat.mode, src, dest)
  }
  return setDestMode(dest, srcStat.mode)
}

async function handleTimestampsAndMode (srcMode, src, dest) {
  // Make sure the file is writable before setting the timestamp
  // otherwise open fails with EPERM when invoked with 'r+'
  // (through utimes call)
  if (fileIsNotWritable(srcMode)) {
    await makeFileWritable(dest, srcMode)
    return setDestTimestampsAndMode(srcMode, src, dest)
  }
  return setDestTimestampsAndMode(srcMode, src, dest)
}

function fileIsNotWritable (srcMode) {
  return (srcMode & 0o200) === 0
}

function makeFileWritable (dest, srcMode) {
  return setDestMode(dest, srcMode | 0o200)
}

async function setDestTimestampsAndMode (srcMode, src, dest) {
  await setDestTimestamps(src, dest)
  return setDestMode(dest, srcMode)
}

function setDestMode (dest, srcMode) {
  return chmod(dest, srcMode)
}

async function setDestTimestamps (src, dest) {
  // The initial srcStat.atime cannot be trusted
  // because it is modified by the read(2) system call
  // (See https://nodejs.org/api/fs.html#fs_stat_time_values)
  const updatedSrcStat = await stat(src)
  return utimes(dest, updatedSrcStat.atime, updatedSrcStat.mtime)
}

function onDir (srcStat, destStat, src, dest, opts) {
  if (!destStat) {
    return mkDirAndCopy(srcStat.mode, src, dest, opts)
  }
  return copyDir(src, dest, opts)
}

async function mkDirAndCopy (srcMode, src, dest, opts) {
  await mkdir(dest)
  await copyDir(src, dest, opts)
  return setDestMode(dest, srcMode)
}

async function copyDir (src, dest, opts) {
  const dir = await readdir(src)
  for (let i = 0; i < dir.length; i++) {
    const item = dir[i]
    const srcItem = join(src, item)
    const destItem = join(dest, item)
    const { destStat } = await checkPaths(srcItem, destItem, opts)
    await startCopy(destStat, srcItem, destItem, opts)
  }
}

async function onLink (destStat, src, dest) {
  let resolvedSrc = await readlink(src)
  if (!isAbsolute(resolvedSrc)) {
    resolvedSrc = resolve(dirname(src), resolvedSrc)
  }
  if (!destStat) {
    return symlink(resolvedSrc, dest)
  }
  let resolvedDest
  try {
    resolvedDest = await readlink(dest)
  } catch (err) {
    // Dest exists and is a regular file or directory,
    // Windows may throw UNKNOWN error. If dest already exists,
    // fs throws error anyway, so no need to guard against it here.
    // istanbul ignore next: can only test on windows
    if (err.code === 'EINVAL' || err.code === 'UNKNOWN') {
      return symlink(resolvedSrc, dest)
    }
    // istanbul ignore next: should not be possible
    throw err
  }
  if (!isAbsolute(resolvedDest)) {
    resolvedDest = resolve(dirname(dest), resolvedDest)
  }
  if (isSrcSubdir(resolvedSrc, resolvedDest)) {
    throw new ERR_FS_CP_EINVAL({
      message: `cannot copy ${resolvedSrc} to a subdirectory of self ` +
            `${resolvedDest}`,
      path: dest,
      syscall: 'cp',
      errno: EINVAL,
    })
  }
  // Do not copy if src is a subdir of dest since unlinking
  // dest in this case would result in removing src contents
  // and therefore a broken symlink would be created.
  const srcStat = await stat(src)
  if (srcStat.isDirectory() && isSrcSubdir(resolvedDest, resolvedSrc)) {
    throw new ERR_FS_CP_SYMLINK_TO_SUBDIRECTORY({
      message: `cannot overwrite ${resolvedDest} with ${resolvedSrc}`,
      path: dest,
      syscall: 'cp',
      errno: EINVAL,
    })
  }
  return copyLink(resolvedSrc, dest)
}

async function copyLink (resolvedSrc, dest) {
  await unlink(dest)
  return symlink(resolvedSrc, dest)
}

module.exports = cp
// given an input that may or may not be an object, return an object that has
// a copy of every defined property listed in 'copy'. if the input is not an
// object, assign it to the property named by 'wrap'
const getOptions = (input, { copy, wrap }) => {
  const result = {}

  if (input && typeof input === 'object') {
    for (const prop of copy) {
      if (input[prop] !== undefined) {
        result[prop] = input[prop]
      }
    }
  } else {
    result[wrap] = input
  }

  return result
}

module.exports = getOptions
const semver = require('semver')

const satisfies = (range) => {
  return semver.satisfies(process.version, range, { includePrerelease: true })
}

module.exports = {
  satisfies,
}
const { dirname, resolve } = require('path')

const fileURLToPath = require('./file-url-to-path/index.js')
const fs = require('../fs.js')

// given a path, find the owner of the nearest parent
const find = async (path) => {
  // if we have no getuid, permissions are irrelevant on this platform
  if (!process.getuid) {
    return {}
  }

  // fs methods accept URL objects with a scheme of file: so we need to unwrap
  // those into an actual path string before we can resolve it
  const resolved = path != null && path.href && path.origin
    ? resolve(fileURLToPath(path))
    : resolve(path)

  let stat

  try {
    stat = await fs.lstat(resolved)
  } finally {
    // if we got a stat, return its contents
    if (stat) {
      return { uid: stat.uid, gid: stat.gid }
    }

    // try the parent directory
    if (resolved !== dirname(resolved)) {
      return find(dirname(resolved))
    }

    // no more parents, never got a stat, just return an empty object
    return {}
  }
}

// given a path, uid, and gid update the ownership of the path if necessary
const update = async (path, uid, gid) => {
  // nothing to update, just exit
  if (uid === undefined && gid === undefined) {
    return
  }

  try {
    // see if the permissions are already the same, if they are we don't
    // need to do anything, so return early
    const stat = await fs.stat(path)
    if (uid === stat.uid && gid === stat.gid) {
      return
    }
  } catch (err) {}

  try {
    await fs.chown(path, uid, gid)
  } catch (err) {}
}

// accepts a `path` and the `owner` property of an options object and normalizes
// it into an object with numerical `uid` and `gid`
const validate = async (path, input) => {
  let uid
  let gid

  if (typeof input === 'string' || typeof input === 'number') {
    uid = input
    gid = input
  } else if (input && typeof input === 'object') {
    uid = input.uid
    gid = input.gid
  }

  if (uid === 'inherit' || gid === 'inherit') {
    const owner = await find(path)
    if (uid === 'inherit') {
      uid = owner.uid
    }

    if (gid === 'inherit') {
      gid = owner.gid
    }
  }

  return { uid, gid }
}

module.exports = {
  find,
  update,
  validate,
}
const url = require('url')

const node = require('../node.js')
const polyfill = require('./polyfill.js')

const useNative = node.satisfies('>=10.12.0')

const fileURLToPath = (path) => {
  // the polyfill is tested separately from this module, no need to hack
  // process.version to try to trigger it just for coverage
  // istanbul ignore next
  return useNative
    ? url.fileURLToPath(path)
    : polyfill(path)
}

module.exports = fileURLToPath
const { URL, domainToUnicode } = require('url')

const CHAR_LOWERCASE_A = 97
const CHAR_LOWERCASE_Z = 122

const isWindows = process.platform === 'win32'

class ERR_INVALID_FILE_URL_HOST extends TypeError {
  constructor (platform) {
    super(`File URL host must be "localhost" or empty on ${platform}`)
    this.code = 'ERR_INVALID_FILE_URL_HOST'
  }

  toString () {
    return `${this.name} [${this.code}]: ${this.message}`
  }
}

class ERR_INVALID_FILE_URL_PATH extends TypeError {
  constructor (msg) {
    super(`File URL path ${msg}`)
    this.code = 'ERR_INVALID_FILE_URL_PATH'
  }

  toString () {
    return `${this.name} [${this.code}]: ${this.message}`
  }
}

class ERR_INVALID_ARG_TYPE extends TypeError {
  constructor (name, actual) {
    super(`The "${name}" argument must be one of type string or an instance ` +
      `of URL. Received type ${typeof actual} ${actual}`)
    this.code = 'ERR_INVALID_ARG_TYPE'
  }

  toString () {
    return `${this.name} [${this.code}]: ${this.message}`
  }
}

class ERR_INVALID_URL_SCHEME extends TypeError {
  constructor (expected) {
    super(`The URL must be of scheme ${expected}`)
    this.code = 'ERR_INVALID_URL_SCHEME'
  }

  toString () {
    return `${this.name} [${this.code}]: ${this.message}`
  }
}

const isURLInstance = (input) => {
  return input != null && input.href && input.origin
}

const getPathFromURLWin32 = (url) => {
  const hostname = url.hostname
  let pathname = url.pathname
  for (let n = 0; n < pathname.length; n++) {
    if (pathname[n] === '%') {
      const third = pathname.codePointAt(n + 2) | 0x20
      if ((pathname[n + 1] === '2' && third === 102) ||
        (pathname[n + 1] === '5' && third === 99)) {
        throw new ERR_INVALID_FILE_URL_PATH('must not include encoded \\ or / characters')
      }
    }
  }

  pathname = pathname.replace(/\//g, '\\')
  pathname = decodeURIComponent(pathname)
  if (hostname !== '') {
    return `\\\\${domainToUnicode(hostname)}${pathname}`
  }

  const letter = pathname.codePointAt(1) | 0x20
  const sep = pathname[2]
  if (letter < CHAR_LOWERCASE_A || letter > CHAR_LOWERCASE_Z ||
    (sep !== ':')) {
    throw new ERR_INVALID_FILE_URL_PATH('must be absolute')
  }

  return pathname.slice(1)
}

const getPathFromURLPosix = (url) => {
  if (url.hostname !== '') {
    throw new ERR_INVALID_FILE_URL_HOST(process.platform)
  }

  const pathname = url.pathname

  for (let n = 0; n < pathname.length; n++) {
    if (pathname[n] === '%') {
      const third = pathname.codePointAt(n + 2) | 0x20
      if (pathname[n + 1] === '2' && third === 102) {
        throw new ERR_INVALID_FILE_URL_PATH('must not include encoded / characters')
      }
    }
  }

  return decodeURIComponent(pathname)
}

const fileURLToPath = (path) => {
  if (typeof path === 'string') {
    path = new URL(path)
  } else if (!isURLInstance(path)) {
    throw new ERR_INVALID_ARG_TYPE('path', ['string', 'URL'], path)
  }

  if (path.protocol !== 'file:') {
    throw new ERR_INVALID_URL_SCHEME('file')
  }

  return isWindows
    ? getPathFromURLWin32(path)
    : getPathFromURLPosix(path)
}

module.exports = fileURLToPath
MIT License

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

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.
const { dirname, join, resolve, relative, isAbsolute } = require('path')
const rimraf_ = require('rimraf')
const { promisify } = require('util')
const {
  access: access_,
  accessSync,
  copyFile: copyFile_,
  copyFileSync,
  unlink: unlink_,
  unlinkSync,
  readdir: readdir_,
  readdirSync,
  rename: rename_,
  renameSync,
  stat: stat_,
  statSync,
  lstat: lstat_,
  lstatSync,
  symlink: symlink_,
  symlinkSync,
  readlink: readlink_,
  readlinkSync
} = require('fs')

const access = promisify(access_)
const copyFile = promisify(copyFile_)
const unlink = promisify(unlink_)
const readdir = promisify(readdir_)
const rename = promisify(rename_)
const stat = promisify(stat_)
const lstat = promisify(lstat_)
const symlink = promisify(symlink_)
const readlink = promisify(readlink_)
const rimraf = promisify(rimraf_)
const rimrafSync = rimraf_.sync

const mkdirp = require('mkdirp')

const pathExists = async path => {
  try {
    await access(path)
    return true
  } catch (er) {
    return er.code !== 'ENOENT'
  }
}

const pathExistsSync = path => {
  try {
    accessSync(path)
    return true
  } catch (er) {
    return er.code !== 'ENOENT'
  }
}

const moveFile = async (source, destination, options = {}, root = true, symlinks = []) => {
  if (!source || !destination) {
    throw new TypeError('`source` and `destination` file required')
  }

  options = {
    overwrite: true,
    ...options
  }

  if (!options.overwrite && await pathExists(destination)) {
    throw new Error(`The destination file exists: ${destination}`)
  }

  await mkdirp(dirname(destination))

  try {
    await rename(source, destination)
  } catch (error) {
    if (error.code === 'EXDEV' || error.code === 'EPERM') {
      const sourceStat = await lstat(source)
      if (sourceStat.isDirectory()) {
        const files = await readdir(source)
        await Promise.all(files.map((file) => moveFile(join(source, file), join(destination, file), options, false, symlinks)))
      } else if (sourceStat.isSymbolicLink()) {
        symlinks.push({ source, destination })
      } else {
        await copyFile(source, destination)
      }
    } else {
      throw error
    }
  }

  if (root) {
    await Promise.all(symlinks.map(async ({ source, destination }) => {
      let target = await readlink(source)
      // junction symlinks in windows will be absolute paths, so we need to make sure they point to the destination
      if (isAbsolute(target))
        target = resolve(destination, relative(source, target))
      // try to determine what the actual file is so we can create the correct type of symlink in windows
      let targetStat
      try {
        targetStat = await stat(resolve(dirname(source), target))
      } catch (err) {}
      await symlink(target, destination, targetStat && targetStat.isDirectory() ? 'junction' : 'file')
    }))
    await rimraf(source)
  }
}

const moveFileSync = (source, destination, options = {}, root = true, symlinks = []) => {
  if (!source || !destination) {
    throw new TypeError('`source` and `destination` file required')
  }

  options = {
    overwrite: true,
    ...options
  }

  if (!options.overwrite && pathExistsSync(destination)) {
    throw new Error(`The destination file exists: ${destination}`)
  }

  mkdirp.sync(dirname(destination))

  try {
    renameSync(source, destination)
  } catch (error) {
    if (error.code === 'EXDEV' || error.code === 'EPERM') {
      const sourceStat = lstatSync(source)
      if (sourceStat.isDirectory()) {
        const files = readdirSync(source)
        for (const file of files) {
          moveFileSync(join(source, file), join(destination, file), options, false, symlinks)
        }
      } else if (sourceStat.isSymbolicLink()) {
        symlinks.push({ source, destination })
      } else {
        copyFileSync(source, destination)
      }
    } else {
      throw error
    }
  }

  if (root) {
    for (const { source, destination } of symlinks) {
      let target = readlinkSync(source)
      // junction symlinks in windows will be absolute paths, so we need to make sure they point to the destination
      if (isAbsolute(target))
        target = resolve(destination, relative(source, target))
      // try to determine what the actual file is so we can create the correct type of symlink in windows
      let targetStat
      try {
        targetStat = statSync(resolve(dirname(source), target))
      } catch (err) {}
      symlinkSync(target, destination, targetStat && targetStat.isDirectory() ? 'junction' : 'file')
    }
    rimrafSync(source)
  }
}

module.exports = moveFile
module.exports.sync = moveFileSync
{
  "name": "@npmcli/move-file",
  "version": "1.1.2",
  "files": [
    "index.js"
  ],
  "description": "move a file (fork of move-file)",
  "dependencies": {
    "mkdirp": "^1.0.4",
    "rimraf": "^3.0.2"
  },
  "devDependencies": {
    "require-inject": "^1.4.4",
    "tap": "^14.10.7"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/npm/move-file"
  },
  "tap": {
    "check-coverage": true
  },
  "license": "MIT",
  "engines": {
    "node": ">=10"
  }
}ISC License

Copyright (c) npm, Inc.

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 COPYRIGHT HOLDER DISCLAIMS
ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
COPYRIGHT HOLDER 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.
'use strict'

const Collect = require('minipass-collect')
const Minipass = require('minipass')
const Pipeline = require('minipass-pipeline')
const fs = require('fs')
const util = require('util')

const index = require('./lib/entry-index')
const memo = require('./lib/memoization')
const read = require('./lib/content/read')

const writeFile = util.promisify(fs.writeFile)

function getData (cache, key, opts = {}) {
  const { integrity, memoize, size } = opts
  const memoized = memo.get(cache, key, opts)
  if (memoized && memoize !== false) {
    return Promise.resolve({
      metadata: memoized.entry.metadata,
      data: memoized.data,
      integrity: memoized.entry.integrity,
      size: memoized.entry.size,
    })
  }

  return index.find(cache, key, opts).then((entry) => {
    if (!entry)
      throw new index.NotFoundError(cache, key)

    return read(cache, entry.integrity, { integrity, size }).then((data) => {
      if (memoize)
        memo.put(cache, entry, data, opts)

      return {
        data,
        metadata: entry.metadata,
        size: entry.size,
        integrity: entry.integrity,
      }
    })
  })
}
module.exports = getData

function getDataByDigest (cache, key, opts = {}) {
  const { integrity, memoize, size } = opts
  const memoized = memo.get.byDigest(cache, key, opts)
  if (memoized && memoize !== false)
    return Promise.resolve(memoized)

  return read(cache, key, { integrity, size }).then((res) => {
    if (memoize)
      memo.put.byDigest(cache, key, res, opts)
    return res
  })
}
module.exports.byDigest = getDataByDigest

function getDataSync (cache, key, opts = {}) {
  const { integrity, memoize, size } = opts
  const memoized = memo.get(cache, key, opts)

  if (memoized && memoize !== false) {
    return {
      metadata: memoized.entry.metadata,
      data: memoized.data,
      integrity: memoized.entry.integrity,
      size: memoized.entry.size,
    }
  }
  const entry = index.find.sync(cache, key, opts)
  if (!entry)
    throw new index.NotFoundError(cache, key)
  const data = read.sync(cache, entry.integrity, {
    integrity: integrity,
    size: size,
  })
  const res = {
    metadata: entry.metadata,
    data: data,
    size: entry.size,
    integrity: entry.integrity,
  }
  if (memoize)
    memo.put(cache, entry, res.data, opts)

  return res
}

module.exports.sync = getDataSync

function getDataByDigestSync (cache, digest, opts = {}) {
  const { integrity, memoize, size } = opts
  const memoized = memo.get.byDigest(cache, digest, opts)

  if (memoized && memoize !== false)
    return memoized

  const res = read.sync(cache, digest, {
    integrity: integrity,
    size: size,
  })
  if (memoize)
    memo.put.byDigest(cache, digest, res, opts)

  return res
}
module.exports.sync.byDigest = getDataByDigestSync

const getMemoizedStream = (memoized) => {
  const stream = new Minipass()
  stream.on('newListener', function (ev, cb) {
    ev === 'metadata' && cb(memoized.entry.metadata)
    ev === 'integrity' && cb(memoized.entry.integrity)
    ev === 'size' && cb(memoized.entry.size)
  })
  stream.end(memoized.data)
  return stream
}

function getStream (cache, key, opts = {}) {
  const { memoize, size } = opts
  const memoized = memo.get(cache, key, opts)
  if (memoized && memoize !== false)
    return getMemoizedStream(memoized)

  const stream = new Pipeline()
  index
    .find(cache, key)
    .then((entry) => {
      if (!entry)
        throw new index.NotFoundError(cache, key)

      stream.emit('metadata', entry.metadata)
      stream.emit('integrity', entry.integrity)
      stream.emit('size', entry.size)
      stream.on('newListener', function (ev, cb) {
        ev === 'metadata' && cb(entry.metadata)
        ev === 'integrity' && cb(entry.integrity)
        ev === 'size' && cb(entry.size)
      })

      const src = read.readStream(
        cache,
        entry.integrity,
        { ...opts, size: typeof size !== 'number' ? entry.size : size }
      )

      if (memoize) {
        const memoStream = new Collect.PassThrough()
        memoStream.on('collect', data => memo.put(cache, entry, data, opts))
        stream.unshift(memoStream)
      }
      stream.unshift(src)
    })
    .catch((err) => stream.emit('error', err))

  return stream
}

module.exports.stream = getStream

function getStreamDigest (cache, integrity, opts = {}) {
  const { memoize } = opts
  const memoized = memo.get.byDigest(cache, integrity, opts)
  if (memoized && memoize !== false) {
    const stream = new Minipass()
    stream.end(memoized)
    return stream
  } else {
    const stream = read.readStream(cache, integrity, opts)
    if (!memoize)
      return stream

    const memoStream = new Collect.PassThrough()
    memoStream.on('collect', data => memo.put.byDigest(
      cache,
      integrity,
      data,
      opts
    ))
    return new Pipeline(stream, memoStream)
  }
}

module.exports.stream.byDigest = getStreamDigest

function info (cache, key, opts = {}) {
  const { memoize } = opts
  const memoized = memo.get(cache, key, opts)
  if (memoized && memoize !== false)
    return Promise.resolve(memoized.entry)
  else
    return index.find(cache, key)
}
module.exports.info = info

function copy (cache, key, dest, opts = {}) {
  if (read.copy) {
    return index.find(cache, key, opts).then((entry) => {
      if (!entry)
        throw new index.NotFoundError(cache, key)
      return read.copy(cache, entry.integrity, dest, opts)
        .then(() => {
          return {
            metadata: entry.metadata,
            size: entry.size,
            integrity: entry.integrity,
          }
        })
    })
  }

  return getData(cache, key, opts).then((res) => {
    return writeFile(dest, res.data).then(() => {
      return {
        metadata: res.metadata,
        size: res.size,
        integrity: res.integrity,
      }
    })
  })
}
module.exports.copy = copy

function copyByDigest (cache, key, dest, opts = {}) {
  if (read.copy)
    return read.copy(cache, key, dest, opts).then(() => key)

  return getDataByDigest(cache, key, opts).then((res) => {
    return writeFile(dest, res).then(() => key)
  })
}
module.exports.copy.byDigest = copyByDigest

module.exports.hasContent = read.hasContent
'use strict'

const ls = require('./ls.js')
const get = require('./get.js')
const put = require('./put.js')
const rm = require('./rm.js')
const verify = require('./verify.js')
const { clearMemoized } = require('./lib/memoization.js')
const tmp = require('./lib/util/tmp.js')
const index = require('./lib/entry-index.js')

module.exports.index = {}
module.exports.index.compact = index.compact
module.exports.index.insert = index.insert

module.exports.ls = ls
module.exports.ls.stream = ls.stream

module.exports.get = get
module.exports.get.byDigest = get.byDigest
module.exports.get.sync = get.sync
module.exports.get.sync.byDigest = get.sync.byDigest
module.exports.get.stream = get.stream
module.exports.get.stream.byDigest = get.stream.byDigest
module.exports.get.copy = get.copy
module.exports.get.copy.byDigest = get.copy.byDigest
module.exports.get.info = get.info
module.exports.get.hasContent = get.hasContent
module.exports.get.hasContent.sync = get.hasContent.sync

module.exports.put = put
module.exports.put.stream = put.stream

module.exports.rm = rm.entry
module.exports.rm.all = rm.all
module.exports.rm.entry = module.exports.rm
module.exports.rm.content = rm.content

module.exports.clearMemoized = clearMemoized

module.exports.tmp = {}
module.exports.tmp.mkdir = tmp.mkdir
module.exports.tmp.withTmp = tmp.withTmp

module.exports.verify = verify
module.exports.verify.lastRun = verify.lastRun
'use strict'

const index = require('./lib/entry-index')

module.exports = index.ls
module.exports.stream = index.lsStream
{
  "name": "cacache",
  "version": "15.3.0",
  "cache-version": {
    "content": "2",
    "index": "5"
  },
  "description": "Fast, fault-tolerant, cross-platform, disk-based, data-agnostic, content-addressable cache.",
  "main": "index.js",
  "files": [
    "*.js",
    "lib"
  ],
  "repository": "https://github.com/npm/cacache",
  "license": "ISC",
  "dependencies": {
    "@npmcli/fs": "^1.0.0",
    "@npmcli/move-file": "^1.0.1",
    "chownr": "^2.0.0",
    "fs-minipass": "^2.0.0",
    "glob": "^7.1.4",
    "infer-owner": "^1.0.4",
    "lru-cache": "^6.0.0",
    "minipass": "^3.1.1",
    "minipass-collect": "^1.0.2",
    "minipass-flush": "^1.0.5",
    "minipass-pipeline": "^1.2.2",
    "mkdirp": "^1.0.3",
    "p-map": "^4.0.0",
    "promise-inflight": "^1.0.1",
    "rimraf": "^3.0.2",
    "ssri": "^8.0.1",
    "tar": "^6.0.2",
    "unique-filename": "^1.1.1"
  },
  "devDependencies": {
    "@npmcli/lint": "^1.0.1",
    "benchmark": "^2.1.4",
    "chalk": "^4.0.0",
    "require-inject": "^1.4.4",
    "tacks": "^1.3.0",
    "tap": "^15.0.9"
  },
  "tap": {
    "100": true,
    "test-regex": "test/[^/]*.js"
  },
  "engines": {
    "node": ">= 10"
  }
}'use strict'

const index = require('./lib/entry-index')
const memo = require('./lib/memoization')
const write = require('./lib/content/write')
const Flush = require('minipass-flush')
const { PassThrough } = require('minipass-collect')
const Pipeline = require('minipass-pipeline')

const putOpts = (opts) => ({
  algorithms: ['sha512'],
  ...opts,
})

module.exports = putData

function putData (cache, key, data, opts = {}) {
  const { memoize } = opts
  opts = putOpts(opts)
  return write(cache, data, opts).then((res) => {
    return index
      .insert(cache, key, res.integrity, { ...opts, size: res.size })
      .then((entry) => {
        if (memoize)
          memo.put(cache, entry, data, opts)

        return res.integrity
      })
  })
}

module.exports.stream = putStream

function putStream (cache, key, opts = {}) {
  const { memoize } = opts
  opts = putOpts(opts)
  let integrity
  let size

  let memoData
  const pipeline = new Pipeline()
  // first item in the pipeline is the memoizer, because we need
  // that to end first and get the collected data.
  if (memoize) {
    const memoizer = new PassThrough().on('collect', data => {
      memoData = data
    })
    pipeline.push(memoizer)
  }

  // contentStream is a write-only, not a passthrough
  // no data comes out of it.
  const contentStream = write.stream(cache, opts)
    .on('integrity', (int) => {
      integrity = int
    })
    .on('size', (s) => {
      size = s
    })

  pipeline.push(contentStream)

  // last but not least, we write the index and emit hash and size,
  // and memoize if we're doing that
  pipeline.push(new Flush({
    flush () {
      return index
        .insert(cache, key, integrity, { ...opts, size })
        .then((entry) => {
          if (memoize && memoData)
            memo.put(cache, entry, memoData, opts)

          if (integrity)
            pipeline.emit('integrity', integrity)

          if (size)
            pipeline.emit('size', size)
        })
    },
  }))

  return pipeline
}
'use strict'

const util = require('util')

const index = require('./lib/entry-index')
const memo = require('./lib/memoization')
const path = require('path')
const rimraf = util.promisify(require('rimraf'))
const rmContent = require('./lib/content/rm')

module.exports = entry
module.exports.entry = entry

function entry (cache, key, opts) {
  memo.clearMemoized()
  return index.delete(cache, key, opts)
}

module.exports.content = content

function content (cache, integrity) {
  memo.clearMemoized()
  return rmContent(cache, integrity)
}

module.exports.all = all

function all (cache) {
  memo.clearMemoized()
  return rimraf(path.join(cache, '*(content-*|index-*)'))
}
'use strict'

module.exports = require('./lib/verify')
'use strict'

const util = require('util')
const crypto = require('crypto')
const fs = require('fs')
const Minipass = require('minipass')
const path = require('path')
const ssri = require('ssri')
const uniqueFilename = require('unique-filename')

const { disposer } = require('./util/disposer')
const contentPath = require('./content/path')
const fixOwner = require('./util/fix-owner')
const hashToSegments = require('./util/hash-to-segments')
const indexV = require('../package.json')['cache-version'].index
const moveFile = require('@npmcli/move-file')
const _rimraf = require('rimraf')
const rimraf = util.promisify(_rimraf)
rimraf.sync = _rimraf.sync

const appendFile = util.promisify(fs.appendFile)
const readFile = util.promisify(fs.readFile)
const readdir = util.promisify(fs.readdir)
const writeFile = util.promisify(fs.writeFile)

module.exports.NotFoundError = class NotFoundError extends Error {
  constructor (cache, key) {
    super(`No cache entry for ${key} found in ${cache}`)
    this.code = 'ENOENT'
    this.cache = cache
    this.key = key
  }
}

module.exports.compact = compact

async function compact (cache, key, matchFn, opts = {}) {
  const bucket = bucketPath(cache, key)
  const entries = await bucketEntries(bucket)
  const newEntries = []
  // we loop backwards because the bottom-most result is the newest
  // since we add new entries with appendFile
  for (let i = entries.length - 1; i >= 0; --i) {
    const entry = entries[i]
    // a null integrity could mean either a delete was appended
    // or the user has simply stored an index that does not map
    // to any content. we determine if the user wants to keep the
    // null integrity based on the validateEntry function passed in options.
    // if the integrity is null and no validateEntry is provided, we break
    // as we consider the null integrity to be a deletion of everything
    // that came before it.
    if (entry.integrity === null && !opts.validateEntry)
      break

    // if this entry is valid, and it is either the first entry or
    // the newEntries array doesn't already include an entry that
    // matches this one based on the provided matchFn, then we add
    // it to the beginning of our list
    if ((!opts.validateEntry || opts.validateEntry(entry) === true) &&
      (newEntries.length === 0 ||
        !newEntries.find((oldEntry) => matchFn(oldEntry, entry))))
      newEntries.unshift(entry)
  }

  const newIndex = '\n' + newEntries.map((entry) => {
    const stringified = JSON.stringify(entry)
    const hash = hashEntry(stringified)
    return `${hash}\t${stringified}`
  }).join('\n')

  const setup = async () => {
    const target = uniqueFilename(path.join(cache, 'tmp'), opts.tmpPrefix)
    await fixOwner.mkdirfix(cache, path.dirname(target))
    return {
      target,
      moved: false,
    }
  }

  const teardown = async (tmp) => {
    if (!tmp.moved)
      return rimraf(tmp.target)
  }

  const write = async (tmp) => {
    await writeFile(tmp.target, newIndex, { flag: 'wx' })
    await fixOwner.mkdirfix(cache, path.dirname(bucket))
    // we use @npmcli/move-file directly here because we
    // want to overwrite the existing file
    await moveFile(tmp.target, bucket)
    tmp.moved = true
    try {
      await fixOwner.chownr(cache, bucket)
    } catch (err) {
      if (err.code !== 'ENOENT')
        throw err
    }
  }

  // write the file atomically
  await disposer(setup(), teardown, write)

  // we reverse the list we generated such that the newest
  // entries come first in order to make looping through them easier
  // the true passed to formatEntry tells it to keep null
  // integrity values, if they made it this far it's because
  // validateEntry returned true, and as such we should return it
  return newEntries.reverse().map((entry) => formatEntry(cache, entry, true))
}

module.exports.insert = insert

function insert (cache, key, integrity, opts = {}) {
  const { metadata, size } = opts
  const bucket = bucketPath(cache, key)
  const entry = {
    key,
    integrity: integrity && ssri.stringify(integrity),
    time: Date.now(),
    size,
    metadata,
  }
  return fixOwner
    .mkdirfix(cache, path.dirname(bucket))
    .then(() => {
      const stringified = JSON.stringify(entry)
      // NOTE - Cleverness ahoy!
      //
      // This works because it's tremendously unlikely for an entry to corrupt
      // another while still preserving the string length of the JSON in
      // question. So, we just slap the length in there and verify it on read.
      //
      // Thanks to @isaacs for the whiteboarding session that ended up with
      // this.
      return appendFile(bucket, `\n${hashEntry(stringified)}\t${stringified}`)
    })
    .then(() => fixOwner.chownr(cache, bucket))
    .catch((err) => {
      if (err.code === 'ENOENT')
        return undefined

      throw err
      // There's a class of race conditions that happen when things get deleted
      // during fixOwner, or between the two mkdirfix/chownr calls.
      //
      // It's perfectly fine to just not bother in those cases and lie
      // that the index entry was written. Because it's a cache.
    })
    .then(() => {
      return formatEntry(cache, entry)
    })
}

module.exports.insert.sync = insertSync

function insertSync (cache, key, integrity, opts = {}) {
  const { metadata, size } = opts
  const bucket = bucketPath(cache, key)
  const entry = {
    key,
    integrity: integrity && ssri.stringify(integrity),
    time: Date.now(),
    size,
    metadata,
  }
  fixOwner.mkdirfix.sync(cache, path.dirname(bucket))
  const stringified = JSON.stringify(entry)
  fs.appendFileSync(bucket, `\n${hashEntry(stringified)}\t${stringified}`)
  try {
    fixOwner.chownr.sync(cache, bucket)
  } catch (err) {
    if (err.code !== 'ENOENT')
      throw err
  }
  return formatEntry(cache, entry)
}

module.exports.find = find

function find (cache, key) {
  const bucket = bucketPath(cache, key)
  return bucketEntries(bucket)
    .then((entries) => {
      return entries.reduce((latest, next) => {
        if (next && next.key === key)
          return formatEntry(cache, next)
        else
          return latest
      }, null)
    })
    .catch((err) => {
      if (err.code === 'ENOENT')
        return null
      else
        throw err
    })
}

module.exports.find.sync = findSync

function findSync (cache, key) {
  const bucket = bucketPath(cache, key)
  try {
    return bucketEntriesSync(bucket).reduce((latest, next) => {
      if (next && next.key === key)
        return formatEntry(cache, next)
      else
        return latest
    }, null)
  } catch (err) {
    if (err.code === 'ENOENT')
      return null
    else
      throw err
  }
}

module.exports.delete = del

function del (cache, key, opts = {}) {
  if (!opts.removeFully)
    return insert(cache, key, null, opts)

  const bucket = bucketPath(cache, key)
  return rimraf(bucket)
}

module.exports.delete.sync = delSync

function delSync (cache, key, opts = {}) {
  if (!opts.removeFully)
    return insertSync(cache, key, null, opts)

  const bucket = bucketPath(cache, key)
  return rimraf.sync(bucket)
}

module.exports.lsStream = lsStream

function lsStream (cache) {
  const indexDir = bucketDir(cache)
  const stream = new Minipass({ objectMode: true })

  readdirOrEmpty(indexDir).then(buckets => Promise.all(
    buckets.map(bucket => {
      const bucketPath = path.join(indexDir, bucket)
      return readdirOrEmpty(bucketPath).then(subbuckets => Promise.all(
        subbuckets.map(subbucket => {
          const subbucketPath = path.join(bucketPath, subbucket)

          // "/cachename/<bucket 0xFF>/<bucket 0xFF>./*"
          return readdirOrEmpty(subbucketPath).then(entries => Promise.all(
            entries.map(entry => {
              const entryPath = path.join(subbucketPath, entry)
              return bucketEntries(entryPath).then(entries =>
                // using a Map here prevents duplicate keys from
                // showing up twice, I guess?
                entries.reduce((acc, entry) => {
                  acc.set(entry.key, entry)
                  return acc
                }, new Map())
              ).then(reduced => {
                // reduced is a map of key => entry
                for (const entry of reduced.values()) {
                  const formatted = formatEntry(cache, entry)
                  if (formatted)
                    stream.write(formatted)
                }
              }).catch(err => {
                if (err.code === 'ENOENT')
                  return undefined
                throw err
              })
            })
          ))
        })
      ))
    })
  ))
    .then(
      () => stream.end(),
      err => stream.emit('error', err)
    )

  return stream
}

module.exports.ls = ls

function ls (cache) {
  return lsStream(cache).collect().then(entries =>
    entries.reduce((acc, xs) => {
      acc[xs.key] = xs
      return acc
    }, {})
  )
}

module.exports.bucketEntries = bucketEntries

function bucketEntries (bucket, filter) {
  return readFile(bucket, 'utf8').then((data) => _bucketEntries(data, filter))
}

module.exports.bucketEntries.sync = bucketEntriesSync

function bucketEntriesSync (bucket, filter) {
  const data = fs.readFileSync(bucket, 'utf8')
  return _bucketEntries(data, filter)
}

function _bucketEntries (data, filter) {
  const entries = []
  data.split('\n').forEach((entry) => {
    if (!entry)
      return

    const pieces = entry.split('\t')
    if (!pieces[1] || hashEntry(pieces[1]) !== pieces[0]) {
      // Hash is no good! Corruption or malice? Doesn't matter!
      // EJECT EJECT
      return
    }
    let obj
    try {
      obj = JSON.parse(pieces[1])
    } catch (e) {
      // Entry is corrupted!
      return
    }
    if (obj)
      entries.push(obj)
  })
  return entries
}

module.exports.bucketDir = bucketDir

function bucketDir (cache) {
  return path.join(cache, `index-v${indexV}`)
}

module.exports.bucketPath = bucketPath

function bucketPath (cache, key) {
  const hashed = hashKey(key)
  return path.join.apply(
    path,
    [bucketDir(cache)].concat(hashToSegments(hashed))
  )
}

module.exports.hashKey = hashKey

function hashKey (key) {
  return hash(key, 'sha256')
}

module.exports.hashEntry = hashEntry

function hashEntry (str) {
  return hash(str, 'sha1')
}

function hash (str, digest) {
  return crypto
    .createHash(digest)
    .update(str)
    .digest('hex')
}

function formatEntry (cache, entry, keepAll) {
  // Treat null digests as deletions. They'll shadow any previous entries.
  if (!entry.integrity && !keepAll)
    return null

  return {
    key: entry.key,
    integrity: entry.integrity,
    path: entry.integrity ? contentPath(cache, entry.integrity) : undefined,
    size: entry.size,
    time: entry.time,
    metadata: entry.metadata,
  }
}

function readdirOrEmpty (dir) {
  return readdir(dir).catch((err) => {
    if (err.code === 'ENOENT' || err.code === 'ENOTDIR')
      return []

    throw err
  })
}
'use strict'

const LRU = require('lru-cache')

const MAX_SIZE = 50 * 1024 * 1024 // 50MB
const MAX_AGE = 3 * 60 * 1000

const MEMOIZED = new LRU({
  max: MAX_SIZE,
  maxAge: MAX_AGE,
  length: (entry, key) => key.startsWith('key:') ? entry.data.length : entry.length,
})

module.exports.clearMemoized = clearMemoized

function clearMemoized () {
  const old = {}
  MEMOIZED.forEach((v, k) => {
    old[k] = v
  })
  MEMOIZED.reset()
  return old
}

module.exports.put = put

function put (cache, entry, data, opts) {
  pickMem(opts).set(`key:${cache}:${entry.key}`, { entry, data })
  putDigest(cache, entry.integrity, data, opts)
}

module.exports.put.byDigest = putDigest

function putDigest (cache, integrity, data, opts) {
  pickMem(opts).set(`digest:${cache}:${integrity}`, data)
}

module.exports.get = get

function get (cache, key, opts) {
  return pickMem(opts).get(`key:${cache}:${key}`)
}

module.exports.get.byDigest = getDigest

function getDigest (cache, integrity, opts) {
  return pickMem(opts).get(`digest:${cache}:${integrity}`)
}

class ObjProxy {
  constructor (obj) {
    this.obj = obj
  }

  get (key) {
    return this.obj[key]
  }

  set (key, val) {
    this.obj[key] = val
  }
}

function pickMem (opts) {
  if (!opts || !opts.memoize)
    return MEMOIZED
  else if (opts.memoize.get && opts.memoize.set)
    return opts.memoize
  else if (typeof opts.memoize === 'object')
    return new ObjProxy(opts.memoize)
  else
    return MEMOIZED
}
'use strict'

const util = require('util')

const pMap = require('p-map')
const contentPath = require('./content/path')
const fixOwner = require('./util/fix-owner')
const fs = require('fs')
const fsm = require('fs-minipass')
const glob = util.promisify(require('glob'))
const index = require('./entry-index')
const path = require('path')
const rimraf = util.promisify(require('rimraf'))
const ssri = require('ssri')

const hasOwnProperty = (obj, key) =>
  Object.prototype.hasOwnProperty.call(obj, key)

const stat = util.promisify(fs.stat)
const truncate = util.promisify(fs.truncate)
const writeFile = util.promisify(fs.writeFile)
const readFile = util.promisify(fs.readFile)

const verifyOpts = (opts) => ({
  concurrency: 20,
  log: { silly () {} },
  ...opts,
})

module.exports = verify

function verify (cache, opts) {
  opts = verifyOpts(opts)
  opts.log.silly('verify', 'verifying cache at', cache)

  const steps = [
    markStartTime,
    fixPerms,
    garbageCollect,
    rebuildIndex,
    cleanTmp,
    writeVerifile,
    markEndTime,
  ]

  return steps
    .reduce((promise, step, i) => {
      const label = step.name
      const start = new Date()
      return promise.then((stats) => {
        return step(cache, opts).then((s) => {
          s &&
            Object.keys(s).forEach((k) => {
              stats[k] = s[k]
            })
          const end = new Date()
          if (!stats.runTime)
            stats.runTime = {}

          stats.runTime[label] = end - start
          return Promise.resolve(stats)
        })
      })
    }, Promise.resolve({}))
    .then((stats) => {
      stats.runTime.total = stats.endTime - stats.startTime
      opts.log.silly(
        'verify',
        'verification finished for',
        cache,
        'in',
        `${stats.runTime.total}ms`
      )
      return stats
    })
}

function markStartTime (cache, opts) {
  return Promise.resolve({ startTime: new Date() })
}

function markEndTime (cache, opts) {
  return Promise.resolve({ endTime: new Date() })
}

function fixPerms (cache, opts) {
  opts.log.silly('verify', 'fixing cache permissions')
  return fixOwner
    .mkdirfix(cache, cache)
    .then(() => {
      // TODO - fix file permissions too
      return fixOwner.chownr(cache, cache)
    })
    .then(() => null)
}

// Implements a naive mark-and-sweep tracing garbage collector.
//
// The algorithm is basically as follows:
// 1. Read (and filter) all index entries ("pointers")
// 2. Mark each integrity value as "live"
// 3. Read entire filesystem tree in `content-vX/` dir
// 4. If content is live, verify its checksum and delete it if it fails
// 5. If content is not marked as live, rimraf it.
//
function garbageCollect (cache, opts) {
  opts.log.silly('verify', 'garbage collecting content')
  const indexStream = index.lsStream(cache)
  const liveContent = new Set()
  indexStream.on('data', (entry) => {
    if (opts.filter && !opts.filter(entry))
      return

    liveContent.add(entry.integrity.toString())
  })
  return new Promise((resolve, reject) => {
    indexStream.on('end', resolve).on('error', reject)
  }).then(() => {
    const contentDir = contentPath.contentDir(cache)
    return glob(path.join(contentDir, '**'), {
      follow: false,
      nodir: true,
      nosort: true,
    }).then((files) => {
      return Promise.resolve({
        verifiedContent: 0,
        reclaimedCount: 0,
        reclaimedSize: 0,
        badContentCount: 0,
        keptSize: 0,
      }).then((stats) =>
        pMap(
          files,
          (f) => {
            const split = f.split(/[/\\]/)
            const digest = split.slice(split.length - 3).join('')
            const algo = split[split.length - 4]
            const integrity = ssri.fromHex(digest, algo)
            if (liveContent.has(integrity.toString())) {
              return verifyContent(f, integrity).then((info) => {
                if (!info.valid) {
                  stats.reclaimedCount++
                  stats.badContentCount++
                  stats.reclaimedSize += info.size
                } else {
                  stats.verifiedContent++
                  stats.keptSize += info.size
                }
                return stats
              })
            } else {
              // No entries refer to this content. We can delete.
              stats.reclaimedCount++
              return stat(f).then((s) => {
                return rimraf(f).then(() => {
                  stats.reclaimedSize += s.size
                  return stats
                })
              })
            }
          },
          { concurrency: opts.concurrency }
        ).then(() => stats)
      )
    })
  })
}

function verifyContent (filepath, sri) {
  return stat(filepath)
    .then((s) => {
      const contentInfo = {
        size: s.size,
        valid: true,
      }
      return ssri
        .checkStream(new fsm.ReadStream(filepath), sri)
        .catch((err) => {
          if (err.code !== 'EINTEGRITY')
            throw err

          return rimraf(filepath).then(() => {
            contentInfo.valid = false
          })
        })
        .then(() => contentInfo)
    })
    .catch((err) => {
      if (err.code === 'ENOENT')
        return { size: 0, valid: false }

      throw err
    })
}

function rebuildIndex (cache, opts) {
  opts.log.silly('verify', 'rebuilding index')
  return index.ls(cache).then((entries) => {
    const stats = {
      missingContent: 0,
      rejectedEntries: 0,
      totalEntries: 0,
    }
    const buckets = {}
    for (const k in entries) {
      /* istanbul ignore else */
      if (hasOwnProperty(entries, k)) {
        const hashed = index.hashKey(k)
        const entry = entries[k]
        const excluded = opts.filter && !opts.filter(entry)
        excluded && stats.rejectedEntries++
        if (buckets[hashed] && !excluded)
          buckets[hashed].push(entry)
        else if (buckets[hashed] && excluded) {
          // skip
        } else if (excluded) {
          buckets[hashed] = []
          buckets[hashed]._path = index.bucketPath(cache, k)
        } else {
          buckets[hashed] = [entry]
          buckets[hashed]._path = index.bucketPath(cache, k)
        }
      }
    }
    return pMap(
      Object.keys(buckets),
      (key) => {
        return rebuildBucket(cache, buckets[key], stats, opts)
      },
      { concurrency: opts.concurrency }
    ).then(() => stats)
  })
}

function rebuildBucket (cache, bucket, stats, opts) {
  return truncate(bucket._path).then(() => {
    // This needs to be serialized because cacache explicitly
    // lets very racy bucket conflicts clobber each other.
    return bucket.reduce((promise, entry) => {
      return promise.then(() => {
        const content = contentPath(cache, entry.integrity)
        return stat(content)
          .then(() => {
            return index
              .insert(cache, entry.key, entry.integrity, {
                metadata: entry.metadata,
                size: entry.size,
              })
              .then(() => {
                stats.totalEntries++
              })
          })
          .catch((err) => {
            if (err.code === 'ENOENT') {
              stats.rejectedEntries++
              stats.missingContent++
              return
            }
            throw err
          })
      })
    }, Promise.resolve())
  })
}

function cleanTmp (cache, opts) {
  opts.log.silly('verify', 'cleaning tmp directory')
  return rimraf(path.join(cache, 'tmp'))
}

function writeVerifile (cache, opts) {
  const verifile = path.join(cache, '_lastverified')
  opts.log.silly('verify', 'writing verifile to ' + verifile)
  try {
    return writeFile(verifile, '' + +new Date())
  } finally {
    fixOwner.chownr.sync(cache, verifile)
  }
}

module.exports.lastRun = lastRun

function lastRun (cache) {
  return readFile(path.join(cache, '_lastverified'), 'utf8').then(
    (data) => new Date(+data)
  )
}
'use strict'

module.exports.disposer = disposer

function disposer (creatorFn, disposerFn, fn) {
  const runDisposer = (resource, result, shouldThrow = false) => {
    return disposerFn(resource)
      .then(
        // disposer resolved, do something with original fn's promise
        () => {
          if (shouldThrow)
            throw result

          return result
        },
        // Disposer fn failed, crash process
        (err) => {
          throw err
          // Or process.exit?
        })
  }

  return creatorFn
    .then((resource) => {
      // fn(resource) can throw, so wrap in a promise here
      return Promise.resolve().then(() => fn(resource))
        .then((result) => runDisposer(resource, result))
        .catch((err) => runDisposer(resource, err, true))
    })
}
'use strict'

const util = require('util')

const chownr = util.promisify(require('chownr'))
const mkdirp = require('mkdirp')
const inflight = require('promise-inflight')
const inferOwner = require('infer-owner')

// Memoize getuid()/getgid() calls.
// patch process.setuid/setgid to invalidate cached value on change
const self = { uid: null, gid: null }
const getSelf = () => {
  if (typeof self.uid !== 'number') {
    self.uid = process.getuid()
    const setuid = process.setuid
    process.setuid = (uid) => {
      self.uid = null
      process.setuid = setuid
      return process.setuid(uid)
    }
  }
  if (typeof self.gid !== 'number') {
    self.gid = process.getgid()
    const setgid = process.setgid
    process.setgid = (gid) => {
      self.gid = null
      process.setgid = setgid
      return process.setgid(gid)
    }
  }
}

module.exports.chownr = fixOwner

function fixOwner (cache, filepath) {
  if (!process.getuid) {
    // This platform doesn't need ownership fixing
    return Promise.resolve()
  }

  getSelf()
  if (self.uid !== 0) {
    // almost certainly can't chown anyway
    return Promise.resolve()
  }

  return Promise.resolve(inferOwner(cache)).then((owner) => {
    const { uid, gid } = owner

    // No need to override if it's already what we used.
    if (self.uid === uid && self.gid === gid)
      return

    return inflight('fixOwner: fixing ownership on ' + filepath, () =>
      chownr(
        filepath,
        typeof uid === 'number' ? uid : self.uid,
        typeof gid === 'number' ? gid : self.gid
      ).catch((err) => {
        if (err.code === 'ENOENT')
          return null

        throw err
      })
    )
  })
}

module.exports.chownr.sync = fixOwnerSync

function fixOwnerSync (cache, filepath) {
  if (!process.getuid) {
    // This platform doesn't need ownership fixing
    return
  }
  const { uid, gid } = inferOwner.sync(cache)
  getSelf()
  if (self.uid !== 0) {
    // almost certainly can't chown anyway
    return
  }

  if (self.uid === uid && self.gid === gid) {
    // No need to override if it's already what we used.
    return
  }
  try {
    chownr.sync(
      filepath,
      typeof uid === 'number' ? uid : self.uid,
      typeof gid === 'number' ? gid : self.gid
    )
  } catch (err) {
    // only catch ENOENT, any other error is a problem.
    if (err.code === 'ENOENT')
      return null

    throw err
  }
}

module.exports.mkdirfix = mkdirfix

function mkdirfix (cache, p, cb) {
  // we have to infer the owner _before_ making the directory, even though
  // we aren't going to use the results, since the cache itself might not
  // exist yet.  If we mkdirp it, then our current uid/gid will be assumed
  // to be correct if it creates the cache folder in the process.
  return Promise.resolve(inferOwner(cache)).then(() => {
    return mkdirp(p)
      .then((made) => {
        if (made)
          return fixOwner(cache, made).then(() => made)
      })
      .catch((err) => {
        if (err.code === 'EEXIST')
          return fixOwner(cache, p).then(() => null)

        throw err
      })
  })
}

module.exports.mkdirfix.sync = mkdirfixSync

function mkdirfixSync (cache, p) {
  try {
    inferOwner.sync(cache)
    const made = mkdirp.sync(p)
    if (made) {
      fixOwnerSync(cache, made)
      return made
    }
  } catch (err) {
    if (err.code === 'EEXIST') {
      fixOwnerSync(cache, p)
      return null
    } else
      throw err
  }
}
'use strict'

module.exports = hashToSegments

function hashToSegments (hash) {
  return [hash.slice(0, 2), hash.slice(2, 4), hash.slice(4)]
}
'use strict'

const fs = require('fs')
const util = require('util')
const chmod = util.promisify(fs.chmod)
const unlink = util.promisify(fs.unlink)
const stat = util.promisify(fs.stat)
const move = require('@npmcli/move-file')
const pinflight = require('promise-inflight')

module.exports = moveFile

function moveFile (src, dest) {
  const isWindows = global.__CACACHE_TEST_FAKE_WINDOWS__ ||
    process.platform === 'win32'

  // This isn't quite an fs.rename -- the assumption is that
  // if `dest` already exists, and we get certain errors while
  // trying to move it, we should just not bother.
  //
  // In the case of cache corruption, users will receive an
  // EINTEGRITY error elsewhere, and can remove the offending
  // content their own way.
  //
  // Note that, as the name suggests, this strictly only supports file moves.
  return new Promise((resolve, reject) => {
    fs.link(src, dest, (err) => {
      if (err) {
        if (isWindows && err.code === 'EPERM') {
          // XXX This is a really weird way to handle this situation, as it
          // results in the src file being deleted even though the dest
          // might not exist.  Since we pretty much always write files to
          // deterministic locations based on content hash, this is likely
          // ok (or at worst, just ends in a future cache miss).  But it would
          // be worth investigating at some time in the future if this is
          // really what we want to do here.
          return resolve()
        } else if (err.code === 'EEXIST' || err.code === 'EBUSY') {
          // file already exists, so whatever
          return resolve()
        } else
          return reject(err)
      } else
        return resolve()
    })
  })
    .then(() => {
      // content should never change for any reason, so make it read-only
      return Promise.all([
        unlink(src),
        !isWindows && chmod(dest, '0444'),
      ])
    })
    .catch(() => {
      return pinflight('cacache-move-file:' + dest, () => {
        return stat(dest).catch((err) => {
          if (err.code !== 'ENOENT') {
            // Something else is wrong here. Bail bail bail
            throw err
          }
          // file doesn't already exist! let's try a rename -> copy fallback
          // only delete if it successfully copies
          return move(src, dest)
        })
      })
    })
}
'use strict'

const fs = require('@npmcli/fs')

const fixOwner = require('./fix-owner')
const path = require('path')

module.exports.mkdir = mktmpdir

function mktmpdir (cache, opts = {}) {
  const { tmpPrefix } = opts
  const tmpDir = path.join(cache, 'tmp')
  return fs.mkdir(tmpDir, { recursive: true, owner: 'inherit' })
    .then(() => {
      // do not use path.join(), it drops the trailing / if tmpPrefix is unset
      const target = `${tmpDir}${path.sep}${tmpPrefix || ''}`
      return fs.mkdtemp(target, { owner: 'inherit' })
    })
}

module.exports.withTmp = withTmp

function withTmp (cache, opts, cb) {
  if (!cb) {
    cb = opts
    opts = {}
  }
  return fs.withTempDir(path.join(cache, 'tmp'), cb, opts)
}

module.exports.fix = fixtmpdir

function fixtmpdir (cache) {
  return fixOwner(cache, path.join(cache, 'tmp'))
}
'use strict'

const contentVer = require('../../package.json')['cache-version'].content
const hashToSegments = require('../util/hash-to-segments')
const path = require('path')
const ssri = require('ssri')

// Current format of content file path:
//
// sha512-BaSE64Hex= ->
// ~/.my-cache/content-v2/sha512/ba/da/55deadbeefc0ffee
//
module.exports = contentPath

function contentPath (cache, integrity) {
  const sri = ssri.parse(integrity, { single: true })
  // contentPath is the *strongest* algo given
  return path.join(
    contentDir(cache),
    sri.algorithm,
    ...hashToSegments(sri.hexDigest())
  )
}

module.exports.contentDir = contentDir

function contentDir (cache) {
  return path.join(cache, `content-v${contentVer}`)
}
'use strict'

const util = require('util')

const fs = require('fs')
const fsm = require('fs-minipass')
const ssri = require('ssri')
const contentPath = require('./path')
const Pipeline = require('minipass-pipeline')

const lstat = util.promisify(fs.lstat)
const readFile = util.promisify(fs.readFile)

module.exports = read

const MAX_SINGLE_READ_SIZE = 64 * 1024 * 1024
function read (cache, integrity, opts = {}) {
  const { size } = opts
  return withContentSri(cache, integrity, (cpath, sri) => {
    // get size
    return lstat(cpath).then(stat => ({ stat, cpath, sri }))
  }).then(({ stat, cpath, sri }) => {
    if (typeof size === 'number' && stat.size !== size)
      throw sizeError(size, stat.size)

    if (stat.size > MAX_SINGLE_READ_SIZE)
      return readPipeline(cpath, stat.size, sri, new Pipeline()).concat()

    return readFile(cpath, null).then((data) => {
      if (!ssri.checkData(data, sri))
        throw integrityError(sri, cpath)

      return data
    })
  })
}

const readPipeline = (cpath, size, sri, stream) => {
  stream.push(
    new fsm.ReadStream(cpath, {
      size,
      readSize: MAX_SINGLE_READ_SIZE,
    }),
    ssri.integrityStream({
      integrity: sri,
      size,
    })
  )
  return stream
}

module.exports.sync = readSync

function readSync (cache, integrity, opts = {}) {
  const { size } = opts
  return withContentSriSync(cache, integrity, (cpath, sri) => {
    const data = fs.readFileSync(cpath)
    if (typeof size === 'number' && size !== data.length)
      throw sizeError(size, data.length)

    if (ssri.checkData(data, sri))
      return data

    throw integrityError(sri, cpath)
  })
}

module.exports.stream = readStream
module.exports.readStream = readStream

function readStream (cache, integrity, opts = {}) {
  const { size } = opts
  const stream = new Pipeline()
  withContentSri(cache, integrity, (cpath, sri) => {
    // just lstat to ensure it exists
    return lstat(cpath).then((stat) => ({ stat, cpath, sri }))
  }).then(({ stat, cpath, sri }) => {
    if (typeof size === 'number' && size !== stat.size)
      return stream.emit('error', sizeError(size, stat.size))

    readPipeline(cpath, stat.size, sri, stream)
  }, er => stream.emit('error', er))

  return stream
}

let copyFile
if (fs.copyFile) {
  module.exports.copy = copy
  module.exports.copy.sync = copySync
  copyFile = util.promisify(fs.copyFile)
}

function copy (cache, integrity, dest) {
  return withContentSri(cache, integrity, (cpath, sri) => {
    return copyFile(cpath, dest)
  })
}

function copySync (cache, integrity, dest) {
  return withContentSriSync(cache, integrity, (cpath, sri) => {
    return fs.copyFileSync(cpath, dest)
  })
}

module.exports.hasContent = hasContent

function hasContent (cache, integrity) {
  if (!integrity)
    return Promise.resolve(false)

  return withContentSri(cache, integrity, (cpath, sri) => {
    return lstat(cpath).then((stat) => ({ size: stat.size, sri, stat }))
  }).catch((err) => {
    if (err.code === 'ENOENT')
      return false

    if (err.code === 'EPERM') {
      /* istanbul ignore else */
      if (process.platform !== 'win32')
        throw err
      else
        return false
    }
  })
}

module.exports.hasContent.sync = hasContentSync

function hasContentSync (cache, integrity) {
  if (!integrity)
    return false

  return withContentSriSync(cache, integrity, (cpath, sri) => {
    try {
      const stat = fs.lstatSync(cpath)
      return { size: stat.size, sri, stat }
    } catch (err) {
      if (err.code === 'ENOENT')
        return false

      if (err.code === 'EPERM') {
        /* istanbul ignore else */
        if (process.platform !== 'win32')
          throw err
        else
          return false
      }
    }
  })
}

function withContentSri (cache, integrity, fn) {
  const tryFn = () => {
    const sri = ssri.parse(integrity)
    // If `integrity` has multiple entries, pick the first digest
    // with available local data.
    const algo = sri.pickAlgorithm()
    const digests = sri[algo]

    if (digests.length <= 1) {
      const cpath = contentPath(cache, digests[0])
      return fn(cpath, digests[0])
    } else {
      // Can't use race here because a generic error can happen before
      // a ENOENT error, and can happen before a valid result
      return Promise
        .all(digests.map((meta) => {
          return withContentSri(cache, meta, fn)
            .catch((err) => {
              if (err.code === 'ENOENT') {
                return Object.assign(
                  new Error('No matching content found for ' + sri.toString()),
                  { code: 'ENOENT' }
                )
              }
              return err
            })
        }))
        .then((results) => {
          // Return the first non error if it is found
          const result = results.find((r) => !(r instanceof Error))
          if (result)
            return result

          // Throw the No matching content found error
          const enoentError = results.find((r) => r.code === 'ENOENT')
          if (enoentError)
            throw enoentError

          // Throw generic error
          throw results.find((r) => r instanceof Error)
        })
    }
  }

  return new Promise((resolve, reject) => {
    try {
      tryFn()
        .then(resolve)
        .catch(reject)
    } catch (err) {
      reject(err)
    }
  })
}

function withContentSriSync (cache, integrity, fn) {
  const sri = ssri.parse(integrity)
  // If `integrity` has multiple entries, pick the first digest
  // with available local data.
  const algo = sri.pickAlgorithm()
  const digests = sri[algo]
  if (digests.length <= 1) {
    const cpath = contentPath(cache, digests[0])
    return fn(cpath, digests[0])
  } else {
    let lastErr = null
    for (const meta of digests) {
      try {
        return withContentSriSync(cache, meta, fn)
      } catch (err) {
        lastErr = err
      }
    }
    throw lastErr
  }
}

function sizeError (expected, found) {
  const err = new Error(`Bad data size: expected inserted data to be ${expected} bytes, but got ${found} instead`)
  err.expected = expected
  err.found = found
  err.code = 'EBADSIZE'
  return err
}

function integrityError (sri, path) {
  const err = new Error(`Integrity verification failed for ${sri} (${path})`)
  err.code = 'EINTEGRITY'
  err.sri = sri
  err.path = path
  return err
}
'use strict'

const util = require('util')

const contentPath = require('./path')
const { hasContent } = require('./read')
const rimraf = util.promisify(require('rimraf'))

module.exports = rm

function rm (cache, integrity) {
  return hasContent(cache, integrity).then((content) => {
    // ~pretty~ sure we can't end up with a content lacking sri, but be safe
    if (content && content.sri)
      return rimraf(contentPath(cache, content.sri)).then(() => true)
    else
      return false
  })
}
'use strict'

const util = require('util')

const contentPath = require('./path')
const fixOwner = require('../util/fix-owner')
const fs = require('fs')
const moveFile = require('../util/move-file')
const Minipass = require('minipass')
const Pipeline = require('minipass-pipeline')
const Flush = require('minipass-flush')
const path = require('path')
const rimraf = util.promisify(require('rimraf'))
const ssri = require('ssri')
const uniqueFilename = require('unique-filename')
const { disposer } = require('./../util/disposer')
const fsm = require('fs-minipass')

const writeFile = util.promisify(fs.writeFile)

module.exports = write

function write (cache, data, opts = {}) {
  const { algorithms, size, integrity } = opts
  if (algorithms && algorithms.length > 1)
    throw new Error('opts.algorithms only supports a single algorithm for now')

  if (typeof size === 'number' && data.length !== size)
    return Promise.reject(sizeError(size, data.length))

  const sri = ssri.fromData(data, algorithms ? { algorithms } : {})
  if (integrity && !ssri.checkData(data, integrity, opts))
    return Promise.reject(checksumError(integrity, sri))

  return disposer(makeTmp(cache, opts), makeTmpDisposer,
    (tmp) => {
      return writeFile(tmp.target, data, { flag: 'wx' })
        .then(() => moveToDestination(tmp, cache, sri, opts))
    })
    .then(() => ({ integrity: sri, size: data.length }))
}

module.exports.stream = writeStream

// writes proxied to the 'inputStream' that is passed to the Promise
// 'end' is deferred until content is handled.
class CacacheWriteStream extends Flush {
  constructor (cache, opts) {
    super()
    this.opts = opts
    this.cache = cache
    this.inputStream = new Minipass()
    this.inputStream.on('error', er => this.emit('error', er))
    this.inputStream.on('drain', () => this.emit('drain'))
    this.handleContentP = null
  }

  write (chunk, encoding, cb) {
    if (!this.handleContentP) {
      this.handleContentP = handleContent(
        this.inputStream,
        this.cache,
        this.opts
      )
    }
    return this.inputStream.write(chunk, encoding, cb)
  }

  flush (cb) {
    this.inputStream.end(() => {
      if (!this.handleContentP) {
        const e = new Error('Cache input stream was empty')
        e.code = 'ENODATA'
        // empty streams are probably emitting end right away.
        // defer this one tick by rejecting a promise on it.
        return Promise.reject(e).catch(cb)
      }
      this.handleContentP.then(
        (res) => {
          res.integrity && this.emit('integrity', res.integrity)
          res.size !== null && this.emit('size', res.size)
          cb()
        },
        (er) => cb(er)
      )
    })
  }
}

function writeStream (cache, opts = {}) {
  return new CacacheWriteStream(cache, opts)
}

function handleContent (inputStream, cache, opts) {
  return disposer(makeTmp(cache, opts), makeTmpDisposer, (tmp) => {
    return pipeToTmp(inputStream, cache, tmp.target, opts)
      .then((res) => {
        return moveToDestination(
          tmp,
          cache,
          res.integrity,
          opts
        ).then(() => res)
      })
  })
}

function pipeToTmp (inputStream, cache, tmpTarget, opts) {
  let integrity
  let size
  const hashStream = ssri.integrityStream({
    integrity: opts.integrity,
    algorithms: opts.algorithms,
    size: opts.size,
  })
  hashStream.on('integrity', i => {
    integrity = i
  })
  hashStream.on('size', s => {
    size = s
  })

  const outStream = new fsm.WriteStream(tmpTarget, {
    flags: 'wx',
  })

  // NB: this can throw if the hashStream has a problem with
  // it, and the data is fully written.  but pipeToTmp is only
  // called in promisory contexts where that is handled.
  const pipeline = new Pipeline(
    inputStream,
    hashStream,
    outStream
  )

  return pipeline.promise()
    .then(() => ({ integrity, size }))
    .catch(er => rimraf(tmpTarget).then(() => {
      throw er
    }))
}

function makeTmp (cache, opts) {
  const tmpTarget = uniqueFilename(path.join(cache, 'tmp'), opts.tmpPrefix)
  return fixOwner.mkdirfix(cache, path.dirname(tmpTarget)).then(() => ({
    target: tmpTarget,
    moved: false,
  }))
}

function makeTmpDisposer (tmp) {
  if (tmp.moved)
    return Promise.resolve()

  return rimraf(tmp.target)
}

function moveToDestination (tmp, cache, sri, opts) {
  const destination = contentPath(cache, sri)
  const destDir = path.dirname(destination)

  return fixOwner
    .mkdirfix(cache, destDir)
    .then(() => {
      return moveFile(tmp.target, destination)
    })
    .then(() => {
      tmp.moved = true
      return fixOwner.chownr(cache, destination)
    })
}

function sizeError (expected, found) {
  const err = new Error(`Bad data size: expected inserted data to be ${expected} bytes, but got ${found} instead`)
  err.expected = expected
  err.found = found
  err.code = 'EBADSIZE'
  return err
}

function checksumError (expected, found) {
  const err = new Error(`Integrity check failed:
  Wanted: ${expected}
   Found: ${found}`)
  err.code = 'EINTEGRITY'
  err.expected = expected
  err.found = found
  return err
}
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.

## Glob Logo

Glob's logo created by Tanya Brassie <http://tanyabrassie.com/>, licensed
under a Creative Commons Attribution-ShareAlike 4.0 International License
https://creativecommons.org/licenses/by-sa/4.0/
exports.setopts = setopts
exports.ownProp = ownProp
exports.makeAbs = makeAbs
exports.finish = finish
exports.mark = mark
exports.isIgnored = isIgnored
exports.childrenIgnored = childrenIgnored

function ownProp (obj, field) {
  return Object.prototype.hasOwnProperty.call(obj, field)
}

var fs = require("fs")
var path = require("path")
var minimatch = require("minimatch")
var isAbsolute = require("path-is-absolute")
var Minimatch = minimatch.Minimatch

function alphasort (a, b) {
  return a.localeCompare(b, 'en')
}

function setupIgnores (self, options) {
  self.ignore = options.ignore || []

  if (!Array.isArray(self.ignore))
    self.ignore = [self.ignore]

  if (self.ignore.length) {
    self.ignore = self.ignore.map(ignoreMap)
  }
}

// ignore patterns are always in dot:true mode.
function ignoreMap (pattern) {
  var gmatcher = null
  if (pattern.slice(-3) === '/**') {
    var gpattern = pattern.replace(/(\/\*\*)+$/, '')
    gmatcher = new Minimatch(gpattern, { dot: true })
  }

  return {
    matcher: new Minimatch(pattern, { dot: true }),
    gmatcher: gmatcher
  }
}

function setopts (self, pattern, options) {
  if (!options)
    options = {}

  // base-matching: just use globstar for that.
  if (options.matchBase && -1 === pattern.indexOf("/")) {
    if (options.noglobstar) {
      throw new Error("base matching requires globstar")
    }
    pattern = "**/" + pattern
  }

  self.silent = !!options.silent
  self.pattern = pattern
  self.strict = options.strict !== false
  self.realpath = !!options.realpath
  self.realpathCache = options.realpathCache || Object.create(null)
  self.follow = !!options.follow
  self.dot = !!options.dot
  self.mark = !!options.mark
  self.nodir = !!options.nodir
  if (self.nodir)
    self.mark = true
  self.sync = !!options.sync
  self.nounique = !!options.nounique
  self.nonull = !!options.nonull
  self.nosort = !!options.nosort
  self.nocase = !!options.nocase
  self.stat = !!options.stat
  self.noprocess = !!options.noprocess
  self.absolute = !!options.absolute
  self.fs = options.fs || fs

  self.maxLength = options.maxLength || Infinity
  self.cache = options.cache || Object.create(null)
  self.statCache = options.statCache || Object.create(null)
  self.symlinks = options.symlinks || Object.create(null)

  setupIgnores(self, options)

  self.changedCwd = false
  var cwd = process.cwd()
  if (!ownProp(options, "cwd"))
    self.cwd = cwd
  else {
    self.cwd = path.resolve(options.cwd)
    self.changedCwd = self.cwd !== cwd
  }

  self.root = options.root || path.resolve(self.cwd, "/")
  self.root = path.resolve(self.root)
  if (process.platform === "win32")
    self.root = self.root.replace(/\\/g, "/")

  // TODO: is an absolute `cwd` supposed to be resolved against `root`?
  // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test')
  self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd)
  if (process.platform === "win32")
    self.cwdAbs = self.cwdAbs.replace(/\\/g, "/")
  self.nomount = !!options.nomount

  // disable comments and negation in Minimatch.
  // Note that they are not supported in Glob itself anyway.
  options.nonegate = true
  options.nocomment = true
  // always treat \ in patterns as escapes, not path separators
  options.allowWindowsEscape = false

  self.minimatch = new Minimatch(pattern, options)
  self.options = self.minimatch.options
}

function finish (self) {
  var nou = self.nounique
  var all = nou ? [] : Object.create(null)

  for (var i = 0, l = self.matches.length; i < l; i ++) {
    var matches = self.matches[i]
    if (!matches || Object.keys(matches).length === 0) {
      if (self.nonull) {
        // do like the shell, and spit out the literal glob
        var literal = self.minimatch.globSet[i]
        if (nou)
          all.push(literal)
        else
          all[literal] = true
      }
    } else {
      // had matches
      var m = Object.keys(matches)
      if (nou)
        all.push.apply(all, m)
      else
        m.forEach(function (m) {
          all[m] = true
        })
    }
  }

  if (!nou)
    all = Object.keys(all)

  if (!self.nosort)
    all = all.sort(alphasort)

  // at *some* point we statted all of these
  if (self.mark) {
    for (var i = 0; i < all.length; i++) {
      all[i] = self._mark(all[i])
    }
    if (self.nodir) {
      all = all.filter(function (e) {
        var notDir = !(/\/$/.test(e))
        var c = self.cache[e] || self.cache[makeAbs(self, e)]
        if (notDir && c)
          notDir = c !== 'DIR' && !Array.isArray(c)
        return notDir
      })
    }
  }

  if (self.ignore.length)
    all = all.filter(function(m) {
      return !isIgnored(self, m)
    })

  self.found = all
}

function mark (self, p) {
  var abs = makeAbs(self, p)
  var c = self.cache[abs]
  var m = p
  if (c) {
    var isDir = c === 'DIR' || Array.isArray(c)
    var slash = p.slice(-1) === '/'

    if (isDir && !slash)
      m += '/'
    else if (!isDir && slash)
      m = m.slice(0, -1)

    if (m !== p) {
      var mabs = makeAbs(self, m)
      self.statCache[mabs] = self.statCache[abs]
      self.cache[mabs] = self.cache[abs]
    }
  }

  return m
}

// lotta situps...
function makeAbs (self, f) {
  var abs = f
  if (f.charAt(0) === '/') {
    abs = path.join(self.root, f)
  } else if (isAbsolute(f) || f === '') {
    abs = f
  } else if (self.changedCwd) {
    abs = path.resolve(self.cwd, f)
  } else {
    abs = path.resolve(f)
  }

  if (process.platform === 'win32')
    abs = abs.replace(/\\/g, '/')

  return abs
}


// Return true, if pattern ends with globstar '**', for the accompanying parent directory.
// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents
function isIgnored (self, path) {
  if (!self.ignore.length)
    return false

  return self.ignore.some(function(item) {
    return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path))
  })
}

function childrenIgnored (self, path) {
  if (!self.ignore.length)
    return false

  return self.ignore.some(function(item) {
    return !!(item.gmatcher && item.gmatcher.match(path))
  })
}
// Approach:
//
// 1. Get the minimatch set
// 2. For each pattern in the set, PROCESS(pattern, false)
// 3. Store matches per-set, then uniq them
//
// PROCESS(pattern, inGlobStar)
// Get the first [n] items from pattern that are all strings
// Join these together.  This is PREFIX.
//   If there is no more remaining, then stat(PREFIX) and
//   add to matches if it succeeds.  END.
//
// If inGlobStar and PREFIX is symlink and points to dir
//   set ENTRIES = []
// else readdir(PREFIX) as ENTRIES
//   If fail, END
//
// with ENTRIES
//   If pattern[n] is GLOBSTAR
//     // handle the case where the globstar match is empty
//     // by pruning it out, and testing the resulting pattern
//     PROCESS(pattern[0..n] + pattern[n+1 .. $], false)
//     // handle other cases.
//     for ENTRY in ENTRIES (not dotfiles)
//       // attach globstar + tail onto the entry
//       // Mark that this entry is a globstar match
//       PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)
//
//   else // not globstar
//     for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)
//       Test ENTRY against pattern[n]
//       If fails, continue
//       If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])
//
// Caveat:
//   Cache all stats and readdirs results to minimize syscall.  Since all
//   we ever care about is existence and directory-ness, we can just keep
//   `true` for files, and [children,...] for directories, or `false` for
//   things that don't exist.

module.exports = glob

var rp = require('fs.realpath')
var minimatch = require('minimatch')
var Minimatch = minimatch.Minimatch
var inherits = require('inherits')
var EE = require('events').EventEmitter
var path = require('path')
var assert = require('assert')
var isAbsolute = require('path-is-absolute')
var globSync = require('./sync.js')
var common = require('./common.js')
var setopts = common.setopts
var ownProp = common.ownProp
var inflight = require('inflight')
var util = require('util')
var childrenIgnored = common.childrenIgnored
var isIgnored = common.isIgnored

var once = require('once')

function glob (pattern, options, cb) {
  if (typeof options === 'function') cb = options, options = {}
  if (!options) options = {}

  if (options.sync) {
    if (cb)
      throw new TypeError('callback provided to sync glob')
    return globSync(pattern, options)
  }

  return new Glob(pattern, options, cb)
}

glob.sync = globSync
var GlobSync = glob.GlobSync = globSync.GlobSync

// old api surface
glob.glob = glob

function extend (origin, add) {
  if (add === null || typeof add !== 'object') {
    return origin
  }

  var keys = Object.keys(add)
  var i = keys.length
  while (i--) {
    origin[keys[i]] = add[keys[i]]
  }
  return origin
}

glob.hasMagic = function (pattern, options_) {
  var options = extend({}, options_)
  options.noprocess = true

  var g = new Glob(pattern, options)
  var set = g.minimatch.set

  if (!pattern)
    return false

  if (set.length > 1)
    return true

  for (var j = 0; j < set[0].length; j++) {
    if (typeof set[0][j] !== 'string')
      return true
  }

  return false
}

glob.Glob = Glob
inherits(Glob, EE)
function Glob (pattern, options, cb) {
  if (typeof options === 'function') {
    cb = options
    options = null
  }

  if (options && options.sync) {
    if (cb)
      throw new TypeError('callback provided to sync glob')
    return new GlobSync(pattern, options)
  }

  if (!(this instanceof Glob))
    return new Glob(pattern, options, cb)

  setopts(this, pattern, options)
  this._didRealPath = false

  // process each pattern in the minimatch set
  var n = this.minimatch.set.length

  // The matches are stored as {<filename>: true,...} so that
  // duplicates are automagically pruned.
  // Later, we do an Object.keys() on these.
  // Keep them as a list so we can fill in when nonull is set.
  this.matches = new Array(n)

  if (typeof cb === 'function') {
    cb = once(cb)
    this.on('error', cb)
    this.on('end', function (matches) {
      cb(null, matches)
    })
  }

  var self = this
  this._processing = 0

  this._emitQueue = []
  this._processQueue = []
  this.paused = false

  if (this.noprocess)
    return this

  if (n === 0)
    return done()

  var sync = true
  for (var i = 0; i < n; i ++) {
    this._process(this.minimatch.set[i], i, false, done)
  }
  sync = false

  function done () {
    --self._processing
    if (self._processing <= 0) {
      if (sync) {
        process.nextTick(function () {
          self._finish()
        })
      } else {
        self._finish()
      }
    }
  }
}

Glob.prototype._finish = function () {
  assert(this instanceof Glob)
  if (this.aborted)
    return

  if (this.realpath && !this._didRealpath)
    return this._realpath()

  common.finish(this)
  this.emit('end', this.found)
}

Glob.prototype._realpath = function () {
  if (this._didRealpath)
    return

  this._didRealpath = true

  var n = this.matches.length
  if (n === 0)
    return this._finish()

  var self = this
  for (var i = 0; i < this.matches.length; i++)
    this._realpathSet(i, next)

  function next () {
    if (--n === 0)
      self._finish()
  }
}

Glob.prototype._realpathSet = function (index, cb) {
  var matchset = this.matches[index]
  if (!matchset)
    return cb()

  var found = Object.keys(matchset)
  var self = this
  var n = found.length

  if (n === 0)
    return cb()

  var set = this.matches[index] = Object.create(null)
  found.forEach(function (p, i) {
    // If there's a problem with the stat, then it means that
    // one or more of the links in the realpath couldn't be
    // resolved.  just return the abs value in that case.
    p = self._makeAbs(p)
    rp.realpath(p, self.realpathCache, function (er, real) {
      if (!er)
        set[real] = true
      else if (er.syscall === 'stat')
        set[p] = true
      else
        self.emit('error', er) // srsly wtf right here

      if (--n === 0) {
        self.matches[index] = set
        cb()
      }
    })
  })
}

Glob.prototype._mark = function (p) {
  return common.mark(this, p)
}

Glob.prototype._makeAbs = function (f) {
  return common.makeAbs(this, f)
}

Glob.prototype.abort = function () {
  this.aborted = true
  this.emit('abort')
}

Glob.prototype.pause = function () {
  if (!this.paused) {
    this.paused = true
    this.emit('pause')
  }
}

Glob.prototype.resume = function () {
  if (this.paused) {
    this.emit('resume')
    this.paused = false
    if (this._emitQueue.length) {
      var eq = this._emitQueue.slice(0)
      this._emitQueue.length = 0
      for (var i = 0; i < eq.length; i ++) {
        var e = eq[i]
        this._emitMatch(e[0], e[1])
      }
    }
    if (this._processQueue.length) {
      var pq = this._processQueue.slice(0)
      this._processQueue.length = 0
      for (var i = 0; i < pq.length; i ++) {
        var p = pq[i]
        this._processing--
        this._process(p[0], p[1], p[2], p[3])
      }
    }
  }
}

Glob.prototype._process = function (pattern, index, inGlobStar, cb) {
  assert(this instanceof Glob)
  assert(typeof cb === 'function')

  if (this.aborted)
    return

  this._processing++
  if (this.paused) {
    this._processQueue.push([pattern, index, inGlobStar, cb])
    return
  }

  //console.error('PROCESS %d', this._processing, pattern)

  // Get the first [n] parts of pattern that are all strings.
  var n = 0
  while (typeof pattern[n] === 'string') {
    n ++
  }
  // now n is the index of the first one that is *not* a string.

  // see if there's anything else
  var prefix
  switch (n) {
    // if not, then this is rather simple
    case pattern.length:
      this._processSimple(pattern.join('/'), index, cb)
      return

    case 0:
      // pattern *starts* with some non-trivial item.
      // going to readdir(cwd), but not include the prefix in matches.
      prefix = null
      break

    default:
      // pattern has some string bits in the front.
      // whatever it starts with, whether that's 'absolute' like /foo/bar,
      // or 'relative' like '../baz'
      prefix = pattern.slice(0, n).join('/')
      break
  }

  var remain = pattern.slice(n)

  // get the list of entries.
  var read
  if (prefix === null)
    read = '.'
  else if (isAbsolute(prefix) ||
      isAbsolute(pattern.map(function (p) {
        return typeof p === 'string' ? p : '[*]'
      }).join('/'))) {
    if (!prefix || !isAbsolute(prefix))
      prefix = '/' + prefix
    read = prefix
  } else
    read = prefix

  var abs = this._makeAbs(read)

  //if ignored, skip _processing
  if (childrenIgnored(this, read))
    return cb()

  var isGlobStar = remain[0] === minimatch.GLOBSTAR
  if (isGlobStar)
    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb)
  else
    this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb)
}

Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {
  var self = this
  this._readdir(abs, inGlobStar, function (er, entries) {
    return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
  })
}

Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {

  // if the abs isn't a dir, then nothing can match!
  if (!entries)
    return cb()

  // It will only match dot entries if it starts with a dot, or if
  // dot is set.  Stuff like @(.foo|.bar) isn't allowed.
  var pn = remain[0]
  var negate = !!this.minimatch.negate
  var rawGlob = pn._glob
  var dotOk = this.dot || rawGlob.charAt(0) === '.'

  var matchedEntries = []
  for (var i = 0; i < entries.length; i++) {
    var e = entries[i]
    if (e.charAt(0) !== '.' || dotOk) {
      var m
      if (negate && !prefix) {
        m = !e.match(pn)
      } else {
        m = e.match(pn)
      }
      if (m)
        matchedEntries.push(e)
    }
  }

  //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)

  var len = matchedEntries.length
  // If there are no matched entries, then nothing matches.
  if (len === 0)
    return cb()

  // if this is the last remaining pattern bit, then no need for
  // an additional stat *unless* the user has specified mark or
  // stat explicitly.  We know they exist, since readdir returned
  // them.

  if (remain.length === 1 && !this.mark && !this.stat) {
    if (!this.matches[index])
      this.matches[index] = Object.create(null)

    for (var i = 0; i < len; i ++) {
      var e = matchedEntries[i]
      if (prefix) {
        if (prefix !== '/')
          e = prefix + '/' + e
        else
          e = prefix + e
      }

      if (e.charAt(0) === '/' && !this.nomount) {
        e = path.join(this.root, e)
      }
      this._emitMatch(index, e)
    }
    // This was the last one, and no stats were needed
    return cb()
  }

  // now test all matched entries as stand-ins for that part
  // of the pattern.
  remain.shift()
  for (var i = 0; i < len; i ++) {
    var e = matchedEntries[i]
    var newPattern
    if (prefix) {
      if (prefix !== '/')
        e = prefix + '/' + e
      else
        e = prefix + e
    }
    this._process([e].concat(remain), index, inGlobStar, cb)
  }
  cb()
}

Glob.prototype._emitMatch = function (index, e) {
  if (this.aborted)
    return

  if (isIgnored(this, e))
    return

  if (this.paused) {
    this._emitQueue.push([index, e])
    return
  }

  var abs = isAbsolute(e) ? e : this._makeAbs(e)

  if (this.mark)
    e = this._mark(e)

  if (this.absolute)
    e = abs

  if (this.matches[index][e])
    return

  if (this.nodir) {
    var c = this.cache[abs]
    if (c === 'DIR' || Array.isArray(c))
      return
  }

  this.matches[index][e] = true

  var st = this.statCache[abs]
  if (st)
    this.emit('stat', e, st)

  this.emit('match', e)
}

Glob.prototype._readdirInGlobStar = function (abs, cb) {
  if (this.aborted)
    return

  // follow all symlinked directories forever
  // just proceed as if this is a non-globstar situation
  if (this.follow)
    return this._readdir(abs, false, cb)

  var lstatkey = 'lstat\0' + abs
  var self = this
  var lstatcb = inflight(lstatkey, lstatcb_)

  if (lstatcb)
    self.fs.lstat(abs, lstatcb)

  function lstatcb_ (er, lstat) {
    if (er && er.code === 'ENOENT')
      return cb()

    var isSym = lstat && lstat.isSymbolicLink()
    self.symlinks[abs] = isSym

    // If it's not a symlink or a dir, then it's definitely a regular file.
    // don't bother doing a readdir in that case.
    if (!isSym && lstat && !lstat.isDirectory()) {
      self.cache[abs] = 'FILE'
      cb()
    } else
      self._readdir(abs, false, cb)
  }
}

Glob.prototype._readdir = function (abs, inGlobStar, cb) {
  if (this.aborted)
    return

  cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb)
  if (!cb)
    return

  //console.error('RD %j %j', +inGlobStar, abs)
  if (inGlobStar && !ownProp(this.symlinks, abs))
    return this._readdirInGlobStar(abs, cb)

  if (ownProp(this.cache, abs)) {
    var c = this.cache[abs]
    if (!c || c === 'FILE')
      return cb()

    if (Array.isArray(c))
      return cb(null, c)
  }

  var self = this
  self.fs.readdir(abs, readdirCb(this, abs, cb))
}

function readdirCb (self, abs, cb) {
  return function (er, entries) {
    if (er)
      self._readdirError(abs, er, cb)
    else
      self._readdirEntries(abs, entries, cb)
  }
}

Glob.prototype._readdirEntries = function (abs, entries, cb) {
  if (this.aborted)
    return

  // if we haven't asked to stat everything, then just
  // assume that everything in there exists, so we can avoid
  // having to stat it a second time.
  if (!this.mark && !this.stat) {
    for (var i = 0; i < entries.length; i ++) {
      var e = entries[i]
      if (abs === '/')
        e = abs + e
      else
        e = abs + '/' + e
      this.cache[e] = true
    }
  }

  this.cache[abs] = entries
  return cb(null, entries)
}

Glob.prototype._readdirError = function (f, er, cb) {
  if (this.aborted)
    return

  // handle errors, and cache the information
  switch (er.code) {
    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
    case 'ENOTDIR': // totally normal. means it *does* exist.
      var abs = this._makeAbs(f)
      this.cache[abs] = 'FILE'
      if (abs === this.cwdAbs) {
        var error = new Error(er.code + ' invalid cwd ' + this.cwd)
        error.path = this.cwd
        error.code = er.code
        this.emit('error', error)
        this.abort()
      }
      break

    case 'ENOENT': // not terribly unusual
    case 'ELOOP':
    case 'ENAMETOOLONG':
    case 'UNKNOWN':
      this.cache[this._makeAbs(f)] = false
      break

    default: // some unusual error.  Treat as failure.
      this.cache[this._makeAbs(f)] = false
      if (this.strict) {
        this.emit('error', er)
        // If the error is handled, then we abort
        // if not, we threw out of here
        this.abort()
      }
      if (!this.silent)
        console.error('glob error', er)
      break
  }

  return cb()
}

Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {
  var self = this
  this._readdir(abs, inGlobStar, function (er, entries) {
    self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
  })
}


Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
  //console.error('pgs2', prefix, remain[0], entries)

  // no entries means not a dir, so it can never have matches
  // foo.txt/** doesn't match foo.txt
  if (!entries)
    return cb()

  // test without the globstar, and with every child both below
  // and replacing the globstar.
  var remainWithoutGlobStar = remain.slice(1)
  var gspref = prefix ? [ prefix ] : []
  var noGlobStar = gspref.concat(remainWithoutGlobStar)

  // the noGlobStar pattern exits the inGlobStar state
  this._process(noGlobStar, index, false, cb)

  var isSym = this.symlinks[abs]
  var len = entries.length

  // If it's a symlink, and we're in a globstar, then stop
  if (isSym && inGlobStar)
    return cb()

  for (var i = 0; i < len; i++) {
    var e = entries[i]
    if (e.charAt(0) === '.' && !this.dot)
      continue

    // these two cases enter the inGlobStar state
    var instead = gspref.concat(entries[i], remainWithoutGlobStar)
    this._process(instead, index, true, cb)

    var below = gspref.concat(entries[i], remain)
    this._process(below, index, true, cb)
  }

  cb()
}

Glob.prototype._processSimple = function (prefix, index, cb) {
  // XXX review this.  Shouldn't it be doing the mounting etc
  // before doing stat?  kinda weird?
  var self = this
  this._stat(prefix, function (er, exists) {
    self._processSimple2(prefix, index, er, exists, cb)
  })
}
Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {

  //console.error('ps2', prefix, exists)

  if (!this.matches[index])
    this.matches[index] = Object.create(null)

  // If it doesn't exist, then just mark the lack of results
  if (!exists)
    return cb()

  if (prefix && isAbsolute(prefix) && !this.nomount) {
    var trail = /[\/\\]$/.test(prefix)
    if (prefix.charAt(0) === '/') {
      prefix = path.join(this.root, prefix)
    } else {
      prefix = path.resolve(this.root, prefix)
      if (trail)
        prefix += '/'
    }
  }

  if (process.platform === 'win32')
    prefix = prefix.replace(/\\/g, '/')

  // Mark this as a match
  this._emitMatch(index, prefix)
  cb()
}

// Returns either 'DIR', 'FILE', or false
Glob.prototype._stat = function (f, cb) {
  var abs = this._makeAbs(f)
  var needDir = f.slice(-1) === '/'

  if (f.length > this.maxLength)
    return cb()

  if (!this.stat && ownProp(this.cache, abs)) {
    var c = this.cache[abs]

    if (Array.isArray(c))
      c = 'DIR'

    // It exists, but maybe not how we need it
    if (!needDir || c === 'DIR')
      return cb(null, c)

    if (needDir && c === 'FILE')
      return cb()

    // otherwise we have to stat, because maybe c=true
    // if we know it exists, but not what it is.
  }

  var exists
  var stat = this.statCache[abs]
  if (stat !== undefined) {
    if (stat === false)
      return cb(null, stat)
    else {
      var type = stat.isDirectory() ? 'DIR' : 'FILE'
      if (needDir && type === 'FILE')
        return cb()
      else
        return cb(null, type, stat)
    }
  }

  var self = this
  var statcb = inflight('stat\0' + abs, lstatcb_)
  if (statcb)
    self.fs.lstat(abs, statcb)

  function lstatcb_ (er, lstat) {
    if (lstat && lstat.isSymbolicLink()) {
      // If it's a symlink, then treat it as the target, unless
      // the target does not exist, then treat it as a file.
      return self.fs.stat(abs, function (er, stat) {
        if (er)
          self._stat2(f, abs, null, lstat, cb)
        else
          self._stat2(f, abs, er, stat, cb)
      })
    } else {
      self._stat2(f, abs, er, lstat, cb)
    }
  }
}

Glob.prototype._stat2 = function (f, abs, er, stat, cb) {
  if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {
    this.statCache[abs] = false
    return cb()
  }

  var needDir = f.slice(-1) === '/'
  this.statCache[abs] = stat

  if (abs.slice(-1) === '/' && stat && !stat.isDirectory())
    return cb(null, false, stat)

  var c = true
  if (stat)
    c = stat.isDirectory() ? 'DIR' : 'FILE'
  this.cache[abs] = this.cache[abs] || c

  if (needDir && c === 'FILE')
    return cb()

  return cb(null, c, stat)
}
{
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
  "name": "glob",
  "description": "a little globber",
  "version": "7.2.3",
  "publishConfig": {
    "tag": "v7-legacy"
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/node-glob.git"
  },
  "main": "glob.js",
  "files": [
    "glob.js",
    "sync.js",
    "common.js"
  ],
  "engines": {
    "node": "*"
  },
  "dependencies": {
    "fs.realpath": "^1.0.0",
    "inflight": "^1.0.4",
    "inherits": "2",
    "minimatch": "^3.1.1",
    "once": "^1.3.0",
    "path-is-absolute": "^1.0.0"
  },
  "devDependencies": {
    "memfs": "^3.2.0",
    "mkdirp": "0",
    "rimraf": "^2.2.8",
    "tap": "^15.0.6",
    "tick": "0.0.6"
  },
  "tap": {
    "before": "test/00-setup.js",
    "after": "test/zz-cleanup.js",
    "jobs": 1
  },
  "license": "ISC",
  "funding": {
    "url": "https://github.com/sponsors/isaacs"
  }
}module.exports = globSync
globSync.GlobSync = GlobSync

var rp = require('fs.realpath')
var minimatch = require('minimatch')
var Minimatch = minimatch.Minimatch
var Glob = require('./glob.js').Glob
var util = require('util')
var path = require('path')
var assert = require('assert')
var isAbsolute = require('path-is-absolute')
var common = require('./common.js')
var setopts = common.setopts
var ownProp = common.ownProp
var childrenIgnored = common.childrenIgnored
var isIgnored = common.isIgnored

function globSync (pattern, options) {
  if (typeof options === 'function' || arguments.length === 3)
    throw new TypeError('callback provided to sync glob\n'+
                        'See: https://github.com/isaacs/node-glob/issues/167')

  return new GlobSync(pattern, options).found
}

function GlobSync (pattern, options) {
  if (!pattern)
    throw new Error('must provide pattern')

  if (typeof options === 'function' || arguments.length === 3)
    throw new TypeError('callback provided to sync glob\n'+
                        'See: https://github.com/isaacs/node-glob/issues/167')

  if (!(this instanceof GlobSync))
    return new GlobSync(pattern, options)

  setopts(this, pattern, options)

  if (this.noprocess)
    return this

  var n = this.minimatch.set.length
  this.matches = new Array(n)
  for (var i = 0; i < n; i ++) {
    this._process(this.minimatch.set[i], i, false)
  }
  this._finish()
}

GlobSync.prototype._finish = function () {
  assert.ok(this instanceof GlobSync)
  if (this.realpath) {
    var self = this
    this.matches.forEach(function (matchset, index) {
      var set = self.matches[index] = Object.create(null)
      for (var p in matchset) {
        try {
          p = self._makeAbs(p)
          var real = rp.realpathSync(p, self.realpathCache)
          set[real] = true
        } catch (er) {
          if (er.syscall === 'stat')
            set[self._makeAbs(p)] = true
          else
            throw er
        }
      }
    })
  }
  common.finish(this)
}


GlobSync.prototype._process = function (pattern, index, inGlobStar) {
  assert.ok(this instanceof GlobSync)

  // Get the first [n] parts of pattern that are all strings.
  var n = 0
  while (typeof pattern[n] === 'string') {
    n ++
  }
  // now n is the index of the first one that is *not* a string.

  // See if there's anything else
  var prefix
  switch (n) {
    // if not, then this is rather simple
    case pattern.length:
      this._processSimple(pattern.join('/'), index)
      return

    case 0:
      // pattern *starts* with some non-trivial item.
      // going to readdir(cwd), but not include the prefix in matches.
      prefix = null
      break

    default:
      // pattern has some string bits in the front.
      // whatever it starts with, whether that's 'absolute' like /foo/bar,
      // or 'relative' like '../baz'
      prefix = pattern.slice(0, n).join('/')
      break
  }

  var remain = pattern.slice(n)

  // get the list of entries.
  var read
  if (prefix === null)
    read = '.'
  else if (isAbsolute(prefix) ||
      isAbsolute(pattern.map(function (p) {
        return typeof p === 'string' ? p : '[*]'
      }).join('/'))) {
    if (!prefix || !isAbsolute(prefix))
      prefix = '/' + prefix
    read = prefix
  } else
    read = prefix

  var abs = this._makeAbs(read)

  //if ignored, skip processing
  if (childrenIgnored(this, read))
    return

  var isGlobStar = remain[0] === minimatch.GLOBSTAR
  if (isGlobStar)
    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar)
  else
    this._processReaddir(prefix, read, abs, remain, index, inGlobStar)
}


GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) {
  var entries = this._readdir(abs, inGlobStar)

  // if the abs isn't a dir, then nothing can match!
  if (!entries)
    return

  // It will only match dot entries if it starts with a dot, or if
  // dot is set.  Stuff like @(.foo|.bar) isn't allowed.
  var pn = remain[0]
  var negate = !!this.minimatch.negate
  var rawGlob = pn._glob
  var dotOk = this.dot || rawGlob.charAt(0) === '.'

  var matchedEntries = []
  for (var i = 0; i < entries.length; i++) {
    var e = entries[i]
    if (e.charAt(0) !== '.' || dotOk) {
      var m
      if (negate && !prefix) {
        m = !e.match(pn)
      } else {
        m = e.match(pn)
      }
      if (m)
        matchedEntries.push(e)
    }
  }

  var len = matchedEntries.length
  // If there are no matched entries, then nothing matches.
  if (len === 0)
    return

  // if this is the last remaining pattern bit, then no need for
  // an additional stat *unless* the user has specified mark or
  // stat explicitly.  We know they exist, since readdir returned
  // them.

  if (remain.length === 1 && !this.mark && !this.stat) {
    if (!this.matches[index])
      this.matches[index] = Object.create(null)

    for (var i = 0; i < len; i ++) {
      var e = matchedEntries[i]
      if (prefix) {
        if (prefix.slice(-1) !== '/')
          e = prefix + '/' + e
        else
          e = prefix + e
      }

      if (e.charAt(0) === '/' && !this.nomount) {
        e = path.join(this.root, e)
      }
      this._emitMatch(index, e)
    }
    // This was the last one, and no stats were needed
    return
  }

  // now test all matched entries as stand-ins for that part
  // of the pattern.
  remain.shift()
  for (var i = 0; i < len; i ++) {
    var e = matchedEntries[i]
    var newPattern
    if (prefix)
      newPattern = [prefix, e]
    else
      newPattern = [e]
    this._process(newPattern.concat(remain), index, inGlobStar)
  }
}


GlobSync.prototype._emitMatch = function (index, e) {
  if (isIgnored(this, e))
    return

  var abs = this._makeAbs(e)

  if (this.mark)
    e = this._mark(e)

  if (this.absolute) {
    e = abs
  }

  if (this.matches[index][e])
    return

  if (this.nodir) {
    var c = this.cache[abs]
    if (c === 'DIR' || Array.isArray(c))
      return
  }

  this.matches[index][e] = true

  if (this.stat)
    this._stat(e)
}


GlobSync.prototype._readdirInGlobStar = function (abs) {
  // follow all symlinked directories forever
  // just proceed as if this is a non-globstar situation
  if (this.follow)
    return this._readdir(abs, false)

  var entries
  var lstat
  var stat
  try {
    lstat = this.fs.lstatSync(abs)
  } catch (er) {
    if (er.code === 'ENOENT') {
      // lstat failed, doesn't exist
      return null
    }
  }

  var isSym = lstat && lstat.isSymbolicLink()
  this.symlinks[abs] = isSym

  // If it's not a symlink or a dir, then it's definitely a regular file.
  // don't bother doing a readdir in that case.
  if (!isSym && lstat && !lstat.isDirectory())
    this.cache[abs] = 'FILE'
  else
    entries = this._readdir(abs, false)

  return entries
}

GlobSync.prototype._readdir = function (abs, inGlobStar) {
  var entries

  if (inGlobStar && !ownProp(this.symlinks, abs))
    return this._readdirInGlobStar(abs)

  if (ownProp(this.cache, abs)) {
    var c = this.cache[abs]
    if (!c || c === 'FILE')
      return null

    if (Array.isArray(c))
      return c
  }

  try {
    return this._readdirEntries(abs, this.fs.readdirSync(abs))
  } catch (er) {
    this._readdirError(abs, er)
    return null
  }
}

GlobSync.prototype._readdirEntries = function (abs, entries) {
  // if we haven't asked to stat everything, then just
  // assume that everything in there exists, so we can avoid
  // having to stat it a second time.
  if (!this.mark && !this.stat) {
    for (var i = 0; i < entries.length; i ++) {
      var e = entries[i]
      if (abs === '/')
        e = abs + e
      else
        e = abs + '/' + e
      this.cache[e] = true
    }
  }

  this.cache[abs] = entries

  // mark and cache dir-ness
  return entries
}

GlobSync.prototype._readdirError = function (f, er) {
  // handle errors, and cache the information
  switch (er.code) {
    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
    case 'ENOTDIR': // totally normal. means it *does* exist.
      var abs = this._makeAbs(f)
      this.cache[abs] = 'FILE'
      if (abs === this.cwdAbs) {
        var error = new Error(er.code + ' invalid cwd ' + this.cwd)
        error.path = this.cwd
        error.code = er.code
        throw error
      }
      break

    case 'ENOENT': // not terribly unusual
    case 'ELOOP':
    case 'ENAMETOOLONG':
    case 'UNKNOWN':
      this.cache[this._makeAbs(f)] = false
      break

    default: // some unusual error.  Treat as failure.
      this.cache[this._makeAbs(f)] = false
      if (this.strict)
        throw er
      if (!this.silent)
        console.error('glob error', er)
      break
  }
}

GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) {

  var entries = this._readdir(abs, inGlobStar)

  // no entries means not a dir, so it can never have matches
  // foo.txt/** doesn't match foo.txt
  if (!entries)
    return

  // test without the globstar, and with every child both below
  // and replacing the globstar.
  var remainWithoutGlobStar = remain.slice(1)
  var gspref = prefix ? [ prefix ] : []
  var noGlobStar = gspref.concat(remainWithoutGlobStar)

  // the noGlobStar pattern exits the inGlobStar state
  this._process(noGlobStar, index, false)

  var len = entries.length
  var isSym = this.symlinks[abs]

  // If it's a symlink, and we're in a globstar, then stop
  if (isSym && inGlobStar)
    return

  for (var i = 0; i < len; i++) {
    var e = entries[i]
    if (e.charAt(0) === '.' && !this.dot)
      continue

    // these two cases enter the inGlobStar state
    var instead = gspref.concat(entries[i], remainWithoutGlobStar)
    this._process(instead, index, true)

    var below = gspref.concat(entries[i], remain)
    this._process(below, index, true)
  }
}

GlobSync.prototype._processSimple = function (prefix, index) {
  // XXX review this.  Shouldn't it be doing the mounting etc
  // before doing stat?  kinda weird?
  var exists = this._stat(prefix)

  if (!this.matches[index])
    this.matches[index] = Object.create(null)

  // If it doesn't exist, then just mark the lack of results
  if (!exists)
    return

  if (prefix && isAbsolute(prefix) && !this.nomount) {
    var trail = /[\/\\]$/.test(prefix)
    if (prefix.charAt(0) === '/') {
      prefix = path.join(this.root, prefix)
    } else {
      prefix = path.resolve(this.root, prefix)
      if (trail)
        prefix += '/'
    }
  }

  if (process.platform === 'win32')
    prefix = prefix.replace(/\\/g, '/')

  // Mark this as a match
  this._emitMatch(index, prefix)
}

// Returns either 'DIR', 'FILE', or false
GlobSync.prototype._stat = function (f) {
  var abs = this._makeAbs(f)
  var needDir = f.slice(-1) === '/'

  if (f.length > this.maxLength)
    return false

  if (!this.stat && ownProp(this.cache, abs)) {
    var c = this.cache[abs]

    if (Array.isArray(c))
      c = 'DIR'

    // It exists, but maybe not how we need it
    if (!needDir || c === 'DIR')
      return c

    if (needDir && c === 'FILE')
      return false

    // otherwise we have to stat, because maybe c=true
    // if we know it exists, but not what it is.
  }

  var exists
  var stat = this.statCache[abs]
  if (!stat) {
    var lstat
    try {
      lstat = this.fs.lstatSync(abs)
    } catch (er) {
      if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {
        this.statCache[abs] = false
        return false
      }
    }

    if (lstat && lstat.isSymbolicLink()) {
      try {
        stat = this.fs.statSync(abs)
      } catch (er) {
        stat = lstat
      }
    } else {
      stat = lstat
    }
  }

  this.statCache[abs] = stat

  var c = true
  if (stat)
    c = stat.isDirectory() ? 'DIR' : 'FILE'

  this.cache[abs] = this.cache[abs] || c

  if (needDir && c === 'FILE')
    return false

  return c
}

GlobSync.prototype._mark = function (p) {
  return common.mark(this, p)
}

GlobSync.prototype._makeAbs = function (f) {
  return common.makeAbs(this, f)
}
ISC License

Copyright (c) npm, Inc.

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 COPYRIGHT HOLDER DISCLAIMS
ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
COPYRIGHT HOLDER 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.
{
  "name": "make-fetch-happen",
  "version": "9.1.0",
  "description": "Opinionated, caching, retrying fetch client",
  "main": "lib/index.js",
  "files": [
    "lib"
  ],
  "repository": "https://github.com/npm/make-fetch-happen",
  "author": {
    "name": "Kat Marchán",
    "email": "kzm@zkat.tech",
    "twitter": "maybekatz"
  },
  "license": "ISC",
  "dependencies": {
    "agentkeepalive": "^4.1.3",
    "cacache": "^15.2.0",
    "http-cache-semantics": "^4.1.0",
    "http-proxy-agent": "^4.0.1",
    "https-proxy-agent": "^5.0.0",
    "is-lambda": "^1.0.1",
    "lru-cache": "^6.0.0",
    "minipass": "^3.1.3",
    "minipass-collect": "^1.0.2",
    "minipass-fetch": "^1.3.2",
    "minipass-flush": "^1.0.5",
    "minipass-pipeline": "^1.2.4",
    "negotiator": "^0.6.2",
    "promise-retry": "^2.0.1",
    "socks-proxy-agent": "^6.0.0",
    "ssri": "^8.0.0"
  },
  "devDependencies": {
    "eslint": "^7.26.0",
    "eslint-plugin-import": "^2.23.2",
    "eslint-plugin-node": "^11.1.0",
    "eslint-plugin-promise": "^5.1.0",
    "eslint-plugin-standard": "^5.0.0",
    "mkdirp": "^1.0.4",
    "nock": "^13.0.11",
    "npmlog": "^5.0.0",
    "require-inject": "^1.4.2",
    "rimraf": "^3.0.2",
    "safe-buffer": "^5.2.1",
    "standard-version": "^9.3.0",
    "tap": "^15.0.9"
  },
  "engines": {
    "node": ">= 10"
  },
  "tap": {
    "color": 1,
    "files": "test/*.js",
    "check-coverage": true
  }
}'use strict'
const LRU = require('lru-cache')
const url = require('url')
const isLambda = require('is-lambda')

const AGENT_CACHE = new LRU({ max: 50 })
const HttpAgent = require('agentkeepalive')
const HttpsAgent = HttpAgent.HttpsAgent

module.exports = getAgent

const getAgentTimeout = timeout =>
  typeof timeout !== 'number' || !timeout ? 0 : timeout + 1

const getMaxSockets = maxSockets => maxSockets || 15

function getAgent (uri, opts) {
  const parsedUri = new url.URL(typeof uri === 'string' ? uri : uri.url)
  const isHttps = parsedUri.protocol === 'https:'
  const pxuri = getProxyUri(parsedUri.href, opts)

  // If opts.timeout is zero, set the agentTimeout to zero as well. A timeout
  // of zero disables the timeout behavior (OS limits still apply). Else, if
  // opts.timeout is a non-zero value, set it to timeout + 1, to ensure that
  // the node-fetch-npm timeout will always fire first, giving us more
  // consistent errors.
  const agentTimeout = getAgentTimeout(opts.timeout)
  const agentMaxSockets = getMaxSockets(opts.maxSockets)

  const key = [
    `https:${isHttps}`,
    pxuri
      ? `proxy:${pxuri.protocol}//${pxuri.host}:${pxuri.port}`
      : '>no-proxy<',
    `local-address:${opts.localAddress || '>no-local-address<'}`,
    `strict-ssl:${isHttps ? opts.rejectUnauthorized : '>no-strict-ssl<'}`,
    `ca:${(isHttps && opts.ca) || '>no-ca<'}`,
    `cert:${(isHttps && opts.cert) || '>no-cert<'}`,
    `key:${(isHttps && opts.key) || '>no-key<'}`,
    `timeout:${agentTimeout}`,
    `maxSockets:${agentMaxSockets}`,
  ].join(':')

  if (opts.agent != null) { // `agent: false` has special behavior!
    return opts.agent
  }

  // keep alive in AWS lambda makes no sense
  const lambdaAgent = !isLambda ? null
    : isHttps ? require('https').globalAgent
    : require('http').globalAgent

  if (isLambda && !pxuri)
    return lambdaAgent

  if (AGENT_CACHE.peek(key))
    return AGENT_CACHE.get(key)

  if (pxuri) {
    const pxopts = isLambda ? {
      ...opts,
      agent: lambdaAgent,
    } : opts
    const proxy = getProxy(pxuri, pxopts, isHttps)
    AGENT_CACHE.set(key, proxy)
    return proxy
  }

  const agent = isHttps ? new HttpsAgent({
    maxSockets: agentMaxSockets,
    ca: opts.ca,
    cert: opts.cert,
    key: opts.key,
    localAddress: opts.localAddress,
    rejectUnauthorized: opts.rejectUnauthorized,
    timeout: agentTimeout,
  }) : new HttpAgent({
    maxSockets: agentMaxSockets,
    localAddress: opts.localAddress,
    timeout: agentTimeout,
  })
  AGENT_CACHE.set(key, agent)
  return agent
}

function checkNoProxy (uri, opts) {
  const host = new url.URL(uri).hostname.split('.').reverse()
  let noproxy = (opts.noProxy || getProcessEnv('no_proxy'))
  if (typeof noproxy === 'string')
    noproxy = noproxy.split(/\s*,\s*/g)

  return noproxy && noproxy.some(no => {
    const noParts = no.split('.').filter(x => x).reverse()
    if (!noParts.length)
      return false
    for (let i = 0; i < noParts.length; i++) {
      if (host[i] !== noParts[i])
        return false
    }
    return true
  })
}

module.exports.getProcessEnv = getProcessEnv

function getProcessEnv (env) {
  if (!env)
    return

  let value

  if (Array.isArray(env)) {
    for (const e of env) {
      value = process.env[e] ||
        process.env[e.toUpperCase()] ||
        process.env[e.toLowerCase()]
      if (typeof value !== 'undefined')
        break
    }
  }

  if (typeof env === 'string') {
    value = process.env[env] ||
      process.env[env.toUpperCase()] ||
      process.env[env.toLowerCase()]
  }

  return value
}

module.exports.getProxyUri = getProxyUri
function getProxyUri (uri, opts) {
  const protocol = new url.URL(uri).protocol

  const proxy = opts.proxy ||
    (
      protocol === 'https:' &&
      getProcessEnv('https_proxy')
    ) ||
    (
      protocol === 'http:' &&
      getProcessEnv(['https_proxy', 'http_proxy', 'proxy'])
    )
  if (!proxy)
    return null

  const parsedProxy = (typeof proxy === 'string') ? new url.URL(proxy) : proxy

  return !checkNoProxy(uri, opts) && parsedProxy
}

const getAuth = u =>
  u.username && u.password ? decodeURIComponent(`${u.username}:${u.password}`)
  : u.username ? decodeURIComponent(u.username)
  : null

const getPath = u => u.pathname + u.search + u.hash

const HttpProxyAgent = require('http-proxy-agent')
const HttpsProxyAgent = require('https-proxy-agent')
const SocksProxyAgent = require('socks-proxy-agent')
module.exports.getProxy = getProxy
function getProxy (proxyUrl, opts, isHttps) {
  const popts = {
    host: proxyUrl.hostname,
    port: proxyUrl.port,
    protocol: proxyUrl.protocol,
    path: getPath(proxyUrl),
    auth: getAuth(proxyUrl),
    ca: opts.ca,
    cert: opts.cert,
    key: opts.key,
    timeout: getAgentTimeout(opts.timeout),
    localAddress: opts.localAddress,
    maxSockets: getMaxSockets(opts.maxSockets),
    rejectUnauthorized: opts.rejectUnauthorized,
  }

  if (proxyUrl.protocol === 'http:' || proxyUrl.protocol === 'https:') {
    if (!isHttps)
      return new HttpProxyAgent(popts)
    else
      return new HttpsProxyAgent(popts)
  } else if (proxyUrl.protocol.startsWith('socks'))
    return new SocksProxyAgent(popts)
  else {
    throw Object.assign(
      new Error(`unsupported proxy protocol: '${proxyUrl.protocol}'`),
      {
        url: proxyUrl.href,
      }
    )
  }
}
'use strict'

const { FetchError, Request, isRedirect } = require('minipass-fetch')
const url = require('url')

const CachePolicy = require('./cache/policy.js')
const cache = require('./cache/index.js')
const remote = require('./remote.js')

// given a Request, a Response and user options
// return true if the response is a redirect that
// can be followed. we throw errors that will result
// in the fetch being rejected if the redirect is
// possible but invalid for some reason
const canFollowRedirect = (request, response, options) => {
  if (!isRedirect(response.status))
    return false

  if (options.redirect === 'manual')
    return false

  if (options.redirect === 'error')
    throw new FetchError(`redirect mode is set to error: ${request.url}`, 'no-redirect', { code: 'ENOREDIRECT' })

  if (!response.headers.has('location'))
    throw new FetchError(`redirect location header missing for: ${request.url}`, 'no-location', { code: 'EINVALIDREDIRECT' })

  if (request.counter >= request.follow)
    throw new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect', { code: 'EMAXREDIRECT' })

  return true
}

// given a Request, a Response, and the user's options return an object
// with a new Request and a new options object that will be used for
// following the redirect
const getRedirect = (request, response, options) => {
  const _opts = { ...options }
  const location = response.headers.get('location')
  const redirectUrl = new url.URL(location, /^https?:/.test(location) ? undefined : request.url)
  // Comment below is used under the following license:
  // Copyright (c) 2010-2012 Mikeal Rogers
  // Licensed under the Apache License, Version 2.0 (the "License");
  // you may not use this file except in compliance with the License.
  // You may obtain a copy of the License at
  // http://www.apache.org/licenses/LICENSE-2.0
  // Unless required by applicable law or agreed to in writing,
  // software distributed under the License is distributed on an "AS
  // IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
  // express or implied. See the License for the specific language
  // governing permissions and limitations under the License.

  // Remove authorization if changing hostnames (but not if just
  // changing ports or protocols).  This matches the behavior of request:
  // https://github.com/request/request/blob/b12a6245/lib/redirect.js#L134-L138
  if (new url.URL(request.url).hostname !== redirectUrl.hostname)
    request.headers.delete('authorization')

  // for POST request with 301/302 response, or any request with 303 response,
  // use GET when following redirect
  if (response.status === 303 || (request.method === 'POST' && [301, 302].includes(response.status))) {
    _opts.method = 'GET'
    _opts.body = null
    request.headers.delete('content-length')
  }

  _opts.headers = {}
  request.headers.forEach((value, key) => {
    _opts.headers[key] = value
  })

  _opts.counter = ++request.counter
  const redirectReq = new Request(url.format(redirectUrl), _opts)
  return {
    request: redirectReq,
    options: _opts,
  }
}

const fetch = async (request, options) => {
  const response = CachePolicy.storable(request, options)
    ? await cache(request, options)
    : await remote(request, options)

  // if the request wasn't a GET or HEAD, and the response
  // status is between 200 and 399 inclusive, invalidate the
  // request url
  if (!['GET', 'HEAD'].includes(request.method) &&
      response.status >= 200 &&
      response.status <= 399)
    await cache.invalidate(request, options)

  if (!canFollowRedirect(request, response, options))
    return response

  const redirect = getRedirect(request, response, options)
  return fetch(redirect.request, redirect.options)
}

module.exports = fetch
const { FetchError, Headers, Request, Response } = require('minipass-fetch')

const configureOptions = require('./options.js')
const fetch = require('./fetch.js')

const makeFetchHappen = (url, opts) => {
  const options = configureOptions(opts)

  const request = new Request(url, options)
  return fetch(request, options)
}

makeFetchHappen.defaults = (defaultUrl, defaultOptions = {}) => {
  if (typeof defaultUrl === 'object') {
    defaultOptions = defaultUrl
    defaultUrl = null
  }

  const defaultedFetch = (url, options = {}) => {
    const finalUrl = url || defaultUrl
    const finalOptions = {
      ...defaultOptions,
      ...options,
      headers: {
        ...defaultOptions.headers,
        ...options.headers,
      },
    }
    return makeFetchHappen(finalUrl, finalOptions)
  }

  defaultedFetch.defaults = makeFetchHappen.defaults
  return defaultedFetch
}

module.exports = makeFetchHappen
module.exports.FetchError = FetchError
module.exports.Headers = Headers
module.exports.Request = Request
module.exports.Response = Response
const conditionalHeaders = [
  'if-modified-since',
  'if-none-match',
  'if-unmodified-since',
  'if-match',
  'if-range',
]

const configureOptions = (opts) => {
  const {strictSSL, ...options} = { ...opts }
  options.method = options.method ? options.method.toUpperCase() : 'GET'
  options.rejectUnauthorized = strictSSL !== false

  if (!options.retry)
    options.retry = { retries: 0 }
  else if (typeof options.retry === 'string') {
    const retries = parseInt(options.retry, 10)
    if (isFinite(retries))
      options.retry = { retries }
    else
      options.retry = { retries: 0 }
  } else if (typeof options.retry === 'number')
    options.retry = { retries: options.retry }
  else
    options.retry = { retries: 0, ...options.retry }

  options.cache = options.cache || 'default'
  if (options.cache === 'default') {
    const hasConditionalHeader = Object.keys(options.headers || {}).some((name) => {
      return conditionalHeaders.includes(name.toLowerCase())
    })
    if (hasConditionalHeader)
      options.cache = 'no-store'
  }

  // cacheManager is deprecated, but if it's set and
  // cachePath is not we should copy it to the new field
  if (options.cacheManager && !options.cachePath)
    options.cachePath = options.cacheManager

  return options
}

module.exports = configureOptions
const Minipass = require('minipass')
const MinipassPipeline = require('minipass-pipeline')
const fetch = require('minipass-fetch')
const promiseRetry = require('promise-retry')
const ssri = require('ssri')

const getAgent = require('./agent.js')
const pkg = require('../package.json')

const USER_AGENT = `${pkg.name}/${pkg.version} (+https://npm.im/${pkg.name})`

const RETRY_ERRORS = [
  'ECONNRESET', // remote socket closed on us
  'ECONNREFUSED', // remote host refused to open connection
  'EADDRINUSE', // failed to bind to a local port (proxy?)
  'ETIMEDOUT', // someone in the transaction is WAY TOO SLOW
  'ERR_SOCKET_TIMEOUT', // same as above, but this one comes from agentkeepalive
  // Known codes we do NOT retry on:
  // ENOTFOUND (getaddrinfo failure. Either bad hostname, or offline)
]

const RETRY_TYPES = [
  'request-timeout',
]

// make a request directly to the remote source,
// retrying certain classes of errors as well as
// following redirects (through the cache if necessary)
// and verifying response integrity
const remoteFetch = (request, options) => {
  const agent = getAgent(request.url, options)
  if (!request.headers.has('connection'))
    request.headers.set('connection', agent ? 'keep-alive' : 'close')

  if (!request.headers.has('user-agent'))
    request.headers.set('user-agent', USER_AGENT)

  // keep our own options since we're overriding the agent
  // and the redirect mode
  const _opts = {
    ...options,
    agent,
    redirect: 'manual',
  }

  return promiseRetry(async (retryHandler, attemptNum) => {
    const req = new fetch.Request(request, _opts)
    try {
      let res = await fetch(req, _opts)
      if (_opts.integrity && res.status === 200) {
        // we got a 200 response and the user has specified an expected
        // integrity value, so wrap the response in an ssri stream to verify it
        const integrityStream = ssri.integrityStream({ integrity: _opts.integrity })
        res = new fetch.Response(new MinipassPipeline(res.body, integrityStream), res)
      }

      res.headers.set('x-fetch-attempts', attemptNum)

      // do not retry POST requests, or requests with a streaming body
      // do retry requests with a 408, 420, 429 or 500+ status in the response
      const isStream = Minipass.isStream(req.body)
      const isRetriable = req.method !== 'POST' &&
          !isStream &&
          ([408, 420, 429].includes(res.status) || res.status >= 500)

      if (isRetriable) {
        if (typeof options.onRetry === 'function')
          options.onRetry(res)

        return retryHandler(res)
      }

      return res
    } catch (err) {
      const code = (err.code === 'EPROMISERETRY')
        ? err.retried.code
        : err.code

      // err.retried will be the thing that was thrown from above
      // if it's a response, we just got a bad status code and we
      // can re-throw to allow the retry
      const isRetryError = err.retried instanceof fetch.Response ||
        (RETRY_ERRORS.includes(code) && RETRY_TYPES.includes(err.type))

      if (req.method === 'POST' || isRetryError)
        throw err

      if (typeof options.onRetry === 'function')
        options.onRetry(err)

      return retryHandler(err)
    }
  }, options.retry).catch((err) => {
    // don't reject for http errors, just return them
    if (err.status >= 400 && err.type !== 'system')
      return err

    throw err
  })
}

module.exports = remoteFetch
const { Request, Response } = require('minipass-fetch')
const Minipass = require('minipass')
const MinipassCollect = require('minipass-collect')
const MinipassFlush = require('minipass-flush')
const MinipassPipeline = require('minipass-pipeline')
const cacache = require('cacache')
const url = require('url')

const CachePolicy = require('./policy.js')
const cacheKey = require('./key.js')
const remote = require('../remote.js')

const hasOwnProperty = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop)

// maximum amount of data we will buffer into memory
// if we'll exceed this, we switch to streaming
const MAX_MEM_SIZE = 5 * 1024 * 1024 // 5MB

// allow list for request headers that will be written to the cache index
// note: we will also store any request headers
// that are named in a response's vary header
const KEEP_REQUEST_HEADERS = [
  'accept-charset',
  'accept-encoding',
  'accept-language',
  'accept',
  'cache-control',
]

// allow list for response headers that will be written to the cache index
// note: we must not store the real response's age header, or when we load
// a cache policy based on the metadata it will think the cached response
// is always stale
const KEEP_RESPONSE_HEADERS = [
  'cache-control',
  'content-encoding',
  'content-language',
  'content-type',
  'date',
  'etag',
  'expires',
  'last-modified',
  'location',
  'pragma',
  'vary',
]

// return an object containing all metadata to be written to the index
const getMetadata = (request, response, options) => {
  const metadata = {
    time: Date.now(),
    url: request.url,
    reqHeaders: {},
    resHeaders: {},
  }

  // only save the status if it's not a 200 or 304
  if (response.status !== 200 && response.status !== 304)
    metadata.status = response.status

  for (const name of KEEP_REQUEST_HEADERS) {
    if (request.headers.has(name))
      metadata.reqHeaders[name] = request.headers.get(name)
  }

  // if the request's host header differs from the host in the url
  // we need to keep it, otherwise it's just noise and we ignore it
  const host = request.headers.get('host')
  const parsedUrl = new url.URL(request.url)
  if (host && parsedUrl.host !== host)
    metadata.reqHeaders.host = host

  // if the response has a vary header, make sure
  // we store the relevant request headers too
  if (response.headers.has('vary')) {
    const vary = response.headers.get('vary')
    // a vary of "*" means every header causes a different response.
    // in that scenario, we do not include any additional headers
    // as the freshness check will always fail anyway and we don't
    // want to bloat the cache indexes
    if (vary !== '*') {
      // copy any other request headers that will vary the response
      const varyHeaders = vary.trim().toLowerCase().split(/\s*,\s*/)
      for (const name of varyHeaders) {
        // explicitly ignore accept-encoding here
        if (name !== 'accept-encoding' && request.headers.has(name))
          metadata.reqHeaders[name] = request.headers.get(name)
      }
    }
  }

  for (const name of KEEP_RESPONSE_HEADERS) {
    if (response.headers.has(name))
      metadata.resHeaders[name] = response.headers.get(name)
  }

  // we only store accept-encoding and content-encoding if the user
  // has disabled automatic compression and decompression in minipass-fetch
  // since if it's enabled (the default) then the content will have
  // already been decompressed making the header a lie
  if (options.compress === false) {
    metadata.reqHeaders['accept-encoding'] = request.headers.get('accept-encoding')
    metadata.resHeaders['content-encoding'] = response.headers.get('content-encoding')
  }

  return metadata
}

// symbols used to hide objects that may be lazily evaluated in a getter
const _request = Symbol('request')
const _response = Symbol('response')
const _policy = Symbol('policy')

class CacheEntry {
  constructor ({ entry, request, response, options }) {
    if (entry) {
      this.key = entry.key
      this.entry = entry
      // previous versions of this module didn't write an explicit timestamp in
      // the metadata, so fall back to the entry's timestamp. we can't use the
      // entry timestamp to determine staleness because cacache will update it
      // when it verifies its data
      this.entry.metadata.time = this.entry.metadata.time || this.entry.time
    } else
      this.key = cacheKey(request)

    this.options = options

    // these properties are behind getters that lazily evaluate
    this[_request] = request
    this[_response] = response
    this[_policy] = null
  }

  // returns a CacheEntry instance that satisfies the given request
  // or undefined if no existing entry satisfies
  static async find (request, options) {
    try {
      // compacts the index and returns an array of unique entries
      var matches = await cacache.index.compact(options.cachePath, cacheKey(request), (A, B) => {
        const entryA = new CacheEntry({ entry: A, options })
        const entryB = new CacheEntry({ entry: B, options })
        return entryA.policy.satisfies(entryB.request)
      }, {
        validateEntry: (entry) => {
          // if an integrity is null, it needs to have a status specified
          if (entry.integrity === null)
            return !!(entry.metadata && entry.metadata.status)

          return true
        },
      })
    } catch (err) {
      // if the compact request fails, ignore the error and return
      return
    }

    // a cache mode of 'reload' means to behave as though we have no cache
    // on the way to the network. return undefined to allow cacheFetch to
    // create a brand new request no matter what.
    if (options.cache === 'reload')
      return

    // find the specific entry that satisfies the request
    let match
    for (const entry of matches) {
      const _entry = new CacheEntry({
        entry,
        options,
      })

      if (_entry.policy.satisfies(request)) {
        match = _entry
        break
      }
    }

    return match
  }

  // if the user made a PUT/POST/PATCH then we invalidate our
  // cache for the same url by deleting the index entirely
  static async invalidate (request, options) {
    const key = cacheKey(request)
    try {
      await cacache.rm.entry(options.cachePath, key, { removeFully: true })
    } catch (err) {
      // ignore errors
    }
  }

  get request () {
    if (!this[_request]) {
      this[_request] = new Request(this.entry.metadata.url, {
        method: 'GET',
        headers: this.entry.metadata.reqHeaders,
      })
    }

    return this[_request]
  }

  get response () {
    if (!this[_response]) {
      this[_response] = new Response(null, {
        url: this.entry.metadata.url,
        counter: this.options.counter,
        status: this.entry.metadata.status || 200,
        headers: {
          ...this.entry.metadata.resHeaders,
          'content-length': this.entry.size,
        },
      })
    }

    return this[_response]
  }

  get policy () {
    if (!this[_policy]) {
      this[_policy] = new CachePolicy({
        entry: this.entry,
        request: this.request,
        response: this.response,
        options: this.options,
      })
    }

    return this[_policy]
  }

  // wraps the response in a pipeline that stores the data
  // in the cache while the user consumes it
  async store (status) {
    // if we got a status other than 200, 301, or 308,
    // or the CachePolicy forbid storage, append the
    // cache status header and return it untouched
    if (this.request.method !== 'GET' || ![200, 301, 308].includes(this.response.status) || !this.policy.storable()) {
      this.response.headers.set('x-local-cache-status', 'skip')
      return this.response
    }

    const size = this.response.headers.get('content-length')
    const fitsInMemory = !!size && Number(size) < MAX_MEM_SIZE
    const shouldBuffer = this.options.memoize !== false && fitsInMemory
    const cacheOpts = {
      algorithms: this.options.algorithms,
      metadata: getMetadata(this.request, this.response, this.options),
      size,
      memoize: fitsInMemory && this.options.memoize,
    }

    let body = null
    // we only set a body if the status is a 200, redirects are
    // stored as metadata only
    if (this.response.status === 200) {
      let cacheWriteResolve, cacheWriteReject
      const cacheWritePromise = new Promise((resolve, reject) => {
        cacheWriteResolve = resolve
        cacheWriteReject = reject
      })

      body = new MinipassPipeline(new MinipassFlush({
        flush () {
          return cacheWritePromise
        },
      }))

      let abortStream, onResume
      if (shouldBuffer) {
        // if the result fits in memory, use a collect stream to gather
        // the response and write it to cacache while also passing it through
        // to the user
        onResume = () => {
          const collector = new MinipassCollect.PassThrough()
          abortStream = collector
          collector.on('collect', (data) => {
            // TODO if the cache write fails, log a warning but return the response anyway
            cacache.put(this.options.cachePath, this.key, data, cacheOpts).then(cacheWriteResolve, cacheWriteReject)
          })
          body.unshift(collector)
          body.unshift(this.response.body)
        }
      } else {
        // if it does not fit in memory, create a tee stream and use
        // that to pipe to both the cache and the user simultaneously
        onResume = () => {
          const tee = new Minipass()
          const cacheStream = cacache.put.stream(this.options.cachePath, this.key, cacheOpts)
          abortStream = cacheStream
          tee.pipe(cacheStream)
          // TODO if the cache write fails, log a warning but return the response anyway
          cacheStream.promise().then(cacheWriteResolve, cacheWriteReject)
          body.unshift(tee)
          body.unshift(this.response.body)
        }
      }

      body.once('resume', onResume)
      body.once('end', () => body.removeListener('resume', onResume))
      this.response.body.on('error', (err) => {
        // the abortStream will either be a MinipassCollect if we buffer
        // or a cacache write stream, either way be sure to listen for
        // errors from the actual response and avoid writing data that we
        // know to be invalid to the cache
        abortStream.destroy(err)
      })
    } else
      await cacache.index.insert(this.options.cachePath, this.key, null, cacheOpts)

    // note: we do not set the x-local-cache-hash header because we do not know
    // the hash value until after the write to the cache completes, which doesn't
    // happen until after the response has been sent and it's too late to write
    // the header anyway
    this.response.headers.set('x-local-cache', encodeURIComponent(this.options.cachePath))
    this.response.headers.set('x-local-cache-key', encodeURIComponent(this.key))
    this.response.headers.set('x-local-cache-mode', shouldBuffer ? 'buffer' : 'stream')
    this.response.headers.set('x-local-cache-status', status)
    this.response.headers.set('x-local-cache-time', new Date().toISOString())
    const newResponse = new Response(body, {
      url: this.response.url,
      status: this.response.status,
      headers: this.response.headers,
      counter: this.options.counter,
    })
    return newResponse
  }

  // use the cached data to create a response and return it
  async respond (method, options, status) {
    let response
    const size = Number(this.response.headers.get('content-length'))
    const fitsInMemory = !!size && size < MAX_MEM_SIZE
    const shouldBuffer = this.options.memoize !== false && fitsInMemory
    if (method === 'HEAD' || [301, 308].includes(this.response.status)) {
      // if the request is a HEAD, or the response is a redirect,
      // then the metadata in the entry already includes everything
      // we need to build a response
      response = this.response
    } else {
      // we're responding with a full cached response, so create a body
      // that reads from cacache and attach it to a new Response
      const body = new Minipass()
      const removeOnResume = () => body.removeListener('resume', onResume)
      let onResume
      if (shouldBuffer) {
        onResume = async () => {
          removeOnResume()
          try {
            const content = await cacache.get.byDigest(this.options.cachePath, this.entry.integrity, { memoize: this.options.memoize })
            body.end(content)
          } catch (err) {
            if (err.code === 'EINTEGRITY')
              await cacache.rm.content(this.options.cachePath, this.entry.integrity, { memoize: this.options.memoize })
            if (err.code === 'ENOENT' || err.code === 'EINTEGRITY')
              await CacheEntry.invalidate(this.request, this.options)
            body.emit('error', err)
          }
        }
      } else {
        onResume = () => {
          const cacheStream = cacache.get.stream.byDigest(this.options.cachePath, this.entry.integrity, { memoize: this.options.memoize })
          cacheStream.on('error', async (err) => {
            cacheStream.pause()
            if (err.code === 'EINTEGRITY')
              await cacache.rm.content(this.options.cachePath, this.entry.integrity, { memoize: this.options.memoize })
            if (err.code === 'ENOENT' || err.code === 'EINTEGRITY')
              await CacheEntry.invalidate(this.request, this.options)
            body.emit('error', err)
            cacheStream.resume()
          })
          cacheStream.pipe(body)
        }
      }

      body.once('resume', onResume)
      body.once('end', removeOnResume)
      response = new Response(body, {
        url: this.entry.metadata.url,
        counter: options.counter,
        status: 200,
        headers: {
          ...this.policy.responseHeaders(),
        },
      })
    }

    response.headers.set('x-local-cache', encodeURIComponent(this.options.cachePath))
    response.headers.set('x-local-cache-hash', encodeURIComponent(this.entry.integrity))
    response.headers.set('x-local-cache-key', encodeURIComponent(this.key))
    response.headers.set('x-local-cache-mode', shouldBuffer ? 'buffer' : 'stream')
    response.headers.set('x-local-cache-status', status)
    response.headers.set('x-local-cache-time', new Date(this.entry.metadata.time).toUTCString())
    return response
  }

  // use the provided request along with this cache entry to
  // revalidate the stored response. returns a response, either
  // from the cache or from the update
  async revalidate (request, options) {
    const revalidateRequest = new Request(request, {
      headers: this.policy.revalidationHeaders(request),
    })

    try {
      // NOTE: be sure to remove the headers property from the
      // user supplied options, since we have already defined
      // them on the new request object. if they're still in the
      // options then those will overwrite the ones from the policy
      var response = await remote(revalidateRequest, {
        ...options,
        headers: undefined,
      })
    } catch (err) {
      // if the network fetch fails, return the stale
      // cached response unless it has a cache-control
      // of 'must-revalidate'
      if (!this.policy.mustRevalidate)
        return this.respond(request.method, options, 'stale')

      throw err
    }

    if (this.policy.revalidated(revalidateRequest, response)) {
      // we got a 304, write a new index to the cache and respond from cache
      const metadata = getMetadata(request, response, options)
      // 304 responses do not include headers that are specific to the response data
      // since they do not include a body, so we copy values for headers that were
      // in the old cache entry to the new one, if the new metadata does not already
      // include that header
      for (const name of KEEP_RESPONSE_HEADERS) {
        if (!hasOwnProperty(metadata.resHeaders, name) && hasOwnProperty(this.entry.metadata.resHeaders, name))
          metadata.resHeaders[name] = this.entry.metadata.resHeaders[name]
      }

      try {
        await cacache.index.insert(options.cachePath, this.key, this.entry.integrity, {
          size: this.entry.size,
          metadata,
        })
      } catch (err) {
        // if updating the cache index fails, we ignore it and
        // respond anyway
      }
      return this.respond(request.method, options, 'revalidated')
    }

    // if we got a modified response, create a new entry based on it
    const newEntry = new CacheEntry({
      request,
      response,
      options,
    })

    // respond with the new entry while writing it to the cache
    return newEntry.store('updated')
  }
}

module.exports = CacheEntry
class NotCachedError extends Error {
  constructor (url) {
    super(`request to ${url} failed: cache mode is 'only-if-cached' but no cached response is available.`)
    this.code = 'ENOTCACHED'
  }
}

module.exports = {
  NotCachedError,
}
const { NotCachedError } = require('./errors.js')
const CacheEntry = require('./entry.js')
const remote = require('../remote.js')

// do whatever is necessary to get a Response and return it
const cacheFetch = async (request, options) => {
  // try to find a cached entry that satisfies this request
  const entry = await CacheEntry.find(request, options)
  if (!entry) {
    // no cached result, if the cache mode is 'only-if-cached' that's a failure
    if (options.cache === 'only-if-cached')
      throw new NotCachedError(request.url)

    // otherwise, we make a request, store it and return it
    const response = await remote(request, options)
    const entry = new CacheEntry({ request, response, options })
    return entry.store('miss')
  }

  // we have a cached response that satisfies this request, however if the cache
  // mode is 'no-cache' then we send the revalidation request no matter what
  if (options.cache === 'no-cache')
    return entry.revalidate(request, options)

  // if the cached entry is not stale, or if the cache mode is 'force-cache' or
  // 'only-if-cached' we can respond with the cached entry. set the status
  // based on the result of needsRevalidation and respond
  const _needsRevalidation = entry.policy.needsRevalidation(request)
  if (options.cache === 'force-cache' ||
      options.cache === 'only-if-cached' ||
      !_needsRevalidation)
    return entry.respond(request.method, options, _needsRevalidation ? 'stale' : 'hit')

  // if we got here, the cache entry is stale so revalidate it
  return entry.revalidate(request, options)
}

cacheFetch.invalidate = async (request, options) => {
  if (!options.cachePath)
    return

  return CacheEntry.invalidate(request, options)
}

module.exports = cacheFetch
const { URL, format } = require('url')

// options passed to url.format() when generating a key
const formatOptions = {
  auth: false,
  fragment: false,
  search: true,
  unicode: false,
}

// returns a string to be used as the cache key for the Request
const cacheKey = (request) => {
  const parsed = new URL(request.url)
  return `make-fetch-happen:request-cache:${format(parsed, formatOptions)}`
}

module.exports = cacheKey
const CacheSemantics = require('http-cache-semantics')
const Negotiator = require('negotiator')
const ssri = require('ssri')

// HACK: negotiator lazy loads several of its own modules
// as a micro optimization. we need to be sure that they're
// in memory as soon as possible at startup so that we do
// not try to lazy load them after the directory has been
// retired during a self update of the npm CLI, we do this
// by calling all of the methods that trigger a lazy load
// on a fake instance.
const preloadNegotiator = new Negotiator({ headers: {} })
preloadNegotiator.charsets()
preloadNegotiator.encodings()
preloadNegotiator.languages()
preloadNegotiator.mediaTypes()

// options passed to http-cache-semantics constructor
const policyOptions = {
  shared: false,
  ignoreCargoCult: true,
}

// a fake empty response, used when only testing the
// request for storability
const emptyResponse = { status: 200, headers: {} }

// returns a plain object representation of the Request
const requestObject = (request) => {
  const _obj = {
    method: request.method,
    url: request.url,
    headers: {},
  }

  request.headers.forEach((value, key) => {
    _obj.headers[key] = value
  })

  return _obj
}

// returns a plain object representation of the Response
const responseObject = (response) => {
  const _obj = {
    status: response.status,
    headers: {},
  }

  response.headers.forEach((value, key) => {
    _obj.headers[key] = value
  })

  return _obj
}

class CachePolicy {
  constructor ({ entry, request, response, options }) {
    this.entry = entry
    this.request = requestObject(request)
    this.response = responseObject(response)
    this.options = options
    this.policy = new CacheSemantics(this.request, this.response, policyOptions)

    if (this.entry) {
      // if we have an entry, copy the timestamp to the _responseTime
      // this is necessary because the CacheSemantics constructor forces
      // the value to Date.now() which means a policy created from a
      // cache entry is likely to always identify itself as stale
      this.policy._responseTime = this.entry.metadata.time
    }
  }

  // static method to quickly determine if a request alone is storable
  static storable (request, options) {
    // no cachePath means no caching
    if (!options.cachePath)
      return false

    // user explicitly asked not to cache
    if (options.cache === 'no-store')
      return false

    // we only cache GET and HEAD requests
    if (!['GET', 'HEAD'].includes(request.method))
      return false

    // otherwise, let http-cache-semantics make the decision
    // based on the request's headers
    const policy = new CacheSemantics(requestObject(request), emptyResponse, policyOptions)
    return policy.storable()
  }

  // returns true if the policy satisfies the request
  satisfies (request) {
    const _req = requestObject(request)
    if (this.request.headers.host !== _req.headers.host)
      return false

    const negotiatorA = new Negotiator(this.request)
    const negotiatorB = new Negotiator(_req)

    if (JSON.stringify(negotiatorA.mediaTypes()) !== JSON.stringify(negotiatorB.mediaTypes()))
      return false

    if (JSON.stringify(negotiatorA.languages()) !== JSON.stringify(negotiatorB.languages()))
      return false

    if (JSON.stringify(negotiatorA.encodings()) !== JSON.stringify(negotiatorB.encodings()))
      return false

    if (this.options.integrity)
      return ssri.parse(this.options.integrity).match(this.entry.integrity)

    return true
  }

  // returns true if the request and response allow caching
  storable () {
    return this.policy.storable()
  }

  // NOTE: this is a hack to avoid parsing the cache-control
  // header ourselves, it returns true if the response's
  // cache-control contains must-revalidate
  get mustRevalidate () {
    return !!this.policy._rescc['must-revalidate']
  }

  // returns true if the cached response requires revalidation
  // for the given request
  needsRevalidation (request) {
    const _req = requestObject(request)
    // force method to GET because we only cache GETs
    // but can serve a HEAD from a cached GET
    _req.method = 'GET'
    return !this.policy.satisfiesWithoutRevalidation(_req)
  }

  responseHeaders () {
    return this.policy.responseHeaders()
  }

  // returns a new object containing the appropriate headers
  // to send a revalidation request
  revalidationHeaders (request) {
    const _req = requestObject(request)
    return this.policy.revalidationHeaders(_req)
  }

  // returns true if the request/response was revalidated
  // successfully. returns false if a new response was received
  revalidated (request, response) {
    const _req = requestObject(request)
    const _res = responseObject(response)
    const policy = this.policy.revalidatedPolicy(_req, _res)
    return !policy.modified
  }
}

module.exports = CachePolicy
The MIT License (MIT)

Copyright (c) Isaac Z. Schlueter and Contributors
Copyright (c) 2016 David Frank

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

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

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

---

Note: This is a derivative work based on "node-fetch" by David Frank,
modified and distributed under the terms of the MIT license above.
https://github.com/bitinn/node-fetch
module.exports = require('./lib/index.js')
{
  "name": "minipass-fetch",
  "version": "1.4.1",
  "description": "An implementation of window.fetch in Node.js using Minipass streams",
  "license": "MIT",
  "main": "lib/index.js",
  "tap": {
    "coverage-map": "map.js",
    "check-coverage": true
  },
  "devDependencies": {
    "@ungap/url-search-params": "^0.1.2",
    "abort-controller": "^3.0.0",
    "abortcontroller-polyfill": "~1.3.0",
    "form-data": "^2.5.1",
    "parted": "^0.1.1",
    "string-to-arraybuffer": "^1.0.2",
    "tap": "^15.0.9",
    "whatwg-url": "^7.0.0"
  },
  "dependencies": {
    "minipass": "^3.1.0",
    "minipass-sized": "^1.0.3",
    "minizlib": "^2.0.0"
  },
  "optionalDependencies": {
    "encoding": "^0.1.12"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/npm/minipass-fetch.git"
  },
  "files": [
    "index.js",
    "lib/*.js"
  ],
  "engines": {
    "node": ">=8"
  }
}'use strict'
class AbortError extends Error {
  constructor (message) {
    super(message)
    this.code = 'FETCH_ABORTED'
    this.type = 'aborted'
    Error.captureStackTrace(this, this.constructor)
  }

  get name () {
    return 'AbortError'
  }

  // don't allow name to be overridden, but don't throw either
  set name (s) {}
}
module.exports = AbortError
'use strict'
const Minipass = require('minipass')
const TYPE = Symbol('type')
const BUFFER = Symbol('buffer')

class Blob {
  constructor (blobParts, options) {
    this[TYPE] = ''

    const buffers = []
    let size = 0

    if (blobParts) {
      const a = blobParts
      const length = Number(a.length)
      for (let i = 0; i < length; i++) {
        const element = a[i]
        const buffer = element instanceof Buffer ? element
          : ArrayBuffer.isView(element)
            ? Buffer.from(element.buffer, element.byteOffset, element.byteLength)
          : element instanceof ArrayBuffer ? Buffer.from(element)
          : element instanceof Blob ? element[BUFFER]
          : typeof element === 'string' ? Buffer.from(element)
          : Buffer.from(String(element))
        size += buffer.length
        buffers.push(buffer)
      }
    }

    this[BUFFER] = Buffer.concat(buffers, size)

    const type = options && options.type !== undefined
      && String(options.type).toLowerCase()
    if (type && !/[^\u0020-\u007E]/.test(type)) {
      this[TYPE] = type
    }
  }

  get size () {
    return this[BUFFER].length
  }

  get type () {
    return this[TYPE]
  }

  text () {
    return Promise.resolve(this[BUFFER].toString())
  }

  arrayBuffer () {
    const buf = this[BUFFER]
    const off = buf.byteOffset
    const len = buf.byteLength
    const ab = buf.buffer.slice(off, off + len)
    return Promise.resolve(ab)
  }

  stream () {
    return new Minipass().end(this[BUFFER])
  }

  slice (start, end, type) {
    const size = this.size
    const relativeStart = start === undefined ? 0
      : start < 0 ? Math.max(size + start, 0)
      : Math.min(start, size)
    const relativeEnd = end === undefined ? size
      : end < 0 ? Math.max(size + end, 0)
      : Math.min(end, size)
    const span = Math.max(relativeEnd - relativeStart, 0)

    const buffer = this[BUFFER]
    const slicedBuffer = buffer.slice(
      relativeStart,
      relativeStart + span
    )
    const blob = new Blob([], { type })
    blob[BUFFER] = slicedBuffer
    return blob
  }

  get [Symbol.toStringTag] () {
    return 'Blob'
  }

  static get BUFFER () {
    return BUFFER
  }
}

Object.defineProperties(Blob.prototype, {
  size: { enumerable: true },
  type: { enumerable: true },
})

module.exports = Blob
'use strict'
const Minipass = require('minipass')
const MinipassSized = require('minipass-sized')

const Blob = require('./blob.js')
const {BUFFER} = Blob
const FetchError = require('./fetch-error.js')

// optional dependency on 'encoding'
let convert
try {
  convert = require('encoding').convert
} catch (e) {}

const INTERNALS = Symbol('Body internals')
const CONSUME_BODY = Symbol('consumeBody')

class Body {
  constructor (bodyArg, options = {}) {
    const { size = 0, timeout = 0 } = options
    const body = bodyArg === undefined || bodyArg === null ? null
      : isURLSearchParams(bodyArg) ? Buffer.from(bodyArg.toString())
      : isBlob(bodyArg) ? bodyArg
      : Buffer.isBuffer(bodyArg) ? bodyArg
      : Object.prototype.toString.call(bodyArg) === '[object ArrayBuffer]'
        ? Buffer.from(bodyArg)
      : ArrayBuffer.isView(bodyArg)
        ? Buffer.from(bodyArg.buffer, bodyArg.byteOffset, bodyArg.byteLength)
      : Minipass.isStream(bodyArg) ? bodyArg
      : Buffer.from(String(bodyArg))

    this[INTERNALS] = {
      body,
      disturbed: false,
      error: null,
    }

    this.size = size
    this.timeout = timeout

    if (Minipass.isStream(body)) {
      body.on('error', er => {
        const error = er.name === 'AbortError' ? er
          : new FetchError(`Invalid response while trying to fetch ${
            this.url}: ${er.message}`, 'system', er)
        this[INTERNALS].error = error
      })
    }
  }

  get body () {
    return this[INTERNALS].body
  }

  get bodyUsed () {
    return this[INTERNALS].disturbed
  }

  arrayBuffer () {
    return this[CONSUME_BODY]().then(buf =>
      buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength))
  }

  blob () {
    const ct = this.headers && this.headers.get('content-type') || ''
    return this[CONSUME_BODY]().then(buf => Object.assign(
      new Blob([], { type: ct.toLowerCase() }),
      { [BUFFER]: buf }
    ))
  }

  json () {
    return this[CONSUME_BODY]().then(buf => {
      try {
        return JSON.parse(buf.toString())
      } catch (er) {
        return Promise.reject(new FetchError(
          `invalid json response body at ${
            this.url} reason: ${er.message}`, 'invalid-json'))
      }
    })
  }

  text () {
    return this[CONSUME_BODY]().then(buf => buf.toString())
  }

  buffer () {
    return this[CONSUME_BODY]()
  }

  textConverted () {
    return this[CONSUME_BODY]().then(buf => convertBody(buf, this.headers))
  }

  [CONSUME_BODY] () {
    if (this[INTERNALS].disturbed)
      return Promise.reject(new TypeError(`body used already for: ${
        this.url}`))

    this[INTERNALS].disturbed = true

    if (this[INTERNALS].error)
      return Promise.reject(this[INTERNALS].error)

    // body is null
    if (this.body === null) {
      return Promise.resolve(Buffer.alloc(0))
    }

    if (Buffer.isBuffer(this.body))
      return Promise.resolve(this.body)

    const upstream = isBlob(this.body) ? this.body.stream() : this.body

    /* istanbul ignore if: should never happen */
    if (!Minipass.isStream(upstream))
      return Promise.resolve(Buffer.alloc(0))

    const stream = this.size && upstream instanceof MinipassSized ? upstream
      : !this.size && upstream instanceof Minipass &&
        !(upstream instanceof MinipassSized) ? upstream
      : this.size ? new MinipassSized({ size: this.size })
      : new Minipass()

    // allow timeout on slow response body
    const resTimeout = this.timeout ? setTimeout(() => {
      stream.emit('error', new FetchError(
        `Response timeout while trying to fetch ${
          this.url} (over ${this.timeout}ms)`, 'body-timeout'))
    }, this.timeout) : null

    // do not keep the process open just for this timeout, even
    // though we expect it'll get cleared eventually.
    if (resTimeout) {
      resTimeout.unref()
    }

    // do the pipe in the promise, because the pipe() can send too much
    // data through right away and upset the MP Sized object
    return new Promise((resolve, reject) => {
      // if the stream is some other kind of stream, then pipe through a MP
      // so we can collect it more easily.
      if (stream !== upstream) {
        upstream.on('error', er => stream.emit('error', er))
        upstream.pipe(stream)
      }
      resolve()
    }).then(() => stream.concat()).then(buf => {
      clearTimeout(resTimeout)
      return buf
    }).catch(er => {
      clearTimeout(resTimeout)
      // request was aborted, reject with this Error
      if (er.name === 'AbortError' || er.name === 'FetchError')
        throw er
      else if (er.name === 'RangeError')
        throw new FetchError(`Could not create Buffer from response body for ${
          this.url}: ${er.message}`, 'system', er)
      else
        // other errors, such as incorrect content-encoding or content-length
        throw new FetchError(`Invalid response body while trying to fetch ${
          this.url}: ${er.message}`, 'system', er)
    })
  }

  static clone (instance) {
    if (instance.bodyUsed)
      throw new Error('cannot clone body after it is used')

    const body = instance.body

    // check that body is a stream and not form-data object
    // NB: can't clone the form-data object without having it as a dependency
    if (Minipass.isStream(body) && typeof body.getBoundary !== 'function') {
      // create a dedicated tee stream so that we don't lose data
      // potentially sitting in the body stream's buffer by writing it
      // immediately to p1 and not having it for p2.
      const tee = new Minipass()
      const p1 = new Minipass()
      const p2 = new Minipass()
      tee.on('error', er => {
        p1.emit('error', er)
        p2.emit('error', er)
      })
      body.on('error', er => tee.emit('error', er))
      tee.pipe(p1)
      tee.pipe(p2)
      body.pipe(tee)
      // set instance body to one fork, return the other
      instance[INTERNALS].body = p1
      return p2
    } else
      return instance.body
  }

  static extractContentType (body) {
    return body === null || body === undefined ? null
      : typeof body === 'string' ? 'text/plain;charset=UTF-8'
      : isURLSearchParams(body)
        ? 'application/x-www-form-urlencoded;charset=UTF-8'
      : isBlob(body) ? body.type || null
      : Buffer.isBuffer(body) ? null
      : Object.prototype.toString.call(body) === '[object ArrayBuffer]' ? null
      : ArrayBuffer.isView(body) ? null
      : typeof body.getBoundary === 'function'
        ? `multipart/form-data;boundary=${body.getBoundary()}`
      : Minipass.isStream(body) ? null
      : 'text/plain;charset=UTF-8'
  }

  static getTotalBytes (instance) {
    const {body} = instance
    return (body === null || body === undefined) ? 0
    : isBlob(body) ? body.size
    : Buffer.isBuffer(body) ? body.length
    : body && typeof body.getLengthSync === 'function' && (
        // detect form data input from form-data module
        body._lengthRetrievers &&
        /* istanbul ignore next */ body._lengthRetrievers.length == 0 || // 1.x
        body.hasKnownLength && body.hasKnownLength()) // 2.x
      ? body.getLengthSync()
    : null
  }

  static writeToStream (dest, instance) {
    const {body} = instance

    if (body === null || body === undefined)
      dest.end()
    else if (Buffer.isBuffer(body) || typeof body === 'string')
      dest.end(body)
    else {
      // body is stream or blob
      const stream = isBlob(body) ? body.stream() : body
      stream.on('error', er => dest.emit('error', er)).pipe(dest)
    }

    return dest
  }
}

Object.defineProperties(Body.prototype, {
  body: { enumerable: true },
  bodyUsed: { enumerable: true },
  arrayBuffer: { enumerable: true },
  blob: { enumerable: true },
  json: { enumerable: true },
  text: { enumerable: true }
})


const isURLSearchParams = obj =>
  // Duck-typing as a necessary condition.
  (typeof obj !== 'object' ||
    typeof obj.append !== 'function' ||
    typeof obj.delete !== 'function' ||
    typeof obj.get !== 'function' ||
    typeof obj.getAll !== 'function' ||
    typeof obj.has !== 'function' ||
    typeof obj.set !== 'function') ? false
  // Brand-checking and more duck-typing as optional condition.
  : obj.constructor.name === 'URLSearchParams' ||
    Object.prototype.toString.call(obj) === '[object URLSearchParams]' ||
    typeof obj.sort === 'function'

const isBlob = obj =>
  typeof obj === 'object' &&
  typeof obj.arrayBuffer === 'function' &&
  typeof obj.type === 'string' &&
  typeof obj.stream === 'function' &&
  typeof obj.constructor === 'function' &&
  typeof obj.constructor.name === 'string' &&
  /^(Blob|File)$/.test(obj.constructor.name) &&
  /^(Blob|File)$/.test(obj[Symbol.toStringTag])


const convertBody = (buffer, headers) => {
  /* istanbul ignore if */
  if (typeof convert !== 'function')
    throw new Error('The package `encoding` must be installed to use the textConverted() function')

  const ct = headers && headers.get('content-type')
  let charset = 'utf-8'
  let res, str

  // header
  if (ct)
    res = /charset=([^;]*)/i.exec(ct)

  // no charset in content type, peek at response body for at most 1024 bytes
  str = buffer.slice(0, 1024).toString()

  // html5
  if (!res && str)
    res = /<meta.+?charset=(['"])(.+?)\1/i.exec(str)

  // html4
  if (!res && str) {
    res = /<meta[\s]+?http-equiv=(['"])content-type\1[\s]+?content=(['"])(.+?)\2/i.exec(str)

    if (!res) {
      res = /<meta[\s]+?content=(['"])(.+?)\1[\s]+?http-equiv=(['"])content-type\3/i.exec(str)
      if (res)
        res.pop() // drop last quote
    }

    if (res)
      res = /charset=(.*)/i.exec(res.pop())
  }

  // xml
  if (!res && str)
    res = /<\?xml.+?encoding=(['"])(.+?)\1/i.exec(str)

  // found charset
  if (res) {
    charset = res.pop()

    // prevent decode issues when sites use incorrect encoding
    // ref: https://hsivonen.fi/encoding-menu/
    if (charset === 'gb2312' || charset === 'gbk')
      charset = 'gb18030'
  }

  // turn raw buffers into a single utf-8 buffer
  return convert(
    buffer,
    'UTF-8',
    charset
  ).toString()
}

module.exports = Body
'use strict'
class FetchError extends Error {
  constructor (message, type, systemError) {
    super(message)
    this.code = 'FETCH_ERROR'

    // pick up code, expected, path, ...
    if (systemError)
      Object.assign(this, systemError)

    this.errno = this.code

    // override anything the system error might've clobbered
    this.type = this.code === 'EBADSIZE' && this.found > this.expect
      ? 'max-size' : type
    this.message = message
    Error.captureStackTrace(this, this.constructor)
  }

  get name () {
    return 'FetchError'
  }

  // don't allow name to be overwritten
  set name (n) {}

  get [Symbol.toStringTag] () {
    return 'FetchError'
  }
}
module.exports = FetchError
'use strict'
const invalidTokenRegex = /[^\^_`a-zA-Z\-0-9!#$%&'*+.|~]/
const invalidHeaderCharRegex = /[^\t\x20-\x7e\x80-\xff]/

const validateName = name => {
  name = `${name}`
  if (invalidTokenRegex.test(name) || name === '')
    throw new TypeError(`${name} is not a legal HTTP header name`)
}

const validateValue = value => {
  value = `${value}`
  if (invalidHeaderCharRegex.test(value))
    throw new TypeError(`${value} is not a legal HTTP header value`)
}

const find = (map, name) => {
  name = name.toLowerCase()
  for (const key in map) {
    if (key.toLowerCase() === name)
      return key
  }
  return undefined
}

const MAP = Symbol('map')
class Headers {
  constructor (init = undefined) {
    this[MAP] = Object.create(null)
    if (init instanceof Headers) {
      const rawHeaders = init.raw()
      const headerNames = Object.keys(rawHeaders)
      for (const headerName of headerNames) {
        for (const value of rawHeaders[headerName]) {
          this.append(headerName, value)
        }
      }
      return
    }

    // no-op
    if (init === undefined || init === null)
      return

    if (typeof init === 'object') {
      const method = init[Symbol.iterator]
      if (method !== null && method !== undefined) {
        if (typeof method !== 'function')
          throw new TypeError('Header pairs must be iterable')

        // sequence<sequence<ByteString>>
        // Note: per spec we have to first exhaust the lists then process them
        const pairs = []
        for (const pair of init) {
          if (typeof pair !== 'object' ||
              typeof pair[Symbol.iterator] !== 'function')
            throw new TypeError('Each header pair must be iterable')
          const arrPair = Array.from(pair)
          if (arrPair.length !== 2)
            throw new TypeError('Each header pair must be a name/value tuple')
          pairs.push(arrPair)
        }

        for (const pair of pairs) {
          this.append(pair[0], pair[1])
        }
      } else {
        // record<ByteString, ByteString>
        for (const key of Object.keys(init)) {
          this.append(key, init[key])
        }
      }
    } else
      throw new TypeError('Provided initializer must be an object')
  }

  get (name) {
    name = `${name}`
    validateName(name)
    const key = find(this[MAP], name)
    if (key === undefined)
      return null

    return this[MAP][key].join(', ')
  }

  forEach (callback, thisArg = undefined) {
    let pairs = getHeaders(this)
    for (let i = 0; i < pairs.length; i++) {
      const [name, value] = pairs[i]
      callback.call(thisArg, value, name, this)
      // refresh in case the callback added more headers
      pairs = getHeaders(this)
    }
  }

  set (name, value) {
    name = `${name}`
    value = `${value}`
    validateName(name)
    validateValue(value)
    const key = find(this[MAP], name)
    this[MAP][key !== undefined ? key : name] = [value]
  }

  append (name, value) {
    name = `${name}`
    value = `${value}`
    validateName(name)
    validateValue(value)
    const key = find(this[MAP], name)
    if (key !== undefined)
      this[MAP][key].push(value)
    else
      this[MAP][name] = [value]
  }

  has (name) {
    name = `${name}`
    validateName(name)
    return find(this[MAP], name) !== undefined
  }

  delete (name) {
    name = `${name}`
    validateName(name)
    const key = find(this[MAP], name)
    if (key !== undefined)
      delete this[MAP][key]
  }

  raw () {
    return this[MAP]
  }

  keys () {
    return new HeadersIterator(this, 'key')
  }

  values () {
    return new HeadersIterator(this, 'value')
  }

  [Symbol.iterator]() {
    return new HeadersIterator(this, 'key+value')
  }

  entries () {
    return new HeadersIterator(this, 'key+value')
  }

  get [Symbol.toStringTag] () {
    return 'Headers'
  }

  static exportNodeCompatibleHeaders (headers) {
    const obj = Object.assign(Object.create(null), headers[MAP])

    // http.request() only supports string as Host header. This hack makes
    // specifying custom Host header possible.
    const hostHeaderKey = find(headers[MAP], 'Host')
    if (hostHeaderKey !== undefined)
      obj[hostHeaderKey] = obj[hostHeaderKey][0]

    return obj
  }

  static createHeadersLenient (obj) {
    const headers = new Headers()
    for (const name of Object.keys(obj)) {
      if (invalidTokenRegex.test(name))
        continue

      if (Array.isArray(obj[name])) {
        for (const val of obj[name]) {
          if (invalidHeaderCharRegex.test(val))
            continue

          if (headers[MAP][name] === undefined)
            headers[MAP][name] = [val]
          else
            headers[MAP][name].push(val)
        }
      } else if (!invalidHeaderCharRegex.test(obj[name]))
        headers[MAP][name] = [obj[name]]
    }
    return headers
  }
}

Object.defineProperties(Headers.prototype, {
  get: { enumerable: true },
  forEach: { enumerable: true },
  set: { enumerable: true },
  append: { enumerable: true },
  has: { enumerable: true },
  delete: { enumerable: true },
  keys: { enumerable: true },
  values: { enumerable: true },
  entries: { enumerable: true },
})

const getHeaders = (headers, kind = 'key+value') =>
  Object.keys(headers[MAP]).sort().map(
    kind === 'key' ? k => k.toLowerCase()
    : kind === 'value' ? k => headers[MAP][k].join(', ')
    : k => [k.toLowerCase(), headers[MAP][k].join(', ')]
  )

const INTERNAL = Symbol('internal')

class HeadersIterator {
  constructor (target, kind) {
    this[INTERNAL] = {
      target,
      kind,
      index: 0,
    }
  }

  get [Symbol.toStringTag] () {
    return 'HeadersIterator'
  }

  next () {
    /* istanbul ignore if: should be impossible */
    if (!this || Object.getPrototypeOf(this) !== HeadersIterator.prototype)
      throw new TypeError('Value of `this` is not a HeadersIterator')

    const { target, kind, index } = this[INTERNAL]
    const values = getHeaders(target, kind)
    const len = values.length
    if (index >= len) {
      return {
        value: undefined,
        done: true,
      }
    }

    this[INTERNAL].index++

    return { value: values[index], done: false }
  }
}

// manually extend because 'extends' requires a ctor
Object.setPrototypeOf(HeadersIterator.prototype,
  Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())))

module.exports = Headers
'use strict'
const Url = require('url')
const http = require('http')
const https = require('https')
const zlib = require('minizlib')
const Minipass = require('minipass')

const Body = require('./body.js')
const { writeToStream, getTotalBytes } = Body
const Response = require('./response.js')
const Headers = require('./headers.js')
const { createHeadersLenient } = Headers
const Request = require('./request.js')
const { getNodeRequestOptions } = Request
const FetchError = require('./fetch-error.js')
const AbortError = require('./abort-error.js')

const resolveUrl = Url.resolve

const fetch = (url, opts) => {
  if (/^data:/.test(url)) {
    const request = new Request(url, opts)
    try {
      const split = url.split(',')
      const data = Buffer.from(split[1], 'base64')
      const type = split[0].match(/^data:(.*);base64$/)[1]
      return Promise.resolve(new Response(data, {
        headers: {
          'Content-Type': type,
          'Content-Length': data.length,
        }
      }))
    } catch (er) {
      return Promise.reject(new FetchError(`[${request.method}] ${
        request.url} invalid URL, ${er.message}`, 'system', er))
    }
  }

  return new Promise((resolve, reject) => {
    // build request object
    const request = new Request(url, opts)
    let options
    try {
      options = getNodeRequestOptions(request)
    } catch (er) {
      return reject(er)
    }

    const send = (options.protocol === 'https:' ? https : http).request
    const { signal } = request
    let response = null
    const abort = () => {
      const error = new AbortError('The user aborted a request.')
      reject(error)
      if (Minipass.isStream(request.body) &&
          typeof request.body.destroy === 'function') {
        request.body.destroy(error)
      }
      if (response && response.body) {
        response.body.emit('error', error)
      }
    }

    if (signal && signal.aborted)
      return abort()

    const abortAndFinalize = () => {
      abort()
      finalize()
    }

    const finalize = () => {
      req.abort()
      if (signal)
        signal.removeEventListener('abort', abortAndFinalize)
      clearTimeout(reqTimeout)
    }

    // send request
    const req = send(options)

    if (signal)
      signal.addEventListener('abort', abortAndFinalize)

    let reqTimeout = null
    if (request.timeout) {
      req.once('socket', socket => {
        reqTimeout = setTimeout(() => {
          reject(new FetchError(`network timeout at: ${
            request.url}`, 'request-timeout'))
          finalize()
        }, request.timeout)
      })
    }

    req.on('error', er => {
      // if a 'response' event is emitted before the 'error' event, then by the
      // time this handler is run it's too late to reject the Promise for the
      // response. instead, we forward the error event to the response stream
      // so that the error will surface to the user when they try to consume
      // the body. this is done as a side effect of aborting the request except
      // for in windows, where we must forward the event manually, otherwise
      // there is no longer a ref'd socket attached to the request and the
      // stream never ends so the event loop runs out of work and the process
      // exits without warning.
      // coverage skipped here due to the difficulty in testing
      // istanbul ignore next
      if (req.res)
        req.res.emit('error', er)
      reject(new FetchError(`request to ${request.url} failed, reason: ${
        er.message}`, 'system', er))
      finalize()
    })

    req.on('response', res => {
      clearTimeout(reqTimeout)

      const headers = createHeadersLenient(res.headers)

      // HTTP fetch step 5
      if (fetch.isRedirect(res.statusCode)) {
        // HTTP fetch step 5.2
        const location = headers.get('Location')

        // HTTP fetch step 5.3
        const locationURL = location === null ? null
          : resolveUrl(request.url, location)

        // HTTP fetch step 5.5
        switch (request.redirect) {
          case 'error':
            reject(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${
              request.url}`, 'no-redirect'))
            finalize()
            return

          case 'manual':
            // node-fetch-specific step: make manual redirect a bit easier to
            // use by setting the Location header value to the resolved URL.
            if (locationURL !== null) {
              // handle corrupted header
              try {
                headers.set('Location', locationURL)
              } catch (err) {
                /* istanbul ignore next: nodejs server prevent invalid
                   response headers, we can't test this through normal
                   request */
                reject(err)
              }
            }
            break

          case 'follow':
            // HTTP-redirect fetch step 2
            if (locationURL === null) {
              break
            }

            // HTTP-redirect fetch step 5
            if (request.counter >= request.follow) {
              reject(new FetchError(`maximum redirect reached at: ${
                request.url}`, 'max-redirect'))
              finalize()
              return
            }

            // HTTP-redirect fetch step 9
            if (res.statusCode !== 303 &&
                request.body &&
                getTotalBytes(request) === null) {
              reject(new FetchError(
                'Cannot follow redirect with body being a readable stream',
                'unsupported-redirect'
              ))
              finalize()
              return
            }

            // Update host due to redirection
            request.headers.set('host', Url.parse(locationURL).host)

            // HTTP-redirect fetch step 6 (counter increment)
            // Create a new Request object.
            const requestOpts = {
              headers: new Headers(request.headers),
              follow: request.follow,
              counter: request.counter + 1,
              agent: request.agent,
              compress: request.compress,
              method: request.method,
              body: request.body,
              signal: request.signal,
              timeout: request.timeout,
            }

            // HTTP-redirect fetch step 11
            if (res.statusCode === 303 || (
                (res.statusCode === 301 || res.statusCode === 302) &&
                request.method === 'POST'
            )) {
              requestOpts.method = 'GET'
              requestOpts.body = undefined
              requestOpts.headers.delete('content-length')
            }

            // HTTP-redirect fetch step 15
            resolve(fetch(new Request(locationURL, requestOpts)))
            finalize()
            return
        }
      } // end if(isRedirect)


      // prepare response
      res.once('end', () =>
        signal && signal.removeEventListener('abort', abortAndFinalize))

      const body = new Minipass()
      // exceedingly rare that the stream would have an error,
      // but just in case we proxy it to the stream in use.
      res.on('error', /* istanbul ignore next */ er => body.emit('error', er))
      res.on('data', (chunk) => body.write(chunk))
      res.on('end', () => body.end())

      const responseOptions = {
        url: request.url,
        status: res.statusCode,
        statusText: res.statusMessage,
        headers: headers,
        size: request.size,
        timeout: request.timeout,
        counter: request.counter,
        trailer: new Promise(resolve =>
          res.on('end', () => resolve(createHeadersLenient(res.trailers))))
      }

      // HTTP-network fetch step 12.1.1.3
      const codings = headers.get('Content-Encoding')

      // HTTP-network fetch step 12.1.1.4: handle content codings

      // in following scenarios we ignore compression support
      // 1. compression support is disabled
      // 2. HEAD request
      // 3. no Content-Encoding header
      // 4. no content response (204)
      // 5. content not modified response (304)
      if (!request.compress ||
          request.method === 'HEAD' ||
          codings === null ||
          res.statusCode === 204 ||
          res.statusCode === 304) {
        response = new Response(body, responseOptions)
        resolve(response)
        return
      }


      // Be less strict when decoding compressed responses, since sometimes
      // servers send slightly invalid responses that are still accepted
      // by common browsers.
      // Always using Z_SYNC_FLUSH is what cURL does.
      const zlibOptions = {
        flush: zlib.constants.Z_SYNC_FLUSH,
        finishFlush: zlib.constants.Z_SYNC_FLUSH,
      }

      // for gzip
      if (codings == 'gzip' || codings == 'x-gzip') {
        const unzip = new zlib.Gunzip(zlibOptions)
        response = new Response(
          // exceedingly rare that the stream would have an error,
          // but just in case we proxy it to the stream in use.
          body.on('error', /* istanbul ignore next */ er => unzip.emit('error', er)).pipe(unzip),
          responseOptions
        )
        resolve(response)
        return
      }

      // for deflate
      if (codings == 'deflate' || codings == 'x-deflate') {
        // handle the infamous raw deflate response from old servers
        // a hack for old IIS and Apache servers
        const raw = res.pipe(new Minipass())
        raw.once('data', chunk => {
          // see http://stackoverflow.com/questions/37519828
          const decoder = (chunk[0] & 0x0F) === 0x08
            ? new zlib.Inflate()
            : new zlib.InflateRaw()
          // exceedingly rare that the stream would have an error,
          // but just in case we proxy it to the stream in use.
          body.on('error', /* istanbul ignore next */ er => decoder.emit('error', er)).pipe(decoder)
          response = new Response(decoder, responseOptions)
          resolve(response)
        })
        return
      }


      // for br
      if (codings == 'br') {
        // ignoring coverage so tests don't have to fake support (or lack of) for brotli
        // istanbul ignore next
        try {
          var decoder = new zlib.BrotliDecompress()
        } catch (err) {
          reject(err)
          finalize()
          return
        }
        // exceedingly rare that the stream would have an error,
        // but just in case we proxy it to the stream in use.
        body.on('error', /* istanbul ignore next */ er => decoder.emit('error', er)).pipe(decoder)
        response = new Response(decoder, responseOptions)
        resolve(response)
        return
      }

      // otherwise, use response as-is
      response = new Response(body, responseOptions)
      resolve(response)
    })

    writeToStream(req, request)
  })
}

module.exports = fetch

fetch.isRedirect = code =>
  code === 301 ||
  code === 302 ||
  code === 303 ||
  code === 307 ||
  code === 308

fetch.Headers = Headers
fetch.Request = Request
fetch.Response = Response
fetch.FetchError = FetchError
'use strict'
const Url = require('url')
const Minipass = require('minipass')
const Headers = require('./headers.js')
const { exportNodeCompatibleHeaders } = Headers
const Body = require('./body.js')
const { clone, extractContentType, getTotalBytes } = Body

const version = require('../package.json').version
const defaultUserAgent =
  `minipass-fetch/${version} (+https://github.com/isaacs/minipass-fetch)`

const INTERNALS = Symbol('Request internals')

const { parse: parseUrl, format: formatUrl } = Url

const isRequest = input =>
  typeof input === 'object' && typeof input[INTERNALS] === 'object'

const isAbortSignal = signal => {
  const proto = (
    signal
    && typeof signal === 'object'
    && Object.getPrototypeOf(signal)
  )
  return !!(proto && proto.constructor.name === 'AbortSignal')
}

class Request extends Body {
  constructor (input, init = {}) {
    const parsedURL = isRequest(input) ? Url.parse(input.url)
      : input && input.href ? Url.parse(input.href)
      : Url.parse(`${input}`)

    if (isRequest(input))
      init = { ...input[INTERNALS], ...init }
    else if (!input || typeof input === 'string')
      input = {}

    const method = (init.method || input.method || 'GET').toUpperCase()
    const isGETHEAD = method === 'GET' || method === 'HEAD'

    if ((init.body !== null && init.body !== undefined ||
        isRequest(input) && input.body !== null) && isGETHEAD)
      throw new TypeError('Request with GET/HEAD method cannot have body')

    const inputBody = init.body !== null && init.body !== undefined ? init.body
      : isRequest(input) && input.body !== null ? clone(input)
      : null

    super(inputBody, {
      timeout: init.timeout || input.timeout || 0,
      size: init.size || input.size || 0,
    })

    const headers = new Headers(init.headers || input.headers || {})

    if (inputBody !== null && inputBody !== undefined &&
        !headers.has('Content-Type')) {
      const contentType = extractContentType(inputBody)
      if (contentType)
        headers.append('Content-Type', contentType)
    }

    const signal = 'signal' in init ? init.signal
      : null

    if (signal !== null && signal !== undefined && !isAbortSignal(signal))
      throw new TypeError('Expected signal must be an instanceof AbortSignal')

    // TLS specific options that are handled by node
    const {
      ca,
      cert,
      ciphers,
      clientCertEngine,
      crl,
      dhparam,
      ecdhCurve,
      family,
      honorCipherOrder,
      key,
      passphrase,
      pfx,
      rejectUnauthorized = process.env.NODE_TLS_REJECT_UNAUTHORIZED !== '0',
      secureOptions,
      secureProtocol,
      servername,
      sessionIdContext,
    } = init

    this[INTERNALS] = {
      method,
      redirect: init.redirect || input.redirect || 'follow',
      headers,
      parsedURL,
      signal,
      ca,
      cert,
      ciphers,
      clientCertEngine,
      crl,
      dhparam,
      ecdhCurve,
      family,
      honorCipherOrder,
      key,
      passphrase,
      pfx,
      rejectUnauthorized,
      secureOptions,
      secureProtocol,
      servername,
      sessionIdContext,
    }

    // node-fetch-only options
    this.follow = init.follow !== undefined ? init.follow
      : input.follow !== undefined ? input.follow
      : 20
    this.compress = init.compress !== undefined ? init.compress
      : input.compress !== undefined ? input.compress
      : true
    this.counter = init.counter || input.counter || 0
    this.agent = init.agent || input.agent
  }

  get method() {
    return this[INTERNALS].method
  }

  get url() {
    return formatUrl(this[INTERNALS].parsedURL)
  }

  get headers() {
    return this[INTERNALS].headers
  }

  get redirect() {
    return this[INTERNALS].redirect
  }

  get signal() {
    return this[INTERNALS].signal
  }

  clone () {
    return new Request(this)
  }

  get [Symbol.toStringTag] () {
    return 'Request'
  }

  static getNodeRequestOptions (request) {
    const parsedURL = request[INTERNALS].parsedURL
    const headers = new Headers(request[INTERNALS].headers)

    // fetch step 1.3
    if (!headers.has('Accept'))
      headers.set('Accept', '*/*')

    // Basic fetch
    if (!parsedURL.protocol || !parsedURL.hostname)
      throw new TypeError('Only absolute URLs are supported')

    if (!/^https?:$/.test(parsedURL.protocol))
      throw new TypeError('Only HTTP(S) protocols are supported')

    if (request.signal &&
        Minipass.isStream(request.body) &&
        typeof request.body.destroy !== 'function') {
      throw new Error(
        'Cancellation of streamed requests with AbortSignal is not supported')
    }

    // HTTP-network-or-cache fetch steps 2.4-2.7
    const contentLengthValue =
      (request.body === null || request.body === undefined) &&
        /^(POST|PUT)$/i.test(request.method) ? '0'
      : request.body !== null && request.body !== undefined
        ? getTotalBytes(request)
      : null

    if (contentLengthValue)
      headers.set('Content-Length', contentLengthValue + '')

    // HTTP-network-or-cache fetch step 2.11
    if (!headers.has('User-Agent'))
      headers.set('User-Agent', defaultUserAgent)

    // HTTP-network-or-cache fetch step 2.15
    if (request.compress && !headers.has('Accept-Encoding'))
      headers.set('Accept-Encoding', 'gzip,deflate')

    const agent = typeof request.agent === 'function'
      ? request.agent(parsedURL)
      : request.agent

    if (!headers.has('Connection') && !agent)
      headers.set('Connection', 'close')

    // TLS specific options that are handled by node
    const {
      ca,
      cert,
      ciphers,
      clientCertEngine,
      crl,
      dhparam,
      ecdhCurve,
      family,
      honorCipherOrder,
      key,
      passphrase,
      pfx,
      rejectUnauthorized,
      secureOptions,
      secureProtocol,
      servername,
      sessionIdContext,
    } = request[INTERNALS]

    // HTTP-network fetch step 4.2
    // chunked encoding is handled by Node.js

    return {
      ...parsedURL,
      method: request.method,
      headers: exportNodeCompatibleHeaders(headers),
      agent,
      ca,
      cert,
      ciphers,
      clientCertEngine,
      crl,
      dhparam,
      ecdhCurve,
      family,
      honorCipherOrder,
      key,
      passphrase,
      pfx,
      rejectUnauthorized,
      secureOptions,
      secureProtocol,
      servername,
      sessionIdContext,
    }
  }
}

module.exports = Request

Object.defineProperties(Request.prototype, {
  method: { enumerable: true },
  url: { enumerable: true },
  headers: { enumerable: true },
  redirect: { enumerable: true },
  clone: { enumerable: true },
  signal: { enumerable: true },
})
'use strict'
const http = require('http')
const { STATUS_CODES } = http

const Headers = require('./headers.js')
const Body = require('./body.js')
const { clone, extractContentType } = Body

const INTERNALS = Symbol('Response internals')

class Response extends Body {
  constructor (body = null, opts = {}) {
    super(body, opts)

    const status = opts.status || 200
    const headers = new Headers(opts.headers)

    if (body !== null && body !== undefined && !headers.has('Content-Type')) {
      const contentType = extractContentType(body)
      if (contentType)
        headers.append('Content-Type', contentType)
    }

    this[INTERNALS] = {
      url: opts.url,
      status,
      statusText: opts.statusText || STATUS_CODES[status],
      headers,
      counter: opts.counter,
      trailer: Promise.resolve(opts.trailer || new Headers()),
    }
  }

  get trailer () {
    return this[INTERNALS].trailer
  }

  get url () {
    return this[INTERNALS].url || ''
  }

  get status () {
    return this[INTERNALS].status
  }

  get ok ()  {
    return this[INTERNALS].status >= 200 && this[INTERNALS].status < 300
  }

  get redirected () {
    return this[INTERNALS].counter > 0
  }

  get statusText () {
    return this[INTERNALS].statusText
  }

  get headers () {
    return this[INTERNALS].headers
  }

  clone () {
    return new Response(clone(this), {
      url: this.url,
      status: this.status,
      statusText: this.statusText,
      headers: this.headers,
      ok: this.ok,
      redirected: this.redirected,
      trailer: this.trailer,
    })
  }

  get [Symbol.toStringTag] () {
    return 'Response'
  }
}

module.exports = Response

Object.defineProperties(Response.prototype, {
  url: { enumerable: true },
  status: { enumerable: true },
  ok: { enumerable: true },
  redirected: { enumerable: true },
  statusText: { enumerable: true },
  headers: { enumerable: true },
  clone: { enumerable: true },
})
Copyright James Halliday (mail@substack.net) and Isaac Z. Schlueter (i@izs.me)

This project is free software released under the MIT license:

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.
const optsArg = require('./lib/opts-arg.js')
const pathArg = require('./lib/path-arg.js')

const {mkdirpNative, mkdirpNativeSync} = require('./lib/mkdirp-native.js')
const {mkdirpManual, mkdirpManualSync} = require('./lib/mkdirp-manual.js')
const {useNative, useNativeSync} = require('./lib/use-native.js')


const mkdirp = (path, opts) => {
  path = pathArg(path)
  opts = optsArg(opts)
  return useNative(opts)
    ? mkdirpNative(path, opts)
    : mkdirpManual(path, opts)
}

const mkdirpSync = (path, opts) => {
  path = pathArg(path)
  opts = optsArg(opts)
  return useNativeSync(opts)
    ? mkdirpNativeSync(path, opts)
    : mkdirpManualSync(path, opts)
}

mkdirp.sync = mkdirpSync
mkdirp.native = (path, opts) => mkdirpNative(pathArg(path), optsArg(opts))
mkdirp.manual = (path, opts) => mkdirpManual(pathArg(path), optsArg(opts))
mkdirp.nativeSync = (path, opts) => mkdirpNativeSync(pathArg(path), optsArg(opts))
mkdirp.manualSync = (path, opts) => mkdirpManualSync(pathArg(path), optsArg(opts))

module.exports = mkdirp
{
  "name": "mkdirp",
  "description": "Recursively mkdir, like `mkdir -p`",
  "version": "1.0.4",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "https://github.com/isaacs/node-mkdirp.git"
  },
  "tap": {
    "check-coverage": true,
    "coverage-map": "map.js"
  },
  "devDependencies": {
    "require-inject": "^1.4.4",
    "tap": "^14.10.7"
  },
  "bin": "bin/cmd.js",
  "license": "MIT",
  "engines": {
    "node": ">=10"
  },
  "files": [
    "bin",
    "lib",
    "index.js"
  ]
}const {dirname} = require('path')

const findMade = (opts, parent, path = undefined) => {
  // we never want the 'made' return value to be a root directory
  if (path === parent)
    return Promise.resolve()

  return opts.statAsync(parent).then(
    st => st.isDirectory() ? path : undefined, // will fail later
    er => er.code === 'ENOENT'
      ? findMade(opts, dirname(parent), parent)
      : undefined
  )
}

const findMadeSync = (opts, parent, path = undefined) => {
  if (path === parent)
    return undefined

  try {
    return opts.statSync(parent).isDirectory() ? path : undefined
  } catch (er) {
    return er.code === 'ENOENT'
      ? findMadeSync(opts, dirname(parent), parent)
      : undefined
  }
}

module.exports = {findMade, findMadeSync}
const {dirname} = require('path')

const mkdirpManual = (path, opts, made) => {
  opts.recursive = false
  const parent = dirname(path)
  if (parent === path) {
    return opts.mkdirAsync(path, opts).catch(er => {
      // swallowed by recursive implementation on posix systems
      // any other error is a failure
      if (er.code !== 'EISDIR')
        throw er
    })
  }

  return opts.mkdirAsync(path, opts).then(() => made || path, er => {
    if (er.code === 'ENOENT')
      return mkdirpManual(parent, opts)
        .then(made => mkdirpManual(path, opts, made))
    if (er.code !== 'EEXIST' && er.code !== 'EROFS')
      throw er
    return opts.statAsync(path).then(st => {
      if (st.isDirectory())
        return made
      else
        throw er
    }, () => { throw er })
  })
}

const mkdirpManualSync = (path, opts, made) => {
  const parent = dirname(path)
  opts.recursive = false

  if (parent === path) {
    try {
      return opts.mkdirSync(path, opts)
    } catch (er) {
      // swallowed by recursive implementation on posix systems
      // any other error is a failure
      if (er.code !== 'EISDIR')
        throw er
      else
        return
    }
  }

  try {
    opts.mkdirSync(path, opts)
    return made || path
  } catch (er) {
    if (er.code === 'ENOENT')
      return mkdirpManualSync(path, opts, mkdirpManualSync(parent, opts, made))
    if (er.code !== 'EEXIST' && er.code !== 'EROFS')
      throw er
    try {
      if (!opts.statSync(path).isDirectory())
        throw er
    } catch (_) {
      throw er
    }
  }
}

module.exports = {mkdirpManual, mkdirpManualSync}
const {dirname} = require('path')
const {findMade, findMadeSync} = require('./find-made.js')
const {mkdirpManual, mkdirpManualSync} = require('./mkdirp-manual.js')

const mkdirpNative = (path, opts) => {
  opts.recursive = true
  const parent = dirname(path)
  if (parent === path)
    return opts.mkdirAsync(path, opts)

  return findMade(opts, path).then(made =>
    opts.mkdirAsync(path, opts).then(() => made)
    .catch(er => {
      if (er.code === 'ENOENT')
        return mkdirpManual(path, opts)
      else
        throw er
    }))
}

const mkdirpNativeSync = (path, opts) => {
  opts.recursive = true
  const parent = dirname(path)
  if (parent === path)
    return opts.mkdirSync(path, opts)

  const made = findMadeSync(opts, path)
  try {
    opts.mkdirSync(path, opts)
    return made
  } catch (er) {
    if (er.code === 'ENOENT')
      return mkdirpManualSync(path, opts)
    else
      throw er
  }
}

module.exports = {mkdirpNative, mkdirpNativeSync}
const { promisify } = require('util')
const fs = require('fs')
const optsArg = opts => {
  if (!opts)
    opts = { mode: 0o777, fs }
  else if (typeof opts === 'object')
    opts = { mode: 0o777, fs, ...opts }
  else if (typeof opts === 'number')
    opts = { mode: opts, fs }
  else if (typeof opts === 'string')
    opts = { mode: parseInt(opts, 8), fs }
  else
    throw new TypeError('invalid options argument')

  opts.mkdir = opts.mkdir || opts.fs.mkdir || fs.mkdir
  opts.mkdirAsync = promisify(opts.mkdir)
  opts.stat = opts.stat || opts.fs.stat || fs.stat
  opts.statAsync = promisify(opts.stat)
  opts.statSync = opts.statSync || opts.fs.statSync || fs.statSync
  opts.mkdirSync = opts.mkdirSync || opts.fs.mkdirSync || fs.mkdirSync
  return opts
}
module.exports = optsArg
const platform = process.env.__TESTING_MKDIRP_PLATFORM__ || process.platform
const { resolve, parse } = require('path')
const pathArg = path => {
  if (/\0/.test(path)) {
    // simulate same failure that node raises
    throw Object.assign(
      new TypeError('path must be a string without null bytes'),
      {
        path,
        code: 'ERR_INVALID_ARG_VALUE',
      }
    )
  }

  path = resolve(path)
  if (platform === 'win32') {
    const badWinChars = /[*|"<>?:]/
    const {root} = parse(path)
    if (badWinChars.test(path.substr(root.length))) {
      throw Object.assign(new Error('Illegal characters in path.'), {
        path,
        code: 'EINVAL',
      })
    }
  }

  return path
}
module.exports = pathArg
const fs = require('fs')

const version = process.env.__TESTING_MKDIRP_NODE_VERSION__ || process.version
const versArr = version.replace(/^v/, '').split('.')
const hasNative = +versArr[0] > 10 || +versArr[0] === 10 && +versArr[1] >= 12

const useNative = !hasNative ? () => false : opts => opts.mkdir === fs.mkdir
const useNativeSync = !hasNative ? () => false : opts => opts.mkdirSync === fs.mkdirSync

module.exports = {useNative, useNativeSync}
#!/usr/bin/env node

const usage = () => `
usage: mkdirp [DIR1,DIR2..] {OPTIONS}

  Create each supplied directory including any necessary parent directories
  that don't yet exist.

  If the directory already exists, do nothing.

OPTIONS are:

  -m<mode>       If a directory needs to be created, set the mode as an octal
  --mode=<mode>  permission string.

  -v --version   Print the mkdirp version number

  -h --help      Print this helpful banner

  -p --print     Print the first directories created for each path provided

  --manual       Use manual implementation, even if native is available
`

const dirs = []
const opts = {}
let print = false
let dashdash = false
let manual = false
for (const arg of process.argv.slice(2)) {
  if (dashdash)
    dirs.push(arg)
  else if (arg === '--')
    dashdash = true
  else if (arg === '--manual')
    manual = true
  else if (/^-h/.test(arg) || /^--help/.test(arg)) {
    console.log(usage())
    process.exit(0)
  } else if (arg === '-v' || arg === '--version') {
    console.log(require('../package.json').version)
    process.exit(0)
  } else if (arg === '-p' || arg === '--print') {
    print = true
  } else if (/^-m/.test(arg) || /^--mode=/.test(arg)) {
    const mode = parseInt(arg.replace(/^(-m|--mode=)/, ''), 8)
    if (isNaN(mode)) {
      console.error(`invalid mode argument: ${arg}\nMust be an octal number.`)
      process.exit(1)
    }
    opts.mode = mode
  } else
    dirs.push(arg)
}

const mkdirp = require('../')
const impl = manual ? mkdirp.manual : mkdirp
if (dirs.length === 0)
  console.error(usage())

Promise.all(dirs.map(dir => impl(dir, opts)))
  .then(made => print ? made.forEach(m => m && console.log(m)) : null)
  .catch(er => {
    console.error(er.message)
    if (er.code)
      console.error('  code: ' + er.code)
    process.exit(1)
  })
# Contributing to node-gyp

## Code of Conduct

Please read the
[Code of Conduct](https://github.com/nodejs/admin/blob/master/CODE_OF_CONDUCT.md)
which explains the minimum behavior expectations for node-gyp contributors.

<a id="developers-certificate-of-origin"></a>
## Developer's Certificate of Origin 1.1

By making a contribution to this project, I certify that:

* (a) The contribution was created in whole or in part by me and I
  have the right to submit it under the open source license
  indicated in the file; or

* (b) The contribution is based upon previous work that, to the best
  of my knowledge, is covered under an appropriate open source
  license and I have the right under that license to submit that
  work with modifications, whether created in whole or in part
  by me, under the same open source license (unless I am
  permitted to submit under a different license), as indicated
  in the file; or

* (c) The contribution was provided directly to me by some other
  person who certified (a), (b) or (c) and I have not modified
  it.

* (d) I understand and agree that this project and the contribution
  are public and that a record of the contribution (including all
  personal information I submit with it, including my sign-off) is
  maintained indefinitely and may be redistributed consistent with
  this project or the open source license(s) involved.
(The MIT License)

Copyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net>

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.
{
  'variables' : {
    'node_engine_include_dir%': 'deps/v8/include',
    'node_host_binary%': 'node',
    'node_with_ltcg%': 'true',
  },
  'target_defaults': {
    'type': 'loadable_module',
    'win_delay_load_hook': 'true',
    'product_prefix': '',

    'conditions': [
      [ 'node_engine=="chakracore"', {
        'variables': {
          'node_engine_include_dir%': 'deps/chakrashim/include'
        },
      }]
    ],

    'include_dirs': [
      '<(node_root_dir)/include/node',
      '<(node_root_dir)/src',
      '<(node_root_dir)/deps/openssl/config',
      '<(node_root_dir)/deps/openssl/openssl/include',
      '<(node_root_dir)/deps/uv/include',
      '<(node_root_dir)/deps/zlib',
      '<(node_root_dir)/<(node_engine_include_dir)'
    ],
    'defines!': [
      'BUILDING_UV_SHARED=1',  # Inherited from common.gypi.
      'BUILDING_V8_SHARED=1',  # Inherited from common.gypi.
    ],
    'defines': [
      'NODE_GYP_MODULE_NAME=>(_target_name)',
      'USING_UV_SHARED=1',
      'USING_V8_SHARED=1',
      # Warn when using deprecated V8 APIs.
      'V8_DEPRECATION_WARNINGS=1'
    ],

    'target_conditions': [
      ['_type=="loadable_module"', {
        'product_extension': 'node',
        'defines': [
          'BUILDING_NODE_EXTENSION'
        ],
        'xcode_settings': {
          'OTHER_LDFLAGS': [
            '-undefined dynamic_lookup'
          ],
        },
      }],

      ['_type=="static_library"', {
        # set to `1` to *disable* the -T thin archive 'ld' flag.
        # older linkers don't support this flag.
        'standalone_static_library': '<(standalone_static_library)'
      }],

      ['_type!="executable"', {
        'conditions': [
          [ 'OS=="android"', {
            'cflags!': [ '-fPIE' ],
          }]
        ]
      }],

      ['_win_delay_load_hook=="true"', {
        # If the addon specifies `'win_delay_load_hook': 'true'` in its
        # binding.gyp, link a delay-load hook into the DLL. This hook ensures
        # that the addon will work regardless of whether the node/iojs binary
        # is named node.exe, iojs.exe, or something else.
        'conditions': [
          [ 'OS=="win"', {
            'defines': [ 'HOST_BINARY=\"<(node_host_binary)<(EXECUTABLE_SUFFIX)\"', ],
            'sources': [
              '<(node_gyp_dir)/src/win_delay_load_hook.cc',
            ],
            'msvs_settings': {
              'VCLinkerTool': {
                'DelayLoadDLLs': [ '<(node_host_binary)<(EXECUTABLE_SUFFIX)' ],
                # Don't print a linker warning when no imports from either .exe
                # are used.
                'AdditionalOptions': [ '/ignore:4199' ],
              },
            },
          }],
        ],
      }],
    ],

    'conditions': [
      [ 'OS=="mac"', {
        'defines': [
          '_DARWIN_USE_64_BIT_INODE=1'
        ],
        'xcode_settings': {
          'DYLIB_INSTALL_NAME_BASE': '@rpath'
        },
      }],
      [ 'OS=="aix"', {
        'ldflags': [
          '-Wl,-bimport:<(node_exp_file)'
        ],
      }],
      [ 'OS=="zos"', {
        'cflags': [
          '-q64',
          '-Wc,DLL',
          '-qlonglong',
          '-qenum=int',
          '-qxclang=-fexec-charset=ISO8859-1'
        ],
        'defines': [
          '_ALL_SOURCE=1',
          'MAP_FAILED=-1',
          '_UNIX03_SOURCE=1'
        ],
        'ldflags': [
          '-q64',
          '<(node_exp_file)'
        ],
      }],
      [ 'OS=="win"', {
        'conditions': [
          ['node_engine=="chakracore"', {
            'library_dirs': [ '<(node_root_dir)/$(ConfigurationName)' ],
            'libraries': [ '<@(node_engine_libs)' ],
          }],
          ['node_with_ltcg=="true"', {
            'msvs_settings': {
              'VCCLCompilerTool': {
                'WholeProgramOptimization': 'true' # /GL, whole program optimization, needed for LTCG
              },
              'VCLibrarianTool': {
                'AdditionalOptions': [
                  '/LTCG:INCREMENTAL', # incremental link-time code generation
                ]
              },
              'VCLinkerTool': {
                'OptimizeReferences': 2, # /OPT:REF
                'EnableCOMDATFolding': 2, # /OPT:ICF
                'LinkIncremental': 1, # disable incremental linking
                'AdditionalOptions': [
                  '/LTCG:INCREMENTAL', # incremental link-time code generation
                ]
              }
            }
          }]
        ],
        'libraries': [
          '-lkernel32.lib',
          '-luser32.lib',
          '-lgdi32.lib',
          '-lwinspool.lib',
          '-lcomdlg32.lib',
          '-ladvapi32.lib',
          '-lshell32.lib',
          '-lole32.lib',
          '-loleaut32.lib',
          '-luuid.lib',
          '-lodbc32.lib',
          '-lDelayImp.lib',
          '-l"<(node_lib_file)"'
        ],
        'msvs_disabled_warnings': [
          # warning C4251: 'node::ObjectWrap::handle_' : class 'v8::Persistent<T>'
          # needs to have dll-interface to be used by
          # clients of class 'node::ObjectWrap'
          4251
        ],
      }, {
        # OS!="win"
        'defines': [
          '_LARGEFILE_SOURCE',
          '_FILE_OFFSET_BITS=64'
        ],
      }],
      [ 'OS in "freebsd openbsd netbsd solaris android" or \
         (OS=="linux" and target_arch!="ia32")', {
        'cflags': [ '-fPIC' ],
      }],
    ]
  }
}
# Installation notes for macOS Catalina (v10.15)

_This document specifically refers to upgrades from previous versions of macOS to Catalina (10.15). It should be removed from the source repository when Catalina ceases to be the latest macOS version or when future Catalina versions no longer raise these issues._

**Both upgrading to macOS Catalina and running a Software Update in Catalina may cause normal `node-gyp` installations to fail. This might manifest as the following error during `npm install`:**

```console
gyp: No Xcode or CLT version detected!
```

## node-gyp v7

The newest release of `node-gyp` should solve this problem. If you are using `node-gyp` directly then you should be able to install v7 and use it as-is.

If you need to use `node-gyp` from within `npm` (e.g. through `npm install`), you will have to install `node-gyp` (either globally with `-g` or to a predictable location) and tell `npm` where the new version is. Either use:

* `npm config set node_gyp <path to node-gyp>`; or
* run `npm` with an environment variable prefix: `npm_config_node_gyp=<path to node-gyp> npm install`

Where "path to node-gyp" is to the `node-gyp` executable which may be a symlink in your global bin directory (e.g. `/usr/local/bin/node-gyp`), or a path to the `node-gyp` installation directory and the `bin/node-gyp.js` file within it (e.g. `/usr/local/lib/node_modules/node-gyp/bin/node-gyp.js`).

**If you use `npm config set` to change your global `node_gyp` you are responsible for keeping it up to date and can't rely on `npm` to give you a newer version when available.** Use `npm config delete node_gyp` to unset this configuration option.

## Fixing Catalina for older versions of `node-gyp`

### Is my Mac running macOS Catalina?
Let's first make sure that your Mac is running Catalina:
```
% sw_vers
    ProductName:	Mac OS X
    ProductVersion:	10.15
    BuildVersion:	19A602
```
If `ProductVersion` is less then `10.15` then this document is not for you. Normal install docs for `node-gyp` on macOS can be found at https://github.com/nodejs/node-gyp#on-macos


### The acid test
To see if `Xcode Command Line Tools` is installed in a way that will work with `node-gyp`, run:
```
curl -sL https://github.com/nodejs/node-gyp/raw/master/macOS_Catalina_acid_test.sh | bash
```

If test succeeded, _you are done_! You should be ready to [install](https://github.com/nodejs/node-gyp#installation) `node-gyp`.

If test failed, there is a problem with your Xcode Command Line Tools installation. [Continue to Solutions](#Solutions).

### Solutions
There are three ways to install the Xcode libraries `node-gyp` needs on macOS. People running Catalina have had success with some but not others in a way that has been unpredictable.

1. With the full Xcode (~7.6 GB download) from the `App Store` app.
2. With the _much_ smaller Xcode Command Line Tools via `xcode-select --install`
3. With the _much_ smaller Xcode Command Line Tools via manual download. **For people running the latest version of Catalina (10.15.2 at the time of this writing), this has worked when the other two solutions haven't.**

### Installing `node-gyp` using the full Xcode
1. `xcodebuild -version` should show `Xcode 11.1` or later.
    * If not, then install/upgrade Xcode from the App Store app.
2. Open the Xcode app and...
    * Under __Preferences > Locations__ select the tools if their location is empty.
    * Allow Xcode app to do an essential install of the most recent compiler tools.
3. Once all installations are _complete_, quit out of Xcode.
4. `sudo xcodebuild -license accept`  # If you agree with the licensing terms.
5. `softwareupdate -l`  # No listing is a good sign.
    * If Xcode or Tools upgrades are listed, use "Software Upgrade" to install them.
6. `xcode-select -version`  # Should return `xcode-select version 2370` or later.
7. `xcode-select -print-path`  # Should return `/Applications/Xcode.app/Contents/Developer`
8. Try the [_acid test_ steps above](#The-acid-test) to see if your Mac is ready.
9. If the _acid test_ does _not_ pass then...
10. `sudo xcode-select --reset`  # Enter root password.  No output is normal.
11. Repeat step 7 above.  Is the path different this time?  Repeat the _acid test_.

### Installing `node-gyp` using the Xcode Command Line Tools via `xcode-select --install`
1. If the _acid test_ has not succeeded, then try `xcode-select --install`
2. If the installation command returns `xcode-select: error: command line tools are already installed, use "Software Update" to install updates`, continue to [remove and reinstall](#i-did-all-that-and-the-acid-test-still-does-not-pass--)
3. Wait until the install process is _complete_.
4. `softwareupdate -l`  # No listing is a good sign.
    * If Xcode or Tools upgrades are listed, use "Software Update" to install them.
5. `xcode-select -version`  # Should return `xcode-select version 2370` or later.
6. `xcode-select -print-path`  # Should return `/Library/Developer/CommandLineTools`
7. Try the [_acid test_ steps above](#The-acid-test) to see if your Mac is ready.
8. If the _acid test_ does _not_ pass then...
9. `sudo xcode-select --reset`  # Enter root password.  No output is normal.
10. Repeat step 5 above.  Is the path different this time?  Repeat the _acid test_.

### Installing `node-gyp` using the Xcode Command Line Tools via manual download
1. Download the appropriate version of the "Command Line Tools for Xcode" for your version of Catalina from <https://developer.apple.com/download/more/>. As of MacOS 10.15.5, that's [Command_Line_Tools_for_Xcode_11.5.dmg](https://download.developer.apple.com/Developer_Tools/Command_Line_Tools_for_Xcode_11.5/Command_Line_Tools_for_Xcode_11.5.dmg)
2. Install the package.
3. Run the [_acid test_ steps above](#The-acid-test).

### I did all that and the acid test still does not pass :-(
1. `sudo rm -rf $(xcode-select -print-path)`  # Enter root password.  No output is normal.
2. `sudo rm -rf /Library/Developer/CommandLineTools`  # Enter root password.
3. `sudo xcode-select --reset`
4. `xcode-select --install`
5. If the [_acid test_ steps above](#The-acid-test) still does _not_ pass then...
6. `npm explore npm -g -- npm install node-gyp@latest`
7. `npm explore npm -g -- npm explore npm-lifecycle -- npm install node-gyp@latest`
8. If the _acid test_ still does _not_ pass then...
9. Add a comment to https://github.com/nodejs/node-gyp/issues/1927 so we can improve.

Lessons learned from:
* https://github.com/nodejs/node-gyp/issues/1779
* https://github.com/nodejs/node-gyp/issues/1861
* https://github.com/nodejs/node-gyp/issues/1927 and elsewhere
* Thanks to @rrrix for discovering Solution 3
#!/bin/bash

pkgs=(
  "com.apple.pkg.DeveloperToolsCLILeo" # standalone
  "com.apple.pkg.DeveloperToolsCLI"    # from XCode
  "com.apple.pkg.CLTools_Executables"  # Mavericks
)

for pkg in "${pkgs[@]}"; do
  output=$(/usr/sbin/pkgutil --pkg-info "$pkg" 2>/dev/null)
  if [ "$output" ]; then
    version=$(echo "$output" | grep 'version' | cut -d' ' -f2)
    break
  fi
done

if [ "$version" ]; then
  echo "Command Line Tools version: $version"
else
  echo >&2 'Command Line Tools not found'
fi
{
  "name": "node-gyp",
  "description": "Node.js native addon build tool",
  "license": "MIT",
  "version": "8.4.1",
  "installVersion": 9,
  "author": "Nathan Rajlich <nathan@tootallnate.net> (http://tootallnate.net)",
  "repository": {
    "type": "git",
    "url": "git://github.com/nodejs/node-gyp.git"
  },
  "preferGlobal": true,
  "bin": "./bin/node-gyp.js",
  "main": "./lib/node-gyp.js",
  "dependencies": {
    "env-paths": "^2.2.0",
    "glob": "^7.1.4",
    "graceful-fs": "^4.2.6",
    "make-fetch-happen": "^9.1.0",
    "nopt": "^5.0.0",
    "npmlog": "^6.0.0",
    "rimraf": "^3.0.2",
    "semver": "^7.3.5",
    "tar": "^6.1.2",
    "which": "^2.0.2"
  },
  "engines": {
    "node": ">= 10.12.0"
  },
  "devDependencies": {
    "bindings": "^1.5.0",
    "nan": "^2.14.2",
    "require-inject": "^1.4.4",
    "standard": "^14.3.4",
    "tap": "^12.7.0"
  }
}#!/usr/bin/env python3

import argparse
import os
import shutil
import subprocess
import tarfile
import tempfile
import urllib.request

BASE_URL = "https://github.com/nodejs/gyp-next/archive/"
CHECKOUT_PATH = os.path.dirname(os.path.realpath(__file__))
CHECKOUT_GYP_PATH = os.path.join(CHECKOUT_PATH, "gyp")

parser = argparse.ArgumentParser()
parser.add_argument("tag", help="gyp tag to update to")
args = parser.parse_args()

tar_url = BASE_URL + args.tag + ".tar.gz"

changed_files = subprocess.check_output(["git", "diff", "--name-only"]).strip()
if changed_files:
    raise Exception("Can't update gyp while you have uncommitted changes in node-gyp")

with tempfile.TemporaryDirectory() as tmp_dir:
    tar_file = os.path.join(tmp_dir, "gyp.tar.gz")
    unzip_target = os.path.join(tmp_dir, "gyp")
    with open(tar_file, "wb") as f:
        print("Downloading gyp-next@" + args.tag + " into temporary directory...")
        print("From: " + tar_url)
        with urllib.request.urlopen(tar_url) as in_file:
            f.write(in_file.read())

        print("Unzipping...")
        with tarfile.open(tar_file, "r:gz") as tar_ref:
            tar_ref.extractall(unzip_target)

        print("Moving to current checkout (" + CHECKOUT_PATH + ")...")
        if os.path.exists(CHECKOUT_GYP_PATH):
            shutil.rmtree(CHECKOUT_GYP_PATH)
        shutil.move(
            os.path.join(unzip_target, os.listdir(unzip_target)[0]), CHECKOUT_GYP_PATH
        )

subprocess.check_output(["git", "add", "gyp"], cwd=CHECKOUT_PATH)
subprocess.check_output(["git", "commit", "-m", "feat(gyp): update gyp to " + args.tag])
// Copyright 2017 - Refael Ackermann
// Distributed under MIT style license
// See accompanying file LICENSE at https://github.com/node4good/windows-autoconf

// Usage:
// powershell -ExecutionPolicy Unrestricted -Command "Add-Type -Path Find-VisualStudio.cs; [VisualStudioConfiguration.Main]::PrintJson()"
// This script needs to be compatible with PowerShell v2 to run on Windows 2008R2 and Windows 7.

using System;
using System.Text;
using System.Runtime.InteropServices;
using System.Collections.Generic;

namespace VisualStudioConfiguration
{
    [Flags]
    public enum InstanceState : uint
    {
        None = 0,
        Local = 1,
        Registered = 2,
        NoRebootRequired = 4,
        NoErrors = 8,
        Complete = 4294967295,
    }

    [Guid("6380BCFF-41D3-4B2E-8B2E-BF8A6810C848")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [ComImport]
    public interface IEnumSetupInstances
    {

        void Next([MarshalAs(UnmanagedType.U4), In] int celt,
            [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.Interface), Out] ISetupInstance[] rgelt,
            [MarshalAs(UnmanagedType.U4)] out int pceltFetched);

        void Skip([MarshalAs(UnmanagedType.U4), In] int celt);

        void Reset();

        [return: MarshalAs(UnmanagedType.Interface)]
        IEnumSetupInstances Clone();
    }

    [Guid("42843719-DB4C-46C2-8E7C-64F1816EFD5B")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [ComImport]
    public interface ISetupConfiguration
    {
    }

    [Guid("26AAB78C-4A60-49D6-AF3B-3C35BC93365D")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [ComImport]
    public interface ISetupConfiguration2 : ISetupConfiguration
    {

        [return: MarshalAs(UnmanagedType.Interface)]
        IEnumSetupInstances EnumInstances();

        [return: MarshalAs(UnmanagedType.Interface)]
        ISetupInstance GetInstanceForCurrentProcess();

        [return: MarshalAs(UnmanagedType.Interface)]
        ISetupInstance GetInstanceForPath([MarshalAs(UnmanagedType.LPWStr), In] string path);

        [return: MarshalAs(UnmanagedType.Interface)]
        IEnumSetupInstances EnumAllInstances();
    }

    [Guid("B41463C3-8866-43B5-BC33-2B0676F7F42E")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [ComImport]
    public interface ISetupInstance
    {
    }

    [Guid("89143C9A-05AF-49B0-B717-72E218A2185C")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [ComImport]
    public interface ISetupInstance2 : ISetupInstance
    {
        [return: MarshalAs(UnmanagedType.BStr)]
        string GetInstanceId();

        [return: MarshalAs(UnmanagedType.Struct)]
        System.Runtime.InteropServices.ComTypes.FILETIME GetInstallDate();

        [return: MarshalAs(UnmanagedType.BStr)]
        string GetInstallationName();

        [return: MarshalAs(UnmanagedType.BStr)]
        string GetInstallationPath();

        [return: MarshalAs(UnmanagedType.BStr)]
        string GetInstallationVersion();

        [return: MarshalAs(UnmanagedType.BStr)]
        string GetDisplayName([MarshalAs(UnmanagedType.U4), In] int lcid);

        [return: MarshalAs(UnmanagedType.BStr)]
        string GetDescription([MarshalAs(UnmanagedType.U4), In] int lcid);

        [return: MarshalAs(UnmanagedType.BStr)]
        string ResolvePath([MarshalAs(UnmanagedType.LPWStr), In] string pwszRelativePath);

        [return: MarshalAs(UnmanagedType.U4)]
        InstanceState GetState();

        [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_UNKNOWN)]
        ISetupPackageReference[] GetPackages();

        ISetupPackageReference GetProduct();

        [return: MarshalAs(UnmanagedType.BStr)]
        string GetProductPath();

        [return: MarshalAs(UnmanagedType.VariantBool)]
        bool IsLaunchable();

        [return: MarshalAs(UnmanagedType.VariantBool)]
        bool IsComplete();

        [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_UNKNOWN)]
        ISetupPropertyStore GetProperties();

        [return: MarshalAs(UnmanagedType.BStr)]
        string GetEnginePath();
    }

    [Guid("DA8D8A16-B2B6-4487-A2F1-594CCCCD6BF5")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [ComImport]
    public interface ISetupPackageReference
    {

        [return: MarshalAs(UnmanagedType.BStr)]
        string GetId();

        [return: MarshalAs(UnmanagedType.BStr)]
        string GetVersion();

        [return: MarshalAs(UnmanagedType.BStr)]
        string GetChip();

        [return: MarshalAs(UnmanagedType.BStr)]
        string GetLanguage();

        [return: MarshalAs(UnmanagedType.BStr)]
        string GetBranch();

        [return: MarshalAs(UnmanagedType.BStr)]
        string GetType();

        [return: MarshalAs(UnmanagedType.BStr)]
        string GetUniqueId();

        [return: MarshalAs(UnmanagedType.VariantBool)]
        bool GetIsExtension();
    }

    [Guid("c601c175-a3be-44bc-91f6-4568d230fc83")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [ComImport]
    public interface ISetupPropertyStore
    {

        [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)]
        string[] GetNames();

        object GetValue([MarshalAs(UnmanagedType.LPWStr), In] string pwszName);
    }

    [Guid("42843719-DB4C-46C2-8E7C-64F1816EFD5B")]
    [CoClass(typeof(SetupConfigurationClass))]
    [ComImport]
    public interface SetupConfiguration : ISetupConfiguration2, ISetupConfiguration
    {
    }

    [Guid("177F0C4A-1CD3-4DE7-A32C-71DBBB9FA36D")]
    [ClassInterface(ClassInterfaceType.None)]
    [ComImport]
    public class SetupConfigurationClass
    {
    }

    public static class Main
    {
        public static void PrintJson()
        {
            ISetupConfiguration query = new SetupConfiguration();
            ISetupConfiguration2 query2 = (ISetupConfiguration2)query;
            IEnumSetupInstances e = query2.EnumAllInstances();

            int pceltFetched;
            ISetupInstance2[] rgelt = new ISetupInstance2[1];
            List<string> instances = new List<string>();
            while (true)
            {
                e.Next(1, rgelt, out pceltFetched);
                if (pceltFetched <= 0)
                {
                    Console.WriteLine(String.Format("[{0}]", string.Join(",", instances.ToArray())));
                    return;
                }

                try
                {
                    instances.Add(InstanceJson(rgelt[0]));
                }
                catch (COMException)
                {
                    // Ignore instances that can't be queried.
                }
            }
        }

        private static string JsonString(string s)
        {
            return "\"" + s.Replace("\\", "\\\\").Replace("\"", "\\\"") + "\"";
        }

        private static string InstanceJson(ISetupInstance2 setupInstance2)
        {
            // Visual Studio component directory:
            // https://docs.microsoft.com/en-us/visualstudio/install/workload-and-component-ids

            StringBuilder json = new StringBuilder();
            json.Append("{");

            string path = JsonString(setupInstance2.GetInstallationPath());
            json.Append(String.Format("\"path\":{0},", path));

            string version = JsonString(setupInstance2.GetInstallationVersion());
            json.Append(String.Format("\"version\":{0},", version));

            List<string> packages = new List<string>();
            foreach (ISetupPackageReference package in setupInstance2.GetPackages())
            {
                string id = JsonString(package.GetId());
                packages.Add(id);
            }
            json.Append(String.Format("\"packages\":[{0}]", string.Join(",", packages.ToArray())));

            json.Append("}");
            return json.ToString();
        }
    }
}
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const glob = require('glob')
const log = require('npmlog')
const which = require('which')
const win = process.platform === 'win32'

function build (gyp, argv, callback) {
  var platformMake = 'make'
  if (process.platform === 'aix') {
    platformMake = 'gmake'
  } else if (process.platform.indexOf('bsd') !== -1) {
    platformMake = 'gmake'
  } else if (win && argv.length > 0) {
    argv = argv.map(function (target) {
      return '/t:' + target
    })
  }

  var makeCommand = gyp.opts.make || process.env.MAKE || platformMake
  var command = win ? 'msbuild' : makeCommand
  var jobs = gyp.opts.jobs || process.env.JOBS
  var buildType
  var config
  var arch
  var nodeDir
  var guessedSolution

  loadConfigGypi()

  /**
   * Load the "config.gypi" file that was generated during "configure".
   */

  function loadConfigGypi () {
    var configPath = path.resolve('build', 'config.gypi')

    fs.readFile(configPath, 'utf8', function (err, data) {
      if (err) {
        if (err.code === 'ENOENT') {
          callback(new Error('You must run `node-gyp configure` first!'))
        } else {
          callback(err)
        }
        return
      }
      config = JSON.parse(data.replace(/#.+\n/, ''))

      // get the 'arch', 'buildType', and 'nodeDir' vars from the config
      buildType = config.target_defaults.default_configuration
      arch = config.variables.target_arch
      nodeDir = config.variables.nodedir

      if ('debug' in gyp.opts) {
        buildType = gyp.opts.debug ? 'Debug' : 'Release'
      }
      if (!buildType) {
        buildType = 'Release'
      }

      log.verbose('build type', buildType)
      log.verbose('architecture', arch)
      log.verbose('node dev dir', nodeDir)

      if (win) {
        findSolutionFile()
      } else {
        doWhich()
      }
    })
  }

  /**
   * On Windows, find the first build/*.sln file.
   */

  function findSolutionFile () {
    glob('build/*.sln', function (err, files) {
      if (err) {
        return callback(err)
      }
      if (files.length === 0) {
        return callback(new Error('Could not find *.sln file. Did you run "configure"?'))
      }
      guessedSolution = files[0]
      log.verbose('found first Solution file', guessedSolution)
      doWhich()
    })
  }

  /**
   * Uses node-which to locate the msbuild / make executable.
   */

  function doWhich () {
    // On Windows use msbuild provided by node-gyp configure
    if (win) {
      if (!config.variables.msbuild_path) {
        return callback(new Error(
          'MSBuild is not set, please run `node-gyp configure`.'))
      }
      command = config.variables.msbuild_path
      log.verbose('using MSBuild:', command)
      doBuild()
      return
    }
    // First make sure we have the build command in the PATH
    which(command, function (err, execPath) {
      if (err) {
        // Some other error or 'make' not found on Unix, report that to the user
        callback(err)
        return
      }
      log.verbose('`which` succeeded for `' + command + '`', execPath)
      doBuild()
    })
  }

  /**
   * Actually spawn the process and compile the module.
   */

  function doBuild () {
    // Enable Verbose build
    var verbose = log.levels[log.level] <= log.levels.verbose
    var j

    if (!win && verbose) {
      argv.push('V=1')
    }

    if (win && !verbose) {
      argv.push('/clp:Verbosity=minimal')
    }

    if (win) {
      // Turn off the Microsoft logo on Windows
      argv.push('/nologo')
    }

    // Specify the build type, Release by default
    if (win) {
      // Convert .gypi config target_arch to MSBuild /Platform
      // Since there are many ways to state '32-bit Intel', default to it.
      // N.B. msbuild's Condition string equality tests are case-insensitive.
      var archLower = arch.toLowerCase()
      var p = archLower === 'x64' ? 'x64'
        : (archLower === 'arm' ? 'ARM'
          : (archLower === 'arm64' ? 'ARM64' : 'Win32'))
      argv.push('/p:Configuration=' + buildType + ';Platform=' + p)
      if (jobs) {
        j = parseInt(jobs, 10)
        if (!isNaN(j) && j > 0) {
          argv.push('/m:' + j)
        } else if (jobs.toUpperCase() === 'MAX') {
          argv.push('/m:' + require('os').cpus().length)
        }
      }
    } else {
      argv.push('BUILDTYPE=' + buildType)
      // Invoke the Makefile in the 'build' dir.
      argv.push('-C')
      argv.push('build')
      if (jobs) {
        j = parseInt(jobs, 10)
        if (!isNaN(j) && j > 0) {
          argv.push('--jobs')
          argv.push(j)
        } else if (jobs.toUpperCase() === 'MAX') {
          argv.push('--jobs')
          argv.push(require('os').cpus().length)
        }
      }
    }

    if (win) {
      // did the user specify their own .sln file?
      var hasSln = argv.some(function (arg) {
        return path.extname(arg) === '.sln'
      })
      if (!hasSln) {
        argv.unshift(gyp.opts.solution || guessedSolution)
      }
    }

    var proc = gyp.spawn(command, argv)
    proc.on('exit', onExit)
  }

  function onExit (code, signal) {
    if (code !== 0) {
      return callback(new Error('`' + command + '` failed with exit code: ' + code))
    }
    if (signal) {
      return callback(new Error('`' + command + '` got signal: ' + signal))
    }
    callback()
  }
}

module.exports = build
module.exports.usage = 'Invokes `' + (win ? 'msbuild' : 'make') + '` and builds the module'
'use strict'

const rm = require('rimraf')
const log = require('npmlog')

function clean (gyp, argv, callback) {
  // Remove the 'build' dir
  var buildDir = 'build'

  log.verbose('clean', 'removing "%s" directory', buildDir)
  rm(buildDir, callback)
}

module.exports = clean
module.exports.usage = 'Removes any generated build files and the "out" dir'
'use strict'

const fs = require('graceful-fs')
const path = require('path')
const log = require('npmlog')
const os = require('os')
const processRelease = require('./process-release')
const win = process.platform === 'win32'
const findNodeDirectory = require('./find-node-directory')
const createConfigGypi = require('./create-config-gypi')
const msgFormat = require('util').format
var findPython = require('./find-python')
if (win) {
  var findVisualStudio = require('./find-visualstudio')
}

function configure (gyp, argv, callback) {
  var python
  var buildDir = path.resolve('build')
  var configNames = ['config.gypi', 'common.gypi']
  var configs = []
  var nodeDir
  var release = processRelease(argv, gyp, process.version, process.release)

  findPython(gyp.opts.python, function (err, found) {
    if (err) {
      callback(err)
    } else {
      python = found
      getNodeDir()
    }
  })

  function getNodeDir () {
    // 'python' should be set by now
    process.env.PYTHON = python

    if (gyp.opts.nodedir) {
      // --nodedir was specified. use that for the dev files
      nodeDir = gyp.opts.nodedir.replace(/^~/, os.homedir())

      log.verbose('get node dir', 'compiling against specified --nodedir dev files: %s', nodeDir)
      createBuildDir()
    } else {
      // if no --nodedir specified, ensure node dependencies are installed
      if ('v' + release.version !== process.version) {
        // if --target was given, then determine a target version to compile for
        log.verbose('get node dir', 'compiling against --target node version: %s', release.version)
      } else {
        // if no --target was specified then use the current host node version
        log.verbose('get node dir', 'no --target version specified, falling back to host node version: %s', release.version)
      }

      if (!release.semver) {
        // could not parse the version string with semver
        return callback(new Error('Invalid version number: ' + release.version))
      }

      // If the tarball option is set, always remove and reinstall the headers
      // into devdir. Otherwise only install if they're not already there.
      gyp.opts.ensure = !gyp.opts.tarball

      gyp.commands.install([release.version], function (err) {
        if (err) {
          return callback(err)
        }
        log.verbose('get node dir', 'target node version installed:', release.versionDir)
        nodeDir = path.resolve(gyp.devDir, release.versionDir)
        createBuildDir()
      })
    }
  }

  function createBuildDir () {
    log.verbose('build dir', 'attempting to create "build" dir: %s', buildDir)
    fs.mkdir(buildDir, { recursive: true }, function (err, isNew) {
      if (err) {
        return callback(err)
      }
      log.verbose(
        'build dir', '"build" dir needed to be created?', isNew ? 'Yes' : 'No'
      )
      if (win) {
        findVisualStudio(release.semver, gyp.opts.msvs_version,
          createConfigFile)
      } else {
        createConfigFile()
      }
    })
  }

  function createConfigFile (err, vsInfo) {
    if (err) {
      return callback(err)
    }
    if (process.platform === 'win32') {
      process.env.GYP_MSVS_VERSION = Math.min(vsInfo.versionYear, 2015)
      process.env.GYP_MSVS_OVERRIDE_PATH = vsInfo.path
    }
    createConfigGypi({ gyp, buildDir, nodeDir, vsInfo }).then(configPath => {
      configs.push(configPath)
      findConfigs()
    }).catch(err => {
      callback(err)
    })
  }

  function findConfigs () {
    var name = configNames.shift()
    if (!name) {
      return runGyp()
    }
    var fullPath = path.resolve(name)

    log.verbose(name, 'checking for gypi file: %s', fullPath)
    fs.stat(fullPath, function (err) {
      if (err) {
        if (err.code === 'ENOENT') {
          findConfigs() // check next gypi filename
        } else {
          callback(err)
        }
      } else {
        log.verbose(name, 'found gypi file')
        configs.push(fullPath)
        findConfigs()
      }
    })
  }

  function runGyp (err) {
    if (err) {
      return callback(err)
    }

    if (!~argv.indexOf('-f') && !~argv.indexOf('--format')) {
      if (win) {
        log.verbose('gyp', 'gyp format was not specified; forcing "msvs"')
        // force the 'make' target for non-Windows
        argv.push('-f', 'msvs')
      } else {
        log.verbose('gyp', 'gyp format was not specified; forcing "make"')
        // force the 'make' target for non-Windows
        argv.push('-f', 'make')
      }
    }

    // include all the ".gypi" files that were found
    configs.forEach(function (config) {
      argv.push('-I', config)
    })

    // For AIX and z/OS we need to set up the path to the exports file
    // which contains the symbols needed for linking.
    var nodeExpFile
    if (process.platform === 'aix' || process.platform === 'os390') {
      var ext = process.platform === 'aix' ? 'exp' : 'x'
      var nodeRootDir = findNodeDirectory()
      var candidates

      if (process.platform === 'aix') {
        candidates = [
          'include/node/node',
          'out/Release/node',
          'out/Debug/node',
          'node'
        ].map(function (file) {
          return file + '.' + ext
        })
      } else {
        candidates = [
          'out/Release/obj.target/libnode',
          'out/Debug/obj.target/libnode',
          'lib/libnode'
        ].map(function (file) {
          return file + '.' + ext
        })
      }

      var logprefix = 'find exports file'
      nodeExpFile = findAccessibleSync(logprefix, nodeRootDir, candidates)
      if (nodeExpFile !== undefined) {
        log.verbose(logprefix, 'Found exports file: %s', nodeExpFile)
      } else {
        var msg = msgFormat('Could not find node.%s file in %s', ext, nodeRootDir)
        log.error(logprefix, 'Could not find exports file')
        return callback(new Error(msg))
      }
    }

    // this logic ported from the old `gyp_addon` python file
    var gypScript = path.resolve(__dirname, '..', 'gyp', 'gyp_main.py')
    var addonGypi = path.resolve(__dirname, '..', 'addon.gypi')
    var commonGypi = path.resolve(nodeDir, 'include/node/common.gypi')
    fs.stat(commonGypi, function (err) {
      if (err) {
        commonGypi = path.resolve(nodeDir, 'common.gypi')
      }

      var outputDir = 'build'
      if (win) {
        // Windows expects an absolute path
        outputDir = buildDir
      }
      var nodeGypDir = path.resolve(__dirname, '..')

      var nodeLibFile = path.join(nodeDir,
        !gyp.opts.nodedir ? '<(target_arch)' : '$(Configuration)',
        release.name + '.lib')

      argv.push('-I', addonGypi)
      argv.push('-I', commonGypi)
      argv.push('-Dlibrary=shared_library')
      argv.push('-Dvisibility=default')
      argv.push('-Dnode_root_dir=' + nodeDir)
      if (process.platform === 'aix' || process.platform === 'os390') {
        argv.push('-Dnode_exp_file=' + nodeExpFile)
      }
      argv.push('-Dnode_gyp_dir=' + nodeGypDir)

      // Do this to keep Cygwin environments happy, else the unescaped '\' gets eaten up,
      // resulting in bad paths, Ex c:parentFolderfolderanotherFolder instead of c:\parentFolder\folder\anotherFolder
      if (win) {
        nodeLibFile = nodeLibFile.replace(/\\/g, '\\\\')
      }
      argv.push('-Dnode_lib_file=' + nodeLibFile)
      argv.push('-Dmodule_root_dir=' + process.cwd())
      argv.push('-Dnode_engine=' +
        (gyp.opts.node_engine || process.jsEngine || 'v8'))
      argv.push('--depth=.')
      argv.push('--no-parallel')

      // tell gyp to write the Makefile/Solution files into output_dir
      argv.push('--generator-output', outputDir)

      // tell make to write its output into the same dir
      argv.push('-Goutput_dir=.')

      // enforce use of the "binding.gyp" file
      argv.unshift('binding.gyp')

      // execute `gyp` from the current target nodedir
      argv.unshift(gypScript)

      // make sure python uses files that came with this particular node package
      var pypath = [path.join(__dirname, '..', 'gyp', 'pylib')]
      if (process.env.PYTHONPATH) {
        pypath.push(process.env.PYTHONPATH)
      }
      process.env.PYTHONPATH = pypath.join(win ? ';' : ':')

      var cp = gyp.spawn(python, argv)
      cp.on('exit', onCpExit)
    })
  }

  function onCpExit (code) {
    if (code !== 0) {
      callback(new Error('`gyp` failed with exit code: ' + code))
    } else {
      // we're done
      callback()
    }
  }
}

/**
 * Returns the first file or directory from an array of candidates that is
 * readable by the current user, or undefined if none of the candidates are
 * readable.
 */
function findAccessibleSync (logprefix, dir, candidates) {
  for (var next = 0; next < candidates.length; next++) {
    var candidate = path.resolve(dir, candidates[next])
    try {
      var fd = fs.openSync(candidate, 'r')
    } catch (e) {
      // this candidate was not found or not readable, do nothing
      log.silly(logprefix, 'Could not open %s: %s', candidate, e.message)
      continue
    }
    fs.closeSync(fd)
    log.silly(logprefix, 'Found readable %s', candidate)
    return candidate
  }

  return undefined
}

module.exports = configure
module.exports.test = {
  findAccessibleSync: findAccessibleSync
}
module.exports.usage = 'Generates ' + (win ? 'MSVC project files' : 'a Makefile') + ' for the current module'
'use strict'

const fs = require('graceful-fs')
const log = require('npmlog')
const path = require('path')

function parseConfigGypi (config) {
  // translated from tools/js2c.py of Node.js
  // 1. string comments
  config = config.replace(/#.*/g, '')
  // 2. join multiline strings
  config = config.replace(/'$\s+'/mg, '')
  // 3. normalize string literals from ' into "
  config = config.replace(/'/g, '"')
  return JSON.parse(config)
}

async function getBaseConfigGypi ({ gyp, nodeDir }) {
  // try reading $nodeDir/include/node/config.gypi first when:
  // 1. --dist-url or --nodedir is specified
  // 2. and --force-process-config is not specified
  const shouldReadConfigGypi = (gyp.opts.nodedir || gyp.opts['dist-url']) && !gyp.opts['force-process-config']
  if (shouldReadConfigGypi && nodeDir) {
    try {
      const baseConfigGypiPath = path.resolve(nodeDir, 'include/node/config.gypi')
      const baseConfigGypi = await fs.promises.readFile(baseConfigGypiPath)
      return parseConfigGypi(baseConfigGypi.toString())
    } catch (err) {
      log.warn('read config.gypi', err.message)
    }
  }

  // fallback to process.config if it is invalid
  return JSON.parse(JSON.stringify(process.config))
}

async function getCurrentConfigGypi ({ gyp, nodeDir, vsInfo }) {
  const config = await getBaseConfigGypi({ gyp, nodeDir })
  if (!config.target_defaults) {
    config.target_defaults = {}
  }
  if (!config.variables) {
    config.variables = {}
  }

  const defaults = config.target_defaults
  const variables = config.variables

  // don't inherit the "defaults" from the base config.gypi.
  // doing so could cause problems in cases where the `node` executable was
  // compiled on a different machine (with different lib/include paths) than
  // the machine where the addon is being built to
  defaults.cflags = []
  defaults.defines = []
  defaults.include_dirs = []
  defaults.libraries = []

  // set the default_configuration prop
  if ('debug' in gyp.opts) {
    defaults.default_configuration = gyp.opts.debug ? 'Debug' : 'Release'
  }

  if (!defaults.default_configuration) {
    defaults.default_configuration = 'Release'
  }

  // set the target_arch variable
  variables.target_arch = gyp.opts.arch || process.arch || 'ia32'
  if (variables.target_arch === 'arm64') {
    defaults.msvs_configuration_platform = 'ARM64'
    defaults.xcode_configuration_platform = 'arm64'
  }

  // set the node development directory
  variables.nodedir = nodeDir

  // disable -T "thin" static archives by default
  variables.standalone_static_library = gyp.opts.thin ? 0 : 1

  if (process.platform === 'win32') {
    defaults.msbuild_toolset = vsInfo.toolset
    if (vsInfo.sdk) {
      defaults.msvs_windows_target_platform_version = vsInfo.sdk
    }
    if (variables.target_arch === 'arm64') {
      if (vsInfo.versionMajor > 15 ||
          (vsInfo.versionMajor === 15 && vsInfo.versionMajor >= 9)) {
        defaults.msvs_enable_marmasm = 1
      } else {
        log.warn('Compiling ARM64 assembly is only available in\n' +
          'Visual Studio 2017 version 15.9 and above')
      }
    }
    variables.msbuild_path = vsInfo.msBuild
  }

  // loop through the rest of the opts and add the unknown ones as variables.
  // this allows for module-specific configure flags like:
  //
  //   $ node-gyp configure --shared-libxml2
  Object.keys(gyp.opts).forEach(function (opt) {
    if (opt === 'argv') {
      return
    }
    if (opt in gyp.configDefs) {
      return
    }
    variables[opt.replace(/-/g, '_')] = gyp.opts[opt]
  })

  return config
}

async function createConfigGypi ({ gyp, buildDir, nodeDir, vsInfo }) {
  const configFilename = 'config.gypi'
  const configPath = path.resolve(buildDir, configFilename)

  log.verbose('build/' + configFilename, 'creating config file')

  const config = await getCurrentConfigGypi({ gyp, nodeDir, vsInfo })

  // ensures that any boolean values in config.gypi get stringified
  function boolsToString (k, v) {
    if (typeof v === 'boolean') {
      return String(v)
    }
    return v
  }

  log.silly('build/' + configFilename, config)

  // now write out the config.gypi file to the build/ dir
  const prefix = '# Do not edit. File was generated by node-gyp\'s "configure" step'

  const json = JSON.stringify(config, boolsToString, 2)
  log.verbose('build/' + configFilename, 'writing out config file: %s', configPath)
  await fs.promises.writeFile(configPath, [prefix, json, ''].join('\n'))

  return configPath
}

module.exports = createConfigGypi
module.exports.test = {
  parseConfigGypi: parseConfigGypi,
  getCurrentConfigGypi: getCurrentConfigGypi
}
'use strict'

const path = require('path')
const log = require('npmlog')

function findNodeDirectory (scriptLocation, processObj) {
  // set dirname and process if not passed in
  // this facilitates regression tests
  if (scriptLocation === undefined) {
    scriptLocation = __dirname
  }
  if (processObj === undefined) {
    processObj = process
  }

  // Have a look to see what is above us, to try and work out where we are
  var npmParentDirectory = path.join(scriptLocation, '../../../..')
  log.verbose('node-gyp root', 'npm_parent_directory is ' +
              path.basename(npmParentDirectory))
  var nodeRootDir = ''

  log.verbose('node-gyp root', 'Finding node root directory')
  if (path.basename(npmParentDirectory) === 'deps') {
    // We are in a build directory where this script lives in
    // deps/npm/node_modules/node-gyp/lib
    nodeRootDir = path.join(npmParentDirectory, '..')
    log.verbose('node-gyp root', 'in build directory, root = ' +
                nodeRootDir)
  } else if (path.basename(npmParentDirectory) === 'node_modules') {
    // We are in a node install directory where this script lives in
    // lib/node_modules/npm/node_modules/node-gyp/lib or
    // node_modules/npm/node_modules/node-gyp/lib depending on the
    // platform
    if (processObj.platform === 'win32') {
      nodeRootDir = path.join(npmParentDirectory, '..')
    } else {
      nodeRootDir = path.join(npmParentDirectory, '../..')
    }
    log.verbose('node-gyp root', 'in install directory, root = ' +
                nodeRootDir)
  } else {
    // We don't know where we are, try working it out from the location
    // of the node binary
    var nodeDir = path.dirname(processObj.execPath)
    var directoryUp = path.basename(nodeDir)
    if (directoryUp === 'bin') {
      nodeRootDir = path.join(nodeDir, '..')
    } else if (directoryUp === 'Release' || directoryUp === 'Debug') {
      // If we are a recently built node, and the directory structure
      // is that of a repository. If we are on Windows then we only need
      // to go one level up, everything else, two
      if (processObj.platform === 'win32') {
        nodeRootDir = path.join(nodeDir, '..')
      } else {
        nodeRootDir = path.join(nodeDir, '../..')
      }
    }
    // Else return the default blank, "".
  }
  return nodeRootDir
}

module.exports = findNodeDirectory
'use strict'

const log = require('npmlog')
const semver = require('semver')
const cp = require('child_process')
const extend = require('util')._extend // eslint-disable-line
const win = process.platform === 'win32'
const logWithPrefix = require('./util').logWithPrefix

const systemDrive = process.env.SystemDrive || 'C:'
const username = process.env.USERNAME || process.env.USER || getOsUserInfo()
const localAppData = process.env.LOCALAPPDATA || `${systemDrive}\\${username}\\AppData\\Local`
const foundLocalAppData = process.env.LOCALAPPDATA || username
const programFiles = process.env.ProgramW6432 || process.env.ProgramFiles || `${systemDrive}\\Program Files`
const programFilesX86 = process.env['ProgramFiles(x86)'] || `${programFiles} (x86)`

const winDefaultLocationsArray = []
for (const majorMinor of ['39', '38', '37', '36']) {
  if (foundLocalAppData) {
    winDefaultLocationsArray.push(
      `${localAppData}\\Programs\\Python\\Python${majorMinor}\\python.exe`,
      `${programFiles}\\Python${majorMinor}\\python.exe`,
      `${localAppData}\\Programs\\Python\\Python${majorMinor}-32\\python.exe`,
      `${programFiles}\\Python${majorMinor}-32\\python.exe`,
      `${programFilesX86}\\Python${majorMinor}-32\\python.exe`
    )
  } else {
    winDefaultLocationsArray.push(
      `${programFiles}\\Python${majorMinor}\\python.exe`,
      `${programFiles}\\Python${majorMinor}-32\\python.exe`,
      `${programFilesX86}\\Python${majorMinor}-32\\python.exe`
    )
  }
}

function getOsUserInfo () {
  try {
    return require('os').userInfo().username
  } catch (e) {}
}

function PythonFinder (configPython, callback) {
  this.callback = callback
  this.configPython = configPython
  this.errorLog = []
}

PythonFinder.prototype = {
  log: logWithPrefix(log, 'find Python'),
  argsExecutable: ['-c', 'import sys; print(sys.executable);'],
  argsVersion: ['-c', 'import sys; print("%s.%s.%s" % sys.version_info[:3]);'],
  semverRange: '>=3.6.0',

  // These can be overridden for testing:
  execFile: cp.execFile,
  env: process.env,
  win: win,
  pyLauncher: 'py.exe',
  winDefaultLocations: winDefaultLocationsArray,

  // Logs a message at verbose level, but also saves it to be displayed later
  // at error level if an error occurs. This should help diagnose the problem.
  addLog: function addLog (message) {
    this.log.verbose(message)
    this.errorLog.push(message)
  },

  // Find Python by trying a sequence of possibilities.
  // Ignore errors, keep trying until Python is found.
  findPython: function findPython () {
    const SKIP = 0; const FAIL = 1
    var toCheck = getChecks.apply(this)

    function getChecks () {
      if (this.env.NODE_GYP_FORCE_PYTHON) {
        return [{
          before: () => {
            this.addLog(
              'checking Python explicitly set from NODE_GYP_FORCE_PYTHON')
            this.addLog('- process.env.NODE_GYP_FORCE_PYTHON is ' +
              `"${this.env.NODE_GYP_FORCE_PYTHON}"`)
          },
          check: this.checkCommand,
          arg: this.env.NODE_GYP_FORCE_PYTHON
        }]
      }

      var checks = [
        {
          before: () => {
            if (!this.configPython) {
              this.addLog(
                'Python is not set from command line or npm configuration')
              return SKIP
            }
            this.addLog('checking Python explicitly set from command line or ' +
              'npm configuration')
            this.addLog('- "--python=" or "npm config get python" is ' +
              `"${this.configPython}"`)
          },
          check: this.checkCommand,
          arg: this.configPython
        },
        {
          before: () => {
            if (!this.env.PYTHON) {
              this.addLog('Python is not set from environment variable ' +
                'PYTHON')
              return SKIP
            }
            this.addLog('checking Python explicitly set from environment ' +
              'variable PYTHON')
            this.addLog(`- process.env.PYTHON is "${this.env.PYTHON}"`)
          },
          check: this.checkCommand,
          arg: this.env.PYTHON
        },
        {
          before: () => { this.addLog('checking if "python3" can be used') },
          check: this.checkCommand,
          arg: 'python3'
        },
        {
          before: () => { this.addLog('checking if "python" can be used') },
          check: this.checkCommand,
          arg: 'python'
        }
      ]

      if (this.win) {
        for (var i = 0; i < this.winDefaultLocations.length; ++i) {
          const location = this.winDefaultLocations[i]
          checks.push({
            before: () => {
              this.addLog('checking if Python is ' +
                `${location}`)
            },
            check: this.checkExecPath,
            arg: location
          })
        }
        checks.push({
          before: () => {
            this.addLog(
              'checking if the py launcher can be used to find Python 3')
          },
          check: this.checkPyLauncher
        })
      }

      return checks
    }

    function runChecks (err) {
      this.log.silly('runChecks: err = %j', (err && err.stack) || err)

      const check = toCheck.shift()
      if (!check) {
        return this.fail()
      }

      const before = check.before.apply(this)
      if (before === SKIP) {
        return runChecks.apply(this)
      }
      if (before === FAIL) {
        return this.fail()
      }

      const args = [runChecks.bind(this)]
      if (check.arg) {
        args.unshift(check.arg)
      }
      check.check.apply(this, args)
    }

    runChecks.apply(this)
  },

  // Check if command is a valid Python to use.
  // Will exit the Python finder on success.
  // If on Windows, run in a CMD shell to support BAT/CMD launchers.
  checkCommand: function checkCommand (command, errorCallback) {
    var exec = command
    var args = this.argsExecutable
    var shell = false
    if (this.win) {
      // Arguments have to be manually quoted
      exec = `"${exec}"`
      args = args.map(a => `"${a}"`)
      shell = true
    }

    this.log.verbose(`- executing "${command}" to get executable path`)
    this.run(exec, args, shell, function (err, execPath) {
      // Possible outcomes:
      // - Error: not in PATH, not executable or execution fails
      // - Gibberish: the next command to check version will fail
      // - Absolute path to executable
      if (err) {
        this.addLog(`- "${command}" is not in PATH or produced an error`)
        return errorCallback(err)
      }
      this.addLog(`- executable path is "${execPath}"`)
      this.checkExecPath(execPath, errorCallback)
    }.bind(this))
  },

  // Check if the py launcher can find a valid Python to use.
  // Will exit the Python finder on success.
  // Distributions of Python on Windows by default install with the "py.exe"
  // Python launcher which is more likely to exist than the Python executable
  // being in the $PATH.
  // Because the Python launcher supports Python 2 and Python 3, we should
  // explicitly request a Python 3 version. This is done by supplying "-3" as
  // the first command line argument. Since "py.exe -3" would be an invalid
  // executable for "execFile", we have to use the launcher to figure out
  // where the actual "python.exe" executable is located.
  checkPyLauncher: function checkPyLauncher (errorCallback) {
    this.log.verbose(
      `- executing "${this.pyLauncher}" to get Python 3 executable path`)
    this.run(this.pyLauncher, ['-3', ...this.argsExecutable], false,
      function (err, execPath) {
      // Possible outcomes: same as checkCommand
        if (err) {
          this.addLog(
            `- "${this.pyLauncher}" is not in PATH or produced an error`)
          return errorCallback(err)
        }
        this.addLog(`- executable path is "${execPath}"`)
        this.checkExecPath(execPath, errorCallback)
      }.bind(this))
  },

  // Check if a Python executable is the correct version to use.
  // Will exit the Python finder on success.
  checkExecPath: function checkExecPath (execPath, errorCallback) {
    this.log.verbose(`- executing "${execPath}" to get version`)
    this.run(execPath, this.argsVersion, false, function (err, version) {
      // Possible outcomes:
      // - Error: executable can not be run (likely meaning the command wasn't
      //   a Python executable and the previous command produced gibberish)
      // - Gibberish: somehow the last command produced an executable path,
      //   this will fail when verifying the version
      // - Version of the Python executable
      if (err) {
        this.addLog(`- "${execPath}" could not be run`)
        return errorCallback(err)
      }
      this.addLog(`- version is "${version}"`)

      const range = new semver.Range(this.semverRange)
      var valid = false
      try {
        valid = range.test(version)
      } catch (err) {
        this.log.silly('range.test() threw:\n%s', err.stack)
        this.addLog(`- "${execPath}" does not have a valid version`)
        this.addLog('- is it a Python executable?')
        return errorCallback(err)
      }

      if (!valid) {
        this.addLog(`- version is ${version} - should be ${this.semverRange}`)
        this.addLog('- THIS VERSION OF PYTHON IS NOT SUPPORTED')
        return errorCallback(new Error(
          `Found unsupported Python version ${version}`))
      }
      this.succeed(execPath, version)
    }.bind(this))
  },

  // Run an executable or shell command, trimming the output.
  run: function run (exec, args, shell, callback) {
    var env = extend({}, this.env)
    env.TERM = 'dumb'
    const opts = { env: env, shell: shell }

    this.log.silly('execFile: exec = %j', exec)
    this.log.silly('execFile: args = %j', args)
    this.log.silly('execFile: opts = %j', opts)
    try {
      this.execFile(exec, args, opts, execFileCallback.bind(this))
    } catch (err) {
      this.log.silly('execFile: threw:\n%s', err.stack)
      return callback(err)
    }

    function execFileCallback (err, stdout, stderr) {
      this.log.silly('execFile result: err = %j', (err && err.stack) || err)
      this.log.silly('execFile result: stdout = %j', stdout)
      this.log.silly('execFile result: stderr = %j', stderr)
      if (err) {
        return callback(err)
      }
      const execPath = stdout.trim()
      callback(null, execPath)
    }
  },

  succeed: function succeed (execPath, version) {
    this.log.info(`using Python version ${version} found at "${execPath}"`)
    process.nextTick(this.callback.bind(null, null, execPath))
  },

  fail: function fail () {
    const errorLog = this.errorLog.join('\n')

    const pathExample = this.win ? 'C:\\Path\\To\\python.exe'
      : '/path/to/pythonexecutable'
    // For Windows 80 col console, use up to the column before the one marked
    // with X (total 79 chars including logger prefix, 58 chars usable here):
    //                                                           X
    const info = [
      '**********************************************************',
      'You need to install the latest version of Python.',
      'Node-gyp should be able to find and use Python. If not,',
      'you can try one of the following options:',
      `- Use the switch --python="${pathExample}"`,
      '  (accepted by both node-gyp and npm)',
      '- Set the environment variable PYTHON',
      '- Set the npm configuration variable python:',
      `  npm config set python "${pathExample}"`,
      'For more information consult the documentation at:',
      'https://github.com/nodejs/node-gyp#installation',
      '**********************************************************'
    ].join('\n')

    this.log.error(`\n${errorLog}\n\n${info}\n`)
    process.nextTick(this.callback.bind(null, new Error(
      'Could not find any Python installation to use')))
  }
}

function findPython (configPython, callback) {
  var finder = new PythonFinder(configPython, callback)
  finder.findPython()
}

module.exports = findPython
module.exports.test = {
  PythonFinder: PythonFinder,
  findPython: findPython
}
'use strict'

const log = require('npmlog')
const execFile = require('child_process').execFile
const fs = require('fs')
const path = require('path').win32
const logWithPrefix = require('./util').logWithPrefix
const regSearchKeys = require('./util').regSearchKeys

function findVisualStudio (nodeSemver, configMsvsVersion, callback) {
  const finder = new VisualStudioFinder(nodeSemver, configMsvsVersion,
    callback)
  finder.findVisualStudio()
}

function VisualStudioFinder (nodeSemver, configMsvsVersion, callback) {
  this.nodeSemver = nodeSemver
  this.configMsvsVersion = configMsvsVersion
  this.callback = callback
  this.errorLog = []
  this.validVersions = []
}

VisualStudioFinder.prototype = {
  log: logWithPrefix(log, 'find VS'),

  regSearchKeys: regSearchKeys,

  // Logs a message at verbose level, but also saves it to be displayed later
  // at error level if an error occurs. This should help diagnose the problem.
  addLog: function addLog (message) {
    this.log.verbose(message)
    this.errorLog.push(message)
  },

  findVisualStudio: function findVisualStudio () {
    this.configVersionYear = null
    this.configPath = null
    if (this.configMsvsVersion) {
      this.addLog('msvs_version was set from command line or npm config')
      if (this.configMsvsVersion.match(/^\d{4}$/)) {
        this.configVersionYear = parseInt(this.configMsvsVersion, 10)
        this.addLog(
          `- looking for Visual Studio version ${this.configVersionYear}`)
      } else {
        this.configPath = path.resolve(this.configMsvsVersion)
        this.addLog(
          `- looking for Visual Studio installed in "${this.configPath}"`)
      }
    } else {
      this.addLog('msvs_version not set from command line or npm config')
    }

    if (process.env.VCINSTALLDIR) {
      this.envVcInstallDir =
        path.resolve(process.env.VCINSTALLDIR, '..')
      this.addLog('running in VS Command Prompt, installation path is:\n' +
        `"${this.envVcInstallDir}"\n- will only use this version`)
    } else {
      this.addLog('VCINSTALLDIR not set, not running in VS Command Prompt')
    }

    this.findVisualStudio2017OrNewer((info) => {
      if (info) {
        return this.succeed(info)
      }
      this.findVisualStudio2015((info) => {
        if (info) {
          return this.succeed(info)
        }
        this.findVisualStudio2013((info) => {
          if (info) {
            return this.succeed(info)
          }
          this.fail()
        })
      })
    })
  },

  succeed: function succeed (info) {
    this.log.info(`using VS${info.versionYear} (${info.version}) found at:` +
                  `\n"${info.path}"` +
                  '\nrun with --verbose for detailed information')
    process.nextTick(this.callback.bind(null, null, info))
  },

  fail: function fail () {
    if (this.configMsvsVersion && this.envVcInstallDir) {
      this.errorLog.push(
        'msvs_version does not match this VS Command Prompt or the',
        'installation cannot be used.')
    } else if (this.configMsvsVersion) {
      // If msvs_version was specified but finding VS failed, print what would
      // have been accepted
      this.errorLog.push('')
      if (this.validVersions) {
        this.errorLog.push('valid versions for msvs_version:')
        this.validVersions.forEach((version) => {
          this.errorLog.push(`- "${version}"`)
        })
      } else {
        this.errorLog.push('no valid versions for msvs_version were found')
      }
    }

    const errorLog = this.errorLog.join('\n')

    // For Windows 80 col console, use up to the column before the one marked
    // with X (total 79 chars including logger prefix, 62 chars usable here):
    //                                                               X
    const infoLog = [
      '**************************************************************',
      'You need to install the latest version of Visual Studio',
      'including the "Desktop development with C++" workload.',
      'For more information consult the documentation at:',
      'https://github.com/nodejs/node-gyp#on-windows',
      '**************************************************************'
    ].join('\n')

    this.log.error(`\n${errorLog}\n\n${infoLog}\n`)
    process.nextTick(this.callback.bind(null, new Error(
      'Could not find any Visual Studio installation to use')))
  },

  // Invoke the PowerShell script to get information about Visual Studio 2017
  // or newer installations
  findVisualStudio2017OrNewer: function findVisualStudio2017OrNewer (cb) {
    var ps = path.join(process.env.SystemRoot, 'System32',
      'WindowsPowerShell', 'v1.0', 'powershell.exe')
    var csFile = path.join(__dirname, 'Find-VisualStudio.cs')
    var psArgs = [
      '-ExecutionPolicy',
      'Unrestricted',
      '-NoProfile',
      '-Command',
      '&{Add-Type -Path \'' + csFile + '\';' + '[VisualStudioConfiguration.Main]::PrintJson()}'
    ]

    this.log.silly('Running', ps, psArgs)
    var child = execFile(ps, psArgs, { encoding: 'utf8' },
      (err, stdout, stderr) => {
        this.parseData(err, stdout, stderr, cb)
      })
    child.stdin.end()
  },

  // Parse the output of the PowerShell script and look for an installation
  // of Visual Studio 2017 or newer to use
  parseData: function parseData (err, stdout, stderr, cb) {
    this.log.silly('PS stderr = %j', stderr)

    const failPowershell = () => {
      this.addLog(
        'could not use PowerShell to find Visual Studio 2017 or newer, try re-running with \'--loglevel silly\' for more details')
      cb(null)
    }

    if (err) {
      this.log.silly('PS err = %j', err && (err.stack || err))
      return failPowershell()
    }

    var vsInfo
    try {
      vsInfo = JSON.parse(stdout)
    } catch (e) {
      this.log.silly('PS stdout = %j', stdout)
      this.log.silly(e)
      return failPowershell()
    }

    if (!Array.isArray(vsInfo)) {
      this.log.silly('PS stdout = %j', stdout)
      return failPowershell()
    }

    vsInfo = vsInfo.map((info) => {
      this.log.silly(`processing installation: "${info.path}"`)
      info.path = path.resolve(info.path)
      var ret = this.getVersionInfo(info)
      ret.path = info.path
      ret.msBuild = this.getMSBuild(info, ret.versionYear)
      ret.toolset = this.getToolset(info, ret.versionYear)
      ret.sdk = this.getSDK(info)
      return ret
    })
    this.log.silly('vsInfo:', vsInfo)

    // Remove future versions or errors parsing version number
    vsInfo = vsInfo.filter((info) => {
      if (info.versionYear) {
        return true
      }
      this.addLog(`unknown version "${info.version}" found at "${info.path}"`)
      return false
    })

    // Sort to place newer versions first
    vsInfo.sort((a, b) => b.versionYear - a.versionYear)

    for (var i = 0; i < vsInfo.length; ++i) {
      const info = vsInfo[i]
      this.addLog(`checking VS${info.versionYear} (${info.version}) found ` +
                  `at:\n"${info.path}"`)

      if (info.msBuild) {
        this.addLog('- found "Visual Studio C++ core features"')
      } else {
        this.addLog('- "Visual Studio C++ core features" missing')
        continue
      }

      if (info.toolset) {
        this.addLog(`- found VC++ toolset: ${info.toolset}`)
      } else {
        this.addLog('- missing any VC++ toolset')
        continue
      }

      if (info.sdk) {
        this.addLog(`- found Windows SDK: ${info.sdk}`)
      } else {
        this.addLog('- missing any Windows SDK')
        continue
      }

      if (!this.checkConfigVersion(info.versionYear, info.path)) {
        continue
      }

      return cb(info)
    }

    this.addLog(
      'could not find a version of Visual Studio 2017 or newer to use')
    cb(null)
  },

  // Helper - process version information
  getVersionInfo: function getVersionInfo (info) {
    const match = /^(\d+)\.(\d+)\..*/.exec(info.version)
    if (!match) {
      this.log.silly('- failed to parse version:', info.version)
      return {}
    }
    this.log.silly('- version match = %j', match)
    var ret = {
      version: info.version,
      versionMajor: parseInt(match[1], 10),
      versionMinor: parseInt(match[2], 10)
    }
    if (ret.versionMajor === 15) {
      ret.versionYear = 2017
      return ret
    }
    if (ret.versionMajor === 16) {
      ret.versionYear = 2019
      return ret
    }
    if (ret.versionMajor === 17) {
      ret.versionYear = 2022
      return ret
    }
    this.log.silly('- unsupported version:', ret.versionMajor)
    return {}
  },

  // Helper - process MSBuild information
  getMSBuild: function getMSBuild (info, versionYear) {
    const pkg = 'Microsoft.VisualStudio.VC.MSBuild.Base'
    const msbuildPath = path.join(info.path, 'MSBuild', 'Current', 'Bin', 'MSBuild.exe')
    if (info.packages.indexOf(pkg) !== -1) {
      this.log.silly('- found VC.MSBuild.Base')
      if (versionYear === 2017) {
        return path.join(info.path, 'MSBuild', '15.0', 'Bin', 'MSBuild.exe')
      }
      if (versionYear === 2019) {
        return msbuildPath
      }
    }
    // visual studio 2022 don't has msbuild pkg
    if (fs.existsSync(msbuildPath)) {
      return msbuildPath
    }
    return null
  },

  // Helper - process toolset information
  getToolset: function getToolset (info, versionYear) {
    const pkg = 'Microsoft.VisualStudio.Component.VC.Tools.x86.x64'
    const express = 'Microsoft.VisualStudio.WDExpress'

    if (info.packages.indexOf(pkg) !== -1) {
      this.log.silly('- found VC.Tools.x86.x64')
    } else if (info.packages.indexOf(express) !== -1) {
      this.log.silly('- found Visual Studio Express (looking for toolset)')
    } else {
      return null
    }

    if (versionYear === 2017) {
      return 'v141'
    } else if (versionYear === 2019) {
      return 'v142'
    } else if (versionYear === 2022) {
      return 'v143'
    }
    this.log.silly('- invalid versionYear:', versionYear)
    return null
  },

  // Helper - process Windows SDK information
  getSDK: function getSDK (info) {
    const win8SDK = 'Microsoft.VisualStudio.Component.Windows81SDK'
    const win10SDKPrefix = 'Microsoft.VisualStudio.Component.Windows10SDK.'

    var Win10SDKVer = 0
    info.packages.forEach((pkg) => {
      if (!pkg.startsWith(win10SDKPrefix)) {
        return
      }
      const parts = pkg.split('.')
      if (parts.length > 5 && parts[5] !== 'Desktop') {
        this.log.silly('- ignoring non-Desktop Win10SDK:', pkg)
        return
      }
      const foundSdkVer = parseInt(parts[4], 10)
      if (isNaN(foundSdkVer)) {
        // Microsoft.VisualStudio.Component.Windows10SDK.IpOverUsb
        this.log.silly('- failed to parse Win10SDK number:', pkg)
        return
      }
      this.log.silly('- found Win10SDK:', foundSdkVer)
      Win10SDKVer = Math.max(Win10SDKVer, foundSdkVer)
    })

    if (Win10SDKVer !== 0) {
      return `10.0.${Win10SDKVer}.0`
    } else if (info.packages.indexOf(win8SDK) !== -1) {
      this.log.silly('- found Win8SDK')
      return '8.1'
    }
    return null
  },

  // Find an installation of Visual Studio 2015 to use
  findVisualStudio2015: function findVisualStudio2015 (cb) {
    return this.findOldVS({
      version: '14.0',
      versionMajor: 14,
      versionMinor: 0,
      versionYear: 2015,
      toolset: 'v140'
    }, cb)
  },

  // Find an installation of Visual Studio 2013 to use
  findVisualStudio2013: function findVisualStudio2013 (cb) {
    if (this.nodeSemver.major >= 9) {
      this.addLog(
        'not looking for VS2013 as it is only supported up to Node.js 8')
      return cb(null)
    }
    return this.findOldVS({
      version: '12.0',
      versionMajor: 12,
      versionMinor: 0,
      versionYear: 2013,
      toolset: 'v120'
    }, cb)
  },

  // Helper - common code for VS2013 and VS2015
  findOldVS: function findOldVS (info, cb) {
    const regVC7 = ['HKLM\\Software\\Microsoft\\VisualStudio\\SxS\\VC7',
      'HKLM\\Software\\Wow6432Node\\Microsoft\\VisualStudio\\SxS\\VC7']
    const regMSBuild = 'HKLM\\Software\\Microsoft\\MSBuild\\ToolsVersions'

    this.addLog(`looking for Visual Studio ${info.versionYear}`)
    this.regSearchKeys(regVC7, info.version, [], (err, res) => {
      if (err) {
        this.addLog('- not found')
        return cb(null)
      }

      const vsPath = path.resolve(res, '..')
      this.addLog(`- found in "${vsPath}"`)

      const msBuildRegOpts = process.arch === 'ia32' ? [] : ['/reg:32']
      this.regSearchKeys([`${regMSBuild}\\${info.version}`],
        'MSBuildToolsPath', msBuildRegOpts, (err, res) => {
          if (err) {
            this.addLog(
              '- could not find MSBuild in registry for this version')
            return cb(null)
          }

          const msBuild = path.join(res, 'MSBuild.exe')
          this.addLog(`- MSBuild in "${msBuild}"`)

          if (!this.checkConfigVersion(info.versionYear, vsPath)) {
            return cb(null)
          }

          info.path = vsPath
          info.msBuild = msBuild
          info.sdk = null
          cb(info)
        })
    })
  },

  // After finding a usable version of Visual Studio:
  // - add it to validVersions to be displayed at the end if a specific
  //   version was requested and not found;
  // - check if this is the version that was requested.
  // - check if this matches the Visual Studio Command Prompt
  checkConfigVersion: function checkConfigVersion (versionYear, vsPath) {
    this.validVersions.push(versionYear)
    this.validVersions.push(vsPath)

    if (this.configVersionYear && this.configVersionYear !== versionYear) {
      this.addLog('- msvs_version does not match this version')
      return false
    }
    if (this.configPath &&
        path.relative(this.configPath, vsPath) !== '') {
      this.addLog('- msvs_version does not point to this installation')
      return false
    }
    if (this.envVcInstallDir &&
        path.relative(this.envVcInstallDir, vsPath) !== '') {
      this.addLog('- does not match this Visual Studio Command Prompt')
      return false
    }

    return true
  }
}

module.exports = findVisualStudio
module.exports.test = {
  VisualStudioFinder: VisualStudioFinder,
  findVisualStudio: findVisualStudio
}
'use strict'

const fs = require('graceful-fs')
const os = require('os')
const tar = require('tar')
const path = require('path')
const util = require('util')
const stream = require('stream')
const crypto = require('crypto')
const log = require('npmlog')
const semver = require('semver')
const fetch = require('make-fetch-happen')
const processRelease = require('./process-release')
const win = process.platform === 'win32'
const streamPipeline = util.promisify(stream.pipeline)

/**
 * @param {typeof import('graceful-fs')} fs
 */

async function install (fs, gyp, argv) {
  const release = processRelease(argv, gyp, process.version, process.release)

  // Determine which node dev files version we are installing
  log.verbose('install', 'input version string %j', release.version)

  if (!release.semver) {
    // could not parse the version string with semver
    throw new Error('Invalid version number: ' + release.version)
  }

  if (semver.lt(release.version, '0.8.0')) {
    throw new Error('Minimum target version is `0.8.0` or greater. Got: ' + release.version)
  }

  // 0.x.y-pre versions are not published yet and cannot be installed. Bail.
  if (release.semver.prerelease[0] === 'pre') {
    log.verbose('detected "pre" node version', release.version)
    if (!gyp.opts.nodedir) {
      throw new Error('"pre" versions of node cannot be installed, use the --nodedir flag instead')
    }
    log.verbose('--nodedir flag was passed; skipping install', gyp.opts.nodedir)
    return
  }

  // flatten version into String
  log.verbose('install', 'installing version: %s', release.versionDir)

  // the directory where the dev files will be installed
  const devDir = path.resolve(gyp.devDir, release.versionDir)

  // If '--ensure' was passed, then don't *always* install the version;
  // check if it is already installed, and only install when needed
  if (gyp.opts.ensure) {
    log.verbose('install', '--ensure was passed, so won\'t reinstall if already installed')
    try {
      await fs.promises.stat(devDir)
    } catch (err) {
      if (err.code === 'ENOENT') {
        log.verbose('install', 'version not already installed, continuing with install', release.version)
        try {
          return await go()
        } catch (err) {
          return rollback(err)
        }
      } else if (err.code === 'EACCES') {
        return eaccesFallback(err)
      }
      throw err
    }
    log.verbose('install', 'version is already installed, need to check "installVersion"')
    const installVersionFile = path.resolve(devDir, 'installVersion')
    let installVersion = 0
    try {
      const ver = await fs.promises.readFile(installVersionFile, 'ascii')
      installVersion = parseInt(ver, 10) || 0
    } catch (err) {
      if (err.code !== 'ENOENT') {
        throw err
      }
    }
    log.verbose('got "installVersion"', installVersion)
    log.verbose('needs "installVersion"', gyp.package.installVersion)
    if (installVersion < gyp.package.installVersion) {
      log.verbose('install', 'version is no good; reinstalling')
      try {
        return await go()
      } catch (err) {
        return rollback(err)
      }
    }
    log.verbose('install', 'version is good')
  } else {
    try {
      return await go()
    } catch (err) {
      return rollback(err)
    }
  }

  async function go () {
    log.verbose('ensuring nodedir is created', devDir)

    // first create the dir for the node dev files
    try {
      const created = await fs.promises.mkdir(devDir, { recursive: true })

      if (created) {
        log.verbose('created nodedir', created)
      }
    } catch (err) {
      if (err.code === 'EACCES') {
        return eaccesFallback(err)
      }

      throw err
    }

    // now download the node tarball
    const tarPath = gyp.opts.tarball
    let extractCount = 0
    const contentShasums = {}
    const expectShasums = {}

    // checks if a file to be extracted from the tarball is valid.
    // only .h header files and the gyp files get extracted
    function isValid (path) {
      const isValid = valid(path)
      if (isValid) {
        log.verbose('extracted file from tarball', path)
        extractCount++
      } else {
        // invalid
        log.silly('ignoring from tarball', path)
      }
      return isValid
    }

    // download the tarball and extract!

    if (tarPath) {
      await tar.extract({
        file: tarPath,
        strip: 1,
        filter: isValid,
        cwd: devDir
      })
    } else {
      try {
        const res = await download(gyp, release.tarballUrl)

        if (res.status !== 200) {
          throw new Error(`${res.status} response downloading ${release.tarballUrl}`)
        }

        await streamPipeline(
          res.body,
          // content checksum
          new ShaSum((_, checksum) => {
            const filename = path.basename(release.tarballUrl).trim()
            contentShasums[filename] = checksum
            log.verbose('content checksum', filename, checksum)
          }),
          tar.extract({
            strip: 1,
            cwd: devDir,
            filter: isValid
          })
        )
      } catch (err) {
        // something went wrong downloading the tarball?
        if (err.code === 'ENOTFOUND') {
          throw new Error('This is most likely not a problem with node-gyp or the package itself and\n' +
            'is related to network connectivity. In most cases you are behind a proxy or have bad \n' +
            'network settings.')
        }
        throw err
      }
    }

    // invoked after the tarball has finished being extracted
    if (extractCount === 0) {
      throw new Error('There was a fatal problem while downloading/extracting the tarball')
    }

    log.verbose('tarball', 'done parsing tarball')

    const installVersionPath = path.resolve(devDir, 'installVersion')
    await Promise.all([
      // need to download node.lib
      ...(win ? downloadNodeLib() : []),
      // write the "installVersion" file
      fs.promises.writeFile(installVersionPath, gyp.package.installVersion + '\n'),
      // Only download SHASUMS.txt if we downloaded something in need of SHA verification
      ...(!tarPath || win ? [downloadShasums()] : [])
    ])

    log.verbose('download contents checksum', JSON.stringify(contentShasums))
    // check content shasums
    for (const k in contentShasums) {
      log.verbose('validating download checksum for ' + k, '(%s == %s)', contentShasums[k], expectShasums[k])
      if (contentShasums[k] !== expectShasums[k]) {
        throw new Error(k + ' local checksum ' + contentShasums[k] + ' not match remote ' + expectShasums[k])
      }
    }

    async function downloadShasums () {
      log.verbose('check download content checksum, need to download `SHASUMS256.txt`...')
      log.verbose('checksum url', release.shasumsUrl)

      const res = await download(gyp, release.shasumsUrl)

      if (res.status !== 200) {
        throw new Error(`${res.status}  status code downloading checksum`)
      }

      for (const line of (await res.text()).trim().split('\n')) {
        const items = line.trim().split(/\s+/)
        if (items.length !== 2) {
          return
        }

        // 0035d18e2dcf9aad669b1c7c07319e17abfe3762  ./node-v0.11.4.tar.gz
        const name = items[1].replace(/^\.\//, '')
        expectShasums[name] = items[0]
      }

      log.verbose('checksum data', JSON.stringify(expectShasums))
    }

    function downloadNodeLib () {
      log.verbose('on Windows; need to download `' + release.name + '.lib`...')
      const archs = ['ia32', 'x64', 'arm64']
      return archs.map(async (arch) => {
        const dir = path.resolve(devDir, arch)
        const targetLibPath = path.resolve(dir, release.name + '.lib')
        const { libUrl, libPath } = release[arch]
        const name = `${arch} ${release.name}.lib`
        log.verbose(name, 'dir', dir)
        log.verbose(name, 'url', libUrl)

        await fs.promises.mkdir(dir, { recursive: true })
        log.verbose('streaming', name, 'to:', targetLibPath)

        const res = await download(gyp, libUrl)

        if (res.status === 403 || res.status === 404) {
          if (arch === 'arm64') {
            // Arm64 is a newer platform on Windows and not all node distributions provide it.
            log.verbose(`${name} was not found in ${libUrl}`)
          } else {
            log.warn(`${name} was not found in ${libUrl}`)
          }
          return
        } else if (res.status !== 200) {
          throw new Error(`${res.status} status code downloading ${name}`)
        }

        return streamPipeline(
          res.body,
          new ShaSum((_, checksum) => {
            contentShasums[libPath] = checksum
            log.verbose('content checksum', libPath, checksum)
          }),
          fs.createWriteStream(targetLibPath)
        )
      })
    } // downloadNodeLib()
  } // go()

  /**
   * Checks if a given filename is "valid" for this installation.
   */

  function valid (file) {
    // header files
    const extname = path.extname(file)
    return extname === '.h' || extname === '.gypi'
  }

  async function rollback (err) {
    log.warn('install', 'got an error, rolling back install')
    // roll-back the install if anything went wrong
    await util.promisify(gyp.commands.remove)([release.versionDir])
    throw err
  }

  /**
   * The EACCES fallback is a workaround for npm's `sudo` behavior, where
   * it drops the permissions before invoking any child processes (like
   * node-gyp). So what happens is the "nobody" user doesn't have
   * permission to create the dev dir. As a fallback, make the tmpdir() be
   * the dev dir for this installation. This is not ideal, but at least
   * the compilation will succeed...
   */

  async function eaccesFallback (err) {
    const noretry = '--node_gyp_internal_noretry'
    if (argv.indexOf(noretry) !== -1) {
      throw err
    }
    const tmpdir = os.tmpdir()
    gyp.devDir = path.resolve(tmpdir, '.node-gyp')
    let userString = ''
    try {
      // os.userInfo can fail on some systems, it's not critical here
      userString = ` ("${os.userInfo().username}")`
    } catch (e) {}
    log.warn('EACCES', 'current user%s does not have permission to access the dev dir "%s"', userString, devDir)
    log.warn('EACCES', 'attempting to reinstall using temporary dev dir "%s"', gyp.devDir)
    if (process.cwd() === tmpdir) {
      log.verbose('tmpdir == cwd', 'automatically will remove dev files after to save disk space')
      gyp.todo.push({ name: 'remove', args: argv })
    }
    return util.promisify(gyp.commands.install)([noretry].concat(argv))
  }
}

class ShaSum extends stream.Transform {
  constructor (callback) {
    super()
    this._callback = callback
    this._digester = crypto.createHash('sha256')
  }

  _transform (chunk, _, callback) {
    this._digester.update(chunk)
    callback(null, chunk)
  }

  _flush (callback) {
    this._callback(null, this._digester.digest('hex'))
    callback()
  }
}

async function download (gyp, url) {
  log.http('GET', url)

  const requestOpts = {
    headers: {
      'User-Agent': `node-gyp v${gyp.version} (node ${process.version})`,
      Connection: 'keep-alive'
    },
    proxy: gyp.opts.proxy,
    noProxy: gyp.opts.noproxy
  }

  const cafile = gyp.opts.cafile
  if (cafile) {
    requestOpts.ca = await readCAFile(cafile)
  }

  const res = await fetch(url, requestOpts)
  log.http(res.status, res.url)

  return res
}

async function readCAFile (filename) {
  // The CA file can contain multiple certificates so split on certificate
  // boundaries.  [\S\s]*? is used to match everything including newlines.
  const ca = await fs.promises.readFile(filename, 'utf8')
  const re = /(-----BEGIN CERTIFICATE-----[\S\s]*?-----END CERTIFICATE-----)/g
  return ca.match(re)
}

module.exports = function (gyp, argv, callback) {
  install(fs, gyp, argv).then(callback.bind(undefined, null), callback)
}
module.exports.test = {
  download,
  install,
  readCAFile
}
module.exports.usage = 'Install node development files for the specified node version.'
'use strict'

const fs = require('graceful-fs')
const log = require('npmlog')

function list (gyp, args, callback) {
  var devDir = gyp.devDir
  log.verbose('list', 'using node-gyp dir:', devDir)

  fs.readdir(devDir, onreaddir)

  function onreaddir (err, versions) {
    if (err && err.code !== 'ENOENT') {
      return callback(err)
    }

    if (Array.isArray(versions)) {
      versions = versions.filter(function (v) { return v !== 'current' })
    } else {
      versions = []
    }
    callback(null, versions)
  }
}

module.exports = list
module.exports.usage = 'Prints a listing of the currently installed node development files'
'use strict'

const path = require('path')
const nopt = require('nopt')
const log = require('npmlog')
const childProcess = require('child_process')
const EE = require('events').EventEmitter
const inherits = require('util').inherits
const commands = [
  // Module build commands
  'build',
  'clean',
  'configure',
  'rebuild',
  // Development Header File management commands
  'install',
  'list',
  'remove'
]
const aliases = {
  ls: 'list',
  rm: 'remove'
}

// differentiate node-gyp's logs from npm's
log.heading = 'gyp'

function gyp () {
  return new Gyp()
}

function Gyp () {
  var self = this

  this.devDir = ''
  this.commands = {}

  commands.forEach(function (command) {
    self.commands[command] = function (argv, callback) {
      log.verbose('command', command, argv)
      return require('./' + command)(self, argv, callback)
    }
  })
}
inherits(Gyp, EE)
exports.Gyp = Gyp
var proto = Gyp.prototype

/**
 * Export the contents of the package.json.
 */

proto.package = require('../package.json')

/**
 * nopt configuration definitions
 */

proto.configDefs = {
  help: Boolean, // everywhere
  arch: String, // 'configure'
  cafile: String, // 'install'
  debug: Boolean, // 'build'
  directory: String, // bin
  make: String, // 'build'
  msvs_version: String, // 'configure'
  ensure: Boolean, // 'install'
  solution: String, // 'build' (windows only)
  proxy: String, // 'install'
  noproxy: String, // 'install'
  devdir: String, // everywhere
  nodedir: String, // 'configure'
  loglevel: String, // everywhere
  python: String, // 'configure'
  'dist-url': String, // 'install'
  tarball: String, // 'install'
  jobs: String, // 'build'
  thin: String, // 'configure'
  'force-process-config': Boolean // 'configure'
}

/**
 * nopt shorthands
 */

proto.shorthands = {
  release: '--no-debug',
  C: '--directory',
  debug: '--debug',
  j: '--jobs',
  silly: '--loglevel=silly',
  verbose: '--loglevel=verbose',
  silent: '--loglevel=silent'
}

/**
 * expose the command aliases for the bin file to use.
 */

proto.aliases = aliases

/**
 * Parses the given argv array and sets the 'opts',
 * 'argv' and 'command' properties.
 */

proto.parseArgv = function parseOpts (argv) {
  this.opts = nopt(this.configDefs, this.shorthands, argv)
  this.argv = this.opts.argv.remain.slice()

  var commands = this.todo = []

  // create a copy of the argv array with aliases mapped
  argv = this.argv.map(function (arg) {
    // is this an alias?
    if (arg in this.aliases) {
      arg = this.aliases[arg]
    }
    return arg
  }, this)

  // process the mapped args into "command" objects ("name" and "args" props)
  argv.slice().forEach(function (arg) {
    if (arg in this.commands) {
      var args = argv.splice(0, argv.indexOf(arg))
      argv.shift()
      if (commands.length > 0) {
        commands[commands.length - 1].args = args
      }
      commands.push({ name: arg, args: [] })
    }
  }, this)
  if (commands.length > 0) {
    commands[commands.length - 1].args = argv.splice(0)
  }

  // support for inheriting config env variables from npm
  var npmConfigPrefix = 'npm_config_'
  Object.keys(process.env).forEach(function (name) {
    if (name.indexOf(npmConfigPrefix) !== 0) {
      return
    }
    var val = process.env[name]
    if (name === npmConfigPrefix + 'loglevel') {
      log.level = val
    } else {
      // add the user-defined options to the config
      name = name.substring(npmConfigPrefix.length)
      // gyp@741b7f1 enters an infinite loop when it encounters
      // zero-length options so ensure those don't get through.
      if (name) {
        this.opts[name] = val
      }
    }
  }, this)

  if (this.opts.loglevel) {
    log.level = this.opts.loglevel
  }
  log.resume()
}

/**
 * Spawns a child process and emits a 'spawn' event.
 */

proto.spawn = function spawn (command, args, opts) {
  if (!opts) {
    opts = {}
  }
  if (!opts.silent && !opts.stdio) {
    opts.stdio = [0, 1, 2]
  }
  var cp = childProcess.spawn(command, args, opts)
  log.info('spawn', command)
  log.info('spawn args', args)
  return cp
}

/**
 * Returns the usage instructions for node-gyp.
 */

proto.usage = function usage () {
  var str = [
    '',
    '  Usage: node-gyp <command> [options]',
    '',
    '  where <command> is one of:',
    commands.map(function (c) {
      return '    - ' + c + ' - ' + require('./' + c).usage
    }).join('\n'),
    '',
    'node-gyp@' + this.version + '  ' + path.resolve(__dirname, '..'),
    'node@' + process.versions.node
  ].join('\n')
  return str
}

/**
 * Version number getter.
 */

Object.defineProperty(proto, 'version', {
  get: function () {
    return this.package.version
  },
  enumerable: true
})

module.exports = exports = gyp
/* eslint-disable node/no-deprecated-api */

'use strict'

const semver = require('semver')
const url = require('url')
const path = require('path')
const log = require('npmlog')

// versions where -headers.tar.gz started shipping
const headersTarballRange = '>= 3.0.0 || ~0.12.10 || ~0.10.42'
const bitsre = /\/win-(x86|x64|arm64)\//
const bitsreV3 = /\/win-(x86|ia32|x64)\// // io.js v3.x.x shipped with "ia32" but should
// have been "x86"

// Captures all the logic required to determine download URLs, local directory and
// file names. Inputs come from command-line switches (--target, --dist-url),
// `process.version` and `process.release` where it exists.
function processRelease (argv, gyp, defaultVersion, defaultRelease) {
  var version = (semver.valid(argv[0]) && argv[0]) || gyp.opts.target || defaultVersion
  var versionSemver = semver.parse(version)
  var overrideDistUrl = gyp.opts['dist-url'] || gyp.opts.disturl
  var isDefaultVersion
  var isNamedForLegacyIojs
  var name
  var distBaseUrl
  var baseUrl
  var libUrl32
  var libUrl64
  var libUrlArm64
  var tarballUrl
  var canGetHeaders

  if (!versionSemver) {
    // not a valid semver string, nothing we can do
    return { version: version }
  }
  // flatten version into String
  version = versionSemver.version

  // defaultVersion should come from process.version so ought to be valid semver
  isDefaultVersion = version === semver.parse(defaultVersion).version

  // can't use process.release if we're using --target=x.y.z
  if (!isDefaultVersion) {
    defaultRelease = null
  }

  if (defaultRelease) {
    // v3 onward, has process.release
    name = defaultRelease.name.replace(/io\.js/, 'iojs') // remove the '.' for directory naming purposes
  } else {
    // old node or alternative --target=
    // semver.satisfies() doesn't like prerelease tags so test major directly
    isNamedForLegacyIojs = versionSemver.major >= 1 && versionSemver.major < 4
    // isNamedForLegacyIojs is required to support Electron < 4 (in particular Electron 3)
    // as previously this logic was used to ensure "iojs" was used to download iojs releases
    // and "node" for node releases.  Unfortunately the logic was broad enough that electron@3
    // published release assets as "iojs" so that the node-gyp logic worked.  Once Electron@3 has
    // been EOL for a while (late 2019) we should remove this hack.
    name = isNamedForLegacyIojs ? 'iojs' : 'node'
  }

  // check for the nvm.sh standard mirror env variables
  if (!overrideDistUrl && process.env.NODEJS_ORG_MIRROR) {
    overrideDistUrl = process.env.NODEJS_ORG_MIRROR
  }

  if (overrideDistUrl) {
    log.verbose('download', 'using dist-url', overrideDistUrl)
  }

  if (overrideDistUrl) {
    distBaseUrl = overrideDistUrl.replace(/\/+$/, '')
  } else {
    distBaseUrl = 'https://nodejs.org/dist'
  }
  distBaseUrl += '/v' + version + '/'

  // new style, based on process.release so we have a lot of the data we need
  if (defaultRelease && defaultRelease.headersUrl && !overrideDistUrl) {
    baseUrl = url.resolve(defaultRelease.headersUrl, './')
    libUrl32 = resolveLibUrl(name, defaultRelease.libUrl || baseUrl || distBaseUrl, 'x86', versionSemver.major)
    libUrl64 = resolveLibUrl(name, defaultRelease.libUrl || baseUrl || distBaseUrl, 'x64', versionSemver.major)
    libUrlArm64 = resolveLibUrl(name, defaultRelease.libUrl || baseUrl || distBaseUrl, 'arm64', versionSemver.major)
    tarballUrl = defaultRelease.headersUrl
  } else {
    // older versions without process.release are captured here and we have to make
    // a lot of assumptions, additionally if you --target=x.y.z then we can't use the
    // current process.release
    baseUrl = distBaseUrl
    libUrl32 = resolveLibUrl(name, baseUrl, 'x86', versionSemver.major)
    libUrl64 = resolveLibUrl(name, baseUrl, 'x64', versionSemver.major)
    libUrlArm64 = resolveLibUrl(name, baseUrl, 'arm64', versionSemver.major)

    // making the bold assumption that anything with a version number >3.0.0 will
    // have a *-headers.tar.gz file in its dist location, even some frankenstein
    // custom version
    canGetHeaders = semver.satisfies(versionSemver, headersTarballRange)
    tarballUrl = url.resolve(baseUrl, name + '-v' + version + (canGetHeaders ? '-headers' : '') + '.tar.gz')
  }

  return {
    version: version,
    semver: versionSemver,
    name: name,
    baseUrl: baseUrl,
    tarballUrl: tarballUrl,
    shasumsUrl: url.resolve(baseUrl, 'SHASUMS256.txt'),
    versionDir: (name !== 'node' ? name + '-' : '') + version,
    ia32: {
      libUrl: libUrl32,
      libPath: normalizePath(path.relative(url.parse(baseUrl).path, url.parse(libUrl32).path))
    },
    x64: {
      libUrl: libUrl64,
      libPath: normalizePath(path.relative(url.parse(baseUrl).path, url.parse(libUrl64).path))
    },
    arm64: {
      libUrl: libUrlArm64,
      libPath: normalizePath(path.relative(url.parse(baseUrl).path, url.parse(libUrlArm64).path))
    }
  }
}

function normalizePath (p) {
  return path.normalize(p).replace(/\\/g, '/')
}

function resolveLibUrl (name, defaultUrl, arch, versionMajor) {
  var base = url.resolve(defaultUrl, './')
  var hasLibUrl = bitsre.test(defaultUrl) || (versionMajor === 3 && bitsreV3.test(defaultUrl))

  if (!hasLibUrl) {
    // let's assume it's a baseUrl then
    if (versionMajor >= 1) {
      return url.resolve(base, 'win-' + arch + '/' + name + '.lib')
    }
    // prior to io.js@1.0.0 32-bit node.lib lives in /, 64-bit lives in /x64/
    return url.resolve(base, (arch === 'x86' ? '' : arch + '/') + name + '.lib')
  }

  // else we have a proper url to a .lib, just make sure it's the right arch
  return defaultUrl.replace(versionMajor === 3 ? bitsreV3 : bitsre, '/win-' + arch + '/')
}

module.exports = processRelease
'use strict'

function rebuild (gyp, argv, callback) {
  gyp.todo.push(
    { name: 'clean', args: [] }
    , { name: 'configure', args: argv }
    , { name: 'build', args: [] }
  )
  process.nextTick(callback)
}

module.exports = rebuild
module.exports.usage = 'Runs "clean", "configure" and "build" all at once'
'use strict'

const fs = require('fs')
const rm = require('rimraf')
const path = require('path')
const log = require('npmlog')
const semver = require('semver')

function remove (gyp, argv, callback) {
  var devDir = gyp.devDir
  log.verbose('remove', 'using node-gyp dir:', devDir)

  // get the user-specified version to remove
  var version = argv[0] || gyp.opts.target
  log.verbose('remove', 'removing target version:', version)

  if (!version) {
    return callback(new Error('You must specify a version number to remove. Ex: "' + process.version + '"'))
  }

  var versionSemver = semver.parse(version)
  if (versionSemver) {
    // flatten the version Array into a String
    version = versionSemver.version
  }

  var versionPath = path.resolve(gyp.devDir, version)
  log.verbose('remove', 'removing development files for version:', version)

  // first check if its even installed
  fs.stat(versionPath, function (err) {
    if (err) {
      if (err.code === 'ENOENT') {
        callback(null, 'version was already uninstalled: ' + version)
      } else {
        callback(err)
      }
      return
    }
    // Go ahead and delete the dir
    rm(versionPath, callback)
  })
}

module.exports = exports = remove
module.exports.usage = 'Removes the node development files for the specified version'
'use strict'

const log = require('npmlog')
const execFile = require('child_process').execFile
const path = require('path')

function logWithPrefix (log, prefix) {
  function setPrefix (logFunction) {
    return (...args) => logFunction.apply(null, [ prefix, ...args ]) // eslint-disable-line
  }
  return {
    silly: setPrefix(log.silly),
    verbose: setPrefix(log.verbose),
    info: setPrefix(log.info),
    warn: setPrefix(log.warn),
    error: setPrefix(log.error)
  }
}

function regGetValue (key, value, addOpts, cb) {
  const outReValue = value.replace(/\W/g, '.')
  const outRe = new RegExp(`^\\s+${outReValue}\\s+REG_\\w+\\s+(\\S.*)$`, 'im')
  const reg = path.join(process.env.SystemRoot, 'System32', 'reg.exe')
  const regArgs = ['query', key, '/v', value].concat(addOpts)

  log.silly('reg', 'running', reg, regArgs)
  const child = execFile(reg, regArgs, { encoding: 'utf8' },
    function (err, stdout, stderr) {
      log.silly('reg', 'reg.exe stdout = %j', stdout)
      if (err || stderr.trim() !== '') {
        log.silly('reg', 'reg.exe err = %j', err && (err.stack || err))
        log.silly('reg', 'reg.exe stderr = %j', stderr)
        return cb(err, stderr)
      }

      const result = outRe.exec(stdout)
      if (!result) {
        log.silly('reg', 'error parsing stdout')
        return cb(new Error('Could not parse output of reg.exe'))
      }
      log.silly('reg', 'found: %j', result[1])
      cb(null, result[1])
    })
  child.stdin.end()
}

function regSearchKeys (keys, value, addOpts, cb) {
  var i = 0
  const search = () => {
    log.silly('reg-search', 'looking for %j in %j', value, keys[i])
    regGetValue(keys[i], value, addOpts, (err, res) => {
      ++i
      if (err && i < keys.length) { return search() }
      cb(err, res)
    })
  }
  search()
}

module.exports = {
  logWithPrefix: logWithPrefix,
  regGetValue: regGetValue,
  regSearchKeys: regSearchKeys
}
[flake8]
max-complexity = 101
max-line-length = 88
extend-ignore = E203  # whitespace before ':' to agree with psf/black
# Names should be added to this file like so:
# Name or Organization <email address>

Google Inc. <*@google.com>
Bloomberg Finance L.P. <*@bloomberg.net>
IBM Inc. <*@*.ibm.com>
Yandex LLC <*@yandex-team.ru>

Steven Knight <knight@baldmt.com>
Ryan Norton <rnorton10@gmail.com>
David J. Sankel <david@sankelsoftware.com>
Eric N. Vander Weele <ericvw@gmail.com>
Tom Freudenberg <th.freudenberg@gmail.com>
Julien Brianceau <jbriance@cisco.com>
Refael Ackermann <refack@gmail.com>
Ujjwal Sharma <ryzokuken@disroot.org>
# Code of Conduct

* [Node.js Code of Conduct](https://github.com/nodejs/admin/blob/HEAD/CODE_OF_CONDUCT.md)
* [Node.js Moderation Policy](https://github.com/nodejs/admin/blob/HEAD/Moderation-Policy.md)
# Contributing to gyp-next

## Code of Conduct

This project is bound to the [Node.js Code of Conduct](https://github.com/nodejs/admin/blob/HEAD/CODE_OF_CONDUCT.md).

<a id="developers-certificate-of-origin"></a>
## Developer's Certificate of Origin 1.1

By making a contribution to this project, I certify that:

* (a) The contribution was created in whole or in part by me and I
  have the right to submit it under the open source license
  indicated in the file; or

* (b) The contribution is based upon previous work that, to the best
  of my knowledge, is covered under an appropriate open source
  license and I have the right under that license to submit that
  work with modifications, whether created in whole or in part
  by me, under the same open source license (unless I am
  permitted to submit under a different license), as indicated
  in the file; or

* (c) The contribution was provided directly to me by some other
  person who certified (a), (b) or (c) and I have not modified
  it.

* (d) I understand and agree that this project and the contribution
  are public and that a record of the contribution (including all
  personal information I submit with it, including my sign-off) is
  maintained indefinitely and may be redistributed consistent with
  this project or the open source license(s) involved.
Copyright (c) 2020 Node.js contributors. All rights reserved.
Copyright (c) 2009 Google 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:

   * 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.
   * Neither the name of Google Inc. nor the names of its
contributors may 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
OWNER 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.
GYP can Generate Your Projects.
===================================

Documents are available at [gyp.gsrc.io](https://gyp.gsrc.io), or you can check out ```md-pages``` branch to read those documents offline.

__gyp-next__ is [released](https://github.com/nodejs/gyp-next/releases) to the [__Python Packaging Index__](https://pypi.org/project/gyp-next) (PyPI) and can be installed with the command:
* `python3 -m pip install gyp-next`
#!/bin/sh
# Copyright 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

set -e
base=$(dirname "$0")
exec python "${base}/gyp_main.py" "$@"
@rem Copyright (c) 2009 Google Inc. All rights reserved.
@rem Use of this source code is governed by a BSD-style license that can be
@rem found in the LICENSE file.

@python "%~dp0gyp_main.py" %*
#!/usr/bin/env python3

# Copyright (c) 2009 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os
import sys
import subprocess


def IsCygwin():
    # Function copied from pylib/gyp/common.py
    try:
        out = subprocess.Popen(
            "uname", stdout=subprocess.PIPE, stderr=subprocess.STDOUT
        )
        stdout, _ = out.communicate()
        return "CYGWIN" in stdout.decode("utf-8")
    except Exception:
        return False


def UnixifyPath(path):
    try:
        if not IsCygwin():
            return path
        out = subprocess.Popen(
            ["cygpath", "-u", path], stdout=subprocess.PIPE, stderr=subprocess.STDOUT
        )
        stdout, _ = out.communicate()
        return stdout.decode("utf-8")
    except Exception:
        return path


# Make sure we're using the version of pylib in this repo, not one installed
# elsewhere on the system. Also convert to Unix style path on Cygwin systems,
# else the 'gyp' library will not be found
path = UnixifyPath(sys.argv[0])
sys.path.insert(0, os.path.join(os.path.dirname(path), "pylib"))
import gyp  # noqa: E402

if __name__ == "__main__":
    sys.exit(gyp.script_main())
flake8
pytest
#!/usr/bin/env python3

# Copyright (c) 2009 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from os import path

from setuptools import setup

here = path.abspath(path.dirname(__file__))
# Get the long description from the README file
with open(path.join(here, "README.md")) as in_file:
    long_description = in_file.read()

setup(
    name="gyp-next",
    version="0.10.0",
    description="A fork of the GYP build system for use in the Node.js projects",
    long_description=long_description,
    long_description_content_type="text/markdown",
    author="Node.js contributors",
    author_email="ryzokuken@disroot.org",
    url="https://github.com/nodejs/gyp-next",
    package_dir={"": "pylib"},
    packages=["gyp", "gyp.generator"],
    entry_points={"console_scripts": ["gyp=gyp:script_main"]},
    python_requires=">=3.6",
    classifiers=[
        "Development Status :: 3 - Alpha",
        "Environment :: Console",
        "Intended Audience :: Developers",
        "License :: OSI Approved :: BSD License",
        "Natural Language :: English",
        "Programming Language :: Python",
        "Programming Language :: Python :: 3",
        "Programming Language :: Python :: 3.6",
        "Programming Language :: Python :: 3.7",
        "Programming Language :: Python :: 3.8",
        "Programming Language :: Python :: 3.9",
    ],
)
#!/usr/bin/env python3
# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""gyptest.py -- test runner for GYP tests."""


import argparse
import os
import platform
import subprocess
import sys
import time


def is_test_name(f):
    return f.startswith("gyptest") and f.endswith(".py")


def find_all_gyptest_files(directory):
    result = []
    for root, dirs, files in os.walk(directory):
        result.extend([os.path.join(root, f) for f in files if is_test_name(f)])
    result.sort()
    return result


def main(argv=None):
    if argv is None:
        argv = sys.argv

    parser = argparse.ArgumentParser()
    parser.add_argument("-a", "--all", action="store_true", help="run all tests")
    parser.add_argument("-C", "--chdir", action="store", help="change to directory")
    parser.add_argument(
        "-f",
        "--format",
        action="store",
        default="",
        help="run tests with the specified formats",
    )
    parser.add_argument(
        "-G",
        "--gyp_option",
        action="append",
        default=[],
        help="Add -G options to the gyp command line",
    )
    parser.add_argument(
        "-l", "--list", action="store_true", help="list available tests and exit"
    )
    parser.add_argument(
        "-n",
        "--no-exec",
        action="store_true",
        help="no execute, just print the command line",
    )
    parser.add_argument(
        "--path", action="append", default=[], help="additional $PATH directory"
    )
    parser.add_argument(
        "-q",
        "--quiet",
        action="store_true",
        help="quiet, don't print anything unless there are failures",
    )
    parser.add_argument(
        "-v",
        "--verbose",
        action="store_true",
        help="print configuration info and test results.",
    )
    parser.add_argument("tests", nargs="*")
    args = parser.parse_args(argv[1:])

    if args.chdir:
        os.chdir(args.chdir)

    if args.path:
        extra_path = [os.path.abspath(p) for p in args.path]
        extra_path = os.pathsep.join(extra_path)
        os.environ["PATH"] = extra_path + os.pathsep + os.environ["PATH"]

    if not args.tests:
        if not args.all:
            sys.stderr.write("Specify -a to get all tests.\n")
            return 1
        args.tests = ["test"]

    tests = []
    for arg in args.tests:
        if os.path.isdir(arg):
            tests.extend(find_all_gyptest_files(os.path.normpath(arg)))
        else:
            if not is_test_name(os.path.basename(arg)):
                print(arg, "is not a valid gyp test name.", file=sys.stderr)
                sys.exit(1)
            tests.append(arg)

    if args.list:
        for test in tests:
            print(test)
        sys.exit(0)

    os.environ["PYTHONPATH"] = os.path.abspath("test/lib")

    if args.verbose:
        print_configuration_info()

    if args.gyp_option and not args.quiet:
        print("Extra Gyp options: %s\n" % args.gyp_option)

    if args.format:
        format_list = args.format.split(",")
    else:
        format_list = {
            "aix5": ["make"],
            "freebsd7": ["make"],
            "freebsd8": ["make"],
            "openbsd5": ["make"],
            "cygwin": ["msvs"],
            "win32": ["msvs", "ninja"],
            "linux": ["make", "ninja"],
            "linux2": ["make", "ninja"],
            "linux3": ["make", "ninja"],
            # TODO: Re-enable xcode-ninja.
            # https://bugs.chromium.org/p/gyp/issues/detail?id=530
            # 'darwin':   ['make', 'ninja', 'xcode', 'xcode-ninja'],
            "darwin": ["make", "ninja", "xcode"],
        }[sys.platform]

    gyp_options = []
    for option in args.gyp_option:
        gyp_options += ["-G", option]

    runner = Runner(format_list, tests, gyp_options, args.verbose)
    runner.run()

    if not args.quiet:
        runner.print_results()

    return 1 if runner.failures else 0


def print_configuration_info():
    print("Test configuration:")
    if sys.platform == "darwin":
        sys.path.append(os.path.abspath("test/lib"))
        import TestMac

        print(f"  Mac {platform.mac_ver()[0]} {platform.mac_ver()[2]}")
        print(f"  Xcode {TestMac.Xcode.Version()}")
    elif sys.platform == "win32":
        sys.path.append(os.path.abspath("pylib"))
        import gyp.MSVSVersion

        print("  Win %s %s\n" % platform.win32_ver()[0:2])
        print("  MSVS %s" % gyp.MSVSVersion.SelectVisualStudioVersion().Description())
    elif sys.platform in ("linux", "linux2"):
        print("  Linux %s" % " ".join(platform.linux_distribution()))
    print(f"  Python {platform.python_version()}")
    print(f"  PYTHONPATH={os.environ['PYTHONPATH']}")
    print()


class Runner:
    def __init__(self, formats, tests, gyp_options, verbose):
        self.formats = formats
        self.tests = tests
        self.verbose = verbose
        self.gyp_options = gyp_options
        self.failures = []
        self.num_tests = len(formats) * len(tests)
        num_digits = len(str(self.num_tests))
        self.fmt_str = "[%%%dd/%%%dd] (%%s) %%s" % (num_digits, num_digits)
        self.isatty = sys.stdout.isatty() and not self.verbose
        self.env = os.environ.copy()
        self.hpos = 0

    def run(self):
        run_start = time.time()

        i = 1
        for fmt in self.formats:
            for test in self.tests:
                self.run_test(test, fmt, i)
                i += 1

        if self.isatty:
            self.erase_current_line()

        self.took = time.time() - run_start

    def run_test(self, test, fmt, i):
        if self.isatty:
            self.erase_current_line()

        msg = self.fmt_str % (i, self.num_tests, fmt, test)
        self.print_(msg)

        start = time.time()
        cmd = [sys.executable, test] + self.gyp_options
        self.env["TESTGYP_FORMAT"] = fmt
        proc = subprocess.Popen(
            cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env=self.env
        )
        proc.wait()
        took = time.time() - start

        stdout = proc.stdout.read().decode("utf8")
        if proc.returncode == 2:
            res = "skipped"
        elif proc.returncode:
            res = "failed"
            self.failures.append(f"({test}) {fmt}")
        else:
            res = "passed"
        res_msg = f" {res} {took:.3f}s"
        self.print_(res_msg)

        if stdout and not stdout.endswith(("PASSED\n", "NO RESULT\n")):
            print()
            print("\n".join(f"    {line}" for line in stdout.splitlines()))
        elif not self.isatty:
            print()

    def print_(self, msg):
        print(msg, end="")
        index = msg.rfind("\n")
        if index == -1:
            self.hpos += len(msg)
        else:
            self.hpos = len(msg) - index
        sys.stdout.flush()

    def erase_current_line(self):
        print("\b" * self.hpos + " " * self.hpos + "\b" * self.hpos, end="")
        sys.stdout.flush()
        self.hpos = 0

    def print_results(self):
        num_failures = len(self.failures)
        if num_failures:
            print()
            if num_failures == 1:
                print("Failed the following test:")
            else:
                print("Failed the following %d tests:" % num_failures)
            print("\t" + "\n\t".join(sorted(self.failures)))
            print()
        print(
            "Ran %d tests in %.3fs, %d failed."
            % (self.num_tests, self.took, num_failures)
        )
        print()


if __name__ == "__main__":
    sys.exit(main())
pretty_vcproj:
  Usage: pretty_vcproj.py "c:\path\to\vcproj.vcproj" [key1=value1] [key2=value2]

  They key/value pair are used to resolve vsprops name.

  For example, if I want to diff the base.vcproj project:

  pretty_vcproj.py z:\dev\src-chrome\src\base\build\base.vcproj "$(SolutionDir)=z:\dev\src-chrome\src\chrome\\" "$(CHROMIUM_BUILD)=" "$(CHROME_BUILD_TYPE)=" > original.txt
  pretty_vcproj.py z:\dev\src-chrome\src\base\base_gyp.vcproj "$(SolutionDir)=z:\dev\src-chrome\src\chrome\\" "$(CHROMIUM_BUILD)=" "$(CHROME_BUILD_TYPE)=" > gyp.txt

  And you can use your favorite diff tool to see the changes.

  Note: In the case of base.vcproj, the original vcproj is one level up the generated one.
        I suggest you do a search and replace for '"..\' and replace it with '"' in original.txt
        before you perform the diff.#!/usr/bin/env python3

# Copyright (c) 2011 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Using the JSON dumped by the dump-dependency-json generator,
generate input suitable for graphviz to render a dependency graph of
targets."""


import collections
import json
import sys


def ParseTarget(target):
    target, _, suffix = target.partition("#")
    filename, _, target = target.partition(":")
    return filename, target, suffix


def LoadEdges(filename, targets):
    """Load the edges map from the dump file, and filter it to only
  show targets in |targets| and their depedendents."""

    file = open("dump.json")
    edges = json.load(file)
    file.close()

    # Copy out only the edges we're interested in from the full edge list.
    target_edges = {}
    to_visit = targets[:]
    while to_visit:
        src = to_visit.pop()
        if src in target_edges:
            continue
        target_edges[src] = edges[src]
        to_visit.extend(edges[src])

    return target_edges


def WriteGraph(edges):
    """Print a graphviz graph to stdout.
  |edges| is a map of target to a list of other targets it depends on."""

    # Bucket targets by file.
    files = collections.defaultdict(list)
    for src, dst in edges.items():
        build_file, target_name, toolset = ParseTarget(src)
        files[build_file].append(src)

    print("digraph D {")
    print("  fontsize=8")  # Used by subgraphs.
    print("  node [fontsize=8]")

    # Output nodes by file.  We must first write out each node within
    # its file grouping before writing out any edges that may refer
    # to those nodes.
    for filename, targets in files.items():
        if len(targets) == 1:
            # If there's only one node for this file, simplify
            # the display by making it a box without an internal node.
            target = targets[0]
            build_file, target_name, toolset = ParseTarget(target)
            print(
                f'  "{target}" [shape=box, label="{filename}\\n{target_name}"]'
            )
        else:
            # Group multiple nodes together in a subgraph.
            print('  subgraph "cluster_%s" {' % filename)
            print('    label = "%s"' % filename)
            for target in targets:
                build_file, target_name, toolset = ParseTarget(target)
                print(f'    "{target}" [label="{target_name}"]')
            print("  }")

    # Now that we've placed all the nodes within subgraphs, output all
    # the edges between nodes.
    for src, dsts in edges.items():
        for dst in dsts:
            print(f'  "{src}" -> "{dst}"')

    print("}")


def main():
    if len(sys.argv) < 2:
        print(__doc__, file=sys.stderr)
        print(file=sys.stderr)
        print("usage: %s target1 target2..." % (sys.argv[0]), file=sys.stderr)
        return 1

    edges = LoadEdges("dump.json", sys.argv[1:])

    WriteGraph(edges)
    return 0


if __name__ == "__main__":
    sys.exit(main())
#!/usr/bin/env python3

# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Pretty-prints the contents of a GYP file."""


import sys
import re


# Regex to remove comments when we're counting braces.
COMMENT_RE = re.compile(r"\s*#.*")

# Regex to remove quoted strings when we're counting braces.
# It takes into account quoted quotes, and makes sure that the quotes match.
# NOTE: It does not handle quotes that span more than one line, or
# cases where an escaped quote is preceded by an escaped backslash.
QUOTE_RE_STR = r'(?P<q>[\'"])(.*?)(?<![^\\][\\])(?P=q)'
QUOTE_RE = re.compile(QUOTE_RE_STR)


def comment_replace(matchobj):
    return matchobj.group(1) + matchobj.group(2) + "#" * len(matchobj.group(3))


def mask_comments(input):
    """Mask the quoted strings so we skip braces inside quoted strings."""
    search_re = re.compile(r"(.*?)(#)(.*)")
    return [search_re.sub(comment_replace, line) for line in input]


def quote_replace(matchobj):
    return "{}{}{}{}".format(
        matchobj.group(1),
        matchobj.group(2),
        "x" * len(matchobj.group(3)),
        matchobj.group(2),
    )


def mask_quotes(input):
    """Mask the quoted strings so we skip braces inside quoted strings."""
    search_re = re.compile(r"(.*?)" + QUOTE_RE_STR)
    return [search_re.sub(quote_replace, line) for line in input]


def do_split(input, masked_input, search_re):
    output = []
    mask_output = []
    for (line, masked_line) in zip(input, masked_input):
        m = search_re.match(masked_line)
        while m:
            split = len(m.group(1))
            line = line[:split] + r"\n" + line[split:]
            masked_line = masked_line[:split] + r"\n" + masked_line[split:]
            m = search_re.match(masked_line)
        output.extend(line.split(r"\n"))
        mask_output.extend(masked_line.split(r"\n"))
    return (output, mask_output)


def split_double_braces(input):
    """Masks out the quotes and comments, and then splits appropriate
  lines (lines that matche the double_*_brace re's above) before
  indenting them below.

  These are used to split lines which have multiple braces on them, so
  that the indentation looks prettier when all laid out (e.g. closing
  braces make a nice diagonal line).
  """
    double_open_brace_re = re.compile(r"(.*?[\[\{\(,])(\s*)([\[\{\(])")
    double_close_brace_re = re.compile(r"(.*?[\]\}\)],?)(\s*)([\]\}\)])")

    masked_input = mask_quotes(input)
    masked_input = mask_comments(masked_input)

    (output, mask_output) = do_split(input, masked_input, double_open_brace_re)
    (output, mask_output) = do_split(output, mask_output, double_close_brace_re)

    return output


def count_braces(line):
    """keeps track of the number of braces on a given line and returns the result.

  It starts at zero and subtracts for closed braces, and adds for open braces.
  """
    open_braces = ["[", "(", "{"]
    close_braces = ["]", ")", "}"]
    closing_prefix_re = re.compile(r"(.*?[^\s\]\}\)]+.*?)([\]\}\)],?)\s*$")
    cnt = 0
    stripline = COMMENT_RE.sub(r"", line)
    stripline = QUOTE_RE.sub(r"''", stripline)
    for char in stripline:
        for brace in open_braces:
            if char == brace:
                cnt += 1
        for brace in close_braces:
            if char == brace:
                cnt -= 1

    after = False
    if cnt > 0:
        after = True

    # This catches the special case of a closing brace having something
    # other than just whitespace ahead of it -- we don't want to
    # unindent that until after this line is printed so it stays with
    # the previous indentation level.
    if cnt < 0 and closing_prefix_re.match(stripline):
        after = True
    return (cnt, after)


def prettyprint_input(lines):
    """Does the main work of indenting the input based on the brace counts."""
    indent = 0
    basic_offset = 2
    for line in lines:
        if COMMENT_RE.match(line):
            print(line)
        else:
            line = line.strip("\r\n\t ")  # Otherwise doesn't strip \r on Unix.
            if len(line) > 0:
                (brace_diff, after) = count_braces(line)
                if brace_diff != 0:
                    if after:
                        print(" " * (basic_offset * indent) + line)
                        indent += brace_diff
                    else:
                        indent += brace_diff
                        print(" " * (basic_offset * indent) + line)
                else:
                    print(" " * (basic_offset * indent) + line)
            else:
                print("")


def main():
    if len(sys.argv) > 1:
        data = open(sys.argv[1]).read().splitlines()
    else:
        data = sys.stdin.read().splitlines()
    # Split up the double braces.
    lines = split_double_braces(data)

    # Indent and print the output.
    prettyprint_input(lines)
    return 0


if __name__ == "__main__":
    sys.exit(main())
#!/usr/bin/env python3

# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Prints the information in a sln file in a diffable way.

   It first outputs each projects in alphabetical order with their
   dependencies.

   Then it outputs a possible build order.
"""


import os
import re
import sys
import pretty_vcproj

__author__ = "nsylvain (Nicolas Sylvain)"


def BuildProject(project, built, projects, deps):
    # if all dependencies are done, we can build it, otherwise we try to build the
    # dependency.
    # This is not infinite-recursion proof.
    for dep in deps[project]:
        if dep not in built:
            BuildProject(dep, built, projects, deps)
    print(project)
    built.append(project)


def ParseSolution(solution_file):
    # All projects, their clsid and paths.
    projects = dict()

    # A list of dependencies associated with a project.
    dependencies = dict()

    # Regular expressions that matches the SLN format.
    # The first line of a project definition.
    begin_project = re.compile(
        r'^Project\("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942'
        r'}"\) = "(.*)", "(.*)", "(.*)"$'
    )
    # The last line of a project definition.
    end_project = re.compile("^EndProject$")
    # The first line of a dependency list.
    begin_dep = re.compile(r"ProjectSection\(ProjectDependencies\) = postProject$")
    # The last line of a dependency list.
    end_dep = re.compile("EndProjectSection$")
    # A line describing a dependency.
    dep_line = re.compile(" *({.*}) = ({.*})$")

    in_deps = False
    solution = open(solution_file)
    for line in solution:
        results = begin_project.search(line)
        if results:
            # Hack to remove icu because the diff is too different.
            if results.group(1).find("icu") != -1:
                continue
            # We remove "_gyp" from the names because it helps to diff them.
            current_project = results.group(1).replace("_gyp", "")
            projects[current_project] = [
                results.group(2).replace("_gyp", ""),
                results.group(3),
                results.group(2),
            ]
            dependencies[current_project] = []
            continue

        results = end_project.search(line)
        if results:
            current_project = None
            continue

        results = begin_dep.search(line)
        if results:
            in_deps = True
            continue

        results = end_dep.search(line)
        if results:
            in_deps = False
            continue

        results = dep_line.search(line)
        if results and in_deps and current_project:
            dependencies[current_project].append(results.group(1))
            continue

    # Change all dependencies clsid to name instead.
    for project in dependencies:
        # For each dependencies in this project
        new_dep_array = []
        for dep in dependencies[project]:
            # Look for the project name matching this cldis
            for project_info in projects:
                if projects[project_info][1] == dep:
                    new_dep_array.append(project_info)
        dependencies[project] = sorted(new_dep_array)

    return (projects, dependencies)


def PrintDependencies(projects, deps):
    print("---------------------------------------")
    print("Dependencies for all projects")
    print("---------------------------------------")
    print("--                                   --")

    for (project, dep_list) in sorted(deps.items()):
        print("Project : %s" % project)
        print("Path : %s" % projects[project][0])
        if dep_list:
            for dep in dep_list:
                print("  - %s" % dep)
        print("")

    print("--                                   --")


def PrintBuildOrder(projects, deps):
    print("---------------------------------------")
    print("Build order                            ")
    print("---------------------------------------")
    print("--                                   --")

    built = []
    for (project, _) in sorted(deps.items()):
        if project not in built:
            BuildProject(project, built, projects, deps)

    print("--                                   --")


def PrintVCProj(projects):

    for project in projects:
        print("-------------------------------------")
        print("-------------------------------------")
        print(project)
        print(project)
        print(project)
        print("-------------------------------------")
        print("-------------------------------------")

        project_path = os.path.abspath(
            os.path.join(os.path.dirname(sys.argv[1]), projects[project][2])
        )

        pretty = pretty_vcproj
        argv = [
            "",
            project_path,
            "$(SolutionDir)=%s\\" % os.path.dirname(sys.argv[1]),
        ]
        argv.extend(sys.argv[3:])
        pretty.main(argv)


def main():
    # check if we have exactly 1 parameter.
    if len(sys.argv) < 2:
        print('Usage: %s "c:\\path\\to\\project.sln"' % sys.argv[0])
        return 1

    (projects, deps) = ParseSolution(sys.argv[1])
    PrintDependencies(projects, deps)
    PrintBuildOrder(projects, deps)

    if "--recursive" in sys.argv:
        PrintVCProj(projects)
    return 0


if __name__ == "__main__":
    sys.exit(main())
#!/usr/bin/env python3

# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Make the format of a vcproj really pretty.

   This script normalize and sort an xml. It also fetches all the properties
   inside linked vsprops and include them explicitly in the vcproj.

   It outputs the resulting xml to stdout.
"""


import os
import sys

from xml.dom.minidom import parse
from xml.dom.minidom import Node

__author__ = "nsylvain (Nicolas Sylvain)"
ARGUMENTS = None
REPLACEMENTS = dict()


def cmp(x, y):
    return (x > y) - (x < y)


class CmpTuple:
    """Compare function between 2 tuple."""

    def __call__(self, x, y):
        return cmp(x[0], y[0])


class CmpNode:
    """Compare function between 2 xml nodes."""

    def __call__(self, x, y):
        def get_string(node):
            node_string = "node"
            node_string += node.nodeName
            if node.nodeValue:
                node_string += node.nodeValue

            if node.attributes:
                # We first sort by name, if present.
                node_string += node.getAttribute("Name")

                all_nodes = []
                for (name, value) in node.attributes.items():
                    all_nodes.append((name, value))

                all_nodes.sort(CmpTuple())
                for (name, value) in all_nodes:
                    node_string += name
                    node_string += value

            return node_string

        return cmp(get_string(x), get_string(y))


def PrettyPrintNode(node, indent=0):
    if node.nodeType == Node.TEXT_NODE:
        if node.data.strip():
            print("{}{}".format(" " * indent, node.data.strip()))
        return

    if node.childNodes:
        node.normalize()
    # Get the number of attributes
    attr_count = 0
    if node.attributes:
        attr_count = node.attributes.length

    # Print the main tag
    if attr_count == 0:
        print("{}<{}>".format(" " * indent, node.nodeName))
    else:
        print("{}<{}".format(" " * indent, node.nodeName))

        all_attributes = []
        for (name, value) in node.attributes.items():
            all_attributes.append((name, value))
            all_attributes.sort(CmpTuple())
        for (name, value) in all_attributes:
            print('{}  {}="{}"'.format(" " * indent, name, value))
        print("%s>" % (" " * indent))
    if node.nodeValue:
        print("{}  {}".format(" " * indent, node.nodeValue))

    for sub_node in node.childNodes:
        PrettyPrintNode(sub_node, indent=indent + 2)
    print("{}</{}>".format(" " * indent, node.nodeName))


def FlattenFilter(node):
    """Returns a list of all the node and sub nodes."""
    node_list = []

    if node.attributes and node.getAttribute("Name") == "_excluded_files":
        # We don't add the "_excluded_files" filter.
        return []

    for current in node.childNodes:
        if current.nodeName == "Filter":
            node_list.extend(FlattenFilter(current))
        else:
            node_list.append(current)

    return node_list


def FixFilenames(filenames, current_directory):
    new_list = []
    for filename in filenames:
        if filename:
            for key in REPLACEMENTS:
                filename = filename.replace(key, REPLACEMENTS[key])
            os.chdir(current_directory)
            filename = filename.strip("\"' ")
            if filename.startswith("$"):
                new_list.append(filename)
            else:
                new_list.append(os.path.abspath(filename))
    return new_list


def AbsoluteNode(node):
    """Makes all the properties we know about in this node absolute."""
    if node.attributes:
        for (name, value) in node.attributes.items():
            if name in [
                "InheritedPropertySheets",
                "RelativePath",
                "AdditionalIncludeDirectories",
                "IntermediateDirectory",
                "OutputDirectory",
                "AdditionalLibraryDirectories",
            ]:
                # We want to fix up these paths
                path_list = value.split(";")
                new_list = FixFilenames(path_list, os.path.dirname(ARGUMENTS[1]))
                node.setAttribute(name, ";".join(new_list))
            if not value:
                node.removeAttribute(name)


def CleanupVcproj(node):
    """For each sub node, we call recursively this function."""
    for sub_node in node.childNodes:
        AbsoluteNode(sub_node)
        CleanupVcproj(sub_node)

    # Normalize the node, and remove all extraneous whitespaces.
    for sub_node in node.childNodes:
        if sub_node.nodeType == Node.TEXT_NODE:
            sub_node.data = sub_node.data.replace("\r", "")
            sub_node.data = sub_node.data.replace("\n", "")
            sub_node.data = sub_node.data.rstrip()

    # Fix all the semicolon separated attributes to be sorted, and we also
    # remove the dups.
    if node.attributes:
        for (name, value) in node.attributes.items():
            sorted_list = sorted(value.split(";"))
            unique_list = []
            for i in sorted_list:
                if not unique_list.count(i):
                    unique_list.append(i)
            node.setAttribute(name, ";".join(unique_list))
            if not value:
                node.removeAttribute(name)

    if node.childNodes:
        node.normalize()

    # For each node, take a copy, and remove it from the list.
    node_array = []
    while node.childNodes and node.childNodes[0]:
        # Take a copy of the node and remove it from the list.
        current = node.childNodes[0]
        node.removeChild(current)

        # If the child is a filter, we want to append all its children
        # to this same list.
        if current.nodeName == "Filter":
            node_array.extend(FlattenFilter(current))
        else:
            node_array.append(current)

    # Sort the list.
    node_array.sort(CmpNode())

    # Insert the nodes in the correct order.
    for new_node in node_array:
        # But don't append empty tool node.
        if new_node.nodeName == "Tool":
            if new_node.attributes and new_node.attributes.length == 1:
                # This one was empty.
                continue
        if new_node.nodeName == "UserMacro":
            continue
        node.appendChild(new_node)


def GetConfiguationNodes(vcproj):
    # TODO(nsylvain): Find a better way to navigate the xml.
    nodes = []
    for node in vcproj.childNodes:
        if node.nodeName == "Configurations":
            for sub_node in node.childNodes:
                if sub_node.nodeName == "Configuration":
                    nodes.append(sub_node)

    return nodes


def GetChildrenVsprops(filename):
    dom = parse(filename)
    if dom.documentElement.attributes:
        vsprops = dom.documentElement.getAttribute("InheritedPropertySheets")
        return FixFilenames(vsprops.split(";"), os.path.dirname(filename))
    return []


def SeekToNode(node1, child2):
    # A text node does not have properties.
    if child2.nodeType == Node.TEXT_NODE:
        return None

    # Get the name of the current node.
    current_name = child2.getAttribute("Name")
    if not current_name:
        # There is no name. We don't know how to merge.
        return None

    # Look through all the nodes to find a match.
    for sub_node in node1.childNodes:
        if sub_node.nodeName == child2.nodeName:
            name = sub_node.getAttribute("Name")
            if name == current_name:
                return sub_node

    # No match. We give up.
    return None


def MergeAttributes(node1, node2):
    # No attributes to merge?
    if not node2.attributes:
        return

    for (name, value2) in node2.attributes.items():
        # Don't merge the 'Name' attribute.
        if name == "Name":
            continue
        value1 = node1.getAttribute(name)
        if value1:
            # The attribute exist in the main node. If it's equal, we leave it
            # untouched, otherwise we concatenate it.
            if value1 != value2:
                node1.setAttribute(name, ";".join([value1, value2]))
        else:
            # The attribute does not exist in the main node. We append this one.
            node1.setAttribute(name, value2)

        # If the attribute was a property sheet attributes, we remove it, since
        # they are useless.
        if name == "InheritedPropertySheets":
            node1.removeAttribute(name)


def MergeProperties(node1, node2):
    MergeAttributes(node1, node2)
    for child2 in node2.childNodes:
        child1 = SeekToNode(node1, child2)
        if child1:
            MergeProperties(child1, child2)
        else:
            node1.appendChild(child2.cloneNode(True))


def main(argv):
    """Main function of this vcproj prettifier."""
    global ARGUMENTS
    ARGUMENTS = argv

    # check if we have exactly 1 parameter.
    if len(argv) < 2:
        print(
            'Usage: %s "c:\\path\\to\\vcproj.vcproj" [key1=value1] '
            "[key2=value2]" % argv[0]
        )
        return 1

    # Parse the keys
    for i in range(2, len(argv)):
        (key, value) = argv[i].split("=")
        REPLACEMENTS[key] = value

    # Open the vcproj and parse the xml.
    dom = parse(argv[1])

    # First thing we need to do is find the Configuration Node and merge them
    # with the vsprops they include.
    for configuration_node in GetConfiguationNodes(dom.documentElement):
        # Get the property sheets associated with this configuration.
        vsprops = configuration_node.getAttribute("InheritedPropertySheets")

        # Fix the filenames to be absolute.
        vsprops_list = FixFilenames(
            vsprops.strip().split(";"), os.path.dirname(argv[1])
        )

        # Extend the list of vsprops with all vsprops contained in the current
        # vsprops.
        for current_vsprops in vsprops_list:
            vsprops_list.extend(GetChildrenVsprops(current_vsprops))

        # Now that we have all the vsprops, we need to merge them.
        for current_vsprops in vsprops_list:
            MergeProperties(configuration_node, parse(current_vsprops).documentElement)

    # Now that everything is merged, we need to cleanup the xml.
    CleanupVcproj(dom.documentElement)

    # Finally, we use the prett xml function to print the vcproj back to the
    # user.
    # print dom.toprettyxml(newl="\n")
    PrettyPrintNode(dom.documentElement)
    return 0


if __name__ == "__main__":
    sys.exit(main(sys.argv))
How to install gyp-mode for emacs:

Add the following to your ~/.emacs (replace ... with the path to your gyp
checkout).

(setq load-path (cons ".../tools/emacs" load-path))
(require 'gyp)

Restart emacs (or eval-region the added lines) and you should be all set.

Please note that ert is required for running the tests, which is included in
Emacs 24, or available separately from https://github.com/ohler/ert
;;; gyp-tests.el - unit tests for gyp-mode.

;; Copyright (c) 2012 Google Inc. All rights reserved.
;; Use of this source code is governed by a BSD-style license that can be
;; found in the LICENSE file.

;; The recommended way to run these tests is to run them from the command-line,
;; with the run-unit-tests.sh script.

(require 'cl)
(require 'ert)
(require 'gyp)

(defconst samples (directory-files "testdata" t ".gyp$")
  "List of golden samples to check")

(defun fontify (filename)
  (with-temp-buffer
    (insert-file-contents-literally filename)
    (gyp-mode)
    (font-lock-fontify-buffer)
    (buffer-string)))

(defun read-golden-sample (filename)
  (with-temp-buffer
    (insert-file-contents-literally (concat filename ".fontified"))
    (read (current-buffer))))

(defun equivalent-face (face)
  "For the purposes of face comparison, we're not interested in the
   differences between certain faces. For example, the difference between
   font-lock-comment-delimiter and font-lock-comment-face."
  (cl-case face
    ((font-lock-comment-delimiter-face) font-lock-comment-face)
    (t face)))

(defun text-face-properties (s)
  "Extract the text properties from s"
  (let ((result (list t)))
    (dotimes (i (length s))
      (setq result (cons (equivalent-face (get-text-property i 'face s))
                         result)))
    (nreverse result)))

(ert-deftest test-golden-samples ()
  "Check that fontification produces the same results as the golden samples"
  (dolist (sample samples)
    (let ((golden (read-golden-sample sample))
          (fontified (fontify sample)))
      (should (equal golden fontified))
      (should (equal (text-face-properties golden)
                     (text-face-properties fontified))))))

(defun create-golden-sample (filename)
  "Create a golden sample by fontifying filename and writing out the printable
   representation of the fontified buffer (with text properties) to the
   FILENAME.fontified"
  (with-temp-file (concat filename ".fontified")
    (print (fontify filename) (current-buffer))))

(defun create-golden-samples ()
  "Recreate the golden samples"
  (dolist (sample samples) (create-golden-sample sample)))
;;; gyp.el - font-lock-mode support for gyp files.

;; Copyright (c) 2012 Google Inc. All rights reserved.
;; Use of this source code is governed by a BSD-style license that can be
;; found in the LICENSE file.

;; Put this somewhere in your load-path and
;; (require 'gyp)

(require 'python)
(require 'cl)

(when (string-match "python-mode.el" (symbol-file 'python-mode 'defun))
  (error (concat "python-mode must be loaded from python.el (bundled with "
                 "recent emacsen), not from the older and less maintained "
                 "python-mode.el")))

(defadvice python-indent-calculate-levels (after gyp-outdent-closing-parens
                                                 activate)
  "De-indent closing parens, braces, and brackets in gyp-mode."
  (when (and (eq major-mode 'gyp-mode)
             (string-match "^ *[])}][],)}]* *$"
                           (buffer-substring-no-properties
                            (line-beginning-position) (line-end-position))))
    (setf (first python-indent-levels)
          (- (first python-indent-levels) python-continuation-offset))))

(defadvice python-indent-guess-indent-offset (around
                                              gyp-indent-guess-indent-offset
                                              activate)
  "Guess correct indent offset in gyp-mode."
  (or (and (not (eq major-mode 'gyp-mode))
           ad-do-it)
      (save-excursion
        (save-restriction
          (widen)
          (goto-char (point-min))
          ;; Find first line ending with an opening brace that is not a comment.
          (or (and (re-search-forward "\\(^[[{]$\\|^.*[^#].*[[{]$\\)")
                   (forward-line)
                   (/= (current-indentation) 0)
                   (set (make-local-variable 'python-indent-offset)
                        (current-indentation))
                   (set (make-local-variable 'python-continuation-offset)
                        (current-indentation)))
              (message "Can't guess gyp indent offset, using default: %s"
                       python-continuation-offset))))))

(define-derived-mode gyp-mode python-mode "Gyp"
  "Major mode for editing .gyp files. See http://code.google.com/p/gyp/"
  ;; gyp-parse-history is a stack of (POSITION . PARSE-STATE) tuples,
  ;; with greater positions at the top of the stack. PARSE-STATE
  ;; is a list of section symbols (see gyp-section-name and gyp-parse-to)
  ;; with most nested section symbol at the front of the list.
  (set (make-local-variable 'gyp-parse-history) '((1 . (list))))
  (gyp-add-font-lock-keywords))

(defun gyp-set-indentation ()
  "Hook function to configure python indentation to suit gyp mode."
  (set (make-local-variable 'python-indent-offset) 2)
  (set (make-local-variable 'python-continuation-offset) 2)
  (set (make-local-variable 'python-indent-guess-indent-offset) t)
  (python-indent-guess-indent-offset))

(add-hook 'gyp-mode-hook 'gyp-set-indentation)

(add-to-list 'auto-mode-alist '("\\.gyp\\'" . gyp-mode))
(add-to-list 'auto-mode-alist '("\\.gypi\\'" . gyp-mode))
(add-to-list 'auto-mode-alist '("/\\.gclient\\'" . gyp-mode))

;;; Font-lock support

(defconst gyp-dependencies-regexp
  (regexp-opt (list "dependencies" "export_dependent_settings"))
  "Regular expression to introduce 'dependencies' section")

(defconst gyp-sources-regexp
  (regexp-opt (list "action" "files" "include_dirs" "includes" "inputs"
                    "libraries" "outputs" "sources"))
  "Regular expression to introduce 'sources' sections")

(defconst gyp-conditions-regexp
  (regexp-opt (list "conditions" "target_conditions"))
  "Regular expression to introduce conditions sections")

(defconst gyp-variables-regexp
  "^variables"
  "Regular expression to introduce variables sections")

(defconst gyp-defines-regexp
  "^defines"
  "Regular expression to introduce 'defines' sections")

(defconst gyp-targets-regexp
  "^targets"
  "Regular expression to introduce 'targets' sections")

(defun gyp-section-name (section)
  "Map the sections we are interested in from SECTION to symbol.

   SECTION is a string from the buffer that introduces a section.  The result is
   a symbol representing the kind of section.

   This allows us to treat (for the purposes of font-lock) several different
   section names as the same kind of section. For example, a 'sources section
   can be introduced by the 'sources', 'inputs', 'outputs' keyword.

   'other is the default section kind when a more specific match is not made."
  (cond ((string-match-p gyp-dependencies-regexp section) 'dependencies)
        ((string-match-p gyp-sources-regexp section) 'sources)
        ((string-match-p gyp-variables-regexp section) 'variables)
        ((string-match-p gyp-conditions-regexp section) 'conditions)
        ((string-match-p gyp-targets-regexp section) 'targets)
        ((string-match-p gyp-defines-regexp section) 'defines)
        (t 'other)))

(defun gyp-invalidate-parse-states-after (target-point)
  "Erase any parse information after target-point."
  (while (> (caar gyp-parse-history) target-point)
    (setq gyp-parse-history (cdr gyp-parse-history))))

(defun gyp-parse-point ()
  "The point of the last parse state added by gyp-parse-to."
  (caar gyp-parse-history))

(defun gyp-parse-sections ()
  "A list of section symbols holding at the last parse state point."
  (cdar gyp-parse-history))

(defun gyp-inside-dictionary-p ()
  "Predicate returning true if the parser is inside a dictionary."
  (not (eq (cadar gyp-parse-history) 'list)))

(defun gyp-add-parse-history (point sections)
  "Add parse state SECTIONS to the parse history at POINT so that parsing can be
   resumed instantly."
  (while (>= (caar gyp-parse-history) point)
    (setq gyp-parse-history (cdr gyp-parse-history)))
  (setq gyp-parse-history (cons (cons point sections) gyp-parse-history)))

(defun gyp-parse-to (target-point)
  "Parses from (point) to TARGET-POINT adding the parse state information to
   gyp-parse-state-history. Parsing stops if TARGET-POINT is reached or if a
   string literal has been parsed. Returns nil if no further parsing can be
   done, otherwise returns the position of the start of a parsed string, leaving
   the point at the end of the string."
  (let ((parsing t)
        string-start)
    (while parsing
      (setq string-start nil)
      ;; Parse up to a character that starts a sexp, or if the nesting
      ;; level decreases.
      (let ((state (parse-partial-sexp (gyp-parse-point)
                                       target-point
                                       -1
                                       t))
            (sections (gyp-parse-sections)))
        (if (= (nth 0 state) -1)
            (setq sections (cdr sections)) ; pop out a level
          (cond ((looking-at-p "['\"]") ; a string
                 (setq string-start (point))
                 (goto-char (scan-sexps (point) 1))
                 (if (gyp-inside-dictionary-p)
                     ;; Look for sections inside a dictionary
                     (let ((section (gyp-section-name
                                     (buffer-substring-no-properties
                                      (+ 1 string-start)
                                      (- (point) 1)))))
                       (setq sections (cons section (cdr sections)))))
                 ;; Stop after the string so it can be fontified.
                 (setq target-point (point)))
                ((looking-at-p "{")
                 ;; Inside a dictionary. Increase nesting.
                 (forward-char 1)
                 (setq sections (cons 'unknown sections)))
                ((looking-at-p "\\[")
                 ;; Inside a list. Increase nesting
                 (forward-char 1)
                 (setq sections (cons 'list sections)))
                ((not (eobp))
                 ;; other
                 (forward-char 1))))
        (gyp-add-parse-history (point) sections)
        (setq parsing (< (point) target-point))))
    string-start))

(defun gyp-section-at-point ()
  "Transform the last parse state, which is a list of nested sections and return
   the section symbol that should be used to determine font-lock information for
   the string. Can return nil indicating the string should not have any attached
   section."
  (let ((sections (gyp-parse-sections)))
    (cond
     ((eq (car sections) 'conditions)
      ;; conditions can occur in a variables section, but we still want to
      ;; highlight it as a keyword.
      nil)
     ((and (eq (car sections) 'list)
           (eq (cadr sections) 'list))
      ;; conditions and sources can have items in [[ ]]
      (caddr sections))
     (t (cadr sections)))))

(defun gyp-section-match (limit)
  "Parse from (point) to LIMIT returning by means of match data what was
   matched. The group of the match indicates what style font-lock should apply.
   See also `gyp-add-font-lock-keywords'."
  (gyp-invalidate-parse-states-after (point))
  (let ((group nil)
        (string-start t))
    (while (and (< (point) limit)
                (not group)
                string-start)
      (setq string-start (gyp-parse-to limit))
      (if string-start
          (setq group (cl-case (gyp-section-at-point)
                        ('dependencies 1)
                        ('variables 2)
                        ('conditions 2)
                        ('sources 3)
                        ('defines 4)
                        (nil nil)))))
    (if group
        (progn
          ;; Set the match data to indicate to the font-lock mechanism the
          ;; highlighting to be performed.
          (set-match-data (append (list string-start (point))
                                  (make-list (* (1- group) 2) nil)
                                  (list (1+ string-start) (1- (point)))))
          t))))

;;; Please see http://code.google.com/p/gyp/wiki/GypLanguageSpecification for
;;; canonical list of keywords.
(defun gyp-add-font-lock-keywords ()
  "Add gyp-mode keywords to font-lock mechanism."
  ;; TODO(jknotten): Move all the keyword highlighting into gyp-section-match
  ;; so that we can do the font-locking in a single font-lock pass.
  (font-lock-add-keywords
   nil
   (list
    ;; Top-level keywords
    (list (concat "['\"]\\("
              (regexp-opt (list "action" "action_name" "actions" "cflags"
                                "cflags_cc" "conditions" "configurations"
                                "copies" "defines" "dependencies" "destination"
                                "direct_dependent_settings"
                                "export_dependent_settings" "extension" "files"
                                "include_dirs" "includes" "inputs" "ldflags" "libraries"
                                "link_settings" "mac_bundle" "message"
                                "msvs_external_rule" "outputs" "product_name"
                                "process_outputs_as_sources" "rules" "rule_name"
                                "sources" "suppress_wildcard"
                                "target_conditions" "target_defaults"
                                "target_defines" "target_name" "toolsets"
                                "targets" "type" "variables" "xcode_settings"))
              "[!/+=]?\\)") 1 'font-lock-keyword-face t)
    ;; Type of target
    (list (concat "['\"]\\("
              (regexp-opt (list "loadable_module" "static_library"
                                "shared_library" "executable" "none"))
              "\\)") 1 'font-lock-type-face t)
    (list "\\(?:target\\|action\\)_name['\"]\\s-*:\\s-*['\"]\\([^ '\"]*\\)" 1
          'font-lock-function-name-face t)
    (list 'gyp-section-match
          (list 1 'font-lock-function-name-face t t) ; dependencies
          (list 2 'font-lock-variable-name-face t t) ; variables, conditions
          (list 3 'font-lock-constant-face t t) ; sources
          (list 4 'font-lock-preprocessor-face t t)) ; preprocessor
    ;; Variable expansion
    (list "<@?(\\([^\n )]+\\))" 1 'font-lock-variable-name-face t)
    ;; Command expansion
    (list "<!@?(\\([^\n )]+\\))" 1 'font-lock-variable-name-face t)
    )))

(provide 'gyp)
#!/bin/sh
# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
emacs --no-site-file --no-init-file --batch \
      --load ert.el --load gyp.el --load gyp-tests.el \
      -f ert-run-tests-batch-and-exit
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

{
  'variables': {
    'chromium_code': 1,
    # Override to dynamically link the PulseAudio library.
    'use_pulseaudio%': 0,
    # Override to dynamically link the cras (ChromeOS audio) library.
    'use_cras%': 0,
  },
  'targets': [
    {
      'target_name': 'media',
      'type': '<(component)',
      'dependencies': [
        'yuv_convert',
        '../base/base.gyp:base',
        '../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
        '../build/temp_gyp/googleurl.gyp:googleurl',
        '../crypto/crypto.gyp:crypto',
        '../third_party/openmax/openmax.gyp:il',
        '../ui/ui.gyp:ui',
      ],
      'defines': [
        'MEDIA_IMPLEMENTATION',
      ],
      'include_dirs': [
        '..',
      ],
      'sources': [
        'audio/android/audio_manager_android.cc',
        'audio/android/audio_manager_android.h',
        'audio/android/audio_track_output_android.cc',
        'audio/android/audio_track_output_android.h',
        'audio/android/opensles_input.cc',
        'audio/android/opensles_input.h',
        'audio/android/opensles_output.cc',
        'audio/android/opensles_output.h',
        'audio/async_socket_io_handler.h',
        'audio/async_socket_io_handler_posix.cc',
        'audio/async_socket_io_handler_win.cc',
        'audio/audio_buffers_state.cc',
        'audio/audio_buffers_state.h',
        'audio/audio_io.h',
        'audio/audio_input_controller.cc',
        'audio/audio_input_controller.h',
        'audio/audio_input_stream_impl.cc',
        'audio/audio_input_stream_impl.h',
        'audio/audio_device_name.cc',
        'audio/audio_device_name.h',
        'audio/audio_manager.cc',
        'audio/audio_manager.h',
        'audio/audio_manager_base.cc',
        'audio/audio_manager_base.h',
        'audio/audio_output_controller.cc',
        'audio/audio_output_controller.h',
        'audio/audio_output_dispatcher.cc',
        'audio/audio_output_dispatcher.h',
        'audio/audio_output_dispatcher_impl.cc',
        'audio/audio_output_dispatcher_impl.h',
        'audio/audio_output_mixer.cc',
        'audio/audio_output_mixer.h',
        'audio/audio_output_proxy.cc',
        'audio/audio_output_proxy.h',
        'audio/audio_parameters.cc',
        'audio/audio_parameters.h',
        'audio/audio_util.cc',
        'audio/audio_util.h',
        'audio/cross_process_notification.cc',
        'audio/cross_process_notification.h',
        'audio/cross_process_notification_win.cc',
        'audio/cross_process_notification_posix.cc',
        'audio/fake_audio_input_stream.cc',
        'audio/fake_audio_input_stream.h',
        'audio/fake_audio_output_stream.cc',
        'audio/fake_audio_output_stream.h',
        'audio/linux/audio_manager_linux.cc',
        'audio/linux/audio_manager_linux.h',
        'audio/linux/alsa_input.cc',
        'audio/linux/alsa_input.h',
        'audio/linux/alsa_output.cc',
        'audio/linux/alsa_output.h',
        'audio/linux/alsa_util.cc',
        'audio/linux/alsa_util.h',
        'audio/linux/alsa_wrapper.cc',
        'audio/linux/alsa_wrapper.h',
        'audio/linux/cras_output.cc',
        'audio/linux/cras_output.h',
        'audio/openbsd/audio_manager_openbsd.cc',
        'audio/openbsd/audio_manager_openbsd.h',
        'audio/mac/audio_input_mac.cc',
        'audio/mac/audio_input_mac.h',
        'audio/mac/audio_low_latency_input_mac.cc',
        'audio/mac/audio_low_latency_input_mac.h',
        'audio/mac/audio_low_latency_output_mac.cc',
        'audio/mac/audio_low_latency_output_mac.h',
        'audio/mac/audio_manager_mac.cc',
        'audio/mac/audio_manager_mac.h',
        'audio/mac/audio_output_mac.cc',
        'audio/mac/audio_output_mac.h',
        'audio/null_audio_sink.cc',
        'audio/null_audio_sink.h',
        'audio/pulse/pulse_output.cc',
        'audio/pulse/pulse_output.h',
        'audio/sample_rates.cc',
        'audio/sample_rates.h',
        'audio/simple_sources.cc',
        'audio/simple_sources.h',
        'audio/win/audio_low_latency_input_win.cc',
        'audio/win/audio_low_latency_input_win.h',
        'audio/win/audio_low_latency_output_win.cc',
        'audio/win/audio_low_latency_output_win.h',
        'audio/win/audio_manager_win.cc',
        'audio/win/audio_manager_win.h',
        'audio/win/avrt_wrapper_win.cc',
        'audio/win/avrt_wrapper_win.h',
        'audio/win/device_enumeration_win.cc',
        'audio/win/device_enumeration_win.h',
        'audio/win/wavein_input_win.cc',
        'audio/win/wavein_input_win.h',
        'audio/win/waveout_output_win.cc',
        'audio/win/waveout_output_win.h',
        'base/android/media_jni_registrar.cc',
        'base/android/media_jni_registrar.h',
        'base/audio_decoder.cc',
        'base/audio_decoder.h',
        'base/audio_decoder_config.cc',
        'base/audio_decoder_config.h',
        'base/audio_renderer.h',
        'base/audio_renderer_mixer.cc',
        'base/audio_renderer_mixer.h',
        'base/audio_renderer_mixer_input.cc',
        'base/audio_renderer_mixer_input.h',
        'base/bitstream_buffer.h',
        'base/buffers.cc',
        'base/buffers.h',
        'base/byte_queue.cc',
        'base/byte_queue.h',
        'base/channel_layout.cc',
        'base/channel_layout.h',
        'base/clock.cc',
        'base/clock.h',
        'base/composite_filter.cc',
        'base/composite_filter.h',
        'base/data_buffer.cc',
        'base/data_buffer.h',
        'base/data_source.cc',
        'base/data_source.h',
        'base/decoder_buffer.cc',
        'base/decoder_buffer.h',
        'base/decrypt_config.cc',
        'base/decrypt_config.h',
        'base/decryptor.h',
        'base/decryptor_client.h',
        'base/demuxer.cc',
        'base/demuxer.h',
        'base/demuxer_stream.cc',
        'base/demuxer_stream.h',
        'base/djb2.cc',
        'base/djb2.h',
        'base/filter_collection.cc',
        'base/filter_collection.h',
        'base/filter_host.h',
        'base/filters.cc',
        'base/filters.h',
        'base/h264_bitstream_converter.cc',
        'base/h264_bitstream_converter.h',
        'base/media.h',
        'base/media_android.cc',
        'base/media_export.h',
        'base/media_log.cc',
        'base/media_log.h',
        'base/media_log_event.h',
        'base/media_posix.cc',
        'base/media_switches.cc',
        'base/media_switches.h',
        'base/media_win.cc',
        'base/message_loop_factory.cc',
        'base/message_loop_factory.h',
        'base/pipeline.cc',
        'base/pipeline.h',
        'base/pipeline_status.cc',
        'base/pipeline_status.h',
        'base/ranges.cc',
        'base/ranges.h',
        'base/seekable_buffer.cc',
        'base/seekable_buffer.h',
        'base/state_matrix.cc',
        'base/state_matrix.h',
        'base/stream_parser.cc',
        'base/stream_parser.h',
        'base/stream_parser_buffer.cc',
        'base/stream_parser_buffer.h',
        'base/video_decoder.cc',
        'base/video_decoder.h',
        'base/video_decoder_config.cc',
        'base/video_decoder_config.h',
        'base/video_frame.cc',
        'base/video_frame.h',
        'base/video_renderer.h',
        'base/video_util.cc',
        'base/video_util.h',
        'crypto/aes_decryptor.cc',
        'crypto/aes_decryptor.h',
        'ffmpeg/ffmpeg_common.cc',
        'ffmpeg/ffmpeg_common.h',
        'ffmpeg/file_protocol.cc',
        'ffmpeg/file_protocol.h',
        'filters/audio_file_reader.cc',
        'filters/audio_file_reader.h',
        'filters/audio_renderer_algorithm.cc',
        'filters/audio_renderer_algorithm.h',
        'filters/audio_renderer_impl.cc',
        'filters/audio_renderer_impl.h',
        'filters/bitstream_converter.cc',
        'filters/bitstream_converter.h',
        'filters/chunk_demuxer.cc',
        'filters/chunk_demuxer.h',
        'filters/chunk_demuxer_client.h',
        'filters/dummy_demuxer.cc',
        'filters/dummy_demuxer.h',
        'filters/ffmpeg_audio_decoder.cc',
        'filters/ffmpeg_audio_decoder.h',
        'filters/ffmpeg_demuxer.cc',
        'filters/ffmpeg_demuxer.h',
        'filters/ffmpeg_h264_bitstream_converter.cc',
        'filters/ffmpeg_h264_bitstream_converter.h',
        'filters/ffmpeg_glue.cc',
        'filters/ffmpeg_glue.h',
        'filters/ffmpeg_video_decoder.cc',
        'filters/ffmpeg_video_decoder.h',
        'filters/file_data_source.cc',
        'filters/file_data_source.h',
        'filters/gpu_video_decoder.cc',
        'filters/gpu_video_decoder.h',
        'filters/in_memory_url_protocol.cc',
        'filters/in_memory_url_protocol.h',
        'filters/source_buffer_stream.cc',
        'filters/source_buffer_stream.h',
        'filters/video_frame_generator.cc',
        'filters/video_frame_generator.h',
        'filters/video_renderer_base.cc',
        'filters/video_renderer_base.h',
        'video/capture/fake_video_capture_device.cc',
        'video/capture/fake_video_capture_device.h',
        'video/capture/linux/video_capture_device_linux.cc',
        'video/capture/linux/video_capture_device_linux.h',
        'video/capture/mac/video_capture_device_mac.h',
        'video/capture/mac/video_capture_device_mac.mm',
        'video/capture/mac/video_capture_device_qtkit_mac.h',
        'video/capture/mac/video_capture_device_qtkit_mac.mm',
        'video/capture/video_capture.h',
        'video/capture/video_capture_device.h',
        'video/capture/video_capture_device_dummy.cc',
        'video/capture/video_capture_device_dummy.h',
        'video/capture/video_capture_proxy.cc',
        'video/capture/video_capture_proxy.h',
        'video/capture/video_capture_types.h',
        'video/capture/win/filter_base_win.cc',
        'video/capture/win/filter_base_win.h',
        'video/capture/win/pin_base_win.cc',
        'video/capture/win/pin_base_win.h',
        'video/capture/win/sink_filter_observer_win.h',
        'video/capture/win/sink_filter_win.cc',
        'video/capture/win/sink_filter_win.h',
        'video/capture/win/sink_input_pin_win.cc',
        'video/capture/win/sink_input_pin_win.h',
        'video/capture/win/video_capture_device_win.cc',
        'video/capture/win/video_capture_device_win.h',
        'video/picture.cc',
        'video/picture.h',
        'video/video_decode_accelerator.cc',
        'video/video_decode_accelerator.h',
        'webm/webm_constants.h',
        'webm/webm_cluster_parser.cc',
        'webm/webm_cluster_parser.h',
        'webm/webm_content_encodings.cc',
        'webm/webm_content_encodings.h',
        'webm/webm_content_encodings_client.cc',
        'webm/webm_content_encodings_client.h',
        'webm/webm_info_parser.cc',
        'webm/webm_info_parser.h',
        'webm/webm_parser.cc',
        'webm/webm_parser.h',
        'webm/webm_stream_parser.cc',
        'webm/webm_stream_parser.h',
        'webm/webm_tracks_parser.cc',
        'webm/webm_tracks_parser.h',
      ],
      'direct_dependent_settings': {
        'include_dirs': [
          '..',
        ],
      },
      'conditions': [
        # Android doesn't use ffmpeg, so make the dependency conditional
        # and exclude the sources which depend on ffmpeg.
        ['OS != "android"', {
          'dependencies': [
            '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg',
          ],
        }],
        ['OS == "android"', {
          'sources!': [
            'base/media_posix.cc',
            'ffmpeg/ffmpeg_common.cc',
            'ffmpeg/ffmpeg_common.h',
            'ffmpeg/file_protocol.cc',
            'ffmpeg/file_protocol.h',
            'filters/audio_file_reader.cc',
            'filters/audio_file_reader.h',
            'filters/bitstream_converter.cc',
            'filters/bitstream_converter.h',
            'filters/chunk_demuxer.cc',
            'filters/chunk_demuxer.h',
            'filters/chunk_demuxer_client.h',
            'filters/ffmpeg_audio_decoder.cc',
            'filters/ffmpeg_audio_decoder.h',
            'filters/ffmpeg_demuxer.cc',
            'filters/ffmpeg_demuxer.h',
            'filters/ffmpeg_h264_bitstream_converter.cc',
            'filters/ffmpeg_h264_bitstream_converter.h',
            'filters/ffmpeg_glue.cc',
            'filters/ffmpeg_glue.h',
            'filters/ffmpeg_video_decoder.cc',
            'filters/ffmpeg_video_decoder.h',
            'filters/gpu_video_decoder.cc',
            'filters/gpu_video_decoder.h',
            'webm/webm_cluster_parser.cc',
            'webm/webm_cluster_parser.h',
            'webm/webm_stream_parser.cc',
            'webm/webm_stream_parser.h',
          ],
        }],
        # The below 'android' condition were added temporarily and should be
        # removed in downstream, because there is no Java environment setup in
        # upstream yet.
        ['OS == "android"', {
          'sources!':[
            'audio/android/audio_track_output_android.cc',
          ],
          'sources':[
            'audio/android/audio_track_output_stub_android.cc',
          ],
          'link_settings': {
            'libraries': [
              '-lOpenSLES',
            ],
          },
        }],
        ['OS=="linux" or OS=="freebsd" or OS=="solaris"', {
          'link_settings': {
            'libraries': [
              '-lasound',
            ],
          },
        }],
        ['OS=="openbsd"', {
          'sources/': [ ['exclude', '/alsa_' ],
                        ['exclude', '/audio_manager_linux' ] ],
          'link_settings': {
            'libraries': [
            ],
          },
        }],
        ['OS!="openbsd"', {
          'sources!': [
            'audio/openbsd/audio_manager_openbsd.cc',
            'audio/openbsd/audio_manager_openbsd.h',
          ],
        }],
        ['OS=="linux"', {
          'variables': {
            'conditions': [
              ['sysroot!=""', {
                'pkg-config': '../build/linux/pkg-config-wrapper "<(sysroot)" "<(target_arch)"',
              }, {
                'pkg-config': 'pkg-config'
              }],
            ],
          },
          'conditions': [
            ['use_cras == 1', {
              'cflags': [
                '<!@(<(pkg-config) --cflags libcras)',
              ],
              'link_settings': {
                'libraries': [
                  '<!@(<(pkg-config) --libs libcras)',
                ],
              },
              'defines': [
                'USE_CRAS',
              ],
            }, {  # else: use_cras == 0
              'sources!': [
                'audio/linux/cras_output.cc',
                'audio/linux/cras_output.h',
              ],
            }],
          ],
        }],
        ['os_posix == 1', {
          'conditions': [
            ['use_pulseaudio == 1', {
              'cflags': [
                '<!@(pkg-config --cflags libpulse)',
              ],
              'link_settings': {
                'libraries': [
                  '<!@(pkg-config --libs-only-l libpulse)',
                ],
              },
              'defines': [
                'USE_PULSEAUDIO',
              ],
            }, {  # else: use_pulseaudio == 0
              'sources!': [
                'audio/pulse/pulse_output.cc',
                'audio/pulse/pulse_output.h',
              ],
            }],
          ],
        }],
        ['os_posix == 1 and OS != "android"', {
          # Video capture isn't supported in Android yet.
          'sources!': [
            'video/capture/video_capture_device_dummy.cc',
            'video/capture/video_capture_device_dummy.h',
          ],
        }],
        ['OS=="mac"', {
          'link_settings': {
            'libraries': [
              '$(SDKROOT)/System/Library/Frameworks/AudioUnit.framework',
              '$(SDKROOT)/System/Library/Frameworks/AudioToolbox.framework',
              '$(SDKROOT)/System/Library/Frameworks/CoreAudio.framework',
              '$(SDKROOT)/System/Library/Frameworks/CoreVideo.framework',
              '$(SDKROOT)/System/Library/Frameworks/QTKit.framework',
            ],
          },
        }],
        ['OS=="win"', {
          'sources!': [
            'audio/pulse/pulse_output.cc',
            'audio/pulse/pulse_output.h',
            'video/capture/video_capture_device_dummy.cc',
            'video/capture/video_capture_device_dummy.h',
          ],
        }],
        ['proprietary_codecs==1 or branding=="Chrome"', {
          'sources': [
            'mp4/avc.cc',
            'mp4/avc.h',
            'mp4/box_definitions.cc',
            'mp4/box_definitions.h',
            'mp4/box_reader.cc',
            'mp4/box_reader.h',
            'mp4/cenc.cc',
            'mp4/cenc.h',
            'mp4/mp4_stream_parser.cc',
            'mp4/mp4_stream_parser.h',
            'mp4/offset_byte_queue.cc',
            'mp4/offset_byte_queue.h',
            'mp4/track_run_iterator.cc',
            'mp4/track_run_iterator.h',
          ],
        }],
      ],
    },
    {
      'target_name': 'yuv_convert',
      'type': 'static_library',
      'include_dirs': [
        '..',
      ],
      'conditions': [
        ['order_profiling != 0', {
          'target_conditions' : [
            ['_toolset=="target"', {
              'cflags!': [ '-finstrument-functions' ],
            }],
          ],
        }],
        [ 'target_arch == "ia32" or target_arch == "x64"', {
          'dependencies': [
            'yuv_convert_simd_x86',
          ],
        }],
        [ 'target_arch == "arm"', {
          'dependencies': [
            'yuv_convert_simd_arm',
          ],
        }],
      ],
      'sources': [
        'base/yuv_convert.cc',
        'base/yuv_convert.h',
      ],
    },
    {
      'target_name': 'yuv_convert_simd_x86',
      'type': 'static_library',
      'include_dirs': [
        '..',
      ],
      'sources': [
        'base/simd/convert_rgb_to_yuv_c.cc',
        'base/simd/convert_rgb_to_yuv_sse2.cc',
        'base/simd/convert_rgb_to_yuv_ssse3.asm',
        'base/simd/convert_rgb_to_yuv_ssse3.cc',
        'base/simd/convert_rgb_to_yuv_ssse3.inc',
        'base/simd/convert_yuv_to_rgb_c.cc',
        'base/simd/convert_yuv_to_rgb_x86.cc',
        'base/simd/convert_yuv_to_rgb_mmx.asm',
        'base/simd/convert_yuv_to_rgb_mmx.inc',
        'base/simd/convert_yuv_to_rgb_sse.asm',
        'base/simd/filter_yuv.h',
        'base/simd/filter_yuv_c.cc',
        'base/simd/filter_yuv_mmx.cc',
        'base/simd/filter_yuv_sse2.cc',
        'base/simd/linear_scale_yuv_to_rgb_mmx.asm',
        'base/simd/linear_scale_yuv_to_rgb_mmx.inc',
        'base/simd/linear_scale_yuv_to_rgb_sse.asm',
        'base/simd/scale_yuv_to_rgb_mmx.asm',
        'base/simd/scale_yuv_to_rgb_mmx.inc',
        'base/simd/scale_yuv_to_rgb_sse.asm',
        'base/simd/yuv_to_rgb_table.cc',
        'base/simd/yuv_to_rgb_table.h',
      ],
      'conditions': [
        ['order_profiling != 0', {
          'target_conditions' : [
            ['_toolset=="target"', {
              'cflags!': [ '-finstrument-functions' ],
            }],
          ],
        }],
        [ 'target_arch == "x64"', {
          # Source files optimized for X64 systems.
          'sources': [
            'base/simd/linear_scale_yuv_to_rgb_mmx_x64.asm',
            'base/simd/scale_yuv_to_rgb_sse2_x64.asm',
          ],
        }],
        [ 'os_posix == 1 and OS != "mac" and OS != "android"', {
          'cflags': [
            '-msse2',
          ],
        }],
        [ 'OS == "mac"', {
          'configurations': {
            'Debug': {
              'xcode_settings': {
                # gcc on the mac builds horribly unoptimized sse code in debug
                # mode. Since this is rarely going to be debugged, run with full
                # optimizations in Debug as well as Release.
                'GCC_OPTIMIZATION_LEVEL': '3',  # -O3
               },
             },
          },
        }],
        [ 'OS=="win"', {
          'variables': {
            'yasm_flags': [
              '-DWIN32',
              '-DMSVC',
              '-DCHROMIUM',
              '-Isimd',
            ],
          },
        }],
        [ 'OS=="mac"', {
          'variables': {
            'yasm_flags': [
              '-DPREFIX',
              '-DMACHO',
              '-DCHROMIUM',
              '-Isimd',
            ],
          },
        }],
        [ 'os_posix==1 and OS!="mac"', {
          'variables': {
            'conditions': [
              [ 'target_arch=="ia32"', {
                'yasm_flags': [
                  '-DX86_32',
                  '-DELF',
                  '-DCHROMIUM',
                  '-Isimd',
                ],
              }, {
                'yasm_flags': [
                  '-DARCH_X86_64',
                  '-DELF',
                  '-DPIC',
                  '-DCHROMIUM',
                  '-Isimd',
                ],
              }],
            ],
          },
        }],
      ],
      'variables': {
        'yasm_output_path': '<(SHARED_INTERMEDIATE_DIR)/media',
      },
      'msvs_2010_disable_uldi_when_referenced': 1,
      'includes': [
        '../third_party/yasm/yasm_compile.gypi',
      ],
    },
    {
      'target_name': 'yuv_convert_simd_arm',
      'type': 'static_library',
      'include_dirs': [
        '..',
      ],
      'sources': [
        'base/simd/convert_rgb_to_yuv_c.cc',
        'base/simd/convert_rgb_to_yuv.h',
        'base/simd/convert_yuv_to_rgb_c.cc',
        'base/simd/convert_yuv_to_rgb.h',
        'base/simd/filter_yuv.h',
        'base/simd/filter_yuv_c.cc',
        'base/simd/yuv_to_rgb_table.cc',
        'base/simd/yuv_to_rgb_table.h',
      ],
    },
    {
      'target_name': 'media_unittests',
      'type': 'executable',
      'dependencies': [
        'media',
        'media_test_support',
        'yuv_convert',
        '../base/base.gyp:base',
        '../base/base.gyp:base_i18n',
        '../base/base.gyp:test_support_base',
        '../testing/gmock.gyp:gmock',
        '../testing/gtest.gyp:gtest',
        '../ui/ui.gyp:ui',
      ],
      'sources': [
        'audio/async_socket_io_handler_unittest.cc',
        'audio/audio_input_controller_unittest.cc',
        'audio/audio_input_device_unittest.cc',
        'audio/audio_input_unittest.cc',
        'audio/audio_input_volume_unittest.cc',
        'audio/audio_low_latency_input_output_unittest.cc',
        'audio/audio_output_controller_unittest.cc',
        'audio/audio_output_proxy_unittest.cc',
        'audio/audio_parameters_unittest.cc',
        'audio/audio_util_unittest.cc',
        'audio/cross_process_notification_unittest.cc',
        'audio/linux/alsa_output_unittest.cc',
        'audio/mac/audio_low_latency_input_mac_unittest.cc',
        'audio/mac/audio_output_mac_unittest.cc',
        'audio/simple_sources_unittest.cc',
        'audio/win/audio_low_latency_input_win_unittest.cc',
        'audio/win/audio_low_latency_output_win_unittest.cc',
        'audio/win/audio_output_win_unittest.cc',
        'base/audio_renderer_mixer_unittest.cc',
        'base/audio_renderer_mixer_input_unittest.cc',
        'base/buffers_unittest.cc',
        'base/clock_unittest.cc',
        'base/composite_filter_unittest.cc',
        'base/data_buffer_unittest.cc',
        'base/decoder_buffer_unittest.cc',
        'base/djb2_unittest.cc',
        'base/fake_audio_render_callback.cc',
        'base/fake_audio_render_callback.h',
        'base/filter_collection_unittest.cc',
        'base/h264_bitstream_converter_unittest.cc',
        'base/pipeline_unittest.cc',
        'base/ranges_unittest.cc',
        'base/run_all_unittests.cc',
        'base/seekable_buffer_unittest.cc',
        'base/state_matrix_unittest.cc',
        'base/test_data_util.cc',
        'base/test_data_util.h',
        'base/video_frame_unittest.cc',
        'base/video_util_unittest.cc',
        'base/yuv_convert_unittest.cc',
        'crypto/aes_decryptor_unittest.cc',
        'ffmpeg/ffmpeg_common_unittest.cc',
        'filters/audio_renderer_algorithm_unittest.cc',
        'filters/audio_renderer_impl_unittest.cc',
        'filters/bitstream_converter_unittest.cc',
        'filters/chunk_demuxer_unittest.cc',
        'filters/ffmpeg_audio_decoder_unittest.cc',
        'filters/ffmpeg_decoder_unittest.h',
        'filters/ffmpeg_demuxer_unittest.cc',
        'filters/ffmpeg_glue_unittest.cc',
        'filters/ffmpeg_h264_bitstream_converter_unittest.cc',
        'filters/ffmpeg_video_decoder_unittest.cc',
        'filters/file_data_source_unittest.cc',
        'filters/pipeline_integration_test.cc',
        'filters/pipeline_integration_test_base.cc',
        'filters/source_buffer_stream_unittest.cc',
        'filters/video_renderer_base_unittest.cc',
        'video/capture/video_capture_device_unittest.cc',
        'webm/cluster_builder.cc',
        'webm/cluster_builder.h',
        'webm/webm_cluster_parser_unittest.cc',
        'webm/webm_content_encodings_client_unittest.cc',
        'webm/webm_parser_unittest.cc',
      ],
      'conditions': [
        ['os_posix==1 and OS!="mac"', {
          'conditions': [
            ['linux_use_tcmalloc==1', {
              'dependencies': [
                '../base/allocator/allocator.gyp:allocator',
              ],
            }],
          ],
        }],
        ['OS != "android"', {
          'dependencies': [
            '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg',
          ],
        }],
        ['OS == "android"', {
          'sources!': [
            'audio/audio_input_volume_unittest.cc',
            'base/test_data_util.cc',
            'base/test_data_util.h',
            'ffmpeg/ffmpeg_common_unittest.cc',
            'filters/ffmpeg_audio_decoder_unittest.cc',
            'filters/bitstream_converter_unittest.cc',
            'filters/chunk_demuxer_unittest.cc',
            'filters/ffmpeg_demuxer_unittest.cc',
            'filters/ffmpeg_glue_unittest.cc',
            'filters/ffmpeg_h264_bitstream_converter_unittest.cc',
            'filters/ffmpeg_video_decoder_unittest.cc',
            'filters/pipeline_integration_test.cc',
            'filters/pipeline_integration_test_base.cc',
            'mp4/mp4_stream_parser_unittest.cc',
            'webm/webm_cluster_parser_unittest.cc',
          ],
        }],
        ['OS == "linux"', {
          'conditions': [
            ['use_cras == 1', {
              'sources': [
                'audio/linux/cras_output_unittest.cc',
              ],
              'defines': [
                'USE_CRAS',
              ],
            }],
          ],
        }],
        [ 'target_arch=="ia32" or target_arch=="x64"', {
          'sources': [
            'base/simd/convert_rgb_to_yuv_unittest.cc',
          ],
        }],
        ['proprietary_codecs==1 or branding=="Chrome"', {
          'sources': [
            'mp4/avc_unittest.cc',
            'mp4/box_reader_unittest.cc',
            'mp4/mp4_stream_parser_unittest.cc',
            'mp4/offset_byte_queue_unittest.cc',
          ],
        }],
      ],
    },
    {
      'target_name': 'media_test_support',
      'type': 'static_library',
      'dependencies': [
        'media',
        '../base/base.gyp:base',
        '../testing/gmock.gyp:gmock',
        '../testing/gtest.gyp:gtest',
      ],
      'sources': [
        'audio/test_audio_input_controller_factory.cc',
        'audio/test_audio_input_controller_factory.h',
        'base/mock_callback.cc',
        'base/mock_callback.h',
        'base/mock_data_source_host.cc',
        'base/mock_data_source_host.h',
        'base/mock_demuxer_host.cc',
        'base/mock_demuxer_host.h',
        'base/mock_filter_host.cc',
        'base/mock_filter_host.h',
        'base/mock_filters.cc',
        'base/mock_filters.h',
      ],
    },
    {
      'target_name': 'scaler_bench',
      'type': 'executable',
      'dependencies': [
        'media',
        'yuv_convert',
        '../base/base.gyp:base',
        '../skia/skia.gyp:skia',
      ],
      'sources': [
        'tools/scaler_bench/scaler_bench.cc',
      ],
    },
    {
      'target_name': 'qt_faststart',
      'type': 'executable',
      'sources': [
        'tools/qt_faststart/qt_faststart.c'
      ],
    },
    {
      'target_name': 'seek_tester',
      'type': 'executable',
      'dependencies': [
        'media',
        '../base/base.gyp:base',
      ],
      'sources': [
        'tools/seek_tester/seek_tester.cc',
      ],
    },
  ],
  'conditions': [
    ['OS=="win"', {
      'targets': [
        {
          'target_name': 'player_wtl',
          'type': 'executable',
          'dependencies': [
            'media',
            'yuv_convert',
            '../base/base.gyp:base',
            '../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
            '../ui/ui.gyp:ui',
          ],
          'include_dirs': [
            '<(DEPTH)/third_party/wtl/include',
          ],
          'sources': [
            'tools/player_wtl/list.h',
            'tools/player_wtl/mainfrm.h',
            'tools/player_wtl/movie.cc',
            'tools/player_wtl/movie.h',
            'tools/player_wtl/player_wtl.cc',
            'tools/player_wtl/player_wtl.rc',
            'tools/player_wtl/props.h',
            'tools/player_wtl/seek.h',
            'tools/player_wtl/resource.h',
            'tools/player_wtl/view.h',
          ],
          'msvs_settings': {
            'VCLinkerTool': {
              'SubSystem': '2',         # Set /SUBSYSTEM:WINDOWS
            },
          },
          'defines': [
            '_CRT_SECURE_NO_WARNINGS=1',
          ],
        },
      ],
    }],
    ['OS == "win" or toolkit_uses_gtk == 1', {
      'targets': [
        {
          'target_name': 'shader_bench',
          'type': 'executable',
          'dependencies': [
            'media',
            'yuv_convert',
            '../base/base.gyp:base',
            '../ui/gl/gl.gyp:gl',
          ],
          'sources': [
            'tools/shader_bench/shader_bench.cc',
            'tools/shader_bench/cpu_color_painter.cc',
            'tools/shader_bench/cpu_color_painter.h',
            'tools/shader_bench/gpu_color_painter.cc',
            'tools/shader_bench/gpu_color_painter.h',
            'tools/shader_bench/gpu_painter.cc',
            'tools/shader_bench/gpu_painter.h',
            'tools/shader_bench/painter.cc',
            'tools/shader_bench/painter.h',
            'tools/shader_bench/window.cc',
            'tools/shader_bench/window.h',
          ],
          'conditions': [
            ['toolkit_uses_gtk == 1', {
              'dependencies': [
                '../build/linux/system.gyp:gtk',
              ],
              'sources': [
                'tools/shader_bench/window_linux.cc',
              ],
            }],
            ['OS=="win"', {
              'dependencies': [
                '../third_party/angle/src/build_angle.gyp:libEGL',
                '../third_party/angle/src/build_angle.gyp:libGLESv2',
              ],
              'sources': [
                'tools/shader_bench/window_win.cc',
              ],
            }],
          ],
        },
      ],
    }],
    ['OS == "linux" and target_arch != "arm"', {
      'targets': [
        {
          'target_name': 'tile_render_bench',
          'type': 'executable',
          'dependencies': [
            '../base/base.gyp:base',
            '../ui/gl/gl.gyp:gl',
          ],
          'libraries': [
            '-lGL',
            '-ldl',
          ],
          'sources': [
            'tools/tile_render_bench/tile_render_bench.cc',
          ],
        },
      ],
    }],
    ['os_posix == 1 and OS != "mac" and OS != "android"', {
      'targets': [
        {
          'target_name': 'player_x11',
          'type': 'executable',
          'dependencies': [
            'media',
            'yuv_convert',
            '../base/base.gyp:base',
            '../ui/gl/gl.gyp:gl',
          ],
          'link_settings': {
            'libraries': [
              '-ldl',
              '-lX11',
              '-lXrender',
              '-lXext',
            ],
          },
          'sources': [
            'tools/player_x11/data_source_logger.cc',
            'tools/player_x11/data_source_logger.h',
            'tools/player_x11/gl_video_renderer.cc',
            'tools/player_x11/gl_video_renderer.h',
            'tools/player_x11/player_x11.cc',
            'tools/player_x11/x11_video_renderer.cc',
            'tools/player_x11/x11_video_renderer.h',
          ],
        },
      ],
    }],
    ['OS == "android"', {
      'targets': [
        {
          'target_name': 'player_android',
          'type': 'static_library',
          'sources': [
            'base/android/media_player_bridge.cc',
            'base/android/media_player_bridge.h',
          ],
          'dependencies': [
            '../base/base.gyp:base',
          ],
          'include_dirs': [
            '<(SHARED_INTERMEDIATE_DIR)/media',
          ],
          'actions': [
            {
              'action_name': 'generate-jni-headers',
              'inputs': [
                '../base/android/jni_generator/jni_generator.py',
                'base/android/java/src/org/chromium/media/MediaPlayerListener.java',
              ],
              'outputs': [
                '<(SHARED_INTERMEDIATE_DIR)/media/jni/media_player_listener_jni.h',
              ],
              'action': [
                'python',
                '<(DEPTH)/base/android/jni_generator/jni_generator.py',
                '-o',
                '<@(_inputs)',
                '<@(_outputs)',
              ],
            },
          ],
        },
        {
          'target_name': 'media_java',
          'type': 'none',
          'dependencies': [ '../base/base.gyp:base_java' ],
          'variables': {
            'package_name': 'media',
            'java_in_dir': 'base/android/java',
          },
          'includes': [ '../build/java.gypi' ],
        },

      ],
    }, { # OS != "android"'
      # Android does not use ffmpeg, so disable the targets which require it.
      'targets': [
        {
          'target_name': 'ffmpeg_unittests',
          'type': 'executable',
          'dependencies': [
            'media',
            'media_test_support',
            '../base/base.gyp:base',
            '../base/base.gyp:base_i18n',
            '../base/base.gyp:test_support_base',
            '../base/base.gyp:test_support_perf',
            '../testing/gtest.gyp:gtest',
            '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg',
          ],
          'sources': [
            'ffmpeg/ffmpeg_unittest.cc',
          ],
          'conditions': [
            ['toolkit_uses_gtk == 1', {
              'dependencies': [
                # Needed for the following #include chain:
                #   base/run_all_unittests.cc
                #   ../base/test_suite.h
                #   gtk/gtk.h
                '../build/linux/system.gyp:gtk',
              ],
              'conditions': [
                ['linux_use_tcmalloc==1', {
                  'dependencies': [
                    '../base/allocator/allocator.gyp:allocator',
                  ],
                }],
              ],
            }],
          ],
        },
        {
          'target_name': 'ffmpeg_regression_tests',
          'type': 'executable',
          'dependencies': [
            'media',
            'media_test_support',
            '../base/base.gyp:test_support_base',
            '../testing/gmock.gyp:gmock',
            '../testing/gtest.gyp:gtest',
            '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg',
          ],
          'sources': [
            'base/test_data_util.cc',
            'base/run_all_unittests.cc',
            'ffmpeg/ffmpeg_regression_tests.cc',
            'filters/pipeline_integration_test_base.cc',
          ],
          'conditions': [
            ['os_posix==1 and OS!="mac"', {
              'conditions': [
                ['linux_use_tcmalloc==1', {
                  'dependencies': [
                    '../base/allocator/allocator.gyp:allocator',
                  ],
                }],
              ],
            }],
          ],
        },
        {
          'target_name': 'ffmpeg_tests',
          'type': 'executable',
          'dependencies': [
            'media',
            '../base/base.gyp:base',
            '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg',
          ],
          'sources': [
            'test/ffmpeg_tests/ffmpeg_tests.cc',
          ],
        },
        {
          'target_name': 'media_bench',
          'type': 'executable',
          'dependencies': [
            'media',
            '../base/base.gyp:base',
            '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg',
          ],
          'sources': [
            'tools/media_bench/media_bench.cc',
          ],
        },
      ],
    }]
  ],
}

#("# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

{
  'variables': {
    'chromium_code': 1,
    # Override to dynamically link the PulseAudio library.
    'use_pulseaudio%': 0,
    # Override to dynamically link the cras (ChromeOS audio) library.
    'use_cras%': 0,
  },
  'targets': [
    {
      'target_name': 'media',
      'type': '<(component)',
      'dependencies': [
        'yuv_convert',
        '../base/base.gyp:base',
        '../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
        '../build/temp_gyp/googleurl.gyp:googleurl',
        '../crypto/crypto.gyp:crypto',
        '../third_party/openmax/openmax.gyp:il',
        '../ui/ui.gyp:ui',
      ],
      'defines': [
        'MEDIA_IMPLEMENTATION',
      ],
      'include_dirs': [
        '..',
      ],
      'sources': [
        'audio/android/audio_manager_android.cc',
        'audio/android/audio_manager_android.h',
        'audio/android/audio_track_output_android.cc',
        'audio/android/audio_track_output_android.h',
        'audio/android/opensles_input.cc',
        'audio/android/opensles_input.h',
        'audio/android/opensles_output.cc',
        'audio/android/opensles_output.h',
        'audio/async_socket_io_handler.h',
        'audio/async_socket_io_handler_posix.cc',
        'audio/async_socket_io_handler_win.cc',
        'audio/audio_buffers_state.cc',
        'audio/audio_buffers_state.h',
        'audio/audio_io.h',
        'audio/audio_input_controller.cc',
        'audio/audio_input_controller.h',
        'audio/audio_input_stream_impl.cc',
        'audio/audio_input_stream_impl.h',
        'audio/audio_device_name.cc',
        'audio/audio_device_name.h',
        'audio/audio_manager.cc',
        'audio/audio_manager.h',
        'audio/audio_manager_base.cc',
        'audio/audio_manager_base.h',
        'audio/audio_output_controller.cc',
        'audio/audio_output_controller.h',
        'audio/audio_output_dispatcher.cc',
        'audio/audio_output_dispatcher.h',
        'audio/audio_output_dispatcher_impl.cc',
        'audio/audio_output_dispatcher_impl.h',
        'audio/audio_output_mixer.cc',
        'audio/audio_output_mixer.h',
        'audio/audio_output_proxy.cc',
        'audio/audio_output_proxy.h',
        'audio/audio_parameters.cc',
        'audio/audio_parameters.h',
        'audio/audio_util.cc',
        'audio/audio_util.h',
        'audio/cross_process_notification.cc',
        'audio/cross_process_notification.h',
        'audio/cross_process_notification_win.cc',
        'audio/cross_process_notification_posix.cc',
        'audio/fake_audio_input_stream.cc',
        'audio/fake_audio_input_stream.h',
        'audio/fake_audio_output_stream.cc',
        'audio/fake_audio_output_stream.h',
        'audio/linux/audio_manager_linux.cc',
        'audio/linux/audio_manager_linux.h',
        'audio/linux/alsa_input.cc',
        'audio/linux/alsa_input.h',
        'audio/linux/alsa_output.cc',
        'audio/linux/alsa_output.h',
        'audio/linux/alsa_util.cc',
        'audio/linux/alsa_util.h',
        'audio/linux/alsa_wrapper.cc',
        'audio/linux/alsa_wrapper.h',
        'audio/linux/cras_output.cc',
        'audio/linux/cras_output.h',
        'audio/openbsd/audio_manager_openbsd.cc',
        'audio/openbsd/audio_manager_openbsd.h',
        'audio/mac/audio_input_mac.cc',
        'audio/mac/audio_input_mac.h',
        'audio/mac/audio_low_latency_input_mac.cc',
        'audio/mac/audio_low_latency_input_mac.h',
        'audio/mac/audio_low_latency_output_mac.cc',
        'audio/mac/audio_low_latency_output_mac.h',
        'audio/mac/audio_manager_mac.cc',
        'audio/mac/audio_manager_mac.h',
        'audio/mac/audio_output_mac.cc',
        'audio/mac/audio_output_mac.h',
        'audio/null_audio_sink.cc',
        'audio/null_audio_sink.h',
        'audio/pulse/pulse_output.cc',
        'audio/pulse/pulse_output.h',
        'audio/sample_rates.cc',
        'audio/sample_rates.h',
        'audio/simple_sources.cc',
        'audio/simple_sources.h',
        'audio/win/audio_low_latency_input_win.cc',
        'audio/win/audio_low_latency_input_win.h',
        'audio/win/audio_low_latency_output_win.cc',
        'audio/win/audio_low_latency_output_win.h',
        'audio/win/audio_manager_win.cc',
        'audio/win/audio_manager_win.h',
        'audio/win/avrt_wrapper_win.cc',
        'audio/win/avrt_wrapper_win.h',
        'audio/win/device_enumeration_win.cc',
        'audio/win/device_enumeration_win.h',
        'audio/win/wavein_input_win.cc',
        'audio/win/wavein_input_win.h',
        'audio/win/waveout_output_win.cc',
        'audio/win/waveout_output_win.h',
        'base/android/media_jni_registrar.cc',
        'base/android/media_jni_registrar.h',
        'base/audio_decoder.cc',
        'base/audio_decoder.h',
        'base/audio_decoder_config.cc',
        'base/audio_decoder_config.h',
        'base/audio_renderer.h',
        'base/audio_renderer_mixer.cc',
        'base/audio_renderer_mixer.h',
        'base/audio_renderer_mixer_input.cc',
        'base/audio_renderer_mixer_input.h',
        'base/bitstream_buffer.h',
        'base/buffers.cc',
        'base/buffers.h',
        'base/byte_queue.cc',
        'base/byte_queue.h',
        'base/channel_layout.cc',
        'base/channel_layout.h',
        'base/clock.cc',
        'base/clock.h',
        'base/composite_filter.cc',
        'base/composite_filter.h',
        'base/data_buffer.cc',
        'base/data_buffer.h',
        'base/data_source.cc',
        'base/data_source.h',
        'base/decoder_buffer.cc',
        'base/decoder_buffer.h',
        'base/decrypt_config.cc',
        'base/decrypt_config.h',
        'base/decryptor.h',
        'base/decryptor_client.h',
        'base/demuxer.cc',
        'base/demuxer.h',
        'base/demuxer_stream.cc',
        'base/demuxer_stream.h',
        'base/djb2.cc',
        'base/djb2.h',
        'base/filter_collection.cc',
        'base/filter_collection.h',
        'base/filter_host.h',
        'base/filters.cc',
        'base/filters.h',
        'base/h264_bitstream_converter.cc',
        'base/h264_bitstream_converter.h',
        'base/media.h',
        'base/media_android.cc',
        'base/media_export.h',
        'base/media_log.cc',
        'base/media_log.h',
        'base/media_log_event.h',
        'base/media_posix.cc',
        'base/media_switches.cc',
        'base/media_switches.h',
        'base/media_win.cc',
        'base/message_loop_factory.cc',
        'base/message_loop_factory.h',
        'base/pipeline.cc',
        'base/pipeline.h',
        'base/pipeline_status.cc',
        'base/pipeline_status.h',
        'base/ranges.cc',
        'base/ranges.h',
        'base/seekable_buffer.cc',
        'base/seekable_buffer.h',
        'base/state_matrix.cc',
        'base/state_matrix.h',
        'base/stream_parser.cc',
        'base/stream_parser.h',
        'base/stream_parser_buffer.cc',
        'base/stream_parser_buffer.h',
        'base/video_decoder.cc',
        'base/video_decoder.h',
        'base/video_decoder_config.cc',
        'base/video_decoder_config.h',
        'base/video_frame.cc',
        'base/video_frame.h',
        'base/video_renderer.h',
        'base/video_util.cc',
        'base/video_util.h',
        'crypto/aes_decryptor.cc',
        'crypto/aes_decryptor.h',
        'ffmpeg/ffmpeg_common.cc',
        'ffmpeg/ffmpeg_common.h',
        'ffmpeg/file_protocol.cc',
        'ffmpeg/file_protocol.h',
        'filters/audio_file_reader.cc',
        'filters/audio_file_reader.h',
        'filters/audio_renderer_algorithm.cc',
        'filters/audio_renderer_algorithm.h',
        'filters/audio_renderer_impl.cc',
        'filters/audio_renderer_impl.h',
        'filters/bitstream_converter.cc',
        'filters/bitstream_converter.h',
        'filters/chunk_demuxer.cc',
        'filters/chunk_demuxer.h',
        'filters/chunk_demuxer_client.h',
        'filters/dummy_demuxer.cc',
        'filters/dummy_demuxer.h',
        'filters/ffmpeg_audio_decoder.cc',
        'filters/ffmpeg_audio_decoder.h',
        'filters/ffmpeg_demuxer.cc',
        'filters/ffmpeg_demuxer.h',
        'filters/ffmpeg_h264_bitstream_converter.cc',
        'filters/ffmpeg_h264_bitstream_converter.h',
        'filters/ffmpeg_glue.cc',
        'filters/ffmpeg_glue.h',
        'filters/ffmpeg_video_decoder.cc',
        'filters/ffmpeg_video_decoder.h',
        'filters/file_data_source.cc',
        'filters/file_data_source.h',
        'filters/gpu_video_decoder.cc',
        'filters/gpu_video_decoder.h',
        'filters/in_memory_url_protocol.cc',
        'filters/in_memory_url_protocol.h',
        'filters/source_buffer_stream.cc',
        'filters/source_buffer_stream.h',
        'filters/video_frame_generator.cc',
        'filters/video_frame_generator.h',
        'filters/video_renderer_base.cc',
        'filters/video_renderer_base.h',
        'video/capture/fake_video_capture_device.cc',
        'video/capture/fake_video_capture_device.h',
        'video/capture/linux/video_capture_device_linux.cc',
        'video/capture/linux/video_capture_device_linux.h',
        'video/capture/mac/video_capture_device_mac.h',
        'video/capture/mac/video_capture_device_mac.mm',
        'video/capture/mac/video_capture_device_qtkit_mac.h',
        'video/capture/mac/video_capture_device_qtkit_mac.mm',
        'video/capture/video_capture.h',
        'video/capture/video_capture_device.h',
        'video/capture/video_capture_device_dummy.cc',
        'video/capture/video_capture_device_dummy.h',
        'video/capture/video_capture_proxy.cc',
        'video/capture/video_capture_proxy.h',
        'video/capture/video_capture_types.h',
        'video/capture/win/filter_base_win.cc',
        'video/capture/win/filter_base_win.h',
        'video/capture/win/pin_base_win.cc',
        'video/capture/win/pin_base_win.h',
        'video/capture/win/sink_filter_observer_win.h',
        'video/capture/win/sink_filter_win.cc',
        'video/capture/win/sink_filter_win.h',
        'video/capture/win/sink_input_pin_win.cc',
        'video/capture/win/sink_input_pin_win.h',
        'video/capture/win/video_capture_device_win.cc',
        'video/capture/win/video_capture_device_win.h',
        'video/picture.cc',
        'video/picture.h',
        'video/video_decode_accelerator.cc',
        'video/video_decode_accelerator.h',
        'webm/webm_constants.h',
        'webm/webm_cluster_parser.cc',
        'webm/webm_cluster_parser.h',
        'webm/webm_content_encodings.cc',
        'webm/webm_content_encodings.h',
        'webm/webm_content_encodings_client.cc',
        'webm/webm_content_encodings_client.h',
        'webm/webm_info_parser.cc',
        'webm/webm_info_parser.h',
        'webm/webm_parser.cc',
        'webm/webm_parser.h',
        'webm/webm_stream_parser.cc',
        'webm/webm_stream_parser.h',
        'webm/webm_tracks_parser.cc',
        'webm/webm_tracks_parser.h',
      ],
      'direct_dependent_settings': {
        'include_dirs': [
          '..',
        ],
      },
      'conditions': [
        # Android doesn't use ffmpeg, so make the dependency conditional
        # and exclude the sources which depend on ffmpeg.
        ['OS != \"android\"', {
          'dependencies': [
            '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg',
          ],
        }],
        ['OS == \"android\"', {
          'sources!': [
            'base/media_posix.cc',
            'ffmpeg/ffmpeg_common.cc',
            'ffmpeg/ffmpeg_common.h',
            'ffmpeg/file_protocol.cc',
            'ffmpeg/file_protocol.h',
            'filters/audio_file_reader.cc',
            'filters/audio_file_reader.h',
            'filters/bitstream_converter.cc',
            'filters/bitstream_converter.h',
            'filters/chunk_demuxer.cc',
            'filters/chunk_demuxer.h',
            'filters/chunk_demuxer_client.h',
            'filters/ffmpeg_audio_decoder.cc',
            'filters/ffmpeg_audio_decoder.h',
            'filters/ffmpeg_demuxer.cc',
            'filters/ffmpeg_demuxer.h',
            'filters/ffmpeg_h264_bitstream_converter.cc',
            'filters/ffmpeg_h264_bitstream_converter.h',
            'filters/ffmpeg_glue.cc',
            'filters/ffmpeg_glue.h',
            'filters/ffmpeg_video_decoder.cc',
            'filters/ffmpeg_video_decoder.h',
            'filters/gpu_video_decoder.cc',
            'filters/gpu_video_decoder.h',
            'webm/webm_cluster_parser.cc',
            'webm/webm_cluster_parser.h',
            'webm/webm_stream_parser.cc',
            'webm/webm_stream_parser.h',
          ],
        }],
        # The below 'android' condition were added temporarily and should be
        # removed in downstream, because there is no Java environment setup in
        # upstream yet.
        ['OS == \"android\"', {
          'sources!':[
            'audio/android/audio_track_output_android.cc',
          ],
          'sources':[
            'audio/android/audio_track_output_stub_android.cc',
          ],
          'link_settings': {
            'libraries': [
              '-lOpenSLES',
            ],
          },
        }],
        ['OS==\"linux\" or OS==\"freebsd\" or OS==\"solaris\"', {
          'link_settings': {
            'libraries': [
              '-lasound',
            ],
          },
        }],
        ['OS==\"openbsd\"', {
          'sources/': [ ['exclude', '/alsa_' ],
                        ['exclude', '/audio_manager_linux' ] ],
          'link_settings': {
            'libraries': [
            ],
          },
        }],
        ['OS!=\"openbsd\"', {
          'sources!': [
            'audio/openbsd/audio_manager_openbsd.cc',
            'audio/openbsd/audio_manager_openbsd.h',
          ],
        }],
        ['OS==\"linux\"', {
          'variables': {
            'conditions': [
              ['sysroot!=\"\"', {
                'pkg-config': '../build/linux/pkg-config-wrapper \"<(sysroot)\" \"<(target_arch)\"',
              }, {
                'pkg-config': 'pkg-config'
              }],
            ],
          },
          'conditions': [
            ['use_cras == 1', {
              'cflags': [
                '<!@(<(pkg-config) --cflags libcras)',
              ],
              'link_settings': {
                'libraries': [
                  '<!@(<(pkg-config) --libs libcras)',
                ],
              },
              'defines': [
                'USE_CRAS',
              ],
            }, {  # else: use_cras == 0
              'sources!': [
                'audio/linux/cras_output.cc',
                'audio/linux/cras_output.h',
              ],
            }],
          ],
        }],
        ['os_posix == 1', {
          'conditions': [
            ['use_pulseaudio == 1', {
              'cflags': [
                '<!@(pkg-config --cflags libpulse)',
              ],
              'link_settings': {
                'libraries': [
                  '<!@(pkg-config --libs-only-l libpulse)',
                ],
              },
              'defines': [
                'USE_PULSEAUDIO',
              ],
            }, {  # else: use_pulseaudio == 0
              'sources!': [
                'audio/pulse/pulse_output.cc',
                'audio/pulse/pulse_output.h',
              ],
            }],
          ],
        }],
        ['os_posix == 1 and OS != \"android\"', {
          # Video capture isn't supported in Android yet.
          'sources!': [
            'video/capture/video_capture_device_dummy.cc',
            'video/capture/video_capture_device_dummy.h',
          ],
        }],
        ['OS==\"mac\"', {
          'link_settings': {
            'libraries': [
              '$(SDKROOT)/System/Library/Frameworks/AudioUnit.framework',
              '$(SDKROOT)/System/Library/Frameworks/AudioToolbox.framework',
              '$(SDKROOT)/System/Library/Frameworks/CoreAudio.framework',
              '$(SDKROOT)/System/Library/Frameworks/CoreVideo.framework',
              '$(SDKROOT)/System/Library/Frameworks/QTKit.framework',
            ],
          },
        }],
        ['OS==\"win\"', {
          'sources!': [
            'audio/pulse/pulse_output.cc',
            'audio/pulse/pulse_output.h',
            'video/capture/video_capture_device_dummy.cc',
            'video/capture/video_capture_device_dummy.h',
          ],
        }],
        ['proprietary_codecs==1 or branding==\"Chrome\"', {
          'sources': [
            'mp4/avc.cc',
            'mp4/avc.h',
            'mp4/box_definitions.cc',
            'mp4/box_definitions.h',
            'mp4/box_reader.cc',
            'mp4/box_reader.h',
            'mp4/cenc.cc',
            'mp4/cenc.h',
            'mp4/mp4_stream_parser.cc',
            'mp4/mp4_stream_parser.h',
            'mp4/offset_byte_queue.cc',
            'mp4/offset_byte_queue.h',
            'mp4/track_run_iterator.cc',
            'mp4/track_run_iterator.h',
          ],
        }],
      ],
    },
    {
      'target_name': 'yuv_convert',
      'type': 'static_library',
      'include_dirs': [
        '..',
      ],
      'conditions': [
        ['order_profiling != 0', {
          'target_conditions' : [
            ['_toolset==\"target\"', {
              'cflags!': [ '-finstrument-functions' ],
            }],
          ],
        }],
        [ 'target_arch == \"ia32\" or target_arch == \"x64\"', {
          'dependencies': [
            'yuv_convert_simd_x86',
          ],
        }],
        [ 'target_arch == \"arm\"', {
          'dependencies': [
            'yuv_convert_simd_arm',
          ],
        }],
      ],
      'sources': [
        'base/yuv_convert.cc',
        'base/yuv_convert.h',
      ],
    },
    {
      'target_name': 'yuv_convert_simd_x86',
      'type': 'static_library',
      'include_dirs': [
        '..',
      ],
      'sources': [
        'base/simd/convert_rgb_to_yuv_c.cc',
        'base/simd/convert_rgb_to_yuv_sse2.cc',
        'base/simd/convert_rgb_to_yuv_ssse3.asm',
        'base/simd/convert_rgb_to_yuv_ssse3.cc',
        'base/simd/convert_rgb_to_yuv_ssse3.inc',
        'base/simd/convert_yuv_to_rgb_c.cc',
        'base/simd/convert_yuv_to_rgb_x86.cc',
        'base/simd/convert_yuv_to_rgb_mmx.asm',
        'base/simd/convert_yuv_to_rgb_mmx.inc',
        'base/simd/convert_yuv_to_rgb_sse.asm',
        'base/simd/filter_yuv.h',
        'base/simd/filter_yuv_c.cc',
        'base/simd/filter_yuv_mmx.cc',
        'base/simd/filter_yuv_sse2.cc',
        'base/simd/linear_scale_yuv_to_rgb_mmx.asm',
        'base/simd/linear_scale_yuv_to_rgb_mmx.inc',
        'base/simd/linear_scale_yuv_to_rgb_sse.asm',
        'base/simd/scale_yuv_to_rgb_mmx.asm',
        'base/simd/scale_yuv_to_rgb_mmx.inc',
        'base/simd/scale_yuv_to_rgb_sse.asm',
        'base/simd/yuv_to_rgb_table.cc',
        'base/simd/yuv_to_rgb_table.h',
      ],
      'conditions': [
        ['order_profiling != 0', {
          'target_conditions' : [
            ['_toolset==\"target\"', {
              'cflags!': [ '-finstrument-functions' ],
            }],
          ],
        }],
        [ 'target_arch == \"x64\"', {
          # Source files optimized for X64 systems.
          'sources': [
            'base/simd/linear_scale_yuv_to_rgb_mmx_x64.asm',
            'base/simd/scale_yuv_to_rgb_sse2_x64.asm',
          ],
        }],
        [ 'os_posix == 1 and OS != \"mac\" and OS != \"android\"', {
          'cflags': [
            '-msse2',
          ],
        }],
        [ 'OS == \"mac\"', {
          'configurations': {
            'Debug': {
              'xcode_settings': {
                # gcc on the mac builds horribly unoptimized sse code in debug
                # mode. Since this is rarely going to be debugged, run with full
                # optimizations in Debug as well as Release.
                'GCC_OPTIMIZATION_LEVEL': '3',  # -O3
               },
             },
          },
        }],
        [ 'OS==\"win\"', {
          'variables': {
            'yasm_flags': [
              '-DWIN32',
              '-DMSVC',
              '-DCHROMIUM',
              '-Isimd',
            ],
          },
        }],
        [ 'OS==\"mac\"', {
          'variables': {
            'yasm_flags': [
              '-DPREFIX',
              '-DMACHO',
              '-DCHROMIUM',
              '-Isimd',
            ],
          },
        }],
        [ 'os_posix==1 and OS!=\"mac\"', {
          'variables': {
            'conditions': [
              [ 'target_arch==\"ia32\"', {
                'yasm_flags': [
                  '-DX86_32',
                  '-DELF',
                  '-DCHROMIUM',
                  '-Isimd',
                ],
              }, {
                'yasm_flags': [
                  '-DARCH_X86_64',
                  '-DELF',
                  '-DPIC',
                  '-DCHROMIUM',
                  '-Isimd',
                ],
              }],
            ],
          },
        }],
      ],
      'variables': {
        'yasm_output_path': '<(SHARED_INTERMEDIATE_DIR)/media',
      },
      'msvs_2010_disable_uldi_when_referenced': 1,
      'includes': [
        '../third_party/yasm/yasm_compile.gypi',
      ],
    },
    {
      'target_name': 'yuv_convert_simd_arm',
      'type': 'static_library',
      'include_dirs': [
        '..',
      ],
      'sources': [
        'base/simd/convert_rgb_to_yuv_c.cc',
        'base/simd/convert_rgb_to_yuv.h',
        'base/simd/convert_yuv_to_rgb_c.cc',
        'base/simd/convert_yuv_to_rgb.h',
        'base/simd/filter_yuv.h',
        'base/simd/filter_yuv_c.cc',
        'base/simd/yuv_to_rgb_table.cc',
        'base/simd/yuv_to_rgb_table.h',
      ],
    },
    {
      'target_name': 'media_unittests',
      'type': 'executable',
      'dependencies': [
        'media',
        'media_test_support',
        'yuv_convert',
        '../base/base.gyp:base',
        '../base/base.gyp:base_i18n',
        '../base/base.gyp:test_support_base',
        '../testing/gmock.gyp:gmock',
        '../testing/gtest.gyp:gtest',
        '../ui/ui.gyp:ui',
      ],
      'sources': [
        'audio/async_socket_io_handler_unittest.cc',
        'audio/audio_input_controller_unittest.cc',
        'audio/audio_input_device_unittest.cc',
        'audio/audio_input_unittest.cc',
        'audio/audio_input_volume_unittest.cc',
        'audio/audio_low_latency_input_output_unittest.cc',
        'audio/audio_output_controller_unittest.cc',
        'audio/audio_output_proxy_unittest.cc',
        'audio/audio_parameters_unittest.cc',
        'audio/audio_util_unittest.cc',
        'audio/cross_process_notification_unittest.cc',
        'audio/linux/alsa_output_unittest.cc',
        'audio/mac/audio_low_latency_input_mac_unittest.cc',
        'audio/mac/audio_output_mac_unittest.cc',
        'audio/simple_sources_unittest.cc',
        'audio/win/audio_low_latency_input_win_unittest.cc',
        'audio/win/audio_low_latency_output_win_unittest.cc',
        'audio/win/audio_output_win_unittest.cc',
        'base/audio_renderer_mixer_unittest.cc',
        'base/audio_renderer_mixer_input_unittest.cc',
        'base/buffers_unittest.cc',
        'base/clock_unittest.cc',
        'base/composite_filter_unittest.cc',
        'base/data_buffer_unittest.cc',
        'base/decoder_buffer_unittest.cc',
        'base/djb2_unittest.cc',
        'base/fake_audio_render_callback.cc',
        'base/fake_audio_render_callback.h',
        'base/filter_collection_unittest.cc',
        'base/h264_bitstream_converter_unittest.cc',
        'base/pipeline_unittest.cc',
        'base/ranges_unittest.cc',
        'base/run_all_unittests.cc',
        'base/seekable_buffer_unittest.cc',
        'base/state_matrix_unittest.cc',
        'base/test_data_util.cc',
        'base/test_data_util.h',
        'base/video_frame_unittest.cc',
        'base/video_util_unittest.cc',
        'base/yuv_convert_unittest.cc',
        'crypto/aes_decryptor_unittest.cc',
        'ffmpeg/ffmpeg_common_unittest.cc',
        'filters/audio_renderer_algorithm_unittest.cc',
        'filters/audio_renderer_impl_unittest.cc',
        'filters/bitstream_converter_unittest.cc',
        'filters/chunk_demuxer_unittest.cc',
        'filters/ffmpeg_audio_decoder_unittest.cc',
        'filters/ffmpeg_decoder_unittest.h',
        'filters/ffmpeg_demuxer_unittest.cc',
        'filters/ffmpeg_glue_unittest.cc',
        'filters/ffmpeg_h264_bitstream_converter_unittest.cc',
        'filters/ffmpeg_video_decoder_unittest.cc',
        'filters/file_data_source_unittest.cc',
        'filters/pipeline_integration_test.cc',
        'filters/pipeline_integration_test_base.cc',
        'filters/source_buffer_stream_unittest.cc',
        'filters/video_renderer_base_unittest.cc',
        'video/capture/video_capture_device_unittest.cc',
        'webm/cluster_builder.cc',
        'webm/cluster_builder.h',
        'webm/webm_cluster_parser_unittest.cc',
        'webm/webm_content_encodings_client_unittest.cc',
        'webm/webm_parser_unittest.cc',
      ],
      'conditions': [
        ['os_posix==1 and OS!=\"mac\"', {
          'conditions': [
            ['linux_use_tcmalloc==1', {
              'dependencies': [
                '../base/allocator/allocator.gyp:allocator',
              ],
            }],
          ],
        }],
        ['OS != \"android\"', {
          'dependencies': [
            '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg',
          ],
        }],
        ['OS == \"android\"', {
          'sources!': [
            'audio/audio_input_volume_unittest.cc',
            'base/test_data_util.cc',
            'base/test_data_util.h',
            'ffmpeg/ffmpeg_common_unittest.cc',
            'filters/ffmpeg_audio_decoder_unittest.cc',
            'filters/bitstream_converter_unittest.cc',
            'filters/chunk_demuxer_unittest.cc',
            'filters/ffmpeg_demuxer_unittest.cc',
            'filters/ffmpeg_glue_unittest.cc',
            'filters/ffmpeg_h264_bitstream_converter_unittest.cc',
            'filters/ffmpeg_video_decoder_unittest.cc',
            'filters/pipeline_integration_test.cc',
            'filters/pipeline_integration_test_base.cc',
            'mp4/mp4_stream_parser_unittest.cc',
            'webm/webm_cluster_parser_unittest.cc',
          ],
        }],
        ['OS == \"linux\"', {
          'conditions': [
            ['use_cras == 1', {
              'sources': [
                'audio/linux/cras_output_unittest.cc',
              ],
              'defines': [
                'USE_CRAS',
              ],
            }],
          ],
        }],
        [ 'target_arch==\"ia32\" or target_arch==\"x64\"', {
          'sources': [
            'base/simd/convert_rgb_to_yuv_unittest.cc',
          ],
        }],
        ['proprietary_codecs==1 or branding==\"Chrome\"', {
          'sources': [
            'mp4/avc_unittest.cc',
            'mp4/box_reader_unittest.cc',
            'mp4/mp4_stream_parser_unittest.cc',
            'mp4/offset_byte_queue_unittest.cc',
          ],
        }],
      ],
    },
    {
      'target_name': 'media_test_support',
      'type': 'static_library',
      'dependencies': [
        'media',
        '../base/base.gyp:base',
        '../testing/gmock.gyp:gmock',
        '../testing/gtest.gyp:gtest',
      ],
      'sources': [
        'audio/test_audio_input_controller_factory.cc',
        'audio/test_audio_input_controller_factory.h',
        'base/mock_callback.cc',
        'base/mock_callback.h',
        'base/mock_data_source_host.cc',
        'base/mock_data_source_host.h',
        'base/mock_demuxer_host.cc',
        'base/mock_demuxer_host.h',
        'base/mock_filter_host.cc',
        'base/mock_filter_host.h',
        'base/mock_filters.cc',
        'base/mock_filters.h',
      ],
    },
    {
      'target_name': 'scaler_bench',
      'type': 'executable',
      'dependencies': [
        'media',
        'yuv_convert',
        '../base/base.gyp:base',
        '../skia/skia.gyp:skia',
      ],
      'sources': [
        'tools/scaler_bench/scaler_bench.cc',
      ],
    },
    {
      'target_name': 'qt_faststart',
      'type': 'executable',
      'sources': [
        'tools/qt_faststart/qt_faststart.c'
      ],
    },
    {
      'target_name': 'seek_tester',
      'type': 'executable',
      'dependencies': [
        'media',
        '../base/base.gyp:base',
      ],
      'sources': [
        'tools/seek_tester/seek_tester.cc',
      ],
    },
  ],
  'conditions': [
    ['OS==\"win\"', {
      'targets': [
        {
          'target_name': 'player_wtl',
          'type': 'executable',
          'dependencies': [
            'media',
            'yuv_convert',
            '../base/base.gyp:base',
            '../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
            '../ui/ui.gyp:ui',
          ],
          'include_dirs': [
            '<(DEPTH)/third_party/wtl/include',
          ],
          'sources': [
            'tools/player_wtl/list.h',
            'tools/player_wtl/mainfrm.h',
            'tools/player_wtl/movie.cc',
            'tools/player_wtl/movie.h',
            'tools/player_wtl/player_wtl.cc',
            'tools/player_wtl/player_wtl.rc',
            'tools/player_wtl/props.h',
            'tools/player_wtl/seek.h',
            'tools/player_wtl/resource.h',
            'tools/player_wtl/view.h',
          ],
          'msvs_settings': {
            'VCLinkerTool': {
              'SubSystem': '2',         # Set /SUBSYSTEM:WINDOWS
            },
          },
          'defines': [
            '_CRT_SECURE_NO_WARNINGS=1',
          ],
        },
      ],
    }],
    ['OS == \"win\" or toolkit_uses_gtk == 1', {
      'targets': [
        {
          'target_name': 'shader_bench',
          'type': 'executable',
          'dependencies': [
            'media',
            'yuv_convert',
            '../base/base.gyp:base',
            '../ui/gl/gl.gyp:gl',
          ],
          'sources': [
            'tools/shader_bench/shader_bench.cc',
            'tools/shader_bench/cpu_color_painter.cc',
            'tools/shader_bench/cpu_color_painter.h',
            'tools/shader_bench/gpu_color_painter.cc',
            'tools/shader_bench/gpu_color_painter.h',
            'tools/shader_bench/gpu_painter.cc',
            'tools/shader_bench/gpu_painter.h',
            'tools/shader_bench/painter.cc',
            'tools/shader_bench/painter.h',
            'tools/shader_bench/window.cc',
            'tools/shader_bench/window.h',
          ],
          'conditions': [
            ['toolkit_uses_gtk == 1', {
              'dependencies': [
                '../build/linux/system.gyp:gtk',
              ],
              'sources': [
                'tools/shader_bench/window_linux.cc',
              ],
            }],
            ['OS==\"win\"', {
              'dependencies': [
                '../third_party/angle/src/build_angle.gyp:libEGL',
                '../third_party/angle/src/build_angle.gyp:libGLESv2',
              ],
              'sources': [
                'tools/shader_bench/window_win.cc',
              ],
            }],
          ],
        },
      ],
    }],
    ['OS == \"linux\" and target_arch != \"arm\"', {
      'targets': [
        {
          'target_name': 'tile_render_bench',
          'type': 'executable',
          'dependencies': [
            '../base/base.gyp:base',
            '../ui/gl/gl.gyp:gl',
          ],
          'libraries': [
            '-lGL',
            '-ldl',
          ],
          'sources': [
            'tools/tile_render_bench/tile_render_bench.cc',
          ],
        },
      ],
    }],
    ['os_posix == 1 and OS != \"mac\" and OS != \"android\"', {
      'targets': [
        {
          'target_name': 'player_x11',
          'type': 'executable',
          'dependencies': [
            'media',
            'yuv_convert',
            '../base/base.gyp:base',
            '../ui/gl/gl.gyp:gl',
          ],
          'link_settings': {
            'libraries': [
              '-ldl',
              '-lX11',
              '-lXrender',
              '-lXext',
            ],
          },
          'sources': [
            'tools/player_x11/data_source_logger.cc',
            'tools/player_x11/data_source_logger.h',
            'tools/player_x11/gl_video_renderer.cc',
            'tools/player_x11/gl_video_renderer.h',
            'tools/player_x11/player_x11.cc',
            'tools/player_x11/x11_video_renderer.cc',
            'tools/player_x11/x11_video_renderer.h',
          ],
        },
      ],
    }],
    ['OS == \"android\"', {
      'targets': [
        {
          'target_name': 'player_android',
          'type': 'static_library',
          'sources': [
            'base/android/media_player_bridge.cc',
            'base/android/media_player_bridge.h',
          ],
          'dependencies': [
            '../base/base.gyp:base',
          ],
          'include_dirs': [
            '<(SHARED_INTERMEDIATE_DIR)/media',
          ],
          'actions': [
            {
              'action_name': 'generate-jni-headers',
              'inputs': [
                '../base/android/jni_generator/jni_generator.py',
                'base/android/java/src/org/chromium/media/MediaPlayerListener.java',
              ],
              'outputs': [
                '<(SHARED_INTERMEDIATE_DIR)/media/jni/media_player_listener_jni.h',
              ],
              'action': [
                'python',
                '<(DEPTH)/base/android/jni_generator/jni_generator.py',
                '-o',
                '<@(_inputs)',
                '<@(_outputs)',
              ],
            },
          ],
        },
        {
          'target_name': 'media_java',
          'type': 'none',
          'dependencies': [ '../base/base.gyp:base_java' ],
          'variables': {
            'package_name': 'media',
            'java_in_dir': 'base/android/java',
          },
          'includes': [ '../build/java.gypi' ],
        },

      ],
    }, { # OS != \"android\"'
      # Android does not use ffmpeg, so disable the targets which require it.
      'targets': [
        {
          'target_name': 'ffmpeg_unittests',
          'type': 'executable',
          'dependencies': [
            'media',
            'media_test_support',
            '../base/base.gyp:base',
            '../base/base.gyp:base_i18n',
            '../base/base.gyp:test_support_base',
            '../base/base.gyp:test_support_perf',
            '../testing/gtest.gyp:gtest',
            '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg',
          ],
          'sources': [
            'ffmpeg/ffmpeg_unittest.cc',
          ],
          'conditions': [
            ['toolkit_uses_gtk == 1', {
              'dependencies': [
                # Needed for the following #include chain:
                #   base/run_all_unittests.cc
                #   ../base/test_suite.h
                #   gtk/gtk.h
                '../build/linux/system.gyp:gtk',
              ],
              'conditions': [
                ['linux_use_tcmalloc==1', {
                  'dependencies': [
                    '../base/allocator/allocator.gyp:allocator',
                  ],
                }],
              ],
            }],
          ],
        },
        {
          'target_name': 'ffmpeg_regression_tests',
          'type': 'executable',
          'dependencies': [
            'media',
            'media_test_support',
            '../base/base.gyp:test_support_base',
            '../testing/gmock.gyp:gmock',
            '../testing/gtest.gyp:gtest',
            '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg',
          ],
          'sources': [
            'base/test_data_util.cc',
            'base/run_all_unittests.cc',
            'ffmpeg/ffmpeg_regression_tests.cc',
            'filters/pipeline_integration_test_base.cc',
          ],
          'conditions': [
            ['os_posix==1 and OS!=\"mac\"', {
              'conditions': [
                ['linux_use_tcmalloc==1', {
                  'dependencies': [
                    '../base/allocator/allocator.gyp:allocator',
                  ],
                }],
              ],
            }],
          ],
        },
        {
          'target_name': 'ffmpeg_tests',
          'type': 'executable',
          'dependencies': [
            'media',
            '../base/base.gyp:base',
            '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg',
          ],
          'sources': [
            'test/ffmpeg_tests/ffmpeg_tests.cc',
          ],
        },
        {
          'target_name': 'media_bench',
          'type': 'executable',
          'dependencies': [
            'media',
            '../base/base.gyp:base',
            '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg',
          ],
          'sources': [
            'tools/media_bench/media_bench.cc',
          ],
        },
      ],
    }]
  ],
}
" 0 64 (face font-lock-comment-face) 64 137 (face font-lock-comment-face) 137 166 (face font-lock-comment-face) 166 171 nil 171 172 (face font-lock-string-face) 172 181 (face font-lock-keyword-face) 181 182 (face font-lock-string-face) 182 190 nil 190 191 (face font-lock-string-face) 191 204 (face font-lock-variable-name-face) 204 205 (face font-lock-string-face) 205 214 nil 214 269 (face font-lock-comment-face) 269 273 nil 273 274 (face font-lock-string-face) 274 289 (face font-lock-variable-name-face) 289 290 (face font-lock-string-face) 290 299 nil 299 365 (face font-lock-comment-face) 365 369 nil 369 370 (face font-lock-string-face) 370 379 (face font-lock-variable-name-face) 379 380 (face font-lock-string-face) 380 392 nil 392 393 (face font-lock-string-face) 393 400 (face font-lock-keyword-face) 400 401 (face font-lock-string-face) 401 417 nil 417 418 (face font-lock-string-face) 418 429 (face font-lock-keyword-face) 429 430 (face font-lock-string-face) 430 432 nil 432 433 (face font-lock-string-face) 433 438 (face font-lock-function-name-face) 438 439 (face font-lock-string-face) 439 447 nil 447 448 (face font-lock-string-face) 448 452 (face font-lock-keyword-face) 452 453 (face font-lock-string-face) 453 455 nil 455 458 (face font-lock-string-face) 458 467 (face font-lock-variable-name-face) 467 469 (face font-lock-string-face) 469 477 nil 477 478 (face font-lock-string-face) 478 490 (face font-lock-keyword-face) 490 491 (face font-lock-string-face) 491 503 nil 503 504 (face font-lock-string-face) 504 515 (face font-lock-function-name-face) 515 516 (face font-lock-string-face) 516 526 nil 526 527 (face font-lock-string-face) 527 548 (face font-lock-function-name-face) 548 549 (face font-lock-string-face) 549 559 nil 559 560 (face font-lock-string-face) 560 643 (face font-lock-function-name-face) 643 644 (face font-lock-string-face) 644 654 nil 654 655 (face font-lock-string-face) 655 696 (face font-lock-function-name-face) 696 697 (face font-lock-string-face) 697 707 nil 707 708 (face font-lock-string-face) 708 735 (face font-lock-function-name-face) 735 736 (face font-lock-string-face) 736 746 nil 746 747 (face font-lock-string-face) 747 784 (face font-lock-function-name-face) 784 785 (face font-lock-string-face) 785 795 nil 795 796 (face font-lock-string-face) 796 811 (face font-lock-function-name-face) 811 812 (face font-lock-string-face) 812 829 nil 829 830 (face font-lock-string-face) 830 837 (face font-lock-keyword-face) 837 838 (face font-lock-string-face) 838 850 nil 850 851 (face font-lock-string-face) 851 871 (face font-lock-preprocessor-face) 871 872 (face font-lock-string-face) 872 889 nil 889 890 (face font-lock-string-face) 890 902 (face font-lock-keyword-face) 902 903 (face font-lock-string-face) 903 915 nil 915 916 (face font-lock-string-face) 916 918 (face font-lock-constant-face) 918 919 (face font-lock-string-face) 919 936 nil 936 937 (face font-lock-string-face) 937 944 (face font-lock-keyword-face) 944 945 (face font-lock-string-face) 945 957 nil 957 958 (face font-lock-string-face) 958 996 (face font-lock-constant-face) 996 997 (face font-lock-string-face) 997 1007 nil 1007 1008 (face font-lock-string-face) 1008 1045 (face font-lock-constant-face) 1045 1046 (face font-lock-string-face) 1046 1056 nil 1056 1057 (face font-lock-string-face) 1057 1100 (face font-lock-constant-face) 1100 1101 (face font-lock-string-face) 1101 1111 nil 1111 1112 (face font-lock-string-face) 1112 1154 (face font-lock-constant-face) 1154 1155 (face font-lock-string-face) 1155 1165 nil 1165 1166 (face font-lock-string-face) 1166 1197 (face font-lock-constant-face) 1197 1198 (face font-lock-string-face) 1198 1208 nil 1208 1209 (face font-lock-string-face) 1209 1239 (face font-lock-constant-face) 1239 1240 (face font-lock-string-face) 1240 1250 nil 1250 1251 (face font-lock-string-face) 1251 1283 (face font-lock-constant-face) 1283 1284 (face font-lock-string-face) 1284 1294 nil 1294 1295 (face font-lock-string-face) 1295 1326 (face font-lock-constant-face) 1326 1327 (face font-lock-string-face) 1327 1337 nil 1337 1338 (face font-lock-string-face) 1338 1369 (face font-lock-constant-face) 1369 1370 (face font-lock-string-face) 1370 1380 nil 1380 1381 (face font-lock-string-face) 1381 1419 (face font-lock-constant-face) 1419 1420 (face font-lock-string-face) 1420 1430 nil 1430 1431 (face font-lock-string-face) 1431 1467 (face font-lock-constant-face) 1467 1468 (face font-lock-string-face) 1468 1478 nil 1478 1479 (face font-lock-string-face) 1479 1507 (face font-lock-constant-face) 1507 1508 (face font-lock-string-face) 1508 1518 nil 1518 1519 (face font-lock-string-face) 1519 1546 (face font-lock-constant-face) 1546 1547 (face font-lock-string-face) 1547 1557 nil 1557 1558 (face font-lock-string-face) 1558 1574 (face font-lock-constant-face) 1574 1575 (face font-lock-string-face) 1575 1585 nil 1585 1586 (face font-lock-string-face) 1586 1617 (face font-lock-constant-face) 1617 1618 (face font-lock-string-face) 1618 1628 nil 1628 1629 (face font-lock-string-face) 1629 1659 (face font-lock-constant-face) 1659 1660 (face font-lock-string-face) 1660 1670 nil 1670 1671 (face font-lock-string-face) 1671 1703 (face font-lock-constant-face) 1703 1704 (face font-lock-string-face) 1704 1714 nil 1714 1715 (face font-lock-string-face) 1715 1746 (face font-lock-constant-face) 1746 1747 (face font-lock-string-face) 1747 1757 nil 1757 1758 (face font-lock-string-face) 1758 1784 (face font-lock-constant-face) 1784 1785 (face font-lock-string-face) 1785 1795 nil 1795 1796 (face font-lock-string-face) 1796 1821 (face font-lock-constant-face) 1821 1822 (face font-lock-string-face) 1822 1832 nil 1832 1833 (face font-lock-string-face) 1833 1855 (face font-lock-constant-face) 1855 1856 (face font-lock-string-face) 1856 1866 nil 1866 1867 (face font-lock-string-face) 1867 1888 (face font-lock-constant-face) 1888 1889 (face font-lock-string-face) 1889 1899 nil 1899 1900 (face font-lock-string-face) 1900 1927 (face font-lock-constant-face) 1927 1928 (face font-lock-string-face) 1928 1938 nil 1938 1939 (face font-lock-string-face) 1939 1965 (face font-lock-constant-face) 1965 1966 (face font-lock-string-face) 1966 1976 nil 1976 1977 (face font-lock-string-face) 1977 2009 (face font-lock-constant-face) 2009 2010 (face font-lock-string-face) 2010 2020 nil 2020 2021 (face font-lock-string-face) 2021 2052 (face font-lock-constant-face) 2052 2053 (face font-lock-string-face) 2053 2063 nil 2063 2064 (face font-lock-string-face) 2064 2096 (face font-lock-constant-face) 2096 2097 (face font-lock-string-face) 2097 2107 nil 2107 2108 (face font-lock-string-face) 2108 2139 (face font-lock-constant-face) 2139 2140 (face font-lock-string-face) 2140 2150 nil 2150 2151 (face font-lock-string-face) 2151 2188 (face font-lock-constant-face) 2188 2189 (face font-lock-string-face) 2189 2199 nil 2199 2200 (face font-lock-string-face) 2200 2236 (face font-lock-constant-face) 2236 2237 (face font-lock-string-face) 2237 2247 nil 2247 2248 (face font-lock-string-face) 2248 2275 (face font-lock-constant-face) 2275 2276 (face font-lock-string-face) 2276 2286 nil 2286 2287 (face font-lock-string-face) 2287 2313 (face font-lock-constant-face) 2313 2314 (face font-lock-string-face) 2314 2324 nil 2324 2325 (face font-lock-string-face) 2325 2352 (face font-lock-constant-face) 2352 2353 (face font-lock-string-face) 2353 2363 nil 2363 2364 (face font-lock-string-face) 2364 2390 (face font-lock-constant-face) 2390 2391 (face font-lock-string-face) 2391 2401 nil 2401 2402 (face font-lock-string-face) 2402 2427 (face font-lock-constant-face) 2427 2428 (face font-lock-string-face) 2428 2438 nil 2438 2439 (face font-lock-string-face) 2439 2463 (face font-lock-constant-face) 2463 2464 (face font-lock-string-face) 2464 2474 nil 2474 2475 (face font-lock-string-face) 2475 2494 (face font-lock-constant-face) 2494 2495 (face font-lock-string-face) 2495 2505 nil 2505 2506 (face font-lock-string-face) 2506 2524 (face font-lock-constant-face) 2524 2525 (face font-lock-string-face) 2525 2535 nil 2535 2536 (face font-lock-string-face) 2536 2571 (face font-lock-constant-face) 2571 2572 (face font-lock-string-face) 2572 2582 nil 2582 2583 (face font-lock-string-face) 2583 2617 (face font-lock-constant-face) 2617 2618 (face font-lock-string-face) 2618 2628 nil 2628 2629 (face font-lock-string-face) 2629 2668 (face font-lock-constant-face) 2668 2669 (face font-lock-string-face) 2669 2679 nil 2679 2680 (face font-lock-string-face) 2680 2721 (face font-lock-constant-face) 2721 2722 (face font-lock-string-face) 2722 2732 nil 2732 2733 (face font-lock-string-face) 2733 2765 (face font-lock-constant-face) 2765 2766 (face font-lock-string-face) 2766 2776 nil 2776 2777 (face font-lock-string-face) 2777 2808 (face font-lock-constant-face) 2808 2809 (face font-lock-string-face) 2809 2819 nil 2819 2820 (face font-lock-string-face) 2820 2853 (face font-lock-constant-face) 2853 2854 (face font-lock-string-face) 2854 2864 nil 2864 2865 (face font-lock-string-face) 2865 2897 (face font-lock-constant-face) 2897 2898 (face font-lock-string-face) 2898 2908 nil 2908 2909 (face font-lock-string-face) 2909 2943 (face font-lock-constant-face) 2943 2944 (face font-lock-string-face) 2944 2954 nil 2954 2955 (face font-lock-string-face) 2955 2988 (face font-lock-constant-face) 2988 2989 (face font-lock-string-face) 2989 2999 nil 2999 3000 (face font-lock-string-face) 3000 3025 (face font-lock-constant-face) 3025 3026 (face font-lock-string-face) 3026 3036 nil 3036 3037 (face font-lock-string-face) 3037 3061 (face font-lock-constant-face) 3061 3062 (face font-lock-string-face) 3062 3072 nil 3072 3073 (face font-lock-string-face) 3073 3099 (face font-lock-constant-face) 3099 3100 (face font-lock-string-face) 3100 3110 nil 3110 3111 (face font-lock-string-face) 3111 3136 (face font-lock-constant-face) 3136 3137 (face font-lock-string-face) 3137 3147 nil 3147 3148 (face font-lock-string-face) 3148 3172 (face font-lock-constant-face) 3172 3173 (face font-lock-string-face) 3173 3183 nil 3183 3184 (face font-lock-string-face) 3184 3207 (face font-lock-constant-face) 3207 3208 (face font-lock-string-face) 3208 3218 nil 3218 3219 (face font-lock-string-face) 3219 3246 (face font-lock-constant-face) 3246 3247 (face font-lock-string-face) 3247 3257 nil 3257 3258 (face font-lock-string-face) 3258 3284 (face font-lock-constant-face) 3284 3285 (face font-lock-string-face) 3285 3295 nil 3295 3296 (face font-lock-string-face) 3296 3322 (face font-lock-constant-face) 3322 3323 (face font-lock-string-face) 3323 3333 nil 3333 3334 (face font-lock-string-face) 3334 3359 (face font-lock-constant-face) 3359 3360 (face font-lock-string-face) 3360 3370 nil 3370 3371 (face font-lock-string-face) 3371 3409 (face font-lock-constant-face) 3409 3410 (face font-lock-string-face) 3410 3420 nil 3420 3421 (face font-lock-string-face) 3421 3458 (face font-lock-constant-face) 3458 3459 (face font-lock-string-face) 3459 3469 nil 3469 3470 (face font-lock-string-face) 3470 3498 (face font-lock-constant-face) 3498 3499 (face font-lock-string-face) 3499 3509 nil 3509 3510 (face font-lock-string-face) 3510 3537 (face font-lock-constant-face) 3537 3538 (face font-lock-string-face) 3538 3548 nil 3548 3549 (face font-lock-string-face) 3549 3589 (face font-lock-constant-face) 3589 3590 (face font-lock-string-face) 3590 3600 nil 3600 3601 (face font-lock-string-face) 3601 3640 (face font-lock-constant-face) 3640 3641 (face font-lock-string-face) 3641 3651 nil 3651 3652 (face font-lock-string-face) 3652 3693 (face font-lock-constant-face) 3693 3694 (face font-lock-string-face) 3694 3704 nil 3704 3705 (face font-lock-string-face) 3705 3745 (face font-lock-constant-face) 3745 3746 (face font-lock-string-face) 3746 3756 nil 3756 3757 (face font-lock-string-face) 3757 3787 (face font-lock-constant-face) 3787 3788 (face font-lock-string-face) 3788 3798 nil 3798 3799 (face font-lock-string-face) 3799 3828 (face font-lock-constant-face) 3828 3829 (face font-lock-string-face) 3829 3839 nil 3839 3840 (face font-lock-string-face) 3840 3869 (face font-lock-constant-face) 3869 3870 (face font-lock-string-face) 3870 3880 nil 3880 3881 (face font-lock-string-face) 3881 3909 (face font-lock-constant-face) 3909 3910 (face font-lock-string-face) 3910 3920 nil 3920 3921 (face font-lock-string-face) 3921 3945 (face font-lock-constant-face) 3945 3946 (face font-lock-string-face) 3946 3956 nil 3956 3957 (face font-lock-string-face) 3957 3980 (face font-lock-constant-face) 3980 3981 (face font-lock-string-face) 3981 3991 nil 3991 3992 (face font-lock-string-face) 3992 4019 (face font-lock-constant-face) 4019 4020 (face font-lock-string-face) 4020 4030 nil 4030 4031 (face font-lock-string-face) 4031 4057 (face font-lock-constant-face) 4057 4058 (face font-lock-string-face) 4058 4068 nil 4068 4069 (face font-lock-string-face) 4069 4090 (face font-lock-constant-face) 4090 4091 (face font-lock-string-face) 4091 4101 nil 4101 4102 (face font-lock-string-face) 4102 4122 (face font-lock-constant-face) 4122 4123 (face font-lock-string-face) 4123 4133 nil 4133 4134 (face font-lock-string-face) 4134 4157 (face font-lock-constant-face) 4157 4158 (face font-lock-string-face) 4158 4168 nil 4168 4169 (face font-lock-string-face) 4169 4191 (face font-lock-constant-face) 4191 4192 (face font-lock-string-face) 4192 4202 nil 4202 4203 (face font-lock-string-face) 4203 4243 (face font-lock-constant-face) 4243 4244 (face font-lock-string-face) 4244 4254 nil 4254 4255 (face font-lock-string-face) 4255 4294 (face font-lock-constant-face) 4294 4295 (face font-lock-string-face) 4295 4305 nil 4305 4306 (face font-lock-string-face) 4306 4347 (face font-lock-constant-face) 4347 4348 (face font-lock-string-face) 4348 4358 nil 4358 4359 (face font-lock-string-face) 4359 4399 (face font-lock-constant-face) 4399 4400 (face font-lock-string-face) 4400 4410 nil 4410 4411 (face font-lock-string-face) 4411 4441 (face font-lock-constant-face) 4441 4442 (face font-lock-string-face) 4442 4452 nil 4452 4453 (face font-lock-string-face) 4453 4482 (face font-lock-constant-face) 4482 4483 (face font-lock-string-face) 4483 4493 nil 4493 4494 (face font-lock-string-face) 4494 4523 (face font-lock-constant-face) 4523 4524 (face font-lock-string-face) 4524 4534 nil 4534 4535 (face font-lock-string-face) 4535 4563 (face font-lock-constant-face) 4563 4564 (face font-lock-string-face) 4564 4574 nil 4574 4575 (face font-lock-string-face) 4575 4610 (face font-lock-constant-face) 4610 4611 (face font-lock-string-face) 4611 4621 nil 4621 4622 (face font-lock-string-face) 4622 4656 (face font-lock-constant-face) 4656 4657 (face font-lock-string-face) 4657 4667 nil 4667 4668 (face font-lock-string-face) 4668 4697 (face font-lock-constant-face) 4697 4698 (face font-lock-string-face) 4698 4708 nil 4708 4709 (face font-lock-string-face) 4709 4737 (face font-lock-constant-face) 4737 4738 (face font-lock-string-face) 4738 4748 nil 4748 4749 (face font-lock-string-face) 4749 4780 (face font-lock-constant-face) 4780 4781 (face font-lock-string-face) 4781 4791 nil 4791 4792 (face font-lock-string-face) 4792 4822 (face font-lock-constant-face) 4822 4823 (face font-lock-string-face) 4823 4833 nil 4833 4834 (face font-lock-string-face) 4834 4869 (face font-lock-constant-face) 4869 4870 (face font-lock-string-face) 4870 4880 nil 4880 4881 (face font-lock-string-face) 4881 4915 (face font-lock-constant-face) 4915 4916 (face font-lock-string-face) 4916 4926 nil 4926 4927 (face font-lock-string-face) 4927 4948 (face font-lock-constant-face) 4948 4949 (face font-lock-string-face) 4949 4959 nil 4959 4960 (face font-lock-string-face) 4960 4980 (face font-lock-constant-face) 4980 4981 (face font-lock-string-face) 4981 4991 nil 4991 4992 (face font-lock-string-face) 4992 5020 (face font-lock-constant-face) 5020 5021 (face font-lock-string-face) 5021 5031 nil 5031 5032 (face font-lock-string-face) 5032 5059 (face font-lock-constant-face) 5059 5060 (face font-lock-string-face) 5060 5070 nil 5070 5071 (face font-lock-string-face) 5071 5092 (face font-lock-constant-face) 5092 5093 (face font-lock-string-face) 5093 5103 nil 5103 5104 (face font-lock-string-face) 5104 5132 (face font-lock-constant-face) 5132 5133 (face font-lock-string-face) 5133 5143 nil 5143 5144 (face font-lock-string-face) 5144 5171 (face font-lock-constant-face) 5171 5172 (face font-lock-string-face) 5172 5182 nil 5182 5183 (face font-lock-string-face) 5183 5217 (face font-lock-constant-face) 5217 5218 (face font-lock-string-face) 5218 5228 nil 5228 5229 (face font-lock-string-face) 5229 5262 (face font-lock-constant-face) 5262 5263 (face font-lock-string-face) 5263 5273 nil 5273 5274 (face font-lock-string-face) 5274 5297 (face font-lock-constant-face) 5297 5298 (face font-lock-string-face) 5298 5308 nil 5308 5309 (face font-lock-string-face) 5309 5324 (face font-lock-constant-face) 5324 5325 (face font-lock-string-face) 5325 5335 nil 5335 5336 (face font-lock-string-face) 5336 5350 (face font-lock-constant-face) 5350 5351 (face font-lock-string-face) 5351 5361 nil 5361 5362 (face font-lock-string-face) 5362 5380 (face font-lock-constant-face) 5380 5381 (face font-lock-string-face) 5381 5391 nil 5391 5392 (face font-lock-string-face) 5392 5409 (face font-lock-constant-face) 5409 5410 (face font-lock-string-face) 5410 5420 nil 5420 5421 (face font-lock-string-face) 5421 5443 (face font-lock-constant-face) 5443 5444 (face font-lock-string-face) 5444 5454 nil 5454 5455 (face font-lock-string-face) 5455 5476 (face font-lock-constant-face) 5476 5477 (face font-lock-string-face) 5477 5487 nil 5487 5488 (face font-lock-string-face) 5488 5501 (face font-lock-constant-face) 5501 5502 (face font-lock-string-face) 5502 5512 nil 5512 5513 (face font-lock-string-face) 5513 5525 (face font-lock-constant-face) 5525 5526 (face font-lock-string-face) 5526 5536 nil 5536 5537 (face font-lock-string-face) 5537 5561 (face font-lock-constant-face) 5561 5562 (face font-lock-string-face) 5562 5572 nil 5572 5573 (face font-lock-string-face) 5573 5596 (face font-lock-constant-face) 5596 5597 (face font-lock-string-face) 5597 5607 nil 5607 5608 (face font-lock-string-face) 5608 5627 (face font-lock-constant-face) 5627 5628 (face font-lock-string-face) 5628 5638 nil 5638 5639 (face font-lock-string-face) 5639 5657 (face font-lock-constant-face) 5657 5658 (face font-lock-string-face) 5658 5668 nil 5668 5669 (face font-lock-string-face) 5669 5688 (face font-lock-constant-face) 5688 5689 (face font-lock-string-face) 5689 5699 nil 5699 5700 (face font-lock-string-face) 5700 5718 (face font-lock-constant-face) 5718 5719 (face font-lock-string-face) 5719 5729 nil 5729 5730 (face font-lock-string-face) 5730 5752 (face font-lock-constant-face) 5752 5753 (face font-lock-string-face) 5753 5763 nil 5763 5764 (face font-lock-string-face) 5764 5785 (face font-lock-constant-face) 5785 5786 (face font-lock-string-face) 5786 5796 nil 5796 5797 (face font-lock-string-face) 5797 5819 (face font-lock-constant-face) 5819 5820 (face font-lock-string-face) 5820 5830 nil 5830 5831 (face font-lock-string-face) 5831 5852 (face font-lock-constant-face) 5852 5853 (face font-lock-string-face) 5853 5863 nil 5863 5864 (face font-lock-string-face) 5864 5880 (face font-lock-constant-face) 5880 5881 (face font-lock-string-face) 5881 5891 nil 5891 5892 (face font-lock-string-face) 5892 5915 (face font-lock-constant-face) 5915 5916 (face font-lock-string-face) 5916 5926 nil 5926 5927 (face font-lock-string-face) 5927 5942 (face font-lock-constant-face) 5942 5943 (face font-lock-string-face) 5943 5953 nil 5953 5954 (face font-lock-string-face) 5954 5968 (face font-lock-constant-face) 5968 5969 (face font-lock-string-face) 5969 5979 nil 5979 5980 (face font-lock-string-face) 5980 6002 (face font-lock-constant-face) 6002 6003 (face font-lock-string-face) 6003 6013 nil 6013 6014 (face font-lock-string-face) 6014 6035 (face font-lock-constant-face) 6035 6036 (face font-lock-string-face) 6036 6046 nil 6046 6047 (face font-lock-string-face) 6047 6059 (face font-lock-constant-face) 6059 6060 (face font-lock-string-face) 6060 6070 nil 6070 6071 (face font-lock-string-face) 6071 6082 (face font-lock-constant-face) 6082 6083 (face font-lock-string-face) 6083 6093 nil 6093 6094 (face font-lock-string-face) 6094 6119 (face font-lock-constant-face) 6119 6120 (face font-lock-string-face) 6120 6130 nil 6130 6131 (face font-lock-string-face) 6131 6155 (face font-lock-constant-face) 6155 6156 (face font-lock-string-face) 6156 6166 nil 6166 6167 (face font-lock-string-face) 6167 6185 (face font-lock-constant-face) 6185 6186 (face font-lock-string-face) 6186 6196 nil 6196 6197 (face font-lock-string-face) 6197 6212 (face font-lock-constant-face) 6212 6213 (face font-lock-string-face) 6213 6223 nil 6223 6224 (face font-lock-string-face) 6224 6238 (face font-lock-constant-face) 6238 6239 (face font-lock-string-face) 6239 6249 nil 6249 6250 (face font-lock-string-face) 6250 6282 (face font-lock-constant-face) 6282 6283 (face font-lock-string-face) 6283 6293 nil 6293 6294 (face font-lock-string-face) 6294 6325 (face font-lock-constant-face) 6325 6326 (face font-lock-string-face) 6326 6336 nil 6336 6337 (face font-lock-string-face) 6337 6349 (face font-lock-constant-face) 6349 6350 (face font-lock-string-face) 6350 6360 nil 6360 6361 (face font-lock-string-face) 6361 6382 (face font-lock-constant-face) 6382 6383 (face font-lock-string-face) 6383 6393 nil 6393 6394 (face font-lock-string-face) 6394 6413 (face font-lock-constant-face) 6413 6414 (face font-lock-string-face) 6414 6424 nil 6424 6425 (face font-lock-string-face) 6425 6442 (face font-lock-constant-face) 6442 6443 (face font-lock-string-face) 6443 6453 nil 6453 6454 (face font-lock-string-face) 6454 6470 (face font-lock-constant-face) 6470 6471 (face font-lock-string-face) 6471 6481 nil 6481 6482 (face font-lock-string-face) 6482 6504 (face font-lock-constant-face) 6504 6505 (face font-lock-string-face) 6505 6515 nil 6515 6516 (face font-lock-string-face) 6516 6535 (face font-lock-constant-face) 6535 6536 (face font-lock-string-face) 6536 6546 nil 6546 6547 (face font-lock-string-face) 6547 6569 (face font-lock-constant-face) 6569 6570 (face font-lock-string-face) 6570 6580 nil 6580 6581 (face font-lock-string-face) 6581 6602 (face font-lock-constant-face) 6602 6603 (face font-lock-string-face) 6603 6613 nil 6613 6614 (face font-lock-string-face) 6614 6631 (face font-lock-constant-face) 6631 6632 (face font-lock-string-face) 6632 6642 nil 6642 6643 (face font-lock-string-face) 6643 6671 (face font-lock-constant-face) 6671 6672 (face font-lock-string-face) 6672 6682 nil 6682 6683 (face font-lock-string-face) 6683 6710 (face font-lock-constant-face) 6710 6711 (face font-lock-string-face) 6711 6721 nil 6721 6722 (face font-lock-string-face) 6722 6738 (face font-lock-constant-face) 6738 6739 (face font-lock-string-face) 6739 6749 nil 6749 6750 (face font-lock-string-face) 6750 6765 (face font-lock-constant-face) 6765 6766 (face font-lock-string-face) 6766 6776 nil 6776 6777 (face font-lock-string-face) 6777 6800 (face font-lock-constant-face) 6800 6801 (face font-lock-string-face) 6801 6811 nil 6811 6812 (face font-lock-string-face) 6812 6834 (face font-lock-constant-face) 6834 6835 (face font-lock-string-face) 6835 6845 nil 6845 6846 (face font-lock-string-face) 6846 6860 (face font-lock-constant-face) 6860 6861 (face font-lock-string-face) 6861 6871 nil 6871 6872 (face font-lock-string-face) 6872 6885 (face font-lock-constant-face) 6885 6886 (face font-lock-string-face) 6886 6896 nil 6896 6897 (face font-lock-string-face) 6897 6920 (face font-lock-constant-face) 6920 6921 (face font-lock-string-face) 6921 6931 nil 6931 6932 (face font-lock-string-face) 6932 6954 (face font-lock-constant-face) 6954 6955 (face font-lock-string-face) 6955 6965 nil 6965 6966 (face font-lock-string-face) 6966 6986 (face font-lock-constant-face) 6986 6987 (face font-lock-string-face) 6987 6997 nil 6997 6998 (face font-lock-string-face) 6998 7017 (face font-lock-constant-face) 7017 7018 (face font-lock-string-face) 7018 7028 nil 7028 7029 (face font-lock-string-face) 7029 7050 (face font-lock-constant-face) 7050 7051 (face font-lock-string-face) 7051 7061 nil 7061 7062 (face font-lock-string-face) 7062 7082 (face font-lock-constant-face) 7082 7083 (face font-lock-string-face) 7083 7093 nil 7093 7094 (face font-lock-string-face) 7094 7122 (face font-lock-constant-face) 7122 7123 (face font-lock-string-face) 7123 7133 nil 7133 7134 (face font-lock-string-face) 7134 7161 (face font-lock-constant-face) 7161 7162 (face font-lock-string-face) 7162 7172 nil 7172 7173 (face font-lock-string-face) 7173 7194 (face font-lock-constant-face) 7194 7195 (face font-lock-string-face) 7195 7205 nil 7205 7206 (face font-lock-string-face) 7206 7226 (face font-lock-constant-face) 7226 7227 (face font-lock-string-face) 7227 7237 nil 7237 7238 (face font-lock-string-face) 7238 7266 (face font-lock-constant-face) 7266 7267 (face font-lock-string-face) 7267 7277 nil 7277 7278 (face font-lock-string-face) 7278 7305 (face font-lock-constant-face) 7305 7306 (face font-lock-string-face) 7306 7316 nil 7316 7317 (face font-lock-string-face) 7317 7336 (face font-lock-constant-face) 7336 7337 (face font-lock-string-face) 7337 7347 nil 7347 7348 (face font-lock-string-face) 7348 7366 (face font-lock-constant-face) 7366 7367 (face font-lock-string-face) 7367 7377 nil 7377 7378 (face font-lock-string-face) 7378 7399 (face font-lock-constant-face) 7399 7400 (face font-lock-string-face) 7400 7410 nil 7410 7411 (face font-lock-string-face) 7411 7429 (face font-lock-constant-face) 7429 7430 (face font-lock-string-face) 7430 7440 nil 7440 7441 (face font-lock-string-face) 7441 7458 (face font-lock-constant-face) 7458 7459 (face font-lock-string-face) 7459 7469 nil 7469 7470 (face font-lock-string-face) 7470 7493 (face font-lock-constant-face) 7493 7494 (face font-lock-string-face) 7494 7504 nil 7504 7505 (face font-lock-string-face) 7505 7527 (face font-lock-constant-face) 7527 7528 (face font-lock-string-face) 7528 7538 nil 7538 7539 (face font-lock-string-face) 7539 7562 (face font-lock-constant-face) 7562 7563 (face font-lock-string-face) 7563 7573 nil 7573 7574 (face font-lock-string-face) 7574 7596 (face font-lock-constant-face) 7596 7597 (face font-lock-string-face) 7597 7607 nil 7607 7608 (face font-lock-string-face) 7608 7631 (face font-lock-constant-face) 7631 7632 (face font-lock-string-face) 7632 7642 nil 7642 7643 (face font-lock-string-face) 7643 7665 (face font-lock-constant-face) 7665 7666 (face font-lock-string-face) 7666 7676 nil 7676 7677 (face font-lock-string-face) 7677 7705 (face font-lock-constant-face) 7705 7706 (face font-lock-string-face) 7706 7716 nil 7716 7717 (face font-lock-string-face) 7717 7744 (face font-lock-constant-face) 7744 7745 (face font-lock-string-face) 7745 7755 nil 7755 7756 (face font-lock-string-face) 7756 7791 (face font-lock-constant-face) 7791 7792 (face font-lock-string-face) 7792 7802 nil 7802 7803 (face font-lock-string-face) 7803 7837 (face font-lock-constant-face) 7837 7838 (face font-lock-string-face) 7838 7848 nil 7848 7849 (face font-lock-string-face) 7849 7879 (face font-lock-constant-face) 7879 7880 (face font-lock-string-face) 7880 7890 nil 7890 7891 (face font-lock-string-face) 7891 7920 (face font-lock-constant-face) 7920 7921 (face font-lock-string-face) 7921 7931 nil 7931 7932 (face font-lock-string-face) 7932 7962 (face font-lock-constant-face) 7962 7963 (face font-lock-string-face) 7963 7973 nil 7973 7974 (face font-lock-string-face) 7974 8003 (face font-lock-constant-face) 8003 8004 (face font-lock-string-face) 8004 8014 nil 8014 8015 (face font-lock-string-face) 8015 8039 (face font-lock-constant-face) 8039 8040 (face font-lock-string-face) 8040 8050 nil 8050 8051 (face font-lock-string-face) 8051 8074 (face font-lock-constant-face) 8074 8075 (face font-lock-string-face) 8075 8085 nil 8085 8086 (face font-lock-string-face) 8086 8116 (face font-lock-constant-face) 8116 8117 (face font-lock-string-face) 8117 8127 nil 8127 8128 (face font-lock-string-face) 8128 8152 (face font-lock-constant-face) 8152 8153 (face font-lock-string-face) 8153 8163 nil 8163 8164 (face font-lock-string-face) 8164 8187 (face font-lock-constant-face) 8187 8188 (face font-lock-string-face) 8188 8198 nil 8198 8199 (face font-lock-string-face) 8199 8230 (face font-lock-constant-face) 8230 8231 (face font-lock-string-face) 8231 8241 nil 8241 8242 (face font-lock-string-face) 8242 8272 (face font-lock-constant-face) 8272 8273 (face font-lock-string-face) 8273 8283 nil 8283 8284 (face font-lock-string-face) 8284 8309 (face font-lock-constant-face) 8309 8310 (face font-lock-string-face) 8310 8320 nil 8320 8321 (face font-lock-string-face) 8321 8345 (face font-lock-constant-face) 8345 8346 (face font-lock-string-face) 8346 8356 nil 8356 8357 (face font-lock-string-face) 8357 8399 (face font-lock-constant-face) 8399 8400 (face font-lock-string-face) 8400 8410 nil 8410 8411 (face font-lock-string-face) 8411 8452 (face font-lock-constant-face) 8452 8453 (face font-lock-string-face) 8453 8463 nil 8463 8464 (face font-lock-string-face) 8464 8486 (face font-lock-constant-face) 8486 8487 (face font-lock-string-face) 8487 8497 nil 8497 8498 (face font-lock-string-face) 8498 8519 (face font-lock-constant-face) 8519 8520 (face font-lock-string-face) 8520 8530 nil 8530 8531 (face font-lock-string-face) 8531 8562 (face font-lock-constant-face) 8562 8563 (face font-lock-string-face) 8563 8573 nil 8573 8574 (face font-lock-string-face) 8574 8604 (face font-lock-constant-face) 8604 8605 (face font-lock-string-face) 8605 8615 nil 8615 8616 (face font-lock-string-face) 8616 8643 (face font-lock-constant-face) 8643 8644 (face font-lock-string-face) 8644 8654 nil 8654 8655 (face font-lock-string-face) 8655 8681 (face font-lock-constant-face) 8681 8682 (face font-lock-string-face) 8682 8692 nil 8692 8693 (face font-lock-string-face) 8693 8721 (face font-lock-constant-face) 8721 8722 (face font-lock-string-face) 8722 8732 nil 8732 8733 (face font-lock-string-face) 8733 8760 (face font-lock-constant-face) 8760 8761 (face font-lock-string-face) 8761 8771 nil 8771 8772 (face font-lock-string-face) 8772 8805 (face font-lock-constant-face) 8805 8806 (face font-lock-string-face) 8806 8816 nil 8816 8817 (face font-lock-string-face) 8817 8849 (face font-lock-constant-face) 8849 8850 (face font-lock-string-face) 8850 8860 nil 8860 8861 (face font-lock-string-face) 8861 8892 (face font-lock-constant-face) 8892 8893 (face font-lock-string-face) 8893 8903 nil 8903 8904 (face font-lock-string-face) 8904 8934 (face font-lock-constant-face) 8934 8935 (face font-lock-string-face) 8935 8945 nil 8945 8946 (face font-lock-string-face) 8946 8978 (face font-lock-constant-face) 8978 8979 (face font-lock-string-face) 8979 8989 nil 8989 8990 (face font-lock-string-face) 8990 9021 (face font-lock-constant-face) 9021 9022 (face font-lock-string-face) 9022 9032 nil 9032 9033 (face font-lock-string-face) 9033 9063 (face font-lock-constant-face) 9063 9064 (face font-lock-string-face) 9064 9074 nil 9074 9075 (face font-lock-string-face) 9075 9104 (face font-lock-constant-face) 9104 9105 (face font-lock-string-face) 9105 9115 nil 9115 9116 (face font-lock-string-face) 9116 9158 (face font-lock-constant-face) 9158 9159 (face font-lock-string-face) 9159 9169 nil 9169 9170 (face font-lock-string-face) 9170 9211 (face font-lock-constant-face) 9211 9212 (face font-lock-string-face) 9212 9222 nil 9222 9223 (face font-lock-string-face) 9223 9272 (face font-lock-constant-face) 9272 9273 (face font-lock-string-face) 9273 9283 nil 9283 9284 (face font-lock-string-face) 9284 9332 (face font-lock-constant-face) 9332 9333 (face font-lock-string-face) 9333 9343 nil 9343 9344 (face font-lock-string-face) 9344 9388 (face font-lock-constant-face) 9388 9389 (face font-lock-string-face) 9389 9399 nil 9399 9400 (face font-lock-string-face) 9400 9445 (face font-lock-constant-face) 9445 9446 (face font-lock-string-face) 9446 9456 nil 9456 9457 (face font-lock-string-face) 9457 9507 (face font-lock-constant-face) 9507 9508 (face font-lock-string-face) 9508 9518 nil 9518 9519 (face font-lock-string-face) 9519 9570 (face font-lock-constant-face) 9570 9571 (face font-lock-string-face) 9571 9581 nil 9581 9582 (face font-lock-string-face) 9582 9611 (face font-lock-constant-face) 9611 9612 (face font-lock-string-face) 9612 9622 nil 9622 9623 (face font-lock-string-face) 9623 9659 (face font-lock-constant-face) 9659 9660 (face font-lock-string-face) 9660 9670 nil 9670 9671 (face font-lock-string-face) 9671 9714 (face font-lock-constant-face) 9714 9715 (face font-lock-string-face) 9715 9725 nil 9725 9726 (face font-lock-string-face) 9726 9768 (face font-lock-constant-face) 9768 9769 (face font-lock-string-face) 9769 9779 nil 9779 9780 (face font-lock-string-face) 9780 9816 (face font-lock-constant-face) 9816 9817 (face font-lock-string-face) 9817 9827 nil 9827 9828 (face font-lock-string-face) 9828 9863 (face font-lock-constant-face) 9863 9864 (face font-lock-string-face) 9864 9874 nil 9874 9875 (face font-lock-string-face) 9875 9910 (face font-lock-constant-face) 9910 9911 (face font-lock-string-face) 9911 9921 nil 9921 9922 (face font-lock-string-face) 9922 9958 (face font-lock-constant-face) 9958 9959 (face font-lock-string-face) 9959 9969 nil 9969 9970 (face font-lock-string-face) 9970 10005 (face font-lock-constant-face) 10005 10006 (face font-lock-string-face) 10006 10016 nil 10016 10017 (face font-lock-string-face) 10017 10050 (face font-lock-constant-face) 10050 10051 (face font-lock-string-face) 10051 10061 nil 10061 10062 (face font-lock-string-face) 10062 10094 (face font-lock-constant-face) 10094 10095 (face font-lock-string-face) 10095 10105 nil 10105 10106 (face font-lock-string-face) 10106 10150 (face font-lock-constant-face) 10150 10151 (face font-lock-string-face) 10151 10161 nil 10161 10162 (face font-lock-string-face) 10162 10198 (face font-lock-constant-face) 10198 10199 (face font-lock-string-face) 10199 10209 nil 10209 10210 (face font-lock-string-face) 10210 10245 (face font-lock-constant-face) 10245 10246 (face font-lock-string-face) 10246 10256 nil 10256 10257 (face font-lock-string-face) 10257 10296 (face font-lock-constant-face) 10296 10297 (face font-lock-string-face) 10297 10307 nil 10307 10308 (face font-lock-string-face) 10308 10346 (face font-lock-constant-face) 10346 10347 (face font-lock-string-face) 10347 10357 nil 10357 10358 (face font-lock-string-face) 10358 10403 (face font-lock-constant-face) 10403 10404 (face font-lock-string-face) 10404 10414 nil 10414 10415 (face font-lock-string-face) 10415 10459 (face font-lock-constant-face) 10459 10460 (face font-lock-string-face) 10460 10470 nil 10470 10471 (face font-lock-string-face) 10471 10487 (face font-lock-constant-face) 10487 10488 (face font-lock-string-face) 10488 10498 nil 10498 10499 (face font-lock-string-face) 10499 10514 (face font-lock-constant-face) 10514 10515 (face font-lock-string-face) 10515 10525 nil 10525 10526 (face font-lock-string-face) 10526 10559 (face font-lock-constant-face) 10559 10560 (face font-lock-string-face) 10560 10570 nil 10570 10571 (face font-lock-string-face) 10571 10603 (face font-lock-constant-face) 10603 10604 (face font-lock-string-face) 10604 10614 nil 10614 10615 (face font-lock-string-face) 10615 10636 (face font-lock-constant-face) 10636 10637 (face font-lock-string-face) 10637 10647 nil 10647 10648 (face font-lock-string-face) 10648 10675 (face font-lock-constant-face) 10675 10676 (face font-lock-string-face) 10676 10686 nil 10686 10687 (face font-lock-string-face) 10687 10713 (face font-lock-constant-face) 10713 10714 (face font-lock-string-face) 10714 10724 nil 10724 10725 (face font-lock-string-face) 10725 10755 (face font-lock-constant-face) 10755 10756 (face font-lock-string-face) 10756 10766 nil 10766 10767 (face font-lock-string-face) 10767 10796 (face font-lock-constant-face) 10796 10797 (face font-lock-string-face) 10797 10807 nil 10807 10808 (face font-lock-string-face) 10808 10845 (face font-lock-constant-face) 10845 10846 (face font-lock-string-face) 10846 10856 nil 10856 10857 (face font-lock-string-face) 10857 10893 (face font-lock-constant-face) 10893 10894 (face font-lock-string-face) 10894 10904 nil 10904 10905 (face font-lock-string-face) 10905 10929 (face font-lock-constant-face) 10929 10930 (face font-lock-string-face) 10930 10940 nil 10940 10941 (face font-lock-string-face) 10941 10964 (face font-lock-constant-face) 10964 10965 (face font-lock-string-face) 10965 10975 nil 10975 10976 (face font-lock-string-face) 10976 10995 (face font-lock-constant-face) 10995 10996 (face font-lock-string-face) 10996 11006 nil 11006 11007 (face font-lock-string-face) 11007 11025 (face font-lock-constant-face) 11025 11026 (face font-lock-string-face) 11026 11036 nil 11036 11037 (face font-lock-string-face) 11037 11063 (face font-lock-constant-face) 11063 11064 (face font-lock-string-face) 11064 11074 nil 11074 11075 (face font-lock-string-face) 11075 11100 (face font-lock-constant-face) 11100 11101 (face font-lock-string-face) 11101 11111 nil 11111 11112 (face font-lock-string-face) 11112 11138 (face font-lock-constant-face) 11138 11139 (face font-lock-string-face) 11139 11149 nil 11149 11150 (face font-lock-string-face) 11150 11175 (face font-lock-constant-face) 11175 11176 (face font-lock-string-face) 11176 11193 nil 11193 11194 (face font-lock-string-face) 11194 11219 (face font-lock-keyword-face) 11219 11220 (face font-lock-string-face) 11220 11232 nil 11232 11233 (face font-lock-string-face) 11233 11245 (face font-lock-keyword-face) 11245 11246 (face font-lock-string-face) 11246 11260 nil 11260 11261 (face font-lock-string-face) 11261 11263 (face font-lock-constant-face) 11263 11264 (face font-lock-string-face) 11264 11292 nil 11292 11293 (face font-lock-string-face) 11293 11303 (face font-lock-keyword-face) 11303 11304 (face font-lock-string-face) 11304 11316 nil 11316 11381 (face font-lock-comment-face) 11381 11389 nil 11389 11439 (face font-lock-comment-face) 11439 11448 nil 11448 11449 (face font-lock-string-face) 11449 11464 (face font-lock-variable-name-face) 11464 11465 (face font-lock-string-face) 11465 11479 nil 11479 11480 (face font-lock-string-face) 11480 11492 (face font-lock-keyword-face) 11492 11493 (face font-lock-string-face) 11493 11509 nil 11509 11510 (face font-lock-string-face) 11510 11549 (face font-lock-function-name-face) 11549 11550 (face font-lock-string-face) 11550 11586 nil 11586 11587 (face font-lock-string-face) 11587 11602 (face font-lock-variable-name-face) 11602 11603 (face font-lock-string-face) 11603 11617 nil 11617 11618 (face font-lock-string-face) 11618 11626 (face font-lock-keyword-face) 11626 11627 (face font-lock-string-face) 11627 11643 nil 11643 11644 (face font-lock-string-face) 11644 11663 (face font-lock-constant-face) 11663 11664 (face font-lock-string-face) 11664 11678 nil 11678 11679 (face font-lock-string-face) 11679 11702 (face font-lock-constant-face) 11702 11703 (face font-lock-string-face) 11703 11717 nil 11717 11718 (face font-lock-string-face) 11718 11740 (face font-lock-constant-face) 11740 11741 (face font-lock-string-face) 11741 11755 nil 11755 11756 (face font-lock-string-face) 11756 11779 (face font-lock-constant-face) 11779 11780 (face font-lock-string-face) 11780 11794 nil 11794 11795 (face font-lock-string-face) 11795 11817 (face font-lock-constant-face) 11817 11818 (face font-lock-string-face) 11818 11832 nil 11832 11833 (face font-lock-string-face) 11833 11861 (face font-lock-constant-face) 11861 11862 (face font-lock-string-face) 11862 11876 nil 11876 11877 (face font-lock-string-face) 11877 11904 (face font-lock-constant-face) 11904 11905 (face font-lock-string-face) 11905 11919 nil 11919 11920 (face font-lock-string-face) 11920 11950 (face font-lock-constant-face) 11950 11951 (face font-lock-string-face) 11951 11965 nil 11965 11966 (face font-lock-string-face) 11966 11995 (face font-lock-constant-face) 11995 11996 (face font-lock-string-face) 11996 12010 nil 12010 12011 (face font-lock-string-face) 12011 12035 (face font-lock-constant-face) 12035 12036 (face font-lock-string-face) 12036 12050 nil 12050 12051 (face font-lock-string-face) 12051 12074 (face font-lock-constant-face) 12074 12075 (face font-lock-string-face) 12075 12089 nil 12089 12090 (face font-lock-string-face) 12090 12120 (face font-lock-constant-face) 12120 12121 (face font-lock-string-face) 12121 12135 nil 12135 12136 (face font-lock-string-face) 12136 12167 (face font-lock-constant-face) 12167 12168 (face font-lock-string-face) 12168 12182 nil 12182 12183 (face font-lock-string-face) 12183 12213 (face font-lock-constant-face) 12213 12214 (face font-lock-string-face) 12214 12228 nil 12228 12229 (face font-lock-string-face) 12229 12254 (face font-lock-constant-face) 12254 12255 (face font-lock-string-face) 12255 12269 nil 12269 12270 (face font-lock-string-face) 12270 12294 (face font-lock-constant-face) 12294 12295 (face font-lock-string-face) 12295 12309 nil 12309 12310 (face font-lock-string-face) 12310 12352 (face font-lock-constant-face) 12352 12353 (face font-lock-string-face) 12353 12367 nil 12367 12368 (face font-lock-string-face) 12368 12409 (face font-lock-constant-face) 12409 12410 (face font-lock-string-face) 12410 12424 nil 12424 12425 (face font-lock-string-face) 12425 12447 (face font-lock-constant-face) 12447 12448 (face font-lock-string-face) 12448 12462 nil 12462 12463 (face font-lock-string-face) 12463 12484 (face font-lock-constant-face) 12484 12485 (face font-lock-string-face) 12485 12499 nil 12499 12500 (face font-lock-string-face) 12500 12531 (face font-lock-constant-face) 12531 12532 (face font-lock-string-face) 12532 12546 nil 12546 12547 (face font-lock-string-face) 12547 12577 (face font-lock-constant-face) 12577 12578 (face font-lock-string-face) 12578 12592 nil 12592 12593 (face font-lock-string-face) 12593 12621 (face font-lock-constant-face) 12621 12622 (face font-lock-string-face) 12622 12636 nil 12636 12637 (face font-lock-string-face) 12637 12664 (face font-lock-constant-face) 12664 12665 (face font-lock-string-face) 12665 12679 nil 12679 12680 (face font-lock-string-face) 12680 12707 (face font-lock-constant-face) 12707 12708 (face font-lock-string-face) 12708 12722 nil 12722 12723 (face font-lock-string-face) 12723 12749 (face font-lock-constant-face) 12749 12750 (face font-lock-string-face) 12750 12764 nil 12764 12765 (face font-lock-string-face) 12765 12791 (face font-lock-constant-face) 12791 12792 (face font-lock-string-face) 12792 12806 nil 12806 12807 (face font-lock-string-face) 12807 12832 (face font-lock-constant-face) 12832 12833 (face font-lock-string-face) 12833 12868 nil 12868 12937 (face font-lock-comment-face) 12937 12945 nil 12945 13016 (face font-lock-comment-face) 13016 13024 nil 13024 13040 (face font-lock-comment-face) 13040 13049 nil 13049 13050 (face font-lock-string-face) 13050 13065 (face font-lock-variable-name-face) 13065 13066 (face font-lock-string-face) 13066 13080 nil 13080 13081 (face font-lock-string-face) 13081 13089 (face font-lock-keyword-face) 13089 13090 (face font-lock-string-face) 13090 13105 nil 13105 13106 (face font-lock-string-face) 13106 13149 (face font-lock-constant-face) 13149 13150 (face font-lock-string-face) 13150 13175 nil 13175 13176 (face font-lock-string-face) 13176 13183 (face font-lock-keyword-face) 13183 13184 (face font-lock-string-face) 13184 13199 nil 13199 13200 (face font-lock-string-face) 13200 13248 (face font-lock-constant-face) 13248 13249 (face font-lock-string-face) 13249 13274 nil 13274 13275 (face font-lock-string-face) 13275 13288 (face font-lock-keyword-face) 13288 13289 (face font-lock-string-face) 13289 13305 nil 13305 13306 (face font-lock-string-face) 13306 13315 (face font-lock-keyword-face) 13315 13316 (face font-lock-string-face) 13316 13334 nil 13334 13335 (face font-lock-string-face) 13335 13345 (face font-lock-constant-face) 13345 13346 (face font-lock-string-face) 13346 13397 nil 13397 13398 (face font-lock-string-face) 13398 13443 (face font-lock-variable-name-face) 13443 13444 (face font-lock-string-face) 13444 13458 nil 13458 13459 (face font-lock-string-face) 13459 13472 (face font-lock-keyword-face) 13472 13473 (face font-lock-string-face) 13473 13489 nil 13489 13490 (face font-lock-string-face) 13490 13499 (face font-lock-keyword-face) 13499 13500 (face font-lock-string-face) 13500 13518 nil 13518 13519 (face font-lock-string-face) 13519 13527 (face font-lock-constant-face) 13527 13528 (face font-lock-string-face) 13528 13579 nil 13579 13580 (face font-lock-string-face) 13580 13593 (face font-lock-variable-name-face) 13593 13594 (face font-lock-string-face) 13594 13608 nil 13608 13609 (face font-lock-string-face) 13609 13617 (face font-lock-keyword-face) 13617 13618 (face font-lock-string-face) 13618 13623 nil 13623 13624 (face font-lock-string-face) 13624 13631 (face font-lock-constant-face) 13631 13632 (face font-lock-string-face) 13632 13634 nil 13634 13635 (face font-lock-string-face) 13635 13641 (face font-lock-constant-face) 13641 13642 (face font-lock-string-face) 13642 13671 nil 13671 13672 (face font-lock-string-face) 13672 13679 (face font-lock-constant-face) 13679 13680 (face font-lock-string-face) 13680 13682 nil 13682 13683 (face font-lock-string-face) 13683 13703 (face font-lock-constant-face) 13703 13704 (face font-lock-string-face) 13704 13720 nil 13720 13721 (face font-lock-string-face) 13721 13734 (face font-lock-keyword-face) 13734 13735 (face font-lock-string-face) 13735 13751 nil 13751 13752 (face font-lock-string-face) 13752 13761 (face font-lock-keyword-face) 13761 13762 (face font-lock-string-face) 13762 13815 nil 13815 13816 (face font-lock-string-face) 13816 13829 (face font-lock-variable-name-face) 13829 13830 (face font-lock-string-face) 13830 13844 nil 13844 13845 (face font-lock-string-face) 13845 13853 (face font-lock-keyword-face) 13853 13854 (face font-lock-string-face) 13854 13870 nil 13870 13871 (face font-lock-string-face) 13871 13909 (face font-lock-constant-face) 13909 13910 (face font-lock-string-face) 13910 13924 nil 13924 13925 (face font-lock-string-face) 13925 13962 (face font-lock-constant-face) 13962 13963 (face font-lock-string-face) 13963 13999 nil 13999 14000 (face font-lock-string-face) 14000 14011 (face font-lock-variable-name-face) 14011 14012 (face font-lock-string-face) 14012 14026 nil 14026 14027 (face font-lock-string-face) 14027 14036 (face font-lock-keyword-face) 14036 14037 (face font-lock-string-face) 14037 14053 nil 14053 14054 (face font-lock-string-face) 14054 14064 (face font-lock-keyword-face) 14064 14065 (face font-lock-string-face) 14065 14084 nil 14084 14085 (face font-lock-string-face) 14085 14096 (face font-lock-variable-name-face) 14096 14097 (face font-lock-string-face) 14097 14117 nil 14117 14129 (face font-lock-string-face) 14129 14131 nil 14131 14169 (face font-lock-string-face) 14169 14176 (face font-lock-variable-name-face) 14176 14182 (face font-lock-string-face) 14182 14193 (face font-lock-variable-name-face) 14193 14196 (face font-lock-string-face) 14196 14233 nil 14233 14245 (face font-lock-string-face) 14245 14247 nil 14247 14259 (face font-lock-string-face) 14259 14316 nil 14316 14317 (face font-lock-string-face) 14317 14327 (face font-lock-keyword-face) 14327 14328 (face font-lock-string-face) 14328 14345 nil 14345 14346 (face font-lock-string-face) 14346 14359 (face font-lock-variable-name-face) 14359 14360 (face font-lock-string-face) 14360 14378 nil 14378 14379 (face font-lock-string-face) 14379 14385 (face font-lock-keyword-face) 14385 14386 (face font-lock-string-face) 14386 14406 nil 14406 14411 (face font-lock-string-face) 14411 14413 (face font-lock-variable-name-face) 14413 14423 (face font-lock-variable-name-face) 14423 14443 (face font-lock-string-face) 14443 14476 nil 14476 14477 (face font-lock-string-face) 14477 14490 (face font-lock-keyword-face) 14490 14491 (face font-lock-string-face) 14491 14511 nil 14511 14512 (face font-lock-string-face) 14512 14521 (face font-lock-keyword-face) 14521 14522 (face font-lock-string-face) 14522 14544 nil 14544 14545 (face font-lock-string-face) 14545 14549 (face font-lock-constant-face) 14549 14551 (face font-lock-variable-name-face) 14551 14561 (face font-lock-variable-name-face) 14561 14578 (face font-lock-constant-face) 14578 14579 (face font-lock-string-face) 14579 14631 nil 14631 14632 (face font-lock-string-face) 14632 14639 (face font-lock-keyword-face) 14639 14640 (face font-lock-string-face) 14640 14660 nil 14660 14661 (face font-lock-string-face) 14661 14669 (face font-lock-preprocessor-face) 14669 14670 (face font-lock-string-face) 14670 14707 nil 14707 14729 (face font-lock-comment-face) 14729 14743 nil 14743 14744 (face font-lock-string-face) 14744 14752 (face font-lock-keyword-face) 14752 14753 (face font-lock-string-face) 14753 14773 nil 14773 14774 (face font-lock-string-face) 14774 14800 (face font-lock-constant-face) 14800 14801 (face font-lock-string-face) 14801 14819 nil 14819 14820 (face font-lock-string-face) 14820 14845 (face font-lock-constant-face) 14845 14846 (face font-lock-string-face) 14846 14915 nil 14915 14916 (face font-lock-string-face) 14916 14929 (face font-lock-variable-name-face) 14929 14930 (face font-lock-string-face) 14930 14944 nil 14944 14945 (face font-lock-string-face) 14945 14955 (face font-lock-keyword-face) 14955 14956 (face font-lock-string-face) 14956 14973 nil 14973 14974 (face font-lock-string-face) 14974 14993 (face font-lock-variable-name-face) 14993 14994 (face font-lock-string-face) 14994 15012 nil 15012 15013 (face font-lock-string-face) 15013 15019 (face font-lock-keyword-face) 15019 15020 (face font-lock-string-face) 15020 15040 nil 15040 15075 (face font-lock-string-face) 15075 15108 nil 15108 15109 (face font-lock-string-face) 15109 15122 (face font-lock-keyword-face) 15122 15123 (face font-lock-string-face) 15123 15143 nil 15143 15144 (face font-lock-string-face) 15144 15153 (face font-lock-keyword-face) 15153 15154 (face font-lock-string-face) 15154 15176 nil 15176 15177 (face font-lock-string-face) 15177 15215 (face font-lock-constant-face) 15215 15216 (face font-lock-string-face) 15216 15268 nil 15268 15269 (face font-lock-string-face) 15269 15276 (face font-lock-keyword-face) 15276 15277 (face font-lock-string-face) 15277 15297 nil 15297 15298 (face font-lock-string-face) 15298 15312 (face font-lock-preprocessor-face) 15312 15313 (face font-lock-string-face) 15313 15350 nil 15350 15378 (face font-lock-comment-face) 15378 15392 nil 15392 15393 (face font-lock-string-face) 15393 15401 (face font-lock-keyword-face) 15401 15402 (face font-lock-string-face) 15402 15422 nil 15422 15423 (face font-lock-string-face) 15423 15450 (face font-lock-constant-face) 15450 15451 (face font-lock-string-face) 15451 15469 nil 15469 15470 (face font-lock-string-face) 15470 15496 (face font-lock-constant-face) 15496 15497 (face font-lock-string-face) 15497 15566 nil 15566 15567 (face font-lock-string-face) 15567 15600 (face font-lock-variable-name-face) 15600 15601 (face font-lock-string-face) 15601 15615 nil 15615 15663 (face font-lock-comment-face) 15663 15673 nil 15673 15674 (face font-lock-string-face) 15674 15682 (face font-lock-keyword-face) 15682 15683 (face font-lock-string-face) 15683 15699 nil 15699 15700 (face font-lock-string-face) 15700 15743 (face font-lock-constant-face) 15743 15744 (face font-lock-string-face) 15744 15758 nil 15758 15759 (face font-lock-string-face) 15759 15801 (face font-lock-constant-face) 15801 15802 (face font-lock-string-face) 15802 15838 nil 15838 15839 (face font-lock-string-face) 15839 15848 (face font-lock-variable-name-face) 15848 15849 (face font-lock-string-face) 15849 15863 nil 15863 15864 (face font-lock-string-face) 15864 15877 (face font-lock-keyword-face) 15877 15878 (face font-lock-string-face) 15878 15894 nil 15894 15895 (face font-lock-string-face) 15895 15904 (face font-lock-keyword-face) 15904 15905 (face font-lock-string-face) 15905 15923 nil 15923 15924 (face font-lock-string-face) 15924 15980 (face font-lock-constant-face) 15980 15981 (face font-lock-string-face) 15981 15997 nil 15997 15998 (face font-lock-string-face) 15998 16057 (face font-lock-constant-face) 16057 16058 (face font-lock-string-face) 16058 16074 nil 16074 16075 (face font-lock-string-face) 16075 16131 (face font-lock-constant-face) 16131 16132 (face font-lock-string-face) 16132 16148 nil 16148 16149 (face font-lock-string-face) 16149 16205 (face font-lock-constant-face) 16205 16206 (face font-lock-string-face) 16206 16222 nil 16222 16223 (face font-lock-string-face) 16223 16275 (face font-lock-constant-face) 16275 16276 (face font-lock-string-face) 16276 16327 nil 16327 16328 (face font-lock-string-face) 16328 16337 (face font-lock-variable-name-face) 16337 16338 (face font-lock-string-face) 16338 16352 nil 16352 16353 (face font-lock-string-face) 16353 16361 (face font-lock-keyword-face) 16361 16362 (face font-lock-string-face) 16362 16378 nil 16378 16379 (face font-lock-string-face) 16379 16406 (face font-lock-constant-face) 16406 16407 (face font-lock-string-face) 16407 16421 nil 16421 16422 (face font-lock-string-face) 16422 16448 (face font-lock-constant-face) 16448 16449 (face font-lock-string-face) 16449 16463 nil 16463 16464 (face font-lock-string-face) 16464 16507 (face font-lock-constant-face) 16507 16508 (face font-lock-string-face) 16508 16522 nil 16522 16523 (face font-lock-string-face) 16523 16565 (face font-lock-constant-face) 16565 16566 (face font-lock-string-face) 16566 16602 nil 16602 16603 (face font-lock-string-face) 16603 16646 (face font-lock-variable-name-face) 16646 16647 (face font-lock-string-face) 16647 16661 nil 16661 16662 (face font-lock-string-face) 16662 16669 (face font-lock-keyword-face) 16669 16670 (face font-lock-string-face) 16670 16686 nil 16686 16687 (face font-lock-string-face) 16687 16697 (face font-lock-constant-face) 16697 16698 (face font-lock-string-face) 16698 16712 nil 16712 16713 (face font-lock-string-face) 16713 16722 (face font-lock-constant-face) 16722 16723 (face font-lock-string-face) 16723 16737 nil 16737 16738 (face font-lock-string-face) 16738 16760 (face font-lock-constant-face) 16760 16761 (face font-lock-string-face) 16761 16775 nil 16775 16776 (face font-lock-string-face) 16776 16797 (face font-lock-constant-face) 16797 16798 (face font-lock-string-face) 16798 16812 nil 16812 16813 (face font-lock-string-face) 16813 16830 (face font-lock-constant-face) 16830 16831 (face font-lock-string-face) 16831 16845 nil 16845 16846 (face font-lock-string-face) 16846 16862 (face font-lock-constant-face) 16862 16863 (face font-lock-string-face) 16863 16877 nil 16877 16878 (face font-lock-string-face) 16878 16889 (face font-lock-constant-face) 16889 16890 (face font-lock-string-face) 16890 16904 nil 16904 16905 (face font-lock-string-face) 16905 16915 (face font-lock-constant-face) 16915 16916 (face font-lock-string-face) 16916 16930 nil 16930 16931 (face font-lock-string-face) 16931 16955 (face font-lock-constant-face) 16955 16956 (face font-lock-string-face) 16956 16970 nil 16970 16971 (face font-lock-string-face) 16971 16994 (face font-lock-constant-face) 16994 16995 (face font-lock-string-face) 16995 17009 nil 17009 17010 (face font-lock-string-face) 17010 17034 (face font-lock-constant-face) 17034 17035 (face font-lock-string-face) 17035 17049 nil 17049 17050 (face font-lock-string-face) 17050 17073 (face font-lock-constant-face) 17073 17074 (face font-lock-string-face) 17074 17088 nil 17088 17089 (face font-lock-string-face) 17089 17114 (face font-lock-constant-face) 17114 17115 (face font-lock-string-face) 17115 17129 nil 17129 17130 (face font-lock-string-face) 17130 17154 (face font-lock-constant-face) 17154 17155 (face font-lock-string-face) 17155 17210 nil 17210 17211 (face font-lock-string-face) 17211 17222 (face font-lock-keyword-face) 17222 17223 (face font-lock-string-face) 17223 17225 nil 17225 17226 (face font-lock-string-face) 17226 17237 (face font-lock-function-name-face) 17237 17238 (face font-lock-string-face) 17238 17246 nil 17246 17247 (face font-lock-string-face) 17247 17251 (face font-lock-keyword-face) 17251 17252 (face font-lock-string-face) 17252 17254 nil 17254 17255 (face font-lock-string-face) 17255 17269 (face font-lock-type-face) 17269 17270 (face font-lock-string-face) 17270 17278 nil 17278 17279 (face font-lock-string-face) 17279 17291 (face font-lock-keyword-face) 17291 17292 (face font-lock-string-face) 17292 17304 nil 17304 17305 (face font-lock-string-face) 17305 17307 (face font-lock-constant-face) 17307 17308 (face font-lock-string-face) 17308 17325 nil 17325 17326 (face font-lock-string-face) 17326 17336 (face font-lock-keyword-face) 17336 17337 (face font-lock-string-face) 17337 17350 nil 17350 17351 (face font-lock-string-face) 17351 17371 (face font-lock-variable-name-face) 17371 17372 (face font-lock-string-face) 17372 17386 nil 17386 17387 (face font-lock-string-face) 17387 17404 (face font-lock-keyword-face) 17404 17405 (face font-lock-string-face) 17405 17423 nil 17423 17424 (face font-lock-string-face) 17424 17442 (face font-lock-variable-name-face) 17442 17443 (face font-lock-string-face) 17443 17461 nil 17461 17462 (face font-lock-string-face) 17462 17469 (face font-lock-keyword-face) 17469 17470 (face font-lock-string-face) 17470 17474 nil 17474 17498 (face font-lock-string-face) 17498 17553 nil 17553 17554 (face font-lock-string-face) 17554 17599 (face font-lock-variable-name-face) 17599 17600 (face font-lock-string-face) 17600 17614 nil 17614 17615 (face font-lock-string-face) 17615 17627 (face font-lock-keyword-face) 17627 17628 (face font-lock-string-face) 17628 17644 nil 17644 17645 (face font-lock-string-face) 17645 17665 (face font-lock-function-name-face) 17665 17666 (face font-lock-string-face) 17666 17703 nil 17703 17704 (face font-lock-string-face) 17704 17724 (face font-lock-variable-name-face) 17724 17725 (face font-lock-string-face) 17725 17739 nil 17739 17740 (face font-lock-string-face) 17740 17752 (face font-lock-keyword-face) 17752 17753 (face font-lock-string-face) 17753 17769 nil 17769 17770 (face font-lock-string-face) 17770 17790 (face font-lock-function-name-face) 17790 17791 (face font-lock-string-face) 17791 17833 nil 17833 17834 (face font-lock-string-face) 17834 17841 (face font-lock-keyword-face) 17841 17842 (face font-lock-string-face) 17842 17854 nil 17854 17855 (face font-lock-string-face) 17855 17874 (face font-lock-constant-face) 17874 17875 (face font-lock-string-face) 17875 17885 nil 17885 17886 (face font-lock-string-face) 17886 17904 (face font-lock-constant-face) 17904 17905 (face font-lock-string-face) 17905 17935 nil 17935 17936 (face font-lock-string-face) 17936 17947 (face font-lock-keyword-face) 17947 17948 (face font-lock-string-face) 17948 17950 nil 17950 17951 (face font-lock-string-face) 17951 17971 (face font-lock-function-name-face) 17971 17972 (face font-lock-string-face) 17972 17980 nil 17980 17981 (face font-lock-string-face) 17981 17985 (face font-lock-keyword-face) 17985 17986 (face font-lock-string-face) 17986 17988 nil 17988 17989 (face font-lock-string-face) 17989 18003 (face font-lock-type-face) 18003 18004 (face font-lock-string-face) 18004 18012 nil 18012 18013 (face font-lock-string-face) 18013 18025 (face font-lock-keyword-face) 18025 18026 (face font-lock-string-face) 18026 18038 nil 18038 18039 (face font-lock-string-face) 18039 18041 (face font-lock-constant-face) 18041 18042 (face font-lock-string-face) 18042 18059 nil 18059 18060 (face font-lock-string-face) 18060 18067 (face font-lock-keyword-face) 18067 18068 (face font-lock-string-face) 18068 18080 nil 18080 18081 (face font-lock-string-face) 18081 18114 (face font-lock-constant-face) 18114 18115 (face font-lock-string-face) 18115 18125 nil 18125 18126 (face font-lock-string-face) 18126 18162 (face font-lock-constant-face) 18162 18163 (face font-lock-string-face) 18163 18173 nil 18173 18174 (face font-lock-string-face) 18174 18212 (face font-lock-constant-face) 18212 18213 (face font-lock-string-face) 18213 18223 nil 18223 18224 (face font-lock-string-face) 18224 18261 (face font-lock-constant-face) 18261 18262 (face font-lock-string-face) 18262 18272 nil 18272 18273 (face font-lock-string-face) 18273 18311 (face font-lock-constant-face) 18311 18312 (face font-lock-string-face) 18312 18322 nil 18322 18323 (face font-lock-string-face) 18323 18356 (face font-lock-constant-face) 18356 18357 (face font-lock-string-face) 18357 18367 nil 18367 18368 (face font-lock-string-face) 18368 18403 (face font-lock-constant-face) 18403 18404 (face font-lock-string-face) 18404 18414 nil 18414 18415 (face font-lock-string-face) 18415 18451 (face font-lock-constant-face) 18451 18452 (face font-lock-string-face) 18452 18462 nil 18462 18463 (face font-lock-string-face) 18463 18499 (face font-lock-constant-face) 18499 18500 (face font-lock-string-face) 18500 18510 nil 18510 18511 (face font-lock-string-face) 18511 18547 (face font-lock-constant-face) 18547 18548 (face font-lock-string-face) 18548 18558 nil 18558 18559 (face font-lock-string-face) 18559 18581 (face font-lock-constant-face) 18581 18582 (face font-lock-string-face) 18582 18592 nil 18592 18593 (face font-lock-string-face) 18593 18618 (face font-lock-constant-face) 18618 18619 (face font-lock-string-face) 18619 18629 nil 18629 18630 (face font-lock-string-face) 18630 18657 (face font-lock-constant-face) 18657 18658 (face font-lock-string-face) 18658 18668 nil 18668 18669 (face font-lock-string-face) 18669 18697 (face font-lock-constant-face) 18697 18698 (face font-lock-string-face) 18698 18708 nil 18708 18709 (face font-lock-string-face) 18709 18750 (face font-lock-constant-face) 18750 18751 (face font-lock-string-face) 18751 18761 nil 18761 18762 (face font-lock-string-face) 18762 18803 (face font-lock-constant-face) 18803 18804 (face font-lock-string-face) 18804 18814 nil 18814 18815 (face font-lock-string-face) 18815 18856 (face font-lock-constant-face) 18856 18857 (face font-lock-string-face) 18857 18867 nil 18867 18868 (face font-lock-string-face) 18868 18902 (face font-lock-constant-face) 18902 18903 (face font-lock-string-face) 18903 18913 nil 18913 18914 (face font-lock-string-face) 18914 18948 (face font-lock-constant-face) 18948 18949 (face font-lock-string-face) 18949 18959 nil 18959 18960 (face font-lock-string-face) 18960 18994 (face font-lock-constant-face) 18994 18995 (face font-lock-string-face) 18995 19005 nil 19005 19006 (face font-lock-string-face) 19006 19035 (face font-lock-constant-face) 19035 19036 (face font-lock-string-face) 19036 19046 nil 19046 19047 (face font-lock-string-face) 19047 19075 (face font-lock-constant-face) 19075 19076 (face font-lock-string-face) 19076 19093 nil 19093 19094 (face font-lock-string-face) 19094 19104 (face font-lock-keyword-face) 19104 19105 (face font-lock-string-face) 19105 19118 nil 19118 19119 (face font-lock-string-face) 19119 19139 (face font-lock-variable-name-face) 19139 19140 (face font-lock-string-face) 19140 19154 nil 19154 19155 (face font-lock-string-face) 19155 19172 (face font-lock-keyword-face) 19172 19173 (face font-lock-string-face) 19173 19191 nil 19191 19192 (face font-lock-string-face) 19192 19210 (face font-lock-variable-name-face) 19210 19211 (face font-lock-string-face) 19211 19229 nil 19229 19230 (face font-lock-string-face) 19230 19237 (face font-lock-keyword-face) 19237 19238 (face font-lock-string-face) 19238 19242 nil 19242 19266 (face font-lock-string-face) 19266 19321 nil 19321 19322 (face font-lock-string-face) 19322 19342 (face font-lock-variable-name-face) 19342 19343 (face font-lock-string-face) 19343 19357 nil 19357 19399 (face font-lock-comment-face) 19399 19409 nil 19409 19410 (face font-lock-string-face) 19410 19417 (face font-lock-keyword-face) 19417 19418 (face font-lock-string-face) 19418 19434 nil 19434 19435 (face font-lock-string-face) 19435 19480 (face font-lock-constant-face) 19480 19481 (face font-lock-string-face) 19481 19495 nil 19495 19496 (face font-lock-string-face) 19496 19535 (face font-lock-constant-face) 19535 19536 (face font-lock-string-face) 19536 19573 nil 19573 19574 (face font-lock-string-face) 19574 19623 (face font-lock-variable-name-face) 19623 19624 (face font-lock-string-face) 19624 19638 nil 19638 19639 (face font-lock-string-face) 19639 19645 (face font-lock-keyword-face) 19645 19646 (face font-lock-string-face) 19646 19662 nil 19662 19670 (face font-lock-string-face) 19670 19707 nil 19707 19708 (face font-lock-string-face) 19708 19719 (face font-lock-variable-name-face) 19719 19720 (face font-lock-string-face) 19720 19734 nil 19734 19735 (face font-lock-string-face) 19735 19749 (face font-lock-keyword-face) 19749 19750 (face font-lock-string-face) 19750 19766 nil 19766 19773 (face font-lock-string-face) 19773 19791 nil 19791 19792 (face font-lock-string-face) 19792 19806 (face font-lock-keyword-face) 19806 19807 (face font-lock-string-face) 19807 19827 nil 19827 19890 (face font-lock-comment-face) 19890 19906 nil 19906 19971 (face font-lock-comment-face) 19971 19987 nil 19987 20032 (face font-lock-comment-face) 20032 20048 nil 20048 20072 (face font-lock-string-face) 20072 20074 nil 20074 20077 (face font-lock-string-face) 20077 20080 nil 20080 20086 (face font-lock-comment-face) 20086 20155 nil 20155 20156 (face font-lock-string-face) 20156 20165 (face font-lock-variable-name-face) 20165 20166 (face font-lock-string-face) 20166 20180 nil 20180 20181 (face font-lock-string-face) 20181 20190 (face font-lock-keyword-face) 20190 20191 (face font-lock-string-face) 20191 20207 nil 20207 20208 (face font-lock-string-face) 20208 20218 (face font-lock-variable-name-face) 20218 20219 (face font-lock-string-face) 20219 20237 nil 20237 20246 (face font-lock-string-face) 20246 20262 nil 20262 20270 (face font-lock-string-face) 20270 20286 nil 20286 20298 (face font-lock-string-face) 20298 20314 nil 20314 20322 (face font-lock-string-face) 20322 20374 nil 20374 20375 (face font-lock-string-face) 20375 20384 (face font-lock-variable-name-face) 20384 20385 (face font-lock-string-face) 20385 20399 nil 20399 20400 (face font-lock-string-face) 20400 20409 (face font-lock-keyword-face) 20409 20410 (face font-lock-string-face) 20410 20426 nil 20426 20427 (face font-lock-string-face) 20427 20437 (face font-lock-variable-name-face) 20437 20438 (face font-lock-string-face) 20438 20456 nil 20456 20466 (face font-lock-string-face) 20466 20482 nil 20482 20491 (face font-lock-string-face) 20491 20507 nil 20507 20519 (face font-lock-string-face) 20519 20535 nil 20535 20543 (face font-lock-string-face) 20543 20595 nil 20595 20596 (face font-lock-string-face) 20596 20621 (face font-lock-variable-name-face) 20621 20622 (face font-lock-string-face) 20622 20636 nil 20636 20637 (face font-lock-string-face) 20637 20646 (face font-lock-keyword-face) 20646 20647 (face font-lock-string-face) 20647 20663 nil 20663 20664 (face font-lock-string-face) 20664 20674 (face font-lock-keyword-face) 20674 20675 (face font-lock-string-face) 20675 20695 nil 20695 20696 (face font-lock-string-face) 20696 20715 (face font-lock-variable-name-face) 20715 20716 (face font-lock-string-face) 20716 20736 nil 20736 20748 (face font-lock-string-face) 20748 20770 nil 20770 20780 (face font-lock-string-face) 20780 20800 nil 20800 20807 (face font-lock-string-face) 20807 20827 nil 20827 20839 (face font-lock-string-face) 20839 20859 nil 20859 20867 (face font-lock-string-face) 20867 20923 nil 20923 20935 (face font-lock-string-face) 20935 20957 nil 20957 20972 (face font-lock-string-face) 20972 20992 nil 20992 20999 (face font-lock-string-face) 20999 21019 nil 21019 21026 (face font-lock-string-face) 21026 21046 nil 21046 21058 (face font-lock-string-face) 21058 21078 nil 21078 21086 (face font-lock-string-face) 21086 21180 nil 21180 21181 (face font-lock-string-face) 21181 21190 (face font-lock-keyword-face) 21190 21191 (face font-lock-string-face) 21191 21203 nil 21203 21204 (face font-lock-string-face) 21204 21220 (face font-lock-variable-name-face) 21220 21221 (face font-lock-string-face) 21221 21223 nil 21223 21224 (face font-lock-string-face) 21224 21256 (face font-lock-variable-name-face) 21256 21257 (face font-lock-string-face) 21257 21274 nil 21274 21314 (face font-lock-string-face) 21314 21325 nil 21325 21326 (face font-lock-string-face) 21326 21334 (face font-lock-keyword-face) 21334 21335 (face font-lock-string-face) 21335 21347 nil 21347 21348 (face font-lock-string-face) 21348 21385 (face font-lock-constant-face) 21385 21386 (face font-lock-string-face) 21386 21416 nil 21416 21417 (face font-lock-string-face) 21417 21428 (face font-lock-keyword-face) 21428 21429 (face font-lock-string-face) 21429 21431 nil 21431 21432 (face font-lock-string-face) 21432 21452 (face font-lock-function-name-face) 21452 21453 (face font-lock-string-face) 21453 21461 nil 21461 21462 (face font-lock-string-face) 21462 21466 (face font-lock-keyword-face) 21466 21467 (face font-lock-string-face) 21467 21469 nil 21469 21470 (face font-lock-string-face) 21470 21484 (face font-lock-type-face) 21484 21485 (face font-lock-string-face) 21485 21493 nil 21493 21494 (face font-lock-string-face) 21494 21506 (face font-lock-keyword-face) 21506 21507 (face font-lock-string-face) 21507 21519 nil 21519 21520 (face font-lock-string-face) 21520 21522 (face font-lock-constant-face) 21522 21523 (face font-lock-string-face) 21523 21540 nil 21540 21541 (face font-lock-string-face) 21541 21548 (face font-lock-keyword-face) 21548 21549 (face font-lock-string-face) 21549 21561 nil 21561 21562 (face font-lock-string-face) 21562 21595 (face font-lock-constant-face) 21595 21596 (face font-lock-string-face) 21596 21606 nil 21606 21607 (face font-lock-string-face) 21607 21637 (face font-lock-constant-face) 21637 21638 (face font-lock-string-face) 21638 21648 nil 21648 21649 (face font-lock-string-face) 21649 21682 (face font-lock-constant-face) 21682 21683 (face font-lock-string-face) 21683 21693 nil 21693 21694 (face font-lock-string-face) 21694 21724 (face font-lock-constant-face) 21724 21725 (face font-lock-string-face) 21725 21735 nil 21735 21736 (face font-lock-string-face) 21736 21758 (face font-lock-constant-face) 21758 21759 (face font-lock-string-face) 21759 21769 nil 21769 21770 (face font-lock-string-face) 21770 21795 (face font-lock-constant-face) 21795 21796 (face font-lock-string-face) 21796 21806 nil 21806 21807 (face font-lock-string-face) 21807 21836 (face font-lock-constant-face) 21836 21837 (face font-lock-string-face) 21837 21847 nil 21847 21848 (face font-lock-string-face) 21848 21876 (face font-lock-constant-face) 21876 21877 (face font-lock-string-face) 21877 21907 nil 21907 21908 (face font-lock-string-face) 21908 21919 (face font-lock-keyword-face) 21919 21920 (face font-lock-string-face) 21920 21922 nil 21922 21923 (face font-lock-string-face) 21923 21938 (face font-lock-function-name-face) 21938 21939 (face font-lock-string-face) 21939 21947 nil 21947 21948 (face font-lock-string-face) 21948 21952 (face font-lock-keyword-face) 21952 21953 (face font-lock-string-face) 21953 21955 nil 21955 21956 (face font-lock-string-face) 21956 21966 (face font-lock-type-face) 21966 21967 (face font-lock-string-face) 21967 21975 nil 21975 21976 (face font-lock-string-face) 21976 21988 (face font-lock-keyword-face) 21988 21989 (face font-lock-string-face) 21989 22001 nil 22001 22002 (face font-lock-string-face) 22002 22007 (face font-lock-function-name-face) 22007 22008 (face font-lock-string-face) 22008 22018 nil 22018 22019 (face font-lock-string-face) 22019 22037 (face font-lock-function-name-face) 22037 22038 (face font-lock-string-face) 22038 22048 nil 22048 22049 (face font-lock-string-face) 22049 22060 (face font-lock-function-name-face) 22060 22061 (face font-lock-string-face) 22061 22071 nil 22071 22072 (face font-lock-string-face) 22072 22093 (face font-lock-function-name-face) 22093 22094 (face font-lock-string-face) 22094 22104 nil 22104 22105 (face font-lock-string-face) 22105 22131 (face font-lock-function-name-face) 22131 22132 (face font-lock-string-face) 22132 22142 nil 22142 22143 (face font-lock-string-face) 22143 22177 (face font-lock-function-name-face) 22177 22178 (face font-lock-string-face) 22178 22188 nil 22188 22189 (face font-lock-string-face) 22189 22215 (face font-lock-function-name-face) 22215 22216 (face font-lock-string-face) 22216 22226 nil 22226 22227 (face font-lock-string-face) 22227 22253 (face font-lock-function-name-face) 22253 22254 (face font-lock-string-face) 22254 22264 nil 22264 22265 (face font-lock-string-face) 22265 22280 (face font-lock-function-name-face) 22280 22281 (face font-lock-string-face) 22281 22298 nil 22298 22299 (face font-lock-string-face) 22299 22306 (face font-lock-keyword-face) 22306 22307 (face font-lock-string-face) 22307 22319 nil 22319 22320 (face font-lock-string-face) 22320 22361 (face font-lock-constant-face) 22361 22362 (face font-lock-string-face) 22362 22372 nil 22372 22373 (face font-lock-string-face) 22373 22413 (face font-lock-constant-face) 22413 22414 (face font-lock-string-face) 22414 22424 nil 22424 22425 (face font-lock-string-face) 22425 22461 (face font-lock-constant-face) 22461 22462 (face font-lock-string-face) 22462 22472 nil 22472 22473 (face font-lock-string-face) 22473 22502 (face font-lock-constant-face) 22502 22503 (face font-lock-string-face) 22503 22513 nil 22513 22514 (face font-lock-string-face) 22514 22550 (face font-lock-constant-face) 22550 22551 (face font-lock-string-face) 22551 22561 nil 22561 22562 (face font-lock-string-face) 22562 22610 (face font-lock-constant-face) 22610 22611 (face font-lock-string-face) 22611 22621 nil 22621 22622 (face font-lock-string-face) 22622 22663 (face font-lock-constant-face) 22663 22664 (face font-lock-string-face) 22664 22674 nil 22674 22675 (face font-lock-string-face) 22675 22711 (face font-lock-constant-face) 22711 22712 (face font-lock-string-face) 22712 22722 nil 22722 22723 (face font-lock-string-face) 22723 22757 (face font-lock-constant-face) 22757 22758 (face font-lock-string-face) 22758 22768 nil 22768 22769 (face font-lock-string-face) 22769 22797 (face font-lock-constant-face) 22797 22798 (face font-lock-string-face) 22798 22808 nil 22808 22809 (face font-lock-string-face) 22809 22853 (face font-lock-constant-face) 22853 22854 (face font-lock-string-face) 22854 22864 nil 22864 22865 (face font-lock-string-face) 22865 22900 (face font-lock-constant-face) 22900 22901 (face font-lock-string-face) 22901 22911 nil 22911 22912 (face font-lock-string-face) 22912 22961 (face font-lock-constant-face) 22961 22962 (face font-lock-string-face) 22962 22972 nil 22972 22973 (face font-lock-string-face) 22973 23011 (face font-lock-constant-face) 23011 23012 (face font-lock-string-face) 23012 23022 nil 23022 23023 (face font-lock-string-face) 23023 23055 (face font-lock-constant-face) 23055 23056 (face font-lock-string-face) 23056 23066 nil 23066 23067 (face font-lock-string-face) 23067 23116 (face font-lock-constant-face) 23116 23117 (face font-lock-string-face) 23117 23127 nil 23127 23128 (face font-lock-string-face) 23128 23178 (face font-lock-constant-face) 23178 23179 (face font-lock-string-face) 23179 23189 nil 23189 23190 (face font-lock-string-face) 23190 23228 (face font-lock-constant-face) 23228 23229 (face font-lock-string-face) 23229 23239 nil 23239 23240 (face font-lock-string-face) 23240 23277 (face font-lock-constant-face) 23277 23278 (face font-lock-string-face) 23278 23288 nil 23288 23289 (face font-lock-string-face) 23289 23332 (face font-lock-constant-face) 23332 23333 (face font-lock-string-face) 23333 23343 nil 23343 23344 (face font-lock-string-face) 23344 23368 (face font-lock-constant-face) 23368 23369 (face font-lock-string-face) 23369 23379 nil 23379 23380 (face font-lock-string-face) 23380 23402 (face font-lock-constant-face) 23402 23403 (face font-lock-string-face) 23403 23413 nil 23413 23414 (face font-lock-string-face) 23414 23447 (face font-lock-constant-face) 23447 23448 (face font-lock-string-face) 23448 23458 nil 23458 23459 (face font-lock-string-face) 23459 23487 (face font-lock-constant-face) 23487 23488 (face font-lock-string-face) 23488 23498 nil 23498 23499 (face font-lock-string-face) 23499 23530 (face font-lock-constant-face) 23530 23531 (face font-lock-string-face) 23531 23541 nil 23541 23542 (face font-lock-string-face) 23542 23563 (face font-lock-constant-face) 23563 23564 (face font-lock-string-face) 23564 23574 nil 23574 23575 (face font-lock-string-face) 23575 23609 (face font-lock-constant-face) 23609 23610 (face font-lock-string-face) 23610 23620 nil 23620 23621 (face font-lock-string-face) 23621 23654 (face font-lock-constant-face) 23654 23655 (face font-lock-string-face) 23655 23665 nil 23665 23666 (face font-lock-string-face) 23666 23700 (face font-lock-constant-face) 23700 23701 (face font-lock-string-face) 23701 23711 nil 23711 23712 (face font-lock-string-face) 23712 23753 (face font-lock-constant-face) 23753 23754 (face font-lock-string-face) 23754 23764 nil 23764 23765 (face font-lock-string-face) 23765 23790 (face font-lock-constant-face) 23790 23791 (face font-lock-string-face) 23791 23801 nil 23801 23802 (face font-lock-string-face) 23802 23825 (face font-lock-constant-face) 23825 23826 (face font-lock-string-face) 23826 23836 nil 23836 23837 (face font-lock-string-face) 23837 23862 (face font-lock-constant-face) 23862 23863 (face font-lock-string-face) 23863 23873 nil 23873 23874 (face font-lock-string-face) 23874 23906 (face font-lock-constant-face) 23906 23907 (face font-lock-string-face) 23907 23917 nil 23917 23918 (face font-lock-string-face) 23918 23947 (face font-lock-constant-face) 23947 23948 (face font-lock-string-face) 23948 23958 nil 23958 23959 (face font-lock-string-face) 23959 23981 (face font-lock-constant-face) 23981 23982 (face font-lock-string-face) 23982 23992 nil 23992 23993 (face font-lock-string-face) 23993 24014 (face font-lock-constant-face) 24014 24015 (face font-lock-string-face) 24015 24025 nil 24025 24026 (face font-lock-string-face) 24026 24054 (face font-lock-constant-face) 24054 24055 (face font-lock-string-face) 24055 24065 nil 24065 24066 (face font-lock-string-face) 24066 24093 (face font-lock-constant-face) 24093 24094 (face font-lock-string-face) 24094 24104 nil 24104 24105 (face font-lock-string-face) 24105 24133 (face font-lock-constant-face) 24133 24134 (face font-lock-string-face) 24134 24144 nil 24144 24145 (face font-lock-string-face) 24145 24177 (face font-lock-constant-face) 24177 24178 (face font-lock-string-face) 24178 24188 nil 24188 24189 (face font-lock-string-face) 24189 24221 (face font-lock-constant-face) 24221 24222 (face font-lock-string-face) 24222 24232 nil 24232 24233 (face font-lock-string-face) 24233 24277 (face font-lock-constant-face) 24277 24278 (face font-lock-string-face) 24278 24288 nil 24288 24289 (face font-lock-string-face) 24289 24328 (face font-lock-constant-face) 24328 24329 (face font-lock-string-face) 24329 24339 nil 24339 24340 (face font-lock-string-face) 24340 24379 (face font-lock-constant-face) 24379 24380 (face font-lock-string-face) 24380 24390 nil 24390 24391 (face font-lock-string-face) 24391 24424 (face font-lock-constant-face) 24424 24425 (face font-lock-string-face) 24425 24435 nil 24435 24436 (face font-lock-string-face) 24436 24476 (face font-lock-constant-face) 24476 24477 (face font-lock-string-face) 24477 24487 nil 24487 24488 (face font-lock-string-face) 24488 24521 (face font-lock-constant-face) 24521 24522 (face font-lock-string-face) 24522 24532 nil 24532 24533 (face font-lock-string-face) 24533 24567 (face font-lock-constant-face) 24567 24568 (face font-lock-string-face) 24568 24578 nil 24578 24579 (face font-lock-string-face) 24579 24610 (face font-lock-constant-face) 24610 24611 (face font-lock-string-face) 24611 24621 nil 24621 24622 (face font-lock-string-face) 24622 24673 (face font-lock-constant-face) 24673 24674 (face font-lock-string-face) 24674 24684 nil 24684 24685 (face font-lock-string-face) 24685 24725 (face font-lock-constant-face) 24725 24726 (face font-lock-string-face) 24726 24736 nil 24736 24737 (face font-lock-string-face) 24737 24773 (face font-lock-constant-face) 24773 24774 (face font-lock-string-face) 24774 24784 nil 24784 24785 (face font-lock-string-face) 24785 24821 (face font-lock-constant-face) 24821 24822 (face font-lock-string-face) 24822 24832 nil 24832 24833 (face font-lock-string-face) 24833 24874 (face font-lock-constant-face) 24874 24875 (face font-lock-string-face) 24875 24885 nil 24885 24886 (face font-lock-string-face) 24886 24926 (face font-lock-constant-face) 24926 24927 (face font-lock-string-face) 24927 24937 nil 24937 24938 (face font-lock-string-face) 24938 24977 (face font-lock-constant-face) 24977 24978 (face font-lock-string-face) 24978 24988 nil 24988 24989 (face font-lock-string-face) 24989 25035 (face font-lock-constant-face) 25035 25036 (face font-lock-string-face) 25036 25046 nil 25046 25047 (face font-lock-string-face) 25047 25070 (face font-lock-constant-face) 25070 25071 (face font-lock-string-face) 25071 25081 nil 25081 25082 (face font-lock-string-face) 25082 25104 (face font-lock-constant-face) 25104 25105 (face font-lock-string-face) 25105 25115 nil 25115 25116 (face font-lock-string-face) 25116 25152 (face font-lock-constant-face) 25152 25153 (face font-lock-string-face) 25153 25163 nil 25163 25164 (face font-lock-string-face) 25164 25210 (face font-lock-constant-face) 25210 25211 (face font-lock-string-face) 25211 25221 nil 25221 25222 (face font-lock-string-face) 25222 25250 (face font-lock-constant-face) 25250 25251 (face font-lock-string-face) 25251 25268 nil 25268 25269 (face font-lock-string-face) 25269 25279 (face font-lock-keyword-face) 25279 25280 (face font-lock-string-face) 25280 25293 nil 25293 25294 (face font-lock-string-face) 25294 25319 (face font-lock-variable-name-face) 25319 25320 (face font-lock-string-face) 25320 25334 nil 25334 25335 (face font-lock-string-face) 25335 25345 (face font-lock-keyword-face) 25345 25346 (face font-lock-string-face) 25346 25363 nil 25363 25364 (face font-lock-string-face) 25364 25385 (face font-lock-variable-name-face) 25385 25386 (face font-lock-string-face) 25386 25404 nil 25404 25405 (face font-lock-string-face) 25405 25417 (face font-lock-keyword-face) 25417 25418 (face font-lock-string-face) 25418 25438 nil 25438 25439 (face font-lock-string-face) 25439 25480 (face font-lock-function-name-face) 25480 25481 (face font-lock-string-face) 25481 25550 nil 25550 25551 (face font-lock-string-face) 25551 25566 (face font-lock-variable-name-face) 25566 25567 (face font-lock-string-face) 25567 25581 nil 25581 25582 (face font-lock-string-face) 25582 25594 (face font-lock-keyword-face) 25594 25595 (face font-lock-string-face) 25595 25611 nil 25611 25612 (face font-lock-string-face) 25612 25651 (face font-lock-function-name-face) 25651 25652 (face font-lock-string-face) 25652 25688 nil 25688 25689 (face font-lock-string-face) 25689 25704 (face font-lock-variable-name-face) 25704 25705 (face font-lock-string-face) 25705 25719 nil 25719 25720 (face font-lock-string-face) 25720 25728 (face font-lock-keyword-face) 25728 25729 (face font-lock-string-face) 25729 25745 nil 25745 25746 (face font-lock-string-face) 25746 25782 (face font-lock-constant-face) 25782 25783 (face font-lock-string-face) 25783 25797 nil 25797 25798 (face font-lock-string-face) 25798 25820 (face font-lock-constant-face) 25820 25821 (face font-lock-string-face) 25821 25835 nil 25835 25836 (face font-lock-string-face) 25836 25857 (face font-lock-constant-face) 25857 25858 (face font-lock-string-face) 25858 25872 nil 25872 25873 (face font-lock-string-face) 25873 25905 (face font-lock-constant-face) 25905 25906 (face font-lock-string-face) 25906 25920 nil 25920 25921 (face font-lock-string-face) 25921 25961 (face font-lock-constant-face) 25961 25962 (face font-lock-string-face) 25962 25976 nil 25976 25977 (face font-lock-string-face) 25977 26016 (face font-lock-constant-face) 26016 26017 (face font-lock-string-face) 26017 26031 nil 26031 26032 (face font-lock-string-face) 26032 26065 (face font-lock-constant-face) 26065 26066 (face font-lock-string-face) 26066 26080 nil 26080 26081 (face font-lock-string-face) 26081 26115 (face font-lock-constant-face) 26115 26116 (face font-lock-string-face) 26116 26130 nil 26130 26131 (face font-lock-string-face) 26131 26162 (face font-lock-constant-face) 26162 26163 (face font-lock-string-face) 26163 26177 nil 26177 26178 (face font-lock-string-face) 26178 26229 (face font-lock-constant-face) 26229 26230 (face font-lock-string-face) 26230 26244 nil 26244 26245 (face font-lock-string-face) 26245 26285 (face font-lock-constant-face) 26285 26286 (face font-lock-string-face) 26286 26300 nil 26300 26301 (face font-lock-string-face) 26301 26337 (face font-lock-constant-face) 26337 26338 (face font-lock-string-face) 26338 26352 nil 26352 26353 (face font-lock-string-face) 26353 26394 (face font-lock-constant-face) 26394 26395 (face font-lock-string-face) 26395 26409 nil 26409 26410 (face font-lock-string-face) 26410 26443 (face font-lock-constant-face) 26443 26444 (face font-lock-string-face) 26444 26458 nil 26458 26459 (face font-lock-string-face) 26459 26495 (face font-lock-constant-face) 26495 26496 (face font-lock-string-face) 26496 26532 nil 26532 26533 (face font-lock-string-face) 26533 26546 (face font-lock-variable-name-face) 26546 26547 (face font-lock-string-face) 26547 26561 nil 26561 26562 (face font-lock-string-face) 26562 26572 (face font-lock-keyword-face) 26572 26573 (face font-lock-string-face) 26573 26590 nil 26590 26591 (face font-lock-string-face) 26591 26604 (face font-lock-variable-name-face) 26604 26605 (face font-lock-string-face) 26605 26623 nil 26623 26624 (face font-lock-string-face) 26624 26631 (face font-lock-keyword-face) 26631 26632 (face font-lock-string-face) 26632 26652 nil 26652 26653 (face font-lock-string-face) 26653 26688 (face font-lock-constant-face) 26688 26689 (face font-lock-string-face) 26689 26722 nil 26722 26723 (face font-lock-string-face) 26723 26730 (face font-lock-keyword-face) 26730 26731 (face font-lock-string-face) 26731 26751 nil 26751 26752 (face font-lock-string-face) 26752 26760 (face font-lock-preprocessor-face) 26760 26761 (face font-lock-string-face) 26761 26831 nil 26831 26832 (face font-lock-string-face) 26832 26873 (face font-lock-variable-name-face) 26873 26874 (face font-lock-string-face) 26874 26888 nil 26888 26889 (face font-lock-string-face) 26889 26896 (face font-lock-keyword-face) 26896 26897 (face font-lock-string-face) 26897 26913 nil 26913 26914 (face font-lock-string-face) 26914 26954 (face font-lock-constant-face) 26954 26955 (face font-lock-string-face) 26955 26991 nil 26991 26992 (face font-lock-string-face) 26992 27035 (face font-lock-variable-name-face) 27035 27036 (face font-lock-string-face) 27036 27050 nil 27050 27051 (face font-lock-string-face) 27051 27058 (face font-lock-keyword-face) 27058 27059 (face font-lock-string-face) 27059 27075 nil 27075 27076 (face font-lock-string-face) 27076 27095 (face font-lock-constant-face) 27095 27096 (face font-lock-string-face) 27096 27110 nil 27110 27111 (face font-lock-string-face) 27111 27137 (face font-lock-constant-face) 27137 27138 (face font-lock-string-face) 27138 27152 nil 27152 27153 (face font-lock-string-face) 27153 27186 (face font-lock-constant-face) 27186 27187 (face font-lock-string-face) 27187 27201 nil 27201 27202 (face font-lock-string-face) 27202 27235 (face font-lock-constant-face) 27235 27236 (face font-lock-string-face) 27236 27291 nil 27291 27292 (face font-lock-string-face) 27292 27303 (face font-lock-keyword-face) 27303 27304 (face font-lock-string-face) 27304 27306 nil 27306 27307 (face font-lock-string-face) 27307 27325 (face font-lock-function-name-face) 27325 27326 (face font-lock-string-face) 27326 27334 nil 27334 27335 (face font-lock-string-face) 27335 27339 (face font-lock-keyword-face) 27339 27340 (face font-lock-string-face) 27340 27342 nil 27342 27343 (face font-lock-string-face) 27343 27357 (face font-lock-type-face) 27357 27358 (face font-lock-string-face) 27358 27366 nil 27366 27367 (face font-lock-string-face) 27367 27379 (face font-lock-keyword-face) 27379 27380 (face font-lock-string-face) 27380 27392 nil 27392 27393 (face font-lock-string-face) 27393 27398 (face font-lock-function-name-face) 27398 27399 (face font-lock-string-face) 27399 27409 nil 27409 27410 (face font-lock-string-face) 27410 27431 (face font-lock-function-name-face) 27431 27432 (face font-lock-string-face) 27432 27442 nil 27442 27443 (face font-lock-string-face) 27443 27469 (face font-lock-function-name-face) 27469 27470 (face font-lock-string-face) 27470 27480 nil 27480 27481 (face font-lock-string-face) 27481 27507 (face font-lock-function-name-face) 27507 27508 (face font-lock-string-face) 27508 27525 nil 27525 27526 (face font-lock-string-face) 27526 27533 (face font-lock-keyword-face) 27533 27534 (face font-lock-string-face) 27534 27546 nil 27546 27547 (face font-lock-string-face) 27547 27591 (face font-lock-constant-face) 27591 27592 (face font-lock-string-face) 27592 27602 nil 27602 27603 (face font-lock-string-face) 27603 27646 (face font-lock-constant-face) 27646 27647 (face font-lock-string-face) 27647 27657 nil 27657 27658 (face font-lock-string-face) 27658 27679 (face font-lock-constant-face) 27679 27680 (face font-lock-string-face) 27680 27690 nil 27690 27691 (face font-lock-string-face) 27691 27711 (face font-lock-constant-face) 27711 27712 (face font-lock-string-face) 27712 27722 nil 27722 27723 (face font-lock-string-face) 27723 27752 (face font-lock-constant-face) 27752 27753 (face font-lock-string-face) 27753 27763 nil 27763 27764 (face font-lock-string-face) 27764 27792 (face font-lock-constant-face) 27792 27793 (face font-lock-string-face) 27793 27803 nil 27803 27804 (face font-lock-string-face) 27804 27829 (face font-lock-constant-face) 27829 27830 (face font-lock-string-face) 27830 27840 nil 27840 27841 (face font-lock-string-face) 27841 27865 (face font-lock-constant-face) 27865 27866 (face font-lock-string-face) 27866 27876 nil 27876 27877 (face font-lock-string-face) 27877 27901 (face font-lock-constant-face) 27901 27902 (face font-lock-string-face) 27902 27912 nil 27912 27913 (face font-lock-string-face) 27913 27936 (face font-lock-constant-face) 27936 27937 (face font-lock-string-face) 27937 27947 nil 27947 27948 (face font-lock-string-face) 27948 27968 (face font-lock-constant-face) 27968 27969 (face font-lock-string-face) 27969 27979 nil 27979 27980 (face font-lock-string-face) 27980 27999 (face font-lock-constant-face) 27999 28000 (face font-lock-string-face) 28000 28030 nil 28030 28031 (face font-lock-string-face) 28031 28042 (face font-lock-keyword-face) 28042 28043 (face font-lock-string-face) 28043 28045 nil 28045 28046 (face font-lock-string-face) 28046 28058 (face font-lock-function-name-face) 28058 28059 (face font-lock-string-face) 28059 28067 nil 28067 28068 (face font-lock-string-face) 28068 28072 (face font-lock-keyword-face) 28072 28073 (face font-lock-string-face) 28073 28075 nil 28075 28076 (face font-lock-string-face) 28076 28086 (face font-lock-type-face) 28086 28087 (face font-lock-string-face) 28087 28095 nil 28095 28096 (face font-lock-string-face) 28096 28108 (face font-lock-keyword-face) 28108 28109 (face font-lock-string-face) 28109 28121 nil 28121 28122 (face font-lock-string-face) 28122 28127 (face font-lock-function-name-face) 28127 28128 (face font-lock-string-face) 28128 28138 nil 28138 28139 (face font-lock-string-face) 28139 28150 (face font-lock-function-name-face) 28150 28151 (face font-lock-string-face) 28151 28161 nil 28161 28162 (face font-lock-string-face) 28162 28183 (face font-lock-function-name-face) 28183 28184 (face font-lock-string-face) 28184 28194 nil 28194 28195 (face font-lock-string-face) 28195 28216 (face font-lock-function-name-face) 28216 28217 (face font-lock-string-face) 28217 28234 nil 28234 28235 (face font-lock-string-face) 28235 28242 (face font-lock-keyword-face) 28242 28243 (face font-lock-string-face) 28243 28255 nil 28255 28256 (face font-lock-string-face) 28256 28290 (face font-lock-constant-face) 28290 28291 (face font-lock-string-face) 28291 28321 nil 28321 28322 (face font-lock-string-face) 28322 28333 (face font-lock-keyword-face) 28333 28334 (face font-lock-string-face) 28334 28336 nil 28336 28337 (face font-lock-string-face) 28337 28349 (face font-lock-function-name-face) 28349 28350 (face font-lock-string-face) 28350 28358 nil 28358 28359 (face font-lock-string-face) 28359 28363 (face font-lock-keyword-face) 28363 28364 (face font-lock-string-face) 28364 28366 nil 28366 28367 (face font-lock-string-face) 28367 28377 (face font-lock-type-face) 28377 28378 (face font-lock-string-face) 28378 28386 nil 28386 28387 (face font-lock-string-face) 28387 28394 (face font-lock-keyword-face) 28394 28395 (face font-lock-string-face) 28395 28407 nil 28407 28408 (face font-lock-string-face) 28408 28441 (face font-lock-constant-face) 28441 28442 (face font-lock-string-face) 28442 28471 nil 28471 28472 (face font-lock-string-face) 28472 28483 (face font-lock-keyword-face) 28483 28484 (face font-lock-string-face) 28484 28486 nil 28486 28487 (face font-lock-string-face) 28487 28498 (face font-lock-function-name-face) 28498 28499 (face font-lock-string-face) 28499 28507 nil 28507 28508 (face font-lock-string-face) 28508 28512 (face font-lock-keyword-face) 28512 28513 (face font-lock-string-face) 28513 28515 nil 28515 28516 (face font-lock-string-face) 28516 28526 (face font-lock-type-face) 28526 28527 (face font-lock-string-face) 28527 28535 nil 28535 28536 (face font-lock-string-face) 28536 28548 (face font-lock-keyword-face) 28548 28549 (face font-lock-string-face) 28549 28561 nil 28561 28562 (face font-lock-string-face) 28562 28567 (face font-lock-function-name-face) 28567 28568 (face font-lock-string-face) 28568 28578 nil 28578 28579 (face font-lock-string-face) 28579 28600 (face font-lock-function-name-face) 28600 28601 (face font-lock-string-face) 28601 28618 nil 28618 28619 (face font-lock-string-face) 28619 28626 (face font-lock-keyword-face) 28626 28627 (face font-lock-string-face) 28627 28639 nil 28639 28640 (face font-lock-string-face) 28640 28672 (face font-lock-constant-face) 28672 28673 (face font-lock-string-face) 28673 28698 nil 28698 28699 (face font-lock-string-face) 28699 28709 (face font-lock-keyword-face) 28709 28710 (face font-lock-string-face) 28710 28719 nil 28719 28720 (face font-lock-string-face) 28720 28729 (face font-lock-variable-name-face) 28729 28730 (face font-lock-string-face) 28730 28740 nil 28740 28741 (face font-lock-string-face) 28741 28748 (face font-lock-keyword-face) 28748 28749 (face font-lock-string-face) 28749 28773 nil 28773 28774 (face font-lock-string-face) 28774 28785 (face font-lock-keyword-face) 28785 28786 (face font-lock-string-face) 28786 28788 nil 28788 28789 (face font-lock-string-face) 28789 28799 (face font-lock-function-name-face) 28799 28800 (face font-lock-string-face) 28800 28812 nil 28812 28813 (face font-lock-string-face) 28813 28817 (face font-lock-keyword-face) 28817 28818 (face font-lock-string-face) 28818 28820 nil 28820 28821 (face font-lock-string-face) 28821 28831 (face font-lock-type-face) 28831 28832 (face font-lock-string-face) 28832 28844 nil 28844 28845 (face font-lock-string-face) 28845 28857 (face font-lock-keyword-face) 28857 28858 (face font-lock-string-face) 28858 28874 nil 28874 28875 (face font-lock-string-face) 28875 28880 (face font-lock-function-name-face) 28880 28881 (face font-lock-string-face) 28881 28895 nil 28895 28896 (face font-lock-string-face) 28896 28907 (face font-lock-function-name-face) 28907 28908 (face font-lock-string-face) 28908 28922 nil 28922 28923 (face font-lock-string-face) 28923 28944 (face font-lock-function-name-face) 28944 28945 (face font-lock-string-face) 28945 28959 nil 28959 28960 (face font-lock-string-face) 28960 29043 (face font-lock-function-name-face) 29043 29044 (face font-lock-string-face) 29044 29058 nil 29058 29059 (face font-lock-string-face) 29059 29074 (face font-lock-function-name-face) 29074 29075 (face font-lock-string-face) 29075 29100 nil 29100 29101 (face font-lock-string-face) 29101 29113 (face font-lock-keyword-face) 29113 29114 (face font-lock-string-face) 29114 29130 nil 29130 29131 (face font-lock-string-face) 29131 29133 (face font-lock-constant-face) 29133 29138 (face font-lock-variable-name-face) 29138 29163 (face font-lock-constant-face) 29163 29164 (face font-lock-string-face) 29164 29189 nil 29189 29190 (face font-lock-string-face) 29190 29197 (face font-lock-keyword-face) 29197 29198 (face font-lock-string-face) 29198 29214 nil 29214 29215 (face font-lock-string-face) 29215 29238 (face font-lock-constant-face) 29238 29239 (face font-lock-string-face) 29239 29253 nil 29253 29254 (face font-lock-string-face) 29254 29280 (face font-lock-constant-face) 29280 29281 (face font-lock-string-face) 29281 29295 nil 29295 29296 (face font-lock-string-face) 29296 29321 (face font-lock-constant-face) 29321 29322 (face font-lock-string-face) 29322 29336 nil 29336 29337 (face font-lock-string-face) 29337 29361 (face font-lock-constant-face) 29361 29362 (face font-lock-string-face) 29362 29376 nil 29376 29377 (face font-lock-string-face) 29377 29407 (face font-lock-constant-face) 29407 29408 (face font-lock-string-face) 29408 29422 nil 29422 29423 (face font-lock-string-face) 29423 29453 (face font-lock-constant-face) 29453 29454 (face font-lock-string-face) 29454 29468 nil 29468 29469 (face font-lock-string-face) 29469 29493 (face font-lock-constant-face) 29493 29494 (face font-lock-string-face) 29494 29508 nil 29508 29509 (face font-lock-string-face) 29509 29532 (face font-lock-constant-face) 29532 29533 (face font-lock-string-face) 29533 29547 nil 29547 29548 (face font-lock-string-face) 29548 29575 (face font-lock-constant-face) 29575 29576 (face font-lock-string-face) 29576 29590 nil 29590 29591 (face font-lock-string-face) 29591 29614 (face font-lock-constant-face) 29614 29615 (face font-lock-string-face) 29615 29640 nil 29640 29655 (face font-lock-string-face) 29655 29671 nil 29671 29685 (face font-lock-string-face) 29685 29703 nil 29703 29714 (face font-lock-string-face) 29714 29716 nil 29716 29719 (face font-lock-string-face) 29719 29729 nil 29729 29754 (face font-lock-comment-face) 29754 29792 nil 29792 29793 (face font-lock-string-face) 29793 29800 (face font-lock-keyword-face) 29800 29801 (face font-lock-string-face) 29801 29817 nil 29817 29818 (face font-lock-string-face) 29818 29843 (face font-lock-preprocessor-face) 29843 29844 (face font-lock-string-face) 29844 29892 nil 29892 29893 (face font-lock-string-face) 29893 29929 (face font-lock-variable-name-face) 29929 29930 (face font-lock-string-face) 29930 29940 nil 29940 29941 (face font-lock-string-face) 29941 29948 (face font-lock-keyword-face) 29948 29949 (face font-lock-string-face) 29949 29973 nil 29973 29974 (face font-lock-string-face) 29974 29985 (face font-lock-keyword-face) 29985 29986 (face font-lock-string-face) 29986 29988 nil 29988 29989 (face font-lock-string-face) 29989 30001 (face font-lock-function-name-face) 30001 30002 (face font-lock-string-face) 30002 30014 nil 30014 30015 (face font-lock-string-face) 30015 30019 (face font-lock-keyword-face) 30019 30020 (face font-lock-string-face) 30020 30022 nil 30022 30023 (face font-lock-string-face) 30023 30033 (face font-lock-type-face) 30033 30034 (face font-lock-string-face) 30034 30046 nil 30046 30047 (face font-lock-string-face) 30047 30059 (face font-lock-keyword-face) 30059 30060 (face font-lock-string-face) 30060 30076 nil 30076 30077 (face font-lock-string-face) 30077 30082 (face font-lock-function-name-face) 30082 30083 (face font-lock-string-face) 30083 30097 nil 30097 30098 (face font-lock-string-face) 30098 30109 (face font-lock-function-name-face) 30109 30110 (face font-lock-string-face) 30110 30124 nil 30124 30125 (face font-lock-string-face) 30125 30146 (face font-lock-function-name-face) 30146 30147 (face font-lock-string-face) 30147 30161 nil 30161 30162 (face font-lock-string-face) 30162 30180 (face font-lock-function-name-face) 30180 30181 (face font-lock-string-face) 30181 30206 nil 30206 30207 (face font-lock-string-face) 30207 30214 (face font-lock-keyword-face) 30214 30215 (face font-lock-string-face) 30215 30231 nil 30231 30232 (face font-lock-string-face) 30232 30266 (face font-lock-constant-face) 30266 30267 (face font-lock-string-face) 30267 30281 nil 30281 30282 (face font-lock-string-face) 30282 30321 (face font-lock-constant-face) 30321 30322 (face font-lock-string-face) 30322 30336 nil 30336 30337 (face font-lock-string-face) 30337 30375 (face font-lock-constant-face) 30375 30376 (face font-lock-string-face) 30376 30390 nil 30390 30391 (face font-lock-string-face) 30391 30430 (face font-lock-constant-face) 30430 30431 (face font-lock-string-face) 30431 30445 nil 30445 30446 (face font-lock-string-face) 30446 30484 (face font-lock-constant-face) 30484 30485 (face font-lock-string-face) 30485 30499 nil 30499 30500 (face font-lock-string-face) 30500 30533 (face font-lock-constant-face) 30533 30534 (face font-lock-string-face) 30534 30548 nil 30548 30549 (face font-lock-string-face) 30549 30581 (face font-lock-constant-face) 30581 30582 (face font-lock-string-face) 30582 30596 nil 30596 30597 (face font-lock-string-face) 30597 30626 (face font-lock-constant-face) 30626 30627 (face font-lock-string-face) 30627 30641 nil 30641 30642 (face font-lock-string-face) 30642 30670 (face font-lock-constant-face) 30670 30671 (face font-lock-string-face) 30671 30685 nil 30685 30686 (face font-lock-string-face) 30686 30714 (face font-lock-constant-face) 30714 30715 (face font-lock-string-face) 30715 30729 nil 30729 30730 (face font-lock-string-face) 30730 30757 (face font-lock-constant-face) 30757 30758 (face font-lock-string-face) 30758 30783 nil 30783 30784 (face font-lock-string-face) 30784 30794 (face font-lock-keyword-face) 30794 30795 (face font-lock-string-face) 30795 30812 nil 30812 30813 (face font-lock-string-face) 30813 30834 (face font-lock-variable-name-face) 30834 30835 (face font-lock-string-face) 30835 30853 nil 30853 30854 (face font-lock-string-face) 30854 30866 (face font-lock-keyword-face) 30866 30867 (face font-lock-string-face) 30867 30887 nil 30887 30888 (face font-lock-string-face) 30888 30917 (face font-lock-function-name-face) 30917 30918 (face font-lock-string-face) 30918 30951 nil 30951 30952 (face font-lock-string-face) 30952 30959 (face font-lock-keyword-face) 30959 30960 (face font-lock-string-face) 30960 30980 nil 30980 30981 (face font-lock-string-face) 30981 31015 (face font-lock-constant-face) 31015 31016 (face font-lock-string-face) 31016 31064 nil 31064 31065 (face font-lock-string-face) 31065 31074 (face font-lock-variable-name-face) 31074 31075 (face font-lock-string-face) 31075 31093 nil 31093 31094 (face font-lock-string-face) 31094 31106 (face font-lock-keyword-face) 31106 31107 (face font-lock-string-face) 31107 31127 nil 31127 31128 (face font-lock-string-face) 31128 31175 (face font-lock-function-name-face) 31175 31176 (face font-lock-string-face) 31176 31194 nil 31194 31195 (face font-lock-string-face) 31195 31245 (face font-lock-function-name-face) 31245 31246 (face font-lock-string-face) 31246 31279 nil 31279 31280 (face font-lock-string-face) 31280 31287 (face font-lock-keyword-face) 31287 31288 (face font-lock-string-face) 31288 31308 nil 31308 31309 (face font-lock-string-face) 31309 31341 (face font-lock-constant-face) 31341 31342 (face font-lock-string-face) 31342 31423 nil 31423 31424 (face font-lock-string-face) 31424 31462 (face font-lock-variable-name-face) 31462 31463 (face font-lock-string-face) 31463 31473 nil 31473 31474 (face font-lock-string-face) 31474 31481 (face font-lock-keyword-face) 31481 31482 (face font-lock-string-face) 31482 31506 nil 31506 31507 (face font-lock-string-face) 31507 31518 (face font-lock-keyword-face) 31518 31519 (face font-lock-string-face) 31519 31521 nil 31521 31522 (face font-lock-string-face) 31522 31539 (face font-lock-function-name-face) 31539 31540 (face font-lock-string-face) 31540 31552 nil 31552 31553 (face font-lock-string-face) 31553 31557 (face font-lock-keyword-face) 31557 31558 (face font-lock-string-face) 31558 31560 nil 31560 31561 (face font-lock-string-face) 31561 31571 (face font-lock-type-face) 31571 31572 (face font-lock-string-face) 31572 31584 nil 31584 31585 (face font-lock-string-face) 31585 31597 (face font-lock-keyword-face) 31597 31598 (face font-lock-string-face) 31598 31614 nil 31614 31615 (face font-lock-string-face) 31615 31636 (face font-lock-function-name-face) 31636 31637 (face font-lock-string-face) 31637 31651 nil 31651 31652 (face font-lock-string-face) 31652 31670 (face font-lock-function-name-face) 31670 31671 (face font-lock-string-face) 31671 31696 nil 31696 31697 (face font-lock-string-face) 31697 31706 (face font-lock-keyword-face) 31706 31707 (face font-lock-string-face) 31707 31723 nil 31723 31724 (face font-lock-string-face) 31724 31728 (face font-lock-constant-face) 31728 31729 (face font-lock-string-face) 31729 31743 nil 31743 31744 (face font-lock-string-face) 31744 31748 (face font-lock-constant-face) 31748 31749 (face font-lock-string-face) 31749 31774 nil 31774 31775 (face font-lock-string-face) 31775 31782 (face font-lock-keyword-face) 31782 31783 (face font-lock-string-face) 31783 31799 nil 31799 31800 (face font-lock-string-face) 31800 31844 (face font-lock-constant-face) 31844 31845 (face font-lock-string-face) 31845 31893 nil 31893 31894 (face font-lock-string-face) 31894 31943 (face font-lock-variable-name-face) 31943 31944 (face font-lock-string-face) 31944 31954 nil 31954 31955 (face font-lock-string-face) 31955 31962 (face font-lock-keyword-face) 31962 31963 (face font-lock-string-face) 31963 31987 nil 31987 31988 (face font-lock-string-face) 31988 31999 (face font-lock-keyword-face) 31999 32000 (face font-lock-string-face) 32000 32002 nil 32002 32003 (face font-lock-string-face) 32003 32013 (face font-lock-function-name-face) 32013 32014 (face font-lock-string-face) 32014 32026 nil 32026 32027 (face font-lock-string-face) 32027 32031 (face font-lock-keyword-face) 32031 32032 (face font-lock-string-face) 32032 32034 nil 32034 32035 (face font-lock-string-face) 32035 32045 (face font-lock-type-face) 32045 32046 (face font-lock-string-face) 32046 32058 nil 32058 32059 (face font-lock-string-face) 32059 32071 (face font-lock-keyword-face) 32071 32072 (face font-lock-string-face) 32072 32088 nil 32088 32089 (face font-lock-string-face) 32089 32094 (face font-lock-function-name-face) 32094 32095 (face font-lock-string-face) 32095 32109 nil 32109 32110 (face font-lock-string-face) 32110 32121 (face font-lock-function-name-face) 32121 32122 (face font-lock-string-face) 32122 32136 nil 32136 32137 (face font-lock-string-face) 32137 32158 (face font-lock-function-name-face) 32158 32159 (face font-lock-string-face) 32159 32173 nil 32173 32174 (face font-lock-string-face) 32174 32192 (face font-lock-function-name-face) 32192 32193 (face font-lock-string-face) 32193 32218 nil 32218 32219 (face font-lock-string-face) 32219 32232 (face font-lock-keyword-face) 32232 32233 (face font-lock-string-face) 32233 32249 nil 32249 32250 (face font-lock-string-face) 32250 32259 (face font-lock-keyword-face) 32259 32260 (face font-lock-string-face) 32260 32278 nil 32278 32279 (face font-lock-string-face) 32279 32283 (face font-lock-constant-face) 32283 32284 (face font-lock-string-face) 32284 32300 nil 32300 32301 (face font-lock-string-face) 32301 32306 (face font-lock-constant-face) 32306 32307 (face font-lock-string-face) 32307 32323 nil 32323 32324 (face font-lock-string-face) 32324 32333 (face font-lock-constant-face) 32333 32334 (face font-lock-string-face) 32334 32350 nil 32350 32351 (face font-lock-string-face) 32351 32357 (face font-lock-constant-face) 32357 32358 (face font-lock-string-face) 32358 32398 nil 32398 32399 (face font-lock-string-face) 32399 32406 (face font-lock-keyword-face) 32406 32407 (face font-lock-string-face) 32407 32423 nil 32423 32424 (face font-lock-string-face) 32424 32462 (face font-lock-constant-face) 32462 32463 (face font-lock-string-face) 32463 32477 nil 32477 32478 (face font-lock-string-face) 32478 32515 (face font-lock-constant-face) 32515 32516 (face font-lock-string-face) 32516 32530 nil 32530 32531 (face font-lock-string-face) 32531 32568 (face font-lock-constant-face) 32568 32569 (face font-lock-string-face) 32569 32583 nil 32583 32584 (face font-lock-string-face) 32584 32620 (face font-lock-constant-face) 32620 32621 (face font-lock-string-face) 32621 32635 nil 32635 32636 (face font-lock-string-face) 32636 32666 (face font-lock-constant-face) 32666 32667 (face font-lock-string-face) 32667 32681 nil 32681 32682 (face font-lock-string-face) 32682 32720 (face font-lock-constant-face) 32720 32721 (face font-lock-string-face) 32721 32735 nil 32735 32736 (face font-lock-string-face) 32736 32773 (face font-lock-constant-face) 32773 32774 (face font-lock-string-face) 32774 32822 nil 32822 32823 (face font-lock-string-face) 32823 32838 (face font-lock-variable-name-face) 32838 32839 (face font-lock-string-face) 32839 32849 nil 32849 32850 (face font-lock-string-face) 32850 32857 (face font-lock-keyword-face) 32857 32858 (face font-lock-string-face) 32858 32882 nil 32882 32883 (face font-lock-string-face) 32883 32894 (face font-lock-keyword-face) 32894 32895 (face font-lock-string-face) 32895 32897 nil 32897 32898 (face font-lock-string-face) 32898 32912 (face font-lock-function-name-face) 32912 32913 (face font-lock-string-face) 32913 32925 nil 32925 32926 (face font-lock-string-face) 32926 32930 (face font-lock-keyword-face) 32930 32931 (face font-lock-string-face) 32931 32933 nil 32933 32934 (face font-lock-string-face) 32934 32948 (face font-lock-type-face) 32948 32949 (face font-lock-string-face) 32949 32961 nil 32961 32962 (face font-lock-string-face) 32962 32969 (face font-lock-keyword-face) 32969 32970 (face font-lock-string-face) 32970 32986 nil 32986 32987 (face font-lock-string-face) 32987 33022 (face font-lock-constant-face) 33022 33023 (face font-lock-string-face) 33023 33037 nil 33037 33038 (face font-lock-string-face) 33038 33072 (face font-lock-constant-face) 33072 33073 (face font-lock-string-face) 33073 33098 nil 33098 33099 (face font-lock-string-face) 33099 33111 (face font-lock-keyword-face) 33111 33112 (face font-lock-string-face) 33112 33128 nil 33128 33129 (face font-lock-string-face) 33129 33150 (face font-lock-function-name-face) 33150 33151 (face font-lock-string-face) 33151 33176 nil 33176 33177 (face font-lock-string-face) 33177 33189 (face font-lock-keyword-face) 33189 33190 (face font-lock-string-face) 33190 33206 nil 33206 33207 (face font-lock-string-face) 33207 33209 (face font-lock-constant-face) 33209 33232 (face font-lock-variable-name-face) 33232 33239 (face font-lock-constant-face) 33239 33240 (face font-lock-string-face) 33240 33265 nil 33265 33266 (face font-lock-string-face) 33266 33273 (face font-lock-keyword-face) 33273 33274 (face font-lock-string-face) 33274 33306 nil 33306 33307 (face font-lock-string-face) 33307 33318 (face font-lock-keyword-face) 33318 33319 (face font-lock-string-face) 33319 33321 nil 33321 33322 (face font-lock-string-face) 33322 33342 (face font-lock-function-name-face) 33342 33343 (face font-lock-string-face) 33343 33359 nil 33359 33360 (face font-lock-string-face) 33360 33366 (face font-lock-keyword-face) 33366 33367 (face font-lock-string-face) 33367 33387 nil 33387 33388 (face font-lock-string-face) 33388 33434 (face font-lock-constant-face) 33434 33435 (face font-lock-string-face) 33435 33453 nil 33453 33454 (face font-lock-string-face) 33454 33519 (face font-lock-constant-face) 33519 33520 (face font-lock-string-face) 33520 33553 nil 33553 33554 (face font-lock-string-face) 33554 33561 (face font-lock-keyword-face) 33561 33562 (face font-lock-string-face) 33562 33582 nil 33582 33583 (face font-lock-string-face) 33583 33585 (face font-lock-constant-face) 33585 33608 (face font-lock-variable-name-face) 33608 33647 (face font-lock-constant-face) 33647 33648 (face font-lock-string-face) 33648 33681 nil 33681 33682 (face font-lock-string-face) 33682 33688 (face font-lock-keyword-face) 33688 33689 (face font-lock-string-face) 33689 33709 nil 33709 33710 (face font-lock-string-face) 33710 33716 (face font-lock-constant-face) 33716 33717 (face font-lock-string-face) 33717 33735 nil 33735 33736 (face font-lock-string-face) 33736 33738 (face font-lock-constant-face) 33738 33743 (face font-lock-variable-name-face) 33743 33788 (face font-lock-constant-face) 33788 33789 (face font-lock-string-face) 33789 33807 nil 33807 33808 (face font-lock-string-face) 33808 33810 (face font-lock-constant-face) 33810 33811 (face font-lock-string-face) 33811 33829 nil 33829 33830 (face font-lock-string-face) 33830 33833 (face font-lock-constant-face) 33833 33840 (face font-lock-variable-name-face) 33840 33841 (face font-lock-constant-face) 33841 33842 (face font-lock-string-face) 33842 33860 nil 33860 33861 (face font-lock-string-face) 33861 33864 (face font-lock-constant-face) 33864 33872 (face font-lock-variable-name-face) 33872 33873 (face font-lock-constant-face) 33873 33874 (face font-lock-string-face) 33874 33952 nil 33952 33953 (face font-lock-string-face) 33953 33964 (face font-lock-keyword-face) 33964 33965 (face font-lock-string-face) 33965 33967 nil 33967 33968 (face font-lock-string-face) 33968 33978 (face font-lock-function-name-face) 33978 33979 (face font-lock-string-face) 33979 33991 nil 33991 33992 (face font-lock-string-face) 33992 33996 (face font-lock-keyword-face) 33996 33997 (face font-lock-string-face) 33997 33999 nil 33999 34000 (face font-lock-string-face) 34000 34004 (face font-lock-type-face) 34004 34005 (face font-lock-string-face) 34005 34017 nil 34017 34018 (face font-lock-string-face) 34018 34030 (face font-lock-keyword-face) 34030 34031 (face font-lock-string-face) 34031 34035 nil 34035 34036 (face font-lock-string-face) 34036 34062 (face font-lock-function-name-face) 34062 34063 (face font-lock-string-face) 34063 34077 nil 34077 34078 (face font-lock-string-face) 34078 34087 (face font-lock-keyword-face) 34087 34088 (face font-lock-string-face) 34088 34104 nil 34104 34105 (face font-lock-string-face) 34105 34117 (face font-lock-variable-name-face) 34117 34118 (face font-lock-string-face) 34118 34120 nil 34120 34121 (face font-lock-string-face) 34121 34126 (face font-lock-variable-name-face) 34126 34127 (face font-lock-string-face) 34127 34141 nil 34141 34142 (face font-lock-string-face) 34142 34153 (face font-lock-variable-name-face) 34153 34154 (face font-lock-string-face) 34154 34156 nil 34156 34157 (face font-lock-string-face) 34157 34174 (face font-lock-variable-name-face) 34174 34175 (face font-lock-string-face) 34175 34200 nil 34200 34201 (face font-lock-string-face) 34201 34209 (face font-lock-keyword-face) 34209 34210 (face font-lock-string-face) 34210 34214 nil 34214 34215 (face font-lock-string-face) 34215 34233 (face font-lock-constant-face) 34233 34234 (face font-lock-string-face) 34234 34268 nil 34268 34287 (face font-lock-comment-face) 34287 34293 nil 34293 34365 (face font-lock-comment-face) 34365 34371 nil 34371 34372 (face font-lock-string-face) 34372 34379 (face font-lock-keyword-face) 34379 34380 (face font-lock-string-face) 34380 34404 nil 34404 34405 (face font-lock-string-face) 34405 34416 (face font-lock-keyword-face) 34416 34417 (face font-lock-string-face) 34417 34419 nil 34419 34420 (face font-lock-string-face) 34420 34436 (face font-lock-function-name-face) 34436 34437 (face font-lock-string-face) 34437 34449 nil 34449 34450 (face font-lock-string-face) 34450 34454 (face font-lock-keyword-face) 34454 34455 (face font-lock-string-face) 34455 34457 nil 34457 34458 (face font-lock-string-face) 34458 34468 (face font-lock-type-face) 34468 34469 (face font-lock-string-face) 34469 34481 nil 34481 34482 (face font-lock-string-face) 34482 34494 (face font-lock-keyword-face) 34494 34495 (face font-lock-string-face) 34495 34511 nil 34511 34512 (face font-lock-string-face) 34512 34517 (face font-lock-function-name-face) 34517 34518 (face font-lock-string-face) 34518 34532 nil 34532 34533 (face font-lock-string-face) 34533 34551 (face font-lock-function-name-face) 34551 34552 (face font-lock-string-face) 34552 34566 nil 34566 34567 (face font-lock-string-face) 34567 34588 (face font-lock-function-name-face) 34588 34589 (face font-lock-string-face) 34589 34603 nil 34603 34604 (face font-lock-string-face) 34604 34630 (face font-lock-function-name-face) 34630 34631 (face font-lock-string-face) 34631 34645 nil 34645 34646 (face font-lock-string-face) 34646 34680 (face font-lock-function-name-face) 34680 34681 (face font-lock-string-face) 34681 34695 nil 34695 34696 (face font-lock-string-face) 34696 34730 (face font-lock-function-name-face) 34730 34731 (face font-lock-string-face) 34731 34745 nil 34745 34746 (face font-lock-string-face) 34746 34772 (face font-lock-function-name-face) 34772 34773 (face font-lock-string-face) 34773 34787 nil 34787 34788 (face font-lock-string-face) 34788 34827 (face font-lock-function-name-face) 34827 34828 (face font-lock-string-face) 34828 34853 nil 34853 34854 (face font-lock-string-face) 34854 34861 (face font-lock-keyword-face) 34861 34862 (face font-lock-string-face) 34862 34878 nil 34878 34879 (face font-lock-string-face) 34879 34904 (face font-lock-constant-face) 34904 34905 (face font-lock-string-face) 34905 34930 nil 34930 34931 (face font-lock-string-face) 34931 34941 (face font-lock-keyword-face) 34941 34942 (face font-lock-string-face) 34942 34959 nil 34959 34960 (face font-lock-string-face) 34960 34981 (face font-lock-variable-name-face) 34981 34982 (face font-lock-string-face) 34982 35000 nil 35000 35001 (face font-lock-string-face) 35001 35013 (face font-lock-keyword-face) 35013 35014 (face font-lock-string-face) 35014 35034 nil 35034 35077 (face font-lock-comment-face) 35077 35093 nil 35093 35123 (face font-lock-comment-face) 35123 35139 nil 35139 35164 (face font-lock-comment-face) 35164 35180 nil 35180 35194 (face font-lock-comment-face) 35194 35210 nil 35210 35211 (face font-lock-string-face) 35211 35240 (face font-lock-function-name-face) 35240 35241 (face font-lock-string-face) 35241 35274 nil 35274 35275 (face font-lock-string-face) 35275 35285 (face font-lock-keyword-face) 35285 35286 (face font-lock-string-face) 35286 35307 nil 35307 35308 (face font-lock-string-face) 35308 35329 (face font-lock-variable-name-face) 35329 35330 (face font-lock-string-face) 35330 35352 nil 35352 35353 (face font-lock-string-face) 35353 35365 (face font-lock-keyword-face) 35365 35366 (face font-lock-string-face) 35366 35390 nil 35390 35391 (face font-lock-string-face) 35391 35432 (face font-lock-function-name-face) 35432 35433 (face font-lock-string-face) 35433 35553 nil 35553 35554 (face font-lock-string-face) 35554 35565 (face font-lock-keyword-face) 35565 35566 (face font-lock-string-face) 35566 35568 nil 35568 35569 (face font-lock-string-face) 35569 35592 (face font-lock-function-name-face) 35592 35593 (face font-lock-string-face) 35593 35605 nil 35605 35606 (face font-lock-string-face) 35606 35610 (face font-lock-keyword-face) 35610 35611 (face font-lock-string-face) 35611 35613 nil 35613 35614 (face font-lock-string-face) 35614 35624 (face font-lock-type-face) 35624 35625 (face font-lock-string-face) 35625 35637 nil 35637 35638 (face font-lock-string-face) 35638 35650 (face font-lock-keyword-face) 35650 35651 (face font-lock-string-face) 35651 35667 nil 35667 35668 (face font-lock-string-face) 35668 35673 (face font-lock-function-name-face) 35673 35674 (face font-lock-string-face) 35674 35688 nil 35688 35689 (face font-lock-string-face) 35689 35707 (face font-lock-function-name-face) 35707 35708 (face font-lock-string-face) 35708 35722 nil 35722 35723 (face font-lock-string-face) 35723 35757 (face font-lock-function-name-face) 35757 35758 (face font-lock-string-face) 35758 35772 nil 35772 35773 (face font-lock-string-face) 35773 35799 (face font-lock-function-name-face) 35799 35800 (face font-lock-string-face) 35800 35814 nil 35814 35815 (face font-lock-string-face) 35815 35841 (face font-lock-function-name-face) 35841 35842 (face font-lock-string-face) 35842 35856 nil 35856 35857 (face font-lock-string-face) 35857 35896 (face font-lock-function-name-face) 35896 35897 (face font-lock-string-face) 35897 35922 nil 35922 35923 (face font-lock-string-face) 35923 35930 (face font-lock-keyword-face) 35930 35931 (face font-lock-string-face) 35931 35947 nil 35947 35948 (face font-lock-string-face) 35948 35970 (face font-lock-constant-face) 35970 35971 (face font-lock-string-face) 35971 35985 nil 35985 35986 (face font-lock-string-face) 35986 36011 (face font-lock-constant-face) 36011 36012 (face font-lock-string-face) 36012 36026 nil 36026 36027 (face font-lock-string-face) 36027 36060 (face font-lock-constant-face) 36060 36061 (face font-lock-string-face) 36061 36075 nil 36075 36076 (face font-lock-string-face) 36076 36117 (face font-lock-constant-face) 36117 36118 (face font-lock-string-face) 36118 36143 nil 36143 36144 (face font-lock-string-face) 36144 36154 (face font-lock-keyword-face) 36154 36155 (face font-lock-string-face) 36155 36172 nil 36172 36173 (face font-lock-string-face) 36173 36198 (face font-lock-variable-name-face) 36198 36199 (face font-lock-string-face) 36199 36217 nil 36217 36218 (face font-lock-string-face) 36218 36228 (face font-lock-keyword-face) 36228 36229 (face font-lock-string-face) 36229 36250 nil 36250 36251 (face font-lock-string-face) 36251 36272 (face font-lock-variable-name-face) 36272 36273 (face font-lock-string-face) 36273 36295 nil 36295 36296 (face font-lock-string-face) 36296 36308 (face font-lock-keyword-face) 36308 36309 (face font-lock-string-face) 36309 36333 nil 36333 36334 (face font-lock-string-face) 36334 36375 (face font-lock-function-name-face) 36375 36376 (face font-lock-string-face) 36376 36496 nil 36496 36497 (face font-lock-string-face) 36497 36508 (face font-lock-keyword-face) 36508 36509 (face font-lock-string-face) 36509 36511 nil 36511 36512 (face font-lock-string-face) 36512 36524 (face font-lock-function-name-face) 36524 36525 (face font-lock-string-face) 36525 36537 nil 36537 36538 (face font-lock-string-face) 36538 36542 (face font-lock-keyword-face) 36542 36543 (face font-lock-string-face) 36543 36545 nil 36545 36546 (face font-lock-string-face) 36546 36556 (face font-lock-type-face) 36556 36557 (face font-lock-string-face) 36557 36569 nil 36569 36570 (face font-lock-string-face) 36570 36582 (face font-lock-keyword-face) 36582 36583 (face font-lock-string-face) 36583 36599 nil 36599 36600 (face font-lock-string-face) 36600 36605 (face font-lock-function-name-face) 36605 36606 (face font-lock-string-face) 36606 36620 nil 36620 36621 (face font-lock-string-face) 36621 36642 (face font-lock-function-name-face) 36642 36643 (face font-lock-string-face) 36643 36657 nil 36657 36658 (face font-lock-string-face) 36658 36697 (face font-lock-function-name-face) 36697 36698 (face font-lock-string-face) 36698 36723 nil 36723 36724 (face font-lock-string-face) 36724 36731 (face font-lock-keyword-face) 36731 36732 (face font-lock-string-face) 36732 36748 nil 36748 36749 (face font-lock-string-face) 36749 36782 (face font-lock-constant-face) 36782 36783 (face font-lock-string-face) 36783 36829 nil 36829 36830 (face font-lock-string-face) 36830 36841 (face font-lock-keyword-face) 36841 36842 (face font-lock-string-face) 36842 36844 nil 36844 36845 (face font-lock-string-face) 36845 36856 (face font-lock-function-name-face) 36856 36857 (face font-lock-string-face) 36857 36869 nil 36869 36870 (face font-lock-string-face) 36870 36874 (face font-lock-keyword-face) 36874 36875 (face font-lock-string-face) 36875 36877 nil 36877 36878 (face font-lock-string-face) 36878 36888 (face font-lock-type-face) 36888 36889 (face font-lock-string-face) 36889 36901 nil 36901 36902 (face font-lock-string-face) 36902 36914 (face font-lock-keyword-face) 36914 36915 (face font-lock-string-face) 36915 36931 nil 36931 36932 (face font-lock-string-face) 36932 36937 (face font-lock-function-name-face) 36937 36938 (face font-lock-string-face) 36938 36952 nil 36952 36953 (face font-lock-string-face) 36953 36974 (face font-lock-function-name-face) 36974 36975 (face font-lock-string-face) 36975 36989 nil 36989 36990 (face font-lock-string-face) 36990 37029 (face font-lock-function-name-face) 37029 37030 (face font-lock-string-face) 37030 37055 nil 37055 37056 (face font-lock-string-face) 37056 37063 (face font-lock-keyword-face) 37063 37064 (face font-lock-string-face) 37064 37080 nil 37080 37081 (face font-lock-string-face) 37081 37113 (face font-lock-constant-face) 37113 37114 (face font-lock-string-face) 37114 37163 nil)
Specifications contains syntax formatters for Xcode 3. These do not appear to be supported yet on Xcode 4. To use these with Xcode 3 please install both the gyp.pbfilespec and gyp.xclangspec files in

~/Library/Application Support/Developer/Shared/Xcode/Specifications/

and restart Xcode./*
	gyp.pbfilespec
	GYP source file spec for Xcode 3

	There is not much documentation available regarding the format
	of .pbfilespec files. As a starting point, see for instance the
	outdated documentation at:
	http://maxao.free.fr/xcode-plugin-interface/specifications.html
	and the files in:
	/Developer/Library/PrivateFrameworks/XcodeEdit.framework/Versions/A/Resources/

	Place this file in directory:
	~/Library/Application Support/Developer/Shared/Xcode/Specifications/
*/

(
	{
		Identifier = sourcecode.gyp;
		BasedOn = sourcecode;
		Name = "GYP Files";
		Extensions = ("gyp", "gypi");
		MIMETypes = ("text/gyp");
		Language = "xcode.lang.gyp";
		IsTextFile = YES;
		IsSourceFile = YES;
	}
)
/*
	Copyright (c) 2011 Google Inc. All rights reserved.
	Use of this source code is governed by a BSD-style license that can be
	found in the LICENSE file.
	
	gyp.xclangspec
	GYP language specification for Xcode 3

	There is not much documentation available regarding the format
	of .xclangspec files. As a starting point, see for instance the
	outdated documentation at:
	http://maxao.free.fr/xcode-plugin-interface/specifications.html
	and the files in:
	/Developer/Library/PrivateFrameworks/XcodeEdit.framework/Versions/A/Resources/

	Place this file in directory:
	~/Library/Application Support/Developer/Shared/Xcode/Specifications/
*/

(

    {
        Identifier = "xcode.lang.gyp.keyword";
        Syntax = {
            Words = (
                "and",
                "or",
                "<!",
                "<",
             );
            Type = "xcode.syntax.keyword";
        };
    },

    {
        Identifier = "xcode.lang.gyp.target.declarator";
        Syntax = {
        	Words = (
        		"'target_name'",
        	);
            Type = "xcode.syntax.identifier.type";
        };
    },

	{
		Identifier = "xcode.lang.gyp.string.singlequote";
		Syntax = {
			IncludeRules = (
				"xcode.lang.string",
				"xcode.lang.gyp.keyword",
				"xcode.lang.number",
			);
			Start = "'";
			End = "'";
		};
	},
	
	{
		Identifier = "xcode.lang.gyp.comma";
		Syntax = {
			Words = ( ",", );
			
		};
	},

	{
		Identifier = "xcode.lang.gyp";
		Description = "GYP Coloring";
		BasedOn = "xcode.lang.simpleColoring";
		IncludeInMenu = YES;
		Name = "GYP";
		Syntax = {
			Tokenizer = "xcode.lang.gyp.lexer.toplevel";
			IncludeRules = (
				"xcode.lang.gyp.dictionary",
			);
			Type = "xcode.syntax.plain";
		};
	},

	// The following rule returns tokens to the other rules
	{
		Identifier = "xcode.lang.gyp.lexer";
		Syntax = {
			IncludeRules = (
				"xcode.lang.gyp.comment",
				"xcode.lang.string",
				'xcode.lang.gyp.targetname.declarator',
				"xcode.lang.gyp.string.singlequote",
				"xcode.lang.number",
				"xcode.lang.gyp.comma",
			);
		};
	},

	{
		Identifier = "xcode.lang.gyp.lexer.toplevel";
		Syntax = {
			IncludeRules = (
				"xcode.lang.gyp.comment",
			);
		};
	},

	{
        Identifier = "xcode.lang.gyp.assignment";
        Syntax = {
            Tokenizer = "xcode.lang.gyp.lexer";
            Rules = (
            	"xcode.lang.gyp.assignment.lhs",
            	":",
                "xcode.lang.gyp.assignment.rhs",
            );
        };
       
    },
    
    {
        Identifier = "xcode.lang.gyp.target.declaration";
        Syntax = {
            Tokenizer = "xcode.lang.gyp.lexer";
            Rules = (
                "xcode.lang.gyp.target.declarator",
                ":",
                "xcode.lang.gyp.target.name",
            );
        };
   },
   
   {
        Identifier = "xcode.lang.gyp.target.name";
        Syntax = {
            Tokenizer = "xcode.lang.gyp.lexer";
            Rules = (
                "xcode.lang.gyp.string.singlequote",
            );
        	Type = "xcode.syntax.definition.function";
        };
    },
    
	{
        Identifier = "xcode.lang.gyp.assignment.lhs";
        Syntax = {
            Tokenizer = "xcode.lang.gyp.lexer";
            Rules = (
            	"xcode.lang.gyp.string.singlequote",
            );
         	Type = "xcode.syntax.identifier.type";
        };
    },
    
    {
        Identifier = "xcode.lang.gyp.assignment.rhs";
        Syntax = {
        	Tokenizer = "xcode.lang.gyp.lexer";
            Rules = (
            	"xcode.lang.gyp.string.singlequote?",
                "xcode.lang.gyp.array?",
				"xcode.lang.gyp.dictionary?",
				"xcode.lang.number?",
            );
        };
    },

	{
		Identifier = "xcode.lang.gyp.dictionary";
		Syntax = {
			Tokenizer = "xcode.lang.gyp.lexer";
			Start = "{";
			End = "}";
			Foldable = YES;
			Recursive = YES;
			IncludeRules = (
				"xcode.lang.gyp.target.declaration",
				"xcode.lang.gyp.assignment",
			);
		};
	},

	{
		Identifier = "xcode.lang.gyp.array";
		Syntax = {
			Tokenizer = "xcode.lang.gyp.lexer";
			Start = "[";
			End = "]";
			Foldable = YES;
			Recursive = YES;
			IncludeRules = (
				"xcode.lang.gyp.array",
				"xcode.lang.gyp.dictionary",
				"xcode.lang.gyp.string.singlequote",
			);
		};
	},

    {
        Identifier = "xcode.lang.gyp.todo.mark";
        Syntax = {
            StartChars = "T";
            Match = (
                "^\(TODO\(.*\):[ \t]+.*\)$",       // include "TODO: " in the markers list
            );
            // This is the order of captures. All of the match strings above need the same order.
            CaptureTypes = (
                "xcode.syntax.mark"
            );
            Type = "xcode.syntax.comment";
        };
    },

	{
		Identifier = "xcode.lang.gyp.comment";
		BasedOn = "xcode.lang.comment"; // for text macros
		Syntax = {
			Start = "#";
			End = "\n";
			IncludeRules = (
				"xcode.lang.url",
				"xcode.lang.url.mail",
				"xcode.lang.comment.mark",
				"xcode.lang.gyp.todo.mark",
			);
			Type = "xcode.syntax.comment";
		};
	},
)
# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""New implementation of Visual Studio project generation."""

import hashlib
import os
import random
from operator import attrgetter

import gyp.common


def cmp(x, y):
    return (x > y) - (x < y)


# Initialize random number generator
random.seed()

# GUIDs for project types
ENTRY_TYPE_GUIDS = {
    "project": "{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}",
    "folder": "{2150E333-8FDC-42A3-9474-1A3956D46DE8}",
}

# ------------------------------------------------------------------------------
# Helper functions


def MakeGuid(name, seed="msvs_new"):
    """Returns a GUID for the specified target name.

  Args:
    name: Target name.
    seed: Seed for MD5 hash.
  Returns:
    A GUID-line string calculated from the name and seed.

  This generates something which looks like a GUID, but depends only on the
  name and seed.  This means the same name/seed will always generate the same
  GUID, so that projects and solutions which refer to each other can explicitly
  determine the GUID to refer to explicitly.  It also means that the GUID will
  not change when the project for a target is rebuilt.
  """
    # Calculate a MD5 signature for the seed and name.
    d = hashlib.md5((str(seed) + str(name)).encode("utf-8")).hexdigest().upper()
    # Convert most of the signature to GUID form (discard the rest)
    guid = (
        "{"
        + d[:8]
        + "-"
        + d[8:12]
        + "-"
        + d[12:16]
        + "-"
        + d[16:20]
        + "-"
        + d[20:32]
        + "}"
    )
    return guid


# ------------------------------------------------------------------------------


class MSVSSolutionEntry:
    def __cmp__(self, other):
        # Sort by name then guid (so things are in order on vs2008).
        return cmp((self.name, self.get_guid()), (other.name, other.get_guid()))


class MSVSFolder(MSVSSolutionEntry):
    """Folder in a Visual Studio project or solution."""

    def __init__(self, path, name=None, entries=None, guid=None, items=None):
        """Initializes the folder.

    Args:
      path: Full path to the folder.
      name: Name of the folder.
      entries: List of folder entries to nest inside this folder.  May contain
          Folder or Project objects.  May be None, if the folder is empty.
      guid: GUID to use for folder, if not None.
      items: List of solution items to include in the folder project.  May be
          None, if the folder does not directly contain items.
    """
        if name:
            self.name = name
        else:
            # Use last layer.
            self.name = os.path.basename(path)

        self.path = path
        self.guid = guid

        # Copy passed lists (or set to empty lists)
        self.entries = sorted(entries or [], key=attrgetter("path"))
        self.items = list(items or [])

        self.entry_type_guid = ENTRY_TYPE_GUIDS["folder"]

    def get_guid(self):
        if self.guid is None:
            # Use consistent guids for folders (so things don't regenerate).
            self.guid = MakeGuid(self.path, seed="msvs_folder")
        return self.guid


# ------------------------------------------------------------------------------


class MSVSProject(MSVSSolutionEntry):
    """Visual Studio project."""

    def __init__(
        self,
        path,
        name=None,
        dependencies=None,
        guid=None,
        spec=None,
        build_file=None,
        config_platform_overrides=None,
        fixpath_prefix=None,
    ):
        """Initializes the project.

    Args:
      path: Absolute path to the project file.
      name: Name of project.  If None, the name will be the same as the base
          name of the project file.
      dependencies: List of other Project objects this project is dependent
          upon, if not None.
      guid: GUID to use for project, if not None.
      spec: Dictionary specifying how to build this project.
      build_file: Filename of the .gyp file that the vcproj file comes from.
      config_platform_overrides: optional dict of configuration platforms to
          used in place of the default for this target.
      fixpath_prefix: the path used to adjust the behavior of _fixpath
    """
        self.path = path
        self.guid = guid
        self.spec = spec
        self.build_file = build_file
        # Use project filename if name not specified
        self.name = name or os.path.splitext(os.path.basename(path))[0]

        # Copy passed lists (or set to empty lists)
        self.dependencies = list(dependencies or [])

        self.entry_type_guid = ENTRY_TYPE_GUIDS["project"]

        if config_platform_overrides:
            self.config_platform_overrides = config_platform_overrides
        else:
            self.config_platform_overrides = {}
        self.fixpath_prefix = fixpath_prefix
        self.msbuild_toolset = None

    def set_dependencies(self, dependencies):
        self.dependencies = list(dependencies or [])

    def get_guid(self):
        if self.guid is None:
            # Set GUID from path
            # TODO(rspangler): This is fragile.
            # 1. We can't just use the project filename sans path, since there could
            #    be multiple projects with the same base name (for example,
            #    foo/unittest.vcproj and bar/unittest.vcproj).
            # 2. The path needs to be relative to $SOURCE_ROOT, so that the project
            #    GUID is the same whether it's included from base/base.sln or
            #    foo/bar/baz/baz.sln.
            # 3. The GUID needs to be the same each time this builder is invoked, so
            #    that we don't need to rebuild the solution when the project changes.
            # 4. We should be able to handle pre-built project files by reading the
            #    GUID from the files.
            self.guid = MakeGuid(self.name)
        return self.guid

    def set_msbuild_toolset(self, msbuild_toolset):
        self.msbuild_toolset = msbuild_toolset


# ------------------------------------------------------------------------------


class MSVSSolution:
    """Visual Studio solution."""

    def __init__(
        self, path, version, entries=None, variants=None, websiteProperties=True
    ):
        """Initializes the solution.

    Args:
      path: Path to solution file.
      version: Format version to emit.
      entries: List of entries in solution.  May contain Folder or Project
          objects.  May be None, if the folder is empty.
      variants: List of build variant strings.  If none, a default list will
          be used.
      websiteProperties: Flag to decide if the website properties section
          is generated.
    """
        self.path = path
        self.websiteProperties = websiteProperties
        self.version = version

        # Copy passed lists (or set to empty lists)
        self.entries = list(entries or [])

        if variants:
            # Copy passed list
            self.variants = variants[:]
        else:
            # Use default
            self.variants = ["Debug|Win32", "Release|Win32"]
        # TODO(rspangler): Need to be able to handle a mapping of solution config
        # to project config.  Should we be able to handle variants being a dict,
        # or add a separate variant_map variable?  If it's a dict, we can't
        # guarantee the order of variants since dict keys aren't ordered.

        # TODO(rspangler): Automatically write to disk for now; should delay until
        # node-evaluation time.
        self.Write()

    def Write(self, writer=gyp.common.WriteOnDiff):
        """Writes the solution file to disk.

    Raises:
      IndexError: An entry appears multiple times.
    """
        # Walk the entry tree and collect all the folders and projects.
        all_entries = set()
        entries_to_check = self.entries[:]
        while entries_to_check:
            e = entries_to_check.pop(0)

            # If this entry has been visited, nothing to do.
            if e in all_entries:
                continue

            all_entries.add(e)

            # If this is a folder, check its entries too.
            if isinstance(e, MSVSFolder):
                entries_to_check += e.entries

        all_entries = sorted(all_entries, key=attrgetter("path"))

        # Open file and print header
        f = writer(self.path)
        f.write(
            "Microsoft Visual Studio Solution File, "
            "Format Version %s\r\n" % self.version.SolutionVersion()
        )
        f.write("# %s\r\n" % self.version.Description())

        # Project entries
        sln_root = os.path.split(self.path)[0]
        for e in all_entries:
            relative_path = gyp.common.RelativePath(e.path, sln_root)
            # msbuild does not accept an empty folder_name.
            # use '.' in case relative_path is empty.
            folder_name = relative_path.replace("/", "\\") or "."
            f.write(
                'Project("%s") = "%s", "%s", "%s"\r\n'
                % (
                    e.entry_type_guid,  # Entry type GUID
                    e.name,  # Folder name
                    folder_name,  # Folder name (again)
                    e.get_guid(),  # Entry GUID
                )
            )

            # TODO(rspangler): Need a way to configure this stuff
            if self.websiteProperties:
                f.write(
                    "\tProjectSection(WebsiteProperties) = preProject\r\n"
                    '\t\tDebug.AspNetCompiler.Debug = "True"\r\n'
                    '\t\tRelease.AspNetCompiler.Debug = "False"\r\n'
                    "\tEndProjectSection\r\n"
                )

            if isinstance(e, MSVSFolder):
                if e.items:
                    f.write("\tProjectSection(SolutionItems) = preProject\r\n")
                    for i in e.items:
                        f.write(f"\t\t{i} = {i}\r\n")
                    f.write("\tEndProjectSection\r\n")

            if isinstance(e, MSVSProject):
                if e.dependencies:
                    f.write("\tProjectSection(ProjectDependencies) = postProject\r\n")
                    for d in e.dependencies:
                        f.write(f"\t\t{d.get_guid()} = {d.get_guid()}\r\n")
                    f.write("\tEndProjectSection\r\n")

            f.write("EndProject\r\n")

        # Global section
        f.write("Global\r\n")

        # Configurations (variants)
        f.write("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n")
        for v in self.variants:
            f.write(f"\t\t{v} = {v}\r\n")
        f.write("\tEndGlobalSection\r\n")

        # Sort config guids for easier diffing of solution changes.
        config_guids = []
        config_guids_overrides = {}
        for e in all_entries:
            if isinstance(e, MSVSProject):
                config_guids.append(e.get_guid())
                config_guids_overrides[e.get_guid()] = e.config_platform_overrides
        config_guids.sort()

        f.write("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n")
        for g in config_guids:
            for v in self.variants:
                nv = config_guids_overrides[g].get(v, v)
                # Pick which project configuration to build for this solution
                # configuration.
                f.write(
                    "\t\t%s.%s.ActiveCfg = %s\r\n"
                    % (
                        g,  # Project GUID
                        v,  # Solution build configuration
                        nv,  # Project build config for that solution config
                    )
                )

                # Enable project in this solution configuration.
                f.write(
                    "\t\t%s.%s.Build.0 = %s\r\n"
                    % (
                        g,  # Project GUID
                        v,  # Solution build configuration
                        nv,  # Project build config for that solution config
                    )
                )
        f.write("\tEndGlobalSection\r\n")

        # TODO(rspangler): Should be able to configure this stuff too (though I've
        # never seen this be any different)
        f.write("\tGlobalSection(SolutionProperties) = preSolution\r\n")
        f.write("\t\tHideSolutionNode = FALSE\r\n")
        f.write("\tEndGlobalSection\r\n")

        # Folder mappings
        # Omit this section if there are no folders
        if any([e.entries for e in all_entries if isinstance(e, MSVSFolder)]):
            f.write("\tGlobalSection(NestedProjects) = preSolution\r\n")
            for e in all_entries:
                if not isinstance(e, MSVSFolder):
                    continue  # Does not apply to projects, only folders
                for subentry in e.entries:
                    f.write(f"\t\t{subentry.get_guid()} = {e.get_guid()}\r\n")
            f.write("\tEndGlobalSection\r\n")

        f.write("EndGlobal\r\n")

        f.close()
# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Visual Studio project reader/writer."""

import gyp.easy_xml as easy_xml

# ------------------------------------------------------------------------------


class Tool:
    """Visual Studio tool."""

    def __init__(self, name, attrs=None):
        """Initializes the tool.

    Args:
      name: Tool name.
      attrs: Dict of tool attributes; may be None.
    """
        self._attrs = attrs or {}
        self._attrs["Name"] = name

    def _GetSpecification(self):
        """Creates an element for the tool.

    Returns:
      A new xml.dom.Element for the tool.
    """
        return ["Tool", self._attrs]


class Filter:
    """Visual Studio filter - that is, a virtual folder."""

    def __init__(self, name, contents=None):
        """Initializes the folder.

    Args:
      name: Filter (folder) name.
      contents: List of filenames and/or Filter objects contained.
    """
        self.name = name
        self.contents = list(contents or [])


# ------------------------------------------------------------------------------


class Writer:
    """Visual Studio XML project writer."""

    def __init__(self, project_path, version, name, guid=None, platforms=None):
        """Initializes the project.

    Args:
      project_path: Path to the project file.
      version: Format version to emit.
      name: Name of the project.
      guid: GUID to use for project, if not None.
      platforms: Array of string, the supported platforms.  If null, ['Win32']
    """
        self.project_path = project_path
        self.version = version
        self.name = name
        self.guid = guid

        # Default to Win32 for platforms.
        if not platforms:
            platforms = ["Win32"]

        # Initialize the specifications of the various sections.
        self.platform_section = ["Platforms"]
        for platform in platforms:
            self.platform_section.append(["Platform", {"Name": platform}])
        self.tool_files_section = ["ToolFiles"]
        self.configurations_section = ["Configurations"]
        self.files_section = ["Files"]

        # Keep a dict keyed on filename to speed up access.
        self.files_dict = dict()

    def AddToolFile(self, path):
        """Adds a tool file to the project.

    Args:
      path: Relative path from project to tool file.
    """
        self.tool_files_section.append(["ToolFile", {"RelativePath": path}])

    def _GetSpecForConfiguration(self, config_type, config_name, attrs, tools):
        """Returns the specification for a configuration.

    Args:
      config_type: Type of configuration node.
      config_name: Configuration name.
      attrs: Dict of configuration attributes; may be None.
      tools: List of tools (strings or Tool objects); may be None.
    Returns:
    """
        # Handle defaults
        if not attrs:
            attrs = {}
        if not tools:
            tools = []

        # Add configuration node and its attributes
        node_attrs = attrs.copy()
        node_attrs["Name"] = config_name
        specification = [config_type, node_attrs]

        # Add tool nodes and their attributes
        if tools:
            for t in tools:
                if isinstance(t, Tool):
                    specification.append(t._GetSpecification())
                else:
                    specification.append(Tool(t)._GetSpecification())
        return specification

    def AddConfig(self, name, attrs=None, tools=None):
        """Adds a configuration to the project.

    Args:
      name: Configuration name.
      attrs: Dict of configuration attributes; may be None.
      tools: List of tools (strings or Tool objects); may be None.
    """
        spec = self._GetSpecForConfiguration("Configuration", name, attrs, tools)
        self.configurations_section.append(spec)

    def _AddFilesToNode(self, parent, files):
        """Adds files and/or filters to the parent node.

    Args:
      parent: Destination node
      files: A list of Filter objects and/or relative paths to files.

    Will call itself recursively, if the files list contains Filter objects.
    """
        for f in files:
            if isinstance(f, Filter):
                node = ["Filter", {"Name": f.name}]
                self._AddFilesToNode(node, f.contents)
            else:
                node = ["File", {"RelativePath": f}]
                self.files_dict[f] = node
            parent.append(node)

    def AddFiles(self, files):
        """Adds files to the project.

    Args:
      files: A list of Filter objects and/or relative paths to files.

    This makes a copy of the file/filter tree at the time of this call.  If you
    later add files to a Filter object which was passed into a previous call
    to AddFiles(), it will not be reflected in this project.
    """
        self._AddFilesToNode(self.files_section, files)
        # TODO(rspangler) This also doesn't handle adding files to an existing
        # filter.  That is, it doesn't merge the trees.

    def AddFileConfig(self, path, config, attrs=None, tools=None):
        """Adds a configuration to a file.

    Args:
      path: Relative path to the file.
      config: Name of configuration to add.
      attrs: Dict of configuration attributes; may be None.
      tools: List of tools (strings or Tool objects); may be None.

    Raises:
      ValueError: Relative path does not match any file added via AddFiles().
    """
        # Find the file node with the right relative path
        parent = self.files_dict.get(path)
        if not parent:
            raise ValueError('AddFileConfig: file "%s" not in project.' % path)

        # Add the config to the file node
        spec = self._GetSpecForConfiguration("FileConfiguration", config, attrs, tools)
        parent.append(spec)

    def WriteIfChanged(self):
        """Writes the project file."""
        # First create XML content definition
        content = [
            "VisualStudioProject",
            {
                "ProjectType": "Visual C++",
                "Version": self.version.ProjectVersion(),
                "Name": self.name,
                "ProjectGUID": self.guid,
                "RootNamespace": self.name,
                "Keyword": "Win32Proj",
            },
            self.platform_section,
            self.tool_files_section,
            self.configurations_section,
            ["References"],  # empty section
            self.files_section,
            ["Globals"],  # empty section
        ]
        easy_xml.WriteXmlIfChanged(content, self.project_path, encoding="Windows-1252")
# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

r"""Code to validate and convert settings of the Microsoft build tools.

This file contains code to validate and convert settings of the Microsoft
build tools.  The function ConvertToMSBuildSettings(), ValidateMSVSSettings(),
and ValidateMSBuildSettings() are the entry points.

This file was created by comparing the projects created by Visual Studio 2008
and Visual Studio 2010 for all available settings through the user interface.
The MSBuild schemas were also considered.  They are typically found in the
MSBuild install directory, e.g. c:\Program Files (x86)\MSBuild
"""

import re
import sys

# Dictionaries of settings validators. The key is the tool name, the value is
# a dictionary mapping setting names to validation functions.
_msvs_validators = {}
_msbuild_validators = {}


# A dictionary of settings converters. The key is the tool name, the value is
# a dictionary mapping setting names to conversion functions.
_msvs_to_msbuild_converters = {}


# Tool name mapping from MSVS to MSBuild.
_msbuild_name_of_tool = {}


class _Tool:
    """Represents a tool used by MSVS or MSBuild.

  Attributes:
      msvs_name: The name of the tool in MSVS.
      msbuild_name: The name of the tool in MSBuild.
  """

    def __init__(self, msvs_name, msbuild_name):
        self.msvs_name = msvs_name
        self.msbuild_name = msbuild_name


def _AddTool(tool):
    """Adds a tool to the four dictionaries used to process settings.

  This only defines the tool.  Each setting also needs to be added.

  Args:
    tool: The _Tool object to be added.
  """
    _msvs_validators[tool.msvs_name] = {}
    _msbuild_validators[tool.msbuild_name] = {}
    _msvs_to_msbuild_converters[tool.msvs_name] = {}
    _msbuild_name_of_tool[tool.msvs_name] = tool.msbuild_name


def _GetMSBuildToolSettings(msbuild_settings, tool):
    """Returns an MSBuild tool dictionary.  Creates it if needed."""
    return msbuild_settings.setdefault(tool.msbuild_name, {})


class _Type:
    """Type of settings (Base class)."""

    def ValidateMSVS(self, value):
        """Verifies that the value is legal for MSVS.

    Args:
      value: the value to check for this type.

    Raises:
      ValueError if value is not valid for MSVS.
    """

    def ValidateMSBuild(self, value):
        """Verifies that the value is legal for MSBuild.

    Args:
      value: the value to check for this type.

    Raises:
      ValueError if value is not valid for MSBuild.
    """

    def ConvertToMSBuild(self, value):
        """Returns the MSBuild equivalent of the MSVS value given.

    Args:
      value: the MSVS value to convert.

    Returns:
      the MSBuild equivalent.

    Raises:
      ValueError if value is not valid.
    """
        return value


class _String(_Type):
    """A setting that's just a string."""

    def ValidateMSVS(self, value):
        if not isinstance(value, str):
            raise ValueError("expected string; got %r" % value)

    def ValidateMSBuild(self, value):
        if not isinstance(value, str):
            raise ValueError("expected string; got %r" % value)

    def ConvertToMSBuild(self, value):
        # Convert the macros
        return ConvertVCMacrosToMSBuild(value)


class _StringList(_Type):
    """A settings that's a list of strings."""

    def ValidateMSVS(self, value):
        if not isinstance(value, (list, str)):
            raise ValueError("expected string list; got %r" % value)

    def ValidateMSBuild(self, value):
        if not isinstance(value, (list, str)):
            raise ValueError("expected string list; got %r" % value)

    def ConvertToMSBuild(self, value):
        # Convert the macros
        if isinstance(value, list):
            return [ConvertVCMacrosToMSBuild(i) for i in value]
        else:
            return ConvertVCMacrosToMSBuild(value)


class _Boolean(_Type):
    """Boolean settings, can have the values 'false' or 'true'."""

    def _Validate(self, value):
        if value != "true" and value != "false":
            raise ValueError("expected bool; got %r" % value)

    def ValidateMSVS(self, value):
        self._Validate(value)

    def ValidateMSBuild(self, value):
        self._Validate(value)

    def ConvertToMSBuild(self, value):
        self._Validate(value)
        return value


class _Integer(_Type):
    """Integer settings."""

    def __init__(self, msbuild_base=10):
        _Type.__init__(self)
        self._msbuild_base = msbuild_base

    def ValidateMSVS(self, value):
        # Try to convert, this will raise ValueError if invalid.
        self.ConvertToMSBuild(value)

    def ValidateMSBuild(self, value):
        # Try to convert, this will raise ValueError if invalid.
        int(value, self._msbuild_base)

    def ConvertToMSBuild(self, value):
        msbuild_format = (self._msbuild_base == 10) and "%d" or "0x%04x"
        return msbuild_format % int(value)


class _Enumeration(_Type):
    """Type of settings that is an enumeration.

  In MSVS, the values are indexes like '0', '1', and '2'.
  MSBuild uses text labels that are more representative, like 'Win32'.

  Constructor args:
    label_list: an array of MSBuild labels that correspond to the MSVS index.
        In the rare cases where MSVS has skipped an index value, None is
        used in the array to indicate the unused spot.
    new: an array of labels that are new to MSBuild.
  """

    def __init__(self, label_list, new=None):
        _Type.__init__(self)
        self._label_list = label_list
        self._msbuild_values = {value for value in label_list if value is not None}
        if new is not None:
            self._msbuild_values.update(new)

    def ValidateMSVS(self, value):
        # Try to convert.  It will raise an exception if not valid.
        self.ConvertToMSBuild(value)

    def ValidateMSBuild(self, value):
        if value not in self._msbuild_values:
            raise ValueError("unrecognized enumerated value %s" % value)

    def ConvertToMSBuild(self, value):
        index = int(value)
        if index < 0 or index >= len(self._label_list):
            raise ValueError(
                "index value (%d) not in expected range [0, %d)"
                % (index, len(self._label_list))
            )
        label = self._label_list[index]
        if label is None:
            raise ValueError("converted value for %s not specified." % value)
        return label


# Instantiate the various generic types.
_boolean = _Boolean()
_integer = _Integer()
# For now, we don't do any special validation on these types:
_string = _String()
_file_name = _String()
_folder_name = _String()
_file_list = _StringList()
_folder_list = _StringList()
_string_list = _StringList()
# Some boolean settings went from numerical values to boolean.  The
# mapping is 0: default, 1: false, 2: true.
_newly_boolean = _Enumeration(["", "false", "true"])


def _Same(tool, name, setting_type):
    """Defines a setting that has the same name in MSVS and MSBuild.

  Args:
    tool: a dictionary that gives the names of the tool for MSVS and MSBuild.
    name: the name of the setting.
    setting_type: the type of this setting.
  """
    _Renamed(tool, name, name, setting_type)


def _Renamed(tool, msvs_name, msbuild_name, setting_type):
    """Defines a setting for which the name has changed.

  Args:
    tool: a dictionary that gives the names of the tool for MSVS and MSBuild.
    msvs_name: the name of the MSVS setting.
    msbuild_name: the name of the MSBuild setting.
    setting_type: the type of this setting.
  """

    def _Translate(value, msbuild_settings):
        msbuild_tool_settings = _GetMSBuildToolSettings(msbuild_settings, tool)
        msbuild_tool_settings[msbuild_name] = setting_type.ConvertToMSBuild(value)

    _msvs_validators[tool.msvs_name][msvs_name] = setting_type.ValidateMSVS
    _msbuild_validators[tool.msbuild_name][msbuild_name] = setting_type.ValidateMSBuild
    _msvs_to_msbuild_converters[tool.msvs_name][msvs_name] = _Translate


def _Moved(tool, settings_name, msbuild_tool_name, setting_type):
    _MovedAndRenamed(
        tool, settings_name, msbuild_tool_name, settings_name, setting_type
    )


def _MovedAndRenamed(
    tool, msvs_settings_name, msbuild_tool_name, msbuild_settings_name, setting_type
):
    """Defines a setting that may have moved to a new section.

  Args:
    tool: a dictionary that gives the names of the tool for MSVS and MSBuild.
    msvs_settings_name: the MSVS name of the setting.
    msbuild_tool_name: the name of the MSBuild tool to place the setting under.
    msbuild_settings_name: the MSBuild name of the setting.
    setting_type: the type of this setting.
  """

    def _Translate(value, msbuild_settings):
        tool_settings = msbuild_settings.setdefault(msbuild_tool_name, {})
        tool_settings[msbuild_settings_name] = setting_type.ConvertToMSBuild(value)

    _msvs_validators[tool.msvs_name][msvs_settings_name] = setting_type.ValidateMSVS
    validator = setting_type.ValidateMSBuild
    _msbuild_validators[msbuild_tool_name][msbuild_settings_name] = validator
    _msvs_to_msbuild_converters[tool.msvs_name][msvs_settings_name] = _Translate


def _MSVSOnly(tool, name, setting_type):
    """Defines a setting that is only found in MSVS.

  Args:
    tool: a dictionary that gives the names of the tool for MSVS and MSBuild.
    name: the name of the setting.
    setting_type: the type of this setting.
  """

    def _Translate(unused_value, unused_msbuild_settings):
        # Since this is for MSVS only settings, no translation will happen.
        pass

    _msvs_validators[tool.msvs_name][name] = setting_type.ValidateMSVS
    _msvs_to_msbuild_converters[tool.msvs_name][name] = _Translate


def _MSBuildOnly(tool, name, setting_type):
    """Defines a setting that is only found in MSBuild.

  Args:
    tool: a dictionary that gives the names of the tool for MSVS and MSBuild.
    name: the name of the setting.
    setting_type: the type of this setting.
  """

    def _Translate(value, msbuild_settings):
        # Let msbuild-only properties get translated as-is from msvs_settings.
        tool_settings = msbuild_settings.setdefault(tool.msbuild_name, {})
        tool_settings[name] = value

    _msbuild_validators[tool.msbuild_name][name] = setting_type.ValidateMSBuild
    _msvs_to_msbuild_converters[tool.msvs_name][name] = _Translate


def _ConvertedToAdditionalOption(tool, msvs_name, flag):
    """Defines a setting that's handled via a command line option in MSBuild.

  Args:
    tool: a dictionary that gives the names of the tool for MSVS and MSBuild.
    msvs_name: the name of the MSVS setting that if 'true' becomes a flag
    flag: the flag to insert at the end of the AdditionalOptions
  """

    def _Translate(value, msbuild_settings):
        if value == "true":
            tool_settings = _GetMSBuildToolSettings(msbuild_settings, tool)
            if "AdditionalOptions" in tool_settings:
                new_flags = "{} {}".format(tool_settings["AdditionalOptions"], flag)
            else:
                new_flags = flag
            tool_settings["AdditionalOptions"] = new_flags

    _msvs_validators[tool.msvs_name][msvs_name] = _boolean.ValidateMSVS
    _msvs_to_msbuild_converters[tool.msvs_name][msvs_name] = _Translate


def _CustomGeneratePreprocessedFile(tool, msvs_name):
    def _Translate(value, msbuild_settings):
        tool_settings = _GetMSBuildToolSettings(msbuild_settings, tool)
        if value == "0":
            tool_settings["PreprocessToFile"] = "false"
            tool_settings["PreprocessSuppressLineNumbers"] = "false"
        elif value == "1":  # /P
            tool_settings["PreprocessToFile"] = "true"
            tool_settings["PreprocessSuppressLineNumbers"] = "false"
        elif value == "2":  # /EP /P
            tool_settings["PreprocessToFile"] = "true"
            tool_settings["PreprocessSuppressLineNumbers"] = "true"
        else:
            raise ValueError("value must be one of [0, 1, 2]; got %s" % value)

    # Create a bogus validator that looks for '0', '1', or '2'
    msvs_validator = _Enumeration(["a", "b", "c"]).ValidateMSVS
    _msvs_validators[tool.msvs_name][msvs_name] = msvs_validator
    msbuild_validator = _boolean.ValidateMSBuild
    msbuild_tool_validators = _msbuild_validators[tool.msbuild_name]
    msbuild_tool_validators["PreprocessToFile"] = msbuild_validator
    msbuild_tool_validators["PreprocessSuppressLineNumbers"] = msbuild_validator
    _msvs_to_msbuild_converters[tool.msvs_name][msvs_name] = _Translate


fix_vc_macro_slashes_regex_list = ("IntDir", "OutDir")
fix_vc_macro_slashes_regex = re.compile(
    r"(\$\((?:%s)\))(?:[\\/]+)" % "|".join(fix_vc_macro_slashes_regex_list)
)

# Regular expression to detect keys that were generated by exclusion lists
_EXCLUDED_SUFFIX_RE = re.compile("^(.*)_excluded$")


def _ValidateExclusionSetting(setting, settings, error_msg, stderr=sys.stderr):
    """Verify that 'setting' is valid if it is generated from an exclusion list.

  If the setting appears to be generated from an exclusion list, the root name
  is checked.

  Args:
      setting:   A string that is the setting name to validate
      settings:  A dictionary where the keys are valid settings
      error_msg: The message to emit in the event of error
      stderr:    The stream receiving the error messages.
  """
    # This may be unrecognized because it's an exclusion list. If the
    # setting name has the _excluded suffix, then check the root name.
    unrecognized = True
    m = re.match(_EXCLUDED_SUFFIX_RE, setting)
    if m:
        root_setting = m.group(1)
        unrecognized = root_setting not in settings

    if unrecognized:
        # We don't know this setting. Give a warning.
        print(error_msg, file=stderr)


def FixVCMacroSlashes(s):
    """Replace macros which have excessive following slashes.

  These macros are known to have a built-in trailing slash. Furthermore, many
  scripts hiccup on processing paths with extra slashes in the middle.

  This list is probably not exhaustive.  Add as needed.
  """
    if "$" in s:
        s = fix_vc_macro_slashes_regex.sub(r"\1", s)
    return s


def ConvertVCMacrosToMSBuild(s):
    """Convert the MSVS macros found in the string to the MSBuild equivalent.

  This list is probably not exhaustive.  Add as needed.
  """
    if "$" in s:
        replace_map = {
            "$(ConfigurationName)": "$(Configuration)",
            "$(InputDir)": "%(RelativeDir)",
            "$(InputExt)": "%(Extension)",
            "$(InputFileName)": "%(Filename)%(Extension)",
            "$(InputName)": "%(Filename)",
            "$(InputPath)": "%(Identity)",
            "$(ParentName)": "$(ProjectFileName)",
            "$(PlatformName)": "$(Platform)",
            "$(SafeInputName)": "%(Filename)",
        }
        for old, new in replace_map.items():
            s = s.replace(old, new)
        s = FixVCMacroSlashes(s)
    return s


def ConvertToMSBuildSettings(msvs_settings, stderr=sys.stderr):
    """Converts MSVS settings (VS2008 and earlier) to MSBuild settings (VS2010+).

  Args:
      msvs_settings: A dictionary.  The key is the tool name.  The values are
          themselves dictionaries of settings and their values.
      stderr: The stream receiving the error messages.

  Returns:
      A dictionary of MSBuild settings.  The key is either the MSBuild tool name
      or the empty string (for the global settings).  The values are themselves
      dictionaries of settings and their values.
  """
    msbuild_settings = {}
    for msvs_tool_name, msvs_tool_settings in msvs_settings.items():
        if msvs_tool_name in _msvs_to_msbuild_converters:
            msvs_tool = _msvs_to_msbuild_converters[msvs_tool_name]
            for msvs_setting, msvs_value in msvs_tool_settings.items():
                if msvs_setting in msvs_tool:
                    # Invoke the translation function.
                    try:
                        msvs_tool[msvs_setting](msvs_value, msbuild_settings)
                    except ValueError as e:
                        print(
                            "Warning: while converting %s/%s to MSBuild, "
                            "%s" % (msvs_tool_name, msvs_setting, e),
                            file=stderr,
                        )
                else:
                    _ValidateExclusionSetting(
                        msvs_setting,
                        msvs_tool,
                        (
                            "Warning: unrecognized setting %s/%s "
                            "while converting to MSBuild."
                            % (msvs_tool_name, msvs_setting)
                        ),
                        stderr,
                    )
        else:
            print(
                "Warning: unrecognized tool %s while converting to "
                "MSBuild." % msvs_tool_name,
                file=stderr,
            )
    return msbuild_settings


def ValidateMSVSSettings(settings, stderr=sys.stderr):
    """Validates that the names of the settings are valid for MSVS.

  Args:
      settings: A dictionary.  The key is the tool name.  The values are
          themselves dictionaries of settings and their values.
      stderr: The stream receiving the error messages.
  """
    _ValidateSettings(_msvs_validators, settings, stderr)


def ValidateMSBuildSettings(settings, stderr=sys.stderr):
    """Validates that the names of the settings are valid for MSBuild.

  Args:
      settings: A dictionary.  The key is the tool name.  The values are
          themselves dictionaries of settings and their values.
      stderr: The stream receiving the error messages.
  """
    _ValidateSettings(_msbuild_validators, settings, stderr)


def _ValidateSettings(validators, settings, stderr):
    """Validates that the settings are valid for MSBuild or MSVS.

  We currently only validate the names of the settings, not their values.

  Args:
      validators: A dictionary of tools and their validators.
      settings: A dictionary.  The key is the tool name.  The values are
          themselves dictionaries of settings and their values.
      stderr: The stream receiving the error messages.
  """
    for tool_name in settings:
        if tool_name in validators:
            tool_validators = validators[tool_name]
            for setting, value in settings[tool_name].items():
                if setting in tool_validators:
                    try:
                        tool_validators[setting](value)
                    except ValueError as e:
                        print(
                            f"Warning: for {tool_name}/{setting}, {e}",
                            file=stderr,
                        )
                else:
                    _ValidateExclusionSetting(
                        setting,
                        tool_validators,
                        (f"Warning: unrecognized setting {tool_name}/{setting}"),
                        stderr,
                    )

        else:
            print("Warning: unrecognized tool %s" % (tool_name), file=stderr)


# MSVS and MBuild names of the tools.
_compile = _Tool("VCCLCompilerTool", "ClCompile")
_link = _Tool("VCLinkerTool", "Link")
_midl = _Tool("VCMIDLTool", "Midl")
_rc = _Tool("VCResourceCompilerTool", "ResourceCompile")
_lib = _Tool("VCLibrarianTool", "Lib")
_manifest = _Tool("VCManifestTool", "Manifest")
_masm = _Tool("MASM", "MASM")
_armasm = _Tool("ARMASM", "ARMASM")


_AddTool(_compile)
_AddTool(_link)
_AddTool(_midl)
_AddTool(_rc)
_AddTool(_lib)
_AddTool(_manifest)
_AddTool(_masm)
_AddTool(_armasm)
# Add sections only found in the MSBuild settings.
_msbuild_validators[""] = {}
_msbuild_validators["ProjectReference"] = {}
_msbuild_validators["ManifestResourceCompile"] = {}

# Descriptions of the compiler options, i.e. VCCLCompilerTool in MSVS and
# ClCompile in MSBuild.
# See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\cl.xml" for
# the schema of the MSBuild ClCompile settings.

# Options that have the same name in MSVS and MSBuild
_Same(_compile, "AdditionalIncludeDirectories", _folder_list)  # /I
_Same(_compile, "AdditionalOptions", _string_list)
_Same(_compile, "AdditionalUsingDirectories", _folder_list)  # /AI
_Same(_compile, "AssemblerListingLocation", _file_name)  # /Fa
_Same(_compile, "BrowseInformationFile", _file_name)
_Same(_compile, "BufferSecurityCheck", _boolean)  # /GS
_Same(_compile, "DisableLanguageExtensions", _boolean)  # /Za
_Same(_compile, "DisableSpecificWarnings", _string_list)  # /wd
_Same(_compile, "EnableFiberSafeOptimizations", _boolean)  # /GT
_Same(_compile, "EnablePREfast", _boolean)  # /analyze Visible='false'
_Same(_compile, "ExpandAttributedSource", _boolean)  # /Fx
_Same(_compile, "FloatingPointExceptions", _boolean)  # /fp:except
_Same(_compile, "ForceConformanceInForLoopScope", _boolean)  # /Zc:forScope
_Same(_compile, "ForcedIncludeFiles", _file_list)  # /FI
_Same(_compile, "ForcedUsingFiles", _file_list)  # /FU
_Same(_compile, "GenerateXMLDocumentationFiles", _boolean)  # /doc
_Same(_compile, "IgnoreStandardIncludePath", _boolean)  # /X
_Same(_compile, "MinimalRebuild", _boolean)  # /Gm
_Same(_compile, "OmitDefaultLibName", _boolean)  # /Zl
_Same(_compile, "OmitFramePointers", _boolean)  # /Oy
_Same(_compile, "PreprocessorDefinitions", _string_list)  # /D
_Same(_compile, "ProgramDataBaseFileName", _file_name)  # /Fd
_Same(_compile, "RuntimeTypeInfo", _boolean)  # /GR
_Same(_compile, "ShowIncludes", _boolean)  # /showIncludes
_Same(_compile, "SmallerTypeCheck", _boolean)  # /RTCc
_Same(_compile, "StringPooling", _boolean)  # /GF
_Same(_compile, "SuppressStartupBanner", _boolean)  # /nologo
_Same(_compile, "TreatWChar_tAsBuiltInType", _boolean)  # /Zc:wchar_t
_Same(_compile, "UndefineAllPreprocessorDefinitions", _boolean)  # /u
_Same(_compile, "UndefinePreprocessorDefinitions", _string_list)  # /U
_Same(_compile, "UseFullPaths", _boolean)  # /FC
_Same(_compile, "WholeProgramOptimization", _boolean)  # /GL
_Same(_compile, "XMLDocumentationFileName", _file_name)
_Same(_compile, "CompileAsWinRT", _boolean)  # /ZW

_Same(
    _compile,
    "AssemblerOutput",
    _Enumeration(
        [
            "NoListing",
            "AssemblyCode",  # /FA
            "All",  # /FAcs
            "AssemblyAndMachineCode",  # /FAc
            "AssemblyAndSourceCode",
        ]
    ),
)  # /FAs
_Same(
    _compile,
    "BasicRuntimeChecks",
    _Enumeration(
        [
            "Default",
            "StackFrameRuntimeCheck",  # /RTCs
            "UninitializedLocalUsageCheck",  # /RTCu
            "EnableFastChecks",
        ]
    ),
)  # /RTC1
_Same(
    _compile, "BrowseInformation", _Enumeration(["false", "true", "true"])  # /FR
)  # /Fr
_Same(
    _compile,
    "CallingConvention",
    _Enumeration(["Cdecl", "FastCall", "StdCall", "VectorCall"]),  # /Gd  # /Gr  # /Gz
)  # /Gv
_Same(
    _compile,
    "CompileAs",
    _Enumeration(["Default", "CompileAsC", "CompileAsCpp"]),  # /TC
)  # /TP
_Same(
    _compile,
    "DebugInformationFormat",
    _Enumeration(
        [
            "",  # Disabled
            "OldStyle",  # /Z7
            None,
            "ProgramDatabase",  # /Zi
            "EditAndContinue",
        ]
    ),
)  # /ZI
_Same(
    _compile,
    "EnableEnhancedInstructionSet",
    _Enumeration(
        [
            "NotSet",
            "StreamingSIMDExtensions",  # /arch:SSE
            "StreamingSIMDExtensions2",  # /arch:SSE2
            "AdvancedVectorExtensions",  # /arch:AVX (vs2012+)
            "NoExtensions",  # /arch:IA32 (vs2012+)
            # This one only exists in the new msbuild format.
            "AdvancedVectorExtensions2",  # /arch:AVX2 (vs2013r2+)
        ]
    ),
)
_Same(
    _compile,
    "ErrorReporting",
    _Enumeration(
        [
            "None",  # /errorReport:none
            "Prompt",  # /errorReport:prompt
            "Queue",
        ],  # /errorReport:queue
        new=["Send"],
    ),
)  # /errorReport:send"
_Same(
    _compile,
    "ExceptionHandling",
    _Enumeration(["false", "Sync", "Async"], new=["SyncCThrow"]),  # /EHsc  # /EHa
)  # /EHs
_Same(
    _compile, "FavorSizeOrSpeed", _Enumeration(["Neither", "Speed", "Size"])  # /Ot
)  # /Os
_Same(
    _compile,
    "FloatingPointModel",
    _Enumeration(["Precise", "Strict", "Fast"]),  # /fp:precise  # /fp:strict
)  # /fp:fast
_Same(
    _compile,
    "InlineFunctionExpansion",
    _Enumeration(
        ["Default", "OnlyExplicitInline", "AnySuitable"],  # /Ob1  # /Ob2
        new=["Disabled"],
    ),
)  # /Ob0
_Same(
    _compile,
    "Optimization",
    _Enumeration(["Disabled", "MinSpace", "MaxSpeed", "Full"]),  # /Od  # /O1  # /O2
)  # /Ox
_Same(
    _compile,
    "RuntimeLibrary",
    _Enumeration(
        [
            "MultiThreaded",  # /MT
            "MultiThreadedDebug",  # /MTd
            "MultiThreadedDLL",  # /MD
            "MultiThreadedDebugDLL",
        ]
    ),
)  # /MDd
_Same(
    _compile,
    "StructMemberAlignment",
    _Enumeration(
        [
            "Default",
            "1Byte",  # /Zp1
            "2Bytes",  # /Zp2
            "4Bytes",  # /Zp4
            "8Bytes",  # /Zp8
            "16Bytes",
        ]
    ),
)  # /Zp16
_Same(
    _compile,
    "WarningLevel",
    _Enumeration(
        [
            "TurnOffAllWarnings",  # /W0
            "Level1",  # /W1
            "Level2",  # /W2
            "Level3",  # /W3
            "Level4",
        ],  # /W4
        new=["EnableAllWarnings"],
    ),
)  # /Wall

# Options found in MSVS that have been renamed in MSBuild.
_Renamed(
    _compile, "EnableFunctionLevelLinking", "FunctionLevelLinking", _boolean
)  # /Gy
_Renamed(_compile, "EnableIntrinsicFunctions", "IntrinsicFunctions", _boolean)  # /Oi
_Renamed(_compile, "KeepComments", "PreprocessKeepComments", _boolean)  # /C
_Renamed(_compile, "ObjectFile", "ObjectFileName", _file_name)  # /Fo
_Renamed(_compile, "OpenMP", "OpenMPSupport", _boolean)  # /openmp
_Renamed(
    _compile, "PrecompiledHeaderThrough", "PrecompiledHeaderFile", _file_name
)  # Used with /Yc and /Yu
_Renamed(
    _compile, "PrecompiledHeaderFile", "PrecompiledHeaderOutputFile", _file_name
)  # /Fp
_Renamed(
    _compile,
    "UsePrecompiledHeader",
    "PrecompiledHeader",
    _Enumeration(
        ["NotUsing", "Create", "Use"]  # VS recognized '' for this value too.  # /Yc
    ),
)  # /Yu
_Renamed(_compile, "WarnAsError", "TreatWarningAsError", _boolean)  # /WX

_ConvertedToAdditionalOption(_compile, "DefaultCharIsUnsigned", "/J")

# MSVS options not found in MSBuild.
_MSVSOnly(_compile, "Detect64BitPortabilityProblems", _boolean)
_MSVSOnly(_compile, "UseUnicodeResponseFiles", _boolean)

# MSBuild options not found in MSVS.
_MSBuildOnly(_compile, "BuildingInIDE", _boolean)
_MSBuildOnly(
    _compile, "CompileAsManaged", _Enumeration([], new=["false", "true"])
)  # /clr
_MSBuildOnly(_compile, "CreateHotpatchableImage", _boolean)  # /hotpatch
_MSBuildOnly(_compile, "MultiProcessorCompilation", _boolean)  # /MP
_MSBuildOnly(_compile, "PreprocessOutputPath", _string)  # /Fi
_MSBuildOnly(_compile, "ProcessorNumber", _integer)  # the number of processors
_MSBuildOnly(_compile, "TrackerLogDirectory", _folder_name)
_MSBuildOnly(_compile, "TreatSpecificWarningsAsErrors", _string_list)  # /we
_MSBuildOnly(_compile, "UseUnicodeForAssemblerListing", _boolean)  # /FAu

# Defines a setting that needs very customized processing
_CustomGeneratePreprocessedFile(_compile, "GeneratePreprocessedFile")


# Directives for converting MSVS VCLinkerTool to MSBuild Link.
# See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\link.xml" for
# the schema of the MSBuild Link settings.

# Options that have the same name in MSVS and MSBuild
_Same(_link, "AdditionalDependencies", _file_list)
_Same(_link, "AdditionalLibraryDirectories", _folder_list)  # /LIBPATH
#  /MANIFESTDEPENDENCY:
_Same(_link, "AdditionalManifestDependencies", _file_list)
_Same(_link, "AdditionalOptions", _string_list)
_Same(_link, "AddModuleNamesToAssembly", _file_list)  # /ASSEMBLYMODULE
_Same(_link, "AllowIsolation", _boolean)  # /ALLOWISOLATION
_Same(_link, "AssemblyLinkResource", _file_list)  # /ASSEMBLYLINKRESOURCE
_Same(_link, "BaseAddress", _string)  # /BASE
_Same(_link, "CLRUnmanagedCodeCheck", _boolean)  # /CLRUNMANAGEDCODECHECK
_Same(_link, "DelayLoadDLLs", _file_list)  # /DELAYLOAD
_Same(_link, "DelaySign", _boolean)  # /DELAYSIGN
_Same(_link, "EmbedManagedResourceFile", _file_list)  # /ASSEMBLYRESOURCE
_Same(_link, "EnableUAC", _boolean)  # /MANIFESTUAC
_Same(_link, "EntryPointSymbol", _string)  # /ENTRY
_Same(_link, "ForceSymbolReferences", _file_list)  # /INCLUDE
_Same(_link, "FunctionOrder", _file_name)  # /ORDER
_Same(_link, "GenerateDebugInformation", _boolean)  # /DEBUG
_Same(_link, "GenerateMapFile", _boolean)  # /MAP
_Same(_link, "HeapCommitSize", _string)
_Same(_link, "HeapReserveSize", _string)  # /HEAP
_Same(_link, "IgnoreAllDefaultLibraries", _boolean)  # /NODEFAULTLIB
_Same(_link, "IgnoreEmbeddedIDL", _boolean)  # /IGNOREIDL
_Same(_link, "ImportLibrary", _file_name)  # /IMPLIB
_Same(_link, "KeyContainer", _file_name)  # /KEYCONTAINER
_Same(_link, "KeyFile", _file_name)  # /KEYFILE
_Same(_link, "ManifestFile", _file_name)  # /ManifestFile
_Same(_link, "MapExports", _boolean)  # /MAPINFO:EXPORTS
_Same(_link, "MapFileName", _file_name)
_Same(_link, "MergedIDLBaseFileName", _file_name)  # /IDLOUT
_Same(_link, "MergeSections", _string)  # /MERGE
_Same(_link, "MidlCommandFile", _file_name)  # /MIDL
_Same(_link, "ModuleDefinitionFile", _file_name)  # /DEF
_Same(_link, "OutputFile", _file_name)  # /OUT
_Same(_link, "PerUserRedirection", _boolean)
_Same(_link, "Profile", _boolean)  # /PROFILE
_Same(_link, "ProfileGuidedDatabase", _file_name)  # /PGD
_Same(_link, "ProgramDatabaseFile", _file_name)  # /PDB
_Same(_link, "RegisterOutput", _boolean)
_Same(_link, "SetChecksum", _boolean)  # /RELEASE
_Same(_link, "StackCommitSize", _string)
_Same(_link, "StackReserveSize", _string)  # /STACK
_Same(_link, "StripPrivateSymbols", _file_name)  # /PDBSTRIPPED
_Same(_link, "SupportUnloadOfDelayLoadedDLL", _boolean)  # /DELAY:UNLOAD
_Same(_link, "SuppressStartupBanner", _boolean)  # /NOLOGO
_Same(_link, "SwapRunFromCD", _boolean)  # /SWAPRUN:CD
_Same(_link, "TurnOffAssemblyGeneration", _boolean)  # /NOASSEMBLY
_Same(_link, "TypeLibraryFile", _file_name)  # /TLBOUT
_Same(_link, "TypeLibraryResourceID", _integer)  # /TLBID
_Same(_link, "UACUIAccess", _boolean)  # /uiAccess='true'
_Same(_link, "Version", _string)  # /VERSION

_Same(_link, "EnableCOMDATFolding", _newly_boolean)  # /OPT:ICF
_Same(_link, "FixedBaseAddress", _newly_boolean)  # /FIXED
_Same(_link, "LargeAddressAware", _newly_boolean)  # /LARGEADDRESSAWARE
_Same(_link, "OptimizeReferences", _newly_boolean)  # /OPT:REF
_Same(_link, "RandomizedBaseAddress", _newly_boolean)  # /DYNAMICBASE
_Same(_link, "TerminalServerAware", _newly_boolean)  # /TSAWARE

_subsystem_enumeration = _Enumeration(
    [
        "NotSet",
        "Console",  # /SUBSYSTEM:CONSOLE
        "Windows",  # /SUBSYSTEM:WINDOWS
        "Native",  # /SUBSYSTEM:NATIVE
        "EFI Application",  # /SUBSYSTEM:EFI_APPLICATION
        "EFI Boot Service Driver",  # /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER
        "EFI ROM",  # /SUBSYSTEM:EFI_ROM
        "EFI Runtime",  # /SUBSYSTEM:EFI_RUNTIME_DRIVER
        "WindowsCE",
    ],  # /SUBSYSTEM:WINDOWSCE
    new=["POSIX"],
)  # /SUBSYSTEM:POSIX

_target_machine_enumeration = _Enumeration(
    [
        "NotSet",
        "MachineX86",  # /MACHINE:X86
        None,
        "MachineARM",  # /MACHINE:ARM
        "MachineEBC",  # /MACHINE:EBC
        "MachineIA64",  # /MACHINE:IA64
        None,
        "MachineMIPS",  # /MACHINE:MIPS
        "MachineMIPS16",  # /MACHINE:MIPS16
        "MachineMIPSFPU",  # /MACHINE:MIPSFPU
        "MachineMIPSFPU16",  # /MACHINE:MIPSFPU16
        None,
        None,
        None,
        "MachineSH4",  # /MACHINE:SH4
        None,
        "MachineTHUMB",  # /MACHINE:THUMB
        "MachineX64",
    ]
)  # /MACHINE:X64

_Same(
    _link, "AssemblyDebug", _Enumeration(["", "true", "false"])  # /ASSEMBLYDEBUG
)  # /ASSEMBLYDEBUG:DISABLE
_Same(
    _link,
    "CLRImageType",
    _Enumeration(
        [
            "Default",
            "ForceIJWImage",  # /CLRIMAGETYPE:IJW
            "ForcePureILImage",  # /Switch="CLRIMAGETYPE:PURE
            "ForceSafeILImage",
        ]
    ),
)  # /Switch="CLRIMAGETYPE:SAFE
_Same(
    _link,
    "CLRThreadAttribute",
    _Enumeration(
        [
            "DefaultThreadingAttribute",  # /CLRTHREADATTRIBUTE:NONE
            "MTAThreadingAttribute",  # /CLRTHREADATTRIBUTE:MTA
            "STAThreadingAttribute",
        ]
    ),
)  # /CLRTHREADATTRIBUTE:STA
_Same(
    _link,
    "DataExecutionPrevention",
    _Enumeration(["", "false", "true"]),  # /NXCOMPAT:NO
)  # /NXCOMPAT
_Same(
    _link,
    "Driver",
    _Enumeration(["NotSet", "Driver", "UpOnly", "WDM"]),  # /Driver  # /DRIVER:UPONLY
)  # /DRIVER:WDM
_Same(
    _link,
    "LinkTimeCodeGeneration",
    _Enumeration(
        [
            "Default",
            "UseLinkTimeCodeGeneration",  # /LTCG
            "PGInstrument",  # /LTCG:PGInstrument
            "PGOptimization",  # /LTCG:PGOptimize
            "PGUpdate",
        ]
    ),
)  # /LTCG:PGUpdate
_Same(
    _link,
    "ShowProgress",
    _Enumeration(
        ["NotSet", "LinkVerbose", "LinkVerboseLib"],  # /VERBOSE  # /VERBOSE:Lib
        new=[
            "LinkVerboseICF",  # /VERBOSE:ICF
            "LinkVerboseREF",  # /VERBOSE:REF
            "LinkVerboseSAFESEH",  # /VERBOSE:SAFESEH
            "LinkVerboseCLR",
        ],
    ),
)  # /VERBOSE:CLR
_Same(_link, "SubSystem", _subsystem_enumeration)
_Same(_link, "TargetMachine", _target_machine_enumeration)
_Same(
    _link,
    "UACExecutionLevel",
    _Enumeration(
        [
            "AsInvoker",  # /level='asInvoker'
            "HighestAvailable",  # /level='highestAvailable'
            "RequireAdministrator",
        ]
    ),
)  # /level='requireAdministrator'
_Same(_link, "MinimumRequiredVersion", _string)
_Same(_link, "TreatLinkerWarningAsErrors", _boolean)  # /WX


# Options found in MSVS that have been renamed in MSBuild.
_Renamed(
    _link,
    "ErrorReporting",
    "LinkErrorReporting",
    _Enumeration(
        [
            "NoErrorReport",  # /ERRORREPORT:NONE
            "PromptImmediately",  # /ERRORREPORT:PROMPT
            "QueueForNextLogin",
        ],  # /ERRORREPORT:QUEUE
        new=["SendErrorReport"],
    ),
)  # /ERRORREPORT:SEND
_Renamed(
    _link, "IgnoreDefaultLibraryNames", "IgnoreSpecificDefaultLibraries", _file_list
)  # /NODEFAULTLIB
_Renamed(_link, "ResourceOnlyDLL", "NoEntryPoint", _boolean)  # /NOENTRY
_Renamed(_link, "SwapRunFromNet", "SwapRunFromNET", _boolean)  # /SWAPRUN:NET

_Moved(_link, "GenerateManifest", "", _boolean)
_Moved(_link, "IgnoreImportLibrary", "", _boolean)
_Moved(_link, "LinkIncremental", "", _newly_boolean)
_Moved(_link, "LinkLibraryDependencies", "ProjectReference", _boolean)
_Moved(_link, "UseLibraryDependencyInputs", "ProjectReference", _boolean)

# MSVS options not found in MSBuild.
_MSVSOnly(_link, "OptimizeForWindows98", _newly_boolean)
_MSVSOnly(_link, "UseUnicodeResponseFiles", _boolean)

# MSBuild options not found in MSVS.
_MSBuildOnly(_link, "BuildingInIDE", _boolean)
_MSBuildOnly(_link, "ImageHasSafeExceptionHandlers", _boolean)  # /SAFESEH
_MSBuildOnly(_link, "LinkDLL", _boolean)  # /DLL Visible='false'
_MSBuildOnly(_link, "LinkStatus", _boolean)  # /LTCG:STATUS
_MSBuildOnly(_link, "PreventDllBinding", _boolean)  # /ALLOWBIND
_MSBuildOnly(_link, "SupportNobindOfDelayLoadedDLL", _boolean)  # /DELAY:NOBIND
_MSBuildOnly(_link, "TrackerLogDirectory", _folder_name)
_MSBuildOnly(_link, "MSDOSStubFileName", _file_name)  # /STUB Visible='false'
_MSBuildOnly(_link, "SectionAlignment", _integer)  # /ALIGN
_MSBuildOnly(_link, "SpecifySectionAttributes", _string)  # /SECTION
_MSBuildOnly(
    _link,
    "ForceFileOutput",
    _Enumeration(
        [],
        new=[
            "Enabled",  # /FORCE
            # /FORCE:MULTIPLE
            "MultiplyDefinedSymbolOnly",
            "UndefinedSymbolOnly",
        ],
    ),
)  # /FORCE:UNRESOLVED
_MSBuildOnly(
    _link,
    "CreateHotPatchableImage",
    _Enumeration(
        [],
        new=[
            "Enabled",  # /FUNCTIONPADMIN
            "X86Image",  # /FUNCTIONPADMIN:5
            "X64Image",  # /FUNCTIONPADMIN:6
            "ItaniumImage",
        ],
    ),
)  # /FUNCTIONPADMIN:16
_MSBuildOnly(
    _link,
    "CLRSupportLastError",
    _Enumeration(
        [],
        new=[
            "Enabled",  # /CLRSupportLastError
            "Disabled",  # /CLRSupportLastError:NO
            # /CLRSupportLastError:SYSTEMDLL
            "SystemDlls",
        ],
    ),
)


# Directives for converting VCResourceCompilerTool to ResourceCompile.
# See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\rc.xml" for
# the schema of the MSBuild ResourceCompile settings.

_Same(_rc, "AdditionalOptions", _string_list)
_Same(_rc, "AdditionalIncludeDirectories", _folder_list)  # /I
_Same(_rc, "Culture", _Integer(msbuild_base=16))
_Same(_rc, "IgnoreStandardIncludePath", _boolean)  # /X
_Same(_rc, "PreprocessorDefinitions", _string_list)  # /D
_Same(_rc, "ResourceOutputFileName", _string)  # /fo
_Same(_rc, "ShowProgress", _boolean)  # /v
# There is no UI in VisualStudio 2008 to set the following properties.
# However they are found in CL and other tools.  Include them here for
# completeness, as they are very likely to have the same usage pattern.
_Same(_rc, "SuppressStartupBanner", _boolean)  # /nologo
_Same(_rc, "UndefinePreprocessorDefinitions", _string_list)  # /u

# MSBuild options not found in MSVS.
_MSBuildOnly(_rc, "NullTerminateStrings", _boolean)  # /n
_MSBuildOnly(_rc, "TrackerLogDirectory", _folder_name)


# Directives for converting VCMIDLTool to Midl.
# See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\midl.xml" for
# the schema of the MSBuild Midl settings.

_Same(_midl, "AdditionalIncludeDirectories", _folder_list)  # /I
_Same(_midl, "AdditionalOptions", _string_list)
_Same(_midl, "CPreprocessOptions", _string)  # /cpp_opt
_Same(_midl, "ErrorCheckAllocations", _boolean)  # /error allocation
_Same(_midl, "ErrorCheckBounds", _boolean)  # /error bounds_check
_Same(_midl, "ErrorCheckEnumRange", _boolean)  # /error enum
_Same(_midl, "ErrorCheckRefPointers", _boolean)  # /error ref
_Same(_midl, "ErrorCheckStubData", _boolean)  # /error stub_data
_Same(_midl, "GenerateStublessProxies", _boolean)  # /Oicf
_Same(_midl, "GenerateTypeLibrary", _boolean)
_Same(_midl, "HeaderFileName", _file_name)  # /h
_Same(_midl, "IgnoreStandardIncludePath", _boolean)  # /no_def_idir
_Same(_midl, "InterfaceIdentifierFileName", _file_name)  # /iid
_Same(_midl, "MkTypLibCompatible", _boolean)  # /mktyplib203
_Same(_midl, "OutputDirectory", _string)  # /out
_Same(_midl, "PreprocessorDefinitions", _string_list)  # /D
_Same(_midl, "ProxyFileName", _file_name)  # /proxy
_Same(_midl, "RedirectOutputAndErrors", _file_name)  # /o
_Same(_midl, "SuppressStartupBanner", _boolean)  # /nologo
_Same(_midl, "TypeLibraryName", _file_name)  # /tlb
_Same(_midl, "UndefinePreprocessorDefinitions", _string_list)  # /U
_Same(_midl, "WarnAsError", _boolean)  # /WX

_Same(
    _midl,
    "DefaultCharType",
    _Enumeration(["Unsigned", "Signed", "Ascii"]),  # /char unsigned  # /char signed
)  # /char ascii7
_Same(
    _midl,
    "TargetEnvironment",
    _Enumeration(
        [
            "NotSet",
            "Win32",  # /env win32
            "Itanium",  # /env ia64
            "X64",  # /env x64
            "ARM64",  # /env arm64
        ]
    ),
)
_Same(
    _midl,
    "EnableErrorChecks",
    _Enumeration(["EnableCustom", "None", "All"]),  # /error none
)  # /error all
_Same(
    _midl,
    "StructMemberAlignment",
    _Enumeration(["NotSet", "1", "2", "4", "8"]),  # Zp1  # Zp2  # Zp4
)  # Zp8
_Same(
    _midl,
    "WarningLevel",
    _Enumeration(["0", "1", "2", "3", "4"]),  # /W0  # /W1  # /W2  # /W3
)  # /W4

_Renamed(_midl, "DLLDataFileName", "DllDataFileName", _file_name)  # /dlldata
_Renamed(_midl, "ValidateParameters", "ValidateAllParameters", _boolean)  # /robust

# MSBuild options not found in MSVS.
_MSBuildOnly(_midl, "ApplicationConfigurationMode", _boolean)  # /app_config
_MSBuildOnly(_midl, "ClientStubFile", _file_name)  # /cstub
_MSBuildOnly(
    _midl, "GenerateClientFiles", _Enumeration([], new=["Stub", "None"])  # /client stub
)  # /client none
_MSBuildOnly(
    _midl, "GenerateServerFiles", _Enumeration([], new=["Stub", "None"])  # /client stub
)  # /client none
_MSBuildOnly(_midl, "LocaleID", _integer)  # /lcid DECIMAL
_MSBuildOnly(_midl, "ServerStubFile", _file_name)  # /sstub
_MSBuildOnly(_midl, "SuppressCompilerWarnings", _boolean)  # /no_warn
_MSBuildOnly(_midl, "TrackerLogDirectory", _folder_name)
_MSBuildOnly(
    _midl, "TypeLibFormat", _Enumeration([], new=["NewFormat", "OldFormat"])  # /newtlb
)  # /oldtlb


# Directives for converting VCLibrarianTool to Lib.
# See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\lib.xml" for
# the schema of the MSBuild Lib settings.

_Same(_lib, "AdditionalDependencies", _file_list)
_Same(_lib, "AdditionalLibraryDirectories", _folder_list)  # /LIBPATH
_Same(_lib, "AdditionalOptions", _string_list)
_Same(_lib, "ExportNamedFunctions", _string_list)  # /EXPORT
_Same(_lib, "ForceSymbolReferences", _string)  # /INCLUDE
_Same(_lib, "IgnoreAllDefaultLibraries", _boolean)  # /NODEFAULTLIB
_Same(_lib, "IgnoreSpecificDefaultLibraries", _file_list)  # /NODEFAULTLIB
_Same(_lib, "ModuleDefinitionFile", _file_name)  # /DEF
_Same(_lib, "OutputFile", _file_name)  # /OUT
_Same(_lib, "SuppressStartupBanner", _boolean)  # /NOLOGO
_Same(_lib, "UseUnicodeResponseFiles", _boolean)
_Same(_lib, "LinkTimeCodeGeneration", _boolean)  # /LTCG
_Same(_lib, "TargetMachine", _target_machine_enumeration)

# TODO(jeanluc) _link defines the same value that gets moved to
# ProjectReference.  We may want to validate that they are consistent.
_Moved(_lib, "LinkLibraryDependencies", "ProjectReference", _boolean)

_MSBuildOnly(_lib, "DisplayLibrary", _string)  # /LIST Visible='false'
_MSBuildOnly(
    _lib,
    "ErrorReporting",
    _Enumeration(
        [],
        new=[
            "PromptImmediately",  # /ERRORREPORT:PROMPT
            "QueueForNextLogin",  # /ERRORREPORT:QUEUE
            "SendErrorReport",  # /ERRORREPORT:SEND
            "NoErrorReport",
        ],
    ),
)  # /ERRORREPORT:NONE
_MSBuildOnly(_lib, "MinimumRequiredVersion", _string)
_MSBuildOnly(_lib, "Name", _file_name)  # /NAME
_MSBuildOnly(_lib, "RemoveObjects", _file_list)  # /REMOVE
_MSBuildOnly(_lib, "SubSystem", _subsystem_enumeration)
_MSBuildOnly(_lib, "TrackerLogDirectory", _folder_name)
_MSBuildOnly(_lib, "TreatLibWarningAsErrors", _boolean)  # /WX
_MSBuildOnly(_lib, "Verbose", _boolean)


# Directives for converting VCManifestTool to Mt.
# See "c:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\1033\mt.xml" for
# the schema of the MSBuild Lib settings.

# Options that have the same name in MSVS and MSBuild
_Same(_manifest, "AdditionalManifestFiles", _file_list)  # /manifest
_Same(_manifest, "AdditionalOptions", _string_list)
_Same(_manifest, "AssemblyIdentity", _string)  # /identity:
_Same(_manifest, "ComponentFileName", _file_name)  # /dll
_Same(_manifest, "GenerateCatalogFiles", _boolean)  # /makecdfs
_Same(_manifest, "InputResourceManifests", _string)  # /inputresource
_Same(_manifest, "OutputManifestFile", _file_name)  # /out
_Same(_manifest, "RegistrarScriptFile", _file_name)  # /rgs
_Same(_manifest, "ReplacementsFile", _file_name)  # /replacements
_Same(_manifest, "SuppressStartupBanner", _boolean)  # /nologo
_Same(_manifest, "TypeLibraryFile", _file_name)  # /tlb:
_Same(_manifest, "UpdateFileHashes", _boolean)  # /hashupdate
_Same(_manifest, "UpdateFileHashesSearchPath", _file_name)
_Same(_manifest, "VerboseOutput", _boolean)  # /verbose

# Options that have moved location.
_MovedAndRenamed(
    _manifest,
    "ManifestResourceFile",
    "ManifestResourceCompile",
    "ResourceOutputFileName",
    _file_name,
)
_Moved(_manifest, "EmbedManifest", "", _boolean)

# MSVS options not found in MSBuild.
_MSVSOnly(_manifest, "DependencyInformationFile", _file_name)
_MSVSOnly(_manifest, "UseFAT32Workaround", _boolean)
_MSVSOnly(_manifest, "UseUnicodeResponseFiles", _boolean)

# MSBuild options not found in MSVS.
_MSBuildOnly(_manifest, "EnableDPIAwareness", _boolean)
_MSBuildOnly(_manifest, "GenerateCategoryTags", _boolean)  # /category
_MSBuildOnly(
    _manifest, "ManifestFromManagedAssembly", _file_name
)  # /managedassemblyname
_MSBuildOnly(_manifest, "OutputResourceManifests", _string)  # /outputresource
_MSBuildOnly(_manifest, "SuppressDependencyElement", _boolean)  # /nodependency
_MSBuildOnly(_manifest, "TrackerLogDirectory", _folder_name)


# Directives for MASM.
# See "$(VCTargetsPath)\BuildCustomizations\masm.xml" for the schema of the
# MSBuild MASM settings.

# Options that have the same name in MSVS and MSBuild.
_Same(_masm, "UseSafeExceptionHandlers", _boolean)  # /safeseh
#!/usr/bin/env python3

# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Unit tests for the MSVSSettings.py file."""

import unittest
import gyp.MSVSSettings as MSVSSettings

from io import StringIO


class TestSequenceFunctions(unittest.TestCase):
    def setUp(self):
        self.stderr = StringIO()

    def _ExpectedWarnings(self, expected):
        """Compares recorded lines to expected warnings."""
        self.stderr.seek(0)
        actual = self.stderr.read().split("\n")
        actual = [line for line in actual if line]
        self.assertEqual(sorted(expected), sorted(actual))

    def testValidateMSVSSettings_tool_names(self):
        """Tests that only MSVS tool names are allowed."""
        MSVSSettings.ValidateMSVSSettings(
            {
                "VCCLCompilerTool": {},
                "VCLinkerTool": {},
                "VCMIDLTool": {},
                "foo": {},
                "VCResourceCompilerTool": {},
                "VCLibrarianTool": {},
                "VCManifestTool": {},
                "ClCompile": {},
            },
            self.stderr,
        )
        self._ExpectedWarnings(
            ["Warning: unrecognized tool foo", "Warning: unrecognized tool ClCompile"]
        )

    def testValidateMSVSSettings_settings(self):
        """Tests that for invalid MSVS settings."""
        MSVSSettings.ValidateMSVSSettings(
            {
                "VCCLCompilerTool": {
                    "AdditionalIncludeDirectories": "folder1;folder2",
                    "AdditionalOptions": ["string1", "string2"],
                    "AdditionalUsingDirectories": "folder1;folder2",
                    "AssemblerListingLocation": "a_file_name",
                    "AssemblerOutput": "0",
                    "BasicRuntimeChecks": "5",
                    "BrowseInformation": "fdkslj",
                    "BrowseInformationFile": "a_file_name",
                    "BufferSecurityCheck": "true",
                    "CallingConvention": "-1",
                    "CompileAs": "1",
                    "DebugInformationFormat": "2",
                    "DefaultCharIsUnsigned": "true",
                    "Detect64BitPortabilityProblems": "true",
                    "DisableLanguageExtensions": "true",
                    "DisableSpecificWarnings": "string1;string2",
                    "EnableEnhancedInstructionSet": "1",
                    "EnableFiberSafeOptimizations": "true",
                    "EnableFunctionLevelLinking": "true",
                    "EnableIntrinsicFunctions": "true",
                    "EnablePREfast": "true",
                    "Enableprefast": "bogus",
                    "ErrorReporting": "1",
                    "ExceptionHandling": "1",
                    "ExpandAttributedSource": "true",
                    "FavorSizeOrSpeed": "1",
                    "FloatingPointExceptions": "true",
                    "FloatingPointModel": "1",
                    "ForceConformanceInForLoopScope": "true",
                    "ForcedIncludeFiles": "file1;file2",
                    "ForcedUsingFiles": "file1;file2",
                    "GeneratePreprocessedFile": "1",
                    "GenerateXMLDocumentationFiles": "true",
                    "IgnoreStandardIncludePath": "true",
                    "InlineFunctionExpansion": "1",
                    "KeepComments": "true",
                    "MinimalRebuild": "true",
                    "ObjectFile": "a_file_name",
                    "OmitDefaultLibName": "true",
                    "OmitFramePointers": "true",
                    "OpenMP": "true",
                    "Optimization": "1",
                    "PrecompiledHeaderFile": "a_file_name",
                    "PrecompiledHeaderThrough": "a_file_name",
                    "PreprocessorDefinitions": "string1;string2",
                    "ProgramDataBaseFileName": "a_file_name",
                    "RuntimeLibrary": "1",
                    "RuntimeTypeInfo": "true",
                    "ShowIncludes": "true",
                    "SmallerTypeCheck": "true",
                    "StringPooling": "true",
                    "StructMemberAlignment": "1",
                    "SuppressStartupBanner": "true",
                    "TreatWChar_tAsBuiltInType": "true",
                    "UndefineAllPreprocessorDefinitions": "true",
                    "UndefinePreprocessorDefinitions": "string1;string2",
                    "UseFullPaths": "true",
                    "UsePrecompiledHeader": "1",
                    "UseUnicodeResponseFiles": "true",
                    "WarnAsError": "true",
                    "WarningLevel": "1",
                    "WholeProgramOptimization": "true",
                    "XMLDocumentationFileName": "a_file_name",
                    "ZZXYZ": "bogus",
                },
                "VCLinkerTool": {
                    "AdditionalDependencies": "file1;file2",
                    "AdditionalDependencies_excluded": "file3",
                    "AdditionalLibraryDirectories": "folder1;folder2",
                    "AdditionalManifestDependencies": "file1;file2",
                    "AdditionalOptions": "a string1",
                    "AddModuleNamesToAssembly": "file1;file2",
                    "AllowIsolation": "true",
                    "AssemblyDebug": "2",
                    "AssemblyLinkResource": "file1;file2",
                    "BaseAddress": "a string1",
                    "CLRImageType": "2",
                    "CLRThreadAttribute": "2",
                    "CLRUnmanagedCodeCheck": "true",
                    "DataExecutionPrevention": "2",
                    "DelayLoadDLLs": "file1;file2",
                    "DelaySign": "true",
                    "Driver": "2",
                    "EmbedManagedResourceFile": "file1;file2",
                    "EnableCOMDATFolding": "2",
                    "EnableUAC": "true",
                    "EntryPointSymbol": "a string1",
                    "ErrorReporting": "2",
                    "FixedBaseAddress": "2",
                    "ForceSymbolReferences": "file1;file2",
                    "FunctionOrder": "a_file_name",
                    "GenerateDebugInformation": "true",
                    "GenerateManifest": "true",
                    "GenerateMapFile": "true",
                    "HeapCommitSize": "a string1",
                    "HeapReserveSize": "a string1",
                    "IgnoreAllDefaultLibraries": "true",
                    "IgnoreDefaultLibraryNames": "file1;file2",
                    "IgnoreEmbeddedIDL": "true",
                    "IgnoreImportLibrary": "true",
                    "ImportLibrary": "a_file_name",
                    "KeyContainer": "a_file_name",
                    "KeyFile": "a_file_name",
                    "LargeAddressAware": "2",
                    "LinkIncremental": "2",
                    "LinkLibraryDependencies": "true",
                    "LinkTimeCodeGeneration": "2",
                    "ManifestFile": "a_file_name",
                    "MapExports": "true",
                    "MapFileName": "a_file_name",
                    "MergedIDLBaseFileName": "a_file_name",
                    "MergeSections": "a string1",
                    "MidlCommandFile": "a_file_name",
                    "ModuleDefinitionFile": "a_file_name",
                    "OptimizeForWindows98": "1",
                    "OptimizeReferences": "2",
                    "OutputFile": "a_file_name",
                    "PerUserRedirection": "true",
                    "Profile": "true",
                    "ProfileGuidedDatabase": "a_file_name",
                    "ProgramDatabaseFile": "a_file_name",
                    "RandomizedBaseAddress": "2",
                    "RegisterOutput": "true",
                    "ResourceOnlyDLL": "true",
                    "SetChecksum": "true",
                    "ShowProgress": "2",
                    "StackCommitSize": "a string1",
                    "StackReserveSize": "a string1",
                    "StripPrivateSymbols": "a_file_name",
                    "SubSystem": "2",
                    "SupportUnloadOfDelayLoadedDLL": "true",
                    "SuppressStartupBanner": "true",
                    "SwapRunFromCD": "true",
                    "SwapRunFromNet": "true",
                    "TargetMachine": "2",
                    "TerminalServerAware": "2",
                    "TurnOffAssemblyGeneration": "true",
                    "TypeLibraryFile": "a_file_name",
                    "TypeLibraryResourceID": "33",
                    "UACExecutionLevel": "2",
                    "UACUIAccess": "true",
                    "UseLibraryDependencyInputs": "true",
                    "UseUnicodeResponseFiles": "true",
                    "Version": "a string1",
                },
                "VCMIDLTool": {
                    "AdditionalIncludeDirectories": "folder1;folder2",
                    "AdditionalOptions": "a string1",
                    "CPreprocessOptions": "a string1",
                    "DefaultCharType": "1",
                    "DLLDataFileName": "a_file_name",
                    "EnableErrorChecks": "1",
                    "ErrorCheckAllocations": "true",
                    "ErrorCheckBounds": "true",
                    "ErrorCheckEnumRange": "true",
                    "ErrorCheckRefPointers": "true",
                    "ErrorCheckStubData": "true",
                    "GenerateStublessProxies": "true",
                    "GenerateTypeLibrary": "true",
                    "HeaderFileName": "a_file_name",
                    "IgnoreStandardIncludePath": "true",
                    "InterfaceIdentifierFileName": "a_file_name",
                    "MkTypLibCompatible": "true",
                    "notgood": "bogus",
                    "OutputDirectory": "a string1",
                    "PreprocessorDefinitions": "string1;string2",
                    "ProxyFileName": "a_file_name",
                    "RedirectOutputAndErrors": "a_file_name",
                    "StructMemberAlignment": "1",
                    "SuppressStartupBanner": "true",
                    "TargetEnvironment": "1",
                    "TypeLibraryName": "a_file_name",
                    "UndefinePreprocessorDefinitions": "string1;string2",
                    "ValidateParameters": "true",
                    "WarnAsError": "true",
                    "WarningLevel": "1",
                },
                "VCResourceCompilerTool": {
                    "AdditionalOptions": "a string1",
                    "AdditionalIncludeDirectories": "folder1;folder2",
                    "Culture": "1003",
                    "IgnoreStandardIncludePath": "true",
                    "notgood2": "bogus",
                    "PreprocessorDefinitions": "string1;string2",
                    "ResourceOutputFileName": "a string1",
                    "ShowProgress": "true",
                    "SuppressStartupBanner": "true",
                    "UndefinePreprocessorDefinitions": "string1;string2",
                },
                "VCLibrarianTool": {
                    "AdditionalDependencies": "file1;file2",
                    "AdditionalLibraryDirectories": "folder1;folder2",
                    "AdditionalOptions": "a string1",
                    "ExportNamedFunctions": "string1;string2",
                    "ForceSymbolReferences": "a string1",
                    "IgnoreAllDefaultLibraries": "true",
                    "IgnoreSpecificDefaultLibraries": "file1;file2",
                    "LinkLibraryDependencies": "true",
                    "ModuleDefinitionFile": "a_file_name",
                    "OutputFile": "a_file_name",
                    "SuppressStartupBanner": "true",
                    "UseUnicodeResponseFiles": "true",
                },
                "VCManifestTool": {
                    "AdditionalManifestFiles": "file1;file2",
                    "AdditionalOptions": "a string1",
                    "AssemblyIdentity": "a string1",
                    "ComponentFileName": "a_file_name",
                    "DependencyInformationFile": "a_file_name",
                    "GenerateCatalogFiles": "true",
                    "InputResourceManifests": "a string1",
                    "ManifestResourceFile": "a_file_name",
                    "OutputManifestFile": "a_file_name",
                    "RegistrarScriptFile": "a_file_name",
                    "ReplacementsFile": "a_file_name",
                    "SuppressStartupBanner": "true",
                    "TypeLibraryFile": "a_file_name",
                    "UpdateFileHashes": "truel",
                    "UpdateFileHashesSearchPath": "a_file_name",
                    "UseFAT32Workaround": "true",
                    "UseUnicodeResponseFiles": "true",
                    "VerboseOutput": "true",
                },
            },
            self.stderr,
        )
        self._ExpectedWarnings(
            [
                "Warning: for VCCLCompilerTool/BasicRuntimeChecks, "
                "index value (5) not in expected range [0, 4)",
                "Warning: for VCCLCompilerTool/BrowseInformation, "
                "invalid literal for int() with base 10: 'fdkslj'",
                "Warning: for VCCLCompilerTool/CallingConvention, "
                "index value (-1) not in expected range [0, 4)",
                "Warning: for VCCLCompilerTool/DebugInformationFormat, "
                "converted value for 2 not specified.",
                "Warning: unrecognized setting VCCLCompilerTool/Enableprefast",
                "Warning: unrecognized setting VCCLCompilerTool/ZZXYZ",
                "Warning: for VCLinkerTool/TargetMachine, "
                "converted value for 2 not specified.",
                "Warning: unrecognized setting VCMIDLTool/notgood",
                "Warning: unrecognized setting VCResourceCompilerTool/notgood2",
                "Warning: for VCManifestTool/UpdateFileHashes, "
                "expected bool; got 'truel'"
                "",
            ]
        )

    def testValidateMSBuildSettings_settings(self):
        """Tests that for invalid MSBuild settings."""
        MSVSSettings.ValidateMSBuildSettings(
            {
                "ClCompile": {
                    "AdditionalIncludeDirectories": "folder1;folder2",
                    "AdditionalOptions": ["string1", "string2"],
                    "AdditionalUsingDirectories": "folder1;folder2",
                    "AssemblerListingLocation": "a_file_name",
                    "AssemblerOutput": "NoListing",
                    "BasicRuntimeChecks": "StackFrameRuntimeCheck",
                    "BrowseInformation": "false",
                    "BrowseInformationFile": "a_file_name",
                    "BufferSecurityCheck": "true",
                    "BuildingInIDE": "true",
                    "CallingConvention": "Cdecl",
                    "CompileAs": "CompileAsC",
                    "CompileAsManaged": "true",
                    "CreateHotpatchableImage": "true",
                    "DebugInformationFormat": "ProgramDatabase",
                    "DisableLanguageExtensions": "true",
                    "DisableSpecificWarnings": "string1;string2",
                    "EnableEnhancedInstructionSet": "StreamingSIMDExtensions",
                    "EnableFiberSafeOptimizations": "true",
                    "EnablePREfast": "true",
                    "Enableprefast": "bogus",
                    "ErrorReporting": "Prompt",
                    "ExceptionHandling": "SyncCThrow",
                    "ExpandAttributedSource": "true",
                    "FavorSizeOrSpeed": "Neither",
                    "FloatingPointExceptions": "true",
                    "FloatingPointModel": "Precise",
                    "ForceConformanceInForLoopScope": "true",
                    "ForcedIncludeFiles": "file1;file2",
                    "ForcedUsingFiles": "file1;file2",
                    "FunctionLevelLinking": "false",
                    "GenerateXMLDocumentationFiles": "true",
                    "IgnoreStandardIncludePath": "true",
                    "InlineFunctionExpansion": "OnlyExplicitInline",
                    "IntrinsicFunctions": "false",
                    "MinimalRebuild": "true",
                    "MultiProcessorCompilation": "true",
                    "ObjectFileName": "a_file_name",
                    "OmitDefaultLibName": "true",
                    "OmitFramePointers": "true",
                    "OpenMPSupport": "true",
                    "Optimization": "Disabled",
                    "PrecompiledHeader": "NotUsing",
                    "PrecompiledHeaderFile": "a_file_name",
                    "PrecompiledHeaderOutputFile": "a_file_name",
                    "PreprocessKeepComments": "true",
                    "PreprocessorDefinitions": "string1;string2",
                    "PreprocessOutputPath": "a string1",
                    "PreprocessSuppressLineNumbers": "false",
                    "PreprocessToFile": "false",
                    "ProcessorNumber": "33",
                    "ProgramDataBaseFileName": "a_file_name",
                    "RuntimeLibrary": "MultiThreaded",
                    "RuntimeTypeInfo": "true",
                    "ShowIncludes": "true",
                    "SmallerTypeCheck": "true",
                    "StringPooling": "true",
                    "StructMemberAlignment": "1Byte",
                    "SuppressStartupBanner": "true",
                    "TrackerLogDirectory": "a_folder",
                    "TreatSpecificWarningsAsErrors": "string1;string2",
                    "TreatWarningAsError": "true",
                    "TreatWChar_tAsBuiltInType": "true",
                    "UndefineAllPreprocessorDefinitions": "true",
                    "UndefinePreprocessorDefinitions": "string1;string2",
                    "UseFullPaths": "true",
                    "UseUnicodeForAssemblerListing": "true",
                    "WarningLevel": "TurnOffAllWarnings",
                    "WholeProgramOptimization": "true",
                    "XMLDocumentationFileName": "a_file_name",
                    "ZZXYZ": "bogus",
                },
                "Link": {
                    "AdditionalDependencies": "file1;file2",
                    "AdditionalLibraryDirectories": "folder1;folder2",
                    "AdditionalManifestDependencies": "file1;file2",
                    "AdditionalOptions": "a string1",
                    "AddModuleNamesToAssembly": "file1;file2",
                    "AllowIsolation": "true",
                    "AssemblyDebug": "",
                    "AssemblyLinkResource": "file1;file2",
                    "BaseAddress": "a string1",
                    "BuildingInIDE": "true",
                    "CLRImageType": "ForceIJWImage",
                    "CLRSupportLastError": "Enabled",
                    "CLRThreadAttribute": "MTAThreadingAttribute",
                    "CLRUnmanagedCodeCheck": "true",
                    "CreateHotPatchableImage": "X86Image",
                    "DataExecutionPrevention": "false",
                    "DelayLoadDLLs": "file1;file2",
                    "DelaySign": "true",
                    "Driver": "NotSet",
                    "EmbedManagedResourceFile": "file1;file2",
                    "EnableCOMDATFolding": "false",
                    "EnableUAC": "true",
                    "EntryPointSymbol": "a string1",
                    "FixedBaseAddress": "false",
                    "ForceFileOutput": "Enabled",
                    "ForceSymbolReferences": "file1;file2",
                    "FunctionOrder": "a_file_name",
                    "GenerateDebugInformation": "true",
                    "GenerateMapFile": "true",
                    "HeapCommitSize": "a string1",
                    "HeapReserveSize": "a string1",
                    "IgnoreAllDefaultLibraries": "true",
                    "IgnoreEmbeddedIDL": "true",
                    "IgnoreSpecificDefaultLibraries": "a_file_list",
                    "ImageHasSafeExceptionHandlers": "true",
                    "ImportLibrary": "a_file_name",
                    "KeyContainer": "a_file_name",
                    "KeyFile": "a_file_name",
                    "LargeAddressAware": "false",
                    "LinkDLL": "true",
                    "LinkErrorReporting": "SendErrorReport",
                    "LinkStatus": "true",
                    "LinkTimeCodeGeneration": "UseLinkTimeCodeGeneration",
                    "ManifestFile": "a_file_name",
                    "MapExports": "true",
                    "MapFileName": "a_file_name",
                    "MergedIDLBaseFileName": "a_file_name",
                    "MergeSections": "a string1",
                    "MidlCommandFile": "a_file_name",
                    "MinimumRequiredVersion": "a string1",
                    "ModuleDefinitionFile": "a_file_name",
                    "MSDOSStubFileName": "a_file_name",
                    "NoEntryPoint": "true",
                    "OptimizeReferences": "false",
                    "OutputFile": "a_file_name",
                    "PerUserRedirection": "true",
                    "PreventDllBinding": "true",
                    "Profile": "true",
                    "ProfileGuidedDatabase": "a_file_name",
                    "ProgramDatabaseFile": "a_file_name",
                    "RandomizedBaseAddress": "false",
                    "RegisterOutput": "true",
                    "SectionAlignment": "33",
                    "SetChecksum": "true",
                    "ShowProgress": "LinkVerboseREF",
                    "SpecifySectionAttributes": "a string1",
                    "StackCommitSize": "a string1",
                    "StackReserveSize": "a string1",
                    "StripPrivateSymbols": "a_file_name",
                    "SubSystem": "Console",
                    "SupportNobindOfDelayLoadedDLL": "true",
                    "SupportUnloadOfDelayLoadedDLL": "true",
                    "SuppressStartupBanner": "true",
                    "SwapRunFromCD": "true",
                    "SwapRunFromNET": "true",
                    "TargetMachine": "MachineX86",
                    "TerminalServerAware": "false",
                    "TrackerLogDirectory": "a_folder",
                    "TreatLinkerWarningAsErrors": "true",
                    "TurnOffAssemblyGeneration": "true",
                    "TypeLibraryFile": "a_file_name",
                    "TypeLibraryResourceID": "33",
                    "UACExecutionLevel": "AsInvoker",
                    "UACUIAccess": "true",
                    "Version": "a string1",
                },
                "ResourceCompile": {
                    "AdditionalIncludeDirectories": "folder1;folder2",
                    "AdditionalOptions": "a string1",
                    "Culture": "0x236",
                    "IgnoreStandardIncludePath": "true",
                    "NullTerminateStrings": "true",
                    "PreprocessorDefinitions": "string1;string2",
                    "ResourceOutputFileName": "a string1",
                    "ShowProgress": "true",
                    "SuppressStartupBanner": "true",
                    "TrackerLogDirectory": "a_folder",
                    "UndefinePreprocessorDefinitions": "string1;string2",
                },
                "Midl": {
                    "AdditionalIncludeDirectories": "folder1;folder2",
                    "AdditionalOptions": "a string1",
                    "ApplicationConfigurationMode": "true",
                    "ClientStubFile": "a_file_name",
                    "CPreprocessOptions": "a string1",
                    "DefaultCharType": "Signed",
                    "DllDataFileName": "a_file_name",
                    "EnableErrorChecks": "EnableCustom",
                    "ErrorCheckAllocations": "true",
                    "ErrorCheckBounds": "true",
                    "ErrorCheckEnumRange": "true",
                    "ErrorCheckRefPointers": "true",
                    "ErrorCheckStubData": "true",
                    "GenerateClientFiles": "Stub",
                    "GenerateServerFiles": "None",
                    "GenerateStublessProxies": "true",
                    "GenerateTypeLibrary": "true",
                    "HeaderFileName": "a_file_name",
                    "IgnoreStandardIncludePath": "true",
                    "InterfaceIdentifierFileName": "a_file_name",
                    "LocaleID": "33",
                    "MkTypLibCompatible": "true",
                    "OutputDirectory": "a string1",
                    "PreprocessorDefinitions": "string1;string2",
                    "ProxyFileName": "a_file_name",
                    "RedirectOutputAndErrors": "a_file_name",
                    "ServerStubFile": "a_file_name",
                    "StructMemberAlignment": "NotSet",
                    "SuppressCompilerWarnings": "true",
                    "SuppressStartupBanner": "true",
                    "TargetEnvironment": "Itanium",
                    "TrackerLogDirectory": "a_folder",
                    "TypeLibFormat": "NewFormat",
                    "TypeLibraryName": "a_file_name",
                    "UndefinePreprocessorDefinitions": "string1;string2",
                    "ValidateAllParameters": "true",
                    "WarnAsError": "true",
                    "WarningLevel": "1",
                },
                "Lib": {
                    "AdditionalDependencies": "file1;file2",
                    "AdditionalLibraryDirectories": "folder1;folder2",
                    "AdditionalOptions": "a string1",
                    "DisplayLibrary": "a string1",
                    "ErrorReporting": "PromptImmediately",
                    "ExportNamedFunctions": "string1;string2",
                    "ForceSymbolReferences": "a string1",
                    "IgnoreAllDefaultLibraries": "true",
                    "IgnoreSpecificDefaultLibraries": "file1;file2",
                    "LinkTimeCodeGeneration": "true",
                    "MinimumRequiredVersion": "a string1",
                    "ModuleDefinitionFile": "a_file_name",
                    "Name": "a_file_name",
                    "OutputFile": "a_file_name",
                    "RemoveObjects": "file1;file2",
                    "SubSystem": "Console",
                    "SuppressStartupBanner": "true",
                    "TargetMachine": "MachineX86i",
                    "TrackerLogDirectory": "a_folder",
                    "TreatLibWarningAsErrors": "true",
                    "UseUnicodeResponseFiles": "true",
                    "Verbose": "true",
                },
                "Manifest": {
                    "AdditionalManifestFiles": "file1;file2",
                    "AdditionalOptions": "a string1",
                    "AssemblyIdentity": "a string1",
                    "ComponentFileName": "a_file_name",
                    "EnableDPIAwareness": "fal",
                    "GenerateCatalogFiles": "truel",
                    "GenerateCategoryTags": "true",
                    "InputResourceManifests": "a string1",
                    "ManifestFromManagedAssembly": "a_file_name",
                    "notgood3": "bogus",
                    "OutputManifestFile": "a_file_name",
                    "OutputResourceManifests": "a string1",
                    "RegistrarScriptFile": "a_file_name",
                    "ReplacementsFile": "a_file_name",
                    "SuppressDependencyElement": "true",
                    "SuppressStartupBanner": "true",
                    "TrackerLogDirectory": "a_folder",
                    "TypeLibraryFile": "a_file_name",
                    "UpdateFileHashes": "true",
                    "UpdateFileHashesSearchPath": "a_file_name",
                    "VerboseOutput": "true",
                },
                "ProjectReference": {
                    "LinkLibraryDependencies": "true",
                    "UseLibraryDependencyInputs": "true",
                },
                "ManifestResourceCompile": {"ResourceOutputFileName": "a_file_name"},
                "": {
                    "EmbedManifest": "true",
                    "GenerateManifest": "true",
                    "IgnoreImportLibrary": "true",
                    "LinkIncremental": "false",
                },
            },
            self.stderr,
        )
        self._ExpectedWarnings(
            [
                "Warning: unrecognized setting ClCompile/Enableprefast",
                "Warning: unrecognized setting ClCompile/ZZXYZ",
                "Warning: unrecognized setting Manifest/notgood3",
                "Warning: for Manifest/GenerateCatalogFiles, "
                "expected bool; got 'truel'",
                "Warning: for Lib/TargetMachine, unrecognized enumerated value "
                "MachineX86i",
                "Warning: for Manifest/EnableDPIAwareness, expected bool; got 'fal'",
            ]
        )

    def testConvertToMSBuildSettings_empty(self):
        """Tests an empty conversion."""
        msvs_settings = {}
        expected_msbuild_settings = {}
        actual_msbuild_settings = MSVSSettings.ConvertToMSBuildSettings(
            msvs_settings, self.stderr
        )
        self.assertEqual(expected_msbuild_settings, actual_msbuild_settings)
        self._ExpectedWarnings([])

    def testConvertToMSBuildSettings_minimal(self):
        """Tests a minimal conversion."""
        msvs_settings = {
            "VCCLCompilerTool": {
                "AdditionalIncludeDirectories": "dir1",
                "AdditionalOptions": "/foo",
                "BasicRuntimeChecks": "0",
            },
            "VCLinkerTool": {
                "LinkTimeCodeGeneration": "1",
                "ErrorReporting": "1",
                "DataExecutionPrevention": "2",
            },
        }
        expected_msbuild_settings = {
            "ClCompile": {
                "AdditionalIncludeDirectories": "dir1",
                "AdditionalOptions": "/foo",
                "BasicRuntimeChecks": "Default",
            },
            "Link": {
                "LinkTimeCodeGeneration": "UseLinkTimeCodeGeneration",
                "LinkErrorReporting": "PromptImmediately",
                "DataExecutionPrevention": "true",
            },
        }
        actual_msbuild_settings = MSVSSettings.ConvertToMSBuildSettings(
            msvs_settings, self.stderr
        )
        self.assertEqual(expected_msbuild_settings, actual_msbuild_settings)
        self._ExpectedWarnings([])

    def testConvertToMSBuildSettings_warnings(self):
        """Tests conversion that generates warnings."""
        msvs_settings = {
            "VCCLCompilerTool": {
                "AdditionalIncludeDirectories": "1",
                "AdditionalOptions": "2",
                # These are incorrect values:
                "BasicRuntimeChecks": "12",
                "BrowseInformation": "21",
                "UsePrecompiledHeader": "13",
                "GeneratePreprocessedFile": "14",
            },
            "VCLinkerTool": {
                # These are incorrect values:
                "Driver": "10",
                "LinkTimeCodeGeneration": "31",
                "ErrorReporting": "21",
                "FixedBaseAddress": "6",
            },
            "VCResourceCompilerTool": {
                # Custom
                "Culture": "1003"
            },
        }
        expected_msbuild_settings = {
            "ClCompile": {
                "AdditionalIncludeDirectories": "1",
                "AdditionalOptions": "2",
            },
            "Link": {},
            "ResourceCompile": {
                # Custom
                "Culture": "0x03eb"
            },
        }
        actual_msbuild_settings = MSVSSettings.ConvertToMSBuildSettings(
            msvs_settings, self.stderr
        )
        self.assertEqual(expected_msbuild_settings, actual_msbuild_settings)
        self._ExpectedWarnings(
            [
                "Warning: while converting VCCLCompilerTool/BasicRuntimeChecks to "
                "MSBuild, index value (12) not in expected range [0, 4)",
                "Warning: while converting VCCLCompilerTool/BrowseInformation to "
                "MSBuild, index value (21) not in expected range [0, 3)",
                "Warning: while converting VCCLCompilerTool/UsePrecompiledHeader to "
                "MSBuild, index value (13) not in expected range [0, 3)",
                "Warning: while converting "
                "VCCLCompilerTool/GeneratePreprocessedFile to "
                "MSBuild, value must be one of [0, 1, 2]; got 14",
                "Warning: while converting VCLinkerTool/Driver to "
                "MSBuild, index value (10) not in expected range [0, 4)",
                "Warning: while converting VCLinkerTool/LinkTimeCodeGeneration to "
                "MSBuild, index value (31) not in expected range [0, 5)",
                "Warning: while converting VCLinkerTool/ErrorReporting to "
                "MSBuild, index value (21) not in expected range [0, 3)",
                "Warning: while converting VCLinkerTool/FixedBaseAddress to "
                "MSBuild, index value (6) not in expected range [0, 3)",
            ]
        )

    def testConvertToMSBuildSettings_full_synthetic(self):
        """Tests conversion of all the MSBuild settings."""
        msvs_settings = {
            "VCCLCompilerTool": {
                "AdditionalIncludeDirectories": "folder1;folder2;folder3",
                "AdditionalOptions": "a_string",
                "AdditionalUsingDirectories": "folder1;folder2;folder3",
                "AssemblerListingLocation": "a_file_name",
                "AssemblerOutput": "0",
                "BasicRuntimeChecks": "1",
                "BrowseInformation": "2",
                "BrowseInformationFile": "a_file_name",
                "BufferSecurityCheck": "true",
                "CallingConvention": "0",
                "CompileAs": "1",
                "DebugInformationFormat": "4",
                "DefaultCharIsUnsigned": "true",
                "Detect64BitPortabilityProblems": "true",
                "DisableLanguageExtensions": "true",
                "DisableSpecificWarnings": "d1;d2;d3",
                "EnableEnhancedInstructionSet": "0",
                "EnableFiberSafeOptimizations": "true",
                "EnableFunctionLevelLinking": "true",
                "EnableIntrinsicFunctions": "true",
                "EnablePREfast": "true",
                "ErrorReporting": "1",
                "ExceptionHandling": "2",
                "ExpandAttributedSource": "true",
                "FavorSizeOrSpeed": "0",
                "FloatingPointExceptions": "true",
                "FloatingPointModel": "1",
                "ForceConformanceInForLoopScope": "true",
                "ForcedIncludeFiles": "file1;file2;file3",
                "ForcedUsingFiles": "file1;file2;file3",
                "GeneratePreprocessedFile": "1",
                "GenerateXMLDocumentationFiles": "true",
                "IgnoreStandardIncludePath": "true",
                "InlineFunctionExpansion": "2",
                "KeepComments": "true",
                "MinimalRebuild": "true",
                "ObjectFile": "a_file_name",
                "OmitDefaultLibName": "true",
                "OmitFramePointers": "true",
                "OpenMP": "true",
                "Optimization": "3",
                "PrecompiledHeaderFile": "a_file_name",
                "PrecompiledHeaderThrough": "a_file_name",
                "PreprocessorDefinitions": "d1;d2;d3",
                "ProgramDataBaseFileName": "a_file_name",
                "RuntimeLibrary": "0",
                "RuntimeTypeInfo": "true",
                "ShowIncludes": "true",
                "SmallerTypeCheck": "true",
                "StringPooling": "true",
                "StructMemberAlignment": "1",
                "SuppressStartupBanner": "true",
                "TreatWChar_tAsBuiltInType": "true",
                "UndefineAllPreprocessorDefinitions": "true",
                "UndefinePreprocessorDefinitions": "d1;d2;d3",
                "UseFullPaths": "true",
                "UsePrecompiledHeader": "1",
                "UseUnicodeResponseFiles": "true",
                "WarnAsError": "true",
                "WarningLevel": "2",
                "WholeProgramOptimization": "true",
                "XMLDocumentationFileName": "a_file_name",
            },
            "VCLinkerTool": {
                "AdditionalDependencies": "file1;file2;file3",
                "AdditionalLibraryDirectories": "folder1;folder2;folder3",
                "AdditionalLibraryDirectories_excluded": "folder1;folder2;folder3",
                "AdditionalManifestDependencies": "file1;file2;file3",
                "AdditionalOptions": "a_string",
                "AddModuleNamesToAssembly": "file1;file2;file3",
                "AllowIsolation": "true",
                "AssemblyDebug": "0",
                "AssemblyLinkResource": "file1;file2;file3",
                "BaseAddress": "a_string",
                "CLRImageType": "1",
                "CLRThreadAttribute": "2",
                "CLRUnmanagedCodeCheck": "true",
                "DataExecutionPrevention": "0",
                "DelayLoadDLLs": "file1;file2;file3",
                "DelaySign": "true",
                "Driver": "1",
                "EmbedManagedResourceFile": "file1;file2;file3",
                "EnableCOMDATFolding": "0",
                "EnableUAC": "true",
                "EntryPointSymbol": "a_string",
                "ErrorReporting": "0",
                "FixedBaseAddress": "1",
                "ForceSymbolReferences": "file1;file2;file3",
                "FunctionOrder": "a_file_name",
                "GenerateDebugInformation": "true",
                "GenerateManifest": "true",
                "GenerateMapFile": "true",
                "HeapCommitSize": "a_string",
                "HeapReserveSize": "a_string",
                "IgnoreAllDefaultLibraries": "true",
                "IgnoreDefaultLibraryNames": "file1;file2;file3",
                "IgnoreEmbeddedIDL": "true",
                "IgnoreImportLibrary": "true",
                "ImportLibrary": "a_file_name",
                "KeyContainer": "a_file_name",
                "KeyFile": "a_file_name",
                "LargeAddressAware": "2",
                "LinkIncremental": "1",
                "LinkLibraryDependencies": "true",
                "LinkTimeCodeGeneration": "2",
                "ManifestFile": "a_file_name",
                "MapExports": "true",
                "MapFileName": "a_file_name",
                "MergedIDLBaseFileName": "a_file_name",
                "MergeSections": "a_string",
                "MidlCommandFile": "a_file_name",
                "ModuleDefinitionFile": "a_file_name",
                "OptimizeForWindows98": "1",
                "OptimizeReferences": "0",
                "OutputFile": "a_file_name",
                "PerUserRedirection": "true",
                "Profile": "true",
                "ProfileGuidedDatabase": "a_file_name",
                "ProgramDatabaseFile": "a_file_name",
                "RandomizedBaseAddress": "1",
                "RegisterOutput": "true",
                "ResourceOnlyDLL": "true",
                "SetChecksum": "true",
                "ShowProgress": "0",
                "StackCommitSize": "a_string",
                "StackReserveSize": "a_string",
                "StripPrivateSymbols": "a_file_name",
                "SubSystem": "2",
                "SupportUnloadOfDelayLoadedDLL": "true",
                "SuppressStartupBanner": "true",
                "SwapRunFromCD": "true",
                "SwapRunFromNet": "true",
                "TargetMachine": "3",
                "TerminalServerAware": "2",
                "TurnOffAssemblyGeneration": "true",
                "TypeLibraryFile": "a_file_name",
                "TypeLibraryResourceID": "33",
                "UACExecutionLevel": "1",
                "UACUIAccess": "true",
                "UseLibraryDependencyInputs": "false",
                "UseUnicodeResponseFiles": "true",
                "Version": "a_string",
            },
            "VCResourceCompilerTool": {
                "AdditionalIncludeDirectories": "folder1;folder2;folder3",
                "AdditionalOptions": "a_string",
                "Culture": "1003",
                "IgnoreStandardIncludePath": "true",
                "PreprocessorDefinitions": "d1;d2;d3",
                "ResourceOutputFileName": "a_string",
                "ShowProgress": "true",
                "SuppressStartupBanner": "true",
                "UndefinePreprocessorDefinitions": "d1;d2;d3",
            },
            "VCMIDLTool": {
                "AdditionalIncludeDirectories": "folder1;folder2;folder3",
                "AdditionalOptions": "a_string",
                "CPreprocessOptions": "a_string",
                "DefaultCharType": "0",
                "DLLDataFileName": "a_file_name",
                "EnableErrorChecks": "2",
                "ErrorCheckAllocations": "true",
                "ErrorCheckBounds": "true",
                "ErrorCheckEnumRange": "true",
                "ErrorCheckRefPointers": "true",
                "ErrorCheckStubData": "true",
                "GenerateStublessProxies": "true",
                "GenerateTypeLibrary": "true",
                "HeaderFileName": "a_file_name",
                "IgnoreStandardIncludePath": "true",
                "InterfaceIdentifierFileName": "a_file_name",
                "MkTypLibCompatible": "true",
                "OutputDirectory": "a_string",
                "PreprocessorDefinitions": "d1;d2;d3",
                "ProxyFileName": "a_file_name",
                "RedirectOutputAndErrors": "a_file_name",
                "StructMemberAlignment": "3",
                "SuppressStartupBanner": "true",
                "TargetEnvironment": "1",
                "TypeLibraryName": "a_file_name",
                "UndefinePreprocessorDefinitions": "d1;d2;d3",
                "ValidateParameters": "true",
                "WarnAsError": "true",
                "WarningLevel": "4",
            },
            "VCLibrarianTool": {
                "AdditionalDependencies": "file1;file2;file3",
                "AdditionalLibraryDirectories": "folder1;folder2;folder3",
                "AdditionalLibraryDirectories_excluded": "folder1;folder2;folder3",
                "AdditionalOptions": "a_string",
                "ExportNamedFunctions": "d1;d2;d3",
                "ForceSymbolReferences": "a_string",
                "IgnoreAllDefaultLibraries": "true",
                "IgnoreSpecificDefaultLibraries": "file1;file2;file3",
                "LinkLibraryDependencies": "true",
                "ModuleDefinitionFile": "a_file_name",
                "OutputFile": "a_file_name",
                "SuppressStartupBanner": "true",
                "UseUnicodeResponseFiles": "true",
            },
            "VCManifestTool": {
                "AdditionalManifestFiles": "file1;file2;file3",
                "AdditionalOptions": "a_string",
                "AssemblyIdentity": "a_string",
                "ComponentFileName": "a_file_name",
                "DependencyInformationFile": "a_file_name",
                "EmbedManifest": "true",
                "GenerateCatalogFiles": "true",
                "InputResourceManifests": "a_string",
                "ManifestResourceFile": "my_name",
                "OutputManifestFile": "a_file_name",
                "RegistrarScriptFile": "a_file_name",
                "ReplacementsFile": "a_file_name",
                "SuppressStartupBanner": "true",
                "TypeLibraryFile": "a_file_name",
                "UpdateFileHashes": "true",
                "UpdateFileHashesSearchPath": "a_file_name",
                "UseFAT32Workaround": "true",
                "UseUnicodeResponseFiles": "true",
                "VerboseOutput": "true",
            },
        }
        expected_msbuild_settings = {
            "ClCompile": {
                "AdditionalIncludeDirectories": "folder1;folder2;folder3",
                "AdditionalOptions": "a_string /J",
                "AdditionalUsingDirectories": "folder1;folder2;folder3",
                "AssemblerListingLocation": "a_file_name",
                "AssemblerOutput": "NoListing",
                "BasicRuntimeChecks": "StackFrameRuntimeCheck",
                "BrowseInformation": "true",
                "BrowseInformationFile": "a_file_name",
                "BufferSecurityCheck": "true",
                "CallingConvention": "Cdecl",
                "CompileAs": "CompileAsC",
                "DebugInformationFormat": "EditAndContinue",
                "DisableLanguageExtensions": "true",
                "DisableSpecificWarnings": "d1;d2;d3",
                "EnableEnhancedInstructionSet": "NotSet",
                "EnableFiberSafeOptimizations": "true",
                "EnablePREfast": "true",
                "ErrorReporting": "Prompt",
                "ExceptionHandling": "Async",
                "ExpandAttributedSource": "true",
                "FavorSizeOrSpeed": "Neither",
                "FloatingPointExceptions": "true",
                "FloatingPointModel": "Strict",
                "ForceConformanceInForLoopScope": "true",
                "ForcedIncludeFiles": "file1;file2;file3",
                "ForcedUsingFiles": "file1;file2;file3",
                "FunctionLevelLinking": "true",
                "GenerateXMLDocumentationFiles": "true",
                "IgnoreStandardIncludePath": "true",
                "InlineFunctionExpansion": "AnySuitable",
                "IntrinsicFunctions": "true",
                "MinimalRebuild": "true",
                "ObjectFileName": "a_file_name",
                "OmitDefaultLibName": "true",
                "OmitFramePointers": "true",
                "OpenMPSupport": "true",
                "Optimization": "Full",
                "PrecompiledHeader": "Create",
                "PrecompiledHeaderFile": "a_file_name",
                "PrecompiledHeaderOutputFile": "a_file_name",
                "PreprocessKeepComments": "true",
                "PreprocessorDefinitions": "d1;d2;d3",
                "PreprocessSuppressLineNumbers": "false",
                "PreprocessToFile": "true",
                "ProgramDataBaseFileName": "a_file_name",
                "RuntimeLibrary": "MultiThreaded",
                "RuntimeTypeInfo": "true",
                "ShowIncludes": "true",
                "SmallerTypeCheck": "true",
                "StringPooling": "true",
                "StructMemberAlignment": "1Byte",
                "SuppressStartupBanner": "true",
                "TreatWarningAsError": "true",
                "TreatWChar_tAsBuiltInType": "true",
                "UndefineAllPreprocessorDefinitions": "true",
                "UndefinePreprocessorDefinitions": "d1;d2;d3",
                "UseFullPaths": "true",
                "WarningLevel": "Level2",
                "WholeProgramOptimization": "true",
                "XMLDocumentationFileName": "a_file_name",
            },
            "Link": {
                "AdditionalDependencies": "file1;file2;file3",
                "AdditionalLibraryDirectories": "folder1;folder2;folder3",
                "AdditionalManifestDependencies": "file1;file2;file3",
                "AdditionalOptions": "a_string",
                "AddModuleNamesToAssembly": "file1;file2;file3",
                "AllowIsolation": "true",
                "AssemblyDebug": "",
                "AssemblyLinkResource": "file1;file2;file3",
                "BaseAddress": "a_string",
                "CLRImageType": "ForceIJWImage",
                "CLRThreadAttribute": "STAThreadingAttribute",
                "CLRUnmanagedCodeCheck": "true",
                "DataExecutionPrevention": "",
                "DelayLoadDLLs": "file1;file2;file3",
                "DelaySign": "true",
                "Driver": "Driver",
                "EmbedManagedResourceFile": "file1;file2;file3",
                "EnableCOMDATFolding": "",
                "EnableUAC": "true",
                "EntryPointSymbol": "a_string",
                "FixedBaseAddress": "false",
                "ForceSymbolReferences": "file1;file2;file3",
                "FunctionOrder": "a_file_name",
                "GenerateDebugInformation": "true",
                "GenerateMapFile": "true",
                "HeapCommitSize": "a_string",
                "HeapReserveSize": "a_string",
                "IgnoreAllDefaultLibraries": "true",
                "IgnoreEmbeddedIDL": "true",
                "IgnoreSpecificDefaultLibraries": "file1;file2;file3",
                "ImportLibrary": "a_file_name",
                "KeyContainer": "a_file_name",
                "KeyFile": "a_file_name",
                "LargeAddressAware": "true",
                "LinkErrorReporting": "NoErrorReport",
                "LinkTimeCodeGeneration": "PGInstrument",
                "ManifestFile": "a_file_name",
                "MapExports": "true",
                "MapFileName": "a_file_name",
                "MergedIDLBaseFileName": "a_file_name",
                "MergeSections": "a_string",
                "MidlCommandFile": "a_file_name",
                "ModuleDefinitionFile": "a_file_name",
                "NoEntryPoint": "true",
                "OptimizeReferences": "",
                "OutputFile": "a_file_name",
                "PerUserRedirection": "true",
                "Profile": "true",
                "ProfileGuidedDatabase": "a_file_name",
                "ProgramDatabaseFile": "a_file_name",
                "RandomizedBaseAddress": "false",
                "RegisterOutput": "true",
                "SetChecksum": "true",
                "ShowProgress": "NotSet",
                "StackCommitSize": "a_string",
                "StackReserveSize": "a_string",
                "StripPrivateSymbols": "a_file_name",
                "SubSystem": "Windows",
                "SupportUnloadOfDelayLoadedDLL": "true",
                "SuppressStartupBanner": "true",
                "SwapRunFromCD": "true",
                "SwapRunFromNET": "true",
                "TargetMachine": "MachineARM",
                "TerminalServerAware": "true",
                "TurnOffAssemblyGeneration": "true",
                "TypeLibraryFile": "a_file_name",
                "TypeLibraryResourceID": "33",
                "UACExecutionLevel": "HighestAvailable",
                "UACUIAccess": "true",
                "Version": "a_string",
            },
            "ResourceCompile": {
                "AdditionalIncludeDirectories": "folder1;folder2;folder3",
                "AdditionalOptions": "a_string",
                "Culture": "0x03eb",
                "IgnoreStandardIncludePath": "true",
                "PreprocessorDefinitions": "d1;d2;d3",
                "ResourceOutputFileName": "a_string",
                "ShowProgress": "true",
                "SuppressStartupBanner": "true",
                "UndefinePreprocessorDefinitions": "d1;d2;d3",
            },
            "Midl": {
                "AdditionalIncludeDirectories": "folder1;folder2;folder3",
                "AdditionalOptions": "a_string",
                "CPreprocessOptions": "a_string",
                "DefaultCharType": "Unsigned",
                "DllDataFileName": "a_file_name",
                "EnableErrorChecks": "All",
                "ErrorCheckAllocations": "true",
                "ErrorCheckBounds": "true",
                "ErrorCheckEnumRange": "true",
                "ErrorCheckRefPointers": "true",
                "ErrorCheckStubData": "true",
                "GenerateStublessProxies": "true",
                "GenerateTypeLibrary": "true",
                "HeaderFileName": "a_file_name",
                "IgnoreStandardIncludePath": "true",
                "InterfaceIdentifierFileName": "a_file_name",
                "MkTypLibCompatible": "true",
                "OutputDirectory": "a_string",
                "PreprocessorDefinitions": "d1;d2;d3",
                "ProxyFileName": "a_file_name",
                "RedirectOutputAndErrors": "a_file_name",
                "StructMemberAlignment": "4",
                "SuppressStartupBanner": "true",
                "TargetEnvironment": "Win32",
                "TypeLibraryName": "a_file_name",
                "UndefinePreprocessorDefinitions": "d1;d2;d3",
                "ValidateAllParameters": "true",
                "WarnAsError": "true",
                "WarningLevel": "4",
            },
            "Lib": {
                "AdditionalDependencies": "file1;file2;file3",
                "AdditionalLibraryDirectories": "folder1;folder2;folder3",
                "AdditionalOptions": "a_string",
                "ExportNamedFunctions": "d1;d2;d3",
                "ForceSymbolReferences": "a_string",
                "IgnoreAllDefaultLibraries": "true",
                "IgnoreSpecificDefaultLibraries": "file1;file2;file3",
                "ModuleDefinitionFile": "a_file_name",
                "OutputFile": "a_file_name",
                "SuppressStartupBanner": "true",
                "UseUnicodeResponseFiles": "true",
            },
            "Manifest": {
                "AdditionalManifestFiles": "file1;file2;file3",
                "AdditionalOptions": "a_string",
                "AssemblyIdentity": "a_string",
                "ComponentFileName": "a_file_name",
                "GenerateCatalogFiles": "true",
                "InputResourceManifests": "a_string",
                "OutputManifestFile": "a_file_name",
                "RegistrarScriptFile": "a_file_name",
                "ReplacementsFile": "a_file_name",
                "SuppressStartupBanner": "true",
                "TypeLibraryFile": "a_file_name",
                "UpdateFileHashes": "true",
                "UpdateFileHashesSearchPath": "a_file_name",
                "VerboseOutput": "true",
            },
            "ManifestResourceCompile": {"ResourceOutputFileName": "my_name"},
            "ProjectReference": {
                "LinkLibraryDependencies": "true",
                "UseLibraryDependencyInputs": "false",
            },
            "": {
                "EmbedManifest": "true",
                "GenerateManifest": "true",
                "IgnoreImportLibrary": "true",
                "LinkIncremental": "false",
            },
        }
        self.maxDiff = 9999  # on failure display a long diff
        actual_msbuild_settings = MSVSSettings.ConvertToMSBuildSettings(
            msvs_settings, self.stderr
        )
        self.assertEqual(expected_msbuild_settings, actual_msbuild_settings)
        self._ExpectedWarnings([])

    def testConvertToMSBuildSettings_actual(self):
        """Tests the conversion of an actual project.

    A VS2008 project with most of the options defined was created through the
    VS2008 IDE.  It was then converted to VS2010.  The tool settings found in
    the .vcproj and .vcxproj files were converted to the two dictionaries
    msvs_settings and expected_msbuild_settings.

    Note that for many settings, the VS2010 converter adds macros like
    %(AdditionalIncludeDirectories) to make sure than inherited values are
    included.  Since the Gyp projects we generate do not use inheritance,
    we removed these macros.  They were:
        ClCompile:
            AdditionalIncludeDirectories:  ';%(AdditionalIncludeDirectories)'
            AdditionalOptions:  ' %(AdditionalOptions)'
            AdditionalUsingDirectories:  ';%(AdditionalUsingDirectories)'
            DisableSpecificWarnings: ';%(DisableSpecificWarnings)',
            ForcedIncludeFiles:  ';%(ForcedIncludeFiles)',
            ForcedUsingFiles:  ';%(ForcedUsingFiles)',
            PreprocessorDefinitions:  ';%(PreprocessorDefinitions)',
            UndefinePreprocessorDefinitions:
                ';%(UndefinePreprocessorDefinitions)',
        Link:
            AdditionalDependencies:  ';%(AdditionalDependencies)',
            AdditionalLibraryDirectories:  ';%(AdditionalLibraryDirectories)',
            AdditionalManifestDependencies:
                ';%(AdditionalManifestDependencies)',
            AdditionalOptions:  ' %(AdditionalOptions)',
            AddModuleNamesToAssembly:  ';%(AddModuleNamesToAssembly)',
            AssemblyLinkResource:  ';%(AssemblyLinkResource)',
            DelayLoadDLLs:  ';%(DelayLoadDLLs)',
            EmbedManagedResourceFile:  ';%(EmbedManagedResourceFile)',
            ForceSymbolReferences:  ';%(ForceSymbolReferences)',
            IgnoreSpecificDefaultLibraries:
                ';%(IgnoreSpecificDefaultLibraries)',
        ResourceCompile:
            AdditionalIncludeDirectories:  ';%(AdditionalIncludeDirectories)',
            AdditionalOptions:  ' %(AdditionalOptions)',
            PreprocessorDefinitions:  ';%(PreprocessorDefinitions)',
        Manifest:
            AdditionalManifestFiles:  ';%(AdditionalManifestFiles)',
            AdditionalOptions:  ' %(AdditionalOptions)',
            InputResourceManifests:  ';%(InputResourceManifests)',
    """
        msvs_settings = {
            "VCCLCompilerTool": {
                "AdditionalIncludeDirectories": "dir1",
                "AdditionalOptions": "/more",
                "AdditionalUsingDirectories": "test",
                "AssemblerListingLocation": "$(IntDir)\\a",
                "AssemblerOutput": "1",
                "BasicRuntimeChecks": "3",
                "BrowseInformation": "1",
                "BrowseInformationFile": "$(IntDir)\\e",
                "BufferSecurityCheck": "false",
                "CallingConvention": "1",
                "CompileAs": "1",
                "DebugInformationFormat": "4",
                "DefaultCharIsUnsigned": "true",
                "Detect64BitPortabilityProblems": "true",
                "DisableLanguageExtensions": "true",
                "DisableSpecificWarnings": "abc",
                "EnableEnhancedInstructionSet": "1",
                "EnableFiberSafeOptimizations": "true",
                "EnableFunctionLevelLinking": "true",
                "EnableIntrinsicFunctions": "true",
                "EnablePREfast": "true",
                "ErrorReporting": "2",
                "ExceptionHandling": "2",
                "ExpandAttributedSource": "true",
                "FavorSizeOrSpeed": "2",
                "FloatingPointExceptions": "true",
                "FloatingPointModel": "1",
                "ForceConformanceInForLoopScope": "false",
                "ForcedIncludeFiles": "def",
                "ForcedUsingFiles": "ge",
                "GeneratePreprocessedFile": "2",
                "GenerateXMLDocumentationFiles": "true",
                "IgnoreStandardIncludePath": "true",
                "InlineFunctionExpansion": "1",
                "KeepComments": "true",
                "MinimalRebuild": "true",
                "ObjectFile": "$(IntDir)\\b",
                "OmitDefaultLibName": "true",
                "OmitFramePointers": "true",
                "OpenMP": "true",
                "Optimization": "3",
                "PrecompiledHeaderFile": "$(IntDir)\\$(TargetName).pche",
                "PrecompiledHeaderThrough": "StdAfx.hd",
                "PreprocessorDefinitions": "WIN32;_DEBUG;_CONSOLE",
                "ProgramDataBaseFileName": "$(IntDir)\\vc90b.pdb",
                "RuntimeLibrary": "3",
                "RuntimeTypeInfo": "false",
                "ShowIncludes": "true",
                "SmallerTypeCheck": "true",
                "StringPooling": "true",
                "StructMemberAlignment": "3",
                "SuppressStartupBanner": "false",
                "TreatWChar_tAsBuiltInType": "false",
                "UndefineAllPreprocessorDefinitions": "true",
                "UndefinePreprocessorDefinitions": "wer",
                "UseFullPaths": "true",
                "UsePrecompiledHeader": "0",
                "UseUnicodeResponseFiles": "false",
                "WarnAsError": "true",
                "WarningLevel": "3",
                "WholeProgramOptimization": "true",
                "XMLDocumentationFileName": "$(IntDir)\\c",
            },
            "VCLinkerTool": {
                "AdditionalDependencies": "zx",
                "AdditionalLibraryDirectories": "asd",
                "AdditionalManifestDependencies": "s2",
                "AdditionalOptions": "/mor2",
                "AddModuleNamesToAssembly": "d1",
                "AllowIsolation": "false",
                "AssemblyDebug": "1",
                "AssemblyLinkResource": "d5",
                "BaseAddress": "23423",
                "CLRImageType": "3",
                "CLRThreadAttribute": "1",
                "CLRUnmanagedCodeCheck": "true",
                "DataExecutionPrevention": "0",
                "DelayLoadDLLs": "d4",
                "DelaySign": "true",
                "Driver": "2",
                "EmbedManagedResourceFile": "d2",
                "EnableCOMDATFolding": "1",
                "EnableUAC": "false",
                "EntryPointSymbol": "f5",
                "ErrorReporting": "2",
                "FixedBaseAddress": "1",
                "ForceSymbolReferences": "d3",
                "FunctionOrder": "fssdfsd",
                "GenerateDebugInformation": "true",
                "GenerateManifest": "false",
                "GenerateMapFile": "true",
                "HeapCommitSize": "13",
                "HeapReserveSize": "12",
                "IgnoreAllDefaultLibraries": "true",
                "IgnoreDefaultLibraryNames": "flob;flok",
                "IgnoreEmbeddedIDL": "true",
                "IgnoreImportLibrary": "true",
                "ImportLibrary": "f4",
                "KeyContainer": "f7",
                "KeyFile": "f6",
                "LargeAddressAware": "2",
                "LinkIncremental": "0",
                "LinkLibraryDependencies": "false",
                "LinkTimeCodeGeneration": "1",
                "ManifestFile": "$(IntDir)\\$(TargetFileName).2intermediate.manifest",
                "MapExports": "true",
                "MapFileName": "d5",
                "MergedIDLBaseFileName": "f2",
                "MergeSections": "f5",
                "MidlCommandFile": "f1",
                "ModuleDefinitionFile": "sdsd",
                "OptimizeForWindows98": "2",
                "OptimizeReferences": "2",
                "OutputFile": "$(OutDir)\\$(ProjectName)2.exe",
                "PerUserRedirection": "true",
                "Profile": "true",
                "ProfileGuidedDatabase": "$(TargetDir)$(TargetName).pgdd",
                "ProgramDatabaseFile": "Flob.pdb",
                "RandomizedBaseAddress": "1",
                "RegisterOutput": "true",
                "ResourceOnlyDLL": "true",
                "SetChecksum": "false",
                "ShowProgress": "1",
                "StackCommitSize": "15",
                "StackReserveSize": "14",
                "StripPrivateSymbols": "d3",
                "SubSystem": "1",
                "SupportUnloadOfDelayLoadedDLL": "true",
                "SuppressStartupBanner": "false",
                "SwapRunFromCD": "true",
                "SwapRunFromNet": "true",
                "TargetMachine": "1",
                "TerminalServerAware": "1",
                "TurnOffAssemblyGeneration": "true",
                "TypeLibraryFile": "f3",
                "TypeLibraryResourceID": "12",
                "UACExecutionLevel": "2",
                "UACUIAccess": "true",
                "UseLibraryDependencyInputs": "true",
                "UseUnicodeResponseFiles": "false",
                "Version": "333",
            },
            "VCResourceCompilerTool": {
                "AdditionalIncludeDirectories": "f3",
                "AdditionalOptions": "/more3",
                "Culture": "3084",
                "IgnoreStandardIncludePath": "true",
                "PreprocessorDefinitions": "_UNICODE;UNICODE2",
                "ResourceOutputFileName": "$(IntDir)/$(InputName)3.res",
                "ShowProgress": "true",
            },
            "VCManifestTool": {
                "AdditionalManifestFiles": "sfsdfsd",
                "AdditionalOptions": "afdsdafsd",
                "AssemblyIdentity": "sddfdsadfsa",
                "ComponentFileName": "fsdfds",
                "DependencyInformationFile": "$(IntDir)\\mt.depdfd",
                "EmbedManifest": "false",
                "GenerateCatalogFiles": "true",
                "InputResourceManifests": "asfsfdafs",
                "ManifestResourceFile":
                    "$(IntDir)\\$(TargetFileName).embed.manifest.resfdsf",
                "OutputManifestFile": "$(TargetPath).manifestdfs",
                "RegistrarScriptFile": "sdfsfd",
                "ReplacementsFile": "sdffsd",
                "SuppressStartupBanner": "false",
                "TypeLibraryFile": "sfsd",
                "UpdateFileHashes": "true",
                "UpdateFileHashesSearchPath": "sfsd",
                "UseFAT32Workaround": "true",
                "UseUnicodeResponseFiles": "false",
                "VerboseOutput": "true",
            },
        }
        expected_msbuild_settings = {
            "ClCompile": {
                "AdditionalIncludeDirectories": "dir1",
                "AdditionalOptions": "/more /J",
                "AdditionalUsingDirectories": "test",
                "AssemblerListingLocation": "$(IntDir)a",
                "AssemblerOutput": "AssemblyCode",
                "BasicRuntimeChecks": "EnableFastChecks",
                "BrowseInformation": "true",
                "BrowseInformationFile": "$(IntDir)e",
                "BufferSecurityCheck": "false",
                "CallingConvention": "FastCall",
                "CompileAs": "CompileAsC",
                "DebugInformationFormat": "EditAndContinue",
                "DisableLanguageExtensions": "true",
                "DisableSpecificWarnings": "abc",
                "EnableEnhancedInstructionSet": "StreamingSIMDExtensions",
                "EnableFiberSafeOptimizations": "true",
                "EnablePREfast": "true",
                "ErrorReporting": "Queue",
                "ExceptionHandling": "Async",
                "ExpandAttributedSource": "true",
                "FavorSizeOrSpeed": "Size",
                "FloatingPointExceptions": "true",
                "FloatingPointModel": "Strict",
                "ForceConformanceInForLoopScope": "false",
                "ForcedIncludeFiles": "def",
                "ForcedUsingFiles": "ge",
                "FunctionLevelLinking": "true",
                "GenerateXMLDocumentationFiles": "true",
                "IgnoreStandardIncludePath": "true",
                "InlineFunctionExpansion": "OnlyExplicitInline",
                "IntrinsicFunctions": "true",
                "MinimalRebuild": "true",
                "ObjectFileName": "$(IntDir)b",
                "OmitDefaultLibName": "true",
                "OmitFramePointers": "true",
                "OpenMPSupport": "true",
                "Optimization": "Full",
                "PrecompiledHeader": "NotUsing",  # Actual conversion gives ''
                "PrecompiledHeaderFile": "StdAfx.hd",
                "PrecompiledHeaderOutputFile": "$(IntDir)$(TargetName).pche",
                "PreprocessKeepComments": "true",
                "PreprocessorDefinitions": "WIN32;_DEBUG;_CONSOLE",
                "PreprocessSuppressLineNumbers": "true",
                "PreprocessToFile": "true",
                "ProgramDataBaseFileName": "$(IntDir)vc90b.pdb",
                "RuntimeLibrary": "MultiThreadedDebugDLL",
                "RuntimeTypeInfo": "false",
                "ShowIncludes": "true",
                "SmallerTypeCheck": "true",
                "StringPooling": "true",
                "StructMemberAlignment": "4Bytes",
                "SuppressStartupBanner": "false",
                "TreatWarningAsError": "true",
                "TreatWChar_tAsBuiltInType": "false",
                "UndefineAllPreprocessorDefinitions": "true",
                "UndefinePreprocessorDefinitions": "wer",
                "UseFullPaths": "true",
                "WarningLevel": "Level3",
                "WholeProgramOptimization": "true",
                "XMLDocumentationFileName": "$(IntDir)c",
            },
            "Link": {
                "AdditionalDependencies": "zx",
                "AdditionalLibraryDirectories": "asd",
                "AdditionalManifestDependencies": "s2",
                "AdditionalOptions": "/mor2",
                "AddModuleNamesToAssembly": "d1",
                "AllowIsolation": "false",
                "AssemblyDebug": "true",
                "AssemblyLinkResource": "d5",
                "BaseAddress": "23423",
                "CLRImageType": "ForceSafeILImage",
                "CLRThreadAttribute": "MTAThreadingAttribute",
                "CLRUnmanagedCodeCheck": "true",
                "DataExecutionPrevention": "",
                "DelayLoadDLLs": "d4",
                "DelaySign": "true",
                "Driver": "UpOnly",
                "EmbedManagedResourceFile": "d2",
                "EnableCOMDATFolding": "false",
                "EnableUAC": "false",
                "EntryPointSymbol": "f5",
                "FixedBaseAddress": "false",
                "ForceSymbolReferences": "d3",
                "FunctionOrder": "fssdfsd",
                "GenerateDebugInformation": "true",
                "GenerateMapFile": "true",
                "HeapCommitSize": "13",
                "HeapReserveSize": "12",
                "IgnoreAllDefaultLibraries": "true",
                "IgnoreEmbeddedIDL": "true",
                "IgnoreSpecificDefaultLibraries": "flob;flok",
                "ImportLibrary": "f4",
                "KeyContainer": "f7",
                "KeyFile": "f6",
                "LargeAddressAware": "true",
                "LinkErrorReporting": "QueueForNextLogin",
                "LinkTimeCodeGeneration": "UseLinkTimeCodeGeneration",
                "ManifestFile": "$(IntDir)$(TargetFileName).2intermediate.manifest",
                "MapExports": "true",
                "MapFileName": "d5",
                "MergedIDLBaseFileName": "f2",
                "MergeSections": "f5",
                "MidlCommandFile": "f1",
                "ModuleDefinitionFile": "sdsd",
                "NoEntryPoint": "true",
                "OptimizeReferences": "true",
                "OutputFile": "$(OutDir)$(ProjectName)2.exe",
                "PerUserRedirection": "true",
                "Profile": "true",
                "ProfileGuidedDatabase": "$(TargetDir)$(TargetName).pgdd",
                "ProgramDatabaseFile": "Flob.pdb",
                "RandomizedBaseAddress": "false",
                "RegisterOutput": "true",
                "SetChecksum": "false",
                "ShowProgress": "LinkVerbose",
                "StackCommitSize": "15",
                "StackReserveSize": "14",
                "StripPrivateSymbols": "d3",
                "SubSystem": "Console",
                "SupportUnloadOfDelayLoadedDLL": "true",
                "SuppressStartupBanner": "false",
                "SwapRunFromCD": "true",
                "SwapRunFromNET": "true",
                "TargetMachine": "MachineX86",
                "TerminalServerAware": "false",
                "TurnOffAssemblyGeneration": "true",
                "TypeLibraryFile": "f3",
                "TypeLibraryResourceID": "12",
                "UACExecutionLevel": "RequireAdministrator",
                "UACUIAccess": "true",
                "Version": "333",
            },
            "ResourceCompile": {
                "AdditionalIncludeDirectories": "f3",
                "AdditionalOptions": "/more3",
                "Culture": "0x0c0c",
                "IgnoreStandardIncludePath": "true",
                "PreprocessorDefinitions": "_UNICODE;UNICODE2",
                "ResourceOutputFileName": "$(IntDir)%(Filename)3.res",
                "ShowProgress": "true",
            },
            "Manifest": {
                "AdditionalManifestFiles": "sfsdfsd",
                "AdditionalOptions": "afdsdafsd",
                "AssemblyIdentity": "sddfdsadfsa",
                "ComponentFileName": "fsdfds",
                "GenerateCatalogFiles": "true",
                "InputResourceManifests": "asfsfdafs",
                "OutputManifestFile": "$(TargetPath).manifestdfs",
                "RegistrarScriptFile": "sdfsfd",
                "ReplacementsFile": "sdffsd",
                "SuppressStartupBanner": "false",
                "TypeLibraryFile": "sfsd",
                "UpdateFileHashes": "true",
                "UpdateFileHashesSearchPath": "sfsd",
                "VerboseOutput": "true",
            },
            "ProjectReference": {
                "LinkLibraryDependencies": "false",
                "UseLibraryDependencyInputs": "true",
            },
            "": {
                "EmbedManifest": "false",
                "GenerateManifest": "false",
                "IgnoreImportLibrary": "true",
                "LinkIncremental": "",
            },
            "ManifestResourceCompile": {
                "ResourceOutputFileName":
                    "$(IntDir)$(TargetFileName).embed.manifest.resfdsf"
            },
        }
        self.maxDiff = 9999  # on failure display a long diff
        actual_msbuild_settings = MSVSSettings.ConvertToMSBuildSettings(
            msvs_settings, self.stderr
        )
        self.assertEqual(expected_msbuild_settings, actual_msbuild_settings)
        self._ExpectedWarnings([])


if __name__ == "__main__":
    unittest.main()
# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Visual Studio project reader/writer."""

import gyp.easy_xml as easy_xml


class Writer:
    """Visual Studio XML tool file writer."""

    def __init__(self, tool_file_path, name):
        """Initializes the tool file.

    Args:
      tool_file_path: Path to the tool file.
      name: Name of the tool file.
    """
        self.tool_file_path = tool_file_path
        self.name = name
        self.rules_section = ["Rules"]

    def AddCustomBuildRule(
        self, name, cmd, description, additional_dependencies, outputs, extensions
    ):
        """Adds a rule to the tool file.

    Args:
      name: Name of the rule.
      description: Description of the rule.
      cmd: Command line of the rule.
      additional_dependencies: other files which may trigger the rule.
      outputs: outputs of the rule.
      extensions: extensions handled by the rule.
    """
        rule = [
            "CustomBuildRule",
            {
                "Name": name,
                "ExecutionDescription": description,
                "CommandLine": cmd,
                "Outputs": ";".join(outputs),
                "FileExtensions": ";".join(extensions),
                "AdditionalDependencies": ";".join(additional_dependencies),
            },
        ]
        self.rules_section.append(rule)

    def WriteIfChanged(self):
        """Writes the tool file."""
        content = [
            "VisualStudioToolFile",
            {"Version": "8.00", "Name": self.name},
            self.rules_section,
        ]
        easy_xml.WriteXmlIfChanged(
            content, self.tool_file_path, encoding="Windows-1252"
        )
# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Visual Studio user preferences file writer."""

import os
import re
import socket  # for gethostname

import gyp.easy_xml as easy_xml


# ------------------------------------------------------------------------------


def _FindCommandInPath(command):
    """If there are no slashes in the command given, this function
     searches the PATH env to find the given command, and converts it
     to an absolute path.  We have to do this because MSVS is looking
     for an actual file to launch a debugger on, not just a command
     line.  Note that this happens at GYP time, so anything needing to
     be built needs to have a full path."""
    if "/" in command or "\\" in command:
        # If the command already has path elements (either relative or
        # absolute), then assume it is constructed properly.
        return command
    else:
        # Search through the path list and find an existing file that
        # we can access.
        paths = os.environ.get("PATH", "").split(os.pathsep)
        for path in paths:
            item = os.path.join(path, command)
            if os.path.isfile(item) and os.access(item, os.X_OK):
                return item
    return command


def _QuoteWin32CommandLineArgs(args):
    new_args = []
    for arg in args:
        # Replace all double-quotes with double-double-quotes to escape
        # them for cmd shell, and then quote the whole thing if there
        # are any.
        if arg.find('"') != -1:
            arg = '""'.join(arg.split('"'))
            arg = '"%s"' % arg

        # Otherwise, if there are any spaces, quote the whole arg.
        elif re.search(r"[ \t\n]", arg):
            arg = '"%s"' % arg
        new_args.append(arg)
    return new_args


class Writer:
    """Visual Studio XML user user file writer."""

    def __init__(self, user_file_path, version, name):
        """Initializes the user file.

    Args:
      user_file_path: Path to the user file.
      version: Version info.
      name: Name of the user file.
    """
        self.user_file_path = user_file_path
        self.version = version
        self.name = name
        self.configurations = {}

    def AddConfig(self, name):
        """Adds a configuration to the project.

    Args:
      name: Configuration name.
    """
        self.configurations[name] = ["Configuration", {"Name": name}]

    def AddDebugSettings(
        self, config_name, command, environment={}, working_directory=""
    ):
        """Adds a DebugSettings node to the user file for a particular config.

    Args:
      command: command line to run.  First element in the list is the
        executable.  All elements of the command will be quoted if
        necessary.
      working_directory: other files which may trigger the rule. (optional)
    """
        command = _QuoteWin32CommandLineArgs(command)

        abs_command = _FindCommandInPath(command[0])

        if environment and isinstance(environment, dict):
            env_list = [f'{key}="{val}"' for (key, val) in environment.items()]
            environment = " ".join(env_list)
        else:
            environment = ""

        n_cmd = [
            "DebugSettings",
            {
                "Command": abs_command,
                "WorkingDirectory": working_directory,
                "CommandArguments": " ".join(command[1:]),
                "RemoteMachine": socket.gethostname(),
                "Environment": environment,
                "EnvironmentMerge": "true",
                # Currently these are all "dummy" values that we're just setting
                # in the default manner that MSVS does it.  We could use some of
                # these to add additional capabilities, I suppose, but they might
                # not have parity with other platforms then.
                "Attach": "false",
                "DebuggerType": "3",  # 'auto' debugger
                "Remote": "1",
                "RemoteCommand": "",
                "HttpUrl": "",
                "PDBPath": "",
                "SQLDebugging": "",
                "DebuggerFlavor": "0",
                "MPIRunCommand": "",
                "MPIRunArguments": "",
                "MPIRunWorkingDirectory": "",
                "ApplicationCommand": "",
                "ApplicationArguments": "",
                "ShimCommand": "",
                "MPIAcceptMode": "",
                "MPIAcceptFilter": "",
            },
        ]

        # Find the config, and add it if it doesn't exist.
        if config_name not in self.configurations:
            self.AddConfig(config_name)

        # Add the DebugSettings onto the appropriate config.
        self.configurations[config_name].append(n_cmd)

    def WriteIfChanged(self):
        """Writes the user file."""
        configs = ["Configurations"]
        for config, spec in sorted(self.configurations.items()):
            configs.append(spec)

        content = [
            "VisualStudioUserFile",
            {"Version": self.version.ProjectVersion(), "Name": self.name},
            configs,
        ]
        easy_xml.WriteXmlIfChanged(
            content, self.user_file_path, encoding="Windows-1252"
        )
# Copyright (c) 2013 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Utility functions shared amongst the Windows generators."""

import copy
import os


# A dictionary mapping supported target types to extensions.
TARGET_TYPE_EXT = {
    "executable": "exe",
    "loadable_module": "dll",
    "shared_library": "dll",
    "static_library": "lib",
    "windows_driver": "sys",
}


def _GetLargePdbShimCcPath():
    """Returns the path of the large_pdb_shim.cc file."""
    this_dir = os.path.abspath(os.path.dirname(__file__))
    src_dir = os.path.abspath(os.path.join(this_dir, "..", ".."))
    win_data_dir = os.path.join(src_dir, "data", "win")
    large_pdb_shim_cc = os.path.join(win_data_dir, "large-pdb-shim.cc")
    return large_pdb_shim_cc


def _DeepCopySomeKeys(in_dict, keys):
    """Performs a partial deep-copy on |in_dict|, only copying the keys in |keys|.

  Arguments:
    in_dict: The dictionary to copy.
    keys: The keys to be copied. If a key is in this list and doesn't exist in
        |in_dict| this is not an error.
  Returns:
    The partially deep-copied dictionary.
  """
    d = {}
    for key in keys:
        if key not in in_dict:
            continue
        d[key] = copy.deepcopy(in_dict[key])
    return d


def _SuffixName(name, suffix):
    """Add a suffix to the end of a target.

  Arguments:
    name: name of the target (foo#target)
    suffix: the suffix to be added
  Returns:
    Target name with suffix added (foo_suffix#target)
  """
    parts = name.rsplit("#", 1)
    parts[0] = f"{parts[0]}_{suffix}"
    return "#".join(parts)


def _ShardName(name, number):
    """Add a shard number to the end of a target.

  Arguments:
    name: name of the target (foo#target)
    number: shard number
  Returns:
    Target name with shard added (foo_1#target)
  """
    return _SuffixName(name, str(number))


def ShardTargets(target_list, target_dicts):
    """Shard some targets apart to work around the linkers limits.

  Arguments:
    target_list: List of target pairs: 'base/base.gyp:base'.
    target_dicts: Dict of target properties keyed on target pair.
  Returns:
    Tuple of the new sharded versions of the inputs.
  """
    # Gather the targets to shard, and how many pieces.
    targets_to_shard = {}
    for t in target_dicts:
        shards = int(target_dicts[t].get("msvs_shard", 0))
        if shards:
            targets_to_shard[t] = shards
    # Shard target_list.
    new_target_list = []
    for t in target_list:
        if t in targets_to_shard:
            for i in range(targets_to_shard[t]):
                new_target_list.append(_ShardName(t, i))
        else:
            new_target_list.append(t)
    # Shard target_dict.
    new_target_dicts = {}
    for t in target_dicts:
        if t in targets_to_shard:
            for i in range(targets_to_shard[t]):
                name = _ShardName(t, i)
                new_target_dicts[name] = copy.copy(target_dicts[t])
                new_target_dicts[name]["target_name"] = _ShardName(
                    new_target_dicts[name]["target_name"], i
                )
                sources = new_target_dicts[name].get("sources", [])
                new_sources = []
                for pos in range(i, len(sources), targets_to_shard[t]):
                    new_sources.append(sources[pos])
                new_target_dicts[name]["sources"] = new_sources
        else:
            new_target_dicts[t] = target_dicts[t]
    # Shard dependencies.
    for t in sorted(new_target_dicts):
        for deptype in ("dependencies", "dependencies_original"):
            dependencies = copy.copy(new_target_dicts[t].get(deptype, []))
            new_dependencies = []
            for d in dependencies:
                if d in targets_to_shard:
                    for i in range(targets_to_shard[d]):
                        new_dependencies.append(_ShardName(d, i))
                else:
                    new_dependencies.append(d)
            new_target_dicts[t][deptype] = new_dependencies

    return (new_target_list, new_target_dicts)


def _GetPdbPath(target_dict, config_name, vars):
    """Returns the path to the PDB file that will be generated by a given
  configuration.

  The lookup proceeds as follows:
    - Look for an explicit path in the VCLinkerTool configuration block.
    - Look for an 'msvs_large_pdb_path' variable.
    - Use '<(PRODUCT_DIR)/<(product_name).(exe|dll).pdb' if 'product_name' is
      specified.
    - Use '<(PRODUCT_DIR)/<(target_name).(exe|dll).pdb'.

  Arguments:
    target_dict: The target dictionary to be searched.
    config_name: The name of the configuration of interest.
    vars: A dictionary of common GYP variables with generator-specific values.
  Returns:
    The path of the corresponding PDB file.
  """
    config = target_dict["configurations"][config_name]
    msvs = config.setdefault("msvs_settings", {})

    linker = msvs.get("VCLinkerTool", {})

    pdb_path = linker.get("ProgramDatabaseFile")
    if pdb_path:
        return pdb_path

    variables = target_dict.get("variables", {})
    pdb_path = variables.get("msvs_large_pdb_path", None)
    if pdb_path:
        return pdb_path

    pdb_base = target_dict.get("product_name", target_dict["target_name"])
    pdb_base = "{}.{}.pdb".format(pdb_base, TARGET_TYPE_EXT[target_dict["type"]])
    pdb_path = vars["PRODUCT_DIR"] + "/" + pdb_base

    return pdb_path


def InsertLargePdbShims(target_list, target_dicts, vars):
    """Insert a shim target that forces the linker to use 4KB pagesize PDBs.

  This is a workaround for targets with PDBs greater than 1GB in size, the
  limit for the 1KB pagesize PDBs created by the linker by default.

  Arguments:
    target_list: List of target pairs: 'base/base.gyp:base'.
    target_dicts: Dict of target properties keyed on target pair.
    vars: A dictionary of common GYP variables with generator-specific values.
  Returns:
    Tuple of the shimmed version of the inputs.
  """
    # Determine which targets need shimming.
    targets_to_shim = []
    for t in target_dicts:
        target_dict = target_dicts[t]

        # We only want to shim targets that have msvs_large_pdb enabled.
        if not int(target_dict.get("msvs_large_pdb", 0)):
            continue
        # This is intended for executable, shared_library and loadable_module
        # targets where every configuration is set up to produce a PDB output.
        # If any of these conditions is not true then the shim logic will fail
        # below.
        targets_to_shim.append(t)

    large_pdb_shim_cc = _GetLargePdbShimCcPath()

    for t in targets_to_shim:
        target_dict = target_dicts[t]
        target_name = target_dict.get("target_name")

        base_dict = _DeepCopySomeKeys(
            target_dict, ["configurations", "default_configuration", "toolset"]
        )

        # This is the dict for copying the source file (part of the GYP tree)
        # to the intermediate directory of the project. This is necessary because
        # we can't always build a relative path to the shim source file (on Windows
        # GYP and the project may be on different drives), and Ninja hates absolute
        # paths (it ends up generating the .obj and .obj.d alongside the source
        # file, polluting GYPs tree).
        copy_suffix = "large_pdb_copy"
        copy_target_name = target_name + "_" + copy_suffix
        full_copy_target_name = _SuffixName(t, copy_suffix)
        shim_cc_basename = os.path.basename(large_pdb_shim_cc)
        shim_cc_dir = vars["SHARED_INTERMEDIATE_DIR"] + "/" + copy_target_name
        shim_cc_path = shim_cc_dir + "/" + shim_cc_basename
        copy_dict = copy.deepcopy(base_dict)
        copy_dict["target_name"] = copy_target_name
        copy_dict["type"] = "none"
        copy_dict["sources"] = [large_pdb_shim_cc]
        copy_dict["copies"] = [
            {"destination": shim_cc_dir, "files": [large_pdb_shim_cc]}
        ]

        # This is the dict for the PDB generating shim target. It depends on the
        # copy target.
        shim_suffix = "large_pdb_shim"
        shim_target_name = target_name + "_" + shim_suffix
        full_shim_target_name = _SuffixName(t, shim_suffix)
        shim_dict = copy.deepcopy(base_dict)
        shim_dict["target_name"] = shim_target_name
        shim_dict["type"] = "static_library"
        shim_dict["sources"] = [shim_cc_path]
        shim_dict["dependencies"] = [full_copy_target_name]

        # Set up the shim to output its PDB to the same location as the final linker
        # target.
        for config_name, config in shim_dict.get("configurations").items():
            pdb_path = _GetPdbPath(target_dict, config_name, vars)

            # A few keys that we don't want to propagate.
            for key in ["msvs_precompiled_header", "msvs_precompiled_source", "test"]:
                config.pop(key, None)

            msvs = config.setdefault("msvs_settings", {})

            # Update the compiler directives in the shim target.
            compiler = msvs.setdefault("VCCLCompilerTool", {})
            compiler["DebugInformationFormat"] = "3"
            compiler["ProgramDataBaseFileName"] = pdb_path

            # Set the explicit PDB path in the appropriate configuration of the
            # original target.
            config = target_dict["configurations"][config_name]
            msvs = config.setdefault("msvs_settings", {})
            linker = msvs.setdefault("VCLinkerTool", {})
            linker["GenerateDebugInformation"] = "true"
            linker["ProgramDatabaseFile"] = pdb_path

        # Add the new targets. They must go to the beginning of the list so that
        # the dependency generation works as expected in ninja.
        target_list.insert(0, full_copy_target_name)
        target_list.insert(0, full_shim_target_name)
        target_dicts[full_copy_target_name] = copy_dict
        target_dicts[full_shim_target_name] = shim_dict

        # Update the original target to depend on the shim target.
        target_dict.setdefault("dependencies", []).append(full_shim_target_name)

    return (target_list, target_dicts)
# Copyright (c) 2013 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Handle version information related to Visual Stuio."""

import errno
import os
import re
import subprocess
import sys
import glob


def JoinPath(*args):
    return os.path.normpath(os.path.join(*args))


class VisualStudioVersion:
    """Information regarding a version of Visual Studio."""

    def __init__(
        self,
        short_name,
        description,
        solution_version,
        project_version,
        flat_sln,
        uses_vcxproj,
        path,
        sdk_based,
        default_toolset=None,
        compatible_sdks=None,
    ):
        self.short_name = short_name
        self.description = description
        self.solution_version = solution_version
        self.project_version = project_version
        self.flat_sln = flat_sln
        self.uses_vcxproj = uses_vcxproj
        self.path = path
        self.sdk_based = sdk_based
        self.default_toolset = default_toolset
        compatible_sdks = compatible_sdks or []
        compatible_sdks.sort(key=lambda v: float(v.replace("v", "")), reverse=True)
        self.compatible_sdks = compatible_sdks

    def ShortName(self):
        return self.short_name

    def Description(self):
        """Get the full description of the version."""
        return self.description

    def SolutionVersion(self):
        """Get the version number of the sln files."""
        return self.solution_version

    def ProjectVersion(self):
        """Get the version number of the vcproj or vcxproj files."""
        return self.project_version

    def FlatSolution(self):
        return self.flat_sln

    def UsesVcxproj(self):
        """Returns true if this version uses a vcxproj file."""
        return self.uses_vcxproj

    def ProjectExtension(self):
        """Returns the file extension for the project."""
        return self.uses_vcxproj and ".vcxproj" or ".vcproj"

    def Path(self):
        """Returns the path to Visual Studio installation."""
        return self.path

    def ToolPath(self, tool):
        """Returns the path to a given compiler tool. """
        return os.path.normpath(os.path.join(self.path, "VC/bin", tool))

    def DefaultToolset(self):
        """Returns the msbuild toolset version that will be used in the absence
    of a user override."""
        return self.default_toolset

    def _SetupScriptInternal(self, target_arch):
        """Returns a command (with arguments) to be used to set up the
    environment."""
        assert target_arch in ("x86", "x64"), "target_arch not supported"
        # If WindowsSDKDir is set and SetEnv.Cmd exists then we are using the
        # depot_tools build tools and should run SetEnv.Cmd to set up the
        # environment. The check for WindowsSDKDir alone is not sufficient because
        # this is set by running vcvarsall.bat.
        sdk_dir = os.environ.get("WindowsSDKDir", "")
        setup_path = JoinPath(sdk_dir, "Bin", "SetEnv.Cmd")
        if self.sdk_based and sdk_dir and os.path.exists(setup_path):
            return [setup_path, "/" + target_arch]

        is_host_arch_x64 = (
            os.environ.get("PROCESSOR_ARCHITECTURE") == "AMD64"
            or os.environ.get("PROCESSOR_ARCHITEW6432") == "AMD64"
        )

        # For VS2017 (and newer) it's fairly easy
        if self.short_name >= "2017":
            script_path = JoinPath(
                self.path, "VC", "Auxiliary", "Build", "vcvarsall.bat"
            )

            # Always use a native executable, cross-compiling if necessary.
            host_arch = "amd64" if is_host_arch_x64 else "x86"
            msvc_target_arch = "amd64" if target_arch == "x64" else "x86"
            arg = host_arch
            if host_arch != msvc_target_arch:
                arg += "_" + msvc_target_arch

            return [script_path, arg]

        # We try to find the best version of the env setup batch.
        vcvarsall = JoinPath(self.path, "VC", "vcvarsall.bat")
        if target_arch == "x86":
            if (
                self.short_name >= "2013"
                and self.short_name[-1] != "e"
                and is_host_arch_x64
            ):
                # VS2013 and later, non-Express have a x64-x86 cross that we want
                # to prefer.
                return [vcvarsall, "amd64_x86"]
            else:
                # Otherwise, the standard x86 compiler. We don't use VC/vcvarsall.bat
                # for x86 because vcvarsall calls vcvars32, which it can only find if
                # VS??COMNTOOLS is set, which isn't guaranteed.
                return [JoinPath(self.path, "Common7", "Tools", "vsvars32.bat")]
        elif target_arch == "x64":
            arg = "x86_amd64"
            # Use the 64-on-64 compiler if we're not using an express edition and
            # we're running on a 64bit OS.
            if self.short_name[-1] != "e" and is_host_arch_x64:
                arg = "amd64"
            return [vcvarsall, arg]

    def SetupScript(self, target_arch):
        script_data = self._SetupScriptInternal(target_arch)
        script_path = script_data[0]
        if not os.path.exists(script_path):
            raise Exception(
                "%s is missing - make sure VC++ tools are installed." % script_path
            )
        return script_data


def _RegistryQueryBase(sysdir, key, value):
    """Use reg.exe to read a particular key.

  While ideally we might use the win32 module, we would like gyp to be
  python neutral, so for instance cygwin python lacks this module.

  Arguments:
    sysdir: The system subdirectory to attempt to launch reg.exe from.
    key: The registry key to read from.
    value: The particular value to read.
  Return:
    stdout from reg.exe, or None for failure.
  """
    # Skip if not on Windows or Python Win32 setup issue
    if sys.platform not in ("win32", "cygwin"):
        return None
    # Setup params to pass to and attempt to launch reg.exe
    cmd = [os.path.join(os.environ.get("WINDIR", ""), sysdir, "reg.exe"), "query", key]
    if value:
        cmd.extend(["/v", value])
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    # Obtain the stdout from reg.exe, reading to the end so p.returncode is valid
    # Note that the error text may be in [1] in some cases
    text = p.communicate()[0].decode("utf-8")
    # Check return code from reg.exe; officially 0==success and 1==error
    if p.returncode:
        return None
    return text


def _RegistryQuery(key, value=None):
    r"""Use reg.exe to read a particular key through _RegistryQueryBase.

  First tries to launch from %WinDir%\Sysnative to avoid WoW64 redirection. If
  that fails, it falls back to System32.  Sysnative is available on Vista and
  up and available on Windows Server 2003 and XP through KB patch 942589. Note
  that Sysnative will always fail if using 64-bit python due to it being a
  virtual directory and System32 will work correctly in the first place.

  KB 942589 - http://support.microsoft.com/kb/942589/en-us.

  Arguments:
    key: The registry key.
    value: The particular registry value to read (optional).
  Return:
    stdout from reg.exe, or None for failure.
  """
    text = None
    try:
        text = _RegistryQueryBase("Sysnative", key, value)
    except OSError as e:
        if e.errno == errno.ENOENT:
            text = _RegistryQueryBase("System32", key, value)
        else:
            raise
    return text


def _RegistryGetValueUsingWinReg(key, value):
    """Use the _winreg module to obtain the value of a registry key.

  Args:
    key: The registry key.
    value: The particular registry value to read.
  Return:
    contents of the registry key's value, or None on failure.  Throws
    ImportError if winreg is unavailable.
  """
    from winreg import HKEY_LOCAL_MACHINE, OpenKey, QueryValueEx
    try:
        root, subkey = key.split("\\", 1)
        assert root == "HKLM"  # Only need HKLM for now.
        with OpenKey(HKEY_LOCAL_MACHINE, subkey) as hkey:
            return QueryValueEx(hkey, value)[0]
    except OSError:
        return None


def _RegistryGetValue(key, value):
    """Use _winreg or reg.exe to obtain the value of a registry key.

  Using _winreg is preferable because it solves an issue on some corporate
  environments where access to reg.exe is locked down. However, we still need
  to fallback to reg.exe for the case where the _winreg module is not available
  (for example in cygwin python).

  Args:
    key: The registry key.
    value: The particular registry value to read.
  Return:
    contents of the registry key's value, or None on failure.
  """
    try:
        return _RegistryGetValueUsingWinReg(key, value)
    except ImportError:
        pass

    # Fallback to reg.exe if we fail to import _winreg.
    text = _RegistryQuery(key, value)
    if not text:
        return None
    # Extract value.
    match = re.search(r"REG_\w+\s+([^\r]+)\r\n", text)
    if not match:
        return None
    return match.group(1)


def _CreateVersion(name, path, sdk_based=False):
    """Sets up MSVS project generation.

  Setup is based off the GYP_MSVS_VERSION environment variable or whatever is
  autodetected if GYP_MSVS_VERSION is not explicitly specified. If a version is
  passed in that doesn't match a value in versions python will throw a error.
  """
    if path:
        path = os.path.normpath(path)
    versions = {
        "2022": VisualStudioVersion(
            "2022",
            "Visual Studio 2022",
            solution_version="12.00",
            project_version="17.0",
            flat_sln=False,
            uses_vcxproj=True,
            path=path,
            sdk_based=sdk_based,
            default_toolset="v143",
            compatible_sdks=["v8.1", "v10.0"],
        ),
        "2019": VisualStudioVersion(
            "2019",
            "Visual Studio 2019",
            solution_version="12.00",
            project_version="16.0",
            flat_sln=False,
            uses_vcxproj=True,
            path=path,
            sdk_based=sdk_based,
            default_toolset="v142",
            compatible_sdks=["v8.1", "v10.0"],
        ),
        "2017": VisualStudioVersion(
            "2017",
            "Visual Studio 2017",
            solution_version="12.00",
            project_version="15.0",
            flat_sln=False,
            uses_vcxproj=True,
            path=path,
            sdk_based=sdk_based,
            default_toolset="v141",
            compatible_sdks=["v8.1", "v10.0"],
        ),
        "2015": VisualStudioVersion(
            "2015",
            "Visual Studio 2015",
            solution_version="12.00",
            project_version="14.0",
            flat_sln=False,
            uses_vcxproj=True,
            path=path,
            sdk_based=sdk_based,
            default_toolset="v140",
        ),
        "2013": VisualStudioVersion(
            "2013",
            "Visual Studio 2013",
            solution_version="13.00",
            project_version="12.0",
            flat_sln=False,
            uses_vcxproj=True,
            path=path,
            sdk_based=sdk_based,
            default_toolset="v120",
        ),
        "2013e": VisualStudioVersion(
            "2013e",
            "Visual Studio 2013",
            solution_version="13.00",
            project_version="12.0",
            flat_sln=True,
            uses_vcxproj=True,
            path=path,
            sdk_based=sdk_based,
            default_toolset="v120",
        ),
        "2012": VisualStudioVersion(
            "2012",
            "Visual Studio 2012",
            solution_version="12.00",
            project_version="4.0",
            flat_sln=False,
            uses_vcxproj=True,
            path=path,
            sdk_based=sdk_based,
            default_toolset="v110",
        ),
        "2012e": VisualStudioVersion(
            "2012e",
            "Visual Studio 2012",
            solution_version="12.00",
            project_version="4.0",
            flat_sln=True,
            uses_vcxproj=True,
            path=path,
            sdk_based=sdk_based,
            default_toolset="v110",
        ),
        "2010": VisualStudioVersion(
            "2010",
            "Visual Studio 2010",
            solution_version="11.00",
            project_version="4.0",
            flat_sln=False,
            uses_vcxproj=True,
            path=path,
            sdk_based=sdk_based,
        ),
        "2010e": VisualStudioVersion(
            "2010e",
            "Visual C++ Express 2010",
            solution_version="11.00",
            project_version="4.0",
            flat_sln=True,
            uses_vcxproj=True,
            path=path,
            sdk_based=sdk_based,
        ),
        "2008": VisualStudioVersion(
            "2008",
            "Visual Studio 2008",
            solution_version="10.00",
            project_version="9.00",
            flat_sln=False,
            uses_vcxproj=False,
            path=path,
            sdk_based=sdk_based,
        ),
        "2008e": VisualStudioVersion(
            "2008e",
            "Visual Studio 2008",
            solution_version="10.00",
            project_version="9.00",
            flat_sln=True,
            uses_vcxproj=False,
            path=path,
            sdk_based=sdk_based,
        ),
        "2005": VisualStudioVersion(
            "2005",
            "Visual Studio 2005",
            solution_version="9.00",
            project_version="8.00",
            flat_sln=False,
            uses_vcxproj=False,
            path=path,
            sdk_based=sdk_based,
        ),
        "2005e": VisualStudioVersion(
            "2005e",
            "Visual Studio 2005",
            solution_version="9.00",
            project_version="8.00",
            flat_sln=True,
            uses_vcxproj=False,
            path=path,
            sdk_based=sdk_based,
        ),
    }
    return versions[str(name)]


def _ConvertToCygpath(path):
    """Convert to cygwin path if we are using cygwin."""
    if sys.platform == "cygwin":
        p = subprocess.Popen(["cygpath", path], stdout=subprocess.PIPE)
        path = p.communicate()[0].decode("utf-8").strip()
    return path


def _DetectVisualStudioVersions(versions_to_check, force_express):
    """Collect the list of installed visual studio versions.

  Returns:
    A list of visual studio versions installed in descending order of
    usage preference.
    Base this on the registry and a quick check if devenv.exe exists.
    Possibilities are:
      2005(e) - Visual Studio 2005 (8)
      2008(e) - Visual Studio 2008 (9)
      2010(e) - Visual Studio 2010 (10)
      2012(e) - Visual Studio 2012 (11)
      2013(e) - Visual Studio 2013 (12)
      2015    - Visual Studio 2015 (14)
      2017    - Visual Studio 2017 (15)
      2019    - Visual Studio 2019 (16)
      2022    - Visual Studio 2022 (17)
    Where (e) is e for express editions of MSVS and blank otherwise.
  """
    version_to_year = {
        "8.0": "2005",
        "9.0": "2008",
        "10.0": "2010",
        "11.0": "2012",
        "12.0": "2013",
        "14.0": "2015",
        "15.0": "2017",
        "16.0": "2019",
        "17.0": "2022",
    }
    versions = []
    for version in versions_to_check:
        # Old method of searching for which VS version is installed
        # We don't use the 2010-encouraged-way because we also want to get the
        # path to the binaries, which it doesn't offer.
        keys = [
            r"HKLM\Software\Microsoft\VisualStudio\%s" % version,
            r"HKLM\Software\Wow6432Node\Microsoft\VisualStudio\%s" % version,
            r"HKLM\Software\Microsoft\VCExpress\%s" % version,
            r"HKLM\Software\Wow6432Node\Microsoft\VCExpress\%s" % version,
        ]
        for index in range(len(keys)):
            path = _RegistryGetValue(keys[index], "InstallDir")
            if not path:
                continue
            path = _ConvertToCygpath(path)
            # Check for full.
            full_path = os.path.join(path, "devenv.exe")
            express_path = os.path.join(path, "*express.exe")
            if not force_express and os.path.exists(full_path):
                # Add this one.
                versions.append(
                    _CreateVersion(
                        version_to_year[version], os.path.join(path, "..", "..")
                    )
                )
            # Check for express.
            elif glob.glob(express_path):
                # Add this one.
                versions.append(
                    _CreateVersion(
                        version_to_year[version] + "e", os.path.join(path, "..", "..")
                    )
                )

        # The old method above does not work when only SDK is installed.
        keys = [
            r"HKLM\Software\Microsoft\VisualStudio\SxS\VC7",
            r"HKLM\Software\Wow6432Node\Microsoft\VisualStudio\SxS\VC7",
            r"HKLM\Software\Microsoft\VisualStudio\SxS\VS7",
            r"HKLM\Software\Wow6432Node\Microsoft\VisualStudio\SxS\VS7",
        ]
        for index in range(len(keys)):
            path = _RegistryGetValue(keys[index], version)
            if not path:
                continue
            path = _ConvertToCygpath(path)
            if version == "15.0":
                if os.path.exists(path):
                    versions.append(_CreateVersion("2017", path))
            elif version != "14.0":  # There is no Express edition for 2015.
                versions.append(
                    _CreateVersion(
                        version_to_year[version] + "e",
                        os.path.join(path, ".."),
                        sdk_based=True,
                    )
                )

    return versions


def SelectVisualStudioVersion(version="auto", allow_fallback=True):
    """Select which version of Visual Studio projects to generate.

  Arguments:
    version: Hook to allow caller to force a particular version (vs auto).
  Returns:
    An object representing a visual studio project format version.
  """
    # In auto mode, check environment variable for override.
    if version == "auto":
        version = os.environ.get("GYP_MSVS_VERSION", "auto")
    version_map = {
        "auto": ("17.0", "16.0", "15.0", "14.0", "12.0", "10.0", "9.0", "8.0", "11.0"),
        "2005": ("8.0",),
        "2005e": ("8.0",),
        "2008": ("9.0",),
        "2008e": ("9.0",),
        "2010": ("10.0",),
        "2010e": ("10.0",),
        "2012": ("11.0",),
        "2012e": ("11.0",),
        "2013": ("12.0",),
        "2013e": ("12.0",),
        "2015": ("14.0",),
        "2017": ("15.0",),
        "2019": ("16.0",),
        "2022": ("17.0",),
    }
    override_path = os.environ.get("GYP_MSVS_OVERRIDE_PATH")
    if override_path:
        msvs_version = os.environ.get("GYP_MSVS_VERSION")
        if not msvs_version:
            raise ValueError(
                "GYP_MSVS_OVERRIDE_PATH requires GYP_MSVS_VERSION to be "
                "set to a particular version (e.g. 2010e)."
            )
        return _CreateVersion(msvs_version, override_path, sdk_based=True)
    version = str(version)
    versions = _DetectVisualStudioVersions(version_map[version], "e" in version)
    if not versions:
        if not allow_fallback:
            raise ValueError("Could not locate Visual Studio installation.")
        if version == "auto":
            # Default to 2005 if we couldn't find anything
            return _CreateVersion("2005", None)
        else:
            return _CreateVersion(version, None)
    return versions[0]
#!/usr/bin/env python3

# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.


import copy
import gyp.input
import argparse
import os.path
import re
import shlex
import sys
import traceback
from gyp.common import GypError

# Default debug modes for GYP
debug = {}

# List of "official" debug modes, but you can use anything you like.
DEBUG_GENERAL = "general"
DEBUG_VARIABLES = "variables"
DEBUG_INCLUDES = "includes"


def DebugOutput(mode, message, *args):
    if "all" in gyp.debug or mode in gyp.debug:
        ctx = ("unknown", 0, "unknown")
        try:
            f = traceback.extract_stack(limit=2)
            if f:
                ctx = f[0][:3]
        except Exception:
            pass
        if args:
            message %= args
        print(
            "%s:%s:%d:%s %s"
            % (mode.upper(), os.path.basename(ctx[0]), ctx[1], ctx[2], message)
        )


def FindBuildFiles():
    extension = ".gyp"
    files = os.listdir(os.getcwd())
    build_files = []
    for file in files:
        if file.endswith(extension):
            build_files.append(file)
    return build_files


def Load(
    build_files,
    format,
    default_variables={},
    includes=[],
    depth=".",
    params=None,
    check=False,
    circular_check=True,
):
    """
  Loads one or more specified build files.
  default_variables and includes will be copied before use.
  Returns the generator for the specified format and the
  data returned by loading the specified build files.
  """
    if params is None:
        params = {}

    if "-" in format:
        format, params["flavor"] = format.split("-", 1)

    default_variables = copy.copy(default_variables)

    # Default variables provided by this program and its modules should be
    # named WITH_CAPITAL_LETTERS to provide a distinct "best practice" namespace,
    # avoiding collisions with user and automatic variables.
    default_variables["GENERATOR"] = format
    default_variables["GENERATOR_FLAVOR"] = params.get("flavor", "")

    # Format can be a custom python file, or by default the name of a module
    # within gyp.generator.
    if format.endswith(".py"):
        generator_name = os.path.splitext(format)[0]
        path, generator_name = os.path.split(generator_name)

        # Make sure the path to the custom generator is in sys.path
        # Don't worry about removing it once we are done.  Keeping the path
        # to each generator that is used in sys.path is likely harmless and
        # arguably a good idea.
        path = os.path.abspath(path)
        if path not in sys.path:
            sys.path.insert(0, path)
    else:
        generator_name = "gyp.generator." + format

    # These parameters are passed in order (as opposed to by key)
    # because ActivePython cannot handle key parameters to __import__.
    generator = __import__(generator_name, globals(), locals(), generator_name)
    for (key, val) in generator.generator_default_variables.items():
        default_variables.setdefault(key, val)

    # Give the generator the opportunity to set additional variables based on
    # the params it will receive in the output phase.
    if getattr(generator, "CalculateVariables", None):
        generator.CalculateVariables(default_variables, params)

    # Give the generator the opportunity to set generator_input_info based on
    # the params it will receive in the output phase.
    if getattr(generator, "CalculateGeneratorInputInfo", None):
        generator.CalculateGeneratorInputInfo(params)

    # Fetch the generator specific info that gets fed to input, we use getattr
    # so we can default things and the generators only have to provide what
    # they need.
    generator_input_info = {
        "non_configuration_keys": getattr(
            generator, "generator_additional_non_configuration_keys", []
        ),
        "path_sections": getattr(generator, "generator_additional_path_sections", []),
        "extra_sources_for_rules": getattr(
            generator, "generator_extra_sources_for_rules", []
        ),
        "generator_supports_multiple_toolsets": getattr(
            generator, "generator_supports_multiple_toolsets", False
        ),
        "generator_wants_static_library_dependencies_adjusted": getattr(
            generator, "generator_wants_static_library_dependencies_adjusted", True
        ),
        "generator_wants_sorted_dependencies": getattr(
            generator, "generator_wants_sorted_dependencies", False
        ),
        "generator_filelist_paths": getattr(
            generator, "generator_filelist_paths", None
        ),
    }

    # Process the input specific to this generator.
    result = gyp.input.Load(
        build_files,
        default_variables,
        includes[:],
        depth,
        generator_input_info,
        check,
        circular_check,
        params["parallel"],
        params["root_targets"],
    )
    return [generator] + result


def NameValueListToDict(name_value_list):
    """
  Takes an array of strings of the form 'NAME=VALUE' and creates a dictionary
  of the pairs.  If a string is simply NAME, then the value in the dictionary
  is set to True.  If VALUE can be converted to an integer, it is.
  """
    result = {}
    for item in name_value_list:
        tokens = item.split("=", 1)
        if len(tokens) == 2:
            # If we can make it an int, use that, otherwise, use the string.
            try:
                token_value = int(tokens[1])
            except ValueError:
                token_value = tokens[1]
            # Set the variable to the supplied value.
            result[tokens[0]] = token_value
        else:
            # No value supplied, treat it as a boolean and set it.
            result[tokens[0]] = True
    return result


def ShlexEnv(env_name):
    flags = os.environ.get(env_name, [])
    if flags:
        flags = shlex.split(flags)
    return flags


def FormatOpt(opt, value):
    if opt.startswith("--"):
        return f"{opt}={value}"
    return opt + value


def RegenerateAppendFlag(flag, values, predicate, env_name, options):
    """Regenerate a list of command line flags, for an option of action='append'.

  The |env_name|, if given, is checked in the environment and used to generate
  an initial list of options, then the options that were specified on the
  command line (given in |values|) are appended.  This matches the handling of
  environment variables and command line flags where command line flags override
  the environment, while not requiring the environment to be set when the flags
  are used again.
  """
    flags = []
    if options.use_environment and env_name:
        for flag_value in ShlexEnv(env_name):
            value = FormatOpt(flag, predicate(flag_value))
            if value in flags:
                flags.remove(value)
            flags.append(value)
    if values:
        for flag_value in values:
            flags.append(FormatOpt(flag, predicate(flag_value)))
    return flags


def RegenerateFlags(options):
    """Given a parsed options object, and taking the environment variables into
  account, returns a list of flags that should regenerate an equivalent options
  object (even in the absence of the environment variables.)

  Any path options will be normalized relative to depth.

  The format flag is not included, as it is assumed the calling generator will
  set that as appropriate.
  """

    def FixPath(path):
        path = gyp.common.FixIfRelativePath(path, options.depth)
        if not path:
            return os.path.curdir
        return path

    def Noop(value):
        return value

    # We always want to ignore the environment when regenerating, to avoid
    # duplicate or changed flags in the environment at the time of regeneration.
    flags = ["--ignore-environment"]
    for name, metadata in options._regeneration_metadata.items():
        opt = metadata["opt"]
        value = getattr(options, name)
        value_predicate = metadata["type"] == "path" and FixPath or Noop
        action = metadata["action"]
        env_name = metadata["env_name"]
        if action == "append":
            flags.extend(
                RegenerateAppendFlag(opt, value, value_predicate, env_name, options)
            )
        elif action in ("store", None):  # None is a synonym for 'store'.
            if value:
                flags.append(FormatOpt(opt, value_predicate(value)))
            elif options.use_environment and env_name and os.environ.get(env_name):
                flags.append(FormatOpt(opt, value_predicate(os.environ.get(env_name))))
        elif action in ("store_true", "store_false"):
            if (action == "store_true" and value) or (
                action == "store_false" and not value
            ):
                flags.append(opt)
            elif options.use_environment and env_name:
                print(
                    "Warning: environment regeneration unimplemented "
                    "for %s flag %r env_name %r" % (action, opt, env_name),
                    file=sys.stderr,
                )
        else:
            print(
                "Warning: regeneration unimplemented for action %r "
                "flag %r" % (action, opt),
                file=sys.stderr,
            )

    return flags


class RegeneratableOptionParser(argparse.ArgumentParser):
    def __init__(self, usage):
        self.__regeneratable_options = {}
        argparse.ArgumentParser.__init__(self, usage=usage)

    def add_argument(self, *args, **kw):
        """Add an option to the parser.

    This accepts the same arguments as ArgumentParser.add_argument, plus the
    following:
      regenerate: can be set to False to prevent this option from being included
                  in regeneration.
      env_name: name of environment variable that additional values for this
                option come from.
      type: adds type='path', to tell the regenerator that the values of
            this option need to be made relative to options.depth
    """
        env_name = kw.pop("env_name", None)
        if "dest" in kw and kw.pop("regenerate", True):
            dest = kw["dest"]

            # The path type is needed for regenerating, for optparse we can just treat
            # it as a string.
            type = kw.get("type")
            if type == "path":
                kw["type"] = str

            self.__regeneratable_options[dest] = {
                "action": kw.get("action"),
                "type": type,
                "env_name": env_name,
                "opt": args[0],
            }

        argparse.ArgumentParser.add_argument(self, *args, **kw)

    def parse_args(self, *args):
        values, args = argparse.ArgumentParser.parse_known_args(self, *args)
        values._regeneration_metadata = self.__regeneratable_options
        return values, args


def gyp_main(args):
    my_name = os.path.basename(sys.argv[0])
    usage = "usage: %(prog)s [options ...] [build_file ...]"

    parser = RegeneratableOptionParser(usage=usage.replace("%s", "%(prog)s"))
    parser.add_argument(
        "--build",
        dest="configs",
        action="append",
        help="configuration for build after project generation",
    )
    parser.add_argument(
        "--check", dest="check", action="store_true", help="check format of gyp files"
    )
    parser.add_argument(
        "--config-dir",
        dest="config_dir",
        action="store",
        env_name="GYP_CONFIG_DIR",
        default=None,
        help="The location for configuration files like " "include.gypi.",
    )
    parser.add_argument(
        "-d",
        "--debug",
        dest="debug",
        metavar="DEBUGMODE",
        action="append",
        default=[],
        help="turn on a debugging "
        'mode for debugging GYP.  Supported modes are "variables", '
        '"includes" and "general" or "all" for all of them.',
    )
    parser.add_argument(
        "-D",
        dest="defines",
        action="append",
        metavar="VAR=VAL",
        env_name="GYP_DEFINES",
        help="sets variable VAR to value VAL",
    )
    parser.add_argument(
        "--depth",
        dest="depth",
        metavar="PATH",
        type="path",
        help="set DEPTH gyp variable to a relative path to PATH",
    )
    parser.add_argument(
        "-f",
        "--format",
        dest="formats",
        action="append",
        env_name="GYP_GENERATORS",
        regenerate=False,
        help="output formats to generate",
    )
    parser.add_argument(
        "-G",
        dest="generator_flags",
        action="append",
        default=[],
        metavar="FLAG=VAL",
        env_name="GYP_GENERATOR_FLAGS",
        help="sets generator flag FLAG to VAL",
    )
    parser.add_argument(
        "--generator-output",
        dest="generator_output",
        action="store",
        default=None,
        metavar="DIR",
        type="path",
        env_name="GYP_GENERATOR_OUTPUT",
        help="puts generated build files under DIR",
    )
    parser.add_argument(
        "--ignore-environment",
        dest="use_environment",
        action="store_false",
        default=True,
        regenerate=False,
        help="do not read options from environment variables",
    )
    parser.add_argument(
        "-I",
        "--include",
        dest="includes",
        action="append",
        metavar="INCLUDE",
        type="path",
        help="files to include in all loaded .gyp files",
    )
    # --no-circular-check disables the check for circular relationships between
    # .gyp files.  These relationships should not exist, but they've only been
    # observed to be harmful with the Xcode generator.  Chromium's .gyp files
    # currently have some circular relationships on non-Mac platforms, so this
    # option allows the strict behavior to be used on Macs and the lenient
    # behavior to be used elsewhere.
    # TODO(mark): Remove this option when http://crbug.com/35878 is fixed.
    parser.add_argument(
        "--no-circular-check",
        dest="circular_check",
        action="store_false",
        default=True,
        regenerate=False,
        help="don't check for circular relationships between files",
    )
    parser.add_argument(
        "--no-parallel",
        action="store_true",
        default=False,
        help="Disable multiprocessing",
    )
    parser.add_argument(
        "-S",
        "--suffix",
        dest="suffix",
        default="",
        help="suffix to add to generated files",
    )
    parser.add_argument(
        "--toplevel-dir",
        dest="toplevel_dir",
        action="store",
        default=None,
        metavar="DIR",
        type="path",
        help="directory to use as the root of the source tree",
    )
    parser.add_argument(
        "-R",
        "--root-target",
        dest="root_targets",
        action="append",
        metavar="TARGET",
        help="include only TARGET and its deep dependencies",
    )

    options, build_files_arg = parser.parse_args(args)
    build_files = build_files_arg

    # Set up the configuration directory (defaults to ~/.gyp)
    if not options.config_dir:
        home = None
        home_dot_gyp = None
        if options.use_environment:
            home_dot_gyp = os.environ.get("GYP_CONFIG_DIR", None)
            if home_dot_gyp:
                home_dot_gyp = os.path.expanduser(home_dot_gyp)

        if not home_dot_gyp:
            home_vars = ["HOME"]
            if sys.platform in ("cygwin", "win32"):
                home_vars.append("USERPROFILE")
            for home_var in home_vars:
                home = os.getenv(home_var)
                if home:
                    home_dot_gyp = os.path.join(home, ".gyp")
                    if not os.path.exists(home_dot_gyp):
                        home_dot_gyp = None
                    else:
                        break
    else:
        home_dot_gyp = os.path.expanduser(options.config_dir)

    if home_dot_gyp and not os.path.exists(home_dot_gyp):
        home_dot_gyp = None

    if not options.formats:
        # If no format was given on the command line, then check the env variable.
        generate_formats = []
        if options.use_environment:
            generate_formats = os.environ.get("GYP_GENERATORS", [])
        if generate_formats:
            generate_formats = re.split(r"[\s,]", generate_formats)
        if generate_formats:
            options.formats = generate_formats
        else:
            # Nothing in the variable, default based on platform.
            if sys.platform == "darwin":
                options.formats = ["xcode"]
            elif sys.platform in ("win32", "cygwin"):
                options.formats = ["msvs"]
            else:
                options.formats = ["make"]

    if not options.generator_output and options.use_environment:
        g_o = os.environ.get("GYP_GENERATOR_OUTPUT")
        if g_o:
            options.generator_output = g_o

    options.parallel = not options.no_parallel

    for mode in options.debug:
        gyp.debug[mode] = 1

    # Do an extra check to avoid work when we're not debugging.
    if DEBUG_GENERAL in gyp.debug:
        DebugOutput(DEBUG_GENERAL, "running with these options:")
        for option, value in sorted(options.__dict__.items()):
            if option[0] == "_":
                continue
            if isinstance(value, str):
                DebugOutput(DEBUG_GENERAL, "  %s: '%s'", option, value)
            else:
                DebugOutput(DEBUG_GENERAL, "  %s: %s", option, value)

    if not build_files:
        build_files = FindBuildFiles()
    if not build_files:
        raise GypError((usage + "\n\n%s: error: no build_file") % (my_name, my_name))

    # TODO(mark): Chromium-specific hack!
    # For Chromium, the gyp "depth" variable should always be a relative path
    # to Chromium's top-level "src" directory.  If no depth variable was set
    # on the command line, try to find a "src" directory by looking at the
    # absolute path to each build file's directory.  The first "src" component
    # found will be treated as though it were the path used for --depth.
    if not options.depth:
        for build_file in build_files:
            build_file_dir = os.path.abspath(os.path.dirname(build_file))
            build_file_dir_components = build_file_dir.split(os.path.sep)
            components_len = len(build_file_dir_components)
            for index in range(components_len - 1, -1, -1):
                if build_file_dir_components[index] == "src":
                    options.depth = os.path.sep.join(build_file_dir_components)
                    break
                del build_file_dir_components[index]

            # If the inner loop found something, break without advancing to another
            # build file.
            if options.depth:
                break

        if not options.depth:
            raise GypError(
                "Could not automatically locate src directory.  This is"
                "a temporary Chromium feature that will be removed.  Use"
                "--depth as a workaround."
            )

    # If toplevel-dir is not set, we assume that depth is the root of our source
    # tree.
    if not options.toplevel_dir:
        options.toplevel_dir = options.depth

    # -D on the command line sets variable defaults - D isn't just for define,
    # it's for default.  Perhaps there should be a way to force (-F?) a
    # variable's value so that it can't be overridden by anything else.
    cmdline_default_variables = {}
    defines = []
    if options.use_environment:
        defines += ShlexEnv("GYP_DEFINES")
    if options.defines:
        defines += options.defines
    cmdline_default_variables = NameValueListToDict(defines)
    if DEBUG_GENERAL in gyp.debug:
        DebugOutput(
            DEBUG_GENERAL, "cmdline_default_variables: %s", cmdline_default_variables
        )

    # Set up includes.
    includes = []

    # If ~/.gyp/include.gypi exists, it'll be forcibly included into every
    # .gyp file that's loaded, before anything else is included.
    if home_dot_gyp:
        default_include = os.path.join(home_dot_gyp, "include.gypi")
        if os.path.exists(default_include):
            print("Using overrides found in " + default_include)
            includes.append(default_include)

    # Command-line --include files come after the default include.
    if options.includes:
        includes.extend(options.includes)

    # Generator flags should be prefixed with the target generator since they
    # are global across all generator runs.
    gen_flags = []
    if options.use_environment:
        gen_flags += ShlexEnv("GYP_GENERATOR_FLAGS")
    if options.generator_flags:
        gen_flags += options.generator_flags
    generator_flags = NameValueListToDict(gen_flags)
    if DEBUG_GENERAL in gyp.debug.keys():
        DebugOutput(DEBUG_GENERAL, "generator_flags: %s", generator_flags)

    # Generate all requested formats (use a set in case we got one format request
    # twice)
    for format in set(options.formats):
        params = {
            "options": options,
            "build_files": build_files,
            "generator_flags": generator_flags,
            "cwd": os.getcwd(),
            "build_files_arg": build_files_arg,
            "gyp_binary": sys.argv[0],
            "home_dot_gyp": home_dot_gyp,
            "parallel": options.parallel,
            "root_targets": options.root_targets,
            "target_arch": cmdline_default_variables.get("target_arch", ""),
        }

        # Start with the default variables from the command line.
        [generator, flat_list, targets, data] = Load(
            build_files,
            format,
            cmdline_default_variables,
            includes,
            options.depth,
            params,
            options.check,
            options.circular_check,
        )

        # TODO(mark): Pass |data| for now because the generator needs a list of
        # build files that came in.  In the future, maybe it should just accept
        # a list, and not the whole data dict.
        # NOTE: flat_list is the flattened dependency graph specifying the order
        # that targets may be built.  Build systems that operate serially or that
        # need to have dependencies defined before dependents reference them should
        # generate targets in the order specified in flat_list.
        generator.GenerateOutput(flat_list, targets, data, params)

        if options.configs:
            valid_configs = targets[flat_list[0]]["configurations"]
            for conf in options.configs:
                if conf not in valid_configs:
                    raise GypError("Invalid config specified via --build: %s" % conf)
            generator.PerformBuild(data, options.configs, params)

    # Done
    return 0


def main(args):
    try:
        return gyp_main(args)
    except GypError as e:
        sys.stderr.write("gyp: %s\n" % e)
        return 1


# NOTE: setuptools generated console_scripts calls function with no arguments
def script_main():
    return main(sys.argv[1:])


if __name__ == "__main__":
    sys.exit(script_main())
# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import errno
import filecmp
import os.path
import re
import tempfile
import sys
import subprocess

from collections.abc import MutableSet


# A minimal memoizing decorator. It'll blow up if the args aren't immutable,
# among other "problems".
class memoize:
    def __init__(self, func):
        self.func = func
        self.cache = {}

    def __call__(self, *args):
        try:
            return self.cache[args]
        except KeyError:
            result = self.func(*args)
            self.cache[args] = result
            return result


class GypError(Exception):
    """Error class representing an error, which is to be presented
  to the user.  The main entry point will catch and display this.
  """

    pass


def ExceptionAppend(e, msg):
    """Append a message to the given exception's message."""
    if not e.args:
        e.args = (msg,)
    elif len(e.args) == 1:
        e.args = (str(e.args[0]) + " " + msg,)
    else:
        e.args = (str(e.args[0]) + " " + msg,) + e.args[1:]


def FindQualifiedTargets(target, qualified_list):
    """
  Given a list of qualified targets, return the qualified targets for the
  specified |target|.
  """
    return [t for t in qualified_list if ParseQualifiedTarget(t)[1] == target]


def ParseQualifiedTarget(target):
    # Splits a qualified target into a build file, target name and toolset.

    # NOTE: rsplit is used to disambiguate the Windows drive letter separator.
    target_split = target.rsplit(":", 1)
    if len(target_split) == 2:
        [build_file, target] = target_split
    else:
        build_file = None

    target_split = target.rsplit("#", 1)
    if len(target_split) == 2:
        [target, toolset] = target_split
    else:
        toolset = None

    return [build_file, target, toolset]


def ResolveTarget(build_file, target, toolset):
    # This function resolves a target into a canonical form:
    # - a fully defined build file, either absolute or relative to the current
    # directory
    # - a target name
    # - a toolset
    #
    # build_file is the file relative to which 'target' is defined.
    # target is the qualified target.
    # toolset is the default toolset for that target.
    [parsed_build_file, target, parsed_toolset] = ParseQualifiedTarget(target)

    if parsed_build_file:
        if build_file:
            # If a relative path, parsed_build_file is relative to the directory
            # containing build_file.  If build_file is not in the current directory,
            # parsed_build_file is not a usable path as-is.  Resolve it by
            # interpreting it as relative to build_file.  If parsed_build_file is
            # absolute, it is usable as a path regardless of the current directory,
            # and os.path.join will return it as-is.
            build_file = os.path.normpath(
                os.path.join(os.path.dirname(build_file), parsed_build_file)
            )
            # Further (to handle cases like ../cwd), make it relative to cwd)
            if not os.path.isabs(build_file):
                build_file = RelativePath(build_file, ".")
        else:
            build_file = parsed_build_file

    if parsed_toolset:
        toolset = parsed_toolset

    return [build_file, target, toolset]


def BuildFile(fully_qualified_target):
    # Extracts the build file from the fully qualified target.
    return ParseQualifiedTarget(fully_qualified_target)[0]


def GetEnvironFallback(var_list, default):
    """Look up a key in the environment, with fallback to secondary keys
  and finally falling back to a default value."""
    for var in var_list:
        if var in os.environ:
            return os.environ[var]
    return default


def QualifiedTarget(build_file, target, toolset):
    # "Qualified" means the file that a target was defined in and the target
    # name, separated by a colon, suffixed by a # and the toolset name:
    # /path/to/file.gyp:target_name#toolset
    fully_qualified = build_file + ":" + target
    if toolset:
        fully_qualified = fully_qualified + "#" + toolset
    return fully_qualified


@memoize
def RelativePath(path, relative_to, follow_path_symlink=True):
    # Assuming both |path| and |relative_to| are relative to the current
    # directory, returns a relative path that identifies path relative to
    # relative_to.
    # If |follow_symlink_path| is true (default) and |path| is a symlink, then
    # this method returns a path to the real file represented by |path|. If it is
    # false, this method returns a path to the symlink. If |path| is not a
    # symlink, this option has no effect.

    # Convert to normalized (and therefore absolute paths).
    if follow_path_symlink:
        path = os.path.realpath(path)
    else:
        path = os.path.abspath(path)
    relative_to = os.path.realpath(relative_to)

    # On Windows, we can't create a relative path to a different drive, so just
    # use the absolute path.
    if sys.platform == "win32":
        if (
            os.path.splitdrive(path)[0].lower()
            != os.path.splitdrive(relative_to)[0].lower()
        ):
            return path

    # Split the paths into components.
    path_split = path.split(os.path.sep)
    relative_to_split = relative_to.split(os.path.sep)

    # Determine how much of the prefix the two paths share.
    prefix_len = len(os.path.commonprefix([path_split, relative_to_split]))

    # Put enough ".." components to back up out of relative_to to the common
    # prefix, and then append the part of path_split after the common prefix.
    relative_split = [os.path.pardir] * (
        len(relative_to_split) - prefix_len
    ) + path_split[prefix_len:]

    if len(relative_split) == 0:
        # The paths were the same.
        return ""

    # Turn it back into a string and we're done.
    return os.path.join(*relative_split)


@memoize
def InvertRelativePath(path, toplevel_dir=None):
    """Given a path like foo/bar that is relative to toplevel_dir, return
  the inverse relative path back to the toplevel_dir.

  E.g. os.path.normpath(os.path.join(path, InvertRelativePath(path)))
  should always produce the empty string, unless the path contains symlinks.
  """
    if not path:
        return path
    toplevel_dir = "." if toplevel_dir is None else toplevel_dir
    return RelativePath(toplevel_dir, os.path.join(toplevel_dir, path))


def FixIfRelativePath(path, relative_to):
    # Like RelativePath but returns |path| unchanged if it is absolute.
    if os.path.isabs(path):
        return path
    return RelativePath(path, relative_to)


def UnrelativePath(path, relative_to):
    # Assuming that |relative_to| is relative to the current directory, and |path|
    # is a path relative to the dirname of |relative_to|, returns a path that
    # identifies |path| relative to the current directory.
    rel_dir = os.path.dirname(relative_to)
    return os.path.normpath(os.path.join(rel_dir, path))


# re objects used by EncodePOSIXShellArgument.  See IEEE 1003.1 XCU.2.2 at
# http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_02
# and the documentation for various shells.

# _quote is a pattern that should match any argument that needs to be quoted
# with double-quotes by EncodePOSIXShellArgument.  It matches the following
# characters appearing anywhere in an argument:
#   \t, \n, space  parameter separators
#   #              comments
#   $              expansions (quoted to always expand within one argument)
#   %              called out by IEEE 1003.1 XCU.2.2
#   &              job control
#   '              quoting
#   (, )           subshell execution
#   *, ?, [        pathname expansion
#   ;              command delimiter
#   <, >, |        redirection
#   =              assignment
#   {, }           brace expansion (bash)
#   ~              tilde expansion
# It also matches the empty string, because "" (or '') is the only way to
# represent an empty string literal argument to a POSIX shell.
#
# This does not match the characters in _escape, because those need to be
# backslash-escaped regardless of whether they appear in a double-quoted
# string.
_quote = re.compile("[\t\n #$%&'()*;<=>?[{|}~]|^$")

# _escape is a pattern that should match any character that needs to be
# escaped with a backslash, whether or not the argument matched the _quote
# pattern.  _escape is used with re.sub to backslash anything in _escape's
# first match group, hence the (parentheses) in the regular expression.
#
# _escape matches the following characters appearing anywhere in an argument:
#   "  to prevent POSIX shells from interpreting this character for quoting
#   \  to prevent POSIX shells from interpreting this character for escaping
#   `  to prevent POSIX shells from interpreting this character for command
#      substitution
# Missing from this list is $, because the desired behavior of
# EncodePOSIXShellArgument is to permit parameter (variable) expansion.
#
# Also missing from this list is !, which bash will interpret as the history
# expansion character when history is enabled.  bash does not enable history
# by default in non-interactive shells, so this is not thought to be a problem.
# ! was omitted from this list because bash interprets "\!" as a literal string
# including the backslash character (avoiding history expansion but retaining
# the backslash), which would not be correct for argument encoding.  Handling
# this case properly would also be problematic because bash allows the history
# character to be changed with the histchars shell variable.  Fortunately,
# as history is not enabled in non-interactive shells and
# EncodePOSIXShellArgument is only expected to encode for non-interactive
# shells, there is no room for error here by ignoring !.
_escape = re.compile(r'(["\\`])')


def EncodePOSIXShellArgument(argument):
    """Encodes |argument| suitably for consumption by POSIX shells.

  argument may be quoted and escaped as necessary to ensure that POSIX shells
  treat the returned value as a literal representing the argument passed to
  this function.  Parameter (variable) expansions beginning with $ are allowed
  to remain intact without escaping the $, to allow the argument to contain
  references to variables to be expanded by the shell.
  """

    if not isinstance(argument, str):
        argument = str(argument)

    if _quote.search(argument):
        quote = '"'
    else:
        quote = ""

    encoded = quote + re.sub(_escape, r"\\\1", argument) + quote

    return encoded


def EncodePOSIXShellList(list):
    """Encodes |list| suitably for consumption by POSIX shells.

  Returns EncodePOSIXShellArgument for each item in list, and joins them
  together using the space character as an argument separator.
  """

    encoded_arguments = []
    for argument in list:
        encoded_arguments.append(EncodePOSIXShellArgument(argument))
    return " ".join(encoded_arguments)


def DeepDependencyTargets(target_dicts, roots):
    """Returns the recursive list of target dependencies."""
    dependencies = set()
    pending = set(roots)
    while pending:
        # Pluck out one.
        r = pending.pop()
        # Skip if visited already.
        if r in dependencies:
            continue
        # Add it.
        dependencies.add(r)
        # Add its children.
        spec = target_dicts[r]
        pending.update(set(spec.get("dependencies", [])))
        pending.update(set(spec.get("dependencies_original", [])))
    return list(dependencies - set(roots))


def BuildFileTargets(target_list, build_file):
    """From a target_list, returns the subset from the specified build_file.
  """
    return [p for p in target_list if BuildFile(p) == build_file]


def AllTargets(target_list, target_dicts, build_file):
    """Returns all targets (direct and dependencies) for the specified build_file.
  """
    bftargets = BuildFileTargets(target_list, build_file)
    deptargets = DeepDependencyTargets(target_dicts, bftargets)
    return bftargets + deptargets


def WriteOnDiff(filename):
    """Write to a file only if the new contents differ.

  Arguments:
    filename: name of the file to potentially write to.
  Returns:
    A file like object which will write to temporary file and only overwrite
    the target if it differs (on close).
  """

    class Writer:
        """Wrapper around file which only covers the target if it differs."""

        def __init__(self):
            # On Cygwin remove the "dir" argument
            # `C:` prefixed paths are treated as relative,
            # consequently ending up with current dir "/cygdrive/c/..."
            # being prefixed to those, which was
            # obviously a non-existent path,
            # for example: "/cygdrive/c/<some folder>/C:\<my win style abs path>".
            # For more details see:
            # https://docs.python.org/2/library/tempfile.html#tempfile.mkstemp
            base_temp_dir = "" if IsCygwin() else os.path.dirname(filename)
            # Pick temporary file.
            tmp_fd, self.tmp_path = tempfile.mkstemp(
                suffix=".tmp",
                prefix=os.path.split(filename)[1] + ".gyp.",
                dir=base_temp_dir,
            )
            try:
                self.tmp_file = os.fdopen(tmp_fd, "wb")
            except Exception:
                # Don't leave turds behind.
                os.unlink(self.tmp_path)
                raise

        def __getattr__(self, attrname):
            # Delegate everything else to self.tmp_file
            return getattr(self.tmp_file, attrname)

        def close(self):
            try:
                # Close tmp file.
                self.tmp_file.close()
                # Determine if different.
                same = False
                try:
                    same = filecmp.cmp(self.tmp_path, filename, False)
                except OSError as e:
                    if e.errno != errno.ENOENT:
                        raise

                if same:
                    # The new file is identical to the old one, just get rid of the new
                    # one.
                    os.unlink(self.tmp_path)
                else:
                    # The new file is different from the old one,
                    # or there is no old one.
                    # Rename the new file to the permanent name.
                    #
                    # tempfile.mkstemp uses an overly restrictive mode, resulting in a
                    # file that can only be read by the owner, regardless of the umask.
                    # There's no reason to not respect the umask here,
                    # which means that an extra hoop is required
                    # to fetch it and reset the new file's mode.
                    #
                    # No way to get the umask without setting a new one?  Set a safe one
                    # and then set it back to the old value.
                    umask = os.umask(0o77)
                    os.umask(umask)
                    os.chmod(self.tmp_path, 0o666 & ~umask)
                    if sys.platform == "win32" and os.path.exists(filename):
                        # NOTE: on windows (but not cygwin) rename will not replace an
                        # existing file, so it must be preceded with a remove.
                        # Sadly there is no way to make the switch atomic.
                        os.remove(filename)
                    os.rename(self.tmp_path, filename)
            except Exception:
                # Don't leave turds behind.
                os.unlink(self.tmp_path)
                raise

        def write(self, s):
            self.tmp_file.write(s.encode("utf-8"))

    return Writer()


def EnsureDirExists(path):
    """Make sure the directory for |path| exists."""
    try:
        os.makedirs(os.path.dirname(path))
    except OSError:
        pass


def GetFlavor(params):
    """Returns |params.flavor| if it's set, the system's default flavor else."""
    flavors = {
        "cygwin": "win",
        "win32": "win",
        "darwin": "mac",
    }

    if "flavor" in params:
        return params["flavor"]
    if sys.platform in flavors:
        return flavors[sys.platform]
    if sys.platform.startswith("sunos"):
        return "solaris"
    if sys.platform.startswith(("dragonfly", "freebsd")):
        return "freebsd"
    if sys.platform.startswith("openbsd"):
        return "openbsd"
    if sys.platform.startswith("netbsd"):
        return "netbsd"
    if sys.platform.startswith("aix"):
        return "aix"
    if sys.platform.startswith(("os390", "zos")):
        return "zos"

    return "linux"


def CopyTool(flavor, out_path, generator_flags={}):
    """Finds (flock|mac|win)_tool.gyp in the gyp directory and copies it
  to |out_path|."""
    # aix and solaris just need flock emulation. mac and win use more complicated
    # support scripts.
    prefix = {"aix": "flock", "solaris": "flock", "mac": "mac", "win": "win"}.get(
        flavor, None
    )
    if not prefix:
        return

    # Slurp input file.
    source_path = os.path.join(
        os.path.dirname(os.path.abspath(__file__)), "%s_tool.py" % prefix
    )
    with open(source_path) as source_file:
        source = source_file.readlines()

    # Set custom header flags.
    header = "# Generated by gyp. Do not edit.\n"
    mac_toolchain_dir = generator_flags.get("mac_toolchain_dir", None)
    if flavor == "mac" and mac_toolchain_dir:
        header += "import os;\nos.environ['DEVELOPER_DIR']='%s'\n" % mac_toolchain_dir

    # Add header and write it out.
    tool_path = os.path.join(out_path, "gyp-%s-tool" % prefix)
    with open(tool_path, "w") as tool_file:
        tool_file.write("".join([source[0], header] + source[1:]))

    # Make file executable.
    os.chmod(tool_path, 0o755)


# From Alex Martelli,
# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52560
# ASPN: Python Cookbook: Remove duplicates from a sequence
# First comment, dated 2001/10/13.
# (Also in the printed Python Cookbook.)


def uniquer(seq, idfun=lambda x: x):
    seen = {}
    result = []
    for item in seq:
        marker = idfun(item)
        if marker in seen:
            continue
        seen[marker] = 1
        result.append(item)
    return result


# Based on http://code.activestate.com/recipes/576694/.
class OrderedSet(MutableSet):
    def __init__(self, iterable=None):
        self.end = end = []
        end += [None, end, end]  # sentinel node for doubly linked list
        self.map = {}  # key --> [key, prev, next]
        if iterable is not None:
            self |= iterable

    def __len__(self):
        return len(self.map)

    def __contains__(self, key):
        return key in self.map

    def add(self, key):
        if key not in self.map:
            end = self.end
            curr = end[1]
            curr[2] = end[1] = self.map[key] = [key, curr, end]

    def discard(self, key):
        if key in self.map:
            key, prev_item, next_item = self.map.pop(key)
            prev_item[2] = next_item
            next_item[1] = prev_item

    def __iter__(self):
        end = self.end
        curr = end[2]
        while curr is not end:
            yield curr[0]
            curr = curr[2]

    def __reversed__(self):
        end = self.end
        curr = end[1]
        while curr is not end:
            yield curr[0]
            curr = curr[1]

    # The second argument is an addition that causes a pylint warning.
    def pop(self, last=True):  # pylint: disable=W0221
        if not self:
            raise KeyError("set is empty")
        key = self.end[1][0] if last else self.end[2][0]
        self.discard(key)
        return key

    def __repr__(self):
        if not self:
            return f"{self.__class__.__name__}()"
        return f"{self.__class__.__name__}({list(self)!r})"

    def __eq__(self, other):
        if isinstance(other, OrderedSet):
            return len(self) == len(other) and list(self) == list(other)
        return set(self) == set(other)

    # Extensions to the recipe.
    def update(self, iterable):
        for i in iterable:
            if i not in self:
                self.add(i)


class CycleError(Exception):
    """An exception raised when an unexpected cycle is detected."""

    def __init__(self, nodes):
        self.nodes = nodes

    def __str__(self):
        return "CycleError: cycle involving: " + str(self.nodes)


def TopologicallySorted(graph, get_edges):
    r"""Topologically sort based on a user provided edge definition.

  Args:
    graph: A list of node names.
    get_edges: A function mapping from node name to a hashable collection
               of node names which this node has outgoing edges to.
  Returns:
    A list containing all of the node in graph in topological order.
    It is assumed that calling get_edges once for each node and caching is
    cheaper than repeatedly calling get_edges.
  Raises:
    CycleError in the event of a cycle.
  Example:
    graph = {'a': '$(b) $(c)', 'b': 'hi', 'c': '$(b)'}
    def GetEdges(node):
      return re.findall(r'\$\(([^))]\)', graph[node])
    print TopologicallySorted(graph.keys(), GetEdges)
    ==>
    ['a', 'c', b']
  """
    get_edges = memoize(get_edges)
    visited = set()
    visiting = set()
    ordered_nodes = []

    def Visit(node):
        if node in visiting:
            raise CycleError(visiting)
        if node in visited:
            return
        visited.add(node)
        visiting.add(node)
        for neighbor in get_edges(node):
            Visit(neighbor)
        visiting.remove(node)
        ordered_nodes.insert(0, node)

    for node in sorted(graph):
        Visit(node)
    return ordered_nodes


def CrossCompileRequested():
    # TODO: figure out how to not build extra host objects in the
    # non-cross-compile case when this is enabled, and enable unconditionally.
    return (
        os.environ.get("GYP_CROSSCOMPILE")
        or os.environ.get("AR_host")
        or os.environ.get("CC_host")
        or os.environ.get("CXX_host")
        or os.environ.get("AR_target")
        or os.environ.get("CC_target")
        or os.environ.get("CXX_target")
    )


def IsCygwin():
    try:
        out = subprocess.Popen(
            "uname", stdout=subprocess.PIPE, stderr=subprocess.STDOUT
        )
        stdout = out.communicate()[0].decode("utf-8")
        return "CYGWIN" in str(stdout)
    except Exception:
        return False
#!/usr/bin/env python3

# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Unit tests for the common.py file."""

import gyp.common
import unittest
import sys


class TestTopologicallySorted(unittest.TestCase):
    def test_Valid(self):
        """Test that sorting works on a valid graph with one possible order."""
        graph = {
            "a": ["b", "c"],
            "b": [],
            "c": ["d"],
            "d": ["b"],
        }

        def GetEdge(node):
            return tuple(graph[node])

        self.assertEqual(
            gyp.common.TopologicallySorted(graph.keys(), GetEdge), ["a", "c", "d", "b"]
        )

    def test_Cycle(self):
        """Test that an exception is thrown on a cyclic graph."""
        graph = {
            "a": ["b"],
            "b": ["c"],
            "c": ["d"],
            "d": ["a"],
        }

        def GetEdge(node):
            return tuple(graph[node])

        self.assertRaises(
            gyp.common.CycleError, gyp.common.TopologicallySorted, graph.keys(), GetEdge
        )


class TestGetFlavor(unittest.TestCase):
    """Test that gyp.common.GetFlavor works as intended"""

    original_platform = ""

    def setUp(self):
        self.original_platform = sys.platform

    def tearDown(self):
        sys.platform = self.original_platform

    def assertFlavor(self, expected, argument, param):
        sys.platform = argument
        self.assertEqual(expected, gyp.common.GetFlavor(param))

    def test_platform_default(self):
        self.assertFlavor("freebsd", "freebsd9", {})
        self.assertFlavor("freebsd", "freebsd10", {})
        self.assertFlavor("openbsd", "openbsd5", {})
        self.assertFlavor("solaris", "sunos5", {})
        self.assertFlavor("solaris", "sunos", {})
        self.assertFlavor("linux", "linux2", {})
        self.assertFlavor("linux", "linux3", {})
        self.assertFlavor("linux", "linux", {})

    def test_param(self):
        self.assertFlavor("foobar", "linux2", {"flavor": "foobar"})


if __name__ == "__main__":
    unittest.main()
# Copyright (c) 2011 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import sys
import re
import os
import locale
from functools import reduce


def XmlToString(content, encoding="utf-8", pretty=False):
    """ Writes the XML content to disk, touching the file only if it has changed.

  Visual Studio files have a lot of pre-defined structures.  This function makes
  it easy to represent these structures as Python data structures, instead of
  having to create a lot of function calls.

  Each XML element of the content is represented as a list composed of:
  1. The name of the element, a string,
  2. The attributes of the element, a dictionary (optional), and
  3+. The content of the element, if any.  Strings are simple text nodes and
      lists are child elements.

  Example 1:
      <test/>
  becomes
      ['test']

  Example 2:
      <myelement a='value1' b='value2'>
         <childtype>This is</childtype>
         <childtype>it!</childtype>
      </myelement>

  becomes
      ['myelement', {'a':'value1', 'b':'value2'},
         ['childtype', 'This is'],
         ['childtype', 'it!'],
      ]

  Args:
    content:  The structured content to be converted.
    encoding: The encoding to report on the first XML line.
    pretty: True if we want pretty printing with indents and new lines.

  Returns:
    The XML content as a string.
  """
    # We create a huge list of all the elements of the file.
    xml_parts = ['<?xml version="1.0" encoding="%s"?>' % encoding]
    if pretty:
        xml_parts.append("\n")
    _ConstructContentList(xml_parts, content, pretty)

    # Convert it to a string
    return "".join(xml_parts)


def _ConstructContentList(xml_parts, specification, pretty, level=0):
    """ Appends the XML parts corresponding to the specification.

  Args:
    xml_parts: A list of XML parts to be appended to.
    specification:  The specification of the element.  See EasyXml docs.
    pretty: True if we want pretty printing with indents and new lines.
    level: Indentation level.
  """
    # The first item in a specification is the name of the element.
    if pretty:
        indentation = "  " * level
        new_line = "\n"
    else:
        indentation = ""
        new_line = ""
    name = specification[0]
    if not isinstance(name, str):
        raise Exception(
            "The first item of an EasyXml specification should be "
            "a string.  Specification was " + str(specification)
        )
    xml_parts.append(indentation + "<" + name)

    # Optionally in second position is a dictionary of the attributes.
    rest = specification[1:]
    if rest and isinstance(rest[0], dict):
        for at, val in sorted(rest[0].items()):
            xml_parts.append(f' {at}="{_XmlEscape(val, attr=True)}"')
        rest = rest[1:]
    if rest:
        xml_parts.append(">")
        all_strings = reduce(lambda x, y: x and isinstance(y, str), rest, True)
        multi_line = not all_strings
        if multi_line and new_line:
            xml_parts.append(new_line)
        for child_spec in rest:
            # If it's a string, append a text node.
            # Otherwise recurse over that child definition
            if isinstance(child_spec, str):
                xml_parts.append(_XmlEscape(child_spec))
            else:
                _ConstructContentList(xml_parts, child_spec, pretty, level + 1)
        if multi_line and indentation:
            xml_parts.append(indentation)
        xml_parts.append(f"</{name}>{new_line}")
    else:
        xml_parts.append("/>%s" % new_line)


def WriteXmlIfChanged(content, path, encoding="utf-8", pretty=False,
                      win32=(sys.platform == "win32")):
    """ Writes the XML content to disk, touching the file only if it has changed.

  Args:
    content:  The structured content to be written.
    path: Location of the file.
    encoding: The encoding to report on the first line of the XML file.
    pretty: True if we want pretty printing with indents and new lines.
  """
    xml_string = XmlToString(content, encoding, pretty)
    if win32 and os.linesep != "\r\n":
        xml_string = xml_string.replace("\n", "\r\n")

    default_encoding = locale.getdefaultlocale()[1]
    if default_encoding and default_encoding.upper() != encoding.upper():
        xml_string = xml_string.encode(encoding)

    # Get the old content
    try:
        with open(path) as file:
            existing = file.read()
    except OSError:
        existing = None

    # It has changed, write it
    if existing != xml_string:
        with open(path, "wb") as file:
            file.write(xml_string)


_xml_escape_map = {
    '"': "&quot;",
    "'": "&apos;",
    "<": "&lt;",
    ">": "&gt;",
    "&": "&amp;",
    "\n": "&#xA;",
    "\r": "&#xD;",
}


_xml_escape_re = re.compile("(%s)" % "|".join(map(re.escape, _xml_escape_map.keys())))


def _XmlEscape(value, attr=False):
    """ Escape a string for inclusion in XML."""

    def replace(match):
        m = match.string[match.start() : match.end()]
        # don't replace single quotes in attrs
        if attr and m == "'":
            return m
        return _xml_escape_map[m]

    return _xml_escape_re.sub(replace, value)
#!/usr/bin/env python3

# Copyright (c) 2011 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

""" Unit tests for the easy_xml.py file. """

import gyp.easy_xml as easy_xml
import unittest

from io import StringIO


class TestSequenceFunctions(unittest.TestCase):
    def setUp(self):
        self.stderr = StringIO()

    def test_EasyXml_simple(self):
        self.assertEqual(
            easy_xml.XmlToString(["test"]),
            '<?xml version="1.0" encoding="utf-8"?><test/>',
        )

        self.assertEqual(
            easy_xml.XmlToString(["test"], encoding="Windows-1252"),
            '<?xml version="1.0" encoding="Windows-1252"?><test/>',
        )

    def test_EasyXml_simple_with_attributes(self):
        self.assertEqual(
            easy_xml.XmlToString(["test2", {"a": "value1", "b": "value2"}]),
            '<?xml version="1.0" encoding="utf-8"?><test2 a="value1" b="value2"/>',
        )

    def test_EasyXml_escaping(self):
        original = "<test>'\"\r&\nfoo"
        converted = "&lt;test&gt;'&quot;&#xD;&amp;&#xA;foo"
        converted_apos = converted.replace("'", "&apos;")
        self.assertEqual(
            easy_xml.XmlToString(["test3", {"a": original}, original]),
            '<?xml version="1.0" encoding="utf-8"?><test3 a="%s">%s</test3>'
            % (converted, converted_apos),
        )

    def test_EasyXml_pretty(self):
        self.assertEqual(
            easy_xml.XmlToString(
                ["test3", ["GrandParent", ["Parent1", ["Child"]], ["Parent2"]]],
                pretty=True,
            ),
            '<?xml version="1.0" encoding="utf-8"?>\n'
            "<test3>\n"
            "  <GrandParent>\n"
            "    <Parent1>\n"
            "      <Child/>\n"
            "    </Parent1>\n"
            "    <Parent2/>\n"
            "  </GrandParent>\n"
            "</test3>\n",
        )

    def test_EasyXml_complex(self):
        # We want to create:
        target = (
            '<?xml version="1.0" encoding="utf-8"?>'
            "<Project>"
            '<PropertyGroup Label="Globals">'
            "<ProjectGuid>{D2250C20-3A94-4FB9-AF73-11BC5B73884B}</ProjectGuid>"
            "<Keyword>Win32Proj</Keyword>"
            "<RootNamespace>automated_ui_tests</RootNamespace>"
            "</PropertyGroup>"
            '<Import Project="$(VCTargetsPath)\\Microsoft.Cpp.props"/>'
            "<PropertyGroup "
            "Condition=\"'$(Configuration)|$(Platform)'=="
            '\'Debug|Win32\'" Label="Configuration">'
            "<ConfigurationType>Application</ConfigurationType>"
            "<CharacterSet>Unicode</CharacterSet>"
            "</PropertyGroup>"
            "</Project>"
        )

        xml = easy_xml.XmlToString(
            [
                "Project",
                [
                    "PropertyGroup",
                    {"Label": "Globals"},
                    ["ProjectGuid", "{D2250C20-3A94-4FB9-AF73-11BC5B73884B}"],
                    ["Keyword", "Win32Proj"],
                    ["RootNamespace", "automated_ui_tests"],
                ],
                ["Import", {"Project": "$(VCTargetsPath)\\Microsoft.Cpp.props"}],
                [
                    "PropertyGroup",
                    {
                        "Condition": "'$(Configuration)|$(Platform)'=='Debug|Win32'",
                        "Label": "Configuration",
                    },
                    ["ConfigurationType", "Application"],
                    ["CharacterSet", "Unicode"],
                ],
            ]
        )
        self.assertEqual(xml, target)


if __name__ == "__main__":
    unittest.main()
#!/usr/bin/env python3
# Copyright (c) 2011 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""These functions are executed via gyp-flock-tool when using the Makefile
generator.  Used on systems that don't have a built-in flock."""

import fcntl
import os
import struct
import subprocess
import sys


def main(args):
    executor = FlockTool()
    executor.Dispatch(args)


class FlockTool:
    """This class emulates the 'flock' command."""

    def Dispatch(self, args):
        """Dispatches a string command to a method."""
        if len(args) < 1:
            raise Exception("Not enough arguments")

        method = "Exec%s" % self._CommandifyName(args[0])
        getattr(self, method)(*args[1:])

    def _CommandifyName(self, name_string):
        """Transforms a tool name like copy-info-plist to CopyInfoPlist"""
        return name_string.title().replace("-", "")

    def ExecFlock(self, lockfile, *cmd_list):
        """Emulates the most basic behavior of Linux's flock(1)."""
        # Rely on exception handling to report errors.
        # Note that the stock python on SunOS has a bug
        # where fcntl.flock(fd, LOCK_EX) always fails
        # with EBADF, that's why we use this F_SETLK
        # hack instead.
        fd = os.open(lockfile, os.O_WRONLY | os.O_NOCTTY | os.O_CREAT, 0o666)
        if sys.platform.startswith("aix"):
            # Python on AIX is compiled with LARGEFILE support, which changes the
            # struct size.
            op = struct.pack("hhIllqq", fcntl.F_WRLCK, 0, 0, 0, 0, 0, 0)
        else:
            op = struct.pack("hhllhhl", fcntl.F_WRLCK, 0, 0, 0, 0, 0, 0)
        fcntl.fcntl(fd, fcntl.F_SETLK, op)
        return subprocess.call(cmd_list)


if __name__ == "__main__":
    sys.exit(main(sys.argv[1:]))
# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.


import ast

import gyp.common
import gyp.simple_copy
import multiprocessing
import os.path
import re
import shlex
import signal
import subprocess
import sys
import threading
import traceback
from distutils.version import StrictVersion
from gyp.common import GypError
from gyp.common import OrderedSet

# A list of types that are treated as linkable.
linkable_types = [
    "executable",
    "shared_library",
    "loadable_module",
    "mac_kernel_extension",
    "windows_driver",
]

# A list of sections that contain links to other targets.
dependency_sections = ["dependencies", "export_dependent_settings"]

# base_path_sections is a list of sections defined by GYP that contain
# pathnames.  The generators can provide more keys, the two lists are merged
# into path_sections, but you should call IsPathSection instead of using either
# list directly.
base_path_sections = [
    "destination",
    "files",
    "include_dirs",
    "inputs",
    "libraries",
    "outputs",
    "sources",
]
path_sections = set()

# These per-process dictionaries are used to cache build file data when loading
# in parallel mode.
per_process_data = {}
per_process_aux_data = {}


def IsPathSection(section):
    # If section ends in one of the '=+?!' characters, it's applied to a section
    # without the trailing characters.  '/' is notably absent from this list,
    # because there's no way for a regular expression to be treated as a path.
    while section and section[-1:] in "=+?!":
        section = section[:-1]

    if section in path_sections:
        return True

    # Sections matching the regexp '_(dir|file|path)s?$' are also
    # considered PathSections. Using manual string matching since that
    # is much faster than the regexp and this can be called hundreds of
    # thousands of times so micro performance matters.
    if "_" in section:
        tail = section[-6:]
        if tail[-1] == "s":
            tail = tail[:-1]
        if tail[-5:] in ("_file", "_path"):
            return True
        return tail[-4:] == "_dir"

    return False


# base_non_configuration_keys is a list of key names that belong in the target
# itself and should not be propagated into its configurations.  It is merged
# with a list that can come from the generator to
# create non_configuration_keys.
base_non_configuration_keys = [
    # Sections that must exist inside targets and not configurations.
    "actions",
    "configurations",
    "copies",
    "default_configuration",
    "dependencies",
    "dependencies_original",
    "libraries",
    "postbuilds",
    "product_dir",
    "product_extension",
    "product_name",
    "product_prefix",
    "rules",
    "run_as",
    "sources",
    "standalone_static_library",
    "suppress_wildcard",
    "target_name",
    "toolset",
    "toolsets",
    "type",
    # Sections that can be found inside targets or configurations, but that
    # should not be propagated from targets into their configurations.
    "variables",
]
non_configuration_keys = []

# Keys that do not belong inside a configuration dictionary.
invalid_configuration_keys = [
    "actions",
    "all_dependent_settings",
    "configurations",
    "dependencies",
    "direct_dependent_settings",
    "libraries",
    "link_settings",
    "sources",
    "standalone_static_library",
    "target_name",
    "type",
]

# Controls whether or not the generator supports multiple toolsets.
multiple_toolsets = False

# Paths for converting filelist paths to output paths: {
#   toplevel,
#   qualified_output_dir,
# }
generator_filelist_paths = None


def GetIncludedBuildFiles(build_file_path, aux_data, included=None):
    """Return a list of all build files included into build_file_path.

  The returned list will contain build_file_path as well as all other files
  that it included, either directly or indirectly.  Note that the list may
  contain files that were included into a conditional section that evaluated
  to false and was not merged into build_file_path's dict.

  aux_data is a dict containing a key for each build file or included build
  file.  Those keys provide access to dicts whose "included" keys contain
  lists of all other files included by the build file.

  included should be left at its default None value by external callers.  It
  is used for recursion.

  The returned list will not contain any duplicate entries.  Each build file
  in the list will be relative to the current directory.
  """

    if included is None:
        included = []

    if build_file_path in included:
        return included

    included.append(build_file_path)

    for included_build_file in aux_data[build_file_path].get("included", []):
        GetIncludedBuildFiles(included_build_file, aux_data, included)

    return included


def CheckedEval(file_contents):
    """Return the eval of a gyp file.
  The gyp file is restricted to dictionaries and lists only, and
  repeated keys are not allowed.
  Note that this is slower than eval() is.
  """

    syntax_tree = ast.parse(file_contents)
    assert isinstance(syntax_tree, ast.Module)
    c1 = syntax_tree.body
    assert len(c1) == 1
    c2 = c1[0]
    assert isinstance(c2, ast.Expr)
    return CheckNode(c2.value, [])


def CheckNode(node, keypath):
    if isinstance(node, ast.Dict):
        dict = {}
        for key, value in zip(node.keys, node.values):
            assert isinstance(key, ast.Str)
            key = key.s
            if key in dict:
                raise GypError(
                    "Key '"
                    + key
                    + "' repeated at level "
                    + repr(len(keypath) + 1)
                    + " with key path '"
                    + ".".join(keypath)
                    + "'"
                )
            kp = list(keypath)  # Make a copy of the list for descending this node.
            kp.append(key)
            dict[key] = CheckNode(value, kp)
        return dict
    elif isinstance(node, ast.List):
        children = []
        for index, child in enumerate(node.elts):
            kp = list(keypath)  # Copy list.
            kp.append(repr(index))
            children.append(CheckNode(child, kp))
        return children
    elif isinstance(node, ast.Str):
        return node.s
    else:
        raise TypeError(
            "Unknown AST node at key path '" + ".".join(keypath) + "': " + repr(node)
        )


def LoadOneBuildFile(build_file_path, data, aux_data, includes, is_target, check):
    if build_file_path in data:
        return data[build_file_path]

    if os.path.exists(build_file_path):
        build_file_contents = open(build_file_path, encoding='utf-8').read()
    else:
        raise GypError(f"{build_file_path} not found (cwd: {os.getcwd()})")

    build_file_data = None
    try:
        if check:
            build_file_data = CheckedEval(build_file_contents)
        else:
            build_file_data = eval(build_file_contents, {"__builtins__": {}}, None)
    except SyntaxError as e:
        e.filename = build_file_path
        raise
    except Exception as e:
        gyp.common.ExceptionAppend(e, "while reading " + build_file_path)
        raise

    if type(build_file_data) is not dict:
        raise GypError("%s does not evaluate to a dictionary." % build_file_path)

    data[build_file_path] = build_file_data
    aux_data[build_file_path] = {}

    # Scan for includes and merge them in.
    if "skip_includes" not in build_file_data or not build_file_data["skip_includes"]:
        try:
            if is_target:
                LoadBuildFileIncludesIntoDict(
                    build_file_data, build_file_path, data, aux_data, includes, check
                )
            else:
                LoadBuildFileIncludesIntoDict(
                    build_file_data, build_file_path, data, aux_data, None, check
                )
        except Exception as e:
            gyp.common.ExceptionAppend(
                e, "while reading includes of " + build_file_path
            )
            raise

    return build_file_data


def LoadBuildFileIncludesIntoDict(
    subdict, subdict_path, data, aux_data, includes, check
):
    includes_list = []
    if includes is not None:
        includes_list.extend(includes)
    if "includes" in subdict:
        for include in subdict["includes"]:
            # "include" is specified relative to subdict_path, so compute the real
            # path to include by appending the provided "include" to the directory
            # in which subdict_path resides.
            relative_include = os.path.normpath(
                os.path.join(os.path.dirname(subdict_path), include)
            )
            includes_list.append(relative_include)
        # Unhook the includes list, it's no longer needed.
        del subdict["includes"]

    # Merge in the included files.
    for include in includes_list:
        if "included" not in aux_data[subdict_path]:
            aux_data[subdict_path]["included"] = []
        aux_data[subdict_path]["included"].append(include)

        gyp.DebugOutput(gyp.DEBUG_INCLUDES, "Loading Included File: '%s'", include)

        MergeDicts(
            subdict,
            LoadOneBuildFile(include, data, aux_data, None, False, check),
            subdict_path,
            include,
        )

    # Recurse into subdictionaries.
    for k, v in subdict.items():
        if type(v) is dict:
            LoadBuildFileIncludesIntoDict(v, subdict_path, data, aux_data, None, check)
        elif type(v) is list:
            LoadBuildFileIncludesIntoList(v, subdict_path, data, aux_data, check)


# This recurses into lists so that it can look for dicts.
def LoadBuildFileIncludesIntoList(sublist, sublist_path, data, aux_data, check):
    for item in sublist:
        if type(item) is dict:
            LoadBuildFileIncludesIntoDict(
                item, sublist_path, data, aux_data, None, check
            )
        elif type(item) is list:
            LoadBuildFileIncludesIntoList(item, sublist_path, data, aux_data, check)


# Processes toolsets in all the targets. This recurses into condition entries
# since they can contain toolsets as well.
def ProcessToolsetsInDict(data):
    if "targets" in data:
        target_list = data["targets"]
        new_target_list = []
        for target in target_list:
            # If this target already has an explicit 'toolset', and no 'toolsets'
            # list, don't modify it further.
            if "toolset" in target and "toolsets" not in target:
                new_target_list.append(target)
                continue
            if multiple_toolsets:
                toolsets = target.get("toolsets", ["target"])
            else:
                toolsets = ["target"]
            # Make sure this 'toolsets' definition is only processed once.
            if "toolsets" in target:
                del target["toolsets"]
            if len(toolsets) > 0:
                # Optimization: only do copies if more than one toolset is specified.
                for build in toolsets[1:]:
                    new_target = gyp.simple_copy.deepcopy(target)
                    new_target["toolset"] = build
                    new_target_list.append(new_target)
                target["toolset"] = toolsets[0]
                new_target_list.append(target)
        data["targets"] = new_target_list
    if "conditions" in data:
        for condition in data["conditions"]:
            if type(condition) is list:
                for condition_dict in condition[1:]:
                    if type(condition_dict) is dict:
                        ProcessToolsetsInDict(condition_dict)


# TODO(mark): I don't love this name.  It just means that it's going to load
# a build file that contains targets and is expected to provide a targets dict
# that contains the targets...
def LoadTargetBuildFile(
    build_file_path,
    data,
    aux_data,
    variables,
    includes,
    depth,
    check,
    load_dependencies,
):
    # If depth is set, predefine the DEPTH variable to be a relative path from
    # this build file's directory to the directory identified by depth.
    if depth:
        # TODO(dglazkov) The backslash/forward-slash replacement at the end is a
        # temporary measure. This should really be addressed by keeping all paths
        # in POSIX until actual project generation.
        d = gyp.common.RelativePath(depth, os.path.dirname(build_file_path))
        if d == "":
            variables["DEPTH"] = "."
        else:
            variables["DEPTH"] = d.replace("\\", "/")

    # The 'target_build_files' key is only set when loading target build files in
    # the non-parallel code path, where LoadTargetBuildFile is called
    # recursively.  In the parallel code path, we don't need to check whether the
    # |build_file_path| has already been loaded, because the 'scheduled' set in
    # ParallelState guarantees that we never load the same |build_file_path|
    # twice.
    if "target_build_files" in data:
        if build_file_path in data["target_build_files"]:
            # Already loaded.
            return False
        data["target_build_files"].add(build_file_path)

    gyp.DebugOutput(
        gyp.DEBUG_INCLUDES, "Loading Target Build File '%s'", build_file_path
    )

    build_file_data = LoadOneBuildFile(
        build_file_path, data, aux_data, includes, True, check
    )

    # Store DEPTH for later use in generators.
    build_file_data["_DEPTH"] = depth

    # Set up the included_files key indicating which .gyp files contributed to
    # this target dict.
    if "included_files" in build_file_data:
        raise GypError(build_file_path + " must not contain included_files key")

    included = GetIncludedBuildFiles(build_file_path, aux_data)
    build_file_data["included_files"] = []
    for included_file in included:
        # included_file is relative to the current directory, but it needs to
        # be made relative to build_file_path's directory.
        included_relative = gyp.common.RelativePath(
            included_file, os.path.dirname(build_file_path)
        )
        build_file_data["included_files"].append(included_relative)

    # Do a first round of toolsets expansion so that conditions can be defined
    # per toolset.
    ProcessToolsetsInDict(build_file_data)

    # Apply "pre"/"early" variable expansions and condition evaluations.
    ProcessVariablesAndConditionsInDict(
        build_file_data, PHASE_EARLY, variables, build_file_path
    )

    # Since some toolsets might have been defined conditionally, perform
    # a second round of toolsets expansion now.
    ProcessToolsetsInDict(build_file_data)

    # Look at each project's target_defaults dict, and merge settings into
    # targets.
    if "target_defaults" in build_file_data:
        if "targets" not in build_file_data:
            raise GypError("Unable to find targets in build file %s" % build_file_path)

        index = 0
        while index < len(build_file_data["targets"]):
            # This procedure needs to give the impression that target_defaults is
            # used as defaults, and the individual targets inherit from that.
            # The individual targets need to be merged into the defaults.  Make
            # a deep copy of the defaults for each target, merge the target dict
            # as found in the input file into that copy, and then hook up the
            # copy with the target-specific data merged into it as the replacement
            # target dict.
            old_target_dict = build_file_data["targets"][index]
            new_target_dict = gyp.simple_copy.deepcopy(
                build_file_data["target_defaults"]
            )
            MergeDicts(
                new_target_dict, old_target_dict, build_file_path, build_file_path
            )
            build_file_data["targets"][index] = new_target_dict
            index += 1

        # No longer needed.
        del build_file_data["target_defaults"]

    # Look for dependencies.  This means that dependency resolution occurs
    # after "pre" conditionals and variable expansion, but before "post" -
    # in other words, you can't put a "dependencies" section inside a "post"
    # conditional within a target.

    dependencies = []
    if "targets" in build_file_data:
        for target_dict in build_file_data["targets"]:
            if "dependencies" not in target_dict:
                continue
            for dependency in target_dict["dependencies"]:
                dependencies.append(
                    gyp.common.ResolveTarget(build_file_path, dependency, None)[0]
                )

    if load_dependencies:
        for dependency in dependencies:
            try:
                LoadTargetBuildFile(
                    dependency,
                    data,
                    aux_data,
                    variables,
                    includes,
                    depth,
                    check,
                    load_dependencies,
                )
            except Exception as e:
                gyp.common.ExceptionAppend(
                    e, "while loading dependencies of %s" % build_file_path
                )
                raise
    else:
        return (build_file_path, dependencies)


def CallLoadTargetBuildFile(
    global_flags,
    build_file_path,
    variables,
    includes,
    depth,
    check,
    generator_input_info,
):
    """Wrapper around LoadTargetBuildFile for parallel processing.

     This wrapper is used when LoadTargetBuildFile is executed in
     a worker process.
  """

    try:
        signal.signal(signal.SIGINT, signal.SIG_IGN)

        # Apply globals so that the worker process behaves the same.
        for key, value in global_flags.items():
            globals()[key] = value

        SetGeneratorGlobals(generator_input_info)
        result = LoadTargetBuildFile(
            build_file_path,
            per_process_data,
            per_process_aux_data,
            variables,
            includes,
            depth,
            check,
            False,
        )
        if not result:
            return result

        (build_file_path, dependencies) = result

        # We can safely pop the build_file_data from per_process_data because it
        # will never be referenced by this process again, so we don't need to keep
        # it in the cache.
        build_file_data = per_process_data.pop(build_file_path)

        # This gets serialized and sent back to the main process via a pipe.
        # It's handled in LoadTargetBuildFileCallback.
        return (build_file_path, build_file_data, dependencies)
    except GypError as e:
        sys.stderr.write("gyp: %s\n" % e)
        return None
    except Exception as e:
        print("Exception:", e, file=sys.stderr)
        print(traceback.format_exc(), file=sys.stderr)
        return None


class ParallelProcessingError(Exception):
    pass


class ParallelState:
    """Class to keep track of state when processing input files in parallel.

  If build files are loaded in parallel, use this to keep track of
  state during farming out and processing parallel jobs. It's stored
  in a global so that the callback function can have access to it.
  """

    def __init__(self):
        # The multiprocessing pool.
        self.pool = None
        # The condition variable used to protect this object and notify
        # the main loop when there might be more data to process.
        self.condition = None
        # The "data" dict that was passed to LoadTargetBuildFileParallel
        self.data = None
        # The number of parallel calls outstanding; decremented when a response
        # was received.
        self.pending = 0
        # The set of all build files that have been scheduled, so we don't
        # schedule the same one twice.
        self.scheduled = set()
        # A list of dependency build file paths that haven't been scheduled yet.
        self.dependencies = []
        # Flag to indicate if there was an error in a child process.
        self.error = False

    def LoadTargetBuildFileCallback(self, result):
        """Handle the results of running LoadTargetBuildFile in another process.
    """
        self.condition.acquire()
        if not result:
            self.error = True
            self.condition.notify()
            self.condition.release()
            return
        (build_file_path0, build_file_data0, dependencies0) = result
        self.data[build_file_path0] = build_file_data0
        self.data["target_build_files"].add(build_file_path0)
        for new_dependency in dependencies0:
            if new_dependency not in self.scheduled:
                self.scheduled.add(new_dependency)
                self.dependencies.append(new_dependency)
        self.pending -= 1
        self.condition.notify()
        self.condition.release()


def LoadTargetBuildFilesParallel(
    build_files, data, variables, includes, depth, check, generator_input_info
):
    parallel_state = ParallelState()
    parallel_state.condition = threading.Condition()
    # Make copies of the build_files argument that we can modify while working.
    parallel_state.dependencies = list(build_files)
    parallel_state.scheduled = set(build_files)
    parallel_state.pending = 0
    parallel_state.data = data

    try:
        parallel_state.condition.acquire()
        while parallel_state.dependencies or parallel_state.pending:
            if parallel_state.error:
                break
            if not parallel_state.dependencies:
                parallel_state.condition.wait()
                continue

            dependency = parallel_state.dependencies.pop()

            parallel_state.pending += 1
            global_flags = {
                "path_sections": globals()["path_sections"],
                "non_configuration_keys": globals()["non_configuration_keys"],
                "multiple_toolsets": globals()["multiple_toolsets"],
            }

            if not parallel_state.pool:
                parallel_state.pool = multiprocessing.Pool(multiprocessing.cpu_count())
            parallel_state.pool.apply_async(
                CallLoadTargetBuildFile,
                args=(
                    global_flags,
                    dependency,
                    variables,
                    includes,
                    depth,
                    check,
                    generator_input_info,
                ),
                callback=parallel_state.LoadTargetBuildFileCallback,
            )
    except KeyboardInterrupt as e:
        parallel_state.pool.terminate()
        raise e

    parallel_state.condition.release()

    parallel_state.pool.close()
    parallel_state.pool.join()
    parallel_state.pool = None

    if parallel_state.error:
        sys.exit(1)


# Look for the bracket that matches the first bracket seen in a
# string, and return the start and end as a tuple.  For example, if
# the input is something like "<(foo <(bar)) blah", then it would
# return (1, 13), indicating the entire string except for the leading
# "<" and trailing " blah".
LBRACKETS = set("{[(")
BRACKETS = {"}": "{", "]": "[", ")": "("}


def FindEnclosingBracketGroup(input_str):
    stack = []
    start = -1
    for index, char in enumerate(input_str):
        if char in LBRACKETS:
            stack.append(char)
            if start == -1:
                start = index
        elif char in BRACKETS:
            if not stack:
                return (-1, -1)
            if stack.pop() != BRACKETS[char]:
                return (-1, -1)
            if not stack:
                return (start, index + 1)
    return (-1, -1)


def IsStrCanonicalInt(string):
    """Returns True if |string| is in its canonical integer form.

  The canonical form is such that str(int(string)) == string.
  """
    if type(string) is str:
        # This function is called a lot so for maximum performance, avoid
        # involving regexps which would otherwise make the code much
        # shorter. Regexps would need twice the time of this function.
        if string:
            if string == "0":
                return True
            if string[0] == "-":
                string = string[1:]
                if not string:
                    return False
            if "1" <= string[0] <= "9":
                return string.isdigit()

    return False


# This matches things like "<(asdf)", "<!(cmd)", "<!@(cmd)", "<|(list)",
# "<!interpreter(arguments)", "<([list])", and even "<([)" and "<(<())".
# In the last case, the inner "<()" is captured in match['content'].
early_variable_re = re.compile(
    r"(?P<replace>(?P<type><(?:(?:!?@?)|\|)?)"
    r"(?P<command_string>[-a-zA-Z0-9_.]+)?"
    r"\((?P<is_array>\s*\[?)"
    r"(?P<content>.*?)(\]?)\))"
)

# This matches the same as early_variable_re, but with '>' instead of '<'.
late_variable_re = re.compile(
    r"(?P<replace>(?P<type>>(?:(?:!?@?)|\|)?)"
    r"(?P<command_string>[-a-zA-Z0-9_.]+)?"
    r"\((?P<is_array>\s*\[?)"
    r"(?P<content>.*?)(\]?)\))"
)

# This matches the same as early_variable_re, but with '^' instead of '<'.
latelate_variable_re = re.compile(
    r"(?P<replace>(?P<type>[\^](?:(?:!?@?)|\|)?)"
    r"(?P<command_string>[-a-zA-Z0-9_.]+)?"
    r"\((?P<is_array>\s*\[?)"
    r"(?P<content>.*?)(\]?)\))"
)

# Global cache of results from running commands so they don't have to be run
# more then once.
cached_command_results = {}


def FixupPlatformCommand(cmd):
    if sys.platform == "win32":
        if type(cmd) is list:
            cmd = [re.sub("^cat ", "type ", cmd[0])] + cmd[1:]
        else:
            cmd = re.sub("^cat ", "type ", cmd)
    return cmd


PHASE_EARLY = 0
PHASE_LATE = 1
PHASE_LATELATE = 2


def ExpandVariables(input, phase, variables, build_file):
    # Look for the pattern that gets expanded into variables
    if phase == PHASE_EARLY:
        variable_re = early_variable_re
        expansion_symbol = "<"
    elif phase == PHASE_LATE:
        variable_re = late_variable_re
        expansion_symbol = ">"
    elif phase == PHASE_LATELATE:
        variable_re = latelate_variable_re
        expansion_symbol = "^"
    else:
        assert False

    input_str = str(input)
    if IsStrCanonicalInt(input_str):
        return int(input_str)

    # Do a quick scan to determine if an expensive regex search is warranted.
    if expansion_symbol not in input_str:
        return input_str

    # Get the entire list of matches as a list of MatchObject instances.
    # (using findall here would return strings instead of MatchObjects).
    matches = list(variable_re.finditer(input_str))
    if not matches:
        return input_str

    output = input_str
    # Reverse the list of matches so that replacements are done right-to-left.
    # That ensures that earlier replacements won't mess up the string in a
    # way that causes later calls to find the earlier substituted text instead
    # of what's intended for replacement.
    matches.reverse()
    for match_group in matches:
        match = match_group.groupdict()
        gyp.DebugOutput(gyp.DEBUG_VARIABLES, "Matches: %r", match)
        # match['replace'] is the substring to look for, match['type']
        # is the character code for the replacement type (< > <! >! <| >| <@
        # >@ <!@ >!@), match['is_array'] contains a '[' for command
        # arrays, and match['content'] is the name of the variable (< >)
        # or command to run (<! >!). match['command_string'] is an optional
        # command string. Currently, only 'pymod_do_main' is supported.

        # run_command is true if a ! variant is used.
        run_command = "!" in match["type"]
        command_string = match["command_string"]

        # file_list is true if a | variant is used.
        file_list = "|" in match["type"]

        # Capture these now so we can adjust them later.
        replace_start = match_group.start("replace")
        replace_end = match_group.end("replace")

        # Find the ending paren, and re-evaluate the contained string.
        (c_start, c_end) = FindEnclosingBracketGroup(input_str[replace_start:])

        # Adjust the replacement range to match the entire command
        # found by FindEnclosingBracketGroup (since the variable_re
        # probably doesn't match the entire command if it contained
        # nested variables).
        replace_end = replace_start + c_end

        # Find the "real" replacement, matching the appropriate closing
        # paren, and adjust the replacement start and end.
        replacement = input_str[replace_start:replace_end]

        # Figure out what the contents of the variable parens are.
        contents_start = replace_start + c_start + 1
        contents_end = replace_end - 1
        contents = input_str[contents_start:contents_end]

        # Do filter substitution now for <|().
        # Admittedly, this is different than the evaluation order in other
        # contexts. However, since filtration has no chance to run on <|(),
        # this seems like the only obvious way to give them access to filters.
        if file_list:
            processed_variables = gyp.simple_copy.deepcopy(variables)
            ProcessListFiltersInDict(contents, processed_variables)
            # Recurse to expand variables in the contents
            contents = ExpandVariables(contents, phase, processed_variables, build_file)
        else:
            # Recurse to expand variables in the contents
            contents = ExpandVariables(contents, phase, variables, build_file)

        # Strip off leading/trailing whitespace so that variable matches are
        # simpler below (and because they are rarely needed).
        contents = contents.strip()

        # expand_to_list is true if an @ variant is used.  In that case,
        # the expansion should result in a list.  Note that the caller
        # is to be expecting a list in return, and not all callers do
        # because not all are working in list context.  Also, for list
        # expansions, there can be no other text besides the variable
        # expansion in the input string.
        expand_to_list = "@" in match["type"] and input_str == replacement

        if run_command or file_list:
            # Find the build file's directory, so commands can be run or file lists
            # generated relative to it.
            build_file_dir = os.path.dirname(build_file)
            if build_file_dir == "" and not file_list:
                # If build_file is just a leaf filename indicating a file in the
                # current directory, build_file_dir might be an empty string.  Set
                # it to None to signal to subprocess.Popen that it should run the
                # command in the current directory.
                build_file_dir = None

        # Support <|(listfile.txt ...) which generates a file
        # containing items from a gyp list, generated at gyp time.
        # This works around actions/rules which have more inputs than will
        # fit on the command line.
        if file_list:
            if type(contents) is list:
                contents_list = contents
            else:
                contents_list = contents.split(" ")
            replacement = contents_list[0]
            if os.path.isabs(replacement):
                raise GypError('| cannot handle absolute paths, got "%s"' % replacement)

            if not generator_filelist_paths:
                path = os.path.join(build_file_dir, replacement)
            else:
                if os.path.isabs(build_file_dir):
                    toplevel = generator_filelist_paths["toplevel"]
                    rel_build_file_dir = gyp.common.RelativePath(
                        build_file_dir, toplevel
                    )
                else:
                    rel_build_file_dir = build_file_dir
                qualified_out_dir = generator_filelist_paths["qualified_out_dir"]
                path = os.path.join(qualified_out_dir, rel_build_file_dir, replacement)
                gyp.common.EnsureDirExists(path)

            replacement = gyp.common.RelativePath(path, build_file_dir)
            f = gyp.common.WriteOnDiff(path)
            for i in contents_list[1:]:
                f.write("%s\n" % i)
            f.close()

        elif run_command:
            use_shell = True
            if match["is_array"]:
                contents = eval(contents)
                use_shell = False

            # Check for a cached value to avoid executing commands, or generating
            # file lists more than once. The cache key contains the command to be
            # run as well as the directory to run it from, to account for commands
            # that depend on their current directory.
            # TODO(http://code.google.com/p/gyp/issues/detail?id=111): In theory,
            # someone could author a set of GYP files where each time the command
            # is invoked it produces different output by design. When the need
            # arises, the syntax should be extended to support no caching off a
            # command's output so it is run every time.
            cache_key = (str(contents), build_file_dir)
            cached_value = cached_command_results.get(cache_key, None)
            if cached_value is None:
                gyp.DebugOutput(
                    gyp.DEBUG_VARIABLES,
                    "Executing command '%s' in directory '%s'",
                    contents,
                    build_file_dir,
                )

                replacement = ""

                if command_string == "pymod_do_main":
                    # <!pymod_do_main(modulename param eters) loads |modulename| as a
                    # python module and then calls that module's DoMain() function,
                    # passing ["param", "eters"] as a single list argument. For modules
                    # that don't load quickly, this can be faster than
                    # <!(python modulename param eters). Do this in |build_file_dir|.
                    oldwd = os.getcwd()  # Python doesn't like os.open('.'): no fchdir.
                    if build_file_dir:  # build_file_dir may be None (see above).
                        os.chdir(build_file_dir)
                    sys.path.append(os.getcwd())
                    try:

                        parsed_contents = shlex.split(contents)
                        try:
                            py_module = __import__(parsed_contents[0])
                        except ImportError as e:
                            raise GypError(
                                "Error importing pymod_do_main"
                                "module (%s): %s" % (parsed_contents[0], e)
                            )
                        replacement = str(
                            py_module.DoMain(parsed_contents[1:])
                        ).rstrip()
                    finally:
                        sys.path.pop()
                        os.chdir(oldwd)
                    assert replacement is not None
                elif command_string:
                    raise GypError(
                        "Unknown command string '%s' in '%s'."
                        % (command_string, contents)
                    )
                else:
                    # Fix up command with platform specific workarounds.
                    contents = FixupPlatformCommand(contents)
                    try:
                        p = subprocess.Popen(
                            contents,
                            shell=use_shell,
                            stdout=subprocess.PIPE,
                            stderr=subprocess.PIPE,
                            stdin=subprocess.PIPE,
                            cwd=build_file_dir,
                        )
                    except Exception as e:
                        raise GypError(
                            "%s while executing command '%s' in %s"
                            % (e, contents, build_file)
                        )

                    p_stdout, p_stderr = p.communicate("")
                    p_stdout = p_stdout.decode("utf-8")
                    p_stderr = p_stderr.decode("utf-8")

                    if p.wait() != 0 or p_stderr:
                        sys.stderr.write(p_stderr)
                        # Simulate check_call behavior, since check_call only exists
                        # in python 2.5 and later.
                        raise GypError(
                            "Call to '%s' returned exit status %d while in %s."
                            % (contents, p.returncode, build_file)
                        )
                    replacement = p_stdout.rstrip()

                cached_command_results[cache_key] = replacement
            else:
                gyp.DebugOutput(
                    gyp.DEBUG_VARIABLES,
                    "Had cache value for command '%s' in directory '%s'",
                    contents,
                    build_file_dir,
                )
                replacement = cached_value

        else:
            if contents not in variables:
                if contents[-1] in ["!", "/"]:
                    # In order to allow cross-compiles (nacl) to happen more naturally,
                    # we will allow references to >(sources/) etc. to resolve to
                    # and empty list if undefined. This allows actions to:
                    # 'action!': [
                    #   '>@(_sources!)',
                    # ],
                    # 'action/': [
                    #   '>@(_sources/)',
                    # ],
                    replacement = []
                else:
                    raise GypError(
                        "Undefined variable " + contents + " in " + build_file
                    )
            else:
                replacement = variables[contents]

        if isinstance(replacement, bytes) and not isinstance(replacement, str):
            replacement = replacement.decode("utf-8")  # done on Python 3 only
        if type(replacement) is list:
            for item in replacement:
                if isinstance(item, bytes) and not isinstance(item, str):
                    item = item.decode("utf-8")  # done on Python 3 only
                if not contents[-1] == "/" and type(item) not in (str, int):
                    raise GypError(
                        "Variable "
                        + contents
                        + " must expand to a string or list of strings; "
                        + "list contains a "
                        + item.__class__.__name__
                    )
            # Run through the list and handle variable expansions in it.  Since
            # the list is guaranteed not to contain dicts, this won't do anything
            # with conditions sections.
            ProcessVariablesAndConditionsInList(
                replacement, phase, variables, build_file
            )
        elif type(replacement) not in (str, int):
            raise GypError(
                "Variable "
                + contents
                + " must expand to a string or list of strings; "
                + "found a "
                + replacement.__class__.__name__
            )

        if expand_to_list:
            # Expanding in list context.  It's guaranteed that there's only one
            # replacement to do in |input_str| and that it's this replacement.  See
            # above.
            if type(replacement) is list:
                # If it's already a list, make a copy.
                output = replacement[:]
            else:
                # Split it the same way sh would split arguments.
                output = shlex.split(str(replacement))
        else:
            # Expanding in string context.
            encoded_replacement = ""
            if type(replacement) is list:
                # When expanding a list into string context, turn the list items
                # into a string in a way that will work with a subprocess call.
                #
                # TODO(mark): This isn't completely correct.  This should
                # call a generator-provided function that observes the
                # proper list-to-argument quoting rules on a specific
                # platform instead of just calling the POSIX encoding
                # routine.
                encoded_replacement = gyp.common.EncodePOSIXShellList(replacement)
            else:
                encoded_replacement = replacement

            output = (
                output[:replace_start] + str(encoded_replacement) + output[replace_end:]
            )
        # Prepare for the next match iteration.
        input_str = output

    if output == input:
        gyp.DebugOutput(
            gyp.DEBUG_VARIABLES,
            "Found only identity matches on %r, avoiding infinite " "recursion.",
            output,
        )
    else:
        # Look for more matches now that we've replaced some, to deal with
        # expanding local variables (variables defined in the same
        # variables block as this one).
        gyp.DebugOutput(gyp.DEBUG_VARIABLES, "Found output %r, recursing.", output)
        if type(output) is list:
            if output and type(output[0]) is list:
                # Leave output alone if it's a list of lists.
                # We don't want such lists to be stringified.
                pass
            else:
                new_output = []
                for item in output:
                    new_output.append(
                        ExpandVariables(item, phase, variables, build_file)
                    )
                output = new_output
        else:
            output = ExpandVariables(output, phase, variables, build_file)

    # Convert all strings that are canonically-represented integers into integers.
    if type(output) is list:
        for index, outstr in enumerate(output):
            if IsStrCanonicalInt(outstr):
                output[index] = int(outstr)
    elif IsStrCanonicalInt(output):
        output = int(output)

    return output


# The same condition is often evaluated over and over again so it
# makes sense to cache as much as possible between evaluations.
cached_conditions_asts = {}


def EvalCondition(condition, conditions_key, phase, variables, build_file):
    """Returns the dict that should be used or None if the result was
  that nothing should be used."""
    if type(condition) is not list:
        raise GypError(conditions_key + " must be a list")
    if len(condition) < 2:
        # It's possible that condition[0] won't work in which case this
        # attempt will raise its own IndexError.  That's probably fine.
        raise GypError(
            conditions_key
            + " "
            + condition[0]
            + " must be at least length 2, not "
            + str(len(condition))
        )

    i = 0
    result = None
    while i < len(condition):
        cond_expr = condition[i]
        true_dict = condition[i + 1]
        if type(true_dict) is not dict:
            raise GypError(
                "{} {} must be followed by a dictionary, not {}".format(
                    conditions_key, cond_expr, type(true_dict)
                )
            )
        if len(condition) > i + 2 and type(condition[i + 2]) is dict:
            false_dict = condition[i + 2]
            i = i + 3
            if i != len(condition):
                raise GypError(
                    "{} {} has {} unexpected trailing items".format(
                        conditions_key, cond_expr, len(condition) - i
                    )
                )
        else:
            false_dict = None
            i = i + 2
        if result is None:
            result = EvalSingleCondition(
                cond_expr, true_dict, false_dict, phase, variables, build_file
            )

    return result


def EvalSingleCondition(cond_expr, true_dict, false_dict, phase, variables, build_file):
    """Returns true_dict if cond_expr evaluates to true, and false_dict
  otherwise."""
    # Do expansions on the condition itself.  Since the condition can naturally
    # contain variable references without needing to resort to GYP expansion
    # syntax, this is of dubious value for variables, but someone might want to
    # use a command expansion directly inside a condition.
    cond_expr_expanded = ExpandVariables(cond_expr, phase, variables, build_file)
    if type(cond_expr_expanded) not in (str, int):
        raise ValueError(
            "Variable expansion in this context permits str and int "
            + "only, found "
            + cond_expr_expanded.__class__.__name__
        )

    try:
        if cond_expr_expanded in cached_conditions_asts:
            ast_code = cached_conditions_asts[cond_expr_expanded]
        else:
            ast_code = compile(cond_expr_expanded, "<string>", "eval")
            cached_conditions_asts[cond_expr_expanded] = ast_code
        env = {"__builtins__": {}, "v": StrictVersion}
        if eval(ast_code, env, variables):
            return true_dict
        return false_dict
    except SyntaxError as e:
        syntax_error = SyntaxError(
            "%s while evaluating condition '%s' in %s "
            "at character %d." % (str(e.args[0]), e.text, build_file, e.offset),
            e.filename,
            e.lineno,
            e.offset,
            e.text,
        )
        raise syntax_error
    except NameError as e:
        gyp.common.ExceptionAppend(
            e,
            f"while evaluating condition '{cond_expr_expanded}' in {build_file}",
        )
        raise GypError(e)


def ProcessConditionsInDict(the_dict, phase, variables, build_file):
    # Process a 'conditions' or 'target_conditions' section in the_dict,
    # depending on phase.
    # early -> conditions
    # late -> target_conditions
    # latelate -> no conditions
    #
    # Each item in a conditions list consists of cond_expr, a string expression
    # evaluated as the condition, and true_dict, a dict that will be merged into
    # the_dict if cond_expr evaluates to true.  Optionally, a third item,
    # false_dict, may be present.  false_dict is merged into the_dict if
    # cond_expr evaluates to false.
    #
    # Any dict merged into the_dict will be recursively processed for nested
    # conditionals and other expansions, also according to phase, immediately
    # prior to being merged.

    if phase == PHASE_EARLY:
        conditions_key = "conditions"
    elif phase == PHASE_LATE:
        conditions_key = "target_conditions"
    elif phase == PHASE_LATELATE:
        return
    else:
        assert False

    if conditions_key not in the_dict:
        return

    conditions_list = the_dict[conditions_key]
    # Unhook the conditions list, it's no longer needed.
    del the_dict[conditions_key]

    for condition in conditions_list:
        merge_dict = EvalCondition(
            condition, conditions_key, phase, variables, build_file
        )

        if merge_dict is not None:
            # Expand variables and nested conditinals in the merge_dict before
            # merging it.
            ProcessVariablesAndConditionsInDict(
                merge_dict, phase, variables, build_file
            )

            MergeDicts(the_dict, merge_dict, build_file, build_file)


def LoadAutomaticVariablesFromDict(variables, the_dict):
    # Any keys with plain string values in the_dict become automatic variables.
    # The variable name is the key name with a "_" character prepended.
    for key, value in the_dict.items():
        if type(value) in (str, int, list):
            variables["_" + key] = value


def LoadVariablesFromVariablesDict(variables, the_dict, the_dict_key):
    # Any keys in the_dict's "variables" dict, if it has one, becomes a
    # variable.  The variable name is the key name in the "variables" dict.
    # Variables that end with the % character are set only if they are unset in
    # the variables dict.  the_dict_key is the name of the key that accesses
    # the_dict in the_dict's parent dict.  If the_dict's parent is not a dict
    # (it could be a list or it could be parentless because it is a root dict),
    # the_dict_key will be None.
    for key, value in the_dict.get("variables", {}).items():
        if type(value) not in (str, int, list):
            continue

        if key.endswith("%"):
            variable_name = key[:-1]
            if variable_name in variables:
                # If the variable is already set, don't set it.
                continue
            if the_dict_key == "variables" and variable_name in the_dict:
                # If the variable is set without a % in the_dict, and the_dict is a
                # variables dict (making |variables| a variables sub-dict of a
                # variables dict), use the_dict's definition.
                value = the_dict[variable_name]
        else:
            variable_name = key

        variables[variable_name] = value


def ProcessVariablesAndConditionsInDict(
    the_dict, phase, variables_in, build_file, the_dict_key=None
):
    """Handle all variable and command expansion and conditional evaluation.

  This function is the public entry point for all variable expansions and
  conditional evaluations.  The variables_in dictionary will not be modified
  by this function.
  """

    # Make a copy of the variables_in dict that can be modified during the
    # loading of automatics and the loading of the variables dict.
    variables = variables_in.copy()
    LoadAutomaticVariablesFromDict(variables, the_dict)

    if "variables" in the_dict:
        # Make sure all the local variables are added to the variables
        # list before we process them so that you can reference one
        # variable from another.  They will be fully expanded by recursion
        # in ExpandVariables.
        for key, value in the_dict["variables"].items():
            variables[key] = value

        # Handle the associated variables dict first, so that any variable
        # references within can be resolved prior to using them as variables.
        # Pass a copy of the variables dict to avoid having it be tainted.
        # Otherwise, it would have extra automatics added for everything that
        # should just be an ordinary variable in this scope.
        ProcessVariablesAndConditionsInDict(
            the_dict["variables"], phase, variables, build_file, "variables"
        )

    LoadVariablesFromVariablesDict(variables, the_dict, the_dict_key)

    for key, value in the_dict.items():
        # Skip "variables", which was already processed if present.
        if key != "variables" and type(value) is str:
            expanded = ExpandVariables(value, phase, variables, build_file)
            if type(expanded) not in (str, int):
                raise ValueError(
                    "Variable expansion in this context permits str and int "
                    + "only, found "
                    + expanded.__class__.__name__
                    + " for "
                    + key
                )
            the_dict[key] = expanded

    # Variable expansion may have resulted in changes to automatics.  Reload.
    # TODO(mark): Optimization: only reload if no changes were made.
    variables = variables_in.copy()
    LoadAutomaticVariablesFromDict(variables, the_dict)
    LoadVariablesFromVariablesDict(variables, the_dict, the_dict_key)

    # Process conditions in this dict.  This is done after variable expansion
    # so that conditions may take advantage of expanded variables.  For example,
    # if the_dict contains:
    #   {'type':       '<(library_type)',
    #    'conditions': [['_type=="static_library"', { ... }]]},
    # _type, as used in the condition, will only be set to the value of
    # library_type if variable expansion is performed before condition
    # processing.  However, condition processing should occur prior to recursion
    # so that variables (both automatic and "variables" dict type) may be
    # adjusted by conditions sections, merged into the_dict, and have the
    # intended impact on contained dicts.
    #
    # This arrangement means that a "conditions" section containing a "variables"
    # section will only have those variables effective in subdicts, not in
    # the_dict.  The workaround is to put a "conditions" section within a
    # "variables" section.  For example:
    #   {'conditions': [['os=="mac"', {'variables': {'define': 'IS_MAC'}}]],
    #    'defines':    ['<(define)'],
    #    'my_subdict': {'defines': ['<(define)']}},
    # will not result in "IS_MAC" being appended to the "defines" list in the
    # current scope but would result in it being appended to the "defines" list
    # within "my_subdict".  By comparison:
    #   {'variables': {'conditions': [['os=="mac"', {'define': 'IS_MAC'}]]},
    #    'defines':    ['<(define)'],
    #    'my_subdict': {'defines': ['<(define)']}},
    # will append "IS_MAC" to both "defines" lists.

    # Evaluate conditions sections, allowing variable expansions within them
    # as well as nested conditionals.  This will process a 'conditions' or
    # 'target_conditions' section, perform appropriate merging and recursive
    # conditional and variable processing, and then remove the conditions section
    # from the_dict if it is present.
    ProcessConditionsInDict(the_dict, phase, variables, build_file)

    # Conditional processing may have resulted in changes to automatics or the
    # variables dict.  Reload.
    variables = variables_in.copy()
    LoadAutomaticVariablesFromDict(variables, the_dict)
    LoadVariablesFromVariablesDict(variables, the_dict, the_dict_key)

    # Recurse into child dicts, or process child lists which may result in
    # further recursion into descendant dicts.
    for key, value in the_dict.items():
        # Skip "variables" and string values, which were already processed if
        # present.
        if key == "variables" or type(value) is str:
            continue
        if type(value) is dict:
            # Pass a copy of the variables dict so that subdicts can't influence
            # parents.
            ProcessVariablesAndConditionsInDict(
                value, phase, variables, build_file, key
            )
        elif type(value) is list:
            # The list itself can't influence the variables dict, and
            # ProcessVariablesAndConditionsInList will make copies of the variables
            # dict if it needs to pass it to something that can influence it.  No
            # copy is necessary here.
            ProcessVariablesAndConditionsInList(value, phase, variables, build_file)
        elif type(value) is not int:
            raise TypeError("Unknown type " + value.__class__.__name__ + " for " + key)


def ProcessVariablesAndConditionsInList(the_list, phase, variables, build_file):
    # Iterate using an index so that new values can be assigned into the_list.
    index = 0
    while index < len(the_list):
        item = the_list[index]
        if type(item) is dict:
            # Make a copy of the variables dict so that it won't influence anything
            # outside of its own scope.
            ProcessVariablesAndConditionsInDict(item, phase, variables, build_file)
        elif type(item) is list:
            ProcessVariablesAndConditionsInList(item, phase, variables, build_file)
        elif type(item) is str:
            expanded = ExpandVariables(item, phase, variables, build_file)
            if type(expanded) in (str, int):
                the_list[index] = expanded
            elif type(expanded) is list:
                the_list[index : index + 1] = expanded
                index += len(expanded)

                # index now identifies the next item to examine.  Continue right now
                # without falling into the index increment below.
                continue
            else:
                raise ValueError(
                    "Variable expansion in this context permits strings and "
                    + "lists only, found "
                    + expanded.__class__.__name__
                    + " at "
                    + index
                )
        elif type(item) is not int:
            raise TypeError(
                "Unknown type " + item.__class__.__name__ + " at index " + index
            )
        index = index + 1


def BuildTargetsDict(data):
    """Builds a dict mapping fully-qualified target names to their target dicts.

  |data| is a dict mapping loaded build files by pathname relative to the
  current directory.  Values in |data| are build file contents.  For each
  |data| value with a "targets" key, the value of the "targets" key is taken
  as a list containing target dicts.  Each target's fully-qualified name is
  constructed from the pathname of the build file (|data| key) and its
  "target_name" property.  These fully-qualified names are used as the keys
  in the returned dict.  These keys provide access to the target dicts,
  the dicts in the "targets" lists.
  """

    targets = {}
    for build_file in data["target_build_files"]:
        for target in data[build_file].get("targets", []):
            target_name = gyp.common.QualifiedTarget(
                build_file, target["target_name"], target["toolset"]
            )
            if target_name in targets:
                raise GypError("Duplicate target definitions for " + target_name)
            targets[target_name] = target

    return targets


def QualifyDependencies(targets):
    """Make dependency links fully-qualified relative to the current directory.

  |targets| is a dict mapping fully-qualified target names to their target
  dicts.  For each target in this dict, keys known to contain dependency
  links are examined, and any dependencies referenced will be rewritten
  so that they are fully-qualified and relative to the current directory.
  All rewritten dependencies are suitable for use as keys to |targets| or a
  similar dict.
  """

    all_dependency_sections = [
        dep + op for dep in dependency_sections for op in ("", "!", "/")
    ]

    for target, target_dict in targets.items():
        target_build_file = gyp.common.BuildFile(target)
        toolset = target_dict["toolset"]
        for dependency_key in all_dependency_sections:
            dependencies = target_dict.get(dependency_key, [])
            for index, dep in enumerate(dependencies):
                dep_file, dep_target, dep_toolset = gyp.common.ResolveTarget(
                    target_build_file, dep, toolset
                )
                if not multiple_toolsets:
                    # Ignore toolset specification in the dependency if it is specified.
                    dep_toolset = toolset
                dependency = gyp.common.QualifiedTarget(
                    dep_file, dep_target, dep_toolset
                )
                dependencies[index] = dependency

                # Make sure anything appearing in a list other than "dependencies" also
                # appears in the "dependencies" list.
                if (
                    dependency_key != "dependencies"
                    and dependency not in target_dict["dependencies"]
                ):
                    raise GypError(
                        "Found "
                        + dependency
                        + " in "
                        + dependency_key
                        + " of "
                        + target
                        + ", but not in dependencies"
                    )


def ExpandWildcardDependencies(targets, data):
    """Expands dependencies specified as build_file:*.

  For each target in |targets|, examines sections containing links to other
  targets.  If any such section contains a link of the form build_file:*, it
  is taken as a wildcard link, and is expanded to list each target in
  build_file.  The |data| dict provides access to build file dicts.

  Any target that does not wish to be included by wildcard can provide an
  optional "suppress_wildcard" key in its target dict.  When present and
  true, a wildcard dependency link will not include such targets.

  All dependency names, including the keys to |targets| and the values in each
  dependency list, must be qualified when this function is called.
  """

    for target, target_dict in targets.items():
        target_build_file = gyp.common.BuildFile(target)
        for dependency_key in dependency_sections:
            dependencies = target_dict.get(dependency_key, [])

            # Loop this way instead of "for dependency in" or "for index in range"
            # because the dependencies list will be modified within the loop body.
            index = 0
            while index < len(dependencies):
                (
                    dependency_build_file,
                    dependency_target,
                    dependency_toolset,
                ) = gyp.common.ParseQualifiedTarget(dependencies[index])
                if dependency_target != "*" and dependency_toolset != "*":
                    # Not a wildcard.  Keep it moving.
                    index = index + 1
                    continue

                if dependency_build_file == target_build_file:
                    # It's an error for a target to depend on all other targets in
                    # the same file, because a target cannot depend on itself.
                    raise GypError(
                        "Found wildcard in "
                        + dependency_key
                        + " of "
                        + target
                        + " referring to same build file"
                    )

                # Take the wildcard out and adjust the index so that the next
                # dependency in the list will be processed the next time through the
                # loop.
                del dependencies[index]
                index = index - 1

                # Loop through the targets in the other build file, adding them to
                # this target's list of dependencies in place of the removed
                # wildcard.
                dependency_target_dicts = data[dependency_build_file]["targets"]
                for dependency_target_dict in dependency_target_dicts:
                    if int(dependency_target_dict.get("suppress_wildcard", False)):
                        continue
                    dependency_target_name = dependency_target_dict["target_name"]
                    if (
                        dependency_target != "*"
                        and dependency_target != dependency_target_name
                    ):
                        continue
                    dependency_target_toolset = dependency_target_dict["toolset"]
                    if (
                        dependency_toolset != "*"
                        and dependency_toolset != dependency_target_toolset
                    ):
                        continue
                    dependency = gyp.common.QualifiedTarget(
                        dependency_build_file,
                        dependency_target_name,
                        dependency_target_toolset,
                    )
                    index = index + 1
                    dependencies.insert(index, dependency)

                index = index + 1


def Unify(items):
    """Removes duplicate elements from items, keeping the first element."""
    seen = {}
    return [seen.setdefault(e, e) for e in items if e not in seen]


def RemoveDuplicateDependencies(targets):
    """Makes sure every dependency appears only once in all targets's dependency
  lists."""
    for target_name, target_dict in targets.items():
        for dependency_key in dependency_sections:
            dependencies = target_dict.get(dependency_key, [])
            if dependencies:
                target_dict[dependency_key] = Unify(dependencies)


def Filter(items, item):
    """Removes item from items."""
    res = {}
    return [res.setdefault(e, e) for e in items if e != item]


def RemoveSelfDependencies(targets):
    """Remove self dependencies from targets that have the prune_self_dependency
  variable set."""
    for target_name, target_dict in targets.items():
        for dependency_key in dependency_sections:
            dependencies = target_dict.get(dependency_key, [])
            if dependencies:
                for t in dependencies:
                    if t == target_name:
                        if (
                            targets[t]
                            .get("variables", {})
                            .get("prune_self_dependency", 0)
                        ):
                            target_dict[dependency_key] = Filter(
                                dependencies, target_name
                            )


def RemoveLinkDependenciesFromNoneTargets(targets):
    """Remove dependencies having the 'link_dependency' attribute from the 'none'
  targets."""
    for target_name, target_dict in targets.items():
        for dependency_key in dependency_sections:
            dependencies = target_dict.get(dependency_key, [])
            if dependencies:
                for t in dependencies:
                    if target_dict.get("type", None) == "none":
                        if targets[t].get("variables", {}).get("link_dependency", 0):
                            target_dict[dependency_key] = Filter(
                                target_dict[dependency_key], t
                            )


class DependencyGraphNode:
    """

  Attributes:
    ref: A reference to an object that this DependencyGraphNode represents.
    dependencies: List of DependencyGraphNodes on which this one depends.
    dependents: List of DependencyGraphNodes that depend on this one.
  """

    class CircularException(GypError):
        pass

    def __init__(self, ref):
        self.ref = ref
        self.dependencies = []
        self.dependents = []

    def __repr__(self):
        return "<DependencyGraphNode: %r>" % self.ref

    def FlattenToList(self):
        # flat_list is the sorted list of dependencies - actually, the list items
        # are the "ref" attributes of DependencyGraphNodes.  Every target will
        # appear in flat_list after all of its dependencies, and before all of its
        # dependents.
        flat_list = OrderedSet()

        def ExtractNodeRef(node):
            """Extracts the object that the node represents from the given node."""
            return node.ref

        # in_degree_zeros is the list of DependencyGraphNodes that have no
        # dependencies not in flat_list.  Initially, it is a copy of the children
        # of this node, because when the graph was built, nodes with no
        # dependencies were made implicit dependents of the root node.
        in_degree_zeros = sorted(self.dependents[:], key=ExtractNodeRef)

        while in_degree_zeros:
            # Nodes in in_degree_zeros have no dependencies not in flat_list, so they
            # can be appended to flat_list.  Take these nodes out of in_degree_zeros
            # as work progresses, so that the next node to process from the list can
            # always be accessed at a consistent position.
            node = in_degree_zeros.pop()
            flat_list.add(node.ref)

            # Look at dependents of the node just added to flat_list.  Some of them
            # may now belong in in_degree_zeros.
            for node_dependent in sorted(node.dependents, key=ExtractNodeRef):
                is_in_degree_zero = True
                # TODO: We want to check through the
                # node_dependent.dependencies list but if it's long and we
                # always start at the beginning, then we get O(n^2) behaviour.
                for node_dependent_dependency in sorted(
                    node_dependent.dependencies, key=ExtractNodeRef
                ):
                    if node_dependent_dependency.ref not in flat_list:
                        # The dependent one or more dependencies not in flat_list.
                        # There will be more chances to add it to flat_list
                        # when examining it again as a dependent of those other
                        # dependencies, provided that there are no cycles.
                        is_in_degree_zero = False
                        break

                if is_in_degree_zero:
                    # All of the dependent's dependencies are already in flat_list.  Add
                    # it to in_degree_zeros where it will be processed in a future
                    # iteration of the outer loop.
                    in_degree_zeros += [node_dependent]

        return list(flat_list)

    def FindCycles(self):
        """
    Returns a list of cycles in the graph, where each cycle is its own list.
    """
        results = []
        visited = set()

        def Visit(node, path):
            for child in node.dependents:
                if child in path:
                    results.append([child] + path[: path.index(child) + 1])
                elif child not in visited:
                    visited.add(child)
                    Visit(child, [child] + path)

        visited.add(self)
        Visit(self, [self])

        return results

    def DirectDependencies(self, dependencies=None):
        """Returns a list of just direct dependencies."""
        if dependencies is None:
            dependencies = []

        for dependency in self.dependencies:
            # Check for None, corresponding to the root node.
            if dependency.ref and dependency.ref not in dependencies:
                dependencies.append(dependency.ref)

        return dependencies

    def _AddImportedDependencies(self, targets, dependencies=None):
        """Given a list of direct dependencies, adds indirect dependencies that
    other dependencies have declared to export their settings.

    This method does not operate on self.  Rather, it operates on the list
    of dependencies in the |dependencies| argument.  For each dependency in
    that list, if any declares that it exports the settings of one of its
    own dependencies, those dependencies whose settings are "passed through"
    are added to the list.  As new items are added to the list, they too will
    be processed, so it is possible to import settings through multiple levels
    of dependencies.

    This method is not terribly useful on its own, it depends on being
    "primed" with a list of direct dependencies such as one provided by
    DirectDependencies.  DirectAndImportedDependencies is intended to be the
    public entry point.
    """

        if dependencies is None:
            dependencies = []

        index = 0
        while index < len(dependencies):
            dependency = dependencies[index]
            dependency_dict = targets[dependency]
            # Add any dependencies whose settings should be imported to the list
            # if not already present.  Newly-added items will be checked for
            # their own imports when the list iteration reaches them.
            # Rather than simply appending new items, insert them after the
            # dependency that exported them.  This is done to more closely match
            # the depth-first method used by DeepDependencies.
            add_index = 1
            for imported_dependency in dependency_dict.get(
                "export_dependent_settings", []
            ):
                if imported_dependency not in dependencies:
                    dependencies.insert(index + add_index, imported_dependency)
                    add_index = add_index + 1
            index = index + 1

        return dependencies

    def DirectAndImportedDependencies(self, targets, dependencies=None):
        """Returns a list of a target's direct dependencies and all indirect
    dependencies that a dependency has advertised settings should be exported
    through the dependency for.
    """

        dependencies = self.DirectDependencies(dependencies)
        return self._AddImportedDependencies(targets, dependencies)

    def DeepDependencies(self, dependencies=None):
        """Returns an OrderedSet of all of a target's dependencies, recursively."""
        if dependencies is None:
            # Using a list to get ordered output and a set to do fast "is it
            # already added" checks.
            dependencies = OrderedSet()

        for dependency in self.dependencies:
            # Check for None, corresponding to the root node.
            if dependency.ref is None:
                continue
            if dependency.ref not in dependencies:
                dependency.DeepDependencies(dependencies)
                dependencies.add(dependency.ref)

        return dependencies

    def _LinkDependenciesInternal(
        self, targets, include_shared_libraries, dependencies=None, initial=True
    ):
        """Returns an OrderedSet of dependency targets that are linked
    into this target.

    This function has a split personality, depending on the setting of
    |initial|.  Outside callers should always leave |initial| at its default
    setting.

    When adding a target to the list of dependencies, this function will
    recurse into itself with |initial| set to False, to collect dependencies
    that are linked into the linkable target for which the list is being built.

    If |include_shared_libraries| is False, the resulting dependencies will not
    include shared_library targets that are linked into this target.
    """
        if dependencies is None:
            # Using a list to get ordered output and a set to do fast "is it
            # already added" checks.
            dependencies = OrderedSet()

        # Check for None, corresponding to the root node.
        if self.ref is None:
            return dependencies

        # It's kind of sucky that |targets| has to be passed into this function,
        # but that's presently the easiest way to access the target dicts so that
        # this function can find target types.

        if "target_name" not in targets[self.ref]:
            raise GypError("Missing 'target_name' field in target.")

        if "type" not in targets[self.ref]:
            raise GypError(
                "Missing 'type' field in target %s" % targets[self.ref]["target_name"]
            )

        target_type = targets[self.ref]["type"]

        is_linkable = target_type in linkable_types

        if initial and not is_linkable:
            # If this is the first target being examined and it's not linkable,
            # return an empty list of link dependencies, because the link
            # dependencies are intended to apply to the target itself (initial is
            # True) and this target won't be linked.
            return dependencies

        # Don't traverse 'none' targets if explicitly excluded.
        if target_type == "none" and not targets[self.ref].get(
            "dependencies_traverse", True
        ):
            dependencies.add(self.ref)
            return dependencies

        # Executables, mac kernel extensions, windows drivers and loadable modules
        # are already fully and finally linked. Nothing else can be a link
        # dependency of them, there can only be dependencies in the sense that a
        # dependent target might run an executable or load the loadable_module.
        if not initial and target_type in (
            "executable",
            "loadable_module",
            "mac_kernel_extension",
            "windows_driver",
        ):
            return dependencies

        # Shared libraries are already fully linked.  They should only be included
        # in |dependencies| when adjusting static library dependencies (in order to
        # link against the shared_library's import lib), but should not be included
        # in |dependencies| when propagating link_settings.
        # The |include_shared_libraries| flag controls which of these two cases we
        # are handling.
        if (
            not initial
            and target_type == "shared_library"
            and not include_shared_libraries
        ):
            return dependencies

        # The target is linkable, add it to the list of link dependencies.
        if self.ref not in dependencies:
            dependencies.add(self.ref)
            if initial or not is_linkable:
                # If this is a subsequent target and it's linkable, don't look any
                # further for linkable dependencies, as they'll already be linked into
                # this target linkable.  Always look at dependencies of the initial
                # target, and always look at dependencies of non-linkables.
                for dependency in self.dependencies:
                    dependency._LinkDependenciesInternal(
                        targets, include_shared_libraries, dependencies, False
                    )

        return dependencies

    def DependenciesForLinkSettings(self, targets):
        """
    Returns a list of dependency targets whose link_settings should be merged
    into this target.
    """

        # TODO(sbaig) Currently, chrome depends on the bug that shared libraries'
        # link_settings are propagated.  So for now, we will allow it, unless the
        # 'allow_sharedlib_linksettings_propagation' flag is explicitly set to
        # False.  Once chrome is fixed, we can remove this flag.
        include_shared_libraries = targets[self.ref].get(
            "allow_sharedlib_linksettings_propagation", True
        )
        return self._LinkDependenciesInternal(targets, include_shared_libraries)

    def DependenciesToLinkAgainst(self, targets):
        """
    Returns a list of dependency targets that are linked into this target.
    """
        return self._LinkDependenciesInternal(targets, True)


def BuildDependencyList(targets):
    # Create a DependencyGraphNode for each target.  Put it into a dict for easy
    # access.
    dependency_nodes = {}
    for target, spec in targets.items():
        if target not in dependency_nodes:
            dependency_nodes[target] = DependencyGraphNode(target)

    # Set up the dependency links.  Targets that have no dependencies are treated
    # as dependent on root_node.
    root_node = DependencyGraphNode(None)
    for target, spec in targets.items():
        target_node = dependency_nodes[target]
        dependencies = spec.get("dependencies")
        if not dependencies:
            target_node.dependencies = [root_node]
            root_node.dependents.append(target_node)
        else:
            for dependency in dependencies:
                dependency_node = dependency_nodes.get(dependency)
                if not dependency_node:
                    raise GypError(
                        "Dependency '%s' not found while "
                        "trying to load target %s" % (dependency, target)
                    )
                target_node.dependencies.append(dependency_node)
                dependency_node.dependents.append(target_node)

    flat_list = root_node.FlattenToList()

    # If there's anything left unvisited, there must be a circular dependency
    # (cycle).
    if len(flat_list) != len(targets):
        if not root_node.dependents:
            # If all targets have dependencies, add the first target as a dependent
            # of root_node so that the cycle can be discovered from root_node.
            target = next(iter(targets))
            target_node = dependency_nodes[target]
            target_node.dependencies.append(root_node)
            root_node.dependents.append(target_node)

        cycles = []
        for cycle in root_node.FindCycles():
            paths = [node.ref for node in cycle]
            cycles.append("Cycle: %s" % " -> ".join(paths))
        raise DependencyGraphNode.CircularException(
            "Cycles in dependency graph detected:\n" + "\n".join(cycles)
        )

    return [dependency_nodes, flat_list]


def VerifyNoGYPFileCircularDependencies(targets):
    # Create a DependencyGraphNode for each gyp file containing a target.  Put
    # it into a dict for easy access.
    dependency_nodes = {}
    for target in targets:
        build_file = gyp.common.BuildFile(target)
        if build_file not in dependency_nodes:
            dependency_nodes[build_file] = DependencyGraphNode(build_file)

    # Set up the dependency links.
    for target, spec in targets.items():
        build_file = gyp.common.BuildFile(target)
        build_file_node = dependency_nodes[build_file]
        target_dependencies = spec.get("dependencies", [])
        for dependency in target_dependencies:
            try:
                dependency_build_file = gyp.common.BuildFile(dependency)
            except GypError as e:
                gyp.common.ExceptionAppend(
                    e, "while computing dependencies of .gyp file %s" % build_file
                )
                raise

            if dependency_build_file == build_file:
                # A .gyp file is allowed to refer back to itself.
                continue
            dependency_node = dependency_nodes.get(dependency_build_file)
            if not dependency_node:
                raise GypError("Dependency '%s' not found" % dependency_build_file)
            if dependency_node not in build_file_node.dependencies:
                build_file_node.dependencies.append(dependency_node)
                dependency_node.dependents.append(build_file_node)

    # Files that have no dependencies are treated as dependent on root_node.
    root_node = DependencyGraphNode(None)
    for build_file_node in dependency_nodes.values():
        if len(build_file_node.dependencies) == 0:
            build_file_node.dependencies.append(root_node)
            root_node.dependents.append(build_file_node)

    flat_list = root_node.FlattenToList()

    # If there's anything left unvisited, there must be a circular dependency
    # (cycle).
    if len(flat_list) != len(dependency_nodes):
        if not root_node.dependents:
            # If all files have dependencies, add the first file as a dependent
            # of root_node so that the cycle can be discovered from root_node.
            file_node = next(iter(dependency_nodes.values()))
            file_node.dependencies.append(root_node)
            root_node.dependents.append(file_node)
        cycles = []
        for cycle in root_node.FindCycles():
            paths = [node.ref for node in cycle]
            cycles.append("Cycle: %s" % " -> ".join(paths))
        raise DependencyGraphNode.CircularException(
            "Cycles in .gyp file dependency graph detected:\n" + "\n".join(cycles)
        )


def DoDependentSettings(key, flat_list, targets, dependency_nodes):
    # key should be one of all_dependent_settings, direct_dependent_settings,
    # or link_settings.

    for target in flat_list:
        target_dict = targets[target]
        build_file = gyp.common.BuildFile(target)

        if key == "all_dependent_settings":
            dependencies = dependency_nodes[target].DeepDependencies()
        elif key == "direct_dependent_settings":
            dependencies = dependency_nodes[target].DirectAndImportedDependencies(
                targets
            )
        elif key == "link_settings":
            dependencies = dependency_nodes[target].DependenciesForLinkSettings(targets)
        else:
            raise GypError(
                "DoDependentSettings doesn't know how to determine "
                "dependencies for " + key
            )

        for dependency in dependencies:
            dependency_dict = targets[dependency]
            if key not in dependency_dict:
                continue
            dependency_build_file = gyp.common.BuildFile(dependency)
            MergeDicts(
                target_dict, dependency_dict[key], build_file, dependency_build_file
            )


def AdjustStaticLibraryDependencies(
    flat_list, targets, dependency_nodes, sort_dependencies
):
    # Recompute target "dependencies" properties.  For each static library
    # target, remove "dependencies" entries referring to other static libraries,
    # unless the dependency has the "hard_dependency" attribute set.  For each
    # linkable target, add a "dependencies" entry referring to all of the
    # target's computed list of link dependencies (including static libraries
    # if no such entry is already present.
    for target in flat_list:
        target_dict = targets[target]
        target_type = target_dict["type"]

        if target_type == "static_library":
            if "dependencies" not in target_dict:
                continue

            target_dict["dependencies_original"] = target_dict.get("dependencies", [])[
                :
            ]

            # A static library should not depend on another static library unless
            # the dependency relationship is "hard," which should only be done when
            # a dependent relies on some side effect other than just the build
            # product, like a rule or action output. Further, if a target has a
            # non-hard dependency, but that dependency exports a hard dependency,
            # the non-hard dependency can safely be removed, but the exported hard
            # dependency must be added to the target to keep the same dependency
            # ordering.
            dependencies = dependency_nodes[target].DirectAndImportedDependencies(
                targets
            )
            index = 0
            while index < len(dependencies):
                dependency = dependencies[index]
                dependency_dict = targets[dependency]

                # Remove every non-hard static library dependency and remove every
                # non-static library dependency that isn't a direct dependency.
                if (
                    dependency_dict["type"] == "static_library"
                    and not dependency_dict.get("hard_dependency", False)
                ) or (
                    dependency_dict["type"] != "static_library"
                    and dependency not in target_dict["dependencies"]
                ):
                    # Take the dependency out of the list, and don't increment index
                    # because the next dependency to analyze will shift into the index
                    # formerly occupied by the one being removed.
                    del dependencies[index]
                else:
                    index = index + 1

            # Update the dependencies. If the dependencies list is empty, it's not
            # needed, so unhook it.
            if len(dependencies) > 0:
                target_dict["dependencies"] = dependencies
            else:
                del target_dict["dependencies"]

        elif target_type in linkable_types:
            # Get a list of dependency targets that should be linked into this
            # target.  Add them to the dependencies list if they're not already
            # present.

            link_dependencies = dependency_nodes[target].DependenciesToLinkAgainst(
                targets
            )
            for dependency in link_dependencies:
                if dependency == target:
                    continue
                if "dependencies" not in target_dict:
                    target_dict["dependencies"] = []
                if dependency not in target_dict["dependencies"]:
                    target_dict["dependencies"].append(dependency)
            # Sort the dependencies list in the order from dependents to dependencies.
            # e.g. If A and B depend on C and C depends on D, sort them in A, B, C, D.
            # Note: flat_list is already sorted in the order from dependencies to
            # dependents.
            if sort_dependencies and "dependencies" in target_dict:
                target_dict["dependencies"] = [
                    dep
                    for dep in reversed(flat_list)
                    if dep in target_dict["dependencies"]
                ]


# Initialize this here to speed up MakePathRelative.
exception_re = re.compile(r"""["']?[-/$<>^]""")


def MakePathRelative(to_file, fro_file, item):
    # If item is a relative path, it's relative to the build file dict that it's
    # coming from.  Fix it up to make it relative to the build file dict that
    # it's going into.
    # Exception: any |item| that begins with these special characters is
    # returned without modification.
    #   /   Used when a path is already absolute (shortcut optimization;
    #       such paths would be returned as absolute anyway)
    #   $   Used for build environment variables
    #   -   Used for some build environment flags (such as -lapr-1 in a
    #       "libraries" section)
    #   <   Used for our own variable and command expansions (see ExpandVariables)
    #   >   Used for our own variable and command expansions (see ExpandVariables)
    #   ^   Used for our own variable and command expansions (see ExpandVariables)
    #
    #   "/' Used when a value is quoted.  If these are present, then we
    #       check the second character instead.
    #
    if to_file == fro_file or exception_re.match(item):
        return item
    else:
        # TODO(dglazkov) The backslash/forward-slash replacement at the end is a
        # temporary measure. This should really be addressed by keeping all paths
        # in POSIX until actual project generation.
        ret = os.path.normpath(
            os.path.join(
                gyp.common.RelativePath(
                    os.path.dirname(fro_file), os.path.dirname(to_file)
                ),
                item,
            )
        ).replace("\\", "/")
        if item.endswith("/"):
            ret += "/"
        return ret


def MergeLists(to, fro, to_file, fro_file, is_paths=False, append=True):
    # Python documentation recommends objects which do not support hash
    # set this value to None. Python library objects follow this rule.
    def is_hashable(val):
        return val.__hash__

    # If x is hashable, returns whether x is in s. Else returns whether x is in items.
    def is_in_set_or_list(x, s, items):
        if is_hashable(x):
            return x in s
        return x in items

    prepend_index = 0

    # Make membership testing of hashables in |to| (in particular, strings)
    # faster.
    hashable_to_set = {x for x in to if is_hashable(x)}
    for item in fro:
        singleton = False
        if type(item) in (str, int):
            # The cheap and easy case.
            if is_paths:
                to_item = MakePathRelative(to_file, fro_file, item)
            else:
                to_item = item

            if not (type(item) is str and item.startswith("-")):
                # Any string that doesn't begin with a "-" is a singleton - it can
                # only appear once in a list, to be enforced by the list merge append
                # or prepend.
                singleton = True
        elif type(item) is dict:
            # Make a copy of the dictionary, continuing to look for paths to fix.
            # The other intelligent aspects of merge processing won't apply because
            # item is being merged into an empty dict.
            to_item = {}
            MergeDicts(to_item, item, to_file, fro_file)
        elif type(item) is list:
            # Recurse, making a copy of the list.  If the list contains any
            # descendant dicts, path fixing will occur.  Note that here, custom
            # values for is_paths and append are dropped; those are only to be
            # applied to |to| and |fro|, not sublists of |fro|.  append shouldn't
            # matter anyway because the new |to_item| list is empty.
            to_item = []
            MergeLists(to_item, item, to_file, fro_file)
        else:
            raise TypeError(
                "Attempt to merge list item of unsupported type "
                + item.__class__.__name__
            )

        if append:
            # If appending a singleton that's already in the list, don't append.
            # This ensures that the earliest occurrence of the item will stay put.
            if not singleton or not is_in_set_or_list(to_item, hashable_to_set, to):
                to.append(to_item)
                if is_hashable(to_item):
                    hashable_to_set.add(to_item)
        else:
            # If prepending a singleton that's already in the list, remove the
            # existing instance and proceed with the prepend.  This ensures that the
            # item appears at the earliest possible position in the list.
            while singleton and to_item in to:
                to.remove(to_item)

            # Don't just insert everything at index 0.  That would prepend the new
            # items to the list in reverse order, which would be an unwelcome
            # surprise.
            to.insert(prepend_index, to_item)
            if is_hashable(to_item):
                hashable_to_set.add(to_item)
            prepend_index = prepend_index + 1


def MergeDicts(to, fro, to_file, fro_file):
    # I wanted to name the parameter "from" but it's a Python keyword...
    for k, v in fro.items():
        # It would be nice to do "if not k in to: to[k] = v" but that wouldn't give
        # copy semantics.  Something else may want to merge from the |fro| dict
        # later, and having the same dict ref pointed to twice in the tree isn't
        # what anyone wants considering that the dicts may subsequently be
        # modified.
        if k in to:
            bad_merge = False
            if type(v) in (str, int):
                if type(to[k]) not in (str, int):
                    bad_merge = True
            elif not isinstance(v, type(to[k])):
                bad_merge = True

            if bad_merge:
                raise TypeError(
                    "Attempt to merge dict value of type "
                    + v.__class__.__name__
                    + " into incompatible type "
                    + to[k].__class__.__name__
                    + " for key "
                    + k
                )
        if type(v) in (str, int):
            # Overwrite the existing value, if any.  Cheap and easy.
            is_path = IsPathSection(k)
            if is_path:
                to[k] = MakePathRelative(to_file, fro_file, v)
            else:
                to[k] = v
        elif type(v) is dict:
            # Recurse, guaranteeing copies will be made of objects that require it.
            if k not in to:
                to[k] = {}
            MergeDicts(to[k], v, to_file, fro_file)
        elif type(v) is list:
            # Lists in dicts can be merged with different policies, depending on
            # how the key in the "from" dict (k, the from-key) is written.
            #
            # If the from-key has          ...the to-list will have this action
            # this character appended:...     applied when receiving the from-list:
            #                           =  replace
            #                           +  prepend
            #                           ?  set, only if to-list does not yet exist
            #                      (none)  append
            #
            # This logic is list-specific, but since it relies on the associated
            # dict key, it's checked in this dict-oriented function.
            ext = k[-1]
            append = True
            if ext == "=":
                list_base = k[:-1]
                lists_incompatible = [list_base, list_base + "?"]
                to[list_base] = []
            elif ext == "+":
                list_base = k[:-1]
                lists_incompatible = [list_base + "=", list_base + "?"]
                append = False
            elif ext == "?":
                list_base = k[:-1]
                lists_incompatible = [list_base, list_base + "=", list_base + "+"]
            else:
                list_base = k
                lists_incompatible = [list_base + "=", list_base + "?"]

            # Some combinations of merge policies appearing together are meaningless.
            # It's stupid to replace and append simultaneously, for example.  Append
            # and prepend are the only policies that can coexist.
            for list_incompatible in lists_incompatible:
                if list_incompatible in fro:
                    raise GypError(
                        "Incompatible list policies " + k + " and " + list_incompatible
                    )

            if list_base in to:
                if ext == "?":
                    # If the key ends in "?", the list will only be merged if it doesn't
                    # already exist.
                    continue
                elif type(to[list_base]) is not list:
                    # This may not have been checked above if merging in a list with an
                    # extension character.
                    raise TypeError(
                        "Attempt to merge dict value of type "
                        + v.__class__.__name__
                        + " into incompatible type "
                        + to[list_base].__class__.__name__
                        + " for key "
                        + list_base
                        + "("
                        + k
                        + ")"
                    )
            else:
                to[list_base] = []

            # Call MergeLists, which will make copies of objects that require it.
            # MergeLists can recurse back into MergeDicts, although this will be
            # to make copies of dicts (with paths fixed), there will be no
            # subsequent dict "merging" once entering a list because lists are
            # always replaced, appended to, or prepended to.
            is_paths = IsPathSection(list_base)
            MergeLists(to[list_base], v, to_file, fro_file, is_paths, append)
        else:
            raise TypeError(
                "Attempt to merge dict value of unsupported type "
                + v.__class__.__name__
                + " for key "
                + k
            )


def MergeConfigWithInheritance(
    new_configuration_dict, build_file, target_dict, configuration, visited
):
    # Skip if previously visited.
    if configuration in visited:
        return

    # Look at this configuration.
    configuration_dict = target_dict["configurations"][configuration]

    # Merge in parents.
    for parent in configuration_dict.get("inherit_from", []):
        MergeConfigWithInheritance(
            new_configuration_dict,
            build_file,
            target_dict,
            parent,
            visited + [configuration],
        )

    # Merge it into the new config.
    MergeDicts(new_configuration_dict, configuration_dict, build_file, build_file)

    # Drop abstract.
    if "abstract" in new_configuration_dict:
        del new_configuration_dict["abstract"]


def SetUpConfigurations(target, target_dict):
    # key_suffixes is a list of key suffixes that might appear on key names.
    # These suffixes are handled in conditional evaluations (for =, +, and ?)
    # and rules/exclude processing (for ! and /).  Keys with these suffixes
    # should be treated the same as keys without.
    key_suffixes = ["=", "+", "?", "!", "/"]

    build_file = gyp.common.BuildFile(target)

    # Provide a single configuration by default if none exists.
    # TODO(mark): Signal an error if default_configurations exists but
    # configurations does not.
    if "configurations" not in target_dict:
        target_dict["configurations"] = {"Default": {}}
    if "default_configuration" not in target_dict:
        concrete = [
            i
            for (i, config) in target_dict["configurations"].items()
            if not config.get("abstract")
        ]
        target_dict["default_configuration"] = sorted(concrete)[0]

    merged_configurations = {}
    configs = target_dict["configurations"]
    for (configuration, old_configuration_dict) in configs.items():
        # Skip abstract configurations (saves work only).
        if old_configuration_dict.get("abstract"):
            continue
        # Configurations inherit (most) settings from the enclosing target scope.
        # Get the inheritance relationship right by making a copy of the target
        # dict.
        new_configuration_dict = {}
        for (key, target_val) in target_dict.items():
            key_ext = key[-1:]
            if key_ext in key_suffixes:
                key_base = key[:-1]
            else:
                key_base = key
            if key_base not in non_configuration_keys:
                new_configuration_dict[key] = gyp.simple_copy.deepcopy(target_val)

        # Merge in configuration (with all its parents first).
        MergeConfigWithInheritance(
            new_configuration_dict, build_file, target_dict, configuration, []
        )

        merged_configurations[configuration] = new_configuration_dict

    # Put the new configurations back into the target dict as a configuration.
    for configuration in merged_configurations.keys():
        target_dict["configurations"][configuration] = merged_configurations[
            configuration
        ]

    # Now drop all the abstract ones.
    configs = target_dict["configurations"]
    target_dict["configurations"] = {
        k: v for k, v in configs.items() if not v.get("abstract")
    }

    # Now that all of the target's configurations have been built, go through
    # the target dict's keys and remove everything that's been moved into a
    # "configurations" section.
    delete_keys = []
    for key in target_dict:
        key_ext = key[-1:]
        if key_ext in key_suffixes:
            key_base = key[:-1]
        else:
            key_base = key
        if key_base not in non_configuration_keys:
            delete_keys.append(key)
    for key in delete_keys:
        del target_dict[key]

    # Check the configurations to see if they contain invalid keys.
    for configuration in target_dict["configurations"].keys():
        configuration_dict = target_dict["configurations"][configuration]
        for key in configuration_dict.keys():
            if key in invalid_configuration_keys:
                raise GypError(
                    "%s not allowed in the %s configuration, found in "
                    "target %s" % (key, configuration, target)
                )


def ProcessListFiltersInDict(name, the_dict):
    """Process regular expression and exclusion-based filters on lists.

  An exclusion list is in a dict key named with a trailing "!", like
  "sources!".  Every item in such a list is removed from the associated
  main list, which in this example, would be "sources".  Removed items are
  placed into a "sources_excluded" list in the dict.

  Regular expression (regex) filters are contained in dict keys named with a
  trailing "/", such as "sources/" to operate on the "sources" list.  Regex
  filters in a dict take the form:
    'sources/': [ ['exclude', '_(linux|mac|win)\\.cc$'],
                  ['include', '_mac\\.cc$'] ],
  The first filter says to exclude all files ending in _linux.cc, _mac.cc, and
  _win.cc.  The second filter then includes all files ending in _mac.cc that
  are now or were once in the "sources" list.  Items matching an "exclude"
  filter are subject to the same processing as would occur if they were listed
  by name in an exclusion list (ending in "!").  Items matching an "include"
  filter are brought back into the main list if previously excluded by an
  exclusion list or exclusion regex filter.  Subsequent matching "exclude"
  patterns can still cause items to be excluded after matching an "include".
  """

    # Look through the dictionary for any lists whose keys end in "!" or "/".
    # These are lists that will be treated as exclude lists and regular
    # expression-based exclude/include lists.  Collect the lists that are
    # needed first, looking for the lists that they operate on, and assemble
    # then into |lists|.  This is done in a separate loop up front, because
    # the _included and _excluded keys need to be added to the_dict, and that
    # can't be done while iterating through it.

    lists = []
    del_lists = []
    for key, value in the_dict.items():
        operation = key[-1]
        if operation != "!" and operation != "/":
            continue

        if type(value) is not list:
            raise ValueError(
                name + " key " + key + " must be list, not " + value.__class__.__name__
            )

        list_key = key[:-1]
        if list_key not in the_dict:
            # This happens when there's a list like "sources!" but no corresponding
            # "sources" list.  Since there's nothing for it to operate on, queue up
            # the "sources!" list for deletion now.
            del_lists.append(key)
            continue

        if type(the_dict[list_key]) is not list:
            value = the_dict[list_key]
            raise ValueError(
                name
                + " key "
                + list_key
                + " must be list, not "
                + value.__class__.__name__
                + " when applying "
                + {"!": "exclusion", "/": "regex"}[operation]
            )

        if list_key not in lists:
            lists.append(list_key)

    # Delete the lists that are known to be unneeded at this point.
    for del_list in del_lists:
        del the_dict[del_list]

    for list_key in lists:
        the_list = the_dict[list_key]

        # Initialize the list_actions list, which is parallel to the_list.  Each
        # item in list_actions identifies whether the corresponding item in
        # the_list should be excluded, unconditionally preserved (included), or
        # whether no exclusion or inclusion has been applied.  Items for which
        # no exclusion or inclusion has been applied (yet) have value -1, items
        # excluded have value 0, and items included have value 1.  Includes and
        # excludes override previous actions.  All items in list_actions are
        # initialized to -1 because no excludes or includes have been processed
        # yet.
        list_actions = list((-1,) * len(the_list))

        exclude_key = list_key + "!"
        if exclude_key in the_dict:
            for exclude_item in the_dict[exclude_key]:
                for index, list_item in enumerate(the_list):
                    if exclude_item == list_item:
                        # This item matches the exclude_item, so set its action to 0
                        # (exclude).
                        list_actions[index] = 0

            # The "whatever!" list is no longer needed, dump it.
            del the_dict[exclude_key]

        regex_key = list_key + "/"
        if regex_key in the_dict:
            for regex_item in the_dict[regex_key]:
                [action, pattern] = regex_item
                pattern_re = re.compile(pattern)

                if action == "exclude":
                    # This item matches an exclude regex, set its value to 0 (exclude).
                    action_value = 0
                elif action == "include":
                    # This item matches an include regex, set its value to 1 (include).
                    action_value = 1
                else:
                    # This is an action that doesn't make any sense.
                    raise ValueError(
                        "Unrecognized action "
                        + action
                        + " in "
                        + name
                        + " key "
                        + regex_key
                    )

                for index, list_item in enumerate(the_list):
                    if list_actions[index] == action_value:
                        # Even if the regex matches, nothing will change so continue
                        # (regex searches are expensive).
                        continue
                    if pattern_re.search(list_item):
                        # Regular expression match.
                        list_actions[index] = action_value

            # The "whatever/" list is no longer needed, dump it.
            del the_dict[regex_key]

        # Add excluded items to the excluded list.
        #
        # Note that exclude_key ("sources!") is different from excluded_key
        # ("sources_excluded").  The exclude_key list is input and it was already
        # processed and deleted; the excluded_key list is output and it's about
        # to be created.
        excluded_key = list_key + "_excluded"
        if excluded_key in the_dict:
            raise GypError(
                name + " key " + excluded_key + " must not be present prior "
                " to applying exclusion/regex filters for " + list_key
            )

        excluded_list = []

        # Go backwards through the list_actions list so that as items are deleted,
        # the indices of items that haven't been seen yet don't shift.  That means
        # that things need to be prepended to excluded_list to maintain them in the
        # same order that they existed in the_list.
        for index in range(len(list_actions) - 1, -1, -1):
            if list_actions[index] == 0:
                # Dump anything with action 0 (exclude).  Keep anything with action 1
                # (include) or -1 (no include or exclude seen for the item).
                excluded_list.insert(0, the_list[index])
                del the_list[index]

        # If anything was excluded, put the excluded list into the_dict at
        # excluded_key.
        if len(excluded_list) > 0:
            the_dict[excluded_key] = excluded_list

    # Now recurse into subdicts and lists that may contain dicts.
    for key, value in the_dict.items():
        if type(value) is dict:
            ProcessListFiltersInDict(key, value)
        elif type(value) is list:
            ProcessListFiltersInList(key, value)


def ProcessListFiltersInList(name, the_list):
    for item in the_list:
        if type(item) is dict:
            ProcessListFiltersInDict(name, item)
        elif type(item) is list:
            ProcessListFiltersInList(name, item)


def ValidateTargetType(target, target_dict):
    """Ensures the 'type' field on the target is one of the known types.

  Arguments:
    target: string, name of target.
    target_dict: dict, target spec.

  Raises an exception on error.
  """
    VALID_TARGET_TYPES = (
        "executable",
        "loadable_module",
        "static_library",
        "shared_library",
        "mac_kernel_extension",
        "none",
        "windows_driver",
    )
    target_type = target_dict.get("type", None)
    if target_type not in VALID_TARGET_TYPES:
        raise GypError(
            "Target %s has an invalid target type '%s'.  "
            "Must be one of %s." % (target, target_type, "/".join(VALID_TARGET_TYPES))
        )
    if (
        target_dict.get("standalone_static_library", 0)
        and not target_type == "static_library"
    ):
        raise GypError(
            "Target %s has type %s but standalone_static_library flag is"
            " only valid for static_library type." % (target, target_type)
        )


def ValidateRulesInTarget(target, target_dict, extra_sources_for_rules):
    """Ensures that the rules sections in target_dict are valid and consistent,
  and determines which sources they apply to.

  Arguments:
    target: string, name of target.
    target_dict: dict, target spec containing "rules" and "sources" lists.
    extra_sources_for_rules: a list of keys to scan for rule matches in
        addition to 'sources'.
  """

    # Dicts to map between values found in rules' 'rule_name' and 'extension'
    # keys and the rule dicts themselves.
    rule_names = {}
    rule_extensions = {}

    rules = target_dict.get("rules", [])
    for rule in rules:
        # Make sure that there's no conflict among rule names and extensions.
        rule_name = rule["rule_name"]
        if rule_name in rule_names:
            raise GypError(
                f"rule {rule_name} exists in duplicate, target {target}"
            )
        rule_names[rule_name] = rule

        rule_extension = rule["extension"]
        if rule_extension.startswith("."):
            rule_extension = rule_extension[1:]
        if rule_extension in rule_extensions:
            raise GypError(
                (
                    "extension %s associated with multiple rules, "
                    + "target %s rules %s and %s"
                )
                % (
                    rule_extension,
                    target,
                    rule_extensions[rule_extension]["rule_name"],
                    rule_name,
                )
            )
        rule_extensions[rule_extension] = rule

        # Make sure rule_sources isn't already there.  It's going to be
        # created below if needed.
        if "rule_sources" in rule:
            raise GypError(
                "rule_sources must not exist in input, target %s rule %s"
                % (target, rule_name)
            )

        rule_sources = []
        source_keys = ["sources"]
        source_keys.extend(extra_sources_for_rules)
        for source_key in source_keys:
            for source in target_dict.get(source_key, []):
                (source_root, source_extension) = os.path.splitext(source)
                if source_extension.startswith("."):
                    source_extension = source_extension[1:]
                if source_extension == rule_extension:
                    rule_sources.append(source)

        if len(rule_sources) > 0:
            rule["rule_sources"] = rule_sources


def ValidateRunAsInTarget(target, target_dict, build_file):
    target_name = target_dict.get("target_name")
    run_as = target_dict.get("run_as")
    if not run_as:
        return
    if type(run_as) is not dict:
        raise GypError(
            "The 'run_as' in target %s from file %s should be a "
            "dictionary." % (target_name, build_file)
        )
    action = run_as.get("action")
    if not action:
        raise GypError(
            "The 'run_as' in target %s from file %s must have an "
            "'action' section." % (target_name, build_file)
        )
    if type(action) is not list:
        raise GypError(
            "The 'action' for 'run_as' in target %s from file %s "
            "must be a list." % (target_name, build_file)
        )
    working_directory = run_as.get("working_directory")
    if working_directory and type(working_directory) is not str:
        raise GypError(
            "The 'working_directory' for 'run_as' in target %s "
            "in file %s should be a string." % (target_name, build_file)
        )
    environment = run_as.get("environment")
    if environment and type(environment) is not dict:
        raise GypError(
            "The 'environment' for 'run_as' in target %s "
            "in file %s should be a dictionary." % (target_name, build_file)
        )


def ValidateActionsInTarget(target, target_dict, build_file):
    """Validates the inputs to the actions in a target."""
    target_name = target_dict.get("target_name")
    actions = target_dict.get("actions", [])
    for action in actions:
        action_name = action.get("action_name")
        if not action_name:
            raise GypError(
                "Anonymous action in target %s.  "
                "An action must have an 'action_name' field." % target_name
            )
        inputs = action.get("inputs", None)
        if inputs is None:
            raise GypError("Action in target %s has no inputs." % target_name)
        action_command = action.get("action")
        if action_command and not action_command[0]:
            raise GypError("Empty action as command in target %s." % target_name)


def TurnIntIntoStrInDict(the_dict):
    """Given dict the_dict, recursively converts all integers into strings.
  """
    # Use items instead of iteritems because there's no need to try to look at
    # reinserted keys and their associated values.
    for k, v in the_dict.items():
        if type(v) is int:
            v = str(v)
            the_dict[k] = v
        elif type(v) is dict:
            TurnIntIntoStrInDict(v)
        elif type(v) is list:
            TurnIntIntoStrInList(v)

        if type(k) is int:
            del the_dict[k]
            the_dict[str(k)] = v


def TurnIntIntoStrInList(the_list):
    """Given list the_list, recursively converts all integers into strings.
  """
    for index, item in enumerate(the_list):
        if type(item) is int:
            the_list[index] = str(item)
        elif type(item) is dict:
            TurnIntIntoStrInDict(item)
        elif type(item) is list:
            TurnIntIntoStrInList(item)


def PruneUnwantedTargets(targets, flat_list, dependency_nodes, root_targets, data):
    """Return only the targets that are deep dependencies of |root_targets|."""
    qualified_root_targets = []
    for target in root_targets:
        target = target.strip()
        qualified_targets = gyp.common.FindQualifiedTargets(target, flat_list)
        if not qualified_targets:
            raise GypError("Could not find target %s" % target)
        qualified_root_targets.extend(qualified_targets)

    wanted_targets = {}
    for target in qualified_root_targets:
        wanted_targets[target] = targets[target]
        for dependency in dependency_nodes[target].DeepDependencies():
            wanted_targets[dependency] = targets[dependency]

    wanted_flat_list = [t for t in flat_list if t in wanted_targets]

    # Prune unwanted targets from each build_file's data dict.
    for build_file in data["target_build_files"]:
        if "targets" not in data[build_file]:
            continue
        new_targets = []
        for target in data[build_file]["targets"]:
            qualified_name = gyp.common.QualifiedTarget(
                build_file, target["target_name"], target["toolset"]
            )
            if qualified_name in wanted_targets:
                new_targets.append(target)
        data[build_file]["targets"] = new_targets

    return wanted_targets, wanted_flat_list


def VerifyNoCollidingTargets(targets):
    """Verify that no two targets in the same directory share the same name.

  Arguments:
    targets: A list of targets in the form 'path/to/file.gyp:target_name'.
  """
    # Keep a dict going from 'subdirectory:target_name' to 'foo.gyp'.
    used = {}
    for target in targets:
        # Separate out 'path/to/file.gyp, 'target_name' from
        # 'path/to/file.gyp:target_name'.
        path, name = target.rsplit(":", 1)
        # Separate out 'path/to', 'file.gyp' from 'path/to/file.gyp'.
        subdir, gyp = os.path.split(path)
        # Use '.' for the current directory '', so that the error messages make
        # more sense.
        if not subdir:
            subdir = "."
        # Prepare a key like 'path/to:target_name'.
        key = subdir + ":" + name
        if key in used:
            # Complain if this target is already used.
            raise GypError(
                'Duplicate target name "%s" in directory "%s" used both '
                'in "%s" and "%s".' % (name, subdir, gyp, used[key])
            )
        used[key] = gyp


def SetGeneratorGlobals(generator_input_info):
    # Set up path_sections and non_configuration_keys with the default data plus
    # the generator-specific data.
    global path_sections
    path_sections = set(base_path_sections)
    path_sections.update(generator_input_info["path_sections"])

    global non_configuration_keys
    non_configuration_keys = base_non_configuration_keys[:]
    non_configuration_keys.extend(generator_input_info["non_configuration_keys"])

    global multiple_toolsets
    multiple_toolsets = generator_input_info["generator_supports_multiple_toolsets"]

    global generator_filelist_paths
    generator_filelist_paths = generator_input_info["generator_filelist_paths"]


def Load(
    build_files,
    variables,
    includes,
    depth,
    generator_input_info,
    check,
    circular_check,
    parallel,
    root_targets,
):
    SetGeneratorGlobals(generator_input_info)
    # A generator can have other lists (in addition to sources) be processed
    # for rules.
    extra_sources_for_rules = generator_input_info["extra_sources_for_rules"]

    # Load build files.  This loads every target-containing build file into
    # the |data| dictionary such that the keys to |data| are build file names,
    # and the values are the entire build file contents after "early" or "pre"
    # processing has been done and includes have been resolved.
    # NOTE: data contains both "target" files (.gyp) and "includes" (.gypi), as
    # well as meta-data (e.g. 'included_files' key). 'target_build_files' keeps
    # track of the keys corresponding to "target" files.
    data = {"target_build_files": set()}
    # Normalize paths everywhere.  This is important because paths will be
    # used as keys to the data dict and for references between input files.
    build_files = set(map(os.path.normpath, build_files))
    if parallel:
        LoadTargetBuildFilesParallel(
            build_files, data, variables, includes, depth, check, generator_input_info
        )
    else:
        aux_data = {}
        for build_file in build_files:
            try:
                LoadTargetBuildFile(
                    build_file, data, aux_data, variables, includes, depth, check, True
                )
            except Exception as e:
                gyp.common.ExceptionAppend(e, "while trying to load %s" % build_file)
                raise

    # Build a dict to access each target's subdict by qualified name.
    targets = BuildTargetsDict(data)

    # Fully qualify all dependency links.
    QualifyDependencies(targets)

    # Remove self-dependencies from targets that have 'prune_self_dependencies'
    # set to 1.
    RemoveSelfDependencies(targets)

    # Expand dependencies specified as build_file:*.
    ExpandWildcardDependencies(targets, data)

    # Remove all dependencies marked as 'link_dependency' from the targets of
    # type 'none'.
    RemoveLinkDependenciesFromNoneTargets(targets)

    # Apply exclude (!) and regex (/) list filters only for dependency_sections.
    for target_name, target_dict in targets.items():
        tmp_dict = {}
        for key_base in dependency_sections:
            for op in ("", "!", "/"):
                key = key_base + op
                if key in target_dict:
                    tmp_dict[key] = target_dict[key]
                    del target_dict[key]
        ProcessListFiltersInDict(target_name, tmp_dict)
        # Write the results back to |target_dict|.
        for key in tmp_dict:
            target_dict[key] = tmp_dict[key]

    # Make sure every dependency appears at most once.
    RemoveDuplicateDependencies(targets)

    if circular_check:
        # Make sure that any targets in a.gyp don't contain dependencies in other
        # .gyp files that further depend on a.gyp.
        VerifyNoGYPFileCircularDependencies(targets)

    [dependency_nodes, flat_list] = BuildDependencyList(targets)

    if root_targets:
        # Remove, from |targets| and |flat_list|, the targets that are not deep
        # dependencies of the targets specified in |root_targets|.
        targets, flat_list = PruneUnwantedTargets(
            targets, flat_list, dependency_nodes, root_targets, data
        )

    # Check that no two targets in the same directory have the same name.
    VerifyNoCollidingTargets(flat_list)

    # Handle dependent settings of various types.
    for settings_type in [
        "all_dependent_settings",
        "direct_dependent_settings",
        "link_settings",
    ]:
        DoDependentSettings(settings_type, flat_list, targets, dependency_nodes)

        # Take out the dependent settings now that they've been published to all
        # of the targets that require them.
        for target in flat_list:
            if settings_type in targets[target]:
                del targets[target][settings_type]

    # Make sure static libraries don't declare dependencies on other static
    # libraries, but that linkables depend on all unlinked static libraries
    # that they need so that their link steps will be correct.
    gii = generator_input_info
    if gii["generator_wants_static_library_dependencies_adjusted"]:
        AdjustStaticLibraryDependencies(
            flat_list,
            targets,
            dependency_nodes,
            gii["generator_wants_sorted_dependencies"],
        )

    # Apply "post"/"late"/"target" variable expansions and condition evaluations.
    for target in flat_list:
        target_dict = targets[target]
        build_file = gyp.common.BuildFile(target)
        ProcessVariablesAndConditionsInDict(
            target_dict, PHASE_LATE, variables, build_file
        )

    # Move everything that can go into a "configurations" section into one.
    for target in flat_list:
        target_dict = targets[target]
        SetUpConfigurations(target, target_dict)

    # Apply exclude (!) and regex (/) list filters.
    for target in flat_list:
        target_dict = targets[target]
        ProcessListFiltersInDict(target, target_dict)

    # Apply "latelate" variable expansions and condition evaluations.
    for target in flat_list:
        target_dict = targets[target]
        build_file = gyp.common.BuildFile(target)
        ProcessVariablesAndConditionsInDict(
            target_dict, PHASE_LATELATE, variables, build_file
        )

    # Make sure that the rules make sense, and build up rule_sources lists as
    # needed.  Not all generators will need to use the rule_sources lists, but
    # some may, and it seems best to build the list in a common spot.
    # Also validate actions and run_as elements in targets.
    for target in flat_list:
        target_dict = targets[target]
        build_file = gyp.common.BuildFile(target)
        ValidateTargetType(target, target_dict)
        ValidateRulesInTarget(target, target_dict, extra_sources_for_rules)
        ValidateRunAsInTarget(target, target_dict, build_file)
        ValidateActionsInTarget(target, target_dict, build_file)

    # Generators might not expect ints.  Turn them into strs.
    TurnIntIntoStrInDict(data)

    # TODO(mark): Return |data| for now because the generator needs a list of
    # build files that came in.  In the future, maybe it should just accept
    # a list, and not the whole data dict.
    return [flat_list, targets, data]
#!/usr/bin/env python3

# Copyright 2013 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Unit tests for the input.py file."""

import gyp.input
import unittest


class TestFindCycles(unittest.TestCase):
    def setUp(self):
        self.nodes = {}
        for x in ("a", "b", "c", "d", "e"):
            self.nodes[x] = gyp.input.DependencyGraphNode(x)

    def _create_dependency(self, dependent, dependency):
        dependent.dependencies.append(dependency)
        dependency.dependents.append(dependent)

    def test_no_cycle_empty_graph(self):
        for label, node in self.nodes.items():
            self.assertEqual([], node.FindCycles())

    def test_no_cycle_line(self):
        self._create_dependency(self.nodes["a"], self.nodes["b"])
        self._create_dependency(self.nodes["b"], self.nodes["c"])
        self._create_dependency(self.nodes["c"], self.nodes["d"])

        for label, node in self.nodes.items():
            self.assertEqual([], node.FindCycles())

    def test_no_cycle_dag(self):
        self._create_dependency(self.nodes["a"], self.nodes["b"])
        self._create_dependency(self.nodes["a"], self.nodes["c"])
        self._create_dependency(self.nodes["b"], self.nodes["c"])

        for label, node in self.nodes.items():
            self.assertEqual([], node.FindCycles())

    def test_cycle_self_reference(self):
        self._create_dependency(self.nodes["a"], self.nodes["a"])

        self.assertEqual(
            [[self.nodes["a"], self.nodes["a"]]], self.nodes["a"].FindCycles()
        )

    def test_cycle_two_nodes(self):
        self._create_dependency(self.nodes["a"], self.nodes["b"])
        self._create_dependency(self.nodes["b"], self.nodes["a"])

        self.assertEqual(
            [[self.nodes["a"], self.nodes["b"], self.nodes["a"]]],
            self.nodes["a"].FindCycles(),
        )
        self.assertEqual(
            [[self.nodes["b"], self.nodes["a"], self.nodes["b"]]],
            self.nodes["b"].FindCycles(),
        )

    def test_two_cycles(self):
        self._create_dependency(self.nodes["a"], self.nodes["b"])
        self._create_dependency(self.nodes["b"], self.nodes["a"])

        self._create_dependency(self.nodes["b"], self.nodes["c"])
        self._create_dependency(self.nodes["c"], self.nodes["b"])

        cycles = self.nodes["a"].FindCycles()
        self.assertTrue([self.nodes["a"], self.nodes["b"], self.nodes["a"]] in cycles)
        self.assertTrue([self.nodes["b"], self.nodes["c"], self.nodes["b"]] in cycles)
        self.assertEqual(2, len(cycles))

    def test_big_cycle(self):
        self._create_dependency(self.nodes["a"], self.nodes["b"])
        self._create_dependency(self.nodes["b"], self.nodes["c"])
        self._create_dependency(self.nodes["c"], self.nodes["d"])
        self._create_dependency(self.nodes["d"], self.nodes["e"])
        self._create_dependency(self.nodes["e"], self.nodes["a"])

        self.assertEqual(
            [
                [
                    self.nodes["a"],
                    self.nodes["b"],
                    self.nodes["c"],
                    self.nodes["d"],
                    self.nodes["e"],
                    self.nodes["a"],
                ]
            ],
            self.nodes["a"].FindCycles(),
        )


if __name__ == "__main__":
    unittest.main()
#!/usr/bin/env python3
# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Utility functions to perform Xcode-style build steps.

These functions are executed via gyp-mac-tool when using the Makefile generator.
"""


import fcntl
import fnmatch
import glob
import json
import os
import plistlib
import re
import shutil
import struct
import subprocess
import sys
import tempfile


def main(args):
    executor = MacTool()
    exit_code = executor.Dispatch(args)
    if exit_code is not None:
        sys.exit(exit_code)


class MacTool:
    """This class performs all the Mac tooling steps. The methods can either be
  executed directly, or dispatched from an argument list."""

    def Dispatch(self, args):
        """Dispatches a string command to a method."""
        if len(args) < 1:
            raise Exception("Not enough arguments")

        method = "Exec%s" % self._CommandifyName(args[0])
        return getattr(self, method)(*args[1:])

    def _CommandifyName(self, name_string):
        """Transforms a tool name like copy-info-plist to CopyInfoPlist"""
        return name_string.title().replace("-", "")

    def ExecCopyBundleResource(self, source, dest, convert_to_binary):
        """Copies a resource file to the bundle/Resources directory, performing any
    necessary compilation on each resource."""
        convert_to_binary = convert_to_binary == "True"
        extension = os.path.splitext(source)[1].lower()
        if os.path.isdir(source):
            # Copy tree.
            # TODO(thakis): This copies file attributes like mtime, while the
            # single-file branch below doesn't. This should probably be changed to
            # be consistent with the single-file branch.
            if os.path.exists(dest):
                shutil.rmtree(dest)
            shutil.copytree(source, dest)
        elif extension == ".xib":
            return self._CopyXIBFile(source, dest)
        elif extension == ".storyboard":
            return self._CopyXIBFile(source, dest)
        elif extension == ".strings" and not convert_to_binary:
            self._CopyStringsFile(source, dest)
        else:
            if os.path.exists(dest):
                os.unlink(dest)
            shutil.copy(source, dest)

        if convert_to_binary and extension in (".plist", ".strings"):
            self._ConvertToBinary(dest)

    def _CopyXIBFile(self, source, dest):
        """Compiles a XIB file with ibtool into a binary plist in the bundle."""

        # ibtool sometimes crashes with relative paths. See crbug.com/314728.
        base = os.path.dirname(os.path.realpath(__file__))
        if os.path.relpath(source):
            source = os.path.join(base, source)
        if os.path.relpath(dest):
            dest = os.path.join(base, dest)

        args = ["xcrun", "ibtool", "--errors", "--warnings", "--notices"]

        if os.environ["XCODE_VERSION_ACTUAL"] > "0700":
            args.extend(["--auto-activate-custom-fonts"])
            if "IPHONEOS_DEPLOYMENT_TARGET" in os.environ:
                args.extend(
                    [
                        "--target-device",
                        "iphone",
                        "--target-device",
                        "ipad",
                        "--minimum-deployment-target",
                        os.environ["IPHONEOS_DEPLOYMENT_TARGET"],
                    ]
                )
            else:
                args.extend(
                    [
                        "--target-device",
                        "mac",
                        "--minimum-deployment-target",
                        os.environ["MACOSX_DEPLOYMENT_TARGET"],
                    ]
                )

        args.extend(
            ["--output-format", "human-readable-text", "--compile", dest, source]
        )

        ibtool_section_re = re.compile(r"/\*.*\*/")
        ibtool_re = re.compile(r".*note:.*is clipping its content")
        try:
            stdout = subprocess.check_output(args)
        except subprocess.CalledProcessError as e:
            print(e.output)
            raise
        current_section_header = None
        for line in stdout.splitlines():
            if ibtool_section_re.match(line):
                current_section_header = line
            elif not ibtool_re.match(line):
                if current_section_header:
                    print(current_section_header)
                    current_section_header = None
                print(line)
        return 0

    def _ConvertToBinary(self, dest):
        subprocess.check_call(
            ["xcrun", "plutil", "-convert", "binary1", "-o", dest, dest]
        )

    def _CopyStringsFile(self, source, dest):
        """Copies a .strings file using iconv to reconvert the input into UTF-16."""
        input_code = self._DetectInputEncoding(source) or "UTF-8"

        # Xcode's CpyCopyStringsFile / builtin-copyStrings seems to call
        # CFPropertyListCreateFromXMLData() behind the scenes; at least it prints
        #     CFPropertyListCreateFromXMLData(): Old-style plist parser: missing
        #     semicolon in dictionary.
        # on invalid files. Do the same kind of validation.
        import CoreFoundation

        with open(source, "rb") as in_file:
            s = in_file.read()
        d = CoreFoundation.CFDataCreate(None, s, len(s))
        _, error = CoreFoundation.CFPropertyListCreateFromXMLData(None, d, 0, None)
        if error:
            return

        with open(dest, "wb") as fp:
            fp.write(s.decode(input_code).encode("UTF-16"))

    def _DetectInputEncoding(self, file_name):
        """Reads the first few bytes from file_name and tries to guess the text
    encoding. Returns None as a guess if it can't detect it."""
        with open(file_name, "rb") as fp:
            try:
                header = fp.read(3)
            except Exception:
                return None
        if header.startswith(b"\xFE\xFF"):
            return "UTF-16"
        elif header.startswith(b"\xFF\xFE"):
            return "UTF-16"
        elif header.startswith(b"\xEF\xBB\xBF"):
            return "UTF-8"
        else:
            return None

    def ExecCopyInfoPlist(self, source, dest, convert_to_binary, *keys):
        """Copies the |source| Info.plist to the destination directory |dest|."""
        # Read the source Info.plist into memory.
        with open(source) as fd:
            lines = fd.read()

        # Insert synthesized key/value pairs (e.g. BuildMachineOSBuild).
        plist = plistlib.readPlistFromString(lines)
        if keys:
            plist.update(json.loads(keys[0]))
        lines = plistlib.writePlistToString(plist)

        # Go through all the environment variables and replace them as variables in
        # the file.
        IDENT_RE = re.compile(r"[_/\s]")
        for key in os.environ:
            if key.startswith("_"):
                continue
            evar = "${%s}" % key
            evalue = os.environ[key]
            lines = lines.replace(lines, evar, evalue)

            # Xcode supports various suffices on environment variables, which are
            # all undocumented. :rfc1034identifier is used in the standard project
            # template these days, and :identifier was used earlier. They are used to
            # convert non-url characters into things that look like valid urls --
            # except that the replacement character for :identifier, '_' isn't valid
            # in a URL either -- oops, hence :rfc1034identifier was born.
            evar = "${%s:identifier}" % key
            evalue = IDENT_RE.sub("_", os.environ[key])
            lines = lines.replace(lines, evar, evalue)

            evar = "${%s:rfc1034identifier}" % key
            evalue = IDENT_RE.sub("-", os.environ[key])
            lines = lines.replace(lines, evar, evalue)

        # Remove any keys with values that haven't been replaced.
        lines = lines.splitlines()
        for i in range(len(lines)):
            if lines[i].strip().startswith("<string>${"):
                lines[i] = None
                lines[i - 1] = None
        lines = "\n".join(line for line in lines if line is not None)

        # Write out the file with variables replaced.
        with open(dest, "w") as fd:
            fd.write(lines)

        # Now write out PkgInfo file now that the Info.plist file has been
        # "compiled".
        self._WritePkgInfo(dest)

        if convert_to_binary == "True":
            self._ConvertToBinary(dest)

    def _WritePkgInfo(self, info_plist):
        """This writes the PkgInfo file from the data stored in Info.plist."""
        plist = plistlib.readPlist(info_plist)
        if not plist:
            return

        # Only create PkgInfo for executable types.
        package_type = plist["CFBundlePackageType"]
        if package_type != "APPL":
            return

        # The format of PkgInfo is eight characters, representing the bundle type
        # and bundle signature, each four characters. If that is missing, four
        # '?' characters are used instead.
        signature_code = plist.get("CFBundleSignature", "????")
        if len(signature_code) != 4:  # Wrong length resets everything, too.
            signature_code = "?" * 4

        dest = os.path.join(os.path.dirname(info_plist), "PkgInfo")
        with open(dest, "w") as fp:
            fp.write(f"{package_type}{signature_code}")

    def ExecFlock(self, lockfile, *cmd_list):
        """Emulates the most basic behavior of Linux's flock(1)."""
        # Rely on exception handling to report errors.
        fd = os.open(lockfile, os.O_RDONLY | os.O_NOCTTY | os.O_CREAT, 0o666)
        fcntl.flock(fd, fcntl.LOCK_EX)
        return subprocess.call(cmd_list)

    def ExecFilterLibtool(self, *cmd_list):
        """Calls libtool and filters out '/path/to/libtool: file: foo.o has no
    symbols'."""
        libtool_re = re.compile(
            r"^.*libtool: (?:for architecture: \S* )?" r"file: .* has no symbols$"
        )
        libtool_re5 = re.compile(
            r"^.*libtool: warning for library: "
            + r".* the table of contents is empty "
            + r"\(no object file members in the library define global symbols\)$"
        )
        env = os.environ.copy()
        # Ref:
        # http://www.opensource.apple.com/source/cctools/cctools-809/misc/libtool.c
        # The problem with this flag is that it resets the file mtime on the file to
        # epoch=0, e.g. 1970-1-1 or 1969-12-31 depending on timezone.
        env["ZERO_AR_DATE"] = "1"
        libtoolout = subprocess.Popen(cmd_list, stderr=subprocess.PIPE, env=env)
        err = libtoolout.communicate()[1].decode("utf-8")
        for line in err.splitlines():
            if not libtool_re.match(line) and not libtool_re5.match(line):
                print(line, file=sys.stderr)
        # Unconditionally touch the output .a file on the command line if present
        # and the command succeeded. A bit hacky.
        if not libtoolout.returncode:
            for i in range(len(cmd_list) - 1):
                if cmd_list[i] == "-o" and cmd_list[i + 1].endswith(".a"):
                    os.utime(cmd_list[i + 1], None)
                    break
        return libtoolout.returncode

    def ExecPackageIosFramework(self, framework):
        # Find the name of the binary based on the part before the ".framework".
        binary = os.path.basename(framework).split(".")[0]
        module_path = os.path.join(framework, "Modules")
        if not os.path.exists(module_path):
            os.mkdir(module_path)
        module_template = (
            "framework module %s {\n"
            '  umbrella header "%s.h"\n'
            "\n"
            "  export *\n"
            "  module * { export * }\n"
            "}\n" % (binary, binary)
        )

        with open(os.path.join(module_path, "module.modulemap"), "w") as module_file:
            module_file.write(module_template)

    def ExecPackageFramework(self, framework, version):
        """Takes a path to Something.framework and the Current version of that and
    sets up all the symlinks."""
        # Find the name of the binary based on the part before the ".framework".
        binary = os.path.basename(framework).split(".")[0]

        CURRENT = "Current"
        RESOURCES = "Resources"
        VERSIONS = "Versions"

        if not os.path.exists(os.path.join(framework, VERSIONS, version, binary)):
            # Binary-less frameworks don't seem to contain symlinks (see e.g.
            # chromium's out/Debug/org.chromium.Chromium.manifest/ bundle).
            return

        # Move into the framework directory to set the symlinks correctly.
        pwd = os.getcwd()
        os.chdir(framework)

        # Set up the Current version.
        self._Relink(version, os.path.join(VERSIONS, CURRENT))

        # Set up the root symlinks.
        self._Relink(os.path.join(VERSIONS, CURRENT, binary), binary)
        self._Relink(os.path.join(VERSIONS, CURRENT, RESOURCES), RESOURCES)

        # Back to where we were before!
        os.chdir(pwd)

    def _Relink(self, dest, link):
        """Creates a symlink to |dest| named |link|. If |link| already exists,
    it is overwritten."""
        if os.path.lexists(link):
            os.remove(link)
        os.symlink(dest, link)

    def ExecCompileIosFrameworkHeaderMap(self, out, framework, *all_headers):
        framework_name = os.path.basename(framework).split(".")[0]
        all_headers = [os.path.abspath(header) for header in all_headers]
        filelist = {}
        for header in all_headers:
            filename = os.path.basename(header)
            filelist[filename] = header
            filelist[os.path.join(framework_name, filename)] = header
        WriteHmap(out, filelist)

    def ExecCopyIosFrameworkHeaders(self, framework, *copy_headers):
        header_path = os.path.join(framework, "Headers")
        if not os.path.exists(header_path):
            os.makedirs(header_path)
        for header in copy_headers:
            shutil.copy(header, os.path.join(header_path, os.path.basename(header)))

    def ExecCompileXcassets(self, keys, *inputs):
        """Compiles multiple .xcassets files into a single .car file.

    This invokes 'actool' to compile all the inputs .xcassets files. The
    |keys| arguments is a json-encoded dictionary of extra arguments to
    pass to 'actool' when the asset catalogs contains an application icon
    or a launch image.

    Note that 'actool' does not create the Assets.car file if the asset
    catalogs does not contains imageset.
    """
        command_line = [
            "xcrun",
            "actool",
            "--output-format",
            "human-readable-text",
            "--compress-pngs",
            "--notices",
            "--warnings",
            "--errors",
        ]
        is_iphone_target = "IPHONEOS_DEPLOYMENT_TARGET" in os.environ
        if is_iphone_target:
            platform = os.environ["CONFIGURATION"].split("-")[-1]
            if platform not in ("iphoneos", "iphonesimulator"):
                platform = "iphonesimulator"
            command_line.extend(
                [
                    "--platform",
                    platform,
                    "--target-device",
                    "iphone",
                    "--target-device",
                    "ipad",
                    "--minimum-deployment-target",
                    os.environ["IPHONEOS_DEPLOYMENT_TARGET"],
                    "--compile",
                    os.path.abspath(os.environ["CONTENTS_FOLDER_PATH"]),
                ]
            )
        else:
            command_line.extend(
                [
                    "--platform",
                    "macosx",
                    "--target-device",
                    "mac",
                    "--minimum-deployment-target",
                    os.environ["MACOSX_DEPLOYMENT_TARGET"],
                    "--compile",
                    os.path.abspath(os.environ["UNLOCALIZED_RESOURCES_FOLDER_PATH"]),
                ]
            )
        if keys:
            keys = json.loads(keys)
            for key, value in keys.items():
                arg_name = "--" + key
                if isinstance(value, bool):
                    if value:
                        command_line.append(arg_name)
                elif isinstance(value, list):
                    for v in value:
                        command_line.append(arg_name)
                        command_line.append(str(v))
                else:
                    command_line.append(arg_name)
                    command_line.append(str(value))
        # Note: actool crashes if inputs path are relative, so use os.path.abspath
        # to get absolute path name for inputs.
        command_line.extend(map(os.path.abspath, inputs))
        subprocess.check_call(command_line)

    def ExecMergeInfoPlist(self, output, *inputs):
        """Merge multiple .plist files into a single .plist file."""
        merged_plist = {}
        for path in inputs:
            plist = self._LoadPlistMaybeBinary(path)
            self._MergePlist(merged_plist, plist)
        plistlib.writePlist(merged_plist, output)

    def ExecCodeSignBundle(self, key, entitlements, provisioning, path, preserve):
        """Code sign a bundle.

    This function tries to code sign an iOS bundle, following the same
    algorithm as Xcode:
      1. pick the provisioning profile that best match the bundle identifier,
         and copy it into the bundle as embedded.mobileprovision,
      2. copy Entitlements.plist from user or SDK next to the bundle,
      3. code sign the bundle.
    """
        substitutions, overrides = self._InstallProvisioningProfile(
            provisioning, self._GetCFBundleIdentifier()
        )
        entitlements_path = self._InstallEntitlements(
            entitlements, substitutions, overrides
        )

        args = ["codesign", "--force", "--sign", key]
        if preserve == "True":
            args.extend(["--deep", "--preserve-metadata=identifier,entitlements"])
        else:
            args.extend(["--entitlements", entitlements_path])
        args.extend(["--timestamp=none", path])
        subprocess.check_call(args)

    def _InstallProvisioningProfile(self, profile, bundle_identifier):
        """Installs embedded.mobileprovision into the bundle.

    Args:
      profile: string, optional, short name of the .mobileprovision file
        to use, if empty or the file is missing, the best file installed
        will be used
      bundle_identifier: string, value of CFBundleIdentifier from Info.plist

    Returns:
      A tuple containing two dictionary: variables substitutions and values
      to overrides when generating the entitlements file.
    """
        source_path, provisioning_data, team_id = self._FindProvisioningProfile(
            profile, bundle_identifier
        )
        target_path = os.path.join(
            os.environ["BUILT_PRODUCTS_DIR"],
            os.environ["CONTENTS_FOLDER_PATH"],
            "embedded.mobileprovision",
        )
        shutil.copy2(source_path, target_path)
        substitutions = self._GetSubstitutions(bundle_identifier, team_id + ".")
        return substitutions, provisioning_data["Entitlements"]

    def _FindProvisioningProfile(self, profile, bundle_identifier):
        """Finds the .mobileprovision file to use for signing the bundle.

    Checks all the installed provisioning profiles (or if the user specified
    the PROVISIONING_PROFILE variable, only consult it) and select the most
    specific that correspond to the bundle identifier.

    Args:
      profile: string, optional, short name of the .mobileprovision file
        to use, if empty or the file is missing, the best file installed
        will be used
      bundle_identifier: string, value of CFBundleIdentifier from Info.plist

    Returns:
      A tuple of the path to the selected provisioning profile, the data of
      the embedded plist in the provisioning profile and the team identifier
      to use for code signing.

    Raises:
      SystemExit: if no .mobileprovision can be used to sign the bundle.
    """
        profiles_dir = os.path.join(
            os.environ["HOME"], "Library", "MobileDevice", "Provisioning Profiles"
        )
        if not os.path.isdir(profiles_dir):
            print(
                "cannot find mobile provisioning for %s" % (bundle_identifier),
                file=sys.stderr,
            )
            sys.exit(1)
        provisioning_profiles = None
        if profile:
            profile_path = os.path.join(profiles_dir, profile + ".mobileprovision")
            if os.path.exists(profile_path):
                provisioning_profiles = [profile_path]
        if not provisioning_profiles:
            provisioning_profiles = glob.glob(
                os.path.join(profiles_dir, "*.mobileprovision")
            )
        valid_provisioning_profiles = {}
        for profile_path in provisioning_profiles:
            profile_data = self._LoadProvisioningProfile(profile_path)
            app_id_pattern = profile_data.get("Entitlements", {}).get(
                "application-identifier", ""
            )
            for team_identifier in profile_data.get("TeamIdentifier", []):
                app_id = f"{team_identifier}.{bundle_identifier}"
                if fnmatch.fnmatch(app_id, app_id_pattern):
                    valid_provisioning_profiles[app_id_pattern] = (
                        profile_path,
                        profile_data,
                        team_identifier,
                    )
        if not valid_provisioning_profiles:
            print(
                "cannot find mobile provisioning for %s" % (bundle_identifier),
                file=sys.stderr,
            )
            sys.exit(1)
        # If the user has multiple provisioning profiles installed that can be
        # used for ${bundle_identifier}, pick the most specific one (ie. the
        # provisioning profile whose pattern is the longest).
        selected_key = max(valid_provisioning_profiles, key=lambda v: len(v))
        return valid_provisioning_profiles[selected_key]

    def _LoadProvisioningProfile(self, profile_path):
        """Extracts the plist embedded in a provisioning profile.

    Args:
      profile_path: string, path to the .mobileprovision file

    Returns:
      Content of the plist embedded in the provisioning profile as a dictionary.
    """
        with tempfile.NamedTemporaryFile() as temp:
            subprocess.check_call(
                ["security", "cms", "-D", "-i", profile_path, "-o", temp.name]
            )
            return self._LoadPlistMaybeBinary(temp.name)

    def _MergePlist(self, merged_plist, plist):
        """Merge |plist| into |merged_plist|."""
        for key, value in plist.items():
            if isinstance(value, dict):
                merged_value = merged_plist.get(key, {})
                if isinstance(merged_value, dict):
                    self._MergePlist(merged_value, value)
                    merged_plist[key] = merged_value
                else:
                    merged_plist[key] = value
            else:
                merged_plist[key] = value

    def _LoadPlistMaybeBinary(self, plist_path):
        """Loads into a memory a plist possibly encoded in binary format.

    This is a wrapper around plistlib.readPlist that tries to convert the
    plist to the XML format if it can't be parsed (assuming that it is in
    the binary format).

    Args:
      plist_path: string, path to a plist file, in XML or binary format

    Returns:
      Content of the plist as a dictionary.
    """
        try:
            # First, try to read the file using plistlib that only supports XML,
            # and if an exception is raised, convert a temporary copy to XML and
            # load that copy.
            return plistlib.readPlist(plist_path)
        except Exception:
            pass
        with tempfile.NamedTemporaryFile() as temp:
            shutil.copy2(plist_path, temp.name)
            subprocess.check_call(["plutil", "-convert", "xml1", temp.name])
            return plistlib.readPlist(temp.name)

    def _GetSubstitutions(self, bundle_identifier, app_identifier_prefix):
        """Constructs a dictionary of variable substitutions for Entitlements.plist.

    Args:
      bundle_identifier: string, value of CFBundleIdentifier from Info.plist
      app_identifier_prefix: string, value for AppIdentifierPrefix

    Returns:
      Dictionary of substitutions to apply when generating Entitlements.plist.
    """
        return {
            "CFBundleIdentifier": bundle_identifier,
            "AppIdentifierPrefix": app_identifier_prefix,
        }

    def _GetCFBundleIdentifier(self):
        """Extracts CFBundleIdentifier value from Info.plist in the bundle.

    Returns:
      Value of CFBundleIdentifier in the Info.plist located in the bundle.
    """
        info_plist_path = os.path.join(
            os.environ["TARGET_BUILD_DIR"], os.environ["INFOPLIST_PATH"]
        )
        info_plist_data = self._LoadPlistMaybeBinary(info_plist_path)
        return info_plist_data["CFBundleIdentifier"]

    def _InstallEntitlements(self, entitlements, substitutions, overrides):
        """Generates and install the ${BundleName}.xcent entitlements file.

    Expands variables "$(variable)" pattern in the source entitlements file,
    add extra entitlements defined in the .mobileprovision file and the copy
    the generated plist to "${BundlePath}.xcent".

    Args:
      entitlements: string, optional, path to the Entitlements.plist template
        to use, defaults to "${SDKROOT}/Entitlements.plist"
      substitutions: dictionary, variable substitutions
      overrides: dictionary, values to add to the entitlements

    Returns:
      Path to the generated entitlements file.
    """
        source_path = entitlements
        target_path = os.path.join(
            os.environ["BUILT_PRODUCTS_DIR"], os.environ["PRODUCT_NAME"] + ".xcent"
        )
        if not source_path:
            source_path = os.path.join(os.environ["SDKROOT"], "Entitlements.plist")
        shutil.copy2(source_path, target_path)
        data = self._LoadPlistMaybeBinary(target_path)
        data = self._ExpandVariables(data, substitutions)
        if overrides:
            for key in overrides:
                if key not in data:
                    data[key] = overrides[key]
        plistlib.writePlist(data, target_path)
        return target_path

    def _ExpandVariables(self, data, substitutions):
        """Expands variables "$(variable)" in data.

    Args:
      data: object, can be either string, list or dictionary
      substitutions: dictionary, variable substitutions to perform

    Returns:
      Copy of data where each references to "$(variable)" has been replaced
      by the corresponding value found in substitutions, or left intact if
      the key was not found.
    """
        if isinstance(data, str):
            for key, value in substitutions.items():
                data = data.replace("$(%s)" % key, value)
            return data
        if isinstance(data, list):
            return [self._ExpandVariables(v, substitutions) for v in data]
        if isinstance(data, dict):
            return {k: self._ExpandVariables(data[k], substitutions) for k in data}
        return data


def NextGreaterPowerOf2(x):
    return 2 ** (x).bit_length()


def WriteHmap(output_name, filelist):
    """Generates a header map based on |filelist|.

  Per Mark Mentovai:
    A header map is structured essentially as a hash table, keyed by names used
    in #includes, and providing pathnames to the actual files.

  The implementation below and the comment above comes from inspecting:
    http://www.opensource.apple.com/source/distcc/distcc-2503/distcc_dist/include_server/headermap.py?txt
  while also looking at the implementation in clang in:
    https://llvm.org/svn/llvm-project/cfe/trunk/lib/Lex/HeaderMap.cpp
  """
    magic = 1751998832
    version = 1
    _reserved = 0
    count = len(filelist)
    capacity = NextGreaterPowerOf2(count)
    strings_offset = 24 + (12 * capacity)
    max_value_length = max(len(value) for value in filelist.values())

    out = open(output_name, "wb")
    out.write(
        struct.pack(
            "<LHHLLLL",
            magic,
            version,
            _reserved,
            strings_offset,
            count,
            capacity,
            max_value_length,
        )
    )

    # Create empty hashmap buckets.
    buckets = [None] * capacity
    for file, path in filelist.items():
        key = 0
        for c in file:
            key += ord(c.lower()) * 13

        # Fill next empty bucket.
        while buckets[key & capacity - 1] is not None:
            key = key + 1
        buckets[key & capacity - 1] = (file, path)

    next_offset = 1
    for bucket in buckets:
        if bucket is None:
            out.write(struct.pack("<LLL", 0, 0, 0))
        else:
            (file, path) = bucket
            key_offset = next_offset
            prefix_offset = key_offset + len(file) + 1
            suffix_offset = prefix_offset + len(os.path.dirname(path) + os.sep) + 1
            next_offset = suffix_offset + len(os.path.basename(path)) + 1
            out.write(struct.pack("<LLL", key_offset, prefix_offset, suffix_offset))

    # Pad byte since next offset starts at 1.
    out.write(struct.pack("<x"))

    for bucket in buckets:
        if bucket is not None:
            (file, path) = bucket
            out.write(struct.pack("<%ds" % len(file), file))
            out.write(struct.pack("<s", "\0"))
            base = os.path.dirname(path) + os.sep
            out.write(struct.pack("<%ds" % len(base), base))
            out.write(struct.pack("<s", "\0"))
            path = os.path.basename(path)
            out.write(struct.pack("<%ds" % len(path), path))
            out.write(struct.pack("<s", "\0"))


if __name__ == "__main__":
    sys.exit(main(sys.argv[1:]))
# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""
This module helps emulate Visual Studio 2008 behavior on top of other
build systems, primarily ninja.
"""

import collections
import os
import re
import subprocess
import sys

from gyp.common import OrderedSet
import gyp.MSVSUtil
import gyp.MSVSVersion

windows_quoter_regex = re.compile(r'(\\*)"')


def QuoteForRspFile(arg, quote_cmd=True):
    """Quote a command line argument so that it appears as one argument when
    processed via cmd.exe and parsed by CommandLineToArgvW (as is typical for
    Windows programs)."""
    # See http://goo.gl/cuFbX and http://goo.gl/dhPnp including the comment
    # threads. This is actually the quoting rules for CommandLineToArgvW, not
    # for the shell, because the shell doesn't do anything in Windows. This
    # works more or less because most programs (including the compiler, etc.)
    # use that function to handle command line arguments.

    # Use a heuristic to try to find args that are paths, and normalize them
    if arg.find("/") > 0 or arg.count("/") > 1:
        arg = os.path.normpath(arg)

    # For a literal quote, CommandLineToArgvW requires 2n+1 backslashes
    # preceding it, and results in n backslashes + the quote. So we substitute
    # in 2* what we match, +1 more, plus the quote.
    if quote_cmd:
        arg = windows_quoter_regex.sub(lambda mo: 2 * mo.group(1) + '\\"', arg)

    # %'s also need to be doubled otherwise they're interpreted as batch
    # positional arguments. Also make sure to escape the % so that they're
    # passed literally through escaping so they can be singled to just the
    # original %. Otherwise, trying to pass the literal representation that
    # looks like an environment variable to the shell (e.g. %PATH%) would fail.
    arg = arg.replace("%", "%%")

    # These commands are used in rsp files, so no escaping for the shell (via ^)
    # is necessary.

    # As a workaround for programs that don't use CommandLineToArgvW, gyp
    # supports msvs_quote_cmd=0, which simply disables all quoting.
    if quote_cmd:
        # Finally, wrap the whole thing in quotes so that the above quote rule
        # applies and whitespace isn't a word break.
        return f'"{arg}"'

    return arg


def EncodeRspFileList(args, quote_cmd):
    """Process a list of arguments using QuoteCmdExeArgument."""
    # Note that the first argument is assumed to be the command. Don't add
    # quotes around it because then built-ins like 'echo', etc. won't work.
    # Take care to normpath only the path in the case of 'call ../x.bat' because
    # otherwise the whole thing is incorrectly interpreted as a path and not
    # normalized correctly.
    if not args:
        return ""
    if args[0].startswith("call "):
        call, program = args[0].split(" ", 1)
        program = call + " " + os.path.normpath(program)
    else:
        program = os.path.normpath(args[0])
    return (program + " "
            + " ".join(QuoteForRspFile(arg, quote_cmd) for arg in args[1:]))


def _GenericRetrieve(root, default, path):
    """Given a list of dictionary keys |path| and a tree of dicts |root|, find
    value at path, or return |default| if any of the path doesn't exist."""
    if not root:
        return default
    if not path:
        return root
    return _GenericRetrieve(root.get(path[0]), default, path[1:])


def _AddPrefix(element, prefix):
    """Add |prefix| to |element| or each subelement if element is iterable."""
    if element is None:
        return element
    # Note, not Iterable because we don't want to handle strings like that.
    if isinstance(element, list) or isinstance(element, tuple):
        return [prefix + e for e in element]
    else:
        return prefix + element


def _DoRemapping(element, map):
    """If |element| then remap it through |map|. If |element| is iterable then
    each item will be remapped. Any elements not found will be removed."""
    if map is not None and element is not None:
        if not callable(map):
            map = map.get  # Assume it's a dict, otherwise a callable to do the remap.
        if isinstance(element, list) or isinstance(element, tuple):
            element = filter(None, [map(elem) for elem in element])
        else:
            element = map(element)
    return element


def _AppendOrReturn(append, element):
    """If |append| is None, simply return |element|. If |append| is not None,
    then add |element| to it, adding each item in |element| if it's a list or
    tuple."""
    if append is not None and element is not None:
        if isinstance(element, list) or isinstance(element, tuple):
            append.extend(element)
        else:
            append.append(element)
    else:
        return element


def _FindDirectXInstallation():
    """Try to find an installation location for the DirectX SDK. Check for the
    standard environment variable, and if that doesn't exist, try to find
    via the registry. May return None if not found in either location."""
    # Return previously calculated value, if there is one
    if hasattr(_FindDirectXInstallation, "dxsdk_dir"):
        return _FindDirectXInstallation.dxsdk_dir

    dxsdk_dir = os.environ.get("DXSDK_DIR")
    if not dxsdk_dir:
        # Setup params to pass to and attempt to launch reg.exe.
        cmd = ["reg.exe", "query", r"HKLM\Software\Microsoft\DirectX", "/s"]
        p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        stdout = p.communicate()[0].decode("utf-8")
        for line in stdout.splitlines():
            if "InstallPath" in line:
                dxsdk_dir = line.split("    ")[3] + "\\"

    # Cache return value
    _FindDirectXInstallation.dxsdk_dir = dxsdk_dir
    return dxsdk_dir


def GetGlobalVSMacroEnv(vs_version):
    """Get a dict of variables mapping internal VS macro names to their gyp
    equivalents. Returns all variables that are independent of the target."""
    env = {}
    # '$(VSInstallDir)' and '$(VCInstallDir)' are available when and only when
    # Visual Studio is actually installed.
    if vs_version.Path():
        env["$(VSInstallDir)"] = vs_version.Path()
        env["$(VCInstallDir)"] = os.path.join(vs_version.Path(), "VC") + "\\"
    # Chromium uses DXSDK_DIR in include/lib paths, but it may or may not be
    # set. This happens when the SDK is sync'd via src-internal, rather than
    # by typical end-user installation of the SDK. If it's not set, we don't
    # want to leave the unexpanded variable in the path, so simply strip it.
    dxsdk_dir = _FindDirectXInstallation()
    env["$(DXSDK_DIR)"] = dxsdk_dir if dxsdk_dir else ""
    # Try to find an installation location for the Windows DDK by checking
    # the WDK_DIR environment variable, may be None.
    env["$(WDK_DIR)"] = os.environ.get("WDK_DIR", "")
    return env


def ExtractSharedMSVSSystemIncludes(configs, generator_flags):
    """Finds msvs_system_include_dirs that are common to all targets, removes
    them from all targets, and returns an OrderedSet containing them."""
    all_system_includes = OrderedSet(configs[0].get("msvs_system_include_dirs", []))
    for config in configs[1:]:
        system_includes = config.get("msvs_system_include_dirs", [])
        all_system_includes = all_system_includes & OrderedSet(system_includes)
    if not all_system_includes:
        return None
    # Expand macros in all_system_includes.
    env = GetGlobalVSMacroEnv(GetVSVersion(generator_flags))
    expanded_system_includes = OrderedSet(
        [ExpandMacros(include, env) for include in all_system_includes]
    )
    if any(["$" in include for include in expanded_system_includes]):
        # Some path relies on target-specific variables, bail.
        return None

    # Remove system includes shared by all targets from the targets.
    for config in configs:
        includes = config.get("msvs_system_include_dirs", [])
        if includes:  # Don't insert a msvs_system_include_dirs key if not needed.
            # This must check the unexpanded includes list:
            new_includes = [i for i in includes if i not in all_system_includes]
            config["msvs_system_include_dirs"] = new_includes
    return expanded_system_includes


class MsvsSettings:
    """A class that understands the gyp 'msvs_...' values (especially the
    msvs_settings field). They largely correpond to the VS2008 IDE DOM. This
    class helps map those settings to command line options."""

    def __init__(self, spec, generator_flags):
        self.spec = spec
        self.vs_version = GetVSVersion(generator_flags)

        supported_fields = [
            ("msvs_configuration_attributes", dict),
            ("msvs_settings", dict),
            ("msvs_system_include_dirs", list),
            ("msvs_disabled_warnings", list),
            ("msvs_precompiled_header", str),
            ("msvs_precompiled_source", str),
            ("msvs_configuration_platform", str),
            ("msvs_target_platform", str),
        ]
        configs = spec["configurations"]
        for field, default in supported_fields:
            setattr(self, field, {})
            for configname, config in configs.items():
                getattr(self, field)[configname] = config.get(field, default())

        self.msvs_cygwin_dirs = spec.get("msvs_cygwin_dirs", ["."])

        unsupported_fields = [
            "msvs_prebuild",
            "msvs_postbuild",
        ]
        unsupported = []
        for field in unsupported_fields:
            for config in configs.values():
                if field in config:
                    unsupported += [
                        "{} not supported (target {}).".format(
                            field, spec["target_name"]
                        )
                    ]
        if unsupported:
            raise Exception("\n".join(unsupported))

    def GetExtension(self):
        """Returns the extension for the target, with no leading dot.

        Uses 'product_extension' if specified, otherwise uses MSVS defaults based on
        the target type.
        """
        ext = self.spec.get("product_extension", None)
        if ext:
            return ext
        return gyp.MSVSUtil.TARGET_TYPE_EXT.get(self.spec["type"], "")

    def GetVSMacroEnv(self, base_to_build=None, config=None):
        """Get a dict of variables mapping internal VS macro names to their gyp
        equivalents."""
        target_arch = self.GetArch(config)
        if target_arch == "x86":
            target_platform = "Win32"
        else:
            target_platform = target_arch
        target_name = self.spec.get("product_prefix", "") + self.spec.get(
            "product_name", self.spec["target_name"]
        )
        target_dir = base_to_build + "\\" if base_to_build else ""
        target_ext = "." + self.GetExtension()
        target_file_name = target_name + target_ext

        replacements = {
            "$(InputName)": "${root}",
            "$(InputPath)": "${source}",
            "$(IntDir)": "$!INTERMEDIATE_DIR",
            "$(OutDir)\\": target_dir,
            "$(PlatformName)": target_platform,
            "$(ProjectDir)\\": "",
            "$(ProjectName)": self.spec["target_name"],
            "$(TargetDir)\\": target_dir,
            "$(TargetExt)": target_ext,
            "$(TargetFileName)": target_file_name,
            "$(TargetName)": target_name,
            "$(TargetPath)": os.path.join(target_dir, target_file_name),
        }
        replacements.update(GetGlobalVSMacroEnv(self.vs_version))
        return replacements

    def ConvertVSMacros(self, s, base_to_build=None, config=None):
        """Convert from VS macro names to something equivalent."""
        env = self.GetVSMacroEnv(base_to_build, config=config)
        return ExpandMacros(s, env)

    def AdjustLibraries(self, libraries):
        """Strip -l from library if it's specified with that."""
        libs = [lib[2:] if lib.startswith("-l") else lib for lib in libraries]
        return [
            lib + ".lib"
            if not lib.lower().endswith(".lib") and not lib.lower().endswith(".obj")
            else lib
            for lib in libs
        ]

    def _GetAndMunge(self, field, path, default, prefix, append, map):
        """Retrieve a value from |field| at |path| or return |default|. If
        |append| is specified, and the item is found, it will be appended to that
        object instead of returned. If |map| is specified, results will be
        remapped through |map| before being returned or appended."""
        result = _GenericRetrieve(field, default, path)
        result = _DoRemapping(result, map)
        result = _AddPrefix(result, prefix)
        return _AppendOrReturn(append, result)

    class _GetWrapper:
        def __init__(self, parent, field, base_path, append=None):
            self.parent = parent
            self.field = field
            self.base_path = [base_path]
            self.append = append

        def __call__(self, name, map=None, prefix="", default=None):
            return self.parent._GetAndMunge(
                self.field,
                self.base_path + [name],
                default=default,
                prefix=prefix,
                append=self.append,
                map=map,
            )

    def GetArch(self, config):
        """Get architecture based on msvs_configuration_platform and
        msvs_target_platform. Returns either 'x86' or 'x64'."""
        configuration_platform = self.msvs_configuration_platform.get(config, "")
        platform = self.msvs_target_platform.get(config, "")
        if not platform:  # If no specific override, use the configuration's.
            platform = configuration_platform
        # Map from platform to architecture.
        return {"Win32": "x86", "x64": "x64", "ARM64": "arm64"}.get(platform, "x86")

    def _TargetConfig(self, config):
        """Returns the target-specific configuration."""
        # There's two levels of architecture/platform specification in VS. The
        # first level is globally for the configuration (this is what we consider
        # "the" config at the gyp level, which will be something like 'Debug' or
        # 'Release'), VS2015 and later only use this level
        if int(self.vs_version.short_name) >= 2015:
            return config
        # and a second target-specific configuration, which is an
        # override for the global one. |config| is remapped here to take into
        # account the local target-specific overrides to the global configuration.
        arch = self.GetArch(config)
        if arch == "x64" and not config.endswith("_x64"):
            config += "_x64"
        if arch == "x86" and config.endswith("_x64"):
            config = config.rsplit("_", 1)[0]
        return config

    def _Setting(self, path, config, default=None, prefix="", append=None, map=None):
        """_GetAndMunge for msvs_settings."""
        return self._GetAndMunge(
            self.msvs_settings[config], path, default, prefix, append, map
        )

    def _ConfigAttrib(
        self, path, config, default=None, prefix="", append=None, map=None
    ):
        """_GetAndMunge for msvs_configuration_attributes."""
        return self._GetAndMunge(
            self.msvs_configuration_attributes[config],
            path,
            default,
            prefix,
            append,
            map,
        )

    def AdjustIncludeDirs(self, include_dirs, config):
        """Updates include_dirs to expand VS specific paths, and adds the system
        include dirs used for platform SDK and similar."""
        config = self._TargetConfig(config)
        includes = include_dirs + self.msvs_system_include_dirs[config]
        includes.extend(
            self._Setting(
                ("VCCLCompilerTool", "AdditionalIncludeDirectories"), config, default=[]
            )
        )
        return [self.ConvertVSMacros(p, config=config) for p in includes]

    def AdjustMidlIncludeDirs(self, midl_include_dirs, config):
        """Updates midl_include_dirs to expand VS specific paths, and adds the
        system include dirs used for platform SDK and similar."""
        config = self._TargetConfig(config)
        includes = midl_include_dirs + self.msvs_system_include_dirs[config]
        includes.extend(
            self._Setting(
                ("VCMIDLTool", "AdditionalIncludeDirectories"), config, default=[]
            )
        )
        return [self.ConvertVSMacros(p, config=config) for p in includes]

    def GetComputedDefines(self, config):
        """Returns the set of defines that are injected to the defines list based
        on other VS settings."""
        config = self._TargetConfig(config)
        defines = []
        if self._ConfigAttrib(["CharacterSet"], config) == "1":
            defines.extend(("_UNICODE", "UNICODE"))
        if self._ConfigAttrib(["CharacterSet"], config) == "2":
            defines.append("_MBCS")
        defines.extend(
            self._Setting(
                ("VCCLCompilerTool", "PreprocessorDefinitions"), config, default=[]
            )
        )
        return defines

    def GetCompilerPdbName(self, config, expand_special):
        """Get the pdb file name that should be used for compiler invocations, or
        None if there's no explicit name specified."""
        config = self._TargetConfig(config)
        pdbname = self._Setting(("VCCLCompilerTool", "ProgramDataBaseFileName"), config)
        if pdbname:
            pdbname = expand_special(self.ConvertVSMacros(pdbname))
        return pdbname

    def GetMapFileName(self, config, expand_special):
        """Gets the explicitly overridden map file name for a target or returns None
        if it's not set."""
        config = self._TargetConfig(config)
        map_file = self._Setting(("VCLinkerTool", "MapFileName"), config)
        if map_file:
            map_file = expand_special(self.ConvertVSMacros(map_file, config=config))
        return map_file

    def GetOutputName(self, config, expand_special):
        """Gets the explicitly overridden output name for a target or returns None
        if it's not overridden."""
        config = self._TargetConfig(config)
        type = self.spec["type"]
        root = "VCLibrarianTool" if type == "static_library" else "VCLinkerTool"
        # TODO(scottmg): Handle OutputDirectory without OutputFile.
        output_file = self._Setting((root, "OutputFile"), config)
        if output_file:
            output_file = expand_special(
                self.ConvertVSMacros(output_file, config=config)
            )
        return output_file

    def GetPDBName(self, config, expand_special, default):
        """Gets the explicitly overridden pdb name for a target or returns
        default if it's not overridden, or if no pdb will be generated."""
        config = self._TargetConfig(config)
        output_file = self._Setting(("VCLinkerTool", "ProgramDatabaseFile"), config)
        generate_debug_info = self._Setting(
            ("VCLinkerTool", "GenerateDebugInformation"), config
        )
        if generate_debug_info == "true":
            if output_file:
                return expand_special(self.ConvertVSMacros(output_file, config=config))
            else:
                return default
        else:
            return None

    def GetNoImportLibrary(self, config):
        """If NoImportLibrary: true, ninja will not expect the output to include
        an import library."""
        config = self._TargetConfig(config)
        noimplib = self._Setting(("NoImportLibrary",), config)
        return noimplib == "true"

    def GetAsmflags(self, config):
        """Returns the flags that need to be added to ml invocations."""
        config = self._TargetConfig(config)
        asmflags = []
        safeseh = self._Setting(("MASM", "UseSafeExceptionHandlers"), config)
        if safeseh == "true":
            asmflags.append("/safeseh")
        return asmflags

    def GetCflags(self, config):
        """Returns the flags that need to be added to .c and .cc compilations."""
        config = self._TargetConfig(config)
        cflags = []
        cflags.extend(["/wd" + w for w in self.msvs_disabled_warnings[config]])
        cl = self._GetWrapper(
            self, self.msvs_settings[config], "VCCLCompilerTool", append=cflags
        )
        cl(
            "Optimization",
            map={"0": "d", "1": "1", "2": "2", "3": "x"},
            prefix="/O",
            default="2",
        )
        cl("InlineFunctionExpansion", prefix="/Ob")
        cl("DisableSpecificWarnings", prefix="/wd")
        cl("StringPooling", map={"true": "/GF"})
        cl("EnableFiberSafeOptimizations", map={"true": "/GT"})
        cl("OmitFramePointers", map={"false": "-", "true": ""}, prefix="/Oy")
        cl("EnableIntrinsicFunctions", map={"false": "-", "true": ""}, prefix="/Oi")
        cl("FavorSizeOrSpeed", map={"1": "t", "2": "s"}, prefix="/O")
        cl(
            "FloatingPointModel",
            map={"0": "precise", "1": "strict", "2": "fast"},
            prefix="/fp:",
            default="0",
        )
        cl("CompileAsManaged", map={"false": "", "true": "/clr"})
        cl("WholeProgramOptimization", map={"true": "/GL"})
        cl("WarningLevel", prefix="/W")
        cl("WarnAsError", map={"true": "/WX"})
        cl(
            "CallingConvention",
            map={"0": "d", "1": "r", "2": "z", "3": "v"},
            prefix="/G",
        )
        cl("DebugInformationFormat", map={"1": "7", "3": "i", "4": "I"}, prefix="/Z")
        cl("RuntimeTypeInfo", map={"true": "/GR", "false": "/GR-"})
        cl("EnableFunctionLevelLinking", map={"true": "/Gy", "false": "/Gy-"})
        cl("MinimalRebuild", map={"true": "/Gm"})
        cl("BufferSecurityCheck", map={"true": "/GS", "false": "/GS-"})
        cl("BasicRuntimeChecks", map={"1": "s", "2": "u", "3": "1"}, prefix="/RTC")
        cl(
            "RuntimeLibrary",
            map={"0": "T", "1": "Td", "2": "D", "3": "Dd"},
            prefix="/M",
        )
        cl("ExceptionHandling", map={"1": "sc", "2": "a"}, prefix="/EH")
        cl("DefaultCharIsUnsigned", map={"true": "/J"})
        cl(
            "TreatWChar_tAsBuiltInType",
            map={"false": "-", "true": ""},
            prefix="/Zc:wchar_t",
        )
        cl("EnablePREfast", map={"true": "/analyze"})
        cl("AdditionalOptions", prefix="")
        cl(
            "EnableEnhancedInstructionSet",
            map={"1": "SSE", "2": "SSE2", "3": "AVX", "4": "IA32", "5": "AVX2"},
            prefix="/arch:",
        )
        cflags.extend(
            [
                "/FI" + f
                for f in self._Setting(
                    ("VCCLCompilerTool", "ForcedIncludeFiles"), config, default=[]
                )
            ]
        )
        if float(self.vs_version.project_version) >= 12.0:
            # New flag introduced in VS2013 (project version 12.0) Forces writes to
            # the program database (PDB) to be serialized through MSPDBSRV.EXE.
            # https://msdn.microsoft.com/en-us/library/dn502518.aspx
            cflags.append("/FS")
        # ninja handles parallelism by itself, don't have the compiler do it too.
        cflags = [x for x in cflags if not x.startswith("/MP")]
        return cflags

    def _GetPchFlags(self, config, extension):
        """Get the flags to be added to the cflags for precompiled header support."""
        config = self._TargetConfig(config)
        # The PCH is only built once by a particular source file. Usage of PCH must
        # only be for the same language (i.e. C vs. C++), so only include the pch
        # flags when the language matches.
        if self.msvs_precompiled_header[config]:
            source_ext = os.path.splitext(self.msvs_precompiled_source[config])[1]
            if _LanguageMatchesForPch(source_ext, extension):
                pch = self.msvs_precompiled_header[config]
                pchbase = os.path.split(pch)[1]
                return ["/Yu" + pch, "/FI" + pch, "/Fp${pchprefix}." + pchbase + ".pch"]
        return []

    def GetCflagsC(self, config):
        """Returns the flags that need to be added to .c compilations."""
        config = self._TargetConfig(config)
        return self._GetPchFlags(config, ".c")

    def GetCflagsCC(self, config):
        """Returns the flags that need to be added to .cc compilations."""
        config = self._TargetConfig(config)
        return ["/TP"] + self._GetPchFlags(config, ".cc")

    def _GetAdditionalLibraryDirectories(self, root, config, gyp_to_build_path):
        """Get and normalize the list of paths in AdditionalLibraryDirectories
        setting."""
        config = self._TargetConfig(config)
        libpaths = self._Setting(
            (root, "AdditionalLibraryDirectories"), config, default=[]
        )
        libpaths = [
            os.path.normpath(gyp_to_build_path(self.ConvertVSMacros(p, config=config)))
            for p in libpaths
        ]
        return ['/LIBPATH:"' + p + '"' for p in libpaths]

    def GetLibFlags(self, config, gyp_to_build_path):
        """Returns the flags that need to be added to lib commands."""
        config = self._TargetConfig(config)
        libflags = []
        lib = self._GetWrapper(
            self, self.msvs_settings[config], "VCLibrarianTool", append=libflags
        )
        libflags.extend(
            self._GetAdditionalLibraryDirectories(
                "VCLibrarianTool", config, gyp_to_build_path
            )
        )
        lib("LinkTimeCodeGeneration", map={"true": "/LTCG"})
        lib(
            "TargetMachine",
            map={"1": "X86", "17": "X64", "3": "ARM"},
            prefix="/MACHINE:",
        )
        lib("AdditionalOptions")
        return libflags

    def GetDefFile(self, gyp_to_build_path):
        """Returns the .def file from sources, if any.  Otherwise returns None."""
        spec = self.spec
        if spec["type"] in ("shared_library", "loadable_module", "executable"):
            def_files = [
                s for s in spec.get("sources", []) if s.lower().endswith(".def")
            ]
            if len(def_files) == 1:
                return gyp_to_build_path(def_files[0])
            elif len(def_files) > 1:
                raise Exception("Multiple .def files")
        return None

    def _GetDefFileAsLdflags(self, ldflags, gyp_to_build_path):
        """.def files get implicitly converted to a ModuleDefinitionFile for the
        linker in the VS generator. Emulate that behaviour here."""
        def_file = self.GetDefFile(gyp_to_build_path)
        if def_file:
            ldflags.append('/DEF:"%s"' % def_file)

    def GetPGDName(self, config, expand_special):
        """Gets the explicitly overridden pgd name for a target or returns None
        if it's not overridden."""
        config = self._TargetConfig(config)
        output_file = self._Setting(("VCLinkerTool", "ProfileGuidedDatabase"), config)
        if output_file:
            output_file = expand_special(
                self.ConvertVSMacros(output_file, config=config)
            )
        return output_file

    def GetLdflags(
        self,
        config,
        gyp_to_build_path,
        expand_special,
        manifest_base_name,
        output_name,
        is_executable,
        build_dir,
    ):
        """Returns the flags that need to be added to link commands, and the
        manifest files."""
        config = self._TargetConfig(config)
        ldflags = []
        ld = self._GetWrapper(
            self, self.msvs_settings[config], "VCLinkerTool", append=ldflags
        )
        self._GetDefFileAsLdflags(ldflags, gyp_to_build_path)
        ld("GenerateDebugInformation", map={"true": "/DEBUG"})
        # TODO: These 'map' values come from machineTypeOption enum,
        # and does not have an official value for ARM64 in VS2017 (yet).
        # It needs to verify the ARM64 value when machineTypeOption is updated.
        ld(
            "TargetMachine",
            map={"1": "X86", "17": "X64", "3": "ARM", "18": "ARM64"},
            prefix="/MACHINE:",
        )
        ldflags.extend(
            self._GetAdditionalLibraryDirectories(
                "VCLinkerTool", config, gyp_to_build_path
            )
        )
        ld("DelayLoadDLLs", prefix="/DELAYLOAD:")
        ld("TreatLinkerWarningAsErrors", prefix="/WX", map={"true": "", "false": ":NO"})
        out = self.GetOutputName(config, expand_special)
        if out:
            ldflags.append("/OUT:" + out)
        pdb = self.GetPDBName(config, expand_special, output_name + ".pdb")
        if pdb:
            ldflags.append("/PDB:" + pdb)
        pgd = self.GetPGDName(config, expand_special)
        if pgd:
            ldflags.append("/PGD:" + pgd)
        map_file = self.GetMapFileName(config, expand_special)
        ld("GenerateMapFile", map={"true": "/MAP:" + map_file if map_file else "/MAP"})
        ld("MapExports", map={"true": "/MAPINFO:EXPORTS"})
        ld("AdditionalOptions", prefix="")

        minimum_required_version = self._Setting(
            ("VCLinkerTool", "MinimumRequiredVersion"), config, default=""
        )
        if minimum_required_version:
            minimum_required_version = "," + minimum_required_version
        ld(
            "SubSystem",
            map={
                "1": "CONSOLE%s" % minimum_required_version,
                "2": "WINDOWS%s" % minimum_required_version,
            },
            prefix="/SUBSYSTEM:",
        )

        stack_reserve_size = self._Setting(
            ("VCLinkerTool", "StackReserveSize"), config, default=""
        )
        if stack_reserve_size:
            stack_commit_size = self._Setting(
                ("VCLinkerTool", "StackCommitSize"), config, default=""
            )
            if stack_commit_size:
                stack_commit_size = "," + stack_commit_size
            ldflags.append(f"/STACK:{stack_reserve_size}{stack_commit_size}")

        ld("TerminalServerAware", map={"1": ":NO", "2": ""}, prefix="/TSAWARE")
        ld("LinkIncremental", map={"1": ":NO", "2": ""}, prefix="/INCREMENTAL")
        ld("BaseAddress", prefix="/BASE:")
        ld("FixedBaseAddress", map={"1": ":NO", "2": ""}, prefix="/FIXED")
        ld("RandomizedBaseAddress", map={"1": ":NO", "2": ""}, prefix="/DYNAMICBASE")
        ld("DataExecutionPrevention", map={"1": ":NO", "2": ""}, prefix="/NXCOMPAT")
        ld("OptimizeReferences", map={"1": "NOREF", "2": "REF"}, prefix="/OPT:")
        ld("ForceSymbolReferences", prefix="/INCLUDE:")
        ld("EnableCOMDATFolding", map={"1": "NOICF", "2": "ICF"}, prefix="/OPT:")
        ld(
            "LinkTimeCodeGeneration",
            map={"1": "", "2": ":PGINSTRUMENT", "3": ":PGOPTIMIZE", "4": ":PGUPDATE"},
            prefix="/LTCG",
        )
        ld("IgnoreDefaultLibraryNames", prefix="/NODEFAULTLIB:")
        ld("ResourceOnlyDLL", map={"true": "/NOENTRY"})
        ld("EntryPointSymbol", prefix="/ENTRY:")
        ld("Profile", map={"true": "/PROFILE"})
        ld("LargeAddressAware", map={"1": ":NO", "2": ""}, prefix="/LARGEADDRESSAWARE")
        # TODO(scottmg): This should sort of be somewhere else (not really a flag).
        ld("AdditionalDependencies", prefix="")

        if self.GetArch(config) == "x86":
            safeseh_default = "true"
        else:
            safeseh_default = None
        ld(
            "ImageHasSafeExceptionHandlers",
            map={"false": ":NO", "true": ""},
            prefix="/SAFESEH",
            default=safeseh_default,
        )

        # If the base address is not specifically controlled, DYNAMICBASE should
        # be on by default.
        if not any("DYNAMICBASE" in flag or flag == "/FIXED" for flag in ldflags):
            ldflags.append("/DYNAMICBASE")

        # If the NXCOMPAT flag has not been specified, default to on. Despite the
        # documentation that says this only defaults to on when the subsystem is
        # Vista or greater (which applies to the linker), the IDE defaults it on
        # unless it's explicitly off.
        if not any("NXCOMPAT" in flag for flag in ldflags):
            ldflags.append("/NXCOMPAT")

        have_def_file = any(flag.startswith("/DEF:") for flag in ldflags)
        (
            manifest_flags,
            intermediate_manifest,
            manifest_files,
        ) = self._GetLdManifestFlags(
            config,
            manifest_base_name,
            gyp_to_build_path,
            is_executable and not have_def_file,
            build_dir,
        )
        ldflags.extend(manifest_flags)
        return ldflags, intermediate_manifest, manifest_files

    def _GetLdManifestFlags(
        self, config, name, gyp_to_build_path, allow_isolation, build_dir
    ):
        """Returns a 3-tuple:
        - the set of flags that need to be added to the link to generate
          a default manifest
        - the intermediate manifest that the linker will generate that should be
          used to assert it doesn't add anything to the merged one.
        - the list of all the manifest files to be merged by the manifest tool and
          included into the link."""
        generate_manifest = self._Setting(
            ("VCLinkerTool", "GenerateManifest"), config, default="true"
        )
        if generate_manifest != "true":
            # This means not only that the linker should not generate the intermediate
            # manifest but also that the manifest tool should do nothing even when
            # additional manifests are specified.
            return ["/MANIFEST:NO"], [], []

        output_name = name + ".intermediate.manifest"
        flags = [
            "/MANIFEST",
            "/ManifestFile:" + output_name,
        ]

        # Instead of using the MANIFESTUAC flags, we generate a .manifest to
        # include into the list of manifests. This allows us to avoid the need to
        # do two passes during linking. The /MANIFEST flag and /ManifestFile are
        # still used, and the intermediate manifest is used to assert that the
        # final manifest we get from merging all the additional manifest files
        # (plus the one we generate here) isn't modified by merging the
        # intermediate into it.

        # Always NO, because we generate a manifest file that has what we want.
        flags.append("/MANIFESTUAC:NO")

        config = self._TargetConfig(config)
        enable_uac = self._Setting(
            ("VCLinkerTool", "EnableUAC"), config, default="true"
        )
        manifest_files = []
        generated_manifest_outer = (
            "<?xml version='1.0' encoding='UTF-8' standalone='yes'?>"
            "<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>"
            "%s</assembly>"
        )
        if enable_uac == "true":
            execution_level = self._Setting(
                ("VCLinkerTool", "UACExecutionLevel"), config, default="0"
            )
            execution_level_map = {
                "0": "asInvoker",
                "1": "highestAvailable",
                "2": "requireAdministrator",
            }

            ui_access = self._Setting(
                ("VCLinkerTool", "UACUIAccess"), config, default="false"
            )

            inner = """
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
  <security>
    <requestedPrivileges>
      <requestedExecutionLevel level='{}' uiAccess='{}' />
    </requestedPrivileges>
  </security>
</trustInfo>""".format(
                execution_level_map[execution_level],
                ui_access,
            )
        else:
            inner = ""

        generated_manifest_contents = generated_manifest_outer % inner
        generated_name = name + ".generated.manifest"
        # Need to join with the build_dir here as we're writing it during
        # generation time, but we return the un-joined version because the build
        # will occur in that directory. We only write the file if the contents
        # have changed so that simply regenerating the project files doesn't
        # cause a relink.
        build_dir_generated_name = os.path.join(build_dir, generated_name)
        gyp.common.EnsureDirExists(build_dir_generated_name)
        f = gyp.common.WriteOnDiff(build_dir_generated_name)
        f.write(generated_manifest_contents)
        f.close()
        manifest_files = [generated_name]

        if allow_isolation:
            flags.append("/ALLOWISOLATION")

        manifest_files += self._GetAdditionalManifestFiles(config, gyp_to_build_path)
        return flags, output_name, manifest_files

    def _GetAdditionalManifestFiles(self, config, gyp_to_build_path):
        """Gets additional manifest files that are added to the default one
        generated by the linker."""
        files = self._Setting(
            ("VCManifestTool", "AdditionalManifestFiles"), config, default=[]
        )
        if isinstance(files, str):
            files = files.split(";")
        return [
            os.path.normpath(gyp_to_build_path(self.ConvertVSMacros(f, config=config)))
            for f in files
        ]

    def IsUseLibraryDependencyInputs(self, config):
        """Returns whether the target should be linked via Use Library Dependency
        Inputs (using component .objs of a given .lib)."""
        config = self._TargetConfig(config)
        uldi = self._Setting(("VCLinkerTool", "UseLibraryDependencyInputs"), config)
        return uldi == "true"

    def IsEmbedManifest(self, config):
        """Returns whether manifest should be linked into binary."""
        config = self._TargetConfig(config)
        embed = self._Setting(
            ("VCManifestTool", "EmbedManifest"), config, default="true"
        )
        return embed == "true"

    def IsLinkIncremental(self, config):
        """Returns whether the target should be linked incrementally."""
        config = self._TargetConfig(config)
        link_inc = self._Setting(("VCLinkerTool", "LinkIncremental"), config)
        return link_inc != "1"

    def GetRcflags(self, config, gyp_to_ninja_path):
        """Returns the flags that need to be added to invocations of the resource
        compiler."""
        config = self._TargetConfig(config)
        rcflags = []
        rc = self._GetWrapper(
            self, self.msvs_settings[config], "VCResourceCompilerTool", append=rcflags
        )
        rc("AdditionalIncludeDirectories", map=gyp_to_ninja_path, prefix="/I")
        rcflags.append("/I" + gyp_to_ninja_path("."))
        rc("PreprocessorDefinitions", prefix="/d")
        # /l arg must be in hex without leading '0x'
        rc("Culture", prefix="/l", map=lambda x: hex(int(x))[2:])
        return rcflags

    def BuildCygwinBashCommandLine(self, args, path_to_base):
        """Build a command line that runs args via cygwin bash. We assume that all
        incoming paths are in Windows normpath'd form, so they need to be
        converted to posix style for the part of the command line that's passed to
        bash. We also have to do some Visual Studio macro emulation here because
        various rules use magic VS names for things. Also note that rules that
        contain ninja variables cannot be fixed here (for example ${source}), so
        the outer generator needs to make sure that the paths that are written out
        are in posix style, if the command line will be used here."""
        cygwin_dir = os.path.normpath(
            os.path.join(path_to_base, self.msvs_cygwin_dirs[0])
        )
        cd = ("cd %s" % path_to_base).replace("\\", "/")
        args = [a.replace("\\", "/").replace('"', '\\"') for a in args]
        args = ["'%s'" % a.replace("'", "'\\''") for a in args]
        bash_cmd = " ".join(args)
        cmd = (
            'call "%s\\setup_env.bat" && set CYGWIN=nontsec && ' % cygwin_dir
            + f'bash -c "{cd} ; {bash_cmd}"'
        )
        return cmd

    RuleShellFlags = collections.namedtuple("RuleShellFlags", ["cygwin", "quote"])

    def GetRuleShellFlags(self, rule):
        """Return RuleShellFlags about how the given rule should be run. This
        includes whether it should run under cygwin (msvs_cygwin_shell), and
        whether the commands should be quoted (msvs_quote_cmd)."""
        # If the variable is unset, or set to 1 we use cygwin
        cygwin = int(rule.get("msvs_cygwin_shell",
                              self.spec.get("msvs_cygwin_shell", 1))) != 0
        # Default to quoting. There's only a few special instances where the
        # target command uses non-standard command line parsing and handle quotes
        # and quote escaping differently.
        quote_cmd = int(rule.get("msvs_quote_cmd", 1))
        assert quote_cmd != 0 or cygwin != 1, \
               "msvs_quote_cmd=0 only applicable for msvs_cygwin_shell=0"
        return MsvsSettings.RuleShellFlags(cygwin, quote_cmd)

    def _HasExplicitRuleForExtension(self, spec, extension):
        """Determine if there's an explicit rule for a particular extension."""
        for rule in spec.get("rules", []):
            if rule["extension"] == extension:
                return True
        return False

    def _HasExplicitIdlActions(self, spec):
        """Determine if an action should not run midl for .idl files."""
        return any(
            [action.get("explicit_idl_action", 0) for action in spec.get("actions", [])]
        )

    def HasExplicitIdlRulesOrActions(self, spec):
        """Determine if there's an explicit rule or action for idl files. When
        there isn't we need to generate implicit rules to build MIDL .idl files."""
        return self._HasExplicitRuleForExtension(
            spec, "idl"
        ) or self._HasExplicitIdlActions(spec)

    def HasExplicitAsmRules(self, spec):
        """Determine if there's an explicit rule for asm files. When there isn't we
        need to generate implicit rules to assemble .asm files."""
        return self._HasExplicitRuleForExtension(spec, "asm")

    def GetIdlBuildData(self, source, config):
        """Determine the implicit outputs for an idl file. Returns output
        directory, outputs, and variables and flags that are required."""
        config = self._TargetConfig(config)
        midl_get = self._GetWrapper(self, self.msvs_settings[config], "VCMIDLTool")

        def midl(name, default=None):
            return self.ConvertVSMacros(midl_get(name, default=default), config=config)

        tlb = midl("TypeLibraryName", default="${root}.tlb")
        header = midl("HeaderFileName", default="${root}.h")
        dlldata = midl("DLLDataFileName", default="dlldata.c")
        iid = midl("InterfaceIdentifierFileName", default="${root}_i.c")
        proxy = midl("ProxyFileName", default="${root}_p.c")
        # Note that .tlb is not included in the outputs as it is not always
        # generated depending on the content of the input idl file.
        outdir = midl("OutputDirectory", default="")
        output = [header, dlldata, iid, proxy]
        variables = [
            ("tlb", tlb),
            ("h", header),
            ("dlldata", dlldata),
            ("iid", iid),
            ("proxy", proxy),
        ]
        # TODO(scottmg): Are there configuration settings to set these flags?
        target_platform = self.GetArch(config)
        if target_platform == "x86":
            target_platform = "win32"
        flags = ["/char", "signed", "/env", target_platform, "/Oicf"]
        return outdir, output, variables, flags


def _LanguageMatchesForPch(source_ext, pch_source_ext):
    c_exts = (".c",)
    cc_exts = (".cc", ".cxx", ".cpp")
    return (source_ext in c_exts and pch_source_ext in c_exts) or (
        source_ext in cc_exts and pch_source_ext in cc_exts
    )


class PrecompiledHeader:
    """Helper to generate dependencies and build rules to handle generation of
    precompiled headers. Interface matches the GCH handler in xcode_emulation.py.
    """

    def __init__(
        self, settings, config, gyp_to_build_path, gyp_to_unique_output, obj_ext
    ):
        self.settings = settings
        self.config = config
        pch_source = self.settings.msvs_precompiled_source[self.config]
        self.pch_source = gyp_to_build_path(pch_source)
        filename, _ = os.path.splitext(pch_source)
        self.output_obj = gyp_to_unique_output(filename + obj_ext).lower()

    def _PchHeader(self):
        """Get the header that will appear in an #include line for all source
        files."""
        return self.settings.msvs_precompiled_header[self.config]

    def GetObjDependencies(self, sources, objs, arch):
        """Given a list of sources files and the corresponding object files,
        returns a list of the pch files that should be depended upon. The
        additional wrapping in the return value is for interface compatibility
        with make.py on Mac, and xcode_emulation.py."""
        assert arch is None
        if not self._PchHeader():
            return []
        pch_ext = os.path.splitext(self.pch_source)[1]
        for source in sources:
            if _LanguageMatchesForPch(os.path.splitext(source)[1], pch_ext):
                return [(None, None, self.output_obj)]
        return []

    def GetPchBuildCommands(self, arch):
        """Not used on Windows as there are no additional build steps required
        (instead, existing steps are modified in GetFlagsModifications below)."""
        return []

    def GetFlagsModifications(
        self, input, output, implicit, command, cflags_c, cflags_cc, expand_special
    ):
        """Get the modified cflags and implicit dependencies that should be used
        for the pch compilation step."""
        if input == self.pch_source:
            pch_output = ["/Yc" + self._PchHeader()]
            if command == "cxx":
                return (
                    [("cflags_cc", map(expand_special, cflags_cc + pch_output))],
                    self.output_obj,
                    [],
                )
            elif command == "cc":
                return (
                    [("cflags_c", map(expand_special, cflags_c + pch_output))],
                    self.output_obj,
                    [],
                )
        return [], output, implicit


vs_version = None


def GetVSVersion(generator_flags):
    global vs_version
    if not vs_version:
        vs_version = gyp.MSVSVersion.SelectVisualStudioVersion(
            generator_flags.get("msvs_version", "auto"), allow_fallback=False
        )
    return vs_version


def _GetVsvarsSetupArgs(generator_flags, arch):
    vs = GetVSVersion(generator_flags)
    return vs.SetupScript()


def ExpandMacros(string, expansions):
    """Expand $(Variable) per expansions dict. See MsvsSettings.GetVSMacroEnv
    for the canonical way to retrieve a suitable dict."""
    if "$" in string:
        for old, new in expansions.items():
            assert "$(" not in new, new
            string = string.replace(old, new)
    return string


def _ExtractImportantEnvironment(output_of_set):
    """Extracts environment variables required for the toolchain to run from
    a textual dump output by the cmd.exe 'set' command."""
    envvars_to_save = (
        "goma_.*",  # TODO(scottmg): This is ugly, but needed for goma.
        "include",
        "lib",
        "libpath",
        "path",
        "pathext",
        "systemroot",
        "temp",
        "tmp",
    )
    env = {}
    # This occasionally happens and leads to misleading SYSTEMROOT error messages
    # if not caught here.
    if output_of_set.count("=") == 0:
        raise Exception("Invalid output_of_set. Value is:\n%s" % output_of_set)
    for line in output_of_set.splitlines():
        for envvar in envvars_to_save:
            if re.match(envvar + "=", line.lower()):
                var, setting = line.split("=", 1)
                if envvar == "path":
                    # Our own rules (for running gyp-win-tool) and other actions in
                    # Chromium rely on python being in the path. Add the path to this
                    # python here so that if it's not in the path when ninja is run
                    # later, python will still be found.
                    setting = os.path.dirname(sys.executable) + os.pathsep + setting
                env[var.upper()] = setting
                break
    for required in ("SYSTEMROOT", "TEMP", "TMP"):
        if required not in env:
            raise Exception(
                'Environment variable "%s" '
                "required to be set to valid path" % required
            )
    return env


def _FormatAsEnvironmentBlock(envvar_dict):
    """Format as an 'environment block' directly suitable for CreateProcess.
    Briefly this is a list of key=value\0, terminated by an additional \0. See
    CreateProcess documentation for more details."""
    block = ""
    nul = "\0"
    for key, value in envvar_dict.items():
        block += key + "=" + value + nul
    block += nul
    return block


def _ExtractCLPath(output_of_where):
    """Gets the path to cl.exe based on the output of calling the environment
    setup batch file, followed by the equivalent of `where`."""
    # Take the first line, as that's the first found in the PATH.
    for line in output_of_where.strip().splitlines():
        if line.startswith("LOC:"):
            return line[len("LOC:") :].strip()


def GenerateEnvironmentFiles(
    toplevel_build_dir, generator_flags, system_includes, open_out
):
    """It's not sufficient to have the absolute path to the compiler, linker,
    etc. on Windows, as those tools rely on .dlls being in the PATH. We also
    need to support both x86 and x64 compilers within the same build (to support
    msvs_target_platform hackery). Different architectures require a different
    compiler binary, and different supporting environment variables (INCLUDE,
    LIB, LIBPATH). So, we extract the environment here, wrap all invocations
    of compiler tools (cl, link, lib, rc, midl, etc.) via win_tool.py which
    sets up the environment, and then we do not prefix the compiler with
    an absolute path, instead preferring something like "cl.exe" in the rule
    which will then run whichever the environment setup has put in the path.
    When the following procedure to generate environment files does not
    meet your requirement (e.g. for custom toolchains), you can pass
    "-G ninja_use_custom_environment_files" to the gyp to suppress file
    generation and use custom environment files prepared by yourself."""
    archs = ("x86", "x64")
    if generator_flags.get("ninja_use_custom_environment_files", 0):
        cl_paths = {}
        for arch in archs:
            cl_paths[arch] = "cl.exe"
        return cl_paths
    vs = GetVSVersion(generator_flags)
    cl_paths = {}
    for arch in archs:
        # Extract environment variables for subprocesses.
        args = vs.SetupScript(arch)
        args.extend(("&&", "set"))
        popen = subprocess.Popen(
            args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT
        )
        variables = popen.communicate()[0].decode("utf-8")
        if popen.returncode != 0:
            raise Exception('"%s" failed with error %d' % (args, popen.returncode))
        env = _ExtractImportantEnvironment(variables)

        # Inject system includes from gyp files into INCLUDE.
        if system_includes:
            system_includes = system_includes | OrderedSet(
                env.get("INCLUDE", "").split(";")
            )
            env["INCLUDE"] = ";".join(system_includes)

        env_block = _FormatAsEnvironmentBlock(env)
        f = open_out(os.path.join(toplevel_build_dir, "environment." + arch), "w")
        f.write(env_block)
        f.close()

        # Find cl.exe location for this architecture.
        args = vs.SetupScript(arch)
        args.extend(
            ("&&", "for", "%i", "in", "(cl.exe)", "do", "@echo", "LOC:%~$PATH:i")
        )
        popen = subprocess.Popen(args, shell=True, stdout=subprocess.PIPE)
        output = popen.communicate()[0].decode("utf-8")
        cl_paths[arch] = _ExtractCLPath(output)
    return cl_paths


def VerifyMissingSources(sources, build_dir, generator_flags, gyp_to_ninja):
    """Emulate behavior of msvs_error_on_missing_sources present in the msvs
    generator: Check that all regular source files, i.e. not created at run time,
    exist on disk. Missing files cause needless recompilation when building via
    VS, and we want this check to match for people/bots that build using ninja,
    so they're not surprised when the VS build fails."""
    if int(generator_flags.get("msvs_error_on_missing_sources", 0)):
        no_specials = filter(lambda x: "$" not in x, sources)
        relative = [os.path.join(build_dir, gyp_to_ninja(s)) for s in no_specials]
        missing = [x for x in relative if not os.path.exists(x)]
        if missing:
            # They'll look like out\Release\..\..\stuff\things.cc, so normalize the
            # path for a slightly less crazy looking output.
            cleaned_up = [os.path.normpath(x) for x in missing]
            raise Exception("Missing input files:\n%s" % "\n".join(cleaned_up))


# Sets some values in default_variables, which are required for many
# generators, run on Windows.
def CalculateCommonVariables(default_variables, params):
    generator_flags = params.get("generator_flags", {})

    # Set a variable so conditions can be based on msvs_version.
    msvs_version = gyp.msvs_emulation.GetVSVersion(generator_flags)
    default_variables["MSVS_VERSION"] = msvs_version.ShortName()

    # To determine processor word size on Windows, in addition to checking
    # PROCESSOR_ARCHITECTURE (which reflects the word size of the current
    # process), it is also necessary to check PROCESSOR_ARCHITEW6432 (which
    # contains the actual word size of the system when running thru WOW64).
    if "64" in os.environ.get("PROCESSOR_ARCHITECTURE", "") or "64" in os.environ.get(
        "PROCESSOR_ARCHITEW6432", ""
    ):
        default_variables["MSVS_OS_BITS"] = 64
    else:
        default_variables["MSVS_OS_BITS"] = 32
# This file comes from
#   https://github.com/martine/ninja/blob/master/misc/ninja_syntax.py
# Do not edit!  Edit the upstream one instead.

"""Python module for generating .ninja files.

Note that this is emphatically not a required piece of Ninja; it's
just a helpful utility for build-file-generation systems that already
use Python.
"""

import textwrap


def escape_path(word):
    return word.replace("$ ", "$$ ").replace(" ", "$ ").replace(":", "$:")


class Writer:
    def __init__(self, output, width=78):
        self.output = output
        self.width = width

    def newline(self):
        self.output.write("\n")

    def comment(self, text):
        for line in textwrap.wrap(text, self.width - 2):
            self.output.write("# " + line + "\n")

    def variable(self, key, value, indent=0):
        if value is None:
            return
        if isinstance(value, list):
            value = " ".join(filter(None, value))  # Filter out empty strings.
        self._line(f"{key} = {value}", indent)

    def pool(self, name, depth):
        self._line("pool %s" % name)
        self.variable("depth", depth, indent=1)

    def rule(
        self,
        name,
        command,
        description=None,
        depfile=None,
        generator=False,
        pool=None,
        restat=False,
        rspfile=None,
        rspfile_content=None,
        deps=None,
    ):
        self._line("rule %s" % name)
        self.variable("command", command, indent=1)
        if description:
            self.variable("description", description, indent=1)
        if depfile:
            self.variable("depfile", depfile, indent=1)
        if generator:
            self.variable("generator", "1", indent=1)
        if pool:
            self.variable("pool", pool, indent=1)
        if restat:
            self.variable("restat", "1", indent=1)
        if rspfile:
            self.variable("rspfile", rspfile, indent=1)
        if rspfile_content:
            self.variable("rspfile_content", rspfile_content, indent=1)
        if deps:
            self.variable("deps", deps, indent=1)

    def build(
        self, outputs, rule, inputs=None, implicit=None, order_only=None, variables=None
    ):
        outputs = self._as_list(outputs)
        all_inputs = self._as_list(inputs)[:]
        out_outputs = list(map(escape_path, outputs))
        all_inputs = list(map(escape_path, all_inputs))

        if implicit:
            implicit = map(escape_path, self._as_list(implicit))
            all_inputs.append("|")
            all_inputs.extend(implicit)
        if order_only:
            order_only = map(escape_path, self._as_list(order_only))
            all_inputs.append("||")
            all_inputs.extend(order_only)

        self._line(
            "build {}: {}".format(" ".join(out_outputs), " ".join([rule] + all_inputs))
        )

        if variables:
            if isinstance(variables, dict):
                iterator = iter(variables.items())
            else:
                iterator = iter(variables)

            for key, val in iterator:
                self.variable(key, val, indent=1)

        return outputs

    def include(self, path):
        self._line("include %s" % path)

    def subninja(self, path):
        self._line("subninja %s" % path)

    def default(self, paths):
        self._line("default %s" % " ".join(self._as_list(paths)))

    def _count_dollars_before_index(self, s, i):
        """Returns the number of '$' characters right in front of s[i]."""
        dollar_count = 0
        dollar_index = i - 1
        while dollar_index > 0 and s[dollar_index] == "$":
            dollar_count += 1
            dollar_index -= 1
        return dollar_count

    def _line(self, text, indent=0):
        """Write 'text' word-wrapped at self.width characters."""
        leading_space = "  " * indent
        while len(leading_space) + len(text) > self.width:
            # The text is too wide; wrap if possible.

            # Find the rightmost space that would obey our width constraint and
            # that's not an escaped space.
            available_space = self.width - len(leading_space) - len(" $")
            space = available_space
            while True:
                space = text.rfind(" ", 0, space)
                if space < 0 or self._count_dollars_before_index(text, space) % 2 == 0:
                    break

            if space < 0:
                # No such space; just use the first unescaped space we can find.
                space = available_space - 1
                while True:
                    space = text.find(" ", space + 1)
                    if (
                        space < 0
                        or self._count_dollars_before_index(text, space) % 2 == 0
                    ):
                        break
            if space < 0:
                # Give up on breaking.
                break

            self.output.write(leading_space + text[0:space] + " $\n")
            text = text[space + 1 :]

            # Subsequent lines are continuations, so indent them.
            leading_space = "  " * (indent + 2)

        self.output.write(leading_space + text + "\n")

    def _as_list(self, input):
        if input is None:
            return []
        if isinstance(input, list):
            return input
        return [input]


def escape(string):
    """Escape a string such that it can be embedded into a Ninja file without
    further interpretation."""
    assert "\n" not in string, "Ninja syntax does not allow newlines"
    # We only have one special metacharacter: '$'.
    return string.replace("$", "$$")
# Copyright 2014 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""A clone of the default copy.deepcopy that doesn't handle cyclic
structures or complex types except for dicts and lists. This is
because gyp copies so large structure that small copy overhead ends up
taking seconds in a project the size of Chromium."""


class Error(Exception):
    pass


__all__ = ["Error", "deepcopy"]


def deepcopy(x):
    """Deep copy operation on gyp objects such as strings, ints, dicts
  and lists. More than twice as fast as copy.deepcopy but much less
  generic."""

    try:
        return _deepcopy_dispatch[type(x)](x)
    except KeyError:
        raise Error(
            "Unsupported type %s for deepcopy. Use copy.deepcopy "
            + "or expand simple_copy support." % type(x)
        )


_deepcopy_dispatch = d = {}


def _deepcopy_atomic(x):
    return x


types = bool, float, int, str, type, type(None)

for x in types:
    d[x] = _deepcopy_atomic


def _deepcopy_list(x):
    return [deepcopy(a) for a in x]


d[list] = _deepcopy_list


def _deepcopy_dict(x):
    y = {}
    for key, value in x.items():
        y[deepcopy(key)] = deepcopy(value)
    return y


d[dict] = _deepcopy_dict

del d
#!/usr/bin/env python3

# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Utility functions for Windows builds.

These functions are executed via gyp-win-tool when using the ninja generator.
"""


import os
import re
import shutil
import subprocess
import stat
import string
import sys

BASE_DIR = os.path.dirname(os.path.abspath(__file__))

# A regex matching an argument corresponding to the output filename passed to
# link.exe.
_LINK_EXE_OUT_ARG = re.compile("/OUT:(?P<out>.+)$", re.IGNORECASE)


def main(args):
    executor = WinTool()
    exit_code = executor.Dispatch(args)
    if exit_code is not None:
        sys.exit(exit_code)


class WinTool:
    """This class performs all the Windows tooling steps. The methods can either
  be executed directly, or dispatched from an argument list."""

    def _UseSeparateMspdbsrv(self, env, args):
        """Allows to use a unique instance of mspdbsrv.exe per linker instead of a
    shared one."""
        if len(args) < 1:
            raise Exception("Not enough arguments")

        if args[0] != "link.exe":
            return

        # Use the output filename passed to the linker to generate an endpoint name
        # for mspdbsrv.exe.
        endpoint_name = None
        for arg in args:
            m = _LINK_EXE_OUT_ARG.match(arg)
            if m:
                endpoint_name = re.sub(
                    r"\W+", "", "%s_%d" % (m.group("out"), os.getpid())
                )
                break

        if endpoint_name is None:
            return

        # Adds the appropriate environment variable. This will be read by link.exe
        # to know which instance of mspdbsrv.exe it should connect to (if it's
        # not set then the default endpoint is used).
        env["_MSPDBSRV_ENDPOINT_"] = endpoint_name

    def Dispatch(self, args):
        """Dispatches a string command to a method."""
        if len(args) < 1:
            raise Exception("Not enough arguments")

        method = "Exec%s" % self._CommandifyName(args[0])
        return getattr(self, method)(*args[1:])

    def _CommandifyName(self, name_string):
        """Transforms a tool name like recursive-mirror to RecursiveMirror."""
        return name_string.title().replace("-", "")

    def _GetEnv(self, arch):
        """Gets the saved environment from a file for a given architecture."""
        # The environment is saved as an "environment block" (see CreateProcess
        # and msvs_emulation for details). We convert to a dict here.
        # Drop last 2 NULs, one for list terminator, one for trailing vs. separator.
        pairs = open(arch).read()[:-2].split("\0")
        kvs = [item.split("=", 1) for item in pairs]
        return dict(kvs)

    def ExecStamp(self, path):
        """Simple stamp command."""
        open(path, "w").close()

    def ExecRecursiveMirror(self, source, dest):
        """Emulation of rm -rf out && cp -af in out."""
        if os.path.exists(dest):
            if os.path.isdir(dest):

                def _on_error(fn, path, excinfo):
                    # The operation failed, possibly because the file is set to
                    # read-only. If that's why, make it writable and try the op again.
                    if not os.access(path, os.W_OK):
                        os.chmod(path, stat.S_IWRITE)
                    fn(path)

                shutil.rmtree(dest, onerror=_on_error)
            else:
                if not os.access(dest, os.W_OK):
                    # Attempt to make the file writable before deleting it.
                    os.chmod(dest, stat.S_IWRITE)
                os.unlink(dest)

        if os.path.isdir(source):
            shutil.copytree(source, dest)
        else:
            shutil.copy2(source, dest)

    def ExecLinkWrapper(self, arch, use_separate_mspdbsrv, *args):
        """Filter diagnostic output from link that looks like:
    '   Creating library ui.dll.lib and object ui.dll.exp'
    This happens when there are exports from the dll or exe.
    """
        env = self._GetEnv(arch)
        if use_separate_mspdbsrv == "True":
            self._UseSeparateMspdbsrv(env, args)
        if sys.platform == "win32":
            args = list(args)  # *args is a tuple by default, which is read-only.
            args[0] = args[0].replace("/", "\\")
        # https://docs.python.org/2/library/subprocess.html:
        # "On Unix with shell=True [...] if args is a sequence, the first item
        # specifies the command string, and any additional items will be treated as
        # additional arguments to the shell itself.  That is to say, Popen does the
        # equivalent of:
        #   Popen(['/bin/sh', '-c', args[0], args[1], ...])"
        # For that reason, since going through the shell doesn't seem necessary on
        # non-Windows don't do that there.
        link = subprocess.Popen(
            args,
            shell=sys.platform == "win32",
            env=env,
            stdout=subprocess.PIPE,
            stderr=subprocess.STDOUT,
        )
        out = link.communicate()[0].decode("utf-8")
        for line in out.splitlines():
            if (
                not line.startswith("   Creating library ")
                and not line.startswith("Generating code")
                and not line.startswith("Finished generating code")
            ):
                print(line)
        return link.returncode

    def ExecLinkWithManifests(
        self,
        arch,
        embed_manifest,
        out,
        ldcmd,
        resname,
        mt,
        rc,
        intermediate_manifest,
        *manifests
    ):
        """A wrapper for handling creating a manifest resource and then executing
    a link command."""
        # The 'normal' way to do manifests is to have link generate a manifest
        # based on gathering dependencies from the object files, then merge that
        # manifest with other manifests supplied as sources, convert the merged
        # manifest to a resource, and then *relink*, including the compiled
        # version of the manifest resource. This breaks incremental linking, and
        # is generally overly complicated. Instead, we merge all the manifests
        # provided (along with one that includes what would normally be in the
        # linker-generated one, see msvs_emulation.py), and include that into the
        # first and only link. We still tell link to generate a manifest, but we
        # only use that to assert that our simpler process did not miss anything.
        variables = {
            "python": sys.executable,
            "arch": arch,
            "out": out,
            "ldcmd": ldcmd,
            "resname": resname,
            "mt": mt,
            "rc": rc,
            "intermediate_manifest": intermediate_manifest,
            "manifests": " ".join(manifests),
        }
        add_to_ld = ""
        if manifests:
            subprocess.check_call(
                "%(python)s gyp-win-tool manifest-wrapper %(arch)s %(mt)s -nologo "
                "-manifest %(manifests)s -out:%(out)s.manifest" % variables
            )
            if embed_manifest == "True":
                subprocess.check_call(
                    "%(python)s gyp-win-tool manifest-to-rc %(arch)s %(out)s.manifest"
                    " %(out)s.manifest.rc %(resname)s" % variables
                )
                subprocess.check_call(
                    "%(python)s gyp-win-tool rc-wrapper %(arch)s %(rc)s "
                    "%(out)s.manifest.rc" % variables
                )
                add_to_ld = " %(out)s.manifest.res" % variables
        subprocess.check_call(ldcmd + add_to_ld)

        # Run mt.exe on the theoretically complete manifest we generated, merging
        # it with the one the linker generated to confirm that the linker
        # generated one does not add anything. This is strictly unnecessary for
        # correctness, it's only to verify that e.g. /MANIFESTDEPENDENCY was not
        # used in a #pragma comment.
        if manifests:
            # Merge the intermediate one with ours to .assert.manifest, then check
            # that .assert.manifest is identical to ours.
            subprocess.check_call(
                "%(python)s gyp-win-tool manifest-wrapper %(arch)s %(mt)s -nologo "
                "-manifest %(out)s.manifest %(intermediate_manifest)s "
                "-out:%(out)s.assert.manifest" % variables
            )
            assert_manifest = "%(out)s.assert.manifest" % variables
            our_manifest = "%(out)s.manifest" % variables
            # Load and normalize the manifests. mt.exe sometimes removes whitespace,
            # and sometimes doesn't unfortunately.
            with open(our_manifest) as our_f:
                with open(assert_manifest) as assert_f:
                    translator = str.maketrans('', '', string.whitespace)
                    our_data = our_f.read().translate(translator)
                    assert_data = assert_f.read().translate(translator)
            if our_data != assert_data:
                os.unlink(out)

                def dump(filename):
                    print(filename, file=sys.stderr)
                    print("-----", file=sys.stderr)
                    with open(filename) as f:
                        print(f.read(), file=sys.stderr)
                        print("-----", file=sys.stderr)

                dump(intermediate_manifest)
                dump(our_manifest)
                dump(assert_manifest)
                sys.stderr.write(
                    'Linker generated manifest "%s" added to final manifest "%s" '
                    '(result in "%s"). '
                    "Were /MANIFEST switches used in #pragma statements? "
                    % (intermediate_manifest, our_manifest, assert_manifest)
                )
                return 1

    def ExecManifestWrapper(self, arch, *args):
        """Run manifest tool with environment set. Strip out undesirable warning
    (some XML blocks are recognized by the OS loader, but not the manifest
    tool)."""
        env = self._GetEnv(arch)
        popen = subprocess.Popen(
            args, shell=True, env=env, stdout=subprocess.PIPE, stderr=subprocess.STDOUT
        )
        out = popen.communicate()[0].decode("utf-8")
        for line in out.splitlines():
            if line and "manifest authoring warning 81010002" not in line:
                print(line)
        return popen.returncode

    def ExecManifestToRc(self, arch, *args):
        """Creates a resource file pointing a SxS assembly manifest.
    |args| is tuple containing path to resource file, path to manifest file
    and resource name which can be "1" (for executables) or "2" (for DLLs)."""
        manifest_path, resource_path, resource_name = args
        with open(resource_path, "w") as output:
            output.write(
                '#include <windows.h>\n%s RT_MANIFEST "%s"'
                % (resource_name, os.path.abspath(manifest_path).replace("\\", "/"))
            )

    def ExecMidlWrapper(self, arch, outdir, tlb, h, dlldata, iid, proxy, idl, *flags):
        """Filter noisy filenames output from MIDL compile step that isn't
    quietable via command line flags.
    """
        args = (
            ["midl", "/nologo"]
            + list(flags)
            + [
                "/out",
                outdir,
                "/tlb",
                tlb,
                "/h",
                h,
                "/dlldata",
                dlldata,
                "/iid",
                iid,
                "/proxy",
                proxy,
                idl,
            ]
        )
        env = self._GetEnv(arch)
        popen = subprocess.Popen(
            args, shell=True, env=env, stdout=subprocess.PIPE, stderr=subprocess.STDOUT
        )
        out = popen.communicate()[0].decode("utf-8")
        # Filter junk out of stdout, and write filtered versions. Output we want
        # to filter is pairs of lines that look like this:
        # Processing C:\Program Files (x86)\Microsoft SDKs\...\include\objidl.idl
        # objidl.idl
        lines = out.splitlines()
        prefixes = ("Processing ", "64 bit Processing ")
        processing = {os.path.basename(x) for x in lines if x.startswith(prefixes)}
        for line in lines:
            if not line.startswith(prefixes) and line not in processing:
                print(line)
        return popen.returncode

    def ExecAsmWrapper(self, arch, *args):
        """Filter logo banner from invocations of asm.exe."""
        env = self._GetEnv(arch)
        popen = subprocess.Popen(
            args, shell=True, env=env, stdout=subprocess.PIPE, stderr=subprocess.STDOUT
        )
        out = popen.communicate()[0].decode("utf-8")
        for line in out.splitlines():
            if (
                not line.startswith("Copyright (C) Microsoft Corporation")
                and not line.startswith("Microsoft (R) Macro Assembler")
                and not line.startswith(" Assembling: ")
                and line
            ):
                print(line)
        return popen.returncode

    def ExecRcWrapper(self, arch, *args):
        """Filter logo banner from invocations of rc.exe. Older versions of RC
    don't support the /nologo flag."""
        env = self._GetEnv(arch)
        popen = subprocess.Popen(
            args, shell=True, env=env, stdout=subprocess.PIPE, stderr=subprocess.STDOUT
        )
        out = popen.communicate()[0].decode("utf-8")
        for line in out.splitlines():
            if (
                not line.startswith("Microsoft (R) Windows (R) Resource Compiler")
                and not line.startswith("Copyright (C) Microsoft Corporation")
                and line
            ):
                print(line)
        return popen.returncode

    def ExecActionWrapper(self, arch, rspfile, *dir):
        """Runs an action command line from a response file using the environment
    for |arch|. If |dir| is supplied, use that as the working directory."""
        env = self._GetEnv(arch)
        # TODO(scottmg): This is a temporary hack to get some specific variables
        # through to actions that are set after gyp-time. http://crbug.com/333738.
        for k, v in os.environ.items():
            if k not in env:
                env[k] = v
        args = open(rspfile).read()
        dir = dir[0] if dir else None
        return subprocess.call(args, shell=True, env=env, cwd=dir)

    def ExecClCompile(self, project_dir, selected_files):
        """Executed by msvs-ninja projects when the 'ClCompile' target is used to
    build selected C/C++ files."""
        project_dir = os.path.relpath(project_dir, BASE_DIR)
        selected_files = selected_files.split(";")
        ninja_targets = [
            os.path.join(project_dir, filename) + "^^" for filename in selected_files
        ]
        cmd = ["ninja.exe"]
        cmd.extend(ninja_targets)
        return subprocess.call(cmd, shell=True, cwd=BASE_DIR)


if __name__ == "__main__":
    sys.exit(main(sys.argv[1:]))
# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""
This module contains classes that help to emulate xcodebuild behavior on top of
other build systems, such as make and ninja.
"""


import copy
import gyp.common
import os
import os.path
import re
import shlex
import subprocess
import sys
from gyp.common import GypError

# Populated lazily by XcodeVersion, for efficiency, and to fix an issue when
# "xcodebuild" is called too quickly (it has been found to return incorrect
# version number).
XCODE_VERSION_CACHE = None

# Populated lazily by GetXcodeArchsDefault, to an |XcodeArchsDefault| instance
# corresponding to the installed version of Xcode.
XCODE_ARCHS_DEFAULT_CACHE = None


def XcodeArchsVariableMapping(archs, archs_including_64_bit=None):
    """Constructs a dictionary with expansion for $(ARCHS_STANDARD) variable,
  and optionally for $(ARCHS_STANDARD_INCLUDING_64_BIT)."""
    mapping = {"$(ARCHS_STANDARD)": archs}
    if archs_including_64_bit:
        mapping["$(ARCHS_STANDARD_INCLUDING_64_BIT)"] = archs_including_64_bit
    return mapping


class XcodeArchsDefault:
    """A class to resolve ARCHS variable from xcode_settings, resolving Xcode
  macros and implementing filtering by VALID_ARCHS. The expansion of macros
  depends on the SDKROOT used ("macosx", "iphoneos", "iphonesimulator") and
  on the version of Xcode.
  """

    # Match variable like $(ARCHS_STANDARD).
    variable_pattern = re.compile(r"\$\([a-zA-Z_][a-zA-Z0-9_]*\)$")

    def __init__(self, default, mac, iphonesimulator, iphoneos):
        self._default = (default,)
        self._archs = {"mac": mac, "ios": iphoneos, "iossim": iphonesimulator}

    def _VariableMapping(self, sdkroot):
        """Returns the dictionary of variable mapping depending on the SDKROOT."""
        sdkroot = sdkroot.lower()
        if "iphoneos" in sdkroot:
            return self._archs["ios"]
        elif "iphonesimulator" in sdkroot:
            return self._archs["iossim"]
        else:
            return self._archs["mac"]

    def _ExpandArchs(self, archs, sdkroot):
        """Expands variables references in ARCHS, and remove duplicates."""
        variable_mapping = self._VariableMapping(sdkroot)
        expanded_archs = []
        for arch in archs:
            if self.variable_pattern.match(arch):
                variable = arch
                try:
                    variable_expansion = variable_mapping[variable]
                    for arch in variable_expansion:
                        if arch not in expanded_archs:
                            expanded_archs.append(arch)
                except KeyError:
                    print('Warning: Ignoring unsupported variable "%s".' % variable)
            elif arch not in expanded_archs:
                expanded_archs.append(arch)
        return expanded_archs

    def ActiveArchs(self, archs, valid_archs, sdkroot):
        """Expands variables references in ARCHS, and filter by VALID_ARCHS if it
    is defined (if not set, Xcode accept any value in ARCHS, otherwise, only
    values present in VALID_ARCHS are kept)."""
        expanded_archs = self._ExpandArchs(archs or self._default, sdkroot or "")
        if valid_archs:
            filtered_archs = []
            for arch in expanded_archs:
                if arch in valid_archs:
                    filtered_archs.append(arch)
            expanded_archs = filtered_archs
        return expanded_archs


def GetXcodeArchsDefault():
    """Returns the |XcodeArchsDefault| object to use to expand ARCHS for the
  installed version of Xcode. The default values used by Xcode for ARCHS
  and the expansion of the variables depends on the version of Xcode used.

  For all version anterior to Xcode 5.0 or posterior to Xcode 5.1 included
  uses $(ARCHS_STANDARD) if ARCHS is unset, while Xcode 5.0 to 5.0.2 uses
  $(ARCHS_STANDARD_INCLUDING_64_BIT). This variable was added to Xcode 5.0
  and deprecated with Xcode 5.1.

  For "macosx" SDKROOT, all version starting with Xcode 5.0 includes 64-bit
  architecture as part of $(ARCHS_STANDARD) and default to only building it.

  For "iphoneos" and "iphonesimulator" SDKROOT, 64-bit architectures are part
  of $(ARCHS_STANDARD_INCLUDING_64_BIT) from Xcode 5.0. From Xcode 5.1, they
  are also part of $(ARCHS_STANDARD).

  All these rules are coded in the construction of the |XcodeArchsDefault|
  object to use depending on the version of Xcode detected. The object is
  for performance reason."""
    global XCODE_ARCHS_DEFAULT_CACHE
    if XCODE_ARCHS_DEFAULT_CACHE:
        return XCODE_ARCHS_DEFAULT_CACHE
    xcode_version, _ = XcodeVersion()
    if xcode_version < "0500":
        XCODE_ARCHS_DEFAULT_CACHE = XcodeArchsDefault(
            "$(ARCHS_STANDARD)",
            XcodeArchsVariableMapping(["i386"]),
            XcodeArchsVariableMapping(["i386"]),
            XcodeArchsVariableMapping(["armv7"]),
        )
    elif xcode_version < "0510":
        XCODE_ARCHS_DEFAULT_CACHE = XcodeArchsDefault(
            "$(ARCHS_STANDARD_INCLUDING_64_BIT)",
            XcodeArchsVariableMapping(["x86_64"], ["x86_64"]),
            XcodeArchsVariableMapping(["i386"], ["i386", "x86_64"]),
            XcodeArchsVariableMapping(
                ["armv7", "armv7s"], ["armv7", "armv7s", "arm64"]
            ),
        )
    else:
        XCODE_ARCHS_DEFAULT_CACHE = XcodeArchsDefault(
            "$(ARCHS_STANDARD)",
            XcodeArchsVariableMapping(["x86_64"], ["x86_64"]),
            XcodeArchsVariableMapping(["i386", "x86_64"], ["i386", "x86_64"]),
            XcodeArchsVariableMapping(
                ["armv7", "armv7s", "arm64"], ["armv7", "armv7s", "arm64"]
            ),
        )
    return XCODE_ARCHS_DEFAULT_CACHE


class XcodeSettings:
    """A class that understands the gyp 'xcode_settings' object."""

    # Populated lazily by _SdkPath(). Shared by all XcodeSettings, so cached
    # at class-level for efficiency.
    _sdk_path_cache = {}
    _platform_path_cache = {}
    _sdk_root_cache = {}

    # Populated lazily by GetExtraPlistItems(). Shared by all XcodeSettings, so
    # cached at class-level for efficiency.
    _plist_cache = {}

    # Populated lazily by GetIOSPostbuilds.  Shared by all XcodeSettings, so
    # cached at class-level for efficiency.
    _codesigning_key_cache = {}

    def __init__(self, spec):
        self.spec = spec

        self.isIOS = False
        self.mac_toolchain_dir = None
        self.header_map_path = None

        # Per-target 'xcode_settings' are pushed down into configs earlier by gyp.
        # This means self.xcode_settings[config] always contains all settings
        # for that config -- the per-target settings as well. Settings that are
        # the same for all configs are implicitly per-target settings.
        self.xcode_settings = {}
        configs = spec["configurations"]
        for configname, config in configs.items():
            self.xcode_settings[configname] = config.get("xcode_settings", {})
            self._ConvertConditionalKeys(configname)
            if self.xcode_settings[configname].get("IPHONEOS_DEPLOYMENT_TARGET", None):
                self.isIOS = True

        # This is only non-None temporarily during the execution of some methods.
        self.configname = None

        # Used by _AdjustLibrary to match .a and .dylib entries in libraries.
        self.library_re = re.compile(r"^lib([^/]+)\.(a|dylib)$")

    def _ConvertConditionalKeys(self, configname):
        """Converts or warns on conditional keys.  Xcode supports conditional keys,
    such as CODE_SIGN_IDENTITY[sdk=iphoneos*].  This is a partial implementation
    with some keys converted while the rest force a warning."""
        settings = self.xcode_settings[configname]
        conditional_keys = [key for key in settings if key.endswith("]")]
        for key in conditional_keys:
            # If you need more, speak up at http://crbug.com/122592
            if key.endswith("[sdk=iphoneos*]"):
                if configname.endswith("iphoneos"):
                    new_key = key.split("[")[0]
                    settings[new_key] = settings[key]
            else:
                print(
                    "Warning: Conditional keys not implemented, ignoring:",
                    " ".join(conditional_keys),
                )
            del settings[key]

    def _Settings(self):
        assert self.configname
        return self.xcode_settings[self.configname]

    def _Test(self, test_key, cond_key, default):
        return self._Settings().get(test_key, default) == cond_key

    def _Appendf(self, lst, test_key, format_str, default=None):
        if test_key in self._Settings():
            lst.append(format_str % str(self._Settings()[test_key]))
        elif default:
            lst.append(format_str % str(default))

    def _WarnUnimplemented(self, test_key):
        if test_key in self._Settings():
            print('Warning: Ignoring not yet implemented key "%s".' % test_key)

    def IsBinaryOutputFormat(self, configname):
        default = "binary" if self.isIOS else "xml"
        format = self.xcode_settings[configname].get("INFOPLIST_OUTPUT_FORMAT", default)
        return format == "binary"

    def IsIosFramework(self):
        return self.spec["type"] == "shared_library" and self._IsBundle() and self.isIOS

    def _IsBundle(self):
        return (
            int(self.spec.get("mac_bundle", 0)) != 0
            or self._IsXCTest()
            or self._IsXCUiTest()
        )

    def _IsXCTest(self):
        return int(self.spec.get("mac_xctest_bundle", 0)) != 0

    def _IsXCUiTest(self):
        return int(self.spec.get("mac_xcuitest_bundle", 0)) != 0

    def _IsIosAppExtension(self):
        return int(self.spec.get("ios_app_extension", 0)) != 0

    def _IsIosWatchKitExtension(self):
        return int(self.spec.get("ios_watchkit_extension", 0)) != 0

    def _IsIosWatchApp(self):
        return int(self.spec.get("ios_watch_app", 0)) != 0

    def GetFrameworkVersion(self):
        """Returns the framework version of the current target. Only valid for
    bundles."""
        assert self._IsBundle()
        return self.GetPerTargetSetting("FRAMEWORK_VERSION", default="A")

    def GetWrapperExtension(self):
        """Returns the bundle extension (.app, .framework, .plugin, etc).  Only
    valid for bundles."""
        assert self._IsBundle()
        if self.spec["type"] in ("loadable_module", "shared_library"):
            default_wrapper_extension = {
                "loadable_module": "bundle",
                "shared_library": "framework",
            }[self.spec["type"]]
            wrapper_extension = self.GetPerTargetSetting(
                "WRAPPER_EXTENSION", default=default_wrapper_extension
            )
            return "." + self.spec.get("product_extension", wrapper_extension)
        elif self.spec["type"] == "executable":
            if self._IsIosAppExtension() or self._IsIosWatchKitExtension():
                return "." + self.spec.get("product_extension", "appex")
            else:
                return "." + self.spec.get("product_extension", "app")
        else:
            assert False, "Don't know extension for '{}', target '{}'".format(
                self.spec["type"],
                self.spec["target_name"],
            )

    def GetProductName(self):
        """Returns PRODUCT_NAME."""
        return self.spec.get("product_name", self.spec["target_name"])

    def GetFullProductName(self):
        """Returns FULL_PRODUCT_NAME."""
        if self._IsBundle():
            return self.GetWrapperName()
        else:
            return self._GetStandaloneBinaryPath()

    def GetWrapperName(self):
        """Returns the directory name of the bundle represented by this target.
    Only valid for bundles."""
        assert self._IsBundle()
        return self.GetProductName() + self.GetWrapperExtension()

    def GetBundleContentsFolderPath(self):
        """Returns the qualified path to the bundle's contents folder. E.g.
    Chromium.app/Contents or Foo.bundle/Versions/A. Only valid for bundles."""
        if self.isIOS:
            return self.GetWrapperName()
        assert self._IsBundle()
        if self.spec["type"] == "shared_library":
            return os.path.join(
                self.GetWrapperName(), "Versions", self.GetFrameworkVersion()
            )
        else:
            # loadable_modules have a 'Contents' folder like executables.
            return os.path.join(self.GetWrapperName(), "Contents")

    def GetBundleResourceFolder(self):
        """Returns the qualified path to the bundle's resource folder. E.g.
    Chromium.app/Contents/Resources. Only valid for bundles."""
        assert self._IsBundle()
        if self.isIOS:
            return self.GetBundleContentsFolderPath()
        return os.path.join(self.GetBundleContentsFolderPath(), "Resources")

    def GetBundleExecutableFolderPath(self):
        """Returns the qualified path to the bundle's executables folder. E.g.
    Chromium.app/Contents/MacOS. Only valid for bundles."""
        assert self._IsBundle()
        if self.spec["type"] in ("shared_library") or self.isIOS:
            return self.GetBundleContentsFolderPath()
        elif self.spec["type"] in ("executable", "loadable_module"):
            return os.path.join(self.GetBundleContentsFolderPath(), "MacOS")

    def GetBundleJavaFolderPath(self):
        """Returns the qualified path to the bundle's Java resource folder.
    E.g. Chromium.app/Contents/Resources/Java. Only valid for bundles."""
        assert self._IsBundle()
        return os.path.join(self.GetBundleResourceFolder(), "Java")

    def GetBundleFrameworksFolderPath(self):
        """Returns the qualified path to the bundle's frameworks folder. E.g,
    Chromium.app/Contents/Frameworks. Only valid for bundles."""
        assert self._IsBundle()
        return os.path.join(self.GetBundleContentsFolderPath(), "Frameworks")

    def GetBundleSharedFrameworksFolderPath(self):
        """Returns the qualified path to the bundle's frameworks folder. E.g,
    Chromium.app/Contents/SharedFrameworks. Only valid for bundles."""
        assert self._IsBundle()
        return os.path.join(self.GetBundleContentsFolderPath(), "SharedFrameworks")

    def GetBundleSharedSupportFolderPath(self):
        """Returns the qualified path to the bundle's shared support folder. E.g,
    Chromium.app/Contents/SharedSupport. Only valid for bundles."""
        assert self._IsBundle()
        if self.spec["type"] == "shared_library":
            return self.GetBundleResourceFolder()
        else:
            return os.path.join(self.GetBundleContentsFolderPath(), "SharedSupport")

    def GetBundlePlugInsFolderPath(self):
        """Returns the qualified path to the bundle's plugins folder. E.g,
    Chromium.app/Contents/PlugIns. Only valid for bundles."""
        assert self._IsBundle()
        return os.path.join(self.GetBundleContentsFolderPath(), "PlugIns")

    def GetBundleXPCServicesFolderPath(self):
        """Returns the qualified path to the bundle's XPC services folder. E.g,
    Chromium.app/Contents/XPCServices. Only valid for bundles."""
        assert self._IsBundle()
        return os.path.join(self.GetBundleContentsFolderPath(), "XPCServices")

    def GetBundlePlistPath(self):
        """Returns the qualified path to the bundle's plist file. E.g.
    Chromium.app/Contents/Info.plist. Only valid for bundles."""
        assert self._IsBundle()
        if (
            self.spec["type"] in ("executable", "loadable_module")
            or self.IsIosFramework()
        ):
            return os.path.join(self.GetBundleContentsFolderPath(), "Info.plist")
        else:
            return os.path.join(
                self.GetBundleContentsFolderPath(), "Resources", "Info.plist"
            )

    def GetProductType(self):
        """Returns the PRODUCT_TYPE of this target."""
        if self._IsIosAppExtension():
            assert self._IsBundle(), (
                "ios_app_extension flag requires mac_bundle "
                "(target %s)" % self.spec["target_name"]
            )
            return "com.apple.product-type.app-extension"
        if self._IsIosWatchKitExtension():
            assert self._IsBundle(), (
                "ios_watchkit_extension flag requires "
                "mac_bundle (target %s)" % self.spec["target_name"]
            )
            return "com.apple.product-type.watchkit-extension"
        if self._IsIosWatchApp():
            assert self._IsBundle(), (
                "ios_watch_app flag requires mac_bundle "
                "(target %s)" % self.spec["target_name"]
            )
            return "com.apple.product-type.application.watchapp"
        if self._IsXCUiTest():
            assert self._IsBundle(), (
                "mac_xcuitest_bundle flag requires mac_bundle "
                "(target %s)" % self.spec["target_name"]
            )
            return "com.apple.product-type.bundle.ui-testing"
        if self._IsBundle():
            return {
                "executable": "com.apple.product-type.application",
                "loadable_module": "com.apple.product-type.bundle",
                "shared_library": "com.apple.product-type.framework",
            }[self.spec["type"]]
        else:
            return {
                "executable": "com.apple.product-type.tool",
                "loadable_module": "com.apple.product-type.library.dynamic",
                "shared_library": "com.apple.product-type.library.dynamic",
                "static_library": "com.apple.product-type.library.static",
            }[self.spec["type"]]

    def GetMachOType(self):
        """Returns the MACH_O_TYPE of this target."""
        # Weird, but matches Xcode.
        if not self._IsBundle() and self.spec["type"] == "executable":
            return ""
        return {
            "executable": "mh_execute",
            "static_library": "staticlib",
            "shared_library": "mh_dylib",
            "loadable_module": "mh_bundle",
        }[self.spec["type"]]

    def _GetBundleBinaryPath(self):
        """Returns the name of the bundle binary of by this target.
    E.g. Chromium.app/Contents/MacOS/Chromium. Only valid for bundles."""
        assert self._IsBundle()
        return os.path.join(
            self.GetBundleExecutableFolderPath(), self.GetExecutableName()
        )

    def _GetStandaloneExecutableSuffix(self):
        if "product_extension" in self.spec:
            return "." + self.spec["product_extension"]
        return {
            "executable": "",
            "static_library": ".a",
            "shared_library": ".dylib",
            "loadable_module": ".so",
        }[self.spec["type"]]

    def _GetStandaloneExecutablePrefix(self):
        return self.spec.get(
            "product_prefix",
            {
                "executable": "",
                "static_library": "lib",
                "shared_library": "lib",
                # Non-bundled loadable_modules are called foo.so for some reason
                # (that is, .so and no prefix) with the xcode build -- match that.
                "loadable_module": "",
            }[self.spec["type"]],
        )

    def _GetStandaloneBinaryPath(self):
        """Returns the name of the non-bundle binary represented by this target.
    E.g. hello_world. Only valid for non-bundles."""
        assert not self._IsBundle()
        assert self.spec["type"] in (
            "executable",
            "shared_library",
            "static_library",
            "loadable_module",
        ), ("Unexpected type %s" % self.spec["type"])
        target = self.spec["target_name"]
        if self.spec["type"] == "static_library":
            if target[:3] == "lib":
                target = target[3:]
        elif self.spec["type"] in ("loadable_module", "shared_library"):
            if target[:3] == "lib":
                target = target[3:]

        target_prefix = self._GetStandaloneExecutablePrefix()
        target = self.spec.get("product_name", target)
        target_ext = self._GetStandaloneExecutableSuffix()
        return target_prefix + target + target_ext

    def GetExecutableName(self):
        """Returns the executable name of the bundle represented by this target.
    E.g. Chromium."""
        if self._IsBundle():
            return self.spec.get("product_name", self.spec["target_name"])
        else:
            return self._GetStandaloneBinaryPath()

    def GetExecutablePath(self):
        """Returns the qualified path to the primary executable of the bundle
    represented by this target. E.g. Chromium.app/Contents/MacOS/Chromium."""
        if self._IsBundle():
            return self._GetBundleBinaryPath()
        else:
            return self._GetStandaloneBinaryPath()

    def GetActiveArchs(self, configname):
        """Returns the architectures this target should be built for."""
        config_settings = self.xcode_settings[configname]
        xcode_archs_default = GetXcodeArchsDefault()
        return xcode_archs_default.ActiveArchs(
            config_settings.get("ARCHS"),
            config_settings.get("VALID_ARCHS"),
            config_settings.get("SDKROOT"),
        )

    def _GetSdkVersionInfoItem(self, sdk, infoitem):
        # xcodebuild requires Xcode and can't run on Command Line Tools-only
        # systems from 10.7 onward.
        # Since the CLT has no SDK paths anyway, returning None is the
        # most sensible route and should still do the right thing.
        try:
            return GetStdoutQuiet(["xcrun", "--sdk", sdk, infoitem])
        except GypError:
            pass

    def _SdkRoot(self, configname):
        if configname is None:
            configname = self.configname
        return self.GetPerConfigSetting("SDKROOT", configname, default="")

    def _XcodePlatformPath(self, configname=None):
        sdk_root = self._SdkRoot(configname)
        if sdk_root not in XcodeSettings._platform_path_cache:
            platform_path = self._GetSdkVersionInfoItem(
                sdk_root, "--show-sdk-platform-path"
            )
            XcodeSettings._platform_path_cache[sdk_root] = platform_path
        return XcodeSettings._platform_path_cache[sdk_root]

    def _SdkPath(self, configname=None):
        sdk_root = self._SdkRoot(configname)
        if sdk_root.startswith("/"):
            return sdk_root
        return self._XcodeSdkPath(sdk_root)

    def _XcodeSdkPath(self, sdk_root):
        if sdk_root not in XcodeSettings._sdk_path_cache:
            sdk_path = self._GetSdkVersionInfoItem(sdk_root, "--show-sdk-path")
            XcodeSettings._sdk_path_cache[sdk_root] = sdk_path
            if sdk_root:
                XcodeSettings._sdk_root_cache[sdk_path] = sdk_root
        return XcodeSettings._sdk_path_cache[sdk_root]

    def _AppendPlatformVersionMinFlags(self, lst):
        self._Appendf(lst, "MACOSX_DEPLOYMENT_TARGET", "-mmacosx-version-min=%s")
        if "IPHONEOS_DEPLOYMENT_TARGET" in self._Settings():
            # TODO: Implement this better?
            sdk_path_basename = os.path.basename(self._SdkPath())
            if sdk_path_basename.lower().startswith("iphonesimulator"):
                self._Appendf(
                    lst, "IPHONEOS_DEPLOYMENT_TARGET", "-mios-simulator-version-min=%s"
                )
            else:
                self._Appendf(
                    lst, "IPHONEOS_DEPLOYMENT_TARGET", "-miphoneos-version-min=%s"
                )

    def GetCflags(self, configname, arch=None):
        """Returns flags that need to be added to .c, .cc, .m, and .mm
    compilations."""
        # This functions (and the similar ones below) do not offer complete
        # emulation of all xcode_settings keys. They're implemented on demand.

        self.configname = configname
        cflags = []

        sdk_root = self._SdkPath()
        if "SDKROOT" in self._Settings() and sdk_root:
            cflags.append("-isysroot %s" % sdk_root)

        if self.header_map_path:
            cflags.append("-I%s" % self.header_map_path)

        if self._Test("CLANG_WARN_CONSTANT_CONVERSION", "YES", default="NO"):
            cflags.append("-Wconstant-conversion")

        if self._Test("GCC_CHAR_IS_UNSIGNED_CHAR", "YES", default="NO"):
            cflags.append("-funsigned-char")

        if self._Test("GCC_CW_ASM_SYNTAX", "YES", default="YES"):
            cflags.append("-fasm-blocks")

        if "GCC_DYNAMIC_NO_PIC" in self._Settings():
            if self._Settings()["GCC_DYNAMIC_NO_PIC"] == "YES":
                cflags.append("-mdynamic-no-pic")
        else:
            pass
            # TODO: In this case, it depends on the target. xcode passes
            # mdynamic-no-pic by default for executable and possibly static lib
            # according to mento

        if self._Test("GCC_ENABLE_PASCAL_STRINGS", "YES", default="YES"):
            cflags.append("-mpascal-strings")

        self._Appendf(cflags, "GCC_OPTIMIZATION_LEVEL", "-O%s", default="s")

        if self._Test("GCC_GENERATE_DEBUGGING_SYMBOLS", "YES", default="YES"):
            dbg_format = self._Settings().get("DEBUG_INFORMATION_FORMAT", "dwarf")
            if dbg_format == "dwarf":
                cflags.append("-gdwarf-2")
            elif dbg_format == "stabs":
                raise NotImplementedError("stabs debug format is not supported yet.")
            elif dbg_format == "dwarf-with-dsym":
                cflags.append("-gdwarf-2")
            else:
                raise NotImplementedError("Unknown debug format %s" % dbg_format)

        if self._Settings().get("GCC_STRICT_ALIASING") == "YES":
            cflags.append("-fstrict-aliasing")
        elif self._Settings().get("GCC_STRICT_ALIASING") == "NO":
            cflags.append("-fno-strict-aliasing")

        if self._Test("GCC_SYMBOLS_PRIVATE_EXTERN", "YES", default="NO"):
            cflags.append("-fvisibility=hidden")

        if self._Test("GCC_TREAT_WARNINGS_AS_ERRORS", "YES", default="NO"):
            cflags.append("-Werror")

        if self._Test("GCC_WARN_ABOUT_MISSING_NEWLINE", "YES", default="NO"):
            cflags.append("-Wnewline-eof")

        # In Xcode, this is only activated when GCC_COMPILER_VERSION is clang or
        # llvm-gcc. It also requires a fairly recent libtool, and
        # if the system clang isn't used, DYLD_LIBRARY_PATH needs to contain the
        # path to the libLTO.dylib that matches the used clang.
        if self._Test("LLVM_LTO", "YES", default="NO"):
            cflags.append("-flto")

        self._AppendPlatformVersionMinFlags(cflags)

        # TODO:
        if self._Test("COPY_PHASE_STRIP", "YES", default="NO"):
            self._WarnUnimplemented("COPY_PHASE_STRIP")
        self._WarnUnimplemented("GCC_DEBUGGING_SYMBOLS")
        self._WarnUnimplemented("GCC_ENABLE_OBJC_EXCEPTIONS")

        # TODO: This is exported correctly, but assigning to it is not supported.
        self._WarnUnimplemented("MACH_O_TYPE")
        self._WarnUnimplemented("PRODUCT_TYPE")

        # If GYP_CROSSCOMPILE (--cross-compiling), disable architecture-specific
        # additions and assume these will be provided as required via CC_host,
        # CXX_host, CC_target and CXX_target.
        if not gyp.common.CrossCompileRequested():
            if arch is not None:
                archs = [arch]
            else:
                assert self.configname
                archs = self.GetActiveArchs(self.configname)
            if len(archs) != 1:
                # TODO: Supporting fat binaries will be annoying.
                self._WarnUnimplemented("ARCHS")
                archs = ["i386"]
            cflags.append("-arch " + archs[0])

            if archs[0] in ("i386", "x86_64"):
                if self._Test("GCC_ENABLE_SSE3_EXTENSIONS", "YES", default="NO"):
                    cflags.append("-msse3")
                if self._Test(
                    "GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS", "YES", default="NO"
                ):
                    cflags.append("-mssse3")  # Note 3rd 's'.
                if self._Test("GCC_ENABLE_SSE41_EXTENSIONS", "YES", default="NO"):
                    cflags.append("-msse4.1")
                if self._Test("GCC_ENABLE_SSE42_EXTENSIONS", "YES", default="NO"):
                    cflags.append("-msse4.2")

        cflags += self._Settings().get("WARNING_CFLAGS", [])

        if self._IsXCTest():
            platform_root = self._XcodePlatformPath(configname)
            if platform_root:
                cflags.append("-F" + platform_root + "/Developer/Library/Frameworks/")

        if sdk_root:
            framework_root = sdk_root
        else:
            framework_root = ""
        config = self.spec["configurations"][self.configname]
        framework_dirs = config.get("mac_framework_dirs", [])
        for directory in framework_dirs:
            cflags.append("-F" + directory.replace("$(SDKROOT)", framework_root))

        self.configname = None
        return cflags

    def GetCflagsC(self, configname):
        """Returns flags that need to be added to .c, and .m compilations."""
        self.configname = configname
        cflags_c = []
        if self._Settings().get("GCC_C_LANGUAGE_STANDARD", "") == "ansi":
            cflags_c.append("-ansi")
        else:
            self._Appendf(cflags_c, "GCC_C_LANGUAGE_STANDARD", "-std=%s")
        cflags_c += self._Settings().get("OTHER_CFLAGS", [])
        self.configname = None
        return cflags_c

    def GetCflagsCC(self, configname):
        """Returns flags that need to be added to .cc, and .mm compilations."""
        self.configname = configname
        cflags_cc = []

        clang_cxx_language_standard = self._Settings().get(
            "CLANG_CXX_LANGUAGE_STANDARD"
        )
        # Note: Don't make c++0x to c++11 so that c++0x can be used with older
        # clangs that don't understand c++11 yet (like Xcode 4.2's).
        if clang_cxx_language_standard:
            cflags_cc.append("-std=%s" % clang_cxx_language_standard)

        self._Appendf(cflags_cc, "CLANG_CXX_LIBRARY", "-stdlib=%s")

        if self._Test("GCC_ENABLE_CPP_RTTI", "NO", default="YES"):
            cflags_cc.append("-fno-rtti")
        if self._Test("GCC_ENABLE_CPP_EXCEPTIONS", "NO", default="YES"):
            cflags_cc.append("-fno-exceptions")
        if self._Test("GCC_INLINES_ARE_PRIVATE_EXTERN", "YES", default="NO"):
            cflags_cc.append("-fvisibility-inlines-hidden")
        if self._Test("GCC_THREADSAFE_STATICS", "NO", default="YES"):
            cflags_cc.append("-fno-threadsafe-statics")
        # Note: This flag is a no-op for clang, it only has an effect for gcc.
        if self._Test("GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO", "NO", default="YES"):
            cflags_cc.append("-Wno-invalid-offsetof")

        other_ccflags = []

        for flag in self._Settings().get("OTHER_CPLUSPLUSFLAGS", ["$(inherited)"]):
            # TODO: More general variable expansion. Missing in many other places too.
            if flag in ("$inherited", "$(inherited)", "${inherited}"):
                flag = "$OTHER_CFLAGS"
            if flag in ("$OTHER_CFLAGS", "$(OTHER_CFLAGS)", "${OTHER_CFLAGS}"):
                other_ccflags += self._Settings().get("OTHER_CFLAGS", [])
            else:
                other_ccflags.append(flag)
        cflags_cc += other_ccflags

        self.configname = None
        return cflags_cc

    def _AddObjectiveCGarbageCollectionFlags(self, flags):
        gc_policy = self._Settings().get("GCC_ENABLE_OBJC_GC", "unsupported")
        if gc_policy == "supported":
            flags.append("-fobjc-gc")
        elif gc_policy == "required":
            flags.append("-fobjc-gc-only")

    def _AddObjectiveCARCFlags(self, flags):
        if self._Test("CLANG_ENABLE_OBJC_ARC", "YES", default="NO"):
            flags.append("-fobjc-arc")

    def _AddObjectiveCMissingPropertySynthesisFlags(self, flags):
        if self._Test(
            "CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS", "YES", default="NO"
        ):
            flags.append("-Wobjc-missing-property-synthesis")

    def GetCflagsObjC(self, configname):
        """Returns flags that need to be added to .m compilations."""
        self.configname = configname
        cflags_objc = []
        self._AddObjectiveCGarbageCollectionFlags(cflags_objc)
        self._AddObjectiveCARCFlags(cflags_objc)
        self._AddObjectiveCMissingPropertySynthesisFlags(cflags_objc)
        self.configname = None
        return cflags_objc

    def GetCflagsObjCC(self, configname):
        """Returns flags that need to be added to .mm compilations."""
        self.configname = configname
        cflags_objcc = []
        self._AddObjectiveCGarbageCollectionFlags(cflags_objcc)
        self._AddObjectiveCARCFlags(cflags_objcc)
        self._AddObjectiveCMissingPropertySynthesisFlags(cflags_objcc)
        if self._Test("GCC_OBJC_CALL_CXX_CDTORS", "YES", default="NO"):
            cflags_objcc.append("-fobjc-call-cxx-cdtors")
        self.configname = None
        return cflags_objcc

    def GetInstallNameBase(self):
        """Return DYLIB_INSTALL_NAME_BASE for this target."""
        # Xcode sets this for shared_libraries, and for nonbundled loadable_modules.
        if self.spec["type"] != "shared_library" and (
            self.spec["type"] != "loadable_module" or self._IsBundle()
        ):
            return None
        install_base = self.GetPerTargetSetting(
            "DYLIB_INSTALL_NAME_BASE",
            default="/Library/Frameworks" if self._IsBundle() else "/usr/local/lib",
        )
        return install_base

    def _StandardizePath(self, path):
        """Do :standardizepath processing for path."""
        # I'm not quite sure what :standardizepath does. Just call normpath(),
        # but don't let @executable_path/../foo collapse to foo.
        if "/" in path:
            prefix, rest = "", path
            if path.startswith("@"):
                prefix, rest = path.split("/", 1)
            rest = os.path.normpath(rest)  # :standardizepath
            path = os.path.join(prefix, rest)
        return path

    def GetInstallName(self):
        """Return LD_DYLIB_INSTALL_NAME for this target."""
        # Xcode sets this for shared_libraries, and for nonbundled loadable_modules.
        if self.spec["type"] != "shared_library" and (
            self.spec["type"] != "loadable_module" or self._IsBundle()
        ):
            return None

        default_install_name = (
            "$(DYLIB_INSTALL_NAME_BASE:standardizepath)/$(EXECUTABLE_PATH)"
        )
        install_name = self.GetPerTargetSetting(
            "LD_DYLIB_INSTALL_NAME", default=default_install_name
        )

        # Hardcode support for the variables used in chromium for now, to
        # unblock people using the make build.
        if "$" in install_name:
            assert install_name in (
                "$(DYLIB_INSTALL_NAME_BASE:standardizepath)/"
                "$(WRAPPER_NAME)/$(PRODUCT_NAME)",
                default_install_name,
            ), (
                "Variables in LD_DYLIB_INSTALL_NAME are not generally supported "
                "yet in target '%s' (got '%s')"
                % (self.spec["target_name"], install_name)
            )

            install_name = install_name.replace(
                "$(DYLIB_INSTALL_NAME_BASE:standardizepath)",
                self._StandardizePath(self.GetInstallNameBase()),
            )
            if self._IsBundle():
                # These are only valid for bundles, hence the |if|.
                install_name = install_name.replace(
                    "$(WRAPPER_NAME)", self.GetWrapperName()
                )
                install_name = install_name.replace(
                    "$(PRODUCT_NAME)", self.GetProductName()
                )
            else:
                assert "$(WRAPPER_NAME)" not in install_name
                assert "$(PRODUCT_NAME)" not in install_name

            install_name = install_name.replace(
                "$(EXECUTABLE_PATH)", self.GetExecutablePath()
            )
        return install_name

    def _MapLinkerFlagFilename(self, ldflag, gyp_to_build_path):
        """Checks if ldflag contains a filename and if so remaps it from
    gyp-directory-relative to build-directory-relative."""
        # This list is expanded on demand.
        # They get matched as:
        #   -exported_symbols_list file
        #   -Wl,exported_symbols_list file
        #   -Wl,exported_symbols_list,file
        LINKER_FILE = r"(\S+)"
        WORD = r"\S+"
        linker_flags = [
            ["-exported_symbols_list", LINKER_FILE],  # Needed for NaCl.
            ["-unexported_symbols_list", LINKER_FILE],
            ["-reexported_symbols_list", LINKER_FILE],
            ["-sectcreate", WORD, WORD, LINKER_FILE],  # Needed for remoting.
        ]
        for flag_pattern in linker_flags:
            regex = re.compile("(?:-Wl,)?" + "[ ,]".join(flag_pattern))
            m = regex.match(ldflag)
            if m:
                ldflag = (
                    ldflag[: m.start(1)]
                    + gyp_to_build_path(m.group(1))
                    + ldflag[m.end(1) :]
                )
        # Required for ffmpeg (no idea why they don't use LIBRARY_SEARCH_PATHS,
        # TODO(thakis): Update ffmpeg.gyp):
        if ldflag.startswith("-L"):
            ldflag = "-L" + gyp_to_build_path(ldflag[len("-L") :])
        return ldflag

    def GetLdflags(self, configname, product_dir, gyp_to_build_path, arch=None):
        """Returns flags that need to be passed to the linker.

    Args:
        configname: The name of the configuration to get ld flags for.
        product_dir: The directory where products such static and dynamic
            libraries are placed. This is added to the library search path.
        gyp_to_build_path: A function that converts paths relative to the
            current gyp file to paths relative to the build directory.
    """
        self.configname = configname
        ldflags = []

        # The xcode build is relative to a gyp file's directory, and OTHER_LDFLAGS
        # can contain entries that depend on this. Explicitly absolutify these.
        for ldflag in self._Settings().get("OTHER_LDFLAGS", []):
            ldflags.append(self._MapLinkerFlagFilename(ldflag, gyp_to_build_path))

        if self._Test("DEAD_CODE_STRIPPING", "YES", default="NO"):
            ldflags.append("-Wl,-dead_strip")

        if self._Test("PREBINDING", "YES", default="NO"):
            ldflags.append("-Wl,-prebind")

        self._Appendf(
            ldflags, "DYLIB_COMPATIBILITY_VERSION", "-compatibility_version %s"
        )
        self._Appendf(ldflags, "DYLIB_CURRENT_VERSION", "-current_version %s")

        self._AppendPlatformVersionMinFlags(ldflags)

        if "SDKROOT" in self._Settings() and self._SdkPath():
            ldflags.append("-isysroot " + self._SdkPath())

        for library_path in self._Settings().get("LIBRARY_SEARCH_PATHS", []):
            ldflags.append("-L" + gyp_to_build_path(library_path))

        if "ORDER_FILE" in self._Settings():
            ldflags.append(
                "-Wl,-order_file "
                + "-Wl,"
                + gyp_to_build_path(self._Settings()["ORDER_FILE"])
            )

        if not gyp.common.CrossCompileRequested():
            if arch is not None:
                archs = [arch]
            else:
                assert self.configname
                archs = self.GetActiveArchs(self.configname)
            if len(archs) != 1:
                # TODO: Supporting fat binaries will be annoying.
                self._WarnUnimplemented("ARCHS")
                archs = ["i386"]
            ldflags.append("-arch " + archs[0])

        # Xcode adds the product directory by default.
        # Rewrite -L. to -L./ to work around http://www.openradar.me/25313838
        ldflags.append("-L" + (product_dir if product_dir != "." else "./"))

        install_name = self.GetInstallName()
        if install_name and self.spec["type"] != "loadable_module":
            ldflags.append("-install_name " + install_name.replace(" ", r"\ "))

        for rpath in self._Settings().get("LD_RUNPATH_SEARCH_PATHS", []):
            ldflags.append("-Wl,-rpath," + rpath)

        sdk_root = self._SdkPath()
        if not sdk_root:
            sdk_root = ""
        config = self.spec["configurations"][self.configname]
        framework_dirs = config.get("mac_framework_dirs", [])
        for directory in framework_dirs:
            ldflags.append("-F" + directory.replace("$(SDKROOT)", sdk_root))

        if self._IsXCTest():
            platform_root = self._XcodePlatformPath(configname)
            if sdk_root and platform_root:
                ldflags.append("-F" + platform_root + "/Developer/Library/Frameworks/")
                ldflags.append("-framework XCTest")

        is_extension = self._IsIosAppExtension() or self._IsIosWatchKitExtension()
        if sdk_root and is_extension:
            # Adds the link flags for extensions. These flags are common for all
            # extensions and provide loader and main function.
            # These flags reflect the compilation options used by xcode to compile
            # extensions.
            xcode_version, _ = XcodeVersion()
            if xcode_version < "0900":
                ldflags.append("-lpkstart")
                ldflags.append(
                    sdk_root
                    + "/System/Library/PrivateFrameworks/PlugInKit.framework/PlugInKit"
                )
            else:
                ldflags.append("-e _NSExtensionMain")
            ldflags.append("-fapplication-extension")

        self._Appendf(ldflags, "CLANG_CXX_LIBRARY", "-stdlib=%s")

        self.configname = None
        return ldflags

    def GetLibtoolflags(self, configname):
        """Returns flags that need to be passed to the static linker.

    Args:
        configname: The name of the configuration to get ld flags for.
    """
        self.configname = configname
        libtoolflags = []

        for libtoolflag in self._Settings().get("OTHER_LDFLAGS", []):
            libtoolflags.append(libtoolflag)
        # TODO(thakis): ARCHS?

        self.configname = None
        return libtoolflags

    def GetPerTargetSettings(self):
        """Gets a list of all the per-target settings. This will only fetch keys
    whose values are the same across all configurations."""
        first_pass = True
        result = {}
        for configname in sorted(self.xcode_settings.keys()):
            if first_pass:
                result = dict(self.xcode_settings[configname])
                first_pass = False
            else:
                for key, value in self.xcode_settings[configname].items():
                    if key not in result:
                        continue
                    elif result[key] != value:
                        del result[key]
        return result

    def GetPerConfigSetting(self, setting, configname, default=None):
        if configname in self.xcode_settings:
            return self.xcode_settings[configname].get(setting, default)
        else:
            return self.GetPerTargetSetting(setting, default)

    def GetPerTargetSetting(self, setting, default=None):
        """Tries to get xcode_settings.setting from spec. Assumes that the setting
       has the same value in all configurations and throws otherwise."""
        is_first_pass = True
        result = None
        for configname in sorted(self.xcode_settings.keys()):
            if is_first_pass:
                result = self.xcode_settings[configname].get(setting, None)
                is_first_pass = False
            else:
                assert result == self.xcode_settings[configname].get(setting, None), (
                    "Expected per-target setting for '%s', got per-config setting "
                    "(target %s)" % (setting, self.spec["target_name"])
                )
        if result is None:
            return default
        return result

    def _GetStripPostbuilds(self, configname, output_binary, quiet):
        """Returns a list of shell commands that contain the shell commands
    necessary to strip this target's binary. These should be run as postbuilds
    before the actual postbuilds run."""
        self.configname = configname

        result = []
        if self._Test("DEPLOYMENT_POSTPROCESSING", "YES", default="NO") and self._Test(
            "STRIP_INSTALLED_PRODUCT", "YES", default="NO"
        ):

            default_strip_style = "debugging"
            if (
                self.spec["type"] == "loadable_module" or self._IsIosAppExtension()
            ) and self._IsBundle():
                default_strip_style = "non-global"
            elif self.spec["type"] == "executable":
                default_strip_style = "all"

            strip_style = self._Settings().get("STRIP_STYLE", default_strip_style)
            strip_flags = {"all": "", "non-global": "-x", "debugging": "-S"}[
                strip_style
            ]

            explicit_strip_flags = self._Settings().get("STRIPFLAGS", "")
            if explicit_strip_flags:
                strip_flags += " " + _NormalizeEnvVarReferences(explicit_strip_flags)

            if not quiet:
                result.append("echo STRIP\\(%s\\)" % self.spec["target_name"])
            result.append(f"strip {strip_flags} {output_binary}")

        self.configname = None
        return result

    def _GetDebugInfoPostbuilds(self, configname, output, output_binary, quiet):
        """Returns a list of shell commands that contain the shell commands
    necessary to massage this target's debug information. These should be run
    as postbuilds before the actual postbuilds run."""
        self.configname = configname

        # For static libraries, no dSYMs are created.
        result = []
        if (
            self._Test("GCC_GENERATE_DEBUGGING_SYMBOLS", "YES", default="YES")
            and self._Test(
                "DEBUG_INFORMATION_FORMAT", "dwarf-with-dsym", default="dwarf"
            )
            and self.spec["type"] != "static_library"
        ):
            if not quiet:
                result.append("echo DSYMUTIL\\(%s\\)" % self.spec["target_name"])
            result.append("dsymutil {} -o {}".format(output_binary, output + ".dSYM"))

        self.configname = None
        return result

    def _GetTargetPostbuilds(self, configname, output, output_binary, quiet=False):
        """Returns a list of shell commands that contain the shell commands
    to run as postbuilds for this target, before the actual postbuilds."""
        # dSYMs need to build before stripping happens.
        return self._GetDebugInfoPostbuilds(
            configname, output, output_binary, quiet
        ) + self._GetStripPostbuilds(configname, output_binary, quiet)

    def _GetIOSPostbuilds(self, configname, output_binary):
        """Return a shell command to codesign the iOS output binary so it can
    be deployed to a device.  This should be run as the very last step of the
    build."""
        if not (
            self.isIOS
            and (self.spec["type"] == "executable" or self._IsXCTest())
            or self.IsIosFramework()
        ):
            return []

        postbuilds = []
        product_name = self.GetFullProductName()
        settings = self.xcode_settings[configname]

        # Xcode expects XCTests to be copied into the TEST_HOST dir.
        if self._IsXCTest():
            source = os.path.join("${BUILT_PRODUCTS_DIR}", product_name)
            test_host = os.path.dirname(settings.get("TEST_HOST"))
            xctest_destination = os.path.join(test_host, "PlugIns", product_name)
            postbuilds.extend([f"ditto {source} {xctest_destination}"])

        key = self._GetIOSCodeSignIdentityKey(settings)
        if not key:
            return postbuilds

        # Warn for any unimplemented signing xcode keys.
        unimpl = ["OTHER_CODE_SIGN_FLAGS"]
        unimpl = set(unimpl) & set(self.xcode_settings[configname].keys())
        if unimpl:
            print(
                "Warning: Some codesign keys not implemented, ignoring: %s"
                % ", ".join(sorted(unimpl))
            )

        if self._IsXCTest():
            # For device xctests, Xcode copies two extra frameworks into $TEST_HOST.
            test_host = os.path.dirname(settings.get("TEST_HOST"))
            frameworks_dir = os.path.join(test_host, "Frameworks")
            platform_root = self._XcodePlatformPath(configname)
            frameworks = [
                "Developer/Library/PrivateFrameworks/IDEBundleInjection.framework",
                "Developer/Library/Frameworks/XCTest.framework",
            ]
            for framework in frameworks:
                source = os.path.join(platform_root, framework)
                destination = os.path.join(frameworks_dir, os.path.basename(framework))
                postbuilds.extend([f"ditto {source} {destination}"])

                # Then re-sign everything with 'preserve=True'
                postbuilds.extend(
                    [
                        '%s code-sign-bundle "%s" "%s" "%s" "%s" %s'
                        % (
                            os.path.join("${TARGET_BUILD_DIR}", "gyp-mac-tool"),
                            key,
                            settings.get("CODE_SIGN_ENTITLEMENTS", ""),
                            settings.get("PROVISIONING_PROFILE", ""),
                            destination,
                            True,
                        )
                    ]
                )
            plugin_dir = os.path.join(test_host, "PlugIns")
            targets = [os.path.join(plugin_dir, product_name), test_host]
            for target in targets:
                postbuilds.extend(
                    [
                        '%s code-sign-bundle "%s" "%s" "%s" "%s" %s'
                        % (
                            os.path.join("${TARGET_BUILD_DIR}", "gyp-mac-tool"),
                            key,
                            settings.get("CODE_SIGN_ENTITLEMENTS", ""),
                            settings.get("PROVISIONING_PROFILE", ""),
                            target,
                            True,
                        )
                    ]
                )

        postbuilds.extend(
            [
                '%s code-sign-bundle "%s" "%s" "%s" "%s" %s'
                % (
                    os.path.join("${TARGET_BUILD_DIR}", "gyp-mac-tool"),
                    key,
                    settings.get("CODE_SIGN_ENTITLEMENTS", ""),
                    settings.get("PROVISIONING_PROFILE", ""),
                    os.path.join("${BUILT_PRODUCTS_DIR}", product_name),
                    False,
                )
            ]
        )
        return postbuilds

    def _GetIOSCodeSignIdentityKey(self, settings):
        identity = settings.get("CODE_SIGN_IDENTITY")
        if not identity:
            return None
        if identity not in XcodeSettings._codesigning_key_cache:
            output = subprocess.check_output(
                ["security", "find-identity", "-p", "codesigning", "-v"]
            )
            for line in output.splitlines():
                if identity in line:
                    fingerprint = line.split()[1]
                    cache = XcodeSettings._codesigning_key_cache
                    assert identity not in cache or fingerprint == cache[identity], (
                        "Multiple codesigning fingerprints for identity: %s" % identity
                    )
                    XcodeSettings._codesigning_key_cache[identity] = fingerprint
        return XcodeSettings._codesigning_key_cache.get(identity, "")

    def AddImplicitPostbuilds(
        self, configname, output, output_binary, postbuilds=[], quiet=False
    ):
        """Returns a list of shell commands that should run before and after
    |postbuilds|."""
        assert output_binary is not None
        pre = self._GetTargetPostbuilds(configname, output, output_binary, quiet)
        post = self._GetIOSPostbuilds(configname, output_binary)
        return pre + postbuilds + post

    def _AdjustLibrary(self, library, config_name=None):
        if library.endswith(".framework"):
            l_flag = "-framework " + os.path.splitext(os.path.basename(library))[0]
        else:
            m = self.library_re.match(library)
            if m:
                l_flag = "-l" + m.group(1)
            else:
                l_flag = library

        sdk_root = self._SdkPath(config_name)
        if not sdk_root:
            sdk_root = ""
        # Xcode 7 started shipping with ".tbd" (text based stubs) files instead of
        # ".dylib" without providing a real support for them. What it does, for
        # "/usr/lib" libraries, is do "-L/usr/lib -lname" which is dependent on the
        # library order and cause collision when building Chrome.
        #
        # Instead substitute ".tbd" to ".dylib" in the generated project when the
        # following conditions are both true:
        # - library is referenced in the gyp file as "$(SDKROOT)/**/*.dylib",
        # - the ".dylib" file does not exists but a ".tbd" file do.
        library = l_flag.replace("$(SDKROOT)", sdk_root)
        if l_flag.startswith("$(SDKROOT)"):
            basename, ext = os.path.splitext(library)
            if ext == ".dylib" and not os.path.exists(library):
                tbd_library = basename + ".tbd"
                if os.path.exists(tbd_library):
                    library = tbd_library
        return library

    def AdjustLibraries(self, libraries, config_name=None):
        """Transforms entries like 'Cocoa.framework' in libraries into entries like
    '-framework Cocoa', 'libcrypto.dylib' into '-lcrypto', etc.
    """
        libraries = [self._AdjustLibrary(library, config_name) for library in libraries]
        return libraries

    def _BuildMachineOSBuild(self):
        return GetStdout(["sw_vers", "-buildVersion"])

    def _XcodeIOSDeviceFamily(self, configname):
        family = self.xcode_settings[configname].get("TARGETED_DEVICE_FAMILY", "1")
        return [int(x) for x in family.split(",")]

    def GetExtraPlistItems(self, configname=None):
        """Returns a dictionary with extra items to insert into Info.plist."""
        if configname not in XcodeSettings._plist_cache:
            cache = {}
            cache["BuildMachineOSBuild"] = self._BuildMachineOSBuild()

            xcode_version, xcode_build = XcodeVersion()
            cache["DTXcode"] = xcode_version
            cache["DTXcodeBuild"] = xcode_build
            compiler = self.xcode_settings[configname].get("GCC_VERSION")
            if compiler is not None:
                cache["DTCompiler"] = compiler

            sdk_root = self._SdkRoot(configname)
            if not sdk_root:
                sdk_root = self._DefaultSdkRoot()
            sdk_version = self._GetSdkVersionInfoItem(sdk_root, "--show-sdk-version")
            cache["DTSDKName"] = sdk_root + (sdk_version or "")
            if xcode_version >= "0720":
                cache["DTSDKBuild"] = self._GetSdkVersionInfoItem(
                    sdk_root, "--show-sdk-build-version"
                )
            elif xcode_version >= "0430":
                cache["DTSDKBuild"] = sdk_version
            else:
                cache["DTSDKBuild"] = cache["BuildMachineOSBuild"]

            if self.isIOS:
                cache["MinimumOSVersion"] = self.xcode_settings[configname].get(
                    "IPHONEOS_DEPLOYMENT_TARGET"
                )
                cache["DTPlatformName"] = sdk_root
                cache["DTPlatformVersion"] = sdk_version

                if configname.endswith("iphoneos"):
                    cache["CFBundleSupportedPlatforms"] = ["iPhoneOS"]
                    cache["DTPlatformBuild"] = cache["DTSDKBuild"]
                else:
                    cache["CFBundleSupportedPlatforms"] = ["iPhoneSimulator"]
                    # This is weird, but Xcode sets DTPlatformBuild to an empty field
                    # for simulator builds.
                    cache["DTPlatformBuild"] = ""
            XcodeSettings._plist_cache[configname] = cache

        # Include extra plist items that are per-target, not per global
        # XcodeSettings.
        items = dict(XcodeSettings._plist_cache[configname])
        if self.isIOS:
            items["UIDeviceFamily"] = self._XcodeIOSDeviceFamily(configname)
        return items

    def _DefaultSdkRoot(self):
        """Returns the default SDKROOT to use.

    Prior to version 5.0.0, if SDKROOT was not explicitly set in the Xcode
    project, then the environment variable was empty. Starting with this
    version, Xcode uses the name of the newest SDK installed.
    """
        xcode_version, _ = XcodeVersion()
        if xcode_version < "0500":
            return ""
        default_sdk_path = self._XcodeSdkPath("")
        default_sdk_root = XcodeSettings._sdk_root_cache.get(default_sdk_path)
        if default_sdk_root:
            return default_sdk_root
        try:
            all_sdks = GetStdout(["xcodebuild", "-showsdks"])
        except GypError:
            # If xcodebuild fails, there will be no valid SDKs
            return ""
        for line in all_sdks.splitlines():
            items = line.split()
            if len(items) >= 3 and items[-2] == "-sdk":
                sdk_root = items[-1]
                sdk_path = self._XcodeSdkPath(sdk_root)
                if sdk_path == default_sdk_path:
                    return sdk_root
        return ""


class MacPrefixHeader:
    """A class that helps with emulating Xcode's GCC_PREFIX_HEADER feature.

  This feature consists of several pieces:
  * If GCC_PREFIX_HEADER is present, all compilations in that project get an
    additional |-include path_to_prefix_header| cflag.
  * If GCC_PRECOMPILE_PREFIX_HEADER is present too, then the prefix header is
    instead compiled, and all other compilations in the project get an
    additional |-include path_to_compiled_header| instead.
    + Compiled prefix headers have the extension gch. There is one gch file for
      every language used in the project (c, cc, m, mm), since gch files for
      different languages aren't compatible.
    + gch files themselves are built with the target's normal cflags, but they
      obviously don't get the |-include| flag. Instead, they need a -x flag that
      describes their language.
    + All o files in the target need to depend on the gch file, to make sure
      it's built before any o file is built.

  This class helps with some of these tasks, but it needs help from the build
  system for writing dependencies to the gch files, for writing build commands
  for the gch files, and for figuring out the location of the gch files.
  """

    def __init__(
        self, xcode_settings, gyp_path_to_build_path, gyp_path_to_build_output
    ):
        """If xcode_settings is None, all methods on this class are no-ops.

    Args:
        gyp_path_to_build_path: A function that takes a gyp-relative path,
            and returns a path relative to the build directory.
        gyp_path_to_build_output: A function that takes a gyp-relative path and
            a language code ('c', 'cc', 'm', or 'mm'), and that returns a path
            to where the output of precompiling that path for that language
            should be placed (without the trailing '.gch').
    """
        # This doesn't support per-configuration prefix headers. Good enough
        # for now.
        self.header = None
        self.compile_headers = False
        if xcode_settings:
            self.header = xcode_settings.GetPerTargetSetting("GCC_PREFIX_HEADER")
            self.compile_headers = (
                xcode_settings.GetPerTargetSetting(
                    "GCC_PRECOMPILE_PREFIX_HEADER", default="NO"
                )
                != "NO"
            )
        self.compiled_headers = {}
        if self.header:
            if self.compile_headers:
                for lang in ["c", "cc", "m", "mm"]:
                    self.compiled_headers[lang] = gyp_path_to_build_output(
                        self.header, lang
                    )
            self.header = gyp_path_to_build_path(self.header)

    def _CompiledHeader(self, lang, arch):
        assert self.compile_headers
        h = self.compiled_headers[lang]
        if arch:
            h += "." + arch
        return h

    def GetInclude(self, lang, arch=None):
        """Gets the cflags to include the prefix header for language |lang|."""
        if self.compile_headers and lang in self.compiled_headers:
            return "-include %s" % self._CompiledHeader(lang, arch)
        elif self.header:
            return "-include %s" % self.header
        else:
            return ""

    def _Gch(self, lang, arch):
        """Returns the actual file name of the prefix header for language |lang|."""
        assert self.compile_headers
        return self._CompiledHeader(lang, arch) + ".gch"

    def GetObjDependencies(self, sources, objs, arch=None):
        """Given a list of source files and the corresponding object files, returns
    a list of (source, object, gch) tuples, where |gch| is the build-directory
    relative path to the gch file each object file depends on.  |compilable[i]|
    has to be the source file belonging to |objs[i]|."""
        if not self.header or not self.compile_headers:
            return []

        result = []
        for source, obj in zip(sources, objs):
            ext = os.path.splitext(source)[1]
            lang = {
                ".c": "c",
                ".cpp": "cc",
                ".cc": "cc",
                ".cxx": "cc",
                ".m": "m",
                ".mm": "mm",
            }.get(ext, None)
            if lang:
                result.append((source, obj, self._Gch(lang, arch)))
        return result

    def GetPchBuildCommands(self, arch=None):
        """Returns [(path_to_gch, language_flag, language, header)].
    |path_to_gch| and |header| are relative to the build directory.
    """
        if not self.header or not self.compile_headers:
            return []
        return [
            (self._Gch("c", arch), "-x c-header", "c", self.header),
            (self._Gch("cc", arch), "-x c++-header", "cc", self.header),
            (self._Gch("m", arch), "-x objective-c-header", "m", self.header),
            (self._Gch("mm", arch), "-x objective-c++-header", "mm", self.header),
        ]


def XcodeVersion():
    """Returns a tuple of version and build version of installed Xcode."""
    # `xcodebuild -version` output looks like
    #    Xcode 4.6.3
    #    Build version 4H1503
    # or like
    #    Xcode 3.2.6
    #    Component versions: DevToolsCore-1809.0; DevToolsSupport-1806.0
    #    BuildVersion: 10M2518
    # Convert that to ('0463', '4H1503') or ('0326', '10M2518').
    global XCODE_VERSION_CACHE
    if XCODE_VERSION_CACHE:
        return XCODE_VERSION_CACHE
    version = ""
    build = ""
    try:
        version_list = GetStdoutQuiet(["xcodebuild", "-version"]).splitlines()
        # In some circumstances xcodebuild exits 0 but doesn't return
        # the right results; for example, a user on 10.7 or 10.8 with
        # a bogus path set via xcode-select
        # In that case this may be a CLT-only install so fall back to
        # checking that version.
        if len(version_list) < 2:
            raise GypError("xcodebuild returned unexpected results")
        version = version_list[0].split()[-1]  # Last word on first line
        build = version_list[-1].split()[-1]  # Last word on last line
    except GypError:  # Xcode not installed so look for XCode Command Line Tools
        version = CLTVersion()  # macOS Catalina returns 11.0.0.0.1.1567737322
        if not version:
            raise GypError("No Xcode or CLT version detected!")
    # Be careful to convert "4.2.3" to "0423" and "11.0.0" to "1100":
    version = version.split(".")[:3]  # Just major, minor, micro
    version[0] = version[0].zfill(2)  # Add a leading zero if major is one digit
    version = ("".join(version) + "00")[:4]  # Limit to exactly four characters
    XCODE_VERSION_CACHE = (version, build)
    return XCODE_VERSION_CACHE


# This function ported from the logic in Homebrew's CLT version check
def CLTVersion():
    """Returns the version of command-line tools from pkgutil."""
    # pkgutil output looks like
    #   package-id: com.apple.pkg.CLTools_Executables
    #   version: 5.0.1.0.1.1382131676
    #   volume: /
    #   location: /
    #   install-time: 1382544035
    #   groups: com.apple.FindSystemFiles.pkg-group
    #           com.apple.DevToolsBoth.pkg-group
    #           com.apple.DevToolsNonRelocatableShared.pkg-group
    STANDALONE_PKG_ID = "com.apple.pkg.DeveloperToolsCLILeo"
    FROM_XCODE_PKG_ID = "com.apple.pkg.DeveloperToolsCLI"
    MAVERICKS_PKG_ID = "com.apple.pkg.CLTools_Executables"

    regex = re.compile("version: (?P<version>.+)")
    for key in [MAVERICKS_PKG_ID, STANDALONE_PKG_ID, FROM_XCODE_PKG_ID]:
        try:
            output = GetStdout(["/usr/sbin/pkgutil", "--pkg-info", key])
            return re.search(regex, output).groupdict()["version"]
        except GypError:
            continue

    regex = re.compile(r'Command Line Tools for Xcode\s+(?P<version>\S+)')
    try:
        output = GetStdout(["/usr/sbin/softwareupdate", "--history"])
        return re.search(regex, output).groupdict()["version"]
    except GypError:
        return None


def GetStdoutQuiet(cmdlist):
    """Returns the content of standard output returned by invoking |cmdlist|.
  Ignores the stderr.
  Raises |GypError| if the command return with a non-zero return code."""
    job = subprocess.Popen(cmdlist, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out = job.communicate()[0].decode("utf-8")
    if job.returncode != 0:
        raise GypError("Error %d running %s" % (job.returncode, cmdlist[0]))
    return out.rstrip("\n")


def GetStdout(cmdlist):
    """Returns the content of standard output returned by invoking |cmdlist|.
  Raises |GypError| if the command return with a non-zero return code."""
    job = subprocess.Popen(cmdlist, stdout=subprocess.PIPE)
    out = job.communicate()[0].decode("utf-8")
    if job.returncode != 0:
        sys.stderr.write(out + "\n")
        raise GypError("Error %d running %s" % (job.returncode, cmdlist[0]))
    return out.rstrip("\n")


def MergeGlobalXcodeSettingsToSpec(global_dict, spec):
    """Merges the global xcode_settings dictionary into each configuration of the
  target represented by spec. For keys that are both in the global and the local
  xcode_settings dict, the local key gets precedence.
  """
    # The xcode generator special-cases global xcode_settings and does something
    # that amounts to merging in the global xcode_settings into each local
    # xcode_settings dict.
    global_xcode_settings = global_dict.get("xcode_settings", {})
    for config in spec["configurations"].values():
        if "xcode_settings" in config:
            new_settings = global_xcode_settings.copy()
            new_settings.update(config["xcode_settings"])
            config["xcode_settings"] = new_settings


def IsMacBundle(flavor, spec):
    """Returns if |spec| should be treated as a bundle.

  Bundles are directories with a certain subdirectory structure, instead of
  just a single file. Bundle rules do not produce a binary but also package
  resources into that directory."""
    is_mac_bundle = (
        int(spec.get("mac_xctest_bundle", 0)) != 0
        or int(spec.get("mac_xcuitest_bundle", 0)) != 0
        or (int(spec.get("mac_bundle", 0)) != 0 and flavor == "mac")
    )

    if is_mac_bundle:
        assert spec["type"] != "none", (
            'mac_bundle targets cannot have type none (target "%s")'
            % spec["target_name"]
        )
    return is_mac_bundle


def GetMacBundleResources(product_dir, xcode_settings, resources):
    """Yields (output, resource) pairs for every resource in |resources|.
  Only call this for mac bundle targets.

  Args:
      product_dir: Path to the directory containing the output bundle,
          relative to the build directory.
      xcode_settings: The XcodeSettings of the current target.
      resources: A list of bundle resources, relative to the build directory.
  """
    dest = os.path.join(product_dir, xcode_settings.GetBundleResourceFolder())
    for res in resources:
        output = dest

        # The make generator doesn't support it, so forbid it everywhere
        # to keep the generators more interchangeable.
        assert " " not in res, "Spaces in resource filenames not supported (%s)" % res

        # Split into (path,file).
        res_parts = os.path.split(res)

        # Now split the path into (prefix,maybe.lproj).
        lproj_parts = os.path.split(res_parts[0])
        # If the resource lives in a .lproj bundle, add that to the destination.
        if lproj_parts[1].endswith(".lproj"):
            output = os.path.join(output, lproj_parts[1])

        output = os.path.join(output, res_parts[1])
        # Compiled XIB files are referred to by .nib.
        if output.endswith(".xib"):
            output = os.path.splitext(output)[0] + ".nib"
        # Compiled storyboard files are referred to by .storyboardc.
        if output.endswith(".storyboard"):
            output = os.path.splitext(output)[0] + ".storyboardc"

        yield output, res


def GetMacInfoPlist(product_dir, xcode_settings, gyp_path_to_build_path):
    """Returns (info_plist, dest_plist, defines, extra_env), where:
  * |info_plist| is the source plist path, relative to the
    build directory,
  * |dest_plist| is the destination plist path, relative to the
    build directory,
  * |defines| is a list of preprocessor defines (empty if the plist
    shouldn't be preprocessed,
  * |extra_env| is a dict of env variables that should be exported when
    invoking |mac_tool copy-info-plist|.

  Only call this for mac bundle targets.

  Args:
      product_dir: Path to the directory containing the output bundle,
          relative to the build directory.
      xcode_settings: The XcodeSettings of the current target.
      gyp_to_build_path: A function that converts paths relative to the
          current gyp file to paths relative to the build directory.
  """
    info_plist = xcode_settings.GetPerTargetSetting("INFOPLIST_FILE")
    if not info_plist:
        return None, None, [], {}

    # The make generator doesn't support it, so forbid it everywhere
    # to keep the generators more interchangeable.
    assert " " not in info_plist, (
        "Spaces in Info.plist filenames not supported (%s)" % info_plist
    )

    info_plist = gyp_path_to_build_path(info_plist)

    # If explicitly set to preprocess the plist, invoke the C preprocessor and
    # specify any defines as -D flags.
    if (
        xcode_settings.GetPerTargetSetting("INFOPLIST_PREPROCESS", default="NO")
        == "YES"
    ):
        # Create an intermediate file based on the path.
        defines = shlex.split(
            xcode_settings.GetPerTargetSetting(
                "INFOPLIST_PREPROCESSOR_DEFINITIONS", default=""
            )
        )
    else:
        defines = []

    dest_plist = os.path.join(product_dir, xcode_settings.GetBundlePlistPath())
    extra_env = xcode_settings.GetPerTargetSettings()

    return info_plist, dest_plist, defines, extra_env


def _GetXcodeEnv(
    xcode_settings, built_products_dir, srcroot, configuration, additional_settings=None
):
    """Return the environment variables that Xcode would set. See
  http://developer.apple.com/library/mac/#documentation/DeveloperTools/Reference/XcodeBuildSettingRef/1-Build_Setting_Reference/build_setting_ref.html#//apple_ref/doc/uid/TP40003931-CH3-SW153
  for a full list.

  Args:
      xcode_settings: An XcodeSettings object. If this is None, this function
          returns an empty dict.
      built_products_dir: Absolute path to the built products dir.
      srcroot: Absolute path to the source root.
      configuration: The build configuration name.
      additional_settings: An optional dict with more values to add to the
          result.
  """

    if not xcode_settings:
        return {}

    # This function is considered a friend of XcodeSettings, so let it reach into
    # its implementation details.
    spec = xcode_settings.spec

    # These are filled in on an as-needed basis.
    env = {
        "BUILT_FRAMEWORKS_DIR": built_products_dir,
        "BUILT_PRODUCTS_DIR": built_products_dir,
        "CONFIGURATION": configuration,
        "PRODUCT_NAME": xcode_settings.GetProductName(),
        # For FULL_PRODUCT_NAME see:
        # /Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications/MacOSX\ Product\ Types.xcspec  # noqa: E501
        "SRCROOT": srcroot,
        "SOURCE_ROOT": "${SRCROOT}",
        # This is not true for static libraries, but currently the env is only
        # written for bundles:
        "TARGET_BUILD_DIR": built_products_dir,
        "TEMP_DIR": "${TMPDIR}",
        "XCODE_VERSION_ACTUAL": XcodeVersion()[0],
    }
    if xcode_settings.GetPerConfigSetting("SDKROOT", configuration):
        env["SDKROOT"] = xcode_settings._SdkPath(configuration)
    else:
        env["SDKROOT"] = ""

    if xcode_settings.mac_toolchain_dir:
        env["DEVELOPER_DIR"] = xcode_settings.mac_toolchain_dir

    if spec["type"] in (
        "executable",
        "static_library",
        "shared_library",
        "loadable_module",
    ):
        env["EXECUTABLE_NAME"] = xcode_settings.GetExecutableName()
        env["EXECUTABLE_PATH"] = xcode_settings.GetExecutablePath()
        env["FULL_PRODUCT_NAME"] = xcode_settings.GetFullProductName()
        mach_o_type = xcode_settings.GetMachOType()
        if mach_o_type:
            env["MACH_O_TYPE"] = mach_o_type
        env["PRODUCT_TYPE"] = xcode_settings.GetProductType()
    if xcode_settings._IsBundle():
        # xcodeproj_file.py sets the same Xcode subfolder value for this as for
        # FRAMEWORKS_FOLDER_PATH so Xcode builds will actually use FFP's value.
        env["BUILT_FRAMEWORKS_DIR"] = os.path.join(
            built_products_dir + os.sep + xcode_settings.GetBundleFrameworksFolderPath()
        )
        env["CONTENTS_FOLDER_PATH"] = xcode_settings.GetBundleContentsFolderPath()
        env["EXECUTABLE_FOLDER_PATH"] = xcode_settings.GetBundleExecutableFolderPath()
        env[
            "UNLOCALIZED_RESOURCES_FOLDER_PATH"
        ] = xcode_settings.GetBundleResourceFolder()
        env["JAVA_FOLDER_PATH"] = xcode_settings.GetBundleJavaFolderPath()
        env["FRAMEWORKS_FOLDER_PATH"] = xcode_settings.GetBundleFrameworksFolderPath()
        env[
            "SHARED_FRAMEWORKS_FOLDER_PATH"
        ] = xcode_settings.GetBundleSharedFrameworksFolderPath()
        env[
            "SHARED_SUPPORT_FOLDER_PATH"
        ] = xcode_settings.GetBundleSharedSupportFolderPath()
        env["PLUGINS_FOLDER_PATH"] = xcode_settings.GetBundlePlugInsFolderPath()
        env["XPCSERVICES_FOLDER_PATH"] = xcode_settings.GetBundleXPCServicesFolderPath()
        env["INFOPLIST_PATH"] = xcode_settings.GetBundlePlistPath()
        env["WRAPPER_NAME"] = xcode_settings.GetWrapperName()

    install_name = xcode_settings.GetInstallName()
    if install_name:
        env["LD_DYLIB_INSTALL_NAME"] = install_name
    install_name_base = xcode_settings.GetInstallNameBase()
    if install_name_base:
        env["DYLIB_INSTALL_NAME_BASE"] = install_name_base
    xcode_version, _ = XcodeVersion()
    if xcode_version >= "0500" and not env.get("SDKROOT"):
        sdk_root = xcode_settings._SdkRoot(configuration)
        if not sdk_root:
            sdk_root = xcode_settings._XcodeSdkPath("")
        if sdk_root is None:
            sdk_root = ""
        env["SDKROOT"] = sdk_root

    if not additional_settings:
        additional_settings = {}
    else:
        # Flatten lists to strings.
        for k in additional_settings:
            if not isinstance(additional_settings[k], str):
                additional_settings[k] = " ".join(additional_settings[k])
    additional_settings.update(env)

    for k in additional_settings:
        additional_settings[k] = _NormalizeEnvVarReferences(additional_settings[k])

    return additional_settings


def _NormalizeEnvVarReferences(str):
    """Takes a string containing variable references in the form ${FOO}, $(FOO),
  or $FOO, and returns a string with all variable references in the form ${FOO}.
  """
    # $FOO -> ${FOO}
    str = re.sub(r"\$([a-zA-Z_][a-zA-Z0-9_]*)", r"${\1}", str)

    # $(FOO) -> ${FOO}
    matches = re.findall(r"(\$\(([a-zA-Z0-9\-_]+)\))", str)
    for match in matches:
        to_replace, variable = match
        assert "$(" not in match, "$($(FOO)) variables not supported: " + match
        str = str.replace(to_replace, "${" + variable + "}")

    return str


def ExpandEnvVars(string, expansions):
    """Expands ${VARIABLES}, $(VARIABLES), and $VARIABLES in string per the
  expansions list. If the variable expands to something that references
  another variable, this variable is expanded as well if it's in env --
  until no variables present in env are left."""
    for k, v in reversed(expansions):
        string = string.replace("${" + k + "}", v)
        string = string.replace("$(" + k + ")", v)
        string = string.replace("$" + k, v)
    return string


def _TopologicallySortedEnvVarKeys(env):
    """Takes a dict |env| whose values are strings that can refer to other keys,
  for example env['foo'] = '$(bar) and $(baz)'. Returns a list L of all keys of
  env such that key2 is after key1 in L if env[key2] refers to env[key1].

  Throws an Exception in case of dependency cycles.
  """
    # Since environment variables can refer to other variables, the evaluation
    # order is important. Below is the logic to compute the dependency graph
    # and sort it.
    regex = re.compile(r"\$\{([a-zA-Z0-9\-_]+)\}")

    def GetEdges(node):
        # Use a definition of edges such that user_of_variable -> used_varible.
        # This happens to be easier in this case, since a variable's
        # definition contains all variables it references in a single string.
        # We can then reverse the result of the topological sort at the end.
        # Since: reverse(topsort(DAG)) = topsort(reverse_edges(DAG))
        matches = {v for v in regex.findall(env[node]) if v in env}
        for dependee in matches:
            assert "${" not in dependee, "Nested variables not supported: " + dependee
        return matches

    try:
        # Topologically sort, and then reverse, because we used an edge definition
        # that's inverted from the expected result of this function (see comment
        # above).
        order = gyp.common.TopologicallySorted(env.keys(), GetEdges)
        order.reverse()
        return order
    except gyp.common.CycleError as e:
        raise GypError(
            "Xcode environment variables are cyclically dependent: " + str(e.nodes)
        )


def GetSortedXcodeEnv(
    xcode_settings, built_products_dir, srcroot, configuration, additional_settings=None
):
    env = _GetXcodeEnv(
        xcode_settings, built_products_dir, srcroot, configuration, additional_settings
    )
    return [(key, env[key]) for key in _TopologicallySortedEnvVarKeys(env)]


def GetSpecPostbuildCommands(spec, quiet=False):
    """Returns the list of postbuilds explicitly defined on |spec|, in a form
  executable by a shell."""
    postbuilds = []
    for postbuild in spec.get("postbuilds", []):
        if not quiet:
            postbuilds.append(
                "echo POSTBUILD\\(%s\\) %s"
                % (spec["target_name"], postbuild["postbuild_name"])
            )
        postbuilds.append(gyp.common.EncodePOSIXShellList(postbuild["action"]))
    return postbuilds


def _HasIOSTarget(targets):
    """Returns true if any target contains the iOS specific key
  IPHONEOS_DEPLOYMENT_TARGET."""
    for target_dict in targets.values():
        for config in target_dict["configurations"].values():
            if config.get("xcode_settings", {}).get("IPHONEOS_DEPLOYMENT_TARGET"):
                return True
    return False


def _AddIOSDeviceConfigurations(targets):
    """Clone all targets and append -iphoneos to the name. Configure these targets
  to build for iOS devices and use correct architectures for those builds."""
    for target_dict in targets.values():
        toolset = target_dict["toolset"]
        configs = target_dict["configurations"]
        for config_name, simulator_config_dict in dict(configs).items():
            iphoneos_config_dict = copy.deepcopy(simulator_config_dict)
            configs[config_name + "-iphoneos"] = iphoneos_config_dict
            configs[config_name + "-iphonesimulator"] = simulator_config_dict
            if toolset == "target":
                simulator_config_dict["xcode_settings"]["SDKROOT"] = "iphonesimulator"
                iphoneos_config_dict["xcode_settings"]["SDKROOT"] = "iphoneos"
    return targets


def CloneConfigurationForDeviceAndEmulator(target_dicts):
    """If |target_dicts| contains any iOS targets, automatically create -iphoneos
  targets for iOS device builds."""
    if _HasIOSTarget(target_dicts):
        return _AddIOSDeviceConfigurations(target_dicts)
    return target_dicts
# Copyright (c) 2014 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Xcode-ninja wrapper project file generator.

This updates the data structures passed to the Xcode gyp generator to build
with ninja instead. The Xcode project itself is transformed into a list of
executable targets, each with a build step to build with ninja, and a target
with every source and resource file.  This appears to sidestep some of the
major performance headaches experienced using complex projects and large number
of targets within Xcode.
"""

import errno
import gyp.generator.ninja
import os
import re
import xml.sax.saxutils


def _WriteWorkspace(main_gyp, sources_gyp, params):
    """ Create a workspace to wrap main and sources gyp paths. """
    (build_file_root, build_file_ext) = os.path.splitext(main_gyp)
    workspace_path = build_file_root + ".xcworkspace"
    options = params["options"]
    if options.generator_output:
        workspace_path = os.path.join(options.generator_output, workspace_path)
    try:
        os.makedirs(workspace_path)
    except OSError as e:
        if e.errno != errno.EEXIST:
            raise
    output_string = (
        '<?xml version="1.0" encoding="UTF-8"?>\n' + '<Workspace version = "1.0">\n'
    )
    for gyp_name in [main_gyp, sources_gyp]:
        name = os.path.splitext(os.path.basename(gyp_name))[0] + ".xcodeproj"
        name = xml.sax.saxutils.quoteattr("group:" + name)
        output_string += "  <FileRef location = %s></FileRef>\n" % name
    output_string += "</Workspace>\n"

    workspace_file = os.path.join(workspace_path, "contents.xcworkspacedata")

    try:
        with open(workspace_file) as input_file:
            input_string = input_file.read()
            if input_string == output_string:
                return
    except OSError:
        # Ignore errors if the file doesn't exist.
        pass

    with open(workspace_file, "w") as output_file:
        output_file.write(output_string)


def _TargetFromSpec(old_spec, params):
    """ Create fake target for xcode-ninja wrapper. """
    # Determine ninja top level build dir (e.g. /path/to/out).
    ninja_toplevel = None
    jobs = 0
    if params:
        options = params["options"]
        ninja_toplevel = os.path.join(
            options.toplevel_dir, gyp.generator.ninja.ComputeOutputDir(params)
        )
        jobs = params.get("generator_flags", {}).get("xcode_ninja_jobs", 0)

    target_name = old_spec.get("target_name")
    product_name = old_spec.get("product_name", target_name)
    product_extension = old_spec.get("product_extension")

    ninja_target = {}
    ninja_target["target_name"] = target_name
    ninja_target["product_name"] = product_name
    if product_extension:
        ninja_target["product_extension"] = product_extension
    ninja_target["toolset"] = old_spec.get("toolset")
    ninja_target["default_configuration"] = old_spec.get("default_configuration")
    ninja_target["configurations"] = {}

    # Tell Xcode to look in |ninja_toplevel| for build products.
    new_xcode_settings = {}
    if ninja_toplevel:
        new_xcode_settings["CONFIGURATION_BUILD_DIR"] = (
            "%s/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)" % ninja_toplevel
        )

    if "configurations" in old_spec:
        for config in old_spec["configurations"]:
            old_xcode_settings = old_spec["configurations"][config].get(
                "xcode_settings", {}
            )
            if "IPHONEOS_DEPLOYMENT_TARGET" in old_xcode_settings:
                new_xcode_settings["CODE_SIGNING_REQUIRED"] = "NO"
                new_xcode_settings["IPHONEOS_DEPLOYMENT_TARGET"] = old_xcode_settings[
                    "IPHONEOS_DEPLOYMENT_TARGET"
                ]
            for key in ["BUNDLE_LOADER", "TEST_HOST"]:
                if key in old_xcode_settings:
                    new_xcode_settings[key] = old_xcode_settings[key]

            ninja_target["configurations"][config] = {}
            ninja_target["configurations"][config][
                "xcode_settings"
            ] = new_xcode_settings

    ninja_target["mac_bundle"] = old_spec.get("mac_bundle", 0)
    ninja_target["mac_xctest_bundle"] = old_spec.get("mac_xctest_bundle", 0)
    ninja_target["ios_app_extension"] = old_spec.get("ios_app_extension", 0)
    ninja_target["ios_watchkit_extension"] = old_spec.get("ios_watchkit_extension", 0)
    ninja_target["ios_watchkit_app"] = old_spec.get("ios_watchkit_app", 0)
    ninja_target["type"] = old_spec["type"]
    if ninja_toplevel:
        ninja_target["actions"] = [
            {
                "action_name": "Compile and copy %s via ninja" % target_name,
                "inputs": [],
                "outputs": [],
                "action": [
                    "env",
                    "PATH=%s" % os.environ["PATH"],
                    "ninja",
                    "-C",
                    new_xcode_settings["CONFIGURATION_BUILD_DIR"],
                    target_name,
                ],
                "message": "Compile and copy %s via ninja" % target_name,
            },
        ]
        if jobs > 0:
            ninja_target["actions"][0]["action"].extend(("-j", jobs))
    return ninja_target


def IsValidTargetForWrapper(target_extras, executable_target_pattern, spec):
    """Limit targets for Xcode wrapper.

  Xcode sometimes performs poorly with too many targets, so only include
  proper executable targets, with filters to customize.
  Arguments:
    target_extras: Regular expression to always add, matching any target.
    executable_target_pattern: Regular expression limiting executable targets.
    spec: Specifications for target.
  """
    target_name = spec.get("target_name")
    # Always include targets matching target_extras.
    if target_extras is not None and re.search(target_extras, target_name):
        return True

    # Otherwise just show executable targets and xc_tests.
    if int(spec.get("mac_xctest_bundle", 0)) != 0 or (
        spec.get("type", "") == "executable"
        and spec.get("product_extension", "") != "bundle"
    ):

        # If there is a filter and the target does not match, exclude the target.
        if executable_target_pattern is not None:
            if not re.search(executable_target_pattern, target_name):
                return False
        return True
    return False


def CreateWrapper(target_list, target_dicts, data, params):
    """Initialize targets for the ninja wrapper.

  This sets up the necessary variables in the targets to generate Xcode projects
  that use ninja as an external builder.
  Arguments:
    target_list: List of target pairs: 'base/base.gyp:base'.
    target_dicts: Dict of target properties keyed on target pair.
    data: Dict of flattened build files keyed on gyp path.
    params: Dict of global options for gyp.
  """
    orig_gyp = params["build_files"][0]
    for gyp_name, gyp_dict in data.items():
        if gyp_name == orig_gyp:
            depth = gyp_dict["_DEPTH"]

    # Check for custom main gyp name, otherwise use the default CHROMIUM_GYP_FILE
    # and prepend .ninja before the .gyp extension.
    generator_flags = params.get("generator_flags", {})
    main_gyp = generator_flags.get("xcode_ninja_main_gyp", None)
    if main_gyp is None:
        (build_file_root, build_file_ext) = os.path.splitext(orig_gyp)
        main_gyp = build_file_root + ".ninja" + build_file_ext

    # Create new |target_list|, |target_dicts| and |data| data structures.
    new_target_list = []
    new_target_dicts = {}
    new_data = {}

    # Set base keys needed for |data|.
    new_data[main_gyp] = {}
    new_data[main_gyp]["included_files"] = []
    new_data[main_gyp]["targets"] = []
    new_data[main_gyp]["xcode_settings"] = data[orig_gyp].get("xcode_settings", {})

    # Normally the xcode-ninja generator includes only valid executable targets.
    # If |xcode_ninja_executable_target_pattern| is set, that list is reduced to
    # executable targets that match the pattern. (Default all)
    executable_target_pattern = generator_flags.get(
        "xcode_ninja_executable_target_pattern", None
    )

    # For including other non-executable targets, add the matching target name
    # to the |xcode_ninja_target_pattern| regular expression. (Default none)
    target_extras = generator_flags.get("xcode_ninja_target_pattern", None)

    for old_qualified_target in target_list:
        spec = target_dicts[old_qualified_target]
        if IsValidTargetForWrapper(target_extras, executable_target_pattern, spec):
            # Add to new_target_list.
            target_name = spec.get("target_name")
            new_target_name = f"{main_gyp}:{target_name}#target"
            new_target_list.append(new_target_name)

            # Add to new_target_dicts.
            new_target_dicts[new_target_name] = _TargetFromSpec(spec, params)

            # Add to new_data.
            for old_target in data[old_qualified_target.split(":")[0]]["targets"]:
                if old_target["target_name"] == target_name:
                    new_data_target = {}
                    new_data_target["target_name"] = old_target["target_name"]
                    new_data_target["toolset"] = old_target["toolset"]
                    new_data[main_gyp]["targets"].append(new_data_target)

    # Create sources target.
    sources_target_name = "sources_for_indexing"
    sources_target = _TargetFromSpec(
        {
            "target_name": sources_target_name,
            "toolset": "target",
            "default_configuration": "Default",
            "mac_bundle": "0",
            "type": "executable",
        },
        None,
    )

    # Tell Xcode to look everywhere for headers.
    sources_target["configurations"] = {"Default": {"include_dirs": [depth]}}

    # Put excluded files into the sources target so they can be opened in Xcode.
    skip_excluded_files = not generator_flags.get(
        "xcode_ninja_list_excluded_files", True
    )

    sources = []
    for target, target_dict in target_dicts.items():
        base = os.path.dirname(target)
        files = target_dict.get("sources", []) + target_dict.get(
            "mac_bundle_resources", []
        )

        if not skip_excluded_files:
            files.extend(
                target_dict.get("sources_excluded", [])
                + target_dict.get("mac_bundle_resources_excluded", [])
            )

        for action in target_dict.get("actions", []):
            files.extend(action.get("inputs", []))

            if not skip_excluded_files:
                files.extend(action.get("inputs_excluded", []))

        # Remove files starting with $. These are mostly intermediate files for the
        # build system.
        files = [file for file in files if not file.startswith("$")]

        # Make sources relative to root build file.
        relative_path = os.path.dirname(main_gyp)
        sources += [
            os.path.relpath(os.path.join(base, file), relative_path) for file in files
        ]

    sources_target["sources"] = sorted(set(sources))

    # Put sources_to_index in it's own gyp.
    sources_gyp = os.path.join(os.path.dirname(main_gyp), sources_target_name + ".gyp")
    fully_qualified_target_name = f"{sources_gyp}:{sources_target_name}#target"

    # Add to new_target_list, new_target_dicts and new_data.
    new_target_list.append(fully_qualified_target_name)
    new_target_dicts[fully_qualified_target_name] = sources_target
    new_data_target = {}
    new_data_target["target_name"] = sources_target["target_name"]
    new_data_target["_DEPTH"] = depth
    new_data_target["toolset"] = "target"
    new_data[sources_gyp] = {}
    new_data[sources_gyp]["targets"] = []
    new_data[sources_gyp]["included_files"] = []
    new_data[sources_gyp]["xcode_settings"] = data[orig_gyp].get("xcode_settings", {})
    new_data[sources_gyp]["targets"].append(new_data_target)

    # Write workspace to file.
    _WriteWorkspace(main_gyp, sources_gyp, params)
    return (new_target_list, new_target_dicts, new_data)
# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Xcode project file generator.

This module is both an Xcode project file generator and a documentation of the
Xcode project file format.  Knowledge of the project file format was gained
based on extensive experience with Xcode, and by making changes to projects in
Xcode.app and observing the resultant changes in the associated project files.

XCODE PROJECT FILES

The generator targets the file format as written by Xcode 3.2 (specifically,
3.2.6), but past experience has taught that the format has not changed
significantly in the past several years, and future versions of Xcode are able
to read older project files.

Xcode project files are "bundled": the project "file" from an end-user's
perspective is actually a directory with an ".xcodeproj" extension.  The
project file from this module's perspective is actually a file inside this
directory, always named "project.pbxproj".  This file contains a complete
description of the project and is all that is needed to use the xcodeproj.
Other files contained in the xcodeproj directory are simply used to store
per-user settings, such as the state of various UI elements in the Xcode
application.

The project.pbxproj file is a property list, stored in a format almost
identical to the NeXTstep property list format.  The file is able to carry
Unicode data, and is encoded in UTF-8.  The root element in the property list
is a dictionary that contains several properties of minimal interest, and two
properties of immense interest.  The most important property is a dictionary
named "objects".  The entire structure of the project is represented by the
children of this property.  The objects dictionary is keyed by unique 96-bit
values represented by 24 uppercase hexadecimal characters.  Each value in the
objects dictionary is itself a dictionary, describing an individual object.

Each object in the dictionary is a member of a class, which is identified by
the "isa" property of each object.  A variety of classes are represented in a
project file.  Objects can refer to other objects by ID, using the 24-character
hexadecimal object key.  A project's objects form a tree, with a root object
of class PBXProject at the root.  As an example, the PBXProject object serves
as parent to an XCConfigurationList object defining the build configurations
used in the project, a PBXGroup object serving as a container for all files
referenced in the project, and a list of target objects, each of which defines
a target in the project.  There are several different types of target object,
such as PBXNativeTarget and PBXAggregateTarget.  In this module, this
relationship is expressed by having each target type derive from an abstract
base named XCTarget.

The project.pbxproj file's root dictionary also contains a property, sibling to
the "objects" dictionary, named "rootObject".  The value of rootObject is a
24-character object key referring to the root PBXProject object in the
objects dictionary.

In Xcode, every file used as input to a target or produced as a final product
of a target must appear somewhere in the hierarchy rooted at the PBXGroup
object referenced by the PBXProject's mainGroup property.  A PBXGroup is
generally represented as a folder in the Xcode application.  PBXGroups can
contain other PBXGroups as well as PBXFileReferences, which are pointers to
actual files.

Each XCTarget contains a list of build phases, represented in this module by
the abstract base XCBuildPhase.  Examples of concrete XCBuildPhase derivations
are PBXSourcesBuildPhase and PBXFrameworksBuildPhase, which correspond to the
"Compile Sources" and "Link Binary With Libraries" phases displayed in the
Xcode application.  Files used as input to these phases (for example, source
files in the former case and libraries and frameworks in the latter) are
represented by PBXBuildFile objects, referenced by elements of "files" lists
in XCTarget objects.  Each PBXBuildFile object refers to a PBXBuildFile
object as a "weak" reference: it does not "own" the PBXBuildFile, which is
owned by the root object's mainGroup or a descendant group.  In most cases, the
layer of indirection between an XCBuildPhase and a PBXFileReference via a
PBXBuildFile appears extraneous, but there's actually one reason for this:
file-specific compiler flags are added to the PBXBuildFile object so as to
allow a single file to be a member of multiple targets while having distinct
compiler flags for each.  These flags can be modified in the Xcode applciation
in the "Build" tab of a File Info window.

When a project is open in the Xcode application, Xcode will rewrite it.  As
such, this module is careful to adhere to the formatting used by Xcode, to
avoid insignificant changes appearing in the file when it is used in the
Xcode application.  This will keep version control repositories happy, and
makes it possible to compare a project file used in Xcode to one generated by
this module to determine if any significant changes were made in the
application.

Xcode has its own way of assigning 24-character identifiers to each object,
which is not duplicated here.  Because the identifier only is only generated
once, when an object is created, and is then left unchanged, there is no need
to attempt to duplicate Xcode's behavior in this area.  The generator is free
to select any identifier, even at random, to refer to the objects it creates,
and Xcode will retain those identifiers and use them when subsequently
rewriting the project file.  However, the generator would choose new random
identifiers each time the project files are generated, leading to difficulties
comparing "used" project files to "pristine" ones produced by this module,
and causing the appearance of changes as every object identifier is changed
when updated projects are checked in to a version control repository.  To
mitigate this problem, this module chooses identifiers in a more deterministic
way, by hashing a description of each object as well as its parent and ancestor
objects.  This strategy should result in minimal "shift" in IDs as successive
generations of project files are produced.

THIS MODULE

This module introduces several classes, all derived from the XCObject class.
Nearly all of the "brains" are built into the XCObject class, which understands
how to create and modify objects, maintain the proper tree structure, compute
identifiers, and print objects.  For the most part, classes derived from
XCObject need only provide a _schema class object, a dictionary that
expresses what properties objects of the class may contain.

Given this structure, it's possible to build a minimal project file by creating
objects of the appropriate types and making the proper connections:

  config_list = XCConfigurationList()
  group = PBXGroup()
  project = PBXProject({'buildConfigurationList': config_list,
                        'mainGroup': group})

With the project object set up, it can be added to an XCProjectFile object.
XCProjectFile is a pseudo-class in the sense that it is a concrete XCObject
subclass that does not actually correspond to a class type found in a project
file.  Rather, it is used to represent the project file's root dictionary.
Printing an XCProjectFile will print the entire project file, including the
full "objects" dictionary.

  project_file = XCProjectFile({'rootObject': project})
  project_file.ComputeIDs()
  project_file.Print()

Xcode project files are always encoded in UTF-8.  This module will accept
strings of either the str class or the unicode class.  Strings of class str
are assumed to already be encoded in UTF-8.  Obviously, if you're just using
ASCII, you won't encounter difficulties because ASCII is a UTF-8 subset.
Strings of class unicode are handled properly and encoded in UTF-8 when
a project file is output.
"""

import gyp.common
from functools import cmp_to_key
import hashlib
from operator import attrgetter
import posixpath
import re
import struct
import sys


def cmp(x, y):
    return (x > y) - (x < y)


# See XCObject._EncodeString.  This pattern is used to determine when a string
# can be printed unquoted.  Strings that match this pattern may be printed
# unquoted.  Strings that do not match must be quoted and may be further
# transformed to be properly encoded.  Note that this expression matches the
# characters listed with "+", for 1 or more occurrences: if a string is empty,
# it must not match this pattern, because it needs to be encoded as "".
_unquoted = re.compile("^[A-Za-z0-9$./_]+$")

# Strings that match this pattern are quoted regardless of what _unquoted says.
# Oddly, Xcode will quote any string with a run of three or more underscores.
_quoted = re.compile("___")

# This pattern should match any character that needs to be escaped by
# XCObject._EncodeString.  See that function.
_escaped = re.compile('[\\\\"]|[\x00-\x1f]')


# Used by SourceTreeAndPathFromPath
_path_leading_variable = re.compile(r"^\$\((.*?)\)(/(.*))?$")


def SourceTreeAndPathFromPath(input_path):
    """Given input_path, returns a tuple with sourceTree and path values.

  Examples:
    input_path     (source_tree, output_path)
    '$(VAR)/path'  ('VAR', 'path')
    '$(VAR)'       ('VAR', None)
    'path'         (None, 'path')
  """

    source_group_match = _path_leading_variable.match(input_path)
    if source_group_match:
        source_tree = source_group_match.group(1)
        output_path = source_group_match.group(3)  # This may be None.
    else:
        source_tree = None
        output_path = input_path

    return (source_tree, output_path)


def ConvertVariablesToShellSyntax(input_string):
    return re.sub(r"\$\((.*?)\)", "${\\1}", input_string)


class XCObject:
    """The abstract base of all class types used in Xcode project files.

  Class variables:
    _schema: A dictionary defining the properties of this class.  The keys to
             _schema are string property keys as used in project files.  Values
             are a list of four or five elements:
             [ is_list, property_type, is_strong, is_required, default ]
             is_list: True if the property described is a list, as opposed
                      to a single element.
             property_type: The type to use as the value of the property,
                            or if is_list is True, the type to use for each
                            element of the value's list.  property_type must
                            be an XCObject subclass, or one of the built-in
                            types str, int, or dict.
             is_strong: If property_type is an XCObject subclass, is_strong
                        is True to assert that this class "owns," or serves
                        as parent, to the property value (or, if is_list is
                        True, values).  is_strong must be False if
                        property_type is not an XCObject subclass.
             is_required: True if the property is required for the class.
                          Note that is_required being True does not preclude
                          an empty string ("", in the case of property_type
                          str) or list ([], in the case of is_list True) from
                          being set for the property.
             default: Optional.  If is_required is True, default may be set
                      to provide a default value for objects that do not supply
                      their own value.  If is_required is True and default
                      is not provided, users of the class must supply their own
                      value for the property.
             Note that although the values of the array are expressed in
             boolean terms, subclasses provide values as integers to conserve
             horizontal space.
    _should_print_single_line: False in XCObject.  Subclasses whose objects
                               should be written to the project file in the
                               alternate single-line format, such as
                               PBXFileReference and PBXBuildFile, should
                               set this to True.
    _encode_transforms: Used by _EncodeString to encode unprintable characters.
                        The index into this list is the ordinal of the
                        character to transform; each value is a string
                        used to represent the character in the output.  XCObject
                        provides an _encode_transforms list suitable for most
                        XCObject subclasses.
    _alternate_encode_transforms: Provided for subclasses that wish to use
                                  the alternate encoding rules.  Xcode seems
                                  to use these rules when printing objects in
                                  single-line format.  Subclasses that desire
                                  this behavior should set _encode_transforms
                                  to _alternate_encode_transforms.
    _hashables: A list of XCObject subclasses that can be hashed by ComputeIDs
                to construct this object's ID.  Most classes that need custom
                hashing behavior should do it by overriding Hashables,
                but in some cases an object's parent may wish to push a
                hashable value into its child, and it can do so by appending
                to _hashables.
  Attributes:
    id: The object's identifier, a 24-character uppercase hexadecimal string.
        Usually, objects being created should not set id until the entire
        project file structure is built.  At that point, UpdateIDs() should
        be called on the root object to assign deterministic values for id to
        each object in the tree.
    parent: The object's parent.  This is set by a parent XCObject when a child
            object is added to it.
    _properties: The object's property dictionary.  An object's properties are
                 described by its class' _schema variable.
  """

    _schema = {}
    _should_print_single_line = False

    # See _EncodeString.
    _encode_transforms = []
    i = 0
    while i < ord(" "):
        _encode_transforms.append("\\U%04x" % i)
        i = i + 1
    _encode_transforms[7] = "\\a"
    _encode_transforms[8] = "\\b"
    _encode_transforms[9] = "\\t"
    _encode_transforms[10] = "\\n"
    _encode_transforms[11] = "\\v"
    _encode_transforms[12] = "\\f"
    _encode_transforms[13] = "\\n"

    _alternate_encode_transforms = list(_encode_transforms)
    _alternate_encode_transforms[9] = chr(9)
    _alternate_encode_transforms[10] = chr(10)
    _alternate_encode_transforms[11] = chr(11)

    def __init__(self, properties=None, id=None, parent=None):
        self.id = id
        self.parent = parent
        self._properties = {}
        self._hashables = []
        self._SetDefaultsFromSchema()
        self.UpdateProperties(properties)

    def __repr__(self):
        try:
            name = self.Name()
        except NotImplementedError:
            return f"<{self.__class__.__name__} at 0x{id(self):x}>"
        return f"<{self.__class__.__name__} {name!r} at 0x{id(self):x}>"

    def Copy(self):
        """Make a copy of this object.

    The new object will have its own copy of lists and dicts.  Any XCObject
    objects owned by this object (marked "strong") will be copied in the
    new object, even those found in lists.  If this object has any weak
    references to other XCObjects, the same references are added to the new
    object without making a copy.
    """

        that = self.__class__(id=self.id, parent=self.parent)
        for key, value in self._properties.items():
            is_strong = self._schema[key][2]

            if isinstance(value, XCObject):
                if is_strong:
                    new_value = value.Copy()
                    new_value.parent = that
                    that._properties[key] = new_value
                else:
                    that._properties[key] = value
            elif isinstance(value, (str, int)):
                that._properties[key] = value
            elif isinstance(value, list):
                if is_strong:
                    # If is_strong is True, each element is an XCObject, so it's safe to
                    # call Copy.
                    that._properties[key] = []
                    for item in value:
                        new_item = item.Copy()
                        new_item.parent = that
                        that._properties[key].append(new_item)
                else:
                    that._properties[key] = value[:]
            elif isinstance(value, dict):
                # dicts are never strong.
                if is_strong:
                    raise TypeError(
                        "Strong dict for key " + key + " in " + self.__class__.__name__
                    )
                else:
                    that._properties[key] = value.copy()
            else:
                raise TypeError(
                    "Unexpected type "
                    + value.__class__.__name__
                    + " for key "
                    + key
                    + " in "
                    + self.__class__.__name__
                )

        return that

    def Name(self):
        """Return the name corresponding to an object.

    Not all objects necessarily need to be nameable, and not all that do have
    a "name" property.  Override as needed.
    """

        # If the schema indicates that "name" is required, try to access the
        # property even if it doesn't exist.  This will result in a KeyError
        # being raised for the property that should be present, which seems more
        # appropriate than NotImplementedError in this case.
        if "name" in self._properties or (
            "name" in self._schema and self._schema["name"][3]
        ):
            return self._properties["name"]

        raise NotImplementedError(self.__class__.__name__ + " must implement Name")

    def Comment(self):
        """Return a comment string for the object.

    Most objects just use their name as the comment, but PBXProject uses
    different values.

    The returned comment is not escaped and does not have any comment marker
    strings applied to it.
    """

        return self.Name()

    def Hashables(self):
        hashables = [self.__class__.__name__]

        name = self.Name()
        if name is not None:
            hashables.append(name)

        hashables.extend(self._hashables)

        return hashables

    def HashablesForChild(self):
        return None

    def ComputeIDs(self, recursive=True, overwrite=True, seed_hash=None):
        """Set "id" properties deterministically.

    An object's "id" property is set based on a hash of its class type and
    name, as well as the class type and name of all ancestor objects.  As
    such, it is only advisable to call ComputeIDs once an entire project file
    tree is built.

    If recursive is True, recurse into all descendant objects and update their
    hashes.

    If overwrite is True, any existing value set in the "id" property will be
    replaced.
    """

        def _HashUpdate(hash, data):
            """Update hash with data's length and contents.

      If the hash were updated only with the value of data, it would be
      possible for clowns to induce collisions by manipulating the names of
      their objects.  By adding the length, it's exceedingly less likely that
      ID collisions will be encountered, intentionally or not.
      """

            hash.update(struct.pack(">i", len(data)))
            if isinstance(data, str):
                data = data.encode("utf-8")
            hash.update(data)

        if seed_hash is None:
            seed_hash = hashlib.sha1()

        hash = seed_hash.copy()

        hashables = self.Hashables()
        assert len(hashables) > 0
        for hashable in hashables:
            _HashUpdate(hash, hashable)

        if recursive:
            hashables_for_child = self.HashablesForChild()
            if hashables_for_child is None:
                child_hash = hash
            else:
                assert len(hashables_for_child) > 0
                child_hash = seed_hash.copy()
                for hashable in hashables_for_child:
                    _HashUpdate(child_hash, hashable)

            for child in self.Children():
                child.ComputeIDs(recursive, overwrite, child_hash)

        if overwrite or self.id is None:
            # Xcode IDs are only 96 bits (24 hex characters), but a SHA-1 digest is
            # is 160 bits.  Instead of throwing out 64 bits of the digest, xor them
            # into the portion that gets used.
            assert hash.digest_size % 4 == 0
            digest_int_count = hash.digest_size // 4
            digest_ints = struct.unpack(">" + "I" * digest_int_count, hash.digest())
            id_ints = [0, 0, 0]
            for index in range(0, digest_int_count):
                id_ints[index % 3] ^= digest_ints[index]
            self.id = "%08X%08X%08X" % tuple(id_ints)

    def EnsureNoIDCollisions(self):
        """Verifies that no two objects have the same ID.  Checks all descendants.
    """

        ids = {}
        descendants = self.Descendants()
        for descendant in descendants:
            if descendant.id in ids:
                other = ids[descendant.id]
                raise KeyError(
                    'Duplicate ID %s, objects "%s" and "%s" in "%s"'
                    % (
                        descendant.id,
                        str(descendant._properties),
                        str(other._properties),
                        self._properties["rootObject"].Name(),
                    )
                )
            ids[descendant.id] = descendant

    def Children(self):
        """Returns a list of all of this object's owned (strong) children."""

        children = []
        for property, attributes in self._schema.items():
            (is_list, property_type, is_strong) = attributes[0:3]
            if is_strong and property in self._properties:
                if not is_list:
                    children.append(self._properties[property])
                else:
                    children.extend(self._properties[property])
        return children

    def Descendants(self):
        """Returns a list of all of this object's descendants, including this
    object.
    """

        children = self.Children()
        descendants = [self]
        for child in children:
            descendants.extend(child.Descendants())
        return descendants

    def PBXProjectAncestor(self):
        # The base case for recursion is defined at PBXProject.PBXProjectAncestor.
        if self.parent:
            return self.parent.PBXProjectAncestor()
        return None

    def _EncodeComment(self, comment):
        """Encodes a comment to be placed in the project file output, mimicking
    Xcode behavior.
    """

        # This mimics Xcode behavior by wrapping the comment in "/*" and "*/".  If
        # the string already contains a "*/", it is turned into "(*)/".  This keeps
        # the file writer from outputting something that would be treated as the
        # end of a comment in the middle of something intended to be entirely a
        # comment.

        return "/* " + comment.replace("*/", "(*)/") + " */"

    def _EncodeTransform(self, match):
        # This function works closely with _EncodeString.  It will only be called
        # by re.sub with match.group(0) containing a character matched by the
        # the _escaped expression.
        char = match.group(0)

        # Backslashes (\) and quotation marks (") are always replaced with a
        # backslash-escaped version of the same.  Everything else gets its
        # replacement from the class' _encode_transforms array.
        if char == "\\":
            return "\\\\"
        if char == '"':
            return '\\"'
        return self._encode_transforms[ord(char)]

    def _EncodeString(self, value):
        """Encodes a string to be placed in the project file output, mimicking
    Xcode behavior.
    """

        # Use quotation marks when any character outside of the range A-Z, a-z, 0-9,
        # $ (dollar sign), . (period), and _ (underscore) is present.  Also use
        # quotation marks to represent empty strings.
        #
        # Escape " (double-quote) and \ (backslash) by preceding them with a
        # backslash.
        #
        # Some characters below the printable ASCII range are encoded specially:
        #     7 ^G BEL is encoded as "\a"
        #     8 ^H BS  is encoded as "\b"
        #    11 ^K VT  is encoded as "\v"
        #    12 ^L NP  is encoded as "\f"
        #   127 ^? DEL is passed through as-is without escaping
        #  - In PBXFileReference and PBXBuildFile objects:
        #     9 ^I HT  is passed through as-is without escaping
        #    10 ^J NL  is passed through as-is without escaping
        #    13 ^M CR  is passed through as-is without escaping
        #  - In other objects:
        #     9 ^I HT  is encoded as "\t"
        #    10 ^J NL  is encoded as "\n"
        #    13 ^M CR  is encoded as "\n" rendering it indistinguishable from
        #              10 ^J NL
        # All other characters within the ASCII control character range (0 through
        # 31 inclusive) are encoded as "\U001f" referring to the Unicode code point
        # in hexadecimal.  For example, character 14 (^N SO) is encoded as "\U000e".
        # Characters above the ASCII range are passed through to the output encoded
        # as UTF-8 without any escaping.  These mappings are contained in the
        # class' _encode_transforms list.

        if _unquoted.search(value) and not _quoted.search(value):
            return value

        return '"' + _escaped.sub(self._EncodeTransform, value) + '"'

    def _XCPrint(self, file, tabs, line):
        file.write("\t" * tabs + line)

    def _XCPrintableValue(self, tabs, value, flatten_list=False):
        """Returns a representation of value that may be printed in a project file,
    mimicking Xcode's behavior.

    _XCPrintableValue can handle str and int values, XCObjects (which are
    made printable by returning their id property), and list and dict objects
    composed of any of the above types.  When printing a list or dict, and
    _should_print_single_line is False, the tabs parameter is used to determine
    how much to indent the lines corresponding to the items in the list or
    dict.

    If flatten_list is True, single-element lists will be transformed into
    strings.
    """

        printable = ""
        comment = None

        if self._should_print_single_line:
            sep = " "
            element_tabs = ""
            end_tabs = ""
        else:
            sep = "\n"
            element_tabs = "\t" * (tabs + 1)
            end_tabs = "\t" * tabs

        if isinstance(value, XCObject):
            printable += value.id
            comment = value.Comment()
        elif isinstance(value, str):
            printable += self._EncodeString(value)
        elif isinstance(value, str):
            printable += self._EncodeString(value.encode("utf-8"))
        elif isinstance(value, int):
            printable += str(value)
        elif isinstance(value, list):
            if flatten_list and len(value) <= 1:
                if len(value) == 0:
                    printable += self._EncodeString("")
                else:
                    printable += self._EncodeString(value[0])
            else:
                printable = "(" + sep
                for item in value:
                    printable += (
                        element_tabs
                        + self._XCPrintableValue(tabs + 1, item, flatten_list)
                        + ","
                        + sep
                    )
                printable += end_tabs + ")"
        elif isinstance(value, dict):
            printable = "{" + sep
            for item_key, item_value in sorted(value.items()):
                printable += (
                    element_tabs
                    + self._XCPrintableValue(tabs + 1, item_key, flatten_list)
                    + " = "
                    + self._XCPrintableValue(tabs + 1, item_value, flatten_list)
                    + ";"
                    + sep
                )
            printable += end_tabs + "}"
        else:
            raise TypeError("Can't make " + value.__class__.__name__ + " printable")

        if comment:
            printable += " " + self._EncodeComment(comment)

        return printable

    def _XCKVPrint(self, file, tabs, key, value):
        """Prints a key and value, members of an XCObject's _properties dictionary,
    to file.

    tabs is an int identifying the indentation level.  If the class'
    _should_print_single_line variable is True, tabs is ignored and the
    key-value pair will be followed by a space insead of a newline.
    """

        if self._should_print_single_line:
            printable = ""
            after_kv = " "
        else:
            printable = "\t" * tabs
            after_kv = "\n"

        # Xcode usually prints remoteGlobalIDString values in PBXContainerItemProxy
        # objects without comments.  Sometimes it prints them with comments, but
        # the majority of the time, it doesn't.  To avoid unnecessary changes to
        # the project file after Xcode opens it, don't write comments for
        # remoteGlobalIDString.  This is a sucky hack and it would certainly be
        # cleaner to extend the schema to indicate whether or not a comment should
        # be printed, but since this is the only case where the problem occurs and
        # Xcode itself can't seem to make up its mind, the hack will suffice.
        #
        # Also see PBXContainerItemProxy._schema['remoteGlobalIDString'].
        if key == "remoteGlobalIDString" and isinstance(self, PBXContainerItemProxy):
            value_to_print = value.id
        else:
            value_to_print = value

        # PBXBuildFile's settings property is represented in the output as a dict,
        # but a hack here has it represented as a string. Arrange to strip off the
        # quotes so that it shows up in the output as expected.
        if key == "settings" and isinstance(self, PBXBuildFile):
            strip_value_quotes = True
        else:
            strip_value_quotes = False

        # In another one-off, let's set flatten_list on buildSettings properties
        # of XCBuildConfiguration objects, because that's how Xcode treats them.
        if key == "buildSettings" and isinstance(self, XCBuildConfiguration):
            flatten_list = True
        else:
            flatten_list = False

        try:
            printable_key = self._XCPrintableValue(tabs, key, flatten_list)
            printable_value = self._XCPrintableValue(tabs, value_to_print, flatten_list)
            if (
                strip_value_quotes
                and len(printable_value) > 1
                and printable_value[0] == '"'
                and printable_value[-1] == '"'
            ):
                printable_value = printable_value[1:-1]
            printable += printable_key + " = " + printable_value + ";" + after_kv
        except TypeError as e:
            gyp.common.ExceptionAppend(e, 'while printing key "%s"' % key)
            raise

        self._XCPrint(file, 0, printable)

    def Print(self, file=sys.stdout):
        """Prints a reprentation of this object to file, adhering to Xcode output
    formatting.
    """

        self.VerifyHasRequiredProperties()

        if self._should_print_single_line:
            # When printing an object in a single line, Xcode doesn't put any space
            # between the beginning of a dictionary (or presumably a list) and the
            # first contained item, so you wind up with snippets like
            #   ...CDEF = {isa = PBXFileReference; fileRef = 0123...
            # If it were me, I would have put a space in there after the opening
            # curly, but I guess this is just another one of those inconsistencies
            # between how Xcode prints PBXFileReference and PBXBuildFile objects as
            # compared to other objects.  Mimic Xcode's behavior here by using an
            # empty string for sep.
            sep = ""
            end_tabs = 0
        else:
            sep = "\n"
            end_tabs = 2

        # Start the object.  For example, '\t\tPBXProject = {\n'.
        self._XCPrint(file, 2, self._XCPrintableValue(2, self) + " = {" + sep)

        # "isa" isn't in the _properties dictionary, it's an intrinsic property
        # of the class which the object belongs to.  Xcode always outputs "isa"
        # as the first element of an object dictionary.
        self._XCKVPrint(file, 3, "isa", self.__class__.__name__)

        # The remaining elements of an object dictionary are sorted alphabetically.
        for property, value in sorted(self._properties.items()):
            self._XCKVPrint(file, 3, property, value)

        # End the object.
        self._XCPrint(file, end_tabs, "};\n")

    def UpdateProperties(self, properties, do_copy=False):
        """Merge the supplied properties into the _properties dictionary.

    The input properties must adhere to the class schema or a KeyError or
    TypeError exception will be raised.  If adding an object of an XCObject
    subclass and the schema indicates a strong relationship, the object's
    parent will be set to this object.

    If do_copy is True, then lists, dicts, strong-owned XCObjects, and
    strong-owned XCObjects in lists will be copied instead of having their
    references added.
    """

        if properties is None:
            return

        for property, value in properties.items():
            # Make sure the property is in the schema.
            if property not in self._schema:
                raise KeyError(property + " not in " + self.__class__.__name__)

            # Make sure the property conforms to the schema.
            (is_list, property_type, is_strong) = self._schema[property][0:3]
            if is_list:
                if value.__class__ != list:
                    raise TypeError(
                        property
                        + " of "
                        + self.__class__.__name__
                        + " must be list, not "
                        + value.__class__.__name__
                    )
                for item in value:
                    if not isinstance(item, property_type) and not (
                        isinstance(item, str) and property_type == str
                    ):
                        # Accept unicode where str is specified.  str is treated as
                        # UTF-8-encoded.
                        raise TypeError(
                            "item of "
                            + property
                            + " of "
                            + self.__class__.__name__
                            + " must be "
                            + property_type.__name__
                            + ", not "
                            + item.__class__.__name__
                        )
            elif not isinstance(value, property_type) and not (
                isinstance(value, str) and property_type == str
            ):
                # Accept unicode where str is specified.  str is treated as
                # UTF-8-encoded.
                raise TypeError(
                    property
                    + " of "
                    + self.__class__.__name__
                    + " must be "
                    + property_type.__name__
                    + ", not "
                    + value.__class__.__name__
                )

            # Checks passed, perform the assignment.
            if do_copy:
                if isinstance(value, XCObject):
                    if is_strong:
                        self._properties[property] = value.Copy()
                    else:
                        self._properties[property] = value
                elif isinstance(value, (str, int)):
                    self._properties[property] = value
                elif isinstance(value, list):
                    if is_strong:
                        # If is_strong is True, each element is an XCObject,
                        # so it's safe to call Copy.
                        self._properties[property] = []
                        for item in value:
                            self._properties[property].append(item.Copy())
                    else:
                        self._properties[property] = value[:]
                elif isinstance(value, dict):
                    self._properties[property] = value.copy()
                else:
                    raise TypeError(
                        "Don't know how to copy a "
                        + value.__class__.__name__
                        + " object for "
                        + property
                        + " in "
                        + self.__class__.__name__
                    )
            else:
                self._properties[property] = value

            # Set up the child's back-reference to this object.  Don't use |value|
            # any more because it may not be right if do_copy is true.
            if is_strong:
                if not is_list:
                    self._properties[property].parent = self
                else:
                    for item in self._properties[property]:
                        item.parent = self

    def HasProperty(self, key):
        return key in self._properties

    def GetProperty(self, key):
        return self._properties[key]

    def SetProperty(self, key, value):
        self.UpdateProperties({key: value})

    def DelProperty(self, key):
        if key in self._properties:
            del self._properties[key]

    def AppendProperty(self, key, value):
        # TODO(mark): Support ExtendProperty too (and make this call that)?

        # Schema validation.
        if key not in self._schema:
            raise KeyError(key + " not in " + self.__class__.__name__)

        (is_list, property_type, is_strong) = self._schema[key][0:3]
        if not is_list:
            raise TypeError(key + " of " + self.__class__.__name__ + " must be list")
        if not isinstance(value, property_type):
            raise TypeError(
                "item of "
                + key
                + " of "
                + self.__class__.__name__
                + " must be "
                + property_type.__name__
                + ", not "
                + value.__class__.__name__
            )

        # If the property doesn't exist yet, create a new empty list to receive the
        # item.
        self._properties[key] = self._properties.get(key, [])

        # Set up the ownership link.
        if is_strong:
            value.parent = self

        # Store the item.
        self._properties[key].append(value)

    def VerifyHasRequiredProperties(self):
        """Ensure that all properties identified as required by the schema are
    set.
    """

        # TODO(mark): A stronger verification mechanism is needed.  Some
        # subclasses need to perform validation beyond what the schema can enforce.
        for property, attributes in self._schema.items():
            (is_list, property_type, is_strong, is_required) = attributes[0:4]
            if is_required and property not in self._properties:
                raise KeyError(self.__class__.__name__ + " requires " + property)

    def _SetDefaultsFromSchema(self):
        """Assign object default values according to the schema.  This will not
    overwrite properties that have already been set."""

        defaults = {}
        for property, attributes in self._schema.items():
            (is_list, property_type, is_strong, is_required) = attributes[0:4]
            if (
                is_required
                and len(attributes) >= 5
                and property not in self._properties
            ):
                default = attributes[4]

                defaults[property] = default

        if len(defaults) > 0:
            # Use do_copy=True so that each new object gets its own copy of strong
            # objects, lists, and dicts.
            self.UpdateProperties(defaults, do_copy=True)


class XCHierarchicalElement(XCObject):
    """Abstract base for PBXGroup and PBXFileReference.  Not represented in a
  project file."""

    # TODO(mark): Do name and path belong here?  Probably so.
    # If path is set and name is not, name may have a default value.  Name will
    # be set to the basename of path, if the basename of path is different from
    # the full value of path.  If path is already just a leaf name, name will
    # not be set.
    _schema = XCObject._schema.copy()
    _schema.update(
        {
            "comments": [0, str, 0, 0],
            "fileEncoding": [0, str, 0, 0],
            "includeInIndex": [0, int, 0, 0],
            "indentWidth": [0, int, 0, 0],
            "lineEnding": [0, int, 0, 0],
            "sourceTree": [0, str, 0, 1, "<group>"],
            "tabWidth": [0, int, 0, 0],
            "usesTabs": [0, int, 0, 0],
            "wrapsLines": [0, int, 0, 0],
        }
    )

    def __init__(self, properties=None, id=None, parent=None):
        # super
        XCObject.__init__(self, properties, id, parent)
        if "path" in self._properties and "name" not in self._properties:
            path = self._properties["path"]
            name = posixpath.basename(path)
            if name != "" and path != name:
                self.SetProperty("name", name)

        if "path" in self._properties and (
            "sourceTree" not in self._properties
            or self._properties["sourceTree"] == "<group>"
        ):
            # If the pathname begins with an Xcode variable like "$(SDKROOT)/", take
            # the variable out and make the path be relative to that variable by
            # assigning the variable name as the sourceTree.
            (source_tree, path) = SourceTreeAndPathFromPath(self._properties["path"])
            if source_tree is not None:
                self._properties["sourceTree"] = source_tree
            if path is not None:
                self._properties["path"] = path
            if (
                source_tree is not None
                and path is None
                and "name" not in self._properties
            ):
                # The path was of the form "$(SDKROOT)" with no path following it.
                # This object is now relative to that variable, so it has no path
                # attribute of its own.  It does, however, keep a name.
                del self._properties["path"]
                self._properties["name"] = source_tree

    def Name(self):
        if "name" in self._properties:
            return self._properties["name"]
        elif "path" in self._properties:
            return self._properties["path"]
        else:
            # This happens in the case of the root PBXGroup.
            return None

    def Hashables(self):
        """Custom hashables for XCHierarchicalElements.

    XCHierarchicalElements are special.  Generally, their hashes shouldn't
    change if the paths don't change.  The normal XCObject implementation of
    Hashables adds a hashable for each object, which means that if
    the hierarchical structure changes (possibly due to changes caused when
    TakeOverOnlyChild runs and encounters slight changes in the hierarchy),
    the hashes will change.  For example, if a project file initially contains
    a/b/f1 and a/b becomes collapsed into a/b, f1 will have a single parent
    a/b.  If someone later adds a/f2 to the project file, a/b can no longer be
    collapsed, and f1 winds up with parent b and grandparent a.  That would
    be sufficient to change f1's hash.

    To counteract this problem, hashables for all XCHierarchicalElements except
    for the main group (which has neither a name nor a path) are taken to be
    just the set of path components.  Because hashables are inherited from
    parents, this provides assurance that a/b/f1 has the same set of hashables
    whether its parent is b or a/b.

    The main group is a special case.  As it is permitted to have no name or
    path, it is permitted to use the standard XCObject hash mechanism.  This
    is not considered a problem because there can be only one main group.
    """

        if self == self.PBXProjectAncestor()._properties["mainGroup"]:
            # super
            return XCObject.Hashables(self)

        hashables = []

        # Put the name in first, ensuring that if TakeOverOnlyChild collapses
        # children into a top-level group like "Source", the name always goes
        # into the list of hashables without interfering with path components.
        if "name" in self._properties:
            # Make it less likely for people to manipulate hashes by following the
            # pattern of always pushing an object type value onto the list first.
            hashables.append(self.__class__.__name__ + ".name")
            hashables.append(self._properties["name"])

        # NOTE: This still has the problem that if an absolute path is encountered,
        # including paths with a sourceTree, they'll still inherit their parents'
        # hashables, even though the paths aren't relative to their parents.  This
        # is not expected to be much of a problem in practice.
        path = self.PathFromSourceTreeAndPath()
        if path is not None:
            components = path.split(posixpath.sep)
            for component in components:
                hashables.append(self.__class__.__name__ + ".path")
                hashables.append(component)

        hashables.extend(self._hashables)

        return hashables

    def Compare(self, other):
        # Allow comparison of these types.  PBXGroup has the highest sort rank;
        # PBXVariantGroup is treated as equal to PBXFileReference.
        valid_class_types = {
            PBXFileReference: "file",
            PBXGroup: "group",
            PBXVariantGroup: "file",
        }
        self_type = valid_class_types[self.__class__]
        other_type = valid_class_types[other.__class__]

        if self_type == other_type:
            # If the two objects are of the same sort rank, compare their names.
            return cmp(self.Name(), other.Name())

        # Otherwise, sort groups before everything else.
        if self_type == "group":
            return -1
        return 1

    def CompareRootGroup(self, other):
        # This function should be used only to compare direct children of the
        # containing PBXProject's mainGroup.  These groups should appear in the
        # listed order.
        # TODO(mark): "Build" is used by gyp.generator.xcode, perhaps the
        # generator should have a way of influencing this list rather than having
        # to hardcode for the generator here.
        order = [
            "Source",
            "Intermediates",
            "Projects",
            "Frameworks",
            "Products",
            "Build",
        ]

        # If the groups aren't in the listed order, do a name comparison.
        # Otherwise, groups in the listed order should come before those that
        # aren't.
        self_name = self.Name()
        other_name = other.Name()
        self_in = isinstance(self, PBXGroup) and self_name in order
        other_in = isinstance(self, PBXGroup) and other_name in order
        if not self_in and not other_in:
            return self.Compare(other)
        if self_name in order and other_name not in order:
            return -1
        if other_name in order and self_name not in order:
            return 1

        # If both groups are in the listed order, go by the defined order.
        self_index = order.index(self_name)
        other_index = order.index(other_name)
        if self_index < other_index:
            return -1
        if self_index > other_index:
            return 1
        return 0

    def PathFromSourceTreeAndPath(self):
        # Turn the object's sourceTree and path properties into a single flat
        # string of a form comparable to the path parameter.  If there's a
        # sourceTree property other than "<group>", wrap it in $(...) for the
        # comparison.
        components = []
        if self._properties["sourceTree"] != "<group>":
            components.append("$(" + self._properties["sourceTree"] + ")")
        if "path" in self._properties:
            components.append(self._properties["path"])

        if len(components) > 0:
            return posixpath.join(*components)

        return None

    def FullPath(self):
        # Returns a full path to self relative to the project file, or relative
        # to some other source tree.  Start with self, and walk up the chain of
        # parents prepending their paths, if any, until no more parents are
        # available (project-relative path) or until a path relative to some
        # source tree is found.
        xche = self
        path = None
        while isinstance(xche, XCHierarchicalElement) and (
            path is None or (not path.startswith("/") and not path.startswith("$"))
        ):
            this_path = xche.PathFromSourceTreeAndPath()
            if this_path is not None and path is not None:
                path = posixpath.join(this_path, path)
            elif this_path is not None:
                path = this_path
            xche = xche.parent

        return path


class PBXGroup(XCHierarchicalElement):
    """
  Attributes:
    _children_by_path: Maps pathnames of children of this PBXGroup to the
      actual child XCHierarchicalElement objects.
    _variant_children_by_name_and_path: Maps (name, path) tuples of
      PBXVariantGroup children to the actual child PBXVariantGroup objects.
  """

    _schema = XCHierarchicalElement._schema.copy()
    _schema.update(
        {
            "children": [1, XCHierarchicalElement, 1, 1, []],
            "name": [0, str, 0, 0],
            "path": [0, str, 0, 0],
        }
    )

    def __init__(self, properties=None, id=None, parent=None):
        # super
        XCHierarchicalElement.__init__(self, properties, id, parent)
        self._children_by_path = {}
        self._variant_children_by_name_and_path = {}
        for child in self._properties.get("children", []):
            self._AddChildToDicts(child)

    def Hashables(self):
        # super
        hashables = XCHierarchicalElement.Hashables(self)

        # It is not sufficient to just rely on name and parent to build a unique
        # hashable : a node could have two child PBXGroup sharing a common name.
        # To add entropy the hashable is enhanced with the names of all its
        # children.
        for child in self._properties.get("children", []):
            child_name = child.Name()
            if child_name is not None:
                hashables.append(child_name)

        return hashables

    def HashablesForChild(self):
        # To avoid a circular reference the hashables used to compute a child id do
        # not include the child names.
        return XCHierarchicalElement.Hashables(self)

    def _AddChildToDicts(self, child):
        # Sets up this PBXGroup object's dicts to reference the child properly.
        child_path = child.PathFromSourceTreeAndPath()
        if child_path:
            if child_path in self._children_by_path:
                raise ValueError("Found multiple children with path " + child_path)
            self._children_by_path[child_path] = child

        if isinstance(child, PBXVariantGroup):
            child_name = child._properties.get("name", None)
            key = (child_name, child_path)
            if key in self._variant_children_by_name_and_path:
                raise ValueError(
                    "Found multiple PBXVariantGroup children with "
                    + "name "
                    + str(child_name)
                    + " and path "
                    + str(child_path)
                )
            self._variant_children_by_name_and_path[key] = child

    def AppendChild(self, child):
        # Callers should use this instead of calling
        # AppendProperty('children', child) directly because this function
        # maintains the group's dicts.
        self.AppendProperty("children", child)
        self._AddChildToDicts(child)

    def GetChildByName(self, name):
        # This is not currently optimized with a dict as GetChildByPath is because
        # it has few callers.  Most callers probably want GetChildByPath.  This
        # function is only useful to get children that have names but no paths,
        # which is rare.  The children of the main group ("Source", "Products",
        # etc.) is pretty much the only case where this likely to come up.
        #
        # TODO(mark): Maybe this should raise an error if more than one child is
        # present with the same name.
        if "children" not in self._properties:
            return None

        for child in self._properties["children"]:
            if child.Name() == name:
                return child

        return None

    def GetChildByPath(self, path):
        if not path:
            return None

        if path in self._children_by_path:
            return self._children_by_path[path]

        return None

    def GetChildByRemoteObject(self, remote_object):
        # This method is a little bit esoteric.  Given a remote_object, which
        # should be a PBXFileReference in another project file, this method will
        # return this group's PBXReferenceProxy object serving as a local proxy
        # for the remote PBXFileReference.
        #
        # This function might benefit from a dict optimization as GetChildByPath
        # for some workloads, but profiling shows that it's not currently a
        # problem.
        if "children" not in self._properties:
            return None

        for child in self._properties["children"]:
            if not isinstance(child, PBXReferenceProxy):
                continue

            container_proxy = child._properties["remoteRef"]
            if container_proxy._properties["remoteGlobalIDString"] == remote_object:
                return child

        return None

    def AddOrGetFileByPath(self, path, hierarchical):
        """Returns an existing or new file reference corresponding to path.

    If hierarchical is True, this method will create or use the necessary
    hierarchical group structure corresponding to path.  Otherwise, it will
    look in and create an item in the current group only.

    If an existing matching reference is found, it is returned, otherwise, a
    new one will be created, added to the correct group, and returned.

    If path identifies a directory by virtue of carrying a trailing slash,
    this method returns a PBXFileReference of "folder" type.  If path
    identifies a variant, by virtue of it identifying a file inside a directory
    with an ".lproj" extension, this method returns a PBXVariantGroup
    containing the variant named by path, and possibly other variants.  For
    all other paths, a "normal" PBXFileReference will be returned.
    """

        # Adding or getting a directory?  Directories end with a trailing slash.
        is_dir = False
        if path.endswith("/"):
            is_dir = True
        path = posixpath.normpath(path)
        if is_dir:
            path = path + "/"

        # Adding or getting a variant?  Variants are files inside directories
        # with an ".lproj" extension.  Xcode uses variants for localization.  For
        # a variant path/to/Language.lproj/MainMenu.nib, put a variant group named
        # MainMenu.nib inside path/to, and give it a variant named Language.  In
        # this example, grandparent would be set to path/to and parent_root would
        # be set to Language.
        variant_name = None
        parent = posixpath.dirname(path)
        grandparent = posixpath.dirname(parent)
        parent_basename = posixpath.basename(parent)
        (parent_root, parent_ext) = posixpath.splitext(parent_basename)
        if parent_ext == ".lproj":
            variant_name = parent_root
        if grandparent == "":
            grandparent = None

        # Putting a directory inside a variant group is not currently supported.
        assert not is_dir or variant_name is None

        path_split = path.split(posixpath.sep)
        if (
            len(path_split) == 1
            or ((is_dir or variant_name is not None) and len(path_split) == 2)
            or not hierarchical
        ):
            # The PBXFileReference or PBXVariantGroup will be added to or gotten from
            # this PBXGroup, no recursion necessary.
            if variant_name is None:
                # Add or get a PBXFileReference.
                file_ref = self.GetChildByPath(path)
                if file_ref is not None:
                    assert file_ref.__class__ == PBXFileReference
                else:
                    file_ref = PBXFileReference({"path": path})
                    self.AppendChild(file_ref)
            else:
                # Add or get a PBXVariantGroup.  The variant group name is the same
                # as the basename (MainMenu.nib in the example above).  grandparent
                # specifies the path to the variant group itself, and path_split[-2:]
                # is the path of the specific variant relative to its group.
                variant_group_name = posixpath.basename(path)
                variant_group_ref = self.AddOrGetVariantGroupByNameAndPath(
                    variant_group_name, grandparent
                )
                variant_path = posixpath.sep.join(path_split[-2:])
                variant_ref = variant_group_ref.GetChildByPath(variant_path)
                if variant_ref is not None:
                    assert variant_ref.__class__ == PBXFileReference
                else:
                    variant_ref = PBXFileReference(
                        {"name": variant_name, "path": variant_path}
                    )
                    variant_group_ref.AppendChild(variant_ref)
                # The caller is interested in the variant group, not the specific
                # variant file.
                file_ref = variant_group_ref
            return file_ref
        else:
            # Hierarchical recursion.  Add or get a PBXGroup corresponding to the
            # outermost path component, and then recurse into it, chopping off that
            # path component.
            next_dir = path_split[0]
            group_ref = self.GetChildByPath(next_dir)
            if group_ref is not None:
                assert group_ref.__class__ == PBXGroup
            else:
                group_ref = PBXGroup({"path": next_dir})
                self.AppendChild(group_ref)
            return group_ref.AddOrGetFileByPath(
                posixpath.sep.join(path_split[1:]), hierarchical
            )

    def AddOrGetVariantGroupByNameAndPath(self, name, path):
        """Returns an existing or new PBXVariantGroup for name and path.

    If a PBXVariantGroup identified by the name and path arguments is already
    present as a child of this object, it is returned.  Otherwise, a new
    PBXVariantGroup with the correct properties is created, added as a child,
    and returned.

    This method will generally be called by AddOrGetFileByPath, which knows
    when to create a variant group based on the structure of the pathnames
    passed to it.
    """

        key = (name, path)
        if key in self._variant_children_by_name_and_path:
            variant_group_ref = self._variant_children_by_name_and_path[key]
            assert variant_group_ref.__class__ == PBXVariantGroup
            return variant_group_ref

        variant_group_properties = {"name": name}
        if path is not None:
            variant_group_properties["path"] = path
        variant_group_ref = PBXVariantGroup(variant_group_properties)
        self.AppendChild(variant_group_ref)

        return variant_group_ref

    def TakeOverOnlyChild(self, recurse=False):
        """If this PBXGroup has only one child and it's also a PBXGroup, take
    it over by making all of its children this object's children.

    This function will continue to take over only children when those children
    are groups.  If there are three PBXGroups representing a, b, and c, with
    c inside b and b inside a, and a and b have no other children, this will
    result in a taking over both b and c, forming a PBXGroup for a/b/c.

    If recurse is True, this function will recurse into children and ask them
    to collapse themselves by taking over only children as well.  Assuming
    an example hierarchy with files at a/b/c/d1, a/b/c/d2, and a/b/c/d3/e/f
    (d1, d2, and f are files, the rest are groups), recursion will result in
    a group for a/b/c containing a group for d3/e.
    """

        # At this stage, check that child class types are PBXGroup exactly,
        # instead of using isinstance.  The only subclass of PBXGroup,
        # PBXVariantGroup, should not participate in reparenting in the same way:
        # reparenting by merging different object types would be wrong.
        while (
            len(self._properties["children"]) == 1
            and self._properties["children"][0].__class__ == PBXGroup
        ):
            # Loop to take over the innermost only-child group possible.

            child = self._properties["children"][0]

            # Assume the child's properties, including its children.  Save a copy
            # of this object's old properties, because they'll still be needed.
            # This object retains its existing id and parent attributes.
            old_properties = self._properties
            self._properties = child._properties
            self._children_by_path = child._children_by_path

            if (
                "sourceTree" not in self._properties
                or self._properties["sourceTree"] == "<group>"
            ):
                # The child was relative to its parent.  Fix up the path.  Note that
                # children with a sourceTree other than "<group>" are not relative to
                # their parents, so no path fix-up is needed in that case.
                if "path" in old_properties:
                    if "path" in self._properties:
                        # Both the original parent and child have paths set.
                        self._properties["path"] = posixpath.join(
                            old_properties["path"], self._properties["path"]
                        )
                    else:
                        # Only the original parent has a path, use it.
                        self._properties["path"] = old_properties["path"]
                if "sourceTree" in old_properties:
                    # The original parent had a sourceTree set, use it.
                    self._properties["sourceTree"] = old_properties["sourceTree"]

            # If the original parent had a name set, keep using it.  If the original
            # parent didn't have a name but the child did, let the child's name
            # live on.  If the name attribute seems unnecessary now, get rid of it.
            if "name" in old_properties and old_properties["name"] not in (
                None,
                self.Name(),
            ):
                self._properties["name"] = old_properties["name"]
            if (
                "name" in self._properties
                and "path" in self._properties
                and self._properties["name"] == self._properties["path"]
            ):
                del self._properties["name"]

            # Notify all children of their new parent.
            for child in self._properties["children"]:
                child.parent = self

        # If asked to recurse, recurse.
        if recurse:
            for child in self._properties["children"]:
                if child.__class__ == PBXGroup:
                    child.TakeOverOnlyChild(recurse)

    def SortGroup(self):
        self._properties["children"] = sorted(
            self._properties["children"], key=cmp_to_key(lambda x, y: x.Compare(y))
        )

        # Recurse.
        for child in self._properties["children"]:
            if isinstance(child, PBXGroup):
                child.SortGroup()


class XCFileLikeElement(XCHierarchicalElement):
    # Abstract base for objects that can be used as the fileRef property of
    # PBXBuildFile.

    def PathHashables(self):
        # A PBXBuildFile that refers to this object will call this method to
        # obtain additional hashables specific to this XCFileLikeElement.  Don't
        # just use this object's hashables, they're not specific and unique enough
        # on their own (without access to the parent hashables.)  Instead, provide
        # hashables that identify this object by path by getting its hashables as
        # well as the hashables of ancestor XCHierarchicalElement objects.

        hashables = []
        xche = self
        while isinstance(xche, XCHierarchicalElement):
            xche_hashables = xche.Hashables()
            for index, xche_hashable in enumerate(xche_hashables):
                hashables.insert(index, xche_hashable)
            xche = xche.parent
        return hashables


class XCContainerPortal(XCObject):
    # Abstract base for objects that can be used as the containerPortal property
    # of PBXContainerItemProxy.
    pass


class XCRemoteObject(XCObject):
    # Abstract base for objects that can be used as the remoteGlobalIDString
    # property of PBXContainerItemProxy.
    pass


class PBXFileReference(XCFileLikeElement, XCContainerPortal, XCRemoteObject):
    _schema = XCFileLikeElement._schema.copy()
    _schema.update(
        {
            "explicitFileType": [0, str, 0, 0],
            "lastKnownFileType": [0, str, 0, 0],
            "name": [0, str, 0, 0],
            "path": [0, str, 0, 1],
        }
    )

    # Weird output rules for PBXFileReference.
    _should_print_single_line = True
    # super
    _encode_transforms = XCFileLikeElement._alternate_encode_transforms

    def __init__(self, properties=None, id=None, parent=None):
        # super
        XCFileLikeElement.__init__(self, properties, id, parent)
        if "path" in self._properties and self._properties["path"].endswith("/"):
            self._properties["path"] = self._properties["path"][:-1]
            is_dir = True
        else:
            is_dir = False

        if (
            "path" in self._properties
            and "lastKnownFileType" not in self._properties
            and "explicitFileType" not in self._properties
        ):
            # TODO(mark): This is the replacement for a replacement for a quick hack.
            # It is no longer incredibly sucky, but this list needs to be extended.
            extension_map = {
                "a": "archive.ar",
                "app": "wrapper.application",
                "bdic": "file",
                "bundle": "wrapper.cfbundle",
                "c": "sourcecode.c.c",
                "cc": "sourcecode.cpp.cpp",
                "cpp": "sourcecode.cpp.cpp",
                "css": "text.css",
                "cxx": "sourcecode.cpp.cpp",
                "dart": "sourcecode",
                "dylib": "compiled.mach-o.dylib",
                "framework": "wrapper.framework",
                "gyp": "sourcecode",
                "gypi": "sourcecode",
                "h": "sourcecode.c.h",
                "hxx": "sourcecode.cpp.h",
                "icns": "image.icns",
                "java": "sourcecode.java",
                "js": "sourcecode.javascript",
                "kext": "wrapper.kext",
                "m": "sourcecode.c.objc",
                "mm": "sourcecode.cpp.objcpp",
                "nib": "wrapper.nib",
                "o": "compiled.mach-o.objfile",
                "pdf": "image.pdf",
                "pl": "text.script.perl",
                "plist": "text.plist.xml",
                "pm": "text.script.perl",
                "png": "image.png",
                "py": "text.script.python",
                "r": "sourcecode.rez",
                "rez": "sourcecode.rez",
                "s": "sourcecode.asm",
                "storyboard": "file.storyboard",
                "strings": "text.plist.strings",
                "swift": "sourcecode.swift",
                "ttf": "file",
                "xcassets": "folder.assetcatalog",
                "xcconfig": "text.xcconfig",
                "xcdatamodel": "wrapper.xcdatamodel",
                "xcdatamodeld": "wrapper.xcdatamodeld",
                "xib": "file.xib",
                "y": "sourcecode.yacc",
            }

            prop_map = {
                "dart": "explicitFileType",
                "gyp": "explicitFileType",
                "gypi": "explicitFileType",
            }

            if is_dir:
                file_type = "folder"
                prop_name = "lastKnownFileType"
            else:
                basename = posixpath.basename(self._properties["path"])
                (root, ext) = posixpath.splitext(basename)
                # Check the map using a lowercase extension.
                # TODO(mark): Maybe it should try with the original case first and fall
                # back to lowercase, in case there are any instances where case
                # matters.  There currently aren't.
                if ext != "":
                    ext = ext[1:].lower()

                # TODO(mark): "text" is the default value, but "file" is appropriate
                # for unrecognized files not containing text.  Xcode seems to choose
                # based on content.
                file_type = extension_map.get(ext, "text")
                prop_name = prop_map.get(ext, "lastKnownFileType")

            self._properties[prop_name] = file_type


class PBXVariantGroup(PBXGroup, XCFileLikeElement):
    """PBXVariantGroup is used by Xcode to represent localizations."""

    # No additions to the schema relative to PBXGroup.
    pass


# PBXReferenceProxy is also an XCFileLikeElement subclass.  It is defined below
# because it uses PBXContainerItemProxy, defined below.


class XCBuildConfiguration(XCObject):
    _schema = XCObject._schema.copy()
    _schema.update(
        {
            "baseConfigurationReference": [0, PBXFileReference, 0, 0],
            "buildSettings": [0, dict, 0, 1, {}],
            "name": [0, str, 0, 1],
        }
    )

    def HasBuildSetting(self, key):
        return key in self._properties["buildSettings"]

    def GetBuildSetting(self, key):
        return self._properties["buildSettings"][key]

    def SetBuildSetting(self, key, value):
        # TODO(mark): If a list, copy?
        self._properties["buildSettings"][key] = value

    def AppendBuildSetting(self, key, value):
        if key not in self._properties["buildSettings"]:
            self._properties["buildSettings"][key] = []
        self._properties["buildSettings"][key].append(value)

    def DelBuildSetting(self, key):
        if key in self._properties["buildSettings"]:
            del self._properties["buildSettings"][key]

    def SetBaseConfiguration(self, value):
        self._properties["baseConfigurationReference"] = value


class XCConfigurationList(XCObject):
    # _configs is the default list of configurations.
    _configs = [
        XCBuildConfiguration({"name": "Debug"}),
        XCBuildConfiguration({"name": "Release"}),
    ]

    _schema = XCObject._schema.copy()
    _schema.update(
        {
            "buildConfigurations": [1, XCBuildConfiguration, 1, 1, _configs],
            "defaultConfigurationIsVisible": [0, int, 0, 1, 1],
            "defaultConfigurationName": [0, str, 0, 1, "Release"],
        }
    )

    def Name(self):
        return (
            "Build configuration list for "
            + self.parent.__class__.__name__
            + ' "'
            + self.parent.Name()
            + '"'
        )

    def ConfigurationNamed(self, name):
        """Convenience accessor to obtain an XCBuildConfiguration by name."""
        for configuration in self._properties["buildConfigurations"]:
            if configuration._properties["name"] == name:
                return configuration

        raise KeyError(name)

    def DefaultConfiguration(self):
        """Convenience accessor to obtain the default XCBuildConfiguration."""
        return self.ConfigurationNamed(self._properties["defaultConfigurationName"])

    def HasBuildSetting(self, key):
        """Determines the state of a build setting in all XCBuildConfiguration
    child objects.

    If all child objects have key in their build settings, and the value is the
    same in all child objects, returns 1.

    If no child objects have the key in their build settings, returns 0.

    If some, but not all, child objects have the key in their build settings,
    or if any children have different values for the key, returns -1.
    """

        has = None
        value = None
        for configuration in self._properties["buildConfigurations"]:
            configuration_has = configuration.HasBuildSetting(key)
            if has is None:
                has = configuration_has
            elif has != configuration_has:
                return -1

            if configuration_has:
                configuration_value = configuration.GetBuildSetting(key)
                if value is None:
                    value = configuration_value
                elif value != configuration_value:
                    return -1

        if not has:
            return 0

        return 1

    def GetBuildSetting(self, key):
        """Gets the build setting for key.

    All child XCConfiguration objects must have the same value set for the
    setting, or a ValueError will be raised.
    """

        # TODO(mark): This is wrong for build settings that are lists.  The list
        # contents should be compared (and a list copy returned?)

        value = None
        for configuration in self._properties["buildConfigurations"]:
            configuration_value = configuration.GetBuildSetting(key)
            if value is None:
                value = configuration_value
            else:
                if value != configuration_value:
                    raise ValueError("Variant values for " + key)

        return value

    def SetBuildSetting(self, key, value):
        """Sets the build setting for key to value in all child
    XCBuildConfiguration objects.
    """

        for configuration in self._properties["buildConfigurations"]:
            configuration.SetBuildSetting(key, value)

    def AppendBuildSetting(self, key, value):
        """Appends value to the build setting for key, which is treated as a list,
    in all child XCBuildConfiguration objects.
    """

        for configuration in self._properties["buildConfigurations"]:
            configuration.AppendBuildSetting(key, value)

    def DelBuildSetting(self, key):
        """Deletes the build setting key from all child XCBuildConfiguration
    objects.
    """

        for configuration in self._properties["buildConfigurations"]:
            configuration.DelBuildSetting(key)

    def SetBaseConfiguration(self, value):
        """Sets the build configuration in all child XCBuildConfiguration objects.
    """

        for configuration in self._properties["buildConfigurations"]:
            configuration.SetBaseConfiguration(value)


class PBXBuildFile(XCObject):
    _schema = XCObject._schema.copy()
    _schema.update(
        {
            "fileRef": [0, XCFileLikeElement, 0, 1],
            "settings": [0, str, 0, 0],  # hack, it's a dict
        }
    )

    # Weird output rules for PBXBuildFile.
    _should_print_single_line = True
    _encode_transforms = XCObject._alternate_encode_transforms

    def Name(self):
        # Example: "main.cc in Sources"
        return self._properties["fileRef"].Name() + " in " + self.parent.Name()

    def Hashables(self):
        # super
        hashables = XCObject.Hashables(self)

        # It is not sufficient to just rely on Name() to get the
        # XCFileLikeElement's name, because that is not a complete pathname.
        # PathHashables returns hashables unique enough that no two
        # PBXBuildFiles should wind up with the same set of hashables, unless
        # someone adds the same file multiple times to the same target.  That
        # would be considered invalid anyway.
        hashables.extend(self._properties["fileRef"].PathHashables())

        return hashables


class XCBuildPhase(XCObject):
    """Abstract base for build phase classes.  Not represented in a project
  file.

  Attributes:
    _files_by_path: A dict mapping each path of a child in the files list by
      path (keys) to the corresponding PBXBuildFile children (values).
    _files_by_xcfilelikeelement: A dict mapping each XCFileLikeElement (keys)
      to the corresponding PBXBuildFile children (values).
  """

    # TODO(mark): Some build phase types, like PBXShellScriptBuildPhase, don't
    # actually have a "files" list.  XCBuildPhase should not have "files" but
    # another abstract subclass of it should provide this, and concrete build
    # phase types that do have "files" lists should be derived from that new
    # abstract subclass.  XCBuildPhase should only provide buildActionMask and
    # runOnlyForDeploymentPostprocessing, and not files or the various
    # file-related methods and attributes.

    _schema = XCObject._schema.copy()
    _schema.update(
        {
            "buildActionMask": [0, int, 0, 1, 0x7FFFFFFF],
            "files": [1, PBXBuildFile, 1, 1, []],
            "runOnlyForDeploymentPostprocessing": [0, int, 0, 1, 0],
        }
    )

    def __init__(self, properties=None, id=None, parent=None):
        # super
        XCObject.__init__(self, properties, id, parent)

        self._files_by_path = {}
        self._files_by_xcfilelikeelement = {}
        for pbxbuildfile in self._properties.get("files", []):
            self._AddBuildFileToDicts(pbxbuildfile)

    def FileGroup(self, path):
        # Subclasses must override this by returning a two-element tuple.  The
        # first item in the tuple should be the PBXGroup to which "path" should be
        # added, either as a child or deeper descendant.  The second item should
        # be a boolean indicating whether files should be added into hierarchical
        # groups or one single flat group.
        raise NotImplementedError(self.__class__.__name__ + " must implement FileGroup")

    def _AddPathToDict(self, pbxbuildfile, path):
        """Adds path to the dict tracking paths belonging to this build phase.

    If the path is already a member of this build phase, raises an exception.
    """

        if path in self._files_by_path:
            raise ValueError("Found multiple build files with path " + path)
        self._files_by_path[path] = pbxbuildfile

    def _AddBuildFileToDicts(self, pbxbuildfile, path=None):
        """Maintains the _files_by_path and _files_by_xcfilelikeelement dicts.

    If path is specified, then it is the path that is being added to the
    phase, and pbxbuildfile must contain either a PBXFileReference directly
    referencing that path, or it must contain a PBXVariantGroup that itself
    contains a PBXFileReference referencing the path.

    If path is not specified, either the PBXFileReference's path or the paths
    of all children of the PBXVariantGroup are taken as being added to the
    phase.

    If the path is already present in the phase, raises an exception.

    If the PBXFileReference or PBXVariantGroup referenced by pbxbuildfile
    are already present in the phase, referenced by a different PBXBuildFile
    object, raises an exception.  This does not raise an exception when
    a PBXFileReference or PBXVariantGroup reappear and are referenced by the
    same PBXBuildFile that has already introduced them, because in the case
    of PBXVariantGroup objects, they may correspond to multiple paths that are
    not all added simultaneously.  When this situation occurs, the path needs
    to be added to _files_by_path, but nothing needs to change in
    _files_by_xcfilelikeelement, and the caller should have avoided adding
    the PBXBuildFile if it is already present in the list of children.
    """

        xcfilelikeelement = pbxbuildfile._properties["fileRef"]

        paths = []
        if path is not None:
            # It's best when the caller provides the path.
            if isinstance(xcfilelikeelement, PBXVariantGroup):
                paths.append(path)
        else:
            # If the caller didn't provide a path, there can be either multiple
            # paths (PBXVariantGroup) or one.
            if isinstance(xcfilelikeelement, PBXVariantGroup):
                for variant in xcfilelikeelement._properties["children"]:
                    paths.append(variant.FullPath())
            else:
                paths.append(xcfilelikeelement.FullPath())

        # Add the paths first, because if something's going to raise, the
        # messages provided by _AddPathToDict are more useful owing to its
        # having access to a real pathname and not just an object's Name().
        for a_path in paths:
            self._AddPathToDict(pbxbuildfile, a_path)

        # If another PBXBuildFile references this XCFileLikeElement, there's a
        # problem.
        if (
            xcfilelikeelement in self._files_by_xcfilelikeelement
            and self._files_by_xcfilelikeelement[xcfilelikeelement] != pbxbuildfile
        ):
            raise ValueError(
                "Found multiple build files for " + xcfilelikeelement.Name()
            )
        self._files_by_xcfilelikeelement[xcfilelikeelement] = pbxbuildfile

    def AppendBuildFile(self, pbxbuildfile, path=None):
        # Callers should use this instead of calling
        # AppendProperty('files', pbxbuildfile) directly because this function
        # maintains the object's dicts.  Better yet, callers can just call AddFile
        # with a pathname and not worry about building their own PBXBuildFile
        # objects.
        self.AppendProperty("files", pbxbuildfile)
        self._AddBuildFileToDicts(pbxbuildfile, path)

    def AddFile(self, path, settings=None):
        (file_group, hierarchical) = self.FileGroup(path)
        file_ref = file_group.AddOrGetFileByPath(path, hierarchical)

        if file_ref in self._files_by_xcfilelikeelement and isinstance(
            file_ref, PBXVariantGroup
        ):
            # There's already a PBXBuildFile in this phase corresponding to the
            # PBXVariantGroup.  path just provides a new variant that belongs to
            # the group.  Add the path to the dict.
            pbxbuildfile = self._files_by_xcfilelikeelement[file_ref]
            self._AddBuildFileToDicts(pbxbuildfile, path)
        else:
            # Add a new PBXBuildFile to get file_ref into the phase.
            if settings is None:
                pbxbuildfile = PBXBuildFile({"fileRef": file_ref})
            else:
                pbxbuildfile = PBXBuildFile({"fileRef": file_ref, "settings": settings})
            self.AppendBuildFile(pbxbuildfile, path)


class PBXHeadersBuildPhase(XCBuildPhase):
    # No additions to the schema relative to XCBuildPhase.

    def Name(self):
        return "Headers"

    def FileGroup(self, path):
        return self.PBXProjectAncestor().RootGroupForPath(path)


class PBXResourcesBuildPhase(XCBuildPhase):
    # No additions to the schema relative to XCBuildPhase.

    def Name(self):
        return "Resources"

    def FileGroup(self, path):
        return self.PBXProjectAncestor().RootGroupForPath(path)


class PBXSourcesBuildPhase(XCBuildPhase):
    # No additions to the schema relative to XCBuildPhase.

    def Name(self):
        return "Sources"

    def FileGroup(self, path):
        return self.PBXProjectAncestor().RootGroupForPath(path)


class PBXFrameworksBuildPhase(XCBuildPhase):
    # No additions to the schema relative to XCBuildPhase.

    def Name(self):
        return "Frameworks"

    def FileGroup(self, path):
        (root, ext) = posixpath.splitext(path)
        if ext != "":
            ext = ext[1:].lower()
        if ext == "o":
            # .o files are added to Xcode Frameworks phases, but conceptually aren't
            # frameworks, they're more like sources or intermediates. Redirect them
            # to show up in one of those other groups.
            return self.PBXProjectAncestor().RootGroupForPath(path)
        else:
            return (self.PBXProjectAncestor().FrameworksGroup(), False)


class PBXShellScriptBuildPhase(XCBuildPhase):
    _schema = XCBuildPhase._schema.copy()
    _schema.update(
        {
            "inputPaths": [1, str, 0, 1, []],
            "name": [0, str, 0, 0],
            "outputPaths": [1, str, 0, 1, []],
            "shellPath": [0, str, 0, 1, "/bin/sh"],
            "shellScript": [0, str, 0, 1],
            "showEnvVarsInLog": [0, int, 0, 0],
        }
    )

    def Name(self):
        if "name" in self._properties:
            return self._properties["name"]

        return "ShellScript"


class PBXCopyFilesBuildPhase(XCBuildPhase):
    _schema = XCBuildPhase._schema.copy()
    _schema.update(
        {
            "dstPath": [0, str, 0, 1],
            "dstSubfolderSpec": [0, int, 0, 1],
            "name": [0, str, 0, 0],
        }
    )

    # path_tree_re matches "$(DIR)/path", "$(DIR)/$(DIR2)/path" or just "$(DIR)".
    # Match group 1 is "DIR", group 3 is "path" or "$(DIR2") or "$(DIR2)/path"
    # or None. If group 3 is "path", group 4 will be None otherwise group 4 is
    # "DIR2" and group 6 is "path".
    path_tree_re = re.compile(r"^\$\((.*?)\)(/(\$\((.*?)\)(/(.*)|)|(.*)|)|)$")

    # path_tree_{first,second}_to_subfolder map names of Xcode variables to the
    # associated dstSubfolderSpec property value used in a PBXCopyFilesBuildPhase
    # object.
    path_tree_first_to_subfolder = {
        # Types that can be chosen via the Xcode UI.
        "BUILT_PRODUCTS_DIR": 16,  # Products Directory
        "BUILT_FRAMEWORKS_DIR": 10,  # Not an official Xcode macro.
        # Existed before support for the
        # names below was added. Maps to
        # "Frameworks".
    }

    path_tree_second_to_subfolder = {
        "WRAPPER_NAME": 1,  # Wrapper
        # Although Xcode's friendly name is "Executables", the destination
        # is demonstrably the value of the build setting
        # EXECUTABLE_FOLDER_PATH not EXECUTABLES_FOLDER_PATH.
        "EXECUTABLE_FOLDER_PATH": 6,  # Executables.
        "UNLOCALIZED_RESOURCES_FOLDER_PATH": 7,  # Resources
        "JAVA_FOLDER_PATH": 15,  # Java Resources
        "FRAMEWORKS_FOLDER_PATH": 10,  # Frameworks
        "SHARED_FRAMEWORKS_FOLDER_PATH": 11,  # Shared Frameworks
        "SHARED_SUPPORT_FOLDER_PATH": 12,  # Shared Support
        "PLUGINS_FOLDER_PATH": 13,  # PlugIns
        # For XPC Services, Xcode sets both dstPath and dstSubfolderSpec.
        # Note that it re-uses the BUILT_PRODUCTS_DIR value for
        # dstSubfolderSpec. dstPath is set below.
        "XPCSERVICES_FOLDER_PATH": 16,  # XPC Services.
    }

    def Name(self):
        if "name" in self._properties:
            return self._properties["name"]

        return "CopyFiles"

    def FileGroup(self, path):
        return self.PBXProjectAncestor().RootGroupForPath(path)

    def SetDestination(self, path):
        """Set the dstSubfolderSpec and dstPath properties from path.

    path may be specified in the same notation used for XCHierarchicalElements,
    specifically, "$(DIR)/path".
    """

        path_tree_match = self.path_tree_re.search(path)
        if path_tree_match:
            path_tree = path_tree_match.group(1)
            if path_tree in self.path_tree_first_to_subfolder:
                subfolder = self.path_tree_first_to_subfolder[path_tree]
                relative_path = path_tree_match.group(3)
                if relative_path is None:
                    relative_path = ""

                if subfolder == 16 and path_tree_match.group(4) is not None:
                    # BUILT_PRODUCTS_DIR (16) is the first element in a path whose
                    # second element is possibly one of the variable names in
                    # path_tree_second_to_subfolder. Xcode sets the values of all these
                    # variables to relative paths so .gyp files must prefix them with
                    # BUILT_PRODUCTS_DIR, e.g.
                    # $(BUILT_PRODUCTS_DIR)/$(PLUGINS_FOLDER_PATH). Then
                    # xcode_emulation.py can export these variables with the same values
                    # as Xcode yet make & ninja files can determine the absolute path
                    # to the target. Xcode uses the dstSubfolderSpec value set here
                    # to determine the full path.
                    #
                    # An alternative of xcode_emulation.py setting the values to
                    # absolute paths when exporting these variables has been
                    # ruled out because then the values would be different
                    # depending on the build tool.
                    #
                    # Another alternative is to invent new names for the variables used
                    # to match to the subfolder indices in the second table. .gyp files
                    # then will not need to prepend $(BUILT_PRODUCTS_DIR) because
                    # xcode_emulation.py can set the values of those variables to
                    # the absolute paths when exporting. This is possibly the thinking
                    # behind BUILT_FRAMEWORKS_DIR which is used in exactly this manner.
                    #
                    # Requiring prepending BUILT_PRODUCTS_DIR has been chosen because
                    # this same way could be used to specify destinations in .gyp files
                    # that pre-date this addition to GYP. However they would only work
                    # with the Xcode generator.
                    # The previous version of xcode_emulation.py
                    # does not export these variables. Such files will get the benefit
                    # of the Xcode UI showing the proper destination name simply by
                    # regenerating the projects with this version of GYP.
                    path_tree = path_tree_match.group(4)
                    relative_path = path_tree_match.group(6)
                    separator = "/"

                    if path_tree in self.path_tree_second_to_subfolder:
                        subfolder = self.path_tree_second_to_subfolder[path_tree]
                        if relative_path is None:
                            relative_path = ""
                            separator = ""
                        if path_tree == "XPCSERVICES_FOLDER_PATH":
                            relative_path = (
                                "$(CONTENTS_FOLDER_PATH)/XPCServices"
                                + separator
                                + relative_path
                            )
                    else:
                        # subfolder = 16 from above
                        # The second element of the path is an unrecognized variable.
                        # Include it and any remaining elements in relative_path.
                        relative_path = path_tree_match.group(3)

            else:
                # The path starts with an unrecognized Xcode variable
                # name like $(SRCROOT).  Xcode will still handle this
                # as an "absolute path" that starts with the variable.
                subfolder = 0
                relative_path = path
        elif path.startswith("/"):
            # Special case.  Absolute paths are in dstSubfolderSpec 0.
            subfolder = 0
            relative_path = path[1:]
        else:
            raise ValueError(
                f"Can't use path {path} in a {self.__class__.__name__}"
            )

        self._properties["dstPath"] = relative_path
        self._properties["dstSubfolderSpec"] = subfolder


class PBXBuildRule(XCObject):
    _schema = XCObject._schema.copy()
    _schema.update(
        {
            "compilerSpec": [0, str, 0, 1],
            "filePatterns": [0, str, 0, 0],
            "fileType": [0, str, 0, 1],
            "isEditable": [0, int, 0, 1, 1],
            "outputFiles": [1, str, 0, 1, []],
            "script": [0, str, 0, 0],
        }
    )

    def Name(self):
        # Not very inspired, but it's what Xcode uses.
        return self.__class__.__name__

    def Hashables(self):
        # super
        hashables = XCObject.Hashables(self)

        # Use the hashables of the weak objects that this object refers to.
        hashables.append(self._properties["fileType"])
        if "filePatterns" in self._properties:
            hashables.append(self._properties["filePatterns"])
        return hashables


class PBXContainerItemProxy(XCObject):
    # When referencing an item in this project file, containerPortal is the
    # PBXProject root object of this project file.  When referencing an item in
    # another project file, containerPortal is a PBXFileReference identifying
    # the other project file.
    #
    # When serving as a proxy to an XCTarget (in this project file or another),
    # proxyType is 1.  When serving as a proxy to a PBXFileReference (in another
    # project file), proxyType is 2.  Type 2 is used for references to the
    # producs of the other project file's targets.
    #
    # Xcode is weird about remoteGlobalIDString.  Usually, it's printed without
    # a comment, indicating that it's tracked internally simply as a string, but
    # sometimes it's printed with a comment (usually when the object is initially
    # created), indicating that it's tracked as a project file object at least
    # sometimes.  This module always tracks it as an object, but contains a hack
    # to prevent it from printing the comment in the project file output.  See
    # _XCKVPrint.
    _schema = XCObject._schema.copy()
    _schema.update(
        {
            "containerPortal": [0, XCContainerPortal, 0, 1],
            "proxyType": [0, int, 0, 1],
            "remoteGlobalIDString": [0, XCRemoteObject, 0, 1],
            "remoteInfo": [0, str, 0, 1],
        }
    )

    def __repr__(self):
        props = self._properties
        name = "{}.gyp:{}".format(props["containerPortal"].Name(), props["remoteInfo"])
        return f"<{self.__class__.__name__} {name!r} at 0x{id(self):x}>"

    def Name(self):
        # Admittedly not the best name, but it's what Xcode uses.
        return self.__class__.__name__

    def Hashables(self):
        # super
        hashables = XCObject.Hashables(self)

        # Use the hashables of the weak objects that this object refers to.
        hashables.extend(self._properties["containerPortal"].Hashables())
        hashables.extend(self._properties["remoteGlobalIDString"].Hashables())
        return hashables


class PBXTargetDependency(XCObject):
    # The "target" property accepts an XCTarget object, and obviously not
    # NoneType.  But XCTarget is defined below, so it can't be put into the
    # schema yet.  The definition of PBXTargetDependency can't be moved below
    # XCTarget because XCTarget's own schema references PBXTargetDependency.
    # Python doesn't deal well with this circular relationship, and doesn't have
    # a real way to do forward declarations.  To work around, the type of
    # the "target" property is reset below, after XCTarget is defined.
    #
    # At least one of "name" and "target" is required.
    _schema = XCObject._schema.copy()
    _schema.update(
        {
            "name": [0, str, 0, 0],
            "target": [0, None.__class__, 0, 0],
            "targetProxy": [0, PBXContainerItemProxy, 1, 1],
        }
    )

    def __repr__(self):
        name = self._properties.get("name") or self._properties["target"].Name()
        return f"<{self.__class__.__name__} {name!r} at 0x{id(self):x}>"

    def Name(self):
        # Admittedly not the best name, but it's what Xcode uses.
        return self.__class__.__name__

    def Hashables(self):
        # super
        hashables = XCObject.Hashables(self)

        # Use the hashables of the weak objects that this object refers to.
        hashables.extend(self._properties["targetProxy"].Hashables())
        return hashables


class PBXReferenceProxy(XCFileLikeElement):
    _schema = XCFileLikeElement._schema.copy()
    _schema.update(
        {
            "fileType": [0, str, 0, 1],
            "path": [0, str, 0, 1],
            "remoteRef": [0, PBXContainerItemProxy, 1, 1],
        }
    )


class XCTarget(XCRemoteObject):
    # An XCTarget is really just an XCObject, the XCRemoteObject thing is just
    # to allow PBXProject to be used in the remoteGlobalIDString property of
    # PBXContainerItemProxy.
    #
    # Setting a "name" property at instantiation may also affect "productName",
    # which may in turn affect the "PRODUCT_NAME" build setting in children of
    # "buildConfigurationList".  See __init__ below.
    _schema = XCRemoteObject._schema.copy()
    _schema.update(
        {
            "buildConfigurationList": [
                0,
                XCConfigurationList,
                1,
                1,
                XCConfigurationList(),
            ],
            "buildPhases": [1, XCBuildPhase, 1, 1, []],
            "dependencies": [1, PBXTargetDependency, 1, 1, []],
            "name": [0, str, 0, 1],
            "productName": [0, str, 0, 1],
        }
    )

    def __init__(
        self,
        properties=None,
        id=None,
        parent=None,
        force_outdir=None,
        force_prefix=None,
        force_extension=None,
    ):
        # super
        XCRemoteObject.__init__(self, properties, id, parent)

        # Set up additional defaults not expressed in the schema.  If a "name"
        # property was supplied, set "productName" if it is not present.  Also set
        # the "PRODUCT_NAME" build setting in each configuration, but only if
        # the setting is not present in any build configuration.
        if "name" in self._properties:
            if "productName" not in self._properties:
                self.SetProperty("productName", self._properties["name"])

        if "productName" in self._properties:
            if "buildConfigurationList" in self._properties:
                configs = self._properties["buildConfigurationList"]
                if configs.HasBuildSetting("PRODUCT_NAME") == 0:
                    configs.SetBuildSetting(
                        "PRODUCT_NAME", self._properties["productName"]
                    )

    def AddDependency(self, other):
        pbxproject = self.PBXProjectAncestor()
        other_pbxproject = other.PBXProjectAncestor()
        if pbxproject == other_pbxproject:
            # Add a dependency to another target in the same project file.
            container = PBXContainerItemProxy(
                {
                    "containerPortal": pbxproject,
                    "proxyType": 1,
                    "remoteGlobalIDString": other,
                    "remoteInfo": other.Name(),
                }
            )
            dependency = PBXTargetDependency(
                {"target": other, "targetProxy": container}
            )
            self.AppendProperty("dependencies", dependency)
        else:
            # Add a dependency to a target in a different project file.
            other_project_ref = pbxproject.AddOrGetProjectReference(other_pbxproject)[1]
            container = PBXContainerItemProxy(
                {
                    "containerPortal": other_project_ref,
                    "proxyType": 1,
                    "remoteGlobalIDString": other,
                    "remoteInfo": other.Name(),
                }
            )
            dependency = PBXTargetDependency(
                {"name": other.Name(), "targetProxy": container}
            )
            self.AppendProperty("dependencies", dependency)

    # Proxy all of these through to the build configuration list.

    def ConfigurationNamed(self, name):
        return self._properties["buildConfigurationList"].ConfigurationNamed(name)

    def DefaultConfiguration(self):
        return self._properties["buildConfigurationList"].DefaultConfiguration()

    def HasBuildSetting(self, key):
        return self._properties["buildConfigurationList"].HasBuildSetting(key)

    def GetBuildSetting(self, key):
        return self._properties["buildConfigurationList"].GetBuildSetting(key)

    def SetBuildSetting(self, key, value):
        return self._properties["buildConfigurationList"].SetBuildSetting(key, value)

    def AppendBuildSetting(self, key, value):
        return self._properties["buildConfigurationList"].AppendBuildSetting(key, value)

    def DelBuildSetting(self, key):
        return self._properties["buildConfigurationList"].DelBuildSetting(key)


# Redefine the type of the "target" property.  See PBXTargetDependency._schema
# above.
PBXTargetDependency._schema["target"][1] = XCTarget


class PBXNativeTarget(XCTarget):
    # buildPhases is overridden in the schema to be able to set defaults.
    #
    # NOTE: Contrary to most objects, it is advisable to set parent when
    # constructing PBXNativeTarget.  A parent of an XCTarget must be a PBXProject
    # object.  A parent reference is required for a PBXNativeTarget during
    # construction to be able to set up the target defaults for productReference,
    # because a PBXBuildFile object must be created for the target and it must
    # be added to the PBXProject's mainGroup hierarchy.
    _schema = XCTarget._schema.copy()
    _schema.update(
        {
            "buildPhases": [
                1,
                XCBuildPhase,
                1,
                1,
                [PBXSourcesBuildPhase(), PBXFrameworksBuildPhase()],
            ],
            "buildRules": [1, PBXBuildRule, 1, 1, []],
            "productReference": [0, PBXFileReference, 0, 1],
            "productType": [0, str, 0, 1],
        }
    )

    # Mapping from Xcode product-types to settings.  The settings are:
    #  filetype : used for explicitFileType in the project file
    #  prefix : the prefix for the file name
    #  suffix : the suffix for the file name
    _product_filetypes = {
        "com.apple.product-type.application": ["wrapper.application", "", ".app"],
        "com.apple.product-type.application.watchapp": [
            "wrapper.application",
            "",
            ".app",
        ],
        "com.apple.product-type.watchkit-extension": [
            "wrapper.app-extension",
            "",
            ".appex",
        ],
        "com.apple.product-type.app-extension": ["wrapper.app-extension", "", ".appex"],
        "com.apple.product-type.bundle": ["wrapper.cfbundle", "", ".bundle"],
        "com.apple.product-type.framework": ["wrapper.framework", "", ".framework"],
        "com.apple.product-type.library.dynamic": [
            "compiled.mach-o.dylib",
            "lib",
            ".dylib",
        ],
        "com.apple.product-type.library.static": ["archive.ar", "lib", ".a"],
        "com.apple.product-type.tool": ["compiled.mach-o.executable", "", ""],
        "com.apple.product-type.bundle.unit-test": ["wrapper.cfbundle", "", ".xctest"],
        "com.apple.product-type.bundle.ui-testing": ["wrapper.cfbundle", "", ".xctest"],
        "com.googlecode.gyp.xcode.bundle": ["compiled.mach-o.dylib", "", ".so"],
        "com.apple.product-type.kernel-extension": ["wrapper.kext", "", ".kext"],
    }

    def __init__(
        self,
        properties=None,
        id=None,
        parent=None,
        force_outdir=None,
        force_prefix=None,
        force_extension=None,
    ):
        # super
        XCTarget.__init__(self, properties, id, parent)

        if (
            "productName" in self._properties
            and "productType" in self._properties
            and "productReference" not in self._properties
            and self._properties["productType"] in self._product_filetypes
        ):
            products_group = None
            pbxproject = self.PBXProjectAncestor()
            if pbxproject is not None:
                products_group = pbxproject.ProductsGroup()

            if products_group is not None:
                (filetype, prefix, suffix) = self._product_filetypes[
                    self._properties["productType"]
                ]
                # Xcode does not have a distinct type for loadable modules that are
                # pure BSD targets (not in a bundle wrapper). GYP allows such modules
                # to be specified by setting a target type to loadable_module without
                # having mac_bundle set. These are mapped to the pseudo-product type
                # com.googlecode.gyp.xcode.bundle.
                #
                # By picking up this special type and converting it to a dynamic
                # library (com.apple.product-type.library.dynamic) with fix-ups,
                # single-file loadable modules can be produced.
                #
                # MACH_O_TYPE is changed to mh_bundle to produce the proper file type
                # (as opposed to mh_dylib). In order for linking to succeed,
                # DYLIB_CURRENT_VERSION and DYLIB_COMPATIBILITY_VERSION must be
                # cleared. They are meaningless for type mh_bundle.
                #
                # Finally, the .so extension is forcibly applied over the default
                # (.dylib), unless another forced extension is already selected.
                # .dylib is plainly wrong, and .bundle is used by loadable_modules in
                # bundle wrappers (com.apple.product-type.bundle). .so seems an odd
                # choice because it's used as the extension on many other systems that
                # don't distinguish between linkable shared libraries and non-linkable
                # loadable modules, but there's precedent: Python loadable modules on
                # Mac OS X use an .so extension.
                if self._properties["productType"] == "com.googlecode.gyp.xcode.bundle":
                    self._properties[
                        "productType"
                    ] = "com.apple.product-type.library.dynamic"
                    self.SetBuildSetting("MACH_O_TYPE", "mh_bundle")
                    self.SetBuildSetting("DYLIB_CURRENT_VERSION", "")
                    self.SetBuildSetting("DYLIB_COMPATIBILITY_VERSION", "")
                    if force_extension is None:
                        force_extension = suffix[1:]

                if (
                    self._properties["productType"]
                    == "com.apple.product-type-bundle.unit.test"
                    or self._properties["productType"]
                    == "com.apple.product-type-bundle.ui-testing"
                ):
                    if force_extension is None:
                        force_extension = suffix[1:]

                if force_extension is not None:
                    # If it's a wrapper (bundle), set WRAPPER_EXTENSION.
                    # Extension override.
                    suffix = "." + force_extension
                    if filetype.startswith("wrapper."):
                        self.SetBuildSetting("WRAPPER_EXTENSION", force_extension)
                    else:
                        self.SetBuildSetting("EXECUTABLE_EXTENSION", force_extension)

                    if filetype.startswith("compiled.mach-o.executable"):
                        product_name = self._properties["productName"]
                        product_name += suffix
                        suffix = ""
                        self.SetProperty("productName", product_name)
                        self.SetBuildSetting("PRODUCT_NAME", product_name)

                # Xcode handles most prefixes based on the target type, however there
                # are exceptions.  If a "BSD Dynamic Library" target is added in the
                # Xcode UI, Xcode sets EXECUTABLE_PREFIX.  This check duplicates that
                # behavior.
                if force_prefix is not None:
                    prefix = force_prefix
                if filetype.startswith("wrapper."):
                    self.SetBuildSetting("WRAPPER_PREFIX", prefix)
                else:
                    self.SetBuildSetting("EXECUTABLE_PREFIX", prefix)

                if force_outdir is not None:
                    self.SetBuildSetting("TARGET_BUILD_DIR", force_outdir)

                # TODO(tvl): Remove the below hack.
                #    http://code.google.com/p/gyp/issues/detail?id=122

                # Some targets include the prefix in the target_name.  These targets
                # really should just add a product_name setting that doesn't include
                # the prefix.  For example:
                #  target_name = 'libevent', product_name = 'event'
                # This check cleans up for them.
                product_name = self._properties["productName"]
                prefix_len = len(prefix)
                if prefix_len and (product_name[:prefix_len] == prefix):
                    product_name = product_name[prefix_len:]
                    self.SetProperty("productName", product_name)
                    self.SetBuildSetting("PRODUCT_NAME", product_name)

                ref_props = {
                    "explicitFileType": filetype,
                    "includeInIndex": 0,
                    "path": prefix + product_name + suffix,
                    "sourceTree": "BUILT_PRODUCTS_DIR",
                }
                file_ref = PBXFileReference(ref_props)
                products_group.AppendChild(file_ref)
                self.SetProperty("productReference", file_ref)

    def GetBuildPhaseByType(self, type):
        if "buildPhases" not in self._properties:
            return None

        the_phase = None
        for phase in self._properties["buildPhases"]:
            if isinstance(phase, type):
                # Some phases may be present in multiples in a well-formed project file,
                # but phases like PBXSourcesBuildPhase may only be present singly, and
                # this function is intended as an aid to GetBuildPhaseByType.  Loop
                # over the entire list of phases and assert if more than one of the
                # desired type is found.
                assert the_phase is None
                the_phase = phase

        return the_phase

    def HeadersPhase(self):
        headers_phase = self.GetBuildPhaseByType(PBXHeadersBuildPhase)
        if headers_phase is None:
            headers_phase = PBXHeadersBuildPhase()

            # The headers phase should come before the resources, sources, and
            # frameworks phases, if any.
            insert_at = len(self._properties["buildPhases"])
            for index, phase in enumerate(self._properties["buildPhases"]):
                if (
                    isinstance(phase, PBXResourcesBuildPhase)
                    or isinstance(phase, PBXSourcesBuildPhase)
                    or isinstance(phase, PBXFrameworksBuildPhase)
                ):
                    insert_at = index
                    break

            self._properties["buildPhases"].insert(insert_at, headers_phase)
            headers_phase.parent = self

        return headers_phase

    def ResourcesPhase(self):
        resources_phase = self.GetBuildPhaseByType(PBXResourcesBuildPhase)
        if resources_phase is None:
            resources_phase = PBXResourcesBuildPhase()

            # The resources phase should come before the sources and frameworks
            # phases, if any.
            insert_at = len(self._properties["buildPhases"])
            for index, phase in enumerate(self._properties["buildPhases"]):
                if isinstance(phase, PBXSourcesBuildPhase) or isinstance(
                    phase, PBXFrameworksBuildPhase
                ):
                    insert_at = index
                    break

            self._properties["buildPhases"].insert(insert_at, resources_phase)
            resources_phase.parent = self

        return resources_phase

    def SourcesPhase(self):
        sources_phase = self.GetBuildPhaseByType(PBXSourcesBuildPhase)
        if sources_phase is None:
            sources_phase = PBXSourcesBuildPhase()
            self.AppendProperty("buildPhases", sources_phase)

        return sources_phase

    def FrameworksPhase(self):
        frameworks_phase = self.GetBuildPhaseByType(PBXFrameworksBuildPhase)
        if frameworks_phase is None:
            frameworks_phase = PBXFrameworksBuildPhase()
            self.AppendProperty("buildPhases", frameworks_phase)

        return frameworks_phase

    def AddDependency(self, other):
        # super
        XCTarget.AddDependency(self, other)

        static_library_type = "com.apple.product-type.library.static"
        shared_library_type = "com.apple.product-type.library.dynamic"
        framework_type = "com.apple.product-type.framework"
        if (
            isinstance(other, PBXNativeTarget)
            and "productType" in self._properties
            and self._properties["productType"] != static_library_type
            and "productType" in other._properties
            and (
                other._properties["productType"] == static_library_type
                or (
                    (
                        other._properties["productType"] == shared_library_type
                        or other._properties["productType"] == framework_type
                    )
                    and (
                        (not other.HasBuildSetting("MACH_O_TYPE"))
                        or other.GetBuildSetting("MACH_O_TYPE") != "mh_bundle"
                    )
                )
            )
        ):

            file_ref = other.GetProperty("productReference")

            pbxproject = self.PBXProjectAncestor()
            other_pbxproject = other.PBXProjectAncestor()
            if pbxproject != other_pbxproject:
                other_project_product_group = pbxproject.AddOrGetProjectReference(
                    other_pbxproject
                )[0]
                file_ref = other_project_product_group.GetChildByRemoteObject(file_ref)

            self.FrameworksPhase().AppendProperty(
                "files", PBXBuildFile({"fileRef": file_ref})
            )


class PBXAggregateTarget(XCTarget):
    pass


class PBXProject(XCContainerPortal):
    # A PBXProject is really just an XCObject, the XCContainerPortal thing is
    # just to allow PBXProject to be used in the containerPortal property of
    # PBXContainerItemProxy.
    """

  Attributes:
    path: "sample.xcodeproj".  TODO(mark) Document me!
    _other_pbxprojects: A dictionary, keyed by other PBXProject objects.  Each
                        value is a reference to the dict in the
                        projectReferences list associated with the keyed
                        PBXProject.
  """

    _schema = XCContainerPortal._schema.copy()
    _schema.update(
        {
            "attributes": [0, dict, 0, 0],
            "buildConfigurationList": [
                0,
                XCConfigurationList,
                1,
                1,
                XCConfigurationList(),
            ],
            "compatibilityVersion": [0, str, 0, 1, "Xcode 3.2"],
            "hasScannedForEncodings": [0, int, 0, 1, 1],
            "mainGroup": [0, PBXGroup, 1, 1, PBXGroup()],
            "projectDirPath": [0, str, 0, 1, ""],
            "projectReferences": [1, dict, 0, 0],
            "projectRoot": [0, str, 0, 1, ""],
            "targets": [1, XCTarget, 1, 1, []],
        }
    )

    def __init__(self, properties=None, id=None, parent=None, path=None):
        self.path = path
        self._other_pbxprojects = {}
        # super
        return XCContainerPortal.__init__(self, properties, id, parent)

    def Name(self):
        name = self.path
        if name[-10:] == ".xcodeproj":
            name = name[:-10]
        return posixpath.basename(name)

    def Path(self):
        return self.path

    def Comment(self):
        return "Project object"

    def Children(self):
        # super
        children = XCContainerPortal.Children(self)

        # Add children that the schema doesn't know about.  Maybe there's a more
        # elegant way around this, but this is the only case where we need to own
        # objects in a dictionary (that is itself in a list), and three lines for
        # a one-off isn't that big a deal.
        if "projectReferences" in self._properties:
            for reference in self._properties["projectReferences"]:
                children.append(reference["ProductGroup"])

        return children

    def PBXProjectAncestor(self):
        return self

    def _GroupByName(self, name):
        if "mainGroup" not in self._properties:
            self.SetProperty("mainGroup", PBXGroup())

        main_group = self._properties["mainGroup"]
        group = main_group.GetChildByName(name)
        if group is None:
            group = PBXGroup({"name": name})
            main_group.AppendChild(group)

        return group

    # SourceGroup and ProductsGroup are created by default in Xcode's own
    # templates.
    def SourceGroup(self):
        return self._GroupByName("Source")

    def ProductsGroup(self):
        return self._GroupByName("Products")

    # IntermediatesGroup is used to collect source-like files that are generated
    # by rules or script phases and are placed in intermediate directories such
    # as DerivedSources.
    def IntermediatesGroup(self):
        return self._GroupByName("Intermediates")

    # FrameworksGroup and ProjectsGroup are top-level groups used to collect
    # frameworks and projects.
    def FrameworksGroup(self):
        return self._GroupByName("Frameworks")

    def ProjectsGroup(self):
        return self._GroupByName("Projects")

    def RootGroupForPath(self, path):
        """Returns a PBXGroup child of this object to which path should be added.

    This method is intended to choose between SourceGroup and
    IntermediatesGroup on the basis of whether path is present in a source
    directory or an intermediates directory.  For the purposes of this
    determination, any path located within a derived file directory such as
    PROJECT_DERIVED_FILE_DIR is treated as being in an intermediates
    directory.

    The returned value is a two-element tuple.  The first element is the
    PBXGroup, and the second element specifies whether that group should be
    organized hierarchically (True) or as a single flat list (False).
    """

        # TODO(mark): make this a class variable and bind to self on call?
        # Also, this list is nowhere near exhaustive.
        # INTERMEDIATE_DIR and SHARED_INTERMEDIATE_DIR are used by
        # gyp.generator.xcode.  There should probably be some way for that module
        # to push the names in, rather than having to hard-code them here.
        source_tree_groups = {
            "DERIVED_FILE_DIR": (self.IntermediatesGroup, True),
            "INTERMEDIATE_DIR": (self.IntermediatesGroup, True),
            "PROJECT_DERIVED_FILE_DIR": (self.IntermediatesGroup, True),
            "SHARED_INTERMEDIATE_DIR": (self.IntermediatesGroup, True),
        }

        (source_tree, path) = SourceTreeAndPathFromPath(path)
        if source_tree is not None and source_tree in source_tree_groups:
            (group_func, hierarchical) = source_tree_groups[source_tree]
            group = group_func()
            return (group, hierarchical)

        # TODO(mark): make additional choices based on file extension.

        return (self.SourceGroup(), True)

    def AddOrGetFileInRootGroup(self, path):
        """Returns a PBXFileReference corresponding to path in the correct group
    according to RootGroupForPath's heuristics.

    If an existing PBXFileReference for path exists, it will be returned.
    Otherwise, one will be created and returned.
    """

        (group, hierarchical) = self.RootGroupForPath(path)
        return group.AddOrGetFileByPath(path, hierarchical)

    def RootGroupsTakeOverOnlyChildren(self, recurse=False):
        """Calls TakeOverOnlyChild for all groups in the main group."""

        for group in self._properties["mainGroup"]._properties["children"]:
            if isinstance(group, PBXGroup):
                group.TakeOverOnlyChild(recurse)

    def SortGroups(self):
        # Sort the children of the mainGroup (like "Source" and "Products")
        # according to their defined order.
        self._properties["mainGroup"]._properties["children"] = sorted(
            self._properties["mainGroup"]._properties["children"],
            key=cmp_to_key(lambda x, y: x.CompareRootGroup(y)),
        )

        # Sort everything else by putting group before files, and going
        # alphabetically by name within sections of groups and files.  SortGroup
        # is recursive.
        for group in self._properties["mainGroup"]._properties["children"]:
            if not isinstance(group, PBXGroup):
                continue

            if group.Name() == "Products":
                # The Products group is a special case.  Instead of sorting
                # alphabetically, sort things in the order of the targets that
                # produce the products.  To do this, just build up a new list of
                # products based on the targets.
                products = []
                for target in self._properties["targets"]:
                    if not isinstance(target, PBXNativeTarget):
                        continue
                    product = target._properties["productReference"]
                    # Make sure that the product is already in the products group.
                    assert product in group._properties["children"]
                    products.append(product)

                # Make sure that this process doesn't miss anything that was already
                # in the products group.
                assert len(products) == len(group._properties["children"])
                group._properties["children"] = products
            else:
                group.SortGroup()

    def AddOrGetProjectReference(self, other_pbxproject):
        """Add a reference to another project file (via PBXProject object) to this
    one.

    Returns [ProductGroup, ProjectRef].  ProductGroup is a PBXGroup object in
    this project file that contains a PBXReferenceProxy object for each
    product of each PBXNativeTarget in the other project file.  ProjectRef is
    a PBXFileReference to the other project file.

    If this project file already references the other project file, the
    existing ProductGroup and ProjectRef are returned.  The ProductGroup will
    still be updated if necessary.
    """

        if "projectReferences" not in self._properties:
            self._properties["projectReferences"] = []

        product_group = None
        project_ref = None

        if other_pbxproject not in self._other_pbxprojects:
            # This project file isn't yet linked to the other one.  Establish the
            # link.
            product_group = PBXGroup({"name": "Products"})

            # ProductGroup is strong.
            product_group.parent = self

            # There's nothing unique about this PBXGroup, and if left alone, it will
            # wind up with the same set of hashables as all other PBXGroup objects
            # owned by the projectReferences list.  Add the hashables of the
            # remote PBXProject that it's related to.
            product_group._hashables.extend(other_pbxproject.Hashables())

            # The other project reports its path as relative to the same directory
            # that this project's path is relative to.  The other project's path
            # is not necessarily already relative to this project.  Figure out the
            # pathname that this project needs to use to refer to the other one.
            this_path = posixpath.dirname(self.Path())
            projectDirPath = self.GetProperty("projectDirPath")
            if projectDirPath:
                if posixpath.isabs(projectDirPath[0]):
                    this_path = projectDirPath
                else:
                    this_path = posixpath.join(this_path, projectDirPath)
            other_path = gyp.common.RelativePath(other_pbxproject.Path(), this_path)

            # ProjectRef is weak (it's owned by the mainGroup hierarchy).
            project_ref = PBXFileReference(
                {
                    "lastKnownFileType": "wrapper.pb-project",
                    "path": other_path,
                    "sourceTree": "SOURCE_ROOT",
                }
            )
            self.ProjectsGroup().AppendChild(project_ref)

            ref_dict = {"ProductGroup": product_group, "ProjectRef": project_ref}
            self._other_pbxprojects[other_pbxproject] = ref_dict
            self.AppendProperty("projectReferences", ref_dict)

            # Xcode seems to sort this list case-insensitively
            self._properties["projectReferences"] = sorted(
                self._properties["projectReferences"],
                key=lambda x: x["ProjectRef"].Name().lower
            )
        else:
            # The link already exists.  Pull out the relevnt data.
            project_ref_dict = self._other_pbxprojects[other_pbxproject]
            product_group = project_ref_dict["ProductGroup"]
            project_ref = project_ref_dict["ProjectRef"]

        self._SetUpProductReferences(other_pbxproject, product_group, project_ref)

        inherit_unique_symroot = self._AllSymrootsUnique(other_pbxproject, False)
        targets = other_pbxproject.GetProperty("targets")
        if all(self._AllSymrootsUnique(t, inherit_unique_symroot) for t in targets):
            dir_path = project_ref._properties["path"]
            product_group._hashables.extend(dir_path)

        return [product_group, project_ref]

    def _AllSymrootsUnique(self, target, inherit_unique_symroot):
        # Returns True if all configurations have a unique 'SYMROOT' attribute.
        # The value of inherit_unique_symroot decides, if a configuration is assumed
        # to inherit a unique 'SYMROOT' attribute from its parent, if it doesn't
        # define an explicit value for 'SYMROOT'.
        symroots = self._DefinedSymroots(target)
        for s in self._DefinedSymroots(target):
            if (
                s is not None
                and not self._IsUniqueSymrootForTarget(s)
                or s is None
                and not inherit_unique_symroot
            ):
                return False
        return True if symroots else inherit_unique_symroot

    def _DefinedSymroots(self, target):
        # Returns all values for the 'SYMROOT' attribute defined in all
        # configurations for this target. If any configuration doesn't define the
        # 'SYMROOT' attribute, None is added to the returned set. If all
        # configurations don't define the 'SYMROOT' attribute, an empty set is
        # returned.
        config_list = target.GetProperty("buildConfigurationList")
        symroots = set()
        for config in config_list.GetProperty("buildConfigurations"):
            setting = config.GetProperty("buildSettings")
            if "SYMROOT" in setting:
                symroots.add(setting["SYMROOT"])
            else:
                symroots.add(None)
        if len(symroots) == 1 and None in symroots:
            return set()
        return symroots

    def _IsUniqueSymrootForTarget(self, symroot):
        # This method returns True if all configurations in target contain a
        # 'SYMROOT' attribute that is unique for the given target. A value is
        # unique, if the Xcode macro '$SRCROOT' appears in it in any form.
        uniquifier = ["$SRCROOT", "$(SRCROOT)"]
        if any(x in symroot for x in uniquifier):
            return True
        return False

    def _SetUpProductReferences(self, other_pbxproject, product_group, project_ref):
        # TODO(mark): This only adds references to products in other_pbxproject
        # when they don't exist in this pbxproject.  Perhaps it should also
        # remove references from this pbxproject that are no longer present in
        # other_pbxproject.  Perhaps it should update various properties if they
        # change.
        for target in other_pbxproject._properties["targets"]:
            if not isinstance(target, PBXNativeTarget):
                continue

            other_fileref = target._properties["productReference"]
            if product_group.GetChildByRemoteObject(other_fileref) is None:
                # Xcode sets remoteInfo to the name of the target and not the name
                # of its product, despite this proxy being a reference to the product.
                container_item = PBXContainerItemProxy(
                    {
                        "containerPortal": project_ref,
                        "proxyType": 2,
                        "remoteGlobalIDString": other_fileref,
                        "remoteInfo": target.Name(),
                    }
                )
                # TODO(mark): Does sourceTree get copied straight over from the other
                # project?  Can the other project ever have lastKnownFileType here
                # instead of explicitFileType?  (Use it if so?)  Can path ever be
                # unset?  (I don't think so.)  Can other_fileref have name set, and
                # does it impact the PBXReferenceProxy if so?  These are the questions
                # that perhaps will be answered one day.
                reference_proxy = PBXReferenceProxy(
                    {
                        "fileType": other_fileref._properties["explicitFileType"],
                        "path": other_fileref._properties["path"],
                        "sourceTree": other_fileref._properties["sourceTree"],
                        "remoteRef": container_item,
                    }
                )

                product_group.AppendChild(reference_proxy)

    def SortRemoteProductReferences(self):
        # For each remote project file, sort the associated ProductGroup in the
        # same order that the targets are sorted in the remote project file.  This
        # is the sort order used by Xcode.

        def CompareProducts(x, y, remote_products):
            # x and y are PBXReferenceProxy objects.  Go through their associated
            # PBXContainerItem to get the remote PBXFileReference, which will be
            # present in the remote_products list.
            x_remote = x._properties["remoteRef"]._properties["remoteGlobalIDString"]
            y_remote = y._properties["remoteRef"]._properties["remoteGlobalIDString"]
            x_index = remote_products.index(x_remote)
            y_index = remote_products.index(y_remote)

            # Use the order of each remote PBXFileReference in remote_products to
            # determine the sort order.
            return cmp(x_index, y_index)

        for other_pbxproject, ref_dict in self._other_pbxprojects.items():
            # Build up a list of products in the remote project file, ordered the
            # same as the targets that produce them.
            remote_products = []
            for target in other_pbxproject._properties["targets"]:
                if not isinstance(target, PBXNativeTarget):
                    continue
                remote_products.append(target._properties["productReference"])

            # Sort the PBXReferenceProxy children according to the list of remote
            # products.
            product_group = ref_dict["ProductGroup"]
            product_group._properties["children"] = sorted(
                product_group._properties["children"],
                key=cmp_to_key(
                    lambda x, y, rp=remote_products: CompareProducts(x, y, rp)),
            )


class XCProjectFile(XCObject):
    _schema = XCObject._schema.copy()
    _schema.update(
        {
            "archiveVersion": [0, int, 0, 1, 1],
            "classes": [0, dict, 0, 1, {}],
            "objectVersion": [0, int, 0, 1, 46],
            "rootObject": [0, PBXProject, 1, 1],
        }
    )

    def ComputeIDs(self, recursive=True, overwrite=True, hash=None):
        # Although XCProjectFile is implemented here as an XCObject, it's not a
        # proper object in the Xcode sense, and it certainly doesn't have its own
        # ID.  Pass through an attempt to update IDs to the real root object.
        if recursive:
            self._properties["rootObject"].ComputeIDs(recursive, overwrite, hash)

    def Print(self, file=sys.stdout):
        self.VerifyHasRequiredProperties()

        # Add the special "objects" property, which will be caught and handled
        # separately during printing.  This structure allows a fairly standard
        # loop do the normal printing.
        self._properties["objects"] = {}
        self._XCPrint(file, 0, "// !$*UTF8*$!\n")
        if self._should_print_single_line:
            self._XCPrint(file, 0, "{ ")
        else:
            self._XCPrint(file, 0, "{\n")
        for property, value in sorted(
            self._properties.items()
        ):
            if property == "objects":
                self._PrintObjects(file)
            else:
                self._XCKVPrint(file, 1, property, value)
        self._XCPrint(file, 0, "}\n")
        del self._properties["objects"]

    def _PrintObjects(self, file):
        if self._should_print_single_line:
            self._XCPrint(file, 0, "objects = {")
        else:
            self._XCPrint(file, 1, "objects = {\n")

        objects_by_class = {}
        for object in self.Descendants():
            if object == self:
                continue
            class_name = object.__class__.__name__
            if class_name not in objects_by_class:
                objects_by_class[class_name] = []
            objects_by_class[class_name].append(object)

        for class_name in sorted(objects_by_class):
            self._XCPrint(file, 0, "\n")
            self._XCPrint(file, 0, "/* Begin " + class_name + " section */\n")
            for object in sorted(
                objects_by_class[class_name], key=attrgetter("id")
            ):
                object.Print(file)
            self._XCPrint(file, 0, "/* End " + class_name + " section */\n")

        if self._should_print_single_line:
            self._XCPrint(file, 0, "}; ")
        else:
            self._XCPrint(file, 1, "};\n")
# Copyright (c) 2011 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Applies a fix to CR LF TAB handling in xml.dom.

Fixes this: http://code.google.com/p/chromium/issues/detail?id=76293
Working around this: http://bugs.python.org/issue5752
TODO(bradnelson): Consider dropping this when we drop XP support.
"""


import xml.dom.minidom


def _Replacement_write_data(writer, data, is_attrib=False):
    """Writes datachars to writer."""
    data = data.replace("&", "&amp;").replace("<", "&lt;")
    data = data.replace('"', "&quot;").replace(">", "&gt;")
    if is_attrib:
        data = data.replace("\r", "&#xD;").replace("\n", "&#xA;").replace("\t", "&#x9;")
    writer.write(data)


def _Replacement_writexml(self, writer, indent="", addindent="", newl=""):
    # indent = current indentation
    # addindent = indentation to add to higher levels
    # newl = newline string
    writer.write(indent + "<" + self.tagName)

    attrs = self._get_attributes()
    a_names = sorted(attrs.keys())

    for a_name in a_names:
        writer.write(' %s="' % a_name)
        _Replacement_write_data(writer, attrs[a_name].value, is_attrib=True)
        writer.write('"')
    if self.childNodes:
        writer.write(">%s" % newl)
        for node in self.childNodes:
            node.writexml(writer, indent + addindent, addindent, newl)
        writer.write(f"{indent}</{self.tagName}>{newl}")
    else:
        writer.write("/>%s" % newl)


class XmlFix:
    """Object to manage temporary patching of xml.dom.minidom."""

    def __init__(self):
        # Preserve current xml.dom.minidom functions.
        self.write_data = xml.dom.minidom._write_data
        self.writexml = xml.dom.minidom.Element.writexml
        # Inject replacement versions of a function and a method.
        xml.dom.minidom._write_data = _Replacement_write_data
        xml.dom.minidom.Element.writexml = _Replacement_writexml

    def Cleanup(self):
        if self.write_data:
            xml.dom.minidom._write_data = self.write_data
            xml.dom.minidom.Element.writexml = self.writexml
            self.write_data = None

    def __del__(self):
        self.Cleanup()
# Copyright (c) 2014 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""
This script is intended for use as a GYP_GENERATOR. It takes as input (by way of
the generator flag config_path) the path of a json file that dictates the files
and targets to search for. The following keys are supported:
files: list of paths (relative) of the files to search for.
test_targets: unqualified target names to search for. Any target in this list
that depends upon a file in |files| is output regardless of the type of target
or chain of dependencies.
additional_compile_targets: Unqualified targets to search for in addition to
test_targets. Targets in the combined list that depend upon a file in |files|
are not necessarily output. For example, if the target is of type none then the
target is not output (but one of the descendants of the target will be).

The following is output:
error: only supplied if there is an error.
compile_targets: minimal set of targets that directly or indirectly (for
  targets of type none) depend on the files in |files| and is one of the
  supplied targets or a target that one of the supplied targets depends on.
  The expectation is this set of targets is passed into a build step. This list
  always contains the output of test_targets as well.
test_targets: set of targets from the supplied |test_targets| that either
  directly or indirectly depend upon a file in |files|. This list if useful
  if additional processing needs to be done for certain targets after the
  build, such as running tests.
status: outputs one of three values: none of the supplied files were found,
  one of the include files changed so that it should be assumed everything
  changed (in this case test_targets and compile_targets are not output) or at
  least one file was found.
invalid_targets: list of supplied targets that were not found.

Example:
Consider a graph like the following:
  A     D
 / \
B   C
A depends upon both B and C, A is of type none and B and C are executables.
D is an executable, has no dependencies and nothing depends on it.
If |additional_compile_targets| = ["A"], |test_targets| = ["B", "C"] and
files = ["b.cc", "d.cc"] (B depends upon b.cc and D depends upon d.cc), then
the following is output:
|compile_targets| = ["B"] B must built as it depends upon the changed file b.cc
and the supplied target A depends upon it. A is not output as a build_target
as it is of type none with no rules and actions.
|test_targets| = ["B"] B directly depends upon the change file b.cc.

Even though the file d.cc, which D depends upon, has changed D is not output
as it was not supplied by way of |additional_compile_targets| or |test_targets|.

If the generator flag analyzer_output_path is specified, output is written
there. Otherwise output is written to stdout.

In Gyp the "all" target is shorthand for the root targets in the files passed
to gyp. For example, if file "a.gyp" contains targets "a1" and
"a2", and file "b.gyp" contains targets "b1" and "b2" and "a2" has a dependency
on "b2" and gyp is supplied "a.gyp" then "all" consists of "a1" and "a2".
Notice that "b1" and "b2" are not in the "all" target as "b.gyp" was not
directly supplied to gyp. OTOH if both "a.gyp" and "b.gyp" are supplied to gyp
then the "all" target includes "b1" and "b2".
"""


import gyp.common
import json
import os
import posixpath

debug = False

found_dependency_string = "Found dependency"
no_dependency_string = "No dependencies"
# Status when it should be assumed that everything has changed.
all_changed_string = "Found dependency (all)"

# MatchStatus is used indicate if and how a target depends upon the supplied
# sources.
# The target's sources contain one of the supplied paths.
MATCH_STATUS_MATCHES = 1
# The target has a dependency on another target that contains one of the
# supplied paths.
MATCH_STATUS_MATCHES_BY_DEPENDENCY = 2
# The target's sources weren't in the supplied paths and none of the target's
# dependencies depend upon a target that matched.
MATCH_STATUS_DOESNT_MATCH = 3
# The target doesn't contain the source, but the dependent targets have not yet
# been visited to determine a more specific status yet.
MATCH_STATUS_TBD = 4

generator_supports_multiple_toolsets = gyp.common.CrossCompileRequested()

generator_wants_static_library_dependencies_adjusted = False

generator_default_variables = {}
for dirname in [
    "INTERMEDIATE_DIR",
    "SHARED_INTERMEDIATE_DIR",
    "PRODUCT_DIR",
    "LIB_DIR",
    "SHARED_LIB_DIR",
]:
    generator_default_variables[dirname] = "!!!"

for unused in [
    "RULE_INPUT_PATH",
    "RULE_INPUT_ROOT",
    "RULE_INPUT_NAME",
    "RULE_INPUT_DIRNAME",
    "RULE_INPUT_EXT",
    "EXECUTABLE_PREFIX",
    "EXECUTABLE_SUFFIX",
    "STATIC_LIB_PREFIX",
    "STATIC_LIB_SUFFIX",
    "SHARED_LIB_PREFIX",
    "SHARED_LIB_SUFFIX",
    "CONFIGURATION_NAME",
]:
    generator_default_variables[unused] = ""


def _ToGypPath(path):
    """Converts a path to the format used by gyp."""
    if os.sep == "\\" and os.altsep == "/":
        return path.replace("\\", "/")
    return path


def _ResolveParent(path, base_path_components):
    """Resolves |path|, which starts with at least one '../'. Returns an empty
  string if the path shouldn't be considered. See _AddSources() for a
  description of |base_path_components|."""
    depth = 0
    while path.startswith("../"):
        depth += 1
        path = path[3:]
    # Relative includes may go outside the source tree. For example, an action may
    # have inputs in /usr/include, which are not in the source tree.
    if depth > len(base_path_components):
        return ""
    if depth == len(base_path_components):
        return path
    return (
        "/".join(base_path_components[0 : len(base_path_components) - depth])
        + "/"
        + path
    )


def _AddSources(sources, base_path, base_path_components, result):
    """Extracts valid sources from |sources| and adds them to |result|. Each
  source file is relative to |base_path|, but may contain '..'. To make
  resolving '..' easier |base_path_components| contains each of the
  directories in |base_path|. Additionally each source may contain variables.
  Such sources are ignored as it is assumed dependencies on them are expressed
  and tracked in some other means."""
    # NOTE: gyp paths are always posix style.
    for source in sources:
        if not len(source) or source.startswith("!!!") or source.startswith("$"):
            continue
        # variable expansion may lead to //.
        org_source = source
        source = source[0] + source[1:].replace("//", "/")
        if source.startswith("../"):
            source = _ResolveParent(source, base_path_components)
            if len(source):
                result.append(source)
            continue
        result.append(base_path + source)
        if debug:
            print("AddSource", org_source, result[len(result) - 1])


def _ExtractSourcesFromAction(action, base_path, base_path_components, results):
    if "inputs" in action:
        _AddSources(action["inputs"], base_path, base_path_components, results)


def _ToLocalPath(toplevel_dir, path):
    """Converts |path| to a path relative to |toplevel_dir|."""
    if path == toplevel_dir:
        return ""
    if path.startswith(toplevel_dir + "/"):
        return path[len(toplevel_dir) + len("/") :]
    return path


def _ExtractSources(target, target_dict, toplevel_dir):
    # |target| is either absolute or relative and in the format of the OS. Gyp
    # source paths are always posix. Convert |target| to a posix path relative to
    # |toplevel_dir_|. This is done to make it easy to build source paths.
    base_path = posixpath.dirname(_ToLocalPath(toplevel_dir, _ToGypPath(target)))
    base_path_components = base_path.split("/")

    # Add a trailing '/' so that _AddSources() can easily build paths.
    if len(base_path):
        base_path += "/"

    if debug:
        print("ExtractSources", target, base_path)

    results = []
    if "sources" in target_dict:
        _AddSources(target_dict["sources"], base_path, base_path_components, results)
    # Include the inputs from any actions. Any changes to these affect the
    # resulting output.
    if "actions" in target_dict:
        for action in target_dict["actions"]:
            _ExtractSourcesFromAction(action, base_path, base_path_components, results)
    if "rules" in target_dict:
        for rule in target_dict["rules"]:
            _ExtractSourcesFromAction(rule, base_path, base_path_components, results)

    return results


class Target:
    """Holds information about a particular target:
  deps: set of Targets this Target depends upon. This is not recursive, only the
    direct dependent Targets.
  match_status: one of the MatchStatus values.
  back_deps: set of Targets that have a dependency on this Target.
  visited: used during iteration to indicate whether we've visited this target.
    This is used for two iterations, once in building the set of Targets and
    again in _GetBuildTargets().
  name: fully qualified name of the target.
  requires_build: True if the target type is such that it needs to be built.
    See _DoesTargetTypeRequireBuild for details.
  added_to_compile_targets: used when determining if the target was added to the
    set of targets that needs to be built.
  in_roots: true if this target is a descendant of one of the root nodes.
  is_executable: true if the type of target is executable.
  is_static_library: true if the type of target is static_library.
  is_or_has_linked_ancestor: true if the target does a link (eg executable), or
    if there is a target in back_deps that does a link."""

    def __init__(self, name):
        self.deps = set()
        self.match_status = MATCH_STATUS_TBD
        self.back_deps = set()
        self.name = name
        # TODO(sky): I don't like hanging this off Target. This state is specific
        # to certain functions and should be isolated there.
        self.visited = False
        self.requires_build = False
        self.added_to_compile_targets = False
        self.in_roots = False
        self.is_executable = False
        self.is_static_library = False
        self.is_or_has_linked_ancestor = False


class Config:
    """Details what we're looking for
  files: set of files to search for
  targets: see file description for details."""

    def __init__(self):
        self.files = []
        self.targets = set()
        self.additional_compile_target_names = set()
        self.test_target_names = set()

    def Init(self, params):
        """Initializes Config. This is a separate method as it raises an exception
    if there is a parse error."""
        generator_flags = params.get("generator_flags", {})
        config_path = generator_flags.get("config_path", None)
        if not config_path:
            return
        try:
            f = open(config_path)
            config = json.load(f)
            f.close()
        except OSError:
            raise Exception("Unable to open file " + config_path)
        except ValueError as e:
            raise Exception("Unable to parse config file " + config_path + str(e))
        if not isinstance(config, dict):
            raise Exception("config_path must be a JSON file containing a dictionary")
        self.files = config.get("files", [])
        self.additional_compile_target_names = set(
            config.get("additional_compile_targets", [])
        )
        self.test_target_names = set(config.get("test_targets", []))


def _WasBuildFileModified(build_file, data, files, toplevel_dir):
    """Returns true if the build file |build_file| is either in |files| or
  one of the files included by |build_file| is in |files|. |toplevel_dir| is
  the root of the source tree."""
    if _ToLocalPath(toplevel_dir, _ToGypPath(build_file)) in files:
        if debug:
            print("gyp file modified", build_file)
        return True

    # First element of included_files is the file itself.
    if len(data[build_file]["included_files"]) <= 1:
        return False

    for include_file in data[build_file]["included_files"][1:]:
        # |included_files| are relative to the directory of the |build_file|.
        rel_include_file = _ToGypPath(
            gyp.common.UnrelativePath(include_file, build_file)
        )
        if _ToLocalPath(toplevel_dir, rel_include_file) in files:
            if debug:
                print(
                    "included gyp file modified, gyp_file=",
                    build_file,
                    "included file=",
                    rel_include_file,
                )
            return True
    return False


def _GetOrCreateTargetByName(targets, target_name):
    """Creates or returns the Target at targets[target_name]. If there is no
  Target for |target_name| one is created. Returns a tuple of whether a new
  Target was created and the Target."""
    if target_name in targets:
        return False, targets[target_name]
    target = Target(target_name)
    targets[target_name] = target
    return True, target


def _DoesTargetTypeRequireBuild(target_dict):
    """Returns true if the target type is such that it needs to be built."""
    # If a 'none' target has rules or actions we assume it requires a build.
    return bool(
        target_dict["type"] != "none"
        or target_dict.get("actions")
        or target_dict.get("rules")
    )


def _GenerateTargets(data, target_list, target_dicts, toplevel_dir, files, build_files):
    """Returns a tuple of the following:
  . A dictionary mapping from fully qualified name to Target.
  . A list of the targets that have a source file in |files|.
  . Targets that constitute the 'all' target. See description at top of file
    for details on the 'all' target.
  This sets the |match_status| of the targets that contain any of the source
  files in |files| to MATCH_STATUS_MATCHES.
  |toplevel_dir| is the root of the source tree."""
    # Maps from target name to Target.
    name_to_target = {}

    # Targets that matched.
    matching_targets = []

    # Queue of targets to visit.
    targets_to_visit = target_list[:]

    # Maps from build file to a boolean indicating whether the build file is in
    # |files|.
    build_file_in_files = {}

    # Root targets across all files.
    roots = set()

    # Set of Targets in |build_files|.
    build_file_targets = set()

    while len(targets_to_visit) > 0:
        target_name = targets_to_visit.pop()
        created_target, target = _GetOrCreateTargetByName(name_to_target, target_name)
        if created_target:
            roots.add(target)
        elif target.visited:
            continue

        target.visited = True
        target.requires_build = _DoesTargetTypeRequireBuild(target_dicts[target_name])
        target_type = target_dicts[target_name]["type"]
        target.is_executable = target_type == "executable"
        target.is_static_library = target_type == "static_library"
        target.is_or_has_linked_ancestor = (
            target_type == "executable" or target_type == "shared_library"
        )

        build_file = gyp.common.ParseQualifiedTarget(target_name)[0]
        if build_file not in build_file_in_files:
            build_file_in_files[build_file] = _WasBuildFileModified(
                build_file, data, files, toplevel_dir
            )

        if build_file in build_files:
            build_file_targets.add(target)

        # If a build file (or any of its included files) is modified we assume all
        # targets in the file are modified.
        if build_file_in_files[build_file]:
            print("matching target from modified build file", target_name)
            target.match_status = MATCH_STATUS_MATCHES
            matching_targets.append(target)
        else:
            sources = _ExtractSources(
                target_name, target_dicts[target_name], toplevel_dir
            )
            for source in sources:
                if _ToGypPath(os.path.normpath(source)) in files:
                    print("target", target_name, "matches", source)
                    target.match_status = MATCH_STATUS_MATCHES
                    matching_targets.append(target)
                    break

        # Add dependencies to visit as well as updating back pointers for deps.
        for dep in target_dicts[target_name].get("dependencies", []):
            targets_to_visit.append(dep)

            created_dep_target, dep_target = _GetOrCreateTargetByName(
                name_to_target, dep
            )
            if not created_dep_target:
                roots.discard(dep_target)

            target.deps.add(dep_target)
            dep_target.back_deps.add(target)

    return name_to_target, matching_targets, roots & build_file_targets


def _GetUnqualifiedToTargetMapping(all_targets, to_find):
    """Returns a tuple of the following:
  . mapping (dictionary) from unqualified name to Target for all the
    Targets in |to_find|.
  . any target names not found. If this is empty all targets were found."""
    result = {}
    if not to_find:
        return {}, []
    to_find = set(to_find)
    for target_name in all_targets.keys():
        extracted = gyp.common.ParseQualifiedTarget(target_name)
        if len(extracted) > 1 and extracted[1] in to_find:
            to_find.remove(extracted[1])
            result[extracted[1]] = all_targets[target_name]
            if not to_find:
                return result, []
    return result, [x for x in to_find]


def _DoesTargetDependOnMatchingTargets(target):
    """Returns true if |target| or any of its dependencies is one of the
  targets containing the files supplied as input to analyzer. This updates
  |matches| of the Targets as it recurses.
  target: the Target to look for."""
    if target.match_status == MATCH_STATUS_DOESNT_MATCH:
        return False
    if (
        target.match_status == MATCH_STATUS_MATCHES
        or target.match_status == MATCH_STATUS_MATCHES_BY_DEPENDENCY
    ):
        return True
    for dep in target.deps:
        if _DoesTargetDependOnMatchingTargets(dep):
            target.match_status = MATCH_STATUS_MATCHES_BY_DEPENDENCY
            print("\t", target.name, "matches by dep", dep.name)
            return True
    target.match_status = MATCH_STATUS_DOESNT_MATCH
    return False


def _GetTargetsDependingOnMatchingTargets(possible_targets):
    """Returns the list of Targets in |possible_targets| that depend (either
  directly on indirectly) on at least one of the targets containing the files
  supplied as input to analyzer.
  possible_targets: targets to search from."""
    found = []
    print("Targets that matched by dependency:")
    for target in possible_targets:
        if _DoesTargetDependOnMatchingTargets(target):
            found.append(target)
    return found


def _AddCompileTargets(target, roots, add_if_no_ancestor, result):
    """Recurses through all targets that depend on |target|, adding all targets
  that need to be built (and are in |roots|) to |result|.
  roots: set of root targets.
  add_if_no_ancestor: If true and there are no ancestors of |target| then add
  |target| to |result|. |target| must still be in |roots|.
  result: targets that need to be built are added here."""
    if target.visited:
        return

    target.visited = True
    target.in_roots = target in roots

    for back_dep_target in target.back_deps:
        _AddCompileTargets(back_dep_target, roots, False, result)
        target.added_to_compile_targets |= back_dep_target.added_to_compile_targets
        target.in_roots |= back_dep_target.in_roots
        target.is_or_has_linked_ancestor |= back_dep_target.is_or_has_linked_ancestor

    # Always add 'executable' targets. Even though they may be built by other
    # targets that depend upon them it makes detection of what is going to be
    # built easier.
    # And always add static_libraries that have no dependencies on them from
    # linkables. This is necessary as the other dependencies on them may be
    # static libraries themselves, which are not compile time dependencies.
    if target.in_roots and (
        target.is_executable
        or (
            not target.added_to_compile_targets
            and (add_if_no_ancestor or target.requires_build)
        )
        or (
            target.is_static_library
            and add_if_no_ancestor
            and not target.is_or_has_linked_ancestor
        )
    ):
        print(
            "\t\tadding to compile targets",
            target.name,
            "executable",
            target.is_executable,
            "added_to_compile_targets",
            target.added_to_compile_targets,
            "add_if_no_ancestor",
            add_if_no_ancestor,
            "requires_build",
            target.requires_build,
            "is_static_library",
            target.is_static_library,
            "is_or_has_linked_ancestor",
            target.is_or_has_linked_ancestor,
        )
        result.add(target)
        target.added_to_compile_targets = True


def _GetCompileTargets(matching_targets, supplied_targets):
    """Returns the set of Targets that require a build.
  matching_targets: targets that changed and need to be built.
  supplied_targets: set of targets supplied to analyzer to search from."""
    result = set()
    for target in matching_targets:
        print("finding compile targets for match", target.name)
        _AddCompileTargets(target, supplied_targets, True, result)
    return result


def _WriteOutput(params, **values):
    """Writes the output, either to stdout or a file is specified."""
    if "error" in values:
        print("Error:", values["error"])
    if "status" in values:
        print(values["status"])
    if "targets" in values:
        values["targets"].sort()
        print("Supplied targets that depend on changed files:")
        for target in values["targets"]:
            print("\t", target)
    if "invalid_targets" in values:
        values["invalid_targets"].sort()
        print("The following targets were not found:")
        for target in values["invalid_targets"]:
            print("\t", target)
    if "build_targets" in values:
        values["build_targets"].sort()
        print("Targets that require a build:")
        for target in values["build_targets"]:
            print("\t", target)
    if "compile_targets" in values:
        values["compile_targets"].sort()
        print("Targets that need to be built:")
        for target in values["compile_targets"]:
            print("\t", target)
    if "test_targets" in values:
        values["test_targets"].sort()
        print("Test targets:")
        for target in values["test_targets"]:
            print("\t", target)

    output_path = params.get("generator_flags", {}).get("analyzer_output_path", None)
    if not output_path:
        print(json.dumps(values))
        return
    try:
        f = open(output_path, "w")
        f.write(json.dumps(values) + "\n")
        f.close()
    except OSError as e:
        print("Error writing to output file", output_path, str(e))


def _WasGypIncludeFileModified(params, files):
    """Returns true if one of the files in |files| is in the set of included
  files."""
    if params["options"].includes:
        for include in params["options"].includes:
            if _ToGypPath(os.path.normpath(include)) in files:
                print("Include file modified, assuming all changed", include)
                return True
    return False


def _NamesNotIn(names, mapping):
    """Returns a list of the values in |names| that are not in |mapping|."""
    return [name for name in names if name not in mapping]


def _LookupTargets(names, mapping):
    """Returns a list of the mapping[name] for each value in |names| that is in
  |mapping|."""
    return [mapping[name] for name in names if name in mapping]


def CalculateVariables(default_variables, params):
    """Calculate additional variables for use in the build (called by gyp)."""
    flavor = gyp.common.GetFlavor(params)
    if flavor == "mac":
        default_variables.setdefault("OS", "mac")
    elif flavor == "win":
        default_variables.setdefault("OS", "win")
        gyp.msvs_emulation.CalculateCommonVariables(default_variables, params)
    else:
        operating_system = flavor
        if flavor == "android":
            operating_system = "linux"  # Keep this legacy behavior for now.
        default_variables.setdefault("OS", operating_system)


class TargetCalculator:
    """Calculates the matching test_targets and matching compile_targets."""

    def __init__(
        self,
        files,
        additional_compile_target_names,
        test_target_names,
        data,
        target_list,
        target_dicts,
        toplevel_dir,
        build_files,
    ):
        self._additional_compile_target_names = set(additional_compile_target_names)
        self._test_target_names = set(test_target_names)
        (
            self._name_to_target,
            self._changed_targets,
            self._root_targets,
        ) = _GenerateTargets(
            data, target_list, target_dicts, toplevel_dir, frozenset(files), build_files
        )
        (
            self._unqualified_mapping,
            self.invalid_targets,
        ) = _GetUnqualifiedToTargetMapping(
            self._name_to_target, self._supplied_target_names_no_all()
        )

    def _supplied_target_names(self):
        return self._additional_compile_target_names | self._test_target_names

    def _supplied_target_names_no_all(self):
        """Returns the supplied test targets without 'all'."""
        result = self._supplied_target_names()
        result.discard("all")
        return result

    def is_build_impacted(self):
        """Returns true if the supplied files impact the build at all."""
        return self._changed_targets

    def find_matching_test_target_names(self):
        """Returns the set of output test targets."""
        assert self.is_build_impacted()
        # Find the test targets first. 'all' is special cased to mean all the
        # root targets. To deal with all the supplied |test_targets| are expanded
        # to include the root targets during lookup. If any of the root targets
        # match, we remove it and replace it with 'all'.
        test_target_names_no_all = set(self._test_target_names)
        test_target_names_no_all.discard("all")
        test_targets_no_all = _LookupTargets(
            test_target_names_no_all, self._unqualified_mapping
        )
        test_target_names_contains_all = "all" in self._test_target_names
        if test_target_names_contains_all:
            test_targets = [
                x for x in (set(test_targets_no_all) | set(self._root_targets))
            ]
        else:
            test_targets = [x for x in test_targets_no_all]
        print("supplied test_targets")
        for target_name in self._test_target_names:
            print("\t", target_name)
        print("found test_targets")
        for target in test_targets:
            print("\t", target.name)
        print("searching for matching test targets")
        matching_test_targets = _GetTargetsDependingOnMatchingTargets(test_targets)
        matching_test_targets_contains_all = test_target_names_contains_all and set(
            matching_test_targets
        ) & set(self._root_targets)
        if matching_test_targets_contains_all:
            # Remove any of the targets for all that were not explicitly supplied,
            # 'all' is subsequentely added to the matching names below.
            matching_test_targets = [
                x for x in (set(matching_test_targets) & set(test_targets_no_all))
            ]
        print("matched test_targets")
        for target in matching_test_targets:
            print("\t", target.name)
        matching_target_names = [
            gyp.common.ParseQualifiedTarget(target.name)[1]
            for target in matching_test_targets
        ]
        if matching_test_targets_contains_all:
            matching_target_names.append("all")
            print("\tall")
        return matching_target_names

    def find_matching_compile_target_names(self):
        """Returns the set of output compile targets."""
        assert self.is_build_impacted()
        # Compile targets are found by searching up from changed targets.
        # Reset the visited status for _GetBuildTargets.
        for target in self._name_to_target.values():
            target.visited = False

        supplied_targets = _LookupTargets(
            self._supplied_target_names_no_all(), self._unqualified_mapping
        )
        if "all" in self._supplied_target_names():
            supplied_targets = [
                x for x in (set(supplied_targets) | set(self._root_targets))
            ]
        print("Supplied test_targets & compile_targets")
        for target in supplied_targets:
            print("\t", target.name)
        print("Finding compile targets")
        compile_targets = _GetCompileTargets(self._changed_targets, supplied_targets)
        return [
            gyp.common.ParseQualifiedTarget(target.name)[1]
            for target in compile_targets
        ]


def GenerateOutput(target_list, target_dicts, data, params):
    """Called by gyp as the final stage. Outputs results."""
    config = Config()
    try:
        config.Init(params)

        if not config.files:
            raise Exception(
                "Must specify files to analyze via config_path generator " "flag"
            )

        toplevel_dir = _ToGypPath(os.path.abspath(params["options"].toplevel_dir))
        if debug:
            print("toplevel_dir", toplevel_dir)

        if _WasGypIncludeFileModified(params, config.files):
            result_dict = {
                "status": all_changed_string,
                "test_targets": list(config.test_target_names),
                "compile_targets": list(
                    config.additional_compile_target_names | config.test_target_names
                ),
            }
            _WriteOutput(params, **result_dict)
            return

        calculator = TargetCalculator(
            config.files,
            config.additional_compile_target_names,
            config.test_target_names,
            data,
            target_list,
            target_dicts,
            toplevel_dir,
            params["build_files"],
        )
        if not calculator.is_build_impacted():
            result_dict = {
                "status": no_dependency_string,
                "test_targets": [],
                "compile_targets": [],
            }
            if calculator.invalid_targets:
                result_dict["invalid_targets"] = calculator.invalid_targets
            _WriteOutput(params, **result_dict)
            return

        test_target_names = calculator.find_matching_test_target_names()
        compile_target_names = calculator.find_matching_compile_target_names()
        found_at_least_one_target = compile_target_names or test_target_names
        result_dict = {
            "test_targets": test_target_names,
            "status": found_dependency_string
            if found_at_least_one_target
            else no_dependency_string,
            "compile_targets": list(set(compile_target_names) | set(test_target_names)),
        }
        if calculator.invalid_targets:
            result_dict["invalid_targets"] = calculator.invalid_targets
        _WriteOutput(params, **result_dict)

    except Exception as e:
        _WriteOutput(params, error=str(e))
# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Notes:
#
# This generates makefiles suitable for inclusion into the Android build system
# via an Android.mk file. It is based on make.py, the standard makefile
# generator.
#
# The code below generates a separate .mk file for each target, but
# all are sourced by the top-level GypAndroid.mk.  This means that all
# variables in .mk-files clobber one another, and furthermore that any
# variables set potentially clash with other Android build system variables.
# Try to avoid setting global variables where possible.


import gyp
import gyp.common
import gyp.generator.make as make  # Reuse global functions from make backend.
import os
import re
import subprocess

generator_default_variables = {
    "OS": "android",
    "EXECUTABLE_PREFIX": "",
    "EXECUTABLE_SUFFIX": "",
    "STATIC_LIB_PREFIX": "lib",
    "SHARED_LIB_PREFIX": "lib",
    "STATIC_LIB_SUFFIX": ".a",
    "SHARED_LIB_SUFFIX": ".so",
    "INTERMEDIATE_DIR": "$(gyp_intermediate_dir)",
    "SHARED_INTERMEDIATE_DIR": "$(gyp_shared_intermediate_dir)",
    "PRODUCT_DIR": "$(gyp_shared_intermediate_dir)",
    "SHARED_LIB_DIR": "$(builddir)/lib.$(TOOLSET)",
    "LIB_DIR": "$(obj).$(TOOLSET)",
    "RULE_INPUT_ROOT": "%(INPUT_ROOT)s",  # This gets expanded by Python.
    "RULE_INPUT_DIRNAME": "%(INPUT_DIRNAME)s",  # This gets expanded by Python.
    "RULE_INPUT_PATH": "$(RULE_SOURCES)",
    "RULE_INPUT_EXT": "$(suffix $<)",
    "RULE_INPUT_NAME": "$(notdir $<)",
    "CONFIGURATION_NAME": "$(GYP_CONFIGURATION)",
}

# Make supports multiple toolsets
generator_supports_multiple_toolsets = True


# Generator-specific gyp specs.
generator_additional_non_configuration_keys = [
    # Boolean to declare that this target does not want its name mangled.
    "android_unmangled_name",
    # Map of android build system variables to set.
    "aosp_build_settings",
]
generator_additional_path_sections = []
generator_extra_sources_for_rules = []


ALL_MODULES_FOOTER = """\
# "gyp_all_modules" is a concatenation of the "gyp_all_modules" targets from
# all the included sub-makefiles. This is just here to clarify.
gyp_all_modules:
"""

header = """\
# This file is generated by gyp; do not edit.

"""

# Map gyp target types to Android module classes.
MODULE_CLASSES = {
    "static_library": "STATIC_LIBRARIES",
    "shared_library": "SHARED_LIBRARIES",
    "executable": "EXECUTABLES",
}


def IsCPPExtension(ext):
    return make.COMPILABLE_EXTENSIONS.get(ext) == "cxx"


def Sourceify(path):
    """Convert a path to its source directory form. The Android backend does not
    support options.generator_output, so this function is a noop."""
    return path


# Map from qualified target to path to output.
# For Android, the target of these maps is a tuple ('static', 'modulename'),
# ('dynamic', 'modulename'), or ('path', 'some/path') instead of a string,
# since we link by module.
target_outputs = {}
# Map from qualified target to any linkable output.  A subset
# of target_outputs.  E.g. when mybinary depends on liba, we want to
# include liba in the linker line; when otherbinary depends on
# mybinary, we just want to build mybinary first.
target_link_deps = {}


class AndroidMkWriter:
    """AndroidMkWriter packages up the writing of one target-specific Android.mk.

    Its only real entry point is Write(), and is mostly used for namespacing.
    """

    def __init__(self, android_top_dir):
        self.android_top_dir = android_top_dir

    def Write(
        self,
        qualified_target,
        relative_target,
        base_path,
        output_filename,
        spec,
        configs,
        part_of_all,
        write_alias_target,
        sdk_version,
    ):
        """The main entry point: writes a .mk file for a single target.

        Arguments:
          qualified_target: target we're generating
          relative_target: qualified target name relative to the root
          base_path: path relative to source root we're building in, used to resolve
                     target-relative paths
          output_filename: output .mk file name to write
          spec, configs: gyp info
          part_of_all: flag indicating this target is part of 'all'
          write_alias_target: flag indicating whether to create short aliases for
                              this target
          sdk_version: what to emit for LOCAL_SDK_VERSION in output
        """
        gyp.common.EnsureDirExists(output_filename)

        self.fp = open(output_filename, "w")

        self.fp.write(header)

        self.qualified_target = qualified_target
        self.relative_target = relative_target
        self.path = base_path
        self.target = spec["target_name"]
        self.type = spec["type"]
        self.toolset = spec["toolset"]

        deps, link_deps = self.ComputeDeps(spec)

        # Some of the generation below can add extra output, sources, or
        # link dependencies.  All of the out params of the functions that
        # follow use names like extra_foo.
        extra_outputs = []
        extra_sources = []

        self.android_class = MODULE_CLASSES.get(self.type, "GYP")
        self.android_module = self.ComputeAndroidModule(spec)
        (self.android_stem, self.android_suffix) = self.ComputeOutputParts(spec)
        self.output = self.output_binary = self.ComputeOutput(spec)

        # Standard header.
        self.WriteLn("include $(CLEAR_VARS)\n")

        # Module class and name.
        self.WriteLn("LOCAL_MODULE_CLASS := " + self.android_class)
        self.WriteLn("LOCAL_MODULE := " + self.android_module)
        # Only emit LOCAL_MODULE_STEM if it's different to LOCAL_MODULE.
        # The library module classes fail if the stem is set. ComputeOutputParts
        # makes sure that stem == modulename in these cases.
        if self.android_stem != self.android_module:
            self.WriteLn("LOCAL_MODULE_STEM := " + self.android_stem)
        self.WriteLn("LOCAL_MODULE_SUFFIX := " + self.android_suffix)
        if self.toolset == "host":
            self.WriteLn("LOCAL_IS_HOST_MODULE := true")
            self.WriteLn("LOCAL_MULTILIB := $(GYP_HOST_MULTILIB)")
        elif sdk_version > 0:
            self.WriteLn(
                "LOCAL_MODULE_TARGET_ARCH := " "$(TARGET_$(GYP_VAR_PREFIX)ARCH)"
            )
            self.WriteLn("LOCAL_SDK_VERSION := %s" % sdk_version)

        # Grab output directories; needed for Actions and Rules.
        if self.toolset == "host":
            self.WriteLn(
                "gyp_intermediate_dir := "
                "$(call local-intermediates-dir,,$(GYP_HOST_VAR_PREFIX))"
            )
        else:
            self.WriteLn(
                "gyp_intermediate_dir := "
                "$(call local-intermediates-dir,,$(GYP_VAR_PREFIX))"
            )
        self.WriteLn(
            "gyp_shared_intermediate_dir := "
            "$(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX))"
        )
        self.WriteLn()

        # List files this target depends on so that actions/rules/copies/sources
        # can depend on the list.
        # TODO: doesn't pull in things through transitive link deps; needed?
        target_dependencies = [x[1] for x in deps if x[0] == "path"]
        self.WriteLn("# Make sure our deps are built first.")
        self.WriteList(
            target_dependencies, "GYP_TARGET_DEPENDENCIES", local_pathify=True
        )

        # Actions must come first, since they can generate more OBJs for use below.
        if "actions" in spec:
            self.WriteActions(spec["actions"], extra_sources, extra_outputs)

        # Rules must be early like actions.
        if "rules" in spec:
            self.WriteRules(spec["rules"], extra_sources, extra_outputs)

        if "copies" in spec:
            self.WriteCopies(spec["copies"], extra_outputs)

        # GYP generated outputs.
        self.WriteList(extra_outputs, "GYP_GENERATED_OUTPUTS", local_pathify=True)

        # Set LOCAL_ADDITIONAL_DEPENDENCIES so that Android's build rules depend
        # on both our dependency targets and our generated files.
        self.WriteLn("# Make sure our deps and generated files are built first.")
        self.WriteLn(
            "LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) "
            "$(GYP_GENERATED_OUTPUTS)"
        )
        self.WriteLn()

        # Sources.
        if spec.get("sources", []) or extra_sources:
            self.WriteSources(spec, configs, extra_sources)

        self.WriteTarget(
            spec, configs, deps, link_deps, part_of_all, write_alias_target
        )

        # Update global list of target outputs, used in dependency tracking.
        target_outputs[qualified_target] = ("path", self.output_binary)

        # Update global list of link dependencies.
        if self.type == "static_library":
            target_link_deps[qualified_target] = ("static", self.android_module)
        elif self.type == "shared_library":
            target_link_deps[qualified_target] = ("shared", self.android_module)

        self.fp.close()
        return self.android_module

    def WriteActions(self, actions, extra_sources, extra_outputs):
        """Write Makefile code for any 'actions' from the gyp input.

        extra_sources: a list that will be filled in with newly generated source
                       files, if any
        extra_outputs: a list that will be filled in with any outputs of these
                       actions (used to make other pieces dependent on these
                       actions)
        """
        for action in actions:
            name = make.StringToMakefileVariable(
                "{}_{}".format(self.relative_target, action["action_name"])
            )
            self.WriteLn('### Rules for action "%s":' % action["action_name"])
            inputs = action["inputs"]
            outputs = action["outputs"]

            # Build up a list of outputs.
            # Collect the output dirs we'll need.
            dirs = set()
            for out in outputs:
                if not out.startswith("$"):
                    print(
                        'WARNING: Action for target "%s" writes output to local path '
                        '"%s".' % (self.target, out)
                    )
                dir = os.path.split(out)[0]
                if dir:
                    dirs.add(dir)
            if int(action.get("process_outputs_as_sources", False)):
                extra_sources += outputs

            # Prepare the actual command.
            command = gyp.common.EncodePOSIXShellList(action["action"])
            if "message" in action:
                quiet_cmd = "Gyp action: %s ($@)" % action["message"]
            else:
                quiet_cmd = "Gyp action: %s ($@)" % name
            if len(dirs) > 0:
                command = "mkdir -p %s" % " ".join(dirs) + "; " + command

            cd_action = "cd $(gyp_local_path)/%s; " % self.path
            command = cd_action + command

            # The makefile rules are all relative to the top dir, but the gyp actions
            # are defined relative to their containing dir.  This replaces the gyp_*
            # variables for the action rule with an absolute version so that the
            # output goes in the right place.
            # Only write the gyp_* rules for the "primary" output (:1);
            # it's superfluous for the "extra outputs", and this avoids accidentally
            # writing duplicate dummy rules for those outputs.
            main_output = make.QuoteSpaces(self.LocalPathify(outputs[0]))
            self.WriteLn("%s: gyp_local_path := $(LOCAL_PATH)" % main_output)
            self.WriteLn("%s: gyp_var_prefix := $(GYP_VAR_PREFIX)" % main_output)
            self.WriteLn(
                "%s: gyp_intermediate_dir := "
                "$(abspath $(gyp_intermediate_dir))" % main_output
            )
            self.WriteLn(
                "%s: gyp_shared_intermediate_dir := "
                "$(abspath $(gyp_shared_intermediate_dir))" % main_output
            )

            # Android's envsetup.sh adds a number of directories to the path including
            # the built host binary directory. This causes actions/rules invoked by
            # gyp to sometimes use these instead of system versions, e.g. bison.
            # The built host binaries may not be suitable, and can cause errors.
            # So, we remove them from the PATH using the ANDROID_BUILD_PATHS variable
            # set by envsetup.
            self.WriteLn(
                "%s: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))"
                % main_output
            )

            # Don't allow spaces in input/output filenames, but make an exception for
            # filenames which start with '$(' since it's okay for there to be spaces
            # inside of make function/macro invocations.
            for input in inputs:
                if not input.startswith("$(") and " " in input:
                    raise gyp.common.GypError(
                        'Action input filename "%s" in target %s contains a space'
                        % (input, self.target)
                    )
            for output in outputs:
                if not output.startswith("$(") and " " in output:
                    raise gyp.common.GypError(
                        'Action output filename "%s" in target %s contains a space'
                        % (output, self.target)
                    )

            self.WriteLn(
                "%s: %s $(GYP_TARGET_DEPENDENCIES)"
                % (main_output, " ".join(map(self.LocalPathify, inputs)))
            )
            self.WriteLn('\t@echo "%s"' % quiet_cmd)
            self.WriteLn("\t$(hide)%s\n" % command)
            for output in outputs[1:]:
                # Make each output depend on the main output, with an empty command
                # to force make to notice that the mtime has changed.
                self.WriteLn(f"{self.LocalPathify(output)}: {main_output} ;")

            extra_outputs += outputs
            self.WriteLn()

        self.WriteLn()

    def WriteRules(self, rules, extra_sources, extra_outputs):
        """Write Makefile code for any 'rules' from the gyp input.

        extra_sources: a list that will be filled in with newly generated source
                       files, if any
        extra_outputs: a list that will be filled in with any outputs of these
                       rules (used to make other pieces dependent on these rules)
        """
        if len(rules) == 0:
            return

        for rule in rules:
            if len(rule.get("rule_sources", [])) == 0:
                continue
            name = make.StringToMakefileVariable(
                "{}_{}".format(self.relative_target, rule["rule_name"])
            )
            self.WriteLn('\n### Generated for rule "%s":' % name)
            self.WriteLn('# "%s":' % rule)

            inputs = rule.get("inputs")
            for rule_source in rule.get("rule_sources", []):
                (rule_source_dirname, rule_source_basename) = os.path.split(rule_source)
                (rule_source_root, rule_source_ext) = os.path.splitext(
                    rule_source_basename
                )

                outputs = [
                    self.ExpandInputRoot(out, rule_source_root, rule_source_dirname)
                    for out in rule["outputs"]
                ]

                dirs = set()
                for out in outputs:
                    if not out.startswith("$"):
                        print(
                            "WARNING: Rule for target %s writes output to local path %s"
                            % (self.target, out)
                        )
                    dir = os.path.dirname(out)
                    if dir:
                        dirs.add(dir)
                extra_outputs += outputs
                if int(rule.get("process_outputs_as_sources", False)):
                    extra_sources.extend(outputs)

                components = []
                for component in rule["action"]:
                    component = self.ExpandInputRoot(
                        component, rule_source_root, rule_source_dirname
                    )
                    if "$(RULE_SOURCES)" in component:
                        component = component.replace("$(RULE_SOURCES)", rule_source)
                    components.append(component)

                command = gyp.common.EncodePOSIXShellList(components)
                cd_action = "cd $(gyp_local_path)/%s; " % self.path
                command = cd_action + command
                if dirs:
                    command = "mkdir -p %s" % " ".join(dirs) + "; " + command

                # We set up a rule to build the first output, and then set up
                # a rule for each additional output to depend on the first.
                outputs = map(self.LocalPathify, outputs)
                main_output = outputs[0]
                self.WriteLn("%s: gyp_local_path := $(LOCAL_PATH)" % main_output)
                self.WriteLn("%s: gyp_var_prefix := $(GYP_VAR_PREFIX)" % main_output)
                self.WriteLn(
                    "%s: gyp_intermediate_dir := "
                    "$(abspath $(gyp_intermediate_dir))" % main_output
                )
                self.WriteLn(
                    "%s: gyp_shared_intermediate_dir := "
                    "$(abspath $(gyp_shared_intermediate_dir))" % main_output
                )

                # See explanation in WriteActions.
                self.WriteLn(
                    "%s: export PATH := "
                    "$(subst $(ANDROID_BUILD_PATHS),,$(PATH))" % main_output
                )

                main_output_deps = self.LocalPathify(rule_source)
                if inputs:
                    main_output_deps += " "
                    main_output_deps += " ".join([self.LocalPathify(f) for f in inputs])

                self.WriteLn(
                    "%s: %s $(GYP_TARGET_DEPENDENCIES)"
                    % (main_output, main_output_deps)
                )
                self.WriteLn("\t%s\n" % command)
                for output in outputs[1:]:
                    # Make each output depend on the main output, with an empty command
                    # to force make to notice that the mtime has changed.
                    self.WriteLn(f"{output}: {main_output} ;")
                self.WriteLn()

        self.WriteLn()

    def WriteCopies(self, copies, extra_outputs):
        """Write Makefile code for any 'copies' from the gyp input.

        extra_outputs: a list that will be filled in with any outputs of this action
                       (used to make other pieces dependent on this action)
        """
        self.WriteLn("### Generated for copy rule.")

        variable = make.StringToMakefileVariable(self.relative_target + "_copies")
        outputs = []
        for copy in copies:
            for path in copy["files"]:
                # The Android build system does not allow generation of files into the
                # source tree. The destination should start with a variable, which will
                # typically be $(gyp_intermediate_dir) or
                # $(gyp_shared_intermediate_dir). Note that we can't use an assertion
                # because some of the gyp tests depend on this.
                if not copy["destination"].startswith("$"):
                    print(
                        "WARNING: Copy rule for target %s writes output to "
                        "local path %s" % (self.target, copy["destination"])
                    )

                # LocalPathify() calls normpath, stripping trailing slashes.
                path = Sourceify(self.LocalPathify(path))
                filename = os.path.split(path)[1]
                output = Sourceify(
                    self.LocalPathify(os.path.join(copy["destination"], filename))
                )

                self.WriteLn(f"{output}: {path} $(GYP_TARGET_DEPENDENCIES) | $(ACP)")
                self.WriteLn("\t@echo Copying: $@")
                self.WriteLn("\t$(hide) mkdir -p $(dir $@)")
                self.WriteLn("\t$(hide) $(ACP) -rpf $< $@")
                self.WriteLn()
                outputs.append(output)
        self.WriteLn(
            "{} = {}".format(variable, " ".join(map(make.QuoteSpaces, outputs)))
        )
        extra_outputs.append("$(%s)" % variable)
        self.WriteLn()

    def WriteSourceFlags(self, spec, configs):
        """Write out the flags and include paths used to compile source files for
        the current target.

        Args:
          spec, configs: input from gyp.
        """
        for configname, config in sorted(configs.items()):
            extracted_includes = []

            self.WriteLn("\n# Flags passed to both C and C++ files.")
            cflags, includes_from_cflags = self.ExtractIncludesFromCFlags(
                config.get("cflags", []) + config.get("cflags_c", [])
            )
            extracted_includes.extend(includes_from_cflags)
            self.WriteList(cflags, "MY_CFLAGS_%s" % configname)

            self.WriteList(
                config.get("defines"),
                "MY_DEFS_%s" % configname,
                prefix="-D",
                quoter=make.EscapeCppDefine,
            )

            self.WriteLn("\n# Include paths placed before CFLAGS/CPPFLAGS")
            includes = list(config.get("include_dirs", []))
            includes.extend(extracted_includes)
            includes = map(Sourceify, map(self.LocalPathify, includes))
            includes = self.NormalizeIncludePaths(includes)
            self.WriteList(includes, "LOCAL_C_INCLUDES_%s" % configname)

            self.WriteLn("\n# Flags passed to only C++ (and not C) files.")
            self.WriteList(config.get("cflags_cc"), "LOCAL_CPPFLAGS_%s" % configname)

        self.WriteLn(
            "\nLOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) "
            "$(MY_DEFS_$(GYP_CONFIGURATION))"
        )
        # Undefine ANDROID for host modules
        # TODO: the source code should not use macro ANDROID to tell if it's host
        # or target module.
        if self.toolset == "host":
            self.WriteLn("# Undefine ANDROID for host modules")
            self.WriteLn("LOCAL_CFLAGS += -UANDROID")
        self.WriteLn(
            "LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) "
            "$(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION))"
        )
        self.WriteLn("LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION))")
        # Android uses separate flags for assembly file invocations, but gyp expects
        # the same CFLAGS to be applied:
        self.WriteLn("LOCAL_ASFLAGS := $(LOCAL_CFLAGS)")

    def WriteSources(self, spec, configs, extra_sources):
        """Write Makefile code for any 'sources' from the gyp input.
        These are source files necessary to build the current target.
        We need to handle shared_intermediate directory source files as
        a special case by copying them to the intermediate directory and
        treating them as a generated sources. Otherwise the Android build
        rules won't pick them up.

        Args:
          spec, configs: input from gyp.
          extra_sources: Sources generated from Actions or Rules.
        """
        sources = filter(make.Compilable, spec.get("sources", []))
        generated_not_sources = [x for x in extra_sources if not make.Compilable(x)]
        extra_sources = filter(make.Compilable, extra_sources)

        # Determine and output the C++ extension used by these sources.
        # We simply find the first C++ file and use that extension.
        all_sources = sources + extra_sources
        local_cpp_extension = ".cpp"
        for source in all_sources:
            (root, ext) = os.path.splitext(source)
            if IsCPPExtension(ext):
                local_cpp_extension = ext
                break
        if local_cpp_extension != ".cpp":
            self.WriteLn("LOCAL_CPP_EXTENSION := %s" % local_cpp_extension)

        # We need to move any non-generated sources that are coming from the
        # shared intermediate directory out of LOCAL_SRC_FILES and put them
        # into LOCAL_GENERATED_SOURCES. We also need to move over any C++ files
        # that don't match our local_cpp_extension, since Android will only
        # generate Makefile rules for a single LOCAL_CPP_EXTENSION.
        local_files = []
        for source in sources:
            (root, ext) = os.path.splitext(source)
            if "$(gyp_shared_intermediate_dir)" in source:
                extra_sources.append(source)
            elif "$(gyp_intermediate_dir)" in source:
                extra_sources.append(source)
            elif IsCPPExtension(ext) and ext != local_cpp_extension:
                extra_sources.append(source)
            else:
                local_files.append(os.path.normpath(os.path.join(self.path, source)))

        # For any generated source, if it is coming from the shared intermediate
        # directory then we add a Make rule to copy them to the local intermediate
        # directory first. This is because the Android LOCAL_GENERATED_SOURCES
        # must be in the local module intermediate directory for the compile rules
        # to work properly. If the file has the wrong C++ extension, then we add
        # a rule to copy that to intermediates and use the new version.
        final_generated_sources = []
        # If a source file gets copied, we still need to add the original source
        # directory as header search path, for GCC searches headers in the
        # directory that contains the source file by default.
        origin_src_dirs = []
        for source in extra_sources:
            local_file = source
            if "$(gyp_intermediate_dir)/" not in local_file:
                basename = os.path.basename(local_file)
                local_file = "$(gyp_intermediate_dir)/" + basename
            (root, ext) = os.path.splitext(local_file)
            if IsCPPExtension(ext) and ext != local_cpp_extension:
                local_file = root + local_cpp_extension
            if local_file != source:
                self.WriteLn(f"{local_file}: {self.LocalPathify(source)}")
                self.WriteLn("\tmkdir -p $(@D); cp $< $@")
                origin_src_dirs.append(os.path.dirname(source))
            final_generated_sources.append(local_file)

        # We add back in all of the non-compilable stuff to make sure that the
        # make rules have dependencies on them.
        final_generated_sources.extend(generated_not_sources)
        self.WriteList(final_generated_sources, "LOCAL_GENERATED_SOURCES")

        origin_src_dirs = gyp.common.uniquer(origin_src_dirs)
        origin_src_dirs = map(Sourceify, map(self.LocalPathify, origin_src_dirs))
        self.WriteList(origin_src_dirs, "GYP_COPIED_SOURCE_ORIGIN_DIRS")

        self.WriteList(local_files, "LOCAL_SRC_FILES")

        # Write out the flags used to compile the source; this must be done last
        # so that GYP_COPIED_SOURCE_ORIGIN_DIRS can be used as an include path.
        self.WriteSourceFlags(spec, configs)

    def ComputeAndroidModule(self, spec):
        """Return the Android module name used for a gyp spec.

        We use the complete qualified target name to avoid collisions between
        duplicate targets in different directories. We also add a suffix to
        distinguish gyp-generated module names.
        """

        if int(spec.get("android_unmangled_name", 0)):
            assert self.type != "shared_library" or self.target.startswith("lib")
            return self.target

        if self.type == "shared_library":
            # For reasons of convention, the Android build system requires that all
            # shared library modules are named 'libfoo' when generating -l flags.
            prefix = "lib_"
        else:
            prefix = ""

        if spec["toolset"] == "host":
            suffix = "_$(TARGET_$(GYP_VAR_PREFIX)ARCH)_host_gyp"
        else:
            suffix = "_gyp"

        if self.path:
            middle = make.StringToMakefileVariable(f"{self.path}_{self.target}")
        else:
            middle = make.StringToMakefileVariable(self.target)

        return "".join([prefix, middle, suffix])

    def ComputeOutputParts(self, spec):
        """Return the 'output basename' of a gyp spec, split into filename + ext.

        Android libraries must be named the same thing as their module name,
        otherwise the linker can't find them, so product_name and so on must be
        ignored if we are building a library, and the "lib" prepending is
        not done for Android.
        """
        assert self.type != "loadable_module"  # TODO: not supported?

        target = spec["target_name"]
        target_prefix = ""
        target_ext = ""
        if self.type == "static_library":
            target = self.ComputeAndroidModule(spec)
            target_ext = ".a"
        elif self.type == "shared_library":
            target = self.ComputeAndroidModule(spec)
            target_ext = ".so"
        elif self.type == "none":
            target_ext = ".stamp"
        elif self.type != "executable":
            print(
                "ERROR: What output file should be generated?",
                "type",
                self.type,
                "target",
                target,
            )

        if self.type != "static_library" and self.type != "shared_library":
            target_prefix = spec.get("product_prefix", target_prefix)
            target = spec.get("product_name", target)
            product_ext = spec.get("product_extension")
            if product_ext:
                target_ext = "." + product_ext

        target_stem = target_prefix + target
        return (target_stem, target_ext)

    def ComputeOutputBasename(self, spec):
        """Return the 'output basename' of a gyp spec.

        E.g., the loadable module 'foobar' in directory 'baz' will produce
          'libfoobar.so'
        """
        return "".join(self.ComputeOutputParts(spec))

    def ComputeOutput(self, spec):
        """Return the 'output' (full output path) of a gyp spec.

        E.g., the loadable module 'foobar' in directory 'baz' will produce
          '$(obj)/baz/libfoobar.so'
        """
        if self.type == "executable":
            # We install host executables into shared_intermediate_dir so they can be
            # run by gyp rules that refer to PRODUCT_DIR.
            path = "$(gyp_shared_intermediate_dir)"
        elif self.type == "shared_library":
            if self.toolset == "host":
                path = "$($(GYP_HOST_VAR_PREFIX)HOST_OUT_INTERMEDIATE_LIBRARIES)"
            else:
                path = "$($(GYP_VAR_PREFIX)TARGET_OUT_INTERMEDIATE_LIBRARIES)"
        else:
            # Other targets just get built into their intermediate dir.
            if self.toolset == "host":
                path = (
                    "$(call intermediates-dir-for,%s,%s,true,,"
                    "$(GYP_HOST_VAR_PREFIX))"
                    % (self.android_class, self.android_module)
                )
            else:
                path = "$(call intermediates-dir-for,{},{},,,$(GYP_VAR_PREFIX))".format(
                    self.android_class,
                    self.android_module,
                )

        assert spec.get("product_dir") is None  # TODO: not supported?
        return os.path.join(path, self.ComputeOutputBasename(spec))

    def NormalizeIncludePaths(self, include_paths):
        """Normalize include_paths.
        Convert absolute paths to relative to the Android top directory.

        Args:
          include_paths: A list of unprocessed include paths.
        Returns:
          A list of normalized include paths.
        """
        normalized = []
        for path in include_paths:
            if path[0] == "/":
                path = gyp.common.RelativePath(path, self.android_top_dir)
            normalized.append(path)
        return normalized

    def ExtractIncludesFromCFlags(self, cflags):
        """Extract includes "-I..." out from cflags

        Args:
          cflags: A list of compiler flags, which may be mixed with "-I.."
        Returns:
          A tuple of lists: (clean_clfags, include_paths). "-I.." is trimmed.
        """
        clean_cflags = []
        include_paths = []
        for flag in cflags:
            if flag.startswith("-I"):
                include_paths.append(flag[2:])
            else:
                clean_cflags.append(flag)

        return (clean_cflags, include_paths)

    def FilterLibraries(self, libraries):
        """Filter the 'libraries' key to separate things that shouldn't be ldflags.

        Library entries that look like filenames should be converted to android
        module names instead of being passed to the linker as flags.

        Args:
          libraries: the value of spec.get('libraries')
        Returns:
          A tuple (static_lib_modules, dynamic_lib_modules, ldflags)
        """
        static_lib_modules = []
        dynamic_lib_modules = []
        ldflags = []
        for libs in libraries:
            # Libs can have multiple words.
            for lib in libs.split():
                # Filter the system libraries, which are added by default by the Android
                # build system.
                if (
                    lib == "-lc"
                    or lib == "-lstdc++"
                    or lib == "-lm"
                    or lib.endswith("libgcc.a")
                ):
                    continue
                match = re.search(r"([^/]+)\.a$", lib)
                if match:
                    static_lib_modules.append(match.group(1))
                    continue
                match = re.search(r"([^/]+)\.so$", lib)
                if match:
                    dynamic_lib_modules.append(match.group(1))
                    continue
                if lib.startswith("-l"):
                    ldflags.append(lib)
        return (static_lib_modules, dynamic_lib_modules, ldflags)

    def ComputeDeps(self, spec):
        """Compute the dependencies of a gyp spec.

        Returns a tuple (deps, link_deps), where each is a list of
        filenames that will need to be put in front of make for either
        building (deps) or linking (link_deps).
        """
        deps = []
        link_deps = []
        if "dependencies" in spec:
            deps.extend(
                [
                    target_outputs[dep]
                    for dep in spec["dependencies"]
                    if target_outputs[dep]
                ]
            )
            for dep in spec["dependencies"]:
                if dep in target_link_deps:
                    link_deps.append(target_link_deps[dep])
            deps.extend(link_deps)
        return (gyp.common.uniquer(deps), gyp.common.uniquer(link_deps))

    def WriteTargetFlags(self, spec, configs, link_deps):
        """Write Makefile code to specify the link flags and library dependencies.

        spec, configs: input from gyp.
        link_deps: link dependency list; see ComputeDeps()
        """
        # Libraries (i.e. -lfoo)
        # These must be included even for static libraries as some of them provide
        # implicit include paths through the build system.
        libraries = gyp.common.uniquer(spec.get("libraries", []))
        static_libs, dynamic_libs, ldflags_libs = self.FilterLibraries(libraries)

        if self.type != "static_library":
            for configname, config in sorted(configs.items()):
                ldflags = list(config.get("ldflags", []))
                self.WriteLn("")
                self.WriteList(ldflags, "LOCAL_LDFLAGS_%s" % configname)
            self.WriteList(ldflags_libs, "LOCAL_GYP_LIBS")
            self.WriteLn(
                "LOCAL_LDFLAGS := $(LOCAL_LDFLAGS_$(GYP_CONFIGURATION)) "
                "$(LOCAL_GYP_LIBS)"
            )

        # Link dependencies (i.e. other gyp targets this target depends on)
        # These need not be included for static libraries as within the gyp build
        # we do not use the implicit include path mechanism.
        if self.type != "static_library":
            static_link_deps = [x[1] for x in link_deps if x[0] == "static"]
            shared_link_deps = [x[1] for x in link_deps if x[0] == "shared"]
        else:
            static_link_deps = []
            shared_link_deps = []

        # Only write the lists if they are non-empty.
        if static_libs or static_link_deps:
            self.WriteLn("")
            self.WriteList(static_libs + static_link_deps, "LOCAL_STATIC_LIBRARIES")
            self.WriteLn("# Enable grouping to fix circular references")
            self.WriteLn("LOCAL_GROUP_STATIC_LIBRARIES := true")
        if dynamic_libs or shared_link_deps:
            self.WriteLn("")
            self.WriteList(dynamic_libs + shared_link_deps, "LOCAL_SHARED_LIBRARIES")

    def WriteTarget(
        self, spec, configs, deps, link_deps, part_of_all, write_alias_target
    ):
        """Write Makefile code to produce the final target of the gyp spec.

        spec, configs: input from gyp.
        deps, link_deps: dependency lists; see ComputeDeps()
        part_of_all: flag indicating this target is part of 'all'
        write_alias_target: flag indicating whether to create short aliases for this
                            target
        """
        self.WriteLn("### Rules for final target.")

        if self.type != "none":
            self.WriteTargetFlags(spec, configs, link_deps)

        settings = spec.get("aosp_build_settings", {})
        if settings:
            self.WriteLn("### Set directly by aosp_build_settings.")
            for k, v in settings.items():
                if isinstance(v, list):
                    self.WriteList(v, k)
                else:
                    self.WriteLn(f"{k} := {make.QuoteIfNecessary(v)}")
            self.WriteLn("")

        # Add to the set of targets which represent the gyp 'all' target. We use the
        # name 'gyp_all_modules' as the Android build system doesn't allow the use
        # of the Make target 'all' and because 'all_modules' is the equivalent of
        # the Make target 'all' on Android.
        if part_of_all and write_alias_target:
            self.WriteLn('# Add target alias to "gyp_all_modules" target.')
            self.WriteLn(".PHONY: gyp_all_modules")
            self.WriteLn("gyp_all_modules: %s" % self.android_module)
            self.WriteLn("")

        # Add an alias from the gyp target name to the Android module name. This
        # simplifies manual builds of the target, and is required by the test
        # framework.
        if self.target != self.android_module and write_alias_target:
            self.WriteLn("# Alias gyp target name.")
            self.WriteLn(".PHONY: %s" % self.target)
            self.WriteLn(f"{self.target}: {self.android_module}")
            self.WriteLn("")

        # Add the command to trigger build of the target type depending
        # on the toolset. Ex: BUILD_STATIC_LIBRARY vs. BUILD_HOST_STATIC_LIBRARY
        # NOTE: This has to come last!
        modifier = ""
        if self.toolset == "host":
            modifier = "HOST_"
        if self.type == "static_library":
            self.WriteLn("include $(BUILD_%sSTATIC_LIBRARY)" % modifier)
        elif self.type == "shared_library":
            self.WriteLn("LOCAL_PRELINK_MODULE := false")
            self.WriteLn("include $(BUILD_%sSHARED_LIBRARY)" % modifier)
        elif self.type == "executable":
            self.WriteLn("LOCAL_CXX_STL := libc++_static")
            # Executables are for build and test purposes only, so they're installed
            # to a directory that doesn't get included in the system image.
            self.WriteLn("LOCAL_MODULE_PATH := $(gyp_shared_intermediate_dir)")
            self.WriteLn("include $(BUILD_%sEXECUTABLE)" % modifier)
        else:
            self.WriteLn("LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp")
            self.WriteLn("LOCAL_UNINSTALLABLE_MODULE := true")
            if self.toolset == "target":
                self.WriteLn("LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX)")
            else:
                self.WriteLn("LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_HOST_VAR_PREFIX)")
            self.WriteLn()
            self.WriteLn("include $(BUILD_SYSTEM)/base_rules.mk")
            self.WriteLn()
            self.WriteLn("$(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES)")
            self.WriteLn('\t$(hide) echo "Gyp timestamp: $@"')
            self.WriteLn("\t$(hide) mkdir -p $(dir $@)")
            self.WriteLn("\t$(hide) touch $@")
            self.WriteLn()
            self.WriteLn("LOCAL_2ND_ARCH_VAR_PREFIX :=")

    def WriteList(
        self,
        value_list,
        variable=None,
        prefix="",
        quoter=make.QuoteIfNecessary,
        local_pathify=False,
    ):
        """Write a variable definition that is a list of values.

        E.g. WriteList(['a','b'], 'foo', prefix='blah') writes out
             foo = blaha blahb
        but in a pretty-printed style.
        """
        values = ""
        if value_list:
            value_list = [quoter(prefix + value) for value in value_list]
            if local_pathify:
                value_list = [self.LocalPathify(value) for value in value_list]
            values = " \\\n\t" + " \\\n\t".join(value_list)
        self.fp.write(f"{variable} :={values}\n\n")

    def WriteLn(self, text=""):
        self.fp.write(text + "\n")

    def LocalPathify(self, path):
        """Convert a subdirectory-relative path into a normalized path which starts
        with the make variable $(LOCAL_PATH) (i.e. the top of the project tree).
        Absolute paths, or paths that contain variables, are just normalized."""
        if "$(" in path or os.path.isabs(path):
            # path is not a file in the project tree in this case, but calling
            # normpath is still important for trimming trailing slashes.
            return os.path.normpath(path)
        local_path = os.path.join("$(LOCAL_PATH)", self.path, path)
        local_path = os.path.normpath(local_path)
        # Check that normalizing the path didn't ../ itself out of $(LOCAL_PATH)
        # - i.e. that the resulting path is still inside the project tree. The
        # path may legitimately have ended up containing just $(LOCAL_PATH), though,
        # so we don't look for a slash.
        assert local_path.startswith(
            "$(LOCAL_PATH)"
        ), f"Path {path} attempts to escape from gyp path {self.path} !)"
        return local_path

    def ExpandInputRoot(self, template, expansion, dirname):
        if "%(INPUT_ROOT)s" not in template and "%(INPUT_DIRNAME)s" not in template:
            return template
        path = template % {
            "INPUT_ROOT": expansion,
            "INPUT_DIRNAME": dirname,
        }
        return os.path.normpath(path)


def PerformBuild(data, configurations, params):
    # The android backend only supports the default configuration.
    options = params["options"]
    makefile = os.path.abspath(os.path.join(options.toplevel_dir, "GypAndroid.mk"))
    env = dict(os.environ)
    env["ONE_SHOT_MAKEFILE"] = makefile
    arguments = ["make", "-C", os.environ["ANDROID_BUILD_TOP"], "gyp_all_modules"]
    print("Building: %s" % arguments)
    subprocess.check_call(arguments, env=env)


def GenerateOutput(target_list, target_dicts, data, params):
    options = params["options"]
    generator_flags = params.get("generator_flags", {})
    limit_to_target_all = generator_flags.get("limit_to_target_all", False)
    write_alias_targets = generator_flags.get("write_alias_targets", True)
    sdk_version = generator_flags.get("aosp_sdk_version", 0)
    android_top_dir = os.environ.get("ANDROID_BUILD_TOP")
    assert android_top_dir, "$ANDROID_BUILD_TOP not set; you need to run lunch."

    def CalculateMakefilePath(build_file, base_name):
        """Determine where to write a Makefile for a given gyp file."""
        # Paths in gyp files are relative to the .gyp file, but we want
        # paths relative to the source root for the master makefile.  Grab
        # the path of the .gyp file as the base to relativize against.
        # E.g. "foo/bar" when we're constructing targets for "foo/bar/baz.gyp".
        base_path = gyp.common.RelativePath(os.path.dirname(build_file), options.depth)
        # We write the file in the base_path directory.
        output_file = os.path.join(options.depth, base_path, base_name)
        assert (
            not options.generator_output
        ), "The Android backend does not support options.generator_output."
        base_path = gyp.common.RelativePath(
            os.path.dirname(build_file), options.toplevel_dir
        )
        return base_path, output_file

    # TODO:  search for the first non-'Default' target.  This can go
    # away when we add verification that all targets have the
    # necessary configurations.
    default_configuration = None
    for target in target_list:
        spec = target_dicts[target]
        if spec["default_configuration"] != "Default":
            default_configuration = spec["default_configuration"]
            break
    if not default_configuration:
        default_configuration = "Default"

    makefile_name = "GypAndroid" + options.suffix + ".mk"
    makefile_path = os.path.join(options.toplevel_dir, makefile_name)
    assert (
        not options.generator_output
    ), "The Android backend does not support options.generator_output."
    gyp.common.EnsureDirExists(makefile_path)
    root_makefile = open(makefile_path, "w")

    root_makefile.write(header)

    # We set LOCAL_PATH just once, here, to the top of the project tree. This
    # allows all the other paths we use to be relative to the Android.mk file,
    # as the Android build system expects.
    root_makefile.write("\nLOCAL_PATH := $(call my-dir)\n")

    # Find the list of targets that derive from the gyp file(s) being built.
    needed_targets = set()
    for build_file in params["build_files"]:
        for target in gyp.common.AllTargets(target_list, target_dicts, build_file):
            needed_targets.add(target)

    build_files = set()
    include_list = set()
    android_modules = {}
    for qualified_target in target_list:
        build_file, target, toolset = gyp.common.ParseQualifiedTarget(qualified_target)
        relative_build_file = gyp.common.RelativePath(build_file, options.toplevel_dir)
        build_files.add(relative_build_file)
        included_files = data[build_file]["included_files"]
        for included_file in included_files:
            # The included_files entries are relative to the dir of the build file
            # that included them, so we have to undo that and then make them relative
            # to the root dir.
            relative_include_file = gyp.common.RelativePath(
                gyp.common.UnrelativePath(included_file, build_file),
                options.toplevel_dir,
            )
            abs_include_file = os.path.abspath(relative_include_file)
            # If the include file is from the ~/.gyp dir, we should use absolute path
            # so that relocating the src dir doesn't break the path.
            if params["home_dot_gyp"] and abs_include_file.startswith(
                params["home_dot_gyp"]
            ):
                build_files.add(abs_include_file)
            else:
                build_files.add(relative_include_file)

        base_path, output_file = CalculateMakefilePath(
            build_file, target + "." + toolset + options.suffix + ".mk"
        )

        spec = target_dicts[qualified_target]
        configs = spec["configurations"]

        part_of_all = qualified_target in needed_targets
        if limit_to_target_all and not part_of_all:
            continue

        relative_target = gyp.common.QualifiedTarget(
            relative_build_file, target, toolset
        )
        writer = AndroidMkWriter(android_top_dir)
        android_module = writer.Write(
            qualified_target,
            relative_target,
            base_path,
            output_file,
            spec,
            configs,
            part_of_all=part_of_all,
            write_alias_target=write_alias_targets,
            sdk_version=sdk_version,
        )
        if android_module in android_modules:
            print(
                "ERROR: Android module names must be unique. The following "
                "targets both generate Android module name %s.\n  %s\n  %s"
                % (android_module, android_modules[android_module], qualified_target)
            )
            return
        android_modules[android_module] = qualified_target

        # Our root_makefile lives at the source root.  Compute the relative path
        # from there to the output_file for including.
        mkfile_rel_path = gyp.common.RelativePath(
            output_file, os.path.dirname(makefile_path)
        )
        include_list.add(mkfile_rel_path)

    root_makefile.write("GYP_CONFIGURATION ?= %s\n" % default_configuration)
    root_makefile.write("GYP_VAR_PREFIX ?=\n")
    root_makefile.write("GYP_HOST_VAR_PREFIX ?=\n")
    root_makefile.write("GYP_HOST_MULTILIB ?= first\n")

    # Write out the sorted list of includes.
    root_makefile.write("\n")
    for include_file in sorted(include_list):
        root_makefile.write("include $(LOCAL_PATH)/" + include_file + "\n")
    root_makefile.write("\n")

    if write_alias_targets:
        root_makefile.write(ALL_MODULES_FOOTER)

    root_makefile.close()
# Copyright (c) 2013 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""cmake output module

This module is under development and should be considered experimental.

This module produces cmake (2.8.8+) input as its output. One CMakeLists.txt is
created for each configuration.

This module's original purpose was to support editing in IDEs like KDevelop
which use CMake for project management. It is also possible to use CMake to
generate projects for other IDEs such as eclipse cdt and code::blocks. QtCreator
will convert the CMakeLists.txt to a code::blocks cbp for the editor to read,
but build using CMake. As a result QtCreator editor is unaware of compiler
defines. The generated CMakeLists.txt can also be used to build on Linux. There
is currently no support for building on platforms other than Linux.

The generated CMakeLists.txt should properly compile all projects. However,
there is a mismatch between gyp and cmake with regard to linking. All attempts
are made to work around this, but CMake sometimes sees -Wl,--start-group as a
library and incorrectly repeats it. As a result the output of this generator
should not be relied on for building.

When using with kdevelop, use version 4.4+. Previous versions of kdevelop will
not be able to find the header file directories described in the generated
CMakeLists.txt file.
"""


import multiprocessing
import os
import signal
import subprocess
import gyp.common
import gyp.xcode_emulation

_maketrans = str.maketrans

generator_default_variables = {
    "EXECUTABLE_PREFIX": "",
    "EXECUTABLE_SUFFIX": "",
    "STATIC_LIB_PREFIX": "lib",
    "STATIC_LIB_SUFFIX": ".a",
    "SHARED_LIB_PREFIX": "lib",
    "SHARED_LIB_SUFFIX": ".so",
    "SHARED_LIB_DIR": "${builddir}/lib.${TOOLSET}",
    "LIB_DIR": "${obj}.${TOOLSET}",
    "INTERMEDIATE_DIR": "${obj}.${TOOLSET}/${TARGET}/geni",
    "SHARED_INTERMEDIATE_DIR": "${obj}/gen",
    "PRODUCT_DIR": "${builddir}",
    "RULE_INPUT_PATH": "${RULE_INPUT_PATH}",
    "RULE_INPUT_DIRNAME": "${RULE_INPUT_DIRNAME}",
    "RULE_INPUT_NAME": "${RULE_INPUT_NAME}",
    "RULE_INPUT_ROOT": "${RULE_INPUT_ROOT}",
    "RULE_INPUT_EXT": "${RULE_INPUT_EXT}",
    "CONFIGURATION_NAME": "${configuration}",
}

FULL_PATH_VARS = ("${CMAKE_CURRENT_LIST_DIR}", "${builddir}", "${obj}")

generator_supports_multiple_toolsets = True
generator_wants_static_library_dependencies_adjusted = True

COMPILABLE_EXTENSIONS = {
    ".c": "cc",
    ".cc": "cxx",
    ".cpp": "cxx",
    ".cxx": "cxx",
    ".s": "s",  # cc
    ".S": "s",  # cc
}


def RemovePrefix(a, prefix):
    """Returns 'a' without 'prefix' if it starts with 'prefix'."""
    return a[len(prefix) :] if a.startswith(prefix) else a


def CalculateVariables(default_variables, params):
    """Calculate additional variables for use in the build (called by gyp)."""
    default_variables.setdefault("OS", gyp.common.GetFlavor(params))


def Compilable(filename):
    """Return true if the file is compilable (should be in OBJS)."""
    return any(filename.endswith(e) for e in COMPILABLE_EXTENSIONS)


def Linkable(filename):
    """Return true if the file is linkable (should be on the link line)."""
    return filename.endswith(".o")


def NormjoinPathForceCMakeSource(base_path, rel_path):
    """Resolves rel_path against base_path and returns the result.

  If rel_path is an absolute path it is returned unchanged.
  Otherwise it is resolved against base_path and normalized.
  If the result is a relative path, it is forced to be relative to the
  CMakeLists.txt.
  """
    if os.path.isabs(rel_path):
        return rel_path
    if any([rel_path.startswith(var) for var in FULL_PATH_VARS]):
        return rel_path
    # TODO: do we need to check base_path for absolute variables as well?
    return os.path.join(
        "${CMAKE_CURRENT_LIST_DIR}", os.path.normpath(os.path.join(base_path, rel_path))
    )


def NormjoinPath(base_path, rel_path):
    """Resolves rel_path against base_path and returns the result.
  TODO: what is this really used for?
  If rel_path begins with '$' it is returned unchanged.
  Otherwise it is resolved against base_path if relative, then normalized.
  """
    if rel_path.startswith("$") and not rel_path.startswith("${configuration}"):
        return rel_path
    return os.path.normpath(os.path.join(base_path, rel_path))


def CMakeStringEscape(a):
    """Escapes the string 'a' for use inside a CMake string.

  This means escaping
  '\' otherwise it may be seen as modifying the next character
  '"' otherwise it will end the string
  ';' otherwise the string becomes a list

  The following do not need to be escaped
  '#' when the lexer is in string state, this does not start a comment

  The following are yet unknown
  '$' generator variables (like ${obj}) must not be escaped,
      but text $ should be escaped
      what is wanted is to know which $ come from generator variables
  """
    return a.replace("\\", "\\\\").replace(";", "\\;").replace('"', '\\"')


def SetFileProperty(output, source_name, property_name, values, sep):
    """Given a set of source file, sets the given property on them."""
    output.write("set_source_files_properties(")
    output.write(source_name)
    output.write(" PROPERTIES ")
    output.write(property_name)
    output.write(' "')
    for value in values:
        output.write(CMakeStringEscape(value))
        output.write(sep)
    output.write('")\n')


def SetFilesProperty(output, variable, property_name, values, sep):
    """Given a set of source files, sets the given property on them."""
    output.write("set_source_files_properties(")
    WriteVariable(output, variable)
    output.write(" PROPERTIES ")
    output.write(property_name)
    output.write(' "')
    for value in values:
        output.write(CMakeStringEscape(value))
        output.write(sep)
    output.write('")\n')


def SetTargetProperty(output, target_name, property_name, values, sep=""):
    """Given a target, sets the given property."""
    output.write("set_target_properties(")
    output.write(target_name)
    output.write(" PROPERTIES ")
    output.write(property_name)
    output.write(' "')
    for value in values:
        output.write(CMakeStringEscape(value))
        output.write(sep)
    output.write('")\n')


def SetVariable(output, variable_name, value):
    """Sets a CMake variable."""
    output.write("set(")
    output.write(variable_name)
    output.write(' "')
    output.write(CMakeStringEscape(value))
    output.write('")\n')


def SetVariableList(output, variable_name, values):
    """Sets a CMake variable to a list."""
    if not values:
        return SetVariable(output, variable_name, "")
    if len(values) == 1:
        return SetVariable(output, variable_name, values[0])
    output.write("list(APPEND ")
    output.write(variable_name)
    output.write('\n  "')
    output.write('"\n  "'.join([CMakeStringEscape(value) for value in values]))
    output.write('")\n')


def UnsetVariable(output, variable_name):
    """Unsets a CMake variable."""
    output.write("unset(")
    output.write(variable_name)
    output.write(")\n")


def WriteVariable(output, variable_name, prepend=None):
    if prepend:
        output.write(prepend)
    output.write("${")
    output.write(variable_name)
    output.write("}")


class CMakeTargetType:
    def __init__(self, command, modifier, property_modifier):
        self.command = command
        self.modifier = modifier
        self.property_modifier = property_modifier


cmake_target_type_from_gyp_target_type = {
    "executable": CMakeTargetType("add_executable", None, "RUNTIME"),
    "static_library": CMakeTargetType("add_library", "STATIC", "ARCHIVE"),
    "shared_library": CMakeTargetType("add_library", "SHARED", "LIBRARY"),
    "loadable_module": CMakeTargetType("add_library", "MODULE", "LIBRARY"),
    "none": CMakeTargetType("add_custom_target", "SOURCES", None),
}


def StringToCMakeTargetName(a):
    """Converts the given string 'a' to a valid CMake target name.

  All invalid characters are replaced by '_'.
  Invalid for cmake: ' ', '/', '(', ')', '"'
  Invalid for make: ':'
  Invalid for unknown reasons but cause failures: '.'
  """
    return a.translate(_maketrans(' /():."', "_______"))


def WriteActions(target_name, actions, extra_sources, extra_deps, path_to_gyp, output):
    """Write CMake for the 'actions' in the target.

  Args:
    target_name: the name of the CMake target being generated.
    actions: the Gyp 'actions' dict for this target.
    extra_sources: [(<cmake_src>, <src>)] to append with generated source files.
    extra_deps: [<cmake_taget>] to append with generated targets.
    path_to_gyp: relative path from CMakeLists.txt being generated to
        the Gyp file in which the target being generated is defined.
  """
    for action in actions:
        action_name = StringToCMakeTargetName(action["action_name"])
        action_target_name = f"{target_name}__{action_name}"

        inputs = action["inputs"]
        inputs_name = action_target_name + "__input"
        SetVariableList(
            output,
            inputs_name,
            [NormjoinPathForceCMakeSource(path_to_gyp, dep) for dep in inputs],
        )

        outputs = action["outputs"]
        cmake_outputs = [
            NormjoinPathForceCMakeSource(path_to_gyp, out) for out in outputs
        ]
        outputs_name = action_target_name + "__output"
        SetVariableList(output, outputs_name, cmake_outputs)

        # Build up a list of outputs.
        # Collect the output dirs we'll need.
        dirs = {dir for dir in (os.path.dirname(o) for o in outputs) if dir}

        if int(action.get("process_outputs_as_sources", False)):
            extra_sources.extend(zip(cmake_outputs, outputs))

        # add_custom_command
        output.write("add_custom_command(OUTPUT ")
        WriteVariable(output, outputs_name)
        output.write("\n")

        if len(dirs) > 0:
            for directory in dirs:
                output.write("  COMMAND ${CMAKE_COMMAND} -E make_directory ")
                output.write(directory)
                output.write("\n")

        output.write("  COMMAND ")
        output.write(gyp.common.EncodePOSIXShellList(action["action"]))
        output.write("\n")

        output.write("  DEPENDS ")
        WriteVariable(output, inputs_name)
        output.write("\n")

        output.write("  WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/")
        output.write(path_to_gyp)
        output.write("\n")

        output.write("  COMMENT ")
        if "message" in action:
            output.write(action["message"])
        else:
            output.write(action_target_name)
        output.write("\n")

        output.write("  VERBATIM\n")
        output.write(")\n")

        # add_custom_target
        output.write("add_custom_target(")
        output.write(action_target_name)
        output.write("\n  DEPENDS ")
        WriteVariable(output, outputs_name)
        output.write("\n  SOURCES ")
        WriteVariable(output, inputs_name)
        output.write("\n)\n")

        extra_deps.append(action_target_name)


def NormjoinRulePathForceCMakeSource(base_path, rel_path, rule_source):
    if rel_path.startswith(("${RULE_INPUT_PATH}", "${RULE_INPUT_DIRNAME}")):
        if any([rule_source.startswith(var) for var in FULL_PATH_VARS]):
            return rel_path
    return NormjoinPathForceCMakeSource(base_path, rel_path)


def WriteRules(target_name, rules, extra_sources, extra_deps, path_to_gyp, output):
    """Write CMake for the 'rules' in the target.

  Args:
    target_name: the name of the CMake target being generated.
    actions: the Gyp 'actions' dict for this target.
    extra_sources: [(<cmake_src>, <src>)] to append with generated source files.
    extra_deps: [<cmake_taget>] to append with generated targets.
    path_to_gyp: relative path from CMakeLists.txt being generated to
        the Gyp file in which the target being generated is defined.
  """
    for rule in rules:
        rule_name = StringToCMakeTargetName(target_name + "__" + rule["rule_name"])

        inputs = rule.get("inputs", [])
        inputs_name = rule_name + "__input"
        SetVariableList(
            output,
            inputs_name,
            [NormjoinPathForceCMakeSource(path_to_gyp, dep) for dep in inputs],
        )
        outputs = rule["outputs"]
        var_outputs = []

        for count, rule_source in enumerate(rule.get("rule_sources", [])):
            action_name = rule_name + "_" + str(count)

            rule_source_dirname, rule_source_basename = os.path.split(rule_source)
            rule_source_root, rule_source_ext = os.path.splitext(rule_source_basename)

            SetVariable(output, "RULE_INPUT_PATH", rule_source)
            SetVariable(output, "RULE_INPUT_DIRNAME", rule_source_dirname)
            SetVariable(output, "RULE_INPUT_NAME", rule_source_basename)
            SetVariable(output, "RULE_INPUT_ROOT", rule_source_root)
            SetVariable(output, "RULE_INPUT_EXT", rule_source_ext)

            # Build up a list of outputs.
            # Collect the output dirs we'll need.
            dirs = {dir for dir in (os.path.dirname(o) for o in outputs) if dir}

            # Create variables for the output, as 'local' variable will be unset.
            these_outputs = []
            for output_index, out in enumerate(outputs):
                output_name = action_name + "_" + str(output_index)
                SetVariable(
                    output,
                    output_name,
                    NormjoinRulePathForceCMakeSource(path_to_gyp, out, rule_source),
                )
                if int(rule.get("process_outputs_as_sources", False)):
                    extra_sources.append(("${" + output_name + "}", out))
                these_outputs.append("${" + output_name + "}")
                var_outputs.append("${" + output_name + "}")

            # add_custom_command
            output.write("add_custom_command(OUTPUT\n")
            for out in these_outputs:
                output.write("  ")
                output.write(out)
                output.write("\n")

            for directory in dirs:
                output.write("  COMMAND ${CMAKE_COMMAND} -E make_directory ")
                output.write(directory)
                output.write("\n")

            output.write("  COMMAND ")
            output.write(gyp.common.EncodePOSIXShellList(rule["action"]))
            output.write("\n")

            output.write("  DEPENDS ")
            WriteVariable(output, inputs_name)
            output.write(" ")
            output.write(NormjoinPath(path_to_gyp, rule_source))
            output.write("\n")

            # CMAKE_CURRENT_LIST_DIR is where the CMakeLists.txt lives.
            # The cwd is the current build directory.
            output.write("  WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/")
            output.write(path_to_gyp)
            output.write("\n")

            output.write("  COMMENT ")
            if "message" in rule:
                output.write(rule["message"])
            else:
                output.write(action_name)
            output.write("\n")

            output.write("  VERBATIM\n")
            output.write(")\n")

            UnsetVariable(output, "RULE_INPUT_PATH")
            UnsetVariable(output, "RULE_INPUT_DIRNAME")
            UnsetVariable(output, "RULE_INPUT_NAME")
            UnsetVariable(output, "RULE_INPUT_ROOT")
            UnsetVariable(output, "RULE_INPUT_EXT")

        # add_custom_target
        output.write("add_custom_target(")
        output.write(rule_name)
        output.write(" DEPENDS\n")
        for out in var_outputs:
            output.write("  ")
            output.write(out)
            output.write("\n")
        output.write("SOURCES ")
        WriteVariable(output, inputs_name)
        output.write("\n")
        for rule_source in rule.get("rule_sources", []):
            output.write("  ")
            output.write(NormjoinPath(path_to_gyp, rule_source))
            output.write("\n")
        output.write(")\n")

        extra_deps.append(rule_name)


def WriteCopies(target_name, copies, extra_deps, path_to_gyp, output):
    """Write CMake for the 'copies' in the target.

  Args:
    target_name: the name of the CMake target being generated.
    actions: the Gyp 'actions' dict for this target.
    extra_deps: [<cmake_taget>] to append with generated targets.
    path_to_gyp: relative path from CMakeLists.txt being generated to
        the Gyp file in which the target being generated is defined.
  """
    copy_name = target_name + "__copies"

    # CMake gets upset with custom targets with OUTPUT which specify no output.
    have_copies = any(copy["files"] for copy in copies)
    if not have_copies:
        output.write("add_custom_target(")
        output.write(copy_name)
        output.write(")\n")
        extra_deps.append(copy_name)
        return

    class Copy:
        def __init__(self, ext, command):
            self.cmake_inputs = []
            self.cmake_outputs = []
            self.gyp_inputs = []
            self.gyp_outputs = []
            self.ext = ext
            self.inputs_name = None
            self.outputs_name = None
            self.command = command

    file_copy = Copy("", "copy")
    dir_copy = Copy("_dirs", "copy_directory")

    for copy in copies:
        files = copy["files"]
        destination = copy["destination"]
        for src in files:
            path = os.path.normpath(src)
            basename = os.path.split(path)[1]
            dst = os.path.join(destination, basename)

            copy = file_copy if os.path.basename(src) else dir_copy

            copy.cmake_inputs.append(NormjoinPathForceCMakeSource(path_to_gyp, src))
            copy.cmake_outputs.append(NormjoinPathForceCMakeSource(path_to_gyp, dst))
            copy.gyp_inputs.append(src)
            copy.gyp_outputs.append(dst)

    for copy in (file_copy, dir_copy):
        if copy.cmake_inputs:
            copy.inputs_name = copy_name + "__input" + copy.ext
            SetVariableList(output, copy.inputs_name, copy.cmake_inputs)

            copy.outputs_name = copy_name + "__output" + copy.ext
            SetVariableList(output, copy.outputs_name, copy.cmake_outputs)

    # add_custom_command
    output.write("add_custom_command(\n")

    output.write("OUTPUT")
    for copy in (file_copy, dir_copy):
        if copy.outputs_name:
            WriteVariable(output, copy.outputs_name, " ")
    output.write("\n")

    for copy in (file_copy, dir_copy):
        for src, dst in zip(copy.gyp_inputs, copy.gyp_outputs):
            # 'cmake -E copy src dst' will create the 'dst' directory if needed.
            output.write("COMMAND ${CMAKE_COMMAND} -E %s " % copy.command)
            output.write(src)
            output.write(" ")
            output.write(dst)
            output.write("\n")

    output.write("DEPENDS")
    for copy in (file_copy, dir_copy):
        if copy.inputs_name:
            WriteVariable(output, copy.inputs_name, " ")
    output.write("\n")

    output.write("WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/")
    output.write(path_to_gyp)
    output.write("\n")

    output.write("COMMENT Copying for ")
    output.write(target_name)
    output.write("\n")

    output.write("VERBATIM\n")
    output.write(")\n")

    # add_custom_target
    output.write("add_custom_target(")
    output.write(copy_name)
    output.write("\n  DEPENDS")
    for copy in (file_copy, dir_copy):
        if copy.outputs_name:
            WriteVariable(output, copy.outputs_name, " ")
    output.write("\n  SOURCES")
    if file_copy.inputs_name:
        WriteVariable(output, file_copy.inputs_name, " ")
    output.write("\n)\n")

    extra_deps.append(copy_name)


def CreateCMakeTargetBaseName(qualified_target):
    """This is the name we would like the target to have."""
    _, gyp_target_name, gyp_target_toolset = gyp.common.ParseQualifiedTarget(
        qualified_target
    )
    cmake_target_base_name = gyp_target_name
    if gyp_target_toolset and gyp_target_toolset != "target":
        cmake_target_base_name += "_" + gyp_target_toolset
    return StringToCMakeTargetName(cmake_target_base_name)


def CreateCMakeTargetFullName(qualified_target):
    """An unambiguous name for the target."""
    gyp_file, gyp_target_name, gyp_target_toolset = gyp.common.ParseQualifiedTarget(
        qualified_target
    )
    cmake_target_full_name = gyp_file + ":" + gyp_target_name
    if gyp_target_toolset and gyp_target_toolset != "target":
        cmake_target_full_name += "_" + gyp_target_toolset
    return StringToCMakeTargetName(cmake_target_full_name)


class CMakeNamer:
    """Converts Gyp target names into CMake target names.

  CMake requires that target names be globally unique. One way to ensure
  this is to fully qualify the names of the targets. Unfortunately, this
  ends up with all targets looking like "chrome_chrome_gyp_chrome" instead
  of just "chrome". If this generator were only interested in building, it
  would be possible to fully qualify all target names, then create
  unqualified target names which depend on all qualified targets which
  should have had that name. This is more or less what the 'make' generator
  does with aliases. However, one goal of this generator is to create CMake
  files for use with IDEs, and fully qualified names are not as user
  friendly.

  Since target name collision is rare, we do the above only when required.

  Toolset variants are always qualified from the base, as this is required for
  building. However, it also makes sense for an IDE, as it is possible for
  defines to be different.
  """

    def __init__(self, target_list):
        self.cmake_target_base_names_conficting = set()

        cmake_target_base_names_seen = set()
        for qualified_target in target_list:
            cmake_target_base_name = CreateCMakeTargetBaseName(qualified_target)

            if cmake_target_base_name not in cmake_target_base_names_seen:
                cmake_target_base_names_seen.add(cmake_target_base_name)
            else:
                self.cmake_target_base_names_conficting.add(cmake_target_base_name)

    def CreateCMakeTargetName(self, qualified_target):
        base_name = CreateCMakeTargetBaseName(qualified_target)
        if base_name in self.cmake_target_base_names_conficting:
            return CreateCMakeTargetFullName(qualified_target)
        return base_name


def WriteTarget(
    namer,
    qualified_target,
    target_dicts,
    build_dir,
    config_to_use,
    options,
    generator_flags,
    all_qualified_targets,
    flavor,
    output,
):
    # The make generator does this always.
    # TODO: It would be nice to be able to tell CMake all dependencies.
    circular_libs = generator_flags.get("circular", True)

    if not generator_flags.get("standalone", False):
        output.write("\n#")
        output.write(qualified_target)
        output.write("\n")

    gyp_file, _, _ = gyp.common.ParseQualifiedTarget(qualified_target)
    rel_gyp_file = gyp.common.RelativePath(gyp_file, options.toplevel_dir)
    rel_gyp_dir = os.path.dirname(rel_gyp_file)

    # Relative path from build dir to top dir.
    build_to_top = gyp.common.InvertRelativePath(build_dir, options.toplevel_dir)
    # Relative path from build dir to gyp dir.
    build_to_gyp = os.path.join(build_to_top, rel_gyp_dir)

    path_from_cmakelists_to_gyp = build_to_gyp

    spec = target_dicts.get(qualified_target, {})
    config = spec.get("configurations", {}).get(config_to_use, {})

    xcode_settings = None
    if flavor == "mac":
        xcode_settings = gyp.xcode_emulation.XcodeSettings(spec)

    target_name = spec.get("target_name", "<missing target name>")
    target_type = spec.get("type", "<missing target type>")
    target_toolset = spec.get("toolset")

    cmake_target_type = cmake_target_type_from_gyp_target_type.get(target_type)
    if cmake_target_type is None:
        print(
            "Target %s has unknown target type %s, skipping."
            % (target_name, target_type)
        )
        return

    SetVariable(output, "TARGET", target_name)
    SetVariable(output, "TOOLSET", target_toolset)

    cmake_target_name = namer.CreateCMakeTargetName(qualified_target)

    extra_sources = []
    extra_deps = []

    # Actions must come first, since they can generate more OBJs for use below.
    if "actions" in spec:
        WriteActions(
            cmake_target_name,
            spec["actions"],
            extra_sources,
            extra_deps,
            path_from_cmakelists_to_gyp,
            output,
        )

    # Rules must be early like actions.
    if "rules" in spec:
        WriteRules(
            cmake_target_name,
            spec["rules"],
            extra_sources,
            extra_deps,
            path_from_cmakelists_to_gyp,
            output,
        )

    # Copies
    if "copies" in spec:
        WriteCopies(
            cmake_target_name,
            spec["copies"],
            extra_deps,
            path_from_cmakelists_to_gyp,
            output,
        )

    # Target and sources
    srcs = spec.get("sources", [])

    # Gyp separates the sheep from the goats based on file extensions.
    # A full separation is done here because of flag handing (see below).
    s_sources = []
    c_sources = []
    cxx_sources = []
    linkable_sources = []
    other_sources = []
    for src in srcs:
        _, ext = os.path.splitext(src)
        src_type = COMPILABLE_EXTENSIONS.get(ext, None)
        src_norm_path = NormjoinPath(path_from_cmakelists_to_gyp, src)

        if src_type == "s":
            s_sources.append(src_norm_path)
        elif src_type == "cc":
            c_sources.append(src_norm_path)
        elif src_type == "cxx":
            cxx_sources.append(src_norm_path)
        elif Linkable(ext):
            linkable_sources.append(src_norm_path)
        else:
            other_sources.append(src_norm_path)

    for extra_source in extra_sources:
        src, real_source = extra_source
        _, ext = os.path.splitext(real_source)
        src_type = COMPILABLE_EXTENSIONS.get(ext, None)

        if src_type == "s":
            s_sources.append(src)
        elif src_type == "cc":
            c_sources.append(src)
        elif src_type == "cxx":
            cxx_sources.append(src)
        elif Linkable(ext):
            linkable_sources.append(src)
        else:
            other_sources.append(src)

    s_sources_name = None
    if s_sources:
        s_sources_name = cmake_target_name + "__asm_srcs"
        SetVariableList(output, s_sources_name, s_sources)

    c_sources_name = None
    if c_sources:
        c_sources_name = cmake_target_name + "__c_srcs"
        SetVariableList(output, c_sources_name, c_sources)

    cxx_sources_name = None
    if cxx_sources:
        cxx_sources_name = cmake_target_name + "__cxx_srcs"
        SetVariableList(output, cxx_sources_name, cxx_sources)

    linkable_sources_name = None
    if linkable_sources:
        linkable_sources_name = cmake_target_name + "__linkable_srcs"
        SetVariableList(output, linkable_sources_name, linkable_sources)

    other_sources_name = None
    if other_sources:
        other_sources_name = cmake_target_name + "__other_srcs"
        SetVariableList(output, other_sources_name, other_sources)

    # CMake gets upset when executable targets provide no sources.
    # http://www.cmake.org/pipermail/cmake/2010-July/038461.html
    dummy_sources_name = None
    has_sources = (
        s_sources_name
        or c_sources_name
        or cxx_sources_name
        or linkable_sources_name
        or other_sources_name
    )
    if target_type == "executable" and not has_sources:
        dummy_sources_name = cmake_target_name + "__dummy_srcs"
        SetVariable(
            output, dummy_sources_name, "${obj}.${TOOLSET}/${TARGET}/genc/dummy.c"
        )
        output.write('if(NOT EXISTS "')
        WriteVariable(output, dummy_sources_name)
        output.write('")\n')
        output.write('  file(WRITE "')
        WriteVariable(output, dummy_sources_name)
        output.write('" "")\n')
        output.write("endif()\n")

    # CMake is opposed to setting linker directories and considers the practice
    # of setting linker directories dangerous. Instead, it favors the use of
    # find_library and passing absolute paths to target_link_libraries.
    # However, CMake does provide the command link_directories, which adds
    # link directories to targets defined after it is called.
    # As a result, link_directories must come before the target definition.
    # CMake unfortunately has no means of removing entries from LINK_DIRECTORIES.
    library_dirs = config.get("library_dirs")
    if library_dirs is not None:
        output.write("link_directories(")
        for library_dir in library_dirs:
            output.write(" ")
            output.write(NormjoinPath(path_from_cmakelists_to_gyp, library_dir))
            output.write("\n")
        output.write(")\n")

    output.write(cmake_target_type.command)
    output.write("(")
    output.write(cmake_target_name)

    if cmake_target_type.modifier is not None:
        output.write(" ")
        output.write(cmake_target_type.modifier)

    if s_sources_name:
        WriteVariable(output, s_sources_name, " ")
    if c_sources_name:
        WriteVariable(output, c_sources_name, " ")
    if cxx_sources_name:
        WriteVariable(output, cxx_sources_name, " ")
    if linkable_sources_name:
        WriteVariable(output, linkable_sources_name, " ")
    if other_sources_name:
        WriteVariable(output, other_sources_name, " ")
    if dummy_sources_name:
        WriteVariable(output, dummy_sources_name, " ")

    output.write(")\n")

    # Let CMake know if the 'all' target should depend on this target.
    exclude_from_all = (
        "TRUE" if qualified_target not in all_qualified_targets else "FALSE"
    )
    SetTargetProperty(output, cmake_target_name, "EXCLUDE_FROM_ALL", exclude_from_all)
    for extra_target_name in extra_deps:
        SetTargetProperty(
            output, extra_target_name, "EXCLUDE_FROM_ALL", exclude_from_all
        )

    # Output name and location.
    if target_type != "none":
        # Link as 'C' if there are no other files
        if not c_sources and not cxx_sources:
            SetTargetProperty(output, cmake_target_name, "LINKER_LANGUAGE", ["C"])

        # Mark uncompiled sources as uncompiled.
        if other_sources_name:
            output.write("set_source_files_properties(")
            WriteVariable(output, other_sources_name, "")
            output.write(' PROPERTIES HEADER_FILE_ONLY "TRUE")\n')

        # Mark object sources as linkable.
        if linkable_sources_name:
            output.write("set_source_files_properties(")
            WriteVariable(output, other_sources_name, "")
            output.write(' PROPERTIES EXTERNAL_OBJECT "TRUE")\n')

        # Output directory
        target_output_directory = spec.get("product_dir")
        if target_output_directory is None:
            if target_type in ("executable", "loadable_module"):
                target_output_directory = generator_default_variables["PRODUCT_DIR"]
            elif target_type == "shared_library":
                target_output_directory = "${builddir}/lib.${TOOLSET}"
            elif spec.get("standalone_static_library", False):
                target_output_directory = generator_default_variables["PRODUCT_DIR"]
            else:
                base_path = gyp.common.RelativePath(
                    os.path.dirname(gyp_file), options.toplevel_dir
                )
                target_output_directory = "${obj}.${TOOLSET}"
                target_output_directory = os.path.join(
                    target_output_directory, base_path
                )

        cmake_target_output_directory = NormjoinPathForceCMakeSource(
            path_from_cmakelists_to_gyp, target_output_directory
        )
        SetTargetProperty(
            output,
            cmake_target_name,
            cmake_target_type.property_modifier + "_OUTPUT_DIRECTORY",
            cmake_target_output_directory,
        )

        # Output name
        default_product_prefix = ""
        default_product_name = target_name
        default_product_ext = ""
        if target_type == "static_library":
            static_library_prefix = generator_default_variables["STATIC_LIB_PREFIX"]
            default_product_name = RemovePrefix(
                default_product_name, static_library_prefix
            )
            default_product_prefix = static_library_prefix
            default_product_ext = generator_default_variables["STATIC_LIB_SUFFIX"]

        elif target_type in ("loadable_module", "shared_library"):
            shared_library_prefix = generator_default_variables["SHARED_LIB_PREFIX"]
            default_product_name = RemovePrefix(
                default_product_name, shared_library_prefix
            )
            default_product_prefix = shared_library_prefix
            default_product_ext = generator_default_variables["SHARED_LIB_SUFFIX"]

        elif target_type != "executable":
            print(
                "ERROR: What output file should be generated?",
                "type",
                target_type,
                "target",
                target_name,
            )

        product_prefix = spec.get("product_prefix", default_product_prefix)
        product_name = spec.get("product_name", default_product_name)
        product_ext = spec.get("product_extension")
        if product_ext:
            product_ext = "." + product_ext
        else:
            product_ext = default_product_ext

        SetTargetProperty(output, cmake_target_name, "PREFIX", product_prefix)
        SetTargetProperty(
            output,
            cmake_target_name,
            cmake_target_type.property_modifier + "_OUTPUT_NAME",
            product_name,
        )
        SetTargetProperty(output, cmake_target_name, "SUFFIX", product_ext)

        # Make the output of this target referenceable as a source.
        cmake_target_output_basename = product_prefix + product_name + product_ext
        cmake_target_output = os.path.join(
            cmake_target_output_directory, cmake_target_output_basename
        )
        SetFileProperty(output, cmake_target_output, "GENERATED", ["TRUE"], "")

        # Includes
        includes = config.get("include_dirs")
        if includes:
            # This (target include directories) is what requires CMake 2.8.8
            includes_name = cmake_target_name + "__include_dirs"
            SetVariableList(
                output,
                includes_name,
                [
                    NormjoinPathForceCMakeSource(path_from_cmakelists_to_gyp, include)
                    for include in includes
                ],
            )
            output.write("set_property(TARGET ")
            output.write(cmake_target_name)
            output.write(" APPEND PROPERTY INCLUDE_DIRECTORIES ")
            WriteVariable(output, includes_name, "")
            output.write(")\n")

        # Defines
        defines = config.get("defines")
        if defines is not None:
            SetTargetProperty(
                output, cmake_target_name, "COMPILE_DEFINITIONS", defines, ";"
            )

        # Compile Flags - http://www.cmake.org/Bug/view.php?id=6493
        # CMake currently does not have target C and CXX flags.
        # So, instead of doing...

        # cflags_c = config.get('cflags_c')
        # if cflags_c is not None:
        #   SetTargetProperty(output, cmake_target_name,
        #                       'C_COMPILE_FLAGS', cflags_c, ' ')

        # cflags_cc = config.get('cflags_cc')
        # if cflags_cc is not None:
        #   SetTargetProperty(output, cmake_target_name,
        #                       'CXX_COMPILE_FLAGS', cflags_cc, ' ')

        # Instead we must...
        cflags = config.get("cflags", [])
        cflags_c = config.get("cflags_c", [])
        cflags_cxx = config.get("cflags_cc", [])
        if xcode_settings:
            cflags = xcode_settings.GetCflags(config_to_use)
            cflags_c = xcode_settings.GetCflagsC(config_to_use)
            cflags_cxx = xcode_settings.GetCflagsCC(config_to_use)
            # cflags_objc = xcode_settings.GetCflagsObjC(config_to_use)
            # cflags_objcc = xcode_settings.GetCflagsObjCC(config_to_use)

        if (not cflags_c or not c_sources) and (not cflags_cxx or not cxx_sources):
            SetTargetProperty(output, cmake_target_name, "COMPILE_FLAGS", cflags, " ")

        elif c_sources and not (s_sources or cxx_sources):
            flags = []
            flags.extend(cflags)
            flags.extend(cflags_c)
            SetTargetProperty(output, cmake_target_name, "COMPILE_FLAGS", flags, " ")

        elif cxx_sources and not (s_sources or c_sources):
            flags = []
            flags.extend(cflags)
            flags.extend(cflags_cxx)
            SetTargetProperty(output, cmake_target_name, "COMPILE_FLAGS", flags, " ")

        else:
            # TODO: This is broken, one cannot generally set properties on files,
            # as other targets may require different properties on the same files.
            if s_sources and cflags:
                SetFilesProperty(output, s_sources_name, "COMPILE_FLAGS", cflags, " ")

            if c_sources and (cflags or cflags_c):
                flags = []
                flags.extend(cflags)
                flags.extend(cflags_c)
                SetFilesProperty(output, c_sources_name, "COMPILE_FLAGS", flags, " ")

            if cxx_sources and (cflags or cflags_cxx):
                flags = []
                flags.extend(cflags)
                flags.extend(cflags_cxx)
                SetFilesProperty(output, cxx_sources_name, "COMPILE_FLAGS", flags, " ")

        # Linker flags
        ldflags = config.get("ldflags")
        if ldflags is not None:
            SetTargetProperty(output, cmake_target_name, "LINK_FLAGS", ldflags, " ")

        # XCode settings
        xcode_settings = config.get("xcode_settings", {})
        for xcode_setting, xcode_value in xcode_settings.items():
            SetTargetProperty(
                output,
                cmake_target_name,
                "XCODE_ATTRIBUTE_%s" % xcode_setting,
                xcode_value,
                "" if isinstance(xcode_value, str) else " ",
            )

    # Note on Dependencies and Libraries:
    # CMake wants to handle link order, resolving the link line up front.
    # Gyp does not retain or enforce specifying enough information to do so.
    # So do as other gyp generators and use --start-group and --end-group.
    # Give CMake as little information as possible so that it doesn't mess it up.

    # Dependencies
    rawDeps = spec.get("dependencies", [])

    static_deps = []
    shared_deps = []
    other_deps = []
    for rawDep in rawDeps:
        dep_cmake_name = namer.CreateCMakeTargetName(rawDep)
        dep_spec = target_dicts.get(rawDep, {})
        dep_target_type = dep_spec.get("type", None)

        if dep_target_type == "static_library":
            static_deps.append(dep_cmake_name)
        elif dep_target_type == "shared_library":
            shared_deps.append(dep_cmake_name)
        else:
            other_deps.append(dep_cmake_name)

    # ensure all external dependencies are complete before internal dependencies
    # extra_deps currently only depend on their own deps, so otherwise run early
    if static_deps or shared_deps or other_deps:
        for extra_dep in extra_deps:
            output.write("add_dependencies(")
            output.write(extra_dep)
            output.write("\n")
            for deps in (static_deps, shared_deps, other_deps):
                for dep in gyp.common.uniquer(deps):
                    output.write("  ")
                    output.write(dep)
                    output.write("\n")
            output.write(")\n")

    linkable = target_type in ("executable", "loadable_module", "shared_library")
    other_deps.extend(extra_deps)
    if other_deps or (not linkable and (static_deps or shared_deps)):
        output.write("add_dependencies(")
        output.write(cmake_target_name)
        output.write("\n")
        for dep in gyp.common.uniquer(other_deps):
            output.write("  ")
            output.write(dep)
            output.write("\n")
        if not linkable:
            for deps in (static_deps, shared_deps):
                for lib_dep in gyp.common.uniquer(deps):
                    output.write("  ")
                    output.write(lib_dep)
                    output.write("\n")
        output.write(")\n")

    # Libraries
    if linkable:
        external_libs = [lib for lib in spec.get("libraries", []) if len(lib) > 0]
        if external_libs or static_deps or shared_deps:
            output.write("target_link_libraries(")
            output.write(cmake_target_name)
            output.write("\n")
            if static_deps:
                write_group = circular_libs and len(static_deps) > 1 and flavor != "mac"
                if write_group:
                    output.write("-Wl,--start-group\n")
                for dep in gyp.common.uniquer(static_deps):
                    output.write("  ")
                    output.write(dep)
                    output.write("\n")
                if write_group:
                    output.write("-Wl,--end-group\n")
            if shared_deps:
                for dep in gyp.common.uniquer(shared_deps):
                    output.write("  ")
                    output.write(dep)
                    output.write("\n")
            if external_libs:
                for lib in gyp.common.uniquer(external_libs):
                    output.write('  "')
                    output.write(RemovePrefix(lib, "$(SDKROOT)"))
                    output.write('"\n')

            output.write(")\n")

    UnsetVariable(output, "TOOLSET")
    UnsetVariable(output, "TARGET")


def GenerateOutputForConfig(target_list, target_dicts, data, params, config_to_use):
    options = params["options"]
    generator_flags = params["generator_flags"]
    flavor = gyp.common.GetFlavor(params)

    # generator_dir: relative path from pwd to where make puts build files.
    # Makes migrating from make to cmake easier, cmake doesn't put anything here.
    # Each Gyp configuration creates a different CMakeLists.txt file
    # to avoid incompatibilities between Gyp and CMake configurations.
    generator_dir = os.path.relpath(options.generator_output or ".")

    # output_dir: relative path from generator_dir to the build directory.
    output_dir = generator_flags.get("output_dir", "out")

    # build_dir: relative path from source root to our output files.
    # e.g. "out/Debug"
    build_dir = os.path.normpath(os.path.join(generator_dir, output_dir, config_to_use))

    toplevel_build = os.path.join(options.toplevel_dir, build_dir)

    output_file = os.path.join(toplevel_build, "CMakeLists.txt")
    gyp.common.EnsureDirExists(output_file)

    output = open(output_file, "w")
    output.write("cmake_minimum_required(VERSION 2.8.8 FATAL_ERROR)\n")
    output.write("cmake_policy(VERSION 2.8.8)\n")

    gyp_file, project_target, _ = gyp.common.ParseQualifiedTarget(target_list[-1])
    output.write("project(")
    output.write(project_target)
    output.write(")\n")

    SetVariable(output, "configuration", config_to_use)

    ar = None
    cc = None
    cxx = None

    make_global_settings = data[gyp_file].get("make_global_settings", [])
    build_to_top = gyp.common.InvertRelativePath(build_dir, options.toplevel_dir)
    for key, value in make_global_settings:
        if key == "AR":
            ar = os.path.join(build_to_top, value)
        if key == "CC":
            cc = os.path.join(build_to_top, value)
        if key == "CXX":
            cxx = os.path.join(build_to_top, value)

    ar = gyp.common.GetEnvironFallback(["AR_target", "AR"], ar)
    cc = gyp.common.GetEnvironFallback(["CC_target", "CC"], cc)
    cxx = gyp.common.GetEnvironFallback(["CXX_target", "CXX"], cxx)

    if ar:
        SetVariable(output, "CMAKE_AR", ar)
    if cc:
        SetVariable(output, "CMAKE_C_COMPILER", cc)
    if cxx:
        SetVariable(output, "CMAKE_CXX_COMPILER", cxx)

    # The following appears to be as-yet undocumented.
    # http://public.kitware.com/Bug/view.php?id=8392
    output.write("enable_language(ASM)\n")
    # ASM-ATT does not support .S files.
    # output.write('enable_language(ASM-ATT)\n')

    if cc:
        SetVariable(output, "CMAKE_ASM_COMPILER", cc)

    SetVariable(output, "builddir", "${CMAKE_CURRENT_BINARY_DIR}")
    SetVariable(output, "obj", "${builddir}/obj")
    output.write("\n")

    # TODO: Undocumented/unsupported (the CMake Java generator depends on it).
    # CMake by default names the object resulting from foo.c to be foo.c.o.
    # Gyp traditionally names the object resulting from foo.c foo.o.
    # This should be irrelevant, but some targets extract .o files from .a
    # and depend on the name of the extracted .o files.
    output.write("set(CMAKE_C_OUTPUT_EXTENSION_REPLACE 1)\n")
    output.write("set(CMAKE_CXX_OUTPUT_EXTENSION_REPLACE 1)\n")
    output.write("\n")

    # Force ninja to use rsp files. Otherwise link and ar lines can get too long,
    # resulting in 'Argument list too long' errors.
    # However, rsp files don't work correctly on Mac.
    if flavor != "mac":
        output.write("set(CMAKE_NINJA_FORCE_RESPONSE_FILE 1)\n")
    output.write("\n")

    namer = CMakeNamer(target_list)

    # The list of targets upon which the 'all' target should depend.
    # CMake has it's own implicit 'all' target, one is not created explicitly.
    all_qualified_targets = set()
    for build_file in params["build_files"]:
        for qualified_target in gyp.common.AllTargets(
            target_list, target_dicts, os.path.normpath(build_file)
        ):
            all_qualified_targets.add(qualified_target)

    for qualified_target in target_list:
        if flavor == "mac":
            gyp_file, _, _ = gyp.common.ParseQualifiedTarget(qualified_target)
            spec = target_dicts[qualified_target]
            gyp.xcode_emulation.MergeGlobalXcodeSettingsToSpec(data[gyp_file], spec)

        WriteTarget(
            namer,
            qualified_target,
            target_dicts,
            build_dir,
            config_to_use,
            options,
            generator_flags,
            all_qualified_targets,
            flavor,
            output,
        )

    output.close()


def PerformBuild(data, configurations, params):
    options = params["options"]
    generator_flags = params["generator_flags"]

    # generator_dir: relative path from pwd to where make puts build files.
    # Makes migrating from make to cmake easier, cmake doesn't put anything here.
    generator_dir = os.path.relpath(options.generator_output or ".")

    # output_dir: relative path from generator_dir to the build directory.
    output_dir = generator_flags.get("output_dir", "out")

    for config_name in configurations:
        # build_dir: relative path from source root to our output files.
        # e.g. "out/Debug"
        build_dir = os.path.normpath(
            os.path.join(generator_dir, output_dir, config_name)
        )
        arguments = ["cmake", "-G", "Ninja"]
        print(f"Generating [{config_name}]: {arguments}")
        subprocess.check_call(arguments, cwd=build_dir)

        arguments = ["ninja", "-C", build_dir]
        print(f"Building [{config_name}]: {arguments}")
        subprocess.check_call(arguments)


def CallGenerateOutputForConfig(arglist):
    # Ignore the interrupt signal so that the parent process catches it and
    # kills all multiprocessing children.
    signal.signal(signal.SIGINT, signal.SIG_IGN)

    target_list, target_dicts, data, params, config_name = arglist
    GenerateOutputForConfig(target_list, target_dicts, data, params, config_name)


def GenerateOutput(target_list, target_dicts, data, params):
    user_config = params.get("generator_flags", {}).get("config", None)
    if user_config:
        GenerateOutputForConfig(target_list, target_dicts, data, params, user_config)
    else:
        config_names = target_dicts[target_list[0]]["configurations"]
        if params["parallel"]:
            try:
                pool = multiprocessing.Pool(len(config_names))
                arglists = []
                for config_name in config_names:
                    arglists.append(
                        (target_list, target_dicts, data, params, config_name)
                    )
                    pool.map(CallGenerateOutputForConfig, arglists)
            except KeyboardInterrupt as e:
                pool.terminate()
                raise e
        else:
            for config_name in config_names:
                GenerateOutputForConfig(
                    target_list, target_dicts, data, params, config_name
                )
# Copyright (c) 2016 Ben Noordhuis <info@bnoordhuis.nl>. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import gyp.common
import gyp.xcode_emulation
import json
import os

generator_additional_non_configuration_keys = []
generator_additional_path_sections = []
generator_extra_sources_for_rules = []
generator_filelist_paths = None
generator_supports_multiple_toolsets = True
generator_wants_sorted_dependencies = False

# Lifted from make.py.  The actual values don't matter much.
generator_default_variables = {
    "CONFIGURATION_NAME": "$(BUILDTYPE)",
    "EXECUTABLE_PREFIX": "",
    "EXECUTABLE_SUFFIX": "",
    "INTERMEDIATE_DIR": "$(obj).$(TOOLSET)/$(TARGET)/geni",
    "PRODUCT_DIR": "$(builddir)",
    "RULE_INPUT_DIRNAME": "%(INPUT_DIRNAME)s",
    "RULE_INPUT_EXT": "$(suffix $<)",
    "RULE_INPUT_NAME": "$(notdir $<)",
    "RULE_INPUT_PATH": "$(abspath $<)",
    "RULE_INPUT_ROOT": "%(INPUT_ROOT)s",
    "SHARED_INTERMEDIATE_DIR": "$(obj)/gen",
    "SHARED_LIB_PREFIX": "lib",
    "STATIC_LIB_PREFIX": "lib",
    "STATIC_LIB_SUFFIX": ".a",
}


def IsMac(params):
    return "mac" == gyp.common.GetFlavor(params)


def CalculateVariables(default_variables, params):
    default_variables.setdefault("OS", gyp.common.GetFlavor(params))


def AddCommandsForTarget(cwd, target, params, per_config_commands):
    output_dir = params["generator_flags"].get("output_dir", "out")
    for configuration_name, configuration in target["configurations"].items():
        if IsMac(params):
            xcode_settings = gyp.xcode_emulation.XcodeSettings(target)
            cflags = xcode_settings.GetCflags(configuration_name)
            cflags_c = xcode_settings.GetCflagsC(configuration_name)
            cflags_cc = xcode_settings.GetCflagsCC(configuration_name)
        else:
            cflags = configuration.get("cflags", [])
            cflags_c = configuration.get("cflags_c", [])
            cflags_cc = configuration.get("cflags_cc", [])

        cflags_c = cflags + cflags_c
        cflags_cc = cflags + cflags_cc

        defines = configuration.get("defines", [])
        defines = ["-D" + s for s in defines]

        # TODO(bnoordhuis) Handle generated source files.
        extensions = (".c", ".cc", ".cpp", ".cxx")
        sources = [s for s in target.get("sources", []) if s.endswith(extensions)]

        def resolve(filename):
            return os.path.abspath(os.path.join(cwd, filename))

        # TODO(bnoordhuis) Handle generated header files.
        include_dirs = configuration.get("include_dirs", [])
        include_dirs = [s for s in include_dirs if not s.startswith("$(obj)")]
        includes = ["-I" + resolve(s) for s in include_dirs]

        defines = gyp.common.EncodePOSIXShellList(defines)
        includes = gyp.common.EncodePOSIXShellList(includes)
        cflags_c = gyp.common.EncodePOSIXShellList(cflags_c)
        cflags_cc = gyp.common.EncodePOSIXShellList(cflags_cc)

        commands = per_config_commands.setdefault(configuration_name, [])
        for source in sources:
            file = resolve(source)
            isc = source.endswith(".c")
            cc = "cc" if isc else "c++"
            cflags = cflags_c if isc else cflags_cc
            command = " ".join(
                (
                    cc,
                    defines,
                    includes,
                    cflags,
                    "-c",
                    gyp.common.EncodePOSIXShellArgument(file),
                )
            )
            commands.append(dict(command=command, directory=output_dir, file=file))


def GenerateOutput(target_list, target_dicts, data, params):
    per_config_commands = {}
    for qualified_target, target in target_dicts.items():
        build_file, target_name, toolset = gyp.common.ParseQualifiedTarget(
            qualified_target
        )
        if IsMac(params):
            settings = data[build_file]
            gyp.xcode_emulation.MergeGlobalXcodeSettingsToSpec(settings, target)
        cwd = os.path.dirname(build_file)
        AddCommandsForTarget(cwd, target, params, per_config_commands)

    output_dir = params["generator_flags"].get("output_dir", "out")
    for configuration_name, commands in per_config_commands.items():
        filename = os.path.join(output_dir, configuration_name, "compile_commands.json")
        gyp.common.EnsureDirExists(filename)
        fp = open(filename, "w")
        json.dump(commands, fp=fp, indent=0, check_circular=False)


def PerformBuild(data, configurations, params):
    pass
# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.


import os
import gyp
import gyp.common
import gyp.msvs_emulation
import json

generator_supports_multiple_toolsets = True

generator_wants_static_library_dependencies_adjusted = False

generator_filelist_paths = {}

generator_default_variables = {}
for dirname in [
    "INTERMEDIATE_DIR",
    "SHARED_INTERMEDIATE_DIR",
    "PRODUCT_DIR",
    "LIB_DIR",
    "SHARED_LIB_DIR",
]:
    # Some gyp steps fail if these are empty(!).
    generator_default_variables[dirname] = "dir"
for unused in [
    "RULE_INPUT_PATH",
    "RULE_INPUT_ROOT",
    "RULE_INPUT_NAME",
    "RULE_INPUT_DIRNAME",
    "RULE_INPUT_EXT",
    "EXECUTABLE_PREFIX",
    "EXECUTABLE_SUFFIX",
    "STATIC_LIB_PREFIX",
    "STATIC_LIB_SUFFIX",
    "SHARED_LIB_PREFIX",
    "SHARED_LIB_SUFFIX",
    "CONFIGURATION_NAME",
]:
    generator_default_variables[unused] = ""


def CalculateVariables(default_variables, params):
    generator_flags = params.get("generator_flags", {})
    for key, val in generator_flags.items():
        default_variables.setdefault(key, val)
    default_variables.setdefault("OS", gyp.common.GetFlavor(params))

    flavor = gyp.common.GetFlavor(params)
    if flavor == "win":
        gyp.msvs_emulation.CalculateCommonVariables(default_variables, params)


def CalculateGeneratorInputInfo(params):
    """Calculate the generator specific info that gets fed to input (called by
  gyp)."""
    generator_flags = params.get("generator_flags", {})
    if generator_flags.get("adjust_static_libraries", False):
        global generator_wants_static_library_dependencies_adjusted
        generator_wants_static_library_dependencies_adjusted = True

    toplevel = params["options"].toplevel_dir
    generator_dir = os.path.relpath(params["options"].generator_output or ".")
    # output_dir: relative path from generator_dir to the build directory.
    output_dir = generator_flags.get("output_dir", "out")
    qualified_out_dir = os.path.normpath(
        os.path.join(toplevel, generator_dir, output_dir, "gypfiles")
    )
    global generator_filelist_paths
    generator_filelist_paths = {
        "toplevel": toplevel,
        "qualified_out_dir": qualified_out_dir,
    }


def GenerateOutput(target_list, target_dicts, data, params):
    # Map of target -> list of targets it depends on.
    edges = {}

    # Queue of targets to visit.
    targets_to_visit = target_list[:]

    while len(targets_to_visit) > 0:
        target = targets_to_visit.pop()
        if target in edges:
            continue
        edges[target] = []

        for dep in target_dicts[target].get("dependencies", []):
            edges[target].append(dep)
            targets_to_visit.append(dep)

    try:
        filepath = params["generator_flags"]["output_dir"]
    except KeyError:
        filepath = "."
    filename = os.path.join(filepath, "dump.json")
    f = open(filename, "w")
    json.dump(edges, f)
    f.close()
    print("Wrote json to %s." % filename)
# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""GYP backend that generates Eclipse CDT settings files.

This backend DOES NOT generate Eclipse CDT projects. Instead, it generates XML
files that can be imported into an Eclipse CDT project. The XML file contains a
list of include paths and symbols (i.e. defines).

Because a full .cproject definition is not created by this generator, it's not
possible to properly define the include dirs and symbols for each file
individually.  Instead, one set of includes/symbols is generated for the entire
project.  This works fairly well (and is a vast improvement in general), but may
still result in a few indexer issues here and there.

This generator has no automated tests, so expect it to be broken.
"""

from xml.sax.saxutils import escape
import os.path
import subprocess
import gyp
import gyp.common
import gyp.msvs_emulation
import shlex
import xml.etree.cElementTree as ET

generator_wants_static_library_dependencies_adjusted = False

generator_default_variables = {}

for dirname in ["INTERMEDIATE_DIR", "PRODUCT_DIR", "LIB_DIR", "SHARED_LIB_DIR"]:
    # Some gyp steps fail if these are empty(!), so we convert them to variables
    generator_default_variables[dirname] = "$" + dirname

for unused in [
    "RULE_INPUT_PATH",
    "RULE_INPUT_ROOT",
    "RULE_INPUT_NAME",
    "RULE_INPUT_DIRNAME",
    "RULE_INPUT_EXT",
    "EXECUTABLE_PREFIX",
    "EXECUTABLE_SUFFIX",
    "STATIC_LIB_PREFIX",
    "STATIC_LIB_SUFFIX",
    "SHARED_LIB_PREFIX",
    "SHARED_LIB_SUFFIX",
    "CONFIGURATION_NAME",
]:
    generator_default_variables[unused] = ""

# Include dirs will occasionally use the SHARED_INTERMEDIATE_DIR variable as
# part of the path when dealing with generated headers.  This value will be
# replaced dynamically for each configuration.
generator_default_variables["SHARED_INTERMEDIATE_DIR"] = "$SHARED_INTERMEDIATE_DIR"


def CalculateVariables(default_variables, params):
    generator_flags = params.get("generator_flags", {})
    for key, val in generator_flags.items():
        default_variables.setdefault(key, val)
    flavor = gyp.common.GetFlavor(params)
    default_variables.setdefault("OS", flavor)
    if flavor == "win":
        gyp.msvs_emulation.CalculateCommonVariables(default_variables, params)


def CalculateGeneratorInputInfo(params):
    """Calculate the generator specific info that gets fed to input (called by
  gyp)."""
    generator_flags = params.get("generator_flags", {})
    if generator_flags.get("adjust_static_libraries", False):
        global generator_wants_static_library_dependencies_adjusted
        generator_wants_static_library_dependencies_adjusted = True


def GetAllIncludeDirectories(
    target_list,
    target_dicts,
    shared_intermediate_dirs,
    config_name,
    params,
    compiler_path,
):
    """Calculate the set of include directories to be used.

  Returns:
    A list including all the include_dir's specified for every target followed
    by any include directories that were added as cflag compiler options.
  """

    gyp_includes_set = set()
    compiler_includes_list = []

    # Find compiler's default include dirs.
    if compiler_path:
        command = shlex.split(compiler_path)
        command.extend(["-E", "-xc++", "-v", "-"])
        proc = subprocess.Popen(
            args=command,
            stdin=subprocess.PIPE,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
        )
        output = proc.communicate()[1].decode("utf-8")
        # Extract the list of include dirs from the output, which has this format:
        #   ...
        #   #include "..." search starts here:
        #   #include <...> search starts here:
        #    /usr/include/c++/4.6
        #    /usr/local/include
        #   End of search list.
        #   ...
        in_include_list = False
        for line in output.splitlines():
            if line.startswith("#include"):
                in_include_list = True
                continue
            if line.startswith("End of search list."):
                break
            if in_include_list:
                include_dir = line.strip()
                if include_dir not in compiler_includes_list:
                    compiler_includes_list.append(include_dir)

    flavor = gyp.common.GetFlavor(params)
    if flavor == "win":
        generator_flags = params.get("generator_flags", {})
    for target_name in target_list:
        target = target_dicts[target_name]
        if config_name in target["configurations"]:
            config = target["configurations"][config_name]

            # Look for any include dirs that were explicitly added via cflags. This
            # may be done in gyp files to force certain includes to come at the end.
            # TODO(jgreenwald): Change the gyp files to not abuse cflags for this, and
            # remove this.
            if flavor == "win":
                msvs_settings = gyp.msvs_emulation.MsvsSettings(target, generator_flags)
                cflags = msvs_settings.GetCflags(config_name)
            else:
                cflags = config["cflags"]
            for cflag in cflags:
                if cflag.startswith("-I"):
                    include_dir = cflag[2:]
                    if include_dir not in compiler_includes_list:
                        compiler_includes_list.append(include_dir)

            # Find standard gyp include dirs.
            if "include_dirs" in config:
                include_dirs = config["include_dirs"]
                for shared_intermediate_dir in shared_intermediate_dirs:
                    for include_dir in include_dirs:
                        include_dir = include_dir.replace(
                            "$SHARED_INTERMEDIATE_DIR", shared_intermediate_dir
                        )
                        if not os.path.isabs(include_dir):
                            base_dir = os.path.dirname(target_name)

                            include_dir = base_dir + "/" + include_dir
                            include_dir = os.path.abspath(include_dir)

                        gyp_includes_set.add(include_dir)

    # Generate a list that has all the include dirs.
    all_includes_list = list(gyp_includes_set)
    all_includes_list.sort()
    for compiler_include in compiler_includes_list:
        if compiler_include not in gyp_includes_set:
            all_includes_list.append(compiler_include)

    # All done.
    return all_includes_list


def GetCompilerPath(target_list, data, options):
    """Determine a command that can be used to invoke the compiler.

  Returns:
    If this is a gyp project that has explicit make settings, try to determine
    the compiler from that.  Otherwise, see if a compiler was specified via the
    CC_target environment variable.
  """
    # First, see if the compiler is configured in make's settings.
    build_file, _, _ = gyp.common.ParseQualifiedTarget(target_list[0])
    make_global_settings_dict = data[build_file].get("make_global_settings", {})
    for key, value in make_global_settings_dict:
        if key in ["CC", "CXX"]:
            return os.path.join(options.toplevel_dir, value)

    # Check to see if the compiler was specified as an environment variable.
    for key in ["CC_target", "CC", "CXX"]:
        compiler = os.environ.get(key)
        if compiler:
            return compiler

    return "gcc"


def GetAllDefines(target_list, target_dicts, data, config_name, params, compiler_path):
    """Calculate the defines for a project.

  Returns:
    A dict that includes explicit defines declared in gyp files along with all
    of the default defines that the compiler uses.
  """

    # Get defines declared in the gyp files.
    all_defines = {}
    flavor = gyp.common.GetFlavor(params)
    if flavor == "win":
        generator_flags = params.get("generator_flags", {})
    for target_name in target_list:
        target = target_dicts[target_name]

        if flavor == "win":
            msvs_settings = gyp.msvs_emulation.MsvsSettings(target, generator_flags)
            extra_defines = msvs_settings.GetComputedDefines(config_name)
        else:
            extra_defines = []
        if config_name in target["configurations"]:
            config = target["configurations"][config_name]
            target_defines = config["defines"]
        else:
            target_defines = []
        for define in target_defines + extra_defines:
            split_define = define.split("=", 1)
            if len(split_define) == 1:
                split_define.append("1")
            if split_define[0].strip() in all_defines:
                # Already defined
                continue
            all_defines[split_define[0].strip()] = split_define[1].strip()
    # Get default compiler defines (if possible).
    if flavor == "win":
        return all_defines  # Default defines already processed in the loop above.
    if compiler_path:
        command = shlex.split(compiler_path)
        command.extend(["-E", "-dM", "-"])
        cpp_proc = subprocess.Popen(
            args=command, cwd=".", stdin=subprocess.PIPE, stdout=subprocess.PIPE
        )
        cpp_output = cpp_proc.communicate()[0].decode("utf-8")
        cpp_lines = cpp_output.split("\n")
        for cpp_line in cpp_lines:
            if not cpp_line.strip():
                continue
            cpp_line_parts = cpp_line.split(" ", 2)
            key = cpp_line_parts[1]
            if len(cpp_line_parts) >= 3:
                val = cpp_line_parts[2]
            else:
                val = "1"
            all_defines[key] = val

    return all_defines


def WriteIncludePaths(out, eclipse_langs, include_dirs):
    """Write the includes section of a CDT settings export file."""

    out.write(
        '  <section name="org.eclipse.cdt.internal.ui.wizards.'
        'settingswizards.IncludePaths">\n'
    )
    out.write('    <language name="holder for library settings"></language>\n')
    for lang in eclipse_langs:
        out.write('    <language name="%s">\n' % lang)
        for include_dir in include_dirs:
            out.write(
                '      <includepath workspace_path="false">%s</includepath>\n'
                % include_dir
            )
        out.write("    </language>\n")
    out.write("  </section>\n")


def WriteMacros(out, eclipse_langs, defines):
    """Write the macros section of a CDT settings export file."""

    out.write(
        '  <section name="org.eclipse.cdt.internal.ui.wizards.'
        'settingswizards.Macros">\n'
    )
    out.write('    <language name="holder for library settings"></language>\n')
    for lang in eclipse_langs:
        out.write('    <language name="%s">\n' % lang)
        for key in sorted(defines):
            out.write(
                "      <macro><name>%s</name><value>%s</value></macro>\n"
                % (escape(key), escape(defines[key]))
            )
        out.write("    </language>\n")
    out.write("  </section>\n")


def GenerateOutputForConfig(target_list, target_dicts, data, params, config_name):
    options = params["options"]
    generator_flags = params.get("generator_flags", {})

    # build_dir: relative path from source root to our output files.
    # e.g. "out/Debug"
    build_dir = os.path.join(generator_flags.get("output_dir", "out"), config_name)

    toplevel_build = os.path.join(options.toplevel_dir, build_dir)
    # Ninja uses out/Debug/gen while make uses out/Debug/obj/gen as the
    # SHARED_INTERMEDIATE_DIR. Include both possible locations.
    shared_intermediate_dirs = [
        os.path.join(toplevel_build, "obj", "gen"),
        os.path.join(toplevel_build, "gen"),
    ]

    GenerateCdtSettingsFile(
        target_list,
        target_dicts,
        data,
        params,
        config_name,
        os.path.join(toplevel_build, "eclipse-cdt-settings.xml"),
        options,
        shared_intermediate_dirs,
    )
    GenerateClasspathFile(
        target_list,
        target_dicts,
        options.toplevel_dir,
        toplevel_build,
        os.path.join(toplevel_build, "eclipse-classpath.xml"),
    )


def GenerateCdtSettingsFile(
    target_list,
    target_dicts,
    data,
    params,
    config_name,
    out_name,
    options,
    shared_intermediate_dirs,
):
    gyp.common.EnsureDirExists(out_name)
    with open(out_name, "w") as out:
        out.write('<?xml version="1.0" encoding="UTF-8"?>\n')
        out.write("<cdtprojectproperties>\n")

        eclipse_langs = [
            "C++ Source File",
            "C Source File",
            "Assembly Source File",
            "GNU C++",
            "GNU C",
            "Assembly",
        ]
        compiler_path = GetCompilerPath(target_list, data, options)
        include_dirs = GetAllIncludeDirectories(
            target_list,
            target_dicts,
            shared_intermediate_dirs,
            config_name,
            params,
            compiler_path,
        )
        WriteIncludePaths(out, eclipse_langs, include_dirs)
        defines = GetAllDefines(
            target_list, target_dicts, data, config_name, params, compiler_path
        )
        WriteMacros(out, eclipse_langs, defines)

        out.write("</cdtprojectproperties>\n")


def GenerateClasspathFile(
    target_list, target_dicts, toplevel_dir, toplevel_build, out_name
):
    """Generates a classpath file suitable for symbol navigation and code
  completion of Java code (such as in Android projects) by finding all
  .java and .jar files used as action inputs."""
    gyp.common.EnsureDirExists(out_name)
    result = ET.Element("classpath")

    def AddElements(kind, paths):
        # First, we need to normalize the paths so they are all relative to the
        # toplevel dir.
        rel_paths = set()
        for path in paths:
            if os.path.isabs(path):
                rel_paths.add(os.path.relpath(path, toplevel_dir))
            else:
                rel_paths.add(path)

        for path in sorted(rel_paths):
            entry_element = ET.SubElement(result, "classpathentry")
            entry_element.set("kind", kind)
            entry_element.set("path", path)

    AddElements("lib", GetJavaJars(target_list, target_dicts, toplevel_dir))
    AddElements("src", GetJavaSourceDirs(target_list, target_dicts, toplevel_dir))
    # Include the standard JRE container and a dummy out folder
    AddElements("con", ["org.eclipse.jdt.launching.JRE_CONTAINER"])
    # Include a dummy out folder so that Eclipse doesn't use the default /bin
    # folder in the root of the project.
    AddElements("output", [os.path.join(toplevel_build, ".eclipse-java-build")])

    ET.ElementTree(result).write(out_name)


def GetJavaJars(target_list, target_dicts, toplevel_dir):
    """Generates a sequence of all .jars used as inputs."""
    for target_name in target_list:
        target = target_dicts[target_name]
        for action in target.get("actions", []):
            for input_ in action["inputs"]:
                if os.path.splitext(input_)[1] == ".jar" and not input_.startswith("$"):
                    if os.path.isabs(input_):
                        yield input_
                    else:
                        yield os.path.join(os.path.dirname(target_name), input_)


def GetJavaSourceDirs(target_list, target_dicts, toplevel_dir):
    """Generates a sequence of all likely java package root directories."""
    for target_name in target_list:
        target = target_dicts[target_name]
        for action in target.get("actions", []):
            for input_ in action["inputs"]:
                if os.path.splitext(input_)[1] == ".java" and not input_.startswith(
                    "$"
                ):
                    dir_ = os.path.dirname(
                        os.path.join(os.path.dirname(target_name), input_)
                    )
                    # If there is a parent 'src' or 'java' folder, navigate up to it -
                    # these are canonical package root names in Chromium.  This will
                    # break if 'src' or 'java' exists in the package structure. This
                    # could be further improved by inspecting the java file for the
                    # package name if this proves to be too fragile in practice.
                    parent_search = dir_
                    while os.path.basename(parent_search) not in ["src", "java"]:
                        parent_search, _ = os.path.split(parent_search)
                        if not parent_search or parent_search == toplevel_dir:
                            # Didn't find a known root, just return the original path
                            yield dir_
                            break
                    else:
                        yield parent_search


def GenerateOutput(target_list, target_dicts, data, params):
    """Generate an XML settings file that can be imported into a CDT project."""

    if params["options"].generator_output:
        raise NotImplementedError("--generator_output not implemented for eclipse")

    user_config = params.get("generator_flags", {}).get("config", None)
    if user_config:
        GenerateOutputForConfig(target_list, target_dicts, data, params, user_config)
    else:
        config_names = target_dicts[target_list[0]]["configurations"]
        for config_name in config_names:
            GenerateOutputForConfig(
                target_list, target_dicts, data, params, config_name
            )
# Copyright (c) 2011 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""gypd output module

This module produces gyp input as its output.  Output files are given the
.gypd extension to avoid overwriting the .gyp files that they are generated
from.  Internal references to .gyp files (such as those found in
"dependencies" sections) are not adjusted to point to .gypd files instead;
unlike other paths, which are relative to the .gyp or .gypd file, such paths
are relative to the directory from which gyp was run to create the .gypd file.

This generator module is intended to be a sample and a debugging aid, hence
the "d" for "debug" in .gypd.  It is useful to inspect the results of the
various merges, expansions, and conditional evaluations performed by gyp
and to see a representation of what would be fed to a generator module.

It's not advisable to rename .gypd files produced by this module to .gyp,
because they will have all merges, expansions, and evaluations already
performed and the relevant constructs not present in the output; paths to
dependencies may be wrong; and various sections that do not belong in .gyp
files such as such as "included_files" and "*_excluded" will be present.
Output will also be stripped of comments.  This is not intended to be a
general-purpose gyp pretty-printer; for that, you probably just want to
run "pprint.pprint(eval(open('source.gyp').read()))", which will still strip
comments but won't do all of the other things done to this module's output.

The specific formatting of the output generated by this module is subject
to change.
"""


import gyp.common
import pprint


# These variables should just be spit back out as variable references.
_generator_identity_variables = [
    "CONFIGURATION_NAME",
    "EXECUTABLE_PREFIX",
    "EXECUTABLE_SUFFIX",
    "INTERMEDIATE_DIR",
    "LIB_DIR",
    "PRODUCT_DIR",
    "RULE_INPUT_ROOT",
    "RULE_INPUT_DIRNAME",
    "RULE_INPUT_EXT",
    "RULE_INPUT_NAME",
    "RULE_INPUT_PATH",
    "SHARED_INTERMEDIATE_DIR",
    "SHARED_LIB_DIR",
    "SHARED_LIB_PREFIX",
    "SHARED_LIB_SUFFIX",
    "STATIC_LIB_PREFIX",
    "STATIC_LIB_SUFFIX",
]

# gypd doesn't define a default value for OS like many other generator
# modules.  Specify "-D OS=whatever" on the command line to provide a value.
generator_default_variables = {}

# gypd supports multiple toolsets
generator_supports_multiple_toolsets = True

# TODO(mark): This always uses <, which isn't right.  The input module should
# notify the generator to tell it which phase it is operating in, and this
# module should use < for the early phase and then switch to > for the late
# phase.  Bonus points for carrying @ back into the output too.
for v in _generator_identity_variables:
    generator_default_variables[v] = "<(%s)" % v


def GenerateOutput(target_list, target_dicts, data, params):
    output_files = {}
    for qualified_target in target_list:
        [input_file, target] = gyp.common.ParseQualifiedTarget(qualified_target)[0:2]

        if input_file[-4:] != ".gyp":
            continue
        input_file_stem = input_file[:-4]
        output_file = input_file_stem + params["options"].suffix + ".gypd"

        output_files[output_file] = output_files.get(output_file, input_file)

    for output_file, input_file in output_files.items():
        output = open(output_file, "w")
        pprint.pprint(data[input_file], output)
        output.close()
# Copyright (c) 2011 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""gypsh output module

gypsh is a GYP shell.  It's not really a generator per se.  All it does is
fire up an interactive Python session with a few local variables set to the
variables passed to the generator.  Like gypd, it's intended as a debugging
aid, to facilitate the exploration of .gyp structures after being processed
by the input module.

The expected usage is "gyp -f gypsh -D OS=desired_os".
"""


import code
import sys


# All of this stuff about generator variables was lovingly ripped from gypd.py.
# That module has a much better description of what's going on and why.
_generator_identity_variables = [
    "EXECUTABLE_PREFIX",
    "EXECUTABLE_SUFFIX",
    "INTERMEDIATE_DIR",
    "PRODUCT_DIR",
    "RULE_INPUT_ROOT",
    "RULE_INPUT_DIRNAME",
    "RULE_INPUT_EXT",
    "RULE_INPUT_NAME",
    "RULE_INPUT_PATH",
    "SHARED_INTERMEDIATE_DIR",
]

generator_default_variables = {}

for v in _generator_identity_variables:
    generator_default_variables[v] = "<(%s)" % v


def GenerateOutput(target_list, target_dicts, data, params):
    locals = {
        "target_list": target_list,
        "target_dicts": target_dicts,
        "data": data,
    }

    # Use a banner that looks like the stock Python one and like what
    # code.interact uses by default, but tack on something to indicate what
    # locals are available, and identify gypsh.
    banner = "Python {} on {}\nlocals.keys() = {}\ngypsh".format(
        sys.version,
        sys.platform,
        repr(sorted(locals.keys())),
    )

    code.interact(banner, local=locals)
# Copyright (c) 2013 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Notes:
#
# This is all roughly based on the Makefile system used by the Linux
# kernel, but is a non-recursive make -- we put the entire dependency
# graph in front of make and let it figure it out.
#
# The code below generates a separate .mk file for each target, but
# all are sourced by the top-level Makefile.  This means that all
# variables in .mk-files clobber one another.  Be careful to use :=
# where appropriate for immediate evaluation, and similarly to watch
# that you're not relying on a variable value to last between different
# .mk files.
#
# TODOs:
#
# Global settings and utility functions are currently stuffed in the
# toplevel Makefile.  It may make sense to generate some .mk files on
# the side to keep the files readable.


import os
import re
import subprocess
import gyp
import gyp.common
import gyp.xcode_emulation
from gyp.common import GetEnvironFallback

import hashlib

generator_default_variables = {
    "EXECUTABLE_PREFIX": "",
    "EXECUTABLE_SUFFIX": "",
    "STATIC_LIB_PREFIX": "lib",
    "SHARED_LIB_PREFIX": "lib",
    "STATIC_LIB_SUFFIX": ".a",
    "INTERMEDIATE_DIR": "$(obj).$(TOOLSET)/$(TARGET)/geni",
    "SHARED_INTERMEDIATE_DIR": "$(obj)/gen",
    "PRODUCT_DIR": "$(builddir)",
    "RULE_INPUT_ROOT": "%(INPUT_ROOT)s",  # This gets expanded by Python.
    "RULE_INPUT_DIRNAME": "%(INPUT_DIRNAME)s",  # This gets expanded by Python.
    "RULE_INPUT_PATH": "$(abspath $<)",
    "RULE_INPUT_EXT": "$(suffix $<)",
    "RULE_INPUT_NAME": "$(notdir $<)",
    "CONFIGURATION_NAME": "$(BUILDTYPE)",
}

# Make supports multiple toolsets
generator_supports_multiple_toolsets = True

# Request sorted dependencies in the order from dependents to dependencies.
generator_wants_sorted_dependencies = False

# Placates pylint.
generator_additional_non_configuration_keys = []
generator_additional_path_sections = []
generator_extra_sources_for_rules = []
generator_filelist_paths = None


def CalculateVariables(default_variables, params):
    """Calculate additional variables for use in the build (called by gyp)."""
    flavor = gyp.common.GetFlavor(params)
    if flavor == "mac":
        default_variables.setdefault("OS", "mac")
        default_variables.setdefault("SHARED_LIB_SUFFIX", ".dylib")
        default_variables.setdefault(
            "SHARED_LIB_DIR", generator_default_variables["PRODUCT_DIR"]
        )
        default_variables.setdefault(
            "LIB_DIR", generator_default_variables["PRODUCT_DIR"]
        )

        # Copy additional generator configuration data from Xcode, which is shared
        # by the Mac Make generator.
        import gyp.generator.xcode as xcode_generator

        global generator_additional_non_configuration_keys
        generator_additional_non_configuration_keys = getattr(
            xcode_generator, "generator_additional_non_configuration_keys", []
        )
        global generator_additional_path_sections
        generator_additional_path_sections = getattr(
            xcode_generator, "generator_additional_path_sections", []
        )
        global generator_extra_sources_for_rules
        generator_extra_sources_for_rules = getattr(
            xcode_generator, "generator_extra_sources_for_rules", []
        )
        COMPILABLE_EXTENSIONS.update({".m": "objc", ".mm": "objcxx"})
    else:
        operating_system = flavor
        if flavor == "android":
            operating_system = "linux"  # Keep this legacy behavior for now.
        default_variables.setdefault("OS", operating_system)
        if flavor == "aix":
            default_variables.setdefault("SHARED_LIB_SUFFIX", ".a")
        else:
            default_variables.setdefault("SHARED_LIB_SUFFIX", ".so")
        default_variables.setdefault("SHARED_LIB_DIR", "$(builddir)/lib.$(TOOLSET)")
        default_variables.setdefault("LIB_DIR", "$(obj).$(TOOLSET)")


def CalculateGeneratorInputInfo(params):
    """Calculate the generator specific info that gets fed to input (called by
    gyp)."""
    generator_flags = params.get("generator_flags", {})
    android_ndk_version = generator_flags.get("android_ndk_version", None)
    # Android NDK requires a strict link order.
    if android_ndk_version:
        global generator_wants_sorted_dependencies
        generator_wants_sorted_dependencies = True

    output_dir = params["options"].generator_output or params["options"].toplevel_dir
    builddir_name = generator_flags.get("output_dir", "out")
    qualified_out_dir = os.path.normpath(
        os.path.join(output_dir, builddir_name, "gypfiles")
    )

    global generator_filelist_paths
    generator_filelist_paths = {
        "toplevel": params["options"].toplevel_dir,
        "qualified_out_dir": qualified_out_dir,
    }


# The .d checking code below uses these functions:
# wildcard, sort, foreach, shell, wordlist
# wildcard can handle spaces, the rest can't.
# Since I could find no way to make foreach work with spaces in filenames
# correctly, the .d files have spaces replaced with another character. The .d
# file for
#     Chromium\ Framework.framework/foo
# is for example
#     out/Release/.deps/out/Release/Chromium?Framework.framework/foo
# This is the replacement character.
SPACE_REPLACEMENT = "?"


LINK_COMMANDS_LINUX = """\
quiet_cmd_alink = AR($(TOOLSET)) $@
cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) crs $@ $(filter %.o,$^)

quiet_cmd_alink_thin = AR($(TOOLSET)) $@
cmd_alink_thin = rm -f $@ && $(AR.$(TOOLSET)) crsT $@ $(filter %.o,$^)

# Due to circular dependencies between libraries :(, we wrap the
# special "figure out circular dependencies" flags around the entire
# input list during linking.
quiet_cmd_link = LINK($(TOOLSET)) $@
cmd_link = $(LINK.$(TOOLSET)) -o $@ $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,--start-group $(LD_INPUTS) $(LIBS) -Wl,--end-group

# We support two kinds of shared objects (.so):
# 1) shared_library, which is just bundling together many dependent libraries
# into a link line.
# 2) loadable_module, which is generating a module intended for dlopen().
#
# They differ only slightly:
# In the former case, we want to package all dependent code into the .so.
# In the latter case, we want to package just the API exposed by the
# outermost module.
# This means shared_library uses --whole-archive, while loadable_module doesn't.
# (Note that --whole-archive is incompatible with the --start-group used in
# normal linking.)

# Other shared-object link notes:
# - Set SONAME to the library filename so our binaries don't reference
# the local, absolute paths used on the link command-line.
quiet_cmd_solink = SOLINK($(TOOLSET)) $@
cmd_solink = $(LINK.$(TOOLSET)) -o $@ -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,-soname=$(@F) -Wl,--whole-archive $(LD_INPUTS) -Wl,--no-whole-archive $(LIBS)

quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@
cmd_solink_module = $(LINK.$(TOOLSET)) -o $@ -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,-soname=$(@F) -Wl,--start-group $(filter-out FORCE_DO_CMD, $^) -Wl,--end-group $(LIBS)
"""  # noqa: E501

LINK_COMMANDS_MAC = """\
quiet_cmd_alink = LIBTOOL-STATIC $@
cmd_alink = rm -f $@ && ./gyp-mac-tool filter-libtool libtool $(GYP_LIBTOOLFLAGS) -static -o $@ $(filter %.o,$^)

quiet_cmd_link = LINK($(TOOLSET)) $@
cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS)

quiet_cmd_solink = SOLINK($(TOOLSET)) $@
cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS)

quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@
cmd_solink_module = $(LINK.$(TOOLSET)) -bundle $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS)
"""  # noqa: E501

LINK_COMMANDS_ANDROID = """\
quiet_cmd_alink = AR($(TOOLSET)) $@
cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) crs $@ $(filter %.o,$^)

quiet_cmd_alink_thin = AR($(TOOLSET)) $@
cmd_alink_thin = rm -f $@ && $(AR.$(TOOLSET)) crsT $@ $(filter %.o,$^)

# Due to circular dependencies between libraries :(, we wrap the
# special "figure out circular dependencies" flags around the entire
# input list during linking.
quiet_cmd_link = LINK($(TOOLSET)) $@
quiet_cmd_link_host = LINK($(TOOLSET)) $@
cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ -Wl,--start-group $(LD_INPUTS) -Wl,--end-group $(LIBS)
cmd_link_host = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ -Wl,--start-group $(LD_INPUTS) -Wl,--end-group $(LIBS)

# Other shared-object link notes:
# - Set SONAME to the library filename so our binaries don't reference
# the local, absolute paths used on the link command-line.
quiet_cmd_solink = SOLINK($(TOOLSET)) $@
cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,-soname=$(@F) -o $@ -Wl,--whole-archive $(LD_INPUTS) -Wl,--no-whole-archive $(LIBS)

quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@
cmd_solink_module = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,-soname=$(@F) -o $@ -Wl,--start-group $(filter-out FORCE_DO_CMD, $^) -Wl,--end-group $(LIBS)
quiet_cmd_solink_module_host = SOLINK_MODULE($(TOOLSET)) $@
cmd_solink_module_host = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -Wl,-soname=$(@F) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS)
"""  # noqa: E501


LINK_COMMANDS_AIX = """\
quiet_cmd_alink = AR($(TOOLSET)) $@
cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) -X32_64 crs $@ $(filter %.o,$^)

quiet_cmd_alink_thin = AR($(TOOLSET)) $@
cmd_alink_thin = rm -f $@ && $(AR.$(TOOLSET)) -X32_64 crs $@ $(filter %.o,$^)

quiet_cmd_link = LINK($(TOOLSET)) $@
cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) $(LIBS)

quiet_cmd_solink = SOLINK($(TOOLSET)) $@
cmd_solink = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) $(LIBS)

quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@
cmd_solink_module = $(LINK.$(TOOLSET)) -shared $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS)
"""  # noqa: E501


LINK_COMMANDS_OS390 = """\
quiet_cmd_alink = AR($(TOOLSET)) $@
cmd_alink = rm -f $@ && $(AR.$(TOOLSET)) crs $@ $(filter %.o,$^)

quiet_cmd_alink_thin = AR($(TOOLSET)) $@
cmd_alink_thin = rm -f $@ && $(AR.$(TOOLSET)) crsT $@ $(filter %.o,$^)

quiet_cmd_link = LINK($(TOOLSET)) $@
cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) $(LIBS)

quiet_cmd_solink = SOLINK($(TOOLSET)) $@
cmd_solink = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(LD_INPUTS) $(LIBS) -Wl,DLL

quiet_cmd_solink_module = SOLINK_MODULE($(TOOLSET)) $@
cmd_solink_module = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o $@ $(filter-out FORCE_DO_CMD, $^) $(LIBS) -Wl,DLL
"""  # noqa: E501


# Header of toplevel Makefile.
# This should go into the build tree, but it's easier to keep it here for now.
SHARED_HEADER = (
    """\
# We borrow heavily from the kernel build setup, though we are simpler since
# we don't have Kconfig tweaking settings on us.

# The implicit make rules have it looking for RCS files, among other things.
# We instead explicitly write all the rules we care about.
# It's even quicker (saves ~200ms) to pass -r on the command line.
MAKEFLAGS=-r

# The source directory tree.
srcdir := %(srcdir)s
abs_srcdir := $(abspath $(srcdir))

# The name of the builddir.
builddir_name ?= %(builddir)s

# The V=1 flag on command line makes us verbosely print command lines.
ifdef V
  quiet=
else
  quiet=quiet_
endif

# Specify BUILDTYPE=Release on the command line for a release build.
BUILDTYPE ?= %(default_configuration)s

# Directory all our build output goes into.
# Note that this must be two directories beneath src/ for unit tests to pass,
# as they reach into the src/ directory for data with relative paths.
builddir ?= $(builddir_name)/$(BUILDTYPE)
abs_builddir := $(abspath $(builddir))
depsdir := $(builddir)/.deps

# Object output directory.
obj := $(builddir)/obj
abs_obj := $(abspath $(obj))

# We build up a list of every single one of the targets so we can slurp in the
# generated dependency rule Makefiles in one pass.
all_deps :=

%(make_global_settings)s

CC.target ?= %(CC.target)s
CFLAGS.target ?= $(CPPFLAGS) $(CFLAGS)
CXX.target ?= %(CXX.target)s
CXXFLAGS.target ?= $(CPPFLAGS) $(CXXFLAGS)
LINK.target ?= %(LINK.target)s
LDFLAGS.target ?= $(LDFLAGS)
AR.target ?= $(AR)

# C++ apps need to be linked with g++.
LINK ?= $(CXX.target)

# TODO(evan): move all cross-compilation logic to gyp-time so we don't need
# to replicate this environment fallback in make as well.
CC.host ?= %(CC.host)s
CFLAGS.host ?= $(CPPFLAGS_host) $(CFLAGS_host)
CXX.host ?= %(CXX.host)s
CXXFLAGS.host ?= $(CPPFLAGS_host) $(CXXFLAGS_host)
LINK.host ?= %(LINK.host)s
LDFLAGS.host ?= $(LDFLAGS_host)
AR.host ?= %(AR.host)s

# Define a dir function that can handle spaces.
# http://www.gnu.org/software/make/manual/make.html#Syntax-of-Functions
# "leading spaces cannot appear in the text of the first argument as written.
# These characters can be put into the argument value by variable substitution."
empty :=
space := $(empty) $(empty)

# http://stackoverflow.com/questions/1189781/using-make-dir-or-notdir-on-a-path-with-spaces
replace_spaces = $(subst $(space),"""
    + SPACE_REPLACEMENT
    + """,$1)
unreplace_spaces = $(subst """
    + SPACE_REPLACEMENT
    + """,$(space),$1)
dirx = $(call unreplace_spaces,$(dir $(call replace_spaces,$1)))

# Flags to make gcc output dependency info.  Note that you need to be
# careful here to use the flags that ccache and distcc can understand.
# We write to a dep file on the side first and then rename at the end
# so we can't end up with a broken dep file.
depfile = $(depsdir)/$(call replace_spaces,$@).d
DEPFLAGS = %(makedep_args)s -MF $(depfile).raw

# We have to fixup the deps output in a few ways.
# (1) the file output should mention the proper .o file.
# ccache or distcc lose the path to the target, so we convert a rule of
# the form:
#   foobar.o: DEP1 DEP2
# into
#   path/to/foobar.o: DEP1 DEP2
# (2) we want missing files not to cause us to fail to build.
# We want to rewrite
#   foobar.o: DEP1 DEP2 \\
#               DEP3
# to
#   DEP1:
#   DEP2:
#   DEP3:
# so if the files are missing, they're just considered phony rules.
# We have to do some pretty insane escaping to get those backslashes
# and dollar signs past make, the shell, and sed at the same time.
# Doesn't work with spaces, but that's fine: .d files have spaces in
# their names replaced with other characters."""
    r"""
define fixup_dep
# The depfile may not exist if the input file didn't have any #includes.
touch $(depfile).raw
# Fixup path as in (1).
sed -e "s|^$(notdir $@)|$@|" $(depfile).raw >> $(depfile)
# Add extra rules as in (2).
# We remove slashes and replace spaces with new lines;
# remove blank lines;
# delete the first line and append a colon to the remaining lines.
sed -e 's|\\||' -e 'y| |\n|' $(depfile).raw |\
  grep -v '^$$'                             |\
  sed -e 1d -e 's|$$|:|'                     \
    >> $(depfile)
rm $(depfile).raw
endef
"""
    """
# Command definitions:
# - cmd_foo is the actual command to run;
# - quiet_cmd_foo is the brief-output summary of the command.

quiet_cmd_cc = CC($(TOOLSET)) $@
cmd_cc = $(CC.$(TOOLSET)) -o $@ $< $(GYP_CFLAGS) $(DEPFLAGS) $(CFLAGS.$(TOOLSET)) -c

quiet_cmd_cxx = CXX($(TOOLSET)) $@
cmd_cxx = $(CXX.$(TOOLSET)) -o $@ $< $(GYP_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c
%(extra_commands)s
quiet_cmd_touch = TOUCH $@
cmd_touch = touch $@

quiet_cmd_copy = COPY $@
# send stderr to /dev/null to ignore messages when linking directories.
cmd_copy = ln -f "$<" "$@" 2>/dev/null || (rm -rf "$@" && cp %(copy_archive_args)s "$<" "$@")

%(link_commands)s
"""  # noqa: E501
    r"""
# Define an escape_quotes function to escape single quotes.
# This allows us to handle quotes properly as long as we always use
# use single quotes and escape_quotes.
escape_quotes = $(subst ','\'',$(1))
# This comment is here just to include a ' to unconfuse syntax highlighting.
# Define an escape_vars function to escape '$' variable syntax.
# This allows us to read/write command lines with shell variables (e.g.
# $LD_LIBRARY_PATH), without triggering make substitution.
escape_vars = $(subst $$,$$$$,$(1))
# Helper that expands to a shell command to echo a string exactly as it is in
# make. This uses printf instead of echo because printf's behaviour with respect
# to escape sequences is more portable than echo's across different shells
# (e.g., dash, bash).
exact_echo = printf '%%s\n' '$(call escape_quotes,$(1))'
"""
    """
# Helper to compare the command we're about to run against the command
# we logged the last time we ran the command.  Produces an empty
# string (false) when the commands match.
# Tricky point: Make has no string-equality test function.
# The kernel uses the following, but it seems like it would have false
# positives, where one string reordered its arguments.
#   arg_check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \\
#                       $(filter-out $(cmd_$@), $(cmd_$(1))))
# We instead substitute each for the empty string into the other, and
# say they're equal if both substitutions produce the empty string.
# .d files contain """
    + SPACE_REPLACEMENT
    + """ instead of spaces, take that into account.
command_changed = $(or $(subst $(cmd_$(1)),,$(cmd_$(call replace_spaces,$@))),\\
                       $(subst $(cmd_$(call replace_spaces,$@)),,$(cmd_$(1))))

# Helper that is non-empty when a prerequisite changes.
# Normally make does this implicitly, but we force rules to always run
# so we can check their command lines.
#   $? -- new prerequisites
#   $| -- order-only dependencies
prereq_changed = $(filter-out FORCE_DO_CMD,$(filter-out $|,$?))

# Helper that executes all postbuilds until one fails.
define do_postbuilds
  @E=0;\\
  for p in $(POSTBUILDS); do\\
    eval $$p;\\
    E=$$?;\\
    if [ $$E -ne 0 ]; then\\
      break;\\
    fi;\\
  done;\\
  if [ $$E -ne 0 ]; then\\
    rm -rf "$@";\\
    exit $$E;\\
  fi
endef

# do_cmd: run a command via the above cmd_foo names, if necessary.
# Should always run for a given target to handle command-line changes.
# Second argument, if non-zero, makes it do asm/C/C++ dependency munging.
# Third argument, if non-zero, makes it do POSTBUILDS processing.
# Note: We intentionally do NOT call dirx for depfile, since it contains """
    + SPACE_REPLACEMENT
    + """ for
# spaces already and dirx strips the """
    + SPACE_REPLACEMENT
    + """ characters.
define do_cmd
$(if $(or $(command_changed),$(prereq_changed)),
  @$(call exact_echo,  $($(quiet)cmd_$(1)))
  @mkdir -p "$(call dirx,$@)" "$(dir $(depfile))"
  $(if $(findstring flock,$(word %(flock_index)d,$(cmd_$1))),
    @$(cmd_$(1))
    @echo "  $(quiet_cmd_$(1)): Finished",
    @$(cmd_$(1))
  )
  @$(call exact_echo,$(call escape_vars,cmd_$(call replace_spaces,$@) := $(cmd_$(1)))) > $(depfile)
  @$(if $(2),$(fixup_dep))
  $(if $(and $(3), $(POSTBUILDS)),
    $(call do_postbuilds)
  )
)
endef

# Declare the "%(default_target)s" target first so it is the default,
# even though we don't have the deps yet.
.PHONY: %(default_target)s
%(default_target)s:

# make looks for ways to re-generate included makefiles, but in our case, we
# don't have a direct way. Explicitly telling make that it has nothing to do
# for them makes it go faster.
%%.d: ;

# Use FORCE_DO_CMD to force a target to run.  Should be coupled with
# do_cmd.
.PHONY: FORCE_DO_CMD
FORCE_DO_CMD:

"""  # noqa: E501
)

SHARED_HEADER_MAC_COMMANDS = """
quiet_cmd_objc = CXX($(TOOLSET)) $@
cmd_objc = $(CC.$(TOOLSET)) $(GYP_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $<

quiet_cmd_objcxx = CXX($(TOOLSET)) $@
cmd_objcxx = $(CXX.$(TOOLSET)) $(GYP_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $<

# Commands for precompiled header files.
quiet_cmd_pch_c = CXX($(TOOLSET)) $@
cmd_pch_c = $(CC.$(TOOLSET)) $(GYP_PCH_CFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $<
quiet_cmd_pch_cc = CXX($(TOOLSET)) $@
cmd_pch_cc = $(CC.$(TOOLSET)) $(GYP_PCH_CXXFLAGS) $(DEPFLAGS) $(CXXFLAGS.$(TOOLSET)) -c -o $@ $<
quiet_cmd_pch_m = CXX($(TOOLSET)) $@
cmd_pch_m = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCFLAGS) $(DEPFLAGS) -c -o $@ $<
quiet_cmd_pch_mm = CXX($(TOOLSET)) $@
cmd_pch_mm = $(CC.$(TOOLSET)) $(GYP_PCH_OBJCXXFLAGS) $(DEPFLAGS) -c -o $@ $<

# gyp-mac-tool is written next to the root Makefile by gyp.
# Use $(4) for the command, since $(2) and $(3) are used as flag by do_cmd
# already.
quiet_cmd_mac_tool = MACTOOL $(4) $<
cmd_mac_tool = ./gyp-mac-tool $(4) $< "$@"

quiet_cmd_mac_package_framework = PACKAGE FRAMEWORK $@
cmd_mac_package_framework = ./gyp-mac-tool package-framework "$@" $(4)

quiet_cmd_infoplist = INFOPLIST $@
cmd_infoplist = $(CC.$(TOOLSET)) -E -P -Wno-trigraphs -x c $(INFOPLIST_DEFINES) "$<" -o "$@"
"""  # noqa: E501


def WriteRootHeaderSuffixRules(writer):
    extensions = sorted(COMPILABLE_EXTENSIONS.keys(), key=str.lower)

    writer.write("# Suffix rules, putting all outputs into $(obj).\n")
    for ext in extensions:
        writer.write("$(obj).$(TOOLSET)/%%.o: $(srcdir)/%%%s FORCE_DO_CMD\n" % ext)
        writer.write("\t@$(call do_cmd,%s,1)\n" % COMPILABLE_EXTENSIONS[ext])

    writer.write("\n# Try building from generated source, too.\n")
    for ext in extensions:
        writer.write(
            "$(obj).$(TOOLSET)/%%.o: $(obj).$(TOOLSET)/%%%s FORCE_DO_CMD\n" % ext
        )
        writer.write("\t@$(call do_cmd,%s,1)\n" % COMPILABLE_EXTENSIONS[ext])
    writer.write("\n")
    for ext in extensions:
        writer.write("$(obj).$(TOOLSET)/%%.o: $(obj)/%%%s FORCE_DO_CMD\n" % ext)
        writer.write("\t@$(call do_cmd,%s,1)\n" % COMPILABLE_EXTENSIONS[ext])
    writer.write("\n")


SHARED_HEADER_SUFFIX_RULES_COMMENT1 = """\
# Suffix rules, putting all outputs into $(obj).
"""


SHARED_HEADER_SUFFIX_RULES_COMMENT2 = """\
# Try building from generated source, too.
"""


SHARED_FOOTER = """\
# "all" is a concatenation of the "all" targets from all the included
# sub-makefiles. This is just here to clarify.
all:

# Add in dependency-tracking rules.  $(all_deps) is the list of every single
# target in our tree. Only consider the ones with .d (dependency) info:
d_files := $(wildcard $(foreach f,$(all_deps),$(depsdir)/$(f).d))
ifneq ($(d_files),)
  include $(d_files)
endif
"""

header = """\
# This file is generated by gyp; do not edit.

"""

# Maps every compilable file extension to the do_cmd that compiles it.
COMPILABLE_EXTENSIONS = {
    ".c": "cc",
    ".cc": "cxx",
    ".cpp": "cxx",
    ".cxx": "cxx",
    ".s": "cc",
    ".S": "cc",
}


def Compilable(filename):
    """Return true if the file is compilable (should be in OBJS)."""
    for res in (filename.endswith(e) for e in COMPILABLE_EXTENSIONS):
        if res:
            return True
    return False


def Linkable(filename):
    """Return true if the file is linkable (should be on the link line)."""
    return filename.endswith(".o")


def Target(filename):
    """Translate a compilable filename to its .o target."""
    return os.path.splitext(filename)[0] + ".o"


def EscapeShellArgument(s):
    """Quotes an argument so that it will be interpreted literally by a POSIX
    shell. Taken from
    http://stackoverflow.com/questions/35817/whats-the-best-way-to-escape-ossystem-calls-in-python
    """
    return "'" + s.replace("'", "'\\''") + "'"


def EscapeMakeVariableExpansion(s):
    """Make has its own variable expansion syntax using $. We must escape it for
    string to be interpreted literally."""
    return s.replace("$", "$$")


def EscapeCppDefine(s):
    """Escapes a CPP define so that it will reach the compiler unaltered."""
    s = EscapeShellArgument(s)
    s = EscapeMakeVariableExpansion(s)
    # '#' characters must be escaped even embedded in a string, else Make will
    # treat it as the start of a comment.
    return s.replace("#", r"\#")


def QuoteIfNecessary(string):
    """TODO: Should this ideally be replaced with one or more of the above
    functions?"""
    if '"' in string:
        string = '"' + string.replace('"', '\\"') + '"'
    return string


def StringToMakefileVariable(string):
    """Convert a string to a value that is acceptable as a make variable name."""
    return re.sub("[^a-zA-Z0-9_]", "_", string)


srcdir_prefix = ""


def Sourceify(path):
    """Convert a path to its source directory form."""
    if "$(" in path:
        return path
    if os.path.isabs(path):
        return path
    return srcdir_prefix + path


def QuoteSpaces(s, quote=r"\ "):
    return s.replace(" ", quote)


def SourceifyAndQuoteSpaces(path):
    """Convert a path to its source directory form and quote spaces."""
    return QuoteSpaces(Sourceify(path))


# Map from qualified target to path to output.
target_outputs = {}
# Map from qualified target to any linkable output.  A subset
# of target_outputs.  E.g. when mybinary depends on liba, we want to
# include liba in the linker line; when otherbinary depends on
# mybinary, we just want to build mybinary first.
target_link_deps = {}


class MakefileWriter:
    """MakefileWriter packages up the writing of one target-specific foobar.mk.

    Its only real entry point is Write(), and is mostly used for namespacing.
    """

    def __init__(self, generator_flags, flavor):
        self.generator_flags = generator_flags
        self.flavor = flavor

        self.suffix_rules_srcdir = {}
        self.suffix_rules_objdir1 = {}
        self.suffix_rules_objdir2 = {}

        # Generate suffix rules for all compilable extensions.
        for ext in COMPILABLE_EXTENSIONS.keys():
            # Suffix rules for source folder.
            self.suffix_rules_srcdir.update(
                {
                    ext: (
                        """\
$(obj).$(TOOLSET)/$(TARGET)/%%.o: $(srcdir)/%%%s FORCE_DO_CMD
\t@$(call do_cmd,%s,1)
"""
                        % (ext, COMPILABLE_EXTENSIONS[ext])
                    )
                }
            )

            # Suffix rules for generated source files.
            self.suffix_rules_objdir1.update(
                {
                    ext: (
                        """\
$(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj).$(TOOLSET)/%%%s FORCE_DO_CMD
\t@$(call do_cmd,%s,1)
"""
                        % (ext, COMPILABLE_EXTENSIONS[ext])
                    )
                }
            )
            self.suffix_rules_objdir2.update(
                {
                    ext: (
                        """\
$(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
\t@$(call do_cmd,%s,1)
"""
                        % (ext, COMPILABLE_EXTENSIONS[ext])
                    )
                }
            )

    def Write(
        self, qualified_target, base_path, output_filename, spec, configs, part_of_all
    ):
        """The main entry point: writes a .mk file for a single target.

        Arguments:
          qualified_target: target we're generating
          base_path: path relative to source root we're building in, used to resolve
                     target-relative paths
          output_filename: output .mk file name to write
          spec, configs: gyp info
          part_of_all: flag indicating this target is part of 'all'
        """
        gyp.common.EnsureDirExists(output_filename)

        self.fp = open(output_filename, "w")

        self.fp.write(header)

        self.qualified_target = qualified_target
        self.path = base_path
        self.target = spec["target_name"]
        self.type = spec["type"]
        self.toolset = spec["toolset"]

        self.is_mac_bundle = gyp.xcode_emulation.IsMacBundle(self.flavor, spec)
        if self.flavor == "mac":
            self.xcode_settings = gyp.xcode_emulation.XcodeSettings(spec)
        else:
            self.xcode_settings = None

        deps, link_deps = self.ComputeDeps(spec)

        # Some of the generation below can add extra output, sources, or
        # link dependencies.  All of the out params of the functions that
        # follow use names like extra_foo.
        extra_outputs = []
        extra_sources = []
        extra_link_deps = []
        extra_mac_bundle_resources = []
        mac_bundle_deps = []

        if self.is_mac_bundle:
            self.output = self.ComputeMacBundleOutput(spec)
            self.output_binary = self.ComputeMacBundleBinaryOutput(spec)
        else:
            self.output = self.output_binary = self.ComputeOutput(spec)

        self.is_standalone_static_library = bool(
            spec.get("standalone_static_library", 0)
        )
        self._INSTALLABLE_TARGETS = ("executable", "loadable_module", "shared_library")
        if self.is_standalone_static_library or self.type in self._INSTALLABLE_TARGETS:
            self.alias = os.path.basename(self.output)
            install_path = self._InstallableTargetInstallPath()
        else:
            self.alias = self.output
            install_path = self.output

        self.WriteLn("TOOLSET := " + self.toolset)
        self.WriteLn("TARGET := " + self.target)

        # Actions must come first, since they can generate more OBJs for use below.
        if "actions" in spec:
            self.WriteActions(
                spec["actions"],
                extra_sources,
                extra_outputs,
                extra_mac_bundle_resources,
                part_of_all,
            )

        # Rules must be early like actions.
        if "rules" in spec:
            self.WriteRules(
                spec["rules"],
                extra_sources,
                extra_outputs,
                extra_mac_bundle_resources,
                part_of_all,
            )

        if "copies" in spec:
            self.WriteCopies(spec["copies"], extra_outputs, part_of_all)

        # Bundle resources.
        if self.is_mac_bundle:
            all_mac_bundle_resources = (
                spec.get("mac_bundle_resources", []) + extra_mac_bundle_resources
            )
            self.WriteMacBundleResources(all_mac_bundle_resources, mac_bundle_deps)
            self.WriteMacInfoPlist(mac_bundle_deps)

        # Sources.
        all_sources = spec.get("sources", []) + extra_sources
        if all_sources:
            self.WriteSources(
                configs,
                deps,
                all_sources,
                extra_outputs,
                extra_link_deps,
                part_of_all,
                gyp.xcode_emulation.MacPrefixHeader(
                    self.xcode_settings,
                    lambda p: Sourceify(self.Absolutify(p)),
                    self.Pchify,
                ),
            )
            sources = [x for x in all_sources if Compilable(x)]
            if sources:
                self.WriteLn(SHARED_HEADER_SUFFIX_RULES_COMMENT1)
                extensions = {os.path.splitext(s)[1] for s in sources}
                for ext in extensions:
                    if ext in self.suffix_rules_srcdir:
                        self.WriteLn(self.suffix_rules_srcdir[ext])
                self.WriteLn(SHARED_HEADER_SUFFIX_RULES_COMMENT2)
                for ext in extensions:
                    if ext in self.suffix_rules_objdir1:
                        self.WriteLn(self.suffix_rules_objdir1[ext])
                for ext in extensions:
                    if ext in self.suffix_rules_objdir2:
                        self.WriteLn(self.suffix_rules_objdir2[ext])
                self.WriteLn("# End of this set of suffix rules")

                # Add dependency from bundle to bundle binary.
                if self.is_mac_bundle:
                    mac_bundle_deps.append(self.output_binary)

        self.WriteTarget(
            spec,
            configs,
            deps,
            extra_link_deps + link_deps,
            mac_bundle_deps,
            extra_outputs,
            part_of_all,
        )

        # Update global list of target outputs, used in dependency tracking.
        target_outputs[qualified_target] = install_path

        # Update global list of link dependencies.
        if self.type in ("static_library", "shared_library"):
            target_link_deps[qualified_target] = self.output_binary

        # Currently any versions have the same effect, but in future the behavior
        # could be different.
        if self.generator_flags.get("android_ndk_version", None):
            self.WriteAndroidNdkModuleRule(self.target, all_sources, link_deps)

        self.fp.close()

    def WriteSubMake(self, output_filename, makefile_path, targets, build_dir):
        """Write a "sub-project" Makefile.

        This is a small, wrapper Makefile that calls the top-level Makefile to build
        the targets from a single gyp file (i.e. a sub-project).

        Arguments:
          output_filename: sub-project Makefile name to write
          makefile_path: path to the top-level Makefile
          targets: list of "all" targets for this sub-project
          build_dir: build output directory, relative to the sub-project
        """
        gyp.common.EnsureDirExists(output_filename)
        self.fp = open(output_filename, "w")
        self.fp.write(header)
        # For consistency with other builders, put sub-project build output in the
        # sub-project dir (see test/subdirectory/gyptest-subdir-all.py).
        self.WriteLn(
            "export builddir_name ?= %s"
            % os.path.join(os.path.dirname(output_filename), build_dir)
        )
        self.WriteLn(".PHONY: all")
        self.WriteLn("all:")
        if makefile_path:
            makefile_path = " -C " + makefile_path
        self.WriteLn("\t$(MAKE){} {}".format(makefile_path, " ".join(targets)))
        self.fp.close()

    def WriteActions(
        self,
        actions,
        extra_sources,
        extra_outputs,
        extra_mac_bundle_resources,
        part_of_all,
    ):
        """Write Makefile code for any 'actions' from the gyp input.

        extra_sources: a list that will be filled in with newly generated source
                       files, if any
        extra_outputs: a list that will be filled in with any outputs of these
                       actions (used to make other pieces dependent on these
                       actions)
        part_of_all: flag indicating this target is part of 'all'
        """
        env = self.GetSortedXcodeEnv()
        for action in actions:
            name = StringToMakefileVariable(
                "{}_{}".format(self.qualified_target, action["action_name"])
            )
            self.WriteLn('### Rules for action "%s":' % action["action_name"])
            inputs = action["inputs"]
            outputs = action["outputs"]

            # Build up a list of outputs.
            # Collect the output dirs we'll need.
            dirs = set()
            for out in outputs:
                dir = os.path.split(out)[0]
                if dir:
                    dirs.add(dir)
            if int(action.get("process_outputs_as_sources", False)):
                extra_sources += outputs
            if int(action.get("process_outputs_as_mac_bundle_resources", False)):
                extra_mac_bundle_resources += outputs

            # Write the actual command.
            action_commands = action["action"]
            if self.flavor == "mac":
                action_commands = [
                    gyp.xcode_emulation.ExpandEnvVars(command, env)
                    for command in action_commands
                ]
            command = gyp.common.EncodePOSIXShellList(action_commands)
            if "message" in action:
                self.WriteLn(
                    "quiet_cmd_{} = ACTION {} $@".format(name, action["message"])
                )
            else:
                self.WriteLn(f"quiet_cmd_{name} = ACTION {name} $@")
            if len(dirs) > 0:
                command = "mkdir -p %s" % " ".join(dirs) + "; " + command

            cd_action = "cd %s; " % Sourceify(self.path or ".")

            # command and cd_action get written to a toplevel variable called
            # cmd_foo. Toplevel variables can't handle things that change per
            # makefile like $(TARGET), so hardcode the target.
            command = command.replace("$(TARGET)", self.target)
            cd_action = cd_action.replace("$(TARGET)", self.target)

            # Set LD_LIBRARY_PATH in case the action runs an executable from this
            # build which links to shared libs from this build.
            # actions run on the host, so they should in theory only use host
            # libraries, but until everything is made cross-compile safe, also use
            # target libraries.
            # TODO(piman): when everything is cross-compile safe, remove lib.target
            self.WriteLn(
                "cmd_%s = LD_LIBRARY_PATH=$(builddir)/lib.host:"
                "$(builddir)/lib.target:$$LD_LIBRARY_PATH; "
                "export LD_LIBRARY_PATH; "
                "%s%s" % (name, cd_action, command)
            )
            self.WriteLn()
            outputs = [self.Absolutify(o) for o in outputs]
            # The makefile rules are all relative to the top dir, but the gyp actions
            # are defined relative to their containing dir.  This replaces the obj
            # variable for the action rule with an absolute version so that the output
            # goes in the right place.
            # Only write the 'obj' and 'builddir' rules for the "primary" output (:1);
            # it's superfluous for the "extra outputs", and this avoids accidentally
            # writing duplicate dummy rules for those outputs.
            # Same for environment.
            self.WriteLn("%s: obj := $(abs_obj)" % QuoteSpaces(outputs[0]))
            self.WriteLn("%s: builddir := $(abs_builddir)" % QuoteSpaces(outputs[0]))
            self.WriteSortedXcodeEnv(outputs[0], self.GetSortedXcodeEnv())

            for input in inputs:
                assert " " not in input, (
                    "Spaces in action input filenames not supported (%s)" % input
                )
            for output in outputs:
                assert " " not in output, (
                    "Spaces in action output filenames not supported (%s)" % output
                )

            # See the comment in WriteCopies about expanding env vars.
            outputs = [gyp.xcode_emulation.ExpandEnvVars(o, env) for o in outputs]
            inputs = [gyp.xcode_emulation.ExpandEnvVars(i, env) for i in inputs]

            self.WriteDoCmd(
                outputs,
                [Sourceify(self.Absolutify(i)) for i in inputs],
                part_of_all=part_of_all,
                command=name,
            )

            # Stuff the outputs in a variable so we can refer to them later.
            outputs_variable = "action_%s_outputs" % name
            self.WriteLn("{} := {}".format(outputs_variable, " ".join(outputs)))
            extra_outputs.append("$(%s)" % outputs_variable)
            self.WriteLn()

        self.WriteLn()

    def WriteRules(
        self,
        rules,
        extra_sources,
        extra_outputs,
        extra_mac_bundle_resources,
        part_of_all,
    ):
        """Write Makefile code for any 'rules' from the gyp input.

        extra_sources: a list that will be filled in with newly generated source
                       files, if any
        extra_outputs: a list that will be filled in with any outputs of these
                       rules (used to make other pieces dependent on these rules)
        part_of_all: flag indicating this target is part of 'all'
        """
        env = self.GetSortedXcodeEnv()
        for rule in rules:
            name = StringToMakefileVariable(
                "{}_{}".format(self.qualified_target, rule["rule_name"])
            )
            count = 0
            self.WriteLn("### Generated for rule %s:" % name)

            all_outputs = []

            for rule_source in rule.get("rule_sources", []):
                dirs = set()
                (rule_source_dirname, rule_source_basename) = os.path.split(rule_source)
                (rule_source_root, rule_source_ext) = os.path.splitext(
                    rule_source_basename
                )

                outputs = [
                    self.ExpandInputRoot(out, rule_source_root, rule_source_dirname)
                    for out in rule["outputs"]
                ]

                for out in outputs:
                    dir = os.path.dirname(out)
                    if dir:
                        dirs.add(dir)
                if int(rule.get("process_outputs_as_sources", False)):
                    extra_sources += outputs
                if int(rule.get("process_outputs_as_mac_bundle_resources", False)):
                    extra_mac_bundle_resources += outputs
                inputs = [
                    Sourceify(self.Absolutify(i))
                    for i in [rule_source] + rule.get("inputs", [])
                ]
                actions = ["$(call do_cmd,%s_%d)" % (name, count)]

                if name == "resources_grit":
                    # HACK: This is ugly.  Grit intentionally doesn't touch the
                    # timestamp of its output file when the file doesn't change,
                    # which is fine in hash-based dependency systems like scons
                    # and forge, but not kosher in the make world.  After some
                    # discussion, hacking around it here seems like the least
                    # amount of pain.
                    actions += ["@touch --no-create $@"]

                # See the comment in WriteCopies about expanding env vars.
                outputs = [gyp.xcode_emulation.ExpandEnvVars(o, env) for o in outputs]
                inputs = [gyp.xcode_emulation.ExpandEnvVars(i, env) for i in inputs]

                outputs = [self.Absolutify(o) for o in outputs]
                all_outputs += outputs
                # Only write the 'obj' and 'builddir' rules for the "primary" output
                # (:1); it's superfluous for the "extra outputs", and this avoids
                # accidentally writing duplicate dummy rules for those outputs.
                self.WriteLn("%s: obj := $(abs_obj)" % outputs[0])
                self.WriteLn("%s: builddir := $(abs_builddir)" % outputs[0])
                self.WriteMakeRule(
                    outputs, inputs, actions, command="%s_%d" % (name, count)
                )
                # Spaces in rule filenames are not supported, but rule variables have
                # spaces in them (e.g. RULE_INPUT_PATH expands to '$(abspath $<)').
                # The spaces within the variables are valid, so remove the variables
                # before checking.
                variables_with_spaces = re.compile(r"\$\([^ ]* \$<\)")
                for output in outputs:
                    output = re.sub(variables_with_spaces, "", output)
                    assert " " not in output, (
                        "Spaces in rule filenames not yet supported (%s)" % output
                    )
                self.WriteLn("all_deps += %s" % " ".join(outputs))

                action = [
                    self.ExpandInputRoot(ac, rule_source_root, rule_source_dirname)
                    for ac in rule["action"]
                ]
                mkdirs = ""
                if len(dirs) > 0:
                    mkdirs = "mkdir -p %s; " % " ".join(dirs)
                cd_action = "cd %s; " % Sourceify(self.path or ".")

                # action, cd_action, and mkdirs get written to a toplevel variable
                # called cmd_foo. Toplevel variables can't handle things that change
                # per makefile like $(TARGET), so hardcode the target.
                if self.flavor == "mac":
                    action = [
                        gyp.xcode_emulation.ExpandEnvVars(command, env)
                        for command in action
                    ]
                action = gyp.common.EncodePOSIXShellList(action)
                action = action.replace("$(TARGET)", self.target)
                cd_action = cd_action.replace("$(TARGET)", self.target)
                mkdirs = mkdirs.replace("$(TARGET)", self.target)

                # Set LD_LIBRARY_PATH in case the rule runs an executable from this
                # build which links to shared libs from this build.
                # rules run on the host, so they should in theory only use host
                # libraries, but until everything is made cross-compile safe, also use
                # target libraries.
                # TODO(piman): when everything is cross-compile safe, remove lib.target
                self.WriteLn(
                    "cmd_%(name)s_%(count)d = LD_LIBRARY_PATH="
                    "$(builddir)/lib.host:$(builddir)/lib.target:$$LD_LIBRARY_PATH; "
                    "export LD_LIBRARY_PATH; "
                    "%(cd_action)s%(mkdirs)s%(action)s"
                    % {
                        "action": action,
                        "cd_action": cd_action,
                        "count": count,
                        "mkdirs": mkdirs,
                        "name": name,
                    }
                )
                self.WriteLn(
                    "quiet_cmd_%(name)s_%(count)d = RULE %(name)s_%(count)d $@"
                    % {"count": count, "name": name}
                )
                self.WriteLn()
                count += 1

            outputs_variable = "rule_%s_outputs" % name
            self.WriteList(all_outputs, outputs_variable)
            extra_outputs.append("$(%s)" % outputs_variable)

            self.WriteLn("### Finished generating for rule: %s" % name)
            self.WriteLn()
        self.WriteLn("### Finished generating for all rules")
        self.WriteLn("")

    def WriteCopies(self, copies, extra_outputs, part_of_all):
        """Write Makefile code for any 'copies' from the gyp input.

        extra_outputs: a list that will be filled in with any outputs of this action
                       (used to make other pieces dependent on this action)
        part_of_all: flag indicating this target is part of 'all'
        """
        self.WriteLn("### Generated for copy rule.")

        variable = StringToMakefileVariable(self.qualified_target + "_copies")
        outputs = []
        for copy in copies:
            for path in copy["files"]:
                # Absolutify() may call normpath, and will strip trailing slashes.
                path = Sourceify(self.Absolutify(path))
                filename = os.path.split(path)[1]
                output = Sourceify(
                    self.Absolutify(os.path.join(copy["destination"], filename))
                )

                # If the output path has variables in it, which happens in practice for
                # 'copies', writing the environment as target-local doesn't work,
                # because the variables are already needed for the target name.
                # Copying the environment variables into global make variables doesn't
                # work either, because then the .d files will potentially contain spaces
                # after variable expansion, and .d file handling cannot handle spaces.
                # As a workaround, manually expand variables at gyp time. Since 'copies'
                # can't run scripts, there's no need to write the env then.
                # WriteDoCmd() will escape spaces for .d files.
                env = self.GetSortedXcodeEnv()
                output = gyp.xcode_emulation.ExpandEnvVars(output, env)
                path = gyp.xcode_emulation.ExpandEnvVars(path, env)
                self.WriteDoCmd([output], [path], "copy", part_of_all)
                outputs.append(output)
        self.WriteLn(
            "{} = {}".format(variable, " ".join(QuoteSpaces(o) for o in outputs))
        )
        extra_outputs.append("$(%s)" % variable)
        self.WriteLn()

    def WriteMacBundleResources(self, resources, bundle_deps):
        """Writes Makefile code for 'mac_bundle_resources'."""
        self.WriteLn("### Generated for mac_bundle_resources")

        for output, res in gyp.xcode_emulation.GetMacBundleResources(
            generator_default_variables["PRODUCT_DIR"],
            self.xcode_settings,
            [Sourceify(self.Absolutify(r)) for r in resources],
        ):
            _, ext = os.path.splitext(output)
            if ext != ".xcassets":
                # Make does not supports '.xcassets' emulation.
                self.WriteDoCmd(
                    [output], [res], "mac_tool,,,copy-bundle-resource", part_of_all=True
                )
                bundle_deps.append(output)

    def WriteMacInfoPlist(self, bundle_deps):
        """Write Makefile code for bundle Info.plist files."""
        info_plist, out, defines, extra_env = gyp.xcode_emulation.GetMacInfoPlist(
            generator_default_variables["PRODUCT_DIR"],
            self.xcode_settings,
            lambda p: Sourceify(self.Absolutify(p)),
        )
        if not info_plist:
            return
        if defines:
            # Create an intermediate file to store preprocessed results.
            intermediate_plist = "$(obj).$(TOOLSET)/$(TARGET)/" + os.path.basename(
                info_plist
            )
            self.WriteList(
                defines,
                intermediate_plist + ": INFOPLIST_DEFINES",
                "-D",
                quoter=EscapeCppDefine,
            )
            self.WriteMakeRule(
                [intermediate_plist],
                [info_plist],
                [
                    "$(call do_cmd,infoplist)",
                    # "Convert" the plist so that any weird whitespace changes from the
                    # preprocessor do not affect the XML parser in mac_tool.
                    "@plutil -convert xml1 $@ $@",
                ],
            )
            info_plist = intermediate_plist
        # plists can contain envvars and substitute them into the file.
        self.WriteSortedXcodeEnv(
            out, self.GetSortedXcodeEnv(additional_settings=extra_env)
        )
        self.WriteDoCmd(
            [out], [info_plist], "mac_tool,,,copy-info-plist", part_of_all=True
        )
        bundle_deps.append(out)

    def WriteSources(
        self,
        configs,
        deps,
        sources,
        extra_outputs,
        extra_link_deps,
        part_of_all,
        precompiled_header,
    ):
        """Write Makefile code for any 'sources' from the gyp input.
        These are source files necessary to build the current target.

        configs, deps, sources: input from gyp.
        extra_outputs: a list of extra outputs this action should be dependent on;
                       used to serialize action/rules before compilation
        extra_link_deps: a list that will be filled in with any outputs of
                         compilation (to be used in link lines)
        part_of_all: flag indicating this target is part of 'all'
        """

        # Write configuration-specific variables for CFLAGS, etc.
        for configname in sorted(configs.keys()):
            config = configs[configname]
            self.WriteList(
                config.get("defines"),
                "DEFS_%s" % configname,
                prefix="-D",
                quoter=EscapeCppDefine,
            )

            if self.flavor == "mac":
                cflags = self.xcode_settings.GetCflags(
                    configname, arch=config.get("xcode_configuration_platform")
                )
                cflags_c = self.xcode_settings.GetCflagsC(configname)
                cflags_cc = self.xcode_settings.GetCflagsCC(configname)
                cflags_objc = self.xcode_settings.GetCflagsObjC(configname)
                cflags_objcc = self.xcode_settings.GetCflagsObjCC(configname)
            else:
                cflags = config.get("cflags")
                cflags_c = config.get("cflags_c")
                cflags_cc = config.get("cflags_cc")

            self.WriteLn("# Flags passed to all source files.")
            self.WriteList(cflags, "CFLAGS_%s" % configname)
            self.WriteLn("# Flags passed to only C files.")
            self.WriteList(cflags_c, "CFLAGS_C_%s" % configname)
            self.WriteLn("# Flags passed to only C++ files.")
            self.WriteList(cflags_cc, "CFLAGS_CC_%s" % configname)
            if self.flavor == "mac":
                self.WriteLn("# Flags passed to only ObjC files.")
                self.WriteList(cflags_objc, "CFLAGS_OBJC_%s" % configname)
                self.WriteLn("# Flags passed to only ObjC++ files.")
                self.WriteList(cflags_objcc, "CFLAGS_OBJCC_%s" % configname)
            includes = config.get("include_dirs")
            if includes:
                includes = [Sourceify(self.Absolutify(i)) for i in includes]
            self.WriteList(includes, "INCS_%s" % configname, prefix="-I")

        compilable = list(filter(Compilable, sources))
        objs = [self.Objectify(self.Absolutify(Target(c))) for c in compilable]
        self.WriteList(objs, "OBJS")

        for obj in objs:
            assert " " not in obj, "Spaces in object filenames not supported (%s)" % obj
        self.WriteLn(
            "# Add to the list of files we specially track " "dependencies for."
        )
        self.WriteLn("all_deps += $(OBJS)")
        self.WriteLn()

        # Make sure our dependencies are built first.
        if deps:
            self.WriteMakeRule(
                ["$(OBJS)"],
                deps,
                comment="Make sure our dependencies are built " "before any of us.",
                order_only=True,
            )

        # Make sure the actions and rules run first.
        # If they generate any extra headers etc., the per-.o file dep tracking
        # will catch the proper rebuilds, so order only is still ok here.
        if extra_outputs:
            self.WriteMakeRule(
                ["$(OBJS)"],
                extra_outputs,
                comment="Make sure our actions/rules run " "before any of us.",
                order_only=True,
            )

        pchdeps = precompiled_header.GetObjDependencies(compilable, objs)
        if pchdeps:
            self.WriteLn("# Dependencies from obj files to their precompiled headers")
            for source, obj, gch in pchdeps:
                self.WriteLn(f"{obj}: {gch}")
            self.WriteLn("# End precompiled header dependencies")

        if objs:
            extra_link_deps.append("$(OBJS)")
            self.WriteLn(
                """\
# CFLAGS et al overrides must be target-local.
# See "Target-specific Variable Values" in the GNU Make manual."""
            )
            self.WriteLn("$(OBJS): TOOLSET := $(TOOLSET)")
            self.WriteLn(
                "$(OBJS): GYP_CFLAGS := "
                "$(DEFS_$(BUILDTYPE)) "
                "$(INCS_$(BUILDTYPE)) "
                "%s " % precompiled_header.GetInclude("c") + "$(CFLAGS_$(BUILDTYPE)) "
                "$(CFLAGS_C_$(BUILDTYPE))"
            )
            self.WriteLn(
                "$(OBJS): GYP_CXXFLAGS := "
                "$(DEFS_$(BUILDTYPE)) "
                "$(INCS_$(BUILDTYPE)) "
                "%s " % precompiled_header.GetInclude("cc") + "$(CFLAGS_$(BUILDTYPE)) "
                "$(CFLAGS_CC_$(BUILDTYPE))"
            )
            if self.flavor == "mac":
                self.WriteLn(
                    "$(OBJS): GYP_OBJCFLAGS := "
                    "$(DEFS_$(BUILDTYPE)) "
                    "$(INCS_$(BUILDTYPE)) "
                    "%s " % precompiled_header.GetInclude("m")
                    + "$(CFLAGS_$(BUILDTYPE)) "
                    "$(CFLAGS_C_$(BUILDTYPE)) "
                    "$(CFLAGS_OBJC_$(BUILDTYPE))"
                )
                self.WriteLn(
                    "$(OBJS): GYP_OBJCXXFLAGS := "
                    "$(DEFS_$(BUILDTYPE)) "
                    "$(INCS_$(BUILDTYPE)) "
                    "%s " % precompiled_header.GetInclude("mm")
                    + "$(CFLAGS_$(BUILDTYPE)) "
                    "$(CFLAGS_CC_$(BUILDTYPE)) "
                    "$(CFLAGS_OBJCC_$(BUILDTYPE))"
                )

        self.WritePchTargets(precompiled_header.GetPchBuildCommands())

        # If there are any object files in our input file list, link them into our
        # output.
        extra_link_deps += [source for source in sources if Linkable(source)]

        self.WriteLn()

    def WritePchTargets(self, pch_commands):
        """Writes make rules to compile prefix headers."""
        if not pch_commands:
            return

        for gch, lang_flag, lang, input in pch_commands:
            extra_flags = {
                "c": "$(CFLAGS_C_$(BUILDTYPE))",
                "cc": "$(CFLAGS_CC_$(BUILDTYPE))",
                "m": "$(CFLAGS_C_$(BUILDTYPE)) $(CFLAGS_OBJC_$(BUILDTYPE))",
                "mm": "$(CFLAGS_CC_$(BUILDTYPE)) $(CFLAGS_OBJCC_$(BUILDTYPE))",
            }[lang]
            var_name = {
                "c": "GYP_PCH_CFLAGS",
                "cc": "GYP_PCH_CXXFLAGS",
                "m": "GYP_PCH_OBJCFLAGS",
                "mm": "GYP_PCH_OBJCXXFLAGS",
            }[lang]
            self.WriteLn(
                f"{gch}: {var_name} := {lang_flag} " + "$(DEFS_$(BUILDTYPE)) "
                "$(INCS_$(BUILDTYPE)) "
                "$(CFLAGS_$(BUILDTYPE)) " + extra_flags
            )

            self.WriteLn(f"{gch}: {input} FORCE_DO_CMD")
            self.WriteLn("\t@$(call do_cmd,pch_%s,1)" % lang)
            self.WriteLn("")
            assert " " not in gch, "Spaces in gch filenames not supported (%s)" % gch
            self.WriteLn("all_deps += %s" % gch)
            self.WriteLn("")

    def ComputeOutputBasename(self, spec):
        """Return the 'output basename' of a gyp spec.

        E.g., the loadable module 'foobar' in directory 'baz' will produce
          'libfoobar.so'
        """
        assert not self.is_mac_bundle

        if self.flavor == "mac" and self.type in (
            "static_library",
            "executable",
            "shared_library",
            "loadable_module",
        ):
            return self.xcode_settings.GetExecutablePath()

        target = spec["target_name"]
        target_prefix = ""
        target_ext = ""
        if self.type == "static_library":
            if target[:3] == "lib":
                target = target[3:]
            target_prefix = "lib"
            target_ext = ".a"
        elif self.type in ("loadable_module", "shared_library"):
            if target[:3] == "lib":
                target = target[3:]
            target_prefix = "lib"
            if self.flavor == "aix":
                target_ext = ".a"
            else:
                target_ext = ".so"
        elif self.type == "none":
            target = "%s.stamp" % target
        elif self.type != "executable":
            print(
                "ERROR: What output file should be generated?",
                "type",
                self.type,
                "target",
                target,
            )

        target_prefix = spec.get("product_prefix", target_prefix)
        target = spec.get("product_name", target)
        product_ext = spec.get("product_extension")
        if product_ext:
            target_ext = "." + product_ext

        return target_prefix + target + target_ext

    def _InstallImmediately(self):
        return (
            self.toolset == "target"
            and self.flavor == "mac"
            and self.type
            in ("static_library", "executable", "shared_library", "loadable_module")
        )

    def ComputeOutput(self, spec):
        """Return the 'output' (full output path) of a gyp spec.

        E.g., the loadable module 'foobar' in directory 'baz' will produce
          '$(obj)/baz/libfoobar.so'
        """
        assert not self.is_mac_bundle

        path = os.path.join("$(obj)." + self.toolset, self.path)
        if self.type == "executable" or self._InstallImmediately():
            path = "$(builddir)"
        path = spec.get("product_dir", path)
        return os.path.join(path, self.ComputeOutputBasename(spec))

    def ComputeMacBundleOutput(self, spec):
        """Return the 'output' (full output path) to a bundle output directory."""
        assert self.is_mac_bundle
        path = generator_default_variables["PRODUCT_DIR"]
        return os.path.join(path, self.xcode_settings.GetWrapperName())

    def ComputeMacBundleBinaryOutput(self, spec):
        """Return the 'output' (full output path) to the binary in a bundle."""
        path = generator_default_variables["PRODUCT_DIR"]
        return os.path.join(path, self.xcode_settings.GetExecutablePath())

    def ComputeDeps(self, spec):
        """Compute the dependencies of a gyp spec.

        Returns a tuple (deps, link_deps), where each is a list of
        filenames that will need to be put in front of make for either
        building (deps) or linking (link_deps).
        """
        deps = []
        link_deps = []
        if "dependencies" in spec:
            deps.extend(
                [
                    target_outputs[dep]
                    for dep in spec["dependencies"]
                    if target_outputs[dep]
                ]
            )
            for dep in spec["dependencies"]:
                if dep in target_link_deps:
                    link_deps.append(target_link_deps[dep])
            deps.extend(link_deps)
            # TODO: It seems we need to transitively link in libraries (e.g. -lfoo)?
            # This hack makes it work:
            # link_deps.extend(spec.get('libraries', []))
        return (gyp.common.uniquer(deps), gyp.common.uniquer(link_deps))

    def WriteDependencyOnExtraOutputs(self, target, extra_outputs):
        self.WriteMakeRule(
            [self.output_binary],
            extra_outputs,
            comment="Build our special outputs first.",
            order_only=True,
        )

    def WriteTarget(
        self, spec, configs, deps, link_deps, bundle_deps, extra_outputs, part_of_all
    ):
        """Write Makefile code to produce the final target of the gyp spec.

        spec, configs: input from gyp.
        deps, link_deps: dependency lists; see ComputeDeps()
        extra_outputs: any extra outputs that our target should depend on
        part_of_all: flag indicating this target is part of 'all'
        """

        self.WriteLn("### Rules for final target.")

        if extra_outputs:
            self.WriteDependencyOnExtraOutputs(self.output_binary, extra_outputs)
            self.WriteMakeRule(
                extra_outputs,
                deps,
                comment=("Preserve order dependency of " "special output on deps."),
                order_only=True,
            )

        target_postbuilds = {}
        if self.type != "none":
            for configname in sorted(configs.keys()):
                config = configs[configname]
                if self.flavor == "mac":
                    ldflags = self.xcode_settings.GetLdflags(
                        configname,
                        generator_default_variables["PRODUCT_DIR"],
                        lambda p: Sourceify(self.Absolutify(p)),
                        arch=config.get("xcode_configuration_platform"),
                    )

                    # TARGET_POSTBUILDS_$(BUILDTYPE) is added to postbuilds later on.
                    gyp_to_build = gyp.common.InvertRelativePath(self.path)
                    target_postbuild = self.xcode_settings.AddImplicitPostbuilds(
                        configname,
                        QuoteSpaces(
                            os.path.normpath(os.path.join(gyp_to_build, self.output))
                        ),
                        QuoteSpaces(
                            os.path.normpath(
                                os.path.join(gyp_to_build, self.output_binary)
                            )
                        ),
                    )
                    if target_postbuild:
                        target_postbuilds[configname] = target_postbuild
                else:
                    ldflags = config.get("ldflags", [])
                    # Compute an rpath for this output if needed.
                    if any(dep.endswith(".so") or ".so." in dep for dep in deps):
                        # We want to get the literal string "$ORIGIN"
                        # into the link command, so we need lots of escaping.
                        ldflags.append(r"-Wl,-rpath=\$$ORIGIN/")
                        ldflags.append(r"-Wl,-rpath-link=\$(builddir)/")
                library_dirs = config.get("library_dirs", [])
                ldflags += [("-L%s" % library_dir) for library_dir in library_dirs]
                self.WriteList(ldflags, "LDFLAGS_%s" % configname)
                if self.flavor == "mac":
                    self.WriteList(
                        self.xcode_settings.GetLibtoolflags(configname),
                        "LIBTOOLFLAGS_%s" % configname,
                    )
            libraries = spec.get("libraries")
            if libraries:
                # Remove duplicate entries
                libraries = gyp.common.uniquer(libraries)
                if self.flavor == "mac":
                    libraries = self.xcode_settings.AdjustLibraries(libraries)
            self.WriteList(libraries, "LIBS")
            self.WriteLn(
                "%s: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE))"
                % QuoteSpaces(self.output_binary)
            )
            self.WriteLn("%s: LIBS := $(LIBS)" % QuoteSpaces(self.output_binary))

            if self.flavor == "mac":
                self.WriteLn(
                    "%s: GYP_LIBTOOLFLAGS := $(LIBTOOLFLAGS_$(BUILDTYPE))"
                    % QuoteSpaces(self.output_binary)
                )

        # Postbuild actions. Like actions, but implicitly depend on the target's
        # output.
        postbuilds = []
        if self.flavor == "mac":
            if target_postbuilds:
                postbuilds.append("$(TARGET_POSTBUILDS_$(BUILDTYPE))")
            postbuilds.extend(gyp.xcode_emulation.GetSpecPostbuildCommands(spec))

        if postbuilds:
            # Envvars may be referenced by TARGET_POSTBUILDS_$(BUILDTYPE),
            # so we must output its definition first, since we declare variables
            # using ":=".
            self.WriteSortedXcodeEnv(self.output, self.GetSortedXcodePostbuildEnv())

            for configname in target_postbuilds:
                self.WriteLn(
                    "%s: TARGET_POSTBUILDS_%s := %s"
                    % (
                        QuoteSpaces(self.output),
                        configname,
                        gyp.common.EncodePOSIXShellList(target_postbuilds[configname]),
                    )
                )

            # Postbuilds expect to be run in the gyp file's directory, so insert an
            # implicit postbuild to cd to there.
            postbuilds.insert(0, gyp.common.EncodePOSIXShellList(["cd", self.path]))
            for i, postbuild in enumerate(postbuilds):
                if not postbuild.startswith("$"):
                    postbuilds[i] = EscapeShellArgument(postbuild)
            self.WriteLn("%s: builddir := $(abs_builddir)" % QuoteSpaces(self.output))
            self.WriteLn(
                "%s: POSTBUILDS := %s"
                % (QuoteSpaces(self.output), " ".join(postbuilds))
            )

        # A bundle directory depends on its dependencies such as bundle resources
        # and bundle binary. When all dependencies have been built, the bundle
        # needs to be packaged.
        if self.is_mac_bundle:
            # If the framework doesn't contain a binary, then nothing depends
            # on the actions -- make the framework depend on them directly too.
            self.WriteDependencyOnExtraOutputs(self.output, extra_outputs)

            # Bundle dependencies. Note that the code below adds actions to this
            # target, so if you move these two lines, move the lines below as well.
            self.WriteList([QuoteSpaces(dep) for dep in bundle_deps], "BUNDLE_DEPS")
            self.WriteLn("%s: $(BUNDLE_DEPS)" % QuoteSpaces(self.output))

            # After the framework is built, package it. Needs to happen before
            # postbuilds, since postbuilds depend on this.
            if self.type in ("shared_library", "loadable_module"):
                self.WriteLn(
                    "\t@$(call do_cmd,mac_package_framework,,,%s)"
                    % self.xcode_settings.GetFrameworkVersion()
                )

            # Bundle postbuilds can depend on the whole bundle, so run them after
            # the bundle is packaged, not already after the bundle binary is done.
            if postbuilds:
                self.WriteLn("\t@$(call do_postbuilds)")
            postbuilds = []  # Don't write postbuilds for target's output.

            # Needed by test/mac/gyptest-rebuild.py.
            self.WriteLn("\t@true  # No-op, used by tests")

            # Since this target depends on binary and resources which are in
            # nested subfolders, the framework directory will be older than
            # its dependencies usually. To prevent this rule from executing
            # on every build (expensive, especially with postbuilds), expliclity
            # update the time on the framework directory.
            self.WriteLn("\t@touch -c %s" % QuoteSpaces(self.output))

        if postbuilds:
            assert not self.is_mac_bundle, (
                "Postbuilds for bundles should be done "
                "on the bundle, not the binary (target '%s')" % self.target
            )
            assert "product_dir" not in spec, (
                "Postbuilds do not work with " "custom product_dir"
            )

        if self.type == "executable":
            self.WriteLn(
                "%s: LD_INPUTS := %s"
                % (
                    QuoteSpaces(self.output_binary),
                    " ".join(QuoteSpaces(dep) for dep in link_deps),
                )
            )
            if self.toolset == "host" and self.flavor == "android":
                self.WriteDoCmd(
                    [self.output_binary],
                    link_deps,
                    "link_host",
                    part_of_all,
                    postbuilds=postbuilds,
                )
            else:
                self.WriteDoCmd(
                    [self.output_binary],
                    link_deps,
                    "link",
                    part_of_all,
                    postbuilds=postbuilds,
                )

        elif self.type == "static_library":
            for link_dep in link_deps:
                assert " " not in link_dep, (
                    "Spaces in alink input filenames not supported (%s)" % link_dep
                )
            if (
                self.flavor not in ("mac", "openbsd", "netbsd", "win")
                and not self.is_standalone_static_library
            ):
                self.WriteDoCmd(
                    [self.output_binary],
                    link_deps,
                    "alink_thin",
                    part_of_all,
                    postbuilds=postbuilds,
                )
            else:
                self.WriteDoCmd(
                    [self.output_binary],
                    link_deps,
                    "alink",
                    part_of_all,
                    postbuilds=postbuilds,
                )
        elif self.type == "shared_library":
            self.WriteLn(
                "%s: LD_INPUTS := %s"
                % (
                    QuoteSpaces(self.output_binary),
                    " ".join(QuoteSpaces(dep) for dep in link_deps),
                )
            )
            self.WriteDoCmd(
                [self.output_binary],
                link_deps,
                "solink",
                part_of_all,
                postbuilds=postbuilds,
            )
        elif self.type == "loadable_module":
            for link_dep in link_deps:
                assert " " not in link_dep, (
                    "Spaces in module input filenames not supported (%s)" % link_dep
                )
            if self.toolset == "host" and self.flavor == "android":
                self.WriteDoCmd(
                    [self.output_binary],
                    link_deps,
                    "solink_module_host",
                    part_of_all,
                    postbuilds=postbuilds,
                )
            else:
                self.WriteDoCmd(
                    [self.output_binary],
                    link_deps,
                    "solink_module",
                    part_of_all,
                    postbuilds=postbuilds,
                )
        elif self.type == "none":
            # Write a stamp line.
            self.WriteDoCmd(
                [self.output_binary], deps, "touch", part_of_all, postbuilds=postbuilds
            )
        else:
            print("WARNING: no output for", self.type, self.target)

        # Add an alias for each target (if there are any outputs).
        # Installable target aliases are created below.
        if (self.output and self.output != self.target) and (
            self.type not in self._INSTALLABLE_TARGETS
        ):
            self.WriteMakeRule(
                [self.target], [self.output], comment="Add target alias", phony=True
            )
            if part_of_all:
                self.WriteMakeRule(
                    ["all"],
                    [self.target],
                    comment='Add target alias to "all" target.',
                    phony=True,
                )

        # Add special-case rules for our installable targets.
        # 1) They need to install to the build dir or "product" dir.
        # 2) They get shortcuts for building (e.g. "make chrome").
        # 3) They are part of "make all".
        if self.type in self._INSTALLABLE_TARGETS or self.is_standalone_static_library:
            if self.type == "shared_library":
                file_desc = "shared library"
            elif self.type == "static_library":
                file_desc = "static library"
            else:
                file_desc = "executable"
            install_path = self._InstallableTargetInstallPath()
            installable_deps = [self.output]
            if (
                self.flavor == "mac"
                and "product_dir" not in spec
                and self.toolset == "target"
            ):
                # On mac, products are created in install_path immediately.
                assert install_path == self.output, "{} != {}".format(
                    install_path,
                    self.output,
                )

            # Point the target alias to the final binary output.
            self.WriteMakeRule(
                [self.target], [install_path], comment="Add target alias", phony=True
            )
            if install_path != self.output:
                assert not self.is_mac_bundle  # See comment a few lines above.
                self.WriteDoCmd(
                    [install_path],
                    [self.output],
                    "copy",
                    comment="Copy this to the %s output path." % file_desc,
                    part_of_all=part_of_all,
                )
                installable_deps.append(install_path)
            if self.output != self.alias and self.alias != self.target:
                self.WriteMakeRule(
                    [self.alias],
                    installable_deps,
                    comment="Short alias for building this %s." % file_desc,
                    phony=True,
                )
            if part_of_all:
                self.WriteMakeRule(
                    ["all"],
                    [install_path],
                    comment='Add %s to "all" target.' % file_desc,
                    phony=True,
                )

    def WriteList(self, value_list, variable=None, prefix="", quoter=QuoteIfNecessary):
        """Write a variable definition that is a list of values.

        E.g. WriteList(['a','b'], 'foo', prefix='blah') writes out
             foo = blaha blahb
        but in a pretty-printed style.
        """
        values = ""
        if value_list:
            value_list = [quoter(prefix + value) for value in value_list]
            values = " \\\n\t" + " \\\n\t".join(value_list)
        self.fp.write(f"{variable} :={values}\n\n")

    def WriteDoCmd(
        self, outputs, inputs, command, part_of_all, comment=None, postbuilds=False
    ):
        """Write a Makefile rule that uses do_cmd.

        This makes the outputs dependent on the command line that was run,
        as well as support the V= make command line flag.
        """
        suffix = ""
        if postbuilds:
            assert "," not in command
            suffix = ",,1"  # Tell do_cmd to honor $POSTBUILDS
        self.WriteMakeRule(
            outputs,
            inputs,
            actions=[f"$(call do_cmd,{command}{suffix})"],
            comment=comment,
            command=command,
            force=True,
        )
        # Add our outputs to the list of targets we read depfiles from.
        # all_deps is only used for deps file reading, and for deps files we replace
        # spaces with ? because escaping doesn't work with make's $(sort) and
        # other functions.
        outputs = [QuoteSpaces(o, SPACE_REPLACEMENT) for o in outputs]
        self.WriteLn("all_deps += %s" % " ".join(outputs))

    def WriteMakeRule(
        self,
        outputs,
        inputs,
        actions=None,
        comment=None,
        order_only=False,
        force=False,
        phony=False,
        command=None,
    ):
        """Write a Makefile rule, with some extra tricks.

        outputs: a list of outputs for the rule (note: this is not directly
                 supported by make; see comments below)
        inputs: a list of inputs for the rule
        actions: a list of shell commands to run for the rule
        comment: a comment to put in the Makefile above the rule (also useful
                 for making this Python script's code self-documenting)
        order_only: if true, makes the dependency order-only
        force: if true, include FORCE_DO_CMD as an order-only dep
        phony: if true, the rule does not actually generate the named output, the
               output is just a name to run the rule
        command: (optional) command name to generate unambiguous labels
        """
        outputs = [QuoteSpaces(o) for o in outputs]
        inputs = [QuoteSpaces(i) for i in inputs]

        if comment:
            self.WriteLn("# " + comment)
        if phony:
            self.WriteLn(".PHONY: " + " ".join(outputs))
        if actions:
            self.WriteLn("%s: TOOLSET := $(TOOLSET)" % outputs[0])
        force_append = " FORCE_DO_CMD" if force else ""

        if order_only:
            # Order only rule: Just write a simple rule.
            # TODO(evanm): just make order_only a list of deps instead of this hack.
            self.WriteLn(
                "{}: | {}{}".format(" ".join(outputs), " ".join(inputs), force_append)
            )
        elif len(outputs) == 1:
            # Regular rule, one output: Just write a simple rule.
            self.WriteLn("{}: {}{}".format(outputs[0], " ".join(inputs), force_append))
        else:
            # Regular rule, more than one output: Multiple outputs are tricky in
            # make. We will write three rules:
            # - All outputs depend on an intermediate file.
            # - Make .INTERMEDIATE depend on the intermediate.
            # - The intermediate file depends on the inputs and executes the
            #   actual command.
            # - The intermediate recipe will 'touch' the intermediate file.
            # - The multi-output rule will have an do-nothing recipe.

            # Hash the target name to avoid generating overlong filenames.
            cmddigest = hashlib.sha1(
                (command or self.target).encode("utf-8")
            ).hexdigest()
            intermediate = "%s.intermediate" % cmddigest
            self.WriteLn("{}: {}".format(" ".join(outputs), intermediate))
            self.WriteLn("\t%s" % "@:")
            self.WriteLn("{}: {}".format(".INTERMEDIATE", intermediate))
            self.WriteLn(
                "{}: {}{}".format(intermediate, " ".join(inputs), force_append)
            )
            actions.insert(0, "$(call do_cmd,touch)")

        if actions:
            for action in actions:
                self.WriteLn("\t%s" % action)
        self.WriteLn()

    def WriteAndroidNdkModuleRule(self, module_name, all_sources, link_deps):
        """Write a set of LOCAL_XXX definitions for Android NDK.

        These variable definitions will be used by Android NDK but do nothing for
        non-Android applications.

        Arguments:
          module_name: Android NDK module name, which must be unique among all
              module names.
          all_sources: A list of source files (will be filtered by Compilable).
          link_deps: A list of link dependencies, which must be sorted in
              the order from dependencies to dependents.
        """
        if self.type not in ("executable", "shared_library", "static_library"):
            return

        self.WriteLn("# Variable definitions for Android applications")
        self.WriteLn("include $(CLEAR_VARS)")
        self.WriteLn("LOCAL_MODULE := " + module_name)
        self.WriteLn(
            "LOCAL_CFLAGS := $(CFLAGS_$(BUILDTYPE)) "
            "$(DEFS_$(BUILDTYPE)) "
            # LOCAL_CFLAGS is applied to both of C and C++.  There is
            # no way to specify $(CFLAGS_C_$(BUILDTYPE)) only for C
            # sources.
            "$(CFLAGS_C_$(BUILDTYPE)) "
            # $(INCS_$(BUILDTYPE)) includes the prefix '-I' while
            # LOCAL_C_INCLUDES does not expect it.  So put it in
            # LOCAL_CFLAGS.
            "$(INCS_$(BUILDTYPE))"
        )
        # LOCAL_CXXFLAGS is obsolete and LOCAL_CPPFLAGS is preferred.
        self.WriteLn("LOCAL_CPPFLAGS := $(CFLAGS_CC_$(BUILDTYPE))")
        self.WriteLn("LOCAL_C_INCLUDES :=")
        self.WriteLn("LOCAL_LDLIBS := $(LDFLAGS_$(BUILDTYPE)) $(LIBS)")

        # Detect the C++ extension.
        cpp_ext = {".cc": 0, ".cpp": 0, ".cxx": 0}
        default_cpp_ext = ".cpp"
        for filename in all_sources:
            ext = os.path.splitext(filename)[1]
            if ext in cpp_ext:
                cpp_ext[ext] += 1
                if cpp_ext[ext] > cpp_ext[default_cpp_ext]:
                    default_cpp_ext = ext
        self.WriteLn("LOCAL_CPP_EXTENSION := " + default_cpp_ext)

        self.WriteList(
            list(map(self.Absolutify, filter(Compilable, all_sources))),
            "LOCAL_SRC_FILES",
        )

        # Filter out those which do not match prefix and suffix and produce
        # the resulting list without prefix and suffix.
        def DepsToModules(deps, prefix, suffix):
            modules = []
            for filepath in deps:
                filename = os.path.basename(filepath)
                if filename.startswith(prefix) and filename.endswith(suffix):
                    modules.append(filename[len(prefix) : -len(suffix)])
            return modules

        # Retrieve the default value of 'SHARED_LIB_SUFFIX'
        params = {"flavor": "linux"}
        default_variables = {}
        CalculateVariables(default_variables, params)

        self.WriteList(
            DepsToModules(
                link_deps,
                generator_default_variables["SHARED_LIB_PREFIX"],
                default_variables["SHARED_LIB_SUFFIX"],
            ),
            "LOCAL_SHARED_LIBRARIES",
        )
        self.WriteList(
            DepsToModules(
                link_deps,
                generator_default_variables["STATIC_LIB_PREFIX"],
                generator_default_variables["STATIC_LIB_SUFFIX"],
            ),
            "LOCAL_STATIC_LIBRARIES",
        )

        if self.type == "executable":
            self.WriteLn("include $(BUILD_EXECUTABLE)")
        elif self.type == "shared_library":
            self.WriteLn("include $(BUILD_SHARED_LIBRARY)")
        elif self.type == "static_library":
            self.WriteLn("include $(BUILD_STATIC_LIBRARY)")
        self.WriteLn()

    def WriteLn(self, text=""):
        self.fp.write(text + "\n")

    def GetSortedXcodeEnv(self, additional_settings=None):
        return gyp.xcode_emulation.GetSortedXcodeEnv(
            self.xcode_settings,
            "$(abs_builddir)",
            os.path.join("$(abs_srcdir)", self.path),
            "$(BUILDTYPE)",
            additional_settings,
        )

    def GetSortedXcodePostbuildEnv(self):
        # CHROMIUM_STRIP_SAVE_FILE is a chromium-specific hack.
        # TODO(thakis): It would be nice to have some general mechanism instead.
        strip_save_file = self.xcode_settings.GetPerTargetSetting(
            "CHROMIUM_STRIP_SAVE_FILE", ""
        )
        # Even if strip_save_file is empty, explicitly write it. Else a postbuild
        # might pick up an export from an earlier target.
        return self.GetSortedXcodeEnv(
            additional_settings={"CHROMIUM_STRIP_SAVE_FILE": strip_save_file}
        )

    def WriteSortedXcodeEnv(self, target, env):
        for k, v in env:
            # For
            #  foo := a\ b
            # the escaped space does the right thing. For
            #  export foo := a\ b
            # it does not -- the backslash is written to the env as literal character.
            # So don't escape spaces in |env[k]|.
            self.WriteLn(f"{QuoteSpaces(target)}: export {k} := {v}")

    def Objectify(self, path):
        """Convert a path to its output directory form."""
        if "$(" in path:
            path = path.replace("$(obj)/", "$(obj).%s/$(TARGET)/" % self.toolset)
        if "$(obj)" not in path:
            path = f"$(obj).{self.toolset}/$(TARGET)/{path}"
        return path

    def Pchify(self, path, lang):
        """Convert a prefix header path to its output directory form."""
        path = self.Absolutify(path)
        if "$(" in path:
            path = path.replace(
                "$(obj)/", f"$(obj).{self.toolset}/$(TARGET)/pch-{lang}"
            )
            return path
        return f"$(obj).{self.toolset}/$(TARGET)/pch-{lang}/{path}"

    def Absolutify(self, path):
        """Convert a subdirectory-relative path into a base-relative path.
        Skips over paths that contain variables."""
        if "$(" in path:
            # Don't call normpath in this case, as it might collapse the
            # path too aggressively if it features '..'. However it's still
            # important to strip trailing slashes.
            return path.rstrip("/")
        return os.path.normpath(os.path.join(self.path, path))

    def ExpandInputRoot(self, template, expansion, dirname):
        if "%(INPUT_ROOT)s" not in template and "%(INPUT_DIRNAME)s" not in template:
            return template
        path = template % {
            "INPUT_ROOT": expansion,
            "INPUT_DIRNAME": dirname,
        }
        return path

    def _InstallableTargetInstallPath(self):
        """Returns the location of the final output for an installable target."""
        # Functionality removed for all platforms to match Xcode and hoist
        # shared libraries into PRODUCT_DIR for users:
        # Xcode puts shared_library results into PRODUCT_DIR, and some gyp files
        # rely on this. Emulate this behavior for mac.
        # if self.type == "shared_library" and (
        #     self.flavor != "mac" or self.toolset != "target"
        # ):
        #    # Install all shared libs into a common directory (per toolset) for
        #    # convenient access with LD_LIBRARY_PATH.
        #    return "$(builddir)/lib.%s/%s" % (self.toolset, self.alias)
        return "$(builddir)/" + self.alias


def WriteAutoRegenerationRule(params, root_makefile, makefile_name, build_files):
    """Write the target to regenerate the Makefile."""
    options = params["options"]
    build_files_args = [
        gyp.common.RelativePath(filename, options.toplevel_dir)
        for filename in params["build_files_arg"]
    ]

    gyp_binary = gyp.common.FixIfRelativePath(
        params["gyp_binary"], options.toplevel_dir
    )
    if not gyp_binary.startswith(os.sep):
        gyp_binary = os.path.join(".", gyp_binary)

    root_makefile.write(
        "quiet_cmd_regen_makefile = ACTION Regenerating $@\n"
        "cmd_regen_makefile = cd $(srcdir); %(cmd)s\n"
        "%(makefile_name)s: %(deps)s\n"
        "\t$(call do_cmd,regen_makefile)\n\n"
        % {
            "makefile_name": makefile_name,
            "deps": " ".join(SourceifyAndQuoteSpaces(bf) for bf in build_files),
            "cmd": gyp.common.EncodePOSIXShellList(
                [gyp_binary, "-fmake"] + gyp.RegenerateFlags(options) + build_files_args
            ),
        }
    )


def PerformBuild(data, configurations, params):
    options = params["options"]
    for config in configurations:
        arguments = ["make"]
        if options.toplevel_dir and options.toplevel_dir != ".":
            arguments += "-C", options.toplevel_dir
        arguments.append("BUILDTYPE=" + config)
        print(f"Building [{config}]: {arguments}")
        subprocess.check_call(arguments)


def GenerateOutput(target_list, target_dicts, data, params):
    options = params["options"]
    flavor = gyp.common.GetFlavor(params)
    generator_flags = params.get("generator_flags", {})
    builddir_name = generator_flags.get("output_dir", "out")
    android_ndk_version = generator_flags.get("android_ndk_version", None)
    default_target = generator_flags.get("default_target", "all")

    def CalculateMakefilePath(build_file, base_name):
        """Determine where to write a Makefile for a given gyp file."""
        # Paths in gyp files are relative to the .gyp file, but we want
        # paths relative to the source root for the master makefile.  Grab
        # the path of the .gyp file as the base to relativize against.
        # E.g. "foo/bar" when we're constructing targets for "foo/bar/baz.gyp".
        base_path = gyp.common.RelativePath(os.path.dirname(build_file), options.depth)
        # We write the file in the base_path directory.
        output_file = os.path.join(options.depth, base_path, base_name)
        if options.generator_output:
            output_file = os.path.join(
                options.depth, options.generator_output, base_path, base_name
            )
        base_path = gyp.common.RelativePath(
            os.path.dirname(build_file), options.toplevel_dir
        )
        return base_path, output_file

    # TODO:  search for the first non-'Default' target.  This can go
    # away when we add verification that all targets have the
    # necessary configurations.
    default_configuration = None
    toolsets = {target_dicts[target]["toolset"] for target in target_list}
    for target in target_list:
        spec = target_dicts[target]
        if spec["default_configuration"] != "Default":
            default_configuration = spec["default_configuration"]
            break
    if not default_configuration:
        default_configuration = "Default"

    srcdir = "."
    makefile_name = "Makefile" + options.suffix
    makefile_path = os.path.join(options.toplevel_dir, makefile_name)
    if options.generator_output:
        global srcdir_prefix
        makefile_path = os.path.join(
            options.toplevel_dir, options.generator_output, makefile_name
        )
        srcdir = gyp.common.RelativePath(srcdir, options.generator_output)
        srcdir_prefix = "$(srcdir)/"

    flock_command = "flock"
    copy_archive_arguments = "-af"
    makedep_arguments = "-MMD"
    header_params = {
        "default_target": default_target,
        "builddir": builddir_name,
        "default_configuration": default_configuration,
        "flock": flock_command,
        "flock_index": 1,
        "link_commands": LINK_COMMANDS_LINUX,
        "extra_commands": "",
        "srcdir": srcdir,
        "copy_archive_args": copy_archive_arguments,
        "makedep_args": makedep_arguments,
        "CC.target": GetEnvironFallback(("CC_target", "CC"), "$(CC)"),
        "AR.target": GetEnvironFallback(("AR_target", "AR"), "$(AR)"),
        "CXX.target": GetEnvironFallback(("CXX_target", "CXX"), "$(CXX)"),
        "LINK.target": GetEnvironFallback(("LINK_target", "LINK"), "$(LINK)"),
        "CC.host": GetEnvironFallback(("CC_host", "CC"), "gcc"),
        "AR.host": GetEnvironFallback(("AR_host", "AR"), "ar"),
        "CXX.host": GetEnvironFallback(("CXX_host", "CXX"), "g++"),
        "LINK.host": GetEnvironFallback(("LINK_host", "LINK"), "$(CXX.host)"),
    }
    if flavor == "mac":
        flock_command = "./gyp-mac-tool flock"
        header_params.update(
            {
                "flock": flock_command,
                "flock_index": 2,
                "link_commands": LINK_COMMANDS_MAC,
                "extra_commands": SHARED_HEADER_MAC_COMMANDS,
            }
        )
    elif flavor == "android":
        header_params.update({"link_commands": LINK_COMMANDS_ANDROID})
    elif flavor == "zos":
        copy_archive_arguments = "-fPR"
        makedep_arguments = "-qmakedep=gcc"
        header_params.update(
            {
                "copy_archive_args": copy_archive_arguments,
                "makedep_args": makedep_arguments,
                "link_commands": LINK_COMMANDS_OS390,
                "CC.target": GetEnvironFallback(("CC_target", "CC"), "njsc"),
                "CXX.target": GetEnvironFallback(("CXX_target", "CXX"), "njsc++"),
                "CC.host": GetEnvironFallback(("CC_host", "CC"), "njsc"),
                "CXX.host": GetEnvironFallback(("CXX_host", "CXX"), "njsc++"),
            }
        )
    elif flavor == "solaris":
        copy_archive_arguments = "-pPRf@"
        header_params.update(
            {
                "copy_archive_args": copy_archive_arguments,
                "flock": "./gyp-flock-tool flock",
                "flock_index": 2,
            }
        )
    elif flavor == "freebsd":
        # Note: OpenBSD has sysutils/flock. lockf seems to be FreeBSD specific.
        header_params.update({"flock": "lockf"})
    elif flavor == "openbsd":
        copy_archive_arguments = "-pPRf"
        header_params.update({"copy_archive_args": copy_archive_arguments})
    elif flavor == "aix":
        copy_archive_arguments = "-pPRf"
        header_params.update(
            {
                "copy_archive_args": copy_archive_arguments,
                "link_commands": LINK_COMMANDS_AIX,
                "flock": "./gyp-flock-tool flock",
                "flock_index": 2,
            }
        )

    build_file, _, _ = gyp.common.ParseQualifiedTarget(target_list[0])
    make_global_settings_array = data[build_file].get("make_global_settings", [])
    wrappers = {}
    for key, value in make_global_settings_array:
        if key.endswith("_wrapper"):
            wrappers[key[: -len("_wrapper")]] = "$(abspath %s)" % value
    make_global_settings = ""
    for key, value in make_global_settings_array:
        if re.match(".*_wrapper", key):
            continue
        if value[0] != "$":
            value = "$(abspath %s)" % value
        wrapper = wrappers.get(key)
        if wrapper:
            value = f"{wrapper} {value}"
            del wrappers[key]
        if key in ("CC", "CC.host", "CXX", "CXX.host"):
            make_global_settings += (
                "ifneq (,$(filter $(origin %s), undefined default))\n" % key
            )
            # Let gyp-time envvars win over global settings.
            env_key = key.replace(".", "_")  # CC.host -> CC_host
            if env_key in os.environ:
                value = os.environ[env_key]
            make_global_settings += f"  {key} = {value}\n"
            make_global_settings += "endif\n"
        else:
            make_global_settings += f"{key} ?= {value}\n"
    # TODO(ukai): define cmd when only wrapper is specified in
    # make_global_settings.

    header_params["make_global_settings"] = make_global_settings

    gyp.common.EnsureDirExists(makefile_path)
    root_makefile = open(makefile_path, "w")
    root_makefile.write(SHARED_HEADER % header_params)
    # Currently any versions have the same effect, but in future the behavior
    # could be different.
    if android_ndk_version:
        root_makefile.write(
            "# Define LOCAL_PATH for build of Android applications.\n"
            "LOCAL_PATH := $(call my-dir)\n"
            "\n"
        )
    for toolset in toolsets:
        root_makefile.write("TOOLSET := %s\n" % toolset)
        WriteRootHeaderSuffixRules(root_makefile)

    # Put build-time support tools next to the root Makefile.
    dest_path = os.path.dirname(makefile_path)
    gyp.common.CopyTool(flavor, dest_path)

    # Find the list of targets that derive from the gyp file(s) being built.
    needed_targets = set()
    for build_file in params["build_files"]:
        for target in gyp.common.AllTargets(target_list, target_dicts, build_file):
            needed_targets.add(target)

    build_files = set()
    include_list = set()
    for qualified_target in target_list:
        build_file, target, toolset = gyp.common.ParseQualifiedTarget(qualified_target)

        this_make_global_settings = data[build_file].get("make_global_settings", [])
        assert make_global_settings_array == this_make_global_settings, (
            "make_global_settings needs to be the same for all targets "
            f"{this_make_global_settings} vs. {make_global_settings}"
        )

        build_files.add(gyp.common.RelativePath(build_file, options.toplevel_dir))
        included_files = data[build_file]["included_files"]
        for included_file in included_files:
            # The included_files entries are relative to the dir of the build file
            # that included them, so we have to undo that and then make them relative
            # to the root dir.
            relative_include_file = gyp.common.RelativePath(
                gyp.common.UnrelativePath(included_file, build_file),
                options.toplevel_dir,
            )
            abs_include_file = os.path.abspath(relative_include_file)
            # If the include file is from the ~/.gyp dir, we should use absolute path
            # so that relocating the src dir doesn't break the path.
            if params["home_dot_gyp"] and abs_include_file.startswith(
                params["home_dot_gyp"]
            ):
                build_files.add(abs_include_file)
            else:
                build_files.add(relative_include_file)

        base_path, output_file = CalculateMakefilePath(
            build_file, target + "." + toolset + options.suffix + ".mk"
        )

        spec = target_dicts[qualified_target]
        configs = spec["configurations"]

        if flavor == "mac":
            gyp.xcode_emulation.MergeGlobalXcodeSettingsToSpec(data[build_file], spec)

        writer = MakefileWriter(generator_flags, flavor)
        writer.Write(
            qualified_target,
            base_path,
            output_file,
            spec,
            configs,
            part_of_all=qualified_target in needed_targets,
        )

        # Our root_makefile lives at the source root.  Compute the relative path
        # from there to the output_file for including.
        mkfile_rel_path = gyp.common.RelativePath(
            output_file, os.path.dirname(makefile_path)
        )
        include_list.add(mkfile_rel_path)

    # Write out per-gyp (sub-project) Makefiles.
    depth_rel_path = gyp.common.RelativePath(options.depth, os.getcwd())
    for build_file in build_files:
        # The paths in build_files were relativized above, so undo that before
        # testing against the non-relativized items in target_list and before
        # calculating the Makefile path.
        build_file = os.path.join(depth_rel_path, build_file)
        gyp_targets = [
            target_dicts[qualified_target]["target_name"]
            for qualified_target in target_list
            if qualified_target.startswith(build_file)
            and qualified_target in needed_targets
        ]
        # Only generate Makefiles for gyp files with targets.
        if not gyp_targets:
            continue
        base_path, output_file = CalculateMakefilePath(
            build_file, os.path.splitext(os.path.basename(build_file))[0] + ".Makefile"
        )
        makefile_rel_path = gyp.common.RelativePath(
            os.path.dirname(makefile_path), os.path.dirname(output_file)
        )
        writer.WriteSubMake(output_file, makefile_rel_path, gyp_targets, builddir_name)

    # Write out the sorted list of includes.
    root_makefile.write("\n")
    for include_file in sorted(include_list):
        # We wrap each .mk include in an if statement so users can tell make to
        # not load a file by setting NO_LOAD.  The below make code says, only
        # load the .mk file if the .mk filename doesn't start with a token in
        # NO_LOAD.
        root_makefile.write(
            "ifeq ($(strip $(foreach prefix,$(NO_LOAD),\\\n"
            "    $(findstring $(join ^,$(prefix)),\\\n"
            "                 $(join ^," + include_file + ")))),)\n"
        )
        root_makefile.write("  include " + include_file + "\n")
        root_makefile.write("endif\n")
    root_makefile.write("\n")

    if not generator_flags.get("standalone") and generator_flags.get(
        "auto_regeneration", True
    ):
        WriteAutoRegenerationRule(params, root_makefile, makefile_name, build_files)

    root_makefile.write(SHARED_FOOTER)

    root_makefile.close()
# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.


import ntpath
import os
import posixpath
import re
import subprocess
import sys

from collections import OrderedDict

import gyp.common
import gyp.easy_xml as easy_xml
import gyp.generator.ninja as ninja_generator
import gyp.MSVSNew as MSVSNew
import gyp.MSVSProject as MSVSProject
import gyp.MSVSSettings as MSVSSettings
import gyp.MSVSToolFile as MSVSToolFile
import gyp.MSVSUserFile as MSVSUserFile
import gyp.MSVSUtil as MSVSUtil
import gyp.MSVSVersion as MSVSVersion
from gyp.common import GypError
from gyp.common import OrderedSet


# Regular expression for validating Visual Studio GUIDs.  If the GUID
# contains lowercase hex letters, MSVS will be fine. However,
# IncrediBuild BuildConsole will parse the solution file, but then
# silently skip building the target causing hard to track down errors.
# Note that this only happens with the BuildConsole, and does not occur
# if IncrediBuild is executed from inside Visual Studio.  This regex
# validates that the string looks like a GUID with all uppercase hex
# letters.
VALID_MSVS_GUID_CHARS = re.compile(r"^[A-F0-9\-]+$")

generator_supports_multiple_toolsets = gyp.common.CrossCompileRequested()

generator_default_variables = {
    "DRIVER_PREFIX": "",
    "DRIVER_SUFFIX": ".sys",
    "EXECUTABLE_PREFIX": "",
    "EXECUTABLE_SUFFIX": ".exe",
    "STATIC_LIB_PREFIX": "",
    "SHARED_LIB_PREFIX": "",
    "STATIC_LIB_SUFFIX": ".lib",
    "SHARED_LIB_SUFFIX": ".dll",
    "INTERMEDIATE_DIR": "$(IntDir)",
    "SHARED_INTERMEDIATE_DIR": "$(OutDir)/obj/global_intermediate",
    "OS": "win",
    "PRODUCT_DIR": "$(OutDir)",
    "LIB_DIR": "$(OutDir)lib",
    "RULE_INPUT_ROOT": "$(InputName)",
    "RULE_INPUT_DIRNAME": "$(InputDir)",
    "RULE_INPUT_EXT": "$(InputExt)",
    "RULE_INPUT_NAME": "$(InputFileName)",
    "RULE_INPUT_PATH": "$(InputPath)",
    "CONFIGURATION_NAME": "$(ConfigurationName)",
}


# The msvs specific sections that hold paths
generator_additional_path_sections = [
    "msvs_cygwin_dirs",
    "msvs_props",
]


generator_additional_non_configuration_keys = [
    "msvs_cygwin_dirs",
    "msvs_cygwin_shell",
    "msvs_large_pdb",
    "msvs_shard",
    "msvs_external_builder",
    "msvs_external_builder_out_dir",
    "msvs_external_builder_build_cmd",
    "msvs_external_builder_clean_cmd",
    "msvs_external_builder_clcompile_cmd",
    "msvs_enable_winrt",
    "msvs_requires_importlibrary",
    "msvs_enable_winphone",
    "msvs_application_type_revision",
    "msvs_target_platform_version",
    "msvs_target_platform_minversion",
]

generator_filelist_paths = None

# List of precompiled header related keys.
precomp_keys = [
    "msvs_precompiled_header",
    "msvs_precompiled_source",
]


cached_username = None


cached_domain = None


# TODO(gspencer): Switch the os.environ calls to be
# win32api.GetDomainName() and win32api.GetUserName() once the
# python version in depot_tools has been updated to work on Vista
# 64-bit.
def _GetDomainAndUserName():
    if sys.platform not in ("win32", "cygwin"):
        return ("DOMAIN", "USERNAME")
    global cached_username
    global cached_domain
    if not cached_domain or not cached_username:
        domain = os.environ.get("USERDOMAIN")
        username = os.environ.get("USERNAME")
        if not domain or not username:
            call = subprocess.Popen(
                ["net", "config", "Workstation"], stdout=subprocess.PIPE
            )
            config = call.communicate()[0].decode("utf-8")
            username_re = re.compile(r"^User name\s+(\S+)", re.MULTILINE)
            username_match = username_re.search(config)
            if username_match:
                username = username_match.group(1)
            domain_re = re.compile(r"^Logon domain\s+(\S+)", re.MULTILINE)
            domain_match = domain_re.search(config)
            if domain_match:
                domain = domain_match.group(1)
        cached_domain = domain
        cached_username = username
    return (cached_domain, cached_username)


fixpath_prefix = None


def _NormalizedSource(source):
    """Normalize the path.

  But not if that gets rid of a variable, as this may expand to something
  larger than one directory.

  Arguments:
      source: The path to be normalize.d

  Returns:
      The normalized path.
  """
    normalized = os.path.normpath(source)
    if source.count("$") == normalized.count("$"):
        source = normalized
    return source


def _FixPath(path, separator="\\"):
    """Convert paths to a form that will make sense in a vcproj file.

  Arguments:
    path: The path to convert, may contain / etc.
  Returns:
    The path with all slashes made into backslashes.
  """
    if (
        fixpath_prefix
        and path
        and not os.path.isabs(path)
        and not path[0] == "$"
        and not _IsWindowsAbsPath(path)
    ):
        path = os.path.join(fixpath_prefix, path)
    if separator == "\\":
        path = path.replace("/", "\\")
    path = _NormalizedSource(path)
    if separator == "/":
        path = path.replace("\\", "/")
    if path and path[-1] == separator:
        path = path[:-1]
    return path


def _IsWindowsAbsPath(path):
    """
  On Cygwin systems Python needs a little help determining if a path
  is an absolute Windows path or not, so that
  it does not treat those as relative, which results in bad paths like:
  '..\\C:\\<some path>\\some_source_code_file.cc'
  """
    return path.startswith("c:") or path.startswith("C:")


def _FixPaths(paths, separator="\\"):
    """Fix each of the paths of the list."""
    return [_FixPath(i, separator) for i in paths]


def _ConvertSourcesToFilterHierarchy(
    sources, prefix=None, excluded=None, list_excluded=True, msvs_version=None
):
    """Converts a list split source file paths into a vcproj folder hierarchy.

  Arguments:
    sources: A list of source file paths split.
    prefix: A list of source file path layers meant to apply to each of sources.
    excluded: A set of excluded files.
    msvs_version: A MSVSVersion object.

  Returns:
    A hierarchy of filenames and MSVSProject.Filter objects that matches the
    layout of the source tree.
    For example:
    _ConvertSourcesToFilterHierarchy([['a', 'bob1.c'], ['b', 'bob2.c']],
                                     prefix=['joe'])
    -->
    [MSVSProject.Filter('a', contents=['joe\\a\\bob1.c']),
     MSVSProject.Filter('b', contents=['joe\\b\\bob2.c'])]
  """
    if not prefix:
        prefix = []
    result = []
    excluded_result = []
    folders = OrderedDict()
    # Gather files into the final result, excluded, or folders.
    for s in sources:
        if len(s) == 1:
            filename = _NormalizedSource("\\".join(prefix + s))
            if filename in excluded:
                excluded_result.append(filename)
            else:
                result.append(filename)
        elif msvs_version and not msvs_version.UsesVcxproj():
            # For MSVS 2008 and earlier, we need to process all files before walking
            # the sub folders.
            if not folders.get(s[0]):
                folders[s[0]] = []
            folders[s[0]].append(s[1:])
        else:
            contents = _ConvertSourcesToFilterHierarchy(
                [s[1:]],
                prefix + [s[0]],
                excluded=excluded,
                list_excluded=list_excluded,
                msvs_version=msvs_version,
            )
            contents = MSVSProject.Filter(s[0], contents=contents)
            result.append(contents)
    # Add a folder for excluded files.
    if excluded_result and list_excluded:
        excluded_folder = MSVSProject.Filter(
            "_excluded_files", contents=excluded_result
        )
        result.append(excluded_folder)

    if msvs_version and msvs_version.UsesVcxproj():
        return result

    # Populate all the folders.
    for f in folders:
        contents = _ConvertSourcesToFilterHierarchy(
            folders[f],
            prefix=prefix + [f],
            excluded=excluded,
            list_excluded=list_excluded,
            msvs_version=msvs_version,
        )
        contents = MSVSProject.Filter(f, contents=contents)
        result.append(contents)
    return result


def _ToolAppend(tools, tool_name, setting, value, only_if_unset=False):
    if not value:
        return
    _ToolSetOrAppend(tools, tool_name, setting, value, only_if_unset)


def _ToolSetOrAppend(tools, tool_name, setting, value, only_if_unset=False):
    # TODO(bradnelson): ugly hack, fix this more generally!!!
    if "Directories" in setting or "Dependencies" in setting:
        if type(value) == str:
            value = value.replace("/", "\\")
        else:
            value = [i.replace("/", "\\") for i in value]
    if not tools.get(tool_name):
        tools[tool_name] = dict()
    tool = tools[tool_name]
    if "CompileAsWinRT" == setting:
        return
    if tool.get(setting):
        if only_if_unset:
            return
        if type(tool[setting]) == list and type(value) == list:
            tool[setting] += value
        else:
            raise TypeError(
                'Appending "%s" to a non-list setting "%s" for tool "%s" is '
                "not allowed, previous value: %s"
                % (value, setting, tool_name, str(tool[setting]))
            )
    else:
        tool[setting] = value


def _ConfigTargetVersion(config_data):
    return config_data.get("msvs_target_version", "Windows7")


def _ConfigPlatform(config_data):
    return config_data.get("msvs_configuration_platform", "Win32")


def _ConfigBaseName(config_name, platform_name):
    if config_name.endswith("_" + platform_name):
        return config_name[0 : -len(platform_name) - 1]
    else:
        return config_name


def _ConfigFullName(config_name, config_data):
    platform_name = _ConfigPlatform(config_data)
    return f"{_ConfigBaseName(config_name, platform_name)}|{platform_name}"


def _ConfigWindowsTargetPlatformVersion(config_data, version):
    target_ver = config_data.get("msvs_windows_target_platform_version")
    if target_ver and re.match(r"^\d+", target_ver):
        return target_ver
    config_ver = config_data.get("msvs_windows_sdk_version")
    vers = [config_ver] if config_ver else version.compatible_sdks
    for ver in vers:
        for key in [
            r"HKLM\Software\Microsoft\Microsoft SDKs\Windows\%s",
            r"HKLM\Software\Wow6432Node\Microsoft\Microsoft SDKs\Windows\%s",
        ]:
            sdk_dir = MSVSVersion._RegistryGetValue(key % ver, "InstallationFolder")
            if not sdk_dir:
                continue
            version = MSVSVersion._RegistryGetValue(key % ver, "ProductVersion") or ""
            # Find a matching entry in sdk_dir\include.
            expected_sdk_dir = r"%s\include" % sdk_dir
            names = sorted(
                (
                    x
                    for x in (
                        os.listdir(expected_sdk_dir)
                        if os.path.isdir(expected_sdk_dir)
                        else []
                    )
                    if x.startswith(version)
                ),
                reverse=True,
            )
            if names:
                return names[0]
            else:
                print(
                    "Warning: No include files found for detected "
                    "Windows SDK version %s" % (version),
                    file=sys.stdout,
                )


def _BuildCommandLineForRuleRaw(
    spec, cmd, cygwin_shell, has_input_path, quote_cmd, do_setup_env
):

    if [x for x in cmd if "$(InputDir)" in x]:
        input_dir_preamble = (
            "set INPUTDIR=$(InputDir)\n"
            "if NOT DEFINED INPUTDIR set INPUTDIR=.\\\n"
            "set INPUTDIR=%INPUTDIR:~0,-1%\n"
        )
    else:
        input_dir_preamble = ""

    if cygwin_shell:
        # Find path to cygwin.
        cygwin_dir = _FixPath(spec.get("msvs_cygwin_dirs", ["."])[0])
        # Prepare command.
        direct_cmd = cmd
        direct_cmd = [
            i.replace("$(IntDir)", '`cygpath -m "${INTDIR}"`') for i in direct_cmd
        ]
        direct_cmd = [
            i.replace("$(OutDir)", '`cygpath -m "${OUTDIR}"`') for i in direct_cmd
        ]
        direct_cmd = [
            i.replace("$(InputDir)", '`cygpath -m "${INPUTDIR}"`') for i in direct_cmd
        ]
        if has_input_path:
            direct_cmd = [
                i.replace("$(InputPath)", '`cygpath -m "${INPUTPATH}"`')
                for i in direct_cmd
            ]
        direct_cmd = ['\\"%s\\"' % i.replace('"', '\\\\\\"') for i in direct_cmd]
        # direct_cmd = gyp.common.EncodePOSIXShellList(direct_cmd)
        direct_cmd = " ".join(direct_cmd)
        # TODO(quote):  regularize quoting path names throughout the module
        cmd = ""
        if do_setup_env:
            cmd += 'call "$(ProjectDir)%(cygwin_dir)s\\setup_env.bat" && '
        cmd += "set CYGWIN=nontsec&& "
        if direct_cmd.find("NUMBER_OF_PROCESSORS") >= 0:
            cmd += "set /a NUMBER_OF_PROCESSORS_PLUS_1=%%NUMBER_OF_PROCESSORS%%+1&& "
        if direct_cmd.find("INTDIR") >= 0:
            cmd += "set INTDIR=$(IntDir)&& "
        if direct_cmd.find("OUTDIR") >= 0:
            cmd += "set OUTDIR=$(OutDir)&& "
        if has_input_path and direct_cmd.find("INPUTPATH") >= 0:
            cmd += "set INPUTPATH=$(InputPath) && "
        cmd += 'bash -c "%(cmd)s"'
        cmd = cmd % {"cygwin_dir": cygwin_dir, "cmd": direct_cmd}
        return input_dir_preamble + cmd
    else:
        # Convert cat --> type to mimic unix.
        if cmd[0] == "cat":
            command = ["type"]
        else:
            command = [cmd[0].replace("/", "\\")]
        # Add call before command to ensure that commands can be tied together one
        # after the other without aborting in Incredibuild, since IB makes a bat
        # file out of the raw command string, and some commands (like python) are
        # actually batch files themselves.
        command.insert(0, "call")
        # Fix the paths
        # TODO(quote): This is a really ugly heuristic, and will miss path fixing
        #              for arguments like "--arg=path" or "/opt:path".
        # If the argument starts with a slash or dash, it's probably a command line
        # switch
        # Return the path with forward slashes because the command using it might
        # not support backslashes.
        arguments = [i if (i[:1] in "/-") else _FixPath(i, "/") for i in cmd[1:]]
        arguments = [i.replace("$(InputDir)", "%INPUTDIR%") for i in arguments]
        arguments = [MSVSSettings.FixVCMacroSlashes(i) for i in arguments]
        if quote_cmd:
            # Support a mode for using cmd directly.
            # Convert any paths to native form (first element is used directly).
            # TODO(quote):  regularize quoting path names throughout the module
            arguments = ['"%s"' % i for i in arguments]
        # Collapse into a single command.
        return input_dir_preamble + " ".join(command + arguments)


def _BuildCommandLineForRule(spec, rule, has_input_path, do_setup_env):
    # Currently this weird argument munging is used to duplicate the way a
    # python script would need to be run as part of the chrome tree.
    # Eventually we should add some sort of rule_default option to set this
    # per project. For now the behavior chrome needs is the default.
    mcs = rule.get("msvs_cygwin_shell")
    if mcs is None:
        mcs = int(spec.get("msvs_cygwin_shell", 1))
    elif isinstance(mcs, str):
        mcs = int(mcs)
    quote_cmd = int(rule.get("msvs_quote_cmd", 1))
    return _BuildCommandLineForRuleRaw(
        spec, rule["action"], mcs, has_input_path, quote_cmd, do_setup_env=do_setup_env
    )


def _AddActionStep(actions_dict, inputs, outputs, description, command):
    """Merge action into an existing list of actions.

  Care must be taken so that actions which have overlapping inputs either don't
  get assigned to the same input, or get collapsed into one.

  Arguments:
    actions_dict: dictionary keyed on input name, which maps to a list of
      dicts describing the actions attached to that input file.
    inputs: list of inputs
    outputs: list of outputs
    description: description of the action
    command: command line to execute
  """
    # Require there to be at least one input (call sites will ensure this).
    assert inputs

    action = {
        "inputs": inputs,
        "outputs": outputs,
        "description": description,
        "command": command,
    }

    # Pick where to stick this action.
    # While less than optimal in terms of build time, attach them to the first
    # input for now.
    chosen_input = inputs[0]

    # Add it there.
    if chosen_input not in actions_dict:
        actions_dict[chosen_input] = []
    actions_dict[chosen_input].append(action)


def _AddCustomBuildToolForMSVS(
    p, spec, primary_input, inputs, outputs, description, cmd
):
    """Add a custom build tool to execute something.

  Arguments:
    p: the target project
    spec: the target project dict
    primary_input: input file to attach the build tool to
    inputs: list of inputs
    outputs: list of outputs
    description: description of the action
    cmd: command line to execute
  """
    inputs = _FixPaths(inputs)
    outputs = _FixPaths(outputs)
    tool = MSVSProject.Tool(
        "VCCustomBuildTool",
        {
            "Description": description,
            "AdditionalDependencies": ";".join(inputs),
            "Outputs": ";".join(outputs),
            "CommandLine": cmd,
        },
    )
    # Add to the properties of primary input for each config.
    for config_name, c_data in spec["configurations"].items():
        p.AddFileConfig(
            _FixPath(primary_input), _ConfigFullName(config_name, c_data), tools=[tool]
        )


def _AddAccumulatedActionsToMSVS(p, spec, actions_dict):
    """Add actions accumulated into an actions_dict, merging as needed.

  Arguments:
    p: the target project
    spec: the target project dict
    actions_dict: dictionary keyed on input name, which maps to a list of
        dicts describing the actions attached to that input file.
  """
    for primary_input in actions_dict:
        inputs = OrderedSet()
        outputs = OrderedSet()
        descriptions = []
        commands = []
        for action in actions_dict[primary_input]:
            inputs.update(OrderedSet(action["inputs"]))
            outputs.update(OrderedSet(action["outputs"]))
            descriptions.append(action["description"])
            commands.append(action["command"])
        # Add the custom build step for one input file.
        description = ", and also ".join(descriptions)
        command = "\r\n".join(commands)
        _AddCustomBuildToolForMSVS(
            p,
            spec,
            primary_input=primary_input,
            inputs=inputs,
            outputs=outputs,
            description=description,
            cmd=command,
        )


def _RuleExpandPath(path, input_file):
    """Given the input file to which a rule applied, string substitute a path.

  Arguments:
    path: a path to string expand
    input_file: the file to which the rule applied.
  Returns:
    The string substituted path.
  """
    path = path.replace(
        "$(InputName)", os.path.splitext(os.path.split(input_file)[1])[0]
    )
    path = path.replace("$(InputDir)", os.path.dirname(input_file))
    path = path.replace(
        "$(InputExt)", os.path.splitext(os.path.split(input_file)[1])[1]
    )
    path = path.replace("$(InputFileName)", os.path.split(input_file)[1])
    path = path.replace("$(InputPath)", input_file)
    return path


def _FindRuleTriggerFiles(rule, sources):
    """Find the list of files which a particular rule applies to.

  Arguments:
    rule: the rule in question
    sources: the set of all known source files for this project
  Returns:
    The list of sources that trigger a particular rule.
  """
    return rule.get("rule_sources", [])


def _RuleInputsAndOutputs(rule, trigger_file):
    """Find the inputs and outputs generated by a rule.

  Arguments:
    rule: the rule in question.
    trigger_file: the main trigger for this rule.
  Returns:
    The pair of (inputs, outputs) involved in this rule.
  """
    raw_inputs = _FixPaths(rule.get("inputs", []))
    raw_outputs = _FixPaths(rule.get("outputs", []))
    inputs = OrderedSet()
    outputs = OrderedSet()
    inputs.add(trigger_file)
    for i in raw_inputs:
        inputs.add(_RuleExpandPath(i, trigger_file))
    for o in raw_outputs:
        outputs.add(_RuleExpandPath(o, trigger_file))
    return (inputs, outputs)


def _GenerateNativeRulesForMSVS(p, rules, output_dir, spec, options):
    """Generate a native rules file.

  Arguments:
    p: the target project
    rules: the set of rules to include
    output_dir: the directory in which the project/gyp resides
    spec: the project dict
    options: global generator options
  """
    rules_filename = "{}{}.rules".format(spec["target_name"], options.suffix)
    rules_file = MSVSToolFile.Writer(
        os.path.join(output_dir, rules_filename), spec["target_name"]
    )
    # Add each rule.
    for r in rules:
        rule_name = r["rule_name"]
        rule_ext = r["extension"]
        inputs = _FixPaths(r.get("inputs", []))
        outputs = _FixPaths(r.get("outputs", []))
        # Skip a rule with no action and no inputs.
        if "action" not in r and not r.get("rule_sources", []):
            continue
        cmd = _BuildCommandLineForRule(spec, r, has_input_path=True, do_setup_env=True)
        rules_file.AddCustomBuildRule(
            name=rule_name,
            description=r.get("message", rule_name),
            extensions=[rule_ext],
            additional_dependencies=inputs,
            outputs=outputs,
            cmd=cmd,
        )
    # Write out rules file.
    rules_file.WriteIfChanged()

    # Add rules file to project.
    p.AddToolFile(rules_filename)


def _Cygwinify(path):
    path = path.replace("$(OutDir)", "$(OutDirCygwin)")
    path = path.replace("$(IntDir)", "$(IntDirCygwin)")
    return path


def _GenerateExternalRules(rules, output_dir, spec, sources, options, actions_to_add):
    """Generate an external makefile to do a set of rules.

  Arguments:
    rules: the list of rules to include
    output_dir: path containing project and gyp files
    spec: project specification data
    sources: set of sources known
    options: global generator options
    actions_to_add: The list of actions we will add to.
  """
    filename = "{}_rules{}.mk".format(spec["target_name"], options.suffix)
    mk_file = gyp.common.WriteOnDiff(os.path.join(output_dir, filename))
    # Find cygwin style versions of some paths.
    mk_file.write('OutDirCygwin:=$(shell cygpath -u "$(OutDir)")\n')
    mk_file.write('IntDirCygwin:=$(shell cygpath -u "$(IntDir)")\n')
    # Gather stuff needed to emit all: target.
    all_inputs = OrderedSet()
    all_outputs = OrderedSet()
    all_output_dirs = OrderedSet()
    first_outputs = []
    for rule in rules:
        trigger_files = _FindRuleTriggerFiles(rule, sources)
        for tf in trigger_files:
            inputs, outputs = _RuleInputsAndOutputs(rule, tf)
            all_inputs.update(OrderedSet(inputs))
            all_outputs.update(OrderedSet(outputs))
            # Only use one target from each rule as the dependency for
            # 'all' so we don't try to build each rule multiple times.
            first_outputs.append(list(outputs)[0])
            # Get the unique output directories for this rule.
            output_dirs = [os.path.split(i)[0] for i in outputs]
            for od in output_dirs:
                all_output_dirs.add(od)
    first_outputs_cyg = [_Cygwinify(i) for i in first_outputs]
    # Write out all: target, including mkdir for each output directory.
    mk_file.write("all: %s\n" % " ".join(first_outputs_cyg))
    for od in all_output_dirs:
        if od:
            mk_file.write('\tmkdir -p `cygpath -u "%s"`\n' % od)
    mk_file.write("\n")
    # Define how each output is generated.
    for rule in rules:
        trigger_files = _FindRuleTriggerFiles(rule, sources)
        for tf in trigger_files:
            # Get all the inputs and outputs for this rule for this trigger file.
            inputs, outputs = _RuleInputsAndOutputs(rule, tf)
            inputs = [_Cygwinify(i) for i in inputs]
            outputs = [_Cygwinify(i) for i in outputs]
            # Prepare the command line for this rule.
            cmd = [_RuleExpandPath(c, tf) for c in rule["action"]]
            cmd = ['"%s"' % i for i in cmd]
            cmd = " ".join(cmd)
            # Add it to the makefile.
            mk_file.write("{}: {}\n".format(" ".join(outputs), " ".join(inputs)))
            mk_file.write("\t%s\n\n" % cmd)
    # Close up the file.
    mk_file.close()

    # Add makefile to list of sources.
    sources.add(filename)
    # Add a build action to call makefile.
    cmd = [
        "make",
        "OutDir=$(OutDir)",
        "IntDir=$(IntDir)",
        "-j",
        "${NUMBER_OF_PROCESSORS_PLUS_1}",
        "-f",
        filename,
    ]
    cmd = _BuildCommandLineForRuleRaw(spec, cmd, True, False, True, True)
    # Insert makefile as 0'th input, so it gets the action attached there,
    # as this is easier to understand from in the IDE.
    all_inputs = list(all_inputs)
    all_inputs.insert(0, filename)
    _AddActionStep(
        actions_to_add,
        inputs=_FixPaths(all_inputs),
        outputs=_FixPaths(all_outputs),
        description="Running external rules for %s" % spec["target_name"],
        command=cmd,
    )


def _EscapeEnvironmentVariableExpansion(s):
    """Escapes % characters.

  Escapes any % characters so that Windows-style environment variable
  expansions will leave them alone.
  See http://connect.microsoft.com/VisualStudio/feedback/details/106127/cl-d-name-text-containing-percentage-characters-doesnt-compile
  to understand why we have to do this.

  Args:
      s: The string to be escaped.

  Returns:
      The escaped string.
  """  # noqa: E731,E123,E501
    s = s.replace("%", "%%")
    return s


quote_replacer_regex = re.compile(r'(\\*)"')


def _EscapeCommandLineArgumentForMSVS(s):
    """Escapes a Windows command-line argument.

  So that the Win32 CommandLineToArgv function will turn the escaped result back
  into the original string.
  See http://msdn.microsoft.com/en-us/library/17w5ykft.aspx
  ("Parsing C++ Command-Line Arguments") to understand why we have to do
  this.

  Args:
      s: the string to be escaped.
  Returns:
      the escaped string.
  """

    def _Replace(match):
        # For a literal quote, CommandLineToArgv requires an odd number of
        # backslashes preceding it, and it produces half as many literal backslashes
        # (rounded down). So we need to produce 2n+1 backslashes.
        return 2 * match.group(1) + '\\"'

    # Escape all quotes so that they are interpreted literally.
    s = quote_replacer_regex.sub(_Replace, s)
    # Now add unescaped quotes so that any whitespace is interpreted literally.
    s = '"' + s + '"'
    return s


delimiters_replacer_regex = re.compile(r"(\\*)([,;]+)")


def _EscapeVCProjCommandLineArgListItem(s):
    """Escapes command line arguments for MSVS.

  The VCProj format stores string lists in a single string using commas and
  semi-colons as separators, which must be quoted if they are to be
  interpreted literally. However, command-line arguments may already have
  quotes, and the VCProj parser is ignorant of the backslash escaping
  convention used by CommandLineToArgv, so the command-line quotes and the
  VCProj quotes may not be the same quotes. So to store a general
  command-line argument in a VCProj list, we need to parse the existing
  quoting according to VCProj's convention and quote any delimiters that are
  not already quoted by that convention. The quotes that we add will also be
  seen by CommandLineToArgv, so if backslashes precede them then we also have
  to escape those backslashes according to the CommandLineToArgv
  convention.

  Args:
      s: the string to be escaped.
  Returns:
      the escaped string.
  """

    def _Replace(match):
        # For a non-literal quote, CommandLineToArgv requires an even number of
        # backslashes preceding it, and it produces half as many literal
        # backslashes. So we need to produce 2n backslashes.
        return 2 * match.group(1) + '"' + match.group(2) + '"'

    segments = s.split('"')
    # The unquoted segments are at the even-numbered indices.
    for i in range(0, len(segments), 2):
        segments[i] = delimiters_replacer_regex.sub(_Replace, segments[i])
    # Concatenate back into a single string
    s = '"'.join(segments)
    if len(segments) % 2 == 0:
        # String ends while still quoted according to VCProj's convention. This
        # means the delimiter and the next list item that follow this one in the
        # .vcproj file will be misinterpreted as part of this item. There is nothing
        # we can do about this. Adding an extra quote would correct the problem in
        # the VCProj but cause the same problem on the final command-line. Moving
        # the item to the end of the list does works, but that's only possible if
        # there's only one such item. Let's just warn the user.
        print(
            "Warning: MSVS may misinterpret the odd number of " + "quotes in " + s,
            file=sys.stderr,
        )
    return s


def _EscapeCppDefineForMSVS(s):
    """Escapes a CPP define so that it will reach the compiler unaltered."""
    s = _EscapeEnvironmentVariableExpansion(s)
    s = _EscapeCommandLineArgumentForMSVS(s)
    s = _EscapeVCProjCommandLineArgListItem(s)
    # cl.exe replaces literal # characters with = in preprocessor definitions for
    # some reason. Octal-encode to work around that.
    s = s.replace("#", "\\%03o" % ord("#"))
    return s


quote_replacer_regex2 = re.compile(r'(\\+)"')


def _EscapeCommandLineArgumentForMSBuild(s):
    """Escapes a Windows command-line argument for use by MSBuild."""

    def _Replace(match):
        return (len(match.group(1)) / 2 * 4) * "\\" + '\\"'

    # Escape all quotes so that they are interpreted literally.
    s = quote_replacer_regex2.sub(_Replace, s)
    return s


def _EscapeMSBuildSpecialCharacters(s):
    escape_dictionary = {
        "%": "%25",
        "$": "%24",
        "@": "%40",
        "'": "%27",
        ";": "%3B",
        "?": "%3F",
        "*": "%2A",
    }
    result = "".join([escape_dictionary.get(c, c) for c in s])
    return result


def _EscapeCppDefineForMSBuild(s):
    """Escapes a CPP define so that it will reach the compiler unaltered."""
    s = _EscapeEnvironmentVariableExpansion(s)
    s = _EscapeCommandLineArgumentForMSBuild(s)
    s = _EscapeMSBuildSpecialCharacters(s)
    # cl.exe replaces literal # characters with = in preprocessor definitions for
    # some reason. Octal-encode to work around that.
    s = s.replace("#", "\\%03o" % ord("#"))
    return s


def _GenerateRulesForMSVS(
    p, output_dir, options, spec, sources, excluded_sources, actions_to_add
):
    """Generate all the rules for a particular project.

  Arguments:
    p: the project
    output_dir: directory to emit rules to
    options: global options passed to the generator
    spec: the specification for this project
    sources: the set of all known source files in this project
    excluded_sources: the set of sources excluded from normal processing
    actions_to_add: deferred list of actions to add in
  """
    rules = spec.get("rules", [])
    rules_native = [r for r in rules if not int(r.get("msvs_external_rule", 0))]
    rules_external = [r for r in rules if int(r.get("msvs_external_rule", 0))]

    # Handle rules that use a native rules file.
    if rules_native:
        _GenerateNativeRulesForMSVS(p, rules_native, output_dir, spec, options)

    # Handle external rules (non-native rules).
    if rules_external:
        _GenerateExternalRules(
            rules_external, output_dir, spec, sources, options, actions_to_add
        )
    _AdjustSourcesForRules(rules, sources, excluded_sources, False)


def _AdjustSourcesForRules(rules, sources, excluded_sources, is_msbuild):
    # Add outputs generated by each rule (if applicable).
    for rule in rules:
        # Add in the outputs from this rule.
        trigger_files = _FindRuleTriggerFiles(rule, sources)
        for trigger_file in trigger_files:
            # Remove trigger_file from excluded_sources to let the rule be triggered
            # (e.g. rule trigger ax_enums.idl is added to excluded_sources
            # because it's also in an action's inputs in the same project)
            excluded_sources.discard(_FixPath(trigger_file))
            # Done if not processing outputs as sources.
            if int(rule.get("process_outputs_as_sources", False)):
                inputs, outputs = _RuleInputsAndOutputs(rule, trigger_file)
                inputs = OrderedSet(_FixPaths(inputs))
                outputs = OrderedSet(_FixPaths(outputs))
                inputs.remove(_FixPath(trigger_file))
                sources.update(inputs)
                if not is_msbuild:
                    excluded_sources.update(inputs)
                sources.update(outputs)


def _FilterActionsFromExcluded(excluded_sources, actions_to_add):
    """Take inputs with actions attached out of the list of exclusions.

  Arguments:
    excluded_sources: list of source files not to be built.
    actions_to_add: dict of actions keyed on source file they're attached to.
  Returns:
    excluded_sources with files that have actions attached removed.
  """
    must_keep = OrderedSet(_FixPaths(actions_to_add.keys()))
    return [s for s in excluded_sources if s not in must_keep]


def _GetDefaultConfiguration(spec):
    return spec["configurations"][spec["default_configuration"]]


def _GetGuidOfProject(proj_path, spec):
    """Get the guid for the project.

  Arguments:
    proj_path: Path of the vcproj or vcxproj file to generate.
    spec: The target dictionary containing the properties of the target.
  Returns:
    the guid.
  Raises:
    ValueError: if the specified GUID is invalid.
  """
    # Pluck out the default configuration.
    default_config = _GetDefaultConfiguration(spec)
    # Decide the guid of the project.
    guid = default_config.get("msvs_guid")
    if guid:
        if VALID_MSVS_GUID_CHARS.match(guid) is None:
            raise ValueError(
                'Invalid MSVS guid: "%s".  Must match regex: "%s".'
                % (guid, VALID_MSVS_GUID_CHARS.pattern)
            )
        guid = "{%s}" % guid
    guid = guid or MSVSNew.MakeGuid(proj_path)
    return guid


def _GetMsbuildToolsetOfProject(proj_path, spec, version):
    """Get the platform toolset for the project.

  Arguments:
    proj_path: Path of the vcproj or vcxproj file to generate.
    spec: The target dictionary containing the properties of the target.
    version: The MSVSVersion object.
  Returns:
    the platform toolset string or None.
  """
    # Pluck out the default configuration.
    default_config = _GetDefaultConfiguration(spec)
    toolset = default_config.get("msbuild_toolset")
    if not toolset and version.DefaultToolset():
        toolset = version.DefaultToolset()
    if spec["type"] == "windows_driver":
        toolset = "WindowsKernelModeDriver10.0"
    return toolset


def _GenerateProject(project, options, version, generator_flags, spec):
    """Generates a vcproj file.

  Arguments:
    project: the MSVSProject object.
    options: global generator options.
    version: the MSVSVersion object.
    generator_flags: dict of generator-specific flags.
  Returns:
    A list of source files that cannot be found on disk.
  """
    default_config = _GetDefaultConfiguration(project.spec)

    # Skip emitting anything if told to with msvs_existing_vcproj option.
    if default_config.get("msvs_existing_vcproj"):
        return []

    if version.UsesVcxproj():
        return _GenerateMSBuildProject(project, options, version, generator_flags, spec)
    else:
        return _GenerateMSVSProject(project, options, version, generator_flags)


def _GenerateMSVSProject(project, options, version, generator_flags):
    """Generates a .vcproj file.  It may create .rules and .user files too.

  Arguments:
    project: The project object we will generate the file for.
    options: Global options passed to the generator.
    version: The VisualStudioVersion object.
    generator_flags: dict of generator-specific flags.
  """
    spec = project.spec
    gyp.common.EnsureDirExists(project.path)

    platforms = _GetUniquePlatforms(spec)
    p = MSVSProject.Writer(
        project.path, version, spec["target_name"], project.guid, platforms
    )

    # Get directory project file is in.
    project_dir = os.path.split(project.path)[0]
    gyp_path = _NormalizedSource(project.build_file)
    relative_path_of_gyp_file = gyp.common.RelativePath(gyp_path, project_dir)

    config_type = _GetMSVSConfigurationType(spec, project.build_file)
    for config_name, config in spec["configurations"].items():
        _AddConfigurationToMSVSProject(p, spec, config_type, config_name, config)

    # Prepare list of sources and excluded sources.
    gyp_file = os.path.split(project.build_file)[1]
    sources, excluded_sources = _PrepareListOfSources(spec, generator_flags, gyp_file)

    # Add rules.
    actions_to_add = {}
    _GenerateRulesForMSVS(
        p, project_dir, options, spec, sources, excluded_sources, actions_to_add
    )
    list_excluded = generator_flags.get("msvs_list_excluded_files", True)
    sources, excluded_sources, excluded_idl = _AdjustSourcesAndConvertToFilterHierarchy(
        spec, options, project_dir, sources, excluded_sources, list_excluded, version
    )

    # Add in files.
    missing_sources = _VerifySourcesExist(sources, project_dir)
    p.AddFiles(sources)

    _AddToolFilesToMSVS(p, spec)
    _HandlePreCompiledHeaders(p, sources, spec)
    _AddActions(actions_to_add, spec, relative_path_of_gyp_file)
    _AddCopies(actions_to_add, spec)
    _WriteMSVSUserFile(project.path, version, spec)

    # NOTE: this stanza must appear after all actions have been decided.
    # Don't excluded sources with actions attached, or they won't run.
    excluded_sources = _FilterActionsFromExcluded(excluded_sources, actions_to_add)
    _ExcludeFilesFromBeingBuilt(p, spec, excluded_sources, excluded_idl, list_excluded)
    _AddAccumulatedActionsToMSVS(p, spec, actions_to_add)

    # Write it out.
    p.WriteIfChanged()

    return missing_sources


def _GetUniquePlatforms(spec):
    """Returns the list of unique platforms for this spec, e.g ['win32', ...].

  Arguments:
    spec: The target dictionary containing the properties of the target.
  Returns:
    The MSVSUserFile object created.
  """
    # Gather list of unique platforms.
    platforms = OrderedSet()
    for configuration in spec["configurations"]:
        platforms.add(_ConfigPlatform(spec["configurations"][configuration]))
    platforms = list(platforms)
    return platforms


def _CreateMSVSUserFile(proj_path, version, spec):
    """Generates a .user file for the user running this Gyp program.

  Arguments:
    proj_path: The path of the project file being created.  The .user file
               shares the same path (with an appropriate suffix).
    version: The VisualStudioVersion object.
    spec: The target dictionary containing the properties of the target.
  Returns:
    The MSVSUserFile object created.
  """
    (domain, username) = _GetDomainAndUserName()
    vcuser_filename = ".".join([proj_path, domain, username, "user"])
    user_file = MSVSUserFile.Writer(vcuser_filename, version, spec["target_name"])
    return user_file


def _GetMSVSConfigurationType(spec, build_file):
    """Returns the configuration type for this project.

  It's a number defined by Microsoft.  May raise an exception.

  Args:
      spec: The target dictionary containing the properties of the target.
      build_file: The path of the gyp file.
  Returns:
      An integer, the configuration type.
  """
    try:
        config_type = {
            "executable": "1",  # .exe
            "shared_library": "2",  # .dll
            "loadable_module": "2",  # .dll
            "static_library": "4",  # .lib
            "windows_driver": "5",  # .sys
            "none": "10",  # Utility type
        }[spec["type"]]
    except KeyError:
        if spec.get("type"):
            raise GypError(
                "Target type %s is not a valid target type for "
                "target %s in %s." % (spec["type"], spec["target_name"], build_file)
            )
        else:
            raise GypError(
                "Missing type field for target %s in %s."
                % (spec["target_name"], build_file)
            )
    return config_type


def _AddConfigurationToMSVSProject(p, spec, config_type, config_name, config):
    """Adds a configuration to the MSVS project.

  Many settings in a vcproj file are specific to a configuration.  This
  function the main part of the vcproj file that's configuration specific.

  Arguments:
    p: The target project being generated.
    spec: The target dictionary containing the properties of the target.
    config_type: The configuration type, a number as defined by Microsoft.
    config_name: The name of the configuration.
    config: The dictionary that defines the special processing to be done
            for this configuration.
  """
    # Get the information for this configuration
    include_dirs, midl_include_dirs, resource_include_dirs = _GetIncludeDirs(config)
    libraries = _GetLibraries(spec)
    library_dirs = _GetLibraryDirs(config)
    out_file, vc_tool, _ = _GetOutputFilePathAndTool(spec, msbuild=False)
    defines = _GetDefines(config)
    defines = [_EscapeCppDefineForMSVS(d) for d in defines]
    disabled_warnings = _GetDisabledWarnings(config)
    prebuild = config.get("msvs_prebuild")
    postbuild = config.get("msvs_postbuild")
    def_file = _GetModuleDefinition(spec)
    precompiled_header = config.get("msvs_precompiled_header")

    # Prepare the list of tools as a dictionary.
    tools = dict()
    # Add in user specified msvs_settings.
    msvs_settings = config.get("msvs_settings", {})
    MSVSSettings.ValidateMSVSSettings(msvs_settings)

    # Prevent default library inheritance from the environment.
    _ToolAppend(tools, "VCLinkerTool", "AdditionalDependencies", ["$(NOINHERIT)"])

    for tool in msvs_settings:
        settings = config["msvs_settings"][tool]
        for setting in settings:
            _ToolAppend(tools, tool, setting, settings[setting])
    # Add the information to the appropriate tool
    _ToolAppend(tools, "VCCLCompilerTool", "AdditionalIncludeDirectories", include_dirs)
    _ToolAppend(tools, "VCMIDLTool", "AdditionalIncludeDirectories", midl_include_dirs)
    _ToolAppend(
        tools,
        "VCResourceCompilerTool",
        "AdditionalIncludeDirectories",
        resource_include_dirs,
    )
    # Add in libraries.
    _ToolAppend(tools, "VCLinkerTool", "AdditionalDependencies", libraries)
    _ToolAppend(tools, "VCLinkerTool", "AdditionalLibraryDirectories", library_dirs)
    if out_file:
        _ToolAppend(tools, vc_tool, "OutputFile", out_file, only_if_unset=True)
    # Add defines.
    _ToolAppend(tools, "VCCLCompilerTool", "PreprocessorDefinitions", defines)
    _ToolAppend(tools, "VCResourceCompilerTool", "PreprocessorDefinitions", defines)
    # Change program database directory to prevent collisions.
    _ToolAppend(
        tools,
        "VCCLCompilerTool",
        "ProgramDataBaseFileName",
        "$(IntDir)$(ProjectName)\\vc80.pdb",
        only_if_unset=True,
    )
    # Add disabled warnings.
    _ToolAppend(tools, "VCCLCompilerTool", "DisableSpecificWarnings", disabled_warnings)
    # Add Pre-build.
    _ToolAppend(tools, "VCPreBuildEventTool", "CommandLine", prebuild)
    # Add Post-build.
    _ToolAppend(tools, "VCPostBuildEventTool", "CommandLine", postbuild)
    # Turn on precompiled headers if appropriate.
    if precompiled_header:
        precompiled_header = os.path.split(precompiled_header)[1]
        _ToolAppend(tools, "VCCLCompilerTool", "UsePrecompiledHeader", "2")
        _ToolAppend(
            tools, "VCCLCompilerTool", "PrecompiledHeaderThrough", precompiled_header
        )
        _ToolAppend(tools, "VCCLCompilerTool", "ForcedIncludeFiles", precompiled_header)
    # Loadable modules don't generate import libraries;
    # tell dependent projects to not expect one.
    if spec["type"] == "loadable_module":
        _ToolAppend(tools, "VCLinkerTool", "IgnoreImportLibrary", "true")
    # Set the module definition file if any.
    if def_file:
        _ToolAppend(tools, "VCLinkerTool", "ModuleDefinitionFile", def_file)

    _AddConfigurationToMSVS(p, spec, tools, config, config_type, config_name)


def _GetIncludeDirs(config):
    """Returns the list of directories to be used for #include directives.

  Arguments:
    config: The dictionary that defines the special processing to be done
            for this configuration.
  Returns:
    The list of directory paths.
  """
    # TODO(bradnelson): include_dirs should really be flexible enough not to
    #                   require this sort of thing.
    include_dirs = config.get("include_dirs", []) + config.get(
        "msvs_system_include_dirs", []
    )
    midl_include_dirs = config.get("midl_include_dirs", []) + config.get(
        "msvs_system_include_dirs", []
    )
    resource_include_dirs = config.get("resource_include_dirs", include_dirs)
    include_dirs = _FixPaths(include_dirs)
    midl_include_dirs = _FixPaths(midl_include_dirs)
    resource_include_dirs = _FixPaths(resource_include_dirs)
    return include_dirs, midl_include_dirs, resource_include_dirs


def _GetLibraryDirs(config):
    """Returns the list of directories to be used for library search paths.

  Arguments:
    config: The dictionary that defines the special processing to be done
            for this configuration.
  Returns:
    The list of directory paths.
  """

    library_dirs = config.get("library_dirs", [])
    library_dirs = _FixPaths(library_dirs)
    return library_dirs


def _GetLibraries(spec):
    """Returns the list of libraries for this configuration.

  Arguments:
    spec: The target dictionary containing the properties of the target.
  Returns:
    The list of directory paths.
  """
    libraries = spec.get("libraries", [])
    # Strip out -l, as it is not used on windows (but is needed so we can pass
    # in libraries that are assumed to be in the default library path).
    # Also remove duplicate entries, leaving only the last duplicate, while
    # preserving order.
    found = OrderedSet()
    unique_libraries_list = []
    for entry in reversed(libraries):
        library = re.sub(r"^\-l", "", entry)
        if not os.path.splitext(library)[1]:
            library += ".lib"
        if library not in found:
            found.add(library)
            unique_libraries_list.append(library)
    unique_libraries_list.reverse()
    return unique_libraries_list


def _GetOutputFilePathAndTool(spec, msbuild):
    """Returns the path and tool to use for this target.

  Figures out the path of the file this spec will create and the name of
  the VC tool that will create it.

  Arguments:
    spec: The target dictionary containing the properties of the target.
  Returns:
    A triple of (file path, name of the vc tool, name of the msbuild tool)
  """
    # Select a name for the output file.
    out_file = ""
    vc_tool = ""
    msbuild_tool = ""
    output_file_map = {
        "executable": ("VCLinkerTool", "Link", "$(OutDir)", ".exe"),
        "shared_library": ("VCLinkerTool", "Link", "$(OutDir)", ".dll"),
        "loadable_module": ("VCLinkerTool", "Link", "$(OutDir)", ".dll"),
        "windows_driver": ("VCLinkerTool", "Link", "$(OutDir)", ".sys"),
        "static_library": ("VCLibrarianTool", "Lib", "$(OutDir)lib\\", ".lib"),
    }
    output_file_props = output_file_map.get(spec["type"])
    if output_file_props and int(spec.get("msvs_auto_output_file", 1)):
        vc_tool, msbuild_tool, out_dir, suffix = output_file_props
        if spec.get("standalone_static_library", 0):
            out_dir = "$(OutDir)"
        out_dir = spec.get("product_dir", out_dir)
        product_extension = spec.get("product_extension")
        if product_extension:
            suffix = "." + product_extension
        elif msbuild:
            suffix = "$(TargetExt)"
        prefix = spec.get("product_prefix", "")
        product_name = spec.get("product_name", "$(ProjectName)")
        out_file = ntpath.join(out_dir, prefix + product_name + suffix)
    return out_file, vc_tool, msbuild_tool


def _GetOutputTargetExt(spec):
    """Returns the extension for this target, including the dot

  If product_extension is specified, set target_extension to this to avoid
  MSB8012, returns None otherwise. Ignores any target_extension settings in
  the input files.

  Arguments:
    spec: The target dictionary containing the properties of the target.
  Returns:
    A string with the extension, or None
  """
    target_extension = spec.get("product_extension")
    if target_extension:
        return "." + target_extension
    return None


def _GetDefines(config):
    """Returns the list of preprocessor definitions for this configuration.

  Arguments:
    config: The dictionary that defines the special processing to be done
            for this configuration.
  Returns:
    The list of preprocessor definitions.
  """
    defines = []
    for d in config.get("defines", []):
        if type(d) == list:
            fd = "=".join([str(dpart) for dpart in d])
        else:
            fd = str(d)
        defines.append(fd)
    return defines


def _GetDisabledWarnings(config):
    return [str(i) for i in config.get("msvs_disabled_warnings", [])]


def _GetModuleDefinition(spec):
    def_file = ""
    if spec["type"] in [
        "shared_library",
        "loadable_module",
        "executable",
        "windows_driver",
    ]:
        def_files = [s for s in spec.get("sources", []) if s.endswith(".def")]
        if len(def_files) == 1:
            def_file = _FixPath(def_files[0])
        elif def_files:
            raise ValueError(
                "Multiple module definition files in one target, target %s lists "
                "multiple .def files: %s" % (spec["target_name"], " ".join(def_files))
            )
    return def_file


def _ConvertToolsToExpectedForm(tools):
    """Convert tools to a form expected by Visual Studio.

  Arguments:
    tools: A dictionary of settings; the tool name is the key.
  Returns:
    A list of Tool objects.
  """
    tool_list = []
    for tool, settings in tools.items():
        # Collapse settings with lists.
        settings_fixed = {}
        for setting, value in settings.items():
            if type(value) == list:
                if (
                    tool == "VCLinkerTool" and setting == "AdditionalDependencies"
                ) or setting == "AdditionalOptions":
                    settings_fixed[setting] = " ".join(value)
                else:
                    settings_fixed[setting] = ";".join(value)
            else:
                settings_fixed[setting] = value
        # Add in this tool.
        tool_list.append(MSVSProject.Tool(tool, settings_fixed))
    return tool_list


def _AddConfigurationToMSVS(p, spec, tools, config, config_type, config_name):
    """Add to the project file the configuration specified by config.

  Arguments:
    p: The target project being generated.
    spec: the target project dict.
    tools: A dictionary of settings; the tool name is the key.
    config: The dictionary that defines the special processing to be done
            for this configuration.
    config_type: The configuration type, a number as defined by Microsoft.
    config_name: The name of the configuration.
  """
    attributes = _GetMSVSAttributes(spec, config, config_type)
    # Add in this configuration.
    tool_list = _ConvertToolsToExpectedForm(tools)
    p.AddConfig(_ConfigFullName(config_name, config), attrs=attributes, tools=tool_list)


def _GetMSVSAttributes(spec, config, config_type):
    # Prepare configuration attributes.
    prepared_attrs = {}
    source_attrs = config.get("msvs_configuration_attributes", {})
    for a in source_attrs:
        prepared_attrs[a] = source_attrs[a]
    # Add props files.
    vsprops_dirs = config.get("msvs_props", [])
    vsprops_dirs = _FixPaths(vsprops_dirs)
    if vsprops_dirs:
        prepared_attrs["InheritedPropertySheets"] = ";".join(vsprops_dirs)
    # Set configuration type.
    prepared_attrs["ConfigurationType"] = config_type
    output_dir = prepared_attrs.get(
        "OutputDirectory", "$(SolutionDir)$(ConfigurationName)"
    )
    prepared_attrs["OutputDirectory"] = _FixPath(output_dir) + "\\"
    if "IntermediateDirectory" not in prepared_attrs:
        intermediate = "$(ConfigurationName)\\obj\\$(ProjectName)"
        prepared_attrs["IntermediateDirectory"] = _FixPath(intermediate) + "\\"
    else:
        intermediate = _FixPath(prepared_attrs["IntermediateDirectory"]) + "\\"
        intermediate = MSVSSettings.FixVCMacroSlashes(intermediate)
        prepared_attrs["IntermediateDirectory"] = intermediate
    return prepared_attrs


def _AddNormalizedSources(sources_set, sources_array):
    sources_set.update(_NormalizedSource(s) for s in sources_array)


def _PrepareListOfSources(spec, generator_flags, gyp_file):
    """Prepare list of sources and excluded sources.

  Besides the sources specified directly in the spec, adds the gyp file so
  that a change to it will cause a re-compile. Also adds appropriate sources
  for actions and copies. Assumes later stage will un-exclude files which
  have custom build steps attached.

  Arguments:
    spec: The target dictionary containing the properties of the target.
    gyp_file: The name of the gyp file.
  Returns:
    A pair of (list of sources, list of excluded sources).
    The sources will be relative to the gyp file.
  """
    sources = OrderedSet()
    _AddNormalizedSources(sources, spec.get("sources", []))
    excluded_sources = OrderedSet()
    # Add in the gyp file.
    if not generator_flags.get("standalone"):
        sources.add(gyp_file)

    # Add in 'action' inputs and outputs.
    for a in spec.get("actions", []):
        inputs = a["inputs"]
        inputs = [_NormalizedSource(i) for i in inputs]
        # Add all inputs to sources and excluded sources.
        inputs = OrderedSet(inputs)
        sources.update(inputs)
        if not spec.get("msvs_external_builder"):
            excluded_sources.update(inputs)
        if int(a.get("process_outputs_as_sources", False)):
            _AddNormalizedSources(sources, a.get("outputs", []))
    # Add in 'copies' inputs and outputs.
    for cpy in spec.get("copies", []):
        _AddNormalizedSources(sources, cpy.get("files", []))
    return (sources, excluded_sources)


def _AdjustSourcesAndConvertToFilterHierarchy(
    spec, options, gyp_dir, sources, excluded_sources, list_excluded, version
):
    """Adjusts the list of sources and excluded sources.

  Also converts the sets to lists.

  Arguments:
    spec: The target dictionary containing the properties of the target.
    options: Global generator options.
    gyp_dir: The path to the gyp file being processed.
    sources: A set of sources to be included for this project.
    excluded_sources: A set of sources to be excluded for this project.
    version: A MSVSVersion object.
  Returns:
    A trio of (list of sources, list of excluded sources,
               path of excluded IDL file)
  """
    # Exclude excluded sources coming into the generator.
    excluded_sources.update(OrderedSet(spec.get("sources_excluded", [])))
    # Add excluded sources into sources for good measure.
    sources.update(excluded_sources)
    # Convert to proper windows form.
    # NOTE: sources goes from being a set to a list here.
    # NOTE: excluded_sources goes from being a set to a list here.
    sources = _FixPaths(sources)
    # Convert to proper windows form.
    excluded_sources = _FixPaths(excluded_sources)

    excluded_idl = _IdlFilesHandledNonNatively(spec, sources)

    precompiled_related = _GetPrecompileRelatedFiles(spec)
    # Find the excluded ones, minus the precompiled header related ones.
    fully_excluded = [i for i in excluded_sources if i not in precompiled_related]

    # Convert to folders and the right slashes.
    sources = [i.split("\\") for i in sources]
    sources = _ConvertSourcesToFilterHierarchy(
        sources,
        excluded=fully_excluded,
        list_excluded=list_excluded,
        msvs_version=version,
    )

    # Prune filters with a single child to flatten ugly directory structures
    # such as ../../src/modules/module1 etc.
    if version.UsesVcxproj():
        while (
            all([isinstance(s, MSVSProject.Filter) for s in sources])
            and len({s.name for s in sources}) == 1
        ):
            assert all([len(s.contents) == 1 for s in sources])
            sources = [s.contents[0] for s in sources]
    else:
        while len(sources) == 1 and isinstance(sources[0], MSVSProject.Filter):
            sources = sources[0].contents

    return sources, excluded_sources, excluded_idl


def _IdlFilesHandledNonNatively(spec, sources):
    # If any non-native rules use 'idl' as an extension exclude idl files.
    # Gather a list here to use later.
    using_idl = False
    for rule in spec.get("rules", []):
        if rule["extension"] == "idl" and int(rule.get("msvs_external_rule", 0)):
            using_idl = True
            break
    if using_idl:
        excluded_idl = [i for i in sources if i.endswith(".idl")]
    else:
        excluded_idl = []
    return excluded_idl


def _GetPrecompileRelatedFiles(spec):
    # Gather a list of precompiled header related sources.
    precompiled_related = []
    for _, config in spec["configurations"].items():
        for k in precomp_keys:
            f = config.get(k)
            if f:
                precompiled_related.append(_FixPath(f))
    return precompiled_related


def _ExcludeFilesFromBeingBuilt(p, spec, excluded_sources, excluded_idl, list_excluded):
    exclusions = _GetExcludedFilesFromBuild(spec, excluded_sources, excluded_idl)
    for file_name, excluded_configs in exclusions.items():
        if not list_excluded and len(excluded_configs) == len(spec["configurations"]):
            # If we're not listing excluded files, then they won't appear in the
            # project, so don't try to configure them to be excluded.
            pass
        else:
            for config_name, config in excluded_configs:
                p.AddFileConfig(
                    file_name,
                    _ConfigFullName(config_name, config),
                    {"ExcludedFromBuild": "true"},
                )


def _GetExcludedFilesFromBuild(spec, excluded_sources, excluded_idl):
    exclusions = {}
    # Exclude excluded sources from being built.
    for f in excluded_sources:
        excluded_configs = []
        for config_name, config in spec["configurations"].items():
            precomped = [_FixPath(config.get(i, "")) for i in precomp_keys]
            # Don't do this for ones that are precompiled header related.
            if f not in precomped:
                excluded_configs.append((config_name, config))
        exclusions[f] = excluded_configs
    # If any non-native rules use 'idl' as an extension exclude idl files.
    # Exclude them now.
    for f in excluded_idl:
        excluded_configs = []
        for config_name, config in spec["configurations"].items():
            excluded_configs.append((config_name, config))
        exclusions[f] = excluded_configs
    return exclusions


def _AddToolFilesToMSVS(p, spec):
    # Add in tool files (rules).
    tool_files = OrderedSet()
    for _, config in spec["configurations"].items():
        for f in config.get("msvs_tool_files", []):
            tool_files.add(f)
    for f in tool_files:
        p.AddToolFile(f)


def _HandlePreCompiledHeaders(p, sources, spec):
    # Pre-compiled header source stubs need a different compiler flag
    # (generate precompiled header) and any source file not of the same
    # kind (i.e. C vs. C++) as the precompiled header source stub needs
    # to have use of precompiled headers disabled.
    extensions_excluded_from_precompile = []
    for config_name, config in spec["configurations"].items():
        source = config.get("msvs_precompiled_source")
        if source:
            source = _FixPath(source)
            # UsePrecompiledHeader=1 for if using precompiled headers.
            tool = MSVSProject.Tool("VCCLCompilerTool", {"UsePrecompiledHeader": "1"})
            p.AddFileConfig(
                source, _ConfigFullName(config_name, config), {}, tools=[tool]
            )
            basename, extension = os.path.splitext(source)
            if extension == ".c":
                extensions_excluded_from_precompile = [".cc", ".cpp", ".cxx"]
            else:
                extensions_excluded_from_precompile = [".c"]

    def DisableForSourceTree(source_tree):
        for source in source_tree:
            if isinstance(source, MSVSProject.Filter):
                DisableForSourceTree(source.contents)
            else:
                basename, extension = os.path.splitext(source)
                if extension in extensions_excluded_from_precompile:
                    for config_name, config in spec["configurations"].items():
                        tool = MSVSProject.Tool(
                            "VCCLCompilerTool",
                            {
                                "UsePrecompiledHeader": "0",
                                "ForcedIncludeFiles": "$(NOINHERIT)",
                            },
                        )
                        p.AddFileConfig(
                            _FixPath(source),
                            _ConfigFullName(config_name, config),
                            {},
                            tools=[tool],
                        )

    # Do nothing if there was no precompiled source.
    if extensions_excluded_from_precompile:
        DisableForSourceTree(sources)


def _AddActions(actions_to_add, spec, relative_path_of_gyp_file):
    # Add actions.
    actions = spec.get("actions", [])
    # Don't setup_env every time. When all the actions are run together in one
    # batch file in VS, the PATH will grow too long.
    # Membership in this set means that the cygwin environment has been set up,
    # and does not need to be set up again.
    have_setup_env = set()
    for a in actions:
        # Attach actions to the gyp file if nothing else is there.
        inputs = a.get("inputs") or [relative_path_of_gyp_file]
        attached_to = inputs[0]
        need_setup_env = attached_to not in have_setup_env
        cmd = _BuildCommandLineForRule(
            spec, a, has_input_path=False, do_setup_env=need_setup_env
        )
        have_setup_env.add(attached_to)
        # Add the action.
        _AddActionStep(
            actions_to_add,
            inputs=inputs,
            outputs=a.get("outputs", []),
            description=a.get("message", a["action_name"]),
            command=cmd,
        )


def _WriteMSVSUserFile(project_path, version, spec):
    # Add run_as and test targets.
    if "run_as" in spec:
        run_as = spec["run_as"]
        action = run_as.get("action", [])
        environment = run_as.get("environment", [])
        working_directory = run_as.get("working_directory", ".")
    elif int(spec.get("test", 0)):
        action = ["$(TargetPath)", "--gtest_print_time"]
        environment = []
        working_directory = "."
    else:
        return  # Nothing to add
    # Write out the user file.
    user_file = _CreateMSVSUserFile(project_path, version, spec)
    for config_name, c_data in spec["configurations"].items():
        user_file.AddDebugSettings(
            _ConfigFullName(config_name, c_data), action, environment, working_directory
        )
    user_file.WriteIfChanged()


def _AddCopies(actions_to_add, spec):
    copies = _GetCopies(spec)
    for inputs, outputs, cmd, description in copies:
        _AddActionStep(
            actions_to_add,
            inputs=inputs,
            outputs=outputs,
            description=description,
            command=cmd,
        )


def _GetCopies(spec):
    copies = []
    # Add copies.
    for cpy in spec.get("copies", []):
        for src in cpy.get("files", []):
            dst = os.path.join(cpy["destination"], os.path.basename(src))
            # _AddCustomBuildToolForMSVS() will call _FixPath() on the inputs and
            # outputs, so do the same for our generated command line.
            if src.endswith("/"):
                src_bare = src[:-1]
                base_dir = posixpath.split(src_bare)[0]
                outer_dir = posixpath.split(src_bare)[1]
                fixed_dst = _FixPath(dst)
                full_dst = f'"{fixed_dst}\\{outer_dir}\\"'
                cmd = 'mkdir {} 2>nul & cd "{}" && xcopy /e /f /y "{}" {}'.format(
                    full_dst,
                    _FixPath(base_dir),
                    outer_dir,
                    full_dst,
                )
                copies.append(
                    (
                        [src],
                        ["dummy_copies", dst],
                        cmd,
                        f"Copying {src} to {fixed_dst}",
                    )
                )
            else:
                fix_dst = _FixPath(cpy["destination"])
                cmd = 'mkdir "{}" 2>nul & set ERRORLEVEL=0 & copy /Y "{}" "{}"'.format(
                    fix_dst,
                    _FixPath(src),
                    _FixPath(dst),
                )
                copies.append(([src], [dst], cmd, f"Copying {src} to {fix_dst}"))
    return copies


def _GetPathDict(root, path):
    # |path| will eventually be empty (in the recursive calls) if it was initially
    # relative; otherwise it will eventually end up as '\', 'D:\', etc.
    if not path or path.endswith(os.sep):
        return root
    parent, folder = os.path.split(path)
    parent_dict = _GetPathDict(root, parent)
    if folder not in parent_dict:
        parent_dict[folder] = dict()
    return parent_dict[folder]


def _DictsToFolders(base_path, bucket, flat):
    # Convert to folders recursively.
    children = []
    for folder, contents in bucket.items():
        if type(contents) == dict:
            folder_children = _DictsToFolders(
                os.path.join(base_path, folder), contents, flat
            )
            if flat:
                children += folder_children
            else:
                folder_children = MSVSNew.MSVSFolder(
                    os.path.join(base_path, folder),
                    name="(" + folder + ")",
                    entries=folder_children,
                )
                children.append(folder_children)
        else:
            children.append(contents)
    return children


def _CollapseSingles(parent, node):
    # Recursively explorer the tree of dicts looking for projects which are
    # the sole item in a folder which has the same name as the project. Bring
    # such projects up one level.
    if type(node) == dict and len(node) == 1 and next(iter(node)) == parent + ".vcproj":
        return node[next(iter(node))]
    if type(node) != dict:
        return node
    for child in node:
        node[child] = _CollapseSingles(child, node[child])
    return node


def _GatherSolutionFolders(sln_projects, project_objects, flat):
    root = {}
    # Convert into a tree of dicts on path.
    for p in sln_projects:
        gyp_file, target = gyp.common.ParseQualifiedTarget(p)[0:2]
        if p.endswith("#host"):
            target += "_host"
        gyp_dir = os.path.dirname(gyp_file)
        path_dict = _GetPathDict(root, gyp_dir)
        path_dict[target + ".vcproj"] = project_objects[p]
    # Walk down from the top until we hit a folder that has more than one entry.
    # In practice, this strips the top-level "src/" dir from the hierarchy in
    # the solution.
    while len(root) == 1 and type(root[next(iter(root))]) == dict:
        root = root[next(iter(root))]
    # Collapse singles.
    root = _CollapseSingles("", root)
    # Merge buckets until everything is a root entry.
    return _DictsToFolders("", root, flat)


def _GetPathOfProject(qualified_target, spec, options, msvs_version):
    default_config = _GetDefaultConfiguration(spec)
    proj_filename = default_config.get("msvs_existing_vcproj")
    if not proj_filename:
        proj_filename = spec["target_name"]
        if spec["toolset"] == "host":
            proj_filename += "_host"
        proj_filename = proj_filename + options.suffix + msvs_version.ProjectExtension()

    build_file = gyp.common.BuildFile(qualified_target)
    proj_path = os.path.join(os.path.dirname(build_file), proj_filename)
    fix_prefix = None
    if options.generator_output:
        project_dir_path = os.path.dirname(os.path.abspath(proj_path))
        proj_path = os.path.join(options.generator_output, proj_path)
        fix_prefix = gyp.common.RelativePath(
            project_dir_path, os.path.dirname(proj_path)
        )
    return proj_path, fix_prefix


def _GetPlatformOverridesOfProject(spec):
    # Prepare a dict indicating which project configurations are used for which
    # solution configurations for this target.
    config_platform_overrides = {}
    for config_name, c in spec["configurations"].items():
        config_fullname = _ConfigFullName(config_name, c)
        platform = c.get("msvs_target_platform", _ConfigPlatform(c))
        fixed_config_fullname = "{}|{}".format(
            _ConfigBaseName(config_name, _ConfigPlatform(c)),
            platform,
        )
        if spec["toolset"] == "host" and generator_supports_multiple_toolsets:
            fixed_config_fullname = f"{config_name}|x64"
        config_platform_overrides[config_fullname] = fixed_config_fullname
    return config_platform_overrides


def _CreateProjectObjects(target_list, target_dicts, options, msvs_version):
    """Create a MSVSProject object for the targets found in target list.

  Arguments:
    target_list: the list of targets to generate project objects for.
    target_dicts: the dictionary of specifications.
    options: global generator options.
    msvs_version: the MSVSVersion object.
  Returns:
    A set of created projects, keyed by target.
  """
    global fixpath_prefix
    # Generate each project.
    projects = {}
    for qualified_target in target_list:
        spec = target_dicts[qualified_target]
        proj_path, fixpath_prefix = _GetPathOfProject(
            qualified_target, spec, options, msvs_version
        )
        guid = _GetGuidOfProject(proj_path, spec)
        overrides = _GetPlatformOverridesOfProject(spec)
        build_file = gyp.common.BuildFile(qualified_target)
        # Create object for this project.
        target_name = spec["target_name"]
        if spec["toolset"] == "host":
            target_name += "_host"
        obj = MSVSNew.MSVSProject(
            proj_path,
            name=target_name,
            guid=guid,
            spec=spec,
            build_file=build_file,
            config_platform_overrides=overrides,
            fixpath_prefix=fixpath_prefix,
        )
        # Set project toolset if any (MS build only)
        if msvs_version.UsesVcxproj():
            obj.set_msbuild_toolset(
                _GetMsbuildToolsetOfProject(proj_path, spec, msvs_version)
            )
        projects[qualified_target] = obj
    # Set all the dependencies, but not if we are using an external builder like
    # ninja
    for project in projects.values():
        if not project.spec.get("msvs_external_builder"):
            deps = project.spec.get("dependencies", [])
            deps = [projects[d] for d in deps]
            project.set_dependencies(deps)
    return projects


def _InitNinjaFlavor(params, target_list, target_dicts):
    """Initialize targets for the ninja flavor.

  This sets up the necessary variables in the targets to generate msvs projects
  that use ninja as an external builder. The variables in the spec are only set
  if they have not been set. This allows individual specs to override the
  default values initialized here.
  Arguments:
    params: Params provided to the generator.
    target_list: List of target pairs: 'base/base.gyp:base'.
    target_dicts: Dict of target properties keyed on target pair.
  """
    for qualified_target in target_list:
        spec = target_dicts[qualified_target]
        if spec.get("msvs_external_builder"):
            # The spec explicitly defined an external builder, so don't change it.
            continue

        path_to_ninja = spec.get("msvs_path_to_ninja", "ninja.exe")

        spec["msvs_external_builder"] = "ninja"
        if not spec.get("msvs_external_builder_out_dir"):
            gyp_file, _, _ = gyp.common.ParseQualifiedTarget(qualified_target)
            gyp_dir = os.path.dirname(gyp_file)
            configuration = "$(Configuration)"
            if params.get("target_arch") == "x64":
                configuration += "_x64"
            if params.get("target_arch") == "arm64":
                configuration += "_arm64"
            spec["msvs_external_builder_out_dir"] = os.path.join(
                gyp.common.RelativePath(params["options"].toplevel_dir, gyp_dir),
                ninja_generator.ComputeOutputDir(params),
                configuration,
            )
        if not spec.get("msvs_external_builder_build_cmd"):
            spec["msvs_external_builder_build_cmd"] = [
                path_to_ninja,
                "-C",
                "$(OutDir)",
                "$(ProjectName)",
            ]
        if not spec.get("msvs_external_builder_clean_cmd"):
            spec["msvs_external_builder_clean_cmd"] = [
                path_to_ninja,
                "-C",
                "$(OutDir)",
                "-tclean",
                "$(ProjectName)",
            ]


def CalculateVariables(default_variables, params):
    """Generated variables that require params to be known."""

    generator_flags = params.get("generator_flags", {})

    # Select project file format version (if unset, default to auto detecting).
    msvs_version = MSVSVersion.SelectVisualStudioVersion(
        generator_flags.get("msvs_version", "auto")
    )
    # Stash msvs_version for later (so we don't have to probe the system twice).
    params["msvs_version"] = msvs_version

    # Set a variable so conditions can be based on msvs_version.
    default_variables["MSVS_VERSION"] = msvs_version.ShortName()

    # To determine processor word size on Windows, in addition to checking
    # PROCESSOR_ARCHITECTURE (which reflects the word size of the current
    # process), it is also necessary to check PROCESSOR_ARCITEW6432 (which
    # contains the actual word size of the system when running thru WOW64).
    if (
        os.environ.get("PROCESSOR_ARCHITECTURE", "").find("64") >= 0
        or os.environ.get("PROCESSOR_ARCHITEW6432", "").find("64") >= 0
    ):
        default_variables["MSVS_OS_BITS"] = 64
    else:
        default_variables["MSVS_OS_BITS"] = 32

    if gyp.common.GetFlavor(params) == "ninja":
        default_variables["SHARED_INTERMEDIATE_DIR"] = "$(OutDir)gen"


def PerformBuild(data, configurations, params):
    options = params["options"]
    msvs_version = params["msvs_version"]
    devenv = os.path.join(msvs_version.path, "Common7", "IDE", "devenv.com")

    for build_file, build_file_dict in data.items():
        (build_file_root, build_file_ext) = os.path.splitext(build_file)
        if build_file_ext != ".gyp":
            continue
        sln_path = build_file_root + options.suffix + ".sln"
        if options.generator_output:
            sln_path = os.path.join(options.generator_output, sln_path)

    for config in configurations:
        arguments = [devenv, sln_path, "/Build", config]
        print(f"Building [{config}]: {arguments}")
        subprocess.check_call(arguments)


def CalculateGeneratorInputInfo(params):
    if params.get("flavor") == "ninja":
        toplevel = params["options"].toplevel_dir
        qualified_out_dir = os.path.normpath(
            os.path.join(
                toplevel,
                ninja_generator.ComputeOutputDir(params),
                "gypfiles-msvs-ninja",
            )
        )

        global generator_filelist_paths
        generator_filelist_paths = {
            "toplevel": toplevel,
            "qualified_out_dir": qualified_out_dir,
        }


def GenerateOutput(target_list, target_dicts, data, params):
    """Generate .sln and .vcproj files.

  This is the entry point for this generator.
  Arguments:
    target_list: List of target pairs: 'base/base.gyp:base'.
    target_dicts: Dict of target properties keyed on target pair.
    data: Dictionary containing per .gyp data.
  """
    global fixpath_prefix

    options = params["options"]

    # Get the project file format version back out of where we stashed it in
    # GeneratorCalculatedVariables.
    msvs_version = params["msvs_version"]

    generator_flags = params.get("generator_flags", {})

    # Optionally shard targets marked with 'msvs_shard': SHARD_COUNT.
    (target_list, target_dicts) = MSVSUtil.ShardTargets(target_list, target_dicts)

    # Optionally use the large PDB workaround for targets marked with
    # 'msvs_large_pdb': 1.
    (target_list, target_dicts) = MSVSUtil.InsertLargePdbShims(
        target_list, target_dicts, generator_default_variables
    )

    # Optionally configure each spec to use ninja as the external builder.
    if params.get("flavor") == "ninja":
        _InitNinjaFlavor(params, target_list, target_dicts)

    # Prepare the set of configurations.
    configs = set()
    for qualified_target in target_list:
        spec = target_dicts[qualified_target]
        for config_name, config in spec["configurations"].items():
            config_name = _ConfigFullName(config_name, config)
            configs.add(config_name)
            if config_name == "Release|arm64":
                configs.add("Release|x64")
    configs = list(configs)

    # Figure out all the projects that will be generated and their guids
    project_objects = _CreateProjectObjects(
        target_list, target_dicts, options, msvs_version
    )

    # Generate each project.
    missing_sources = []
    for project in project_objects.values():
        fixpath_prefix = project.fixpath_prefix
        missing_sources.extend(
            _GenerateProject(project, options, msvs_version, generator_flags, spec)
        )
    fixpath_prefix = None

    for build_file in data:
        # Validate build_file extension
        target_only_configs = configs
        if generator_supports_multiple_toolsets:
            target_only_configs = [i for i in configs if i.endswith("arm64")]
        if not build_file.endswith(".gyp"):
            continue
        sln_path = os.path.splitext(build_file)[0] + options.suffix + ".sln"
        if options.generator_output:
            sln_path = os.path.join(options.generator_output, sln_path)
        # Get projects in the solution, and their dependents.
        sln_projects = gyp.common.BuildFileTargets(target_list, build_file)
        sln_projects += gyp.common.DeepDependencyTargets(target_dicts, sln_projects)
        # Create folder hierarchy.
        root_entries = _GatherSolutionFolders(
            sln_projects, project_objects, flat=msvs_version.FlatSolution()
        )
        # Create solution.
        sln = MSVSNew.MSVSSolution(
            sln_path,
            entries=root_entries,
            variants=target_only_configs,
            websiteProperties=False,
            version=msvs_version,
        )
        sln.Write()

    if missing_sources:
        error_message = "Missing input files:\n" + "\n".join(set(missing_sources))
        if generator_flags.get("msvs_error_on_missing_sources", False):
            raise GypError(error_message)
        else:
            print("Warning: " + error_message, file=sys.stdout)


def _GenerateMSBuildFiltersFile(
    filters_path,
    source_files,
    rule_dependencies,
    extension_to_rule_name,
    platforms,
    toolset,
):
    """Generate the filters file.

  This file is used by Visual Studio to organize the presentation of source
  files into folders.

  Arguments:
      filters_path: The path of the file to be created.
      source_files: The hierarchical structure of all the sources.
      extension_to_rule_name: A dictionary mapping file extensions to rules.
  """
    filter_group = []
    source_group = []
    _AppendFiltersForMSBuild(
        "",
        source_files,
        rule_dependencies,
        extension_to_rule_name,
        platforms,
        toolset,
        filter_group,
        source_group,
    )
    if filter_group:
        content = [
            "Project",
            {
                "ToolsVersion": "4.0",
                "xmlns": "http://schemas.microsoft.com/developer/msbuild/2003",
            },
            ["ItemGroup"] + filter_group,
            ["ItemGroup"] + source_group,
        ]
        easy_xml.WriteXmlIfChanged(content, filters_path, pretty=True, win32=True)
    elif os.path.exists(filters_path):
        # We don't need this filter anymore.  Delete the old filter file.
        os.unlink(filters_path)


def _AppendFiltersForMSBuild(
    parent_filter_name,
    sources,
    rule_dependencies,
    extension_to_rule_name,
    platforms,
    toolset,
    filter_group,
    source_group,
):
    """Creates the list of filters and sources to be added in the filter file.

  Args:
      parent_filter_name: The name of the filter under which the sources are
          found.
      sources: The hierarchy of filters and sources to process.
      extension_to_rule_name: A dictionary mapping file extensions to rules.
      filter_group: The list to which filter entries will be appended.
      source_group: The list to which source entries will be appended.
  """
    for source in sources:
        if isinstance(source, MSVSProject.Filter):
            # We have a sub-filter.  Create the name of that sub-filter.
            if not parent_filter_name:
                filter_name = source.name
            else:
                filter_name = f"{parent_filter_name}\\{source.name}"
            # Add the filter to the group.
            filter_group.append(
                [
                    "Filter",
                    {"Include": filter_name},
                    ["UniqueIdentifier", MSVSNew.MakeGuid(source.name)],
                ]
            )
            # Recurse and add its dependents.
            _AppendFiltersForMSBuild(
                filter_name,
                source.contents,
                rule_dependencies,
                extension_to_rule_name,
                platforms,
                toolset,
                filter_group,
                source_group,
            )
        else:
            # It's a source.  Create a source entry.
            _, element = _MapFileToMsBuildSourceType(
                source, rule_dependencies, extension_to_rule_name, platforms, toolset
            )
            source_entry = [element, {"Include": source}]
            # Specify the filter it is part of, if any.
            if parent_filter_name:
                source_entry.append(["Filter", parent_filter_name])
            source_group.append(source_entry)


def _MapFileToMsBuildSourceType(
    source, rule_dependencies, extension_to_rule_name, platforms, toolset
):
    """Returns the group and element type of the source file.

  Arguments:
      source: The source file name.
      extension_to_rule_name: A dictionary mapping file extensions to rules.

  Returns:
      A pair of (group this file should be part of, the label of element)
  """
    _, ext = os.path.splitext(source)
    ext = ext.lower()
    if ext in extension_to_rule_name:
        group = "rule"
        element = extension_to_rule_name[ext]
    elif ext in [".cc", ".cpp", ".c", ".cxx", ".mm"]:
        group = "compile"
        element = "ClCompile"
    elif ext in [".h", ".hxx"]:
        group = "include"
        element = "ClInclude"
    elif ext == ".rc":
        group = "resource"
        element = "ResourceCompile"
    elif ext in [".s", ".asm"]:
        group = "masm"
        element = "MASM"
        if "arm64" in platforms and toolset == "target":
            element = "MARMASM"
    elif ext == ".idl":
        group = "midl"
        element = "Midl"
    elif source in rule_dependencies:
        group = "rule_dependency"
        element = "CustomBuild"
    else:
        group = "none"
        element = "None"
    return (group, element)


def _GenerateRulesForMSBuild(
    output_dir,
    options,
    spec,
    sources,
    excluded_sources,
    props_files_of_rules,
    targets_files_of_rules,
    actions_to_add,
    rule_dependencies,
    extension_to_rule_name,
):
    # MSBuild rules are implemented using three files: an XML file, a .targets
    # file and a .props file.
    # For more details see:
    # https://devblogs.microsoft.com/cppblog/quick-help-on-vs2010-custom-build-rule/
    rules = spec.get("rules", [])
    rules_native = [r for r in rules if not int(r.get("msvs_external_rule", 0))]
    rules_external = [r for r in rules if int(r.get("msvs_external_rule", 0))]

    msbuild_rules = []
    for rule in rules_native:
        # Skip a rule with no action and no inputs.
        if "action" not in rule and not rule.get("rule_sources", []):
            continue
        msbuild_rule = MSBuildRule(rule, spec)
        msbuild_rules.append(msbuild_rule)
        rule_dependencies.update(msbuild_rule.additional_dependencies.split(";"))
        extension_to_rule_name[msbuild_rule.extension] = msbuild_rule.rule_name
    if msbuild_rules:
        base = spec["target_name"] + options.suffix
        props_name = base + ".props"
        targets_name = base + ".targets"
        xml_name = base + ".xml"

        props_files_of_rules.add(props_name)
        targets_files_of_rules.add(targets_name)

        props_path = os.path.join(output_dir, props_name)
        targets_path = os.path.join(output_dir, targets_name)
        xml_path = os.path.join(output_dir, xml_name)

        _GenerateMSBuildRulePropsFile(props_path, msbuild_rules)
        _GenerateMSBuildRuleTargetsFile(targets_path, msbuild_rules)
        _GenerateMSBuildRuleXmlFile(xml_path, msbuild_rules)

    if rules_external:
        _GenerateExternalRules(
            rules_external, output_dir, spec, sources, options, actions_to_add
        )
    _AdjustSourcesForRules(rules, sources, excluded_sources, True)


class MSBuildRule:
    """Used to store information used to generate an MSBuild rule.

  Attributes:
    rule_name: The rule name, sanitized to use in XML.
    target_name: The name of the target.
    after_targets: The name of the AfterTargets element.
    before_targets: The name of the BeforeTargets element.
    depends_on: The name of the DependsOn element.
    compute_output: The name of the ComputeOutput element.
    dirs_to_make: The name of the DirsToMake element.
    inputs: The name of the _inputs element.
    tlog: The name of the _tlog element.
    extension: The extension this rule applies to.
    description: The message displayed when this rule is invoked.
    additional_dependencies: A string listing additional dependencies.
    outputs: The outputs of this rule.
    command: The command used to run the rule.
  """

    def __init__(self, rule, spec):
        self.display_name = rule["rule_name"]
        # Assure that the rule name is only characters and numbers
        self.rule_name = re.sub(r"\W", "_", self.display_name)
        # Create the various element names, following the example set by the
        # Visual Studio 2008 to 2010 conversion.  I don't know if VS2010
        # is sensitive to the exact names.
        self.target_name = "_" + self.rule_name
        self.after_targets = self.rule_name + "AfterTargets"
        self.before_targets = self.rule_name + "BeforeTargets"
        self.depends_on = self.rule_name + "DependsOn"
        self.compute_output = "Compute%sOutput" % self.rule_name
        self.dirs_to_make = self.rule_name + "DirsToMake"
        self.inputs = self.rule_name + "_inputs"
        self.tlog = self.rule_name + "_tlog"
        self.extension = rule["extension"]
        if not self.extension.startswith("."):
            self.extension = "." + self.extension

        self.description = MSVSSettings.ConvertVCMacrosToMSBuild(
            rule.get("message", self.rule_name)
        )
        old_additional_dependencies = _FixPaths(rule.get("inputs", []))
        self.additional_dependencies = ";".join(
            [
                MSVSSettings.ConvertVCMacrosToMSBuild(i)
                for i in old_additional_dependencies
            ]
        )
        old_outputs = _FixPaths(rule.get("outputs", []))
        self.outputs = ";".join(
            [MSVSSettings.ConvertVCMacrosToMSBuild(i) for i in old_outputs]
        )
        old_command = _BuildCommandLineForRule(
            spec, rule, has_input_path=True, do_setup_env=True
        )
        self.command = MSVSSettings.ConvertVCMacrosToMSBuild(old_command)


def _GenerateMSBuildRulePropsFile(props_path, msbuild_rules):
    """Generate the .props file."""
    content = [
        "Project",
        {"xmlns": "http://schemas.microsoft.com/developer/msbuild/2003"},
    ]
    for rule in msbuild_rules:
        content.extend(
            [
                [
                    "PropertyGroup",
                    {
                        "Condition": "'$(%s)' == '' and '$(%s)' == '' and "
                        "'$(ConfigurationType)' != 'Makefile'"
                        % (rule.before_targets, rule.after_targets)
                    },
                    [rule.before_targets, "Midl"],
                    [rule.after_targets, "CustomBuild"],
                ],
                [
                    "PropertyGroup",
                    [
                        rule.depends_on,
                        {"Condition": "'$(ConfigurationType)' != 'Makefile'"},
                        "_SelectedFiles;$(%s)" % rule.depends_on,
                    ],
                ],
                [
                    "ItemDefinitionGroup",
                    [
                        rule.rule_name,
                        ["CommandLineTemplate", rule.command],
                        ["Outputs", rule.outputs],
                        ["ExecutionDescription", rule.description],
                        ["AdditionalDependencies", rule.additional_dependencies],
                    ],
                ],
            ]
        )
    easy_xml.WriteXmlIfChanged(content, props_path, pretty=True, win32=True)


def _GenerateMSBuildRuleTargetsFile(targets_path, msbuild_rules):
    """Generate the .targets file."""
    content = [
        "Project",
        {"xmlns": "http://schemas.microsoft.com/developer/msbuild/2003"},
    ]
    item_group = [
        "ItemGroup",
        [
            "PropertyPageSchema",
            {"Include": "$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml"},
        ],
    ]
    for rule in msbuild_rules:
        item_group.append(
            [
                "AvailableItemName",
                {"Include": rule.rule_name},
                ["Targets", rule.target_name],
            ]
        )
    content.append(item_group)

    for rule in msbuild_rules:
        content.append(
            [
                "UsingTask",
                {
                    "TaskName": rule.rule_name,
                    "TaskFactory": "XamlTaskFactory",
                    "AssemblyName": "Microsoft.Build.Tasks.v4.0",
                },
                ["Task", "$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml"],
            ]
        )
    for rule in msbuild_rules:
        rule_name = rule.rule_name
        target_outputs = "%%(%s.Outputs)" % rule_name
        target_inputs = (
            "%%(%s.Identity);%%(%s.AdditionalDependencies);" "$(MSBuildProjectFile)"
        ) % (rule_name, rule_name)
        rule_inputs = "%%(%s.Identity)" % rule_name
        extension_condition = (
            "'%(Extension)'=='.obj' or "
            "'%(Extension)'=='.res' or "
            "'%(Extension)'=='.rsc' or "
            "'%(Extension)'=='.lib'"
        )
        remove_section = [
            "ItemGroup",
            {"Condition": "'@(SelectedFiles)' != ''"},
            [
                rule_name,
                {
                    "Remove": "@(%s)" % rule_name,
                    "Condition": "'%(Identity)' != '@(SelectedFiles)'",
                },
            ],
        ]
        inputs_section = [
            "ItemGroup",
            [rule.inputs, {"Include": "%%(%s.AdditionalDependencies)" % rule_name}],
        ]
        logging_section = [
            "ItemGroup",
            [
                rule.tlog,
                {
                    "Include": "%%(%s.Outputs)" % rule_name,
                    "Condition": (
                        "'%%(%s.Outputs)' != '' and "
                        "'%%(%s.ExcludedFromBuild)' != 'true'" % (rule_name, rule_name)
                    ),
                },
                ["Source", "@(%s, '|')" % rule_name],
                ["Inputs", "@(%s -> '%%(Fullpath)', ';')" % rule.inputs],
            ],
        ]
        message_section = [
            "Message",
            {"Importance": "High", "Text": "%%(%s.ExecutionDescription)" % rule_name},
        ]
        write_tlog_section = [
            "WriteLinesToFile",
            {
                "Condition": "'@(%s)' != '' and '%%(%s.ExcludedFromBuild)' != "
                "'true'" % (rule.tlog, rule.tlog),
                "File": "$(IntDir)$(ProjectName).write.1.tlog",
                "Lines": "^%%(%s.Source);@(%s->'%%(Fullpath)')"
                % (rule.tlog, rule.tlog),
            },
        ]
        read_tlog_section = [
            "WriteLinesToFile",
            {
                "Condition": "'@(%s)' != '' and '%%(%s.ExcludedFromBuild)' != "
                "'true'" % (rule.tlog, rule.tlog),
                "File": "$(IntDir)$(ProjectName).read.1.tlog",
                "Lines": f"^%({rule.tlog}.Source);%({rule.tlog}.Inputs)",
            },
        ]
        command_and_input_section = [
            rule_name,
            {
                "Condition": "'@(%s)' != '' and '%%(%s.ExcludedFromBuild)' != "
                "'true'" % (rule_name, rule_name),
                "EchoOff": "true",
                "StandardOutputImportance": "High",
                "StandardErrorImportance": "High",
                "CommandLineTemplate": "%%(%s.CommandLineTemplate)" % rule_name,
                "AdditionalOptions": "%%(%s.AdditionalOptions)" % rule_name,
                "Inputs": rule_inputs,
            },
        ]
        content.extend(
            [
                [
                    "Target",
                    {
                        "Name": rule.target_name,
                        "BeforeTargets": "$(%s)" % rule.before_targets,
                        "AfterTargets": "$(%s)" % rule.after_targets,
                        "Condition": "'@(%s)' != ''" % rule_name,
                        "DependsOnTargets": "$(%s);%s"
                        % (rule.depends_on, rule.compute_output),
                        "Outputs": target_outputs,
                        "Inputs": target_inputs,
                    },
                    remove_section,
                    inputs_section,
                    logging_section,
                    message_section,
                    write_tlog_section,
                    read_tlog_section,
                    command_and_input_section,
                ],
                [
                    "PropertyGroup",
                    [
                        "ComputeLinkInputsTargets",
                        "$(ComputeLinkInputsTargets);",
                        "%s;" % rule.compute_output,
                    ],
                    [
                        "ComputeLibInputsTargets",
                        "$(ComputeLibInputsTargets);",
                        "%s;" % rule.compute_output,
                    ],
                ],
                [
                    "Target",
                    {
                        "Name": rule.compute_output,
                        "Condition": "'@(%s)' != ''" % rule_name,
                    },
                    [
                        "ItemGroup",
                        [
                            rule.dirs_to_make,
                            {
                                "Condition": "'@(%s)' != '' and "
                                "'%%(%s.ExcludedFromBuild)' != 'true'"
                                % (rule_name, rule_name),
                                "Include": "%%(%s.Outputs)" % rule_name,
                            },
                        ],
                        [
                            "Link",
                            {
                                "Include": "%%(%s.Identity)" % rule.dirs_to_make,
                                "Condition": extension_condition,
                            },
                        ],
                        [
                            "Lib",
                            {
                                "Include": "%%(%s.Identity)" % rule.dirs_to_make,
                                "Condition": extension_condition,
                            },
                        ],
                        [
                            "ImpLib",
                            {
                                "Include": "%%(%s.Identity)" % rule.dirs_to_make,
                                "Condition": extension_condition,
                            },
                        ],
                    ],
                    [
                        "MakeDir",
                        {
                            "Directories": (
                                "@(%s->'%%(RootDir)%%(Directory)')" % rule.dirs_to_make
                            )
                        },
                    ],
                ],
            ]
        )
    easy_xml.WriteXmlIfChanged(content, targets_path, pretty=True, win32=True)


def _GenerateMSBuildRuleXmlFile(xml_path, msbuild_rules):
    # Generate the .xml file
    content = [
        "ProjectSchemaDefinitions",
        {
            "xmlns": (
                "clr-namespace:Microsoft.Build.Framework.XamlTypes;"
                "assembly=Microsoft.Build.Framework"
            ),
            "xmlns:x": "http://schemas.microsoft.com/winfx/2006/xaml",
            "xmlns:sys": "clr-namespace:System;assembly=mscorlib",
            "xmlns:transformCallback": "Microsoft.Cpp.Dev10.ConvertPropertyCallback",
        },
    ]
    for rule in msbuild_rules:
        content.extend(
            [
                [
                    "Rule",
                    {
                        "Name": rule.rule_name,
                        "PageTemplate": "tool",
                        "DisplayName": rule.display_name,
                        "Order": "200",
                    },
                    [
                        "Rule.DataSource",
                        [
                            "DataSource",
                            {"Persistence": "ProjectFile", "ItemType": rule.rule_name},
                        ],
                    ],
                    [
                        "Rule.Categories",
                        [
                            "Category",
                            {"Name": "General"},
                            ["Category.DisplayName", ["sys:String", "General"]],
                        ],
                        [
                            "Category",
                            {"Name": "Command Line", "Subtype": "CommandLine"},
                            ["Category.DisplayName", ["sys:String", "Command Line"]],
                        ],
                    ],
                    [
                        "StringListProperty",
                        {
                            "Name": "Inputs",
                            "Category": "Command Line",
                            "IsRequired": "true",
                            "Switch": " ",
                        },
                        [
                            "StringListProperty.DataSource",
                            [
                                "DataSource",
                                {
                                    "Persistence": "ProjectFile",
                                    "ItemType": rule.rule_name,
                                    "SourceType": "Item",
                                },
                            ],
                        ],
                    ],
                    [
                        "StringProperty",
                        {
                            "Name": "CommandLineTemplate",
                            "DisplayName": "Command Line",
                            "Visible": "False",
                            "IncludeInCommandLine": "False",
                        },
                    ],
                    [
                        "DynamicEnumProperty",
                        {
                            "Name": rule.before_targets,
                            "Category": "General",
                            "EnumProvider": "Targets",
                            "IncludeInCommandLine": "False",
                        },
                        [
                            "DynamicEnumProperty.DisplayName",
                            ["sys:String", "Execute Before"],
                        ],
                        [
                            "DynamicEnumProperty.Description",
                            [
                                "sys:String",
                                "Specifies the targets for the build customization"
                                " to run before.",
                            ],
                        ],
                        [
                            "DynamicEnumProperty.ProviderSettings",
                            [
                                "NameValuePair",
                                {
                                    "Name": "Exclude",
                                    "Value": "^%s|^Compute" % rule.before_targets,
                                },
                            ],
                        ],
                        [
                            "DynamicEnumProperty.DataSource",
                            [
                                "DataSource",
                                {
                                    "Persistence": "ProjectFile",
                                    "HasConfigurationCondition": "true",
                                },
                            ],
                        ],
                    ],
                    [
                        "DynamicEnumProperty",
                        {
                            "Name": rule.after_targets,
                            "Category": "General",
                            "EnumProvider": "Targets",
                            "IncludeInCommandLine": "False",
                        },
                        [
                            "DynamicEnumProperty.DisplayName",
                            ["sys:String", "Execute After"],
                        ],
                        [
                            "DynamicEnumProperty.Description",
                            [
                                "sys:String",
                                (
                                    "Specifies the targets for the build customization"
                                    " to run after."
                                ),
                            ],
                        ],
                        [
                            "DynamicEnumProperty.ProviderSettings",
                            [
                                "NameValuePair",
                                {
                                    "Name": "Exclude",
                                    "Value": "^%s|^Compute" % rule.after_targets,
                                },
                            ],
                        ],
                        [
                            "DynamicEnumProperty.DataSource",
                            [
                                "DataSource",
                                {
                                    "Persistence": "ProjectFile",
                                    "ItemType": "",
                                    "HasConfigurationCondition": "true",
                                },
                            ],
                        ],
                    ],
                    [
                        "StringListProperty",
                        {
                            "Name": "Outputs",
                            "DisplayName": "Outputs",
                            "Visible": "False",
                            "IncludeInCommandLine": "False",
                        },
                    ],
                    [
                        "StringProperty",
                        {
                            "Name": "ExecutionDescription",
                            "DisplayName": "Execution Description",
                            "Visible": "False",
                            "IncludeInCommandLine": "False",
                        },
                    ],
                    [
                        "StringListProperty",
                        {
                            "Name": "AdditionalDependencies",
                            "DisplayName": "Additional Dependencies",
                            "IncludeInCommandLine": "False",
                            "Visible": "false",
                        },
                    ],
                    [
                        "StringProperty",
                        {
                            "Subtype": "AdditionalOptions",
                            "Name": "AdditionalOptions",
                            "Category": "Command Line",
                        },
                        [
                            "StringProperty.DisplayName",
                            ["sys:String", "Additional Options"],
                        ],
                        [
                            "StringProperty.Description",
                            ["sys:String", "Additional Options"],
                        ],
                    ],
                ],
                [
                    "ItemType",
                    {"Name": rule.rule_name, "DisplayName": rule.display_name},
                ],
                [
                    "FileExtension",
                    {"Name": "*" + rule.extension, "ContentType": rule.rule_name},
                ],
                [
                    "ContentType",
                    {
                        "Name": rule.rule_name,
                        "DisplayName": "",
                        "ItemType": rule.rule_name,
                    },
                ],
            ]
        )
    easy_xml.WriteXmlIfChanged(content, xml_path, pretty=True, win32=True)


def _GetConfigurationAndPlatform(name, settings, spec):
    configuration = name.rsplit("_", 1)[0]
    platform = settings.get("msvs_configuration_platform", "Win32")
    if spec["toolset"] == "host" and platform == "arm64":
        platform = "x64"  # Host-only tools are always built for x64
    return (configuration, platform)


def _GetConfigurationCondition(name, settings, spec):
    return r"'$(Configuration)|$(Platform)'=='%s|%s'" % _GetConfigurationAndPlatform(
        name, settings, spec
    )


def _GetMSBuildProjectConfigurations(configurations, spec):
    group = ["ItemGroup", {"Label": "ProjectConfigurations"}]
    for (name, settings) in sorted(configurations.items()):
        configuration, platform = _GetConfigurationAndPlatform(name, settings, spec)
        designation = f"{configuration}|{platform}"
        group.append(
            [
                "ProjectConfiguration",
                {"Include": designation},
                ["Configuration", configuration],
                ["Platform", platform],
            ]
        )
    return [group]


def _GetMSBuildGlobalProperties(spec, version, guid, gyp_file_name):
    namespace = os.path.splitext(gyp_file_name)[0]
    properties = [
        [
            "PropertyGroup",
            {"Label": "Globals"},
            ["ProjectGuid", guid],
            ["Keyword", "Win32Proj"],
            ["RootNamespace", namespace],
            ["IgnoreWarnCompileDuplicatedFilename", "true"],
        ]
    ]

    if (
        os.environ.get("PROCESSOR_ARCHITECTURE") == "AMD64"
        or os.environ.get("PROCESSOR_ARCHITEW6432") == "AMD64"
    ):
        properties[0].append(["PreferredToolArchitecture", "x64"])

    if spec.get("msvs_target_platform_version"):
        target_platform_version = spec.get("msvs_target_platform_version")
        properties[0].append(["WindowsTargetPlatformVersion", target_platform_version])
        if spec.get("msvs_target_platform_minversion"):
            target_platform_minversion = spec.get("msvs_target_platform_minversion")
            properties[0].append(
                ["WindowsTargetPlatformMinVersion", target_platform_minversion]
            )
        else:
            properties[0].append(
                ["WindowsTargetPlatformMinVersion", target_platform_version]
            )

    if spec.get("msvs_enable_winrt"):
        properties[0].append(["DefaultLanguage", "en-US"])
        properties[0].append(["AppContainerApplication", "true"])
        if spec.get("msvs_application_type_revision"):
            app_type_revision = spec.get("msvs_application_type_revision")
            properties[0].append(["ApplicationTypeRevision", app_type_revision])
        else:
            properties[0].append(["ApplicationTypeRevision", "8.1"])
        if spec.get("msvs_enable_winphone"):
            properties[0].append(["ApplicationType", "Windows Phone"])
        else:
            properties[0].append(["ApplicationType", "Windows Store"])

    platform_name = None
    msvs_windows_sdk_version = None
    for configuration in spec["configurations"].values():
        platform_name = platform_name or _ConfigPlatform(configuration)
        msvs_windows_sdk_version = (
            msvs_windows_sdk_version
            or _ConfigWindowsTargetPlatformVersion(configuration, version)
        )
        if platform_name and msvs_windows_sdk_version:
            break
    if msvs_windows_sdk_version:
        properties[0].append(
            ["WindowsTargetPlatformVersion", str(msvs_windows_sdk_version)]
        )
    elif version.compatible_sdks:
        raise GypError(
            "%s requires any SDK of %s version, but none were found"
            % (version.description, version.compatible_sdks)
        )

    if platform_name == "ARM":
        properties[0].append(["WindowsSDKDesktopARMSupport", "true"])

    return properties


def _GetMSBuildConfigurationDetails(spec, build_file):
    properties = {}
    for name, settings in spec["configurations"].items():
        msbuild_attributes = _GetMSBuildAttributes(spec, settings, build_file)
        condition = _GetConfigurationCondition(name, settings, spec)
        character_set = msbuild_attributes.get("CharacterSet")
        config_type = msbuild_attributes.get("ConfigurationType")
        _AddConditionalProperty(properties, condition, "ConfigurationType", config_type)
        if config_type == "Driver":
            _AddConditionalProperty(properties, condition, "DriverType", "WDM")
            _AddConditionalProperty(
                properties, condition, "TargetVersion", _ConfigTargetVersion(settings)
            )
        if character_set:
            if "msvs_enable_winrt" not in spec:
                _AddConditionalProperty(
                    properties, condition, "CharacterSet", character_set
                )
    return _GetMSBuildPropertyGroup(spec, "Configuration", properties)


def _GetMSBuildLocalProperties(msbuild_toolset):
    # Currently the only local property we support is PlatformToolset
    properties = {}
    if msbuild_toolset:
        properties = [
            [
                "PropertyGroup",
                {"Label": "Locals"},
                ["PlatformToolset", msbuild_toolset],
            ]
        ]
    return properties


def _GetMSBuildPropertySheets(configurations, spec):
    user_props = r"$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props"
    additional_props = {}
    props_specified = False
    for name, settings in sorted(configurations.items()):
        configuration = _GetConfigurationCondition(name, settings, spec)
        if "msbuild_props" in settings:
            additional_props[configuration] = _FixPaths(settings["msbuild_props"])
            props_specified = True
        else:
            additional_props[configuration] = ""

    if not props_specified:
        return [
            [
                "ImportGroup",
                {"Label": "PropertySheets"},
                [
                    "Import",
                    {
                        "Project": user_props,
                        "Condition": "exists('%s')" % user_props,
                        "Label": "LocalAppDataPlatform",
                    },
                ],
            ]
        ]
    else:
        sheets = []
        for condition, props in additional_props.items():
            import_group = [
                "ImportGroup",
                {"Label": "PropertySheets", "Condition": condition},
                [
                    "Import",
                    {
                        "Project": user_props,
                        "Condition": "exists('%s')" % user_props,
                        "Label": "LocalAppDataPlatform",
                    },
                ],
            ]
            for props_file in props:
                import_group.append(["Import", {"Project": props_file}])
            sheets.append(import_group)
        return sheets


def _ConvertMSVSBuildAttributes(spec, config, build_file):
    config_type = _GetMSVSConfigurationType(spec, build_file)
    msvs_attributes = _GetMSVSAttributes(spec, config, config_type)
    msbuild_attributes = {}
    for a in msvs_attributes:
        if a in ["IntermediateDirectory", "OutputDirectory"]:
            directory = MSVSSettings.ConvertVCMacrosToMSBuild(msvs_attributes[a])
            if not directory.endswith("\\"):
                directory += "\\"
            msbuild_attributes[a] = directory
        elif a == "CharacterSet":
            msbuild_attributes[a] = _ConvertMSVSCharacterSet(msvs_attributes[a])
        elif a == "ConfigurationType":
            msbuild_attributes[a] = _ConvertMSVSConfigurationType(msvs_attributes[a])
        else:
            print("Warning: Do not know how to convert MSVS attribute " + a)
    return msbuild_attributes


def _ConvertMSVSCharacterSet(char_set):
    if char_set.isdigit():
        char_set = {"0": "MultiByte", "1": "Unicode", "2": "MultiByte"}[char_set]
    return char_set


def _ConvertMSVSConfigurationType(config_type):
    if config_type.isdigit():
        config_type = {
            "1": "Application",
            "2": "DynamicLibrary",
            "4": "StaticLibrary",
            "5": "Driver",
            "10": "Utility",
        }[config_type]
    return config_type


def _GetMSBuildAttributes(spec, config, build_file):
    if "msbuild_configuration_attributes" not in config:
        msbuild_attributes = _ConvertMSVSBuildAttributes(spec, config, build_file)

    else:
        config_type = _GetMSVSConfigurationType(spec, build_file)
        config_type = _ConvertMSVSConfigurationType(config_type)
        msbuild_attributes = config.get("msbuild_configuration_attributes", {})
        msbuild_attributes.setdefault("ConfigurationType", config_type)
        output_dir = msbuild_attributes.get(
            "OutputDirectory", "$(SolutionDir)$(Configuration)"
        )
        msbuild_attributes["OutputDirectory"] = _FixPath(output_dir) + "\\"
        if "IntermediateDirectory" not in msbuild_attributes:
            intermediate = _FixPath("$(Configuration)") + "\\"
            msbuild_attributes["IntermediateDirectory"] = intermediate
        if "CharacterSet" in msbuild_attributes:
            msbuild_attributes["CharacterSet"] = _ConvertMSVSCharacterSet(
                msbuild_attributes["CharacterSet"]
            )
    if "TargetName" not in msbuild_attributes:
        prefix = spec.get("product_prefix", "")
        product_name = spec.get("product_name", "$(ProjectName)")
        target_name = prefix + product_name
        msbuild_attributes["TargetName"] = target_name
    if "TargetExt" not in msbuild_attributes and "product_extension" in spec:
        ext = spec.get("product_extension")
        msbuild_attributes["TargetExt"] = "." + ext

    if spec.get("msvs_external_builder"):
        external_out_dir = spec.get("msvs_external_builder_out_dir", ".")
        msbuild_attributes["OutputDirectory"] = _FixPath(external_out_dir) + "\\"

    # Make sure that 'TargetPath' matches 'Lib.OutputFile' or 'Link.OutputFile'
    # (depending on the tool used) to avoid MSB8012 warning.
    msbuild_tool_map = {
        "executable": "Link",
        "shared_library": "Link",
        "loadable_module": "Link",
        "windows_driver": "Link",
        "static_library": "Lib",
    }
    msbuild_tool = msbuild_tool_map.get(spec["type"])
    if msbuild_tool:
        msbuild_settings = config["finalized_msbuild_settings"]
        out_file = msbuild_settings[msbuild_tool].get("OutputFile")
        if out_file:
            msbuild_attributes["TargetPath"] = _FixPath(out_file)
        target_ext = msbuild_settings[msbuild_tool].get("TargetExt")
        if target_ext:
            msbuild_attributes["TargetExt"] = target_ext

    return msbuild_attributes


def _GetMSBuildConfigurationGlobalProperties(spec, configurations, build_file):
    # TODO(jeanluc) We could optimize out the following and do it only if
    # there are actions.
    # TODO(jeanluc) Handle the equivalent of setting 'CYGWIN=nontsec'.
    new_paths = []
    cygwin_dirs = spec.get("msvs_cygwin_dirs", ["."])[0]
    if cygwin_dirs:
        cyg_path = "$(MSBuildProjectDirectory)\\%s\\bin\\" % _FixPath(cygwin_dirs)
        new_paths.append(cyg_path)
        # TODO(jeanluc) Change the convention to have both a cygwin_dir and a
        # python_dir.
        python_path = cyg_path.replace("cygwin\\bin", "python_26")
        new_paths.append(python_path)
        if new_paths:
            new_paths = "$(ExecutablePath);" + ";".join(new_paths)

    properties = {}
    for (name, configuration) in sorted(configurations.items()):
        condition = _GetConfigurationCondition(name, configuration, spec)
        attributes = _GetMSBuildAttributes(spec, configuration, build_file)
        msbuild_settings = configuration["finalized_msbuild_settings"]
        _AddConditionalProperty(
            properties, condition, "IntDir", attributes["IntermediateDirectory"]
        )
        _AddConditionalProperty(
            properties, condition, "OutDir", attributes["OutputDirectory"]
        )
        _AddConditionalProperty(
            properties, condition, "TargetName", attributes["TargetName"]
        )
        if "TargetExt" in attributes:
            _AddConditionalProperty(
                properties, condition, "TargetExt", attributes["TargetExt"]
            )

        if attributes.get("TargetPath"):
            _AddConditionalProperty(
                properties, condition, "TargetPath", attributes["TargetPath"]
            )
        if attributes.get("TargetExt"):
            _AddConditionalProperty(
                properties, condition, "TargetExt", attributes["TargetExt"]
            )

        if new_paths:
            _AddConditionalProperty(properties, condition, "ExecutablePath", new_paths)
        tool_settings = msbuild_settings.get("", {})
        for name, value in sorted(tool_settings.items()):
            formatted_value = _GetValueFormattedForMSBuild("", name, value)
            _AddConditionalProperty(properties, condition, name, formatted_value)
    return _GetMSBuildPropertyGroup(spec, None, properties)


def _AddConditionalProperty(properties, condition, name, value):
    """Adds a property / conditional value pair to a dictionary.

  Arguments:
    properties: The dictionary to be modified.  The key is the name of the
        property.  The value is itself a dictionary; its key is the value and
        the value a list of condition for which this value is true.
    condition: The condition under which the named property has the value.
    name: The name of the property.
    value: The value of the property.
  """
    if name not in properties:
        properties[name] = {}
    values = properties[name]
    if value not in values:
        values[value] = []
    conditions = values[value]
    conditions.append(condition)


# Regex for msvs variable references ( i.e. $(FOO) ).
MSVS_VARIABLE_REFERENCE = re.compile(r"\$\(([a-zA-Z_][a-zA-Z0-9_]*)\)")


def _GetMSBuildPropertyGroup(spec, label, properties):
    """Returns a PropertyGroup definition for the specified properties.

  Arguments:
    spec: The target project dict.
    label: An optional label for the PropertyGroup.
    properties: The dictionary to be converted.  The key is the name of the
        property.  The value is itself a dictionary; its key is the value and
        the value a list of condition for which this value is true.
  """
    group = ["PropertyGroup"]
    if label:
        group.append({"Label": label})
    num_configurations = len(spec["configurations"])

    def GetEdges(node):
        # Use a definition of edges such that user_of_variable -> used_varible.
        # This happens to be easier in this case, since a variable's
        # definition contains all variables it references in a single string.
        edges = set()
        for value in sorted(properties[node].keys()):
            # Add to edges all $(...) references to variables.
            #
            # Variable references that refer to names not in properties are excluded
            # These can exist for instance to refer built in definitions like
            # $(SolutionDir).
            #
            # Self references are ignored. Self reference is used in a few places to
            # append to the default value. I.e. PATH=$(PATH);other_path
            edges.update(
                {
                    v
                    for v in MSVS_VARIABLE_REFERENCE.findall(value)
                    if v in properties and v != node
                }
            )
        return edges

    properties_ordered = gyp.common.TopologicallySorted(properties.keys(), GetEdges)
    # Walk properties in the reverse of a topological sort on
    # user_of_variable -> used_variable as this ensures variables are
    # defined before they are used.
    # NOTE: reverse(topsort(DAG)) = topsort(reverse_edges(DAG))
    for name in reversed(properties_ordered):
        values = properties[name]
        for value, conditions in sorted(values.items()):
            if len(conditions) == num_configurations:
                # If the value is the same all configurations,
                # just add one unconditional entry.
                group.append([name, value])
            else:
                for condition in conditions:
                    group.append([name, {"Condition": condition}, value])
    return [group]


def _GetMSBuildToolSettingsSections(spec, configurations):
    groups = []
    for (name, configuration) in sorted(configurations.items()):
        msbuild_settings = configuration["finalized_msbuild_settings"]
        group = [
            "ItemDefinitionGroup",
            {"Condition": _GetConfigurationCondition(name, configuration, spec)},
        ]
        for tool_name, tool_settings in sorted(msbuild_settings.items()):
            # Skip the tool named '' which is a holder of global settings handled
            # by _GetMSBuildConfigurationGlobalProperties.
            if tool_name:
                if tool_settings:
                    tool = [tool_name]
                    for name, value in sorted(tool_settings.items()):
                        formatted_value = _GetValueFormattedForMSBuild(
                            tool_name, name, value
                        )
                        tool.append([name, formatted_value])
                    group.append(tool)
        groups.append(group)
    return groups


def _FinalizeMSBuildSettings(spec, configuration):
    if "msbuild_settings" in configuration:
        converted = False
        msbuild_settings = configuration["msbuild_settings"]
        MSVSSettings.ValidateMSBuildSettings(msbuild_settings)
    else:
        converted = True
        msvs_settings = configuration.get("msvs_settings", {})
        msbuild_settings = MSVSSettings.ConvertToMSBuildSettings(msvs_settings)
    include_dirs, midl_include_dirs, resource_include_dirs = _GetIncludeDirs(
        configuration
    )
    libraries = _GetLibraries(spec)
    library_dirs = _GetLibraryDirs(configuration)
    out_file, _, msbuild_tool = _GetOutputFilePathAndTool(spec, msbuild=True)
    target_ext = _GetOutputTargetExt(spec)
    defines = _GetDefines(configuration)
    if converted:
        # Visual Studio 2010 has TR1
        defines = [d for d in defines if d != "_HAS_TR1=0"]
        # Warn of ignored settings
        ignored_settings = ["msvs_tool_files"]
        for ignored_setting in ignored_settings:
            value = configuration.get(ignored_setting)
            if value:
                print(
                    "Warning: The automatic conversion to MSBuild does not handle "
                    "%s.  Ignoring setting of %s" % (ignored_setting, str(value))
                )

    defines = [_EscapeCppDefineForMSBuild(d) for d in defines]
    disabled_warnings = _GetDisabledWarnings(configuration)
    prebuild = configuration.get("msvs_prebuild")
    postbuild = configuration.get("msvs_postbuild")
    def_file = _GetModuleDefinition(spec)
    precompiled_header = configuration.get("msvs_precompiled_header")

    # Add the information to the appropriate tool
    # TODO(jeanluc) We could optimize and generate these settings only if
    # the corresponding files are found, e.g. don't generate ResourceCompile
    # if you don't have any resources.
    _ToolAppend(
        msbuild_settings, "ClCompile", "AdditionalIncludeDirectories", include_dirs
    )
    _ToolAppend(
        msbuild_settings, "Midl", "AdditionalIncludeDirectories", midl_include_dirs
    )
    _ToolAppend(
        msbuild_settings,
        "ResourceCompile",
        "AdditionalIncludeDirectories",
        resource_include_dirs,
    )
    # Add in libraries, note that even for empty libraries, we want this
    # set, to prevent inheriting default libraries from the environment.
    _ToolSetOrAppend(msbuild_settings, "Link", "AdditionalDependencies", libraries)
    _ToolAppend(msbuild_settings, "Link", "AdditionalLibraryDirectories", library_dirs)
    if out_file:
        _ToolAppend(
            msbuild_settings, msbuild_tool, "OutputFile", out_file, only_if_unset=True
        )
    if target_ext:
        _ToolAppend(
            msbuild_settings, msbuild_tool, "TargetExt", target_ext, only_if_unset=True
        )
    # Add defines.
    _ToolAppend(msbuild_settings, "ClCompile", "PreprocessorDefinitions", defines)
    _ToolAppend(msbuild_settings, "ResourceCompile", "PreprocessorDefinitions", defines)
    # Add disabled warnings.
    _ToolAppend(
        msbuild_settings, "ClCompile", "DisableSpecificWarnings", disabled_warnings
    )
    # Turn on precompiled headers if appropriate.
    if precompiled_header:
        precompiled_header = os.path.split(precompiled_header)[1]
        _ToolAppend(msbuild_settings, "ClCompile", "PrecompiledHeader", "Use")
        _ToolAppend(
            msbuild_settings, "ClCompile", "PrecompiledHeaderFile", precompiled_header
        )
        _ToolAppend(
            msbuild_settings, "ClCompile", "ForcedIncludeFiles", [precompiled_header]
        )
    else:
        _ToolAppend(msbuild_settings, "ClCompile", "PrecompiledHeader", "NotUsing")
    # Turn off WinRT compilation
    _ToolAppend(msbuild_settings, "ClCompile", "CompileAsWinRT", "false")
    # Turn on import libraries if appropriate
    if spec.get("msvs_requires_importlibrary"):
        _ToolAppend(msbuild_settings, "", "IgnoreImportLibrary", "false")
    # Loadable modules don't generate import libraries;
    # tell dependent projects to not expect one.
    if spec["type"] == "loadable_module":
        _ToolAppend(msbuild_settings, "", "IgnoreImportLibrary", "true")
    # Set the module definition file if any.
    if def_file:
        _ToolAppend(msbuild_settings, "Link", "ModuleDefinitionFile", def_file)
    configuration["finalized_msbuild_settings"] = msbuild_settings
    if prebuild:
        _ToolAppend(msbuild_settings, "PreBuildEvent", "Command", prebuild)
    if postbuild:
        _ToolAppend(msbuild_settings, "PostBuildEvent", "Command", postbuild)


def _GetValueFormattedForMSBuild(tool_name, name, value):
    if type(value) == list:
        # For some settings, VS2010 does not automatically extends the settings
        # TODO(jeanluc) Is this what we want?
        if name in [
            "AdditionalIncludeDirectories",
            "AdditionalLibraryDirectories",
            "AdditionalOptions",
            "DelayLoadDLLs",
            "DisableSpecificWarnings",
            "PreprocessorDefinitions",
        ]:
            value.append("%%(%s)" % name)
        # For most tools, entries in a list should be separated with ';' but some
        # settings use a space.  Check for those first.
        exceptions = {
            "ClCompile": ["AdditionalOptions"],
            "Link": ["AdditionalOptions"],
            "Lib": ["AdditionalOptions"],
        }
        if tool_name in exceptions and name in exceptions[tool_name]:
            char = " "
        else:
            char = ";"
        formatted_value = char.join(
            [MSVSSettings.ConvertVCMacrosToMSBuild(i) for i in value]
        )
    else:
        formatted_value = MSVSSettings.ConvertVCMacrosToMSBuild(value)
    return formatted_value


def _VerifySourcesExist(sources, root_dir):
    """Verifies that all source files exist on disk.

  Checks that all regular source files, i.e. not created at run time,
  exist on disk.  Missing files cause needless recompilation but no otherwise
  visible errors.

  Arguments:
    sources: A recursive list of Filter/file names.
    root_dir: The root directory for the relative path names.
  Returns:
    A list of source files that cannot be found on disk.
  """
    missing_sources = []
    for source in sources:
        if isinstance(source, MSVSProject.Filter):
            missing_sources.extend(_VerifySourcesExist(source.contents, root_dir))
        else:
            if "$" not in source:
                full_path = os.path.join(root_dir, source)
                if not os.path.exists(full_path):
                    missing_sources.append(full_path)
    return missing_sources


def _GetMSBuildSources(
    spec,
    sources,
    exclusions,
    rule_dependencies,
    extension_to_rule_name,
    actions_spec,
    sources_handled_by_action,
    list_excluded,
):
    groups = [
        "none",
        "masm",
        "midl",
        "include",
        "compile",
        "resource",
        "rule",
        "rule_dependency",
    ]
    grouped_sources = {}
    for g in groups:
        grouped_sources[g] = []

    _AddSources2(
        spec,
        sources,
        exclusions,
        grouped_sources,
        rule_dependencies,
        extension_to_rule_name,
        sources_handled_by_action,
        list_excluded,
    )
    sources = []
    for g in groups:
        if grouped_sources[g]:
            sources.append(["ItemGroup"] + grouped_sources[g])
    if actions_spec:
        sources.append(["ItemGroup"] + actions_spec)
    return sources


def _AddSources2(
    spec,
    sources,
    exclusions,
    grouped_sources,
    rule_dependencies,
    extension_to_rule_name,
    sources_handled_by_action,
    list_excluded,
):
    extensions_excluded_from_precompile = []
    for source in sources:
        if isinstance(source, MSVSProject.Filter):
            _AddSources2(
                spec,
                source.contents,
                exclusions,
                grouped_sources,
                rule_dependencies,
                extension_to_rule_name,
                sources_handled_by_action,
                list_excluded,
            )
        else:
            if source not in sources_handled_by_action:
                detail = []
                excluded_configurations = exclusions.get(source, [])
                if len(excluded_configurations) == len(spec["configurations"]):
                    detail.append(["ExcludedFromBuild", "true"])
                else:
                    for config_name, configuration in sorted(excluded_configurations):
                        condition = _GetConfigurationCondition(
                            config_name, configuration
                        )
                        detail.append(
                            ["ExcludedFromBuild", {"Condition": condition}, "true"]
                        )
                # Add precompile if needed
                for config_name, configuration in spec["configurations"].items():
                    precompiled_source = configuration.get(
                        "msvs_precompiled_source", ""
                    )
                    if precompiled_source != "":
                        precompiled_source = _FixPath(precompiled_source)
                        if not extensions_excluded_from_precompile:
                            # If the precompiled header is generated by a C source,
                            # we must not try to use it for C++ sources,
                            # and vice versa.
                            basename, extension = os.path.splitext(precompiled_source)
                            if extension == ".c":
                                extensions_excluded_from_precompile = [
                                    ".cc",
                                    ".cpp",
                                    ".cxx",
                                ]
                            else:
                                extensions_excluded_from_precompile = [".c"]

                    if precompiled_source == source:
                        condition = _GetConfigurationCondition(
                            config_name, configuration, spec
                        )
                        detail.append(
                            ["PrecompiledHeader", {"Condition": condition}, "Create"]
                        )
                    else:
                        # Turn off precompiled header usage for source files of a
                        # different type than the file that generated the
                        # precompiled header.
                        for extension in extensions_excluded_from_precompile:
                            if source.endswith(extension):
                                detail.append(["PrecompiledHeader", ""])
                                detail.append(["ForcedIncludeFiles", ""])

                group, element = _MapFileToMsBuildSourceType(
                    source,
                    rule_dependencies,
                    extension_to_rule_name,
                    _GetUniquePlatforms(spec),
                    spec["toolset"],
                )
                if group == "compile" and not os.path.isabs(source):
                    # Add an <ObjectFileName> value to support duplicate source
                    # file basenames, except for absolute paths to avoid paths
                    # with more than 260 characters.
                    file_name = os.path.splitext(source)[0] + ".obj"
                    if file_name.startswith("..\\"):
                        file_name = re.sub(r"^(\.\.\\)+", "", file_name)
                    elif file_name.startswith("$("):
                        file_name = re.sub(r"^\$\([^)]+\)\\", "", file_name)
                    detail.append(["ObjectFileName", "$(IntDir)\\" + file_name])
                grouped_sources[group].append([element, {"Include": source}] + detail)


def _GetMSBuildProjectReferences(project):
    references = []
    if project.dependencies:
        group = ["ItemGroup"]
        added_dependency_set = set()
        for dependency in project.dependencies:
            dependency_spec = dependency.spec
            should_skip_dep = False
            if project.spec["toolset"] == "target":
                if dependency_spec["toolset"] == "host":
                    if dependency_spec["type"] == "static_library":
                        should_skip_dep = True
            if dependency.name.startswith("run_"):
                should_skip_dep = False
            if should_skip_dep:
                continue

            canonical_name = dependency.name.replace("_host", "")
            added_dependency_set.add(canonical_name)
            guid = dependency.guid
            project_dir = os.path.split(project.path)[0]
            relative_path = gyp.common.RelativePath(dependency.path, project_dir)
            project_ref = [
                "ProjectReference",
                {"Include": relative_path},
                ["Project", guid],
                ["ReferenceOutputAssembly", "false"],
            ]
            for config in dependency.spec.get("configurations", {}).values():
                if config.get("msvs_use_library_dependency_inputs", 0):
                    project_ref.append(["UseLibraryDependencyInputs", "true"])
                    break
                # If it's disabled in any config, turn it off in the reference.
                if config.get("msvs_2010_disable_uldi_when_referenced", 0):
                    project_ref.append(["UseLibraryDependencyInputs", "false"])
                    break
            group.append(project_ref)
        references.append(group)
    return references


def _GenerateMSBuildProject(project, options, version, generator_flags, spec):
    spec = project.spec
    configurations = spec["configurations"]
    toolset = spec["toolset"]
    project_dir, project_file_name = os.path.split(project.path)
    gyp.common.EnsureDirExists(project.path)
    # Prepare list of sources and excluded sources.

    gyp_file = os.path.split(project.build_file)[1]
    sources, excluded_sources = _PrepareListOfSources(spec, generator_flags, gyp_file)
    # Add rules.
    actions_to_add = {}
    props_files_of_rules = set()
    targets_files_of_rules = set()
    rule_dependencies = set()
    extension_to_rule_name = {}
    list_excluded = generator_flags.get("msvs_list_excluded_files", True)
    platforms = _GetUniquePlatforms(spec)

    # Don't generate rules if we are using an external builder like ninja.
    if not spec.get("msvs_external_builder"):
        _GenerateRulesForMSBuild(
            project_dir,
            options,
            spec,
            sources,
            excluded_sources,
            props_files_of_rules,
            targets_files_of_rules,
            actions_to_add,
            rule_dependencies,
            extension_to_rule_name,
        )
    else:
        rules = spec.get("rules", [])
        _AdjustSourcesForRules(rules, sources, excluded_sources, True)

    sources, excluded_sources, excluded_idl = _AdjustSourcesAndConvertToFilterHierarchy(
        spec, options, project_dir, sources, excluded_sources, list_excluded, version
    )

    # Don't add actions if we are using an external builder like ninja.
    if not spec.get("msvs_external_builder"):
        _AddActions(actions_to_add, spec, project.build_file)
        _AddCopies(actions_to_add, spec)

        # NOTE: this stanza must appear after all actions have been decided.
        # Don't excluded sources with actions attached, or they won't run.
        excluded_sources = _FilterActionsFromExcluded(excluded_sources, actions_to_add)

    exclusions = _GetExcludedFilesFromBuild(spec, excluded_sources, excluded_idl)
    actions_spec, sources_handled_by_action = _GenerateActionsForMSBuild(
        spec, actions_to_add
    )

    _GenerateMSBuildFiltersFile(
        project.path + ".filters",
        sources,
        rule_dependencies,
        extension_to_rule_name,
        platforms,
        toolset,
    )
    missing_sources = _VerifySourcesExist(sources, project_dir)

    for configuration in configurations.values():
        _FinalizeMSBuildSettings(spec, configuration)

    # Add attributes to root element

    import_default_section = [
        ["Import", {"Project": r"$(VCTargetsPath)\Microsoft.Cpp.Default.props"}]
    ]
    import_cpp_props_section = [
        ["Import", {"Project": r"$(VCTargetsPath)\Microsoft.Cpp.props"}]
    ]
    import_cpp_targets_section = [
        ["Import", {"Project": r"$(VCTargetsPath)\Microsoft.Cpp.targets"}]
    ]
    import_masm_props_section = [
        ["Import", {"Project": r"$(VCTargetsPath)\BuildCustomizations\masm.props"}]
    ]
    import_masm_targets_section = [
        ["Import", {"Project": r"$(VCTargetsPath)\BuildCustomizations\masm.targets"}]
    ]
    import_marmasm_props_section = [
        ["Import", {"Project": r"$(VCTargetsPath)\BuildCustomizations\marmasm.props"}]
    ]
    import_marmasm_targets_section = [
        ["Import", {"Project": r"$(VCTargetsPath)\BuildCustomizations\marmasm.targets"}]
    ]
    macro_section = [["PropertyGroup", {"Label": "UserMacros"}]]

    content = [
        "Project",
        {
            "xmlns": "http://schemas.microsoft.com/developer/msbuild/2003",
            "ToolsVersion": version.ProjectVersion(),
            "DefaultTargets": "Build",
        },
    ]

    content += _GetMSBuildProjectConfigurations(configurations, spec)
    content += _GetMSBuildGlobalProperties(
        spec, version, project.guid, project_file_name
    )
    content += import_default_section
    content += _GetMSBuildConfigurationDetails(spec, project.build_file)
    if spec.get("msvs_enable_winphone"):
        content += _GetMSBuildLocalProperties("v120_wp81")
    else:
        content += _GetMSBuildLocalProperties(project.msbuild_toolset)
    content += import_cpp_props_section
    content += import_masm_props_section
    if "arm64" in platforms and toolset == "target":
        content += import_marmasm_props_section
    content += _GetMSBuildExtensions(props_files_of_rules)
    content += _GetMSBuildPropertySheets(configurations, spec)
    content += macro_section
    content += _GetMSBuildConfigurationGlobalProperties(
        spec, configurations, project.build_file
    )
    content += _GetMSBuildToolSettingsSections(spec, configurations)
    content += _GetMSBuildSources(
        spec,
        sources,
        exclusions,
        rule_dependencies,
        extension_to_rule_name,
        actions_spec,
        sources_handled_by_action,
        list_excluded,
    )
    content += _GetMSBuildProjectReferences(project)
    content += import_cpp_targets_section
    content += import_masm_targets_section
    if "arm64" in platforms and toolset == "target":
        content += import_marmasm_targets_section
    content += _GetMSBuildExtensionTargets(targets_files_of_rules)

    if spec.get("msvs_external_builder"):
        content += _GetMSBuildExternalBuilderTargets(spec)

    # TODO(jeanluc) File a bug to get rid of runas.  We had in MSVS:
    # has_run_as = _WriteMSVSUserFile(project.path, version, spec)

    easy_xml.WriteXmlIfChanged(content, project.path, pretty=True, win32=True)

    return missing_sources


def _GetMSBuildExternalBuilderTargets(spec):
    """Return a list of MSBuild targets for external builders.

  The "Build" and "Clean" targets are always generated.  If the spec contains
  'msvs_external_builder_clcompile_cmd', then the "ClCompile" target will also
  be generated, to support building selected C/C++ files.

  Arguments:
    spec: The gyp target spec.
  Returns:
    List of MSBuild 'Target' specs.
  """
    build_cmd = _BuildCommandLineForRuleRaw(
        spec, spec["msvs_external_builder_build_cmd"], False, False, False, False
    )
    build_target = ["Target", {"Name": "Build"}]
    build_target.append(["Exec", {"Command": build_cmd}])

    clean_cmd = _BuildCommandLineForRuleRaw(
        spec, spec["msvs_external_builder_clean_cmd"], False, False, False, False
    )
    clean_target = ["Target", {"Name": "Clean"}]
    clean_target.append(["Exec", {"Command": clean_cmd}])

    targets = [build_target, clean_target]

    if spec.get("msvs_external_builder_clcompile_cmd"):
        clcompile_cmd = _BuildCommandLineForRuleRaw(
            spec,
            spec["msvs_external_builder_clcompile_cmd"],
            False,
            False,
            False,
            False,
        )
        clcompile_target = ["Target", {"Name": "ClCompile"}]
        clcompile_target.append(["Exec", {"Command": clcompile_cmd}])
        targets.append(clcompile_target)

    return targets


def _GetMSBuildExtensions(props_files_of_rules):
    extensions = ["ImportGroup", {"Label": "ExtensionSettings"}]
    for props_file in props_files_of_rules:
        extensions.append(["Import", {"Project": props_file}])
    return [extensions]


def _GetMSBuildExtensionTargets(targets_files_of_rules):
    targets_node = ["ImportGroup", {"Label": "ExtensionTargets"}]
    for targets_file in sorted(targets_files_of_rules):
        targets_node.append(["Import", {"Project": targets_file}])
    return [targets_node]


def _GenerateActionsForMSBuild(spec, actions_to_add):
    """Add actions accumulated into an actions_to_add, merging as needed.

  Arguments:
    spec: the target project dict
    actions_to_add: dictionary keyed on input name, which maps to a list of
        dicts describing the actions attached to that input file.

  Returns:
    A pair of (action specification, the sources handled by this action).
  """
    sources_handled_by_action = OrderedSet()
    actions_spec = []
    for primary_input, actions in actions_to_add.items():
        if generator_supports_multiple_toolsets:
            primary_input = primary_input.replace(".exe", "_host.exe")
        inputs = OrderedSet()
        outputs = OrderedSet()
        descriptions = []
        commands = []
        for action in actions:

            def fixup_host_exe(i):
                if "$(OutDir)" in i:
                    i = i.replace(".exe", "_host.exe")
                return i

            if generator_supports_multiple_toolsets:
                action["inputs"] = [fixup_host_exe(i) for i in action["inputs"]]
            inputs.update(OrderedSet(action["inputs"]))
            outputs.update(OrderedSet(action["outputs"]))
            descriptions.append(action["description"])
            cmd = action["command"]
            if generator_supports_multiple_toolsets:
                cmd = cmd.replace(".exe", "_host.exe")
            # For most actions, add 'call' so that actions that invoke batch files
            # return and continue executing.  msbuild_use_call provides a way to
            # disable this but I have not seen any adverse effect from doing that
            # for everything.
            if action.get("msbuild_use_call", True):
                cmd = "call " + cmd
            commands.append(cmd)
        # Add the custom build action for one input file.
        description = ", and also ".join(descriptions)

        # We can't join the commands simply with && because the command line will
        # get too long. See also _AddActions: cygwin's setup_env mustn't be called
        # for every invocation or the command that sets the PATH will grow too
        # long.
        command = "\r\n".join(
            [c + "\r\nif %errorlevel% neq 0 exit /b %errorlevel%" for c in commands]
        )
        _AddMSBuildAction(
            spec,
            primary_input,
            inputs,
            outputs,
            command,
            description,
            sources_handled_by_action,
            actions_spec,
        )
    return actions_spec, sources_handled_by_action


def _AddMSBuildAction(
    spec,
    primary_input,
    inputs,
    outputs,
    cmd,
    description,
    sources_handled_by_action,
    actions_spec,
):
    command = MSVSSettings.ConvertVCMacrosToMSBuild(cmd)
    primary_input = _FixPath(primary_input)
    inputs_array = _FixPaths(inputs)
    outputs_array = _FixPaths(outputs)
    additional_inputs = ";".join([i for i in inputs_array if i != primary_input])
    outputs = ";".join(outputs_array)
    sources_handled_by_action.add(primary_input)
    action_spec = ["CustomBuild", {"Include": primary_input}]
    action_spec.extend(
        # TODO(jeanluc) 'Document' for all or just if as_sources?
        [
            ["FileType", "Document"],
            ["Command", command],
            ["Message", description],
            ["Outputs", outputs],
        ]
    )
    if additional_inputs:
        action_spec.append(["AdditionalInputs", additional_inputs])
    actions_spec.append(action_spec)
#!/usr/bin/env python3
# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

""" Unit tests for the msvs.py file. """

import gyp.generator.msvs as msvs
import unittest

from io import StringIO


class TestSequenceFunctions(unittest.TestCase):
    def setUp(self):
        self.stderr = StringIO()

    def test_GetLibraries(self):
        self.assertEqual(msvs._GetLibraries({}), [])
        self.assertEqual(msvs._GetLibraries({"libraries": []}), [])
        self.assertEqual(
            msvs._GetLibraries({"other": "foo", "libraries": ["a.lib"]}), ["a.lib"]
        )
        self.assertEqual(msvs._GetLibraries({"libraries": ["-la"]}), ["a.lib"])
        self.assertEqual(
            msvs._GetLibraries(
                {
                    "libraries": [
                        "a.lib",
                        "b.lib",
                        "c.lib",
                        "-lb.lib",
                        "-lb.lib",
                        "d.lib",
                        "a.lib",
                    ]
                }
            ),
            ["c.lib", "b.lib", "d.lib", "a.lib"],
        )


if __name__ == "__main__":
    unittest.main()
# Copyright (c) 2013 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.


import collections
import copy
import hashlib
import json
import multiprocessing
import os.path
import re
import signal
import subprocess
import sys
import gyp
import gyp.common
import gyp.msvs_emulation
import gyp.MSVSUtil as MSVSUtil
import gyp.xcode_emulation

from io import StringIO

from gyp.common import GetEnvironFallback
import gyp.ninja_syntax as ninja_syntax

generator_default_variables = {
    "EXECUTABLE_PREFIX": "",
    "EXECUTABLE_SUFFIX": "",
    "STATIC_LIB_PREFIX": "lib",
    "STATIC_LIB_SUFFIX": ".a",
    "SHARED_LIB_PREFIX": "lib",
    # Gyp expects the following variables to be expandable by the build
    # system to the appropriate locations.  Ninja prefers paths to be
    # known at gyp time.  To resolve this, introduce special
    # variables starting with $! and $| (which begin with a $ so gyp knows it
    # should be treated specially, but is otherwise an invalid
    # ninja/shell variable) that are passed to gyp here but expanded
    # before writing out into the target .ninja files; see
    # ExpandSpecial.
    # $! is used for variables that represent a path and that can only appear at
    # the start of a string, while $| is used for variables that can appear
    # anywhere in a string.
    "INTERMEDIATE_DIR": "$!INTERMEDIATE_DIR",
    "SHARED_INTERMEDIATE_DIR": "$!PRODUCT_DIR/gen",
    "PRODUCT_DIR": "$!PRODUCT_DIR",
    "CONFIGURATION_NAME": "$|CONFIGURATION_NAME",
    # Special variables that may be used by gyp 'rule' targets.
    # We generate definitions for these variables on the fly when processing a
    # rule.
    "RULE_INPUT_ROOT": "${root}",
    "RULE_INPUT_DIRNAME": "${dirname}",
    "RULE_INPUT_PATH": "${source}",
    "RULE_INPUT_EXT": "${ext}",
    "RULE_INPUT_NAME": "${name}",
}

# Placates pylint.
generator_additional_non_configuration_keys = []
generator_additional_path_sections = []
generator_extra_sources_for_rules = []
generator_filelist_paths = None

generator_supports_multiple_toolsets = gyp.common.CrossCompileRequested()


def StripPrefix(arg, prefix):
    if arg.startswith(prefix):
        return arg[len(prefix) :]
    return arg


def QuoteShellArgument(arg, flavor):
    """Quote a string such that it will be interpreted as a single argument
    by the shell."""
    # Rather than attempting to enumerate the bad shell characters, just
    # allow common OK ones and quote anything else.
    if re.match(r"^[a-zA-Z0-9_=.\\/-]+$", arg):
        return arg  # No quoting necessary.
    if flavor == "win":
        return gyp.msvs_emulation.QuoteForRspFile(arg)
    return "'" + arg.replace("'", "'" + '"\'"' + "'") + "'"


def Define(d, flavor):
    """Takes a preprocessor define and returns a -D parameter that's ninja- and
    shell-escaped."""
    if flavor == "win":
        # cl.exe replaces literal # characters with = in preprocessor definitions for
        # some reason. Octal-encode to work around that.
        d = d.replace("#", "\\%03o" % ord("#"))
    return QuoteShellArgument(ninja_syntax.escape("-D" + d), flavor)


def AddArch(output, arch):
    """Adds an arch string to an output path."""
    output, extension = os.path.splitext(output)
    return f"{output}.{arch}{extension}"


class Target:
    """Target represents the paths used within a single gyp target.

    Conceptually, building a single target A is a series of steps:

    1) actions/rules/copies  generates source/resources/etc.
    2) compiles              generates .o files
    3) link                  generates a binary (library/executable)
    4) bundle                merges the above in a mac bundle

    (Any of these steps can be optional.)

    From a build ordering perspective, a dependent target B could just
    depend on the last output of this series of steps.

    But some dependent commands sometimes need to reach inside the box.
    For example, when linking B it needs to get the path to the static
    library generated by A.

    This object stores those paths.  To keep things simple, member
    variables only store concrete paths to single files, while methods
    compute derived values like "the last output of the target".
    """

    def __init__(self, type):
        # Gyp type ("static_library", etc.) of this target.
        self.type = type
        # File representing whether any input dependencies necessary for
        # dependent actions have completed.
        self.preaction_stamp = None
        # File representing whether any input dependencies necessary for
        # dependent compiles have completed.
        self.precompile_stamp = None
        # File representing the completion of actions/rules/copies, if any.
        self.actions_stamp = None
        # Path to the output of the link step, if any.
        self.binary = None
        # Path to the file representing the completion of building the bundle,
        # if any.
        self.bundle = None
        # On Windows, incremental linking requires linking against all the .objs
        # that compose a .lib (rather than the .lib itself). That list is stored
        # here. In this case, we also need to save the compile_deps for the target,
        # so that the target that directly depends on the .objs can also depend
        # on those.
        self.component_objs = None
        self.compile_deps = None
        # Windows only. The import .lib is the output of a build step, but
        # because dependents only link against the lib (not both the lib and the
        # dll) we keep track of the import library here.
        self.import_lib = None
        # Track if this target contains any C++ files, to decide if gcc or g++
        # should be used for linking.
        self.uses_cpp = False

    def Linkable(self):
        """Return true if this is a target that can be linked against."""
        return self.type in ("static_library", "shared_library")

    def UsesToc(self, flavor):
        """Return true if the target should produce a restat rule based on a TOC
        file."""
        # For bundles, the .TOC should be produced for the binary, not for
        # FinalOutput(). But the naive approach would put the TOC file into the
        # bundle, so don't do this for bundles for now.
        if flavor == "win" or self.bundle:
            return False
        return self.type in ("shared_library", "loadable_module")

    def PreActionInput(self, flavor):
        """Return the path, if any, that should be used as a dependency of
        any dependent action step."""
        if self.UsesToc(flavor):
            return self.FinalOutput() + ".TOC"
        return self.FinalOutput() or self.preaction_stamp

    def PreCompileInput(self):
        """Return the path, if any, that should be used as a dependency of
        any dependent compile step."""
        return self.actions_stamp or self.precompile_stamp

    def FinalOutput(self):
        """Return the last output of the target, which depends on all prior
        steps."""
        return self.bundle or self.binary or self.actions_stamp


# A small discourse on paths as used within the Ninja build:
# All files we produce (both at gyp and at build time) appear in the
# build directory (e.g. out/Debug).
#
# Paths within a given .gyp file are always relative to the directory
# containing the .gyp file.  Call these "gyp paths".  This includes
# sources as well as the starting directory a given gyp rule/action
# expects to be run from.  We call the path from the source root to
# the gyp file the "base directory" within the per-.gyp-file
# NinjaWriter code.
#
# All paths as written into the .ninja files are relative to the build
# directory.  Call these paths "ninja paths".
#
# We translate between these two notions of paths with two helper
# functions:
#
# - GypPathToNinja translates a gyp path (i.e. relative to the .gyp file)
#   into the equivalent ninja path.
#
# - GypPathToUniqueOutput translates a gyp path into a ninja path to write
#   an output file; the result can be namespaced such that it is unique
#   to the input file name as well as the output target name.


class NinjaWriter:
    def __init__(
        self,
        hash_for_rules,
        target_outputs,
        base_dir,
        build_dir,
        output_file,
        toplevel_build,
        output_file_name,
        flavor,
        toplevel_dir=None,
    ):
        """
        base_dir: path from source root to directory containing this gyp file,
                  by gyp semantics, all input paths are relative to this
        build_dir: path from source root to build output
        toplevel_dir: path to the toplevel directory
        """

        self.hash_for_rules = hash_for_rules
        self.target_outputs = target_outputs
        self.base_dir = base_dir
        self.build_dir = build_dir
        self.ninja = ninja_syntax.Writer(output_file)
        self.toplevel_build = toplevel_build
        self.output_file_name = output_file_name

        self.flavor = flavor
        self.abs_build_dir = None
        if toplevel_dir is not None:
            self.abs_build_dir = os.path.abspath(os.path.join(toplevel_dir, build_dir))
        self.obj_ext = ".obj" if flavor == "win" else ".o"
        if flavor == "win":
            # See docstring of msvs_emulation.GenerateEnvironmentFiles().
            self.win_env = {}
            for arch in ("x86", "x64"):
                self.win_env[arch] = "environment." + arch

        # Relative path from build output dir to base dir.
        build_to_top = gyp.common.InvertRelativePath(build_dir, toplevel_dir)
        self.build_to_base = os.path.join(build_to_top, base_dir)
        # Relative path from base dir to build dir.
        base_to_top = gyp.common.InvertRelativePath(base_dir, toplevel_dir)
        self.base_to_build = os.path.join(base_to_top, build_dir)

    def ExpandSpecial(self, path, product_dir=None):
        """Expand specials like $!PRODUCT_DIR in |path|.

        If |product_dir| is None, assumes the cwd is already the product
        dir.  Otherwise, |product_dir| is the relative path to the product
        dir.
        """

        PRODUCT_DIR = "$!PRODUCT_DIR"
        if PRODUCT_DIR in path:
            if product_dir:
                path = path.replace(PRODUCT_DIR, product_dir)
            else:
                path = path.replace(PRODUCT_DIR + "/", "")
                path = path.replace(PRODUCT_DIR + "\\", "")
                path = path.replace(PRODUCT_DIR, ".")

        INTERMEDIATE_DIR = "$!INTERMEDIATE_DIR"
        if INTERMEDIATE_DIR in path:
            int_dir = self.GypPathToUniqueOutput("gen")
            # GypPathToUniqueOutput generates a path relative to the product dir,
            # so insert product_dir in front if it is provided.
            path = path.replace(
                INTERMEDIATE_DIR, os.path.join(product_dir or "", int_dir)
            )

        CONFIGURATION_NAME = "$|CONFIGURATION_NAME"
        path = path.replace(CONFIGURATION_NAME, self.config_name)

        return path

    def ExpandRuleVariables(self, path, root, dirname, source, ext, name):
        if self.flavor == "win":
            path = self.msvs_settings.ConvertVSMacros(path, config=self.config_name)
        path = path.replace(generator_default_variables["RULE_INPUT_ROOT"], root)
        path = path.replace(generator_default_variables["RULE_INPUT_DIRNAME"], dirname)
        path = path.replace(generator_default_variables["RULE_INPUT_PATH"], source)
        path = path.replace(generator_default_variables["RULE_INPUT_EXT"], ext)
        path = path.replace(generator_default_variables["RULE_INPUT_NAME"], name)
        return path

    def GypPathToNinja(self, path, env=None):
        """Translate a gyp path to a ninja path, optionally expanding environment
        variable references in |path| with |env|.

        See the above discourse on path conversions."""
        if env:
            if self.flavor == "mac":
                path = gyp.xcode_emulation.ExpandEnvVars(path, env)
            elif self.flavor == "win":
                path = gyp.msvs_emulation.ExpandMacros(path, env)
        if path.startswith("$!"):
            expanded = self.ExpandSpecial(path)
            if self.flavor == "win":
                expanded = os.path.normpath(expanded)
            return expanded
        if "$|" in path:
            path = self.ExpandSpecial(path)
        assert "$" not in path, path
        return os.path.normpath(os.path.join(self.build_to_base, path))

    def GypPathToUniqueOutput(self, path, qualified=True):
        """Translate a gyp path to a ninja path for writing output.

        If qualified is True, qualify the resulting filename with the name
        of the target.  This is necessary when e.g. compiling the same
        path twice for two separate output targets.

        See the above discourse on path conversions."""

        path = self.ExpandSpecial(path)
        assert not path.startswith("$"), path

        # Translate the path following this scheme:
        #   Input: foo/bar.gyp, target targ, references baz/out.o
        #   Output: obj/foo/baz/targ.out.o (if qualified)
        #           obj/foo/baz/out.o (otherwise)
        #     (and obj.host instead of obj for cross-compiles)
        #
        # Why this scheme and not some other one?
        # 1) for a given input, you can compute all derived outputs by matching
        #    its path, even if the input is brought via a gyp file with '..'.
        # 2) simple files like libraries and stamps have a simple filename.

        obj = "obj"
        if self.toolset != "target":
            obj += "." + self.toolset

        path_dir, path_basename = os.path.split(path)
        assert not os.path.isabs(path_dir), (
            "'%s' can not be absolute path (see crbug.com/462153)." % path_dir
        )

        if qualified:
            path_basename = self.name + "." + path_basename
        return os.path.normpath(
            os.path.join(obj, self.base_dir, path_dir, path_basename)
        )

    def WriteCollapsedDependencies(self, name, targets, order_only=None):
        """Given a list of targets, return a path for a single file
        representing the result of building all the targets or None.

        Uses a stamp file if necessary."""

        assert targets == [item for item in targets if item], targets
        if len(targets) == 0:
            assert not order_only
            return None
        if len(targets) > 1 or order_only:
            stamp = self.GypPathToUniqueOutput(name + ".stamp")
            targets = self.ninja.build(stamp, "stamp", targets, order_only=order_only)
            self.ninja.newline()
        return targets[0]

    def _SubninjaNameForArch(self, arch):
        output_file_base = os.path.splitext(self.output_file_name)[0]
        return f"{output_file_base}.{arch}.ninja"

    def WriteSpec(self, spec, config_name, generator_flags):
        """The main entry point for NinjaWriter: write the build rules for a spec.

        Returns a Target object, which represents the output paths for this spec.
        Returns None if there are no outputs (e.g. a settings-only 'none' type
        target)."""

        self.config_name = config_name
        self.name = spec["target_name"]
        self.toolset = spec["toolset"]
        config = spec["configurations"][config_name]
        self.target = Target(spec["type"])
        self.is_standalone_static_library = bool(
            spec.get("standalone_static_library", 0)
        )

        self.target_rpath = generator_flags.get("target_rpath", r"\$$ORIGIN/lib/")

        self.is_mac_bundle = gyp.xcode_emulation.IsMacBundle(self.flavor, spec)
        self.xcode_settings = self.msvs_settings = None
        if self.flavor == "mac":
            self.xcode_settings = gyp.xcode_emulation.XcodeSettings(spec)
            mac_toolchain_dir = generator_flags.get("mac_toolchain_dir", None)
            if mac_toolchain_dir:
                self.xcode_settings.mac_toolchain_dir = mac_toolchain_dir

        if self.flavor == "win":
            self.msvs_settings = gyp.msvs_emulation.MsvsSettings(spec, generator_flags)
            arch = self.msvs_settings.GetArch(config_name)
            self.ninja.variable("arch", self.win_env[arch])
            self.ninja.variable("cc", "$cl_" + arch)
            self.ninja.variable("cxx", "$cl_" + arch)
            self.ninja.variable("cc_host", "$cl_" + arch)
            self.ninja.variable("cxx_host", "$cl_" + arch)
            self.ninja.variable("asm", "$ml_" + arch)

        if self.flavor == "mac":
            self.archs = self.xcode_settings.GetActiveArchs(config_name)
            if len(self.archs) > 1:
                self.arch_subninjas = {
                    arch: ninja_syntax.Writer(
                        OpenOutput(
                            os.path.join(
                                self.toplevel_build, self._SubninjaNameForArch(arch)
                            ),
                            "w",
                        )
                    )
                    for arch in self.archs
                }

        # Compute predepends for all rules.
        # actions_depends is the dependencies this target depends on before running
        # any of its action/rule/copy steps.
        # compile_depends is the dependencies this target depends on before running
        # any of its compile steps.
        actions_depends = []
        compile_depends = []
        # TODO(evan): it is rather confusing which things are lists and which
        # are strings.  Fix these.
        if "dependencies" in spec:
            for dep in spec["dependencies"]:
                if dep in self.target_outputs:
                    target = self.target_outputs[dep]
                    actions_depends.append(target.PreActionInput(self.flavor))
                    compile_depends.append(target.PreCompileInput())
                    if target.uses_cpp:
                        self.target.uses_cpp = True
            actions_depends = [item for item in actions_depends if item]
            compile_depends = [item for item in compile_depends if item]
            actions_depends = self.WriteCollapsedDependencies(
                "actions_depends", actions_depends
            )
            compile_depends = self.WriteCollapsedDependencies(
                "compile_depends", compile_depends
            )
            self.target.preaction_stamp = actions_depends
            self.target.precompile_stamp = compile_depends

        # Write out actions, rules, and copies.  These must happen before we
        # compile any sources, so compute a list of predependencies for sources
        # while we do it.
        extra_sources = []
        mac_bundle_depends = []
        self.target.actions_stamp = self.WriteActionsRulesCopies(
            spec, extra_sources, actions_depends, mac_bundle_depends
        )

        # If we have actions/rules/copies, we depend directly on those, but
        # otherwise we depend on dependent target's actions/rules/copies etc.
        # We never need to explicitly depend on previous target's link steps,
        # because no compile ever depends on them.
        compile_depends_stamp = self.target.actions_stamp or compile_depends

        # Write out the compilation steps, if any.
        link_deps = []
        try:
            sources = extra_sources + spec.get("sources", [])
        except TypeError:
            print("extra_sources: ", str(extra_sources))
            print('spec.get("sources"): ', str(spec.get("sources")))
            raise
        if sources:
            if self.flavor == "mac" and len(self.archs) > 1:
                # Write subninja file containing compile and link commands scoped to
                # a single arch if a fat binary is being built.
                for arch in self.archs:
                    self.ninja.subninja(self._SubninjaNameForArch(arch))

            pch = None
            if self.flavor == "win":
                gyp.msvs_emulation.VerifyMissingSources(
                    sources, self.abs_build_dir, generator_flags, self.GypPathToNinja
                )
                pch = gyp.msvs_emulation.PrecompiledHeader(
                    self.msvs_settings,
                    config_name,
                    self.GypPathToNinja,
                    self.GypPathToUniqueOutput,
                    self.obj_ext,
                )
            else:
                pch = gyp.xcode_emulation.MacPrefixHeader(
                    self.xcode_settings,
                    self.GypPathToNinja,
                    lambda path, lang: self.GypPathToUniqueOutput(path + "-" + lang),
                )
            link_deps = self.WriteSources(
                self.ninja,
                config_name,
                config,
                sources,
                compile_depends_stamp,
                pch,
                spec,
            )
            # Some actions/rules output 'sources' that are already object files.
            obj_outputs = [f for f in sources if f.endswith(self.obj_ext)]
            if obj_outputs:
                if self.flavor != "mac" or len(self.archs) == 1:
                    link_deps += [self.GypPathToNinja(o) for o in obj_outputs]
                else:
                    print(
                        "Warning: Actions/rules writing object files don't work with "
                        "multiarch targets, dropping. (target %s)" % spec["target_name"]
                    )
        elif self.flavor == "mac" and len(self.archs) > 1:
            link_deps = collections.defaultdict(list)

        compile_deps = self.target.actions_stamp or actions_depends
        if self.flavor == "win" and self.target.type == "static_library":
            self.target.component_objs = link_deps
            self.target.compile_deps = compile_deps

        # Write out a link step, if needed.
        output = None
        is_empty_bundle = not link_deps and not mac_bundle_depends
        if link_deps or self.target.actions_stamp or actions_depends:
            output = self.WriteTarget(
                spec, config_name, config, link_deps, compile_deps
            )
            if self.is_mac_bundle:
                mac_bundle_depends.append(output)

        # Bundle all of the above together, if needed.
        if self.is_mac_bundle:
            output = self.WriteMacBundle(spec, mac_bundle_depends, is_empty_bundle)

        if not output:
            return None

        assert self.target.FinalOutput(), output
        return self.target

    def _WinIdlRule(self, source, prebuild, outputs):
        """Handle the implicit VS .idl rule for one source file. Fills |outputs|
        with files that are generated."""
        outdir, output, vars, flags = self.msvs_settings.GetIdlBuildData(
            source, self.config_name
        )
        outdir = self.GypPathToNinja(outdir)

        def fix_path(path, rel=None):
            path = os.path.join(outdir, path)
            dirname, basename = os.path.split(source)
            root, ext = os.path.splitext(basename)
            path = self.ExpandRuleVariables(path, root, dirname, source, ext, basename)
            if rel:
                path = os.path.relpath(path, rel)
            return path

        vars = [(name, fix_path(value, outdir)) for name, value in vars]
        output = [fix_path(p) for p in output]
        vars.append(("outdir", outdir))
        vars.append(("idlflags", flags))
        input = self.GypPathToNinja(source)
        self.ninja.build(output, "idl", input, variables=vars, order_only=prebuild)
        outputs.extend(output)

    def WriteWinIdlFiles(self, spec, prebuild):
        """Writes rules to match MSVS's implicit idl handling."""
        assert self.flavor == "win"
        if self.msvs_settings.HasExplicitIdlRulesOrActions(spec):
            return []
        outputs = []
        for source in filter(lambda x: x.endswith(".idl"), spec["sources"]):
            self._WinIdlRule(source, prebuild, outputs)
        return outputs

    def WriteActionsRulesCopies(
        self, spec, extra_sources, prebuild, mac_bundle_depends
    ):
        """Write out the Actions, Rules, and Copies steps.  Return a path
        representing the outputs of these steps."""
        outputs = []
        if self.is_mac_bundle:
            mac_bundle_resources = spec.get("mac_bundle_resources", [])[:]
        else:
            mac_bundle_resources = []
        extra_mac_bundle_resources = []

        if "actions" in spec:
            outputs += self.WriteActions(
                spec["actions"], extra_sources, prebuild, extra_mac_bundle_resources
            )
        if "rules" in spec:
            outputs += self.WriteRules(
                spec["rules"],
                extra_sources,
                prebuild,
                mac_bundle_resources,
                extra_mac_bundle_resources,
            )
        if "copies" in spec:
            outputs += self.WriteCopies(spec["copies"], prebuild, mac_bundle_depends)

        if "sources" in spec and self.flavor == "win":
            outputs += self.WriteWinIdlFiles(spec, prebuild)

        if self.xcode_settings and self.xcode_settings.IsIosFramework():
            self.WriteiOSFrameworkHeaders(spec, outputs, prebuild)

        stamp = self.WriteCollapsedDependencies("actions_rules_copies", outputs)

        if self.is_mac_bundle:
            xcassets = self.WriteMacBundleResources(
                extra_mac_bundle_resources + mac_bundle_resources, mac_bundle_depends
            )
            partial_info_plist = self.WriteMacXCassets(xcassets, mac_bundle_depends)
            self.WriteMacInfoPlist(partial_info_plist, mac_bundle_depends)

        return stamp

    def GenerateDescription(self, verb, message, fallback):
        """Generate and return a description of a build step.

        |verb| is the short summary, e.g. ACTION or RULE.
        |message| is a hand-written description, or None if not available.
        |fallback| is the gyp-level name of the step, usable as a fallback.
        """
        if self.toolset != "target":
            verb += "(%s)" % self.toolset
        if message:
            return f"{verb} {self.ExpandSpecial(message)}"
        else:
            return f"{verb} {self.name}: {fallback}"

    def WriteActions(
        self, actions, extra_sources, prebuild, extra_mac_bundle_resources
    ):
        # Actions cd into the base directory.
        env = self.GetToolchainEnv()
        all_outputs = []
        for action in actions:
            # First write out a rule for the action.
            name = "{}_{}".format(action["action_name"], self.hash_for_rules)
            description = self.GenerateDescription(
                "ACTION", action.get("message", None), name
            )
            win_shell_flags = (
                self.msvs_settings.GetRuleShellFlags(action)
                if self.flavor == "win"
                else None
            )
            args = action["action"]
            depfile = action.get("depfile", None)
            if depfile:
                depfile = self.ExpandSpecial(depfile, self.base_to_build)
            pool = "console" if int(action.get("ninja_use_console", 0)) else None
            rule_name, _ = self.WriteNewNinjaRule(
                name, args, description, win_shell_flags, env, pool, depfile=depfile
            )

            inputs = [self.GypPathToNinja(i, env) for i in action["inputs"]]
            if int(action.get("process_outputs_as_sources", False)):
                extra_sources += action["outputs"]
            if int(action.get("process_outputs_as_mac_bundle_resources", False)):
                extra_mac_bundle_resources += action["outputs"]
            outputs = [self.GypPathToNinja(o, env) for o in action["outputs"]]

            # Then write out an edge using the rule.
            self.ninja.build(outputs, rule_name, inputs, order_only=prebuild)
            all_outputs += outputs

            self.ninja.newline()

        return all_outputs

    def WriteRules(
        self,
        rules,
        extra_sources,
        prebuild,
        mac_bundle_resources,
        extra_mac_bundle_resources,
    ):
        env = self.GetToolchainEnv()
        all_outputs = []
        for rule in rules:
            # Skip a rule with no action and no inputs.
            if "action" not in rule and not rule.get("rule_sources", []):
                continue

            # First write out a rule for the rule action.
            name = "{}_{}".format(rule["rule_name"], self.hash_for_rules)

            args = rule["action"]
            description = self.GenerateDescription(
                "RULE",
                rule.get("message", None),
                ("%s " + generator_default_variables["RULE_INPUT_PATH"]) % name,
            )
            win_shell_flags = (
                self.msvs_settings.GetRuleShellFlags(rule)
                if self.flavor == "win"
                else None
            )
            pool = "console" if int(rule.get("ninja_use_console", 0)) else None
            rule_name, args = self.WriteNewNinjaRule(
                name, args, description, win_shell_flags, env, pool
            )

            # TODO: if the command references the outputs directly, we should
            # simplify it to just use $out.

            # Rules can potentially make use of some special variables which
            # must vary per source file.
            # Compute the list of variables we'll need to provide.
            special_locals = ("source", "root", "dirname", "ext", "name")
            needed_variables = {"source"}
            for argument in args:
                for var in special_locals:
                    if "${%s}" % var in argument:
                        needed_variables.add(var)
            needed_variables = sorted(needed_variables)

            def cygwin_munge(path):
                # pylint: disable=cell-var-from-loop
                if win_shell_flags and win_shell_flags.cygwin:
                    return path.replace("\\", "/")
                return path

            inputs = [self.GypPathToNinja(i, env) for i in rule.get("inputs", [])]

            # If there are n source files matching the rule, and m additional rule
            # inputs, then adding 'inputs' to each build edge written below will
            # write m * n inputs. Collapsing reduces this to m + n.
            sources = rule.get("rule_sources", [])
            num_inputs = len(inputs)
            if prebuild:
                num_inputs += 1
            if num_inputs > 2 and len(sources) > 2:
                inputs = [
                    self.WriteCollapsedDependencies(
                        rule["rule_name"], inputs, order_only=prebuild
                    )
                ]
                prebuild = []

            # For each source file, write an edge that generates all the outputs.
            for source in sources:
                source = os.path.normpath(source)
                dirname, basename = os.path.split(source)
                root, ext = os.path.splitext(basename)

                # Gather the list of inputs and outputs, expanding $vars if possible.
                outputs = [
                    self.ExpandRuleVariables(o, root, dirname, source, ext, basename)
                    for o in rule["outputs"]
                ]

                if int(rule.get("process_outputs_as_sources", False)):
                    extra_sources += outputs

                was_mac_bundle_resource = source in mac_bundle_resources
                if was_mac_bundle_resource or int(
                    rule.get("process_outputs_as_mac_bundle_resources", False)
                ):
                    extra_mac_bundle_resources += outputs
                    # Note: This is n_resources * n_outputs_in_rule.
                    # Put to-be-removed items in a set and
                    # remove them all in a single pass
                    # if this becomes a performance issue.
                    if was_mac_bundle_resource:
                        mac_bundle_resources.remove(source)

                extra_bindings = []
                for var in needed_variables:
                    if var == "root":
                        extra_bindings.append(("root", cygwin_munge(root)))
                    elif var == "dirname":
                        # '$dirname' is a parameter to the rule action, which means
                        # it shouldn't be converted to a Ninja path.  But we don't
                        # want $!PRODUCT_DIR in there either.
                        dirname_expanded = self.ExpandSpecial(
                            dirname, self.base_to_build
                        )
                        extra_bindings.append(
                            ("dirname", cygwin_munge(dirname_expanded))
                        )
                    elif var == "source":
                        # '$source' is a parameter to the rule action, which means
                        # it shouldn't be converted to a Ninja path.  But we don't
                        # want $!PRODUCT_DIR in there either.
                        source_expanded = self.ExpandSpecial(source, self.base_to_build)
                        extra_bindings.append(("source", cygwin_munge(source_expanded)))
                    elif var == "ext":
                        extra_bindings.append(("ext", ext))
                    elif var == "name":
                        extra_bindings.append(("name", cygwin_munge(basename)))
                    else:
                        assert var is None, repr(var)

                outputs = [self.GypPathToNinja(o, env) for o in outputs]
                if self.flavor == "win":
                    # WriteNewNinjaRule uses unique_name to create a rsp file on win.
                    extra_bindings.append(
                        ("unique_name", hashlib.md5(outputs[0]).hexdigest())
                    )

                self.ninja.build(
                    outputs,
                    rule_name,
                    self.GypPathToNinja(source),
                    implicit=inputs,
                    order_only=prebuild,
                    variables=extra_bindings,
                )

                all_outputs.extend(outputs)

        return all_outputs

    def WriteCopies(self, copies, prebuild, mac_bundle_depends):
        outputs = []
        if self.xcode_settings:
            extra_env = self.xcode_settings.GetPerTargetSettings()
            env = self.GetToolchainEnv(additional_settings=extra_env)
        else:
            env = self.GetToolchainEnv()
        for to_copy in copies:
            for path in to_copy["files"]:
                # Normalize the path so trailing slashes don't confuse us.
                path = os.path.normpath(path)
                basename = os.path.split(path)[1]
                src = self.GypPathToNinja(path, env)
                dst = self.GypPathToNinja(
                    os.path.join(to_copy["destination"], basename), env
                )
                outputs += self.ninja.build(dst, "copy", src, order_only=prebuild)
                if self.is_mac_bundle:
                    # gyp has mac_bundle_resources to copy things into a bundle's
                    # Resources folder, but there's no built-in way to copy files
                    # to other places in the bundle.
                    # Hence, some targets use copies for this.
                    # Check if this file is copied into the current bundle,
                    # and if so add it to the bundle depends so
                    # that dependent targets get rebuilt if the copy input changes.
                    if dst.startswith(
                        self.xcode_settings.GetBundleContentsFolderPath()
                    ):
                        mac_bundle_depends.append(dst)

        return outputs

    def WriteiOSFrameworkHeaders(self, spec, outputs, prebuild):
        """Prebuild steps to generate hmap files and copy headers to destination."""
        framework = self.ComputeMacBundleOutput()
        all_sources = spec["sources"]
        copy_headers = spec["mac_framework_headers"]
        output = self.GypPathToUniqueOutput("headers.hmap")
        self.xcode_settings.header_map_path = output
        all_headers = map(
            self.GypPathToNinja, filter(lambda x: x.endswith(".h"), all_sources)
        )
        variables = [
            ("framework", framework),
            ("copy_headers", map(self.GypPathToNinja, copy_headers)),
        ]
        outputs.extend(
            self.ninja.build(
                output,
                "compile_ios_framework_headers",
                all_headers,
                variables=variables,
                order_only=prebuild,
            )
        )

    def WriteMacBundleResources(self, resources, bundle_depends):
        """Writes ninja edges for 'mac_bundle_resources'."""
        xcassets = []

        extra_env = self.xcode_settings.GetPerTargetSettings()
        env = self.GetSortedXcodeEnv(additional_settings=extra_env)
        env = self.ComputeExportEnvString(env)
        isBinary = self.xcode_settings.IsBinaryOutputFormat(self.config_name)

        for output, res in gyp.xcode_emulation.GetMacBundleResources(
            generator_default_variables["PRODUCT_DIR"],
            self.xcode_settings,
            map(self.GypPathToNinja, resources),
        ):
            output = self.ExpandSpecial(output)
            if os.path.splitext(output)[-1] != ".xcassets":
                self.ninja.build(
                    output,
                    "mac_tool",
                    res,
                    variables=[
                        ("mactool_cmd", "copy-bundle-resource"),
                        ("env", env),
                        ("binary", isBinary),
                    ],
                )
                bundle_depends.append(output)
            else:
                xcassets.append(res)
        return xcassets

    def WriteMacXCassets(self, xcassets, bundle_depends):
        """Writes ninja edges for 'mac_bundle_resources' .xcassets files.

        This add an invocation of 'actool' via the 'mac_tool.py' helper script.
        It assumes that the assets catalogs define at least one imageset and
        thus an Assets.car file will be generated in the application resources
        directory. If this is not the case, then the build will probably be done
        at each invocation of ninja."""
        if not xcassets:
            return

        extra_arguments = {}
        settings_to_arg = {
            "XCASSETS_APP_ICON": "app-icon",
            "XCASSETS_LAUNCH_IMAGE": "launch-image",
        }
        settings = self.xcode_settings.xcode_settings[self.config_name]
        for settings_key, arg_name in settings_to_arg.items():
            value = settings.get(settings_key)
            if value:
                extra_arguments[arg_name] = value

        partial_info_plist = None
        if extra_arguments:
            partial_info_plist = self.GypPathToUniqueOutput(
                "assetcatalog_generated_info.plist"
            )
            extra_arguments["output-partial-info-plist"] = partial_info_plist

        outputs = []
        outputs.append(
            os.path.join(self.xcode_settings.GetBundleResourceFolder(), "Assets.car")
        )
        if partial_info_plist:
            outputs.append(partial_info_plist)

        keys = QuoteShellArgument(json.dumps(extra_arguments), self.flavor)
        extra_env = self.xcode_settings.GetPerTargetSettings()
        env = self.GetSortedXcodeEnv(additional_settings=extra_env)
        env = self.ComputeExportEnvString(env)

        bundle_depends.extend(
            self.ninja.build(
                outputs,
                "compile_xcassets",
                xcassets,
                variables=[("env", env), ("keys", keys)],
            )
        )
        return partial_info_plist

    def WriteMacInfoPlist(self, partial_info_plist, bundle_depends):
        """Write build rules for bundle Info.plist files."""
        info_plist, out, defines, extra_env = gyp.xcode_emulation.GetMacInfoPlist(
            generator_default_variables["PRODUCT_DIR"],
            self.xcode_settings,
            self.GypPathToNinja,
        )
        if not info_plist:
            return
        out = self.ExpandSpecial(out)
        if defines:
            # Create an intermediate file to store preprocessed results.
            intermediate_plist = self.GypPathToUniqueOutput(
                os.path.basename(info_plist)
            )
            defines = " ".join([Define(d, self.flavor) for d in defines])
            info_plist = self.ninja.build(
                intermediate_plist,
                "preprocess_infoplist",
                info_plist,
                variables=[("defines", defines)],
            )

        env = self.GetSortedXcodeEnv(additional_settings=extra_env)
        env = self.ComputeExportEnvString(env)

        if partial_info_plist:
            intermediate_plist = self.GypPathToUniqueOutput("merged_info.plist")
            info_plist = self.ninja.build(
                intermediate_plist, "merge_infoplist", [partial_info_plist, info_plist]
            )

        keys = self.xcode_settings.GetExtraPlistItems(self.config_name)
        keys = QuoteShellArgument(json.dumps(keys), self.flavor)
        isBinary = self.xcode_settings.IsBinaryOutputFormat(self.config_name)
        self.ninja.build(
            out,
            "copy_infoplist",
            info_plist,
            variables=[("env", env), ("keys", keys), ("binary", isBinary)],
        )
        bundle_depends.append(out)

    def WriteSources(
        self,
        ninja_file,
        config_name,
        config,
        sources,
        predepends,
        precompiled_header,
        spec,
    ):
        """Write build rules to compile all of |sources|."""
        if self.toolset == "host":
            self.ninja.variable("ar", "$ar_host")
            self.ninja.variable("cc", "$cc_host")
            self.ninja.variable("cxx", "$cxx_host")
            self.ninja.variable("ld", "$ld_host")
            self.ninja.variable("ldxx", "$ldxx_host")
            self.ninja.variable("nm", "$nm_host")
            self.ninja.variable("readelf", "$readelf_host")

        if self.flavor != "mac" or len(self.archs) == 1:
            return self.WriteSourcesForArch(
                self.ninja,
                config_name,
                config,
                sources,
                predepends,
                precompiled_header,
                spec,
            )
        else:
            return {
                arch: self.WriteSourcesForArch(
                    self.arch_subninjas[arch],
                    config_name,
                    config,
                    sources,
                    predepends,
                    precompiled_header,
                    spec,
                    arch=arch,
                )
                for arch in self.archs
            }

    def WriteSourcesForArch(
        self,
        ninja_file,
        config_name,
        config,
        sources,
        predepends,
        precompiled_header,
        spec,
        arch=None,
    ):
        """Write build rules to compile all of |sources|."""

        extra_defines = []
        if self.flavor == "mac":
            cflags = self.xcode_settings.GetCflags(config_name, arch=arch)
            cflags_c = self.xcode_settings.GetCflagsC(config_name)
            cflags_cc = self.xcode_settings.GetCflagsCC(config_name)
            cflags_objc = ["$cflags_c"] + self.xcode_settings.GetCflagsObjC(config_name)
            cflags_objcc = ["$cflags_cc"] + self.xcode_settings.GetCflagsObjCC(
                config_name
            )
        elif self.flavor == "win":
            asmflags = self.msvs_settings.GetAsmflags(config_name)
            cflags = self.msvs_settings.GetCflags(config_name)
            cflags_c = self.msvs_settings.GetCflagsC(config_name)
            cflags_cc = self.msvs_settings.GetCflagsCC(config_name)
            extra_defines = self.msvs_settings.GetComputedDefines(config_name)
            # See comment at cc_command for why there's two .pdb files.
            pdbpath_c = pdbpath_cc = self.msvs_settings.GetCompilerPdbName(
                config_name, self.ExpandSpecial
            )
            if not pdbpath_c:
                obj = "obj"
                if self.toolset != "target":
                    obj += "." + self.toolset
                pdbpath = os.path.normpath(os.path.join(obj, self.base_dir, self.name))
                pdbpath_c = pdbpath + ".c.pdb"
                pdbpath_cc = pdbpath + ".cc.pdb"
            self.WriteVariableList(ninja_file, "pdbname_c", [pdbpath_c])
            self.WriteVariableList(ninja_file, "pdbname_cc", [pdbpath_cc])
            self.WriteVariableList(ninja_file, "pchprefix", [self.name])
        else:
            cflags = config.get("cflags", [])
            cflags_c = config.get("cflags_c", [])
            cflags_cc = config.get("cflags_cc", [])

        # Respect environment variables related to build, but target-specific
        # flags can still override them.
        if self.toolset == "target":
            cflags_c = (
                os.environ.get("CPPFLAGS", "").split()
                + os.environ.get("CFLAGS", "").split()
                + cflags_c
            )
            cflags_cc = (
                os.environ.get("CPPFLAGS", "").split()
                + os.environ.get("CXXFLAGS", "").split()
                + cflags_cc
            )
        elif self.toolset == "host":
            cflags_c = (
                os.environ.get("CPPFLAGS_host", "").split()
                + os.environ.get("CFLAGS_host", "").split()
                + cflags_c
            )
            cflags_cc = (
                os.environ.get("CPPFLAGS_host", "").split()
                + os.environ.get("CXXFLAGS_host", "").split()
                + cflags_cc
            )

        defines = config.get("defines", []) + extra_defines
        self.WriteVariableList(
            ninja_file, "defines", [Define(d, self.flavor) for d in defines]
        )
        if self.flavor == "win":
            self.WriteVariableList(
                ninja_file, "asmflags", map(self.ExpandSpecial, asmflags)
            )
            self.WriteVariableList(
                ninja_file,
                "rcflags",
                [
                    QuoteShellArgument(self.ExpandSpecial(f), self.flavor)
                    for f in self.msvs_settings.GetRcflags(
                        config_name, self.GypPathToNinja
                    )
                ],
            )

        include_dirs = config.get("include_dirs", [])

        env = self.GetToolchainEnv()
        if self.flavor == "win":
            include_dirs = self.msvs_settings.AdjustIncludeDirs(
                include_dirs, config_name
            )
        self.WriteVariableList(
            ninja_file,
            "includes",
            [
                QuoteShellArgument("-I" + self.GypPathToNinja(i, env), self.flavor)
                for i in include_dirs
            ],
        )

        if self.flavor == "win":
            midl_include_dirs = config.get("midl_include_dirs", [])
            midl_include_dirs = self.msvs_settings.AdjustMidlIncludeDirs(
                midl_include_dirs, config_name
            )
            self.WriteVariableList(
                ninja_file,
                "midl_includes",
                [
                    QuoteShellArgument("-I" + self.GypPathToNinja(i, env), self.flavor)
                    for i in midl_include_dirs
                ],
            )

        pch_commands = precompiled_header.GetPchBuildCommands(arch)
        if self.flavor == "mac":
            # Most targets use no precompiled headers, so only write these if needed.
            for ext, var in [
                ("c", "cflags_pch_c"),
                ("cc", "cflags_pch_cc"),
                ("m", "cflags_pch_objc"),
                ("mm", "cflags_pch_objcc"),
            ]:
                include = precompiled_header.GetInclude(ext, arch)
                if include:
                    ninja_file.variable(var, include)

        arflags = config.get("arflags", [])

        self.WriteVariableList(ninja_file, "cflags", map(self.ExpandSpecial, cflags))
        self.WriteVariableList(
            ninja_file, "cflags_c", map(self.ExpandSpecial, cflags_c)
        )
        self.WriteVariableList(
            ninja_file, "cflags_cc", map(self.ExpandSpecial, cflags_cc)
        )
        if self.flavor == "mac":
            self.WriteVariableList(
                ninja_file, "cflags_objc", map(self.ExpandSpecial, cflags_objc)
            )
            self.WriteVariableList(
                ninja_file, "cflags_objcc", map(self.ExpandSpecial, cflags_objcc)
            )
        self.WriteVariableList(ninja_file, "arflags", map(self.ExpandSpecial, arflags))
        ninja_file.newline()
        outputs = []
        has_rc_source = False
        for source in sources:
            filename, ext = os.path.splitext(source)
            ext = ext[1:]
            obj_ext = self.obj_ext
            if ext in ("cc", "cpp", "cxx"):
                command = "cxx"
                self.target.uses_cpp = True
            elif ext == "c" or (ext == "S" and self.flavor != "win"):
                command = "cc"
            elif ext == "s" and self.flavor != "win":  # Doesn't generate .o.d files.
                command = "cc_s"
            elif (
                self.flavor == "win"
                and ext in ("asm", "S")
                and not self.msvs_settings.HasExplicitAsmRules(spec)
            ):
                command = "asm"
                # Add the _asm suffix as msvs is capable of handling .cc and
                # .asm files of the same name without collision.
                obj_ext = "_asm.obj"
            elif self.flavor == "mac" and ext == "m":
                command = "objc"
            elif self.flavor == "mac" and ext == "mm":
                command = "objcxx"
                self.target.uses_cpp = True
            elif self.flavor == "win" and ext == "rc":
                command = "rc"
                obj_ext = ".res"
                has_rc_source = True
            else:
                # Ignore unhandled extensions.
                continue
            input = self.GypPathToNinja(source)
            output = self.GypPathToUniqueOutput(filename + obj_ext)
            if arch is not None:
                output = AddArch(output, arch)
            implicit = precompiled_header.GetObjDependencies([input], [output], arch)
            variables = []
            if self.flavor == "win":
                variables, output, implicit = precompiled_header.GetFlagsModifications(
                    input,
                    output,
                    implicit,
                    command,
                    cflags_c,
                    cflags_cc,
                    self.ExpandSpecial,
                )
            ninja_file.build(
                output,
                command,
                input,
                implicit=[gch for _, _, gch in implicit],
                order_only=predepends,
                variables=variables,
            )
            outputs.append(output)

        if has_rc_source:
            resource_include_dirs = config.get("resource_include_dirs", include_dirs)
            self.WriteVariableList(
                ninja_file,
                "resource_includes",
                [
                    QuoteShellArgument("-I" + self.GypPathToNinja(i, env), self.flavor)
                    for i in resource_include_dirs
                ],
            )

        self.WritePchTargets(ninja_file, pch_commands)

        ninja_file.newline()
        return outputs

    def WritePchTargets(self, ninja_file, pch_commands):
        """Writes ninja rules to compile prefix headers."""
        if not pch_commands:
            return

        for gch, lang_flag, lang, input in pch_commands:
            var_name = {
                "c": "cflags_pch_c",
                "cc": "cflags_pch_cc",
                "m": "cflags_pch_objc",
                "mm": "cflags_pch_objcc",
            }[lang]

            map = {
                "c": "cc",
                "cc": "cxx",
                "m": "objc",
                "mm": "objcxx",
            }
            cmd = map.get(lang)
            ninja_file.build(gch, cmd, input, variables=[(var_name, lang_flag)])

    def WriteLink(self, spec, config_name, config, link_deps, compile_deps):
        """Write out a link step. Fills out target.binary. """
        if self.flavor != "mac" or len(self.archs) == 1:
            return self.WriteLinkForArch(
                self.ninja, spec, config_name, config, link_deps, compile_deps
            )
        else:
            output = self.ComputeOutput(spec)
            inputs = [
                self.WriteLinkForArch(
                    self.arch_subninjas[arch],
                    spec,
                    config_name,
                    config,
                    link_deps[arch],
                    compile_deps,
                    arch=arch,
                )
                for arch in self.archs
            ]
            extra_bindings = []
            build_output = output
            if not self.is_mac_bundle:
                self.AppendPostbuildVariable(extra_bindings, spec, output, output)

            # TODO(yyanagisawa): more work needed to fix:
            # https://code.google.com/p/gyp/issues/detail?id=411
            if (
                spec["type"] in ("shared_library", "loadable_module")
                and not self.is_mac_bundle
            ):
                extra_bindings.append(("lib", output))
                self.ninja.build(
                    [output, output + ".TOC"],
                    "solipo",
                    inputs,
                    variables=extra_bindings,
                )
            else:
                self.ninja.build(build_output, "lipo", inputs, variables=extra_bindings)
            return output

    def WriteLinkForArch(
        self, ninja_file, spec, config_name, config, link_deps, compile_deps, arch=None
    ):
        """Write out a link step. Fills out target.binary. """
        command = {
            "executable": "link",
            "loadable_module": "solink_module",
            "shared_library": "solink",
        }[spec["type"]]
        command_suffix = ""

        implicit_deps = set()
        solibs = set()
        order_deps = set()

        if compile_deps:
            # Normally, the compiles of the target already depend on compile_deps,
            # but a shared_library target might have no sources and only link together
            # a few static_library deps, so the link step also needs to depend
            # on compile_deps to make sure actions in the shared_library target
            # get run before the link.
            order_deps.add(compile_deps)

        if "dependencies" in spec:
            # Two kinds of dependencies:
            # - Linkable dependencies (like a .a or a .so): add them to the link line.
            # - Non-linkable dependencies (like a rule that generates a file
            #   and writes a stamp file): add them to implicit_deps
            extra_link_deps = set()
            for dep in spec["dependencies"]:
                target = self.target_outputs.get(dep)
                if not target:
                    continue
                linkable = target.Linkable()
                if linkable:
                    new_deps = []
                    if (
                        self.flavor == "win"
                        and target.component_objs
                        and self.msvs_settings.IsUseLibraryDependencyInputs(config_name)
                    ):
                        new_deps = target.component_objs
                        if target.compile_deps:
                            order_deps.add(target.compile_deps)
                    elif self.flavor == "win" and target.import_lib:
                        new_deps = [target.import_lib]
                    elif target.UsesToc(self.flavor):
                        solibs.add(target.binary)
                        implicit_deps.add(target.binary + ".TOC")
                    else:
                        new_deps = [target.binary]
                    for new_dep in new_deps:
                        if new_dep not in extra_link_deps:
                            extra_link_deps.add(new_dep)
                            link_deps.append(new_dep)

                final_output = target.FinalOutput()
                if not linkable or final_output != target.binary:
                    implicit_deps.add(final_output)

        extra_bindings = []
        if self.target.uses_cpp and self.flavor != "win":
            extra_bindings.append(("ld", "$ldxx"))

        output = self.ComputeOutput(spec, arch)
        if arch is None and not self.is_mac_bundle:
            self.AppendPostbuildVariable(extra_bindings, spec, output, output)

        is_executable = spec["type"] == "executable"
        # The ldflags config key is not used on mac or win. On those platforms
        # linker flags are set via xcode_settings and msvs_settings, respectively.
        if self.toolset == "target":
            env_ldflags = os.environ.get("LDFLAGS", "").split()
        elif self.toolset == "host":
            env_ldflags = os.environ.get("LDFLAGS_host", "").split()

        if self.flavor == "mac":
            ldflags = self.xcode_settings.GetLdflags(
                config_name,
                self.ExpandSpecial(generator_default_variables["PRODUCT_DIR"]),
                self.GypPathToNinja,
                arch,
            )
            ldflags = env_ldflags + ldflags
        elif self.flavor == "win":
            manifest_base_name = self.GypPathToUniqueOutput(
                self.ComputeOutputFileName(spec)
            )
            (
                ldflags,
                intermediate_manifest,
                manifest_files,
            ) = self.msvs_settings.GetLdflags(
                config_name,
                self.GypPathToNinja,
                self.ExpandSpecial,
                manifest_base_name,
                output,
                is_executable,
                self.toplevel_build,
            )
            ldflags = env_ldflags + ldflags
            self.WriteVariableList(ninja_file, "manifests", manifest_files)
            implicit_deps = implicit_deps.union(manifest_files)
            if intermediate_manifest:
                self.WriteVariableList(
                    ninja_file, "intermediatemanifest", [intermediate_manifest]
                )
            command_suffix = _GetWinLinkRuleNameSuffix(
                self.msvs_settings.IsEmbedManifest(config_name)
            )
            def_file = self.msvs_settings.GetDefFile(self.GypPathToNinja)
            if def_file:
                implicit_deps.add(def_file)
        else:
            # Respect environment variables related to build, but target-specific
            # flags can still override them.
            ldflags = env_ldflags + config.get("ldflags", [])
            if is_executable and len(solibs):
                rpath = "lib/"
                if self.toolset != "target":
                    rpath += self.toolset
                    ldflags.append(r"-Wl,-rpath=\$$ORIGIN/%s" % rpath)
                else:
                    ldflags.append("-Wl,-rpath=%s" % self.target_rpath)
                ldflags.append("-Wl,-rpath-link=%s" % rpath)
        self.WriteVariableList(ninja_file, "ldflags", map(self.ExpandSpecial, ldflags))

        library_dirs = config.get("library_dirs", [])
        if self.flavor == "win":
            library_dirs = [
                self.msvs_settings.ConvertVSMacros(library_dir, config_name)
                for library_dir in library_dirs
            ]
            library_dirs = [
                "/LIBPATH:"
                + QuoteShellArgument(self.GypPathToNinja(library_dir), self.flavor)
                for library_dir in library_dirs
            ]
        else:
            library_dirs = [
                QuoteShellArgument("-L" + self.GypPathToNinja(library_dir), self.flavor)
                for library_dir in library_dirs
            ]

        libraries = gyp.common.uniquer(
            map(self.ExpandSpecial, spec.get("libraries", []))
        )
        if self.flavor == "mac":
            libraries = self.xcode_settings.AdjustLibraries(libraries, config_name)
        elif self.flavor == "win":
            libraries = self.msvs_settings.AdjustLibraries(libraries)

        self.WriteVariableList(ninja_file, "libs", library_dirs + libraries)

        linked_binary = output

        if command in ("solink", "solink_module"):
            extra_bindings.append(("soname", os.path.split(output)[1]))
            extra_bindings.append(("lib", gyp.common.EncodePOSIXShellArgument(output)))
            if self.flavor != "win":
                link_file_list = output
                if self.is_mac_bundle:
                    # 'Dependency Framework.framework/Versions/A/Dependency Framework'
                    # -> 'Dependency Framework.framework.rsp'
                    link_file_list = self.xcode_settings.GetWrapperName()
                if arch:
                    link_file_list += "." + arch
                link_file_list += ".rsp"
                # If an rspfile contains spaces, ninja surrounds the filename with
                # quotes around it and then passes it to open(), creating a file with
                # quotes in its name (and when looking for the rsp file, the name
                # makes it through bash which strips the quotes) :-/
                link_file_list = link_file_list.replace(" ", "_")
                extra_bindings.append(
                    (
                        "link_file_list",
                        gyp.common.EncodePOSIXShellArgument(link_file_list),
                    )
                )
            if self.flavor == "win":
                extra_bindings.append(("binary", output))
                if (
                    "/NOENTRY" not in ldflags
                    and not self.msvs_settings.GetNoImportLibrary(config_name)
                ):
                    self.target.import_lib = output + ".lib"
                    extra_bindings.append(
                        ("implibflag", "/IMPLIB:%s" % self.target.import_lib)
                    )
                    pdbname = self.msvs_settings.GetPDBName(
                        config_name, self.ExpandSpecial, output + ".pdb"
                    )
                    output = [output, self.target.import_lib]
                    if pdbname:
                        output.append(pdbname)
            elif not self.is_mac_bundle:
                output = [output, output + ".TOC"]
            else:
                command = command + "_notoc"
        elif self.flavor == "win":
            extra_bindings.append(("binary", output))
            pdbname = self.msvs_settings.GetPDBName(
                config_name, self.ExpandSpecial, output + ".pdb"
            )
            if pdbname:
                output = [output, pdbname]

        if len(solibs):
            extra_bindings.append(
                ("solibs", gyp.common.EncodePOSIXShellList(sorted(solibs)))
            )

        ninja_file.build(
            output,
            command + command_suffix,
            link_deps,
            implicit=sorted(implicit_deps),
            order_only=list(order_deps),
            variables=extra_bindings,
        )
        return linked_binary

    def WriteTarget(self, spec, config_name, config, link_deps, compile_deps):
        extra_link_deps = any(
            self.target_outputs.get(dep).Linkable()
            for dep in spec.get("dependencies", [])
            if dep in self.target_outputs
        )
        if spec["type"] == "none" or (not link_deps and not extra_link_deps):
            # TODO(evan): don't call this function for 'none' target types, as
            # it doesn't do anything, and we fake out a 'binary' with a stamp file.
            self.target.binary = compile_deps
            self.target.type = "none"
        elif spec["type"] == "static_library":
            self.target.binary = self.ComputeOutput(spec)
            if (
                self.flavor not in ("mac", "openbsd", "netbsd", "win")
                and not self.is_standalone_static_library
            ):
                self.ninja.build(
                    self.target.binary, "alink_thin", link_deps, order_only=compile_deps
                )
            else:
                variables = []
                if self.xcode_settings:
                    libtool_flags = self.xcode_settings.GetLibtoolflags(config_name)
                    if libtool_flags:
                        variables.append(("libtool_flags", libtool_flags))
                if self.msvs_settings:
                    libflags = self.msvs_settings.GetLibFlags(
                        config_name, self.GypPathToNinja
                    )
                    variables.append(("libflags", libflags))

                if self.flavor != "mac" or len(self.archs) == 1:
                    self.AppendPostbuildVariable(
                        variables, spec, self.target.binary, self.target.binary
                    )
                    self.ninja.build(
                        self.target.binary,
                        "alink",
                        link_deps,
                        order_only=compile_deps,
                        variables=variables,
                    )
                else:
                    inputs = []
                    for arch in self.archs:
                        output = self.ComputeOutput(spec, arch)
                        self.arch_subninjas[arch].build(
                            output,
                            "alink",
                            link_deps[arch],
                            order_only=compile_deps,
                            variables=variables,
                        )
                        inputs.append(output)
                    # TODO: It's not clear if
                    # libtool_flags should be passed to the alink
                    # call that combines single-arch .a files into a fat .a file.
                    self.AppendPostbuildVariable(
                        variables, spec, self.target.binary, self.target.binary
                    )
                    self.ninja.build(
                        self.target.binary,
                        "alink",
                        inputs,
                        # FIXME: test proving order_only=compile_deps isn't
                        # needed.
                        variables=variables,
                    )
        else:
            self.target.binary = self.WriteLink(
                spec, config_name, config, link_deps, compile_deps
            )
        return self.target.binary

    def WriteMacBundle(self, spec, mac_bundle_depends, is_empty):
        assert self.is_mac_bundle
        package_framework = spec["type"] in ("shared_library", "loadable_module")
        output = self.ComputeMacBundleOutput()
        if is_empty:
            output += ".stamp"
        variables = []
        self.AppendPostbuildVariable(
            variables,
            spec,
            output,
            self.target.binary,
            is_command_start=not package_framework,
        )
        if package_framework and not is_empty:
            if spec["type"] == "shared_library" and self.xcode_settings.isIOS:
                self.ninja.build(
                    output,
                    "package_ios_framework",
                    mac_bundle_depends,
                    variables=variables,
                )
            else:
                variables.append(("version", self.xcode_settings.GetFrameworkVersion()))
                self.ninja.build(
                    output, "package_framework", mac_bundle_depends, variables=variables
                )
        else:
            self.ninja.build(output, "stamp", mac_bundle_depends, variables=variables)
        self.target.bundle = output
        return output

    def GetToolchainEnv(self, additional_settings=None):
        """Returns the variables toolchain would set for build steps."""
        env = self.GetSortedXcodeEnv(additional_settings=additional_settings)
        if self.flavor == "win":
            env = self.GetMsvsToolchainEnv(additional_settings=additional_settings)
        return env

    def GetMsvsToolchainEnv(self, additional_settings=None):
        """Returns the variables Visual Studio would set for build steps."""
        return self.msvs_settings.GetVSMacroEnv(
            "$!PRODUCT_DIR", config=self.config_name
        )

    def GetSortedXcodeEnv(self, additional_settings=None):
        """Returns the variables Xcode would set for build steps."""
        assert self.abs_build_dir
        abs_build_dir = self.abs_build_dir
        return gyp.xcode_emulation.GetSortedXcodeEnv(
            self.xcode_settings,
            abs_build_dir,
            os.path.join(abs_build_dir, self.build_to_base),
            self.config_name,
            additional_settings,
        )

    def GetSortedXcodePostbuildEnv(self):
        """Returns the variables Xcode would set for postbuild steps."""
        postbuild_settings = {}
        # CHROMIUM_STRIP_SAVE_FILE is a chromium-specific hack.
        # TODO(thakis): It would be nice to have some general mechanism instead.
        strip_save_file = self.xcode_settings.GetPerTargetSetting(
            "CHROMIUM_STRIP_SAVE_FILE"
        )
        if strip_save_file:
            postbuild_settings["CHROMIUM_STRIP_SAVE_FILE"] = strip_save_file
        return self.GetSortedXcodeEnv(additional_settings=postbuild_settings)

    def AppendPostbuildVariable(
        self, variables, spec, output, binary, is_command_start=False
    ):
        """Adds a 'postbuild' variable if there is a postbuild for |output|."""
        postbuild = self.GetPostbuildCommand(spec, output, binary, is_command_start)
        if postbuild:
            variables.append(("postbuilds", postbuild))

    def GetPostbuildCommand(self, spec, output, output_binary, is_command_start):
        """Returns a shell command that runs all the postbuilds, and removes
        |output| if any of them fails. If |is_command_start| is False, then the
        returned string will start with ' && '."""
        if not self.xcode_settings or spec["type"] == "none" or not output:
            return ""
        output = QuoteShellArgument(output, self.flavor)
        postbuilds = gyp.xcode_emulation.GetSpecPostbuildCommands(spec, quiet=True)
        if output_binary is not None:
            postbuilds = self.xcode_settings.AddImplicitPostbuilds(
                self.config_name,
                os.path.normpath(os.path.join(self.base_to_build, output)),
                QuoteShellArgument(
                    os.path.normpath(os.path.join(self.base_to_build, output_binary)),
                    self.flavor,
                ),
                postbuilds,
                quiet=True,
            )

        if not postbuilds:
            return ""
        # Postbuilds expect to be run in the gyp file's directory, so insert an
        # implicit postbuild to cd to there.
        postbuilds.insert(
            0, gyp.common.EncodePOSIXShellList(["cd", self.build_to_base])
        )
        env = self.ComputeExportEnvString(self.GetSortedXcodePostbuildEnv())
        # G will be non-null if any postbuild fails. Run all postbuilds in a
        # subshell.
        commands = (
            env
            + " ("
            + " && ".join([ninja_syntax.escape(command) for command in postbuilds])
        )
        command_string = (
            commands
            + "); G=$$?; "
            # Remove the final output if any postbuild failed.
            "((exit $$G) || rm -rf %s) " % output
            + "&& exit $$G)"
        )
        if is_command_start:
            return "(" + command_string + " && "
        else:
            return "$ && (" + command_string

    def ComputeExportEnvString(self, env):
        """Given an environment, returns a string looking like
            'export FOO=foo; export BAR="${FOO} bar;'
        that exports |env| to the shell."""
        export_str = []
        for k, v in env:
            export_str.append(
                "export %s=%s;"
                % (k, ninja_syntax.escape(gyp.common.EncodePOSIXShellArgument(v)))
            )
        return " ".join(export_str)

    def ComputeMacBundleOutput(self):
        """Return the 'output' (full output path) to a bundle output directory."""
        assert self.is_mac_bundle
        path = generator_default_variables["PRODUCT_DIR"]
        return self.ExpandSpecial(
            os.path.join(path, self.xcode_settings.GetWrapperName())
        )

    def ComputeOutputFileName(self, spec, type=None):
        """Compute the filename of the final output for the current target."""
        if not type:
            type = spec["type"]

        default_variables = copy.copy(generator_default_variables)
        CalculateVariables(default_variables, {"flavor": self.flavor})

        # Compute filename prefix: the product prefix, or a default for
        # the product type.
        DEFAULT_PREFIX = {
            "loadable_module": default_variables["SHARED_LIB_PREFIX"],
            "shared_library": default_variables["SHARED_LIB_PREFIX"],
            "static_library": default_variables["STATIC_LIB_PREFIX"],
            "executable": default_variables["EXECUTABLE_PREFIX"],
        }
        prefix = spec.get("product_prefix", DEFAULT_PREFIX.get(type, ""))

        # Compute filename extension: the product extension, or a default
        # for the product type.
        DEFAULT_EXTENSION = {
            "loadable_module": default_variables["SHARED_LIB_SUFFIX"],
            "shared_library": default_variables["SHARED_LIB_SUFFIX"],
            "static_library": default_variables["STATIC_LIB_SUFFIX"],
            "executable": default_variables["EXECUTABLE_SUFFIX"],
        }
        extension = spec.get("product_extension")
        if extension:
            extension = "." + extension
        else:
            extension = DEFAULT_EXTENSION.get(type, "")

        if "product_name" in spec:
            # If we were given an explicit name, use that.
            target = spec["product_name"]
        else:
            # Otherwise, derive a name from the target name.
            target = spec["target_name"]
            if prefix == "lib":
                # Snip out an extra 'lib' from libs if appropriate.
                target = StripPrefix(target, "lib")

        if type in (
            "static_library",
            "loadable_module",
            "shared_library",
            "executable",
        ):
            return f"{prefix}{target}{extension}"
        elif type == "none":
            return "%s.stamp" % target
        else:
            raise Exception("Unhandled output type %s" % type)

    def ComputeOutput(self, spec, arch=None):
        """Compute the path for the final output of the spec."""
        type = spec["type"]

        if self.flavor == "win":
            override = self.msvs_settings.GetOutputName(
                self.config_name, self.ExpandSpecial
            )
            if override:
                return override

        if (
            arch is None
            and self.flavor == "mac"
            and type
            in ("static_library", "executable", "shared_library", "loadable_module")
        ):
            filename = self.xcode_settings.GetExecutablePath()
        else:
            filename = self.ComputeOutputFileName(spec, type)

        if arch is None and "product_dir" in spec:
            path = os.path.join(spec["product_dir"], filename)
            return self.ExpandSpecial(path)

        # Some products go into the output root, libraries go into shared library
        # dir, and everything else goes into the normal place.
        type_in_output_root = ["executable", "loadable_module"]
        if self.flavor == "mac" and self.toolset == "target":
            type_in_output_root += ["shared_library", "static_library"]
        elif self.flavor == "win" and self.toolset == "target":
            type_in_output_root += ["shared_library"]

        if arch is not None:
            # Make sure partial executables don't end up in a bundle or the regular
            # output directory.
            archdir = "arch"
            if self.toolset != "target":
                archdir = os.path.join("arch", "%s" % self.toolset)
            return os.path.join(archdir, AddArch(filename, arch))
        elif type in type_in_output_root or self.is_standalone_static_library:
            return filename
        elif type == "shared_library":
            libdir = "lib"
            if self.toolset != "target":
                libdir = os.path.join("lib", "%s" % self.toolset)
            return os.path.join(libdir, filename)
        else:
            return self.GypPathToUniqueOutput(filename, qualified=False)

    def WriteVariableList(self, ninja_file, var, values):
        assert not isinstance(values, str)
        if values is None:
            values = []
        ninja_file.variable(var, " ".join(values))

    def WriteNewNinjaRule(
        self, name, args, description, win_shell_flags, env, pool, depfile=None
    ):
        """Write out a new ninja "rule" statement for a given command.

        Returns the name of the new rule, and a copy of |args| with variables
        expanded."""

        if self.flavor == "win":
            args = [
                self.msvs_settings.ConvertVSMacros(
                    arg, self.base_to_build, config=self.config_name
                )
                for arg in args
            ]
            description = self.msvs_settings.ConvertVSMacros(
                description, config=self.config_name
            )
        elif self.flavor == "mac":
            # |env| is an empty list on non-mac.
            args = [gyp.xcode_emulation.ExpandEnvVars(arg, env) for arg in args]
            description = gyp.xcode_emulation.ExpandEnvVars(description, env)

        # TODO: we shouldn't need to qualify names; we do it because
        # currently the ninja rule namespace is global, but it really
        # should be scoped to the subninja.
        rule_name = self.name
        if self.toolset == "target":
            rule_name += "." + self.toolset
        rule_name += "." + name
        rule_name = re.sub("[^a-zA-Z0-9_]", "_", rule_name)

        # Remove variable references, but not if they refer to the magic rule
        # variables.  This is not quite right, as it also protects these for
        # actions, not just for rules where they are valid. Good enough.
        protect = ["${root}", "${dirname}", "${source}", "${ext}", "${name}"]
        protect = "(?!" + "|".join(map(re.escape, protect)) + ")"
        description = re.sub(protect + r"\$", "_", description)

        # gyp dictates that commands are run from the base directory.
        # cd into the directory before running, and adjust paths in
        # the arguments to point to the proper locations.
        rspfile = None
        rspfile_content = None
        args = [self.ExpandSpecial(arg, self.base_to_build) for arg in args]
        if self.flavor == "win":
            rspfile = rule_name + ".$unique_name.rsp"
            # The cygwin case handles this inside the bash sub-shell.
            run_in = "" if win_shell_flags.cygwin else " " + self.build_to_base
            if win_shell_flags.cygwin:
                rspfile_content = self.msvs_settings.BuildCygwinBashCommandLine(
                    args, self.build_to_base
                )
            else:
                rspfile_content = gyp.msvs_emulation.EncodeRspFileList(
                    args, win_shell_flags.quote)
            command = (
                "%s gyp-win-tool action-wrapper $arch " % sys.executable
                + rspfile
                + run_in
            )
        else:
            env = self.ComputeExportEnvString(env)
            command = gyp.common.EncodePOSIXShellList(args)
            command = "cd %s; " % self.build_to_base + env + command

        # GYP rules/actions express being no-ops by not touching their outputs.
        # Avoid executing downstream dependencies in this case by specifying
        # restat=1 to ninja.
        self.ninja.rule(
            rule_name,
            command,
            description,
            depfile=depfile,
            restat=True,
            pool=pool,
            rspfile=rspfile,
            rspfile_content=rspfile_content,
        )
        self.ninja.newline()

        return rule_name, args


def CalculateVariables(default_variables, params):
    """Calculate additional variables for use in the build (called by gyp)."""
    global generator_additional_non_configuration_keys
    global generator_additional_path_sections
    flavor = gyp.common.GetFlavor(params)
    if flavor == "mac":
        default_variables.setdefault("OS", "mac")
        default_variables.setdefault("SHARED_LIB_SUFFIX", ".dylib")
        default_variables.setdefault(
            "SHARED_LIB_DIR", generator_default_variables["PRODUCT_DIR"]
        )
        default_variables.setdefault(
            "LIB_DIR", generator_default_variables["PRODUCT_DIR"]
        )

        # Copy additional generator configuration data from Xcode, which is shared
        # by the Mac Ninja generator.
        import gyp.generator.xcode as xcode_generator

        generator_additional_non_configuration_keys = getattr(
            xcode_generator, "generator_additional_non_configuration_keys", []
        )
        generator_additional_path_sections = getattr(
            xcode_generator, "generator_additional_path_sections", []
        )
        global generator_extra_sources_for_rules
        generator_extra_sources_for_rules = getattr(
            xcode_generator, "generator_extra_sources_for_rules", []
        )
    elif flavor == "win":
        exts = gyp.MSVSUtil.TARGET_TYPE_EXT
        default_variables.setdefault("OS", "win")
        default_variables["EXECUTABLE_SUFFIX"] = "." + exts["executable"]
        default_variables["STATIC_LIB_PREFIX"] = ""
        default_variables["STATIC_LIB_SUFFIX"] = "." + exts["static_library"]
        default_variables["SHARED_LIB_PREFIX"] = ""
        default_variables["SHARED_LIB_SUFFIX"] = "." + exts["shared_library"]

        # Copy additional generator configuration data from VS, which is shared
        # by the Windows Ninja generator.
        import gyp.generator.msvs as msvs_generator

        generator_additional_non_configuration_keys = getattr(
            msvs_generator, "generator_additional_non_configuration_keys", []
        )
        generator_additional_path_sections = getattr(
            msvs_generator, "generator_additional_path_sections", []
        )

        gyp.msvs_emulation.CalculateCommonVariables(default_variables, params)
    else:
        operating_system = flavor
        if flavor == "android":
            operating_system = "linux"  # Keep this legacy behavior for now.
        default_variables.setdefault("OS", operating_system)
        default_variables.setdefault("SHARED_LIB_SUFFIX", ".so")
        default_variables.setdefault(
            "SHARED_LIB_DIR", os.path.join("$!PRODUCT_DIR", "lib")
        )
        default_variables.setdefault("LIB_DIR", os.path.join("$!PRODUCT_DIR", "obj"))


def ComputeOutputDir(params):
    """Returns the path from the toplevel_dir to the build output directory."""
    # generator_dir: relative path from pwd to where make puts build files.
    # Makes migrating from make to ninja easier, ninja doesn't put anything here.
    generator_dir = os.path.relpath(params["options"].generator_output or ".")

    # output_dir: relative path from generator_dir to the build directory.
    output_dir = params.get("generator_flags", {}).get("output_dir", "out")

    # Relative path from source root to our output files.  e.g. "out"
    return os.path.normpath(os.path.join(generator_dir, output_dir))


def CalculateGeneratorInputInfo(params):
    """Called by __init__ to initialize generator values based on params."""
    # E.g. "out/gypfiles"
    toplevel = params["options"].toplevel_dir
    qualified_out_dir = os.path.normpath(
        os.path.join(toplevel, ComputeOutputDir(params), "gypfiles")
    )

    global generator_filelist_paths
    generator_filelist_paths = {
        "toplevel": toplevel,
        "qualified_out_dir": qualified_out_dir,
    }


def OpenOutput(path, mode="w"):
    """Open |path| for writing, creating directories if necessary."""
    gyp.common.EnsureDirExists(path)
    return open(path, mode)


def CommandWithWrapper(cmd, wrappers, prog):
    wrapper = wrappers.get(cmd, "")
    if wrapper:
        return wrapper + " " + prog
    return prog


def GetDefaultConcurrentLinks():
    """Returns a best-guess for a number of concurrent links."""
    pool_size = int(os.environ.get("GYP_LINK_CONCURRENCY", 0))
    if pool_size:
        return pool_size

    if sys.platform in ("win32", "cygwin"):
        import ctypes

        class MEMORYSTATUSEX(ctypes.Structure):
            _fields_ = [
                ("dwLength", ctypes.c_ulong),
                ("dwMemoryLoad", ctypes.c_ulong),
                ("ullTotalPhys", ctypes.c_ulonglong),
                ("ullAvailPhys", ctypes.c_ulonglong),
                ("ullTotalPageFile", ctypes.c_ulonglong),
                ("ullAvailPageFile", ctypes.c_ulonglong),
                ("ullTotalVirtual", ctypes.c_ulonglong),
                ("ullAvailVirtual", ctypes.c_ulonglong),
                ("sullAvailExtendedVirtual", ctypes.c_ulonglong),
            ]

        stat = MEMORYSTATUSEX()
        stat.dwLength = ctypes.sizeof(stat)
        ctypes.windll.kernel32.GlobalMemoryStatusEx(ctypes.byref(stat))

        # VS 2015 uses 20% more working set than VS 2013 and can consume all RAM
        # on a 64 GB machine.
        mem_limit = max(1, stat.ullTotalPhys // (5 * (2 ** 30)))  # total / 5GB
        hard_cap = max(1, int(os.environ.get("GYP_LINK_CONCURRENCY_MAX", 2 ** 32)))
        return min(mem_limit, hard_cap)
    elif sys.platform.startswith("linux"):
        if os.path.exists("/proc/meminfo"):
            with open("/proc/meminfo") as meminfo:
                memtotal_re = re.compile(r"^MemTotal:\s*(\d*)\s*kB")
                for line in meminfo:
                    match = memtotal_re.match(line)
                    if not match:
                        continue
                    # Allow 8Gb per link on Linux because Gold is quite memory hungry
                    return max(1, int(match.group(1)) // (8 * (2 ** 20)))
        return 1
    elif sys.platform == "darwin":
        try:
            avail_bytes = int(subprocess.check_output(["sysctl", "-n", "hw.memsize"]))
            # A static library debug build of Chromium's unit_tests takes ~2.7GB, so
            # 4GB per ld process allows for some more bloat.
            return max(1, avail_bytes // (4 * (2 ** 30)))  # total / 4GB
        except subprocess.CalledProcessError:
            return 1
    else:
        # TODO(scottmg): Implement this for other platforms.
        return 1


def _GetWinLinkRuleNameSuffix(embed_manifest):
    """Returns the suffix used to select an appropriate linking rule depending on
    whether the manifest embedding is enabled."""
    return "_embed" if embed_manifest else ""


def _AddWinLinkRules(master_ninja, embed_manifest):
    """Adds link rules for Windows platform to |master_ninja|."""

    def FullLinkCommand(ldcmd, out, binary_type):
        resource_name = {"exe": "1", "dll": "2"}[binary_type]
        return (
            "%(python)s gyp-win-tool link-with-manifests $arch %(embed)s "
            '%(out)s "%(ldcmd)s" %(resname)s $mt $rc "$intermediatemanifest" '
            "$manifests"
            % {
                "python": sys.executable,
                "out": out,
                "ldcmd": ldcmd,
                "resname": resource_name,
                "embed": embed_manifest,
            }
        )

    rule_name_suffix = _GetWinLinkRuleNameSuffix(embed_manifest)
    use_separate_mspdbsrv = int(os.environ.get("GYP_USE_SEPARATE_MSPDBSRV", "0")) != 0
    dlldesc = "LINK%s(DLL) $binary" % rule_name_suffix.upper()
    dllcmd = (
        "%s gyp-win-tool link-wrapper $arch %s "
        "$ld /nologo $implibflag /DLL /OUT:$binary "
        "@$binary.rsp" % (sys.executable, use_separate_mspdbsrv)
    )
    dllcmd = FullLinkCommand(dllcmd, "$binary", "dll")
    master_ninja.rule(
        "solink" + rule_name_suffix,
        description=dlldesc,
        command=dllcmd,
        rspfile="$binary.rsp",
        rspfile_content="$libs $in_newline $ldflags",
        restat=True,
        pool="link_pool",
    )
    master_ninja.rule(
        "solink_module" + rule_name_suffix,
        description=dlldesc,
        command=dllcmd,
        rspfile="$binary.rsp",
        rspfile_content="$libs $in_newline $ldflags",
        restat=True,
        pool="link_pool",
    )
    # Note that ldflags goes at the end so that it has the option of
    # overriding default settings earlier in the command line.
    exe_cmd = (
        "%s gyp-win-tool link-wrapper $arch %s "
        "$ld /nologo /OUT:$binary @$binary.rsp"
        % (sys.executable, use_separate_mspdbsrv)
    )
    exe_cmd = FullLinkCommand(exe_cmd, "$binary", "exe")
    master_ninja.rule(
        "link" + rule_name_suffix,
        description="LINK%s $binary" % rule_name_suffix.upper(),
        command=exe_cmd,
        rspfile="$binary.rsp",
        rspfile_content="$in_newline $libs $ldflags",
        pool="link_pool",
    )


def GenerateOutputForConfig(target_list, target_dicts, data, params, config_name):
    options = params["options"]
    flavor = gyp.common.GetFlavor(params)
    generator_flags = params.get("generator_flags", {})

    # build_dir: relative path from source root to our output files.
    # e.g. "out/Debug"
    build_dir = os.path.normpath(os.path.join(ComputeOutputDir(params), config_name))

    toplevel_build = os.path.join(options.toplevel_dir, build_dir)

    master_ninja_file = OpenOutput(os.path.join(toplevel_build, "build.ninja"))
    master_ninja = ninja_syntax.Writer(master_ninja_file, width=120)

    # Put build-time support tools in out/{config_name}.
    gyp.common.CopyTool(flavor, toplevel_build, generator_flags)

    # Grab make settings for CC/CXX.
    # The rules are
    # - The priority from low to high is gcc/g++, the 'make_global_settings' in
    #   gyp, the environment variable.
    # - If there is no 'make_global_settings' for CC.host/CXX.host or
    #   'CC_host'/'CXX_host' environment variable, cc_host/cxx_host should be set
    #   to cc/cxx.
    if flavor == "win":
        ar = "lib.exe"
        # cc and cxx must be set to the correct architecture by overriding with one
        # of cl_x86 or cl_x64 below.
        cc = "UNSET"
        cxx = "UNSET"
        ld = "link.exe"
        ld_host = "$ld"
    else:
        ar = "ar"
        cc = "cc"
        cxx = "c++"
        ld = "$cc"
        ldxx = "$cxx"
        ld_host = "$cc_host"
        ldxx_host = "$cxx_host"

    ar_host = ar
    cc_host = None
    cxx_host = None
    cc_host_global_setting = None
    cxx_host_global_setting = None
    clang_cl = None
    nm = "nm"
    nm_host = "nm"
    readelf = "readelf"
    readelf_host = "readelf"

    build_file, _, _ = gyp.common.ParseQualifiedTarget(target_list[0])
    make_global_settings = data[build_file].get("make_global_settings", [])
    build_to_root = gyp.common.InvertRelativePath(build_dir, options.toplevel_dir)
    wrappers = {}
    for key, value in make_global_settings:
        if key == "AR":
            ar = os.path.join(build_to_root, value)
        if key == "AR.host":
            ar_host = os.path.join(build_to_root, value)
        if key == "CC":
            cc = os.path.join(build_to_root, value)
            if cc.endswith("clang-cl"):
                clang_cl = cc
        if key == "CXX":
            cxx = os.path.join(build_to_root, value)
        if key == "CC.host":
            cc_host = os.path.join(build_to_root, value)
            cc_host_global_setting = value
        if key == "CXX.host":
            cxx_host = os.path.join(build_to_root, value)
            cxx_host_global_setting = value
        if key == "LD":
            ld = os.path.join(build_to_root, value)
        if key == "LD.host":
            ld_host = os.path.join(build_to_root, value)
        if key == "LDXX":
            ldxx = os.path.join(build_to_root, value)
        if key == "LDXX.host":
            ldxx_host = os.path.join(build_to_root, value)
        if key == "NM":
            nm = os.path.join(build_to_root, value)
        if key == "NM.host":
            nm_host = os.path.join(build_to_root, value)
        if key == "READELF":
            readelf = os.path.join(build_to_root, value)
        if key == "READELF.host":
            readelf_host = os.path.join(build_to_root, value)
        if key.endswith("_wrapper"):
            wrappers[key[: -len("_wrapper")]] = os.path.join(build_to_root, value)

    # Support wrappers from environment variables too.
    for key, value in os.environ.items():
        if key.lower().endswith("_wrapper"):
            key_prefix = key[: -len("_wrapper")]
            key_prefix = re.sub(r"\.HOST$", ".host", key_prefix)
            wrappers[key_prefix] = os.path.join(build_to_root, value)

    mac_toolchain_dir = generator_flags.get("mac_toolchain_dir", None)
    if mac_toolchain_dir:
        wrappers["LINK"] = "export DEVELOPER_DIR='%s' &&" % mac_toolchain_dir

    if flavor == "win":
        configs = [
            target_dicts[qualified_target]["configurations"][config_name]
            for qualified_target in target_list
        ]
        shared_system_includes = None
        if not generator_flags.get("ninja_use_custom_environment_files", 0):
            shared_system_includes = gyp.msvs_emulation.ExtractSharedMSVSSystemIncludes(
                configs, generator_flags
            )
        cl_paths = gyp.msvs_emulation.GenerateEnvironmentFiles(
            toplevel_build, generator_flags, shared_system_includes, OpenOutput
        )
        for arch, path in sorted(cl_paths.items()):
            if clang_cl:
                # If we have selected clang-cl, use that instead.
                path = clang_cl
            command = CommandWithWrapper(
                "CC", wrappers, QuoteShellArgument(path, "win")
            )
            if clang_cl:
                # Use clang-cl to cross-compile for x86 or x86_64.
                command += " -m32" if arch == "x86" else " -m64"
            master_ninja.variable("cl_" + arch, command)

    cc = GetEnvironFallback(["CC_target", "CC"], cc)
    master_ninja.variable("cc", CommandWithWrapper("CC", wrappers, cc))
    cxx = GetEnvironFallback(["CXX_target", "CXX"], cxx)
    master_ninja.variable("cxx", CommandWithWrapper("CXX", wrappers, cxx))

    if flavor == "win":
        master_ninja.variable("ld", ld)
        master_ninja.variable("idl", "midl.exe")
        master_ninja.variable("ar", ar)
        master_ninja.variable("rc", "rc.exe")
        master_ninja.variable("ml_x86", "ml.exe")
        master_ninja.variable("ml_x64", "ml64.exe")
        master_ninja.variable("mt", "mt.exe")
    else:
        master_ninja.variable("ld", CommandWithWrapper("LINK", wrappers, ld))
        master_ninja.variable("ldxx", CommandWithWrapper("LINK", wrappers, ldxx))
        master_ninja.variable("ar", GetEnvironFallback(["AR_target", "AR"], ar))
        if flavor != "mac":
            # Mac does not use readelf/nm for .TOC generation, so avoiding polluting
            # the master ninja with extra unused variables.
            master_ninja.variable("nm", GetEnvironFallback(["NM_target", "NM"], nm))
            master_ninja.variable(
                "readelf", GetEnvironFallback(["READELF_target", "READELF"], readelf)
            )

    if generator_supports_multiple_toolsets:
        if not cc_host:
            cc_host = cc
        if not cxx_host:
            cxx_host = cxx

        master_ninja.variable("ar_host", GetEnvironFallback(["AR_host"], ar_host))
        master_ninja.variable("nm_host", GetEnvironFallback(["NM_host"], nm_host))
        master_ninja.variable(
            "readelf_host", GetEnvironFallback(["READELF_host"], readelf_host)
        )
        cc_host = GetEnvironFallback(["CC_host"], cc_host)
        cxx_host = GetEnvironFallback(["CXX_host"], cxx_host)

        # The environment variable could be used in 'make_global_settings', like
        # ['CC.host', '$(CC)'] or ['CXX.host', '$(CXX)'], transform them here.
        if "$(CC)" in cc_host and cc_host_global_setting:
            cc_host = cc_host_global_setting.replace("$(CC)", cc)
        if "$(CXX)" in cxx_host and cxx_host_global_setting:
            cxx_host = cxx_host_global_setting.replace("$(CXX)", cxx)
        master_ninja.variable(
            "cc_host", CommandWithWrapper("CC.host", wrappers, cc_host)
        )
        master_ninja.variable(
            "cxx_host", CommandWithWrapper("CXX.host", wrappers, cxx_host)
        )
        if flavor == "win":
            master_ninja.variable("ld_host", ld_host)
        else:
            master_ninja.variable(
                "ld_host", CommandWithWrapper("LINK", wrappers, ld_host)
            )
            master_ninja.variable(
                "ldxx_host", CommandWithWrapper("LINK", wrappers, ldxx_host)
            )

    master_ninja.newline()

    master_ninja.pool("link_pool", depth=GetDefaultConcurrentLinks())
    master_ninja.newline()

    deps = "msvc" if flavor == "win" else "gcc"

    if flavor != "win":
        master_ninja.rule(
            "cc",
            description="CC $out",
            command=(
                "$cc -MMD -MF $out.d $defines $includes $cflags $cflags_c "
                "$cflags_pch_c -c $in -o $out"
            ),
            depfile="$out.d",
            deps=deps,
        )
        master_ninja.rule(
            "cc_s",
            description="CC $out",
            command=(
                "$cc $defines $includes $cflags $cflags_c "
                "$cflags_pch_c -c $in -o $out"
            ),
        )
        master_ninja.rule(
            "cxx",
            description="CXX $out",
            command=(
                "$cxx -MMD -MF $out.d $defines $includes $cflags $cflags_cc "
                "$cflags_pch_cc -c $in -o $out"
            ),
            depfile="$out.d",
            deps=deps,
        )
    else:
        # TODO(scottmg) Separate pdb names is a test to see if it works around
        # http://crbug.com/142362. It seems there's a race between the creation of
        # the .pdb by the precompiled header step for .cc and the compilation of
        # .c files. This should be handled by mspdbsrv, but rarely errors out with
        #   c1xx : fatal error C1033: cannot open program database
        # By making the rules target separate pdb files this might be avoided.
        cc_command = (
            "ninja -t msvc -e $arch " + "-- "
            "$cc /nologo /showIncludes /FC "
            "@$out.rsp /c $in /Fo$out /Fd$pdbname_c "
        )
        cxx_command = (
            "ninja -t msvc -e $arch " + "-- "
            "$cxx /nologo /showIncludes /FC "
            "@$out.rsp /c $in /Fo$out /Fd$pdbname_cc "
        )
        master_ninja.rule(
            "cc",
            description="CC $out",
            command=cc_command,
            rspfile="$out.rsp",
            rspfile_content="$defines $includes $cflags $cflags_c",
            deps=deps,
        )
        master_ninja.rule(
            "cxx",
            description="CXX $out",
            command=cxx_command,
            rspfile="$out.rsp",
            rspfile_content="$defines $includes $cflags $cflags_cc",
            deps=deps,
        )
        master_ninja.rule(
            "idl",
            description="IDL $in",
            command=(
                "%s gyp-win-tool midl-wrapper $arch $outdir "
                "$tlb $h $dlldata $iid $proxy $in "
                "$midl_includes $idlflags" % sys.executable
            ),
        )
        master_ninja.rule(
            "rc",
            description="RC $in",
            # Note: $in must be last otherwise rc.exe complains.
            command=(
                "%s gyp-win-tool rc-wrapper "
                "$arch $rc $defines $resource_includes $rcflags /fo$out $in"
                % sys.executable
            ),
        )
        master_ninja.rule(
            "asm",
            description="ASM $out",
            command=(
                "%s gyp-win-tool asm-wrapper "
                "$arch $asm $defines $includes $asmflags /c /Fo $out $in"
                % sys.executable
            ),
        )

    if flavor != "mac" and flavor != "win":
        master_ninja.rule(
            "alink",
            description="AR $out",
            command="rm -f $out && $ar rcs $arflags $out $in",
        )
        master_ninja.rule(
            "alink_thin",
            description="AR $out",
            command="rm -f $out && $ar rcsT $arflags $out $in",
        )

        # This allows targets that only need to depend on $lib's API to declare an
        # order-only dependency on $lib.TOC and avoid relinking such downstream
        # dependencies when $lib changes only in non-public ways.
        # The resulting string leaves an uninterpolated %{suffix} which
        # is used in the final substitution below.
        mtime_preserving_solink_base = (
            "if [ ! -e $lib -o ! -e $lib.TOC ]; then "
            "%(solink)s && %(extract_toc)s > $lib.TOC; else "
            "%(solink)s && %(extract_toc)s > $lib.tmp && "
            "if ! cmp -s $lib.tmp $lib.TOC; then mv $lib.tmp $lib.TOC ; "
            "fi; fi"
            % {
                "solink": "$ld -shared $ldflags -o $lib -Wl,-soname=$soname %(suffix)s",
                "extract_toc": (
                    "{ $readelf -d $lib | grep SONAME ; "
                    "$nm -gD -f p $lib | cut -f1-2 -d' '; }"
                ),
            }
        )

        master_ninja.rule(
            "solink",
            description="SOLINK $lib",
            restat=True,
            command=mtime_preserving_solink_base
            % {"suffix": "@$link_file_list"},  # noqa: E501
            rspfile="$link_file_list",
            rspfile_content=(
                "-Wl,--whole-archive $in $solibs -Wl," "--no-whole-archive $libs"
            ),
            pool="link_pool",
        )
        master_ninja.rule(
            "solink_module",
            description="SOLINK(module) $lib",
            restat=True,
            command=mtime_preserving_solink_base % {"suffix": "@$link_file_list"},
            rspfile="$link_file_list",
            rspfile_content="-Wl,--start-group $in $solibs $libs -Wl,--end-group",
            pool="link_pool",
        )
        master_ninja.rule(
            "link",
            description="LINK $out",
            command=(
                "$ld $ldflags -o $out "
                "-Wl,--start-group $in $solibs $libs -Wl,--end-group"
            ),
            pool="link_pool",
        )
    elif flavor == "win":
        master_ninja.rule(
            "alink",
            description="LIB $out",
            command=(
                "%s gyp-win-tool link-wrapper $arch False "
                "$ar /nologo /ignore:4221 /OUT:$out @$out.rsp" % sys.executable
            ),
            rspfile="$out.rsp",
            rspfile_content="$in_newline $libflags",
        )
        _AddWinLinkRules(master_ninja, embed_manifest=True)
        _AddWinLinkRules(master_ninja, embed_manifest=False)
    else:
        master_ninja.rule(
            "objc",
            description="OBJC $out",
            command=(
                "$cc -MMD -MF $out.d $defines $includes $cflags $cflags_objc "
                "$cflags_pch_objc -c $in -o $out"
            ),
            depfile="$out.d",
            deps=deps,
        )
        master_ninja.rule(
            "objcxx",
            description="OBJCXX $out",
            command=(
                "$cxx -MMD -MF $out.d $defines $includes $cflags $cflags_objcc "
                "$cflags_pch_objcc -c $in -o $out"
            ),
            depfile="$out.d",
            deps=deps,
        )
        master_ninja.rule(
            "alink",
            description="LIBTOOL-STATIC $out, POSTBUILDS",
            command="rm -f $out && "
            "./gyp-mac-tool filter-libtool libtool $libtool_flags "
            "-static -o $out $in"
            "$postbuilds",
        )
        master_ninja.rule(
            "lipo",
            description="LIPO $out, POSTBUILDS",
            command="rm -f $out && lipo -create $in -output $out$postbuilds",
        )
        master_ninja.rule(
            "solipo",
            description="SOLIPO $out, POSTBUILDS",
            command=(
                "rm -f $lib $lib.TOC && lipo -create $in -output $lib$postbuilds &&"
                "%(extract_toc)s > $lib.TOC"
                % {
                    "extract_toc": "{ otool -l $lib | grep LC_ID_DYLIB -A 5; "
                    "nm -gP $lib | cut -f1-2 -d' ' | grep -v U$$; true; }"
                }
            ),
        )

        # Record the public interface of $lib in $lib.TOC. See the corresponding
        # comment in the posix section above for details.
        solink_base = "$ld %(type)s $ldflags -o $lib %(suffix)s"
        mtime_preserving_solink_base = (
            "if [ ! -e $lib -o ! -e $lib.TOC ] || "
            # Always force dependent targets to relink if this library
            # reexports something. Handling this correctly would require
            # recursive TOC dumping but this is rare in practice, so punt.
            "otool -l $lib | grep -q LC_REEXPORT_DYLIB ; then "
            "%(solink)s && %(extract_toc)s > $lib.TOC; "
            "else "
            "%(solink)s && %(extract_toc)s > $lib.tmp && "
            "if ! cmp -s $lib.tmp $lib.TOC; then "
            "mv $lib.tmp $lib.TOC ; "
            "fi; "
            "fi"
            % {
                "solink": solink_base,
                "extract_toc": "{ otool -l $lib | grep LC_ID_DYLIB -A 5; "
                "nm -gP $lib | cut -f1-2 -d' ' | grep -v U$$; true; }",
            }
        )

        solink_suffix = "@$link_file_list$postbuilds"
        master_ninja.rule(
            "solink",
            description="SOLINK $lib, POSTBUILDS",
            restat=True,
            command=mtime_preserving_solink_base
            % {"suffix": solink_suffix, "type": "-shared"},
            rspfile="$link_file_list",
            rspfile_content="$in $solibs $libs",
            pool="link_pool",
        )
        master_ninja.rule(
            "solink_notoc",
            description="SOLINK $lib, POSTBUILDS",
            restat=True,
            command=solink_base % {"suffix": solink_suffix, "type": "-shared"},
            rspfile="$link_file_list",
            rspfile_content="$in $solibs $libs",
            pool="link_pool",
        )

        master_ninja.rule(
            "solink_module",
            description="SOLINK(module) $lib, POSTBUILDS",
            restat=True,
            command=mtime_preserving_solink_base
            % {"suffix": solink_suffix, "type": "-bundle"},
            rspfile="$link_file_list",
            rspfile_content="$in $solibs $libs",
            pool="link_pool",
        )
        master_ninja.rule(
            "solink_module_notoc",
            description="SOLINK(module) $lib, POSTBUILDS",
            restat=True,
            command=solink_base % {"suffix": solink_suffix, "type": "-bundle"},
            rspfile="$link_file_list",
            rspfile_content="$in $solibs $libs",
            pool="link_pool",
        )

        master_ninja.rule(
            "link",
            description="LINK $out, POSTBUILDS",
            command=("$ld $ldflags -o $out " "$in $solibs $libs$postbuilds"),
            pool="link_pool",
        )
        master_ninja.rule(
            "preprocess_infoplist",
            description="PREPROCESS INFOPLIST $out",
            command=(
                "$cc -E -P -Wno-trigraphs -x c $defines $in -o $out && "
                "plutil -convert xml1 $out $out"
            ),
        )
        master_ninja.rule(
            "copy_infoplist",
            description="COPY INFOPLIST $in",
            command="$env ./gyp-mac-tool copy-info-plist $in $out $binary $keys",
        )
        master_ninja.rule(
            "merge_infoplist",
            description="MERGE INFOPLISTS $in",
            command="$env ./gyp-mac-tool merge-info-plist $out $in",
        )
        master_ninja.rule(
            "compile_xcassets",
            description="COMPILE XCASSETS $in",
            command="$env ./gyp-mac-tool compile-xcassets $keys $in",
        )
        master_ninja.rule(
            "compile_ios_framework_headers",
            description="COMPILE HEADER MAPS AND COPY FRAMEWORK HEADERS $in",
            command="$env ./gyp-mac-tool compile-ios-framework-header-map $out "
            "$framework $in && $env ./gyp-mac-tool "
            "copy-ios-framework-headers $framework $copy_headers",
        )
        master_ninja.rule(
            "mac_tool",
            description="MACTOOL $mactool_cmd $in",
            command="$env ./gyp-mac-tool $mactool_cmd $in $out $binary",
        )
        master_ninja.rule(
            "package_framework",
            description="PACKAGE FRAMEWORK $out, POSTBUILDS",
            command="./gyp-mac-tool package-framework $out $version$postbuilds "
            "&& touch $out",
        )
        master_ninja.rule(
            "package_ios_framework",
            description="PACKAGE IOS FRAMEWORK $out, POSTBUILDS",
            command="./gyp-mac-tool package-ios-framework $out $postbuilds "
            "&& touch $out",
        )
    if flavor == "win":
        master_ninja.rule(
            "stamp",
            description="STAMP $out",
            command="%s gyp-win-tool stamp $out" % sys.executable,
        )
    else:
        master_ninja.rule(
            "stamp", description="STAMP $out", command="${postbuilds}touch $out"
        )
    if flavor == "win":
        master_ninja.rule(
            "copy",
            description="COPY $in $out",
            command="%s gyp-win-tool recursive-mirror $in $out" % sys.executable,
        )
    elif flavor == "zos":
        master_ninja.rule(
            "copy",
            description="COPY $in $out",
            command="rm -rf $out && cp -fRP $in $out",
        )
    else:
        master_ninja.rule(
            "copy",
            description="COPY $in $out",
            command="ln -f $in $out 2>/dev/null || (rm -rf $out && cp -af $in $out)",
        )
    master_ninja.newline()

    all_targets = set()
    for build_file in params["build_files"]:
        for target in gyp.common.AllTargets(
            target_list, target_dicts, os.path.normpath(build_file)
        ):
            all_targets.add(target)
    all_outputs = set()

    # target_outputs is a map from qualified target name to a Target object.
    target_outputs = {}
    # target_short_names is a map from target short name to a list of Target
    # objects.
    target_short_names = {}

    # short name of targets that were skipped because they didn't contain anything
    # interesting.
    # NOTE: there may be overlap between this an non_empty_target_names.
    empty_target_names = set()

    # Set of non-empty short target names.
    # NOTE: there may be overlap between this an empty_target_names.
    non_empty_target_names = set()

    for qualified_target in target_list:
        # qualified_target is like: third_party/icu/icu.gyp:icui18n#target
        build_file, name, toolset = gyp.common.ParseQualifiedTarget(qualified_target)

        this_make_global_settings = data[build_file].get("make_global_settings", [])
        assert make_global_settings == this_make_global_settings, (
            "make_global_settings needs to be the same for all targets. "
            f"{this_make_global_settings} vs. {make_global_settings}"
        )

        spec = target_dicts[qualified_target]
        if flavor == "mac":
            gyp.xcode_emulation.MergeGlobalXcodeSettingsToSpec(data[build_file], spec)

        # If build_file is a symlink, we must not follow it because there's a chance
        # it could point to a path above toplevel_dir, and we cannot correctly deal
        # with that case at the moment.
        build_file = gyp.common.RelativePath(build_file, options.toplevel_dir, False)

        qualified_target_for_hash = gyp.common.QualifiedTarget(
            build_file, name, toolset
        )
        qualified_target_for_hash = qualified_target_for_hash.encode("utf-8")
        hash_for_rules = hashlib.md5(qualified_target_for_hash).hexdigest()

        base_path = os.path.dirname(build_file)
        obj = "obj"
        if toolset != "target":
            obj += "." + toolset
        output_file = os.path.join(obj, base_path, name + ".ninja")

        ninja_output = StringIO()
        writer = NinjaWriter(
            hash_for_rules,
            target_outputs,
            base_path,
            build_dir,
            ninja_output,
            toplevel_build,
            output_file,
            flavor,
            toplevel_dir=options.toplevel_dir,
        )

        target = writer.WriteSpec(spec, config_name, generator_flags)

        if ninja_output.tell() > 0:
            # Only create files for ninja files that actually have contents.
            with OpenOutput(os.path.join(toplevel_build, output_file)) as ninja_file:
                ninja_file.write(ninja_output.getvalue())
            ninja_output.close()
            master_ninja.subninja(output_file)

        if target:
            if name != target.FinalOutput() and spec["toolset"] == "target":
                target_short_names.setdefault(name, []).append(target)
            target_outputs[qualified_target] = target
            if qualified_target in all_targets:
                all_outputs.add(target.FinalOutput())
            non_empty_target_names.add(name)
        else:
            empty_target_names.add(name)

    if target_short_names:
        # Write a short name to build this target.  This benefits both the
        # "build chrome" case as well as the gyp tests, which expect to be
        # able to run actions and build libraries by their short name.
        master_ninja.newline()
        master_ninja.comment("Short names for targets.")
        for short_name in sorted(target_short_names):
            master_ninja.build(
                short_name,
                "phony",
                [x.FinalOutput() for x in target_short_names[short_name]],
            )

    # Write phony targets for any empty targets that weren't written yet. As
    # short names are  not necessarily unique only do this for short names that
    # haven't already been output for another target.
    empty_target_names = empty_target_names - non_empty_target_names
    if empty_target_names:
        master_ninja.newline()
        master_ninja.comment("Empty targets (output for completeness).")
        for name in sorted(empty_target_names):
            master_ninja.build(name, "phony")

    if all_outputs:
        master_ninja.newline()
        master_ninja.build("all", "phony", sorted(all_outputs))
        master_ninja.default(generator_flags.get("default_target", "all"))

    master_ninja_file.close()


def PerformBuild(data, configurations, params):
    options = params["options"]
    for config in configurations:
        builddir = os.path.join(options.toplevel_dir, "out", config)
        arguments = ["ninja", "-C", builddir]
        print(f"Building [{config}]: {arguments}")
        subprocess.check_call(arguments)


def CallGenerateOutputForConfig(arglist):
    # Ignore the interrupt signal so that the parent process catches it and
    # kills all multiprocessing children.
    signal.signal(signal.SIGINT, signal.SIG_IGN)

    (target_list, target_dicts, data, params, config_name) = arglist
    GenerateOutputForConfig(target_list, target_dicts, data, params, config_name)


def GenerateOutput(target_list, target_dicts, data, params):
    # Update target_dicts for iOS device builds.
    target_dicts = gyp.xcode_emulation.CloneConfigurationForDeviceAndEmulator(
        target_dicts
    )

    user_config = params.get("generator_flags", {}).get("config", None)
    if gyp.common.GetFlavor(params) == "win":
        target_list, target_dicts = MSVSUtil.ShardTargets(target_list, target_dicts)
        target_list, target_dicts = MSVSUtil.InsertLargePdbShims(
            target_list, target_dicts, generator_default_variables
        )

    if user_config:
        GenerateOutputForConfig(target_list, target_dicts, data, params, user_config)
    else:
        config_names = target_dicts[target_list[0]]["configurations"]
        if params["parallel"]:
            try:
                pool = multiprocessing.Pool(len(config_names))
                arglists = []
                for config_name in config_names:
                    arglists.append(
                        (target_list, target_dicts, data, params, config_name)
                    )
                pool.map(CallGenerateOutputForConfig, arglists)
            except KeyboardInterrupt as e:
                pool.terminate()
                raise e
        else:
            for config_name in config_names:
                GenerateOutputForConfig(
                    target_list, target_dicts, data, params, config_name
                )
#!/usr/bin/env python3

# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

""" Unit tests for the ninja.py file. """

import sys
import unittest

import gyp.generator.ninja as ninja


class TestPrefixesAndSuffixes(unittest.TestCase):
    def test_BinaryNamesWindows(self):
        # These cannot run on non-Windows as they require a VS installation to
        # correctly handle variable expansion.
        if sys.platform.startswith("win"):
            writer = ninja.NinjaWriter(
                "foo", "wee", ".", ".", "build.ninja", ".", "build.ninja", "win"
            )
            spec = {"target_name": "wee"}
            self.assertTrue(
                writer.ComputeOutputFileName(spec, "executable").endswith(".exe")
            )
            self.assertTrue(
                writer.ComputeOutputFileName(spec, "shared_library").endswith(".dll")
            )
            self.assertTrue(
                writer.ComputeOutputFileName(spec, "static_library").endswith(".lib")
            )

    def test_BinaryNamesLinux(self):
        writer = ninja.NinjaWriter(
            "foo", "wee", ".", ".", "build.ninja", ".", "build.ninja", "linux"
        )
        spec = {"target_name": "wee"}
        self.assertTrue("." not in writer.ComputeOutputFileName(spec, "executable"))
        self.assertTrue(
            writer.ComputeOutputFileName(spec, "shared_library").startswith("lib")
        )
        self.assertTrue(
            writer.ComputeOutputFileName(spec, "static_library").startswith("lib")
        )
        self.assertTrue(
            writer.ComputeOutputFileName(spec, "shared_library").endswith(".so")
        )
        self.assertTrue(
            writer.ComputeOutputFileName(spec, "static_library").endswith(".a")
        )


if __name__ == "__main__":
    unittest.main()
# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.


import filecmp
import gyp.common
import gyp.xcodeproj_file
import gyp.xcode_ninja
import errno
import os
import sys
import posixpath
import re
import shutil
import subprocess
import tempfile


# Project files generated by this module will use _intermediate_var as a
# custom Xcode setting whose value is a DerivedSources-like directory that's
# project-specific and configuration-specific.  The normal choice,
# DERIVED_FILE_DIR, is target-specific, which is thought to be too restrictive
# as it is likely that multiple targets within a single project file will want
# to access the same set of generated files.  The other option,
# PROJECT_DERIVED_FILE_DIR, is unsuitable because while it is project-specific,
# it is not configuration-specific.  INTERMEDIATE_DIR is defined as
# $(PROJECT_DERIVED_FILE_DIR)/$(CONFIGURATION).
_intermediate_var = "INTERMEDIATE_DIR"

# SHARED_INTERMEDIATE_DIR is the same, except that it is shared among all
# targets that share the same BUILT_PRODUCTS_DIR.
_shared_intermediate_var = "SHARED_INTERMEDIATE_DIR"

_library_search_paths_var = "LIBRARY_SEARCH_PATHS"

generator_default_variables = {
    "EXECUTABLE_PREFIX": "",
    "EXECUTABLE_SUFFIX": "",
    "STATIC_LIB_PREFIX": "lib",
    "SHARED_LIB_PREFIX": "lib",
    "STATIC_LIB_SUFFIX": ".a",
    "SHARED_LIB_SUFFIX": ".dylib",
    # INTERMEDIATE_DIR is a place for targets to build up intermediate products.
    # It is specific to each build environment.  It is only guaranteed to exist
    # and be constant within the context of a project, corresponding to a single
    # input file.  Some build environments may allow their intermediate directory
    # to be shared on a wider scale, but this is not guaranteed.
    "INTERMEDIATE_DIR": "$(%s)" % _intermediate_var,
    "OS": "mac",
    "PRODUCT_DIR": "$(BUILT_PRODUCTS_DIR)",
    "LIB_DIR": "$(BUILT_PRODUCTS_DIR)",
    "RULE_INPUT_ROOT": "$(INPUT_FILE_BASE)",
    "RULE_INPUT_EXT": "$(INPUT_FILE_SUFFIX)",
    "RULE_INPUT_NAME": "$(INPUT_FILE_NAME)",
    "RULE_INPUT_PATH": "$(INPUT_FILE_PATH)",
    "RULE_INPUT_DIRNAME": "$(INPUT_FILE_DIRNAME)",
    "SHARED_INTERMEDIATE_DIR": "$(%s)" % _shared_intermediate_var,
    "CONFIGURATION_NAME": "$(CONFIGURATION)",
}

# The Xcode-specific sections that hold paths.
generator_additional_path_sections = [
    "mac_bundle_resources",
    "mac_framework_headers",
    "mac_framework_private_headers",
    # 'mac_framework_dirs', input already handles _dirs endings.
]

# The Xcode-specific keys that exist on targets and aren't moved down to
# configurations.
generator_additional_non_configuration_keys = [
    "ios_app_extension",
    "ios_watch_app",
    "ios_watchkit_extension",
    "mac_bundle",
    "mac_bundle_resources",
    "mac_framework_headers",
    "mac_framework_private_headers",
    "mac_xctest_bundle",
    "mac_xcuitest_bundle",
    "xcode_create_dependents_test_runner",
]

# We want to let any rules apply to files that are resources also.
generator_extra_sources_for_rules = [
    "mac_bundle_resources",
    "mac_framework_headers",
    "mac_framework_private_headers",
]

generator_filelist_paths = None

# Xcode's standard set of library directories, which don't need to be duplicated
# in LIBRARY_SEARCH_PATHS. This list is not exhaustive, but that's okay.
xcode_standard_library_dirs = frozenset(
    ["$(SDKROOT)/usr/lib", "$(SDKROOT)/usr/local/lib"]
)


def CreateXCConfigurationList(configuration_names):
    xccl = gyp.xcodeproj_file.XCConfigurationList({"buildConfigurations": []})
    if len(configuration_names) == 0:
        configuration_names = ["Default"]
    for configuration_name in configuration_names:
        xcbc = gyp.xcodeproj_file.XCBuildConfiguration({"name": configuration_name})
        xccl.AppendProperty("buildConfigurations", xcbc)
    xccl.SetProperty("defaultConfigurationName", configuration_names[0])
    return xccl


class XcodeProject:
    def __init__(self, gyp_path, path, build_file_dict):
        self.gyp_path = gyp_path
        self.path = path
        self.project = gyp.xcodeproj_file.PBXProject(path=path)
        projectDirPath = gyp.common.RelativePath(
            os.path.dirname(os.path.abspath(self.gyp_path)),
            os.path.dirname(path) or ".",
        )
        self.project.SetProperty("projectDirPath", projectDirPath)
        self.project_file = gyp.xcodeproj_file.XCProjectFile(
            {"rootObject": self.project}
        )
        self.build_file_dict = build_file_dict

        # TODO(mark): add destructor that cleans up self.path if created_dir is
        # True and things didn't complete successfully.  Or do something even
        # better with "try"?
        self.created_dir = False
        try:
            os.makedirs(self.path)
            self.created_dir = True
        except OSError as e:
            if e.errno != errno.EEXIST:
                raise

    def Finalize1(self, xcode_targets, serialize_all_tests):
        # Collect a list of all of the build configuration names used by the
        # various targets in the file.  It is very heavily advised to keep each
        # target in an entire project (even across multiple project files) using
        # the same set of configuration names.
        configurations = []
        for xct in self.project.GetProperty("targets"):
            xccl = xct.GetProperty("buildConfigurationList")
            xcbcs = xccl.GetProperty("buildConfigurations")
            for xcbc in xcbcs:
                name = xcbc.GetProperty("name")
                if name not in configurations:
                    configurations.append(name)

        # Replace the XCConfigurationList attached to the PBXProject object with
        # a new one specifying all of the configuration names used by the various
        # targets.
        try:
            xccl = CreateXCConfigurationList(configurations)
            self.project.SetProperty("buildConfigurationList", xccl)
        except Exception:
            sys.stderr.write("Problem with gyp file %s\n" % self.gyp_path)
            raise

        # The need for this setting is explained above where _intermediate_var is
        # defined.  The comments below about wanting to avoid project-wide build
        # settings apply here too, but this needs to be set on a project-wide basis
        # so that files relative to the _intermediate_var setting can be displayed
        # properly in the Xcode UI.
        #
        # Note that for configuration-relative files such as anything relative to
        # _intermediate_var, for the purposes of UI tree view display, Xcode will
        # only resolve the configuration name once, when the project file is
        # opened.  If the active build configuration is changed, the project file
        # must be closed and reopened if it is desired for the tree view to update.
        # This is filed as Apple radar 6588391.
        xccl.SetBuildSetting(
            _intermediate_var, "$(PROJECT_DERIVED_FILE_DIR)/$(CONFIGURATION)"
        )
        xccl.SetBuildSetting(
            _shared_intermediate_var, "$(SYMROOT)/DerivedSources/$(CONFIGURATION)"
        )

        # Set user-specified project-wide build settings and config files.  This
        # is intended to be used very sparingly.  Really, almost everything should
        # go into target-specific build settings sections.  The project-wide
        # settings are only intended to be used in cases where Xcode attempts to
        # resolve variable references in a project context as opposed to a target
        # context, such as when resolving sourceTree references while building up
        # the tree tree view for UI display.
        # Any values set globally are applied to all configurations, then any
        # per-configuration values are applied.
        for xck, xcv in self.build_file_dict.get("xcode_settings", {}).items():
            xccl.SetBuildSetting(xck, xcv)
        if "xcode_config_file" in self.build_file_dict:
            config_ref = self.project.AddOrGetFileInRootGroup(
                self.build_file_dict["xcode_config_file"]
            )
            xccl.SetBaseConfiguration(config_ref)
        build_file_configurations = self.build_file_dict.get("configurations", {})
        if build_file_configurations:
            for config_name in configurations:
                build_file_configuration_named = build_file_configurations.get(
                    config_name, {}
                )
                if build_file_configuration_named:
                    xcc = xccl.ConfigurationNamed(config_name)
                    for xck, xcv in build_file_configuration_named.get(
                        "xcode_settings", {}
                    ).items():
                        xcc.SetBuildSetting(xck, xcv)
                    if "xcode_config_file" in build_file_configuration_named:
                        config_ref = self.project.AddOrGetFileInRootGroup(
                            build_file_configurations[config_name]["xcode_config_file"]
                        )
                        xcc.SetBaseConfiguration(config_ref)

        # Sort the targets based on how they appeared in the input.
        # TODO(mark): Like a lot of other things here, this assumes internal
        # knowledge of PBXProject - in this case, of its "targets" property.

        # ordinary_targets are ordinary targets that are already in the project
        # file. run_test_targets are the targets that run unittests and should be
        # used for the Run All Tests target.  support_targets are the action/rule
        # targets used by GYP file targets, just kept for the assert check.
        ordinary_targets = []
        run_test_targets = []
        support_targets = []

        # targets is full list of targets in the project.
        targets = []

        # does the it define it's own "all"?
        has_custom_all = False

        # targets_for_all is the list of ordinary_targets that should be listed
        # in this project's "All" target.  It includes each non_runtest_target
        # that does not have suppress_wildcard set.
        targets_for_all = []

        for target in self.build_file_dict["targets"]:
            target_name = target["target_name"]
            toolset = target["toolset"]
            qualified_target = gyp.common.QualifiedTarget(
                self.gyp_path, target_name, toolset
            )
            xcode_target = xcode_targets[qualified_target]
            # Make sure that the target being added to the sorted list is already in
            # the unsorted list.
            assert xcode_target in self.project._properties["targets"]
            targets.append(xcode_target)
            ordinary_targets.append(xcode_target)
            if xcode_target.support_target:
                support_targets.append(xcode_target.support_target)
                targets.append(xcode_target.support_target)

            if not int(target.get("suppress_wildcard", False)):
                targets_for_all.append(xcode_target)

            if target_name.lower() == "all":
                has_custom_all = True

            # If this target has a 'run_as' attribute, add its target to the
            # targets, and add it to the test targets.
            if target.get("run_as"):
                # Make a target to run something.  It should have one
                # dependency, the parent xcode target.
                xccl = CreateXCConfigurationList(configurations)
                run_target = gyp.xcodeproj_file.PBXAggregateTarget(
                    {
                        "name": "Run " + target_name,
                        "productName": xcode_target.GetProperty("productName"),
                        "buildConfigurationList": xccl,
                    },
                    parent=self.project,
                )
                run_target.AddDependency(xcode_target)

                command = target["run_as"]
                script = ""
                if command.get("working_directory"):
                    script = (
                        script
                        + 'cd "%s"\n'
                        % gyp.xcodeproj_file.ConvertVariablesToShellSyntax(
                            command.get("working_directory")
                        )
                    )

                if command.get("environment"):
                    script = (
                        script
                        + "\n".join(
                            [
                                'export %s="%s"'
                                % (
                                    key,
                                    gyp.xcodeproj_file.ConvertVariablesToShellSyntax(
                                        val
                                    ),
                                )
                                for (key, val) in command.get("environment").items()
                            ]
                        )
                        + "\n"
                    )

                # Some test end up using sockets, files on disk, etc. and can get
                # confused if more then one test runs at a time.  The generator
                # flag 'xcode_serialize_all_test_runs' controls the forcing of all
                # tests serially.  It defaults to True.  To get serial runs this
                # little bit of python does the same as the linux flock utility to
                # make sure only one runs at a time.
                command_prefix = ""
                if serialize_all_tests:
                    command_prefix = """python -c "import fcntl, subprocess, sys
file = open('$TMPDIR/GYP_serialize_test_runs', 'a')
fcntl.flock(file.fileno(), fcntl.LOCK_EX)
sys.exit(subprocess.call(sys.argv[1:]))" """

                # If we were unable to exec for some reason, we want to exit
                # with an error, and fixup variable references to be shell
                # syntax instead of xcode syntax.
                script = (
                    script
                    + "exec "
                    + command_prefix
                    + "%s\nexit 1\n"
                    % gyp.xcodeproj_file.ConvertVariablesToShellSyntax(
                        gyp.common.EncodePOSIXShellList(command.get("action"))
                    )
                )

                ssbp = gyp.xcodeproj_file.PBXShellScriptBuildPhase(
                    {"shellScript": script, "showEnvVarsInLog": 0}
                )
                run_target.AppendProperty("buildPhases", ssbp)

                # Add the run target to the project file.
                targets.append(run_target)
                run_test_targets.append(run_target)
                xcode_target.test_runner = run_target

        # Make sure that the list of targets being replaced is the same length as
        # the one replacing it, but allow for the added test runner targets.
        assert len(self.project._properties["targets"]) == len(ordinary_targets) + len(
            support_targets
        )

        self.project._properties["targets"] = targets

        # Get rid of unnecessary levels of depth in groups like the Source group.
        self.project.RootGroupsTakeOverOnlyChildren(True)

        # Sort the groups nicely.  Do this after sorting the targets, because the
        # Products group is sorted based on the order of the targets.
        self.project.SortGroups()

        # Create an "All" target if there's more than one target in this project
        # file and the project didn't define its own "All" target.  Put a generated
        # "All" target first so that people opening up the project for the first
        # time will build everything by default.
        if len(targets_for_all) > 1 and not has_custom_all:
            xccl = CreateXCConfigurationList(configurations)
            all_target = gyp.xcodeproj_file.PBXAggregateTarget(
                {"buildConfigurationList": xccl, "name": "All"}, parent=self.project
            )

            for target in targets_for_all:
                all_target.AddDependency(target)

            # TODO(mark): This is evil because it relies on internal knowledge of
            # PBXProject._properties.  It's important to get the "All" target first,
            # though.
            self.project._properties["targets"].insert(0, all_target)

        # The same, but for run_test_targets.
        if len(run_test_targets) > 1:
            xccl = CreateXCConfigurationList(configurations)
            run_all_tests_target = gyp.xcodeproj_file.PBXAggregateTarget(
                {"buildConfigurationList": xccl, "name": "Run All Tests"},
                parent=self.project,
            )
            for run_test_target in run_test_targets:
                run_all_tests_target.AddDependency(run_test_target)

            # Insert after the "All" target, which must exist if there is more than
            # one run_test_target.
            self.project._properties["targets"].insert(1, run_all_tests_target)

    def Finalize2(self, xcode_targets, xcode_target_to_target_dict):
        # Finalize2 needs to happen in a separate step because the process of
        # updating references to other projects depends on the ordering of targets
        # within remote project files.  Finalize1 is responsible for sorting duty,
        # and once all project files are sorted, Finalize2 can come in and update
        # these references.

        # To support making a "test runner" target that will run all the tests
        # that are direct dependents of any given target, we look for
        # xcode_create_dependents_test_runner being set on an Aggregate target,
        # and generate a second target that will run the tests runners found under
        # the marked target.
        for bf_tgt in self.build_file_dict["targets"]:
            if int(bf_tgt.get("xcode_create_dependents_test_runner", 0)):
                tgt_name = bf_tgt["target_name"]
                toolset = bf_tgt["toolset"]
                qualified_target = gyp.common.QualifiedTarget(
                    self.gyp_path, tgt_name, toolset
                )
                xcode_target = xcode_targets[qualified_target]
                if isinstance(xcode_target, gyp.xcodeproj_file.PBXAggregateTarget):
                    # Collect all the run test targets.
                    all_run_tests = []
                    pbxtds = xcode_target.GetProperty("dependencies")
                    for pbxtd in pbxtds:
                        pbxcip = pbxtd.GetProperty("targetProxy")
                        dependency_xct = pbxcip.GetProperty("remoteGlobalIDString")
                        if hasattr(dependency_xct, "test_runner"):
                            all_run_tests.append(dependency_xct.test_runner)

                    # Directly depend on all the runners as they depend on the target
                    # that builds them.
                    if len(all_run_tests) > 0:
                        run_all_target = gyp.xcodeproj_file.PBXAggregateTarget(
                            {
                                "name": "Run %s Tests" % tgt_name,
                                "productName": tgt_name,
                            },
                            parent=self.project,
                        )
                        for run_test_target in all_run_tests:
                            run_all_target.AddDependency(run_test_target)

                        # Insert the test runner after the related target.
                        idx = self.project._properties["targets"].index(xcode_target)
                        self.project._properties["targets"].insert(
                            idx + 1, run_all_target
                        )

        # Update all references to other projects, to make sure that the lists of
        # remote products are complete.  Otherwise, Xcode will fill them in when
        # it opens the project file, which will result in unnecessary diffs.
        # TODO(mark): This is evil because it relies on internal knowledge of
        # PBXProject._other_pbxprojects.
        for other_pbxproject in self.project._other_pbxprojects.keys():
            self.project.AddOrGetProjectReference(other_pbxproject)

        self.project.SortRemoteProductReferences()

        # Give everything an ID.
        self.project_file.ComputeIDs()

        # Make sure that no two objects in the project file have the same ID.  If
        # multiple objects wind up with the same ID, upon loading the file, Xcode
        # will only recognize one object (the last one in the file?) and the
        # results are unpredictable.
        self.project_file.EnsureNoIDCollisions()

    def Write(self):
        # Write the project file to a temporary location first.  Xcode watches for
        # changes to the project file and presents a UI sheet offering to reload
        # the project when it does change.  However, in some cases, especially when
        # multiple projects are open or when Xcode is busy, things don't work so
        # seamlessly.  Sometimes, Xcode is able to detect that a project file has
        # changed but can't unload it because something else is referencing it.
        # To mitigate this problem, and to avoid even having Xcode present the UI
        # sheet when an open project is rewritten for inconsequential changes, the
        # project file is written to a temporary file in the xcodeproj directory
        # first.  The new temporary file is then compared to the existing project
        # file, if any.  If they differ, the new file replaces the old; otherwise,
        # the new project file is simply deleted.  Xcode properly detects a file
        # being renamed over an open project file as a change and so it remains
        # able to present the "project file changed" sheet under this system.
        # Writing to a temporary file first also avoids the possible problem of
        # Xcode rereading an incomplete project file.
        (output_fd, new_pbxproj_path) = tempfile.mkstemp(
            suffix=".tmp", prefix="project.pbxproj.gyp.", dir=self.path
        )

        try:
            output_file = os.fdopen(output_fd, "w")

            self.project_file.Print(output_file)
            output_file.close()

            pbxproj_path = os.path.join(self.path, "project.pbxproj")

            same = False
            try:
                same = filecmp.cmp(pbxproj_path, new_pbxproj_path, False)
            except OSError as e:
                if e.errno != errno.ENOENT:
                    raise

            if same:
                # The new file is identical to the old one, just get rid of the new
                # one.
                os.unlink(new_pbxproj_path)
            else:
                # The new file is different from the old one, or there is no old one.
                # Rename the new file to the permanent name.
                #
                # tempfile.mkstemp uses an overly restrictive mode, resulting in a
                # file that can only be read by the owner, regardless of the umask.
                # There's no reason to not respect the umask here, which means that
                # an extra hoop is required to fetch it and reset the new file's mode.
                #
                # No way to get the umask without setting a new one?  Set a safe one
                # and then set it back to the old value.
                umask = os.umask(0o77)
                os.umask(umask)

                os.chmod(new_pbxproj_path, 0o666 & ~umask)
                os.rename(new_pbxproj_path, pbxproj_path)

        except Exception:
            # Don't leave turds behind.  In fact, if this code was responsible for
            # creating the xcodeproj directory, get rid of that too.
            os.unlink(new_pbxproj_path)
            if self.created_dir:
                shutil.rmtree(self.path, True)
            raise


def AddSourceToTarget(source, type, pbxp, xct):
    # TODO(mark): Perhaps source_extensions and library_extensions can be made a
    # little bit fancier.
    source_extensions = ["c", "cc", "cpp", "cxx", "m", "mm", "s", "swift"]

    # .o is conceptually more of a "source" than a "library," but Xcode thinks
    # of "sources" as things to compile and "libraries" (or "frameworks") as
    # things to link with. Adding an object file to an Xcode target's frameworks
    # phase works properly.
    library_extensions = ["a", "dylib", "framework", "o"]

    basename = posixpath.basename(source)
    (root, ext) = posixpath.splitext(basename)
    if ext:
        ext = ext[1:].lower()

    if ext in source_extensions and type != "none":
        xct.SourcesPhase().AddFile(source)
    elif ext in library_extensions and type != "none":
        xct.FrameworksPhase().AddFile(source)
    else:
        # Files that aren't added to a sources or frameworks build phase can still
        # go into the project file, just not as part of a build phase.
        pbxp.AddOrGetFileInRootGroup(source)


def AddResourceToTarget(resource, pbxp, xct):
    # TODO(mark): Combine with AddSourceToTarget above?  Or just inline this call
    # where it's used.
    xct.ResourcesPhase().AddFile(resource)


def AddHeaderToTarget(header, pbxp, xct, is_public):
    # TODO(mark): Combine with AddSourceToTarget above?  Or just inline this call
    # where it's used.
    settings = "{ATTRIBUTES = (%s, ); }" % ("Private", "Public")[is_public]
    xct.HeadersPhase().AddFile(header, settings)


_xcode_variable_re = re.compile(r"(\$\((.*?)\))")


def ExpandXcodeVariables(string, expansions):
    """Expands Xcode-style $(VARIABLES) in string per the expansions dict.

  In some rare cases, it is appropriate to expand Xcode variables when a
  project file is generated.  For any substring $(VAR) in string, if VAR is a
  key in the expansions dict, $(VAR) will be replaced with expansions[VAR].
  Any $(VAR) substring in string for which VAR is not a key in the expansions
  dict will remain in the returned string.
  """

    matches = _xcode_variable_re.findall(string)
    if matches is None:
        return string

    matches.reverse()
    for match in matches:
        (to_replace, variable) = match
        if variable not in expansions:
            continue

        replacement = expansions[variable]
        string = re.sub(re.escape(to_replace), replacement, string)

    return string


_xcode_define_re = re.compile(r"([\\\"\' ])")


def EscapeXcodeDefine(s):
    """We must escape the defines that we give to XCode so that it knows not to
     split on spaces and to respect backslash and quote literals. However, we
     must not quote the define, or Xcode will incorrectly interpret variables
     especially $(inherited)."""
    return re.sub(_xcode_define_re, r"\\\1", s)


def PerformBuild(data, configurations, params):
    options = params["options"]

    for build_file, build_file_dict in data.items():
        (build_file_root, build_file_ext) = os.path.splitext(build_file)
        if build_file_ext != ".gyp":
            continue
        xcodeproj_path = build_file_root + options.suffix + ".xcodeproj"
        if options.generator_output:
            xcodeproj_path = os.path.join(options.generator_output, xcodeproj_path)

    for config in configurations:
        arguments = ["xcodebuild", "-project", xcodeproj_path]
        arguments += ["-configuration", config]
        print(f"Building [{config}]: {arguments}")
        subprocess.check_call(arguments)


def CalculateGeneratorInputInfo(params):
    toplevel = params["options"].toplevel_dir
    if params.get("flavor") == "ninja":
        generator_dir = os.path.relpath(params["options"].generator_output or ".")
        output_dir = params.get("generator_flags", {}).get("output_dir", "out")
        output_dir = os.path.normpath(os.path.join(generator_dir, output_dir))
        qualified_out_dir = os.path.normpath(
            os.path.join(toplevel, output_dir, "gypfiles-xcode-ninja")
        )
    else:
        output_dir = os.path.normpath(os.path.join(toplevel, "xcodebuild"))
        qualified_out_dir = os.path.normpath(
            os.path.join(toplevel, output_dir, "gypfiles")
        )

    global generator_filelist_paths
    generator_filelist_paths = {
        "toplevel": toplevel,
        "qualified_out_dir": qualified_out_dir,
    }


def GenerateOutput(target_list, target_dicts, data, params):
    # Optionally configure each spec to use ninja as the external builder.
    ninja_wrapper = params.get("flavor") == "ninja"
    if ninja_wrapper:
        (target_list, target_dicts, data) = gyp.xcode_ninja.CreateWrapper(
            target_list, target_dicts, data, params
        )

    options = params["options"]
    generator_flags = params.get("generator_flags", {})
    parallel_builds = generator_flags.get("xcode_parallel_builds", True)
    serialize_all_tests = generator_flags.get("xcode_serialize_all_test_runs", True)
    upgrade_check_project_version = generator_flags.get(
        "xcode_upgrade_check_project_version", None
    )

    # Format upgrade_check_project_version with leading zeros as needed.
    if upgrade_check_project_version:
        upgrade_check_project_version = str(upgrade_check_project_version)
        while len(upgrade_check_project_version) < 4:
            upgrade_check_project_version = "0" + upgrade_check_project_version

    skip_excluded_files = not generator_flags.get("xcode_list_excluded_files", True)
    xcode_projects = {}
    for build_file, build_file_dict in data.items():
        (build_file_root, build_file_ext) = os.path.splitext(build_file)
        if build_file_ext != ".gyp":
            continue
        xcodeproj_path = build_file_root + options.suffix + ".xcodeproj"
        if options.generator_output:
            xcodeproj_path = os.path.join(options.generator_output, xcodeproj_path)
        xcp = XcodeProject(build_file, xcodeproj_path, build_file_dict)
        xcode_projects[build_file] = xcp
        pbxp = xcp.project

        # Set project-level attributes from multiple options
        project_attributes = {}
        if parallel_builds:
            project_attributes["BuildIndependentTargetsInParallel"] = "YES"
        if upgrade_check_project_version:
            project_attributes["LastUpgradeCheck"] = upgrade_check_project_version
            project_attributes[
                "LastTestingUpgradeCheck"
            ] = upgrade_check_project_version
            project_attributes["LastSwiftUpdateCheck"] = upgrade_check_project_version
        pbxp.SetProperty("attributes", project_attributes)

        # Add gyp/gypi files to project
        if not generator_flags.get("standalone"):
            main_group = pbxp.GetProperty("mainGroup")
            build_group = gyp.xcodeproj_file.PBXGroup({"name": "Build"})
            main_group.AppendChild(build_group)
            for included_file in build_file_dict["included_files"]:
                build_group.AddOrGetFileByPath(included_file, False)

    xcode_targets = {}
    xcode_target_to_target_dict = {}
    for qualified_target in target_list:
        [build_file, target_name, toolset] = gyp.common.ParseQualifiedTarget(
            qualified_target
        )

        spec = target_dicts[qualified_target]
        if spec["toolset"] != "target":
            raise Exception(
                "Multiple toolsets not supported in xcode build (target %s)"
                % qualified_target
            )
        configuration_names = [spec["default_configuration"]]
        for configuration_name in sorted(spec["configurations"].keys()):
            if configuration_name not in configuration_names:
                configuration_names.append(configuration_name)
        xcp = xcode_projects[build_file]
        pbxp = xcp.project

        # Set up the configurations for the target according to the list of names
        # supplied.
        xccl = CreateXCConfigurationList(configuration_names)

        # Create an XCTarget subclass object for the target. The type with
        # "+bundle" appended will be used if the target has "mac_bundle" set.
        # loadable_modules not in a mac_bundle are mapped to
        # com.googlecode.gyp.xcode.bundle, a pseudo-type that xcode.py interprets
        # to create a single-file mh_bundle.
        _types = {
            "executable": "com.apple.product-type.tool",
            "loadable_module": "com.googlecode.gyp.xcode.bundle",
            "shared_library": "com.apple.product-type.library.dynamic",
            "static_library": "com.apple.product-type.library.static",
            "mac_kernel_extension": "com.apple.product-type.kernel-extension",
            "executable+bundle": "com.apple.product-type.application",
            "loadable_module+bundle": "com.apple.product-type.bundle",
            "loadable_module+xctest": "com.apple.product-type.bundle.unit-test",
            "loadable_module+xcuitest": "com.apple.product-type.bundle.ui-testing",
            "shared_library+bundle": "com.apple.product-type.framework",
            "executable+extension+bundle": "com.apple.product-type.app-extension",
            "executable+watch+extension+bundle":
                "com.apple.product-type.watchkit-extension",
            "executable+watch+bundle": "com.apple.product-type.application.watchapp",
            "mac_kernel_extension+bundle": "com.apple.product-type.kernel-extension",
        }

        target_properties = {
            "buildConfigurationList": xccl,
            "name": target_name,
        }

        type = spec["type"]
        is_xctest = int(spec.get("mac_xctest_bundle", 0))
        is_xcuitest = int(spec.get("mac_xcuitest_bundle", 0))
        is_bundle = int(spec.get("mac_bundle", 0)) or is_xctest
        is_app_extension = int(spec.get("ios_app_extension", 0))
        is_watchkit_extension = int(spec.get("ios_watchkit_extension", 0))
        is_watch_app = int(spec.get("ios_watch_app", 0))
        if type != "none":
            type_bundle_key = type
            if is_xcuitest:
                type_bundle_key += "+xcuitest"
                assert type == "loadable_module", (
                    "mac_xcuitest_bundle targets must have type loadable_module "
                    "(target %s)" % target_name
                )
            elif is_xctest:
                type_bundle_key += "+xctest"
                assert type == "loadable_module", (
                    "mac_xctest_bundle targets must have type loadable_module "
                    "(target %s)" % target_name
                )
            elif is_app_extension:
                assert is_bundle, (
                    "ios_app_extension flag requires mac_bundle "
                    "(target %s)" % target_name
                )
                type_bundle_key += "+extension+bundle"
            elif is_watchkit_extension:
                assert is_bundle, (
                    "ios_watchkit_extension flag requires mac_bundle "
                    "(target %s)" % target_name
                )
                type_bundle_key += "+watch+extension+bundle"
            elif is_watch_app:
                assert is_bundle, (
                    "ios_watch_app flag requires mac_bundle "
                    "(target %s)" % target_name
                )
                type_bundle_key += "+watch+bundle"
            elif is_bundle:
                type_bundle_key += "+bundle"

            xctarget_type = gyp.xcodeproj_file.PBXNativeTarget
            try:
                target_properties["productType"] = _types[type_bundle_key]
            except KeyError as e:
                gyp.common.ExceptionAppend(
                    e,
                    "-- unknown product type while " "writing target %s" % target_name,
                )
                raise
        else:
            xctarget_type = gyp.xcodeproj_file.PBXAggregateTarget
            assert not is_bundle, (
                'mac_bundle targets cannot have type none (target "%s")' % target_name
            )
            assert not is_xcuitest, (
                'mac_xcuitest_bundle targets cannot have type none (target "%s")'
                % target_name
            )
            assert not is_xctest, (
                'mac_xctest_bundle targets cannot have type none (target "%s")'
                % target_name
            )

        target_product_name = spec.get("product_name")
        if target_product_name is not None:
            target_properties["productName"] = target_product_name

        xct = xctarget_type(
            target_properties,
            parent=pbxp,
            force_outdir=spec.get("product_dir"),
            force_prefix=spec.get("product_prefix"),
            force_extension=spec.get("product_extension"),
        )
        pbxp.AppendProperty("targets", xct)
        xcode_targets[qualified_target] = xct
        xcode_target_to_target_dict[xct] = spec

        spec_actions = spec.get("actions", [])
        spec_rules = spec.get("rules", [])

        # Xcode has some "issues" with checking dependencies for the "Compile
        # sources" step with any source files/headers generated by actions/rules.
        # To work around this, if a target is building anything directly (not
        # type "none"), then a second target is used to run the GYP actions/rules
        # and is made a dependency of this target.  This way the work is done
        # before the dependency checks for what should be recompiled.
        support_xct = None
        # The Xcode "issues" don't affect xcode-ninja builds, since the dependency
        # logic all happens in ninja.  Don't bother creating the extra targets in
        # that case.
        if type != "none" and (spec_actions or spec_rules) and not ninja_wrapper:
            support_xccl = CreateXCConfigurationList(configuration_names)
            support_target_suffix = generator_flags.get(
                "support_target_suffix", " Support"
            )
            support_target_properties = {
                "buildConfigurationList": support_xccl,
                "name": target_name + support_target_suffix,
            }
            if target_product_name:
                support_target_properties["productName"] = (
                    target_product_name + " Support"
                )
            support_xct = gyp.xcodeproj_file.PBXAggregateTarget(
                support_target_properties, parent=pbxp
            )
            pbxp.AppendProperty("targets", support_xct)
            xct.AddDependency(support_xct)
        # Hang the support target off the main target so it can be tested/found
        # by the generator during Finalize.
        xct.support_target = support_xct

        prebuild_index = 0

        # Add custom shell script phases for "actions" sections.
        for action in spec_actions:
            # There's no need to write anything into the script to ensure that the
            # output directories already exist, because Xcode will look at the
            # declared outputs and automatically ensure that they exist for us.

            # Do we have a message to print when this action runs?
            message = action.get("message")
            if message:
                message = "echo note: " + gyp.common.EncodePOSIXShellArgument(message)
            else:
                message = ""

            # Turn the list into a string that can be passed to a shell.
            action_string = gyp.common.EncodePOSIXShellList(action["action"])

            # Convert Xcode-type variable references to sh-compatible environment
            # variable references.
            message_sh = gyp.xcodeproj_file.ConvertVariablesToShellSyntax(message)
            action_string_sh = gyp.xcodeproj_file.ConvertVariablesToShellSyntax(
                action_string
            )

            script = ""
            # Include the optional message
            if message_sh:
                script += message_sh + "\n"
            # Be sure the script runs in exec, and that if exec fails, the script
            # exits signalling an error.
            script += "exec " + action_string_sh + "\nexit 1\n"
            ssbp = gyp.xcodeproj_file.PBXShellScriptBuildPhase(
                {
                    "inputPaths": action["inputs"],
                    "name": 'Action "' + action["action_name"] + '"',
                    "outputPaths": action["outputs"],
                    "shellScript": script,
                    "showEnvVarsInLog": 0,
                }
            )

            if support_xct:
                support_xct.AppendProperty("buildPhases", ssbp)
            else:
                # TODO(mark): this assumes too much knowledge of the internals of
                # xcodeproj_file; some of these smarts should move into xcodeproj_file
                # itself.
                xct._properties["buildPhases"].insert(prebuild_index, ssbp)
                prebuild_index = prebuild_index + 1

            # TODO(mark): Should verify that at most one of these is specified.
            if int(action.get("process_outputs_as_sources", False)):
                for output in action["outputs"]:
                    AddSourceToTarget(output, type, pbxp, xct)

            if int(action.get("process_outputs_as_mac_bundle_resources", False)):
                for output in action["outputs"]:
                    AddResourceToTarget(output, pbxp, xct)

        # tgt_mac_bundle_resources holds the list of bundle resources so
        # the rule processing can check against it.
        if is_bundle:
            tgt_mac_bundle_resources = spec.get("mac_bundle_resources", [])
        else:
            tgt_mac_bundle_resources = []

        # Add custom shell script phases driving "make" for "rules" sections.
        #
        # Xcode's built-in rule support is almost powerful enough to use directly,
        # but there are a few significant deficiencies that render them unusable.
        # There are workarounds for some of its inadequacies, but in aggregate,
        # the workarounds added complexity to the generator, and some workarounds
        # actually require input files to be crafted more carefully than I'd like.
        # Consequently, until Xcode rules are made more capable, "rules" input
        # sections will be handled in Xcode output by shell script build phases
        # performed prior to the compilation phase.
        #
        # The following problems with Xcode rules were found.  The numbers are
        # Apple radar IDs.  I hope that these shortcomings are addressed, I really
        # liked having the rules handled directly in Xcode during the period that
        # I was prototyping this.
        #
        # 6588600 Xcode compiles custom script rule outputs too soon, compilation
        #         fails.  This occurs when rule outputs from distinct inputs are
        #         interdependent.  The only workaround is to put rules and their
        #         inputs in a separate target from the one that compiles the rule
        #         outputs.  This requires input file cooperation and it means that
        #         process_outputs_as_sources is unusable.
        # 6584932 Need to declare that custom rule outputs should be excluded from
        #         compilation.  A possible workaround is to lie to Xcode about a
        #         rule's output, giving it a dummy file it doesn't know how to
        #         compile.  The rule action script would need to touch the dummy.
        # 6584839 I need a way to declare additional inputs to a custom rule.
        #         A possible workaround is a shell script phase prior to
        #         compilation that touches a rule's primary input files if any
        #         would-be additional inputs are newer than the output.  Modifying
        #         the source tree - even just modification times - feels dirty.
        # 6564240 Xcode "custom script" build rules always dump all environment
        #         variables.  This is a low-prioroty problem and is not a
        #         show-stopper.
        rules_by_ext = {}
        for rule in spec_rules:
            rules_by_ext[rule["extension"]] = rule

            # First, some definitions:
            #
            # A "rule source" is a file that was listed in a target's "sources"
            # list and will have a rule applied to it on the basis of matching the
            # rule's "extensions" attribute.  Rule sources are direct inputs to
            # rules.
            #
            # Rule definitions may specify additional inputs in their "inputs"
            # attribute.  These additional inputs are used for dependency tracking
            # purposes.
            #
            # A "concrete output" is a rule output with input-dependent variables
            # resolved.  For example, given a rule with:
            #   'extension': 'ext', 'outputs': ['$(INPUT_FILE_BASE).cc'],
            # if the target's "sources" list contained "one.ext" and "two.ext",
            # the "concrete output" for rule input "two.ext" would be "two.cc".  If
            # a rule specifies multiple outputs, each input file that the rule is
            # applied to will have the same number of concrete outputs.
            #
            # If any concrete outputs are outdated or missing relative to their
            # corresponding rule_source or to any specified additional input, the
            # rule action must be performed to generate the concrete outputs.

            # concrete_outputs_by_rule_source will have an item at the same index
            # as the rule['rule_sources'] that it corresponds to.  Each item is a
            # list of all of the concrete outputs for the rule_source.
            concrete_outputs_by_rule_source = []

            # concrete_outputs_all is a flat list of all concrete outputs that this
            # rule is able to produce, given the known set of input files
            # (rule_sources) that apply to it.
            concrete_outputs_all = []

            # messages & actions are keyed by the same indices as rule['rule_sources']
            # and concrete_outputs_by_rule_source.  They contain the message and
            # action to perform after resolving input-dependent variables.  The
            # message is optional, in which case None is stored for each rule source.
            messages = []
            actions = []

            for rule_source in rule.get("rule_sources", []):
                rule_source_dirname, rule_source_basename = posixpath.split(rule_source)
                (rule_source_root, rule_source_ext) = posixpath.splitext(
                    rule_source_basename
                )

                # These are the same variable names that Xcode uses for its own native
                # rule support.  Because Xcode's rule engine is not being used, they
                # need to be expanded as they are written to the makefile.
                rule_input_dict = {
                    "INPUT_FILE_BASE": rule_source_root,
                    "INPUT_FILE_SUFFIX": rule_source_ext,
                    "INPUT_FILE_NAME": rule_source_basename,
                    "INPUT_FILE_PATH": rule_source,
                    "INPUT_FILE_DIRNAME": rule_source_dirname,
                }

                concrete_outputs_for_this_rule_source = []
                for output in rule.get("outputs", []):
                    # Fortunately, Xcode and make both use $(VAR) format for their
                    # variables, so the expansion is the only transformation necessary.
                    # Any remaining $(VAR)-type variables in the string can be given
                    # directly to make, which will pick up the correct settings from
                    # what Xcode puts into the environment.
                    concrete_output = ExpandXcodeVariables(output, rule_input_dict)
                    concrete_outputs_for_this_rule_source.append(concrete_output)

                    # Add all concrete outputs to the project.
                    pbxp.AddOrGetFileInRootGroup(concrete_output)

                concrete_outputs_by_rule_source.append(
                    concrete_outputs_for_this_rule_source
                )
                concrete_outputs_all.extend(concrete_outputs_for_this_rule_source)

                # TODO(mark): Should verify that at most one of these is specified.
                if int(rule.get("process_outputs_as_sources", False)):
                    for output in concrete_outputs_for_this_rule_source:
                        AddSourceToTarget(output, type, pbxp, xct)

                # If the file came from the mac_bundle_resources list or if the rule
                # is marked to process outputs as bundle resource, do so.
                was_mac_bundle_resource = rule_source in tgt_mac_bundle_resources
                if was_mac_bundle_resource or int(
                    rule.get("process_outputs_as_mac_bundle_resources", False)
                ):
                    for output in concrete_outputs_for_this_rule_source:
                        AddResourceToTarget(output, pbxp, xct)

                # Do we have a message to print when this rule runs?
                message = rule.get("message")
                if message:
                    message = gyp.common.EncodePOSIXShellArgument(message)
                    message = ExpandXcodeVariables(message, rule_input_dict)
                messages.append(message)

                # Turn the list into a string that can be passed to a shell.
                action_string = gyp.common.EncodePOSIXShellList(rule["action"])

                action = ExpandXcodeVariables(action_string, rule_input_dict)
                actions.append(action)

            if len(concrete_outputs_all) > 0:
                # TODO(mark): There's a possibility for collision here.  Consider
                # target "t" rule "A_r" and target "t_A" rule "r".
                makefile_name = "%s.make" % re.sub(
                    "[^a-zA-Z0-9_]", "_", "{}_{}".format(target_name, rule["rule_name"])
                )
                makefile_path = os.path.join(
                    xcode_projects[build_file].path, makefile_name
                )
                # TODO(mark): try/close?  Write to a temporary file and swap it only
                # if it's got changes?
                makefile = open(makefile_path, "w")

                # make will build the first target in the makefile by default.  By
                # convention, it's called "all".  List all (or at least one)
                # concrete output for each rule source as a prerequisite of the "all"
                # target.
                makefile.write("all: \\\n")
                for concrete_output_index, concrete_output_by_rule_source in enumerate(
                    concrete_outputs_by_rule_source
                ):
                    # Only list the first (index [0]) concrete output of each input
                    # in the "all" target.  Otherwise, a parallel make (-j > 1) would
                    # attempt to process each input multiple times simultaneously.
                    # Otherwise, "all" could just contain the entire list of
                    # concrete_outputs_all.
                    concrete_output = concrete_output_by_rule_source[0]
                    if (
                        concrete_output_index
                        == len(concrete_outputs_by_rule_source) - 1
                    ):
                        eol = ""
                    else:
                        eol = " \\"
                    makefile.write(f"    {concrete_output}{eol}\n")

                for (rule_source, concrete_outputs, message, action) in zip(
                    rule["rule_sources"],
                    concrete_outputs_by_rule_source,
                    messages,
                    actions,
                ):
                    makefile.write("\n")

                    # Add a rule that declares it can build each concrete output of a
                    # rule source.  Collect the names of the directories that are
                    # required.
                    concrete_output_dirs = []
                    for concrete_output_index, concrete_output in enumerate(
                        concrete_outputs
                    ):
                        if concrete_output_index == 0:
                            bol = ""
                        else:
                            bol = "    "
                        makefile.write(f"{bol}{concrete_output} \\\n")

                        concrete_output_dir = posixpath.dirname(concrete_output)
                        if (
                            concrete_output_dir
                            and concrete_output_dir not in concrete_output_dirs
                        ):
                            concrete_output_dirs.append(concrete_output_dir)

                    makefile.write("    : \\\n")

                    # The prerequisites for this rule are the rule source itself and
                    # the set of additional rule inputs, if any.
                    prerequisites = [rule_source]
                    prerequisites.extend(rule.get("inputs", []))
                    for prerequisite_index, prerequisite in enumerate(prerequisites):
                        if prerequisite_index == len(prerequisites) - 1:
                            eol = ""
                        else:
                            eol = " \\"
                        makefile.write(f"    {prerequisite}{eol}\n")

                    # Make sure that output directories exist before executing the rule
                    # action.
                    if len(concrete_output_dirs) > 0:
                        makefile.write(
                            '\t@mkdir -p "%s"\n' % '" "'.join(concrete_output_dirs)
                        )

                    # The rule message and action have already had
                    # the necessary variable substitutions performed.
                    if message:
                        # Mark it with note: so Xcode picks it up in build output.
                        makefile.write("\t@echo note: %s\n" % message)
                    makefile.write("\t%s\n" % action)

                makefile.close()

                # It might be nice to ensure that needed output directories exist
                # here rather than in each target in the Makefile, but that wouldn't
                # work if there ever was a concrete output that had an input-dependent
                # variable anywhere other than in the leaf position.

                # Don't declare any inputPaths or outputPaths.  If they're present,
                # Xcode will provide a slight optimization by only running the script
                # phase if any output is missing or outdated relative to any input.
                # Unfortunately, it will also assume that all outputs are touched by
                # the script, and if the outputs serve as files in a compilation
                # phase, they will be unconditionally rebuilt.  Since make might not
                # rebuild everything that could be declared here as an output, this
                # extra compilation activity is unnecessary.  With inputPaths and
                # outputPaths not supplied, make will always be called, but it knows
                # enough to not do anything when everything is up-to-date.

                # To help speed things up, pass -j COUNT to make so it does some work
                # in parallel.  Don't use ncpus because Xcode will build ncpus targets
                # in parallel and if each target happens to have a rules step, there
                # would be ncpus^2 things going.  With a machine that has 2 quad-core
                # Xeons, a build can quickly run out of processes based on
                # scheduling/other tasks, and randomly failing builds are no good.
                script = (
                    """JOB_COUNT="$(/usr/sbin/sysctl -n hw.ncpu)"
if [ "${JOB_COUNT}" -gt 4 ]; then
  JOB_COUNT=4
fi
exec xcrun make -f "${PROJECT_FILE_PATH}/%s" -j "${JOB_COUNT}"
exit 1
"""
                    % makefile_name
                )
                ssbp = gyp.xcodeproj_file.PBXShellScriptBuildPhase(
                    {
                        "name": 'Rule "' + rule["rule_name"] + '"',
                        "shellScript": script,
                        "showEnvVarsInLog": 0,
                    }
                )

                if support_xct:
                    support_xct.AppendProperty("buildPhases", ssbp)
                else:
                    # TODO(mark): this assumes too much knowledge of the internals of
                    # xcodeproj_file; some of these smarts should move
                    # into xcodeproj_file itself.
                    xct._properties["buildPhases"].insert(prebuild_index, ssbp)
                    prebuild_index = prebuild_index + 1

            # Extra rule inputs also go into the project file.  Concrete outputs were
            # already added when they were computed.
            groups = ["inputs", "inputs_excluded"]
            if skip_excluded_files:
                groups = [x for x in groups if not x.endswith("_excluded")]
            for group in groups:
                for item in rule.get(group, []):
                    pbxp.AddOrGetFileInRootGroup(item)

        # Add "sources".
        for source in spec.get("sources", []):
            (source_root, source_extension) = posixpath.splitext(source)
            if source_extension[1:] not in rules_by_ext:
                # AddSourceToTarget will add the file to a root group if it's not
                # already there.
                AddSourceToTarget(source, type, pbxp, xct)
            else:
                pbxp.AddOrGetFileInRootGroup(source)

        # Add "mac_bundle_resources" and "mac_framework_private_headers" if
        # it's a bundle of any type.
        if is_bundle:
            for resource in tgt_mac_bundle_resources:
                (resource_root, resource_extension) = posixpath.splitext(resource)
                if resource_extension[1:] not in rules_by_ext:
                    AddResourceToTarget(resource, pbxp, xct)
                else:
                    pbxp.AddOrGetFileInRootGroup(resource)

            for header in spec.get("mac_framework_private_headers", []):
                AddHeaderToTarget(header, pbxp, xct, False)

        # Add "mac_framework_headers". These can be valid for both frameworks
        # and static libraries.
        if is_bundle or type == "static_library":
            for header in spec.get("mac_framework_headers", []):
                AddHeaderToTarget(header, pbxp, xct, True)

        # Add "copies".
        pbxcp_dict = {}
        for copy_group in spec.get("copies", []):
            dest = copy_group["destination"]
            if dest[0] not in ("/", "$"):
                # Relative paths are relative to $(SRCROOT).
                dest = "$(SRCROOT)/" + dest

            code_sign = int(copy_group.get("xcode_code_sign", 0))
            settings = (None, "{ATTRIBUTES = (CodeSignOnCopy, ); }")[code_sign]

            # Coalesce multiple "copies" sections in the same target with the same
            # "destination" property into the same PBXCopyFilesBuildPhase, otherwise
            # they'll wind up with ID collisions.
            pbxcp = pbxcp_dict.get(dest, None)
            if pbxcp is None:
                pbxcp = gyp.xcodeproj_file.PBXCopyFilesBuildPhase(
                    {"name": "Copy to " + copy_group["destination"]}, parent=xct
                )
                pbxcp.SetDestination(dest)

                # TODO(mark): The usual comment about this knowing too much about
                # gyp.xcodeproj_file internals applies.
                xct._properties["buildPhases"].insert(prebuild_index, pbxcp)

                pbxcp_dict[dest] = pbxcp

            for file in copy_group["files"]:
                pbxcp.AddFile(file, settings)

        # Excluded files can also go into the project file.
        if not skip_excluded_files:
            for key in [
                "sources",
                "mac_bundle_resources",
                "mac_framework_headers",
                "mac_framework_private_headers",
            ]:
                excluded_key = key + "_excluded"
                for item in spec.get(excluded_key, []):
                    pbxp.AddOrGetFileInRootGroup(item)

        # So can "inputs" and "outputs" sections of "actions" groups.
        groups = ["inputs", "inputs_excluded", "outputs", "outputs_excluded"]
        if skip_excluded_files:
            groups = [x for x in groups if not x.endswith("_excluded")]
        for action in spec.get("actions", []):
            for group in groups:
                for item in action.get(group, []):
                    # Exclude anything in BUILT_PRODUCTS_DIR.  They're products, not
                    # sources.
                    if not item.startswith("$(BUILT_PRODUCTS_DIR)/"):
                        pbxp.AddOrGetFileInRootGroup(item)

        for postbuild in spec.get("postbuilds", []):
            action_string_sh = gyp.common.EncodePOSIXShellList(postbuild["action"])
            script = "exec " + action_string_sh + "\nexit 1\n"

            # Make the postbuild step depend on the output of ld or ar from this
            # target. Apparently putting the script step after the link step isn't
            # sufficient to ensure proper ordering in all cases. With an input
            # declared but no outputs, the script step should run every time, as
            # desired.
            ssbp = gyp.xcodeproj_file.PBXShellScriptBuildPhase(
                {
                    "inputPaths": ["$(BUILT_PRODUCTS_DIR)/$(EXECUTABLE_PATH)"],
                    "name": 'Postbuild "' + postbuild["postbuild_name"] + '"',
                    "shellScript": script,
                    "showEnvVarsInLog": 0,
                }
            )
            xct.AppendProperty("buildPhases", ssbp)

        # Add dependencies before libraries, because adding a dependency may imply
        # adding a library.  It's preferable to keep dependencies listed first
        # during a link phase so that they can override symbols that would
        # otherwise be provided by libraries, which will usually include system
        # libraries.  On some systems, ld is finicky and even requires the
        # libraries to be ordered in such a way that unresolved symbols in
        # earlier-listed libraries may only be resolved by later-listed libraries.
        # The Mac linker doesn't work that way, but other platforms do, and so
        # their linker invocations need to be constructed in this way.  There's
        # no compelling reason for Xcode's linker invocations to differ.

        if "dependencies" in spec:
            for dependency in spec["dependencies"]:
                xct.AddDependency(xcode_targets[dependency])
                # The support project also gets the dependencies (in case they are
                # needed for the actions/rules to work).
                if support_xct:
                    support_xct.AddDependency(xcode_targets[dependency])

        if "libraries" in spec:
            for library in spec["libraries"]:
                xct.FrameworksPhase().AddFile(library)
                # Add the library's directory to LIBRARY_SEARCH_PATHS if necessary.
                # I wish Xcode handled this automatically.
                library_dir = posixpath.dirname(library)
                if library_dir not in xcode_standard_library_dirs and (
                    not xct.HasBuildSetting(_library_search_paths_var)
                    or library_dir not in xct.GetBuildSetting(_library_search_paths_var)
                ):
                    xct.AppendBuildSetting(_library_search_paths_var, library_dir)

        for configuration_name in configuration_names:
            configuration = spec["configurations"][configuration_name]
            xcbc = xct.ConfigurationNamed(configuration_name)
            for include_dir in configuration.get("mac_framework_dirs", []):
                xcbc.AppendBuildSetting("FRAMEWORK_SEARCH_PATHS", include_dir)
            for include_dir in configuration.get("include_dirs", []):
                xcbc.AppendBuildSetting("HEADER_SEARCH_PATHS", include_dir)
            for library_dir in configuration.get("library_dirs", []):
                if library_dir not in xcode_standard_library_dirs and (
                    not xcbc.HasBuildSetting(_library_search_paths_var)
                    or library_dir
                    not in xcbc.GetBuildSetting(_library_search_paths_var)
                ):
                    xcbc.AppendBuildSetting(_library_search_paths_var, library_dir)

            if "defines" in configuration:
                for define in configuration["defines"]:
                    set_define = EscapeXcodeDefine(define)
                    xcbc.AppendBuildSetting("GCC_PREPROCESSOR_DEFINITIONS", set_define)
            if "xcode_settings" in configuration:
                for xck, xcv in configuration["xcode_settings"].items():
                    xcbc.SetBuildSetting(xck, xcv)
            if "xcode_config_file" in configuration:
                config_ref = pbxp.AddOrGetFileInRootGroup(
                    configuration["xcode_config_file"]
                )
                xcbc.SetBaseConfiguration(config_ref)

    build_files = []
    for build_file, build_file_dict in data.items():
        if build_file.endswith(".gyp"):
            build_files.append(build_file)

    for build_file in build_files:
        xcode_projects[build_file].Finalize1(xcode_targets, serialize_all_tests)

    for build_file in build_files:
        xcode_projects[build_file].Finalize2(xcode_targets, xcode_target_to_target_dict)

    for build_file in build_files:
        xcode_projects[build_file].Write()
#!/usr/bin/env python3

# Copyright (c) 2013 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

""" Unit tests for the xcode.py file. """

import gyp.generator.xcode as xcode
import unittest
import sys


class TestEscapeXcodeDefine(unittest.TestCase):
    if sys.platform == "darwin":

        def test_InheritedRemainsUnescaped(self):
            self.assertEqual(xcode.EscapeXcodeDefine("$(inherited)"), "$(inherited)")

        def test_Escaping(self):
            self.assertEqual(xcode.EscapeXcodeDefine('a b"c\\'), 'a\\ b\\"c\\\\')


if __name__ == "__main__":
    unittest.main()
# TODO: Enable os: windows-latest
# TODO: Enable pytest --doctest-modules

name: Python_tests
on: [push, pull_request]
jobs:
  Python_tests:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      max-parallel: 8
      matrix:
        os: [macos-latest, ubuntu-latest] # , windows-latest]
        python-version: [3.6, 3.7, 3.8, 3.9]
    steps:
      - uses: actions/checkout@v2
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v2
        with:
          python-version: ${{ matrix.python-version }}
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements_dev.txt
      - name: Lint with flake8
        run: flake8 . --ignore=E203,W503  --max-complexity=101 --max-line-length=88 --show-source --statistics
      - name: Test with pytest
        run: pytest
      # - name: Run doctests with pytest
      #   run: pytest --doctest-modules
name: node-gyp integration

on: [push, pull_request]

jobs:
  test:
    strategy:
      fail-fast: false
      matrix:
        os: [macos-latest, ubuntu-latest, windows-latest]
        python: [3.6, 3.9]

    runs-on: ${{ matrix.os }}
    steps:
      - name: Clone gyp-next
        uses: actions/checkout@v2
        with:
          path: gyp-next
      - name: Clone nodejs/node-gyp
        uses: actions/checkout@v2
        with:
          repository: nodejs/node-gyp
          path: node-gyp
      - uses: actions/setup-node@v2
        with:
          node-version: 14.x
      - uses: actions/setup-python@v2
        with:
          python-version: ${{ matrix.python }}
      - name: Install dependencies
        run: |
          cd node-gyp
          npm install --no-progress
      - name: Replace gyp in node-gyp
        shell: bash
        run: |
          rm -rf node-gyp/gyp
          cp -r gyp-next node-gyp/gyp
      - name: Run tests
        run: |
          cd node-gyp
          npm test
name: Node.js Windows integration

on: [push, pull_request]

jobs:
  build-windows:
    runs-on: windows-latest
    steps:
      - name: Clone gyp-next
        uses: actions/checkout@v2
        with:
          path: gyp-next
      - name: Clone nodejs/node
        uses: actions/checkout@v2
        with:
          repository: nodejs/node
          path: node
      - name: Install deps
        run: choco install nasm
      - name: Replace gyp in Node.js
        run: |
          rm -Recurse node/tools/gyp
          cp -Recurse gyp-next node/tools/gyp
      - name: Build Node.js
        run: |
          cd node
          ./vcbuild.bat
on:
  push:
    branches:
      - main

name: release-please
jobs:
  release-please:
    runs-on: ubuntu-latest
    steps:
      - uses: GoogleCloudPlatform/release-please-action@v2
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          release-type: python
          package-name: gyp-next
          bump-minor-pre-major: Yes
## Python Issues OSX

Make sure you are using the native Python version in OSX.  If you use a MacPorts of HomeBrew version, you may run into problems.

If you have issues with `execvp`, be sure to check your `$PYTHON` environment variable.  If it is not set to the native version, unset it and try again.

Notes: https://gist.github.com/erichocean/5177582

## npm ERR! `node-gyp rebuild`(Windows)
* just install the build tools from [here](https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=BuildTools)
Please note the version as is required in below command e.g **2017**
* Launch cmd, run `npm config set msvs_version 2017`
* close and open new CMD/terminal and all is well :100: 

When using `node-gyp` you might see an error like this when attempting to compile/install a node.js native addon:

```
$ npm install bcrypt
npm http GET https://registry.npmjs.org/bcrypt/0.7.5
npm http 304 https://registry.npmjs.org/bcrypt/0.7.5
npm http GET https://registry.npmjs.org/bindings/1.0.0
npm http 304 https://registry.npmjs.org/bindings/1.0.0

> bcrypt@0.7.5 install /home/ubuntu/public/song-swap/node_modules/bcrypt
> node-gyp rebuild

gyp ERR! configure error
gyp ERR! stack Error: "pre" versions of node cannot be installed, use the --nodedir flag instead
gyp ERR! stack     at install (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/install.js:69:16)
gyp ERR! stack     at Object.self.commands.(anonymous function) [as install] (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/node-gyp.js:56:37)
gyp ERR! stack     at getNodeDir (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:219:20)
gyp ERR! stack     at /usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:105:9
gyp ERR! stack     at ChildProcess.exithandler (child_process.js:630:7)
gyp ERR! stack     at ChildProcess.EventEmitter.emit (events.js:99:17)
gyp ERR! stack     at maybeClose (child_process.js:730:16)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (child_process.js:797:5)
gyp ERR! System Linux 3.5.0-21-generic
gyp ERR! command "node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /home/ubuntu/public/song-swap/node_modules/bcrypt
gyp ERR! node -v v0.11.2-pre
gyp ERR! node-gyp -v v0.9.5
gyp ERR! not ok
npm ERR! bcrypt@0.7.5 install: `node-gyp rebuild`
npm ERR! `sh "-c" "node-gyp rebuild"` failed with 1
npm ERR!
npm ERR! Failed at the bcrypt@0.7.5 install script.
npm ERR! This is most likely a problem with the bcrypt package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node-gyp rebuild
npm ERR! You can get their info via:
npm ERR!     npm owner ls bcrypt
npm ERR! There is likely additional logging output above.

npm ERR! System Linux 3.5.0-21-generic
npm ERR! command "/usr/local/bin/node" "/usr/local/bin/npm" "install" "bcrypt"
npm ERR! cwd /home/ubuntu/public/song-swap
npm ERR! node -v v0.11.2-pre
npm ERR! npm -v 1.2.18
npm ERR! code ELIFECYCLE
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR!     /home/ubuntu/public/song-swap/npm-debug.log
npm ERR! not ok code 0
```

The main error here is:

```
Error: "pre" versions of node cannot be installed, use the --nodedir flag instead
```

This error is caused when you attempt to compile a native addon using a version of node.js with `-pre` at the end of the version number:

``` bash
$ node -v
v0.10.4-pre
```

## How to avoid (the short answer)

To avoid this error completely just use a stable release of node.js. i.e. `v0.10.4`, and __not__ `v0.10.4-pre`.

## How to fix (the long answer)

This error happens because `node-gyp` does not know what header files were used to compile your "pre" version of node, and therefore it needs you to specify the node source code directory path using the `--nodedir` flag.

For example, if I compiled my development ("pre") version of node.js using the source code in `/Users/nrajlich/node`, then I could invoke `node-gyp` like:

``` bash
$ node-gyp rebuild --nodedir=/Users/nrajlich/node
```

Or install an native addon through `npm` like:

``` bash
$ npm install bcrypt --nodedir=/Users/nrajlich/node
```

### Always use `--nodedir`

__Note:__ This is for advanced users who use `-pre` versions of node more often than tagged releases.

If you're invoking `node-gyp` through `npm`, then you can leverage `npm`'s configuration system and not have to specify the `--nodedir` flag all the time:

``` bash
$ npm config set nodedir /Users/nrajlich/node
```Welcome to the node-gyp wiki!

 * [["binding.gyp" files out in the wild]]
 * [[Linking to OpenSSL]]
 * [[Common Issues]]
 * [[Updating npm's bundled node-gyp]]
 * [[Error: "pre" versions of node cannot be installed]]
A handful of native addons require linking to OpenSSL in one way or another. This introduces a small challenge since node will sometimes bundle OpenSSL statically (the default for node >= v0.8.x), or sometimes dynamically link to the system OpenSSL (default for node <= v0.6.x).

Good native addons should account for both scenarios. It's recommended that you use the `binding.gyp` file provided below as a starting-point for any addon that needs to use OpenSSL:

``` python
{
  'variables': {
    # node v0.6.x doesn't give us its build variables,
    # but on Unix it was only possible to use the system OpenSSL library,
    # so default the variable to "true", v0.8.x node and up will overwrite it.
    'node_shared_openssl%': 'true'
  },
  'targets': [
    {
      'target_name': 'binding',
      'sources': [
        'src/binding.cc'
      ],
      'conditions': [
        ['node_shared_openssl=="false"', {
          # so when "node_shared_openssl" is "false", then OpenSSL has been
          # bundled into the node executable. So we need to include the same
          # header files that were used when building node.
          'include_dirs': [
            '<(node_root_dir)/deps/openssl/openssl/include'
          ],
          "conditions" : [
            ["target_arch=='ia32'", {
              "include_dirs": [ "<(node_root_dir)/deps/openssl/config/piii" ]
            }],
            ["target_arch=='x64'", {
              "include_dirs": [ "<(node_root_dir)/deps/openssl/config/k8" ]
            }],
            ["target_arch=='arm'", {
              "include_dirs": [ "<(node_root_dir)/deps/openssl/config/arm" ]
            }]
          ]
        }]
      ]
    }
  ]
}
```

This ensures that when OpenSSL is statically linked into `node` then, the bundled OpenSSL headers are included, but when the system OpenSSL is in use, then only those headers will be used.

## Windows?

As you can see this baseline `binding.gyp` file only accounts for the Unix scenario. Currently on Windows the situation is a little less ideal. On Windows, OpenSSL is _always_ statically compiled into the `node` executable, so ideally it would be possible to use that copy of OpenSSL when building native addons.

Unfortunately it doesn't seem like that is possible at the moment, as there would need to be tweaks made to the generated `node.lib` file to include the openssl glue functions, or a new `openssl.lib` file would need to be created during the node build. I'm not sure which is the easiest/most feasible.

In the meantime, one possible solution is using another copy of OpenSSL, which is what [`node-bcrypt`](https://github.com/ncb000gt/node.bcrypt.js) currently does. Adding something like this to your `binding.gyp` file's `"conditions"` block would enable this:

``` python
    [ 'OS=="win"', {
      'conditions': [
        # "openssl_root" is the directory on Windows of the OpenSSL files.
        # Check the "target_arch" variable to set good default values for
        # both 64-bit and 32-bit builds of the module.
        ['target_arch=="x64"', {
          'variables': {
            'openssl_root%': 'C:/OpenSSL-Win64'
          },
        }, {
          'variables': {
            'openssl_root%': 'C:/OpenSSL-Win32'
          },
        }],
      ],
      'libraries': [ 
        '-l<(openssl_root)/lib/libeay32.lib',
      ],
      'include_dirs': [
        '<(openssl_root)/include',
      ],
    }]
```

Now you can direct your users to install OpenSSL on Windows from here (be sure to tell them to install the 64-bit version if they're compiling against a 64-bit version of node): http://slproweb.com/products/Win32OpenSSL.html

Also note that both `node-gyp` and `npm` allow you to overwrite that default `openssl_root` variable on the command line:

``` bash
$ node-gyp rebuild --openssl-root="C:\Users\Nathan\Desktop\openssl"
```# Updating the npm-bundled version of node-gyp

[Many issues](https://github.com/nodejs/node-gyp/labels/ERR%21%20node-gyp%20-v%20%3C%3D%20v5.1.0) are opened by users who are
not running a [current version of node-gyp](https://github.com/nodejs/node-gyp/releases).

`npm` bundles its own, internal, copy of `node-gyp`. This internal copy is independent of any globally installed copy of node-gyp that
may have been installed via `npm install -g node-gyp`.

Generally, npm's library files are installed inside your global "node_modules", where npm is installed (run `npm prefix` and add `lib/node_modules`, or just `node_modules` for Windows). There are some exceptions to this. Inside this global `node_modules/` there will be an `npm/` directory and inside this you'll find a `node_modules/node-gyp/` directory. So it may look something like `/usr/local/lib/node_modules/npm/node_modules/node-gyp/`. This is the version of node-gyp that ships with npm.

When you install a _new_ version of node-gyp outside of npm, it'll go into your global node_modules, but not under the `npm/node_modules`. So that may look like `/usr/local/lib/node_modules/node-gyp/`. It'll have the `node-gyp` executable linked into your `PATH` so running `node-gyp` will use this version.

The catch is that npm won't use this version unless you tell it to, it'll keep on using the one you have installed. You need to instruct it to by setting the `node_gyp` config variable (which goes into your `~/.npmrc`). You do this by running the `npm config set` command as below. Then npm will use the command in the path you supply whenever it needs to build a native addon.

**Important**: You also need to remember to unset this when you upgrade npm with a newer version of node-gyp, or you have to manually keep your globally installed node-gyp to date. See "Undo" below.

## Linux and macOS
```
npm install --global node-gyp@latest
npm config set node_gyp $(npm prefix -g)/lib/node_modules/node-gyp/bin/node-gyp.js
```

`sudo` may be required for the first command if you get a permission error.

## Windows

### Windows Command Prompt
```
npm install --global node-gyp@latest
for /f "delims=" %P in ('npm prefix -g') do npm config set node_gyp "%P\node_modules\node-gyp\bin\node-gyp.js"
```

### Powershell
```
npm install --global node-gyp@latest
npm prefix -g | % {npm config set node_gyp "$_\node_modules\node-gyp\bin\node-gyp.js"}
```

## Undo
**Beware** if you don't unset the `node_gyp` config option, npm will continue to use the globally installed version of node-gyp rather than the one it ships with, which may end up being newer.

```
npm config delete node_gyp
npm uninstall --global node-gyp
```
This page contains links to some examples of existing `binding.gyp` files that other node modules are using. Take a look at them for inspiration.

To add to this page, just add the link to the project's `binding.gyp` file below:

 * [ons](https://github.com/XadillaX/aliyun-ons/blob/master/binding.gyp)
 * [thmclrx](https://github.com/XadillaX/thmclrx/blob/master/binding.gyp)
 * [libxmljs](https://github.com/polotek/libxmljs/blob/master/binding.gyp)
 * [node-buffertools](https://github.com/bnoordhuis/node-buffertools/blob/master/binding.gyp)
 * [node-canvas](https://github.com/LearnBoost/node-canvas/blob/master/binding.gyp)
 * [node-ffi](https://github.com/rbranson/node-ffi/blob/master/binding.gyp) + [libffi](https://github.com/rbranson/node-ffi/blob/master/deps/libffi/libffi.gyp)
 * [node-time](https://github.com/TooTallNate/node-time/blob/master/binding.gyp)
 * [node-sass](https://github.com/sass/node-sass/blob/master/binding.gyp) + [libsass](https://github.com/sass/node-sass/blob/master/src/libsass.gyp)
 * [node-serialport](https://github.com/voodootikigod/node-serialport/blob/master/binding.gyp)
 * [node-weak](https://github.com/TooTallNate/node-weak/blob/master/binding.gyp)
 * [pty.js](https://github.com/chjj/pty.js/blob/master/binding.gyp)
 * [ref](https://github.com/TooTallNate/ref/blob/master/binding.gyp)
 * [appjs](https://github.com/milani/appjs/blob/master/binding.gyp)
 * [nwm](https://github.com/mixu/nwm/blob/master/binding.gyp)
 * [bcrypt](https://github.com/ncb000gt/node.bcrypt.js/blob/master/binding.gyp)
 * [nk-mysql](https://github.com/mmod/nodamysql/blob/master/binding.gyp)
 * [nk-xrm-installer](https://github.com/mmod/nk-xrm-installer/blob/master/binding.gyp) + [includable.gypi](https://github.com/mmod/nk-xrm-installer/blob/master/includable.gypi) + [unpack.py](https://github.com/mmod/nk-xrm-installer/blob/master/unpack.py) + [disburse.py](https://github.com/mmod/nk-xrm-installer/blob/master/disburse.py)   
   <sub>.py files above provide complete reference for examples of fetching source via http, extracting, and moving files.</sub>
 * [node-memwatch](https://github.com/lloyd/node-memwatch/blob/master/binding.gyp)
 * [node-ip2location](https://github.com/bolgovr/node-ip2location/blob/master/binding.gyp)
 * [node-midi](https://github.com/justinlatimer/node-midi/blob/master/binding.gyp)
 * [node-sqlite3](https://github.com/developmentseed/node-sqlite3/blob/master/binding.gyp) + [libsqlite3](https://github.com/developmentseed/node-sqlite3/blob/master/deps/sqlite3.gyp)
 * [node-zipfile](https://github.com/mapbox/node-zipfile/blob/master/binding.gyp)
 * [node-mapnik](https://github.com/mapnik/node-mapnik/blob/master/binding.gyp)
 * [node-inotify](https://github.com/c4milo/node-inotify/blob/master/binding.gyp)
 * [v8-profiler](https://github.com/c4milo/v8-profiler/blob/master/binding.gyp)
 * [airtunes](https://github.com/radioline/node_airtunes/blob/master/binding.gyp)
 * [node-fann](https://github.com/c4milo/node-fann/blob/master/binding.gyp)
 * [node-talib](https://github.com/oransel/node-talib/blob/master/binding.gyp)
 * [node-leveldown](https://github.com/rvagg/node-leveldown/blob/master/binding.gyp) + [leveldb.gyp](https://github.com/rvagg/node-leveldown/blob/master/deps/leveldb/leveldb.gyp) + [snappy.gyp](https://github.com/rvagg/node-leveldown/blob/master/deps/snappy/snappy.gyp)
 * [node-expat](https://github.com/astro/node-expat/blob/master/binding.gyp) + [libexpat](https://github.com/astro/node-expat/blob/master/deps/libexpat/libexpat.gyp)
 * [node-openvg-canvas](https://github.com/luismreis/node-openvg-canvas/blob/master/binding.gyp) + [node-openvg](https://github.com/luismreis/node-openvg/blob/master/binding.gyp)
 * [node-cryptopp](https://github.com/BatikhSouri/node-cryptopp/blob/master/binding.gyp)
 * [topcube](https://github.com/creationix/topcube/blob/master/binding.gyp)
 * [node-osmium](https://github.com/osmcode/node-osmium/blob/master/binding.gyp)
 * [node-osrm](https://github.com/DennisOSRM/node-osrm)
 * [node-oracle](https://github.com/joeferner/node-oracle/blob/master/binding.gyp)
 * [node-process-list](https://github.com/ReklatsMasters/node-process-list/blob/master/binding.gyp)
 * [node-nanomsg](https://github.com/nickdesaulniers/node-nanomsg/blob/master/binding.gyp)
 * [Ghostscript4JS](https://github.com/NickNaso/ghostscript4js/blob/master/binding.gyp)
 * [nodecv](https://github.com/xudafeng/nodecv/blob/master/binding.gyp)
 * [magick-cli](https://github.com/NickNaso/magick-cli/blob/master/binding.gyp)
 * [sharp](https://github.com/lovell/sharp/blob/master/binding.gyp)
 * [krb5](https://github.com/adaltas/node-krb5/blob/master/binding.gyp)#!/usr/bin/env node

'use strict'

process.title = 'node-gyp'

const envPaths = require('env-paths')
const gyp = require('../')
const log = require('npmlog')
const os = require('os')

/**
 * Process and execute the selected commands.
 */

const prog = gyp()
var completed = false
prog.parseArgv(process.argv)
prog.devDir = prog.opts.devdir

var homeDir = os.homedir()
if (prog.devDir) {
  prog.devDir = prog.devDir.replace(/^~/, homeDir)
} else if (homeDir) {
  prog.devDir = envPaths('node-gyp', { suffix: '' }).cache
} else {
  throw new Error(
    "node-gyp requires that the user's home directory is specified " +
    'in either of the environmental variables HOME or USERPROFILE. ' +
    'Overide with: --devdir /path/to/.node-gyp')
}

if (prog.todo.length === 0) {
  if (~process.argv.indexOf('-v') || ~process.argv.indexOf('--version')) {
    console.log('v%s', prog.version)
  } else {
    console.log('%s', prog.usage())
  }
  process.exit(0)
}

log.info('it worked if it ends with', 'ok')
log.verbose('cli', process.argv)
log.info('using', 'node-gyp@%s', prog.version)
log.info('using', 'node@%s | %s | %s', process.versions.node, process.platform, process.arch)

/**
 * Change dir if -C/--directory was passed.
 */

var dir = prog.opts.directory
if (dir) {
  var fs = require('fs')
  try {
    var stat = fs.statSync(dir)
    if (stat.isDirectory()) {
      log.info('chdir', dir)
      process.chdir(dir)
    } else {
      log.warn('chdir', dir + ' is not a directory')
    }
  } catch (e) {
    if (e.code === 'ENOENT') {
      log.warn('chdir', dir + ' is not a directory')
    } else {
      log.warn('chdir', 'error during chdir() "%s"', e.message)
    }
  }
}

function run () {
  var command = prog.todo.shift()
  if (!command) {
    // done!
    completed = true
    log.info('ok')
    return
  }

  prog.commands[command.name](command.args, function (err) {
    if (err) {
      log.error(command.name + ' error')
      log.error('stack', err.stack)
      errorMessage()
      log.error('not ok')
      return process.exit(1)
    }
    if (command.name === 'list') {
      var versions = arguments[1]
      if (versions.length > 0) {
        versions.forEach(function (version) {
          console.log(version)
        })
      } else {
        console.log('No node development files installed. Use `node-gyp install` to install a version.')
      }
    } else if (arguments.length >= 2) {
      console.log.apply(console, [].slice.call(arguments, 1))
    }

    // now run the next command in the queue
    process.nextTick(run)
  })
}

process.on('exit', function (code) {
  if (!completed && !code) {
    log.error('Completion callback never invoked!')
    issueMessage()
    process.exit(6)
  }
})

process.on('uncaughtException', function (err) {
  log.error('UNCAUGHT EXCEPTION')
  log.error('stack', err.stack)
  issueMessage()
  process.exit(7)
})

function errorMessage () {
  // copied from npm's lib/utils/error-handler.js
  var os = require('os')
  log.error('System', os.type() + ' ' + os.release())
  log.error('command', process.argv
    .map(JSON.stringify).join(' '))
  log.error('cwd', process.cwd())
  log.error('node -v', process.version)
  log.error('node-gyp -v', 'v' + prog.package.version)
}

function issueMessage () {
  errorMessage()
  log.error('', ['Node-gyp failed to build your package.',
    'Try to update npm and/or node-gyp and if it does not help file an issue with the package author.'
  ].join('\n'))
}

// start running the given commands!
run()
<!--
Thank you for reporting an issue!

Remember, this issue tracker is for reporting issues ONLY with node-gyp.

If you have an issue installing a specific module, please file an issue on
that module's issue tracker (`npm issues modulename`). Open issue here only if
you are sure this is an issue with node-gyp, not with the module you are
trying to build.

Fill out the form below. We probably won't investigate an issue that does not
provide the basic information we require.

-->

Please look thru your error log for the string `gyp info using node-gyp@` and if the version number is less than the [current release of node-gyp](https://github.com/nodejs/node-gyp/releases) then __please upgrade__ using the instructions at https://github.com/nodejs/node-gyp/blob/master/docs/Updating-npm-bundled-node-gyp.md and try your command again.

Requests for help with [`node-sass` are very common](https://github.com/nodejs/node-gyp/issues?q=label%3A%22Node+Sass+--%3E+Dart+Sass%22). Please be aware that this package is deprecated, you should seek alternatives and avoid opening new issues about it here.

* **Node Version**: <!-- `node -v` and `npm -v` -->
* **Platform**: <!-- `uname -a` (UNIX), or `systeminfo | findstr /B /C:"OS Name" /C:"OS Version" /C:"System Type"` (Windows) -->
* **Compiler**: <!-- `cc -v` (UNIX) or `msbuild /version & cl` (Windows) -->
* **Module**: <!-- what you tried to build/install -->

<details><summary>Verbose output (from npm or node-gyp):</summary>

```
Paste your log here, between the backticks. It can be:
  - npm --verbose output,
  - or contents of npm-debug.log,
  - or output of node-gyp rebuild --verbose.
Include the command you were trying to run.

This should look like this:

>npm --verbose
npm info it worked if it ends with ok
npm verb cli [
npm verb cli   'C:\\...\\node\\13.9.0\\x64\\node.exe',
npm verb cli   'C:\\...\\node\\13.9.0\\x64\\node_modules\\npm\\bin\\npm-cli.js',
npm verb cli   '--verbose'
npm verb cli ]
npm info using npm@6.13.7
npm info using node@v13.9.0

Usage: npm <command>
(...)
```

</details>

<!-- Any further details -->
<!--
Thank you for your pull request. Please review the below requirements.

Contributor guide: https://github.com/nodejs/node/blob/master/CONTRIBUTING.md
-->

##### Checklist
<!-- Remove items that do not apply. For completed items, change [ ] to [x]. -->

- [ ] `npm install && npm test` passes
- [ ] tests are included <!-- Bug fixes and new features should include tests -->
- [ ] documentation is changed or added
- [ ] commit message follows [commit guidelines](https://github.com/googleapis/release-please#how-should-i-write-my-commits)

##### Description of change
<!-- Provide a description of the change -->

name: release-please

on:
  push:
    branches:
      - master

jobs:
  release-please:
    runs-on: ubuntu-latest
    steps:
      - uses: google-github-actions/release-please-action@v2
        id: release
        with:
          package-name: node-gyp
          release-type: node
          changelog-types: >
            [{"type":"feat","section":"Features","hidden":false},
            {"type":"fix","section":"Bug Fixes","hidden":false},
            {"type":"bin","section":"Core","hidden":false},
            {"type":"gyp","section":"Core","hidden":false},
            {"type":"lib","section":"Core","hidden":false},
            {"type":"src","section":"Core","hidden":false},
            {"type":"test","section":"Tests","hidden":false},
            {"type":"build","section":"Core","hidden":false},
            {"type":"clean","section":"Core","hidden":false},
            {"type":"configure","section":"Core","hidden":false},
            {"type":"install","section":"Core","hidden":false},
            {"type":"list","section":"Core","hidden":false},
            {"type":"rebuild","section":"Core","hidden":false},
            {"type":"remove","section":"Core","hidden":false},
            {"type":"deps","section":"Core","hidden":false},
            {"type":"python","section":"Core","hidden":false},
            {"type":"lin","section":"Core","hidden":false},
            {"type":"linux","section":"Core","hidden":false},
            {"type":"mac","section":"Core","hidden":false},
            {"type":"macos","section":"Core","hidden":false},
            {"type":"win","section":"Core","hidden":false},
            {"type":"windows","section":"Core","hidden":false},
            {"type":"zos","section":"Core","hidden":false},
            {"type":"doc","section":"Doc","hidden":false},
            {"type":"docs","section":"Doc","hidden":false},
            {"type":"readme","section":"Doc","hidden":false},
            {"type":"chore","section":"Miscellaneous","hidden":false},
            {"type":"refactor","section":"Miscellaneous","hidden":false},
            {"type":"ci","section":"Miscellaneous","hidden":false},
            {"type":"meta","section":"Miscellaneous","hidden":false}]

          # Standard Conventional Commits: `feat` and `fix`
          # node-gyp subdirectories: `bin`, `gyp`, `lib`, `src`, `test`
          # node-gyp subcommands: `build`, `clean`, `configure`, `install`, `list`, `rebuild`, `remove`
          # Core abstract category: `deps`
          # Languages/platforms: `python`, `lin`, `linux`, `mac`, `macos`, `win`, `window`, `zos`
          # Documentation: `doc`, `docs`, `readme`
          # Standard Conventional Commits: `chore` (under "Miscellaneous")
          # Miscellaneous abstract categories: `refactor`, `ci`, `meta`
# TODO: Line 43, enable pytest --doctest-modules

name: Tests
on: [push, pull_request]
jobs:
  Tests:
    strategy:
      fail-fast: false
      max-parallel: 15
      matrix:
        node: [12.x, 14.x, 16.x]
        python: ["3.6", "3.8", "3.10"]
        os: [macos-latest, ubuntu-latest, windows-latest]
    runs-on: ${{ matrix.os }}
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v2
      - name: Use Node.js ${{ matrix.node }}
        uses: actions/setup-node@v2
        with:
          node-version: ${{ matrix.node }}
      - name: Use Python ${{ matrix.python }}
        uses: actions/setup-python@v2
        with:
          python-version: ${{ matrix.python }}
        env:
          PYTHON_VERSION: ${{ matrix.python }}
      - name: Install Dependencies
        run: |
          npm install --no-progress
          pip install flake8 pytest
      - name: Set Windows environment
        if: matrix.os == 'windows-latest'
        run: |
          echo 'GYP_MSVS_VERSION=2015' >> $Env:GITHUB_ENV
          echo 'GYP_MSVS_OVERRIDE_PATH=C:\\Dummy' >> $Env:GITHUB_ENV
      - name: Lint Python
        if: matrix.os == 'ubuntu-latest'
        run: flake8 . --ignore=E203,W503  --max-complexity=101 --max-line-length=88 --show-source --statistics
      - name: Run Python tests
        run: python -m pytest
      # - name: Run doctests with pytest
      #   run: python -m pytest --doctest-modules
      - name: Run Node tests
        run: npm test
name: Tests on Windows
on: [push, pull_request]
jobs:
  Tests:
    strategy:
      fail-fast: false
      max-parallel: 15
      matrix:
        os: [windows-2022]
    runs-on: ${{ matrix.os }}
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v2
      - name: Install Dependencies
        run: |
          npm install --no-progress
      - name: Set Windows environment
        if: matrix.os == 'windows-latest'
        run: |
          echo 'GYP_MSVS_VERSION=2015' >> $Env:GITHUB_ENV
          echo 'GYP_MSVS_OVERRIDE_PATH=C:\\Dummy' >> $Env:GITHUB_ENV
      - name: Environment Information
        run: npx envinfo
      - name: Run Node tests
        run: npm test
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.
{
  "name": "nopt",
  "version": "5.0.0",
  "description": "Option parsing for Node, supporting types, shorthands, etc. Used by npm.",
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
  "main": "lib/nopt.js",
  "repository": {
    "type": "git",
    "url": "https://github.com/npm/nopt.git"
  },
  "bin": {
    "nopt": "bin/nopt.js"
  },
  "license": "ISC",
  "dependencies": {
    "abbrev": "1"
  },
  "devDependencies": {
    "tap": "^14.10.6"
  },
  "files": [
    "bin",
    "lib"
  ],
  "engines": {
    "node": ">=6"
  }
}// info about each config option.

var debug = process.env.DEBUG_NOPT || process.env.NOPT_DEBUG
  ? function () { console.error.apply(console, arguments) }
  : function () {}

var url = require("url")
  , path = require("path")
  , Stream = require("stream").Stream
  , abbrev = require("abbrev")
  , os = require("os")

module.exports = exports = nopt
exports.clean = clean

exports.typeDefs =
  { String  : { type: String,  validate: validateString  }
  , Boolean : { type: Boolean, validate: validateBoolean }
  , url     : { type: url,     validate: validateUrl     }
  , Number  : { type: Number,  validate: validateNumber  }
  , path    : { type: path,    validate: validatePath    }
  , Stream  : { type: Stream,  validate: validateStream  }
  , Date    : { type: Date,    validate: validateDate    }
  }

function nopt (types, shorthands, args, slice) {
  args = args || process.argv
  types = types || {}
  shorthands = shorthands || {}
  if (typeof slice !== "number") slice = 2

  debug(types, shorthands, args, slice)

  args = args.slice(slice)
  var data = {}
    , key
    , argv = {
        remain: [],
        cooked: args,
        original: args.slice(0)
      }

  parse(args, data, argv.remain, types, shorthands)
  // now data is full
  clean(data, types, exports.typeDefs)
  data.argv = argv
  Object.defineProperty(data.argv, 'toString', { value: function () {
    return this.original.map(JSON.stringify).join(" ")
  }, enumerable: false })
  return data
}

function clean (data, types, typeDefs) {
  typeDefs = typeDefs || exports.typeDefs
  var remove = {}
    , typeDefault = [false, true, null, String, Array]

  Object.keys(data).forEach(function (k) {
    if (k === "argv") return
    var val = data[k]
      , isArray = Array.isArray(val)
      , type = types[k]
    if (!isArray) val = [val]
    if (!type) type = typeDefault
    if (type === Array) type = typeDefault.concat(Array)
    if (!Array.isArray(type)) type = [type]

    debug("val=%j", val)
    debug("types=", type)
    val = val.map(function (val) {
      // if it's an unknown value, then parse false/true/null/numbers/dates
      if (typeof val === "string") {
        debug("string %j", val)
        val = val.trim()
        if ((val === "null" && ~type.indexOf(null))
            || (val === "true" &&
               (~type.indexOf(true) || ~type.indexOf(Boolean)))
            || (val === "false" &&
               (~type.indexOf(false) || ~type.indexOf(Boolean)))) {
          val = JSON.parse(val)
          debug("jsonable %j", val)
        } else if (~type.indexOf(Number) && !isNaN(val)) {
          debug("convert to number", val)
          val = +val
        } else if (~type.indexOf(Date) && !isNaN(Date.parse(val))) {
          debug("convert to date", val)
          val = new Date(val)
        }
      }

      if (!types.hasOwnProperty(k)) {
        return val
      }

      // allow `--no-blah` to set 'blah' to null if null is allowed
      if (val === false && ~type.indexOf(null) &&
          !(~type.indexOf(false) || ~type.indexOf(Boolean))) {
        val = null
      }

      var d = {}
      d[k] = val
      debug("prevalidated val", d, val, types[k])
      if (!validate(d, k, val, types[k], typeDefs)) {
        if (exports.invalidHandler) {
          exports.invalidHandler(k, val, types[k], data)
        } else if (exports.invalidHandler !== false) {
          debug("invalid: "+k+"="+val, types[k])
        }
        return remove
      }
      debug("validated val", d, val, types[k])
      return d[k]
    }).filter(function (val) { return val !== remove })

    // if we allow Array specifically, then an empty array is how we
    // express 'no value here', not null.  Allow it.
    if (!val.length && type.indexOf(Array) === -1) {
      debug('VAL HAS NO LENGTH, DELETE IT', val, k, type.indexOf(Array))
      delete data[k]
    }
    else if (isArray) {
      debug(isArray, data[k], val)
      data[k] = val
    } else data[k] = val[0]

    debug("k=%s val=%j", k, val, data[k])
  })
}

function validateString (data, k, val) {
  data[k] = String(val)
}

function validatePath (data, k, val) {
  if (val === true) return false
  if (val === null) return true

  val = String(val)

  var isWin       = process.platform === 'win32'
    , homePattern = isWin ? /^~(\/|\\)/ : /^~\//
    , home        = os.homedir()

  if (home && val.match(homePattern)) {
    data[k] = path.resolve(home, val.substr(2))
  } else {
    data[k] = path.resolve(val)
  }
  return true
}

function validateNumber (data, k, val) {
  debug("validate Number %j %j %j", k, val, isNaN(val))
  if (isNaN(val)) return false
  data[k] = +val
}

function validateDate (data, k, val) {
  var s = Date.parse(val)
  debug("validate Date %j %j %j", k, val, s)
  if (isNaN(s)) return false
  data[k] = new Date(val)
}

function validateBoolean (data, k, val) {
  if (val instanceof Boolean) val = val.valueOf()
  else if (typeof val === "string") {
    if (!isNaN(val)) val = !!(+val)
    else if (val === "null" || val === "false") val = false
    else val = true
  } else val = !!val
  data[k] = val
}

function validateUrl (data, k, val) {
  val = url.parse(String(val))
  if (!val.host) return false
  data[k] = val.href
}

function validateStream (data, k, val) {
  if (!(val instanceof Stream)) return false
  data[k] = val
}

function validate (data, k, val, type, typeDefs) {
  // arrays are lists of types.
  if (Array.isArray(type)) {
    for (var i = 0, l = type.length; i < l; i ++) {
      if (type[i] === Array) continue
      if (validate(data, k, val, type[i], typeDefs)) return true
    }
    delete data[k]
    return false
  }

  // an array of anything?
  if (type === Array) return true

  // NaN is poisonous.  Means that something is not allowed.
  if (type !== type) {
    debug("Poison NaN", k, val, type)
    delete data[k]
    return false
  }

  // explicit list of values
  if (val === type) {
    debug("Explicitly allowed %j", val)
    // if (isArray) (data[k] = data[k] || []).push(val)
    // else data[k] = val
    data[k] = val
    return true
  }

  // now go through the list of typeDefs, validate against each one.
  var ok = false
    , types = Object.keys(typeDefs)
  for (var i = 0, l = types.length; i < l; i ++) {
    debug("test type %j %j %j", k, val, types[i])
    var t = typeDefs[types[i]]
    if (t &&
      ((type && type.name && t.type && t.type.name) ? (type.name === t.type.name) : (type === t.type))) {
      var d = {}
      ok = false !== t.validate(d, k, val)
      val = d[k]
      if (ok) {
        // if (isArray) (data[k] = data[k] || []).push(val)
        // else data[k] = val
        data[k] = val
        break
      }
    }
  }
  debug("OK? %j (%j %j %j)", ok, k, val, types[i])

  if (!ok) delete data[k]
  return ok
}

function parse (args, data, remain, types, shorthands) {
  debug("parse", args, data, remain)

  var key = null
    , abbrevs = abbrev(Object.keys(types))
    , shortAbbr = abbrev(Object.keys(shorthands))

  for (var i = 0; i < args.length; i ++) {
    var arg = args[i]
    debug("arg", arg)

    if (arg.match(/^-{2,}$/)) {
      // done with keys.
      // the rest are args.
      remain.push.apply(remain, args.slice(i + 1))
      args[i] = "--"
      break
    }
    var hadEq = false
    if (arg.charAt(0) === "-" && arg.length > 1) {
      var at = arg.indexOf('=')
      if (at > -1) {
        hadEq = true
        var v = arg.substr(at + 1)
        arg = arg.substr(0, at)
        args.splice(i, 1, arg, v)
      }

      // see if it's a shorthand
      // if so, splice and back up to re-parse it.
      var shRes = resolveShort(arg, shorthands, shortAbbr, abbrevs)
      debug("arg=%j shRes=%j", arg, shRes)
      if (shRes) {
        debug(arg, shRes)
        args.splice.apply(args, [i, 1].concat(shRes))
        if (arg !== shRes[0]) {
          i --
          continue
        }
      }
      arg = arg.replace(/^-+/, "")
      var no = null
      while (arg.toLowerCase().indexOf("no-") === 0) {
        no = !no
        arg = arg.substr(3)
      }

      if (abbrevs[arg]) arg = abbrevs[arg]

      var argType = types[arg]
      var isTypeArray = Array.isArray(argType)
      if (isTypeArray && argType.length === 1) {
        isTypeArray = false
        argType = argType[0]
      }

      var isArray = argType === Array ||
        isTypeArray && argType.indexOf(Array) !== -1

      // allow unknown things to be arrays if specified multiple times.
      if (!types.hasOwnProperty(arg) && data.hasOwnProperty(arg)) {
        if (!Array.isArray(data[arg]))
          data[arg] = [data[arg]]
        isArray = true
      }

      var val
        , la = args[i + 1]

      var isBool = typeof no === 'boolean' ||
        argType === Boolean ||
        isTypeArray && argType.indexOf(Boolean) !== -1 ||
        (typeof argType === 'undefined' && !hadEq) ||
        (la === "false" &&
         (argType === null ||
          isTypeArray && ~argType.indexOf(null)))

      if (isBool) {
        // just set and move along
        val = !no
        // however, also support --bool true or --bool false
        if (la === "true" || la === "false") {
          val = JSON.parse(la)
          la = null
          if (no) val = !val
          i ++
        }

        // also support "foo":[Boolean, "bar"] and "--foo bar"
        if (isTypeArray && la) {
          if (~argType.indexOf(la)) {
            // an explicit type
            val = la
            i ++
          } else if ( la === "null" && ~argType.indexOf(null) ) {
            // null allowed
            val = null
            i ++
          } else if ( !la.match(/^-{2,}[^-]/) &&
                      !isNaN(la) &&
                      ~argType.indexOf(Number) ) {
            // number
            val = +la
            i ++
          } else if ( !la.match(/^-[^-]/) && ~argType.indexOf(String) ) {
            // string
            val = la
            i ++
          }
        }

        if (isArray) (data[arg] = data[arg] || []).push(val)
        else data[arg] = val

        continue
      }

      if (argType === String) {
        if (la === undefined) {
          la = ""
        } else if (la.match(/^-{1,2}[^-]+/)) {
          la = ""
          i --
        }
      }

      if (la && la.match(/^-{2,}$/)) {
        la = undefined
        i --
      }

      val = la === undefined ? true : la
      if (isArray) (data[arg] = data[arg] || []).push(val)
      else data[arg] = val

      i ++
      continue
    }
    remain.push(arg)
  }
}

function resolveShort (arg, shorthands, shortAbbr, abbrevs) {
  // handle single-char shorthands glommed together, like
  // npm ls -glp, but only if there is one dash, and only if
  // all of the chars are single-char shorthands, and it's
  // not a match to some other abbrev.
  arg = arg.replace(/^-+/, '')

  // if it's an exact known option, then don't go any further
  if (abbrevs[arg] === arg)
    return null

  // if it's an exact known shortopt, same deal
  if (shorthands[arg]) {
    // make it an array, if it's a list of words
    if (shorthands[arg] && !Array.isArray(shorthands[arg]))
      shorthands[arg] = shorthands[arg].split(/\s+/)

    return shorthands[arg]
  }

  // first check to see if this arg is a set of single-char shorthands
  var singles = shorthands.___singles
  if (!singles) {
    singles = Object.keys(shorthands).filter(function (s) {
      return s.length === 1
    }).reduce(function (l,r) {
      l[r] = true
      return l
    }, {})
    shorthands.___singles = singles
    debug('shorthand singles', singles)
  }

  var chrs = arg.split("").filter(function (c) {
    return singles[c]
  })

  if (chrs.join("") === arg) return chrs.map(function (c) {
    return shorthands[c]
  }).reduce(function (l, r) {
    return l.concat(r)
  }, [])


  // if it's an arg abbrev, and not a literal shorthand, then prefer the arg
  if (abbrevs[arg] && !shorthands[arg])
    return null

  // if it's an abbr for a shorthand, then use that
  if (shortAbbr[arg])
    arg = shortAbbr[arg]

  // make it an array, if it's a list of words
  if (shorthands[arg] && !Array.isArray(shorthands[arg]))
    shorthands[arg] = shorthands[arg].split(/\s+/)

  return shorthands[arg]
}
#!/usr/bin/env node
var nopt = require("../lib/nopt")
  , path = require("path")
  , types = { num: Number
            , bool: Boolean
            , help: Boolean
            , list: Array
            , "num-list": [Number, Array]
            , "str-list": [String, Array]
            , "bool-list": [Boolean, Array]
            , str: String
            , clear: Boolean
            , config: Boolean
            , length: Number
            , file: path
            }
  , shorthands = { s: [ "--str", "astring" ]
                 , b: [ "--bool" ]
                 , nb: [ "--no-bool" ]
                 , tft: [ "--bool-list", "--no-bool-list", "--bool-list", "true" ]
                 , "?": ["--help"]
                 , h: ["--help"]
                 , H: ["--help"]
                 , n: [ "--num", "125" ]
                 , c: ["--config"]
                 , l: ["--length"]
                 , f: ["--file"]
                 }
  , parsed = nopt( types
                 , shorthands
                 , process.argv
                 , 2 )

console.log("parsed", parsed)

if (parsed.help) {
  console.log("")
  console.log("nopt cli tester")
  console.log("")
  console.log("types")
  console.log(Object.keys(types).map(function M (t) {
    var type = types[t]
    if (Array.isArray(type)) {
      return [t, type.map(function (type) { return type.name })]
    }
    return [t, type && type.name]
  }).reduce(function (s, i) {
    s[i[0]] = i[1]
    return s
  }, {}))
  console.log("")
  console.log("shorthands")
  console.log(shorthands)
}
{
  "name": "socks-proxy-agent",
  "description": "A SOCKS proxy `http.Agent` implementation for HTTP and HTTPS",
  "homepage": "https://github.com/TooTallNate/node-socks-proxy-agent#readme",
  "version": "6.2.1",
  "main": "dist/index.js",
  "author": {
    "email": "nathan@tootallnate.net",
    "name": "Nathan Rajlich",
    "url": "http://n8.io/"
  },
  "repository": {
    "type": "git",
    "url": "git://github.com/TooTallNate/node-socks-proxy-agent.git"
  },
  "dependencies": {
    "agent-base": "^6.0.2",
    "debug": "^4.3.3",
    "socks": "^2.6.2"
  },
  "devDependencies": {
    "@commitlint/cli": "latest",
    "@commitlint/config-conventional": "latest",
    "@types/debug": "latest",
    "@types/node": "latest",
    "cacheable-lookup": "^6.0.4",
    "conventional-github-releaser": "latest",
    "dns2": "latest",
    "finepack": "latest",
    "git-authors-cli": "latest",
    "mocha": "9",
    "nano-staged": "latest",
    "npm-check-updates": "latest",
    "prettier-standard": "latest",
    "raw-body": "latest",
    "rimraf": "latest",
    "simple-git-hooks": "latest",
    "socksv5": "github:TooTallNate/socksv5#fix/dstSock-close-event",
    "standard": "latest",
    "standard-markdown": "latest",
    "standard-version": "latest",
    "ts-standard": "latest",
    "typescript": "latest"
  },
  "engines": {
    "node": ">= 10"
  },
  "files": [
    "dist"
  ],
  "license": "MIT",
  "commitlint": {
    "extends": [
      "@commitlint/config-conventional"
    ]
  },
  "nano-staged": {
    "*.js": [
      "prettier-standard"
    ],
    "*.md": [
      "standard-markdown"
    ],
    "package.json": [
      "finepack"
    ]
  },
  "simple-git-hooks": {
    "commit-msg": "npx commitlint --edit",
    "pre-commit": "npx nano-staged"
  },
  "typings": "dist/index.d.ts"
}"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SocksProxyAgent = void 0;
const socks_1 = require("socks");
const agent_base_1 = require("agent-base");
const debug_1 = __importDefault(require("debug"));
const dns_1 = __importDefault(require("dns"));
const tls_1 = __importDefault(require("tls"));
const debug = (0, debug_1.default)('socks-proxy-agent');
function parseSocksProxy(opts) {
    var _a;
    let port = 0;
    let lookup = false;
    let type = 5;
    const host = opts.hostname || opts.host;
    if (host == null) {
        throw new TypeError('No "hostname"');
    }
    if (typeof opts.port === 'number') {
        port = opts.port;
    }
    else if (typeof opts.port === 'string') {
        port = parseInt(opts.port, 10);
    }
    // From RFC 1928, Section 3: https://tools.ietf.org/html/rfc1928#section-3
    // "The SOCKS service is conventionally located on TCP port 1080"
    if (port == null) {
        port = 1080;
    }
    // figure out if we want socks v4 or v5, based on the "protocol" used.
    // Defaults to 5.
    if (opts.protocol != null) {
        switch (opts.protocol.replace(':', '')) {
            case 'socks4':
                lookup = true;
            // pass through
            case 'socks4a':
                type = 4;
                break;
            case 'socks5':
                lookup = true;
            // pass through
            case 'socks': // no version specified, default to 5h
            case 'socks5h':
                type = 5;
                break;
            default:
                throw new TypeError(`A "socks" protocol must be specified! Got: ${String(opts.protocol)}`);
        }
    }
    if (typeof opts.type !== 'undefined') {
        if (opts.type === 4 || opts.type === 5) {
            type = opts.type;
        }
        else {
            throw new TypeError(`"type" must be 4 or 5, got: ${String(opts.type)}`);
        }
    }
    const proxy = {
        host,
        port,
        type
    };
    let userId = (_a = opts.userId) !== null && _a !== void 0 ? _a : opts.username;
    let password = opts.password;
    if (opts.auth != null) {
        const auth = opts.auth.split(':');
        userId = auth[0];
        password = auth[1];
    }
    if (userId != null) {
        Object.defineProperty(proxy, 'userId', {
            value: userId,
            enumerable: false
        });
    }
    if (password != null) {
        Object.defineProperty(proxy, 'password', {
            value: password,
            enumerable: false
        });
    }
    return { lookup, proxy };
}
const normalizeProxyOptions = (input) => {
    let proxyOptions;
    if (typeof input === 'string') {
        proxyOptions = new URL(input);
    }
    else {
        proxyOptions = input;
    }
    if (proxyOptions == null) {
        throw new TypeError('a SOCKS proxy server `hostname` and `port` must be specified!');
    }
    return proxyOptions;
};
class SocksProxyAgent extends agent_base_1.Agent {
    constructor(input, options) {
        var _a;
        const proxyOptions = normalizeProxyOptions(input);
        super(proxyOptions);
        const parsedProxy = parseSocksProxy(proxyOptions);
        this.shouldLookup = parsedProxy.lookup;
        this.proxy = parsedProxy.proxy;
        this.tlsConnectionOptions = proxyOptions.tls != null ? proxyOptions.tls : {};
        this.timeout = (_a = options === null || options === void 0 ? void 0 : options.timeout) !== null && _a !== void 0 ? _a : null;
    }
    /**
     * Initiates a SOCKS connection to the specified SOCKS proxy server,
     * which in turn connects to the specified remote host and port.
     *
     * @api protected
     */
    callback(req, opts) {
        var _a;
        return __awaiter(this, void 0, void 0, function* () {
            const { shouldLookup, proxy, timeout } = this;
            let { host, port, lookup: lookupCallback } = opts;
            if (host == null) {
                throw new Error('No `host` defined!');
            }
            if (shouldLookup) {
                // Client-side DNS resolution for "4" and "5" socks proxy versions.
                host = yield new Promise((resolve, reject) => {
                    // Use the request's custom lookup, if one was configured:
                    const lookupFn = lookupCallback !== null && lookupCallback !== void 0 ? lookupCallback : dns_1.default.lookup;
                    lookupFn(host, {}, (err, res) => {
                        if (err) {
                            reject(err);
                        }
                        else {
                            resolve(res);
                        }
                    });
                });
            }
            const socksOpts = {
                proxy,
                destination: { host, port },
                command: 'connect',
                timeout: timeout !== null && timeout !== void 0 ? timeout : undefined
            };
            const cleanup = (tlsSocket) => {
                req.destroy();
                socket.destroy();
                if (tlsSocket)
                    tlsSocket.destroy();
            };
            debug('Creating socks proxy connection: %o', socksOpts);
            const { socket } = yield socks_1.SocksClient.createConnection(socksOpts);
            debug('Successfully created socks proxy connection');
            if (timeout !== null) {
                socket.setTimeout(timeout);
                socket.on('timeout', () => cleanup());
            }
            if (opts.secureEndpoint) {
                // The proxy is connecting to a TLS server, so upgrade
                // this socket connection to a TLS connection.
                debug('Upgrading socket connection to TLS');
                const servername = (_a = opts.servername) !== null && _a !== void 0 ? _a : opts.host;
                const tlsSocket = tls_1.default.connect(Object.assign(Object.assign(Object.assign({}, omit(opts, 'host', 'hostname', 'path', 'port')), { socket,
                    servername }), this.tlsConnectionOptions));
                tlsSocket.once('error', (error) => {
                    debug('socket TLS error', error.message);
                    cleanup(tlsSocket);
                });
                return tlsSocket;
            }
            return socket;
        });
    }
}
exports.SocksProxyAgent = SocksProxyAgent;
function omit(obj, ...keys) {
    const ret = {};
    let key;
    for (key in obj) {
        if (!keys.includes(key)) {
            ret[key] = obj[key];
        }
    }
    return ret;
}
//# sourceMappingURL=index.js.mapISC License

Copyright (c) npm, Inc.

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 COPYRIGHT HOLDER DISCLAIMS
ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
COPYRIGHT HOLDER 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.
'use strict'

const crypto = require('crypto')
const MiniPass = require('minipass')

const SPEC_ALGORITHMS = ['sha256', 'sha384', 'sha512']

// TODO: this should really be a hardcoded list of algorithms we support,
// rather than [a-z0-9].
const BASE64_REGEX = /^[a-z0-9+/]+(?:=?=?)$/i
const SRI_REGEX = /^([a-z0-9]+)-([^?]+)([?\S*]*)$/
const STRICT_SRI_REGEX = /^([a-z0-9]+)-([A-Za-z0-9+/=]{44,88})(\?[\x21-\x7E]*)?$/
const VCHAR_REGEX = /^[\x21-\x7E]+$/

const defaultOpts = {
  algorithms: ['sha512'],
  error: false,
  options: [],
  pickAlgorithm: getPrioritizedHash,
  sep: ' ',
  single: false,
  strict: false
}

const ssriOpts = (opts = {}) => ({ ...defaultOpts, ...opts })

const getOptString = options => !options || !options.length
  ? ''
  : `?${options.join('?')}`

const _onEnd = Symbol('_onEnd')
const _getOptions = Symbol('_getOptions')
class IntegrityStream extends MiniPass {
  constructor (opts) {
    super()
    this.size = 0
    this.opts = opts

    // may be overridden later, but set now for class consistency
    this[_getOptions]()

    // options used for calculating stream.  can't be changed.
    const { algorithms = defaultOpts.algorithms } = opts
    this.algorithms = Array.from(
      new Set(algorithms.concat(this.algorithm ? [this.algorithm] : []))
    )
    this.hashes = this.algorithms.map(crypto.createHash)
  }

  [_getOptions] () {
    const {
      integrity,
      size,
      options
    } = { ...defaultOpts, ...this.opts }

    // For verification
    this.sri = integrity ? parse(integrity, this.opts) : null
    this.expectedSize = size
    this.goodSri = this.sri ? !!Object.keys(this.sri).length : false
    this.algorithm = this.goodSri ? this.sri.pickAlgorithm(this.opts) : null
    this.digests = this.goodSri ? this.sri[this.algorithm] : null
    this.optString = getOptString(options)
  }

  emit (ev, data) {
    if (ev === 'end') this[_onEnd]()
    return super.emit(ev, data)
  }

  write (data) {
    this.size += data.length
    this.hashes.forEach(h => h.update(data))
    return super.write(data)
  }

  [_onEnd] () {
    if (!this.goodSri) {
      this[_getOptions]()
    }
    const newSri = parse(this.hashes.map((h, i) => {
      return `${this.algorithms[i]}-${h.digest('base64')}${this.optString}`
    }).join(' '), this.opts)
    // Integrity verification mode
    const match = this.goodSri && newSri.match(this.sri, this.opts)
    if (typeof this.expectedSize === 'number' && this.size !== this.expectedSize) {
      const err = new Error(`stream size mismatch when checking ${this.sri}.\n  Wanted: ${this.expectedSize}\n  Found: ${this.size}`)
      err.code = 'EBADSIZE'
      err.found = this.size
      err.expected = this.expectedSize
      err.sri = this.sri
      this.emit('error', err)
    } else if (this.sri && !match) {
      const err = new Error(`${this.sri} integrity checksum failed when using ${this.algorithm}: wanted ${this.digests} but got ${newSri}. (${this.size} bytes)`)
      err.code = 'EINTEGRITY'
      err.found = newSri
      err.expected = this.digests
      err.algorithm = this.algorithm
      err.sri = this.sri
      this.emit('error', err)
    } else {
      this.emit('size', this.size)
      this.emit('integrity', newSri)
      match && this.emit('verified', match)
    }
  }
}

class Hash {
  get isHash () { return true }
  constructor (hash, opts) {
    opts = ssriOpts(opts)
    const strict = !!opts.strict
    this.source = hash.trim()

    // set default values so that we make V8 happy to
    // always see a familiar object template.
    this.digest = ''
    this.algorithm = ''
    this.options = []

    // 3.1. Integrity metadata (called "Hash" by ssri)
    // https://w3c.github.io/webappsec-subresource-integrity/#integrity-metadata-description
    const match = this.source.match(
      strict
        ? STRICT_SRI_REGEX
        : SRI_REGEX
    )
    if (!match) { return }
    if (strict && !SPEC_ALGORITHMS.some(a => a === match[1])) { return }
    this.algorithm = match[1]
    this.digest = match[2]

    const rawOpts = match[3]
    if (rawOpts) {
      this.options = rawOpts.slice(1).split('?')
    }
  }

  hexDigest () {
    return this.digest && Buffer.from(this.digest, 'base64').toString('hex')
  }

  toJSON () {
    return this.toString()
  }

  toString (opts) {
    opts = ssriOpts(opts)
    if (opts.strict) {
      // Strict mode enforces the standard as close to the foot of the
      // letter as it can.
      if (!(
        // The spec has very restricted productions for algorithms.
        // https://www.w3.org/TR/CSP2/#source-list-syntax
        SPEC_ALGORITHMS.some(x => x === this.algorithm) &&
        // Usually, if someone insists on using a "different" base64, we
        // leave it as-is, since there's multiple standards, and the
        // specified is not a URL-safe variant.
        // https://www.w3.org/TR/CSP2/#base64_value
        this.digest.match(BASE64_REGEX) &&
        // Option syntax is strictly visual chars.
        // https://w3c.github.io/webappsec-subresource-integrity/#grammardef-option-expression
        // https://tools.ietf.org/html/rfc5234#appendix-B.1
        this.options.every(opt => opt.match(VCHAR_REGEX))
      )) {
        return ''
      }
    }
    const options = this.options && this.options.length
      ? `?${this.options.join('?')}`
      : ''
    return `${this.algorithm}-${this.digest}${options}`
  }
}

class Integrity {
  get isIntegrity () { return true }
  toJSON () {
    return this.toString()
  }

  isEmpty () {
    return Object.keys(this).length === 0
  }

  toString (opts) {
    opts = ssriOpts(opts)
    let sep = opts.sep || ' '
    if (opts.strict) {
      // Entries must be separated by whitespace, according to spec.
      sep = sep.replace(/\S+/g, ' ')
    }
    return Object.keys(this).map(k => {
      return this[k].map(hash => {
        return Hash.prototype.toString.call(hash, opts)
      }).filter(x => x.length).join(sep)
    }).filter(x => x.length).join(sep)
  }

  concat (integrity, opts) {
    opts = ssriOpts(opts)
    const other = typeof integrity === 'string'
      ? integrity
      : stringify(integrity, opts)
    return parse(`${this.toString(opts)} ${other}`, opts)
  }

  hexDigest () {
    return parse(this, { single: true }).hexDigest()
  }

  // add additional hashes to an integrity value, but prevent
  // *changing* an existing integrity hash.
  merge (integrity, opts) {
    opts = ssriOpts(opts)
    const other = parse(integrity, opts)
    for (const algo in other) {
      if (this[algo]) {
        if (!this[algo].find(hash =>
          other[algo].find(otherhash =>
            hash.digest === otherhash.digest))) {
          throw new Error('hashes do not match, cannot update integrity')
        }
      } else {
        this[algo] = other[algo]
      }
    }
  }

  match (integrity, opts) {
    opts = ssriOpts(opts)
    const other = parse(integrity, opts)
    const algo = other.pickAlgorithm(opts)
    return (
      this[algo] &&
      other[algo] &&
      this[algo].find(hash =>
        other[algo].find(otherhash =>
          hash.digest === otherhash.digest
        )
      )
    ) || false
  }

  pickAlgorithm (opts) {
    opts = ssriOpts(opts)
    const pickAlgorithm = opts.pickAlgorithm
    const keys = Object.keys(this)
    return keys.reduce((acc, algo) => {
      return pickAlgorithm(acc, algo) || acc
    })
  }
}

module.exports.parse = parse
function parse (sri, opts) {
  if (!sri) return null
  opts = ssriOpts(opts)
  if (typeof sri === 'string') {
    return _parse(sri, opts)
  } else if (sri.algorithm && sri.digest) {
    const fullSri = new Integrity()
    fullSri[sri.algorithm] = [sri]
    return _parse(stringify(fullSri, opts), opts)
  } else {
    return _parse(stringify(sri, opts), opts)
  }
}

function _parse (integrity, opts) {
  // 3.4.3. Parse metadata
  // https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata
  if (opts.single) {
    return new Hash(integrity, opts)
  }
  const hashes = integrity.trim().split(/\s+/).reduce((acc, string) => {
    const hash = new Hash(string, opts)
    if (hash.algorithm && hash.digest) {
      const algo = hash.algorithm
      if (!acc[algo]) { acc[algo] = [] }
      acc[algo].push(hash)
    }
    return acc
  }, new Integrity())
  return hashes.isEmpty() ? null : hashes
}

module.exports.stringify = stringify
function stringify (obj, opts) {
  opts = ssriOpts(opts)
  if (obj.algorithm && obj.digest) {
    return Hash.prototype.toString.call(obj, opts)
  } else if (typeof obj === 'string') {
    return stringify(parse(obj, opts), opts)
  } else {
    return Integrity.prototype.toString.call(obj, opts)
  }
}

module.exports.fromHex = fromHex
function fromHex (hexDigest, algorithm, opts) {
  opts = ssriOpts(opts)
  const optString = getOptString(opts.options)
  return parse(
    `${algorithm}-${
      Buffer.from(hexDigest, 'hex').toString('base64')
    }${optString}`, opts
  )
}

module.exports.fromData = fromData
function fromData (data, opts) {
  opts = ssriOpts(opts)
  const algorithms = opts.algorithms
  const optString = getOptString(opts.options)
  return algorithms.reduce((acc, algo) => {
    const digest = crypto.createHash(algo).update(data).digest('base64')
    const hash = new Hash(
      `${algo}-${digest}${optString}`,
      opts
    )
    /* istanbul ignore else - it would be VERY strange if the string we
     * just calculated with an algo did not have an algo or digest.
     */
    if (hash.algorithm && hash.digest) {
      const algo = hash.algorithm
      if (!acc[algo]) { acc[algo] = [] }
      acc[algo].push(hash)
    }
    return acc
  }, new Integrity())
}

module.exports.fromStream = fromStream
function fromStream (stream, opts) {
  opts = ssriOpts(opts)
  const istream = integrityStream(opts)
  return new Promise((resolve, reject) => {
    stream.pipe(istream)
    stream.on('error', reject)
    istream.on('error', reject)
    let sri
    istream.on('integrity', s => { sri = s })
    istream.on('end', () => resolve(sri))
    istream.on('data', () => {})
  })
}

module.exports.checkData = checkData
function checkData (data, sri, opts) {
  opts = ssriOpts(opts)
  sri = parse(sri, opts)
  if (!sri || !Object.keys(sri).length) {
    if (opts.error) {
      throw Object.assign(
        new Error('No valid integrity hashes to check against'), {
          code: 'EINTEGRITY'
        }
      )
    } else {
      return false
    }
  }
  const algorithm = sri.pickAlgorithm(opts)
  const digest = crypto.createHash(algorithm).update(data).digest('base64')
  const newSri = parse({ algorithm, digest })
  const match = newSri.match(sri, opts)
  if (match || !opts.error) {
    return match
  } else if (typeof opts.size === 'number' && (data.length !== opts.size)) {
    const err = new Error(`data size mismatch when checking ${sri}.\n  Wanted: ${opts.size}\n  Found: ${data.length}`)
    err.code = 'EBADSIZE'
    err.found = data.length
    err.expected = opts.size
    err.sri = sri
    throw err
  } else {
    const err = new Error(`Integrity checksum failed when using ${algorithm}: Wanted ${sri}, but got ${newSri}. (${data.length} bytes)`)
    err.code = 'EINTEGRITY'
    err.found = newSri
    err.expected = sri
    err.algorithm = algorithm
    err.sri = sri
    throw err
  }
}

module.exports.checkStream = checkStream
function checkStream (stream, sri, opts) {
  opts = ssriOpts(opts)
  opts.integrity = sri
  sri = parse(sri, opts)
  if (!sri || !Object.keys(sri).length) {
    return Promise.reject(Object.assign(
      new Error('No valid integrity hashes to check against'), {
        code: 'EINTEGRITY'
      }
    ))
  }
  const checker = integrityStream(opts)
  return new Promise((resolve, reject) => {
    stream.pipe(checker)
    stream.on('error', reject)
    checker.on('error', reject)
    let sri
    checker.on('verified', s => { sri = s })
    checker.on('end', () => resolve(sri))
    checker.on('data', () => {})
  })
}

module.exports.integrityStream = integrityStream
function integrityStream (opts = {}) {
  return new IntegrityStream(opts)
}

module.exports.create = createIntegrity
function createIntegrity (opts) {
  opts = ssriOpts(opts)
  const algorithms = opts.algorithms
  const optString = getOptString(opts.options)

  const hashes = algorithms.map(crypto.createHash)

  return {
    update: function (chunk, enc) {
      hashes.forEach(h => h.update(chunk, enc))
      return this
    },
    digest: function (enc) {
      const integrity = algorithms.reduce((acc, algo) => {
        const digest = hashes.shift().digest('base64')
        const hash = new Hash(
          `${algo}-${digest}${optString}`,
          opts
        )
        /* istanbul ignore else - it would be VERY strange if the hash we
         * just calculated with an algo did not have an algo or digest.
         */
        if (hash.algorithm && hash.digest) {
          const algo = hash.algorithm
          if (!acc[algo]) { acc[algo] = [] }
          acc[algo].push(hash)
        }
        return acc
      }, new Integrity())

      return integrity
    }
  }
}

const NODE_HASHES = new Set(crypto.getHashes())

// This is a Best Effort™ at a reasonable priority for hash algos
const DEFAULT_PRIORITY = [
  'md5', 'whirlpool', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512',
  // TODO - it's unclear _which_ of these Node will actually use as its name
  //        for the algorithm, so we guesswork it based on the OpenSSL names.
  'sha3',
  'sha3-256', 'sha3-384', 'sha3-512',
  'sha3_256', 'sha3_384', 'sha3_512'
].filter(algo => NODE_HASHES.has(algo))

function getPrioritizedHash (algo1, algo2) {
  return DEFAULT_PRIORITY.indexOf(algo1.toLowerCase()) >= DEFAULT_PRIORITY.indexOf(algo2.toLowerCase())
    ? algo1
    : algo2
}
{
  "name": "ssri",
  "version": "8.0.1",
  "description": "Standard Subresource Integrity library -- parses, serializes, generates, and verifies integrity metadata according to the SRI spec.",
  "main": "index.js",
  "files": [],
  "tap": {
    "check-coverage": true
  },
  "repository": "https://github.com/npm/ssri",
  "author": {
    "name": "Kat Marchán",
    "email": "kzm@sykosomatic.org",
    "twitter": "maybekatz"
  },
  "license": "ISC",
  "dependencies": {
    "minipass": "^3.1.1"
  },
  "devDependencies": {
    "standard": "^16.0.3",
    "standard-version": "^9.1.0",
    "tap": "^14.10.6"
  },
  "engines": {
    "node": ">= 8"
  }
}Copyright Mathias Bynens <https://mathiasbynens.be/>

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";

module.exports = function () {
  // https://mths.be/emoji
  return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F|\uD83D\uDC68(?:\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68\uD83C\uDFFB|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83D[\uDC66\uDC67]|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708])\uFE0F|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C[\uDFFB-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)\uD83C\uDFFB|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB\uDFFC])|\uD83D\uDC69(?:\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB-\uDFFD])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620)\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF6\uD83C\uDDE6|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDBB\uDDD2-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5\uDEEB\uDEEC\uDEF4-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g;
};
{
  "name": "emoji-regex",
  "version": "8.0.0",
  "description": "A regular expression to match all Emoji-only symbols as per the Unicode Standard.",
  "homepage": "https://mths.be/emoji-regex",
  "main": "index.js",
  "types": "index.d.ts",
  "license": "MIT",
  "author": {
    "name": "Mathias Bynens",
    "url": "https://mathiasbynens.be/"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/mathiasbynens/emoji-regex.git"
  },
  "files": [
    "LICENSE-MIT.txt",
    "index.js",
    "index.d.ts",
    "text.js",
    "es2015/index.js",
    "es2015/text.js"
  ],
  "devDependencies": {
    "@babel/cli": "^7.2.3",
    "@babel/core": "^7.3.4",
    "@babel/plugin-proposal-unicode-property-regex": "^7.2.0",
    "@babel/preset-env": "^7.3.4",
    "mocha": "^6.0.2",
    "regexgen": "^1.3.0",
    "unicode-12.0.0": "^0.7.9"
  }
}"use strict";

module.exports = function () {
  // https://mths.be/emoji
  return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F|\uD83D\uDC68(?:\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68\uD83C\uDFFB|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83D[\uDC66\uDC67]|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708])\uFE0F|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C[\uDFFB-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)\uD83C\uDFFB|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB\uDFFC])|\uD83D\uDC69(?:\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB-\uDFFD])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620)\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF6\uD83C\uDDE6|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDBB\uDDD2-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5\uDEEB\uDEEC\uDEF4-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])\uFE0F?|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g;
};
"use strict";

module.exports = () => {
  // https://mths.be/emoji
  return /\u{1F3F4}\u{E0067}\u{E0062}(?:\u{E0065}\u{E006E}\u{E0067}|\u{E0073}\u{E0063}\u{E0074}|\u{E0077}\u{E006C}\u{E0073})\u{E007F}|\u{1F468}(?:\u{1F3FC}\u200D(?:\u{1F91D}\u200D\u{1F468}\u{1F3FB}|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FE}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FE}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FD}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FD}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FC}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F468}|[\u{1F468}\u{1F469}]\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}]|[\u{1F468}\u{1F469}]\u200D[\u{1F466}\u{1F467}]|[\u2695\u2696\u2708]\uFE0F|[\u{1F466}\u{1F467}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|(?:\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708])\uFE0F|\u{1F3FB}\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|[\u{1F3FB}-\u{1F3FF}])|(?:\u{1F9D1}\u{1F3FB}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FC}\u200D\u{1F91D}\u200D\u{1F469})\u{1F3FB}|\u{1F9D1}(?:\u{1F3FF}\u200D\u{1F91D}\u200D\u{1F9D1}[\u{1F3FB}-\u{1F3FF}]|\u200D\u{1F91D}\u200D\u{1F9D1})|(?:\u{1F9D1}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FF}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}-\u{1F3FE}]|(?:\u{1F9D1}\u{1F3FC}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FD}\u200D\u{1F91D}\u200D\u{1F469})[\u{1F3FB}\u{1F3FC}]|\u{1F469}(?:\u{1F3FE}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FD}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FC}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FD}-\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FB}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FC}-\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FD}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FC}\u{1F3FE}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F469}\u200D\u{1F469}\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|(?:\u{1F9D1}\u{1F3FD}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F469})[\u{1F3FB}-\u{1F3FD}]|\u{1F469}\u200D\u{1F466}\u200D\u{1F466}|\u{1F469}\u200D\u{1F469}\u200D[\u{1F466}\u{1F467}]|(?:\u{1F441}\uFE0F\u200D\u{1F5E8}|\u{1F469}(?:\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708]|\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}]\uFE0F|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}])\u200D[\u2640\u2642]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D6}-\u{1F9DD}](?:[\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\u{1F3F4}\u200D\u2620)\uFE0F|\u{1F469}\u200D\u{1F467}\u200D[\u{1F466}\u{1F467}]|\u{1F3F3}\uFE0F\u200D\u{1F308}|\u{1F415}\u200D\u{1F9BA}|\u{1F469}\u200D\u{1F466}|\u{1F469}\u200D\u{1F467}|\u{1F1FD}\u{1F1F0}|\u{1F1F4}\u{1F1F2}|\u{1F1F6}\u{1F1E6}|[#\*0-9]\uFE0F\u20E3|\u{1F1E7}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EF}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1F9}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1ED}\u{1F1EF}-\u{1F1F4}\u{1F1F7}\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FF}]|\u{1F1EA}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1ED}\u{1F1F7}-\u{1F1FA}]|\u{1F9D1}[\u{1F3FB}-\u{1F3FF}]|\u{1F1F7}[\u{1F1EA}\u{1F1F4}\u{1F1F8}\u{1F1FA}\u{1F1FC}]|\u{1F469}[\u{1F3FB}-\u{1F3FF}]|\u{1F1F2}[\u{1F1E6}\u{1F1E8}-\u{1F1ED}\u{1F1F0}-\u{1F1FF}]|\u{1F1E6}[\u{1F1E8}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F2}\u{1F1F4}\u{1F1F6}-\u{1F1FA}\u{1F1FC}\u{1F1FD}\u{1F1FF}]|\u{1F1F0}[\u{1F1EA}\u{1F1EC}-\u{1F1EE}\u{1F1F2}\u{1F1F3}\u{1F1F5}\u{1F1F7}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1ED}[\u{1F1F0}\u{1F1F2}\u{1F1F3}\u{1F1F7}\u{1F1F9}\u{1F1FA}]|\u{1F1E9}[\u{1F1EA}\u{1F1EC}\u{1F1EF}\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1FF}]|\u{1F1FE}[\u{1F1EA}\u{1F1F9}]|\u{1F1EC}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EE}\u{1F1F1}-\u{1F1F3}\u{1F1F5}-\u{1F1FA}\u{1F1FC}\u{1F1FE}]|\u{1F1F8}[\u{1F1E6}-\u{1F1EA}\u{1F1EC}-\u{1F1F4}\u{1F1F7}-\u{1F1F9}\u{1F1FB}\u{1F1FD}-\u{1F1FF}]|\u{1F1EB}[\u{1F1EE}-\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1F7}]|\u{1F1F5}[\u{1F1E6}\u{1F1EA}-\u{1F1ED}\u{1F1F0}-\u{1F1F3}\u{1F1F7}-\u{1F1F9}\u{1F1FC}\u{1F1FE}]|\u{1F1FB}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1EE}\u{1F1F3}\u{1F1FA}]|\u{1F1F3}[\u{1F1E6}\u{1F1E8}\u{1F1EA}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F4}\u{1F1F5}\u{1F1F7}\u{1F1FA}\u{1F1FF}]|\u{1F1E8}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1EE}\u{1F1F0}-\u{1F1F5}\u{1F1F7}\u{1F1FA}-\u{1F1FF}]|\u{1F1F1}[\u{1F1E6}-\u{1F1E8}\u{1F1EE}\u{1F1F0}\u{1F1F7}-\u{1F1FB}\u{1F1FE}]|\u{1F1FF}[\u{1F1E6}\u{1F1F2}\u{1F1FC}]|\u{1F1FC}[\u{1F1EB}\u{1F1F8}]|\u{1F1FA}[\u{1F1E6}\u{1F1EC}\u{1F1F2}\u{1F1F3}\u{1F1F8}\u{1F1FE}\u{1F1FF}]|\u{1F1EE}[\u{1F1E8}-\u{1F1EA}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}]|\u{1F1EF}[\u{1F1EA}\u{1F1F2}\u{1F1F4}\u{1F1F5}]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]|[\u261D\u270A-\u270D\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F46B}-\u{1F46D}\u{1F470}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F4AA}\u{1F574}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F90F}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F936}\u{1F9B5}\u{1F9B6}\u{1F9BB}\u{1F9D2}-\u{1F9D5}][\u{1F3FB}-\u{1F3FF}]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55\u{1F004}\u{1F0CF}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F236}\u{1F238}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F320}\u{1F32D}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F37E}-\u{1F393}\u{1F3A0}-\u{1F3CA}\u{1F3CF}-\u{1F3D3}\u{1F3E0}-\u{1F3F0}\u{1F3F4}\u{1F3F8}-\u{1F43E}\u{1F440}\u{1F442}-\u{1F4FC}\u{1F4FF}-\u{1F53D}\u{1F54B}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F57A}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5FB}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CC}\u{1F6D0}-\u{1F6D2}\u{1F6D5}\u{1F6EB}\u{1F6EC}\u{1F6F4}-\u{1F6FA}\u{1F7E0}-\u{1F7EB}\u{1F90D}-\u{1F93A}\u{1F93C}-\u{1F945}\u{1F947}-\u{1F971}\u{1F973}-\u{1F976}\u{1F97A}-\u{1F9A2}\u{1F9A5}-\u{1F9AA}\u{1F9AE}-\u{1F9CA}\u{1F9CD}-\u{1F9FF}\u{1FA70}-\u{1FA73}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA82}\u{1FA90}-\u{1FA95}]|[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299\u{1F004}\u{1F0CF}\u{1F170}\u{1F171}\u{1F17E}\u{1F17F}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F202}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F321}\u{1F324}-\u{1F393}\u{1F396}\u{1F397}\u{1F399}-\u{1F39B}\u{1F39E}-\u{1F3F0}\u{1F3F3}-\u{1F3F5}\u{1F3F7}-\u{1F4FD}\u{1F4FF}-\u{1F53D}\u{1F549}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F56F}\u{1F570}\u{1F573}-\u{1F57A}\u{1F587}\u{1F58A}-\u{1F58D}\u{1F590}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5A5}\u{1F5A8}\u{1F5B1}\u{1F5B2}\u{1F5BC}\u{1F5C2}-\u{1F5C4}\u{1F5D1}-\u{1F5D3}\u{1F5DC}-\u{1F5DE}\u{1F5E1}\u{1F5E3}\u{1F5E8}\u{1F5EF}\u{1F5F3}\u{1F5FA}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CB}-\u{1F6D2}\u{1F6D5}\u{1F6E0}-\u{1F6E5}\u{1F6E9}\u{1F6EB}\u{1F6EC}\u{1F6F0}\u{1F6F3}-\u{1F6FA}\u{1F7E0}-\u{1F7EB}\u{1F90D}-\u{1F93A}\u{1F93C}-\u{1F945}\u{1F947}-\u{1F971}\u{1F973}-\u{1F976}\u{1F97A}-\u{1F9A2}\u{1F9A5}-\u{1F9AA}\u{1F9AE}-\u{1F9CA}\u{1F9CD}-\u{1F9FF}\u{1FA70}-\u{1FA73}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA82}\u{1FA90}-\u{1FA95}]\uFE0F|[\u261D\u26F9\u270A-\u270D\u{1F385}\u{1F3C2}-\u{1F3C4}\u{1F3C7}\u{1F3CA}-\u{1F3CC}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}-\u{1F478}\u{1F47C}\u{1F481}-\u{1F483}\u{1F485}-\u{1F487}\u{1F48F}\u{1F491}\u{1F4AA}\u{1F574}\u{1F575}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F645}-\u{1F647}\u{1F64B}-\u{1F64F}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F6C0}\u{1F6CC}\u{1F90F}\u{1F918}-\u{1F91F}\u{1F926}\u{1F930}-\u{1F939}\u{1F93C}-\u{1F93E}\u{1F9B5}\u{1F9B6}\u{1F9B8}\u{1F9B9}\u{1F9BB}\u{1F9CD}-\u{1F9CF}\u{1F9D1}-\u{1F9DD}]/gu;
};
"use strict";

module.exports = () => {
  // https://mths.be/emoji
  return /\u{1F3F4}\u{E0067}\u{E0062}(?:\u{E0065}\u{E006E}\u{E0067}|\u{E0073}\u{E0063}\u{E0074}|\u{E0077}\u{E006C}\u{E0073})\u{E007F}|\u{1F468}(?:\u{1F3FC}\u200D(?:\u{1F91D}\u200D\u{1F468}\u{1F3FB}|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FE}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FE}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FD}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FD}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FC}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F468}|[\u{1F468}\u{1F469}]\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}]|[\u{1F468}\u{1F469}]\u200D[\u{1F466}\u{1F467}]|[\u2695\u2696\u2708]\uFE0F|[\u{1F466}\u{1F467}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|(?:\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708])\uFE0F|\u{1F3FB}\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|[\u{1F3FB}-\u{1F3FF}])|(?:\u{1F9D1}\u{1F3FB}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FC}\u200D\u{1F91D}\u200D\u{1F469})\u{1F3FB}|\u{1F9D1}(?:\u{1F3FF}\u200D\u{1F91D}\u200D\u{1F9D1}[\u{1F3FB}-\u{1F3FF}]|\u200D\u{1F91D}\u200D\u{1F9D1})|(?:\u{1F9D1}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FF}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}-\u{1F3FE}]|(?:\u{1F9D1}\u{1F3FC}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FD}\u200D\u{1F91D}\u200D\u{1F469})[\u{1F3FB}\u{1F3FC}]|\u{1F469}(?:\u{1F3FE}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FD}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FC}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FD}-\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FB}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FC}-\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FD}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FC}\u{1F3FE}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F469}\u200D\u{1F469}\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|(?:\u{1F9D1}\u{1F3FD}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F469})[\u{1F3FB}-\u{1F3FD}]|\u{1F469}\u200D\u{1F466}\u200D\u{1F466}|\u{1F469}\u200D\u{1F469}\u200D[\u{1F466}\u{1F467}]|(?:\u{1F441}\uFE0F\u200D\u{1F5E8}|\u{1F469}(?:\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708]|\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}]\uFE0F|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}])\u200D[\u2640\u2642]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D6}-\u{1F9DD}](?:[\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\u{1F3F4}\u200D\u2620)\uFE0F|\u{1F469}\u200D\u{1F467}\u200D[\u{1F466}\u{1F467}]|\u{1F3F3}\uFE0F\u200D\u{1F308}|\u{1F415}\u200D\u{1F9BA}|\u{1F469}\u200D\u{1F466}|\u{1F469}\u200D\u{1F467}|\u{1F1FD}\u{1F1F0}|\u{1F1F4}\u{1F1F2}|\u{1F1F6}\u{1F1E6}|[#\*0-9]\uFE0F\u20E3|\u{1F1E7}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EF}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1F9}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1ED}\u{1F1EF}-\u{1F1F4}\u{1F1F7}\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FF}]|\u{1F1EA}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1ED}\u{1F1F7}-\u{1F1FA}]|\u{1F9D1}[\u{1F3FB}-\u{1F3FF}]|\u{1F1F7}[\u{1F1EA}\u{1F1F4}\u{1F1F8}\u{1F1FA}\u{1F1FC}]|\u{1F469}[\u{1F3FB}-\u{1F3FF}]|\u{1F1F2}[\u{1F1E6}\u{1F1E8}-\u{1F1ED}\u{1F1F0}-\u{1F1FF}]|\u{1F1E6}[\u{1F1E8}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F2}\u{1F1F4}\u{1F1F6}-\u{1F1FA}\u{1F1FC}\u{1F1FD}\u{1F1FF}]|\u{1F1F0}[\u{1F1EA}\u{1F1EC}-\u{1F1EE}\u{1F1F2}\u{1F1F3}\u{1F1F5}\u{1F1F7}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1ED}[\u{1F1F0}\u{1F1F2}\u{1F1F3}\u{1F1F7}\u{1F1F9}\u{1F1FA}]|\u{1F1E9}[\u{1F1EA}\u{1F1EC}\u{1F1EF}\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1FF}]|\u{1F1FE}[\u{1F1EA}\u{1F1F9}]|\u{1F1EC}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EE}\u{1F1F1}-\u{1F1F3}\u{1F1F5}-\u{1F1FA}\u{1F1FC}\u{1F1FE}]|\u{1F1F8}[\u{1F1E6}-\u{1F1EA}\u{1F1EC}-\u{1F1F4}\u{1F1F7}-\u{1F1F9}\u{1F1FB}\u{1F1FD}-\u{1F1FF}]|\u{1F1EB}[\u{1F1EE}-\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1F7}]|\u{1F1F5}[\u{1F1E6}\u{1F1EA}-\u{1F1ED}\u{1F1F0}-\u{1F1F3}\u{1F1F7}-\u{1F1F9}\u{1F1FC}\u{1F1FE}]|\u{1F1FB}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1EE}\u{1F1F3}\u{1F1FA}]|\u{1F1F3}[\u{1F1E6}\u{1F1E8}\u{1F1EA}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F4}\u{1F1F5}\u{1F1F7}\u{1F1FA}\u{1F1FF}]|\u{1F1E8}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1EE}\u{1F1F0}-\u{1F1F5}\u{1F1F7}\u{1F1FA}-\u{1F1FF}]|\u{1F1F1}[\u{1F1E6}-\u{1F1E8}\u{1F1EE}\u{1F1F0}\u{1F1F7}-\u{1F1FB}\u{1F1FE}]|\u{1F1FF}[\u{1F1E6}\u{1F1F2}\u{1F1FC}]|\u{1F1FC}[\u{1F1EB}\u{1F1F8}]|\u{1F1FA}[\u{1F1E6}\u{1F1EC}\u{1F1F2}\u{1F1F3}\u{1F1F8}\u{1F1FE}\u{1F1FF}]|\u{1F1EE}[\u{1F1E8}-\u{1F1EA}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}]|\u{1F1EF}[\u{1F1EA}\u{1F1F2}\u{1F1F4}\u{1F1F5}]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]|[\u261D\u270A-\u270D\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F46B}-\u{1F46D}\u{1F470}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F4AA}\u{1F574}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F90F}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F936}\u{1F9B5}\u{1F9B6}\u{1F9BB}\u{1F9D2}-\u{1F9D5}][\u{1F3FB}-\u{1F3FF}]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55\u{1F004}\u{1F0CF}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F236}\u{1F238}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F320}\u{1F32D}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F37E}-\u{1F393}\u{1F3A0}-\u{1F3CA}\u{1F3CF}-\u{1F3D3}\u{1F3E0}-\u{1F3F0}\u{1F3F4}\u{1F3F8}-\u{1F43E}\u{1F440}\u{1F442}-\u{1F4FC}\u{1F4FF}-\u{1F53D}\u{1F54B}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F57A}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5FB}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CC}\u{1F6D0}-\u{1F6D2}\u{1F6D5}\u{1F6EB}\u{1F6EC}\u{1F6F4}-\u{1F6FA}\u{1F7E0}-\u{1F7EB}\u{1F90D}-\u{1F93A}\u{1F93C}-\u{1F945}\u{1F947}-\u{1F971}\u{1F973}-\u{1F976}\u{1F97A}-\u{1F9A2}\u{1F9A5}-\u{1F9AA}\u{1F9AE}-\u{1F9CA}\u{1F9CD}-\u{1F9FF}\u{1FA70}-\u{1FA73}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA82}\u{1FA90}-\u{1FA95}]|[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299\u{1F004}\u{1F0CF}\u{1F170}\u{1F171}\u{1F17E}\u{1F17F}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F202}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F321}\u{1F324}-\u{1F393}\u{1F396}\u{1F397}\u{1F399}-\u{1F39B}\u{1F39E}-\u{1F3F0}\u{1F3F3}-\u{1F3F5}\u{1F3F7}-\u{1F4FD}\u{1F4FF}-\u{1F53D}\u{1F549}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F56F}\u{1F570}\u{1F573}-\u{1F57A}\u{1F587}\u{1F58A}-\u{1F58D}\u{1F590}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5A5}\u{1F5A8}\u{1F5B1}\u{1F5B2}\u{1F5BC}\u{1F5C2}-\u{1F5C4}\u{1F5D1}-\u{1F5D3}\u{1F5DC}-\u{1F5DE}\u{1F5E1}\u{1F5E3}\u{1F5E8}\u{1F5EF}\u{1F5F3}\u{1F5FA}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CB}-\u{1F6D2}\u{1F6D5}\u{1F6E0}-\u{1F6E5}\u{1F6E9}\u{1F6EB}\u{1F6EC}\u{1F6F0}\u{1F6F3}-\u{1F6FA}\u{1F7E0}-\u{1F7EB}\u{1F90D}-\u{1F93A}\u{1F93C}-\u{1F945}\u{1F947}-\u{1F971}\u{1F973}-\u{1F976}\u{1F97A}-\u{1F9A2}\u{1F9A5}-\u{1F9AA}\u{1F9AE}-\u{1F9CA}\u{1F9CD}-\u{1F9FF}\u{1FA70}-\u{1FA73}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA82}\u{1FA90}-\u{1FA95}]\uFE0F?|[\u261D\u26F9\u270A-\u270D\u{1F385}\u{1F3C2}-\u{1F3C4}\u{1F3C7}\u{1F3CA}-\u{1F3CC}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}-\u{1F478}\u{1F47C}\u{1F481}-\u{1F483}\u{1F485}-\u{1F487}\u{1F48F}\u{1F491}\u{1F4AA}\u{1F574}\u{1F575}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F645}-\u{1F647}\u{1F64B}-\u{1F64F}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F6C0}\u{1F6CC}\u{1F90F}\u{1F918}-\u{1F91F}\u{1F926}\u{1F930}-\u{1F939}\u{1F93C}-\u{1F93E}\u{1F9B5}\u{1F9B6}\u{1F9B8}\u{1F9B9}\u{1F9BB}\u{1F9CD}-\u{1F9CF}\u{1F9D1}-\u{1F9DD}]/gu;
};
The MIT License (MIT)

Copyright (c) Feross Aboukhadijeh

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.
/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
/* eslint-disable node/no-deprecated-api */
var buffer = require('buffer')
var Buffer = buffer.Buffer

// alternative to using Object.keys for old browsers
function copyProps (src, dst) {
  for (var key in src) {
    dst[key] = src[key]
  }
}
if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
  module.exports = buffer
} else {
  // Copy properties from require('buffer')
  copyProps(buffer, exports)
  exports.Buffer = SafeBuffer
}

function SafeBuffer (arg, encodingOrOffset, length) {
  return Buffer(arg, encodingOrOffset, length)
}

SafeBuffer.prototype = Object.create(Buffer.prototype)

// Copy static methods from Buffer
copyProps(Buffer, SafeBuffer)

SafeBuffer.from = function (arg, encodingOrOffset, length) {
  if (typeof arg === 'number') {
    throw new TypeError('Argument must not be a number')
  }
  return Buffer(arg, encodingOrOffset, length)
}

SafeBuffer.alloc = function (size, fill, encoding) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  var buf = Buffer(size)
  if (fill !== undefined) {
    if (typeof encoding === 'string') {
      buf.fill(fill, encoding)
    } else {
      buf.fill(fill)
    }
  } else {
    buf.fill(0)
  }
  return buf
}

SafeBuffer.allocUnsafe = function (size) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  return Buffer(size)
}

SafeBuffer.allocUnsafeSlow = function (size) {
  if (typeof size !== 'number') {
    throw new TypeError('Argument must be a number')
  }
  return buffer.SlowBuffer(size)
}
{
  "name": "safe-buffer",
  "description": "Safer Node.js Buffer API",
  "version": "5.2.1",
  "author": {
    "name": "Feross Aboukhadijeh",
    "email": "feross@feross.org",
    "url": "https://feross.org"
  },
  "devDependencies": {
    "standard": "*",
    "tape": "^5.0.0"
  },
  "homepage": "https://github.com/feross/safe-buffer",
  "license": "MIT",
  "main": "index.js",
  "types": "index.d.ts",
  "repository": {
    "type": "git",
    "url": "git://github.com/feross/safe-buffer.git"
  },
  "funding": [
    {
      "type": "github",
      "url": "https://github.com/sponsors/feross"
    },
    {
      "type": "patreon",
      "url": "https://www.patreon.com/feross"
    },
    {
      "type": "consulting",
      "url": "https://feross.org/support"
    }
  ]
}Copyright James Halliday (mail@substack.net) and Isaac Z. Schlueter (i@izs.me)

This project is free software released under the MIT license:

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.
const optsArg = require('./lib/opts-arg.js')
const pathArg = require('./lib/path-arg.js')

const {mkdirpNative, mkdirpNativeSync} = require('./lib/mkdirp-native.js')
const {mkdirpManual, mkdirpManualSync} = require('./lib/mkdirp-manual.js')
const {useNative, useNativeSync} = require('./lib/use-native.js')


const mkdirp = (path, opts) => {
  path = pathArg(path)
  opts = optsArg(opts)
  return useNative(opts)
    ? mkdirpNative(path, opts)
    : mkdirpManual(path, opts)
}

const mkdirpSync = (path, opts) => {
  path = pathArg(path)
  opts = optsArg(opts)
  return useNativeSync(opts)
    ? mkdirpNativeSync(path, opts)
    : mkdirpManualSync(path, opts)
}

mkdirp.sync = mkdirpSync
mkdirp.native = (path, opts) => mkdirpNative(pathArg(path), optsArg(opts))
mkdirp.manual = (path, opts) => mkdirpManual(pathArg(path), optsArg(opts))
mkdirp.nativeSync = (path, opts) => mkdirpNativeSync(pathArg(path), optsArg(opts))
mkdirp.manualSync = (path, opts) => mkdirpManualSync(pathArg(path), optsArg(opts))

module.exports = mkdirp
{
  "name": "mkdirp",
  "description": "Recursively mkdir, like `mkdir -p`",
  "version": "1.0.4",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "https://github.com/isaacs/node-mkdirp.git"
  },
  "tap": {
    "check-coverage": true,
    "coverage-map": "map.js"
  },
  "devDependencies": {
    "require-inject": "^1.4.4",
    "tap": "^14.10.7"
  },
  "bin": "bin/cmd.js",
  "license": "MIT",
  "engines": {
    "node": ">=10"
  },
  "files": [
    "bin",
    "lib",
    "index.js"
  ]
}const {dirname} = require('path')

const findMade = (opts, parent, path = undefined) => {
  // we never want the 'made' return value to be a root directory
  if (path === parent)
    return Promise.resolve()

  return opts.statAsync(parent).then(
    st => st.isDirectory() ? path : undefined, // will fail later
    er => er.code === 'ENOENT'
      ? findMade(opts, dirname(parent), parent)
      : undefined
  )
}

const findMadeSync = (opts, parent, path = undefined) => {
  if (path === parent)
    return undefined

  try {
    return opts.statSync(parent).isDirectory() ? path : undefined
  } catch (er) {
    return er.code === 'ENOENT'
      ? findMadeSync(opts, dirname(parent), parent)
      : undefined
  }
}

module.exports = {findMade, findMadeSync}
const {dirname} = require('path')

const mkdirpManual = (path, opts, made) => {
  opts.recursive = false
  const parent = dirname(path)
  if (parent === path) {
    return opts.mkdirAsync(path, opts).catch(er => {
      // swallowed by recursive implementation on posix systems
      // any other error is a failure
      if (er.code !== 'EISDIR')
        throw er
    })
  }

  return opts.mkdirAsync(path, opts).then(() => made || path, er => {
    if (er.code === 'ENOENT')
      return mkdirpManual(parent, opts)
        .then(made => mkdirpManual(path, opts, made))
    if (er.code !== 'EEXIST' && er.code !== 'EROFS')
      throw er
    return opts.statAsync(path).then(st => {
      if (st.isDirectory())
        return made
      else
        throw er
    }, () => { throw er })
  })
}

const mkdirpManualSync = (path, opts, made) => {
  const parent = dirname(path)
  opts.recursive = false

  if (parent === path) {
    try {
      return opts.mkdirSync(path, opts)
    } catch (er) {
      // swallowed by recursive implementation on posix systems
      // any other error is a failure
      if (er.code !== 'EISDIR')
        throw er
      else
        return
    }
  }

  try {
    opts.mkdirSync(path, opts)
    return made || path
  } catch (er) {
    if (er.code === 'ENOENT')
      return mkdirpManualSync(path, opts, mkdirpManualSync(parent, opts, made))
    if (er.code !== 'EEXIST' && er.code !== 'EROFS')
      throw er
    try {
      if (!opts.statSync(path).isDirectory())
        throw er
    } catch (_) {
      throw er
    }
  }
}

module.exports = {mkdirpManual, mkdirpManualSync}
const {dirname} = require('path')
const {findMade, findMadeSync} = require('./find-made.js')
const {mkdirpManual, mkdirpManualSync} = require('./mkdirp-manual.js')

const mkdirpNative = (path, opts) => {
  opts.recursive = true
  const parent = dirname(path)
  if (parent === path)
    return opts.mkdirAsync(path, opts)

  return findMade(opts, path).then(made =>
    opts.mkdirAsync(path, opts).then(() => made)
    .catch(er => {
      if (er.code === 'ENOENT')
        return mkdirpManual(path, opts)
      else
        throw er
    }))
}

const mkdirpNativeSync = (path, opts) => {
  opts.recursive = true
  const parent = dirname(path)
  if (parent === path)
    return opts.mkdirSync(path, opts)

  const made = findMadeSync(opts, path)
  try {
    opts.mkdirSync(path, opts)
    return made
  } catch (er) {
    if (er.code === 'ENOENT')
      return mkdirpManualSync(path, opts)
    else
      throw er
  }
}

module.exports = {mkdirpNative, mkdirpNativeSync}
const { promisify } = require('util')
const fs = require('fs')
const optsArg = opts => {
  if (!opts)
    opts = { mode: 0o777, fs }
  else if (typeof opts === 'object')
    opts = { mode: 0o777, fs, ...opts }
  else if (typeof opts === 'number')
    opts = { mode: opts, fs }
  else if (typeof opts === 'string')
    opts = { mode: parseInt(opts, 8), fs }
  else
    throw new TypeError('invalid options argument')

  opts.mkdir = opts.mkdir || opts.fs.mkdir || fs.mkdir
  opts.mkdirAsync = promisify(opts.mkdir)
  opts.stat = opts.stat || opts.fs.stat || fs.stat
  opts.statAsync = promisify(opts.stat)
  opts.statSync = opts.statSync || opts.fs.statSync || fs.statSync
  opts.mkdirSync = opts.mkdirSync || opts.fs.mkdirSync || fs.mkdirSync
  return opts
}
module.exports = optsArg
const platform = process.env.__TESTING_MKDIRP_PLATFORM__ || process.platform
const { resolve, parse } = require('path')
const pathArg = path => {
  if (/\0/.test(path)) {
    // simulate same failure that node raises
    throw Object.assign(
      new TypeError('path must be a string without null bytes'),
      {
        path,
        code: 'ERR_INVALID_ARG_VALUE',
      }
    )
  }

  path = resolve(path)
  if (platform === 'win32') {
    const badWinChars = /[*|"<>?:]/
    const {root} = parse(path)
    if (badWinChars.test(path.substr(root.length))) {
      throw Object.assign(new Error('Illegal characters in path.'), {
        path,
        code: 'EINVAL',
      })
    }
  }

  return path
}
module.exports = pathArg
const fs = require('fs')

const version = process.env.__TESTING_MKDIRP_NODE_VERSION__ || process.version
const versArr = version.replace(/^v/, '').split('.')
const hasNative = +versArr[0] > 10 || +versArr[0] === 10 && +versArr[1] >= 12

const useNative = !hasNative ? () => false : opts => opts.mkdir === fs.mkdir
const useNativeSync = !hasNative ? () => false : opts => opts.mkdirSync === fs.mkdirSync

module.exports = {useNative, useNativeSync}
#!/usr/bin/env node

const usage = () => `
usage: mkdirp [DIR1,DIR2..] {OPTIONS}

  Create each supplied directory including any necessary parent directories
  that don't yet exist.

  If the directory already exists, do nothing.

OPTIONS are:

  -m<mode>       If a directory needs to be created, set the mode as an octal
  --mode=<mode>  permission string.

  -v --version   Print the mkdirp version number

  -h --help      Print this helpful banner

  -p --print     Print the first directories created for each path provided

  --manual       Use manual implementation, even if native is available
`

const dirs = []
const opts = {}
let print = false
let dashdash = false
let manual = false
for (const arg of process.argv.slice(2)) {
  if (dashdash)
    dirs.push(arg)
  else if (arg === '--')
    dashdash = true
  else if (arg === '--manual')
    manual = true
  else if (/^-h/.test(arg) || /^--help/.test(arg)) {
    console.log(usage())
    process.exit(0)
  } else if (arg === '-v' || arg === '--version') {
    console.log(require('../package.json').version)
    process.exit(0)
  } else if (arg === '-p' || arg === '--print') {
    print = true
  } else if (/^-m/.test(arg) || /^--mode=/.test(arg)) {
    const mode = parseInt(arg.replace(/^(-m|--mode=)/, ''), 8)
    if (isNaN(mode)) {
      console.error(`invalid mode argument: ${arg}\nMust be an octal number.`)
      process.exit(1)
    }
    opts.mode = mode
  } else
    dirs.push(arg)
}

const mkdirp = require('../')
const impl = manual ? mkdirp.manual : mkdirp
if (dirs.length === 0)
  console.error(usage())

Promise.all(dirs.map(dir => impl(dir, opts)))
  .then(made => print ? made.forEach(m => m && console.log(m)) : null)
  .catch(er => {
    console.error(er.message)
    if (er.code)
      console.error('  code: ' + er.code)
    process.exit(1)
  })
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.
'use strict'
const fs = require('fs')
const path = require('path')

/* istanbul ignore next */
const LCHOWN = fs.lchown ? 'lchown' : 'chown'
/* istanbul ignore next */
const LCHOWNSYNC = fs.lchownSync ? 'lchownSync' : 'chownSync'

/* istanbul ignore next */
const needEISDIRHandled = fs.lchown &&
  !process.version.match(/v1[1-9]+\./) &&
  !process.version.match(/v10\.[6-9]/)

const lchownSync = (path, uid, gid) => {
  try {
    return fs[LCHOWNSYNC](path, uid, gid)
  } catch (er) {
    if (er.code !== 'ENOENT')
      throw er
  }
}

/* istanbul ignore next */
const chownSync = (path, uid, gid) => {
  try {
    return fs.chownSync(path, uid, gid)
  } catch (er) {
    if (er.code !== 'ENOENT')
      throw er
  }
}

/* istanbul ignore next */
const handleEISDIR =
  needEISDIRHandled ? (path, uid, gid, cb) => er => {
    // Node prior to v10 had a very questionable implementation of
    // fs.lchown, which would always try to call fs.open on a directory
    // Fall back to fs.chown in those cases.
    if (!er || er.code !== 'EISDIR')
      cb(er)
    else
      fs.chown(path, uid, gid, cb)
  }
  : (_, __, ___, cb) => cb

/* istanbul ignore next */
const handleEISDirSync =
  needEISDIRHandled ? (path, uid, gid) => {
    try {
      return lchownSync(path, uid, gid)
    } catch (er) {
      if (er.code !== 'EISDIR')
        throw er
      chownSync(path, uid, gid)
    }
  }
  : (path, uid, gid) => lchownSync(path, uid, gid)

// fs.readdir could only accept an options object as of node v6
const nodeVersion = process.version
let readdir = (path, options, cb) => fs.readdir(path, options, cb)
let readdirSync = (path, options) => fs.readdirSync(path, options)
/* istanbul ignore next */
if (/^v4\./.test(nodeVersion))
  readdir = (path, options, cb) => fs.readdir(path, cb)

const chown = (cpath, uid, gid, cb) => {
  fs[LCHOWN](cpath, uid, gid, handleEISDIR(cpath, uid, gid, er => {
    // Skip ENOENT error
    cb(er && er.code !== 'ENOENT' ? er : null)
  }))
}

const chownrKid = (p, child, uid, gid, cb) => {
  if (typeof child === 'string')
    return fs.lstat(path.resolve(p, child), (er, stats) => {
      // Skip ENOENT error
      if (er)
        return cb(er.code !== 'ENOENT' ? er : null)
      stats.name = child
      chownrKid(p, stats, uid, gid, cb)
    })

  if (child.isDirectory()) {
    chownr(path.resolve(p, child.name), uid, gid, er => {
      if (er)
        return cb(er)
      const cpath = path.resolve(p, child.name)
      chown(cpath, uid, gid, cb)
    })
  } else {
    const cpath = path.resolve(p, child.name)
    chown(cpath, uid, gid, cb)
  }
}


const chownr = (p, uid, gid, cb) => {
  readdir(p, { withFileTypes: true }, (er, children) => {
    // any error other than ENOTDIR or ENOTSUP means it's not readable,
    // or doesn't exist.  give up.
    if (er) {
      if (er.code === 'ENOENT')
        return cb()
      else if (er.code !== 'ENOTDIR' && er.code !== 'ENOTSUP')
        return cb(er)
    }
    if (er || !children.length)
      return chown(p, uid, gid, cb)

    let len = children.length
    let errState = null
    const then = er => {
      if (errState)
        return
      if (er)
        return cb(errState = er)
      if (-- len === 0)
        return chown(p, uid, gid, cb)
    }

    children.forEach(child => chownrKid(p, child, uid, gid, then))
  })
}

const chownrKidSync = (p, child, uid, gid) => {
  if (typeof child === 'string') {
    try {
      const stats = fs.lstatSync(path.resolve(p, child))
      stats.name = child
      child = stats
    } catch (er) {
      if (er.code === 'ENOENT')
        return
      else
        throw er
    }
  }

  if (child.isDirectory())
    chownrSync(path.resolve(p, child.name), uid, gid)

  handleEISDirSync(path.resolve(p, child.name), uid, gid)
}

const chownrSync = (p, uid, gid) => {
  let children
  try {
    children = readdirSync(p, { withFileTypes: true })
  } catch (er) {
    if (er.code === 'ENOENT')
      return
    else if (er.code === 'ENOTDIR' || er.code === 'ENOTSUP')
      return handleEISDirSync(p, uid, gid)
    else
      throw er
  }

  if (children && children.length)
    children.forEach(child => chownrKidSync(p, child, uid, gid))

  return handleEISDirSync(p, uid, gid)
}

module.exports = chownr
chownr.sync = chownrSync
{
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
  "name": "chownr",
  "description": "like `chown -R`",
  "version": "1.1.4",
  "repository": {
    "type": "git",
    "url": "git://github.com/isaacs/chownr.git"
  },
  "main": "chownr.js",
  "files": [
    "chownr.js"
  ],
  "devDependencies": {
    "mkdirp": "0.3",
    "rimraf": "^2.7.1",
    "tap": "^14.10.6"
  },
  "tap": {
    "check-coverage": true
  },
  "license": "ISC"
}'use strict'

const { Buffer } = require('buffer')
const symbol = Symbol.for('BufferList')

function BufferList (buf) {
  if (!(this instanceof BufferList)) {
    return new BufferList(buf)
  }

  BufferList._init.call(this, buf)
}

BufferList._init = function _init (buf) {
  Object.defineProperty(this, symbol, { value: true })

  this._bufs = []
  this.length = 0

  if (buf) {
    this.append(buf)
  }
}

BufferList.prototype._new = function _new (buf) {
  return new BufferList(buf)
}

BufferList.prototype._offset = function _offset (offset) {
  if (offset === 0) {
    return [0, 0]
  }

  let tot = 0

  for (let i = 0; i < this._bufs.length; i++) {
    const _t = tot + this._bufs[i].length
    if (offset < _t || i === this._bufs.length - 1) {
      return [i, offset - tot]
    }
    tot = _t
  }
}

BufferList.prototype._reverseOffset = function (blOffset) {
  const bufferId = blOffset[0]
  let offset = blOffset[1]

  for (let i = 0; i < bufferId; i++) {
    offset += this._bufs[i].length
  }

  return offset
}

BufferList.prototype.get = function get (index) {
  if (index > this.length || index < 0) {
    return undefined
  }

  const offset = this._offset(index)

  return this._bufs[offset[0]][offset[1]]
}

BufferList.prototype.slice = function slice (start, end) {
  if (typeof start === 'number' && start < 0) {
    start += this.length
  }

  if (typeof end === 'number' && end < 0) {
    end += this.length
  }

  return this.copy(null, 0, start, end)
}

BufferList.prototype.copy = function copy (dst, dstStart, srcStart, srcEnd) {
  if (typeof srcStart !== 'number' || srcStart < 0) {
    srcStart = 0
  }

  if (typeof srcEnd !== 'number' || srcEnd > this.length) {
    srcEnd = this.length
  }

  if (srcStart >= this.length) {
    return dst || Buffer.alloc(0)
  }

  if (srcEnd <= 0) {
    return dst || Buffer.alloc(0)
  }

  const copy = !!dst
  const off = this._offset(srcStart)
  const len = srcEnd - srcStart
  let bytes = len
  let bufoff = (copy && dstStart) || 0
  let start = off[1]

  // copy/slice everything
  if (srcStart === 0 && srcEnd === this.length) {
    if (!copy) {
      // slice, but full concat if multiple buffers
      return this._bufs.length === 1
        ? this._bufs[0]
        : Buffer.concat(this._bufs, this.length)
    }

    // copy, need to copy individual buffers
    for (let i = 0; i < this._bufs.length; i++) {
      this._bufs[i].copy(dst, bufoff)
      bufoff += this._bufs[i].length
    }

    return dst
  }

  // easy, cheap case where it's a subset of one of the buffers
  if (bytes <= this._bufs[off[0]].length - start) {
    return copy
      ? this._bufs[off[0]].copy(dst, dstStart, start, start + bytes)
      : this._bufs[off[0]].slice(start, start + bytes)
  }

  if (!copy) {
    // a slice, we need something to copy in to
    dst = Buffer.allocUnsafe(len)
  }

  for (let i = off[0]; i < this._bufs.length; i++) {
    const l = this._bufs[i].length - start

    if (bytes > l) {
      this._bufs[i].copy(dst, bufoff, start)
      bufoff += l
    } else {
      this._bufs[i].copy(dst, bufoff, start, start + bytes)
      bufoff += l
      break
    }

    bytes -= l

    if (start) {
      start = 0
    }
  }

  // safeguard so that we don't return uninitialized memory
  if (dst.length > bufoff) return dst.slice(0, bufoff)

  return dst
}

BufferList.prototype.shallowSlice = function shallowSlice (start, end) {
  start = start || 0
  end = typeof end !== 'number' ? this.length : end

  if (start < 0) {
    start += this.length
  }

  if (end < 0) {
    end += this.length
  }

  if (start === end) {
    return this._new()
  }

  const startOffset = this._offset(start)
  const endOffset = this._offset(end)
  const buffers = this._bufs.slice(startOffset[0], endOffset[0] + 1)

  if (endOffset[1] === 0) {
    buffers.pop()
  } else {
    buffers[buffers.length - 1] = buffers[buffers.length - 1].slice(0, endOffset[1])
  }

  if (startOffset[1] !== 0) {
    buffers[0] = buffers[0].slice(startOffset[1])
  }

  return this._new(buffers)
}

BufferList.prototype.toString = function toString (encoding, start, end) {
  return this.slice(start, end).toString(encoding)
}

BufferList.prototype.consume = function consume (bytes) {
  // first, normalize the argument, in accordance with how Buffer does it
  bytes = Math.trunc(bytes)
  // do nothing if not a positive number
  if (Number.isNaN(bytes) || bytes <= 0) return this

  while (this._bufs.length) {
    if (bytes >= this._bufs[0].length) {
      bytes -= this._bufs[0].length
      this.length -= this._bufs[0].length
      this._bufs.shift()
    } else {
      this._bufs[0] = this._bufs[0].slice(bytes)
      this.length -= bytes
      break
    }
  }

  return this
}

BufferList.prototype.duplicate = function duplicate () {
  const copy = this._new()

  for (let i = 0; i < this._bufs.length; i++) {
    copy.append(this._bufs[i])
  }

  return copy
}

BufferList.prototype.append = function append (buf) {
  if (buf == null) {
    return this
  }

  if (buf.buffer) {
    // append a view of the underlying ArrayBuffer
    this._appendBuffer(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength))
  } else if (Array.isArray(buf)) {
    for (let i = 0; i < buf.length; i++) {
      this.append(buf[i])
    }
  } else if (this._isBufferList(buf)) {
    // unwrap argument into individual BufferLists
    for (let i = 0; i < buf._bufs.length; i++) {
      this.append(buf._bufs[i])
    }
  } else {
    // coerce number arguments to strings, since Buffer(number) does
    // uninitialized memory allocation
    if (typeof buf === 'number') {
      buf = buf.toString()
    }

    this._appendBuffer(Buffer.from(buf))
  }

  return this
}

BufferList.prototype._appendBuffer = function appendBuffer (buf) {
  this._bufs.push(buf)
  this.length += buf.length
}

BufferList.prototype.indexOf = function (search, offset, encoding) {
  if (encoding === undefined && typeof offset === 'string') {
    encoding = offset
    offset = undefined
  }

  if (typeof search === 'function' || Array.isArray(search)) {
    throw new TypeError('The "value" argument must be one of type string, Buffer, BufferList, or Uint8Array.')
  } else if (typeof search === 'number') {
    search = Buffer.from([search])
  } else if (typeof search === 'string') {
    search = Buffer.from(search, encoding)
  } else if (this._isBufferList(search)) {
    search = search.slice()
  } else if (Array.isArray(search.buffer)) {
    search = Buffer.from(search.buffer, search.byteOffset, search.byteLength)
  } else if (!Buffer.isBuffer(search)) {
    search = Buffer.from(search)
  }

  offset = Number(offset || 0)

  if (isNaN(offset)) {
    offset = 0
  }

  if (offset < 0) {
    offset = this.length + offset
  }

  if (offset < 0) {
    offset = 0
  }

  if (search.length === 0) {
    return offset > this.length ? this.length : offset
  }

  const blOffset = this._offset(offset)
  let blIndex = blOffset[0] // index of which internal buffer we're working on
  let buffOffset = blOffset[1] // offset of the internal buffer we're working on

  // scan over each buffer
  for (; blIndex < this._bufs.length; blIndex++) {
    const buff = this._bufs[blIndex]

    while (buffOffset < buff.length) {
      const availableWindow = buff.length - buffOffset

      if (availableWindow >= search.length) {
        const nativeSearchResult = buff.indexOf(search, buffOffset)

        if (nativeSearchResult !== -1) {
          return this._reverseOffset([blIndex, nativeSearchResult])
        }

        buffOffset = buff.length - search.length + 1 // end of native search window
      } else {
        const revOffset = this._reverseOffset([blIndex, buffOffset])

        if (this._match(revOffset, search)) {
          return revOffset
        }

        buffOffset++
      }
    }

    buffOffset = 0
  }

  return -1
}

BufferList.prototype._match = function (offset, search) {
  if (this.length - offset < search.length) {
    return false
  }

  for (let searchOffset = 0; searchOffset < search.length; searchOffset++) {
    if (this.get(offset + searchOffset) !== search[searchOffset]) {
      return false
    }
  }
  return true
}

;(function () {
  const methods = {
    readDoubleBE: 8,
    readDoubleLE: 8,
    readFloatBE: 4,
    readFloatLE: 4,
    readInt32BE: 4,
    readInt32LE: 4,
    readUInt32BE: 4,
    readUInt32LE: 4,
    readInt16BE: 2,
    readInt16LE: 2,
    readUInt16BE: 2,
    readUInt16LE: 2,
    readInt8: 1,
    readUInt8: 1,
    readIntBE: null,
    readIntLE: null,
    readUIntBE: null,
    readUIntLE: null
  }

  for (const m in methods) {
    (function (m) {
      if (methods[m] === null) {
        BufferList.prototype[m] = function (offset, byteLength) {
          return this.slice(offset, offset + byteLength)[m](0, byteLength)
        }
      } else {
        BufferList.prototype[m] = function (offset = 0) {
          return this.slice(offset, offset + methods[m])[m](0)
        }
      }
    }(m))
  }
}())

// Used internally by the class and also as an indicator of this object being
// a `BufferList`. It's not possible to use `instanceof BufferList` in a browser
// environment because there could be multiple different copies of the
// BufferList class and some `BufferList`s might be `BufferList`s.
BufferList.prototype._isBufferList = function _isBufferList (b) {
  return b instanceof BufferList || BufferList.isBufferList(b)
}

BufferList.isBufferList = function isBufferList (b) {
  return b != null && b[symbol]
}

module.exports = BufferList
The MIT License (MIT)
=====================

Copyright (c) 2013-2019 bl contributors
----------------------------------

*bl contributors listed at <https://github.com/rvagg/bl#contributors>*

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

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

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

const DuplexStream = require('readable-stream').Duplex
const inherits = require('inherits')
const BufferList = require('./BufferList')

function BufferListStream (callback) {
  if (!(this instanceof BufferListStream)) {
    return new BufferListStream(callback)
  }

  if (typeof callback === 'function') {
    this._callback = callback

    const piper = function piper (err) {
      if (this._callback) {
        this._callback(err)
        this._callback = null
      }
    }.bind(this)

    this.on('pipe', function onPipe (src) {
      src.on('error', piper)
    })
    this.on('unpipe', function onUnpipe (src) {
      src.removeListener('error', piper)
    })

    callback = null
  }

  BufferList._init.call(this, callback)
  DuplexStream.call(this)
}

inherits(BufferListStream, DuplexStream)
Object.assign(BufferListStream.prototype, BufferList.prototype)

BufferListStream.prototype._new = function _new (callback) {
  return new BufferListStream(callback)
}

BufferListStream.prototype._write = function _write (buf, encoding, callback) {
  this._appendBuffer(buf)

  if (typeof callback === 'function') {
    callback()
  }
}

BufferListStream.prototype._read = function _read (size) {
  if (!this.length) {
    return this.push(null)
  }

  size = Math.min(size, this.length)
  this.push(this.slice(0, size))
  this.consume(size)
}

BufferListStream.prototype.end = function end (chunk) {
  DuplexStream.prototype.end.call(this, chunk)

  if (this._callback) {
    this._callback(null, this.slice())
    this._callback = null
  }
}

BufferListStream.prototype._destroy = function _destroy (err, cb) {
  this._bufs.length = 0
  this.length = 0
  cb(err)
}

BufferListStream.prototype._isBufferList = function _isBufferList (b) {
  return b instanceof BufferListStream || b instanceof BufferList || BufferListStream.isBufferList(b)
}

BufferListStream.isBufferList = BufferList.isBufferList

module.exports = BufferListStream
module.exports.BufferListStream = BufferListStream
module.exports.BufferList = BufferList
{
  "name": "bl",
  "version": "4.1.0",
  "description": "Buffer List: collect buffers and access with a standard readable Buffer interface, streamable too!",
  "license": "MIT",
  "main": "bl.js",
  "repository": {
    "type": "git",
    "url": "https://github.com/rvagg/bl.git"
  },
  "homepage": "https://github.com/rvagg/bl",
  "authors": [
    "Rod Vagg <rod@vagg.org> (https://github.com/rvagg)",
    "Matteo Collina <matteo.collina@gmail.com> (https://github.com/mcollina)",
    "Jarett Cruger <jcrugzz@gmail.com> (https://github.com/jcrugzz)"
  ],
  "dependencies": {
    "buffer": "^5.5.0",
    "inherits": "^2.0.4",
    "readable-stream": "^3.4.0"
  },
  "devDependencies": {
    "faucet": "~0.0.1",
    "standard": "^14.3.0",
    "tape": "^4.11.0"
  }
}# Authors

#### Ordered by first contribution.

- Romain Beauxis (toots@rastageeks.org)
- Tobias Koppers (tobias.koppers@googlemail.com)
- Janus (ysangkok@gmail.com)
- Rainer Dreyer (rdrey1@gmail.com)
- Tõnis Tiigi (tonistiigi@gmail.com)
- James Halliday (mail@substack.net)
- Michael Williamson (mike@zwobble.org)
- elliottcable (github@elliottcable.name)
- rafael (rvalle@livelens.net)
- Andrew Kelley (superjoe30@gmail.com)
- Andreas Madsen (amwebdk@gmail.com)
- Mike Brevoort (mike.brevoort@pearson.com)
- Brian White (mscdex@mscdex.net)
- Feross Aboukhadijeh (feross@feross.org)
- Ruben Verborgh (ruben@verborgh.org)
- eliang (eliang.cs@gmail.com)
- Jesse Tane (jesse.tane@gmail.com)
- Alfonso Boza (alfonso@cloud.com)
- Mathias Buus (mathiasbuus@gmail.com)
- Devon Govett (devongovett@gmail.com)
- Daniel Cousens (github@dcousens.com)
- Joseph Dykstra (josephdykstra@gmail.com)
- Parsha Pourkhomami (parshap+git@gmail.com)
- Damjan Košir (damjan.kosir@gmail.com)
- daverayment (dave.rayment@gmail.com)
- kawanet (u-suke@kawa.net)
- Linus Unnebäck (linus@folkdatorn.se)
- Nolan Lawson (nolan.lawson@gmail.com)
- Calvin Metcalf (calvin.metcalf@gmail.com)
- Koki Takahashi (hakatasiloving@gmail.com)
- Guy Bedford (guybedford@gmail.com)
- Jan Schär (jscissr@gmail.com)
- RaulTsc (tomescu.raul@gmail.com)
- Matthieu Monsch (monsch@alum.mit.edu)
- Dan Ehrenberg (littledan@chromium.org)
- Kirill Fomichev (fanatid@ya.ru)
- Yusuke Kawasaki (u-suke@kawa.net)
- DC (dcposch@dcpos.ch)
- John-David Dalton (john.david.dalton@gmail.com)
- adventure-yunfei (adventure030@gmail.com)
- Emil Bay (github@tixz.dk)
- Sam Sudar (sudar.sam@gmail.com)
- Volker Mische (volker.mische@gmail.com)
- David Walton (support@geekstocks.com)
- Сковорода Никита Андреевич (chalkerx@gmail.com)
- greenkeeper[bot] (greenkeeper[bot]@users.noreply.github.com)
- ukstv (sergey.ukustov@machinomy.com)
- Renée Kooi (renee@kooi.me)
- ranbochen (ranbochen@qq.com)
- Vladimir Borovik (bobahbdb@gmail.com)
- greenkeeper[bot] (23040076+greenkeeper[bot]@users.noreply.github.com)
- kumavis (aaron@kumavis.me)
- Sergey Ukustov (sergey.ukustov@machinomy.com)
- Fei Liu (liu.feiwood@gmail.com)
- Blaine Bublitz (blaine.bublitz@gmail.com)
- clement (clement@seald.io)
- Koushik Dutta (koushd@gmail.com)
- Jordan Harband (ljharb@gmail.com)
- Niklas Mischkulnig (mischnic@users.noreply.github.com)
- Nikolai Vavilov (vvnicholas@gmail.com)
- Fedor Nezhivoi (gyzerok@users.noreply.github.com)
- Peter Newman (peternewman@users.noreply.github.com)
- mathmakgakpak (44949126+mathmakgakpak@users.noreply.github.com)
- jkkang (jkkang@smartauth.kr)

#### Generated by bin/update-authors.sh.
The MIT License (MIT)

Copyright (c) Feross Aboukhadijeh, and other contributors.

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

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

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
/*!
 * The buffer module from node.js, for the browser.
 *
 * @author   Feross Aboukhadijeh <https://feross.org>
 * @license  MIT
 */
/* eslint-disable no-proto */

'use strict'

var base64 = require('base64-js')
var ieee754 = require('ieee754')
var customInspectSymbol =
  (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation
    ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation
    : null

exports.Buffer = Buffer
exports.SlowBuffer = SlowBuffer
exports.INSPECT_MAX_BYTES = 50

var K_MAX_LENGTH = 0x7fffffff
exports.kMaxLength = K_MAX_LENGTH

/**
 * If `Buffer.TYPED_ARRAY_SUPPORT`:
 *   === true    Use Uint8Array implementation (fastest)
 *   === false   Print warning and recommend using `buffer` v4.x which has an Object
 *               implementation (most compatible, even IE6)
 *
 * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
 * Opera 11.6+, iOS 4.2+.
 *
 * We report that the browser does not support typed arrays if the are not subclassable
 * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`
 * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support
 * for __proto__ and has a buggy typed array implementation.
 */
Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport()

if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&
    typeof console.error === 'function') {
  console.error(
    'This browser lacks typed array (Uint8Array) support which is required by ' +
    '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'
  )
}

function typedArraySupport () {
  // Can typed array instances can be augmented?
  try {
    var arr = new Uint8Array(1)
    var proto = { foo: function () { return 42 } }
    Object.setPrototypeOf(proto, Uint8Array.prototype)
    Object.setPrototypeOf(arr, proto)
    return arr.foo() === 42
  } catch (e) {
    return false
  }
}

Object.defineProperty(Buffer.prototype, 'parent', {
  enumerable: true,
  get: function () {
    if (!Buffer.isBuffer(this)) return undefined
    return this.buffer
  }
})

Object.defineProperty(Buffer.prototype, 'offset', {
  enumerable: true,
  get: function () {
    if (!Buffer.isBuffer(this)) return undefined
    return this.byteOffset
  }
})

function createBuffer (length) {
  if (length > K_MAX_LENGTH) {
    throw new RangeError('The value "' + length + '" is invalid for option "size"')
  }
  // Return an augmented `Uint8Array` instance
  var buf = new Uint8Array(length)
  Object.setPrototypeOf(buf, Buffer.prototype)
  return buf
}

/**
 * The Buffer constructor returns instances of `Uint8Array` that have their
 * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
 * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
 * and the `Uint8Array` methods. Square bracket notation works as expected -- it
 * returns a single octet.
 *
 * The `Uint8Array` prototype remains unmodified.
 */

function Buffer (arg, encodingOrOffset, length) {
  // Common case.
  if (typeof arg === 'number') {
    if (typeof encodingOrOffset === 'string') {
      throw new TypeError(
        'The "string" argument must be of type string. Received type number'
      )
    }
    return allocUnsafe(arg)
  }
  return from(arg, encodingOrOffset, length)
}

Buffer.poolSize = 8192 // not used by this implementation

function from (value, encodingOrOffset, length) {
  if (typeof value === 'string') {
    return fromString(value, encodingOrOffset)
  }

  if (ArrayBuffer.isView(value)) {
    return fromArrayView(value)
  }

  if (value == null) {
    throw new TypeError(
      'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
      'or Array-like Object. Received type ' + (typeof value)
    )
  }

  if (isInstance(value, ArrayBuffer) ||
      (value && isInstance(value.buffer, ArrayBuffer))) {
    return fromArrayBuffer(value, encodingOrOffset, length)
  }

  if (typeof SharedArrayBuffer !== 'undefined' &&
      (isInstance(value, SharedArrayBuffer) ||
      (value && isInstance(value.buffer, SharedArrayBuffer)))) {
    return fromArrayBuffer(value, encodingOrOffset, length)
  }

  if (typeof value === 'number') {
    throw new TypeError(
      'The "value" argument must not be of type number. Received type number'
    )
  }

  var valueOf = value.valueOf && value.valueOf()
  if (valueOf != null && valueOf !== value) {
    return Buffer.from(valueOf, encodingOrOffset, length)
  }

  var b = fromObject(value)
  if (b) return b

  if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&
      typeof value[Symbol.toPrimitive] === 'function') {
    return Buffer.from(
      value[Symbol.toPrimitive]('string'), encodingOrOffset, length
    )
  }

  throw new TypeError(
    'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
    'or Array-like Object. Received type ' + (typeof value)
  )
}

/**
 * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
 * if value is a number.
 * Buffer.from(str[, encoding])
 * Buffer.from(array)
 * Buffer.from(buffer)
 * Buffer.from(arrayBuffer[, byteOffset[, length]])
 **/
Buffer.from = function (value, encodingOrOffset, length) {
  return from(value, encodingOrOffset, length)
}

// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:
// https://github.com/feross/buffer/pull/148
Object.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)
Object.setPrototypeOf(Buffer, Uint8Array)

function assertSize (size) {
  if (typeof size !== 'number') {
    throw new TypeError('"size" argument must be of type number')
  } else if (size < 0) {
    throw new RangeError('The value "' + size + '" is invalid for option "size"')
  }
}

function alloc (size, fill, encoding) {
  assertSize(size)
  if (size <= 0) {
    return createBuffer(size)
  }
  if (fill !== undefined) {
    // Only pay attention to encoding if it's a string. This
    // prevents accidentally sending in a number that would
    // be interpreted as a start offset.
    return typeof encoding === 'string'
      ? createBuffer(size).fill(fill, encoding)
      : createBuffer(size).fill(fill)
  }
  return createBuffer(size)
}

/**
 * Creates a new filled Buffer instance.
 * alloc(size[, fill[, encoding]])
 **/
Buffer.alloc = function (size, fill, encoding) {
  return alloc(size, fill, encoding)
}

function allocUnsafe (size) {
  assertSize(size)
  return createBuffer(size < 0 ? 0 : checked(size) | 0)
}

/**
 * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
 * */
Buffer.allocUnsafe = function (size) {
  return allocUnsafe(size)
}
/**
 * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
 */
Buffer.allocUnsafeSlow = function (size) {
  return allocUnsafe(size)
}

function fromString (string, encoding) {
  if (typeof encoding !== 'string' || encoding === '') {
    encoding = 'utf8'
  }

  if (!Buffer.isEncoding(encoding)) {
    throw new TypeError('Unknown encoding: ' + encoding)
  }

  var length = byteLength(string, encoding) | 0
  var buf = createBuffer(length)

  var actual = buf.write(string, encoding)

  if (actual !== length) {
    // Writing a hex string, for example, that contains invalid characters will
    // cause everything after the first invalid character to be ignored. (e.g.
    // 'abxxcd' will be treated as 'ab')
    buf = buf.slice(0, actual)
  }

  return buf
}

function fromArrayLike (array) {
  var length = array.length < 0 ? 0 : checked(array.length) | 0
  var buf = createBuffer(length)
  for (var i = 0; i < length; i += 1) {
    buf[i] = array[i] & 255
  }
  return buf
}

function fromArrayView (arrayView) {
  if (isInstance(arrayView, Uint8Array)) {
    var copy = new Uint8Array(arrayView)
    return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)
  }
  return fromArrayLike(arrayView)
}

function fromArrayBuffer (array, byteOffset, length) {
  if (byteOffset < 0 || array.byteLength < byteOffset) {
    throw new RangeError('"offset" is outside of buffer bounds')
  }

  if (array.byteLength < byteOffset + (length || 0)) {
    throw new RangeError('"length" is outside of buffer bounds')
  }

  var buf
  if (byteOffset === undefined && length === undefined) {
    buf = new Uint8Array(array)
  } else if (length === undefined) {
    buf = new Uint8Array(array, byteOffset)
  } else {
    buf = new Uint8Array(array, byteOffset, length)
  }

  // Return an augmented `Uint8Array` instance
  Object.setPrototypeOf(buf, Buffer.prototype)

  return buf
}

function fromObject (obj) {
  if (Buffer.isBuffer(obj)) {
    var len = checked(obj.length) | 0
    var buf = createBuffer(len)

    if (buf.length === 0) {
      return buf
    }

    obj.copy(buf, 0, 0, len)
    return buf
  }

  if (obj.length !== undefined) {
    if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {
      return createBuffer(0)
    }
    return fromArrayLike(obj)
  }

  if (obj.type === 'Buffer' && Array.isArray(obj.data)) {
    return fromArrayLike(obj.data)
  }
}

function checked (length) {
  // Note: cannot use `length < K_MAX_LENGTH` here because that fails when
  // length is NaN (which is otherwise coerced to zero.)
  if (length >= K_MAX_LENGTH) {
    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
                         'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')
  }
  return length | 0
}

function SlowBuffer (length) {
  if (+length != length) { // eslint-disable-line eqeqeq
    length = 0
  }
  return Buffer.alloc(+length)
}

Buffer.isBuffer = function isBuffer (b) {
  return b != null && b._isBuffer === true &&
    b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false
}

Buffer.compare = function compare (a, b) {
  if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)
  if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)
  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
    throw new TypeError(
      'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array'
    )
  }

  if (a === b) return 0

  var x = a.length
  var y = b.length

  for (var i = 0, len = Math.min(x, y); i < len; ++i) {
    if (a[i] !== b[i]) {
      x = a[i]
      y = b[i]
      break
    }
  }

  if (x < y) return -1
  if (y < x) return 1
  return 0
}

Buffer.isEncoding = function isEncoding (encoding) {
  switch (String(encoding).toLowerCase()) {
    case 'hex':
    case 'utf8':
    case 'utf-8':
    case 'ascii':
    case 'latin1':
    case 'binary':
    case 'base64':
    case 'ucs2':
    case 'ucs-2':
    case 'utf16le':
    case 'utf-16le':
      return true
    default:
      return false
  }
}

Buffer.concat = function concat (list, length) {
  if (!Array.isArray(list)) {
    throw new TypeError('"list" argument must be an Array of Buffers')
  }

  if (list.length === 0) {
    return Buffer.alloc(0)
  }

  var i
  if (length === undefined) {
    length = 0
    for (i = 0; i < list.length; ++i) {
      length += list[i].length
    }
  }

  var buffer = Buffer.allocUnsafe(length)
  var pos = 0
  for (i = 0; i < list.length; ++i) {
    var buf = list[i]
    if (isInstance(buf, Uint8Array)) {
      if (pos + buf.length > buffer.length) {
        Buffer.from(buf).copy(buffer, pos)
      } else {
        Uint8Array.prototype.set.call(
          buffer,
          buf,
          pos
        )
      }
    } else if (!Buffer.isBuffer(buf)) {
      throw new TypeError('"list" argument must be an Array of Buffers')
    } else {
      buf.copy(buffer, pos)
    }
    pos += buf.length
  }
  return buffer
}

function byteLength (string, encoding) {
  if (Buffer.isBuffer(string)) {
    return string.length
  }
  if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {
    return string.byteLength
  }
  if (typeof string !== 'string') {
    throw new TypeError(
      'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' +
      'Received type ' + typeof string
    )
  }

  var len = string.length
  var mustMatch = (arguments.length > 2 && arguments[2] === true)
  if (!mustMatch && len === 0) return 0

  // Use a for loop to avoid recursion
  var loweredCase = false
  for (;;) {
    switch (encoding) {
      case 'ascii':
      case 'latin1':
      case 'binary':
        return len
      case 'utf8':
      case 'utf-8':
        return utf8ToBytes(string).length
      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return len * 2
      case 'hex':
        return len >>> 1
      case 'base64':
        return base64ToBytes(string).length
      default:
        if (loweredCase) {
          return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8
        }
        encoding = ('' + encoding).toLowerCase()
        loweredCase = true
    }
  }
}
Buffer.byteLength = byteLength

function slowToString (encoding, start, end) {
  var loweredCase = false

  // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
  // property of a typed array.

  // This behaves neither like String nor Uint8Array in that we set start/end
  // to their upper/lower bounds if the value passed is out of range.
  // undefined is handled specially as per ECMA-262 6th Edition,
  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
  if (start === undefined || start < 0) {
    start = 0
  }
  // Return early if start > this.length. Done here to prevent potential uint32
  // coercion fail below.
  if (start > this.length) {
    return ''
  }

  if (end === undefined || end > this.length) {
    end = this.length
  }

  if (end <= 0) {
    return ''
  }

  // Force coercion to uint32. This will also coerce falsey/NaN values to 0.
  end >>>= 0
  start >>>= 0

  if (end <= start) {
    return ''
  }

  if (!encoding) encoding = 'utf8'

  while (true) {
    switch (encoding) {
      case 'hex':
        return hexSlice(this, start, end)

      case 'utf8':
      case 'utf-8':
        return utf8Slice(this, start, end)

      case 'ascii':
        return asciiSlice(this, start, end)

      case 'latin1':
      case 'binary':
        return latin1Slice(this, start, end)

      case 'base64':
        return base64Slice(this, start, end)

      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return utf16leSlice(this, start, end)

      default:
        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
        encoding = (encoding + '').toLowerCase()
        loweredCase = true
    }
  }
}

// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)
// to detect a Buffer instance. It's not possible to use `instanceof Buffer`
// reliably in a browserify context because there could be multiple different
// copies of the 'buffer' package in use. This method works even for Buffer
// instances that were created from another copy of the `buffer` package.
// See: https://github.com/feross/buffer/issues/154
Buffer.prototype._isBuffer = true

function swap (b, n, m) {
  var i = b[n]
  b[n] = b[m]
  b[m] = i
}

Buffer.prototype.swap16 = function swap16 () {
  var len = this.length
  if (len % 2 !== 0) {
    throw new RangeError('Buffer size must be a multiple of 16-bits')
  }
  for (var i = 0; i < len; i += 2) {
    swap(this, i, i + 1)
  }
  return this
}

Buffer.prototype.swap32 = function swap32 () {
  var len = this.length
  if (len % 4 !== 0) {
    throw new RangeError('Buffer size must be a multiple of 32-bits')
  }
  for (var i = 0; i < len; i += 4) {
    swap(this, i, i + 3)
    swap(this, i + 1, i + 2)
  }
  return this
}

Buffer.prototype.swap64 = function swap64 () {
  var len = this.length
  if (len % 8 !== 0) {
    throw new RangeError('Buffer size must be a multiple of 64-bits')
  }
  for (var i = 0; i < len; i += 8) {
    swap(this, i, i + 7)
    swap(this, i + 1, i + 6)
    swap(this, i + 2, i + 5)
    swap(this, i + 3, i + 4)
  }
  return this
}

Buffer.prototype.toString = function toString () {
  var length = this.length
  if (length === 0) return ''
  if (arguments.length === 0) return utf8Slice(this, 0, length)
  return slowToString.apply(this, arguments)
}

Buffer.prototype.toLocaleString = Buffer.prototype.toString

Buffer.prototype.equals = function equals (b) {
  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
  if (this === b) return true
  return Buffer.compare(this, b) === 0
}

Buffer.prototype.inspect = function inspect () {
  var str = ''
  var max = exports.INSPECT_MAX_BYTES
  str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()
  if (this.length > max) str += ' ... '
  return '<Buffer ' + str + '>'
}
if (customInspectSymbol) {
  Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect
}

Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
  if (isInstance(target, Uint8Array)) {
    target = Buffer.from(target, target.offset, target.byteLength)
  }
  if (!Buffer.isBuffer(target)) {
    throw new TypeError(
      'The "target" argument must be one of type Buffer or Uint8Array. ' +
      'Received type ' + (typeof target)
    )
  }

  if (start === undefined) {
    start = 0
  }
  if (end === undefined) {
    end = target ? target.length : 0
  }
  if (thisStart === undefined) {
    thisStart = 0
  }
  if (thisEnd === undefined) {
    thisEnd = this.length
  }

  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
    throw new RangeError('out of range index')
  }

  if (thisStart >= thisEnd && start >= end) {
    return 0
  }
  if (thisStart >= thisEnd) {
    return -1
  }
  if (start >= end) {
    return 1
  }

  start >>>= 0
  end >>>= 0
  thisStart >>>= 0
  thisEnd >>>= 0

  if (this === target) return 0

  var x = thisEnd - thisStart
  var y = end - start
  var len = Math.min(x, y)

  var thisCopy = this.slice(thisStart, thisEnd)
  var targetCopy = target.slice(start, end)

  for (var i = 0; i < len; ++i) {
    if (thisCopy[i] !== targetCopy[i]) {
      x = thisCopy[i]
      y = targetCopy[i]
      break
    }
  }

  if (x < y) return -1
  if (y < x) return 1
  return 0
}

// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
//
// Arguments:
// - buffer - a Buffer to search
// - val - a string, Buffer, or number
// - byteOffset - an index into `buffer`; will be clamped to an int32
// - encoding - an optional encoding, relevant is val is a string
// - dir - true for indexOf, false for lastIndexOf
function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
  // Empty buffer means no match
  if (buffer.length === 0) return -1

  // Normalize byteOffset
  if (typeof byteOffset === 'string') {
    encoding = byteOffset
    byteOffset = 0
  } else if (byteOffset > 0x7fffffff) {
    byteOffset = 0x7fffffff
  } else if (byteOffset < -0x80000000) {
    byteOffset = -0x80000000
  }
  byteOffset = +byteOffset // Coerce to Number.
  if (numberIsNaN(byteOffset)) {
    // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
    byteOffset = dir ? 0 : (buffer.length - 1)
  }

  // Normalize byteOffset: negative offsets start from the end of the buffer
  if (byteOffset < 0) byteOffset = buffer.length + byteOffset
  if (byteOffset >= buffer.length) {
    if (dir) return -1
    else byteOffset = buffer.length - 1
  } else if (byteOffset < 0) {
    if (dir) byteOffset = 0
    else return -1
  }

  // Normalize val
  if (typeof val === 'string') {
    val = Buffer.from(val, encoding)
  }

  // Finally, search either indexOf (if dir is true) or lastIndexOf
  if (Buffer.isBuffer(val)) {
    // Special case: looking for empty string/buffer always fails
    if (val.length === 0) {
      return -1
    }
    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
  } else if (typeof val === 'number') {
    val = val & 0xFF // Search for a byte value [0-255]
    if (typeof Uint8Array.prototype.indexOf === 'function') {
      if (dir) {
        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
      } else {
        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
      }
    }
    return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)
  }

  throw new TypeError('val must be string, number or Buffer')
}

function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
  var indexSize = 1
  var arrLength = arr.length
  var valLength = val.length

  if (encoding !== undefined) {
    encoding = String(encoding).toLowerCase()
    if (encoding === 'ucs2' || encoding === 'ucs-2' ||
        encoding === 'utf16le' || encoding === 'utf-16le') {
      if (arr.length < 2 || val.length < 2) {
        return -1
      }
      indexSize = 2
      arrLength /= 2
      valLength /= 2
      byteOffset /= 2
    }
  }

  function read (buf, i) {
    if (indexSize === 1) {
      return buf[i]
    } else {
      return buf.readUInt16BE(i * indexSize)
    }
  }

  var i
  if (dir) {
    var foundIndex = -1
    for (i = byteOffset; i < arrLength; i++) {
      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
        if (foundIndex === -1) foundIndex = i
        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
      } else {
        if (foundIndex !== -1) i -= i - foundIndex
        foundIndex = -1
      }
    }
  } else {
    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
    for (i = byteOffset; i >= 0; i--) {
      var found = true
      for (var j = 0; j < valLength; j++) {
        if (read(arr, i + j) !== read(val, j)) {
          found = false
          break
        }
      }
      if (found) return i
    }
  }

  return -1
}

Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
  return this.indexOf(val, byteOffset, encoding) !== -1
}

Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
}

Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
}

function hexWrite (buf, string, offset, length) {
  offset = Number(offset) || 0
  var remaining = buf.length - offset
  if (!length) {
    length = remaining
  } else {
    length = Number(length)
    if (length > remaining) {
      length = remaining
    }
  }

  var strLen = string.length

  if (length > strLen / 2) {
    length = strLen / 2
  }
  for (var i = 0; i < length; ++i) {
    var parsed = parseInt(string.substr(i * 2, 2), 16)
    if (numberIsNaN(parsed)) return i
    buf[offset + i] = parsed
  }
  return i
}

function utf8Write (buf, string, offset, length) {
  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
}

function asciiWrite (buf, string, offset, length) {
  return blitBuffer(asciiToBytes(string), buf, offset, length)
}

function base64Write (buf, string, offset, length) {
  return blitBuffer(base64ToBytes(string), buf, offset, length)
}

function ucs2Write (buf, string, offset, length) {
  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
}

Buffer.prototype.write = function write (string, offset, length, encoding) {
  // Buffer#write(string)
  if (offset === undefined) {
    encoding = 'utf8'
    length = this.length
    offset = 0
  // Buffer#write(string, encoding)
  } else if (length === undefined && typeof offset === 'string') {
    encoding = offset
    length = this.length
    offset = 0
  // Buffer#write(string, offset[, length][, encoding])
  } else if (isFinite(offset)) {
    offset = offset >>> 0
    if (isFinite(length)) {
      length = length >>> 0
      if (encoding === undefined) encoding = 'utf8'
    } else {
      encoding = length
      length = undefined
    }
  } else {
    throw new Error(
      'Buffer.write(string, encoding, offset[, length]) is no longer supported'
    )
  }

  var remaining = this.length - offset
  if (length === undefined || length > remaining) length = remaining

  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
    throw new RangeError('Attempt to write outside buffer bounds')
  }

  if (!encoding) encoding = 'utf8'

  var loweredCase = false
  for (;;) {
    switch (encoding) {
      case 'hex':
        return hexWrite(this, string, offset, length)

      case 'utf8':
      case 'utf-8':
        return utf8Write(this, string, offset, length)

      case 'ascii':
      case 'latin1':
      case 'binary':
        return asciiWrite(this, string, offset, length)

      case 'base64':
        // Warning: maxLength not taken into account in base64Write
        return base64Write(this, string, offset, length)

      case 'ucs2':
      case 'ucs-2':
      case 'utf16le':
      case 'utf-16le':
        return ucs2Write(this, string, offset, length)

      default:
        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
        encoding = ('' + encoding).toLowerCase()
        loweredCase = true
    }
  }
}

Buffer.prototype.toJSON = function toJSON () {
  return {
    type: 'Buffer',
    data: Array.prototype.slice.call(this._arr || this, 0)
  }
}

function base64Slice (buf, start, end) {
  if (start === 0 && end === buf.length) {
    return base64.fromByteArray(buf)
  } else {
    return base64.fromByteArray(buf.slice(start, end))
  }
}

function utf8Slice (buf, start, end) {
  end = Math.min(buf.length, end)
  var res = []

  var i = start
  while (i < end) {
    var firstByte = buf[i]
    var codePoint = null
    var bytesPerSequence = (firstByte > 0xEF)
      ? 4
      : (firstByte > 0xDF)
          ? 3
          : (firstByte > 0xBF)
              ? 2
              : 1

    if (i + bytesPerSequence <= end) {
      var secondByte, thirdByte, fourthByte, tempCodePoint

      switch (bytesPerSequence) {
        case 1:
          if (firstByte < 0x80) {
            codePoint = firstByte
          }
          break
        case 2:
          secondByte = buf[i + 1]
          if ((secondByte & 0xC0) === 0x80) {
            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
            if (tempCodePoint > 0x7F) {
              codePoint = tempCodePoint
            }
          }
          break
        case 3:
          secondByte = buf[i + 1]
          thirdByte = buf[i + 2]
          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
              codePoint = tempCodePoint
            }
          }
          break
        case 4:
          secondByte = buf[i + 1]
          thirdByte = buf[i + 2]
          fourthByte = buf[i + 3]
          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
              codePoint = tempCodePoint
            }
          }
      }
    }

    if (codePoint === null) {
      // we did not generate a valid codePoint so insert a
      // replacement char (U+FFFD) and advance only 1 byte
      codePoint = 0xFFFD
      bytesPerSequence = 1
    } else if (codePoint > 0xFFFF) {
      // encode to utf16 (surrogate pair dance)
      codePoint -= 0x10000
      res.push(codePoint >>> 10 & 0x3FF | 0xD800)
      codePoint = 0xDC00 | codePoint & 0x3FF
    }

    res.push(codePoint)
    i += bytesPerSequence
  }

  return decodeCodePointsArray(res)
}

// Based on http://stackoverflow.com/a/22747272/680742, the browser with
// the lowest limit is Chrome, with 0x10000 args.
// We go 1 magnitude less, for safety
var MAX_ARGUMENTS_LENGTH = 0x1000

function decodeCodePointsArray (codePoints) {
  var len = codePoints.length
  if (len <= MAX_ARGUMENTS_LENGTH) {
    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
  }

  // Decode in chunks to avoid "call stack size exceeded".
  var res = ''
  var i = 0
  while (i < len) {
    res += String.fromCharCode.apply(
      String,
      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
    )
  }
  return res
}

function asciiSlice (buf, start, end) {
  var ret = ''
  end = Math.min(buf.length, end)

  for (var i = start; i < end; ++i) {
    ret += String.fromCharCode(buf[i] & 0x7F)
  }
  return ret
}

function latin1Slice (buf, start, end) {
  var ret = ''
  end = Math.min(buf.length, end)

  for (var i = start; i < end; ++i) {
    ret += String.fromCharCode(buf[i])
  }
  return ret
}

function hexSlice (buf, start, end) {
  var len = buf.length

  if (!start || start < 0) start = 0
  if (!end || end < 0 || end > len) end = len

  var out = ''
  for (var i = start; i < end; ++i) {
    out += hexSliceLookupTable[buf[i]]
  }
  return out
}

function utf16leSlice (buf, start, end) {
  var bytes = buf.slice(start, end)
  var res = ''
  // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)
  for (var i = 0; i < bytes.length - 1; i += 2) {
    res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))
  }
  return res
}

Buffer.prototype.slice = function slice (start, end) {
  var len = this.length
  start = ~~start
  end = end === undefined ? len : ~~end

  if (start < 0) {
    start += len
    if (start < 0) start = 0
  } else if (start > len) {
    start = len
  }

  if (end < 0) {
    end += len
    if (end < 0) end = 0
  } else if (end > len) {
    end = len
  }

  if (end < start) end = start

  var newBuf = this.subarray(start, end)
  // Return an augmented `Uint8Array` instance
  Object.setPrototypeOf(newBuf, Buffer.prototype)

  return newBuf
}

/*
 * Need to make sure that buffer isn't trying to write out of bounds.
 */
function checkOffset (offset, ext, length) {
  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
}

Buffer.prototype.readUintLE =
Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  var val = this[offset]
  var mul = 1
  var i = 0
  while (++i < byteLength && (mul *= 0x100)) {
    val += this[offset + i] * mul
  }

  return val
}

Buffer.prototype.readUintBE =
Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) {
    checkOffset(offset, byteLength, this.length)
  }

  var val = this[offset + --byteLength]
  var mul = 1
  while (byteLength > 0 && (mul *= 0x100)) {
    val += this[offset + --byteLength] * mul
  }

  return val
}

Buffer.prototype.readUint8 =
Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 1, this.length)
  return this[offset]
}

Buffer.prototype.readUint16LE =
Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  return this[offset] | (this[offset + 1] << 8)
}

Buffer.prototype.readUint16BE =
Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  return (this[offset] << 8) | this[offset + 1]
}

Buffer.prototype.readUint32LE =
Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return ((this[offset]) |
      (this[offset + 1] << 8) |
      (this[offset + 2] << 16)) +
      (this[offset + 3] * 0x1000000)
}

Buffer.prototype.readUint32BE =
Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset] * 0x1000000) +
    ((this[offset + 1] << 16) |
    (this[offset + 2] << 8) |
    this[offset + 3])
}

Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  var val = this[offset]
  var mul = 1
  var i = 0
  while (++i < byteLength && (mul *= 0x100)) {
    val += this[offset + i] * mul
  }
  mul *= 0x80

  if (val >= mul) val -= Math.pow(2, 8 * byteLength)

  return val
}

Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) checkOffset(offset, byteLength, this.length)

  var i = byteLength
  var mul = 1
  var val = this[offset + --i]
  while (i > 0 && (mul *= 0x100)) {
    val += this[offset + --i] * mul
  }
  mul *= 0x80

  if (val >= mul) val -= Math.pow(2, 8 * byteLength)

  return val
}

Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 1, this.length)
  if (!(this[offset] & 0x80)) return (this[offset])
  return ((0xff - this[offset] + 1) * -1)
}

Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  var val = this[offset] | (this[offset + 1] << 8)
  return (val & 0x8000) ? val | 0xFFFF0000 : val
}

Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 2, this.length)
  var val = this[offset + 1] | (this[offset] << 8)
  return (val & 0x8000) ? val | 0xFFFF0000 : val
}

Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset]) |
    (this[offset + 1] << 8) |
    (this[offset + 2] << 16) |
    (this[offset + 3] << 24)
}

Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)

  return (this[offset] << 24) |
    (this[offset + 1] << 16) |
    (this[offset + 2] << 8) |
    (this[offset + 3])
}

Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)
  return ieee754.read(this, offset, true, 23, 4)
}

Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 4, this.length)
  return ieee754.read(this, offset, false, 23, 4)
}

Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 8, this.length)
  return ieee754.read(this, offset, true, 52, 8)
}

Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
  offset = offset >>> 0
  if (!noAssert) checkOffset(offset, 8, this.length)
  return ieee754.read(this, offset, false, 52, 8)
}

function checkInt (buf, value, offset, ext, max, min) {
  if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
  if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
  if (offset + ext > buf.length) throw new RangeError('Index out of range')
}

Buffer.prototype.writeUintLE =
Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) {
    var maxBytes = Math.pow(2, 8 * byteLength) - 1
    checkInt(this, value, offset, byteLength, maxBytes, 0)
  }

  var mul = 1
  var i = 0
  this[offset] = value & 0xFF
  while (++i < byteLength && (mul *= 0x100)) {
    this[offset + i] = (value / mul) & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeUintBE =
Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  byteLength = byteLength >>> 0
  if (!noAssert) {
    var maxBytes = Math.pow(2, 8 * byteLength) - 1
    checkInt(this, value, offset, byteLength, maxBytes, 0)
  }

  var i = byteLength - 1
  var mul = 1
  this[offset + i] = value & 0xFF
  while (--i >= 0 && (mul *= 0x100)) {
    this[offset + i] = (value / mul) & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeUint8 =
Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
  this[offset] = (value & 0xff)
  return offset + 1
}

Buffer.prototype.writeUint16LE =
Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
  this[offset] = (value & 0xff)
  this[offset + 1] = (value >>> 8)
  return offset + 2
}

Buffer.prototype.writeUint16BE =
Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
  this[offset] = (value >>> 8)
  this[offset + 1] = (value & 0xff)
  return offset + 2
}

Buffer.prototype.writeUint32LE =
Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
  this[offset + 3] = (value >>> 24)
  this[offset + 2] = (value >>> 16)
  this[offset + 1] = (value >>> 8)
  this[offset] = (value & 0xff)
  return offset + 4
}

Buffer.prototype.writeUint32BE =
Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
  this[offset] = (value >>> 24)
  this[offset + 1] = (value >>> 16)
  this[offset + 2] = (value >>> 8)
  this[offset + 3] = (value & 0xff)
  return offset + 4
}

Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    var limit = Math.pow(2, (8 * byteLength) - 1)

    checkInt(this, value, offset, byteLength, limit - 1, -limit)
  }

  var i = 0
  var mul = 1
  var sub = 0
  this[offset] = value & 0xFF
  while (++i < byteLength && (mul *= 0x100)) {
    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
      sub = 1
    }
    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    var limit = Math.pow(2, (8 * byteLength) - 1)

    checkInt(this, value, offset, byteLength, limit - 1, -limit)
  }

  var i = byteLength - 1
  var mul = 1
  var sub = 0
  this[offset + i] = value & 0xFF
  while (--i >= 0 && (mul *= 0x100)) {
    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
      sub = 1
    }
    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
  }

  return offset + byteLength
}

Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
  if (value < 0) value = 0xff + value + 1
  this[offset] = (value & 0xff)
  return offset + 1
}

Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
  this[offset] = (value & 0xff)
  this[offset + 1] = (value >>> 8)
  return offset + 2
}

Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
  this[offset] = (value >>> 8)
  this[offset + 1] = (value & 0xff)
  return offset + 2
}

Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
  this[offset] = (value & 0xff)
  this[offset + 1] = (value >>> 8)
  this[offset + 2] = (value >>> 16)
  this[offset + 3] = (value >>> 24)
  return offset + 4
}

Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
  if (value < 0) value = 0xffffffff + value + 1
  this[offset] = (value >>> 24)
  this[offset + 1] = (value >>> 16)
  this[offset + 2] = (value >>> 8)
  this[offset + 3] = (value & 0xff)
  return offset + 4
}

function checkIEEE754 (buf, value, offset, ext, max, min) {
  if (offset + ext > buf.length) throw new RangeError('Index out of range')
  if (offset < 0) throw new RangeError('Index out of range')
}

function writeFloat (buf, value, offset, littleEndian, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
  }
  ieee754.write(buf, value, offset, littleEndian, 23, 4)
  return offset + 4
}

Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
  return writeFloat(this, value, offset, true, noAssert)
}

Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
  return writeFloat(this, value, offset, false, noAssert)
}

function writeDouble (buf, value, offset, littleEndian, noAssert) {
  value = +value
  offset = offset >>> 0
  if (!noAssert) {
    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
  }
  ieee754.write(buf, value, offset, littleEndian, 52, 8)
  return offset + 8
}

Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
  return writeDouble(this, value, offset, true, noAssert)
}

Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
  return writeDouble(this, value, offset, false, noAssert)
}

// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
Buffer.prototype.copy = function copy (target, targetStart, start, end) {
  if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')
  if (!start) start = 0
  if (!end && end !== 0) end = this.length
  if (targetStart >= target.length) targetStart = target.length
  if (!targetStart) targetStart = 0
  if (end > 0 && end < start) end = start

  // Copy 0 bytes; we're done
  if (end === start) return 0
  if (target.length === 0 || this.length === 0) return 0

  // Fatal error conditions
  if (targetStart < 0) {
    throw new RangeError('targetStart out of bounds')
  }
  if (start < 0 || start >= this.length) throw new RangeError('Index out of range')
  if (end < 0) throw new RangeError('sourceEnd out of bounds')

  // Are we oob?
  if (end > this.length) end = this.length
  if (target.length - targetStart < end - start) {
    end = target.length - targetStart + start
  }

  var len = end - start

  if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {
    // Use built-in when available, missing from IE11
    this.copyWithin(targetStart, start, end)
  } else {
    Uint8Array.prototype.set.call(
      target,
      this.subarray(start, end),
      targetStart
    )
  }

  return len
}

// Usage:
//    buffer.fill(number[, offset[, end]])
//    buffer.fill(buffer[, offset[, end]])
//    buffer.fill(string[, offset[, end]][, encoding])
Buffer.prototype.fill = function fill (val, start, end, encoding) {
  // Handle string cases:
  if (typeof val === 'string') {
    if (typeof start === 'string') {
      encoding = start
      start = 0
      end = this.length
    } else if (typeof end === 'string') {
      encoding = end
      end = this.length
    }
    if (encoding !== undefined && typeof encoding !== 'string') {
      throw new TypeError('encoding must be a string')
    }
    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
      throw new TypeError('Unknown encoding: ' + encoding)
    }
    if (val.length === 1) {
      var code = val.charCodeAt(0)
      if ((encoding === 'utf8' && code < 128) ||
          encoding === 'latin1') {
        // Fast path: If `val` fits into a single byte, use that numeric value.
        val = code
      }
    }
  } else if (typeof val === 'number') {
    val = val & 255
  } else if (typeof val === 'boolean') {
    val = Number(val)
  }

  // Invalid ranges are not set to a default, so can range check early.
  if (start < 0 || this.length < start || this.length < end) {
    throw new RangeError('Out of range index')
  }

  if (end <= start) {
    return this
  }

  start = start >>> 0
  end = end === undefined ? this.length : end >>> 0

  if (!val) val = 0

  var i
  if (typeof val === 'number') {
    for (i = start; i < end; ++i) {
      this[i] = val
    }
  } else {
    var bytes = Buffer.isBuffer(val)
      ? val
      : Buffer.from(val, encoding)
    var len = bytes.length
    if (len === 0) {
      throw new TypeError('The value "' + val +
        '" is invalid for argument "value"')
    }
    for (i = 0; i < end - start; ++i) {
      this[i + start] = bytes[i % len]
    }
  }

  return this
}

// HELPER FUNCTIONS
// ================

var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g

function base64clean (str) {
  // Node takes equal signs as end of the Base64 encoding
  str = str.split('=')[0]
  // Node strips out invalid characters like \n and \t from the string, base64-js does not
  str = str.trim().replace(INVALID_BASE64_RE, '')
  // Node converts strings with length < 2 to ''
  if (str.length < 2) return ''
  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
  while (str.length % 4 !== 0) {
    str = str + '='
  }
  return str
}

function utf8ToBytes (string, units) {
  units = units || Infinity
  var codePoint
  var length = string.length
  var leadSurrogate = null
  var bytes = []

  for (var i = 0; i < length; ++i) {
    codePoint = string.charCodeAt(i)

    // is surrogate component
    if (codePoint > 0xD7FF && codePoint < 0xE000) {
      // last char was a lead
      if (!leadSurrogate) {
        // no lead yet
        if (codePoint > 0xDBFF) {
          // unexpected trail
          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
          continue
        } else if (i + 1 === length) {
          // unpaired lead
          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
          continue
        }

        // valid lead
        leadSurrogate = codePoint

        continue
      }

      // 2 leads in a row
      if (codePoint < 0xDC00) {
        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
        leadSurrogate = codePoint
        continue
      }

      // valid surrogate pair
      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
    } else if (leadSurrogate) {
      // valid bmp char, but last char was a lead
      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
    }

    leadSurrogate = null

    // encode utf8
    if (codePoint < 0x80) {
      if ((units -= 1) < 0) break
      bytes.push(codePoint)
    } else if (codePoint < 0x800) {
      if ((units -= 2) < 0) break
      bytes.push(
        codePoint >> 0x6 | 0xC0,
        codePoint & 0x3F | 0x80
      )
    } else if (codePoint < 0x10000) {
      if ((units -= 3) < 0) break
      bytes.push(
        codePoint >> 0xC | 0xE0,
        codePoint >> 0x6 & 0x3F | 0x80,
        codePoint & 0x3F | 0x80
      )
    } else if (codePoint < 0x110000) {
      if ((units -= 4) < 0) break
      bytes.push(
        codePoint >> 0x12 | 0xF0,
        codePoint >> 0xC & 0x3F | 0x80,
        codePoint >> 0x6 & 0x3F | 0x80,
        codePoint & 0x3F | 0x80
      )
    } else {
      throw new Error('Invalid code point')
    }
  }

  return bytes
}

function asciiToBytes (str) {
  var byteArray = []
  for (var i = 0; i < str.length; ++i) {
    // Node's code seems to be doing this and not & 0x7F..
    byteArray.push(str.charCodeAt(i) & 0xFF)
  }
  return byteArray
}

function utf16leToBytes (str, units) {
  var c, hi, lo
  var byteArray = []
  for (var i = 0; i < str.length; ++i) {
    if ((units -= 2) < 0) break

    c = str.charCodeAt(i)
    hi = c >> 8
    lo = c % 256
    byteArray.push(lo)
    byteArray.push(hi)
  }

  return byteArray
}

function base64ToBytes (str) {
  return base64.toByteArray(base64clean(str))
}

function blitBuffer (src, dst, offset, length) {
  for (var i = 0; i < length; ++i) {
    if ((i + offset >= dst.length) || (i >= src.length)) break
    dst[i + offset] = src[i]
  }
  return i
}

// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass
// the `instanceof` check but they should be treated as of that type.
// See: https://github.com/feross/buffer/issues/166
function isInstance (obj, type) {
  return obj instanceof type ||
    (obj != null && obj.constructor != null && obj.constructor.name != null &&
      obj.constructor.name === type.name)
}
function numberIsNaN (obj) {
  // For IE11 support
  return obj !== obj // eslint-disable-line no-self-compare
}

// Create lookup table for `toString('hex')`
// See: https://github.com/feross/buffer/issues/219
var hexSliceLookupTable = (function () {
  var alphabet = '0123456789abcdef'
  var table = new Array(256)
  for (var i = 0; i < 16; ++i) {
    var i16 = i * 16
    for (var j = 0; j < 16; ++j) {
      table[i16 + j] = alphabet[i] + alphabet[j]
    }
  }
  return table
})()
{
  "name": "buffer",
  "description": "Node.js Buffer API, for the browser",
  "version": "5.7.1",
  "author": {
    "name": "Feross Aboukhadijeh",
    "email": "feross@feross.org",
    "url": "https://feross.org"
  },
  "dependencies": {
    "base64-js": "^1.3.1",
    "ieee754": "^1.1.13"
  },
  "devDependencies": {
    "airtap": "^3.0.0",
    "benchmark": "^2.1.4",
    "browserify": "^17.0.0",
    "concat-stream": "^2.0.0",
    "hyperquest": "^2.1.3",
    "is-buffer": "^2.0.4",
    "is-nan": "^1.3.0",
    "split": "^1.0.1",
    "standard": "*",
    "tape": "^5.0.1",
    "through2": "^4.0.2",
    "uglify-js": "^3.11.3"
  },
  "homepage": "https://github.com/feross/buffer",
  "license": "MIT",
  "main": "index.js",
  "types": "index.d.ts",
  "repository": {
    "type": "git",
    "url": "git://github.com/feross/buffer.git"
  },
  "standard": {
    "ignore": [
      "test/node/**/*.js",
      "test/common.js",
      "test/_polyfill.js",
      "perf/**/*.js"
    ],
    "globals": [
      "SharedArrayBuffer"
    ]
  },
  "funding": [
    {
      "type": "github",
      "url": "https://github.com/sponsors/feross"
    },
    {
      "type": "patreon",
      "url": "https://www.patreon.com/feross"
    },
    {
      "type": "consulting",
      "url": "https://feross.org/support"
    }
  ]
}Alexander Rose [@arose](https://github.com/arose)
Alexandru Mărășteanu [@alexei](https://github.com/alexei)
Andras [@andrasq](https://github.com/andrasq)
Benoit Giannangeli [@giann](https://github.com/giann)
Branden Visser [@mrvisser](https://github.com/mrvisser)
David Baird
daurnimator [@daurnimator](https://github.com/daurnimator)
Doug Beck [@beck](https://github.com/beck)
Dzmitry Litskalau [@litmit](https://github.com/litmit)
Fred Ludlow [@fredludlow](https://github.com/fredludlow)
Hans Pufal
Henry [@alograg](https://github.com/alograg)
Johnny Shields [@johnnyshields](https://github.com/johnnyshields)
Kamal Abdali
Matt Simerson [@msimerson](https://github.com/msimerson)
Maxime Robert [@marob](https://github.com/marob)
MeriemKhelifi [@MeriemKhelifi](https://github.com/MeriemKhelifi)
Michael Schramm [@wodka](https://github.com/wodka)
Nazar Mokrynskyi [@nazar-pc](https://github.com/nazar-pc)
Oliver Salzburg [@oliversalzburg](https://github.com/oliversalzburg)
Pablo [@ppollono](https://github.com/ppollono)
Rabehaja Stevens [@RABEHAJA-STEVENS](https://github.com/RABEHAJA-STEVENS)
Raphael Pigulla [@pigulla](https://github.com/pigulla)
rebeccapeltz [@rebeccapeltz](https://github.com/rebeccapeltz)
Stefan Tingström [@stingstrom](https://github.com/stingstrom)
Copyright (c) 2007-present, Alexandru Mărășteanu <hello@alexei.ro>
All rights reserved.

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.
* Neither the name of this software nor the names of its contributors may 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 AUTHORS OR COPYRIGHT HOLDERS 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.
{
  "name": "sprintf-js",
  "version": "1.1.2",
  "description": "JavaScript sprintf implementation",
  "author": "Alexandru Mărășteanu <hello@alexei.ro>",
  "main": "src/sprintf.js",
  "repository": {
    "type": "git",
    "url": "https://github.com/alexei/sprintf.js.git"
  },
  "license": "BSD-3-Clause",
  "readmeFilename": "README.md",
  "devDependencies": {
    "benchmark": "^2.1.4",
    "eslint": "^5.10.0",
    "gulp": "^3.9.1",
    "gulp-benchmark": "^1.1.1",
    "gulp-eslint": "^5.0.0",
    "gulp-header": "^2.0.5",
    "gulp-mocha": "^6.0.0",
    "gulp-rename": "^1.4.0",
    "gulp-sourcemaps": "^2.6.4",
    "gulp-uglify": "^3.0.1",
    "mocha": "^5.2.0"
  }
}/* global angular, sprintf, vsprintf */

!function() {
    'use strict'

    angular.
        module('sprintf', []).
        filter('sprintf', function() {
            return function() {
                return sprintf.apply(null, arguments)
            }
        }).
        filter('fmt', ['$filter', function($filter) {
            return $filter('sprintf')
        }]).
        filter('vsprintf', function() {
            return function(format, argv) {
                return vsprintf(format, argv)
            }
        }).
        filter('vfmt', ['$filter', function($filter) {
            return $filter('vsprintf')
        }])
}(); // eslint-disable-line
/* global window, exports, define */

!function() {
    'use strict'

    var re = {
        not_string: /[^s]/,
        not_bool: /[^t]/,
        not_type: /[^T]/,
        not_primitive: /[^v]/,
        number: /[diefg]/,
        numeric_arg: /[bcdiefguxX]/,
        json: /[j]/,
        not_json: /[^j]/,
        text: /^[^\x25]+/,
        modulo: /^\x25{2}/,
        placeholder: /^\x25(?:([1-9]\d*)\$|\(([^)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/,
        key: /^([a-z_][a-z_\d]*)/i,
        key_access: /^\.([a-z_][a-z_\d]*)/i,
        index_access: /^\[(\d+)\]/,
        sign: /^[+-]/
    }

    function sprintf(key) {
        // `arguments` is not an array, but should be fine for this call
        return sprintf_format(sprintf_parse(key), arguments)
    }

    function vsprintf(fmt, argv) {
        return sprintf.apply(null, [fmt].concat(argv || []))
    }

    function sprintf_format(parse_tree, argv) {
        var cursor = 1, tree_length = parse_tree.length, arg, output = '', i, k, ph, pad, pad_character, pad_length, is_positive, sign
        for (i = 0; i < tree_length; i++) {
            if (typeof parse_tree[i] === 'string') {
                output += parse_tree[i]
            }
            else if (typeof parse_tree[i] === 'object') {
                ph = parse_tree[i] // convenience purposes only
                if (ph.keys) { // keyword argument
                    arg = argv[cursor]
                    for (k = 0; k < ph.keys.length; k++) {
                        if (arg == undefined) {
                            throw new Error(sprintf('[sprintf] Cannot access property "%s" of undefined value "%s"', ph.keys[k], ph.keys[k-1]))
                        }
                        arg = arg[ph.keys[k]]
                    }
                }
                else if (ph.param_no) { // positional argument (explicit)
                    arg = argv[ph.param_no]
                }
                else { // positional argument (implicit)
                    arg = argv[cursor++]
                }

                if (re.not_type.test(ph.type) && re.not_primitive.test(ph.type) && arg instanceof Function) {
                    arg = arg()
                }

                if (re.numeric_arg.test(ph.type) && (typeof arg !== 'number' && isNaN(arg))) {
                    throw new TypeError(sprintf('[sprintf] expecting number but found %T', arg))
                }

                if (re.number.test(ph.type)) {
                    is_positive = arg >= 0
                }

                switch (ph.type) {
                    case 'b':
                        arg = parseInt(arg, 10).toString(2)
                        break
                    case 'c':
                        arg = String.fromCharCode(parseInt(arg, 10))
                        break
                    case 'd':
                    case 'i':
                        arg = parseInt(arg, 10)
                        break
                    case 'j':
                        arg = JSON.stringify(arg, null, ph.width ? parseInt(ph.width) : 0)
                        break
                    case 'e':
                        arg = ph.precision ? parseFloat(arg).toExponential(ph.precision) : parseFloat(arg).toExponential()
                        break
                    case 'f':
                        arg = ph.precision ? parseFloat(arg).toFixed(ph.precision) : parseFloat(arg)
                        break
                    case 'g':
                        arg = ph.precision ? String(Number(arg.toPrecision(ph.precision))) : parseFloat(arg)
                        break
                    case 'o':
                        arg = (parseInt(arg, 10) >>> 0).toString(8)
                        break
                    case 's':
                        arg = String(arg)
                        arg = (ph.precision ? arg.substring(0, ph.precision) : arg)
                        break
                    case 't':
                        arg = String(!!arg)
                        arg = (ph.precision ? arg.substring(0, ph.precision) : arg)
                        break
                    case 'T':
                        arg = Object.prototype.toString.call(arg).slice(8, -1).toLowerCase()
                        arg = (ph.precision ? arg.substring(0, ph.precision) : arg)
                        break
                    case 'u':
                        arg = parseInt(arg, 10) >>> 0
                        break
                    case 'v':
                        arg = arg.valueOf()
                        arg = (ph.precision ? arg.substring(0, ph.precision) : arg)
                        break
                    case 'x':
                        arg = (parseInt(arg, 10) >>> 0).toString(16)
                        break
                    case 'X':
                        arg = (parseInt(arg, 10) >>> 0).toString(16).toUpperCase()
                        break
                }
                if (re.json.test(ph.type)) {
                    output += arg
                }
                else {
                    if (re.number.test(ph.type) && (!is_positive || ph.sign)) {
                        sign = is_positive ? '+' : '-'
                        arg = arg.toString().replace(re.sign, '')
                    }
                    else {
                        sign = ''
                    }
                    pad_character = ph.pad_char ? ph.pad_char === '0' ? '0' : ph.pad_char.charAt(1) : ' '
                    pad_length = ph.width - (sign + arg).length
                    pad = ph.width ? (pad_length > 0 ? pad_character.repeat(pad_length) : '') : ''
                    output += ph.align ? sign + arg + pad : (pad_character === '0' ? sign + pad + arg : pad + sign + arg)
                }
            }
        }
        return output
    }

    var sprintf_cache = Object.create(null)

    function sprintf_parse(fmt) {
        if (sprintf_cache[fmt]) {
            return sprintf_cache[fmt]
        }

        var _fmt = fmt, match, parse_tree = [], arg_names = 0
        while (_fmt) {
            if ((match = re.text.exec(_fmt)) !== null) {
                parse_tree.push(match[0])
            }
            else if ((match = re.modulo.exec(_fmt)) !== null) {
                parse_tree.push('%')
            }
            else if ((match = re.placeholder.exec(_fmt)) !== null) {
                if (match[2]) {
                    arg_names |= 1
                    var field_list = [], replacement_field = match[2], field_match = []
                    if ((field_match = re.key.exec(replacement_field)) !== null) {
                        field_list.push(field_match[1])
                        while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {
                            if ((field_match = re.key_access.exec(replacement_field)) !== null) {
                                field_list.push(field_match[1])
                            }
                            else if ((field_match = re.index_access.exec(replacement_field)) !== null) {
                                field_list.push(field_match[1])
                            }
                            else {
                                throw new SyntaxError('[sprintf] failed to parse named argument key')
                            }
                        }
                    }
                    else {
                        throw new SyntaxError('[sprintf] failed to parse named argument key')
                    }
                    match[2] = field_list
                }
                else {
                    arg_names |= 2
                }
                if (arg_names === 3) {
                    throw new Error('[sprintf] mixing positional and named placeholders is not (yet) supported')
                }

                parse_tree.push(
                    {
                        placeholder: match[0],
                        param_no:    match[1],
                        keys:        match[2],
                        sign:        match[3],
                        pad_char:    match[4],
                        align:       match[5],
                        width:       match[6],
                        precision:   match[7],
                        type:        match[8]
                    }
                )
            }
            else {
                throw new SyntaxError('[sprintf] unexpected placeholder')
            }
            _fmt = _fmt.substring(match[0].length)
        }
        return sprintf_cache[fmt] = parse_tree
    }

    /**
     * export to either browser or node.js
     */
    /* eslint-disable quote-props */
    if (typeof exports !== 'undefined') {
        exports['sprintf'] = sprintf
        exports['vsprintf'] = vsprintf
    }
    if (typeof window !== 'undefined') {
        window['sprintf'] = sprintf
        window['vsprintf'] = vsprintf

        if (typeof define === 'function' && define['amd']) {
            define(function() {
                return {
                    'sprintf': sprintf,
                    'vsprintf': vsprintf
                }
            })
        }
    }
    /* eslint-enable quote-props */
}(); // eslint-disable-line
/*! sprintf-js v1.1.2 | Copyright (c) 2007-present, Alexandru Mărășteanu <hello@alexei.ro> | BSD-3-Clause */
!function(){"use strict";angular.module("sprintf",[]).filter("sprintf",function(){return function(){return sprintf.apply(null,arguments)}}).filter("fmt",["$filter",function(t){return t("sprintf")}]).filter("vsprintf",function(){return function(t,n){return vsprintf(t,n)}}).filter("vfmt",["$filter",function(t){return t("vsprintf")}])}();
//# sourceMappingURL=angular-sprintf.min.js.map
/*! sprintf-js v1.1.2 | Copyright (c) 2007-present, Alexandru Mărășteanu <hello@alexei.ro> | BSD-3-Clause */
!function(){"use strict";var g={not_string:/[^s]/,not_bool:/[^t]/,not_type:/[^T]/,not_primitive:/[^v]/,number:/[diefg]/,numeric_arg:/[bcdiefguxX]/,json:/[j]/,not_json:/[^j]/,text:/^[^\x25]+/,modulo:/^\x25{2}/,placeholder:/^\x25(?:([1-9]\d*)\$|\(([^)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/,key:/^([a-z_][a-z_\d]*)/i,key_access:/^\.([a-z_][a-z_\d]*)/i,index_access:/^\[(\d+)\]/,sign:/^[+-]/};function y(e){return function(e,t){var r,n,i,s,a,o,p,c,l,u=1,f=e.length,d="";for(n=0;n<f;n++)if("string"==typeof e[n])d+=e[n];else if("object"==typeof e[n]){if((s=e[n]).keys)for(r=t[u],i=0;i<s.keys.length;i++){if(null==r)throw new Error(y('[sprintf] Cannot access property "%s" of undefined value "%s"',s.keys[i],s.keys[i-1]));r=r[s.keys[i]]}else r=s.param_no?t[s.param_no]:t[u++];if(g.not_type.test(s.type)&&g.not_primitive.test(s.type)&&r instanceof Function&&(r=r()),g.numeric_arg.test(s.type)&&"number"!=typeof r&&isNaN(r))throw new TypeError(y("[sprintf] expecting number but found %T",r));switch(g.number.test(s.type)&&(c=0<=r),s.type){case"b":r=parseInt(r,10).toString(2);break;case"c":r=String.fromCharCode(parseInt(r,10));break;case"d":case"i":r=parseInt(r,10);break;case"j":r=JSON.stringify(r,null,s.width?parseInt(s.width):0);break;case"e":r=s.precision?parseFloat(r).toExponential(s.precision):parseFloat(r).toExponential();break;case"f":r=s.precision?parseFloat(r).toFixed(s.precision):parseFloat(r);break;case"g":r=s.precision?String(Number(r.toPrecision(s.precision))):parseFloat(r);break;case"o":r=(parseInt(r,10)>>>0).toString(8);break;case"s":r=String(r),r=s.precision?r.substring(0,s.precision):r;break;case"t":r=String(!!r),r=s.precision?r.substring(0,s.precision):r;break;case"T":r=Object.prototype.toString.call(r).slice(8,-1).toLowerCase(),r=s.precision?r.substring(0,s.precision):r;break;case"u":r=parseInt(r,10)>>>0;break;case"v":r=r.valueOf(),r=s.precision?r.substring(0,s.precision):r;break;case"x":r=(parseInt(r,10)>>>0).toString(16);break;case"X":r=(parseInt(r,10)>>>0).toString(16).toUpperCase()}g.json.test(s.type)?d+=r:(!g.number.test(s.type)||c&&!s.sign?l="":(l=c?"+":"-",r=r.toString().replace(g.sign,"")),o=s.pad_char?"0"===s.pad_char?"0":s.pad_char.charAt(1):" ",p=s.width-(l+r).length,a=s.width&&0<p?o.repeat(p):"",d+=s.align?l+r+a:"0"===o?l+a+r:a+l+r)}return d}(function(e){if(p[e])return p[e];var t,r=e,n=[],i=0;for(;r;){if(null!==(t=g.text.exec(r)))n.push(t[0]);else if(null!==(t=g.modulo.exec(r)))n.push("%");else{if(null===(t=g.placeholder.exec(r)))throw new SyntaxError("[sprintf] unexpected placeholder");if(t[2]){i|=1;var s=[],a=t[2],o=[];if(null===(o=g.key.exec(a)))throw new SyntaxError("[sprintf] failed to parse named argument key");for(s.push(o[1]);""!==(a=a.substring(o[0].length));)if(null!==(o=g.key_access.exec(a)))s.push(o[1]);else{if(null===(o=g.index_access.exec(a)))throw new SyntaxError("[sprintf] failed to parse named argument key");s.push(o[1])}t[2]=s}else i|=2;if(3===i)throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported");n.push({placeholder:t[0],param_no:t[1],keys:t[2],sign:t[3],pad_char:t[4],align:t[5],width:t[6],precision:t[7],type:t[8]})}r=r.substring(t[0].length)}return p[e]=n}(e),arguments)}function e(e,t){return y.apply(null,[e].concat(t||[]))}var p=Object.create(null);"undefined"!=typeof exports&&(exports.sprintf=y,exports.vsprintf=e),"undefined"!=typeof window&&(window.sprintf=y,window.vsprintf=e,"function"==typeof define&&define.amd&&define(function(){return{sprintf:y,vsprintf:e}}))}();
//# sourceMappingURL=sprintf.min.js.map
(The MIT License)

Copyright (c) 2017, Ryan Zimmerman <opensrc@ryanzim.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.
'use strict'

exports.fromCallback = function (fn) {
  return Object.defineProperty(function () {
    if (typeof arguments[arguments.length - 1] === 'function') fn.apply(this, arguments)
    else {
      return new Promise((resolve, reject) => {
        arguments[arguments.length] = (err, res) => {
          if (err) return reject(err)
          resolve(res)
        }
        arguments.length++
        fn.apply(this, arguments)
      })
    }
  }, 'name', { value: fn.name })
}

exports.fromPromise = function (fn) {
  return Object.defineProperty(function () {
    const cb = arguments[arguments.length - 1]
    if (typeof cb !== 'function') return fn.apply(this, arguments)
    else fn.apply(this, arguments).then(r => cb(null, r), cb)
  }, 'name', { value: fn.name })
}
{
  "name": "universalify",
  "version": "0.1.2",
  "description": "Make a callback- or promise-based function support both promises and callbacks.",
  "homepage": "https://github.com/RyanZim/universalify#readme",
  "license": "MIT",
  "author": "Ryan Zimmerman <opensrc@ryanzim.com>",
  "files": [
    "index.js"
  ],
  "repository": {
    "type": "git",
    "url": "git+https://github.com/RyanZim/universalify.git"
  },
  "devDependencies": {
    "colortape": "^0.1.2",
    "coveralls": "^3.0.1",
    "nyc": "^10.2.0",
    "standard": "^10.0.1",
    "tape": "^4.6.3"
  },
  "engines": {
    "node": ">= 4.0.0"
  }
}'use strict';

const anyMap = new WeakMap();
const eventsMap = new WeakMap();
const producersMap = new WeakMap();
const anyProducer = Symbol('anyProducer');
const resolvedPromise = Promise.resolve();

// Define symbols for "meta" events.
const listenerAdded = Symbol('listenerAdded');
const listenerRemoved = Symbol('listenerRemoved');

let canEmitMetaEvents = false;
let isGlobalDebugEnabled = false;

function assertEventName(eventName) {
	if (typeof eventName !== 'string' && typeof eventName !== 'symbol' && typeof eventName !== 'number') {
		throw new TypeError('`eventName` must be a string, symbol, or number');
	}
}

function assertListener(listener) {
	if (typeof listener !== 'function') {
		throw new TypeError('listener must be a function');
	}
}

function getListeners(instance, eventName) {
	const events = eventsMap.get(instance);
	if (!events.has(eventName)) {
		events.set(eventName, new Set());
	}

	return events.get(eventName);
}

function getEventProducers(instance, eventName) {
	const key = typeof eventName === 'string' || typeof eventName === 'symbol' || typeof eventName === 'number' ? eventName : anyProducer;
	const producers = producersMap.get(instance);
	if (!producers.has(key)) {
		producers.set(key, new Set());
	}

	return producers.get(key);
}

function enqueueProducers(instance, eventName, eventData) {
	const producers = producersMap.get(instance);
	if (producers.has(eventName)) {
		for (const producer of producers.get(eventName)) {
			producer.enqueue(eventData);
		}
	}

	if (producers.has(anyProducer)) {
		const item = Promise.all([eventName, eventData]);
		for (const producer of producers.get(anyProducer)) {
			producer.enqueue(item);
		}
	}
}

function iterator(instance, eventNames) {
	eventNames = Array.isArray(eventNames) ? eventNames : [eventNames];

	let isFinished = false;
	let flush = () => {};
	let queue = [];

	const producer = {
		enqueue(item) {
			queue.push(item);
			flush();
		},
		finish() {
			isFinished = true;
			flush();
		}
	};

	for (const eventName of eventNames) {
		getEventProducers(instance, eventName).add(producer);
	}

	return {
		async next() {
			if (!queue) {
				return {done: true};
			}

			if (queue.length === 0) {
				if (isFinished) {
					queue = undefined;
					return this.next();
				}

				await new Promise(resolve => {
					flush = resolve;
				});

				return this.next();
			}

			return {
				done: false,
				value: await queue.shift()
			};
		},

		async return(value) {
			queue = undefined;

			for (const eventName of eventNames) {
				getEventProducers(instance, eventName).delete(producer);
			}

			flush();

			return arguments.length > 0 ?
				{done: true, value: await value} :
				{done: true};
		},

		[Symbol.asyncIterator]() {
			return this;
		}
	};
}

function defaultMethodNamesOrAssert(methodNames) {
	if (methodNames === undefined) {
		return allEmitteryMethods;
	}

	if (!Array.isArray(methodNames)) {
		throw new TypeError('`methodNames` must be an array of strings');
	}

	for (const methodName of methodNames) {
		if (!allEmitteryMethods.includes(methodName)) {
			if (typeof methodName !== 'string') {
				throw new TypeError('`methodNames` element must be a string');
			}

			throw new Error(`${methodName} is not Emittery method`);
		}
	}

	return methodNames;
}

const isMetaEvent = eventName => eventName === listenerAdded || eventName === listenerRemoved;

function emitMetaEvent(emitter, eventName, eventData) {
	if (isMetaEvent(eventName)) {
		try {
			canEmitMetaEvents = true;
			emitter.emit(eventName, eventData);
		} finally {
			canEmitMetaEvents = false;
		}
	}
}

class Emittery {
	static mixin(emitteryPropertyName, methodNames) {
		methodNames = defaultMethodNamesOrAssert(methodNames);
		return target => {
			if (typeof target !== 'function') {
				throw new TypeError('`target` must be function');
			}

			for (const methodName of methodNames) {
				if (target.prototype[methodName] !== undefined) {
					throw new Error(`The property \`${methodName}\` already exists on \`target\``);
				}
			}

			function getEmitteryProperty() {
				Object.defineProperty(this, emitteryPropertyName, {
					enumerable: false,
					value: new Emittery()
				});
				return this[emitteryPropertyName];
			}

			Object.defineProperty(target.prototype, emitteryPropertyName, {
				enumerable: false,
				get: getEmitteryProperty
			});

			const emitteryMethodCaller = methodName => function (...args) {
				return this[emitteryPropertyName][methodName](...args);
			};

			for (const methodName of methodNames) {
				Object.defineProperty(target.prototype, methodName, {
					enumerable: false,
					value: emitteryMethodCaller(methodName)
				});
			}

			return target;
		};
	}

	static get isDebugEnabled() {
		if (typeof process !== 'object') {
			return isGlobalDebugEnabled;
		}

		const {env} = process || {env: {}};
		return env.DEBUG === 'emittery' || env.DEBUG === '*' || isGlobalDebugEnabled;
	}

	static set isDebugEnabled(newValue) {
		isGlobalDebugEnabled = newValue;
	}

	constructor(options = {}) {
		anyMap.set(this, new Set());
		eventsMap.set(this, new Map());
		producersMap.set(this, new Map());
		this.debug = options.debug || {};

		if (this.debug.enabled === undefined) {
			this.debug.enabled = false;
		}

		if (!this.debug.logger) {
			this.debug.logger = (type, debugName, eventName, eventData) => {
				try {
					// TODO: Use https://github.com/sindresorhus/safe-stringify when the package is more mature. Just copy-paste the code.
					eventData = JSON.stringify(eventData);
				} catch {
					eventData = `Object with the following keys failed to stringify: ${Object.keys(eventData).join(',')}`;
				}

				if (typeof eventName === 'symbol' || typeof eventName === 'number') {
					eventName = eventName.toString();
				}

				const currentTime = new Date();
				const logTime = `${currentTime.getHours()}:${currentTime.getMinutes()}:${currentTime.getSeconds()}.${currentTime.getMilliseconds()}`;
				console.log(`[${logTime}][emittery:${type}][${debugName}] Event Name: ${eventName}\n\tdata: ${eventData}`);
			};
		}
	}

	logIfDebugEnabled(type, eventName, eventData) {
		if (Emittery.isDebugEnabled || this.debug.enabled) {
			this.debug.logger(type, this.debug.name, eventName, eventData);
		}
	}

	on(eventNames, listener) {
		assertListener(listener);

		eventNames = Array.isArray(eventNames) ? eventNames : [eventNames];
		for (const eventName of eventNames) {
			assertEventName(eventName);
			getListeners(this, eventName).add(listener);

			this.logIfDebugEnabled('subscribe', eventName, undefined);

			if (!isMetaEvent(eventName)) {
				emitMetaEvent(this, listenerAdded, {eventName, listener});
			}
		}

		return this.off.bind(this, eventNames, listener);
	}

	off(eventNames, listener) {
		assertListener(listener);

		eventNames = Array.isArray(eventNames) ? eventNames : [eventNames];
		for (const eventName of eventNames) {
			assertEventName(eventName);
			getListeners(this, eventName).delete(listener);

			this.logIfDebugEnabled('unsubscribe', eventName, undefined);

			if (!isMetaEvent(eventName)) {
				emitMetaEvent(this, listenerRemoved, {eventName, listener});
			}
		}
	}

	once(eventNames) {
		let off_;

		const promise = new Promise(resolve => {
			off_ = this.on(eventNames, data => {
				off_();
				resolve(data);
			});
		});

		promise.off = off_;
		return promise;
	}

	events(eventNames) {
		eventNames = Array.isArray(eventNames) ? eventNames : [eventNames];
		for (const eventName of eventNames) {
			assertEventName(eventName);
		}

		return iterator(this, eventNames);
	}

	async emit(eventName, eventData) {
		assertEventName(eventName);

		if (isMetaEvent(eventName) && !canEmitMetaEvents) {
			throw new TypeError('`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`');
		}

		this.logIfDebugEnabled('emit', eventName, eventData);

		enqueueProducers(this, eventName, eventData);

		const listeners = getListeners(this, eventName);
		const anyListeners = anyMap.get(this);
		const staticListeners = [...listeners];
		const staticAnyListeners = isMetaEvent(eventName) ? [] : [...anyListeners];

		await resolvedPromise;
		await Promise.all([
			...staticListeners.map(async listener => {
				if (listeners.has(listener)) {
					return listener(eventData);
				}
			}),
			...staticAnyListeners.map(async listener => {
				if (anyListeners.has(listener)) {
					return listener(eventName, eventData);
				}
			})
		]);
	}

	async emitSerial(eventName, eventData) {
		assertEventName(eventName);

		if (isMetaEvent(eventName) && !canEmitMetaEvents) {
			throw new TypeError('`eventName` cannot be meta event `listenerAdded` or `listenerRemoved`');
		}

		this.logIfDebugEnabled('emitSerial', eventName, eventData);

		const listeners = getListeners(this, eventName);
		const anyListeners = anyMap.get(this);
		const staticListeners = [...listeners];
		const staticAnyListeners = [...anyListeners];

		await resolvedPromise;
		/* eslint-disable no-await-in-loop */
		for (const listener of staticListeners) {
			if (listeners.has(listener)) {
				await listener(eventData);
			}
		}

		for (const listener of staticAnyListeners) {
			if (anyListeners.has(listener)) {
				await listener(eventName, eventData);
			}
		}
		/* eslint-enable no-await-in-loop */
	}

	onAny(listener) {
		assertListener(listener);

		this.logIfDebugEnabled('subscribeAny', undefined, undefined);

		anyMap.get(this).add(listener);
		emitMetaEvent(this, listenerAdded, {listener});
		return this.offAny.bind(this, listener);
	}

	anyEvent() {
		return iterator(this);
	}

	offAny(listener) {
		assertListener(listener);

		this.logIfDebugEnabled('unsubscribeAny', undefined, undefined);

		emitMetaEvent(this, listenerRemoved, {listener});
		anyMap.get(this).delete(listener);
	}

	clearListeners(eventNames) {
		eventNames = Array.isArray(eventNames) ? eventNames : [eventNames];

		for (const eventName of eventNames) {
			this.logIfDebugEnabled('clear', eventName, undefined);

			if (typeof eventName === 'string' || typeof eventName === 'symbol' || typeof eventName === 'number') {
				getListeners(this, eventName).clear();

				const producers = getEventProducers(this, eventName);

				for (const producer of producers) {
					producer.finish();
				}

				producers.clear();
			} else {
				anyMap.get(this).clear();

				for (const listeners of eventsMap.get(this).values()) {
					listeners.clear();
				}

				for (const producers of producersMap.get(this).values()) {
					for (const producer of producers) {
						producer.finish();
					}

					producers.clear();
				}
			}
		}
	}

	listenerCount(eventNames) {
		eventNames = Array.isArray(eventNames) ? eventNames : [eventNames];
		let count = 0;

		for (const eventName of eventNames) {
			if (typeof eventName === 'string') {
				count += anyMap.get(this).size + getListeners(this, eventName).size +
					getEventProducers(this, eventName).size + getEventProducers(this).size;
				continue;
			}

			if (typeof eventName !== 'undefined') {
				assertEventName(eventName);
			}

			count += anyMap.get(this).size;

			for (const value of eventsMap.get(this).values()) {
				count += value.size;
			}

			for (const value of producersMap.get(this).values()) {
				count += value.size;
			}
		}

		return count;
	}

	bindMethods(target, methodNames) {
		if (typeof target !== 'object' || target === null) {
			throw new TypeError('`target` must be an object');
		}

		methodNames = defaultMethodNamesOrAssert(methodNames);

		for (const methodName of methodNames) {
			if (target[methodName] !== undefined) {
				throw new Error(`The property \`${methodName}\` already exists on \`target\``);
			}

			Object.defineProperty(target, methodName, {
				enumerable: false,
				value: this[methodName].bind(this)
			});
		}
	}
}

const allEmitteryMethods = Object.getOwnPropertyNames(Emittery.prototype).filter(v => v !== 'constructor');

Object.defineProperty(Emittery, 'listenerAdded', {
	value: listenerAdded,
	writable: false,
	enumerable: true,
	configurable: false
});
Object.defineProperty(Emittery, 'listenerRemoved', {
	value: listenerRemoved,
	writable: false,
	enumerable: true,
	configurable: false
});

module.exports = Emittery;
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": "emittery",
  "version": "0.12.1",
  "description": "Simple and modern async event emitter",
  "license": "MIT",
  "repository": "sindresorhus/emittery",
  "funding": "https://github.com/sindresorhus/emittery?sponsor=1",
  "author": {
    "name": "Sindre Sorhus",
    "email": "sindresorhus@gmail.com",
    "url": "https://sindresorhus.com"
  },
  "engines": {
    "node": ">=12"
  },
  "files": [
    "index.js",
    "index.d.ts"
  ],
  "devDependencies": {
    "@types/node": "^15.6.1",
    "ava": "^2.4.0",
    "delay": "^4.3.0",
    "nyc": "^15.0.0",
    "p-event": "^4.1.0",
    "tsd": "^0.19.1",
    "xo": "^0.39.0"
  }
}{
  "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"
}The MIT License (MIT)

Copyright (c) 2020 Microsoft

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": "@azure/core-tracing",
  "version": "1.0.0-preview.13",
  "description": "Provides low-level interfaces and helper methods for tracing in Azure SDK",
  "sdk-type": "client",
  "main": "dist/index.js",
  "module": "dist-esm/src/index.js",
  "browser": {
    "./dist-esm/src/utils/global.js": "./dist-esm/src/utils/global.browser.js"
  },
  "types": "types/core-tracing.d.ts",
  "files": [
    "dist/",
    "dist-esm/src/",
    "types/core-tracing.d.ts",
    "README.md",
    "LICENSE"
  ],
  "repository": "github:Azure/azure-sdk-for-js",
  "author": "Microsoft Corporation",
  "license": "MIT",
  "engines": {
    "node": ">=12.0.0"
  },
  "homepage": "https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/core/core-tracing/README.md",
  "sideEffects": false,
  "dependencies": {
    "@opentelemetry/api": "^1.0.1",
    "tslib": "^2.2.0"
  },
  "devDependencies": {
    "@azure/core-auth": "^1.3.0",
    "@azure/dev-tool": "^1.0.0",
    "@azure/eslint-plugin-azure-sdk": "^3.0.0",
    "@microsoft/api-extractor": "7.7.11",
    "@opentelemetry/tracing": "^0.22.0",
    "@types/chai": "^4.1.6",
    "@types/mocha": "^7.0.2",
    "@types/node": "^12.0.0",
    "chai": "^4.2.0",
    "cross-env": "^7.0.2",
    "eslint": "^7.15.0",
    "inherits": "^2.0.3",
    "karma": "^6.2.0",
    "karma-chrome-launcher": "^3.0.0",
    "karma-coverage": "^2.0.0",
    "karma-edge-launcher": "^0.4.2",
    "karma-env-preprocessor": "^0.1.1",
    "karma-firefox-launcher": "^1.1.0",
    "karma-ie-launcher": "^1.0.0",
    "karma-junit-reporter": "^2.0.1",
    "karma-mocha": "^2.0.1",
    "karma-mocha-reporter": "^2.2.5",
    "karma-sourcemap-loader": "^0.3.8",
    "mocha": "^7.1.1",
    "mocha-junit-reporter": "^1.18.0",
    "prettier": "^1.16.4",
    "rimraf": "^3.0.0",
    "rollup": "^1.16.3",
    "typescript": "~4.2.0",
    "util": "^0.12.1",
    "typedoc": "0.15.2",
    "sinon": "^9.0.2",
    "@types/sinon": "^9.0.4"
  }
}// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { SpanKind, setSpan, context as otContext, getTracer } from "./interfaces";
import { trace, INVALID_SPAN_CONTEXT } from "@opentelemetry/api";
export function isTracingDisabled() {
    var _a;
    if (typeof process === "undefined") {
        // not supported in browser for now without polyfills
        return false;
    }
    const azureTracingDisabledValue = (_a = process.env.AZURE_TRACING_DISABLED) === null || _a === void 0 ? void 0 : _a.toLowerCase();
    if (azureTracingDisabledValue === "false" || azureTracingDisabledValue === "0") {
        return false;
    }
    return Boolean(azureTracingDisabledValue);
}
/**
 * Creates a function that can be used to create spans using the global tracer.
 *
 * Usage:
 *
 * ```typescript
 * // once
 * const createSpan = createSpanFunction({ packagePrefix: "Azure.Data.AppConfiguration", namespace: "Microsoft.AppConfiguration" });
 *
 * // in each operation
 * const span = createSpan("deleteConfigurationSetting", operationOptions);
 *    // code...
 * span.end();
 * ```
 *
 * @hidden
 * @param args - allows configuration of the prefix for each span as well as the az.namespace field.
 */
export function createSpanFunction(args) {
    return function (operationName, operationOptions) {
        const tracer = getTracer();
        const tracingOptions = (operationOptions === null || operationOptions === void 0 ? void 0 : operationOptions.tracingOptions) || {};
        const spanOptions = Object.assign({ kind: SpanKind.INTERNAL }, tracingOptions.spanOptions);
        const spanName = args.packagePrefix ? `${args.packagePrefix}.${operationName}` : operationName;
        let span;
        if (isTracingDisabled()) {
            span = trace.wrapSpanContext(INVALID_SPAN_CONTEXT);
        }
        else {
            span = tracer.startSpan(spanName, spanOptions, tracingOptions.tracingContext);
        }
        if (args.namespace) {
            span.setAttribute("az.namespace", args.namespace);
        }
        let newSpanOptions = tracingOptions.spanOptions || {};
        if (span.isRecording() && args.namespace) {
            newSpanOptions = Object.assign(Object.assign({}, tracingOptions.spanOptions), { attributes: Object.assign(Object.assign({}, spanOptions.attributes), { "az.namespace": args.namespace }) });
        }
        const newTracingOptions = Object.assign(Object.assign({}, tracingOptions), { spanOptions: newSpanOptions, tracingContext: setSpan(tracingOptions.tracingContext || otContext.active(), span) });
        const newOperationOptions = Object.assign(Object.assign({}, operationOptions), { tracingOptions: newTracingOptions });
        return {
            span,
            updatedOptions: newOperationOptions
        };
    };
}
//# sourceMappingURL=createSpan.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
// Tracers and wrappers
export { createSpanFunction } from "./createSpan";
// Shared interfaces
export { context, getSpan, getSpanContext, getTracer, isSpanContextValid, setSpan, setSpanContext, SpanKind, SpanStatusCode } from "./interfaces";
// Utilities
export { extractSpanContextFromTraceParentHeader, getTraceParentHeader } from "./utils/traceParentHeader";
//# sourceMappingURL=index.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { context as otContext, trace as otTrace } from "@opentelemetry/api";
/**
 * The kind of span.
 */
export var SpanKind;
(function (SpanKind) {
    /** Default value. Indicates that the span is used internally. */
    SpanKind[SpanKind["INTERNAL"] = 0] = "INTERNAL";
    /**
     * Indicates that the span covers server-side handling of an RPC or other
     * remote request.
     */
    SpanKind[SpanKind["SERVER"] = 1] = "SERVER";
    /**
     * Indicates that the span covers the client-side wrapper around an RPC or
     * other remote request.
     */
    SpanKind[SpanKind["CLIENT"] = 2] = "CLIENT";
    /**
     * Indicates that the span describes producer sending a message to a
     * broker. Unlike client and server, there is no direct critical path latency
     * relationship between producer and consumer spans.
     */
    SpanKind[SpanKind["PRODUCER"] = 3] = "PRODUCER";
    /**
     * Indicates that the span describes consumer receiving a message from a
     * broker. Unlike client and server, there is no direct critical path latency
     * relationship between producer and consumer spans.
     */
    SpanKind[SpanKind["CONSUMER"] = 4] = "CONSUMER";
})(SpanKind || (SpanKind = {}));
/**
 * Return the span if one exists
 *
 * @param context - context to get span from
 */
export function getSpan(context) {
    return otTrace.getSpan(context);
}
/**
 * Set the span on a context
 *
 * @param context - context to use as parent
 * @param span - span to set active
 */
export function setSpan(context, span) {
    return otTrace.setSpan(context, span);
}
/**
 * Wrap span context in a NoopSpan and set as span in a new
 * context
 *
 * @param context - context to set active span on
 * @param spanContext - span context to be wrapped
 */
export function setSpanContext(context, spanContext) {
    return otTrace.setSpanContext(context, spanContext);
}
/**
 * Get the span context of the span if it exists.
 *
 * @param context - context to get values from
 */
export function getSpanContext(context) {
    return otTrace.getSpanContext(context);
}
/**
 * Returns true of the given {@link SpanContext} is valid.
 * A valid {@link SpanContext} is one which has a valid trace ID and span ID as per the spec.
 *
 * @param context - the {@link SpanContext} to validate.
 *
 * @returns true if the {@link SpanContext} is valid, false otherwise.
 */
export function isSpanContextValid(context) {
    return otTrace.isSpanContextValid(context);
}
export function getTracer(name, version) {
    return otTrace.getTracer(name || "azure/core-tracing", version);
}
/** Entrypoint for context API */
export const context = otContext;
/** SpanStatusCode */
export var SpanStatusCode;
(function (SpanStatusCode) {
    /**
     * The default status.
     */
    SpanStatusCode[SpanStatusCode["UNSET"] = 0] = "UNSET";
    /**
     * The operation has been validated by an Application developer or
     * Operator to have completed successfully.
     */
    SpanStatusCode[SpanStatusCode["OK"] = 1] = "OK";
    /**
     * The operation contains an error.
     */
    SpanStatusCode[SpanStatusCode["ERROR"] = 2] = "ERROR";
})(SpanStatusCode || (SpanStatusCode = {}));
//# sourceMappingURL=interfaces.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
const VERSION = "00";
/**
 * Generates a `SpanContext` given a `traceparent` header value.
 * @param traceParent - Serialized span context data as a `traceparent` header value.
 * @returns The `SpanContext` generated from the `traceparent` value.
 */
export function extractSpanContextFromTraceParentHeader(traceParentHeader) {
    const parts = traceParentHeader.split("-");
    if (parts.length !== 4) {
        return;
    }
    const [version, traceId, spanId, traceOptions] = parts;
    if (version !== VERSION) {
        return;
    }
    const traceFlags = parseInt(traceOptions, 16);
    const spanContext = {
        spanId,
        traceId,
        traceFlags
    };
    return spanContext;
}
/**
 * Generates a `traceparent` value given a span context.
 * @param spanContext - Contains context for a specific span.
 * @returns The `spanContext` represented as a `traceparent` value.
 */
export function getTraceParentHeader(spanContext) {
    const missingFields = [];
    if (!spanContext.traceId) {
        missingFields.push("traceId");
    }
    if (!spanContext.spanId) {
        missingFields.push("spanId");
    }
    if (missingFields.length) {
        return;
    }
    const flags = spanContext.traceFlags || 0 /* NONE */;
    const hexFlags = flags.toString(16);
    const traceFlags = hexFlags.length === 1 ? `0${hexFlags}` : hexFlags;
    // https://www.w3.org/TR/trace-context/#traceparent-header-field-values
    return `${VERSION}-${spanContext.traceId}-${spanContext.spanId}-${traceFlags}`;
}
//# sourceMappingURL=traceParentHeader.js.map'use strict';

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

var api = require('@opentelemetry/api');

// Copyright (c) Microsoft Corporation.
(function (SpanKind) {
    /** Default value. Indicates that the span is used internally. */
    SpanKind[SpanKind["INTERNAL"] = 0] = "INTERNAL";
    /**
     * Indicates that the span covers server-side handling of an RPC or other
     * remote request.
     */
    SpanKind[SpanKind["SERVER"] = 1] = "SERVER";
    /**
     * Indicates that the span covers the client-side wrapper around an RPC or
     * other remote request.
     */
    SpanKind[SpanKind["CLIENT"] = 2] = "CLIENT";
    /**
     * Indicates that the span describes producer sending a message to a
     * broker. Unlike client and server, there is no direct critical path latency
     * relationship between producer and consumer spans.
     */
    SpanKind[SpanKind["PRODUCER"] = 3] = "PRODUCER";
    /**
     * Indicates that the span describes consumer receiving a message from a
     * broker. Unlike client and server, there is no direct critical path latency
     * relationship between producer and consumer spans.
     */
    SpanKind[SpanKind["CONSUMER"] = 4] = "CONSUMER";
})(exports.SpanKind || (exports.SpanKind = {}));
/**
 * Return the span if one exists
 *
 * @param context - context to get span from
 */
function getSpan(context) {
    return api.trace.getSpan(context);
}
/**
 * Set the span on a context
 *
 * @param context - context to use as parent
 * @param span - span to set active
 */
function setSpan(context, span) {
    return api.trace.setSpan(context, span);
}
/**
 * Wrap span context in a NoopSpan and set as span in a new
 * context
 *
 * @param context - context to set active span on
 * @param spanContext - span context to be wrapped
 */
function setSpanContext(context, spanContext) {
    return api.trace.setSpanContext(context, spanContext);
}
/**
 * Get the span context of the span if it exists.
 *
 * @param context - context to get values from
 */
function getSpanContext(context) {
    return api.trace.getSpanContext(context);
}
/**
 * Returns true of the given {@link SpanContext} is valid.
 * A valid {@link SpanContext} is one which has a valid trace ID and span ID as per the spec.
 *
 * @param context - the {@link SpanContext} to validate.
 *
 * @returns true if the {@link SpanContext} is valid, false otherwise.
 */
function isSpanContextValid(context) {
    return api.trace.isSpanContextValid(context);
}
function getTracer(name, version) {
    return api.trace.getTracer(name || "azure/core-tracing", version);
}
/** Entrypoint for context API */
const context = api.context;
(function (SpanStatusCode) {
    /**
     * The default status.
     */
    SpanStatusCode[SpanStatusCode["UNSET"] = 0] = "UNSET";
    /**
     * The operation has been validated by an Application developer or
     * Operator to have completed successfully.
     */
    SpanStatusCode[SpanStatusCode["OK"] = 1] = "OK";
    /**
     * The operation contains an error.
     */
    SpanStatusCode[SpanStatusCode["ERROR"] = 2] = "ERROR";
})(exports.SpanStatusCode || (exports.SpanStatusCode = {}));

// Copyright (c) Microsoft Corporation.
function isTracingDisabled() {
    var _a;
    if (typeof process === "undefined") {
        // not supported in browser for now without polyfills
        return false;
    }
    const azureTracingDisabledValue = (_a = process.env.AZURE_TRACING_DISABLED) === null || _a === void 0 ? void 0 : _a.toLowerCase();
    if (azureTracingDisabledValue === "false" || azureTracingDisabledValue === "0") {
        return false;
    }
    return Boolean(azureTracingDisabledValue);
}
/**
 * Creates a function that can be used to create spans using the global tracer.
 *
 * Usage:
 *
 * ```typescript
 * // once
 * const createSpan = createSpanFunction({ packagePrefix: "Azure.Data.AppConfiguration", namespace: "Microsoft.AppConfiguration" });
 *
 * // in each operation
 * const span = createSpan("deleteConfigurationSetting", operationOptions);
 *    // code...
 * span.end();
 * ```
 *
 * @hidden
 * @param args - allows configuration of the prefix for each span as well as the az.namespace field.
 */
function createSpanFunction(args) {
    return function (operationName, operationOptions) {
        const tracer = getTracer();
        const tracingOptions = (operationOptions === null || operationOptions === void 0 ? void 0 : operationOptions.tracingOptions) || {};
        const spanOptions = Object.assign({ kind: exports.SpanKind.INTERNAL }, tracingOptions.spanOptions);
        const spanName = args.packagePrefix ? `${args.packagePrefix}.${operationName}` : operationName;
        let span;
        if (isTracingDisabled()) {
            span = api.trace.wrapSpanContext(api.INVALID_SPAN_CONTEXT);
        }
        else {
            span = tracer.startSpan(spanName, spanOptions, tracingOptions.tracingContext);
        }
        if (args.namespace) {
            span.setAttribute("az.namespace", args.namespace);
        }
        let newSpanOptions = tracingOptions.spanOptions || {};
        if (span.isRecording() && args.namespace) {
            newSpanOptions = Object.assign(Object.assign({}, tracingOptions.spanOptions), { attributes: Object.assign(Object.assign({}, spanOptions.attributes), { "az.namespace": args.namespace }) });
        }
        const newTracingOptions = Object.assign(Object.assign({}, tracingOptions), { spanOptions: newSpanOptions, tracingContext: setSpan(tracingOptions.tracingContext || context.active(), span) });
        const newOperationOptions = Object.assign(Object.assign({}, operationOptions), { tracingOptions: newTracingOptions });
        return {
            span,
            updatedOptions: newOperationOptions
        };
    };
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
const VERSION = "00";
/**
 * Generates a `SpanContext` given a `traceparent` header value.
 * @param traceParent - Serialized span context data as a `traceparent` header value.
 * @returns The `SpanContext` generated from the `traceparent` value.
 */
function extractSpanContextFromTraceParentHeader(traceParentHeader) {
    const parts = traceParentHeader.split("-");
    if (parts.length !== 4) {
        return;
    }
    const [version, traceId, spanId, traceOptions] = parts;
    if (version !== VERSION) {
        return;
    }
    const traceFlags = parseInt(traceOptions, 16);
    const spanContext = {
        spanId,
        traceId,
        traceFlags
    };
    return spanContext;
}
/**
 * Generates a `traceparent` value given a span context.
 * @param spanContext - Contains context for a specific span.
 * @returns The `spanContext` represented as a `traceparent` value.
 */
function getTraceParentHeader(spanContext) {
    const missingFields = [];
    if (!spanContext.traceId) {
        missingFields.push("traceId");
    }
    if (!spanContext.spanId) {
        missingFields.push("spanId");
    }
    if (missingFields.length) {
        return;
    }
    const flags = spanContext.traceFlags || 0 /* NONE */;
    const hexFlags = flags.toString(16);
    const traceFlags = hexFlags.length === 1 ? `0${hexFlags}` : hexFlags;
    // https://www.w3.org/TR/trace-context/#traceparent-header-field-values
    return `${VERSION}-${spanContext.traceId}-${spanContext.spanId}-${traceFlags}`;
}

exports.context = context;
exports.createSpanFunction = createSpanFunction;
exports.extractSpanContextFromTraceParentHeader = extractSpanContextFromTraceParentHeader;
exports.getSpan = getSpan;
exports.getSpanContext = getSpanContext;
exports.getTraceParentHeader = getTraceParentHeader;
exports.getTracer = getTracer;
exports.isSpanContextValid = isSpanContextValid;
exports.setSpan = setSpan;
exports.setSpanContext = setSpanContext;
//# sourceMappingURL=index.js.map
Copyright (c) 2012 Felix Geisendörfer (felix@debuggable.com) and contributors

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

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

 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
# Form-Data [![NPM Module](https://img.shields.io/npm/v/form-data.svg)](https://www.npmjs.com/package/form-data) [![Join the chat at https://gitter.im/form-data/form-data](http://form-data.github.io/images/gitterbadge.svg)](https://gitter.im/form-data/form-data)

A library to create readable ```"multipart/form-data"``` streams. Can be used to submit forms and file uploads to other web applications.

The API of this library is inspired by the [XMLHttpRequest-2 FormData Interface][xhr2-fd].

[xhr2-fd]: http://dev.w3.org/2006/webapi/XMLHttpRequest-2/Overview.html#the-formdata-interface

[![Linux Build](https://img.shields.io/travis/form-data/form-data/v4.0.0.svg?label=linux:6.x-12.x)](https://travis-ci.org/form-data/form-data)
[![MacOS Build](https://img.shields.io/travis/form-data/form-data/v4.0.0.svg?label=macos:6.x-12.x)](https://travis-ci.org/form-data/form-data)
[![Windows Build](https://img.shields.io/travis/form-data/form-data/v4.0.0.svg?label=windows:6.x-12.x)](https://travis-ci.org/form-data/form-data)

[![Coverage Status](https://img.shields.io/coveralls/form-data/form-data/v4.0.0.svg?label=code+coverage)](https://coveralls.io/github/form-data/form-data?branch=master)
[![Dependency Status](https://img.shields.io/david/form-data/form-data.svg)](https://david-dm.org/form-data/form-data)

## Install

```
npm install --save form-data
```

## Usage

In this example we are constructing a form with 3 fields that contain a string,
a buffer and a file stream.

``` javascript
var FormData = require('form-data');
var fs = require('fs');

var form = new FormData();
form.append('my_field', 'my value');
form.append('my_buffer', new Buffer(10));
form.append('my_file', fs.createReadStream('/foo/bar.jpg'));
```

Also you can use http-response stream:

``` javascript
var FormData = require('form-data');
var http = require('http');

var form = new FormData();

http.request('http://nodejs.org/images/logo.png', function(response) {
  form.append('my_field', 'my value');
  form.append('my_buffer', new Buffer(10));
  form.append('my_logo', response);
});
```

Or @mikeal's [request](https://github.com/request/request) stream:

``` javascript
var FormData = require('form-data');
var request = require('request');

var form = new FormData();

form.append('my_field', 'my value');
form.append('my_buffer', new Buffer(10));
form.append('my_logo', request('http://nodejs.org/images/logo.png'));
```

In order to submit this form to a web application, call ```submit(url, [callback])``` method:

``` javascript
form.submit('http://example.org/', function(err, res) {
  // res – response object (http.IncomingMessage)  //
  res.resume();
});

```

For more advanced request manipulations ```submit()``` method returns ```http.ClientRequest``` object, or you can choose from one of the alternative submission methods.

### Custom options

You can provide custom options, such as `maxDataSize`:

``` javascript
var FormData = require('form-data');

var form = new FormData({ maxDataSize: 20971520 });
form.append('my_field', 'my value');
form.append('my_buffer', /* something big */);
```

List of available options could be found in [combined-stream](https://github.com/felixge/node-combined-stream/blob/master/lib/combined_stream.js#L7-L15)

### Alternative submission methods

You can use node's http client interface:

``` javascript
var http = require('http');

var request = http.request({
  method: 'post',
  host: 'example.org',
  path: '/upload',
  headers: form.getHeaders()
});

form.pipe(request);

request.on('response', function(res) {
  console.log(res.statusCode);
});
```

Or if you would prefer the `'Content-Length'` header to be set for you:

``` javascript
form.submit('example.org/upload', function(err, res) {
  console.log(res.statusCode);
});
```

To use custom headers and pre-known length in parts:

``` javascript
var CRLF = '\r\n';
var form = new FormData();

var options = {
  header: CRLF + '--' + form.getBoundary() + CRLF + 'X-Custom-Header: 123' + CRLF + CRLF,
  knownLength: 1
};

form.append('my_buffer', buffer, options);

form.submit('http://example.com/', function(err, res) {
  if (err) throw err;
  console.log('Done');
});
```

Form-Data can recognize and fetch all the required information from common types of streams (```fs.readStream```, ```http.response``` and ```mikeal's request```), for some other types of streams you'd need to provide "file"-related information manually:

``` javascript
someModule.stream(function(err, stdout, stderr) {
  if (err) throw err;

  var form = new FormData();

  form.append('file', stdout, {
    filename: 'unicycle.jpg', // ... or:
    filepath: 'photos/toys/unicycle.jpg',
    contentType: 'image/jpeg',
    knownLength: 19806
  });

  form.submit('http://example.com/', function(err, res) {
    if (err) throw err;
    console.log('Done');
  });
});
```

The `filepath` property overrides `filename` and may contain a relative path. This is typically used when uploading [multiple files from a directory](https://wicg.github.io/entries-api/#dom-htmlinputelement-webkitdirectory).

For edge cases, like POST request to URL with query string or to pass HTTP auth credentials, object can be passed to `form.submit()` as first parameter:

``` javascript
form.submit({
  host: 'example.com',
  path: '/probably.php?extra=params',
  auth: 'username:password'
}, function(err, res) {
  console.log(res.statusCode);
});
```

In case you need to also send custom HTTP headers with the POST request, you can use the `headers` key in first parameter of `form.submit()`:

``` javascript
form.submit({
  host: 'example.com',
  path: '/surelynot.php',
  headers: {'x-test-header': 'test-header-value'}
}, function(err, res) {
  console.log(res.statusCode);
});
```

### Methods

- [_Void_ append( **String** _field_, **Mixed** _value_ [, **Mixed** _options_] )](https://github.com/form-data/form-data#void-append-string-field-mixed-value--mixed-options-).
- [_Headers_ getHeaders( [**Headers** _userHeaders_] )](https://github.com/form-data/form-data#array-getheaders-array-userheaders-)
- [_String_ getBoundary()](https://github.com/form-data/form-data#string-getboundary)
- [_Void_ setBoundary()](https://github.com/form-data/form-data#void-setboundary)
- [_Buffer_ getBuffer()](https://github.com/form-data/form-data#buffer-getbuffer)
- [_Integer_ getLengthSync()](https://github.com/form-data/form-data#integer-getlengthsync)
- [_Integer_ getLength( **function** _callback_ )](https://github.com/form-data/form-data#integer-getlength-function-callback-)
- [_Boolean_ hasKnownLength()](https://github.com/form-data/form-data#boolean-hasknownlength)
- [_Request_ submit( _params_, **function** _callback_ )](https://github.com/form-data/form-data#request-submit-params-function-callback-)
- [_String_ toString()](https://github.com/form-data/form-data#string-tostring)

#### _Void_ append( **String** _field_, **Mixed** _value_ [, **Mixed** _options_] )
Append data to the form. You can submit about any format (string, integer, boolean, buffer, etc.). However, Arrays are not supported and need to be turned into strings by the user.
```javascript
var form = new FormData();
form.append( 'my_string', 'my value' );
form.append( 'my_integer', 1 );
form.append( 'my_boolean', true );
form.append( 'my_buffer', new Buffer(10) );
form.append( 'my_array_as_json', JSON.stringify( ['bird','cute'] ) )
```

You may provide a string for options, or an object.
```javascript
// Set filename by providing a string for options
form.append( 'my_file', fs.createReadStream('/foo/bar.jpg'), 'bar.jpg' );

// provide an object.
form.append( 'my_file', fs.createReadStream('/foo/bar.jpg'), {filename: 'bar.jpg', contentType: 'image/jpeg', knownLength: 19806} );
```

#### _Headers_ getHeaders( [**Headers** _userHeaders_] )
This method adds the correct `content-type` header to the provided array of `userHeaders`.

#### _String_ getBoundary()
Return the boundary of the formData. By default, the boundary consists of 26 `-` followed by 24 numbers
for example:
```javascript
--------------------------515890814546601021194782
```

#### _Void_ setBoundary(String _boundary_)
Set the boundary string, overriding the default behavior described above.

_Note: The boundary must be unique and may not appear in the data._

#### _Buffer_ getBuffer()
Return the full formdata request package, as a Buffer. You can insert this Buffer in e.g. Axios to send multipart data.
```javascript
var form = new FormData();
form.append( 'my_buffer', Buffer.from([0x4a,0x42,0x20,0x52,0x6f,0x63,0x6b,0x73]) );
form.append( 'my_file', fs.readFileSync('/foo/bar.jpg') );

axios.post( 'https://example.com/path/to/api',
            form.getBuffer(),
            form.getHeaders()
          )
```
**Note:** Because the output is of type Buffer, you can only append types that are accepted by Buffer: *string, Buffer, ArrayBuffer, Array, or Array-like Object*. A ReadStream for example will result in an error.

#### _Integer_ getLengthSync()
Same as `getLength` but synchronous.

_Note: getLengthSync __doesn't__ calculate streams length._

#### _Integer_ getLength( **function** _callback_ )
Returns the `Content-Length` async. The callback is used to handle errors and continue once the length has been calculated
```javascript
this.getLength(function(err, length) {
  if (err) {
    this._error(err);
    return;
  }

  // add content length
  request.setHeader('Content-Length', length);

  ...
}.bind(this));
```

#### _Boolean_ hasKnownLength()
Checks if the length of added values is known.

#### _Request_ submit( _params_, **function** _callback_ )
Submit the form to a web application.
```javascript
var form = new FormData();
form.append( 'my_string', 'Hello World' );

form.submit( 'http://example.com/', function(err, res) {
  // res – response object (http.IncomingMessage)  //
  res.resume();
} );
```

#### _String_ toString()
Returns the form data as a string. Don't use this if you are sending files or buffers, use `getBuffer()` instead.

### Integration with other libraries

#### Request

Form submission using  [request](https://github.com/request/request):

```javascript
var formData = {
  my_field: 'my_value',
  my_file: fs.createReadStream(__dirname + '/unicycle.jpg'),
};

request.post({url:'http://service.com/upload', formData: formData}, function(err, httpResponse, body) {
  if (err) {
    return console.error('upload failed:', err);
  }
  console.log('Upload successful!  Server responded with:', body);
});
```

For more details see [request readme](https://github.com/request/request#multipartform-data-multipart-form-uploads).

#### node-fetch

You can also submit a form using [node-fetch](https://github.com/bitinn/node-fetch):

```javascript
var form = new FormData();

form.append('a', 1);

fetch('http://example.com', { method: 'POST', body: form })
    .then(function(res) {
        return res.json();
    }).then(function(json) {
        console.log(json);
    });
```

#### axios

In Node.js you can post a file using [axios](https://github.com/axios/axios):
```javascript
const form = new FormData();
const stream = fs.createReadStream(PATH_TO_FILE);

form.append('image', stream);

// In Node.js environment you need to set boundary in the header field 'Content-Type' by calling method `getHeaders`
const formHeaders = form.getHeaders();

axios.post('http://example.com', form, {
  headers: {
    ...formHeaders,
  },
})
.then(response => response)
.catch(error => error)
```

## Notes

- ```getLengthSync()``` method DOESN'T calculate length for streams, use ```knownLength``` options as workaround.
- ```getLength(cb)``` will send an error as first parameter of callback if stream length cannot be calculated (e.g. send in custom streams w/o using ```knownLength```).
- ```submit``` will not add `content-length` if form length is unknown or not calculable.
- Starting version `2.x` FormData has dropped support for `node@0.10.x`.
- Starting version `3.x` FormData has dropped support for `node@4.x`.

## License

Form-Data is released under the [MIT](License) license.
{
  "author": "Felix Geisendörfer <felix@debuggable.com> (http://debuggable.com/)",
  "name": "form-data",
  "description": "A library to create readable \"multipart/form-data\" streams. Can be used to submit forms and file uploads to other web applications.",
  "version": "4.0.0",
  "repository": {
    "type": "git",
    "url": "git://github.com/form-data/form-data.git"
  },
  "main": "./lib/form_data",
  "browser": "./lib/browser",
  "typings": "./index.d.ts",
  "pre-commit": [
    "lint",
    "ci-test",
    "check"
  ],
  "engines": {
    "node": ">= 6"
  },
  "dependencies": {
    "asynckit": "^0.4.0",
    "combined-stream": "^1.0.8",
    "mime-types": "^2.1.12"
  },
  "devDependencies": {
    "@types/node": "^12.0.10",
    "browserify": "^13.1.1",
    "browserify-istanbul": "^2.0.0",
    "coveralls": "^3.0.4",
    "cross-spawn": "^6.0.5",
    "eslint": "^6.0.1",
    "fake": "^0.2.2",
    "far": "^0.0.7",
    "formidable": "^1.0.17",
    "in-publish": "^2.0.0",
    "is-node-modern": "^1.0.0",
    "istanbul": "^0.4.5",
    "obake": "^0.1.2",
    "puppeteer": "^1.19.0",
    "pkgfiles": "^2.3.0",
    "pre-commit": "^1.1.3",
    "request": "^2.88.0",
    "rimraf": "^2.7.1",
    "tape": "^4.6.2",
    "typescript": "^3.5.2"
  },
  "license": "MIT"
}/* eslint-env browser */
module.exports = typeof self == 'object' ? self.FormData : window.FormData;
var CombinedStream = require('combined-stream');
var util = require('util');
var path = require('path');
var http = require('http');
var https = require('https');
var parseUrl = require('url').parse;
var fs = require('fs');
var Stream = require('stream').Stream;
var mime = require('mime-types');
var asynckit = require('asynckit');
var populate = require('./populate.js');

// Public API
module.exports = FormData;

// make it a Stream
util.inherits(FormData, CombinedStream);

/**
 * Create readable "multipart/form-data" streams.
 * Can be used to submit forms
 * and file uploads to other web applications.
 *
 * @constructor
 * @param {Object} options - Properties to be added/overriden for FormData and CombinedStream
 */
function FormData(options) {
  if (!(this instanceof FormData)) {
    return new FormData(options);
  }

  this._overheadLength = 0;
  this._valueLength = 0;
  this._valuesToMeasure = [];

  CombinedStream.call(this);

  options = options || {};
  for (var option in options) {
    this[option] = options[option];
  }
}

FormData.LINE_BREAK = '\r\n';
FormData.DEFAULT_CONTENT_TYPE = 'application/octet-stream';

FormData.prototype.append = function(field, value, options) {

  options = options || {};

  // allow filename as single option
  if (typeof options == 'string') {
    options = {filename: options};
  }

  var append = CombinedStream.prototype.append.bind(this);

  // all that streamy business can't handle numbers
  if (typeof value == 'number') {
    value = '' + value;
  }

  // https://github.com/felixge/node-form-data/issues/38
  if (util.isArray(value)) {
    // Please convert your array into string
    // the way web server expects it
    this._error(new Error('Arrays are not supported.'));
    return;
  }

  var header = this._multiPartHeader(field, value, options);
  var footer = this._multiPartFooter();

  append(header);
  append(value);
  append(footer);

  // pass along options.knownLength
  this._trackLength(header, value, options);
};

FormData.prototype._trackLength = function(header, value, options) {
  var valueLength = 0;

  // used w/ getLengthSync(), when length is known.
  // e.g. for streaming directly from a remote server,
  // w/ a known file a size, and not wanting to wait for
  // incoming file to finish to get its size.
  if (options.knownLength != null) {
    valueLength += +options.knownLength;
  } else if (Buffer.isBuffer(value)) {
    valueLength = value.length;
  } else if (typeof value === 'string') {
    valueLength = Buffer.byteLength(value);
  }

  this._valueLength += valueLength;

  // @check why add CRLF? does this account for custom/multiple CRLFs?
  this._overheadLength +=
    Buffer.byteLength(header) +
    FormData.LINE_BREAK.length;

  // empty or either doesn't have path or not an http response or not a stream
  if (!value || ( !value.path && !(value.readable && value.hasOwnProperty('httpVersion')) && !(value instanceof Stream))) {
    return;
  }

  // no need to bother with the length
  if (!options.knownLength) {
    this._valuesToMeasure.push(value);
  }
};

FormData.prototype._lengthRetriever = function(value, callback) {

  if (value.hasOwnProperty('fd')) {

    // take read range into a account
    // `end` = Infinity –> read file till the end
    //
    // TODO: Looks like there is bug in Node fs.createReadStream
    // it doesn't respect `end` options without `start` options
    // Fix it when node fixes it.
    // https://github.com/joyent/node/issues/7819
    if (value.end != undefined && value.end != Infinity && value.start != undefined) {

      // when end specified
      // no need to calculate range
      // inclusive, starts with 0
      callback(null, value.end + 1 - (value.start ? value.start : 0));

    // not that fast snoopy
    } else {
      // still need to fetch file size from fs
      fs.stat(value.path, function(err, stat) {

        var fileSize;

        if (err) {
          callback(err);
          return;
        }

        // update final size based on the range options
        fileSize = stat.size - (value.start ? value.start : 0);
        callback(null, fileSize);
      });
    }

  // or http response
  } else if (value.hasOwnProperty('httpVersion')) {
    callback(null, +value.headers['content-length']);

  // or request stream http://github.com/mikeal/request
  } else if (value.hasOwnProperty('httpModule')) {
    // wait till response come back
    value.on('response', function(response) {
      value.pause();
      callback(null, +response.headers['content-length']);
    });
    value.resume();

  // something else
  } else {
    callback('Unknown stream');
  }
};

FormData.prototype._multiPartHeader = function(field, value, options) {
  // custom header specified (as string)?
  // it becomes responsible for boundary
  // (e.g. to handle extra CRLFs on .NET servers)
  if (typeof options.header == 'string') {
    return options.header;
  }

  var contentDisposition = this._getContentDisposition(value, options);
  var contentType = this._getContentType(value, options);

  var contents = '';
  var headers  = {
    // add custom disposition as third element or keep it two elements if not
    'Content-Disposition': ['form-data', 'name="' + field + '"'].concat(contentDisposition || []),
    // if no content type. allow it to be empty array
    'Content-Type': [].concat(contentType || [])
  };

  // allow custom headers.
  if (typeof options.header == 'object') {
    populate(headers, options.header);
  }

  var header;
  for (var prop in headers) {
    if (!headers.hasOwnProperty(prop)) continue;
    header = headers[prop];

    // skip nullish headers.
    if (header == null) {
      continue;
    }

    // convert all headers to arrays.
    if (!Array.isArray(header)) {
      header = [header];
    }

    // add non-empty headers.
    if (header.length) {
      contents += prop + ': ' + header.join('; ') + FormData.LINE_BREAK;
    }
  }

  return '--' + this.getBoundary() + FormData.LINE_BREAK + contents + FormData.LINE_BREAK;
};

FormData.prototype._getContentDisposition = function(value, options) {

  var filename
    , contentDisposition
    ;

  if (typeof options.filepath === 'string') {
    // custom filepath for relative paths
    filename = path.normalize(options.filepath).replace(/\\/g, '/');
  } else if (options.filename || value.name || value.path) {
    // custom filename take precedence
    // formidable and the browser add a name property
    // fs- and request- streams have path property
    filename = path.basename(options.filename || value.name || value.path);
  } else if (value.readable && value.hasOwnProperty('httpVersion')) {
    // or try http response
    filename = path.basename(value.client._httpMessage.path || '');
  }

  if (filename) {
    contentDisposition = 'filename="' + filename + '"';
  }

  return contentDisposition;
};

FormData.prototype._getContentType = function(value, options) {

  // use custom content-type above all
  var contentType = options.contentType;

  // or try `name` from formidable, browser
  if (!contentType && value.name) {
    contentType = mime.lookup(value.name);
  }

  // or try `path` from fs-, request- streams
  if (!contentType && value.path) {
    contentType = mime.lookup(value.path);
  }

  // or if it's http-reponse
  if (!contentType && value.readable && value.hasOwnProperty('httpVersion')) {
    contentType = value.headers['content-type'];
  }

  // or guess it from the filepath or filename
  if (!contentType && (options.filepath || options.filename)) {
    contentType = mime.lookup(options.filepath || options.filename);
  }

  // fallback to the default content type if `value` is not simple value
  if (!contentType && typeof value == 'object') {
    contentType = FormData.DEFAULT_CONTENT_TYPE;
  }

  return contentType;
};

FormData.prototype._multiPartFooter = function() {
  return function(next) {
    var footer = FormData.LINE_BREAK;

    var lastPart = (this._streams.length === 0);
    if (lastPart) {
      footer += this._lastBoundary();
    }

    next(footer);
  }.bind(this);
};

FormData.prototype._lastBoundary = function() {
  return '--' + this.getBoundary() + '--' + FormData.LINE_BREAK;
};

FormData.prototype.getHeaders = function(userHeaders) {
  var header;
  var formHeaders = {
    'content-type': 'multipart/form-data; boundary=' + this.getBoundary()
  };

  for (header in userHeaders) {
    if (userHeaders.hasOwnProperty(header)) {
      formHeaders[header.toLowerCase()] = userHeaders[header];
    }
  }

  return formHeaders;
};

FormData.prototype.setBoundary = function(boundary) {
  this._boundary = boundary;
};

FormData.prototype.getBoundary = function() {
  if (!this._boundary) {
    this._generateBoundary();
  }

  return this._boundary;
};

FormData.prototype.getBuffer = function() {
  var dataBuffer = new Buffer.alloc( 0 );
  var boundary = this.getBoundary();

  // Create the form content. Add Line breaks to the end of data.
  for (var i = 0, len = this._streams.length; i < len; i++) {
    if (typeof this._streams[i] !== 'function') {

      // Add content to the buffer.
      if(Buffer.isBuffer(this._streams[i])) {
        dataBuffer = Buffer.concat( [dataBuffer, this._streams[i]]);
      }else {
        dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(this._streams[i])]);
      }

      // Add break after content.
      if (typeof this._streams[i] !== 'string' || this._streams[i].substring( 2, boundary.length + 2 ) !== boundary) {
        dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(FormData.LINE_BREAK)] );
      }
    }
  }

  // Add the footer and return the Buffer object.
  return Buffer.concat( [dataBuffer, Buffer.from(this._lastBoundary())] );
};

FormData.prototype._generateBoundary = function() {
  // This generates a 50 character boundary similar to those used by Firefox.
  // They are optimized for boyer-moore parsing.
  var boundary = '--------------------------';
  for (var i = 0; i < 24; i++) {
    boundary += Math.floor(Math.random() * 10).toString(16);
  }

  this._boundary = boundary;
};

// Note: getLengthSync DOESN'T calculate streams length
// As workaround one can calculate file size manually
// and add it as knownLength option
FormData.prototype.getLengthSync = function() {
  var knownLength = this._overheadLength + this._valueLength;

  // Don't get confused, there are 3 "internal" streams for each keyval pair
  // so it basically checks if there is any value added to the form
  if (this._streams.length) {
    knownLength += this._lastBoundary().length;
  }

  // https://github.com/form-data/form-data/issues/40
  if (!this.hasKnownLength()) {
    // Some async length retrievers are present
    // therefore synchronous length calculation is false.
    // Please use getLength(callback) to get proper length
    this._error(new Error('Cannot calculate proper length in synchronous way.'));
  }

  return knownLength;
};

// Public API to check if length of added values is known
// https://github.com/form-data/form-data/issues/196
// https://github.com/form-data/form-data/issues/262
FormData.prototype.hasKnownLength = function() {
  var hasKnownLength = true;

  if (this._valuesToMeasure.length) {
    hasKnownLength = false;
  }

  return hasKnownLength;
};

FormData.prototype.getLength = function(cb) {
  var knownLength = this._overheadLength + this._valueLength;

  if (this._streams.length) {
    knownLength += this._lastBoundary().length;
  }

  if (!this._valuesToMeasure.length) {
    process.nextTick(cb.bind(this, null, knownLength));
    return;
  }

  asynckit.parallel(this._valuesToMeasure, this._lengthRetriever, function(err, values) {
    if (err) {
      cb(err);
      return;
    }

    values.forEach(function(length) {
      knownLength += length;
    });

    cb(null, knownLength);
  });
};

FormData.prototype.submit = function(params, cb) {
  var request
    , options
    , defaults = {method: 'post'}
    ;

  // parse provided url if it's string
  // or treat it as options object
  if (typeof params == 'string') {

    params = parseUrl(params);
    options = populate({
      port: params.port,
      path: params.pathname,
      host: params.hostname,
      protocol: params.protocol
    }, defaults);

  // use custom params
  } else {

    options = populate(params, defaults);
    // if no port provided use default one
    if (!options.port) {
      options.port = options.protocol == 'https:' ? 443 : 80;
    }
  }

  // put that good code in getHeaders to some use
  options.headers = this.getHeaders(params.headers);

  // https if specified, fallback to http in any other case
  if (options.protocol == 'https:') {
    request = https.request(options);
  } else {
    request = http.request(options);
  }

  // get content length and fire away
  this.getLength(function(err, length) {
    if (err && err !== 'Unknown stream') {
      this._error(err);
      return;
    }

    // add content length
    if (length) {
      request.setHeader('Content-Length', length);
    }

    this.pipe(request);
    if (cb) {
      var onResponse;

      var callback = function (error, responce) {
        request.removeListener('error', callback);
        request.removeListener('response', onResponse);

        return cb.call(this, error, responce);
      };

      onResponse = callback.bind(this, null);

      request.on('error', callback);
      request.on('response', onResponse);
    }
  }.bind(this));

  return request;
};

FormData.prototype._error = function(err) {
  if (!this.error) {
    this.error = err;
    this.pause();
    this.emit('error', err);
  }
};

FormData.prototype.toString = function () {
  return '[object FormData]';
};
// populates missing values
module.exports = function(dst, src) {

  Object.keys(src).forEach(function(prop)
  {
    dst[prop] = dst[prop] || src[prop];
  });

  return dst;
};
# Contributing

Please feel free to file GitHub Issues or propose Pull Requests. We're always happy to discuss improvements to this library!

## Testing

```shell
npm test
```

## Releasing

Releases are supposed to be done from master, version bumping is automated through [`standard-version`](https://github.com/conventional-changelog/standard-version):

```shell
npm run release -- --dry-run  # verify output manually
npm run release               # follow the instructions from the output of this command
```
The MIT License (MIT)

Copyright (c) 2010-2020 Robert Kieffer and other contributors

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

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

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "name": "uuid",
  "version": "8.3.2",
  "description": "RFC4122 (v1, v4, and v5) UUIDs",
  "commitlint": {
    "extends": [
      "@commitlint/config-conventional"
    ]
  },
  "license": "MIT",
  "bin": {
    "uuid": "./dist/bin/uuid"
  },
  "sideEffects": false,
  "main": "./dist/index.js",
  "exports": {
    ".": {
      "node": {
        "module": "./dist/esm-node/index.js",
        "require": "./dist/index.js",
        "import": "./wrapper.mjs"
      },
      "default": "./dist/esm-browser/index.js"
    },
    "./package.json": "./package.json"
  },
  "module": "./dist/esm-node/index.js",
  "browser": {
    "./dist/md5.js": "./dist/md5-browser.js",
    "./dist/rng.js": "./dist/rng-browser.js",
    "./dist/sha1.js": "./dist/sha1-browser.js",
    "./dist/esm-node/index.js": "./dist/esm-browser/index.js"
  },
  "files": [
    "CHANGELOG.md",
    "CONTRIBUTING.md",
    "LICENSE.md",
    "README.md",
    "dist",
    "wrapper.mjs"
  ],
  "devDependencies": {
    "@babel/cli": "7.11.6",
    "@babel/core": "7.11.6",
    "@babel/preset-env": "7.11.5",
    "@commitlint/cli": "11.0.0",
    "@commitlint/config-conventional": "11.0.0",
    "@rollup/plugin-node-resolve": "9.0.0",
    "babel-eslint": "10.1.0",
    "bundlewatch": "0.3.1",
    "eslint": "7.10.0",
    "eslint-config-prettier": "6.12.0",
    "eslint-config-standard": "14.1.1",
    "eslint-plugin-import": "2.22.1",
    "eslint-plugin-node": "11.1.0",
    "eslint-plugin-prettier": "3.1.4",
    "eslint-plugin-promise": "4.2.1",
    "eslint-plugin-standard": "4.0.1",
    "husky": "4.3.0",
    "jest": "25.5.4",
    "lint-staged": "10.4.0",
    "npm-run-all": "4.1.5",
    "optional-dev-dependency": "2.0.1",
    "prettier": "2.1.2",
    "random-seed": "0.3.0",
    "rollup": "2.28.2",
    "rollup-plugin-terser": "7.0.2",
    "runmd": "1.3.2",
    "standard-version": "9.0.0"
  },
  "optionalDevDependencies": {
    "@wdio/browserstack-service": "6.4.0",
    "@wdio/cli": "6.4.0",
    "@wdio/jasmine-framework": "6.4.0",
    "@wdio/local-runner": "6.4.0",
    "@wdio/spec-reporter": "6.4.0",
    "@wdio/static-server-service": "6.4.0",
    "@wdio/sync": "6.4.0"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/uuidjs/uuid.git"
  },
  "husky": {
    "hooks": {
      "commit-msg": "commitlint -E HUSKY_GIT_PARAMS",
      "pre-commit": "lint-staged"
    }
  },
  "lint-staged": {
    "*.{js,jsx,json,md}": [
      "prettier --write"
    ],
    "*.{js,jsx}": [
      "eslint --fix"
    ]
  },
  "standard-version": {
    "scripts": {
      "postchangelog": "prettier --write CHANGELOG.md"
    }
  }
}import uuid from './dist/index.js';
export const v1 = uuid.v1;
export const v3 = uuid.v3;
export const v4 = uuid.v4;
export const v5 = uuid.v5;
export const NIL = uuid.NIL;
export const version = uuid.version;
export const validate = uuid.validate;
export const stringify = uuid.stringify;
export const parse = uuid.parse;
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
Object.defineProperty(exports, "v1", {
  enumerable: true,
  get: function () {
    return _v.default;
  }
});
Object.defineProperty(exports, "v3", {
  enumerable: true,
  get: function () {
    return _v2.default;
  }
});
Object.defineProperty(exports, "v4", {
  enumerable: true,
  get: function () {
    return _v3.default;
  }
});
Object.defineProperty(exports, "v5", {
  enumerable: true,
  get: function () {
    return _v4.default;
  }
});
Object.defineProperty(exports, "NIL", {
  enumerable: true,
  get: function () {
    return _nil.default;
  }
});
Object.defineProperty(exports, "version", {
  enumerable: true,
  get: function () {
    return _version.default;
  }
});
Object.defineProperty(exports, "validate", {
  enumerable: true,
  get: function () {
    return _validate.default;
  }
});
Object.defineProperty(exports, "stringify", {
  enumerable: true,
  get: function () {
    return _stringify.default;
  }
});
Object.defineProperty(exports, "parse", {
  enumerable: true,
  get: function () {
    return _parse.default;
  }
});

var _v = _interopRequireDefault(require("./v1.js"));

var _v2 = _interopRequireDefault(require("./v3.js"));

var _v3 = _interopRequireDefault(require("./v4.js"));

var _v4 = _interopRequireDefault(require("./v5.js"));

var _nil = _interopRequireDefault(require("./nil.js"));

var _version = _interopRequireDefault(require("./version.js"));

var _validate = _interopRequireDefault(require("./validate.js"));

var _stringify = _interopRequireDefault(require("./stringify.js"));

var _parse = _interopRequireDefault(require("./parse.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/*
 * Browser-compatible JavaScript MD5
 *
 * Modification of JavaScript MD5
 * https://github.com/blueimp/JavaScript-MD5
 *
 * Copyright 2011, Sebastian Tschan
 * https://blueimp.net
 *
 * Licensed under the MIT license:
 * https://opensource.org/licenses/MIT
 *
 * Based on
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 */
function md5(bytes) {
  if (typeof bytes === 'string') {
    const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape

    bytes = new Uint8Array(msg.length);

    for (let i = 0; i < msg.length; ++i) {
      bytes[i] = msg.charCodeAt(i);
    }
  }

  return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));
}
/*
 * Convert an array of little-endian words to an array of bytes
 */


function md5ToHexEncodedArray(input) {
  const output = [];
  const length32 = input.length * 32;
  const hexTab = '0123456789abcdef';

  for (let i = 0; i < length32; i += 8) {
    const x = input[i >> 5] >>> i % 32 & 0xff;
    const hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);
    output.push(hex);
  }

  return output;
}
/**
 * Calculate output length with padding and bit length
 */


function getOutputLength(inputLength8) {
  return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;
}
/*
 * Calculate the MD5 of an array of little-endian words, and a bit length.
 */


function wordsToMd5(x, len) {
  /* append padding */
  x[len >> 5] |= 0x80 << len % 32;
  x[getOutputLength(len) - 1] = len;
  let a = 1732584193;
  let b = -271733879;
  let c = -1732584194;
  let d = 271733878;

  for (let i = 0; i < x.length; i += 16) {
    const olda = a;
    const oldb = b;
    const oldc = c;
    const oldd = d;
    a = md5ff(a, b, c, d, x[i], 7, -680876936);
    d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);
    c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);
    b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
    a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);
    d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
    c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
    b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);
    a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
    d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
    c = md5ff(c, d, a, b, x[i + 10], 17, -42063);
    b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
    a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
    d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);
    c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
    b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
    a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);
    d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
    c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);
    b = md5gg(b, c, d, a, x[i], 20, -373897302);
    a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);
    d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);
    c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);
    b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);
    a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);
    d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
    c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);
    b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
    a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
    d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);
    c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
    b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
    a = md5hh(a, b, c, d, x[i + 5], 4, -378558);
    d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
    c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
    b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);
    a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
    d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
    c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);
    b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
    a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);
    d = md5hh(d, a, b, c, x[i], 11, -358537222);
    c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);
    b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);
    a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);
    d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);
    c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);
    b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);
    a = md5ii(a, b, c, d, x[i], 6, -198630844);
    d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
    c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
    b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);
    a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
    d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
    c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);
    b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
    a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
    d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);
    c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
    b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
    a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);
    d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
    c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);
    b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);
    a = safeAdd(a, olda);
    b = safeAdd(b, oldb);
    c = safeAdd(c, oldc);
    d = safeAdd(d, oldd);
  }

  return [a, b, c, d];
}
/*
 * Convert an array bytes to an array of little-endian words
 * Characters >255 have their high-byte silently ignored.
 */


function bytesToWords(input) {
  if (input.length === 0) {
    return [];
  }

  const length8 = input.length * 8;
  const output = new Uint32Array(getOutputLength(length8));

  for (let i = 0; i < length8; i += 8) {
    output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;
  }

  return output;
}
/*
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
 * to work around bugs in some JS interpreters.
 */


function safeAdd(x, y) {
  const lsw = (x & 0xffff) + (y & 0xffff);
  const msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return msw << 16 | lsw & 0xffff;
}
/*
 * Bitwise rotate a 32-bit number to the left.
 */


function bitRotateLeft(num, cnt) {
  return num << cnt | num >>> 32 - cnt;
}
/*
 * These functions implement the four basic operations the algorithm uses.
 */


function md5cmn(q, a, b, x, s, t) {
  return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);
}

function md5ff(a, b, c, d, x, s, t) {
  return md5cmn(b & c | ~b & d, a, b, x, s, t);
}

function md5gg(a, b, c, d, x, s, t) {
  return md5cmn(b & d | c & ~d, a, b, x, s, t);
}

function md5hh(a, b, c, d, x, s, t) {
  return md5cmn(b ^ c ^ d, a, b, x, s, t);
}

function md5ii(a, b, c, d, x, s, t) {
  return md5cmn(c ^ (b | ~d), a, b, x, s, t);
}

var _default = md5;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _crypto = _interopRequireDefault(require("crypto"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function md5(bytes) {
  if (Array.isArray(bytes)) {
    bytes = Buffer.from(bytes);
  } else if (typeof bytes === 'string') {
    bytes = Buffer.from(bytes, 'utf8');
  }

  return _crypto.default.createHash('md5').update(bytes).digest();
}

var _default = md5;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var _default = '00000000-0000-0000-0000-000000000000';
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _validate = _interopRequireDefault(require("./validate.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function parse(uuid) {
  if (!(0, _validate.default)(uuid)) {
    throw TypeError('Invalid UUID');
  }

  let v;
  const arr = new Uint8Array(16); // Parse ########-....-....-....-............

  arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;
  arr[1] = v >>> 16 & 0xff;
  arr[2] = v >>> 8 & 0xff;
  arr[3] = v & 0xff; // Parse ........-####-....-....-............

  arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;
  arr[5] = v & 0xff; // Parse ........-....-####-....-............

  arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;
  arr[7] = v & 0xff; // Parse ........-....-....-####-............

  arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;
  arr[9] = v & 0xff; // Parse ........-....-....-....-############
  // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes)

  arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;
  arr[11] = v / 0x100000000 & 0xff;
  arr[12] = v >>> 24 & 0xff;
  arr[13] = v >>> 16 & 0xff;
  arr[14] = v >>> 8 & 0xff;
  arr[15] = v & 0xff;
  return arr;
}

var _default = parse;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var _default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = rng;
// Unique ID creation requires a high quality random # generator. In the browser we therefore
// require the crypto API and do not support built-in fallback to lower quality random number
// generators (like Math.random()).
let getRandomValues;
const rnds8 = new Uint8Array(16);

function rng() {
  // lazy load so that environments that need to polyfill have a chance to do so
  if (!getRandomValues) {
    // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. Also,
    // find the complete implementation of crypto (msCrypto) on IE11.
    getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);

    if (!getRandomValues) {
      throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');
    }
  }

  return getRandomValues(rnds8);
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = rng;

var _crypto = _interopRequireDefault(require("crypto"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate

let poolPtr = rnds8Pool.length;

function rng() {
  if (poolPtr > rnds8Pool.length - 16) {
    _crypto.default.randomFillSync(rnds8Pool);

    poolPtr = 0;
  }

  return rnds8Pool.slice(poolPtr, poolPtr += 16);
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

// Adapted from Chris Veness' SHA1 code at
// http://www.movable-type.co.uk/scripts/sha1.html
function f(s, x, y, z) {
  switch (s) {
    case 0:
      return x & y ^ ~x & z;

    case 1:
      return x ^ y ^ z;

    case 2:
      return x & y ^ x & z ^ y & z;

    case 3:
      return x ^ y ^ z;
  }
}

function ROTL(x, n) {
  return x << n | x >>> 32 - n;
}

function sha1(bytes) {
  const K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];
  const H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];

  if (typeof bytes === 'string') {
    const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape

    bytes = [];

    for (let i = 0; i < msg.length; ++i) {
      bytes.push(msg.charCodeAt(i));
    }
  } else if (!Array.isArray(bytes)) {
    // Convert Array-like to Array
    bytes = Array.prototype.slice.call(bytes);
  }

  bytes.push(0x80);
  const l = bytes.length / 4 + 2;
  const N = Math.ceil(l / 16);
  const M = new Array(N);

  for (let i = 0; i < N; ++i) {
    const arr = new Uint32Array(16);

    for (let j = 0; j < 16; ++j) {
      arr[j] = bytes[i * 64 + j * 4] << 24 | bytes[i * 64 + j * 4 + 1] << 16 | bytes[i * 64 + j * 4 + 2] << 8 | bytes[i * 64 + j * 4 + 3];
    }

    M[i] = arr;
  }

  M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);
  M[N - 1][14] = Math.floor(M[N - 1][14]);
  M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;

  for (let i = 0; i < N; ++i) {
    const W = new Uint32Array(80);

    for (let t = 0; t < 16; ++t) {
      W[t] = M[i][t];
    }

    for (let t = 16; t < 80; ++t) {
      W[t] = ROTL(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1);
    }

    let a = H[0];
    let b = H[1];
    let c = H[2];
    let d = H[3];
    let e = H[4];

    for (let t = 0; t < 80; ++t) {
      const s = Math.floor(t / 20);
      const T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[t] >>> 0;
      e = d;
      d = c;
      c = ROTL(b, 30) >>> 0;
      b = a;
      a = T;
    }

    H[0] = H[0] + a >>> 0;
    H[1] = H[1] + b >>> 0;
    H[2] = H[2] + c >>> 0;
    H[3] = H[3] + d >>> 0;
    H[4] = H[4] + e >>> 0;
  }

  return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];
}

var _default = sha1;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _crypto = _interopRequireDefault(require("crypto"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function sha1(bytes) {
  if (Array.isArray(bytes)) {
    bytes = Buffer.from(bytes);
  } else if (typeof bytes === 'string') {
    bytes = Buffer.from(bytes, 'utf8');
  }

  return _crypto.default.createHash('sha1').update(bytes).digest();
}

var _default = sha1;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _validate = _interopRequireDefault(require("./validate.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/**
 * Convert array of 16 byte values to UUID string format of the form:
 * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
 */
const byteToHex = [];

for (let i = 0; i < 256; ++i) {
  byteToHex.push((i + 0x100).toString(16).substr(1));
}

function stringify(arr, offset = 0) {
  // Note: Be careful editing this code!  It's been tuned for performance
  // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
  const uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID.  If this throws, it's likely due to one
  // of the following:
  // - One or more input array values don't map to a hex octet (leading to
  // "undefined" in the uuid)
  // - Invalid input values for the RFC `version` or `variant` fields

  if (!(0, _validate.default)(uuid)) {
    throw TypeError('Stringified UUID is invalid');
  }

  return uuid;
}

var _default = stringify;
exports.default = _default;"use strict";

var _assert = _interopRequireDefault(require("assert"));

var _v = _interopRequireDefault(require("./v1.js"));

var _v2 = _interopRequireDefault(require("./v3.js"));

var _v3 = _interopRequireDefault(require("./v4.js"));

var _v4 = _interopRequireDefault(require("./v5.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function usage() {
  console.log('Usage:');
  console.log('  uuid');
  console.log('  uuid v1');
  console.log('  uuid v3 <name> <namespace uuid>');
  console.log('  uuid v4');
  console.log('  uuid v5 <name> <namespace uuid>');
  console.log('  uuid --help');
  console.log('\nNote: <namespace uuid> may be "URL" or "DNS" to use the corresponding UUIDs defined by RFC4122');
}

const args = process.argv.slice(2);

if (args.indexOf('--help') >= 0) {
  usage();
  process.exit(0);
}

const version = args.shift() || 'v4';

switch (version) {
  case 'v1':
    console.log((0, _v.default)());
    break;

  case 'v3':
    {
      const name = args.shift();
      let namespace = args.shift();
      (0, _assert.default)(name != null, 'v3 name not specified');
      (0, _assert.default)(namespace != null, 'v3 namespace not specified');

      if (namespace === 'URL') {
        namespace = _v2.default.URL;
      }

      if (namespace === 'DNS') {
        namespace = _v2.default.DNS;
      }

      console.log((0, _v2.default)(name, namespace));
      break;
    }

  case 'v4':
    console.log((0, _v3.default)());
    break;

  case 'v5':
    {
      const name = args.shift();
      let namespace = args.shift();
      (0, _assert.default)(name != null, 'v5 name not specified');
      (0, _assert.default)(namespace != null, 'v5 namespace not specified');

      if (namespace === 'URL') {
        namespace = _v4.default.URL;
      }

      if (namespace === 'DNS') {
        namespace = _v4.default.DNS;
      }

      console.log((0, _v4.default)(name, namespace));
      break;
    }

  default:
    usage();
    process.exit(1);
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _rng = _interopRequireDefault(require("./rng.js"));

var _stringify = _interopRequireDefault(require("./stringify.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// **`v1()` - Generate time-based UUID**
//
// Inspired by https://github.com/LiosK/UUID.js
// and http://docs.python.org/library/uuid.html
let _nodeId;

let _clockseq; // Previous uuid creation time


let _lastMSecs = 0;
let _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details

function v1(options, buf, offset) {
  let i = buf && offset || 0;
  const b = buf || new Array(16);
  options = options || {};
  let node = options.node || _nodeId;
  let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not
  // specified.  We do this lazily to minimize issues related to insufficient
  // system entropy.  See #189

  if (node == null || clockseq == null) {
    const seedBytes = options.random || (options.rng || _rng.default)();

    if (node == null) {
      // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
      node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];
    }

    if (clockseq == null) {
      // Per 4.2.2, randomize (14 bit) clockseq
      clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
    }
  } // UUID timestamps are 100 nano-second units since the Gregorian epoch,
  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so
  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.


  let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock
  // cycle to simulate higher resolution clock

  let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)

  const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression

  if (dt < 0 && options.clockseq === undefined) {
    clockseq = clockseq + 1 & 0x3fff;
  } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
  // time interval


  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
    nsecs = 0;
  } // Per 4.2.1.2 Throw error if too many uuids are requested


  if (nsecs >= 10000) {
    throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
  }

  _lastMSecs = msecs;
  _lastNSecs = nsecs;
  _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch

  msecs += 12219292800000; // `time_low`

  const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
  b[i++] = tl >>> 24 & 0xff;
  b[i++] = tl >>> 16 & 0xff;
  b[i++] = tl >>> 8 & 0xff;
  b[i++] = tl & 0xff; // `time_mid`

  const tmh = msecs / 0x100000000 * 10000 & 0xfffffff;
  b[i++] = tmh >>> 8 & 0xff;
  b[i++] = tmh & 0xff; // `time_high_and_version`

  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version

  b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)

  b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`

  b[i++] = clockseq & 0xff; // `node`

  for (let n = 0; n < 6; ++n) {
    b[i + n] = node[n];
  }

  return buf || (0, _stringify.default)(b);
}

var _default = v1;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _v = _interopRequireDefault(require("./v35.js"));

var _md = _interopRequireDefault(require("./md5.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const v3 = (0, _v.default)('v3', 0x30, _md.default);
var _default = v3;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = _default;
exports.URL = exports.DNS = void 0;

var _stringify = _interopRequireDefault(require("./stringify.js"));

var _parse = _interopRequireDefault(require("./parse.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function stringToBytes(str) {
  str = unescape(encodeURIComponent(str)); // UTF8 escape

  const bytes = [];

  for (let i = 0; i < str.length; ++i) {
    bytes.push(str.charCodeAt(i));
  }

  return bytes;
}

const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
exports.DNS = DNS;
const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
exports.URL = URL;

function _default(name, version, hashfunc) {
  function generateUUID(value, namespace, buf, offset) {
    if (typeof value === 'string') {
      value = stringToBytes(value);
    }

    if (typeof namespace === 'string') {
      namespace = (0, _parse.default)(namespace);
    }

    if (namespace.length !== 16) {
      throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');
    } // Compute hash of namespace and value, Per 4.3
    // Future: Use spread syntax when supported on all platforms, e.g. `bytes =
    // hashfunc([...namespace, ... value])`


    let bytes = new Uint8Array(16 + value.length);
    bytes.set(namespace);
    bytes.set(value, namespace.length);
    bytes = hashfunc(bytes);
    bytes[6] = bytes[6] & 0x0f | version;
    bytes[8] = bytes[8] & 0x3f | 0x80;

    if (buf) {
      offset = offset || 0;

      for (let i = 0; i < 16; ++i) {
        buf[offset + i] = bytes[i];
      }

      return buf;
    }

    return (0, _stringify.default)(bytes);
  } // Function#name is not settable on some platforms (#270)


  try {
    generateUUID.name = name; // eslint-disable-next-line no-empty
  } catch (err) {} // For CommonJS default export support


  generateUUID.DNS = DNS;
  generateUUID.URL = URL;
  return generateUUID;
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _rng = _interopRequireDefault(require("./rng.js"));

var _stringify = _interopRequireDefault(require("./stringify.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function v4(options, buf, offset) {
  options = options || {};

  const rnds = options.random || (options.rng || _rng.default)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`


  rnds[6] = rnds[6] & 0x0f | 0x40;
  rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided

  if (buf) {
    offset = offset || 0;

    for (let i = 0; i < 16; ++i) {
      buf[offset + i] = rnds[i];
    }

    return buf;
  }

  return (0, _stringify.default)(rnds);
}

var _default = v4;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _v = _interopRequireDefault(require("./v35.js"));

var _sha = _interopRequireDefault(require("./sha1.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const v5 = (0, _v.default)('v5', 0x50, _sha.default);
var _default = v5;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _regex = _interopRequireDefault(require("./regex.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function validate(uuid) {
  return typeof uuid === 'string' && _regex.default.test(uuid);
}

var _default = validate;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _validate = _interopRequireDefault(require("./validate.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function version(uuid) {
  if (!(0, _validate.default)(uuid)) {
    throw TypeError('Invalid UUID');
  }

  return parseInt(uuid.substr(14, 1), 16);
}

var _default = version;
exports.default = _default;!function(r,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((r="undefined"!=typeof globalThis?globalThis:r||self).uuid={})}(this,(function(r){"use strict";var e,n=new Uint8Array(16);function t(){if(!e&&!(e="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return e(n)}var o=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function a(r){return"string"==typeof r&&o.test(r)}for(var i,u,f=[],s=0;s<256;++s)f.push((s+256).toString(16).substr(1));function c(r){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(f[r[e+0]]+f[r[e+1]]+f[r[e+2]]+f[r[e+3]]+"-"+f[r[e+4]]+f[r[e+5]]+"-"+f[r[e+6]]+f[r[e+7]]+"-"+f[r[e+8]]+f[r[e+9]]+"-"+f[r[e+10]]+f[r[e+11]]+f[r[e+12]]+f[r[e+13]]+f[r[e+14]]+f[r[e+15]]).toLowerCase();if(!a(n))throw TypeError("Stringified UUID is invalid");return n}var l=0,d=0;function v(r){if(!a(r))throw TypeError("Invalid UUID");var e,n=new Uint8Array(16);return n[0]=(e=parseInt(r.slice(0,8),16))>>>24,n[1]=e>>>16&255,n[2]=e>>>8&255,n[3]=255&e,n[4]=(e=parseInt(r.slice(9,13),16))>>>8,n[5]=255&e,n[6]=(e=parseInt(r.slice(14,18),16))>>>8,n[7]=255&e,n[8]=(e=parseInt(r.slice(19,23),16))>>>8,n[9]=255&e,n[10]=(e=parseInt(r.slice(24,36),16))/1099511627776&255,n[11]=e/4294967296&255,n[12]=e>>>24&255,n[13]=e>>>16&255,n[14]=e>>>8&255,n[15]=255&e,n}function p(r,e,n){function t(r,t,o,a){if("string"==typeof r&&(r=function(r){r=unescape(encodeURIComponent(r));for(var e=[],n=0;n<r.length;++n)e.push(r.charCodeAt(n));return e}(r)),"string"==typeof t&&(t=v(t)),16!==t.length)throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");var i=new Uint8Array(16+r.length);if(i.set(t),i.set(r,t.length),(i=n(i))[6]=15&i[6]|e,i[8]=63&i[8]|128,o){a=a||0;for(var u=0;u<16;++u)o[a+u]=i[u];return o}return c(i)}try{t.name=r}catch(r){}return t.DNS="6ba7b810-9dad-11d1-80b4-00c04fd430c8",t.URL="6ba7b811-9dad-11d1-80b4-00c04fd430c8",t}function h(r){return 14+(r+64>>>9<<4)+1}function y(r,e){var n=(65535&r)+(65535&e);return(r>>16)+(e>>16)+(n>>16)<<16|65535&n}function g(r,e,n,t,o,a){return y((i=y(y(e,r),y(t,a)))<<(u=o)|i>>>32-u,n);var i,u}function m(r,e,n,t,o,a,i){return g(e&n|~e&t,r,e,o,a,i)}function w(r,e,n,t,o,a,i){return g(e&t|n&~t,r,e,o,a,i)}function b(r,e,n,t,o,a,i){return g(e^n^t,r,e,o,a,i)}function A(r,e,n,t,o,a,i){return g(n^(e|~t),r,e,o,a,i)}var U=p("v3",48,(function(r){if("string"==typeof r){var e=unescape(encodeURIComponent(r));r=new Uint8Array(e.length);for(var n=0;n<e.length;++n)r[n]=e.charCodeAt(n)}return function(r){for(var e=[],n=32*r.length,t="0123456789abcdef",o=0;o<n;o+=8){var a=r[o>>5]>>>o%32&255,i=parseInt(t.charAt(a>>>4&15)+t.charAt(15&a),16);e.push(i)}return e}(function(r,e){r[e>>5]|=128<<e%32,r[h(e)-1]=e;for(var n=1732584193,t=-271733879,o=-1732584194,a=271733878,i=0;i<r.length;i+=16){var u=n,f=t,s=o,c=a;n=m(n,t,o,a,r[i],7,-680876936),a=m(a,n,t,o,r[i+1],12,-389564586),o=m(o,a,n,t,r[i+2],17,606105819),t=m(t,o,a,n,r[i+3],22,-1044525330),n=m(n,t,o,a,r[i+4],7,-176418897),a=m(a,n,t,o,r[i+5],12,1200080426),o=m(o,a,n,t,r[i+6],17,-1473231341),t=m(t,o,a,n,r[i+7],22,-45705983),n=m(n,t,o,a,r[i+8],7,1770035416),a=m(a,n,t,o,r[i+9],12,-1958414417),o=m(o,a,n,t,r[i+10],17,-42063),t=m(t,o,a,n,r[i+11],22,-1990404162),n=m(n,t,o,a,r[i+12],7,1804603682),a=m(a,n,t,o,r[i+13],12,-40341101),o=m(o,a,n,t,r[i+14],17,-1502002290),n=w(n,t=m(t,o,a,n,r[i+15],22,1236535329),o,a,r[i+1],5,-165796510),a=w(a,n,t,o,r[i+6],9,-1069501632),o=w(o,a,n,t,r[i+11],14,643717713),t=w(t,o,a,n,r[i],20,-373897302),n=w(n,t,o,a,r[i+5],5,-701558691),a=w(a,n,t,o,r[i+10],9,38016083),o=w(o,a,n,t,r[i+15],14,-660478335),t=w(t,o,a,n,r[i+4],20,-405537848),n=w(n,t,o,a,r[i+9],5,568446438),a=w(a,n,t,o,r[i+14],9,-1019803690),o=w(o,a,n,t,r[i+3],14,-187363961),t=w(t,o,a,n,r[i+8],20,1163531501),n=w(n,t,o,a,r[i+13],5,-1444681467),a=w(a,n,t,o,r[i+2],9,-51403784),o=w(o,a,n,t,r[i+7],14,1735328473),n=b(n,t=w(t,o,a,n,r[i+12],20,-1926607734),o,a,r[i+5],4,-378558),a=b(a,n,t,o,r[i+8],11,-2022574463),o=b(o,a,n,t,r[i+11],16,1839030562),t=b(t,o,a,n,r[i+14],23,-35309556),n=b(n,t,o,a,r[i+1],4,-1530992060),a=b(a,n,t,o,r[i+4],11,1272893353),o=b(o,a,n,t,r[i+7],16,-155497632),t=b(t,o,a,n,r[i+10],23,-1094730640),n=b(n,t,o,a,r[i+13],4,681279174),a=b(a,n,t,o,r[i],11,-358537222),o=b(o,a,n,t,r[i+3],16,-722521979),t=b(t,o,a,n,r[i+6],23,76029189),n=b(n,t,o,a,r[i+9],4,-640364487),a=b(a,n,t,o,r[i+12],11,-421815835),o=b(o,a,n,t,r[i+15],16,530742520),n=A(n,t=b(t,o,a,n,r[i+2],23,-995338651),o,a,r[i],6,-198630844),a=A(a,n,t,o,r[i+7],10,1126891415),o=A(o,a,n,t,r[i+14],15,-1416354905),t=A(t,o,a,n,r[i+5],21,-57434055),n=A(n,t,o,a,r[i+12],6,1700485571),a=A(a,n,t,o,r[i+3],10,-1894986606),o=A(o,a,n,t,r[i+10],15,-1051523),t=A(t,o,a,n,r[i+1],21,-2054922799),n=A(n,t,o,a,r[i+8],6,1873313359),a=A(a,n,t,o,r[i+15],10,-30611744),o=A(o,a,n,t,r[i+6],15,-1560198380),t=A(t,o,a,n,r[i+13],21,1309151649),n=A(n,t,o,a,r[i+4],6,-145523070),a=A(a,n,t,o,r[i+11],10,-1120210379),o=A(o,a,n,t,r[i+2],15,718787259),t=A(t,o,a,n,r[i+9],21,-343485551),n=y(n,u),t=y(t,f),o=y(o,s),a=y(a,c)}return[n,t,o,a]}(function(r){if(0===r.length)return[];for(var e=8*r.length,n=new Uint32Array(h(e)),t=0;t<e;t+=8)n[t>>5]|=(255&r[t/8])<<t%32;return n}(r),8*r.length))}));function I(r,e,n,t){switch(r){case 0:return e&n^~e&t;case 1:return e^n^t;case 2:return e&n^e&t^n&t;case 3:return e^n^t}}function C(r,e){return r<<e|r>>>32-e}var R=p("v5",80,(function(r){var e=[1518500249,1859775393,2400959708,3395469782],n=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof r){var t=unescape(encodeURIComponent(r));r=[];for(var o=0;o<t.length;++o)r.push(t.charCodeAt(o))}else Array.isArray(r)||(r=Array.prototype.slice.call(r));r.push(128);for(var a=r.length/4+2,i=Math.ceil(a/16),u=new Array(i),f=0;f<i;++f){for(var s=new Uint32Array(16),c=0;c<16;++c)s[c]=r[64*f+4*c]<<24|r[64*f+4*c+1]<<16|r[64*f+4*c+2]<<8|r[64*f+4*c+3];u[f]=s}u[i-1][14]=8*(r.length-1)/Math.pow(2,32),u[i-1][14]=Math.floor(u[i-1][14]),u[i-1][15]=8*(r.length-1)&4294967295;for(var l=0;l<i;++l){for(var d=new Uint32Array(80),v=0;v<16;++v)d[v]=u[l][v];for(var p=16;p<80;++p)d[p]=C(d[p-3]^d[p-8]^d[p-14]^d[p-16],1);for(var h=n[0],y=n[1],g=n[2],m=n[3],w=n[4],b=0;b<80;++b){var A=Math.floor(b/20),U=C(h,5)+I(A,y,g,m)+w+e[A]+d[b]>>>0;w=m,m=g,g=C(y,30)>>>0,y=h,h=U}n[0]=n[0]+h>>>0,n[1]=n[1]+y>>>0,n[2]=n[2]+g>>>0,n[3]=n[3]+m>>>0,n[4]=n[4]+w>>>0}return[n[0]>>24&255,n[0]>>16&255,n[0]>>8&255,255&n[0],n[1]>>24&255,n[1]>>16&255,n[1]>>8&255,255&n[1],n[2]>>24&255,n[2]>>16&255,n[2]>>8&255,255&n[2],n[3]>>24&255,n[3]>>16&255,n[3]>>8&255,255&n[3],n[4]>>24&255,n[4]>>16&255,n[4]>>8&255,255&n[4]]}));r.NIL="00000000-0000-0000-0000-000000000000",r.parse=v,r.stringify=c,r.v1=function(r,e,n){var o=e&&n||0,a=e||new Array(16),f=(r=r||{}).node||i,s=void 0!==r.clockseq?r.clockseq:u;if(null==f||null==s){var v=r.random||(r.rng||t)();null==f&&(f=i=[1|v[0],v[1],v[2],v[3],v[4],v[5]]),null==s&&(s=u=16383&(v[6]<<8|v[7]))}var p=void 0!==r.msecs?r.msecs:Date.now(),h=void 0!==r.nsecs?r.nsecs:d+1,y=p-l+(h-d)/1e4;if(y<0&&void 0===r.clockseq&&(s=s+1&16383),(y<0||p>l)&&void 0===r.nsecs&&(h=0),h>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");l=p,d=h,u=s;var g=(1e4*(268435455&(p+=122192928e5))+h)%4294967296;a[o++]=g>>>24&255,a[o++]=g>>>16&255,a[o++]=g>>>8&255,a[o++]=255&g;var m=p/4294967296*1e4&268435455;a[o++]=m>>>8&255,a[o++]=255&m,a[o++]=m>>>24&15|16,a[o++]=m>>>16&255,a[o++]=s>>>8|128,a[o++]=255&s;for(var w=0;w<6;++w)a[o+w]=f[w];return e||c(a)},r.v3=U,r.v4=function(r,e,n){var o=(r=r||{}).random||(r.rng||t)();if(o[6]=15&o[6]|64,o[8]=63&o[8]|128,e){n=n||0;for(var a=0;a<16;++a)e[n+a]=o[a];return e}return c(o)},r.v5=R,r.validate=a,r.version=function(r){if(!a(r))throw TypeError("Invalid UUID");return parseInt(r.substr(14,1),16)},Object.defineProperty(r,"__esModule",{value:!0})}));!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidNIL=n()}(this,(function(){"use strict";return"00000000-0000-0000-0000-000000000000"}));!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidParse=n()}(this,(function(){"use strict";var e=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;return function(n){if(!function(n){return"string"==typeof n&&e.test(n)}(n))throw TypeError("Invalid UUID");var t,i=new Uint8Array(16);return i[0]=(t=parseInt(n.slice(0,8),16))>>>24,i[1]=t>>>16&255,i[2]=t>>>8&255,i[3]=255&t,i[4]=(t=parseInt(n.slice(9,13),16))>>>8,i[5]=255&t,i[6]=(t=parseInt(n.slice(14,18),16))>>>8,i[7]=255&t,i[8]=(t=parseInt(n.slice(19,23),16))>>>8,i[9]=255&t,i[10]=(t=parseInt(n.slice(24,36),16))/1099511627776&255,i[11]=t/4294967296&255,i[12]=t>>>24&255,i[13]=t>>>16&255,i[14]=t>>>8&255,i[15]=255&t,i}}));!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidStringify=t()}(this,(function(){"use strict";var e=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function t(t){return"string"==typeof t&&e.test(t)}for(var i=[],n=0;n<256;++n)i.push((n+256).toString(16).substr(1));return function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,f=(i[e[n+0]]+i[e[n+1]]+i[e[n+2]]+i[e[n+3]]+"-"+i[e[n+4]]+i[e[n+5]]+"-"+i[e[n+6]]+i[e[n+7]]+"-"+i[e[n+8]]+i[e[n+9]]+"-"+i[e[n+10]]+i[e[n+11]]+i[e[n+12]]+i[e[n+13]]+i[e[n+14]]+i[e[n+15]]).toLowerCase();if(!t(f))throw TypeError("Stringified UUID is invalid");return f}}));!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidValidate=t()}(this,(function(){"use strict";var e=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;return function(t){return"string"==typeof t&&e.test(t)}}));!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidVersion=t()}(this,(function(){"use strict";var e=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;return function(t){if(!function(t){return"string"==typeof t&&e.test(t)}(t))throw TypeError("Invalid UUID");return parseInt(t.substr(14,1),16)}}));!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?module.exports=o():"function"==typeof define&&define.amd?define(o):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidv1=o()}(this,(function(){"use strict";var e,o=new Uint8Array(16);function t(){if(!e&&!(e="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return e(o)}var n=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function r(e){return"string"==typeof e&&n.test(e)}for(var i,u,s=[],a=0;a<256;++a)s.push((a+256).toString(16).substr(1));var d=0,f=0;return function(e,o,n){var a=o&&n||0,c=o||new Array(16),l=(e=e||{}).node||i,p=void 0!==e.clockseq?e.clockseq:u;if(null==l||null==p){var v=e.random||(e.rng||t)();null==l&&(l=i=[1|v[0],v[1],v[2],v[3],v[4],v[5]]),null==p&&(p=u=16383&(v[6]<<8|v[7]))}var y=void 0!==e.msecs?e.msecs:Date.now(),m=void 0!==e.nsecs?e.nsecs:f+1,g=y-d+(m-f)/1e4;if(g<0&&void 0===e.clockseq&&(p=p+1&16383),(g<0||y>d)&&void 0===e.nsecs&&(m=0),m>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");d=y,f=m,u=p;var h=(1e4*(268435455&(y+=122192928e5))+m)%4294967296;c[a++]=h>>>24&255,c[a++]=h>>>16&255,c[a++]=h>>>8&255,c[a++]=255&h;var w=y/4294967296*1e4&268435455;c[a++]=w>>>8&255,c[a++]=255&w,c[a++]=w>>>24&15|16,c[a++]=w>>>16&255,c[a++]=p>>>8|128,c[a++]=255&p;for(var b=0;b<6;++b)c[a+b]=l[b];return o||function(e){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,t=(s[e[o+0]]+s[e[o+1]]+s[e[o+2]]+s[e[o+3]]+"-"+s[e[o+4]]+s[e[o+5]]+"-"+s[e[o+6]]+s[e[o+7]]+"-"+s[e[o+8]]+s[e[o+9]]+"-"+s[e[o+10]]+s[e[o+11]]+s[e[o+12]]+s[e[o+13]]+s[e[o+14]]+s[e[o+15]]).toLowerCase();if(!r(t))throw TypeError("Stringified UUID is invalid");return t}(c)}}));!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define(r):(n="undefined"!=typeof globalThis?globalThis:n||self).uuidv3=r()}(this,(function(){"use strict";var n=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function r(r){return"string"==typeof r&&n.test(r)}for(var e=[],t=0;t<256;++t)e.push((t+256).toString(16).substr(1));function i(n){return 14+(n+64>>>9<<4)+1}function o(n,r){var e=(65535&n)+(65535&r);return(n>>16)+(r>>16)+(e>>16)<<16|65535&e}function a(n,r,e,t,i,a){return o((f=o(o(r,n),o(t,a)))<<(u=i)|f>>>32-u,e);var f,u}function f(n,r,e,t,i,o,f){return a(r&e|~r&t,n,r,i,o,f)}function u(n,r,e,t,i,o,f){return a(r&t|e&~t,n,r,i,o,f)}function c(n,r,e,t,i,o,f){return a(r^e^t,n,r,i,o,f)}function s(n,r,e,t,i,o,f){return a(e^(r|~t),n,r,i,o,f)}return function(n,t,i){function o(n,o,a,f){if("string"==typeof n&&(n=function(n){n=unescape(encodeURIComponent(n));for(var r=[],e=0;e<n.length;++e)r.push(n.charCodeAt(e));return r}(n)),"string"==typeof o&&(o=function(n){if(!r(n))throw TypeError("Invalid UUID");var e,t=new Uint8Array(16);return t[0]=(e=parseInt(n.slice(0,8),16))>>>24,t[1]=e>>>16&255,t[2]=e>>>8&255,t[3]=255&e,t[4]=(e=parseInt(n.slice(9,13),16))>>>8,t[5]=255&e,t[6]=(e=parseInt(n.slice(14,18),16))>>>8,t[7]=255&e,t[8]=(e=parseInt(n.slice(19,23),16))>>>8,t[9]=255&e,t[10]=(e=parseInt(n.slice(24,36),16))/1099511627776&255,t[11]=e/4294967296&255,t[12]=e>>>24&255,t[13]=e>>>16&255,t[14]=e>>>8&255,t[15]=255&e,t}(o)),16!==o.length)throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");var u=new Uint8Array(16+n.length);if(u.set(o),u.set(n,o.length),(u=i(u))[6]=15&u[6]|t,u[8]=63&u[8]|128,a){f=f||0;for(var c=0;c<16;++c)a[f+c]=u[c];return a}return function(n){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=(e[n[t+0]]+e[n[t+1]]+e[n[t+2]]+e[n[t+3]]+"-"+e[n[t+4]]+e[n[t+5]]+"-"+e[n[t+6]]+e[n[t+7]]+"-"+e[n[t+8]]+e[n[t+9]]+"-"+e[n[t+10]]+e[n[t+11]]+e[n[t+12]]+e[n[t+13]]+e[n[t+14]]+e[n[t+15]]).toLowerCase();if(!r(i))throw TypeError("Stringified UUID is invalid");return i}(u)}try{o.name=n}catch(n){}return o.DNS="6ba7b810-9dad-11d1-80b4-00c04fd430c8",o.URL="6ba7b811-9dad-11d1-80b4-00c04fd430c8",o}("v3",48,(function(n){if("string"==typeof n){var r=unescape(encodeURIComponent(n));n=new Uint8Array(r.length);for(var e=0;e<r.length;++e)n[e]=r.charCodeAt(e)}return function(n){for(var r=[],e=32*n.length,t="0123456789abcdef",i=0;i<e;i+=8){var o=n[i>>5]>>>i%32&255,a=parseInt(t.charAt(o>>>4&15)+t.charAt(15&o),16);r.push(a)}return r}(function(n,r){n[r>>5]|=128<<r%32,n[i(r)-1]=r;for(var e=1732584193,t=-271733879,a=-1732584194,l=271733878,d=0;d<n.length;d+=16){var p=e,h=t,v=a,g=l;e=f(e,t,a,l,n[d],7,-680876936),l=f(l,e,t,a,n[d+1],12,-389564586),a=f(a,l,e,t,n[d+2],17,606105819),t=f(t,a,l,e,n[d+3],22,-1044525330),e=f(e,t,a,l,n[d+4],7,-176418897),l=f(l,e,t,a,n[d+5],12,1200080426),a=f(a,l,e,t,n[d+6],17,-1473231341),t=f(t,a,l,e,n[d+7],22,-45705983),e=f(e,t,a,l,n[d+8],7,1770035416),l=f(l,e,t,a,n[d+9],12,-1958414417),a=f(a,l,e,t,n[d+10],17,-42063),t=f(t,a,l,e,n[d+11],22,-1990404162),e=f(e,t,a,l,n[d+12],7,1804603682),l=f(l,e,t,a,n[d+13],12,-40341101),a=f(a,l,e,t,n[d+14],17,-1502002290),e=u(e,t=f(t,a,l,e,n[d+15],22,1236535329),a,l,n[d+1],5,-165796510),l=u(l,e,t,a,n[d+6],9,-1069501632),a=u(a,l,e,t,n[d+11],14,643717713),t=u(t,a,l,e,n[d],20,-373897302),e=u(e,t,a,l,n[d+5],5,-701558691),l=u(l,e,t,a,n[d+10],9,38016083),a=u(a,l,e,t,n[d+15],14,-660478335),t=u(t,a,l,e,n[d+4],20,-405537848),e=u(e,t,a,l,n[d+9],5,568446438),l=u(l,e,t,a,n[d+14],9,-1019803690),a=u(a,l,e,t,n[d+3],14,-187363961),t=u(t,a,l,e,n[d+8],20,1163531501),e=u(e,t,a,l,n[d+13],5,-1444681467),l=u(l,e,t,a,n[d+2],9,-51403784),a=u(a,l,e,t,n[d+7],14,1735328473),e=c(e,t=u(t,a,l,e,n[d+12],20,-1926607734),a,l,n[d+5],4,-378558),l=c(l,e,t,a,n[d+8],11,-2022574463),a=c(a,l,e,t,n[d+11],16,1839030562),t=c(t,a,l,e,n[d+14],23,-35309556),e=c(e,t,a,l,n[d+1],4,-1530992060),l=c(l,e,t,a,n[d+4],11,1272893353),a=c(a,l,e,t,n[d+7],16,-155497632),t=c(t,a,l,e,n[d+10],23,-1094730640),e=c(e,t,a,l,n[d+13],4,681279174),l=c(l,e,t,a,n[d],11,-358537222),a=c(a,l,e,t,n[d+3],16,-722521979),t=c(t,a,l,e,n[d+6],23,76029189),e=c(e,t,a,l,n[d+9],4,-640364487),l=c(l,e,t,a,n[d+12],11,-421815835),a=c(a,l,e,t,n[d+15],16,530742520),e=s(e,t=c(t,a,l,e,n[d+2],23,-995338651),a,l,n[d],6,-198630844),l=s(l,e,t,a,n[d+7],10,1126891415),a=s(a,l,e,t,n[d+14],15,-1416354905),t=s(t,a,l,e,n[d+5],21,-57434055),e=s(e,t,a,l,n[d+12],6,1700485571),l=s(l,e,t,a,n[d+3],10,-1894986606),a=s(a,l,e,t,n[d+10],15,-1051523),t=s(t,a,l,e,n[d+1],21,-2054922799),e=s(e,t,a,l,n[d+8],6,1873313359),l=s(l,e,t,a,n[d+15],10,-30611744),a=s(a,l,e,t,n[d+6],15,-1560198380),t=s(t,a,l,e,n[d+13],21,1309151649),e=s(e,t,a,l,n[d+4],6,-145523070),l=s(l,e,t,a,n[d+11],10,-1120210379),a=s(a,l,e,t,n[d+2],15,718787259),t=s(t,a,l,e,n[d+9],21,-343485551),e=o(e,p),t=o(t,h),a=o(a,v),l=o(l,g)}return[e,t,a,l]}(function(n){if(0===n.length)return[];for(var r=8*n.length,e=new Uint32Array(i(r)),t=0;t<r;t+=8)e[t>>5]|=(255&n[t/8])<<t%32;return e}(n),8*n.length))}))}));!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).uuidv4=e()}(this,(function(){"use strict";var t,e=new Uint8Array(16);function o(){if(!t&&!(t="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return t(e)}var n=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function r(t){return"string"==typeof t&&n.test(t)}for(var i=[],u=0;u<256;++u)i.push((u+256).toString(16).substr(1));return function(t,e,n){var u=(t=t||{}).random||(t.rng||o)();if(u[6]=15&u[6]|64,u[8]=63&u[8]|128,e){n=n||0;for(var f=0;f<16;++f)e[n+f]=u[f];return e}return function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,o=(i[t[e+0]]+i[t[e+1]]+i[t[e+2]]+i[t[e+3]]+"-"+i[t[e+4]]+i[t[e+5]]+"-"+i[t[e+6]]+i[t[e+7]]+"-"+i[t[e+8]]+i[t[e+9]]+"-"+i[t[e+10]]+i[t[e+11]]+i[t[e+12]]+i[t[e+13]]+i[t[e+14]]+i[t[e+15]]).toLowerCase();if(!r(o))throw TypeError("Stringified UUID is invalid");return o}(u)}}));!function(r,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(r="undefined"!=typeof globalThis?globalThis:r||self).uuidv5=e()}(this,(function(){"use strict";var r=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function e(e){return"string"==typeof e&&r.test(e)}for(var t=[],n=0;n<256;++n)t.push((n+256).toString(16).substr(1));function a(r,e,t,n){switch(r){case 0:return e&t^~e&n;case 1:return e^t^n;case 2:return e&t^e&n^t&n;case 3:return e^t^n}}function o(r,e){return r<<e|r>>>32-e}return function(r,n,a){function o(r,o,i,f){if("string"==typeof r&&(r=function(r){r=unescape(encodeURIComponent(r));for(var e=[],t=0;t<r.length;++t)e.push(r.charCodeAt(t));return e}(r)),"string"==typeof o&&(o=function(r){if(!e(r))throw TypeError("Invalid UUID");var t,n=new Uint8Array(16);return n[0]=(t=parseInt(r.slice(0,8),16))>>>24,n[1]=t>>>16&255,n[2]=t>>>8&255,n[3]=255&t,n[4]=(t=parseInt(r.slice(9,13),16))>>>8,n[5]=255&t,n[6]=(t=parseInt(r.slice(14,18),16))>>>8,n[7]=255&t,n[8]=(t=parseInt(r.slice(19,23),16))>>>8,n[9]=255&t,n[10]=(t=parseInt(r.slice(24,36),16))/1099511627776&255,n[11]=t/4294967296&255,n[12]=t>>>24&255,n[13]=t>>>16&255,n[14]=t>>>8&255,n[15]=255&t,n}(o)),16!==o.length)throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");var s=new Uint8Array(16+r.length);if(s.set(o),s.set(r,o.length),(s=a(s))[6]=15&s[6]|n,s[8]=63&s[8]|128,i){f=f||0;for(var u=0;u<16;++u)i[f+u]=s[u];return i}return function(r){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=(t[r[n+0]]+t[r[n+1]]+t[r[n+2]]+t[r[n+3]]+"-"+t[r[n+4]]+t[r[n+5]]+"-"+t[r[n+6]]+t[r[n+7]]+"-"+t[r[n+8]]+t[r[n+9]]+"-"+t[r[n+10]]+t[r[n+11]]+t[r[n+12]]+t[r[n+13]]+t[r[n+14]]+t[r[n+15]]).toLowerCase();if(!e(a))throw TypeError("Stringified UUID is invalid");return a}(s)}try{o.name=r}catch(r){}return o.DNS="6ba7b810-9dad-11d1-80b4-00c04fd430c8",o.URL="6ba7b811-9dad-11d1-80b4-00c04fd430c8",o}("v5",80,(function(r){var e=[1518500249,1859775393,2400959708,3395469782],t=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof r){var n=unescape(encodeURIComponent(r));r=[];for(var i=0;i<n.length;++i)r.push(n.charCodeAt(i))}else Array.isArray(r)||(r=Array.prototype.slice.call(r));r.push(128);for(var f=r.length/4+2,s=Math.ceil(f/16),u=new Array(s),c=0;c<s;++c){for(var l=new Uint32Array(16),p=0;p<16;++p)l[p]=r[64*c+4*p]<<24|r[64*c+4*p+1]<<16|r[64*c+4*p+2]<<8|r[64*c+4*p+3];u[c]=l}u[s-1][14]=8*(r.length-1)/Math.pow(2,32),u[s-1][14]=Math.floor(u[s-1][14]),u[s-1][15]=8*(r.length-1)&4294967295;for(var d=0;d<s;++d){for(var h=new Uint32Array(80),v=0;v<16;++v)h[v]=u[d][v];for(var y=16;y<80;++y)h[y]=o(h[y-3]^h[y-8]^h[y-14]^h[y-16],1);for(var g=t[0],b=t[1],w=t[2],U=t[3],A=t[4],I=0;I<80;++I){var m=Math.floor(I/20),C=o(g,5)+a(m,b,w,U)+A+e[m]+h[I]>>>0;A=U,U=w,w=o(b,30)>>>0,b=g,g=C}t[0]=t[0]+g>>>0,t[1]=t[1]+b>>>0,t[2]=t[2]+w>>>0,t[3]=t[3]+U>>>0,t[4]=t[4]+A>>>0}return[t[0]>>24&255,t[0]>>16&255,t[0]>>8&255,255&t[0],t[1]>>24&255,t[1]>>16&255,t[1]>>8&255,255&t[1],t[2]>>24&255,t[2]>>16&255,t[2]>>8&255,255&t[2],t[3]>>24&255,t[3]>>16&255,t[3]>>8&255,255&t[3],t[4]>>24&255,t[4]>>16&255,t[4]>>8&255,255&t[4]]}))}));export { default as v1 } from './v1.js';
export { default as v3 } from './v3.js';
export { default as v4 } from './v4.js';
export { default as v5 } from './v5.js';
export { default as NIL } from './nil.js';
export { default as version } from './version.js';
export { default as validate } from './validate.js';
export { default as stringify } from './stringify.js';
export { default as parse } from './parse.js';import crypto from 'crypto';

function md5(bytes) {
  if (Array.isArray(bytes)) {
    bytes = Buffer.from(bytes);
  } else if (typeof bytes === 'string') {
    bytes = Buffer.from(bytes, 'utf8');
  }

  return crypto.createHash('md5').update(bytes).digest();
}

export default md5;export default '00000000-0000-0000-0000-000000000000';import validate from './validate.js';

function parse(uuid) {
  if (!validate(uuid)) {
    throw TypeError('Invalid UUID');
  }

  let v;
  const arr = new Uint8Array(16); // Parse ########-....-....-....-............

  arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;
  arr[1] = v >>> 16 & 0xff;
  arr[2] = v >>> 8 & 0xff;
  arr[3] = v & 0xff; // Parse ........-####-....-....-............

  arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;
  arr[5] = v & 0xff; // Parse ........-....-####-....-............

  arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;
  arr[7] = v & 0xff; // Parse ........-....-....-####-............

  arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;
  arr[9] = v & 0xff; // Parse ........-....-....-....-############
  // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes)

  arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;
  arr[11] = v / 0x100000000 & 0xff;
  arr[12] = v >>> 24 & 0xff;
  arr[13] = v >>> 16 & 0xff;
  arr[14] = v >>> 8 & 0xff;
  arr[15] = v & 0xff;
  return arr;
}

export default parse;export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;import crypto from 'crypto';
const rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate

let poolPtr = rnds8Pool.length;
export default function rng() {
  if (poolPtr > rnds8Pool.length - 16) {
    crypto.randomFillSync(rnds8Pool);
    poolPtr = 0;
  }

  return rnds8Pool.slice(poolPtr, poolPtr += 16);
}import crypto from 'crypto';

function sha1(bytes) {
  if (Array.isArray(bytes)) {
    bytes = Buffer.from(bytes);
  } else if (typeof bytes === 'string') {
    bytes = Buffer.from(bytes, 'utf8');
  }

  return crypto.createHash('sha1').update(bytes).digest();
}

export default sha1;import validate from './validate.js';
/**
 * Convert array of 16 byte values to UUID string format of the form:
 * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
 */

const byteToHex = [];

for (let i = 0; i < 256; ++i) {
  byteToHex.push((i + 0x100).toString(16).substr(1));
}

function stringify(arr, offset = 0) {
  // Note: Be careful editing this code!  It's been tuned for performance
  // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
  const uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID.  If this throws, it's likely due to one
  // of the following:
  // - One or more input array values don't map to a hex octet (leading to
  // "undefined" in the uuid)
  // - Invalid input values for the RFC `version` or `variant` fields

  if (!validate(uuid)) {
    throw TypeError('Stringified UUID is invalid');
  }

  return uuid;
}

export default stringify;import rng from './rng.js';
import stringify from './stringify.js'; // **`v1()` - Generate time-based UUID**
//
// Inspired by https://github.com/LiosK/UUID.js
// and http://docs.python.org/library/uuid.html

let _nodeId;

let _clockseq; // Previous uuid creation time


let _lastMSecs = 0;
let _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details

function v1(options, buf, offset) {
  let i = buf && offset || 0;
  const b = buf || new Array(16);
  options = options || {};
  let node = options.node || _nodeId;
  let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not
  // specified.  We do this lazily to minimize issues related to insufficient
  // system entropy.  See #189

  if (node == null || clockseq == null) {
    const seedBytes = options.random || (options.rng || rng)();

    if (node == null) {
      // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
      node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];
    }

    if (clockseq == null) {
      // Per 4.2.2, randomize (14 bit) clockseq
      clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
    }
  } // UUID timestamps are 100 nano-second units since the Gregorian epoch,
  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so
  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.


  let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock
  // cycle to simulate higher resolution clock

  let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)

  const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression

  if (dt < 0 && options.clockseq === undefined) {
    clockseq = clockseq + 1 & 0x3fff;
  } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
  // time interval


  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
    nsecs = 0;
  } // Per 4.2.1.2 Throw error if too many uuids are requested


  if (nsecs >= 10000) {
    throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
  }

  _lastMSecs = msecs;
  _lastNSecs = nsecs;
  _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch

  msecs += 12219292800000; // `time_low`

  const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
  b[i++] = tl >>> 24 & 0xff;
  b[i++] = tl >>> 16 & 0xff;
  b[i++] = tl >>> 8 & 0xff;
  b[i++] = tl & 0xff; // `time_mid`

  const tmh = msecs / 0x100000000 * 10000 & 0xfffffff;
  b[i++] = tmh >>> 8 & 0xff;
  b[i++] = tmh & 0xff; // `time_high_and_version`

  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version

  b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)

  b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`

  b[i++] = clockseq & 0xff; // `node`

  for (let n = 0; n < 6; ++n) {
    b[i + n] = node[n];
  }

  return buf || stringify(b);
}

export default v1;import v35 from './v35.js';
import md5 from './md5.js';
const v3 = v35('v3', 0x30, md5);
export default v3;import stringify from './stringify.js';
import parse from './parse.js';

function stringToBytes(str) {
  str = unescape(encodeURIComponent(str)); // UTF8 escape

  const bytes = [];

  for (let i = 0; i < str.length; ++i) {
    bytes.push(str.charCodeAt(i));
  }

  return bytes;
}

export const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
export const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
export default function (name, version, hashfunc) {
  function generateUUID(value, namespace, buf, offset) {
    if (typeof value === 'string') {
      value = stringToBytes(value);
    }

    if (typeof namespace === 'string') {
      namespace = parse(namespace);
    }

    if (namespace.length !== 16) {
      throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');
    } // Compute hash of namespace and value, Per 4.3
    // Future: Use spread syntax when supported on all platforms, e.g. `bytes =
    // hashfunc([...namespace, ... value])`


    let bytes = new Uint8Array(16 + value.length);
    bytes.set(namespace);
    bytes.set(value, namespace.length);
    bytes = hashfunc(bytes);
    bytes[6] = bytes[6] & 0x0f | version;
    bytes[8] = bytes[8] & 0x3f | 0x80;

    if (buf) {
      offset = offset || 0;

      for (let i = 0; i < 16; ++i) {
        buf[offset + i] = bytes[i];
      }

      return buf;
    }

    return stringify(bytes);
  } // Function#name is not settable on some platforms (#270)


  try {
    generateUUID.name = name; // eslint-disable-next-line no-empty
  } catch (err) {} // For CommonJS default export support


  generateUUID.DNS = DNS;
  generateUUID.URL = URL;
  return generateUUID;
}import rng from './rng.js';
import stringify from './stringify.js';

function v4(options, buf, offset) {
  options = options || {};
  const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`

  rnds[6] = rnds[6] & 0x0f | 0x40;
  rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided

  if (buf) {
    offset = offset || 0;

    for (let i = 0; i < 16; ++i) {
      buf[offset + i] = rnds[i];
    }

    return buf;
  }

  return stringify(rnds);
}

export default v4;import v35 from './v35.js';
import sha1 from './sha1.js';
const v5 = v35('v5', 0x50, sha1);
export default v5;import REGEX from './regex.js';

function validate(uuid) {
  return typeof uuid === 'string' && REGEX.test(uuid);
}

export default validate;import validate from './validate.js';

function version(uuid) {
  if (!validate(uuid)) {
    throw TypeError('Invalid UUID');
  }

  return parseInt(uuid.substr(14, 1), 16);
}

export default version;export { default as v1 } from './v1.js';
export { default as v3 } from './v3.js';
export { default as v4 } from './v4.js';
export { default as v5 } from './v5.js';
export { default as NIL } from './nil.js';
export { default as version } from './version.js';
export { default as validate } from './validate.js';
export { default as stringify } from './stringify.js';
export { default as parse } from './parse.js';/*
 * Browser-compatible JavaScript MD5
 *
 * Modification of JavaScript MD5
 * https://github.com/blueimp/JavaScript-MD5
 *
 * Copyright 2011, Sebastian Tschan
 * https://blueimp.net
 *
 * Licensed under the MIT license:
 * https://opensource.org/licenses/MIT
 *
 * Based on
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 */
function md5(bytes) {
  if (typeof bytes === 'string') {
    var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape

    bytes = new Uint8Array(msg.length);

    for (var i = 0; i < msg.length; ++i) {
      bytes[i] = msg.charCodeAt(i);
    }
  }

  return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));
}
/*
 * Convert an array of little-endian words to an array of bytes
 */


function md5ToHexEncodedArray(input) {
  var output = [];
  var length32 = input.length * 32;
  var hexTab = '0123456789abcdef';

  for (var i = 0; i < length32; i += 8) {
    var x = input[i >> 5] >>> i % 32 & 0xff;
    var hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);
    output.push(hex);
  }

  return output;
}
/**
 * Calculate output length with padding and bit length
 */


function getOutputLength(inputLength8) {
  return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;
}
/*
 * Calculate the MD5 of an array of little-endian words, and a bit length.
 */


function wordsToMd5(x, len) {
  /* append padding */
  x[len >> 5] |= 0x80 << len % 32;
  x[getOutputLength(len) - 1] = len;
  var a = 1732584193;
  var b = -271733879;
  var c = -1732584194;
  var d = 271733878;

  for (var i = 0; i < x.length; i += 16) {
    var olda = a;
    var oldb = b;
    var oldc = c;
    var oldd = d;
    a = md5ff(a, b, c, d, x[i], 7, -680876936);
    d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);
    c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);
    b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
    a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);
    d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
    c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
    b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);
    a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
    d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
    c = md5ff(c, d, a, b, x[i + 10], 17, -42063);
    b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
    a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
    d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);
    c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
    b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
    a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);
    d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
    c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);
    b = md5gg(b, c, d, a, x[i], 20, -373897302);
    a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);
    d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);
    c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);
    b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);
    a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);
    d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
    c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);
    b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
    a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
    d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);
    c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
    b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
    a = md5hh(a, b, c, d, x[i + 5], 4, -378558);
    d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
    c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
    b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);
    a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
    d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
    c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);
    b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
    a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);
    d = md5hh(d, a, b, c, x[i], 11, -358537222);
    c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);
    b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);
    a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);
    d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);
    c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);
    b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);
    a = md5ii(a, b, c, d, x[i], 6, -198630844);
    d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
    c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
    b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);
    a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
    d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
    c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);
    b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
    a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
    d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);
    c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
    b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
    a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);
    d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
    c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);
    b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);
    a = safeAdd(a, olda);
    b = safeAdd(b, oldb);
    c = safeAdd(c, oldc);
    d = safeAdd(d, oldd);
  }

  return [a, b, c, d];
}
/*
 * Convert an array bytes to an array of little-endian words
 * Characters >255 have their high-byte silently ignored.
 */


function bytesToWords(input) {
  if (input.length === 0) {
    return [];
  }

  var length8 = input.length * 8;
  var output = new Uint32Array(getOutputLength(length8));

  for (var i = 0; i < length8; i += 8) {
    output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;
  }

  return output;
}
/*
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
 * to work around bugs in some JS interpreters.
 */


function safeAdd(x, y) {
  var lsw = (x & 0xffff) + (y & 0xffff);
  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return msw << 16 | lsw & 0xffff;
}
/*
 * Bitwise rotate a 32-bit number to the left.
 */


function bitRotateLeft(num, cnt) {
  return num << cnt | num >>> 32 - cnt;
}
/*
 * These functions implement the four basic operations the algorithm uses.
 */


function md5cmn(q, a, b, x, s, t) {
  return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);
}

function md5ff(a, b, c, d, x, s, t) {
  return md5cmn(b & c | ~b & d, a, b, x, s, t);
}

function md5gg(a, b, c, d, x, s, t) {
  return md5cmn(b & d | c & ~d, a, b, x, s, t);
}

function md5hh(a, b, c, d, x, s, t) {
  return md5cmn(b ^ c ^ d, a, b, x, s, t);
}

function md5ii(a, b, c, d, x, s, t) {
  return md5cmn(c ^ (b | ~d), a, b, x, s, t);
}

export default md5;export default '00000000-0000-0000-0000-000000000000';import validate from './validate.js';

function parse(uuid) {
  if (!validate(uuid)) {
    throw TypeError('Invalid UUID');
  }

  var v;
  var arr = new Uint8Array(16); // Parse ########-....-....-....-............

  arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;
  arr[1] = v >>> 16 & 0xff;
  arr[2] = v >>> 8 & 0xff;
  arr[3] = v & 0xff; // Parse ........-####-....-....-............

  arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;
  arr[5] = v & 0xff; // Parse ........-....-####-....-............

  arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;
  arr[7] = v & 0xff; // Parse ........-....-....-####-............

  arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;
  arr[9] = v & 0xff; // Parse ........-....-....-....-############
  // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes)

  arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;
  arr[11] = v / 0x100000000 & 0xff;
  arr[12] = v >>> 24 & 0xff;
  arr[13] = v >>> 16 & 0xff;
  arr[14] = v >>> 8 & 0xff;
  arr[15] = v & 0xff;
  return arr;
}

export default parse;export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;// Unique ID creation requires a high quality random # generator. In the browser we therefore
// require the crypto API and do not support built-in fallback to lower quality random number
// generators (like Math.random()).
var getRandomValues;
var rnds8 = new Uint8Array(16);
export default function rng() {
  // lazy load so that environments that need to polyfill have a chance to do so
  if (!getRandomValues) {
    // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. Also,
    // find the complete implementation of crypto (msCrypto) on IE11.
    getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);

    if (!getRandomValues) {
      throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');
    }
  }

  return getRandomValues(rnds8);
}// Adapted from Chris Veness' SHA1 code at
// http://www.movable-type.co.uk/scripts/sha1.html
function f(s, x, y, z) {
  switch (s) {
    case 0:
      return x & y ^ ~x & z;

    case 1:
      return x ^ y ^ z;

    case 2:
      return x & y ^ x & z ^ y & z;

    case 3:
      return x ^ y ^ z;
  }
}

function ROTL(x, n) {
  return x << n | x >>> 32 - n;
}

function sha1(bytes) {
  var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];
  var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];

  if (typeof bytes === 'string') {
    var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape

    bytes = [];

    for (var i = 0; i < msg.length; ++i) {
      bytes.push(msg.charCodeAt(i));
    }
  } else if (!Array.isArray(bytes)) {
    // Convert Array-like to Array
    bytes = Array.prototype.slice.call(bytes);
  }

  bytes.push(0x80);
  var l = bytes.length / 4 + 2;
  var N = Math.ceil(l / 16);
  var M = new Array(N);

  for (var _i = 0; _i < N; ++_i) {
    var arr = new Uint32Array(16);

    for (var j = 0; j < 16; ++j) {
      arr[j] = bytes[_i * 64 + j * 4] << 24 | bytes[_i * 64 + j * 4 + 1] << 16 | bytes[_i * 64 + j * 4 + 2] << 8 | bytes[_i * 64 + j * 4 + 3];
    }

    M[_i] = arr;
  }

  M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);
  M[N - 1][14] = Math.floor(M[N - 1][14]);
  M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;

  for (var _i2 = 0; _i2 < N; ++_i2) {
    var W = new Uint32Array(80);

    for (var t = 0; t < 16; ++t) {
      W[t] = M[_i2][t];
    }

    for (var _t = 16; _t < 80; ++_t) {
      W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1);
    }

    var a = H[0];
    var b = H[1];
    var c = H[2];
    var d = H[3];
    var e = H[4];

    for (var _t2 = 0; _t2 < 80; ++_t2) {
      var s = Math.floor(_t2 / 20);
      var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 0;
      e = d;
      d = c;
      c = ROTL(b, 30) >>> 0;
      b = a;
      a = T;
    }

    H[0] = H[0] + a >>> 0;
    H[1] = H[1] + b >>> 0;
    H[2] = H[2] + c >>> 0;
    H[3] = H[3] + d >>> 0;
    H[4] = H[4] + e >>> 0;
  }

  return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];
}

export default sha1;import validate from './validate.js';
/**
 * Convert array of 16 byte values to UUID string format of the form:
 * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
 */

var byteToHex = [];

for (var i = 0; i < 256; ++i) {
  byteToHex.push((i + 0x100).toString(16).substr(1));
}

function stringify(arr) {
  var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  // Note: Be careful editing this code!  It's been tuned for performance
  // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
  var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID.  If this throws, it's likely due to one
  // of the following:
  // - One or more input array values don't map to a hex octet (leading to
  // "undefined" in the uuid)
  // - Invalid input values for the RFC `version` or `variant` fields

  if (!validate(uuid)) {
    throw TypeError('Stringified UUID is invalid');
  }

  return uuid;
}

export default stringify;import rng from './rng.js';
import stringify from './stringify.js'; // **`v1()` - Generate time-based UUID**
//
// Inspired by https://github.com/LiosK/UUID.js
// and http://docs.python.org/library/uuid.html

var _nodeId;

var _clockseq; // Previous uuid creation time


var _lastMSecs = 0;
var _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details

function v1(options, buf, offset) {
  var i = buf && offset || 0;
  var b = buf || new Array(16);
  options = options || {};
  var node = options.node || _nodeId;
  var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not
  // specified.  We do this lazily to minimize issues related to insufficient
  // system entropy.  See #189

  if (node == null || clockseq == null) {
    var seedBytes = options.random || (options.rng || rng)();

    if (node == null) {
      // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
      node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];
    }

    if (clockseq == null) {
      // Per 4.2.2, randomize (14 bit) clockseq
      clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
    }
  } // UUID timestamps are 100 nano-second units since the Gregorian epoch,
  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so
  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.


  var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock
  // cycle to simulate higher resolution clock

  var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)

  var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression

  if (dt < 0 && options.clockseq === undefined) {
    clockseq = clockseq + 1 & 0x3fff;
  } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
  // time interval


  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
    nsecs = 0;
  } // Per 4.2.1.2 Throw error if too many uuids are requested


  if (nsecs >= 10000) {
    throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
  }

  _lastMSecs = msecs;
  _lastNSecs = nsecs;
  _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch

  msecs += 12219292800000; // `time_low`

  var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
  b[i++] = tl >>> 24 & 0xff;
  b[i++] = tl >>> 16 & 0xff;
  b[i++] = tl >>> 8 & 0xff;
  b[i++] = tl & 0xff; // `time_mid`

  var tmh = msecs / 0x100000000 * 10000 & 0xfffffff;
  b[i++] = tmh >>> 8 & 0xff;
  b[i++] = tmh & 0xff; // `time_high_and_version`

  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version

  b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)

  b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`

  b[i++] = clockseq & 0xff; // `node`

  for (var n = 0; n < 6; ++n) {
    b[i + n] = node[n];
  }

  return buf || stringify(b);
}

export default v1;import v35 from './v35.js';
import md5 from './md5.js';
var v3 = v35('v3', 0x30, md5);
export default v3;import stringify from './stringify.js';
import parse from './parse.js';

function stringToBytes(str) {
  str = unescape(encodeURIComponent(str)); // UTF8 escape

  var bytes = [];

  for (var i = 0; i < str.length; ++i) {
    bytes.push(str.charCodeAt(i));
  }

  return bytes;
}

export var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
export var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
export default function (name, version, hashfunc) {
  function generateUUID(value, namespace, buf, offset) {
    if (typeof value === 'string') {
      value = stringToBytes(value);
    }

    if (typeof namespace === 'string') {
      namespace = parse(namespace);
    }

    if (namespace.length !== 16) {
      throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');
    } // Compute hash of namespace and value, Per 4.3
    // Future: Use spread syntax when supported on all platforms, e.g. `bytes =
    // hashfunc([...namespace, ... value])`


    var bytes = new Uint8Array(16 + value.length);
    bytes.set(namespace);
    bytes.set(value, namespace.length);
    bytes = hashfunc(bytes);
    bytes[6] = bytes[6] & 0x0f | version;
    bytes[8] = bytes[8] & 0x3f | 0x80;

    if (buf) {
      offset = offset || 0;

      for (var i = 0; i < 16; ++i) {
        buf[offset + i] = bytes[i];
      }

      return buf;
    }

    return stringify(bytes);
  } // Function#name is not settable on some platforms (#270)


  try {
    generateUUID.name = name; // eslint-disable-next-line no-empty
  } catch (err) {} // For CommonJS default export support


  generateUUID.DNS = DNS;
  generateUUID.URL = URL;
  return generateUUID;
}import rng from './rng.js';
import stringify from './stringify.js';

function v4(options, buf, offset) {
  options = options || {};
  var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`

  rnds[6] = rnds[6] & 0x0f | 0x40;
  rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided

  if (buf) {
    offset = offset || 0;

    for (var i = 0; i < 16; ++i) {
      buf[offset + i] = rnds[i];
    }

    return buf;
  }

  return stringify(rnds);
}

export default v4;import v35 from './v35.js';
import sha1 from './sha1.js';
var v5 = v35('v5', 0x50, sha1);
export default v5;import REGEX from './regex.js';

function validate(uuid) {
  return typeof uuid === 'string' && REGEX.test(uuid);
}

export default validate;import validate from './validate.js';

function version(uuid) {
  if (!validate(uuid)) {
    throw TypeError('Invalid UUID');
  }

  return parseInt(uuid.substr(14, 1), 16);
}

export default version;#!/usr/bin/env node
require('../uuid-bin');
The MIT License (MIT)

Copyright (c) 2020 Microsoft

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": "@azure/core-tracing",
  "version": "1.0.0-preview.13",
  "description": "Provides low-level interfaces and helper methods for tracing in Azure SDK",
  "sdk-type": "client",
  "main": "dist/index.js",
  "module": "dist-esm/src/index.js",
  "browser": {
    "./dist-esm/src/utils/global.js": "./dist-esm/src/utils/global.browser.js"
  },
  "types": "types/core-tracing.d.ts",
  "files": [
    "dist/",
    "dist-esm/src/",
    "types/core-tracing.d.ts",
    "README.md",
    "LICENSE"
  ],
  "repository": "github:Azure/azure-sdk-for-js",
  "author": "Microsoft Corporation",
  "license": "MIT",
  "engines": {
    "node": ">=12.0.0"
  },
  "homepage": "https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/core/core-tracing/README.md",
  "sideEffects": false,
  "dependencies": {
    "@opentelemetry/api": "^1.0.1",
    "tslib": "^2.2.0"
  },
  "devDependencies": {
    "@azure/core-auth": "^1.3.0",
    "@azure/dev-tool": "^1.0.0",
    "@azure/eslint-plugin-azure-sdk": "^3.0.0",
    "@microsoft/api-extractor": "7.7.11",
    "@opentelemetry/tracing": "^0.22.0",
    "@types/chai": "^4.1.6",
    "@types/mocha": "^7.0.2",
    "@types/node": "^12.0.0",
    "chai": "^4.2.0",
    "cross-env": "^7.0.2",
    "eslint": "^7.15.0",
    "inherits": "^2.0.3",
    "karma": "^6.2.0",
    "karma-chrome-launcher": "^3.0.0",
    "karma-coverage": "^2.0.0",
    "karma-edge-launcher": "^0.4.2",
    "karma-env-preprocessor": "^0.1.1",
    "karma-firefox-launcher": "^1.1.0",
    "karma-ie-launcher": "^1.0.0",
    "karma-junit-reporter": "^2.0.1",
    "karma-mocha": "^2.0.1",
    "karma-mocha-reporter": "^2.2.5",
    "karma-sourcemap-loader": "^0.3.8",
    "mocha": "^7.1.1",
    "mocha-junit-reporter": "^1.18.0",
    "prettier": "^1.16.4",
    "rimraf": "^3.0.0",
    "rollup": "^1.16.3",
    "typescript": "~4.2.0",
    "util": "^0.12.1",
    "typedoc": "0.15.2",
    "sinon": "^9.0.2",
    "@types/sinon": "^9.0.4"
  }
}// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { SpanKind, setSpan, context as otContext, getTracer } from "./interfaces";
import { trace, INVALID_SPAN_CONTEXT } from "@opentelemetry/api";
export function isTracingDisabled() {
    var _a;
    if (typeof process === "undefined") {
        // not supported in browser for now without polyfills
        return false;
    }
    const azureTracingDisabledValue = (_a = process.env.AZURE_TRACING_DISABLED) === null || _a === void 0 ? void 0 : _a.toLowerCase();
    if (azureTracingDisabledValue === "false" || azureTracingDisabledValue === "0") {
        return false;
    }
    return Boolean(azureTracingDisabledValue);
}
/**
 * Creates a function that can be used to create spans using the global tracer.
 *
 * Usage:
 *
 * ```typescript
 * // once
 * const createSpan = createSpanFunction({ packagePrefix: "Azure.Data.AppConfiguration", namespace: "Microsoft.AppConfiguration" });
 *
 * // in each operation
 * const span = createSpan("deleteConfigurationSetting", operationOptions);
 *    // code...
 * span.end();
 * ```
 *
 * @hidden
 * @param args - allows configuration of the prefix for each span as well as the az.namespace field.
 */
export function createSpanFunction(args) {
    return function (operationName, operationOptions) {
        const tracer = getTracer();
        const tracingOptions = (operationOptions === null || operationOptions === void 0 ? void 0 : operationOptions.tracingOptions) || {};
        const spanOptions = Object.assign({ kind: SpanKind.INTERNAL }, tracingOptions.spanOptions);
        const spanName = args.packagePrefix ? `${args.packagePrefix}.${operationName}` : operationName;
        let span;
        if (isTracingDisabled()) {
            span = trace.wrapSpanContext(INVALID_SPAN_CONTEXT);
        }
        else {
            span = tracer.startSpan(spanName, spanOptions, tracingOptions.tracingContext);
        }
        if (args.namespace) {
            span.setAttribute("az.namespace", args.namespace);
        }
        let newSpanOptions = tracingOptions.spanOptions || {};
        if (span.isRecording() && args.namespace) {
            newSpanOptions = Object.assign(Object.assign({}, tracingOptions.spanOptions), { attributes: Object.assign(Object.assign({}, spanOptions.attributes), { "az.namespace": args.namespace }) });
        }
        const newTracingOptions = Object.assign(Object.assign({}, tracingOptions), { spanOptions: newSpanOptions, tracingContext: setSpan(tracingOptions.tracingContext || otContext.active(), span) });
        const newOperationOptions = Object.assign(Object.assign({}, operationOptions), { tracingOptions: newTracingOptions });
        return {
            span,
            updatedOptions: newOperationOptions
        };
    };
}
//# sourceMappingURL=createSpan.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
// Tracers and wrappers
export { createSpanFunction } from "./createSpan";
// Shared interfaces
export { context, getSpan, getSpanContext, getTracer, isSpanContextValid, setSpan, setSpanContext, SpanKind, SpanStatusCode } from "./interfaces";
// Utilities
export { extractSpanContextFromTraceParentHeader, getTraceParentHeader } from "./utils/traceParentHeader";
//# sourceMappingURL=index.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { context as otContext, trace as otTrace } from "@opentelemetry/api";
/**
 * The kind of span.
 */
export var SpanKind;
(function (SpanKind) {
    /** Default value. Indicates that the span is used internally. */
    SpanKind[SpanKind["INTERNAL"] = 0] = "INTERNAL";
    /**
     * Indicates that the span covers server-side handling of an RPC or other
     * remote request.
     */
    SpanKind[SpanKind["SERVER"] = 1] = "SERVER";
    /**
     * Indicates that the span covers the client-side wrapper around an RPC or
     * other remote request.
     */
    SpanKind[SpanKind["CLIENT"] = 2] = "CLIENT";
    /**
     * Indicates that the span describes producer sending a message to a
     * broker. Unlike client and server, there is no direct critical path latency
     * relationship between producer and consumer spans.
     */
    SpanKind[SpanKind["PRODUCER"] = 3] = "PRODUCER";
    /**
     * Indicates that the span describes consumer receiving a message from a
     * broker. Unlike client and server, there is no direct critical path latency
     * relationship between producer and consumer spans.
     */
    SpanKind[SpanKind["CONSUMER"] = 4] = "CONSUMER";
})(SpanKind || (SpanKind = {}));
/**
 * Return the span if one exists
 *
 * @param context - context to get span from
 */
export function getSpan(context) {
    return otTrace.getSpan(context);
}
/**
 * Set the span on a context
 *
 * @param context - context to use as parent
 * @param span - span to set active
 */
export function setSpan(context, span) {
    return otTrace.setSpan(context, span);
}
/**
 * Wrap span context in a NoopSpan and set as span in a new
 * context
 *
 * @param context - context to set active span on
 * @param spanContext - span context to be wrapped
 */
export function setSpanContext(context, spanContext) {
    return otTrace.setSpanContext(context, spanContext);
}
/**
 * Get the span context of the span if it exists.
 *
 * @param context - context to get values from
 */
export function getSpanContext(context) {
    return otTrace.getSpanContext(context);
}
/**
 * Returns true of the given {@link SpanContext} is valid.
 * A valid {@link SpanContext} is one which has a valid trace ID and span ID as per the spec.
 *
 * @param context - the {@link SpanContext} to validate.
 *
 * @returns true if the {@link SpanContext} is valid, false otherwise.
 */
export function isSpanContextValid(context) {
    return otTrace.isSpanContextValid(context);
}
export function getTracer(name, version) {
    return otTrace.getTracer(name || "azure/core-tracing", version);
}
/** Entrypoint for context API */
export const context = otContext;
/** SpanStatusCode */
export var SpanStatusCode;
(function (SpanStatusCode) {
    /**
     * The default status.
     */
    SpanStatusCode[SpanStatusCode["UNSET"] = 0] = "UNSET";
    /**
     * The operation has been validated by an Application developer or
     * Operator to have completed successfully.
     */
    SpanStatusCode[SpanStatusCode["OK"] = 1] = "OK";
    /**
     * The operation contains an error.
     */
    SpanStatusCode[SpanStatusCode["ERROR"] = 2] = "ERROR";
})(SpanStatusCode || (SpanStatusCode = {}));
//# sourceMappingURL=interfaces.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
const VERSION = "00";
/**
 * Generates a `SpanContext` given a `traceparent` header value.
 * @param traceParent - Serialized span context data as a `traceparent` header value.
 * @returns The `SpanContext` generated from the `traceparent` value.
 */
export function extractSpanContextFromTraceParentHeader(traceParentHeader) {
    const parts = traceParentHeader.split("-");
    if (parts.length !== 4) {
        return;
    }
    const [version, traceId, spanId, traceOptions] = parts;
    if (version !== VERSION) {
        return;
    }
    const traceFlags = parseInt(traceOptions, 16);
    const spanContext = {
        spanId,
        traceId,
        traceFlags
    };
    return spanContext;
}
/**
 * Generates a `traceparent` value given a span context.
 * @param spanContext - Contains context for a specific span.
 * @returns The `spanContext` represented as a `traceparent` value.
 */
export function getTraceParentHeader(spanContext) {
    const missingFields = [];
    if (!spanContext.traceId) {
        missingFields.push("traceId");
    }
    if (!spanContext.spanId) {
        missingFields.push("spanId");
    }
    if (missingFields.length) {
        return;
    }
    const flags = spanContext.traceFlags || 0 /* NONE */;
    const hexFlags = flags.toString(16);
    const traceFlags = hexFlags.length === 1 ? `0${hexFlags}` : hexFlags;
    // https://www.w3.org/TR/trace-context/#traceparent-header-field-values
    return `${VERSION}-${spanContext.traceId}-${spanContext.spanId}-${traceFlags}`;
}
//# sourceMappingURL=traceParentHeader.js.map'use strict';

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

var api = require('@opentelemetry/api');

// Copyright (c) Microsoft Corporation.
(function (SpanKind) {
    /** Default value. Indicates that the span is used internally. */
    SpanKind[SpanKind["INTERNAL"] = 0] = "INTERNAL";
    /**
     * Indicates that the span covers server-side handling of an RPC or other
     * remote request.
     */
    SpanKind[SpanKind["SERVER"] = 1] = "SERVER";
    /**
     * Indicates that the span covers the client-side wrapper around an RPC or
     * other remote request.
     */
    SpanKind[SpanKind["CLIENT"] = 2] = "CLIENT";
    /**
     * Indicates that the span describes producer sending a message to a
     * broker. Unlike client and server, there is no direct critical path latency
     * relationship between producer and consumer spans.
     */
    SpanKind[SpanKind["PRODUCER"] = 3] = "PRODUCER";
    /**
     * Indicates that the span describes consumer receiving a message from a
     * broker. Unlike client and server, there is no direct critical path latency
     * relationship between producer and consumer spans.
     */
    SpanKind[SpanKind["CONSUMER"] = 4] = "CONSUMER";
})(exports.SpanKind || (exports.SpanKind = {}));
/**
 * Return the span if one exists
 *
 * @param context - context to get span from
 */
function getSpan(context) {
    return api.trace.getSpan(context);
}
/**
 * Set the span on a context
 *
 * @param context - context to use as parent
 * @param span - span to set active
 */
function setSpan(context, span) {
    return api.trace.setSpan(context, span);
}
/**
 * Wrap span context in a NoopSpan and set as span in a new
 * context
 *
 * @param context - context to set active span on
 * @param spanContext - span context to be wrapped
 */
function setSpanContext(context, spanContext) {
    return api.trace.setSpanContext(context, spanContext);
}
/**
 * Get the span context of the span if it exists.
 *
 * @param context - context to get values from
 */
function getSpanContext(context) {
    return api.trace.getSpanContext(context);
}
/**
 * Returns true of the given {@link SpanContext} is valid.
 * A valid {@link SpanContext} is one which has a valid trace ID and span ID as per the spec.
 *
 * @param context - the {@link SpanContext} to validate.
 *
 * @returns true if the {@link SpanContext} is valid, false otherwise.
 */
function isSpanContextValid(context) {
    return api.trace.isSpanContextValid(context);
}
function getTracer(name, version) {
    return api.trace.getTracer(name || "azure/core-tracing", version);
}
/** Entrypoint for context API */
const context = api.context;
(function (SpanStatusCode) {
    /**
     * The default status.
     */
    SpanStatusCode[SpanStatusCode["UNSET"] = 0] = "UNSET";
    /**
     * The operation has been validated by an Application developer or
     * Operator to have completed successfully.
     */
    SpanStatusCode[SpanStatusCode["OK"] = 1] = "OK";
    /**
     * The operation contains an error.
     */
    SpanStatusCode[SpanStatusCode["ERROR"] = 2] = "ERROR";
})(exports.SpanStatusCode || (exports.SpanStatusCode = {}));

// Copyright (c) Microsoft Corporation.
function isTracingDisabled() {
    var _a;
    if (typeof process === "undefined") {
        // not supported in browser for now without polyfills
        return false;
    }
    const azureTracingDisabledValue = (_a = process.env.AZURE_TRACING_DISABLED) === null || _a === void 0 ? void 0 : _a.toLowerCase();
    if (azureTracingDisabledValue === "false" || azureTracingDisabledValue === "0") {
        return false;
    }
    return Boolean(azureTracingDisabledValue);
}
/**
 * Creates a function that can be used to create spans using the global tracer.
 *
 * Usage:
 *
 * ```typescript
 * // once
 * const createSpan = createSpanFunction({ packagePrefix: "Azure.Data.AppConfiguration", namespace: "Microsoft.AppConfiguration" });
 *
 * // in each operation
 * const span = createSpan("deleteConfigurationSetting", operationOptions);
 *    // code...
 * span.end();
 * ```
 *
 * @hidden
 * @param args - allows configuration of the prefix for each span as well as the az.namespace field.
 */
function createSpanFunction(args) {
    return function (operationName, operationOptions) {
        const tracer = getTracer();
        const tracingOptions = (operationOptions === null || operationOptions === void 0 ? void 0 : operationOptions.tracingOptions) || {};
        const spanOptions = Object.assign({ kind: exports.SpanKind.INTERNAL }, tracingOptions.spanOptions);
        const spanName = args.packagePrefix ? `${args.packagePrefix}.${operationName}` : operationName;
        let span;
        if (isTracingDisabled()) {
            span = api.trace.wrapSpanContext(api.INVALID_SPAN_CONTEXT);
        }
        else {
            span = tracer.startSpan(spanName, spanOptions, tracingOptions.tracingContext);
        }
        if (args.namespace) {
            span.setAttribute("az.namespace", args.namespace);
        }
        let newSpanOptions = tracingOptions.spanOptions || {};
        if (span.isRecording() && args.namespace) {
            newSpanOptions = Object.assign(Object.assign({}, tracingOptions.spanOptions), { attributes: Object.assign(Object.assign({}, spanOptions.attributes), { "az.namespace": args.namespace }) });
        }
        const newTracingOptions = Object.assign(Object.assign({}, tracingOptions), { spanOptions: newSpanOptions, tracingContext: setSpan(tracingOptions.tracingContext || context.active(), span) });
        const newOperationOptions = Object.assign(Object.assign({}, operationOptions), { tracingOptions: newTracingOptions });
        return {
            span,
            updatedOptions: newOperationOptions
        };
    };
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
const VERSION = "00";
/**
 * Generates a `SpanContext` given a `traceparent` header value.
 * @param traceParent - Serialized span context data as a `traceparent` header value.
 * @returns The `SpanContext` generated from the `traceparent` value.
 */
function extractSpanContextFromTraceParentHeader(traceParentHeader) {
    const parts = traceParentHeader.split("-");
    if (parts.length !== 4) {
        return;
    }
    const [version, traceId, spanId, traceOptions] = parts;
    if (version !== VERSION) {
        return;
    }
    const traceFlags = parseInt(traceOptions, 16);
    const spanContext = {
        spanId,
        traceId,
        traceFlags
    };
    return spanContext;
}
/**
 * Generates a `traceparent` value given a span context.
 * @param spanContext - Contains context for a specific span.
 * @returns The `spanContext` represented as a `traceparent` value.
 */
function getTraceParentHeader(spanContext) {
    const missingFields = [];
    if (!spanContext.traceId) {
        missingFields.push("traceId");
    }
    if (!spanContext.spanId) {
        missingFields.push("spanId");
    }
    if (missingFields.length) {
        return;
    }
    const flags = spanContext.traceFlags || 0 /* NONE */;
    const hexFlags = flags.toString(16);
    const traceFlags = hexFlags.length === 1 ? `0${hexFlags}` : hexFlags;
    // https://www.w3.org/TR/trace-context/#traceparent-header-field-values
    return `${VERSION}-${spanContext.traceId}-${spanContext.spanId}-${traceFlags}`;
}

exports.context = context;
exports.createSpanFunction = createSpanFunction;
exports.extractSpanContextFromTraceParentHeader = extractSpanContextFromTraceParentHeader;
exports.getSpan = getSpan;
exports.getSpanContext = getSpanContext;
exports.getTraceParentHeader = getTraceParentHeader;
exports.getTracer = getTracer;
exports.isSpanContextValid = isSpanContextValid;
exports.setSpan = setSpan;
exports.setSpanContext = setSpanContext;
//# sourceMappingURL=index.js.map
Copyright (c) 2012 Felix Geisendörfer (felix@debuggable.com) and contributors

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

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

 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
# Form-Data [![NPM Module](https://img.shields.io/npm/v/form-data.svg)](https://www.npmjs.com/package/form-data) [![Join the chat at https://gitter.im/form-data/form-data](http://form-data.github.io/images/gitterbadge.svg)](https://gitter.im/form-data/form-data)

A library to create readable ```"multipart/form-data"``` streams. Can be used to submit forms and file uploads to other web applications.

The API of this library is inspired by the [XMLHttpRequest-2 FormData Interface][xhr2-fd].

[xhr2-fd]: http://dev.w3.org/2006/webapi/XMLHttpRequest-2/Overview.html#the-formdata-interface

[![Linux Build](https://img.shields.io/travis/form-data/form-data/v4.0.0.svg?label=linux:6.x-12.x)](https://travis-ci.org/form-data/form-data)
[![MacOS Build](https://img.shields.io/travis/form-data/form-data/v4.0.0.svg?label=macos:6.x-12.x)](https://travis-ci.org/form-data/form-data)
[![Windows Build](https://img.shields.io/travis/form-data/form-data/v4.0.0.svg?label=windows:6.x-12.x)](https://travis-ci.org/form-data/form-data)

[![Coverage Status](https://img.shields.io/coveralls/form-data/form-data/v4.0.0.svg?label=code+coverage)](https://coveralls.io/github/form-data/form-data?branch=master)
[![Dependency Status](https://img.shields.io/david/form-data/form-data.svg)](https://david-dm.org/form-data/form-data)

## Install

```
npm install --save form-data
```

## Usage

In this example we are constructing a form with 3 fields that contain a string,
a buffer and a file stream.

``` javascript
var FormData = require('form-data');
var fs = require('fs');

var form = new FormData();
form.append('my_field', 'my value');
form.append('my_buffer', new Buffer(10));
form.append('my_file', fs.createReadStream('/foo/bar.jpg'));
```

Also you can use http-response stream:

``` javascript
var FormData = require('form-data');
var http = require('http');

var form = new FormData();

http.request('http://nodejs.org/images/logo.png', function(response) {
  form.append('my_field', 'my value');
  form.append('my_buffer', new Buffer(10));
  form.append('my_logo', response);
});
```

Or @mikeal's [request](https://github.com/request/request) stream:

``` javascript
var FormData = require('form-data');
var request = require('request');

var form = new FormData();

form.append('my_field', 'my value');
form.append('my_buffer', new Buffer(10));
form.append('my_logo', request('http://nodejs.org/images/logo.png'));
```

In order to submit this form to a web application, call ```submit(url, [callback])``` method:

``` javascript
form.submit('http://example.org/', function(err, res) {
  // res – response object (http.IncomingMessage)  //
  res.resume();
});

```

For more advanced request manipulations ```submit()``` method returns ```http.ClientRequest``` object, or you can choose from one of the alternative submission methods.

### Custom options

You can provide custom options, such as `maxDataSize`:

``` javascript
var FormData = require('form-data');

var form = new FormData({ maxDataSize: 20971520 });
form.append('my_field', 'my value');
form.append('my_buffer', /* something big */);
```

List of available options could be found in [combined-stream](https://github.com/felixge/node-combined-stream/blob/master/lib/combined_stream.js#L7-L15)

### Alternative submission methods

You can use node's http client interface:

``` javascript
var http = require('http');

var request = http.request({
  method: 'post',
  host: 'example.org',
  path: '/upload',
  headers: form.getHeaders()
});

form.pipe(request);

request.on('response', function(res) {
  console.log(res.statusCode);
});
```

Or if you would prefer the `'Content-Length'` header to be set for you:

``` javascript
form.submit('example.org/upload', function(err, res) {
  console.log(res.statusCode);
});
```

To use custom headers and pre-known length in parts:

``` javascript
var CRLF = '\r\n';
var form = new FormData();

var options = {
  header: CRLF + '--' + form.getBoundary() + CRLF + 'X-Custom-Header: 123' + CRLF + CRLF,
  knownLength: 1
};

form.append('my_buffer', buffer, options);

form.submit('http://example.com/', function(err, res) {
  if (err) throw err;
  console.log('Done');
});
```

Form-Data can recognize and fetch all the required information from common types of streams (```fs.readStream```, ```http.response``` and ```mikeal's request```), for some other types of streams you'd need to provide "file"-related information manually:

``` javascript
someModule.stream(function(err, stdout, stderr) {
  if (err) throw err;

  var form = new FormData();

  form.append('file', stdout, {
    filename: 'unicycle.jpg', // ... or:
    filepath: 'photos/toys/unicycle.jpg',
    contentType: 'image/jpeg',
    knownLength: 19806
  });

  form.submit('http://example.com/', function(err, res) {
    if (err) throw err;
    console.log('Done');
  });
});
```

The `filepath` property overrides `filename` and may contain a relative path. This is typically used when uploading [multiple files from a directory](https://wicg.github.io/entries-api/#dom-htmlinputelement-webkitdirectory).

For edge cases, like POST request to URL with query string or to pass HTTP auth credentials, object can be passed to `form.submit()` as first parameter:

``` javascript
form.submit({
  host: 'example.com',
  path: '/probably.php?extra=params',
  auth: 'username:password'
}, function(err, res) {
  console.log(res.statusCode);
});
```

In case you need to also send custom HTTP headers with the POST request, you can use the `headers` key in first parameter of `form.submit()`:

``` javascript
form.submit({
  host: 'example.com',
  path: '/surelynot.php',
  headers: {'x-test-header': 'test-header-value'}
}, function(err, res) {
  console.log(res.statusCode);
});
```

### Methods

- [_Void_ append( **String** _field_, **Mixed** _value_ [, **Mixed** _options_] )](https://github.com/form-data/form-data#void-append-string-field-mixed-value--mixed-options-).
- [_Headers_ getHeaders( [**Headers** _userHeaders_] )](https://github.com/form-data/form-data#array-getheaders-array-userheaders-)
- [_String_ getBoundary()](https://github.com/form-data/form-data#string-getboundary)
- [_Void_ setBoundary()](https://github.com/form-data/form-data#void-setboundary)
- [_Buffer_ getBuffer()](https://github.com/form-data/form-data#buffer-getbuffer)
- [_Integer_ getLengthSync()](https://github.com/form-data/form-data#integer-getlengthsync)
- [_Integer_ getLength( **function** _callback_ )](https://github.com/form-data/form-data#integer-getlength-function-callback-)
- [_Boolean_ hasKnownLength()](https://github.com/form-data/form-data#boolean-hasknownlength)
- [_Request_ submit( _params_, **function** _callback_ )](https://github.com/form-data/form-data#request-submit-params-function-callback-)
- [_String_ toString()](https://github.com/form-data/form-data#string-tostring)

#### _Void_ append( **String** _field_, **Mixed** _value_ [, **Mixed** _options_] )
Append data to the form. You can submit about any format (string, integer, boolean, buffer, etc.). However, Arrays are not supported and need to be turned into strings by the user.
```javascript
var form = new FormData();
form.append( 'my_string', 'my value' );
form.append( 'my_integer', 1 );
form.append( 'my_boolean', true );
form.append( 'my_buffer', new Buffer(10) );
form.append( 'my_array_as_json', JSON.stringify( ['bird','cute'] ) )
```

You may provide a string for options, or an object.
```javascript
// Set filename by providing a string for options
form.append( 'my_file', fs.createReadStream('/foo/bar.jpg'), 'bar.jpg' );

// provide an object.
form.append( 'my_file', fs.createReadStream('/foo/bar.jpg'), {filename: 'bar.jpg', contentType: 'image/jpeg', knownLength: 19806} );
```

#### _Headers_ getHeaders( [**Headers** _userHeaders_] )
This method adds the correct `content-type` header to the provided array of `userHeaders`.

#### _String_ getBoundary()
Return the boundary of the formData. By default, the boundary consists of 26 `-` followed by 24 numbers
for example:
```javascript
--------------------------515890814546601021194782
```

#### _Void_ setBoundary(String _boundary_)
Set the boundary string, overriding the default behavior described above.

_Note: The boundary must be unique and may not appear in the data._

#### _Buffer_ getBuffer()
Return the full formdata request package, as a Buffer. You can insert this Buffer in e.g. Axios to send multipart data.
```javascript
var form = new FormData();
form.append( 'my_buffer', Buffer.from([0x4a,0x42,0x20,0x52,0x6f,0x63,0x6b,0x73]) );
form.append( 'my_file', fs.readFileSync('/foo/bar.jpg') );

axios.post( 'https://example.com/path/to/api',
            form.getBuffer(),
            form.getHeaders()
          )
```
**Note:** Because the output is of type Buffer, you can only append types that are accepted by Buffer: *string, Buffer, ArrayBuffer, Array, or Array-like Object*. A ReadStream for example will result in an error.

#### _Integer_ getLengthSync()
Same as `getLength` but synchronous.

_Note: getLengthSync __doesn't__ calculate streams length._

#### _Integer_ getLength( **function** _callback_ )
Returns the `Content-Length` async. The callback is used to handle errors and continue once the length has been calculated
```javascript
this.getLength(function(err, length) {
  if (err) {
    this._error(err);
    return;
  }

  // add content length
  request.setHeader('Content-Length', length);

  ...
}.bind(this));
```

#### _Boolean_ hasKnownLength()
Checks if the length of added values is known.

#### _Request_ submit( _params_, **function** _callback_ )
Submit the form to a web application.
```javascript
var form = new FormData();
form.append( 'my_string', 'Hello World' );

form.submit( 'http://example.com/', function(err, res) {
  // res – response object (http.IncomingMessage)  //
  res.resume();
} );
```

#### _String_ toString()
Returns the form data as a string. Don't use this if you are sending files or buffers, use `getBuffer()` instead.

### Integration with other libraries

#### Request

Form submission using  [request](https://github.com/request/request):

```javascript
var formData = {
  my_field: 'my_value',
  my_file: fs.createReadStream(__dirname + '/unicycle.jpg'),
};

request.post({url:'http://service.com/upload', formData: formData}, function(err, httpResponse, body) {
  if (err) {
    return console.error('upload failed:', err);
  }
  console.log('Upload successful!  Server responded with:', body);
});
```

For more details see [request readme](https://github.com/request/request#multipartform-data-multipart-form-uploads).

#### node-fetch

You can also submit a form using [node-fetch](https://github.com/bitinn/node-fetch):

```javascript
var form = new FormData();

form.append('a', 1);

fetch('http://example.com', { method: 'POST', body: form })
    .then(function(res) {
        return res.json();
    }).then(function(json) {
        console.log(json);
    });
```

#### axios

In Node.js you can post a file using [axios](https://github.com/axios/axios):
```javascript
const form = new FormData();
const stream = fs.createReadStream(PATH_TO_FILE);

form.append('image', stream);

// In Node.js environment you need to set boundary in the header field 'Content-Type' by calling method `getHeaders`
const formHeaders = form.getHeaders();

axios.post('http://example.com', form, {
  headers: {
    ...formHeaders,
  },
})
.then(response => response)
.catch(error => error)
```

## Notes

- ```getLengthSync()``` method DOESN'T calculate length for streams, use ```knownLength``` options as workaround.
- ```getLength(cb)``` will send an error as first parameter of callback if stream length cannot be calculated (e.g. send in custom streams w/o using ```knownLength```).
- ```submit``` will not add `content-length` if form length is unknown or not calculable.
- Starting version `2.x` FormData has dropped support for `node@0.10.x`.
- Starting version `3.x` FormData has dropped support for `node@4.x`.

## License

Form-Data is released under the [MIT](License) license.
{
  "author": "Felix Geisendörfer <felix@debuggable.com> (http://debuggable.com/)",
  "name": "form-data",
  "description": "A library to create readable \"multipart/form-data\" streams. Can be used to submit forms and file uploads to other web applications.",
  "version": "4.0.0",
  "repository": {
    "type": "git",
    "url": "git://github.com/form-data/form-data.git"
  },
  "main": "./lib/form_data",
  "browser": "./lib/browser",
  "typings": "./index.d.ts",
  "pre-commit": [
    "lint",
    "ci-test",
    "check"
  ],
  "engines": {
    "node": ">= 6"
  },
  "dependencies": {
    "asynckit": "^0.4.0",
    "combined-stream": "^1.0.8",
    "mime-types": "^2.1.12"
  },
  "devDependencies": {
    "@types/node": "^12.0.10",
    "browserify": "^13.1.1",
    "browserify-istanbul": "^2.0.0",
    "coveralls": "^3.0.4",
    "cross-spawn": "^6.0.5",
    "eslint": "^6.0.1",
    "fake": "^0.2.2",
    "far": "^0.0.7",
    "formidable": "^1.0.17",
    "in-publish": "^2.0.0",
    "is-node-modern": "^1.0.0",
    "istanbul": "^0.4.5",
    "obake": "^0.1.2",
    "puppeteer": "^1.19.0",
    "pkgfiles": "^2.3.0",
    "pre-commit": "^1.1.3",
    "request": "^2.88.0",
    "rimraf": "^2.7.1",
    "tape": "^4.6.2",
    "typescript": "^3.5.2"
  },
  "license": "MIT"
}/* eslint-env browser */
module.exports = typeof self == 'object' ? self.FormData : window.FormData;
var CombinedStream = require('combined-stream');
var util = require('util');
var path = require('path');
var http = require('http');
var https = require('https');
var parseUrl = require('url').parse;
var fs = require('fs');
var Stream = require('stream').Stream;
var mime = require('mime-types');
var asynckit = require('asynckit');
var populate = require('./populate.js');

// Public API
module.exports = FormData;

// make it a Stream
util.inherits(FormData, CombinedStream);

/**
 * Create readable "multipart/form-data" streams.
 * Can be used to submit forms
 * and file uploads to other web applications.
 *
 * @constructor
 * @param {Object} options - Properties to be added/overriden for FormData and CombinedStream
 */
function FormData(options) {
  if (!(this instanceof FormData)) {
    return new FormData(options);
  }

  this._overheadLength = 0;
  this._valueLength = 0;
  this._valuesToMeasure = [];

  CombinedStream.call(this);

  options = options || {};
  for (var option in options) {
    this[option] = options[option];
  }
}

FormData.LINE_BREAK = '\r\n';
FormData.DEFAULT_CONTENT_TYPE = 'application/octet-stream';

FormData.prototype.append = function(field, value, options) {

  options = options || {};

  // allow filename as single option
  if (typeof options == 'string') {
    options = {filename: options};
  }

  var append = CombinedStream.prototype.append.bind(this);

  // all that streamy business can't handle numbers
  if (typeof value == 'number') {
    value = '' + value;
  }

  // https://github.com/felixge/node-form-data/issues/38
  if (util.isArray(value)) {
    // Please convert your array into string
    // the way web server expects it
    this._error(new Error('Arrays are not supported.'));
    return;
  }

  var header = this._multiPartHeader(field, value, options);
  var footer = this._multiPartFooter();

  append(header);
  append(value);
  append(footer);

  // pass along options.knownLength
  this._trackLength(header, value, options);
};

FormData.prototype._trackLength = function(header, value, options) {
  var valueLength = 0;

  // used w/ getLengthSync(), when length is known.
  // e.g. for streaming directly from a remote server,
  // w/ a known file a size, and not wanting to wait for
  // incoming file to finish to get its size.
  if (options.knownLength != null) {
    valueLength += +options.knownLength;
  } else if (Buffer.isBuffer(value)) {
    valueLength = value.length;
  } else if (typeof value === 'string') {
    valueLength = Buffer.byteLength(value);
  }

  this._valueLength += valueLength;

  // @check why add CRLF? does this account for custom/multiple CRLFs?
  this._overheadLength +=
    Buffer.byteLength(header) +
    FormData.LINE_BREAK.length;

  // empty or either doesn't have path or not an http response or not a stream
  if (!value || ( !value.path && !(value.readable && value.hasOwnProperty('httpVersion')) && !(value instanceof Stream))) {
    return;
  }

  // no need to bother with the length
  if (!options.knownLength) {
    this._valuesToMeasure.push(value);
  }
};

FormData.prototype._lengthRetriever = function(value, callback) {

  if (value.hasOwnProperty('fd')) {

    // take read range into a account
    // `end` = Infinity –> read file till the end
    //
    // TODO: Looks like there is bug in Node fs.createReadStream
    // it doesn't respect `end` options without `start` options
    // Fix it when node fixes it.
    // https://github.com/joyent/node/issues/7819
    if (value.end != undefined && value.end != Infinity && value.start != undefined) {

      // when end specified
      // no need to calculate range
      // inclusive, starts with 0
      callback(null, value.end + 1 - (value.start ? value.start : 0));

    // not that fast snoopy
    } else {
      // still need to fetch file size from fs
      fs.stat(value.path, function(err, stat) {

        var fileSize;

        if (err) {
          callback(err);
          return;
        }

        // update final size based on the range options
        fileSize = stat.size - (value.start ? value.start : 0);
        callback(null, fileSize);
      });
    }

  // or http response
  } else if (value.hasOwnProperty('httpVersion')) {
    callback(null, +value.headers['content-length']);

  // or request stream http://github.com/mikeal/request
  } else if (value.hasOwnProperty('httpModule')) {
    // wait till response come back
    value.on('response', function(response) {
      value.pause();
      callback(null, +response.headers['content-length']);
    });
    value.resume();

  // something else
  } else {
    callback('Unknown stream');
  }
};

FormData.prototype._multiPartHeader = function(field, value, options) {
  // custom header specified (as string)?
  // it becomes responsible for boundary
  // (e.g. to handle extra CRLFs on .NET servers)
  if (typeof options.header == 'string') {
    return options.header;
  }

  var contentDisposition = this._getContentDisposition(value, options);
  var contentType = this._getContentType(value, options);

  var contents = '';
  var headers  = {
    // add custom disposition as third element or keep it two elements if not
    'Content-Disposition': ['form-data', 'name="' + field + '"'].concat(contentDisposition || []),
    // if no content type. allow it to be empty array
    'Content-Type': [].concat(contentType || [])
  };

  // allow custom headers.
  if (typeof options.header == 'object') {
    populate(headers, options.header);
  }

  var header;
  for (var prop in headers) {
    if (!headers.hasOwnProperty(prop)) continue;
    header = headers[prop];

    // skip nullish headers.
    if (header == null) {
      continue;
    }

    // convert all headers to arrays.
    if (!Array.isArray(header)) {
      header = [header];
    }

    // add non-empty headers.
    if (header.length) {
      contents += prop + ': ' + header.join('; ') + FormData.LINE_BREAK;
    }
  }

  return '--' + this.getBoundary() + FormData.LINE_BREAK + contents + FormData.LINE_BREAK;
};

FormData.prototype._getContentDisposition = function(value, options) {

  var filename
    , contentDisposition
    ;

  if (typeof options.filepath === 'string') {
    // custom filepath for relative paths
    filename = path.normalize(options.filepath).replace(/\\/g, '/');
  } else if (options.filename || value.name || value.path) {
    // custom filename take precedence
    // formidable and the browser add a name property
    // fs- and request- streams have path property
    filename = path.basename(options.filename || value.name || value.path);
  } else if (value.readable && value.hasOwnProperty('httpVersion')) {
    // or try http response
    filename = path.basename(value.client._httpMessage.path || '');
  }

  if (filename) {
    contentDisposition = 'filename="' + filename + '"';
  }

  return contentDisposition;
};

FormData.prototype._getContentType = function(value, options) {

  // use custom content-type above all
  var contentType = options.contentType;

  // or try `name` from formidable, browser
  if (!contentType && value.name) {
    contentType = mime.lookup(value.name);
  }

  // or try `path` from fs-, request- streams
  if (!contentType && value.path) {
    contentType = mime.lookup(value.path);
  }

  // or if it's http-reponse
  if (!contentType && value.readable && value.hasOwnProperty('httpVersion')) {
    contentType = value.headers['content-type'];
  }

  // or guess it from the filepath or filename
  if (!contentType && (options.filepath || options.filename)) {
    contentType = mime.lookup(options.filepath || options.filename);
  }

  // fallback to the default content type if `value` is not simple value
  if (!contentType && typeof value == 'object') {
    contentType = FormData.DEFAULT_CONTENT_TYPE;
  }

  return contentType;
};

FormData.prototype._multiPartFooter = function() {
  return function(next) {
    var footer = FormData.LINE_BREAK;

    var lastPart = (this._streams.length === 0);
    if (lastPart) {
      footer += this._lastBoundary();
    }

    next(footer);
  }.bind(this);
};

FormData.prototype._lastBoundary = function() {
  return '--' + this.getBoundary() + '--' + FormData.LINE_BREAK;
};

FormData.prototype.getHeaders = function(userHeaders) {
  var header;
  var formHeaders = {
    'content-type': 'multipart/form-data; boundary=' + this.getBoundary()
  };

  for (header in userHeaders) {
    if (userHeaders.hasOwnProperty(header)) {
      formHeaders[header.toLowerCase()] = userHeaders[header];
    }
  }

  return formHeaders;
};

FormData.prototype.setBoundary = function(boundary) {
  this._boundary = boundary;
};

FormData.prototype.getBoundary = function() {
  if (!this._boundary) {
    this._generateBoundary();
  }

  return this._boundary;
};

FormData.prototype.getBuffer = function() {
  var dataBuffer = new Buffer.alloc( 0 );
  var boundary = this.getBoundary();

  // Create the form content. Add Line breaks to the end of data.
  for (var i = 0, len = this._streams.length; i < len; i++) {
    if (typeof this._streams[i] !== 'function') {

      // Add content to the buffer.
      if(Buffer.isBuffer(this._streams[i])) {
        dataBuffer = Buffer.concat( [dataBuffer, this._streams[i]]);
      }else {
        dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(this._streams[i])]);
      }

      // Add break after content.
      if (typeof this._streams[i] !== 'string' || this._streams[i].substring( 2, boundary.length + 2 ) !== boundary) {
        dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(FormData.LINE_BREAK)] );
      }
    }
  }

  // Add the footer and return the Buffer object.
  return Buffer.concat( [dataBuffer, Buffer.from(this._lastBoundary())] );
};

FormData.prototype._generateBoundary = function() {
  // This generates a 50 character boundary similar to those used by Firefox.
  // They are optimized for boyer-moore parsing.
  var boundary = '--------------------------';
  for (var i = 0; i < 24; i++) {
    boundary += Math.floor(Math.random() * 10).toString(16);
  }

  this._boundary = boundary;
};

// Note: getLengthSync DOESN'T calculate streams length
// As workaround one can calculate file size manually
// and add it as knownLength option
FormData.prototype.getLengthSync = function() {
  var knownLength = this._overheadLength + this._valueLength;

  // Don't get confused, there are 3 "internal" streams for each keyval pair
  // so it basically checks if there is any value added to the form
  if (this._streams.length) {
    knownLength += this._lastBoundary().length;
  }

  // https://github.com/form-data/form-data/issues/40
  if (!this.hasKnownLength()) {
    // Some async length retrievers are present
    // therefore synchronous length calculation is false.
    // Please use getLength(callback) to get proper length
    this._error(new Error('Cannot calculate proper length in synchronous way.'));
  }

  return knownLength;
};

// Public API to check if length of added values is known
// https://github.com/form-data/form-data/issues/196
// https://github.com/form-data/form-data/issues/262
FormData.prototype.hasKnownLength = function() {
  var hasKnownLength = true;

  if (this._valuesToMeasure.length) {
    hasKnownLength = false;
  }

  return hasKnownLength;
};

FormData.prototype.getLength = function(cb) {
  var knownLength = this._overheadLength + this._valueLength;

  if (this._streams.length) {
    knownLength += this._lastBoundary().length;
  }

  if (!this._valuesToMeasure.length) {
    process.nextTick(cb.bind(this, null, knownLength));
    return;
  }

  asynckit.parallel(this._valuesToMeasure, this._lengthRetriever, function(err, values) {
    if (err) {
      cb(err);
      return;
    }

    values.forEach(function(length) {
      knownLength += length;
    });

    cb(null, knownLength);
  });
};

FormData.prototype.submit = function(params, cb) {
  var request
    , options
    , defaults = {method: 'post'}
    ;

  // parse provided url if it's string
  // or treat it as options object
  if (typeof params == 'string') {

    params = parseUrl(params);
    options = populate({
      port: params.port,
      path: params.pathname,
      host: params.hostname,
      protocol: params.protocol
    }, defaults);

  // use custom params
  } else {

    options = populate(params, defaults);
    // if no port provided use default one
    if (!options.port) {
      options.port = options.protocol == 'https:' ? 443 : 80;
    }
  }

  // put that good code in getHeaders to some use
  options.headers = this.getHeaders(params.headers);

  // https if specified, fallback to http in any other case
  if (options.protocol == 'https:') {
    request = https.request(options);
  } else {
    request = http.request(options);
  }

  // get content length and fire away
  this.getLength(function(err, length) {
    if (err && err !== 'Unknown stream') {
      this._error(err);
      return;
    }

    // add content length
    if (length) {
      request.setHeader('Content-Length', length);
    }

    this.pipe(request);
    if (cb) {
      var onResponse;

      var callback = function (error, responce) {
        request.removeListener('error', callback);
        request.removeListener('response', onResponse);

        return cb.call(this, error, responce);
      };

      onResponse = callback.bind(this, null);

      request.on('error', callback);
      request.on('response', onResponse);
    }
  }.bind(this));

  return request;
};

FormData.prototype._error = function(err) {
  if (!this.error) {
    this.error = err;
    this.pause();
    this.emit('error', err);
  }
};

FormData.prototype.toString = function () {
  return '[object FormData]';
};
// populates missing values
module.exports = function(dst, src) {

  Object.keys(src).forEach(function(prop)
  {
    dst[prop] = dst[prop] || src[prop];
  });

  return dst;
};
# Contributing

Please feel free to file GitHub Issues or propose Pull Requests. We're always happy to discuss improvements to this library!

## Testing

```shell
npm test
```

## Releasing

Releases are supposed to be done from master, version bumping is automated through [`standard-version`](https://github.com/conventional-changelog/standard-version):

```shell
npm run release -- --dry-run  # verify output manually
npm run release               # follow the instructions from the output of this command
```
The MIT License (MIT)

Copyright (c) 2010-2020 Robert Kieffer and other contributors

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

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

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "name": "uuid",
  "version": "8.3.2",
  "description": "RFC4122 (v1, v4, and v5) UUIDs",
  "commitlint": {
    "extends": [
      "@commitlint/config-conventional"
    ]
  },
  "license": "MIT",
  "bin": {
    "uuid": "./dist/bin/uuid"
  },
  "sideEffects": false,
  "main": "./dist/index.js",
  "exports": {
    ".": {
      "node": {
        "module": "./dist/esm-node/index.js",
        "require": "./dist/index.js",
        "import": "./wrapper.mjs"
      },
      "default": "./dist/esm-browser/index.js"
    },
    "./package.json": "./package.json"
  },
  "module": "./dist/esm-node/index.js",
  "browser": {
    "./dist/md5.js": "./dist/md5-browser.js",
    "./dist/rng.js": "./dist/rng-browser.js",
    "./dist/sha1.js": "./dist/sha1-browser.js",
    "./dist/esm-node/index.js": "./dist/esm-browser/index.js"
  },
  "files": [
    "CHANGELOG.md",
    "CONTRIBUTING.md",
    "LICENSE.md",
    "README.md",
    "dist",
    "wrapper.mjs"
  ],
  "devDependencies": {
    "@babel/cli": "7.11.6",
    "@babel/core": "7.11.6",
    "@babel/preset-env": "7.11.5",
    "@commitlint/cli": "11.0.0",
    "@commitlint/config-conventional": "11.0.0",
    "@rollup/plugin-node-resolve": "9.0.0",
    "babel-eslint": "10.1.0",
    "bundlewatch": "0.3.1",
    "eslint": "7.10.0",
    "eslint-config-prettier": "6.12.0",
    "eslint-config-standard": "14.1.1",
    "eslint-plugin-import": "2.22.1",
    "eslint-plugin-node": "11.1.0",
    "eslint-plugin-prettier": "3.1.4",
    "eslint-plugin-promise": "4.2.1",
    "eslint-plugin-standard": "4.0.1",
    "husky": "4.3.0",
    "jest": "25.5.4",
    "lint-staged": "10.4.0",
    "npm-run-all": "4.1.5",
    "optional-dev-dependency": "2.0.1",
    "prettier": "2.1.2",
    "random-seed": "0.3.0",
    "rollup": "2.28.2",
    "rollup-plugin-terser": "7.0.2",
    "runmd": "1.3.2",
    "standard-version": "9.0.0"
  },
  "optionalDevDependencies": {
    "@wdio/browserstack-service": "6.4.0",
    "@wdio/cli": "6.4.0",
    "@wdio/jasmine-framework": "6.4.0",
    "@wdio/local-runner": "6.4.0",
    "@wdio/spec-reporter": "6.4.0",
    "@wdio/static-server-service": "6.4.0",
    "@wdio/sync": "6.4.0"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/uuidjs/uuid.git"
  },
  "husky": {
    "hooks": {
      "commit-msg": "commitlint -E HUSKY_GIT_PARAMS",
      "pre-commit": "lint-staged"
    }
  },
  "lint-staged": {
    "*.{js,jsx,json,md}": [
      "prettier --write"
    ],
    "*.{js,jsx}": [
      "eslint --fix"
    ]
  },
  "standard-version": {
    "scripts": {
      "postchangelog": "prettier --write CHANGELOG.md"
    }
  }
}import uuid from './dist/index.js';
export const v1 = uuid.v1;
export const v3 = uuid.v3;
export const v4 = uuid.v4;
export const v5 = uuid.v5;
export const NIL = uuid.NIL;
export const version = uuid.version;
export const validate = uuid.validate;
export const stringify = uuid.stringify;
export const parse = uuid.parse;
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
Object.defineProperty(exports, "v1", {
  enumerable: true,
  get: function () {
    return _v.default;
  }
});
Object.defineProperty(exports, "v3", {
  enumerable: true,
  get: function () {
    return _v2.default;
  }
});
Object.defineProperty(exports, "v4", {
  enumerable: true,
  get: function () {
    return _v3.default;
  }
});
Object.defineProperty(exports, "v5", {
  enumerable: true,
  get: function () {
    return _v4.default;
  }
});
Object.defineProperty(exports, "NIL", {
  enumerable: true,
  get: function () {
    return _nil.default;
  }
});
Object.defineProperty(exports, "version", {
  enumerable: true,
  get: function () {
    return _version.default;
  }
});
Object.defineProperty(exports, "validate", {
  enumerable: true,
  get: function () {
    return _validate.default;
  }
});
Object.defineProperty(exports, "stringify", {
  enumerable: true,
  get: function () {
    return _stringify.default;
  }
});
Object.defineProperty(exports, "parse", {
  enumerable: true,
  get: function () {
    return _parse.default;
  }
});

var _v = _interopRequireDefault(require("./v1.js"));

var _v2 = _interopRequireDefault(require("./v3.js"));

var _v3 = _interopRequireDefault(require("./v4.js"));

var _v4 = _interopRequireDefault(require("./v5.js"));

var _nil = _interopRequireDefault(require("./nil.js"));

var _version = _interopRequireDefault(require("./version.js"));

var _validate = _interopRequireDefault(require("./validate.js"));

var _stringify = _interopRequireDefault(require("./stringify.js"));

var _parse = _interopRequireDefault(require("./parse.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/*
 * Browser-compatible JavaScript MD5
 *
 * Modification of JavaScript MD5
 * https://github.com/blueimp/JavaScript-MD5
 *
 * Copyright 2011, Sebastian Tschan
 * https://blueimp.net
 *
 * Licensed under the MIT license:
 * https://opensource.org/licenses/MIT
 *
 * Based on
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 */
function md5(bytes) {
  if (typeof bytes === 'string') {
    const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape

    bytes = new Uint8Array(msg.length);

    for (let i = 0; i < msg.length; ++i) {
      bytes[i] = msg.charCodeAt(i);
    }
  }

  return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));
}
/*
 * Convert an array of little-endian words to an array of bytes
 */


function md5ToHexEncodedArray(input) {
  const output = [];
  const length32 = input.length * 32;
  const hexTab = '0123456789abcdef';

  for (let i = 0; i < length32; i += 8) {
    const x = input[i >> 5] >>> i % 32 & 0xff;
    const hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);
    output.push(hex);
  }

  return output;
}
/**
 * Calculate output length with padding and bit length
 */


function getOutputLength(inputLength8) {
  return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;
}
/*
 * Calculate the MD5 of an array of little-endian words, and a bit length.
 */


function wordsToMd5(x, len) {
  /* append padding */
  x[len >> 5] |= 0x80 << len % 32;
  x[getOutputLength(len) - 1] = len;
  let a = 1732584193;
  let b = -271733879;
  let c = -1732584194;
  let d = 271733878;

  for (let i = 0; i < x.length; i += 16) {
    const olda = a;
    const oldb = b;
    const oldc = c;
    const oldd = d;
    a = md5ff(a, b, c, d, x[i], 7, -680876936);
    d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);
    c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);
    b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
    a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);
    d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
    c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
    b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);
    a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
    d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
    c = md5ff(c, d, a, b, x[i + 10], 17, -42063);
    b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
    a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
    d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);
    c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
    b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
    a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);
    d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
    c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);
    b = md5gg(b, c, d, a, x[i], 20, -373897302);
    a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);
    d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);
    c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);
    b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);
    a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);
    d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
    c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);
    b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
    a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
    d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);
    c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
    b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
    a = md5hh(a, b, c, d, x[i + 5], 4, -378558);
    d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
    c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
    b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);
    a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
    d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
    c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);
    b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
    a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);
    d = md5hh(d, a, b, c, x[i], 11, -358537222);
    c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);
    b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);
    a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);
    d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);
    c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);
    b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);
    a = md5ii(a, b, c, d, x[i], 6, -198630844);
    d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
    c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
    b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);
    a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
    d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
    c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);
    b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
    a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
    d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);
    c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
    b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
    a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);
    d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
    c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);
    b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);
    a = safeAdd(a, olda);
    b = safeAdd(b, oldb);
    c = safeAdd(c, oldc);
    d = safeAdd(d, oldd);
  }

  return [a, b, c, d];
}
/*
 * Convert an array bytes to an array of little-endian words
 * Characters >255 have their high-byte silently ignored.
 */


function bytesToWords(input) {
  if (input.length === 0) {
    return [];
  }

  const length8 = input.length * 8;
  const output = new Uint32Array(getOutputLength(length8));

  for (let i = 0; i < length8; i += 8) {
    output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;
  }

  return output;
}
/*
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
 * to work around bugs in some JS interpreters.
 */


function safeAdd(x, y) {
  const lsw = (x & 0xffff) + (y & 0xffff);
  const msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return msw << 16 | lsw & 0xffff;
}
/*
 * Bitwise rotate a 32-bit number to the left.
 */


function bitRotateLeft(num, cnt) {
  return num << cnt | num >>> 32 - cnt;
}
/*
 * These functions implement the four basic operations the algorithm uses.
 */


function md5cmn(q, a, b, x, s, t) {
  return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);
}

function md5ff(a, b, c, d, x, s, t) {
  return md5cmn(b & c | ~b & d, a, b, x, s, t);
}

function md5gg(a, b, c, d, x, s, t) {
  return md5cmn(b & d | c & ~d, a, b, x, s, t);
}

function md5hh(a, b, c, d, x, s, t) {
  return md5cmn(b ^ c ^ d, a, b, x, s, t);
}

function md5ii(a, b, c, d, x, s, t) {
  return md5cmn(c ^ (b | ~d), a, b, x, s, t);
}

var _default = md5;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _crypto = _interopRequireDefault(require("crypto"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function md5(bytes) {
  if (Array.isArray(bytes)) {
    bytes = Buffer.from(bytes);
  } else if (typeof bytes === 'string') {
    bytes = Buffer.from(bytes, 'utf8');
  }

  return _crypto.default.createHash('md5').update(bytes).digest();
}

var _default = md5;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var _default = '00000000-0000-0000-0000-000000000000';
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _validate = _interopRequireDefault(require("./validate.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function parse(uuid) {
  if (!(0, _validate.default)(uuid)) {
    throw TypeError('Invalid UUID');
  }

  let v;
  const arr = new Uint8Array(16); // Parse ########-....-....-....-............

  arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;
  arr[1] = v >>> 16 & 0xff;
  arr[2] = v >>> 8 & 0xff;
  arr[3] = v & 0xff; // Parse ........-####-....-....-............

  arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;
  arr[5] = v & 0xff; // Parse ........-....-####-....-............

  arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;
  arr[7] = v & 0xff; // Parse ........-....-....-####-............

  arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;
  arr[9] = v & 0xff; // Parse ........-....-....-....-############
  // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes)

  arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;
  arr[11] = v / 0x100000000 & 0xff;
  arr[12] = v >>> 24 & 0xff;
  arr[13] = v >>> 16 & 0xff;
  arr[14] = v >>> 8 & 0xff;
  arr[15] = v & 0xff;
  return arr;
}

var _default = parse;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var _default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = rng;
// Unique ID creation requires a high quality random # generator. In the browser we therefore
// require the crypto API and do not support built-in fallback to lower quality random number
// generators (like Math.random()).
let getRandomValues;
const rnds8 = new Uint8Array(16);

function rng() {
  // lazy load so that environments that need to polyfill have a chance to do so
  if (!getRandomValues) {
    // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. Also,
    // find the complete implementation of crypto (msCrypto) on IE11.
    getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);

    if (!getRandomValues) {
      throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');
    }
  }

  return getRandomValues(rnds8);
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = rng;

var _crypto = _interopRequireDefault(require("crypto"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate

let poolPtr = rnds8Pool.length;

function rng() {
  if (poolPtr > rnds8Pool.length - 16) {
    _crypto.default.randomFillSync(rnds8Pool);

    poolPtr = 0;
  }

  return rnds8Pool.slice(poolPtr, poolPtr += 16);
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

// Adapted from Chris Veness' SHA1 code at
// http://www.movable-type.co.uk/scripts/sha1.html
function f(s, x, y, z) {
  switch (s) {
    case 0:
      return x & y ^ ~x & z;

    case 1:
      return x ^ y ^ z;

    case 2:
      return x & y ^ x & z ^ y & z;

    case 3:
      return x ^ y ^ z;
  }
}

function ROTL(x, n) {
  return x << n | x >>> 32 - n;
}

function sha1(bytes) {
  const K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];
  const H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];

  if (typeof bytes === 'string') {
    const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape

    bytes = [];

    for (let i = 0; i < msg.length; ++i) {
      bytes.push(msg.charCodeAt(i));
    }
  } else if (!Array.isArray(bytes)) {
    // Convert Array-like to Array
    bytes = Array.prototype.slice.call(bytes);
  }

  bytes.push(0x80);
  const l = bytes.length / 4 + 2;
  const N = Math.ceil(l / 16);
  const M = new Array(N);

  for (let i = 0; i < N; ++i) {
    const arr = new Uint32Array(16);

    for (let j = 0; j < 16; ++j) {
      arr[j] = bytes[i * 64 + j * 4] << 24 | bytes[i * 64 + j * 4 + 1] << 16 | bytes[i * 64 + j * 4 + 2] << 8 | bytes[i * 64 + j * 4 + 3];
    }

    M[i] = arr;
  }

  M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);
  M[N - 1][14] = Math.floor(M[N - 1][14]);
  M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;

  for (let i = 0; i < N; ++i) {
    const W = new Uint32Array(80);

    for (let t = 0; t < 16; ++t) {
      W[t] = M[i][t];
    }

    for (let t = 16; t < 80; ++t) {
      W[t] = ROTL(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1);
    }

    let a = H[0];
    let b = H[1];
    let c = H[2];
    let d = H[3];
    let e = H[4];

    for (let t = 0; t < 80; ++t) {
      const s = Math.floor(t / 20);
      const T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[t] >>> 0;
      e = d;
      d = c;
      c = ROTL(b, 30) >>> 0;
      b = a;
      a = T;
    }

    H[0] = H[0] + a >>> 0;
    H[1] = H[1] + b >>> 0;
    H[2] = H[2] + c >>> 0;
    H[3] = H[3] + d >>> 0;
    H[4] = H[4] + e >>> 0;
  }

  return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];
}

var _default = sha1;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _crypto = _interopRequireDefault(require("crypto"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function sha1(bytes) {
  if (Array.isArray(bytes)) {
    bytes = Buffer.from(bytes);
  } else if (typeof bytes === 'string') {
    bytes = Buffer.from(bytes, 'utf8');
  }

  return _crypto.default.createHash('sha1').update(bytes).digest();
}

var _default = sha1;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _validate = _interopRequireDefault(require("./validate.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/**
 * Convert array of 16 byte values to UUID string format of the form:
 * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
 */
const byteToHex = [];

for (let i = 0; i < 256; ++i) {
  byteToHex.push((i + 0x100).toString(16).substr(1));
}

function stringify(arr, offset = 0) {
  // Note: Be careful editing this code!  It's been tuned for performance
  // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
  const uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID.  If this throws, it's likely due to one
  // of the following:
  // - One or more input array values don't map to a hex octet (leading to
  // "undefined" in the uuid)
  // - Invalid input values for the RFC `version` or `variant` fields

  if (!(0, _validate.default)(uuid)) {
    throw TypeError('Stringified UUID is invalid');
  }

  return uuid;
}

var _default = stringify;
exports.default = _default;"use strict";

var _assert = _interopRequireDefault(require("assert"));

var _v = _interopRequireDefault(require("./v1.js"));

var _v2 = _interopRequireDefault(require("./v3.js"));

var _v3 = _interopRequireDefault(require("./v4.js"));

var _v4 = _interopRequireDefault(require("./v5.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function usage() {
  console.log('Usage:');
  console.log('  uuid');
  console.log('  uuid v1');
  console.log('  uuid v3 <name> <namespace uuid>');
  console.log('  uuid v4');
  console.log('  uuid v5 <name> <namespace uuid>');
  console.log('  uuid --help');
  console.log('\nNote: <namespace uuid> may be "URL" or "DNS" to use the corresponding UUIDs defined by RFC4122');
}

const args = process.argv.slice(2);

if (args.indexOf('--help') >= 0) {
  usage();
  process.exit(0);
}

const version = args.shift() || 'v4';

switch (version) {
  case 'v1':
    console.log((0, _v.default)());
    break;

  case 'v3':
    {
      const name = args.shift();
      let namespace = args.shift();
      (0, _assert.default)(name != null, 'v3 name not specified');
      (0, _assert.default)(namespace != null, 'v3 namespace not specified');

      if (namespace === 'URL') {
        namespace = _v2.default.URL;
      }

      if (namespace === 'DNS') {
        namespace = _v2.default.DNS;
      }

      console.log((0, _v2.default)(name, namespace));
      break;
    }

  case 'v4':
    console.log((0, _v3.default)());
    break;

  case 'v5':
    {
      const name = args.shift();
      let namespace = args.shift();
      (0, _assert.default)(name != null, 'v5 name not specified');
      (0, _assert.default)(namespace != null, 'v5 namespace not specified');

      if (namespace === 'URL') {
        namespace = _v4.default.URL;
      }

      if (namespace === 'DNS') {
        namespace = _v4.default.DNS;
      }

      console.log((0, _v4.default)(name, namespace));
      break;
    }

  default:
    usage();
    process.exit(1);
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _rng = _interopRequireDefault(require("./rng.js"));

var _stringify = _interopRequireDefault(require("./stringify.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// **`v1()` - Generate time-based UUID**
//
// Inspired by https://github.com/LiosK/UUID.js
// and http://docs.python.org/library/uuid.html
let _nodeId;

let _clockseq; // Previous uuid creation time


let _lastMSecs = 0;
let _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details

function v1(options, buf, offset) {
  let i = buf && offset || 0;
  const b = buf || new Array(16);
  options = options || {};
  let node = options.node || _nodeId;
  let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not
  // specified.  We do this lazily to minimize issues related to insufficient
  // system entropy.  See #189

  if (node == null || clockseq == null) {
    const seedBytes = options.random || (options.rng || _rng.default)();

    if (node == null) {
      // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
      node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];
    }

    if (clockseq == null) {
      // Per 4.2.2, randomize (14 bit) clockseq
      clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
    }
  } // UUID timestamps are 100 nano-second units since the Gregorian epoch,
  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so
  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.


  let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock
  // cycle to simulate higher resolution clock

  let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)

  const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression

  if (dt < 0 && options.clockseq === undefined) {
    clockseq = clockseq + 1 & 0x3fff;
  } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
  // time interval


  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
    nsecs = 0;
  } // Per 4.2.1.2 Throw error if too many uuids are requested


  if (nsecs >= 10000) {
    throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
  }

  _lastMSecs = msecs;
  _lastNSecs = nsecs;
  _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch

  msecs += 12219292800000; // `time_low`

  const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
  b[i++] = tl >>> 24 & 0xff;
  b[i++] = tl >>> 16 & 0xff;
  b[i++] = tl >>> 8 & 0xff;
  b[i++] = tl & 0xff; // `time_mid`

  const tmh = msecs / 0x100000000 * 10000 & 0xfffffff;
  b[i++] = tmh >>> 8 & 0xff;
  b[i++] = tmh & 0xff; // `time_high_and_version`

  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version

  b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)

  b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`

  b[i++] = clockseq & 0xff; // `node`

  for (let n = 0; n < 6; ++n) {
    b[i + n] = node[n];
  }

  return buf || (0, _stringify.default)(b);
}

var _default = v1;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _v = _interopRequireDefault(require("./v35.js"));

var _md = _interopRequireDefault(require("./md5.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const v3 = (0, _v.default)('v3', 0x30, _md.default);
var _default = v3;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = _default;
exports.URL = exports.DNS = void 0;

var _stringify = _interopRequireDefault(require("./stringify.js"));

var _parse = _interopRequireDefault(require("./parse.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function stringToBytes(str) {
  str = unescape(encodeURIComponent(str)); // UTF8 escape

  const bytes = [];

  for (let i = 0; i < str.length; ++i) {
    bytes.push(str.charCodeAt(i));
  }

  return bytes;
}

const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
exports.DNS = DNS;
const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
exports.URL = URL;

function _default(name, version, hashfunc) {
  function generateUUID(value, namespace, buf, offset) {
    if (typeof value === 'string') {
      value = stringToBytes(value);
    }

    if (typeof namespace === 'string') {
      namespace = (0, _parse.default)(namespace);
    }

    if (namespace.length !== 16) {
      throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');
    } // Compute hash of namespace and value, Per 4.3
    // Future: Use spread syntax when supported on all platforms, e.g. `bytes =
    // hashfunc([...namespace, ... value])`


    let bytes = new Uint8Array(16 + value.length);
    bytes.set(namespace);
    bytes.set(value, namespace.length);
    bytes = hashfunc(bytes);
    bytes[6] = bytes[6] & 0x0f | version;
    bytes[8] = bytes[8] & 0x3f | 0x80;

    if (buf) {
      offset = offset || 0;

      for (let i = 0; i < 16; ++i) {
        buf[offset + i] = bytes[i];
      }

      return buf;
    }

    return (0, _stringify.default)(bytes);
  } // Function#name is not settable on some platforms (#270)


  try {
    generateUUID.name = name; // eslint-disable-next-line no-empty
  } catch (err) {} // For CommonJS default export support


  generateUUID.DNS = DNS;
  generateUUID.URL = URL;
  return generateUUID;
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _rng = _interopRequireDefault(require("./rng.js"));

var _stringify = _interopRequireDefault(require("./stringify.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function v4(options, buf, offset) {
  options = options || {};

  const rnds = options.random || (options.rng || _rng.default)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`


  rnds[6] = rnds[6] & 0x0f | 0x40;
  rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided

  if (buf) {
    offset = offset || 0;

    for (let i = 0; i < 16; ++i) {
      buf[offset + i] = rnds[i];
    }

    return buf;
  }

  return (0, _stringify.default)(rnds);
}

var _default = v4;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _v = _interopRequireDefault(require("./v35.js"));

var _sha = _interopRequireDefault(require("./sha1.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const v5 = (0, _v.default)('v5', 0x50, _sha.default);
var _default = v5;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _regex = _interopRequireDefault(require("./regex.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function validate(uuid) {
  return typeof uuid === 'string' && _regex.default.test(uuid);
}

var _default = validate;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _validate = _interopRequireDefault(require("./validate.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function version(uuid) {
  if (!(0, _validate.default)(uuid)) {
    throw TypeError('Invalid UUID');
  }

  return parseInt(uuid.substr(14, 1), 16);
}

var _default = version;
exports.default = _default;!function(r,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((r="undefined"!=typeof globalThis?globalThis:r||self).uuid={})}(this,(function(r){"use strict";var e,n=new Uint8Array(16);function t(){if(!e&&!(e="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return e(n)}var o=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function a(r){return"string"==typeof r&&o.test(r)}for(var i,u,f=[],s=0;s<256;++s)f.push((s+256).toString(16).substr(1));function c(r){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(f[r[e+0]]+f[r[e+1]]+f[r[e+2]]+f[r[e+3]]+"-"+f[r[e+4]]+f[r[e+5]]+"-"+f[r[e+6]]+f[r[e+7]]+"-"+f[r[e+8]]+f[r[e+9]]+"-"+f[r[e+10]]+f[r[e+11]]+f[r[e+12]]+f[r[e+13]]+f[r[e+14]]+f[r[e+15]]).toLowerCase();if(!a(n))throw TypeError("Stringified UUID is invalid");return n}var l=0,d=0;function v(r){if(!a(r))throw TypeError("Invalid UUID");var e,n=new Uint8Array(16);return n[0]=(e=parseInt(r.slice(0,8),16))>>>24,n[1]=e>>>16&255,n[2]=e>>>8&255,n[3]=255&e,n[4]=(e=parseInt(r.slice(9,13),16))>>>8,n[5]=255&e,n[6]=(e=parseInt(r.slice(14,18),16))>>>8,n[7]=255&e,n[8]=(e=parseInt(r.slice(19,23),16))>>>8,n[9]=255&e,n[10]=(e=parseInt(r.slice(24,36),16))/1099511627776&255,n[11]=e/4294967296&255,n[12]=e>>>24&255,n[13]=e>>>16&255,n[14]=e>>>8&255,n[15]=255&e,n}function p(r,e,n){function t(r,t,o,a){if("string"==typeof r&&(r=function(r){r=unescape(encodeURIComponent(r));for(var e=[],n=0;n<r.length;++n)e.push(r.charCodeAt(n));return e}(r)),"string"==typeof t&&(t=v(t)),16!==t.length)throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");var i=new Uint8Array(16+r.length);if(i.set(t),i.set(r,t.length),(i=n(i))[6]=15&i[6]|e,i[8]=63&i[8]|128,o){a=a||0;for(var u=0;u<16;++u)o[a+u]=i[u];return o}return c(i)}try{t.name=r}catch(r){}return t.DNS="6ba7b810-9dad-11d1-80b4-00c04fd430c8",t.URL="6ba7b811-9dad-11d1-80b4-00c04fd430c8",t}function h(r){return 14+(r+64>>>9<<4)+1}function y(r,e){var n=(65535&r)+(65535&e);return(r>>16)+(e>>16)+(n>>16)<<16|65535&n}function g(r,e,n,t,o,a){return y((i=y(y(e,r),y(t,a)))<<(u=o)|i>>>32-u,n);var i,u}function m(r,e,n,t,o,a,i){return g(e&n|~e&t,r,e,o,a,i)}function w(r,e,n,t,o,a,i){return g(e&t|n&~t,r,e,o,a,i)}function b(r,e,n,t,o,a,i){return g(e^n^t,r,e,o,a,i)}function A(r,e,n,t,o,a,i){return g(n^(e|~t),r,e,o,a,i)}var U=p("v3",48,(function(r){if("string"==typeof r){var e=unescape(encodeURIComponent(r));r=new Uint8Array(e.length);for(var n=0;n<e.length;++n)r[n]=e.charCodeAt(n)}return function(r){for(var e=[],n=32*r.length,t="0123456789abcdef",o=0;o<n;o+=8){var a=r[o>>5]>>>o%32&255,i=parseInt(t.charAt(a>>>4&15)+t.charAt(15&a),16);e.push(i)}return e}(function(r,e){r[e>>5]|=128<<e%32,r[h(e)-1]=e;for(var n=1732584193,t=-271733879,o=-1732584194,a=271733878,i=0;i<r.length;i+=16){var u=n,f=t,s=o,c=a;n=m(n,t,o,a,r[i],7,-680876936),a=m(a,n,t,o,r[i+1],12,-389564586),o=m(o,a,n,t,r[i+2],17,606105819),t=m(t,o,a,n,r[i+3],22,-1044525330),n=m(n,t,o,a,r[i+4],7,-176418897),a=m(a,n,t,o,r[i+5],12,1200080426),o=m(o,a,n,t,r[i+6],17,-1473231341),t=m(t,o,a,n,r[i+7],22,-45705983),n=m(n,t,o,a,r[i+8],7,1770035416),a=m(a,n,t,o,r[i+9],12,-1958414417),o=m(o,a,n,t,r[i+10],17,-42063),t=m(t,o,a,n,r[i+11],22,-1990404162),n=m(n,t,o,a,r[i+12],7,1804603682),a=m(a,n,t,o,r[i+13],12,-40341101),o=m(o,a,n,t,r[i+14],17,-1502002290),n=w(n,t=m(t,o,a,n,r[i+15],22,1236535329),o,a,r[i+1],5,-165796510),a=w(a,n,t,o,r[i+6],9,-1069501632),o=w(o,a,n,t,r[i+11],14,643717713),t=w(t,o,a,n,r[i],20,-373897302),n=w(n,t,o,a,r[i+5],5,-701558691),a=w(a,n,t,o,r[i+10],9,38016083),o=w(o,a,n,t,r[i+15],14,-660478335),t=w(t,o,a,n,r[i+4],20,-405537848),n=w(n,t,o,a,r[i+9],5,568446438),a=w(a,n,t,o,r[i+14],9,-1019803690),o=w(o,a,n,t,r[i+3],14,-187363961),t=w(t,o,a,n,r[i+8],20,1163531501),n=w(n,t,o,a,r[i+13],5,-1444681467),a=w(a,n,t,o,r[i+2],9,-51403784),o=w(o,a,n,t,r[i+7],14,1735328473),n=b(n,t=w(t,o,a,n,r[i+12],20,-1926607734),o,a,r[i+5],4,-378558),a=b(a,n,t,o,r[i+8],11,-2022574463),o=b(o,a,n,t,r[i+11],16,1839030562),t=b(t,o,a,n,r[i+14],23,-35309556),n=b(n,t,o,a,r[i+1],4,-1530992060),a=b(a,n,t,o,r[i+4],11,1272893353),o=b(o,a,n,t,r[i+7],16,-155497632),t=b(t,o,a,n,r[i+10],23,-1094730640),n=b(n,t,o,a,r[i+13],4,681279174),a=b(a,n,t,o,r[i],11,-358537222),o=b(o,a,n,t,r[i+3],16,-722521979),t=b(t,o,a,n,r[i+6],23,76029189),n=b(n,t,o,a,r[i+9],4,-640364487),a=b(a,n,t,o,r[i+12],11,-421815835),o=b(o,a,n,t,r[i+15],16,530742520),n=A(n,t=b(t,o,a,n,r[i+2],23,-995338651),o,a,r[i],6,-198630844),a=A(a,n,t,o,r[i+7],10,1126891415),o=A(o,a,n,t,r[i+14],15,-1416354905),t=A(t,o,a,n,r[i+5],21,-57434055),n=A(n,t,o,a,r[i+12],6,1700485571),a=A(a,n,t,o,r[i+3],10,-1894986606),o=A(o,a,n,t,r[i+10],15,-1051523),t=A(t,o,a,n,r[i+1],21,-2054922799),n=A(n,t,o,a,r[i+8],6,1873313359),a=A(a,n,t,o,r[i+15],10,-30611744),o=A(o,a,n,t,r[i+6],15,-1560198380),t=A(t,o,a,n,r[i+13],21,1309151649),n=A(n,t,o,a,r[i+4],6,-145523070),a=A(a,n,t,o,r[i+11],10,-1120210379),o=A(o,a,n,t,r[i+2],15,718787259),t=A(t,o,a,n,r[i+9],21,-343485551),n=y(n,u),t=y(t,f),o=y(o,s),a=y(a,c)}return[n,t,o,a]}(function(r){if(0===r.length)return[];for(var e=8*r.length,n=new Uint32Array(h(e)),t=0;t<e;t+=8)n[t>>5]|=(255&r[t/8])<<t%32;return n}(r),8*r.length))}));function I(r,e,n,t){switch(r){case 0:return e&n^~e&t;case 1:return e^n^t;case 2:return e&n^e&t^n&t;case 3:return e^n^t}}function C(r,e){return r<<e|r>>>32-e}var R=p("v5",80,(function(r){var e=[1518500249,1859775393,2400959708,3395469782],n=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof r){var t=unescape(encodeURIComponent(r));r=[];for(var o=0;o<t.length;++o)r.push(t.charCodeAt(o))}else Array.isArray(r)||(r=Array.prototype.slice.call(r));r.push(128);for(var a=r.length/4+2,i=Math.ceil(a/16),u=new Array(i),f=0;f<i;++f){for(var s=new Uint32Array(16),c=0;c<16;++c)s[c]=r[64*f+4*c]<<24|r[64*f+4*c+1]<<16|r[64*f+4*c+2]<<8|r[64*f+4*c+3];u[f]=s}u[i-1][14]=8*(r.length-1)/Math.pow(2,32),u[i-1][14]=Math.floor(u[i-1][14]),u[i-1][15]=8*(r.length-1)&4294967295;for(var l=0;l<i;++l){for(var d=new Uint32Array(80),v=0;v<16;++v)d[v]=u[l][v];for(var p=16;p<80;++p)d[p]=C(d[p-3]^d[p-8]^d[p-14]^d[p-16],1);for(var h=n[0],y=n[1],g=n[2],m=n[3],w=n[4],b=0;b<80;++b){var A=Math.floor(b/20),U=C(h,5)+I(A,y,g,m)+w+e[A]+d[b]>>>0;w=m,m=g,g=C(y,30)>>>0,y=h,h=U}n[0]=n[0]+h>>>0,n[1]=n[1]+y>>>0,n[2]=n[2]+g>>>0,n[3]=n[3]+m>>>0,n[4]=n[4]+w>>>0}return[n[0]>>24&255,n[0]>>16&255,n[0]>>8&255,255&n[0],n[1]>>24&255,n[1]>>16&255,n[1]>>8&255,255&n[1],n[2]>>24&255,n[2]>>16&255,n[2]>>8&255,255&n[2],n[3]>>24&255,n[3]>>16&255,n[3]>>8&255,255&n[3],n[4]>>24&255,n[4]>>16&255,n[4]>>8&255,255&n[4]]}));r.NIL="00000000-0000-0000-0000-000000000000",r.parse=v,r.stringify=c,r.v1=function(r,e,n){var o=e&&n||0,a=e||new Array(16),f=(r=r||{}).node||i,s=void 0!==r.clockseq?r.clockseq:u;if(null==f||null==s){var v=r.random||(r.rng||t)();null==f&&(f=i=[1|v[0],v[1],v[2],v[3],v[4],v[5]]),null==s&&(s=u=16383&(v[6]<<8|v[7]))}var p=void 0!==r.msecs?r.msecs:Date.now(),h=void 0!==r.nsecs?r.nsecs:d+1,y=p-l+(h-d)/1e4;if(y<0&&void 0===r.clockseq&&(s=s+1&16383),(y<0||p>l)&&void 0===r.nsecs&&(h=0),h>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");l=p,d=h,u=s;var g=(1e4*(268435455&(p+=122192928e5))+h)%4294967296;a[o++]=g>>>24&255,a[o++]=g>>>16&255,a[o++]=g>>>8&255,a[o++]=255&g;var m=p/4294967296*1e4&268435455;a[o++]=m>>>8&255,a[o++]=255&m,a[o++]=m>>>24&15|16,a[o++]=m>>>16&255,a[o++]=s>>>8|128,a[o++]=255&s;for(var w=0;w<6;++w)a[o+w]=f[w];return e||c(a)},r.v3=U,r.v4=function(r,e,n){var o=(r=r||{}).random||(r.rng||t)();if(o[6]=15&o[6]|64,o[8]=63&o[8]|128,e){n=n||0;for(var a=0;a<16;++a)e[n+a]=o[a];return e}return c(o)},r.v5=R,r.validate=a,r.version=function(r){if(!a(r))throw TypeError("Invalid UUID");return parseInt(r.substr(14,1),16)},Object.defineProperty(r,"__esModule",{value:!0})}));!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidNIL=n()}(this,(function(){"use strict";return"00000000-0000-0000-0000-000000000000"}));!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidParse=n()}(this,(function(){"use strict";var e=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;return function(n){if(!function(n){return"string"==typeof n&&e.test(n)}(n))throw TypeError("Invalid UUID");var t,i=new Uint8Array(16);return i[0]=(t=parseInt(n.slice(0,8),16))>>>24,i[1]=t>>>16&255,i[2]=t>>>8&255,i[3]=255&t,i[4]=(t=parseInt(n.slice(9,13),16))>>>8,i[5]=255&t,i[6]=(t=parseInt(n.slice(14,18),16))>>>8,i[7]=255&t,i[8]=(t=parseInt(n.slice(19,23),16))>>>8,i[9]=255&t,i[10]=(t=parseInt(n.slice(24,36),16))/1099511627776&255,i[11]=t/4294967296&255,i[12]=t>>>24&255,i[13]=t>>>16&255,i[14]=t>>>8&255,i[15]=255&t,i}}));!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidStringify=t()}(this,(function(){"use strict";var e=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function t(t){return"string"==typeof t&&e.test(t)}for(var i=[],n=0;n<256;++n)i.push((n+256).toString(16).substr(1));return function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,f=(i[e[n+0]]+i[e[n+1]]+i[e[n+2]]+i[e[n+3]]+"-"+i[e[n+4]]+i[e[n+5]]+"-"+i[e[n+6]]+i[e[n+7]]+"-"+i[e[n+8]]+i[e[n+9]]+"-"+i[e[n+10]]+i[e[n+11]]+i[e[n+12]]+i[e[n+13]]+i[e[n+14]]+i[e[n+15]]).toLowerCase();if(!t(f))throw TypeError("Stringified UUID is invalid");return f}}));!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidValidate=t()}(this,(function(){"use strict";var e=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;return function(t){return"string"==typeof t&&e.test(t)}}));!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidVersion=t()}(this,(function(){"use strict";var e=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;return function(t){if(!function(t){return"string"==typeof t&&e.test(t)}(t))throw TypeError("Invalid UUID");return parseInt(t.substr(14,1),16)}}));!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?module.exports=o():"function"==typeof define&&define.amd?define(o):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidv1=o()}(this,(function(){"use strict";var e,o=new Uint8Array(16);function t(){if(!e&&!(e="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return e(o)}var n=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function r(e){return"string"==typeof e&&n.test(e)}for(var i,u,s=[],a=0;a<256;++a)s.push((a+256).toString(16).substr(1));var d=0,f=0;return function(e,o,n){var a=o&&n||0,c=o||new Array(16),l=(e=e||{}).node||i,p=void 0!==e.clockseq?e.clockseq:u;if(null==l||null==p){var v=e.random||(e.rng||t)();null==l&&(l=i=[1|v[0],v[1],v[2],v[3],v[4],v[5]]),null==p&&(p=u=16383&(v[6]<<8|v[7]))}var y=void 0!==e.msecs?e.msecs:Date.now(),m=void 0!==e.nsecs?e.nsecs:f+1,g=y-d+(m-f)/1e4;if(g<0&&void 0===e.clockseq&&(p=p+1&16383),(g<0||y>d)&&void 0===e.nsecs&&(m=0),m>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");d=y,f=m,u=p;var h=(1e4*(268435455&(y+=122192928e5))+m)%4294967296;c[a++]=h>>>24&255,c[a++]=h>>>16&255,c[a++]=h>>>8&255,c[a++]=255&h;var w=y/4294967296*1e4&268435455;c[a++]=w>>>8&255,c[a++]=255&w,c[a++]=w>>>24&15|16,c[a++]=w>>>16&255,c[a++]=p>>>8|128,c[a++]=255&p;for(var b=0;b<6;++b)c[a+b]=l[b];return o||function(e){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,t=(s[e[o+0]]+s[e[o+1]]+s[e[o+2]]+s[e[o+3]]+"-"+s[e[o+4]]+s[e[o+5]]+"-"+s[e[o+6]]+s[e[o+7]]+"-"+s[e[o+8]]+s[e[o+9]]+"-"+s[e[o+10]]+s[e[o+11]]+s[e[o+12]]+s[e[o+13]]+s[e[o+14]]+s[e[o+15]]).toLowerCase();if(!r(t))throw TypeError("Stringified UUID is invalid");return t}(c)}}));!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define(r):(n="undefined"!=typeof globalThis?globalThis:n||self).uuidv3=r()}(this,(function(){"use strict";var n=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function r(r){return"string"==typeof r&&n.test(r)}for(var e=[],t=0;t<256;++t)e.push((t+256).toString(16).substr(1));function i(n){return 14+(n+64>>>9<<4)+1}function o(n,r){var e=(65535&n)+(65535&r);return(n>>16)+(r>>16)+(e>>16)<<16|65535&e}function a(n,r,e,t,i,a){return o((f=o(o(r,n),o(t,a)))<<(u=i)|f>>>32-u,e);var f,u}function f(n,r,e,t,i,o,f){return a(r&e|~r&t,n,r,i,o,f)}function u(n,r,e,t,i,o,f){return a(r&t|e&~t,n,r,i,o,f)}function c(n,r,e,t,i,o,f){return a(r^e^t,n,r,i,o,f)}function s(n,r,e,t,i,o,f){return a(e^(r|~t),n,r,i,o,f)}return function(n,t,i){function o(n,o,a,f){if("string"==typeof n&&(n=function(n){n=unescape(encodeURIComponent(n));for(var r=[],e=0;e<n.length;++e)r.push(n.charCodeAt(e));return r}(n)),"string"==typeof o&&(o=function(n){if(!r(n))throw TypeError("Invalid UUID");var e,t=new Uint8Array(16);return t[0]=(e=parseInt(n.slice(0,8),16))>>>24,t[1]=e>>>16&255,t[2]=e>>>8&255,t[3]=255&e,t[4]=(e=parseInt(n.slice(9,13),16))>>>8,t[5]=255&e,t[6]=(e=parseInt(n.slice(14,18),16))>>>8,t[7]=255&e,t[8]=(e=parseInt(n.slice(19,23),16))>>>8,t[9]=255&e,t[10]=(e=parseInt(n.slice(24,36),16))/1099511627776&255,t[11]=e/4294967296&255,t[12]=e>>>24&255,t[13]=e>>>16&255,t[14]=e>>>8&255,t[15]=255&e,t}(o)),16!==o.length)throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");var u=new Uint8Array(16+n.length);if(u.set(o),u.set(n,o.length),(u=i(u))[6]=15&u[6]|t,u[8]=63&u[8]|128,a){f=f||0;for(var c=0;c<16;++c)a[f+c]=u[c];return a}return function(n){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=(e[n[t+0]]+e[n[t+1]]+e[n[t+2]]+e[n[t+3]]+"-"+e[n[t+4]]+e[n[t+5]]+"-"+e[n[t+6]]+e[n[t+7]]+"-"+e[n[t+8]]+e[n[t+9]]+"-"+e[n[t+10]]+e[n[t+11]]+e[n[t+12]]+e[n[t+13]]+e[n[t+14]]+e[n[t+15]]).toLowerCase();if(!r(i))throw TypeError("Stringified UUID is invalid");return i}(u)}try{o.name=n}catch(n){}return o.DNS="6ba7b810-9dad-11d1-80b4-00c04fd430c8",o.URL="6ba7b811-9dad-11d1-80b4-00c04fd430c8",o}("v3",48,(function(n){if("string"==typeof n){var r=unescape(encodeURIComponent(n));n=new Uint8Array(r.length);for(var e=0;e<r.length;++e)n[e]=r.charCodeAt(e)}return function(n){for(var r=[],e=32*n.length,t="0123456789abcdef",i=0;i<e;i+=8){var o=n[i>>5]>>>i%32&255,a=parseInt(t.charAt(o>>>4&15)+t.charAt(15&o),16);r.push(a)}return r}(function(n,r){n[r>>5]|=128<<r%32,n[i(r)-1]=r;for(var e=1732584193,t=-271733879,a=-1732584194,l=271733878,d=0;d<n.length;d+=16){var p=e,h=t,v=a,g=l;e=f(e,t,a,l,n[d],7,-680876936),l=f(l,e,t,a,n[d+1],12,-389564586),a=f(a,l,e,t,n[d+2],17,606105819),t=f(t,a,l,e,n[d+3],22,-1044525330),e=f(e,t,a,l,n[d+4],7,-176418897),l=f(l,e,t,a,n[d+5],12,1200080426),a=f(a,l,e,t,n[d+6],17,-1473231341),t=f(t,a,l,e,n[d+7],22,-45705983),e=f(e,t,a,l,n[d+8],7,1770035416),l=f(l,e,t,a,n[d+9],12,-1958414417),a=f(a,l,e,t,n[d+10],17,-42063),t=f(t,a,l,e,n[d+11],22,-1990404162),e=f(e,t,a,l,n[d+12],7,1804603682),l=f(l,e,t,a,n[d+13],12,-40341101),a=f(a,l,e,t,n[d+14],17,-1502002290),e=u(e,t=f(t,a,l,e,n[d+15],22,1236535329),a,l,n[d+1],5,-165796510),l=u(l,e,t,a,n[d+6],9,-1069501632),a=u(a,l,e,t,n[d+11],14,643717713),t=u(t,a,l,e,n[d],20,-373897302),e=u(e,t,a,l,n[d+5],5,-701558691),l=u(l,e,t,a,n[d+10],9,38016083),a=u(a,l,e,t,n[d+15],14,-660478335),t=u(t,a,l,e,n[d+4],20,-405537848),e=u(e,t,a,l,n[d+9],5,568446438),l=u(l,e,t,a,n[d+14],9,-1019803690),a=u(a,l,e,t,n[d+3],14,-187363961),t=u(t,a,l,e,n[d+8],20,1163531501),e=u(e,t,a,l,n[d+13],5,-1444681467),l=u(l,e,t,a,n[d+2],9,-51403784),a=u(a,l,e,t,n[d+7],14,1735328473),e=c(e,t=u(t,a,l,e,n[d+12],20,-1926607734),a,l,n[d+5],4,-378558),l=c(l,e,t,a,n[d+8],11,-2022574463),a=c(a,l,e,t,n[d+11],16,1839030562),t=c(t,a,l,e,n[d+14],23,-35309556),e=c(e,t,a,l,n[d+1],4,-1530992060),l=c(l,e,t,a,n[d+4],11,1272893353),a=c(a,l,e,t,n[d+7],16,-155497632),t=c(t,a,l,e,n[d+10],23,-1094730640),e=c(e,t,a,l,n[d+13],4,681279174),l=c(l,e,t,a,n[d],11,-358537222),a=c(a,l,e,t,n[d+3],16,-722521979),t=c(t,a,l,e,n[d+6],23,76029189),e=c(e,t,a,l,n[d+9],4,-640364487),l=c(l,e,t,a,n[d+12],11,-421815835),a=c(a,l,e,t,n[d+15],16,530742520),e=s(e,t=c(t,a,l,e,n[d+2],23,-995338651),a,l,n[d],6,-198630844),l=s(l,e,t,a,n[d+7],10,1126891415),a=s(a,l,e,t,n[d+14],15,-1416354905),t=s(t,a,l,e,n[d+5],21,-57434055),e=s(e,t,a,l,n[d+12],6,1700485571),l=s(l,e,t,a,n[d+3],10,-1894986606),a=s(a,l,e,t,n[d+10],15,-1051523),t=s(t,a,l,e,n[d+1],21,-2054922799),e=s(e,t,a,l,n[d+8],6,1873313359),l=s(l,e,t,a,n[d+15],10,-30611744),a=s(a,l,e,t,n[d+6],15,-1560198380),t=s(t,a,l,e,n[d+13],21,1309151649),e=s(e,t,a,l,n[d+4],6,-145523070),l=s(l,e,t,a,n[d+11],10,-1120210379),a=s(a,l,e,t,n[d+2],15,718787259),t=s(t,a,l,e,n[d+9],21,-343485551),e=o(e,p),t=o(t,h),a=o(a,v),l=o(l,g)}return[e,t,a,l]}(function(n){if(0===n.length)return[];for(var r=8*n.length,e=new Uint32Array(i(r)),t=0;t<r;t+=8)e[t>>5]|=(255&n[t/8])<<t%32;return e}(n),8*n.length))}))}));!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).uuidv4=e()}(this,(function(){"use strict";var t,e=new Uint8Array(16);function o(){if(!t&&!(t="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return t(e)}var n=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function r(t){return"string"==typeof t&&n.test(t)}for(var i=[],u=0;u<256;++u)i.push((u+256).toString(16).substr(1));return function(t,e,n){var u=(t=t||{}).random||(t.rng||o)();if(u[6]=15&u[6]|64,u[8]=63&u[8]|128,e){n=n||0;for(var f=0;f<16;++f)e[n+f]=u[f];return e}return function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,o=(i[t[e+0]]+i[t[e+1]]+i[t[e+2]]+i[t[e+3]]+"-"+i[t[e+4]]+i[t[e+5]]+"-"+i[t[e+6]]+i[t[e+7]]+"-"+i[t[e+8]]+i[t[e+9]]+"-"+i[t[e+10]]+i[t[e+11]]+i[t[e+12]]+i[t[e+13]]+i[t[e+14]]+i[t[e+15]]).toLowerCase();if(!r(o))throw TypeError("Stringified UUID is invalid");return o}(u)}}));!function(r,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(r="undefined"!=typeof globalThis?globalThis:r||self).uuidv5=e()}(this,(function(){"use strict";var r=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function e(e){return"string"==typeof e&&r.test(e)}for(var t=[],n=0;n<256;++n)t.push((n+256).toString(16).substr(1));function a(r,e,t,n){switch(r){case 0:return e&t^~e&n;case 1:return e^t^n;case 2:return e&t^e&n^t&n;case 3:return e^t^n}}function o(r,e){return r<<e|r>>>32-e}return function(r,n,a){function o(r,o,i,f){if("string"==typeof r&&(r=function(r){r=unescape(encodeURIComponent(r));for(var e=[],t=0;t<r.length;++t)e.push(r.charCodeAt(t));return e}(r)),"string"==typeof o&&(o=function(r){if(!e(r))throw TypeError("Invalid UUID");var t,n=new Uint8Array(16);return n[0]=(t=parseInt(r.slice(0,8),16))>>>24,n[1]=t>>>16&255,n[2]=t>>>8&255,n[3]=255&t,n[4]=(t=parseInt(r.slice(9,13),16))>>>8,n[5]=255&t,n[6]=(t=parseInt(r.slice(14,18),16))>>>8,n[7]=255&t,n[8]=(t=parseInt(r.slice(19,23),16))>>>8,n[9]=255&t,n[10]=(t=parseInt(r.slice(24,36),16))/1099511627776&255,n[11]=t/4294967296&255,n[12]=t>>>24&255,n[13]=t>>>16&255,n[14]=t>>>8&255,n[15]=255&t,n}(o)),16!==o.length)throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");var s=new Uint8Array(16+r.length);if(s.set(o),s.set(r,o.length),(s=a(s))[6]=15&s[6]|n,s[8]=63&s[8]|128,i){f=f||0;for(var u=0;u<16;++u)i[f+u]=s[u];return i}return function(r){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=(t[r[n+0]]+t[r[n+1]]+t[r[n+2]]+t[r[n+3]]+"-"+t[r[n+4]]+t[r[n+5]]+"-"+t[r[n+6]]+t[r[n+7]]+"-"+t[r[n+8]]+t[r[n+9]]+"-"+t[r[n+10]]+t[r[n+11]]+t[r[n+12]]+t[r[n+13]]+t[r[n+14]]+t[r[n+15]]).toLowerCase();if(!e(a))throw TypeError("Stringified UUID is invalid");return a}(s)}try{o.name=r}catch(r){}return o.DNS="6ba7b810-9dad-11d1-80b4-00c04fd430c8",o.URL="6ba7b811-9dad-11d1-80b4-00c04fd430c8",o}("v5",80,(function(r){var e=[1518500249,1859775393,2400959708,3395469782],t=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof r){var n=unescape(encodeURIComponent(r));r=[];for(var i=0;i<n.length;++i)r.push(n.charCodeAt(i))}else Array.isArray(r)||(r=Array.prototype.slice.call(r));r.push(128);for(var f=r.length/4+2,s=Math.ceil(f/16),u=new Array(s),c=0;c<s;++c){for(var l=new Uint32Array(16),p=0;p<16;++p)l[p]=r[64*c+4*p]<<24|r[64*c+4*p+1]<<16|r[64*c+4*p+2]<<8|r[64*c+4*p+3];u[c]=l}u[s-1][14]=8*(r.length-1)/Math.pow(2,32),u[s-1][14]=Math.floor(u[s-1][14]),u[s-1][15]=8*(r.length-1)&4294967295;for(var d=0;d<s;++d){for(var h=new Uint32Array(80),v=0;v<16;++v)h[v]=u[d][v];for(var y=16;y<80;++y)h[y]=o(h[y-3]^h[y-8]^h[y-14]^h[y-16],1);for(var g=t[0],b=t[1],w=t[2],U=t[3],A=t[4],I=0;I<80;++I){var m=Math.floor(I/20),C=o(g,5)+a(m,b,w,U)+A+e[m]+h[I]>>>0;A=U,U=w,w=o(b,30)>>>0,b=g,g=C}t[0]=t[0]+g>>>0,t[1]=t[1]+b>>>0,t[2]=t[2]+w>>>0,t[3]=t[3]+U>>>0,t[4]=t[4]+A>>>0}return[t[0]>>24&255,t[0]>>16&255,t[0]>>8&255,255&t[0],t[1]>>24&255,t[1]>>16&255,t[1]>>8&255,255&t[1],t[2]>>24&255,t[2]>>16&255,t[2]>>8&255,255&t[2],t[3]>>24&255,t[3]>>16&255,t[3]>>8&255,255&t[3],t[4]>>24&255,t[4]>>16&255,t[4]>>8&255,255&t[4]]}))}));export { default as v1 } from './v1.js';
export { default as v3 } from './v3.js';
export { default as v4 } from './v4.js';
export { default as v5 } from './v5.js';
export { default as NIL } from './nil.js';
export { default as version } from './version.js';
export { default as validate } from './validate.js';
export { default as stringify } from './stringify.js';
export { default as parse } from './parse.js';import crypto from 'crypto';

function md5(bytes) {
  if (Array.isArray(bytes)) {
    bytes = Buffer.from(bytes);
  } else if (typeof bytes === 'string') {
    bytes = Buffer.from(bytes, 'utf8');
  }

  return crypto.createHash('md5').update(bytes).digest();
}

export default md5;export default '00000000-0000-0000-0000-000000000000';import validate from './validate.js';

function parse(uuid) {
  if (!validate(uuid)) {
    throw TypeError('Invalid UUID');
  }

  let v;
  const arr = new Uint8Array(16); // Parse ########-....-....-....-............

  arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;
  arr[1] = v >>> 16 & 0xff;
  arr[2] = v >>> 8 & 0xff;
  arr[3] = v & 0xff; // Parse ........-####-....-....-............

  arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;
  arr[5] = v & 0xff; // Parse ........-....-####-....-............

  arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;
  arr[7] = v & 0xff; // Parse ........-....-....-####-............

  arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;
  arr[9] = v & 0xff; // Parse ........-....-....-....-############
  // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes)

  arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;
  arr[11] = v / 0x100000000 & 0xff;
  arr[12] = v >>> 24 & 0xff;
  arr[13] = v >>> 16 & 0xff;
  arr[14] = v >>> 8 & 0xff;
  arr[15] = v & 0xff;
  return arr;
}

export default parse;export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;import crypto from 'crypto';
const rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate

let poolPtr = rnds8Pool.length;
export default function rng() {
  if (poolPtr > rnds8Pool.length - 16) {
    crypto.randomFillSync(rnds8Pool);
    poolPtr = 0;
  }

  return rnds8Pool.slice(poolPtr, poolPtr += 16);
}import crypto from 'crypto';

function sha1(bytes) {
  if (Array.isArray(bytes)) {
    bytes = Buffer.from(bytes);
  } else if (typeof bytes === 'string') {
    bytes = Buffer.from(bytes, 'utf8');
  }

  return crypto.createHash('sha1').update(bytes).digest();
}

export default sha1;import validate from './validate.js';
/**
 * Convert array of 16 byte values to UUID string format of the form:
 * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
 */

const byteToHex = [];

for (let i = 0; i < 256; ++i) {
  byteToHex.push((i + 0x100).toString(16).substr(1));
}

function stringify(arr, offset = 0) {
  // Note: Be careful editing this code!  It's been tuned for performance
  // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
  const uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID.  If this throws, it's likely due to one
  // of the following:
  // - One or more input array values don't map to a hex octet (leading to
  // "undefined" in the uuid)
  // - Invalid input values for the RFC `version` or `variant` fields

  if (!validate(uuid)) {
    throw TypeError('Stringified UUID is invalid');
  }

  return uuid;
}

export default stringify;import rng from './rng.js';
import stringify from './stringify.js'; // **`v1()` - Generate time-based UUID**
//
// Inspired by https://github.com/LiosK/UUID.js
// and http://docs.python.org/library/uuid.html

let _nodeId;

let _clockseq; // Previous uuid creation time


let _lastMSecs = 0;
let _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details

function v1(options, buf, offset) {
  let i = buf && offset || 0;
  const b = buf || new Array(16);
  options = options || {};
  let node = options.node || _nodeId;
  let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not
  // specified.  We do this lazily to minimize issues related to insufficient
  // system entropy.  See #189

  if (node == null || clockseq == null) {
    const seedBytes = options.random || (options.rng || rng)();

    if (node == null) {
      // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
      node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];
    }

    if (clockseq == null) {
      // Per 4.2.2, randomize (14 bit) clockseq
      clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
    }
  } // UUID timestamps are 100 nano-second units since the Gregorian epoch,
  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so
  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.


  let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock
  // cycle to simulate higher resolution clock

  let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)

  const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression

  if (dt < 0 && options.clockseq === undefined) {
    clockseq = clockseq + 1 & 0x3fff;
  } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
  // time interval


  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
    nsecs = 0;
  } // Per 4.2.1.2 Throw error if too many uuids are requested


  if (nsecs >= 10000) {
    throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
  }

  _lastMSecs = msecs;
  _lastNSecs = nsecs;
  _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch

  msecs += 12219292800000; // `time_low`

  const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
  b[i++] = tl >>> 24 & 0xff;
  b[i++] = tl >>> 16 & 0xff;
  b[i++] = tl >>> 8 & 0xff;
  b[i++] = tl & 0xff; // `time_mid`

  const tmh = msecs / 0x100000000 * 10000 & 0xfffffff;
  b[i++] = tmh >>> 8 & 0xff;
  b[i++] = tmh & 0xff; // `time_high_and_version`

  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version

  b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)

  b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`

  b[i++] = clockseq & 0xff; // `node`

  for (let n = 0; n < 6; ++n) {
    b[i + n] = node[n];
  }

  return buf || stringify(b);
}

export default v1;import v35 from './v35.js';
import md5 from './md5.js';
const v3 = v35('v3', 0x30, md5);
export default v3;import stringify from './stringify.js';
import parse from './parse.js';

function stringToBytes(str) {
  str = unescape(encodeURIComponent(str)); // UTF8 escape

  const bytes = [];

  for (let i = 0; i < str.length; ++i) {
    bytes.push(str.charCodeAt(i));
  }

  return bytes;
}

export const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
export const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
export default function (name, version, hashfunc) {
  function generateUUID(value, namespace, buf, offset) {
    if (typeof value === 'string') {
      value = stringToBytes(value);
    }

    if (typeof namespace === 'string') {
      namespace = parse(namespace);
    }

    if (namespace.length !== 16) {
      throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');
    } // Compute hash of namespace and value, Per 4.3
    // Future: Use spread syntax when supported on all platforms, e.g. `bytes =
    // hashfunc([...namespace, ... value])`


    let bytes = new Uint8Array(16 + value.length);
    bytes.set(namespace);
    bytes.set(value, namespace.length);
    bytes = hashfunc(bytes);
    bytes[6] = bytes[6] & 0x0f | version;
    bytes[8] = bytes[8] & 0x3f | 0x80;

    if (buf) {
      offset = offset || 0;

      for (let i = 0; i < 16; ++i) {
        buf[offset + i] = bytes[i];
      }

      return buf;
    }

    return stringify(bytes);
  } // Function#name is not settable on some platforms (#270)


  try {
    generateUUID.name = name; // eslint-disable-next-line no-empty
  } catch (err) {} // For CommonJS default export support


  generateUUID.DNS = DNS;
  generateUUID.URL = URL;
  return generateUUID;
}import rng from './rng.js';
import stringify from './stringify.js';

function v4(options, buf, offset) {
  options = options || {};
  const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`

  rnds[6] = rnds[6] & 0x0f | 0x40;
  rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided

  if (buf) {
    offset = offset || 0;

    for (let i = 0; i < 16; ++i) {
      buf[offset + i] = rnds[i];
    }

    return buf;
  }

  return stringify(rnds);
}

export default v4;import v35 from './v35.js';
import sha1 from './sha1.js';
const v5 = v35('v5', 0x50, sha1);
export default v5;import REGEX from './regex.js';

function validate(uuid) {
  return typeof uuid === 'string' && REGEX.test(uuid);
}

export default validate;import validate from './validate.js';

function version(uuid) {
  if (!validate(uuid)) {
    throw TypeError('Invalid UUID');
  }

  return parseInt(uuid.substr(14, 1), 16);
}

export default version;export { default as v1 } from './v1.js';
export { default as v3 } from './v3.js';
export { default as v4 } from './v4.js';
export { default as v5 } from './v5.js';
export { default as NIL } from './nil.js';
export { default as version } from './version.js';
export { default as validate } from './validate.js';
export { default as stringify } from './stringify.js';
export { default as parse } from './parse.js';/*
 * Browser-compatible JavaScript MD5
 *
 * Modification of JavaScript MD5
 * https://github.com/blueimp/JavaScript-MD5
 *
 * Copyright 2011, Sebastian Tschan
 * https://blueimp.net
 *
 * Licensed under the MIT license:
 * https://opensource.org/licenses/MIT
 *
 * Based on
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 */
function md5(bytes) {
  if (typeof bytes === 'string') {
    var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape

    bytes = new Uint8Array(msg.length);

    for (var i = 0; i < msg.length; ++i) {
      bytes[i] = msg.charCodeAt(i);
    }
  }

  return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));
}
/*
 * Convert an array of little-endian words to an array of bytes
 */


function md5ToHexEncodedArray(input) {
  var output = [];
  var length32 = input.length * 32;
  var hexTab = '0123456789abcdef';

  for (var i = 0; i < length32; i += 8) {
    var x = input[i >> 5] >>> i % 32 & 0xff;
    var hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);
    output.push(hex);
  }

  return output;
}
/**
 * Calculate output length with padding and bit length
 */


function getOutputLength(inputLength8) {
  return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;
}
/*
 * Calculate the MD5 of an array of little-endian words, and a bit length.
 */


function wordsToMd5(x, len) {
  /* append padding */
  x[len >> 5] |= 0x80 << len % 32;
  x[getOutputLength(len) - 1] = len;
  var a = 1732584193;
  var b = -271733879;
  var c = -1732584194;
  var d = 271733878;

  for (var i = 0; i < x.length; i += 16) {
    var olda = a;
    var oldb = b;
    var oldc = c;
    var oldd = d;
    a = md5ff(a, b, c, d, x[i], 7, -680876936);
    d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);
    c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);
    b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
    a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);
    d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
    c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
    b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);
    a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
    d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
    c = md5ff(c, d, a, b, x[i + 10], 17, -42063);
    b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
    a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
    d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);
    c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
    b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
    a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);
    d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
    c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);
    b = md5gg(b, c, d, a, x[i], 20, -373897302);
    a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);
    d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);
    c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);
    b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);
    a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);
    d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
    c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);
    b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
    a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
    d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);
    c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
    b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
    a = md5hh(a, b, c, d, x[i + 5], 4, -378558);
    d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
    c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
    b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);
    a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
    d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
    c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);
    b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
    a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);
    d = md5hh(d, a, b, c, x[i], 11, -358537222);
    c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);
    b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);
    a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);
    d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);
    c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);
    b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);
    a = md5ii(a, b, c, d, x[i], 6, -198630844);
    d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
    c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
    b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);
    a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
    d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
    c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);
    b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
    a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
    d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);
    c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
    b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
    a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);
    d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
    c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);
    b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);
    a = safeAdd(a, olda);
    b = safeAdd(b, oldb);
    c = safeAdd(c, oldc);
    d = safeAdd(d, oldd);
  }

  return [a, b, c, d];
}
/*
 * Convert an array bytes to an array of little-endian words
 * Characters >255 have their high-byte silently ignored.
 */


function bytesToWords(input) {
  if (input.length === 0) {
    return [];
  }

  var length8 = input.length * 8;
  var output = new Uint32Array(getOutputLength(length8));

  for (var i = 0; i < length8; i += 8) {
    output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;
  }

  return output;
}
/*
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
 * to work around bugs in some JS interpreters.
 */


function safeAdd(x, y) {
  var lsw = (x & 0xffff) + (y & 0xffff);
  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return msw << 16 | lsw & 0xffff;
}
/*
 * Bitwise rotate a 32-bit number to the left.
 */


function bitRotateLeft(num, cnt) {
  return num << cnt | num >>> 32 - cnt;
}
/*
 * These functions implement the four basic operations the algorithm uses.
 */


function md5cmn(q, a, b, x, s, t) {
  return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);
}

function md5ff(a, b, c, d, x, s, t) {
  return md5cmn(b & c | ~b & d, a, b, x, s, t);
}

function md5gg(a, b, c, d, x, s, t) {
  return md5cmn(b & d | c & ~d, a, b, x, s, t);
}

function md5hh(a, b, c, d, x, s, t) {
  return md5cmn(b ^ c ^ d, a, b, x, s, t);
}

function md5ii(a, b, c, d, x, s, t) {
  return md5cmn(c ^ (b | ~d), a, b, x, s, t);
}

export default md5;export default '00000000-0000-0000-0000-000000000000';import validate from './validate.js';

function parse(uuid) {
  if (!validate(uuid)) {
    throw TypeError('Invalid UUID');
  }

  var v;
  var arr = new Uint8Array(16); // Parse ########-....-....-....-............

  arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;
  arr[1] = v >>> 16 & 0xff;
  arr[2] = v >>> 8 & 0xff;
  arr[3] = v & 0xff; // Parse ........-####-....-....-............

  arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;
  arr[5] = v & 0xff; // Parse ........-....-####-....-............

  arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;
  arr[7] = v & 0xff; // Parse ........-....-....-####-............

  arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;
  arr[9] = v & 0xff; // Parse ........-....-....-....-############
  // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes)

  arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;
  arr[11] = v / 0x100000000 & 0xff;
  arr[12] = v >>> 24 & 0xff;
  arr[13] = v >>> 16 & 0xff;
  arr[14] = v >>> 8 & 0xff;
  arr[15] = v & 0xff;
  return arr;
}

export default parse;export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;// Unique ID creation requires a high quality random # generator. In the browser we therefore
// require the crypto API and do not support built-in fallback to lower quality random number
// generators (like Math.random()).
var getRandomValues;
var rnds8 = new Uint8Array(16);
export default function rng() {
  // lazy load so that environments that need to polyfill have a chance to do so
  if (!getRandomValues) {
    // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. Also,
    // find the complete implementation of crypto (msCrypto) on IE11.
    getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);

    if (!getRandomValues) {
      throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');
    }
  }

  return getRandomValues(rnds8);
}// Adapted from Chris Veness' SHA1 code at
// http://www.movable-type.co.uk/scripts/sha1.html
function f(s, x, y, z) {
  switch (s) {
    case 0:
      return x & y ^ ~x & z;

    case 1:
      return x ^ y ^ z;

    case 2:
      return x & y ^ x & z ^ y & z;

    case 3:
      return x ^ y ^ z;
  }
}

function ROTL(x, n) {
  return x << n | x >>> 32 - n;
}

function sha1(bytes) {
  var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];
  var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];

  if (typeof bytes === 'string') {
    var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape

    bytes = [];

    for (var i = 0; i < msg.length; ++i) {
      bytes.push(msg.charCodeAt(i));
    }
  } else if (!Array.isArray(bytes)) {
    // Convert Array-like to Array
    bytes = Array.prototype.slice.call(bytes);
  }

  bytes.push(0x80);
  var l = bytes.length / 4 + 2;
  var N = Math.ceil(l / 16);
  var M = new Array(N);

  for (var _i = 0; _i < N; ++_i) {
    var arr = new Uint32Array(16);

    for (var j = 0; j < 16; ++j) {
      arr[j] = bytes[_i * 64 + j * 4] << 24 | bytes[_i * 64 + j * 4 + 1] << 16 | bytes[_i * 64 + j * 4 + 2] << 8 | bytes[_i * 64 + j * 4 + 3];
    }

    M[_i] = arr;
  }

  M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);
  M[N - 1][14] = Math.floor(M[N - 1][14]);
  M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;

  for (var _i2 = 0; _i2 < N; ++_i2) {
    var W = new Uint32Array(80);

    for (var t = 0; t < 16; ++t) {
      W[t] = M[_i2][t];
    }

    for (var _t = 16; _t < 80; ++_t) {
      W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1);
    }

    var a = H[0];
    var b = H[1];
    var c = H[2];
    var d = H[3];
    var e = H[4];

    for (var _t2 = 0; _t2 < 80; ++_t2) {
      var s = Math.floor(_t2 / 20);
      var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 0;
      e = d;
      d = c;
      c = ROTL(b, 30) >>> 0;
      b = a;
      a = T;
    }

    H[0] = H[0] + a >>> 0;
    H[1] = H[1] + b >>> 0;
    H[2] = H[2] + c >>> 0;
    H[3] = H[3] + d >>> 0;
    H[4] = H[4] + e >>> 0;
  }

  return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];
}

export default sha1;import validate from './validate.js';
/**
 * Convert array of 16 byte values to UUID string format of the form:
 * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
 */

var byteToHex = [];

for (var i = 0; i < 256; ++i) {
  byteToHex.push((i + 0x100).toString(16).substr(1));
}

function stringify(arr) {
  var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  // Note: Be careful editing this code!  It's been tuned for performance
  // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
  var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID.  If this throws, it's likely due to one
  // of the following:
  // - One or more input array values don't map to a hex octet (leading to
  // "undefined" in the uuid)
  // - Invalid input values for the RFC `version` or `variant` fields

  if (!validate(uuid)) {
    throw TypeError('Stringified UUID is invalid');
  }

  return uuid;
}

export default stringify;import rng from './rng.js';
import stringify from './stringify.js'; // **`v1()` - Generate time-based UUID**
//
// Inspired by https://github.com/LiosK/UUID.js
// and http://docs.python.org/library/uuid.html

var _nodeId;

var _clockseq; // Previous uuid creation time


var _lastMSecs = 0;
var _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details

function v1(options, buf, offset) {
  var i = buf && offset || 0;
  var b = buf || new Array(16);
  options = options || {};
  var node = options.node || _nodeId;
  var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not
  // specified.  We do this lazily to minimize issues related to insufficient
  // system entropy.  See #189

  if (node == null || clockseq == null) {
    var seedBytes = options.random || (options.rng || rng)();

    if (node == null) {
      // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
      node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];
    }

    if (clockseq == null) {
      // Per 4.2.2, randomize (14 bit) clockseq
      clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
    }
  } // UUID timestamps are 100 nano-second units since the Gregorian epoch,
  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so
  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.


  var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock
  // cycle to simulate higher resolution clock

  var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)

  var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression

  if (dt < 0 && options.clockseq === undefined) {
    clockseq = clockseq + 1 & 0x3fff;
  } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
  // time interval


  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
    nsecs = 0;
  } // Per 4.2.1.2 Throw error if too many uuids are requested


  if (nsecs >= 10000) {
    throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
  }

  _lastMSecs = msecs;
  _lastNSecs = nsecs;
  _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch

  msecs += 12219292800000; // `time_low`

  var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
  b[i++] = tl >>> 24 & 0xff;
  b[i++] = tl >>> 16 & 0xff;
  b[i++] = tl >>> 8 & 0xff;
  b[i++] = tl & 0xff; // `time_mid`

  var tmh = msecs / 0x100000000 * 10000 & 0xfffffff;
  b[i++] = tmh >>> 8 & 0xff;
  b[i++] = tmh & 0xff; // `time_high_and_version`

  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version

  b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)

  b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`

  b[i++] = clockseq & 0xff; // `node`

  for (var n = 0; n < 6; ++n) {
    b[i + n] = node[n];
  }

  return buf || stringify(b);
}

export default v1;import v35 from './v35.js';
import md5 from './md5.js';
var v3 = v35('v3', 0x30, md5);
export default v3;import stringify from './stringify.js';
import parse from './parse.js';

function stringToBytes(str) {
  str = unescape(encodeURIComponent(str)); // UTF8 escape

  var bytes = [];

  for (var i = 0; i < str.length; ++i) {
    bytes.push(str.charCodeAt(i));
  }

  return bytes;
}

export var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
export var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
export default function (name, version, hashfunc) {
  function generateUUID(value, namespace, buf, offset) {
    if (typeof value === 'string') {
      value = stringToBytes(value);
    }

    if (typeof namespace === 'string') {
      namespace = parse(namespace);
    }

    if (namespace.length !== 16) {
      throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');
    } // Compute hash of namespace and value, Per 4.3
    // Future: Use spread syntax when supported on all platforms, e.g. `bytes =
    // hashfunc([...namespace, ... value])`


    var bytes = new Uint8Array(16 + value.length);
    bytes.set(namespace);
    bytes.set(value, namespace.length);
    bytes = hashfunc(bytes);
    bytes[6] = bytes[6] & 0x0f | version;
    bytes[8] = bytes[8] & 0x3f | 0x80;

    if (buf) {
      offset = offset || 0;

      for (var i = 0; i < 16; ++i) {
        buf[offset + i] = bytes[i];
      }

      return buf;
    }

    return stringify(bytes);
  } // Function#name is not settable on some platforms (#270)


  try {
    generateUUID.name = name; // eslint-disable-next-line no-empty
  } catch (err) {} // For CommonJS default export support


  generateUUID.DNS = DNS;
  generateUUID.URL = URL;
  return generateUUID;
}import rng from './rng.js';
import stringify from './stringify.js';

function v4(options, buf, offset) {
  options = options || {};
  var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`

  rnds[6] = rnds[6] & 0x0f | 0x40;
  rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided

  if (buf) {
    offset = offset || 0;

    for (var i = 0; i < 16; ++i) {
      buf[offset + i] = rnds[i];
    }

    return buf;
  }

  return stringify(rnds);
}

export default v4;import v35 from './v35.js';
import sha1 from './sha1.js';
var v5 = v35('v5', 0x50, sha1);
export default v5;import REGEX from './regex.js';

function validate(uuid) {
  return typeof uuid === 'string' && REGEX.test(uuid);
}

export default validate;import validate from './validate.js';

function version(uuid) {
  if (!validate(uuid)) {
    throw TypeError('Invalid UUID');
  }

  return parseInt(uuid.substr(14, 1), 16);
}

export default version;#!/usr/bin/env node
require('../uuid-bin');
# Contributing

Please feel free to file GitHub Issues or propose Pull Requests. We're always happy to discuss improvements to this library!

## Testing

```shell
npm test
```

## Releasing

Releases are supposed to be done from master, version bumping is automated through [`standard-version`](https://github.com/conventional-changelog/standard-version):

```shell
npm run release -- --dry-run  # verify output manually
npm run release               # follow the instructions from the output of this command
```
The MIT License (MIT)

Copyright (c) 2010-2020 Robert Kieffer and other contributors

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

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

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "name": "uuid",
  "version": "8.3.2",
  "description": "RFC4122 (v1, v4, and v5) UUIDs",
  "commitlint": {
    "extends": [
      "@commitlint/config-conventional"
    ]
  },
  "license": "MIT",
  "bin": {
    "uuid": "./dist/bin/uuid"
  },
  "sideEffects": false,
  "main": "./dist/index.js",
  "exports": {
    ".": {
      "node": {
        "module": "./dist/esm-node/index.js",
        "require": "./dist/index.js",
        "import": "./wrapper.mjs"
      },
      "default": "./dist/esm-browser/index.js"
    },
    "./package.json": "./package.json"
  },
  "module": "./dist/esm-node/index.js",
  "browser": {
    "./dist/md5.js": "./dist/md5-browser.js",
    "./dist/rng.js": "./dist/rng-browser.js",
    "./dist/sha1.js": "./dist/sha1-browser.js",
    "./dist/esm-node/index.js": "./dist/esm-browser/index.js"
  },
  "files": [
    "CHANGELOG.md",
    "CONTRIBUTING.md",
    "LICENSE.md",
    "README.md",
    "dist",
    "wrapper.mjs"
  ],
  "devDependencies": {
    "@babel/cli": "7.11.6",
    "@babel/core": "7.11.6",
    "@babel/preset-env": "7.11.5",
    "@commitlint/cli": "11.0.0",
    "@commitlint/config-conventional": "11.0.0",
    "@rollup/plugin-node-resolve": "9.0.0",
    "babel-eslint": "10.1.0",
    "bundlewatch": "0.3.1",
    "eslint": "7.10.0",
    "eslint-config-prettier": "6.12.0",
    "eslint-config-standard": "14.1.1",
    "eslint-plugin-import": "2.22.1",
    "eslint-plugin-node": "11.1.0",
    "eslint-plugin-prettier": "3.1.4",
    "eslint-plugin-promise": "4.2.1",
    "eslint-plugin-standard": "4.0.1",
    "husky": "4.3.0",
    "jest": "25.5.4",
    "lint-staged": "10.4.0",
    "npm-run-all": "4.1.5",
    "optional-dev-dependency": "2.0.1",
    "prettier": "2.1.2",
    "random-seed": "0.3.0",
    "rollup": "2.28.2",
    "rollup-plugin-terser": "7.0.2",
    "runmd": "1.3.2",
    "standard-version": "9.0.0"
  },
  "optionalDevDependencies": {
    "@wdio/browserstack-service": "6.4.0",
    "@wdio/cli": "6.4.0",
    "@wdio/jasmine-framework": "6.4.0",
    "@wdio/local-runner": "6.4.0",
    "@wdio/spec-reporter": "6.4.0",
    "@wdio/static-server-service": "6.4.0",
    "@wdio/sync": "6.4.0"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/uuidjs/uuid.git"
  },
  "husky": {
    "hooks": {
      "commit-msg": "commitlint -E HUSKY_GIT_PARAMS",
      "pre-commit": "lint-staged"
    }
  },
  "lint-staged": {
    "*.{js,jsx,json,md}": [
      "prettier --write"
    ],
    "*.{js,jsx}": [
      "eslint --fix"
    ]
  },
  "standard-version": {
    "scripts": {
      "postchangelog": "prettier --write CHANGELOG.md"
    }
  }
}import uuid from './dist/index.js';
export const v1 = uuid.v1;
export const v3 = uuid.v3;
export const v4 = uuid.v4;
export const v5 = uuid.v5;
export const NIL = uuid.NIL;
export const version = uuid.version;
export const validate = uuid.validate;
export const stringify = uuid.stringify;
export const parse = uuid.parse;
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
Object.defineProperty(exports, "v1", {
  enumerable: true,
  get: function () {
    return _v.default;
  }
});
Object.defineProperty(exports, "v3", {
  enumerable: true,
  get: function () {
    return _v2.default;
  }
});
Object.defineProperty(exports, "v4", {
  enumerable: true,
  get: function () {
    return _v3.default;
  }
});
Object.defineProperty(exports, "v5", {
  enumerable: true,
  get: function () {
    return _v4.default;
  }
});
Object.defineProperty(exports, "NIL", {
  enumerable: true,
  get: function () {
    return _nil.default;
  }
});
Object.defineProperty(exports, "version", {
  enumerable: true,
  get: function () {
    return _version.default;
  }
});
Object.defineProperty(exports, "validate", {
  enumerable: true,
  get: function () {
    return _validate.default;
  }
});
Object.defineProperty(exports, "stringify", {
  enumerable: true,
  get: function () {
    return _stringify.default;
  }
});
Object.defineProperty(exports, "parse", {
  enumerable: true,
  get: function () {
    return _parse.default;
  }
});

var _v = _interopRequireDefault(require("./v1.js"));

var _v2 = _interopRequireDefault(require("./v3.js"));

var _v3 = _interopRequireDefault(require("./v4.js"));

var _v4 = _interopRequireDefault(require("./v5.js"));

var _nil = _interopRequireDefault(require("./nil.js"));

var _version = _interopRequireDefault(require("./version.js"));

var _validate = _interopRequireDefault(require("./validate.js"));

var _stringify = _interopRequireDefault(require("./stringify.js"));

var _parse = _interopRequireDefault(require("./parse.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/*
 * Browser-compatible JavaScript MD5
 *
 * Modification of JavaScript MD5
 * https://github.com/blueimp/JavaScript-MD5
 *
 * Copyright 2011, Sebastian Tschan
 * https://blueimp.net
 *
 * Licensed under the MIT license:
 * https://opensource.org/licenses/MIT
 *
 * Based on
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 */
function md5(bytes) {
  if (typeof bytes === 'string') {
    const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape

    bytes = new Uint8Array(msg.length);

    for (let i = 0; i < msg.length; ++i) {
      bytes[i] = msg.charCodeAt(i);
    }
  }

  return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));
}
/*
 * Convert an array of little-endian words to an array of bytes
 */


function md5ToHexEncodedArray(input) {
  const output = [];
  const length32 = input.length * 32;
  const hexTab = '0123456789abcdef';

  for (let i = 0; i < length32; i += 8) {
    const x = input[i >> 5] >>> i % 32 & 0xff;
    const hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);
    output.push(hex);
  }

  return output;
}
/**
 * Calculate output length with padding and bit length
 */


function getOutputLength(inputLength8) {
  return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;
}
/*
 * Calculate the MD5 of an array of little-endian words, and a bit length.
 */


function wordsToMd5(x, len) {
  /* append padding */
  x[len >> 5] |= 0x80 << len % 32;
  x[getOutputLength(len) - 1] = len;
  let a = 1732584193;
  let b = -271733879;
  let c = -1732584194;
  let d = 271733878;

  for (let i = 0; i < x.length; i += 16) {
    const olda = a;
    const oldb = b;
    const oldc = c;
    const oldd = d;
    a = md5ff(a, b, c, d, x[i], 7, -680876936);
    d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);
    c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);
    b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
    a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);
    d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
    c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
    b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);
    a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
    d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
    c = md5ff(c, d, a, b, x[i + 10], 17, -42063);
    b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
    a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
    d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);
    c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
    b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
    a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);
    d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
    c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);
    b = md5gg(b, c, d, a, x[i], 20, -373897302);
    a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);
    d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);
    c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);
    b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);
    a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);
    d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
    c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);
    b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
    a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
    d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);
    c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
    b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
    a = md5hh(a, b, c, d, x[i + 5], 4, -378558);
    d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
    c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
    b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);
    a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
    d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
    c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);
    b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
    a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);
    d = md5hh(d, a, b, c, x[i], 11, -358537222);
    c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);
    b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);
    a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);
    d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);
    c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);
    b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);
    a = md5ii(a, b, c, d, x[i], 6, -198630844);
    d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
    c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
    b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);
    a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
    d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
    c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);
    b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
    a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
    d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);
    c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
    b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
    a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);
    d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
    c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);
    b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);
    a = safeAdd(a, olda);
    b = safeAdd(b, oldb);
    c = safeAdd(c, oldc);
    d = safeAdd(d, oldd);
  }

  return [a, b, c, d];
}
/*
 * Convert an array bytes to an array of little-endian words
 * Characters >255 have their high-byte silently ignored.
 */


function bytesToWords(input) {
  if (input.length === 0) {
    return [];
  }

  const length8 = input.length * 8;
  const output = new Uint32Array(getOutputLength(length8));

  for (let i = 0; i < length8; i += 8) {
    output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;
  }

  return output;
}
/*
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
 * to work around bugs in some JS interpreters.
 */


function safeAdd(x, y) {
  const lsw = (x & 0xffff) + (y & 0xffff);
  const msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return msw << 16 | lsw & 0xffff;
}
/*
 * Bitwise rotate a 32-bit number to the left.
 */


function bitRotateLeft(num, cnt) {
  return num << cnt | num >>> 32 - cnt;
}
/*
 * These functions implement the four basic operations the algorithm uses.
 */


function md5cmn(q, a, b, x, s, t) {
  return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);
}

function md5ff(a, b, c, d, x, s, t) {
  return md5cmn(b & c | ~b & d, a, b, x, s, t);
}

function md5gg(a, b, c, d, x, s, t) {
  return md5cmn(b & d | c & ~d, a, b, x, s, t);
}

function md5hh(a, b, c, d, x, s, t) {
  return md5cmn(b ^ c ^ d, a, b, x, s, t);
}

function md5ii(a, b, c, d, x, s, t) {
  return md5cmn(c ^ (b | ~d), a, b, x, s, t);
}

var _default = md5;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _crypto = _interopRequireDefault(require("crypto"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function md5(bytes) {
  if (Array.isArray(bytes)) {
    bytes = Buffer.from(bytes);
  } else if (typeof bytes === 'string') {
    bytes = Buffer.from(bytes, 'utf8');
  }

  return _crypto.default.createHash('md5').update(bytes).digest();
}

var _default = md5;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var _default = '00000000-0000-0000-0000-000000000000';
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _validate = _interopRequireDefault(require("./validate.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function parse(uuid) {
  if (!(0, _validate.default)(uuid)) {
    throw TypeError('Invalid UUID');
  }

  let v;
  const arr = new Uint8Array(16); // Parse ########-....-....-....-............

  arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;
  arr[1] = v >>> 16 & 0xff;
  arr[2] = v >>> 8 & 0xff;
  arr[3] = v & 0xff; // Parse ........-####-....-....-............

  arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;
  arr[5] = v & 0xff; // Parse ........-....-####-....-............

  arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;
  arr[7] = v & 0xff; // Parse ........-....-....-####-............

  arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;
  arr[9] = v & 0xff; // Parse ........-....-....-....-############
  // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes)

  arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;
  arr[11] = v / 0x100000000 & 0xff;
  arr[12] = v >>> 24 & 0xff;
  arr[13] = v >>> 16 & 0xff;
  arr[14] = v >>> 8 & 0xff;
  arr[15] = v & 0xff;
  return arr;
}

var _default = parse;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var _default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = rng;
// Unique ID creation requires a high quality random # generator. In the browser we therefore
// require the crypto API and do not support built-in fallback to lower quality random number
// generators (like Math.random()).
let getRandomValues;
const rnds8 = new Uint8Array(16);

function rng() {
  // lazy load so that environments that need to polyfill have a chance to do so
  if (!getRandomValues) {
    // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. Also,
    // find the complete implementation of crypto (msCrypto) on IE11.
    getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);

    if (!getRandomValues) {
      throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');
    }
  }

  return getRandomValues(rnds8);
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = rng;

var _crypto = _interopRequireDefault(require("crypto"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate

let poolPtr = rnds8Pool.length;

function rng() {
  if (poolPtr > rnds8Pool.length - 16) {
    _crypto.default.randomFillSync(rnds8Pool);

    poolPtr = 0;
  }

  return rnds8Pool.slice(poolPtr, poolPtr += 16);
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

// Adapted from Chris Veness' SHA1 code at
// http://www.movable-type.co.uk/scripts/sha1.html
function f(s, x, y, z) {
  switch (s) {
    case 0:
      return x & y ^ ~x & z;

    case 1:
      return x ^ y ^ z;

    case 2:
      return x & y ^ x & z ^ y & z;

    case 3:
      return x ^ y ^ z;
  }
}

function ROTL(x, n) {
  return x << n | x >>> 32 - n;
}

function sha1(bytes) {
  const K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];
  const H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];

  if (typeof bytes === 'string') {
    const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape

    bytes = [];

    for (let i = 0; i < msg.length; ++i) {
      bytes.push(msg.charCodeAt(i));
    }
  } else if (!Array.isArray(bytes)) {
    // Convert Array-like to Array
    bytes = Array.prototype.slice.call(bytes);
  }

  bytes.push(0x80);
  const l = bytes.length / 4 + 2;
  const N = Math.ceil(l / 16);
  const M = new Array(N);

  for (let i = 0; i < N; ++i) {
    const arr = new Uint32Array(16);

    for (let j = 0; j < 16; ++j) {
      arr[j] = bytes[i * 64 + j * 4] << 24 | bytes[i * 64 + j * 4 + 1] << 16 | bytes[i * 64 + j * 4 + 2] << 8 | bytes[i * 64 + j * 4 + 3];
    }

    M[i] = arr;
  }

  M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);
  M[N - 1][14] = Math.floor(M[N - 1][14]);
  M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;

  for (let i = 0; i < N; ++i) {
    const W = new Uint32Array(80);

    for (let t = 0; t < 16; ++t) {
      W[t] = M[i][t];
    }

    for (let t = 16; t < 80; ++t) {
      W[t] = ROTL(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1);
    }

    let a = H[0];
    let b = H[1];
    let c = H[2];
    let d = H[3];
    let e = H[4];

    for (let t = 0; t < 80; ++t) {
      const s = Math.floor(t / 20);
      const T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[t] >>> 0;
      e = d;
      d = c;
      c = ROTL(b, 30) >>> 0;
      b = a;
      a = T;
    }

    H[0] = H[0] + a >>> 0;
    H[1] = H[1] + b >>> 0;
    H[2] = H[2] + c >>> 0;
    H[3] = H[3] + d >>> 0;
    H[4] = H[4] + e >>> 0;
  }

  return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];
}

var _default = sha1;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _crypto = _interopRequireDefault(require("crypto"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function sha1(bytes) {
  if (Array.isArray(bytes)) {
    bytes = Buffer.from(bytes);
  } else if (typeof bytes === 'string') {
    bytes = Buffer.from(bytes, 'utf8');
  }

  return _crypto.default.createHash('sha1').update(bytes).digest();
}

var _default = sha1;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _validate = _interopRequireDefault(require("./validate.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/**
 * Convert array of 16 byte values to UUID string format of the form:
 * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
 */
const byteToHex = [];

for (let i = 0; i < 256; ++i) {
  byteToHex.push((i + 0x100).toString(16).substr(1));
}

function stringify(arr, offset = 0) {
  // Note: Be careful editing this code!  It's been tuned for performance
  // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
  const uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID.  If this throws, it's likely due to one
  // of the following:
  // - One or more input array values don't map to a hex octet (leading to
  // "undefined" in the uuid)
  // - Invalid input values for the RFC `version` or `variant` fields

  if (!(0, _validate.default)(uuid)) {
    throw TypeError('Stringified UUID is invalid');
  }

  return uuid;
}

var _default = stringify;
exports.default = _default;"use strict";

var _assert = _interopRequireDefault(require("assert"));

var _v = _interopRequireDefault(require("./v1.js"));

var _v2 = _interopRequireDefault(require("./v3.js"));

var _v3 = _interopRequireDefault(require("./v4.js"));

var _v4 = _interopRequireDefault(require("./v5.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function usage() {
  console.log('Usage:');
  console.log('  uuid');
  console.log('  uuid v1');
  console.log('  uuid v3 <name> <namespace uuid>');
  console.log('  uuid v4');
  console.log('  uuid v5 <name> <namespace uuid>');
  console.log('  uuid --help');
  console.log('\nNote: <namespace uuid> may be "URL" or "DNS" to use the corresponding UUIDs defined by RFC4122');
}

const args = process.argv.slice(2);

if (args.indexOf('--help') >= 0) {
  usage();
  process.exit(0);
}

const version = args.shift() || 'v4';

switch (version) {
  case 'v1':
    console.log((0, _v.default)());
    break;

  case 'v3':
    {
      const name = args.shift();
      let namespace = args.shift();
      (0, _assert.default)(name != null, 'v3 name not specified');
      (0, _assert.default)(namespace != null, 'v3 namespace not specified');

      if (namespace === 'URL') {
        namespace = _v2.default.URL;
      }

      if (namespace === 'DNS') {
        namespace = _v2.default.DNS;
      }

      console.log((0, _v2.default)(name, namespace));
      break;
    }

  case 'v4':
    console.log((0, _v3.default)());
    break;

  case 'v5':
    {
      const name = args.shift();
      let namespace = args.shift();
      (0, _assert.default)(name != null, 'v5 name not specified');
      (0, _assert.default)(namespace != null, 'v5 namespace not specified');

      if (namespace === 'URL') {
        namespace = _v4.default.URL;
      }

      if (namespace === 'DNS') {
        namespace = _v4.default.DNS;
      }

      console.log((0, _v4.default)(name, namespace));
      break;
    }

  default:
    usage();
    process.exit(1);
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _rng = _interopRequireDefault(require("./rng.js"));

var _stringify = _interopRequireDefault(require("./stringify.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// **`v1()` - Generate time-based UUID**
//
// Inspired by https://github.com/LiosK/UUID.js
// and http://docs.python.org/library/uuid.html
let _nodeId;

let _clockseq; // Previous uuid creation time


let _lastMSecs = 0;
let _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details

function v1(options, buf, offset) {
  let i = buf && offset || 0;
  const b = buf || new Array(16);
  options = options || {};
  let node = options.node || _nodeId;
  let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not
  // specified.  We do this lazily to minimize issues related to insufficient
  // system entropy.  See #189

  if (node == null || clockseq == null) {
    const seedBytes = options.random || (options.rng || _rng.default)();

    if (node == null) {
      // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
      node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];
    }

    if (clockseq == null) {
      // Per 4.2.2, randomize (14 bit) clockseq
      clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
    }
  } // UUID timestamps are 100 nano-second units since the Gregorian epoch,
  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so
  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.


  let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock
  // cycle to simulate higher resolution clock

  let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)

  const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression

  if (dt < 0 && options.clockseq === undefined) {
    clockseq = clockseq + 1 & 0x3fff;
  } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
  // time interval


  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
    nsecs = 0;
  } // Per 4.2.1.2 Throw error if too many uuids are requested


  if (nsecs >= 10000) {
    throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
  }

  _lastMSecs = msecs;
  _lastNSecs = nsecs;
  _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch

  msecs += 12219292800000; // `time_low`

  const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
  b[i++] = tl >>> 24 & 0xff;
  b[i++] = tl >>> 16 & 0xff;
  b[i++] = tl >>> 8 & 0xff;
  b[i++] = tl & 0xff; // `time_mid`

  const tmh = msecs / 0x100000000 * 10000 & 0xfffffff;
  b[i++] = tmh >>> 8 & 0xff;
  b[i++] = tmh & 0xff; // `time_high_and_version`

  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version

  b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)

  b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`

  b[i++] = clockseq & 0xff; // `node`

  for (let n = 0; n < 6; ++n) {
    b[i + n] = node[n];
  }

  return buf || (0, _stringify.default)(b);
}

var _default = v1;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _v = _interopRequireDefault(require("./v35.js"));

var _md = _interopRequireDefault(require("./md5.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const v3 = (0, _v.default)('v3', 0x30, _md.default);
var _default = v3;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = _default;
exports.URL = exports.DNS = void 0;

var _stringify = _interopRequireDefault(require("./stringify.js"));

var _parse = _interopRequireDefault(require("./parse.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function stringToBytes(str) {
  str = unescape(encodeURIComponent(str)); // UTF8 escape

  const bytes = [];

  for (let i = 0; i < str.length; ++i) {
    bytes.push(str.charCodeAt(i));
  }

  return bytes;
}

const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
exports.DNS = DNS;
const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
exports.URL = URL;

function _default(name, version, hashfunc) {
  function generateUUID(value, namespace, buf, offset) {
    if (typeof value === 'string') {
      value = stringToBytes(value);
    }

    if (typeof namespace === 'string') {
      namespace = (0, _parse.default)(namespace);
    }

    if (namespace.length !== 16) {
      throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');
    } // Compute hash of namespace and value, Per 4.3
    // Future: Use spread syntax when supported on all platforms, e.g. `bytes =
    // hashfunc([...namespace, ... value])`


    let bytes = new Uint8Array(16 + value.length);
    bytes.set(namespace);
    bytes.set(value, namespace.length);
    bytes = hashfunc(bytes);
    bytes[6] = bytes[6] & 0x0f | version;
    bytes[8] = bytes[8] & 0x3f | 0x80;

    if (buf) {
      offset = offset || 0;

      for (let i = 0; i < 16; ++i) {
        buf[offset + i] = bytes[i];
      }

      return buf;
    }

    return (0, _stringify.default)(bytes);
  } // Function#name is not settable on some platforms (#270)


  try {
    generateUUID.name = name; // eslint-disable-next-line no-empty
  } catch (err) {} // For CommonJS default export support


  generateUUID.DNS = DNS;
  generateUUID.URL = URL;
  return generateUUID;
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _rng = _interopRequireDefault(require("./rng.js"));

var _stringify = _interopRequireDefault(require("./stringify.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function v4(options, buf, offset) {
  options = options || {};

  const rnds = options.random || (options.rng || _rng.default)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`


  rnds[6] = rnds[6] & 0x0f | 0x40;
  rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided

  if (buf) {
    offset = offset || 0;

    for (let i = 0; i < 16; ++i) {
      buf[offset + i] = rnds[i];
    }

    return buf;
  }

  return (0, _stringify.default)(rnds);
}

var _default = v4;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _v = _interopRequireDefault(require("./v35.js"));

var _sha = _interopRequireDefault(require("./sha1.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const v5 = (0, _v.default)('v5', 0x50, _sha.default);
var _default = v5;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _regex = _interopRequireDefault(require("./regex.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function validate(uuid) {
  return typeof uuid === 'string' && _regex.default.test(uuid);
}

var _default = validate;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _validate = _interopRequireDefault(require("./validate.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function version(uuid) {
  if (!(0, _validate.default)(uuid)) {
    throw TypeError('Invalid UUID');
  }

  return parseInt(uuid.substr(14, 1), 16);
}

var _default = version;
exports.default = _default;!function(r,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((r="undefined"!=typeof globalThis?globalThis:r||self).uuid={})}(this,(function(r){"use strict";var e,n=new Uint8Array(16);function t(){if(!e&&!(e="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return e(n)}var o=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function a(r){return"string"==typeof r&&o.test(r)}for(var i,u,f=[],s=0;s<256;++s)f.push((s+256).toString(16).substr(1));function c(r){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(f[r[e+0]]+f[r[e+1]]+f[r[e+2]]+f[r[e+3]]+"-"+f[r[e+4]]+f[r[e+5]]+"-"+f[r[e+6]]+f[r[e+7]]+"-"+f[r[e+8]]+f[r[e+9]]+"-"+f[r[e+10]]+f[r[e+11]]+f[r[e+12]]+f[r[e+13]]+f[r[e+14]]+f[r[e+15]]).toLowerCase();if(!a(n))throw TypeError("Stringified UUID is invalid");return n}var l=0,d=0;function v(r){if(!a(r))throw TypeError("Invalid UUID");var e,n=new Uint8Array(16);return n[0]=(e=parseInt(r.slice(0,8),16))>>>24,n[1]=e>>>16&255,n[2]=e>>>8&255,n[3]=255&e,n[4]=(e=parseInt(r.slice(9,13),16))>>>8,n[5]=255&e,n[6]=(e=parseInt(r.slice(14,18),16))>>>8,n[7]=255&e,n[8]=(e=parseInt(r.slice(19,23),16))>>>8,n[9]=255&e,n[10]=(e=parseInt(r.slice(24,36),16))/1099511627776&255,n[11]=e/4294967296&255,n[12]=e>>>24&255,n[13]=e>>>16&255,n[14]=e>>>8&255,n[15]=255&e,n}function p(r,e,n){function t(r,t,o,a){if("string"==typeof r&&(r=function(r){r=unescape(encodeURIComponent(r));for(var e=[],n=0;n<r.length;++n)e.push(r.charCodeAt(n));return e}(r)),"string"==typeof t&&(t=v(t)),16!==t.length)throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");var i=new Uint8Array(16+r.length);if(i.set(t),i.set(r,t.length),(i=n(i))[6]=15&i[6]|e,i[8]=63&i[8]|128,o){a=a||0;for(var u=0;u<16;++u)o[a+u]=i[u];return o}return c(i)}try{t.name=r}catch(r){}return t.DNS="6ba7b810-9dad-11d1-80b4-00c04fd430c8",t.URL="6ba7b811-9dad-11d1-80b4-00c04fd430c8",t}function h(r){return 14+(r+64>>>9<<4)+1}function y(r,e){var n=(65535&r)+(65535&e);return(r>>16)+(e>>16)+(n>>16)<<16|65535&n}function g(r,e,n,t,o,a){return y((i=y(y(e,r),y(t,a)))<<(u=o)|i>>>32-u,n);var i,u}function m(r,e,n,t,o,a,i){return g(e&n|~e&t,r,e,o,a,i)}function w(r,e,n,t,o,a,i){return g(e&t|n&~t,r,e,o,a,i)}function b(r,e,n,t,o,a,i){return g(e^n^t,r,e,o,a,i)}function A(r,e,n,t,o,a,i){return g(n^(e|~t),r,e,o,a,i)}var U=p("v3",48,(function(r){if("string"==typeof r){var e=unescape(encodeURIComponent(r));r=new Uint8Array(e.length);for(var n=0;n<e.length;++n)r[n]=e.charCodeAt(n)}return function(r){for(var e=[],n=32*r.length,t="0123456789abcdef",o=0;o<n;o+=8){var a=r[o>>5]>>>o%32&255,i=parseInt(t.charAt(a>>>4&15)+t.charAt(15&a),16);e.push(i)}return e}(function(r,e){r[e>>5]|=128<<e%32,r[h(e)-1]=e;for(var n=1732584193,t=-271733879,o=-1732584194,a=271733878,i=0;i<r.length;i+=16){var u=n,f=t,s=o,c=a;n=m(n,t,o,a,r[i],7,-680876936),a=m(a,n,t,o,r[i+1],12,-389564586),o=m(o,a,n,t,r[i+2],17,606105819),t=m(t,o,a,n,r[i+3],22,-1044525330),n=m(n,t,o,a,r[i+4],7,-176418897),a=m(a,n,t,o,r[i+5],12,1200080426),o=m(o,a,n,t,r[i+6],17,-1473231341),t=m(t,o,a,n,r[i+7],22,-45705983),n=m(n,t,o,a,r[i+8],7,1770035416),a=m(a,n,t,o,r[i+9],12,-1958414417),o=m(o,a,n,t,r[i+10],17,-42063),t=m(t,o,a,n,r[i+11],22,-1990404162),n=m(n,t,o,a,r[i+12],7,1804603682),a=m(a,n,t,o,r[i+13],12,-40341101),o=m(o,a,n,t,r[i+14],17,-1502002290),n=w(n,t=m(t,o,a,n,r[i+15],22,1236535329),o,a,r[i+1],5,-165796510),a=w(a,n,t,o,r[i+6],9,-1069501632),o=w(o,a,n,t,r[i+11],14,643717713),t=w(t,o,a,n,r[i],20,-373897302),n=w(n,t,o,a,r[i+5],5,-701558691),a=w(a,n,t,o,r[i+10],9,38016083),o=w(o,a,n,t,r[i+15],14,-660478335),t=w(t,o,a,n,r[i+4],20,-405537848),n=w(n,t,o,a,r[i+9],5,568446438),a=w(a,n,t,o,r[i+14],9,-1019803690),o=w(o,a,n,t,r[i+3],14,-187363961),t=w(t,o,a,n,r[i+8],20,1163531501),n=w(n,t,o,a,r[i+13],5,-1444681467),a=w(a,n,t,o,r[i+2],9,-51403784),o=w(o,a,n,t,r[i+7],14,1735328473),n=b(n,t=w(t,o,a,n,r[i+12],20,-1926607734),o,a,r[i+5],4,-378558),a=b(a,n,t,o,r[i+8],11,-2022574463),o=b(o,a,n,t,r[i+11],16,1839030562),t=b(t,o,a,n,r[i+14],23,-35309556),n=b(n,t,o,a,r[i+1],4,-1530992060),a=b(a,n,t,o,r[i+4],11,1272893353),o=b(o,a,n,t,r[i+7],16,-155497632),t=b(t,o,a,n,r[i+10],23,-1094730640),n=b(n,t,o,a,r[i+13],4,681279174),a=b(a,n,t,o,r[i],11,-358537222),o=b(o,a,n,t,r[i+3],16,-722521979),t=b(t,o,a,n,r[i+6],23,76029189),n=b(n,t,o,a,r[i+9],4,-640364487),a=b(a,n,t,o,r[i+12],11,-421815835),o=b(o,a,n,t,r[i+15],16,530742520),n=A(n,t=b(t,o,a,n,r[i+2],23,-995338651),o,a,r[i],6,-198630844),a=A(a,n,t,o,r[i+7],10,1126891415),o=A(o,a,n,t,r[i+14],15,-1416354905),t=A(t,o,a,n,r[i+5],21,-57434055),n=A(n,t,o,a,r[i+12],6,1700485571),a=A(a,n,t,o,r[i+3],10,-1894986606),o=A(o,a,n,t,r[i+10],15,-1051523),t=A(t,o,a,n,r[i+1],21,-2054922799),n=A(n,t,o,a,r[i+8],6,1873313359),a=A(a,n,t,o,r[i+15],10,-30611744),o=A(o,a,n,t,r[i+6],15,-1560198380),t=A(t,o,a,n,r[i+13],21,1309151649),n=A(n,t,o,a,r[i+4],6,-145523070),a=A(a,n,t,o,r[i+11],10,-1120210379),o=A(o,a,n,t,r[i+2],15,718787259),t=A(t,o,a,n,r[i+9],21,-343485551),n=y(n,u),t=y(t,f),o=y(o,s),a=y(a,c)}return[n,t,o,a]}(function(r){if(0===r.length)return[];for(var e=8*r.length,n=new Uint32Array(h(e)),t=0;t<e;t+=8)n[t>>5]|=(255&r[t/8])<<t%32;return n}(r),8*r.length))}));function I(r,e,n,t){switch(r){case 0:return e&n^~e&t;case 1:return e^n^t;case 2:return e&n^e&t^n&t;case 3:return e^n^t}}function C(r,e){return r<<e|r>>>32-e}var R=p("v5",80,(function(r){var e=[1518500249,1859775393,2400959708,3395469782],n=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof r){var t=unescape(encodeURIComponent(r));r=[];for(var o=0;o<t.length;++o)r.push(t.charCodeAt(o))}else Array.isArray(r)||(r=Array.prototype.slice.call(r));r.push(128);for(var a=r.length/4+2,i=Math.ceil(a/16),u=new Array(i),f=0;f<i;++f){for(var s=new Uint32Array(16),c=0;c<16;++c)s[c]=r[64*f+4*c]<<24|r[64*f+4*c+1]<<16|r[64*f+4*c+2]<<8|r[64*f+4*c+3];u[f]=s}u[i-1][14]=8*(r.length-1)/Math.pow(2,32),u[i-1][14]=Math.floor(u[i-1][14]),u[i-1][15]=8*(r.length-1)&4294967295;for(var l=0;l<i;++l){for(var d=new Uint32Array(80),v=0;v<16;++v)d[v]=u[l][v];for(var p=16;p<80;++p)d[p]=C(d[p-3]^d[p-8]^d[p-14]^d[p-16],1);for(var h=n[0],y=n[1],g=n[2],m=n[3],w=n[4],b=0;b<80;++b){var A=Math.floor(b/20),U=C(h,5)+I(A,y,g,m)+w+e[A]+d[b]>>>0;w=m,m=g,g=C(y,30)>>>0,y=h,h=U}n[0]=n[0]+h>>>0,n[1]=n[1]+y>>>0,n[2]=n[2]+g>>>0,n[3]=n[3]+m>>>0,n[4]=n[4]+w>>>0}return[n[0]>>24&255,n[0]>>16&255,n[0]>>8&255,255&n[0],n[1]>>24&255,n[1]>>16&255,n[1]>>8&255,255&n[1],n[2]>>24&255,n[2]>>16&255,n[2]>>8&255,255&n[2],n[3]>>24&255,n[3]>>16&255,n[3]>>8&255,255&n[3],n[4]>>24&255,n[4]>>16&255,n[4]>>8&255,255&n[4]]}));r.NIL="00000000-0000-0000-0000-000000000000",r.parse=v,r.stringify=c,r.v1=function(r,e,n){var o=e&&n||0,a=e||new Array(16),f=(r=r||{}).node||i,s=void 0!==r.clockseq?r.clockseq:u;if(null==f||null==s){var v=r.random||(r.rng||t)();null==f&&(f=i=[1|v[0],v[1],v[2],v[3],v[4],v[5]]),null==s&&(s=u=16383&(v[6]<<8|v[7]))}var p=void 0!==r.msecs?r.msecs:Date.now(),h=void 0!==r.nsecs?r.nsecs:d+1,y=p-l+(h-d)/1e4;if(y<0&&void 0===r.clockseq&&(s=s+1&16383),(y<0||p>l)&&void 0===r.nsecs&&(h=0),h>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");l=p,d=h,u=s;var g=(1e4*(268435455&(p+=122192928e5))+h)%4294967296;a[o++]=g>>>24&255,a[o++]=g>>>16&255,a[o++]=g>>>8&255,a[o++]=255&g;var m=p/4294967296*1e4&268435455;a[o++]=m>>>8&255,a[o++]=255&m,a[o++]=m>>>24&15|16,a[o++]=m>>>16&255,a[o++]=s>>>8|128,a[o++]=255&s;for(var w=0;w<6;++w)a[o+w]=f[w];return e||c(a)},r.v3=U,r.v4=function(r,e,n){var o=(r=r||{}).random||(r.rng||t)();if(o[6]=15&o[6]|64,o[8]=63&o[8]|128,e){n=n||0;for(var a=0;a<16;++a)e[n+a]=o[a];return e}return c(o)},r.v5=R,r.validate=a,r.version=function(r){if(!a(r))throw TypeError("Invalid UUID");return parseInt(r.substr(14,1),16)},Object.defineProperty(r,"__esModule",{value:!0})}));!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidNIL=n()}(this,(function(){"use strict";return"00000000-0000-0000-0000-000000000000"}));!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidParse=n()}(this,(function(){"use strict";var e=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;return function(n){if(!function(n){return"string"==typeof n&&e.test(n)}(n))throw TypeError("Invalid UUID");var t,i=new Uint8Array(16);return i[0]=(t=parseInt(n.slice(0,8),16))>>>24,i[1]=t>>>16&255,i[2]=t>>>8&255,i[3]=255&t,i[4]=(t=parseInt(n.slice(9,13),16))>>>8,i[5]=255&t,i[6]=(t=parseInt(n.slice(14,18),16))>>>8,i[7]=255&t,i[8]=(t=parseInt(n.slice(19,23),16))>>>8,i[9]=255&t,i[10]=(t=parseInt(n.slice(24,36),16))/1099511627776&255,i[11]=t/4294967296&255,i[12]=t>>>24&255,i[13]=t>>>16&255,i[14]=t>>>8&255,i[15]=255&t,i}}));!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidStringify=t()}(this,(function(){"use strict";var e=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function t(t){return"string"==typeof t&&e.test(t)}for(var i=[],n=0;n<256;++n)i.push((n+256).toString(16).substr(1));return function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,f=(i[e[n+0]]+i[e[n+1]]+i[e[n+2]]+i[e[n+3]]+"-"+i[e[n+4]]+i[e[n+5]]+"-"+i[e[n+6]]+i[e[n+7]]+"-"+i[e[n+8]]+i[e[n+9]]+"-"+i[e[n+10]]+i[e[n+11]]+i[e[n+12]]+i[e[n+13]]+i[e[n+14]]+i[e[n+15]]).toLowerCase();if(!t(f))throw TypeError("Stringified UUID is invalid");return f}}));!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidValidate=t()}(this,(function(){"use strict";var e=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;return function(t){return"string"==typeof t&&e.test(t)}}));!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidVersion=t()}(this,(function(){"use strict";var e=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;return function(t){if(!function(t){return"string"==typeof t&&e.test(t)}(t))throw TypeError("Invalid UUID");return parseInt(t.substr(14,1),16)}}));!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?module.exports=o():"function"==typeof define&&define.amd?define(o):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidv1=o()}(this,(function(){"use strict";var e,o=new Uint8Array(16);function t(){if(!e&&!(e="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return e(o)}var n=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function r(e){return"string"==typeof e&&n.test(e)}for(var i,u,s=[],a=0;a<256;++a)s.push((a+256).toString(16).substr(1));var d=0,f=0;return function(e,o,n){var a=o&&n||0,c=o||new Array(16),l=(e=e||{}).node||i,p=void 0!==e.clockseq?e.clockseq:u;if(null==l||null==p){var v=e.random||(e.rng||t)();null==l&&(l=i=[1|v[0],v[1],v[2],v[3],v[4],v[5]]),null==p&&(p=u=16383&(v[6]<<8|v[7]))}var y=void 0!==e.msecs?e.msecs:Date.now(),m=void 0!==e.nsecs?e.nsecs:f+1,g=y-d+(m-f)/1e4;if(g<0&&void 0===e.clockseq&&(p=p+1&16383),(g<0||y>d)&&void 0===e.nsecs&&(m=0),m>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");d=y,f=m,u=p;var h=(1e4*(268435455&(y+=122192928e5))+m)%4294967296;c[a++]=h>>>24&255,c[a++]=h>>>16&255,c[a++]=h>>>8&255,c[a++]=255&h;var w=y/4294967296*1e4&268435455;c[a++]=w>>>8&255,c[a++]=255&w,c[a++]=w>>>24&15|16,c[a++]=w>>>16&255,c[a++]=p>>>8|128,c[a++]=255&p;for(var b=0;b<6;++b)c[a+b]=l[b];return o||function(e){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,t=(s[e[o+0]]+s[e[o+1]]+s[e[o+2]]+s[e[o+3]]+"-"+s[e[o+4]]+s[e[o+5]]+"-"+s[e[o+6]]+s[e[o+7]]+"-"+s[e[o+8]]+s[e[o+9]]+"-"+s[e[o+10]]+s[e[o+11]]+s[e[o+12]]+s[e[o+13]]+s[e[o+14]]+s[e[o+15]]).toLowerCase();if(!r(t))throw TypeError("Stringified UUID is invalid");return t}(c)}}));!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define(r):(n="undefined"!=typeof globalThis?globalThis:n||self).uuidv3=r()}(this,(function(){"use strict";var n=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function r(r){return"string"==typeof r&&n.test(r)}for(var e=[],t=0;t<256;++t)e.push((t+256).toString(16).substr(1));function i(n){return 14+(n+64>>>9<<4)+1}function o(n,r){var e=(65535&n)+(65535&r);return(n>>16)+(r>>16)+(e>>16)<<16|65535&e}function a(n,r,e,t,i,a){return o((f=o(o(r,n),o(t,a)))<<(u=i)|f>>>32-u,e);var f,u}function f(n,r,e,t,i,o,f){return a(r&e|~r&t,n,r,i,o,f)}function u(n,r,e,t,i,o,f){return a(r&t|e&~t,n,r,i,o,f)}function c(n,r,e,t,i,o,f){return a(r^e^t,n,r,i,o,f)}function s(n,r,e,t,i,o,f){return a(e^(r|~t),n,r,i,o,f)}return function(n,t,i){function o(n,o,a,f){if("string"==typeof n&&(n=function(n){n=unescape(encodeURIComponent(n));for(var r=[],e=0;e<n.length;++e)r.push(n.charCodeAt(e));return r}(n)),"string"==typeof o&&(o=function(n){if(!r(n))throw TypeError("Invalid UUID");var e,t=new Uint8Array(16);return t[0]=(e=parseInt(n.slice(0,8),16))>>>24,t[1]=e>>>16&255,t[2]=e>>>8&255,t[3]=255&e,t[4]=(e=parseInt(n.slice(9,13),16))>>>8,t[5]=255&e,t[6]=(e=parseInt(n.slice(14,18),16))>>>8,t[7]=255&e,t[8]=(e=parseInt(n.slice(19,23),16))>>>8,t[9]=255&e,t[10]=(e=parseInt(n.slice(24,36),16))/1099511627776&255,t[11]=e/4294967296&255,t[12]=e>>>24&255,t[13]=e>>>16&255,t[14]=e>>>8&255,t[15]=255&e,t}(o)),16!==o.length)throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");var u=new Uint8Array(16+n.length);if(u.set(o),u.set(n,o.length),(u=i(u))[6]=15&u[6]|t,u[8]=63&u[8]|128,a){f=f||0;for(var c=0;c<16;++c)a[f+c]=u[c];return a}return function(n){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=(e[n[t+0]]+e[n[t+1]]+e[n[t+2]]+e[n[t+3]]+"-"+e[n[t+4]]+e[n[t+5]]+"-"+e[n[t+6]]+e[n[t+7]]+"-"+e[n[t+8]]+e[n[t+9]]+"-"+e[n[t+10]]+e[n[t+11]]+e[n[t+12]]+e[n[t+13]]+e[n[t+14]]+e[n[t+15]]).toLowerCase();if(!r(i))throw TypeError("Stringified UUID is invalid");return i}(u)}try{o.name=n}catch(n){}return o.DNS="6ba7b810-9dad-11d1-80b4-00c04fd430c8",o.URL="6ba7b811-9dad-11d1-80b4-00c04fd430c8",o}("v3",48,(function(n){if("string"==typeof n){var r=unescape(encodeURIComponent(n));n=new Uint8Array(r.length);for(var e=0;e<r.length;++e)n[e]=r.charCodeAt(e)}return function(n){for(var r=[],e=32*n.length,t="0123456789abcdef",i=0;i<e;i+=8){var o=n[i>>5]>>>i%32&255,a=parseInt(t.charAt(o>>>4&15)+t.charAt(15&o),16);r.push(a)}return r}(function(n,r){n[r>>5]|=128<<r%32,n[i(r)-1]=r;for(var e=1732584193,t=-271733879,a=-1732584194,l=271733878,d=0;d<n.length;d+=16){var p=e,h=t,v=a,g=l;e=f(e,t,a,l,n[d],7,-680876936),l=f(l,e,t,a,n[d+1],12,-389564586),a=f(a,l,e,t,n[d+2],17,606105819),t=f(t,a,l,e,n[d+3],22,-1044525330),e=f(e,t,a,l,n[d+4],7,-176418897),l=f(l,e,t,a,n[d+5],12,1200080426),a=f(a,l,e,t,n[d+6],17,-1473231341),t=f(t,a,l,e,n[d+7],22,-45705983),e=f(e,t,a,l,n[d+8],7,1770035416),l=f(l,e,t,a,n[d+9],12,-1958414417),a=f(a,l,e,t,n[d+10],17,-42063),t=f(t,a,l,e,n[d+11],22,-1990404162),e=f(e,t,a,l,n[d+12],7,1804603682),l=f(l,e,t,a,n[d+13],12,-40341101),a=f(a,l,e,t,n[d+14],17,-1502002290),e=u(e,t=f(t,a,l,e,n[d+15],22,1236535329),a,l,n[d+1],5,-165796510),l=u(l,e,t,a,n[d+6],9,-1069501632),a=u(a,l,e,t,n[d+11],14,643717713),t=u(t,a,l,e,n[d],20,-373897302),e=u(e,t,a,l,n[d+5],5,-701558691),l=u(l,e,t,a,n[d+10],9,38016083),a=u(a,l,e,t,n[d+15],14,-660478335),t=u(t,a,l,e,n[d+4],20,-405537848),e=u(e,t,a,l,n[d+9],5,568446438),l=u(l,e,t,a,n[d+14],9,-1019803690),a=u(a,l,e,t,n[d+3],14,-187363961),t=u(t,a,l,e,n[d+8],20,1163531501),e=u(e,t,a,l,n[d+13],5,-1444681467),l=u(l,e,t,a,n[d+2],9,-51403784),a=u(a,l,e,t,n[d+7],14,1735328473),e=c(e,t=u(t,a,l,e,n[d+12],20,-1926607734),a,l,n[d+5],4,-378558),l=c(l,e,t,a,n[d+8],11,-2022574463),a=c(a,l,e,t,n[d+11],16,1839030562),t=c(t,a,l,e,n[d+14],23,-35309556),e=c(e,t,a,l,n[d+1],4,-1530992060),l=c(l,e,t,a,n[d+4],11,1272893353),a=c(a,l,e,t,n[d+7],16,-155497632),t=c(t,a,l,e,n[d+10],23,-1094730640),e=c(e,t,a,l,n[d+13],4,681279174),l=c(l,e,t,a,n[d],11,-358537222),a=c(a,l,e,t,n[d+3],16,-722521979),t=c(t,a,l,e,n[d+6],23,76029189),e=c(e,t,a,l,n[d+9],4,-640364487),l=c(l,e,t,a,n[d+12],11,-421815835),a=c(a,l,e,t,n[d+15],16,530742520),e=s(e,t=c(t,a,l,e,n[d+2],23,-995338651),a,l,n[d],6,-198630844),l=s(l,e,t,a,n[d+7],10,1126891415),a=s(a,l,e,t,n[d+14],15,-1416354905),t=s(t,a,l,e,n[d+5],21,-57434055),e=s(e,t,a,l,n[d+12],6,1700485571),l=s(l,e,t,a,n[d+3],10,-1894986606),a=s(a,l,e,t,n[d+10],15,-1051523),t=s(t,a,l,e,n[d+1],21,-2054922799),e=s(e,t,a,l,n[d+8],6,1873313359),l=s(l,e,t,a,n[d+15],10,-30611744),a=s(a,l,e,t,n[d+6],15,-1560198380),t=s(t,a,l,e,n[d+13],21,1309151649),e=s(e,t,a,l,n[d+4],6,-145523070),l=s(l,e,t,a,n[d+11],10,-1120210379),a=s(a,l,e,t,n[d+2],15,718787259),t=s(t,a,l,e,n[d+9],21,-343485551),e=o(e,p),t=o(t,h),a=o(a,v),l=o(l,g)}return[e,t,a,l]}(function(n){if(0===n.length)return[];for(var r=8*n.length,e=new Uint32Array(i(r)),t=0;t<r;t+=8)e[t>>5]|=(255&n[t/8])<<t%32;return e}(n),8*n.length))}))}));!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).uuidv4=e()}(this,(function(){"use strict";var t,e=new Uint8Array(16);function o(){if(!t&&!(t="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return t(e)}var n=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function r(t){return"string"==typeof t&&n.test(t)}for(var i=[],u=0;u<256;++u)i.push((u+256).toString(16).substr(1));return function(t,e,n){var u=(t=t||{}).random||(t.rng||o)();if(u[6]=15&u[6]|64,u[8]=63&u[8]|128,e){n=n||0;for(var f=0;f<16;++f)e[n+f]=u[f];return e}return function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,o=(i[t[e+0]]+i[t[e+1]]+i[t[e+2]]+i[t[e+3]]+"-"+i[t[e+4]]+i[t[e+5]]+"-"+i[t[e+6]]+i[t[e+7]]+"-"+i[t[e+8]]+i[t[e+9]]+"-"+i[t[e+10]]+i[t[e+11]]+i[t[e+12]]+i[t[e+13]]+i[t[e+14]]+i[t[e+15]]).toLowerCase();if(!r(o))throw TypeError("Stringified UUID is invalid");return o}(u)}}));!function(r,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(r="undefined"!=typeof globalThis?globalThis:r||self).uuidv5=e()}(this,(function(){"use strict";var r=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function e(e){return"string"==typeof e&&r.test(e)}for(var t=[],n=0;n<256;++n)t.push((n+256).toString(16).substr(1));function a(r,e,t,n){switch(r){case 0:return e&t^~e&n;case 1:return e^t^n;case 2:return e&t^e&n^t&n;case 3:return e^t^n}}function o(r,e){return r<<e|r>>>32-e}return function(r,n,a){function o(r,o,i,f){if("string"==typeof r&&(r=function(r){r=unescape(encodeURIComponent(r));for(var e=[],t=0;t<r.length;++t)e.push(r.charCodeAt(t));return e}(r)),"string"==typeof o&&(o=function(r){if(!e(r))throw TypeError("Invalid UUID");var t,n=new Uint8Array(16);return n[0]=(t=parseInt(r.slice(0,8),16))>>>24,n[1]=t>>>16&255,n[2]=t>>>8&255,n[3]=255&t,n[4]=(t=parseInt(r.slice(9,13),16))>>>8,n[5]=255&t,n[6]=(t=parseInt(r.slice(14,18),16))>>>8,n[7]=255&t,n[8]=(t=parseInt(r.slice(19,23),16))>>>8,n[9]=255&t,n[10]=(t=parseInt(r.slice(24,36),16))/1099511627776&255,n[11]=t/4294967296&255,n[12]=t>>>24&255,n[13]=t>>>16&255,n[14]=t>>>8&255,n[15]=255&t,n}(o)),16!==o.length)throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");var s=new Uint8Array(16+r.length);if(s.set(o),s.set(r,o.length),(s=a(s))[6]=15&s[6]|n,s[8]=63&s[8]|128,i){f=f||0;for(var u=0;u<16;++u)i[f+u]=s[u];return i}return function(r){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=(t[r[n+0]]+t[r[n+1]]+t[r[n+2]]+t[r[n+3]]+"-"+t[r[n+4]]+t[r[n+5]]+"-"+t[r[n+6]]+t[r[n+7]]+"-"+t[r[n+8]]+t[r[n+9]]+"-"+t[r[n+10]]+t[r[n+11]]+t[r[n+12]]+t[r[n+13]]+t[r[n+14]]+t[r[n+15]]).toLowerCase();if(!e(a))throw TypeError("Stringified UUID is invalid");return a}(s)}try{o.name=r}catch(r){}return o.DNS="6ba7b810-9dad-11d1-80b4-00c04fd430c8",o.URL="6ba7b811-9dad-11d1-80b4-00c04fd430c8",o}("v5",80,(function(r){var e=[1518500249,1859775393,2400959708,3395469782],t=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof r){var n=unescape(encodeURIComponent(r));r=[];for(var i=0;i<n.length;++i)r.push(n.charCodeAt(i))}else Array.isArray(r)||(r=Array.prototype.slice.call(r));r.push(128);for(var f=r.length/4+2,s=Math.ceil(f/16),u=new Array(s),c=0;c<s;++c){for(var l=new Uint32Array(16),p=0;p<16;++p)l[p]=r[64*c+4*p]<<24|r[64*c+4*p+1]<<16|r[64*c+4*p+2]<<8|r[64*c+4*p+3];u[c]=l}u[s-1][14]=8*(r.length-1)/Math.pow(2,32),u[s-1][14]=Math.floor(u[s-1][14]),u[s-1][15]=8*(r.length-1)&4294967295;for(var d=0;d<s;++d){for(var h=new Uint32Array(80),v=0;v<16;++v)h[v]=u[d][v];for(var y=16;y<80;++y)h[y]=o(h[y-3]^h[y-8]^h[y-14]^h[y-16],1);for(var g=t[0],b=t[1],w=t[2],U=t[3],A=t[4],I=0;I<80;++I){var m=Math.floor(I/20),C=o(g,5)+a(m,b,w,U)+A+e[m]+h[I]>>>0;A=U,U=w,w=o(b,30)>>>0,b=g,g=C}t[0]=t[0]+g>>>0,t[1]=t[1]+b>>>0,t[2]=t[2]+w>>>0,t[3]=t[3]+U>>>0,t[4]=t[4]+A>>>0}return[t[0]>>24&255,t[0]>>16&255,t[0]>>8&255,255&t[0],t[1]>>24&255,t[1]>>16&255,t[1]>>8&255,255&t[1],t[2]>>24&255,t[2]>>16&255,t[2]>>8&255,255&t[2],t[3]>>24&255,t[3]>>16&255,t[3]>>8&255,255&t[3],t[4]>>24&255,t[4]>>16&255,t[4]>>8&255,255&t[4]]}))}));export { default as v1 } from './v1.js';
export { default as v3 } from './v3.js';
export { default as v4 } from './v4.js';
export { default as v5 } from './v5.js';
export { default as NIL } from './nil.js';
export { default as version } from './version.js';
export { default as validate } from './validate.js';
export { default as stringify } from './stringify.js';
export { default as parse } from './parse.js';import crypto from 'crypto';

function md5(bytes) {
  if (Array.isArray(bytes)) {
    bytes = Buffer.from(bytes);
  } else if (typeof bytes === 'string') {
    bytes = Buffer.from(bytes, 'utf8');
  }

  return crypto.createHash('md5').update(bytes).digest();
}

export default md5;export default '00000000-0000-0000-0000-000000000000';import validate from './validate.js';

function parse(uuid) {
  if (!validate(uuid)) {
    throw TypeError('Invalid UUID');
  }

  let v;
  const arr = new Uint8Array(16); // Parse ########-....-....-....-............

  arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;
  arr[1] = v >>> 16 & 0xff;
  arr[2] = v >>> 8 & 0xff;
  arr[3] = v & 0xff; // Parse ........-####-....-....-............

  arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;
  arr[5] = v & 0xff; // Parse ........-....-####-....-............

  arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;
  arr[7] = v & 0xff; // Parse ........-....-....-####-............

  arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;
  arr[9] = v & 0xff; // Parse ........-....-....-....-############
  // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes)

  arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;
  arr[11] = v / 0x100000000 & 0xff;
  arr[12] = v >>> 24 & 0xff;
  arr[13] = v >>> 16 & 0xff;
  arr[14] = v >>> 8 & 0xff;
  arr[15] = v & 0xff;
  return arr;
}

export default parse;export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;import crypto from 'crypto';
const rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate

let poolPtr = rnds8Pool.length;
export default function rng() {
  if (poolPtr > rnds8Pool.length - 16) {
    crypto.randomFillSync(rnds8Pool);
    poolPtr = 0;
  }

  return rnds8Pool.slice(poolPtr, poolPtr += 16);
}import crypto from 'crypto';

function sha1(bytes) {
  if (Array.isArray(bytes)) {
    bytes = Buffer.from(bytes);
  } else if (typeof bytes === 'string') {
    bytes = Buffer.from(bytes, 'utf8');
  }

  return crypto.createHash('sha1').update(bytes).digest();
}

export default sha1;import validate from './validate.js';
/**
 * Convert array of 16 byte values to UUID string format of the form:
 * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
 */

const byteToHex = [];

for (let i = 0; i < 256; ++i) {
  byteToHex.push((i + 0x100).toString(16).substr(1));
}

function stringify(arr, offset = 0) {
  // Note: Be careful editing this code!  It's been tuned for performance
  // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
  const uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID.  If this throws, it's likely due to one
  // of the following:
  // - One or more input array values don't map to a hex octet (leading to
  // "undefined" in the uuid)
  // - Invalid input values for the RFC `version` or `variant` fields

  if (!validate(uuid)) {
    throw TypeError('Stringified UUID is invalid');
  }

  return uuid;
}

export default stringify;import rng from './rng.js';
import stringify from './stringify.js'; // **`v1()` - Generate time-based UUID**
//
// Inspired by https://github.com/LiosK/UUID.js
// and http://docs.python.org/library/uuid.html

let _nodeId;

let _clockseq; // Previous uuid creation time


let _lastMSecs = 0;
let _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details

function v1(options, buf, offset) {
  let i = buf && offset || 0;
  const b = buf || new Array(16);
  options = options || {};
  let node = options.node || _nodeId;
  let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not
  // specified.  We do this lazily to minimize issues related to insufficient
  // system entropy.  See #189

  if (node == null || clockseq == null) {
    const seedBytes = options.random || (options.rng || rng)();

    if (node == null) {
      // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
      node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];
    }

    if (clockseq == null) {
      // Per 4.2.2, randomize (14 bit) clockseq
      clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
    }
  } // UUID timestamps are 100 nano-second units since the Gregorian epoch,
  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so
  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.


  let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock
  // cycle to simulate higher resolution clock

  let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)

  const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression

  if (dt < 0 && options.clockseq === undefined) {
    clockseq = clockseq + 1 & 0x3fff;
  } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
  // time interval


  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
    nsecs = 0;
  } // Per 4.2.1.2 Throw error if too many uuids are requested


  if (nsecs >= 10000) {
    throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
  }

  _lastMSecs = msecs;
  _lastNSecs = nsecs;
  _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch

  msecs += 12219292800000; // `time_low`

  const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
  b[i++] = tl >>> 24 & 0xff;
  b[i++] = tl >>> 16 & 0xff;
  b[i++] = tl >>> 8 & 0xff;
  b[i++] = tl & 0xff; // `time_mid`

  const tmh = msecs / 0x100000000 * 10000 & 0xfffffff;
  b[i++] = tmh >>> 8 & 0xff;
  b[i++] = tmh & 0xff; // `time_high_and_version`

  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version

  b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)

  b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`

  b[i++] = clockseq & 0xff; // `node`

  for (let n = 0; n < 6; ++n) {
    b[i + n] = node[n];
  }

  return buf || stringify(b);
}

export default v1;import v35 from './v35.js';
import md5 from './md5.js';
const v3 = v35('v3', 0x30, md5);
export default v3;import stringify from './stringify.js';
import parse from './parse.js';

function stringToBytes(str) {
  str = unescape(encodeURIComponent(str)); // UTF8 escape

  const bytes = [];

  for (let i = 0; i < str.length; ++i) {
    bytes.push(str.charCodeAt(i));
  }

  return bytes;
}

export const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
export const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
export default function (name, version, hashfunc) {
  function generateUUID(value, namespace, buf, offset) {
    if (typeof value === 'string') {
      value = stringToBytes(value);
    }

    if (typeof namespace === 'string') {
      namespace = parse(namespace);
    }

    if (namespace.length !== 16) {
      throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');
    } // Compute hash of namespace and value, Per 4.3
    // Future: Use spread syntax when supported on all platforms, e.g. `bytes =
    // hashfunc([...namespace, ... value])`


    let bytes = new Uint8Array(16 + value.length);
    bytes.set(namespace);
    bytes.set(value, namespace.length);
    bytes = hashfunc(bytes);
    bytes[6] = bytes[6] & 0x0f | version;
    bytes[8] = bytes[8] & 0x3f | 0x80;

    if (buf) {
      offset = offset || 0;

      for (let i = 0; i < 16; ++i) {
        buf[offset + i] = bytes[i];
      }

      return buf;
    }

    return stringify(bytes);
  } // Function#name is not settable on some platforms (#270)


  try {
    generateUUID.name = name; // eslint-disable-next-line no-empty
  } catch (err) {} // For CommonJS default export support


  generateUUID.DNS = DNS;
  generateUUID.URL = URL;
  return generateUUID;
}import rng from './rng.js';
import stringify from './stringify.js';

function v4(options, buf, offset) {
  options = options || {};
  const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`

  rnds[6] = rnds[6] & 0x0f | 0x40;
  rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided

  if (buf) {
    offset = offset || 0;

    for (let i = 0; i < 16; ++i) {
      buf[offset + i] = rnds[i];
    }

    return buf;
  }

  return stringify(rnds);
}

export default v4;import v35 from './v35.js';
import sha1 from './sha1.js';
const v5 = v35('v5', 0x50, sha1);
export default v5;import REGEX from './regex.js';

function validate(uuid) {
  return typeof uuid === 'string' && REGEX.test(uuid);
}

export default validate;import validate from './validate.js';

function version(uuid) {
  if (!validate(uuid)) {
    throw TypeError('Invalid UUID');
  }

  return parseInt(uuid.substr(14, 1), 16);
}

export default version;export { default as v1 } from './v1.js';
export { default as v3 } from './v3.js';
export { default as v4 } from './v4.js';
export { default as v5 } from './v5.js';
export { default as NIL } from './nil.js';
export { default as version } from './version.js';
export { default as validate } from './validate.js';
export { default as stringify } from './stringify.js';
export { default as parse } from './parse.js';/*
 * Browser-compatible JavaScript MD5
 *
 * Modification of JavaScript MD5
 * https://github.com/blueimp/JavaScript-MD5
 *
 * Copyright 2011, Sebastian Tschan
 * https://blueimp.net
 *
 * Licensed under the MIT license:
 * https://opensource.org/licenses/MIT
 *
 * Based on
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 */
function md5(bytes) {
  if (typeof bytes === 'string') {
    var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape

    bytes = new Uint8Array(msg.length);

    for (var i = 0; i < msg.length; ++i) {
      bytes[i] = msg.charCodeAt(i);
    }
  }

  return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));
}
/*
 * Convert an array of little-endian words to an array of bytes
 */


function md5ToHexEncodedArray(input) {
  var output = [];
  var length32 = input.length * 32;
  var hexTab = '0123456789abcdef';

  for (var i = 0; i < length32; i += 8) {
    var x = input[i >> 5] >>> i % 32 & 0xff;
    var hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);
    output.push(hex);
  }

  return output;
}
/**
 * Calculate output length with padding and bit length
 */


function getOutputLength(inputLength8) {
  return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;
}
/*
 * Calculate the MD5 of an array of little-endian words, and a bit length.
 */


function wordsToMd5(x, len) {
  /* append padding */
  x[len >> 5] |= 0x80 << len % 32;
  x[getOutputLength(len) - 1] = len;
  var a = 1732584193;
  var b = -271733879;
  var c = -1732584194;
  var d = 271733878;

  for (var i = 0; i < x.length; i += 16) {
    var olda = a;
    var oldb = b;
    var oldc = c;
    var oldd = d;
    a = md5ff(a, b, c, d, x[i], 7, -680876936);
    d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);
    c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);
    b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
    a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);
    d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
    c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
    b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);
    a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
    d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
    c = md5ff(c, d, a, b, x[i + 10], 17, -42063);
    b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
    a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
    d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);
    c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
    b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
    a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);
    d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
    c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);
    b = md5gg(b, c, d, a, x[i], 20, -373897302);
    a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);
    d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);
    c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);
    b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);
    a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);
    d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
    c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);
    b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
    a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
    d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);
    c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
    b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
    a = md5hh(a, b, c, d, x[i + 5], 4, -378558);
    d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
    c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
    b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);
    a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
    d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
    c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);
    b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
    a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);
    d = md5hh(d, a, b, c, x[i], 11, -358537222);
    c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);
    b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);
    a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);
    d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);
    c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);
    b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);
    a = md5ii(a, b, c, d, x[i], 6, -198630844);
    d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
    c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
    b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);
    a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
    d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
    c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);
    b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
    a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
    d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);
    c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
    b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
    a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);
    d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
    c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);
    b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);
    a = safeAdd(a, olda);
    b = safeAdd(b, oldb);
    c = safeAdd(c, oldc);
    d = safeAdd(d, oldd);
  }

  return [a, b, c, d];
}
/*
 * Convert an array bytes to an array of little-endian words
 * Characters >255 have their high-byte silently ignored.
 */


function bytesToWords(input) {
  if (input.length === 0) {
    return [];
  }

  var length8 = input.length * 8;
  var output = new Uint32Array(getOutputLength(length8));

  for (var i = 0; i < length8; i += 8) {
    output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;
  }

  return output;
}
/*
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
 * to work around bugs in some JS interpreters.
 */


function safeAdd(x, y) {
  var lsw = (x & 0xffff) + (y & 0xffff);
  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return msw << 16 | lsw & 0xffff;
}
/*
 * Bitwise rotate a 32-bit number to the left.
 */


function bitRotateLeft(num, cnt) {
  return num << cnt | num >>> 32 - cnt;
}
/*
 * These functions implement the four basic operations the algorithm uses.
 */


function md5cmn(q, a, b, x, s, t) {
  return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);
}

function md5ff(a, b, c, d, x, s, t) {
  return md5cmn(b & c | ~b & d, a, b, x, s, t);
}

function md5gg(a, b, c, d, x, s, t) {
  return md5cmn(b & d | c & ~d, a, b, x, s, t);
}

function md5hh(a, b, c, d, x, s, t) {
  return md5cmn(b ^ c ^ d, a, b, x, s, t);
}

function md5ii(a, b, c, d, x, s, t) {
  return md5cmn(c ^ (b | ~d), a, b, x, s, t);
}

export default md5;export default '00000000-0000-0000-0000-000000000000';import validate from './validate.js';

function parse(uuid) {
  if (!validate(uuid)) {
    throw TypeError('Invalid UUID');
  }

  var v;
  var arr = new Uint8Array(16); // Parse ########-....-....-....-............

  arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;
  arr[1] = v >>> 16 & 0xff;
  arr[2] = v >>> 8 & 0xff;
  arr[3] = v & 0xff; // Parse ........-####-....-....-............

  arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;
  arr[5] = v & 0xff; // Parse ........-....-####-....-............

  arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;
  arr[7] = v & 0xff; // Parse ........-....-....-####-............

  arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;
  arr[9] = v & 0xff; // Parse ........-....-....-....-############
  // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes)

  arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;
  arr[11] = v / 0x100000000 & 0xff;
  arr[12] = v >>> 24 & 0xff;
  arr[13] = v >>> 16 & 0xff;
  arr[14] = v >>> 8 & 0xff;
  arr[15] = v & 0xff;
  return arr;
}

export default parse;export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;// Unique ID creation requires a high quality random # generator. In the browser we therefore
// require the crypto API and do not support built-in fallback to lower quality random number
// generators (like Math.random()).
var getRandomValues;
var rnds8 = new Uint8Array(16);
export default function rng() {
  // lazy load so that environments that need to polyfill have a chance to do so
  if (!getRandomValues) {
    // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. Also,
    // find the complete implementation of crypto (msCrypto) on IE11.
    getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);

    if (!getRandomValues) {
      throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');
    }
  }

  return getRandomValues(rnds8);
}// Adapted from Chris Veness' SHA1 code at
// http://www.movable-type.co.uk/scripts/sha1.html
function f(s, x, y, z) {
  switch (s) {
    case 0:
      return x & y ^ ~x & z;

    case 1:
      return x ^ y ^ z;

    case 2:
      return x & y ^ x & z ^ y & z;

    case 3:
      return x ^ y ^ z;
  }
}

function ROTL(x, n) {
  return x << n | x >>> 32 - n;
}

function sha1(bytes) {
  var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];
  var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];

  if (typeof bytes === 'string') {
    var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape

    bytes = [];

    for (var i = 0; i < msg.length; ++i) {
      bytes.push(msg.charCodeAt(i));
    }
  } else if (!Array.isArray(bytes)) {
    // Convert Array-like to Array
    bytes = Array.prototype.slice.call(bytes);
  }

  bytes.push(0x80);
  var l = bytes.length / 4 + 2;
  var N = Math.ceil(l / 16);
  var M = new Array(N);

  for (var _i = 0; _i < N; ++_i) {
    var arr = new Uint32Array(16);

    for (var j = 0; j < 16; ++j) {
      arr[j] = bytes[_i * 64 + j * 4] << 24 | bytes[_i * 64 + j * 4 + 1] << 16 | bytes[_i * 64 + j * 4 + 2] << 8 | bytes[_i * 64 + j * 4 + 3];
    }

    M[_i] = arr;
  }

  M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);
  M[N - 1][14] = Math.floor(M[N - 1][14]);
  M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;

  for (var _i2 = 0; _i2 < N; ++_i2) {
    var W = new Uint32Array(80);

    for (var t = 0; t < 16; ++t) {
      W[t] = M[_i2][t];
    }

    for (var _t = 16; _t < 80; ++_t) {
      W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1);
    }

    var a = H[0];
    var b = H[1];
    var c = H[2];
    var d = H[3];
    var e = H[4];

    for (var _t2 = 0; _t2 < 80; ++_t2) {
      var s = Math.floor(_t2 / 20);
      var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 0;
      e = d;
      d = c;
      c = ROTL(b, 30) >>> 0;
      b = a;
      a = T;
    }

    H[0] = H[0] + a >>> 0;
    H[1] = H[1] + b >>> 0;
    H[2] = H[2] + c >>> 0;
    H[3] = H[3] + d >>> 0;
    H[4] = H[4] + e >>> 0;
  }

  return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];
}

export default sha1;import validate from './validate.js';
/**
 * Convert array of 16 byte values to UUID string format of the form:
 * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
 */

var byteToHex = [];

for (var i = 0; i < 256; ++i) {
  byteToHex.push((i + 0x100).toString(16).substr(1));
}

function stringify(arr) {
  var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  // Note: Be careful editing this code!  It's been tuned for performance
  // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
  var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID.  If this throws, it's likely due to one
  // of the following:
  // - One or more input array values don't map to a hex octet (leading to
  // "undefined" in the uuid)
  // - Invalid input values for the RFC `version` or `variant` fields

  if (!validate(uuid)) {
    throw TypeError('Stringified UUID is invalid');
  }

  return uuid;
}

export default stringify;import rng from './rng.js';
import stringify from './stringify.js'; // **`v1()` - Generate time-based UUID**
//
// Inspired by https://github.com/LiosK/UUID.js
// and http://docs.python.org/library/uuid.html

var _nodeId;

var _clockseq; // Previous uuid creation time


var _lastMSecs = 0;
var _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details

function v1(options, buf, offset) {
  var i = buf && offset || 0;
  var b = buf || new Array(16);
  options = options || {};
  var node = options.node || _nodeId;
  var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not
  // specified.  We do this lazily to minimize issues related to insufficient
  // system entropy.  See #189

  if (node == null || clockseq == null) {
    var seedBytes = options.random || (options.rng || rng)();

    if (node == null) {
      // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
      node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];
    }

    if (clockseq == null) {
      // Per 4.2.2, randomize (14 bit) clockseq
      clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
    }
  } // UUID timestamps are 100 nano-second units since the Gregorian epoch,
  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so
  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.


  var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock
  // cycle to simulate higher resolution clock

  var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)

  var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression

  if (dt < 0 && options.clockseq === undefined) {
    clockseq = clockseq + 1 & 0x3fff;
  } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
  // time interval


  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
    nsecs = 0;
  } // Per 4.2.1.2 Throw error if too many uuids are requested


  if (nsecs >= 10000) {
    throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
  }

  _lastMSecs = msecs;
  _lastNSecs = nsecs;
  _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch

  msecs += 12219292800000; // `time_low`

  var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
  b[i++] = tl >>> 24 & 0xff;
  b[i++] = tl >>> 16 & 0xff;
  b[i++] = tl >>> 8 & 0xff;
  b[i++] = tl & 0xff; // `time_mid`

  var tmh = msecs / 0x100000000 * 10000 & 0xfffffff;
  b[i++] = tmh >>> 8 & 0xff;
  b[i++] = tmh & 0xff; // `time_high_and_version`

  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version

  b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)

  b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`

  b[i++] = clockseq & 0xff; // `node`

  for (var n = 0; n < 6; ++n) {
    b[i + n] = node[n];
  }

  return buf || stringify(b);
}

export default v1;import v35 from './v35.js';
import md5 from './md5.js';
var v3 = v35('v3', 0x30, md5);
export default v3;import stringify from './stringify.js';
import parse from './parse.js';

function stringToBytes(str) {
  str = unescape(encodeURIComponent(str)); // UTF8 escape

  var bytes = [];

  for (var i = 0; i < str.length; ++i) {
    bytes.push(str.charCodeAt(i));
  }

  return bytes;
}

export var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
export var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
export default function (name, version, hashfunc) {
  function generateUUID(value, namespace, buf, offset) {
    if (typeof value === 'string') {
      value = stringToBytes(value);
    }

    if (typeof namespace === 'string') {
      namespace = parse(namespace);
    }

    if (namespace.length !== 16) {
      throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');
    } // Compute hash of namespace and value, Per 4.3
    // Future: Use spread syntax when supported on all platforms, e.g. `bytes =
    // hashfunc([...namespace, ... value])`


    var bytes = new Uint8Array(16 + value.length);
    bytes.set(namespace);
    bytes.set(value, namespace.length);
    bytes = hashfunc(bytes);
    bytes[6] = bytes[6] & 0x0f | version;
    bytes[8] = bytes[8] & 0x3f | 0x80;

    if (buf) {
      offset = offset || 0;

      for (var i = 0; i < 16; ++i) {
        buf[offset + i] = bytes[i];
      }

      return buf;
    }

    return stringify(bytes);
  } // Function#name is not settable on some platforms (#270)


  try {
    generateUUID.name = name; // eslint-disable-next-line no-empty
  } catch (err) {} // For CommonJS default export support


  generateUUID.DNS = DNS;
  generateUUID.URL = URL;
  return generateUUID;
}import rng from './rng.js';
import stringify from './stringify.js';

function v4(options, buf, offset) {
  options = options || {};
  var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`

  rnds[6] = rnds[6] & 0x0f | 0x40;
  rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided

  if (buf) {
    offset = offset || 0;

    for (var i = 0; i < 16; ++i) {
      buf[offset + i] = rnds[i];
    }

    return buf;
  }

  return stringify(rnds);
}

export default v4;import v35 from './v35.js';
import sha1 from './sha1.js';
var v5 = v35('v5', 0x50, sha1);
export default v5;import REGEX from './regex.js';

function validate(uuid) {
  return typeof uuid === 'string' && REGEX.test(uuid);
}

export default validate;import validate from './validate.js';

function version(uuid) {
  if (!validate(uuid)) {
    throw TypeError('Invalid UUID');
  }

  return parseInt(uuid.substr(14, 1), 16);
}

export default version;#!/usr/bin/env node
require('../uuid-bin');
The MIT License (MIT)

Copyright (c) 2020 Microsoft

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": "@azure/core-tracing",
  "version": "1.0.0-preview.13",
  "description": "Provides low-level interfaces and helper methods for tracing in Azure SDK",
  "sdk-type": "client",
  "main": "dist/index.js",
  "module": "dist-esm/src/index.js",
  "browser": {
    "./dist-esm/src/utils/global.js": "./dist-esm/src/utils/global.browser.js"
  },
  "types": "types/core-tracing.d.ts",
  "files": [
    "dist/",
    "dist-esm/src/",
    "types/core-tracing.d.ts",
    "README.md",
    "LICENSE"
  ],
  "repository": "github:Azure/azure-sdk-for-js",
  "author": "Microsoft Corporation",
  "license": "MIT",
  "engines": {
    "node": ">=12.0.0"
  },
  "homepage": "https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/core/core-tracing/README.md",
  "sideEffects": false,
  "dependencies": {
    "@opentelemetry/api": "^1.0.1",
    "tslib": "^2.2.0"
  },
  "devDependencies": {
    "@azure/core-auth": "^1.3.0",
    "@azure/dev-tool": "^1.0.0",
    "@azure/eslint-plugin-azure-sdk": "^3.0.0",
    "@microsoft/api-extractor": "7.7.11",
    "@opentelemetry/tracing": "^0.22.0",
    "@types/chai": "^4.1.6",
    "@types/mocha": "^7.0.2",
    "@types/node": "^12.0.0",
    "chai": "^4.2.0",
    "cross-env": "^7.0.2",
    "eslint": "^7.15.0",
    "inherits": "^2.0.3",
    "karma": "^6.2.0",
    "karma-chrome-launcher": "^3.0.0",
    "karma-coverage": "^2.0.0",
    "karma-edge-launcher": "^0.4.2",
    "karma-env-preprocessor": "^0.1.1",
    "karma-firefox-launcher": "^1.1.0",
    "karma-ie-launcher": "^1.0.0",
    "karma-junit-reporter": "^2.0.1",
    "karma-mocha": "^2.0.1",
    "karma-mocha-reporter": "^2.2.5",
    "karma-sourcemap-loader": "^0.3.8",
    "mocha": "^7.1.1",
    "mocha-junit-reporter": "^1.18.0",
    "prettier": "^1.16.4",
    "rimraf": "^3.0.0",
    "rollup": "^1.16.3",
    "typescript": "~4.2.0",
    "util": "^0.12.1",
    "typedoc": "0.15.2",
    "sinon": "^9.0.2",
    "@types/sinon": "^9.0.4"
  }
}// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { SpanKind, setSpan, context as otContext, getTracer } from "./interfaces";
import { trace, INVALID_SPAN_CONTEXT } from "@opentelemetry/api";
export function isTracingDisabled() {
    var _a;
    if (typeof process === "undefined") {
        // not supported in browser for now without polyfills
        return false;
    }
    const azureTracingDisabledValue = (_a = process.env.AZURE_TRACING_DISABLED) === null || _a === void 0 ? void 0 : _a.toLowerCase();
    if (azureTracingDisabledValue === "false" || azureTracingDisabledValue === "0") {
        return false;
    }
    return Boolean(azureTracingDisabledValue);
}
/**
 * Creates a function that can be used to create spans using the global tracer.
 *
 * Usage:
 *
 * ```typescript
 * // once
 * const createSpan = createSpanFunction({ packagePrefix: "Azure.Data.AppConfiguration", namespace: "Microsoft.AppConfiguration" });
 *
 * // in each operation
 * const span = createSpan("deleteConfigurationSetting", operationOptions);
 *    // code...
 * span.end();
 * ```
 *
 * @hidden
 * @param args - allows configuration of the prefix for each span as well as the az.namespace field.
 */
export function createSpanFunction(args) {
    return function (operationName, operationOptions) {
        const tracer = getTracer();
        const tracingOptions = (operationOptions === null || operationOptions === void 0 ? void 0 : operationOptions.tracingOptions) || {};
        const spanOptions = Object.assign({ kind: SpanKind.INTERNAL }, tracingOptions.spanOptions);
        const spanName = args.packagePrefix ? `${args.packagePrefix}.${operationName}` : operationName;
        let span;
        if (isTracingDisabled()) {
            span = trace.wrapSpanContext(INVALID_SPAN_CONTEXT);
        }
        else {
            span = tracer.startSpan(spanName, spanOptions, tracingOptions.tracingContext);
        }
        if (args.namespace) {
            span.setAttribute("az.namespace", args.namespace);
        }
        let newSpanOptions = tracingOptions.spanOptions || {};
        if (span.isRecording() && args.namespace) {
            newSpanOptions = Object.assign(Object.assign({}, tracingOptions.spanOptions), { attributes: Object.assign(Object.assign({}, spanOptions.attributes), { "az.namespace": args.namespace }) });
        }
        const newTracingOptions = Object.assign(Object.assign({}, tracingOptions), { spanOptions: newSpanOptions, tracingContext: setSpan(tracingOptions.tracingContext || otContext.active(), span) });
        const newOperationOptions = Object.assign(Object.assign({}, operationOptions), { tracingOptions: newTracingOptions });
        return {
            span,
            updatedOptions: newOperationOptions
        };
    };
}
//# sourceMappingURL=createSpan.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
// Tracers and wrappers
export { createSpanFunction } from "./createSpan";
// Shared interfaces
export { context, getSpan, getSpanContext, getTracer, isSpanContextValid, setSpan, setSpanContext, SpanKind, SpanStatusCode } from "./interfaces";
// Utilities
export { extractSpanContextFromTraceParentHeader, getTraceParentHeader } from "./utils/traceParentHeader";
//# sourceMappingURL=index.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { context as otContext, trace as otTrace } from "@opentelemetry/api";
/**
 * The kind of span.
 */
export var SpanKind;
(function (SpanKind) {
    /** Default value. Indicates that the span is used internally. */
    SpanKind[SpanKind["INTERNAL"] = 0] = "INTERNAL";
    /**
     * Indicates that the span covers server-side handling of an RPC or other
     * remote request.
     */
    SpanKind[SpanKind["SERVER"] = 1] = "SERVER";
    /**
     * Indicates that the span covers the client-side wrapper around an RPC or
     * other remote request.
     */
    SpanKind[SpanKind["CLIENT"] = 2] = "CLIENT";
    /**
     * Indicates that the span describes producer sending a message to a
     * broker. Unlike client and server, there is no direct critical path latency
     * relationship between producer and consumer spans.
     */
    SpanKind[SpanKind["PRODUCER"] = 3] = "PRODUCER";
    /**
     * Indicates that the span describes consumer receiving a message from a
     * broker. Unlike client and server, there is no direct critical path latency
     * relationship between producer and consumer spans.
     */
    SpanKind[SpanKind["CONSUMER"] = 4] = "CONSUMER";
})(SpanKind || (SpanKind = {}));
/**
 * Return the span if one exists
 *
 * @param context - context to get span from
 */
export function getSpan(context) {
    return otTrace.getSpan(context);
}
/**
 * Set the span on a context
 *
 * @param context - context to use as parent
 * @param span - span to set active
 */
export function setSpan(context, span) {
    return otTrace.setSpan(context, span);
}
/**
 * Wrap span context in a NoopSpan and set as span in a new
 * context
 *
 * @param context - context to set active span on
 * @param spanContext - span context to be wrapped
 */
export function setSpanContext(context, spanContext) {
    return otTrace.setSpanContext(context, spanContext);
}
/**
 * Get the span context of the span if it exists.
 *
 * @param context - context to get values from
 */
export function getSpanContext(context) {
    return otTrace.getSpanContext(context);
}
/**
 * Returns true of the given {@link SpanContext} is valid.
 * A valid {@link SpanContext} is one which has a valid trace ID and span ID as per the spec.
 *
 * @param context - the {@link SpanContext} to validate.
 *
 * @returns true if the {@link SpanContext} is valid, false otherwise.
 */
export function isSpanContextValid(context) {
    return otTrace.isSpanContextValid(context);
}
export function getTracer(name, version) {
    return otTrace.getTracer(name || "azure/core-tracing", version);
}
/** Entrypoint for context API */
export const context = otContext;
/** SpanStatusCode */
export var SpanStatusCode;
(function (SpanStatusCode) {
    /**
     * The default status.
     */
    SpanStatusCode[SpanStatusCode["UNSET"] = 0] = "UNSET";
    /**
     * The operation has been validated by an Application developer or
     * Operator to have completed successfully.
     */
    SpanStatusCode[SpanStatusCode["OK"] = 1] = "OK";
    /**
     * The operation contains an error.
     */
    SpanStatusCode[SpanStatusCode["ERROR"] = 2] = "ERROR";
})(SpanStatusCode || (SpanStatusCode = {}));
//# sourceMappingURL=interfaces.js.map// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
const VERSION = "00";
/**
 * Generates a `SpanContext` given a `traceparent` header value.
 * @param traceParent - Serialized span context data as a `traceparent` header value.
 * @returns The `SpanContext` generated from the `traceparent` value.
 */
export function extractSpanContextFromTraceParentHeader(traceParentHeader) {
    const parts = traceParentHeader.split("-");
    if (parts.length !== 4) {
        return;
    }
    const [version, traceId, spanId, traceOptions] = parts;
    if (version !== VERSION) {
        return;
    }
    const traceFlags = parseInt(traceOptions, 16);
    const spanContext = {
        spanId,
        traceId,
        traceFlags
    };
    return spanContext;
}
/**
 * Generates a `traceparent` value given a span context.
 * @param spanContext - Contains context for a specific span.
 * @returns The `spanContext` represented as a `traceparent` value.
 */
export function getTraceParentHeader(spanContext) {
    const missingFields = [];
    if (!spanContext.traceId) {
        missingFields.push("traceId");
    }
    if (!spanContext.spanId) {
        missingFields.push("spanId");
    }
    if (missingFields.length) {
        return;
    }
    const flags = spanContext.traceFlags || 0 /* NONE */;
    const hexFlags = flags.toString(16);
    const traceFlags = hexFlags.length === 1 ? `0${hexFlags}` : hexFlags;
    // https://www.w3.org/TR/trace-context/#traceparent-header-field-values
    return `${VERSION}-${spanContext.traceId}-${spanContext.spanId}-${traceFlags}`;
}
//# sourceMappingURL=traceParentHeader.js.map'use strict';

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

var api = require('@opentelemetry/api');

// Copyright (c) Microsoft Corporation.
(function (SpanKind) {
    /** Default value. Indicates that the span is used internally. */
    SpanKind[SpanKind["INTERNAL"] = 0] = "INTERNAL";
    /**
     * Indicates that the span covers server-side handling of an RPC or other
     * remote request.
     */
    SpanKind[SpanKind["SERVER"] = 1] = "SERVER";
    /**
     * Indicates that the span covers the client-side wrapper around an RPC or
     * other remote request.
     */
    SpanKind[SpanKind["CLIENT"] = 2] = "CLIENT";
    /**
     * Indicates that the span describes producer sending a message to a
     * broker. Unlike client and server, there is no direct critical path latency
     * relationship between producer and consumer spans.
     */
    SpanKind[SpanKind["PRODUCER"] = 3] = "PRODUCER";
    /**
     * Indicates that the span describes consumer receiving a message from a
     * broker. Unlike client and server, there is no direct critical path latency
     * relationship between producer and consumer spans.
     */
    SpanKind[SpanKind["CONSUMER"] = 4] = "CONSUMER";
})(exports.SpanKind || (exports.SpanKind = {}));
/**
 * Return the span if one exists
 *
 * @param context - context to get span from
 */
function getSpan(context) {
    return api.trace.getSpan(context);
}
/**
 * Set the span on a context
 *
 * @param context - context to use as parent
 * @param span - span to set active
 */
function setSpan(context, span) {
    return api.trace.setSpan(context, span);
}
/**
 * Wrap span context in a NoopSpan and set as span in a new
 * context
 *
 * @param context - context to set active span on
 * @param spanContext - span context to be wrapped
 */
function setSpanContext(context, spanContext) {
    return api.trace.setSpanContext(context, spanContext);
}
/**
 * Get the span context of the span if it exists.
 *
 * @param context - context to get values from
 */
function getSpanContext(context) {
    return api.trace.getSpanContext(context);
}
/**
 * Returns true of the given {@link SpanContext} is valid.
 * A valid {@link SpanContext} is one which has a valid trace ID and span ID as per the spec.
 *
 * @param context - the {@link SpanContext} to validate.
 *
 * @returns true if the {@link SpanContext} is valid, false otherwise.
 */
function isSpanContextValid(context) {
    return api.trace.isSpanContextValid(context);
}
function getTracer(name, version) {
    return api.trace.getTracer(name || "azure/core-tracing", version);
}
/** Entrypoint for context API */
const context = api.context;
(function (SpanStatusCode) {
    /**
     * The default status.
     */
    SpanStatusCode[SpanStatusCode["UNSET"] = 0] = "UNSET";
    /**
     * The operation has been validated by an Application developer or
     * Operator to have completed successfully.
     */
    SpanStatusCode[SpanStatusCode["OK"] = 1] = "OK";
    /**
     * The operation contains an error.
     */
    SpanStatusCode[SpanStatusCode["ERROR"] = 2] = "ERROR";
})(exports.SpanStatusCode || (exports.SpanStatusCode = {}));

// Copyright (c) Microsoft Corporation.
function isTracingDisabled() {
    var _a;
    if (typeof process === "undefined") {
        // not supported in browser for now without polyfills
        return false;
    }
    const azureTracingDisabledValue = (_a = process.env.AZURE_TRACING_DISABLED) === null || _a === void 0 ? void 0 : _a.toLowerCase();
    if (azureTracingDisabledValue === "false" || azureTracingDisabledValue === "0") {
        return false;
    }
    return Boolean(azureTracingDisabledValue);
}
/**
 * Creates a function that can be used to create spans using the global tracer.
 *
 * Usage:
 *
 * ```typescript
 * // once
 * const createSpan = createSpanFunction({ packagePrefix: "Azure.Data.AppConfiguration", namespace: "Microsoft.AppConfiguration" });
 *
 * // in each operation
 * const span = createSpan("deleteConfigurationSetting", operationOptions);
 *    // code...
 * span.end();
 * ```
 *
 * @hidden
 * @param args - allows configuration of the prefix for each span as well as the az.namespace field.
 */
function createSpanFunction(args) {
    return function (operationName, operationOptions) {
        const tracer = getTracer();
        const tracingOptions = (operationOptions === null || operationOptions === void 0 ? void 0 : operationOptions.tracingOptions) || {};
        const spanOptions = Object.assign({ kind: exports.SpanKind.INTERNAL }, tracingOptions.spanOptions);
        const spanName = args.packagePrefix ? `${args.packagePrefix}.${operationName}` : operationName;
        let span;
        if (isTracingDisabled()) {
            span = api.trace.wrapSpanContext(api.INVALID_SPAN_CONTEXT);
        }
        else {
            span = tracer.startSpan(spanName, spanOptions, tracingOptions.tracingContext);
        }
        if (args.namespace) {
            span.setAttribute("az.namespace", args.namespace);
        }
        let newSpanOptions = tracingOptions.spanOptions || {};
        if (span.isRecording() && args.namespace) {
            newSpanOptions = Object.assign(Object.assign({}, tracingOptions.spanOptions), { attributes: Object.assign(Object.assign({}, spanOptions.attributes), { "az.namespace": args.namespace }) });
        }
        const newTracingOptions = Object.assign(Object.assign({}, tracingOptions), { spanOptions: newSpanOptions, tracingContext: setSpan(tracingOptions.tracingContext || context.active(), span) });
        const newOperationOptions = Object.assign(Object.assign({}, operationOptions), { tracingOptions: newTracingOptions });
        return {
            span,
            updatedOptions: newOperationOptions
        };
    };
}

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
const VERSION = "00";
/**
 * Generates a `SpanContext` given a `traceparent` header value.
 * @param traceParent - Serialized span context data as a `traceparent` header value.
 * @returns The `SpanContext` generated from the `traceparent` value.
 */
function extractSpanContextFromTraceParentHeader(traceParentHeader) {
    const parts = traceParentHeader.split("-");
    if (parts.length !== 4) {
        return;
    }
    const [version, traceId, spanId, traceOptions] = parts;
    if (version !== VERSION) {
        return;
    }
    const traceFlags = parseInt(traceOptions, 16);
    const spanContext = {
        spanId,
        traceId,
        traceFlags
    };
    return spanContext;
}
/**
 * Generates a `traceparent` value given a span context.
 * @param spanContext - Contains context for a specific span.
 * @returns The `spanContext` represented as a `traceparent` value.
 */
function getTraceParentHeader(spanContext) {
    const missingFields = [];
    if (!spanContext.traceId) {
        missingFields.push("traceId");
    }
    if (!spanContext.spanId) {
        missingFields.push("spanId");
    }
    if (missingFields.length) {
        return;
    }
    const flags = spanContext.traceFlags || 0 /* NONE */;
    const hexFlags = flags.toString(16);
    const traceFlags = hexFlags.length === 1 ? `0${hexFlags}` : hexFlags;
    // https://www.w3.org/TR/trace-context/#traceparent-header-field-values
    return `${VERSION}-${spanContext.traceId}-${spanContext.spanId}-${traceFlags}`;
}

exports.context = context;
exports.createSpanFunction = createSpanFunction;
exports.extractSpanContextFromTraceParentHeader = extractSpanContextFromTraceParentHeader;
exports.getSpan = getSpan;
exports.getSpanContext = getSpanContext;
exports.getTraceParentHeader = getTraceParentHeader;
exports.getTracer = getTracer;
exports.isSpanContextValid = isSpanContextValid;
exports.setSpan = setSpan;
exports.setSpanContext = setSpanContext;
//# sourceMappingURL=index.js.map
# Contributing

Please feel free to file GitHub Issues or propose Pull Requests. We're always happy to discuss improvements to this library!

## Testing

```shell
npm test
```

## Releasing

Releases are supposed to be done from master, version bumping is automated through [`standard-version`](https://github.com/conventional-changelog/standard-version):

```shell
npm run release -- --dry-run  # verify output manually
npm run release               # follow the instructions from the output of this command
```
The MIT License (MIT)

Copyright (c) 2010-2020 Robert Kieffer and other contributors

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

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

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
{
  "name": "uuid",
  "version": "8.3.2",
  "description": "RFC4122 (v1, v4, and v5) UUIDs",
  "commitlint": {
    "extends": [
      "@commitlint/config-conventional"
    ]
  },
  "license": "MIT",
  "bin": {
    "uuid": "./dist/bin/uuid"
  },
  "sideEffects": false,
  "main": "./dist/index.js",
  "exports": {
    ".": {
      "node": {
        "module": "./dist/esm-node/index.js",
        "require": "./dist/index.js",
        "import": "./wrapper.mjs"
      },
      "default": "./dist/esm-browser/index.js"
    },
    "./package.json": "./package.json"
  },
  "module": "./dist/esm-node/index.js",
  "browser": {
    "./dist/md5.js": "./dist/md5-browser.js",
    "./dist/rng.js": "./dist/rng-browser.js",
    "./dist/sha1.js": "./dist/sha1-browser.js",
    "./dist/esm-node/index.js": "./dist/esm-browser/index.js"
  },
  "files": [
    "CHANGELOG.md",
    "CONTRIBUTING.md",
    "LICENSE.md",
    "README.md",
    "dist",
    "wrapper.mjs"
  ],
  "devDependencies": {
    "@babel/cli": "7.11.6",
    "@babel/core": "7.11.6",
    "@babel/preset-env": "7.11.5",
    "@commitlint/cli": "11.0.0",
    "@commitlint/config-conventional": "11.0.0",
    "@rollup/plugin-node-resolve": "9.0.0",
    "babel-eslint": "10.1.0",
    "bundlewatch": "0.3.1",
    "eslint": "7.10.0",
    "eslint-config-prettier": "6.12.0",
    "eslint-config-standard": "14.1.1",
    "eslint-plugin-import": "2.22.1",
    "eslint-plugin-node": "11.1.0",
    "eslint-plugin-prettier": "3.1.4",
    "eslint-plugin-promise": "4.2.1",
    "eslint-plugin-standard": "4.0.1",
    "husky": "4.3.0",
    "jest": "25.5.4",
    "lint-staged": "10.4.0",
    "npm-run-all": "4.1.5",
    "optional-dev-dependency": "2.0.1",
    "prettier": "2.1.2",
    "random-seed": "0.3.0",
    "rollup": "2.28.2",
    "rollup-plugin-terser": "7.0.2",
    "runmd": "1.3.2",
    "standard-version": "9.0.0"
  },
  "optionalDevDependencies": {
    "@wdio/browserstack-service": "6.4.0",
    "@wdio/cli": "6.4.0",
    "@wdio/jasmine-framework": "6.4.0",
    "@wdio/local-runner": "6.4.0",
    "@wdio/spec-reporter": "6.4.0",
    "@wdio/static-server-service": "6.4.0",
    "@wdio/sync": "6.4.0"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/uuidjs/uuid.git"
  },
  "husky": {
    "hooks": {
      "commit-msg": "commitlint -E HUSKY_GIT_PARAMS",
      "pre-commit": "lint-staged"
    }
  },
  "lint-staged": {
    "*.{js,jsx,json,md}": [
      "prettier --write"
    ],
    "*.{js,jsx}": [
      "eslint --fix"
    ]
  },
  "standard-version": {
    "scripts": {
      "postchangelog": "prettier --write CHANGELOG.md"
    }
  }
}import uuid from './dist/index.js';
export const v1 = uuid.v1;
export const v3 = uuid.v3;
export const v4 = uuid.v4;
export const v5 = uuid.v5;
export const NIL = uuid.NIL;
export const version = uuid.version;
export const validate = uuid.validate;
export const stringify = uuid.stringify;
export const parse = uuid.parse;
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
Object.defineProperty(exports, "v1", {
  enumerable: true,
  get: function () {
    return _v.default;
  }
});
Object.defineProperty(exports, "v3", {
  enumerable: true,
  get: function () {
    return _v2.default;
  }
});
Object.defineProperty(exports, "v4", {
  enumerable: true,
  get: function () {
    return _v3.default;
  }
});
Object.defineProperty(exports, "v5", {
  enumerable: true,
  get: function () {
    return _v4.default;
  }
});
Object.defineProperty(exports, "NIL", {
  enumerable: true,
  get: function () {
    return _nil.default;
  }
});
Object.defineProperty(exports, "version", {
  enumerable: true,
  get: function () {
    return _version.default;
  }
});
Object.defineProperty(exports, "validate", {
  enumerable: true,
  get: function () {
    return _validate.default;
  }
});
Object.defineProperty(exports, "stringify", {
  enumerable: true,
  get: function () {
    return _stringify.default;
  }
});
Object.defineProperty(exports, "parse", {
  enumerable: true,
  get: function () {
    return _parse.default;
  }
});

var _v = _interopRequireDefault(require("./v1.js"));

var _v2 = _interopRequireDefault(require("./v3.js"));

var _v3 = _interopRequireDefault(require("./v4.js"));

var _v4 = _interopRequireDefault(require("./v5.js"));

var _nil = _interopRequireDefault(require("./nil.js"));

var _version = _interopRequireDefault(require("./version.js"));

var _validate = _interopRequireDefault(require("./validate.js"));

var _stringify = _interopRequireDefault(require("./stringify.js"));

var _parse = _interopRequireDefault(require("./parse.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/*
 * Browser-compatible JavaScript MD5
 *
 * Modification of JavaScript MD5
 * https://github.com/blueimp/JavaScript-MD5
 *
 * Copyright 2011, Sebastian Tschan
 * https://blueimp.net
 *
 * Licensed under the MIT license:
 * https://opensource.org/licenses/MIT
 *
 * Based on
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 */
function md5(bytes) {
  if (typeof bytes === 'string') {
    const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape

    bytes = new Uint8Array(msg.length);

    for (let i = 0; i < msg.length; ++i) {
      bytes[i] = msg.charCodeAt(i);
    }
  }

  return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));
}
/*
 * Convert an array of little-endian words to an array of bytes
 */


function md5ToHexEncodedArray(input) {
  const output = [];
  const length32 = input.length * 32;
  const hexTab = '0123456789abcdef';

  for (let i = 0; i < length32; i += 8) {
    const x = input[i >> 5] >>> i % 32 & 0xff;
    const hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);
    output.push(hex);
  }

  return output;
}
/**
 * Calculate output length with padding and bit length
 */


function getOutputLength(inputLength8) {
  return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;
}
/*
 * Calculate the MD5 of an array of little-endian words, and a bit length.
 */


function wordsToMd5(x, len) {
  /* append padding */
  x[len >> 5] |= 0x80 << len % 32;
  x[getOutputLength(len) - 1] = len;
  let a = 1732584193;
  let b = -271733879;
  let c = -1732584194;
  let d = 271733878;

  for (let i = 0; i < x.length; i += 16) {
    const olda = a;
    const oldb = b;
    const oldc = c;
    const oldd = d;
    a = md5ff(a, b, c, d, x[i], 7, -680876936);
    d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);
    c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);
    b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
    a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);
    d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
    c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
    b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);
    a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
    d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
    c = md5ff(c, d, a, b, x[i + 10], 17, -42063);
    b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
    a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
    d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);
    c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
    b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
    a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);
    d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
    c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);
    b = md5gg(b, c, d, a, x[i], 20, -373897302);
    a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);
    d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);
    c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);
    b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);
    a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);
    d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
    c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);
    b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
    a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
    d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);
    c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
    b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
    a = md5hh(a, b, c, d, x[i + 5], 4, -378558);
    d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
    c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
    b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);
    a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
    d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
    c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);
    b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
    a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);
    d = md5hh(d, a, b, c, x[i], 11, -358537222);
    c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);
    b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);
    a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);
    d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);
    c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);
    b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);
    a = md5ii(a, b, c, d, x[i], 6, -198630844);
    d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
    c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
    b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);
    a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
    d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
    c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);
    b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
    a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
    d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);
    c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
    b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
    a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);
    d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
    c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);
    b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);
    a = safeAdd(a, olda);
    b = safeAdd(b, oldb);
    c = safeAdd(c, oldc);
    d = safeAdd(d, oldd);
  }

  return [a, b, c, d];
}
/*
 * Convert an array bytes to an array of little-endian words
 * Characters >255 have their high-byte silently ignored.
 */


function bytesToWords(input) {
  if (input.length === 0) {
    return [];
  }

  const length8 = input.length * 8;
  const output = new Uint32Array(getOutputLength(length8));

  for (let i = 0; i < length8; i += 8) {
    output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;
  }

  return output;
}
/*
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
 * to work around bugs in some JS interpreters.
 */


function safeAdd(x, y) {
  const lsw = (x & 0xffff) + (y & 0xffff);
  const msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return msw << 16 | lsw & 0xffff;
}
/*
 * Bitwise rotate a 32-bit number to the left.
 */


function bitRotateLeft(num, cnt) {
  return num << cnt | num >>> 32 - cnt;
}
/*
 * These functions implement the four basic operations the algorithm uses.
 */


function md5cmn(q, a, b, x, s, t) {
  return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);
}

function md5ff(a, b, c, d, x, s, t) {
  return md5cmn(b & c | ~b & d, a, b, x, s, t);
}

function md5gg(a, b, c, d, x, s, t) {
  return md5cmn(b & d | c & ~d, a, b, x, s, t);
}

function md5hh(a, b, c, d, x, s, t) {
  return md5cmn(b ^ c ^ d, a, b, x, s, t);
}

function md5ii(a, b, c, d, x, s, t) {
  return md5cmn(c ^ (b | ~d), a, b, x, s, t);
}

var _default = md5;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _crypto = _interopRequireDefault(require("crypto"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function md5(bytes) {
  if (Array.isArray(bytes)) {
    bytes = Buffer.from(bytes);
  } else if (typeof bytes === 'string') {
    bytes = Buffer.from(bytes, 'utf8');
  }

  return _crypto.default.createHash('md5').update(bytes).digest();
}

var _default = md5;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var _default = '00000000-0000-0000-0000-000000000000';
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _validate = _interopRequireDefault(require("./validate.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function parse(uuid) {
  if (!(0, _validate.default)(uuid)) {
    throw TypeError('Invalid UUID');
  }

  let v;
  const arr = new Uint8Array(16); // Parse ########-....-....-....-............

  arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;
  arr[1] = v >>> 16 & 0xff;
  arr[2] = v >>> 8 & 0xff;
  arr[3] = v & 0xff; // Parse ........-####-....-....-............

  arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;
  arr[5] = v & 0xff; // Parse ........-....-####-....-............

  arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;
  arr[7] = v & 0xff; // Parse ........-....-....-####-............

  arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;
  arr[9] = v & 0xff; // Parse ........-....-....-....-############
  // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes)

  arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;
  arr[11] = v / 0x100000000 & 0xff;
  arr[12] = v >>> 24 & 0xff;
  arr[13] = v >>> 16 & 0xff;
  arr[14] = v >>> 8 & 0xff;
  arr[15] = v & 0xff;
  return arr;
}

var _default = parse;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var _default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = rng;
// Unique ID creation requires a high quality random # generator. In the browser we therefore
// require the crypto API and do not support built-in fallback to lower quality random number
// generators (like Math.random()).
let getRandomValues;
const rnds8 = new Uint8Array(16);

function rng() {
  // lazy load so that environments that need to polyfill have a chance to do so
  if (!getRandomValues) {
    // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. Also,
    // find the complete implementation of crypto (msCrypto) on IE11.
    getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);

    if (!getRandomValues) {
      throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');
    }
  }

  return getRandomValues(rnds8);
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = rng;

var _crypto = _interopRequireDefault(require("crypto"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate

let poolPtr = rnds8Pool.length;

function rng() {
  if (poolPtr > rnds8Pool.length - 16) {
    _crypto.default.randomFillSync(rnds8Pool);

    poolPtr = 0;
  }

  return rnds8Pool.slice(poolPtr, poolPtr += 16);
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

// Adapted from Chris Veness' SHA1 code at
// http://www.movable-type.co.uk/scripts/sha1.html
function f(s, x, y, z) {
  switch (s) {
    case 0:
      return x & y ^ ~x & z;

    case 1:
      return x ^ y ^ z;

    case 2:
      return x & y ^ x & z ^ y & z;

    case 3:
      return x ^ y ^ z;
  }
}

function ROTL(x, n) {
  return x << n | x >>> 32 - n;
}

function sha1(bytes) {
  const K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];
  const H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];

  if (typeof bytes === 'string') {
    const msg = unescape(encodeURIComponent(bytes)); // UTF8 escape

    bytes = [];

    for (let i = 0; i < msg.length; ++i) {
      bytes.push(msg.charCodeAt(i));
    }
  } else if (!Array.isArray(bytes)) {
    // Convert Array-like to Array
    bytes = Array.prototype.slice.call(bytes);
  }

  bytes.push(0x80);
  const l = bytes.length / 4 + 2;
  const N = Math.ceil(l / 16);
  const M = new Array(N);

  for (let i = 0; i < N; ++i) {
    const arr = new Uint32Array(16);

    for (let j = 0; j < 16; ++j) {
      arr[j] = bytes[i * 64 + j * 4] << 24 | bytes[i * 64 + j * 4 + 1] << 16 | bytes[i * 64 + j * 4 + 2] << 8 | bytes[i * 64 + j * 4 + 3];
    }

    M[i] = arr;
  }

  M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);
  M[N - 1][14] = Math.floor(M[N - 1][14]);
  M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;

  for (let i = 0; i < N; ++i) {
    const W = new Uint32Array(80);

    for (let t = 0; t < 16; ++t) {
      W[t] = M[i][t];
    }

    for (let t = 16; t < 80; ++t) {
      W[t] = ROTL(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1);
    }

    let a = H[0];
    let b = H[1];
    let c = H[2];
    let d = H[3];
    let e = H[4];

    for (let t = 0; t < 80; ++t) {
      const s = Math.floor(t / 20);
      const T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[t] >>> 0;
      e = d;
      d = c;
      c = ROTL(b, 30) >>> 0;
      b = a;
      a = T;
    }

    H[0] = H[0] + a >>> 0;
    H[1] = H[1] + b >>> 0;
    H[2] = H[2] + c >>> 0;
    H[3] = H[3] + d >>> 0;
    H[4] = H[4] + e >>> 0;
  }

  return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];
}

var _default = sha1;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _crypto = _interopRequireDefault(require("crypto"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function sha1(bytes) {
  if (Array.isArray(bytes)) {
    bytes = Buffer.from(bytes);
  } else if (typeof bytes === 'string') {
    bytes = Buffer.from(bytes, 'utf8');
  }

  return _crypto.default.createHash('sha1').update(bytes).digest();
}

var _default = sha1;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _validate = _interopRequireDefault(require("./validate.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/**
 * Convert array of 16 byte values to UUID string format of the form:
 * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
 */
const byteToHex = [];

for (let i = 0; i < 256; ++i) {
  byteToHex.push((i + 0x100).toString(16).substr(1));
}

function stringify(arr, offset = 0) {
  // Note: Be careful editing this code!  It's been tuned for performance
  // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
  const uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID.  If this throws, it's likely due to one
  // of the following:
  // - One or more input array values don't map to a hex octet (leading to
  // "undefined" in the uuid)
  // - Invalid input values for the RFC `version` or `variant` fields

  if (!(0, _validate.default)(uuid)) {
    throw TypeError('Stringified UUID is invalid');
  }

  return uuid;
}

var _default = stringify;
exports.default = _default;"use strict";

var _assert = _interopRequireDefault(require("assert"));

var _v = _interopRequireDefault(require("./v1.js"));

var _v2 = _interopRequireDefault(require("./v3.js"));

var _v3 = _interopRequireDefault(require("./v4.js"));

var _v4 = _interopRequireDefault(require("./v5.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function usage() {
  console.log('Usage:');
  console.log('  uuid');
  console.log('  uuid v1');
  console.log('  uuid v3 <name> <namespace uuid>');
  console.log('  uuid v4');
  console.log('  uuid v5 <name> <namespace uuid>');
  console.log('  uuid --help');
  console.log('\nNote: <namespace uuid> may be "URL" or "DNS" to use the corresponding UUIDs defined by RFC4122');
}

const args = process.argv.slice(2);

if (args.indexOf('--help') >= 0) {
  usage();
  process.exit(0);
}

const version = args.shift() || 'v4';

switch (version) {
  case 'v1':
    console.log((0, _v.default)());
    break;

  case 'v3':
    {
      const name = args.shift();
      let namespace = args.shift();
      (0, _assert.default)(name != null, 'v3 name not specified');
      (0, _assert.default)(namespace != null, 'v3 namespace not specified');

      if (namespace === 'URL') {
        namespace = _v2.default.URL;
      }

      if (namespace === 'DNS') {
        namespace = _v2.default.DNS;
      }

      console.log((0, _v2.default)(name, namespace));
      break;
    }

  case 'v4':
    console.log((0, _v3.default)());
    break;

  case 'v5':
    {
      const name = args.shift();
      let namespace = args.shift();
      (0, _assert.default)(name != null, 'v5 name not specified');
      (0, _assert.default)(namespace != null, 'v5 namespace not specified');

      if (namespace === 'URL') {
        namespace = _v4.default.URL;
      }

      if (namespace === 'DNS') {
        namespace = _v4.default.DNS;
      }

      console.log((0, _v4.default)(name, namespace));
      break;
    }

  default:
    usage();
    process.exit(1);
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _rng = _interopRequireDefault(require("./rng.js"));

var _stringify = _interopRequireDefault(require("./stringify.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

// **`v1()` - Generate time-based UUID**
//
// Inspired by https://github.com/LiosK/UUID.js
// and http://docs.python.org/library/uuid.html
let _nodeId;

let _clockseq; // Previous uuid creation time


let _lastMSecs = 0;
let _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details

function v1(options, buf, offset) {
  let i = buf && offset || 0;
  const b = buf || new Array(16);
  options = options || {};
  let node = options.node || _nodeId;
  let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not
  // specified.  We do this lazily to minimize issues related to insufficient
  // system entropy.  See #189

  if (node == null || clockseq == null) {
    const seedBytes = options.random || (options.rng || _rng.default)();

    if (node == null) {
      // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
      node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];
    }

    if (clockseq == null) {
      // Per 4.2.2, randomize (14 bit) clockseq
      clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
    }
  } // UUID timestamps are 100 nano-second units since the Gregorian epoch,
  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so
  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.


  let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock
  // cycle to simulate higher resolution clock

  let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)

  const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression

  if (dt < 0 && options.clockseq === undefined) {
    clockseq = clockseq + 1 & 0x3fff;
  } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
  // time interval


  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
    nsecs = 0;
  } // Per 4.2.1.2 Throw error if too many uuids are requested


  if (nsecs >= 10000) {
    throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
  }

  _lastMSecs = msecs;
  _lastNSecs = nsecs;
  _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch

  msecs += 12219292800000; // `time_low`

  const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
  b[i++] = tl >>> 24 & 0xff;
  b[i++] = tl >>> 16 & 0xff;
  b[i++] = tl >>> 8 & 0xff;
  b[i++] = tl & 0xff; // `time_mid`

  const tmh = msecs / 0x100000000 * 10000 & 0xfffffff;
  b[i++] = tmh >>> 8 & 0xff;
  b[i++] = tmh & 0xff; // `time_high_and_version`

  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version

  b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)

  b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`

  b[i++] = clockseq & 0xff; // `node`

  for (let n = 0; n < 6; ++n) {
    b[i + n] = node[n];
  }

  return buf || (0, _stringify.default)(b);
}

var _default = v1;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _v = _interopRequireDefault(require("./v35.js"));

var _md = _interopRequireDefault(require("./md5.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const v3 = (0, _v.default)('v3', 0x30, _md.default);
var _default = v3;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = _default;
exports.URL = exports.DNS = void 0;

var _stringify = _interopRequireDefault(require("./stringify.js"));

var _parse = _interopRequireDefault(require("./parse.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function stringToBytes(str) {
  str = unescape(encodeURIComponent(str)); // UTF8 escape

  const bytes = [];

  for (let i = 0; i < str.length; ++i) {
    bytes.push(str.charCodeAt(i));
  }

  return bytes;
}

const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
exports.DNS = DNS;
const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
exports.URL = URL;

function _default(name, version, hashfunc) {
  function generateUUID(value, namespace, buf, offset) {
    if (typeof value === 'string') {
      value = stringToBytes(value);
    }

    if (typeof namespace === 'string') {
      namespace = (0, _parse.default)(namespace);
    }

    if (namespace.length !== 16) {
      throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');
    } // Compute hash of namespace and value, Per 4.3
    // Future: Use spread syntax when supported on all platforms, e.g. `bytes =
    // hashfunc([...namespace, ... value])`


    let bytes = new Uint8Array(16 + value.length);
    bytes.set(namespace);
    bytes.set(value, namespace.length);
    bytes = hashfunc(bytes);
    bytes[6] = bytes[6] & 0x0f | version;
    bytes[8] = bytes[8] & 0x3f | 0x80;

    if (buf) {
      offset = offset || 0;

      for (let i = 0; i < 16; ++i) {
        buf[offset + i] = bytes[i];
      }

      return buf;
    }

    return (0, _stringify.default)(bytes);
  } // Function#name is not settable on some platforms (#270)


  try {
    generateUUID.name = name; // eslint-disable-next-line no-empty
  } catch (err) {} // For CommonJS default export support


  generateUUID.DNS = DNS;
  generateUUID.URL = URL;
  return generateUUID;
}"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _rng = _interopRequireDefault(require("./rng.js"));

var _stringify = _interopRequireDefault(require("./stringify.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function v4(options, buf, offset) {
  options = options || {};

  const rnds = options.random || (options.rng || _rng.default)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`


  rnds[6] = rnds[6] & 0x0f | 0x40;
  rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided

  if (buf) {
    offset = offset || 0;

    for (let i = 0; i < 16; ++i) {
      buf[offset + i] = rnds[i];
    }

    return buf;
  }

  return (0, _stringify.default)(rnds);
}

var _default = v4;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _v = _interopRequireDefault(require("./v35.js"));

var _sha = _interopRequireDefault(require("./sha1.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const v5 = (0, _v.default)('v5', 0x50, _sha.default);
var _default = v5;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _regex = _interopRequireDefault(require("./regex.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function validate(uuid) {
  return typeof uuid === 'string' && _regex.default.test(uuid);
}

var _default = validate;
exports.default = _default;"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _validate = _interopRequireDefault(require("./validate.js"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function version(uuid) {
  if (!(0, _validate.default)(uuid)) {
    throw TypeError('Invalid UUID');
  }

  return parseInt(uuid.substr(14, 1), 16);
}

var _default = version;
exports.default = _default;!function(r,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((r="undefined"!=typeof globalThis?globalThis:r||self).uuid={})}(this,(function(r){"use strict";var e,n=new Uint8Array(16);function t(){if(!e&&!(e="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return e(n)}var o=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function a(r){return"string"==typeof r&&o.test(r)}for(var i,u,f=[],s=0;s<256;++s)f.push((s+256).toString(16).substr(1));function c(r){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(f[r[e+0]]+f[r[e+1]]+f[r[e+2]]+f[r[e+3]]+"-"+f[r[e+4]]+f[r[e+5]]+"-"+f[r[e+6]]+f[r[e+7]]+"-"+f[r[e+8]]+f[r[e+9]]+"-"+f[r[e+10]]+f[r[e+11]]+f[r[e+12]]+f[r[e+13]]+f[r[e+14]]+f[r[e+15]]).toLowerCase();if(!a(n))throw TypeError("Stringified UUID is invalid");return n}var l=0,d=0;function v(r){if(!a(r))throw TypeError("Invalid UUID");var e,n=new Uint8Array(16);return n[0]=(e=parseInt(r.slice(0,8),16))>>>24,n[1]=e>>>16&255,n[2]=e>>>8&255,n[3]=255&e,n[4]=(e=parseInt(r.slice(9,13),16))>>>8,n[5]=255&e,n[6]=(e=parseInt(r.slice(14,18),16))>>>8,n[7]=255&e,n[8]=(e=parseInt(r.slice(19,23),16))>>>8,n[9]=255&e,n[10]=(e=parseInt(r.slice(24,36),16))/1099511627776&255,n[11]=e/4294967296&255,n[12]=e>>>24&255,n[13]=e>>>16&255,n[14]=e>>>8&255,n[15]=255&e,n}function p(r,e,n){function t(r,t,o,a){if("string"==typeof r&&(r=function(r){r=unescape(encodeURIComponent(r));for(var e=[],n=0;n<r.length;++n)e.push(r.charCodeAt(n));return e}(r)),"string"==typeof t&&(t=v(t)),16!==t.length)throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");var i=new Uint8Array(16+r.length);if(i.set(t),i.set(r,t.length),(i=n(i))[6]=15&i[6]|e,i[8]=63&i[8]|128,o){a=a||0;for(var u=0;u<16;++u)o[a+u]=i[u];return o}return c(i)}try{t.name=r}catch(r){}return t.DNS="6ba7b810-9dad-11d1-80b4-00c04fd430c8",t.URL="6ba7b811-9dad-11d1-80b4-00c04fd430c8",t}function h(r){return 14+(r+64>>>9<<4)+1}function y(r,e){var n=(65535&r)+(65535&e);return(r>>16)+(e>>16)+(n>>16)<<16|65535&n}function g(r,e,n,t,o,a){return y((i=y(y(e,r),y(t,a)))<<(u=o)|i>>>32-u,n);var i,u}function m(r,e,n,t,o,a,i){return g(e&n|~e&t,r,e,o,a,i)}function w(r,e,n,t,o,a,i){return g(e&t|n&~t,r,e,o,a,i)}function b(r,e,n,t,o,a,i){return g(e^n^t,r,e,o,a,i)}function A(r,e,n,t,o,a,i){return g(n^(e|~t),r,e,o,a,i)}var U=p("v3",48,(function(r){if("string"==typeof r){var e=unescape(encodeURIComponent(r));r=new Uint8Array(e.length);for(var n=0;n<e.length;++n)r[n]=e.charCodeAt(n)}return function(r){for(var e=[],n=32*r.length,t="0123456789abcdef",o=0;o<n;o+=8){var a=r[o>>5]>>>o%32&255,i=parseInt(t.charAt(a>>>4&15)+t.charAt(15&a),16);e.push(i)}return e}(function(r,e){r[e>>5]|=128<<e%32,r[h(e)-1]=e;for(var n=1732584193,t=-271733879,o=-1732584194,a=271733878,i=0;i<r.length;i+=16){var u=n,f=t,s=o,c=a;n=m(n,t,o,a,r[i],7,-680876936),a=m(a,n,t,o,r[i+1],12,-389564586),o=m(o,a,n,t,r[i+2],17,606105819),t=m(t,o,a,n,r[i+3],22,-1044525330),n=m(n,t,o,a,r[i+4],7,-176418897),a=m(a,n,t,o,r[i+5],12,1200080426),o=m(o,a,n,t,r[i+6],17,-1473231341),t=m(t,o,a,n,r[i+7],22,-45705983),n=m(n,t,o,a,r[i+8],7,1770035416),a=m(a,n,t,o,r[i+9],12,-1958414417),o=m(o,a,n,t,r[i+10],17,-42063),t=m(t,o,a,n,r[i+11],22,-1990404162),n=m(n,t,o,a,r[i+12],7,1804603682),a=m(a,n,t,o,r[i+13],12,-40341101),o=m(o,a,n,t,r[i+14],17,-1502002290),n=w(n,t=m(t,o,a,n,r[i+15],22,1236535329),o,a,r[i+1],5,-165796510),a=w(a,n,t,o,r[i+6],9,-1069501632),o=w(o,a,n,t,r[i+11],14,643717713),t=w(t,o,a,n,r[i],20,-373897302),n=w(n,t,o,a,r[i+5],5,-701558691),a=w(a,n,t,o,r[i+10],9,38016083),o=w(o,a,n,t,r[i+15],14,-660478335),t=w(t,o,a,n,r[i+4],20,-405537848),n=w(n,t,o,a,r[i+9],5,568446438),a=w(a,n,t,o,r[i+14],9,-1019803690),o=w(o,a,n,t,r[i+3],14,-187363961),t=w(t,o,a,n,r[i+8],20,1163531501),n=w(n,t,o,a,r[i+13],5,-1444681467),a=w(a,n,t,o,r[i+2],9,-51403784),o=w(o,a,n,t,r[i+7],14,1735328473),n=b(n,t=w(t,o,a,n,r[i+12],20,-1926607734),o,a,r[i+5],4,-378558),a=b(a,n,t,o,r[i+8],11,-2022574463),o=b(o,a,n,t,r[i+11],16,1839030562),t=b(t,o,a,n,r[i+14],23,-35309556),n=b(n,t,o,a,r[i+1],4,-1530992060),a=b(a,n,t,o,r[i+4],11,1272893353),o=b(o,a,n,t,r[i+7],16,-155497632),t=b(t,o,a,n,r[i+10],23,-1094730640),n=b(n,t,o,a,r[i+13],4,681279174),a=b(a,n,t,o,r[i],11,-358537222),o=b(o,a,n,t,r[i+3],16,-722521979),t=b(t,o,a,n,r[i+6],23,76029189),n=b(n,t,o,a,r[i+9],4,-640364487),a=b(a,n,t,o,r[i+12],11,-421815835),o=b(o,a,n,t,r[i+15],16,530742520),n=A(n,t=b(t,o,a,n,r[i+2],23,-995338651),o,a,r[i],6,-198630844),a=A(a,n,t,o,r[i+7],10,1126891415),o=A(o,a,n,t,r[i+14],15,-1416354905),t=A(t,o,a,n,r[i+5],21,-57434055),n=A(n,t,o,a,r[i+12],6,1700485571),a=A(a,n,t,o,r[i+3],10,-1894986606),o=A(o,a,n,t,r[i+10],15,-1051523),t=A(t,o,a,n,r[i+1],21,-2054922799),n=A(n,t,o,a,r[i+8],6,1873313359),a=A(a,n,t,o,r[i+15],10,-30611744),o=A(o,a,n,t,r[i+6],15,-1560198380),t=A(t,o,a,n,r[i+13],21,1309151649),n=A(n,t,o,a,r[i+4],6,-145523070),a=A(a,n,t,o,r[i+11],10,-1120210379),o=A(o,a,n,t,r[i+2],15,718787259),t=A(t,o,a,n,r[i+9],21,-343485551),n=y(n,u),t=y(t,f),o=y(o,s),a=y(a,c)}return[n,t,o,a]}(function(r){if(0===r.length)return[];for(var e=8*r.length,n=new Uint32Array(h(e)),t=0;t<e;t+=8)n[t>>5]|=(255&r[t/8])<<t%32;return n}(r),8*r.length))}));function I(r,e,n,t){switch(r){case 0:return e&n^~e&t;case 1:return e^n^t;case 2:return e&n^e&t^n&t;case 3:return e^n^t}}function C(r,e){return r<<e|r>>>32-e}var R=p("v5",80,(function(r){var e=[1518500249,1859775393,2400959708,3395469782],n=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof r){var t=unescape(encodeURIComponent(r));r=[];for(var o=0;o<t.length;++o)r.push(t.charCodeAt(o))}else Array.isArray(r)||(r=Array.prototype.slice.call(r));r.push(128);for(var a=r.length/4+2,i=Math.ceil(a/16),u=new Array(i),f=0;f<i;++f){for(var s=new Uint32Array(16),c=0;c<16;++c)s[c]=r[64*f+4*c]<<24|r[64*f+4*c+1]<<16|r[64*f+4*c+2]<<8|r[64*f+4*c+3];u[f]=s}u[i-1][14]=8*(r.length-1)/Math.pow(2,32),u[i-1][14]=Math.floor(u[i-1][14]),u[i-1][15]=8*(r.length-1)&4294967295;for(var l=0;l<i;++l){for(var d=new Uint32Array(80),v=0;v<16;++v)d[v]=u[l][v];for(var p=16;p<80;++p)d[p]=C(d[p-3]^d[p-8]^d[p-14]^d[p-16],1);for(var h=n[0],y=n[1],g=n[2],m=n[3],w=n[4],b=0;b<80;++b){var A=Math.floor(b/20),U=C(h,5)+I(A,y,g,m)+w+e[A]+d[b]>>>0;w=m,m=g,g=C(y,30)>>>0,y=h,h=U}n[0]=n[0]+h>>>0,n[1]=n[1]+y>>>0,n[2]=n[2]+g>>>0,n[3]=n[3]+m>>>0,n[4]=n[4]+w>>>0}return[n[0]>>24&255,n[0]>>16&255,n[0]>>8&255,255&n[0],n[1]>>24&255,n[1]>>16&255,n[1]>>8&255,255&n[1],n[2]>>24&255,n[2]>>16&255,n[2]>>8&255,255&n[2],n[3]>>24&255,n[3]>>16&255,n[3]>>8&255,255&n[3],n[4]>>24&255,n[4]>>16&255,n[4]>>8&255,255&n[4]]}));r.NIL="00000000-0000-0000-0000-000000000000",r.parse=v,r.stringify=c,r.v1=function(r,e,n){var o=e&&n||0,a=e||new Array(16),f=(r=r||{}).node||i,s=void 0!==r.clockseq?r.clockseq:u;if(null==f||null==s){var v=r.random||(r.rng||t)();null==f&&(f=i=[1|v[0],v[1],v[2],v[3],v[4],v[5]]),null==s&&(s=u=16383&(v[6]<<8|v[7]))}var p=void 0!==r.msecs?r.msecs:Date.now(),h=void 0!==r.nsecs?r.nsecs:d+1,y=p-l+(h-d)/1e4;if(y<0&&void 0===r.clockseq&&(s=s+1&16383),(y<0||p>l)&&void 0===r.nsecs&&(h=0),h>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");l=p,d=h,u=s;var g=(1e4*(268435455&(p+=122192928e5))+h)%4294967296;a[o++]=g>>>24&255,a[o++]=g>>>16&255,a[o++]=g>>>8&255,a[o++]=255&g;var m=p/4294967296*1e4&268435455;a[o++]=m>>>8&255,a[o++]=255&m,a[o++]=m>>>24&15|16,a[o++]=m>>>16&255,a[o++]=s>>>8|128,a[o++]=255&s;for(var w=0;w<6;++w)a[o+w]=f[w];return e||c(a)},r.v3=U,r.v4=function(r,e,n){var o=(r=r||{}).random||(r.rng||t)();if(o[6]=15&o[6]|64,o[8]=63&o[8]|128,e){n=n||0;for(var a=0;a<16;++a)e[n+a]=o[a];return e}return c(o)},r.v5=R,r.validate=a,r.version=function(r){if(!a(r))throw TypeError("Invalid UUID");return parseInt(r.substr(14,1),16)},Object.defineProperty(r,"__esModule",{value:!0})}));!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidNIL=n()}(this,(function(){"use strict";return"00000000-0000-0000-0000-000000000000"}));!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidParse=n()}(this,(function(){"use strict";var e=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;return function(n){if(!function(n){return"string"==typeof n&&e.test(n)}(n))throw TypeError("Invalid UUID");var t,i=new Uint8Array(16);return i[0]=(t=parseInt(n.slice(0,8),16))>>>24,i[1]=t>>>16&255,i[2]=t>>>8&255,i[3]=255&t,i[4]=(t=parseInt(n.slice(9,13),16))>>>8,i[5]=255&t,i[6]=(t=parseInt(n.slice(14,18),16))>>>8,i[7]=255&t,i[8]=(t=parseInt(n.slice(19,23),16))>>>8,i[9]=255&t,i[10]=(t=parseInt(n.slice(24,36),16))/1099511627776&255,i[11]=t/4294967296&255,i[12]=t>>>24&255,i[13]=t>>>16&255,i[14]=t>>>8&255,i[15]=255&t,i}}));!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidStringify=t()}(this,(function(){"use strict";var e=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function t(t){return"string"==typeof t&&e.test(t)}for(var i=[],n=0;n<256;++n)i.push((n+256).toString(16).substr(1));return function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,f=(i[e[n+0]]+i[e[n+1]]+i[e[n+2]]+i[e[n+3]]+"-"+i[e[n+4]]+i[e[n+5]]+"-"+i[e[n+6]]+i[e[n+7]]+"-"+i[e[n+8]]+i[e[n+9]]+"-"+i[e[n+10]]+i[e[n+11]]+i[e[n+12]]+i[e[n+13]]+i[e[n+14]]+i[e[n+15]]).toLowerCase();if(!t(f))throw TypeError("Stringified UUID is invalid");return f}}));!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidValidate=t()}(this,(function(){"use strict";var e=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;return function(t){return"string"==typeof t&&e.test(t)}}));!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidVersion=t()}(this,(function(){"use strict";var e=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;return function(t){if(!function(t){return"string"==typeof t&&e.test(t)}(t))throw TypeError("Invalid UUID");return parseInt(t.substr(14,1),16)}}));!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?module.exports=o():"function"==typeof define&&define.amd?define(o):(e="undefined"!=typeof globalThis?globalThis:e||self).uuidv1=o()}(this,(function(){"use strict";var e,o=new Uint8Array(16);function t(){if(!e&&!(e="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return e(o)}var n=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function r(e){return"string"==typeof e&&n.test(e)}for(var i,u,s=[],a=0;a<256;++a)s.push((a+256).toString(16).substr(1));var d=0,f=0;return function(e,o,n){var a=o&&n||0,c=o||new Array(16),l=(e=e||{}).node||i,p=void 0!==e.clockseq?e.clockseq:u;if(null==l||null==p){var v=e.random||(e.rng||t)();null==l&&(l=i=[1|v[0],v[1],v[2],v[3],v[4],v[5]]),null==p&&(p=u=16383&(v[6]<<8|v[7]))}var y=void 0!==e.msecs?e.msecs:Date.now(),m=void 0!==e.nsecs?e.nsecs:f+1,g=y-d+(m-f)/1e4;if(g<0&&void 0===e.clockseq&&(p=p+1&16383),(g<0||y>d)&&void 0===e.nsecs&&(m=0),m>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");d=y,f=m,u=p;var h=(1e4*(268435455&(y+=122192928e5))+m)%4294967296;c[a++]=h>>>24&255,c[a++]=h>>>16&255,c[a++]=h>>>8&255,c[a++]=255&h;var w=y/4294967296*1e4&268435455;c[a++]=w>>>8&255,c[a++]=255&w,c[a++]=w>>>24&15|16,c[a++]=w>>>16&255,c[a++]=p>>>8|128,c[a++]=255&p;for(var b=0;b<6;++b)c[a+b]=l[b];return o||function(e){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,t=(s[e[o+0]]+s[e[o+1]]+s[e[o+2]]+s[e[o+3]]+"-"+s[e[o+4]]+s[e[o+5]]+"-"+s[e[o+6]]+s[e[o+7]]+"-"+s[e[o+8]]+s[e[o+9]]+"-"+s[e[o+10]]+s[e[o+11]]+s[e[o+12]]+s[e[o+13]]+s[e[o+14]]+s[e[o+15]]).toLowerCase();if(!r(t))throw TypeError("Stringified UUID is invalid");return t}(c)}}));!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define(r):(n="undefined"!=typeof globalThis?globalThis:n||self).uuidv3=r()}(this,(function(){"use strict";var n=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function r(r){return"string"==typeof r&&n.test(r)}for(var e=[],t=0;t<256;++t)e.push((t+256).toString(16).substr(1));function i(n){return 14+(n+64>>>9<<4)+1}function o(n,r){var e=(65535&n)+(65535&r);return(n>>16)+(r>>16)+(e>>16)<<16|65535&e}function a(n,r,e,t,i,a){return o((f=o(o(r,n),o(t,a)))<<(u=i)|f>>>32-u,e);var f,u}function f(n,r,e,t,i,o,f){return a(r&e|~r&t,n,r,i,o,f)}function u(n,r,e,t,i,o,f){return a(r&t|e&~t,n,r,i,o,f)}function c(n,r,e,t,i,o,f){return a(r^e^t,n,r,i,o,f)}function s(n,r,e,t,i,o,f){return a(e^(r|~t),n,r,i,o,f)}return function(n,t,i){function o(n,o,a,f){if("string"==typeof n&&(n=function(n){n=unescape(encodeURIComponent(n));for(var r=[],e=0;e<n.length;++e)r.push(n.charCodeAt(e));return r}(n)),"string"==typeof o&&(o=function(n){if(!r(n))throw TypeError("Invalid UUID");var e,t=new Uint8Array(16);return t[0]=(e=parseInt(n.slice(0,8),16))>>>24,t[1]=e>>>16&255,t[2]=e>>>8&255,t[3]=255&e,t[4]=(e=parseInt(n.slice(9,13),16))>>>8,t[5]=255&e,t[6]=(e=parseInt(n.slice(14,18),16))>>>8,t[7]=255&e,t[8]=(e=parseInt(n.slice(19,23),16))>>>8,t[9]=255&e,t[10]=(e=parseInt(n.slice(24,36),16))/1099511627776&255,t[11]=e/4294967296&255,t[12]=e>>>24&255,t[13]=e>>>16&255,t[14]=e>>>8&255,t[15]=255&e,t}(o)),16!==o.length)throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");var u=new Uint8Array(16+n.length);if(u.set(o),u.set(n,o.length),(u=i(u))[6]=15&u[6]|t,u[8]=63&u[8]|128,a){f=f||0;for(var c=0;c<16;++c)a[f+c]=u[c];return a}return function(n){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=(e[n[t+0]]+e[n[t+1]]+e[n[t+2]]+e[n[t+3]]+"-"+e[n[t+4]]+e[n[t+5]]+"-"+e[n[t+6]]+e[n[t+7]]+"-"+e[n[t+8]]+e[n[t+9]]+"-"+e[n[t+10]]+e[n[t+11]]+e[n[t+12]]+e[n[t+13]]+e[n[t+14]]+e[n[t+15]]).toLowerCase();if(!r(i))throw TypeError("Stringified UUID is invalid");return i}(u)}try{o.name=n}catch(n){}return o.DNS="6ba7b810-9dad-11d1-80b4-00c04fd430c8",o.URL="6ba7b811-9dad-11d1-80b4-00c04fd430c8",o}("v3",48,(function(n){if("string"==typeof n){var r=unescape(encodeURIComponent(n));n=new Uint8Array(r.length);for(var e=0;e<r.length;++e)n[e]=r.charCodeAt(e)}return function(n){for(var r=[],e=32*n.length,t="0123456789abcdef",i=0;i<e;i+=8){var o=n[i>>5]>>>i%32&255,a=parseInt(t.charAt(o>>>4&15)+t.charAt(15&o),16);r.push(a)}return r}(function(n,r){n[r>>5]|=128<<r%32,n[i(r)-1]=r;for(var e=1732584193,t=-271733879,a=-1732584194,l=271733878,d=0;d<n.length;d+=16){var p=e,h=t,v=a,g=l;e=f(e,t,a,l,n[d],7,-680876936),l=f(l,e,t,a,n[d+1],12,-389564586),a=f(a,l,e,t,n[d+2],17,606105819),t=f(t,a,l,e,n[d+3],22,-1044525330),e=f(e,t,a,l,n[d+4],7,-176418897),l=f(l,e,t,a,n[d+5],12,1200080426),a=f(a,l,e,t,n[d+6],17,-1473231341),t=f(t,a,l,e,n[d+7],22,-45705983),e=f(e,t,a,l,n[d+8],7,1770035416),l=f(l,e,t,a,n[d+9],12,-1958414417),a=f(a,l,e,t,n[d+10],17,-42063),t=f(t,a,l,e,n[d+11],22,-1990404162),e=f(e,t,a,l,n[d+12],7,1804603682),l=f(l,e,t,a,n[d+13],12,-40341101),a=f(a,l,e,t,n[d+14],17,-1502002290),e=u(e,t=f(t,a,l,e,n[d+15],22,1236535329),a,l,n[d+1],5,-165796510),l=u(l,e,t,a,n[d+6],9,-1069501632),a=u(a,l,e,t,n[d+11],14,643717713),t=u(t,a,l,e,n[d],20,-373897302),e=u(e,t,a,l,n[d+5],5,-701558691),l=u(l,e,t,a,n[d+10],9,38016083),a=u(a,l,e,t,n[d+15],14,-660478335),t=u(t,a,l,e,n[d+4],20,-405537848),e=u(e,t,a,l,n[d+9],5,568446438),l=u(l,e,t,a,n[d+14],9,-1019803690),a=u(a,l,e,t,n[d+3],14,-187363961),t=u(t,a,l,e,n[d+8],20,1163531501),e=u(e,t,a,l,n[d+13],5,-1444681467),l=u(l,e,t,a,n[d+2],9,-51403784),a=u(a,l,e,t,n[d+7],14,1735328473),e=c(e,t=u(t,a,l,e,n[d+12],20,-1926607734),a,l,n[d+5],4,-378558),l=c(l,e,t,a,n[d+8],11,-2022574463),a=c(a,l,e,t,n[d+11],16,1839030562),t=c(t,a,l,e,n[d+14],23,-35309556),e=c(e,t,a,l,n[d+1],4,-1530992060),l=c(l,e,t,a,n[d+4],11,1272893353),a=c(a,l,e,t,n[d+7],16,-155497632),t=c(t,a,l,e,n[d+10],23,-1094730640),e=c(e,t,a,l,n[d+13],4,681279174),l=c(l,e,t,a,n[d],11,-358537222),a=c(a,l,e,t,n[d+3],16,-722521979),t=c(t,a,l,e,n[d+6],23,76029189),e=c(e,t,a,l,n[d+9],4,-640364487),l=c(l,e,t,a,n[d+12],11,-421815835),a=c(a,l,e,t,n[d+15],16,530742520),e=s(e,t=c(t,a,l,e,n[d+2],23,-995338651),a,l,n[d],6,-198630844),l=s(l,e,t,a,n[d+7],10,1126891415),a=s(a,l,e,t,n[d+14],15,-1416354905),t=s(t,a,l,e,n[d+5],21,-57434055),e=s(e,t,a,l,n[d+12],6,1700485571),l=s(l,e,t,a,n[d+3],10,-1894986606),a=s(a,l,e,t,n[d+10],15,-1051523),t=s(t,a,l,e,n[d+1],21,-2054922799),e=s(e,t,a,l,n[d+8],6,1873313359),l=s(l,e,t,a,n[d+15],10,-30611744),a=s(a,l,e,t,n[d+6],15,-1560198380),t=s(t,a,l,e,n[d+13],21,1309151649),e=s(e,t,a,l,n[d+4],6,-145523070),l=s(l,e,t,a,n[d+11],10,-1120210379),a=s(a,l,e,t,n[d+2],15,718787259),t=s(t,a,l,e,n[d+9],21,-343485551),e=o(e,p),t=o(t,h),a=o(a,v),l=o(l,g)}return[e,t,a,l]}(function(n){if(0===n.length)return[];for(var r=8*n.length,e=new Uint32Array(i(r)),t=0;t<r;t+=8)e[t>>5]|=(255&n[t/8])<<t%32;return e}(n),8*n.length))}))}));!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).uuidv4=e()}(this,(function(){"use strict";var t,e=new Uint8Array(16);function o(){if(!t&&!(t="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return t(e)}var n=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function r(t){return"string"==typeof t&&n.test(t)}for(var i=[],u=0;u<256;++u)i.push((u+256).toString(16).substr(1));return function(t,e,n){var u=(t=t||{}).random||(t.rng||o)();if(u[6]=15&u[6]|64,u[8]=63&u[8]|128,e){n=n||0;for(var f=0;f<16;++f)e[n+f]=u[f];return e}return function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,o=(i[t[e+0]]+i[t[e+1]]+i[t[e+2]]+i[t[e+3]]+"-"+i[t[e+4]]+i[t[e+5]]+"-"+i[t[e+6]]+i[t[e+7]]+"-"+i[t[e+8]]+i[t[e+9]]+"-"+i[t[e+10]]+i[t[e+11]]+i[t[e+12]]+i[t[e+13]]+i[t[e+14]]+i[t[e+15]]).toLowerCase();if(!r(o))throw TypeError("Stringified UUID is invalid");return o}(u)}}));!function(r,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(r="undefined"!=typeof globalThis?globalThis:r||self).uuidv5=e()}(this,(function(){"use strict";var r=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function e(e){return"string"==typeof e&&r.test(e)}for(var t=[],n=0;n<256;++n)t.push((n+256).toString(16).substr(1));function a(r,e,t,n){switch(r){case 0:return e&t^~e&n;case 1:return e^t^n;case 2:return e&t^e&n^t&n;case 3:return e^t^n}}function o(r,e){return r<<e|r>>>32-e}return function(r,n,a){function o(r,o,i,f){if("string"==typeof r&&(r=function(r){r=unescape(encodeURIComponent(r));for(var e=[],t=0;t<r.length;++t)e.push(r.charCodeAt(t));return e}(r)),"string"==typeof o&&(o=function(r){if(!e(r))throw TypeError("Invalid UUID");var t,n=new Uint8Array(16);return n[0]=(t=parseInt(r.slice(0,8),16))>>>24,n[1]=t>>>16&255,n[2]=t>>>8&255,n[3]=255&t,n[4]=(t=parseInt(r.slice(9,13),16))>>>8,n[5]=255&t,n[6]=(t=parseInt(r.slice(14,18),16))>>>8,n[7]=255&t,n[8]=(t=parseInt(r.slice(19,23),16))>>>8,n[9]=255&t,n[10]=(t=parseInt(r.slice(24,36),16))/1099511627776&255,n[11]=t/4294967296&255,n[12]=t>>>24&255,n[13]=t>>>16&255,n[14]=t>>>8&255,n[15]=255&t,n}(o)),16!==o.length)throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");var s=new Uint8Array(16+r.length);if(s.set(o),s.set(r,o.length),(s=a(s))[6]=15&s[6]|n,s[8]=63&s[8]|128,i){f=f||0;for(var u=0;u<16;++u)i[f+u]=s[u];return i}return function(r){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=(t[r[n+0]]+t[r[n+1]]+t[r[n+2]]+t[r[n+3]]+"-"+t[r[n+4]]+t[r[n+5]]+"-"+t[r[n+6]]+t[r[n+7]]+"-"+t[r[n+8]]+t[r[n+9]]+"-"+t[r[n+10]]+t[r[n+11]]+t[r[n+12]]+t[r[n+13]]+t[r[n+14]]+t[r[n+15]]).toLowerCase();if(!e(a))throw TypeError("Stringified UUID is invalid");return a}(s)}try{o.name=r}catch(r){}return o.DNS="6ba7b810-9dad-11d1-80b4-00c04fd430c8",o.URL="6ba7b811-9dad-11d1-80b4-00c04fd430c8",o}("v5",80,(function(r){var e=[1518500249,1859775393,2400959708,3395469782],t=[1732584193,4023233417,2562383102,271733878,3285377520];if("string"==typeof r){var n=unescape(encodeURIComponent(r));r=[];for(var i=0;i<n.length;++i)r.push(n.charCodeAt(i))}else Array.isArray(r)||(r=Array.prototype.slice.call(r));r.push(128);for(var f=r.length/4+2,s=Math.ceil(f/16),u=new Array(s),c=0;c<s;++c){for(var l=new Uint32Array(16),p=0;p<16;++p)l[p]=r[64*c+4*p]<<24|r[64*c+4*p+1]<<16|r[64*c+4*p+2]<<8|r[64*c+4*p+3];u[c]=l}u[s-1][14]=8*(r.length-1)/Math.pow(2,32),u[s-1][14]=Math.floor(u[s-1][14]),u[s-1][15]=8*(r.length-1)&4294967295;for(var d=0;d<s;++d){for(var h=new Uint32Array(80),v=0;v<16;++v)h[v]=u[d][v];for(var y=16;y<80;++y)h[y]=o(h[y-3]^h[y-8]^h[y-14]^h[y-16],1);for(var g=t[0],b=t[1],w=t[2],U=t[3],A=t[4],I=0;I<80;++I){var m=Math.floor(I/20),C=o(g,5)+a(m,b,w,U)+A+e[m]+h[I]>>>0;A=U,U=w,w=o(b,30)>>>0,b=g,g=C}t[0]=t[0]+g>>>0,t[1]=t[1]+b>>>0,t[2]=t[2]+w>>>0,t[3]=t[3]+U>>>0,t[4]=t[4]+A>>>0}return[t[0]>>24&255,t[0]>>16&255,t[0]>>8&255,255&t[0],t[1]>>24&255,t[1]>>16&255,t[1]>>8&255,255&t[1],t[2]>>24&255,t[2]>>16&255,t[2]>>8&255,255&t[2],t[3]>>24&255,t[3]>>16&255,t[3]>>8&255,255&t[3],t[4]>>24&255,t[4]>>16&255,t[4]>>8&255,255&t[4]]}))}));export { default as v1 } from './v1.js';
export { default as v3 } from './v3.js';
export { default as v4 } from './v4.js';
export { default as v5 } from './v5.js';
export { default as NIL } from './nil.js';
export { default as version } from './version.js';
export { default as validate } from './validate.js';
export { default as stringify } from './stringify.js';
export { default as parse } from './parse.js';import crypto from 'crypto';

function md5(bytes) {
  if (Array.isArray(bytes)) {
    bytes = Buffer.from(bytes);
  } else if (typeof bytes === 'string') {
    bytes = Buffer.from(bytes, 'utf8');
  }

  return crypto.createHash('md5').update(bytes).digest();
}

export default md5;export default '00000000-0000-0000-0000-000000000000';import validate from './validate.js';

function parse(uuid) {
  if (!validate(uuid)) {
    throw TypeError('Invalid UUID');
  }

  let v;
  const arr = new Uint8Array(16); // Parse ########-....-....-....-............

  arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;
  arr[1] = v >>> 16 & 0xff;
  arr[2] = v >>> 8 & 0xff;
  arr[3] = v & 0xff; // Parse ........-####-....-....-............

  arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;
  arr[5] = v & 0xff; // Parse ........-....-####-....-............

  arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;
  arr[7] = v & 0xff; // Parse ........-....-....-####-............

  arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;
  arr[9] = v & 0xff; // Parse ........-....-....-....-############
  // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes)

  arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;
  arr[11] = v / 0x100000000 & 0xff;
  arr[12] = v >>> 24 & 0xff;
  arr[13] = v >>> 16 & 0xff;
  arr[14] = v >>> 8 & 0xff;
  arr[15] = v & 0xff;
  return arr;
}

export default parse;export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;import crypto from 'crypto';
const rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate

let poolPtr = rnds8Pool.length;
export default function rng() {
  if (poolPtr > rnds8Pool.length - 16) {
    crypto.randomFillSync(rnds8Pool);
    poolPtr = 0;
  }

  return rnds8Pool.slice(poolPtr, poolPtr += 16);
}import crypto from 'crypto';

function sha1(bytes) {
  if (Array.isArray(bytes)) {
    bytes = Buffer.from(bytes);
  } else if (typeof bytes === 'string') {
    bytes = Buffer.from(bytes, 'utf8');
  }

  return crypto.createHash('sha1').update(bytes).digest();
}

export default sha1;import validate from './validate.js';
/**
 * Convert array of 16 byte values to UUID string format of the form:
 * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
 */

const byteToHex = [];

for (let i = 0; i < 256; ++i) {
  byteToHex.push((i + 0x100).toString(16).substr(1));
}

function stringify(arr, offset = 0) {
  // Note: Be careful editing this code!  It's been tuned for performance
  // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
  const uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID.  If this throws, it's likely due to one
  // of the following:
  // - One or more input array values don't map to a hex octet (leading to
  // "undefined" in the uuid)
  // - Invalid input values for the RFC `version` or `variant` fields

  if (!validate(uuid)) {
    throw TypeError('Stringified UUID is invalid');
  }

  return uuid;
}

export default stringify;import rng from './rng.js';
import stringify from './stringify.js'; // **`v1()` - Generate time-based UUID**
//
// Inspired by https://github.com/LiosK/UUID.js
// and http://docs.python.org/library/uuid.html

let _nodeId;

let _clockseq; // Previous uuid creation time


let _lastMSecs = 0;
let _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details

function v1(options, buf, offset) {
  let i = buf && offset || 0;
  const b = buf || new Array(16);
  options = options || {};
  let node = options.node || _nodeId;
  let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not
  // specified.  We do this lazily to minimize issues related to insufficient
  // system entropy.  See #189

  if (node == null || clockseq == null) {
    const seedBytes = options.random || (options.rng || rng)();

    if (node == null) {
      // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
      node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];
    }

    if (clockseq == null) {
      // Per 4.2.2, randomize (14 bit) clockseq
      clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
    }
  } // UUID timestamps are 100 nano-second units since the Gregorian epoch,
  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so
  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.


  let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock
  // cycle to simulate higher resolution clock

  let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)

  const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression

  if (dt < 0 && options.clockseq === undefined) {
    clockseq = clockseq + 1 & 0x3fff;
  } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
  // time interval


  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
    nsecs = 0;
  } // Per 4.2.1.2 Throw error if too many uuids are requested


  if (nsecs >= 10000) {
    throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
  }

  _lastMSecs = msecs;
  _lastNSecs = nsecs;
  _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch

  msecs += 12219292800000; // `time_low`

  const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
  b[i++] = tl >>> 24 & 0xff;
  b[i++] = tl >>> 16 & 0xff;
  b[i++] = tl >>> 8 & 0xff;
  b[i++] = tl & 0xff; // `time_mid`

  const tmh = msecs / 0x100000000 * 10000 & 0xfffffff;
  b[i++] = tmh >>> 8 & 0xff;
  b[i++] = tmh & 0xff; // `time_high_and_version`

  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version

  b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)

  b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`

  b[i++] = clockseq & 0xff; // `node`

  for (let n = 0; n < 6; ++n) {
    b[i + n] = node[n];
  }

  return buf || stringify(b);
}

export default v1;import v35 from './v35.js';
import md5 from './md5.js';
const v3 = v35('v3', 0x30, md5);
export default v3;import stringify from './stringify.js';
import parse from './parse.js';

function stringToBytes(str) {
  str = unescape(encodeURIComponent(str)); // UTF8 escape

  const bytes = [];

  for (let i = 0; i < str.length; ++i) {
    bytes.push(str.charCodeAt(i));
  }

  return bytes;
}

export const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
export const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
export default function (name, version, hashfunc) {
  function generateUUID(value, namespace, buf, offset) {
    if (typeof value === 'string') {
      value = stringToBytes(value);
    }

    if (typeof namespace === 'string') {
      namespace = parse(namespace);
    }

    if (namespace.length !== 16) {
      throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');
    } // Compute hash of namespace and value, Per 4.3
    // Future: Use spread syntax when supported on all platforms, e.g. `bytes =
    // hashfunc([...namespace, ... value])`


    let bytes = new Uint8Array(16 + value.length);
    bytes.set(namespace);
    bytes.set(value, namespace.length);
    bytes = hashfunc(bytes);
    bytes[6] = bytes[6] & 0x0f | version;
    bytes[8] = bytes[8] & 0x3f | 0x80;

    if (buf) {
      offset = offset || 0;

      for (let i = 0; i < 16; ++i) {
        buf[offset + i] = bytes[i];
      }

      return buf;
    }

    return stringify(bytes);
  } // Function#name is not settable on some platforms (#270)


  try {
    generateUUID.name = name; // eslint-disable-next-line no-empty
  } catch (err) {} // For CommonJS default export support


  generateUUID.DNS = DNS;
  generateUUID.URL = URL;
  return generateUUID;
}import rng from './rng.js';
import stringify from './stringify.js';

function v4(options, buf, offset) {
  options = options || {};
  const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`

  rnds[6] = rnds[6] & 0x0f | 0x40;
  rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided

  if (buf) {
    offset = offset || 0;

    for (let i = 0; i < 16; ++i) {
      buf[offset + i] = rnds[i];
    }

    return buf;
  }

  return stringify(rnds);
}

export default v4;import v35 from './v35.js';
import sha1 from './sha1.js';
const v5 = v35('v5', 0x50, sha1);
export default v5;import REGEX from './regex.js';

function validate(uuid) {
  return typeof uuid === 'string' && REGEX.test(uuid);
}

export default validate;import validate from './validate.js';

function version(uuid) {
  if (!validate(uuid)) {
    throw TypeError('Invalid UUID');
  }

  return parseInt(uuid.substr(14, 1), 16);
}

export default version;export { default as v1 } from './v1.js';
export { default as v3 } from './v3.js';
export { default as v4 } from './v4.js';
export { default as v5 } from './v5.js';
export { default as NIL } from './nil.js';
export { default as version } from './version.js';
export { default as validate } from './validate.js';
export { default as stringify } from './stringify.js';
export { default as parse } from './parse.js';/*
 * Browser-compatible JavaScript MD5
 *
 * Modification of JavaScript MD5
 * https://github.com/blueimp/JavaScript-MD5
 *
 * Copyright 2011, Sebastian Tschan
 * https://blueimp.net
 *
 * Licensed under the MIT license:
 * https://opensource.org/licenses/MIT
 *
 * Based on
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 */
function md5(bytes) {
  if (typeof bytes === 'string') {
    var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape

    bytes = new Uint8Array(msg.length);

    for (var i = 0; i < msg.length; ++i) {
      bytes[i] = msg.charCodeAt(i);
    }
  }

  return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));
}
/*
 * Convert an array of little-endian words to an array of bytes
 */


function md5ToHexEncodedArray(input) {
  var output = [];
  var length32 = input.length * 32;
  var hexTab = '0123456789abcdef';

  for (var i = 0; i < length32; i += 8) {
    var x = input[i >> 5] >>> i % 32 & 0xff;
    var hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);
    output.push(hex);
  }

  return output;
}
/**
 * Calculate output length with padding and bit length
 */


function getOutputLength(inputLength8) {
  return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;
}
/*
 * Calculate the MD5 of an array of little-endian words, and a bit length.
 */


function wordsToMd5(x, len) {
  /* append padding */
  x[len >> 5] |= 0x80 << len % 32;
  x[getOutputLength(len) - 1] = len;
  var a = 1732584193;
  var b = -271733879;
  var c = -1732584194;
  var d = 271733878;

  for (var i = 0; i < x.length; i += 16) {
    var olda = a;
    var oldb = b;
    var oldc = c;
    var oldd = d;
    a = md5ff(a, b, c, d, x[i], 7, -680876936);
    d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);
    c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);
    b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
    a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);
    d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
    c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
    b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);
    a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
    d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
    c = md5ff(c, d, a, b, x[i + 10], 17, -42063);
    b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
    a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
    d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);
    c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
    b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
    a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);
    d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
    c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);
    b = md5gg(b, c, d, a, x[i], 20, -373897302);
    a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);
    d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);
    c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);
    b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);
    a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);
    d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
    c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);
    b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
    a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
    d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);
    c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
    b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
    a = md5hh(a, b, c, d, x[i + 5], 4, -378558);
    d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
    c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
    b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);
    a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
    d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
    c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);
    b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
    a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);
    d = md5hh(d, a, b, c, x[i], 11, -358537222);
    c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);
    b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);
    a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);
    d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);
    c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);
    b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);
    a = md5ii(a, b, c, d, x[i], 6, -198630844);
    d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
    c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
    b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);
    a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
    d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
    c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);
    b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
    a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
    d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);
    c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
    b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
    a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);
    d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
    c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);
    b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);
    a = safeAdd(a, olda);
    b = safeAdd(b, oldb);
    c = safeAdd(c, oldc);
    d = safeAdd(d, oldd);
  }

  return [a, b, c, d];
}
/*
 * Convert an array bytes to an array of little-endian words
 * Characters >255 have their high-byte silently ignored.
 */


function bytesToWords(input) {
  if (input.length === 0) {
    return [];
  }

  var length8 = input.length * 8;
  var output = new Uint32Array(getOutputLength(length8));

  for (var i = 0; i < length8; i += 8) {
    output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;
  }

  return output;
}
/*
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
 * to work around bugs in some JS interpreters.
 */


function safeAdd(x, y) {
  var lsw = (x & 0xffff) + (y & 0xffff);
  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return msw << 16 | lsw & 0xffff;
}
/*
 * Bitwise rotate a 32-bit number to the left.
 */


function bitRotateLeft(num, cnt) {
  return num << cnt | num >>> 32 - cnt;
}
/*
 * These functions implement the four basic operations the algorithm uses.
 */


function md5cmn(q, a, b, x, s, t) {
  return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);
}

function md5ff(a, b, c, d, x, s, t) {
  return md5cmn(b & c | ~b & d, a, b, x, s, t);
}

function md5gg(a, b, c, d, x, s, t) {
  return md5cmn(b & d | c & ~d, a, b, x, s, t);
}

function md5hh(a, b, c, d, x, s, t) {
  return md5cmn(b ^ c ^ d, a, b, x, s, t);
}

function md5ii(a, b, c, d, x, s, t) {
  return md5cmn(c ^ (b | ~d), a, b, x, s, t);
}

export default md5;export default '00000000-0000-0000-0000-000000000000';import validate from './validate.js';

function parse(uuid) {
  if (!validate(uuid)) {
    throw TypeError('Invalid UUID');
  }

  var v;
  var arr = new Uint8Array(16); // Parse ########-....-....-....-............

  arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;
  arr[1] = v >>> 16 & 0xff;
  arr[2] = v >>> 8 & 0xff;
  arr[3] = v & 0xff; // Parse ........-####-....-....-............

  arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;
  arr[5] = v & 0xff; // Parse ........-....-####-....-............

  arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;
  arr[7] = v & 0xff; // Parse ........-....-....-####-............

  arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;
  arr[9] = v & 0xff; // Parse ........-....-....-....-############
  // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes)

  arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;
  arr[11] = v / 0x100000000 & 0xff;
  arr[12] = v >>> 24 & 0xff;
  arr[13] = v >>> 16 & 0xff;
  arr[14] = v >>> 8 & 0xff;
  arr[15] = v & 0xff;
  return arr;
}

export default parse;export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;// Unique ID creation requires a high quality random # generator. In the browser we therefore
// require the crypto API and do not support built-in fallback to lower quality random number
// generators (like Math.random()).
var getRandomValues;
var rnds8 = new Uint8Array(16);
export default function rng() {
  // lazy load so that environments that need to polyfill have a chance to do so
  if (!getRandomValues) {
    // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. Also,
    // find the complete implementation of crypto (msCrypto) on IE11.
    getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);

    if (!getRandomValues) {
      throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');
    }
  }

  return getRandomValues(rnds8);
}// Adapted from Chris Veness' SHA1 code at
// http://www.movable-type.co.uk/scripts/sha1.html
function f(s, x, y, z) {
  switch (s) {
    case 0:
      return x & y ^ ~x & z;

    case 1:
      return x ^ y ^ z;

    case 2:
      return x & y ^ x & z ^ y & z;

    case 3:
      return x ^ y ^ z;
  }
}

function ROTL(x, n) {
  return x << n | x >>> 32 - n;
}

function sha1(bytes) {
  var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];
  var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];

  if (typeof bytes === 'string') {
    var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape

    bytes = [];

    for (var i = 0; i < msg.length; ++i) {
      bytes.push(msg.charCodeAt(i));
    }
  } else if (!Array.isArray(bytes)) {
    // Convert Array-like to Array
    bytes = Array.prototype.slice.call(bytes);
  }

  bytes.push(0x80);
  var l = bytes.length / 4 + 2;
  var N = Math.ceil(l / 16);
  var M = new Array(N);

  for (var _i = 0; _i < N; ++_i) {
    var arr = new Uint32Array(16);

    for (var j = 0; j < 16; ++j) {
      arr[j] = bytes[_i * 64 + j * 4] << 24 | bytes[_i * 64 + j * 4 + 1] << 16 | bytes[_i * 64 + j * 4 + 2] << 8 | bytes[_i * 64 + j * 4 + 3];
    }

    M[_i] = arr;
  }

  M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);
  M[N - 1][14] = Math.floor(M[N - 1][14]);
  M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;

  for (var _i2 = 0; _i2 < N; ++_i2) {
    var W = new Uint32Array(80);

    for (var t = 0; t < 16; ++t) {
      W[t] = M[_i2][t];
    }

    for (var _t = 16; _t < 80; ++_t) {
      W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1);
    }

    var a = H[0];
    var b = H[1];
    var c = H[2];
    var d = H[3];
    var e = H[4];

    for (var _t2 = 0; _t2 < 80; ++_t2) {
      var s = Math.floor(_t2 / 20);
      var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 0;
      e = d;
      d = c;
      c = ROTL(b, 30) >>> 0;
      b = a;
      a = T;
    }

    H[0] = H[0] + a >>> 0;
    H[1] = H[1] + b >>> 0;
    H[2] = H[2] + c >>> 0;
    H[3] = H[3] + d >>> 0;
    H[4] = H[4] + e >>> 0;
  }

  return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];
}

export default sha1;import validate from './validate.js';
/**
 * Convert array of 16 byte values to UUID string format of the form:
 * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
 */

var byteToHex = [];

for (var i = 0; i < 256; ++i) {
  byteToHex.push((i + 0x100).toString(16).substr(1));
}

function stringify(arr) {
  var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  // Note: Be careful editing this code!  It's been tuned for performance
  // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
  var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID.  If this throws, it's likely due to one
  // of the following:
  // - One or more input array values don't map to a hex octet (leading to
  // "undefined" in the uuid)
  // - Invalid input values for the RFC `version` or `variant` fields

  if (!validate(uuid)) {
    throw TypeError('Stringified UUID is invalid');
  }

  return uuid;
}

export default stringify;import rng from './rng.js';
import stringify from './stringify.js'; // **`v1()` - Generate time-based UUID**
//
// Inspired by https://github.com/LiosK/UUID.js
// and http://docs.python.org/library/uuid.html

var _nodeId;

var _clockseq; // Previous uuid creation time


var _lastMSecs = 0;
var _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details

function v1(options, buf, offset) {
  var i = buf && offset || 0;
  var b = buf || new Array(16);
  options = options || {};
  var node = options.node || _nodeId;
  var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not
  // specified.  We do this lazily to minimize issues related to insufficient
  // system entropy.  See #189

  if (node == null || clockseq == null) {
    var seedBytes = options.random || (options.rng || rng)();

    if (node == null) {
      // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
      node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];
    }

    if (clockseq == null) {
      // Per 4.2.2, randomize (14 bit) clockseq
      clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
    }
  } // UUID timestamps are 100 nano-second units since the Gregorian epoch,
  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so
  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.


  var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock
  // cycle to simulate higher resolution clock

  var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)

  var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression

  if (dt < 0 && options.clockseq === undefined) {
    clockseq = clockseq + 1 & 0x3fff;
  } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
  // time interval


  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
    nsecs = 0;
  } // Per 4.2.1.2 Throw error if too many uuids are requested


  if (nsecs >= 10000) {
    throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
  }

  _lastMSecs = msecs;
  _lastNSecs = nsecs;
  _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch

  msecs += 12219292800000; // `time_low`

  var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
  b[i++] = tl >>> 24 & 0xff;
  b[i++] = tl >>> 16 & 0xff;
  b[i++] = tl >>> 8 & 0xff;
  b[i++] = tl & 0xff; // `time_mid`

  var tmh = msecs / 0x100000000 * 10000 & 0xfffffff;
  b[i++] = tmh >>> 8 & 0xff;
  b[i++] = tmh & 0xff; // `time_high_and_version`

  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version

  b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)

  b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`

  b[i++] = clockseq & 0xff; // `node`

  for (var n = 0; n < 6; ++n) {
    b[i + n] = node[n];
  }

  return buf || stringify(b);
}

export default v1;import v35 from './v35.js';
import md5 from './md5.js';
var v3 = v35('v3', 0x30, md5);
export default v3;import stringify from './stringify.js';
import parse from './parse.js';

function stringToBytes(str) {
  str = unescape(encodeURIComponent(str)); // UTF8 escape

  var bytes = [];

  for (var i = 0; i < str.length; ++i) {
    bytes.push(str.charCodeAt(i));
  }

  return bytes;
}

export var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
export var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
export default function (name, version, hashfunc) {
  function generateUUID(value, namespace, buf, offset) {
    if (typeof value === 'string') {
      value = stringToBytes(value);
    }

    if (typeof namespace === 'string') {
      namespace = parse(namespace);
    }

    if (namespace.length !== 16) {
      throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');
    } // Compute hash of namespace and value, Per 4.3
    // Future: Use spread syntax when supported on all platforms, e.g. `bytes =
    // hashfunc([...namespace, ... value])`


    var bytes = new Uint8Array(16 + value.length);
    bytes.set(namespace);
    bytes.set(value, namespace.length);
    bytes = hashfunc(bytes);
    bytes[6] = bytes[6] & 0x0f | version;
    bytes[8] = bytes[8] & 0x3f | 0x80;

    if (buf) {
      offset = offset || 0;

      for (var i = 0; i < 16; ++i) {
        buf[offset + i] = bytes[i];
      }

      return buf;
    }

    return stringify(bytes);
  } // Function#name is not settable on some platforms (#270)


  try {
    generateUUID.name = name; // eslint-disable-next-line no-empty
  } catch (err) {} // For CommonJS default export support


  generateUUID.DNS = DNS;
  generateUUID.URL = URL;
  return generateUUID;
}import rng from './rng.js';
import stringify from './stringify.js';

function v4(options, buf, offset) {
  options = options || {};
  var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`

  rnds[6] = rnds[6] & 0x0f | 0x40;
  rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided

  if (buf) {
    offset = offset || 0;

    for (var i = 0; i < 16; ++i) {
      buf[offset + i] = rnds[i];
    }

    return buf;
  }

  return stringify(rnds);
}

export default v4;import v35 from './v35.js';
import sha1 from './sha1.js';
var v5 = v35('v5', 0x50, sha1);
export default v5;import REGEX from './regex.js';

function validate(uuid) {
  return typeof uuid === 'string' && REGEX.test(uuid);
}

export default validate;import validate from './validate.js';

function version(uuid) {
  if (!validate(uuid)) {
    throw TypeError('Invalid UUID');
  }

  return parseInt(uuid.substr(14, 1), 16);
}

export default version;#!/usr/bin/env node
require('../uuid-bin');
ISC License

Copyright npm, Inc.

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 NPM DISCLAIMS ALL
WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
EVENT SHALL NPM 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.
{
  "name": "are-we-there-yet",
  "version": "2.0.0",
  "description": "Keep track of the overall completion of many disparate processes",
  "main": "lib/index.js",
  "repository": {
    "type": "git",
    "url": "https://github.com/npm/are-we-there-yet.git"
  },
  "author": "GitHub Inc.",
  "license": "ISC",
  "homepage": "https://github.com/npm/are-we-there-yet",
  "devDependencies": {
    "@npmcli/eslint-config": "^1.0.0",
    "@npmcli/template-oss": "^1.0.2",
    "eslint": "^7.32.0",
    "eslint-plugin-node": "^11.1.0",
    "tap": "^15.0.9"
  },
  "dependencies": {
    "delegates": "^1.0.0",
    "readable-stream": "^3.6.0"
  },
  "files": [
    "bin",
    "lib"
  ],
  "engines": {
    "node": ">=10"
  },
  "tap": {
    "branches": 68,
    "statements": 92,
    "functions": 86,
    "lines": 92
  },
  "templateVersion": "1.0.2"
}'use strict'
exports.TrackerGroup = require('./tracker-group.js')
exports.Tracker = require('./tracker.js')
exports.TrackerStream = require('./tracker-stream.js')
'use strict'
var EventEmitter = require('events').EventEmitter
var util = require('util')

var trackerId = 0
var TrackerBase = module.exports = function (name) {
  EventEmitter.call(this)
  this.id = ++trackerId
  this.name = name
}
util.inherits(TrackerBase, EventEmitter)
'use strict'
var util = require('util')
var TrackerBase = require('./tracker-base.js')
var Tracker = require('./tracker.js')
var TrackerStream = require('./tracker-stream.js')

var TrackerGroup = module.exports = function (name) {
  TrackerBase.call(this, name)
  this.parentGroup = null
  this.trackers = []
  this.completion = {}
  this.weight = {}
  this.totalWeight = 0
  this.finished = false
  this.bubbleChange = bubbleChange(this)
}
util.inherits(TrackerGroup, TrackerBase)

function bubbleChange (trackerGroup) {
  return function (name, completed, tracker) {
    trackerGroup.completion[tracker.id] = completed
    if (trackerGroup.finished) {
      return
    }
    trackerGroup.emit('change', name || trackerGroup.name, trackerGroup.completed(), trackerGroup)
  }
}

TrackerGroup.prototype.nameInTree = function () {
  var names = []
  var from = this
  while (from) {
    names.unshift(from.name)
    from = from.parentGroup
  }
  return names.join('/')
}

TrackerGroup.prototype.addUnit = function (unit, weight) {
  if (unit.addUnit) {
    var toTest = this
    while (toTest) {
      if (unit === toTest) {
        throw new Error(
          'Attempted to add tracker group ' +
          unit.name + ' to tree that already includes it ' +
          this.nameInTree(this))
      }
      toTest = toTest.parentGroup
    }
    unit.parentGroup = this
  }
  this.weight[unit.id] = weight || 1
  this.totalWeight += this.weight[unit.id]
  this.trackers.push(unit)
  this.completion[unit.id] = unit.completed()
  unit.on('change', this.bubbleChange)
  if (!this.finished) {
    this.emit('change', unit.name, this.completion[unit.id], unit)
  }
  return unit
}

TrackerGroup.prototype.completed = function () {
  if (this.trackers.length === 0) {
    return 0
  }
  var valPerWeight = 1 / this.totalWeight
  var completed = 0
  for (var ii = 0; ii < this.trackers.length; ii++) {
    var trackerId = this.trackers[ii].id
    completed +=
      valPerWeight * this.weight[trackerId] * this.completion[trackerId]
  }
  return completed
}

TrackerGroup.prototype.newGroup = function (name, weight) {
  return this.addUnit(new TrackerGroup(name), weight)
}

TrackerGroup.prototype.newItem = function (name, todo, weight) {
  return this.addUnit(new Tracker(name, todo), weight)
}

TrackerGroup.prototype.newStream = function (name, todo, weight) {
  return this.addUnit(new TrackerStream(name, todo), weight)
}

TrackerGroup.prototype.finish = function () {
  this.finished = true
  if (!this.trackers.length) {
    this.addUnit(new Tracker(), 1, true)
  }
  for (var ii = 0; ii < this.trackers.length; ii++) {
    var tracker = this.trackers[ii]
    tracker.finish()
    tracker.removeListener('change', this.bubbleChange)
  }
  this.emit('change', this.name, 1, this)
}

var buffer = '                                  '
TrackerGroup.prototype.debug = function (depth) {
  depth = depth || 0
  var indent = depth ? buffer.substr(0, depth) : ''
  var output = indent + (this.name || 'top') + ': ' + this.completed() + '\n'
  this.trackers.forEach(function (tracker) {
    if (tracker instanceof TrackerGroup) {
      output += tracker.debug(depth + 1)
    } else {
      output += indent + ' ' + tracker.name + ': ' + tracker.completed() + '\n'
    }
  })
  return output
}
'use strict'
var util = require('util')
var stream = require('readable-stream')
var delegate = require('delegates')
var Tracker = require('./tracker.js')

var TrackerStream = module.exports = function (name, size, options) {
  stream.Transform.call(this, options)
  this.tracker = new Tracker(name, size)
  this.name = name
  this.id = this.tracker.id
  this.tracker.on('change', delegateChange(this))
}
util.inherits(TrackerStream, stream.Transform)

function delegateChange (trackerStream) {
  return function (name, completion, tracker) {
    trackerStream.emit('change', name, completion, trackerStream)
  }
}

TrackerStream.prototype._transform = function (data, encoding, cb) {
  this.tracker.completeWork(data.length ? data.length : 1)
  this.push(data)
  cb()
}

TrackerStream.prototype._flush = function (cb) {
  this.tracker.finish()
  cb()
}

delegate(TrackerStream.prototype, 'tracker')
  .method('completed')
  .method('addWork')
  .method('finish')
'use strict'
var util = require('util')
var TrackerBase = require('./tracker-base.js')

var Tracker = module.exports = function (name, todo) {
  TrackerBase.call(this, name)
  this.workDone = 0
  this.workTodo = todo || 0
}
util.inherits(Tracker, TrackerBase)

Tracker.prototype.completed = function () {
  return this.workTodo === 0 ? 0 : this.workDone / this.workTodo
}

Tracker.prototype.addWork = function (work) {
  this.workTodo += work
  this.emit('change', this.name, this.completed(), this)
}

Tracker.prototype.completeWork = function (work) {
  this.workDone += work
  if (this.workDone > this.workTodo) {
    this.workDone = this.workTodo
  }
  this.emit('change', this.name, this.completed(), this)
}

Tracker.prototype.finish = function () {
  this.workTodo = this.workDone = 1
  this.emit('change', this.name, 1, this)
}
Copyright (c) 2014, Rebecca Turner <me@re-becca.org>

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.
'use strict'
var spin = require('./spin.js')
var progressBar = require('./progress-bar.js')

module.exports = {
  activityIndicator: function (values, theme, width) {
    if (values.spun == null) return
    return spin(theme, values.spun)
  },
  progressbar: function (values, theme, width) {
    if (values.completed == null) return
    return progressBar(theme, width, values.completed)
  }
}
'use strict'
var util = require('util')

var User = exports.User = function User (msg) {
  var err = new Error(msg)
  Error.captureStackTrace(err, User)
  err.code = 'EGAUGE'
  return err
}

exports.MissingTemplateValue = function MissingTemplateValue (item, values) {
  var err = new User(util.format('Missing template value "%s"', item.type))
  Error.captureStackTrace(err, MissingTemplateValue)
  err.template = item
  err.values = values
  return err
}

exports.Internal = function Internal (msg) {
  var err = new Error(msg)
  Error.captureStackTrace(err, Internal)
  err.code = 'EGAUGEINTERNAL'
  return err
}
'use strict'
var colorSupport = require('color-support')

module.exports = colorSupport().hasBasic
'use strict'
var Plumbing = require('./plumbing.js')
var hasUnicode = require('has-unicode')
var hasColor = require('./has-color.js')
var onExit = require('signal-exit')
var defaultThemes = require('./themes')
var setInterval = require('./set-interval.js')
var process = require('./process.js')
var setImmediate = require('./set-immediate')

module.exports = Gauge

function callWith (obj, method) {
  return function () {
    return method.call(obj)
  }
}

function Gauge (arg1, arg2) {
  var options, writeTo
  if (arg1 && arg1.write) {
    writeTo = arg1
    options = arg2 || {}
  } else if (arg2 && arg2.write) {
    writeTo = arg2
    options = arg1 || {}
  } else {
    writeTo = process.stderr
    options = arg1 || arg2 || {}
  }

  this._status = {
    spun: 0,
    section: '',
    subsection: ''
  }
  this._paused = false // are we paused for back pressure?
  this._disabled = true // are all progress bar updates disabled?
  this._showing = false // do we WANT the progress bar on screen
  this._onScreen = false // IS the progress bar on screen
  this._needsRedraw = false // should we print something at next tick?
  this._hideCursor = options.hideCursor == null ? true : options.hideCursor
  this._fixedFramerate = options.fixedFramerate == null
    ? !(/^v0\.8\./.test(process.version))
    : options.fixedFramerate
  this._lastUpdateAt = null
  this._updateInterval = options.updateInterval == null ? 50 : options.updateInterval

  this._themes = options.themes || defaultThemes
  this._theme = options.theme
  var theme = this._computeTheme(options.theme)
  var template = options.template || [
    {type: 'progressbar', length: 20},
    {type: 'activityIndicator', kerning: 1, length: 1},
    {type: 'section', kerning: 1, default: ''},
    {type: 'subsection', kerning: 1, default: ''}
  ]
  this.setWriteTo(writeTo, options.tty)
  var PlumbingClass = options.Plumbing || Plumbing
  this._gauge = new PlumbingClass(theme, template, this.getWidth())

  this._$$doRedraw = callWith(this, this._doRedraw)
  this._$$handleSizeChange = callWith(this, this._handleSizeChange)

  this._cleanupOnExit = options.cleanupOnExit == null || options.cleanupOnExit
  this._removeOnExit = null

  if (options.enabled || (options.enabled == null && this._tty && this._tty.isTTY)) {
    this.enable()
  } else {
    this.disable()
  }
}
Gauge.prototype = {}

Gauge.prototype.isEnabled = function () {
  return !this._disabled
}

Gauge.prototype.setTemplate = function (template) {
  this._gauge.setTemplate(template)
  if (this._showing) this._requestRedraw()
}

Gauge.prototype._computeTheme = function (theme) {
  if (!theme) theme = {}
  if (typeof theme === 'string') {
    theme = this._themes.getTheme(theme)
  } else if (theme && (Object.keys(theme).length === 0 || theme.hasUnicode != null || theme.hasColor != null)) {
    var useUnicode = theme.hasUnicode == null ? hasUnicode() : theme.hasUnicode
    var useColor = theme.hasColor == null ? hasColor : theme.hasColor
    theme = this._themes.getDefault({hasUnicode: useUnicode, hasColor: useColor, platform: theme.platform})
  }
  return theme
}

Gauge.prototype.setThemeset = function (themes) {
  this._themes = themes
  this.setTheme(this._theme)
}

Gauge.prototype.setTheme = function (theme) {
  this._gauge.setTheme(this._computeTheme(theme))
  if (this._showing) this._requestRedraw()
  this._theme = theme
}

Gauge.prototype._requestRedraw = function () {
  this._needsRedraw = true
  if (!this._fixedFramerate) this._doRedraw()
}

Gauge.prototype.getWidth = function () {
  return ((this._tty && this._tty.columns) || 80) - 1
}

Gauge.prototype.setWriteTo = function (writeTo, tty) {
  var enabled = !this._disabled
  if (enabled) this.disable()
  this._writeTo = writeTo
  this._tty = tty ||
    (writeTo === process.stderr && process.stdout.isTTY && process.stdout) ||
    (writeTo.isTTY && writeTo) ||
    this._tty
  if (this._gauge) this._gauge.setWidth(this.getWidth())
  if (enabled) this.enable()
}

Gauge.prototype.enable = function () {
  if (!this._disabled) return
  this._disabled = false
  if (this._tty) this._enableEvents()
  if (this._showing) this.show()
}

Gauge.prototype.disable = function () {
  if (this._disabled) return
  if (this._showing) {
    this._lastUpdateAt = null
    this._showing = false
    this._doRedraw()
    this._showing = true
  }
  this._disabled = true
  if (this._tty) this._disableEvents()
}

Gauge.prototype._enableEvents = function () {
  if (this._cleanupOnExit) {
    this._removeOnExit = onExit(callWith(this, this.disable))
  }
  this._tty.on('resize', this._$$handleSizeChange)
  if (this._fixedFramerate) {
    this.redrawTracker = setInterval(this._$$doRedraw, this._updateInterval)
    if (this.redrawTracker.unref) this.redrawTracker.unref()
  }
}

Gauge.prototype._disableEvents = function () {
  this._tty.removeListener('resize', this._$$handleSizeChange)
  if (this._fixedFramerate) clearInterval(this.redrawTracker)
  if (this._removeOnExit) this._removeOnExit()
}

Gauge.prototype.hide = function (cb) {
  if (this._disabled) return cb && process.nextTick(cb)
  if (!this._showing) return cb && process.nextTick(cb)
  this._showing = false
  this._doRedraw()
  cb && setImmediate(cb)
}

Gauge.prototype.show = function (section, completed) {
  this._showing = true
  if (typeof section === 'string') {
    this._status.section = section
  } else if (typeof section === 'object') {
    var sectionKeys = Object.keys(section)
    for (var ii = 0; ii < sectionKeys.length; ++ii) {
      var key = sectionKeys[ii]
      this._status[key] = section[key]
    }
  }
  if (completed != null) this._status.completed = completed
  if (this._disabled) return
  this._requestRedraw()
}

Gauge.prototype.pulse = function (subsection) {
  this._status.subsection = subsection || ''
  this._status.spun++
  if (this._disabled) return
  if (!this._showing) return
  this._requestRedraw()
}

Gauge.prototype._handleSizeChange = function () {
  this._gauge.setWidth(this._tty.columns - 1)
  this._requestRedraw()
}

Gauge.prototype._doRedraw = function () {
  if (this._disabled || this._paused) return
  if (!this._fixedFramerate) {
    var now = Date.now()
    if (this._lastUpdateAt && now - this._lastUpdateAt < this._updateInterval) return
    this._lastUpdateAt = now
  }
  if (!this._showing && this._onScreen) {
    this._onScreen = false
    var result = this._gauge.hide()
    if (this._hideCursor) {
      result += this._gauge.showCursor()
    }
    return this._writeTo.write(result)
  }
  if (!this._showing && !this._onScreen) return
  if (this._showing && !this._onScreen) {
    this._onScreen = true
    this._needsRedraw = true
    if (this._hideCursor) {
      this._writeTo.write(this._gauge.hideCursor())
    }
  }
  if (!this._needsRedraw) return
  if (!this._writeTo.write(this._gauge.show(this._status))) {
    this._paused = true
    this._writeTo.on('drain', callWith(this, function () {
      this._paused = false
      this._doRedraw()
    }))
  }
}
{
  "name": "gauge",
  "version": "3.0.2",
  "description": "A terminal based horizontal guage",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "https://github.com/iarna/gauge"
  },
  "author": "Rebecca Turner <me@re-becca.org>",
  "license": "ISC",
  "homepage": "https://github.com/npm/gauge",
  "dependencies": {
    "aproba": "^1.0.3 || ^2.0.0",
    "color-support": "^1.1.2",
    "console-control-strings": "^1.0.0",
    "has-unicode": "^2.0.1",
    "object-assign": "^4.1.1",
    "signal-exit": "^3.0.0",
    "string-width": "^4.2.3",
    "strip-ansi": "^6.0.1",
    "wide-align": "^1.1.2"
  },
  "devDependencies": {
    "readable-stream": "^2.0.6",
    "require-inject": "^1.4.0",
    "standard": "^11.0.1",
    "tap": "^12.0.1",
    "through2": "^2.0.0"
  },
  "files": [
    "base-theme.js",
    "CHANGELOG.md",
    "error.js",
    "has-color.js",
    "index.js",
    "LICENSE",
    "package.json",
    "plumbing.js",
    "process.js",
    "progress-bar.js",
    "README.md",
    "render-template.js",
    "set-immediate.js",
    "set-interval.js",
    "spin.js",
    "template-item.js",
    "theme-set.js",
    "themes.js",
    "wide-truncate.js"
  ],
  "engines": {
    "node": ">=10"
  }
}'use strict'
var consoleControl = require('console-control-strings')
var renderTemplate = require('./render-template.js')
var validate = require('aproba')

var Plumbing = module.exports = function (theme, template, width) {
  if (!width) width = 80
  validate('OAN', [theme, template, width])
  this.showing = false
  this.theme = theme
  this.width = width
  this.template = template
}
Plumbing.prototype = {}

Plumbing.prototype.setTheme = function (theme) {
  validate('O', [theme])
  this.theme = theme
}

Plumbing.prototype.setTemplate = function (template) {
  validate('A', [template])
  this.template = template
}

Plumbing.prototype.setWidth = function (width) {
  validate('N', [width])
  this.width = width
}

Plumbing.prototype.hide = function () {
  return consoleControl.gotoSOL() + consoleControl.eraseLine()
}

Plumbing.prototype.hideCursor = consoleControl.hideCursor

Plumbing.prototype.showCursor = consoleControl.showCursor

Plumbing.prototype.show = function (status) {
  var values = Object.create(this.theme)
  for (var key in status) {
    values[key] = status[key]
  }

  return renderTemplate(this.width, this.template, values).trim() +
         consoleControl.color('reset') +
         consoleControl.eraseLine() + consoleControl.gotoSOL()
}
'use strict'
// this exists so we can replace it during testing
module.exports = process
'use strict'
var validate = require('aproba')
var renderTemplate = require('./render-template.js')
var wideTruncate = require('./wide-truncate')
var stringWidth = require('string-width')

module.exports = function (theme, width, completed) {
  validate('ONN', [theme, width, completed])
  if (completed < 0) completed = 0
  if (completed > 1) completed = 1
  if (width <= 0) return ''
  var sofar = Math.round(width * completed)
  var rest = width - sofar
  var template = [
    {type: 'complete', value: repeat(theme.complete, sofar), length: sofar},
    {type: 'remaining', value: repeat(theme.remaining, rest), length: rest}
  ]
  return renderTemplate(width, template, theme)
}

// lodash's way of repeating
function repeat (string, width) {
  var result = ''
  var n = width
  do {
    if (n % 2) {
      result += string
    }
    n = Math.floor(n / 2)
    /* eslint no-self-assign: 0 */
    string += string
  } while (n && stringWidth(result) < width)

  return wideTruncate(result, width)
}
'use strict'
var align = require('wide-align')
var validate = require('aproba')
var wideTruncate = require('./wide-truncate')
var error = require('./error')
var TemplateItem = require('./template-item')

function renderValueWithValues (values) {
  return function (item) {
    return renderValue(item, values)
  }
}

var renderTemplate = module.exports = function (width, template, values) {
  var items = prepareItems(width, template, values)
  var rendered = items.map(renderValueWithValues(values)).join('')
  return align.left(wideTruncate(rendered, width), width)
}

function preType (item) {
  var cappedTypeName = item.type[0].toUpperCase() + item.type.slice(1)
  return 'pre' + cappedTypeName
}

function postType (item) {
  var cappedTypeName = item.type[0].toUpperCase() + item.type.slice(1)
  return 'post' + cappedTypeName
}

function hasPreOrPost (item, values) {
  if (!item.type) return
  return values[preType(item)] || values[postType(item)]
}

function generatePreAndPost (baseItem, parentValues) {
  var item = Object.assign({}, baseItem)
  var values = Object.create(parentValues)
  var template = []
  var pre = preType(item)
  var post = postType(item)
  if (values[pre]) {
    template.push({value: values[pre]})
    values[pre] = null
  }
  item.minLength = null
  item.length = null
  item.maxLength = null
  template.push(item)
  values[item.type] = values[item.type]
  if (values[post]) {
    template.push({value: values[post]})
    values[post] = null
  }
  return function ($1, $2, length) {
    return renderTemplate(length, template, values)
  }
}

function prepareItems (width, template, values) {
  function cloneAndObjectify (item, index, arr) {
    var cloned = new TemplateItem(item, width)
    var type = cloned.type
    if (cloned.value == null) {
      if (!(type in values)) {
        if (cloned.default == null) {
          throw new error.MissingTemplateValue(cloned, values)
        } else {
          cloned.value = cloned.default
        }
      } else {
        cloned.value = values[type]
      }
    }
    if (cloned.value == null || cloned.value === '') return null
    cloned.index = index
    cloned.first = index === 0
    cloned.last = index === arr.length - 1
    if (hasPreOrPost(cloned, values)) cloned.value = generatePreAndPost(cloned, values)
    return cloned
  }

  var output = template.map(cloneAndObjectify).filter(function (item) { return item != null })

  var remainingSpace = width
  var variableCount = output.length

  function consumeSpace (length) {
    if (length > remainingSpace) length = remainingSpace
    remainingSpace -= length
  }

  function finishSizing (item, length) {
    if (item.finished) throw new error.Internal('Tried to finish template item that was already finished')
    if (length === Infinity) throw new error.Internal('Length of template item cannot be infinity')
    if (length != null) item.length = length
    item.minLength = null
    item.maxLength = null
    --variableCount
    item.finished = true
    if (item.length == null) item.length = item.getBaseLength()
    if (item.length == null) throw new error.Internal('Finished template items must have a length')
    consumeSpace(item.getLength())
  }

  output.forEach(function (item) {
    if (!item.kerning) return
    var prevPadRight = item.first ? 0 : output[item.index - 1].padRight
    if (!item.first && prevPadRight < item.kerning) item.padLeft = item.kerning - prevPadRight
    if (!item.last) item.padRight = item.kerning
  })

  // Finish any that have a fixed (literal or intuited) length
  output.forEach(function (item) {
    if (item.getBaseLength() == null) return
    finishSizing(item)
  })

  var resized = 0
  var resizing
  var hunkSize
  do {
    resizing = false
    hunkSize = Math.round(remainingSpace / variableCount)
    output.forEach(function (item) {
      if (item.finished) return
      if (!item.maxLength) return
      if (item.getMaxLength() < hunkSize) {
        finishSizing(item, item.maxLength)
        resizing = true
      }
    })
  } while (resizing && resized++ < output.length)
  if (resizing) throw new error.Internal('Resize loop iterated too many times while determining maxLength')

  resized = 0
  do {
    resizing = false
    hunkSize = Math.round(remainingSpace / variableCount)
    output.forEach(function (item) {
      if (item.finished) return
      if (!item.minLength) return
      if (item.getMinLength() >= hunkSize) {
        finishSizing(item, item.minLength)
        resizing = true
      }
    })
  } while (resizing && resized++ < output.length)
  if (resizing) throw new error.Internal('Resize loop iterated too many times while determining minLength')

  hunkSize = Math.round(remainingSpace / variableCount)
  output.forEach(function (item) {
    if (item.finished) return
    finishSizing(item, hunkSize)
  })

  return output
}

function renderFunction (item, values, length) {
  validate('OON', arguments)
  if (item.type) {
    return item.value(values, values[item.type + 'Theme'] || {}, length)
  } else {
    return item.value(values, {}, length)
  }
}

function renderValue (item, values) {
  var length = item.getBaseLength()
  var value = typeof item.value === 'function' ? renderFunction(item, values, length) : item.value
  if (value == null || value === '') return ''
  var alignWith = align[item.align] || align.left
  var leftPadding = item.padLeft ? align.left('', item.padLeft) : ''
  var rightPadding = item.padRight ? align.right('', item.padRight) : ''
  var truncated = wideTruncate(String(value), length)
  var aligned = alignWith(truncated, length)
  return leftPadding + aligned + rightPadding
}
'use strict'
var process = require('./process')
try {
  module.exports = setImmediate
} catch (ex) {
  module.exports = process.nextTick
}
'use strict'
// this exists so we can replace it during testing
module.exports = setInterval
'use strict'

module.exports = function spin (spinstr, spun) {
  return spinstr[spun % spinstr.length]
}
'use strict'
var stringWidth = require('string-width')

module.exports = TemplateItem

function isPercent (num) {
  if (typeof num !== 'string') return false
  return num.slice(-1) === '%'
}

function percent (num) {
  return Number(num.slice(0, -1)) / 100
}

function TemplateItem (values, outputLength) {
  this.overallOutputLength = outputLength
  this.finished = false
  this.type = null
  this.value = null
  this.length = null
  this.maxLength = null
  this.minLength = null
  this.kerning = null
  this.align = 'left'
  this.padLeft = 0
  this.padRight = 0
  this.index = null
  this.first = null
  this.last = null
  if (typeof values === 'string') {
    this.value = values
  } else {
    for (var prop in values) this[prop] = values[prop]
  }
  // Realize percents
  if (isPercent(this.length)) {
    this.length = Math.round(this.overallOutputLength * percent(this.length))
  }
  if (isPercent(this.minLength)) {
    this.minLength = Math.round(this.overallOutputLength * percent(this.minLength))
  }
  if (isPercent(this.maxLength)) {
    this.maxLength = Math.round(this.overallOutputLength * percent(this.maxLength))
  }
  return this
}

TemplateItem.prototype = {}

TemplateItem.prototype.getBaseLength = function () {
  var length = this.length
  if (length == null && typeof this.value === 'string' && this.maxLength == null && this.minLength == null) {
    length = stringWidth(this.value)
  }
  return length
}

TemplateItem.prototype.getLength = function () {
  var length = this.getBaseLength()
  if (length == null) return null
  return length + this.padLeft + this.padRight
}

TemplateItem.prototype.getMaxLength = function () {
  if (this.maxLength == null) return null
  return this.maxLength + this.padLeft + this.padRight
}

TemplateItem.prototype.getMinLength = function () {
  if (this.minLength == null) return null
  return this.minLength + this.padLeft + this.padRight
}
'use strict'
var objectAssign = require('object-assign')

module.exports = function () {
  return ThemeSetProto.newThemeSet()
}

var ThemeSetProto = {}

ThemeSetProto.baseTheme = require('./base-theme.js')

ThemeSetProto.newTheme = function (parent, theme) {
  if (!theme) {
    theme = parent
    parent = this.baseTheme
  }
  return objectAssign({}, parent, theme)
}

ThemeSetProto.getThemeNames = function () {
  return Object.keys(this.themes)
}

ThemeSetProto.addTheme = function (name, parent, theme) {
  this.themes[name] = this.newTheme(parent, theme)
}

ThemeSetProto.addToAllThemes = function (theme) {
  var themes = this.themes
  Object.keys(themes).forEach(function (name) {
    objectAssign(themes[name], theme)
  })
  objectAssign(this.baseTheme, theme)
}

ThemeSetProto.getTheme = function (name) {
  if (!this.themes[name]) throw this.newMissingThemeError(name)
  return this.themes[name]
}

ThemeSetProto.setDefault = function (opts, name) {
  if (name == null) {
    name = opts
    opts = {}
  }
  var platform = opts.platform == null ? 'fallback' : opts.platform
  var hasUnicode = !!opts.hasUnicode
  var hasColor = !!opts.hasColor
  if (!this.defaults[platform]) this.defaults[platform] = {true: {}, false: {}}
  this.defaults[platform][hasUnicode][hasColor] = name
}

ThemeSetProto.getDefault = function (opts) {
  if (!opts) opts = {}
  var platformName = opts.platform || process.platform
  var platform = this.defaults[platformName] || this.defaults.fallback
  var hasUnicode = !!opts.hasUnicode
  var hasColor = !!opts.hasColor
  if (!platform) throw this.newMissingDefaultThemeError(platformName, hasUnicode, hasColor)
  if (!platform[hasUnicode][hasColor]) {
    if (hasUnicode && hasColor && platform[!hasUnicode][hasColor]) {
      hasUnicode = false
    } else if (hasUnicode && hasColor && platform[hasUnicode][!hasColor]) {
      hasColor = false
    } else if (hasUnicode && hasColor && platform[!hasUnicode][!hasColor]) {
      hasUnicode = false
      hasColor = false
    } else if (hasUnicode && !hasColor && platform[!hasUnicode][hasColor]) {
      hasUnicode = false
    } else if (!hasUnicode && hasColor && platform[hasUnicode][!hasColor]) {
      hasColor = false
    } else if (platform === this.defaults.fallback) {
      throw this.newMissingDefaultThemeError(platformName, hasUnicode, hasColor)
    }
  }
  if (platform[hasUnicode][hasColor]) {
    return this.getTheme(platform[hasUnicode][hasColor])
  } else {
    return this.getDefault(objectAssign({}, opts, {platform: 'fallback'}))
  }
}

ThemeSetProto.newMissingThemeError = function newMissingThemeError (name) {
  var err = new Error('Could not find a gauge theme named "' + name + '"')
  Error.captureStackTrace.call(err, newMissingThemeError)
  err.theme = name
  err.code = 'EMISSINGTHEME'
  return err
}

ThemeSetProto.newMissingDefaultThemeError = function newMissingDefaultThemeError (platformName, hasUnicode, hasColor) {
  var err = new Error(
    'Could not find a gauge theme for your platform/unicode/color use combo:\n' +
    '    platform = ' + platformName + '\n' +
    '    hasUnicode = ' + hasUnicode + '\n' +
    '    hasColor = ' + hasColor)
  Error.captureStackTrace.call(err, newMissingDefaultThemeError)
  err.platform = platformName
  err.hasUnicode = hasUnicode
  err.hasColor = hasColor
  err.code = 'EMISSINGTHEME'
  return err
}

ThemeSetProto.newThemeSet = function () {
  var themeset = function (opts) {
    return themeset.getDefault(opts)
  }
  return objectAssign(themeset, ThemeSetProto, {
    themes: objectAssign({}, this.themes),
    baseTheme: objectAssign({}, this.baseTheme),
    defaults: JSON.parse(JSON.stringify(this.defaults || {}))
  })
}
'use strict'
var color = require('console-control-strings').color
var ThemeSet = require('./theme-set.js')

var themes = module.exports = new ThemeSet()

themes.addTheme('ASCII', {
  preProgressbar: '[',
  postProgressbar: ']',
  progressbarTheme: {
    complete: '#',
    remaining: '.'
  },
  activityIndicatorTheme: '-\\|/',
  preSubsection: '>'
})

themes.addTheme('colorASCII', themes.getTheme('ASCII'), {
  progressbarTheme: {
    preComplete: color('bgBrightWhite', 'brightWhite'),
    complete: '#',
    postComplete: color('reset'),
    preRemaining: color('bgBrightBlack', 'brightBlack'),
    remaining: '.',
    postRemaining: color('reset')
  }
})

themes.addTheme('brailleSpinner', {
  preProgressbar: '⸨',
  postProgressbar: '⸩',
  progressbarTheme: {
    complete: '#',
    remaining: '⠂'
  },
  activityIndicatorTheme: '⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏',
  preSubsection: '>'
})

themes.addTheme('colorBrailleSpinner', themes.getTheme('brailleSpinner'), {
  progressbarTheme: {
    preComplete: color('bgBrightWhite', 'brightWhite'),
    complete: '#',
    postComplete: color('reset'),
    preRemaining: color('bgBrightBlack', 'brightBlack'),
    remaining: '⠂',
    postRemaining: color('reset')
  }
})

themes.setDefault({}, 'ASCII')
themes.setDefault({hasColor: true}, 'colorASCII')
themes.setDefault({platform: 'darwin', hasUnicode: true}, 'brailleSpinner')
themes.setDefault({platform: 'darwin', hasUnicode: true, hasColor: true}, 'colorBrailleSpinner')
themes.setDefault({platform: 'linux', hasUnicode: true}, 'brailleSpinner')
themes.setDefault({platform: 'linux', hasUnicode: true, hasColor: true}, 'colorBrailleSpinner')
'use strict'
var stringWidth = require('string-width')
var stripAnsi = require('strip-ansi')

module.exports = wideTruncate

function wideTruncate (str, target) {
  if (stringWidth(str) === 0) return str
  if (target <= 0) return ''
  if (stringWidth(str) <= target) return str

  // We compute the number of bytes of ansi sequences here and add
  // that to our initial truncation to ensure that we don't slice one
  // that we want to keep in half.
  var noAnsi = stripAnsi(str)
  var ansiSize = str.length + noAnsi.length
  var truncated = str.slice(0, target + ansiSize)

  // we have to shrink the result to account for our ansi sequence buffer
  // (if an ansi sequence was truncated) and double width characters.
  while (stringWidth(truncated) > target) {
    truncated = truncated.slice(0, -1)
  }
  return truncated
}
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.
{
  "name": "nopt",
  "version": "5.0.0",
  "description": "Option parsing for Node, supporting types, shorthands, etc. Used by npm.",
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
  "main": "lib/nopt.js",
  "repository": {
    "type": "git",
    "url": "https://github.com/npm/nopt.git"
  },
  "bin": {
    "nopt": "bin/nopt.js"
  },
  "license": "ISC",
  "dependencies": {
    "abbrev": "1"
  },
  "devDependencies": {
    "tap": "^14.10.6"
  },
  "files": [
    "bin",
    "lib"
  ],
  "engines": {
    "node": ">=6"
  }
}// info about each config option.

var debug = process.env.DEBUG_NOPT || process.env.NOPT_DEBUG
  ? function () { console.error.apply(console, arguments) }
  : function () {}

var url = require("url")
  , path = require("path")
  , Stream = require("stream").Stream
  , abbrev = require("abbrev")
  , os = require("os")

module.exports = exports = nopt
exports.clean = clean

exports.typeDefs =
  { String  : { type: String,  validate: validateString  }
  , Boolean : { type: Boolean, validate: validateBoolean }
  , url     : { type: url,     validate: validateUrl     }
  , Number  : { type: Number,  validate: validateNumber  }
  , path    : { type: path,    validate: validatePath    }
  , Stream  : { type: Stream,  validate: validateStream  }
  , Date    : { type: Date,    validate: validateDate    }
  }

function nopt (types, shorthands, args, slice) {
  args = args || process.argv
  types = types || {}
  shorthands = shorthands || {}
  if (typeof slice !== "number") slice = 2

  debug(types, shorthands, args, slice)

  args = args.slice(slice)
  var data = {}
    , key
    , argv = {
        remain: [],
        cooked: args,
        original: args.slice(0)
      }

  parse(args, data, argv.remain, types, shorthands)
  // now data is full
  clean(data, types, exports.typeDefs)
  data.argv = argv
  Object.defineProperty(data.argv, 'toString', { value: function () {
    return this.original.map(JSON.stringify).join(" ")
  }, enumerable: false })
  return data
}

function clean (data, types, typeDefs) {
  typeDefs = typeDefs || exports.typeDefs
  var remove = {}
    , typeDefault = [false, true, null, String, Array]

  Object.keys(data).forEach(function (k) {
    if (k === "argv") return
    var val = data[k]
      , isArray = Array.isArray(val)
      , type = types[k]
    if (!isArray) val = [val]
    if (!type) type = typeDefault
    if (type === Array) type = typeDefault.concat(Array)
    if (!Array.isArray(type)) type = [type]

    debug("val=%j", val)
    debug("types=", type)
    val = val.map(function (val) {
      // if it's an unknown value, then parse false/true/null/numbers/dates
      if (typeof val === "string") {
        debug("string %j", val)
        val = val.trim()
        if ((val === "null" && ~type.indexOf(null))
            || (val === "true" &&
               (~type.indexOf(true) || ~type.indexOf(Boolean)))
            || (val === "false" &&
               (~type.indexOf(false) || ~type.indexOf(Boolean)))) {
          val = JSON.parse(val)
          debug("jsonable %j", val)
        } else if (~type.indexOf(Number) && !isNaN(val)) {
          debug("convert to number", val)
          val = +val
        } else if (~type.indexOf(Date) && !isNaN(Date.parse(val))) {
          debug("convert to date", val)
          val = new Date(val)
        }
      }

      if (!types.hasOwnProperty(k)) {
        return val
      }

      // allow `--no-blah` to set 'blah' to null if null is allowed
      if (val === false && ~type.indexOf(null) &&
          !(~type.indexOf(false) || ~type.indexOf(Boolean))) {
        val = null
      }

      var d = {}
      d[k] = val
      debug("prevalidated val", d, val, types[k])
      if (!validate(d, k, val, types[k], typeDefs)) {
        if (exports.invalidHandler) {
          exports.invalidHandler(k, val, types[k], data)
        } else if (exports.invalidHandler !== false) {
          debug("invalid: "+k+"="+val, types[k])
        }
        return remove
      }
      debug("validated val", d, val, types[k])
      return d[k]
    }).filter(function (val) { return val !== remove })

    // if we allow Array specifically, then an empty array is how we
    // express 'no value here', not null.  Allow it.
    if (!val.length && type.indexOf(Array) === -1) {
      debug('VAL HAS NO LENGTH, DELETE IT', val, k, type.indexOf(Array))
      delete data[k]
    }
    else if (isArray) {
      debug(isArray, data[k], val)
      data[k] = val
    } else data[k] = val[0]

    debug("k=%s val=%j", k, val, data[k])
  })
}

function validateString (data, k, val) {
  data[k] = String(val)
}

function validatePath (data, k, val) {
  if (val === true) return false
  if (val === null) return true

  val = String(val)

  var isWin       = process.platform === 'win32'
    , homePattern = isWin ? /^~(\/|\\)/ : /^~\//
    , home        = os.homedir()

  if (home && val.match(homePattern)) {
    data[k] = path.resolve(home, val.substr(2))
  } else {
    data[k] = path.resolve(val)
  }
  return true
}

function validateNumber (data, k, val) {
  debug("validate Number %j %j %j", k, val, isNaN(val))
  if (isNaN(val)) return false
  data[k] = +val
}

function validateDate (data, k, val) {
  var s = Date.parse(val)
  debug("validate Date %j %j %j", k, val, s)
  if (isNaN(s)) return false
  data[k] = new Date(val)
}

function validateBoolean (data, k, val) {
  if (val instanceof Boolean) val = val.valueOf()
  else if (typeof val === "string") {
    if (!isNaN(val)) val = !!(+val)
    else if (val === "null" || val === "false") val = false
    else val = true
  } else val = !!val
  data[k] = val
}

function validateUrl (data, k, val) {
  val = url.parse(String(val))
  if (!val.host) return false
  data[k] = val.href
}

function validateStream (data, k, val) {
  if (!(val instanceof Stream)) return false
  data[k] = val
}

function validate (data, k, val, type, typeDefs) {
  // arrays are lists of types.
  if (Array.isArray(type)) {
    for (var i = 0, l = type.length; i < l; i ++) {
      if (type[i] === Array) continue
      if (validate(data, k, val, type[i], typeDefs)) return true
    }
    delete data[k]
    return false
  }

  // an array of anything?
  if (type === Array) return true

  // NaN is poisonous.  Means that something is not allowed.
  if (type !== type) {
    debug("Poison NaN", k, val, type)
    delete data[k]
    return false
  }

  // explicit list of values
  if (val === type) {
    debug("Explicitly allowed %j", val)
    // if (isArray) (data[k] = data[k] || []).push(val)
    // else data[k] = val
    data[k] = val
    return true
  }

  // now go through the list of typeDefs, validate against each one.
  var ok = false
    , types = Object.keys(typeDefs)
  for (var i = 0, l = types.length; i < l; i ++) {
    debug("test type %j %j %j", k, val, types[i])
    var t = typeDefs[types[i]]
    if (t &&
      ((type && type.name && t.type && t.type.name) ? (type.name === t.type.name) : (type === t.type))) {
      var d = {}
      ok = false !== t.validate(d, k, val)
      val = d[k]
      if (ok) {
        // if (isArray) (data[k] = data[k] || []).push(val)
        // else data[k] = val
        data[k] = val
        break
      }
    }
  }
  debug("OK? %j (%j %j %j)", ok, k, val, types[i])

  if (!ok) delete data[k]
  return ok
}

function parse (args, data, remain, types, shorthands) {
  debug("parse", args, data, remain)

  var key = null
    , abbrevs = abbrev(Object.keys(types))
    , shortAbbr = abbrev(Object.keys(shorthands))

  for (var i = 0; i < args.length; i ++) {
    var arg = args[i]
    debug("arg", arg)

    if (arg.match(/^-{2,}$/)) {
      // done with keys.
      // the rest are args.
      remain.push.apply(remain, args.slice(i + 1))
      args[i] = "--"
      break
    }
    var hadEq = false
    if (arg.charAt(0) === "-" && arg.length > 1) {
      var at = arg.indexOf('=')
      if (at > -1) {
        hadEq = true
        var v = arg.substr(at + 1)
        arg = arg.substr(0, at)
        args.splice(i, 1, arg, v)
      }

      // see if it's a shorthand
      // if so, splice and back up to re-parse it.
      var shRes = resolveShort(arg, shorthands, shortAbbr, abbrevs)
      debug("arg=%j shRes=%j", arg, shRes)
      if (shRes) {
        debug(arg, shRes)
        args.splice.apply(args, [i, 1].concat(shRes))
        if (arg !== shRes[0]) {
          i --
          continue
        }
      }
      arg = arg.replace(/^-+/, "")
      var no = null
      while (arg.toLowerCase().indexOf("no-") === 0) {
        no = !no
        arg = arg.substr(3)
      }

      if (abbrevs[arg]) arg = abbrevs[arg]

      var argType = types[arg]
      var isTypeArray = Array.isArray(argType)
      if (isTypeArray && argType.length === 1) {
        isTypeArray = false
        argType = argType[0]
      }

      var isArray = argType === Array ||
        isTypeArray && argType.indexOf(Array) !== -1

      // allow unknown things to be arrays if specified multiple times.
      if (!types.hasOwnProperty(arg) && data.hasOwnProperty(arg)) {
        if (!Array.isArray(data[arg]))
          data[arg] = [data[arg]]
        isArray = true
      }

      var val
        , la = args[i + 1]

      var isBool = typeof no === 'boolean' ||
        argType === Boolean ||
        isTypeArray && argType.indexOf(Boolean) !== -1 ||
        (typeof argType === 'undefined' && !hadEq) ||
        (la === "false" &&
         (argType === null ||
          isTypeArray && ~argType.indexOf(null)))

      if (isBool) {
        // just set and move along
        val = !no
        // however, also support --bool true or --bool false
        if (la === "true" || la === "false") {
          val = JSON.parse(la)
          la = null
          if (no) val = !val
          i ++
        }

        // also support "foo":[Boolean, "bar"] and "--foo bar"
        if (isTypeArray && la) {
          if (~argType.indexOf(la)) {
            // an explicit type
            val = la
            i ++
          } else if ( la === "null" && ~argType.indexOf(null) ) {
            // null allowed
            val = null
            i ++
          } else if ( !la.match(/^-{2,}[^-]/) &&
                      !isNaN(la) &&
                      ~argType.indexOf(Number) ) {
            // number
            val = +la
            i ++
          } else if ( !la.match(/^-[^-]/) && ~argType.indexOf(String) ) {
            // string
            val = la
            i ++
          }
        }

        if (isArray) (data[arg] = data[arg] || []).push(val)
        else data[arg] = val

        continue
      }

      if (argType === String) {
        if (la === undefined) {
          la = ""
        } else if (la.match(/^-{1,2}[^-]+/)) {
          la = ""
          i --
        }
      }

      if (la && la.match(/^-{2,}$/)) {
        la = undefined
        i --
      }

      val = la === undefined ? true : la
      if (isArray) (data[arg] = data[arg] || []).push(val)
      else data[arg] = val

      i ++
      continue
    }
    remain.push(arg)
  }
}

function resolveShort (arg, shorthands, shortAbbr, abbrevs) {
  // handle single-char shorthands glommed together, like
  // npm ls -glp, but only if there is one dash, and only if
  // all of the chars are single-char shorthands, and it's
  // not a match to some other abbrev.
  arg = arg.replace(/^-+/, '')

  // if it's an exact known option, then don't go any further
  if (abbrevs[arg] === arg)
    return null

  // if it's an exact known shortopt, same deal
  if (shorthands[arg]) {
    // make it an array, if it's a list of words
    if (shorthands[arg] && !Array.isArray(shorthands[arg]))
      shorthands[arg] = shorthands[arg].split(/\s+/)

    return shorthands[arg]
  }

  // first check to see if this arg is a set of single-char shorthands
  var singles = shorthands.___singles
  if (!singles) {
    singles = Object.keys(shorthands).filter(function (s) {
      return s.length === 1
    }).reduce(function (l,r) {
      l[r] = true
      return l
    }, {})
    shorthands.___singles = singles
    debug('shorthand singles', singles)
  }

  var chrs = arg.split("").filter(function (c) {
    return singles[c]
  })

  if (chrs.join("") === arg) return chrs.map(function (c) {
    return shorthands[c]
  }).reduce(function (l, r) {
    return l.concat(r)
  }, [])


  // if it's an arg abbrev, and not a literal shorthand, then prefer the arg
  if (abbrevs[arg] && !shorthands[arg])
    return null

  // if it's an abbr for a shorthand, then use that
  if (shortAbbr[arg])
    arg = shortAbbr[arg]

  // make it an array, if it's a list of words
  if (shorthands[arg] && !Array.isArray(shorthands[arg]))
    shorthands[arg] = shorthands[arg].split(/\s+/)

  return shorthands[arg]
}
#!/usr/bin/env node
var nopt = require("../lib/nopt")
  , path = require("path")
  , types = { num: Number
            , bool: Boolean
            , help: Boolean
            , list: Array
            , "num-list": [Number, Array]
            , "str-list": [String, Array]
            , "bool-list": [Boolean, Array]
            , str: String
            , clear: Boolean
            , config: Boolean
            , length: Number
            , file: path
            }
  , shorthands = { s: [ "--str", "astring" ]
                 , b: [ "--bool" ]
                 , nb: [ "--no-bool" ]
                 , tft: [ "--bool-list", "--no-bool-list", "--bool-list", "true" ]
                 , "?": ["--help"]
                 , h: ["--help"]
                 , H: ["--help"]
                 , n: [ "--num", "125" ]
                 , c: ["--config"]
                 , l: ["--length"]
                 , f: ["--file"]
                 }
  , parsed = nopt( types
                 , shorthands
                 , process.argv
                 , 2 )

console.log("parsed", parsed)

if (parsed.help) {
  console.log("")
  console.log("nopt cli tester")
  console.log("")
  console.log("types")
  console.log(Object.keys(types).map(function M (t) {
    var type = types[t]
    if (Array.isArray(type)) {
      return [t, type.map(function (type) { return type.name })]
    }
    return [t, type && type.name]
  }).reduce(function (s, i) {
    s[i[0]] = i[1]
    return s
  }, {}))
  console.log("")
  console.log("shorthands")
  console.log(shorthands)
}
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.
'use strict'
var Progress = require('are-we-there-yet')
var Gauge = require('gauge')
var EE = require('events').EventEmitter
var log = exports = module.exports = new EE()
var util = require('util')

var setBlocking = require('set-blocking')
var consoleControl = require('console-control-strings')

setBlocking(true)
var stream = process.stderr
Object.defineProperty(log, 'stream', {
  set: function (newStream) {
    stream = newStream
    if (this.gauge) {
      this.gauge.setWriteTo(stream, stream)
    }
  },
  get: function () {
    return stream
  },
})

// by default, decide based on tty-ness.
var colorEnabled
log.useColor = function () {
  return colorEnabled != null ? colorEnabled : stream.isTTY
}

log.enableColor = function () {
  colorEnabled = true
  this.gauge.setTheme({hasColor: colorEnabled, hasUnicode: unicodeEnabled})
}
log.disableColor = function () {
  colorEnabled = false
  this.gauge.setTheme({hasColor: colorEnabled, hasUnicode: unicodeEnabled})
}

// default level
log.level = 'info'

log.gauge = new Gauge(stream, {
  enabled: false, // no progress bars unless asked
  theme: {hasColor: log.useColor()},
  template: [
    {type: 'progressbar', length: 20},
    {type: 'activityIndicator', kerning: 1, length: 1},
    {type: 'section', default: ''},
    ':',
    {type: 'logline', kerning: 1, default: ''},
  ],
})

log.tracker = new Progress.TrackerGroup()

// we track this separately as we may need to temporarily disable the
// display of the status bar for our own loggy purposes.
log.progressEnabled = log.gauge.isEnabled()

var unicodeEnabled

log.enableUnicode = function () {
  unicodeEnabled = true
  this.gauge.setTheme({hasColor: this.useColor(), hasUnicode: unicodeEnabled})
}

log.disableUnicode = function () {
  unicodeEnabled = false
  this.gauge.setTheme({hasColor: this.useColor(), hasUnicode: unicodeEnabled})
}

log.setGaugeThemeset = function (themes) {
  this.gauge.setThemeset(themes)
}

log.setGaugeTemplate = function (template) {
  this.gauge.setTemplate(template)
}

log.enableProgress = function () {
  if (this.progressEnabled) {
    return
  }

  this.progressEnabled = true
  this.tracker.on('change', this.showProgress)
  if (this._paused) {
    return
  }

  this.gauge.enable()
}

log.disableProgress = function () {
  if (!this.progressEnabled) {
    return
  }
  this.progressEnabled = false
  this.tracker.removeListener('change', this.showProgress)
  this.gauge.disable()
}

var trackerConstructors = ['newGroup', 'newItem', 'newStream']

var mixinLog = function (tracker) {
  // mixin the public methods from log into the tracker
  // (except: conflicts and one's we handle specially)
  Object.keys(log).forEach(function (P) {
    if (P[0] === '_') {
      return
    }

    if (trackerConstructors.filter(function (C) {
      return C === P
    }).length) {
      return
    }

    if (tracker[P]) {
      return
    }

    if (typeof log[P] !== 'function') {
      return
    }

    var func = log[P]
    tracker[P] = function () {
      return func.apply(log, arguments)
    }
  })
  // if the new tracker is a group, make sure any subtrackers get
  // mixed in too
  if (tracker instanceof Progress.TrackerGroup) {
    trackerConstructors.forEach(function (C) {
      var func = tracker[C]
      tracker[C] = function () {
        return mixinLog(func.apply(tracker, arguments))
      }
    })
  }
  return tracker
}

// Add tracker constructors to the top level log object
trackerConstructors.forEach(function (C) {
  log[C] = function () {
    return mixinLog(this.tracker[C].apply(this.tracker, arguments))
  }
})

log.clearProgress = function (cb) {
  if (!this.progressEnabled) {
    return cb && process.nextTick(cb)
  }

  this.gauge.hide(cb)
}

log.showProgress = function (name, completed) {
  if (!this.progressEnabled) {
    return
  }

  var values = {}
  if (name) {
    values.section = name
  }

  var last = log.record[log.record.length - 1]
  if (last) {
    values.subsection = last.prefix
    var disp = log.disp[last.level] || last.level
    var logline = this._format(disp, log.style[last.level])
    if (last.prefix) {
      logline += ' ' + this._format(last.prefix, this.prefixStyle)
    }

    logline += ' ' + last.message.split(/\r?\n/)[0]
    values.logline = logline
  }
  values.completed = completed || this.tracker.completed()
  this.gauge.show(values)
}.bind(log) // bind for use in tracker's on-change listener

// temporarily stop emitting, but don't drop
log.pause = function () {
  this._paused = true
  if (this.progressEnabled) {
    this.gauge.disable()
  }
}

log.resume = function () {
  if (!this._paused) {
    return
  }

  this._paused = false

  var b = this._buffer
  this._buffer = []
  b.forEach(function (m) {
    this.emitLog(m)
  }, this)
  if (this.progressEnabled) {
    this.gauge.enable()
  }
}

log._buffer = []

var id = 0
log.record = []
log.maxRecordSize = 10000
log.log = function (lvl, prefix, message) {
  var l = this.levels[lvl]
  if (l === undefined) {
    return this.emit('error', new Error(util.format(
      'Undefined log level: %j', lvl)))
  }

  var a = new Array(arguments.length - 2)
  var stack = null
  for (var i = 2; i < arguments.length; i++) {
    var arg = a[i - 2] = arguments[i]

    // resolve stack traces to a plain string.
    if (typeof arg === 'object' && arg instanceof Error && arg.stack) {
      Object.defineProperty(arg, 'stack', {
        value: stack = arg.stack + '',
        enumerable: true,
        writable: true,
      })
    }
  }
  if (stack) {
    a.unshift(stack + '\n')
  }
  message = util.format.apply(util, a)

  var m = {
    id: id++,
    level: lvl,
    prefix: String(prefix || ''),
    message: message,
    messageRaw: a,
  }

  this.emit('log', m)
  this.emit('log.' + lvl, m)
  if (m.prefix) {
    this.emit(m.prefix, m)
  }

  this.record.push(m)
  var mrs = this.maxRecordSize
  var n = this.record.length - mrs
  if (n > mrs / 10) {
    var newSize = Math.floor(mrs * 0.9)
    this.record = this.record.slice(-1 * newSize)
  }

  this.emitLog(m)
}.bind(log)

log.emitLog = function (m) {
  if (this._paused) {
    this._buffer.push(m)
    return
  }
  if (this.progressEnabled) {
    this.gauge.pulse(m.prefix)
  }

  var l = this.levels[m.level]
  if (l === undefined) {
    return
  }

  if (l < this.levels[this.level]) {
    return
  }

  if (l > 0 && !isFinite(l)) {
    return
  }

  // If 'disp' is null or undefined, use the lvl as a default
  // Allows: '', 0 as valid disp
  var disp = log.disp[m.level] != null ? log.disp[m.level] : m.level
  this.clearProgress()
  m.message.split(/\r?\n/).forEach(function (line) {
    if (this.heading) {
      this.write(this.heading, this.headingStyle)
      this.write(' ')
    }
    this.write(disp, log.style[m.level])
    var p = m.prefix || ''
    if (p) {
      this.write(' ')
    }

    this.write(p, this.prefixStyle)
    this.write(' ' + line + '\n')
  }, this)
  this.showProgress()
}

log._format = function (msg, style) {
  if (!stream) {
    return
  }

  var output = ''
  if (this.useColor()) {
    style = style || {}
    var settings = []
    if (style.fg) {
      settings.push(style.fg)
    }

    if (style.bg) {
      settings.push('bg' + style.bg[0].toUpperCase() + style.bg.slice(1))
    }

    if (style.bold) {
      settings.push('bold')
    }

    if (style.underline) {
      settings.push('underline')
    }

    if (style.inverse) {
      settings.push('inverse')
    }

    if (settings.length) {
      output += consoleControl.color(settings)
    }

    if (style.beep) {
      output += consoleControl.beep()
    }
  }
  output += msg
  if (this.useColor()) {
    output += consoleControl.color('reset')
  }

  return output
}

log.write = function (msg, style) {
  if (!stream) {
    return
  }

  stream.write(this._format(msg, style))
}

log.addLevel = function (lvl, n, style, disp) {
  // If 'disp' is null or undefined, use the lvl as a default
  if (disp == null) {
    disp = lvl
  }

  this.levels[lvl] = n
  this.style[lvl] = style
  if (!this[lvl]) {
    this[lvl] = function () {
      var a = new Array(arguments.length + 1)
      a[0] = lvl
      for (var i = 0; i < arguments.length; i++) {
        a[i + 1] = arguments[i]
      }

      return this.log.apply(this, a)
    }.bind(this)
  }
  this.disp[lvl] = disp
}

log.prefixStyle = { fg: 'magenta' }
log.headingStyle = { fg: 'white', bg: 'black' }

log.style = {}
log.levels = {}
log.disp = {}
log.addLevel('silly', -Infinity, { inverse: true }, 'sill')
log.addLevel('verbose', 1000, { fg: 'blue', bg: 'black' }, 'verb')
log.addLevel('info', 2000, { fg: 'green' })
log.addLevel('timing', 2500, { fg: 'green', bg: 'black' })
log.addLevel('http', 3000, { fg: 'green', bg: 'black' })
log.addLevel('notice', 3500, { fg: 'blue', bg: 'black' })
log.addLevel('warn', 4000, { fg: 'black', bg: 'yellow' }, 'WARN')
log.addLevel('error', 5000, { fg: 'red', bg: 'black' }, 'ERR!')
log.addLevel('silent', Infinity)

// allow 'error' prefix
log.on('error', function () {})
{
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
  "name": "npmlog",
  "description": "logger for npm",
  "version": "5.0.1",
  "repository": {
    "type": "git",
    "url": "https://github.com/npm/npmlog.git"
  },
  "main": "log.js",
  "files": [
    "log.js"
  ],
  "dependencies": {
    "are-we-there-yet": "^2.0.0",
    "console-control-strings": "^1.1.0",
    "gauge": "^3.0.0",
    "set-blocking": "^2.0.0"
  },
  "devDependencies": {
    "@npmcli/lint": "^1.0.1",
    "tap": "^15.0.9"
  },
  "license": "ISC"
}MIT License

Original Library
  - Copyright (c) Marak Squires

Additional Functionality
 - 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": "colors",
  "description": "get colors in your node.js console",
  "version": "1.2.5",
  "author": "Marak Squires",
  "homepage": "https://github.com/Marak/colors.js",
  "repository": {
    "type": "git",
    "url": "http://github.com/Marak/colors.js.git"
  },
  "license": "MIT",
  "engines": {
    "node": ">=0.1.90"
  },
  "main": "lib/index.js",
  "files": [
    "examples",
    "lib",
    "LICENSE",
    "safe.js",
    "themes",
    "index.d.ts",
    "safe.d.ts"
  ],
  "devDependencies": {
    "eslint": "^4.19.1",
    "eslint-config-google": "^0.9.1"
  }
}//
// Remark: Requiring this file will use the "safe" colors API,
// which will not touch String.prototype.
//
//   var colors = require('colors/safe');
//   colors.red("foo")
//
//
var colors = require('./lib/colors');
module['exports'] = colors;
module['exports'] = {
  silly: 'rainbow',
  input: 'grey',
  verbose: 'cyan',
  prompt: 'grey',
  info: 'green',
  data: 'grey',
  help: 'cyan',
  warn: 'yellow',
  debug: 'blue',
  error: 'red',
};
/*

The MIT License (MIT)

Original Library
  - Copyright (c) Marak Squires

Additional functionality
 - 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.

*/

var colors = {};
module['exports'] = colors;

colors.themes = {};

var util = require('util');
var ansiStyles = colors.styles = require('./styles');
var defineProps = Object.defineProperties;
var newLineRegex = new RegExp(/[\r\n]+/g);

colors.supportsColor = require('./system/supports-colors').supportsColor;

if (typeof colors.enabled === 'undefined') {
  colors.enabled = colors.supportsColor() !== false;
}

colors.enable = function() {
  colors.enabled = true;
};

colors.disable = function() {
  colors.enabled = false;
};

colors.stripColors = colors.strip = function(str) {
  return ('' + str).replace(/\x1B\[\d+m/g, '');
};

// eslint-disable-next-line no-unused-vars
var stylize = colors.stylize = function stylize(str, style) {
  if (!colors.enabled) {
    return str+'';
  }

  return ansiStyles[style].open + str + ansiStyles[style].close;
};

var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;
var escapeStringRegexp = function(str) {
  if (typeof str !== 'string') {
    throw new TypeError('Expected a string');
  }
  return str.replace(matchOperatorsRe, '\\$&');
};

function build(_styles) {
  var builder = function builder() {
    return applyStyle.apply(builder, arguments);
  };
  builder._styles = _styles;
  // __proto__ is used because we must return a function, but there is
  // no way to create a function with a different prototype.
  builder.__proto__ = proto;
  return builder;
}

var styles = (function() {
  var ret = {};
  ansiStyles.grey = ansiStyles.gray;
  Object.keys(ansiStyles).forEach(function(key) {
    ansiStyles[key].closeRe =
      new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g');
    ret[key] = {
      get: function() {
        return build(this._styles.concat(key));
      },
    };
  });
  return ret;
})();

var proto = defineProps(function colors() {}, styles);

function applyStyle() {
  var args = Array.prototype.slice.call(arguments);

  var str = args.map(function(arg) {
    if (arg !== undefined && arg.constructor === String) {
      return arg;
    } else {
      return util.inspect(arg);
    }
  }).join(' ');

  if (!colors.enabled || !str) {
    return str;
  }

  var newLinesPresent = str.indexOf('\n') != -1;

  var nestedStyles = this._styles;

  var i = nestedStyles.length;
  while (i--) {
    var code = ansiStyles[nestedStyles[i]];
    str = code.open + str.replace(code.closeRe, code.open) + code.close;
    if (newLinesPresent) {
      str = str.replace(newLineRegex, code.close + '\n' + code.open);
    }
  }

  return str;
}

colors.setTheme = function(theme) {
  if (typeof theme === 'string') {
    console.log('colors.setTheme now only accepts an object, not a string.  ' +
      'If you are trying to set a theme from a file, it is now your (the ' +
      'caller\'s) responsibility to require the file.  The old syntax ' +
      'looked like colors.setTheme(__dirname + ' +
      '\'/../themes/generic-logging.js\'); The new syntax looks like '+
      'colors.setTheme(require(__dirname + ' +
      '\'/../themes/generic-logging.js\'));');
    return;
  }
  for (var style in theme) {
    (function(style) {
      colors[style] = function(str) {
        if (typeof theme[style] === 'object') {
          var out = str;
          for (var i in theme[style]) {
            out = colors[theme[style][i]](out);
          }
          return out;
        }
        return colors[theme[style]](str);
      };
    })(style);
  }
};

function init() {
  var ret = {};
  Object.keys(styles).forEach(function(name) {
    ret[name] = {
      get: function() {
        return build([name]);
      },
    };
  });
  return ret;
}

var sequencer = function sequencer(map, str) {
  var exploded = str.split('');
  exploded = exploded.map(map);
  return exploded.join('');
};

// custom formatter methods
colors.trap = require('./custom/trap');
colors.zalgo = require('./custom/zalgo');

// maps
colors.maps = {};
colors.maps.america = require('./maps/america');
colors.maps.zebra = require('./maps/zebra');
colors.maps.rainbow = require('./maps/rainbow');
colors.maps.random = require('./maps/random');

for (var map in colors.maps) {
  (function(map) {
    colors[map] = function(str) {
      return sequencer(colors.maps[map], str);
    };
  })(map);
}

defineProps(colors, init());
var colors = require('./colors');

module['exports'] = function() {
  //
  // Extends prototype of native string object to allow for "foo".red syntax
  //
  var addProperty = function(color, func) {
    String.prototype.__defineGetter__(color, func);
  };

  addProperty('strip', function() {
    return colors.strip(this);
  });

  addProperty('stripColors', function() {
    return colors.strip(this);
  });

  addProperty('trap', function() {
    return colors.trap(this);
  });

  addProperty('zalgo', function() {
    return colors.zalgo(this);
  });

  addProperty('zebra', function() {
    return colors.zebra(this);
  });

  addProperty('rainbow', function() {
    return colors.rainbow(this);
  });

  addProperty('random', function() {
    return colors.random(this);
  });

  addProperty('america', function() {
    return colors.america(this);
  });

  //
  // Iterate through all default styles and colors
  //
  var x = Object.keys(colors.styles);
  x.forEach(function(style) {
    addProperty(style, function() {
      return colors.stylize(this, style);
    });
  });

  function applyTheme(theme) {
    //
    // Remark: This is a list of methods that exist
    // on String that you should not overwrite.
    //
    var stringPrototypeBlacklist = [
      '__defineGetter__', '__defineSetter__', '__lookupGetter__',
      '__lookupSetter__', 'charAt', 'constructor', 'hasOwnProperty',
      'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString',
      'valueOf', 'charCodeAt', 'indexOf', 'lastIndexOf', 'length',
      'localeCompare', 'match', 'repeat', 'replace', 'search', 'slice',
      'split', 'substring', 'toLocaleLowerCase', 'toLocaleUpperCase',
      'toLowerCase', 'toUpperCase', 'trim', 'trimLeft', 'trimRight',
    ];

    Object.keys(theme).forEach(function(prop) {
      if (stringPrototypeBlacklist.indexOf(prop) !== -1) {
        console.log('warn: '.red + ('String.prototype' + prop).magenta +
          ' is probably something you don\'t want to override.  ' +
          'Ignoring style name');
      } else {
        if (typeof(theme[prop]) === 'string') {
          colors[prop] = colors[theme[prop]];
          addProperty(prop, function() {
            return colors[theme[prop]](this);
          });
        } else {
          addProperty(prop, function() {
            var ret = this;
            for (var t = 0; t < theme[prop].length; t++) {
              ret = colors[theme[prop][t]](ret);
            }
            return ret;
          });
        }
      }
    });
  }

  colors.setTheme = function(theme) {
    if (typeof theme === 'string') {
      try {
        colors.themes[theme] = require(theme);
        applyTheme(colors.themes[theme]);
        return colors.themes[theme];
      } catch (err) {
        console.log(err);
        return err;
      }
    } else {
      applyTheme(theme);
    }
  };
};
var colors = require('./colors');
module['exports'] = colors;

// Remark: By default, colors will add style properties to String.prototype.
//
// If you don't wish to extend String.prototype, you can do this instead and
// native String will not be touched:
//
//   var colors = require('colors/safe);
//   colors.red("foo")
//
//
require('./extendStringPrototype')();
/*
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.

*/

var styles = {};
module['exports'] = styles;

var codes = {
  reset: [0, 0],

  bold: [1, 22],
  dim: [2, 22],
  italic: [3, 23],
  underline: [4, 24],
  inverse: [7, 27],
  hidden: [8, 28],
  strikethrough: [9, 29],

  black: [30, 39],
  red: [31, 39],
  green: [32, 39],
  yellow: [33, 39],
  blue: [34, 39],
  magenta: [35, 39],
  cyan: [36, 39],
  white: [37, 39],
  gray: [90, 39],
  grey: [90, 39],

  bgBlack: [40, 49],
  bgRed: [41, 49],
  bgGreen: [42, 49],
  bgYellow: [43, 49],
  bgBlue: [44, 49],
  bgMagenta: [45, 49],
  bgCyan: [46, 49],
  bgWhite: [47, 49],

  // legacy styles for colors pre v1.0.0
  blackBG: [40, 49],
  redBG: [41, 49],
  greenBG: [42, 49],
  yellowBG: [43, 49],
  blueBG: [44, 49],
  magentaBG: [45, 49],
  cyanBG: [46, 49],
  whiteBG: [47, 49],

};

Object.keys(codes).forEach(function(key) {
  var val = codes[key];
  var style = styles[key] = [];
  style.open = '\u001b[' + val[0] + 'm';
  style.close = '\u001b[' + val[1] + 'm';
});
/*
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.
*/

'use strict';

module.exports = function(flag, argv) {
  argv = argv || process.argv;

  var terminatorPos = argv.indexOf('--');
  var prefix = /^-{1,2}/.test(flag) ? '' : '--';
  var pos = argv.indexOf(prefix + flag);

  return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos);
};
/*
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.

*/

'use strict';

var os = require('os');
var hasFlag = require('./has-flag.js');

var env = process.env;

var forceColor = void 0;
if (hasFlag('no-color') || hasFlag('no-colors') || hasFlag('color=false')) {
  forceColor = false;
} else if (hasFlag('color') || hasFlag('colors') || hasFlag('color=true')
           || hasFlag('color=always')) {
  forceColor = true;
}
if ('FORCE_COLOR' in env) {
  forceColor = env.FORCE_COLOR.length === 0
    || parseInt(env.FORCE_COLOR, 10) !== 0;
}

function translateLevel(level) {
  if (level === 0) {
    return false;
  }

  return {
    level: level,
    hasBasic: true,
    has256: level >= 2,
    has16m: level >= 3,
  };
}

function supportsColor(stream) {
  if (forceColor === false) {
    return 0;
  }

  if (hasFlag('color=16m') || hasFlag('color=full')
      || hasFlag('color=truecolor')) {
    return 3;
  }

  if (hasFlag('color=256')) {
    return 2;
  }

  if (stream && !stream.isTTY && forceColor !== true) {
    return 0;
  }

  var min = forceColor ? 1 : 0;

  if (process.platform === 'win32') {
    // Node.js 7.5.0 is the first version of Node.js to include a patch to
    // libuv that enables 256 color output on Windows. Anything earlier and it
    // won't work. However, here we target Node.js 8 at minimum as it is an LTS
    // release, and Node.js 7 is not. Windows 10 build 10586 is the first
    // Windows release that supports 256 colors. Windows 10 build 14931 is the
    // first release that supports 16m/TrueColor.
    var osRelease = os.release().split('.');
    if (Number(process.versions.node.split('.')[0]) >= 8
        && Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) {
      return Number(osRelease[2]) >= 14931 ? 3 : 2;
    }

    return 1;
  }

  if ('CI' in env) {
    if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(function(sign) {
      return sign in env;
    }) || env.CI_NAME === 'codeship') {
      return 1;
    }

    return min;
  }

  if ('TEAMCITY_VERSION' in env) {
    return (/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0
    );
  }

  if ('TERM_PROGRAM' in env) {
    var version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);

    switch (env.TERM_PROGRAM) {
      case 'iTerm.app':
        return version >= 3 ? 3 : 2;
      case 'Hyper':
        return 3;
      case 'Apple_Terminal':
        return 2;
      // No default
    }
  }

  if (/-256(color)?$/i.test(env.TERM)) {
    return 2;
  }

  if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {
    return 1;
  }

  if ('COLORTERM' in env) {
    return 1;
  }

  if (env.TERM === 'dumb') {
    return min;
  }

  return min;
}

function getSupportLevel(stream) {
  var level = supportsColor(stream);
  return translateLevel(level);
}

module.exports = {
  supportsColor: getSupportLevel,
  stdout: getSupportLevel(process.stdout),
  stderr: getSupportLevel(process.stderr),
};
var colors = require('../colors');

module['exports'] = (function() {
  return function(letter, i, exploded) {
    if (letter === ' ') return letter;
    switch (i%3) {
      case 0: return colors.red(letter);
      case 1: return colors.white(letter);
      case 2: return colors.blue(letter);
    }
  };
})();
var colors = require('../colors');

module['exports'] = (function() {
  // RoY G BiV
  var rainbowColors = ['red', 'yellow', 'green', 'blue', 'magenta'];
  return function(letter, i, exploded) {
    if (letter === ' ') {
      return letter;
    } else {
      return colors[rainbowColors[i++ % rainbowColors.length]](letter);
    }
  };
})();

var colors = require('../colors');

module['exports'] = (function() {
  var available = ['underline', 'inverse', 'grey', 'yellow', 'red', 'green',
    'blue', 'white', 'cyan', 'magenta'];
  return function(letter, i, exploded) {
    return letter === ' ' ? letter :
      colors[
        available[Math.round(Math.random() * (available.length - 2))]
      ](letter);
  };
})();
var colors = require('../colors');

module['exports'] = function(letter, i, exploded) {
  return i % 2 === 0 ? letter : colors.inverse(letter);
};
module['exports'] = function runTheTrap(text, options) {
  var result = '';
  text = text || 'Run the trap, drop the bass';
  text = text.split('');
  var trap = {
    a: ['\u0040', '\u0104', '\u023a', '\u0245', '\u0394', '\u039b', '\u0414'],
    b: ['\u00df', '\u0181', '\u0243', '\u026e', '\u03b2', '\u0e3f'],
    c: ['\u00a9', '\u023b', '\u03fe'],
    d: ['\u00d0', '\u018a', '\u0500', '\u0501', '\u0502', '\u0503'],
    e: ['\u00cb', '\u0115', '\u018e', '\u0258', '\u03a3', '\u03be', '\u04bc',
         '\u0a6c'],
    f: ['\u04fa'],
    g: ['\u0262'],
    h: ['\u0126', '\u0195', '\u04a2', '\u04ba', '\u04c7', '\u050a'],
    i: ['\u0f0f'],
    j: ['\u0134'],
    k: ['\u0138', '\u04a0', '\u04c3', '\u051e'],
    l: ['\u0139'],
    m: ['\u028d', '\u04cd', '\u04ce', '\u0520', '\u0521', '\u0d69'],
    n: ['\u00d1', '\u014b', '\u019d', '\u0376', '\u03a0', '\u048a'],
    o: ['\u00d8', '\u00f5', '\u00f8', '\u01fe', '\u0298', '\u047a', '\u05dd',
         '\u06dd', '\u0e4f'],
    p: ['\u01f7', '\u048e'],
    q: ['\u09cd'],
    r: ['\u00ae', '\u01a6', '\u0210', '\u024c', '\u0280', '\u042f'],
    s: ['\u00a7', '\u03de', '\u03df', '\u03e8'],
    t: ['\u0141', '\u0166', '\u0373'],
    u: ['\u01b1', '\u054d'],
    v: ['\u05d8'],
    w: ['\u0428', '\u0460', '\u047c', '\u0d70'],
    x: ['\u04b2', '\u04fe', '\u04fc', '\u04fd'],
    y: ['\u00a5', '\u04b0', '\u04cb'],
    z: ['\u01b5', '\u0240'],
  };
  text.forEach(function(c) {
    c = c.toLowerCase();
    var chars = trap[c] || [' '];
    var rand = Math.floor(Math.random() * chars.length);
    if (typeof trap[c] !== 'undefined') {
      result += trap[c][rand];
    } else {
      result += c;
    }
  });
  return result;
};
// please no
module['exports'] = function zalgo(text, options) {
  text = text || '   he is here   ';
  var soul = {
    'up': [
      '̍', '̎', '̄', '̅',
      '̿', '̑', '̆', '̐',
      '͒', '͗', '͑', '̇',
      '̈', '̊', '͂', '̓',
      '̈', '͊', '͋', '͌',
      '̃', '̂', '̌', '͐',
      '̀', '́', '̋', '̏',
      '̒', '̓', '̔', '̽',
      '̉', 'ͣ', 'ͤ', 'ͥ',
      'ͦ', 'ͧ', 'ͨ', 'ͩ',
      'ͪ', 'ͫ', 'ͬ', 'ͭ',
      'ͮ', 'ͯ', '̾', '͛',
      '͆', '̚',
    ],
    'down': [
      '̖', '̗', '̘', '̙',
      '̜', '̝', '̞', '̟',
      '̠', '̤', '̥', '̦',
      '̩', '̪', '̫', '̬',
      '̭', '̮', '̯', '̰',
      '̱', '̲', '̳', '̹',
      '̺', '̻', '̼', 'ͅ',
      '͇', '͈', '͉', '͍',
      '͎', '͓', '͔', '͕',
      '͖', '͙', '͚', '̣',
    ],
    'mid': [
      '̕', '̛', '̀', '́',
      '͘', '̡', '̢', '̧',
      '̨', '̴', '̵', '̶',
      '͜', '͝', '͞',
      '͟', '͠', '͢', '̸',
      '̷', '͡', ' ҉',
    ],
  };
  var all = [].concat(soul.up, soul.down, soul.mid);

  function randomNumber(range) {
    var r = Math.floor(Math.random() * range);
    return r;
  }

  function isChar(character) {
    var bool = false;
    all.filter(function(i) {
      bool = (i === character);
    });
    return bool;
  }


  function heComes(text, options) {
    var result = '';
    var counts;
    var l;
    options = options || {};
    options['up'] =
      typeof options['up'] !== 'undefined' ? options['up'] : true;
    options['mid'] =
      typeof options['mid'] !== 'undefined' ? options['mid'] : true;
    options['down'] =
      typeof options['down'] !== 'undefined' ? options['down'] : true;
    options['size'] =
      typeof options['size'] !== 'undefined' ? options['size'] : 'maxi';
    text = text.split('');
    for (l in text) {
      if (isChar(l)) {
        continue;
      }
      result = result + text[l];
      counts = {'up': 0, 'down': 0, 'mid': 0};
      switch (options.size) {
      case 'mini':
        counts.up = randomNumber(8);
        counts.mid = randomNumber(2);
        counts.down = randomNumber(8);
        break;
      case 'maxi':
        counts.up = randomNumber(16) + 3;
        counts.mid = randomNumber(4) + 1;
        counts.down = randomNumber(64) + 3;
        break;
      default:
        counts.up = randomNumber(8) + 1;
        counts.mid = randomNumber(6) / 2;
        counts.down = randomNumber(8) + 1;
        break;
      }

      var arr = ['up', 'mid', 'down'];
      for (var d in arr) {
        var index = arr[d];
        for (var i = 0; i <= counts[index]; i++) {
          if (options[index]) {
            result = result + soul[index][randomNumber(soul[index].length)];
          }
        }
      }
    }
    return result;
  }
  // don't summon him
  return heComes(text, options);
};

/**
 * Helpers.
 */

var s = 1000;
var m = s * 60;
var h = m * 60;
var d = h * 24;
var y = d * 365.25;

/**
 * Parse or format the given `val`.
 *
 * Options:
 *
 *  - `long` verbose formatting [false]
 *
 * @param {String|Number} val
 * @param {Object} [options]
 * @throws {Error} throw an error if val is not a non-empty string or a number
 * @return {String|Number}
 * @api public
 */

module.exports = function(val, options) {
  options = options || {};
  var type = typeof val;
  if (type === 'string' && val.length > 0) {
    return parse(val);
  } else if (type === 'number' && isNaN(val) === false) {
    return options.long ? fmtLong(val) : fmtShort(val);
  }
  throw new Error(
    'val is not a non-empty string or a valid number. val=' +
      JSON.stringify(val)
  );
};

/**
 * Parse the given `str` and return milliseconds.
 *
 * @param {String} str
 * @return {Number}
 * @api private
 */

function parse(str) {
  str = String(str);
  if (str.length > 100) {
    return;
  }
  var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(
    str
  );
  if (!match) {
    return;
  }
  var n = parseFloat(match[1]);
  var type = (match[2] || 'ms').toLowerCase();
  switch (type) {
    case 'years':
    case 'year':
    case 'yrs':
    case 'yr':
    case 'y':
      return n * y;
    case 'days':
    case 'day':
    case 'd':
      return n * d;
    case 'hours':
    case 'hour':
    case 'hrs':
    case 'hr':
    case 'h':
      return n * h;
    case 'minutes':
    case 'minute':
    case 'mins':
    case 'min':
    case 'm':
      return n * m;
    case 'seconds':
    case 'second':
    case 'secs':
    case 'sec':
    case 's':
      return n * s;
    case 'milliseconds':
    case 'millisecond':
    case 'msecs':
    case 'msec':
    case 'ms':
      return n;
    default:
      return undefined;
  }
}

/**
 * Short format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtShort(ms) {
  if (ms >= d) {
    return Math.round(ms / d) + 'd';
  }
  if (ms >= h) {
    return Math.round(ms / h) + 'h';
  }
  if (ms >= m) {
    return Math.round(ms / m) + 'm';
  }
  if (ms >= s) {
    return Math.round(ms / s) + 's';
  }
  return ms + 'ms';
}

/**
 * Long format for `ms`.
 *
 * @param {Number} ms
 * @return {String}
 * @api private
 */

function fmtLong(ms) {
  return plural(ms, d, 'day') ||
    plural(ms, h, 'hour') ||
    plural(ms, m, 'minute') ||
    plural(ms, s, 'second') ||
    ms + ' ms';
}

/**
 * Pluralization helper.
 */

function plural(ms, n, name) {
  if (ms < n) {
    return;
  }
  if (ms < n * 1.5) {
    return Math.floor(ms / n) + ' ' + name;
  }
  return Math.ceil(ms / n) + ' ' + name + 's';
}
The MIT License (MIT)

Copyright (c) 2016 Zeit, Inc.

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": "ms",
  "version": "2.0.0",
  "description": "Tiny milisecond conversion utility",
  "repository": "zeit/ms",
  "main": "./index",
  "files": [
    "index.js"
  ],
  "lint-staged": {
    "*.js": [
      "npm run lint",
      "prettier --single-quote --write",
      "git add"
    ]
  },
  "license": "MIT",
  "devDependencies": {
    "eslint": "3.19.0",
    "expect.js": "0.3.1",
    "husky": "0.13.3",
    "lint-staged": "3.4.1",
    "mocha": "3.4.1"
  }
}